Published site at c8f57bf678fa4eb617074f8296e25cb8a147a5d5.
diff --git a/acid-semantics.html b/acid-semantics.html
index 4566e84..c8c6407 100644
--- a/acid-semantics.html
+++ b/acid-semantics.html
@@ -450,7 +450,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-09</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-10</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/apache_hbase_reference_guide.pdf b/apache_hbase_reference_guide.pdf
index 5e8bb37..215dbea 100644
--- a/apache_hbase_reference_guide.pdf
+++ b/apache_hbase_reference_guide.pdf
Binary files differ
diff --git a/book.html b/book.html
index 3fec29d..59bb4b9 100644
--- a/book.html
+++ b/book.html
@@ -42882,7 +42882,7 @@
 <div id="footer">
 <div id="footer-text">
 Version 3.0.0-SNAPSHOT<br>
-Last updated 2019-08-09 14:29:42 UTC
+Last updated 2019-08-10 14:29:42 UTC
 </div>
 </div>
 </body>
diff --git a/bulk-loads.html b/bulk-loads.html
index 794df84..b1a1963 100644
--- a/bulk-loads.html
+++ b/bulk-loads.html
@@ -155,7 +155,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-09</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-10</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/checkstyle-aggregate.html b/checkstyle-aggregate.html
index bbdec17..d5d4f7d 100644
--- a/checkstyle-aggregate.html
+++ b/checkstyle-aggregate.html
@@ -152,7 +152,7 @@
 <td>3937</td>
 <td>0</td>
 <td>0</td>
-<td>11761</td></tr></table></div>
+<td>11760</td></tr></table></div>
 <div class="section">
 <h2><a name="Files"></a>Files</h2>
 <table border="0" class="table table-striped">
@@ -5490,7 +5490,7 @@
 <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>30</td></tr>
+<td>29</td></tr>
 <tr class="b">
 <td><a href="#org.apache.hadoop.hbase.regionserver.TestHRegionFileSystem.java">org/apache/hadoop/hbase/regionserver/TestHRegionFileSystem.java</a></td>
 <td>0</td>
@@ -8253,7 +8253,7 @@
 <td><a class="externalLink" href="http://checkstyle.sourceforge.net/config_imports.html#UnusedImports">UnusedImports</a>
 <ul>
 <li>processJavadoc: <tt>&quot;true&quot;</tt></li></ul></td>
-<td>8</td>
+<td>7</td>
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td></tr>
 <tr class="b">
 <td>indentation</td>
@@ -24972,31 +24972,31 @@
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
-<td>457</td></tr>
+<td>462</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 123).</td>
-<td>484</td></tr>
+<td>489</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 124).</td>
-<td>500</td></tr>
+<td>505</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 126).</td>
-<td>508</td></tr>
+<td>513</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 127).</td>
-<td>524</td></tr></table></div>
+<td>529</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.coprocessor.SingletonCoprocessorService.java">org/apache/hadoop/hbase/coprocessor/SingletonCoprocessorService.java</h3>
 <table border="0" class="table table-striped">
@@ -25314,157 +25314,157 @@
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 109).</td>
-<td>132</td></tr>
+<td>143</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 12, expected level should be one of the following: 10, 23.</td>
-<td>139</td></tr>
+<td>150</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 12, expected level should be one of the following: 10, 23.</td>
-<td>140</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 12, expected level should be one of the following: 10, 23.</td>
 <td>151</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 12, expected level should be one of the following: 10, 23.</td>
-<td>152</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 12, expected level should be one of the following: 10, 23.</td>
-<td>168</td></tr>
+<td>162</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 12, expected level should be one of the following: 10, 23.</td>
+<td>163</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 12, expected level should be one of the following: 10, 23.</td>
 <td>179</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 12, expected level should be one of the following: 10, 23.</td>
+<td>190</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 109).</td>
-<td>192</td></tr>
+<td>203</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 109).</td>
-<td>224</td></tr>
+<td>235</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 109).</td>
-<td>247</td></tr>
+<td>258</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 109).</td>
-<td>268</td></tr>
+<td>279</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 12, expected level should be one of the following: 10, 51.</td>
-<td>278</td></tr>
+<td>289</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 12, expected level should be one of the following: 10, 51.</td>
-<td>283</td></tr>
+<td>294</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 109).</td>
-<td>293</td></tr>
+<td>304</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>EmptyBlock</td>
 <td>Must have at least one statement.</td>
-<td>343</td></tr>
+<td>354</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>EmptyBlock</td>
 <td>Must have at least one statement.</td>
-<td>369</td></tr>
+<td>380</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>EmptyBlock</td>
 <td>Must have at least one statement.</td>
-<td>406</td></tr>
+<td>417</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>480</td></tr>
+<td>491</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
-<td>554</td></tr>
+<td>565</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 109).</td>
-<td>555</td></tr>
+<td>566</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 109).</td>
-<td>584</td></tr>
+<td>595</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 12, expected level should be one of the following: 10, 23.</td>
-<td>608</td></tr>
+<td>619</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 12, expected level should be one of the following: 10, 23.</td>
-<td>613</td></tr>
+<td>624</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 12, expected level should be one of the following: 10, 23.</td>
-<td>623</td></tr>
+<td>634</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
-<td>667</td></tr>
+<td>769</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
-<td>668</td></tr></table></div>
+<td>770</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.coprocessor.TestRegionObserverScannerOpenHook.java">org/apache/hadoop/hbase/coprocessor/TestRegionObserverScannerOpenHook.java</h3>
 <table border="0" class="table table-striped">
@@ -59760,205 +59760,205 @@
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>7987</td></tr>
+<td>7992</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>7990</td></tr>
+<td>7995</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>8011</td></tr>
+<td>8016</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>8059</td></tr>
+<td>8064</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 110).</td>
-<td>8098</td></tr>
+<td>8103</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 120).</td>
-<td>8099</td></tr>
+<td>8104</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
-<td>8104</td></tr>
+<td>8109</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 106).</td>
-<td>8139</td></tr>
+<td>8144</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>8262</td></tr>
+<td>8267</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def modifier' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
-<td>8330</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if' has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>8332</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if' child has incorrect indentation level 10, expected level should be one of the following: 12, 14.</td>
-<td>8333</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if rcurly' has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>8334</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def rcurly' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>8335</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
+<td>'if' has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
+<td>8337</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if' child has incorrect indentation level 10, expected level should be one of the following: 12, 14.</td>
+<td>8338</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if rcurly' has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
+<td>8339</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def rcurly' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
+<td>8340</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
 <td>'object def rcurly' has incorrect indentation level 4, expected level should be one of the following: 6, 8.</td>
-<td>8336</td></tr>
+<td>8341</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>8502</td></tr>
+<td>8507</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'else' construct must use '{}'s.</td>
-<td>8503</td></tr>
+<td>8508</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>8505</td></tr>
+<td>8510</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'else' construct must use '{}'s.</td>
-<td>8506</td></tr>
+<td>8511</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>8516</td></tr>
+<td>8521</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'else' construct must use '{}'s.</td>
-<td>8517</td></tr>
+<td>8522</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>8587</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if' has incorrect indentation level 8, expected level should be 10.</td>
-<td>8589</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if' child has incorrect indentation level 10, expected level should be 12.</td>
-<td>8590</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if rcurly' has incorrect indentation level 8, expected level should be 10.</td>
-<td>8591</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>8592</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
-<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>8593</td></tr>
+<td>'if' has incorrect indentation level 8, expected level should be 10.</td>
+<td>8594</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>'if' child has incorrect indentation level 10, expected level should be 12.</td>
 <td>8595</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
-<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>'if rcurly' has incorrect indentation level 8, expected level should be 10.</td>
 <td>8596</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>8597</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>8598</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>8599</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>8602</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>8605</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>8606</td></tr></table></div>
+<td>8600</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>8601</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>8603</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>8604</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>8607</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>8610</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>8611</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.HRegionFileSystem.java">org/apache/hadoop/hbase/regionserver/HRegionFileSystem.java</h3>
 <table border="0" class="table table-striped">
@@ -65871,239 +65871,233 @@
 <th>Line</th></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>UnusedImports</td>
-<td>Unused import - org.apache.hadoop.hbase.wal.WALSplitter.</td>
-<td>168</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>271</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>307</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>483</td></tr>
-<tr class="a">
+<td>484</td></tr>
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 6, expected level should be 8.</td>
-<td>1161</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>1421</td></tr>
+<td>1162</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
-<td>'else' construct must use '{}'s.</td>
-<td>1423</td></tr>
+<td>'if' construct must use '{}'s.</td>
+<td>1422</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>1440</td></tr>
+<td>'else' construct must use '{}'s.</td>
+<td>1424</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
-<td>'else' construct must use '{}'s.</td>
-<td>1442</td></tr>
+<td>'if' construct must use '{}'s.</td>
+<td>1441</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>2745</td></tr>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'else' construct must use '{}'s.</td>
+<td>1443</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>3408</td></tr>
+<td>2755</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>3418</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'while' construct must use '{}'s.</td>
-<td>3478</td></tr>
-<tr class="a">
+<td>3488</td></tr>
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>EmptyStatement</td>
 <td>Empty statement.</td>
-<td>3479</td></tr>
-<tr class="b">
+<td>3489</td></tr>
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'try' child has incorrect indentation level 10, expected level should be 8.</td>
-<td>3646</td></tr>
-<tr class="a">
+<td>3656</td></tr>
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>FinalClass</td>
 <td>Class PutThread should be declared as final.</td>
-<td>3657</td></tr>
-<tr class="b">
+<td>3667</td></tr>
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>3833</td></tr>
-<tr class="a">
+<td>3843</td></tr>
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>EmptyBlock</td>
 <td>Must have at least one statement.</td>
-<td>3895</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>misc</td>
-<td>ArrayTypeStyle</td>
-<td>Array brackets at illegal position.</td>
-<td>4048</td></tr>
+<td>3905</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
-<td>4059</td></tr>
+<td>4058</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
-<td>4060</td></tr>
+<td>4069</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>misc</td>
+<td>ArrayTypeStyle</td>
+<td>Array brackets at illegal position.</td>
+<td>4070</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>4078</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>4111</td></tr>
+<td>4088</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>4227</td></tr>
+<td>4121</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>4313</td></tr>
+<td>4237</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>4372</td></tr>
+<td>4323</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>4382</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'for' construct must use '{}'s.</td>
-<td>4767</td></tr>
-<tr class="a">
+<td>4777</td></tr>
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>MethodLength</td>
 <td>Method length is 160 lines (max allowed is 150).</td>
-<td>5207</td></tr>
-<tr class="b">
+<td>5217</td></tr>
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>5710</td></tr>
-<tr class="a">
+<td>5720</td></tr>
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'object def rcurly' has incorrect indentation level 4, expected level should be one of the following: 6, 8.</td>
-<td>5725</td></tr>
-<tr class="b">
+<td>5735</td></tr>
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
-<td>5753</td></tr></table></div>
+<td>5763</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestHRegionFileSystem.java">org/apache/hadoop/hbase/regionserver/TestHRegionFileSystem.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>283</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>289</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>295</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>328</td></tr>
+<td>295</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
+<td>328</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
 <td>340</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestHRegionInfo.java">org/apache/hadoop/hbase/regionserver/TestHRegionInfo.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 108).</td>
 <td>159</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -66112,19 +66106,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestHRegionOnCluster.java">org/apache/hadoop/hbase/regionserver/TestHRegionOnCluster.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>151</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -66133,103 +66127,103 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestHRegionReplayEvents.java">org/apache/hadoop/hbase/regionserver/TestHRegionReplayEvents.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'for' construct must use '{}'s.</td>
 <td>311</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'=' has incorrect indentation level 6, expected level should be 8.</td>
 <td>370</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'=' has incorrect indentation level 6, expected level should be 8.</td>
 <td>372</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'=' has incorrect indentation level 6, expected level should be 8.</td>
 <td>472</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'=' has incorrect indentation level 6, expected level should be 8.</td>
 <td>578</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'=' has incorrect indentation level 6, expected level should be 8.</td>
 <td>668</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'=' has incorrect indentation level 6, expected level should be 8.</td>
 <td>780</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>EmptyBlock</td>
 <td>Must have at least one statement.</td>
 <td>782</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>EmptyBlock</td>
 <td>Must have at least one statement.</td>
 <td>879</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>EmptyBlock</td>
 <td>Must have at least one statement.</td>
 <td>883</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>EmptyBlock</td>
 <td>Must have at least one statement.</td>
 <td>1039</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1156</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>EmptyBlock</td>
 <td>Must have at least one statement.</td>
 <td>1457</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 113).</td>
 <td>1581</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>1639</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -66238,292 +66232,292 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestHRegionServerBulkLoad.java">org/apache/hadoop/hbase/regionserver/TestHRegionServerBulkLoad.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>187</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>252</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
 <td>259</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>misc</td>
-<td>ArrayTypeStyle</td>
-<td>Array brackets at illegal position.</td>
-<td>278</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
-<td>279</td></tr>
+<td>278</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
 <td>Array brackets at illegal position.</td>
+<td>279</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>misc</td>
+<td>ArrayTypeStyle</td>
+<td>Array brackets at illegal position.</td>
 <td>385</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestHStore.java">org/apache/hadoop/hbase/regionserver/TestHStore.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>164</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>243</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>472</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>510</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'ColumnFamilyDescriptorBuilder' has incorrect indentation level 4, expected level should be 6.</td>
 <td>541</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>565</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>604</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 4, expected level should be 6.</td>
 <td>752</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 4, expected level should be 6.</td>
 <td>764</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>793</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>794</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>795</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>796</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>813</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
 <td>956</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1470</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>1471</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 23 should have line break after.</td>
 <td>1835</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 30 should have line break after.</td>
 <td>1838</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 39 should have line break after.</td>
 <td>1841</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 35 should have line break after.</td>
 <td>1844</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 31 should have line break after.</td>
 <td>1847</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 35 should have line break after.</td>
 <td>1850</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 37 should have line break after.</td>
 <td>1859</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 49 should have line break after.</td>
 <td>1862</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 54 should have line break after.</td>
 <td>1865</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 65 should have line break after.</td>
 <td>1868</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 47 should have line break after.</td>
 <td>1871</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 47 should have line break after.</td>
 <td>1874</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 25 should have line break after.</td>
 <td>1877</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 29 should have line break after.</td>
 <td>1880</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 40 should have line break after.</td>
 <td>1883</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 43 should have line break after.</td>
 <td>1886</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 32 should have line break after.</td>
 <td>1889</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 34 should have line break after.</td>
 <td>1892</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 38 should have line break after.</td>
 <td>1895</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 43 should have line break after.</td>
 <td>1898</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 52 should have line break after.</td>
 <td>1901</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
 <td>1904</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
@@ -66532,139 +66526,139 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestHStoreFile.java">org/apache/hadoop/hbase/regionserver/TestHStoreFile.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.junit.After' import.</td>
 <td>74</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>116</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>151</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>168</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>MethodLength</td>
 <td>Method length is 151 lines (max allowed is 150).</td>
 <td>381</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>574</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>576</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>654</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>657</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>776</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>778</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>843</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>844</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>845</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>846</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
 <td>'{' at column 7 should be on the previous line.</td>
 <td>857</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>866</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'while' construct must use '{}'s.</td>
 <td>960</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>EmptyStatement</td>
 <td>Empty statement.</td>
 <td>960</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'while' construct must use '{}'s.</td>
 <td>981</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>EmptyStatement</td>
 <td>Empty statement.</td>
 <td>981</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -66673,13 +66667,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestJoinedScanners.java">org/apache/hadoop/hbase/regionserver/TestJoinedScanners.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -66688,38 +66682,38 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestKeepDeletes.java">org/apache/hadoop/hbase/regionserver/TestKeepDeletes.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'while' construct must use '{}'s.</td>
 <td>282</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>EmptyStatement</td>
 <td>Empty statement.</td>
 <td>283</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>823</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>902</td></tr>
+<td>823</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>902</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
@@ -66727,31 +66721,31 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestKeyValueHeap.java">org/apache/hadoop/hbase/regionserver/TestKeyValueHeap.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'while' construct must use '{}'s.</td>
 <td>150</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>EmptyStatement</td>
 <td>Empty statement.</td>
 <td>150</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'while' construct must use '{}'s.</td>
 <td>182</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>EmptyStatement</td>
@@ -66760,13 +66754,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestKeyValueScanFixture.java">org/apache/hadoop/hbase/regionserver/TestKeyValueScanFixture.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>misc</td>
 <td>ArrayTypeStyle</td>
@@ -66775,43 +66769,43 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestMajorCompaction.java">org/apache/hadoop/hbase/regionserver/TestMajorCompaction.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>157</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>'(' is followed by whitespace.</td>
 <td>221</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>')' is preceded with whitespace.</td>
 <td>221</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>442</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>497</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -66820,13 +66814,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestMasterAddressTracker.java">org/apache/hadoop/hbase/regionserver/TestMasterAddressTracker.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -66835,19 +66829,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestMemStoreLAB.java">org/apache/hadoop/hbase/regionserver/TestMemStoreLAB.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>AvoidStarImport</td>
 <td>Using the '.*' form of import should be avoided - org.junit.Assert.*.</td>
 <td>20</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -66856,13 +66850,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestMemstoreLABWithoutPool.java">org/apache/hadoop/hbase/regionserver/TestMemstoreLABWithoutPool.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -66871,25 +66865,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestMetricsRegion.java">org/apache/hadoop/hbase/regionserver/TestMetricsRegion.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 105).</td>
 <td>100</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
 <td>103</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -66898,19 +66892,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestMetricsRegionServer.java">org/apache/hadoop/hbase/regionserver/TestMetricsRegionServer.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>')' is preceded with whitespace.</td>
 <td>124</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -66919,13 +66913,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestMinorCompaction.java">org/apache/hadoop/hbase/regionserver/TestMinorCompaction.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -66934,76 +66928,76 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestMobStoreScanner.java">org/apache/hadoop/hbase/regionserver/TestMobStoreScanner.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 10, expected level should be 4.</td>
 <td>144</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>FileTabCharacter</td>
 <td>File contains tab characters (this is the first instance).</td>
 <td>144</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def' child has incorrect indentation level 10, expected level should be 4.</td>
-<td>145</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 10, expected level should be 4.</td>
-<td>153</td></tr>
+<td>145</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 10, expected level should be 4.</td>
+<td>153</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def' child has incorrect indentation level 10, expected level should be 4.</td>
 <td>154</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestMultiColumnScanner.java">org/apache/hadoop/hbase/regionserver/TestMultiColumnScanner.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be one of the following: 4, 56.</td>
 <td>99</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'for' construct must use '{}'s.</td>
 <td>123</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>161</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'for' construct must use '{}'s.</td>
 <td>183</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -67012,67 +67006,67 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestMultiLogThreshold.java">org/apache/hadoop/hbase/regionserver/TestMultiLogThreshold.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>98</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>99</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>100</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>101</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>102</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>103</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 106).</td>
 <td>126</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 105).</td>
 <td>132</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 106).</td>
 <td>138</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -67081,13 +67075,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestMultiVersionConcurrencyControl.java">org/apache/hadoop/hbase/regionserver/TestMultiVersionConcurrencyControl.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -67096,19 +67090,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestNotCleanupCompactedFileWhenRegionWarmup.java">org/apache/hadoop/hbase/regionserver/TestNotCleanupCompactedFileWhenRegionWarmup.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'java.util.ArrayList' import.</td>
 <td>46</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -67117,19 +67111,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestParallelPut.java">org/apache/hadoop/hbase/regionserver/TestParallelPut.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>100</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -67138,58 +67132,58 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestPerColumnFamilyFlush.java">org/apache/hadoop/hbase/regionserver/TestPerColumnFamilyFlush.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 106).</td>
-<td>485</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 106).</td>
-<td>486</td></tr>
+<td>485</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 106).</td>
+<td>486</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 106).</td>
 <td>487</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestPriorityRpc.java">org/apache/hadoop/hbase/regionserver/TestPriorityRpc.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 106).</td>
 <td>144</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>MethodParamPad</td>
 <td>'(' is preceded with whitespace.</td>
 <td>149</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 107).</td>
 <td>161</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -67198,49 +67192,49 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestRSKilledWhenInitializing.java">org/apache/hadoop/hbase/regionserver/TestRSKilledWhenInitializing.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>85</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>89</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 105).</td>
 <td>133</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>137</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>180</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 4, expected level should be 6.</td>
 <td>203</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -67249,55 +67243,55 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestRecoveredEdits.java">org/apache/hadoop/hbase/regionserver/TestRecoveredEdits.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>92</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>179</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>180</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>181</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>182</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>184</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>204</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -67306,43 +67300,43 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestRegionIncrement.java">org/apache/hadoop/hbase/regionserver/TestRegionIncrement.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>EmptyBlock</td>
 <td>Must have at least one statement.</td>
 <td>100</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>176</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'while' construct must use '{}'s.</td>
 <td>196</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'for' construct must use '{}'s.</td>
 <td>199</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'while' construct must use '{}'s.</td>
 <td>229</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -67351,13 +67345,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestRegionInfoBuilder.java">org/apache/hadoop/hbase/regionserver/TestRegionInfoBuilder.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -67366,13 +67360,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestRegionMergeTransactionOnCluster.java">org/apache/hadoop/hbase/regionserver/TestRegionMergeTransactionOnCluster.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -67381,19 +67375,19 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestRegionOpen.java">org/apache/hadoop/hbase/regionserver/TestRegionOpen.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 105).</td>
 <td>118</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -67402,25 +67396,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestRegionReplicaFailover.java">org/apache/hadoop/hbase/regionserver/TestRegionReplicaFailover.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>AvoidStarImport</td>
 <td>Using the '.*' form of import should be avoided - org.junit.Assert.*.</td>
 <td>20</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization' child has incorrect indentation level 6, expected level should be one of the following: 4, 52, 53.</td>
 <td>73</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -67429,64 +67423,64 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestRegionReplicas.java">org/apache/hadoop/hbase/regionserver/TestRegionReplicas.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>151</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>')' is preceded with whitespace.</td>
 <td>151</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 112).</td>
 <td>321</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>353</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 116).</td>
-<td>393</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 116).</td>
-<td>399</td></tr>
+<td>393</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
+<td>Line is longer than 100 characters (found 116).</td>
+<td>399</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
 <td>Line is longer than 100 characters (found 123).</td>
 <td>408</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestRegionServerAbort.java">org/apache/hadoop/hbase/regionserver/TestRegionServerAbort.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
@@ -67495,26 +67489,26 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestRegionServerHostname.java">org/apache/hadoop/hbase/regionserver/TestRegionServerHostname.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 111).</td>
-<td>148</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 111).</td>
-<td>157</td></tr>
+<td>148</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 111).</td>
+<td>157</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method call' child has incorrect indentation level 4, expected level should be 6.</td>
@@ -67522,25 +67516,25 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestRegionServerMetrics.java">org/apache/hadoop/hbase/regionserver/TestRegionServerMetrics.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>'(' is followed by whitespace.</td>
 <td>168</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'array initialization lcurly' has incorrect indentation level 8, expected level should be one of the following: 4, 6.</td>
 <td>550</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -67549,31 +67543,31 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestRegionServerNoMaster.java">org/apache/hadoop/hbase/regionserver/TestRegionServerNoMaster.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
 <td>133</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 103).</td>
 <td>291</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 109).</td>
 <td>296</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
@@ -67582,6 +67576,69 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.regionserver.TestRegionServerOnlineConfigChange.java">org/apache/hadoop/hbase/regionserver/TestRegionServerOnlineConfigChange.java</h3>
 <table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>94</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>120</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 101).</td>
+<td>209</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.TestRegionServerReadRequestMetrics.java">org/apache/hadoop/hbase/regionserver/TestRegionServerReadRequestMetrics.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'requestsMap' has incorrect indentation level 6, expected level should be 8.</td>
+<td>157</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.TestRegionServerReportForDuty.java">org/apache/hadoop/hbase/regionserver/TestRegionServerReportForDuty.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 108).</td>
+<td>180</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 108).</td>
+<td>181</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.TestRegionSplitPolicy.java">org/apache/hadoop/hbase/regionserver/TestRegionSplitPolicy.java</h3>
+<table border="0" class="table table-striped">
 <tr class="a">
 <th>Severity</th>
 <th>Category</th>
@@ -67593,21 +67650,414 @@
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>94</td></tr>
+<td>283</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 104).</td>
+<td>365</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.TestResettingCounters.java">org/apache/hadoop/hbase/regionserver/TestResettingCounters.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'for' construct must use '{}'s.</td>
+<td>71</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'for' construct must use '{}'s.</td>
+<td>74</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'for' construct must use '{}'s.</td>
+<td>77</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>96</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'else' construct must use '{}'s.</td>
+<td>97</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'for' construct must use '{}'s.</td>
+<td>102</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'for' construct must use '{}'s.</td>
+<td>106</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.TestReversibleScanners.java">org/apache/hadoop/hbase/regionserver/TestReversibleScanners.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 65.</td>
+<td>173</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>202</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>207</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>217</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>234</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 65.</td>
+<td>263</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 107).</td>
+<td>273</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'for' construct must use '{}'s.</td>
+<td>351</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'for' construct must use '{}'s.</td>
+<td>357</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>447</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
+<td>581</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
+<td>607</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
+<td>608</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>626</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>643</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.TestRowTooBig.java">org/apache/hadoop/hbase/regionserver/TestRowTooBig.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>120</td></tr>
+<td>79</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 101).</td>
-<td>209</td></tr></table></div>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>126</td></tr></table></div>
 <div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.TestRegionServerReadRequestMetrics.java">org/apache/hadoop/hbase/regionserver/TestRegionServerReadRequestMetrics.java</h3>
+<h3 id="org.apache.hadoop.hbase.regionserver.TestScanWithBloomError.java">org/apache/hadoop/hbase/regionserver/TestScanWithBloomError.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'for' construct must use '{}'s.</td>
+<td>157</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'for' construct must use '{}'s.</td>
+<td>187</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.TestScanner.java">org/apache/hadoop/hbase/regionserver/TestScanner.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>128</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>230</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>255</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>378</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>383</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>384</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>466</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'try' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>473</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>490</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'try' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>497</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>514</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>576</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.TestScannerHeartbeatMessages.java">org/apache/hadoop/hbase/regionserver/TestScannerHeartbeatMessages.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>596</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>598</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>615</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>617</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.TestScannerRetriableFailure.java">org/apache/hadoop/hbase/regionserver/TestScannerRetriableFailure.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>169</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.TestScannerWithBulkload.java">org/apache/hadoop/hbase/regionserver/TestScannerWithBulkload.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'else' child has incorrect indentation level 4, expected level should be 6.</td>
+<td>182</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
+<td>221</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.TestSeekOptimizations.java">org/apache/hadoop/hbase/regionserver/TestSeekOptimizations.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>352</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>EmptyBlock</td>
+<td>Must have at least one statement.</td>
+<td>470</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.TestServerNonceManager.java">org/apache/hadoop/hbase/regionserver/TestServerNonceManager.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>232</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>256</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.TestSettingTimeoutOnBlockingPoint.java">org/apache/hadoop/hbase/regionserver/TestSettingTimeoutOnBlockingPoint.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>ParenPad</td>
+<td>'(' is followed by whitespace.</td>
+<td>102</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.TestSplitLogWorker.java">org/apache/hadoop/hbase/regionserver/TestSplitLogWorker.java</h3>
 <table border="0" class="table table-striped">
 <tr class="a">
 <th>Severity</th>
@@ -67619,31 +68069,40 @@
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
-<td>'requestsMap' has incorrect indentation level 6, expected level should be 8.</td>
-<td>157</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.TestRegionServerReportForDuty.java">org/apache/hadoop/hbase/regionserver/TestRegionServerReportForDuty.java</h3>
-<table border="0" class="table table-striped">
+<td>'method def modifier' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
+<td>181</td></tr>
 <tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def rcurly' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
+<td>184</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 108).</td>
-<td>180</td></tr>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'object def rcurly' has incorrect indentation level 4, expected level should be one of the following: 6, 8.</td>
+<td>185</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 108).</td>
-<td>181</td></tr></table></div>
+<td>whitespace</td>
+<td>ParenPad</td>
+<td>'(' is followed by whitespace.</td>
+<td>187</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'finally' child has incorrect indentation level 5, expected level should be 6.</td>
+<td>265</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>270</td></tr></table></div>
 <div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.TestRegionSplitPolicy.java">org/apache/hadoop/hbase/regionserver/TestRegionSplitPolicy.java</h3>
+<h3 id="org.apache.hadoop.hbase.regionserver.TestSplitTransactionOnCluster.java">org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.java</h3>
 <table border="0" class="table table-striped">
 <tr class="b">
 <th>Severity</th>
@@ -67653,18 +68112,219 @@
 <th>Line</th></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'for' construct must use '{}'s.</td>
+<td>570</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'for' construct must use '{}'s.</td>
+<td>597</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>283</td></tr>
+<td>813</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>814</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>816</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>817</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>818</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>819</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>823</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'ZooKeeperConnectionException' has incorrect indentation level 2, expected level should be 4.</td>
+<td>824</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>854</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>872</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>873</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>875</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>881</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>882</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>924</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>EmptyBlock</td>
+<td>Must have at least one statement.</td>
+<td>968</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.TestStoreFileInfo.java">org/apache/hadoop/hbase/regionserver/TestStoreFileInfo.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>AvoidStarImport</td>
+<td>Using the '.*' form of import should be avoided - org.junit.Assert.*.</td>
+<td>20</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.TestStoreFileRefresherChore.java">org/apache/hadoop/hbase/regionserver/TestStoreFileRefresherChore.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
-<td>Line is longer than 100 characters (found 104).</td>
-<td>365</td></tr></table></div>
+<td>Line is longer than 100 characters (found 127).</td>
+<td>204</td></tr></table></div>
 <div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.TestResettingCounters.java">org/apache/hadoop/hbase/regionserver/TestResettingCounters.java</h3>
+<h3 id="org.apache.hadoop.hbase.regionserver.TestStoreScanner.java">org/apache/hadoop/hbase/regionserver/TestStoreScanner.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 101).</td>
+<td>166</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 14, expected level should be 12.</td>
+<td>238</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 14, expected level should be 12.</td>
+<td>267</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>381</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>409</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>438</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 12, expected level should be 10.</td>
+<td>472</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization rcurly' has incorrect indentation level 4, expected level should be one of the following: 8, 10.</td>
+<td>473</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 12, expected level should be 10.</td>
+<td>523</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>872</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>969</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.TestStripeStoreFileManager.java">org/apache/hadoop/hbase/regionserver/TestStripeStoreFileManager.java</h3>
 <table border="0" class="table table-striped">
 <tr class="a">
 <th>Severity</th>
@@ -67677,19 +68337,58 @@
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'for' construct must use '{}'s.</td>
-<td>71</td></tr>
+<td>124</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>coding</td>
+<td>EmptyStatement</td>
+<td>Empty statement.</td>
+<td>124</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>LeftCurly</td>
+<td>'{' at column 3 should be on the previous line.</td>
+<td>523</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'try' child has incorrect indentation level 7, expected level should be 6.</td>
+<td>547</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'try' child has incorrect indentation level 7, expected level should be 6.</td>
+<td>548</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.TestSyncTimeRangeTracker.java">org/apache/hadoop/hbase/regionserver/TestSyncTimeRangeTracker.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>54</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'for' construct must use '{}'s.</td>
-<td>74</td></tr>
+<td>69</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'for' construct must use '{}'s.</td>
-<td>77</td></tr>
+<td>72</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
@@ -67700,22 +68399,22 @@
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
-<td>'else' construct must use '{}'s.</td>
+<td>'if' construct must use '{}'s.</td>
 <td>97</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
-<td>'for' construct must use '{}'s.</td>
+<td>'if' construct must use '{}'s.</td>
 <td>102</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
-<td>'for' construct must use '{}'s.</td>
-<td>106</td></tr></table></div>
+<td>'if' construct must use '{}'s.</td>
+<td>103</td></tr></table></div>
 <div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.TestReversibleScanners.java">org/apache/hadoop/hbase/regionserver/TestReversibleScanners.java</h3>
+<h3 id="org.apache.hadoop.hbase.regionserver.TestTags.java">org/apache/hadoop/hbase/regionserver/TestTags.java</h3>
 <table border="0" class="table table-striped">
 <tr class="a">
 <th>Severity</th>
@@ -67725,96 +68424,66 @@
 <th>Line</th></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 65.</td>
-<td>173</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>202</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>207</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>217</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>234</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 65.</td>
-<td>263</td></tr>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>548</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.TestTimestampFilterSeekHint.java">org/apache/hadoop/hbase/regionserver/TestTimestampFilterSeekHint.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>ParenPad</td>
+<td>')' is preceded with whitespace.</td>
+<td>77</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>ParenPad</td>
+<td>')' is preceded with whitespace.</td>
+<td>91</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.TestWALLockup.java">org/apache/hadoop/hbase/regionserver/TestWALLockup.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'while' construct must use '{}'s.</td>
+<td>158</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>MethodParamPad</td>
+<td>'(' is preceded with whitespace.</td>
+<td>264</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
-<td>Line is longer than 100 characters (found 107).</td>
-<td>273</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'for' construct must use '{}'s.</td>
-<td>351</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'for' construct must use '{}'s.</td>
-<td>357</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>447</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
-<td>581</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
-<td>607</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
-<td>608</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>626</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>643</td></tr></table></div>
+<td>Line is longer than 100 characters (found 104).</td>
+<td>428</td></tr></table></div>
 <div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.TestRowTooBig.java">org/apache/hadoop/hbase/regionserver/TestRowTooBig.java</h3>
+<h3 id="org.apache.hadoop.hbase.regionserver.TestWALMonotonicallyIncreasingSeqId.java">org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.java</h3>
 <table border="0" class="table table-striped">
 <tr class="a">
 <th>Severity</th>
@@ -67824,39 +68493,12 @@
 <th>Line</th></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>79</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>126</td></tr></table></div>
+<td>coding</td>
+<td>InnerAssignment</td>
+<td>Inner assignments should be avoided.</td>
+<td>232</td></tr></table></div>
 <div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.TestScanWithBloomError.java">org/apache/hadoop/hbase/regionserver/TestScanWithBloomError.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'for' construct must use '{}'s.</td>
-<td>157</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'for' construct must use '{}'s.</td>
-<td>187</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.TestScanner.java">org/apache/hadoop/hbase/regionserver/TestScanner.java</h3>
+<h3 id="org.apache.hadoop.hbase.regionserver.TestWalAndCompactingMemStoreFlush.java">org/apache/hadoop/hbase/regionserver/TestWalAndCompactingMemStoreFlush.java</h3>
 <table border="0" class="table table-striped">
 <tr class="a">
 <th>Severity</th>
@@ -67866,78 +68508,54 @@
 <th>Line</th></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>128</td></tr>
+<td>sizes</td>
+<td>MethodLength</td>
+<td>Method length is 230 lines (max allowed is 150).</td>
+<td>137</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>230</td></tr>
+<td>sizes</td>
+<td>MethodLength</td>
+<td>Method length is 254 lines (max allowed is 150).</td>
+<td>371</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>255</td></tr>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 102).</td>
+<td>887</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>378</td></tr>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 101).</td>
+<td>889</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>383</td></tr>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 101).</td>
+<td>891</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>384</td></tr>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 104).</td>
+<td>894</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>466</td></tr>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 102).</td>
+<td>998</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'try' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>473</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>490</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'try' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>497</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>514</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>576</td></tr></table></div>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 102).</td>
+<td>1005</td></tr></table></div>
 <div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.TestScannerHeartbeatMessages.java">org/apache/hadoop/hbase/regionserver/TestScannerHeartbeatMessages.java</h3>
+<h3 id="org.apache.hadoop.hbase.regionserver.TimeRangeTracker.java">org/apache/hadoop/hbase/regionserver/TimeRangeTracker.java</h3>
 <table border="0" class="table table-striped">
 <tr class="b">
 <th>Severity</th>
@@ -67947,265 +68565,4471 @@
 <th>Line</th></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>596</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>598</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>615</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>617</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.TestScannerRetriableFailure.java">org/apache/hadoop/hbase/regionserver/TestScannerRetriableFailure.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>169</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.TestScannerWithBulkload.java">org/apache/hadoop/hbase/regionserver/TestScannerWithBulkload.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'else' child has incorrect indentation level 4, expected level should be 6.</td>
-<td>182</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
-<td>221</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.TestSeekOptimizations.java">org/apache/hadoop/hbase/regionserver/TestSeekOptimizations.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>352</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>EmptyBlock</td>
-<td>Must have at least one statement.</td>
-<td>470</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.TestServerNonceManager.java">org/apache/hadoop/hbase/regionserver/TestServerNonceManager.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>232</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>256</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.TestSettingTimeoutOnBlockingPoint.java">org/apache/hadoop/hbase/regionserver/TestSettingTimeoutOnBlockingPoint.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>ParenPad</td>
-<td>'(' is followed by whitespace.</td>
-<td>102</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.TestSplitLogWorker.java">org/apache/hadoop/hbase/regionserver/TestSplitLogWorker.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def modifier' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
-<td>181</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def rcurly' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
-<td>184</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'object def rcurly' has incorrect indentation level 4, expected level should be one of the following: 6, 8.</td>
-<td>185</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>ParenPad</td>
-<td>'(' is followed by whitespace.</td>
-<td>187</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'finally' child has incorrect indentation level 5, expected level should be 6.</td>
-<td>265</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>270</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.TestSplitTransactionOnCluster.java">org/apache/hadoop/hbase/regionserver/TestSplitTransactionOnCluster.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'for' construct must use '{}'s.</td>
-<td>570</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'for' construct must use '{}'s.</td>
-<td>597</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>813</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>814</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>816</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>817</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>818</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>819</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>823</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'ZooKeeperConnectionException' has incorrect indentation level 2, expected level should be 4.</td>
-<td>824</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>854</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>872</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>873</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>875</td></tr>
+<td>189</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>190</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.compactions.CompactionConfiguration.java">org/apache/hadoop/hbase/regionserver/compactions/CompactionConfiguration.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.regionserver.StoreConfigInformation' import.</td>
+<td>28</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.compactions.CompactionProgress.java">org/apache/hadoop/hbase/regionserver/compactions/CompactionProgress.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>design</td>
+<td>VisibilityModifier</td>
+<td>Variable 'currentCompactedKVs' must be private and have accessor methods.</td>
+<td>42</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>design</td>
+<td>VisibilityModifier</td>
+<td>Variable 'totalCompactedSize' must be private and have accessor methods.</td>
+<td>44</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>coding</td>
+<td>InnerAssignment</td>
+<td>Inner assignments should be avoided.</td>
+<td>64</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest.java">org/apache/hadoop/hbase/regionserver/compactions/CompactionRequest.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'java.util.Collection' import.</td>
+<td>25</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.compactions.CompactionRequester.java">org/apache/hadoop/hbase/regionserver/compactions/CompactionRequester.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'edu.umd.cs.findbugs.annotations.Nullable' import.</td>
+<td>27</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.compactions.Compactor.java">org/apache/hadoop/hbase/regionserver/compactions/Compactor.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 107).</td>
+<td>99</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>design</td>
+<td>VisibilityModifier</td>
+<td>Variable 'maxKeyCount' must be private and have accessor methods.</td>
+<td>120</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>design</td>
+<td>VisibilityModifier</td>
+<td>Variable 'earliestPutTs' must be private and have accessor methods.</td>
+<td>122</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>design</td>
+<td>VisibilityModifier</td>
+<td>Variable 'latestPutTs' must be private and have accessor methods.</td>
+<td>124</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>design</td>
+<td>VisibilityModifier</td>
+<td>Variable 'maxSeqId' must be private and have accessor methods.</td>
+<td>126</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>design</td>
+<td>VisibilityModifier</td>
+<td>Variable 'maxMVCCReadpoint' must be private and have accessor methods.</td>
+<td>128</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>design</td>
+<td>VisibilityModifier</td>
+<td>Variable 'maxTagsLength' must be private and have accessor methods.</td>
+<td>130</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>design</td>
+<td>VisibilityModifier</td>
+<td>Variable 'minSeqIdToKeep' must be private and have accessor methods.</td>
+<td>132</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>coding</td>
+<td>InnerAssignment</td>
+<td>Inner assignments should be avoided.</td>
+<td>193</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 107).</td>
+<td>200</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 104).</td>
+<td>234</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.compactions.CurrentHourProvider.java">org/apache/hadoop/hbase/regionserver/compactions/CurrentHourProvider.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>design</td>
+<td>FinalClass</td>
+<td>Class CurrentHourProvider should be declared as final.</td>
+<td>25</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>LeftCurly</td>
+<td>'{' at column 33 should have line break after.</td>
+<td>27</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>coding</td>
+<td>InnerAssignment</td>
+<td>Inner assignments should be avoided.</td>
+<td>61</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.compactions.DefaultCompactor.java">org/apache/hadoop/hbase/regionserver/compactions/DefaultCompactor.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def modifier' has incorrect indentation level 8, expected level should be one of the following: 4, 6.</td>
+<td>52</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def' child has incorrect indentation level 10, expected level should be one of the following: 6, 8.</td>
+<td>56</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def rcurly' has incorrect indentation level 8, expected level should be one of the following: 4, 6.</td>
+<td>57</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'object def rcurly' has incorrect indentation level 6, expected level should be one of the following: 2, 4.</td>
+<td>58</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>76</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.compactions.OffPeakHours.java">org/apache/hadoop/hbase/regionserver/compactions/OffPeakHours.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
+<td>23</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>LeftCurly</td>
+<td>'{' at column 46 should have line break after.</td>
+<td>30</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>LeftCurly</td>
+<td>'{' at column 60 should have line break after.</td>
+<td>31</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.compactions.PerfTestCompactionPolicies.java">org/apache/hadoop/hbase/regionserver/compactions/PerfTestCompactionPolicies.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>62</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>63</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>64</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>68</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>69</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>70</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>71</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>72</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>73</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization rcurly' has incorrect indentation level 5, expected level should be one of the following: 4, 6.</td>
+<td>74</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.compactions.RatioBasedCompactionPolicy.java">org/apache/hadoop/hbase/regionserver/compactions/RatioBasedCompactionPolicy.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if' child has incorrect indentation level 9, expected level should be 8.</td>
+<td>78</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.compactions.SortedCompactionPolicy.java">org/apache/hadoop/hbase/regionserver/compactions/SortedCompactionPolicy.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>117</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.compactions.SpikyFileListGenerator.java">org/apache/hadoop/hbase/regionserver/compactions/SpikyFileListGenerator.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>ParenPad</td>
+<td>'(' is followed by whitespace.</td>
+<td>48</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.compactions.StripeCompactionPolicy.java">org/apache/hadoop/hbase/regionserver/compactions/StripeCompactionPolicy.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>134</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>881</td></tr>
+<td>144</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>152</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>185</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>203</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>300</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>319</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>325</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>368</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>coding</td>
+<td>InnerAssignment</td>
+<td>Inner assignments should be avoided.</td>
+<td>416</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.compactions.StripeCompactor.java">org/apache/hadoop/hbase/regionserver/compactions/StripeCompactor.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 104).</td>
+<td>105</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.compactions.TestCompactor.java">org/apache/hadoop/hbase/regionserver/compactions/TestCompactor.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>design</td>
+<td>HideUtilityClassConstructor</td>
+<td>Utility classes should not have a public or default constructor.</td>
+<td>58</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>207</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.compactions.TestStripeCompactionPolicy.java">org/apache/hadoop/hbase/regionserver/compactions/TestStripeCompactionPolicy.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 47.</td>
+<td>142</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>172</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>179</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'while' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>460</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>560</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>562</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 101).</td>
+<td>601</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>819</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.handler.CloseRegionHandler.java">org/apache/hadoop/hbase/regionserver/handler/CloseRegionHandler.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>65</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>66</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>67</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>69</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.handler.OpenPriorityRegionHandler.java">org/apache/hadoop/hbase/regionserver/handler/OpenPriorityRegionHandler.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 103).</td>
+<td>36</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.handler.OpenRegionHandler.java">org/apache/hadoop/hbase/regionserver/handler/OpenRegionHandler.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 102).</td>
+<td>66</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>196</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.handler.ParallelSeekHandler.java">org/apache/hadoop/hbase/regionserver/handler/ParallelSeekHandler.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.Cell' import.</td>
+<td>27</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.handler.RegionReplicaFlushHandler.java">org/apache/hadoop/hbase/regionserver/handler/RegionReplicaFlushHandler.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method call' child has incorrect indentation level 7, expected level should be 8.</td>
+<td>106</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.handler.WALSplitterHandler.java">org/apache/hadoop/hbase/regionserver/handler/WALSplitterHandler.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.Server' import.</td>
+<td>27</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>72</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>73</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method call' child has incorrect indentation level 10, expected level should be 12.</td>
+<td>74</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>75</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>76</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>77</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>78</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>79</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>80</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if' has incorrect indentation level 8, expected level should be 10.</td>
+<td>81</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if' child has incorrect indentation level 10, expected level should be 12.</td>
+<td>82</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method call' child has incorrect indentation level 12, expected level should be 14.</td>
+<td>83</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if' child has incorrect indentation level 10, expected level should be 12.</td>
+<td>84</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if rcurly' has incorrect indentation level 8, expected level should be 10.</td>
+<td>85</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>89</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if' has incorrect indentation level 8, expected level should be 10.</td>
+<td>90</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if' child has incorrect indentation level 10, expected level should be 12.</td>
+<td>91</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if rcurly' has incorrect indentation level 8, expected level should be 10.</td>
+<td>93</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>94</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method call' child has incorrect indentation level 10, expected level should be 12.</td>
+<td>95</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>96</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.querymatcher.ColumnTracker.java">org/apache/hadoop/hbase/regionserver/querymatcher/ColumnTracker.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.regionserver.ShipperListener' import.</td>
+<td>25</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>117</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>125</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>134</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.querymatcher.CompactionScanQueryMatcher.java">org/apache/hadoop/hbase/regionserver/querymatcher/CompactionScanQueryMatcher.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.filter.Filter' import.</td>
+<td>27</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.querymatcher.DeleteTracker.java">org/apache/hadoop/hbase/regionserver/querymatcher/DeleteTracker.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.Cell' import.</td>
+<td>21</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.querymatcher.DropDeletesCompactionScanQueryMatcher.java">org/apache/hadoop/hbase/regionserver/querymatcher/DropDeletesCompactionScanQueryMatcher.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.regionserver.ScanInfo' import.</td>
+<td>23</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.querymatcher.ExplicitColumnTracker.java">org/apache/hadoop/hbase/regionserver/querymatcher/ExplicitColumnTracker.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.regionserver.querymatcher.ScanQueryMatcher.MatchCode' import.</td>
+<td>28</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.querymatcher.IncludeAllCompactionQueryMatcher.java">org/apache/hadoop/hbase/regionserver/querymatcher/IncludeAllCompactionQueryMatcher.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.regionserver.ScanInfo' import.</td>
+<td>24</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.querymatcher.MajorCompactionScanQueryMatcher.java">org/apache/hadoop/hbase/regionserver/querymatcher/MajorCompactionScanQueryMatcher.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.regionserver.ScanInfo' import.</td>
+<td>25</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.querymatcher.MinorCompactionScanQueryMatcher.java">org/apache/hadoop/hbase/regionserver/querymatcher/MinorCompactionScanQueryMatcher.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.regionserver.ScanInfo' import.</td>
+<td>25</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.querymatcher.NewVersionBehaviorTracker.java">org/apache/hadoop/hbase/regionserver/querymatcher/NewVersionBehaviorTracker.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.KeyValue.Type' import.</td>
+<td>34</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.regionserver.querymatcher.ScanQueryMatcher.MatchCode' import.</td>
+<td>36</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>design</td>
+<td>VisibilityModifier</td>
+<td>Variable 'ts' must be private and have accessor methods.</td>
+<td>110</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>design</td>
+<td>VisibilityModifier</td>
+<td>Variable 'mvcc' must be private and have accessor methods.</td>
+<td>111</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>165</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
+<td>200</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>201</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>203</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
+<td>204</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>205</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>206</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
+<td>209</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>210</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>212</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
+<td>213</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>214</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>215</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
+<td>216</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>217</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>280</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.querymatcher.NormalUserScanQueryMatcher.java">org/apache/hadoop/hbase/regionserver/querymatcher/NormalUserScanQueryMatcher.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.KeepDeletedCells' import.</td>
+<td>24</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.client.Scan' import.</td>
+<td>26</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.querymatcher.RawScanQueryMatcher.java">org/apache/hadoop/hbase/regionserver/querymatcher/RawScanQueryMatcher.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.client.Scan' import.</td>
+<td>24</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.querymatcher.ScanDeleteTracker.java">org/apache/hadoop/hbase/regionserver/querymatcher/ScanDeleteTracker.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.Cell' import.</td>
+<td>26</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.querymatcher.ScanQueryMatcher.java">org/apache/hadoop/hbase/regionserver/querymatcher/ScanQueryMatcher.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>142</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>143</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>275</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 108).</td>
+<td>303</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 107).</td>
+<td>321</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 106).</td>
+<td>333</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.querymatcher.ScanWildcardColumnTracker.java">org/apache/hadoop/hbase/regionserver/querymatcher/ScanWildcardColumnTracker.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.KeyValueUtil' import.</td>
+<td>28</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.regionserver.querymatcher.ScanQueryMatcher.MatchCode' import.</td>
+<td>30</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.querymatcher.StripeCompactionScanQueryMatcher.java">org/apache/hadoop/hbase/regionserver/querymatcher/StripeCompactionScanQueryMatcher.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.regionserver.ScanInfo' import.</td>
+<td>25</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.querymatcher.TestExplicitColumnTracker.java">org/apache/hadoop/hbase/regionserver/querymatcher/TestExplicitColumnTracker.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 10, expected level should be one of the following: 8, 41.</td>
+<td>184</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.querymatcher.TestNewVersionBehaviorTracker.java">org/apache/hadoop/hbase/regionserver/querymatcher/TestNewVersionBehaviorTracker.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.junit.Assert.assertEquals' import.</td>
+<td>21</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.querymatcher.TestScanDeleteTracker.java">org/apache/hadoop/hbase/regionserver/querymatcher/TestScanDeleteTracker.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>AvoidStarImport</td>
+<td>Using the '.*' form of import should be avoided - org.junit.Assert.*.</td>
+<td>20</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.querymatcher.TestUserScanQueryMatcher.java">org/apache/hadoop/hbase/regionserver/querymatcher/TestUserScanQueryMatcher.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>58</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>167</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 45.</td>
+<td>174</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 45.</td>
+<td>175</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 45.</td>
+<td>176</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 45.</td>
+<td>177</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 38.</td>
+<td>186</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 38.</td>
+<td>187</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 38.</td>
+<td>188</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 38.</td>
+<td>189</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 38.</td>
+<td>190</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>211</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 38.</td>
+<td>230</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 38.</td>
+<td>231</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 38.</td>
+<td>232</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 38.</td>
+<td>233</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 38.</td>
+<td>234</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.querymatcher.UserScanQueryMatcher.java">org/apache/hadoop/hbase/regionserver/querymatcher/UserScanQueryMatcher.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.KeyValueUtil' import.</td>
+<td>26</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.client.Scan' import.</td>
+<td>28</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.snapshot.FlushSnapshotSubprocedure.java">org/apache/hadoop/hbase/regionserver/snapshot/FlushSnapshotSubprocedure.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.client.IsolationLevel' import.</td>
+<td>28</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.snapshot.ClientSnapshotDescriptionUtils' import.</td>
+<td>38</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.snapshot.RegionServerSnapshotManager.java">org/apache/hadoop/hbase/regionserver/snapshot/RegionServerSnapshotManager.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.client.RegionReplicaUtil' import.</td>
+<td>42</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.snapshot.SnapshotCreationException' import.</td>
+<td>57</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 101).</td>
+<td>81</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 102).</td>
+<td>95</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'ctor def modifier' has incorrect indentation level 3, expected level should be 2.</td>
+<td>110</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>131</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>152</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
+<td>187</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>188</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>190</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
+<td>192</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
+<td>205</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>206</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>220</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>223</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>313</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>358</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>EmptyBlock</td>
+<td>Must have at least one statement.</td>
+<td>373</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>381</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.throttle.CompactionThroughputControllerFactory.java">org/apache/hadoop/hbase/regionserver/throttle/CompactionThroughputControllerFactory.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.regionserver.RegionServerServices' import.</td>
+<td>25</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.throttle.FlushThroughputControllerFactory.java">org/apache/hadoop/hbase/regionserver/throttle/FlushThroughputControllerFactory.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.regionserver.RegionServerServices' import.</td>
+<td>25</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.throttle.NoLimitThroughputController.java">org/apache/hadoop/hbase/regionserver/throttle/NoLimitThroughputController.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.regionserver.RegionServerServices' import.</td>
+<td>22</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.throttle.PressureAwareCompactionThroughputController.java">org/apache/hadoop/hbase/regionserver/throttle/PressureAwareCompactionThroughputController.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.regionserver.RegionServerServices' import.</td>
+<td>26</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.throttle.PressureAwareFlushThroughputController.java">org/apache/hadoop/hbase/regionserver/throttle/PressureAwareFlushThroughputController.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.regionserver.RegionServerServices' import.</td>
+<td>26</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.throttle.PressureAwareThroughputController.java">org/apache/hadoop/hbase/regionserver/throttle/PressureAwareThroughputController.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.regionserver.RegionServerServices' import.</td>
+<td>29</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 102).</td>
+<td>80</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.throttle.ThroughputController.java">org/apache/hadoop/hbase/regionserver/throttle/ThroughputController.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.regionserver.RegionServerServices' import.</td>
+<td>23</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.wal.AbstractFSWAL.java">org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>design</td>
+<td>VisibilityModifier</td>
+<td>Variable 'encodedName2HighestSequenceId' must be private and have accessor methods.</td>
+<td>277</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>933</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>934</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>935</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>936</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.wal.AbstractProtobufLogWriter.java">org/apache/hadoop/hbase/regionserver/wal/AbstractProtobufLogWriter.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.codec.Codec' import.</td>
+<td>39</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.util.CommonFSUtils.StreamLacksCapabilityException' import.</td>
+<td>49</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>coding</td>
+<td>InnerAssignment</td>
+<td>Inner assignments should be avoided.</td>
+<td>230</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.wal.AbstractTestFSWAL.java">org/apache/hadoop/hbase/regionserver/wal/AbstractTestFSWAL.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>178</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>179</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>189</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>247</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>356</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.wal.AbstractTestLogRolling.java">org/apache/hadoop/hbase/regionserver/wal/AbstractTestLogRolling.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 106).</td>
+<td>196</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>293</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>294</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.wal.AbstractTestProtobufLog.java">org/apache/hadoop/hbase/regionserver/wal/AbstractTestProtobufLog.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>89</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>106</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.wal.AbstractTestWALReplay.java">org/apache/hadoop/hbase/regionserver/wal/AbstractTestWALReplay.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>187</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>266</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>331</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>332</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>333</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>334</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>335</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>339</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>397</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>398</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>399</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>400</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>401</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>467</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>468</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>469</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>470</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>471</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>475</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>575</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>576</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>577</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>578</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>579</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>583</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>666</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>752</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>754</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>764</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def modifier' has incorrect indentation level 3, expected level should be 2.</td>
+<td>1194</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def rcurly' has incorrect indentation level 3, expected level should be 2.</td>
+<td>1196</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.wal.CompressionContext.java">org/apache/hadoop/hbase/regionserver/wal/CompressionContext.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.io.TagCompressionContext' import.</td>
+<td>28</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.wal.Compressor.java">org/apache/hadoop/hbase/regionserver/wal/Compressor.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
+<td>25</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.wal.WAL' import.</td>
+<td>36</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>design</td>
+<td>HideUtilityClassConstructor</td>
+<td>Utility classes should not have a public or default constructor.</td>
+<td>44</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'while' construct must use '{}'s.</td>
+<td>88</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>annotation</td>
+<td>MissingDeprecated</td>
+<td>Must include both @java.lang.Deprecated annotation and @deprecated Javadoc tag with description.</td>
+<td>105</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>115</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>annotation</td>
+<td>MissingDeprecated</td>
+<td>Must include both @java.lang.Deprecated annotation and @deprecated Javadoc tag with description.</td>
+<td>142</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>annotation</td>
+<td>MissingDeprecated</td>
+<td>Must include both @java.lang.Deprecated annotation and @deprecated Javadoc tag with description.</td>
+<td>181</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.wal.FSHLog.java">org/apache/hadoop/hbase/regionserver/wal/FSHLog.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 115).</td>
+<td>246</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>coding</td>
+<td>InnerAssignment</td>
+<td>Inner assignments should be avoided.</td>
+<td>513</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 105).</td>
+<td>730</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 110).</td>
+<td>809</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 107).</td>
+<td>811</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 112).</td>
+<td>996</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 102).</td>
+<td>997</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.wal.FailedLogCloseException.java">org/apache/hadoop/hbase/regionserver/wal/FailedLogCloseException.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>38</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.wal.FailedSyncBeforeLogCloseException.java">org/apache/hadoop/hbase/regionserver/wal/FailedSyncBeforeLogCloseException.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>36</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.wal.InstrumentedLogWriter.java">org/apache/hadoop/hbase/regionserver/wal/InstrumentedLogWriter.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
+<td>40</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if' has incorrect indentation level 6, expected level should be 4.</td>
+<td>41</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>43</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>44</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if rcurly' has incorrect indentation level 6, expected level should be 4.</td>
+<td>46</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def rcurly' has incorrect indentation level 4, expected level should be 2.</td>
+<td>47</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.wal.MetricsWAL.java">org/apache/hadoop/hbase/regionserver/wal/MetricsWAL.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'java.io.IOException' import.</td>
+<td>24</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.wal.WALEdit' import.</td>
+<td>29</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.CompatibilitySingletonFactory' import.</td>
+<td>31</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.wal.ProtobufLogReader.java">org/apache/hadoop/hbase/regionserver/wal/ProtobufLogReader.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.fs.FileSystem' import.</td>
+<td>31</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.fs.FSDataInputStream' import.</td>
+<td>32</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.HBaseInterfaceAudience' import.</td>
+<td>34</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.util.Bytes' import.</td>
+<td>40</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
+<td>187</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def' child has incorrect indentation level 5, expected level should be 4.</td>
+<td>192</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>193</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if' has incorrect indentation level 5, expected level should be 4.</td>
+<td>193</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if' has incorrect indentation level 5, expected level should be 4.</td>
+<td>194</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if' child has incorrect indentation level 7, expected level should be 6.</td>
+<td>196</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if rcurly' has incorrect indentation level 5, expected level should be 4.</td>
+<td>197</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def' child has incorrect indentation level 5, expected level should be 4.</td>
+<td>198</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if' has incorrect indentation level 5, expected level should be 4.</td>
+<td>199</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if' child has incorrect indentation level 7, expected level should be 6.</td>
+<td>200</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if rcurly' has incorrect indentation level 5, expected level should be 4.</td>
+<td>201</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def' child has incorrect indentation level 5, expected level should be 4.</td>
+<td>202</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 194).</td>
+<td>238</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>261</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>266</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>449</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.wal.ReaderBase.java">org/apache/hadoop/hbase/regionserver/wal/ReaderBase.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'else' construct must use '{}'s.</td>
+<td>106</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.wal.SecureProtobufLogReader.java">org/apache/hadoop/hbase/regionserver/wal/SecureProtobufLogReader.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.fs.FSDataInputStream' import.</td>
+<td>30</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.security.EncryptionUtil' import.</td>
+<td>37</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.wal.SecureProtobufLogWriter.java">org/apache/hadoop/hbase/regionserver/wal/SecureProtobufLogWriter.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.io.crypto.Encryptor' import.</td>
+<td>26</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.wal.SecureWALCellCodec.java">org/apache/hadoop/hbase/regionserver/wal/SecureWALCellCodec.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
+<td>29</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.KeyValue' import.</td>
+<td>32</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.wal.SequenceIdAccounting.java">org/apache/hadoop/hbase/regionserver/wal/SequenceIdAccounting.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>113</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>115</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>128</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>129</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>158</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>170</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>171</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>172</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>244</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>266</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>267</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>268</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>269</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.wal.TestLogRolling.java">org/apache/hadoop/hbase/regionserver/wal/TestLogRolling.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>MethodLength</td>
+<td>Method length is 164 lines (max allowed is 150).</td>
+<td>106</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>411</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>518</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>560</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.wal.TestLogRollingNoCluster.java">org/apache/hadoop/hbase/regionserver/wal/TestLogRollingNoCluster.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>80</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>81</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>175</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'else' construct must use '{}'s.</td>
+<td>177</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.wal.TestWALConfiguration.java">org/apache/hadoop/hbase/regionserver/wal/TestWALConfiguration.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'java.io.IOException' import.</td>
+<td>41</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.junit.Assert.assertEquals' import.</td>
+<td>44</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.wal.WALActionsListener.java">org/apache/hadoop/hbase/regionserver/wal/WALActionsListener.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>93</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>118</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.wal.WALCellCodec.java">org/apache/hadoop/hbase/regionserver/wal/WALCellCodec.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.KeyValue' import.</td>
+<td>29</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.codec.BaseDecoder' import.</td>
+<td>32</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization lcurly' has incorrect indentation level 8, expected level should be one of the following: 4, 6.</td>
+<td>107</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization lcurly' has incorrect indentation level 8, expected level should be one of the following: 4, 6.</td>
+<td>125</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>210</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.wal.WALCoprocessorHost.java">org/apache/hadoop/hbase/regionserver/wal/WALCoprocessorHost.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>design</td>
+<td>FinalClass</td>
+<td>Class WALEnvironment should be declared as final.</td>
+<td>55</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.regionserver.wal.WALUtil.java">org/apache/hadoop/hbase/regionserver/wal/WALUtil.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>design</td>
+<td>FinalClass</td>
+<td>Class WALUtil should be declared as final.</td>
+<td>53</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>73</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>105</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>142</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>160</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.replication.BaseReplicationEndpoint.java">org/apache/hadoop/hbase/replication/BaseReplicationEndpoint.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 101).</td>
+<td>54</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 106).</td>
+<td>62</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 111).</td>
+<td>81</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.replication.BulkLoadCellFilter.java">org/apache/hadoop/hbase/replication/BulkLoadCellFilter.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 114).</td>
+<td>43</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.replication.ClusterMarkingEntryFilter.java">org/apache/hadoop/hbase/replication/ClusterMarkingEntryFilter.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.wal.WALEdit' import.</td>
+<td>26</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.wal.WAL.Entry' import.</td>
+<td>28</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 113).</td>
+<td>47</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.replication.HBaseReplicationEndpoint.java">org/apache/hadoop/hbase/replication/HBaseReplicationEndpoint.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.Abortable' import.</td>
+<td>29</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>64</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>133</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.replication.ReplicationEndpoint.java">org/apache/hadoop/hbase/replication/ReplicationEndpoint.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
+<td>29</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.replication.regionserver.MetricsSource' import.</td>
+<td>35</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>197</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.replication.ReplicationException.java">org/apache/hadoop/hbase/replication/ReplicationException.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.exceptions.HBaseException' import.</td>
+<td>21</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.replication.SystemTableWALEntryFilter.java">org/apache/hadoop/hbase/replication/SystemTableWALEntryFilter.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.wal.WAL.Entry' import.</td>
+<td>22</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.replication.TestMasterReplication.java">org/apache/hadoop/hbase/replication/TestMasterReplication.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 14, expected level should be one of the following: 12, 27.</td>
+<td>231</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 10, expected level should be one of the following: 8, 37.</td>
+<td>242</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 10, expected level should be one of the following: 8, 44.</td>
+<td>245</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 14, expected level should be one of the following: 12, 27.</td>
+<td>345</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 10, expected level should be one of the following: 8, 37.</td>
+<td>365</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 10, expected level should be one of the following: 8, 44.</td>
+<td>369</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 14, expected level should be one of the following: 12, 27.</td>
+<td>401</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 10, expected level should be one of the following: 8, 37.</td>
+<td>411</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def modifier' has incorrect indentation level 10, expected level should be one of the following: 6, 8.</td>
+<td>695</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def' child has incorrect indentation level 12, expected level should be one of the following: 8, 10.</td>
+<td>697</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def rcurly' has incorrect indentation level 10, expected level should be one of the following: 6, 8.</td>
+<td>698</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'object def rcurly' has incorrect indentation level 8, expected level should be one of the following: 4, 6.</td>
+<td>699</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.replication.TestMultiSlaveReplication.java">org/apache/hadoop/hbase/replication/TestMultiSlaveReplication.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def modifier' has incorrect indentation level 10, expected level should be one of the following: 6, 8.</td>
+<td>227</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def' child has incorrect indentation level 12, expected level should be one of the following: 8, 10.</td>
+<td>229</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def rcurly' has incorrect indentation level 10, expected level should be one of the following: 6, 8.</td>
+<td>230</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'object def rcurly' has incorrect indentation level 8, expected level should be one of the following: 4, 6.</td>
+<td>231</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>283</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>310</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.replication.TestPerTableCFReplication.java">org/apache/hadoop/hbase/replication/TestPerTableCFReplication.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>AvoidStarImport</td>
+<td>Using the '.*' form of import should be avoided - org.junit.Assert.*.</td>
+<td>20</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def rcurly' has incorrect indentation level 1, expected level should be 2.</td>
+<td>278</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>MethodLength</td>
+<td>Method length is 157 lines (max allowed is 150).</td>
+<td>373</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.replication.TestReplicationDisableInactivePeer.java">org/apache/hadoop/hbase/replication/TestReplicationDisableInactivePeer.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>53</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.replication.TestReplicationKillMasterRSCompressed.java">org/apache/hadoop/hbase/replication/TestReplicationKillMasterRSCompressed.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>40</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.replication.TestVerifyReplication.java">org/apache/hadoop/hbase/replication/TestVerifyReplication.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 26.</td>
+<td>410</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 26.</td>
+<td>415</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 26.</td>
+<td>416</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.replication.WALCellFilter.java">org/apache/hadoop/hbase/replication/WALCellFilter.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.wal.WAL.Entry' import.</td>
+<td>23</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>37</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.replication.WALEntryFilter.java">org/apache/hadoop/hbase/replication/WALEntryFilter.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.HBaseInterfaceAudience' import.</td>
+<td>21</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>33</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.replication.master.ReplicationLogCleaner.java">org/apache/hadoop/hbase/replication/master/ReplicationLogCleaner.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>128</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.replication.regionserver.DumpReplicationQueues.java">org/apache/hadoop/hbase/replication/regionserver/DumpReplicationQueues.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 105).</td>
+<td>68</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>MethodParamPad</td>
+<td>'(' is preceded with whitespace.</td>
+<td>101</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>MethodParamPad</td>
+<td>'(' is preceded with whitespace.</td>
+<td>109</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>151</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>152</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 101).</td>
+<td>272</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.replication.regionserver.MetricsSink.java">org/apache/hadoop/hbase/replication/regionserver/MetricsSink.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.CompatibilitySingletonFactory' import.</td>
+<td>22</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>67</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.replication.regionserver.MetricsSource.java">org/apache/hadoop/hbase/replication/regionserver/MetricsSource.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.CompatibilitySingletonFactory' import.</td>
+<td>27</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 124).</td>
+<td>64</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.replication.regionserver.Replication.java">org/apache/hadoop/hbase/replication/regionserver/Replication.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>197</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>210</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.replication.regionserver.ReplicationLoad.java">org/apache/hadoop/hbase/replication/regionserver/ReplicationLoad.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'java.util.ArrayList' import.</td>
+<td>23</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>52</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>130</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.replication.regionserver.ReplicationSink.java">org/apache/hadoop/hbase/replication/regionserver/ReplicationSink.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def rcurly' has incorrect indentation level 3, expected level should be 2.</td>
+<td>154</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>169</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>335</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>336</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>351</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>352</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>353</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>354</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 106).</td>
+<td>357</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>433</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.replication.regionserver.ReplicationSourceFactory.java">org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceFactory.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.replication.ReplicationQueueInfo' import.</td>
+<td>25</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>design</td>
+<td>HideUtilityClassConstructor</td>
+<td>Utility classes should not have a public or default constructor.</td>
+<td>30</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.replication.regionserver.ReplicationSourceInterface.java">org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceInterface.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>169</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.replication.regionserver.ReplicationSourceManager.java">org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceManager.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>176</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>177</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>183</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.replication.regionserver.ReplicationThrottler.java">org/apache/hadoop/hbase/replication/regionserver/ReplicationThrottler.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.util.EnvironmentEdgeManager' import.</td>
+<td>21</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>105</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.replication.regionserver.TestGlobalReplicationThrottler.java">org/apache/hadoop/hbase/replication/regionserver/TestGlobalReplicationThrottler.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 102).</td>
+<td>144</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 102).</td>
+<td>145</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 101).</td>
+<td>146</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.replication.regionserver.TestReplicationSink.java">org/apache/hadoop/hbase/replication/regionserver/TestReplicationSink.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>124</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>142</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>151</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>161</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>179</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>207</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>ParenPad</td>
+<td>'(' is followed by whitespace.</td>
+<td>214</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>229</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>257</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>409</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>412</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.replication.regionserver.TestReplicationSource.java">org/apache/hadoop/hbase/replication/regionserver/TestReplicationSource.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>RedundantImport</td>
+<td>Redundant import from the same package - org.apache.hadoop.hbase.replication.regionserver.HBaseInterClusterReplicationEndpoint.</td>
+<td>51</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>RedundantImport</td>
+<td>Redundant import from the same package - org.apache.hadoop.hbase.replication.regionserver.RecoveredReplicationSource.</td>
+<td>52</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>RedundantImport</td>
+<td>Redundant import from the same package - org.apache.hadoop.hbase.replication.regionserver.RecoveredReplicationSourceShipper.</td>
+<td>53</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>RedundantImport</td>
+<td>Redundant import from the same package - org.apache.hadoop.hbase.replication.regionserver.Replication.</td>
+<td>54</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>RedundantImport</td>
+<td>Redundant import from the same package - org.apache.hadoop.hbase.replication.regionserver.ReplicationSource.</td>
+<td>55</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>RedundantImport</td>
+<td>Redundant import from the same package - org.apache.hadoop.hbase.replication.regionserver.ReplicationSourceManager.</td>
+<td>56</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>99</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>101</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>119</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>120</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.replication.regionserver.TestReplicationSourceManager.java">org/apache/hadoop/hbase/replication/regionserver/TestReplicationSourceManager.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 102).</td>
+<td>305</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>705</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>706</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.replication.regionserver.TestWALEntrySinkFilter.java">org/apache/hadoop/hbase/replication/regionserver/TestWALEntrySinkFilter.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>105</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.replication.regionserver.TestWALEntryStream.java">org/apache/hadoop/hbase/replication/regionserver/TestWALEntryStream.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'lambda arguments' has incorrect indentation level 8, expected level should be 6.</td>
+<td>631</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.replication.regionserver.WALEntrySinkFilter.java">org/apache/hadoop/hbase/replication/regionserver/WALEntrySinkFilter.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>37</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.replication.regionserver.WALEntryStream.java">org/apache/hadoop/hbase/replication/regionserver/WALEntryStream.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>82</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>368</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.rest.ExistsResource.java">org/apache/hadoop/hbase/rest/ExistsResource.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'javax.ws.rs.core.Response.ResponseBuilder' import.</td>
+<td>30</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>48</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>49</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.rest.HBaseRESTTestingUtility.java">org/apache/hadoop/hbase/rest/HBaseRESTTestingUtility.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>55</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'try' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>56</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'try' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>57</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'try' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>58</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'try rcurly' has incorrect indentation level 4, expected level should be 6.</td>
+<td>59</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'catch' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>60</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'catch rcurly' has incorrect indentation level 4, expected level should be 6.</td>
+<td>61</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.rest.MetricsREST.java">org/apache/hadoop/hbase/rest/MetricsREST.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.CompatibilitySingletonFactory' import.</td>
+<td>23</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>RedundantImport</td>
+<td>Redundant import from the same package - org.apache.hadoop.hbase.rest.MetricsRESTSource.</td>
+<td>25</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'ctor def' child has incorrect indentation level 5, expected level should be 4.</td>
+<td>37</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.rest.MultiRowResource.java">org/apache/hadoop/hbase/rest/MultiRowResource.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>51</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>52</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>53</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.rest.NamespacesInstanceResource.java">org/apache/hadoop/hbase/rest/NamespacesInstanceResource.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>66</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>74</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>87</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.rest.NamespacesResource.java">org/apache/hadoop/hbase/rest/NamespacesResource.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.rest.model.NamespacesModel' import.</td>
+<td>36</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>51</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.rest.PerformanceEvaluation.java">org/apache/hadoop/hbase/rest/PerformanceEvaluation.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.ArrayBackedTag' import.</td>
+<td>51</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>217</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if' child has incorrect indentation level 10, expected level should be 12.</td>
+<td>357</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def' child has incorrect indentation level 11, expected level should be one of the following: 10, 12.</td>
+<td>500</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>MethodParamPad</td>
+<td>'(' is preceded with whitespace.</td>
+<td>539</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>571</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>591</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>MethodParamPad</td>
+<td>'(' is preceded with whitespace.</td>
+<td>621</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'&quot;, startRow=&quot;' has incorrect indentation level 10, expected level should be 12.</td>
+<td>738</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'&quot;, perClientRunRows=&quot;' has incorrect indentation level 10, expected level should be 12.</td>
+<td>739</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'&quot;, totalRows=&quot;' has incorrect indentation level 10, expected level should be 12.</td>
+<td>740</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'&quot;, clients=&quot;' has incorrect indentation level 10, expected level should be 12.</td>
+<td>741</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'&quot;, flushCommits=&quot;' has incorrect indentation level 10, expected level should be 12.</td>
+<td>742</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'&quot;, writeToWAL=&quot;' has incorrect indentation level 10, expected level should be 12.</td>
+<td>743</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'&quot;, useTags=&quot;' has incorrect indentation level 10, expected level should be 12.</td>
+<td>744</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'&quot;, noOfTags=&quot;' has incorrect indentation level 10, expected level should be 12.</td>
+<td>745</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>coding</td>
+<td>InnerAssignment</td>
+<td>Inner assignments should be avoided.</td>
+<td>1031</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>EmptyBlock</td>
+<td>Must have at least one statement.</td>
+<td>1236</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>1239</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>1307</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1558</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.rest.ProtobufMessageHandler.java">org/apache/hadoop/hbase/rest/ProtobufMessageHandler.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>42</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.rest.RESTServer.java">org/apache/hadoop/hbase/rest/RESTServer.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'java.util.EnumSet' import.</td>
+<td>25</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider' import.</td>
+<td>28</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
+<td>31</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.http.HttpServerUtil' import.</td>
+<td>41</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.eclipse.jetty.http.HttpVersion' import.</td>
+<td>54</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.eclipse.jetty.server.HttpConnectionFactory' import.</td>
+<td>56</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.eclipse.jetty.server.HttpConfiguration' import.</td>
+<td>58</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.eclipse.jetty.server.SecureRequestCustomizer' import.</td>
+<td>60</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.eclipse.jetty.servlet.ServletContextHandler' import.</td>
+<td>62</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.eclipse.jetty.jmx.MBeanContainer' import.</td>
+<td>65</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'javax.servlet.DispatcherType' import.</td>
+<td>73</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>design</td>
+<td>VisibilityModifier</td>
+<td>Variable 'conf' must be private and have accessor methods.</td>
+<td>109</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>EmptyBlock</td>
+<td>Must have at least one statement.</td>
+<td>223</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 101).</td>
+<td>261</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 104).</td>
+<td>263</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 110).</td>
+<td>338</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.rest.RESTServlet.java">org/apache/hadoop/hbase/rest/RESTServlet.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.client.Admin' import.</td>
+<td>27</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>76</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>97</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>155</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>156</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.rest.RegionsResource.java">org/apache/hadoop/hbase/rest/RegionsResource.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'java.io.IOException' import.</td>
+<td>29</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>61</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>62</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.rest.ResultGenerator.java">org/apache/hadoop/hbase/rest/ResultGenerator.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.Cell' import.</td>
+<td>26</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.rest.RootResource.java">org/apache/hadoop/hbase/rest/RootResource.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'javax.ws.rs.core.Response.ResponseBuilder' import.</td>
+<td>32</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.TableName' import.</td>
+<td>37</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>55</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.rest.RowResource.java">org/apache/hadoop/hbase/rest/RowResource.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>76</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>77</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>78</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>79</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>80</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>81</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>227</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'try' child has incorrect indentation level 12, expected level should be 14.</td>
+<td>228</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'try rcurly' has incorrect indentation level 10, expected level should be 12.</td>
+<td>229</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'catch' child has incorrect indentation level 12, expected level should be 14.</td>
+<td>230</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'catch rcurly' has incorrect indentation level 10, expected level should be 12.</td>
+<td>231</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>267</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'try' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>268</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'try rcurly' has incorrect indentation level 6, expected level should be 8.</td>
+<td>269</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'catch' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>270</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'catch rcurly' has incorrect indentation level 6, expected level should be 8.</td>
+<td>271</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>misc</td>
+<td>ArrayTypeStyle</td>
+<td>Array brackets at illegal position.</td>
+<td>313</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>338</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'try' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>339</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'try rcurly' has incorrect indentation level 6, expected level should be 8.</td>
+<td>340</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'catch' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>341</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'catch rcurly' has incorrect indentation level 6, expected level should be 8.</td>
+<td>342</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>403</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'else' construct must use '{}'s.</td>
+<td>405</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>444</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'try' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>445</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'try rcurly' has incorrect indentation level 6, expected level should be 8.</td>
+<td>446</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'catch' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>447</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'catch rcurly' has incorrect indentation level 6, expected level should be 8.</td>
+<td>448</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>561</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'try' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>562</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'try rcurly' has incorrect indentation level 6, expected level should be 8.</td>
+<td>563</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'catch' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>564</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'catch rcurly' has incorrect indentation level 6, expected level should be 8.</td>
+<td>565</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>691</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'try' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>692</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'try rcurly' has incorrect indentation level 6, expected level should be 8.</td>
+<td>693</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'catch' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>694</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'catch rcurly' has incorrect indentation level 6, expected level should be 8.</td>
+<td>695</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 101).</td>
+<td>714</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>785</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'try' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>786</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'try rcurly' has incorrect indentation level 6, expected level should be 8.</td>
+<td>787</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'catch' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>788</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'catch rcurly' has incorrect indentation level 6, expected level should be 8.</td>
+<td>789</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 101).</td>
+<td>808</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 103).</td>
+<td>848</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
@@ -68214,18 +73038,573 @@
 <td>882</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>924</td></tr>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'try' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>883</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'try rcurly' has incorrect indentation level 6, expected level should be 8.</td>
+<td>884</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'catch' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>885</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'catch rcurly' has incorrect indentation level 6, expected level should be 8.</td>
+<td>886</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.rest.RowResourceBase.java">org/apache/hadoop/hbase/rest/RowResourceBase.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'com.fasterxml.jackson.databind.ObjectMapper' import.</td>
+<td>34</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 107).</td>
+<td>265</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 104).</td>
+<td>273</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def modifier' has incorrect indentation level 4, expected level should be 2.</td>
+<td>293</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 116).</td>
+<td>294</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 107).</td>
+<td>306</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 104).</td>
+<td>314</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 102).</td>
+<td>332</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 104).</td>
+<td>357</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 115).</td>
+<td>378</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 115).</td>
+<td>394</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 104).</td>
+<td>411</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 104).</td>
+<td>449</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'.' has incorrect indentation level 4, expected level should be 6.</td>
+<td>543</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.rest.RowResultGenerator.java">org/apache/hadoop/hbase/rest/RowResultGenerator.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.client.Get' import.</td>
+<td>30</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.rest.RowSpec.java">org/apache/hadoop/hbase/rest/RowSpec.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.HConstants' import.</td>
+<td>31</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>coding</td>
+<td>InnerAssignment</td>
+<td>Inner assignments should be avoided.</td>
+<td>71</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>coding</td>
+<td>InnerAssignment</td>
+<td>Inner assignments should be avoided.</td>
+<td>76</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
-<td>EmptyBlock</td>
-<td>Must have at least one statement.</td>
-<td>968</td></tr></table></div>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>95</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>coding</td>
+<td>InnerAssignment</td>
+<td>Inner assignments should be avoided.</td>
+<td>119</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>coding</td>
+<td>InnerAssignment</td>
+<td>Inner assignments should be avoided.</td>
+<td>174</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>237</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>238</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'while' has incorrect indentation level 8, expected level should be 10.</td>
+<td>239</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'while' child has incorrect indentation level 10, expected level should be 12.</td>
+<td>240</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if' has incorrect indentation level 10, expected level should be 12.</td>
+<td>241</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if' child has incorrect indentation level 12, expected level should be 14.</td>
+<td>242</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if' child has incorrect indentation level 12, expected level should be 14.</td>
+<td>243</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if rcurly' has incorrect indentation level 10, expected level should be 12.</td>
+<td>244</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'while' child has incorrect indentation level 10, expected level should be 12.</td>
+<td>245</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'while rcurly' has incorrect indentation level 8, expected level should be 10.</td>
+<td>246</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>247</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block rcurly' has incorrect indentation level 6, expected level should be 8.</td>
+<td>248</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>249</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>250</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'while' has incorrect indentation level 8, expected level should be 10.</td>
+<td>251</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'while' child has incorrect indentation level 10, expected level should be 12.</td>
+<td>252</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if' has incorrect indentation level 10, expected level should be 12.</td>
+<td>253</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if' child has incorrect indentation level 12, expected level should be 14.</td>
+<td>254</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if' child has incorrect indentation level 12, expected level should be 14.</td>
+<td>255</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if rcurly' has incorrect indentation level 10, expected level should be 12.</td>
+<td>256</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'while' child has incorrect indentation level 10, expected level should be 12.</td>
+<td>257</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'while rcurly' has incorrect indentation level 8, expected level should be 10.</td>
+<td>258</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>259</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block rcurly' has incorrect indentation level 6, expected level should be 8.</td>
+<td>260</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>261</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>262</td></tr></table></div>
 <div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.TestStoreFileInfo.java">org/apache/hadoop/hbase/regionserver/TestStoreFileInfo.java</h3>
+<h3 id="org.apache.hadoop.hbase.rest.ScannerInstanceResource.java">org/apache/hadoop/hbase/rest/ScannerInstanceResource.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.rest.model.CellModel' import.</td>
+<td>41</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.rest.ScannerResource.java">org/apache/hadoop/hbase/rest/ScannerResource.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'com.fasterxml.jackson.core.JsonParseException' import.</td>
+<td>42</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'Collections' has incorrect indentation level 3, expected level should be 4.</td>
+<td>55</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>61</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>62</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.rest.ScannerResultGenerator.java">org/apache/hadoop/hbase/rest/ScannerResultGenerator.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>ParenPad</td>
+<td>')' is preceded with whitespace.</td>
+<td>98</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.rest.SchemaResource.java">org/apache/hadoop/hbase/rest/SchemaResource.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'else' construct must use '{}'s.</td>
+<td>120</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'try' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>121</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'try' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>122</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'try rcurly' has incorrect indentation level 6, expected level should be 8.</td>
+<td>123</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'catch' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>125</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'catch rcurly' has incorrect indentation level 6, expected level should be 8.</td>
+<td>128</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.rest.StorageClusterStatusResource.java">org/apache/hadoop/hbase/rest/StorageClusterStatusResource.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>57</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.rest.StorageClusterVersionResource.java">org/apache/hadoop/hbase/rest/StorageClusterVersionResource.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>51</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.rest.TableResource.java">org/apache/hadoop/hbase/rest/TableResource.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.client.Scan' import.</td>
+<td>35</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>51</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>52</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>66</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.rest.TableScanResource.java">org/apache/hadoop/hbase/rest/TableScanResource.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'com.fasterxml.jackson.annotation.JsonIgnore' import.</td>
+<td>49</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.rest.TestGetAndPutResource.java">org/apache/hadoop/hbase/rest/TestGetAndPutResource.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>misc</td>
+<td>UpperEll</td>
+<td>Should use uppercase 'L'.</td>
+<td>545</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>misc</td>
+<td>UpperEll</td>
+<td>Should use uppercase 'L'.</td>
+<td>548</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>misc</td>
+<td>UpperEll</td>
+<td>Should use uppercase 'L'.</td>
+<td>551</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>misc</td>
+<td>UpperEll</td>
+<td>Should use uppercase 'L'.</td>
+<td>554</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.rest.TestMultiRowResource.java">org/apache/hadoop/hbase/rest/TestMultiRowResource.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 104).</td>
+<td>213</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.rest.TestNamespacesInstanceResource.java">org/apache/hadoop/hbase/rest/TestNamespacesInstanceResource.java</h3>
 <table border="0" class="table table-striped">
 <tr class="b">
 <th>Severity</th>
@@ -68240,7 +73619,7 @@
 <td>Using the '.*' form of import should be avoided - org.junit.Assert.*.</td>
 <td>20</td></tr></table></div>
 <div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.TestStoreFileRefresherChore.java">org/apache/hadoop/hbase/regionserver/TestStoreFileRefresherChore.java</h3>
+<h3 id="org.apache.hadoop.hbase.rest.TestNamespacesResource.java">org/apache/hadoop/hbase/rest/TestNamespacesResource.java</h3>
 <table border="0" class="table table-striped">
 <tr class="b">
 <th>Severity</th>
@@ -68250,12 +73629,12 @@
 <th>Line</th></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 127).</td>
-<td>204</td></tr></table></div>
+<td>imports</td>
+<td>AvoidStarImport</td>
+<td>Using the '.*' form of import should be avoided - org.junit.Assert.*.</td>
+<td>20</td></tr></table></div>
 <div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.TestStoreScanner.java">org/apache/hadoop/hbase/regionserver/TestStoreScanner.java</h3>
+<h3 id="org.apache.hadoop.hbase.rest.TestScannersWithFilters.java">org/apache/hadoop/hbase/rest/TestScannersWithFilters.java</h3>
 <table border="0" class="table table-striped">
 <tr class="b">
 <th>Severity</th>
@@ -68265,72 +73644,891 @@
 <th>Line</th></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>289</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>292</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>342</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>345</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>MethodLength</td>
+<td>Method length is 154 lines (max allowed is 150).</td>
+<td>499</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>574</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>575</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>576</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>577</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>579</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>580</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>581</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>582</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>584</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>585</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>586</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>587</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>589</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>590</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>591</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>592</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>593</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>594</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>596</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>597</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>598</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>599</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>600</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>601</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>603</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>604</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>605</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>606</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>607</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>608</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>622</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>623</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>624</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>625</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>627</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>628</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>629</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>630</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>632</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>633</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>634</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>635</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>637</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>638</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>639</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>640</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>642</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>643</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>644</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>645</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>647</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>648</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>649</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>650</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>735</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>736</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>737</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>738</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>739</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>740</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>742</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>743</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>744</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>745</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>746</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>747</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>749</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>750</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>751</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>752</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>753</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>754</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>756</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>757</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>758</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>759</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>760</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>761</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>763</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>764</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>765</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>766</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>767</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>768</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>782</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>783</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>784</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>785</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>786</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>787</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>789</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>790</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>791</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>792</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>793</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>794</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>898</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>899</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>900</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>901</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>902</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>903</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>905</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>906</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>907</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>908</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>909</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>910</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>912</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>913</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>914</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>915</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>916</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>917</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>933</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>934</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>935</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>936</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>937</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>938</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>940</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>941</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>942</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>943</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>944</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>945</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>947</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>948</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>949</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>950</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>951</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>952</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>974</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>999</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>1000</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>1001</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>1002</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>1003</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>1004</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.rest.TestScannersWithLabels.java">org/apache/hadoop/hbase/rest/TestScannersWithLabels.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
-<td>166</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 14, expected level should be 12.</td>
-<td>238</td></tr>
+<td>99</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 14, expected level should be 12.</td>
-<td>267</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>381</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>409</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>438</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 12, expected level should be 10.</td>
-<td>472</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization rcurly' has incorrect indentation level 4, expected level should be one of the following: 8, 10.</td>
-<td>473</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 12, expected level should be 10.</td>
-<td>523</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>872</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>969</td></tr></table></div>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 124).</td>
+<td>171</td></tr></table></div>
 <div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.TestStripeStoreFileManager.java">org/apache/hadoop/hbase/regionserver/TestStripeStoreFileManager.java</h3>
+<h3 id="org.apache.hadoop.hbase.rest.TestSchemaResource.java">org/apache/hadoop/hbase/rest/TestSchemaResource.java</h3>
 <table border="0" class="table table-striped">
 <tr class="b">
 <th>Severity</th>
@@ -68340,36 +74538,12 @@
 <th>Line</th></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'for' construct must use '{}'s.</td>
-<td>124</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>coding</td>
-<td>EmptyStatement</td>
-<td>Empty statement.</td>
-<td>124</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>LeftCurly</td>
-<td>'{' at column 3 should be on the previous line.</td>
-<td>523</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'try' child has incorrect indentation level 7, expected level should be 6.</td>
-<td>547</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'try' child has incorrect indentation level 7, expected level should be 6.</td>
-<td>548</td></tr></table></div>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 103).</td>
+<td>149</td></tr></table></div>
 <div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.TestSyncTimeRangeTracker.java">org/apache/hadoop/hbase/regionserver/TestSyncTimeRangeTracker.java</h3>
+<h3 id="org.apache.hadoop.hbase.rest.TestTableScan.java">org/apache/hadoop/hbase/rest/TestTableScan.java</h3>
 <table border="0" class="table table-striped">
 <tr class="b">
 <th>Severity</th>
@@ -68379,423 +74553,282 @@
 <th>Line</th></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if' has incorrect indentation level 12, expected level should be one of the following: 8, 10.</td>
+<td>297</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if' child has incorrect indentation level 16, expected level should be one of the following: 10, 12.</td>
+<td>298</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if rcurly' has incorrect indentation level 12, expected level should be one of the following: 8, 10.</td>
+<td>299</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if' has incorrect indentation level 12, expected level should be one of the following: 8, 10.</td>
+<td>304</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if' child has incorrect indentation level 16, expected level should be one of the following: 10, 12.</td>
+<td>305</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if rcurly' has incorrect indentation level 12, expected level should be one of the following: 8, 10.</td>
+<td>306</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>689</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'object def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
+<td>690</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def' child has incorrect indentation level 16, expected level should be one of the following: 12, 14.</td>
+<td>694</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def' child has incorrect indentation level 16, expected level should be one of the following: 12, 14.</td>
+<td>695</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def' child has incorrect indentation level 16, expected level should be one of the following: 12, 14.</td>
+<td>696</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def modifier' has incorrect indentation level 8, expected level should be 6.</td>
+<td>705</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.rest.VersionResource.java">org/apache/hadoop/hbase/rest/VersionResource.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'javax.ws.rs.core.Response.ResponseBuilder' import.</td>
+<td>32</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.rest.model.VersionModel' import.</td>
+<td>37</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>60</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.rest.client.Client.java">org/apache/hadoop/hbase/rest/client/Client.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>165</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>54</td></tr>
+<td>220</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
-<td>'for' construct must use '{}'s.</td>
-<td>69</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'for' construct must use '{}'s.</td>
-<td>72</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>96</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>97</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>102</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>103</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.TestTags.java">org/apache/hadoop/hbase/regionserver/TestTags.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>234</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>260</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>322</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>334</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>351</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>362</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>373</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>385</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>400</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>418</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>548</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.TestTimestampFilterSeekHint.java">org/apache/hadoop/hbase/regionserver/TestTimestampFilterSeekHint.java</h3>
-<table border="0" class="table table-striped">
+<td>423</td></tr>
 <tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>451</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>ParenPad</td>
-<td>')' is preceded with whitespace.</td>
-<td>77</td></tr>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>470</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>ParenPad</td>
-<td>')' is preceded with whitespace.</td>
-<td>91</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.TestWALLockup.java">org/apache/hadoop/hbase/regionserver/TestWALLockup.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'while' construct must use '{}'s.</td>
-<td>158</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>MethodParamPad</td>
-<td>'(' is preceded with whitespace.</td>
-<td>264</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 104).</td>
-<td>428</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.TestWALMonotonicallyIncreasingSeqId.java">org/apache/hadoop/hbase/regionserver/TestWALMonotonicallyIncreasingSeqId.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>coding</td>
-<td>InnerAssignment</td>
-<td>Inner assignments should be avoided.</td>
-<td>232</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.TestWalAndCompactingMemStoreFlush.java">org/apache/hadoop/hbase/regionserver/TestWalAndCompactingMemStoreFlush.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>MethodLength</td>
-<td>Method length is 230 lines (max allowed is 150).</td>
-<td>137</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>MethodLength</td>
-<td>Method length is 254 lines (max allowed is 150).</td>
-<td>371</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 102).</td>
-<td>887</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 101).</td>
-<td>889</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 101).</td>
-<td>891</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 104).</td>
-<td>894</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 102).</td>
-<td>998</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 102).</td>
-<td>1005</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.TimeRangeTracker.java">org/apache/hadoop/hbase/regionserver/TimeRangeTracker.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>484</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>189</td></tr>
+<td>532</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>190</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.compactions.CompactionConfiguration.java">org/apache/hadoop/hbase/regionserver/compactions/CompactionConfiguration.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.regionserver.StoreConfigInformation' import.</td>
-<td>28</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.compactions.CompactionProgress.java">org/apache/hadoop/hbase/regionserver/compactions/CompactionProgress.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>VisibilityModifier</td>
-<td>Variable 'currentCompactedKVs' must be private and have accessor methods.</td>
-<td>42</td></tr>
+<td>535</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>VisibilityModifier</td>
-<td>Variable 'totalCompactedSize' must be private and have accessor methods.</td>
-<td>44</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>coding</td>
-<td>InnerAssignment</td>
-<td>Inner assignments should be avoided.</td>
-<td>64</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest.java">org/apache/hadoop/hbase/regionserver/compactions/CompactionRequest.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'java.util.Collection' import.</td>
-<td>25</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.compactions.CompactionRequester.java">org/apache/hadoop/hbase/regionserver/compactions/CompactionRequester.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'edu.umd.cs.findbugs.annotations.Nullable' import.</td>
-<td>27</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.compactions.Compactor.java">org/apache/hadoop/hbase/regionserver/compactions/Compactor.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 107).</td>
-<td>99</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>VisibilityModifier</td>
-<td>Variable 'maxKeyCount' must be private and have accessor methods.</td>
-<td>120</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>VisibilityModifier</td>
-<td>Variable 'earliestPutTs' must be private and have accessor methods.</td>
-<td>122</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>VisibilityModifier</td>
-<td>Variable 'latestPutTs' must be private and have accessor methods.</td>
-<td>124</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>VisibilityModifier</td>
-<td>Variable 'maxSeqId' must be private and have accessor methods.</td>
-<td>126</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>VisibilityModifier</td>
-<td>Variable 'maxMVCCReadpoint' must be private and have accessor methods.</td>
-<td>128</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>VisibilityModifier</td>
-<td>Variable 'maxTagsLength' must be private and have accessor methods.</td>
-<td>130</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>VisibilityModifier</td>
-<td>Variable 'minSeqIdToKeep' must be private and have accessor methods.</td>
-<td>132</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>coding</td>
-<td>InnerAssignment</td>
-<td>Inner assignments should be avoided.</td>
-<td>193</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 107).</td>
-<td>200</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 104).</td>
-<td>234</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.compactions.CurrentHourProvider.java">org/apache/hadoop/hbase/regionserver/compactions/CurrentHourProvider.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>FinalClass</td>
-<td>Class CurrentHourProvider should be declared as final.</td>
-<td>25</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>LeftCurly</td>
-<td>'{' at column 33 should have line break after.</td>
-<td>27</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>coding</td>
-<td>InnerAssignment</td>
-<td>Inner assignments should be avoided.</td>
-<td>61</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.compactions.DefaultCompactor.java">org/apache/hadoop/hbase/regionserver/compactions/DefaultCompactor.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def modifier' has incorrect indentation level 8, expected level should be one of the following: 4, 6.</td>
-<td>52</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def' child has incorrect indentation level 10, expected level should be one of the following: 6, 8.</td>
-<td>56</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def rcurly' has incorrect indentation level 8, expected level should be one of the following: 4, 6.</td>
-<td>57</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'object def rcurly' has incorrect indentation level 6, expected level should be one of the following: 2, 4.</td>
-<td>58</td></tr>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>547</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>76</td></tr></table></div>
+<td>550</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>572</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>586</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>634</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>637</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>649</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>652</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>672</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>683</td></tr></table></div>
 <div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.compactions.OffPeakHours.java">org/apache/hadoop/hbase/regionserver/compactions/OffPeakHours.java</h3>
+<h3 id="org.apache.hadoop.hbase.rest.client.RemoteAdmin.java">org/apache/hadoop/hbase/rest/client/RemoteAdmin.java</h3>
 <table border="0" class="table table-striped">
 <tr class="b">
 <th>Severity</th>
@@ -68808,219 +74841,645 @@
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
-<td>23</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>LeftCurly</td>
-<td>'{' at column 46 should have line break after.</td>
-<td>30</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>LeftCurly</td>
-<td>'{' at column 60 should have line break after.</td>
-<td>31</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.compactions.PerfTestCompactionPolicies.java">org/apache/hadoop/hbase/regionserver/compactions/PerfTestCompactionPolicies.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>62</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>63</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>64</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>68</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>69</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>70</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>71</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>72</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>73</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization rcurly' has incorrect indentation level 5, expected level should be one of the following: 4, 6.</td>
-<td>74</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.compactions.RatioBasedCompactionPolicy.java">org/apache/hadoop/hbase/regionserver/compactions/RatioBasedCompactionPolicy.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if' child has incorrect indentation level 9, expected level should be 8.</td>
-<td>78</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.compactions.SortedCompactionPolicy.java">org/apache/hadoop/hbase/regionserver/compactions/SortedCompactionPolicy.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
+<td>34</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>117</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.compactions.SpikyFileListGenerator.java">org/apache/hadoop/hbase/regionserver/compactions/SpikyFileListGenerator.java</h3>
-<table border="0" class="table table-striped">
+<td>62</td></tr>
 <tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>63</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>ParenPad</td>
-<td>'(' is followed by whitespace.</td>
-<td>48</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.compactions.StripeCompactionPolicy.java">org/apache/hadoop/hbase/regionserver/compactions/StripeCompactionPolicy.java</h3>
-<table border="0" class="table table-striped">
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>81</td></tr>
 <tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>82</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>83</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>125</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>127</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>128</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>129</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>130</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>131</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'try' has incorrect indentation level 8, expected level should be 10.</td>
+<td>132</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'try' child has incorrect indentation level 10, expected level should be 12.</td>
+<td>133</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'try rcurly' has incorrect indentation level 8, expected level should be 10.</td>
 <td>134</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>144</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>152</td></tr>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'catch' child has incorrect indentation level 10, expected level should be 12.</td>
+<td>135</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>185</td></tr>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'catch rcurly' has incorrect indentation level 8, expected level should be 10.</td>
+<td>136</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>203</td></tr>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>137</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>300</td></tr>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>138</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>319</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>325</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>368</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>coding</td>
-<td>InnerAssignment</td>
-<td>Inner assignments should be avoided.</td>
-<td>416</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.compactions.StripeCompactor.java">org/apache/hadoop/hbase/regionserver/compactions/StripeCompactor.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>139</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
-<td>Line is longer than 100 characters (found 104).</td>
-<td>105</td></tr></table></div>
+<td>Line is longer than 100 characters (found 111).</td>
+<td>148</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
+<td>152</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
+<td>153</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if' has incorrect indentation level 6, expected level should be 4.</td>
+<td>154</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if' child has incorrect indentation level 10, expected level should be 6.</td>
+<td>155</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if' child has incorrect indentation level 10, expected level should be 6.</td>
+<td>156</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if rcurly' has incorrect indentation level 6, expected level should be 4.</td>
+<td>157</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>167</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>168</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>169</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>171</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>172</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>173</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'try' has incorrect indentation level 8, expected level should be 10.</td>
+<td>174</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'try' child has incorrect indentation level 10, expected level should be 12.</td>
+<td>175</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'try rcurly' has incorrect indentation level 8, expected level should be 10.</td>
+<td>176</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'catch' child has incorrect indentation level 10, expected level should be 12.</td>
+<td>177</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'catch rcurly' has incorrect indentation level 8, expected level should be 10.</td>
+<td>178</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>179</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>180</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>181</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>209</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'try' has incorrect indentation level 8, expected level should be 10.</td>
+<td>210</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'try' child has incorrect indentation level 10, expected level should be 12.</td>
+<td>212</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'try rcurly' has incorrect indentation level 8, expected level should be 10.</td>
+<td>214</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'catch' child has incorrect indentation level 10, expected level should be 12.</td>
+<td>216</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'catch rcurly' has incorrect indentation level 8, expected level should be 10.</td>
+<td>219</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>220</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>221</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>222</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'try' has incorrect indentation level 8, expected level should be 10.</td>
+<td>223</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'try' child has incorrect indentation level 10, expected level should be 12.</td>
+<td>224</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'try rcurly' has incorrect indentation level 8, expected level should be 10.</td>
+<td>225</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'catch' child has incorrect indentation level 10, expected level should be 12.</td>
+<td>226</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'catch rcurly' has incorrect indentation level 8, expected level should be 10.</td>
+<td>227</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>228</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>229</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>230</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>257</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>258</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>259</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>260</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>261</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'try' has incorrect indentation level 8, expected level should be 10.</td>
+<td>262</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'try' child has incorrect indentation level 10, expected level should be 12.</td>
+<td>263</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'try rcurly' has incorrect indentation level 8, expected level should be 10.</td>
+<td>264</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'catch' child has incorrect indentation level 10, expected level should be 12.</td>
+<td>265</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'catch rcurly' has incorrect indentation level 8, expected level should be 10.</td>
+<td>266</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>267</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>268</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>269</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>298</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>299</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>300</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'try' has incorrect indentation level 8, expected level should be 10.</td>
+<td>301</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'try' child has incorrect indentation level 10, expected level should be 12.</td>
+<td>302</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'try rcurly' has incorrect indentation level 8, expected level should be 10.</td>
+<td>303</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'catch' child has incorrect indentation level 10, expected level should be 12.</td>
+<td>304</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'catch rcurly' has incorrect indentation level 8, expected level should be 10.</td>
+<td>305</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>306</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>307</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>308</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>343</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>344</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>345</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'try' has incorrect indentation level 8, expected level should be 10.</td>
+<td>346</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'try' child has incorrect indentation level 10, expected level should be 12.</td>
+<td>347</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'try rcurly' has incorrect indentation level 8, expected level should be 10.</td>
+<td>348</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'catch' child has incorrect indentation level 10, expected level should be 12.</td>
+<td>349</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'catch rcurly' has incorrect indentation level 8, expected level should be 10.</td>
+<td>350</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>351</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>352</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>353</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>382</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>383</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>384</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>385</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>386</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>387</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'try' has incorrect indentation level 8, expected level should be 10.</td>
+<td>388</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'try' child has incorrect indentation level 10, expected level should be 12.</td>
+<td>389</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'try rcurly' has incorrect indentation level 8, expected level should be 10.</td>
+<td>390</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'catch' child has incorrect indentation level 10, expected level should be 12.</td>
+<td>391</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'catch rcurly' has incorrect indentation level 8, expected level should be 10.</td>
+<td>392</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>393</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>394</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>395</td></tr></table></div>
 <div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.compactions.TestCompactor.java">org/apache/hadoop/hbase/regionserver/compactions/TestCompactor.java</h3>
+<h3 id="org.apache.hadoop.hbase.rest.client.Response.java">org/apache/hadoop/hbase/rest/client/Response.java</h3>
 <table border="0" class="table table-striped">
 <tr class="b">
 <th>Severity</th>
@@ -69030,75 +75489,1161 @@
 <th>Line</th></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.http.Header' import.</td>
+<td>28</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>79</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.rest.client.TestRemoteHTableRetries.java">org/apache/hadoop/hbase/rest/client/TestRemoteHTableRetries.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 12, expected level should be one of the following: 10, 23.</td>
+<td>135</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.rest.client.TestRemoteTable.java">org/apache/hadoop/hbase/rest/client/TestRemoteTable.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>119</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 116).</td>
+<td>346</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>580</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.rest.filter.GZIPRequestStream.java">org/apache/hadoop/hbase/rest/filter/GZIPRequestStream.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>LeftCurly</td>
+<td>'{' at column 1 should be on the previous line.</td>
+<td>33</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.rest.filter.GZIPResponseStream.java">org/apache/hadoop/hbase/rest/filter/GZIPResponseStream.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>LeftCurly</td>
+<td>'{' at column 1 should be on the previous line.</td>
+<td>33</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.rest.filter.GzipFilter.java">org/apache/hadoop/hbase/rest/filter/GzipFilter.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.HBaseInterfaceAudience' import.</td>
+<td>39</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.rest.filter.RestCsrfPreventionFilter.java">org/apache/hadoop/hbase/rest/filter/RestCsrfPreventionFilter.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
+<td>40</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.rest.model.CellModel.java">org/apache/hadoop/hbase/rest/model/CellModel.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'com.fasterxml.jackson.annotation.JsonProperty' import.</td>
+<td>31</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.CellUtil' import.</td>
+<td>37</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>87</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>88</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>96</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>97</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>98</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>106</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>115</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>116</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>117</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>127</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>128</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>129</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>130</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>155</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.rest.model.CellSetModel.java">org/apache/hadoop/hbase/rest/model/CellSetModel.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.HConstants' import.</td>
+<td>34</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.rest.model.ColumnSchemaModel.java">org/apache/hadoop/hbase/rest/model/ColumnSchemaModel.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.HColumnDescriptor' import.</td>
+<td>32</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'com.fasterxml.jackson.annotation.JsonAnyGetter' import.</td>
+<td>35</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.rest.model.NamespacesInstanceModel.java">org/apache/hadoop/hbase/rest/model/NamespacesInstanceModel.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.client.Admin' import.</td>
+<td>35</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>71</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>81</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>LeftCurly</td>
+<td>'{' at column 23 should have line break after.</td>
+<td>85</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>LeftCurly</td>
+<td>'{' at column 40 should have line break after.</td>
+<td>90</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.rest.model.NamespacesModel.java">org/apache/hadoop/hbase/rest/model/NamespacesModel.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.client.Admin' import.</td>
+<td>34</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'com.fasterxml.jackson.annotation.JsonProperty' import.</td>
+<td>38</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>66</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.rest.model.ScannerModel.java">org/apache/hadoop/hbase/rest/model/ScannerModel.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.client.Scan' import.</td>
+<td>37</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'com.fasterxml.jackson.annotation.JsonInclude' import.</td>
+<td>78</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>design</td>
+<td>VisibilityModifier</td>
+<td>Variable 'type' must be private and have accessor methods.</td>
+<td>133</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
-<td>HideUtilityClassConstructor</td>
-<td>Utility classes should not have a public or default constructor.</td>
-<td>58</td></tr>
+<td>VisibilityModifier</td>
+<td>Variable 'value' must be private and have accessor methods.</td>
+<td>134</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>207</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.compactions.TestStripeCompactionPolicy.java">org/apache/hadoop/hbase/regionserver/compactions/TestStripeCompactionPolicy.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 47.</td>
-<td>142</td></tr>
+<td>design</td>
+<td>VisibilityModifier</td>
+<td>Variable 'op' must be private and have accessor methods.</td>
+<td>135</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>172</td></tr>
+<td>design</td>
+<td>VisibilityModifier</td>
+<td>Variable 'type' must be private and have accessor methods.</td>
+<td>205</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>179</td></tr>
+<td>design</td>
+<td>VisibilityModifier</td>
+<td>Variable 'op' must be private and have accessor methods.</td>
+<td>206</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>design</td>
+<td>VisibilityModifier</td>
+<td>Variable 'value' must be private and have accessor methods.</td>
+<td>208</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>design</td>
+<td>VisibilityModifier</td>
+<td>Variable 'filters' must be private and have accessor methods.</td>
+<td>209</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>design</td>
+<td>VisibilityModifier</td>
+<td>Variable 'limit' must be private and have accessor methods.</td>
+<td>210</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>design</td>
+<td>VisibilityModifier</td>
+<td>Variable 'offset' must be private and have accessor methods.</td>
+<td>211</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>design</td>
+<td>VisibilityModifier</td>
+<td>Variable 'family' must be private and have accessor methods.</td>
+<td>212</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>design</td>
+<td>VisibilityModifier</td>
+<td>Variable 'qualifier' must be private and have accessor methods.</td>
+<td>213</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>design</td>
+<td>VisibilityModifier</td>
+<td>Variable 'ifMissing' must be private and have accessor methods.</td>
+<td>214</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>design</td>
+<td>VisibilityModifier</td>
+<td>Variable 'latestVersion' must be private and have accessor methods.</td>
+<td>215</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>design</td>
+<td>VisibilityModifier</td>
+<td>Variable 'minColumn' must be private and have accessor methods.</td>
+<td>216</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>design</td>
+<td>VisibilityModifier</td>
+<td>Variable 'minColumnInclusive' must be private and have accessor methods.</td>
+<td>217</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>design</td>
+<td>VisibilityModifier</td>
+<td>Variable 'maxColumn' must be private and have accessor methods.</td>
+<td>218</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>design</td>
+<td>VisibilityModifier</td>
+<td>Variable 'maxColumnInclusive' must be private and have accessor methods.</td>
+<td>219</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>design</td>
+<td>VisibilityModifier</td>
+<td>Variable 'dropDependentColumn' must be private and have accessor methods.</td>
+<td>220</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>design</td>
+<td>VisibilityModifier</td>
+<td>Variable 'chance' must be private and have accessor methods.</td>
+<td>221</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>design</td>
+<td>VisibilityModifier</td>
+<td>Variable 'prefixes' must be private and have accessor methods.</td>
+<td>222</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>design</td>
+<td>VisibilityModifier</td>
+<td>Variable 'timestamps' must be private and have accessor methods.</td>
+<td>224</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
-<td>'while' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>351</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>372</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>373</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>374</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>375</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>376</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>377</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>378</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>379</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>380</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>381</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>382</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>385</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>386</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>387</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>390</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>391</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>392</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>393</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>394</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>395</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'for' has incorrect indentation level 8, expected level should be 10.</td>
+<td>396</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'for' child has incorrect indentation level 10, expected level should be 12.</td>
+<td>397</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'for rcurly' has incorrect indentation level 8, expected level should be 10.</td>
+<td>398</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>399</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block rcurly' has incorrect indentation level 6, expected level should be 8.</td>
+<td>400</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>401</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>402</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>403</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>404</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>405</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>406</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>407</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>408</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>409</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>410</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>411</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'for' has incorrect indentation level 8, expected level should be 10.</td>
+<td>412</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'for' child has incorrect indentation level 10, expected level should be 12.</td>
+<td>413</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'for rcurly' has incorrect indentation level 8, expected level should be 10.</td>
+<td>414</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>415</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block rcurly' has incorrect indentation level 6, expected level should be 8.</td>
+<td>416</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>417</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>418</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block rcurly' has incorrect indentation level 6, expected level should be 8.</td>
+<td>419</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>420</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>421</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>422</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>423</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>424</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>425</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>426</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>427</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>428</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>429</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>430</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>431</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>432</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>433</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>434</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>435</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>436</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if' has incorrect indentation level 8, expected level should be 10.</td>
+<td>439</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if' child has incorrect indentation level 10, expected level should be 12.</td>
+<td>440</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if rcurly' has incorrect indentation level 8, expected level should be 10.</td>
+<td>441</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if' has incorrect indentation level 8, expected level should be 10.</td>
+<td>442</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if' child has incorrect indentation level 10, expected level should be 12.</td>
+<td>443</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if rcurly' has incorrect indentation level 8, expected level should be 10.</td>
+<td>444</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>445</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>446</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>447</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if' has incorrect indentation level 8, expected level should be 10.</td>
+<td>450</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if' child has incorrect indentation level 10, expected level should be 12.</td>
+<td>451</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if rcurly' has incorrect indentation level 8, expected level should be 10.</td>
+<td>452</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if' has incorrect indentation level 8, expected level should be 10.</td>
+<td>453</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if' child has incorrect indentation level 10, expected level should be 12.</td>
+<td>454</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if rcurly' has incorrect indentation level 8, expected level should be 10.</td>
+<td>455</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>456</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>457</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>458</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>459</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>460</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>560</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>562</td></tr>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>461</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>462</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>463</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>464</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>465</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>466</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>467</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>468</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>469</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>470</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>489</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>500</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>511</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>573</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>596</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>598</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
-<td>601</td></tr>
-<tr class="a">
+<td>763</td></tr>
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>819</td></tr></table></div>
+<td>'for' construct must use '{}'s.</td>
+<td>824</td></tr></table></div>
 <div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.handler.CloseRegionHandler.java">org/apache/hadoop/hbase/regionserver/handler/CloseRegionHandler.java</h3>
+<h3 id="org.apache.hadoop.hbase.rest.model.StorageClusterStatusModel.java">org/apache/hadoop/hbase/rest/model/StorageClusterStatusModel.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.rest.ProtobufMessageHandler' import.</td>
+<td>34</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.protobuf.ProtobufUtil' import.</td>
+<td>35</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'com.fasterxml.jackson.annotation.JsonProperty' import.</td>
+<td>39</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>521</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>611</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>649</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.rest.model.TableInfoModel.java">org/apache/hadoop/hbase/rest/model/TableInfoModel.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.protobuf.ProtobufUtil' import.</td>
+<td>33</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>65</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.rest.model.TableListModel.java">org/apache/hadoop/hbase/rest/model/TableListModel.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.rest.ProtobufMessageHandler' import.</td>
+<td>31</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.protobuf.ProtobufUtil' import.</td>
+<td>32</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.rest.model.TableModel.java">org/apache/hadoop/hbase/rest/model/TableModel.java</h3>
 <table border="0" class="table table-striped">
 <tr class="b">
 <th>Severity</th>
@@ -69111,27 +76656,207 @@
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>65</td></tr>
+<td>55</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.rest.model.TableRegionModel.java">org/apache/hadoop/hbase/rest/model/TableRegionModel.java</h3>
+<table border="0" class="table table-striped">
 <tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>66</td></tr>
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>67</td></tr>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.TableName' import.</td>
+<td>28</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>69</td></tr></table></div>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.HRegionInfo' import.</td>
+<td>29</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>misc</td>
+<td>ArrayTypeStyle</td>
+<td>Array brackets at illegal position.</td>
+<td>140</td></tr></table></div>
 <div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.handler.OpenPriorityRegionHandler.java">org/apache/hadoop/hbase/regionserver/handler/OpenPriorityRegionHandler.java</h3>
+<h3 id="org.apache.hadoop.hbase.rest.model.TableSchemaModel.java">org/apache/hadoop/hbase/rest/model/TableSchemaModel.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'java.util.Iterator' import.</td>
+<td>26</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.HColumnDescriptor' import.</td>
+<td>37</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.protobuf.ProtobufUtil' import.</td>
+<td>42</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'com.fasterxml.jackson.annotation.JsonAnyGetter' import.</td>
+<td>47</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.rest.model.TestScannerModel.java">org/apache/hadoop/hbase/rest/model/TestScannerModel.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'com.fasterxml.jackson.core.JsonParseException' import.</td>
+<td>32</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.rest.model.TestStorageClusterStatusModel.java">org/apache/hadoop/hbase/rest/model/TestStorageClusterStatusModel.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 116).</td>
+<td>47</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 119).</td>
+<td>48</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 111).</td>
+<td>49</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 119).</td>
+<td>50</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 116).</td>
+<td>52</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 111).</td>
+<td>53</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 105).</td>
+<td>54</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.rest.model.VersionModel.java">org/apache/hadoop/hbase/rest/model/VersionModel.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.rest.ProtobufMessageHandler' import.</td>
+<td>30</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.protobuf.ProtobufUtil' import.</td>
+<td>32</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>80</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.rest.provider.JAXBContextResolver.java">org/apache/hadoop/hbase/rest/provider/JAXBContextResolver.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.rest.model.CellModel' import.</td>
+<td>31</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.rest.provider.consumer.ProtobufMessageBodyConsumer.java">org/apache/hadoop/hbase/rest/provider/consumer/ProtobufMessageBodyConsumer.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.rest.Constants' import.</td>
+<td>39</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.rest.provider.producer.PlainTextMessageBodyProducer.java">org/apache/hadoop/hbase/rest/provider/producer/PlainTextMessageBodyProducer.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.rest.Constants' import.</td>
+<td>35</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.rsgroup.IntegrationTestRSGroup.java">org/apache/hadoop/hbase/rsgroup/IntegrationTestRSGroup.java</h3>
 <table border="0" class="table table-striped">
 <tr class="a">
 <th>Severity</th>
@@ -69144,9 +76869,9 @@
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 103).</td>
-<td>36</td></tr></table></div>
+<td>56</td></tr></table></div>
 <div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.handler.OpenRegionHandler.java">org/apache/hadoop/hbase/regionserver/handler/OpenRegionHandler.java</h3>
+<h3 id="org.apache.hadoop.hbase.security.AbstractHBaseSaslRpcClient.java">org/apache/hadoop/hbase/security/AbstractHBaseSaslRpcClient.java</h3>
 <table border="0" class="table table-striped">
 <tr class="a">
 <th>Severity</th>
@@ -69156,189 +76881,51 @@
 <th>Line</th></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 102).</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'java.io.IOException' import.</td>
+<td>22</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.security.token.Token' import.</td>
+<td>39</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
 <td>66</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>196</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.handler.ParallelSeekHandler.java">org/apache/hadoop/hbase/regionserver/handler/ParallelSeekHandler.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.Cell' import.</td>
-<td>27</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.handler.RegionReplicaFlushHandler.java">org/apache/hadoop/hbase/regionserver/handler/RegionReplicaFlushHandler.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method call' child has incorrect indentation level 7, expected level should be 8.</td>
-<td>106</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.handler.WALSplitterHandler.java">org/apache/hadoop/hbase/regionserver/handler/WALSplitterHandler.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.Server' import.</td>
-<td>27</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>72</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>73</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method call' child has incorrect indentation level 10, expected level should be 12.</td>
-<td>74</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>75</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>76</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>77</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>78</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>79</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
 <td>80</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if' has incorrect indentation level 8, expected level should be 10.</td>
-<td>81</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if' child has incorrect indentation level 10, expected level should be 12.</td>
-<td>82</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method call' child has incorrect indentation level 12, expected level should be 14.</td>
-<td>83</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if' child has incorrect indentation level 10, expected level should be 12.</td>
-<td>84</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if rcurly' has incorrect indentation level 8, expected level should be 10.</td>
-<td>85</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>89</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if' has incorrect indentation level 8, expected level should be 10.</td>
-<td>90</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if' child has incorrect indentation level 10, expected level should be 12.</td>
-<td>91</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if rcurly' has incorrect indentation level 8, expected level should be 10.</td>
-<td>93</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>94</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method call' child has incorrect indentation level 10, expected level should be 12.</td>
-<td>95</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>96</td></tr></table></div>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>88</td></tr></table></div>
 <div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.querymatcher.ColumnTracker.java">org/apache/hadoop/hbase/regionserver/querymatcher/ColumnTracker.java</h3>
+<h3 id="org.apache.hadoop.hbase.security.AccessDeniedException.java">org/apache/hadoop/hbase/security/AccessDeniedException.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>ParenPad</td>
+<td>'(' is followed by whitespace.</td>
+<td>36</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.security.AuthMethod.java">org/apache/hadoop/hbase/security/AuthMethod.java</h3>
 <table border="0" class="table table-striped">
 <tr class="a">
 <th>Severity</th>
@@ -69350,283 +76937,16 @@
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.regionserver.ShipperListener' import.</td>
-<td>25</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>117</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>125</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>134</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.querymatcher.CompactionScanQueryMatcher.java">org/apache/hadoop/hbase/regionserver/querymatcher/CompactionScanQueryMatcher.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.filter.Filter' import.</td>
-<td>27</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.querymatcher.DeleteTracker.java">org/apache/hadoop/hbase/regionserver/querymatcher/DeleteTracker.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.Cell' import.</td>
-<td>21</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.querymatcher.DropDeletesCompactionScanQueryMatcher.java">org/apache/hadoop/hbase/regionserver/querymatcher/DropDeletesCompactionScanQueryMatcher.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.regionserver.ScanInfo' import.</td>
-<td>23</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.querymatcher.ExplicitColumnTracker.java">org/apache/hadoop/hbase/regionserver/querymatcher/ExplicitColumnTracker.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.regionserver.querymatcher.ScanQueryMatcher.MatchCode' import.</td>
-<td>28</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.querymatcher.IncludeAllCompactionQueryMatcher.java">org/apache/hadoop/hbase/regionserver/querymatcher/IncludeAllCompactionQueryMatcher.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.regionserver.ScanInfo' import.</td>
-<td>24</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.querymatcher.MajorCompactionScanQueryMatcher.java">org/apache/hadoop/hbase/regionserver/querymatcher/MajorCompactionScanQueryMatcher.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.regionserver.ScanInfo' import.</td>
-<td>25</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.querymatcher.MinorCompactionScanQueryMatcher.java">org/apache/hadoop/hbase/regionserver/querymatcher/MinorCompactionScanQueryMatcher.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.regionserver.ScanInfo' import.</td>
-<td>25</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.querymatcher.NewVersionBehaviorTracker.java">org/apache/hadoop/hbase/regionserver/querymatcher/NewVersionBehaviorTracker.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.KeyValue.Type' import.</td>
-<td>34</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.regionserver.querymatcher.ScanQueryMatcher.MatchCode' import.</td>
-<td>36</td></tr>
+<td>Wrong order for 'org.apache.hadoop.security.UserGroupInformation' import.</td>
+<td>27</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
-<td>Variable 'ts' must be private and have accessor methods.</td>
-<td>110</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>VisibilityModifier</td>
-<td>Variable 'mvcc' must be private and have accessor methods.</td>
-<td>111</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>165</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
-<td>200</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>201</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>203</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
-<td>204</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>205</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>206</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
-<td>209</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>210</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>212</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
-<td>213</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>214</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>215</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
-<td>216</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>217</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>280</td></tr></table></div>
+<td>Variable 'authenticationMethod' must be private and have accessor methods.</td>
+<td>39</td></tr></table></div>
 <div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.querymatcher.NormalUserScanQueryMatcher.java">org/apache/hadoop/hbase/regionserver/querymatcher/NormalUserScanQueryMatcher.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.KeepDeletedCells' import.</td>
-<td>24</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.client.Scan' import.</td>
-<td>26</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.querymatcher.RawScanQueryMatcher.java">org/apache/hadoop/hbase/regionserver/querymatcher/RawScanQueryMatcher.java</h3>
+<h3 id="org.apache.hadoop.hbase.security.CryptoAESUnwrapHandler.java">org/apache/hadoop/hbase/security/CryptoAESUnwrapHandler.java</h3>
 <table border="0" class="table table-striped">
 <tr class="b">
 <th>Severity</th>
@@ -69638,958 +76958,97 @@
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.client.Scan' import.</td>
-<td>24</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.querymatcher.ScanDeleteTracker.java">org/apache/hadoop/hbase/regionserver/querymatcher/ScanDeleteTracker.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.Cell' import.</td>
-<td>26</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.querymatcher.ScanQueryMatcher.java">org/apache/hadoop/hbase/regionserver/querymatcher/ScanQueryMatcher.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>142</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>143</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>275</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 108).</td>
-<td>303</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 107).</td>
-<td>321</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 106).</td>
-<td>333</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.querymatcher.ScanWildcardColumnTracker.java">org/apache/hadoop/hbase/regionserver/querymatcher/ScanWildcardColumnTracker.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.KeyValueUtil' import.</td>
-<td>28</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.regionserver.querymatcher.ScanQueryMatcher.MatchCode' import.</td>
-<td>30</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.querymatcher.StripeCompactionScanQueryMatcher.java">org/apache/hadoop/hbase/regionserver/querymatcher/StripeCompactionScanQueryMatcher.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.regionserver.ScanInfo' import.</td>
-<td>25</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.querymatcher.TestExplicitColumnTracker.java">org/apache/hadoop/hbase/regionserver/querymatcher/TestExplicitColumnTracker.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 10, expected level should be one of the following: 8, 41.</td>
-<td>184</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.querymatcher.TestNewVersionBehaviorTracker.java">org/apache/hadoop/hbase/regionserver/querymatcher/TestNewVersionBehaviorTracker.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.junit.Assert.assertEquals' import.</td>
-<td>21</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.querymatcher.TestScanDeleteTracker.java">org/apache/hadoop/hbase/regionserver/querymatcher/TestScanDeleteTracker.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>AvoidStarImport</td>
-<td>Using the '.*' form of import should be avoided - org.junit.Assert.*.</td>
-<td>20</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.querymatcher.TestUserScanQueryMatcher.java">org/apache/hadoop/hbase/regionserver/querymatcher/TestUserScanQueryMatcher.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>58</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>167</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 45.</td>
-<td>174</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 45.</td>
-<td>175</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 45.</td>
-<td>176</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 45.</td>
-<td>177</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 38.</td>
-<td>186</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 38.</td>
-<td>187</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 38.</td>
-<td>188</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 38.</td>
-<td>189</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 38.</td>
-<td>190</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>211</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 38.</td>
-<td>230</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 38.</td>
-<td>231</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 38.</td>
-<td>232</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 38.</td>
-<td>233</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 38.</td>
-<td>234</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.querymatcher.UserScanQueryMatcher.java">org/apache/hadoop/hbase/regionserver/querymatcher/UserScanQueryMatcher.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.KeyValueUtil' import.</td>
-<td>26</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.client.Scan' import.</td>
-<td>28</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.snapshot.FlushSnapshotSubprocedure.java">org/apache/hadoop/hbase/regionserver/snapshot/FlushSnapshotSubprocedure.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.client.IsolationLevel' import.</td>
-<td>28</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.snapshot.ClientSnapshotDescriptionUtils' import.</td>
-<td>38</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.snapshot.RegionServerSnapshotManager.java">org/apache/hadoop/hbase/regionserver/snapshot/RegionServerSnapshotManager.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.client.RegionReplicaUtil' import.</td>
-<td>42</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.snapshot.SnapshotCreationException' import.</td>
-<td>57</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 101).</td>
-<td>81</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 102).</td>
-<td>95</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'ctor def modifier' has incorrect indentation level 3, expected level should be 2.</td>
-<td>110</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>131</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>152</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
-<td>187</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>188</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>190</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
-<td>192</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
-<td>205</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>206</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>220</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>223</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>313</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>358</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>EmptyBlock</td>
-<td>Must have at least one statement.</td>
-<td>373</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>381</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.throttle.CompactionThroughputControllerFactory.java">org/apache/hadoop/hbase/regionserver/throttle/CompactionThroughputControllerFactory.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.regionserver.RegionServerServices' import.</td>
-<td>25</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.throttle.FlushThroughputControllerFactory.java">org/apache/hadoop/hbase/regionserver/throttle/FlushThroughputControllerFactory.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.regionserver.RegionServerServices' import.</td>
-<td>25</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.throttle.NoLimitThroughputController.java">org/apache/hadoop/hbase/regionserver/throttle/NoLimitThroughputController.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.regionserver.RegionServerServices' import.</td>
-<td>22</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.throttle.PressureAwareCompactionThroughputController.java">org/apache/hadoop/hbase/regionserver/throttle/PressureAwareCompactionThroughputController.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.regionserver.RegionServerServices' import.</td>
-<td>26</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.throttle.PressureAwareFlushThroughputController.java">org/apache/hadoop/hbase/regionserver/throttle/PressureAwareFlushThroughputController.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.regionserver.RegionServerServices' import.</td>
-<td>26</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.throttle.PressureAwareThroughputController.java">org/apache/hadoop/hbase/regionserver/throttle/PressureAwareThroughputController.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.regionserver.RegionServerServices' import.</td>
-<td>29</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 102).</td>
-<td>80</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.throttle.ThroughputController.java">org/apache/hadoop/hbase/regionserver/throttle/ThroughputController.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.regionserver.RegionServerServices' import.</td>
-<td>23</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.wal.AbstractFSWAL.java">org/apache/hadoop/hbase/regionserver/wal/AbstractFSWAL.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>VisibilityModifier</td>
-<td>Variable 'encodedName2HighestSequenceId' must be private and have accessor methods.</td>
-<td>277</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>933</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>934</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>935</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>936</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.wal.AbstractProtobufLogWriter.java">org/apache/hadoop/hbase/regionserver/wal/AbstractProtobufLogWriter.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.codec.Codec' import.</td>
-<td>39</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.util.CommonFSUtils.StreamLacksCapabilityException' import.</td>
-<td>49</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>coding</td>
-<td>InnerAssignment</td>
-<td>Inner assignments should be avoided.</td>
-<td>230</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.wal.AbstractTestFSWAL.java">org/apache/hadoop/hbase/regionserver/wal/AbstractTestFSWAL.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>178</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>179</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>189</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>247</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>356</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.wal.AbstractTestLogRolling.java">org/apache/hadoop/hbase/regionserver/wal/AbstractTestLogRolling.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 106).</td>
-<td>196</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>293</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>294</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.wal.AbstractTestProtobufLog.java">org/apache/hadoop/hbase/regionserver/wal/AbstractTestProtobufLog.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>89</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>106</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.wal.AbstractTestWALReplay.java">org/apache/hadoop/hbase/regionserver/wal/AbstractTestWALReplay.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>187</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>266</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>331</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>332</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>333</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>334</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>335</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>339</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>397</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>398</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>399</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>400</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>401</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>467</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>468</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>469</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>470</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>471</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>475</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>575</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>576</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>577</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>578</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>579</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>583</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>666</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>752</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>754</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>764</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def modifier' has incorrect indentation level 3, expected level should be 2.</td>
-<td>1194</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def rcurly' has incorrect indentation level 3, expected level should be 2.</td>
-<td>1196</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.wal.CompressionContext.java">org/apache/hadoop/hbase/regionserver/wal/CompressionContext.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.io.TagCompressionContext' import.</td>
-<td>28</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.wal.Compressor.java">org/apache/hadoop/hbase/regionserver/wal/Compressor.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
+<td>Wrong order for 'org.apache.yetus.audience.InterfaceAudience' import.</td>
 <td>25</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.wal.WAL' import.</td>
-<td>36</td></tr>
+<td>Wrong order for 'org.apache.hadoop.hbase.io.crypto.aes.CryptoAES' import.</td>
+<td>26</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.security.CryptoAESWrapHandler.java">org/apache/hadoop/hbase/security/CryptoAESWrapHandler.java</h3>
+<table border="0" class="table table-striped">
 <tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.yetus.audience.InterfaceAudience' import.</td>
+<td>30</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.io.crypto.aes.CryptoAES' import.</td>
+<td>31</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.security.EncryptionUtil.java">org/apache/hadoop/hbase/security/EncryptionUtil.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.client.ColumnFamilyDescriptor' import.</td>
+<td>37</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.io.crypto.aes.CryptoAES' import.</td>
+<td>43</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>69</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>123</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>124</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.security.HBaseKerberosUtils.java">org/apache/hadoop/hbase/security/HBaseKerberosUtils.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.security.UserGroupInformation' import.</td>
+<td>37</td></tr>
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
 <td>Utility classes should not have a public or default constructor.</td>
-<td>44</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'while' construct must use '{}'s.</td>
-<td>88</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>annotation</td>
-<td>MissingDeprecated</td>
-<td>Must include both @java.lang.Deprecated annotation and @deprecated Javadoc tag with description.</td>
-<td>105</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>115</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>annotation</td>
-<td>MissingDeprecated</td>
-<td>Must include both @java.lang.Deprecated annotation and @deprecated Javadoc tag with description.</td>
-<td>142</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>annotation</td>
-<td>MissingDeprecated</td>
-<td>Must include both @java.lang.Deprecated annotation and @deprecated Javadoc tag with description.</td>
-<td>181</td></tr></table></div>
+<td>39</td></tr></table></div>
 <div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.wal.FSHLog.java">org/apache/hadoop/hbase/regionserver/wal/FSHLog.java</h3>
+<h3 id="org.apache.hadoop.hbase.security.HBasePolicyProvider.java">org/apache/hadoop/hbase/security/HBasePolicyProvider.java</h3>
 <table border="0" class="table table-striped">
 <tr class="a">
 <th>Severity</th>
@@ -70599,123 +77058,156 @@
 <th>Line</th></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 115).</td>
-<td>246</td></tr>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
+<td>21</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>coding</td>
-<td>InnerAssignment</td>
-<td>Inner assignments should be avoided.</td>
-<td>513</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 105).</td>
-<td>730</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 110).</td>
-<td>809</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 107).</td>
-<td>811</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 112).</td>
-<td>996</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 102).</td>
-<td>997</td></tr></table></div>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.security.authorize.PolicyProvider' import.</td>
+<td>26</td></tr></table></div>
 <div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.wal.FailedLogCloseException.java">org/apache/hadoop/hbase/regionserver/wal/FailedLogCloseException.java</h3>
+<h3 id="org.apache.hadoop.hbase.security.HBaseSaslRpcClient.java">org/apache/hadoop/hbase/security/HBaseSaslRpcClient.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>38</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.wal.FailedSyncBeforeLogCloseException.java">org/apache/hadoop/hbase/regionserver/wal/FailedSyncBeforeLogCloseException.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>36</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.wal.InstrumentedLogWriter.java">org/apache/hadoop/hbase/regionserver/wal/InstrumentedLogWriter.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
-<td>40</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if' has incorrect indentation level 6, expected level should be 4.</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.io.crypto.aes.CryptoAES' import.</td>
+<td>39</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.io.WritableUtils' import.</td>
 <td>41</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>43</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>44</td></tr>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>89</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if rcurly' has incorrect indentation level 6, expected level should be 4.</td>
-<td>46</td></tr>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>188</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def rcurly' has incorrect indentation level 4, expected level should be 2.</td>
-<td>47</td></tr></table></div>
+<td>misc</td>
+<td>ArrayTypeStyle</td>
+<td>Array brackets at illegal position.</td>
+<td>215</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>251</td></tr></table></div>
 <div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.wal.MetricsWAL.java">org/apache/hadoop/hbase/regionserver/wal/MetricsWAL.java</h3>
+<h3 id="org.apache.hadoop.hbase.security.HBaseSaslRpcServer.java">org/apache/hadoop/hbase/security/HBaseSaslRpcServer.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.security.UserGroupInformation' import.</td>
+<td>40</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.security.HadoopSecurityEnabledUserProviderForTesting.java">org/apache/hadoop/hbase/security/HadoopSecurityEnabledUserProviderForTesting.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>RedundantImport</td>
+<td>Redundant import from the same package - org.apache.hadoop.hbase.security.UserProvider.</td>
+<td>20</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.security.NettyHBaseRpcConnectionHeaderHandler.java">org/apache/hadoop/hbase/security/NettyHBaseRpcConnectionHeaderHandler.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
+<td>27</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.io.crypto.aes.CryptoAES' import.</td>
+<td>29</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.security.NettyHBaseSaslRpcClient.java">org/apache/hadoop/hbase/security/NettyHBaseSaslRpcClient.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'java.io.IOException' import.</td>
+<td>23</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.security.token.Token' import.</td>
+<td>30</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.security.NettyHBaseSaslRpcClientHandler.java">org/apache/hadoop/hbase/security/NettyHBaseSaslRpcClientHandler.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'java.io.IOException' import.</td>
+<td>26</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.ipc.FallbackDisallowedException' import.</td>
+<td>33</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.security.SaslChallengeDecoder.java">org/apache/hadoop/hbase/security/SaslChallengeDecoder.java</h3>
 <table border="0" class="table table-striped">
 <tr class="b">
 <th>Severity</th>
@@ -70733,16 +77225,31 @@
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.wal.WALEdit' import.</td>
-<td>29</td></tr>
+<td>Wrong order for 'org.apache.hadoop.ipc.RemoteException' import.</td>
+<td>29</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.security.SaslStatus.java">org/apache/hadoop/hbase/security/SaslStatus.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>MethodParamPad</td>
+<td>'(' is preceded with whitespace.</td>
+<td>26</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.CompatibilitySingletonFactory' import.</td>
-<td>31</td></tr></table></div>
+<td>whitespace</td>
+<td>MethodParamPad</td>
+<td>'(' is preceded with whitespace.</td>
+<td>27</td></tr></table></div>
 <div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.wal.ProtobufLogReader.java">org/apache/hadoop/hbase/regionserver/wal/ProtobufLogReader.java</h3>
+<h3 id="org.apache.hadoop.hbase.security.SaslUnwrapHandler.java">org/apache/hadoop/hbase/security/SaslUnwrapHandler.java</h3>
 <table border="0" class="table table-striped">
 <tr class="b">
 <th>Severity</th>
@@ -70754,233 +77261,389 @@
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.fs.FileSystem' import.</td>
-<td>31</td></tr>
+<td>Wrong order for 'javax.security.sasl.SaslClient' import.</td>
+<td>25</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.security.SaslUtil.java">org/apache/hadoop/hbase/security/SaslUtil.java</h3>
+<table border="0" class="table table-striped">
 <tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.fs.FSDataInputStream' import.</td>
-<td>32</td></tr>
+<td>design</td>
+<td>HideUtilityClassConstructor</td>
+<td>Utility classes should not have a public or default constructor.</td>
+<td>36</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.security.SecurityInfo.java">org/apache/hadoop/hbase/security/SecurityInfo.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.HBaseInterfaceAudience' import.</td>
-<td>34</td></tr>
+<td>Wrong order for 'org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos' import.</td>
+<td>25</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.util.Bytes' import.</td>
-<td>40</td></tr>
+<td>Wrong order for 'org.apache.yetus.audience.InterfaceAudience' import.</td>
+<td>29</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.security.SecurityUtil.java">org/apache/hadoop/hbase/security/SecurityUtil.java</h3>
+<table border="0" class="table table-striped">
 <tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
-<td>187</td></tr>
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def' child has incorrect indentation level 5, expected level should be 4.</td>
-<td>192</td></tr>
+<td>design</td>
+<td>HideUtilityClassConstructor</td>
+<td>Utility classes should not have a public or default constructor.</td>
+<td>27</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.security.Superusers.java">org/apache/hadoop/hbase/security/Superusers.java</h3>
+<table border="0" class="table table-striped">
 <tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>193</td></tr>
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if' has incorrect indentation level 5, expected level should be 4.</td>
-<td>193</td></tr>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>84</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.security.TestSecureIPC.java">org/apache/hadoop/hbase/security/TestSecureIPC.java</h3>
+<table border="0" class="table table-striped">
 <tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if' has incorrect indentation level 5, expected level should be 4.</td>
-<td>194</td></tr>
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if' child has incorrect indentation level 7, expected level should be 6.</td>
-<td>196</td></tr>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>190</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if rcurly' has incorrect indentation level 5, expected level should be 4.</td>
-<td>197</td></tr>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>220</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def' child has incorrect indentation level 5, expected level should be 4.</td>
-<td>198</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if' has incorrect indentation level 5, expected level should be 4.</td>
-<td>199</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if' child has incorrect indentation level 7, expected level should be 6.</td>
-<td>200</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if rcurly' has incorrect indentation level 5, expected level should be 4.</td>
-<td>201</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def' child has incorrect indentation level 5, expected level should be 4.</td>
-<td>202</td></tr>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>231</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
-<td>Line is longer than 100 characters (found 194).</td>
-<td>238</td></tr>
+<td>Line is longer than 100 characters (found 108).</td>
+<td>276</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>misc</td>
+<td>ArrayTypeStyle</td>
+<td>Array brackets at illegal position.</td>
+<td>284</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.security.TestUser.java">org/apache/hadoop/hbase/security/TestUser.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>AvoidStarImport</td>
+<td>Using the '.*' form of import should be avoided - org.junit.Assert.*.</td>
+<td>20</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.security.TestUsersOperationsWithSecureHadoop.java">org/apache/hadoop/hbase/security/TestUsersOperationsWithSecureHadoop.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>261</td></tr>
+<td>93</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.security.User.java">org/apache/hadoop/hbase/security/User.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>182</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>184</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'class def modifier' has incorrect indentation level 3, expected level should be 2.</td>
+<td>295</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>266</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>449</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.wal.ReaderBase.java">org/apache/hadoop/hbase/regionserver/wal/ReaderBase.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'else' construct must use '{}'s.</td>
-<td>106</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.wal.SecureProtobufLogReader.java">org/apache/hadoop/hbase/regionserver/wal/SecureProtobufLogReader.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.fs.FSDataInputStream' import.</td>
-<td>30</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.security.EncryptionUtil' import.</td>
-<td>37</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.wal.SecureProtobufLogWriter.java">org/apache/hadoop/hbase/regionserver/wal/SecureProtobufLogWriter.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.io.crypto.Encryptor' import.</td>
-<td>26</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.wal.SecureWALCellCodec.java">org/apache/hadoop/hbase/regionserver/wal/SecureWALCellCodec.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
-<td>29</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.KeyValue' import.</td>
-<td>32</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.wal.SequenceIdAccounting.java">org/apache/hadoop/hbase/regionserver/wal/SequenceIdAccounting.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>113</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>115</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>128</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>129</td></tr>
+<td>317</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>158</td></tr>
+<td>371</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>373</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.security.access.AccessControlClient.java">org/apache/hadoop/hbase/security/access/AccessControlClient.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>design</td>
+<td>HideUtilityClassConstructor</td>
+<td>Utility classes should not have a public or default constructor.</td>
+<td>44</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>53</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>64</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>82</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>83</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>84</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>85</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>89</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>90</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 102).</td>
+<td>93</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 118).</td>
+<td>102</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>104</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>105</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>106</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>107</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>108</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>109</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>118</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>119</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>120</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>124</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>125</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 111).</td>
+<td>136</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>139</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>140</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>141</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>142</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>151</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>152</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>156</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>157</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 107).</td>
+<td>168</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
@@ -71004,1707 +77667,75 @@
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>244</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>266</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>267</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>268</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>269</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.wal.TestLogRolling.java">org/apache/hadoop/hbase/regionserver/wal/TestLogRolling.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>MethodLength</td>
-<td>Method length is 164 lines (max allowed is 150).</td>
-<td>106</td></tr>
+<td>173</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>411</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>518</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>560</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.wal.TestLogRollingNoCluster.java">org/apache/hadoop/hbase/regionserver/wal/TestLogRollingNoCluster.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>80</td></tr>
+<td>190</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>81</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>175</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'else' construct must use '{}'s.</td>
-<td>177</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.wal.TestWALConfiguration.java">org/apache/hadoop/hbase/regionserver/wal/TestWALConfiguration.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'java.io.IOException' import.</td>
-<td>41</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.junit.Assert.assertEquals' import.</td>
-<td>44</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.wal.WALActionsListener.java">org/apache/hadoop/hbase/regionserver/wal/WALActionsListener.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
+<td>191</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>93</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>118</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.wal.WALCellCodec.java">org/apache/hadoop/hbase/regionserver/wal/WALCellCodec.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.KeyValue' import.</td>
-<td>29</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.codec.BaseDecoder' import.</td>
-<td>32</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization lcurly' has incorrect indentation level 8, expected level should be one of the following: 4, 6.</td>
-<td>107</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization lcurly' has incorrect indentation level 8, expected level should be one of the following: 4, 6.</td>
-<td>125</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>210</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.wal.WALCoprocessorHost.java">org/apache/hadoop/hbase/regionserver/wal/WALCoprocessorHost.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>FinalClass</td>
-<td>Class WALEnvironment should be declared as final.</td>
-<td>55</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.regionserver.wal.WALUtil.java">org/apache/hadoop/hbase/regionserver/wal/WALUtil.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>FinalClass</td>
-<td>Class WALUtil should be declared as final.</td>
-<td>53</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>73</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>105</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>142</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>160</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.replication.BaseReplicationEndpoint.java">org/apache/hadoop/hbase/replication/BaseReplicationEndpoint.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 101).</td>
-<td>54</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 106).</td>
-<td>62</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 111).</td>
-<td>81</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.replication.BulkLoadCellFilter.java">org/apache/hadoop/hbase/replication/BulkLoadCellFilter.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 114).</td>
-<td>43</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.replication.ClusterMarkingEntryFilter.java">org/apache/hadoop/hbase/replication/ClusterMarkingEntryFilter.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.wal.WALEdit' import.</td>
-<td>26</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.wal.WAL.Entry' import.</td>
-<td>28</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 113).</td>
-<td>47</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.replication.HBaseReplicationEndpoint.java">org/apache/hadoop/hbase/replication/HBaseReplicationEndpoint.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.Abortable' import.</td>
-<td>29</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>64</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>133</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.replication.ReplicationEndpoint.java">org/apache/hadoop/hbase/replication/ReplicationEndpoint.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
-<td>29</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.replication.regionserver.MetricsSource' import.</td>
-<td>35</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>197</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.replication.ReplicationException.java">org/apache/hadoop/hbase/replication/ReplicationException.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.exceptions.HBaseException' import.</td>
-<td>21</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.replication.SystemTableWALEntryFilter.java">org/apache/hadoop/hbase/replication/SystemTableWALEntryFilter.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.wal.WAL.Entry' import.</td>
-<td>22</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.replication.TestMasterReplication.java">org/apache/hadoop/hbase/replication/TestMasterReplication.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 14, expected level should be one of the following: 12, 27.</td>
-<td>231</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 10, expected level should be one of the following: 8, 37.</td>
-<td>242</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 10, expected level should be one of the following: 8, 44.</td>
-<td>245</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 14, expected level should be one of the following: 12, 27.</td>
-<td>345</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 10, expected level should be one of the following: 8, 37.</td>
-<td>365</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 10, expected level should be one of the following: 8, 44.</td>
-<td>369</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 14, expected level should be one of the following: 12, 27.</td>
-<td>401</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 10, expected level should be one of the following: 8, 37.</td>
-<td>411</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def modifier' has incorrect indentation level 10, expected level should be one of the following: 6, 8.</td>
-<td>695</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def' child has incorrect indentation level 12, expected level should be one of the following: 8, 10.</td>
-<td>697</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def rcurly' has incorrect indentation level 10, expected level should be one of the following: 6, 8.</td>
-<td>698</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'object def rcurly' has incorrect indentation level 8, expected level should be one of the following: 4, 6.</td>
-<td>699</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.replication.TestMultiSlaveReplication.java">org/apache/hadoop/hbase/replication/TestMultiSlaveReplication.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def modifier' has incorrect indentation level 10, expected level should be one of the following: 6, 8.</td>
-<td>227</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def' child has incorrect indentation level 12, expected level should be one of the following: 8, 10.</td>
-<td>229</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def rcurly' has incorrect indentation level 10, expected level should be one of the following: 6, 8.</td>
-<td>230</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'object def rcurly' has incorrect indentation level 8, expected level should be one of the following: 4, 6.</td>
-<td>231</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>283</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>310</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.replication.TestPerTableCFReplication.java">org/apache/hadoop/hbase/replication/TestPerTableCFReplication.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>AvoidStarImport</td>
-<td>Using the '.*' form of import should be avoided - org.junit.Assert.*.</td>
-<td>20</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def rcurly' has incorrect indentation level 1, expected level should be 2.</td>
-<td>278</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>MethodLength</td>
-<td>Method length is 157 lines (max allowed is 150).</td>
-<td>373</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.replication.TestReplicationDisableInactivePeer.java">org/apache/hadoop/hbase/replication/TestReplicationDisableInactivePeer.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
+<td>192</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>53</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.replication.TestReplicationKillMasterRSCompressed.java">org/apache/hadoop/hbase/replication/TestReplicationKillMasterRSCompressed.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>40</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.replication.TestVerifyReplication.java">org/apache/hadoop/hbase/replication/TestVerifyReplication.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 26.</td>
-<td>410</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 26.</td>
-<td>415</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be one of the following: 6, 26.</td>
-<td>416</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.replication.WALCellFilter.java">org/apache/hadoop/hbase/replication/WALCellFilter.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.wal.WAL.Entry' import.</td>
-<td>23</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>37</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.replication.WALEntryFilter.java">org/apache/hadoop/hbase/replication/WALEntryFilter.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.HBaseInterfaceAudience' import.</td>
-<td>21</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>33</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.replication.master.ReplicationLogCleaner.java">org/apache/hadoop/hbase/replication/master/ReplicationLogCleaner.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>128</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.replication.regionserver.DumpReplicationQueues.java">org/apache/hadoop/hbase/replication/regionserver/DumpReplicationQueues.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 105).</td>
-<td>68</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>MethodParamPad</td>
-<td>'(' is preceded with whitespace.</td>
-<td>101</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>MethodParamPad</td>
-<td>'(' is preceded with whitespace.</td>
-<td>109</td></tr>
+<td>193</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>151</td></tr>
+<td>194</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>152</td></tr>
+<td>195</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 101).</td>
-<td>272</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.replication.regionserver.MetricsSink.java">org/apache/hadoop/hbase/replication/regionserver/MetricsSink.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.CompatibilitySingletonFactory' import.</td>
-<td>22</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>67</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.replication.regionserver.MetricsSource.java">org/apache/hadoop/hbase/replication/regionserver/MetricsSource.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.CompatibilitySingletonFactory' import.</td>
-<td>27</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 124).</td>
-<td>64</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.replication.regionserver.Replication.java">org/apache/hadoop/hbase/replication/regionserver/Replication.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>197</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>210</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.replication.regionserver.ReplicationLoad.java">org/apache/hadoop/hbase/replication/regionserver/ReplicationLoad.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'java.util.ArrayList' import.</td>
-<td>23</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>52</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>130</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.replication.regionserver.ReplicationSink.java">org/apache/hadoop/hbase/replication/regionserver/ReplicationSink.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def rcurly' has incorrect indentation level 3, expected level should be 2.</td>
-<td>154</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>169</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>335</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>336</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>351</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>352</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>353</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>354</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 106).</td>
-<td>357</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>433</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.replication.regionserver.ReplicationSourceFactory.java">org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceFactory.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.replication.ReplicationQueueInfo' import.</td>
-<td>25</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>HideUtilityClassConstructor</td>
-<td>Utility classes should not have a public or default constructor.</td>
-<td>30</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.replication.regionserver.ReplicationSourceInterface.java">org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceInterface.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>169</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.replication.regionserver.ReplicationSourceManager.java">org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceManager.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>176</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>177</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>183</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.replication.regionserver.ReplicationThrottler.java">org/apache/hadoop/hbase/replication/regionserver/ReplicationThrottler.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.util.EnvironmentEdgeManager' import.</td>
-<td>21</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>105</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.replication.regionserver.TestGlobalReplicationThrottler.java">org/apache/hadoop/hbase/replication/regionserver/TestGlobalReplicationThrottler.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 102).</td>
-<td>144</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 102).</td>
-<td>145</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 101).</td>
-<td>146</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.replication.regionserver.TestReplicationSink.java">org/apache/hadoop/hbase/replication/regionserver/TestReplicationSink.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>124</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>142</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>151</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>161</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>179</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>207</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>ParenPad</td>
-<td>'(' is followed by whitespace.</td>
-<td>214</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>229</td></tr>
+<td>208</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>257</td></tr>
+<td>209</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>409</td></tr>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>210</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>412</td></tr></table></div>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>235</td></tr></table></div>
 <div class="section">
-<h3 id="org.apache.hadoop.hbase.replication.regionserver.TestReplicationSource.java">org/apache/hadoop/hbase/replication/regionserver/TestReplicationSource.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>RedundantImport</td>
-<td>Redundant import from the same package - org.apache.hadoop.hbase.replication.regionserver.HBaseInterClusterReplicationEndpoint.</td>
-<td>51</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>RedundantImport</td>
-<td>Redundant import from the same package - org.apache.hadoop.hbase.replication.regionserver.RecoveredReplicationSource.</td>
-<td>52</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>RedundantImport</td>
-<td>Redundant import from the same package - org.apache.hadoop.hbase.replication.regionserver.RecoveredReplicationSourceShipper.</td>
-<td>53</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>RedundantImport</td>
-<td>Redundant import from the same package - org.apache.hadoop.hbase.replication.regionserver.Replication.</td>
-<td>54</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>RedundantImport</td>
-<td>Redundant import from the same package - org.apache.hadoop.hbase.replication.regionserver.ReplicationSource.</td>
-<td>55</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>RedundantImport</td>
-<td>Redundant import from the same package - org.apache.hadoop.hbase.replication.regionserver.ReplicationSourceManager.</td>
-<td>56</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>99</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>101</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>119</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>120</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.replication.regionserver.TestReplicationSourceManager.java">org/apache/hadoop/hbase/replication/regionserver/TestReplicationSourceManager.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 102).</td>
-<td>305</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>705</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>706</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.replication.regionserver.TestWALEntrySinkFilter.java">org/apache/hadoop/hbase/replication/regionserver/TestWALEntrySinkFilter.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>105</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.replication.regionserver.TestWALEntryStream.java">org/apache/hadoop/hbase/replication/regionserver/TestWALEntryStream.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'lambda arguments' has incorrect indentation level 8, expected level should be 6.</td>
-<td>631</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.replication.regionserver.WALEntrySinkFilter.java">org/apache/hadoop/hbase/replication/regionserver/WALEntrySinkFilter.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>37</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.replication.regionserver.WALEntryStream.java">org/apache/hadoop/hbase/replication/regionserver/WALEntryStream.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>82</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>368</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.rest.ExistsResource.java">org/apache/hadoop/hbase/rest/ExistsResource.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'javax.ws.rs.core.Response.ResponseBuilder' import.</td>
-<td>30</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>48</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>49</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.rest.HBaseRESTTestingUtility.java">org/apache/hadoop/hbase/rest/HBaseRESTTestingUtility.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>55</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'try' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>56</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'try' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>57</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'try' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>58</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'try rcurly' has incorrect indentation level 4, expected level should be 6.</td>
-<td>59</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'catch' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>60</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'catch rcurly' has incorrect indentation level 4, expected level should be 6.</td>
-<td>61</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.rest.MetricsREST.java">org/apache/hadoop/hbase/rest/MetricsREST.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.CompatibilitySingletonFactory' import.</td>
-<td>23</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>RedundantImport</td>
-<td>Redundant import from the same package - org.apache.hadoop.hbase.rest.MetricsRESTSource.</td>
-<td>25</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'ctor def' child has incorrect indentation level 5, expected level should be 4.</td>
-<td>37</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.rest.MultiRowResource.java">org/apache/hadoop/hbase/rest/MultiRowResource.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>51</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>52</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>53</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.rest.NamespacesInstanceResource.java">org/apache/hadoop/hbase/rest/NamespacesInstanceResource.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>66</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>74</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>87</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.rest.NamespacesResource.java">org/apache/hadoop/hbase/rest/NamespacesResource.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.rest.model.NamespacesModel' import.</td>
-<td>36</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>51</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.rest.PerformanceEvaluation.java">org/apache/hadoop/hbase/rest/PerformanceEvaluation.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.ArrayBackedTag' import.</td>
-<td>51</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>217</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if' child has incorrect indentation level 10, expected level should be 12.</td>
-<td>357</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def' child has incorrect indentation level 11, expected level should be one of the following: 10, 12.</td>
-<td>500</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>MethodParamPad</td>
-<td>'(' is preceded with whitespace.</td>
-<td>539</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>571</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>591</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>MethodParamPad</td>
-<td>'(' is preceded with whitespace.</td>
-<td>621</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'&quot;, startRow=&quot;' has incorrect indentation level 10, expected level should be 12.</td>
-<td>738</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'&quot;, perClientRunRows=&quot;' has incorrect indentation level 10, expected level should be 12.</td>
-<td>739</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'&quot;, totalRows=&quot;' has incorrect indentation level 10, expected level should be 12.</td>
-<td>740</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'&quot;, clients=&quot;' has incorrect indentation level 10, expected level should be 12.</td>
-<td>741</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'&quot;, flushCommits=&quot;' has incorrect indentation level 10, expected level should be 12.</td>
-<td>742</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'&quot;, writeToWAL=&quot;' has incorrect indentation level 10, expected level should be 12.</td>
-<td>743</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'&quot;, useTags=&quot;' has incorrect indentation level 10, expected level should be 12.</td>
-<td>744</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'&quot;, noOfTags=&quot;' has incorrect indentation level 10, expected level should be 12.</td>
-<td>745</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>coding</td>
-<td>InnerAssignment</td>
-<td>Inner assignments should be avoided.</td>
-<td>1031</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>EmptyBlock</td>
-<td>Must have at least one statement.</td>
-<td>1236</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>1239</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>1307</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1558</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.rest.ProtobufMessageHandler.java">org/apache/hadoop/hbase/rest/ProtobufMessageHandler.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>42</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.rest.RESTServer.java">org/apache/hadoop/hbase/rest/RESTServer.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'java.util.EnumSet' import.</td>
-<td>25</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider' import.</td>
-<td>28</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
-<td>31</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.http.HttpServerUtil' import.</td>
-<td>41</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.eclipse.jetty.http.HttpVersion' import.</td>
-<td>54</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.eclipse.jetty.server.HttpConnectionFactory' import.</td>
-<td>56</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.eclipse.jetty.server.HttpConfiguration' import.</td>
-<td>58</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.eclipse.jetty.server.SecureRequestCustomizer' import.</td>
-<td>60</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.eclipse.jetty.servlet.ServletContextHandler' import.</td>
-<td>62</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.eclipse.jetty.jmx.MBeanContainer' import.</td>
-<td>65</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'javax.servlet.DispatcherType' import.</td>
-<td>73</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>VisibilityModifier</td>
-<td>Variable 'conf' must be private and have accessor methods.</td>
-<td>109</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>EmptyBlock</td>
-<td>Must have at least one statement.</td>
-<td>223</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 101).</td>
-<td>261</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 104).</td>
-<td>263</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 110).</td>
-<td>338</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.rest.RESTServlet.java">org/apache/hadoop/hbase/rest/RESTServlet.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.client.Admin' import.</td>
-<td>27</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>76</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>97</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>155</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>156</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.rest.RegionsResource.java">org/apache/hadoop/hbase/rest/RegionsResource.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'java.io.IOException' import.</td>
-<td>29</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>61</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>62</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.rest.ResultGenerator.java">org/apache/hadoop/hbase/rest/ResultGenerator.java</h3>
+<h3 id="org.apache.hadoop.hbase.security.access.AccessControlFilter.java">org/apache/hadoop/hbase/security/access/AccessControlFilter.java</h3>
 <table border="0" class="table table-striped">
 <tr class="b">
 <th>Severity</th>
@@ -72717,9 +77748,21 @@
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.Cell' import.</td>
-<td>26</td></tr></table></div>
+<td>26</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>168</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>172</td></tr></table></div>
 <div class="section">
-<h3 id="org.apache.hadoop.hbase.rest.RootResource.java">org/apache/hadoop/hbase/rest/RootResource.java</h3>
+<h3 id="org.apache.hadoop.hbase.security.access.AccessControlUtil.java">org/apache/hadoop/hbase/security/access/AccessControlUtil.java</h3>
 <table border="0" class="table table-striped">
 <tr class="b">
 <th>Severity</th>
@@ -72731,343 +77774,778 @@
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
-<td>Wrong order for 'javax.ws.rs.core.Response.ResponseBuilder' import.</td>
-<td>32</td></tr>
+<td>Wrong order for 'org.apache.hadoop.hbase.protobuf.ProtobufUtil' import.</td>
+<td>30</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.TableName' import.</td>
-<td>37</td></tr>
+<td>Wrong order for 'com.google.protobuf.ByteString' import.</td>
+<td>39</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>55</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.rest.RowResource.java">org/apache/hadoop/hbase/rest/RowResource.java</h3>
-<table border="0" class="table table-striped">
+<td>design</td>
+<td>FinalClass</td>
+<td>Class AccessControlUtil should be declared as final.</td>
+<td>46</td></tr>
 <tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
+<td>389</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>76</td></tr>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>390</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
+<td>391</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>392</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
+<td>393</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>394</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
+<td>395</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>396</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
+<td>397</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>398</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
+<td>412</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>413</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
+<td>414</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>415</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
+<td>416</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>417</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
+<td>418</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>419</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
+<td>420</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>421</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>77</td></tr>
+<td>492</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 110).</td>
+<td>497</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 105).</td>
+<td>504</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>78</td></tr>
+<td>521</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>79</td></tr>
+<td>549</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>80</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>81</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>227</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'try' child has incorrect indentation level 12, expected level should be 14.</td>
-<td>228</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'try rcurly' has incorrect indentation level 10, expected level should be 12.</td>
-<td>229</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'catch' child has incorrect indentation level 12, expected level should be 14.</td>
-<td>230</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'catch rcurly' has incorrect indentation level 10, expected level should be 12.</td>
-<td>231</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>267</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'try' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>268</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'try rcurly' has incorrect indentation level 6, expected level should be 8.</td>
-<td>269</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'catch' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>270</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'catch rcurly' has incorrect indentation level 6, expected level should be 8.</td>
-<td>271</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>misc</td>
-<td>ArrayTypeStyle</td>
-<td>Array brackets at illegal position.</td>
-<td>313</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>338</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'try' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>339</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'try rcurly' has incorrect indentation level 6, expected level should be 8.</td>
-<td>340</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'catch' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>341</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'catch rcurly' has incorrect indentation level 6, expected level should be 8.</td>
-<td>342</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>403</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'else' construct must use '{}'s.</td>
-<td>405</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>444</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'try' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>445</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'try rcurly' has incorrect indentation level 6, expected level should be 8.</td>
-<td>446</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'catch' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>447</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'catch rcurly' has incorrect indentation level 6, expected level should be 8.</td>
-<td>448</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 116).</td>
 <td>561</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>670</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'try' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>562</td></tr>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>701</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>720</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>761</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>777</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>817</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
-<td>'try rcurly' has incorrect indentation level 6, expected level should be 8.</td>
-<td>563</td></tr>
+<td>'method call' child has incorrect indentation level 4, expected level should be 6.</td>
+<td>915</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.security.access.AccessController.java">org/apache/hadoop/hbase/security/access/AccessController.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.util.ByteRange' import.</td>
+<td>129</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
-<td>'catch' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>'catch' child has incorrect indentation level 10, expected level should be 6.</td>
+<td>296</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>308</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>449</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>MethodLength</td>
+<td>Method length is 166 lines (max allowed is 150).</td>
+<td>451</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
 <td>564</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'catch rcurly' has incorrect indentation level 6, expected level should be 8.</td>
-<td>565</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>691</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'try' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>692</td></tr>
+<td>809</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'try rcurly' has incorrect indentation level 6, expected level should be 8.</td>
-<td>693</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'catch' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>694</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'catch rcurly' has incorrect indentation level 6, expected level should be 8.</td>
-<td>695</td></tr>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1044</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
-<td>714</td></tr>
+<td>1140</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
+<td>1313</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
+<td>1314</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>1315</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>1316</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
+<td>1317</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>1318</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>1319</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
+<td>1320</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>1321</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1938</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>1942</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1951</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>1955</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.security.access.AuthResult.java">org/apache/hadoop/hbase/security/access/AuthResult.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.Cell' import.</td>
+<td>27</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>LeftCurly</td>
+<td>'{' at column 29 should have line break after.</td>
+<td>132</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 10, expected level should be 8.</td>
+<td>296</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 10, expected level should be 8.</td>
+<td>297</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.security.access.Permission.java">org/apache/hadoop/hbase/security/access/Permission.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.util.Bytes' import.</td>
+<td>35</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>LeftCurly</td>
+<td>'{' at column 24 should have line break after.</td>
+<td>59</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.security.access.SecureTestUtil.java">org/apache/hadoop/hbase/security/access/SecureTestUtil.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.util.JVMClusterUtil.RegionServerThread' import.</td>
+<td>60</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.junit.Assert.assertEquals' import.</td>
+<td>64</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>design</td>
+<td>HideUtilityClassConstructor</td>
+<td>Utility classes should not have a public or default constructor.</td>
+<td>70</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>115</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>coding</td>
+<td>InnerAssignment</td>
+<td>Inner assignments should be avoided.</td>
+<td>256</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.security.access.ShadedAccessControlUtil.java">org/apache/hadoop/hbase/security/access/ShadedAccessControlUtil.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>design</td>
+<td>HideUtilityClassConstructor</td>
+<td>Utility classes should not have a public or default constructor.</td>
+<td>49</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
+<td>76</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>77</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
+<td>78</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>79</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
+<td>80</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>81</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
+<td>82</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>83</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
+<td>84</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>85</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>151</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>785</td></tr>
+<td>152</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.security.access.TablePermission.java">org/apache/hadoop/hbase/security/access/TablePermission.java</h3>
+<table border="0" class="table table-striped">
 <tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'try' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>786</td></tr>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.util.Bytes' import.</td>
+<td>29</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.security.access.TestAccessControlFilter.java">org/apache/hadoop/hbase/security/access/TestAccessControlFilter.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>MethodParamPad</td>
+<td>'(' is preceded with whitespace.</td>
+<td>72</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.security.access.TestAccessController.java">org/apache/hadoop/hbase/security/access/TestAccessController.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
-<td>'try rcurly' has incorrect indentation level 6, expected level should be 8.</td>
-<td>787</td></tr>
+<td>'implements' has incorrect indentation level 2, expected level should be 4.</td>
+<td>508</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
-<td>'catch' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>788</td></tr>
+<td>'method def' child has incorrect indentation level 7, expected level should be one of the following: 8, 10.</td>
+<td>573</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
-<td>'catch rcurly' has incorrect indentation level 6, expected level should be 8.</td>
-<td>789</td></tr>
+<td>'method def' child has incorrect indentation level 7, expected level should be one of the following: 8, 10.</td>
+<td>595</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>EmptyBlock</td>
+<td>Must have at least one statement.</td>
+<td>879</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>MethodLength</td>
+<td>Method length is 243 lines (max allowed is 150).</td>
+<td>1294</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
-<td>808</td></tr>
+<td>1452</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 101).</td>
+<td>1544</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>MethodLength</td>
+<td>Method length is 167 lines (max allowed is 150).</td>
+<td>1764</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 104).</td>
+<td>2243</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 112).</td>
+<td>2471</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 103).</td>
-<td>848</td></tr>
+<td>2754</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.security.access.TestAccessController2.java">org/apache/hadoop/hbase/security/access/TestAccessController2.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>EmptyBlock</td>
+<td>Must have at least one statement.</td>
+<td>299</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>EmptyBlock</td>
+<td>Must have at least one statement.</td>
+<td>325</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>ParenPad</td>
+<td>'(' is followed by whitespace.</td>
+<td>529</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.security.access.TestCellACLWithMultipleVersions.java">org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 102).</td>
+<td>765</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.security.access.TestCellACLs.java">org/apache/hadoop/hbase/security/access/TestCellACLs.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>MethodLength</td>
+<td>Method length is 221 lines (max allowed is 150).</td>
+<td>151</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>ParenPad</td>
+<td>')' is preceded with whitespace.</td>
+<td>245</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.security.access.TestNamespaceCommands.java">org/apache/hadoop/hbase/security/access/TestNamespaceCommands.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>882</td></tr>
+<td>167</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'try' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>883</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'try rcurly' has incorrect indentation level 6, expected level should be 8.</td>
-<td>884</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'catch' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>885</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'catch rcurly' has incorrect indentation level 6, expected level should be 8.</td>
-<td>886</td></tr></table></div>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>169</td></tr></table></div>
 <div class="section">
-<h3 id="org.apache.hadoop.hbase.rest.RowResourceBase.java">org/apache/hadoop/hbase/rest/RowResourceBase.java</h3>
+<h3 id="org.apache.hadoop.hbase.security.access.TestTablePermissions.java">org/apache/hadoop/hbase/security/access/TestTablePermissions.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 107).</td>
+<td>132</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 20, expected level should be 19.</td>
+<td>442</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.security.access.TestWithDisabledAuthorization.java">org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>MethodLength</td>
+<td>Method length is 165 lines (max allowed is 150).</td>
+<td>242</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>MethodLength</td>
+<td>Method length is 301 lines (max allowed is 150).</td>
+<td>468</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>ParenPad</td>
+<td>')' is preceded with whitespace.</td>
+<td>971</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.security.access.ZKPermissionWatcher.java">org/apache/hadoop/hbase/security/access/ZKPermissionWatcher.java</h3>
 <table border="0" class="table table-striped">
 <tr class="a">
 <th>Severity</th>
@@ -73079,88 +78557,505 @@
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
-<td>Wrong order for 'com.fasterxml.jackson.databind.ObjectMapper' import.</td>
+<td>Wrong order for 'java.io.Closeable' import.</td>
 <td>34</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 107).</td>
-<td>265</td></tr>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>231</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>258</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>259</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>278</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.security.token.AuthenticationKey.java">org/apache/hadoop/hbase/security/token/AuthenticationKey.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'java.io.DataInput' import.</td>
+<td>23</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.util.Bytes' import.</td>
+<td>29</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.security.token.AuthenticationTokenIdentifier.java">org/apache/hadoop/hbase/security/token/AuthenticationTokenIdentifier.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.protobuf.ProtobufUtil' import.</td>
+<td>26</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'com.google.protobuf.ByteString' import.</td>
+<td>32</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.security.token.AuthenticationTokenSecretManager.java">org/apache/hadoop/hbase/security/token/AuthenticationTokenSecretManager.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'java.io.IOException' import.</td>
+<td>22</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
+<td>30</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
+<td>Line is longer than 100 characters (found 103).</td>
+<td>84</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
 <td>Line is longer than 100 characters (found 104).</td>
-<td>273</td></tr>
+<td>85</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.security.token.AuthenticationTokenSelector.java">org/apache/hadoop/hbase/security/token/AuthenticationTokenSelector.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.io.Text' import.</td>
+<td>26</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.security.token.SecureTestCluster.java">org/apache/hadoop/hbase/security/token/SecureTestCluster.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'java.io.File' import.</td>
+<td>32</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>design</td>
+<td>HideUtilityClassConstructor</td>
+<td>Utility classes should not have a public or default constructor.</td>
+<td>37</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.security.token.TestTokenAuthentication.java">org/apache/hadoop/hbase/security/token/TestTokenAuthentication.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'lambda arguments' has incorrect indentation level 10, expected level should be 8.</td>
+<td>268</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 111).</td>
+<td>438</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 113).</td>
+<td>439</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 112).</td>
+<td>467</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.security.token.TestZKSecretWatcher.java">org/apache/hadoop/hbase/security/token/TestZKSecretWatcher.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
-<td>'method def modifier' has incorrect indentation level 4, expected level should be 2.</td>
-<td>293</td></tr>
+<td>'extends' has incorrect indentation level 2, expected level should be 4.</td>
+<td>79</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.security.token.TokenProvider.java">org/apache/hadoop/hbase/security/token/TokenProvider.java</h3>
+<table border="0" class="table table-striped">
 <tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 116).</td>
-<td>294</td></tr>
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
-<td>Line is longer than 100 characters (found 107).</td>
-<td>306</td></tr>
+<td>Line is longer than 100 characters (found 109).</td>
+<td>111</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.security.token.TokenUtil.java">org/apache/hadoop/hbase/security/token/TokenUtil.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>design</td>
+<td>HideUtilityClassConstructor</td>
+<td>Utility classes should not have a public or default constructor.</td>
+<td>55</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.security.token.ZKSecretWatcher.java">org/apache/hadoop/hbase/security/token/ZKSecretWatcher.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'java.io.IOException' import.</td>
+<td>24</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 104).</td>
-<td>314</td></tr>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
+<td>30</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.security.visibility.CellVisibility.java">org/apache/hadoop/hbase/security/visibility/CellVisibility.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.util.Bytes' import.</td>
+<td>21</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'for' construct must use '{}'s.</td>
+<td>67</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>68</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.security.visibility.DefaultVisibilityLabelServiceImpl.java">org/apache/hadoop/hbase/security/visibility/DefaultVisibilityLabelServiceImpl.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>343</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>344</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>386</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>423</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>621</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>633</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>648</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>693</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.security.visibility.DefinedSetFilterScanLabelGenerator.java">org/apache/hadoop/hbase/security/visibility/DefinedSetFilterScanLabelGenerator.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
+<td>28</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.security.visibility.EnforcingScanLabelGenerator.java">org/apache/hadoop/hbase/security/visibility/EnforcingScanLabelGenerator.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
+<td>28</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.security.visibility.ExpAsStringVisibilityLabelServiceImpl.java">org/apache/hadoop/hbase/security/visibility/ExpAsStringVisibilityLabelServiceImpl.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>447</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.security.visibility.ExpressionExpander.java">org/apache/hadoop/hbase/security/visibility/ExpressionExpander.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.security.visibility.expression.ExpressionNode' import.</td>
+<td>23</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.security.visibility.ExpressionParser.java">org/apache/hadoop/hbase/security/visibility/ExpressionParser.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.security.visibility.expression.ExpressionNode' import.</td>
+<td>26</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>76</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 102).</td>
-<td>332</td></tr>
+<td>90</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 104).</td>
-<td>357</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 115).</td>
-<td>378</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 115).</td>
-<td>394</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 104).</td>
-<td>411</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 104).</td>
-<td>449</td></tr>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
+<td>303</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
-<td>'.' has incorrect indentation level 4, expected level should be 6.</td>
-<td>543</td></tr></table></div>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>304</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
+<td>305</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>306</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
+<td>307</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>308</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
+<td>309</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>310</td></tr></table></div>
 <div class="section">
-<h3 id="org.apache.hadoop.hbase.rest.RowResultGenerator.java">org/apache/hadoop/hbase/rest/RowResultGenerator.java</h3>
+<h3 id="org.apache.hadoop.hbase.security.visibility.FeedUserAuthScanLabelGenerator.java">org/apache/hadoop/hbase/security/visibility/FeedUserAuthScanLabelGenerator.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
+<td>28</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.security.visibility.LabelFilteringScanLabelGenerator.java">org/apache/hadoop/hbase/security/visibility/LabelFilteringScanLabelGenerator.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
+<td>24</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>46</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>49</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.security.visibility.LoadTestDataGeneratorWithVisibilityLabels.java">org/apache/hadoop/hbase/security/visibility/LoadTestDataGeneratorWithVisibilityLabels.java</h3>
 <table border="0" class="table table-striped">
 <tr class="b">
 <th>Severity</th>
@@ -73173,9 +79068,9 @@
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.hbase.client.Get' import.</td>
-<td>30</td></tr></table></div>
+<td>22</td></tr></table></div>
 <div class="section">
-<h3 id="org.apache.hadoop.hbase.rest.RowSpec.java">org/apache/hadoop/hbase/rest/RowSpec.java</h3>
+<h3 id="org.apache.hadoop.hbase.security.visibility.ScanLabelGenerator.java">org/apache/hadoop/hbase/security/visibility/ScanLabelGenerator.java</h3>
 <table border="0" class="table table-striped">
 <tr class="b">
 <th>Severity</th>
@@ -73187,259 +79082,190 @@
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.HConstants' import.</td>
-<td>31</td></tr>
+<td>Wrong order for 'org.apache.hadoop.conf.Configurable' import.</td>
+<td>23</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>coding</td>
-<td>InnerAssignment</td>
-<td>Inner assignments should be avoided.</td>
-<td>71</td></tr>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>36</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>coding</td>
-<td>InnerAssignment</td>
-<td>Inner assignments should be avoided.</td>
-<td>76</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>95</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>coding</td>
-<td>InnerAssignment</td>
-<td>Inner assignments should be avoided.</td>
-<td>119</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>coding</td>
-<td>InnerAssignment</td>
-<td>Inner assignments should be avoided.</td>
-<td>174</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>237</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>238</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'while' has incorrect indentation level 8, expected level should be 10.</td>
-<td>239</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'while' child has incorrect indentation level 10, expected level should be 12.</td>
-<td>240</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if' has incorrect indentation level 10, expected level should be 12.</td>
-<td>241</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if' child has incorrect indentation level 12, expected level should be 14.</td>
-<td>242</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if' child has incorrect indentation level 12, expected level should be 14.</td>
-<td>243</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if rcurly' has incorrect indentation level 10, expected level should be 12.</td>
-<td>244</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'while' child has incorrect indentation level 10, expected level should be 12.</td>
-<td>245</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'while rcurly' has incorrect indentation level 8, expected level should be 10.</td>
-<td>246</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>247</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block rcurly' has incorrect indentation level 6, expected level should be 8.</td>
-<td>248</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>249</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>250</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'while' has incorrect indentation level 8, expected level should be 10.</td>
-<td>251</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'while' child has incorrect indentation level 10, expected level should be 12.</td>
-<td>252</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if' has incorrect indentation level 10, expected level should be 12.</td>
-<td>253</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if' child has incorrect indentation level 12, expected level should be 14.</td>
-<td>254</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if' child has incorrect indentation level 12, expected level should be 14.</td>
-<td>255</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if rcurly' has incorrect indentation level 10, expected level should be 12.</td>
-<td>256</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'while' child has incorrect indentation level 10, expected level should be 12.</td>
-<td>257</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'while rcurly' has incorrect indentation level 8, expected level should be 10.</td>
-<td>258</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>259</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block rcurly' has incorrect indentation level 6, expected level should be 8.</td>
-<td>260</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>261</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>262</td></tr></table></div>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>37</td></tr></table></div>
 <div class="section">
-<h3 id="org.apache.hadoop.hbase.rest.ScannerInstanceResource.java">org/apache/hadoop/hbase/rest/ScannerInstanceResource.java</h3>
+<h3 id="org.apache.hadoop.hbase.security.visibility.SimpleScanLabelGenerator.java">org/apache/hadoop/hbase/security/visibility/SimpleScanLabelGenerator.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.rest.model.CellModel' import.</td>
+<td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
+<td>23</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.security.visibility.TestExpressionExpander.java">org/apache/hadoop/hbase/security/visibility/TestExpressionExpander.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>MethodLength</td>
+<td>Method length is 358 lines (max allowed is 150).</td>
 <td>41</td></tr></table></div>
 <div class="section">
-<h3 id="org.apache.hadoop.hbase.rest.ScannerResource.java">org/apache/hadoop/hbase/rest/ScannerResource.java</h3>
+<h3 id="org.apache.hadoop.hbase.security.visibility.TestExpressionParser.java">org/apache/hadoop/hbase/security/visibility/TestExpressionParser.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'com.fasterxml.jackson.core.JsonParseException' import.</td>
-<td>42</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'Collections' has incorrect indentation level 3, expected level should be 4.</td>
-<td>55</td></tr>
+<td>sizes</td>
+<td>MethodLength</td>
+<td>Method length is 253 lines (max allowed is 150).</td>
+<td>44</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>61</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>62</td></tr></table></div>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 107).</td>
+<td>404</td></tr></table></div>
 <div class="section">
-<h3 id="org.apache.hadoop.hbase.rest.ScannerResultGenerator.java">org/apache/hadoop/hbase/rest/ScannerResultGenerator.java</h3>
+<h3 id="org.apache.hadoop.hbase.security.visibility.TestVisibilityLabels.java">org/apache/hadoop/hbase/security/visibility/TestVisibilityLabels.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
-<td>')' is preceded with whitespace.</td>
-<td>98</td></tr></table></div>
+<td>'(' is followed by whitespace.</td>
+<td>266</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 101).</td>
+<td>379</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 101).</td>
+<td>407</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 12, expected level should be one of the following: 10, 28.</td>
+<td>873</td></tr></table></div>
 <div class="section">
-<h3 id="org.apache.hadoop.hbase.rest.SchemaResource.java">org/apache/hadoop/hbase/rest/SchemaResource.java</h3>
+<h3 id="org.apache.hadoop.hbase.security.visibility.TestVisibilityLabelsOpWithDifferentUsersNoACL.java">org/apache/hadoop/hbase/security/visibility/TestVisibilityLabelsOpWithDifferentUsersNoACL.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 14, expected level should be 12.</td>
+<td>153</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.security.visibility.TestVisibilityLabelsReplication.java">org/apache/hadoop/hbase/security/visibility/TestVisibilityLabelsReplication.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>misc</td>
+<td>ArrayTypeStyle</td>
+<td>Array brackets at illegal position.</td>
+<td>119</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
+<td>122</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
+<td>123</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
+<td>125</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
+<td>126</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.security.visibility.TestVisibilityLabelsWithACL.java">org/apache/hadoop/hbase/security/visibility/TestVisibilityLabelsWithACL.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 14, expected level should be 12.</td>
+<td>283</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.security.visibility.TestVisibilityLabelsWithCustomVisLabService.java">org/apache/hadoop/hbase/security/visibility/TestVisibilityLabelsWithCustomVisLabService.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 113).</td>
+<td>63</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.security.visibility.TestVisibilityLabelsWithDefaultVisLabelService.java">org/apache/hadoop/hbase/security/visibility/TestVisibilityLabelsWithDefaultVisLabelService.java</h3>
 <table border="0" class="table table-striped">
 <tr class="b">
 <th>Severity</th>
@@ -73452,102 +79278,162 @@
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'else' construct must use '{}'s.</td>
-<td>120</td></tr>
+<td>147</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.security.visibility.TestVisibilityLabelsWithDeletes.java">org/apache/hadoop/hbase/security/visibility/TestVisibilityLabelsWithDeletes.java</h3>
+<table border="0" class="table table-striped">
 <tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'try' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>121</td></tr>
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'try' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>122</td></tr>
+<td>sizes</td>
+<td>MethodLength</td>
+<td>Method length is 155 lines (max allowed is 150).</td>
+<td>2581</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.security.visibility.TestVisibilityLablesWithGroups.java">org/apache/hadoop/hbase/security/visibility/TestVisibilityLablesWithGroups.java</h3>
+<table border="0" class="table table-striped">
 <tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'try rcurly' has incorrect indentation level 6, expected level should be 8.</td>
-<td>123</td></tr>
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'catch' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>sizes</td>
+<td>MethodLength</td>
+<td>Method length is 240 lines (max allowed is 150).</td>
+<td>117</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.security.visibility.VisibilityClient.java">org/apache/hadoop/hbase/security/visibility/VisibilityClient.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>design</td>
+<td>HideUtilityClassConstructor</td>
+<td>Utility classes should not have a public or default constructor.</td>
+<td>53</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>60</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>70</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>71</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>73</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>83</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>84</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>86</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
 <td>125</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'catch rcurly' has incorrect indentation level 6, expected level should be 8.</td>
-<td>128</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.rest.StorageClusterStatusResource.java">org/apache/hadoop/hbase/rest/StorageClusterStatusResource.java</h3>
-<table border="0" class="table table-striped">
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>126</td></tr>
 <tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>127</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>57</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.rest.StorageClusterVersionResource.java">org/apache/hadoop/hbase/rest/StorageClusterVersionResource.java</h3>
-<table border="0" class="table table-striped">
+<td>129</td></tr>
 <tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>138</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>51</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.rest.TableResource.java">org/apache/hadoop/hbase/rest/TableResource.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.client.Scan' import.</td>
-<td>35</td></tr>
+<td>140</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>51</td></tr>
+<td>176</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>52</td></tr>
+<td>213</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>66</td></tr></table></div>
+<td>214</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>215</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>217</td></tr></table></div>
 <div class="section">
-<h3 id="org.apache.hadoop.hbase.rest.TableScanResource.java">org/apache/hadoop/hbase/rest/TableScanResource.java</h3>
+<h3 id="org.apache.hadoop.hbase.security.visibility.VisibilityConstants.java">org/apache/hadoop/hbase/security/visibility/VisibilityConstants.java</h3>
 <table border="0" class="table table-striped">
 <tr class="b">
 <th>Severity</th>
@@ -73559,43 +79445,16 @@
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
-<td>Wrong order for 'com.fasterxml.jackson.annotation.JsonIgnore' import.</td>
-<td>49</td></tr></table></div>
+<td>Wrong order for 'org.apache.hadoop.hbase.util.Bytes' import.</td>
+<td>23</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>design</td>
+<td>HideUtilityClassConstructor</td>
+<td>Utility classes should not have a public or default constructor.</td>
+<td>25</td></tr></table></div>
 <div class="section">
-<h3 id="org.apache.hadoop.hbase.rest.TestGetAndPutResource.java">org/apache/hadoop/hbase/rest/TestGetAndPutResource.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>misc</td>
-<td>UpperEll</td>
-<td>Should use uppercase 'L'.</td>
-<td>545</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>misc</td>
-<td>UpperEll</td>
-<td>Should use uppercase 'L'.</td>
-<td>548</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>misc</td>
-<td>UpperEll</td>
-<td>Should use uppercase 'L'.</td>
-<td>551</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>misc</td>
-<td>UpperEll</td>
-<td>Should use uppercase 'L'.</td>
-<td>554</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.rest.TestMultiRowResource.java">org/apache/hadoop/hbase/rest/TestMultiRowResource.java</h3>
+<h3 id="org.apache.hadoop.hbase.security.visibility.VisibilityController.java">org/apache/hadoop/hbase/security/visibility/VisibilityController.java</h3>
 <table border="0" class="table table-striped">
 <tr class="a">
 <th>Severity</th>
@@ -73605,1084 +79464,1678 @@
 <th>Line</th></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.HConstants.OperationStatusCode.SANITY_CHECK_FAILURE' import.</td>
+<td>26</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.util.Bytes' import.</td>
+<td>113</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
-<td>Line is longer than 100 characters (found 104).</td>
-<td>213</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.rest.TestNamespacesInstanceResource.java">org/apache/hadoop/hbase/rest/TestNamespacesInstanceResource.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>AvoidStarImport</td>
-<td>Using the '.*' form of import should be avoided - org.junit.Assert.*.</td>
-<td>20</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.rest.TestNamespacesResource.java">org/apache/hadoop/hbase/rest/TestNamespacesResource.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>AvoidStarImport</td>
-<td>Using the '.*' form of import should be avoided - org.junit.Assert.*.</td>
-<td>20</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.rest.TestScannersWithFilters.java">org/apache/hadoop/hbase/rest/TestScannersWithFilters.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>289</td></tr>
+<td>Line is longer than 100 characters (found 101).</td>
+<td>210</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>292</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>342</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>345</td></tr>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 102).</td>
+<td>219</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
-<td>MethodLength</td>
-<td>Method length is 154 lines (max allowed is 150).</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 101).</td>
+<td>242</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>482</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>483</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>610</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 108).</td>
+<td>751</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1085</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.security.visibility.VisibilityExpEvaluator.java">org/apache/hadoop/hbase/security/visibility/VisibilityExpEvaluator.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.Cell' import.</td>
+<td>24</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.security.visibility.VisibilityLabelFilter.java">org/apache/hadoop/hbase/security/visibility/VisibilityLabelFilter.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.Cell' import.</td>
+<td>25</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.security.visibility.VisibilityLabelService.java">org/apache/hadoop/hbase/security/visibility/VisibilityLabelService.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment' import.</td>
+<td>27</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.security.visibility.VisibilityLabelServiceManager.java">org/apache/hadoop/hbase/security/visibility/VisibilityLabelServiceManager.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
+<td>25</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>design</td>
+<td>FinalClass</td>
+<td>Class VisibilityLabelServiceManager should be declared as final.</td>
+<td>31</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>52</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.security.visibility.VisibilityLabelsCache.java">org/apache/hadoop/hbase/security/visibility/VisibilityLabelsCache.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.exceptions.DeserializationException' import.</td>
+<td>33</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>design</td>
+<td>FinalClass</td>
+<td>Class VisibilityLabelsCache should be declared as final.</td>
+<td>48</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>79</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>80</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>82</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>259</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.security.visibility.VisibilityLabelsValidator.java">org/apache/hadoop/hbase/security/visibility/VisibilityLabelsValidator.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>design</td>
+<td>HideUtilityClassConstructor</td>
+<td>Utility classes should not have a public or default constructor.</td>
+<td>27</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.security.visibility.VisibilityNewVersionBehaivorTracker.java">org/apache/hadoop/hbase/security/visibility/VisibilityNewVersionBehaivorTracker.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>design</td>
+<td>FinalClass</td>
+<td>Class TagInfo should be declared as final.</td>
+<td>56</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
+<td>126</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>127</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>130</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
+<td>131</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>132</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>133</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
+<td>136</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>137</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>140</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
+<td>141</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>142</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>143</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
+<td>144</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>145</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.security.visibility.VisibilityReplicationEndpoint.java">org/apache/hadoop/hbase/security/visibility/VisibilityReplicationEndpoint.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>LeftCurly</td>
+<td>'{' at column 31 should have line break after.</td>
+<td>143</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.security.visibility.VisibilityScanDeleteTracker.java">org/apache/hadoop/hbase/security/visibility/VisibilityScanDeleteTracker.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.regionserver.querymatcher.ScanDeleteTracker' import.</td>
+<td>29</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.Cell' import.</td>
+<td>30</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 113).</td>
+<td>127</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 115).</td>
+<td>130</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 120).</td>
+<td>140</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 122).</td>
+<td>143</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.security.visibility.VisibilityTestUtil.java">org/apache/hadoop/hbase/security/visibility/VisibilityTestUtil.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>design</td>
+<td>HideUtilityClassConstructor</td>
+<td>Utility classes should not have a public or default constructor.</td>
+<td>22</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.security.visibility.VisibilityUtils.java">org/apache/hadoop/hbase/security/visibility/VisibilityUtils.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>design</td>
+<td>HideUtilityClassConstructor</td>
+<td>Utility classes should not have a public or default constructor.</td>
+<td>72</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>90</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>106</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>126</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>128</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>147</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>149</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>231</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>237</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.security.visibility.ZKVisibilityLabelWatcher.java">org/apache/hadoop/hbase/security/visibility/ZKVisibilityLabelWatcher.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
+<td>25</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>137</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil.java">org/apache/hadoop/hbase/shaded/protobuf/ProtobufUtil.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>282</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>328</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>376</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>396</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>451</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
+<td>476</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>477</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
+<td>478</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>479</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
+<td>480</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>481</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
+<td>482</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>483</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
+<td>484</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>485</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
+<td>486</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>487</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
+<td>497</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>498</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
 <td>499</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>574</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>575</td></tr>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>500</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>576</td></tr>
+<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
+<td>501</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>577</td></tr>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>502</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>579</td></tr>
+<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
+<td>503</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>580</td></tr>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>504</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>581</td></tr>
+<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
+<td>505</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>582</td></tr>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>506</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>584</td></tr>
+<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
+<td>507</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>585</td></tr>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>508</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>586</td></tr>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>517</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>587</td></tr>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>520</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>589</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>590</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>591</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>592</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>593</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>594</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>596</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>597</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
 <td>598</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>599</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>600</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>601</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>603</td></tr>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>611</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>604</td></tr>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>614</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>605</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>606</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>607</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>608</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>622</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>623</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>624</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>625</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>627</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>628</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>629</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>630</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>632</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>633</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>634</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>635</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>637</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>638</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>639</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>640</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>642</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 104).</td>
 <td>643</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>713</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>644</td></tr>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>716</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>645</td></tr>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>726</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>647</td></tr>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>729</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>648</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>649</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>650</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>735</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>736</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>737</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>738</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>739</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>740</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>742</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>743</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>744</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>745</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>746</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>747</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>749</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>750</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>751</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>752</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>753</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>754</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>756</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>757</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>758</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>759</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>760</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>761</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>763</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>764</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>765</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>766</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>767</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>768</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>782</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>783</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>784</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>785</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>786</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>787</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>789</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>790</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>791</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>792</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>793</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 117).</td>
 <td>794</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>898</td></tr>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 109).</td>
+<td>812</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>899</td></tr>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>854</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>900</td></tr>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>857</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>901</td></tr>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>877</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>902</td></tr>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 108).</td>
+<td>883</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>903</td></tr>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>897</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>905</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>906</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>907</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>908</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>909</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>910</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>912</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>913</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>914</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>915</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
 <td>916</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>917</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>933</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>934</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>935</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>936</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>937</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>938</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>940</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>941</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>942</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>943</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>944</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>945</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>947</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>948</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>949</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>950</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>951</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>952</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>974</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>999</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>1000</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>1001</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>1002</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>1003</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>1004</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.rest.TestScannersWithLabels.java">org/apache/hadoop/hbase/rest/TestScannersWithLabels.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 101).</td>
-<td>99</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 124).</td>
-<td>171</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.rest.TestSchemaResource.java">org/apache/hadoop/hbase/rest/TestSchemaResource.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 103).</td>
-<td>149</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.rest.TestTableScan.java">org/apache/hadoop/hbase/rest/TestTableScan.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if' has incorrect indentation level 12, expected level should be one of the following: 8, 10.</td>
-<td>297</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if' child has incorrect indentation level 16, expected level should be one of the following: 10, 12.</td>
-<td>298</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if rcurly' has incorrect indentation level 12, expected level should be one of the following: 8, 10.</td>
-<td>299</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if' has incorrect indentation level 12, expected level should be one of the following: 8, 10.</td>
-<td>304</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if' child has incorrect indentation level 16, expected level should be one of the following: 10, 12.</td>
-<td>305</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if rcurly' has incorrect indentation level 12, expected level should be one of the following: 8, 10.</td>
-<td>306</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>689</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'object def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>690</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def' child has incorrect indentation level 16, expected level should be one of the following: 12, 14.</td>
-<td>694</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def' child has incorrect indentation level 16, expected level should be one of the following: 12, 14.</td>
-<td>695</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def' child has incorrect indentation level 16, expected level should be one of the following: 12, 14.</td>
-<td>696</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def modifier' has incorrect indentation level 8, expected level should be 6.</td>
-<td>705</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.rest.VersionResource.java">org/apache/hadoop/hbase/rest/VersionResource.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'javax.ws.rs.core.Response.ResponseBuilder' import.</td>
-<td>32</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.rest.model.VersionModel' import.</td>
-<td>37</td></tr>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>918</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>60</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.rest.client.Client.java">org/apache/hadoop/hbase/rest/client/Client.java</h3>
-<table border="0" class="table table-striped">
+<td>998</td></tr>
 <tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1101</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>165</td></tr>
+<td>1229</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>220</td></tr>
+<td>1300</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1301</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1303</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>1317</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1354</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1355</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1356</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1358</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1368</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1369</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1371</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>1374</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1398</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1399</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>1469</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
+<td>1471</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1511</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>1514</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>1534</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>1540</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>1574</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1631</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1633</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
+<td>1638</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>1639</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
+<td>1640</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>1641</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
+<td>1642</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>1643</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
+<td>1644</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>1645</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
+<td>1646</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1656</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
+<td>1661</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>1662</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
+<td>1663</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>1664</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
+<td>1665</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>1666</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
+<td>1667</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>1668</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
+<td>1669</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>1670</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>1683</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1719</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1720</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1722</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 103).</td>
+<td>1724</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1751</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1752</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1753</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1771</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 130).</td>
+<td>1776</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1790</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1791</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1792</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 124).</td>
+<td>1795</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1810</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1812</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 124).</td>
+<td>1814</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 112).</td>
+<td>1824</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>1826</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 117).</td>
+<td>1843</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>1844</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 116).</td>
+<td>1845</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>1858</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>1876</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>1888</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 116).</td>
+<td>2091</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 104).</td>
+<td>2116</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>2164</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>2168</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 103).</td>
+<td>2209</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>2260</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>2264</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>2271</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>2273</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>2276</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>2291</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>2303</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>2307</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>2314</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>2316</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>2319</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>2334</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>2348</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>2367</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>2386</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>2417</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>2448</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>2462</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>2476</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>2490</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>2608</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>2631</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>2646</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>2661</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>2675</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>2689</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>2690</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>2691</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 116).</td>
+<td>2819</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 105).</td>
+<td>2923</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>2970</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>2983</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def modifier' has incorrect indentation level 3, expected level should be 2.</td>
+<td>3000</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def' child has incorrect indentation level 5, expected level should be 4.</td>
+<td>3002</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def' child has incorrect indentation level 5, expected level should be 4.</td>
+<td>3003</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def' child has incorrect indentation level 5, expected level should be 4.</td>
+<td>3005</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def' child has incorrect indentation level 5, expected level should be 4.</td>
+<td>3006</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def' child has incorrect indentation level 5, expected level should be 4.</td>
+<td>3007</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def rcurly' has incorrect indentation level 3, expected level should be 2.</td>
+<td>3008</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>3054</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>3055</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>3056</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>3058</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>3059</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>3062</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 101).</td>
+<td>3116</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 107).</td>
+<td>3131</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>3132</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 108).</td>
+<td>3154</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>3155</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'.' has incorrect indentation level 4, expected level should be 6.</td>
+<td>3176</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'.' has incorrect indentation level 4, expected level should be 6.</td>
+<td>3177</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'.' has incorrect indentation level 4, expected level should be 6.</td>
+<td>3178</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'.' has incorrect indentation level 4, expected level should be 6.</td>
+<td>3179</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'.' has incorrect indentation level 4, expected level should be 6.</td>
+<td>3180</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.shaded.protobuf.RequestConverter.java">org/apache/hadoop/hbase/shaded/protobuf/RequestConverter.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>189</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>190</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>191</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>192</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>193</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>194</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>231</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>232</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>233</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
 <td>234</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>235</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>236</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>237</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>239</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>252</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>253</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>254</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>255</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>256</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>257</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>258</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
@@ -74694,67 +81147,163 @@
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>322</td></tr>
+<td>283</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>334</td></tr>
+<td>284</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>351</td></tr>
+<td>285</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>362</td></tr>
+<td>286</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>373</td></tr>
+<td>287</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>385</td></tr>
+<td>288</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>400</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>418</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>423</td></tr>
+<td>289</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>451</td></tr>
+<td>291</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>470</td></tr>
+<td>326</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>327</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>329</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>344</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>345</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>347</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>366</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>367</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>387</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>388</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>390</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>407</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>408</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>410</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>414</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>443</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>444</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>447</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>454</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
@@ -74764,45 +81313,141 @@
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>485</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>486</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>487</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>489</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>510</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>511</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>512</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>529</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>530</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>531</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
 <td>532</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>535</td></tr>
+<td>555</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>547</td></tr>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>556</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>550</td></tr>
+<td>557</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>572</td></tr>
+<td>558</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>586</td></tr>
+<td>559</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>634</td></tr>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>573</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>574</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>575</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>576</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>577</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>578</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 110).</td>
+<td>598</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
@@ -74811,30 +81456,246 @@
 <td>637</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>649</td></tr>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'org' has incorrect indentation level 9, expected level should be 10.</td>
+<td>678</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>652</td></tr>
+<td>739</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'org' has incorrect indentation level 9, expected level should be 10.</td>
+<td>801</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>997</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>672</td></tr>
+<td>1071</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>683</td></tr></table></div>
+<td>1072</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1073</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1074</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1075</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1077</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1095</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1096</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1115</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1116</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1135</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1136</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1154</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1155</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1201</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1213</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1214</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1228</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1240</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1277</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1294</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1311</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1312</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1335</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1336</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1355</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1368</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1473</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1474</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1592</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1638</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1750</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1762</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1774</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1785</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 101).</td>
+<td>1788</td></tr></table></div>
 <div class="section">
-<h3 id="org.apache.hadoop.hbase.rest.client.RemoteAdmin.java">org/apache/hadoop/hbase/rest/client/RemoteAdmin.java</h3>
+<h3 id="org.apache.hadoop.hbase.shaded.protobuf.ResponseConverter.java">org/apache/hadoop/hbase/shaded/protobuf/ResponseConverter.java</h3>
 <table border="0" class="table table-striped">
 <tr class="a">
 <th>Severity</th>
@@ -74846,541 +81707,2188 @@
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
-<td>34</td></tr>
+<td>Wrong order for 'org.apache.hadoop.util.StringUtils' import.</td>
+<td>36</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>62</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'edu.umd.cs.findbugs.annotations.Nullable' import.</td>
 <td>63</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>81</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>82</td></tr>
+<td>96</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>100</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>112</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>83</td></tr>
+<td>199</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>125</td></tr>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>204</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>211</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>216</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>221</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>251</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>127</td></tr>
+<td>'method def lparen' has incorrect indentation level 6, expected level should be 2.</td>
+<td>262</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>128</td></tr>
+<td>whitespace</td>
+<td>MethodParamPad</td>
+<td>'(' should be on the previous line.</td>
+<td>262</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>129</td></tr>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>263</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>130</td></tr>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>270</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>131</td></tr>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>271</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'try' has incorrect indentation level 8, expected level should be 10.</td>
-<td>132</td></tr>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>289</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'try' child has incorrect indentation level 10, expected level should be 12.</td>
-<td>133</td></tr>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>359</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'try rcurly' has incorrect indentation level 8, expected level should be 10.</td>
-<td>134</td></tr>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>376</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'catch' child has incorrect indentation level 10, expected level should be 12.</td>
-<td>135</td></tr>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>377</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'catch rcurly' has incorrect indentation level 8, expected level should be 10.</td>
-<td>136</td></tr>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>382</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>137</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>138</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>139</td></tr>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 101).</td>
+<td>401</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
-<td>Line is longer than 100 characters (found 111).</td>
-<td>148</td></tr>
+<td>Line is longer than 100 characters (found 129).</td>
+<td>454</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 104).</td>
+<td>455</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 103).</td>
+<td>456</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.snapshot.ClientSnapshotDescriptionUtils.java">org/apache/hadoop/hbase/snapshot/ClientSnapshotDescriptionUtils.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.util.Bytes' import.</td>
+<td>25</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>design</td>
+<td>HideUtilityClassConstructor</td>
+<td>Utility classes should not have a public or default constructor.</td>
+<td>31</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>57</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.snapshot.CorruptedSnapshotException.java">org/apache/hadoop/hbase/snapshot/CorruptedSnapshotException.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.client.SnapshotDescription' import.</td>
+<td>21</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.snapshot.CreateSnapshot.java">org/apache/hadoop/hbase/snapshot/CreateSnapshot.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'member def modifier' has incorrect indentation level 4, expected level should be 2.</td>
+<td>40</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
-<td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
+<td>'member def modifier' has incorrect indentation level 4, expected level should be 2.</td>
+<td>41</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'member def modifier' has incorrect indentation level 4, expected level should be 2.</td>
+<td>42</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def modifier' has incorrect indentation level 4, expected level should be 2.</td>
+<td>44</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def' child has incorrect indentation level 8, expected level should be 4.</td>
+<td>45</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def rcurly' has incorrect indentation level 4, expected level should be 2.</td>
+<td>46</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def modifier' has incorrect indentation level 4, expected level should be 2.</td>
+<td>48</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def' child has incorrect indentation level 8, expected level should be 4.</td>
+<td>50</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def' child has incorrect indentation level 8, expected level should be 4.</td>
+<td>51</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def' child has incorrect indentation level 8, expected level should be 4.</td>
+<td>52</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def rcurly' has incorrect indentation level 4, expected level should be 2.</td>
+<td>55</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def modifier' has incorrect indentation level 4, expected level should be 2.</td>
+<td>57</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def' child has incorrect indentation level 8, expected level should be 4.</td>
+<td>59</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def' child has incorrect indentation level 8, expected level should be 4.</td>
+<td>60</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def' child has incorrect indentation level 8, expected level should be 4.</td>
+<td>61</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if' has incorrect indentation level 8, expected level should be 4.</td>
+<td>62</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if' child has incorrect indentation level 10, expected level should be 6.</td>
+<td>63</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if' child has incorrect indentation level 10, expected level should be 6.</td>
+<td>64</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if rcurly' has incorrect indentation level 8, expected level should be 4.</td>
+<td>65</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def rcurly' has incorrect indentation level 4, expected level should be 2.</td>
+<td>66</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def modifier' has incorrect indentation level 4, expected level should be 2.</td>
+<td>68</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def' child has incorrect indentation level 8, expected level should be 4.</td>
+<td>70</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def' child has incorrect indentation level 8, expected level should be 4.</td>
+<td>71</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'try' has incorrect indentation level 8, expected level should be 4.</td>
+<td>72</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'try' child has incorrect indentation level 12, expected level should be 6.</td>
+<td>73</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'try' child has incorrect indentation level 12, expected level should be 6.</td>
+<td>74</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'try' child has incorrect indentation level 12, expected level should be 6.</td>
+<td>75</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'try rcurly' has incorrect indentation level 8, expected level should be 4.</td>
+<td>76</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'catch' child has incorrect indentation level 12, expected level should be 6.</td>
+<td>77</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'catch' child has incorrect indentation level 12, expected level should be 6.</td>
+<td>78</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'catch rcurly' has incorrect indentation level 8, expected level should be 4.</td>
+<td>79</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if' has incorrect indentation level 12, expected level should be 6.</td>
+<td>80</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if' child has incorrect indentation level 16, expected level should be 8.</td>
+<td>81</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if rcurly' has incorrect indentation level 12, expected level should be 6.</td>
+<td>82</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if' has incorrect indentation level 12, expected level should be 6.</td>
+<td>83</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if' child has incorrect indentation level 16, expected level should be 8.</td>
+<td>84</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if rcurly' has incorrect indentation level 12, expected level should be 6.</td>
+<td>85</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'finally rcurly' has incorrect indentation level 8, expected level should be 4.</td>
+<td>86</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def' child has incorrect indentation level 8, expected level should be 4.</td>
+<td>87</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def rcurly' has incorrect indentation level 4, expected level should be 2.</td>
+<td>88</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.snapshot.ExportSnapshot.java">org/apache/hadoop/hbase/snapshot/ExportSnapshot.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>276</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>277</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>542</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>545</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>549</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>552</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'object def rcurly' has incorrect indentation level 4, expected level should be one of the following: 6, 8.</td>
+<td>600</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>LeftCurly</td>
+<td>'{' at column 44 should have line break after.</td>
+<td>770</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>LeftCurly</td>
+<td>'{' at column 45 should have line break after.</td>
+<td>773</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>LeftCurly</td>
+<td>'{' at column 34 should have line break after.</td>
+<td>776</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>804</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>805</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>MethodLength</td>
+<td>Method length is 172 lines (max allowed is 150).</td>
+<td>939</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 102).</td>
+<td>981</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.snapshot.HBaseSnapshotException.java">org/apache/hadoop/hbase/snapshot/HBaseSnapshotException.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.client.SnapshotDescription' import.</td>
+<td>22</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.snapshot.MobSnapshotTestingUtils.java">org/apache/hadoop/hbase/snapshot/MobSnapshotTestingUtils.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>design</td>
+<td>HideUtilityClassConstructor</td>
+<td>Utility classes should not have a public or default constructor.</td>
+<td>43</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>89</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>90</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>91</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>93</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>coding</td>
+<td>InnerAssignment</td>
+<td>Inner assignments should be avoided.</td>
+<td>127</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.snapshot.RestoreSnapshotException.java">org/apache/hadoop/hbase/snapshot/RestoreSnapshotException.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.client.SnapshotDescription' import.</td>
+<td>22</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.snapshot.RestoreSnapshotHelper.java">org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>LeftCurly</td>
+<td>'{' at column 3 should be on the previous line.</td>
+<td>157</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>381</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>422</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>437</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>452</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>566</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>584</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>638</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>661</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>727</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>804</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>818</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>819</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>820</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>821</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>822</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>823</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.snapshot.SnapshotCreationException.java">org/apache/hadoop/hbase/snapshot/SnapshotCreationException.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.client.SnapshotDescription' import.</td>
+<td>21</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.snapshot.SnapshotDescriptionUtils.java">org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>95</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 101).</td>
+<td>131</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
+<td>150</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
+<td>151</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>152</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
-<td>153</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if' has incorrect indentation level 6, expected level should be 4.</td>
-<td>154</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if' child has incorrect indentation level 10, expected level should be 6.</td>
-<td>155</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if' child has incorrect indentation level 10, expected level should be 6.</td>
-<td>156</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if rcurly' has incorrect indentation level 6, expected level should be 4.</td>
-<td>157</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>167</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>168</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>169</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>171</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>172</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>173</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'try' has incorrect indentation level 8, expected level should be 10.</td>
-<td>174</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'try' child has incorrect indentation level 10, expected level should be 12.</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 102).</td>
 <td>175</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'try rcurly' has incorrect indentation level 8, expected level should be 10.</td>
-<td>176</td></tr>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>366</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>378</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>393</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>417</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.snapshot.SnapshotDoesNotExistException.java">org/apache/hadoop/hbase/snapshot/SnapshotDoesNotExistException.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.client.SnapshotDescription' import.</td>
+<td>21</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.snapshot.SnapshotExistsException.java">org/apache/hadoop/hbase/snapshot/SnapshotExistsException.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.client.SnapshotDescription' import.</td>
+<td>21</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.snapshot.SnapshotInfo.java">org/apache/hadoop/hbase/snapshot/SnapshotInfo.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>125</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>126</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>127</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>LeftCurly</td>
+<td>'{' at column 5 should be on the previous line.</td>
+<td>152</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>LeftCurly</td>
+<td>'{' at column 40 should have line break after.</td>
+<td>191</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>LeftCurly</td>
+<td>'{' at column 40 should have line break after.</td>
+<td>229</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>326</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>398</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 102).</td>
+<td>461</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>471</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
-<td>'catch' child has incorrect indentation level 10, expected level should be 12.</td>
-<td>177</td></tr>
+<td>'object def rcurly' has incorrect indentation level 4, expected level should be one of the following: 6, 8.</td>
+<td>482</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.snapshot.SnapshotManifest.java">org/apache/hadoop/hbase/snapshot/SnapshotManifest.java</h3>
+<table border="0" class="table table-striped">
 <tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'catch rcurly' has incorrect indentation level 8, expected level should be 10.</td>
-<td>178</td></tr>
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>179</td></tr>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>172</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>180</td></tr>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>338</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>181</td></tr>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>422</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>460</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>563</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.snapshot.SnapshotManifestV2.java">org/apache/hadoop/hbase/snapshot/SnapshotManifestV2.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>147</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.snapshot.SnapshotTestingUtils.java">org/apache/hadoop/hbase/snapshot/SnapshotTestingUtils.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 105).</td>
 <td>209</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'try' has incorrect indentation level 8, expected level should be 10.</td>
-<td>210</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'try' child has incorrect indentation level 10, expected level should be 12.</td>
-<td>212</td></tr>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 105).</td>
+<td>211</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
-<td>'try rcurly' has incorrect indentation level 8, expected level should be 10.</td>
-<td>214</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'catch' child has incorrect indentation level 10, expected level should be 12.</td>
-<td>216</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'catch rcurly' has incorrect indentation level 8, expected level should be 10.</td>
-<td>219</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>220</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>'method def modifier' has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>221</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
-<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>222</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'try' has incorrect indentation level 8, expected level should be 10.</td>
-<td>223</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'try' child has incorrect indentation level 10, expected level should be 12.</td>
+<td>'method def' child has incorrect indentation level 10, expected level should be one of the following: 12, 14.</td>
 <td>224</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
-<td>'try rcurly' has incorrect indentation level 8, expected level should be 10.</td>
+<td>'method def rcurly' has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
 <td>225</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
-<td>'catch' child has incorrect indentation level 10, expected level should be 12.</td>
+<td>'object def rcurly' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
 <td>226</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'catch rcurly' has incorrect indentation level 8, expected level should be 10.</td>
-<td>227</td></tr>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 152).</td>
+<td>231</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>228</td></tr>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 158).</td>
+<td>238</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>229</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>230</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>257</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>258</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>259</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>260</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>261</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'try' has incorrect indentation level 8, expected level should be 10.</td>
-<td>262</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'try' child has incorrect indentation level 10, expected level should be 12.</td>
-<td>263</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'try rcurly' has incorrect indentation level 8, expected level should be 10.</td>
-<td>264</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'catch' child has incorrect indentation level 10, expected level should be 12.</td>
-<td>265</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'catch rcurly' has incorrect indentation level 8, expected level should be 10.</td>
-<td>266</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 103).</td>
 <td>267</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
-<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>268</td></tr>
+<td>'method def modifier' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
+<td>421</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>269</td></tr>
+<td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
+<td>424</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
-<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>298</td></tr>
+<td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
+<td>425</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>299</td></tr>
+<td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
+<td>426</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
-<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>300</td></tr>
+<td>'if' has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
+<td>427</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
-<td>'try' has incorrect indentation level 8, expected level should be 10.</td>
-<td>301</td></tr>
+<td>'if' child has incorrect indentation level 10, expected level should be one of the following: 12, 14.</td>
+<td>428</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
-<td>'try' child has incorrect indentation level 10, expected level should be 12.</td>
-<td>302</td></tr>
+<td>'if' child has incorrect indentation level 10, expected level should be one of the following: 12, 14.</td>
+<td>429</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
-<td>'try rcurly' has incorrect indentation level 8, expected level should be 10.</td>
-<td>303</td></tr>
+<td>'if rcurly' has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
+<td>430</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
-<td>'catch' child has incorrect indentation level 10, expected level should be 12.</td>
-<td>304</td></tr>
+<td>'method def rcurly' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
+<td>431</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
-<td>'catch rcurly' has incorrect indentation level 8, expected level should be 10.</td>
-<td>305</td></tr>
+<td>'object def rcurly' has incorrect indentation level 4, expected level should be one of the following: 6, 8.</td>
+<td>432</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>306</td></tr>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>562</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
-<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>307</td></tr>
+<td>'if' child has incorrect indentation level 14, expected level should be 12.</td>
+<td>576</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>308</td></tr>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>594</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 104).</td>
+<td>632</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 104).</td>
+<td>642</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 103).</td>
+<td>776</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 102).</td>
+<td>791</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.snapshot.TablePartiallyOpenException.java">org/apache/hadoop/hbase/snapshot/TablePartiallyOpenException.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.util.Bytes' import.</td>
+<td>24</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
-<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>343</td></tr>
+<td>'ctor def modifier' has incorrect indentation level 3, expected level should be 2.</td>
+<td>54</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>'ctor def' child has incorrect indentation level 5, expected level should be 4.</td>
+<td>55</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'ctor def rcurly' has incorrect indentation level 3, expected level should be 2.</td>
+<td>56</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.snapshot.TestExportSnapshot.java">org/apache/hadoop/hbase/snapshot/TestExportSnapshot.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 102).</td>
+<td>210</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>227</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>320</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>EmptyBlock</td>
+<td>Must have at least one statement.</td>
+<td>325</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'object def rcurly' has incorrect indentation level 4, expected level should be one of the following: 6, 8.</td>
+<td>338</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.snapshot.TestExportSnapshotWithTemporaryDirectory.java">org/apache/hadoop/hbase/snapshot/TestExportSnapshotWithTemporaryDirectory.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 111).</td>
+<td>58</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.snapshot.TestFlushSnapshotFromClient.java">org/apache/hadoop/hbase/snapshot/TestFlushSnapshotFromClient.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>145</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>178</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>218</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>558</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.snapshot.TestRestoreSnapshotHelper.java">org/apache/hadoop/hbase/snapshot/TestRestoreSnapshotHelper.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 103).</td>
+<td>211</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 105).</td>
+<td>253</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.test.IntegrationTestBigLinkedList.java">org/apache/hadoop/hbase/test/IntegrationTestBigLinkedList.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 102).</td>
+<td>289</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 110).</td>
+<td>449</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>misc</td>
+<td>UpperEll</td>
+<td>Should use uppercase 'L'.</td>
+<td>629</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>MethodParamPad</td>
+<td>'(' is preceded with whitespace.</td>
+<td>644</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>LeftCurly</td>
+<td>'{' at column 50 should have line break after.</td>
+<td>661</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>misc</td>
+<td>UpperEll</td>
+<td>Should use uppercase 'L'.</td>
+<td>688</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>misc</td>
+<td>UpperEll</td>
+<td>Should use uppercase 'L'.</td>
+<td>692</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>misc</td>
+<td>UpperEll</td>
+<td>Should use uppercase 'L'.</td>
+<td>695</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>ParenPad</td>
+<td>')' is preceded with whitespace.</td>
+<td>738</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>896</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>981</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'for' construct must use '{}'s.</td>
+<td>983</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 4, expected level should be 6.</td>
+<td>1001</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>1015</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 111).</td>
+<td>1122</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 6, expected level should be 8.</td>
+<td>1123</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1139</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1140</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>1142</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1156</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1166</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1258</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 6, expected level should be 8.</td>
+<td>1262</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>1264</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>1287</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>1290</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 103).</td>
+<td>1432</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 106).</td>
+<td>1441</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 102).</td>
+<td>1501</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>1615</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>1618</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>1622</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'else' construct must use '{}'s.</td>
+<td>1624</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>ParenPad</td>
+<td>'(' is followed by whitespace.</td>
+<td>1684</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 101).</td>
+<td>1863</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.test.IntegrationTestBigLinkedListWithVisibility.java">org/apache/hadoop/hbase/test/IntegrationTestBigLinkedListWithVisibility.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 110).</td>
+<td>93</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 107).</td>
+<td>95</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>341</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 111).</td>
+<td>497</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 103).</td>
+<td>533</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 12, expected level should be one of the following: 10, 23.</td>
+<td>642</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.test.IntegrationTestLoadAndVerify.java">org/apache/hadoop/hbase/test/IntegrationTestLoadAndVerify.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def modifier' has incorrect indentation level 0, expected level should be 2.</td>
+<td>156</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def' child has incorrect indentation level 2, expected level should be 4.</td>
+<td>158</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if' has incorrect indentation level 2, expected level should be 4.</td>
+<td>159</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if' child has incorrect indentation level 4, expected level should be 6.</td>
+<td>160</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if rcurly' has incorrect indentation level 2, expected level should be 4.</td>
+<td>161</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def rcurly' has incorrect indentation level 0, expected level should be 2.</td>
+<td>162</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>LeftCurly</td>
+<td>'{' at column 3 should be on the previous line.</td>
+<td>171</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>ParenPad</td>
+<td>'(' is followed by whitespace.</td>
+<td>173</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>ParenPad</td>
+<td>'(' is followed by whitespace.</td>
+<td>173</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>ParenPad</td>
+<td>'(' is followed by whitespace.</td>
+<td>173</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>ParenPad</td>
+<td>')' is preceded with whitespace.</td>
+<td>173</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>ParenPad</td>
+<td>')' is preceded with whitespace.</td>
+<td>173</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>ParenPad</td>
+<td>')' is preceded with whitespace.</td>
+<td>173</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>ParenPad</td>
+<td>'(' is followed by whitespace.</td>
+<td>174</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>ParenPad</td>
+<td>'(' is followed by whitespace.</td>
+<td>174</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>ParenPad</td>
+<td>'(' is followed by whitespace.</td>
+<td>174</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>ParenPad</td>
+<td>')' is preceded with whitespace.</td>
+<td>174</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>ParenPad</td>
+<td>')' is preceded with whitespace.</td>
+<td>174</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>ParenPad</td>
+<td>')' is preceded with whitespace.</td>
+<td>174</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>ParenPad</td>
+<td>'(' is followed by whitespace.</td>
+<td>175</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>ParenPad</td>
+<td>'(' is followed by whitespace.</td>
+<td>175</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>ParenPad</td>
+<td>'(' is followed by whitespace.</td>
+<td>175</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>ParenPad</td>
+<td>')' is preceded with whitespace.</td>
+<td>175</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>ParenPad</td>
+<td>')' is preceded with whitespace.</td>
+<td>175</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>ParenPad</td>
+<td>')' is preceded with whitespace.</td>
+<td>175</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>ParenPad</td>
+<td>'(' is followed by whitespace.</td>
+<td>176</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>ParenPad</td>
+<td>'(' is followed by whitespace.</td>
+<td>176</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>ParenPad</td>
+<td>'(' is followed by whitespace.</td>
+<td>176</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>ParenPad</td>
+<td>')' is preceded with whitespace.</td>
+<td>176</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>ParenPad</td>
+<td>')' is preceded with whitespace.</td>
+<td>176</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>ParenPad</td>
+<td>')' is preceded with whitespace.</td>
+<td>176</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>ParenPad</td>
+<td>'(' is followed by whitespace.</td>
+<td>177</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>ParenPad</td>
+<td>'(' is followed by whitespace.</td>
+<td>177</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>ParenPad</td>
+<td>'(' is followed by whitespace.</td>
+<td>177</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>ParenPad</td>
+<td>')' is preceded with whitespace.</td>
+<td>177</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>ParenPad</td>
+<td>')' is preceded with whitespace.</td>
+<td>177</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>ParenPad</td>
+<td>')' is preceded with whitespace.</td>
+<td>177</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>ParenPad</td>
+<td>'(' is followed by whitespace.</td>
+<td>178</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>ParenPad</td>
+<td>'(' is followed by whitespace.</td>
+<td>178</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>ParenPad</td>
+<td>'(' is followed by whitespace.</td>
+<td>178</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>ParenPad</td>
+<td>')' is preceded with whitespace.</td>
+<td>178</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>ParenPad</td>
+<td>')' is preceded with whitespace.</td>
+<td>178</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>ParenPad</td>
+<td>')' is preceded with whitespace.</td>
+<td>178</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>ParenPad</td>
+<td>'(' is followed by whitespace.</td>
+<td>179</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>ParenPad</td>
+<td>'(' is followed by whitespace.</td>
+<td>179</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>ParenPad</td>
+<td>'(' is followed by whitespace.</td>
+<td>179</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>ParenPad</td>
+<td>')' is preceded with whitespace.</td>
+<td>179</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>ParenPad</td>
+<td>')' is preceded with whitespace.</td>
+<td>179</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>ParenPad</td>
+<td>')' is preceded with whitespace.</td>
+<td>179</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>ParenPad</td>
+<td>'(' is followed by whitespace.</td>
+<td>180</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>ParenPad</td>
+<td>'(' is followed by whitespace.</td>
+<td>180</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>ParenPad</td>
+<td>'(' is followed by whitespace.</td>
+<td>180</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>ParenPad</td>
+<td>')' is preceded with whitespace.</td>
+<td>180</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>ParenPad</td>
+<td>')' is preceded with whitespace.</td>
+<td>180</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>ParenPad</td>
+<td>')' is preceded with whitespace.</td>
+<td>180</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>LeftCurly</td>
+<td>'{' at column 3 should be on the previous line.</td>
+<td>185</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 109).</td>
+<td>279</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>470</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>487</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>506</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'for' construct must use '{}'s.</td>
+<td>508</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>516</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 101).</td>
+<td>556</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 107).</td>
+<td>557</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 116).</td>
+<td>558</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 109).</td>
+<td>559</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 115).</td>
+<td>560</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 104).</td>
+<td>561</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 108).</td>
+<td>562</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 116).</td>
+<td>563</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>misc</td>
+<td>ArrayTypeStyle</td>
+<td>Array brackets at illegal position.</td>
+<td>648</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.test.IntegrationTestReplication.java">org/apache/hadoop/hbase/test/IntegrationTestReplication.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.HConstants' import.</td>
+<td>29</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.client.Admin' import.</td>
+<td>32</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'java.util.Collections' import.</td>
+<td>43</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>181</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>262</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>286</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.test.IntegrationTestTimeBoundedMultiGetRequestsWithRegionReplicas.java">org/apache/hadoop/hbase/test/IntegrationTestTimeBoundedMultiGetRequestsWithRegionReplicas.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>misc</td>
+<td>ArrayTypeStyle</td>
+<td>Array brackets at illegal position.</td>
+<td>66</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.test.IntegrationTestTimeBoundedRequestsWithRegionReplicas.java">org/apache/hadoop/hbase/test/IntegrationTestTimeBoundedRequestsWithRegionReplicas.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 102).</td>
+<td>164</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>226</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 103).</td>
+<td>342</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
 <td>344</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>345</td></tr>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 101).</td>
+<td>369</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.test.IntegrationTestWithCellVisibilityLoadAndVerify.java">org/apache/hadoop/hbase/test/IntegrationTestWithCellVisibilityLoadAndVerify.java</h3>
+<table border="0" class="table table-striped">
 <tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'try' has incorrect indentation level 8, expected level should be 10.</td>
-<td>346</td></tr>
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
-<td>'try' child has incorrect indentation level 10, expected level should be 12.</td>
-<td>347</td></tr>
+<td>'array initialization' child has incorrect indentation level 6, expected level should be one of the following: 4, 52.</td>
+<td>92</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
-<td>'try rcurly' has incorrect indentation level 8, expected level should be 10.</td>
+<td>'array initialization' child has incorrect indentation level 6, expected level should be one of the following: 4, 52.</td>
+<td>93</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 10, expected level should be one of the following: 8, 69.</td>
+<td>142</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>191</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>192</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>193</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>194</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>195</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>196</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>197</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>198</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>199</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>200</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>misc</td>
+<td>ArrayTypeStyle</td>
+<td>Array brackets at illegal position.</td>
+<td>395</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.tool.Canary.java">org/apache/hadoop/hbase/tool/Canary.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>348</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
-<td>'catch' child has incorrect indentation level 10, expected level should be 12.</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
 <td>349</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
-<td>'catch rcurly' has incorrect indentation level 8, expected level should be 10.</td>
+<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
 <td>350</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
@@ -75402,1482 +83910,177 @@
 <td>353</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>382</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>383</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>384</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>385</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>386</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>387</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'try' has incorrect indentation level 8, expected level should be 10.</td>
-<td>388</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'try' child has incorrect indentation level 10, expected level should be 12.</td>
-<td>389</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'try rcurly' has incorrect indentation level 8, expected level should be 10.</td>
-<td>390</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'catch' child has incorrect indentation level 10, expected level should be 12.</td>
-<td>391</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'catch rcurly' has incorrect indentation level 8, expected level should be 10.</td>
-<td>392</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>393</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>394</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>395</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.rest.client.Response.java">org/apache/hadoop/hbase/rest/client/Response.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.http.Header' import.</td>
-<td>28</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>79</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.rest.client.TestRemoteHTableRetries.java">org/apache/hadoop/hbase/rest/client/TestRemoteHTableRetries.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 12, expected level should be one of the following: 10, 23.</td>
-<td>135</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.rest.client.TestRemoteTable.java">org/apache/hadoop/hbase/rest/client/TestRemoteTable.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>119</td></tr>
+<td>whitespace</td>
+<td>ParenPad</td>
+<td>')' is preceded with whitespace.</td>
+<td>472</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 116).</td>
-<td>346</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>580</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.rest.filter.GZIPRequestStream.java">org/apache/hadoop/hbase/rest/filter/GZIPRequestStream.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>LeftCurly</td>
-<td>'{' at column 1 should be on the previous line.</td>
-<td>33</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.rest.filter.GZIPResponseStream.java">org/apache/hadoop/hbase/rest/filter/GZIPResponseStream.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>LeftCurly</td>
-<td>'{' at column 1 should be on the previous line.</td>
-<td>33</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.rest.filter.GzipFilter.java">org/apache/hadoop/hbase/rest/filter/GzipFilter.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.HBaseInterfaceAudience' import.</td>
-<td>39</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.rest.filter.RestCsrfPreventionFilter.java">org/apache/hadoop/hbase/rest/filter/RestCsrfPreventionFilter.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
-<td>40</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.rest.model.CellModel.java">org/apache/hadoop/hbase/rest/model/CellModel.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'com.fasterxml.jackson.annotation.JsonProperty' import.</td>
-<td>31</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.CellUtil' import.</td>
-<td>37</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>87</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>88</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>96</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>97</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>98</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>106</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>115</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>116</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>117</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>127</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>128</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>129</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>130</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>155</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.rest.model.CellSetModel.java">org/apache/hadoop/hbase/rest/model/CellSetModel.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.HConstants' import.</td>
-<td>34</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.rest.model.ColumnSchemaModel.java">org/apache/hadoop/hbase/rest/model/ColumnSchemaModel.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.HColumnDescriptor' import.</td>
-<td>32</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'com.fasterxml.jackson.annotation.JsonAnyGetter' import.</td>
-<td>35</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.rest.model.NamespacesInstanceModel.java">org/apache/hadoop/hbase/rest/model/NamespacesInstanceModel.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.client.Admin' import.</td>
-<td>35</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>71</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>81</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>LeftCurly</td>
-<td>'{' at column 23 should have line break after.</td>
-<td>85</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>LeftCurly</td>
-<td>'{' at column 40 should have line break after.</td>
-<td>90</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.rest.model.NamespacesModel.java">org/apache/hadoop/hbase/rest/model/NamespacesModel.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.client.Admin' import.</td>
-<td>34</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'com.fasterxml.jackson.annotation.JsonProperty' import.</td>
-<td>38</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>66</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.rest.model.ScannerModel.java">org/apache/hadoop/hbase/rest/model/ScannerModel.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.client.Scan' import.</td>
-<td>37</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'com.fasterxml.jackson.annotation.JsonInclude' import.</td>
-<td>78</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>VisibilityModifier</td>
-<td>Variable 'type' must be private and have accessor methods.</td>
-<td>133</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>VisibilityModifier</td>
-<td>Variable 'value' must be private and have accessor methods.</td>
-<td>134</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>VisibilityModifier</td>
-<td>Variable 'op' must be private and have accessor methods.</td>
-<td>135</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>VisibilityModifier</td>
-<td>Variable 'type' must be private and have accessor methods.</td>
-<td>205</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>VisibilityModifier</td>
-<td>Variable 'op' must be private and have accessor methods.</td>
-<td>206</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>VisibilityModifier</td>
-<td>Variable 'value' must be private and have accessor methods.</td>
-<td>208</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>VisibilityModifier</td>
-<td>Variable 'filters' must be private and have accessor methods.</td>
-<td>209</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>VisibilityModifier</td>
-<td>Variable 'limit' must be private and have accessor methods.</td>
-<td>210</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>VisibilityModifier</td>
-<td>Variable 'offset' must be private and have accessor methods.</td>
-<td>211</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>VisibilityModifier</td>
-<td>Variable 'family' must be private and have accessor methods.</td>
-<td>212</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>VisibilityModifier</td>
-<td>Variable 'qualifier' must be private and have accessor methods.</td>
-<td>213</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>VisibilityModifier</td>
-<td>Variable 'ifMissing' must be private and have accessor methods.</td>
-<td>214</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>VisibilityModifier</td>
-<td>Variable 'latestVersion' must be private and have accessor methods.</td>
-<td>215</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>VisibilityModifier</td>
-<td>Variable 'minColumn' must be private and have accessor methods.</td>
-<td>216</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>VisibilityModifier</td>
-<td>Variable 'minColumnInclusive' must be private and have accessor methods.</td>
-<td>217</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>VisibilityModifier</td>
-<td>Variable 'maxColumn' must be private and have accessor methods.</td>
-<td>218</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>VisibilityModifier</td>
-<td>Variable 'maxColumnInclusive' must be private and have accessor methods.</td>
-<td>219</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>VisibilityModifier</td>
-<td>Variable 'dropDependentColumn' must be private and have accessor methods.</td>
-<td>220</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>VisibilityModifier</td>
-<td>Variable 'chance' must be private and have accessor methods.</td>
-<td>221</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>VisibilityModifier</td>
-<td>Variable 'prefixes' must be private and have accessor methods.</td>
-<td>222</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>VisibilityModifier</td>
-<td>Variable 'timestamps' must be private and have accessor methods.</td>
-<td>224</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>351</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>372</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>373</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>374</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>375</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>376</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>377</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>378</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>379</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>380</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>381</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>382</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>385</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>386</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>387</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>390</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>391</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>392</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>393</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>394</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>395</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'for' has incorrect indentation level 8, expected level should be 10.</td>
-<td>396</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'for' child has incorrect indentation level 10, expected level should be 12.</td>
-<td>397</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'for rcurly' has incorrect indentation level 8, expected level should be 10.</td>
-<td>398</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>399</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block rcurly' has incorrect indentation level 6, expected level should be 8.</td>
-<td>400</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>401</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>402</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>403</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>404</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>405</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>406</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>407</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>408</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>409</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>410</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>411</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'for' has incorrect indentation level 8, expected level should be 10.</td>
-<td>412</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'for' child has incorrect indentation level 10, expected level should be 12.</td>
-<td>413</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'for rcurly' has incorrect indentation level 8, expected level should be 10.</td>
-<td>414</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>415</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block rcurly' has incorrect indentation level 6, expected level should be 8.</td>
-<td>416</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>417</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>418</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block rcurly' has incorrect indentation level 6, expected level should be 8.</td>
-<td>419</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>420</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>421</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>422</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>423</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>424</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>425</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>426</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>427</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>428</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>429</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>430</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>431</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>432</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>433</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>434</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>435</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>436</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if' has incorrect indentation level 8, expected level should be 10.</td>
-<td>439</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if' child has incorrect indentation level 10, expected level should be 12.</td>
-<td>440</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if rcurly' has incorrect indentation level 8, expected level should be 10.</td>
-<td>441</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if' has incorrect indentation level 8, expected level should be 10.</td>
-<td>442</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if' child has incorrect indentation level 10, expected level should be 12.</td>
-<td>443</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if rcurly' has incorrect indentation level 8, expected level should be 10.</td>
-<td>444</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>445</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>446</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>447</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if' has incorrect indentation level 8, expected level should be 10.</td>
-<td>450</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if' child has incorrect indentation level 10, expected level should be 12.</td>
-<td>451</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if rcurly' has incorrect indentation level 8, expected level should be 10.</td>
-<td>452</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if' has incorrect indentation level 8, expected level should be 10.</td>
-<td>453</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if' child has incorrect indentation level 10, expected level should be 12.</td>
-<td>454</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if rcurly' has incorrect indentation level 8, expected level should be 10.</td>
-<td>455</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>456</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>457</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>458</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>459</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>460</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>461</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>462</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>463</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>464</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>465</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>466</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>467</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>468</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>469</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>470</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>489</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>500</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>511</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>573</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>596</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>598</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 101).</td>
-<td>763</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'for' construct must use '{}'s.</td>
-<td>824</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.rest.model.StorageClusterStatusModel.java">org/apache/hadoop/hbase/rest/model/StorageClusterStatusModel.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.rest.ProtobufMessageHandler' import.</td>
-<td>34</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.protobuf.ProtobufUtil' import.</td>
-<td>35</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'com.fasterxml.jackson.annotation.JsonProperty' import.</td>
-<td>39</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>521</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>611</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>649</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.rest.model.TableInfoModel.java">org/apache/hadoop/hbase/rest/model/TableInfoModel.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.protobuf.ProtobufUtil' import.</td>
-<td>33</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>65</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.rest.model.TableListModel.java">org/apache/hadoop/hbase/rest/model/TableListModel.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.rest.ProtobufMessageHandler' import.</td>
-<td>31</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.protobuf.ProtobufUtil' import.</td>
-<td>32</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.rest.model.TableModel.java">org/apache/hadoop/hbase/rest/model/TableModel.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>55</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.rest.model.TableRegionModel.java">org/apache/hadoop/hbase/rest/model/TableRegionModel.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.TableName' import.</td>
-<td>28</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.HRegionInfo' import.</td>
-<td>29</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>misc</td>
-<td>ArrayTypeStyle</td>
-<td>Array brackets at illegal position.</td>
-<td>140</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.rest.model.TableSchemaModel.java">org/apache/hadoop/hbase/rest/model/TableSchemaModel.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'java.util.Iterator' import.</td>
-<td>26</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.HColumnDescriptor' import.</td>
-<td>37</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.protobuf.ProtobufUtil' import.</td>
-<td>42</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'com.fasterxml.jackson.annotation.JsonAnyGetter' import.</td>
-<td>47</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.rest.model.TestScannerModel.java">org/apache/hadoop/hbase/rest/model/TestScannerModel.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'com.fasterxml.jackson.core.JsonParseException' import.</td>
-<td>32</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.rest.model.TestStorageClusterStatusModel.java">org/apache/hadoop/hbase/rest/model/TestStorageClusterStatusModel.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
+<td>MethodLength</td>
+<td>Method length is 161 lines (max allowed is 150).</td>
+<td>643</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
-<td>Line is longer than 100 characters (found 116).</td>
-<td>47</td></tr>
+<td>Line is longer than 100 characters (found 117).</td>
+<td>755</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
-<td>Line is longer than 100 characters (found 119).</td>
-<td>48</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 111).</td>
-<td>49</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 119).</td>
-<td>50</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 116).</td>
-<td>52</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 111).</td>
-<td>53</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 105).</td>
-<td>54</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.rest.model.VersionModel.java">org/apache/hadoop/hbase/rest/model/VersionModel.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.rest.ProtobufMessageHandler' import.</td>
-<td>30</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.protobuf.ProtobufUtil' import.</td>
-<td>32</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>80</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.rest.provider.JAXBContextResolver.java">org/apache/hadoop/hbase/rest/provider/JAXBContextResolver.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.rest.model.CellModel' import.</td>
-<td>31</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.rest.provider.consumer.ProtobufMessageBodyConsumer.java">org/apache/hadoop/hbase/rest/provider/consumer/ProtobufMessageBodyConsumer.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.rest.Constants' import.</td>
-<td>39</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.rest.provider.producer.PlainTextMessageBodyProducer.java">org/apache/hadoop/hbase/rest/provider/producer/PlainTextMessageBodyProducer.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.rest.Constants' import.</td>
-<td>35</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.rsgroup.IntegrationTestRSGroup.java">org/apache/hadoop/hbase/rsgroup/IntegrationTestRSGroup.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
 <td>Line is longer than 100 characters (found 103).</td>
-<td>56</td></tr></table></div>
+<td>798</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>863</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 108).</td>
+<td>1007</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>1017</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>1022</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 104).</td>
+<td>1181</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1319</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 102).</td>
+<td>1382</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>1476</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 121).</td>
+<td>1494</td></tr></table></div>
 <div class="section">
-<h3 id="org.apache.hadoop.hbase.security.AbstractHBaseSaslRpcClient.java">org/apache/hadoop/hbase/security/AbstractHBaseSaslRpcClient.java</h3>
+<h3 id="org.apache.hadoop.hbase.tool.MapreduceTestingShim.java">org/apache/hadoop/hbase/tool/MapreduceTestingShim.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>111</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.tool.TestBulkLoadHFilesSplitRecovery.java">org/apache/hadoop/hbase/tool/TestBulkLoadHFilesSplitRecovery.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>160</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>161</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>162</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>242</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>coding</td>
+<td>InnerAssignment</td>
+<td>Inner assignments should be avoided.</td>
+<td>250</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>coding</td>
+<td>InnerAssignment</td>
+<td>Inner assignments should be avoided.</td>
+<td>476</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.tool.TestCanaryTool.java">org/apache/hadoop/hbase/tool/TestCanaryTool.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 118).</td>
+<td>103</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 123).</td>
+<td>156</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 121).</td>
+<td>157</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 112).</td>
+<td>163</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.trace.IntegrationTestSendTraceRequests.java">org/apache/hadoop/hbase/trace/IntegrationTestSendTraceRequests.java</h3>
 <table border="0" class="table table-striped">
 <tr class="b">
 <th>Severity</th>
@@ -76889,34 +84092,139 @@
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
-<td>Wrong order for 'java.io.IOException' import.</td>
-<td>22</td></tr>
+<td>Wrong order for 'org.apache.hadoop.hbase.TableName' import.</td>
+<td>25</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.security.token.Token' import.</td>
-<td>39</td></tr>
+<td>Wrong order for 'java.io.IOException' import.</td>
+<td>44</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>66</td></tr>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'for' has incorrect indentation level 6, expected level should be 4.</td>
+<td>118</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>80</td></tr>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'for' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>119</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>88</td></tr></table></div>
+<td>148</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'for' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>153</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'for rcurly' has incorrect indentation level 6, expected level should be 4.</td>
+<td>154</td></tr></table></div>
 <div class="section">
-<h3 id="org.apache.hadoop.hbase.security.AccessDeniedException.java">org/apache/hadoop/hbase/security/AccessDeniedException.java</h3>
+<h3 id="org.apache.hadoop.hbase.trace.SpanReceiverHost.java">org/apache/hadoop/hbase/trace/SpanReceiverHost.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>108</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.trace.TraceTree.java">org/apache/hadoop/hbase/trace/TraceTree.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'java.util.Collection' import.</td>
+<td>23</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def modifier' has incorrect indentation level 10, expected level should be one of the following: 6, 8.</td>
+<td>40</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def' child has incorrect indentation level 12, expected level should be one of the following: 8, 10.</td>
+<td>42</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def rcurly' has incorrect indentation level 10, expected level should be one of the following: 6, 8.</td>
+<td>43</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'object def rcurly' has incorrect indentation level 8, expected level should be one of the following: 4, 6.</td>
+<td>44</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def modifier' has incorrect indentation level 10, expected level should be one of the following: 6, 8.</td>
+<td>91</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def' child has incorrect indentation level 12, expected level should be one of the following: 8, 10.</td>
+<td>93</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def rcurly' has incorrect indentation level 10, expected level should be one of the following: 6, 8.</td>
+<td>94</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'object def rcurly' has incorrect indentation level 8, expected level should be one of the following: 4, 6.</td>
+<td>95</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.trace.TraceUtil.java">org/apache/hadoop/hbase/trace/TraceUtil.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>65</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.types.TestCopyOnWriteMaps.java">org/apache/hadoop/hbase/types/TestCopyOnWriteMaps.java</h3>
 <table border="0" class="table table-striped">
 <tr class="b">
 <th>Severity</th>
@@ -76929,9 +84237,69 @@
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>'(' is followed by whitespace.</td>
-<td>36</td></tr></table></div>
+<td>54</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>ParenPad</td>
+<td>')' is preceded with whitespace.</td>
+<td>54</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>ParenPad</td>
+<td>'(' is followed by whitespace.</td>
+<td>95</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>ParenPad</td>
+<td>'(' is followed by whitespace.</td>
+<td>103</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>ParenPad</td>
+<td>'(' is followed by whitespace.</td>
+<td>111</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>ParenPad</td>
+<td>'(' is followed by whitespace.</td>
+<td>124</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>ParenPad</td>
+<td>'(' is followed by whitespace.</td>
+<td>137</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>ParenPad</td>
+<td>'(' is followed by whitespace.</td>
+<td>178</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>ParenPad</td>
+<td>'(' is followed by whitespace.</td>
+<td>182</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>ParenPad</td>
+<td>'(' is followed by whitespace.</td>
+<td>250</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>ParenPad</td>
+<td>')' is preceded with whitespace.</td>
+<td>250</td></tr></table></div>
 <div class="section">
-<h3 id="org.apache.hadoop.hbase.security.AuthMethod.java">org/apache/hadoop/hbase/security/AuthMethod.java</h3>
+<h3 id="org.apache.hadoop.hbase.types.TestStruct.java">org/apache/hadoop/hbase/types/TestStruct.java</h3>
 <table border="0" class="table table-striped">
 <tr class="b">
 <th>Severity</th>
@@ -76941,18 +84309,192 @@
 <th>Line</th></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.security.UserGroupInformation' import.</td>
-<td>27</td></tr>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def modifier' has incorrect indentation level 8, expected level should be one of the following: 4, 6.</td>
+<td>93</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>VisibilityModifier</td>
-<td>Variable 'authenticationMethod' must be private and have accessor methods.</td>
-<td>39</td></tr></table></div>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>95</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if' has incorrect indentation level 10, expected level should be one of the following: 6, 8.</td>
+<td>95</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>96</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if' has incorrect indentation level 10, expected level should be one of the following: 6, 8.</td>
+<td>96</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>97</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if' has incorrect indentation level 10, expected level should be one of the following: 6, 8.</td>
+<td>97</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def' child has incorrect indentation level 10, expected level should be one of the following: 6, 8.</td>
+<td>98</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def rcurly' has incorrect indentation level 8, expected level should be one of the following: 4, 6.</td>
+<td>99</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'object def rcurly' has incorrect indentation level 6, expected level should be one of the following: 2, 4.</td>
+<td>100</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'else' construct must use '{}'s.</td>
+<td>237</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>LeftCurly</td>
+<td>'{' at column 40 should have line break after.</td>
+<td>306</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>LeftCurly</td>
+<td>'{' at column 29 should have line break after.</td>
+<td>309</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>LeftCurly</td>
+<td>'{' at column 33 should have line break after.</td>
+<td>312</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>LeftCurly</td>
+<td>'{' at column 34 should have line break after.</td>
+<td>315</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>LeftCurly</td>
+<td>'{' at column 40 should have line break after.</td>
+<td>326</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>LeftCurly</td>
+<td>'{' at column 40 should have line break after.</td>
+<td>377</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>LeftCurly</td>
+<td>'{' at column 29 should have line break after.</td>
+<td>380</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>LeftCurly</td>
+<td>'{' at column 33 should have line break after.</td>
+<td>383</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>LeftCurly</td>
+<td>'{' at column 34 should have line break after.</td>
+<td>386</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>LeftCurly</td>
+<td>'{' at column 40 should have line break after.</td>
+<td>398</td></tr></table></div>
 <div class="section">
-<h3 id="org.apache.hadoop.hbase.security.CryptoAESUnwrapHandler.java">org/apache/hadoop/hbase/security/CryptoAESUnwrapHandler.java</h3>
+<h3 id="org.apache.hadoop.hbase.types.TestUnion2.java">org/apache/hadoop/hbase/types/TestUnion2.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>87</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>88</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'else' construct must use '{}'s.</td>
+<td>110</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.AbstractByteRange.java">org/apache/hadoop/hbase/util/AbstractByteRange.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>108</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>119</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>175</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>182</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.AbstractFileStatusFilter.java">org/apache/hadoop/hbase/util/AbstractFileStatusFilter.java</h3>
 <table border="0" class="table table-striped">
 <tr class="a">
 <th>Severity</th>
@@ -76964,298 +84506,22 @@
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
-<td>Wrong order for 'org.apache.yetus.audience.InterfaceAudience' import.</td>
-<td>25</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.io.crypto.aes.CryptoAES' import.</td>
-<td>26</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.security.CryptoAESWrapHandler.java">org/apache/hadoop/hbase/security/CryptoAESWrapHandler.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.yetus.audience.InterfaceAudience' import.</td>
-<td>30</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.io.crypto.aes.CryptoAES' import.</td>
-<td>31</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.security.EncryptionUtil.java">org/apache/hadoop/hbase/security/EncryptionUtil.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.client.ColumnFamilyDescriptor' import.</td>
-<td>37</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.io.crypto.aes.CryptoAES' import.</td>
-<td>43</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>69</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>123</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>124</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.security.HBaseKerberosUtils.java">org/apache/hadoop/hbase/security/HBaseKerberosUtils.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.security.UserGroupInformation' import.</td>
-<td>37</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>HideUtilityClassConstructor</td>
-<td>Utility classes should not have a public or default constructor.</td>
-<td>39</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.security.HBasePolicyProvider.java">org/apache/hadoop/hbase/security/HBasePolicyProvider.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
-<td>21</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.security.authorize.PolicyProvider' import.</td>
-<td>26</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.security.HBaseSaslRpcClient.java">org/apache/hadoop/hbase/security/HBaseSaslRpcClient.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.io.crypto.aes.CryptoAES' import.</td>
-<td>39</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.io.WritableUtils' import.</td>
-<td>41</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>89</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>188</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>misc</td>
-<td>ArrayTypeStyle</td>
-<td>Array brackets at illegal position.</td>
-<td>215</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>251</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.security.HBaseSaslRpcServer.java">org/apache/hadoop/hbase/security/HBaseSaslRpcServer.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.security.UserGroupInformation' import.</td>
-<td>40</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.security.HadoopSecurityEnabledUserProviderForTesting.java">org/apache/hadoop/hbase/security/HadoopSecurityEnabledUserProviderForTesting.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>RedundantImport</td>
-<td>Redundant import from the same package - org.apache.hadoop.hbase.security.UserProvider.</td>
-<td>20</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.security.NettyHBaseRpcConnectionHeaderHandler.java">org/apache/hadoop/hbase/security/NettyHBaseRpcConnectionHeaderHandler.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
-<td>27</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.io.crypto.aes.CryptoAES' import.</td>
-<td>29</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.security.NettyHBaseSaslRpcClient.java">org/apache/hadoop/hbase/security/NettyHBaseSaslRpcClient.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'java.io.IOException' import.</td>
-<td>23</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.security.token.Token' import.</td>
-<td>30</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.security.NettyHBaseSaslRpcClientHandler.java">org/apache/hadoop/hbase/security/NettyHBaseSaslRpcClientHandler.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'java.io.IOException' import.</td>
-<td>26</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.ipc.FallbackDisallowedException' import.</td>
-<td>33</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.security.SaslChallengeDecoder.java">org/apache/hadoop/hbase/security/SaslChallengeDecoder.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'java.io.IOException' import.</td>
+<td>Wrong order for 'org.apache.hadoop.fs.FileStatus' import.</td>
 <td>24</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.ipc.RemoteException' import.</td>
-<td>29</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.security.SaslStatus.java">org/apache/hadoop/hbase/security/SaslStatus.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>MethodParamPad</td>
-<td>'(' is preceded with whitespace.</td>
-<td>26</td></tr>
+<td>Wrong order for 'edu.umd.cs.findbugs.annotations.CheckForNull' import.</td>
+<td>29</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>MethodParamPad</td>
-<td>'(' is preceded with whitespace.</td>
-<td>27</td></tr></table></div>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 104).</td>
+<td>64</td></tr></table></div>
 <div class="section">
-<h3 id="org.apache.hadoop.hbase.security.SaslUnwrapHandler.java">org/apache/hadoop/hbase/security/SaslUnwrapHandler.java</h3>
+<h3 id="org.apache.hadoop.hbase.util.AbstractHBaseTool.java">org/apache/hadoop/hbase/util/AbstractHBaseTool.java</h3>
 <table border="0" class="table table-striped">
 <tr class="a">
 <th>Severity</th>
@@ -77265,12 +84531,12 @@
 <th>Line</th></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'javax.security.sasl.SaslClient' import.</td>
-<td>25</td></tr></table></div>
+<td>misc</td>
+<td>ArrayTypeStyle</td>
+<td>Array brackets at illegal position.</td>
+<td>277</td></tr></table></div>
 <div class="section">
-<h3 id="org.apache.hadoop.hbase.security.SaslUtil.java">org/apache/hadoop/hbase/security/SaslUtil.java</h3>
+<h3 id="org.apache.hadoop.hbase.util.AbstractPositionedByteRange.java">org/apache/hadoop/hbase/util/AbstractPositionedByteRange.java</h3>
 <table border="0" class="table table-striped">
 <tr class="a">
 <th>Severity</th>
@@ -77280,33 +84546,57 @@
 <th>Line</th></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>137</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>145</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.Addressing.java">org/apache/hadoop/hbase/util/Addressing.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
 <td>Utility classes should not have a public or default constructor.</td>
-<td>36</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.security.SecurityInfo.java">org/apache/hadoop/hbase/security/SecurityInfo.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
+<td>34</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.shaded.protobuf.generated.AdminProtos' import.</td>
-<td>25</td></tr>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>53</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.yetus.audience.InterfaceAudience' import.</td>
-<td>29</td></tr></table></div>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>54</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>120</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>124</td></tr></table></div>
 <div class="section">
-<h3 id="org.apache.hadoop.hbase.security.SecurityUtil.java">org/apache/hadoop/hbase/security/SecurityUtil.java</h3>
+<h3 id="org.apache.hadoop.hbase.util.AtomicUtils.java">org/apache/hadoop/hbase/util/AtomicUtils.java</h3>
 <table border="0" class="table table-striped">
 <tr class="b">
 <th>Severity</th>
@@ -77321,7 +84611,70 @@
 <td>Utility classes should not have a public or default constructor.</td>
 <td>27</td></tr></table></div>
 <div class="section">
-<h3 id="org.apache.hadoop.hbase.security.Superusers.java">org/apache/hadoop/hbase/security/Superusers.java</h3>
+<h3 id="org.apache.hadoop.hbase.util.AvlUtil.java">org/apache/hadoop/hbase/util/AvlUtil.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>158</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>206</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>234</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>238</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>242</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>262</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>431</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>520</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>521</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.BaseTestHBaseFsck.java">org/apache/hadoop/hbase/util/BaseTestHBaseFsck.java</h3>
 <table border="0" class="table table-striped">
 <tr class="b">
 <th>Severity</th>
@@ -77332,11 +84685,140 @@
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>84</td></tr></table></div>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>222</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>223</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>224</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>235</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>258</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def' child has incorrect indentation level 5, expected level should be 4.</td>
+<td>282</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>347</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>348</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>350</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>376</td></tr></table></div>
 <div class="section">
-<h3 id="org.apache.hadoop.hbase.security.TestSecureIPC.java">org/apache/hadoop/hbase/security/TestSecureIPC.java</h3>
+<h3 id="org.apache.hadoop.hbase.util.BloomContext.java">org/apache/hadoop/hbase/util/BloomContext.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.io.hfile.HFile' import.</td>
+<td>25</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>48</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>49</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>70</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>71</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.BloomFilter.java">org/apache/hadoop/hbase/util/BloomFilter.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.nio.ByteBuff' import.</td>
+<td>24</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.BloomFilterChunk.java">org/apache/hadoop/hbase/util/BloomFilterChunk.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.regionserver.BloomType' import.</td>
+<td>29</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>106</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.BloomFilterFactory.java">org/apache/hadoop/hbase/util/BloomFilterFactory.java</h3>
 <table border="0" class="table table-striped">
 <tr class="b">
 <th>Severity</th>
@@ -77349,33 +84831,144 @@
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
+<td>96</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>115</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>158</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>159</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>160</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>205</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>206</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.BloomFilterUtil.java">org/apache/hadoop/hbase/util/BloomFilterUtil.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>75</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>76</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>105</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>106</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>120</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>121</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>122</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>140</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>141</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>142</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>155</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>156</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
 <td>190</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>220</td></tr>
+<td>191</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>231</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 108).</td>
-<td>276</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>misc</td>
-<td>ArrayTypeStyle</td>
-<td>Array brackets at illegal position.</td>
-<td>284</td></tr></table></div>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def modifier' has incorrect indentation level 3, expected level should be 2.</td>
+<td>259</td></tr></table></div>
 <div class="section">
-<h3 id="org.apache.hadoop.hbase.security.TestUser.java">org/apache/hadoop/hbase/security/TestUser.java</h3>
+<h3 id="org.apache.hadoop.hbase.util.BloomFilterWriter.java">org/apache/hadoop/hbase/util/BloomFilterWriter.java</h3>
 <table border="0" class="table table-striped">
 <tr class="b">
 <th>Severity</th>
@@ -77386,11 +84979,11 @@
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
-<td>AvoidStarImport</td>
-<td>Using the '.*' form of import should be avoided - org.junit.Assert.*.</td>
-<td>20</td></tr></table></div>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.regionserver.CellSink' import.</td>
+<td>24</td></tr></table></div>
 <div class="section">
-<h3 id="org.apache.hadoop.hbase.security.TestUsersOperationsWithSecureHadoop.java">org/apache/hadoop/hbase/security/TestUsersOperationsWithSecureHadoop.java</h3>
+<h3 id="org.apache.hadoop.hbase.util.BoundedPriorityBlockingQueue.java">org/apache/hadoop/hbase/util/BoundedPriorityBlockingQueue.java</h3>
 <table border="0" class="table table-striped">
 <tr class="b">
 <th>Severity</th>
@@ -77400,57 +84993,894 @@
 <th>Line</th></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>93</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.security.User.java">org/apache/hadoop/hbase/security/User.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>182</td></tr>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'java.util.concurrent.BlockingQueue' import.</td>
+<td>23</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>184</td></tr>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'java.util.Collection' import.</td>
+<td>25</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'class def modifier' has incorrect indentation level 3, expected level should be 2.</td>
-<td>295</td></tr>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'java.util.AbstractQueue' import.</td>
+<td>28</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>317</td></tr>
+<td>95</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>160</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>177</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>194</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>200</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>324</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>326</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>328</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.ByteBufferUtils.java">org/apache/hadoop/hbase/util/ByteBufferUtils.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def modifier' has incorrect indentation level 3, expected level should be 2.</td>
+<td>395</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def modifier' has incorrect indentation level 3, expected level should be 2.</td>
+<td>417</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if' has incorrect indentation level 5, expected level should be 4.</td>
+<td>422</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if' child has incorrect indentation level 7, expected level should be 6.</td>
+<td>423</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if rcurly' has incorrect indentation level 5, expected level should be 4.</td>
+<td>424</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'else' child has incorrect indentation level 7, expected level should be 6.</td>
+<td>425</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'else rcurly' has incorrect indentation level 5, expected level should be 4.</td>
+<td>426</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def rcurly' has incorrect indentation level 3, expected level should be 2.</td>
+<td>427</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>573</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>608</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>689</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>690</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>691</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>692</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>693</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>844</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>845</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>846</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>865</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>897</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>959</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>960</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>976</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>977</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1009</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1010</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1033</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1043</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1044</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1097</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1098</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1099</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1100</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1119</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1120</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1121</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1122</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1140</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1141</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1142</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1143</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1144</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>1168</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>1178</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>1180</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.ByteRangeUtils.java">org/apache/hadoop/hbase/util/ByteRangeUtils.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>design</td>
+<td>HideUtilityClassConstructor</td>
+<td>Utility classes should not have a public or default constructor.</td>
+<td>33</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.Bytes.java">org/apache/hadoop/hbase/util/Bytes.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>205</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>206</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>252</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>371</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>402</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>420</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>584</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>601</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>626</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>627</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>654</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>373</td></tr></table></div>
+<td>775</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'else' child has incorrect indentation level 5, expected level should be 6.</td>
+<td>793</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>806</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>936</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>952</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>974</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>1023</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>1052</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>1072</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1088</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1103</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1113</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1114</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1115</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>1567</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>1568</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>1569</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>1570</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>1575</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>1599</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>1612</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>1613</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>1614</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>1641</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>1642</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>1652</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>1653</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>1662</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>1672</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>1779</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>1792</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>1793</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>1795</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>1803</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>LeftCurly</td>
+<td>'{' at column 3 should be on the previous line.</td>
+<td>1816</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>LeftCurly</td>
+<td>'{' at column 3 should be on the previous line.</td>
+<td>1825</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>1885</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>1886</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>1890</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'else' construct must use '{}'s.</td>
+<td>1892</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'for' construct must use '{}'s.</td>
+<td>1919</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>1993</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>1996</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'else' construct must use '{}'s.</td>
+<td>1999</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>2028</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>2031</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'else' construct must use '{}'s.</td>
+<td>2034</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>LeftCurly</td>
+<td>'{' at column 3 should be on the previous line.</td>
+<td>2049</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>2066</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>2093</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>2118</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'for' construct must use '{}'s.</td>
+<td>2135</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'while' construct must use '{}'s.</td>
+<td>2147</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>2160</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>2171</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>2172</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>2175</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>2357</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>2358</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>2359</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>2380</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>2381</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>2382</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>2408</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>2409</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>LeftCurly</td>
+<td>'{' at column 5 should be on the previous line.</td>
+<td>2436</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>2469</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'for' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>2476</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>2482</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>2483</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>2504</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>2505</td></tr></table></div>
 <div class="section">
-<h3 id="org.apache.hadoop.hbase.security.access.AccessControlClient.java">org/apache/hadoop/hbase/security/access/AccessControlClient.java</h3>
+<h3 id="org.apache.hadoop.hbase.util.ChecksumType.java">org/apache/hadoop/hbase/util/ChecksumType.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>89</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>104</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.ClassLoaderTestHelper.java">org/apache/hadoop/hbase/util/ClassLoaderTestHelper.java</h3>
 <table border="0" class="table table-striped">
 <tr class="a">
 <th>Severity</th>
@@ -77463,7 +85893,637 @@
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
 <td>Utility classes should not have a public or default constructor.</td>
-<td>44</td></tr>
+<td>46</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>misc</td>
+<td>ArrayTypeStyle</td>
+<td>Array brackets at illegal position.</td>
+<td>60</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>80</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>105</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>120</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>misc</td>
+<td>ArrayTypeStyle</td>
+<td>Array brackets at illegal position.</td>
+<td>186</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>198</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.ClassSize.java">org/apache/hadoop/hbase/util/ClassSize.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>design</td>
+<td>HideUtilityClassConstructor</td>
+<td>Utility classes should not have a public or default constructor.</td>
+<td>40</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>352</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>353</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>366</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>376</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>378</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>380</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>382</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>384</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>386</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>388</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>390</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>ParenPad</td>
+<td>'(' is followed by whitespace.</td>
+<td>442</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 112).</td>
+<td>492</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.Classes.java">org/apache/hadoop/hbase/util/Classes.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>design</td>
+<td>HideUtilityClassConstructor</td>
+<td>Utility classes should not have a public or default constructor.</td>
+<td>27</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.CollectionBackedScanner.java">org/apache/hadoop/hbase/util/CollectionBackedScanner.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.Cell' import.</td>
+<td>28</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.CommonFSUtils.java">org/apache/hadoop/hbase/util/CommonFSUtils.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 105).</td>
+<td>66</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>143</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>682</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.CompressionTest.java">org/apache/hadoop/hbase/util/CompressionTest.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
+<td>30</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.io.hfile.CacheConfig' import.</td>
+<td>40</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>design</td>
+<td>HideUtilityClassConstructor</td>
+<td>Utility classes should not have a public or default constructor.</td>
+<td>51</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>ParenPad</td>
+<td>'(' is followed by whitespace.</td>
+<td>113</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>121</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.ConcatenatedLists.java">org/apache/hadoop/hbase/util/ConcatenatedLists.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>82</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.ConcurrentMapUtils.java">org/apache/hadoop/hbase/util/ConcurrentMapUtils.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>design</td>
+<td>HideUtilityClassConstructor</td>
+<td>Utility classes should not have a public or default constructor.</td>
+<td>30</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>coding</td>
+<td>InnerAssignment</td>
+<td>Inner assignments should be avoided.</td>
+<td>61</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>coding</td>
+<td>InnerAssignment</td>
+<td>Inner assignments should be avoided.</td>
+<td>61</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>coding</td>
+<td>InnerAssignment</td>
+<td>Inner assignments should be avoided.</td>
+<td>62</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.ConfigurationUtil.java">org/apache/hadoop/hbase/util/ConfigurationUtil.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
+<td>22</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.util.StringUtils' import.</td>
+<td>24</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'java.util.AbstractMap' import.</td>
+<td>26</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.ConnectionCache.java">org/apache/hadoop/hbase/util/ConnectionCache.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.client.Admin' import.</td>
+<td>34</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>LeftCurly</td>
+<td>'{' at column 46 should have line break after.</td>
+<td>74</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>LeftCurly</td>
+<td>'{' at column 44 should have line break after.</td>
+<td>75</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>126</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.ConstantDelayQueue.java">org/apache/hadoop/hbase/util/ConstantDelayQueue.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>ParenPad</td>
+<td>'(' is followed by whitespace.</td>
+<td>48</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.CoprocessorClassLoader.java">org/apache/hadoop/hbase/util/CoprocessorClassLoader.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>design</td>
+<td>FinalClass</td>
+<td>Class CoprocessorClassLoader should be declared as final.</td>
+<td>77</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization rcurly' has incorrect indentation level 2, expected level should be one of the following: 6, 8.</td>
+<td>126</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 104).</td>
+<td>169</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>238</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def modifier' has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
+<td>264</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def' child has incorrect indentation level 10, expected level should be one of the following: 12, 14.</td>
+<td>266</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def rcurly' has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
+<td>267</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'object def rcurly' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
+<td>268</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>372</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>395</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>396</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.DirectMemoryUtils.java">org/apache/hadoop/hbase/util/DirectMemoryUtils.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>design</td>
+<td>HideUtilityClassConstructor</td>
+<td>Utility classes should not have a public or default constructor.</td>
+<td>48</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>121</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.DynamicClassLoader.java">org/apache/hadoop/hbase/util/DynamicClassLoader.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'synchronized' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>151</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if' has incorrect indentation level 8, expected level should be 6.</td>
+<td>152</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if' has incorrect indentation level 10, expected level should be 8.</td>
+<td>153</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if' child has incorrect indentation level 12, expected level should be 10.</td>
+<td>154</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if rcurly' has incorrect indentation level 10, expected level should be 8.</td>
+<td>155</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if rcurly' has incorrect indentation level 8, expected level should be 6.</td>
+<td>156</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'else' has incorrect indentation level 8, expected level should be 6.</td>
+<td>157</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'try' has incorrect indentation level 10, expected level should be 8.</td>
+<td>158</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if' has incorrect indentation level 12, expected level should be 10.</td>
+<td>159</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if' child has incorrect indentation level 14, expected level should be 12.</td>
+<td>160</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if rcurly' has incorrect indentation level 12, expected level should be 10.</td>
+<td>161</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'try' child has incorrect indentation level 12, expected level should be 10.</td>
+<td>162</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'try rcurly' has incorrect indentation level 10, expected level should be 8.</td>
+<td>163</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if' has incorrect indentation level 12, expected level should be 10.</td>
+<td>165</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if' child has incorrect indentation level 14, expected level should be 12.</td>
+<td>166</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if rcurly' has incorrect indentation level 12, expected level should be 10.</td>
+<td>167</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'catch' child has incorrect indentation level 12, expected level should be 10.</td>
+<td>168</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if' has incorrect indentation level 12, expected level should be 10.</td>
+<td>170</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if' child has incorrect indentation level 14, expected level should be 12.</td>
+<td>171</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if rcurly' has incorrect indentation level 12, expected level should be 10.</td>
+<td>172</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'catch' child has incorrect indentation level 12, expected level should be 10.</td>
+<td>173</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'catch rcurly' has incorrect indentation level 10, expected level should be 8.</td>
+<td>174</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'else rcurly' has incorrect indentation level 8, expected level should be 6.</td>
+<td>175</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'synchronized' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>176</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'synchronized rcurly' has incorrect indentation level 6, expected level should be 4.</td>
+<td>177</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>216</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.EncryptionTest.java">org/apache/hadoop/hbase/util/EncryptionTest.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
+<td>31</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>design</td>
+<td>FinalClass</td>
+<td>Class EncryptionTest should be declared as final.</td>
+<td>38</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
@@ -77475,55 +86535,19 @@
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>64</td></tr>
+<td>54</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>82</td></tr>
+<td>78</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>83</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>84</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>85</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>89</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>90</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 102).</td>
-<td>93</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 118).</td>
-<td>102</td></tr>
+<td>79</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
@@ -77547,1050 +86571,1596 @@
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>107</td></tr>
+<td>107</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.EnvironmentEdgeManager.java">org/apache/hadoop/hbase/util/EnvironmentEdgeManager.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>design</td>
+<td>FinalClass</td>
+<td>Class EnvironmentEdgeManager should be declared as final.</td>
+<td>62</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.EnvironmentEdgeManagerTestHelper.java">org/apache/hadoop/hbase/util/EnvironmentEdgeManagerTestHelper.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>design</td>
+<td>HideUtilityClassConstructor</td>
+<td>Utility classes should not have a public or default constructor.</td>
+<td>26</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.ExceptionUtil.java">org/apache/hadoop/hbase/util/ExceptionUtil.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>design</td>
+<td>FinalClass</td>
+<td>Class ExceptionUtil should be declared as final.</td>
+<td>36</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>43</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>44</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>53</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>60</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>62</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.FSHDFSUtils.java">org/apache/hadoop/hbase/util/FSHDFSUtils.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>108</td></tr>
+<td>55</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>109</td></tr>
+<td>56</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>118</td></tr>
+<td>113</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>119</td></tr>
+<td>114</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>198</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>221</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>223</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>275</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>276</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>277</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>278</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>280</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>284</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>303</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>304</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>305</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>315</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>316</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>317</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>332</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>333</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>334</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.FSRegionScanner.java">org/apache/hadoop/hbase/util/FSRegionScanner.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.fs.BlockLocation' import.</td>
+<td>30</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>RedundantImport</td>
+<td>Redundant import from the same package - org.apache.hadoop.hbase.util.FSUtils.</td>
+<td>34</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.FSTableDescriptors.java">org/apache/hadoop/hbase/util/FSTableDescriptors.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'edu.umd.cs.findbugs.annotations.Nullable' import.</td>
+<td>31</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder' import.</td>
+<td>45</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.Coprocessor' import.</td>
+<td>48</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.HConstants' import.</td>
+<td>50</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.TableDescriptors' import.</td>
+<td>54</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 118).</td>
+<td>126</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 108).</td>
+<td>133</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 119).</td>
+<td>139</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 118).</td>
+<td>149</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>229</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if' child has incorrect indentation level 7, expected level should be 6.</td>
+<td>238</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>274</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>312</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>324</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>358</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>377</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>393</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>406</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>409</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>424</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>427</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>443</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>447</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>449</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'new' has incorrect indentation level 2, expected level should be 4.</td>
+<td>478</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>531</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>533</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>535</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>540</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>564</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>597</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>604</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>632</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>660</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>714</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>742</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.FSUtils.java">org/apache/hadoop/hbase/util/FSUtils.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>120</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>124</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>125</td></tr>
+<td>137</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 111).</td>
-<td>136</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>139</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>140</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
 <td>141</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>154</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>142</td></tr>
+<td>177</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>151</td></tr>
+<td>178</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>152</td></tr>
+<td>180</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>156</td></tr>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>183</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>157</td></tr>
+<td>205</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 107).</td>
-<td>168</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>170</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>171</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>172</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>173</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>190</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>191</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>192</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>193</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>194</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>195</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>207</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>208</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>209</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>210</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>235</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.security.access.AccessControlFilter.java">org/apache/hadoop/hbase/security/access/AccessControlFilter.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.Cell' import.</td>
-<td>26</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>168</td></tr>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>230</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>172</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.security.access.AccessControlUtil.java">org/apache/hadoop/hbase/security/access/AccessControlUtil.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.protobuf.ProtobufUtil' import.</td>
-<td>30</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'com.google.protobuf.ByteString' import.</td>
-<td>39</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>FinalClass</td>
-<td>Class AccessControlUtil should be declared as final.</td>
-<td>46</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
-<td>389</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>390</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
-<td>391</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>392</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
-<td>393</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>394</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
-<td>395</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>396</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
-<td>397</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>398</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
-<td>412</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>413</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
-<td>414</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>415</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
-<td>416</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>417</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
-<td>418</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>419</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
-<td>420</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>421</td></tr>
+<td>250</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>492</td></tr>
+<td>278</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>280</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 10, expected level should be 8.</td>
+<td>286</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>290</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>301</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>302</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>305</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>324</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>327</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>337</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>367</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>370</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
-<td>Line is longer than 100 characters (found 110).</td>
-<td>497</td></tr>
+<td>Line is longer than 100 characters (found 102).</td>
+<td>387</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>403</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>406</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>420</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>424</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>463</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>478</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>518</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>580</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>622</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>623</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>627</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>631</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>669</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>700</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>702</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>774</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>791</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>810</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>939</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>963</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>981</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>982</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 105).</td>
-<td>504</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>521</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>549</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 116).</td>
-<td>561</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>670</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>701</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>720</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>761</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>777</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>817</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method call' child has incorrect indentation level 4, expected level should be 6.</td>
-<td>915</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.security.access.AccessController.java">org/apache/hadoop/hbase/security/access/AccessController.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.util.ByteRange' import.</td>
-<td>129</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'catch' child has incorrect indentation level 10, expected level should be 6.</td>
-<td>296</td></tr>
+<td>983</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>308</td></tr>
+<td>984</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>449</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>MethodLength</td>
-<td>Method length is 166 lines (max allowed is 150).</td>
-<td>451</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>564</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>809</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1044</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 101).</td>
-<td>1140</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
-<td>1313</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
-<td>1314</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>1315</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>1316</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
-<td>1317</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>1318</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>1319</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
-<td>1320</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>1321</td></tr>
+<td>985</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>1938</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>1942</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1951</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>1955</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.security.access.AuthResult.java">org/apache/hadoop/hbase/security/access/AuthResult.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.Cell' import.</td>
-<td>27</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>LeftCurly</td>
-<td>'{' at column 29 should have line break after.</td>
-<td>132</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 10, expected level should be 8.</td>
-<td>296</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 10, expected level should be 8.</td>
-<td>297</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.security.access.Permission.java">org/apache/hadoop/hbase/security/access/Permission.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.util.Bytes' import.</td>
-<td>35</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>LeftCurly</td>
-<td>'{' at column 24 should have line break after.</td>
-<td>59</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.security.access.SecureTestUtil.java">org/apache/hadoop/hbase/security/access/SecureTestUtil.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.util.JVMClusterUtil.RegionServerThread' import.</td>
-<td>60</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.junit.Assert.assertEquals' import.</td>
-<td>64</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>HideUtilityClassConstructor</td>
-<td>Utility classes should not have a public or default constructor.</td>
-<td>70</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>115</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>coding</td>
-<td>InnerAssignment</td>
-<td>Inner assignments should be avoided.</td>
-<td>256</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.security.access.ShadedAccessControlUtil.java">org/apache/hadoop/hbase/security/access/ShadedAccessControlUtil.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>HideUtilityClassConstructor</td>
-<td>Utility classes should not have a public or default constructor.</td>
-<td>49</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
-<td>76</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>77</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
-<td>78</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>79</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
-<td>80</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>81</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
-<td>82</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>83</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
-<td>84</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>85</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>151</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>152</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.security.access.TablePermission.java">org/apache/hadoop/hbase/security/access/TablePermission.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.util.Bytes' import.</td>
-<td>29</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.security.access.TestAccessControlFilter.java">org/apache/hadoop/hbase/security/access/TestAccessControlFilter.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>MethodParamPad</td>
-<td>'(' is preceded with whitespace.</td>
-<td>72</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.security.access.TestAccessController.java">org/apache/hadoop/hbase/security/access/TestAccessController.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'implements' has incorrect indentation level 2, expected level should be 4.</td>
-<td>508</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def' child has incorrect indentation level 7, expected level should be one of the following: 8, 10.</td>
-<td>573</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def' child has incorrect indentation level 7, expected level should be one of the following: 8, 10.</td>
-<td>595</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>EmptyBlock</td>
-<td>Must have at least one statement.</td>
-<td>879</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>MethodLength</td>
-<td>Method length is 243 lines (max allowed is 150).</td>
-<td>1294</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 101).</td>
-<td>1452</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 101).</td>
-<td>1544</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>MethodLength</td>
-<td>Method length is 167 lines (max allowed is 150).</td>
-<td>1764</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 104).</td>
-<td>2243</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 112).</td>
-<td>2471</td></tr>
+<td>1032</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 103).</td>
-<td>2754</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.security.access.TestAccessController2.java">org/apache/hadoop/hbase/security/access/TestAccessController2.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>EmptyBlock</td>
-<td>Must have at least one statement.</td>
-<td>299</td></tr>
+<td>1034</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>EmptyBlock</td>
-<td>Must have at least one statement.</td>
-<td>325</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>ParenPad</td>
-<td>'(' is followed by whitespace.</td>
-<td>529</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.security.access.TestCellACLWithMultipleVersions.java">org/apache/hadoop/hbase/security/access/TestCellACLWithMultipleVersions.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1093</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
-<td>Line is longer than 100 characters (found 102).</td>
-<td>765</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.security.access.TestCellACLs.java">org/apache/hadoop/hbase/security/access/TestCellACLs.java</h3>
-<table border="0" class="table table-striped">
+<td>Line is longer than 100 characters (found 104).</td>
+<td>1095</td></tr>
 <tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 112).</td>
+<td>1106</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1196</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'final' has incorrect indentation level 2, expected level should be 4.</td>
+<td>1199</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>1200</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 101).</td>
+<td>1215</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1224</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 110).</td>
+<td>1242</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 101).</td>
+<td>1264</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>ParenPad</td>
+<td>'(' is followed by whitespace.</td>
+<td>1290</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1365</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>1369</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1388</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>1393</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>1416</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>1429</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 101).</td>
+<td>1593</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 110).</td>
+<td>1595</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1689</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1707</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>1716</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1723</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1725</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>1729</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.FSVisitor.java">org/apache/hadoop/hbase/util/FSVisitor.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.fs.FileStatus' import.</td>
+<td>27</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
-<td>MethodLength</td>
-<td>Method length is 221 lines (max allowed is 150).</td>
-<td>151</td></tr>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 113).</td>
+<td>58</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 115).</td>
+<td>81</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.FileStatusFilter.java">org/apache/hadoop/hbase/util/FileStatusFilter.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.fs.FileStatus' import.</td>
+<td>22</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.GetJavaProperty.java">org/apache/hadoop/hbase/util/GetJavaProperty.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>misc</td>
+<td>ArrayTypeStyle</td>
+<td>Array brackets at illegal position.</td>
+<td>28</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.HBaseConfTool.java">org/apache/hadoop/hbase/util/HBaseConfTool.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
+<td>23</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>design</td>
+<td>HideUtilityClassConstructor</td>
+<td>Utility classes should not have a public or default constructor.</td>
+<td>30</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>misc</td>
+<td>ArrayTypeStyle</td>
+<td>Array brackets at illegal position.</td>
+<td>32</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.HBaseFsck.java">org/apache/hadoop/hbase/util/HBaseFsck.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>705</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if' child has incorrect indentation level 11, expected level should be 10.</td>
+<td>763</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>841</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>design</td>
+<td>VisibilityModifier</td>
+<td>Variable 'regionName' must be private and have accessor methods.</td>
+<td>868</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>design</td>
+<td>VisibilityModifier</td>
+<td>Variable 'metaFirstKey' must be private and have accessor methods.</td>
+<td>869</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>design</td>
+<td>VisibilityModifier</td>
+<td>Variable 'metaLastKey' must be private and have accessor methods.</td>
+<td>870</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>design</td>
+<td>VisibilityModifier</td>
+<td>Variable 'storesFirstKey' must be private and have accessor methods.</td>
+<td>871</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>design</td>
+<td>VisibilityModifier</td>
+<td>Variable 'storesLastKey' must be private and have accessor methods.</td>
+<td>872</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>MethodParamPad</td>
+<td>'(' is preceded with whitespace.</td>
+<td>874</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>928</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>930</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>1005</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
 <td>ParenPad</td>
 <td>')' is preceded with whitespace.</td>
-<td>245</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.security.access.TestNamespaceCommands.java">org/apache/hadoop/hbase/security/access/TestNamespaceCommands.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>167</td></tr>
+<td>1041</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>169</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.security.access.TestTablePermissions.java">org/apache/hadoop/hbase/security/access/TestTablePermissions.java</h3>
-<table border="0" class="table table-striped">
+<td>1138</td></tr>
 <tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>1143</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>1193</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>1197</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 118).</td>
+<td>1203</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 113).</td>
+<td>1204</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 104).</td>
+<td>1212</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 113).</td>
+<td>1213</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 101).</td>
+<td>1215</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>1229</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1363</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1364</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1366</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 102).</td>
+<td>1384</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1385</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>1389</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1400</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 109).</td>
+<td>1419</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1420</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 104).</td>
+<td>1449</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 123).</td>
+<td>1452</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 102).</td>
+<td>1463</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1605</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>1606</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>1609</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if' has incorrect indentation level 7, expected level should be 6.</td>
+<td>1644</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if' child has incorrect indentation level 9, expected level should be 8.</td>
+<td>1647</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if rcurly' has incorrect indentation level 7, expected level should be 6.</td>
+<td>1648</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>1776</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>ParenPad</td>
+<td>')' is preceded with whitespace.</td>
+<td>1966</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>2095</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>2137</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>MethodLength</td>
+<td>Method length is 232 lines (max allowed is 150).</td>
+<td>2158</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>2161</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>2233</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>2396</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
+<td>2606</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>2647</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>2648</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'.' has incorrect indentation level 10, expected level should be 12.</td>
+<td>2674</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>design</td>
+<td>VisibilityModifier</td>
+<td>Variable 'errorCount' must be private and have accessor methods.</td>
+<td>2872</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>2936</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 104).</td>
+<td>3102</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 104).</td>
+<td>3173</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 115).</td>
+<td>3486</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 108).</td>
+<td>3529</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 107).</td>
-<td>132</td></tr>
+<td>3534</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 104).</td>
+<td>3535</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 111).</td>
+<td>3542</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 116).</td>
+<td>3547</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 107).</td>
+<td>3554</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 106).</td>
+<td>3556</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 113).</td>
+<td>3559</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 145).</td>
+<td>3561</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 104).</td>
+<td>3562</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 179).</td>
+<td>3563</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 113).</td>
+<td>3565</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>3590</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>3591</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>LeftCurly</td>
+<td>'{' at column 39 should have line break after.</td>
+<td>3607</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>MethodLength</td>
+<td>Method length is 229 lines (max allowed is 150).</td>
+<td>3617</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.HBaseFsckRepair.java">org/apache/hadoop/hbase/util/HBaseFsckRepair.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>design</td>
+<td>HideUtilityClassConstructor</td>
+<td>Utility classes should not have a public or default constructor.</td>
+<td>55</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 20, expected level should be 19.</td>
-<td>442</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.security.access.TestWithDisabledAuthorization.java">org/apache/hadoop/hbase/security/access/TestWithDisabledAuthorization.java</h3>
-<table border="0" class="table table-striped">
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>70</td></tr>
 <tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>87</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>88</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>89</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>90</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>109</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.HBaseHomePath.java">org/apache/hadoop/hbase/util/HBaseHomePath.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>MethodLength</td>
-<td>Method length is 165 lines (max allowed is 150).</td>
-<td>242</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>MethodLength</td>
-<td>Method length is 301 lines (max allowed is 150).</td>
-<td>468</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>ParenPad</td>
-<td>')' is preceded with whitespace.</td>
-<td>971</td></tr></table></div>
+<td>design</td>
+<td>FinalClass</td>
+<td>Class HBaseHomePath should be declared as final.</td>
+<td>24</td></tr></table></div>
 <div class="section">
-<h3 id="org.apache.hadoop.hbase.security.access.ZKPermissionWatcher.java">org/apache/hadoop/hbase/security/access/ZKPermissionWatcher.java</h3>
+<h3 id="org.apache.hadoop.hbase.util.HFileArchiveTestingUtil.java">org/apache/hadoop/hbase/util/HFileArchiveTestingUtil.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>design</td>
+<td>FinalClass</td>
+<td>Class HFileArchiveTestingUtil should be declared as final.</td>
+<td>42</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'java.io.Closeable' import.</td>
-<td>34</td></tr>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>90</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>104</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>136</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>231</td></tr>
+<td>138</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>258</td></tr>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>193</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>259</td></tr>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'else' construct must use '{}'s.</td>
+<td>194</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>278</td></tr></table></div>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>202</td></tr></table></div>
 <div class="section">
-<h3 id="org.apache.hadoop.hbase.security.token.AuthenticationKey.java">org/apache/hadoop/hbase/security/token/AuthenticationKey.java</h3>
+<h3 id="org.apache.hadoop.hbase.util.HFileArchiveUtil.java">org/apache/hadoop/hbase/util/HFileArchiveUtil.java</h3>
 <table border="0" class="table table-striped">
 <tr class="b">
 <th>Severity</th>
@@ -78600,18 +88170,57 @@
 <th>Line</th></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'java.io.DataInput' import.</td>
-<td>23</td></tr>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>181</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.util.Bytes' import.</td>
-<td>29</td></tr></table></div>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>182</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>185</td></tr></table></div>
 <div class="section">
-<h3 id="org.apache.hadoop.hbase.security.token.AuthenticationTokenIdentifier.java">org/apache/hadoop/hbase/security/token/AuthenticationTokenIdentifier.java</h3>
+<h3 id="org.apache.hadoop.hbase.util.HFileTestUtil.java">org/apache/hadoop/hbase/util/HFileTestUtil.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>design</td>
+<td>HideUtilityClassConstructor</td>
+<td>Utility classes should not have a public or default constructor.</td>
+<td>54</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
+<td>77</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
+<td>91</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
+<td>105</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.Hash.java">org/apache/hadoop/hbase/util/Hash.java</h3>
 <table border="0" class="table table-striped">
 <tr class="a">
 <th>Severity</th>
@@ -78621,18 +88230,87 @@
 <th>Line</th></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.protobuf.ProtobufUtil' import.</td>
-<td>26</td></tr>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>102</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.HashKey.java">org/apache/hadoop/hbase/util/HashKey.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>36</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.HashedBytes.java">org/apache/hadoop/hbase/util/HashedBytes.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>53</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'com.google.protobuf.ByteString' import.</td>
-<td>32</td></tr></table></div>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>55</td></tr></table></div>
 <div class="section">
-<h3 id="org.apache.hadoop.hbase.security.token.AuthenticationTokenSecretManager.java">org/apache/hadoop/hbase/security/token/AuthenticationTokenSecretManager.java</h3>
+<h3 id="org.apache.hadoop.hbase.util.JVM.java">org/apache/hadoop/hbase/util/JVM.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 14, expected level should be one of the following: 12, 23, 24.</td>
+<td>162</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>coding</td>
+<td>InnerAssignment</td>
+<td>Inner assignments should be avoided.</td>
+<td>167</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>207</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>208</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>coding</td>
+<td>InnerAssignment</td>
+<td>Inner assignments should be avoided.</td>
+<td>294</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.JVMClusterUtil.java">org/apache/hadoop/hbase/util/JVMClusterUtil.java</h3>
 <table border="0" class="table table-striped">
 <tr class="b">
 <th>Severity</th>
@@ -78651,57 +88329,321 @@
 <td>imports</td>
 <td>ImportOrder</td>
 <td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
-<td>30</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 103).</td>
-<td>84</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 104).</td>
-<td>85</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.security.token.AuthenticationTokenSelector.java">org/apache/hadoop/hbase/security/token/AuthenticationTokenSelector.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.io.Text' import.</td>
-<td>26</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.security.token.SecureTestCluster.java">org/apache/hadoop/hbase/security/token/SecureTestCluster.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'java.io.File' import.</td>
 <td>32</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
 <td>Utility classes should not have a public or default constructor.</td>
-<td>37</td></tr></table></div>
+<td>39</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>78</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>125</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>160</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>161</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>242</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>243</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>315</td></tr></table></div>
 <div class="section">
-<h3 id="org.apache.hadoop.hbase.security.token.TestTokenAuthentication.java">org/apache/hadoop/hbase/security/token/TestTokenAuthentication.java</h3>
+<h3 id="org.apache.hadoop.hbase.util.JenkinsHash.java">org/apache/hadoop/hbase/util/JenkinsHash.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>86</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>87</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>90</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>91</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>93</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>96</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>99</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>102</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>MethodLength</td>
+<td>Method length is 158 lines (max allowed is 150).</td>
+<td>104</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>coding</td>
+<td>InnerAssignment</td>
+<td>Inner assignments should be avoided.</td>
+<td>109</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>coding</td>
+<td>InnerAssignment</td>
+<td>Inner assignments should be avoided.</td>
+<td>109</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
+<td>189</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>190</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
+<td>191</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>192</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
+<td>193</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>194</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
+<td>195</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>196</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
+<td>197</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>198</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
+<td>199</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>200</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
+<td>201</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>202</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
+<td>203</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>204</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
+<td>205</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>206</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
+<td>207</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>208</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
+<td>209</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>210</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
+<td>211</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>213</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>214</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
+<td>215</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>216</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.JvmPauseMonitor.java">org/apache/hadoop/hbase/util/JvmPauseMonitor.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.metrics.JvmPauseMonitorSource' import.</td>
+<td>30</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
+<td>31</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>design</td>
+<td>FinalClass</td>
+<td>Class GcTimes should be declared as final.</td>
+<td>122</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.KeyLocker.java">org/apache/hadoop/hbase/util/KeyLocker.java</h3>
 <table border="0" class="table table-striped">
 <tr class="b">
 <th>Severity</th>
@@ -78713,28 +88655,40 @@
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
-<td>'lambda arguments' has incorrect indentation level 10, expected level should be 8.</td>
-<td>268</td></tr>
+<td>'method def modifier' has incorrect indentation level 12, expected level should be one of the following: 6, 8.</td>
+<td>54</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 111).</td>
-<td>438</td></tr>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def' child has incorrect indentation level 14, expected level should be one of the following: 8, 10.</td>
+<td>56</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 113).</td>
-<td>439</td></tr>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def rcurly' has incorrect indentation level 12, expected level should be one of the following: 6, 8.</td>
+<td>57</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 112).</td>
-<td>467</td></tr></table></div>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'object def rcurly' has incorrect indentation level 10, expected level should be one of the following: 4, 6.</td>
+<td>58</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>64</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>67</td></tr></table></div>
 <div class="section">
-<h3 id="org.apache.hadoop.hbase.security.token.TestZKSecretWatcher.java">org/apache/hadoop/hbase/security/token/TestZKSecretWatcher.java</h3>
+<h3 id="org.apache.hadoop.hbase.util.LeaseNotRecoveredException.java">org/apache/hadoop/hbase/util/LeaseNotRecoveredException.java</h3>
 <table border="0" class="table table-striped">
 <tr class="a">
 <th>Severity</th>
@@ -78746,10 +88700,130 @@
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
-<td>'extends' has incorrect indentation level 2, expected level should be 4.</td>
-<td>79</td></tr></table></div>
+<td>'ctor def' child has incorrect indentation level 6, expected level should be 4.</td>
+<td>39</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'ctor def' child has incorrect indentation level 6, expected level should be 4.</td>
+<td>43</td></tr></table></div>
 <div class="section">
-<h3 id="org.apache.hadoop.hbase.security.token.TokenProvider.java">org/apache/hadoop/hbase/security/token/TokenProvider.java</h3>
+<h3 id="org.apache.hadoop.hbase.util.LoadTestDataGeneratorWithMOB.java">org/apache/hadoop/hbase/util/LoadTestDataGeneratorWithMOB.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>66</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.LoadTestDataGeneratorWithTags.java">org/apache/hadoop/hbase/util/LoadTestDataGeneratorWithTags.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.Cell' import.</td>
+<td>25</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.ArrayBackedTag' import.</td>
+<td>30</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.LoadTestTool.java">org/apache/hadoop/hbase/util/LoadTestTool.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.client.Admin' import.</td>
+<td>45</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 102).</td>
+<td>336</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'if' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>586</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>MethodLength</td>
+<td>Method length is 191 lines (max allowed is 150).</td>
+<td>595</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>misc</td>
+<td>ArrayTypeStyle</td>
+<td>Array brackets at illegal position.</td>
+<td>668</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>912</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.MD5Hash.java">org/apache/hadoop/hbase/util/MD5Hash.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>design</td>
+<td>HideUtilityClassConstructor</td>
+<td>Utility classes should not have a public or default constructor.</td>
+<td>34</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>40</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>53</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>54</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.ManualEnvironmentEdge.java">org/apache/hadoop/hbase/util/ManualEnvironmentEdge.java</h3>
 <table border="0" class="table table-striped">
 <tr class="a">
 <th>Severity</th>
@@ -78762,9 +88836,36 @@
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 109).</td>
-<td>111</td></tr></table></div>
+<td>24</td></tr></table></div>
 <div class="section">
-<h3 id="org.apache.hadoop.hbase.security.token.TokenUtil.java">org/apache/hadoop/hbase/security/token/TokenUtil.java</h3>
+<h3 id="org.apache.hadoop.hbase.util.MapreduceDependencyClasspathTool.java">org/apache/hadoop/hbase/util/MapreduceDependencyClasspathTool.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil' import.</td>
+<td>24</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 107).</td>
+<td>53</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 106).</td>
+<td>54</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.Methods.java">org/apache/hadoop/hbase/util/Methods.java</h3>
 <table border="0" class="table table-striped">
 <tr class="a">
 <th>Severity</th>
@@ -78777,9 +88878,9 @@
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
 <td>Utility classes should not have a public or default constructor.</td>
-<td>55</td></tr></table></div>
+<td>32</td></tr></table></div>
 <div class="section">
-<h3 id="org.apache.hadoop.hbase.security.token.ZKSecretWatcher.java">org/apache/hadoop/hbase/security/token/ZKSecretWatcher.java</h3>
+<h3 id="org.apache.hadoop.hbase.util.MockServer.java">org/apache/hadoop/hbase/util/MockServer.java</h3>
 <table border="0" class="table table-striped">
 <tr class="a">
 <th>Severity</th>
@@ -78789,18 +88890,150 @@
 <th>Line</th></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'java.io.IOException' import.</td>
-<td>24</td></tr>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>54</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
-<td>30</td></tr></table></div>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>61</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>62</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>65</td></tr></table></div>
 <div class="section">
-<h3 id="org.apache.hadoop.hbase.security.visibility.CellVisibility.java">org/apache/hadoop/hbase/security/visibility/CellVisibility.java</h3>
+<h3 id="org.apache.hadoop.hbase.util.ModifyRegionUtils.java">org/apache/hadoop/hbase/util/ModifyRegionUtils.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>106</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>111</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>132</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 117).</td>
+<td>136</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>138</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>171</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>200</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'.' has incorrect indentation level 4, expected level should be 6.</td>
+<td>237</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.MultiThreadedAction.java">org/apache/hadoop/hbase/util/MultiThreadedAction.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 117).</td>
+<td>81</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 119).</td>
+<td>82</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>MethodLength</td>
+<td>Method length is 166 lines (max allowed is 150).</td>
+<td>326</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>541</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.MultiThreadedReader.java">org/apache/hadoop/hbase/util/MultiThreadedReader.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>LeftCurly</td>
+<td>'{' at column 1 should be on the previous line.</td>
+<td>39</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.MultiThreadedReaderWithACL.java">org/apache/hadoop/hbase/util/MultiThreadedReaderWithACL.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 104).</td>
+<td>112</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.MultiThreadedUpdater.java">org/apache/hadoop/hbase/util/MultiThreadedUpdater.java</h3>
 <table border="0" class="table table-striped">
 <tr class="b">
 <th>Severity</th>
@@ -78812,22 +89045,694 @@
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.util.Bytes' import.</td>
-<td>21</td></tr>
+<td>Wrong order for 'org.apache.hadoop.hbase.util.test.LoadTestDataGenerator' import.</td>
+<td>48</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 111).</td>
+<td>169</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 18, expected level should be 20.</td>
+<td>206</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 20, expected level should be 22.</td>
+<td>207</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 20, expected level should be 22.</td>
+<td>208</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 20, expected level should be 22.</td>
+<td>209</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 20, expected level should be 22.</td>
+<td>210</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 20, expected level should be 22.</td>
+<td>211</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 18, expected level should be 20.</td>
+<td>212</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 20, expected level should be 22.</td>
+<td>213</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 20, expected level should be 22.</td>
+<td>216</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 20, expected level should be 22.</td>
+<td>217</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 20, expected level should be 22.</td>
+<td>218</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 20, expected level should be 22.</td>
+<td>219</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 18, expected level should be 20.</td>
+<td>220</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 20, expected level should be 22.</td>
+<td>221</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 20, expected level should be 22.</td>
+<td>222</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 103).</td>
+<td>269</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'for' child has incorrect indentation level 7, expected level should be 6.</td>
+<td>324</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.MultiThreadedWriter.java">org/apache/hadoop/hbase/util/MultiThreadedWriter.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 113).</td>
+<td>126</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'for' child has incorrect indentation level 7, expected level should be 6.</td>
+<td>181</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.MultiThreadedWriterBase.java">org/apache/hadoop/hbase/util/MultiThreadedWriterBase.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>coding</td>
+<td>InnerAssignment</td>
+<td>Inner assignments should be avoided.</td>
+<td>155</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.MunkresAssignment.java">org/apache/hadoop/hbase/util/MunkresAssignment.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>95</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.MurmurHash3.java">org/apache/hadoop/hbase/util/MurmurHash3.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
+<td>69</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>70</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
+<td>72</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>73</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
+<td>75</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>76</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>77</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>78</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>79</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>80</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
+<td>81</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.NettyEventLoopGroupConfig.java">org/apache/hadoop/hbase/util/NettyEventLoopGroupConfig.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'java.util.concurrent.ThreadFactory' import.</td>
+<td>31</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.Order.java">org/apache/hadoop/hbase/util/Order.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>LeftCurly</td>
+<td>'{' at column 29 should have line break after.</td>
+<td>33</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>LeftCurly</td>
+<td>'{' at column 33 should have line break after.</td>
+<td>36</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>LeftCurly</td>
+<td>'{' at column 30 should have line break after.</td>
+<td>45</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>LeftCurly</td>
+<td>'{' at column 29 should have line break after.</td>
+<td>56</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>LeftCurly</td>
+<td>'{' at column 33 should have line break after.</td>
+<td>59</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>LeftCurly</td>
+<td>'{' at column 44 should have line break after.</td>
+<td>63</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>LeftCurly</td>
+<td>'{' at column 40 should have line break after.</td>
+<td>68</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>LeftCurly</td>
+<td>'{' at column 30 should have line break after.</td>
+<td>72</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.OrderedBytes.java">org/apache/hadoop/hbase/util/OrderedBytes.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>design</td>
+<td>HideUtilityClassConstructor</td>
+<td>Utility classes should not have a public or default constructor.</td>
+<td>268</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>346</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>coding</td>
+<td>InnerAssignment</td>
+<td>Inner assignments should be avoided.</td>
+<td>346</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>348</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>463</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>464</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>465</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>466</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>467</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>468</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>469</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>470</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>471</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>ParenPad</td>
+<td>'(' is followed by whitespace.</td>
+<td>581</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>ParenPad</td>
+<td>'(' is followed by whitespace.</td>
+<td>582</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'while' construct must use '{}'s.</td>
+<td>604</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>coding</td>
+<td>EmptyStatement</td>
+<td>Empty statement.</td>
+<td>605</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>LeftCurly</td>
+<td>'{' at column 37 should have line break after.</td>
+<td>651</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>LeftCurly</td>
+<td>'{' at column 36 should have line break after.</td>
+<td>652</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>LeftCurly</td>
+<td>'{' at column 49 should have line break after.</td>
+<td>726</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>LeftCurly</td>
+<td>'{' at column 48 should have line break after.</td>
+<td>727</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>LeftCurly</td>
+<td>'{' at column 60 should have line break after.</td>
+<td>728</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>836</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>920</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>921</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>922</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>923</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>942</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>943</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>944</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>961</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>977</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'for' construct must use '{}'s.</td>
-<td>67</td></tr>
+<td>985</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>coding</td>
+<td>EmptyStatement</td>
+<td>Empty statement.</td>
+<td>986</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>68</td></tr></table></div>
+<td>1003</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'else' construct must use '{}'s.</td>
+<td>1005</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'for' construct must use '{}'s.</td>
+<td>1102</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>coding</td>
+<td>EmptyStatement</td>
+<td>Empty statement.</td>
+<td>1103</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>1120</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>1142</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>1164</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>1199</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'for' construct must use '{}'s.</td>
+<td>1756</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>coding</td>
+<td>EmptyStatement</td>
+<td>Empty statement.</td>
+<td>1757</td></tr></table></div>
 <div class="section">
-<h3 id="org.apache.hadoop.hbase.security.visibility.DefaultVisibilityLabelServiceImpl.java">org/apache/hadoop/hbase/security/visibility/DefaultVisibilityLabelServiceImpl.java</h3>
+<h3 id="org.apache.hadoop.hbase.util.Pair.java">org/apache/hadoop/hbase/util/Pair.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>28</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>29</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>LeftCurly</td>
+<td>'{' at column 1 should be on the previous line.</td>
+<td>33</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>LeftCurly</td>
+<td>'{' at column 3 should be on the previous line.</td>
+<td>42</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>LeftCurly</td>
+<td>'{' at column 3 should be on the previous line.</td>
+<td>51</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>LeftCurly</td>
+<td>'{' at column 3 should be on the previous line.</td>
+<td>73</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>LeftCurly</td>
+<td>'{' at column 3 should be on the previous line.</td>
+<td>82</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>LeftCurly</td>
+<td>'{' at column 3 should be on the previous line.</td>
+<td>91</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>LeftCurly</td>
+<td>'{' at column 3 should be on the previous line.</td>
+<td>100</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>LeftCurly</td>
+<td>'{' at column 3 should be on the previous line.</td>
+<td>105</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>LeftCurly</td>
+<td>'{' at column 3 should be on the previous line.</td>
+<td>112</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>LeftCurly</td>
+<td>'{' at column 3 should be on the previous line.</td>
+<td>119</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>120</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>122</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'else' construct must use '{}'s.</td>
+<td>124</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>LeftCurly</td>
+<td>'{' at column 3 should be on the previous line.</td>
+<td>130</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.PairOfSameType.java">org/apache/hadoop/hbase/util/PairOfSameType.java</h3>
 <table border="0" class="table table-striped">
 <tr class="b">
 <th>Severity</th>
@@ -78840,51 +89745,240 @@
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>343</td></tr>
+<td>30</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def' child has incorrect indentation level 5, expected level should be 4.</td>
+<td>65</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>78</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>80</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'else' construct must use '{}'s.</td>
+<td>82</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>103</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>104</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'else' construct must use '{}'s.</td>
+<td>105</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.PoolMap.java">org/apache/hadoop/hbase/util/PoolMap.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>coding</td>
+<td>InnerAssignment</td>
+<td>Inner assignments should be avoided.</td>
+<td>81</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
+<td>273</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>274</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
+<td>275</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>276</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
+<td>277</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>278</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>coding</td>
+<td>InnerAssignment</td>
+<td>Inner assignments should be avoided.</td>
+<td>403</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.PositionedByteRange.java">org/apache/hadoop/hbase/util/PositionedByteRange.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>168</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.PrettyPrinter.java">org/apache/hadoop/hbase/util/PrettyPrinter.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>design</td>
+<td>HideUtilityClassConstructor</td>
+<td>Utility classes should not have a public or default constructor.</td>
+<td>31</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>344</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>386</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>423</td></tr>
+<td>72</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>621</td></tr>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>73</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>ParenPad</td>
+<td>')' is preceded with whitespace.</td>
+<td>120</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>148</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.ProcessBasedLocalHBaseCluster.java">org/apache/hadoop/hbase/util/ProcessBasedLocalHBaseCluster.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>130</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.RedundantKVGenerator.java">org/apache/hadoop/hbase/util/RedundantKVGenerator.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'ctor def rparen' has incorrect indentation level 6, expected level should be 2.</td>
+<td>119</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.ReflectionUtils.java">org/apache/hadoop/hbase/util/ReflectionUtils.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'edu.umd.cs.findbugs.annotations.NonNull' import.</td>
+<td>35</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>design</td>
+<td>HideUtilityClassConstructor</td>
+<td>Utility classes should not have a public or default constructor.</td>
+<td>37</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.RegionMover.java">org/apache/hadoop/hbase/util/RegionMover.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>design</td>
+<td>FinalClass</td>
+<td>Class RegionMover should be declared as final.</td>
+<td>79</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>174</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>633</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>648</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>693</td></tr></table></div>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>208</td></tr></table></div>
 <div class="section">
-<h3 id="org.apache.hadoop.hbase.security.visibility.DefinedSetFilterScanLabelGenerator.java">org/apache/hadoop/hbase/security/visibility/DefinedSetFilterScanLabelGenerator.java</h3>
+<h3 id="org.apache.hadoop.hbase.util.RegionSplitCalculator.java">org/apache/hadoop/hbase/util/RegionSplitCalculator.java</h3>
 <table border="0" class="table table-striped">
 <tr class="a">
 <th>Severity</th>
@@ -78896,265 +89990,445 @@
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
-<td>28</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.security.visibility.EnforcingScanLabelGenerator.java">org/apache/hadoop/hbase/security/visibility/EnforcingScanLabelGenerator.java</h3>
-<table border="0" class="table table-striped">
+<td>Wrong order for 'org.apache.hadoop.hbase.util.Bytes.ByteArrayComparator' import.</td>
+<td>32</td></tr>
 <tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
-<td>28</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.security.visibility.ExpAsStringVisibilityLabelServiceImpl.java">org/apache/hadoop/hbase/security/visibility/ExpAsStringVisibilityLabelServiceImpl.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>52</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>447</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.security.visibility.ExpressionExpander.java">org/apache/hadoop/hbase/security/visibility/ExpressionExpander.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.security.visibility.expression.ExpressionNode' import.</td>
-<td>23</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.security.visibility.ExpressionParser.java">org/apache/hadoop/hbase/security/visibility/ExpressionParser.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.security.visibility.expression.ExpressionNode' import.</td>
-<td>26</td></tr>
+<td>86</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>76</td></tr>
+<td>88</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 102).</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
 <td>90</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
-<td>303</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>304</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
-<td>305</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>306</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
-<td>307</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>308</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
-<td>309</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>310</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.security.visibility.FeedUserAuthScanLabelGenerator.java">org/apache/hadoop/hbase/security/visibility/FeedUserAuthScanLabelGenerator.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
-<td>28</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.security.visibility.LabelFilteringScanLabelGenerator.java">org/apache/hadoop/hbase/security/visibility/LabelFilteringScanLabelGenerator.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
-<td>24</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>46</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>49</td></tr></table></div>
+<td>222</td></tr></table></div>
 <div class="section">
-<h3 id="org.apache.hadoop.hbase.security.visibility.LoadTestDataGeneratorWithVisibilityLabels.java">org/apache/hadoop/hbase/security/visibility/LoadTestDataGeneratorWithVisibilityLabels.java</h3>
+<h3 id="org.apache.hadoop.hbase.util.RegionSplitter.java">org/apache/hadoop/hbase/util/RegionSplitter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.client.Get' import.</td>
-<td>22</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.security.visibility.ScanLabelGenerator.java">org/apache/hadoop/hbase/security/visibility/ScanLabelGenerator.java</h3>
-<table border="0" class="table table-striped">
 <tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>design</td>
+<td>HideUtilityClassConstructor</td>
+<td>Utility classes should not have a public or default constructor.</td>
+<td>144</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.conf.Configurable' import.</td>
-<td>23</td></tr>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>393</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>36</td></tr>
+<td>433</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>MethodLength</td>
+<td>Method length is 198 lines (max allowed is 150).</td>
+<td>456</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>457</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>573</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>658</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>742</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>coding</td>
+<td>InnerAssignment</td>
+<td>Inner assignments should be avoided.</td>
+<td>751</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>37</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.security.visibility.SimpleScanLabelGenerator.java">org/apache/hadoop/hbase/security/visibility/SimpleScanLabelGenerator.java</h3>
-<table border="0" class="table table-striped">
+<td>782</td></tr>
 <tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>783</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>789</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>798</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>824</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>826</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.RetryCounter.java">org/apache/hadoop/hbase/util/RetryCounter.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
-<td>23</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.security.visibility.TestExpressionExpander.java">org/apache/hadoop/hbase/security/visibility/TestExpressionExpander.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>MethodLength</td>
-<td>Method length is 358 lines (max allowed is 150).</td>
-<td>41</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.security.visibility.TestExpressionParser.java">org/apache/hadoop/hbase/security/visibility/TestExpressionParser.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>MethodLength</td>
-<td>Method length is 253 lines (max allowed is 150).</td>
-<td>44</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
-<td>Line is longer than 100 characters (found 107).</td>
-<td>404</td></tr></table></div>
+<td>Line is longer than 100 characters (found 106).</td>
+<td>155</td></tr></table></div>
 <div class="section">
-<h3 id="org.apache.hadoop.hbase.security.visibility.TestVisibilityLabels.java">org/apache/hadoop/hbase/security/visibility/TestVisibilityLabels.java</h3>
+<h3 id="org.apache.hadoop.hbase.util.RollingStatCalculator.java">org/apache/hadoop/hbase/util/RollingStatCalculator.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>48</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>61</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>LeftCurly</td>
+<td>'{' at column 5 should be on the previous line.</td>
+<td>73</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>81</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>106</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.ServerCommandLine.java">org/apache/hadoop/hbase/util/ServerCommandLine.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
+<td>30</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>132</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>misc</td>
+<td>ArrayTypeStyle</td>
+<td>Array brackets at illegal position.</td>
+<td>147</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.ServerRegionReplicaUtil.java">org/apache/hadoop/hbase/util/ServerRegionReplicaUtil.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>119</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>158</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.ShutdownHookManager.java">org/apache/hadoop/hbase/util/ShutdownHookManager.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'else' construct must use '{}'s.</td>
+<td>67</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.SimpleByteRange.java">org/apache/hadoop/hbase/util/SimpleByteRange.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>coding</td>
+<td>EqualsHashCode</td>
+<td>Definition of 'equals()' without corresponding definition of 'hashCode()'.</td>
+<td>127</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.SimpleMutableByteRange.java">org/apache/hadoop/hbase/util/SimpleMutableByteRange.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>124</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>131</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>coding</td>
+<td>EqualsHashCode</td>
+<td>Definition of 'equals()' without corresponding definition of 'hashCode()'.</td>
+<td>225</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.SimplePositionedByteRange.java">org/apache/hadoop/hbase/util/SimplePositionedByteRange.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>LeftCurly</td>
+<td>'{' at column 57 should have line break after.</td>
+<td>132</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.SimplePositionedMutableByteRange.java">org/apache/hadoop/hbase/util/SimplePositionedMutableByteRange.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>183</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>190</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>217</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>224</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.Sleeper.java">org/apache/hadoop/hbase/util/Sleeper.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>45</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>80</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.StealJobQueue.java">org/apache/hadoop/hbase/util/StealJobQueue.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'java.util.Comparator' import.</td>
+<td>23</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>127</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.StoppableImplementation.java">org/apache/hadoop/hbase/util/StoppableImplementation.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.Stoppable' import.</td>
+<td>22</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.Strings.java">org/apache/hadoop/hbase/util/Strings.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>design</td>
+<td>HideUtilityClassConstructor</td>
+<td>Utility classes should not have a public or default constructor.</td>
+<td>27</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>74</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.TestBloomFilterChunk.java">org/apache/hadoop/hbase/util/TestBloomFilterChunk.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>115</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>155</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.TestBytes.java">org/apache/hadoop/hbase/util/TestBytes.java</h3>
 <table border="0" class="table table-striped">
 <tr class="b">
 <th>Severity</th>
@@ -79165,29 +90439,500 @@
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>whitespace</td>
+<td>MethodParamPad</td>
+<td>'(' is preceded with whitespace.</td>
+<td>102</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>MethodParamPad</td>
+<td>'(' is preceded with whitespace.</td>
+<td>107</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>MethodParamPad</td>
+<td>'(' is preceded with whitespace.</td>
+<td>108</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>MethodParamPad</td>
+<td>'(' is preceded with whitespace.</td>
+<td>110</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>MethodParamPad</td>
+<td>'(' is preceded with whitespace.</td>
+<td>111</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>misc</td>
+<td>UpperEll</td>
+<td>Should use uppercase 'L'.</td>
+<td>195</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>misc</td>
+<td>UpperEll</td>
+<td>Should use uppercase 'L'.</td>
+<td>195</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>misc</td>
+<td>UpperEll</td>
+<td>Should use uppercase 'L'.</td>
+<td>281</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>misc</td>
+<td>UpperEll</td>
+<td>Should use uppercase 'L'.</td>
+<td>281</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>414</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
 <td>ParenPad</td>
 <td>'(' is followed by whitespace.</td>
-<td>266</td></tr>
+<td>514</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>551</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>552</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>553</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>554</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>555</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>556</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>557</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
+<td>558</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>LeftCurly</td>
+<td>'{' at column 5 should be on the previous line.</td>
+<td>561</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>LeftCurly</td>
+<td>'{' at column 5 should be on the previous line.</td>
+<td>578</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>LeftCurly</td>
+<td>'{' at column 5 should be on the previous line.</td>
+<td>585</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.TestCompressionTest.java">org/apache/hadoop/hbase/util/TestCompressionTest.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>AvoidStarImport</td>
+<td>Using the '.*' form of import should be avoided - org.junit.Assert.*.</td>
+<td>20</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'try' child has incorrect indentation level 12, expected level should be 10.</td>
+<td>115</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'try' child has incorrect indentation level 12, expected level should be 10.</td>
+<td>116</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'try' child has incorrect indentation level 12, expected level should be 10.</td>
+<td>119</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'try' child has incorrect indentation level 12, expected level should be 10.</td>
+<td>120</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'try' child has incorrect indentation level 12, expected level should be 10.</td>
+<td>122</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'try' child has incorrect indentation level 12, expected level should be 10.</td>
+<td>123</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 104).</td>
+<td>123</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'try' child has incorrect indentation level 12, expected level should be 10.</td>
+<td>124</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'try' child has incorrect indentation level 12, expected level should be 10.</td>
+<td>125</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'try' child has incorrect indentation level 12, expected level should be 10.</td>
+<td>126</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'try' child has incorrect indentation level 12, expected level should be 10.</td>
+<td>129</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.TestCoprocessorClassLoader.java">org/apache/hadoop/hbase/util/TestCoprocessorClassLoader.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>63</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>159</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 108).</td>
+<td>161</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.TestCoprocessorScanPolicy.java">org/apache/hadoop/hbase/util/TestCoprocessorScanPolicy.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.junit.Assert.assertEquals' import.</td>
+<td>27</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.TestFSTableDescriptors.java">org/apache/hadoop/hbase/util/TestFSTableDescriptors.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 109).</td>
+<td>88</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
-<td>Line is longer than 100 characters (found 101).</td>
-<td>379</td></tr>
+<td>Line is longer than 100 characters (found 109).</td>
+<td>108</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>213</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 105).</td>
+<td>229</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 102).</td>
+<td>240</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 105).</td>
+<td>269</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 102).</td>
+<td>277</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 105).</td>
+<td>301</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 101).</td>
-<td>407</td></tr>
+<td>304</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 109).</td>
+<td>326</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 109).</td>
+<td>419</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.TestFSUtils.java">org/apache/hadoop/hbase/util/TestFSUtils.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>90</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>misc</td>
+<td>ArrayTypeStyle</td>
+<td>Array brackets at illegal position.</td>
+<td>110</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'try rcurly' has incorrect indentation level 6, expected level should be 4.</td>
+<td>137</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>misc</td>
+<td>ArrayTypeStyle</td>
+<td>Array brackets at illegal position.</td>
+<td>144</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>misc</td>
+<td>ArrayTypeStyle</td>
+<td>Array brackets at illegal position.</td>
+<td>179</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 122).</td>
+<td>337</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>473</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.TestHFileArchiveUtil.java">org/apache/hadoop/hbase/util/TestHFileArchiveUtil.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>AvoidStarImport</td>
+<td>Using the '.*' form of import should be avoided - org.junit.Assert.*.</td>
+<td>20</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 12, expected level should be one of the following: 10, 28.</td>
-<td>873</td></tr></table></div>
+<td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
+<td>73</td></tr></table></div>
 <div class="section">
-<h3 id="org.apache.hadoop.hbase.security.visibility.TestVisibilityLabelsOpWithDifferentUsersNoACL.java">org/apache/hadoop/hbase/security/visibility/TestVisibilityLabelsOpWithDifferentUsersNoACL.java</h3>
+<h3 id="org.apache.hadoop.hbase.util.TestIdLock.java">org/apache/hadoop/hbase/util/TestIdLock.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'for' construct must use '{}'s.</td>
+<td>102</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.TestIdReadWriteLock.java">org/apache/hadoop/hbase/util/TestIdReadWriteLock.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'for' construct must use '{}'s.</td>
+<td>123</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>133</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>135</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>136</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>137</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>140</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>141</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>142</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>143</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.TestMiniClusterLoadEncoded.java">org/apache/hadoop/hbase/util/TestMiniClusterLoadEncoded.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>whitespace</td>
+<td>ParenPad</td>
+<td>')' is preceded with whitespace.</td>
+<td>50</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.TestMiniClusterLoadSequential.java">org/apache/hadoop/hbase/util/TestMiniClusterLoadSequential.java</h3>
 <table border="0" class="table table-striped">
 <tr class="a">
 <th>Severity</th>
@@ -79199,10 +90944,10 @@
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 14, expected level should be 12.</td>
-<td>153</td></tr></table></div>
+<td>'array initialization' child has incorrect indentation level 10, expected level should be 8.</td>
+<td>103</td></tr></table></div>
 <div class="section">
-<h3 id="org.apache.hadoop.hbase.security.visibility.TestVisibilityLabelsReplication.java">org/apache/hadoop/hbase/security/visibility/TestVisibilityLabelsReplication.java</h3>
+<h3 id="org.apache.hadoop.hbase.util.TestOrderedBytes.java">org/apache/hadoop/hbase/util/TestOrderedBytes.java</h3>
 <table border="0" class="table table-striped">
 <tr class="a">
 <th>Severity</th>
@@ -79220,73 +90965,274 @@
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
-<td>122</td></tr>
+<td>'array initialization lcurly' has incorrect indentation level 8, expected level should be one of the following: 4, 6.</td>
+<td>120</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
-<td>123</td></tr>
+<td>misc</td>
+<td>ArrayTypeStyle</td>
+<td>Array brackets at illegal position.</td>
+<td>124</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
-<td>125</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 6, expected level should be 4.</td>
-<td>126</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.security.visibility.TestVisibilityLabelsWithACL.java">org/apache/hadoop/hbase/security/visibility/TestVisibilityLabelsWithACL.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 14, expected level should be 12.</td>
-<td>283</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.security.visibility.TestVisibilityLabelsWithCustomVisLabService.java">org/apache/hadoop/hbase/security/visibility/TestVisibilityLabelsWithCustomVisLabService.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 113).</td>
-<td>63</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.security.visibility.TestVisibilityLabelsWithDefaultVisLabelService.java">org/apache/hadoop/hbase/security/visibility/TestVisibilityLabelsWithDefaultVisLabelService.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>211</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'else' construct must use '{}'s.</td>
-<td>147</td></tr></table></div>
+<td>212</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>278</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'else' construct must use '{}'s.</td>
+<td>279</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>422</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'else' construct must use '{}'s.</td>
+<td>423</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>490</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'else' construct must use '{}'s.</td>
+<td>491</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>558</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'else' construct must use '{}'s.</td>
+<td>559</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>625</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'else' construct must use '{}'s.</td>
+<td>626</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>694</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'else' construct must use '{}'s.</td>
+<td>695</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>764</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'else' construct must use '{}'s.</td>
+<td>765</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>misc</td>
+<td>ArrayTypeStyle</td>
+<td>Array brackets at illegal position.</td>
+<td>785</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>834</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'else' construct must use '{}'s.</td>
+<td>835</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>955</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'else' construct must use '{}'s.</td>
+<td>956</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>1032</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'else' construct must use '{}'s.</td>
+<td>1033</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>misc</td>
+<td>UpperEll</td>
+<td>Should use uppercase 'L'.</td>
+<td>1085</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>misc</td>
+<td>UpperEll</td>
+<td>Should use uppercase 'L'.</td>
+<td>1094</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>misc</td>
+<td>UpperEll</td>
+<td>Should use uppercase 'L'.</td>
+<td>1216</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>misc</td>
+<td>UpperEll</td>
+<td>Should use uppercase 'L'.</td>
+<td>1225</td></tr></table></div>
 <div class="section">
-<h3 id="org.apache.hadoop.hbase.security.visibility.TestVisibilityLabelsWithDeletes.java">org/apache/hadoop/hbase/security/visibility/TestVisibilityLabelsWithDeletes.java</h3>
+<h3 id="org.apache.hadoop.hbase.util.TestRegionSplitter.java">org/apache/hadoop/hbase/util/TestRegionSplitter.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'member def modifier' has incorrect indentation level 4, expected level should be 2.</td>
+<td>64</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'member def modifier' has incorrect indentation level 4, expected level should be 2.</td>
+<td>65</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'member def modifier' has incorrect indentation level 4, expected level should be 2.</td>
+<td>66</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'member def modifier' has incorrect indentation level 4, expected level should be 2.</td>
+<td>67</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'member def modifier' has incorrect indentation level 4, expected level should be 2.</td>
+<td>69</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def modifier' has incorrect indentation level 4, expected level should be 2.</td>
+<td>72</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def' child has incorrect indentation level 8, expected level should be 4.</td>
+<td>74</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def rcurly' has incorrect indentation level 4, expected level should be 2.</td>
+<td>75</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def modifier' has incorrect indentation level 4, expected level should be 2.</td>
+<td>77</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def' child has incorrect indentation level 8, expected level should be 4.</td>
+<td>79</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def rcurly' has incorrect indentation level 4, expected level should be 2.</td>
+<td>80</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.TestSimplePositionedMutableByteRange.java">org/apache/hadoop/hbase/util/TestSimplePositionedMutableByteRange.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method call' child has incorrect indentation level 5, expected level should be 6.</td>
+<td>43</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method call' child has incorrect indentation level 5, expected level should be 6.</td>
+<td>53</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.TestSortedList.java">org/apache/hadoop/hbase/util/TestSortedList.java</h3>
 <table border="0" class="table table-striped">
 <tr class="a">
 <th>Severity</th>
@@ -79296,357 +91242,30 @@
 <th>Line</th></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>AvoidStarImport</td>
+<td>Using the '.*' form of import should be avoided - org.junit.Assert.*.</td>
+<td>20</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 116).</td>
+<td>78</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
-<td>MethodLength</td>
-<td>Method length is 155 lines (max allowed is 150).</td>
-<td>2581</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.security.visibility.TestVisibilityLablesWithGroups.java">org/apache/hadoop/hbase/security/visibility/TestVisibilityLablesWithGroups.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>MethodLength</td>
-<td>Method length is 240 lines (max allowed is 150).</td>
-<td>117</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.security.visibility.VisibilityClient.java">org/apache/hadoop/hbase/security/visibility/VisibilityClient.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>HideUtilityClassConstructor</td>
-<td>Utility classes should not have a public or default constructor.</td>
-<td>53</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>60</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>70</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>71</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>73</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>83</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>84</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>86</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>125</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>126</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>127</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>129</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>138</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>140</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>176</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>213</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>214</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>215</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>217</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.security.visibility.VisibilityConstants.java">org/apache/hadoop/hbase/security/visibility/VisibilityConstants.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.util.Bytes' import.</td>
-<td>23</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>HideUtilityClassConstructor</td>
-<td>Utility classes should not have a public or default constructor.</td>
-<td>25</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.security.visibility.VisibilityController.java">org/apache/hadoop/hbase/security/visibility/VisibilityController.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.HConstants.OperationStatusCode.SANITY_CHECK_FAILURE' import.</td>
-<td>26</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.util.Bytes' import.</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 116).</td>
 <td>113</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
-<td>Line is longer than 100 characters (found 101).</td>
-<td>210</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 102).</td>
-<td>219</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 101).</td>
-<td>242</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>482</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>483</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>610</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 108).</td>
-<td>751</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1085</td></tr></table></div>
+<td>Line is longer than 100 characters (found 106).</td>
+<td>165</td></tr></table></div>
 <div class="section">
-<h3 id="org.apache.hadoop.hbase.security.visibility.VisibilityExpEvaluator.java">org/apache/hadoop/hbase/security/visibility/VisibilityExpEvaluator.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.Cell' import.</td>
-<td>24</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.security.visibility.VisibilityLabelFilter.java">org/apache/hadoop/hbase/security/visibility/VisibilityLabelFilter.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.Cell' import.</td>
-<td>25</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.security.visibility.VisibilityLabelService.java">org/apache/hadoop/hbase/security/visibility/VisibilityLabelService.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment' import.</td>
-<td>27</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.security.visibility.VisibilityLabelServiceManager.java">org/apache/hadoop/hbase/security/visibility/VisibilityLabelServiceManager.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
-<td>25</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>FinalClass</td>
-<td>Class VisibilityLabelServiceManager should be declared as final.</td>
-<td>31</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>52</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.security.visibility.VisibilityLabelsCache.java">org/apache/hadoop/hbase/security/visibility/VisibilityLabelsCache.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.exceptions.DeserializationException' import.</td>
-<td>33</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>FinalClass</td>
-<td>Class VisibilityLabelsCache should be declared as final.</td>
-<td>48</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>79</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>80</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>82</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>259</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.security.visibility.VisibilityLabelsValidator.java">org/apache/hadoop/hbase/security/visibility/VisibilityLabelsValidator.java</h3>
+<h3 id="org.apache.hadoop.hbase.util.Threads.java">org/apache/hadoop/hbase/util/Threads.java</h3>
 <table border="0" class="table table-striped">
 <tr class="b">
 <th>Severity</th>
@@ -79659,123 +91278,60 @@
 <td>design</td>
 <td>HideUtilityClassConstructor</td>
 <td>Utility classes should not have a public or default constructor.</td>
-<td>27</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.security.visibility.VisibilityNewVersionBehaivorTracker.java">org/apache/hadoop/hbase/security/visibility/VisibilityNewVersionBehaivorTracker.java</h3>
-<table border="0" class="table table-striped">
+<td>45</td></tr>
 <tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>110</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>FinalClass</td>
-<td>Class TagInfo should be declared as final.</td>
-<td>56</td></tr>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>123</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
-<td>126</td></tr>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>124</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>127</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>130</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
-<td>131</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>132</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>133</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
-<td>136</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>137</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>140</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
-<td>141</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>142</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>143</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
-<td>144</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>145</td></tr></table></div>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>187</td></tr></table></div>
 <div class="section">
-<h3 id="org.apache.hadoop.hbase.security.visibility.VisibilityReplicationEndpoint.java">org/apache/hadoop/hbase/security/visibility/VisibilityReplicationEndpoint.java</h3>
+<h3 id="org.apache.hadoop.hbase.util.TimeOffsetEnvironmentEdge.java">org/apache/hadoop/hbase/util/TimeOffsetEnvironmentEdge.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>LeftCurly</td>
+<td>'{' at column 3 should be on the previous line.</td>
+<td>35</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>LeftCurly</td>
-<td>'{' at column 31 should have line break after.</td>
-<td>143</td></tr></table></div>
+<td>'{' at column 3 should be on the previous line.</td>
+<td>40</td></tr></table></div>
 <div class="section">
-<h3 id="org.apache.hadoop.hbase.security.visibility.VisibilityScanDeleteTracker.java">org/apache/hadoop/hbase/security/visibility/VisibilityScanDeleteTracker.java</h3>
+<h3 id="org.apache.hadoop.hbase.util.Triple.java">org/apache/hadoop/hbase/util/Triple.java</h3>
 <table border="0" class="table table-striped">
 <tr class="b">
 <th>Severity</th>
@@ -79785,141 +91341,24 @@
 <th>Line</th></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.regionserver.querymatcher.ScanDeleteTracker' import.</td>
-<td>29</td></tr>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>64</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.Cell' import.</td>
-<td>30</td></tr>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>66</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 113).</td>
-<td>127</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 115).</td>
-<td>130</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 120).</td>
-<td>140</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 122).</td>
-<td>143</td></tr></table></div>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>68</td></tr></table></div>
 <div class="section">
-<h3 id="org.apache.hadoop.hbase.security.visibility.VisibilityTestUtil.java">org/apache/hadoop/hbase/security/visibility/VisibilityTestUtil.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>HideUtilityClassConstructor</td>
-<td>Utility classes should not have a public or default constructor.</td>
-<td>22</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.security.visibility.VisibilityUtils.java">org/apache/hadoop/hbase/security/visibility/VisibilityUtils.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>HideUtilityClassConstructor</td>
-<td>Utility classes should not have a public or default constructor.</td>
-<td>72</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>90</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>106</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>126</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>128</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>147</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>149</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>231</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>237</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.security.visibility.ZKVisibilityLabelWatcher.java">org/apache/hadoop/hbase/security/visibility/ZKVisibilityLabelWatcher.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
-<td>25</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>137</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil.java">org/apache/hadoop/hbase/shaded/protobuf/ProtobufUtil.java</h3>
+<h3 id="org.apache.hadoop.hbase.util.UnsafeAccess.java">org/apache/hadoop/hbase/util/UnsafeAccess.java</h3>
 <table border="0" class="table table-striped">
 <tr class="b">
 <th>Severity</th>
@@ -79930,1170 +91369,63 @@
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>282</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>328</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>376</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>396</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>451</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
-<td>476</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>477</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
-<td>478</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>479</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
-<td>480</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>481</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
-<td>482</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>483</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
-<td>484</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>485</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
-<td>486</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>487</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
-<td>497</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>498</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
-<td>499</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>500</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
-<td>501</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>502</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
-<td>503</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>504</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
-<td>505</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>506</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
-<td>507</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>508</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>517</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>520</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>598</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>601</td></tr>
+<td>170</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>611</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>614</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 104).</td>
-<td>643</td></tr>
+<td>171</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>713</td></tr>
+<td>184</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>716</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>726</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>729</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 117).</td>
-<td>794</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 109).</td>
-<td>812</td></tr>
+<td>185</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>854</td></tr>
+<td>197</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>857</td></tr>
+<td>198</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>877</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 108).</td>
-<td>883</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>897</td></tr>
+<td>212</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>916</td></tr>
+<td>213</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>918</td></tr>
+<td>226</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>998</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1101</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1229</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1300</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1301</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1303</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>1317</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1354</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1355</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1356</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1358</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1368</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1369</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1371</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>1374</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1398</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1399</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>1469</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>1471</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1511</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>1514</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>1534</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>1540</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>1574</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1631</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1633</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
-<td>1638</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>1639</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
-<td>1640</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>1641</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
-<td>1642</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>1643</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
-<td>1644</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>1645</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
-<td>1646</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1656</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
-<td>1661</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>1662</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
-<td>1663</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>1664</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
-<td>1665</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>1666</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
-<td>1667</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>1668</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
-<td>1669</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>1670</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>1683</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1719</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1720</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1722</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 103).</td>
-<td>1724</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1751</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1752</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1753</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1771</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 130).</td>
-<td>1776</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1790</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1791</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1792</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 124).</td>
-<td>1795</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1810</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1812</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 124).</td>
-<td>1814</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 112).</td>
-<td>1824</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>1826</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 117).</td>
-<td>1843</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>1844</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 116).</td>
-<td>1845</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>1858</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>1876</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>1888</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 116).</td>
-<td>2091</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 104).</td>
-<td>2116</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>2164</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>2168</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 103).</td>
-<td>2209</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>2260</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>2264</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>2271</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>2273</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>2276</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>2291</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>2303</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>2307</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>2314</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>2316</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>2319</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>2334</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>2348</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>2367</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>2386</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>2417</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>2448</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>2462</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>2476</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>2490</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>2608</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>2631</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>2646</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>2661</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>2675</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>2689</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>2690</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>2691</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 116).</td>
-<td>2819</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 105).</td>
-<td>2923</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>2970</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>2983</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def modifier' has incorrect indentation level 3, expected level should be 2.</td>
-<td>3000</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def' child has incorrect indentation level 5, expected level should be 4.</td>
-<td>3002</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def' child has incorrect indentation level 5, expected level should be 4.</td>
-<td>3003</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def' child has incorrect indentation level 5, expected level should be 4.</td>
-<td>3005</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def' child has incorrect indentation level 5, expected level should be 4.</td>
-<td>3006</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def' child has incorrect indentation level 5, expected level should be 4.</td>
-<td>3007</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def rcurly' has incorrect indentation level 3, expected level should be 2.</td>
-<td>3008</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>3054</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>3055</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>3056</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>3058</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>3059</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>3062</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 101).</td>
-<td>3116</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 107).</td>
-<td>3131</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>3132</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 108).</td>
-<td>3154</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>3155</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'.' has incorrect indentation level 4, expected level should be 6.</td>
-<td>3176</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'.' has incorrect indentation level 4, expected level should be 6.</td>
-<td>3177</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'.' has incorrect indentation level 4, expected level should be 6.</td>
-<td>3178</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'.' has incorrect indentation level 4, expected level should be 6.</td>
-<td>3179</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'.' has incorrect indentation level 4, expected level should be 6.</td>
-<td>3180</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.shaded.protobuf.RequestConverter.java">org/apache/hadoop/hbase/shaded/protobuf/RequestConverter.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>189</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>190</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>191</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>192</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>193</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>194</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>231</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>232</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>233</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>234</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>235</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>236</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>237</td></tr>
+<td>227</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
@@ -81105,91 +91437,1312 @@
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>252</td></tr>
+<td>240</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>253</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
 <td>254</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>255</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>256</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>257</td></tr>
+<td>268</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>258</td></tr>
+<td>269</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>260</td></tr>
+<td>281</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>283</td></tr>
+<td>282</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
+<td>314</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>315</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>316</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>317</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>318</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>347</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>348</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>349</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>350</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>351</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>371</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>372</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>373</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>374</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>375</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>467</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>468</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.UnsafeAvailChecker.java">org/apache/hadoop/hbase/util/UnsafeAvailChecker.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>design</td>
+<td>FinalClass</td>
+<td>Class UnsafeAvailChecker should be declared as final.</td>
+<td>29</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.VersionInfo.java">org/apache/hadoop/hbase/util/VersionInfo.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>design</td>
+<td>HideUtilityClassConstructor</td>
+<td>Utility classes should not have a public or default constructor.</td>
+<td>33</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.Writables.java">org/apache/hadoop/hbase/util/Writables.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.io.DataInputBuffer' import.</td>
+<td>30</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>design</td>
+<td>HideUtilityClassConstructor</td>
+<td>Utility classes should not have a public or default constructor.</td>
+<td>36</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>92</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>94</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>95</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>97</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>100</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>111</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>113</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>114</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>116</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>120</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>146</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>158</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.ZKDataMigrator.java">org/apache/hadoop/hbase/util/ZKDataMigrator.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.zookeeper.ZKUtil' import.</td>
+<td>30</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>design</td>
+<td>FinalClass</td>
+<td>Class ZKDataMigrator should be declared as final.</td>
+<td>42</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>64</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>72</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 10, expected level should be 12.</td>
+<td>73</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 10, expected level should be 12.</td>
+<td>74</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>75</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 10, expected level should be 12.</td>
+<td>76</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 10, expected level should be 12.</td>
+<td>77</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>78</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 10, expected level should be 12.</td>
+<td>79</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 10, expected level should be 12.</td>
+<td>80</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>81</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 10, expected level should be 12.</td>
+<td>82</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'block' child has incorrect indentation level 10, expected level should be 12.</td>
+<td>83</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'case' child has incorrect indentation level 8, expected level should be 10.</td>
+<td>84</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>99</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>109</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.compaction.TestMajorCompactor.java">org/apache/hadoop/hbase/util/compaction/TestMajorCompactor.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.junit.After' import.</td>
+<td>30</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.junit.Assert.assertEquals' import.</td>
+<td>31</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.hbck.HFileCorruptionChecker.java">org/apache/hadoop/hbase/util/hbck/HFileCorruptionChecker.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
+<td>38</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>161</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>194</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>263</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>298</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>332</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 101).</td>
+<td>335</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>480</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>516</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>524</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.hbck.HbckTestingUtil.java">org/apache/hadoop/hbase/util/hbck/HbckTestingUtil.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
+<td>30</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>design</td>
+<td>HideUtilityClassConstructor</td>
+<td>Utility classes should not have a public or default constructor.</td>
+<td>35</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 101).</td>
+<td>87</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.hbck.OfflineMetaRebuildTestCore.java">org/apache/hadoop/hbase/util/hbck/OfflineMetaRebuildTestCore.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>128</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>129</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>130</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'Result' has incorrect indentation level 4, expected level should be 6.</td>
+<td>264</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.hbck.ReplicationChecker.java">org/apache/hadoop/hbase/util/hbck/ReplicationChecker.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'lambda arguments' has incorrect indentation level 8, expected level should be 6.</td>
+<td>111</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.test.LoadTestDataGenerator.java">org/apache/hadoop/hbase/util/test/LoadTestDataGenerator.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.client.Get' import.</td>
+<td>24</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>147</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>148</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>150</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>158</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>159</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>161</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.util.test.LoadTestDataGeneratorWithACL.java">org/apache/hadoop/hbase/util/test/LoadTestDataGeneratorWithACL.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.client.Delete' import.</td>
+<td>24</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.wal.AbstractFSWALProvider.java">org/apache/hadoop/hbase/wal/AbstractFSWALProvider.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.regionserver.wal.AbstractFSWAL' import.</td>
+<td>43</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>309</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>462</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>LeftCurly</td>
+<td>'{' at column 3 should be on the previous line.</td>
+<td>467</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.wal.BoundedGroupingStrategy.java">org/apache/hadoop/hbase/wal/BoundedGroupingStrategy.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.util.Bytes' import.</td>
+<td>28</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>60</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.wal.DisabledWALProvider.java">org/apache/hadoop/hbase/wal/DisabledWALProvider.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>LeftCurly</td>
+<td>'{' at column 49 should have line break after.</td>
+<td>189</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>213</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.wal.IOTestProvider.java">org/apache/hadoop/hbase/wal/IOTestProvider.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>176</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>177</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>185</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>coding</td>
+<td>InnerAssignment</td>
+<td>Inner assignments should be avoided.</td>
+<td>244</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>coding</td>
+<td>InnerAssignment</td>
+<td>Inner assignments should be avoided.</td>
+<td>246</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.wal.NamespaceGroupingStrategy.java">org/apache/hadoop/hbase/wal/NamespaceGroupingStrategy.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'org.apache.hadoop.hbase.util.Bytes' import.</td>
+<td>24</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.wal.NettyAsyncFSWALConfigHelper.java">org/apache/hadoop/hbase/wal/NettyAsyncFSWALConfigHelper.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 106).</td>
+<td>45</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.wal.TestBoundedRegionGroupingStrategy.java">org/apache/hadoop/hbase/wal/TestBoundedRegionGroupingStrategy.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 10, expected level should be one of the following: 8, 21.</td>
+<td>142</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 12, expected level should be one of the following: 10, 23.</td>
+<td>154</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 12, expected level should be one of the following: 10, 23.</td>
+<td>169</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.wal.TestFSHLogProvider.java">org/apache/hadoop/hbase/wal/TestFSHLogProvider.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>167</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>176</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>177</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>263</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>339</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.wal.TestWALFactory.java">org/apache/hadoop/hbase/wal/TestWALFactory.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>175</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 110).</td>
+<td>219</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>231</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'while' construct must use '{}'s.</td>
 <td>284</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'while' construct must use '{}'s.</td>
+<td>298</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>285</td></tr>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'while' construct must use '{}'s.</td>
+<td>305</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'while' construct must use '{}'s.</td>
+<td>321</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'while' construct must use '{}'s.</td>
+<td>328</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>332</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>337</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def' child has incorrect indentation level 5, expected level should be 4.</td>
+<td>397</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'try' has incorrect indentation level 10, expected level should be 8.</td>
+<td>457</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'try' child has incorrect indentation level 12, expected level should be 10.</td>
+<td>458</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'try rcurly' has incorrect indentation level 10, expected level should be 8.</td>
+<td>460</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'catch' child has incorrect indentation level 12, expected level should be 10.</td>
+<td>461</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'catch rcurly' has incorrect indentation level 10, expected level should be 8.</td>
+<td>462</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>475</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>540</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>286</td></tr>
+<td>616</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.wal.TestWALFiltering.java">org/apache/hadoop/hbase/wal/TestWALFiltering.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>113</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'org' has incorrect indentation level 2, expected level should be 4.</td>
+<td>114</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>149</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'org' has incorrect indentation level 2, expected level should be 4.</td>
+<td>150</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.wal.TestWALMethods.java">org/apache/hadoop/hbase/wal/TestWALMethods.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>287</td></tr>
+<td>84</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
+<td>130</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.wal.TestWALOpenAfterDNRollingStart.java">org/apache/hadoop/hbase/wal/TestWALOpenAfterDNRollingStart.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>288</td></tr>
+<td>102</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.wal.TestWALReaderOnSecureWAL.java">org/apache/hadoop/hbase/wal/TestWALReaderOnSecureWAL.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 106).</td>
+<td>93</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.wal.TestWALRootDir.java">org/apache/hadoop/hbase/wal/TestWALRootDir.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>133</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.wal.TestWALSplit.java">org/apache/hadoop/hbase/wal/TestWALSplit.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>EmptyBlock</td>
+<td>Must have at least one statement.</td>
+<td>113</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>289</td></tr>
+<td>226</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>227</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'while' construct must use '{}'s.</td>
+<td>241</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'while' construct must use '{}'s.</td>
+<td>695</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'while' construct must use '{}'s.</td>
+<td>830</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 10, expected level should be 8.</td>
+<td>901</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'array initialization' child has incorrect indentation level 10, expected level should be 8.</td>
+<td>902</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def modifier' has incorrect indentation level 6, expected level should be one of the following: 10, 12.</td>
+<td>926</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 12, 14.</td>
+<td>928</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 12, 14.</td>
+<td>929</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'method def rcurly' has incorrect indentation level 6, expected level should be one of the following: 10, 12.</td>
+<td>930</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>indentation</td>
+<td>Indentation</td>
+<td>'object def rcurly' has incorrect indentation level 4, expected level should be one of the following: 8, 10.</td>
+<td>931</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
+<td>1047</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>misc</td>
+<td>ArrayTypeStyle</td>
+<td>Array brackets at illegal position.</td>
+<td>1051</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 109).</td>
+<td>1208</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.wal.WAL.java">org/apache/hadoop/hbase/wal/WAL.java</h3>
+<table border="0" class="table table-striped">
+<tr class="a">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>107</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>109</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>110</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>112</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>sizes</td>
+<td>LineLength</td>
+<td>Line is longer than 100 characters (found 101).</td>
+<td>114</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>120</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>121</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>122</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>123</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>130</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>137</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>168</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>169</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>170</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>171</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>JavadocTagContinuationIndentation</td>
+<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
+<td>205</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.wal.WALEdit.java">org/apache/hadoop/hbase/wal/WALEdit.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>279</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.wal.WALFactory.java">org/apache/hadoop/hbase/wal/WALFactory.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>308</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.wal.WALKey.java">org/apache/hadoop/hbase/wal/WALKey.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>imports</td>
+<td>ImportOrder</td>
+<td>Wrong order for 'java.util.ArrayList' import.</td>
+<td>27</td></tr></table></div>
+<div class="section">
+<h3 id="org.apache.hadoop.hbase.wal.WALKeyImpl.java">org/apache/hadoop/hbase/wal/WALKeyImpl.java</h3>
+<table border="0" class="table table-striped">
+<tr class="b">
+<th>Severity</th>
+<th>Category</th>
+<th>Rule</th>
+<th>Message</th>
+<th>Line</th></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
@@ -81201,11673 +92754,114 @@
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>326</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>327</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>329</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>344</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>345</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>347</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>366</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>367</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>387</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>388</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>390</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>407</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>408</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>410</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>414</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>443</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>444</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>447</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>454</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>484</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>485</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>486</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>487</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>489</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>510</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>511</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>512</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>529</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>530</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>531</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>532</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>555</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>556</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>557</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>558</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>559</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>573</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>574</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>575</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>576</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>577</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>578</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 110).</td>
-<td>598</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>637</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'org' has incorrect indentation level 9, expected level should be 10.</td>
-<td>678</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>739</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'org' has incorrect indentation level 9, expected level should be 10.</td>
-<td>801</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>997</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1071</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1072</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1073</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1074</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1075</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1077</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1095</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1096</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1115</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1116</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1135</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1136</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1154</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1155</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1201</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1213</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1214</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1228</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1240</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1277</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1294</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1311</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1312</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1335</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1336</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1355</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1368</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1473</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1474</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1592</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1638</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1750</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1762</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1774</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1785</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 101).</td>
-<td>1788</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.shaded.protobuf.ResponseConverter.java">org/apache/hadoop/hbase/shaded/protobuf/ResponseConverter.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.util.StringUtils' import.</td>
-<td>36</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'edu.umd.cs.findbugs.annotations.Nullable' import.</td>
-<td>63</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>96</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>100</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>112</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>199</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>204</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>211</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>216</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>221</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>251</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def lparen' has incorrect indentation level 6, expected level should be 2.</td>
-<td>262</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>MethodParamPad</td>
-<td>'(' should be on the previous line.</td>
-<td>262</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>263</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>270</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>271</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>289</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>359</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>376</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>377</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>382</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 101).</td>
-<td>401</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 129).</td>
-<td>454</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 104).</td>
-<td>455</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 103).</td>
-<td>456</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.snapshot.ClientSnapshotDescriptionUtils.java">org/apache/hadoop/hbase/snapshot/ClientSnapshotDescriptionUtils.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.util.Bytes' import.</td>
-<td>25</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>HideUtilityClassConstructor</td>
-<td>Utility classes should not have a public or default constructor.</td>
-<td>31</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>57</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.snapshot.CorruptedSnapshotException.java">org/apache/hadoop/hbase/snapshot/CorruptedSnapshotException.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.client.SnapshotDescription' import.</td>
-<td>21</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.snapshot.CreateSnapshot.java">org/apache/hadoop/hbase/snapshot/CreateSnapshot.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'member def modifier' has incorrect indentation level 4, expected level should be 2.</td>
-<td>40</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'member def modifier' has incorrect indentation level 4, expected level should be 2.</td>
-<td>41</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'member def modifier' has incorrect indentation level 4, expected level should be 2.</td>
-<td>42</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def modifier' has incorrect indentation level 4, expected level should be 2.</td>
-<td>44</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def' child has incorrect indentation level 8, expected level should be 4.</td>
-<td>45</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def rcurly' has incorrect indentation level 4, expected level should be 2.</td>
-<td>46</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def modifier' has incorrect indentation level 4, expected level should be 2.</td>
-<td>48</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def' child has incorrect indentation level 8, expected level should be 4.</td>
-<td>50</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def' child has incorrect indentation level 8, expected level should be 4.</td>
-<td>51</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def' child has incorrect indentation level 8, expected level should be 4.</td>
-<td>52</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def rcurly' has incorrect indentation level 4, expected level should be 2.</td>
-<td>55</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def modifier' has incorrect indentation level 4, expected level should be 2.</td>
-<td>57</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def' child has incorrect indentation level 8, expected level should be 4.</td>
-<td>59</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def' child has incorrect indentation level 8, expected level should be 4.</td>
-<td>60</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def' child has incorrect indentation level 8, expected level should be 4.</td>
-<td>61</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if' has incorrect indentation level 8, expected level should be 4.</td>
-<td>62</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if' child has incorrect indentation level 10, expected level should be 6.</td>
-<td>63</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if' child has incorrect indentation level 10, expected level should be 6.</td>
-<td>64</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if rcurly' has incorrect indentation level 8, expected level should be 4.</td>
-<td>65</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def rcurly' has incorrect indentation level 4, expected level should be 2.</td>
-<td>66</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def modifier' has incorrect indentation level 4, expected level should be 2.</td>
-<td>68</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def' child has incorrect indentation level 8, expected level should be 4.</td>
-<td>70</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def' child has incorrect indentation level 8, expected level should be 4.</td>
-<td>71</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'try' has incorrect indentation level 8, expected level should be 4.</td>
-<td>72</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'try' child has incorrect indentation level 12, expected level should be 6.</td>
-<td>73</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'try' child has incorrect indentation level 12, expected level should be 6.</td>
-<td>74</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'try' child has incorrect indentation level 12, expected level should be 6.</td>
-<td>75</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'try rcurly' has incorrect indentation level 8, expected level should be 4.</td>
-<td>76</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'catch' child has incorrect indentation level 12, expected level should be 6.</td>
-<td>77</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'catch' child has incorrect indentation level 12, expected level should be 6.</td>
-<td>78</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'catch rcurly' has incorrect indentation level 8, expected level should be 4.</td>
-<td>79</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if' has incorrect indentation level 12, expected level should be 6.</td>
-<td>80</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if' child has incorrect indentation level 16, expected level should be 8.</td>
-<td>81</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if rcurly' has incorrect indentation level 12, expected level should be 6.</td>
-<td>82</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if' has incorrect indentation level 12, expected level should be 6.</td>
-<td>83</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if' child has incorrect indentation level 16, expected level should be 8.</td>
-<td>84</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if rcurly' has incorrect indentation level 12, expected level should be 6.</td>
-<td>85</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'finally rcurly' has incorrect indentation level 8, expected level should be 4.</td>
-<td>86</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def' child has incorrect indentation level 8, expected level should be 4.</td>
-<td>87</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def rcurly' has incorrect indentation level 4, expected level should be 2.</td>
-<td>88</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.snapshot.ExportSnapshot.java">org/apache/hadoop/hbase/snapshot/ExportSnapshot.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>276</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>277</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>542</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>545</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>549</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>552</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'object def rcurly' has incorrect indentation level 4, expected level should be one of the following: 6, 8.</td>
-<td>600</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>LeftCurly</td>
-<td>'{' at column 44 should have line break after.</td>
-<td>770</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>LeftCurly</td>
-<td>'{' at column 45 should have line break after.</td>
-<td>773</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>LeftCurly</td>
-<td>'{' at column 34 should have line break after.</td>
-<td>776</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>804</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>805</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>MethodLength</td>
-<td>Method length is 172 lines (max allowed is 150).</td>
-<td>939</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 102).</td>
-<td>981</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.snapshot.HBaseSnapshotException.java">org/apache/hadoop/hbase/snapshot/HBaseSnapshotException.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.client.SnapshotDescription' import.</td>
-<td>22</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.snapshot.MobSnapshotTestingUtils.java">org/apache/hadoop/hbase/snapshot/MobSnapshotTestingUtils.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>HideUtilityClassConstructor</td>
-<td>Utility classes should not have a public or default constructor.</td>
-<td>43</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>89</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>90</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>91</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>93</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>coding</td>
-<td>InnerAssignment</td>
-<td>Inner assignments should be avoided.</td>
-<td>127</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.snapshot.RestoreSnapshotException.java">org/apache/hadoop/hbase/snapshot/RestoreSnapshotException.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.client.SnapshotDescription' import.</td>
-<td>22</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.snapshot.RestoreSnapshotHelper.java">org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>LeftCurly</td>
-<td>'{' at column 3 should be on the previous line.</td>
-<td>157</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>381</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>422</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>437</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>452</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>566</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>584</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>638</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>661</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>727</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>804</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>818</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>819</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>820</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>821</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>822</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>823</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.snapshot.SnapshotCreationException.java">org/apache/hadoop/hbase/snapshot/SnapshotCreationException.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.client.SnapshotDescription' import.</td>
-<td>21</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.snapshot.SnapshotDescriptionUtils.java">org/apache/hadoop/hbase/snapshot/SnapshotDescriptionUtils.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>95</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 101).</td>
-<td>131</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
-<td>150</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
-<td>151</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>152</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 102).</td>
-<td>175</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>366</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>378</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>393</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>417</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.snapshot.SnapshotDoesNotExistException.java">org/apache/hadoop/hbase/snapshot/SnapshotDoesNotExistException.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.client.SnapshotDescription' import.</td>
-<td>21</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.snapshot.SnapshotExistsException.java">org/apache/hadoop/hbase/snapshot/SnapshotExistsException.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.client.SnapshotDescription' import.</td>
-<td>21</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.snapshot.SnapshotInfo.java">org/apache/hadoop/hbase/snapshot/SnapshotInfo.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>125</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>126</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>127</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>LeftCurly</td>
-<td>'{' at column 5 should be on the previous line.</td>
-<td>152</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>LeftCurly</td>
-<td>'{' at column 40 should have line break after.</td>
-<td>191</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>LeftCurly</td>
-<td>'{' at column 40 should have line break after.</td>
-<td>229</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>326</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>398</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 102).</td>
-<td>461</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>471</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'object def rcurly' has incorrect indentation level 4, expected level should be one of the following: 6, 8.</td>
-<td>482</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.snapshot.SnapshotManifest.java">org/apache/hadoop/hbase/snapshot/SnapshotManifest.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>172</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>338</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>422</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>460</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>563</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.snapshot.SnapshotManifestV2.java">org/apache/hadoop/hbase/snapshot/SnapshotManifestV2.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>147</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.snapshot.SnapshotTestingUtils.java">org/apache/hadoop/hbase/snapshot/SnapshotTestingUtils.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 105).</td>
-<td>209</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 105).</td>
-<td>211</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def modifier' has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>221</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def' child has incorrect indentation level 10, expected level should be one of the following: 12, 14.</td>
-<td>224</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def rcurly' has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>225</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'object def rcurly' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
-<td>226</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 152).</td>
-<td>231</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 158).</td>
-<td>238</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 103).</td>
-<td>267</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def modifier' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
-<td>421</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>424</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>425</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>426</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if' has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>427</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if' child has incorrect indentation level 10, expected level should be one of the following: 12, 14.</td>
-<td>428</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if' child has incorrect indentation level 10, expected level should be one of the following: 12, 14.</td>
-<td>429</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if rcurly' has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>430</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def rcurly' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
-<td>431</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'object def rcurly' has incorrect indentation level 4, expected level should be one of the following: 6, 8.</td>
-<td>432</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>562</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if' child has incorrect indentation level 14, expected level should be 12.</td>
-<td>576</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>594</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 104).</td>
-<td>632</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 104).</td>
-<td>642</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 103).</td>
-<td>776</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 102).</td>
-<td>791</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.snapshot.TablePartiallyOpenException.java">org/apache/hadoop/hbase/snapshot/TablePartiallyOpenException.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.util.Bytes' import.</td>
-<td>24</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'ctor def modifier' has incorrect indentation level 3, expected level should be 2.</td>
-<td>54</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'ctor def' child has incorrect indentation level 5, expected level should be 4.</td>
-<td>55</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'ctor def rcurly' has incorrect indentation level 3, expected level should be 2.</td>
-<td>56</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.snapshot.TestExportSnapshot.java">org/apache/hadoop/hbase/snapshot/TestExportSnapshot.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 102).</td>
-<td>210</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>227</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>320</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>EmptyBlock</td>
-<td>Must have at least one statement.</td>
-<td>325</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'object def rcurly' has incorrect indentation level 4, expected level should be one of the following: 6, 8.</td>
-<td>338</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.snapshot.TestExportSnapshotWithTemporaryDirectory.java">org/apache/hadoop/hbase/snapshot/TestExportSnapshotWithTemporaryDirectory.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 111).</td>
-<td>58</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.snapshot.TestFlushSnapshotFromClient.java">org/apache/hadoop/hbase/snapshot/TestFlushSnapshotFromClient.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>145</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>178</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>218</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>558</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.snapshot.TestRestoreSnapshotHelper.java">org/apache/hadoop/hbase/snapshot/TestRestoreSnapshotHelper.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 103).</td>
-<td>211</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 105).</td>
-<td>253</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.test.IntegrationTestBigLinkedList.java">org/apache/hadoop/hbase/test/IntegrationTestBigLinkedList.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 102).</td>
-<td>289</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 110).</td>
-<td>449</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>misc</td>
-<td>UpperEll</td>
-<td>Should use uppercase 'L'.</td>
-<td>629</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>MethodParamPad</td>
-<td>'(' is preceded with whitespace.</td>
-<td>644</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>LeftCurly</td>
-<td>'{' at column 50 should have line break after.</td>
-<td>661</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>misc</td>
-<td>UpperEll</td>
-<td>Should use uppercase 'L'.</td>
-<td>688</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>misc</td>
-<td>UpperEll</td>
-<td>Should use uppercase 'L'.</td>
-<td>692</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>misc</td>
-<td>UpperEll</td>
-<td>Should use uppercase 'L'.</td>
-<td>695</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>ParenPad</td>
-<td>')' is preceded with whitespace.</td>
-<td>738</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>896</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>981</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'for' construct must use '{}'s.</td>
-<td>983</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 4, expected level should be 6.</td>
-<td>1001</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>1015</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 111).</td>
-<td>1122</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 6, expected level should be 8.</td>
-<td>1123</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1139</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1140</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>1142</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1156</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1166</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1258</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 6, expected level should be 8.</td>
-<td>1262</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>1264</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>1287</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>1290</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 103).</td>
-<td>1432</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 106).</td>
-<td>1441</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 102).</td>
-<td>1501</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>1615</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>1618</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>1622</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'else' construct must use '{}'s.</td>
-<td>1624</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>ParenPad</td>
-<td>'(' is followed by whitespace.</td>
-<td>1684</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 101).</td>
-<td>1863</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.test.IntegrationTestBigLinkedListWithVisibility.java">org/apache/hadoop/hbase/test/IntegrationTestBigLinkedListWithVisibility.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 110).</td>
-<td>93</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 107).</td>
-<td>95</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>341</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 111).</td>
-<td>497</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 103).</td>
-<td>533</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 12, expected level should be one of the following: 10, 23.</td>
-<td>642</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.test.IntegrationTestLoadAndVerify.java">org/apache/hadoop/hbase/test/IntegrationTestLoadAndVerify.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def modifier' has incorrect indentation level 0, expected level should be 2.</td>
-<td>156</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def' child has incorrect indentation level 2, expected level should be 4.</td>
-<td>158</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if' has incorrect indentation level 2, expected level should be 4.</td>
-<td>159</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if' child has incorrect indentation level 4, expected level should be 6.</td>
-<td>160</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if rcurly' has incorrect indentation level 2, expected level should be 4.</td>
-<td>161</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def rcurly' has incorrect indentation level 0, expected level should be 2.</td>
-<td>162</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>LeftCurly</td>
-<td>'{' at column 3 should be on the previous line.</td>
-<td>171</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>ParenPad</td>
-<td>'(' is followed by whitespace.</td>
-<td>173</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>ParenPad</td>
-<td>'(' is followed by whitespace.</td>
-<td>173</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>ParenPad</td>
-<td>'(' is followed by whitespace.</td>
-<td>173</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>ParenPad</td>
-<td>')' is preceded with whitespace.</td>
-<td>173</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>ParenPad</td>
-<td>')' is preceded with whitespace.</td>
-<td>173</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>ParenPad</td>
-<td>')' is preceded with whitespace.</td>
-<td>173</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>ParenPad</td>
-<td>'(' is followed by whitespace.</td>
-<td>174</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>ParenPad</td>
-<td>'(' is followed by whitespace.</td>
-<td>174</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>ParenPad</td>
-<td>'(' is followed by whitespace.</td>
-<td>174</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>ParenPad</td>
-<td>')' is preceded with whitespace.</td>
-<td>174</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>ParenPad</td>
-<td>')' is preceded with whitespace.</td>
-<td>174</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>ParenPad</td>
-<td>')' is preceded with whitespace.</td>
-<td>174</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>ParenPad</td>
-<td>'(' is followed by whitespace.</td>
-<td>175</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>ParenPad</td>
-<td>'(' is followed by whitespace.</td>
-<td>175</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>ParenPad</td>
-<td>'(' is followed by whitespace.</td>
-<td>175</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>ParenPad</td>
-<td>')' is preceded with whitespace.</td>
-<td>175</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>ParenPad</td>
-<td>')' is preceded with whitespace.</td>
-<td>175</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>ParenPad</td>
-<td>')' is preceded with whitespace.</td>
-<td>175</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>ParenPad</td>
-<td>'(' is followed by whitespace.</td>
-<td>176</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>ParenPad</td>
-<td>'(' is followed by whitespace.</td>
-<td>176</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>ParenPad</td>
-<td>'(' is followed by whitespace.</td>
-<td>176</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>ParenPad</td>
-<td>')' is preceded with whitespace.</td>
-<td>176</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>ParenPad</td>
-<td>')' is preceded with whitespace.</td>
-<td>176</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>ParenPad</td>
-<td>')' is preceded with whitespace.</td>
-<td>176</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>ParenPad</td>
-<td>'(' is followed by whitespace.</td>
-<td>177</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>ParenPad</td>
-<td>'(' is followed by whitespace.</td>
-<td>177</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>ParenPad</td>
-<td>'(' is followed by whitespace.</td>
-<td>177</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>ParenPad</td>
-<td>')' is preceded with whitespace.</td>
-<td>177</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>ParenPad</td>
-<td>')' is preceded with whitespace.</td>
-<td>177</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>ParenPad</td>
-<td>')' is preceded with whitespace.</td>
-<td>177</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>ParenPad</td>
-<td>'(' is followed by whitespace.</td>
-<td>178</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>ParenPad</td>
-<td>'(' is followed by whitespace.</td>
-<td>178</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>ParenPad</td>
-<td>'(' is followed by whitespace.</td>
-<td>178</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>ParenPad</td>
-<td>')' is preceded with whitespace.</td>
-<td>178</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>ParenPad</td>
-<td>')' is preceded with whitespace.</td>
-<td>178</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>ParenPad</td>
-<td>')' is preceded with whitespace.</td>
-<td>178</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>ParenPad</td>
-<td>'(' is followed by whitespace.</td>
-<td>179</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>ParenPad</td>
-<td>'(' is followed by whitespace.</td>
-<td>179</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>ParenPad</td>
-<td>'(' is followed by whitespace.</td>
-<td>179</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>ParenPad</td>
-<td>')' is preceded with whitespace.</td>
-<td>179</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>ParenPad</td>
-<td>')' is preceded with whitespace.</td>
-<td>179</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>ParenPad</td>
-<td>')' is preceded with whitespace.</td>
-<td>179</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>ParenPad</td>
-<td>'(' is followed by whitespace.</td>
-<td>180</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>ParenPad</td>
-<td>'(' is followed by whitespace.</td>
-<td>180</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>ParenPad</td>
-<td>'(' is followed by whitespace.</td>
-<td>180</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>ParenPad</td>
-<td>')' is preceded with whitespace.</td>
-<td>180</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>ParenPad</td>
-<td>')' is preceded with whitespace.</td>
-<td>180</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>ParenPad</td>
-<td>')' is preceded with whitespace.</td>
-<td>180</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>LeftCurly</td>
-<td>'{' at column 3 should be on the previous line.</td>
-<td>185</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 109).</td>
-<td>279</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>470</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>487</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>506</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'for' construct must use '{}'s.</td>
-<td>508</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>516</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 101).</td>
-<td>556</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 107).</td>
-<td>557</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 116).</td>
-<td>558</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 109).</td>
-<td>559</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 115).</td>
-<td>560</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 104).</td>
-<td>561</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 108).</td>
-<td>562</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 116).</td>
-<td>563</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>misc</td>
-<td>ArrayTypeStyle</td>
-<td>Array brackets at illegal position.</td>
-<td>648</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.test.IntegrationTestReplication.java">org/apache/hadoop/hbase/test/IntegrationTestReplication.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.HConstants' import.</td>
-<td>29</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.client.Admin' import.</td>
-<td>32</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'java.util.Collections' import.</td>
-<td>43</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>181</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>262</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>286</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.test.IntegrationTestTimeBoundedMultiGetRequestsWithRegionReplicas.java">org/apache/hadoop/hbase/test/IntegrationTestTimeBoundedMultiGetRequestsWithRegionReplicas.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>misc</td>
-<td>ArrayTypeStyle</td>
-<td>Array brackets at illegal position.</td>
-<td>66</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.test.IntegrationTestTimeBoundedRequestsWithRegionReplicas.java">org/apache/hadoop/hbase/test/IntegrationTestTimeBoundedRequestsWithRegionReplicas.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 102).</td>
-<td>164</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>226</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 103).</td>
-<td>342</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>344</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 101).</td>
-<td>369</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.test.IntegrationTestWithCellVisibilityLoadAndVerify.java">org/apache/hadoop/hbase/test/IntegrationTestWithCellVisibilityLoadAndVerify.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 6, expected level should be one of the following: 4, 52.</td>
-<td>92</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 6, expected level should be one of the following: 4, 52.</td>
-<td>93</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 10, expected level should be one of the following: 8, 69.</td>
-<td>142</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>191</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>192</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>193</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>194</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>195</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>196</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>197</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>198</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>199</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>200</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>misc</td>
-<td>ArrayTypeStyle</td>
-<td>Array brackets at illegal position.</td>
-<td>395</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.tool.Canary.java">org/apache/hadoop/hbase/tool/Canary.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>348</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>349</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>350</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>351</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>352</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>353</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>ParenPad</td>
-<td>')' is preceded with whitespace.</td>
-<td>472</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>MethodLength</td>
-<td>Method length is 161 lines (max allowed is 150).</td>
-<td>643</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 117).</td>
-<td>755</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 103).</td>
-<td>798</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>863</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 108).</td>
-<td>1007</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>1017</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>1022</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 104).</td>
-<td>1181</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1319</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 102).</td>
-<td>1382</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>1476</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 121).</td>
-<td>1494</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.tool.MapreduceTestingShim.java">org/apache/hadoop/hbase/tool/MapreduceTestingShim.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>111</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.tool.TestBulkLoadHFilesSplitRecovery.java">org/apache/hadoop/hbase/tool/TestBulkLoadHFilesSplitRecovery.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>160</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>161</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>162</td></tr>
+<td>292</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>242</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>coding</td>
-<td>InnerAssignment</td>
-<td>Inner assignments should be avoided.</td>
-<td>250</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>coding</td>
-<td>InnerAssignment</td>
-<td>Inner assignments should be avoided.</td>
-<td>476</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.tool.TestCanaryTool.java">org/apache/hadoop/hbase/tool/TestCanaryTool.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 118).</td>
-<td>103</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 123).</td>
-<td>156</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 121).</td>
-<td>157</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 112).</td>
-<td>163</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.trace.IntegrationTestSendTraceRequests.java">org/apache/hadoop/hbase/trace/IntegrationTestSendTraceRequests.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.TableName' import.</td>
-<td>25</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'java.io.IOException' import.</td>
-<td>44</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'for' has incorrect indentation level 6, expected level should be 4.</td>
-<td>118</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'for' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>119</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>148</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'for' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>153</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'for rcurly' has incorrect indentation level 6, expected level should be 4.</td>
-<td>154</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.trace.SpanReceiverHost.java">org/apache/hadoop/hbase/trace/SpanReceiverHost.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>108</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.trace.TraceTree.java">org/apache/hadoop/hbase/trace/TraceTree.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'java.util.Collection' import.</td>
-<td>23</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def modifier' has incorrect indentation level 10, expected level should be one of the following: 6, 8.</td>
-<td>40</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def' child has incorrect indentation level 12, expected level should be one of the following: 8, 10.</td>
-<td>42</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def rcurly' has incorrect indentation level 10, expected level should be one of the following: 6, 8.</td>
-<td>43</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'object def rcurly' has incorrect indentation level 8, expected level should be one of the following: 4, 6.</td>
-<td>44</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def modifier' has incorrect indentation level 10, expected level should be one of the following: 6, 8.</td>
-<td>91</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def' child has incorrect indentation level 12, expected level should be one of the following: 8, 10.</td>
-<td>93</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def rcurly' has incorrect indentation level 10, expected level should be one of the following: 6, 8.</td>
-<td>94</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'object def rcurly' has incorrect indentation level 8, expected level should be one of the following: 4, 6.</td>
-<td>95</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.trace.TraceUtil.java">org/apache/hadoop/hbase/trace/TraceUtil.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>65</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.types.TestCopyOnWriteMaps.java">org/apache/hadoop/hbase/types/TestCopyOnWriteMaps.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>ParenPad</td>
-<td>'(' is followed by whitespace.</td>
-<td>54</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>ParenPad</td>
-<td>')' is preceded with whitespace.</td>
-<td>54</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>ParenPad</td>
-<td>'(' is followed by whitespace.</td>
-<td>95</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>ParenPad</td>
-<td>'(' is followed by whitespace.</td>
-<td>103</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>ParenPad</td>
-<td>'(' is followed by whitespace.</td>
-<td>111</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>ParenPad</td>
-<td>'(' is followed by whitespace.</td>
-<td>124</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>ParenPad</td>
-<td>'(' is followed by whitespace.</td>
-<td>137</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>ParenPad</td>
-<td>'(' is followed by whitespace.</td>
-<td>178</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>ParenPad</td>
-<td>'(' is followed by whitespace.</td>
-<td>182</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>ParenPad</td>
-<td>'(' is followed by whitespace.</td>
-<td>250</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>ParenPad</td>
-<td>')' is preceded with whitespace.</td>
-<td>250</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.types.TestStruct.java">org/apache/hadoop/hbase/types/TestStruct.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def modifier' has incorrect indentation level 8, expected level should be one of the following: 4, 6.</td>
-<td>93</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>95</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if' has incorrect indentation level 10, expected level should be one of the following: 6, 8.</td>
-<td>95</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>96</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if' has incorrect indentation level 10, expected level should be one of the following: 6, 8.</td>
-<td>96</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>97</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if' has incorrect indentation level 10, expected level should be one of the following: 6, 8.</td>
-<td>97</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def' child has incorrect indentation level 10, expected level should be one of the following: 6, 8.</td>
-<td>98</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def rcurly' has incorrect indentation level 8, expected level should be one of the following: 4, 6.</td>
-<td>99</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'object def rcurly' has incorrect indentation level 6, expected level should be one of the following: 2, 4.</td>
-<td>100</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'else' construct must use '{}'s.</td>
-<td>237</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>LeftCurly</td>
-<td>'{' at column 40 should have line break after.</td>
-<td>306</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>LeftCurly</td>
-<td>'{' at column 29 should have line break after.</td>
 <td>309</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>LeftCurly</td>
-<td>'{' at column 33 should have line break after.</td>
-<td>312</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>LeftCurly</td>
-<td>'{' at column 34 should have line break after.</td>
-<td>315</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>LeftCurly</td>
-<td>'{' at column 40 should have line break after.</td>
-<td>326</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>LeftCurly</td>
-<td>'{' at column 40 should have line break after.</td>
-<td>377</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>LeftCurly</td>
-<td>'{' at column 29 should have line break after.</td>
-<td>380</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>LeftCurly</td>
-<td>'{' at column 33 should have line break after.</td>
-<td>383</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>LeftCurly</td>
-<td>'{' at column 34 should have line break after.</td>
-<td>386</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>LeftCurly</td>
-<td>'{' at column 40 should have line break after.</td>
-<td>398</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.types.TestUnion2.java">org/apache/hadoop/hbase/types/TestUnion2.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>87</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>88</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'else' construct must use '{}'s.</td>
-<td>110</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.AbstractByteRange.java">org/apache/hadoop/hbase/util/AbstractByteRange.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>108</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>119</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>175</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>182</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.AbstractFileStatusFilter.java">org/apache/hadoop/hbase/util/AbstractFileStatusFilter.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.fs.FileStatus' import.</td>
-<td>24</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'edu.umd.cs.findbugs.annotations.CheckForNull' import.</td>
-<td>29</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 104).</td>
-<td>64</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.AbstractHBaseTool.java">org/apache/hadoop/hbase/util/AbstractHBaseTool.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>misc</td>
-<td>ArrayTypeStyle</td>
-<td>Array brackets at illegal position.</td>
-<td>277</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.AbstractPositionedByteRange.java">org/apache/hadoop/hbase/util/AbstractPositionedByteRange.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>137</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>145</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.Addressing.java">org/apache/hadoop/hbase/util/Addressing.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>HideUtilityClassConstructor</td>
-<td>Utility classes should not have a public or default constructor.</td>
-<td>34</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>53</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>54</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>120</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>124</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.AtomicUtils.java">org/apache/hadoop/hbase/util/AtomicUtils.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>HideUtilityClassConstructor</td>
-<td>Utility classes should not have a public or default constructor.</td>
-<td>27</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.AvlUtil.java">org/apache/hadoop/hbase/util/AvlUtil.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>158</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>206</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>234</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>238</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>242</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>262</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>431</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>520</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>521</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.BaseTestHBaseFsck.java">org/apache/hadoop/hbase/util/BaseTestHBaseFsck.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>222</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>223</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>224</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>235</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>258</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def' child has incorrect indentation level 5, expected level should be 4.</td>
-<td>282</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>347</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>348</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>350</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>376</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.BloomContext.java">org/apache/hadoop/hbase/util/BloomContext.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.io.hfile.HFile' import.</td>
-<td>25</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>48</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>49</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>70</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>71</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.BloomFilter.java">org/apache/hadoop/hbase/util/BloomFilter.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.nio.ByteBuff' import.</td>
-<td>24</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.BloomFilterChunk.java">org/apache/hadoop/hbase/util/BloomFilterChunk.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.regionserver.BloomType' import.</td>
-<td>29</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>106</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.BloomFilterFactory.java">org/apache/hadoop/hbase/util/BloomFilterFactory.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>96</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>115</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>158</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>159</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>160</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>205</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>206</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.BloomFilterUtil.java">org/apache/hadoop/hbase/util/BloomFilterUtil.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>75</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>76</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>105</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>106</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>120</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>121</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>122</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>140</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>141</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>142</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>155</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>156</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>190</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>191</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def modifier' has incorrect indentation level 3, expected level should be 2.</td>
-<td>259</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.BloomFilterWriter.java">org/apache/hadoop/hbase/util/BloomFilterWriter.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.regionserver.CellSink' import.</td>
-<td>24</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.BoundedPriorityBlockingQueue.java">org/apache/hadoop/hbase/util/BoundedPriorityBlockingQueue.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'java.util.concurrent.BlockingQueue' import.</td>
-<td>23</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'java.util.Collection' import.</td>
-<td>25</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'java.util.AbstractQueue' import.</td>
-<td>28</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>95</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>160</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>177</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>194</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>200</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>324</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>326</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>328</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.ByteBufferUtils.java">org/apache/hadoop/hbase/util/ByteBufferUtils.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def modifier' has incorrect indentation level 3, expected level should be 2.</td>
-<td>395</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def modifier' has incorrect indentation level 3, expected level should be 2.</td>
-<td>417</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if' has incorrect indentation level 5, expected level should be 4.</td>
-<td>422</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if' child has incorrect indentation level 7, expected level should be 6.</td>
-<td>423</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if rcurly' has incorrect indentation level 5, expected level should be 4.</td>
-<td>424</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'else' child has incorrect indentation level 7, expected level should be 6.</td>
-<td>425</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'else rcurly' has incorrect indentation level 5, expected level should be 4.</td>
-<td>426</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def rcurly' has incorrect indentation level 3, expected level should be 2.</td>
-<td>427</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>573</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>608</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>689</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>690</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>691</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>692</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>693</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>844</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>845</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>846</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>865</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>897</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>959</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>960</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>976</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>977</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1009</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1010</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1033</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1043</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1044</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1097</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1098</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1099</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1100</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1119</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1120</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1121</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1122</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1140</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1141</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1142</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1143</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1144</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>1168</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>1178</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>1180</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.ByteRangeUtils.java">org/apache/hadoop/hbase/util/ByteRangeUtils.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>HideUtilityClassConstructor</td>
-<td>Utility classes should not have a public or default constructor.</td>
-<td>33</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.Bytes.java">org/apache/hadoop/hbase/util/Bytes.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>205</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>206</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>252</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>371</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>402</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>420</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>584</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>601</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>626</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>627</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>654</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>775</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'else' child has incorrect indentation level 5, expected level should be 6.</td>
-<td>793</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>806</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>936</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>952</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>974</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>1023</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>1052</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>1072</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1088</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1103</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1113</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1114</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1115</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>1567</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>1568</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>1569</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>1570</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>1575</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>1599</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>1612</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>1613</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>1614</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>1641</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>1642</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>1652</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>1653</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>1662</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>1672</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>1779</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>1792</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>1793</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>1795</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>1803</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>LeftCurly</td>
-<td>'{' at column 3 should be on the previous line.</td>
-<td>1816</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>LeftCurly</td>
-<td>'{' at column 3 should be on the previous line.</td>
-<td>1825</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>1885</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>1886</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>1890</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'else' construct must use '{}'s.</td>
-<td>1892</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'for' construct must use '{}'s.</td>
-<td>1919</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>1993</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>1996</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'else' construct must use '{}'s.</td>
-<td>1999</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>2028</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>2031</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'else' construct must use '{}'s.</td>
-<td>2034</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>LeftCurly</td>
-<td>'{' at column 3 should be on the previous line.</td>
-<td>2049</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>2066</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>2093</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>2118</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'for' construct must use '{}'s.</td>
-<td>2135</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'while' construct must use '{}'s.</td>
-<td>2147</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>2160</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>2171</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>2172</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>2175</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>2357</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>2358</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>2359</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>2380</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>2381</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>2382</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>2408</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>2409</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>LeftCurly</td>
-<td>'{' at column 5 should be on the previous line.</td>
-<td>2436</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>2469</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'for' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>2476</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>2482</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>2483</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>2504</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>2505</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.ChecksumType.java">org/apache/hadoop/hbase/util/ChecksumType.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>89</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>104</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.ClassLoaderTestHelper.java">org/apache/hadoop/hbase/util/ClassLoaderTestHelper.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>HideUtilityClassConstructor</td>
-<td>Utility classes should not have a public or default constructor.</td>
-<td>46</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>misc</td>
-<td>ArrayTypeStyle</td>
-<td>Array brackets at illegal position.</td>
-<td>60</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>80</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>105</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>120</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>misc</td>
-<td>ArrayTypeStyle</td>
-<td>Array brackets at illegal position.</td>
-<td>186</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>198</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.ClassSize.java">org/apache/hadoop/hbase/util/ClassSize.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>HideUtilityClassConstructor</td>
-<td>Utility classes should not have a public or default constructor.</td>
-<td>40</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>352</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>353</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>366</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>376</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>378</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>380</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>382</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>384</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>386</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>388</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>390</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>ParenPad</td>
-<td>'(' is followed by whitespace.</td>
-<td>442</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 112).</td>
-<td>492</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.Classes.java">org/apache/hadoop/hbase/util/Classes.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>HideUtilityClassConstructor</td>
-<td>Utility classes should not have a public or default constructor.</td>
-<td>27</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.CollectionBackedScanner.java">org/apache/hadoop/hbase/util/CollectionBackedScanner.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.Cell' import.</td>
-<td>28</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.CommonFSUtils.java">org/apache/hadoop/hbase/util/CommonFSUtils.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 105).</td>
-<td>66</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>143</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>682</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.CompressionTest.java">org/apache/hadoop/hbase/util/CompressionTest.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
-<td>30</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.io.hfile.CacheConfig' import.</td>
-<td>40</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>HideUtilityClassConstructor</td>
-<td>Utility classes should not have a public or default constructor.</td>
-<td>51</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>ParenPad</td>
-<td>'(' is followed by whitespace.</td>
-<td>113</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>121</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.ConcatenatedLists.java">org/apache/hadoop/hbase/util/ConcatenatedLists.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>82</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.ConcurrentMapUtils.java">org/apache/hadoop/hbase/util/ConcurrentMapUtils.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>HideUtilityClassConstructor</td>
-<td>Utility classes should not have a public or default constructor.</td>
-<td>30</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>coding</td>
-<td>InnerAssignment</td>
-<td>Inner assignments should be avoided.</td>
-<td>61</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>coding</td>
-<td>InnerAssignment</td>
-<td>Inner assignments should be avoided.</td>
-<td>61</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>coding</td>
-<td>InnerAssignment</td>
-<td>Inner assignments should be avoided.</td>
-<td>62</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.ConfigurationUtil.java">org/apache/hadoop/hbase/util/ConfigurationUtil.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
-<td>22</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.util.StringUtils' import.</td>
-<td>24</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'java.util.AbstractMap' import.</td>
-<td>26</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.ConnectionCache.java">org/apache/hadoop/hbase/util/ConnectionCache.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.client.Admin' import.</td>
-<td>34</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>LeftCurly</td>
-<td>'{' at column 46 should have line break after.</td>
-<td>74</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>LeftCurly</td>
-<td>'{' at column 44 should have line break after.</td>
-<td>75</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>126</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.ConstantDelayQueue.java">org/apache/hadoop/hbase/util/ConstantDelayQueue.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>ParenPad</td>
-<td>'(' is followed by whitespace.</td>
-<td>48</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.CoprocessorClassLoader.java">org/apache/hadoop/hbase/util/CoprocessorClassLoader.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>FinalClass</td>
-<td>Class CoprocessorClassLoader should be declared as final.</td>
-<td>77</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization rcurly' has incorrect indentation level 2, expected level should be one of the following: 6, 8.</td>
-<td>126</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 104).</td>
-<td>169</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>238</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def modifier' has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>264</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def' child has incorrect indentation level 10, expected level should be one of the following: 12, 14.</td>
-<td>266</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def rcurly' has incorrect indentation level 8, expected level should be one of the following: 10, 12.</td>
-<td>267</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'object def rcurly' has incorrect indentation level 6, expected level should be one of the following: 8, 10.</td>
-<td>268</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>372</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>395</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>396</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.DirectMemoryUtils.java">org/apache/hadoop/hbase/util/DirectMemoryUtils.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>HideUtilityClassConstructor</td>
-<td>Utility classes should not have a public or default constructor.</td>
-<td>48</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>121</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.DynamicClassLoader.java">org/apache/hadoop/hbase/util/DynamicClassLoader.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'synchronized' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>151</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if' has incorrect indentation level 8, expected level should be 6.</td>
-<td>152</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if' has incorrect indentation level 10, expected level should be 8.</td>
-<td>153</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if' child has incorrect indentation level 12, expected level should be 10.</td>
-<td>154</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if rcurly' has incorrect indentation level 10, expected level should be 8.</td>
-<td>155</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if rcurly' has incorrect indentation level 8, expected level should be 6.</td>
-<td>156</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'else' has incorrect indentation level 8, expected level should be 6.</td>
-<td>157</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'try' has incorrect indentation level 10, expected level should be 8.</td>
-<td>158</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if' has incorrect indentation level 12, expected level should be 10.</td>
-<td>159</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if' child has incorrect indentation level 14, expected level should be 12.</td>
-<td>160</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if rcurly' has incorrect indentation level 12, expected level should be 10.</td>
-<td>161</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'try' child has incorrect indentation level 12, expected level should be 10.</td>
-<td>162</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'try rcurly' has incorrect indentation level 10, expected level should be 8.</td>
-<td>163</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if' has incorrect indentation level 12, expected level should be 10.</td>
-<td>165</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if' child has incorrect indentation level 14, expected level should be 12.</td>
-<td>166</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if rcurly' has incorrect indentation level 12, expected level should be 10.</td>
-<td>167</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'catch' child has incorrect indentation level 12, expected level should be 10.</td>
-<td>168</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if' has incorrect indentation level 12, expected level should be 10.</td>
-<td>170</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if' child has incorrect indentation level 14, expected level should be 12.</td>
-<td>171</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if rcurly' has incorrect indentation level 12, expected level should be 10.</td>
-<td>172</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'catch' child has incorrect indentation level 12, expected level should be 10.</td>
-<td>173</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'catch rcurly' has incorrect indentation level 10, expected level should be 8.</td>
-<td>174</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'else rcurly' has incorrect indentation level 8, expected level should be 6.</td>
-<td>175</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'synchronized' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>176</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'synchronized rcurly' has incorrect indentation level 6, expected level should be 4.</td>
-<td>177</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>216</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.EncryptionTest.java">org/apache/hadoop/hbase/util/EncryptionTest.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
-<td>31</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>FinalClass</td>
-<td>Class EncryptionTest should be declared as final.</td>
-<td>38</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>53</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>54</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>78</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>79</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>104</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>105</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>106</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>107</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.EnvironmentEdgeManager.java">org/apache/hadoop/hbase/util/EnvironmentEdgeManager.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>FinalClass</td>
-<td>Class EnvironmentEdgeManager should be declared as final.</td>
-<td>62</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.EnvironmentEdgeManagerTestHelper.java">org/apache/hadoop/hbase/util/EnvironmentEdgeManagerTestHelper.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>HideUtilityClassConstructor</td>
-<td>Utility classes should not have a public or default constructor.</td>
-<td>26</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.ExceptionUtil.java">org/apache/hadoop/hbase/util/ExceptionUtil.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>FinalClass</td>
-<td>Class ExceptionUtil should be declared as final.</td>
-<td>36</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>43</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>44</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>53</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>60</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>62</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.FSHDFSUtils.java">org/apache/hadoop/hbase/util/FSHDFSUtils.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>55</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>56</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>113</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>114</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>198</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>221</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>223</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>275</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>276</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>277</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>278</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>280</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>284</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>303</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>304</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>305</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>315</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>316</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>317</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
 <td>332</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
 <td>333</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>334</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.FSRegionScanner.java">org/apache/hadoop/hbase/util/FSRegionScanner.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.fs.BlockLocation' import.</td>
-<td>30</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>RedundantImport</td>
-<td>Redundant import from the same package - org.apache.hadoop.hbase.util.FSUtils.</td>
-<td>34</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.FSTableDescriptors.java">org/apache/hadoop/hbase/util/FSTableDescriptors.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'edu.umd.cs.findbugs.annotations.Nullable' import.</td>
-<td>31</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder' import.</td>
-<td>45</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.Coprocessor' import.</td>
-<td>48</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.HConstants' import.</td>
-<td>50</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.TableDescriptors' import.</td>
-<td>54</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 118).</td>
-<td>126</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 108).</td>
-<td>133</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 119).</td>
-<td>139</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 118).</td>
-<td>149</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>229</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if' child has incorrect indentation level 7, expected level should be 6.</td>
-<td>238</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>274</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>312</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>324</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>358</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>377</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>393</td></tr>
+<td>334</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>406</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>409</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>424</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>427</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>443</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>447</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>449</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'new' has incorrect indentation level 2, expected level should be 4.</td>
-<td>478</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>531</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>533</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>535</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>540</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>564</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>597</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>604</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>632</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>660</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>714</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>742</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.FSUtils.java">org/apache/hadoop/hbase/util/FSUtils.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>120</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>137</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>141</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>154</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>177</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>178</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>180</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>183</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>205</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>230</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>250</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>278</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>280</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 10, expected level should be 8.</td>
-<td>286</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>290</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>301</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>302</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>305</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>324</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>327</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>337</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>367</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>370</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 102).</td>
-<td>387</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>403</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>406</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>420</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>424</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>463</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>478</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>518</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>580</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>622</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>623</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>627</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>631</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>669</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>700</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>702</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>774</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>791</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>810</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>939</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>963</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>981</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>982</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 105).</td>
-<td>983</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>984</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>985</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1032</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 103).</td>
-<td>1034</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1093</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 104).</td>
-<td>1095</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 112).</td>
-<td>1106</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1196</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'final' has incorrect indentation level 2, expected level should be 4.</td>
-<td>1199</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>1200</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 101).</td>
-<td>1215</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1224</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 110).</td>
-<td>1242</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 101).</td>
-<td>1264</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>ParenPad</td>
-<td>'(' is followed by whitespace.</td>
-<td>1290</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1365</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>1369</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1388</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>1393</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>1416</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>1429</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 101).</td>
-<td>1593</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 110).</td>
-<td>1595</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1689</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1707</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>1716</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1723</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1725</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>1729</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.FSVisitor.java">org/apache/hadoop/hbase/util/FSVisitor.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.fs.FileStatus' import.</td>
-<td>27</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 113).</td>
-<td>58</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 115).</td>
-<td>81</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.FileStatusFilter.java">org/apache/hadoop/hbase/util/FileStatusFilter.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.fs.FileStatus' import.</td>
-<td>22</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.GetJavaProperty.java">org/apache/hadoop/hbase/util/GetJavaProperty.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>misc</td>
-<td>ArrayTypeStyle</td>
-<td>Array brackets at illegal position.</td>
-<td>28</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.HBaseConfTool.java">org/apache/hadoop/hbase/util/HBaseConfTool.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
-<td>23</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>HideUtilityClassConstructor</td>
-<td>Utility classes should not have a public or default constructor.</td>
-<td>30</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>misc</td>
-<td>ArrayTypeStyle</td>
-<td>Array brackets at illegal position.</td>
-<td>32</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.HBaseFsck.java">org/apache/hadoop/hbase/util/HBaseFsck.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>705</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if' child has incorrect indentation level 11, expected level should be 10.</td>
-<td>763</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>841</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>VisibilityModifier</td>
-<td>Variable 'regionName' must be private and have accessor methods.</td>
-<td>868</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>VisibilityModifier</td>
-<td>Variable 'metaFirstKey' must be private and have accessor methods.</td>
-<td>869</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>VisibilityModifier</td>
-<td>Variable 'metaLastKey' must be private and have accessor methods.</td>
-<td>870</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>VisibilityModifier</td>
-<td>Variable 'storesFirstKey' must be private and have accessor methods.</td>
-<td>871</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>VisibilityModifier</td>
-<td>Variable 'storesLastKey' must be private and have accessor methods.</td>
-<td>872</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>MethodParamPad</td>
-<td>'(' is preceded with whitespace.</td>
-<td>874</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>928</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>930</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>1005</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>ParenPad</td>
-<td>')' is preceded with whitespace.</td>
-<td>1041</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>1138</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>1143</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>1193</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>1197</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 118).</td>
-<td>1203</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 113).</td>
-<td>1204</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 104).</td>
-<td>1212</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 113).</td>
-<td>1213</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 101).</td>
-<td>1215</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>1229</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1363</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1364</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1366</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 102).</td>
-<td>1384</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1385</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>1389</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1400</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 109).</td>
-<td>1419</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1420</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 104).</td>
-<td>1449</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 123).</td>
-<td>1452</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 102).</td>
-<td>1463</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1605</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>1606</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>1609</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if' has incorrect indentation level 7, expected level should be 6.</td>
-<td>1644</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if' child has incorrect indentation level 9, expected level should be 8.</td>
-<td>1647</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if rcurly' has incorrect indentation level 7, expected level should be 6.</td>
-<td>1648</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>1776</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>ParenPad</td>
-<td>')' is preceded with whitespace.</td>
-<td>1966</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>2095</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>2137</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>MethodLength</td>
-<td>Method length is 232 lines (max allowed is 150).</td>
-<td>2158</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>2161</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>2233</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>2396</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
-<td>2606</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>2647</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>2648</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'.' has incorrect indentation level 10, expected level should be 12.</td>
-<td>2674</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>VisibilityModifier</td>
-<td>Variable 'errorCount' must be private and have accessor methods.</td>
-<td>2872</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>2936</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 104).</td>
-<td>3102</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 104).</td>
-<td>3173</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 115).</td>
-<td>3486</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 108).</td>
-<td>3529</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 107).</td>
-<td>3534</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 104).</td>
-<td>3535</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 111).</td>
-<td>3542</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 116).</td>
-<td>3547</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 107).</td>
-<td>3554</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 106).</td>
-<td>3556</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 113).</td>
-<td>3559</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 145).</td>
-<td>3561</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 104).</td>
-<td>3562</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 179).</td>
-<td>3563</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 113).</td>
-<td>3565</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>3590</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>3591</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>LeftCurly</td>
-<td>'{' at column 39 should have line break after.</td>
-<td>3607</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>MethodLength</td>
-<td>Method length is 229 lines (max allowed is 150).</td>
-<td>3617</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.HBaseFsckRepair.java">org/apache/hadoop/hbase/util/HBaseFsckRepair.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>HideUtilityClassConstructor</td>
-<td>Utility classes should not have a public or default constructor.</td>
-<td>55</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>70</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>87</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>88</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>89</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>90</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>109</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.HBaseHomePath.java">org/apache/hadoop/hbase/util/HBaseHomePath.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>FinalClass</td>
-<td>Class HBaseHomePath should be declared as final.</td>
-<td>24</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.HFileArchiveTestingUtil.java">org/apache/hadoop/hbase/util/HFileArchiveTestingUtil.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>FinalClass</td>
-<td>Class HFileArchiveTestingUtil should be declared as final.</td>
-<td>42</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>90</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>104</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>136</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>138</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>193</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'else' construct must use '{}'s.</td>
-<td>194</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>202</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.HFileArchiveUtil.java">org/apache/hadoop/hbase/util/HFileArchiveUtil.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>181</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>182</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>185</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.HFileTestUtil.java">org/apache/hadoop/hbase/util/HFileTestUtil.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>HideUtilityClassConstructor</td>
-<td>Utility classes should not have a public or default constructor.</td>
-<td>54</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
-<td>77</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
-<td>91</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
-<td>105</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.Hash.java">org/apache/hadoop/hbase/util/Hash.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>102</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.HashKey.java">org/apache/hadoop/hbase/util/HashKey.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>36</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.HashedBytes.java">org/apache/hadoop/hbase/util/HashedBytes.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>53</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>55</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.JVM.java">org/apache/hadoop/hbase/util/JVM.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 14, expected level should be one of the following: 12, 23, 24.</td>
-<td>162</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>coding</td>
-<td>InnerAssignment</td>
-<td>Inner assignments should be avoided.</td>
-<td>167</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>207</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>208</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>coding</td>
-<td>InnerAssignment</td>
-<td>Inner assignments should be avoided.</td>
-<td>294</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.JVMClusterUtil.java">org/apache/hadoop/hbase/util/JVMClusterUtil.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'java.io.IOException' import.</td>
-<td>22</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
-<td>32</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>HideUtilityClassConstructor</td>
-<td>Utility classes should not have a public or default constructor.</td>
-<td>39</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>78</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>125</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>160</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>161</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>242</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>243</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>315</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.JenkinsHash.java">org/apache/hadoop/hbase/util/JenkinsHash.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>86</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>87</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>90</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>91</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>93</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>96</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>99</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>102</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>MethodLength</td>
-<td>Method length is 158 lines (max allowed is 150).</td>
-<td>104</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>coding</td>
-<td>InnerAssignment</td>
-<td>Inner assignments should be avoided.</td>
-<td>109</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>coding</td>
-<td>InnerAssignment</td>
-<td>Inner assignments should be avoided.</td>
-<td>109</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
-<td>189</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>190</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
-<td>191</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>192</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
-<td>193</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>194</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
-<td>195</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>196</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
-<td>197</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>198</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
-<td>199</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>200</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
-<td>201</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>202</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
-<td>203</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>204</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
-<td>205</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>206</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
-<td>207</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>208</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
-<td>209</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>210</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
-<td>211</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>213</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>214</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
-<td>215</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>216</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.JvmPauseMonitor.java">org/apache/hadoop/hbase/util/JvmPauseMonitor.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.metrics.JvmPauseMonitorSource' import.</td>
-<td>30</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
-<td>31</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>FinalClass</td>
-<td>Class GcTimes should be declared as final.</td>
-<td>122</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.KeyLocker.java">org/apache/hadoop/hbase/util/KeyLocker.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def modifier' has incorrect indentation level 12, expected level should be one of the following: 6, 8.</td>
-<td>54</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def' child has incorrect indentation level 14, expected level should be one of the following: 8, 10.</td>
-<td>56</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def rcurly' has incorrect indentation level 12, expected level should be one of the following: 6, 8.</td>
-<td>57</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'object def rcurly' has incorrect indentation level 10, expected level should be one of the following: 4, 6.</td>
-<td>58</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>64</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>67</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.LeaseNotRecoveredException.java">org/apache/hadoop/hbase/util/LeaseNotRecoveredException.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'ctor def' child has incorrect indentation level 6, expected level should be 4.</td>
-<td>39</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'ctor def' child has incorrect indentation level 6, expected level should be 4.</td>
-<td>43</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.LoadTestDataGeneratorWithMOB.java">org/apache/hadoop/hbase/util/LoadTestDataGeneratorWithMOB.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>66</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.LoadTestDataGeneratorWithTags.java">org/apache/hadoop/hbase/util/LoadTestDataGeneratorWithTags.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.Cell' import.</td>
-<td>25</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.ArrayBackedTag' import.</td>
-<td>30</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.LoadTestTool.java">org/apache/hadoop/hbase/util/LoadTestTool.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.client.Admin' import.</td>
-<td>45</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 102).</td>
-<td>336</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'if' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>586</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>MethodLength</td>
-<td>Method length is 191 lines (max allowed is 150).</td>
-<td>595</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>misc</td>
-<td>ArrayTypeStyle</td>
-<td>Array brackets at illegal position.</td>
-<td>668</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>912</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.MD5Hash.java">org/apache/hadoop/hbase/util/MD5Hash.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>HideUtilityClassConstructor</td>
-<td>Utility classes should not have a public or default constructor.</td>
-<td>34</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>40</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>53</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>54</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.ManualEnvironmentEdge.java">org/apache/hadoop/hbase/util/ManualEnvironmentEdge.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 109).</td>
-<td>24</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.MapreduceDependencyClasspathTool.java">org/apache/hadoop/hbase/util/MapreduceDependencyClasspathTool.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil' import.</td>
-<td>24</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 107).</td>
-<td>53</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 106).</td>
-<td>54</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.Methods.java">org/apache/hadoop/hbase/util/Methods.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>HideUtilityClassConstructor</td>
-<td>Utility classes should not have a public or default constructor.</td>
-<td>32</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.MockServer.java">org/apache/hadoop/hbase/util/MockServer.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>54</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>61</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>62</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>65</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.ModifyRegionUtils.java">org/apache/hadoop/hbase/util/ModifyRegionUtils.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>106</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>111</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>132</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 117).</td>
-<td>136</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>138</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>171</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>200</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'.' has incorrect indentation level 4, expected level should be 6.</td>
-<td>237</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.MultiThreadedAction.java">org/apache/hadoop/hbase/util/MultiThreadedAction.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 117).</td>
-<td>81</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 119).</td>
-<td>82</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>MethodLength</td>
-<td>Method length is 166 lines (max allowed is 150).</td>
-<td>326</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>541</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.MultiThreadedReader.java">org/apache/hadoop/hbase/util/MultiThreadedReader.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>LeftCurly</td>
-<td>'{' at column 1 should be on the previous line.</td>
-<td>39</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.MultiThreadedReaderWithACL.java">org/apache/hadoop/hbase/util/MultiThreadedReaderWithACL.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 104).</td>
-<td>112</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.MultiThreadedUpdater.java">org/apache/hadoop/hbase/util/MultiThreadedUpdater.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.util.test.LoadTestDataGenerator' import.</td>
-<td>48</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 111).</td>
-<td>169</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 18, expected level should be 20.</td>
-<td>206</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 20, expected level should be 22.</td>
-<td>207</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 20, expected level should be 22.</td>
-<td>208</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 20, expected level should be 22.</td>
-<td>209</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 20, expected level should be 22.</td>
-<td>210</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 20, expected level should be 22.</td>
-<td>211</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 18, expected level should be 20.</td>
-<td>212</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 20, expected level should be 22.</td>
-<td>213</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 20, expected level should be 22.</td>
-<td>216</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 20, expected level should be 22.</td>
-<td>217</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 20, expected level should be 22.</td>
-<td>218</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 20, expected level should be 22.</td>
-<td>219</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 18, expected level should be 20.</td>
-<td>220</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 20, expected level should be 22.</td>
-<td>221</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 20, expected level should be 22.</td>
-<td>222</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 103).</td>
-<td>269</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'for' child has incorrect indentation level 7, expected level should be 6.</td>
-<td>324</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.MultiThreadedWriter.java">org/apache/hadoop/hbase/util/MultiThreadedWriter.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 113).</td>
-<td>126</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'for' child has incorrect indentation level 7, expected level should be 6.</td>
-<td>181</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.MultiThreadedWriterBase.java">org/apache/hadoop/hbase/util/MultiThreadedWriterBase.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>coding</td>
-<td>InnerAssignment</td>
-<td>Inner assignments should be avoided.</td>
-<td>155</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.MunkresAssignment.java">org/apache/hadoop/hbase/util/MunkresAssignment.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>95</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.MurmurHash3.java">org/apache/hadoop/hbase/util/MurmurHash3.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
-<td>69</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>70</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
-<td>72</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>73</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
-<td>75</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>76</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>77</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>78</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>79</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>80</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
-<td>81</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.NettyEventLoopGroupConfig.java">org/apache/hadoop/hbase/util/NettyEventLoopGroupConfig.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'java.util.concurrent.ThreadFactory' import.</td>
-<td>31</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.Order.java">org/apache/hadoop/hbase/util/Order.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>LeftCurly</td>
-<td>'{' at column 29 should have line break after.</td>
-<td>33</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>LeftCurly</td>
-<td>'{' at column 33 should have line break after.</td>
-<td>36</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>LeftCurly</td>
-<td>'{' at column 30 should have line break after.</td>
-<td>45</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>LeftCurly</td>
-<td>'{' at column 29 should have line break after.</td>
-<td>56</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>LeftCurly</td>
-<td>'{' at column 33 should have line break after.</td>
-<td>59</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>LeftCurly</td>
-<td>'{' at column 44 should have line break after.</td>
-<td>63</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>LeftCurly</td>
-<td>'{' at column 40 should have line break after.</td>
-<td>68</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>LeftCurly</td>
-<td>'{' at column 30 should have line break after.</td>
-<td>72</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.OrderedBytes.java">org/apache/hadoop/hbase/util/OrderedBytes.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>HideUtilityClassConstructor</td>
-<td>Utility classes should not have a public or default constructor.</td>
-<td>268</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>346</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>coding</td>
-<td>InnerAssignment</td>
-<td>Inner assignments should be avoided.</td>
-<td>346</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>348</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>463</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>464</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>465</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>466</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>467</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>468</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>469</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>470</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>471</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>ParenPad</td>
-<td>'(' is followed by whitespace.</td>
-<td>581</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>ParenPad</td>
-<td>'(' is followed by whitespace.</td>
-<td>582</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'while' construct must use '{}'s.</td>
-<td>604</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>coding</td>
-<td>EmptyStatement</td>
-<td>Empty statement.</td>
-<td>605</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>LeftCurly</td>
-<td>'{' at column 37 should have line break after.</td>
-<td>651</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>LeftCurly</td>
-<td>'{' at column 36 should have line break after.</td>
-<td>652</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>LeftCurly</td>
-<td>'{' at column 49 should have line break after.</td>
-<td>726</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>LeftCurly</td>
-<td>'{' at column 48 should have line break after.</td>
-<td>727</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>LeftCurly</td>
-<td>'{' at column 60 should have line break after.</td>
-<td>728</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>836</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>920</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>921</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>922</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>923</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>942</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>943</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>944</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>961</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>977</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'for' construct must use '{}'s.</td>
-<td>985</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>coding</td>
-<td>EmptyStatement</td>
-<td>Empty statement.</td>
-<td>986</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>1003</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'else' construct must use '{}'s.</td>
-<td>1005</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'for' construct must use '{}'s.</td>
-<td>1102</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>coding</td>
-<td>EmptyStatement</td>
-<td>Empty statement.</td>
-<td>1103</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>1120</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>1142</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>1164</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>1199</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'for' construct must use '{}'s.</td>
-<td>1756</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>coding</td>
-<td>EmptyStatement</td>
-<td>Empty statement.</td>
-<td>1757</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.Pair.java">org/apache/hadoop/hbase/util/Pair.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>28</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>29</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>LeftCurly</td>
-<td>'{' at column 1 should be on the previous line.</td>
-<td>33</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>LeftCurly</td>
-<td>'{' at column 3 should be on the previous line.</td>
-<td>42</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>LeftCurly</td>
-<td>'{' at column 3 should be on the previous line.</td>
-<td>51</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>LeftCurly</td>
-<td>'{' at column 3 should be on the previous line.</td>
-<td>73</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>LeftCurly</td>
-<td>'{' at column 3 should be on the previous line.</td>
-<td>82</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>LeftCurly</td>
-<td>'{' at column 3 should be on the previous line.</td>
-<td>91</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>LeftCurly</td>
-<td>'{' at column 3 should be on the previous line.</td>
-<td>100</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>LeftCurly</td>
-<td>'{' at column 3 should be on the previous line.</td>
-<td>105</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>LeftCurly</td>
-<td>'{' at column 3 should be on the previous line.</td>
-<td>112</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>LeftCurly</td>
-<td>'{' at column 3 should be on the previous line.</td>
-<td>119</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>120</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>122</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'else' construct must use '{}'s.</td>
-<td>124</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>LeftCurly</td>
-<td>'{' at column 3 should be on the previous line.</td>
-<td>130</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.PairOfSameType.java">org/apache/hadoop/hbase/util/PairOfSameType.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>30</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def' child has incorrect indentation level 5, expected level should be 4.</td>
-<td>65</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>78</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>80</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'else' construct must use '{}'s.</td>
-<td>82</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>103</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>104</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'else' construct must use '{}'s.</td>
-<td>105</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.PoolMap.java">org/apache/hadoop/hbase/util/PoolMap.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>coding</td>
-<td>InnerAssignment</td>
-<td>Inner assignments should be avoided.</td>
-<td>81</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
-<td>273</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>274</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
-<td>275</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>276</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 4, expected level should be 6.</td>
-<td>277</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>278</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>coding</td>
-<td>InnerAssignment</td>
-<td>Inner assignments should be avoided.</td>
-<td>403</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.PositionedByteRange.java">org/apache/hadoop/hbase/util/PositionedByteRange.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>168</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.PrettyPrinter.java">org/apache/hadoop/hbase/util/PrettyPrinter.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>HideUtilityClassConstructor</td>
-<td>Utility classes should not have a public or default constructor.</td>
-<td>31</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>72</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>73</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>ParenPad</td>
-<td>')' is preceded with whitespace.</td>
-<td>120</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>148</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.ProcessBasedLocalHBaseCluster.java">org/apache/hadoop/hbase/util/ProcessBasedLocalHBaseCluster.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>130</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.RedundantKVGenerator.java">org/apache/hadoop/hbase/util/RedundantKVGenerator.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'ctor def rparen' has incorrect indentation level 6, expected level should be 2.</td>
-<td>119</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.ReflectionUtils.java">org/apache/hadoop/hbase/util/ReflectionUtils.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'edu.umd.cs.findbugs.annotations.NonNull' import.</td>
-<td>35</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>HideUtilityClassConstructor</td>
-<td>Utility classes should not have a public or default constructor.</td>
-<td>37</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.RegionMover.java">org/apache/hadoop/hbase/util/RegionMover.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>FinalClass</td>
-<td>Class RegionMover should be declared as final.</td>
-<td>79</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>174</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>208</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.RegionSplitCalculator.java">org/apache/hadoop/hbase/util/RegionSplitCalculator.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.util.Bytes.ByteArrayComparator' import.</td>
-<td>32</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>52</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>86</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>88</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>90</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>222</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.RegionSplitter.java">org/apache/hadoop/hbase/util/RegionSplitter.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>HideUtilityClassConstructor</td>
-<td>Utility classes should not have a public or default constructor.</td>
-<td>144</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>393</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>433</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>MethodLength</td>
-<td>Method length is 198 lines (max allowed is 150).</td>
-<td>456</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>457</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>573</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>658</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>742</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>coding</td>
-<td>InnerAssignment</td>
-<td>Inner assignments should be avoided.</td>
-<td>751</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>782</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>783</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>789</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>798</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>824</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>826</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.RetryCounter.java">org/apache/hadoop/hbase/util/RetryCounter.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 106).</td>
-<td>155</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.RollingStatCalculator.java">org/apache/hadoop/hbase/util/RollingStatCalculator.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>48</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>61</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>LeftCurly</td>
-<td>'{' at column 5 should be on the previous line.</td>
-<td>73</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>81</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>106</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.ServerCommandLine.java">org/apache/hadoop/hbase/util/ServerCommandLine.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
-<td>30</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>132</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>misc</td>
-<td>ArrayTypeStyle</td>
-<td>Array brackets at illegal position.</td>
-<td>147</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.ServerRegionReplicaUtil.java">org/apache/hadoop/hbase/util/ServerRegionReplicaUtil.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>119</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>158</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.ShutdownHookManager.java">org/apache/hadoop/hbase/util/ShutdownHookManager.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'else' construct must use '{}'s.</td>
-<td>67</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.SimpleByteRange.java">org/apache/hadoop/hbase/util/SimpleByteRange.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>coding</td>
-<td>EqualsHashCode</td>
-<td>Definition of 'equals()' without corresponding definition of 'hashCode()'.</td>
-<td>127</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.SimpleMutableByteRange.java">org/apache/hadoop/hbase/util/SimpleMutableByteRange.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>124</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>131</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>coding</td>
-<td>EqualsHashCode</td>
-<td>Definition of 'equals()' without corresponding definition of 'hashCode()'.</td>
-<td>225</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.SimplePositionedByteRange.java">org/apache/hadoop/hbase/util/SimplePositionedByteRange.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>LeftCurly</td>
-<td>'{' at column 57 should have line break after.</td>
-<td>132</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.SimplePositionedMutableByteRange.java">org/apache/hadoop/hbase/util/SimplePositionedMutableByteRange.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>183</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>190</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>217</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>224</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.Sleeper.java">org/apache/hadoop/hbase/util/Sleeper.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>45</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>80</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.StealJobQueue.java">org/apache/hadoop/hbase/util/StealJobQueue.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'java.util.Comparator' import.</td>
-<td>23</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>127</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.StoppableImplementation.java">org/apache/hadoop/hbase/util/StoppableImplementation.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.Stoppable' import.</td>
-<td>22</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.Strings.java">org/apache/hadoop/hbase/util/Strings.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>HideUtilityClassConstructor</td>
-<td>Utility classes should not have a public or default constructor.</td>
-<td>27</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>74</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.TestBloomFilterChunk.java">org/apache/hadoop/hbase/util/TestBloomFilterChunk.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>115</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>155</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.TestBytes.java">org/apache/hadoop/hbase/util/TestBytes.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>MethodParamPad</td>
-<td>'(' is preceded with whitespace.</td>
-<td>102</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>MethodParamPad</td>
-<td>'(' is preceded with whitespace.</td>
-<td>107</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>MethodParamPad</td>
-<td>'(' is preceded with whitespace.</td>
-<td>108</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>MethodParamPad</td>
-<td>'(' is preceded with whitespace.</td>
-<td>110</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>MethodParamPad</td>
-<td>'(' is preceded with whitespace.</td>
-<td>111</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>misc</td>
-<td>UpperEll</td>
-<td>Should use uppercase 'L'.</td>
-<td>195</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>misc</td>
-<td>UpperEll</td>
-<td>Should use uppercase 'L'.</td>
-<td>195</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>misc</td>
-<td>UpperEll</td>
-<td>Should use uppercase 'L'.</td>
-<td>281</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>misc</td>
-<td>UpperEll</td>
-<td>Should use uppercase 'L'.</td>
-<td>281</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>414</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>ParenPad</td>
-<td>'(' is followed by whitespace.</td>
-<td>514</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>551</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>552</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>553</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>554</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>555</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>556</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>557</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 8, expected level should be 6.</td>
-<td>558</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>LeftCurly</td>
-<td>'{' at column 5 should be on the previous line.</td>
-<td>561</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>LeftCurly</td>
-<td>'{' at column 5 should be on the previous line.</td>
-<td>578</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>LeftCurly</td>
-<td>'{' at column 5 should be on the previous line.</td>
-<td>585</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.TestCompressionTest.java">org/apache/hadoop/hbase/util/TestCompressionTest.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>AvoidStarImport</td>
-<td>Using the '.*' form of import should be avoided - org.junit.Assert.*.</td>
-<td>20</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'try' child has incorrect indentation level 12, expected level should be 10.</td>
-<td>115</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'try' child has incorrect indentation level 12, expected level should be 10.</td>
-<td>116</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'try' child has incorrect indentation level 12, expected level should be 10.</td>
-<td>119</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'try' child has incorrect indentation level 12, expected level should be 10.</td>
-<td>120</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'try' child has incorrect indentation level 12, expected level should be 10.</td>
-<td>122</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'try' child has incorrect indentation level 12, expected level should be 10.</td>
-<td>123</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 104).</td>
-<td>123</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'try' child has incorrect indentation level 12, expected level should be 10.</td>
-<td>124</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'try' child has incorrect indentation level 12, expected level should be 10.</td>
-<td>125</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'try' child has incorrect indentation level 12, expected level should be 10.</td>
-<td>126</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'try' child has incorrect indentation level 12, expected level should be 10.</td>
-<td>129</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.TestCoprocessorClassLoader.java">org/apache/hadoop/hbase/util/TestCoprocessorClassLoader.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>63</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>159</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 108).</td>
-<td>161</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.TestCoprocessorScanPolicy.java">org/apache/hadoop/hbase/util/TestCoprocessorScanPolicy.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.junit.Assert.assertEquals' import.</td>
-<td>27</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.TestFSTableDescriptors.java">org/apache/hadoop/hbase/util/TestFSTableDescriptors.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 109).</td>
-<td>88</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 109).</td>
-<td>108</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>213</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 105).</td>
-<td>229</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 102).</td>
-<td>240</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 105).</td>
-<td>269</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 102).</td>
-<td>277</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 105).</td>
-<td>301</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 101).</td>
-<td>304</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 109).</td>
-<td>326</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 109).</td>
-<td>419</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.TestFSUtils.java">org/apache/hadoop/hbase/util/TestFSUtils.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>90</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>misc</td>
-<td>ArrayTypeStyle</td>
-<td>Array brackets at illegal position.</td>
-<td>110</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'try rcurly' has incorrect indentation level 6, expected level should be 4.</td>
-<td>137</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>misc</td>
-<td>ArrayTypeStyle</td>
-<td>Array brackets at illegal position.</td>
-<td>144</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>misc</td>
-<td>ArrayTypeStyle</td>
-<td>Array brackets at illegal position.</td>
-<td>179</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 122).</td>
-<td>337</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>473</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.TestHFileArchiveUtil.java">org/apache/hadoop/hbase/util/TestHFileArchiveUtil.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>AvoidStarImport</td>
-<td>Using the '.*' form of import should be avoided - org.junit.Assert.*.</td>
-<td>20</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def' child has incorrect indentation level 6, expected level should be 4.</td>
-<td>73</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.TestIdLock.java">org/apache/hadoop/hbase/util/TestIdLock.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'for' construct must use '{}'s.</td>
-<td>102</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.TestIdReadWriteLock.java">org/apache/hadoop/hbase/util/TestIdReadWriteLock.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'for' construct must use '{}'s.</td>
-<td>123</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>133</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>135</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>136</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>137</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>140</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>141</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 6, expected level should be 8.</td>
-<td>142</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>143</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.TestMiniClusterLoadEncoded.java">org/apache/hadoop/hbase/util/TestMiniClusterLoadEncoded.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>whitespace</td>
-<td>ParenPad</td>
-<td>')' is preceded with whitespace.</td>
-<td>50</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.TestMiniClusterLoadSequential.java">org/apache/hadoop/hbase/util/TestMiniClusterLoadSequential.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 10, expected level should be 8.</td>
-<td>103</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.TestOrderedBytes.java">org/apache/hadoop/hbase/util/TestOrderedBytes.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>misc</td>
-<td>ArrayTypeStyle</td>
-<td>Array brackets at illegal position.</td>
-<td>119</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization lcurly' has incorrect indentation level 8, expected level should be one of the following: 4, 6.</td>
-<td>120</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>misc</td>
-<td>ArrayTypeStyle</td>
-<td>Array brackets at illegal position.</td>
-<td>124</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>211</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'else' construct must use '{}'s.</td>
-<td>212</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>278</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'else' construct must use '{}'s.</td>
-<td>279</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>422</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'else' construct must use '{}'s.</td>
-<td>423</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>490</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'else' construct must use '{}'s.</td>
-<td>491</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>558</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'else' construct must use '{}'s.</td>
-<td>559</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>625</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'else' construct must use '{}'s.</td>
-<td>626</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>694</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'else' construct must use '{}'s.</td>
-<td>695</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>764</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'else' construct must use '{}'s.</td>
-<td>765</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>misc</td>
-<td>ArrayTypeStyle</td>
-<td>Array brackets at illegal position.</td>
-<td>785</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>834</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'else' construct must use '{}'s.</td>
-<td>835</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>955</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'else' construct must use '{}'s.</td>
-<td>956</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>1032</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'else' construct must use '{}'s.</td>
-<td>1033</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>misc</td>
-<td>UpperEll</td>
-<td>Should use uppercase 'L'.</td>
-<td>1085</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>misc</td>
-<td>UpperEll</td>
-<td>Should use uppercase 'L'.</td>
-<td>1094</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>misc</td>
-<td>UpperEll</td>
-<td>Should use uppercase 'L'.</td>
-<td>1216</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>misc</td>
-<td>UpperEll</td>
-<td>Should use uppercase 'L'.</td>
-<td>1225</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.TestRegionSplitter.java">org/apache/hadoop/hbase/util/TestRegionSplitter.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'member def modifier' has incorrect indentation level 4, expected level should be 2.</td>
-<td>64</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'member def modifier' has incorrect indentation level 4, expected level should be 2.</td>
-<td>65</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'member def modifier' has incorrect indentation level 4, expected level should be 2.</td>
-<td>66</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'member def modifier' has incorrect indentation level 4, expected level should be 2.</td>
-<td>67</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'member def modifier' has incorrect indentation level 4, expected level should be 2.</td>
-<td>69</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def modifier' has incorrect indentation level 4, expected level should be 2.</td>
-<td>72</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def' child has incorrect indentation level 8, expected level should be 4.</td>
-<td>74</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def rcurly' has incorrect indentation level 4, expected level should be 2.</td>
-<td>75</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def modifier' has incorrect indentation level 4, expected level should be 2.</td>
-<td>77</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def' child has incorrect indentation level 8, expected level should be 4.</td>
-<td>79</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def rcurly' has incorrect indentation level 4, expected level should be 2.</td>
-<td>80</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.TestSimplePositionedMutableByteRange.java">org/apache/hadoop/hbase/util/TestSimplePositionedMutableByteRange.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method call' child has incorrect indentation level 5, expected level should be 6.</td>
-<td>43</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method call' child has incorrect indentation level 5, expected level should be 6.</td>
-<td>53</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.TestSortedList.java">org/apache/hadoop/hbase/util/TestSortedList.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>AvoidStarImport</td>
-<td>Using the '.*' form of import should be avoided - org.junit.Assert.*.</td>
-<td>20</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 116).</td>
-<td>78</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 116).</td>
-<td>113</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 106).</td>
-<td>165</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.Threads.java">org/apache/hadoop/hbase/util/Threads.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>HideUtilityClassConstructor</td>
-<td>Utility classes should not have a public or default constructor.</td>
-<td>45</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>110</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>123</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>124</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>127</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>187</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.TimeOffsetEnvironmentEdge.java">org/apache/hadoop/hbase/util/TimeOffsetEnvironmentEdge.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>LeftCurly</td>
-<td>'{' at column 3 should be on the previous line.</td>
-<td>35</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>LeftCurly</td>
-<td>'{' at column 3 should be on the previous line.</td>
-<td>40</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.Triple.java">org/apache/hadoop/hbase/util/Triple.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>64</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>66</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>68</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.UnsafeAccess.java">org/apache/hadoop/hbase/util/UnsafeAccess.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>170</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>171</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>184</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>185</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>197</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>198</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>212</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>213</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>226</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>227</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>239</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>240</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>254</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>255</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>268</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>269</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>281</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>282</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>314</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>315</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>316</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>317</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>318</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>347</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>348</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>349</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>350</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>351</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>371</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>372</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>373</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>374</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>375</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>467</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>468</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.UnsafeAvailChecker.java">org/apache/hadoop/hbase/util/UnsafeAvailChecker.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>FinalClass</td>
-<td>Class UnsafeAvailChecker should be declared as final.</td>
-<td>29</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.VersionInfo.java">org/apache/hadoop/hbase/util/VersionInfo.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>HideUtilityClassConstructor</td>
-<td>Utility classes should not have a public or default constructor.</td>
-<td>33</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.Writables.java">org/apache/hadoop/hbase/util/Writables.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.io.DataInputBuffer' import.</td>
-<td>30</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>HideUtilityClassConstructor</td>
-<td>Utility classes should not have a public or default constructor.</td>
-<td>36</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>92</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>94</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>95</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>97</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>100</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>111</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>113</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>114</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>116</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>120</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>146</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>158</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.ZKDataMigrator.java">org/apache/hadoop/hbase/util/ZKDataMigrator.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.zookeeper.ZKUtil' import.</td>
-<td>30</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>FinalClass</td>
-<td>Class ZKDataMigrator should be declared as final.</td>
-<td>42</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>64</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>72</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 10, expected level should be 12.</td>
-<td>73</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 10, expected level should be 12.</td>
-<td>74</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>75</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 10, expected level should be 12.</td>
-<td>76</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 10, expected level should be 12.</td>
-<td>77</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>78</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 10, expected level should be 12.</td>
-<td>79</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 10, expected level should be 12.</td>
-<td>80</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>81</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 10, expected level should be 12.</td>
-<td>82</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'block' child has incorrect indentation level 10, expected level should be 12.</td>
-<td>83</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'case' child has incorrect indentation level 8, expected level should be 10.</td>
-<td>84</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>99</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>109</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.compaction.TestMajorCompactor.java">org/apache/hadoop/hbase/util/compaction/TestMajorCompactor.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.junit.After' import.</td>
-<td>30</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.junit.Assert.assertEquals' import.</td>
-<td>31</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.hbck.HFileCorruptionChecker.java">org/apache/hadoop/hbase/util/hbck/HFileCorruptionChecker.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
-<td>38</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>161</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>194</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>263</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>298</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>332</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 101).</td>
-<td>335</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>480</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>516</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>524</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.hbck.HbckTestingUtil.java">org/apache/hadoop/hbase/util/hbck/HbckTestingUtil.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.conf.Configuration' import.</td>
-<td>30</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>design</td>
-<td>HideUtilityClassConstructor</td>
-<td>Utility classes should not have a public or default constructor.</td>
-<td>35</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 101).</td>
-<td>87</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.hbck.OfflineMetaRebuildTestCore.java">org/apache/hadoop/hbase/util/hbck/OfflineMetaRebuildTestCore.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>128</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>129</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>130</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'Result' has incorrect indentation level 4, expected level should be 6.</td>
-<td>264</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.hbck.ReplicationChecker.java">org/apache/hadoop/hbase/util/hbck/ReplicationChecker.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'lambda arguments' has incorrect indentation level 8, expected level should be 6.</td>
-<td>111</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.test.LoadTestDataGenerator.java">org/apache/hadoop/hbase/util/test/LoadTestDataGenerator.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.client.Get' import.</td>
-<td>24</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>147</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>148</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>150</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>158</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>159</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>161</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.util.test.LoadTestDataGeneratorWithACL.java">org/apache/hadoop/hbase/util/test/LoadTestDataGeneratorWithACL.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.client.Delete' import.</td>
-<td>24</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.wal.AbstractFSWALProvider.java">org/apache/hadoop/hbase/wal/AbstractFSWALProvider.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.regionserver.wal.AbstractFSWAL' import.</td>
-<td>43</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>309</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>462</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>LeftCurly</td>
-<td>'{' at column 3 should be on the previous line.</td>
-<td>467</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.wal.BoundedGroupingStrategy.java">org/apache/hadoop/hbase/wal/BoundedGroupingStrategy.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.util.Bytes' import.</td>
-<td>28</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>60</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.wal.DisabledWALProvider.java">org/apache/hadoop/hbase/wal/DisabledWALProvider.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>LeftCurly</td>
-<td>'{' at column 49 should have line break after.</td>
-<td>189</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>213</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.wal.IOTestProvider.java">org/apache/hadoop/hbase/wal/IOTestProvider.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>176</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>177</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>185</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>coding</td>
-<td>InnerAssignment</td>
-<td>Inner assignments should be avoided.</td>
-<td>244</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>coding</td>
-<td>InnerAssignment</td>
-<td>Inner assignments should be avoided.</td>
-<td>246</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.wal.NamespaceGroupingStrategy.java">org/apache/hadoop/hbase/wal/NamespaceGroupingStrategy.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'org.apache.hadoop.hbase.util.Bytes' import.</td>
-<td>24</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.wal.NettyAsyncFSWALConfigHelper.java">org/apache/hadoop/hbase/wal/NettyAsyncFSWALConfigHelper.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 106).</td>
-<td>45</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.wal.TestBoundedRegionGroupingStrategy.java">org/apache/hadoop/hbase/wal/TestBoundedRegionGroupingStrategy.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 10, expected level should be one of the following: 8, 21.</td>
-<td>142</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 12, expected level should be one of the following: 10, 23.</td>
-<td>154</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 12, expected level should be one of the following: 10, 23.</td>
-<td>169</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.wal.TestFSHLogProvider.java">org/apache/hadoop/hbase/wal/TestFSHLogProvider.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>167</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>176</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>177</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>263</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>339</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.wal.TestWALFactory.java">org/apache/hadoop/hbase/wal/TestWALFactory.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>175</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 110).</td>
-<td>219</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>231</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'while' construct must use '{}'s.</td>
-<td>284</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'while' construct must use '{}'s.</td>
-<td>298</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'while' construct must use '{}'s.</td>
-<td>305</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'while' construct must use '{}'s.</td>
-<td>321</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'while' construct must use '{}'s.</td>
-<td>328</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>332</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>337</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def' child has incorrect indentation level 5, expected level should be 4.</td>
-<td>397</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'try' has incorrect indentation level 10, expected level should be 8.</td>
-<td>457</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'try' child has incorrect indentation level 12, expected level should be 10.</td>
-<td>458</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'try rcurly' has incorrect indentation level 10, expected level should be 8.</td>
-<td>460</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'catch' child has incorrect indentation level 12, expected level should be 10.</td>
-<td>461</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'catch rcurly' has incorrect indentation level 10, expected level should be 8.</td>
-<td>462</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>475</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>540</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>616</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.wal.TestWALFiltering.java">org/apache/hadoop/hbase/wal/TestWALFiltering.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>113</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'org' has incorrect indentation level 2, expected level should be 4.</td>
-<td>114</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>149</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'org' has incorrect indentation level 2, expected level should be 4.</td>
-<td>150</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.wal.TestWALMethods.java">org/apache/hadoop/hbase/wal/TestWALMethods.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>84</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'throws' has incorrect indentation level 2, expected level should be 4.</td>
-<td>130</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.wal.TestWALOpenAfterDNRollingStart.java">org/apache/hadoop/hbase/wal/TestWALOpenAfterDNRollingStart.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>102</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.wal.TestWALReaderOnSecureWAL.java">org/apache/hadoop/hbase/wal/TestWALReaderOnSecureWAL.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 106).</td>
-<td>93</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.wal.TestWALRootDir.java">org/apache/hadoop/hbase/wal/TestWALRootDir.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>133</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.wal.TestWALSplit.java">org/apache/hadoop/hbase/wal/TestWALSplit.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>EmptyBlock</td>
-<td>Must have at least one statement.</td>
-<td>113</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>226</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>227</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'while' construct must use '{}'s.</td>
-<td>241</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'while' construct must use '{}'s.</td>
-<td>695</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'while' construct must use '{}'s.</td>
-<td>830</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 10, expected level should be 8.</td>
-<td>901</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'array initialization' child has incorrect indentation level 10, expected level should be 8.</td>
-<td>902</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def modifier' has incorrect indentation level 6, expected level should be one of the following: 10, 12.</td>
-<td>926</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 12, 14.</td>
-<td>928</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def' child has incorrect indentation level 8, expected level should be one of the following: 12, 14.</td>
-<td>929</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'method def rcurly' has incorrect indentation level 6, expected level should be one of the following: 10, 12.</td>
-<td>930</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>indentation</td>
-<td>Indentation</td>
-<td>'object def rcurly' has incorrect indentation level 4, expected level should be one of the following: 8, 10.</td>
-<td>931</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>1047</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>misc</td>
-<td>ArrayTypeStyle</td>
-<td>Array brackets at illegal position.</td>
-<td>1051</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 109).</td>
-<td>1208</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.wal.WAL.java">org/apache/hadoop/hbase/wal/WAL.java</h3>
-<table border="0" class="table table-striped">
-<tr class="b">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>107</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>109</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>110</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>112</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>sizes</td>
-<td>LineLength</td>
-<td>Line is longer than 100 characters (found 101).</td>
-<td>114</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>120</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>121</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>122</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>123</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>130</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>137</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>168</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>169</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>170</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>171</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>JavadocTagContinuationIndentation</td>
-<td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>205</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.wal.WALEdit.java">org/apache/hadoop/hbase/wal/WALEdit.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>279</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.wal.WALFactory.java">org/apache/hadoop/hbase/wal/WALFactory.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>308</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.wal.WALKey.java">org/apache/hadoop/hbase/wal/WALKey.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>imports</td>
-<td>ImportOrder</td>
-<td>Wrong order for 'java.util.ArrayList' import.</td>
-<td>27</td></tr></table></div>
-<div class="section">
-<h3 id="org.apache.hadoop.hbase.wal.WALKeyImpl.java">org/apache/hadoop/hbase/wal/WALKeyImpl.java</h3>
-<table border="0" class="table table-striped">
-<tr class="a">
-<th>Severity</th>
-<th>Category</th>
-<th>Rule</th>
-<th>Message</th>
-<th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>260</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>261</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>278</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>301</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>302</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>303</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>304</td></tr></table></div>
+<td>335</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.wal.WALPerformanceEvaluation.java">org/apache/hadoop/hbase/wal/WALPerformanceEvaluation.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>LineLength</td>
 <td>Line is longer than 100 characters (found 111).</td>
 <td>173</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>sizes</td>
 <td>MethodLength</td>
 <td>Method length is 193 lines (max allowed is 150).</td>
 <td>203</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>356</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>359</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>380</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>412</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>414</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>440</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'for' construct must use '{}'s.</td>
 <td>570</td></tr>
-<tr class="a">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>578</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>580</td></tr>
+<td>578</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>580</td></tr>
+<tr class="b">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
 <td>'method def' child has incorrect indentation level 5, expected level should be 4.</td>
@@ -92875,191 +92869,191 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.wal.WALPrettyPrinter.java">org/apache/hadoop/hbase/wal/WALPrettyPrinter.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>219</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>223</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>232</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>235</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>300</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>302</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>309</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>316</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>321</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'else' construct must use '{}'s.</td>
 <td>323</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>338</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>415</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
 <td>417</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>blocks</td>
-<td>NeedBraces</td>
-<td>'if' construct must use '{}'s.</td>
-<td>419</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
-<td>421</td></tr>
+<td>419</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
+<td>421</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>blocks</td>
+<td>NeedBraces</td>
+<td>'if' construct must use '{}'s.</td>
 <td>423</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.wal.WALSplitUtil.java">org/apache/hadoop/hbase/wal/WALSplitUtil.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>88</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>89</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>90</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>170</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>301</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>347</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'mutation' must be private and have accessor methods.</td>
 <td>450</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'nonceGroup' must be private and have accessor methods.</td>
 <td>451</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'nonce' must be private and have accessor methods.</td>
 <td>452</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>481</td></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>482</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>486</td></tr>
+<td>482</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
+<td>486</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>NeedBraces</td>
 <td>'if' construct must use '{}'s.</td>
@@ -93067,13 +93061,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.zookeeper.ReadOnlyZKClient.java">org/apache/hadoop/hbase/zookeeper/ReadOnlyZKClient.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>indentation</td>
 <td>Indentation</td>
@@ -93082,40 +93076,40 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.zookeeper.ZKConfig.java">org/apache/hadoop/hbase/zookeeper/ZKConfig.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
-<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
-<td>javadoc</td>
-<td>NonEmptyAtclauseDescription</td>
-<td>At-clause should have a non-empty description.</td>
-<td>119</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
-<td>212</td></tr>
+<td>119</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
+<td>212</td></tr>
+<tr class="a">
+<td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
+<td>javadoc</td>
+<td>NonEmptyAtclauseDescription</td>
+<td>At-clause should have a non-empty description.</td>
 <td>214</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.zookeeper.ZKMetadata.java">org/apache/hadoop/hbase/zookeeper/ZKMetadata.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>FinalClass</td>
@@ -93124,151 +93118,151 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.zookeeper.ZNodePaths.java">org/apache/hadoop/hbase/zookeeper/ZNodePaths.java</h3>
 <table border="0" class="table table-striped">
-<tr class="a">
+<tr class="b">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'baseZNode' must be private and have accessor methods.</td>
 <td>46</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'metaZNodePrefix' must be private and have accessor methods.</td>
 <td>48</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'metaReplicaZNodes' must be private and have accessor methods.</td>
 <td>50</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'rsZNode' must be private and have accessor methods.</td>
 <td>52</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'drainingZNode' must be private and have accessor methods.</td>
 <td>54</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'masterAddressZNode' must be private and have accessor methods.</td>
 <td>56</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'backupMasterAddressesZNode' must be private and have accessor methods.</td>
 <td>58</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'clusterStateZNode' must be private and have accessor methods.</td>
 <td>60</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>annotation</td>
 <td>MissingDeprecated</td>
 <td>Must include both @java.lang.Deprecated annotation and @deprecated Javadoc tag with description.</td>
 <td>65</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'tableZNode' must be private and have accessor methods.</td>
 <td>66</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'clusterIdZNode' must be private and have accessor methods.</td>
 <td>68</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'splitLogZNode' must be private and have accessor methods.</td>
 <td>70</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'balancerZNode' must be private and have accessor methods.</td>
 <td>72</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'regionNormalizerZNode' must be private and have accessor methods.</td>
 <td>74</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'switchZNode' must be private and have accessor methods.</td>
 <td>76</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'tableLockZNode' must be private and have accessor methods.</td>
 <td>78</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'namespaceZNode' must be private and have accessor methods.</td>
 <td>80</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'masterMaintZNode' must be private and have accessor methods.</td>
 <td>82</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'replicationZNode' must be private and have accessor methods.</td>
 <td>85</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'peersZNode' must be private and have accessor methods.</td>
 <td>87</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'queuesZNode' must be private and have accessor methods.</td>
 <td>89</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>design</td>
 <td>VisibilityModifier</td>
 <td>Variable 'hfileRefsZNode' must be private and have accessor methods.</td>
 <td>91</td></tr>
-<tr class="b">
+<tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
 <td>At-clause should have a non-empty description.</td>
 <td>144</td></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>NonEmptyAtclauseDescription</td>
@@ -93277,13 +93271,13 @@
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.zookeeper.ZooKeeperHelper.java">org/apache/hadoop/hbase/zookeeper/ZooKeeperHelper.java</h3>
 <table border="0" class="table table-striped">
-<tr class="b">
+<tr class="a">
 <th>Severity</th>
 <th>Category</th>
 <th>Rule</th>
 <th>Message</th>
 <th>Line</th></tr>
-<tr class="a">
+<tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>imports</td>
 <td>ImportOrder</td>
@@ -93297,7 +93291,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-09</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-10</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/checkstyle.rss b/checkstyle.rss
index df8b32f..f66c664 100644
--- a/checkstyle.rss
+++ b/checkstyle.rss
@@ -26,7 +26,7 @@
     <copyright>&#169;2007 - 2019 The Apache Software Foundation</copyright>
     <item>
       <title>File: 3937,
-             Errors: 11761,
+             Errors: 11760,
              Warnings: 0,
              Infos: 0
       </title>
@@ -40165,7 +40165,7 @@
                   0
                 </td>
                 <td>
-                  30
+                  29
                 </td>
               </tr>
                           <tr>
diff --git a/coc.html b/coc.html
index 5a54619..90d2c27 100644
--- a/coc.html
+++ b/coc.html
@@ -224,7 +224,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-09</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-10</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/dependencies.html b/dependencies.html
index 9ed70b2..df3c45a2 100644
--- a/dependencies.html
+++ b/dependencies.html
@@ -296,7 +296,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-09</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-10</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/dependency-convergence.html b/dependency-convergence.html
index e921ab8..b4a92a9 100644
--- a/dependency-convergence.html
+++ b/dependency-convergence.html
@@ -679,7 +679,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-09</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-10</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/dependency-info.html b/dependency-info.html
index f22c696..057c66e 100644
--- a/dependency-info.html
+++ b/dependency-info.html
@@ -177,7 +177,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-09</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-10</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/dependency-management.html b/dependency-management.html
index 8ed480b..37b05aa 100644
--- a/dependency-management.html
+++ b/dependency-management.html
@@ -893,7 +893,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-09</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-10</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/devapidocs/constant-values.html b/devapidocs/constant-values.html
index 9ea06ff..7c52d09 100644
--- a/devapidocs/constant-values.html
+++ b/devapidocs/constant-values.html
@@ -3955,14 +3955,14 @@
 <!--   -->
 </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>"Fri Aug  9 14:34:42 UTC 2019"</code></td>
+<td class="colLast"><code>"Sat Aug 10 14:34:42 UTC 2019"</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>"0136b9873ff753ca181403d280a6e9ea135fbc95"</code></td>
+<td class="colLast"><code>"c8f57bf678fa4eb617074f8296e25cb8a147a5d5"</code></td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><a name="org.apache.hadoop.hbase.Version.srcChecksum">
diff --git a/devapidocs/index-all.html b/devapidocs/index-all.html
index 286c4cd..af0987e 100644
--- a/devapidocs/index-all.html
+++ b/devapidocs/index-all.html
@@ -1675,6 +1675,12 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/MultiResponse.html#addException-byte:A-java.lang.Throwable-">addException(byte[], Throwable)</a></span> - Method in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/MultiResponse.html" title="class in org.apache.hadoop.hbase.client">MultiResponse</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/wal/WALKey.html#addExtendedAttribute-java.lang.String-byte:A-">addExtendedAttribute(String, byte[])</a></span> - Method in interface org.apache.hadoop.hbase.wal.<a href="org/apache/hadoop/hbase/wal/WALKey.html" title="interface in org.apache.hadoop.hbase.wal">WALKey</a></dt>
+<dd>
+<div class="block">Add a named String value to this WALKey to be persisted into the WAL</div>
+</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/wal/WALKeyImpl.html#addExtendedAttribute-java.lang.String-byte:A-">addExtendedAttribute(String, byte[])</a></span> - Method in class org.apache.hadoop.hbase.wal.<a href="org/apache/hadoop/hbase/wal/WALKeyImpl.html" title="class in org.apache.hadoop.hbase.wal">WALKeyImpl</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/rest/client/Client.html#addExtraHeader-java.lang.String-java.lang.String-">addExtraHeader(String, String)</a></span> - Method in class org.apache.hadoop.hbase.rest.client.<a href="org/apache/hadoop/hbase/rest/client/Client.html" title="class in org.apache.hadoop.hbase.rest.client">Client</a></dt>
 <dd>
 <div class="block">Add extra headers.</div>
@@ -86219,6 +86225,12 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/DefaultHeapMemoryTuner.html#prevTuneDirection">prevTuneDirection</a></span> - Variable in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/DefaultHeapMemoryTuner.html" title="class in org.apache.hadoop.hbase.regionserver">DefaultHeapMemoryTuner</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preWALAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">preWALAppend(ObserverContext&lt;RegionCoprocessorEnvironment&gt;, WALKey, WALEdit)</a></span> - Method in interface org.apache.hadoop.hbase.coprocessor.<a href="org/apache/hadoop/hbase/coprocessor/RegionObserver.html" title="interface in org.apache.hadoop.hbase.coprocessor">RegionObserver</a></dt>
+<dd>
+<div class="block">Called just before the WAL Entry is appended to the WAL.</div>
+</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.html#preWALAppend-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">preWALAppend(WALKey, WALEdit)</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.html" title="class in org.apache.hadoop.hbase.regionserver">RegionCoprocessorHost</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preWALRestore-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">preWALRestore(ObserverContext&lt;? extends RegionCoprocessorEnvironment&gt;, RegionInfo, WALKey, WALEdit)</a></span> - Method in interface org.apache.hadoop.hbase.coprocessor.<a href="org/apache/hadoop/hbase/coprocessor/RegionObserver.html" title="interface in org.apache.hadoop.hbase.coprocessor">RegionObserver</a></dt>
 <dd>
 <div class="block">Called before a <a href="org/apache/hadoop/hbase/wal/WALEdit.html" title="class in org.apache.hadoop.hbase.wal"><code>WALEdit</code></a>
@@ -123540,6 +123552,15 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/wal/WALKeyImpl.html#WALKeyImpl-byte:A-org.apache.hadoop.hbase.TableName-long-org.apache.hadoop.hbase.regionserver.MultiVersionConcurrencyControl-">WALKeyImpl(byte[], TableName, long, MultiVersionConcurrencyControl)</a></span> - Constructor for class org.apache.hadoop.hbase.wal.<a href="org/apache/hadoop/hbase/wal/WALKeyImpl.html" title="class in org.apache.hadoop.hbase.wal">WALKeyImpl</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/wal/WALKeyImpl.html#WALKeyImpl-org.apache.hadoop.hbase.wal.WALKeyImpl-java.util.Map-">WALKeyImpl(WALKeyImpl, Map&lt;String, byte[]&gt;)</a></span> - Constructor for class org.apache.hadoop.hbase.wal.<a href="org/apache/hadoop/hbase/wal/WALKeyImpl.html" title="class in org.apache.hadoop.hbase.wal">WALKeyImpl</a></dt>
+<dd>
+<div class="block">Copy constructor that takes in an existing WALKeyImpl plus some extended attributes.</div>
+</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/wal/WALKeyImpl.html#WALKeyImpl-org.apache.hadoop.hbase.wal.WALKey-java.util.List-org.apache.hadoop.hbase.regionserver.MultiVersionConcurrencyControl-java.util.NavigableMap-java.util.Map-">WALKeyImpl(WALKey, List&lt;UUID&gt;, MultiVersionConcurrencyControl, NavigableMap&lt;byte[], Integer&gt;, Map&lt;String, byte[]&gt;)</a></span> - Constructor for class org.apache.hadoop.hbase.wal.<a href="org/apache/hadoop/hbase/wal/WALKeyImpl.html" title="class in org.apache.hadoop.hbase.wal">WALKeyImpl</a></dt>
+<dd>
+<div class="block">Copy constructor that takes in an existing WALKey, the extra WALKeyImpl fields that the
+ parent interface is missing, plus some extended attributes.</div>
+</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/wal/WALKeyImpl.html#WALKeyImpl-byte:A-org.apache.hadoop.hbase.TableName-long-long-java.util.List-long-long-org.apache.hadoop.hbase.regionserver.MultiVersionConcurrencyControl-java.util.NavigableMap-">WALKeyImpl(byte[], TableName, long, long, List&lt;UUID&gt;, long, long, MultiVersionConcurrencyControl, NavigableMap&lt;byte[], Integer&gt;)</a></span> - Constructor for class org.apache.hadoop.hbase.wal.<a href="org/apache/hadoop/hbase/wal/WALKeyImpl.html" title="class in org.apache.hadoop.hbase.wal">WALKeyImpl</a></dt>
 <dd>
 <div class="block">Create the log key for writing to somewhere.</div>
diff --git a/devapidocs/org/apache/hadoop/hbase/backup/BackupObserver.html b/devapidocs/org/apache/hadoop/hbase/backup/BackupObserver.html
index f144244..081e0ec 100644
--- a/devapidocs/org/apache/hadoop/hbase/backup/BackupObserver.html
+++ b/devapidocs/org/apache/hadoop/hbase/backup/BackupObserver.html
@@ -248,7 +248,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.<a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html" title="interface in org.apache.hadoop.hbase.coprocessor">RegionObserver</a></h3>
-<code><a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-org.apache.hadoop.hbase.client.Result-">postAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postAppendBeforeWAL-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Mutation-java.util.List-">postAppendBeforeWAL</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postBatchMutate-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-">postBatchMutate</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postBatchMutateIndispensably-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-boolean-">postBatchMutateIndispensably</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCheckAndDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">postCheckAndDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCheckAndPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">postCheckAndPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-boolean-">postClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCloseRegionOperation-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Region.Operation-">postCloseRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCommitStoreFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-org.apache.hadoop.fs.Path-org.apache.hadoop.fs.Path-">postCommitStoreFile</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCompact-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.StoreFile-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">postCompact</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCompactSelection-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-java.util.List-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">postCompactSelection</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Delete-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">postDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postExists-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-boolean-">postExists</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">postFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.StoreFile-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">postFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postGetOp-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-java.util.List-">postGetOp</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postIncrement-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-org.apache.hadoop.hbase.client.Result-">postIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postIncrementBeforeWAL-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Mutation-java.util.List-">postIncrementBeforeWAL</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postInstantiateDeleteTracker-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.querymatcher.DeleteTracker-">postInstantiateDeleteTracker</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postMemStoreCompaction-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-">postMemStoreCompaction</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postMutationBeforeWAL-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.coprocessor.RegionObserver.MutationType-org.apache.hadoop.hbase.client.Mutation-org.apache.hadoop.hbase.Cell-org.apache.hadoop.hbase.Cell-">postMutationBeforeWAL</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-">postOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Put-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">postPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postReplayWALs-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.fs.Path-">postReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postScannerClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-">postScannerClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postScannerFilterRow-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.Cell-boolean-">postScannerFilterRow</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postScannerNext-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-java.util.List-int-boolean-">postScannerNext</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Scan-org.apache.hadoop.hbase.regionserver.RegionScanner-">postScannerOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postStartRegionOperation-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Region.Operation-">postStartRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postStoreFileReaderOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-org.apache.hadoop.hbase.io.FSDataInputStreamWrapper-long-org.apache.hadoop.hbase.io.hfile.CacheConfig-org.apache.hadoop.hbase.io.Reference-org.apache.hadoop.hbase.regionserver.StoreFileReader-">postStoreFileReaderOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postWALRestore-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">postWALRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-">preAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preAppendAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-">preAppendAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preBatchMutate-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-">preBatchMutate</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preBulkLoadHFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.List-">preBulkLoadHFile</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCheckAndDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">preCheckAndDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCheckAndDeleteAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">preCheckAndDeleteAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCheckAndPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">preCheckAndPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCheckAndPutAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">preCheckAndPutAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-boolean-">preClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCompact-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.regionserver.ScanType-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">preCompact</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCompactScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.ScanType-org.apache.hadoop.hbase.regionserver.ScanOptions-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">preCompactScannerOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCompactSelection-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-java.util.List-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-">preCompactSelection</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Delete-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">preDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preExists-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-boolean-">preExists</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">preFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">preFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preFlushScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.ScanOptions-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">preFlushScannerOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preGetOp-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-java.util.List-">preGetOp</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preIncrement-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-">preIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preIncrementAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-">preIncrementAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preMemStoreCompaction-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-">preMemStoreCompaction</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preMemStoreCompactionCompact-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.InternalScanner-">preMemStoreCompactionCompact</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preMemStoreCompactionCompactScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.ScanOptions-">preMemStoreCompactionCompactScannerOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-">preOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#prePrepareTimeStampForDeleteVersion-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Mutation-org.apache.hadoop.hbase.Cell-byte:A-org.apache.hadoop.hbase.client.Get-">prePrepareTimeStampForDeleteVersion</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#prePut-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Put-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">prePut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preReplayWALs-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.fs.Path-">preReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preScannerClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-">preScannerClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preScannerNext-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-java.util.List-int-boolean-">preScannerNext</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Scan-">preScannerOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preStoreFileReaderOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-org.apache.hadoop.hbase.io.FSDataInputStreamWrapper-long-org.apache.hadoop.hbase.io.hfile.CacheConfig-org.apache.hadoop.hbase.io.Reference-org.apache.hadoop.hbase.regionserver.StoreFileReader-">preStoreFileReaderOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preStoreScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.ScanOptions-">preStoreScannerOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preWALRestore-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">preWALRestore</a></code></li>
+<code><a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-org.apache.hadoop.hbase.client.Result-">postAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postAppendBeforeWAL-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Mutation-java.util.List-">postAppendBeforeWAL</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postBatchMutate-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-">postBatchMutate</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postBatchMutateIndispensably-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-boolean-">postBatchMutateIndispensably</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCheckAndDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">postCheckAndDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCheckAndPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">postCheckAndPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-boolean-">postClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCloseRegionOperation-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Region.Operation-">postCloseRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCommitStoreFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-org.apache.hadoop.fs.Path-org.apache.hadoop.fs.Path-">postCommitStoreFile</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCompact-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.StoreFile-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">postCompact</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCompactSelection-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-java.util.List-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">postCompactSelection</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Delete-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">postDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postExists-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-boolean-">postExists</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">postFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.StoreFile-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">postFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postGetOp-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-java.util.List-">postGetOp</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postIncrement-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-org.apache.hadoop.hbase.client.Result-">postIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postIncrementBeforeWAL-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Mutation-java.util.List-">postIncrementBeforeWAL</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postInstantiateDeleteTracker-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.querymatcher.DeleteTracker-">postInstantiateDeleteTracker</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postMemStoreCompaction-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-">postMemStoreCompaction</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postMutationBeforeWAL-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.coprocessor.RegionObserver.MutationType-org.apache.hadoop.hbase.client.Mutation-org.apache.hadoop.hbase.Cell-org.apache.hadoop.hbase.Cell-">postMutationBeforeWAL</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-">postOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Put-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">postPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postReplayWALs-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.fs.Path-">postReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postScannerClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-">postScannerClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postScannerFilterRow-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.Cell-boolean-">postScannerFilterRow</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postScannerNext-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-java.util.List-int-boolean-">postScannerNext</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Scan-org.apache.hadoop.hbase.regionserver.RegionScanner-">postScannerOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postStartRegionOperation-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Region.Operation-">postStartRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postStoreFileReaderOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-org.apache.hadoop.hbase.io.FSDataInputStreamWrapper-long-org.apache.hadoop.hbase.io.hfile.CacheConfig-org.apache.hadoop.hbase.io.Reference-org.apache.hadoop.hbase.regionserver.StoreFileReader-">postStoreFileReaderOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postWALRestore-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">postWALRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-">preAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preAppendAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-">preAppendAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preBatchMutate-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-">preBatchMutate</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preBulkLoadHFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.List-">preBulkLoadHFile</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCheckAndDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">preCheckAndDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCheckAndDeleteAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">preCheckAndDeleteAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCheckAndPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">preCheckAndPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCheckAndPutAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">preCheckAndPutAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-boolean-">preClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCompact-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.regionserver.ScanType-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">preCompact</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCompactScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.ScanType-org.apache.hadoop.hbase.regionserver.ScanOptions-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">preCompactScannerOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCompactSelection-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-java.util.List-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-">preCompactSelection</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Delete-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">preDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preExists-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-boolean-">preExists</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">preFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">preFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preFlushScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.ScanOptions-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">preFlushScannerOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preGetOp-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-java.util.List-">preGetOp</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preIncrement-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-">preIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preIncrementAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-">preIncrementAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preMemStoreCompaction-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-">preMemStoreCompaction</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preMemStoreCompactionCompact-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.InternalScanner-">preMemStoreCompactionCompact</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preMemStoreCompactionCompactScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.ScanOptions-">preMemStoreCompactionCompactScannerOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-">preOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#prePrepareTimeStampForDeleteVersion-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Mutation-org.apache.hadoop.hbase.Cell-byte:A-org.apache.hadoop.hbase.client.Get-">prePrepareTimeStampForDeleteVersion</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#prePut-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Put-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">prePut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preReplayWALs-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.fs.Path-">preReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preScannerClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-">preScannerClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preScannerNext-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-java.util.List-int-boolean-">preScannerNext</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Scan-">preScannerOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preStoreFileReaderOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-org.apache.hadoop.hbase.io.FSDataInputStreamWrapper-long-org.apache.hadoop.hbase.io.hfile.CacheConfig-org.apache.hadoop.hbase.io.Reference-org.apache.hadoop.hbase.regionserver.StoreFileReader-">preStoreFileReaderOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preStoreScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.ScanOptions-">preStoreScannerOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preWALAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">preWALAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preWALRestore-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">preWALRestore</a></code></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/backup/package-tree.html b/devapidocs/org/apache/hadoop/hbase/backup/package-tree.html
index 5e742e6..6b6a01e 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.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/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/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/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/BackupInfo.BackupPhase.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupInfo.BackupPhase</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/client/package-tree.html b/devapidocs/org/apache/hadoop/hbase/client/package-tree.html
index 33e2606..4934eb4 100644
--- a/devapidocs/org/apache/hadoop/hbase/client/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/client/package-tree.html
@@ -424,21 +424,21 @@
 <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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/AbstractResponse.ResponseType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AbstractResponse.ResponseType</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/constraint/ConstraintProcessor.html b/devapidocs/org/apache/hadoop/hbase/constraint/ConstraintProcessor.html
index 1f2c99a..2d61b90 100644
--- a/devapidocs/org/apache/hadoop/hbase/constraint/ConstraintProcessor.html
+++ b/devapidocs/org/apache/hadoop/hbase/constraint/ConstraintProcessor.html
@@ -271,7 +271,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.<a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html" title="interface in org.apache.hadoop.hbase.coprocessor">RegionObserver</a></h3>
-<code><a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-org.apache.hadoop.hbase.client.Result-">postAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postAppendBeforeWAL-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Mutation-java.util.List-">postAppendBeforeWAL</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postBatchMutate-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-">postBatchMutate</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postBatchMutateIndispensably-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-boolean-">postBatchMutateIndispensably</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postBulkLoadHFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.List-java.util.Map-">postBulkLoadHFile</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCheckAndDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">postCheckAndDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCheckAndPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">postCheckAndPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-boolean-">postClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCloseRegionOperation-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Region.Operation-">postCloseRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCommitStoreFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-org.apache.hadoop.fs.Path-org.apache.hadoop.fs.Path-">postCommitStoreFile</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCompact-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.StoreFile-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">postCompact</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCompactSelection-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-java.util.List-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">postCompactSelection</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Delete-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">postDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postExists-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-boolean-">postExists</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">postFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.StoreFile-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">postFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postGetOp-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-java.util.List-">postGetOp</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postIncrement-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-org.apache.hadoop.hbase.client.Result-">postIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postIncrementBeforeWAL-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Mutation-java.util.List-">postIncrementBeforeWAL</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postInstantiateDeleteTracker-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.querymatcher.DeleteTracker-">postInstantiateDeleteTracker</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postMemStoreCompaction-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-">postMemStoreCompaction</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postMutationBeforeWAL-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.coprocessor.RegionObserver.MutationType-org.apache.hadoop.hbase.client.Mutation-org.apache.hadoop.hbase.Cell-org.apache.hadoop.hbase.Cell-">postMutationBeforeWAL</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-">postOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Put-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">postPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postReplayWALs-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.fs.Path-">postReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postScannerClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-">postScannerClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postScannerNext-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-java.util.List-int-boolean-">postScannerNext</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Scan-org.apache.hadoop.hbase.regionserver.RegionScanner-">postScannerOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postStartRegionOperation-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Region.Operation-">postStartRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postStoreFileReaderOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-org.apache.hadoop.hbase.io.FSDataInputStreamWrapper-long-org.apache.hadoop.hbase.io.hfile.CacheConfig-org.apache.hadoop.hbase.io.Reference-org.apache.hadoop.hbase.regionserver.StoreFileReader-">postStoreFileReaderOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postWALRestore-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">postWALRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-">preAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preAppendAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-">preAppendAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preBatchMutate-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-">preBatchMutate</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preBulkLoadHFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.List-">preBulkLoadHFile</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCheckAndDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">preCheckAndDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCheckAndDeleteAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">preCheckAndDeleteAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCheckAndPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">preCheckAndPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCheckAndPutAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">preCheckAndPutAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-boolean-">preClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCommitStoreFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-java.util.List-">preCommitStoreFile</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCompact-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.regionserver.ScanType-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">preCompact</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCompactScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.ScanType-org.apache.hadoop.hbase.regionserver.ScanOptions-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">preCompactScannerOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCompactSelection-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-java.util.List-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-">preCompactSelection</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Delete-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">preDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preExists-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-boolean-">preExists</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">preFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">preFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preFlushScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.ScanOptions-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">preFlushScannerOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preGetOp-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-java.util.List-">preGetOp</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preIncrement-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-">preIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preIncrementAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-">preIncrementAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preMemStoreCompaction-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-">preMemStoreCompaction</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preMemStoreCompactionCompact-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.InternalScanner-">preMemStoreCompactionCompact</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preMemStoreCompactionCompactScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.ScanOptions-">preMemStoreCompactionCompactScannerOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-">preOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#prePrepareTimeStampForDeleteVersion-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Mutation-org.apache.hadoop.hbase.Cell-byte:A-org.apache.hadoop.hbase.client.Get-">prePrepareTimeStampForDeleteVersion</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preReplayWALs-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.fs.Path-">preReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preScannerClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-">preScannerClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preScannerNext-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-java.util.List-int-boolean-">preScannerNext</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Scan-">preScannerOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preStoreFileReaderOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-org.apache.hadoop.hbase.io.FSDataInputStreamWrapper-long-org.apache.hadoop.hbase.io.hfile.CacheConfig-org.apache.hadoop.hbase.io.Reference-org.apache.hadoop.hbase.regionserver.StoreFileReader-">preStoreFileReaderOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preStoreScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.ScanOptions-">preStoreScannerOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preWALRestore-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">preWALRestore</a></code></li>
+<code><a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-org.apache.hadoop.hbase.client.Result-">postAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postAppendBeforeWAL-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Mutation-java.util.List-">postAppendBeforeWAL</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postBatchMutate-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-">postBatchMutate</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postBatchMutateIndispensably-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-boolean-">postBatchMutateIndispensably</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postBulkLoadHFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.List-java.util.Map-">postBulkLoadHFile</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCheckAndDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">postCheckAndDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCheckAndPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">postCheckAndPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-boolean-">postClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCloseRegionOperation-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Region.Operation-">postCloseRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCommitStoreFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-org.apache.hadoop.fs.Path-org.apache.hadoop.fs.Path-">postCommitStoreFile</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCompact-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.StoreFile-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">postCompact</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCompactSelection-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-java.util.List-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">postCompactSelection</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Delete-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">postDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postExists-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-boolean-">postExists</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">postFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.StoreFile-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">postFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postGetOp-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-java.util.List-">postGetOp</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postIncrement-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-org.apache.hadoop.hbase.client.Result-">postIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postIncrementBeforeWAL-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Mutation-java.util.List-">postIncrementBeforeWAL</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postInstantiateDeleteTracker-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.querymatcher.DeleteTracker-">postInstantiateDeleteTracker</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postMemStoreCompaction-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-">postMemStoreCompaction</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postMutationBeforeWAL-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.coprocessor.RegionObserver.MutationType-org.apache.hadoop.hbase.client.Mutation-org.apache.hadoop.hbase.Cell-org.apache.hadoop.hbase.Cell-">postMutationBeforeWAL</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-">postOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Put-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">postPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postReplayWALs-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.fs.Path-">postReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postScannerClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-">postScannerClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postScannerNext-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-java.util.List-int-boolean-">postScannerNext</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Scan-org.apache.hadoop.hbase.regionserver.RegionScanner-">postScannerOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postStartRegionOperation-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Region.Operation-">postStartRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postStoreFileReaderOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-org.apache.hadoop.hbase.io.FSDataInputStreamWrapper-long-org.apache.hadoop.hbase.io.hfile.CacheConfig-org.apache.hadoop.hbase.io.Reference-org.apache.hadoop.hbase.regionserver.StoreFileReader-">postStoreFileReaderOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postWALRestore-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">postWALRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-">preAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preAppendAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-">preAppendAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preBatchMutate-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-">preBatchMutate</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preBulkLoadHFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.List-">preBulkLoadHFile</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCheckAndDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">preCheckAndDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCheckAndDeleteAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">preCheckAndDeleteAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCheckAndPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">preCheckAndPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCheckAndPutAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">preCheckAndPutAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-boolean-">preClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCommitStoreFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-java.util.List-">preCommitStoreFile</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCompact-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.regionserver.ScanType-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">preCompact</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCompactScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.ScanType-org.apache.hadoop.hbase.regionserver.ScanOptions-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">preCompactScannerOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCompactSelection-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-java.util.List-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-">preCompactSelection</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Delete-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">preDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preExists-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-boolean-">preExists</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">preFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">preFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preFlushScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.ScanOptions-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">preFlushScannerOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preGetOp-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-java.util.List-">preGetOp</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preIncrement-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-">preIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preIncrementAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-">preIncrementAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preMemStoreCompaction-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-">preMemStoreCompaction</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preMemStoreCompactionCompact-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.InternalScanner-">preMemStoreCompactionCompact</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preMemStoreCompactionCompactScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.ScanOptions-">preMemStoreCompactionCompactScannerOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-">preOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#prePrepareTimeStampForDeleteVersion-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Mutation-org.apache.hadoop.hbase.Cell-byte:A-org.apache.hadoop.hbase.client.Get-">prePrepareTimeStampForDeleteVersion</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preReplayWALs-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.fs.Path-">preReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preScannerClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-">preScannerClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preScannerNext-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-java.util.List-int-boolean-">preScannerNext</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Scan-">preScannerOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preStoreFileReaderOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-org.apache.hadoop.hbase.io.FSDataInputStreamWrapper-long-org.apache.hadoop.hbase.io.hfile.CacheConfig-org.apache.hadoop.hbase.io.Reference-org.apache.hadoop.hbase.regionserver.StoreFileReader-">preStoreFileReaderOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preStoreScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.ScanOptions-">preStoreScannerOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preWALAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">preWALAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preWALRestore-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">preWALRestore</a></code></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/coprocessor/MetaTableMetrics.ExampleRegionObserverMeta.html b/devapidocs/org/apache/hadoop/hbase/coprocessor/MetaTableMetrics.ExampleRegionObserverMeta.html
index a9ba86b..41d74f4 100644
--- a/devapidocs/org/apache/hadoop/hbase/coprocessor/MetaTableMetrics.ExampleRegionObserverMeta.html
+++ b/devapidocs/org/apache/hadoop/hbase/coprocessor/MetaTableMetrics.ExampleRegionObserverMeta.html
@@ -329,7 +329,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.<a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html" title="interface in org.apache.hadoop.hbase.coprocessor">RegionObserver</a></h3>
-<code><a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-org.apache.hadoop.hbase.client.Result-">postAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postAppendBeforeWAL-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Mutation-java.util.List-">postAppendBeforeWAL</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postBatchMutate-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-">postBatchMutate</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postBatchMutateIndispensably-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-boolean-">postBatchMutateIndispensably</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postBulkLoadHFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.List-java.util.Map-">postBulkLoadHFile</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCheckAndDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">postCheckAndDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCheckAndPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">postCheckAndPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-boolean-">postClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCloseRegionOperation-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Region.Operation-">postCloseRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCommitStoreFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-org.apache.hadoop.fs.Path-org.apache.hadoop.fs.Path-">postCommitStoreFile</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCompact-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.StoreFile-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">postCompact</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCompactSelection-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-java.util.List-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">postCompactSelection</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Delete-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">postDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postExists-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-boolean-">postExists</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">postFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.StoreFile-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">postFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postGetOp-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-java.util.List-">postGetOp</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postIncrement-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-org.apache.hadoop.hbase.client.Result-">postIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postIncrementBeforeWAL-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Mutation-java.util.List-">postIncrementBeforeWAL</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postInstantiateDeleteTracker-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.querymatcher.DeleteTracker-">postInstantiateDeleteTracker</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postMemStoreCompaction-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-">postMemStoreCompaction</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postMutationBeforeWAL-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.coprocessor.RegionObserver.MutationType-org.apache.hadoop.hbase.client.Mutation-org.apache.hadoop.hbase.Cell-org.apache.hadoop.hbase.Cell-">postMutationBeforeWAL</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-">postOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Put-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">postPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postReplayWALs-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.fs.Path-">postReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postScannerClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-">postScannerClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postScannerFilterRow-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.Cell-boolean-">postScannerFilterRow</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postScannerNext-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-java.util.List-int-boolean-">postScannerNext</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Scan-org.apache.hadoop.hbase.regionserver.RegionScanner-">postScannerOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postStartRegionOperation-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Region.Operation-">postStartRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postStoreFileReaderOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-org.apache.hadoop.hbase.io.FSDataInputStreamWrapper-long-org.apache.hadoop.hbase.io.hfile.CacheConfig-org.apache.hadoop.hbase.io.Reference-org.apache.hadoop.hbase.regionserver.StoreFileReader-">postStoreFileReaderOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postWALRestore-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">postWALRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-">preAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preAppendAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-">preAppendAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preBatchMutate-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-">preBatchMutate</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preBulkLoadHFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.List-">preBulkLoadHFile</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCheckAndDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">preCheckAndDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCheckAndDeleteAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">preCheckAndDeleteAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCheckAndPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">preCheckAndPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCheckAndPutAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">preCheckAndPutAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-boolean-">preClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCommitStoreFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-java.util.List-">preCommitStoreFile</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCompact-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.regionserver.ScanType-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">preCompact</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCompactScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.ScanType-org.apache.hadoop.hbase.regionserver.ScanOptions-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">preCompactScannerOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCompactSelection-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-java.util.List-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-">preCompactSelection</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preExists-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-boolean-">preExists</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">preFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">preFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preFlushScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.ScanOptions-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">preFlushScannerOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preIncrement-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-">preIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preIncrementAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-">preIncrementAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preMemStoreCompaction-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-">preMemStoreCompaction</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preMemStoreCompactionCompact-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.InternalScanner-">preMemStoreCompactionCompact</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preMemStoreCompactionCompactScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.ScanOptions-">preMemStoreCompactionCompactScannerOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-">preOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#prePrepareTimeStampForDeleteVersion-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Mutation-org.apache.hadoop.hbase.Cell-byte:A-org.apache.hadoop.hbase.client.Get-">prePrepareTimeStampForDeleteVersion</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preReplayWALs-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.fs.Path-">preReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preScannerClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-">preScannerClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preScannerNext-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-java.util.List-int-boolean-">preScannerNext</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Scan-">preScannerOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preStoreFileReaderOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-org.apache.hadoop.hbase.io.FSDataInputStreamWrapper-long-org.apache.hadoop.hbase.io.hfile.CacheConfig-org.apache.hadoop.hbase.io.Reference-org.apache.hadoop.hbase.regionserver.StoreFileReader-">preStoreFileReaderOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preStoreScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.ScanOptions-">preStoreScannerOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preWALRestore-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">preWALRestore</a></code></li>
+<code><a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-org.apache.hadoop.hbase.client.Result-">postAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postAppendBeforeWAL-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Mutation-java.util.List-">postAppendBeforeWAL</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postBatchMutate-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-">postBatchMutate</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postBatchMutateIndispensably-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-boolean-">postBatchMutateIndispensably</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postBulkLoadHFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.List-java.util.Map-">postBulkLoadHFile</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCheckAndDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">postCheckAndDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCheckAndPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">postCheckAndPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-boolean-">postClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCloseRegionOperation-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Region.Operation-">postCloseRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCommitStoreFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-org.apache.hadoop.fs.Path-org.apache.hadoop.fs.Path-">postCommitStoreFile</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCompact-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.StoreFile-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">postCompact</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCompactSelection-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-java.util.List-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">postCompactSelection</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Delete-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">postDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postExists-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-boolean-">postExists</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">postFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.StoreFile-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">postFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postGetOp-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-java.util.List-">postGetOp</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postIncrement-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-org.apache.hadoop.hbase.client.Result-">postIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postIncrementBeforeWAL-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Mutation-java.util.List-">postIncrementBeforeWAL</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postInstantiateDeleteTracker-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.querymatcher.DeleteTracker-">postInstantiateDeleteTracker</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postMemStoreCompaction-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-">postMemStoreCompaction</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postMutationBeforeWAL-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.coprocessor.RegionObserver.MutationType-org.apache.hadoop.hbase.client.Mutation-org.apache.hadoop.hbase.Cell-org.apache.hadoop.hbase.Cell-">postMutationBeforeWAL</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-">postOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Put-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">postPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postReplayWALs-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.fs.Path-">postReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postScannerClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-">postScannerClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postScannerFilterRow-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.Cell-boolean-">postScannerFilterRow</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postScannerNext-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-java.util.List-int-boolean-">postScannerNext</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Scan-org.apache.hadoop.hbase.regionserver.RegionScanner-">postScannerOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postStartRegionOperation-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Region.Operation-">postStartRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postStoreFileReaderOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-org.apache.hadoop.hbase.io.FSDataInputStreamWrapper-long-org.apache.hadoop.hbase.io.hfile.CacheConfig-org.apache.hadoop.hbase.io.Reference-org.apache.hadoop.hbase.regionserver.StoreFileReader-">postStoreFileReaderOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postWALRestore-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">postWALRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-">preAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preAppendAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-">preAppendAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preBatchMutate-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-">preBatchMutate</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preBulkLoadHFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.List-">preBulkLoadHFile</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCheckAndDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">preCheckAndDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCheckAndDeleteAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">preCheckAndDeleteAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCheckAndPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">preCheckAndPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCheckAndPutAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">preCheckAndPutAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-boolean-">preClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCommitStoreFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-java.util.List-">preCommitStoreFile</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCompact-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.regionserver.ScanType-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">preCompact</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCompactScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.ScanType-org.apache.hadoop.hbase.regionserver.ScanOptions-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">preCompactScannerOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCompactSelection-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-java.util.List-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-">preCompactSelection</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preExists-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-boolean-">preExists</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">preFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">preFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preFlushScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.ScanOptions-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">preFlushScannerOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preIncrement-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-">preIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preIncrementAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-">preIncrementAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preMemStoreCompaction-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-">preMemStoreCompaction</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preMemStoreCompactionCompact-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.InternalScanner-">preMemStoreCompactionCompact</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preMemStoreCompactionCompactScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.ScanOptions-">preMemStoreCompactionCompactScannerOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-">preOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#prePrepareTimeStampForDeleteVersion-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Mutation-org.apache.hadoop.hbase.Cell-byte:A-org.apache.hadoop.hbase.client.Get-">prePrepareTimeStampForDeleteVersion</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preReplayWALs-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.fs.Path-">preReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preScannerClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-">preScannerClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preScannerNext-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-java.util.List-int-boolean-">preScannerNext</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Scan-">preScannerOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preStoreFileReaderOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-org.apache.hadoop.hbase.io.FSDataInputStreamWrapper-long-org.apache.hadoop.hbase.io.hfile.CacheConfig-org.apache.hadoop.hbase.io.Reference-org.apache.hadoop.hbase.regionserver.StoreFileReader-">preStoreFileReaderOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preStoreScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.ScanOptions-">preStoreScannerOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preWALAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">preWALAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preWALRestore-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">preWALRestore</a></code></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/coprocessor/RegionObserver.html b/devapidocs/org/apache/hadoop/hbase/coprocessor/RegionObserver.html
index 704fc4b..ebea9b6 100644
--- a/devapidocs/org/apache/hadoop/hbase/coprocessor/RegionObserver.html
+++ b/devapidocs/org/apache/hadoop/hbase/coprocessor/RegionObserver.html
@@ -18,7 +18,7 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":18,"i1":18,"i2":18,"i3":18,"i4":18,"i5":18,"i6":18,"i7":18,"i8":18,"i9":18,"i10":18,"i11":18,"i12":18,"i13":18,"i14":18,"i15":18,"i16":18,"i17":18,"i18":18,"i19":50,"i20":18,"i21":50,"i22":18,"i23":18,"i24":18,"i25":18,"i26":18,"i27":18,"i28":18,"i29":18,"i30":50,"i31":18,"i32":18,"i33":18,"i34":18,"i35":18,"i36":18,"i37":18,"i38":18,"i39":18,"i40":18,"i41":18,"i42":18,"i43":18,"i44":18,"i45":18,"i46":18,"i47":18,"i48":18,"i49":18,"i50":18,"i51":18,"i52":18,"i53":18,"i54":18,"i55":18,"i56":18,"i57":50,"i58":18,"i59":18,"i60":18,"i61":18,"i62":18,"i63":50,"i64":18,"i65":18};
+var methods = {"i0":18,"i1":18,"i2":18,"i3":18,"i4":18,"i5":18,"i6":18,"i7":18,"i8":18,"i9":18,"i10":18,"i11":18,"i12":18,"i13":18,"i14":18,"i15":18,"i16":18,"i17":18,"i18":18,"i19":50,"i20":18,"i21":50,"i22":18,"i23":18,"i24":18,"i25":18,"i26":18,"i27":18,"i28":18,"i29":18,"i30":50,"i31":18,"i32":18,"i33":18,"i34":18,"i35":18,"i36":18,"i37":18,"i38":18,"i39":18,"i40":18,"i41":18,"i42":18,"i43":18,"i44":18,"i45":18,"i46":18,"i47":18,"i48":18,"i49":18,"i50":18,"i51":18,"i52":18,"i53":18,"i54":18,"i55":18,"i56":18,"i57":50,"i58":18,"i59":18,"i60":18,"i61":18,"i62":18,"i63":50,"i64":18,"i65":18,"i66":18};
 var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],16:["t5","Default Methods"],32:["t6","Deprecated Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
@@ -765,6 +765,14 @@
 </tr>
 <tr id="i65" class="rowColor">
 <td class="colFirst"><code>default void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preWALAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">preWALAppend</a></span>(<a href="../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">RegionCoprocessorEnvironment</a>&gt;&nbsp;ctx,
+            <a href="../../../../../org/apache/hadoop/hbase/wal/WALKey.html" title="interface in org.apache.hadoop.hbase.wal">WALKey</a>&nbsp;key,
+            <a href="../../../../../org/apache/hadoop/hbase/wal/WALEdit.html" title="class in org.apache.hadoop.hbase.wal">WALEdit</a>&nbsp;edit)</code>
+<div class="block">Called just before the WAL Entry is appended to the WAL.</div>
+</td>
+</tr>
+<tr id="i66" class="altColor">
+<td class="colFirst"><code>default void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preWALRestore-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">preWALRestore</a></span>(<a href="../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;? extends <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">RegionCoprocessorEnvironment</a>&gt;&nbsp;ctx,
              <a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;info,
              <a href="../../../../../org/apache/hadoop/hbase/wal/WALKey.html" title="interface in org.apache.hadoop.hbase.wal">WALKey</a>&nbsp;logKey,
@@ -2521,7 +2529,7 @@
 <a name="postInstantiateDeleteTracker-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.querymatcher.DeleteTracker-">
 <!--   -->
 </a>
-<ul class="blockListLast">
+<ul class="blockList">
 <li class="blockList">
 <h4>postInstantiateDeleteTracker</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>
@@ -2545,6 +2553,28 @@
 </dl>
 </li>
 </ul>
+<a name="preWALAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>preWALAppend</h4>
+<pre>default&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/RegionObserver.html#line.1115">preWALAppend</a>(<a href="../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">RegionCoprocessorEnvironment</a>&gt;&nbsp;ctx,
+                          <a href="../../../../../org/apache/hadoop/hbase/wal/WALKey.html" title="interface in org.apache.hadoop.hbase.wal">WALKey</a>&nbsp;key,
+                          <a href="../../../../../org/apache/hadoop/hbase/wal/WALEdit.html" title="class in org.apache.hadoop.hbase.wal">WALEdit</a>&nbsp;edit)
+                   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 just before the WAL Entry is appended to the WAL. Implementing this hook allows
+ coprocessors to add extended attributes to the WALKey that then get persisted to the
+ WAL, and are available to replication endpoints to use in processing WAL Entries.</div>
+<dl>
+<dt><span class="paramLabel">Parameters:</span></dt>
+<dd><code>ctx</code> - the environment provided by the region server</dd>
+<dd><code>key</code> - the WALKey associated with a particular append to a WAL</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>
diff --git a/devapidocs/org/apache/hadoop/hbase/coprocessor/class-use/ObserverContext.html b/devapidocs/org/apache/hadoop/hbase/coprocessor/class-use/ObserverContext.html
index 4465e2d..2461796 100644
--- a/devapidocs/org/apache/hadoop/hbase/coprocessor/class-use/ObserverContext.html
+++ b/devapidocs/org/apache/hadoop/hbase/coprocessor/class-use/ObserverContext.html
@@ -2318,6 +2318,14 @@
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>default void</code></td>
+<td class="colLast"><span class="typeNameLabel">RegionObserver.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preWALAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">preWALAppend</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">RegionCoprocessorEnvironment</a>&gt;&nbsp;ctx,
+            <a href="../../../../../../org/apache/hadoop/hbase/wal/WALKey.html" title="interface in org.apache.hadoop.hbase.wal">WALKey</a>&nbsp;key,
+            <a href="../../../../../../org/apache/hadoop/hbase/wal/WALEdit.html" title="class in org.apache.hadoop.hbase.wal">WALEdit</a>&nbsp;edit)</code>
+<div class="block">Called just before the WAL Entry is appended to the WAL.</div>
+</td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><code>default void</code></td>
 <td class="colLast"><span class="typeNameLabel">RegionObserver.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preWALRestore-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">preWALRestore</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;? extends <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">RegionCoprocessorEnvironment</a>&gt;&nbsp;ctx,
              <a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;info,
              <a href="../../../../../../org/apache/hadoop/hbase/wal/WALKey.html" title="interface in org.apache.hadoop.hbase.wal">WALKey</a>&nbsp;logKey,
@@ -2326,7 +2334,7 @@
  replayed for this region.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>default void</code></td>
 <td class="colLast"><span class="typeNameLabel">WALObserver.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/coprocessor/WALObserver.html#preWALRoll-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.fs.Path-org.apache.hadoop.fs.Path-">preWALRoll</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;? extends <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/WALCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">WALCoprocessorEnvironment</a>&gt;&nbsp;ctx,
           org.apache.hadoop.fs.Path&nbsp;oldPath,
@@ -2334,7 +2342,7 @@
 <div class="block">Called before rolling the current WAL</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>default void</code></td>
 <td class="colLast"><span class="typeNameLabel">WALObserver.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/coprocessor/WALObserver.html#preWALWrite-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">preWALWrite</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;? extends <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/WALCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">WALCoprocessorEnvironment</a>&gt;&nbsp;ctx,
            <a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;info,
@@ -2346,7 +2354,7 @@
 </div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><span class="typeNameLabel">MetaTableMetrics.ExampleRegionObserverMeta.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MetaTableMetrics.ExampleRegionObserverMeta.html#registerAndMarkMetrics-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Row-">registerAndMarkMetrics</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">RegionCoprocessorEnvironment</a>&gt;&nbsp;e,
                       <a href="../../../../../../org/apache/hadoop/hbase/client/Row.html" title="interface in org.apache.hadoop.hbase.client">Row</a>&nbsp;row)</code>&nbsp;</td>
diff --git a/devapidocs/org/apache/hadoop/hbase/coprocessor/class-use/RegionCoprocessorEnvironment.html b/devapidocs/org/apache/hadoop/hbase/coprocessor/class-use/RegionCoprocessorEnvironment.html
index 1dbf211..7248bfc 100644
--- a/devapidocs/org/apache/hadoop/hbase/coprocessor/class-use/RegionCoprocessorEnvironment.html
+++ b/devapidocs/org/apache/hadoop/hbase/coprocessor/class-use/RegionCoprocessorEnvironment.html
@@ -862,6 +862,14 @@
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>default void</code></td>
+<td class="colLast"><span class="typeNameLabel">RegionObserver.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preWALAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">preWALAppend</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">RegionCoprocessorEnvironment</a>&gt;&nbsp;ctx,
+            <a href="../../../../../../org/apache/hadoop/hbase/wal/WALKey.html" title="interface in org.apache.hadoop.hbase.wal">WALKey</a>&nbsp;key,
+            <a href="../../../../../../org/apache/hadoop/hbase/wal/WALEdit.html" title="class in org.apache.hadoop.hbase.wal">WALEdit</a>&nbsp;edit)</code>
+<div class="block">Called just before the WAL Entry is appended to the WAL.</div>
+</td>
+</tr>
+<tr class="altColor">
+<td class="colFirst"><code>default void</code></td>
 <td class="colLast"><span class="typeNameLabel">RegionObserver.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preWALRestore-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">preWALRestore</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;? extends <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">RegionCoprocessorEnvironment</a>&gt;&nbsp;ctx,
              <a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;info,
              <a href="../../../../../../org/apache/hadoop/hbase/wal/WALKey.html" title="interface in org.apache.hadoop.hbase.wal">WALKey</a>&nbsp;logKey,
@@ -870,7 +878,7 @@
  replayed for this region.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><span class="typeNameLabel">MetaTableMetrics.ExampleRegionObserverMeta.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/coprocessor/MetaTableMetrics.ExampleRegionObserverMeta.html#registerAndMarkMetrics-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Row-">registerAndMarkMetrics</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">RegionCoprocessorEnvironment</a>&gt;&nbsp;e,
                       <a href="../../../../../../org/apache/hadoop/hbase/client/Row.html" title="interface in org.apache.hadoop.hbase.client">Row</a>&nbsp;row)</code>&nbsp;</td>
diff --git a/devapidocs/org/apache/hadoop/hbase/coprocessor/example/ExampleRegionObserverWithMetrics.ExampleRegionObserver.html b/devapidocs/org/apache/hadoop/hbase/coprocessor/example/ExampleRegionObserverWithMetrics.ExampleRegionObserver.html
index 8260502..4c8c4c3 100644
--- a/devapidocs/org/apache/hadoop/hbase/coprocessor/example/ExampleRegionObserverWithMetrics.ExampleRegionObserver.html
+++ b/devapidocs/org/apache/hadoop/hbase/coprocessor/example/ExampleRegionObserverWithMetrics.ExampleRegionObserver.html
@@ -270,7 +270,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html" title="interface in org.apache.hadoop.hbase.coprocessor">RegionObserver</a></h3>
-<code><a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-org.apache.hadoop.hbase.client.Result-">postAppend</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postAppendBeforeWAL-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Mutation-java.util.List-">postAppendBeforeWAL</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postBatchMutate-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-">postBatchMutate</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postBatchMutateIndispensably-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-boolean-">postBatchMutateIndispensably</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postBulkLoadHFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.List-java.util.Map-">postBulkLoadHFile</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCheckAndDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">postCheckAndDelete</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCheckAndPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">postCheckAndPut</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-boolean-">postClose</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCloseRegionOperation-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Region.Operation-">postCloseRegionOperation</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCommitStoreFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-org.apache.hadoop.fs.Path-org.apache.hadoop.fs.Path-">postCommitStoreFile</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCompact-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.StoreFile-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">postCompact</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Delete-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">postDelete</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postExists-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-boolean-">postExists</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postIncrement-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-org.apache.hadoop.hbase.client.Result-">postIncrement</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postIncrementBeforeWAL-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Mutation-java.util.List-">postIncrementBeforeWAL</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postInstantiateDeleteTracker-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.querymatcher.DeleteTracker-">postInstantiateDeleteTracker</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postMemStoreCompaction-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-">postMemStoreCompaction</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postMutationBeforeWAL-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.coprocessor.RegionObserver.MutationType-org.apache.hadoop.hbase.client.Mutation-org.apache.hadoop.hbase.Cell-org.apache.hadoop.hbase.Cell-">postMutationBeforeWAL</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-">postOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Put-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">postPut</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postReplayWALs-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.fs.Path-">postReplayWALs</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postScannerClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-">postScannerClose</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postScannerFilterRow-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.Cell-boolean-">postScannerFilterRow</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postScannerNext-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-java.util.List-int-boolean-">postScannerNext</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Scan-org.apache.hadoop.hbase.regionserver.RegionScanner-">postScannerOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postStartRegionOperation-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Region.Operation-">postStartRegionOperation</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postStoreFileReaderOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-org.apache.hadoop.hbase.io.FSDataInputStreamWrapper-long-org.apache.hadoop.hbase.io.hfile.CacheConfig-org.apache.hadoop.hbase.io.Reference-org.apache.hadoop.hbase.regionserver.StoreFileReader-">postStoreFileReaderOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postWALRestore-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">postWALRestore</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-">preAppend</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preAppendAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-">preAppendAfterRowLock</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preBatchMutate-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-">preBatchMutate</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preBulkLoadHFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.List-">preBulkLoadHFile</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCheckAndDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">preCheckAndDelete</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCheckAndDeleteAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">preCheckAndDeleteAfterRowLock</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCheckAndPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">preCheckAndPut</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCheckAndPutAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">preCheckAndPutAfterRowLock</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-boolean-">preClose</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCommitStoreFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-java.util.List-">preCommitStoreFile</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCompact-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.regionserver.ScanType-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">preCompact</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCompactScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.ScanType-org.apache.hadoop.hbase.regionserver.ScanOptions-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">preCompactScannerOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCompactSelection-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-java.util.List-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-">preCompactSelection</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Delete-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">preDelete</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preExists-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-boolean-">preExists</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">preFlush</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">preFlush</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preFlushScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.ScanOptions-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">preFlushScannerOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preIncrement-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-">preIncrement</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preIncrementAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-">preIncrementAfterRowLock</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preMemStoreCompaction-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-">preMemStoreCompaction</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preMemStoreCompactionCompact-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.InternalScanner-">preMemStoreCompactionCompact</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preMemStoreCompactionCompactScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.ScanOptions-">preMemStoreCompactionCompactScannerOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-">preOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#prePrepareTimeStampForDeleteVersion-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Mutation-org.apache.hadoop.hbase.Cell-byte:A-org.apache.hadoop.hbase.client.Get-">prePrepareTimeStampForDeleteVersion</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#prePut-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Put-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">prePut</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preReplayWALs-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.fs.Path-">preReplayWALs</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preScannerClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-">preScannerClose</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preScannerNext-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-java.util.List-int-boolean-">preScannerNext</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Scan-">preScannerOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preStoreFileReaderOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-org.apache.hadoop.hbase.io.FSDataInputStreamWrapper-long-org.apache.hadoop.hbase.io.hfile.CacheConfig-org.apache.hadoop.hbase.io.Reference-org.apache.hadoop.hbase.regionserver.StoreFileReader-">preStoreFileReaderOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preStoreScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.ScanOptions-">preStoreScannerOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preWALRestore-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">preWALRestore</a></code></li>
+<code><a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-org.apache.hadoop.hbase.client.Result-">postAppend</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postAppendBeforeWAL-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Mutation-java.util.List-">postAppendBeforeWAL</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postBatchMutate-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-">postBatchMutate</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postBatchMutateIndispensably-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-boolean-">postBatchMutateIndispensably</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postBulkLoadHFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.List-java.util.Map-">postBulkLoadHFile</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCheckAndDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">postCheckAndDelete</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCheckAndPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">postCheckAndPut</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-boolean-">postClose</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCloseRegionOperation-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Region.Operation-">postCloseRegionOperation</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCommitStoreFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-org.apache.hadoop.fs.Path-org.apache.hadoop.fs.Path-">postCommitStoreFile</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCompact-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.StoreFile-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">postCompact</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Delete-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">postDelete</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postExists-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-boolean-">postExists</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postIncrement-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-org.apache.hadoop.hbase.client.Result-">postIncrement</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postIncrementBeforeWAL-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Mutation-java.util.List-">postIncrementBeforeWAL</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postInstantiateDeleteTracker-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.querymatcher.DeleteTracker-">postInstantiateDeleteTracker</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postMemStoreCompaction-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-">postMemStoreCompaction</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postMutationBeforeWAL-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.coprocessor.RegionObserver.MutationType-org.apache.hadoop.hbase.client.Mutation-org.apache.hadoop.hbase.Cell-org.apache.hadoop.hbase.Cell-">postMutationBeforeWAL</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-">postOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Put-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">postPut</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postReplayWALs-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.fs.Path-">postReplayWALs</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postScannerClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-">postScannerClose</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postScannerFilterRow-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.Cell-boolean-">postScannerFilterRow</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postScannerNext-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-java.util.List-int-boolean-">postScannerNext</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Scan-org.apache.hadoop.hbase.regionserver.RegionScanner-">postScannerOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postStartRegionOperation-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Region.Operation-">postStartRegionOperation</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postStoreFileReaderOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-org.apache.hadoop.hbase.io.FSDataInputStreamWrapper-long-org.apache.hadoop.hbase.io.hfile.CacheConfig-org.apache.hadoop.hbase.io.Reference-org.apache.hadoop.hbase.regionserver.StoreFileReader-">postStoreFileReaderOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postWALRestore-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">postWALRestore</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-">preAppend</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preAppendAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-">preAppendAfterRowLock</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preBatchMutate-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-">preBatchMutate</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preBulkLoadHFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.List-">preBulkLoadHFile</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCheckAndDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">preCheckAndDelete</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCheckAndDeleteAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">preCheckAndDeleteAfterRowLock</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCheckAndPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">preCheckAndPut</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCheckAndPutAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">preCheckAndPutAfterRowLock</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-boolean-">preClose</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCommitStoreFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-java.util.List-">preCommitStoreFile</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCompact-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.regionserver.ScanType-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">preCompact</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCompactScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.ScanType-org.apache.hadoop.hbase.regionserver.ScanOptions-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">preCompactScannerOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCompactSelection-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-java.util.List-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-">preCompactSelection</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Delete-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">preDelete</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preExists-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-boolean-">preExists</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">preFlush</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">preFlush</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preFlushScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.ScanOptions-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">preFlushScannerOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preIncrement-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-">preIncrement</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preIncrementAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-">preIncrementAfterRowLock</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preMemStoreCompaction-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-">preMemStoreCompaction</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preMemStoreCompactionCompact-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.InternalScanner-">preMemStoreCompactionCompact</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preMemStoreCompactionCompactScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.ScanOptions-">preMemStoreCompactionCompactScannerOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-">preOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#prePrepareTimeStampForDeleteVersion-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Mutation-org.apache.hadoop.hbase.Cell-byte:A-org.apache.hadoop.hbase.client.Get-">prePrepareTimeStampForDeleteVersion</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#prePut-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Put-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">prePut</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preReplayWALs-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.fs.Path-">preReplayWALs</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preScannerClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-">preScannerClose</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preScannerNext-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-java.util.List-int-boolean-">preScannerNext</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Scan-">preScannerOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preStoreFileReaderOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-org.apache.hadoop.hbase.io.FSDataInputStreamWrapper-long-org.apache.hadoop.hbase.io.hfile.CacheConfig-org.apache.hadoop.hbase.io.Reference-org.apache.hadoop.hbase.regionserver.StoreFileReader-">preStoreFileReaderOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preStoreScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.ScanOptions-">preStoreScannerOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preWALAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">preWALAppend</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preWALRestore-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">preWALRestore</a></code></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/coprocessor/example/ScanModifyingObserver.html b/devapidocs/org/apache/hadoop/hbase/coprocessor/example/ScanModifyingObserver.html
index 47cd2d5..e6a2730 100644
--- a/devapidocs/org/apache/hadoop/hbase/coprocessor/example/ScanModifyingObserver.html
+++ b/devapidocs/org/apache/hadoop/hbase/coprocessor/example/ScanModifyingObserver.html
@@ -259,7 +259,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html" title="interface in org.apache.hadoop.hbase.coprocessor">RegionObserver</a></h3>
-<code><a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-org.apache.hadoop.hbase.client.Result-">postAppend</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postAppendBeforeWAL-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Mutation-java.util.List-">postAppendBeforeWAL</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postBatchMutate-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-">postBatchMutate</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postBatchMutateIndispensably-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-boolean-">postBatchMutateIndispensably</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postBulkLoadHFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.List-java.util.Map-">postBulkLoadHFile</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCheckAndDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">postCheckAndDelete</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCheckAndPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">postCheckAndPut</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-boolean-">postClose</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCloseRegionOperation-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Region.Operation-">postCloseRegionOperation</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCommitStoreFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-org.apache.hadoop.fs.Path-org.apache.hadoop.fs.Path-">postCommitStoreFile</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCompact-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.StoreFile-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">postCompact</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCompactSelection-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-java.util.List-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">postCompactSelection</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Delete-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">postDelete</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postExists-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-boolean-">postExists</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">postFlush</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.StoreFile-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">postFlush</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postGetOp-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-java.util.List-">postGetOp</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postIncrement-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-org.apache.hadoop.hbase.client.Result-">postIncrement</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postIncrementBeforeWAL-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Mutation-java.util.List-">postIncrementBeforeWAL</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postInstantiateDeleteTracker-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.querymatcher.DeleteTracker-">postInstantiateDeleteTracker</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postMemStoreCompaction-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-">postMemStoreCompaction</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postMutationBeforeWAL-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.coprocessor.RegionObserver.MutationType-org.apache.hadoop.hbase.client.Mutation-org.apache.hadoop.hbase.Cell-org.apache.hadoop.hbase.Cell-">postMutationBeforeWAL</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-">postOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Put-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">postPut</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postReplayWALs-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.fs.Path-">postReplayWALs</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postScannerClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-">postScannerClose</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postScannerFilterRow-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.Cell-boolean-">postScannerFilterRow</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postScannerNext-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-java.util.List-int-boolean-">postScannerNext</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Scan-org.apache.hadoop.hbase.regionserver.RegionScanner-">postScannerOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postStartRegionOperation-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Region.Operation-">postStartRegionOperation</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postStoreFileReaderOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-org.apache.hadoop.hbase.io.FSDataInputStreamWrapper-long-org.apache.hadoop.hbase.io.hfile.CacheConfig-org.apache.hadoop.hbase.io.Reference-org.apache.hadoop.hbase.regionserver.StoreFileReader-">postStoreFileReaderOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postWALRestore-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">postWALRestore</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-">preAppend</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preAppendAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-">preAppendAfterRowLock</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preBatchMutate-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-">preBatchMutate</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preBulkLoadHFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.List-">preBulkLoadHFile</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCheckAndDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">preCheckAndDelete</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCheckAndDeleteAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">preCheckAndDeleteAfterRowLock</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCheckAndPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">preCheckAndPut</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCheckAndPutAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">preCheckAndPutAfterRowLock</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-boolean-">preClose</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCommitStoreFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-java.util.List-">preCommitStoreFile</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCompact-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.regionserver.ScanType-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">preCompact</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCompactScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.ScanType-org.apache.hadoop.hbase.regionserver.ScanOptions-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">preCompactScannerOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCompactSelection-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-java.util.List-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-">preCompactSelection</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Delete-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">preDelete</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preExists-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-boolean-">preExists</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">preFlush</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">preFlush</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preFlushScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.ScanOptions-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">preFlushScannerOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preGetOp-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-java.util.List-">preGetOp</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preIncrement-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-">preIncrement</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preIncrementAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-">preIncrementAfterRowLock</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preMemStoreCompaction-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-">preMemStoreCompaction</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preMemStoreCompactionCompact-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.InternalScanner-">preMemStoreCompactionCompact</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preMemStoreCompactionCompactScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.ScanOptions-">preMemStoreCompactionCompactScannerOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-">preOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#prePrepareTimeStampForDeleteVersion-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Mutation-org.apache.hadoop.hbase.Cell-byte:A-org.apache.hadoop.hbase.client.Get-">prePrepareTimeStampForDeleteVersion</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#prePut-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Put-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">prePut</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preReplayWALs-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.fs.Path-">preReplayWALs</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preScannerClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-">preScannerClose</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preScannerNext-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-java.util.List-int-boolean-">preScannerNext</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preStoreFileReaderOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-org.apache.hadoop.hbase.io.FSDataInputStreamWrapper-long-org.apache.hadoop.hbase.io.hfile.CacheConfig-org.apache.hadoop.hbase.io.Reference-org.apache.hadoop.hbase.regionserver.StoreFileReader-">preStoreFileReaderOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preStoreScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.ScanOptions-">preStoreScannerOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preWALRestore-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">preWALRestore</a></code></li>
+<code><a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-org.apache.hadoop.hbase.client.Result-">postAppend</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postAppendBeforeWAL-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Mutation-java.util.List-">postAppendBeforeWAL</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postBatchMutate-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-">postBatchMutate</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postBatchMutateIndispensably-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-boolean-">postBatchMutateIndispensably</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postBulkLoadHFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.List-java.util.Map-">postBulkLoadHFile</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCheckAndDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">postCheckAndDelete</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCheckAndPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">postCheckAndPut</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-boolean-">postClose</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCloseRegionOperation-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Region.Operation-">postCloseRegionOperation</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCommitStoreFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-org.apache.hadoop.fs.Path-org.apache.hadoop.fs.Path-">postCommitStoreFile</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCompact-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.StoreFile-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">postCompact</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCompactSelection-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-java.util.List-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">postCompactSelection</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Delete-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">postDelete</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postExists-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-boolean-">postExists</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">postFlush</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.StoreFile-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">postFlush</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postGetOp-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-java.util.List-">postGetOp</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postIncrement-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-org.apache.hadoop.hbase.client.Result-">postIncrement</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postIncrementBeforeWAL-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Mutation-java.util.List-">postIncrementBeforeWAL</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postInstantiateDeleteTracker-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.querymatcher.DeleteTracker-">postInstantiateDeleteTracker</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postMemStoreCompaction-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-">postMemStoreCompaction</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postMutationBeforeWAL-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.coprocessor.RegionObserver.MutationType-org.apache.hadoop.hbase.client.Mutation-org.apache.hadoop.hbase.Cell-org.apache.hadoop.hbase.Cell-">postMutationBeforeWAL</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-">postOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Put-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">postPut</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postReplayWALs-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.fs.Path-">postReplayWALs</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postScannerClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-">postScannerClose</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postScannerFilterRow-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.Cell-boolean-">postScannerFilterRow</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postScannerNext-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-java.util.List-int-boolean-">postScannerNext</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Scan-org.apache.hadoop.hbase.regionserver.RegionScanner-">postScannerOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postStartRegionOperation-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Region.Operation-">postStartRegionOperation</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postStoreFileReaderOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-org.apache.hadoop.hbase.io.FSDataInputStreamWrapper-long-org.apache.hadoop.hbase.io.hfile.CacheConfig-org.apache.hadoop.hbase.io.Reference-org.apache.hadoop.hbase.regionserver.StoreFileReader-">postStoreFileReaderOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postWALRestore-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">postWALRestore</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-">preAppend</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preAppendAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-">preAppendAfterRowLock</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preBatchMutate-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-">preBatchMutate</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preBulkLoadHFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.List-">preBulkLoadHFile</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCheckAndDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">preCheckAndDelete</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCheckAndDeleteAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">preCheckAndDeleteAfterRowLock</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCheckAndPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">preCheckAndPut</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCheckAndPutAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">preCheckAndPutAfterRowLock</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-boolean-">preClose</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCommitStoreFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-java.util.List-">preCommitStoreFile</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCompact-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.regionserver.ScanType-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">preCompact</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCompactScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.ScanType-org.apache.hadoop.hbase.regionserver.ScanOptions-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">preCompactScannerOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCompactSelection-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-java.util.List-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-">preCompactSelection</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Delete-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">preDelete</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preExists-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-boolean-">preExists</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">preFlush</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">preFlush</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preFlushScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.ScanOptions-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">preFlushScannerOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preGetOp-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-java.util.List-">preGetOp</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preIncrement-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-">preIncrement</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preIncrementAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-">preIncrementAfterRowLock</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preMemStoreCompaction-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-">preMemStoreCompaction</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preMemStoreCompactionCompact-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.InternalScanner-">preMemStoreCompactionCompact</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preMemStoreCompactionCompactScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.ScanOptions-">preMemStoreCompactionCompactScannerOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-">preOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#prePrepareTimeStampForDeleteVersion-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Mutation-org.apache.hadoop.hbase.Cell-byte:A-org.apache.hadoop.hbase.client.Get-">prePrepareTimeStampForDeleteVersion</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#prePut-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Put-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">prePut</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preReplayWALs-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.fs.Path-">preReplayWALs</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preScannerClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-">preScannerClose</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preScannerNext-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-java.util.List-int-boolean-">preScannerNext</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preStoreFileReaderOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-org.apache.hadoop.hbase.io.FSDataInputStreamWrapper-long-org.apache.hadoop.hbase.io.hfile.CacheConfig-org.apache.hadoop.hbase.io.Reference-org.apache.hadoop.hbase.regionserver.StoreFileReader-">preStoreFileReaderOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preStoreScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.ScanOptions-">preStoreScannerOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preWALAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">preWALAppend</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preWALRestore-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">preWALRestore</a></code></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/coprocessor/example/ValueRewritingObserver.html b/devapidocs/org/apache/hadoop/hbase/coprocessor/example/ValueRewritingObserver.html
index b7f2a4f..ac03787 100644
--- a/devapidocs/org/apache/hadoop/hbase/coprocessor/example/ValueRewritingObserver.html
+++ b/devapidocs/org/apache/hadoop/hbase/coprocessor/example/ValueRewritingObserver.html
@@ -257,7 +257,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html" title="interface in org.apache.hadoop.hbase.coprocessor">RegionObserver</a></h3>
-<code><a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-org.apache.hadoop.hbase.client.Result-">postAppend</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postAppendBeforeWAL-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Mutation-java.util.List-">postAppendBeforeWAL</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postBatchMutate-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-">postBatchMutate</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postBatchMutateIndispensably-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-boolean-">postBatchMutateIndispensably</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postBulkLoadHFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.List-java.util.Map-">postBulkLoadHFile</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCheckAndDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">postCheckAndDelete</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCheckAndPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">postCheckAndPut</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-boolean-">postClose</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCloseRegionOperation-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Region.Operation-">postCloseRegionOperation</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCommitStoreFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-org.apache.hadoop.fs.Path-org.apache.hadoop.fs.Path-">postCommitStoreFile</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCompact-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.StoreFile-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">postCompact</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCompactSelection-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-java.util.List-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">postCompactSelection</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Delete-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">postDelete</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postExists-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-boolean-">postExists</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">postFlush</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.StoreFile-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">postFlush</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postGetOp-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-java.util.List-">postGetOp</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postIncrement-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-org.apache.hadoop.hbase.client.Result-">postIncrement</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postIncrementBeforeWAL-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Mutation-java.util.List-">postIncrementBeforeWAL</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postInstantiateDeleteTracker-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.querymatcher.DeleteTracker-">postInstantiateDeleteTracker</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postMemStoreCompaction-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-">postMemStoreCompaction</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postMutationBeforeWAL-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.coprocessor.RegionObserver.MutationType-org.apache.hadoop.hbase.client.Mutation-org.apache.hadoop.hbase.Cell-org.apache.hadoop.hbase.Cell-">postMutationBeforeWAL</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-">postOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Put-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">postPut</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postReplayWALs-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.fs.Path-">postReplayWALs</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postScannerClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-">postScannerClose</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postScannerFilterRow-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.Cell-boolean-">postScannerFilterRow</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postScannerNext-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-java.util.List-int-boolean-">postScannerNext</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Scan-org.apache.hadoop.hbase.regionserver.RegionScanner-">postScannerOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postStartRegionOperation-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Region.Operation-">postStartRegionOperation</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postStoreFileReaderOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-org.apache.hadoop.hbase.io.FSDataInputStreamWrapper-long-org.apache.hadoop.hbase.io.hfile.CacheConfig-org.apache.hadoop.hbase.io.Reference-org.apache.hadoop.hbase.regionserver.StoreFileReader-">postStoreFileReaderOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postWALRestore-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">postWALRestore</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-">preAppend</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preAppendAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-">preAppendAfterRowLock</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preBatchMutate-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-">preBatchMutate</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preBulkLoadHFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.List-">preBulkLoadHFile</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCheckAndDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">preCheckAndDelete</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCheckAndDeleteAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">preCheckAndDeleteAfterRowLock</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCheckAndPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">preCheckAndPut</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCheckAndPutAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">preCheckAndPutAfterRowLock</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-boolean-">preClose</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCommitStoreFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-java.util.List-">preCommitStoreFile</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCompactScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.ScanType-org.apache.hadoop.hbase.regionserver.ScanOptions-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">preCompactScannerOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCompactSelection-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-java.util.List-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-">preCompactSelection</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Delete-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">preDelete</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preExists-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-boolean-">preExists</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">preFlush</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">preFlush</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preFlushScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.ScanOptions-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">preFlushScannerOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preGetOp-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-java.util.List-">preGetOp</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preIncrement-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-">preIncrement</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preIncrementAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-">preIncrementAfterRowLock</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preMemStoreCompaction-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-">preMemStoreCompaction</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preMemStoreCompactionCompact-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.InternalScanner-">preMemStoreCompactionCompact</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preMemStoreCompactionCompactScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.ScanOptions-">preMemStoreCompactionCompactScannerOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-">preOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#prePrepareTimeStampForDeleteVersion-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Mutation-org.apache.hadoop.hbase.Cell-byte:A-org.apache.hadoop.hbase.client.Get-">prePrepareTimeStampForDeleteVersion</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#prePut-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Put-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">prePut</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preReplayWALs-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.fs.Path-">preReplayWALs</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preScannerClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-">preScannerClose</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preScannerNext-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-java.util.List-int-boolean-">preScannerNext</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Scan-">preScannerOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preStoreFileReaderOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-org.apache.hadoop.hbase.io.FSDataInputStreamWrapper-long-org.apache.hadoop.hbase.io.hfile.CacheConfig-org.apache.hadoop.hbase.io.Reference-org.apache.hadoop.hbase.regionserver.StoreFileReader-">preStoreFileReaderOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preStoreScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.ScanOptions-">preStoreScannerOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preWALRestore-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">preWALRestore</a></code></li>
+<code><a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-org.apache.hadoop.hbase.client.Result-">postAppend</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postAppendBeforeWAL-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Mutation-java.util.List-">postAppendBeforeWAL</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postBatchMutate-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-">postBatchMutate</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postBatchMutateIndispensably-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-boolean-">postBatchMutateIndispensably</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postBulkLoadHFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.List-java.util.Map-">postBulkLoadHFile</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCheckAndDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">postCheckAndDelete</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCheckAndPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">postCheckAndPut</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-boolean-">postClose</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCloseRegionOperation-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Region.Operation-">postCloseRegionOperation</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCommitStoreFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-org.apache.hadoop.fs.Path-org.apache.hadoop.fs.Path-">postCommitStoreFile</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCompact-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.StoreFile-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">postCompact</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCompactSelection-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-java.util.List-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">postCompactSelection</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Delete-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">postDelete</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postExists-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-boolean-">postExists</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">postFlush</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.StoreFile-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">postFlush</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postGetOp-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-java.util.List-">postGetOp</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postIncrement-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-org.apache.hadoop.hbase.client.Result-">postIncrement</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postIncrementBeforeWAL-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Mutation-java.util.List-">postIncrementBeforeWAL</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postInstantiateDeleteTracker-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.querymatcher.DeleteTracker-">postInstantiateDeleteTracker</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postMemStoreCompaction-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-">postMemStoreCompaction</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postMutationBeforeWAL-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.coprocessor.RegionObserver.MutationType-org.apache.hadoop.hbase.client.Mutation-org.apache.hadoop.hbase.Cell-org.apache.hadoop.hbase.Cell-">postMutationBeforeWAL</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-">postOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Put-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">postPut</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postReplayWALs-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.fs.Path-">postReplayWALs</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postScannerClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-">postScannerClose</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postScannerFilterRow-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.Cell-boolean-">postScannerFilterRow</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postScannerNext-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-java.util.List-int-boolean-">postScannerNext</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Scan-org.apache.hadoop.hbase.regionserver.RegionScanner-">postScannerOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postStartRegionOperation-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Region.Operation-">postStartRegionOperation</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postStoreFileReaderOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-org.apache.hadoop.hbase.io.FSDataInputStreamWrapper-long-org.apache.hadoop.hbase.io.hfile.CacheConfig-org.apache.hadoop.hbase.io.Reference-org.apache.hadoop.hbase.regionserver.StoreFileReader-">postStoreFileReaderOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postWALRestore-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">postWALRestore</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-">preAppend</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preAppendAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-">preAppendAfterRowLock</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preBatchMutate-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-">preBatchMutate</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preBulkLoadHFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.List-">preBulkLoadHFile</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCheckAndDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">preCheckAndDelete</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCheckAndDeleteAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">preCheckAndDeleteAfterRowLock</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCheckAndPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">preCheckAndPut</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCheckAndPutAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">preCheckAndPutAfterRowLock</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-boolean-">preClose</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCommitStoreFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-java.util.List-">preCommitStoreFile</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCompactScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.ScanType-org.apache.hadoop.hbase.regionserver.ScanOptions-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">preCompactScannerOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCompactSelection-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-java.util.List-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-">preCompactSelection</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Delete-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">preDelete</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preExists-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-boolean-">preExists</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">preFlush</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">preFlush</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preFlushScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.ScanOptions-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">preFlushScannerOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preGetOp-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-java.util.List-">preGetOp</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preIncrement-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-">preIncrement</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preIncrementAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-">preIncrementAfterRowLock</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preMemStoreCompaction-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-">preMemStoreCompaction</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preMemStoreCompactionCompact-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.InternalScanner-">preMemStoreCompactionCompact</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preMemStoreCompactionCompactScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.ScanOptions-">preMemStoreCompactionCompactScannerOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-">preOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#prePrepareTimeStampForDeleteVersion-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Mutation-org.apache.hadoop.hbase.Cell-byte:A-org.apache.hadoop.hbase.client.Get-">prePrepareTimeStampForDeleteVersion</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#prePut-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Put-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">prePut</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preReplayWALs-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.fs.Path-">preReplayWALs</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preScannerClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-">preScannerClose</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preScannerNext-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-java.util.List-int-boolean-">preScannerNext</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Scan-">preScannerOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preStoreFileReaderOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-org.apache.hadoop.hbase.io.FSDataInputStreamWrapper-long-org.apache.hadoop.hbase.io.hfile.CacheConfig-org.apache.hadoop.hbase.io.Reference-org.apache.hadoop.hbase.regionserver.StoreFileReader-">preStoreFileReaderOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preStoreScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.ScanOptions-">preStoreScannerOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preWALAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">preWALAppend</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preWALRestore-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">preWALRestore</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.org.apache.hadoop.hbase.coprocessor.RegionCoprocessor">
diff --git a/devapidocs/org/apache/hadoop/hbase/coprocessor/example/WriteHeavyIncrementObserver.html b/devapidocs/org/apache/hadoop/hbase/coprocessor/example/WriteHeavyIncrementObserver.html
index edd3ed4..a0c336a 100644
--- a/devapidocs/org/apache/hadoop/hbase/coprocessor/example/WriteHeavyIncrementObserver.html
+++ b/devapidocs/org/apache/hadoop/hbase/coprocessor/example/WriteHeavyIncrementObserver.html
@@ -339,7 +339,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html" title="interface in org.apache.hadoop.hbase.coprocessor">RegionObserver</a></h3>
-<code><a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-org.apache.hadoop.hbase.client.Result-">postAppend</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postAppendBeforeWAL-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Mutation-java.util.List-">postAppendBeforeWAL</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postBatchMutate-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-">postBatchMutate</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postBatchMutateIndispensably-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-boolean-">postBatchMutateIndispensably</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postBulkLoadHFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.List-java.util.Map-">postBulkLoadHFile</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCheckAndDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">postCheckAndDelete</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCheckAndPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">postCheckAndPut</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-boolean-">postClose</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCloseRegionOperation-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Region.Operation-">postCloseRegionOperation</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCommitStoreFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-org.apache.hadoop.fs.Path-org.apache.hadoop.fs.Path-">postCommitStoreFile</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCompact-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.StoreFile-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">postCompact</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCompactSelection-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-java.util.List-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">postCompactSelection</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Delete-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">postDelete</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postExists-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-boolean-">postExists</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">postFlush</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.StoreFile-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">postFlush</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postGetOp-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-java.util.List-">postGetOp</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postIncrement-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-org.apache.hadoop.hbase.client.Result-">postIncrement</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postIncrementBeforeWAL-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Mutation-java.util.List-">postIncrementBeforeWAL</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postInstantiateDeleteTracker-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.querymatcher.DeleteTracker-">postInstantiateDeleteTracker</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postMemStoreCompaction-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-">postMemStoreCompaction</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postMutationBeforeWAL-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.coprocessor.RegionObserver.MutationType-org.apache.hadoop.hbase.client.Mutation-org.apache.hadoop.hbase.Cell-org.apache.hadoop.hbase.Cell-">postMutationBeforeWAL</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-">postOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Put-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">postPut</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postReplayWALs-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.fs.Path-">postReplayWALs</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postScannerClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-">postScannerClose</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postScannerFilterRow-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.Cell-boolean-">postScannerFilterRow</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postScannerNext-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-java.util.List-int-boolean-">postScannerNext</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Scan-org.apache.hadoop.hbase.regionserver.RegionScanner-">postScannerOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postStartRegionOperation-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Region.Operation-">postStartRegionOperation</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postStoreFileReaderOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-org.apache.hadoop.hbase.io.FSDataInputStreamWrapper-long-org.apache.hadoop.hbase.io.hfile.CacheConfig-org.apache.hadoop.hbase.io.Reference-org.apache.hadoop.hbase.regionserver.StoreFileReader-">postStoreFileReaderOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postWALRestore-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">postWALRestore</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-">preAppend</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preAppendAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-">preAppendAfterRowLock</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preBatchMutate-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-">preBatchMutate</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preBulkLoadHFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.List-">preBulkLoadHFile</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCheckAndDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">preCheckAndDelete</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCheckAndDeleteAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">preCheckAndDeleteAfterRowLock</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCheckAndPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">preCheckAndPut</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCheckAndPutAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">preCheckAndPutAfterRowLock</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-boolean-">preClose</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCommitStoreFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-java.util.List-">preCommitStoreFile</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCompactSelection-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-java.util.List-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-">preCompactSelection</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Delete-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">preDelete</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preExists-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-boolean-">preExists</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">preFlush</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preIncrementAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-">preIncrementAfterRowLock</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preMemStoreCompaction-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-">preMemStoreCompaction</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-">preOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#prePrepareTimeStampForDeleteVersion-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Mutation-org.apache.hadoop.hbase.Cell-byte:A-org.apache.hadoop.hbase.client.Get-">prePrepareTimeStampForDeleteVersion</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#prePut-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Put-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">prePut</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preReplayWALs-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.fs.Path-">preReplayWALs</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preScannerClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-">preScannerClose</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preScannerNext-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-java.util.List-int-boolean-">preScannerNext</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Scan-">preScannerOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preStoreFileReaderOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-org.apache.hadoop.hbase.io.FSDataInputStreamWrapper-long-org.apache.hadoop.hbase.io.hfile.CacheConfig-org.apache.hadoop.hbase.io.Reference-org.apache.hadoop.hbase.regionserver.StoreFileReader-">preStoreFileReaderOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preWALRestore-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">preWALRestore</a></code></li>
+<code><a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-org.apache.hadoop.hbase.client.Result-">postAppend</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postAppendBeforeWAL-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Mutation-java.util.List-">postAppendBeforeWAL</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postBatchMutate-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-">postBatchMutate</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postBatchMutateIndispensably-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-boolean-">postBatchMutateIndispensably</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postBulkLoadHFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.List-java.util.Map-">postBulkLoadHFile</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCheckAndDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">postCheckAndDelete</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCheckAndPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">postCheckAndPut</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-boolean-">postClose</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCloseRegionOperation-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Region.Operation-">postCloseRegionOperation</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCommitStoreFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-org.apache.hadoop.fs.Path-org.apache.hadoop.fs.Path-">postCommitStoreFile</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCompact-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.StoreFile-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">postCompact</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCompactSelection-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-java.util.List-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">postCompactSelection</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Delete-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">postDelete</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postExists-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-boolean-">postExists</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">postFlush</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.StoreFile-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">postFlush</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postGetOp-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-java.util.List-">postGetOp</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postIncrement-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-org.apache.hadoop.hbase.client.Result-">postIncrement</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postIncrementBeforeWAL-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Mutation-java.util.List-">postIncrementBeforeWAL</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postInstantiateDeleteTracker-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.querymatcher.DeleteTracker-">postInstantiateDeleteTracker</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postMemStoreCompaction-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-">postMemStoreCompaction</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postMutationBeforeWAL-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.coprocessor.RegionObserver.MutationType-org.apache.hadoop.hbase.client.Mutation-org.apache.hadoop.hbase.Cell-org.apache.hadoop.hbase.Cell-">postMutationBeforeWAL</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-">postOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Put-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">postPut</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postReplayWALs-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.fs.Path-">postReplayWALs</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postScannerClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-">postScannerClose</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postScannerFilterRow-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.Cell-boolean-">postScannerFilterRow</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postScannerNext-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-java.util.List-int-boolean-">postScannerNext</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Scan-org.apache.hadoop.hbase.regionserver.RegionScanner-">postScannerOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postStartRegionOperation-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Region.Operation-">postStartRegionOperation</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postStoreFileReaderOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-org.apache.hadoop.hbase.io.FSDataInputStreamWrapper-long-org.apache.hadoop.hbase.io.hfile.CacheConfig-org.apache.hadoop.hbase.io.Reference-org.apache.hadoop.hbase.regionserver.StoreFileReader-">postStoreFileReaderOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postWALRestore-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">postWALRestore</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-">preAppend</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preAppendAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-">preAppendAfterRowLock</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preBatchMutate-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-">preBatchMutate</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preBulkLoadHFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.List-">preBulkLoadHFile</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCheckAndDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">preCheckAndDelete</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCheckAndDeleteAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">preCheckAndDeleteAfterRowLock</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCheckAndPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">preCheckAndPut</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCheckAndPutAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">preCheckAndPutAfterRowLock</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-boolean-">preClose</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCommitStoreFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-java.util.List-">preCommitStoreFile</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCompactSelection-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-java.util.List-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-">preCompactSelection</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Delete-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">preDelete</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preExists-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-boolean-">preExists</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">preFlush</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preIncrementAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-">preIncrementAfterRowLock</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preMemStoreCompaction-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-">preMemStoreCompaction</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-">preOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#prePrepareTimeStampForDeleteVersion-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Mutation-org.apache.hadoop.hbase.Cell-byte:A-org.apache.hadoop.hbase.client.Get-">prePrepareTimeStampForDeleteVersion</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#prePut-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Put-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">prePut</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preReplayWALs-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.fs.Path-">preReplayWALs</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preScannerClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-">preScannerClose</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preScannerNext-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-java.util.List-int-boolean-">preScannerNext</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Scan-">preScannerOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preStoreFileReaderOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-org.apache.hadoop.hbase.io.FSDataInputStreamWrapper-long-org.apache.hadoop.hbase.io.hfile.CacheConfig-org.apache.hadoop.hbase.io.Reference-org.apache.hadoop.hbase.regionserver.StoreFileReader-">preStoreFileReaderOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preWALAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">preWALAppend</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preWALRestore-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">preWALRestore</a></code></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/coprocessor/example/ZooKeeperScanPolicyObserver.html b/devapidocs/org/apache/hadoop/hbase/coprocessor/example/ZooKeeperScanPolicyObserver.html
index cd7ee0e..f504c8b 100644
--- a/devapidocs/org/apache/hadoop/hbase/coprocessor/example/ZooKeeperScanPolicyObserver.html
+++ b/devapidocs/org/apache/hadoop/hbase/coprocessor/example/ZooKeeperScanPolicyObserver.html
@@ -314,7 +314,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html" title="interface in org.apache.hadoop.hbase.coprocessor">RegionObserver</a></h3>
-<code><a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-org.apache.hadoop.hbase.client.Result-">postAppend</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postAppendBeforeWAL-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Mutation-java.util.List-">postAppendBeforeWAL</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postBatchMutate-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-">postBatchMutate</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postBatchMutateIndispensably-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-boolean-">postBatchMutateIndispensably</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postBulkLoadHFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.List-java.util.Map-">postBulkLoadHFile</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCheckAndDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">postCheckAndDelete</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCheckAndPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">postCheckAndPut</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-boolean-">postClose</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCloseRegionOperation-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Region.Operation-">postCloseRegionOperation</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCommitStoreFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-org.apache.hadoop.fs.Path-org.apache.hadoop.fs.Path-">postCommitStoreFile</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCompact-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.StoreFile-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">postCompact</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCompactSelection-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-java.util.List-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">postCompactSelection</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Delete-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">postDelete</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postExists-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-boolean-">postExists</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">postFlush</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.StoreFile-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">postFlush</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postGetOp-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-java.util.List-">postGetOp</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postIncrement-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-org.apache.hadoop.hbase.client.Result-">postIncrement</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postIncrementBeforeWAL-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Mutation-java.util.List-">postIncrementBeforeWAL</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postInstantiateDeleteTracker-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.querymatcher.DeleteTracker-">postInstantiateDeleteTracker</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postMemStoreCompaction-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-">postMemStoreCompaction</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postMutationBeforeWAL-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.coprocessor.RegionObserver.MutationType-org.apache.hadoop.hbase.client.Mutation-org.apache.hadoop.hbase.Cell-org.apache.hadoop.hbase.Cell-">postMutationBeforeWAL</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-">postOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Put-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">postPut</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postReplayWALs-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.fs.Path-">postReplayWALs</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postScannerClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-">postScannerClose</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postScannerFilterRow-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.Cell-boolean-">postScannerFilterRow</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postScannerNext-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-java.util.List-int-boolean-">postScannerNext</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Scan-org.apache.hadoop.hbase.regionserver.RegionScanner-">postScannerOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postStartRegionOperation-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Region.Operation-">postStartRegionOperation</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postStoreFileReaderOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-org.apache.hadoop.hbase.io.FSDataInputStreamWrapper-long-org.apache.hadoop.hbase.io.hfile.CacheConfig-org.apache.hadoop.hbase.io.Reference-org.apache.hadoop.hbase.regionserver.StoreFileReader-">postStoreFileReaderOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postWALRestore-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">postWALRestore</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-">preAppend</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preAppendAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-">preAppendAfterRowLock</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preBatchMutate-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-">preBatchMutate</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preBulkLoadHFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.List-">preBulkLoadHFile</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCheckAndDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">preCheckAndDelete</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCheckAndDeleteAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">preCheckAndDeleteAfterRowLock</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCheckAndPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">preCheckAndPut</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCheckAndPutAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">preCheckAndPutAfterRowLock</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-boolean-">preClose</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCommitStoreFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-java.util.List-">preCommitStoreFile</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCompact-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.regionserver.ScanType-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">preCompact</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCompactSelection-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-java.util.List-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-">preCompactSelection</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Delete-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">preDelete</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preExists-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-boolean-">preExists</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">preFlush</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">preFlush</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preGetOp-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-java.util.List-">preGetOp</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preIncrement-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-">preIncrement</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preIncrementAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-">preIncrementAfterRowLock</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preMemStoreCompaction-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-">preMemStoreCompaction</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preMemStoreCompactionCompact-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.InternalScanner-">preMemStoreCompactionCompact</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preMemStoreCompactionCompactScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.ScanOptions-">preMemStoreCompactionCompactScannerOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-">preOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#prePrepareTimeStampForDeleteVersion-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Mutation-org.apache.hadoop.hbase.Cell-byte:A-org.apache.hadoop.hbase.client.Get-">prePrepareTimeStampForDeleteVersion</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#prePut-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Put-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">prePut</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preReplayWALs-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.fs.Path-">preReplayWALs</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preScannerClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-">preScannerClose</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preScannerNext-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-java.util.List-int-boolean-">preScannerNext</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Scan-">preScannerOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preStoreFileReaderOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-org.apache.hadoop.hbase.io.FSDataInputStreamWrapper-long-org.apache.hadoop.hbase.io.hfile.CacheConfig-org.apache.hadoop.hbase.io.Reference-org.apache.hadoop.hbase.regionserver.StoreFileReader-">preStoreFileReaderOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preStoreScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.ScanOptions-">preStoreScannerOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preWALRestore-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">preWALRestore</a></code></li>
+<code><a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-org.apache.hadoop.hbase.client.Result-">postAppend</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postAppendBeforeWAL-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Mutation-java.util.List-">postAppendBeforeWAL</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postBatchMutate-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-">postBatchMutate</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postBatchMutateIndispensably-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-boolean-">postBatchMutateIndispensably</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postBulkLoadHFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.List-java.util.Map-">postBulkLoadHFile</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCheckAndDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">postCheckAndDelete</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCheckAndPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">postCheckAndPut</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-boolean-">postClose</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCloseRegionOperation-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Region.Operation-">postCloseRegionOperation</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCommitStoreFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-org.apache.hadoop.fs.Path-org.apache.hadoop.fs.Path-">postCommitStoreFile</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCompact-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.StoreFile-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">postCompact</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCompactSelection-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-java.util.List-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">postCompactSelection</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Delete-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">postDelete</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postExists-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-boolean-">postExists</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">postFlush</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.StoreFile-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">postFlush</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postGetOp-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-java.util.List-">postGetOp</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postIncrement-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-org.apache.hadoop.hbase.client.Result-">postIncrement</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postIncrementBeforeWAL-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Mutation-java.util.List-">postIncrementBeforeWAL</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postInstantiateDeleteTracker-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.querymatcher.DeleteTracker-">postInstantiateDeleteTracker</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postMemStoreCompaction-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-">postMemStoreCompaction</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postMutationBeforeWAL-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.coprocessor.RegionObserver.MutationType-org.apache.hadoop.hbase.client.Mutation-org.apache.hadoop.hbase.Cell-org.apache.hadoop.hbase.Cell-">postMutationBeforeWAL</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-">postOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Put-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">postPut</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postReplayWALs-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.fs.Path-">postReplayWALs</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postScannerClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-">postScannerClose</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postScannerFilterRow-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.Cell-boolean-">postScannerFilterRow</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postScannerNext-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-java.util.List-int-boolean-">postScannerNext</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Scan-org.apache.hadoop.hbase.regionserver.RegionScanner-">postScannerOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postStartRegionOperation-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Region.Operation-">postStartRegionOperation</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postStoreFileReaderOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-org.apache.hadoop.hbase.io.FSDataInputStreamWrapper-long-org.apache.hadoop.hbase.io.hfile.CacheConfig-org.apache.hadoop.hbase.io.Reference-org.apache.hadoop.hbase.regionserver.StoreFileReader-">postStoreFileReaderOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postWALRestore-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">postWALRestore</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-">preAppend</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preAppendAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-">preAppendAfterRowLock</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preBatchMutate-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-">preBatchMutate</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preBulkLoadHFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.List-">preBulkLoadHFile</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCheckAndDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">preCheckAndDelete</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCheckAndDeleteAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">preCheckAndDeleteAfterRowLock</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCheckAndPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">preCheckAndPut</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCheckAndPutAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">preCheckAndPutAfterRowLock</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-boolean-">preClose</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCommitStoreFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-java.util.List-">preCommitStoreFile</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCompact-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.regionserver.ScanType-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">preCompact</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCompactSelection-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-java.util.List-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-">preCompactSelection</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Delete-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">preDelete</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preExists-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-boolean-">preExists</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">preFlush</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">preFlush</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preGetOp-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-java.util.List-">preGetOp</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preIncrement-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-">preIncrement</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preIncrementAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-">preIncrementAfterRowLock</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preMemStoreCompaction-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-">preMemStoreCompaction</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preMemStoreCompactionCompact-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.InternalScanner-">preMemStoreCompactionCompact</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preMemStoreCompactionCompactScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.ScanOptions-">preMemStoreCompactionCompactScannerOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-">preOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#prePrepareTimeStampForDeleteVersion-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Mutation-org.apache.hadoop.hbase.Cell-byte:A-org.apache.hadoop.hbase.client.Get-">prePrepareTimeStampForDeleteVersion</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#prePut-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Put-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">prePut</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preReplayWALs-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.fs.Path-">preReplayWALs</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preScannerClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-">preScannerClose</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preScannerNext-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-java.util.List-int-boolean-">preScannerNext</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Scan-">preScannerOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preStoreFileReaderOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-org.apache.hadoop.hbase.io.FSDataInputStreamWrapper-long-org.apache.hadoop.hbase.io.hfile.CacheConfig-org.apache.hadoop.hbase.io.Reference-org.apache.hadoop.hbase.regionserver.StoreFileReader-">preStoreFileReaderOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preStoreScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.ScanOptions-">preStoreScannerOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preWALAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">preWALAppend</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preWALRestore-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">preWALRestore</a></code></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/filter/package-tree.html b/devapidocs/org/apache/hadoop/hbase/filter/package-tree.html
index a6b2111..6e53df0 100644
--- a/devapidocs/org/apache/hadoop/hbase/filter/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/filter/package-tree.html
@@ -189,13 +189,13 @@
 <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/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/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/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/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/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/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/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/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/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/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/BitComparator.BitwiseOp.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">BitComparator.BitwiseOp</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/http/package-tree.html b/devapidocs/org/apache/hadoop/hbase/http/package-tree.html
index 483ea4b..611f4f2 100644
--- a/devapidocs/org/apache/hadoop/hbase/http/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/http/package-tree.html
@@ -138,9 +138,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.http.<a href="../../../../../org/apache/hadoop/hbase/http/HttpConfig.Policy.html" title="enum in org.apache.hadoop.hbase.http"><span class="typeNameLink">HttpConfig.Policy</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.http.<a href="../../../../../org/apache/hadoop/hbase/http/ProfileServlet.Output.html" title="enum in org.apache.hadoop.hbase.http"><span class="typeNameLink">ProfileServlet.Output</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.http.<a href="../../../../../org/apache/hadoop/hbase/http/ProfileServlet.Event.html" title="enum in org.apache.hadoop.hbase.http"><span class="typeNameLink">ProfileServlet.Event</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.http.<a href="../../../../../org/apache/hadoop/hbase/http/HttpConfig.Policy.html" title="enum in org.apache.hadoop.hbase.http"><span class="typeNameLink">HttpConfig.Policy</span></a></li>
 </ul>
 </li>
 </ul>
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 f6c7a99..3cdfaae 100644
--- a/devapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
@@ -298,11 +298,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.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/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.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/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/BlockCacheFactory.ExternalBlockCaches.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockCacheFactory.ExternalBlockCaches</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/HFileBlock.Writer.State.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">HFileBlock.Writer.State</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/ipc/package-tree.html b/devapidocs/org/apache/hadoop/hbase/ipc/package-tree.html
index 79eb136..53b29e4 100644
--- a/devapidocs/org/apache/hadoop/hbase/ipc/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/ipc/package-tree.html
@@ -354,8 +354,8 @@
 <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.ipc.<a href="../../../../../org/apache/hadoop/hbase/ipc/MetricsHBaseServerSourceFactoryImpl.SourceStorage.html" title="enum in org.apache.hadoop.hbase.ipc"><span class="typeNameLink">MetricsHBaseServerSourceFactoryImpl.SourceStorage</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.ipc.<a href="../../../../../org/apache/hadoop/hbase/ipc/BufferCallBeforeInitHandler.BufferCallAction.html" title="enum in org.apache.hadoop.hbase.ipc"><span class="typeNameLink">BufferCallBeforeInitHandler.BufferCallAction</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.ipc.<a href="../../../../../org/apache/hadoop/hbase/ipc/CallEvent.Type.html" title="enum in org.apache.hadoop.hbase.ipc"><span class="typeNameLink">CallEvent.Type</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.ipc.<a href="../../../../../org/apache/hadoop/hbase/ipc/BufferCallBeforeInitHandler.BufferCallAction.html" title="enum in org.apache.hadoop.hbase.ipc"><span class="typeNameLink">BufferCallBeforeInitHandler.BufferCallAction</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html b/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html
index 87f5ac4..0248543 100644
--- a/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html
@@ -296,10 +296,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/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/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/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/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/RowCounter.RowCounterMapper.Counters.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">RowCounter.RowCounterMapper.Counters</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/master/assignment/package-tree.html b/devapidocs/org/apache/hadoop/hbase/master/assignment/package-tree.html
index b3e7c99..b988a3c 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/assignment/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/assignment/package-tree.html
@@ -151,8 +151,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.assignment.<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/ServerState.html" title="enum in org.apache.hadoop.hbase.master.assignment"><span class="typeNameLink">ServerState</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.assignment.<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.TransitionType.html" title="enum in org.apache.hadoop.hbase.master.assignment"><span class="typeNameLink">TransitRegionStateProcedure.TransitionType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.assignment.<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/ServerState.html" title="enum in org.apache.hadoop.hbase.master.assignment"><span class="typeNameLink">ServerState</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/master/package-tree.html b/devapidocs/org/apache/hadoop/hbase/master/package-tree.html
index 7e42be5..6c189db 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/package-tree.html
@@ -359,12 +359,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.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/ServerManager.ServerLiveState.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">ServerManager.ServerLiveState</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/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/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/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.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/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/ServerManager.ServerLiveState.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">ServerManager.ServerLiveState</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>
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 942a320..5ea7aac 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html
@@ -216,10 +216,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.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/MetaProcedureInterface.MetaOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">MetaProcedureInterface.MetaOperationType</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/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/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/MetaProcedureInterface.MetaOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">MetaProcedureInterface.MetaOperationType</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/monitoring/package-tree.html b/devapidocs/org/apache/hadoop/hbase/monitoring/package-tree.html
index 7524d90..452eaee 100644
--- a/devapidocs/org/apache/hadoop/hbase/monitoring/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/monitoring/package-tree.html
@@ -127,8 +127,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>
diff --git a/devapidocs/org/apache/hadoop/hbase/package-tree.html b/devapidocs/org/apache/hadoop/hbase/package-tree.html
index 69700ad..67bcf26 100644
--- a/devapidocs/org/apache/hadoop/hbase/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/package-tree.html
@@ -428,19 +428,19 @@
 <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/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/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/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/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/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/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/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/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/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/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/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/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/CompareOperator.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">CompareOperator</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/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/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/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/MetaTableAccessor.QueryType.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">MetaTableAccessor.QueryType</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html b/devapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
index 4bc45e2..88a3d8b 100644
--- a/devapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
@@ -216,11 +216,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/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/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>
+<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/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/StateMachineProcedure.Flow.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">StateMachineProcedure.Flow</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html b/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html
index b376c4a..1b6b0c8 100644
--- a/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html
@@ -240,12 +240,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/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/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/RpcThrottlingException.Type.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">RpcThrottlingException.Type</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/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>
+<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/ThrottleType.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">ThrottleType</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.html b/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.html
index 9d9da3b..1a8a474 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/HRegion.html
@@ -3378,7 +3378,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>FIXED_OVERHEAD</h4>
-<pre>public static final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8210">FIXED_OVERHEAD</a></pre>
+<pre>public static final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8215">FIXED_OVERHEAD</a></pre>
 </li>
 </ul>
 <a name="DEEP_OVERHEAD">
@@ -3387,7 +3387,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>DEEP_OVERHEAD</h4>
-<pre>public static final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8227">DEEP_OVERHEAD</a></pre>
+<pre>public static final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8232">DEEP_OVERHEAD</a></pre>
 </li>
 </ul>
 <a name="MOCKED_LIST">
@@ -3396,7 +3396,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>MOCKED_LIST</h4>
-<pre>private static final&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/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8621">MOCKED_LIST</a></pre>
+<pre>private static final&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/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8626">MOCKED_LIST</a></pre>
 <div class="block">A mocked list implementation - discards all updates.</div>
 </li>
 </ul>
@@ -7446,7 +7446,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>doCoprocessorPreCall</h4>
-<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.7989">doCoprocessorPreCall</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.Operation.html" title="enum in org.apache.hadoop.hbase.regionserver">Region.Operation</a>&nbsp;op,
+<pre>private&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/Result.html" title="class in org.apache.hadoop.hbase.client">Result</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.7994">doCoprocessorPreCall</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.Operation.html" title="enum in org.apache.hadoop.hbase.regionserver">Region.Operation</a>&nbsp;op,
                                     <a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&nbsp;mutation)
                              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">Do coprocessor pre-increment or pre-append call.</div>
@@ -7465,7 +7465,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>reckonDeltas</h4>
-<pre>private&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/regionserver/HRegion.html#line.8015">reckonDeltas</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.Operation.html" title="enum in org.apache.hadoop.hbase.regionserver">Region.Operation</a>&nbsp;op,
+<pre>private&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/regionserver/HRegion.html#line.8020">reckonDeltas</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.Operation.html" title="enum in org.apache.hadoop.hbase.regionserver">Region.Operation</a>&nbsp;op,
                              <a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&nbsp;mutation,
                              <a href="../../../../../org/apache/hadoop/hbase/client/Durability.html" title="enum in org.apache.hadoop.hbase.client">Durability</a>&nbsp;effectiveDurability,
                              <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/HStore.html" title="class in org.apache.hadoop.hbase.regionserver">HStore</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;&gt;&nbsp;forMemStore,
@@ -7491,7 +7491,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>reckonDeltasByStore</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/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8061">reckonDeltasByStore</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html" title="class in org.apache.hadoop.hbase.regionserver">HStore</a>&nbsp;store,
+<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/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8066">reckonDeltasByStore</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html" title="class in org.apache.hadoop.hbase.regionserver">HStore</a>&nbsp;store,
                                        <a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.Operation.html" title="enum in org.apache.hadoop.hbase.regionserver">Region.Operation</a>&nbsp;op,
                                        <a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&nbsp;mutation,
                                        <a href="../../../../../org/apache/hadoop/hbase/client/Durability.html" title="enum in org.apache.hadoop.hbase.client">Durability</a>&nbsp;effectiveDurability,
@@ -7524,7 +7524,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>reckonDelta</h4>
-<pre>private static&nbsp;<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/HRegion.html#line.8137">reckonDelta</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;delta,
+<pre>private static&nbsp;<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/HRegion.html#line.8142">reckonDelta</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;delta,
                                 <a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;currentCell,
                                 byte[]&nbsp;columnFamily,
                                 long&nbsp;now,
@@ -7543,7 +7543,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>getLongValue</h4>
-<pre>private static&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8165">getLongValue</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell)
+<pre>private static&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8170">getLongValue</a>(<a href="../../../../../org/apache/hadoop/hbase/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&nbsp;cell)
                           throws <a href="../../../../../org/apache/hadoop/hbase/DoNotRetryIOException.html" title="class in org.apache.hadoop.hbase">DoNotRetryIOException</a></pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
@@ -7559,7 +7559,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>get</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/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8181">get</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&nbsp;mutation,
+<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/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8186">get</a>(<a href="../../../../../org/apache/hadoop/hbase/client/Mutation.html" title="class in org.apache.hadoop.hbase.client">Mutation</a>&nbsp;mutation,
                        <a href="../../../../../org/apache/hadoop/hbase/regionserver/HStore.html" title="class in org.apache.hadoop.hbase.regionserver">HStore</a>&nbsp;store,
                        <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;coordinates,
                        <a href="../../../../../org/apache/hadoop/hbase/client/IsolationLevel.html" title="enum in org.apache.hadoop.hbase.client">IsolationLevel</a>&nbsp;isolation,
@@ -7584,7 +7584,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>sort</h4>
-<pre>private static&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/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8205">sort</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;cells,
+<pre>private static&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/Cell.html" title="interface in org.apache.hadoop.hbase">Cell</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8210">sort</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;cells,
                                <a href="../../../../../org/apache/hadoop/hbase/CellComparator.html" title="interface in org.apache.hadoop.hbase">CellComparator</a>&nbsp;comparator)</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
@@ -7598,7 +7598,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>heapSize</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8244">heapSize</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8249">heapSize</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html#heapSize--">heapSize</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/io/HeapSize.html" title="interface in org.apache.hadoop.hbase.io">HeapSize</a></code></dd>
@@ -7614,7 +7614,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>registerService</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8264">registerService</a>(com.google.protobuf.Service&nbsp;instance)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8269">registerService</a>(com.google.protobuf.Service&nbsp;instance)</pre>
 <div class="block">Registers a new protocol buffer <code>Service</code> subclass as a coprocessor endpoint to
  be available for handling Region#execService(com.google.protobuf.RpcController,
     org.apache.hadoop.hbase.protobuf.generated.ClientProtos.CoprocessorServiceCall) calls.
@@ -7640,7 +7640,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>execService</h4>
-<pre>public&nbsp;com.google.protobuf.Message&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8299">execService</a>(com.google.protobuf.RpcController&nbsp;controller,
+<pre>public&nbsp;com.google.protobuf.Message&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8304">execService</a>(com.google.protobuf.RpcController&nbsp;controller,
                                                org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos.CoprocessorServiceCall&nbsp;call)
                                         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">Executes a single protocol buffer coprocessor endpoint <code>Service</code> method using
@@ -7668,7 +7668,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>shouldForceSplit</h4>
-<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8350">shouldForceSplit</a>()</pre>
+<pre>boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8355">shouldForceSplit</a>()</pre>
 </li>
 </ul>
 <a name="getExplicitSplitPoint--">
@@ -7677,7 +7677,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>getExplicitSplitPoint</h4>
-<pre>byte[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8354">getExplicitSplitPoint</a>()</pre>
+<pre>byte[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8359">getExplicitSplitPoint</a>()</pre>
 </li>
 </ul>
 <a name="forceSplit-byte:A-">
@@ -7686,7 +7686,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>forceSplit</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8358">forceSplit</a>(byte[]&nbsp;sp)</pre>
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8363">forceSplit</a>(byte[]&nbsp;sp)</pre>
 </li>
 </ul>
 <a name="clearSplit--">
@@ -7695,7 +7695,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>clearSplit</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8367">clearSplit</a>()</pre>
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8372">clearSplit</a>()</pre>
 </li>
 </ul>
 <a name="checkSplit--">
@@ -7704,7 +7704,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>checkSplit</h4>
-<pre>public&nbsp;byte[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8378">checkSplit</a>()</pre>
+<pre>public&nbsp;byte[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8383">checkSplit</a>()</pre>
 <div class="block">Return the splitpoint. null indicates the region isn't splittable
  If the splitpoint isn't explicitly specified, it will go over the stores
  to find the best splitpoint. Currently the criteria of best splitpoint
@@ -7717,7 +7717,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>getCompactPriority</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8412">getCompactPriority</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8417">getCompactPriority</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>The priority that this region should have in the compaction queue</dd>
@@ -7730,7 +7730,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>getCoprocessorHost</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.html" title="class in org.apache.hadoop.hbase.regionserver">RegionCoprocessorHost</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8418">getCoprocessorHost</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.html" title="class in org.apache.hadoop.hbase.regionserver">RegionCoprocessorHost</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8423">getCoprocessorHost</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>the coprocessor host</dd>
@@ -7743,7 +7743,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>setCoprocessorHost</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8424">setCoprocessorHost</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.html" title="class in org.apache.hadoop.hbase.regionserver">RegionCoprocessorHost</a>&nbsp;coprocessorHost)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8429">setCoprocessorHost</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.html" title="class in org.apache.hadoop.hbase.regionserver">RegionCoprocessorHost</a>&nbsp;coprocessorHost)</pre>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
 <dd><code>coprocessorHost</code> - the new coprocessor host</dd>
@@ -7756,7 +7756,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>startRegionOperation</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8429">startRegionOperation</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8434">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>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.html#startRegionOperation--">Region</a></code></span></div>
 <div class="block">This method needs to be called before any public call that reads or
@@ -7778,7 +7778,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>startRegionOperation</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8434">startRegionOperation</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.Operation.html" title="enum in org.apache.hadoop.hbase.regionserver">Region.Operation</a>&nbsp;op)
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8439">startRegionOperation</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.Operation.html" title="enum in org.apache.hadoop.hbase.regionserver">Region.Operation</a>&nbsp;op)
                           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/Region.html#startRegionOperation-org.apache.hadoop.hbase.regionserver.Region.Operation-">Region</a></code></span></div>
 <div class="block">This method needs to be called before any public call that reads or
@@ -7802,7 +7802,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>closeRegionOperation</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8473">closeRegionOperation</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8478">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>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.html#closeRegionOperation--">Region</a></code></span></div>
 <div class="block">Closes the region operation lock.</div>
@@ -7820,7 +7820,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>closeRegionOperation</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8478">closeRegionOperation</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.Operation.html" title="enum in org.apache.hadoop.hbase.regionserver">Region.Operation</a>&nbsp;operation)
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8483">closeRegionOperation</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.Operation.html" title="enum in org.apache.hadoop.hbase.regionserver">Region.Operation</a>&nbsp;operation)
                           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/Region.html#closeRegionOperation-org.apache.hadoop.hbase.regionserver.Region.Operation-">Region</a></code></span></div>
 <div class="block">Closes the region operation lock. This needs to be called in the finally block corresponding
@@ -7839,7 +7839,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>startBulkRegionOperation</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8497">startBulkRegionOperation</a>(boolean&nbsp;writeLockNeeded)
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8502">startBulkRegionOperation</a>(boolean&nbsp;writeLockNeeded)
                                throws <a href="../../../../../org/apache/hadoop/hbase/NotServingRegionException.html" title="class in org.apache.hadoop.hbase">NotServingRegionException</a>,
                                       <a href="../../../../../org/apache/hadoop/hbase/RegionTooBusyException.html" title="class in org.apache.hadoop.hbase">RegionTooBusyException</a>,
                                       <a href="https://docs.oracle.com/javase/8/docs/api/java/io/InterruptedIOException.html?is-external=true" title="class or interface in java.io">InterruptedIOException</a></pre>
@@ -7861,7 +7861,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>closeBulkRegionOperation</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8515">closeBulkRegionOperation</a>()</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8520">closeBulkRegionOperation</a>()</pre>
 <div class="block">Closes the lock. This needs to be called in the finally block corresponding
  to the try block of #startRegionOperation</div>
 </li>
@@ -7872,7 +7872,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>recordMutationWithoutWal</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8524">recordMutationWithoutWal</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>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8529">recordMutationWithoutWal</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>
 <div class="block">Update LongAdders for number of puts without wal and the size of possible data loss.
  These information are exposed by the region server metrics.</div>
 </li>
@@ -7883,7 +7883,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>lock</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8546">lock</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;lock)
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8551">lock</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;lock)
            throws <a href="../../../../../org/apache/hadoop/hbase/RegionTooBusyException.html" title="class in org.apache.hadoop.hbase">RegionTooBusyException</a>,
                   <a href="https://docs.oracle.com/javase/8/docs/api/java/io/InterruptedIOException.html?is-external=true" title="class or interface in java.io">InterruptedIOException</a></pre>
 <dl>
@@ -7899,7 +7899,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>lock</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8555">lock</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;lock,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8560">lock</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;lock,
                   int&nbsp;multiplier)
            throws <a href="../../../../../org/apache/hadoop/hbase/RegionTooBusyException.html" title="class in org.apache.hadoop.hbase">RegionTooBusyException</a>,
                   <a href="https://docs.oracle.com/javase/8/docs/api/java/io/InterruptedIOException.html?is-external=true" title="class or interface in java.io">InterruptedIOException</a></pre>
@@ -7919,7 +7919,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>sync</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8582">sync</a>(long&nbsp;txid,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8587">sync</a>(long&nbsp;txid,
                   <a href="../../../../../org/apache/hadoop/hbase/client/Durability.html" title="enum in org.apache.hadoop.hbase.client">Durability</a>&nbsp;durability)
            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">Calls sync with the given transaction ID</div>
@@ -7937,7 +7937,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>shouldSyncWAL</h4>
-<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8614">shouldSyncWAL</a>()</pre>
+<pre>private&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8619">shouldSyncWAL</a>()</pre>
 <div class="block">Check whether we should sync the wal from the table's durability settings</div>
 </li>
 </ul>
@@ -7947,7 +7947,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>getOpenSeqNum</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8645">getOpenSeqNum</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8650">getOpenSeqNum</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>the latest sequence number that was read from storage when this region was opened</dd>
@@ -7960,7 +7960,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>getMaxStoreSeqId</h4>
-<pre>public&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/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8650">getMaxStoreSeqId</a>()</pre>
+<pre>public&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/lang/Long.html?is-external=true" title="class or interface in java.lang">Long</a>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8655">getMaxStoreSeqId</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.html#getMaxStoreSeqId--">getMaxStoreSeqId</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.html" title="interface in org.apache.hadoop.hbase.regionserver">Region</a></code></dd>
@@ -7976,7 +7976,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>getOldestSeqIdOfStore</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8654">getOldestSeqIdOfStore</a>(byte[]&nbsp;familyName)</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8659">getOldestSeqIdOfStore</a>(byte[]&nbsp;familyName)</pre>
 </li>
 </ul>
 <a name="getCompactionState--">
@@ -7985,7 +7985,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>getCompactionState</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/CompactionState.html" title="enum in org.apache.hadoop.hbase.client">CompactionState</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8659">getCompactionState</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/client/CompactionState.html" title="enum in org.apache.hadoop.hbase.client">CompactionState</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8664">getCompactionState</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.html#getCompactionState--">getCompactionState</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.html" title="interface in org.apache.hadoop.hbase.regionserver">Region</a></code></dd>
@@ -8000,7 +8000,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>reportCompactionRequestStart</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8665">reportCompactionRequestStart</a>(boolean&nbsp;isMajor)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8670">reportCompactionRequestStart</a>(boolean&nbsp;isMajor)</pre>
 </li>
 </ul>
 <a name="reportCompactionRequestEnd-boolean-int-long-">
@@ -8009,7 +8009,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>reportCompactionRequestEnd</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8669">reportCompactionRequestEnd</a>(boolean&nbsp;isMajor,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8674">reportCompactionRequestEnd</a>(boolean&nbsp;isMajor,
                                        int&nbsp;numFiles,
                                        long&nbsp;filesSizeCompacted)</pre>
 </li>
@@ -8020,7 +8020,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>reportCompactionRequestFailure</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8680">reportCompactionRequestFailure</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8685">reportCompactionRequestFailure</a>()</pre>
 </li>
 </ul>
 <a name="incrementCompactionsQueuedCount--">
@@ -8029,7 +8029,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>incrementCompactionsQueuedCount</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8684">incrementCompactionsQueuedCount</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8689">incrementCompactionsQueuedCount</a>()</pre>
 </li>
 </ul>
 <a name="decrementCompactionsQueuedCount--">
@@ -8038,7 +8038,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>decrementCompactionsQueuedCount</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8688">decrementCompactionsQueuedCount</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8693">decrementCompactionsQueuedCount</a>()</pre>
 </li>
 </ul>
 <a name="incrementFlushesQueuedCount--">
@@ -8047,7 +8047,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>incrementFlushesQueuedCount</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8692">incrementFlushesQueuedCount</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8697">incrementFlushesQueuedCount</a>()</pre>
 </li>
 </ul>
 <a name="getReadPoint--">
@@ -8056,7 +8056,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>getReadPoint</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8697">getReadPoint</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8702">getReadPoint</a>()</pre>
 </li>
 </ul>
 <a name="onConfigurationChange-org.apache.hadoop.conf.Configuration-">
@@ -8065,7 +8065,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>onConfigurationChange</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8705">onConfigurationChange</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8710">onConfigurationChange</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 <div class="block">This method would be called by the <a href="../../../../../org/apache/hadoop/hbase/conf/ConfigurationManager.html" title="class in org.apache.hadoop.hbase.conf"><code>ConfigurationManager</code></a>
  object when the <code>Configuration</code> object is reloaded from disk.</div>
 <dl>
@@ -8080,7 +8080,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>registerChildren</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8713">registerChildren</a>(<a href="../../../../../org/apache/hadoop/hbase/conf/ConfigurationManager.html" title="class in org.apache.hadoop.hbase.conf">ConfigurationManager</a>&nbsp;manager)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8718">registerChildren</a>(<a href="../../../../../org/apache/hadoop/hbase/conf/ConfigurationManager.html" title="class in org.apache.hadoop.hbase.conf">ConfigurationManager</a>&nbsp;manager)</pre>
 <div class="block">Needs to be called to register the children to the manager.</div>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
@@ -8096,7 +8096,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>deregisterChildren</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8722">deregisterChildren</a>(<a href="../../../../../org/apache/hadoop/hbase/conf/ConfigurationManager.html" title="class in org.apache.hadoop.hbase.conf">ConfigurationManager</a>&nbsp;manager)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8727">deregisterChildren</a>(<a href="../../../../../org/apache/hadoop/hbase/conf/ConfigurationManager.html" title="class in org.apache.hadoop.hbase.conf">ConfigurationManager</a>&nbsp;manager)</pre>
 <div class="block">Needs to be called to deregister the children from the manager.</div>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
@@ -8112,7 +8112,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>getCellComparator</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/CellComparator.html" title="interface in org.apache.hadoop.hbase">CellComparator</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8727">getCellComparator</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/CellComparator.html" title="interface in org.apache.hadoop.hbase">CellComparator</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8732">getCellComparator</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.html#getCellComparator--">Region</a></code></span></div>
 <div class="block">The comparator to be used with the region</div>
 <dl>
@@ -8127,7 +8127,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>getMemStoreFlushSize</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8732">getMemStoreFlushSize</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8737">getMemStoreFlushSize</a>()</pre>
 </li>
 </ul>
 <a name="throwException-java.lang.String-java.lang.String-">
@@ -8136,7 +8136,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>throwException</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8738">throwException</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;title,
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8743">throwException</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;title,
                     <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;regionName)</pre>
 </li>
 </ul>
@@ -8146,7 +8146,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>requestCompaction</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8759">requestCompaction</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;why,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8764">requestCompaction</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;why,
                               int&nbsp;priority,
                               boolean&nbsp;major,
                               <a href="../../../../../org/apache/hadoop/hbase/regionserver/compactions/CompactionLifeCycleTracker.html" title="interface in org.apache.hadoop.hbase.regionserver.compactions">CompactionLifeCycleTracker</a>&nbsp;tracker)
@@ -8167,7 +8167,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>requestCompaction</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8769">requestCompaction</a>(byte[]&nbsp;family,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8774">requestCompaction</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;why,
                               int&nbsp;priority,
                               boolean&nbsp;major,
@@ -8189,7 +8189,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>requestFlushIfNeeded</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8783">requestFlushIfNeeded</a>()
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8788">requestFlushIfNeeded</a>()
                            throws <a href="../../../../../org/apache/hadoop/hbase/RegionTooBusyException.html" title="class in org.apache.hadoop.hbase">RegionTooBusyException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -8203,7 +8203,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>requestFlush</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8789">requestFlush</a>()</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8794">requestFlush</a>()</pre>
 </li>
 </ul>
 <a name="requestFlush0-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">
@@ -8212,7 +8212,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>requestFlush0</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8796">requestFlush0</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushLifeCycleTracker.html" title="interface in org.apache.hadoop.hbase.regionserver">FlushLifeCycleTracker</a>&nbsp;tracker)</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8801">requestFlush0</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushLifeCycleTracker.html" title="interface in org.apache.hadoop.hbase.regionserver">FlushLifeCycleTracker</a>&nbsp;tracker)</pre>
 </li>
 </ul>
 <a name="requestFlush-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">
@@ -8221,7 +8221,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>requestFlush</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8816">requestFlush</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushLifeCycleTracker.html" title="interface in org.apache.hadoop.hbase.regionserver">FlushLifeCycleTracker</a>&nbsp;tracker)
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8821">requestFlush</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushLifeCycleTracker.html" title="interface in org.apache.hadoop.hbase.regionserver">FlushLifeCycleTracker</a>&nbsp;tracker)
                   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/Region.html#requestFlush-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">Region</a></code></span></div>
 <div class="block">Request flush on this region.</div>
@@ -8239,7 +8239,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>decorateRegionConfiguration</h4>
-<pre>static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8825">decorateRegionConfiguration</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre>static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/HRegion.html#line.8830">decorateRegionConfiguration</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 <div class="block">This method modifies the region's configuration in order to inject replication-related
  features</div>
 <dl>
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.html b/devapidocs/org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.html
index ad69218..17c5041 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.html
@@ -18,7 +18,7 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":10,"i1":10,"i2":9,"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,"i22":10,"i23":10,"i24":42,"i25":10,"i26":10,"i27":10,"i28":10,"i29":10,"i30":10,"i31":10,"i32":10,"i33":10,"i34":10,"i35":42,"i36":10,"i37":10,"i38":10,"i39":10,"i40":10,"i41":10,"i42":10,"i43":10,"i44":10,"i45":10,"i46":10,"i47":10,"i48":10,"i49":10,"i50":10,"i51":10,"i52":10,"i53":10,"i54":10,"i55":10,"i56":10,"i57":10,"i58":10,"i59":10,"i60":10,"i61":10,"i62":10,"i63":10,"i64":42,"i65":10,"i66":10,"i67":10,"i68":10,"i69":10,"i70":10,"i71":10,"i72":42,"i73":9};
+var methods = {"i0":10,"i1":10,"i2":9,"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,"i22":10,"i23":10,"i24":42,"i25":10,"i26":10,"i27":10,"i28":10,"i29":10,"i30":10,"i31":10,"i32":10,"i33":10,"i34":10,"i35":42,"i36":10,"i37":10,"i38":10,"i39":10,"i40":10,"i41":10,"i42":10,"i43":10,"i44":10,"i45":10,"i46":10,"i47":10,"i48":10,"i49":10,"i50":10,"i51":10,"i52":10,"i53":10,"i54":10,"i55":10,"i56":10,"i57":10,"i58":10,"i59":10,"i60":10,"i61":10,"i62":10,"i63":10,"i64":42,"i65":10,"i66":10,"i67":10,"i68":10,"i69":10,"i70":10,"i71":10,"i72":10,"i73":42,"i74":9};
 var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"],32:["t6","Deprecated Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
@@ -747,6 +747,11 @@
 </td>
 </tr>
 <tr id="i72" class="altColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.html#preWALAppend-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">preWALAppend</a></span>(<a href="../../../../../org/apache/hadoop/hbase/wal/WALKey.html" title="interface in org.apache.hadoop.hbase.wal">WALKey</a>&nbsp;key,
+            <a href="../../../../../org/apache/hadoop/hbase/wal/WALEdit.html" title="class in org.apache.hadoop.hbase.wal">WALEdit</a>&nbsp;edit)</code>&nbsp;</td>
+</tr>
+<tr id="i73" class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.html#preWALRestore-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">preWALRestore</a></span>(<a href="../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;info,
              <a href="../../../../../org/apache/hadoop/hbase/wal/WALKey.html" title="interface in org.apache.hadoop.hbase.wal">WALKey</a>&nbsp;logKey,
@@ -757,7 +762,7 @@
 </div>
 </td>
 </tr>
-<tr id="i73" class="rowColor">
+<tr id="i74" class="altColor">
 <td class="colFirst"><code>static void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.html#testTableCoprocessorAttrs-org.apache.hadoop.conf.Configuration-org.apache.hadoop.hbase.client.TableDescriptor-">testTableCoprocessorAttrs</a></span>(org.apache.hadoop.conf.Configuration&nbsp;conf,
                          <a href="../../../../../org/apache/hadoop/hbase/client/TableDescriptor.html" title="interface in org.apache.hadoop.hbase.client">TableDescriptor</a>&nbsp;htd)</code>
@@ -2230,13 +2235,28 @@
 </dl>
 </li>
 </ul>
+<a name="preWALAppend-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>preWALAppend</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.html#line.1723">preWALAppend</a>(<a href="../../../../../org/apache/hadoop/hbase/wal/WALKey.html" title="interface in org.apache.hadoop.hbase.wal">WALKey</a>&nbsp;key,
+                         <a href="../../../../../org/apache/hadoop/hbase/wal/WALEdit.html" title="class in org.apache.hadoop.hbase.wal">WALEdit</a>&nbsp;edit)
+                  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="preEndpointInvocation-com.google.protobuf.Service-java.lang.String-com.google.protobuf.Message-">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>preEndpointInvocation</h4>
-<pre>public&nbsp;com.google.protobuf.Message&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.html#line.1723">preEndpointInvocation</a>(com.google.protobuf.Service&nbsp;service,
+<pre>public&nbsp;com.google.protobuf.Message&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.html#line.1735">preEndpointInvocation</a>(com.google.protobuf.Service&nbsp;service,
                                                          <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;methodName,
                                                          com.google.protobuf.Message&nbsp;request)
                                                   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>
@@ -2252,7 +2272,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>postEndpointInvocation</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.html#line.1737">postEndpointInvocation</a>(com.google.protobuf.Service&nbsp;service,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.html#line.1749">postEndpointInvocation</a>(com.google.protobuf.Service&nbsp;service,
                                    <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;methodName,
                                    com.google.protobuf.Message&nbsp;request,
                                    com.google.protobuf.Message.Builder&nbsp;responseBuilder)
@@ -2270,7 +2290,7 @@
 <li class="blockList">
 <h4>postInstantiateDeleteTracker</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>
-public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/querymatcher/DeleteTracker.html" title="interface in org.apache.hadoop.hbase.regionserver.querymatcher">DeleteTracker</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.html#line.1752">postInstantiateDeleteTracker</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/querymatcher/DeleteTracker.html" title="interface in org.apache.hadoop.hbase.regionserver.querymatcher">DeleteTracker</a>&nbsp;result)
+public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/querymatcher/DeleteTracker.html" title="interface in org.apache.hadoop.hbase.regionserver.querymatcher">DeleteTracker</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.html#line.1764">postInstantiateDeleteTracker</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/querymatcher/DeleteTracker.html" title="interface in org.apache.hadoop.hbase.regionserver.querymatcher">DeleteTracker</a>&nbsp;result)
                                                        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="deprecatedLabel">Deprecated.</span>&nbsp;<span class="deprecationComment">Since 2.0 with out any replacement and will be removed in 3.0</span></div>
 <dl>
@@ -2285,7 +2305,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>prePrepareBulkLoad</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.html#line.1768">prePrepareBulkLoad</a>(<a href="../../../../../org/apache/hadoop/hbase/security/User.html" title="class in org.apache.hadoop.hbase.security">User</a>&nbsp;user)
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.html#line.1780">prePrepareBulkLoad</a>(<a href="../../../../../org/apache/hadoop/hbase/security/User.html" title="class in org.apache.hadoop.hbase.security">User</a>&nbsp;user)
                         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>
@@ -2299,7 +2319,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>preCleanupBulkLoad</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.html#line.1777">preCleanupBulkLoad</a>(<a href="../../../../../org/apache/hadoop/hbase/security/User.html" title="class in org.apache.hadoop.hbase.security">User</a>&nbsp;user)
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.html#line.1789">preCleanupBulkLoad</a>(<a href="../../../../../org/apache/hadoop/hbase/security/User.html" title="class in org.apache.hadoop.hbase.security">User</a>&nbsp;user)
                         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>
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/class-use/MultiVersionConcurrencyControl.html b/devapidocs/org/apache/hadoop/hbase/regionserver/class-use/MultiVersionConcurrencyControl.html
index 9d61b18..161deea 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/class-use/MultiVersionConcurrencyControl.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/class-use/MultiVersionConcurrencyControl.html
@@ -363,6 +363,16 @@
           <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;&nbsp;replicationScope,
           <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>,byte[]&gt;&nbsp;extendedAttributes)</code>&nbsp;</td>
 </tr>
+<tr class="altColor">
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/wal/WALKeyImpl.html#WALKeyImpl-org.apache.hadoop.hbase.wal.WALKey-java.util.List-org.apache.hadoop.hbase.regionserver.MultiVersionConcurrencyControl-java.util.NavigableMap-java.util.Map-">WALKeyImpl</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/wal/WALKey.html" title="interface in org.apache.hadoop.hbase.wal">WALKey</a>&nbsp;key,
+          <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;clusterIds,
+          <a href="../../../../../../org/apache/hadoop/hbase/regionserver/MultiVersionConcurrencyControl.html" title="class in org.apache.hadoop.hbase.regionserver">MultiVersionConcurrencyControl</a>&nbsp;mvcc,
+          <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;&nbsp;replicationScopes,
+          <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>,byte[]&gt;&nbsp;extendedAttributes)</code>
+<div class="block">Copy constructor that takes in an existing WALKey, the extra WALKeyImpl fields that the
+ parent interface is missing, plus some extended attributes.</div>
+</td>
+</tr>
 </tbody>
 </table>
 </li>
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html b/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
index c53c368..bd1a797 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
@@ -715,20 +715,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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/DefaultHeapMemoryTuner.StepDirection.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">DefaultHeapMemoryTuner.StepDirection</span></a></li>
 </ul>
 </li>
 </ul>
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 dc05e9f..b195b74 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/querymatcher/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/querymatcher/package-tree.html
@@ -130,9 +130,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.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>
-<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/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/DeleteTracker.DeleteResult.html" title="enum in org.apache.hadoop.hbase.regionserver.querymatcher"><span class="typeNameLink">DeleteTracker.DeleteResult</span></a></li>
 </ul>
 </li>
 </ul>
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 a86d525..d570ad8 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/wal/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/wal/package-tree.html
@@ -247,10 +247,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.regionserver.wal.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/CompressionContext.DictionaryIndex.html" title="enum in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">CompressionContext.DictionaryIndex</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>
 <li type="circle">org.apache.hadoop.hbase.regionserver.wal.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/WALActionsListener.RollRequestReason.html" title="enum in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">WALActionsListener.RollRequestReason</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>
-<li type="circle">org.apache.hadoop.hbase.regionserver.wal.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/CompressionContext.DictionaryIndex.html" title="enum in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">CompressionContext.DictionaryIndex</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/replication/regionserver/ReplicationObserver.html b/devapidocs/org/apache/hadoop/hbase/replication/regionserver/ReplicationObserver.html
index 3817b98..9acb86e 100644
--- a/devapidocs/org/apache/hadoop/hbase/replication/regionserver/ReplicationObserver.html
+++ b/devapidocs/org/apache/hadoop/hbase/replication/regionserver/ReplicationObserver.html
@@ -240,7 +240,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html" title="interface in org.apache.hadoop.hbase.coprocessor">RegionObserver</a></h3>
-<code><a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-org.apache.hadoop.hbase.client.Result-">postAppend</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postAppendBeforeWAL-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Mutation-java.util.List-">postAppendBeforeWAL</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postBatchMutate-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-">postBatchMutate</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postBatchMutateIndispensably-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-boolean-">postBatchMutateIndispensably</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postBulkLoadHFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.List-java.util.Map-">postBulkLoadHFile</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCheckAndDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">postCheckAndDelete</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCheckAndPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">postCheckAndPut</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-boolean-">postClose</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCloseRegionOperation-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Region.Operation-">postCloseRegionOperation</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCommitStoreFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-org.apache.hadoop.fs.Path-org.apache.hadoop.fs.Path-">postCommitStoreFile</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCompact-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.StoreFile-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">postCompact</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCompactSelection-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-java.util.List-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">postCompactSelection</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Delete-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">postDelete</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postExists-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-boolean-">postExists</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">postFlush</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.StoreFile-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">postFlush</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postGetOp-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-java.util.List-">postGetOp</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postIncrement-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-org.apache.hadoop.hbase.client.Result-">postIncrement</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postIncrementBeforeWAL-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Mutation-java.util.List-">postIncrementBeforeWAL</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postInstantiateDeleteTracker-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.querymatcher.DeleteTracker-">postInstantiateDeleteTracker</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postMemStoreCompaction-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-">postMemStoreCompaction</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postMutationBeforeWAL-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.coprocessor.RegionObserver.MutationType-org.apache.hadoop.hbase.client.Mutation-org.apache.hadoop.hbase.Cell-org.apache.hadoop.hbase.Cell-">postMutationBeforeWAL</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-">postOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Put-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">postPut</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postReplayWALs-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.fs.Path-">postReplayWALs</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postScannerClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-">postScannerClose</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postScannerFilterRow-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.Cell-boolean-">postScannerFilterRow</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postScannerNext-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-java.util.List-int-boolean-">postScannerNext</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Scan-org.apache.hadoop.hbase.regionserver.RegionScanner-">postScannerOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postStartRegionOperation-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Region.Operation-">postStartRegionOperation</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postStoreFileReaderOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-org.apache.hadoop.hbase.io.FSDataInputStreamWrapper-long-org.apache.hadoop.hbase.io.hfile.CacheConfig-org.apache.hadoop.hbase.io.Reference-org.apache.hadoop.hbase.regionserver.StoreFileReader-">postStoreFileReaderOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postWALRestore-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">postWALRestore</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-">preAppend</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preAppendAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-">preAppendAfterRowLock</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preBatchMutate-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-">preBatchMutate</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preBulkLoadHFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.List-">preBulkLoadHFile</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCheckAndDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">preCheckAndDelete</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCheckAndDeleteAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">preCheckAndDeleteAfterRowLock</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCheckAndPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">preCheckAndPut</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCheckAndPutAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">preCheckAndPutAfterRowLock</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-boolean-">preClose</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCompact-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.regionserver.ScanType-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">preCompact</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCompactScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.ScanType-org.apache.hadoop.hbase.regionserver.ScanOptions-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">preCompactScannerOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCompactSelection-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-java.util.List-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-">preCompactSelection</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Delete-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">preDelete</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preExists-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-boolean-">preExists</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">preFlush</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">preFlush</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preFlushScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.ScanOptions-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">preFlushScannerOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preGetOp-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-java.util.List-">preGetOp</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preIncrement-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-">preIncrement</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preIncrementAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-">preIncrementAfterRowLock</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preMemStoreCompaction-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-">preMemStoreCompaction</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preMemStoreCompactionCompact-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.InternalScanner-">preMemStoreCompactionCompact</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preMemStoreCompactionCompactScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.ScanOptions-">preMemStoreCompactionCompactScannerOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-">preOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#prePrepareTimeStampForDeleteVersion-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Mutation-org.apache.hadoop.hbase.Cell-byte:A-org.apache.hadoop.hbase.client.Get-">prePrepareTimeStampForDeleteVersion</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#prePut-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Put-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">prePut</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preReplayWALs-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.fs.Path-">preReplayWALs</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preScannerClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-">preScannerClose</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preScannerNext-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-java.util.List-int-boolean-">preScannerNext</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Scan-">preScannerOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preStoreFileReaderOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-org.apache.hadoop.hbase.io.FSDataInputStreamWrapper-long-org.apache.hadoop.hbase.io.hfile.CacheConfig-org.apache.hadoop.hbase.io.Reference-org.apache.hadoop.hbase.regionserver.StoreFileReader-">preStoreFileReaderOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preStoreScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.ScanOptions-">preStoreScannerOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preWALRestore-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">preWALRestore</a></code></li>
+<code><a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-org.apache.hadoop.hbase.client.Result-">postAppend</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postAppendBeforeWAL-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Mutation-java.util.List-">postAppendBeforeWAL</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postBatchMutate-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-">postBatchMutate</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postBatchMutateIndispensably-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-boolean-">postBatchMutateIndispensably</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postBulkLoadHFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.List-java.util.Map-">postBulkLoadHFile</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCheckAndDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">postCheckAndDelete</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCheckAndPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">postCheckAndPut</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-boolean-">postClose</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCloseRegionOperation-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Region.Operation-">postCloseRegionOperation</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCommitStoreFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-org.apache.hadoop.fs.Path-org.apache.hadoop.fs.Path-">postCommitStoreFile</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCompact-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.StoreFile-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">postCompact</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCompactSelection-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-java.util.List-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">postCompactSelection</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Delete-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">postDelete</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postExists-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-boolean-">postExists</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">postFlush</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.StoreFile-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">postFlush</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postGetOp-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-java.util.List-">postGetOp</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postIncrement-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-org.apache.hadoop.hbase.client.Result-">postIncrement</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postIncrementBeforeWAL-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Mutation-java.util.List-">postIncrementBeforeWAL</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postInstantiateDeleteTracker-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.querymatcher.DeleteTracker-">postInstantiateDeleteTracker</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postMemStoreCompaction-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-">postMemStoreCompaction</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postMutationBeforeWAL-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.coprocessor.RegionObserver.MutationType-org.apache.hadoop.hbase.client.Mutation-org.apache.hadoop.hbase.Cell-org.apache.hadoop.hbase.Cell-">postMutationBeforeWAL</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-">postOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Put-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">postPut</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postReplayWALs-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.fs.Path-">postReplayWALs</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postScannerClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-">postScannerClose</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postScannerFilterRow-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.Cell-boolean-">postScannerFilterRow</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postScannerNext-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-java.util.List-int-boolean-">postScannerNext</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Scan-org.apache.hadoop.hbase.regionserver.RegionScanner-">postScannerOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postStartRegionOperation-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Region.Operation-">postStartRegionOperation</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postStoreFileReaderOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-org.apache.hadoop.hbase.io.FSDataInputStreamWrapper-long-org.apache.hadoop.hbase.io.hfile.CacheConfig-org.apache.hadoop.hbase.io.Reference-org.apache.hadoop.hbase.regionserver.StoreFileReader-">postStoreFileReaderOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postWALRestore-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">postWALRestore</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-">preAppend</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preAppendAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-">preAppendAfterRowLock</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preBatchMutate-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-">preBatchMutate</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preBulkLoadHFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.List-">preBulkLoadHFile</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCheckAndDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">preCheckAndDelete</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCheckAndDeleteAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">preCheckAndDeleteAfterRowLock</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCheckAndPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">preCheckAndPut</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCheckAndPutAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">preCheckAndPutAfterRowLock</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-boolean-">preClose</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCompact-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.regionserver.ScanType-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">preCompact</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCompactScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.ScanType-org.apache.hadoop.hbase.regionserver.ScanOptions-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">preCompactScannerOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCompactSelection-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-java.util.List-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-">preCompactSelection</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Delete-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">preDelete</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preExists-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-boolean-">preExists</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">preFlush</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">preFlush</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preFlushScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.ScanOptions-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">preFlushScannerOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preGetOp-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-java.util.List-">preGetOp</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preIncrement-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-">preIncrement</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preIncrementAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-">preIncrementAfterRowLock</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preMemStoreCompaction-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-">preMemStoreCompaction</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preMemStoreCompactionCompact-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.InternalScanner-">preMemStoreCompactionCompact</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preMemStoreCompactionCompactScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.ScanOptions-">preMemStoreCompactionCompactScannerOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-">preOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#prePrepareTimeStampForDeleteVersion-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Mutation-org.apache.hadoop.hbase.Cell-byte:A-org.apache.hadoop.hbase.client.Get-">prePrepareTimeStampForDeleteVersion</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#prePut-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Put-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">prePut</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preReplayWALs-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.fs.Path-">preReplayWALs</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preScannerClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-">preScannerClose</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preScannerNext-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-java.util.List-int-boolean-">preScannerNext</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Scan-">preScannerOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preStoreFileReaderOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-org.apache.hadoop.hbase.io.FSDataInputStreamWrapper-long-org.apache.hadoop.hbase.io.hfile.CacheConfig-org.apache.hadoop.hbase.io.Reference-org.apache.hadoop.hbase.regionserver.StoreFileReader-">preStoreFileReaderOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preStoreScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.ScanOptions-">preStoreScannerOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preWALAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">preWALAppend</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preWALRestore-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">preWALRestore</a></code></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/security/access/AccessController.html b/devapidocs/org/apache/hadoop/hbase/security/access/AccessController.html
index 3698bb9..e82eef3 100644
--- a/devapidocs/org/apache/hadoop/hbase/security/access/AccessController.html
+++ b/devapidocs/org/apache/hadoop/hbase/security/access/AccessController.html
@@ -1511,7 +1511,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html" title="interface in org.apache.hadoop.hbase.coprocessor">RegionObserver</a></h3>
-<code><a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-org.apache.hadoop.hbase.client.Result-">postAppend</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postBatchMutate-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-">postBatchMutate</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postBatchMutateIndispensably-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-boolean-">postBatchMutateIndispensably</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postBulkLoadHFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.List-java.util.Map-">postBulkLoadHFile</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCheckAndDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">postCheckAndDelete</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCheckAndPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">postCheckAndPut</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-boolean-">postClose</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCloseRegionOperation-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Region.Operation-">postCloseRegionOperation</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCommitStoreFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-org.apache.hadoop.fs.Path-org.apache.hadoop.fs.Path-">postCommitStoreFile</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCompact-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.StoreFile-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">postCompact</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCompactSelection-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-java.util.List-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">postCompactSelection</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postExists-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-boolean-">postExists</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">postFlush</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.StoreFile-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">postFlush</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postGetOp-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-java.util.List-">postGetOp</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postIncrement-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-org.apache.hadoop.hbase.client.Result-">postIncrement</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postInstantiateDeleteTracker-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.querymatcher.DeleteTracker-">postInstantiateDeleteTracker</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postMemStoreCompaction-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-">postMemStoreCompaction</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postMutationBeforeWAL-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.coprocessor.RegionObserver.MutationType-org.apache.hadoop.hbase.client.Mutation-org.apache.hadoop.hbase.Cell-org.apache.hadoop.hbase.Cell-">postMutationBeforeWAL</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postReplayWALs-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.fs.Path-">postReplayWALs</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postScannerNext-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-java.util.List-int-boolean-">postScannerNext</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postStartRegionOperation-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Region.Operation-">postStartRegionOperation</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postStoreFileReaderOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-org.apache.hadoop.hbase.io.FSDataInputStreamWrapper-long-org.apache.hadoop.hbase.io.hfile.CacheConfig-org.apache.hadoop.hbase.io.Reference-org.apache.hadoop.hbase.regionserver.StoreFileReader-">postStoreFileReaderOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postWALRestore-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">postWALRestore</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCommitStoreFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-java.util.List-">preCommitStoreFile</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCompactScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.ScanType-org.apache.hadoop.hbase.regionserver.ScanOptions-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">preCompactScannerOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCompactSelection-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-java.util.List-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-">preCompactSelection</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">preFlush</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preFlushScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.ScanOptions-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">preFlushScannerOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preMemStoreCompaction-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-">preMemStoreCompaction</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preMemStoreCompactionCompact-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.InternalScanner-">preMemStoreCompactionCompact</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preMemStoreCompactionCompactScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.ScanOptions-">preMemStoreCompactionCompactScannerOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#prePrepareTimeStampForDeleteVersion-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Mutation-org.apache.hadoop.hbase.Cell-byte:A-org.apache.hadoop.hbase.client.Get-">prePrepareTimeStampForDeleteVersion</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preReplayWALs-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.fs.Path-">preReplayWALs</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preStoreFileReaderOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-org.apache.hadoop.hbase.io.FSDataInputStreamWrapper-long-org.apache.hadoop.hbase.io.hfile.CacheConfig-org.apache.hadoop.hbase.io.Reference-org.apache.hadoop.hbase.regionserver.StoreFileReader-">preStoreFileReaderOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preStoreScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.ScanOptions-">preStoreScannerOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preWALRestore-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">preWALRestore</a></code></li>
+<code><a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-org.apache.hadoop.hbase.client.Result-">postAppend</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postBatchMutate-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-">postBatchMutate</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postBatchMutateIndispensably-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-boolean-">postBatchMutateIndispensably</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postBulkLoadHFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.List-java.util.Map-">postBulkLoadHFile</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCheckAndDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">postCheckAndDelete</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCheckAndPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">postCheckAndPut</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-boolean-">postClose</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCloseRegionOperation-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Region.Operation-">postCloseRegionOperation</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCommitStoreFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-org.apache.hadoop.fs.Path-org.apache.hadoop.fs.Path-">postCommitStoreFile</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCompact-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.StoreFile-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">postCompact</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCompactSelection-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-java.util.List-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">postCompactSelection</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postExists-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-boolean-">postExists</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">postFlush</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.StoreFile-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">postFlush</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postGetOp-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-java.util.List-">postGetOp</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postIncrement-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-org.apache.hadoop.hbase.client.Result-">postIncrement</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postInstantiateDeleteTracker-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.querymatcher.DeleteTracker-">postInstantiateDeleteTracker</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postMemStoreCompaction-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-">postMemStoreCompaction</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postMutationBeforeWAL-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.coprocessor.RegionObserver.MutationType-org.apache.hadoop.hbase.client.Mutation-org.apache.hadoop.hbase.Cell-org.apache.hadoop.hbase.Cell-">postMutationBeforeWAL</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postReplayWALs-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.fs.Path-">postReplayWALs</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postScannerNext-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-java.util.List-int-boolean-">postScannerNext</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postStartRegionOperation-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Region.Operation-">postStartRegionOperation</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postStoreFileReaderOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-org.apache.hadoop.hbase.io.FSDataInputStreamWrapper-long-org.apache.hadoop.hbase.io.hfile.CacheConfig-org.apache.hadoop.hbase.io.Reference-org.apache.hadoop.hbase.regionserver.StoreFileReader-">postStoreFileReaderOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postWALRestore-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">postWALRestore</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCommitStoreFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-java.util.List-">preCommitStoreFile</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCompactScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.ScanType-org.apache.hadoop.hbase.regionserver.ScanOptions-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">preCompactScannerOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCompactSelection-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-java.util.List-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-">preCompactSelection</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">preFlush</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preFlushScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.ScanOptions-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">preFlushScannerOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preMemStoreCompaction-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-">preMemStoreCompaction</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preMemStoreCompactionCompact-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.InternalScanner-">preMemStoreCompactionCompact</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preMemStoreCompactionCompactScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.ScanOptions-">preMemStoreCompactionCompactScannerOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#prePrepareTimeStampForDeleteVersion-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Mutation-org.apache.hadoop.hbase.Cell-byte:A-org.apache.hadoop.hbase.client.Get-">prePrepareTimeStampForDeleteVersion</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preReplayWALs-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.fs.Path-">preReplayWALs</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preStoreFileReaderOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-org.apache.hadoop.hbase.io.FSDataInputStreamWrapper-long-org.apache.hadoop.hbase.io.hfile.CacheConfig-org.apache.hadoop.hbase.io.Reference-org.apache.hadoop.hbase.regionserver.StoreFileReader-">preStoreFileReaderOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preStoreScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.ScanOptions-">preStoreScannerOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preWALAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">preWALAppend</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preWALRestore-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">preWALRestore</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.org.apache.hadoop.hbase.coprocessor.RegionServerObserver">
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 aef2348..bd9ffae 100644
--- a/devapidocs/org/apache/hadoop/hbase/security/access/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/security/access/package-tree.html
@@ -162,12 +162,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.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/SnapshotScannerHDFSAclHelper.HDFSAclOperation.AclType.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">SnapshotScannerHDFSAclHelper.HDFSAclOperation.AclType</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/Permission.Scope.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">Permission.Scope</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/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/SnapshotScannerHDFSAclHelper.HDFSAclOperation.OperationType.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">SnapshotScannerHDFSAclHelper.HDFSAclOperation.OperationType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/SnapshotScannerHDFSAclHelper.HDFSAclOperation.AclType.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">SnapshotScannerHDFSAclHelper.HDFSAclOperation.AclType</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/security/package-tree.html b/devapidocs/org/apache/hadoop/hbase/security/package-tree.html
index 3412365..bd591e2 100644
--- a/devapidocs/org/apache/hadoop/hbase/security/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/security/package-tree.html
@@ -192,9 +192,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.<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>
+<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>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/security/visibility/VisibilityController.html b/devapidocs/org/apache/hadoop/hbase/security/visibility/VisibilityController.html
index d854e7a..a2f2e16 100644
--- a/devapidocs/org/apache/hadoop/hbase/security/visibility/VisibilityController.html
+++ b/devapidocs/org/apache/hadoop/hbase/security/visibility/VisibilityController.html
@@ -559,7 +559,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html" title="interface in org.apache.hadoop.hbase.coprocessor">RegionObserver</a></h3>
-<code><a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-org.apache.hadoop.hbase.client.Result-">postAppend</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postBatchMutate-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-">postBatchMutate</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postBatchMutateIndispensably-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-boolean-">postBatchMutateIndispensably</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postBulkLoadHFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.List-java.util.Map-">postBulkLoadHFile</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCheckAndDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">postCheckAndDelete</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCheckAndPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">postCheckAndPut</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-boolean-">postClose</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCloseRegionOperation-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Region.Operation-">postCloseRegionOperation</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCommitStoreFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-org.apache.hadoop.fs.Path-org.apache.hadoop.fs.Path-">postCommitStoreFile</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCompact-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.StoreFile-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">postCompact</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCompactSelection-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-java.util.List-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">postCompactSelection</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Delete-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">postDelete</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postExists-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-boolean-">postExists</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">postFlush</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.StoreFile-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">postFlush</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postGetOp-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-java.util.List-">postGetOp</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postIncrement-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-org.apache.hadoop.hbase.client.Result-">postIncrement</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postMemStoreCompaction-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-">postMemStoreCompaction</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postMutationBeforeWAL-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.coprocessor.RegionObserver.MutationType-org.apache.hadoop.hbase.client.Mutation-org.apache.hadoop.hbase.Cell-org.apache.hadoop.hbase.Cell-">postMutationBeforeWAL</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Put-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">postPut</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postReplayWALs-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.fs.Path-">postReplayWALs</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postScannerNext-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-java.util.List-int-boolean-">postScannerNext</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postStartRegionOperation-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Region.Operation-">postStartRegionOperation</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postStoreFileReaderOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-org.apache.hadoop.hbase.io.FSDataInputStreamWrapper-long-org.apache.hadoop.hbase.io.hfile.CacheConfig-org.apache.hadoop.hbase.io.Reference-org.apache.hadoop.hbase.regionserver.StoreFileReader-">postStoreFileReaderOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postWALRestore-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">postWALRestore</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preAppendAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-">preAppendAfterRowLock</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preBulkLoadHFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.List-">preBulkLoadHFile</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCheckAndDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">preCheckAndDelete</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCheckAndDeleteAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">preCheckAndDeleteAfterRowLock</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCheckAndPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">preCheckAndPut</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCheckAndPutAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">preCheckAndPutAfterRowLock</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-boolean-">preClose</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCommitStoreFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-java.util.List-">preCommitStoreFile</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCompact-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.regionserver.ScanType-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">preCompact</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCompactScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.ScanType-org.apache.hadoop.hbase.regionserver.ScanOptions-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">preCompactScannerOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCompactSelection-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-java.util.List-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-">preCompactSelection</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Delete-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">preDelete</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preExists-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-boolean-">preExists</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">preFlush</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">preFlush</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preFlushScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.ScanOptions-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">preFlushScannerOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preIncrementAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-">preIncrementAfterRowLock</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preMemStoreCompaction-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-">preMemStoreCompaction</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preMemStoreCompactionCompact-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.InternalScanner-">preMemStoreCompactionCompact</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preMemStoreCompactionCompactScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.ScanOptions-">preMemStoreCompactionCompactScannerOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-">preOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#prePut-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Put-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">prePut</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preReplayWALs-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.fs.Path-">preReplayWALs</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preStoreFileReaderOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-org.apache.hadoop.hbase.io.FSDataInputStreamWrapper-long-org.apache.hadoop.hbase.io.hfile.CacheConfig-org.apache.hadoop.hbase.io.Reference-org.apache.hadoop.hbase.regionserver.StoreFileReader-">preStoreFileReaderOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preStoreScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.ScanOptions-">preStoreScannerOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preWALRestore-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">preWALRestore</a></code></li>
+<code><a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-org.apache.hadoop.hbase.client.Result-">postAppend</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postBatchMutate-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-">postBatchMutate</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postBatchMutateIndispensably-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-boolean-">postBatchMutateIndispensably</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postBulkLoadHFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.List-java.util.Map-">postBulkLoadHFile</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCheckAndDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">postCheckAndDelete</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCheckAndPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">postCheckAndPut</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-boolean-">postClose</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCloseRegionOperation-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Region.Operation-">postCloseRegionOperation</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCommitStoreFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-org.apache.hadoop.fs.Path-org.apache.hadoop.fs.Path-">postCommitStoreFile</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCompact-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.StoreFile-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">postCompact</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCompactSelection-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-java.util.List-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">postCompactSelection</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Delete-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">postDelete</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postExists-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-boolean-">postExists</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">postFlush</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.StoreFile-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">postFlush</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postGetOp-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-java.util.List-">postGetOp</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postIncrement-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-org.apache.hadoop.hbase.client.Result-">postIncrement</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postMemStoreCompaction-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-">postMemStoreCompaction</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postMutationBeforeWAL-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.coprocessor.RegionObserver.MutationType-org.apache.hadoop.hbase.client.Mutation-org.apache.hadoop.hbase.Cell-org.apache.hadoop.hbase.Cell-">postMutationBeforeWAL</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Put-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">postPut</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postReplayWALs-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.fs.Path-">postReplayWALs</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postScannerNext-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-java.util.List-int-boolean-">postScannerNext</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postStartRegionOperation-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Region.Operation-">postStartRegionOperation</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postStoreFileReaderOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-org.apache.hadoop.hbase.io.FSDataInputStreamWrapper-long-org.apache.hadoop.hbase.io.hfile.CacheConfig-org.apache.hadoop.hbase.io.Reference-org.apache.hadoop.hbase.regionserver.StoreFileReader-">postStoreFileReaderOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postWALRestore-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">postWALRestore</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preAppendAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-">preAppendAfterRowLock</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preBulkLoadHFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.List-">preBulkLoadHFile</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCheckAndDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">preCheckAndDelete</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCheckAndDeleteAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">preCheckAndDeleteAfterRowLock</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCheckAndPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">preCheckAndPut</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCheckAndPutAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">preCheckAndPutAfterRowLock</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-boolean-">preClose</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCommitStoreFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-java.util.List-">preCommitStoreFile</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCompact-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.regionserver.ScanType-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">preCompact</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCompactScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.ScanType-org.apache.hadoop.hbase.regionserver.ScanOptions-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">preCompactScannerOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCompactSelection-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-java.util.List-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-">preCompactSelection</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Delete-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">preDelete</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preExists-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-boolean-">preExists</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">preFlush</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">preFlush</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preFlushScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.ScanOptions-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">preFlushScannerOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preIncrementAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-">preIncrementAfterRowLock</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preMemStoreCompaction-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-">preMemStoreCompaction</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preMemStoreCompactionCompact-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.InternalScanner-">preMemStoreCompactionCompact</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preMemStoreCompactionCompactScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.ScanOptions-">preMemStoreCompactionCompactScannerOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-">preOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#prePut-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Put-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">prePut</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preReplayWALs-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.fs.Path-">preReplayWALs</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preStoreFileReaderOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-org.apache.hadoop.hbase.io.FSDataInputStreamWrapper-long-org.apache.hadoop.hbase.io.hfile.CacheConfig-org.apache.hadoop.hbase.io.Reference-org.apache.hadoop.hbase.regionserver.StoreFileReader-">preStoreFileReaderOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preStoreScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.ScanOptions-">preStoreScannerOpen</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preWALAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">preWALAppend</a>, <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preWALRestore-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">preWALRestore</a></code></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/thrift/package-tree.html b/devapidocs/org/apache/hadoop/hbase/thrift/package-tree.html
index fc1596c..19628f7 100644
--- a/devapidocs/org/apache/hadoop/hbase/thrift/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/thrift/package-tree.html
@@ -212,9 +212,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/ImplType.html" title="enum in org.apache.hadoop.hbase.thrift"><span class="typeNameLink">ImplType</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/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/ImplType.html" title="enum in org.apache.hadoop.hbase.thrift"><span class="typeNameLink">ImplType</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/tool/WriteSinkCoprocessor.html b/devapidocs/org/apache/hadoop/hbase/tool/WriteSinkCoprocessor.html
index 7757a11..76edb88 100644
--- a/devapidocs/org/apache/hadoop/hbase/tool/WriteSinkCoprocessor.html
+++ b/devapidocs/org/apache/hadoop/hbase/tool/WriteSinkCoprocessor.html
@@ -278,7 +278,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.<a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html" title="interface in org.apache.hadoop.hbase.coprocessor">RegionObserver</a></h3>
-<code><a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-org.apache.hadoop.hbase.client.Result-">postAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postAppendBeforeWAL-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Mutation-java.util.List-">postAppendBeforeWAL</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postBatchMutate-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-">postBatchMutate</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postBatchMutateIndispensably-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-boolean-">postBatchMutateIndispensably</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postBulkLoadHFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.List-java.util.Map-">postBulkLoadHFile</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCheckAndDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">postCheckAndDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCheckAndPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">postCheckAndPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-boolean-">postClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCloseRegionOperation-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Region.Operation-">postCloseRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCommitStoreFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-org.apache.hadoop.fs.Path-org.apache.hadoop.fs.Path-">postCommitStoreFile</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCompact-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.StoreFile-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">postCompact</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCompactSelection-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-java.util.List-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">postCompactSelection</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Delete-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">postDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postExists-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-boolean-">postExists</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">postFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.StoreFile-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">postFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postGetOp-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-java.util.List-">postGetOp</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postIncrement-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-org.apache.hadoop.hbase.client.Result-">postIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postIncrementBeforeWAL-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Mutation-java.util.List-">postIncrementBeforeWAL</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postInstantiateDeleteTracker-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.querymatcher.DeleteTracker-">postInstantiateDeleteTracker</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postMemStoreCompaction-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-">postMemStoreCompaction</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postMutationBeforeWAL-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.coprocessor.RegionObserver.MutationType-org.apache.hadoop.hbase.client.Mutation-org.apache.hadoop.hbase.Cell-org.apache.hadoop.hbase.Cell-">postMutationBeforeWAL</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-">postOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Put-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">postPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postReplayWALs-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.fs.Path-">postReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postScannerClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-">postScannerClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postScannerFilterRow-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.Cell-boolean-">postScannerFilterRow</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postScannerNext-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-java.util.List-int-boolean-">postScannerNext</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Scan-org.apache.hadoop.hbase.regionserver.RegionScanner-">postScannerOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postStartRegionOperation-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Region.Operation-">postStartRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postStoreFileReaderOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-org.apache.hadoop.hbase.io.FSDataInputStreamWrapper-long-org.apache.hadoop.hbase.io.hfile.CacheConfig-org.apache.hadoop.hbase.io.Reference-org.apache.hadoop.hbase.regionserver.StoreFileReader-">postStoreFileReaderOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postWALRestore-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">postWALRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-">preAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preAppendAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-">preAppendAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preBulkLoadHFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.List-">preBulkLoadHFile</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCheckAndDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">preCheckAndDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCheckAndDeleteAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">preCheckAndDeleteAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCheckAndPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">preCheckAndPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCheckAndPutAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">preCheckAndPutAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-boolean-">preClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCommitStoreFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-java.util.List-">preCommitStoreFile</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCompact-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.regionserver.ScanType-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">preCompact</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCompactScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.ScanType-org.apache.hadoop.hbase.regionserver.ScanOptions-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">preCompactScannerOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCompactSelection-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-java.util.List-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-">preCompactSelection</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Delete-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">preDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preExists-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-boolean-">preExists</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">preFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">preFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preFlushScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.ScanOptions-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">preFlushScannerOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preGetOp-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-java.util.List-">preGetOp</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preIncrement-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-">preIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preIncrementAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-">preIncrementAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preMemStoreCompaction-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-">preMemStoreCompaction</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preMemStoreCompactionCompact-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.InternalScanner-">preMemStoreCompactionCompact</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preMemStoreCompactionCompactScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.ScanOptions-">preMemStoreCompactionCompactScannerOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#prePrepareTimeStampForDeleteVersion-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Mutation-org.apache.hadoop.hbase.Cell-byte:A-org.apache.hadoop.hbase.client.Get-">prePrepareTimeStampForDeleteVersion</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#prePut-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Put-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">prePut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preReplayWALs-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.fs.Path-">preReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preScannerClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-">preScannerClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preScannerNext-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-java.util.List-int-boolean-">preScannerNext</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Scan-">preScannerOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preStoreFileReaderOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-org.apache.hadoop.hbase.io.FSDataInputStreamWrapper-long-org.apache.hadoop.hbase.io.hfile.CacheConfig-org.apache.hadoop.hbase.io.Reference-org.apache.hadoop.hbase.regionserver.StoreFileReader-">preStoreFileReaderOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preStoreScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.ScanOptions-">preStoreScannerOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preWALRestore-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">preWALRestore</a></code></li>
+<code><a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-org.apache.hadoop.hbase.client.Result-">postAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postAppendBeforeWAL-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Mutation-java.util.List-">postAppendBeforeWAL</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postBatchMutate-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-">postBatchMutate</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postBatchMutateIndispensably-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-boolean-">postBatchMutateIndispensably</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postBulkLoadHFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.List-java.util.Map-">postBulkLoadHFile</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCheckAndDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">postCheckAndDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCheckAndPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">postCheckAndPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-boolean-">postClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCloseRegionOperation-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Region.Operation-">postCloseRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCommitStoreFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-org.apache.hadoop.fs.Path-org.apache.hadoop.fs.Path-">postCommitStoreFile</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCompact-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.StoreFile-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">postCompact</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postCompactSelection-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-java.util.List-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">postCompactSelection</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Delete-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">postDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postExists-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-boolean-">postExists</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">postFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.StoreFile-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">postFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postGetOp-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-java.util.List-">postGetOp</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postIncrement-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-org.apache.hadoop.hbase.client.Result-">postIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postIncrementBeforeWAL-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Mutation-java.util.List-">postIncrementBeforeWAL</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postInstantiateDeleteTracker-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.querymatcher.DeleteTracker-">postInstantiateDeleteTracker</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postMemStoreCompaction-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-">postMemStoreCompaction</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postMutationBeforeWAL-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.coprocessor.RegionObserver.MutationType-org.apache.hadoop.hbase.client.Mutation-org.apache.hadoop.hbase.Cell-org.apache.hadoop.hbase.Cell-">postMutationBeforeWAL</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-">postOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Put-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">postPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postReplayWALs-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.fs.Path-">postReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postScannerClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-">postScannerClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postScannerFilterRow-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.Cell-boolean-">postScannerFilterRow</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postScannerNext-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-java.util.List-int-boolean-">postScannerNext</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Scan-org.apache.hadoop.hbase.regionserver.RegionScanner-">postScannerOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postStartRegionOperation-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Region.Operation-">postStartRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postStoreFileReaderOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-org.apache.hadoop.hbase.io.FSDataInputStreamWrapper-long-org.apache.hadoop.hbase.io.hfile.CacheConfig-org.apache.hadoop.hbase.io.Reference-org.apache.hadoop.hbase.regionserver.StoreFileReader-">postStoreFileReaderOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#postWALRestore-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">postWALRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-">preAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preAppendAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-">preAppendAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preBulkLoadHFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.List-">preBulkLoadHFile</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCheckAndDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">preCheckAndDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCheckAndDeleteAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">preCheckAndDeleteAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCheckAndPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">preCheckAndPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCheckAndPutAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">preCheckAndPutAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-boolean-">preClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCommitStoreFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-java.util.List-">preCommitStoreFile</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCompact-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.regionserver.ScanType-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">preCompact</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCompactScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.ScanType-org.apache.hadoop.hbase.regionserver.ScanOptions-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">preCompactScannerOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preCompactSelection-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-java.util.List-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-">preCompactSelection</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Delete-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">preDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preExists-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-boolean-">preExists</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">preFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">preFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preFlushScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.ScanOptions-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">preFlushScannerOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preGetOp-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-java.util.List-">preGetOp</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preIncrement-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-">preIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preIncrementAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-">preIncrementAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preMemStoreCompaction-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-">preMemStoreCompaction</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preMemStoreCompactionCompact-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.InternalScanner-">preMemStoreCompactionCompact</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preMemStoreCompactionCompactScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.ScanOptions-">preMemStoreCompactionCompactScannerOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#prePrepareTimeStampForDeleteVersion-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Mutation-org.apache.hadoop.hbase.Cell-byte:A-org.apache.hadoop.hbase.client.Get-">prePrepareTimeStampForDeleteVersion</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#prePut-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Put-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">prePut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preReplayWALs-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.fs.Path-">preReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preScannerClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-">preScannerClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preScannerNext-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-java.util.List-int-boolean-">preScannerNext</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Scan-">preScannerOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preStoreFileReaderOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-org.apache.hadoop.hbase.io.FSDataInputStreamWrapper-long-org.apache.hadoop.hbase.io.hfile.CacheConfig-org.apache.hadoop.hbase.io.Reference-org.apache.hadoop.hbase.regionserver.StoreFileReader-">preStoreFileReaderOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preStoreScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.ScanOptions-">preStoreScannerOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preWALAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">preWALAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preWALRestore-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">preWALRestore</a></code></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/util/package-tree.html b/devapidocs/org/apache/hadoop/hbase/util/package-tree.html
index 6eee7b0..f43fb55 100644
--- a/devapidocs/org/apache/hadoop/hbase/util/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/util/package-tree.html
@@ -539,14 +539,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/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/HbckErrorReporter.ERROR_CODE.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">HbckErrorReporter.ERROR_CODE</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/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.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/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/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/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/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/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/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>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/wal/WALKey.html b/devapidocs/org/apache/hadoop/hbase/wal/WALKey.html
index 69ec94b..d2b6a93 100644
--- a/devapidocs/org/apache/hadoop/hbase/wal/WALKey.html
+++ b/devapidocs/org/apache/hadoop/hbase/wal/WALKey.html
@@ -18,7 +18,7 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":18,"i1":6,"i2":18,"i3":18,"i4":18,"i5":18,"i6":6,"i7":6,"i8":6,"i9":6,"i10":18};
+var methods = {"i0":6,"i1":18,"i2":6,"i3":18,"i4":18,"i5":18,"i6":18,"i7":6,"i8":6,"i9":6,"i10":6,"i11":18};
 var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],4:["t3","Abstract Methods"],16:["t5","Default Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
@@ -110,10 +110,9 @@
 <hr>
 <br>
 <pre>@InterfaceAudience.LimitedPrivate(value={"Replication","Coprocesssor"})
-public interface <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALKey.html#line.41">WALKey</a>
+public interface <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALKey.html#line.40">WALKey</a>
 extends <a href="../../../../../org/apache/hadoop/hbase/regionserver/SequenceId.html" title="interface in org.apache.hadoop.hbase.regionserver">SequenceId</a>, <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="../../../../../org/apache/hadoop/hbase/wal/WALKey.html" title="interface in org.apache.hadoop.hbase.wal">WALKey</a>&gt;</pre>
-<div class="block">Key for WAL Entry.
- Read-only. No Setters. For limited audience such as Coprocessors.</div>
+<div class="block">Key for WAL Entry.</div>
 </li>
 </ul>
 </div>
@@ -161,54 +160,61 @@
 <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/wal/WALKey.html#addExtendedAttribute-java.lang.String-byte:A-">addExtendedAttribute</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;attributeKey,
+                    byte[]&nbsp;attributeValue)</code>
+<div class="block">Add a named String value to this WALKey to be persisted into the WAL</div>
+</td>
+</tr>
+<tr id="i1" class="rowColor">
 <td class="colFirst"><code>default long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/WALKey.html#estimatedSerializedSizeOf--">estimatedSerializedSizeOf</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i1" class="rowColor">
+<tr id="i2" class="altColor">
 <td class="colFirst"><code>byte[]</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/WALKey.html#getEncodedRegionName--">getEncodedRegionName</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i2" class="altColor">
+<tr id="i3" class="rowColor">
 <td class="colFirst"><code>default byte[]</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/WALKey.html#getExtendedAttribute-java.lang.String-">getExtendedAttribute</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;attributeKey)</code>
 <div class="block">Return a named String value injected into the WALKey during processing, such as by a
  coprocessor</div>
 </td>
 </tr>
-<tr id="i3" class="rowColor">
+<tr id="i4" class="altColor">
 <td class="colFirst"><code>default <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>,byte[]&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/WALKey.html#getExtendedAttributes--">getExtendedAttributes</a></span>()</code>
 <div class="block">Returns a map of all extended attributes injected into this WAL key.</div>
 </td>
 </tr>
-<tr id="i4" class="altColor">
+<tr id="i5" class="rowColor">
 <td class="colFirst"><code>default long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/WALKey.html#getNonce--">getNonce</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i5" class="rowColor">
+<tr id="i6" class="altColor">
 <td class="colFirst"><code>default long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/WALKey.html#getNonceGroup--">getNonceGroup</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i6" class="altColor">
+<tr id="i7" class="rowColor">
 <td class="colFirst"><code><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></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/WALKey.html#getOriginatingClusterId--">getOriginatingClusterId</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i7" class="rowColor">
+<tr id="i8" class="altColor">
 <td class="colFirst"><code>long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/WALKey.html#getOrigLogSeqNum--">getOrigLogSeqNum</a></span>()</code>
 <div class="block">Return a positive long if current WALKeyImpl is created from a replay edit; a replay edit is an
  edit that came in when replaying WALs of a crashed server.</div>
 </td>
 </tr>
-<tr id="i8" class="altColor">
+<tr id="i9" class="rowColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/WALKey.html#getTableName--">getTableName</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i9" class="rowColor">
+<tr id="i10" class="altColor">
 <td class="colFirst"><code>long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/WALKey.html#getWriteTime--">getWriteTime</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i10" class="altColor">
+<tr id="i11" class="rowColor">
 <td class="colFirst"><code>default <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>,<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>&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/WALKey.html#toStringMap--">toStringMap</a></span>()</code>
 <div class="block">Produces a string map for this key.</div>
@@ -249,7 +255,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>EMPTY_UUIDS</h4>
-<pre>static final&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; <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALKey.html#line.45">EMPTY_UUIDS</a></pre>
+<pre>static final&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; <a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALKey.html#line.44">EMPTY_UUIDS</a></pre>
 <div class="block">Unmodifiable empty list of UUIDs.</div>
 </li>
 </ul>
@@ -267,7 +273,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>estimatedSerializedSizeOf</h4>
-<pre>default&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALKey.html#line.47">estimatedSerializedSizeOf</a>()</pre>
+<pre>default&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALKey.html#line.46">estimatedSerializedSizeOf</a>()</pre>
 </li>
 </ul>
 <a name="getEncodedRegionName--">
@@ -276,7 +282,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>getEncodedRegionName</h4>
-<pre>byte[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALKey.html#line.54">getEncodedRegionName</a>()</pre>
+<pre>byte[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALKey.html#line.53">getEncodedRegionName</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>encoded region name</dd>
@@ -289,7 +295,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>getTableName</h4>
-<pre><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/wal/WALKey.html#line.59">getTableName</a>()</pre>
+<pre><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/wal/WALKey.html#line.58">getTableName</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>table name</dd>
@@ -302,7 +308,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>getWriteTime</h4>
-<pre>long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALKey.html#line.64">getWriteTime</a>()</pre>
+<pre>long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALKey.html#line.63">getWriteTime</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>the write time</dd>
@@ -315,7 +321,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>getNonceGroup</h4>
-<pre>default&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALKey.html#line.69">getNonceGroup</a>()</pre>
+<pre>default&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALKey.html#line.68">getNonceGroup</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>The nonce group</dd>
@@ -328,7 +334,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>getNonce</h4>
-<pre>default&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALKey.html#line.76">getNonce</a>()</pre>
+<pre>default&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALKey.html#line.75">getNonce</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>The nonce</dd>
@@ -341,7 +347,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>getOriginatingClusterId</h4>
-<pre><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>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALKey.html#line.80">getOriginatingClusterId</a>()</pre>
+<pre><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>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALKey.html#line.79">getOriginatingClusterId</a>()</pre>
 </li>
 </ul>
 <a name="getOrigLogSeqNum--">
@@ -350,7 +356,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>getOrigLogSeqNum</h4>
-<pre>long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALKey.html#line.87">getOrigLogSeqNum</a>()</pre>
+<pre>long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALKey.html#line.86">getOrigLogSeqNum</a>()</pre>
 <div class="block">Return a positive long if current WALKeyImpl is created from a replay edit; a replay edit is an
  edit that came in when replaying WALs of a crashed server.</div>
 <dl>
@@ -359,13 +365,29 @@
 </dl>
 </li>
 </ul>
+<a name="addExtendedAttribute-java.lang.String-byte:A-">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>addExtendedAttribute</h4>
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALKey.html#line.93">addExtendedAttribute</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;attributeKey,
+                          byte[]&nbsp;attributeValue)</pre>
+<div class="block">Add a named String value to this WALKey to be persisted into the WAL</div>
+<dl>
+<dt><span class="paramLabel">Parameters:</span></dt>
+<dd><code>attributeKey</code> - Name of the attribute</dd>
+<dd><code>attributeValue</code> - Value of the attribute</dd>
+</dl>
+</li>
+</ul>
 <a name="getExtendedAttribute-java.lang.String-">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>getExtendedAttribute</h4>
-<pre>default&nbsp;byte[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALKey.html#line.94">getExtendedAttribute</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;attributeKey)</pre>
+<pre>default&nbsp;byte[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALKey.html#line.100">getExtendedAttribute</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;attributeKey)</pre>
 <div class="block">Return a named String value injected into the WALKey during processing, such as by a
  coprocessor</div>
 <dl>
@@ -380,7 +402,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>getExtendedAttributes</h4>
-<pre>default&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>,byte[]&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALKey.html#line.101">getExtendedAttributes</a>()</pre>
+<pre>default&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>,byte[]&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALKey.html#line.107">getExtendedAttributes</a>()</pre>
 <div class="block">Returns a map of all extended attributes injected into this WAL key.</div>
 </li>
 </ul>
@@ -390,7 +412,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>toStringMap</h4>
-<pre>default&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>,<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>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALKey.html#line.111">toStringMap</a>()</pre>
+<pre>default&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>,<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>&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALKey.html#line.117">toStringMap</a>()</pre>
 <div class="block">Produces a string map for this key. Useful for programmatic use and
  manipulation of the data stored in an WALKeyImpl, for example, printing
  as JSON.</div>
diff --git a/devapidocs/org/apache/hadoop/hbase/wal/WALKeyImpl.html b/devapidocs/org/apache/hadoop/hbase/wal/WALKeyImpl.html
index a720936..7bcc631 100644
--- a/devapidocs/org/apache/hadoop/hbase/wal/WALKeyImpl.html
+++ b/devapidocs/org/apache/hadoop/hbase/wal/WALKeyImpl.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,"i20":10,"i21":10,"i22":10,"i23":10,"i24":10,"i25":10,"i26":10,"i27":10,"i28":10,"i29":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,"i22":10,"i23":10,"i24":10,"i25":10,"i26":10,"i27":10,"i28":10,"i29":10,"i30":10};
 var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
@@ -355,6 +355,22 @@
 <tr class="altColor">
 <td class="colOne"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/WALKeyImpl.html#WALKeyImpl-java.util.NavigableMap-">WALKeyImpl</a></span>(<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;&nbsp;replicationScope)</code>&nbsp;</td>
 </tr>
+<tr class="rowColor">
+<td class="colOne"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/WALKeyImpl.html#WALKeyImpl-org.apache.hadoop.hbase.wal.WALKeyImpl-java.util.Map-">WALKeyImpl</a></span>(<a href="../../../../../org/apache/hadoop/hbase/wal/WALKeyImpl.html" title="class in org.apache.hadoop.hbase.wal">WALKeyImpl</a>&nbsp;key,
+          <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>,byte[]&gt;&nbsp;extendedAttributes)</code>
+<div class="block">Copy constructor that takes in an existing WALKeyImpl plus some extended attributes.</div>
+</td>
+</tr>
+<tr class="altColor">
+<td class="colOne"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/WALKeyImpl.html#WALKeyImpl-org.apache.hadoop.hbase.wal.WALKey-java.util.List-org.apache.hadoop.hbase.regionserver.MultiVersionConcurrencyControl-java.util.NavigableMap-java.util.Map-">WALKeyImpl</a></span>(<a href="../../../../../org/apache/hadoop/hbase/wal/WALKey.html" title="interface in org.apache.hadoop.hbase.wal">WALKey</a>&nbsp;key,
+          <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;clusterIds,
+          <a href="../../../../../org/apache/hadoop/hbase/regionserver/MultiVersionConcurrencyControl.html" title="class in org.apache.hadoop.hbase.regionserver">MultiVersionConcurrencyControl</a>&nbsp;mvcc,
+          <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;&nbsp;replicationScopes,
+          <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>,byte[]&gt;&nbsp;extendedAttributes)</code>
+<div class="block">Copy constructor that takes in an existing WALKey, the extra WALKeyImpl fields that the
+ parent interface is missing, plus some extended attributes.</div>
+</td>
+</tr>
 </table>
 </li>
 </ul>
@@ -378,97 +394,104 @@
 </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/WALKeyImpl.html#clearReplicationScope--">clearReplicationScope</a></span>()</code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/WALKeyImpl.html#addExtendedAttribute-java.lang.String-byte:A-">addExtendedAttribute</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;attributeKey,
+                    byte[]&nbsp;attributeValue)</code>
+<div class="block">Add a named String value to this WALKey to be persisted into the WAL</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/wal/WALKeyImpl.html#clearReplicationScope--">clearReplicationScope</a></span>()</code>&nbsp;</td>
+</tr>
+<tr id="i3" class="rowColor">
 <td class="colFirst"><code>int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/WALKeyImpl.html#compareTo-org.apache.hadoop.hbase.wal.WALKey-">compareTo</a></span>(<a href="../../../../../org/apache/hadoop/hbase/wal/WALKey.html" title="interface in org.apache.hadoop.hbase.wal">WALKey</a>&nbsp;o)</code>&nbsp;</td>
 </tr>
-<tr id="i3" class="rowColor">
+<tr id="i4" class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/WALKeyImpl.html#equals-java.lang.Object-">equals</a></span>(<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)</code>&nbsp;</td>
 </tr>
-<tr id="i4" class="altColor">
+<tr id="i5" class="rowColor">
 <td class="colFirst"><code>long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/WALKeyImpl.html#estimatedSerializedSizeOf--">estimatedSerializedSizeOf</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i5" class="rowColor">
+<tr id="i6" class="altColor">
 <td class="colFirst"><code>org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos.WALKey.Builder</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/WALKeyImpl.html#getBuilder-org.apache.hadoop.hbase.regionserver.wal.WALCellCodec.ByteStringCompressor-">getBuilder</a></span>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/wal/WALCellCodec.ByteStringCompressor.html" title="interface in org.apache.hadoop.hbase.regionserver.wal">WALCellCodec.ByteStringCompressor</a>&nbsp;compressor)</code>&nbsp;</td>
 </tr>
-<tr id="i6" class="altColor">
+<tr id="i7" class="rowColor">
 <td class="colFirst"><code><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;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/WALKeyImpl.html#getClusterIds--">getClusterIds</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i7" class="rowColor">
+<tr id="i8" class="altColor">
 <td class="colFirst"><code>byte[]</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/WALKeyImpl.html#getEncodedRegionName--">getEncodedRegionName</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i8" class="altColor">
+<tr id="i9" class="rowColor">
 <td class="colFirst"><code>byte[]</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/WALKeyImpl.html#getExtendedAttribute-java.lang.String-">getExtendedAttribute</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;attributeKey)</code>
 <div class="block">Return a named String value injected into the WALKey during processing, such as by a
  coprocessor</div>
 </td>
 </tr>
-<tr id="i9" class="rowColor">
+<tr id="i10" class="altColor">
 <td class="colFirst"><code><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>,byte[]&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/WALKeyImpl.html#getExtendedAttributes--">getExtendedAttributes</a></span>()</code>
 <div class="block">Returns a map of all extended attributes injected into this WAL key.</div>
 </td>
 </tr>
-<tr id="i10" class="altColor">
+<tr id="i11" class="rowColor">
 <td class="colFirst"><code><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/wal/WALKeyImpl.html#getMvcc--">getMvcc</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i11" class="rowColor">
+<tr id="i12" class="altColor">
 <td class="colFirst"><code>long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/WALKeyImpl.html#getNonce--">getNonce</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i12" class="altColor">
+<tr id="i13" class="rowColor">
 <td class="colFirst"><code>long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/WALKeyImpl.html#getNonceGroup--">getNonceGroup</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i13" class="rowColor">
+<tr id="i14" class="altColor">
 <td class="colFirst"><code><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></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/WALKeyImpl.html#getOriginatingClusterId--">getOriginatingClusterId</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i14" class="altColor">
+<tr id="i15" class="rowColor">
 <td class="colFirst"><code>long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/WALKeyImpl.html#getOrigLogSeqNum--">getOrigLogSeqNum</a></span>()</code>
 <div class="block">Return a positive long if current WALKeyImpl is created from a replay edit; a replay edit is an
  edit that came in when replaying WALs of a crashed server.</div>
 </td>
 </tr>
-<tr id="i15" class="rowColor">
+<tr id="i16" class="altColor">
 <td class="colFirst"><code><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/wal/WALKeyImpl.html#getReplicationScopes--">getReplicationScopes</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i16" class="altColor">
+<tr id="i17" class="rowColor">
 <td class="colFirst"><code>long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/WALKeyImpl.html#getSequenceId--">getSequenceId</a></span>()</code>
 <div class="block">SequenceId is only available post WAL-assign.</div>
 </td>
 </tr>
-<tr id="i17" class="rowColor">
+<tr id="i18" class="altColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/WALKeyImpl.html#getTableName--">getTableName</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i18" class="altColor">
+<tr id="i19" class="rowColor">
 <td class="colFirst"><code><a href="../../../../../org/apache/hadoop/hbase/regionserver/MultiVersionConcurrencyControl.WriteEntry.html" title="class in org.apache.hadoop.hbase.regionserver">MultiVersionConcurrencyControl.WriteEntry</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/WALKeyImpl.html#getWriteEntry--">getWriteEntry</a></span>()</code>
 <div class="block">Use it to complete mvcc transaction.</div>
 </td>
 </tr>
-<tr id="i19" class="rowColor">
+<tr id="i20" class="altColor">
 <td class="colFirst"><code>long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/WALKeyImpl.html#getWriteTime--">getWriteTime</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i20" class="altColor">
+<tr id="i21" class="rowColor">
 <td class="colFirst"><code>int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/WALKeyImpl.html#hashCode--">hashCode</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i21" class="rowColor">
+<tr id="i22" class="altColor">
 <td class="colFirst"><code>protected void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/WALKeyImpl.html#init-byte:A-org.apache.hadoop.hbase.TableName-long-long-java.util.List-long-long-org.apache.hadoop.hbase.regionserver.MultiVersionConcurrencyControl-java.util.NavigableMap-java.util.Map-">init</a></span>(byte[]&nbsp;encodedRegionName,
     <a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tablename,
@@ -481,44 +504,44 @@
     <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;&nbsp;replicationScope,
     <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>,byte[]&gt;&nbsp;extendedAttributes)</code>&nbsp;</td>
 </tr>
-<tr id="i22" class="altColor">
+<tr id="i23" class="rowColor">
 <td class="colFirst"><code>(package private) void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/WALKeyImpl.html#internEncodedRegionName-byte:A-">internEncodedRegionName</a></span>(byte[]&nbsp;encodedRegionName)</code>
 <div class="block">Drop this instance's region name byte array and instead
  hold a reference to the provided region name.</div>
 </td>
 </tr>
-<tr id="i23" class="rowColor">
+<tr id="i24" class="altColor">
 <td class="colFirst"><code>(package private) void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/WALKeyImpl.html#internTableName-org.apache.hadoop.hbase.TableName-">internTableName</a></span>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tablename)</code>
 <div class="block">Drop this instance's tablename byte array and instead
  hold a reference to the provided tablename.</div>
 </td>
 </tr>
-<tr id="i24" class="altColor">
+<tr id="i25" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/WALKeyImpl.html#readFieldsFromPb-org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos.WALKey-org.apache.hadoop.hbase.regionserver.wal.WALCellCodec.ByteStringUncompressor-">readFieldsFromPb</a></span>(org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos.WALKey&nbsp;walKey,
                 <a href="../../../../../org/apache/hadoop/hbase/regionserver/wal/WALCellCodec.ByteStringUncompressor.html" title="interface in org.apache.hadoop.hbase.regionserver.wal">WALCellCodec.ByteStringUncompressor</a>&nbsp;uncompressor)</code>&nbsp;</td>
 </tr>
-<tr id="i25" class="rowColor">
+<tr id="i26" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/WALKeyImpl.html#setOrigLogSeqNum-long-">setOrigLogSeqNum</a></span>(long&nbsp;sequenceId)</code>
 <div class="block">Used to set original sequenceId for WALKeyImpl during WAL replay</div>
 </td>
 </tr>
-<tr id="i26" class="altColor">
+<tr id="i27" class="rowColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/WALKeyImpl.html#setReplicationScope-java.util.NavigableMap-">setReplicationScope</a></span>(<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;&nbsp;replicationScope)</code>&nbsp;</td>
 </tr>
-<tr id="i27" class="rowColor">
+<tr id="i28" class="altColor">
 <td class="colFirst"><code>protected void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/WALKeyImpl.html#setSequenceId-long-">setSequenceId</a></span>(long&nbsp;sequenceId)</code>&nbsp;</td>
 </tr>
-<tr id="i28" class="altColor">
+<tr id="i29" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/wal/WALKeyImpl.html#setWriteEntry-org.apache.hadoop.hbase.regionserver.MultiVersionConcurrencyControl.WriteEntry-">setWriteEntry</a></span>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/MultiVersionConcurrencyControl.WriteEntry.html" title="class in org.apache.hadoop.hbase.regionserver">MultiVersionConcurrencyControl.WriteEntry</a>&nbsp;writeEntry)</code>&nbsp;</td>
 </tr>
-<tr id="i29" class="rowColor">
+<tr id="i30" 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/wal/WALKeyImpl.html#toString--">toString</a></span>()</code>&nbsp;</td>
 </tr>
@@ -789,13 +812,48 @@
                   <a href="../../../../../org/apache/hadoop/hbase/regionserver/MultiVersionConcurrencyControl.html" title="class in org.apache.hadoop.hbase.regionserver">MultiVersionConcurrencyControl</a>&nbsp;mvcc)</pre>
 </li>
 </ul>
+<a name="WALKeyImpl-org.apache.hadoop.hbase.wal.WALKeyImpl-java.util.Map-">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>WALKeyImpl</h4>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALKeyImpl.html#line.205">WALKeyImpl</a>(<a href="../../../../../org/apache/hadoop/hbase/wal/WALKeyImpl.html" title="class in org.apache.hadoop.hbase.wal">WALKeyImpl</a>&nbsp;key,
+                  <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>,byte[]&gt;&nbsp;extendedAttributes)</pre>
+<div class="block">Copy constructor that takes in an existing WALKeyImpl plus some extended attributes.
+ Intended for coprocessors to add annotations to a system-generated WALKey
+ for persistence to the WAL.</div>
+<dl>
+<dt><span class="paramLabel">Parameters:</span></dt>
+<dd><code>key</code> - Key to be copied into this new key</dd>
+<dd><code>extendedAttributes</code> - Extra attributes to copy into the new key</dd>
+</dl>
+</li>
+</ul>
+<a name="WALKeyImpl-org.apache.hadoop.hbase.wal.WALKey-java.util.List-org.apache.hadoop.hbase.regionserver.MultiVersionConcurrencyControl-java.util.NavigableMap-java.util.Map-">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>WALKeyImpl</h4>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALKeyImpl.html#line.219">WALKeyImpl</a>(<a href="../../../../../org/apache/hadoop/hbase/wal/WALKey.html" title="interface in org.apache.hadoop.hbase.wal">WALKey</a>&nbsp;key,
+                  <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;clusterIds,
+                  <a href="../../../../../org/apache/hadoop/hbase/regionserver/MultiVersionConcurrencyControl.html" title="class in org.apache.hadoop.hbase.regionserver">MultiVersionConcurrencyControl</a>&nbsp;mvcc,
+                  <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;&nbsp;replicationScopes,
+                  <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>,byte[]&gt;&nbsp;extendedAttributes)</pre>
+<div class="block">Copy constructor that takes in an existing WALKey, the extra WALKeyImpl fields that the
+ parent interface is missing, plus some extended attributes. Intended
+ for coprocessors to add annotations to a system-generated WALKey for
+ persistence to the WAL.</div>
+</li>
+</ul>
 <a name="WALKeyImpl-byte:A-org.apache.hadoop.hbase.TableName-long-long-java.util.List-long-long-org.apache.hadoop.hbase.regionserver.MultiVersionConcurrencyControl-java.util.NavigableMap-">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>WALKeyImpl</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALKeyImpl.html#line.217">WALKeyImpl</a>(byte[]&nbsp;encodedRegionName,
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALKeyImpl.html#line.248">WALKeyImpl</a>(byte[]&nbsp;encodedRegionName,
                   <a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tablename,
                   long&nbsp;logSeqNum,
                   long&nbsp;now,
@@ -830,7 +888,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>WALKeyImpl</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALKeyImpl.html#line.238">WALKeyImpl</a>(byte[]&nbsp;encodedRegionName,
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALKeyImpl.html#line.269">WALKeyImpl</a>(byte[]&nbsp;encodedRegionName,
                   <a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tablename,
                   long&nbsp;logSeqNum,
                   long&nbsp;now,
@@ -859,7 +917,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>WALKeyImpl</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALKeyImpl.html#line.264">WALKeyImpl</a>(byte[]&nbsp;encodedRegionName,
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALKeyImpl.html#line.295">WALKeyImpl</a>(byte[]&nbsp;encodedRegionName,
                   <a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tablename,
                   long&nbsp;now,
                   <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;clusterIds,
@@ -888,7 +946,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>WALKeyImpl</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALKeyImpl.html#line.286">WALKeyImpl</a>(byte[]&nbsp;encodedRegionName,
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALKeyImpl.html#line.317">WALKeyImpl</a>(byte[]&nbsp;encodedRegionName,
                   <a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tablename,
                   long&nbsp;now,
                   <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;clusterIds,
@@ -919,7 +977,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>WALKeyImpl</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALKeyImpl.html#line.307">WALKeyImpl</a>(byte[]&nbsp;encodedRegionName,
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALKeyImpl.html#line.338">WALKeyImpl</a>(byte[]&nbsp;encodedRegionName,
                   <a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tablename,
                   long&nbsp;logSeqNum,
                   long&nbsp;nonceGroup,
@@ -945,7 +1003,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>WALKeyImpl</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALKeyImpl.html#line.323">WALKeyImpl</a>(byte[]&nbsp;encodedRegionName,
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALKeyImpl.html#line.354">WALKeyImpl</a>(byte[]&nbsp;encodedRegionName,
                   <a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tablename,
                   long&nbsp;now,
                   <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;clusterIds,
@@ -1009,7 +1067,7 @@
 <li class="blockList">
 <h4>init</h4>
 <pre>@InterfaceAudience.Private
-protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALKeyImpl.html#line.339">init</a>(byte[]&nbsp;encodedRegionName,
+protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALKeyImpl.html#line.370">init</a>(byte[]&nbsp;encodedRegionName,
                                                <a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tablename,
                                                long&nbsp;logSeqNum,
                                                long&nbsp;now,
@@ -1028,7 +1086,7 @@
 <li class="blockList">
 <h4>setSequenceId</h4>
 <pre>@InterfaceAudience.Private
-protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALKeyImpl.html#line.366">setSequenceId</a>(long&nbsp;sequenceId)</pre>
+protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALKeyImpl.html#line.397">setSequenceId</a>(long&nbsp;sequenceId)</pre>
 </li>
 </ul>
 <a name="getEncodedRegionName--">
@@ -1037,7 +1095,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>getEncodedRegionName</h4>
-<pre>public&nbsp;byte[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALKeyImpl.html#line.372">getEncodedRegionName</a>()</pre>
+<pre>public&nbsp;byte[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALKeyImpl.html#line.403">getEncodedRegionName</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/wal/WALKey.html#getEncodedRegionName--">getEncodedRegionName</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/wal/WALKey.html" title="interface in org.apache.hadoop.hbase.wal">WALKey</a></code></dd>
@@ -1052,7 +1110,7 @@
 <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/wal/WALKeyImpl.html#line.378">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/wal/WALKeyImpl.html#line.409">getTableName</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/wal/WALKey.html#getTableName--">getTableName</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/wal/WALKey.html" title="interface in org.apache.hadoop.hbase.wal">WALKey</a></code></dd>
@@ -1067,7 +1125,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>setOrigLogSeqNum</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALKeyImpl.html#line.385">setOrigLogSeqNum</a>(long&nbsp;sequenceId)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALKeyImpl.html#line.416">setOrigLogSeqNum</a>(long&nbsp;sequenceId)</pre>
 <div class="block">Used to set original sequenceId for WALKeyImpl during WAL replay</div>
 </li>
 </ul>
@@ -1077,7 +1135,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>getOrigLogSeqNum</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALKeyImpl.html#line.395">getOrigLogSeqNum</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALKeyImpl.html#line.426">getOrigLogSeqNum</a>()</pre>
 <div class="block">Return a positive long if current WALKeyImpl is created from a replay edit; a replay edit is an
  edit that came in when replaying WALs of a crashed server.</div>
 <dl>
@@ -1094,7 +1152,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>getSequenceId</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALKeyImpl.html#line.406">getSequenceId</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALKeyImpl.html#line.437">getSequenceId</a>()</pre>
 <div class="block">SequenceId is only available post WAL-assign. Calls before this will get you a
  <a href="../../../../../org/apache/hadoop/hbase/regionserver/SequenceId.html#NO_SEQUENCE_ID"><code>SequenceId.NO_SEQUENCE_ID</code></a>. See the comment on FSHLog#append and #getWriteNumber in this
  method for more on when this sequenceId comes available.</div>
@@ -1112,7 +1170,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>getWriteTime</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALKeyImpl.html#line.414">getWriteTime</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALKeyImpl.html#line.445">getWriteTime</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/wal/WALKey.html#getWriteTime--">getWriteTime</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/wal/WALKey.html" title="interface in org.apache.hadoop.hbase.wal">WALKey</a></code></dd>
@@ -1127,7 +1185,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>getReplicationScopes</h4>
-<pre>public&nbsp;<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;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALKeyImpl.html#line.418">getReplicationScopes</a>()</pre>
+<pre>public&nbsp;<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;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALKeyImpl.html#line.449">getReplicationScopes</a>()</pre>
 </li>
 </ul>
 <a name="getNonceGroup--">
@@ -1136,7 +1194,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>getNonceGroup</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALKeyImpl.html#line.424">getNonceGroup</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALKeyImpl.html#line.455">getNonceGroup</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/wal/WALKey.html#getNonceGroup--">getNonceGroup</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/wal/WALKey.html" title="interface in org.apache.hadoop.hbase.wal">WALKey</a></code></dd>
@@ -1151,7 +1209,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>getNonce</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALKeyImpl.html#line.430">getNonce</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALKeyImpl.html#line.461">getNonce</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/wal/WALKey.html#getNonce--">getNonce</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/wal/WALKey.html" title="interface in org.apache.hadoop.hbase.wal">WALKey</a></code></dd>
@@ -1166,7 +1224,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>setReplicationScope</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALKeyImpl.html#line.434">setReplicationScope</a>(<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;&nbsp;replicationScope)</pre>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALKeyImpl.html#line.465">setReplicationScope</a>(<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;&nbsp;replicationScope)</pre>
 </li>
 </ul>
 <a name="clearReplicationScope--">
@@ -1175,7 +1233,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>clearReplicationScope</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALKeyImpl.html#line.438">clearReplicationScope</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALKeyImpl.html#line.469">clearReplicationScope</a>()</pre>
 </li>
 </ul>
 <a name="addClusterId-java.util.UUID-">
@@ -1184,7 +1242,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>addClusterId</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALKeyImpl.html#line.445">addClusterId</a>(<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>&nbsp;clusterId)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALKeyImpl.html#line.476">addClusterId</a>(<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>&nbsp;clusterId)</pre>
 <div class="block">Marks that the cluster with the given clusterId has consumed the change</div>
 </li>
 </ul>
@@ -1194,7 +1252,7 @@
 <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/wal/WALKeyImpl.html#line.454">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/wal/WALKeyImpl.html#line.485">getClusterIds</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>the set of cluster Ids that have consumed the change</dd>
@@ -1207,7 +1265,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>getOriginatingClusterId</h4>
-<pre>public&nbsp;<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>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALKeyImpl.html#line.463">getOriginatingClusterId</a>()</pre>
+<pre>public&nbsp;<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>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALKeyImpl.html#line.494">getOriginatingClusterId</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/wal/WALKey.html#getOriginatingClusterId--">getOriginatingClusterId</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/wal/WALKey.html" title="interface in org.apache.hadoop.hbase.wal">WALKey</a></code></dd>
@@ -1217,13 +1275,32 @@
 </dl>
 </li>
 </ul>
+<a name="addExtendedAttribute-java.lang.String-byte:A-">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>addExtendedAttribute</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALKeyImpl.html#line.499">addExtendedAttribute</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;attributeKey,
+                                 byte[]&nbsp;attributeValue)</pre>
+<div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/wal/WALKey.html#addExtendedAttribute-java.lang.String-byte:A-">WALKey</a></code></span></div>
+<div class="block">Add a named String value to this WALKey to be persisted into the WAL</div>
+<dl>
+<dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
+<dd><code><a href="../../../../../org/apache/hadoop/hbase/wal/WALKey.html#addExtendedAttribute-java.lang.String-byte:A-">addExtendedAttribute</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/wal/WALKey.html" title="interface in org.apache.hadoop.hbase.wal">WALKey</a></code></dd>
+<dt><span class="paramLabel">Parameters:</span></dt>
+<dd><code>attributeKey</code> - Name of the attribute</dd>
+<dd><code>attributeValue</code> - Value of the attribute</dd>
+</dl>
+</li>
+</ul>
 <a name="getExtendedAttribute-java.lang.String-">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>getExtendedAttribute</h4>
-<pre>public&nbsp;byte[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALKeyImpl.html#line.468">getExtendedAttribute</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;attributeKey)</pre>
+<pre>public&nbsp;byte[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALKeyImpl.html#line.507">getExtendedAttribute</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;attributeKey)</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/wal/WALKey.html#getExtendedAttribute-java.lang.String-">WALKey</a></code></span></div>
 <div class="block">Return a named String value injected into the WALKey during processing, such as by a
  coprocessor</div>
@@ -1241,7 +1318,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>getExtendedAttributes</h4>
-<pre>public&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>,byte[]&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALKeyImpl.html#line.473">getExtendedAttributes</a>()</pre>
+<pre>public&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>,byte[]&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALKeyImpl.html#line.512">getExtendedAttributes</a>()</pre>
 <div class="block"><span class="descfrmTypeLabel">Description copied from interface:&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/wal/WALKey.html#getExtendedAttributes--">WALKey</a></code></span></div>
 <div class="block">Returns a map of all extended attributes injected into this WAL key.</div>
 <dl>
@@ -1256,7 +1333,7 @@
 <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/wal/WALKeyImpl.html#line.479">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/WALKeyImpl.html#line.518">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>
@@ -1269,7 +1346,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>equals</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALKeyImpl.html#line.484">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/wal/WALKeyImpl.html#line.523">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>
@@ -1282,7 +1359,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>hashCode</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALKeyImpl.html#line.495">hashCode</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALKeyImpl.html#line.534">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>
@@ -1295,7 +1372,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>compareTo</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALKeyImpl.html#line.503">compareTo</a>(<a href="../../../../../org/apache/hadoop/hbase/wal/WALKey.html" title="interface in org.apache.hadoop.hbase.wal">WALKey</a>&nbsp;o)</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALKeyImpl.html#line.542">compareTo</a>(<a href="../../../../../org/apache/hadoop/hbase/wal/WALKey.html" title="interface in org.apache.hadoop.hbase.wal">WALKey</a>&nbsp;o)</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="../../../../../org/apache/hadoop/hbase/wal/WALKey.html" title="interface in org.apache.hadoop.hbase.wal">WALKey</a>&gt;</code></dd>
@@ -1308,7 +1385,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>internTableName</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALKeyImpl.html#line.531">internTableName</a>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tablename)</pre>
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALKeyImpl.html#line.570">internTableName</a>(<a href="../../../../../org/apache/hadoop/hbase/TableName.html" title="class in org.apache.hadoop.hbase">TableName</a>&nbsp;tablename)</pre>
 <div class="block">Drop this instance's tablename byte array and instead
  hold a reference to the provided tablename. This is not
  meant to be a general purpose setter - it's only used
@@ -1321,7 +1398,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>internEncodedRegionName</h4>
-<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALKeyImpl.html#line.544">internEncodedRegionName</a>(byte[]&nbsp;encodedRegionName)</pre>
+<pre>void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALKeyImpl.html#line.583">internEncodedRegionName</a>(byte[]&nbsp;encodedRegionName)</pre>
 <div class="block">Drop this instance's region name byte array and instead
  hold a reference to the provided region name. This is not
  meant to be a general purpose setter - it's only used
@@ -1334,7 +1411,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>getBuilder</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos.WALKey.Builder&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALKeyImpl.html#line.551">getBuilder</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/wal/WALCellCodec.ByteStringCompressor.html" title="interface in org.apache.hadoop.hbase.regionserver.wal">WALCellCodec.ByteStringCompressor</a>&nbsp;compressor)
+<pre>public&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos.WALKey.Builder&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALKeyImpl.html#line.590">getBuilder</a>(<a href="../../../../../org/apache/hadoop/hbase/regionserver/wal/WALCellCodec.ByteStringCompressor.html" title="interface in org.apache.hadoop.hbase.regionserver.wal">WALCellCodec.ByteStringCompressor</a>&nbsp;compressor)
                                                                                       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>
@@ -1348,7 +1425,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>readFieldsFromPb</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALKeyImpl.html#line.594">readFieldsFromPb</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos.WALKey&nbsp;walKey,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALKeyImpl.html#line.633">readFieldsFromPb</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos.WALKey&nbsp;walKey,
                              <a href="../../../../../org/apache/hadoop/hbase/regionserver/wal/WALCellCodec.ByteStringUncompressor.html" title="interface in org.apache.hadoop.hbase.regionserver.wal">WALCellCodec.ByteStringUncompressor</a>&nbsp;uncompressor)
                       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>
@@ -1363,7 +1440,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>estimatedSerializedSizeOf</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALKeyImpl.html#line.636">estimatedSerializedSizeOf</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/wal/WALKeyImpl.html#line.675">estimatedSerializedSizeOf</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../../org/apache/hadoop/hbase/wal/WALKey.html#estimatedSerializedSizeOf--">estimatedSerializedSizeOf</a></code>&nbsp;in interface&nbsp;<code><a href="../../../../../org/apache/hadoop/hbase/wal/WALKey.html" title="interface in org.apache.hadoop.hbase.wal">WALKey</a></code></dd>
diff --git a/devapidocs/org/apache/hadoop/hbase/wal/class-use/WALEdit.html b/devapidocs/org/apache/hadoop/hbase/wal/class-use/WALEdit.html
index 8a394b2..5c785a9 100644
--- a/devapidocs/org/apache/hadoop/hbase/wal/class-use/WALEdit.html
+++ b/devapidocs/org/apache/hadoop/hbase/wal/class-use/WALEdit.html
@@ -232,6 +232,14 @@
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>default void</code></td>
+<td class="colLast"><span class="typeNameLabel">RegionObserver.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preWALAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">preWALAppend</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">RegionCoprocessorEnvironment</a>&gt;&nbsp;ctx,
+            <a href="../../../../../../org/apache/hadoop/hbase/wal/WALKey.html" title="interface in org.apache.hadoop.hbase.wal">WALKey</a>&nbsp;key,
+            <a href="../../../../../../org/apache/hadoop/hbase/wal/WALEdit.html" title="class in org.apache.hadoop.hbase.wal">WALEdit</a>&nbsp;edit)</code>
+<div class="block">Called just before the WAL Entry is appended to the WAL.</div>
+</td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><code>default void</code></td>
 <td class="colLast"><span class="typeNameLabel">RegionObserver.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preWALRestore-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">preWALRestore</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;? extends <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">RegionCoprocessorEnvironment</a>&gt;&nbsp;ctx,
              <a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;info,
              <a href="../../../../../../org/apache/hadoop/hbase/wal/WALKey.html" title="interface in org.apache.hadoop.hbase.wal">WALKey</a>&nbsp;logKey,
@@ -240,7 +248,7 @@
  replayed for this region.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>default void</code></td>
 <td class="colLast"><span class="typeNameLabel">WALObserver.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/coprocessor/WALObserver.html#preWALWrite-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">preWALWrite</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;? extends <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/WALCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">WALCoprocessorEnvironment</a>&gt;&nbsp;ctx,
            <a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;info,
@@ -520,6 +528,11 @@
 </td>
 </tr>
 <tr class="rowColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><span class="typeNameLabel">RegionCoprocessorHost.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.html#preWALAppend-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">preWALAppend</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/wal/WALKey.html" title="interface in org.apache.hadoop.hbase.wal">WALKey</a>&nbsp;key,
+            <a href="../../../../../../org/apache/hadoop/hbase/wal/WALEdit.html" title="class in org.apache.hadoop.hbase.wal">WALEdit</a>&nbsp;edit)</code>&nbsp;</td>
+</tr>
+<tr class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><span class="typeNameLabel">RegionCoprocessorHost.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.html#preWALRestore-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">preWALRestore</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;info,
              <a href="../../../../../../org/apache/hadoop/hbase/wal/WALKey.html" title="interface in org.apache.hadoop.hbase.wal">WALKey</a>&nbsp;logKey,
@@ -530,7 +543,7 @@
 </div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">RowProcessor.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/regionserver/RowProcessor.html#process-long-org.apache.hadoop.hbase.regionserver.HRegion-java.util.List-org.apache.hadoop.hbase.wal.WALEdit-">process</a></span>(long&nbsp;now,
        <a href="../../../../../../org/apache/hadoop/hbase/regionserver/HRegion.html" title="class in org.apache.hadoop.hbase.regionserver">HRegion</a>&nbsp;region,
@@ -540,7 +553,7 @@
 <div class="block">HRegion handles the locks and MVCC and invokes this method properly.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><span class="typeNameLabel">MiniBatchOperationInProgress.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/regionserver/MiniBatchOperationInProgress.html#setWalEdit-int-org.apache.hadoop.hbase.wal.WALEdit-">setWalEdit</a></span>(int&nbsp;index,
           <a href="../../../../../../org/apache/hadoop/hbase/wal/WALEdit.html" title="class in org.apache.hadoop.hbase.wal">WALEdit</a>&nbsp;walEdit)</code>
diff --git a/devapidocs/org/apache/hadoop/hbase/wal/class-use/WALKey.html b/devapidocs/org/apache/hadoop/hbase/wal/class-use/WALKey.html
index 04d846b..5fa77b0 100644
--- a/devapidocs/org/apache/hadoop/hbase/wal/class-use/WALKey.html
+++ b/devapidocs/org/apache/hadoop/hbase/wal/class-use/WALKey.html
@@ -151,6 +151,14 @@
 </tr>
 <tr class="altColor">
 <td class="colFirst"><code>default void</code></td>
+<td class="colLast"><span class="typeNameLabel">RegionObserver.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preWALAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">preWALAppend</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">RegionCoprocessorEnvironment</a>&gt;&nbsp;ctx,
+            <a href="../../../../../../org/apache/hadoop/hbase/wal/WALKey.html" title="interface in org.apache.hadoop.hbase.wal">WALKey</a>&nbsp;key,
+            <a href="../../../../../../org/apache/hadoop/hbase/wal/WALEdit.html" title="class in org.apache.hadoop.hbase.wal">WALEdit</a>&nbsp;edit)</code>
+<div class="block">Called just before the WAL Entry is appended to the WAL.</div>
+</td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><code>default void</code></td>
 <td class="colLast"><span class="typeNameLabel">RegionObserver.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionObserver.html#preWALRestore-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">preWALRestore</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;? extends <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/RegionCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">RegionCoprocessorEnvironment</a>&gt;&nbsp;ctx,
              <a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;info,
              <a href="../../../../../../org/apache/hadoop/hbase/wal/WALKey.html" title="interface in org.apache.hadoop.hbase.wal">WALKey</a>&nbsp;logKey,
@@ -159,7 +167,7 @@
  replayed for this region.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>default void</code></td>
 <td class="colLast"><span class="typeNameLabel">WALObserver.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/coprocessor/WALObserver.html#preWALWrite-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">preWALWrite</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/coprocessor/ObserverContext.html" title="interface in org.apache.hadoop.hbase.coprocessor">ObserverContext</a>&lt;? extends <a href="../../../../../../org/apache/hadoop/hbase/coprocessor/WALCoprocessorEnvironment.html" title="interface in org.apache.hadoop.hbase.coprocessor">WALCoprocessorEnvironment</a>&gt;&nbsp;ctx,
            <a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;info,
@@ -265,6 +273,11 @@
 </td>
 </tr>
 <tr class="rowColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><span class="typeNameLabel">RegionCoprocessorHost.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.html#preWALAppend-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">preWALAppend</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/wal/WALKey.html" title="interface in org.apache.hadoop.hbase.wal">WALKey</a>&nbsp;key,
+            <a href="../../../../../../org/apache/hadoop/hbase/wal/WALEdit.html" title="class in org.apache.hadoop.hbase.wal">WALEdit</a>&nbsp;edit)</code>&nbsp;</td>
+</tr>
+<tr class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><span class="typeNameLabel">RegionCoprocessorHost.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.html#preWALRestore-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">preWALRestore</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/client/RegionInfo.html" title="interface in org.apache.hadoop.hbase.client">RegionInfo</a>&nbsp;info,
              <a href="../../../../../../org/apache/hadoop/hbase/wal/WALKey.html" title="interface in org.apache.hadoop.hbase.wal">WALKey</a>&nbsp;logKey,
@@ -410,6 +423,24 @@
 </tr>
 </tbody>
 </table>
+<table class="useSummary" border="0" cellpadding="3" cellspacing="0" summary="Use table, listing constructors, and an explanation">
+<caption><span>Constructors in <a href="../../../../../../org/apache/hadoop/hbase/wal/package-summary.html">org.apache.hadoop.hbase.wal</a> with parameters of type <a href="../../../../../../org/apache/hadoop/hbase/wal/WALKey.html" title="interface in org.apache.hadoop.hbase.wal">WALKey</a></span><span class="tabEnd">&nbsp;</span></caption>
+<tr>
+<th class="colOne" scope="col">Constructor and Description</th>
+</tr>
+<tbody>
+<tr class="altColor">
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/wal/WALKeyImpl.html#WALKeyImpl-org.apache.hadoop.hbase.wal.WALKey-java.util.List-org.apache.hadoop.hbase.regionserver.MultiVersionConcurrencyControl-java.util.NavigableMap-java.util.Map-">WALKeyImpl</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/wal/WALKey.html" title="interface in org.apache.hadoop.hbase.wal">WALKey</a>&nbsp;key,
+          <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;clusterIds,
+          <a href="../../../../../../org/apache/hadoop/hbase/regionserver/MultiVersionConcurrencyControl.html" title="class in org.apache.hadoop.hbase.regionserver">MultiVersionConcurrencyControl</a>&nbsp;mvcc,
+          <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;&nbsp;replicationScopes,
+          <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>,byte[]&gt;&nbsp;extendedAttributes)</code>
+<div class="block">Copy constructor that takes in an existing WALKey, the extra WALKeyImpl fields that the
+ parent interface is missing, plus some extended attributes.</div>
+</td>
+</tr>
+</tbody>
+</table>
 </li>
 </ul>
 </li>
diff --git a/devapidocs/org/apache/hadoop/hbase/wal/class-use/WALKeyImpl.html b/devapidocs/org/apache/hadoop/hbase/wal/class-use/WALKeyImpl.html
index 715d625..09179b3 100644
--- a/devapidocs/org/apache/hadoop/hbase/wal/class-use/WALKeyImpl.html
+++ b/devapidocs/org/apache/hadoop/hbase/wal/class-use/WALKeyImpl.html
@@ -302,6 +302,12 @@
 <div class="block">Constructor for both params</div>
 </td>
 </tr>
+<tr class="rowColor">
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/wal/WALKeyImpl.html#WALKeyImpl-org.apache.hadoop.hbase.wal.WALKeyImpl-java.util.Map-">WALKeyImpl</a></span>(<a href="../../../../../../org/apache/hadoop/hbase/wal/WALKeyImpl.html" title="class in org.apache.hadoop.hbase.wal">WALKeyImpl</a>&nbsp;key,
+          <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>,byte[]&gt;&nbsp;extendedAttributes)</code>
+<div class="block">Copy constructor that takes in an existing WALKeyImpl plus some extended attributes.</div>
+</td>
+</tr>
 </tbody>
 </table>
 </li>
diff --git a/devapidocs/org/apache/hadoop/hbase/wal/package-tree.html b/devapidocs/org/apache/hadoop/hbase/wal/package-tree.html
index bdae3d8..8c4c41b 100644
--- a/devapidocs/org/apache/hadoop/hbase/wal/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/wal/package-tree.html
@@ -192,8 +192,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/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>
+<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>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/Version.html b/devapidocs/src-html/org/apache/hadoop/hbase/Version.html
index 8fa0a12..35ec523 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/Version.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/Version.html
@@ -16,9 +16,9 @@
 <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 = "0136b9873ff753ca181403d280a6e9ea135fbc95";<a name="line.11"></a>
+<span class="sourceLineNo">011</span>  public static final String revision = "c8f57bf678fa4eb617074f8296e25cb8a147a5d5";<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 = "Fri Aug  9 14:34:42 UTC 2019";<a name="line.13"></a>
+<span class="sourceLineNo">013</span>  public static final String date = "Sat Aug 10 14:34:42 UTC 2019";<a name="line.13"></a>
 <span class="sourceLineNo">014</span>  public static final String url = "git://jenkins-websites-he-de.apache.org/home/jenkins/jenkins-slave/workspace/hbase_generate_website/hbase";<a name="line.14"></a>
 <span class="sourceLineNo">015</span>  public static final String srcChecksum = "(stdin)=";<a name="line.15"></a>
 <span class="sourceLineNo">016</span>}<a name="line.16"></a>
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/coprocessor/RegionObserver.MutationType.html b/devapidocs/src-html/org/apache/hadoop/hbase/coprocessor/RegionObserver.MutationType.html
index 73fc3e6..882a2df 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/coprocessor/RegionObserver.MutationType.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/coprocessor/RegionObserver.MutationType.html
@@ -1112,7 +1112,19 @@
 <span class="sourceLineNo">1104</span>      throws IOException {<a name="line.1104"></a>
 <span class="sourceLineNo">1105</span>    return delTracker;<a name="line.1105"></a>
 <span class="sourceLineNo">1106</span>  }<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>}<a name="line.1107"></a>
+<span class="sourceLineNo">1107</span><a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>  /**<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>   * Called just before the WAL Entry is appended to the WAL. Implementing this hook allows<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>   * coprocessors to add extended attributes to the WALKey that then get persisted to the<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span>   * WAL, and are available to replication endpoints to use in processing WAL Entries.<a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>   * @param ctx the environment provided by the region server<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>   * @param key the WALKey associated with a particular append to a WAL<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>   */<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>  default void preWALAppend(ObserverContext&lt;RegionCoprocessorEnvironment&gt; ctx, WALKey key,<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>                            WALEdit edit)<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span>    throws IOException {<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>  }<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>}<a name="line.1119"></a>
 
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/coprocessor/RegionObserver.html b/devapidocs/src-html/org/apache/hadoop/hbase/coprocessor/RegionObserver.html
index 73fc3e6..882a2df 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/coprocessor/RegionObserver.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/coprocessor/RegionObserver.html
@@ -1112,7 +1112,19 @@
 <span class="sourceLineNo">1104</span>      throws IOException {<a name="line.1104"></a>
 <span class="sourceLineNo">1105</span>    return delTracker;<a name="line.1105"></a>
 <span class="sourceLineNo">1106</span>  }<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>}<a name="line.1107"></a>
+<span class="sourceLineNo">1107</span><a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>  /**<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>   * Called just before the WAL Entry is appended to the WAL. Implementing this hook allows<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>   * coprocessors to add extended attributes to the WALKey that then get persisted to the<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span>   * WAL, and are available to replication endpoints to use in processing WAL Entries.<a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>   * @param ctx the environment provided by the region server<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>   * @param key the WALKey associated with a particular append to a WAL<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>   */<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>  default void preWALAppend(ObserverContext&lt;RegionCoprocessorEnvironment&gt; ctx, WALKey key,<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>                            WALEdit edit)<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span>    throws IOException {<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>  }<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>}<a name="line.1119"></a>
 
 
 
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 8fcec33..2147e82 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
@@ -7972,875 +7972,880 @@
 <span class="sourceLineNo">7964</span>    if (walEdit.isReplay()) {<a name="line.7964"></a>
 <span class="sourceLineNo">7965</span>      walKey.setOrigLogSeqNum(origLogSeqNum);<a name="line.7965"></a>
 <span class="sourceLineNo">7966</span>    }<a name="line.7966"></a>
-<span class="sourceLineNo">7967</span>    WriteEntry writeEntry = null;<a name="line.7967"></a>
-<span class="sourceLineNo">7968</span>    try {<a name="line.7968"></a>
-<span class="sourceLineNo">7969</span>      long txid = this.wal.append(this.getRegionInfo(), walKey, walEdit, true);<a name="line.7969"></a>
-<span class="sourceLineNo">7970</span>      // Call sync on our edit.<a name="line.7970"></a>
-<span class="sourceLineNo">7971</span>      if (txid != 0) {<a name="line.7971"></a>
-<span class="sourceLineNo">7972</span>        sync(txid, durability);<a name="line.7972"></a>
-<span class="sourceLineNo">7973</span>      }<a name="line.7973"></a>
-<span class="sourceLineNo">7974</span>      writeEntry = walKey.getWriteEntry();<a name="line.7974"></a>
-<span class="sourceLineNo">7975</span>    } catch (IOException ioe) {<a name="line.7975"></a>
-<span class="sourceLineNo">7976</span>      if (walKey != null &amp;&amp; walKey.getWriteEntry() != null) {<a name="line.7976"></a>
-<span class="sourceLineNo">7977</span>        mvcc.complete(walKey.getWriteEntry());<a name="line.7977"></a>
+<span class="sourceLineNo">7967</span>    //don't call the coproc hook for writes to the WAL caused by<a name="line.7967"></a>
+<span class="sourceLineNo">7968</span>    //system lifecycle events like flushes or compactions<a name="line.7968"></a>
+<span class="sourceLineNo">7969</span>    if (this.coprocessorHost != null &amp;&amp; !walEdit.isMetaEdit()) {<a name="line.7969"></a>
+<span class="sourceLineNo">7970</span>      this.coprocessorHost.preWALAppend(walKey, walEdit);<a name="line.7970"></a>
+<span class="sourceLineNo">7971</span>    }<a name="line.7971"></a>
+<span class="sourceLineNo">7972</span>    WriteEntry writeEntry = null;<a name="line.7972"></a>
+<span class="sourceLineNo">7973</span>    try {<a name="line.7973"></a>
+<span class="sourceLineNo">7974</span>      long txid = this.wal.append(this.getRegionInfo(), walKey, walEdit, true);<a name="line.7974"></a>
+<span class="sourceLineNo">7975</span>      // Call sync on our edit.<a name="line.7975"></a>
+<span class="sourceLineNo">7976</span>      if (txid != 0) {<a name="line.7976"></a>
+<span class="sourceLineNo">7977</span>        sync(txid, durability);<a name="line.7977"></a>
 <span class="sourceLineNo">7978</span>      }<a name="line.7978"></a>
-<span class="sourceLineNo">7979</span>      throw ioe;<a name="line.7979"></a>
-<span class="sourceLineNo">7980</span>    }<a name="line.7980"></a>
-<span class="sourceLineNo">7981</span>    return writeEntry;<a name="line.7981"></a>
-<span class="sourceLineNo">7982</span>  }<a name="line.7982"></a>
-<span class="sourceLineNo">7983</span><a name="line.7983"></a>
-<span class="sourceLineNo">7984</span>  /**<a name="line.7984"></a>
-<span class="sourceLineNo">7985</span>   * Do coprocessor pre-increment or pre-append call.<a name="line.7985"></a>
-<span class="sourceLineNo">7986</span>   * @return Result returned out of the coprocessor, which means bypass all further processing and<a name="line.7986"></a>
-<span class="sourceLineNo">7987</span>   *  return the proffered Result instead, or null which means proceed.<a name="line.7987"></a>
-<span class="sourceLineNo">7988</span>   */<a name="line.7988"></a>
-<span class="sourceLineNo">7989</span>  private Result doCoprocessorPreCall(final Operation op, final Mutation mutation)<a name="line.7989"></a>
-<span class="sourceLineNo">7990</span>  throws IOException {<a name="line.7990"></a>
-<span class="sourceLineNo">7991</span>    Result result = null;<a name="line.7991"></a>
-<span class="sourceLineNo">7992</span>    if (this.coprocessorHost != null) {<a name="line.7992"></a>
-<span class="sourceLineNo">7993</span>      switch(op) {<a name="line.7993"></a>
-<span class="sourceLineNo">7994</span>        case INCREMENT:<a name="line.7994"></a>
-<span class="sourceLineNo">7995</span>          result = this.coprocessorHost.preIncrementAfterRowLock((Increment)mutation);<a name="line.7995"></a>
-<span class="sourceLineNo">7996</span>          break;<a name="line.7996"></a>
-<span class="sourceLineNo">7997</span>        case APPEND:<a name="line.7997"></a>
-<span class="sourceLineNo">7998</span>          result = this.coprocessorHost.preAppendAfterRowLock((Append)mutation);<a name="line.7998"></a>
-<span class="sourceLineNo">7999</span>          break;<a name="line.7999"></a>
-<span class="sourceLineNo">8000</span>        default: throw new UnsupportedOperationException(op.toString());<a name="line.8000"></a>
-<span class="sourceLineNo">8001</span>      }<a name="line.8001"></a>
-<span class="sourceLineNo">8002</span>    }<a name="line.8002"></a>
-<span class="sourceLineNo">8003</span>    return result;<a name="line.8003"></a>
-<span class="sourceLineNo">8004</span>  }<a name="line.8004"></a>
-<span class="sourceLineNo">8005</span><a name="line.8005"></a>
-<span class="sourceLineNo">8006</span>  /**<a name="line.8006"></a>
-<span class="sourceLineNo">8007</span>   * Reckon the Cells to apply to WAL, memstore, and to return to the Client; these Sets are not<a name="line.8007"></a>
-<span class="sourceLineNo">8008</span>   * always the same dependent on whether to write WAL.<a name="line.8008"></a>
-<span class="sourceLineNo">8009</span>   *<a name="line.8009"></a>
-<span class="sourceLineNo">8010</span>   * @param results Fill in here what goes back to the Client if it is non-null (if null, client<a name="line.8010"></a>
-<span class="sourceLineNo">8011</span>   *  doesn't want results).<a name="line.8011"></a>
-<span class="sourceLineNo">8012</span>   * @param forMemStore Fill in here what to apply to the MemStore (by Store).<a name="line.8012"></a>
-<span class="sourceLineNo">8013</span>   * @return A WALEdit to apply to WAL or null if we are to skip the WAL.<a name="line.8013"></a>
-<span class="sourceLineNo">8014</span>   */<a name="line.8014"></a>
-<span class="sourceLineNo">8015</span>  private WALEdit reckonDeltas(Operation op, Mutation mutation, Durability effectiveDurability,<a name="line.8015"></a>
-<span class="sourceLineNo">8016</span>      Map&lt;HStore, List&lt;Cell&gt;&gt; forMemStore, List&lt;Cell&gt; results) throws IOException {<a name="line.8016"></a>
-<span class="sourceLineNo">8017</span>    WALEdit walEdit = null;<a name="line.8017"></a>
-<span class="sourceLineNo">8018</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.8018"></a>
-<span class="sourceLineNo">8019</span>    final boolean writeToWAL = effectiveDurability != Durability.SKIP_WAL;<a name="line.8019"></a>
-<span class="sourceLineNo">8020</span>    // Process a Store/family at a time.<a name="line.8020"></a>
-<span class="sourceLineNo">8021</span>    for (Map.Entry&lt;byte [], List&lt;Cell&gt;&gt; entry: mutation.getFamilyCellMap().entrySet()) {<a name="line.8021"></a>
-<span class="sourceLineNo">8022</span>      final byte[] columnFamilyName = entry.getKey();<a name="line.8022"></a>
-<span class="sourceLineNo">8023</span>      List&lt;Cell&gt; deltas = entry.getValue();<a name="line.8023"></a>
-<span class="sourceLineNo">8024</span>      // Reckon for the Store what to apply to WAL and MemStore.<a name="line.8024"></a>
-<span class="sourceLineNo">8025</span>      List&lt;Cell&gt; toApply = reckonDeltasByStore(stores.get(columnFamilyName), op, mutation,<a name="line.8025"></a>
-<span class="sourceLineNo">8026</span>        effectiveDurability, now, deltas, results);<a name="line.8026"></a>
-<span class="sourceLineNo">8027</span>      if (!toApply.isEmpty()) {<a name="line.8027"></a>
-<span class="sourceLineNo">8028</span>        for (Cell cell : toApply) {<a name="line.8028"></a>
-<span class="sourceLineNo">8029</span>          HStore store = getStore(cell);<a name="line.8029"></a>
-<span class="sourceLineNo">8030</span>          if (store == null) {<a name="line.8030"></a>
-<span class="sourceLineNo">8031</span>            checkFamily(CellUtil.cloneFamily(cell));<a name="line.8031"></a>
-<span class="sourceLineNo">8032</span>          } else {<a name="line.8032"></a>
-<span class="sourceLineNo">8033</span>            forMemStore.computeIfAbsent(store, key -&gt; new ArrayList&lt;&gt;()).add(cell);<a name="line.8033"></a>
-<span class="sourceLineNo">8034</span>          }<a name="line.8034"></a>
-<span class="sourceLineNo">8035</span>        }<a name="line.8035"></a>
-<span class="sourceLineNo">8036</span>        if (writeToWAL) {<a name="line.8036"></a>
-<span class="sourceLineNo">8037</span>          if (walEdit == null) {<a name="line.8037"></a>
-<span class="sourceLineNo">8038</span>            walEdit = new WALEdit();<a name="line.8038"></a>
+<span class="sourceLineNo">7979</span>      writeEntry = walKey.getWriteEntry();<a name="line.7979"></a>
+<span class="sourceLineNo">7980</span>    } catch (IOException ioe) {<a name="line.7980"></a>
+<span class="sourceLineNo">7981</span>      if (walKey != null &amp;&amp; walKey.getWriteEntry() != null) {<a name="line.7981"></a>
+<span class="sourceLineNo">7982</span>        mvcc.complete(walKey.getWriteEntry());<a name="line.7982"></a>
+<span class="sourceLineNo">7983</span>      }<a name="line.7983"></a>
+<span class="sourceLineNo">7984</span>      throw ioe;<a name="line.7984"></a>
+<span class="sourceLineNo">7985</span>    }<a name="line.7985"></a>
+<span class="sourceLineNo">7986</span>    return writeEntry;<a name="line.7986"></a>
+<span class="sourceLineNo">7987</span>  }<a name="line.7987"></a>
+<span class="sourceLineNo">7988</span><a name="line.7988"></a>
+<span class="sourceLineNo">7989</span>  /**<a name="line.7989"></a>
+<span class="sourceLineNo">7990</span>   * Do coprocessor pre-increment or pre-append call.<a name="line.7990"></a>
+<span class="sourceLineNo">7991</span>   * @return Result returned out of the coprocessor, which means bypass all further processing and<a name="line.7991"></a>
+<span class="sourceLineNo">7992</span>   *  return the proffered Result instead, or null which means proceed.<a name="line.7992"></a>
+<span class="sourceLineNo">7993</span>   */<a name="line.7993"></a>
+<span class="sourceLineNo">7994</span>  private Result doCoprocessorPreCall(final Operation op, final Mutation mutation)<a name="line.7994"></a>
+<span class="sourceLineNo">7995</span>  throws IOException {<a name="line.7995"></a>
+<span class="sourceLineNo">7996</span>    Result result = null;<a name="line.7996"></a>
+<span class="sourceLineNo">7997</span>    if (this.coprocessorHost != null) {<a name="line.7997"></a>
+<span class="sourceLineNo">7998</span>      switch(op) {<a name="line.7998"></a>
+<span class="sourceLineNo">7999</span>        case INCREMENT:<a name="line.7999"></a>
+<span class="sourceLineNo">8000</span>          result = this.coprocessorHost.preIncrementAfterRowLock((Increment)mutation);<a name="line.8000"></a>
+<span class="sourceLineNo">8001</span>          break;<a name="line.8001"></a>
+<span class="sourceLineNo">8002</span>        case APPEND:<a name="line.8002"></a>
+<span class="sourceLineNo">8003</span>          result = this.coprocessorHost.preAppendAfterRowLock((Append)mutation);<a name="line.8003"></a>
+<span class="sourceLineNo">8004</span>          break;<a name="line.8004"></a>
+<span class="sourceLineNo">8005</span>        default: throw new UnsupportedOperationException(op.toString());<a name="line.8005"></a>
+<span class="sourceLineNo">8006</span>      }<a name="line.8006"></a>
+<span class="sourceLineNo">8007</span>    }<a name="line.8007"></a>
+<span class="sourceLineNo">8008</span>    return result;<a name="line.8008"></a>
+<span class="sourceLineNo">8009</span>  }<a name="line.8009"></a>
+<span class="sourceLineNo">8010</span><a name="line.8010"></a>
+<span class="sourceLineNo">8011</span>  /**<a name="line.8011"></a>
+<span class="sourceLineNo">8012</span>   * Reckon the Cells to apply to WAL, memstore, and to return to the Client; these Sets are not<a name="line.8012"></a>
+<span class="sourceLineNo">8013</span>   * always the same dependent on whether to write WAL.<a name="line.8013"></a>
+<span class="sourceLineNo">8014</span>   *<a name="line.8014"></a>
+<span class="sourceLineNo">8015</span>   * @param results Fill in here what goes back to the Client if it is non-null (if null, client<a name="line.8015"></a>
+<span class="sourceLineNo">8016</span>   *  doesn't want results).<a name="line.8016"></a>
+<span class="sourceLineNo">8017</span>   * @param forMemStore Fill in here what to apply to the MemStore (by Store).<a name="line.8017"></a>
+<span class="sourceLineNo">8018</span>   * @return A WALEdit to apply to WAL or null if we are to skip the WAL.<a name="line.8018"></a>
+<span class="sourceLineNo">8019</span>   */<a name="line.8019"></a>
+<span class="sourceLineNo">8020</span>  private WALEdit reckonDeltas(Operation op, Mutation mutation, Durability effectiveDurability,<a name="line.8020"></a>
+<span class="sourceLineNo">8021</span>      Map&lt;HStore, List&lt;Cell&gt;&gt; forMemStore, List&lt;Cell&gt; results) throws IOException {<a name="line.8021"></a>
+<span class="sourceLineNo">8022</span>    WALEdit walEdit = null;<a name="line.8022"></a>
+<span class="sourceLineNo">8023</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.8023"></a>
+<span class="sourceLineNo">8024</span>    final boolean writeToWAL = effectiveDurability != Durability.SKIP_WAL;<a name="line.8024"></a>
+<span class="sourceLineNo">8025</span>    // Process a Store/family at a time.<a name="line.8025"></a>
+<span class="sourceLineNo">8026</span>    for (Map.Entry&lt;byte [], List&lt;Cell&gt;&gt; entry: mutation.getFamilyCellMap().entrySet()) {<a name="line.8026"></a>
+<span class="sourceLineNo">8027</span>      final byte[] columnFamilyName = entry.getKey();<a name="line.8027"></a>
+<span class="sourceLineNo">8028</span>      List&lt;Cell&gt; deltas = entry.getValue();<a name="line.8028"></a>
+<span class="sourceLineNo">8029</span>      // Reckon for the Store what to apply to WAL and MemStore.<a name="line.8029"></a>
+<span class="sourceLineNo">8030</span>      List&lt;Cell&gt; toApply = reckonDeltasByStore(stores.get(columnFamilyName), op, mutation,<a name="line.8030"></a>
+<span class="sourceLineNo">8031</span>        effectiveDurability, now, deltas, results);<a name="line.8031"></a>
+<span class="sourceLineNo">8032</span>      if (!toApply.isEmpty()) {<a name="line.8032"></a>
+<span class="sourceLineNo">8033</span>        for (Cell cell : toApply) {<a name="line.8033"></a>
+<span class="sourceLineNo">8034</span>          HStore store = getStore(cell);<a name="line.8034"></a>
+<span class="sourceLineNo">8035</span>          if (store == null) {<a name="line.8035"></a>
+<span class="sourceLineNo">8036</span>            checkFamily(CellUtil.cloneFamily(cell));<a name="line.8036"></a>
+<span class="sourceLineNo">8037</span>          } else {<a name="line.8037"></a>
+<span class="sourceLineNo">8038</span>            forMemStore.computeIfAbsent(store, key -&gt; new ArrayList&lt;&gt;()).add(cell);<a name="line.8038"></a>
 <span class="sourceLineNo">8039</span>          }<a name="line.8039"></a>
-<span class="sourceLineNo">8040</span>          walEdit.getCells().addAll(toApply);<a name="line.8040"></a>
-<span class="sourceLineNo">8041</span>        }<a name="line.8041"></a>
-<span class="sourceLineNo">8042</span>      }<a name="line.8042"></a>
-<span class="sourceLineNo">8043</span>    }<a name="line.8043"></a>
-<span class="sourceLineNo">8044</span>    return walEdit;<a name="line.8044"></a>
-<span class="sourceLineNo">8045</span>  }<a name="line.8045"></a>
-<span class="sourceLineNo">8046</span><a name="line.8046"></a>
-<span class="sourceLineNo">8047</span>  /**<a name="line.8047"></a>
-<span class="sourceLineNo">8048</span>   * Reckon the Cells to apply to WAL, memstore, and to return to the Client in passed<a name="line.8048"></a>
-<span class="sourceLineNo">8049</span>   * column family/Store.<a name="line.8049"></a>
-<span class="sourceLineNo">8050</span>   *<a name="line.8050"></a>
-<span class="sourceLineNo">8051</span>   * Does Get of current value and then adds passed in deltas for this Store returning the result.<a name="line.8051"></a>
-<span class="sourceLineNo">8052</span>   *<a name="line.8052"></a>
-<span class="sourceLineNo">8053</span>   * @param op Whether Increment or Append<a name="line.8053"></a>
-<span class="sourceLineNo">8054</span>   * @param mutation The encompassing Mutation object<a name="line.8054"></a>
-<span class="sourceLineNo">8055</span>   * @param deltas Changes to apply to this Store; either increment amount or data to append<a name="line.8055"></a>
-<span class="sourceLineNo">8056</span>   * @param results In here we accumulate all the Cells we are to return to the client. If null,<a name="line.8056"></a>
-<span class="sourceLineNo">8057</span>   *                client doesn't want results returned.<a name="line.8057"></a>
-<span class="sourceLineNo">8058</span>   * @return Resulting Cells after &lt;code&gt;deltas&lt;/code&gt; have been applied to current<a name="line.8058"></a>
-<span class="sourceLineNo">8059</span>   *  values. Side effect is our filling out of the &lt;code&gt;results&lt;/code&gt; List.<a name="line.8059"></a>
-<span class="sourceLineNo">8060</span>   */<a name="line.8060"></a>
-<span class="sourceLineNo">8061</span>  private List&lt;Cell&gt; reckonDeltasByStore(HStore store, Operation op, Mutation mutation,<a name="line.8061"></a>
-<span class="sourceLineNo">8062</span>      Durability effectiveDurability, long now, List&lt;Cell&gt; deltas, List&lt;Cell&gt; results)<a name="line.8062"></a>
-<span class="sourceLineNo">8063</span>      throws IOException {<a name="line.8063"></a>
-<span class="sourceLineNo">8064</span>    byte[] columnFamily = store.getColumnFamilyDescriptor().getName();<a name="line.8064"></a>
-<span class="sourceLineNo">8065</span>    List&lt;Pair&lt;Cell, Cell&gt;&gt; cellPairs = new ArrayList&lt;&gt;(deltas.size());<a name="line.8065"></a>
-<span class="sourceLineNo">8066</span>    // Get previous values for all columns in this family.<a name="line.8066"></a>
-<span class="sourceLineNo">8067</span>    TimeRange tr = null;<a name="line.8067"></a>
-<span class="sourceLineNo">8068</span>    switch (op) {<a name="line.8068"></a>
-<span class="sourceLineNo">8069</span>      case INCREMENT:<a name="line.8069"></a>
-<span class="sourceLineNo">8070</span>        tr = ((Increment)mutation).getTimeRange();<a name="line.8070"></a>
-<span class="sourceLineNo">8071</span>        break;<a name="line.8071"></a>
-<span class="sourceLineNo">8072</span>      case APPEND:<a name="line.8072"></a>
-<span class="sourceLineNo">8073</span>        tr = ((Append)mutation).getTimeRange();<a name="line.8073"></a>
-<span class="sourceLineNo">8074</span>        break;<a name="line.8074"></a>
-<span class="sourceLineNo">8075</span>      default:<a name="line.8075"></a>
+<span class="sourceLineNo">8040</span>        }<a name="line.8040"></a>
+<span class="sourceLineNo">8041</span>        if (writeToWAL) {<a name="line.8041"></a>
+<span class="sourceLineNo">8042</span>          if (walEdit == null) {<a name="line.8042"></a>
+<span class="sourceLineNo">8043</span>            walEdit = new WALEdit();<a name="line.8043"></a>
+<span class="sourceLineNo">8044</span>          }<a name="line.8044"></a>
+<span class="sourceLineNo">8045</span>          walEdit.getCells().addAll(toApply);<a name="line.8045"></a>
+<span class="sourceLineNo">8046</span>        }<a name="line.8046"></a>
+<span class="sourceLineNo">8047</span>      }<a name="line.8047"></a>
+<span class="sourceLineNo">8048</span>    }<a name="line.8048"></a>
+<span class="sourceLineNo">8049</span>    return walEdit;<a name="line.8049"></a>
+<span class="sourceLineNo">8050</span>  }<a name="line.8050"></a>
+<span class="sourceLineNo">8051</span><a name="line.8051"></a>
+<span class="sourceLineNo">8052</span>  /**<a name="line.8052"></a>
+<span class="sourceLineNo">8053</span>   * Reckon the Cells to apply to WAL, memstore, and to return to the Client in passed<a name="line.8053"></a>
+<span class="sourceLineNo">8054</span>   * column family/Store.<a name="line.8054"></a>
+<span class="sourceLineNo">8055</span>   *<a name="line.8055"></a>
+<span class="sourceLineNo">8056</span>   * Does Get of current value and then adds passed in deltas for this Store returning the result.<a name="line.8056"></a>
+<span class="sourceLineNo">8057</span>   *<a name="line.8057"></a>
+<span class="sourceLineNo">8058</span>   * @param op Whether Increment or Append<a name="line.8058"></a>
+<span class="sourceLineNo">8059</span>   * @param mutation The encompassing Mutation object<a name="line.8059"></a>
+<span class="sourceLineNo">8060</span>   * @param deltas Changes to apply to this Store; either increment amount or data to append<a name="line.8060"></a>
+<span class="sourceLineNo">8061</span>   * @param results In here we accumulate all the Cells we are to return to the client. If null,<a name="line.8061"></a>
+<span class="sourceLineNo">8062</span>   *                client doesn't want results returned.<a name="line.8062"></a>
+<span class="sourceLineNo">8063</span>   * @return Resulting Cells after &lt;code&gt;deltas&lt;/code&gt; have been applied to current<a name="line.8063"></a>
+<span class="sourceLineNo">8064</span>   *  values. Side effect is our filling out of the &lt;code&gt;results&lt;/code&gt; List.<a name="line.8064"></a>
+<span class="sourceLineNo">8065</span>   */<a name="line.8065"></a>
+<span class="sourceLineNo">8066</span>  private List&lt;Cell&gt; reckonDeltasByStore(HStore store, Operation op, Mutation mutation,<a name="line.8066"></a>
+<span class="sourceLineNo">8067</span>      Durability effectiveDurability, long now, List&lt;Cell&gt; deltas, List&lt;Cell&gt; results)<a name="line.8067"></a>
+<span class="sourceLineNo">8068</span>      throws IOException {<a name="line.8068"></a>
+<span class="sourceLineNo">8069</span>    byte[] columnFamily = store.getColumnFamilyDescriptor().getName();<a name="line.8069"></a>
+<span class="sourceLineNo">8070</span>    List&lt;Pair&lt;Cell, Cell&gt;&gt; cellPairs = new ArrayList&lt;&gt;(deltas.size());<a name="line.8070"></a>
+<span class="sourceLineNo">8071</span>    // Get previous values for all columns in this family.<a name="line.8071"></a>
+<span class="sourceLineNo">8072</span>    TimeRange tr = null;<a name="line.8072"></a>
+<span class="sourceLineNo">8073</span>    switch (op) {<a name="line.8073"></a>
+<span class="sourceLineNo">8074</span>      case INCREMENT:<a name="line.8074"></a>
+<span class="sourceLineNo">8075</span>        tr = ((Increment)mutation).getTimeRange();<a name="line.8075"></a>
 <span class="sourceLineNo">8076</span>        break;<a name="line.8076"></a>
-<span class="sourceLineNo">8077</span>    }<a name="line.8077"></a>
-<span class="sourceLineNo">8078</span>    List&lt;Cell&gt; currentValues = get(mutation, store, deltas,null, tr);<a name="line.8078"></a>
-<span class="sourceLineNo">8079</span>    // Iterate the input columns and update existing values if they were found, otherwise<a name="line.8079"></a>
-<span class="sourceLineNo">8080</span>    // add new column initialized to the delta amount<a name="line.8080"></a>
-<span class="sourceLineNo">8081</span>    int currentValuesIndex = 0;<a name="line.8081"></a>
-<span class="sourceLineNo">8082</span>    for (int i = 0; i &lt; deltas.size(); i++) {<a name="line.8082"></a>
-<span class="sourceLineNo">8083</span>      Cell delta = deltas.get(i);<a name="line.8083"></a>
-<span class="sourceLineNo">8084</span>      Cell currentValue = null;<a name="line.8084"></a>
-<span class="sourceLineNo">8085</span>      if (currentValuesIndex &lt; currentValues.size() &amp;&amp;<a name="line.8085"></a>
-<span class="sourceLineNo">8086</span>          CellUtil.matchingQualifier(currentValues.get(currentValuesIndex), delta)) {<a name="line.8086"></a>
-<span class="sourceLineNo">8087</span>        currentValue = currentValues.get(currentValuesIndex);<a name="line.8087"></a>
-<span class="sourceLineNo">8088</span>        if (i &lt; (deltas.size() - 1) &amp;&amp; !CellUtil.matchingQualifier(delta, deltas.get(i + 1))) {<a name="line.8088"></a>
-<span class="sourceLineNo">8089</span>          currentValuesIndex++;<a name="line.8089"></a>
-<span class="sourceLineNo">8090</span>        }<a name="line.8090"></a>
-<span class="sourceLineNo">8091</span>      }<a name="line.8091"></a>
-<span class="sourceLineNo">8092</span><a name="line.8092"></a>
-<span class="sourceLineNo">8093</span>      // Switch on whether this an increment or an append building the new Cell to apply.<a name="line.8093"></a>
-<span class="sourceLineNo">8094</span>      Cell newCell = null;<a name="line.8094"></a>
-<span class="sourceLineNo">8095</span>      switch (op) {<a name="line.8095"></a>
-<span class="sourceLineNo">8096</span>        case INCREMENT:<a name="line.8096"></a>
-<span class="sourceLineNo">8097</span>          long deltaAmount = getLongValue(delta);<a name="line.8097"></a>
-<span class="sourceLineNo">8098</span>          final long newValue = currentValue == null ? deltaAmount : getLongValue(currentValue) + deltaAmount;<a name="line.8098"></a>
-<span class="sourceLineNo">8099</span>          newCell = reckonDelta(delta, currentValue, columnFamily, now, mutation, (oldCell) -&gt; Bytes.toBytes(newValue));<a name="line.8099"></a>
-<span class="sourceLineNo">8100</span>          break;<a name="line.8100"></a>
-<span class="sourceLineNo">8101</span>        case APPEND:<a name="line.8101"></a>
-<span class="sourceLineNo">8102</span>          newCell = reckonDelta(delta, currentValue, columnFamily, now, mutation, (oldCell) -&gt;<a name="line.8102"></a>
-<span class="sourceLineNo">8103</span>            ByteBuffer.wrap(new byte[delta.getValueLength() + oldCell.getValueLength()])<a name="line.8103"></a>
-<span class="sourceLineNo">8104</span>                    .put(oldCell.getValueArray(), oldCell.getValueOffset(), oldCell.getValueLength())<a name="line.8104"></a>
-<span class="sourceLineNo">8105</span>                    .put(delta.getValueArray(), delta.getValueOffset(), delta.getValueLength())<a name="line.8105"></a>
-<span class="sourceLineNo">8106</span>                    .array()<a name="line.8106"></a>
-<span class="sourceLineNo">8107</span>          );<a name="line.8107"></a>
-<span class="sourceLineNo">8108</span>          break;<a name="line.8108"></a>
-<span class="sourceLineNo">8109</span>        default: throw new UnsupportedOperationException(op.toString());<a name="line.8109"></a>
-<span class="sourceLineNo">8110</span>      }<a name="line.8110"></a>
-<span class="sourceLineNo">8111</span>      int newCellSize = PrivateCellUtil.estimatedSerializedSizeOf(newCell);<a name="line.8111"></a>
-<span class="sourceLineNo">8112</span>      if (newCellSize &gt; this.maxCellSize) {<a name="line.8112"></a>
-<span class="sourceLineNo">8113</span>        String msg = "Cell with size " + newCellSize + " exceeds limit of " +<a name="line.8113"></a>
-<span class="sourceLineNo">8114</span>            this.maxCellSize + " bytes";<a name="line.8114"></a>
-<span class="sourceLineNo">8115</span>        if (LOG.isDebugEnabled()) {<a name="line.8115"></a>
-<span class="sourceLineNo">8116</span>          LOG.debug(msg);<a name="line.8116"></a>
-<span class="sourceLineNo">8117</span>        }<a name="line.8117"></a>
-<span class="sourceLineNo">8118</span>        throw new DoNotRetryIOException(msg);<a name="line.8118"></a>
-<span class="sourceLineNo">8119</span>      }<a name="line.8119"></a>
-<span class="sourceLineNo">8120</span>      cellPairs.add(new Pair&lt;&gt;(currentValue, newCell));<a name="line.8120"></a>
-<span class="sourceLineNo">8121</span>      // Add to results to get returned to the Client. If null, cilent does not want results.<a name="line.8121"></a>
-<span class="sourceLineNo">8122</span>      if (results != null) {<a name="line.8122"></a>
-<span class="sourceLineNo">8123</span>        results.add(newCell);<a name="line.8123"></a>
+<span class="sourceLineNo">8077</span>      case APPEND:<a name="line.8077"></a>
+<span class="sourceLineNo">8078</span>        tr = ((Append)mutation).getTimeRange();<a name="line.8078"></a>
+<span class="sourceLineNo">8079</span>        break;<a name="line.8079"></a>
+<span class="sourceLineNo">8080</span>      default:<a name="line.8080"></a>
+<span class="sourceLineNo">8081</span>        break;<a name="line.8081"></a>
+<span class="sourceLineNo">8082</span>    }<a name="line.8082"></a>
+<span class="sourceLineNo">8083</span>    List&lt;Cell&gt; currentValues = get(mutation, store, deltas,null, tr);<a name="line.8083"></a>
+<span class="sourceLineNo">8084</span>    // Iterate the input columns and update existing values if they were found, otherwise<a name="line.8084"></a>
+<span class="sourceLineNo">8085</span>    // add new column initialized to the delta amount<a name="line.8085"></a>
+<span class="sourceLineNo">8086</span>    int currentValuesIndex = 0;<a name="line.8086"></a>
+<span class="sourceLineNo">8087</span>    for (int i = 0; i &lt; deltas.size(); i++) {<a name="line.8087"></a>
+<span class="sourceLineNo">8088</span>      Cell delta = deltas.get(i);<a name="line.8088"></a>
+<span class="sourceLineNo">8089</span>      Cell currentValue = null;<a name="line.8089"></a>
+<span class="sourceLineNo">8090</span>      if (currentValuesIndex &lt; currentValues.size() &amp;&amp;<a name="line.8090"></a>
+<span class="sourceLineNo">8091</span>          CellUtil.matchingQualifier(currentValues.get(currentValuesIndex), delta)) {<a name="line.8091"></a>
+<span class="sourceLineNo">8092</span>        currentValue = currentValues.get(currentValuesIndex);<a name="line.8092"></a>
+<span class="sourceLineNo">8093</span>        if (i &lt; (deltas.size() - 1) &amp;&amp; !CellUtil.matchingQualifier(delta, deltas.get(i + 1))) {<a name="line.8093"></a>
+<span class="sourceLineNo">8094</span>          currentValuesIndex++;<a name="line.8094"></a>
+<span class="sourceLineNo">8095</span>        }<a name="line.8095"></a>
+<span class="sourceLineNo">8096</span>      }<a name="line.8096"></a>
+<span class="sourceLineNo">8097</span><a name="line.8097"></a>
+<span class="sourceLineNo">8098</span>      // Switch on whether this an increment or an append building the new Cell to apply.<a name="line.8098"></a>
+<span class="sourceLineNo">8099</span>      Cell newCell = null;<a name="line.8099"></a>
+<span class="sourceLineNo">8100</span>      switch (op) {<a name="line.8100"></a>
+<span class="sourceLineNo">8101</span>        case INCREMENT:<a name="line.8101"></a>
+<span class="sourceLineNo">8102</span>          long deltaAmount = getLongValue(delta);<a name="line.8102"></a>
+<span class="sourceLineNo">8103</span>          final long newValue = currentValue == null ? deltaAmount : getLongValue(currentValue) + deltaAmount;<a name="line.8103"></a>
+<span class="sourceLineNo">8104</span>          newCell = reckonDelta(delta, currentValue, columnFamily, now, mutation, (oldCell) -&gt; Bytes.toBytes(newValue));<a name="line.8104"></a>
+<span class="sourceLineNo">8105</span>          break;<a name="line.8105"></a>
+<span class="sourceLineNo">8106</span>        case APPEND:<a name="line.8106"></a>
+<span class="sourceLineNo">8107</span>          newCell = reckonDelta(delta, currentValue, columnFamily, now, mutation, (oldCell) -&gt;<a name="line.8107"></a>
+<span class="sourceLineNo">8108</span>            ByteBuffer.wrap(new byte[delta.getValueLength() + oldCell.getValueLength()])<a name="line.8108"></a>
+<span class="sourceLineNo">8109</span>                    .put(oldCell.getValueArray(), oldCell.getValueOffset(), oldCell.getValueLength())<a name="line.8109"></a>
+<span class="sourceLineNo">8110</span>                    .put(delta.getValueArray(), delta.getValueOffset(), delta.getValueLength())<a name="line.8110"></a>
+<span class="sourceLineNo">8111</span>                    .array()<a name="line.8111"></a>
+<span class="sourceLineNo">8112</span>          );<a name="line.8112"></a>
+<span class="sourceLineNo">8113</span>          break;<a name="line.8113"></a>
+<span class="sourceLineNo">8114</span>        default: throw new UnsupportedOperationException(op.toString());<a name="line.8114"></a>
+<span class="sourceLineNo">8115</span>      }<a name="line.8115"></a>
+<span class="sourceLineNo">8116</span>      int newCellSize = PrivateCellUtil.estimatedSerializedSizeOf(newCell);<a name="line.8116"></a>
+<span class="sourceLineNo">8117</span>      if (newCellSize &gt; this.maxCellSize) {<a name="line.8117"></a>
+<span class="sourceLineNo">8118</span>        String msg = "Cell with size " + newCellSize + " exceeds limit of " +<a name="line.8118"></a>
+<span class="sourceLineNo">8119</span>            this.maxCellSize + " bytes";<a name="line.8119"></a>
+<span class="sourceLineNo">8120</span>        if (LOG.isDebugEnabled()) {<a name="line.8120"></a>
+<span class="sourceLineNo">8121</span>          LOG.debug(msg);<a name="line.8121"></a>
+<span class="sourceLineNo">8122</span>        }<a name="line.8122"></a>
+<span class="sourceLineNo">8123</span>        throw new DoNotRetryIOException(msg);<a name="line.8123"></a>
 <span class="sourceLineNo">8124</span>      }<a name="line.8124"></a>
-<span class="sourceLineNo">8125</span>    }<a name="line.8125"></a>
-<span class="sourceLineNo">8126</span><a name="line.8126"></a>
-<span class="sourceLineNo">8127</span>    // Give coprocessors a chance to update the new cells before apply to WAL or memstore<a name="line.8127"></a>
-<span class="sourceLineNo">8128</span>    if (coprocessorHost != null) {<a name="line.8128"></a>
-<span class="sourceLineNo">8129</span>      // Here the operation must be increment or append.<a name="line.8129"></a>
-<span class="sourceLineNo">8130</span>      cellPairs = op == Operation.INCREMENT ?<a name="line.8130"></a>
-<span class="sourceLineNo">8131</span>          coprocessorHost.postIncrementBeforeWAL(mutation, cellPairs) :<a name="line.8131"></a>
-<span class="sourceLineNo">8132</span>          coprocessorHost.postAppendBeforeWAL(mutation, cellPairs);<a name="line.8132"></a>
-<span class="sourceLineNo">8133</span>    }<a name="line.8133"></a>
-<span class="sourceLineNo">8134</span>    return cellPairs.stream().map(Pair::getSecond).collect(Collectors.toList());<a name="line.8134"></a>
-<span class="sourceLineNo">8135</span>  }<a name="line.8135"></a>
-<span class="sourceLineNo">8136</span><a name="line.8136"></a>
-<span class="sourceLineNo">8137</span>  private static Cell reckonDelta(final Cell delta, final Cell currentCell,<a name="line.8137"></a>
-<span class="sourceLineNo">8138</span>                                  final byte[] columnFamily, final long now,<a name="line.8138"></a>
-<span class="sourceLineNo">8139</span>                                  Mutation mutation, Function&lt;Cell, byte[]&gt; supplier) throws IOException {<a name="line.8139"></a>
-<span class="sourceLineNo">8140</span>    // Forward any tags found on the delta.<a name="line.8140"></a>
-<span class="sourceLineNo">8141</span>    List&lt;Tag&gt; tags = TagUtil.carryForwardTags(delta);<a name="line.8141"></a>
-<span class="sourceLineNo">8142</span>    tags = TagUtil.carryForwardTTLTag(tags, mutation.getTTL());<a name="line.8142"></a>
-<span class="sourceLineNo">8143</span>    if (currentCell != null) {<a name="line.8143"></a>
-<span class="sourceLineNo">8144</span>      tags = TagUtil.carryForwardTags(tags, currentCell);<a name="line.8144"></a>
-<span class="sourceLineNo">8145</span>      byte[] newValue = supplier.apply(currentCell);<a name="line.8145"></a>
-<span class="sourceLineNo">8146</span>      return ExtendedCellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.8146"></a>
-<span class="sourceLineNo">8147</span>              .setRow(mutation.getRow(), 0, mutation.getRow().length)<a name="line.8147"></a>
-<span class="sourceLineNo">8148</span>              .setFamily(columnFamily, 0, columnFamily.length)<a name="line.8148"></a>
-<span class="sourceLineNo">8149</span>              // copy the qualifier if the cell is located in shared memory.<a name="line.8149"></a>
-<span class="sourceLineNo">8150</span>              .setQualifier(CellUtil.cloneQualifier(delta))<a name="line.8150"></a>
-<span class="sourceLineNo">8151</span>              .setTimestamp(Math.max(currentCell.getTimestamp() + 1, now))<a name="line.8151"></a>
-<span class="sourceLineNo">8152</span>              .setType(KeyValue.Type.Put.getCode())<a name="line.8152"></a>
-<span class="sourceLineNo">8153</span>              .setValue(newValue, 0, newValue.length)<a name="line.8153"></a>
-<span class="sourceLineNo">8154</span>              .setTags(TagUtil.fromList(tags))<a name="line.8154"></a>
-<span class="sourceLineNo">8155</span>              .build();<a name="line.8155"></a>
-<span class="sourceLineNo">8156</span>    } else {<a name="line.8156"></a>
-<span class="sourceLineNo">8157</span>      PrivateCellUtil.updateLatestStamp(delta, now);<a name="line.8157"></a>
-<span class="sourceLineNo">8158</span>      return CollectionUtils.isEmpty(tags) ? delta : PrivateCellUtil.createCell(delta, tags);<a name="line.8158"></a>
-<span class="sourceLineNo">8159</span>    }<a name="line.8159"></a>
-<span class="sourceLineNo">8160</span>  }<a name="line.8160"></a>
-<span class="sourceLineNo">8161</span><a name="line.8161"></a>
-<span class="sourceLineNo">8162</span>  /**<a name="line.8162"></a>
-<span class="sourceLineNo">8163</span>   * @return Get the long out of the passed in Cell<a name="line.8163"></a>
-<span class="sourceLineNo">8164</span>   */<a name="line.8164"></a>
-<span class="sourceLineNo">8165</span>  private static long getLongValue(final Cell cell) throws DoNotRetryIOException {<a name="line.8165"></a>
-<span class="sourceLineNo">8166</span>    int len = cell.getValueLength();<a name="line.8166"></a>
-<span class="sourceLineNo">8167</span>    if (len != Bytes.SIZEOF_LONG) {<a name="line.8167"></a>
-<span class="sourceLineNo">8168</span>      // throw DoNotRetryIOException instead of IllegalArgumentException<a name="line.8168"></a>
-<span class="sourceLineNo">8169</span>      throw new DoNotRetryIOException("Field is not a long, it's " + len + " bytes wide");<a name="line.8169"></a>
-<span class="sourceLineNo">8170</span>    }<a name="line.8170"></a>
-<span class="sourceLineNo">8171</span>    return PrivateCellUtil.getValueAsLong(cell);<a name="line.8171"></a>
-<span class="sourceLineNo">8172</span>  }<a name="line.8172"></a>
-<span class="sourceLineNo">8173</span><a name="line.8173"></a>
-<span class="sourceLineNo">8174</span>  /**<a name="line.8174"></a>
-<span class="sourceLineNo">8175</span>   * Do a specific Get on passed &lt;code&gt;columnFamily&lt;/code&gt; and column qualifiers.<a name="line.8175"></a>
-<span class="sourceLineNo">8176</span>   * @param mutation Mutation we are doing this Get for.<a name="line.8176"></a>
-<span class="sourceLineNo">8177</span>   * @param store Which column family on row (TODO: Go all Gets in one go)<a name="line.8177"></a>
-<span class="sourceLineNo">8178</span>   * @param coordinates Cells from &lt;code&gt;mutation&lt;/code&gt; used as coordinates applied to Get.<a name="line.8178"></a>
-<span class="sourceLineNo">8179</span>   * @return Return list of Cells found.<a name="line.8179"></a>
-<span class="sourceLineNo">8180</span>   */<a name="line.8180"></a>
-<span class="sourceLineNo">8181</span>  private List&lt;Cell&gt; get(Mutation mutation, HStore store, List&lt;Cell&gt; coordinates,<a name="line.8181"></a>
-<span class="sourceLineNo">8182</span>      IsolationLevel isolation, TimeRange tr) throws IOException {<a name="line.8182"></a>
-<span class="sourceLineNo">8183</span>    // Sort the cells so that they match the order that they appear in the Get results. Otherwise,<a name="line.8183"></a>
-<span class="sourceLineNo">8184</span>    // we won't be able to find the existing values if the cells are not specified in order by the<a name="line.8184"></a>
-<span class="sourceLineNo">8185</span>    // client since cells are in an array list.<a name="line.8185"></a>
-<span class="sourceLineNo">8186</span>    // TODO: I don't get why we are sorting. St.Ack 20150107<a name="line.8186"></a>
-<span class="sourceLineNo">8187</span>    sort(coordinates, store.getComparator());<a name="line.8187"></a>
-<span class="sourceLineNo">8188</span>    Get get = new Get(mutation.getRow());<a name="line.8188"></a>
-<span class="sourceLineNo">8189</span>    if (isolation != null) {<a name="line.8189"></a>
-<span class="sourceLineNo">8190</span>      get.setIsolationLevel(isolation);<a name="line.8190"></a>
-<span class="sourceLineNo">8191</span>    }<a name="line.8191"></a>
-<span class="sourceLineNo">8192</span>    for (Cell cell: coordinates) {<a name="line.8192"></a>
-<span class="sourceLineNo">8193</span>      get.addColumn(store.getColumnFamilyDescriptor().getName(), CellUtil.cloneQualifier(cell));<a name="line.8193"></a>
-<span class="sourceLineNo">8194</span>    }<a name="line.8194"></a>
-<span class="sourceLineNo">8195</span>    // Increments carry time range. If an Increment instance, put it on the Get.<a name="line.8195"></a>
-<span class="sourceLineNo">8196</span>    if (tr != null) {<a name="line.8196"></a>
-<span class="sourceLineNo">8197</span>      get.setTimeRange(tr.getMin(), tr.getMax());<a name="line.8197"></a>
-<span class="sourceLineNo">8198</span>    }<a name="line.8198"></a>
-<span class="sourceLineNo">8199</span>    return get(get, false);<a name="line.8199"></a>
-<span class="sourceLineNo">8200</span>  }<a name="line.8200"></a>
-<span class="sourceLineNo">8201</span><a name="line.8201"></a>
-<span class="sourceLineNo">8202</span>  /**<a name="line.8202"></a>
-<span class="sourceLineNo">8203</span>   * @return Sorted list of &lt;code&gt;cells&lt;/code&gt; using &lt;code&gt;comparator&lt;/code&gt;<a name="line.8203"></a>
-<span class="sourceLineNo">8204</span>   */<a name="line.8204"></a>
-<span class="sourceLineNo">8205</span>  private static List&lt;Cell&gt; sort(List&lt;Cell&gt; cells, final CellComparator comparator) {<a name="line.8205"></a>
-<span class="sourceLineNo">8206</span>    cells.sort(comparator);<a name="line.8206"></a>
-<span class="sourceLineNo">8207</span>    return cells;<a name="line.8207"></a>
-<span class="sourceLineNo">8208</span>  }<a name="line.8208"></a>
-<span class="sourceLineNo">8209</span><a name="line.8209"></a>
-<span class="sourceLineNo">8210</span>  public static final long FIXED_OVERHEAD = ClassSize.align(<a name="line.8210"></a>
-<span class="sourceLineNo">8211</span>      ClassSize.OBJECT +<a name="line.8211"></a>
-<span class="sourceLineNo">8212</span>      ClassSize.ARRAY +<a name="line.8212"></a>
-<span class="sourceLineNo">8213</span>      55 * ClassSize.REFERENCE + 3 * Bytes.SIZEOF_INT +<a name="line.8213"></a>
-<span class="sourceLineNo">8214</span>      (15 * Bytes.SIZEOF_LONG) +<a name="line.8214"></a>
-<span class="sourceLineNo">8215</span>      3 * Bytes.SIZEOF_BOOLEAN);<a name="line.8215"></a>
-<span class="sourceLineNo">8216</span><a name="line.8216"></a>
-<span class="sourceLineNo">8217</span>  // woefully out of date - currently missing:<a name="line.8217"></a>
-<span class="sourceLineNo">8218</span>  // 1 x HashMap - coprocessorServiceHandlers<a name="line.8218"></a>
-<span class="sourceLineNo">8219</span>  // 6 x LongAdder - numMutationsWithoutWAL, dataInMemoryWithoutWAL,<a name="line.8219"></a>
-<span class="sourceLineNo">8220</span>  //   checkAndMutateChecksPassed, checkAndMutateChecksFailed, readRequestsCount,<a name="line.8220"></a>
-<span class="sourceLineNo">8221</span>  //   writeRequestsCount, cpRequestsCount<a name="line.8221"></a>
-<span class="sourceLineNo">8222</span>  // 1 x HRegion$WriteState - writestate<a name="line.8222"></a>
-<span class="sourceLineNo">8223</span>  // 1 x RegionCoprocessorHost - coprocessorHost<a name="line.8223"></a>
-<span class="sourceLineNo">8224</span>  // 1 x RegionSplitPolicy - splitPolicy<a name="line.8224"></a>
-<span class="sourceLineNo">8225</span>  // 1 x MetricsRegion - metricsRegion<a name="line.8225"></a>
-<span class="sourceLineNo">8226</span>  // 1 x MetricsRegionWrapperImpl - metricsRegionWrapper<a name="line.8226"></a>
-<span class="sourceLineNo">8227</span>  public static final long DEEP_OVERHEAD = FIXED_OVERHEAD +<a name="line.8227"></a>
-<span class="sourceLineNo">8228</span>      ClassSize.OBJECT + // closeLock<a name="line.8228"></a>
-<span class="sourceLineNo">8229</span>      (2 * ClassSize.ATOMIC_BOOLEAN) + // closed, closing<a name="line.8229"></a>
-<span class="sourceLineNo">8230</span>      (3 * ClassSize.ATOMIC_LONG) + // numPutsWithoutWAL, dataInMemoryWithoutWAL,<a name="line.8230"></a>
-<span class="sourceLineNo">8231</span>                                    // compactionsFailed<a name="line.8231"></a>
-<span class="sourceLineNo">8232</span>      (2 * ClassSize.CONCURRENT_HASHMAP) +  // lockedRows, scannerReadPoints<a name="line.8232"></a>
-<span class="sourceLineNo">8233</span>      WriteState.HEAP_SIZE + // writestate<a name="line.8233"></a>
-<span class="sourceLineNo">8234</span>      ClassSize.CONCURRENT_SKIPLISTMAP + ClassSize.CONCURRENT_SKIPLISTMAP_ENTRY + // stores<a name="line.8234"></a>
-<span class="sourceLineNo">8235</span>      (2 * ClassSize.REENTRANT_LOCK) + // lock, updatesLock<a name="line.8235"></a>
-<span class="sourceLineNo">8236</span>      MultiVersionConcurrencyControl.FIXED_SIZE // mvcc<a name="line.8236"></a>
-<span class="sourceLineNo">8237</span>      + 2 * ClassSize.TREEMAP // maxSeqIdInStores, replicationScopes<a name="line.8237"></a>
-<span class="sourceLineNo">8238</span>      + 2 * ClassSize.ATOMIC_INTEGER // majorInProgress, minorInProgress<a name="line.8238"></a>
-<span class="sourceLineNo">8239</span>      + ClassSize.STORE_SERVICES // store services<a name="line.8239"></a>
-<span class="sourceLineNo">8240</span>      + StoreHotnessProtector.FIXED_SIZE<a name="line.8240"></a>
-<span class="sourceLineNo">8241</span>      ;<a name="line.8241"></a>
-<span class="sourceLineNo">8242</span><a name="line.8242"></a>
-<span class="sourceLineNo">8243</span>  @Override<a name="line.8243"></a>
-<span class="sourceLineNo">8244</span>  public long heapSize() {<a name="line.8244"></a>
-<span class="sourceLineNo">8245</span>    // this does not take into account row locks, recent flushes, mvcc entries, and more<a name="line.8245"></a>
-<span class="sourceLineNo">8246</span>    return DEEP_OVERHEAD + stores.values().stream().mapToLong(HStore::heapSize).sum();<a name="line.8246"></a>
-<span class="sourceLineNo">8247</span>  }<a name="line.8247"></a>
-<span class="sourceLineNo">8248</span><a name="line.8248"></a>
-<span class="sourceLineNo">8249</span>  /**<a name="line.8249"></a>
-<span class="sourceLineNo">8250</span>   * Registers a new protocol buffer {@link Service} subclass as a coprocessor endpoint to<a name="line.8250"></a>
-<span class="sourceLineNo">8251</span>   * be available for handling Region#execService(com.google.protobuf.RpcController,<a name="line.8251"></a>
-<span class="sourceLineNo">8252</span>   *    org.apache.hadoop.hbase.protobuf.generated.ClientProtos.CoprocessorServiceCall) calls.<a name="line.8252"></a>
-<span class="sourceLineNo">8253</span>   *<a name="line.8253"></a>
-<span class="sourceLineNo">8254</span>   * &lt;p&gt;<a name="line.8254"></a>
-<span class="sourceLineNo">8255</span>   * Only a single instance may be registered per region for a given {@link Service} subclass (the<a name="line.8255"></a>
-<span class="sourceLineNo">8256</span>   * instances are keyed on {@link com.google.protobuf.Descriptors.ServiceDescriptor#getFullName()}.<a name="line.8256"></a>
-<span class="sourceLineNo">8257</span>   * After the first registration, subsequent calls with the same service name will fail with<a name="line.8257"></a>
-<span class="sourceLineNo">8258</span>   * a return value of {@code false}.<a name="line.8258"></a>
-<span class="sourceLineNo">8259</span>   * &lt;/p&gt;<a name="line.8259"></a>
-<span class="sourceLineNo">8260</span>   * @param instance the {@code Service} subclass instance to expose as a coprocessor endpoint<a name="line.8260"></a>
-<span class="sourceLineNo">8261</span>   * @return {@code true} if the registration was successful, {@code false}<a name="line.8261"></a>
-<span class="sourceLineNo">8262</span>   * otherwise<a name="line.8262"></a>
-<span class="sourceLineNo">8263</span>   */<a name="line.8263"></a>
-<span class="sourceLineNo">8264</span>  public boolean registerService(com.google.protobuf.Service instance) {<a name="line.8264"></a>
-<span class="sourceLineNo">8265</span>    /*<a name="line.8265"></a>
-<span class="sourceLineNo">8266</span>     * No stacking of instances is allowed for a single service name<a name="line.8266"></a>
-<span class="sourceLineNo">8267</span>     */<a name="line.8267"></a>
-<span class="sourceLineNo">8268</span>    com.google.protobuf.Descriptors.ServiceDescriptor serviceDesc = instance.getDescriptorForType();<a name="line.8268"></a>
-<span class="sourceLineNo">8269</span>    String serviceName = CoprocessorRpcUtils.getServiceName(serviceDesc);<a name="line.8269"></a>
-<span class="sourceLineNo">8270</span>    if (coprocessorServiceHandlers.containsKey(serviceName)) {<a name="line.8270"></a>
-<span class="sourceLineNo">8271</span>      LOG.error("Coprocessor service " + serviceName +<a name="line.8271"></a>
-<span class="sourceLineNo">8272</span>          " already registered, rejecting request from " + instance);<a name="line.8272"></a>
-<span class="sourceLineNo">8273</span>      return false;<a name="line.8273"></a>
-<span class="sourceLineNo">8274</span>    }<a name="line.8274"></a>
-<span class="sourceLineNo">8275</span><a name="line.8275"></a>
-<span class="sourceLineNo">8276</span>    coprocessorServiceHandlers.put(serviceName, instance);<a name="line.8276"></a>
-<span class="sourceLineNo">8277</span>    if (LOG.isDebugEnabled()) {<a name="line.8277"></a>
-<span class="sourceLineNo">8278</span>      LOG.debug("Registered coprocessor service: region=" +<a name="line.8278"></a>
-<span class="sourceLineNo">8279</span>          Bytes.toStringBinary(getRegionInfo().getRegionName()) +<a name="line.8279"></a>
-<span class="sourceLineNo">8280</span>          " service=" + serviceName);<a name="line.8280"></a>
-<span class="sourceLineNo">8281</span>    }<a name="line.8281"></a>
-<span class="sourceLineNo">8282</span>    return true;<a name="line.8282"></a>
-<span class="sourceLineNo">8283</span>  }<a name="line.8283"></a>
-<span class="sourceLineNo">8284</span><a name="line.8284"></a>
-<span class="sourceLineNo">8285</span>  /**<a name="line.8285"></a>
-<span class="sourceLineNo">8286</span>   * Executes a single protocol buffer coprocessor endpoint {@link Service} method using<a name="line.8286"></a>
-<span class="sourceLineNo">8287</span>   * the registered protocol handlers.  {@link Service} implementations must be registered via the<a name="line.8287"></a>
-<span class="sourceLineNo">8288</span>   * {@link #registerService(com.google.protobuf.Service)}<a name="line.8288"></a>
-<span class="sourceLineNo">8289</span>   * method before they are available.<a name="line.8289"></a>
-<span class="sourceLineNo">8290</span>   *<a name="line.8290"></a>
-<span class="sourceLineNo">8291</span>   * @param controller an {@code RpcContoller} implementation to pass to the invoked service<a name="line.8291"></a>
-<span class="sourceLineNo">8292</span>   * @param call a {@code CoprocessorServiceCall} instance identifying the service, method,<a name="line.8292"></a>
-<span class="sourceLineNo">8293</span>   *     and parameters for the method invocation<a name="line.8293"></a>
-<span class="sourceLineNo">8294</span>   * @return a protocol buffer {@code Message} instance containing the method's result<a name="line.8294"></a>
-<span class="sourceLineNo">8295</span>   * @throws IOException if no registered service handler is found or an error<a name="line.8295"></a>
-<span class="sourceLineNo">8296</span>   *     occurs during the invocation<a name="line.8296"></a>
-<span class="sourceLineNo">8297</span>   * @see #registerService(com.google.protobuf.Service)<a name="line.8297"></a>
-<span class="sourceLineNo">8298</span>   */<a name="line.8298"></a>
-<span class="sourceLineNo">8299</span>  public com.google.protobuf.Message execService(com.google.protobuf.RpcController controller,<a name="line.8299"></a>
-<span class="sourceLineNo">8300</span>      CoprocessorServiceCall call) throws IOException {<a name="line.8300"></a>
-<span class="sourceLineNo">8301</span>    String serviceName = call.getServiceName();<a name="line.8301"></a>
-<span class="sourceLineNo">8302</span>    com.google.protobuf.Service service = coprocessorServiceHandlers.get(serviceName);<a name="line.8302"></a>
-<span class="sourceLineNo">8303</span>    if (service == null) {<a name="line.8303"></a>
-<span class="sourceLineNo">8304</span>      throw new UnknownProtocolException(null, "No registered coprocessor service found for " +<a name="line.8304"></a>
-<span class="sourceLineNo">8305</span>          serviceName + " in region " + Bytes.toStringBinary(getRegionInfo().getRegionName()));<a name="line.8305"></a>
-<span class="sourceLineNo">8306</span>    }<a name="line.8306"></a>
-<span class="sourceLineNo">8307</span>    com.google.protobuf.Descriptors.ServiceDescriptor serviceDesc = service.getDescriptorForType();<a name="line.8307"></a>
-<span class="sourceLineNo">8308</span><a name="line.8308"></a>
-<span class="sourceLineNo">8309</span>    cpRequestsCount.increment();<a name="line.8309"></a>
-<span class="sourceLineNo">8310</span>    String methodName = call.getMethodName();<a name="line.8310"></a>
-<span class="sourceLineNo">8311</span>    com.google.protobuf.Descriptors.MethodDescriptor methodDesc =<a name="line.8311"></a>
-<span class="sourceLineNo">8312</span>        CoprocessorRpcUtils.getMethodDescriptor(methodName, serviceDesc);<a name="line.8312"></a>
+<span class="sourceLineNo">8125</span>      cellPairs.add(new Pair&lt;&gt;(currentValue, newCell));<a name="line.8125"></a>
+<span class="sourceLineNo">8126</span>      // Add to results to get returned to the Client. If null, cilent does not want results.<a name="line.8126"></a>
+<span class="sourceLineNo">8127</span>      if (results != null) {<a name="line.8127"></a>
+<span class="sourceLineNo">8128</span>        results.add(newCell);<a name="line.8128"></a>
+<span class="sourceLineNo">8129</span>      }<a name="line.8129"></a>
+<span class="sourceLineNo">8130</span>    }<a name="line.8130"></a>
+<span class="sourceLineNo">8131</span><a name="line.8131"></a>
+<span class="sourceLineNo">8132</span>    // Give coprocessors a chance to update the new cells before apply to WAL or memstore<a name="line.8132"></a>
+<span class="sourceLineNo">8133</span>    if (coprocessorHost != null) {<a name="line.8133"></a>
+<span class="sourceLineNo">8134</span>      // Here the operation must be increment or append.<a name="line.8134"></a>
+<span class="sourceLineNo">8135</span>      cellPairs = op == Operation.INCREMENT ?<a name="line.8135"></a>
+<span class="sourceLineNo">8136</span>          coprocessorHost.postIncrementBeforeWAL(mutation, cellPairs) :<a name="line.8136"></a>
+<span class="sourceLineNo">8137</span>          coprocessorHost.postAppendBeforeWAL(mutation, cellPairs);<a name="line.8137"></a>
+<span class="sourceLineNo">8138</span>    }<a name="line.8138"></a>
+<span class="sourceLineNo">8139</span>    return cellPairs.stream().map(Pair::getSecond).collect(Collectors.toList());<a name="line.8139"></a>
+<span class="sourceLineNo">8140</span>  }<a name="line.8140"></a>
+<span class="sourceLineNo">8141</span><a name="line.8141"></a>
+<span class="sourceLineNo">8142</span>  private static Cell reckonDelta(final Cell delta, final Cell currentCell,<a name="line.8142"></a>
+<span class="sourceLineNo">8143</span>                                  final byte[] columnFamily, final long now,<a name="line.8143"></a>
+<span class="sourceLineNo">8144</span>                                  Mutation mutation, Function&lt;Cell, byte[]&gt; supplier) throws IOException {<a name="line.8144"></a>
+<span class="sourceLineNo">8145</span>    // Forward any tags found on the delta.<a name="line.8145"></a>
+<span class="sourceLineNo">8146</span>    List&lt;Tag&gt; tags = TagUtil.carryForwardTags(delta);<a name="line.8146"></a>
+<span class="sourceLineNo">8147</span>    tags = TagUtil.carryForwardTTLTag(tags, mutation.getTTL());<a name="line.8147"></a>
+<span class="sourceLineNo">8148</span>    if (currentCell != null) {<a name="line.8148"></a>
+<span class="sourceLineNo">8149</span>      tags = TagUtil.carryForwardTags(tags, currentCell);<a name="line.8149"></a>
+<span class="sourceLineNo">8150</span>      byte[] newValue = supplier.apply(currentCell);<a name="line.8150"></a>
+<span class="sourceLineNo">8151</span>      return ExtendedCellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.8151"></a>
+<span class="sourceLineNo">8152</span>              .setRow(mutation.getRow(), 0, mutation.getRow().length)<a name="line.8152"></a>
+<span class="sourceLineNo">8153</span>              .setFamily(columnFamily, 0, columnFamily.length)<a name="line.8153"></a>
+<span class="sourceLineNo">8154</span>              // copy the qualifier if the cell is located in shared memory.<a name="line.8154"></a>
+<span class="sourceLineNo">8155</span>              .setQualifier(CellUtil.cloneQualifier(delta))<a name="line.8155"></a>
+<span class="sourceLineNo">8156</span>              .setTimestamp(Math.max(currentCell.getTimestamp() + 1, now))<a name="line.8156"></a>
+<span class="sourceLineNo">8157</span>              .setType(KeyValue.Type.Put.getCode())<a name="line.8157"></a>
+<span class="sourceLineNo">8158</span>              .setValue(newValue, 0, newValue.length)<a name="line.8158"></a>
+<span class="sourceLineNo">8159</span>              .setTags(TagUtil.fromList(tags))<a name="line.8159"></a>
+<span class="sourceLineNo">8160</span>              .build();<a name="line.8160"></a>
+<span class="sourceLineNo">8161</span>    } else {<a name="line.8161"></a>
+<span class="sourceLineNo">8162</span>      PrivateCellUtil.updateLatestStamp(delta, now);<a name="line.8162"></a>
+<span class="sourceLineNo">8163</span>      return CollectionUtils.isEmpty(tags) ? delta : PrivateCellUtil.createCell(delta, tags);<a name="line.8163"></a>
+<span class="sourceLineNo">8164</span>    }<a name="line.8164"></a>
+<span class="sourceLineNo">8165</span>  }<a name="line.8165"></a>
+<span class="sourceLineNo">8166</span><a name="line.8166"></a>
+<span class="sourceLineNo">8167</span>  /**<a name="line.8167"></a>
+<span class="sourceLineNo">8168</span>   * @return Get the long out of the passed in Cell<a name="line.8168"></a>
+<span class="sourceLineNo">8169</span>   */<a name="line.8169"></a>
+<span class="sourceLineNo">8170</span>  private static long getLongValue(final Cell cell) throws DoNotRetryIOException {<a name="line.8170"></a>
+<span class="sourceLineNo">8171</span>    int len = cell.getValueLength();<a name="line.8171"></a>
+<span class="sourceLineNo">8172</span>    if (len != Bytes.SIZEOF_LONG) {<a name="line.8172"></a>
+<span class="sourceLineNo">8173</span>      // throw DoNotRetryIOException instead of IllegalArgumentException<a name="line.8173"></a>
+<span class="sourceLineNo">8174</span>      throw new DoNotRetryIOException("Field is not a long, it's " + len + " bytes wide");<a name="line.8174"></a>
+<span class="sourceLineNo">8175</span>    }<a name="line.8175"></a>
+<span class="sourceLineNo">8176</span>    return PrivateCellUtil.getValueAsLong(cell);<a name="line.8176"></a>
+<span class="sourceLineNo">8177</span>  }<a name="line.8177"></a>
+<span class="sourceLineNo">8178</span><a name="line.8178"></a>
+<span class="sourceLineNo">8179</span>  /**<a name="line.8179"></a>
+<span class="sourceLineNo">8180</span>   * Do a specific Get on passed &lt;code&gt;columnFamily&lt;/code&gt; and column qualifiers.<a name="line.8180"></a>
+<span class="sourceLineNo">8181</span>   * @param mutation Mutation we are doing this Get for.<a name="line.8181"></a>
+<span class="sourceLineNo">8182</span>   * @param store Which column family on row (TODO: Go all Gets in one go)<a name="line.8182"></a>
+<span class="sourceLineNo">8183</span>   * @param coordinates Cells from &lt;code&gt;mutation&lt;/code&gt; used as coordinates applied to Get.<a name="line.8183"></a>
+<span class="sourceLineNo">8184</span>   * @return Return list of Cells found.<a name="line.8184"></a>
+<span class="sourceLineNo">8185</span>   */<a name="line.8185"></a>
+<span class="sourceLineNo">8186</span>  private List&lt;Cell&gt; get(Mutation mutation, HStore store, List&lt;Cell&gt; coordinates,<a name="line.8186"></a>
+<span class="sourceLineNo">8187</span>      IsolationLevel isolation, TimeRange tr) throws IOException {<a name="line.8187"></a>
+<span class="sourceLineNo">8188</span>    // Sort the cells so that they match the order that they appear in the Get results. Otherwise,<a name="line.8188"></a>
+<span class="sourceLineNo">8189</span>    // we won't be able to find the existing values if the cells are not specified in order by the<a name="line.8189"></a>
+<span class="sourceLineNo">8190</span>    // client since cells are in an array list.<a name="line.8190"></a>
+<span class="sourceLineNo">8191</span>    // TODO: I don't get why we are sorting. St.Ack 20150107<a name="line.8191"></a>
+<span class="sourceLineNo">8192</span>    sort(coordinates, store.getComparator());<a name="line.8192"></a>
+<span class="sourceLineNo">8193</span>    Get get = new Get(mutation.getRow());<a name="line.8193"></a>
+<span class="sourceLineNo">8194</span>    if (isolation != null) {<a name="line.8194"></a>
+<span class="sourceLineNo">8195</span>      get.setIsolationLevel(isolation);<a name="line.8195"></a>
+<span class="sourceLineNo">8196</span>    }<a name="line.8196"></a>
+<span class="sourceLineNo">8197</span>    for (Cell cell: coordinates) {<a name="line.8197"></a>
+<span class="sourceLineNo">8198</span>      get.addColumn(store.getColumnFamilyDescriptor().getName(), CellUtil.cloneQualifier(cell));<a name="line.8198"></a>
+<span class="sourceLineNo">8199</span>    }<a name="line.8199"></a>
+<span class="sourceLineNo">8200</span>    // Increments carry time range. If an Increment instance, put it on the Get.<a name="line.8200"></a>
+<span class="sourceLineNo">8201</span>    if (tr != null) {<a name="line.8201"></a>
+<span class="sourceLineNo">8202</span>      get.setTimeRange(tr.getMin(), tr.getMax());<a name="line.8202"></a>
+<span class="sourceLineNo">8203</span>    }<a name="line.8203"></a>
+<span class="sourceLineNo">8204</span>    return get(get, false);<a name="line.8204"></a>
+<span class="sourceLineNo">8205</span>  }<a name="line.8205"></a>
+<span class="sourceLineNo">8206</span><a name="line.8206"></a>
+<span class="sourceLineNo">8207</span>  /**<a name="line.8207"></a>
+<span class="sourceLineNo">8208</span>   * @return Sorted list of &lt;code&gt;cells&lt;/code&gt; using &lt;code&gt;comparator&lt;/code&gt;<a name="line.8208"></a>
+<span class="sourceLineNo">8209</span>   */<a name="line.8209"></a>
+<span class="sourceLineNo">8210</span>  private static List&lt;Cell&gt; sort(List&lt;Cell&gt; cells, final CellComparator comparator) {<a name="line.8210"></a>
+<span class="sourceLineNo">8211</span>    cells.sort(comparator);<a name="line.8211"></a>
+<span class="sourceLineNo">8212</span>    return cells;<a name="line.8212"></a>
+<span class="sourceLineNo">8213</span>  }<a name="line.8213"></a>
+<span class="sourceLineNo">8214</span><a name="line.8214"></a>
+<span class="sourceLineNo">8215</span>  public static final long FIXED_OVERHEAD = ClassSize.align(<a name="line.8215"></a>
+<span class="sourceLineNo">8216</span>      ClassSize.OBJECT +<a name="line.8216"></a>
+<span class="sourceLineNo">8217</span>      ClassSize.ARRAY +<a name="line.8217"></a>
+<span class="sourceLineNo">8218</span>      55 * ClassSize.REFERENCE + 3 * Bytes.SIZEOF_INT +<a name="line.8218"></a>
+<span class="sourceLineNo">8219</span>      (15 * Bytes.SIZEOF_LONG) +<a name="line.8219"></a>
+<span class="sourceLineNo">8220</span>      3 * Bytes.SIZEOF_BOOLEAN);<a name="line.8220"></a>
+<span class="sourceLineNo">8221</span><a name="line.8221"></a>
+<span class="sourceLineNo">8222</span>  // woefully out of date - currently missing:<a name="line.8222"></a>
+<span class="sourceLineNo">8223</span>  // 1 x HashMap - coprocessorServiceHandlers<a name="line.8223"></a>
+<span class="sourceLineNo">8224</span>  // 6 x LongAdder - numMutationsWithoutWAL, dataInMemoryWithoutWAL,<a name="line.8224"></a>
+<span class="sourceLineNo">8225</span>  //   checkAndMutateChecksPassed, checkAndMutateChecksFailed, readRequestsCount,<a name="line.8225"></a>
+<span class="sourceLineNo">8226</span>  //   writeRequestsCount, cpRequestsCount<a name="line.8226"></a>
+<span class="sourceLineNo">8227</span>  // 1 x HRegion$WriteState - writestate<a name="line.8227"></a>
+<span class="sourceLineNo">8228</span>  // 1 x RegionCoprocessorHost - coprocessorHost<a name="line.8228"></a>
+<span class="sourceLineNo">8229</span>  // 1 x RegionSplitPolicy - splitPolicy<a name="line.8229"></a>
+<span class="sourceLineNo">8230</span>  // 1 x MetricsRegion - metricsRegion<a name="line.8230"></a>
+<span class="sourceLineNo">8231</span>  // 1 x MetricsRegionWrapperImpl - metricsRegionWrapper<a name="line.8231"></a>
+<span class="sourceLineNo">8232</span>  public static final long DEEP_OVERHEAD = FIXED_OVERHEAD +<a name="line.8232"></a>
+<span class="sourceLineNo">8233</span>      ClassSize.OBJECT + // closeLock<a name="line.8233"></a>
+<span class="sourceLineNo">8234</span>      (2 * ClassSize.ATOMIC_BOOLEAN) + // closed, closing<a name="line.8234"></a>
+<span class="sourceLineNo">8235</span>      (3 * ClassSize.ATOMIC_LONG) + // numPutsWithoutWAL, dataInMemoryWithoutWAL,<a name="line.8235"></a>
+<span class="sourceLineNo">8236</span>                                    // compactionsFailed<a name="line.8236"></a>
+<span class="sourceLineNo">8237</span>      (2 * ClassSize.CONCURRENT_HASHMAP) +  // lockedRows, scannerReadPoints<a name="line.8237"></a>
+<span class="sourceLineNo">8238</span>      WriteState.HEAP_SIZE + // writestate<a name="line.8238"></a>
+<span class="sourceLineNo">8239</span>      ClassSize.CONCURRENT_SKIPLISTMAP + ClassSize.CONCURRENT_SKIPLISTMAP_ENTRY + // stores<a name="line.8239"></a>
+<span class="sourceLineNo">8240</span>      (2 * ClassSize.REENTRANT_LOCK) + // lock, updatesLock<a name="line.8240"></a>
+<span class="sourceLineNo">8241</span>      MultiVersionConcurrencyControl.FIXED_SIZE // mvcc<a name="line.8241"></a>
+<span class="sourceLineNo">8242</span>      + 2 * ClassSize.TREEMAP // maxSeqIdInStores, replicationScopes<a name="line.8242"></a>
+<span class="sourceLineNo">8243</span>      + 2 * ClassSize.ATOMIC_INTEGER // majorInProgress, minorInProgress<a name="line.8243"></a>
+<span class="sourceLineNo">8244</span>      + ClassSize.STORE_SERVICES // store services<a name="line.8244"></a>
+<span class="sourceLineNo">8245</span>      + StoreHotnessProtector.FIXED_SIZE<a name="line.8245"></a>
+<span class="sourceLineNo">8246</span>      ;<a name="line.8246"></a>
+<span class="sourceLineNo">8247</span><a name="line.8247"></a>
+<span class="sourceLineNo">8248</span>  @Override<a name="line.8248"></a>
+<span class="sourceLineNo">8249</span>  public long heapSize() {<a name="line.8249"></a>
+<span class="sourceLineNo">8250</span>    // this does not take into account row locks, recent flushes, mvcc entries, and more<a name="line.8250"></a>
+<span class="sourceLineNo">8251</span>    return DEEP_OVERHEAD + stores.values().stream().mapToLong(HStore::heapSize).sum();<a name="line.8251"></a>
+<span class="sourceLineNo">8252</span>  }<a name="line.8252"></a>
+<span class="sourceLineNo">8253</span><a name="line.8253"></a>
+<span class="sourceLineNo">8254</span>  /**<a name="line.8254"></a>
+<span class="sourceLineNo">8255</span>   * Registers a new protocol buffer {@link Service} subclass as a coprocessor endpoint to<a name="line.8255"></a>
+<span class="sourceLineNo">8256</span>   * be available for handling Region#execService(com.google.protobuf.RpcController,<a name="line.8256"></a>
+<span class="sourceLineNo">8257</span>   *    org.apache.hadoop.hbase.protobuf.generated.ClientProtos.CoprocessorServiceCall) calls.<a name="line.8257"></a>
+<span class="sourceLineNo">8258</span>   *<a name="line.8258"></a>
+<span class="sourceLineNo">8259</span>   * &lt;p&gt;<a name="line.8259"></a>
+<span class="sourceLineNo">8260</span>   * Only a single instance may be registered per region for a given {@link Service} subclass (the<a name="line.8260"></a>
+<span class="sourceLineNo">8261</span>   * instances are keyed on {@link com.google.protobuf.Descriptors.ServiceDescriptor#getFullName()}.<a name="line.8261"></a>
+<span class="sourceLineNo">8262</span>   * After the first registration, subsequent calls with the same service name will fail with<a name="line.8262"></a>
+<span class="sourceLineNo">8263</span>   * a return value of {@code false}.<a name="line.8263"></a>
+<span class="sourceLineNo">8264</span>   * &lt;/p&gt;<a name="line.8264"></a>
+<span class="sourceLineNo">8265</span>   * @param instance the {@code Service} subclass instance to expose as a coprocessor endpoint<a name="line.8265"></a>
+<span class="sourceLineNo">8266</span>   * @return {@code true} if the registration was successful, {@code false}<a name="line.8266"></a>
+<span class="sourceLineNo">8267</span>   * otherwise<a name="line.8267"></a>
+<span class="sourceLineNo">8268</span>   */<a name="line.8268"></a>
+<span class="sourceLineNo">8269</span>  public boolean registerService(com.google.protobuf.Service instance) {<a name="line.8269"></a>
+<span class="sourceLineNo">8270</span>    /*<a name="line.8270"></a>
+<span class="sourceLineNo">8271</span>     * No stacking of instances is allowed for a single service name<a name="line.8271"></a>
+<span class="sourceLineNo">8272</span>     */<a name="line.8272"></a>
+<span class="sourceLineNo">8273</span>    com.google.protobuf.Descriptors.ServiceDescriptor serviceDesc = instance.getDescriptorForType();<a name="line.8273"></a>
+<span class="sourceLineNo">8274</span>    String serviceName = CoprocessorRpcUtils.getServiceName(serviceDesc);<a name="line.8274"></a>
+<span class="sourceLineNo">8275</span>    if (coprocessorServiceHandlers.containsKey(serviceName)) {<a name="line.8275"></a>
+<span class="sourceLineNo">8276</span>      LOG.error("Coprocessor service " + serviceName +<a name="line.8276"></a>
+<span class="sourceLineNo">8277</span>          " already registered, rejecting request from " + instance);<a name="line.8277"></a>
+<span class="sourceLineNo">8278</span>      return false;<a name="line.8278"></a>
+<span class="sourceLineNo">8279</span>    }<a name="line.8279"></a>
+<span class="sourceLineNo">8280</span><a name="line.8280"></a>
+<span class="sourceLineNo">8281</span>    coprocessorServiceHandlers.put(serviceName, instance);<a name="line.8281"></a>
+<span class="sourceLineNo">8282</span>    if (LOG.isDebugEnabled()) {<a name="line.8282"></a>
+<span class="sourceLineNo">8283</span>      LOG.debug("Registered coprocessor service: region=" +<a name="line.8283"></a>
+<span class="sourceLineNo">8284</span>          Bytes.toStringBinary(getRegionInfo().getRegionName()) +<a name="line.8284"></a>
+<span class="sourceLineNo">8285</span>          " service=" + serviceName);<a name="line.8285"></a>
+<span class="sourceLineNo">8286</span>    }<a name="line.8286"></a>
+<span class="sourceLineNo">8287</span>    return true;<a name="line.8287"></a>
+<span class="sourceLineNo">8288</span>  }<a name="line.8288"></a>
+<span class="sourceLineNo">8289</span><a name="line.8289"></a>
+<span class="sourceLineNo">8290</span>  /**<a name="line.8290"></a>
+<span class="sourceLineNo">8291</span>   * Executes a single protocol buffer coprocessor endpoint {@link Service} method using<a name="line.8291"></a>
+<span class="sourceLineNo">8292</span>   * the registered protocol handlers.  {@link Service} implementations must be registered via the<a name="line.8292"></a>
+<span class="sourceLineNo">8293</span>   * {@link #registerService(com.google.protobuf.Service)}<a name="line.8293"></a>
+<span class="sourceLineNo">8294</span>   * method before they are available.<a name="line.8294"></a>
+<span class="sourceLineNo">8295</span>   *<a name="line.8295"></a>
+<span class="sourceLineNo">8296</span>   * @param controller an {@code RpcContoller} implementation to pass to the invoked service<a name="line.8296"></a>
+<span class="sourceLineNo">8297</span>   * @param call a {@code CoprocessorServiceCall} instance identifying the service, method,<a name="line.8297"></a>
+<span class="sourceLineNo">8298</span>   *     and parameters for the method invocation<a name="line.8298"></a>
+<span class="sourceLineNo">8299</span>   * @return a protocol buffer {@code Message} instance containing the method's result<a name="line.8299"></a>
+<span class="sourceLineNo">8300</span>   * @throws IOException if no registered service handler is found or an error<a name="line.8300"></a>
+<span class="sourceLineNo">8301</span>   *     occurs during the invocation<a name="line.8301"></a>
+<span class="sourceLineNo">8302</span>   * @see #registerService(com.google.protobuf.Service)<a name="line.8302"></a>
+<span class="sourceLineNo">8303</span>   */<a name="line.8303"></a>
+<span class="sourceLineNo">8304</span>  public com.google.protobuf.Message execService(com.google.protobuf.RpcController controller,<a name="line.8304"></a>
+<span class="sourceLineNo">8305</span>      CoprocessorServiceCall call) throws IOException {<a name="line.8305"></a>
+<span class="sourceLineNo">8306</span>    String serviceName = call.getServiceName();<a name="line.8306"></a>
+<span class="sourceLineNo">8307</span>    com.google.protobuf.Service service = coprocessorServiceHandlers.get(serviceName);<a name="line.8307"></a>
+<span class="sourceLineNo">8308</span>    if (service == null) {<a name="line.8308"></a>
+<span class="sourceLineNo">8309</span>      throw new UnknownProtocolException(null, "No registered coprocessor service found for " +<a name="line.8309"></a>
+<span class="sourceLineNo">8310</span>          serviceName + " in region " + Bytes.toStringBinary(getRegionInfo().getRegionName()));<a name="line.8310"></a>
+<span class="sourceLineNo">8311</span>    }<a name="line.8311"></a>
+<span class="sourceLineNo">8312</span>    com.google.protobuf.Descriptors.ServiceDescriptor serviceDesc = service.getDescriptorForType();<a name="line.8312"></a>
 <span class="sourceLineNo">8313</span><a name="line.8313"></a>
-<span class="sourceLineNo">8314</span>    com.google.protobuf.Message.Builder builder =<a name="line.8314"></a>
-<span class="sourceLineNo">8315</span>        service.getRequestPrototype(methodDesc).newBuilderForType();<a name="line.8315"></a>
-<span class="sourceLineNo">8316</span><a name="line.8316"></a>
-<span class="sourceLineNo">8317</span>    org.apache.hadoop.hbase.protobuf.ProtobufUtil.mergeFrom(builder,<a name="line.8317"></a>
-<span class="sourceLineNo">8318</span>        call.getRequest().toByteArray());<a name="line.8318"></a>
-<span class="sourceLineNo">8319</span>    com.google.protobuf.Message request =<a name="line.8319"></a>
-<span class="sourceLineNo">8320</span>        CoprocessorRpcUtils.getRequest(service, methodDesc, call.getRequest());<a name="line.8320"></a>
+<span class="sourceLineNo">8314</span>    cpRequestsCount.increment();<a name="line.8314"></a>
+<span class="sourceLineNo">8315</span>    String methodName = call.getMethodName();<a name="line.8315"></a>
+<span class="sourceLineNo">8316</span>    com.google.protobuf.Descriptors.MethodDescriptor methodDesc =<a name="line.8316"></a>
+<span class="sourceLineNo">8317</span>        CoprocessorRpcUtils.getMethodDescriptor(methodName, serviceDesc);<a name="line.8317"></a>
+<span class="sourceLineNo">8318</span><a name="line.8318"></a>
+<span class="sourceLineNo">8319</span>    com.google.protobuf.Message.Builder builder =<a name="line.8319"></a>
+<span class="sourceLineNo">8320</span>        service.getRequestPrototype(methodDesc).newBuilderForType();<a name="line.8320"></a>
 <span class="sourceLineNo">8321</span><a name="line.8321"></a>
-<span class="sourceLineNo">8322</span>    if (coprocessorHost != null) {<a name="line.8322"></a>
-<span class="sourceLineNo">8323</span>      request = coprocessorHost.preEndpointInvocation(service, methodName, request);<a name="line.8323"></a>
-<span class="sourceLineNo">8324</span>    }<a name="line.8324"></a>
-<span class="sourceLineNo">8325</span><a name="line.8325"></a>
-<span class="sourceLineNo">8326</span>    final com.google.protobuf.Message.Builder responseBuilder =<a name="line.8326"></a>
-<span class="sourceLineNo">8327</span>        service.getResponsePrototype(methodDesc).newBuilderForType();<a name="line.8327"></a>
-<span class="sourceLineNo">8328</span>    service.callMethod(methodDesc, controller, request,<a name="line.8328"></a>
-<span class="sourceLineNo">8329</span>        new com.google.protobuf.RpcCallback&lt;com.google.protobuf.Message&gt;() {<a name="line.8329"></a>
-<span class="sourceLineNo">8330</span>      @Override<a name="line.8330"></a>
-<span class="sourceLineNo">8331</span>      public void run(com.google.protobuf.Message message) {<a name="line.8331"></a>
-<span class="sourceLineNo">8332</span>        if (message != null) {<a name="line.8332"></a>
-<span class="sourceLineNo">8333</span>          responseBuilder.mergeFrom(message);<a name="line.8333"></a>
-<span class="sourceLineNo">8334</span>        }<a name="line.8334"></a>
-<span class="sourceLineNo">8335</span>      }<a name="line.8335"></a>
-<span class="sourceLineNo">8336</span>    });<a name="line.8336"></a>
-<span class="sourceLineNo">8337</span><a name="line.8337"></a>
-<span class="sourceLineNo">8338</span>    if (coprocessorHost != null) {<a name="line.8338"></a>
-<span class="sourceLineNo">8339</span>      coprocessorHost.postEndpointInvocation(service, methodName, request, responseBuilder);<a name="line.8339"></a>
-<span class="sourceLineNo">8340</span>    }<a name="line.8340"></a>
-<span class="sourceLineNo">8341</span>    IOException exception =<a name="line.8341"></a>
-<span class="sourceLineNo">8342</span>        org.apache.hadoop.hbase.ipc.CoprocessorRpcUtils.getControllerException(controller);<a name="line.8342"></a>
-<span class="sourceLineNo">8343</span>    if (exception != null) {<a name="line.8343"></a>
-<span class="sourceLineNo">8344</span>      throw exception;<a name="line.8344"></a>
+<span class="sourceLineNo">8322</span>    org.apache.hadoop.hbase.protobuf.ProtobufUtil.mergeFrom(builder,<a name="line.8322"></a>
+<span class="sourceLineNo">8323</span>        call.getRequest().toByteArray());<a name="line.8323"></a>
+<span class="sourceLineNo">8324</span>    com.google.protobuf.Message request =<a name="line.8324"></a>
+<span class="sourceLineNo">8325</span>        CoprocessorRpcUtils.getRequest(service, methodDesc, call.getRequest());<a name="line.8325"></a>
+<span class="sourceLineNo">8326</span><a name="line.8326"></a>
+<span class="sourceLineNo">8327</span>    if (coprocessorHost != null) {<a name="line.8327"></a>
+<span class="sourceLineNo">8328</span>      request = coprocessorHost.preEndpointInvocation(service, methodName, request);<a name="line.8328"></a>
+<span class="sourceLineNo">8329</span>    }<a name="line.8329"></a>
+<span class="sourceLineNo">8330</span><a name="line.8330"></a>
+<span class="sourceLineNo">8331</span>    final com.google.protobuf.Message.Builder responseBuilder =<a name="line.8331"></a>
+<span class="sourceLineNo">8332</span>        service.getResponsePrototype(methodDesc).newBuilderForType();<a name="line.8332"></a>
+<span class="sourceLineNo">8333</span>    service.callMethod(methodDesc, controller, request,<a name="line.8333"></a>
+<span class="sourceLineNo">8334</span>        new com.google.protobuf.RpcCallback&lt;com.google.protobuf.Message&gt;() {<a name="line.8334"></a>
+<span class="sourceLineNo">8335</span>      @Override<a name="line.8335"></a>
+<span class="sourceLineNo">8336</span>      public void run(com.google.protobuf.Message message) {<a name="line.8336"></a>
+<span class="sourceLineNo">8337</span>        if (message != null) {<a name="line.8337"></a>
+<span class="sourceLineNo">8338</span>          responseBuilder.mergeFrom(message);<a name="line.8338"></a>
+<span class="sourceLineNo">8339</span>        }<a name="line.8339"></a>
+<span class="sourceLineNo">8340</span>      }<a name="line.8340"></a>
+<span class="sourceLineNo">8341</span>    });<a name="line.8341"></a>
+<span class="sourceLineNo">8342</span><a name="line.8342"></a>
+<span class="sourceLineNo">8343</span>    if (coprocessorHost != null) {<a name="line.8343"></a>
+<span class="sourceLineNo">8344</span>      coprocessorHost.postEndpointInvocation(service, methodName, request, responseBuilder);<a name="line.8344"></a>
 <span class="sourceLineNo">8345</span>    }<a name="line.8345"></a>
-<span class="sourceLineNo">8346</span><a name="line.8346"></a>
-<span class="sourceLineNo">8347</span>    return responseBuilder.build();<a name="line.8347"></a>
-<span class="sourceLineNo">8348</span>  }<a name="line.8348"></a>
-<span class="sourceLineNo">8349</span><a name="line.8349"></a>
-<span class="sourceLineNo">8350</span>  boolean shouldForceSplit() {<a name="line.8350"></a>
-<span class="sourceLineNo">8351</span>    return this.splitRequest;<a name="line.8351"></a>
-<span class="sourceLineNo">8352</span>  }<a name="line.8352"></a>
-<span class="sourceLineNo">8353</span><a name="line.8353"></a>
-<span class="sourceLineNo">8354</span>  byte[] getExplicitSplitPoint() {<a name="line.8354"></a>
-<span class="sourceLineNo">8355</span>    return this.explicitSplitPoint;<a name="line.8355"></a>
-<span class="sourceLineNo">8356</span>  }<a name="line.8356"></a>
-<span class="sourceLineNo">8357</span><a name="line.8357"></a>
-<span class="sourceLineNo">8358</span>  void forceSplit(byte[] sp) {<a name="line.8358"></a>
-<span class="sourceLineNo">8359</span>    // This HRegion will go away after the forced split is successful<a name="line.8359"></a>
-<span class="sourceLineNo">8360</span>    // But if a forced split fails, we need to clear forced split.<a name="line.8360"></a>
-<span class="sourceLineNo">8361</span>    this.splitRequest = true;<a name="line.8361"></a>
-<span class="sourceLineNo">8362</span>    if (sp != null) {<a name="line.8362"></a>
-<span class="sourceLineNo">8363</span>      this.explicitSplitPoint = sp;<a name="line.8363"></a>
-<span class="sourceLineNo">8364</span>    }<a name="line.8364"></a>
-<span class="sourceLineNo">8365</span>  }<a name="line.8365"></a>
-<span class="sourceLineNo">8366</span><a name="line.8366"></a>
-<span class="sourceLineNo">8367</span>  void clearSplit() {<a name="line.8367"></a>
-<span class="sourceLineNo">8368</span>    this.splitRequest = false;<a name="line.8368"></a>
-<span class="sourceLineNo">8369</span>    this.explicitSplitPoint = null;<a name="line.8369"></a>
+<span class="sourceLineNo">8346</span>    IOException exception =<a name="line.8346"></a>
+<span class="sourceLineNo">8347</span>        org.apache.hadoop.hbase.ipc.CoprocessorRpcUtils.getControllerException(controller);<a name="line.8347"></a>
+<span class="sourceLineNo">8348</span>    if (exception != null) {<a name="line.8348"></a>
+<span class="sourceLineNo">8349</span>      throw exception;<a name="line.8349"></a>
+<span class="sourceLineNo">8350</span>    }<a name="line.8350"></a>
+<span class="sourceLineNo">8351</span><a name="line.8351"></a>
+<span class="sourceLineNo">8352</span>    return responseBuilder.build();<a name="line.8352"></a>
+<span class="sourceLineNo">8353</span>  }<a name="line.8353"></a>
+<span class="sourceLineNo">8354</span><a name="line.8354"></a>
+<span class="sourceLineNo">8355</span>  boolean shouldForceSplit() {<a name="line.8355"></a>
+<span class="sourceLineNo">8356</span>    return this.splitRequest;<a name="line.8356"></a>
+<span class="sourceLineNo">8357</span>  }<a name="line.8357"></a>
+<span class="sourceLineNo">8358</span><a name="line.8358"></a>
+<span class="sourceLineNo">8359</span>  byte[] getExplicitSplitPoint() {<a name="line.8359"></a>
+<span class="sourceLineNo">8360</span>    return this.explicitSplitPoint;<a name="line.8360"></a>
+<span class="sourceLineNo">8361</span>  }<a name="line.8361"></a>
+<span class="sourceLineNo">8362</span><a name="line.8362"></a>
+<span class="sourceLineNo">8363</span>  void forceSplit(byte[] sp) {<a name="line.8363"></a>
+<span class="sourceLineNo">8364</span>    // This HRegion will go away after the forced split is successful<a name="line.8364"></a>
+<span class="sourceLineNo">8365</span>    // But if a forced split fails, we need to clear forced split.<a name="line.8365"></a>
+<span class="sourceLineNo">8366</span>    this.splitRequest = true;<a name="line.8366"></a>
+<span class="sourceLineNo">8367</span>    if (sp != null) {<a name="line.8367"></a>
+<span class="sourceLineNo">8368</span>      this.explicitSplitPoint = sp;<a name="line.8368"></a>
+<span class="sourceLineNo">8369</span>    }<a name="line.8369"></a>
 <span class="sourceLineNo">8370</span>  }<a name="line.8370"></a>
 <span class="sourceLineNo">8371</span><a name="line.8371"></a>
-<span class="sourceLineNo">8372</span>  /**<a name="line.8372"></a>
-<span class="sourceLineNo">8373</span>   * Return the splitpoint. null indicates the region isn't splittable<a name="line.8373"></a>
-<span class="sourceLineNo">8374</span>   * If the splitpoint isn't explicitly specified, it will go over the stores<a name="line.8374"></a>
-<span class="sourceLineNo">8375</span>   * to find the best splitpoint. Currently the criteria of best splitpoint<a name="line.8375"></a>
-<span class="sourceLineNo">8376</span>   * is based on the size of the store.<a name="line.8376"></a>
-<span class="sourceLineNo">8377</span>   */<a name="line.8377"></a>
-<span class="sourceLineNo">8378</span>  public byte[] checkSplit() {<a name="line.8378"></a>
-<span class="sourceLineNo">8379</span>    // Can't split META<a name="line.8379"></a>
-<span class="sourceLineNo">8380</span>    if (this.getRegionInfo().isMetaRegion()) {<a name="line.8380"></a>
-<span class="sourceLineNo">8381</span>      if (shouldForceSplit()) {<a name="line.8381"></a>
-<span class="sourceLineNo">8382</span>        LOG.warn("Cannot split meta region in HBase 0.20 and above");<a name="line.8382"></a>
-<span class="sourceLineNo">8383</span>      }<a name="line.8383"></a>
-<span class="sourceLineNo">8384</span>      return null;<a name="line.8384"></a>
-<span class="sourceLineNo">8385</span>    }<a name="line.8385"></a>
-<span class="sourceLineNo">8386</span><a name="line.8386"></a>
-<span class="sourceLineNo">8387</span>    // Can't split a region that is closing.<a name="line.8387"></a>
-<span class="sourceLineNo">8388</span>    if (this.isClosing()) {<a name="line.8388"></a>
+<span class="sourceLineNo">8372</span>  void clearSplit() {<a name="line.8372"></a>
+<span class="sourceLineNo">8373</span>    this.splitRequest = false;<a name="line.8373"></a>
+<span class="sourceLineNo">8374</span>    this.explicitSplitPoint = null;<a name="line.8374"></a>
+<span class="sourceLineNo">8375</span>  }<a name="line.8375"></a>
+<span class="sourceLineNo">8376</span><a name="line.8376"></a>
+<span class="sourceLineNo">8377</span>  /**<a name="line.8377"></a>
+<span class="sourceLineNo">8378</span>   * Return the splitpoint. null indicates the region isn't splittable<a name="line.8378"></a>
+<span class="sourceLineNo">8379</span>   * If the splitpoint isn't explicitly specified, it will go over the stores<a name="line.8379"></a>
+<span class="sourceLineNo">8380</span>   * to find the best splitpoint. Currently the criteria of best splitpoint<a name="line.8380"></a>
+<span class="sourceLineNo">8381</span>   * is based on the size of the store.<a name="line.8381"></a>
+<span class="sourceLineNo">8382</span>   */<a name="line.8382"></a>
+<span class="sourceLineNo">8383</span>  public byte[] checkSplit() {<a name="line.8383"></a>
+<span class="sourceLineNo">8384</span>    // Can't split META<a name="line.8384"></a>
+<span class="sourceLineNo">8385</span>    if (this.getRegionInfo().isMetaRegion()) {<a name="line.8385"></a>
+<span class="sourceLineNo">8386</span>      if (shouldForceSplit()) {<a name="line.8386"></a>
+<span class="sourceLineNo">8387</span>        LOG.warn("Cannot split meta region in HBase 0.20 and above");<a name="line.8387"></a>
+<span class="sourceLineNo">8388</span>      }<a name="line.8388"></a>
 <span class="sourceLineNo">8389</span>      return null;<a name="line.8389"></a>
 <span class="sourceLineNo">8390</span>    }<a name="line.8390"></a>
 <span class="sourceLineNo">8391</span><a name="line.8391"></a>
-<span class="sourceLineNo">8392</span>    if (!splitPolicy.shouldSplit()) {<a name="line.8392"></a>
-<span class="sourceLineNo">8393</span>      return null;<a name="line.8393"></a>
-<span class="sourceLineNo">8394</span>    }<a name="line.8394"></a>
-<span class="sourceLineNo">8395</span><a name="line.8395"></a>
-<span class="sourceLineNo">8396</span>    byte[] ret = splitPolicy.getSplitPoint();<a name="line.8396"></a>
-<span class="sourceLineNo">8397</span><a name="line.8397"></a>
-<span class="sourceLineNo">8398</span>    if (ret != null) {<a name="line.8398"></a>
-<span class="sourceLineNo">8399</span>      try {<a name="line.8399"></a>
-<span class="sourceLineNo">8400</span>        checkRow(ret, "calculated split");<a name="line.8400"></a>
-<span class="sourceLineNo">8401</span>      } catch (IOException e) {<a name="line.8401"></a>
-<span class="sourceLineNo">8402</span>        LOG.error("Ignoring invalid split", e);<a name="line.8402"></a>
-<span class="sourceLineNo">8403</span>        return null;<a name="line.8403"></a>
-<span class="sourceLineNo">8404</span>      }<a name="line.8404"></a>
-<span class="sourceLineNo">8405</span>    }<a name="line.8405"></a>
-<span class="sourceLineNo">8406</span>    return ret;<a name="line.8406"></a>
-<span class="sourceLineNo">8407</span>  }<a name="line.8407"></a>
-<span class="sourceLineNo">8408</span><a name="line.8408"></a>
-<span class="sourceLineNo">8409</span>  /**<a name="line.8409"></a>
-<span class="sourceLineNo">8410</span>   * @return The priority that this region should have in the compaction queue<a name="line.8410"></a>
-<span class="sourceLineNo">8411</span>   */<a name="line.8411"></a>
-<span class="sourceLineNo">8412</span>  public int getCompactPriority() {<a name="line.8412"></a>
-<span class="sourceLineNo">8413</span>    return stores.values().stream().mapToInt(HStore::getCompactPriority).min()<a name="line.8413"></a>
-<span class="sourceLineNo">8414</span>        .orElse(Store.NO_PRIORITY);<a name="line.8414"></a>
-<span class="sourceLineNo">8415</span>  }<a name="line.8415"></a>
-<span class="sourceLineNo">8416</span><a name="line.8416"></a>
-<span class="sourceLineNo">8417</span>  /** @return the coprocessor host */<a name="line.8417"></a>
-<span class="sourceLineNo">8418</span>  public RegionCoprocessorHost getCoprocessorHost() {<a name="line.8418"></a>
-<span class="sourceLineNo">8419</span>    return coprocessorHost;<a name="line.8419"></a>
+<span class="sourceLineNo">8392</span>    // Can't split a region that is closing.<a name="line.8392"></a>
+<span class="sourceLineNo">8393</span>    if (this.isClosing()) {<a name="line.8393"></a>
+<span class="sourceLineNo">8394</span>      return null;<a name="line.8394"></a>
+<span class="sourceLineNo">8395</span>    }<a name="line.8395"></a>
+<span class="sourceLineNo">8396</span><a name="line.8396"></a>
+<span class="sourceLineNo">8397</span>    if (!splitPolicy.shouldSplit()) {<a name="line.8397"></a>
+<span class="sourceLineNo">8398</span>      return null;<a name="line.8398"></a>
+<span class="sourceLineNo">8399</span>    }<a name="line.8399"></a>
+<span class="sourceLineNo">8400</span><a name="line.8400"></a>
+<span class="sourceLineNo">8401</span>    byte[] ret = splitPolicy.getSplitPoint();<a name="line.8401"></a>
+<span class="sourceLineNo">8402</span><a name="line.8402"></a>
+<span class="sourceLineNo">8403</span>    if (ret != null) {<a name="line.8403"></a>
+<span class="sourceLineNo">8404</span>      try {<a name="line.8404"></a>
+<span class="sourceLineNo">8405</span>        checkRow(ret, "calculated split");<a name="line.8405"></a>
+<span class="sourceLineNo">8406</span>      } catch (IOException e) {<a name="line.8406"></a>
+<span class="sourceLineNo">8407</span>        LOG.error("Ignoring invalid split", e);<a name="line.8407"></a>
+<span class="sourceLineNo">8408</span>        return null;<a name="line.8408"></a>
+<span class="sourceLineNo">8409</span>      }<a name="line.8409"></a>
+<span class="sourceLineNo">8410</span>    }<a name="line.8410"></a>
+<span class="sourceLineNo">8411</span>    return ret;<a name="line.8411"></a>
+<span class="sourceLineNo">8412</span>  }<a name="line.8412"></a>
+<span class="sourceLineNo">8413</span><a name="line.8413"></a>
+<span class="sourceLineNo">8414</span>  /**<a name="line.8414"></a>
+<span class="sourceLineNo">8415</span>   * @return The priority that this region should have in the compaction queue<a name="line.8415"></a>
+<span class="sourceLineNo">8416</span>   */<a name="line.8416"></a>
+<span class="sourceLineNo">8417</span>  public int getCompactPriority() {<a name="line.8417"></a>
+<span class="sourceLineNo">8418</span>    return stores.values().stream().mapToInt(HStore::getCompactPriority).min()<a name="line.8418"></a>
+<span class="sourceLineNo">8419</span>        .orElse(Store.NO_PRIORITY);<a name="line.8419"></a>
 <span class="sourceLineNo">8420</span>  }<a name="line.8420"></a>
 <span class="sourceLineNo">8421</span><a name="line.8421"></a>
-<span class="sourceLineNo">8422</span>  /** @param coprocessorHost the new coprocessor host */<a name="line.8422"></a>
-<span class="sourceLineNo">8423</span>  @VisibleForTesting<a name="line.8423"></a>
-<span class="sourceLineNo">8424</span>  public void setCoprocessorHost(final RegionCoprocessorHost coprocessorHost) {<a name="line.8424"></a>
-<span class="sourceLineNo">8425</span>    this.coprocessorHost = coprocessorHost;<a name="line.8425"></a>
-<span class="sourceLineNo">8426</span>  }<a name="line.8426"></a>
-<span class="sourceLineNo">8427</span><a name="line.8427"></a>
-<span class="sourceLineNo">8428</span>  @Override<a name="line.8428"></a>
-<span class="sourceLineNo">8429</span>  public void startRegionOperation() throws IOException {<a name="line.8429"></a>
-<span class="sourceLineNo">8430</span>    startRegionOperation(Operation.ANY);<a name="line.8430"></a>
+<span class="sourceLineNo">8422</span>  /** @return the coprocessor host */<a name="line.8422"></a>
+<span class="sourceLineNo">8423</span>  public RegionCoprocessorHost getCoprocessorHost() {<a name="line.8423"></a>
+<span class="sourceLineNo">8424</span>    return coprocessorHost;<a name="line.8424"></a>
+<span class="sourceLineNo">8425</span>  }<a name="line.8425"></a>
+<span class="sourceLineNo">8426</span><a name="line.8426"></a>
+<span class="sourceLineNo">8427</span>  /** @param coprocessorHost the new coprocessor host */<a name="line.8427"></a>
+<span class="sourceLineNo">8428</span>  @VisibleForTesting<a name="line.8428"></a>
+<span class="sourceLineNo">8429</span>  public void setCoprocessorHost(final RegionCoprocessorHost coprocessorHost) {<a name="line.8429"></a>
+<span class="sourceLineNo">8430</span>    this.coprocessorHost = coprocessorHost;<a name="line.8430"></a>
 <span class="sourceLineNo">8431</span>  }<a name="line.8431"></a>
 <span class="sourceLineNo">8432</span><a name="line.8432"></a>
 <span class="sourceLineNo">8433</span>  @Override<a name="line.8433"></a>
-<span class="sourceLineNo">8434</span>  public void startRegionOperation(Operation op) throws IOException {<a name="line.8434"></a>
-<span class="sourceLineNo">8435</span>    switch (op) {<a name="line.8435"></a>
-<span class="sourceLineNo">8436</span>      case GET:  // read operations<a name="line.8436"></a>
-<span class="sourceLineNo">8437</span>      case SCAN:<a name="line.8437"></a>
-<span class="sourceLineNo">8438</span>        checkReadsEnabled();<a name="line.8438"></a>
-<span class="sourceLineNo">8439</span>        break;<a name="line.8439"></a>
-<span class="sourceLineNo">8440</span>      default:<a name="line.8440"></a>
-<span class="sourceLineNo">8441</span>        break;<a name="line.8441"></a>
-<span class="sourceLineNo">8442</span>    }<a name="line.8442"></a>
-<span class="sourceLineNo">8443</span>    if (op == Operation.MERGE_REGION || op == Operation.SPLIT_REGION<a name="line.8443"></a>
-<span class="sourceLineNo">8444</span>        || op == Operation.COMPACT_REGION || op == Operation.COMPACT_SWITCH) {<a name="line.8444"></a>
-<span class="sourceLineNo">8445</span>      // split, merge or compact region doesn't need to check the closing/closed state or lock the<a name="line.8445"></a>
-<span class="sourceLineNo">8446</span>      // region<a name="line.8446"></a>
-<span class="sourceLineNo">8447</span>      return;<a name="line.8447"></a>
-<span class="sourceLineNo">8448</span>    }<a name="line.8448"></a>
-<span class="sourceLineNo">8449</span>    if (this.closing.get()) {<a name="line.8449"></a>
-<span class="sourceLineNo">8450</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closing");<a name="line.8450"></a>
-<span class="sourceLineNo">8451</span>    }<a name="line.8451"></a>
-<span class="sourceLineNo">8452</span>    lock(lock.readLock());<a name="line.8452"></a>
-<span class="sourceLineNo">8453</span>    if (this.closed.get()) {<a name="line.8453"></a>
-<span class="sourceLineNo">8454</span>      lock.readLock().unlock();<a name="line.8454"></a>
-<span class="sourceLineNo">8455</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closed");<a name="line.8455"></a>
+<span class="sourceLineNo">8434</span>  public void startRegionOperation() throws IOException {<a name="line.8434"></a>
+<span class="sourceLineNo">8435</span>    startRegionOperation(Operation.ANY);<a name="line.8435"></a>
+<span class="sourceLineNo">8436</span>  }<a name="line.8436"></a>
+<span class="sourceLineNo">8437</span><a name="line.8437"></a>
+<span class="sourceLineNo">8438</span>  @Override<a name="line.8438"></a>
+<span class="sourceLineNo">8439</span>  public void startRegionOperation(Operation op) throws IOException {<a name="line.8439"></a>
+<span class="sourceLineNo">8440</span>    switch (op) {<a name="line.8440"></a>
+<span class="sourceLineNo">8441</span>      case GET:  // read operations<a name="line.8441"></a>
+<span class="sourceLineNo">8442</span>      case SCAN:<a name="line.8442"></a>
+<span class="sourceLineNo">8443</span>        checkReadsEnabled();<a name="line.8443"></a>
+<span class="sourceLineNo">8444</span>        break;<a name="line.8444"></a>
+<span class="sourceLineNo">8445</span>      default:<a name="line.8445"></a>
+<span class="sourceLineNo">8446</span>        break;<a name="line.8446"></a>
+<span class="sourceLineNo">8447</span>    }<a name="line.8447"></a>
+<span class="sourceLineNo">8448</span>    if (op == Operation.MERGE_REGION || op == Operation.SPLIT_REGION<a name="line.8448"></a>
+<span class="sourceLineNo">8449</span>        || op == Operation.COMPACT_REGION || op == Operation.COMPACT_SWITCH) {<a name="line.8449"></a>
+<span class="sourceLineNo">8450</span>      // split, merge or compact region doesn't need to check the closing/closed state or lock the<a name="line.8450"></a>
+<span class="sourceLineNo">8451</span>      // region<a name="line.8451"></a>
+<span class="sourceLineNo">8452</span>      return;<a name="line.8452"></a>
+<span class="sourceLineNo">8453</span>    }<a name="line.8453"></a>
+<span class="sourceLineNo">8454</span>    if (this.closing.get()) {<a name="line.8454"></a>
+<span class="sourceLineNo">8455</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closing");<a name="line.8455"></a>
 <span class="sourceLineNo">8456</span>    }<a name="line.8456"></a>
-<span class="sourceLineNo">8457</span>    // The unit for snapshot is a region. So, all stores for this region must be<a name="line.8457"></a>
-<span class="sourceLineNo">8458</span>    // prepared for snapshot operation before proceeding.<a name="line.8458"></a>
-<span class="sourceLineNo">8459</span>    if (op == Operation.SNAPSHOT) {<a name="line.8459"></a>
-<span class="sourceLineNo">8460</span>      stores.values().forEach(HStore::preSnapshotOperation);<a name="line.8460"></a>
+<span class="sourceLineNo">8457</span>    lock(lock.readLock());<a name="line.8457"></a>
+<span class="sourceLineNo">8458</span>    if (this.closed.get()) {<a name="line.8458"></a>
+<span class="sourceLineNo">8459</span>      lock.readLock().unlock();<a name="line.8459"></a>
+<span class="sourceLineNo">8460</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closed");<a name="line.8460"></a>
 <span class="sourceLineNo">8461</span>    }<a name="line.8461"></a>
-<span class="sourceLineNo">8462</span>    try {<a name="line.8462"></a>
-<span class="sourceLineNo">8463</span>      if (coprocessorHost != null) {<a name="line.8463"></a>
-<span class="sourceLineNo">8464</span>        coprocessorHost.postStartRegionOperation(op);<a name="line.8464"></a>
-<span class="sourceLineNo">8465</span>      }<a name="line.8465"></a>
-<span class="sourceLineNo">8466</span>    } catch (Exception e) {<a name="line.8466"></a>
-<span class="sourceLineNo">8467</span>      lock.readLock().unlock();<a name="line.8467"></a>
-<span class="sourceLineNo">8468</span>      throw new IOException(e);<a name="line.8468"></a>
-<span class="sourceLineNo">8469</span>    }<a name="line.8469"></a>
-<span class="sourceLineNo">8470</span>  }<a name="line.8470"></a>
-<span class="sourceLineNo">8471</span><a name="line.8471"></a>
-<span class="sourceLineNo">8472</span>  @Override<a name="line.8472"></a>
-<span class="sourceLineNo">8473</span>  public void closeRegionOperation() throws IOException {<a name="line.8473"></a>
-<span class="sourceLineNo">8474</span>    closeRegionOperation(Operation.ANY);<a name="line.8474"></a>
+<span class="sourceLineNo">8462</span>    // The unit for snapshot is a region. So, all stores for this region must be<a name="line.8462"></a>
+<span class="sourceLineNo">8463</span>    // prepared for snapshot operation before proceeding.<a name="line.8463"></a>
+<span class="sourceLineNo">8464</span>    if (op == Operation.SNAPSHOT) {<a name="line.8464"></a>
+<span class="sourceLineNo">8465</span>      stores.values().forEach(HStore::preSnapshotOperation);<a name="line.8465"></a>
+<span class="sourceLineNo">8466</span>    }<a name="line.8466"></a>
+<span class="sourceLineNo">8467</span>    try {<a name="line.8467"></a>
+<span class="sourceLineNo">8468</span>      if (coprocessorHost != null) {<a name="line.8468"></a>
+<span class="sourceLineNo">8469</span>        coprocessorHost.postStartRegionOperation(op);<a name="line.8469"></a>
+<span class="sourceLineNo">8470</span>      }<a name="line.8470"></a>
+<span class="sourceLineNo">8471</span>    } catch (Exception e) {<a name="line.8471"></a>
+<span class="sourceLineNo">8472</span>      lock.readLock().unlock();<a name="line.8472"></a>
+<span class="sourceLineNo">8473</span>      throw new IOException(e);<a name="line.8473"></a>
+<span class="sourceLineNo">8474</span>    }<a name="line.8474"></a>
 <span class="sourceLineNo">8475</span>  }<a name="line.8475"></a>
 <span class="sourceLineNo">8476</span><a name="line.8476"></a>
 <span class="sourceLineNo">8477</span>  @Override<a name="line.8477"></a>
-<span class="sourceLineNo">8478</span>  public void closeRegionOperation(Operation operation) throws IOException {<a name="line.8478"></a>
-<span class="sourceLineNo">8479</span>    if (operation == Operation.SNAPSHOT) {<a name="line.8479"></a>
-<span class="sourceLineNo">8480</span>      stores.values().forEach(HStore::postSnapshotOperation);<a name="line.8480"></a>
-<span class="sourceLineNo">8481</span>    }<a name="line.8481"></a>
-<span class="sourceLineNo">8482</span>    lock.readLock().unlock();<a name="line.8482"></a>
-<span class="sourceLineNo">8483</span>    if (coprocessorHost != null) {<a name="line.8483"></a>
-<span class="sourceLineNo">8484</span>      coprocessorHost.postCloseRegionOperation(operation);<a name="line.8484"></a>
-<span class="sourceLineNo">8485</span>    }<a name="line.8485"></a>
-<span class="sourceLineNo">8486</span>  }<a name="line.8486"></a>
-<span class="sourceLineNo">8487</span><a name="line.8487"></a>
-<span class="sourceLineNo">8488</span>  /**<a name="line.8488"></a>
-<span class="sourceLineNo">8489</span>   * This method needs to be called before any public call that reads or<a name="line.8489"></a>
-<span class="sourceLineNo">8490</span>   * modifies stores in bulk. It has to be called just before a try.<a name="line.8490"></a>
-<span class="sourceLineNo">8491</span>   * #closeBulkRegionOperation needs to be called in the try's finally block<a name="line.8491"></a>
-<span class="sourceLineNo">8492</span>   * Acquires a writelock and checks if the region is closing or closed.<a name="line.8492"></a>
-<span class="sourceLineNo">8493</span>   * @throws NotServingRegionException when the region is closing or closed<a name="line.8493"></a>
-<span class="sourceLineNo">8494</span>   * @throws RegionTooBusyException if failed to get the lock in time<a name="line.8494"></a>
-<span class="sourceLineNo">8495</span>   * @throws InterruptedIOException if interrupted while waiting for a lock<a name="line.8495"></a>
-<span class="sourceLineNo">8496</span>   */<a name="line.8496"></a>
-<span class="sourceLineNo">8497</span>  private void startBulkRegionOperation(boolean writeLockNeeded)<a name="line.8497"></a>
-<span class="sourceLineNo">8498</span>      throws NotServingRegionException, RegionTooBusyException, InterruptedIOException {<a name="line.8498"></a>
-<span class="sourceLineNo">8499</span>    if (this.closing.get()) {<a name="line.8499"></a>
-<span class="sourceLineNo">8500</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closing");<a name="line.8500"></a>
-<span class="sourceLineNo">8501</span>    }<a name="line.8501"></a>
-<span class="sourceLineNo">8502</span>    if (writeLockNeeded) lock(lock.writeLock());<a name="line.8502"></a>
-<span class="sourceLineNo">8503</span>    else lock(lock.readLock());<a name="line.8503"></a>
-<span class="sourceLineNo">8504</span>    if (this.closed.get()) {<a name="line.8504"></a>
-<span class="sourceLineNo">8505</span>      if (writeLockNeeded) lock.writeLock().unlock();<a name="line.8505"></a>
-<span class="sourceLineNo">8506</span>      else lock.readLock().unlock();<a name="line.8506"></a>
-<span class="sourceLineNo">8507</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closed");<a name="line.8507"></a>
-<span class="sourceLineNo">8508</span>    }<a name="line.8508"></a>
-<span class="sourceLineNo">8509</span>  }<a name="line.8509"></a>
-<span class="sourceLineNo">8510</span><a name="line.8510"></a>
-<span class="sourceLineNo">8511</span>  /**<a name="line.8511"></a>
-<span class="sourceLineNo">8512</span>   * Closes the lock. This needs to be called in the finally block corresponding<a name="line.8512"></a>
-<span class="sourceLineNo">8513</span>   * to the try block of #startRegionOperation<a name="line.8513"></a>
-<span class="sourceLineNo">8514</span>   */<a name="line.8514"></a>
-<span class="sourceLineNo">8515</span>  private void closeBulkRegionOperation(){<a name="line.8515"></a>
-<span class="sourceLineNo">8516</span>    if (lock.writeLock().isHeldByCurrentThread()) lock.writeLock().unlock();<a name="line.8516"></a>
-<span class="sourceLineNo">8517</span>    else lock.readLock().unlock();<a name="line.8517"></a>
-<span class="sourceLineNo">8518</span>  }<a name="line.8518"></a>
-<span class="sourceLineNo">8519</span><a name="line.8519"></a>
-<span class="sourceLineNo">8520</span>  /**<a name="line.8520"></a>
-<span class="sourceLineNo">8521</span>   * Update LongAdders for number of puts without wal and the size of possible data loss.<a name="line.8521"></a>
-<span class="sourceLineNo">8522</span>   * These information are exposed by the region server metrics.<a name="line.8522"></a>
-<span class="sourceLineNo">8523</span>   */<a name="line.8523"></a>
-<span class="sourceLineNo">8524</span>  private void recordMutationWithoutWal(final Map&lt;byte [], List&lt;Cell&gt;&gt; familyMap) {<a name="line.8524"></a>
-<span class="sourceLineNo">8525</span>    numMutationsWithoutWAL.increment();<a name="line.8525"></a>
-<span class="sourceLineNo">8526</span>    if (numMutationsWithoutWAL.sum() &lt;= 1) {<a name="line.8526"></a>
-<span class="sourceLineNo">8527</span>      LOG.info("writing data to region " + this +<a name="line.8527"></a>
-<span class="sourceLineNo">8528</span>               " with WAL disabled. Data may be lost in the event of a crash.");<a name="line.8528"></a>
-<span class="sourceLineNo">8529</span>    }<a name="line.8529"></a>
-<span class="sourceLineNo">8530</span><a name="line.8530"></a>
-<span class="sourceLineNo">8531</span>    long mutationSize = 0;<a name="line.8531"></a>
-<span class="sourceLineNo">8532</span>    for (List&lt;Cell&gt; cells: familyMap.values()) {<a name="line.8532"></a>
-<span class="sourceLineNo">8533</span>      // Optimization: 'foreach' loop is not used. See:<a name="line.8533"></a>
-<span class="sourceLineNo">8534</span>      // HBASE-12023 HRegion.applyFamilyMapToMemstore creates too many iterator objects<a name="line.8534"></a>
-<span class="sourceLineNo">8535</span>      assert cells instanceof RandomAccess;<a name="line.8535"></a>
-<span class="sourceLineNo">8536</span>      int listSize = cells.size();<a name="line.8536"></a>
-<span class="sourceLineNo">8537</span>      for (int i=0; i &lt; listSize; i++) {<a name="line.8537"></a>
-<span class="sourceLineNo">8538</span>        Cell cell = cells.get(i);<a name="line.8538"></a>
-<span class="sourceLineNo">8539</span>        mutationSize += cell.getSerializedSize();<a name="line.8539"></a>
-<span class="sourceLineNo">8540</span>      }<a name="line.8540"></a>
-<span class="sourceLineNo">8541</span>    }<a name="line.8541"></a>
-<span class="sourceLineNo">8542</span><a name="line.8542"></a>
-<span class="sourceLineNo">8543</span>    dataInMemoryWithoutWAL.add(mutationSize);<a name="line.8543"></a>
-<span class="sourceLineNo">8544</span>  }<a name="line.8544"></a>
-<span class="sourceLineNo">8545</span><a name="line.8545"></a>
-<span class="sourceLineNo">8546</span>  private void lock(final Lock lock) throws RegionTooBusyException, InterruptedIOException {<a name="line.8546"></a>
-<span class="sourceLineNo">8547</span>    lock(lock, 1);<a name="line.8547"></a>
-<span class="sourceLineNo">8548</span>  }<a name="line.8548"></a>
-<span class="sourceLineNo">8549</span><a name="line.8549"></a>
-<span class="sourceLineNo">8550</span>  /**<a name="line.8550"></a>
-<span class="sourceLineNo">8551</span>   * Try to acquire a lock.  Throw RegionTooBusyException<a name="line.8551"></a>
-<span class="sourceLineNo">8552</span>   * if failed to get the lock in time. Throw InterruptedIOException<a name="line.8552"></a>
-<span class="sourceLineNo">8553</span>   * if interrupted while waiting for the lock.<a name="line.8553"></a>
-<span class="sourceLineNo">8554</span>   */<a name="line.8554"></a>
-<span class="sourceLineNo">8555</span>  private void lock(final Lock lock, final int multiplier)<a name="line.8555"></a>
-<span class="sourceLineNo">8556</span>      throws RegionTooBusyException, InterruptedIOException {<a name="line.8556"></a>
-<span class="sourceLineNo">8557</span>    try {<a name="line.8557"></a>
-<span class="sourceLineNo">8558</span>      final long waitTime = Math.min(maxBusyWaitDuration,<a name="line.8558"></a>
-<span class="sourceLineNo">8559</span>          busyWaitDuration * Math.min(multiplier, maxBusyWaitMultiplier));<a name="line.8559"></a>
-<span class="sourceLineNo">8560</span>      if (!lock.tryLock(waitTime, TimeUnit.MILLISECONDS)) {<a name="line.8560"></a>
-<span class="sourceLineNo">8561</span>        // Don't print millis. Message is used as a key over in<a name="line.8561"></a>
-<span class="sourceLineNo">8562</span>        // RetriesExhaustedWithDetailsException processing.<a name="line.8562"></a>
-<span class="sourceLineNo">8563</span>        throw new RegionTooBusyException("Failed to obtain lock; regionName=" +<a name="line.8563"></a>
-<span class="sourceLineNo">8564</span>            (this.getRegionInfo() == null? "unknown":<a name="line.8564"></a>
-<span class="sourceLineNo">8565</span>                this.getRegionInfo().getRegionNameAsString()) +<a name="line.8565"></a>
-<span class="sourceLineNo">8566</span>            ", server=" + (this.getRegionServerServices() == null? "unknown":<a name="line.8566"></a>
-<span class="sourceLineNo">8567</span>                this.getRegionServerServices().getServerName()));<a name="line.8567"></a>
-<span class="sourceLineNo">8568</span>      }<a name="line.8568"></a>
-<span class="sourceLineNo">8569</span>    } catch (InterruptedException ie) {<a name="line.8569"></a>
-<span class="sourceLineNo">8570</span>      LOG.info("Interrupted while waiting for a lock");<a name="line.8570"></a>
-<span class="sourceLineNo">8571</span>      InterruptedIOException iie = new InterruptedIOException();<a name="line.8571"></a>
-<span class="sourceLineNo">8572</span>      iie.initCause(ie);<a name="line.8572"></a>
-<span class="sourceLineNo">8573</span>      throw iie;<a name="line.8573"></a>
-<span class="sourceLineNo">8574</span>    }<a name="line.8574"></a>
-<span class="sourceLineNo">8575</span>  }<a name="line.8575"></a>
-<span class="sourceLineNo">8576</span><a name="line.8576"></a>
-<span class="sourceLineNo">8577</span>  /**<a name="line.8577"></a>
-<span class="sourceLineNo">8578</span>   * Calls sync with the given transaction ID<a name="line.8578"></a>
-<span class="sourceLineNo">8579</span>   * @param txid should sync up to which transaction<a name="line.8579"></a>
-<span class="sourceLineNo">8580</span>   * @throws IOException If anything goes wrong with DFS<a name="line.8580"></a>
-<span class="sourceLineNo">8581</span>   */<a name="line.8581"></a>
-<span class="sourceLineNo">8582</span>  private void sync(long txid, Durability durability) throws IOException {<a name="line.8582"></a>
-<span class="sourceLineNo">8583</span>    if (this.getRegionInfo().isMetaRegion()) {<a name="line.8583"></a>
-<span class="sourceLineNo">8584</span>      this.wal.sync(txid);<a name="line.8584"></a>
-<span class="sourceLineNo">8585</span>    } else {<a name="line.8585"></a>
-<span class="sourceLineNo">8586</span>      switch(durability) {<a name="line.8586"></a>
-<span class="sourceLineNo">8587</span>      case USE_DEFAULT:<a name="line.8587"></a>
-<span class="sourceLineNo">8588</span>        // do what table defaults to<a name="line.8588"></a>
-<span class="sourceLineNo">8589</span>        if (shouldSyncWAL()) {<a name="line.8589"></a>
-<span class="sourceLineNo">8590</span>          this.wal.sync(txid);<a name="line.8590"></a>
-<span class="sourceLineNo">8591</span>        }<a name="line.8591"></a>
-<span class="sourceLineNo">8592</span>        break;<a name="line.8592"></a>
-<span class="sourceLineNo">8593</span>      case SKIP_WAL:<a name="line.8593"></a>
-<span class="sourceLineNo">8594</span>        // nothing do to<a name="line.8594"></a>
-<span class="sourceLineNo">8595</span>        break;<a name="line.8595"></a>
-<span class="sourceLineNo">8596</span>      case ASYNC_WAL:<a name="line.8596"></a>
-<span class="sourceLineNo">8597</span>        // nothing do to<a name="line.8597"></a>
-<span class="sourceLineNo">8598</span>        break;<a name="line.8598"></a>
-<span class="sourceLineNo">8599</span>      case SYNC_WAL:<a name="line.8599"></a>
-<span class="sourceLineNo">8600</span>          this.wal.sync(txid, false);<a name="line.8600"></a>
-<span class="sourceLineNo">8601</span>          break;<a name="line.8601"></a>
-<span class="sourceLineNo">8602</span>      case FSYNC_WAL:<a name="line.8602"></a>
-<span class="sourceLineNo">8603</span>          this.wal.sync(txid, true);<a name="line.8603"></a>
-<span class="sourceLineNo">8604</span>          break;<a name="line.8604"></a>
-<span class="sourceLineNo">8605</span>      default:<a name="line.8605"></a>
-<span class="sourceLineNo">8606</span>        throw new RuntimeException("Unknown durability " + durability);<a name="line.8606"></a>
-<span class="sourceLineNo">8607</span>      }<a name="line.8607"></a>
-<span class="sourceLineNo">8608</span>    }<a name="line.8608"></a>
-<span class="sourceLineNo">8609</span>  }<a name="line.8609"></a>
-<span class="sourceLineNo">8610</span><a name="line.8610"></a>
-<span class="sourceLineNo">8611</span>  /**<a name="line.8611"></a>
-<span class="sourceLineNo">8612</span>   * Check whether we should sync the wal from the table's durability settings<a name="line.8612"></a>
-<span class="sourceLineNo">8613</span>   */<a name="line.8613"></a>
-<span class="sourceLineNo">8614</span>  private boolean shouldSyncWAL() {<a name="line.8614"></a>
-<span class="sourceLineNo">8615</span>    return regionDurability.ordinal() &gt;  Durability.ASYNC_WAL.ordinal();<a name="line.8615"></a>
-<span class="sourceLineNo">8616</span>  }<a name="line.8616"></a>
-<span class="sourceLineNo">8617</span><a name="line.8617"></a>
-<span class="sourceLineNo">8618</span>  /**<a name="line.8618"></a>
-<span class="sourceLineNo">8619</span>   * A mocked list implementation - discards all updates.<a name="line.8619"></a>
-<span class="sourceLineNo">8620</span>   */<a name="line.8620"></a>
-<span class="sourceLineNo">8621</span>  private static final List&lt;Cell&gt; MOCKED_LIST = new AbstractList&lt;Cell&gt;() {<a name="line.8621"></a>
+<span class="sourceLineNo">8478</span>  public void closeRegionOperation() throws IOException {<a name="line.8478"></a>
+<span class="sourceLineNo">8479</span>    closeRegionOperation(Operation.ANY);<a name="line.8479"></a>
+<span class="sourceLineNo">8480</span>  }<a name="line.8480"></a>
+<span class="sourceLineNo">8481</span><a name="line.8481"></a>
+<span class="sourceLineNo">8482</span>  @Override<a name="line.8482"></a>
+<span class="sourceLineNo">8483</span>  public void closeRegionOperation(Operation operation) throws IOException {<a name="line.8483"></a>
+<span class="sourceLineNo">8484</span>    if (operation == Operation.SNAPSHOT) {<a name="line.8484"></a>
+<span class="sourceLineNo">8485</span>      stores.values().forEach(HStore::postSnapshotOperation);<a name="line.8485"></a>
+<span class="sourceLineNo">8486</span>    }<a name="line.8486"></a>
+<span class="sourceLineNo">8487</span>    lock.readLock().unlock();<a name="line.8487"></a>
+<span class="sourceLineNo">8488</span>    if (coprocessorHost != null) {<a name="line.8488"></a>
+<span class="sourceLineNo">8489</span>      coprocessorHost.postCloseRegionOperation(operation);<a name="line.8489"></a>
+<span class="sourceLineNo">8490</span>    }<a name="line.8490"></a>
+<span class="sourceLineNo">8491</span>  }<a name="line.8491"></a>
+<span class="sourceLineNo">8492</span><a name="line.8492"></a>
+<span class="sourceLineNo">8493</span>  /**<a name="line.8493"></a>
+<span class="sourceLineNo">8494</span>   * This method needs to be called before any public call that reads or<a name="line.8494"></a>
+<span class="sourceLineNo">8495</span>   * modifies stores in bulk. It has to be called just before a try.<a name="line.8495"></a>
+<span class="sourceLineNo">8496</span>   * #closeBulkRegionOperation needs to be called in the try's finally block<a name="line.8496"></a>
+<span class="sourceLineNo">8497</span>   * Acquires a writelock and checks if the region is closing or closed.<a name="line.8497"></a>
+<span class="sourceLineNo">8498</span>   * @throws NotServingRegionException when the region is closing or closed<a name="line.8498"></a>
+<span class="sourceLineNo">8499</span>   * @throws RegionTooBusyException if failed to get the lock in time<a name="line.8499"></a>
+<span class="sourceLineNo">8500</span>   * @throws InterruptedIOException if interrupted while waiting for a lock<a name="line.8500"></a>
+<span class="sourceLineNo">8501</span>   */<a name="line.8501"></a>
+<span class="sourceLineNo">8502</span>  private void startBulkRegionOperation(boolean writeLockNeeded)<a name="line.8502"></a>
+<span class="sourceLineNo">8503</span>      throws NotServingRegionException, RegionTooBusyException, InterruptedIOException {<a name="line.8503"></a>
+<span class="sourceLineNo">8504</span>    if (this.closing.get()) {<a name="line.8504"></a>
+<span class="sourceLineNo">8505</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closing");<a name="line.8505"></a>
+<span class="sourceLineNo">8506</span>    }<a name="line.8506"></a>
+<span class="sourceLineNo">8507</span>    if (writeLockNeeded) lock(lock.writeLock());<a name="line.8507"></a>
+<span class="sourceLineNo">8508</span>    else lock(lock.readLock());<a name="line.8508"></a>
+<span class="sourceLineNo">8509</span>    if (this.closed.get()) {<a name="line.8509"></a>
+<span class="sourceLineNo">8510</span>      if (writeLockNeeded) lock.writeLock().unlock();<a name="line.8510"></a>
+<span class="sourceLineNo">8511</span>      else lock.readLock().unlock();<a name="line.8511"></a>
+<span class="sourceLineNo">8512</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closed");<a name="line.8512"></a>
+<span class="sourceLineNo">8513</span>    }<a name="line.8513"></a>
+<span class="sourceLineNo">8514</span>  }<a name="line.8514"></a>
+<span class="sourceLineNo">8515</span><a name="line.8515"></a>
+<span class="sourceLineNo">8516</span>  /**<a name="line.8516"></a>
+<span class="sourceLineNo">8517</span>   * Closes the lock. This needs to be called in the finally block corresponding<a name="line.8517"></a>
+<span class="sourceLineNo">8518</span>   * to the try block of #startRegionOperation<a name="line.8518"></a>
+<span class="sourceLineNo">8519</span>   */<a name="line.8519"></a>
+<span class="sourceLineNo">8520</span>  private void closeBulkRegionOperation(){<a name="line.8520"></a>
+<span class="sourceLineNo">8521</span>    if (lock.writeLock().isHeldByCurrentThread()) lock.writeLock().unlock();<a name="line.8521"></a>
+<span class="sourceLineNo">8522</span>    else lock.readLock().unlock();<a name="line.8522"></a>
+<span class="sourceLineNo">8523</span>  }<a name="line.8523"></a>
+<span class="sourceLineNo">8524</span><a name="line.8524"></a>
+<span class="sourceLineNo">8525</span>  /**<a name="line.8525"></a>
+<span class="sourceLineNo">8526</span>   * Update LongAdders for number of puts without wal and the size of possible data loss.<a name="line.8526"></a>
+<span class="sourceLineNo">8527</span>   * These information are exposed by the region server metrics.<a name="line.8527"></a>
+<span class="sourceLineNo">8528</span>   */<a name="line.8528"></a>
+<span class="sourceLineNo">8529</span>  private void recordMutationWithoutWal(final Map&lt;byte [], List&lt;Cell&gt;&gt; familyMap) {<a name="line.8529"></a>
+<span class="sourceLineNo">8530</span>    numMutationsWithoutWAL.increment();<a name="line.8530"></a>
+<span class="sourceLineNo">8531</span>    if (numMutationsWithoutWAL.sum() &lt;= 1) {<a name="line.8531"></a>
+<span class="sourceLineNo">8532</span>      LOG.info("writing data to region " + this +<a name="line.8532"></a>
+<span class="sourceLineNo">8533</span>               " with WAL disabled. Data may be lost in the event of a crash.");<a name="line.8533"></a>
+<span class="sourceLineNo">8534</span>    }<a name="line.8534"></a>
+<span class="sourceLineNo">8535</span><a name="line.8535"></a>
+<span class="sourceLineNo">8536</span>    long mutationSize = 0;<a name="line.8536"></a>
+<span class="sourceLineNo">8537</span>    for (List&lt;Cell&gt; cells: familyMap.values()) {<a name="line.8537"></a>
+<span class="sourceLineNo">8538</span>      // Optimization: 'foreach' loop is not used. See:<a name="line.8538"></a>
+<span class="sourceLineNo">8539</span>      // HBASE-12023 HRegion.applyFamilyMapToMemstore creates too many iterator objects<a name="line.8539"></a>
+<span class="sourceLineNo">8540</span>      assert cells instanceof RandomAccess;<a name="line.8540"></a>
+<span class="sourceLineNo">8541</span>      int listSize = cells.size();<a name="line.8541"></a>
+<span class="sourceLineNo">8542</span>      for (int i=0; i &lt; listSize; i++) {<a name="line.8542"></a>
+<span class="sourceLineNo">8543</span>        Cell cell = cells.get(i);<a name="line.8543"></a>
+<span class="sourceLineNo">8544</span>        mutationSize += cell.getSerializedSize();<a name="line.8544"></a>
+<span class="sourceLineNo">8545</span>      }<a name="line.8545"></a>
+<span class="sourceLineNo">8546</span>    }<a name="line.8546"></a>
+<span class="sourceLineNo">8547</span><a name="line.8547"></a>
+<span class="sourceLineNo">8548</span>    dataInMemoryWithoutWAL.add(mutationSize);<a name="line.8548"></a>
+<span class="sourceLineNo">8549</span>  }<a name="line.8549"></a>
+<span class="sourceLineNo">8550</span><a name="line.8550"></a>
+<span class="sourceLineNo">8551</span>  private void lock(final Lock lock) throws RegionTooBusyException, InterruptedIOException {<a name="line.8551"></a>
+<span class="sourceLineNo">8552</span>    lock(lock, 1);<a name="line.8552"></a>
+<span class="sourceLineNo">8553</span>  }<a name="line.8553"></a>
+<span class="sourceLineNo">8554</span><a name="line.8554"></a>
+<span class="sourceLineNo">8555</span>  /**<a name="line.8555"></a>
+<span class="sourceLineNo">8556</span>   * Try to acquire a lock.  Throw RegionTooBusyException<a name="line.8556"></a>
+<span class="sourceLineNo">8557</span>   * if failed to get the lock in time. Throw InterruptedIOException<a name="line.8557"></a>
+<span class="sourceLineNo">8558</span>   * if interrupted while waiting for the lock.<a name="line.8558"></a>
+<span class="sourceLineNo">8559</span>   */<a name="line.8559"></a>
+<span class="sourceLineNo">8560</span>  private void lock(final Lock lock, final int multiplier)<a name="line.8560"></a>
+<span class="sourceLineNo">8561</span>      throws RegionTooBusyException, InterruptedIOException {<a name="line.8561"></a>
+<span class="sourceLineNo">8562</span>    try {<a name="line.8562"></a>
+<span class="sourceLineNo">8563</span>      final long waitTime = Math.min(maxBusyWaitDuration,<a name="line.8563"></a>
+<span class="sourceLineNo">8564</span>          busyWaitDuration * Math.min(multiplier, maxBusyWaitMultiplier));<a name="line.8564"></a>
+<span class="sourceLineNo">8565</span>      if (!lock.tryLock(waitTime, TimeUnit.MILLISECONDS)) {<a name="line.8565"></a>
+<span class="sourceLineNo">8566</span>        // Don't print millis. Message is used as a key over in<a name="line.8566"></a>
+<span class="sourceLineNo">8567</span>        // RetriesExhaustedWithDetailsException processing.<a name="line.8567"></a>
+<span class="sourceLineNo">8568</span>        throw new RegionTooBusyException("Failed to obtain lock; regionName=" +<a name="line.8568"></a>
+<span class="sourceLineNo">8569</span>            (this.getRegionInfo() == null? "unknown":<a name="line.8569"></a>
+<span class="sourceLineNo">8570</span>                this.getRegionInfo().getRegionNameAsString()) +<a name="line.8570"></a>
+<span class="sourceLineNo">8571</span>            ", server=" + (this.getRegionServerServices() == null? "unknown":<a name="line.8571"></a>
+<span class="sourceLineNo">8572</span>                this.getRegionServerServices().getServerName()));<a name="line.8572"></a>
+<span class="sourceLineNo">8573</span>      }<a name="line.8573"></a>
+<span class="sourceLineNo">8574</span>    } catch (InterruptedException ie) {<a name="line.8574"></a>
+<span class="sourceLineNo">8575</span>      LOG.info("Interrupted while waiting for a lock");<a name="line.8575"></a>
+<span class="sourceLineNo">8576</span>      InterruptedIOException iie = new InterruptedIOException();<a name="line.8576"></a>
+<span class="sourceLineNo">8577</span>      iie.initCause(ie);<a name="line.8577"></a>
+<span class="sourceLineNo">8578</span>      throw iie;<a name="line.8578"></a>
+<span class="sourceLineNo">8579</span>    }<a name="line.8579"></a>
+<span class="sourceLineNo">8580</span>  }<a name="line.8580"></a>
+<span class="sourceLineNo">8581</span><a name="line.8581"></a>
+<span class="sourceLineNo">8582</span>  /**<a name="line.8582"></a>
+<span class="sourceLineNo">8583</span>   * Calls sync with the given transaction ID<a name="line.8583"></a>
+<span class="sourceLineNo">8584</span>   * @param txid should sync up to which transaction<a name="line.8584"></a>
+<span class="sourceLineNo">8585</span>   * @throws IOException If anything goes wrong with DFS<a name="line.8585"></a>
+<span class="sourceLineNo">8586</span>   */<a name="line.8586"></a>
+<span class="sourceLineNo">8587</span>  private void sync(long txid, Durability durability) throws IOException {<a name="line.8587"></a>
+<span class="sourceLineNo">8588</span>    if (this.getRegionInfo().isMetaRegion()) {<a name="line.8588"></a>
+<span class="sourceLineNo">8589</span>      this.wal.sync(txid);<a name="line.8589"></a>
+<span class="sourceLineNo">8590</span>    } else {<a name="line.8590"></a>
+<span class="sourceLineNo">8591</span>      switch(durability) {<a name="line.8591"></a>
+<span class="sourceLineNo">8592</span>      case USE_DEFAULT:<a name="line.8592"></a>
+<span class="sourceLineNo">8593</span>        // do what table defaults to<a name="line.8593"></a>
+<span class="sourceLineNo">8594</span>        if (shouldSyncWAL()) {<a name="line.8594"></a>
+<span class="sourceLineNo">8595</span>          this.wal.sync(txid);<a name="line.8595"></a>
+<span class="sourceLineNo">8596</span>        }<a name="line.8596"></a>
+<span class="sourceLineNo">8597</span>        break;<a name="line.8597"></a>
+<span class="sourceLineNo">8598</span>      case SKIP_WAL:<a name="line.8598"></a>
+<span class="sourceLineNo">8599</span>        // nothing do to<a name="line.8599"></a>
+<span class="sourceLineNo">8600</span>        break;<a name="line.8600"></a>
+<span class="sourceLineNo">8601</span>      case ASYNC_WAL:<a name="line.8601"></a>
+<span class="sourceLineNo">8602</span>        // nothing do to<a name="line.8602"></a>
+<span class="sourceLineNo">8603</span>        break;<a name="line.8603"></a>
+<span class="sourceLineNo">8604</span>      case SYNC_WAL:<a name="line.8604"></a>
+<span class="sourceLineNo">8605</span>          this.wal.sync(txid, false);<a name="line.8605"></a>
+<span class="sourceLineNo">8606</span>          break;<a name="line.8606"></a>
+<span class="sourceLineNo">8607</span>      case FSYNC_WAL:<a name="line.8607"></a>
+<span class="sourceLineNo">8608</span>          this.wal.sync(txid, true);<a name="line.8608"></a>
+<span class="sourceLineNo">8609</span>          break;<a name="line.8609"></a>
+<span class="sourceLineNo">8610</span>      default:<a name="line.8610"></a>
+<span class="sourceLineNo">8611</span>        throw new RuntimeException("Unknown durability " + durability);<a name="line.8611"></a>
+<span class="sourceLineNo">8612</span>      }<a name="line.8612"></a>
+<span class="sourceLineNo">8613</span>    }<a name="line.8613"></a>
+<span class="sourceLineNo">8614</span>  }<a name="line.8614"></a>
+<span class="sourceLineNo">8615</span><a name="line.8615"></a>
+<span class="sourceLineNo">8616</span>  /**<a name="line.8616"></a>
+<span class="sourceLineNo">8617</span>   * Check whether we should sync the wal from the table's durability settings<a name="line.8617"></a>
+<span class="sourceLineNo">8618</span>   */<a name="line.8618"></a>
+<span class="sourceLineNo">8619</span>  private boolean shouldSyncWAL() {<a name="line.8619"></a>
+<span class="sourceLineNo">8620</span>    return regionDurability.ordinal() &gt;  Durability.ASYNC_WAL.ordinal();<a name="line.8620"></a>
+<span class="sourceLineNo">8621</span>  }<a name="line.8621"></a>
 <span class="sourceLineNo">8622</span><a name="line.8622"></a>
-<span class="sourceLineNo">8623</span>    @Override<a name="line.8623"></a>
-<span class="sourceLineNo">8624</span>    public void add(int index, Cell element) {<a name="line.8624"></a>
-<span class="sourceLineNo">8625</span>      // do nothing<a name="line.8625"></a>
-<span class="sourceLineNo">8626</span>    }<a name="line.8626"></a>
+<span class="sourceLineNo">8623</span>  /**<a name="line.8623"></a>
+<span class="sourceLineNo">8624</span>   * A mocked list implementation - discards all updates.<a name="line.8624"></a>
+<span class="sourceLineNo">8625</span>   */<a name="line.8625"></a>
+<span class="sourceLineNo">8626</span>  private static final List&lt;Cell&gt; MOCKED_LIST = new AbstractList&lt;Cell&gt;() {<a name="line.8626"></a>
 <span class="sourceLineNo">8627</span><a name="line.8627"></a>
 <span class="sourceLineNo">8628</span>    @Override<a name="line.8628"></a>
-<span class="sourceLineNo">8629</span>    public boolean addAll(int index, Collection&lt;? extends Cell&gt; c) {<a name="line.8629"></a>
-<span class="sourceLineNo">8630</span>      return false; // this list is never changed as a result of an update<a name="line.8630"></a>
+<span class="sourceLineNo">8629</span>    public void add(int index, Cell element) {<a name="line.8629"></a>
+<span class="sourceLineNo">8630</span>      // do nothing<a name="line.8630"></a>
 <span class="sourceLineNo">8631</span>    }<a name="line.8631"></a>
 <span class="sourceLineNo">8632</span><a name="line.8632"></a>
 <span class="sourceLineNo">8633</span>    @Override<a name="line.8633"></a>
-<span class="sourceLineNo">8634</span>    public KeyValue get(int index) {<a name="line.8634"></a>
-<span class="sourceLineNo">8635</span>      throw new UnsupportedOperationException();<a name="line.8635"></a>
+<span class="sourceLineNo">8634</span>    public boolean addAll(int index, Collection&lt;? extends Cell&gt; c) {<a name="line.8634"></a>
+<span class="sourceLineNo">8635</span>      return false; // this list is never changed as a result of an update<a name="line.8635"></a>
 <span class="sourceLineNo">8636</span>    }<a name="line.8636"></a>
 <span class="sourceLineNo">8637</span><a name="line.8637"></a>
 <span class="sourceLineNo">8638</span>    @Override<a name="line.8638"></a>
-<span class="sourceLineNo">8639</span>    public int size() {<a name="line.8639"></a>
-<span class="sourceLineNo">8640</span>      return 0;<a name="line.8640"></a>
+<span class="sourceLineNo">8639</span>    public KeyValue get(int index) {<a name="line.8639"></a>
+<span class="sourceLineNo">8640</span>      throw new UnsupportedOperationException();<a name="line.8640"></a>
 <span class="sourceLineNo">8641</span>    }<a name="line.8641"></a>
-<span class="sourceLineNo">8642</span>  };<a name="line.8642"></a>
-<span class="sourceLineNo">8643</span><a name="line.8643"></a>
-<span class="sourceLineNo">8644</span>  /** @return the latest sequence number that was read from storage when this region was opened */<a name="line.8644"></a>
-<span class="sourceLineNo">8645</span>  public long getOpenSeqNum() {<a name="line.8645"></a>
-<span class="sourceLineNo">8646</span>    return this.openSeqNum;<a name="line.8646"></a>
-<span class="sourceLineNo">8647</span>  }<a name="line.8647"></a>
+<span class="sourceLineNo">8642</span><a name="line.8642"></a>
+<span class="sourceLineNo">8643</span>    @Override<a name="line.8643"></a>
+<span class="sourceLineNo">8644</span>    public int size() {<a name="line.8644"></a>
+<span class="sourceLineNo">8645</span>      return 0;<a name="line.8645"></a>
+<span class="sourceLineNo">8646</span>    }<a name="line.8646"></a>
+<span class="sourceLineNo">8647</span>  };<a name="line.8647"></a>
 <span class="sourceLineNo">8648</span><a name="line.8648"></a>
-<span class="sourceLineNo">8649</span>  @Override<a name="line.8649"></a>
-<span class="sourceLineNo">8650</span>  public Map&lt;byte[], Long&gt; getMaxStoreSeqId() {<a name="line.8650"></a>
-<span class="sourceLineNo">8651</span>    return this.maxSeqIdInStores;<a name="line.8651"></a>
+<span class="sourceLineNo">8649</span>  /** @return the latest sequence number that was read from storage when this region was opened */<a name="line.8649"></a>
+<span class="sourceLineNo">8650</span>  public long getOpenSeqNum() {<a name="line.8650"></a>
+<span class="sourceLineNo">8651</span>    return this.openSeqNum;<a name="line.8651"></a>
 <span class="sourceLineNo">8652</span>  }<a name="line.8652"></a>
 <span class="sourceLineNo">8653</span><a name="line.8653"></a>
-<span class="sourceLineNo">8654</span>  public long getOldestSeqIdOfStore(byte[] familyName) {<a name="line.8654"></a>
-<span class="sourceLineNo">8655</span>    return wal.getEarliestMemStoreSeqNum(getRegionInfo().getEncodedNameAsBytes(), familyName);<a name="line.8655"></a>
-<span class="sourceLineNo">8656</span>  }<a name="line.8656"></a>
-<span class="sourceLineNo">8657</span><a name="line.8657"></a>
-<span class="sourceLineNo">8658</span>  @Override<a name="line.8658"></a>
-<span class="sourceLineNo">8659</span>  public CompactionState getCompactionState() {<a name="line.8659"></a>
-<span class="sourceLineNo">8660</span>    boolean hasMajor = majorInProgress.get() &gt; 0, hasMinor = minorInProgress.get() &gt; 0;<a name="line.8660"></a>
-<span class="sourceLineNo">8661</span>    return (hasMajor ? (hasMinor ? CompactionState.MAJOR_AND_MINOR : CompactionState.MAJOR)<a name="line.8661"></a>
-<span class="sourceLineNo">8662</span>        : (hasMinor ? CompactionState.MINOR : CompactionState.NONE));<a name="line.8662"></a>
-<span class="sourceLineNo">8663</span>  }<a name="line.8663"></a>
-<span class="sourceLineNo">8664</span><a name="line.8664"></a>
-<span class="sourceLineNo">8665</span>  public void reportCompactionRequestStart(boolean isMajor){<a name="line.8665"></a>
-<span class="sourceLineNo">8666</span>    (isMajor ? majorInProgress : minorInProgress).incrementAndGet();<a name="line.8666"></a>
-<span class="sourceLineNo">8667</span>  }<a name="line.8667"></a>
-<span class="sourceLineNo">8668</span><a name="line.8668"></a>
-<span class="sourceLineNo">8669</span>  public void reportCompactionRequestEnd(boolean isMajor, int numFiles, long filesSizeCompacted) {<a name="line.8669"></a>
-<span class="sourceLineNo">8670</span>    int newValue = (isMajor ? majorInProgress : minorInProgress).decrementAndGet();<a name="line.8670"></a>
-<span class="sourceLineNo">8671</span><a name="line.8671"></a>
-<span class="sourceLineNo">8672</span>    // metrics<a name="line.8672"></a>
-<span class="sourceLineNo">8673</span>    compactionsFinished.increment();<a name="line.8673"></a>
-<span class="sourceLineNo">8674</span>    compactionNumFilesCompacted.add(numFiles);<a name="line.8674"></a>
-<span class="sourceLineNo">8675</span>    compactionNumBytesCompacted.add(filesSizeCompacted);<a name="line.8675"></a>
+<span class="sourceLineNo">8654</span>  @Override<a name="line.8654"></a>
+<span class="sourceLineNo">8655</span>  public Map&lt;byte[], Long&gt; getMaxStoreSeqId() {<a name="line.8655"></a>
+<span class="sourceLineNo">8656</span>    return this.maxSeqIdInStores;<a name="line.8656"></a>
+<span class="sourceLineNo">8657</span>  }<a name="line.8657"></a>
+<span class="sourceLineNo">8658</span><a name="line.8658"></a>
+<span class="sourceLineNo">8659</span>  public long getOldestSeqIdOfStore(byte[] familyName) {<a name="line.8659"></a>
+<span class="sourceLineNo">8660</span>    return wal.getEarliestMemStoreSeqNum(getRegionInfo().getEncodedNameAsBytes(), familyName);<a name="line.8660"></a>
+<span class="sourceLineNo">8661</span>  }<a name="line.8661"></a>
+<span class="sourceLineNo">8662</span><a name="line.8662"></a>
+<span class="sourceLineNo">8663</span>  @Override<a name="line.8663"></a>
+<span class="sourceLineNo">8664</span>  public CompactionState getCompactionState() {<a name="line.8664"></a>
+<span class="sourceLineNo">8665</span>    boolean hasMajor = majorInProgress.get() &gt; 0, hasMinor = minorInProgress.get() &gt; 0;<a name="line.8665"></a>
+<span class="sourceLineNo">8666</span>    return (hasMajor ? (hasMinor ? CompactionState.MAJOR_AND_MINOR : CompactionState.MAJOR)<a name="line.8666"></a>
+<span class="sourceLineNo">8667</span>        : (hasMinor ? CompactionState.MINOR : CompactionState.NONE));<a name="line.8667"></a>
+<span class="sourceLineNo">8668</span>  }<a name="line.8668"></a>
+<span class="sourceLineNo">8669</span><a name="line.8669"></a>
+<span class="sourceLineNo">8670</span>  public void reportCompactionRequestStart(boolean isMajor){<a name="line.8670"></a>
+<span class="sourceLineNo">8671</span>    (isMajor ? majorInProgress : minorInProgress).incrementAndGet();<a name="line.8671"></a>
+<span class="sourceLineNo">8672</span>  }<a name="line.8672"></a>
+<span class="sourceLineNo">8673</span><a name="line.8673"></a>
+<span class="sourceLineNo">8674</span>  public void reportCompactionRequestEnd(boolean isMajor, int numFiles, long filesSizeCompacted) {<a name="line.8674"></a>
+<span class="sourceLineNo">8675</span>    int newValue = (isMajor ? majorInProgress : minorInProgress).decrementAndGet();<a name="line.8675"></a>
 <span class="sourceLineNo">8676</span><a name="line.8676"></a>
-<span class="sourceLineNo">8677</span>    assert newValue &gt;= 0;<a name="line.8677"></a>
-<span class="sourceLineNo">8678</span>  }<a name="line.8678"></a>
-<span class="sourceLineNo">8679</span><a name="line.8679"></a>
-<span class="sourceLineNo">8680</span>  public void reportCompactionRequestFailure() {<a name="line.8680"></a>
-<span class="sourceLineNo">8681</span>    compactionsFailed.increment();<a name="line.8681"></a>
-<span class="sourceLineNo">8682</span>  }<a name="line.8682"></a>
-<span class="sourceLineNo">8683</span><a name="line.8683"></a>
-<span class="sourceLineNo">8684</span>  public void incrementCompactionsQueuedCount() {<a name="line.8684"></a>
-<span class="sourceLineNo">8685</span>    compactionsQueued.increment();<a name="line.8685"></a>
-<span class="sourceLineNo">8686</span>  }<a name="line.8686"></a>
-<span class="sourceLineNo">8687</span><a name="line.8687"></a>
-<span class="sourceLineNo">8688</span>  public void decrementCompactionsQueuedCount() {<a name="line.8688"></a>
-<span class="sourceLineNo">8689</span>    compactionsQueued.decrement();<a name="line.8689"></a>
-<span class="sourceLineNo">8690</span>  }<a name="line.8690"></a>
-<span class="sourceLineNo">8691</span><a name="line.8691"></a>
-<span class="sourceLineNo">8692</span>  public void incrementFlushesQueuedCount() {<a name="line.8692"></a>
-<span class="sourceLineNo">8693</span>    flushesQueued.increment();<a name="line.8693"></a>
-<span class="sourceLineNo">8694</span>  }<a name="line.8694"></a>
-<span class="sourceLineNo">8695</span><a name="line.8695"></a>
-<span class="sourceLineNo">8696</span>  @VisibleForTesting<a name="line.8696"></a>
-<span class="sourceLineNo">8697</span>  public long getReadPoint() {<a name="line.8697"></a>
-<span class="sourceLineNo">8698</span>    return getReadPoint(IsolationLevel.READ_COMMITTED);<a name="line.8698"></a>
+<span class="sourceLineNo">8677</span>    // metrics<a name="line.8677"></a>
+<span class="sourceLineNo">8678</span>    compactionsFinished.increment();<a name="line.8678"></a>
+<span class="sourceLineNo">8679</span>    compactionNumFilesCompacted.add(numFiles);<a name="line.8679"></a>
+<span class="sourceLineNo">8680</span>    compactionNumBytesCompacted.add(filesSizeCompacted);<a name="line.8680"></a>
+<span class="sourceLineNo">8681</span><a name="line.8681"></a>
+<span class="sourceLineNo">8682</span>    assert newValue &gt;= 0;<a name="line.8682"></a>
+<span class="sourceLineNo">8683</span>  }<a name="line.8683"></a>
+<span class="sourceLineNo">8684</span><a name="line.8684"></a>
+<span class="sourceLineNo">8685</span>  public void reportCompactionRequestFailure() {<a name="line.8685"></a>
+<span class="sourceLineNo">8686</span>    compactionsFailed.increment();<a name="line.8686"></a>
+<span class="sourceLineNo">8687</span>  }<a name="line.8687"></a>
+<span class="sourceLineNo">8688</span><a name="line.8688"></a>
+<span class="sourceLineNo">8689</span>  public void incrementCompactionsQueuedCount() {<a name="line.8689"></a>
+<span class="sourceLineNo">8690</span>    compactionsQueued.increment();<a name="line.8690"></a>
+<span class="sourceLineNo">8691</span>  }<a name="line.8691"></a>
+<span class="sourceLineNo">8692</span><a name="line.8692"></a>
+<span class="sourceLineNo">8693</span>  public void decrementCompactionsQueuedCount() {<a name="line.8693"></a>
+<span class="sourceLineNo">8694</span>    compactionsQueued.decrement();<a name="line.8694"></a>
+<span class="sourceLineNo">8695</span>  }<a name="line.8695"></a>
+<span class="sourceLineNo">8696</span><a name="line.8696"></a>
+<span class="sourceLineNo">8697</span>  public void incrementFlushesQueuedCount() {<a name="line.8697"></a>
+<span class="sourceLineNo">8698</span>    flushesQueued.increment();<a name="line.8698"></a>
 <span class="sourceLineNo">8699</span>  }<a name="line.8699"></a>
 <span class="sourceLineNo">8700</span><a name="line.8700"></a>
-<span class="sourceLineNo">8701</span>  /**<a name="line.8701"></a>
-<span class="sourceLineNo">8702</span>   * {@inheritDoc}<a name="line.8702"></a>
-<span class="sourceLineNo">8703</span>   */<a name="line.8703"></a>
-<span class="sourceLineNo">8704</span>  @Override<a name="line.8704"></a>
-<span class="sourceLineNo">8705</span>  public void onConfigurationChange(Configuration conf) {<a name="line.8705"></a>
-<span class="sourceLineNo">8706</span>    this.storeHotnessProtector.update(conf);<a name="line.8706"></a>
-<span class="sourceLineNo">8707</span>  }<a name="line.8707"></a>
-<span class="sourceLineNo">8708</span><a name="line.8708"></a>
-<span class="sourceLineNo">8709</span>  /**<a name="line.8709"></a>
-<span class="sourceLineNo">8710</span>   * {@inheritDoc}<a name="line.8710"></a>
-<span class="sourceLineNo">8711</span>   */<a name="line.8711"></a>
-<span class="sourceLineNo">8712</span>  @Override<a name="line.8712"></a>
-<span class="sourceLineNo">8713</span>  public void registerChildren(ConfigurationManager manager) {<a name="line.8713"></a>
-<span class="sourceLineNo">8714</span>    configurationManager = Optional.of(manager);<a name="line.8714"></a>
-<span class="sourceLineNo">8715</span>    stores.values().forEach(manager::registerObserver);<a name="line.8715"></a>
-<span class="sourceLineNo">8716</span>  }<a name="line.8716"></a>
-<span class="sourceLineNo">8717</span><a name="line.8717"></a>
-<span class="sourceLineNo">8718</span>  /**<a name="line.8718"></a>
-<span class="sourceLineNo">8719</span>   * {@inheritDoc}<a name="line.8719"></a>
-<span class="sourceLineNo">8720</span>   */<a name="line.8720"></a>
-<span class="sourceLineNo">8721</span>  @Override<a name="line.8721"></a>
-<span class="sourceLineNo">8722</span>  public void deregisterChildren(ConfigurationManager manager) {<a name="line.8722"></a>
-<span class="sourceLineNo">8723</span>    stores.values().forEach(configurationManager.get()::deregisterObserver);<a name="line.8723"></a>
-<span class="sourceLineNo">8724</span>  }<a name="line.8724"></a>
-<span class="sourceLineNo">8725</span><a name="line.8725"></a>
+<span class="sourceLineNo">8701</span>  @VisibleForTesting<a name="line.8701"></a>
+<span class="sourceLineNo">8702</span>  public long getReadPoint() {<a name="line.8702"></a>
+<span class="sourceLineNo">8703</span>    return getReadPoint(IsolationLevel.READ_COMMITTED);<a name="line.8703"></a>
+<span class="sourceLineNo">8704</span>  }<a name="line.8704"></a>
+<span class="sourceLineNo">8705</span><a name="line.8705"></a>
+<span class="sourceLineNo">8706</span>  /**<a name="line.8706"></a>
+<span class="sourceLineNo">8707</span>   * {@inheritDoc}<a name="line.8707"></a>
+<span class="sourceLineNo">8708</span>   */<a name="line.8708"></a>
+<span class="sourceLineNo">8709</span>  @Override<a name="line.8709"></a>
+<span class="sourceLineNo">8710</span>  public void onConfigurationChange(Configuration conf) {<a name="line.8710"></a>
+<span class="sourceLineNo">8711</span>    this.storeHotnessProtector.update(conf);<a name="line.8711"></a>
+<span class="sourceLineNo">8712</span>  }<a name="line.8712"></a>
+<span class="sourceLineNo">8713</span><a name="line.8713"></a>
+<span class="sourceLineNo">8714</span>  /**<a name="line.8714"></a>
+<span class="sourceLineNo">8715</span>   * {@inheritDoc}<a name="line.8715"></a>
+<span class="sourceLineNo">8716</span>   */<a name="line.8716"></a>
+<span class="sourceLineNo">8717</span>  @Override<a name="line.8717"></a>
+<span class="sourceLineNo">8718</span>  public void registerChildren(ConfigurationManager manager) {<a name="line.8718"></a>
+<span class="sourceLineNo">8719</span>    configurationManager = Optional.of(manager);<a name="line.8719"></a>
+<span class="sourceLineNo">8720</span>    stores.values().forEach(manager::registerObserver);<a name="line.8720"></a>
+<span class="sourceLineNo">8721</span>  }<a name="line.8721"></a>
+<span class="sourceLineNo">8722</span><a name="line.8722"></a>
+<span class="sourceLineNo">8723</span>  /**<a name="line.8723"></a>
+<span class="sourceLineNo">8724</span>   * {@inheritDoc}<a name="line.8724"></a>
+<span class="sourceLineNo">8725</span>   */<a name="line.8725"></a>
 <span class="sourceLineNo">8726</span>  @Override<a name="line.8726"></a>
-<span class="sourceLineNo">8727</span>  public CellComparator getCellComparator() {<a name="line.8727"></a>
-<span class="sourceLineNo">8728</span>    return this.getRegionInfo().isMetaRegion() ? CellComparatorImpl.META_COMPARATOR<a name="line.8728"></a>
-<span class="sourceLineNo">8729</span>        : CellComparatorImpl.COMPARATOR;<a name="line.8729"></a>
-<span class="sourceLineNo">8730</span>  }<a name="line.8730"></a>
-<span class="sourceLineNo">8731</span><a name="line.8731"></a>
-<span class="sourceLineNo">8732</span>  public long getMemStoreFlushSize() {<a name="line.8732"></a>
-<span class="sourceLineNo">8733</span>    return this.memstoreFlushSize;<a name="line.8733"></a>
-<span class="sourceLineNo">8734</span>  }<a name="line.8734"></a>
-<span class="sourceLineNo">8735</span><a name="line.8735"></a>
+<span class="sourceLineNo">8727</span>  public void deregisterChildren(ConfigurationManager manager) {<a name="line.8727"></a>
+<span class="sourceLineNo">8728</span>    stores.values().forEach(configurationManager.get()::deregisterObserver);<a name="line.8728"></a>
+<span class="sourceLineNo">8729</span>  }<a name="line.8729"></a>
+<span class="sourceLineNo">8730</span><a name="line.8730"></a>
+<span class="sourceLineNo">8731</span>  @Override<a name="line.8731"></a>
+<span class="sourceLineNo">8732</span>  public CellComparator getCellComparator() {<a name="line.8732"></a>
+<span class="sourceLineNo">8733</span>    return this.getRegionInfo().isMetaRegion() ? CellComparatorImpl.META_COMPARATOR<a name="line.8733"></a>
+<span class="sourceLineNo">8734</span>        : CellComparatorImpl.COMPARATOR;<a name="line.8734"></a>
+<span class="sourceLineNo">8735</span>  }<a name="line.8735"></a>
 <span class="sourceLineNo">8736</span><a name="line.8736"></a>
-<span class="sourceLineNo">8737</span>  //// method for debugging tests<a name="line.8737"></a>
-<span class="sourceLineNo">8738</span>  void throwException(String title, String regionName) {<a name="line.8738"></a>
-<span class="sourceLineNo">8739</span>    StringBuilder buf = new StringBuilder();<a name="line.8739"></a>
-<span class="sourceLineNo">8740</span>    buf.append(title + ", ");<a name="line.8740"></a>
-<span class="sourceLineNo">8741</span>    buf.append(getRegionInfo().toString());<a name="line.8741"></a>
-<span class="sourceLineNo">8742</span>    buf.append(getRegionInfo().isMetaRegion() ? " meta region " : " ");<a name="line.8742"></a>
-<span class="sourceLineNo">8743</span>    buf.append("stores: ");<a name="line.8743"></a>
-<span class="sourceLineNo">8744</span>    for (HStore s : stores.values()) {<a name="line.8744"></a>
-<span class="sourceLineNo">8745</span>      buf.append(s.getColumnFamilyDescriptor().getNameAsString());<a name="line.8745"></a>
-<span class="sourceLineNo">8746</span>      buf.append(" size: ");<a name="line.8746"></a>
-<span class="sourceLineNo">8747</span>      buf.append(s.getMemStoreSize().getDataSize());<a name="line.8747"></a>
-<span class="sourceLineNo">8748</span>      buf.append(" ");<a name="line.8748"></a>
-<span class="sourceLineNo">8749</span>    }<a name="line.8749"></a>
-<span class="sourceLineNo">8750</span>    buf.append("end-of-stores");<a name="line.8750"></a>
-<span class="sourceLineNo">8751</span>    buf.append(", memstore size ");<a name="line.8751"></a>
-<span class="sourceLineNo">8752</span>    buf.append(getMemStoreDataSize());<a name="line.8752"></a>
-<span class="sourceLineNo">8753</span>    if (getRegionInfo().getRegionNameAsString().startsWith(regionName)) {<a name="line.8753"></a>
-<span class="sourceLineNo">8754</span>      throw new RuntimeException(buf.toString());<a name="line.8754"></a>
-<span class="sourceLineNo">8755</span>    }<a name="line.8755"></a>
-<span class="sourceLineNo">8756</span>  }<a name="line.8756"></a>
-<span class="sourceLineNo">8757</span><a name="line.8757"></a>
-<span class="sourceLineNo">8758</span>  @Override<a name="line.8758"></a>
-<span class="sourceLineNo">8759</span>  public void requestCompaction(String why, int priority, boolean major,<a name="line.8759"></a>
-<span class="sourceLineNo">8760</span>      CompactionLifeCycleTracker tracker) throws IOException {<a name="line.8760"></a>
-<span class="sourceLineNo">8761</span>    if (major) {<a name="line.8761"></a>
-<span class="sourceLineNo">8762</span>      stores.values().forEach(HStore::triggerMajorCompaction);<a name="line.8762"></a>
-<span class="sourceLineNo">8763</span>    }<a name="line.8763"></a>
-<span class="sourceLineNo">8764</span>    rsServices.getCompactionRequestor().requestCompaction(this, why, priority, tracker,<a name="line.8764"></a>
-<span class="sourceLineNo">8765</span>        RpcServer.getRequestUser().orElse(null));<a name="line.8765"></a>
-<span class="sourceLineNo">8766</span>  }<a name="line.8766"></a>
-<span class="sourceLineNo">8767</span><a name="line.8767"></a>
-<span class="sourceLineNo">8768</span>  @Override<a name="line.8768"></a>
-<span class="sourceLineNo">8769</span>  public void requestCompaction(byte[] family, String why, int priority, boolean major,<a name="line.8769"></a>
-<span class="sourceLineNo">8770</span>      CompactionLifeCycleTracker tracker) throws IOException {<a name="line.8770"></a>
-<span class="sourceLineNo">8771</span>    HStore store = stores.get(family);<a name="line.8771"></a>
-<span class="sourceLineNo">8772</span>    if (store == null) {<a name="line.8772"></a>
-<span class="sourceLineNo">8773</span>      throw new NoSuchColumnFamilyException("column family " + Bytes.toString(family) +<a name="line.8773"></a>
-<span class="sourceLineNo">8774</span>          " does not exist in region " + getRegionInfo().getRegionNameAsString());<a name="line.8774"></a>
-<span class="sourceLineNo">8775</span>    }<a name="line.8775"></a>
-<span class="sourceLineNo">8776</span>    if (major) {<a name="line.8776"></a>
-<span class="sourceLineNo">8777</span>      store.triggerMajorCompaction();<a name="line.8777"></a>
-<span class="sourceLineNo">8778</span>    }<a name="line.8778"></a>
-<span class="sourceLineNo">8779</span>    rsServices.getCompactionRequestor().requestCompaction(this, store, why, priority, tracker,<a name="line.8779"></a>
-<span class="sourceLineNo">8780</span>        RpcServer.getRequestUser().orElse(null));<a name="line.8780"></a>
-<span class="sourceLineNo">8781</span>  }<a name="line.8781"></a>
-<span class="sourceLineNo">8782</span><a name="line.8782"></a>
-<span class="sourceLineNo">8783</span>  private void requestFlushIfNeeded() throws RegionTooBusyException {<a name="line.8783"></a>
-<span class="sourceLineNo">8784</span>    if(isFlushSize(this.memStoreSizing.getMemStoreSize())) {<a name="line.8784"></a>
-<span class="sourceLineNo">8785</span>      requestFlush();<a name="line.8785"></a>
-<span class="sourceLineNo">8786</span>    }<a name="line.8786"></a>
-<span class="sourceLineNo">8787</span>  }<a name="line.8787"></a>
-<span class="sourceLineNo">8788</span><a name="line.8788"></a>
-<span class="sourceLineNo">8789</span>  private void requestFlush() {<a name="line.8789"></a>
-<span class="sourceLineNo">8790</span>    if (this.rsServices == null) {<a name="line.8790"></a>
-<span class="sourceLineNo">8791</span>      return;<a name="line.8791"></a>
-<span class="sourceLineNo">8792</span>    }<a name="line.8792"></a>
-<span class="sourceLineNo">8793</span>    requestFlush0(FlushLifeCycleTracker.DUMMY);<a name="line.8793"></a>
-<span class="sourceLineNo">8794</span>  }<a name="line.8794"></a>
-<span class="sourceLineNo">8795</span><a name="line.8795"></a>
-<span class="sourceLineNo">8796</span>  private void requestFlush0(FlushLifeCycleTracker tracker) {<a name="line.8796"></a>
-<span class="sourceLineNo">8797</span>    boolean shouldFlush = false;<a name="line.8797"></a>
-<span class="sourceLineNo">8798</span>    synchronized (writestate) {<a name="line.8798"></a>
-<span class="sourceLineNo">8799</span>      if (!this.writestate.isFlushRequested()) {<a name="line.8799"></a>
-<span class="sourceLineNo">8800</span>        shouldFlush = true;<a name="line.8800"></a>
-<span class="sourceLineNo">8801</span>        writestate.flushRequested = true;<a name="line.8801"></a>
-<span class="sourceLineNo">8802</span>      }<a name="line.8802"></a>
-<span class="sourceLineNo">8803</span>    }<a name="line.8803"></a>
-<span class="sourceLineNo">8804</span>    if (shouldFlush) {<a name="line.8804"></a>
-<span class="sourceLineNo">8805</span>      // Make request outside of synchronize block; HBASE-818.<a name="line.8805"></a>
-<span class="sourceLineNo">8806</span>      this.rsServices.getFlushRequester().requestFlush(this, false, tracker);<a name="line.8806"></a>
-<span class="sourceLineNo">8807</span>      if (LOG.isDebugEnabled()) {<a name="line.8807"></a>
-<span class="sourceLineNo">8808</span>        LOG.debug("Flush requested on " + this.getRegionInfo().getEncodedName());<a name="line.8808"></a>
-<span class="sourceLineNo">8809</span>      }<a name="line.8809"></a>
-<span class="sourceLineNo">8810</span>    } else {<a name="line.8810"></a>
-<span class="sourceLineNo">8811</span>      tracker.notExecuted("Flush already requested on " + this);<a name="line.8811"></a>
-<span class="sourceLineNo">8812</span>    }<a name="line.8812"></a>
-<span class="sourceLineNo">8813</span>  }<a name="line.8813"></a>
-<span class="sourceLineNo">8814</span><a name="line.8814"></a>
-<span class="sourceLineNo">8815</span>  @Override<a name="line.8815"></a>
-<span class="sourceLineNo">8816</span>  public void requestFlush(FlushLifeCycleTracker tracker) throws IOException {<a name="line.8816"></a>
-<span class="sourceLineNo">8817</span>    requestFlush0(tracker);<a name="line.8817"></a>
+<span class="sourceLineNo">8737</span>  public long getMemStoreFlushSize() {<a name="line.8737"></a>
+<span class="sourceLineNo">8738</span>    return this.memstoreFlushSize;<a name="line.8738"></a>
+<span class="sourceLineNo">8739</span>  }<a name="line.8739"></a>
+<span class="sourceLineNo">8740</span><a name="line.8740"></a>
+<span class="sourceLineNo">8741</span><a name="line.8741"></a>
+<span class="sourceLineNo">8742</span>  //// method for debugging tests<a name="line.8742"></a>
+<span class="sourceLineNo">8743</span>  void throwException(String title, String regionName) {<a name="line.8743"></a>
+<span class="sourceLineNo">8744</span>    StringBuilder buf = new StringBuilder();<a name="line.8744"></a>
+<span class="sourceLineNo">8745</span>    buf.append(title + ", ");<a name="line.8745"></a>
+<span class="sourceLineNo">8746</span>    buf.append(getRegionInfo().toString());<a name="line.8746"></a>
+<span class="sourceLineNo">8747</span>    buf.append(getRegionInfo().isMetaRegion() ? " meta region " : " ");<a name="line.8747"></a>
+<span class="sourceLineNo">8748</span>    buf.append("stores: ");<a name="line.8748"></a>
+<span class="sourceLineNo">8749</span>    for (HStore s : stores.values()) {<a name="line.8749"></a>
+<span class="sourceLineNo">8750</span>      buf.append(s.getColumnFamilyDescriptor().getNameAsString());<a name="line.8750"></a>
+<span class="sourceLineNo">8751</span>      buf.append(" size: ");<a name="line.8751"></a>
+<span class="sourceLineNo">8752</span>      buf.append(s.getMemStoreSize().getDataSize());<a name="line.8752"></a>
+<span class="sourceLineNo">8753</span>      buf.append(" ");<a name="line.8753"></a>
+<span class="sourceLineNo">8754</span>    }<a name="line.8754"></a>
+<span class="sourceLineNo">8755</span>    buf.append("end-of-stores");<a name="line.8755"></a>
+<span class="sourceLineNo">8756</span>    buf.append(", memstore size ");<a name="line.8756"></a>
+<span class="sourceLineNo">8757</span>    buf.append(getMemStoreDataSize());<a name="line.8757"></a>
+<span class="sourceLineNo">8758</span>    if (getRegionInfo().getRegionNameAsString().startsWith(regionName)) {<a name="line.8758"></a>
+<span class="sourceLineNo">8759</span>      throw new RuntimeException(buf.toString());<a name="line.8759"></a>
+<span class="sourceLineNo">8760</span>    }<a name="line.8760"></a>
+<span class="sourceLineNo">8761</span>  }<a name="line.8761"></a>
+<span class="sourceLineNo">8762</span><a name="line.8762"></a>
+<span class="sourceLineNo">8763</span>  @Override<a name="line.8763"></a>
+<span class="sourceLineNo">8764</span>  public void requestCompaction(String why, int priority, boolean major,<a name="line.8764"></a>
+<span class="sourceLineNo">8765</span>      CompactionLifeCycleTracker tracker) throws IOException {<a name="line.8765"></a>
+<span class="sourceLineNo">8766</span>    if (major) {<a name="line.8766"></a>
+<span class="sourceLineNo">8767</span>      stores.values().forEach(HStore::triggerMajorCompaction);<a name="line.8767"></a>
+<span class="sourceLineNo">8768</span>    }<a name="line.8768"></a>
+<span class="sourceLineNo">8769</span>    rsServices.getCompactionRequestor().requestCompaction(this, why, priority, tracker,<a name="line.8769"></a>
+<span class="sourceLineNo">8770</span>        RpcServer.getRequestUser().orElse(null));<a name="line.8770"></a>
+<span class="sourceLineNo">8771</span>  }<a name="line.8771"></a>
+<span class="sourceLineNo">8772</span><a name="line.8772"></a>
+<span class="sourceLineNo">8773</span>  @Override<a name="line.8773"></a>
+<span class="sourceLineNo">8774</span>  public void requestCompaction(byte[] family, String why, int priority, boolean major,<a name="line.8774"></a>
+<span class="sourceLineNo">8775</span>      CompactionLifeCycleTracker tracker) throws IOException {<a name="line.8775"></a>
+<span class="sourceLineNo">8776</span>    HStore store = stores.get(family);<a name="line.8776"></a>
+<span class="sourceLineNo">8777</span>    if (store == null) {<a name="line.8777"></a>
+<span class="sourceLineNo">8778</span>      throw new NoSuchColumnFamilyException("column family " + Bytes.toString(family) +<a name="line.8778"></a>
+<span class="sourceLineNo">8779</span>          " does not exist in region " + getRegionInfo().getRegionNameAsString());<a name="line.8779"></a>
+<span class="sourceLineNo">8780</span>    }<a name="line.8780"></a>
+<span class="sourceLineNo">8781</span>    if (major) {<a name="line.8781"></a>
+<span class="sourceLineNo">8782</span>      store.triggerMajorCompaction();<a name="line.8782"></a>
+<span class="sourceLineNo">8783</span>    }<a name="line.8783"></a>
+<span class="sourceLineNo">8784</span>    rsServices.getCompactionRequestor().requestCompaction(this, store, why, priority, tracker,<a name="line.8784"></a>
+<span class="sourceLineNo">8785</span>        RpcServer.getRequestUser().orElse(null));<a name="line.8785"></a>
+<span class="sourceLineNo">8786</span>  }<a name="line.8786"></a>
+<span class="sourceLineNo">8787</span><a name="line.8787"></a>
+<span class="sourceLineNo">8788</span>  private void requestFlushIfNeeded() throws RegionTooBusyException {<a name="line.8788"></a>
+<span class="sourceLineNo">8789</span>    if(isFlushSize(this.memStoreSizing.getMemStoreSize())) {<a name="line.8789"></a>
+<span class="sourceLineNo">8790</span>      requestFlush();<a name="line.8790"></a>
+<span class="sourceLineNo">8791</span>    }<a name="line.8791"></a>
+<span class="sourceLineNo">8792</span>  }<a name="line.8792"></a>
+<span class="sourceLineNo">8793</span><a name="line.8793"></a>
+<span class="sourceLineNo">8794</span>  private void requestFlush() {<a name="line.8794"></a>
+<span class="sourceLineNo">8795</span>    if (this.rsServices == null) {<a name="line.8795"></a>
+<span class="sourceLineNo">8796</span>      return;<a name="line.8796"></a>
+<span class="sourceLineNo">8797</span>    }<a name="line.8797"></a>
+<span class="sourceLineNo">8798</span>    requestFlush0(FlushLifeCycleTracker.DUMMY);<a name="line.8798"></a>
+<span class="sourceLineNo">8799</span>  }<a name="line.8799"></a>
+<span class="sourceLineNo">8800</span><a name="line.8800"></a>
+<span class="sourceLineNo">8801</span>  private void requestFlush0(FlushLifeCycleTracker tracker) {<a name="line.8801"></a>
+<span class="sourceLineNo">8802</span>    boolean shouldFlush = false;<a name="line.8802"></a>
+<span class="sourceLineNo">8803</span>    synchronized (writestate) {<a name="line.8803"></a>
+<span class="sourceLineNo">8804</span>      if (!this.writestate.isFlushRequested()) {<a name="line.8804"></a>
+<span class="sourceLineNo">8805</span>        shouldFlush = true;<a name="line.8805"></a>
+<span class="sourceLineNo">8806</span>        writestate.flushRequested = true;<a name="line.8806"></a>
+<span class="sourceLineNo">8807</span>      }<a name="line.8807"></a>
+<span class="sourceLineNo">8808</span>    }<a name="line.8808"></a>
+<span class="sourceLineNo">8809</span>    if (shouldFlush) {<a name="line.8809"></a>
+<span class="sourceLineNo">8810</span>      // Make request outside of synchronize block; HBASE-818.<a name="line.8810"></a>
+<span class="sourceLineNo">8811</span>      this.rsServices.getFlushRequester().requestFlush(this, false, tracker);<a name="line.8811"></a>
+<span class="sourceLineNo">8812</span>      if (LOG.isDebugEnabled()) {<a name="line.8812"></a>
+<span class="sourceLineNo">8813</span>        LOG.debug("Flush requested on " + this.getRegionInfo().getEncodedName());<a name="line.8813"></a>
+<span class="sourceLineNo">8814</span>      }<a name="line.8814"></a>
+<span class="sourceLineNo">8815</span>    } else {<a name="line.8815"></a>
+<span class="sourceLineNo">8816</span>      tracker.notExecuted("Flush already requested on " + this);<a name="line.8816"></a>
+<span class="sourceLineNo">8817</span>    }<a name="line.8817"></a>
 <span class="sourceLineNo">8818</span>  }<a name="line.8818"></a>
 <span class="sourceLineNo">8819</span><a name="line.8819"></a>
-<span class="sourceLineNo">8820</span>  /**<a name="line.8820"></a>
-<span class="sourceLineNo">8821</span>   * This method modifies the region's configuration in order to inject replication-related<a name="line.8821"></a>
-<span class="sourceLineNo">8822</span>   * features<a name="line.8822"></a>
-<span class="sourceLineNo">8823</span>   * @param conf region configurations<a name="line.8823"></a>
-<span class="sourceLineNo">8824</span>   */<a name="line.8824"></a>
-<span class="sourceLineNo">8825</span>  static void decorateRegionConfiguration(Configuration conf) {<a name="line.8825"></a>
-<span class="sourceLineNo">8826</span>    if (ReplicationUtils.isReplicationForBulkLoadDataEnabled(conf)) {<a name="line.8826"></a>
-<span class="sourceLineNo">8827</span>      String plugins = conf.get(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY,"");<a name="line.8827"></a>
-<span class="sourceLineNo">8828</span>      String replicationCoprocessorClass = ReplicationObserver.class.getCanonicalName();<a name="line.8828"></a>
-<span class="sourceLineNo">8829</span>      if (!plugins.contains(replicationCoprocessorClass)) {<a name="line.8829"></a>
-<span class="sourceLineNo">8830</span>        conf.set(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY,<a name="line.8830"></a>
-<span class="sourceLineNo">8831</span>            (plugins.equals("") ? "" : (plugins + ",")) + replicationCoprocessorClass);<a name="line.8831"></a>
-<span class="sourceLineNo">8832</span>      }<a name="line.8832"></a>
-<span class="sourceLineNo">8833</span>    }<a name="line.8833"></a>
-<span class="sourceLineNo">8834</span>  }<a name="line.8834"></a>
-<span class="sourceLineNo">8835</span>}<a name="line.8835"></a>
+<span class="sourceLineNo">8820</span>  @Override<a name="line.8820"></a>
+<span class="sourceLineNo">8821</span>  public void requestFlush(FlushLifeCycleTracker tracker) throws IOException {<a name="line.8821"></a>
+<span class="sourceLineNo">8822</span>    requestFlush0(tracker);<a name="line.8822"></a>
+<span class="sourceLineNo">8823</span>  }<a name="line.8823"></a>
+<span class="sourceLineNo">8824</span><a name="line.8824"></a>
+<span class="sourceLineNo">8825</span>  /**<a name="line.8825"></a>
+<span class="sourceLineNo">8826</span>   * This method modifies the region's configuration in order to inject replication-related<a name="line.8826"></a>
+<span class="sourceLineNo">8827</span>   * features<a name="line.8827"></a>
+<span class="sourceLineNo">8828</span>   * @param conf region configurations<a name="line.8828"></a>
+<span class="sourceLineNo">8829</span>   */<a name="line.8829"></a>
+<span class="sourceLineNo">8830</span>  static void decorateRegionConfiguration(Configuration conf) {<a name="line.8830"></a>
+<span class="sourceLineNo">8831</span>    if (ReplicationUtils.isReplicationForBulkLoadDataEnabled(conf)) {<a name="line.8831"></a>
+<span class="sourceLineNo">8832</span>      String plugins = conf.get(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY,"");<a name="line.8832"></a>
+<span class="sourceLineNo">8833</span>      String replicationCoprocessorClass = ReplicationObserver.class.getCanonicalName();<a name="line.8833"></a>
+<span class="sourceLineNo">8834</span>      if (!plugins.contains(replicationCoprocessorClass)) {<a name="line.8834"></a>
+<span class="sourceLineNo">8835</span>        conf.set(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY,<a name="line.8835"></a>
+<span class="sourceLineNo">8836</span>            (plugins.equals("") ? "" : (plugins + ",")) + replicationCoprocessorClass);<a name="line.8836"></a>
+<span class="sourceLineNo">8837</span>      }<a name="line.8837"></a>
+<span class="sourceLineNo">8838</span>    }<a name="line.8838"></a>
+<span class="sourceLineNo">8839</span>  }<a name="line.8839"></a>
+<span class="sourceLineNo">8840</span>}<a name="line.8840"></a>
 
 
 
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 8fcec33..2147e82 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
@@ -7972,875 +7972,880 @@
 <span class="sourceLineNo">7964</span>    if (walEdit.isReplay()) {<a name="line.7964"></a>
 <span class="sourceLineNo">7965</span>      walKey.setOrigLogSeqNum(origLogSeqNum);<a name="line.7965"></a>
 <span class="sourceLineNo">7966</span>    }<a name="line.7966"></a>
-<span class="sourceLineNo">7967</span>    WriteEntry writeEntry = null;<a name="line.7967"></a>
-<span class="sourceLineNo">7968</span>    try {<a name="line.7968"></a>
-<span class="sourceLineNo">7969</span>      long txid = this.wal.append(this.getRegionInfo(), walKey, walEdit, true);<a name="line.7969"></a>
-<span class="sourceLineNo">7970</span>      // Call sync on our edit.<a name="line.7970"></a>
-<span class="sourceLineNo">7971</span>      if (txid != 0) {<a name="line.7971"></a>
-<span class="sourceLineNo">7972</span>        sync(txid, durability);<a name="line.7972"></a>
-<span class="sourceLineNo">7973</span>      }<a name="line.7973"></a>
-<span class="sourceLineNo">7974</span>      writeEntry = walKey.getWriteEntry();<a name="line.7974"></a>
-<span class="sourceLineNo">7975</span>    } catch (IOException ioe) {<a name="line.7975"></a>
-<span class="sourceLineNo">7976</span>      if (walKey != null &amp;&amp; walKey.getWriteEntry() != null) {<a name="line.7976"></a>
-<span class="sourceLineNo">7977</span>        mvcc.complete(walKey.getWriteEntry());<a name="line.7977"></a>
+<span class="sourceLineNo">7967</span>    //don't call the coproc hook for writes to the WAL caused by<a name="line.7967"></a>
+<span class="sourceLineNo">7968</span>    //system lifecycle events like flushes or compactions<a name="line.7968"></a>
+<span class="sourceLineNo">7969</span>    if (this.coprocessorHost != null &amp;&amp; !walEdit.isMetaEdit()) {<a name="line.7969"></a>
+<span class="sourceLineNo">7970</span>      this.coprocessorHost.preWALAppend(walKey, walEdit);<a name="line.7970"></a>
+<span class="sourceLineNo">7971</span>    }<a name="line.7971"></a>
+<span class="sourceLineNo">7972</span>    WriteEntry writeEntry = null;<a name="line.7972"></a>
+<span class="sourceLineNo">7973</span>    try {<a name="line.7973"></a>
+<span class="sourceLineNo">7974</span>      long txid = this.wal.append(this.getRegionInfo(), walKey, walEdit, true);<a name="line.7974"></a>
+<span class="sourceLineNo">7975</span>      // Call sync on our edit.<a name="line.7975"></a>
+<span class="sourceLineNo">7976</span>      if (txid != 0) {<a name="line.7976"></a>
+<span class="sourceLineNo">7977</span>        sync(txid, durability);<a name="line.7977"></a>
 <span class="sourceLineNo">7978</span>      }<a name="line.7978"></a>
-<span class="sourceLineNo">7979</span>      throw ioe;<a name="line.7979"></a>
-<span class="sourceLineNo">7980</span>    }<a name="line.7980"></a>
-<span class="sourceLineNo">7981</span>    return writeEntry;<a name="line.7981"></a>
-<span class="sourceLineNo">7982</span>  }<a name="line.7982"></a>
-<span class="sourceLineNo">7983</span><a name="line.7983"></a>
-<span class="sourceLineNo">7984</span>  /**<a name="line.7984"></a>
-<span class="sourceLineNo">7985</span>   * Do coprocessor pre-increment or pre-append call.<a name="line.7985"></a>
-<span class="sourceLineNo">7986</span>   * @return Result returned out of the coprocessor, which means bypass all further processing and<a name="line.7986"></a>
-<span class="sourceLineNo">7987</span>   *  return the proffered Result instead, or null which means proceed.<a name="line.7987"></a>
-<span class="sourceLineNo">7988</span>   */<a name="line.7988"></a>
-<span class="sourceLineNo">7989</span>  private Result doCoprocessorPreCall(final Operation op, final Mutation mutation)<a name="line.7989"></a>
-<span class="sourceLineNo">7990</span>  throws IOException {<a name="line.7990"></a>
-<span class="sourceLineNo">7991</span>    Result result = null;<a name="line.7991"></a>
-<span class="sourceLineNo">7992</span>    if (this.coprocessorHost != null) {<a name="line.7992"></a>
-<span class="sourceLineNo">7993</span>      switch(op) {<a name="line.7993"></a>
-<span class="sourceLineNo">7994</span>        case INCREMENT:<a name="line.7994"></a>
-<span class="sourceLineNo">7995</span>          result = this.coprocessorHost.preIncrementAfterRowLock((Increment)mutation);<a name="line.7995"></a>
-<span class="sourceLineNo">7996</span>          break;<a name="line.7996"></a>
-<span class="sourceLineNo">7997</span>        case APPEND:<a name="line.7997"></a>
-<span class="sourceLineNo">7998</span>          result = this.coprocessorHost.preAppendAfterRowLock((Append)mutation);<a name="line.7998"></a>
-<span class="sourceLineNo">7999</span>          break;<a name="line.7999"></a>
-<span class="sourceLineNo">8000</span>        default: throw new UnsupportedOperationException(op.toString());<a name="line.8000"></a>
-<span class="sourceLineNo">8001</span>      }<a name="line.8001"></a>
-<span class="sourceLineNo">8002</span>    }<a name="line.8002"></a>
-<span class="sourceLineNo">8003</span>    return result;<a name="line.8003"></a>
-<span class="sourceLineNo">8004</span>  }<a name="line.8004"></a>
-<span class="sourceLineNo">8005</span><a name="line.8005"></a>
-<span class="sourceLineNo">8006</span>  /**<a name="line.8006"></a>
-<span class="sourceLineNo">8007</span>   * Reckon the Cells to apply to WAL, memstore, and to return to the Client; these Sets are not<a name="line.8007"></a>
-<span class="sourceLineNo">8008</span>   * always the same dependent on whether to write WAL.<a name="line.8008"></a>
-<span class="sourceLineNo">8009</span>   *<a name="line.8009"></a>
-<span class="sourceLineNo">8010</span>   * @param results Fill in here what goes back to the Client if it is non-null (if null, client<a name="line.8010"></a>
-<span class="sourceLineNo">8011</span>   *  doesn't want results).<a name="line.8011"></a>
-<span class="sourceLineNo">8012</span>   * @param forMemStore Fill in here what to apply to the MemStore (by Store).<a name="line.8012"></a>
-<span class="sourceLineNo">8013</span>   * @return A WALEdit to apply to WAL or null if we are to skip the WAL.<a name="line.8013"></a>
-<span class="sourceLineNo">8014</span>   */<a name="line.8014"></a>
-<span class="sourceLineNo">8015</span>  private WALEdit reckonDeltas(Operation op, Mutation mutation, Durability effectiveDurability,<a name="line.8015"></a>
-<span class="sourceLineNo">8016</span>      Map&lt;HStore, List&lt;Cell&gt;&gt; forMemStore, List&lt;Cell&gt; results) throws IOException {<a name="line.8016"></a>
-<span class="sourceLineNo">8017</span>    WALEdit walEdit = null;<a name="line.8017"></a>
-<span class="sourceLineNo">8018</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.8018"></a>
-<span class="sourceLineNo">8019</span>    final boolean writeToWAL = effectiveDurability != Durability.SKIP_WAL;<a name="line.8019"></a>
-<span class="sourceLineNo">8020</span>    // Process a Store/family at a time.<a name="line.8020"></a>
-<span class="sourceLineNo">8021</span>    for (Map.Entry&lt;byte [], List&lt;Cell&gt;&gt; entry: mutation.getFamilyCellMap().entrySet()) {<a name="line.8021"></a>
-<span class="sourceLineNo">8022</span>      final byte[] columnFamilyName = entry.getKey();<a name="line.8022"></a>
-<span class="sourceLineNo">8023</span>      List&lt;Cell&gt; deltas = entry.getValue();<a name="line.8023"></a>
-<span class="sourceLineNo">8024</span>      // Reckon for the Store what to apply to WAL and MemStore.<a name="line.8024"></a>
-<span class="sourceLineNo">8025</span>      List&lt;Cell&gt; toApply = reckonDeltasByStore(stores.get(columnFamilyName), op, mutation,<a name="line.8025"></a>
-<span class="sourceLineNo">8026</span>        effectiveDurability, now, deltas, results);<a name="line.8026"></a>
-<span class="sourceLineNo">8027</span>      if (!toApply.isEmpty()) {<a name="line.8027"></a>
-<span class="sourceLineNo">8028</span>        for (Cell cell : toApply) {<a name="line.8028"></a>
-<span class="sourceLineNo">8029</span>          HStore store = getStore(cell);<a name="line.8029"></a>
-<span class="sourceLineNo">8030</span>          if (store == null) {<a name="line.8030"></a>
-<span class="sourceLineNo">8031</span>            checkFamily(CellUtil.cloneFamily(cell));<a name="line.8031"></a>
-<span class="sourceLineNo">8032</span>          } else {<a name="line.8032"></a>
-<span class="sourceLineNo">8033</span>            forMemStore.computeIfAbsent(store, key -&gt; new ArrayList&lt;&gt;()).add(cell);<a name="line.8033"></a>
-<span class="sourceLineNo">8034</span>          }<a name="line.8034"></a>
-<span class="sourceLineNo">8035</span>        }<a name="line.8035"></a>
-<span class="sourceLineNo">8036</span>        if (writeToWAL) {<a name="line.8036"></a>
-<span class="sourceLineNo">8037</span>          if (walEdit == null) {<a name="line.8037"></a>
-<span class="sourceLineNo">8038</span>            walEdit = new WALEdit();<a name="line.8038"></a>
+<span class="sourceLineNo">7979</span>      writeEntry = walKey.getWriteEntry();<a name="line.7979"></a>
+<span class="sourceLineNo">7980</span>    } catch (IOException ioe) {<a name="line.7980"></a>
+<span class="sourceLineNo">7981</span>      if (walKey != null &amp;&amp; walKey.getWriteEntry() != null) {<a name="line.7981"></a>
+<span class="sourceLineNo">7982</span>        mvcc.complete(walKey.getWriteEntry());<a name="line.7982"></a>
+<span class="sourceLineNo">7983</span>      }<a name="line.7983"></a>
+<span class="sourceLineNo">7984</span>      throw ioe;<a name="line.7984"></a>
+<span class="sourceLineNo">7985</span>    }<a name="line.7985"></a>
+<span class="sourceLineNo">7986</span>    return writeEntry;<a name="line.7986"></a>
+<span class="sourceLineNo">7987</span>  }<a name="line.7987"></a>
+<span class="sourceLineNo">7988</span><a name="line.7988"></a>
+<span class="sourceLineNo">7989</span>  /**<a name="line.7989"></a>
+<span class="sourceLineNo">7990</span>   * Do coprocessor pre-increment or pre-append call.<a name="line.7990"></a>
+<span class="sourceLineNo">7991</span>   * @return Result returned out of the coprocessor, which means bypass all further processing and<a name="line.7991"></a>
+<span class="sourceLineNo">7992</span>   *  return the proffered Result instead, or null which means proceed.<a name="line.7992"></a>
+<span class="sourceLineNo">7993</span>   */<a name="line.7993"></a>
+<span class="sourceLineNo">7994</span>  private Result doCoprocessorPreCall(final Operation op, final Mutation mutation)<a name="line.7994"></a>
+<span class="sourceLineNo">7995</span>  throws IOException {<a name="line.7995"></a>
+<span class="sourceLineNo">7996</span>    Result result = null;<a name="line.7996"></a>
+<span class="sourceLineNo">7997</span>    if (this.coprocessorHost != null) {<a name="line.7997"></a>
+<span class="sourceLineNo">7998</span>      switch(op) {<a name="line.7998"></a>
+<span class="sourceLineNo">7999</span>        case INCREMENT:<a name="line.7999"></a>
+<span class="sourceLineNo">8000</span>          result = this.coprocessorHost.preIncrementAfterRowLock((Increment)mutation);<a name="line.8000"></a>
+<span class="sourceLineNo">8001</span>          break;<a name="line.8001"></a>
+<span class="sourceLineNo">8002</span>        case APPEND:<a name="line.8002"></a>
+<span class="sourceLineNo">8003</span>          result = this.coprocessorHost.preAppendAfterRowLock((Append)mutation);<a name="line.8003"></a>
+<span class="sourceLineNo">8004</span>          break;<a name="line.8004"></a>
+<span class="sourceLineNo">8005</span>        default: throw new UnsupportedOperationException(op.toString());<a name="line.8005"></a>
+<span class="sourceLineNo">8006</span>      }<a name="line.8006"></a>
+<span class="sourceLineNo">8007</span>    }<a name="line.8007"></a>
+<span class="sourceLineNo">8008</span>    return result;<a name="line.8008"></a>
+<span class="sourceLineNo">8009</span>  }<a name="line.8009"></a>
+<span class="sourceLineNo">8010</span><a name="line.8010"></a>
+<span class="sourceLineNo">8011</span>  /**<a name="line.8011"></a>
+<span class="sourceLineNo">8012</span>   * Reckon the Cells to apply to WAL, memstore, and to return to the Client; these Sets are not<a name="line.8012"></a>
+<span class="sourceLineNo">8013</span>   * always the same dependent on whether to write WAL.<a name="line.8013"></a>
+<span class="sourceLineNo">8014</span>   *<a name="line.8014"></a>
+<span class="sourceLineNo">8015</span>   * @param results Fill in here what goes back to the Client if it is non-null (if null, client<a name="line.8015"></a>
+<span class="sourceLineNo">8016</span>   *  doesn't want results).<a name="line.8016"></a>
+<span class="sourceLineNo">8017</span>   * @param forMemStore Fill in here what to apply to the MemStore (by Store).<a name="line.8017"></a>
+<span class="sourceLineNo">8018</span>   * @return A WALEdit to apply to WAL or null if we are to skip the WAL.<a name="line.8018"></a>
+<span class="sourceLineNo">8019</span>   */<a name="line.8019"></a>
+<span class="sourceLineNo">8020</span>  private WALEdit reckonDeltas(Operation op, Mutation mutation, Durability effectiveDurability,<a name="line.8020"></a>
+<span class="sourceLineNo">8021</span>      Map&lt;HStore, List&lt;Cell&gt;&gt; forMemStore, List&lt;Cell&gt; results) throws IOException {<a name="line.8021"></a>
+<span class="sourceLineNo">8022</span>    WALEdit walEdit = null;<a name="line.8022"></a>
+<span class="sourceLineNo">8023</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.8023"></a>
+<span class="sourceLineNo">8024</span>    final boolean writeToWAL = effectiveDurability != Durability.SKIP_WAL;<a name="line.8024"></a>
+<span class="sourceLineNo">8025</span>    // Process a Store/family at a time.<a name="line.8025"></a>
+<span class="sourceLineNo">8026</span>    for (Map.Entry&lt;byte [], List&lt;Cell&gt;&gt; entry: mutation.getFamilyCellMap().entrySet()) {<a name="line.8026"></a>
+<span class="sourceLineNo">8027</span>      final byte[] columnFamilyName = entry.getKey();<a name="line.8027"></a>
+<span class="sourceLineNo">8028</span>      List&lt;Cell&gt; deltas = entry.getValue();<a name="line.8028"></a>
+<span class="sourceLineNo">8029</span>      // Reckon for the Store what to apply to WAL and MemStore.<a name="line.8029"></a>
+<span class="sourceLineNo">8030</span>      List&lt;Cell&gt; toApply = reckonDeltasByStore(stores.get(columnFamilyName), op, mutation,<a name="line.8030"></a>
+<span class="sourceLineNo">8031</span>        effectiveDurability, now, deltas, results);<a name="line.8031"></a>
+<span class="sourceLineNo">8032</span>      if (!toApply.isEmpty()) {<a name="line.8032"></a>
+<span class="sourceLineNo">8033</span>        for (Cell cell : toApply) {<a name="line.8033"></a>
+<span class="sourceLineNo">8034</span>          HStore store = getStore(cell);<a name="line.8034"></a>
+<span class="sourceLineNo">8035</span>          if (store == null) {<a name="line.8035"></a>
+<span class="sourceLineNo">8036</span>            checkFamily(CellUtil.cloneFamily(cell));<a name="line.8036"></a>
+<span class="sourceLineNo">8037</span>          } else {<a name="line.8037"></a>
+<span class="sourceLineNo">8038</span>            forMemStore.computeIfAbsent(store, key -&gt; new ArrayList&lt;&gt;()).add(cell);<a name="line.8038"></a>
 <span class="sourceLineNo">8039</span>          }<a name="line.8039"></a>
-<span class="sourceLineNo">8040</span>          walEdit.getCells().addAll(toApply);<a name="line.8040"></a>
-<span class="sourceLineNo">8041</span>        }<a name="line.8041"></a>
-<span class="sourceLineNo">8042</span>      }<a name="line.8042"></a>
-<span class="sourceLineNo">8043</span>    }<a name="line.8043"></a>
-<span class="sourceLineNo">8044</span>    return walEdit;<a name="line.8044"></a>
-<span class="sourceLineNo">8045</span>  }<a name="line.8045"></a>
-<span class="sourceLineNo">8046</span><a name="line.8046"></a>
-<span class="sourceLineNo">8047</span>  /**<a name="line.8047"></a>
-<span class="sourceLineNo">8048</span>   * Reckon the Cells to apply to WAL, memstore, and to return to the Client in passed<a name="line.8048"></a>
-<span class="sourceLineNo">8049</span>   * column family/Store.<a name="line.8049"></a>
-<span class="sourceLineNo">8050</span>   *<a name="line.8050"></a>
-<span class="sourceLineNo">8051</span>   * Does Get of current value and then adds passed in deltas for this Store returning the result.<a name="line.8051"></a>
-<span class="sourceLineNo">8052</span>   *<a name="line.8052"></a>
-<span class="sourceLineNo">8053</span>   * @param op Whether Increment or Append<a name="line.8053"></a>
-<span class="sourceLineNo">8054</span>   * @param mutation The encompassing Mutation object<a name="line.8054"></a>
-<span class="sourceLineNo">8055</span>   * @param deltas Changes to apply to this Store; either increment amount or data to append<a name="line.8055"></a>
-<span class="sourceLineNo">8056</span>   * @param results In here we accumulate all the Cells we are to return to the client. If null,<a name="line.8056"></a>
-<span class="sourceLineNo">8057</span>   *                client doesn't want results returned.<a name="line.8057"></a>
-<span class="sourceLineNo">8058</span>   * @return Resulting Cells after &lt;code&gt;deltas&lt;/code&gt; have been applied to current<a name="line.8058"></a>
-<span class="sourceLineNo">8059</span>   *  values. Side effect is our filling out of the &lt;code&gt;results&lt;/code&gt; List.<a name="line.8059"></a>
-<span class="sourceLineNo">8060</span>   */<a name="line.8060"></a>
-<span class="sourceLineNo">8061</span>  private List&lt;Cell&gt; reckonDeltasByStore(HStore store, Operation op, Mutation mutation,<a name="line.8061"></a>
-<span class="sourceLineNo">8062</span>      Durability effectiveDurability, long now, List&lt;Cell&gt; deltas, List&lt;Cell&gt; results)<a name="line.8062"></a>
-<span class="sourceLineNo">8063</span>      throws IOException {<a name="line.8063"></a>
-<span class="sourceLineNo">8064</span>    byte[] columnFamily = store.getColumnFamilyDescriptor().getName();<a name="line.8064"></a>
-<span class="sourceLineNo">8065</span>    List&lt;Pair&lt;Cell, Cell&gt;&gt; cellPairs = new ArrayList&lt;&gt;(deltas.size());<a name="line.8065"></a>
-<span class="sourceLineNo">8066</span>    // Get previous values for all columns in this family.<a name="line.8066"></a>
-<span class="sourceLineNo">8067</span>    TimeRange tr = null;<a name="line.8067"></a>
-<span class="sourceLineNo">8068</span>    switch (op) {<a name="line.8068"></a>
-<span class="sourceLineNo">8069</span>      case INCREMENT:<a name="line.8069"></a>
-<span class="sourceLineNo">8070</span>        tr = ((Increment)mutation).getTimeRange();<a name="line.8070"></a>
-<span class="sourceLineNo">8071</span>        break;<a name="line.8071"></a>
-<span class="sourceLineNo">8072</span>      case APPEND:<a name="line.8072"></a>
-<span class="sourceLineNo">8073</span>        tr = ((Append)mutation).getTimeRange();<a name="line.8073"></a>
-<span class="sourceLineNo">8074</span>        break;<a name="line.8074"></a>
-<span class="sourceLineNo">8075</span>      default:<a name="line.8075"></a>
+<span class="sourceLineNo">8040</span>        }<a name="line.8040"></a>
+<span class="sourceLineNo">8041</span>        if (writeToWAL) {<a name="line.8041"></a>
+<span class="sourceLineNo">8042</span>          if (walEdit == null) {<a name="line.8042"></a>
+<span class="sourceLineNo">8043</span>            walEdit = new WALEdit();<a name="line.8043"></a>
+<span class="sourceLineNo">8044</span>          }<a name="line.8044"></a>
+<span class="sourceLineNo">8045</span>          walEdit.getCells().addAll(toApply);<a name="line.8045"></a>
+<span class="sourceLineNo">8046</span>        }<a name="line.8046"></a>
+<span class="sourceLineNo">8047</span>      }<a name="line.8047"></a>
+<span class="sourceLineNo">8048</span>    }<a name="line.8048"></a>
+<span class="sourceLineNo">8049</span>    return walEdit;<a name="line.8049"></a>
+<span class="sourceLineNo">8050</span>  }<a name="line.8050"></a>
+<span class="sourceLineNo">8051</span><a name="line.8051"></a>
+<span class="sourceLineNo">8052</span>  /**<a name="line.8052"></a>
+<span class="sourceLineNo">8053</span>   * Reckon the Cells to apply to WAL, memstore, and to return to the Client in passed<a name="line.8053"></a>
+<span class="sourceLineNo">8054</span>   * column family/Store.<a name="line.8054"></a>
+<span class="sourceLineNo">8055</span>   *<a name="line.8055"></a>
+<span class="sourceLineNo">8056</span>   * Does Get of current value and then adds passed in deltas for this Store returning the result.<a name="line.8056"></a>
+<span class="sourceLineNo">8057</span>   *<a name="line.8057"></a>
+<span class="sourceLineNo">8058</span>   * @param op Whether Increment or Append<a name="line.8058"></a>
+<span class="sourceLineNo">8059</span>   * @param mutation The encompassing Mutation object<a name="line.8059"></a>
+<span class="sourceLineNo">8060</span>   * @param deltas Changes to apply to this Store; either increment amount or data to append<a name="line.8060"></a>
+<span class="sourceLineNo">8061</span>   * @param results In here we accumulate all the Cells we are to return to the client. If null,<a name="line.8061"></a>
+<span class="sourceLineNo">8062</span>   *                client doesn't want results returned.<a name="line.8062"></a>
+<span class="sourceLineNo">8063</span>   * @return Resulting Cells after &lt;code&gt;deltas&lt;/code&gt; have been applied to current<a name="line.8063"></a>
+<span class="sourceLineNo">8064</span>   *  values. Side effect is our filling out of the &lt;code&gt;results&lt;/code&gt; List.<a name="line.8064"></a>
+<span class="sourceLineNo">8065</span>   */<a name="line.8065"></a>
+<span class="sourceLineNo">8066</span>  private List&lt;Cell&gt; reckonDeltasByStore(HStore store, Operation op, Mutation mutation,<a name="line.8066"></a>
+<span class="sourceLineNo">8067</span>      Durability effectiveDurability, long now, List&lt;Cell&gt; deltas, List&lt;Cell&gt; results)<a name="line.8067"></a>
+<span class="sourceLineNo">8068</span>      throws IOException {<a name="line.8068"></a>
+<span class="sourceLineNo">8069</span>    byte[] columnFamily = store.getColumnFamilyDescriptor().getName();<a name="line.8069"></a>
+<span class="sourceLineNo">8070</span>    List&lt;Pair&lt;Cell, Cell&gt;&gt; cellPairs = new ArrayList&lt;&gt;(deltas.size());<a name="line.8070"></a>
+<span class="sourceLineNo">8071</span>    // Get previous values for all columns in this family.<a name="line.8071"></a>
+<span class="sourceLineNo">8072</span>    TimeRange tr = null;<a name="line.8072"></a>
+<span class="sourceLineNo">8073</span>    switch (op) {<a name="line.8073"></a>
+<span class="sourceLineNo">8074</span>      case INCREMENT:<a name="line.8074"></a>
+<span class="sourceLineNo">8075</span>        tr = ((Increment)mutation).getTimeRange();<a name="line.8075"></a>
 <span class="sourceLineNo">8076</span>        break;<a name="line.8076"></a>
-<span class="sourceLineNo">8077</span>    }<a name="line.8077"></a>
-<span class="sourceLineNo">8078</span>    List&lt;Cell&gt; currentValues = get(mutation, store, deltas,null, tr);<a name="line.8078"></a>
-<span class="sourceLineNo">8079</span>    // Iterate the input columns and update existing values if they were found, otherwise<a name="line.8079"></a>
-<span class="sourceLineNo">8080</span>    // add new column initialized to the delta amount<a name="line.8080"></a>
-<span class="sourceLineNo">8081</span>    int currentValuesIndex = 0;<a name="line.8081"></a>
-<span class="sourceLineNo">8082</span>    for (int i = 0; i &lt; deltas.size(); i++) {<a name="line.8082"></a>
-<span class="sourceLineNo">8083</span>      Cell delta = deltas.get(i);<a name="line.8083"></a>
-<span class="sourceLineNo">8084</span>      Cell currentValue = null;<a name="line.8084"></a>
-<span class="sourceLineNo">8085</span>      if (currentValuesIndex &lt; currentValues.size() &amp;&amp;<a name="line.8085"></a>
-<span class="sourceLineNo">8086</span>          CellUtil.matchingQualifier(currentValues.get(currentValuesIndex), delta)) {<a name="line.8086"></a>
-<span class="sourceLineNo">8087</span>        currentValue = currentValues.get(currentValuesIndex);<a name="line.8087"></a>
-<span class="sourceLineNo">8088</span>        if (i &lt; (deltas.size() - 1) &amp;&amp; !CellUtil.matchingQualifier(delta, deltas.get(i + 1))) {<a name="line.8088"></a>
-<span class="sourceLineNo">8089</span>          currentValuesIndex++;<a name="line.8089"></a>
-<span class="sourceLineNo">8090</span>        }<a name="line.8090"></a>
-<span class="sourceLineNo">8091</span>      }<a name="line.8091"></a>
-<span class="sourceLineNo">8092</span><a name="line.8092"></a>
-<span class="sourceLineNo">8093</span>      // Switch on whether this an increment or an append building the new Cell to apply.<a name="line.8093"></a>
-<span class="sourceLineNo">8094</span>      Cell newCell = null;<a name="line.8094"></a>
-<span class="sourceLineNo">8095</span>      switch (op) {<a name="line.8095"></a>
-<span class="sourceLineNo">8096</span>        case INCREMENT:<a name="line.8096"></a>
-<span class="sourceLineNo">8097</span>          long deltaAmount = getLongValue(delta);<a name="line.8097"></a>
-<span class="sourceLineNo">8098</span>          final long newValue = currentValue == null ? deltaAmount : getLongValue(currentValue) + deltaAmount;<a name="line.8098"></a>
-<span class="sourceLineNo">8099</span>          newCell = reckonDelta(delta, currentValue, columnFamily, now, mutation, (oldCell) -&gt; Bytes.toBytes(newValue));<a name="line.8099"></a>
-<span class="sourceLineNo">8100</span>          break;<a name="line.8100"></a>
-<span class="sourceLineNo">8101</span>        case APPEND:<a name="line.8101"></a>
-<span class="sourceLineNo">8102</span>          newCell = reckonDelta(delta, currentValue, columnFamily, now, mutation, (oldCell) -&gt;<a name="line.8102"></a>
-<span class="sourceLineNo">8103</span>            ByteBuffer.wrap(new byte[delta.getValueLength() + oldCell.getValueLength()])<a name="line.8103"></a>
-<span class="sourceLineNo">8104</span>                    .put(oldCell.getValueArray(), oldCell.getValueOffset(), oldCell.getValueLength())<a name="line.8104"></a>
-<span class="sourceLineNo">8105</span>                    .put(delta.getValueArray(), delta.getValueOffset(), delta.getValueLength())<a name="line.8105"></a>
-<span class="sourceLineNo">8106</span>                    .array()<a name="line.8106"></a>
-<span class="sourceLineNo">8107</span>          );<a name="line.8107"></a>
-<span class="sourceLineNo">8108</span>          break;<a name="line.8108"></a>
-<span class="sourceLineNo">8109</span>        default: throw new UnsupportedOperationException(op.toString());<a name="line.8109"></a>
-<span class="sourceLineNo">8110</span>      }<a name="line.8110"></a>
-<span class="sourceLineNo">8111</span>      int newCellSize = PrivateCellUtil.estimatedSerializedSizeOf(newCell);<a name="line.8111"></a>
-<span class="sourceLineNo">8112</span>      if (newCellSize &gt; this.maxCellSize) {<a name="line.8112"></a>
-<span class="sourceLineNo">8113</span>        String msg = "Cell with size " + newCellSize + " exceeds limit of " +<a name="line.8113"></a>
-<span class="sourceLineNo">8114</span>            this.maxCellSize + " bytes";<a name="line.8114"></a>
-<span class="sourceLineNo">8115</span>        if (LOG.isDebugEnabled()) {<a name="line.8115"></a>
-<span class="sourceLineNo">8116</span>          LOG.debug(msg);<a name="line.8116"></a>
-<span class="sourceLineNo">8117</span>        }<a name="line.8117"></a>
-<span class="sourceLineNo">8118</span>        throw new DoNotRetryIOException(msg);<a name="line.8118"></a>
-<span class="sourceLineNo">8119</span>      }<a name="line.8119"></a>
-<span class="sourceLineNo">8120</span>      cellPairs.add(new Pair&lt;&gt;(currentValue, newCell));<a name="line.8120"></a>
-<span class="sourceLineNo">8121</span>      // Add to results to get returned to the Client. If null, cilent does not want results.<a name="line.8121"></a>
-<span class="sourceLineNo">8122</span>      if (results != null) {<a name="line.8122"></a>
-<span class="sourceLineNo">8123</span>        results.add(newCell);<a name="line.8123"></a>
+<span class="sourceLineNo">8077</span>      case APPEND:<a name="line.8077"></a>
+<span class="sourceLineNo">8078</span>        tr = ((Append)mutation).getTimeRange();<a name="line.8078"></a>
+<span class="sourceLineNo">8079</span>        break;<a name="line.8079"></a>
+<span class="sourceLineNo">8080</span>      default:<a name="line.8080"></a>
+<span class="sourceLineNo">8081</span>        break;<a name="line.8081"></a>
+<span class="sourceLineNo">8082</span>    }<a name="line.8082"></a>
+<span class="sourceLineNo">8083</span>    List&lt;Cell&gt; currentValues = get(mutation, store, deltas,null, tr);<a name="line.8083"></a>
+<span class="sourceLineNo">8084</span>    // Iterate the input columns and update existing values if they were found, otherwise<a name="line.8084"></a>
+<span class="sourceLineNo">8085</span>    // add new column initialized to the delta amount<a name="line.8085"></a>
+<span class="sourceLineNo">8086</span>    int currentValuesIndex = 0;<a name="line.8086"></a>
+<span class="sourceLineNo">8087</span>    for (int i = 0; i &lt; deltas.size(); i++) {<a name="line.8087"></a>
+<span class="sourceLineNo">8088</span>      Cell delta = deltas.get(i);<a name="line.8088"></a>
+<span class="sourceLineNo">8089</span>      Cell currentValue = null;<a name="line.8089"></a>
+<span class="sourceLineNo">8090</span>      if (currentValuesIndex &lt; currentValues.size() &amp;&amp;<a name="line.8090"></a>
+<span class="sourceLineNo">8091</span>          CellUtil.matchingQualifier(currentValues.get(currentValuesIndex), delta)) {<a name="line.8091"></a>
+<span class="sourceLineNo">8092</span>        currentValue = currentValues.get(currentValuesIndex);<a name="line.8092"></a>
+<span class="sourceLineNo">8093</span>        if (i &lt; (deltas.size() - 1) &amp;&amp; !CellUtil.matchingQualifier(delta, deltas.get(i + 1))) {<a name="line.8093"></a>
+<span class="sourceLineNo">8094</span>          currentValuesIndex++;<a name="line.8094"></a>
+<span class="sourceLineNo">8095</span>        }<a name="line.8095"></a>
+<span class="sourceLineNo">8096</span>      }<a name="line.8096"></a>
+<span class="sourceLineNo">8097</span><a name="line.8097"></a>
+<span class="sourceLineNo">8098</span>      // Switch on whether this an increment or an append building the new Cell to apply.<a name="line.8098"></a>
+<span class="sourceLineNo">8099</span>      Cell newCell = null;<a name="line.8099"></a>
+<span class="sourceLineNo">8100</span>      switch (op) {<a name="line.8100"></a>
+<span class="sourceLineNo">8101</span>        case INCREMENT:<a name="line.8101"></a>
+<span class="sourceLineNo">8102</span>          long deltaAmount = getLongValue(delta);<a name="line.8102"></a>
+<span class="sourceLineNo">8103</span>          final long newValue = currentValue == null ? deltaAmount : getLongValue(currentValue) + deltaAmount;<a name="line.8103"></a>
+<span class="sourceLineNo">8104</span>          newCell = reckonDelta(delta, currentValue, columnFamily, now, mutation, (oldCell) -&gt; Bytes.toBytes(newValue));<a name="line.8104"></a>
+<span class="sourceLineNo">8105</span>          break;<a name="line.8105"></a>
+<span class="sourceLineNo">8106</span>        case APPEND:<a name="line.8106"></a>
+<span class="sourceLineNo">8107</span>          newCell = reckonDelta(delta, currentValue, columnFamily, now, mutation, (oldCell) -&gt;<a name="line.8107"></a>
+<span class="sourceLineNo">8108</span>            ByteBuffer.wrap(new byte[delta.getValueLength() + oldCell.getValueLength()])<a name="line.8108"></a>
+<span class="sourceLineNo">8109</span>                    .put(oldCell.getValueArray(), oldCell.getValueOffset(), oldCell.getValueLength())<a name="line.8109"></a>
+<span class="sourceLineNo">8110</span>                    .put(delta.getValueArray(), delta.getValueOffset(), delta.getValueLength())<a name="line.8110"></a>
+<span class="sourceLineNo">8111</span>                    .array()<a name="line.8111"></a>
+<span class="sourceLineNo">8112</span>          );<a name="line.8112"></a>
+<span class="sourceLineNo">8113</span>          break;<a name="line.8113"></a>
+<span class="sourceLineNo">8114</span>        default: throw new UnsupportedOperationException(op.toString());<a name="line.8114"></a>
+<span class="sourceLineNo">8115</span>      }<a name="line.8115"></a>
+<span class="sourceLineNo">8116</span>      int newCellSize = PrivateCellUtil.estimatedSerializedSizeOf(newCell);<a name="line.8116"></a>
+<span class="sourceLineNo">8117</span>      if (newCellSize &gt; this.maxCellSize) {<a name="line.8117"></a>
+<span class="sourceLineNo">8118</span>        String msg = "Cell with size " + newCellSize + " exceeds limit of " +<a name="line.8118"></a>
+<span class="sourceLineNo">8119</span>            this.maxCellSize + " bytes";<a name="line.8119"></a>
+<span class="sourceLineNo">8120</span>        if (LOG.isDebugEnabled()) {<a name="line.8120"></a>
+<span class="sourceLineNo">8121</span>          LOG.debug(msg);<a name="line.8121"></a>
+<span class="sourceLineNo">8122</span>        }<a name="line.8122"></a>
+<span class="sourceLineNo">8123</span>        throw new DoNotRetryIOException(msg);<a name="line.8123"></a>
 <span class="sourceLineNo">8124</span>      }<a name="line.8124"></a>
-<span class="sourceLineNo">8125</span>    }<a name="line.8125"></a>
-<span class="sourceLineNo">8126</span><a name="line.8126"></a>
-<span class="sourceLineNo">8127</span>    // Give coprocessors a chance to update the new cells before apply to WAL or memstore<a name="line.8127"></a>
-<span class="sourceLineNo">8128</span>    if (coprocessorHost != null) {<a name="line.8128"></a>
-<span class="sourceLineNo">8129</span>      // Here the operation must be increment or append.<a name="line.8129"></a>
-<span class="sourceLineNo">8130</span>      cellPairs = op == Operation.INCREMENT ?<a name="line.8130"></a>
-<span class="sourceLineNo">8131</span>          coprocessorHost.postIncrementBeforeWAL(mutation, cellPairs) :<a name="line.8131"></a>
-<span class="sourceLineNo">8132</span>          coprocessorHost.postAppendBeforeWAL(mutation, cellPairs);<a name="line.8132"></a>
-<span class="sourceLineNo">8133</span>    }<a name="line.8133"></a>
-<span class="sourceLineNo">8134</span>    return cellPairs.stream().map(Pair::getSecond).collect(Collectors.toList());<a name="line.8134"></a>
-<span class="sourceLineNo">8135</span>  }<a name="line.8135"></a>
-<span class="sourceLineNo">8136</span><a name="line.8136"></a>
-<span class="sourceLineNo">8137</span>  private static Cell reckonDelta(final Cell delta, final Cell currentCell,<a name="line.8137"></a>
-<span class="sourceLineNo">8138</span>                                  final byte[] columnFamily, final long now,<a name="line.8138"></a>
-<span class="sourceLineNo">8139</span>                                  Mutation mutation, Function&lt;Cell, byte[]&gt; supplier) throws IOException {<a name="line.8139"></a>
-<span class="sourceLineNo">8140</span>    // Forward any tags found on the delta.<a name="line.8140"></a>
-<span class="sourceLineNo">8141</span>    List&lt;Tag&gt; tags = TagUtil.carryForwardTags(delta);<a name="line.8141"></a>
-<span class="sourceLineNo">8142</span>    tags = TagUtil.carryForwardTTLTag(tags, mutation.getTTL());<a name="line.8142"></a>
-<span class="sourceLineNo">8143</span>    if (currentCell != null) {<a name="line.8143"></a>
-<span class="sourceLineNo">8144</span>      tags = TagUtil.carryForwardTags(tags, currentCell);<a name="line.8144"></a>
-<span class="sourceLineNo">8145</span>      byte[] newValue = supplier.apply(currentCell);<a name="line.8145"></a>
-<span class="sourceLineNo">8146</span>      return ExtendedCellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.8146"></a>
-<span class="sourceLineNo">8147</span>              .setRow(mutation.getRow(), 0, mutation.getRow().length)<a name="line.8147"></a>
-<span class="sourceLineNo">8148</span>              .setFamily(columnFamily, 0, columnFamily.length)<a name="line.8148"></a>
-<span class="sourceLineNo">8149</span>              // copy the qualifier if the cell is located in shared memory.<a name="line.8149"></a>
-<span class="sourceLineNo">8150</span>              .setQualifier(CellUtil.cloneQualifier(delta))<a name="line.8150"></a>
-<span class="sourceLineNo">8151</span>              .setTimestamp(Math.max(currentCell.getTimestamp() + 1, now))<a name="line.8151"></a>
-<span class="sourceLineNo">8152</span>              .setType(KeyValue.Type.Put.getCode())<a name="line.8152"></a>
-<span class="sourceLineNo">8153</span>              .setValue(newValue, 0, newValue.length)<a name="line.8153"></a>
-<span class="sourceLineNo">8154</span>              .setTags(TagUtil.fromList(tags))<a name="line.8154"></a>
-<span class="sourceLineNo">8155</span>              .build();<a name="line.8155"></a>
-<span class="sourceLineNo">8156</span>    } else {<a name="line.8156"></a>
-<span class="sourceLineNo">8157</span>      PrivateCellUtil.updateLatestStamp(delta, now);<a name="line.8157"></a>
-<span class="sourceLineNo">8158</span>      return CollectionUtils.isEmpty(tags) ? delta : PrivateCellUtil.createCell(delta, tags);<a name="line.8158"></a>
-<span class="sourceLineNo">8159</span>    }<a name="line.8159"></a>
-<span class="sourceLineNo">8160</span>  }<a name="line.8160"></a>
-<span class="sourceLineNo">8161</span><a name="line.8161"></a>
-<span class="sourceLineNo">8162</span>  /**<a name="line.8162"></a>
-<span class="sourceLineNo">8163</span>   * @return Get the long out of the passed in Cell<a name="line.8163"></a>
-<span class="sourceLineNo">8164</span>   */<a name="line.8164"></a>
-<span class="sourceLineNo">8165</span>  private static long getLongValue(final Cell cell) throws DoNotRetryIOException {<a name="line.8165"></a>
-<span class="sourceLineNo">8166</span>    int len = cell.getValueLength();<a name="line.8166"></a>
-<span class="sourceLineNo">8167</span>    if (len != Bytes.SIZEOF_LONG) {<a name="line.8167"></a>
-<span class="sourceLineNo">8168</span>      // throw DoNotRetryIOException instead of IllegalArgumentException<a name="line.8168"></a>
-<span class="sourceLineNo">8169</span>      throw new DoNotRetryIOException("Field is not a long, it's " + len + " bytes wide");<a name="line.8169"></a>
-<span class="sourceLineNo">8170</span>    }<a name="line.8170"></a>
-<span class="sourceLineNo">8171</span>    return PrivateCellUtil.getValueAsLong(cell);<a name="line.8171"></a>
-<span class="sourceLineNo">8172</span>  }<a name="line.8172"></a>
-<span class="sourceLineNo">8173</span><a name="line.8173"></a>
-<span class="sourceLineNo">8174</span>  /**<a name="line.8174"></a>
-<span class="sourceLineNo">8175</span>   * Do a specific Get on passed &lt;code&gt;columnFamily&lt;/code&gt; and column qualifiers.<a name="line.8175"></a>
-<span class="sourceLineNo">8176</span>   * @param mutation Mutation we are doing this Get for.<a name="line.8176"></a>
-<span class="sourceLineNo">8177</span>   * @param store Which column family on row (TODO: Go all Gets in one go)<a name="line.8177"></a>
-<span class="sourceLineNo">8178</span>   * @param coordinates Cells from &lt;code&gt;mutation&lt;/code&gt; used as coordinates applied to Get.<a name="line.8178"></a>
-<span class="sourceLineNo">8179</span>   * @return Return list of Cells found.<a name="line.8179"></a>
-<span class="sourceLineNo">8180</span>   */<a name="line.8180"></a>
-<span class="sourceLineNo">8181</span>  private List&lt;Cell&gt; get(Mutation mutation, HStore store, List&lt;Cell&gt; coordinates,<a name="line.8181"></a>
-<span class="sourceLineNo">8182</span>      IsolationLevel isolation, TimeRange tr) throws IOException {<a name="line.8182"></a>
-<span class="sourceLineNo">8183</span>    // Sort the cells so that they match the order that they appear in the Get results. Otherwise,<a name="line.8183"></a>
-<span class="sourceLineNo">8184</span>    // we won't be able to find the existing values if the cells are not specified in order by the<a name="line.8184"></a>
-<span class="sourceLineNo">8185</span>    // client since cells are in an array list.<a name="line.8185"></a>
-<span class="sourceLineNo">8186</span>    // TODO: I don't get why we are sorting. St.Ack 20150107<a name="line.8186"></a>
-<span class="sourceLineNo">8187</span>    sort(coordinates, store.getComparator());<a name="line.8187"></a>
-<span class="sourceLineNo">8188</span>    Get get = new Get(mutation.getRow());<a name="line.8188"></a>
-<span class="sourceLineNo">8189</span>    if (isolation != null) {<a name="line.8189"></a>
-<span class="sourceLineNo">8190</span>      get.setIsolationLevel(isolation);<a name="line.8190"></a>
-<span class="sourceLineNo">8191</span>    }<a name="line.8191"></a>
-<span class="sourceLineNo">8192</span>    for (Cell cell: coordinates) {<a name="line.8192"></a>
-<span class="sourceLineNo">8193</span>      get.addColumn(store.getColumnFamilyDescriptor().getName(), CellUtil.cloneQualifier(cell));<a name="line.8193"></a>
-<span class="sourceLineNo">8194</span>    }<a name="line.8194"></a>
-<span class="sourceLineNo">8195</span>    // Increments carry time range. If an Increment instance, put it on the Get.<a name="line.8195"></a>
-<span class="sourceLineNo">8196</span>    if (tr != null) {<a name="line.8196"></a>
-<span class="sourceLineNo">8197</span>      get.setTimeRange(tr.getMin(), tr.getMax());<a name="line.8197"></a>
-<span class="sourceLineNo">8198</span>    }<a name="line.8198"></a>
-<span class="sourceLineNo">8199</span>    return get(get, false);<a name="line.8199"></a>
-<span class="sourceLineNo">8200</span>  }<a name="line.8200"></a>
-<span class="sourceLineNo">8201</span><a name="line.8201"></a>
-<span class="sourceLineNo">8202</span>  /**<a name="line.8202"></a>
-<span class="sourceLineNo">8203</span>   * @return Sorted list of &lt;code&gt;cells&lt;/code&gt; using &lt;code&gt;comparator&lt;/code&gt;<a name="line.8203"></a>
-<span class="sourceLineNo">8204</span>   */<a name="line.8204"></a>
-<span class="sourceLineNo">8205</span>  private static List&lt;Cell&gt; sort(List&lt;Cell&gt; cells, final CellComparator comparator) {<a name="line.8205"></a>
-<span class="sourceLineNo">8206</span>    cells.sort(comparator);<a name="line.8206"></a>
-<span class="sourceLineNo">8207</span>    return cells;<a name="line.8207"></a>
-<span class="sourceLineNo">8208</span>  }<a name="line.8208"></a>
-<span class="sourceLineNo">8209</span><a name="line.8209"></a>
-<span class="sourceLineNo">8210</span>  public static final long FIXED_OVERHEAD = ClassSize.align(<a name="line.8210"></a>
-<span class="sourceLineNo">8211</span>      ClassSize.OBJECT +<a name="line.8211"></a>
-<span class="sourceLineNo">8212</span>      ClassSize.ARRAY +<a name="line.8212"></a>
-<span class="sourceLineNo">8213</span>      55 * ClassSize.REFERENCE + 3 * Bytes.SIZEOF_INT +<a name="line.8213"></a>
-<span class="sourceLineNo">8214</span>      (15 * Bytes.SIZEOF_LONG) +<a name="line.8214"></a>
-<span class="sourceLineNo">8215</span>      3 * Bytes.SIZEOF_BOOLEAN);<a name="line.8215"></a>
-<span class="sourceLineNo">8216</span><a name="line.8216"></a>
-<span class="sourceLineNo">8217</span>  // woefully out of date - currently missing:<a name="line.8217"></a>
-<span class="sourceLineNo">8218</span>  // 1 x HashMap - coprocessorServiceHandlers<a name="line.8218"></a>
-<span class="sourceLineNo">8219</span>  // 6 x LongAdder - numMutationsWithoutWAL, dataInMemoryWithoutWAL,<a name="line.8219"></a>
-<span class="sourceLineNo">8220</span>  //   checkAndMutateChecksPassed, checkAndMutateChecksFailed, readRequestsCount,<a name="line.8220"></a>
-<span class="sourceLineNo">8221</span>  //   writeRequestsCount, cpRequestsCount<a name="line.8221"></a>
-<span class="sourceLineNo">8222</span>  // 1 x HRegion$WriteState - writestate<a name="line.8222"></a>
-<span class="sourceLineNo">8223</span>  // 1 x RegionCoprocessorHost - coprocessorHost<a name="line.8223"></a>
-<span class="sourceLineNo">8224</span>  // 1 x RegionSplitPolicy - splitPolicy<a name="line.8224"></a>
-<span class="sourceLineNo">8225</span>  // 1 x MetricsRegion - metricsRegion<a name="line.8225"></a>
-<span class="sourceLineNo">8226</span>  // 1 x MetricsRegionWrapperImpl - metricsRegionWrapper<a name="line.8226"></a>
-<span class="sourceLineNo">8227</span>  public static final long DEEP_OVERHEAD = FIXED_OVERHEAD +<a name="line.8227"></a>
-<span class="sourceLineNo">8228</span>      ClassSize.OBJECT + // closeLock<a name="line.8228"></a>
-<span class="sourceLineNo">8229</span>      (2 * ClassSize.ATOMIC_BOOLEAN) + // closed, closing<a name="line.8229"></a>
-<span class="sourceLineNo">8230</span>      (3 * ClassSize.ATOMIC_LONG) + // numPutsWithoutWAL, dataInMemoryWithoutWAL,<a name="line.8230"></a>
-<span class="sourceLineNo">8231</span>                                    // compactionsFailed<a name="line.8231"></a>
-<span class="sourceLineNo">8232</span>      (2 * ClassSize.CONCURRENT_HASHMAP) +  // lockedRows, scannerReadPoints<a name="line.8232"></a>
-<span class="sourceLineNo">8233</span>      WriteState.HEAP_SIZE + // writestate<a name="line.8233"></a>
-<span class="sourceLineNo">8234</span>      ClassSize.CONCURRENT_SKIPLISTMAP + ClassSize.CONCURRENT_SKIPLISTMAP_ENTRY + // stores<a name="line.8234"></a>
-<span class="sourceLineNo">8235</span>      (2 * ClassSize.REENTRANT_LOCK) + // lock, updatesLock<a name="line.8235"></a>
-<span class="sourceLineNo">8236</span>      MultiVersionConcurrencyControl.FIXED_SIZE // mvcc<a name="line.8236"></a>
-<span class="sourceLineNo">8237</span>      + 2 * ClassSize.TREEMAP // maxSeqIdInStores, replicationScopes<a name="line.8237"></a>
-<span class="sourceLineNo">8238</span>      + 2 * ClassSize.ATOMIC_INTEGER // majorInProgress, minorInProgress<a name="line.8238"></a>
-<span class="sourceLineNo">8239</span>      + ClassSize.STORE_SERVICES // store services<a name="line.8239"></a>
-<span class="sourceLineNo">8240</span>      + StoreHotnessProtector.FIXED_SIZE<a name="line.8240"></a>
-<span class="sourceLineNo">8241</span>      ;<a name="line.8241"></a>
-<span class="sourceLineNo">8242</span><a name="line.8242"></a>
-<span class="sourceLineNo">8243</span>  @Override<a name="line.8243"></a>
-<span class="sourceLineNo">8244</span>  public long heapSize() {<a name="line.8244"></a>
-<span class="sourceLineNo">8245</span>    // this does not take into account row locks, recent flushes, mvcc entries, and more<a name="line.8245"></a>
-<span class="sourceLineNo">8246</span>    return DEEP_OVERHEAD + stores.values().stream().mapToLong(HStore::heapSize).sum();<a name="line.8246"></a>
-<span class="sourceLineNo">8247</span>  }<a name="line.8247"></a>
-<span class="sourceLineNo">8248</span><a name="line.8248"></a>
-<span class="sourceLineNo">8249</span>  /**<a name="line.8249"></a>
-<span class="sourceLineNo">8250</span>   * Registers a new protocol buffer {@link Service} subclass as a coprocessor endpoint to<a name="line.8250"></a>
-<span class="sourceLineNo">8251</span>   * be available for handling Region#execService(com.google.protobuf.RpcController,<a name="line.8251"></a>
-<span class="sourceLineNo">8252</span>   *    org.apache.hadoop.hbase.protobuf.generated.ClientProtos.CoprocessorServiceCall) calls.<a name="line.8252"></a>
-<span class="sourceLineNo">8253</span>   *<a name="line.8253"></a>
-<span class="sourceLineNo">8254</span>   * &lt;p&gt;<a name="line.8254"></a>
-<span class="sourceLineNo">8255</span>   * Only a single instance may be registered per region for a given {@link Service} subclass (the<a name="line.8255"></a>
-<span class="sourceLineNo">8256</span>   * instances are keyed on {@link com.google.protobuf.Descriptors.ServiceDescriptor#getFullName()}.<a name="line.8256"></a>
-<span class="sourceLineNo">8257</span>   * After the first registration, subsequent calls with the same service name will fail with<a name="line.8257"></a>
-<span class="sourceLineNo">8258</span>   * a return value of {@code false}.<a name="line.8258"></a>
-<span class="sourceLineNo">8259</span>   * &lt;/p&gt;<a name="line.8259"></a>
-<span class="sourceLineNo">8260</span>   * @param instance the {@code Service} subclass instance to expose as a coprocessor endpoint<a name="line.8260"></a>
-<span class="sourceLineNo">8261</span>   * @return {@code true} if the registration was successful, {@code false}<a name="line.8261"></a>
-<span class="sourceLineNo">8262</span>   * otherwise<a name="line.8262"></a>
-<span class="sourceLineNo">8263</span>   */<a name="line.8263"></a>
-<span class="sourceLineNo">8264</span>  public boolean registerService(com.google.protobuf.Service instance) {<a name="line.8264"></a>
-<span class="sourceLineNo">8265</span>    /*<a name="line.8265"></a>
-<span class="sourceLineNo">8266</span>     * No stacking of instances is allowed for a single service name<a name="line.8266"></a>
-<span class="sourceLineNo">8267</span>     */<a name="line.8267"></a>
-<span class="sourceLineNo">8268</span>    com.google.protobuf.Descriptors.ServiceDescriptor serviceDesc = instance.getDescriptorForType();<a name="line.8268"></a>
-<span class="sourceLineNo">8269</span>    String serviceName = CoprocessorRpcUtils.getServiceName(serviceDesc);<a name="line.8269"></a>
-<span class="sourceLineNo">8270</span>    if (coprocessorServiceHandlers.containsKey(serviceName)) {<a name="line.8270"></a>
-<span class="sourceLineNo">8271</span>      LOG.error("Coprocessor service " + serviceName +<a name="line.8271"></a>
-<span class="sourceLineNo">8272</span>          " already registered, rejecting request from " + instance);<a name="line.8272"></a>
-<span class="sourceLineNo">8273</span>      return false;<a name="line.8273"></a>
-<span class="sourceLineNo">8274</span>    }<a name="line.8274"></a>
-<span class="sourceLineNo">8275</span><a name="line.8275"></a>
-<span class="sourceLineNo">8276</span>    coprocessorServiceHandlers.put(serviceName, instance);<a name="line.8276"></a>
-<span class="sourceLineNo">8277</span>    if (LOG.isDebugEnabled()) {<a name="line.8277"></a>
-<span class="sourceLineNo">8278</span>      LOG.debug("Registered coprocessor service: region=" +<a name="line.8278"></a>
-<span class="sourceLineNo">8279</span>          Bytes.toStringBinary(getRegionInfo().getRegionName()) +<a name="line.8279"></a>
-<span class="sourceLineNo">8280</span>          " service=" + serviceName);<a name="line.8280"></a>
-<span class="sourceLineNo">8281</span>    }<a name="line.8281"></a>
-<span class="sourceLineNo">8282</span>    return true;<a name="line.8282"></a>
-<span class="sourceLineNo">8283</span>  }<a name="line.8283"></a>
-<span class="sourceLineNo">8284</span><a name="line.8284"></a>
-<span class="sourceLineNo">8285</span>  /**<a name="line.8285"></a>
-<span class="sourceLineNo">8286</span>   * Executes a single protocol buffer coprocessor endpoint {@link Service} method using<a name="line.8286"></a>
-<span class="sourceLineNo">8287</span>   * the registered protocol handlers.  {@link Service} implementations must be registered via the<a name="line.8287"></a>
-<span class="sourceLineNo">8288</span>   * {@link #registerService(com.google.protobuf.Service)}<a name="line.8288"></a>
-<span class="sourceLineNo">8289</span>   * method before they are available.<a name="line.8289"></a>
-<span class="sourceLineNo">8290</span>   *<a name="line.8290"></a>
-<span class="sourceLineNo">8291</span>   * @param controller an {@code RpcContoller} implementation to pass to the invoked service<a name="line.8291"></a>
-<span class="sourceLineNo">8292</span>   * @param call a {@code CoprocessorServiceCall} instance identifying the service, method,<a name="line.8292"></a>
-<span class="sourceLineNo">8293</span>   *     and parameters for the method invocation<a name="line.8293"></a>
-<span class="sourceLineNo">8294</span>   * @return a protocol buffer {@code Message} instance containing the method's result<a name="line.8294"></a>
-<span class="sourceLineNo">8295</span>   * @throws IOException if no registered service handler is found or an error<a name="line.8295"></a>
-<span class="sourceLineNo">8296</span>   *     occurs during the invocation<a name="line.8296"></a>
-<span class="sourceLineNo">8297</span>   * @see #registerService(com.google.protobuf.Service)<a name="line.8297"></a>
-<span class="sourceLineNo">8298</span>   */<a name="line.8298"></a>
-<span class="sourceLineNo">8299</span>  public com.google.protobuf.Message execService(com.google.protobuf.RpcController controller,<a name="line.8299"></a>
-<span class="sourceLineNo">8300</span>      CoprocessorServiceCall call) throws IOException {<a name="line.8300"></a>
-<span class="sourceLineNo">8301</span>    String serviceName = call.getServiceName();<a name="line.8301"></a>
-<span class="sourceLineNo">8302</span>    com.google.protobuf.Service service = coprocessorServiceHandlers.get(serviceName);<a name="line.8302"></a>
-<span class="sourceLineNo">8303</span>    if (service == null) {<a name="line.8303"></a>
-<span class="sourceLineNo">8304</span>      throw new UnknownProtocolException(null, "No registered coprocessor service found for " +<a name="line.8304"></a>
-<span class="sourceLineNo">8305</span>          serviceName + " in region " + Bytes.toStringBinary(getRegionInfo().getRegionName()));<a name="line.8305"></a>
-<span class="sourceLineNo">8306</span>    }<a name="line.8306"></a>
-<span class="sourceLineNo">8307</span>    com.google.protobuf.Descriptors.ServiceDescriptor serviceDesc = service.getDescriptorForType();<a name="line.8307"></a>
-<span class="sourceLineNo">8308</span><a name="line.8308"></a>
-<span class="sourceLineNo">8309</span>    cpRequestsCount.increment();<a name="line.8309"></a>
-<span class="sourceLineNo">8310</span>    String methodName = call.getMethodName();<a name="line.8310"></a>
-<span class="sourceLineNo">8311</span>    com.google.protobuf.Descriptors.MethodDescriptor methodDesc =<a name="line.8311"></a>
-<span class="sourceLineNo">8312</span>        CoprocessorRpcUtils.getMethodDescriptor(methodName, serviceDesc);<a name="line.8312"></a>
+<span class="sourceLineNo">8125</span>      cellPairs.add(new Pair&lt;&gt;(currentValue, newCell));<a name="line.8125"></a>
+<span class="sourceLineNo">8126</span>      // Add to results to get returned to the Client. If null, cilent does not want results.<a name="line.8126"></a>
+<span class="sourceLineNo">8127</span>      if (results != null) {<a name="line.8127"></a>
+<span class="sourceLineNo">8128</span>        results.add(newCell);<a name="line.8128"></a>
+<span class="sourceLineNo">8129</span>      }<a name="line.8129"></a>
+<span class="sourceLineNo">8130</span>    }<a name="line.8130"></a>
+<span class="sourceLineNo">8131</span><a name="line.8131"></a>
+<span class="sourceLineNo">8132</span>    // Give coprocessors a chance to update the new cells before apply to WAL or memstore<a name="line.8132"></a>
+<span class="sourceLineNo">8133</span>    if (coprocessorHost != null) {<a name="line.8133"></a>
+<span class="sourceLineNo">8134</span>      // Here the operation must be increment or append.<a name="line.8134"></a>
+<span class="sourceLineNo">8135</span>      cellPairs = op == Operation.INCREMENT ?<a name="line.8135"></a>
+<span class="sourceLineNo">8136</span>          coprocessorHost.postIncrementBeforeWAL(mutation, cellPairs) :<a name="line.8136"></a>
+<span class="sourceLineNo">8137</span>          coprocessorHost.postAppendBeforeWAL(mutation, cellPairs);<a name="line.8137"></a>
+<span class="sourceLineNo">8138</span>    }<a name="line.8138"></a>
+<span class="sourceLineNo">8139</span>    return cellPairs.stream().map(Pair::getSecond).collect(Collectors.toList());<a name="line.8139"></a>
+<span class="sourceLineNo">8140</span>  }<a name="line.8140"></a>
+<span class="sourceLineNo">8141</span><a name="line.8141"></a>
+<span class="sourceLineNo">8142</span>  private static Cell reckonDelta(final Cell delta, final Cell currentCell,<a name="line.8142"></a>
+<span class="sourceLineNo">8143</span>                                  final byte[] columnFamily, final long now,<a name="line.8143"></a>
+<span class="sourceLineNo">8144</span>                                  Mutation mutation, Function&lt;Cell, byte[]&gt; supplier) throws IOException {<a name="line.8144"></a>
+<span class="sourceLineNo">8145</span>    // Forward any tags found on the delta.<a name="line.8145"></a>
+<span class="sourceLineNo">8146</span>    List&lt;Tag&gt; tags = TagUtil.carryForwardTags(delta);<a name="line.8146"></a>
+<span class="sourceLineNo">8147</span>    tags = TagUtil.carryForwardTTLTag(tags, mutation.getTTL());<a name="line.8147"></a>
+<span class="sourceLineNo">8148</span>    if (currentCell != null) {<a name="line.8148"></a>
+<span class="sourceLineNo">8149</span>      tags = TagUtil.carryForwardTags(tags, currentCell);<a name="line.8149"></a>
+<span class="sourceLineNo">8150</span>      byte[] newValue = supplier.apply(currentCell);<a name="line.8150"></a>
+<span class="sourceLineNo">8151</span>      return ExtendedCellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.8151"></a>
+<span class="sourceLineNo">8152</span>              .setRow(mutation.getRow(), 0, mutation.getRow().length)<a name="line.8152"></a>
+<span class="sourceLineNo">8153</span>              .setFamily(columnFamily, 0, columnFamily.length)<a name="line.8153"></a>
+<span class="sourceLineNo">8154</span>              // copy the qualifier if the cell is located in shared memory.<a name="line.8154"></a>
+<span class="sourceLineNo">8155</span>              .setQualifier(CellUtil.cloneQualifier(delta))<a name="line.8155"></a>
+<span class="sourceLineNo">8156</span>              .setTimestamp(Math.max(currentCell.getTimestamp() + 1, now))<a name="line.8156"></a>
+<span class="sourceLineNo">8157</span>              .setType(KeyValue.Type.Put.getCode())<a name="line.8157"></a>
+<span class="sourceLineNo">8158</span>              .setValue(newValue, 0, newValue.length)<a name="line.8158"></a>
+<span class="sourceLineNo">8159</span>              .setTags(TagUtil.fromList(tags))<a name="line.8159"></a>
+<span class="sourceLineNo">8160</span>              .build();<a name="line.8160"></a>
+<span class="sourceLineNo">8161</span>    } else {<a name="line.8161"></a>
+<span class="sourceLineNo">8162</span>      PrivateCellUtil.updateLatestStamp(delta, now);<a name="line.8162"></a>
+<span class="sourceLineNo">8163</span>      return CollectionUtils.isEmpty(tags) ? delta : PrivateCellUtil.createCell(delta, tags);<a name="line.8163"></a>
+<span class="sourceLineNo">8164</span>    }<a name="line.8164"></a>
+<span class="sourceLineNo">8165</span>  }<a name="line.8165"></a>
+<span class="sourceLineNo">8166</span><a name="line.8166"></a>
+<span class="sourceLineNo">8167</span>  /**<a name="line.8167"></a>
+<span class="sourceLineNo">8168</span>   * @return Get the long out of the passed in Cell<a name="line.8168"></a>
+<span class="sourceLineNo">8169</span>   */<a name="line.8169"></a>
+<span class="sourceLineNo">8170</span>  private static long getLongValue(final Cell cell) throws DoNotRetryIOException {<a name="line.8170"></a>
+<span class="sourceLineNo">8171</span>    int len = cell.getValueLength();<a name="line.8171"></a>
+<span class="sourceLineNo">8172</span>    if (len != Bytes.SIZEOF_LONG) {<a name="line.8172"></a>
+<span class="sourceLineNo">8173</span>      // throw DoNotRetryIOException instead of IllegalArgumentException<a name="line.8173"></a>
+<span class="sourceLineNo">8174</span>      throw new DoNotRetryIOException("Field is not a long, it's " + len + " bytes wide");<a name="line.8174"></a>
+<span class="sourceLineNo">8175</span>    }<a name="line.8175"></a>
+<span class="sourceLineNo">8176</span>    return PrivateCellUtil.getValueAsLong(cell);<a name="line.8176"></a>
+<span class="sourceLineNo">8177</span>  }<a name="line.8177"></a>
+<span class="sourceLineNo">8178</span><a name="line.8178"></a>
+<span class="sourceLineNo">8179</span>  /**<a name="line.8179"></a>
+<span class="sourceLineNo">8180</span>   * Do a specific Get on passed &lt;code&gt;columnFamily&lt;/code&gt; and column qualifiers.<a name="line.8180"></a>
+<span class="sourceLineNo">8181</span>   * @param mutation Mutation we are doing this Get for.<a name="line.8181"></a>
+<span class="sourceLineNo">8182</span>   * @param store Which column family on row (TODO: Go all Gets in one go)<a name="line.8182"></a>
+<span class="sourceLineNo">8183</span>   * @param coordinates Cells from &lt;code&gt;mutation&lt;/code&gt; used as coordinates applied to Get.<a name="line.8183"></a>
+<span class="sourceLineNo">8184</span>   * @return Return list of Cells found.<a name="line.8184"></a>
+<span class="sourceLineNo">8185</span>   */<a name="line.8185"></a>
+<span class="sourceLineNo">8186</span>  private List&lt;Cell&gt; get(Mutation mutation, HStore store, List&lt;Cell&gt; coordinates,<a name="line.8186"></a>
+<span class="sourceLineNo">8187</span>      IsolationLevel isolation, TimeRange tr) throws IOException {<a name="line.8187"></a>
+<span class="sourceLineNo">8188</span>    // Sort the cells so that they match the order that they appear in the Get results. Otherwise,<a name="line.8188"></a>
+<span class="sourceLineNo">8189</span>    // we won't be able to find the existing values if the cells are not specified in order by the<a name="line.8189"></a>
+<span class="sourceLineNo">8190</span>    // client since cells are in an array list.<a name="line.8190"></a>
+<span class="sourceLineNo">8191</span>    // TODO: I don't get why we are sorting. St.Ack 20150107<a name="line.8191"></a>
+<span class="sourceLineNo">8192</span>    sort(coordinates, store.getComparator());<a name="line.8192"></a>
+<span class="sourceLineNo">8193</span>    Get get = new Get(mutation.getRow());<a name="line.8193"></a>
+<span class="sourceLineNo">8194</span>    if (isolation != null) {<a name="line.8194"></a>
+<span class="sourceLineNo">8195</span>      get.setIsolationLevel(isolation);<a name="line.8195"></a>
+<span class="sourceLineNo">8196</span>    }<a name="line.8196"></a>
+<span class="sourceLineNo">8197</span>    for (Cell cell: coordinates) {<a name="line.8197"></a>
+<span class="sourceLineNo">8198</span>      get.addColumn(store.getColumnFamilyDescriptor().getName(), CellUtil.cloneQualifier(cell));<a name="line.8198"></a>
+<span class="sourceLineNo">8199</span>    }<a name="line.8199"></a>
+<span class="sourceLineNo">8200</span>    // Increments carry time range. If an Increment instance, put it on the Get.<a name="line.8200"></a>
+<span class="sourceLineNo">8201</span>    if (tr != null) {<a name="line.8201"></a>
+<span class="sourceLineNo">8202</span>      get.setTimeRange(tr.getMin(), tr.getMax());<a name="line.8202"></a>
+<span class="sourceLineNo">8203</span>    }<a name="line.8203"></a>
+<span class="sourceLineNo">8204</span>    return get(get, false);<a name="line.8204"></a>
+<span class="sourceLineNo">8205</span>  }<a name="line.8205"></a>
+<span class="sourceLineNo">8206</span><a name="line.8206"></a>
+<span class="sourceLineNo">8207</span>  /**<a name="line.8207"></a>
+<span class="sourceLineNo">8208</span>   * @return Sorted list of &lt;code&gt;cells&lt;/code&gt; using &lt;code&gt;comparator&lt;/code&gt;<a name="line.8208"></a>
+<span class="sourceLineNo">8209</span>   */<a name="line.8209"></a>
+<span class="sourceLineNo">8210</span>  private static List&lt;Cell&gt; sort(List&lt;Cell&gt; cells, final CellComparator comparator) {<a name="line.8210"></a>
+<span class="sourceLineNo">8211</span>    cells.sort(comparator);<a name="line.8211"></a>
+<span class="sourceLineNo">8212</span>    return cells;<a name="line.8212"></a>
+<span class="sourceLineNo">8213</span>  }<a name="line.8213"></a>
+<span class="sourceLineNo">8214</span><a name="line.8214"></a>
+<span class="sourceLineNo">8215</span>  public static final long FIXED_OVERHEAD = ClassSize.align(<a name="line.8215"></a>
+<span class="sourceLineNo">8216</span>      ClassSize.OBJECT +<a name="line.8216"></a>
+<span class="sourceLineNo">8217</span>      ClassSize.ARRAY +<a name="line.8217"></a>
+<span class="sourceLineNo">8218</span>      55 * ClassSize.REFERENCE + 3 * Bytes.SIZEOF_INT +<a name="line.8218"></a>
+<span class="sourceLineNo">8219</span>      (15 * Bytes.SIZEOF_LONG) +<a name="line.8219"></a>
+<span class="sourceLineNo">8220</span>      3 * Bytes.SIZEOF_BOOLEAN);<a name="line.8220"></a>
+<span class="sourceLineNo">8221</span><a name="line.8221"></a>
+<span class="sourceLineNo">8222</span>  // woefully out of date - currently missing:<a name="line.8222"></a>
+<span class="sourceLineNo">8223</span>  // 1 x HashMap - coprocessorServiceHandlers<a name="line.8223"></a>
+<span class="sourceLineNo">8224</span>  // 6 x LongAdder - numMutationsWithoutWAL, dataInMemoryWithoutWAL,<a name="line.8224"></a>
+<span class="sourceLineNo">8225</span>  //   checkAndMutateChecksPassed, checkAndMutateChecksFailed, readRequestsCount,<a name="line.8225"></a>
+<span class="sourceLineNo">8226</span>  //   writeRequestsCount, cpRequestsCount<a name="line.8226"></a>
+<span class="sourceLineNo">8227</span>  // 1 x HRegion$WriteState - writestate<a name="line.8227"></a>
+<span class="sourceLineNo">8228</span>  // 1 x RegionCoprocessorHost - coprocessorHost<a name="line.8228"></a>
+<span class="sourceLineNo">8229</span>  // 1 x RegionSplitPolicy - splitPolicy<a name="line.8229"></a>
+<span class="sourceLineNo">8230</span>  // 1 x MetricsRegion - metricsRegion<a name="line.8230"></a>
+<span class="sourceLineNo">8231</span>  // 1 x MetricsRegionWrapperImpl - metricsRegionWrapper<a name="line.8231"></a>
+<span class="sourceLineNo">8232</span>  public static final long DEEP_OVERHEAD = FIXED_OVERHEAD +<a name="line.8232"></a>
+<span class="sourceLineNo">8233</span>      ClassSize.OBJECT + // closeLock<a name="line.8233"></a>
+<span class="sourceLineNo">8234</span>      (2 * ClassSize.ATOMIC_BOOLEAN) + // closed, closing<a name="line.8234"></a>
+<span class="sourceLineNo">8235</span>      (3 * ClassSize.ATOMIC_LONG) + // numPutsWithoutWAL, dataInMemoryWithoutWAL,<a name="line.8235"></a>
+<span class="sourceLineNo">8236</span>                                    // compactionsFailed<a name="line.8236"></a>
+<span class="sourceLineNo">8237</span>      (2 * ClassSize.CONCURRENT_HASHMAP) +  // lockedRows, scannerReadPoints<a name="line.8237"></a>
+<span class="sourceLineNo">8238</span>      WriteState.HEAP_SIZE + // writestate<a name="line.8238"></a>
+<span class="sourceLineNo">8239</span>      ClassSize.CONCURRENT_SKIPLISTMAP + ClassSize.CONCURRENT_SKIPLISTMAP_ENTRY + // stores<a name="line.8239"></a>
+<span class="sourceLineNo">8240</span>      (2 * ClassSize.REENTRANT_LOCK) + // lock, updatesLock<a name="line.8240"></a>
+<span class="sourceLineNo">8241</span>      MultiVersionConcurrencyControl.FIXED_SIZE // mvcc<a name="line.8241"></a>
+<span class="sourceLineNo">8242</span>      + 2 * ClassSize.TREEMAP // maxSeqIdInStores, replicationScopes<a name="line.8242"></a>
+<span class="sourceLineNo">8243</span>      + 2 * ClassSize.ATOMIC_INTEGER // majorInProgress, minorInProgress<a name="line.8243"></a>
+<span class="sourceLineNo">8244</span>      + ClassSize.STORE_SERVICES // store services<a name="line.8244"></a>
+<span class="sourceLineNo">8245</span>      + StoreHotnessProtector.FIXED_SIZE<a name="line.8245"></a>
+<span class="sourceLineNo">8246</span>      ;<a name="line.8246"></a>
+<span class="sourceLineNo">8247</span><a name="line.8247"></a>
+<span class="sourceLineNo">8248</span>  @Override<a name="line.8248"></a>
+<span class="sourceLineNo">8249</span>  public long heapSize() {<a name="line.8249"></a>
+<span class="sourceLineNo">8250</span>    // this does not take into account row locks, recent flushes, mvcc entries, and more<a name="line.8250"></a>
+<span class="sourceLineNo">8251</span>    return DEEP_OVERHEAD + stores.values().stream().mapToLong(HStore::heapSize).sum();<a name="line.8251"></a>
+<span class="sourceLineNo">8252</span>  }<a name="line.8252"></a>
+<span class="sourceLineNo">8253</span><a name="line.8253"></a>
+<span class="sourceLineNo">8254</span>  /**<a name="line.8254"></a>
+<span class="sourceLineNo">8255</span>   * Registers a new protocol buffer {@link Service} subclass as a coprocessor endpoint to<a name="line.8255"></a>
+<span class="sourceLineNo">8256</span>   * be available for handling Region#execService(com.google.protobuf.RpcController,<a name="line.8256"></a>
+<span class="sourceLineNo">8257</span>   *    org.apache.hadoop.hbase.protobuf.generated.ClientProtos.CoprocessorServiceCall) calls.<a name="line.8257"></a>
+<span class="sourceLineNo">8258</span>   *<a name="line.8258"></a>
+<span class="sourceLineNo">8259</span>   * &lt;p&gt;<a name="line.8259"></a>
+<span class="sourceLineNo">8260</span>   * Only a single instance may be registered per region for a given {@link Service} subclass (the<a name="line.8260"></a>
+<span class="sourceLineNo">8261</span>   * instances are keyed on {@link com.google.protobuf.Descriptors.ServiceDescriptor#getFullName()}.<a name="line.8261"></a>
+<span class="sourceLineNo">8262</span>   * After the first registration, subsequent calls with the same service name will fail with<a name="line.8262"></a>
+<span class="sourceLineNo">8263</span>   * a return value of {@code false}.<a name="line.8263"></a>
+<span class="sourceLineNo">8264</span>   * &lt;/p&gt;<a name="line.8264"></a>
+<span class="sourceLineNo">8265</span>   * @param instance the {@code Service} subclass instance to expose as a coprocessor endpoint<a name="line.8265"></a>
+<span class="sourceLineNo">8266</span>   * @return {@code true} if the registration was successful, {@code false}<a name="line.8266"></a>
+<span class="sourceLineNo">8267</span>   * otherwise<a name="line.8267"></a>
+<span class="sourceLineNo">8268</span>   */<a name="line.8268"></a>
+<span class="sourceLineNo">8269</span>  public boolean registerService(com.google.protobuf.Service instance) {<a name="line.8269"></a>
+<span class="sourceLineNo">8270</span>    /*<a name="line.8270"></a>
+<span class="sourceLineNo">8271</span>     * No stacking of instances is allowed for a single service name<a name="line.8271"></a>
+<span class="sourceLineNo">8272</span>     */<a name="line.8272"></a>
+<span class="sourceLineNo">8273</span>    com.google.protobuf.Descriptors.ServiceDescriptor serviceDesc = instance.getDescriptorForType();<a name="line.8273"></a>
+<span class="sourceLineNo">8274</span>    String serviceName = CoprocessorRpcUtils.getServiceName(serviceDesc);<a name="line.8274"></a>
+<span class="sourceLineNo">8275</span>    if (coprocessorServiceHandlers.containsKey(serviceName)) {<a name="line.8275"></a>
+<span class="sourceLineNo">8276</span>      LOG.error("Coprocessor service " + serviceName +<a name="line.8276"></a>
+<span class="sourceLineNo">8277</span>          " already registered, rejecting request from " + instance);<a name="line.8277"></a>
+<span class="sourceLineNo">8278</span>      return false;<a name="line.8278"></a>
+<span class="sourceLineNo">8279</span>    }<a name="line.8279"></a>
+<span class="sourceLineNo">8280</span><a name="line.8280"></a>
+<span class="sourceLineNo">8281</span>    coprocessorServiceHandlers.put(serviceName, instance);<a name="line.8281"></a>
+<span class="sourceLineNo">8282</span>    if (LOG.isDebugEnabled()) {<a name="line.8282"></a>
+<span class="sourceLineNo">8283</span>      LOG.debug("Registered coprocessor service: region=" +<a name="line.8283"></a>
+<span class="sourceLineNo">8284</span>          Bytes.toStringBinary(getRegionInfo().getRegionName()) +<a name="line.8284"></a>
+<span class="sourceLineNo">8285</span>          " service=" + serviceName);<a name="line.8285"></a>
+<span class="sourceLineNo">8286</span>    }<a name="line.8286"></a>
+<span class="sourceLineNo">8287</span>    return true;<a name="line.8287"></a>
+<span class="sourceLineNo">8288</span>  }<a name="line.8288"></a>
+<span class="sourceLineNo">8289</span><a name="line.8289"></a>
+<span class="sourceLineNo">8290</span>  /**<a name="line.8290"></a>
+<span class="sourceLineNo">8291</span>   * Executes a single protocol buffer coprocessor endpoint {@link Service} method using<a name="line.8291"></a>
+<span class="sourceLineNo">8292</span>   * the registered protocol handlers.  {@link Service} implementations must be registered via the<a name="line.8292"></a>
+<span class="sourceLineNo">8293</span>   * {@link #registerService(com.google.protobuf.Service)}<a name="line.8293"></a>
+<span class="sourceLineNo">8294</span>   * method before they are available.<a name="line.8294"></a>
+<span class="sourceLineNo">8295</span>   *<a name="line.8295"></a>
+<span class="sourceLineNo">8296</span>   * @param controller an {@code RpcContoller} implementation to pass to the invoked service<a name="line.8296"></a>
+<span class="sourceLineNo">8297</span>   * @param call a {@code CoprocessorServiceCall} instance identifying the service, method,<a name="line.8297"></a>
+<span class="sourceLineNo">8298</span>   *     and parameters for the method invocation<a name="line.8298"></a>
+<span class="sourceLineNo">8299</span>   * @return a protocol buffer {@code Message} instance containing the method's result<a name="line.8299"></a>
+<span class="sourceLineNo">8300</span>   * @throws IOException if no registered service handler is found or an error<a name="line.8300"></a>
+<span class="sourceLineNo">8301</span>   *     occurs during the invocation<a name="line.8301"></a>
+<span class="sourceLineNo">8302</span>   * @see #registerService(com.google.protobuf.Service)<a name="line.8302"></a>
+<span class="sourceLineNo">8303</span>   */<a name="line.8303"></a>
+<span class="sourceLineNo">8304</span>  public com.google.protobuf.Message execService(com.google.protobuf.RpcController controller,<a name="line.8304"></a>
+<span class="sourceLineNo">8305</span>      CoprocessorServiceCall call) throws IOException {<a name="line.8305"></a>
+<span class="sourceLineNo">8306</span>    String serviceName = call.getServiceName();<a name="line.8306"></a>
+<span class="sourceLineNo">8307</span>    com.google.protobuf.Service service = coprocessorServiceHandlers.get(serviceName);<a name="line.8307"></a>
+<span class="sourceLineNo">8308</span>    if (service == null) {<a name="line.8308"></a>
+<span class="sourceLineNo">8309</span>      throw new UnknownProtocolException(null, "No registered coprocessor service found for " +<a name="line.8309"></a>
+<span class="sourceLineNo">8310</span>          serviceName + " in region " + Bytes.toStringBinary(getRegionInfo().getRegionName()));<a name="line.8310"></a>
+<span class="sourceLineNo">8311</span>    }<a name="line.8311"></a>
+<span class="sourceLineNo">8312</span>    com.google.protobuf.Descriptors.ServiceDescriptor serviceDesc = service.getDescriptorForType();<a name="line.8312"></a>
 <span class="sourceLineNo">8313</span><a name="line.8313"></a>
-<span class="sourceLineNo">8314</span>    com.google.protobuf.Message.Builder builder =<a name="line.8314"></a>
-<span class="sourceLineNo">8315</span>        service.getRequestPrototype(methodDesc).newBuilderForType();<a name="line.8315"></a>
-<span class="sourceLineNo">8316</span><a name="line.8316"></a>
-<span class="sourceLineNo">8317</span>    org.apache.hadoop.hbase.protobuf.ProtobufUtil.mergeFrom(builder,<a name="line.8317"></a>
-<span class="sourceLineNo">8318</span>        call.getRequest().toByteArray());<a name="line.8318"></a>
-<span class="sourceLineNo">8319</span>    com.google.protobuf.Message request =<a name="line.8319"></a>
-<span class="sourceLineNo">8320</span>        CoprocessorRpcUtils.getRequest(service, methodDesc, call.getRequest());<a name="line.8320"></a>
+<span class="sourceLineNo">8314</span>    cpRequestsCount.increment();<a name="line.8314"></a>
+<span class="sourceLineNo">8315</span>    String methodName = call.getMethodName();<a name="line.8315"></a>
+<span class="sourceLineNo">8316</span>    com.google.protobuf.Descriptors.MethodDescriptor methodDesc =<a name="line.8316"></a>
+<span class="sourceLineNo">8317</span>        CoprocessorRpcUtils.getMethodDescriptor(methodName, serviceDesc);<a name="line.8317"></a>
+<span class="sourceLineNo">8318</span><a name="line.8318"></a>
+<span class="sourceLineNo">8319</span>    com.google.protobuf.Message.Builder builder =<a name="line.8319"></a>
+<span class="sourceLineNo">8320</span>        service.getRequestPrototype(methodDesc).newBuilderForType();<a name="line.8320"></a>
 <span class="sourceLineNo">8321</span><a name="line.8321"></a>
-<span class="sourceLineNo">8322</span>    if (coprocessorHost != null) {<a name="line.8322"></a>
-<span class="sourceLineNo">8323</span>      request = coprocessorHost.preEndpointInvocation(service, methodName, request);<a name="line.8323"></a>
-<span class="sourceLineNo">8324</span>    }<a name="line.8324"></a>
-<span class="sourceLineNo">8325</span><a name="line.8325"></a>
-<span class="sourceLineNo">8326</span>    final com.google.protobuf.Message.Builder responseBuilder =<a name="line.8326"></a>
-<span class="sourceLineNo">8327</span>        service.getResponsePrototype(methodDesc).newBuilderForType();<a name="line.8327"></a>
-<span class="sourceLineNo">8328</span>    service.callMethod(methodDesc, controller, request,<a name="line.8328"></a>
-<span class="sourceLineNo">8329</span>        new com.google.protobuf.RpcCallback&lt;com.google.protobuf.Message&gt;() {<a name="line.8329"></a>
-<span class="sourceLineNo">8330</span>      @Override<a name="line.8330"></a>
-<span class="sourceLineNo">8331</span>      public void run(com.google.protobuf.Message message) {<a name="line.8331"></a>
-<span class="sourceLineNo">8332</span>        if (message != null) {<a name="line.8332"></a>
-<span class="sourceLineNo">8333</span>          responseBuilder.mergeFrom(message);<a name="line.8333"></a>
-<span class="sourceLineNo">8334</span>        }<a name="line.8334"></a>
-<span class="sourceLineNo">8335</span>      }<a name="line.8335"></a>
-<span class="sourceLineNo">8336</span>    });<a name="line.8336"></a>
-<span class="sourceLineNo">8337</span><a name="line.8337"></a>
-<span class="sourceLineNo">8338</span>    if (coprocessorHost != null) {<a name="line.8338"></a>
-<span class="sourceLineNo">8339</span>      coprocessorHost.postEndpointInvocation(service, methodName, request, responseBuilder);<a name="line.8339"></a>
-<span class="sourceLineNo">8340</span>    }<a name="line.8340"></a>
-<span class="sourceLineNo">8341</span>    IOException exception =<a name="line.8341"></a>
-<span class="sourceLineNo">8342</span>        org.apache.hadoop.hbase.ipc.CoprocessorRpcUtils.getControllerException(controller);<a name="line.8342"></a>
-<span class="sourceLineNo">8343</span>    if (exception != null) {<a name="line.8343"></a>
-<span class="sourceLineNo">8344</span>      throw exception;<a name="line.8344"></a>
+<span class="sourceLineNo">8322</span>    org.apache.hadoop.hbase.protobuf.ProtobufUtil.mergeFrom(builder,<a name="line.8322"></a>
+<span class="sourceLineNo">8323</span>        call.getRequest().toByteArray());<a name="line.8323"></a>
+<span class="sourceLineNo">8324</span>    com.google.protobuf.Message request =<a name="line.8324"></a>
+<span class="sourceLineNo">8325</span>        CoprocessorRpcUtils.getRequest(service, methodDesc, call.getRequest());<a name="line.8325"></a>
+<span class="sourceLineNo">8326</span><a name="line.8326"></a>
+<span class="sourceLineNo">8327</span>    if (coprocessorHost != null) {<a name="line.8327"></a>
+<span class="sourceLineNo">8328</span>      request = coprocessorHost.preEndpointInvocation(service, methodName, request);<a name="line.8328"></a>
+<span class="sourceLineNo">8329</span>    }<a name="line.8329"></a>
+<span class="sourceLineNo">8330</span><a name="line.8330"></a>
+<span class="sourceLineNo">8331</span>    final com.google.protobuf.Message.Builder responseBuilder =<a name="line.8331"></a>
+<span class="sourceLineNo">8332</span>        service.getResponsePrototype(methodDesc).newBuilderForType();<a name="line.8332"></a>
+<span class="sourceLineNo">8333</span>    service.callMethod(methodDesc, controller, request,<a name="line.8333"></a>
+<span class="sourceLineNo">8334</span>        new com.google.protobuf.RpcCallback&lt;com.google.protobuf.Message&gt;() {<a name="line.8334"></a>
+<span class="sourceLineNo">8335</span>      @Override<a name="line.8335"></a>
+<span class="sourceLineNo">8336</span>      public void run(com.google.protobuf.Message message) {<a name="line.8336"></a>
+<span class="sourceLineNo">8337</span>        if (message != null) {<a name="line.8337"></a>
+<span class="sourceLineNo">8338</span>          responseBuilder.mergeFrom(message);<a name="line.8338"></a>
+<span class="sourceLineNo">8339</span>        }<a name="line.8339"></a>
+<span class="sourceLineNo">8340</span>      }<a name="line.8340"></a>
+<span class="sourceLineNo">8341</span>    });<a name="line.8341"></a>
+<span class="sourceLineNo">8342</span><a name="line.8342"></a>
+<span class="sourceLineNo">8343</span>    if (coprocessorHost != null) {<a name="line.8343"></a>
+<span class="sourceLineNo">8344</span>      coprocessorHost.postEndpointInvocation(service, methodName, request, responseBuilder);<a name="line.8344"></a>
 <span class="sourceLineNo">8345</span>    }<a name="line.8345"></a>
-<span class="sourceLineNo">8346</span><a name="line.8346"></a>
-<span class="sourceLineNo">8347</span>    return responseBuilder.build();<a name="line.8347"></a>
-<span class="sourceLineNo">8348</span>  }<a name="line.8348"></a>
-<span class="sourceLineNo">8349</span><a name="line.8349"></a>
-<span class="sourceLineNo">8350</span>  boolean shouldForceSplit() {<a name="line.8350"></a>
-<span class="sourceLineNo">8351</span>    return this.splitRequest;<a name="line.8351"></a>
-<span class="sourceLineNo">8352</span>  }<a name="line.8352"></a>
-<span class="sourceLineNo">8353</span><a name="line.8353"></a>
-<span class="sourceLineNo">8354</span>  byte[] getExplicitSplitPoint() {<a name="line.8354"></a>
-<span class="sourceLineNo">8355</span>    return this.explicitSplitPoint;<a name="line.8355"></a>
-<span class="sourceLineNo">8356</span>  }<a name="line.8356"></a>
-<span class="sourceLineNo">8357</span><a name="line.8357"></a>
-<span class="sourceLineNo">8358</span>  void forceSplit(byte[] sp) {<a name="line.8358"></a>
-<span class="sourceLineNo">8359</span>    // This HRegion will go away after the forced split is successful<a name="line.8359"></a>
-<span class="sourceLineNo">8360</span>    // But if a forced split fails, we need to clear forced split.<a name="line.8360"></a>
-<span class="sourceLineNo">8361</span>    this.splitRequest = true;<a name="line.8361"></a>
-<span class="sourceLineNo">8362</span>    if (sp != null) {<a name="line.8362"></a>
-<span class="sourceLineNo">8363</span>      this.explicitSplitPoint = sp;<a name="line.8363"></a>
-<span class="sourceLineNo">8364</span>    }<a name="line.8364"></a>
-<span class="sourceLineNo">8365</span>  }<a name="line.8365"></a>
-<span class="sourceLineNo">8366</span><a name="line.8366"></a>
-<span class="sourceLineNo">8367</span>  void clearSplit() {<a name="line.8367"></a>
-<span class="sourceLineNo">8368</span>    this.splitRequest = false;<a name="line.8368"></a>
-<span class="sourceLineNo">8369</span>    this.explicitSplitPoint = null;<a name="line.8369"></a>
+<span class="sourceLineNo">8346</span>    IOException exception =<a name="line.8346"></a>
+<span class="sourceLineNo">8347</span>        org.apache.hadoop.hbase.ipc.CoprocessorRpcUtils.getControllerException(controller);<a name="line.8347"></a>
+<span class="sourceLineNo">8348</span>    if (exception != null) {<a name="line.8348"></a>
+<span class="sourceLineNo">8349</span>      throw exception;<a name="line.8349"></a>
+<span class="sourceLineNo">8350</span>    }<a name="line.8350"></a>
+<span class="sourceLineNo">8351</span><a name="line.8351"></a>
+<span class="sourceLineNo">8352</span>    return responseBuilder.build();<a name="line.8352"></a>
+<span class="sourceLineNo">8353</span>  }<a name="line.8353"></a>
+<span class="sourceLineNo">8354</span><a name="line.8354"></a>
+<span class="sourceLineNo">8355</span>  boolean shouldForceSplit() {<a name="line.8355"></a>
+<span class="sourceLineNo">8356</span>    return this.splitRequest;<a name="line.8356"></a>
+<span class="sourceLineNo">8357</span>  }<a name="line.8357"></a>
+<span class="sourceLineNo">8358</span><a name="line.8358"></a>
+<span class="sourceLineNo">8359</span>  byte[] getExplicitSplitPoint() {<a name="line.8359"></a>
+<span class="sourceLineNo">8360</span>    return this.explicitSplitPoint;<a name="line.8360"></a>
+<span class="sourceLineNo">8361</span>  }<a name="line.8361"></a>
+<span class="sourceLineNo">8362</span><a name="line.8362"></a>
+<span class="sourceLineNo">8363</span>  void forceSplit(byte[] sp) {<a name="line.8363"></a>
+<span class="sourceLineNo">8364</span>    // This HRegion will go away after the forced split is successful<a name="line.8364"></a>
+<span class="sourceLineNo">8365</span>    // But if a forced split fails, we need to clear forced split.<a name="line.8365"></a>
+<span class="sourceLineNo">8366</span>    this.splitRequest = true;<a name="line.8366"></a>
+<span class="sourceLineNo">8367</span>    if (sp != null) {<a name="line.8367"></a>
+<span class="sourceLineNo">8368</span>      this.explicitSplitPoint = sp;<a name="line.8368"></a>
+<span class="sourceLineNo">8369</span>    }<a name="line.8369"></a>
 <span class="sourceLineNo">8370</span>  }<a name="line.8370"></a>
 <span class="sourceLineNo">8371</span><a name="line.8371"></a>
-<span class="sourceLineNo">8372</span>  /**<a name="line.8372"></a>
-<span class="sourceLineNo">8373</span>   * Return the splitpoint. null indicates the region isn't splittable<a name="line.8373"></a>
-<span class="sourceLineNo">8374</span>   * If the splitpoint isn't explicitly specified, it will go over the stores<a name="line.8374"></a>
-<span class="sourceLineNo">8375</span>   * to find the best splitpoint. Currently the criteria of best splitpoint<a name="line.8375"></a>
-<span class="sourceLineNo">8376</span>   * is based on the size of the store.<a name="line.8376"></a>
-<span class="sourceLineNo">8377</span>   */<a name="line.8377"></a>
-<span class="sourceLineNo">8378</span>  public byte[] checkSplit() {<a name="line.8378"></a>
-<span class="sourceLineNo">8379</span>    // Can't split META<a name="line.8379"></a>
-<span class="sourceLineNo">8380</span>    if (this.getRegionInfo().isMetaRegion()) {<a name="line.8380"></a>
-<span class="sourceLineNo">8381</span>      if (shouldForceSplit()) {<a name="line.8381"></a>
-<span class="sourceLineNo">8382</span>        LOG.warn("Cannot split meta region in HBase 0.20 and above");<a name="line.8382"></a>
-<span class="sourceLineNo">8383</span>      }<a name="line.8383"></a>
-<span class="sourceLineNo">8384</span>      return null;<a name="line.8384"></a>
-<span class="sourceLineNo">8385</span>    }<a name="line.8385"></a>
-<span class="sourceLineNo">8386</span><a name="line.8386"></a>
-<span class="sourceLineNo">8387</span>    // Can't split a region that is closing.<a name="line.8387"></a>
-<span class="sourceLineNo">8388</span>    if (this.isClosing()) {<a name="line.8388"></a>
+<span class="sourceLineNo">8372</span>  void clearSplit() {<a name="line.8372"></a>
+<span class="sourceLineNo">8373</span>    this.splitRequest = false;<a name="line.8373"></a>
+<span class="sourceLineNo">8374</span>    this.explicitSplitPoint = null;<a name="line.8374"></a>
+<span class="sourceLineNo">8375</span>  }<a name="line.8375"></a>
+<span class="sourceLineNo">8376</span><a name="line.8376"></a>
+<span class="sourceLineNo">8377</span>  /**<a name="line.8377"></a>
+<span class="sourceLineNo">8378</span>   * Return the splitpoint. null indicates the region isn't splittable<a name="line.8378"></a>
+<span class="sourceLineNo">8379</span>   * If the splitpoint isn't explicitly specified, it will go over the stores<a name="line.8379"></a>
+<span class="sourceLineNo">8380</span>   * to find the best splitpoint. Currently the criteria of best splitpoint<a name="line.8380"></a>
+<span class="sourceLineNo">8381</span>   * is based on the size of the store.<a name="line.8381"></a>
+<span class="sourceLineNo">8382</span>   */<a name="line.8382"></a>
+<span class="sourceLineNo">8383</span>  public byte[] checkSplit() {<a name="line.8383"></a>
+<span class="sourceLineNo">8384</span>    // Can't split META<a name="line.8384"></a>
+<span class="sourceLineNo">8385</span>    if (this.getRegionInfo().isMetaRegion()) {<a name="line.8385"></a>
+<span class="sourceLineNo">8386</span>      if (shouldForceSplit()) {<a name="line.8386"></a>
+<span class="sourceLineNo">8387</span>        LOG.warn("Cannot split meta region in HBase 0.20 and above");<a name="line.8387"></a>
+<span class="sourceLineNo">8388</span>      }<a name="line.8388"></a>
 <span class="sourceLineNo">8389</span>      return null;<a name="line.8389"></a>
 <span class="sourceLineNo">8390</span>    }<a name="line.8390"></a>
 <span class="sourceLineNo">8391</span><a name="line.8391"></a>
-<span class="sourceLineNo">8392</span>    if (!splitPolicy.shouldSplit()) {<a name="line.8392"></a>
-<span class="sourceLineNo">8393</span>      return null;<a name="line.8393"></a>
-<span class="sourceLineNo">8394</span>    }<a name="line.8394"></a>
-<span class="sourceLineNo">8395</span><a name="line.8395"></a>
-<span class="sourceLineNo">8396</span>    byte[] ret = splitPolicy.getSplitPoint();<a name="line.8396"></a>
-<span class="sourceLineNo">8397</span><a name="line.8397"></a>
-<span class="sourceLineNo">8398</span>    if (ret != null) {<a name="line.8398"></a>
-<span class="sourceLineNo">8399</span>      try {<a name="line.8399"></a>
-<span class="sourceLineNo">8400</span>        checkRow(ret, "calculated split");<a name="line.8400"></a>
-<span class="sourceLineNo">8401</span>      } catch (IOException e) {<a name="line.8401"></a>
-<span class="sourceLineNo">8402</span>        LOG.error("Ignoring invalid split", e);<a name="line.8402"></a>
-<span class="sourceLineNo">8403</span>        return null;<a name="line.8403"></a>
-<span class="sourceLineNo">8404</span>      }<a name="line.8404"></a>
-<span class="sourceLineNo">8405</span>    }<a name="line.8405"></a>
-<span class="sourceLineNo">8406</span>    return ret;<a name="line.8406"></a>
-<span class="sourceLineNo">8407</span>  }<a name="line.8407"></a>
-<span class="sourceLineNo">8408</span><a name="line.8408"></a>
-<span class="sourceLineNo">8409</span>  /**<a name="line.8409"></a>
-<span class="sourceLineNo">8410</span>   * @return The priority that this region should have in the compaction queue<a name="line.8410"></a>
-<span class="sourceLineNo">8411</span>   */<a name="line.8411"></a>
-<span class="sourceLineNo">8412</span>  public int getCompactPriority() {<a name="line.8412"></a>
-<span class="sourceLineNo">8413</span>    return stores.values().stream().mapToInt(HStore::getCompactPriority).min()<a name="line.8413"></a>
-<span class="sourceLineNo">8414</span>        .orElse(Store.NO_PRIORITY);<a name="line.8414"></a>
-<span class="sourceLineNo">8415</span>  }<a name="line.8415"></a>
-<span class="sourceLineNo">8416</span><a name="line.8416"></a>
-<span class="sourceLineNo">8417</span>  /** @return the coprocessor host */<a name="line.8417"></a>
-<span class="sourceLineNo">8418</span>  public RegionCoprocessorHost getCoprocessorHost() {<a name="line.8418"></a>
-<span class="sourceLineNo">8419</span>    return coprocessorHost;<a name="line.8419"></a>
+<span class="sourceLineNo">8392</span>    // Can't split a region that is closing.<a name="line.8392"></a>
+<span class="sourceLineNo">8393</span>    if (this.isClosing()) {<a name="line.8393"></a>
+<span class="sourceLineNo">8394</span>      return null;<a name="line.8394"></a>
+<span class="sourceLineNo">8395</span>    }<a name="line.8395"></a>
+<span class="sourceLineNo">8396</span><a name="line.8396"></a>
+<span class="sourceLineNo">8397</span>    if (!splitPolicy.shouldSplit()) {<a name="line.8397"></a>
+<span class="sourceLineNo">8398</span>      return null;<a name="line.8398"></a>
+<span class="sourceLineNo">8399</span>    }<a name="line.8399"></a>
+<span class="sourceLineNo">8400</span><a name="line.8400"></a>
+<span class="sourceLineNo">8401</span>    byte[] ret = splitPolicy.getSplitPoint();<a name="line.8401"></a>
+<span class="sourceLineNo">8402</span><a name="line.8402"></a>
+<span class="sourceLineNo">8403</span>    if (ret != null) {<a name="line.8403"></a>
+<span class="sourceLineNo">8404</span>      try {<a name="line.8404"></a>
+<span class="sourceLineNo">8405</span>        checkRow(ret, "calculated split");<a name="line.8405"></a>
+<span class="sourceLineNo">8406</span>      } catch (IOException e) {<a name="line.8406"></a>
+<span class="sourceLineNo">8407</span>        LOG.error("Ignoring invalid split", e);<a name="line.8407"></a>
+<span class="sourceLineNo">8408</span>        return null;<a name="line.8408"></a>
+<span class="sourceLineNo">8409</span>      }<a name="line.8409"></a>
+<span class="sourceLineNo">8410</span>    }<a name="line.8410"></a>
+<span class="sourceLineNo">8411</span>    return ret;<a name="line.8411"></a>
+<span class="sourceLineNo">8412</span>  }<a name="line.8412"></a>
+<span class="sourceLineNo">8413</span><a name="line.8413"></a>
+<span class="sourceLineNo">8414</span>  /**<a name="line.8414"></a>
+<span class="sourceLineNo">8415</span>   * @return The priority that this region should have in the compaction queue<a name="line.8415"></a>
+<span class="sourceLineNo">8416</span>   */<a name="line.8416"></a>
+<span class="sourceLineNo">8417</span>  public int getCompactPriority() {<a name="line.8417"></a>
+<span class="sourceLineNo">8418</span>    return stores.values().stream().mapToInt(HStore::getCompactPriority).min()<a name="line.8418"></a>
+<span class="sourceLineNo">8419</span>        .orElse(Store.NO_PRIORITY);<a name="line.8419"></a>
 <span class="sourceLineNo">8420</span>  }<a name="line.8420"></a>
 <span class="sourceLineNo">8421</span><a name="line.8421"></a>
-<span class="sourceLineNo">8422</span>  /** @param coprocessorHost the new coprocessor host */<a name="line.8422"></a>
-<span class="sourceLineNo">8423</span>  @VisibleForTesting<a name="line.8423"></a>
-<span class="sourceLineNo">8424</span>  public void setCoprocessorHost(final RegionCoprocessorHost coprocessorHost) {<a name="line.8424"></a>
-<span class="sourceLineNo">8425</span>    this.coprocessorHost = coprocessorHost;<a name="line.8425"></a>
-<span class="sourceLineNo">8426</span>  }<a name="line.8426"></a>
-<span class="sourceLineNo">8427</span><a name="line.8427"></a>
-<span class="sourceLineNo">8428</span>  @Override<a name="line.8428"></a>
-<span class="sourceLineNo">8429</span>  public void startRegionOperation() throws IOException {<a name="line.8429"></a>
-<span class="sourceLineNo">8430</span>    startRegionOperation(Operation.ANY);<a name="line.8430"></a>
+<span class="sourceLineNo">8422</span>  /** @return the coprocessor host */<a name="line.8422"></a>
+<span class="sourceLineNo">8423</span>  public RegionCoprocessorHost getCoprocessorHost() {<a name="line.8423"></a>
+<span class="sourceLineNo">8424</span>    return coprocessorHost;<a name="line.8424"></a>
+<span class="sourceLineNo">8425</span>  }<a name="line.8425"></a>
+<span class="sourceLineNo">8426</span><a name="line.8426"></a>
+<span class="sourceLineNo">8427</span>  /** @param coprocessorHost the new coprocessor host */<a name="line.8427"></a>
+<span class="sourceLineNo">8428</span>  @VisibleForTesting<a name="line.8428"></a>
+<span class="sourceLineNo">8429</span>  public void setCoprocessorHost(final RegionCoprocessorHost coprocessorHost) {<a name="line.8429"></a>
+<span class="sourceLineNo">8430</span>    this.coprocessorHost = coprocessorHost;<a name="line.8430"></a>
 <span class="sourceLineNo">8431</span>  }<a name="line.8431"></a>
 <span class="sourceLineNo">8432</span><a name="line.8432"></a>
 <span class="sourceLineNo">8433</span>  @Override<a name="line.8433"></a>
-<span class="sourceLineNo">8434</span>  public void startRegionOperation(Operation op) throws IOException {<a name="line.8434"></a>
-<span class="sourceLineNo">8435</span>    switch (op) {<a name="line.8435"></a>
-<span class="sourceLineNo">8436</span>      case GET:  // read operations<a name="line.8436"></a>
-<span class="sourceLineNo">8437</span>      case SCAN:<a name="line.8437"></a>
-<span class="sourceLineNo">8438</span>        checkReadsEnabled();<a name="line.8438"></a>
-<span class="sourceLineNo">8439</span>        break;<a name="line.8439"></a>
-<span class="sourceLineNo">8440</span>      default:<a name="line.8440"></a>
-<span class="sourceLineNo">8441</span>        break;<a name="line.8441"></a>
-<span class="sourceLineNo">8442</span>    }<a name="line.8442"></a>
-<span class="sourceLineNo">8443</span>    if (op == Operation.MERGE_REGION || op == Operation.SPLIT_REGION<a name="line.8443"></a>
-<span class="sourceLineNo">8444</span>        || op == Operation.COMPACT_REGION || op == Operation.COMPACT_SWITCH) {<a name="line.8444"></a>
-<span class="sourceLineNo">8445</span>      // split, merge or compact region doesn't need to check the closing/closed state or lock the<a name="line.8445"></a>
-<span class="sourceLineNo">8446</span>      // region<a name="line.8446"></a>
-<span class="sourceLineNo">8447</span>      return;<a name="line.8447"></a>
-<span class="sourceLineNo">8448</span>    }<a name="line.8448"></a>
-<span class="sourceLineNo">8449</span>    if (this.closing.get()) {<a name="line.8449"></a>
-<span class="sourceLineNo">8450</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closing");<a name="line.8450"></a>
-<span class="sourceLineNo">8451</span>    }<a name="line.8451"></a>
-<span class="sourceLineNo">8452</span>    lock(lock.readLock());<a name="line.8452"></a>
-<span class="sourceLineNo">8453</span>    if (this.closed.get()) {<a name="line.8453"></a>
-<span class="sourceLineNo">8454</span>      lock.readLock().unlock();<a name="line.8454"></a>
-<span class="sourceLineNo">8455</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closed");<a name="line.8455"></a>
+<span class="sourceLineNo">8434</span>  public void startRegionOperation() throws IOException {<a name="line.8434"></a>
+<span class="sourceLineNo">8435</span>    startRegionOperation(Operation.ANY);<a name="line.8435"></a>
+<span class="sourceLineNo">8436</span>  }<a name="line.8436"></a>
+<span class="sourceLineNo">8437</span><a name="line.8437"></a>
+<span class="sourceLineNo">8438</span>  @Override<a name="line.8438"></a>
+<span class="sourceLineNo">8439</span>  public void startRegionOperation(Operation op) throws IOException {<a name="line.8439"></a>
+<span class="sourceLineNo">8440</span>    switch (op) {<a name="line.8440"></a>
+<span class="sourceLineNo">8441</span>      case GET:  // read operations<a name="line.8441"></a>
+<span class="sourceLineNo">8442</span>      case SCAN:<a name="line.8442"></a>
+<span class="sourceLineNo">8443</span>        checkReadsEnabled();<a name="line.8443"></a>
+<span class="sourceLineNo">8444</span>        break;<a name="line.8444"></a>
+<span class="sourceLineNo">8445</span>      default:<a name="line.8445"></a>
+<span class="sourceLineNo">8446</span>        break;<a name="line.8446"></a>
+<span class="sourceLineNo">8447</span>    }<a name="line.8447"></a>
+<span class="sourceLineNo">8448</span>    if (op == Operation.MERGE_REGION || op == Operation.SPLIT_REGION<a name="line.8448"></a>
+<span class="sourceLineNo">8449</span>        || op == Operation.COMPACT_REGION || op == Operation.COMPACT_SWITCH) {<a name="line.8449"></a>
+<span class="sourceLineNo">8450</span>      // split, merge or compact region doesn't need to check the closing/closed state or lock the<a name="line.8450"></a>
+<span class="sourceLineNo">8451</span>      // region<a name="line.8451"></a>
+<span class="sourceLineNo">8452</span>      return;<a name="line.8452"></a>
+<span class="sourceLineNo">8453</span>    }<a name="line.8453"></a>
+<span class="sourceLineNo">8454</span>    if (this.closing.get()) {<a name="line.8454"></a>
+<span class="sourceLineNo">8455</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closing");<a name="line.8455"></a>
 <span class="sourceLineNo">8456</span>    }<a name="line.8456"></a>
-<span class="sourceLineNo">8457</span>    // The unit for snapshot is a region. So, all stores for this region must be<a name="line.8457"></a>
-<span class="sourceLineNo">8458</span>    // prepared for snapshot operation before proceeding.<a name="line.8458"></a>
-<span class="sourceLineNo">8459</span>    if (op == Operation.SNAPSHOT) {<a name="line.8459"></a>
-<span class="sourceLineNo">8460</span>      stores.values().forEach(HStore::preSnapshotOperation);<a name="line.8460"></a>
+<span class="sourceLineNo">8457</span>    lock(lock.readLock());<a name="line.8457"></a>
+<span class="sourceLineNo">8458</span>    if (this.closed.get()) {<a name="line.8458"></a>
+<span class="sourceLineNo">8459</span>      lock.readLock().unlock();<a name="line.8459"></a>
+<span class="sourceLineNo">8460</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closed");<a name="line.8460"></a>
 <span class="sourceLineNo">8461</span>    }<a name="line.8461"></a>
-<span class="sourceLineNo">8462</span>    try {<a name="line.8462"></a>
-<span class="sourceLineNo">8463</span>      if (coprocessorHost != null) {<a name="line.8463"></a>
-<span class="sourceLineNo">8464</span>        coprocessorHost.postStartRegionOperation(op);<a name="line.8464"></a>
-<span class="sourceLineNo">8465</span>      }<a name="line.8465"></a>
-<span class="sourceLineNo">8466</span>    } catch (Exception e) {<a name="line.8466"></a>
-<span class="sourceLineNo">8467</span>      lock.readLock().unlock();<a name="line.8467"></a>
-<span class="sourceLineNo">8468</span>      throw new IOException(e);<a name="line.8468"></a>
-<span class="sourceLineNo">8469</span>    }<a name="line.8469"></a>
-<span class="sourceLineNo">8470</span>  }<a name="line.8470"></a>
-<span class="sourceLineNo">8471</span><a name="line.8471"></a>
-<span class="sourceLineNo">8472</span>  @Override<a name="line.8472"></a>
-<span class="sourceLineNo">8473</span>  public void closeRegionOperation() throws IOException {<a name="line.8473"></a>
-<span class="sourceLineNo">8474</span>    closeRegionOperation(Operation.ANY);<a name="line.8474"></a>
+<span class="sourceLineNo">8462</span>    // The unit for snapshot is a region. So, all stores for this region must be<a name="line.8462"></a>
+<span class="sourceLineNo">8463</span>    // prepared for snapshot operation before proceeding.<a name="line.8463"></a>
+<span class="sourceLineNo">8464</span>    if (op == Operation.SNAPSHOT) {<a name="line.8464"></a>
+<span class="sourceLineNo">8465</span>      stores.values().forEach(HStore::preSnapshotOperation);<a name="line.8465"></a>
+<span class="sourceLineNo">8466</span>    }<a name="line.8466"></a>
+<span class="sourceLineNo">8467</span>    try {<a name="line.8467"></a>
+<span class="sourceLineNo">8468</span>      if (coprocessorHost != null) {<a name="line.8468"></a>
+<span class="sourceLineNo">8469</span>        coprocessorHost.postStartRegionOperation(op);<a name="line.8469"></a>
+<span class="sourceLineNo">8470</span>      }<a name="line.8470"></a>
+<span class="sourceLineNo">8471</span>    } catch (Exception e) {<a name="line.8471"></a>
+<span class="sourceLineNo">8472</span>      lock.readLock().unlock();<a name="line.8472"></a>
+<span class="sourceLineNo">8473</span>      throw new IOException(e);<a name="line.8473"></a>
+<span class="sourceLineNo">8474</span>    }<a name="line.8474"></a>
 <span class="sourceLineNo">8475</span>  }<a name="line.8475"></a>
 <span class="sourceLineNo">8476</span><a name="line.8476"></a>
 <span class="sourceLineNo">8477</span>  @Override<a name="line.8477"></a>
-<span class="sourceLineNo">8478</span>  public void closeRegionOperation(Operation operation) throws IOException {<a name="line.8478"></a>
-<span class="sourceLineNo">8479</span>    if (operation == Operation.SNAPSHOT) {<a name="line.8479"></a>
-<span class="sourceLineNo">8480</span>      stores.values().forEach(HStore::postSnapshotOperation);<a name="line.8480"></a>
-<span class="sourceLineNo">8481</span>    }<a name="line.8481"></a>
-<span class="sourceLineNo">8482</span>    lock.readLock().unlock();<a name="line.8482"></a>
-<span class="sourceLineNo">8483</span>    if (coprocessorHost != null) {<a name="line.8483"></a>
-<span class="sourceLineNo">8484</span>      coprocessorHost.postCloseRegionOperation(operation);<a name="line.8484"></a>
-<span class="sourceLineNo">8485</span>    }<a name="line.8485"></a>
-<span class="sourceLineNo">8486</span>  }<a name="line.8486"></a>
-<span class="sourceLineNo">8487</span><a name="line.8487"></a>
-<span class="sourceLineNo">8488</span>  /**<a name="line.8488"></a>
-<span class="sourceLineNo">8489</span>   * This method needs to be called before any public call that reads or<a name="line.8489"></a>
-<span class="sourceLineNo">8490</span>   * modifies stores in bulk. It has to be called just before a try.<a name="line.8490"></a>
-<span class="sourceLineNo">8491</span>   * #closeBulkRegionOperation needs to be called in the try's finally block<a name="line.8491"></a>
-<span class="sourceLineNo">8492</span>   * Acquires a writelock and checks if the region is closing or closed.<a name="line.8492"></a>
-<span class="sourceLineNo">8493</span>   * @throws NotServingRegionException when the region is closing or closed<a name="line.8493"></a>
-<span class="sourceLineNo">8494</span>   * @throws RegionTooBusyException if failed to get the lock in time<a name="line.8494"></a>
-<span class="sourceLineNo">8495</span>   * @throws InterruptedIOException if interrupted while waiting for a lock<a name="line.8495"></a>
-<span class="sourceLineNo">8496</span>   */<a name="line.8496"></a>
-<span class="sourceLineNo">8497</span>  private void startBulkRegionOperation(boolean writeLockNeeded)<a name="line.8497"></a>
-<span class="sourceLineNo">8498</span>      throws NotServingRegionException, RegionTooBusyException, InterruptedIOException {<a name="line.8498"></a>
-<span class="sourceLineNo">8499</span>    if (this.closing.get()) {<a name="line.8499"></a>
-<span class="sourceLineNo">8500</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closing");<a name="line.8500"></a>
-<span class="sourceLineNo">8501</span>    }<a name="line.8501"></a>
-<span class="sourceLineNo">8502</span>    if (writeLockNeeded) lock(lock.writeLock());<a name="line.8502"></a>
-<span class="sourceLineNo">8503</span>    else lock(lock.readLock());<a name="line.8503"></a>
-<span class="sourceLineNo">8504</span>    if (this.closed.get()) {<a name="line.8504"></a>
-<span class="sourceLineNo">8505</span>      if (writeLockNeeded) lock.writeLock().unlock();<a name="line.8505"></a>
-<span class="sourceLineNo">8506</span>      else lock.readLock().unlock();<a name="line.8506"></a>
-<span class="sourceLineNo">8507</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closed");<a name="line.8507"></a>
-<span class="sourceLineNo">8508</span>    }<a name="line.8508"></a>
-<span class="sourceLineNo">8509</span>  }<a name="line.8509"></a>
-<span class="sourceLineNo">8510</span><a name="line.8510"></a>
-<span class="sourceLineNo">8511</span>  /**<a name="line.8511"></a>
-<span class="sourceLineNo">8512</span>   * Closes the lock. This needs to be called in the finally block corresponding<a name="line.8512"></a>
-<span class="sourceLineNo">8513</span>   * to the try block of #startRegionOperation<a name="line.8513"></a>
-<span class="sourceLineNo">8514</span>   */<a name="line.8514"></a>
-<span class="sourceLineNo">8515</span>  private void closeBulkRegionOperation(){<a name="line.8515"></a>
-<span class="sourceLineNo">8516</span>    if (lock.writeLock().isHeldByCurrentThread()) lock.writeLock().unlock();<a name="line.8516"></a>
-<span class="sourceLineNo">8517</span>    else lock.readLock().unlock();<a name="line.8517"></a>
-<span class="sourceLineNo">8518</span>  }<a name="line.8518"></a>
-<span class="sourceLineNo">8519</span><a name="line.8519"></a>
-<span class="sourceLineNo">8520</span>  /**<a name="line.8520"></a>
-<span class="sourceLineNo">8521</span>   * Update LongAdders for number of puts without wal and the size of possible data loss.<a name="line.8521"></a>
-<span class="sourceLineNo">8522</span>   * These information are exposed by the region server metrics.<a name="line.8522"></a>
-<span class="sourceLineNo">8523</span>   */<a name="line.8523"></a>
-<span class="sourceLineNo">8524</span>  private void recordMutationWithoutWal(final Map&lt;byte [], List&lt;Cell&gt;&gt; familyMap) {<a name="line.8524"></a>
-<span class="sourceLineNo">8525</span>    numMutationsWithoutWAL.increment();<a name="line.8525"></a>
-<span class="sourceLineNo">8526</span>    if (numMutationsWithoutWAL.sum() &lt;= 1) {<a name="line.8526"></a>
-<span class="sourceLineNo">8527</span>      LOG.info("writing data to region " + this +<a name="line.8527"></a>
-<span class="sourceLineNo">8528</span>               " with WAL disabled. Data may be lost in the event of a crash.");<a name="line.8528"></a>
-<span class="sourceLineNo">8529</span>    }<a name="line.8529"></a>
-<span class="sourceLineNo">8530</span><a name="line.8530"></a>
-<span class="sourceLineNo">8531</span>    long mutationSize = 0;<a name="line.8531"></a>
-<span class="sourceLineNo">8532</span>    for (List&lt;Cell&gt; cells: familyMap.values()) {<a name="line.8532"></a>
-<span class="sourceLineNo">8533</span>      // Optimization: 'foreach' loop is not used. See:<a name="line.8533"></a>
-<span class="sourceLineNo">8534</span>      // HBASE-12023 HRegion.applyFamilyMapToMemstore creates too many iterator objects<a name="line.8534"></a>
-<span class="sourceLineNo">8535</span>      assert cells instanceof RandomAccess;<a name="line.8535"></a>
-<span class="sourceLineNo">8536</span>      int listSize = cells.size();<a name="line.8536"></a>
-<span class="sourceLineNo">8537</span>      for (int i=0; i &lt; listSize; i++) {<a name="line.8537"></a>
-<span class="sourceLineNo">8538</span>        Cell cell = cells.get(i);<a name="line.8538"></a>
-<span class="sourceLineNo">8539</span>        mutationSize += cell.getSerializedSize();<a name="line.8539"></a>
-<span class="sourceLineNo">8540</span>      }<a name="line.8540"></a>
-<span class="sourceLineNo">8541</span>    }<a name="line.8541"></a>
-<span class="sourceLineNo">8542</span><a name="line.8542"></a>
-<span class="sourceLineNo">8543</span>    dataInMemoryWithoutWAL.add(mutationSize);<a name="line.8543"></a>
-<span class="sourceLineNo">8544</span>  }<a name="line.8544"></a>
-<span class="sourceLineNo">8545</span><a name="line.8545"></a>
-<span class="sourceLineNo">8546</span>  private void lock(final Lock lock) throws RegionTooBusyException, InterruptedIOException {<a name="line.8546"></a>
-<span class="sourceLineNo">8547</span>    lock(lock, 1);<a name="line.8547"></a>
-<span class="sourceLineNo">8548</span>  }<a name="line.8548"></a>
-<span class="sourceLineNo">8549</span><a name="line.8549"></a>
-<span class="sourceLineNo">8550</span>  /**<a name="line.8550"></a>
-<span class="sourceLineNo">8551</span>   * Try to acquire a lock.  Throw RegionTooBusyException<a name="line.8551"></a>
-<span class="sourceLineNo">8552</span>   * if failed to get the lock in time. Throw InterruptedIOException<a name="line.8552"></a>
-<span class="sourceLineNo">8553</span>   * if interrupted while waiting for the lock.<a name="line.8553"></a>
-<span class="sourceLineNo">8554</span>   */<a name="line.8554"></a>
-<span class="sourceLineNo">8555</span>  private void lock(final Lock lock, final int multiplier)<a name="line.8555"></a>
-<span class="sourceLineNo">8556</span>      throws RegionTooBusyException, InterruptedIOException {<a name="line.8556"></a>
-<span class="sourceLineNo">8557</span>    try {<a name="line.8557"></a>
-<span class="sourceLineNo">8558</span>      final long waitTime = Math.min(maxBusyWaitDuration,<a name="line.8558"></a>
-<span class="sourceLineNo">8559</span>          busyWaitDuration * Math.min(multiplier, maxBusyWaitMultiplier));<a name="line.8559"></a>
-<span class="sourceLineNo">8560</span>      if (!lock.tryLock(waitTime, TimeUnit.MILLISECONDS)) {<a name="line.8560"></a>
-<span class="sourceLineNo">8561</span>        // Don't print millis. Message is used as a key over in<a name="line.8561"></a>
-<span class="sourceLineNo">8562</span>        // RetriesExhaustedWithDetailsException processing.<a name="line.8562"></a>
-<span class="sourceLineNo">8563</span>        throw new RegionTooBusyException("Failed to obtain lock; regionName=" +<a name="line.8563"></a>
-<span class="sourceLineNo">8564</span>            (this.getRegionInfo() == null? "unknown":<a name="line.8564"></a>
-<span class="sourceLineNo">8565</span>                this.getRegionInfo().getRegionNameAsString()) +<a name="line.8565"></a>
-<span class="sourceLineNo">8566</span>            ", server=" + (this.getRegionServerServices() == null? "unknown":<a name="line.8566"></a>
-<span class="sourceLineNo">8567</span>                this.getRegionServerServices().getServerName()));<a name="line.8567"></a>
-<span class="sourceLineNo">8568</span>      }<a name="line.8568"></a>
-<span class="sourceLineNo">8569</span>    } catch (InterruptedException ie) {<a name="line.8569"></a>
-<span class="sourceLineNo">8570</span>      LOG.info("Interrupted while waiting for a lock");<a name="line.8570"></a>
-<span class="sourceLineNo">8571</span>      InterruptedIOException iie = new InterruptedIOException();<a name="line.8571"></a>
-<span class="sourceLineNo">8572</span>      iie.initCause(ie);<a name="line.8572"></a>
-<span class="sourceLineNo">8573</span>      throw iie;<a name="line.8573"></a>
-<span class="sourceLineNo">8574</span>    }<a name="line.8574"></a>
-<span class="sourceLineNo">8575</span>  }<a name="line.8575"></a>
-<span class="sourceLineNo">8576</span><a name="line.8576"></a>
-<span class="sourceLineNo">8577</span>  /**<a name="line.8577"></a>
-<span class="sourceLineNo">8578</span>   * Calls sync with the given transaction ID<a name="line.8578"></a>
-<span class="sourceLineNo">8579</span>   * @param txid should sync up to which transaction<a name="line.8579"></a>
-<span class="sourceLineNo">8580</span>   * @throws IOException If anything goes wrong with DFS<a name="line.8580"></a>
-<span class="sourceLineNo">8581</span>   */<a name="line.8581"></a>
-<span class="sourceLineNo">8582</span>  private void sync(long txid, Durability durability) throws IOException {<a name="line.8582"></a>
-<span class="sourceLineNo">8583</span>    if (this.getRegionInfo().isMetaRegion()) {<a name="line.8583"></a>
-<span class="sourceLineNo">8584</span>      this.wal.sync(txid);<a name="line.8584"></a>
-<span class="sourceLineNo">8585</span>    } else {<a name="line.8585"></a>
-<span class="sourceLineNo">8586</span>      switch(durability) {<a name="line.8586"></a>
-<span class="sourceLineNo">8587</span>      case USE_DEFAULT:<a name="line.8587"></a>
-<span class="sourceLineNo">8588</span>        // do what table defaults to<a name="line.8588"></a>
-<span class="sourceLineNo">8589</span>        if (shouldSyncWAL()) {<a name="line.8589"></a>
-<span class="sourceLineNo">8590</span>          this.wal.sync(txid);<a name="line.8590"></a>
-<span class="sourceLineNo">8591</span>        }<a name="line.8591"></a>
-<span class="sourceLineNo">8592</span>        break;<a name="line.8592"></a>
-<span class="sourceLineNo">8593</span>      case SKIP_WAL:<a name="line.8593"></a>
-<span class="sourceLineNo">8594</span>        // nothing do to<a name="line.8594"></a>
-<span class="sourceLineNo">8595</span>        break;<a name="line.8595"></a>
-<span class="sourceLineNo">8596</span>      case ASYNC_WAL:<a name="line.8596"></a>
-<span class="sourceLineNo">8597</span>        // nothing do to<a name="line.8597"></a>
-<span class="sourceLineNo">8598</span>        break;<a name="line.8598"></a>
-<span class="sourceLineNo">8599</span>      case SYNC_WAL:<a name="line.8599"></a>
-<span class="sourceLineNo">8600</span>          this.wal.sync(txid, false);<a name="line.8600"></a>
-<span class="sourceLineNo">8601</span>          break;<a name="line.8601"></a>
-<span class="sourceLineNo">8602</span>      case FSYNC_WAL:<a name="line.8602"></a>
-<span class="sourceLineNo">8603</span>          this.wal.sync(txid, true);<a name="line.8603"></a>
-<span class="sourceLineNo">8604</span>          break;<a name="line.8604"></a>
-<span class="sourceLineNo">8605</span>      default:<a name="line.8605"></a>
-<span class="sourceLineNo">8606</span>        throw new RuntimeException("Unknown durability " + durability);<a name="line.8606"></a>
-<span class="sourceLineNo">8607</span>      }<a name="line.8607"></a>
-<span class="sourceLineNo">8608</span>    }<a name="line.8608"></a>
-<span class="sourceLineNo">8609</span>  }<a name="line.8609"></a>
-<span class="sourceLineNo">8610</span><a name="line.8610"></a>
-<span class="sourceLineNo">8611</span>  /**<a name="line.8611"></a>
-<span class="sourceLineNo">8612</span>   * Check whether we should sync the wal from the table's durability settings<a name="line.8612"></a>
-<span class="sourceLineNo">8613</span>   */<a name="line.8613"></a>
-<span class="sourceLineNo">8614</span>  private boolean shouldSyncWAL() {<a name="line.8614"></a>
-<span class="sourceLineNo">8615</span>    return regionDurability.ordinal() &gt;  Durability.ASYNC_WAL.ordinal();<a name="line.8615"></a>
-<span class="sourceLineNo">8616</span>  }<a name="line.8616"></a>
-<span class="sourceLineNo">8617</span><a name="line.8617"></a>
-<span class="sourceLineNo">8618</span>  /**<a name="line.8618"></a>
-<span class="sourceLineNo">8619</span>   * A mocked list implementation - discards all updates.<a name="line.8619"></a>
-<span class="sourceLineNo">8620</span>   */<a name="line.8620"></a>
-<span class="sourceLineNo">8621</span>  private static final List&lt;Cell&gt; MOCKED_LIST = new AbstractList&lt;Cell&gt;() {<a name="line.8621"></a>
+<span class="sourceLineNo">8478</span>  public void closeRegionOperation() throws IOException {<a name="line.8478"></a>
+<span class="sourceLineNo">8479</span>    closeRegionOperation(Operation.ANY);<a name="line.8479"></a>
+<span class="sourceLineNo">8480</span>  }<a name="line.8480"></a>
+<span class="sourceLineNo">8481</span><a name="line.8481"></a>
+<span class="sourceLineNo">8482</span>  @Override<a name="line.8482"></a>
+<span class="sourceLineNo">8483</span>  public void closeRegionOperation(Operation operation) throws IOException {<a name="line.8483"></a>
+<span class="sourceLineNo">8484</span>    if (operation == Operation.SNAPSHOT) {<a name="line.8484"></a>
+<span class="sourceLineNo">8485</span>      stores.values().forEach(HStore::postSnapshotOperation);<a name="line.8485"></a>
+<span class="sourceLineNo">8486</span>    }<a name="line.8486"></a>
+<span class="sourceLineNo">8487</span>    lock.readLock().unlock();<a name="line.8487"></a>
+<span class="sourceLineNo">8488</span>    if (coprocessorHost != null) {<a name="line.8488"></a>
+<span class="sourceLineNo">8489</span>      coprocessorHost.postCloseRegionOperation(operation);<a name="line.8489"></a>
+<span class="sourceLineNo">8490</span>    }<a name="line.8490"></a>
+<span class="sourceLineNo">8491</span>  }<a name="line.8491"></a>
+<span class="sourceLineNo">8492</span><a name="line.8492"></a>
+<span class="sourceLineNo">8493</span>  /**<a name="line.8493"></a>
+<span class="sourceLineNo">8494</span>   * This method needs to be called before any public call that reads or<a name="line.8494"></a>
+<span class="sourceLineNo">8495</span>   * modifies stores in bulk. It has to be called just before a try.<a name="line.8495"></a>
+<span class="sourceLineNo">8496</span>   * #closeBulkRegionOperation needs to be called in the try's finally block<a name="line.8496"></a>
+<span class="sourceLineNo">8497</span>   * Acquires a writelock and checks if the region is closing or closed.<a name="line.8497"></a>
+<span class="sourceLineNo">8498</span>   * @throws NotServingRegionException when the region is closing or closed<a name="line.8498"></a>
+<span class="sourceLineNo">8499</span>   * @throws RegionTooBusyException if failed to get the lock in time<a name="line.8499"></a>
+<span class="sourceLineNo">8500</span>   * @throws InterruptedIOException if interrupted while waiting for a lock<a name="line.8500"></a>
+<span class="sourceLineNo">8501</span>   */<a name="line.8501"></a>
+<span class="sourceLineNo">8502</span>  private void startBulkRegionOperation(boolean writeLockNeeded)<a name="line.8502"></a>
+<span class="sourceLineNo">8503</span>      throws NotServingRegionException, RegionTooBusyException, InterruptedIOException {<a name="line.8503"></a>
+<span class="sourceLineNo">8504</span>    if (this.closing.get()) {<a name="line.8504"></a>
+<span class="sourceLineNo">8505</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closing");<a name="line.8505"></a>
+<span class="sourceLineNo">8506</span>    }<a name="line.8506"></a>
+<span class="sourceLineNo">8507</span>    if (writeLockNeeded) lock(lock.writeLock());<a name="line.8507"></a>
+<span class="sourceLineNo">8508</span>    else lock(lock.readLock());<a name="line.8508"></a>
+<span class="sourceLineNo">8509</span>    if (this.closed.get()) {<a name="line.8509"></a>
+<span class="sourceLineNo">8510</span>      if (writeLockNeeded) lock.writeLock().unlock();<a name="line.8510"></a>
+<span class="sourceLineNo">8511</span>      else lock.readLock().unlock();<a name="line.8511"></a>
+<span class="sourceLineNo">8512</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closed");<a name="line.8512"></a>
+<span class="sourceLineNo">8513</span>    }<a name="line.8513"></a>
+<span class="sourceLineNo">8514</span>  }<a name="line.8514"></a>
+<span class="sourceLineNo">8515</span><a name="line.8515"></a>
+<span class="sourceLineNo">8516</span>  /**<a name="line.8516"></a>
+<span class="sourceLineNo">8517</span>   * Closes the lock. This needs to be called in the finally block corresponding<a name="line.8517"></a>
+<span class="sourceLineNo">8518</span>   * to the try block of #startRegionOperation<a name="line.8518"></a>
+<span class="sourceLineNo">8519</span>   */<a name="line.8519"></a>
+<span class="sourceLineNo">8520</span>  private void closeBulkRegionOperation(){<a name="line.8520"></a>
+<span class="sourceLineNo">8521</span>    if (lock.writeLock().isHeldByCurrentThread()) lock.writeLock().unlock();<a name="line.8521"></a>
+<span class="sourceLineNo">8522</span>    else lock.readLock().unlock();<a name="line.8522"></a>
+<span class="sourceLineNo">8523</span>  }<a name="line.8523"></a>
+<span class="sourceLineNo">8524</span><a name="line.8524"></a>
+<span class="sourceLineNo">8525</span>  /**<a name="line.8525"></a>
+<span class="sourceLineNo">8526</span>   * Update LongAdders for number of puts without wal and the size of possible data loss.<a name="line.8526"></a>
+<span class="sourceLineNo">8527</span>   * These information are exposed by the region server metrics.<a name="line.8527"></a>
+<span class="sourceLineNo">8528</span>   */<a name="line.8528"></a>
+<span class="sourceLineNo">8529</span>  private void recordMutationWithoutWal(final Map&lt;byte [], List&lt;Cell&gt;&gt; familyMap) {<a name="line.8529"></a>
+<span class="sourceLineNo">8530</span>    numMutationsWithoutWAL.increment();<a name="line.8530"></a>
+<span class="sourceLineNo">8531</span>    if (numMutationsWithoutWAL.sum() &lt;= 1) {<a name="line.8531"></a>
+<span class="sourceLineNo">8532</span>      LOG.info("writing data to region " + this +<a name="line.8532"></a>
+<span class="sourceLineNo">8533</span>               " with WAL disabled. Data may be lost in the event of a crash.");<a name="line.8533"></a>
+<span class="sourceLineNo">8534</span>    }<a name="line.8534"></a>
+<span class="sourceLineNo">8535</span><a name="line.8535"></a>
+<span class="sourceLineNo">8536</span>    long mutationSize = 0;<a name="line.8536"></a>
+<span class="sourceLineNo">8537</span>    for (List&lt;Cell&gt; cells: familyMap.values()) {<a name="line.8537"></a>
+<span class="sourceLineNo">8538</span>      // Optimization: 'foreach' loop is not used. See:<a name="line.8538"></a>
+<span class="sourceLineNo">8539</span>      // HBASE-12023 HRegion.applyFamilyMapToMemstore creates too many iterator objects<a name="line.8539"></a>
+<span class="sourceLineNo">8540</span>      assert cells instanceof RandomAccess;<a name="line.8540"></a>
+<span class="sourceLineNo">8541</span>      int listSize = cells.size();<a name="line.8541"></a>
+<span class="sourceLineNo">8542</span>      for (int i=0; i &lt; listSize; i++) {<a name="line.8542"></a>
+<span class="sourceLineNo">8543</span>        Cell cell = cells.get(i);<a name="line.8543"></a>
+<span class="sourceLineNo">8544</span>        mutationSize += cell.getSerializedSize();<a name="line.8544"></a>
+<span class="sourceLineNo">8545</span>      }<a name="line.8545"></a>
+<span class="sourceLineNo">8546</span>    }<a name="line.8546"></a>
+<span class="sourceLineNo">8547</span><a name="line.8547"></a>
+<span class="sourceLineNo">8548</span>    dataInMemoryWithoutWAL.add(mutationSize);<a name="line.8548"></a>
+<span class="sourceLineNo">8549</span>  }<a name="line.8549"></a>
+<span class="sourceLineNo">8550</span><a name="line.8550"></a>
+<span class="sourceLineNo">8551</span>  private void lock(final Lock lock) throws RegionTooBusyException, InterruptedIOException {<a name="line.8551"></a>
+<span class="sourceLineNo">8552</span>    lock(lock, 1);<a name="line.8552"></a>
+<span class="sourceLineNo">8553</span>  }<a name="line.8553"></a>
+<span class="sourceLineNo">8554</span><a name="line.8554"></a>
+<span class="sourceLineNo">8555</span>  /**<a name="line.8555"></a>
+<span class="sourceLineNo">8556</span>   * Try to acquire a lock.  Throw RegionTooBusyException<a name="line.8556"></a>
+<span class="sourceLineNo">8557</span>   * if failed to get the lock in time. Throw InterruptedIOException<a name="line.8557"></a>
+<span class="sourceLineNo">8558</span>   * if interrupted while waiting for the lock.<a name="line.8558"></a>
+<span class="sourceLineNo">8559</span>   */<a name="line.8559"></a>
+<span class="sourceLineNo">8560</span>  private void lock(final Lock lock, final int multiplier)<a name="line.8560"></a>
+<span class="sourceLineNo">8561</span>      throws RegionTooBusyException, InterruptedIOException {<a name="line.8561"></a>
+<span class="sourceLineNo">8562</span>    try {<a name="line.8562"></a>
+<span class="sourceLineNo">8563</span>      final long waitTime = Math.min(maxBusyWaitDuration,<a name="line.8563"></a>
+<span class="sourceLineNo">8564</span>          busyWaitDuration * Math.min(multiplier, maxBusyWaitMultiplier));<a name="line.8564"></a>
+<span class="sourceLineNo">8565</span>      if (!lock.tryLock(waitTime, TimeUnit.MILLISECONDS)) {<a name="line.8565"></a>
+<span class="sourceLineNo">8566</span>        // Don't print millis. Message is used as a key over in<a name="line.8566"></a>
+<span class="sourceLineNo">8567</span>        // RetriesExhaustedWithDetailsException processing.<a name="line.8567"></a>
+<span class="sourceLineNo">8568</span>        throw new RegionTooBusyException("Failed to obtain lock; regionName=" +<a name="line.8568"></a>
+<span class="sourceLineNo">8569</span>            (this.getRegionInfo() == null? "unknown":<a name="line.8569"></a>
+<span class="sourceLineNo">8570</span>                this.getRegionInfo().getRegionNameAsString()) +<a name="line.8570"></a>
+<span class="sourceLineNo">8571</span>            ", server=" + (this.getRegionServerServices() == null? "unknown":<a name="line.8571"></a>
+<span class="sourceLineNo">8572</span>                this.getRegionServerServices().getServerName()));<a name="line.8572"></a>
+<span class="sourceLineNo">8573</span>      }<a name="line.8573"></a>
+<span class="sourceLineNo">8574</span>    } catch (InterruptedException ie) {<a name="line.8574"></a>
+<span class="sourceLineNo">8575</span>      LOG.info("Interrupted while waiting for a lock");<a name="line.8575"></a>
+<span class="sourceLineNo">8576</span>      InterruptedIOException iie = new InterruptedIOException();<a name="line.8576"></a>
+<span class="sourceLineNo">8577</span>      iie.initCause(ie);<a name="line.8577"></a>
+<span class="sourceLineNo">8578</span>      throw iie;<a name="line.8578"></a>
+<span class="sourceLineNo">8579</span>    }<a name="line.8579"></a>
+<span class="sourceLineNo">8580</span>  }<a name="line.8580"></a>
+<span class="sourceLineNo">8581</span><a name="line.8581"></a>
+<span class="sourceLineNo">8582</span>  /**<a name="line.8582"></a>
+<span class="sourceLineNo">8583</span>   * Calls sync with the given transaction ID<a name="line.8583"></a>
+<span class="sourceLineNo">8584</span>   * @param txid should sync up to which transaction<a name="line.8584"></a>
+<span class="sourceLineNo">8585</span>   * @throws IOException If anything goes wrong with DFS<a name="line.8585"></a>
+<span class="sourceLineNo">8586</span>   */<a name="line.8586"></a>
+<span class="sourceLineNo">8587</span>  private void sync(long txid, Durability durability) throws IOException {<a name="line.8587"></a>
+<span class="sourceLineNo">8588</span>    if (this.getRegionInfo().isMetaRegion()) {<a name="line.8588"></a>
+<span class="sourceLineNo">8589</span>      this.wal.sync(txid);<a name="line.8589"></a>
+<span class="sourceLineNo">8590</span>    } else {<a name="line.8590"></a>
+<span class="sourceLineNo">8591</span>      switch(durability) {<a name="line.8591"></a>
+<span class="sourceLineNo">8592</span>      case USE_DEFAULT:<a name="line.8592"></a>
+<span class="sourceLineNo">8593</span>        // do what table defaults to<a name="line.8593"></a>
+<span class="sourceLineNo">8594</span>        if (shouldSyncWAL()) {<a name="line.8594"></a>
+<span class="sourceLineNo">8595</span>          this.wal.sync(txid);<a name="line.8595"></a>
+<span class="sourceLineNo">8596</span>        }<a name="line.8596"></a>
+<span class="sourceLineNo">8597</span>        break;<a name="line.8597"></a>
+<span class="sourceLineNo">8598</span>      case SKIP_WAL:<a name="line.8598"></a>
+<span class="sourceLineNo">8599</span>        // nothing do to<a name="line.8599"></a>
+<span class="sourceLineNo">8600</span>        break;<a name="line.8600"></a>
+<span class="sourceLineNo">8601</span>      case ASYNC_WAL:<a name="line.8601"></a>
+<span class="sourceLineNo">8602</span>        // nothing do to<a name="line.8602"></a>
+<span class="sourceLineNo">8603</span>        break;<a name="line.8603"></a>
+<span class="sourceLineNo">8604</span>      case SYNC_WAL:<a name="line.8604"></a>
+<span class="sourceLineNo">8605</span>          this.wal.sync(txid, false);<a name="line.8605"></a>
+<span class="sourceLineNo">8606</span>          break;<a name="line.8606"></a>
+<span class="sourceLineNo">8607</span>      case FSYNC_WAL:<a name="line.8607"></a>
+<span class="sourceLineNo">8608</span>          this.wal.sync(txid, true);<a name="line.8608"></a>
+<span class="sourceLineNo">8609</span>          break;<a name="line.8609"></a>
+<span class="sourceLineNo">8610</span>      default:<a name="line.8610"></a>
+<span class="sourceLineNo">8611</span>        throw new RuntimeException("Unknown durability " + durability);<a name="line.8611"></a>
+<span class="sourceLineNo">8612</span>      }<a name="line.8612"></a>
+<span class="sourceLineNo">8613</span>    }<a name="line.8613"></a>
+<span class="sourceLineNo">8614</span>  }<a name="line.8614"></a>
+<span class="sourceLineNo">8615</span><a name="line.8615"></a>
+<span class="sourceLineNo">8616</span>  /**<a name="line.8616"></a>
+<span class="sourceLineNo">8617</span>   * Check whether we should sync the wal from the table's durability settings<a name="line.8617"></a>
+<span class="sourceLineNo">8618</span>   */<a name="line.8618"></a>
+<span class="sourceLineNo">8619</span>  private boolean shouldSyncWAL() {<a name="line.8619"></a>
+<span class="sourceLineNo">8620</span>    return regionDurability.ordinal() &gt;  Durability.ASYNC_WAL.ordinal();<a name="line.8620"></a>
+<span class="sourceLineNo">8621</span>  }<a name="line.8621"></a>
 <span class="sourceLineNo">8622</span><a name="line.8622"></a>
-<span class="sourceLineNo">8623</span>    @Override<a name="line.8623"></a>
-<span class="sourceLineNo">8624</span>    public void add(int index, Cell element) {<a name="line.8624"></a>
-<span class="sourceLineNo">8625</span>      // do nothing<a name="line.8625"></a>
-<span class="sourceLineNo">8626</span>    }<a name="line.8626"></a>
+<span class="sourceLineNo">8623</span>  /**<a name="line.8623"></a>
+<span class="sourceLineNo">8624</span>   * A mocked list implementation - discards all updates.<a name="line.8624"></a>
+<span class="sourceLineNo">8625</span>   */<a name="line.8625"></a>
+<span class="sourceLineNo">8626</span>  private static final List&lt;Cell&gt; MOCKED_LIST = new AbstractList&lt;Cell&gt;() {<a name="line.8626"></a>
 <span class="sourceLineNo">8627</span><a name="line.8627"></a>
 <span class="sourceLineNo">8628</span>    @Override<a name="line.8628"></a>
-<span class="sourceLineNo">8629</span>    public boolean addAll(int index, Collection&lt;? extends Cell&gt; c) {<a name="line.8629"></a>
-<span class="sourceLineNo">8630</span>      return false; // this list is never changed as a result of an update<a name="line.8630"></a>
+<span class="sourceLineNo">8629</span>    public void add(int index, Cell element) {<a name="line.8629"></a>
+<span class="sourceLineNo">8630</span>      // do nothing<a name="line.8630"></a>
 <span class="sourceLineNo">8631</span>    }<a name="line.8631"></a>
 <span class="sourceLineNo">8632</span><a name="line.8632"></a>
 <span class="sourceLineNo">8633</span>    @Override<a name="line.8633"></a>
-<span class="sourceLineNo">8634</span>    public KeyValue get(int index) {<a name="line.8634"></a>
-<span class="sourceLineNo">8635</span>      throw new UnsupportedOperationException();<a name="line.8635"></a>
+<span class="sourceLineNo">8634</span>    public boolean addAll(int index, Collection&lt;? extends Cell&gt; c) {<a name="line.8634"></a>
+<span class="sourceLineNo">8635</span>      return false; // this list is never changed as a result of an update<a name="line.8635"></a>
 <span class="sourceLineNo">8636</span>    }<a name="line.8636"></a>
 <span class="sourceLineNo">8637</span><a name="line.8637"></a>
 <span class="sourceLineNo">8638</span>    @Override<a name="line.8638"></a>
-<span class="sourceLineNo">8639</span>    public int size() {<a name="line.8639"></a>
-<span class="sourceLineNo">8640</span>      return 0;<a name="line.8640"></a>
+<span class="sourceLineNo">8639</span>    public KeyValue get(int index) {<a name="line.8639"></a>
+<span class="sourceLineNo">8640</span>      throw new UnsupportedOperationException();<a name="line.8640"></a>
 <span class="sourceLineNo">8641</span>    }<a name="line.8641"></a>
-<span class="sourceLineNo">8642</span>  };<a name="line.8642"></a>
-<span class="sourceLineNo">8643</span><a name="line.8643"></a>
-<span class="sourceLineNo">8644</span>  /** @return the latest sequence number that was read from storage when this region was opened */<a name="line.8644"></a>
-<span class="sourceLineNo">8645</span>  public long getOpenSeqNum() {<a name="line.8645"></a>
-<span class="sourceLineNo">8646</span>    return this.openSeqNum;<a name="line.8646"></a>
-<span class="sourceLineNo">8647</span>  }<a name="line.8647"></a>
+<span class="sourceLineNo">8642</span><a name="line.8642"></a>
+<span class="sourceLineNo">8643</span>    @Override<a name="line.8643"></a>
+<span class="sourceLineNo">8644</span>    public int size() {<a name="line.8644"></a>
+<span class="sourceLineNo">8645</span>      return 0;<a name="line.8645"></a>
+<span class="sourceLineNo">8646</span>    }<a name="line.8646"></a>
+<span class="sourceLineNo">8647</span>  };<a name="line.8647"></a>
 <span class="sourceLineNo">8648</span><a name="line.8648"></a>
-<span class="sourceLineNo">8649</span>  @Override<a name="line.8649"></a>
-<span class="sourceLineNo">8650</span>  public Map&lt;byte[], Long&gt; getMaxStoreSeqId() {<a name="line.8650"></a>
-<span class="sourceLineNo">8651</span>    return this.maxSeqIdInStores;<a name="line.8651"></a>
+<span class="sourceLineNo">8649</span>  /** @return the latest sequence number that was read from storage when this region was opened */<a name="line.8649"></a>
+<span class="sourceLineNo">8650</span>  public long getOpenSeqNum() {<a name="line.8650"></a>
+<span class="sourceLineNo">8651</span>    return this.openSeqNum;<a name="line.8651"></a>
 <span class="sourceLineNo">8652</span>  }<a name="line.8652"></a>
 <span class="sourceLineNo">8653</span><a name="line.8653"></a>
-<span class="sourceLineNo">8654</span>  public long getOldestSeqIdOfStore(byte[] familyName) {<a name="line.8654"></a>
-<span class="sourceLineNo">8655</span>    return wal.getEarliestMemStoreSeqNum(getRegionInfo().getEncodedNameAsBytes(), familyName);<a name="line.8655"></a>
-<span class="sourceLineNo">8656</span>  }<a name="line.8656"></a>
-<span class="sourceLineNo">8657</span><a name="line.8657"></a>
-<span class="sourceLineNo">8658</span>  @Override<a name="line.8658"></a>
-<span class="sourceLineNo">8659</span>  public CompactionState getCompactionState() {<a name="line.8659"></a>
-<span class="sourceLineNo">8660</span>    boolean hasMajor = majorInProgress.get() &gt; 0, hasMinor = minorInProgress.get() &gt; 0;<a name="line.8660"></a>
-<span class="sourceLineNo">8661</span>    return (hasMajor ? (hasMinor ? CompactionState.MAJOR_AND_MINOR : CompactionState.MAJOR)<a name="line.8661"></a>
-<span class="sourceLineNo">8662</span>        : (hasMinor ? CompactionState.MINOR : CompactionState.NONE));<a name="line.8662"></a>
-<span class="sourceLineNo">8663</span>  }<a name="line.8663"></a>
-<span class="sourceLineNo">8664</span><a name="line.8664"></a>
-<span class="sourceLineNo">8665</span>  public void reportCompactionRequestStart(boolean isMajor){<a name="line.8665"></a>
-<span class="sourceLineNo">8666</span>    (isMajor ? majorInProgress : minorInProgress).incrementAndGet();<a name="line.8666"></a>
-<span class="sourceLineNo">8667</span>  }<a name="line.8667"></a>
-<span class="sourceLineNo">8668</span><a name="line.8668"></a>
-<span class="sourceLineNo">8669</span>  public void reportCompactionRequestEnd(boolean isMajor, int numFiles, long filesSizeCompacted) {<a name="line.8669"></a>
-<span class="sourceLineNo">8670</span>    int newValue = (isMajor ? majorInProgress : minorInProgress).decrementAndGet();<a name="line.8670"></a>
-<span class="sourceLineNo">8671</span><a name="line.8671"></a>
-<span class="sourceLineNo">8672</span>    // metrics<a name="line.8672"></a>
-<span class="sourceLineNo">8673</span>    compactionsFinished.increment();<a name="line.8673"></a>
-<span class="sourceLineNo">8674</span>    compactionNumFilesCompacted.add(numFiles);<a name="line.8674"></a>
-<span class="sourceLineNo">8675</span>    compactionNumBytesCompacted.add(filesSizeCompacted);<a name="line.8675"></a>
+<span class="sourceLineNo">8654</span>  @Override<a name="line.8654"></a>
+<span class="sourceLineNo">8655</span>  public Map&lt;byte[], Long&gt; getMaxStoreSeqId() {<a name="line.8655"></a>
+<span class="sourceLineNo">8656</span>    return this.maxSeqIdInStores;<a name="line.8656"></a>
+<span class="sourceLineNo">8657</span>  }<a name="line.8657"></a>
+<span class="sourceLineNo">8658</span><a name="line.8658"></a>
+<span class="sourceLineNo">8659</span>  public long getOldestSeqIdOfStore(byte[] familyName) {<a name="line.8659"></a>
+<span class="sourceLineNo">8660</span>    return wal.getEarliestMemStoreSeqNum(getRegionInfo().getEncodedNameAsBytes(), familyName);<a name="line.8660"></a>
+<span class="sourceLineNo">8661</span>  }<a name="line.8661"></a>
+<span class="sourceLineNo">8662</span><a name="line.8662"></a>
+<span class="sourceLineNo">8663</span>  @Override<a name="line.8663"></a>
+<span class="sourceLineNo">8664</span>  public CompactionState getCompactionState() {<a name="line.8664"></a>
+<span class="sourceLineNo">8665</span>    boolean hasMajor = majorInProgress.get() &gt; 0, hasMinor = minorInProgress.get() &gt; 0;<a name="line.8665"></a>
+<span class="sourceLineNo">8666</span>    return (hasMajor ? (hasMinor ? CompactionState.MAJOR_AND_MINOR : CompactionState.MAJOR)<a name="line.8666"></a>
+<span class="sourceLineNo">8667</span>        : (hasMinor ? CompactionState.MINOR : CompactionState.NONE));<a name="line.8667"></a>
+<span class="sourceLineNo">8668</span>  }<a name="line.8668"></a>
+<span class="sourceLineNo">8669</span><a name="line.8669"></a>
+<span class="sourceLineNo">8670</span>  public void reportCompactionRequestStart(boolean isMajor){<a name="line.8670"></a>
+<span class="sourceLineNo">8671</span>    (isMajor ? majorInProgress : minorInProgress).incrementAndGet();<a name="line.8671"></a>
+<span class="sourceLineNo">8672</span>  }<a name="line.8672"></a>
+<span class="sourceLineNo">8673</span><a name="line.8673"></a>
+<span class="sourceLineNo">8674</span>  public void reportCompactionRequestEnd(boolean isMajor, int numFiles, long filesSizeCompacted) {<a name="line.8674"></a>
+<span class="sourceLineNo">8675</span>    int newValue = (isMajor ? majorInProgress : minorInProgress).decrementAndGet();<a name="line.8675"></a>
 <span class="sourceLineNo">8676</span><a name="line.8676"></a>
-<span class="sourceLineNo">8677</span>    assert newValue &gt;= 0;<a name="line.8677"></a>
-<span class="sourceLineNo">8678</span>  }<a name="line.8678"></a>
-<span class="sourceLineNo">8679</span><a name="line.8679"></a>
-<span class="sourceLineNo">8680</span>  public void reportCompactionRequestFailure() {<a name="line.8680"></a>
-<span class="sourceLineNo">8681</span>    compactionsFailed.increment();<a name="line.8681"></a>
-<span class="sourceLineNo">8682</span>  }<a name="line.8682"></a>
-<span class="sourceLineNo">8683</span><a name="line.8683"></a>
-<span class="sourceLineNo">8684</span>  public void incrementCompactionsQueuedCount() {<a name="line.8684"></a>
-<span class="sourceLineNo">8685</span>    compactionsQueued.increment();<a name="line.8685"></a>
-<span class="sourceLineNo">8686</span>  }<a name="line.8686"></a>
-<span class="sourceLineNo">8687</span><a name="line.8687"></a>
-<span class="sourceLineNo">8688</span>  public void decrementCompactionsQueuedCount() {<a name="line.8688"></a>
-<span class="sourceLineNo">8689</span>    compactionsQueued.decrement();<a name="line.8689"></a>
-<span class="sourceLineNo">8690</span>  }<a name="line.8690"></a>
-<span class="sourceLineNo">8691</span><a name="line.8691"></a>
-<span class="sourceLineNo">8692</span>  public void incrementFlushesQueuedCount() {<a name="line.8692"></a>
-<span class="sourceLineNo">8693</span>    flushesQueued.increment();<a name="line.8693"></a>
-<span class="sourceLineNo">8694</span>  }<a name="line.8694"></a>
-<span class="sourceLineNo">8695</span><a name="line.8695"></a>
-<span class="sourceLineNo">8696</span>  @VisibleForTesting<a name="line.8696"></a>
-<span class="sourceLineNo">8697</span>  public long getReadPoint() {<a name="line.8697"></a>
-<span class="sourceLineNo">8698</span>    return getReadPoint(IsolationLevel.READ_COMMITTED);<a name="line.8698"></a>
+<span class="sourceLineNo">8677</span>    // metrics<a name="line.8677"></a>
+<span class="sourceLineNo">8678</span>    compactionsFinished.increment();<a name="line.8678"></a>
+<span class="sourceLineNo">8679</span>    compactionNumFilesCompacted.add(numFiles);<a name="line.8679"></a>
+<span class="sourceLineNo">8680</span>    compactionNumBytesCompacted.add(filesSizeCompacted);<a name="line.8680"></a>
+<span class="sourceLineNo">8681</span><a name="line.8681"></a>
+<span class="sourceLineNo">8682</span>    assert newValue &gt;= 0;<a name="line.8682"></a>
+<span class="sourceLineNo">8683</span>  }<a name="line.8683"></a>
+<span class="sourceLineNo">8684</span><a name="line.8684"></a>
+<span class="sourceLineNo">8685</span>  public void reportCompactionRequestFailure() {<a name="line.8685"></a>
+<span class="sourceLineNo">8686</span>    compactionsFailed.increment();<a name="line.8686"></a>
+<span class="sourceLineNo">8687</span>  }<a name="line.8687"></a>
+<span class="sourceLineNo">8688</span><a name="line.8688"></a>
+<span class="sourceLineNo">8689</span>  public void incrementCompactionsQueuedCount() {<a name="line.8689"></a>
+<span class="sourceLineNo">8690</span>    compactionsQueued.increment();<a name="line.8690"></a>
+<span class="sourceLineNo">8691</span>  }<a name="line.8691"></a>
+<span class="sourceLineNo">8692</span><a name="line.8692"></a>
+<span class="sourceLineNo">8693</span>  public void decrementCompactionsQueuedCount() {<a name="line.8693"></a>
+<span class="sourceLineNo">8694</span>    compactionsQueued.decrement();<a name="line.8694"></a>
+<span class="sourceLineNo">8695</span>  }<a name="line.8695"></a>
+<span class="sourceLineNo">8696</span><a name="line.8696"></a>
+<span class="sourceLineNo">8697</span>  public void incrementFlushesQueuedCount() {<a name="line.8697"></a>
+<span class="sourceLineNo">8698</span>    flushesQueued.increment();<a name="line.8698"></a>
 <span class="sourceLineNo">8699</span>  }<a name="line.8699"></a>
 <span class="sourceLineNo">8700</span><a name="line.8700"></a>
-<span class="sourceLineNo">8701</span>  /**<a name="line.8701"></a>
-<span class="sourceLineNo">8702</span>   * {@inheritDoc}<a name="line.8702"></a>
-<span class="sourceLineNo">8703</span>   */<a name="line.8703"></a>
-<span class="sourceLineNo">8704</span>  @Override<a name="line.8704"></a>
-<span class="sourceLineNo">8705</span>  public void onConfigurationChange(Configuration conf) {<a name="line.8705"></a>
-<span class="sourceLineNo">8706</span>    this.storeHotnessProtector.update(conf);<a name="line.8706"></a>
-<span class="sourceLineNo">8707</span>  }<a name="line.8707"></a>
-<span class="sourceLineNo">8708</span><a name="line.8708"></a>
-<span class="sourceLineNo">8709</span>  /**<a name="line.8709"></a>
-<span class="sourceLineNo">8710</span>   * {@inheritDoc}<a name="line.8710"></a>
-<span class="sourceLineNo">8711</span>   */<a name="line.8711"></a>
-<span class="sourceLineNo">8712</span>  @Override<a name="line.8712"></a>
-<span class="sourceLineNo">8713</span>  public void registerChildren(ConfigurationManager manager) {<a name="line.8713"></a>
-<span class="sourceLineNo">8714</span>    configurationManager = Optional.of(manager);<a name="line.8714"></a>
-<span class="sourceLineNo">8715</span>    stores.values().forEach(manager::registerObserver);<a name="line.8715"></a>
-<span class="sourceLineNo">8716</span>  }<a name="line.8716"></a>
-<span class="sourceLineNo">8717</span><a name="line.8717"></a>
-<span class="sourceLineNo">8718</span>  /**<a name="line.8718"></a>
-<span class="sourceLineNo">8719</span>   * {@inheritDoc}<a name="line.8719"></a>
-<span class="sourceLineNo">8720</span>   */<a name="line.8720"></a>
-<span class="sourceLineNo">8721</span>  @Override<a name="line.8721"></a>
-<span class="sourceLineNo">8722</span>  public void deregisterChildren(ConfigurationManager manager) {<a name="line.8722"></a>
-<span class="sourceLineNo">8723</span>    stores.values().forEach(configurationManager.get()::deregisterObserver);<a name="line.8723"></a>
-<span class="sourceLineNo">8724</span>  }<a name="line.8724"></a>
-<span class="sourceLineNo">8725</span><a name="line.8725"></a>
+<span class="sourceLineNo">8701</span>  @VisibleForTesting<a name="line.8701"></a>
+<span class="sourceLineNo">8702</span>  public long getReadPoint() {<a name="line.8702"></a>
+<span class="sourceLineNo">8703</span>    return getReadPoint(IsolationLevel.READ_COMMITTED);<a name="line.8703"></a>
+<span class="sourceLineNo">8704</span>  }<a name="line.8704"></a>
+<span class="sourceLineNo">8705</span><a name="line.8705"></a>
+<span class="sourceLineNo">8706</span>  /**<a name="line.8706"></a>
+<span class="sourceLineNo">8707</span>   * {@inheritDoc}<a name="line.8707"></a>
+<span class="sourceLineNo">8708</span>   */<a name="line.8708"></a>
+<span class="sourceLineNo">8709</span>  @Override<a name="line.8709"></a>
+<span class="sourceLineNo">8710</span>  public void onConfigurationChange(Configuration conf) {<a name="line.8710"></a>
+<span class="sourceLineNo">8711</span>    this.storeHotnessProtector.update(conf);<a name="line.8711"></a>
+<span class="sourceLineNo">8712</span>  }<a name="line.8712"></a>
+<span class="sourceLineNo">8713</span><a name="line.8713"></a>
+<span class="sourceLineNo">8714</span>  /**<a name="line.8714"></a>
+<span class="sourceLineNo">8715</span>   * {@inheritDoc}<a name="line.8715"></a>
+<span class="sourceLineNo">8716</span>   */<a name="line.8716"></a>
+<span class="sourceLineNo">8717</span>  @Override<a name="line.8717"></a>
+<span class="sourceLineNo">8718</span>  public void registerChildren(ConfigurationManager manager) {<a name="line.8718"></a>
+<span class="sourceLineNo">8719</span>    configurationManager = Optional.of(manager);<a name="line.8719"></a>
+<span class="sourceLineNo">8720</span>    stores.values().forEach(manager::registerObserver);<a name="line.8720"></a>
+<span class="sourceLineNo">8721</span>  }<a name="line.8721"></a>
+<span class="sourceLineNo">8722</span><a name="line.8722"></a>
+<span class="sourceLineNo">8723</span>  /**<a name="line.8723"></a>
+<span class="sourceLineNo">8724</span>   * {@inheritDoc}<a name="line.8724"></a>
+<span class="sourceLineNo">8725</span>   */<a name="line.8725"></a>
 <span class="sourceLineNo">8726</span>  @Override<a name="line.8726"></a>
-<span class="sourceLineNo">8727</span>  public CellComparator getCellComparator() {<a name="line.8727"></a>
-<span class="sourceLineNo">8728</span>    return this.getRegionInfo().isMetaRegion() ? CellComparatorImpl.META_COMPARATOR<a name="line.8728"></a>
-<span class="sourceLineNo">8729</span>        : CellComparatorImpl.COMPARATOR;<a name="line.8729"></a>
-<span class="sourceLineNo">8730</span>  }<a name="line.8730"></a>
-<span class="sourceLineNo">8731</span><a name="line.8731"></a>
-<span class="sourceLineNo">8732</span>  public long getMemStoreFlushSize() {<a name="line.8732"></a>
-<span class="sourceLineNo">8733</span>    return this.memstoreFlushSize;<a name="line.8733"></a>
-<span class="sourceLineNo">8734</span>  }<a name="line.8734"></a>
-<span class="sourceLineNo">8735</span><a name="line.8735"></a>
+<span class="sourceLineNo">8727</span>  public void deregisterChildren(ConfigurationManager manager) {<a name="line.8727"></a>
+<span class="sourceLineNo">8728</span>    stores.values().forEach(configurationManager.get()::deregisterObserver);<a name="line.8728"></a>
+<span class="sourceLineNo">8729</span>  }<a name="line.8729"></a>
+<span class="sourceLineNo">8730</span><a name="line.8730"></a>
+<span class="sourceLineNo">8731</span>  @Override<a name="line.8731"></a>
+<span class="sourceLineNo">8732</span>  public CellComparator getCellComparator() {<a name="line.8732"></a>
+<span class="sourceLineNo">8733</span>    return this.getRegionInfo().isMetaRegion() ? CellComparatorImpl.META_COMPARATOR<a name="line.8733"></a>
+<span class="sourceLineNo">8734</span>        : CellComparatorImpl.COMPARATOR;<a name="line.8734"></a>
+<span class="sourceLineNo">8735</span>  }<a name="line.8735"></a>
 <span class="sourceLineNo">8736</span><a name="line.8736"></a>
-<span class="sourceLineNo">8737</span>  //// method for debugging tests<a name="line.8737"></a>
-<span class="sourceLineNo">8738</span>  void throwException(String title, String regionName) {<a name="line.8738"></a>
-<span class="sourceLineNo">8739</span>    StringBuilder buf = new StringBuilder();<a name="line.8739"></a>
-<span class="sourceLineNo">8740</span>    buf.append(title + ", ");<a name="line.8740"></a>
-<span class="sourceLineNo">8741</span>    buf.append(getRegionInfo().toString());<a name="line.8741"></a>
-<span class="sourceLineNo">8742</span>    buf.append(getRegionInfo().isMetaRegion() ? " meta region " : " ");<a name="line.8742"></a>
-<span class="sourceLineNo">8743</span>    buf.append("stores: ");<a name="line.8743"></a>
-<span class="sourceLineNo">8744</span>    for (HStore s : stores.values()) {<a name="line.8744"></a>
-<span class="sourceLineNo">8745</span>      buf.append(s.getColumnFamilyDescriptor().getNameAsString());<a name="line.8745"></a>
-<span class="sourceLineNo">8746</span>      buf.append(" size: ");<a name="line.8746"></a>
-<span class="sourceLineNo">8747</span>      buf.append(s.getMemStoreSize().getDataSize());<a name="line.8747"></a>
-<span class="sourceLineNo">8748</span>      buf.append(" ");<a name="line.8748"></a>
-<span class="sourceLineNo">8749</span>    }<a name="line.8749"></a>
-<span class="sourceLineNo">8750</span>    buf.append("end-of-stores");<a name="line.8750"></a>
-<span class="sourceLineNo">8751</span>    buf.append(", memstore size ");<a name="line.8751"></a>
-<span class="sourceLineNo">8752</span>    buf.append(getMemStoreDataSize());<a name="line.8752"></a>
-<span class="sourceLineNo">8753</span>    if (getRegionInfo().getRegionNameAsString().startsWith(regionName)) {<a name="line.8753"></a>
-<span class="sourceLineNo">8754</span>      throw new RuntimeException(buf.toString());<a name="line.8754"></a>
-<span class="sourceLineNo">8755</span>    }<a name="line.8755"></a>
-<span class="sourceLineNo">8756</span>  }<a name="line.8756"></a>
-<span class="sourceLineNo">8757</span><a name="line.8757"></a>
-<span class="sourceLineNo">8758</span>  @Override<a name="line.8758"></a>
-<span class="sourceLineNo">8759</span>  public void requestCompaction(String why, int priority, boolean major,<a name="line.8759"></a>
-<span class="sourceLineNo">8760</span>      CompactionLifeCycleTracker tracker) throws IOException {<a name="line.8760"></a>
-<span class="sourceLineNo">8761</span>    if (major) {<a name="line.8761"></a>
-<span class="sourceLineNo">8762</span>      stores.values().forEach(HStore::triggerMajorCompaction);<a name="line.8762"></a>
-<span class="sourceLineNo">8763</span>    }<a name="line.8763"></a>
-<span class="sourceLineNo">8764</span>    rsServices.getCompactionRequestor().requestCompaction(this, why, priority, tracker,<a name="line.8764"></a>
-<span class="sourceLineNo">8765</span>        RpcServer.getRequestUser().orElse(null));<a name="line.8765"></a>
-<span class="sourceLineNo">8766</span>  }<a name="line.8766"></a>
-<span class="sourceLineNo">8767</span><a name="line.8767"></a>
-<span class="sourceLineNo">8768</span>  @Override<a name="line.8768"></a>
-<span class="sourceLineNo">8769</span>  public void requestCompaction(byte[] family, String why, int priority, boolean major,<a name="line.8769"></a>
-<span class="sourceLineNo">8770</span>      CompactionLifeCycleTracker tracker) throws IOException {<a name="line.8770"></a>
-<span class="sourceLineNo">8771</span>    HStore store = stores.get(family);<a name="line.8771"></a>
-<span class="sourceLineNo">8772</span>    if (store == null) {<a name="line.8772"></a>
-<span class="sourceLineNo">8773</span>      throw new NoSuchColumnFamilyException("column family " + Bytes.toString(family) +<a name="line.8773"></a>
-<span class="sourceLineNo">8774</span>          " does not exist in region " + getRegionInfo().getRegionNameAsString());<a name="line.8774"></a>
-<span class="sourceLineNo">8775</span>    }<a name="line.8775"></a>
-<span class="sourceLineNo">8776</span>    if (major) {<a name="line.8776"></a>
-<span class="sourceLineNo">8777</span>      store.triggerMajorCompaction();<a name="line.8777"></a>
-<span class="sourceLineNo">8778</span>    }<a name="line.8778"></a>
-<span class="sourceLineNo">8779</span>    rsServices.getCompactionRequestor().requestCompaction(this, store, why, priority, tracker,<a name="line.8779"></a>
-<span class="sourceLineNo">8780</span>        RpcServer.getRequestUser().orElse(null));<a name="line.8780"></a>
-<span class="sourceLineNo">8781</span>  }<a name="line.8781"></a>
-<span class="sourceLineNo">8782</span><a name="line.8782"></a>
-<span class="sourceLineNo">8783</span>  private void requestFlushIfNeeded() throws RegionTooBusyException {<a name="line.8783"></a>
-<span class="sourceLineNo">8784</span>    if(isFlushSize(this.memStoreSizing.getMemStoreSize())) {<a name="line.8784"></a>
-<span class="sourceLineNo">8785</span>      requestFlush();<a name="line.8785"></a>
-<span class="sourceLineNo">8786</span>    }<a name="line.8786"></a>
-<span class="sourceLineNo">8787</span>  }<a name="line.8787"></a>
-<span class="sourceLineNo">8788</span><a name="line.8788"></a>
-<span class="sourceLineNo">8789</span>  private void requestFlush() {<a name="line.8789"></a>
-<span class="sourceLineNo">8790</span>    if (this.rsServices == null) {<a name="line.8790"></a>
-<span class="sourceLineNo">8791</span>      return;<a name="line.8791"></a>
-<span class="sourceLineNo">8792</span>    }<a name="line.8792"></a>
-<span class="sourceLineNo">8793</span>    requestFlush0(FlushLifeCycleTracker.DUMMY);<a name="line.8793"></a>
-<span class="sourceLineNo">8794</span>  }<a name="line.8794"></a>
-<span class="sourceLineNo">8795</span><a name="line.8795"></a>
-<span class="sourceLineNo">8796</span>  private void requestFlush0(FlushLifeCycleTracker tracker) {<a name="line.8796"></a>
-<span class="sourceLineNo">8797</span>    boolean shouldFlush = false;<a name="line.8797"></a>
-<span class="sourceLineNo">8798</span>    synchronized (writestate) {<a name="line.8798"></a>
-<span class="sourceLineNo">8799</span>      if (!this.writestate.isFlushRequested()) {<a name="line.8799"></a>
-<span class="sourceLineNo">8800</span>        shouldFlush = true;<a name="line.8800"></a>
-<span class="sourceLineNo">8801</span>        writestate.flushRequested = true;<a name="line.8801"></a>
-<span class="sourceLineNo">8802</span>      }<a name="line.8802"></a>
-<span class="sourceLineNo">8803</span>    }<a name="line.8803"></a>
-<span class="sourceLineNo">8804</span>    if (shouldFlush) {<a name="line.8804"></a>
-<span class="sourceLineNo">8805</span>      // Make request outside of synchronize block; HBASE-818.<a name="line.8805"></a>
-<span class="sourceLineNo">8806</span>      this.rsServices.getFlushRequester().requestFlush(this, false, tracker);<a name="line.8806"></a>
-<span class="sourceLineNo">8807</span>      if (LOG.isDebugEnabled()) {<a name="line.8807"></a>
-<span class="sourceLineNo">8808</span>        LOG.debug("Flush requested on " + this.getRegionInfo().getEncodedName());<a name="line.8808"></a>
-<span class="sourceLineNo">8809</span>      }<a name="line.8809"></a>
-<span class="sourceLineNo">8810</span>    } else {<a name="line.8810"></a>
-<span class="sourceLineNo">8811</span>      tracker.notExecuted("Flush already requested on " + this);<a name="line.8811"></a>
-<span class="sourceLineNo">8812</span>    }<a name="line.8812"></a>
-<span class="sourceLineNo">8813</span>  }<a name="line.8813"></a>
-<span class="sourceLineNo">8814</span><a name="line.8814"></a>
-<span class="sourceLineNo">8815</span>  @Override<a name="line.8815"></a>
-<span class="sourceLineNo">8816</span>  public void requestFlush(FlushLifeCycleTracker tracker) throws IOException {<a name="line.8816"></a>
-<span class="sourceLineNo">8817</span>    requestFlush0(tracker);<a name="line.8817"></a>
+<span class="sourceLineNo">8737</span>  public long getMemStoreFlushSize() {<a name="line.8737"></a>
+<span class="sourceLineNo">8738</span>    return this.memstoreFlushSize;<a name="line.8738"></a>
+<span class="sourceLineNo">8739</span>  }<a name="line.8739"></a>
+<span class="sourceLineNo">8740</span><a name="line.8740"></a>
+<span class="sourceLineNo">8741</span><a name="line.8741"></a>
+<span class="sourceLineNo">8742</span>  //// method for debugging tests<a name="line.8742"></a>
+<span class="sourceLineNo">8743</span>  void throwException(String title, String regionName) {<a name="line.8743"></a>
+<span class="sourceLineNo">8744</span>    StringBuilder buf = new StringBuilder();<a name="line.8744"></a>
+<span class="sourceLineNo">8745</span>    buf.append(title + ", ");<a name="line.8745"></a>
+<span class="sourceLineNo">8746</span>    buf.append(getRegionInfo().toString());<a name="line.8746"></a>
+<span class="sourceLineNo">8747</span>    buf.append(getRegionInfo().isMetaRegion() ? " meta region " : " ");<a name="line.8747"></a>
+<span class="sourceLineNo">8748</span>    buf.append("stores: ");<a name="line.8748"></a>
+<span class="sourceLineNo">8749</span>    for (HStore s : stores.values()) {<a name="line.8749"></a>
+<span class="sourceLineNo">8750</span>      buf.append(s.getColumnFamilyDescriptor().getNameAsString());<a name="line.8750"></a>
+<span class="sourceLineNo">8751</span>      buf.append(" size: ");<a name="line.8751"></a>
+<span class="sourceLineNo">8752</span>      buf.append(s.getMemStoreSize().getDataSize());<a name="line.8752"></a>
+<span class="sourceLineNo">8753</span>      buf.append(" ");<a name="line.8753"></a>
+<span class="sourceLineNo">8754</span>    }<a name="line.8754"></a>
+<span class="sourceLineNo">8755</span>    buf.append("end-of-stores");<a name="line.8755"></a>
+<span class="sourceLineNo">8756</span>    buf.append(", memstore size ");<a name="line.8756"></a>
+<span class="sourceLineNo">8757</span>    buf.append(getMemStoreDataSize());<a name="line.8757"></a>
+<span class="sourceLineNo">8758</span>    if (getRegionInfo().getRegionNameAsString().startsWith(regionName)) {<a name="line.8758"></a>
+<span class="sourceLineNo">8759</span>      throw new RuntimeException(buf.toString());<a name="line.8759"></a>
+<span class="sourceLineNo">8760</span>    }<a name="line.8760"></a>
+<span class="sourceLineNo">8761</span>  }<a name="line.8761"></a>
+<span class="sourceLineNo">8762</span><a name="line.8762"></a>
+<span class="sourceLineNo">8763</span>  @Override<a name="line.8763"></a>
+<span class="sourceLineNo">8764</span>  public void requestCompaction(String why, int priority, boolean major,<a name="line.8764"></a>
+<span class="sourceLineNo">8765</span>      CompactionLifeCycleTracker tracker) throws IOException {<a name="line.8765"></a>
+<span class="sourceLineNo">8766</span>    if (major) {<a name="line.8766"></a>
+<span class="sourceLineNo">8767</span>      stores.values().forEach(HStore::triggerMajorCompaction);<a name="line.8767"></a>
+<span class="sourceLineNo">8768</span>    }<a name="line.8768"></a>
+<span class="sourceLineNo">8769</span>    rsServices.getCompactionRequestor().requestCompaction(this, why, priority, tracker,<a name="line.8769"></a>
+<span class="sourceLineNo">8770</span>        RpcServer.getRequestUser().orElse(null));<a name="line.8770"></a>
+<span class="sourceLineNo">8771</span>  }<a name="line.8771"></a>
+<span class="sourceLineNo">8772</span><a name="line.8772"></a>
+<span class="sourceLineNo">8773</span>  @Override<a name="line.8773"></a>
+<span class="sourceLineNo">8774</span>  public void requestCompaction(byte[] family, String why, int priority, boolean major,<a name="line.8774"></a>
+<span class="sourceLineNo">8775</span>      CompactionLifeCycleTracker tracker) throws IOException {<a name="line.8775"></a>
+<span class="sourceLineNo">8776</span>    HStore store = stores.get(family);<a name="line.8776"></a>
+<span class="sourceLineNo">8777</span>    if (store == null) {<a name="line.8777"></a>
+<span class="sourceLineNo">8778</span>      throw new NoSuchColumnFamilyException("column family " + Bytes.toString(family) +<a name="line.8778"></a>
+<span class="sourceLineNo">8779</span>          " does not exist in region " + getRegionInfo().getRegionNameAsString());<a name="line.8779"></a>
+<span class="sourceLineNo">8780</span>    }<a name="line.8780"></a>
+<span class="sourceLineNo">8781</span>    if (major) {<a name="line.8781"></a>
+<span class="sourceLineNo">8782</span>      store.triggerMajorCompaction();<a name="line.8782"></a>
+<span class="sourceLineNo">8783</span>    }<a name="line.8783"></a>
+<span class="sourceLineNo">8784</span>    rsServices.getCompactionRequestor().requestCompaction(this, store, why, priority, tracker,<a name="line.8784"></a>
+<span class="sourceLineNo">8785</span>        RpcServer.getRequestUser().orElse(null));<a name="line.8785"></a>
+<span class="sourceLineNo">8786</span>  }<a name="line.8786"></a>
+<span class="sourceLineNo">8787</span><a name="line.8787"></a>
+<span class="sourceLineNo">8788</span>  private void requestFlushIfNeeded() throws RegionTooBusyException {<a name="line.8788"></a>
+<span class="sourceLineNo">8789</span>    if(isFlushSize(this.memStoreSizing.getMemStoreSize())) {<a name="line.8789"></a>
+<span class="sourceLineNo">8790</span>      requestFlush();<a name="line.8790"></a>
+<span class="sourceLineNo">8791</span>    }<a name="line.8791"></a>
+<span class="sourceLineNo">8792</span>  }<a name="line.8792"></a>
+<span class="sourceLineNo">8793</span><a name="line.8793"></a>
+<span class="sourceLineNo">8794</span>  private void requestFlush() {<a name="line.8794"></a>
+<span class="sourceLineNo">8795</span>    if (this.rsServices == null) {<a name="line.8795"></a>
+<span class="sourceLineNo">8796</span>      return;<a name="line.8796"></a>
+<span class="sourceLineNo">8797</span>    }<a name="line.8797"></a>
+<span class="sourceLineNo">8798</span>    requestFlush0(FlushLifeCycleTracker.DUMMY);<a name="line.8798"></a>
+<span class="sourceLineNo">8799</span>  }<a name="line.8799"></a>
+<span class="sourceLineNo">8800</span><a name="line.8800"></a>
+<span class="sourceLineNo">8801</span>  private void requestFlush0(FlushLifeCycleTracker tracker) {<a name="line.8801"></a>
+<span class="sourceLineNo">8802</span>    boolean shouldFlush = false;<a name="line.8802"></a>
+<span class="sourceLineNo">8803</span>    synchronized (writestate) {<a name="line.8803"></a>
+<span class="sourceLineNo">8804</span>      if (!this.writestate.isFlushRequested()) {<a name="line.8804"></a>
+<span class="sourceLineNo">8805</span>        shouldFlush = true;<a name="line.8805"></a>
+<span class="sourceLineNo">8806</span>        writestate.flushRequested = true;<a name="line.8806"></a>
+<span class="sourceLineNo">8807</span>      }<a name="line.8807"></a>
+<span class="sourceLineNo">8808</span>    }<a name="line.8808"></a>
+<span class="sourceLineNo">8809</span>    if (shouldFlush) {<a name="line.8809"></a>
+<span class="sourceLineNo">8810</span>      // Make request outside of synchronize block; HBASE-818.<a name="line.8810"></a>
+<span class="sourceLineNo">8811</span>      this.rsServices.getFlushRequester().requestFlush(this, false, tracker);<a name="line.8811"></a>
+<span class="sourceLineNo">8812</span>      if (LOG.isDebugEnabled()) {<a name="line.8812"></a>
+<span class="sourceLineNo">8813</span>        LOG.debug("Flush requested on " + this.getRegionInfo().getEncodedName());<a name="line.8813"></a>
+<span class="sourceLineNo">8814</span>      }<a name="line.8814"></a>
+<span class="sourceLineNo">8815</span>    } else {<a name="line.8815"></a>
+<span class="sourceLineNo">8816</span>      tracker.notExecuted("Flush already requested on " + this);<a name="line.8816"></a>
+<span class="sourceLineNo">8817</span>    }<a name="line.8817"></a>
 <span class="sourceLineNo">8818</span>  }<a name="line.8818"></a>
 <span class="sourceLineNo">8819</span><a name="line.8819"></a>
-<span class="sourceLineNo">8820</span>  /**<a name="line.8820"></a>
-<span class="sourceLineNo">8821</span>   * This method modifies the region's configuration in order to inject replication-related<a name="line.8821"></a>
-<span class="sourceLineNo">8822</span>   * features<a name="line.8822"></a>
-<span class="sourceLineNo">8823</span>   * @param conf region configurations<a name="line.8823"></a>
-<span class="sourceLineNo">8824</span>   */<a name="line.8824"></a>
-<span class="sourceLineNo">8825</span>  static void decorateRegionConfiguration(Configuration conf) {<a name="line.8825"></a>
-<span class="sourceLineNo">8826</span>    if (ReplicationUtils.isReplicationForBulkLoadDataEnabled(conf)) {<a name="line.8826"></a>
-<span class="sourceLineNo">8827</span>      String plugins = conf.get(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY,"");<a name="line.8827"></a>
-<span class="sourceLineNo">8828</span>      String replicationCoprocessorClass = ReplicationObserver.class.getCanonicalName();<a name="line.8828"></a>
-<span class="sourceLineNo">8829</span>      if (!plugins.contains(replicationCoprocessorClass)) {<a name="line.8829"></a>
-<span class="sourceLineNo">8830</span>        conf.set(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY,<a name="line.8830"></a>
-<span class="sourceLineNo">8831</span>            (plugins.equals("") ? "" : (plugins + ",")) + replicationCoprocessorClass);<a name="line.8831"></a>
-<span class="sourceLineNo">8832</span>      }<a name="line.8832"></a>
-<span class="sourceLineNo">8833</span>    }<a name="line.8833"></a>
-<span class="sourceLineNo">8834</span>  }<a name="line.8834"></a>
-<span class="sourceLineNo">8835</span>}<a name="line.8835"></a>
+<span class="sourceLineNo">8820</span>  @Override<a name="line.8820"></a>
+<span class="sourceLineNo">8821</span>  public void requestFlush(FlushLifeCycleTracker tracker) throws IOException {<a name="line.8821"></a>
+<span class="sourceLineNo">8822</span>    requestFlush0(tracker);<a name="line.8822"></a>
+<span class="sourceLineNo">8823</span>  }<a name="line.8823"></a>
+<span class="sourceLineNo">8824</span><a name="line.8824"></a>
+<span class="sourceLineNo">8825</span>  /**<a name="line.8825"></a>
+<span class="sourceLineNo">8826</span>   * This method modifies the region's configuration in order to inject replication-related<a name="line.8826"></a>
+<span class="sourceLineNo">8827</span>   * features<a name="line.8827"></a>
+<span class="sourceLineNo">8828</span>   * @param conf region configurations<a name="line.8828"></a>
+<span class="sourceLineNo">8829</span>   */<a name="line.8829"></a>
+<span class="sourceLineNo">8830</span>  static void decorateRegionConfiguration(Configuration conf) {<a name="line.8830"></a>
+<span class="sourceLineNo">8831</span>    if (ReplicationUtils.isReplicationForBulkLoadDataEnabled(conf)) {<a name="line.8831"></a>
+<span class="sourceLineNo">8832</span>      String plugins = conf.get(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY,"");<a name="line.8832"></a>
+<span class="sourceLineNo">8833</span>      String replicationCoprocessorClass = ReplicationObserver.class.getCanonicalName();<a name="line.8833"></a>
+<span class="sourceLineNo">8834</span>      if (!plugins.contains(replicationCoprocessorClass)) {<a name="line.8834"></a>
+<span class="sourceLineNo">8835</span>        conf.set(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY,<a name="line.8835"></a>
+<span class="sourceLineNo">8836</span>            (plugins.equals("") ? "" : (plugins + ",")) + replicationCoprocessorClass);<a name="line.8836"></a>
+<span class="sourceLineNo">8837</span>      }<a name="line.8837"></a>
+<span class="sourceLineNo">8838</span>    }<a name="line.8838"></a>
+<span class="sourceLineNo">8839</span>  }<a name="line.8839"></a>
+<span class="sourceLineNo">8840</span>}<a name="line.8840"></a>
 
 
 
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 8fcec33..2147e82 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
@@ -7972,875 +7972,880 @@
 <span class="sourceLineNo">7964</span>    if (walEdit.isReplay()) {<a name="line.7964"></a>
 <span class="sourceLineNo">7965</span>      walKey.setOrigLogSeqNum(origLogSeqNum);<a name="line.7965"></a>
 <span class="sourceLineNo">7966</span>    }<a name="line.7966"></a>
-<span class="sourceLineNo">7967</span>    WriteEntry writeEntry = null;<a name="line.7967"></a>
-<span class="sourceLineNo">7968</span>    try {<a name="line.7968"></a>
-<span class="sourceLineNo">7969</span>      long txid = this.wal.append(this.getRegionInfo(), walKey, walEdit, true);<a name="line.7969"></a>
-<span class="sourceLineNo">7970</span>      // Call sync on our edit.<a name="line.7970"></a>
-<span class="sourceLineNo">7971</span>      if (txid != 0) {<a name="line.7971"></a>
-<span class="sourceLineNo">7972</span>        sync(txid, durability);<a name="line.7972"></a>
-<span class="sourceLineNo">7973</span>      }<a name="line.7973"></a>
-<span class="sourceLineNo">7974</span>      writeEntry = walKey.getWriteEntry();<a name="line.7974"></a>
-<span class="sourceLineNo">7975</span>    } catch (IOException ioe) {<a name="line.7975"></a>
-<span class="sourceLineNo">7976</span>      if (walKey != null &amp;&amp; walKey.getWriteEntry() != null) {<a name="line.7976"></a>
-<span class="sourceLineNo">7977</span>        mvcc.complete(walKey.getWriteEntry());<a name="line.7977"></a>
+<span class="sourceLineNo">7967</span>    //don't call the coproc hook for writes to the WAL caused by<a name="line.7967"></a>
+<span class="sourceLineNo">7968</span>    //system lifecycle events like flushes or compactions<a name="line.7968"></a>
+<span class="sourceLineNo">7969</span>    if (this.coprocessorHost != null &amp;&amp; !walEdit.isMetaEdit()) {<a name="line.7969"></a>
+<span class="sourceLineNo">7970</span>      this.coprocessorHost.preWALAppend(walKey, walEdit);<a name="line.7970"></a>
+<span class="sourceLineNo">7971</span>    }<a name="line.7971"></a>
+<span class="sourceLineNo">7972</span>    WriteEntry writeEntry = null;<a name="line.7972"></a>
+<span class="sourceLineNo">7973</span>    try {<a name="line.7973"></a>
+<span class="sourceLineNo">7974</span>      long txid = this.wal.append(this.getRegionInfo(), walKey, walEdit, true);<a name="line.7974"></a>
+<span class="sourceLineNo">7975</span>      // Call sync on our edit.<a name="line.7975"></a>
+<span class="sourceLineNo">7976</span>      if (txid != 0) {<a name="line.7976"></a>
+<span class="sourceLineNo">7977</span>        sync(txid, durability);<a name="line.7977"></a>
 <span class="sourceLineNo">7978</span>      }<a name="line.7978"></a>
-<span class="sourceLineNo">7979</span>      throw ioe;<a name="line.7979"></a>
-<span class="sourceLineNo">7980</span>    }<a name="line.7980"></a>
-<span class="sourceLineNo">7981</span>    return writeEntry;<a name="line.7981"></a>
-<span class="sourceLineNo">7982</span>  }<a name="line.7982"></a>
-<span class="sourceLineNo">7983</span><a name="line.7983"></a>
-<span class="sourceLineNo">7984</span>  /**<a name="line.7984"></a>
-<span class="sourceLineNo">7985</span>   * Do coprocessor pre-increment or pre-append call.<a name="line.7985"></a>
-<span class="sourceLineNo">7986</span>   * @return Result returned out of the coprocessor, which means bypass all further processing and<a name="line.7986"></a>
-<span class="sourceLineNo">7987</span>   *  return the proffered Result instead, or null which means proceed.<a name="line.7987"></a>
-<span class="sourceLineNo">7988</span>   */<a name="line.7988"></a>
-<span class="sourceLineNo">7989</span>  private Result doCoprocessorPreCall(final Operation op, final Mutation mutation)<a name="line.7989"></a>
-<span class="sourceLineNo">7990</span>  throws IOException {<a name="line.7990"></a>
-<span class="sourceLineNo">7991</span>    Result result = null;<a name="line.7991"></a>
-<span class="sourceLineNo">7992</span>    if (this.coprocessorHost != null) {<a name="line.7992"></a>
-<span class="sourceLineNo">7993</span>      switch(op) {<a name="line.7993"></a>
-<span class="sourceLineNo">7994</span>        case INCREMENT:<a name="line.7994"></a>
-<span class="sourceLineNo">7995</span>          result = this.coprocessorHost.preIncrementAfterRowLock((Increment)mutation);<a name="line.7995"></a>
-<span class="sourceLineNo">7996</span>          break;<a name="line.7996"></a>
-<span class="sourceLineNo">7997</span>        case APPEND:<a name="line.7997"></a>
-<span class="sourceLineNo">7998</span>          result = this.coprocessorHost.preAppendAfterRowLock((Append)mutation);<a name="line.7998"></a>
-<span class="sourceLineNo">7999</span>          break;<a name="line.7999"></a>
-<span class="sourceLineNo">8000</span>        default: throw new UnsupportedOperationException(op.toString());<a name="line.8000"></a>
-<span class="sourceLineNo">8001</span>      }<a name="line.8001"></a>
-<span class="sourceLineNo">8002</span>    }<a name="line.8002"></a>
-<span class="sourceLineNo">8003</span>    return result;<a name="line.8003"></a>
-<span class="sourceLineNo">8004</span>  }<a name="line.8004"></a>
-<span class="sourceLineNo">8005</span><a name="line.8005"></a>
-<span class="sourceLineNo">8006</span>  /**<a name="line.8006"></a>
-<span class="sourceLineNo">8007</span>   * Reckon the Cells to apply to WAL, memstore, and to return to the Client; these Sets are not<a name="line.8007"></a>
-<span class="sourceLineNo">8008</span>   * always the same dependent on whether to write WAL.<a name="line.8008"></a>
-<span class="sourceLineNo">8009</span>   *<a name="line.8009"></a>
-<span class="sourceLineNo">8010</span>   * @param results Fill in here what goes back to the Client if it is non-null (if null, client<a name="line.8010"></a>
-<span class="sourceLineNo">8011</span>   *  doesn't want results).<a name="line.8011"></a>
-<span class="sourceLineNo">8012</span>   * @param forMemStore Fill in here what to apply to the MemStore (by Store).<a name="line.8012"></a>
-<span class="sourceLineNo">8013</span>   * @return A WALEdit to apply to WAL or null if we are to skip the WAL.<a name="line.8013"></a>
-<span class="sourceLineNo">8014</span>   */<a name="line.8014"></a>
-<span class="sourceLineNo">8015</span>  private WALEdit reckonDeltas(Operation op, Mutation mutation, Durability effectiveDurability,<a name="line.8015"></a>
-<span class="sourceLineNo">8016</span>      Map&lt;HStore, List&lt;Cell&gt;&gt; forMemStore, List&lt;Cell&gt; results) throws IOException {<a name="line.8016"></a>
-<span class="sourceLineNo">8017</span>    WALEdit walEdit = null;<a name="line.8017"></a>
-<span class="sourceLineNo">8018</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.8018"></a>
-<span class="sourceLineNo">8019</span>    final boolean writeToWAL = effectiveDurability != Durability.SKIP_WAL;<a name="line.8019"></a>
-<span class="sourceLineNo">8020</span>    // Process a Store/family at a time.<a name="line.8020"></a>
-<span class="sourceLineNo">8021</span>    for (Map.Entry&lt;byte [], List&lt;Cell&gt;&gt; entry: mutation.getFamilyCellMap().entrySet()) {<a name="line.8021"></a>
-<span class="sourceLineNo">8022</span>      final byte[] columnFamilyName = entry.getKey();<a name="line.8022"></a>
-<span class="sourceLineNo">8023</span>      List&lt;Cell&gt; deltas = entry.getValue();<a name="line.8023"></a>
-<span class="sourceLineNo">8024</span>      // Reckon for the Store what to apply to WAL and MemStore.<a name="line.8024"></a>
-<span class="sourceLineNo">8025</span>      List&lt;Cell&gt; toApply = reckonDeltasByStore(stores.get(columnFamilyName), op, mutation,<a name="line.8025"></a>
-<span class="sourceLineNo">8026</span>        effectiveDurability, now, deltas, results);<a name="line.8026"></a>
-<span class="sourceLineNo">8027</span>      if (!toApply.isEmpty()) {<a name="line.8027"></a>
-<span class="sourceLineNo">8028</span>        for (Cell cell : toApply) {<a name="line.8028"></a>
-<span class="sourceLineNo">8029</span>          HStore store = getStore(cell);<a name="line.8029"></a>
-<span class="sourceLineNo">8030</span>          if (store == null) {<a name="line.8030"></a>
-<span class="sourceLineNo">8031</span>            checkFamily(CellUtil.cloneFamily(cell));<a name="line.8031"></a>
-<span class="sourceLineNo">8032</span>          } else {<a name="line.8032"></a>
-<span class="sourceLineNo">8033</span>            forMemStore.computeIfAbsent(store, key -&gt; new ArrayList&lt;&gt;()).add(cell);<a name="line.8033"></a>
-<span class="sourceLineNo">8034</span>          }<a name="line.8034"></a>
-<span class="sourceLineNo">8035</span>        }<a name="line.8035"></a>
-<span class="sourceLineNo">8036</span>        if (writeToWAL) {<a name="line.8036"></a>
-<span class="sourceLineNo">8037</span>          if (walEdit == null) {<a name="line.8037"></a>
-<span class="sourceLineNo">8038</span>            walEdit = new WALEdit();<a name="line.8038"></a>
+<span class="sourceLineNo">7979</span>      writeEntry = walKey.getWriteEntry();<a name="line.7979"></a>
+<span class="sourceLineNo">7980</span>    } catch (IOException ioe) {<a name="line.7980"></a>
+<span class="sourceLineNo">7981</span>      if (walKey != null &amp;&amp; walKey.getWriteEntry() != null) {<a name="line.7981"></a>
+<span class="sourceLineNo">7982</span>        mvcc.complete(walKey.getWriteEntry());<a name="line.7982"></a>
+<span class="sourceLineNo">7983</span>      }<a name="line.7983"></a>
+<span class="sourceLineNo">7984</span>      throw ioe;<a name="line.7984"></a>
+<span class="sourceLineNo">7985</span>    }<a name="line.7985"></a>
+<span class="sourceLineNo">7986</span>    return writeEntry;<a name="line.7986"></a>
+<span class="sourceLineNo">7987</span>  }<a name="line.7987"></a>
+<span class="sourceLineNo">7988</span><a name="line.7988"></a>
+<span class="sourceLineNo">7989</span>  /**<a name="line.7989"></a>
+<span class="sourceLineNo">7990</span>   * Do coprocessor pre-increment or pre-append call.<a name="line.7990"></a>
+<span class="sourceLineNo">7991</span>   * @return Result returned out of the coprocessor, which means bypass all further processing and<a name="line.7991"></a>
+<span class="sourceLineNo">7992</span>   *  return the proffered Result instead, or null which means proceed.<a name="line.7992"></a>
+<span class="sourceLineNo">7993</span>   */<a name="line.7993"></a>
+<span class="sourceLineNo">7994</span>  private Result doCoprocessorPreCall(final Operation op, final Mutation mutation)<a name="line.7994"></a>
+<span class="sourceLineNo">7995</span>  throws IOException {<a name="line.7995"></a>
+<span class="sourceLineNo">7996</span>    Result result = null;<a name="line.7996"></a>
+<span class="sourceLineNo">7997</span>    if (this.coprocessorHost != null) {<a name="line.7997"></a>
+<span class="sourceLineNo">7998</span>      switch(op) {<a name="line.7998"></a>
+<span class="sourceLineNo">7999</span>        case INCREMENT:<a name="line.7999"></a>
+<span class="sourceLineNo">8000</span>          result = this.coprocessorHost.preIncrementAfterRowLock((Increment)mutation);<a name="line.8000"></a>
+<span class="sourceLineNo">8001</span>          break;<a name="line.8001"></a>
+<span class="sourceLineNo">8002</span>        case APPEND:<a name="line.8002"></a>
+<span class="sourceLineNo">8003</span>          result = this.coprocessorHost.preAppendAfterRowLock((Append)mutation);<a name="line.8003"></a>
+<span class="sourceLineNo">8004</span>          break;<a name="line.8004"></a>
+<span class="sourceLineNo">8005</span>        default: throw new UnsupportedOperationException(op.toString());<a name="line.8005"></a>
+<span class="sourceLineNo">8006</span>      }<a name="line.8006"></a>
+<span class="sourceLineNo">8007</span>    }<a name="line.8007"></a>
+<span class="sourceLineNo">8008</span>    return result;<a name="line.8008"></a>
+<span class="sourceLineNo">8009</span>  }<a name="line.8009"></a>
+<span class="sourceLineNo">8010</span><a name="line.8010"></a>
+<span class="sourceLineNo">8011</span>  /**<a name="line.8011"></a>
+<span class="sourceLineNo">8012</span>   * Reckon the Cells to apply to WAL, memstore, and to return to the Client; these Sets are not<a name="line.8012"></a>
+<span class="sourceLineNo">8013</span>   * always the same dependent on whether to write WAL.<a name="line.8013"></a>
+<span class="sourceLineNo">8014</span>   *<a name="line.8014"></a>
+<span class="sourceLineNo">8015</span>   * @param results Fill in here what goes back to the Client if it is non-null (if null, client<a name="line.8015"></a>
+<span class="sourceLineNo">8016</span>   *  doesn't want results).<a name="line.8016"></a>
+<span class="sourceLineNo">8017</span>   * @param forMemStore Fill in here what to apply to the MemStore (by Store).<a name="line.8017"></a>
+<span class="sourceLineNo">8018</span>   * @return A WALEdit to apply to WAL or null if we are to skip the WAL.<a name="line.8018"></a>
+<span class="sourceLineNo">8019</span>   */<a name="line.8019"></a>
+<span class="sourceLineNo">8020</span>  private WALEdit reckonDeltas(Operation op, Mutation mutation, Durability effectiveDurability,<a name="line.8020"></a>
+<span class="sourceLineNo">8021</span>      Map&lt;HStore, List&lt;Cell&gt;&gt; forMemStore, List&lt;Cell&gt; results) throws IOException {<a name="line.8021"></a>
+<span class="sourceLineNo">8022</span>    WALEdit walEdit = null;<a name="line.8022"></a>
+<span class="sourceLineNo">8023</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.8023"></a>
+<span class="sourceLineNo">8024</span>    final boolean writeToWAL = effectiveDurability != Durability.SKIP_WAL;<a name="line.8024"></a>
+<span class="sourceLineNo">8025</span>    // Process a Store/family at a time.<a name="line.8025"></a>
+<span class="sourceLineNo">8026</span>    for (Map.Entry&lt;byte [], List&lt;Cell&gt;&gt; entry: mutation.getFamilyCellMap().entrySet()) {<a name="line.8026"></a>
+<span class="sourceLineNo">8027</span>      final byte[] columnFamilyName = entry.getKey();<a name="line.8027"></a>
+<span class="sourceLineNo">8028</span>      List&lt;Cell&gt; deltas = entry.getValue();<a name="line.8028"></a>
+<span class="sourceLineNo">8029</span>      // Reckon for the Store what to apply to WAL and MemStore.<a name="line.8029"></a>
+<span class="sourceLineNo">8030</span>      List&lt;Cell&gt; toApply = reckonDeltasByStore(stores.get(columnFamilyName), op, mutation,<a name="line.8030"></a>
+<span class="sourceLineNo">8031</span>        effectiveDurability, now, deltas, results);<a name="line.8031"></a>
+<span class="sourceLineNo">8032</span>      if (!toApply.isEmpty()) {<a name="line.8032"></a>
+<span class="sourceLineNo">8033</span>        for (Cell cell : toApply) {<a name="line.8033"></a>
+<span class="sourceLineNo">8034</span>          HStore store = getStore(cell);<a name="line.8034"></a>
+<span class="sourceLineNo">8035</span>          if (store == null) {<a name="line.8035"></a>
+<span class="sourceLineNo">8036</span>            checkFamily(CellUtil.cloneFamily(cell));<a name="line.8036"></a>
+<span class="sourceLineNo">8037</span>          } else {<a name="line.8037"></a>
+<span class="sourceLineNo">8038</span>            forMemStore.computeIfAbsent(store, key -&gt; new ArrayList&lt;&gt;()).add(cell);<a name="line.8038"></a>
 <span class="sourceLineNo">8039</span>          }<a name="line.8039"></a>
-<span class="sourceLineNo">8040</span>          walEdit.getCells().addAll(toApply);<a name="line.8040"></a>
-<span class="sourceLineNo">8041</span>        }<a name="line.8041"></a>
-<span class="sourceLineNo">8042</span>      }<a name="line.8042"></a>
-<span class="sourceLineNo">8043</span>    }<a name="line.8043"></a>
-<span class="sourceLineNo">8044</span>    return walEdit;<a name="line.8044"></a>
-<span class="sourceLineNo">8045</span>  }<a name="line.8045"></a>
-<span class="sourceLineNo">8046</span><a name="line.8046"></a>
-<span class="sourceLineNo">8047</span>  /**<a name="line.8047"></a>
-<span class="sourceLineNo">8048</span>   * Reckon the Cells to apply to WAL, memstore, and to return to the Client in passed<a name="line.8048"></a>
-<span class="sourceLineNo">8049</span>   * column family/Store.<a name="line.8049"></a>
-<span class="sourceLineNo">8050</span>   *<a name="line.8050"></a>
-<span class="sourceLineNo">8051</span>   * Does Get of current value and then adds passed in deltas for this Store returning the result.<a name="line.8051"></a>
-<span class="sourceLineNo">8052</span>   *<a name="line.8052"></a>
-<span class="sourceLineNo">8053</span>   * @param op Whether Increment or Append<a name="line.8053"></a>
-<span class="sourceLineNo">8054</span>   * @param mutation The encompassing Mutation object<a name="line.8054"></a>
-<span class="sourceLineNo">8055</span>   * @param deltas Changes to apply to this Store; either increment amount or data to append<a name="line.8055"></a>
-<span class="sourceLineNo">8056</span>   * @param results In here we accumulate all the Cells we are to return to the client. If null,<a name="line.8056"></a>
-<span class="sourceLineNo">8057</span>   *                client doesn't want results returned.<a name="line.8057"></a>
-<span class="sourceLineNo">8058</span>   * @return Resulting Cells after &lt;code&gt;deltas&lt;/code&gt; have been applied to current<a name="line.8058"></a>
-<span class="sourceLineNo">8059</span>   *  values. Side effect is our filling out of the &lt;code&gt;results&lt;/code&gt; List.<a name="line.8059"></a>
-<span class="sourceLineNo">8060</span>   */<a name="line.8060"></a>
-<span class="sourceLineNo">8061</span>  private List&lt;Cell&gt; reckonDeltasByStore(HStore store, Operation op, Mutation mutation,<a name="line.8061"></a>
-<span class="sourceLineNo">8062</span>      Durability effectiveDurability, long now, List&lt;Cell&gt; deltas, List&lt;Cell&gt; results)<a name="line.8062"></a>
-<span class="sourceLineNo">8063</span>      throws IOException {<a name="line.8063"></a>
-<span class="sourceLineNo">8064</span>    byte[] columnFamily = store.getColumnFamilyDescriptor().getName();<a name="line.8064"></a>
-<span class="sourceLineNo">8065</span>    List&lt;Pair&lt;Cell, Cell&gt;&gt; cellPairs = new ArrayList&lt;&gt;(deltas.size());<a name="line.8065"></a>
-<span class="sourceLineNo">8066</span>    // Get previous values for all columns in this family.<a name="line.8066"></a>
-<span class="sourceLineNo">8067</span>    TimeRange tr = null;<a name="line.8067"></a>
-<span class="sourceLineNo">8068</span>    switch (op) {<a name="line.8068"></a>
-<span class="sourceLineNo">8069</span>      case INCREMENT:<a name="line.8069"></a>
-<span class="sourceLineNo">8070</span>        tr = ((Increment)mutation).getTimeRange();<a name="line.8070"></a>
-<span class="sourceLineNo">8071</span>        break;<a name="line.8071"></a>
-<span class="sourceLineNo">8072</span>      case APPEND:<a name="line.8072"></a>
-<span class="sourceLineNo">8073</span>        tr = ((Append)mutation).getTimeRange();<a name="line.8073"></a>
-<span class="sourceLineNo">8074</span>        break;<a name="line.8074"></a>
-<span class="sourceLineNo">8075</span>      default:<a name="line.8075"></a>
+<span class="sourceLineNo">8040</span>        }<a name="line.8040"></a>
+<span class="sourceLineNo">8041</span>        if (writeToWAL) {<a name="line.8041"></a>
+<span class="sourceLineNo">8042</span>          if (walEdit == null) {<a name="line.8042"></a>
+<span class="sourceLineNo">8043</span>            walEdit = new WALEdit();<a name="line.8043"></a>
+<span class="sourceLineNo">8044</span>          }<a name="line.8044"></a>
+<span class="sourceLineNo">8045</span>          walEdit.getCells().addAll(toApply);<a name="line.8045"></a>
+<span class="sourceLineNo">8046</span>        }<a name="line.8046"></a>
+<span class="sourceLineNo">8047</span>      }<a name="line.8047"></a>
+<span class="sourceLineNo">8048</span>    }<a name="line.8048"></a>
+<span class="sourceLineNo">8049</span>    return walEdit;<a name="line.8049"></a>
+<span class="sourceLineNo">8050</span>  }<a name="line.8050"></a>
+<span class="sourceLineNo">8051</span><a name="line.8051"></a>
+<span class="sourceLineNo">8052</span>  /**<a name="line.8052"></a>
+<span class="sourceLineNo">8053</span>   * Reckon the Cells to apply to WAL, memstore, and to return to the Client in passed<a name="line.8053"></a>
+<span class="sourceLineNo">8054</span>   * column family/Store.<a name="line.8054"></a>
+<span class="sourceLineNo">8055</span>   *<a name="line.8055"></a>
+<span class="sourceLineNo">8056</span>   * Does Get of current value and then adds passed in deltas for this Store returning the result.<a name="line.8056"></a>
+<span class="sourceLineNo">8057</span>   *<a name="line.8057"></a>
+<span class="sourceLineNo">8058</span>   * @param op Whether Increment or Append<a name="line.8058"></a>
+<span class="sourceLineNo">8059</span>   * @param mutation The encompassing Mutation object<a name="line.8059"></a>
+<span class="sourceLineNo">8060</span>   * @param deltas Changes to apply to this Store; either increment amount or data to append<a name="line.8060"></a>
+<span class="sourceLineNo">8061</span>   * @param results In here we accumulate all the Cells we are to return to the client. If null,<a name="line.8061"></a>
+<span class="sourceLineNo">8062</span>   *                client doesn't want results returned.<a name="line.8062"></a>
+<span class="sourceLineNo">8063</span>   * @return Resulting Cells after &lt;code&gt;deltas&lt;/code&gt; have been applied to current<a name="line.8063"></a>
+<span class="sourceLineNo">8064</span>   *  values. Side effect is our filling out of the &lt;code&gt;results&lt;/code&gt; List.<a name="line.8064"></a>
+<span class="sourceLineNo">8065</span>   */<a name="line.8065"></a>
+<span class="sourceLineNo">8066</span>  private List&lt;Cell&gt; reckonDeltasByStore(HStore store, Operation op, Mutation mutation,<a name="line.8066"></a>
+<span class="sourceLineNo">8067</span>      Durability effectiveDurability, long now, List&lt;Cell&gt; deltas, List&lt;Cell&gt; results)<a name="line.8067"></a>
+<span class="sourceLineNo">8068</span>      throws IOException {<a name="line.8068"></a>
+<span class="sourceLineNo">8069</span>    byte[] columnFamily = store.getColumnFamilyDescriptor().getName();<a name="line.8069"></a>
+<span class="sourceLineNo">8070</span>    List&lt;Pair&lt;Cell, Cell&gt;&gt; cellPairs = new ArrayList&lt;&gt;(deltas.size());<a name="line.8070"></a>
+<span class="sourceLineNo">8071</span>    // Get previous values for all columns in this family.<a name="line.8071"></a>
+<span class="sourceLineNo">8072</span>    TimeRange tr = null;<a name="line.8072"></a>
+<span class="sourceLineNo">8073</span>    switch (op) {<a name="line.8073"></a>
+<span class="sourceLineNo">8074</span>      case INCREMENT:<a name="line.8074"></a>
+<span class="sourceLineNo">8075</span>        tr = ((Increment)mutation).getTimeRange();<a name="line.8075"></a>
 <span class="sourceLineNo">8076</span>        break;<a name="line.8076"></a>
-<span class="sourceLineNo">8077</span>    }<a name="line.8077"></a>
-<span class="sourceLineNo">8078</span>    List&lt;Cell&gt; currentValues = get(mutation, store, deltas,null, tr);<a name="line.8078"></a>
-<span class="sourceLineNo">8079</span>    // Iterate the input columns and update existing values if they were found, otherwise<a name="line.8079"></a>
-<span class="sourceLineNo">8080</span>    // add new column initialized to the delta amount<a name="line.8080"></a>
-<span class="sourceLineNo">8081</span>    int currentValuesIndex = 0;<a name="line.8081"></a>
-<span class="sourceLineNo">8082</span>    for (int i = 0; i &lt; deltas.size(); i++) {<a name="line.8082"></a>
-<span class="sourceLineNo">8083</span>      Cell delta = deltas.get(i);<a name="line.8083"></a>
-<span class="sourceLineNo">8084</span>      Cell currentValue = null;<a name="line.8084"></a>
-<span class="sourceLineNo">8085</span>      if (currentValuesIndex &lt; currentValues.size() &amp;&amp;<a name="line.8085"></a>
-<span class="sourceLineNo">8086</span>          CellUtil.matchingQualifier(currentValues.get(currentValuesIndex), delta)) {<a name="line.8086"></a>
-<span class="sourceLineNo">8087</span>        currentValue = currentValues.get(currentValuesIndex);<a name="line.8087"></a>
-<span class="sourceLineNo">8088</span>        if (i &lt; (deltas.size() - 1) &amp;&amp; !CellUtil.matchingQualifier(delta, deltas.get(i + 1))) {<a name="line.8088"></a>
-<span class="sourceLineNo">8089</span>          currentValuesIndex++;<a name="line.8089"></a>
-<span class="sourceLineNo">8090</span>        }<a name="line.8090"></a>
-<span class="sourceLineNo">8091</span>      }<a name="line.8091"></a>
-<span class="sourceLineNo">8092</span><a name="line.8092"></a>
-<span class="sourceLineNo">8093</span>      // Switch on whether this an increment or an append building the new Cell to apply.<a name="line.8093"></a>
-<span class="sourceLineNo">8094</span>      Cell newCell = null;<a name="line.8094"></a>
-<span class="sourceLineNo">8095</span>      switch (op) {<a name="line.8095"></a>
-<span class="sourceLineNo">8096</span>        case INCREMENT:<a name="line.8096"></a>
-<span class="sourceLineNo">8097</span>          long deltaAmount = getLongValue(delta);<a name="line.8097"></a>
-<span class="sourceLineNo">8098</span>          final long newValue = currentValue == null ? deltaAmount : getLongValue(currentValue) + deltaAmount;<a name="line.8098"></a>
-<span class="sourceLineNo">8099</span>          newCell = reckonDelta(delta, currentValue, columnFamily, now, mutation, (oldCell) -&gt; Bytes.toBytes(newValue));<a name="line.8099"></a>
-<span class="sourceLineNo">8100</span>          break;<a name="line.8100"></a>
-<span class="sourceLineNo">8101</span>        case APPEND:<a name="line.8101"></a>
-<span class="sourceLineNo">8102</span>          newCell = reckonDelta(delta, currentValue, columnFamily, now, mutation, (oldCell) -&gt;<a name="line.8102"></a>
-<span class="sourceLineNo">8103</span>            ByteBuffer.wrap(new byte[delta.getValueLength() + oldCell.getValueLength()])<a name="line.8103"></a>
-<span class="sourceLineNo">8104</span>                    .put(oldCell.getValueArray(), oldCell.getValueOffset(), oldCell.getValueLength())<a name="line.8104"></a>
-<span class="sourceLineNo">8105</span>                    .put(delta.getValueArray(), delta.getValueOffset(), delta.getValueLength())<a name="line.8105"></a>
-<span class="sourceLineNo">8106</span>                    .array()<a name="line.8106"></a>
-<span class="sourceLineNo">8107</span>          );<a name="line.8107"></a>
-<span class="sourceLineNo">8108</span>          break;<a name="line.8108"></a>
-<span class="sourceLineNo">8109</span>        default: throw new UnsupportedOperationException(op.toString());<a name="line.8109"></a>
-<span class="sourceLineNo">8110</span>      }<a name="line.8110"></a>
-<span class="sourceLineNo">8111</span>      int newCellSize = PrivateCellUtil.estimatedSerializedSizeOf(newCell);<a name="line.8111"></a>
-<span class="sourceLineNo">8112</span>      if (newCellSize &gt; this.maxCellSize) {<a name="line.8112"></a>
-<span class="sourceLineNo">8113</span>        String msg = "Cell with size " + newCellSize + " exceeds limit of " +<a name="line.8113"></a>
-<span class="sourceLineNo">8114</span>            this.maxCellSize + " bytes";<a name="line.8114"></a>
-<span class="sourceLineNo">8115</span>        if (LOG.isDebugEnabled()) {<a name="line.8115"></a>
-<span class="sourceLineNo">8116</span>          LOG.debug(msg);<a name="line.8116"></a>
-<span class="sourceLineNo">8117</span>        }<a name="line.8117"></a>
-<span class="sourceLineNo">8118</span>        throw new DoNotRetryIOException(msg);<a name="line.8118"></a>
-<span class="sourceLineNo">8119</span>      }<a name="line.8119"></a>
-<span class="sourceLineNo">8120</span>      cellPairs.add(new Pair&lt;&gt;(currentValue, newCell));<a name="line.8120"></a>
-<span class="sourceLineNo">8121</span>      // Add to results to get returned to the Client. If null, cilent does not want results.<a name="line.8121"></a>
-<span class="sourceLineNo">8122</span>      if (results != null) {<a name="line.8122"></a>
-<span class="sourceLineNo">8123</span>        results.add(newCell);<a name="line.8123"></a>
+<span class="sourceLineNo">8077</span>      case APPEND:<a name="line.8077"></a>
+<span class="sourceLineNo">8078</span>        tr = ((Append)mutation).getTimeRange();<a name="line.8078"></a>
+<span class="sourceLineNo">8079</span>        break;<a name="line.8079"></a>
+<span class="sourceLineNo">8080</span>      default:<a name="line.8080"></a>
+<span class="sourceLineNo">8081</span>        break;<a name="line.8081"></a>
+<span class="sourceLineNo">8082</span>    }<a name="line.8082"></a>
+<span class="sourceLineNo">8083</span>    List&lt;Cell&gt; currentValues = get(mutation, store, deltas,null, tr);<a name="line.8083"></a>
+<span class="sourceLineNo">8084</span>    // Iterate the input columns and update existing values if they were found, otherwise<a name="line.8084"></a>
+<span class="sourceLineNo">8085</span>    // add new column initialized to the delta amount<a name="line.8085"></a>
+<span class="sourceLineNo">8086</span>    int currentValuesIndex = 0;<a name="line.8086"></a>
+<span class="sourceLineNo">8087</span>    for (int i = 0; i &lt; deltas.size(); i++) {<a name="line.8087"></a>
+<span class="sourceLineNo">8088</span>      Cell delta = deltas.get(i);<a name="line.8088"></a>
+<span class="sourceLineNo">8089</span>      Cell currentValue = null;<a name="line.8089"></a>
+<span class="sourceLineNo">8090</span>      if (currentValuesIndex &lt; currentValues.size() &amp;&amp;<a name="line.8090"></a>
+<span class="sourceLineNo">8091</span>          CellUtil.matchingQualifier(currentValues.get(currentValuesIndex), delta)) {<a name="line.8091"></a>
+<span class="sourceLineNo">8092</span>        currentValue = currentValues.get(currentValuesIndex);<a name="line.8092"></a>
+<span class="sourceLineNo">8093</span>        if (i &lt; (deltas.size() - 1) &amp;&amp; !CellUtil.matchingQualifier(delta, deltas.get(i + 1))) {<a name="line.8093"></a>
+<span class="sourceLineNo">8094</span>          currentValuesIndex++;<a name="line.8094"></a>
+<span class="sourceLineNo">8095</span>        }<a name="line.8095"></a>
+<span class="sourceLineNo">8096</span>      }<a name="line.8096"></a>
+<span class="sourceLineNo">8097</span><a name="line.8097"></a>
+<span class="sourceLineNo">8098</span>      // Switch on whether this an increment or an append building the new Cell to apply.<a name="line.8098"></a>
+<span class="sourceLineNo">8099</span>      Cell newCell = null;<a name="line.8099"></a>
+<span class="sourceLineNo">8100</span>      switch (op) {<a name="line.8100"></a>
+<span class="sourceLineNo">8101</span>        case INCREMENT:<a name="line.8101"></a>
+<span class="sourceLineNo">8102</span>          long deltaAmount = getLongValue(delta);<a name="line.8102"></a>
+<span class="sourceLineNo">8103</span>          final long newValue = currentValue == null ? deltaAmount : getLongValue(currentValue) + deltaAmount;<a name="line.8103"></a>
+<span class="sourceLineNo">8104</span>          newCell = reckonDelta(delta, currentValue, columnFamily, now, mutation, (oldCell) -&gt; Bytes.toBytes(newValue));<a name="line.8104"></a>
+<span class="sourceLineNo">8105</span>          break;<a name="line.8105"></a>
+<span class="sourceLineNo">8106</span>        case APPEND:<a name="line.8106"></a>
+<span class="sourceLineNo">8107</span>          newCell = reckonDelta(delta, currentValue, columnFamily, now, mutation, (oldCell) -&gt;<a name="line.8107"></a>
+<span class="sourceLineNo">8108</span>            ByteBuffer.wrap(new byte[delta.getValueLength() + oldCell.getValueLength()])<a name="line.8108"></a>
+<span class="sourceLineNo">8109</span>                    .put(oldCell.getValueArray(), oldCell.getValueOffset(), oldCell.getValueLength())<a name="line.8109"></a>
+<span class="sourceLineNo">8110</span>                    .put(delta.getValueArray(), delta.getValueOffset(), delta.getValueLength())<a name="line.8110"></a>
+<span class="sourceLineNo">8111</span>                    .array()<a name="line.8111"></a>
+<span class="sourceLineNo">8112</span>          );<a name="line.8112"></a>
+<span class="sourceLineNo">8113</span>          break;<a name="line.8113"></a>
+<span class="sourceLineNo">8114</span>        default: throw new UnsupportedOperationException(op.toString());<a name="line.8114"></a>
+<span class="sourceLineNo">8115</span>      }<a name="line.8115"></a>
+<span class="sourceLineNo">8116</span>      int newCellSize = PrivateCellUtil.estimatedSerializedSizeOf(newCell);<a name="line.8116"></a>
+<span class="sourceLineNo">8117</span>      if (newCellSize &gt; this.maxCellSize) {<a name="line.8117"></a>
+<span class="sourceLineNo">8118</span>        String msg = "Cell with size " + newCellSize + " exceeds limit of " +<a name="line.8118"></a>
+<span class="sourceLineNo">8119</span>            this.maxCellSize + " bytes";<a name="line.8119"></a>
+<span class="sourceLineNo">8120</span>        if (LOG.isDebugEnabled()) {<a name="line.8120"></a>
+<span class="sourceLineNo">8121</span>          LOG.debug(msg);<a name="line.8121"></a>
+<span class="sourceLineNo">8122</span>        }<a name="line.8122"></a>
+<span class="sourceLineNo">8123</span>        throw new DoNotRetryIOException(msg);<a name="line.8123"></a>
 <span class="sourceLineNo">8124</span>      }<a name="line.8124"></a>
-<span class="sourceLineNo">8125</span>    }<a name="line.8125"></a>
-<span class="sourceLineNo">8126</span><a name="line.8126"></a>
-<span class="sourceLineNo">8127</span>    // Give coprocessors a chance to update the new cells before apply to WAL or memstore<a name="line.8127"></a>
-<span class="sourceLineNo">8128</span>    if (coprocessorHost != null) {<a name="line.8128"></a>
-<span class="sourceLineNo">8129</span>      // Here the operation must be increment or append.<a name="line.8129"></a>
-<span class="sourceLineNo">8130</span>      cellPairs = op == Operation.INCREMENT ?<a name="line.8130"></a>
-<span class="sourceLineNo">8131</span>          coprocessorHost.postIncrementBeforeWAL(mutation, cellPairs) :<a name="line.8131"></a>
-<span class="sourceLineNo">8132</span>          coprocessorHost.postAppendBeforeWAL(mutation, cellPairs);<a name="line.8132"></a>
-<span class="sourceLineNo">8133</span>    }<a name="line.8133"></a>
-<span class="sourceLineNo">8134</span>    return cellPairs.stream().map(Pair::getSecond).collect(Collectors.toList());<a name="line.8134"></a>
-<span class="sourceLineNo">8135</span>  }<a name="line.8135"></a>
-<span class="sourceLineNo">8136</span><a name="line.8136"></a>
-<span class="sourceLineNo">8137</span>  private static Cell reckonDelta(final Cell delta, final Cell currentCell,<a name="line.8137"></a>
-<span class="sourceLineNo">8138</span>                                  final byte[] columnFamily, final long now,<a name="line.8138"></a>
-<span class="sourceLineNo">8139</span>                                  Mutation mutation, Function&lt;Cell, byte[]&gt; supplier) throws IOException {<a name="line.8139"></a>
-<span class="sourceLineNo">8140</span>    // Forward any tags found on the delta.<a name="line.8140"></a>
-<span class="sourceLineNo">8141</span>    List&lt;Tag&gt; tags = TagUtil.carryForwardTags(delta);<a name="line.8141"></a>
-<span class="sourceLineNo">8142</span>    tags = TagUtil.carryForwardTTLTag(tags, mutation.getTTL());<a name="line.8142"></a>
-<span class="sourceLineNo">8143</span>    if (currentCell != null) {<a name="line.8143"></a>
-<span class="sourceLineNo">8144</span>      tags = TagUtil.carryForwardTags(tags, currentCell);<a name="line.8144"></a>
-<span class="sourceLineNo">8145</span>      byte[] newValue = supplier.apply(currentCell);<a name="line.8145"></a>
-<span class="sourceLineNo">8146</span>      return ExtendedCellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.8146"></a>
-<span class="sourceLineNo">8147</span>              .setRow(mutation.getRow(), 0, mutation.getRow().length)<a name="line.8147"></a>
-<span class="sourceLineNo">8148</span>              .setFamily(columnFamily, 0, columnFamily.length)<a name="line.8148"></a>
-<span class="sourceLineNo">8149</span>              // copy the qualifier if the cell is located in shared memory.<a name="line.8149"></a>
-<span class="sourceLineNo">8150</span>              .setQualifier(CellUtil.cloneQualifier(delta))<a name="line.8150"></a>
-<span class="sourceLineNo">8151</span>              .setTimestamp(Math.max(currentCell.getTimestamp() + 1, now))<a name="line.8151"></a>
-<span class="sourceLineNo">8152</span>              .setType(KeyValue.Type.Put.getCode())<a name="line.8152"></a>
-<span class="sourceLineNo">8153</span>              .setValue(newValue, 0, newValue.length)<a name="line.8153"></a>
-<span class="sourceLineNo">8154</span>              .setTags(TagUtil.fromList(tags))<a name="line.8154"></a>
-<span class="sourceLineNo">8155</span>              .build();<a name="line.8155"></a>
-<span class="sourceLineNo">8156</span>    } else {<a name="line.8156"></a>
-<span class="sourceLineNo">8157</span>      PrivateCellUtil.updateLatestStamp(delta, now);<a name="line.8157"></a>
-<span class="sourceLineNo">8158</span>      return CollectionUtils.isEmpty(tags) ? delta : PrivateCellUtil.createCell(delta, tags);<a name="line.8158"></a>
-<span class="sourceLineNo">8159</span>    }<a name="line.8159"></a>
-<span class="sourceLineNo">8160</span>  }<a name="line.8160"></a>
-<span class="sourceLineNo">8161</span><a name="line.8161"></a>
-<span class="sourceLineNo">8162</span>  /**<a name="line.8162"></a>
-<span class="sourceLineNo">8163</span>   * @return Get the long out of the passed in Cell<a name="line.8163"></a>
-<span class="sourceLineNo">8164</span>   */<a name="line.8164"></a>
-<span class="sourceLineNo">8165</span>  private static long getLongValue(final Cell cell) throws DoNotRetryIOException {<a name="line.8165"></a>
-<span class="sourceLineNo">8166</span>    int len = cell.getValueLength();<a name="line.8166"></a>
-<span class="sourceLineNo">8167</span>    if (len != Bytes.SIZEOF_LONG) {<a name="line.8167"></a>
-<span class="sourceLineNo">8168</span>      // throw DoNotRetryIOException instead of IllegalArgumentException<a name="line.8168"></a>
-<span class="sourceLineNo">8169</span>      throw new DoNotRetryIOException("Field is not a long, it's " + len + " bytes wide");<a name="line.8169"></a>
-<span class="sourceLineNo">8170</span>    }<a name="line.8170"></a>
-<span class="sourceLineNo">8171</span>    return PrivateCellUtil.getValueAsLong(cell);<a name="line.8171"></a>
-<span class="sourceLineNo">8172</span>  }<a name="line.8172"></a>
-<span class="sourceLineNo">8173</span><a name="line.8173"></a>
-<span class="sourceLineNo">8174</span>  /**<a name="line.8174"></a>
-<span class="sourceLineNo">8175</span>   * Do a specific Get on passed &lt;code&gt;columnFamily&lt;/code&gt; and column qualifiers.<a name="line.8175"></a>
-<span class="sourceLineNo">8176</span>   * @param mutation Mutation we are doing this Get for.<a name="line.8176"></a>
-<span class="sourceLineNo">8177</span>   * @param store Which column family on row (TODO: Go all Gets in one go)<a name="line.8177"></a>
-<span class="sourceLineNo">8178</span>   * @param coordinates Cells from &lt;code&gt;mutation&lt;/code&gt; used as coordinates applied to Get.<a name="line.8178"></a>
-<span class="sourceLineNo">8179</span>   * @return Return list of Cells found.<a name="line.8179"></a>
-<span class="sourceLineNo">8180</span>   */<a name="line.8180"></a>
-<span class="sourceLineNo">8181</span>  private List&lt;Cell&gt; get(Mutation mutation, HStore store, List&lt;Cell&gt; coordinates,<a name="line.8181"></a>
-<span class="sourceLineNo">8182</span>      IsolationLevel isolation, TimeRange tr) throws IOException {<a name="line.8182"></a>
-<span class="sourceLineNo">8183</span>    // Sort the cells so that they match the order that they appear in the Get results. Otherwise,<a name="line.8183"></a>
-<span class="sourceLineNo">8184</span>    // we won't be able to find the existing values if the cells are not specified in order by the<a name="line.8184"></a>
-<span class="sourceLineNo">8185</span>    // client since cells are in an array list.<a name="line.8185"></a>
-<span class="sourceLineNo">8186</span>    // TODO: I don't get why we are sorting. St.Ack 20150107<a name="line.8186"></a>
-<span class="sourceLineNo">8187</span>    sort(coordinates, store.getComparator());<a name="line.8187"></a>
-<span class="sourceLineNo">8188</span>    Get get = new Get(mutation.getRow());<a name="line.8188"></a>
-<span class="sourceLineNo">8189</span>    if (isolation != null) {<a name="line.8189"></a>
-<span class="sourceLineNo">8190</span>      get.setIsolationLevel(isolation);<a name="line.8190"></a>
-<span class="sourceLineNo">8191</span>    }<a name="line.8191"></a>
-<span class="sourceLineNo">8192</span>    for (Cell cell: coordinates) {<a name="line.8192"></a>
-<span class="sourceLineNo">8193</span>      get.addColumn(store.getColumnFamilyDescriptor().getName(), CellUtil.cloneQualifier(cell));<a name="line.8193"></a>
-<span class="sourceLineNo">8194</span>    }<a name="line.8194"></a>
-<span class="sourceLineNo">8195</span>    // Increments carry time range. If an Increment instance, put it on the Get.<a name="line.8195"></a>
-<span class="sourceLineNo">8196</span>    if (tr != null) {<a name="line.8196"></a>
-<span class="sourceLineNo">8197</span>      get.setTimeRange(tr.getMin(), tr.getMax());<a name="line.8197"></a>
-<span class="sourceLineNo">8198</span>    }<a name="line.8198"></a>
-<span class="sourceLineNo">8199</span>    return get(get, false);<a name="line.8199"></a>
-<span class="sourceLineNo">8200</span>  }<a name="line.8200"></a>
-<span class="sourceLineNo">8201</span><a name="line.8201"></a>
-<span class="sourceLineNo">8202</span>  /**<a name="line.8202"></a>
-<span class="sourceLineNo">8203</span>   * @return Sorted list of &lt;code&gt;cells&lt;/code&gt; using &lt;code&gt;comparator&lt;/code&gt;<a name="line.8203"></a>
-<span class="sourceLineNo">8204</span>   */<a name="line.8204"></a>
-<span class="sourceLineNo">8205</span>  private static List&lt;Cell&gt; sort(List&lt;Cell&gt; cells, final CellComparator comparator) {<a name="line.8205"></a>
-<span class="sourceLineNo">8206</span>    cells.sort(comparator);<a name="line.8206"></a>
-<span class="sourceLineNo">8207</span>    return cells;<a name="line.8207"></a>
-<span class="sourceLineNo">8208</span>  }<a name="line.8208"></a>
-<span class="sourceLineNo">8209</span><a name="line.8209"></a>
-<span class="sourceLineNo">8210</span>  public static final long FIXED_OVERHEAD = ClassSize.align(<a name="line.8210"></a>
-<span class="sourceLineNo">8211</span>      ClassSize.OBJECT +<a name="line.8211"></a>
-<span class="sourceLineNo">8212</span>      ClassSize.ARRAY +<a name="line.8212"></a>
-<span class="sourceLineNo">8213</span>      55 * ClassSize.REFERENCE + 3 * Bytes.SIZEOF_INT +<a name="line.8213"></a>
-<span class="sourceLineNo">8214</span>      (15 * Bytes.SIZEOF_LONG) +<a name="line.8214"></a>
-<span class="sourceLineNo">8215</span>      3 * Bytes.SIZEOF_BOOLEAN);<a name="line.8215"></a>
-<span class="sourceLineNo">8216</span><a name="line.8216"></a>
-<span class="sourceLineNo">8217</span>  // woefully out of date - currently missing:<a name="line.8217"></a>
-<span class="sourceLineNo">8218</span>  // 1 x HashMap - coprocessorServiceHandlers<a name="line.8218"></a>
-<span class="sourceLineNo">8219</span>  // 6 x LongAdder - numMutationsWithoutWAL, dataInMemoryWithoutWAL,<a name="line.8219"></a>
-<span class="sourceLineNo">8220</span>  //   checkAndMutateChecksPassed, checkAndMutateChecksFailed, readRequestsCount,<a name="line.8220"></a>
-<span class="sourceLineNo">8221</span>  //   writeRequestsCount, cpRequestsCount<a name="line.8221"></a>
-<span class="sourceLineNo">8222</span>  // 1 x HRegion$WriteState - writestate<a name="line.8222"></a>
-<span class="sourceLineNo">8223</span>  // 1 x RegionCoprocessorHost - coprocessorHost<a name="line.8223"></a>
-<span class="sourceLineNo">8224</span>  // 1 x RegionSplitPolicy - splitPolicy<a name="line.8224"></a>
-<span class="sourceLineNo">8225</span>  // 1 x MetricsRegion - metricsRegion<a name="line.8225"></a>
-<span class="sourceLineNo">8226</span>  // 1 x MetricsRegionWrapperImpl - metricsRegionWrapper<a name="line.8226"></a>
-<span class="sourceLineNo">8227</span>  public static final long DEEP_OVERHEAD = FIXED_OVERHEAD +<a name="line.8227"></a>
-<span class="sourceLineNo">8228</span>      ClassSize.OBJECT + // closeLock<a name="line.8228"></a>
-<span class="sourceLineNo">8229</span>      (2 * ClassSize.ATOMIC_BOOLEAN) + // closed, closing<a name="line.8229"></a>
-<span class="sourceLineNo">8230</span>      (3 * ClassSize.ATOMIC_LONG) + // numPutsWithoutWAL, dataInMemoryWithoutWAL,<a name="line.8230"></a>
-<span class="sourceLineNo">8231</span>                                    // compactionsFailed<a name="line.8231"></a>
-<span class="sourceLineNo">8232</span>      (2 * ClassSize.CONCURRENT_HASHMAP) +  // lockedRows, scannerReadPoints<a name="line.8232"></a>
-<span class="sourceLineNo">8233</span>      WriteState.HEAP_SIZE + // writestate<a name="line.8233"></a>
-<span class="sourceLineNo">8234</span>      ClassSize.CONCURRENT_SKIPLISTMAP + ClassSize.CONCURRENT_SKIPLISTMAP_ENTRY + // stores<a name="line.8234"></a>
-<span class="sourceLineNo">8235</span>      (2 * ClassSize.REENTRANT_LOCK) + // lock, updatesLock<a name="line.8235"></a>
-<span class="sourceLineNo">8236</span>      MultiVersionConcurrencyControl.FIXED_SIZE // mvcc<a name="line.8236"></a>
-<span class="sourceLineNo">8237</span>      + 2 * ClassSize.TREEMAP // maxSeqIdInStores, replicationScopes<a name="line.8237"></a>
-<span class="sourceLineNo">8238</span>      + 2 * ClassSize.ATOMIC_INTEGER // majorInProgress, minorInProgress<a name="line.8238"></a>
-<span class="sourceLineNo">8239</span>      + ClassSize.STORE_SERVICES // store services<a name="line.8239"></a>
-<span class="sourceLineNo">8240</span>      + StoreHotnessProtector.FIXED_SIZE<a name="line.8240"></a>
-<span class="sourceLineNo">8241</span>      ;<a name="line.8241"></a>
-<span class="sourceLineNo">8242</span><a name="line.8242"></a>
-<span class="sourceLineNo">8243</span>  @Override<a name="line.8243"></a>
-<span class="sourceLineNo">8244</span>  public long heapSize() {<a name="line.8244"></a>
-<span class="sourceLineNo">8245</span>    // this does not take into account row locks, recent flushes, mvcc entries, and more<a name="line.8245"></a>
-<span class="sourceLineNo">8246</span>    return DEEP_OVERHEAD + stores.values().stream().mapToLong(HStore::heapSize).sum();<a name="line.8246"></a>
-<span class="sourceLineNo">8247</span>  }<a name="line.8247"></a>
-<span class="sourceLineNo">8248</span><a name="line.8248"></a>
-<span class="sourceLineNo">8249</span>  /**<a name="line.8249"></a>
-<span class="sourceLineNo">8250</span>   * Registers a new protocol buffer {@link Service} subclass as a coprocessor endpoint to<a name="line.8250"></a>
-<span class="sourceLineNo">8251</span>   * be available for handling Region#execService(com.google.protobuf.RpcController,<a name="line.8251"></a>
-<span class="sourceLineNo">8252</span>   *    org.apache.hadoop.hbase.protobuf.generated.ClientProtos.CoprocessorServiceCall) calls.<a name="line.8252"></a>
-<span class="sourceLineNo">8253</span>   *<a name="line.8253"></a>
-<span class="sourceLineNo">8254</span>   * &lt;p&gt;<a name="line.8254"></a>
-<span class="sourceLineNo">8255</span>   * Only a single instance may be registered per region for a given {@link Service} subclass (the<a name="line.8255"></a>
-<span class="sourceLineNo">8256</span>   * instances are keyed on {@link com.google.protobuf.Descriptors.ServiceDescriptor#getFullName()}.<a name="line.8256"></a>
-<span class="sourceLineNo">8257</span>   * After the first registration, subsequent calls with the same service name will fail with<a name="line.8257"></a>
-<span class="sourceLineNo">8258</span>   * a return value of {@code false}.<a name="line.8258"></a>
-<span class="sourceLineNo">8259</span>   * &lt;/p&gt;<a name="line.8259"></a>
-<span class="sourceLineNo">8260</span>   * @param instance the {@code Service} subclass instance to expose as a coprocessor endpoint<a name="line.8260"></a>
-<span class="sourceLineNo">8261</span>   * @return {@code true} if the registration was successful, {@code false}<a name="line.8261"></a>
-<span class="sourceLineNo">8262</span>   * otherwise<a name="line.8262"></a>
-<span class="sourceLineNo">8263</span>   */<a name="line.8263"></a>
-<span class="sourceLineNo">8264</span>  public boolean registerService(com.google.protobuf.Service instance) {<a name="line.8264"></a>
-<span class="sourceLineNo">8265</span>    /*<a name="line.8265"></a>
-<span class="sourceLineNo">8266</span>     * No stacking of instances is allowed for a single service name<a name="line.8266"></a>
-<span class="sourceLineNo">8267</span>     */<a name="line.8267"></a>
-<span class="sourceLineNo">8268</span>    com.google.protobuf.Descriptors.ServiceDescriptor serviceDesc = instance.getDescriptorForType();<a name="line.8268"></a>
-<span class="sourceLineNo">8269</span>    String serviceName = CoprocessorRpcUtils.getServiceName(serviceDesc);<a name="line.8269"></a>
-<span class="sourceLineNo">8270</span>    if (coprocessorServiceHandlers.containsKey(serviceName)) {<a name="line.8270"></a>
-<span class="sourceLineNo">8271</span>      LOG.error("Coprocessor service " + serviceName +<a name="line.8271"></a>
-<span class="sourceLineNo">8272</span>          " already registered, rejecting request from " + instance);<a name="line.8272"></a>
-<span class="sourceLineNo">8273</span>      return false;<a name="line.8273"></a>
-<span class="sourceLineNo">8274</span>    }<a name="line.8274"></a>
-<span class="sourceLineNo">8275</span><a name="line.8275"></a>
-<span class="sourceLineNo">8276</span>    coprocessorServiceHandlers.put(serviceName, instance);<a name="line.8276"></a>
-<span class="sourceLineNo">8277</span>    if (LOG.isDebugEnabled()) {<a name="line.8277"></a>
-<span class="sourceLineNo">8278</span>      LOG.debug("Registered coprocessor service: region=" +<a name="line.8278"></a>
-<span class="sourceLineNo">8279</span>          Bytes.toStringBinary(getRegionInfo().getRegionName()) +<a name="line.8279"></a>
-<span class="sourceLineNo">8280</span>          " service=" + serviceName);<a name="line.8280"></a>
-<span class="sourceLineNo">8281</span>    }<a name="line.8281"></a>
-<span class="sourceLineNo">8282</span>    return true;<a name="line.8282"></a>
-<span class="sourceLineNo">8283</span>  }<a name="line.8283"></a>
-<span class="sourceLineNo">8284</span><a name="line.8284"></a>
-<span class="sourceLineNo">8285</span>  /**<a name="line.8285"></a>
-<span class="sourceLineNo">8286</span>   * Executes a single protocol buffer coprocessor endpoint {@link Service} method using<a name="line.8286"></a>
-<span class="sourceLineNo">8287</span>   * the registered protocol handlers.  {@link Service} implementations must be registered via the<a name="line.8287"></a>
-<span class="sourceLineNo">8288</span>   * {@link #registerService(com.google.protobuf.Service)}<a name="line.8288"></a>
-<span class="sourceLineNo">8289</span>   * method before they are available.<a name="line.8289"></a>
-<span class="sourceLineNo">8290</span>   *<a name="line.8290"></a>
-<span class="sourceLineNo">8291</span>   * @param controller an {@code RpcContoller} implementation to pass to the invoked service<a name="line.8291"></a>
-<span class="sourceLineNo">8292</span>   * @param call a {@code CoprocessorServiceCall} instance identifying the service, method,<a name="line.8292"></a>
-<span class="sourceLineNo">8293</span>   *     and parameters for the method invocation<a name="line.8293"></a>
-<span class="sourceLineNo">8294</span>   * @return a protocol buffer {@code Message} instance containing the method's result<a name="line.8294"></a>
-<span class="sourceLineNo">8295</span>   * @throws IOException if no registered service handler is found or an error<a name="line.8295"></a>
-<span class="sourceLineNo">8296</span>   *     occurs during the invocation<a name="line.8296"></a>
-<span class="sourceLineNo">8297</span>   * @see #registerService(com.google.protobuf.Service)<a name="line.8297"></a>
-<span class="sourceLineNo">8298</span>   */<a name="line.8298"></a>
-<span class="sourceLineNo">8299</span>  public com.google.protobuf.Message execService(com.google.protobuf.RpcController controller,<a name="line.8299"></a>
-<span class="sourceLineNo">8300</span>      CoprocessorServiceCall call) throws IOException {<a name="line.8300"></a>
-<span class="sourceLineNo">8301</span>    String serviceName = call.getServiceName();<a name="line.8301"></a>
-<span class="sourceLineNo">8302</span>    com.google.protobuf.Service service = coprocessorServiceHandlers.get(serviceName);<a name="line.8302"></a>
-<span class="sourceLineNo">8303</span>    if (service == null) {<a name="line.8303"></a>
-<span class="sourceLineNo">8304</span>      throw new UnknownProtocolException(null, "No registered coprocessor service found for " +<a name="line.8304"></a>
-<span class="sourceLineNo">8305</span>          serviceName + " in region " + Bytes.toStringBinary(getRegionInfo().getRegionName()));<a name="line.8305"></a>
-<span class="sourceLineNo">8306</span>    }<a name="line.8306"></a>
-<span class="sourceLineNo">8307</span>    com.google.protobuf.Descriptors.ServiceDescriptor serviceDesc = service.getDescriptorForType();<a name="line.8307"></a>
-<span class="sourceLineNo">8308</span><a name="line.8308"></a>
-<span class="sourceLineNo">8309</span>    cpRequestsCount.increment();<a name="line.8309"></a>
-<span class="sourceLineNo">8310</span>    String methodName = call.getMethodName();<a name="line.8310"></a>
-<span class="sourceLineNo">8311</span>    com.google.protobuf.Descriptors.MethodDescriptor methodDesc =<a name="line.8311"></a>
-<span class="sourceLineNo">8312</span>        CoprocessorRpcUtils.getMethodDescriptor(methodName, serviceDesc);<a name="line.8312"></a>
+<span class="sourceLineNo">8125</span>      cellPairs.add(new Pair&lt;&gt;(currentValue, newCell));<a name="line.8125"></a>
+<span class="sourceLineNo">8126</span>      // Add to results to get returned to the Client. If null, cilent does not want results.<a name="line.8126"></a>
+<span class="sourceLineNo">8127</span>      if (results != null) {<a name="line.8127"></a>
+<span class="sourceLineNo">8128</span>        results.add(newCell);<a name="line.8128"></a>
+<span class="sourceLineNo">8129</span>      }<a name="line.8129"></a>
+<span class="sourceLineNo">8130</span>    }<a name="line.8130"></a>
+<span class="sourceLineNo">8131</span><a name="line.8131"></a>
+<span class="sourceLineNo">8132</span>    // Give coprocessors a chance to update the new cells before apply to WAL or memstore<a name="line.8132"></a>
+<span class="sourceLineNo">8133</span>    if (coprocessorHost != null) {<a name="line.8133"></a>
+<span class="sourceLineNo">8134</span>      // Here the operation must be increment or append.<a name="line.8134"></a>
+<span class="sourceLineNo">8135</span>      cellPairs = op == Operation.INCREMENT ?<a name="line.8135"></a>
+<span class="sourceLineNo">8136</span>          coprocessorHost.postIncrementBeforeWAL(mutation, cellPairs) :<a name="line.8136"></a>
+<span class="sourceLineNo">8137</span>          coprocessorHost.postAppendBeforeWAL(mutation, cellPairs);<a name="line.8137"></a>
+<span class="sourceLineNo">8138</span>    }<a name="line.8138"></a>
+<span class="sourceLineNo">8139</span>    return cellPairs.stream().map(Pair::getSecond).collect(Collectors.toList());<a name="line.8139"></a>
+<span class="sourceLineNo">8140</span>  }<a name="line.8140"></a>
+<span class="sourceLineNo">8141</span><a name="line.8141"></a>
+<span class="sourceLineNo">8142</span>  private static Cell reckonDelta(final Cell delta, final Cell currentCell,<a name="line.8142"></a>
+<span class="sourceLineNo">8143</span>                                  final byte[] columnFamily, final long now,<a name="line.8143"></a>
+<span class="sourceLineNo">8144</span>                                  Mutation mutation, Function&lt;Cell, byte[]&gt; supplier) throws IOException {<a name="line.8144"></a>
+<span class="sourceLineNo">8145</span>    // Forward any tags found on the delta.<a name="line.8145"></a>
+<span class="sourceLineNo">8146</span>    List&lt;Tag&gt; tags = TagUtil.carryForwardTags(delta);<a name="line.8146"></a>
+<span class="sourceLineNo">8147</span>    tags = TagUtil.carryForwardTTLTag(tags, mutation.getTTL());<a name="line.8147"></a>
+<span class="sourceLineNo">8148</span>    if (currentCell != null) {<a name="line.8148"></a>
+<span class="sourceLineNo">8149</span>      tags = TagUtil.carryForwardTags(tags, currentCell);<a name="line.8149"></a>
+<span class="sourceLineNo">8150</span>      byte[] newValue = supplier.apply(currentCell);<a name="line.8150"></a>
+<span class="sourceLineNo">8151</span>      return ExtendedCellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.8151"></a>
+<span class="sourceLineNo">8152</span>              .setRow(mutation.getRow(), 0, mutation.getRow().length)<a name="line.8152"></a>
+<span class="sourceLineNo">8153</span>              .setFamily(columnFamily, 0, columnFamily.length)<a name="line.8153"></a>
+<span class="sourceLineNo">8154</span>              // copy the qualifier if the cell is located in shared memory.<a name="line.8154"></a>
+<span class="sourceLineNo">8155</span>              .setQualifier(CellUtil.cloneQualifier(delta))<a name="line.8155"></a>
+<span class="sourceLineNo">8156</span>              .setTimestamp(Math.max(currentCell.getTimestamp() + 1, now))<a name="line.8156"></a>
+<span class="sourceLineNo">8157</span>              .setType(KeyValue.Type.Put.getCode())<a name="line.8157"></a>
+<span class="sourceLineNo">8158</span>              .setValue(newValue, 0, newValue.length)<a name="line.8158"></a>
+<span class="sourceLineNo">8159</span>              .setTags(TagUtil.fromList(tags))<a name="line.8159"></a>
+<span class="sourceLineNo">8160</span>              .build();<a name="line.8160"></a>
+<span class="sourceLineNo">8161</span>    } else {<a name="line.8161"></a>
+<span class="sourceLineNo">8162</span>      PrivateCellUtil.updateLatestStamp(delta, now);<a name="line.8162"></a>
+<span class="sourceLineNo">8163</span>      return CollectionUtils.isEmpty(tags) ? delta : PrivateCellUtil.createCell(delta, tags);<a name="line.8163"></a>
+<span class="sourceLineNo">8164</span>    }<a name="line.8164"></a>
+<span class="sourceLineNo">8165</span>  }<a name="line.8165"></a>
+<span class="sourceLineNo">8166</span><a name="line.8166"></a>
+<span class="sourceLineNo">8167</span>  /**<a name="line.8167"></a>
+<span class="sourceLineNo">8168</span>   * @return Get the long out of the passed in Cell<a name="line.8168"></a>
+<span class="sourceLineNo">8169</span>   */<a name="line.8169"></a>
+<span class="sourceLineNo">8170</span>  private static long getLongValue(final Cell cell) throws DoNotRetryIOException {<a name="line.8170"></a>
+<span class="sourceLineNo">8171</span>    int len = cell.getValueLength();<a name="line.8171"></a>
+<span class="sourceLineNo">8172</span>    if (len != Bytes.SIZEOF_LONG) {<a name="line.8172"></a>
+<span class="sourceLineNo">8173</span>      // throw DoNotRetryIOException instead of IllegalArgumentException<a name="line.8173"></a>
+<span class="sourceLineNo">8174</span>      throw new DoNotRetryIOException("Field is not a long, it's " + len + " bytes wide");<a name="line.8174"></a>
+<span class="sourceLineNo">8175</span>    }<a name="line.8175"></a>
+<span class="sourceLineNo">8176</span>    return PrivateCellUtil.getValueAsLong(cell);<a name="line.8176"></a>
+<span class="sourceLineNo">8177</span>  }<a name="line.8177"></a>
+<span class="sourceLineNo">8178</span><a name="line.8178"></a>
+<span class="sourceLineNo">8179</span>  /**<a name="line.8179"></a>
+<span class="sourceLineNo">8180</span>   * Do a specific Get on passed &lt;code&gt;columnFamily&lt;/code&gt; and column qualifiers.<a name="line.8180"></a>
+<span class="sourceLineNo">8181</span>   * @param mutation Mutation we are doing this Get for.<a name="line.8181"></a>
+<span class="sourceLineNo">8182</span>   * @param store Which column family on row (TODO: Go all Gets in one go)<a name="line.8182"></a>
+<span class="sourceLineNo">8183</span>   * @param coordinates Cells from &lt;code&gt;mutation&lt;/code&gt; used as coordinates applied to Get.<a name="line.8183"></a>
+<span class="sourceLineNo">8184</span>   * @return Return list of Cells found.<a name="line.8184"></a>
+<span class="sourceLineNo">8185</span>   */<a name="line.8185"></a>
+<span class="sourceLineNo">8186</span>  private List&lt;Cell&gt; get(Mutation mutation, HStore store, List&lt;Cell&gt; coordinates,<a name="line.8186"></a>
+<span class="sourceLineNo">8187</span>      IsolationLevel isolation, TimeRange tr) throws IOException {<a name="line.8187"></a>
+<span class="sourceLineNo">8188</span>    // Sort the cells so that they match the order that they appear in the Get results. Otherwise,<a name="line.8188"></a>
+<span class="sourceLineNo">8189</span>    // we won't be able to find the existing values if the cells are not specified in order by the<a name="line.8189"></a>
+<span class="sourceLineNo">8190</span>    // client since cells are in an array list.<a name="line.8190"></a>
+<span class="sourceLineNo">8191</span>    // TODO: I don't get why we are sorting. St.Ack 20150107<a name="line.8191"></a>
+<span class="sourceLineNo">8192</span>    sort(coordinates, store.getComparator());<a name="line.8192"></a>
+<span class="sourceLineNo">8193</span>    Get get = new Get(mutation.getRow());<a name="line.8193"></a>
+<span class="sourceLineNo">8194</span>    if (isolation != null) {<a name="line.8194"></a>
+<span class="sourceLineNo">8195</span>      get.setIsolationLevel(isolation);<a name="line.8195"></a>
+<span class="sourceLineNo">8196</span>    }<a name="line.8196"></a>
+<span class="sourceLineNo">8197</span>    for (Cell cell: coordinates) {<a name="line.8197"></a>
+<span class="sourceLineNo">8198</span>      get.addColumn(store.getColumnFamilyDescriptor().getName(), CellUtil.cloneQualifier(cell));<a name="line.8198"></a>
+<span class="sourceLineNo">8199</span>    }<a name="line.8199"></a>
+<span class="sourceLineNo">8200</span>    // Increments carry time range. If an Increment instance, put it on the Get.<a name="line.8200"></a>
+<span class="sourceLineNo">8201</span>    if (tr != null) {<a name="line.8201"></a>
+<span class="sourceLineNo">8202</span>      get.setTimeRange(tr.getMin(), tr.getMax());<a name="line.8202"></a>
+<span class="sourceLineNo">8203</span>    }<a name="line.8203"></a>
+<span class="sourceLineNo">8204</span>    return get(get, false);<a name="line.8204"></a>
+<span class="sourceLineNo">8205</span>  }<a name="line.8205"></a>
+<span class="sourceLineNo">8206</span><a name="line.8206"></a>
+<span class="sourceLineNo">8207</span>  /**<a name="line.8207"></a>
+<span class="sourceLineNo">8208</span>   * @return Sorted list of &lt;code&gt;cells&lt;/code&gt; using &lt;code&gt;comparator&lt;/code&gt;<a name="line.8208"></a>
+<span class="sourceLineNo">8209</span>   */<a name="line.8209"></a>
+<span class="sourceLineNo">8210</span>  private static List&lt;Cell&gt; sort(List&lt;Cell&gt; cells, final CellComparator comparator) {<a name="line.8210"></a>
+<span class="sourceLineNo">8211</span>    cells.sort(comparator);<a name="line.8211"></a>
+<span class="sourceLineNo">8212</span>    return cells;<a name="line.8212"></a>
+<span class="sourceLineNo">8213</span>  }<a name="line.8213"></a>
+<span class="sourceLineNo">8214</span><a name="line.8214"></a>
+<span class="sourceLineNo">8215</span>  public static final long FIXED_OVERHEAD = ClassSize.align(<a name="line.8215"></a>
+<span class="sourceLineNo">8216</span>      ClassSize.OBJECT +<a name="line.8216"></a>
+<span class="sourceLineNo">8217</span>      ClassSize.ARRAY +<a name="line.8217"></a>
+<span class="sourceLineNo">8218</span>      55 * ClassSize.REFERENCE + 3 * Bytes.SIZEOF_INT +<a name="line.8218"></a>
+<span class="sourceLineNo">8219</span>      (15 * Bytes.SIZEOF_LONG) +<a name="line.8219"></a>
+<span class="sourceLineNo">8220</span>      3 * Bytes.SIZEOF_BOOLEAN);<a name="line.8220"></a>
+<span class="sourceLineNo">8221</span><a name="line.8221"></a>
+<span class="sourceLineNo">8222</span>  // woefully out of date - currently missing:<a name="line.8222"></a>
+<span class="sourceLineNo">8223</span>  // 1 x HashMap - coprocessorServiceHandlers<a name="line.8223"></a>
+<span class="sourceLineNo">8224</span>  // 6 x LongAdder - numMutationsWithoutWAL, dataInMemoryWithoutWAL,<a name="line.8224"></a>
+<span class="sourceLineNo">8225</span>  //   checkAndMutateChecksPassed, checkAndMutateChecksFailed, readRequestsCount,<a name="line.8225"></a>
+<span class="sourceLineNo">8226</span>  //   writeRequestsCount, cpRequestsCount<a name="line.8226"></a>
+<span class="sourceLineNo">8227</span>  // 1 x HRegion$WriteState - writestate<a name="line.8227"></a>
+<span class="sourceLineNo">8228</span>  // 1 x RegionCoprocessorHost - coprocessorHost<a name="line.8228"></a>
+<span class="sourceLineNo">8229</span>  // 1 x RegionSplitPolicy - splitPolicy<a name="line.8229"></a>
+<span class="sourceLineNo">8230</span>  // 1 x MetricsRegion - metricsRegion<a name="line.8230"></a>
+<span class="sourceLineNo">8231</span>  // 1 x MetricsRegionWrapperImpl - metricsRegionWrapper<a name="line.8231"></a>
+<span class="sourceLineNo">8232</span>  public static final long DEEP_OVERHEAD = FIXED_OVERHEAD +<a name="line.8232"></a>
+<span class="sourceLineNo">8233</span>      ClassSize.OBJECT + // closeLock<a name="line.8233"></a>
+<span class="sourceLineNo">8234</span>      (2 * ClassSize.ATOMIC_BOOLEAN) + // closed, closing<a name="line.8234"></a>
+<span class="sourceLineNo">8235</span>      (3 * ClassSize.ATOMIC_LONG) + // numPutsWithoutWAL, dataInMemoryWithoutWAL,<a name="line.8235"></a>
+<span class="sourceLineNo">8236</span>                                    // compactionsFailed<a name="line.8236"></a>
+<span class="sourceLineNo">8237</span>      (2 * ClassSize.CONCURRENT_HASHMAP) +  // lockedRows, scannerReadPoints<a name="line.8237"></a>
+<span class="sourceLineNo">8238</span>      WriteState.HEAP_SIZE + // writestate<a name="line.8238"></a>
+<span class="sourceLineNo">8239</span>      ClassSize.CONCURRENT_SKIPLISTMAP + ClassSize.CONCURRENT_SKIPLISTMAP_ENTRY + // stores<a name="line.8239"></a>
+<span class="sourceLineNo">8240</span>      (2 * ClassSize.REENTRANT_LOCK) + // lock, updatesLock<a name="line.8240"></a>
+<span class="sourceLineNo">8241</span>      MultiVersionConcurrencyControl.FIXED_SIZE // mvcc<a name="line.8241"></a>
+<span class="sourceLineNo">8242</span>      + 2 * ClassSize.TREEMAP // maxSeqIdInStores, replicationScopes<a name="line.8242"></a>
+<span class="sourceLineNo">8243</span>      + 2 * ClassSize.ATOMIC_INTEGER // majorInProgress, minorInProgress<a name="line.8243"></a>
+<span class="sourceLineNo">8244</span>      + ClassSize.STORE_SERVICES // store services<a name="line.8244"></a>
+<span class="sourceLineNo">8245</span>      + StoreHotnessProtector.FIXED_SIZE<a name="line.8245"></a>
+<span class="sourceLineNo">8246</span>      ;<a name="line.8246"></a>
+<span class="sourceLineNo">8247</span><a name="line.8247"></a>
+<span class="sourceLineNo">8248</span>  @Override<a name="line.8248"></a>
+<span class="sourceLineNo">8249</span>  public long heapSize() {<a name="line.8249"></a>
+<span class="sourceLineNo">8250</span>    // this does not take into account row locks, recent flushes, mvcc entries, and more<a name="line.8250"></a>
+<span class="sourceLineNo">8251</span>    return DEEP_OVERHEAD + stores.values().stream().mapToLong(HStore::heapSize).sum();<a name="line.8251"></a>
+<span class="sourceLineNo">8252</span>  }<a name="line.8252"></a>
+<span class="sourceLineNo">8253</span><a name="line.8253"></a>
+<span class="sourceLineNo">8254</span>  /**<a name="line.8254"></a>
+<span class="sourceLineNo">8255</span>   * Registers a new protocol buffer {@link Service} subclass as a coprocessor endpoint to<a name="line.8255"></a>
+<span class="sourceLineNo">8256</span>   * be available for handling Region#execService(com.google.protobuf.RpcController,<a name="line.8256"></a>
+<span class="sourceLineNo">8257</span>   *    org.apache.hadoop.hbase.protobuf.generated.ClientProtos.CoprocessorServiceCall) calls.<a name="line.8257"></a>
+<span class="sourceLineNo">8258</span>   *<a name="line.8258"></a>
+<span class="sourceLineNo">8259</span>   * &lt;p&gt;<a name="line.8259"></a>
+<span class="sourceLineNo">8260</span>   * Only a single instance may be registered per region for a given {@link Service} subclass (the<a name="line.8260"></a>
+<span class="sourceLineNo">8261</span>   * instances are keyed on {@link com.google.protobuf.Descriptors.ServiceDescriptor#getFullName()}.<a name="line.8261"></a>
+<span class="sourceLineNo">8262</span>   * After the first registration, subsequent calls with the same service name will fail with<a name="line.8262"></a>
+<span class="sourceLineNo">8263</span>   * a return value of {@code false}.<a name="line.8263"></a>
+<span class="sourceLineNo">8264</span>   * &lt;/p&gt;<a name="line.8264"></a>
+<span class="sourceLineNo">8265</span>   * @param instance the {@code Service} subclass instance to expose as a coprocessor endpoint<a name="line.8265"></a>
+<span class="sourceLineNo">8266</span>   * @return {@code true} if the registration was successful, {@code false}<a name="line.8266"></a>
+<span class="sourceLineNo">8267</span>   * otherwise<a name="line.8267"></a>
+<span class="sourceLineNo">8268</span>   */<a name="line.8268"></a>
+<span class="sourceLineNo">8269</span>  public boolean registerService(com.google.protobuf.Service instance) {<a name="line.8269"></a>
+<span class="sourceLineNo">8270</span>    /*<a name="line.8270"></a>
+<span class="sourceLineNo">8271</span>     * No stacking of instances is allowed for a single service name<a name="line.8271"></a>
+<span class="sourceLineNo">8272</span>     */<a name="line.8272"></a>
+<span class="sourceLineNo">8273</span>    com.google.protobuf.Descriptors.ServiceDescriptor serviceDesc = instance.getDescriptorForType();<a name="line.8273"></a>
+<span class="sourceLineNo">8274</span>    String serviceName = CoprocessorRpcUtils.getServiceName(serviceDesc);<a name="line.8274"></a>
+<span class="sourceLineNo">8275</span>    if (coprocessorServiceHandlers.containsKey(serviceName)) {<a name="line.8275"></a>
+<span class="sourceLineNo">8276</span>      LOG.error("Coprocessor service " + serviceName +<a name="line.8276"></a>
+<span class="sourceLineNo">8277</span>          " already registered, rejecting request from " + instance);<a name="line.8277"></a>
+<span class="sourceLineNo">8278</span>      return false;<a name="line.8278"></a>
+<span class="sourceLineNo">8279</span>    }<a name="line.8279"></a>
+<span class="sourceLineNo">8280</span><a name="line.8280"></a>
+<span class="sourceLineNo">8281</span>    coprocessorServiceHandlers.put(serviceName, instance);<a name="line.8281"></a>
+<span class="sourceLineNo">8282</span>    if (LOG.isDebugEnabled()) {<a name="line.8282"></a>
+<span class="sourceLineNo">8283</span>      LOG.debug("Registered coprocessor service: region=" +<a name="line.8283"></a>
+<span class="sourceLineNo">8284</span>          Bytes.toStringBinary(getRegionInfo().getRegionName()) +<a name="line.8284"></a>
+<span class="sourceLineNo">8285</span>          " service=" + serviceName);<a name="line.8285"></a>
+<span class="sourceLineNo">8286</span>    }<a name="line.8286"></a>
+<span class="sourceLineNo">8287</span>    return true;<a name="line.8287"></a>
+<span class="sourceLineNo">8288</span>  }<a name="line.8288"></a>
+<span class="sourceLineNo">8289</span><a name="line.8289"></a>
+<span class="sourceLineNo">8290</span>  /**<a name="line.8290"></a>
+<span class="sourceLineNo">8291</span>   * Executes a single protocol buffer coprocessor endpoint {@link Service} method using<a name="line.8291"></a>
+<span class="sourceLineNo">8292</span>   * the registered protocol handlers.  {@link Service} implementations must be registered via the<a name="line.8292"></a>
+<span class="sourceLineNo">8293</span>   * {@link #registerService(com.google.protobuf.Service)}<a name="line.8293"></a>
+<span class="sourceLineNo">8294</span>   * method before they are available.<a name="line.8294"></a>
+<span class="sourceLineNo">8295</span>   *<a name="line.8295"></a>
+<span class="sourceLineNo">8296</span>   * @param controller an {@code RpcContoller} implementation to pass to the invoked service<a name="line.8296"></a>
+<span class="sourceLineNo">8297</span>   * @param call a {@code CoprocessorServiceCall} instance identifying the service, method,<a name="line.8297"></a>
+<span class="sourceLineNo">8298</span>   *     and parameters for the method invocation<a name="line.8298"></a>
+<span class="sourceLineNo">8299</span>   * @return a protocol buffer {@code Message} instance containing the method's result<a name="line.8299"></a>
+<span class="sourceLineNo">8300</span>   * @throws IOException if no registered service handler is found or an error<a name="line.8300"></a>
+<span class="sourceLineNo">8301</span>   *     occurs during the invocation<a name="line.8301"></a>
+<span class="sourceLineNo">8302</span>   * @see #registerService(com.google.protobuf.Service)<a name="line.8302"></a>
+<span class="sourceLineNo">8303</span>   */<a name="line.8303"></a>
+<span class="sourceLineNo">8304</span>  public com.google.protobuf.Message execService(com.google.protobuf.RpcController controller,<a name="line.8304"></a>
+<span class="sourceLineNo">8305</span>      CoprocessorServiceCall call) throws IOException {<a name="line.8305"></a>
+<span class="sourceLineNo">8306</span>    String serviceName = call.getServiceName();<a name="line.8306"></a>
+<span class="sourceLineNo">8307</span>    com.google.protobuf.Service service = coprocessorServiceHandlers.get(serviceName);<a name="line.8307"></a>
+<span class="sourceLineNo">8308</span>    if (service == null) {<a name="line.8308"></a>
+<span class="sourceLineNo">8309</span>      throw new UnknownProtocolException(null, "No registered coprocessor service found for " +<a name="line.8309"></a>
+<span class="sourceLineNo">8310</span>          serviceName + " in region " + Bytes.toStringBinary(getRegionInfo().getRegionName()));<a name="line.8310"></a>
+<span class="sourceLineNo">8311</span>    }<a name="line.8311"></a>
+<span class="sourceLineNo">8312</span>    com.google.protobuf.Descriptors.ServiceDescriptor serviceDesc = service.getDescriptorForType();<a name="line.8312"></a>
 <span class="sourceLineNo">8313</span><a name="line.8313"></a>
-<span class="sourceLineNo">8314</span>    com.google.protobuf.Message.Builder builder =<a name="line.8314"></a>
-<span class="sourceLineNo">8315</span>        service.getRequestPrototype(methodDesc).newBuilderForType();<a name="line.8315"></a>
-<span class="sourceLineNo">8316</span><a name="line.8316"></a>
-<span class="sourceLineNo">8317</span>    org.apache.hadoop.hbase.protobuf.ProtobufUtil.mergeFrom(builder,<a name="line.8317"></a>
-<span class="sourceLineNo">8318</span>        call.getRequest().toByteArray());<a name="line.8318"></a>
-<span class="sourceLineNo">8319</span>    com.google.protobuf.Message request =<a name="line.8319"></a>
-<span class="sourceLineNo">8320</span>        CoprocessorRpcUtils.getRequest(service, methodDesc, call.getRequest());<a name="line.8320"></a>
+<span class="sourceLineNo">8314</span>    cpRequestsCount.increment();<a name="line.8314"></a>
+<span class="sourceLineNo">8315</span>    String methodName = call.getMethodName();<a name="line.8315"></a>
+<span class="sourceLineNo">8316</span>    com.google.protobuf.Descriptors.MethodDescriptor methodDesc =<a name="line.8316"></a>
+<span class="sourceLineNo">8317</span>        CoprocessorRpcUtils.getMethodDescriptor(methodName, serviceDesc);<a name="line.8317"></a>
+<span class="sourceLineNo">8318</span><a name="line.8318"></a>
+<span class="sourceLineNo">8319</span>    com.google.protobuf.Message.Builder builder =<a name="line.8319"></a>
+<span class="sourceLineNo">8320</span>        service.getRequestPrototype(methodDesc).newBuilderForType();<a name="line.8320"></a>
 <span class="sourceLineNo">8321</span><a name="line.8321"></a>
-<span class="sourceLineNo">8322</span>    if (coprocessorHost != null) {<a name="line.8322"></a>
-<span class="sourceLineNo">8323</span>      request = coprocessorHost.preEndpointInvocation(service, methodName, request);<a name="line.8323"></a>
-<span class="sourceLineNo">8324</span>    }<a name="line.8324"></a>
-<span class="sourceLineNo">8325</span><a name="line.8325"></a>
-<span class="sourceLineNo">8326</span>    final com.google.protobuf.Message.Builder responseBuilder =<a name="line.8326"></a>
-<span class="sourceLineNo">8327</span>        service.getResponsePrototype(methodDesc).newBuilderForType();<a name="line.8327"></a>
-<span class="sourceLineNo">8328</span>    service.callMethod(methodDesc, controller, request,<a name="line.8328"></a>
-<span class="sourceLineNo">8329</span>        new com.google.protobuf.RpcCallback&lt;com.google.protobuf.Message&gt;() {<a name="line.8329"></a>
-<span class="sourceLineNo">8330</span>      @Override<a name="line.8330"></a>
-<span class="sourceLineNo">8331</span>      public void run(com.google.protobuf.Message message) {<a name="line.8331"></a>
-<span class="sourceLineNo">8332</span>        if (message != null) {<a name="line.8332"></a>
-<span class="sourceLineNo">8333</span>          responseBuilder.mergeFrom(message);<a name="line.8333"></a>
-<span class="sourceLineNo">8334</span>        }<a name="line.8334"></a>
-<span class="sourceLineNo">8335</span>      }<a name="line.8335"></a>
-<span class="sourceLineNo">8336</span>    });<a name="line.8336"></a>
-<span class="sourceLineNo">8337</span><a name="line.8337"></a>
-<span class="sourceLineNo">8338</span>    if (coprocessorHost != null) {<a name="line.8338"></a>
-<span class="sourceLineNo">8339</span>      coprocessorHost.postEndpointInvocation(service, methodName, request, responseBuilder);<a name="line.8339"></a>
-<span class="sourceLineNo">8340</span>    }<a name="line.8340"></a>
-<span class="sourceLineNo">8341</span>    IOException exception =<a name="line.8341"></a>
-<span class="sourceLineNo">8342</span>        org.apache.hadoop.hbase.ipc.CoprocessorRpcUtils.getControllerException(controller);<a name="line.8342"></a>
-<span class="sourceLineNo">8343</span>    if (exception != null) {<a name="line.8343"></a>
-<span class="sourceLineNo">8344</span>      throw exception;<a name="line.8344"></a>
+<span class="sourceLineNo">8322</span>    org.apache.hadoop.hbase.protobuf.ProtobufUtil.mergeFrom(builder,<a name="line.8322"></a>
+<span class="sourceLineNo">8323</span>        call.getRequest().toByteArray());<a name="line.8323"></a>
+<span class="sourceLineNo">8324</span>    com.google.protobuf.Message request =<a name="line.8324"></a>
+<span class="sourceLineNo">8325</span>        CoprocessorRpcUtils.getRequest(service, methodDesc, call.getRequest());<a name="line.8325"></a>
+<span class="sourceLineNo">8326</span><a name="line.8326"></a>
+<span class="sourceLineNo">8327</span>    if (coprocessorHost != null) {<a name="line.8327"></a>
+<span class="sourceLineNo">8328</span>      request = coprocessorHost.preEndpointInvocation(service, methodName, request);<a name="line.8328"></a>
+<span class="sourceLineNo">8329</span>    }<a name="line.8329"></a>
+<span class="sourceLineNo">8330</span><a name="line.8330"></a>
+<span class="sourceLineNo">8331</span>    final com.google.protobuf.Message.Builder responseBuilder =<a name="line.8331"></a>
+<span class="sourceLineNo">8332</span>        service.getResponsePrototype(methodDesc).newBuilderForType();<a name="line.8332"></a>
+<span class="sourceLineNo">8333</span>    service.callMethod(methodDesc, controller, request,<a name="line.8333"></a>
+<span class="sourceLineNo">8334</span>        new com.google.protobuf.RpcCallback&lt;com.google.protobuf.Message&gt;() {<a name="line.8334"></a>
+<span class="sourceLineNo">8335</span>      @Override<a name="line.8335"></a>
+<span class="sourceLineNo">8336</span>      public void run(com.google.protobuf.Message message) {<a name="line.8336"></a>
+<span class="sourceLineNo">8337</span>        if (message != null) {<a name="line.8337"></a>
+<span class="sourceLineNo">8338</span>          responseBuilder.mergeFrom(message);<a name="line.8338"></a>
+<span class="sourceLineNo">8339</span>        }<a name="line.8339"></a>
+<span class="sourceLineNo">8340</span>      }<a name="line.8340"></a>
+<span class="sourceLineNo">8341</span>    });<a name="line.8341"></a>
+<span class="sourceLineNo">8342</span><a name="line.8342"></a>
+<span class="sourceLineNo">8343</span>    if (coprocessorHost != null) {<a name="line.8343"></a>
+<span class="sourceLineNo">8344</span>      coprocessorHost.postEndpointInvocation(service, methodName, request, responseBuilder);<a name="line.8344"></a>
 <span class="sourceLineNo">8345</span>    }<a name="line.8345"></a>
-<span class="sourceLineNo">8346</span><a name="line.8346"></a>
-<span class="sourceLineNo">8347</span>    return responseBuilder.build();<a name="line.8347"></a>
-<span class="sourceLineNo">8348</span>  }<a name="line.8348"></a>
-<span class="sourceLineNo">8349</span><a name="line.8349"></a>
-<span class="sourceLineNo">8350</span>  boolean shouldForceSplit() {<a name="line.8350"></a>
-<span class="sourceLineNo">8351</span>    return this.splitRequest;<a name="line.8351"></a>
-<span class="sourceLineNo">8352</span>  }<a name="line.8352"></a>
-<span class="sourceLineNo">8353</span><a name="line.8353"></a>
-<span class="sourceLineNo">8354</span>  byte[] getExplicitSplitPoint() {<a name="line.8354"></a>
-<span class="sourceLineNo">8355</span>    return this.explicitSplitPoint;<a name="line.8355"></a>
-<span class="sourceLineNo">8356</span>  }<a name="line.8356"></a>
-<span class="sourceLineNo">8357</span><a name="line.8357"></a>
-<span class="sourceLineNo">8358</span>  void forceSplit(byte[] sp) {<a name="line.8358"></a>
-<span class="sourceLineNo">8359</span>    // This HRegion will go away after the forced split is successful<a name="line.8359"></a>
-<span class="sourceLineNo">8360</span>    // But if a forced split fails, we need to clear forced split.<a name="line.8360"></a>
-<span class="sourceLineNo">8361</span>    this.splitRequest = true;<a name="line.8361"></a>
-<span class="sourceLineNo">8362</span>    if (sp != null) {<a name="line.8362"></a>
-<span class="sourceLineNo">8363</span>      this.explicitSplitPoint = sp;<a name="line.8363"></a>
-<span class="sourceLineNo">8364</span>    }<a name="line.8364"></a>
-<span class="sourceLineNo">8365</span>  }<a name="line.8365"></a>
-<span class="sourceLineNo">8366</span><a name="line.8366"></a>
-<span class="sourceLineNo">8367</span>  void clearSplit() {<a name="line.8367"></a>
-<span class="sourceLineNo">8368</span>    this.splitRequest = false;<a name="line.8368"></a>
-<span class="sourceLineNo">8369</span>    this.explicitSplitPoint = null;<a name="line.8369"></a>
+<span class="sourceLineNo">8346</span>    IOException exception =<a name="line.8346"></a>
+<span class="sourceLineNo">8347</span>        org.apache.hadoop.hbase.ipc.CoprocessorRpcUtils.getControllerException(controller);<a name="line.8347"></a>
+<span class="sourceLineNo">8348</span>    if (exception != null) {<a name="line.8348"></a>
+<span class="sourceLineNo">8349</span>      throw exception;<a name="line.8349"></a>
+<span class="sourceLineNo">8350</span>    }<a name="line.8350"></a>
+<span class="sourceLineNo">8351</span><a name="line.8351"></a>
+<span class="sourceLineNo">8352</span>    return responseBuilder.build();<a name="line.8352"></a>
+<span class="sourceLineNo">8353</span>  }<a name="line.8353"></a>
+<span class="sourceLineNo">8354</span><a name="line.8354"></a>
+<span class="sourceLineNo">8355</span>  boolean shouldForceSplit() {<a name="line.8355"></a>
+<span class="sourceLineNo">8356</span>    return this.splitRequest;<a name="line.8356"></a>
+<span class="sourceLineNo">8357</span>  }<a name="line.8357"></a>
+<span class="sourceLineNo">8358</span><a name="line.8358"></a>
+<span class="sourceLineNo">8359</span>  byte[] getExplicitSplitPoint() {<a name="line.8359"></a>
+<span class="sourceLineNo">8360</span>    return this.explicitSplitPoint;<a name="line.8360"></a>
+<span class="sourceLineNo">8361</span>  }<a name="line.8361"></a>
+<span class="sourceLineNo">8362</span><a name="line.8362"></a>
+<span class="sourceLineNo">8363</span>  void forceSplit(byte[] sp) {<a name="line.8363"></a>
+<span class="sourceLineNo">8364</span>    // This HRegion will go away after the forced split is successful<a name="line.8364"></a>
+<span class="sourceLineNo">8365</span>    // But if a forced split fails, we need to clear forced split.<a name="line.8365"></a>
+<span class="sourceLineNo">8366</span>    this.splitRequest = true;<a name="line.8366"></a>
+<span class="sourceLineNo">8367</span>    if (sp != null) {<a name="line.8367"></a>
+<span class="sourceLineNo">8368</span>      this.explicitSplitPoint = sp;<a name="line.8368"></a>
+<span class="sourceLineNo">8369</span>    }<a name="line.8369"></a>
 <span class="sourceLineNo">8370</span>  }<a name="line.8370"></a>
 <span class="sourceLineNo">8371</span><a name="line.8371"></a>
-<span class="sourceLineNo">8372</span>  /**<a name="line.8372"></a>
-<span class="sourceLineNo">8373</span>   * Return the splitpoint. null indicates the region isn't splittable<a name="line.8373"></a>
-<span class="sourceLineNo">8374</span>   * If the splitpoint isn't explicitly specified, it will go over the stores<a name="line.8374"></a>
-<span class="sourceLineNo">8375</span>   * to find the best splitpoint. Currently the criteria of best splitpoint<a name="line.8375"></a>
-<span class="sourceLineNo">8376</span>   * is based on the size of the store.<a name="line.8376"></a>
-<span class="sourceLineNo">8377</span>   */<a name="line.8377"></a>
-<span class="sourceLineNo">8378</span>  public byte[] checkSplit() {<a name="line.8378"></a>
-<span class="sourceLineNo">8379</span>    // Can't split META<a name="line.8379"></a>
-<span class="sourceLineNo">8380</span>    if (this.getRegionInfo().isMetaRegion()) {<a name="line.8380"></a>
-<span class="sourceLineNo">8381</span>      if (shouldForceSplit()) {<a name="line.8381"></a>
-<span class="sourceLineNo">8382</span>        LOG.warn("Cannot split meta region in HBase 0.20 and above");<a name="line.8382"></a>
-<span class="sourceLineNo">8383</span>      }<a name="line.8383"></a>
-<span class="sourceLineNo">8384</span>      return null;<a name="line.8384"></a>
-<span class="sourceLineNo">8385</span>    }<a name="line.8385"></a>
-<span class="sourceLineNo">8386</span><a name="line.8386"></a>
-<span class="sourceLineNo">8387</span>    // Can't split a region that is closing.<a name="line.8387"></a>
-<span class="sourceLineNo">8388</span>    if (this.isClosing()) {<a name="line.8388"></a>
+<span class="sourceLineNo">8372</span>  void clearSplit() {<a name="line.8372"></a>
+<span class="sourceLineNo">8373</span>    this.splitRequest = false;<a name="line.8373"></a>
+<span class="sourceLineNo">8374</span>    this.explicitSplitPoint = null;<a name="line.8374"></a>
+<span class="sourceLineNo">8375</span>  }<a name="line.8375"></a>
+<span class="sourceLineNo">8376</span><a name="line.8376"></a>
+<span class="sourceLineNo">8377</span>  /**<a name="line.8377"></a>
+<span class="sourceLineNo">8378</span>   * Return the splitpoint. null indicates the region isn't splittable<a name="line.8378"></a>
+<span class="sourceLineNo">8379</span>   * If the splitpoint isn't explicitly specified, it will go over the stores<a name="line.8379"></a>
+<span class="sourceLineNo">8380</span>   * to find the best splitpoint. Currently the criteria of best splitpoint<a name="line.8380"></a>
+<span class="sourceLineNo">8381</span>   * is based on the size of the store.<a name="line.8381"></a>
+<span class="sourceLineNo">8382</span>   */<a name="line.8382"></a>
+<span class="sourceLineNo">8383</span>  public byte[] checkSplit() {<a name="line.8383"></a>
+<span class="sourceLineNo">8384</span>    // Can't split META<a name="line.8384"></a>
+<span class="sourceLineNo">8385</span>    if (this.getRegionInfo().isMetaRegion()) {<a name="line.8385"></a>
+<span class="sourceLineNo">8386</span>      if (shouldForceSplit()) {<a name="line.8386"></a>
+<span class="sourceLineNo">8387</span>        LOG.warn("Cannot split meta region in HBase 0.20 and above");<a name="line.8387"></a>
+<span class="sourceLineNo">8388</span>      }<a name="line.8388"></a>
 <span class="sourceLineNo">8389</span>      return null;<a name="line.8389"></a>
 <span class="sourceLineNo">8390</span>    }<a name="line.8390"></a>
 <span class="sourceLineNo">8391</span><a name="line.8391"></a>
-<span class="sourceLineNo">8392</span>    if (!splitPolicy.shouldSplit()) {<a name="line.8392"></a>
-<span class="sourceLineNo">8393</span>      return null;<a name="line.8393"></a>
-<span class="sourceLineNo">8394</span>    }<a name="line.8394"></a>
-<span class="sourceLineNo">8395</span><a name="line.8395"></a>
-<span class="sourceLineNo">8396</span>    byte[] ret = splitPolicy.getSplitPoint();<a name="line.8396"></a>
-<span class="sourceLineNo">8397</span><a name="line.8397"></a>
-<span class="sourceLineNo">8398</span>    if (ret != null) {<a name="line.8398"></a>
-<span class="sourceLineNo">8399</span>      try {<a name="line.8399"></a>
-<span class="sourceLineNo">8400</span>        checkRow(ret, "calculated split");<a name="line.8400"></a>
-<span class="sourceLineNo">8401</span>      } catch (IOException e) {<a name="line.8401"></a>
-<span class="sourceLineNo">8402</span>        LOG.error("Ignoring invalid split", e);<a name="line.8402"></a>
-<span class="sourceLineNo">8403</span>        return null;<a name="line.8403"></a>
-<span class="sourceLineNo">8404</span>      }<a name="line.8404"></a>
-<span class="sourceLineNo">8405</span>    }<a name="line.8405"></a>
-<span class="sourceLineNo">8406</span>    return ret;<a name="line.8406"></a>
-<span class="sourceLineNo">8407</span>  }<a name="line.8407"></a>
-<span class="sourceLineNo">8408</span><a name="line.8408"></a>
-<span class="sourceLineNo">8409</span>  /**<a name="line.8409"></a>
-<span class="sourceLineNo">8410</span>   * @return The priority that this region should have in the compaction queue<a name="line.8410"></a>
-<span class="sourceLineNo">8411</span>   */<a name="line.8411"></a>
-<span class="sourceLineNo">8412</span>  public int getCompactPriority() {<a name="line.8412"></a>
-<span class="sourceLineNo">8413</span>    return stores.values().stream().mapToInt(HStore::getCompactPriority).min()<a name="line.8413"></a>
-<span class="sourceLineNo">8414</span>        .orElse(Store.NO_PRIORITY);<a name="line.8414"></a>
-<span class="sourceLineNo">8415</span>  }<a name="line.8415"></a>
-<span class="sourceLineNo">8416</span><a name="line.8416"></a>
-<span class="sourceLineNo">8417</span>  /** @return the coprocessor host */<a name="line.8417"></a>
-<span class="sourceLineNo">8418</span>  public RegionCoprocessorHost getCoprocessorHost() {<a name="line.8418"></a>
-<span class="sourceLineNo">8419</span>    return coprocessorHost;<a name="line.8419"></a>
+<span class="sourceLineNo">8392</span>    // Can't split a region that is closing.<a name="line.8392"></a>
+<span class="sourceLineNo">8393</span>    if (this.isClosing()) {<a name="line.8393"></a>
+<span class="sourceLineNo">8394</span>      return null;<a name="line.8394"></a>
+<span class="sourceLineNo">8395</span>    }<a name="line.8395"></a>
+<span class="sourceLineNo">8396</span><a name="line.8396"></a>
+<span class="sourceLineNo">8397</span>    if (!splitPolicy.shouldSplit()) {<a name="line.8397"></a>
+<span class="sourceLineNo">8398</span>      return null;<a name="line.8398"></a>
+<span class="sourceLineNo">8399</span>    }<a name="line.8399"></a>
+<span class="sourceLineNo">8400</span><a name="line.8400"></a>
+<span class="sourceLineNo">8401</span>    byte[] ret = splitPolicy.getSplitPoint();<a name="line.8401"></a>
+<span class="sourceLineNo">8402</span><a name="line.8402"></a>
+<span class="sourceLineNo">8403</span>    if (ret != null) {<a name="line.8403"></a>
+<span class="sourceLineNo">8404</span>      try {<a name="line.8404"></a>
+<span class="sourceLineNo">8405</span>        checkRow(ret, "calculated split");<a name="line.8405"></a>
+<span class="sourceLineNo">8406</span>      } catch (IOException e) {<a name="line.8406"></a>
+<span class="sourceLineNo">8407</span>        LOG.error("Ignoring invalid split", e);<a name="line.8407"></a>
+<span class="sourceLineNo">8408</span>        return null;<a name="line.8408"></a>
+<span class="sourceLineNo">8409</span>      }<a name="line.8409"></a>
+<span class="sourceLineNo">8410</span>    }<a name="line.8410"></a>
+<span class="sourceLineNo">8411</span>    return ret;<a name="line.8411"></a>
+<span class="sourceLineNo">8412</span>  }<a name="line.8412"></a>
+<span class="sourceLineNo">8413</span><a name="line.8413"></a>
+<span class="sourceLineNo">8414</span>  /**<a name="line.8414"></a>
+<span class="sourceLineNo">8415</span>   * @return The priority that this region should have in the compaction queue<a name="line.8415"></a>
+<span class="sourceLineNo">8416</span>   */<a name="line.8416"></a>
+<span class="sourceLineNo">8417</span>  public int getCompactPriority() {<a name="line.8417"></a>
+<span class="sourceLineNo">8418</span>    return stores.values().stream().mapToInt(HStore::getCompactPriority).min()<a name="line.8418"></a>
+<span class="sourceLineNo">8419</span>        .orElse(Store.NO_PRIORITY);<a name="line.8419"></a>
 <span class="sourceLineNo">8420</span>  }<a name="line.8420"></a>
 <span class="sourceLineNo">8421</span><a name="line.8421"></a>
-<span class="sourceLineNo">8422</span>  /** @param coprocessorHost the new coprocessor host */<a name="line.8422"></a>
-<span class="sourceLineNo">8423</span>  @VisibleForTesting<a name="line.8423"></a>
-<span class="sourceLineNo">8424</span>  public void setCoprocessorHost(final RegionCoprocessorHost coprocessorHost) {<a name="line.8424"></a>
-<span class="sourceLineNo">8425</span>    this.coprocessorHost = coprocessorHost;<a name="line.8425"></a>
-<span class="sourceLineNo">8426</span>  }<a name="line.8426"></a>
-<span class="sourceLineNo">8427</span><a name="line.8427"></a>
-<span class="sourceLineNo">8428</span>  @Override<a name="line.8428"></a>
-<span class="sourceLineNo">8429</span>  public void startRegionOperation() throws IOException {<a name="line.8429"></a>
-<span class="sourceLineNo">8430</span>    startRegionOperation(Operation.ANY);<a name="line.8430"></a>
+<span class="sourceLineNo">8422</span>  /** @return the coprocessor host */<a name="line.8422"></a>
+<span class="sourceLineNo">8423</span>  public RegionCoprocessorHost getCoprocessorHost() {<a name="line.8423"></a>
+<span class="sourceLineNo">8424</span>    return coprocessorHost;<a name="line.8424"></a>
+<span class="sourceLineNo">8425</span>  }<a name="line.8425"></a>
+<span class="sourceLineNo">8426</span><a name="line.8426"></a>
+<span class="sourceLineNo">8427</span>  /** @param coprocessorHost the new coprocessor host */<a name="line.8427"></a>
+<span class="sourceLineNo">8428</span>  @VisibleForTesting<a name="line.8428"></a>
+<span class="sourceLineNo">8429</span>  public void setCoprocessorHost(final RegionCoprocessorHost coprocessorHost) {<a name="line.8429"></a>
+<span class="sourceLineNo">8430</span>    this.coprocessorHost = coprocessorHost;<a name="line.8430"></a>
 <span class="sourceLineNo">8431</span>  }<a name="line.8431"></a>
 <span class="sourceLineNo">8432</span><a name="line.8432"></a>
 <span class="sourceLineNo">8433</span>  @Override<a name="line.8433"></a>
-<span class="sourceLineNo">8434</span>  public void startRegionOperation(Operation op) throws IOException {<a name="line.8434"></a>
-<span class="sourceLineNo">8435</span>    switch (op) {<a name="line.8435"></a>
-<span class="sourceLineNo">8436</span>      case GET:  // read operations<a name="line.8436"></a>
-<span class="sourceLineNo">8437</span>      case SCAN:<a name="line.8437"></a>
-<span class="sourceLineNo">8438</span>        checkReadsEnabled();<a name="line.8438"></a>
-<span class="sourceLineNo">8439</span>        break;<a name="line.8439"></a>
-<span class="sourceLineNo">8440</span>      default:<a name="line.8440"></a>
-<span class="sourceLineNo">8441</span>        break;<a name="line.8441"></a>
-<span class="sourceLineNo">8442</span>    }<a name="line.8442"></a>
-<span class="sourceLineNo">8443</span>    if (op == Operation.MERGE_REGION || op == Operation.SPLIT_REGION<a name="line.8443"></a>
-<span class="sourceLineNo">8444</span>        || op == Operation.COMPACT_REGION || op == Operation.COMPACT_SWITCH) {<a name="line.8444"></a>
-<span class="sourceLineNo">8445</span>      // split, merge or compact region doesn't need to check the closing/closed state or lock the<a name="line.8445"></a>
-<span class="sourceLineNo">8446</span>      // region<a name="line.8446"></a>
-<span class="sourceLineNo">8447</span>      return;<a name="line.8447"></a>
-<span class="sourceLineNo">8448</span>    }<a name="line.8448"></a>
-<span class="sourceLineNo">8449</span>    if (this.closing.get()) {<a name="line.8449"></a>
-<span class="sourceLineNo">8450</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closing");<a name="line.8450"></a>
-<span class="sourceLineNo">8451</span>    }<a name="line.8451"></a>
-<span class="sourceLineNo">8452</span>    lock(lock.readLock());<a name="line.8452"></a>
-<span class="sourceLineNo">8453</span>    if (this.closed.get()) {<a name="line.8453"></a>
-<span class="sourceLineNo">8454</span>      lock.readLock().unlock();<a name="line.8454"></a>
-<span class="sourceLineNo">8455</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closed");<a name="line.8455"></a>
+<span class="sourceLineNo">8434</span>  public void startRegionOperation() throws IOException {<a name="line.8434"></a>
+<span class="sourceLineNo">8435</span>    startRegionOperation(Operation.ANY);<a name="line.8435"></a>
+<span class="sourceLineNo">8436</span>  }<a name="line.8436"></a>
+<span class="sourceLineNo">8437</span><a name="line.8437"></a>
+<span class="sourceLineNo">8438</span>  @Override<a name="line.8438"></a>
+<span class="sourceLineNo">8439</span>  public void startRegionOperation(Operation op) throws IOException {<a name="line.8439"></a>
+<span class="sourceLineNo">8440</span>    switch (op) {<a name="line.8440"></a>
+<span class="sourceLineNo">8441</span>      case GET:  // read operations<a name="line.8441"></a>
+<span class="sourceLineNo">8442</span>      case SCAN:<a name="line.8442"></a>
+<span class="sourceLineNo">8443</span>        checkReadsEnabled();<a name="line.8443"></a>
+<span class="sourceLineNo">8444</span>        break;<a name="line.8444"></a>
+<span class="sourceLineNo">8445</span>      default:<a name="line.8445"></a>
+<span class="sourceLineNo">8446</span>        break;<a name="line.8446"></a>
+<span class="sourceLineNo">8447</span>    }<a name="line.8447"></a>
+<span class="sourceLineNo">8448</span>    if (op == Operation.MERGE_REGION || op == Operation.SPLIT_REGION<a name="line.8448"></a>
+<span class="sourceLineNo">8449</span>        || op == Operation.COMPACT_REGION || op == Operation.COMPACT_SWITCH) {<a name="line.8449"></a>
+<span class="sourceLineNo">8450</span>      // split, merge or compact region doesn't need to check the closing/closed state or lock the<a name="line.8450"></a>
+<span class="sourceLineNo">8451</span>      // region<a name="line.8451"></a>
+<span class="sourceLineNo">8452</span>      return;<a name="line.8452"></a>
+<span class="sourceLineNo">8453</span>    }<a name="line.8453"></a>
+<span class="sourceLineNo">8454</span>    if (this.closing.get()) {<a name="line.8454"></a>
+<span class="sourceLineNo">8455</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closing");<a name="line.8455"></a>
 <span class="sourceLineNo">8456</span>    }<a name="line.8456"></a>
-<span class="sourceLineNo">8457</span>    // The unit for snapshot is a region. So, all stores for this region must be<a name="line.8457"></a>
-<span class="sourceLineNo">8458</span>    // prepared for snapshot operation before proceeding.<a name="line.8458"></a>
-<span class="sourceLineNo">8459</span>    if (op == Operation.SNAPSHOT) {<a name="line.8459"></a>
-<span class="sourceLineNo">8460</span>      stores.values().forEach(HStore::preSnapshotOperation);<a name="line.8460"></a>
+<span class="sourceLineNo">8457</span>    lock(lock.readLock());<a name="line.8457"></a>
+<span class="sourceLineNo">8458</span>    if (this.closed.get()) {<a name="line.8458"></a>
+<span class="sourceLineNo">8459</span>      lock.readLock().unlock();<a name="line.8459"></a>
+<span class="sourceLineNo">8460</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closed");<a name="line.8460"></a>
 <span class="sourceLineNo">8461</span>    }<a name="line.8461"></a>
-<span class="sourceLineNo">8462</span>    try {<a name="line.8462"></a>
-<span class="sourceLineNo">8463</span>      if (coprocessorHost != null) {<a name="line.8463"></a>
-<span class="sourceLineNo">8464</span>        coprocessorHost.postStartRegionOperation(op);<a name="line.8464"></a>
-<span class="sourceLineNo">8465</span>      }<a name="line.8465"></a>
-<span class="sourceLineNo">8466</span>    } catch (Exception e) {<a name="line.8466"></a>
-<span class="sourceLineNo">8467</span>      lock.readLock().unlock();<a name="line.8467"></a>
-<span class="sourceLineNo">8468</span>      throw new IOException(e);<a name="line.8468"></a>
-<span class="sourceLineNo">8469</span>    }<a name="line.8469"></a>
-<span class="sourceLineNo">8470</span>  }<a name="line.8470"></a>
-<span class="sourceLineNo">8471</span><a name="line.8471"></a>
-<span class="sourceLineNo">8472</span>  @Override<a name="line.8472"></a>
-<span class="sourceLineNo">8473</span>  public void closeRegionOperation() throws IOException {<a name="line.8473"></a>
-<span class="sourceLineNo">8474</span>    closeRegionOperation(Operation.ANY);<a name="line.8474"></a>
+<span class="sourceLineNo">8462</span>    // The unit for snapshot is a region. So, all stores for this region must be<a name="line.8462"></a>
+<span class="sourceLineNo">8463</span>    // prepared for snapshot operation before proceeding.<a name="line.8463"></a>
+<span class="sourceLineNo">8464</span>    if (op == Operation.SNAPSHOT) {<a name="line.8464"></a>
+<span class="sourceLineNo">8465</span>      stores.values().forEach(HStore::preSnapshotOperation);<a name="line.8465"></a>
+<span class="sourceLineNo">8466</span>    }<a name="line.8466"></a>
+<span class="sourceLineNo">8467</span>    try {<a name="line.8467"></a>
+<span class="sourceLineNo">8468</span>      if (coprocessorHost != null) {<a name="line.8468"></a>
+<span class="sourceLineNo">8469</span>        coprocessorHost.postStartRegionOperation(op);<a name="line.8469"></a>
+<span class="sourceLineNo">8470</span>      }<a name="line.8470"></a>
+<span class="sourceLineNo">8471</span>    } catch (Exception e) {<a name="line.8471"></a>
+<span class="sourceLineNo">8472</span>      lock.readLock().unlock();<a name="line.8472"></a>
+<span class="sourceLineNo">8473</span>      throw new IOException(e);<a name="line.8473"></a>
+<span class="sourceLineNo">8474</span>    }<a name="line.8474"></a>
 <span class="sourceLineNo">8475</span>  }<a name="line.8475"></a>
 <span class="sourceLineNo">8476</span><a name="line.8476"></a>
 <span class="sourceLineNo">8477</span>  @Override<a name="line.8477"></a>
-<span class="sourceLineNo">8478</span>  public void closeRegionOperation(Operation operation) throws IOException {<a name="line.8478"></a>
-<span class="sourceLineNo">8479</span>    if (operation == Operation.SNAPSHOT) {<a name="line.8479"></a>
-<span class="sourceLineNo">8480</span>      stores.values().forEach(HStore::postSnapshotOperation);<a name="line.8480"></a>
-<span class="sourceLineNo">8481</span>    }<a name="line.8481"></a>
-<span class="sourceLineNo">8482</span>    lock.readLock().unlock();<a name="line.8482"></a>
-<span class="sourceLineNo">8483</span>    if (coprocessorHost != null) {<a name="line.8483"></a>
-<span class="sourceLineNo">8484</span>      coprocessorHost.postCloseRegionOperation(operation);<a name="line.8484"></a>
-<span class="sourceLineNo">8485</span>    }<a name="line.8485"></a>
-<span class="sourceLineNo">8486</span>  }<a name="line.8486"></a>
-<span class="sourceLineNo">8487</span><a name="line.8487"></a>
-<span class="sourceLineNo">8488</span>  /**<a name="line.8488"></a>
-<span class="sourceLineNo">8489</span>   * This method needs to be called before any public call that reads or<a name="line.8489"></a>
-<span class="sourceLineNo">8490</span>   * modifies stores in bulk. It has to be called just before a try.<a name="line.8490"></a>
-<span class="sourceLineNo">8491</span>   * #closeBulkRegionOperation needs to be called in the try's finally block<a name="line.8491"></a>
-<span class="sourceLineNo">8492</span>   * Acquires a writelock and checks if the region is closing or closed.<a name="line.8492"></a>
-<span class="sourceLineNo">8493</span>   * @throws NotServingRegionException when the region is closing or closed<a name="line.8493"></a>
-<span class="sourceLineNo">8494</span>   * @throws RegionTooBusyException if failed to get the lock in time<a name="line.8494"></a>
-<span class="sourceLineNo">8495</span>   * @throws InterruptedIOException if interrupted while waiting for a lock<a name="line.8495"></a>
-<span class="sourceLineNo">8496</span>   */<a name="line.8496"></a>
-<span class="sourceLineNo">8497</span>  private void startBulkRegionOperation(boolean writeLockNeeded)<a name="line.8497"></a>
-<span class="sourceLineNo">8498</span>      throws NotServingRegionException, RegionTooBusyException, InterruptedIOException {<a name="line.8498"></a>
-<span class="sourceLineNo">8499</span>    if (this.closing.get()) {<a name="line.8499"></a>
-<span class="sourceLineNo">8500</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closing");<a name="line.8500"></a>
-<span class="sourceLineNo">8501</span>    }<a name="line.8501"></a>
-<span class="sourceLineNo">8502</span>    if (writeLockNeeded) lock(lock.writeLock());<a name="line.8502"></a>
-<span class="sourceLineNo">8503</span>    else lock(lock.readLock());<a name="line.8503"></a>
-<span class="sourceLineNo">8504</span>    if (this.closed.get()) {<a name="line.8504"></a>
-<span class="sourceLineNo">8505</span>      if (writeLockNeeded) lock.writeLock().unlock();<a name="line.8505"></a>
-<span class="sourceLineNo">8506</span>      else lock.readLock().unlock();<a name="line.8506"></a>
-<span class="sourceLineNo">8507</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closed");<a name="line.8507"></a>
-<span class="sourceLineNo">8508</span>    }<a name="line.8508"></a>
-<span class="sourceLineNo">8509</span>  }<a name="line.8509"></a>
-<span class="sourceLineNo">8510</span><a name="line.8510"></a>
-<span class="sourceLineNo">8511</span>  /**<a name="line.8511"></a>
-<span class="sourceLineNo">8512</span>   * Closes the lock. This needs to be called in the finally block corresponding<a name="line.8512"></a>
-<span class="sourceLineNo">8513</span>   * to the try block of #startRegionOperation<a name="line.8513"></a>
-<span class="sourceLineNo">8514</span>   */<a name="line.8514"></a>
-<span class="sourceLineNo">8515</span>  private void closeBulkRegionOperation(){<a name="line.8515"></a>
-<span class="sourceLineNo">8516</span>    if (lock.writeLock().isHeldByCurrentThread()) lock.writeLock().unlock();<a name="line.8516"></a>
-<span class="sourceLineNo">8517</span>    else lock.readLock().unlock();<a name="line.8517"></a>
-<span class="sourceLineNo">8518</span>  }<a name="line.8518"></a>
-<span class="sourceLineNo">8519</span><a name="line.8519"></a>
-<span class="sourceLineNo">8520</span>  /**<a name="line.8520"></a>
-<span class="sourceLineNo">8521</span>   * Update LongAdders for number of puts without wal and the size of possible data loss.<a name="line.8521"></a>
-<span class="sourceLineNo">8522</span>   * These information are exposed by the region server metrics.<a name="line.8522"></a>
-<span class="sourceLineNo">8523</span>   */<a name="line.8523"></a>
-<span class="sourceLineNo">8524</span>  private void recordMutationWithoutWal(final Map&lt;byte [], List&lt;Cell&gt;&gt; familyMap) {<a name="line.8524"></a>
-<span class="sourceLineNo">8525</span>    numMutationsWithoutWAL.increment();<a name="line.8525"></a>
-<span class="sourceLineNo">8526</span>    if (numMutationsWithoutWAL.sum() &lt;= 1) {<a name="line.8526"></a>
-<span class="sourceLineNo">8527</span>      LOG.info("writing data to region " + this +<a name="line.8527"></a>
-<span class="sourceLineNo">8528</span>               " with WAL disabled. Data may be lost in the event of a crash.");<a name="line.8528"></a>
-<span class="sourceLineNo">8529</span>    }<a name="line.8529"></a>
-<span class="sourceLineNo">8530</span><a name="line.8530"></a>
-<span class="sourceLineNo">8531</span>    long mutationSize = 0;<a name="line.8531"></a>
-<span class="sourceLineNo">8532</span>    for (List&lt;Cell&gt; cells: familyMap.values()) {<a name="line.8532"></a>
-<span class="sourceLineNo">8533</span>      // Optimization: 'foreach' loop is not used. See:<a name="line.8533"></a>
-<span class="sourceLineNo">8534</span>      // HBASE-12023 HRegion.applyFamilyMapToMemstore creates too many iterator objects<a name="line.8534"></a>
-<span class="sourceLineNo">8535</span>      assert cells instanceof RandomAccess;<a name="line.8535"></a>
-<span class="sourceLineNo">8536</span>      int listSize = cells.size();<a name="line.8536"></a>
-<span class="sourceLineNo">8537</span>      for (int i=0; i &lt; listSize; i++) {<a name="line.8537"></a>
-<span class="sourceLineNo">8538</span>        Cell cell = cells.get(i);<a name="line.8538"></a>
-<span class="sourceLineNo">8539</span>        mutationSize += cell.getSerializedSize();<a name="line.8539"></a>
-<span class="sourceLineNo">8540</span>      }<a name="line.8540"></a>
-<span class="sourceLineNo">8541</span>    }<a name="line.8541"></a>
-<span class="sourceLineNo">8542</span><a name="line.8542"></a>
-<span class="sourceLineNo">8543</span>    dataInMemoryWithoutWAL.add(mutationSize);<a name="line.8543"></a>
-<span class="sourceLineNo">8544</span>  }<a name="line.8544"></a>
-<span class="sourceLineNo">8545</span><a name="line.8545"></a>
-<span class="sourceLineNo">8546</span>  private void lock(final Lock lock) throws RegionTooBusyException, InterruptedIOException {<a name="line.8546"></a>
-<span class="sourceLineNo">8547</span>    lock(lock, 1);<a name="line.8547"></a>
-<span class="sourceLineNo">8548</span>  }<a name="line.8548"></a>
-<span class="sourceLineNo">8549</span><a name="line.8549"></a>
-<span class="sourceLineNo">8550</span>  /**<a name="line.8550"></a>
-<span class="sourceLineNo">8551</span>   * Try to acquire a lock.  Throw RegionTooBusyException<a name="line.8551"></a>
-<span class="sourceLineNo">8552</span>   * if failed to get the lock in time. Throw InterruptedIOException<a name="line.8552"></a>
-<span class="sourceLineNo">8553</span>   * if interrupted while waiting for the lock.<a name="line.8553"></a>
-<span class="sourceLineNo">8554</span>   */<a name="line.8554"></a>
-<span class="sourceLineNo">8555</span>  private void lock(final Lock lock, final int multiplier)<a name="line.8555"></a>
-<span class="sourceLineNo">8556</span>      throws RegionTooBusyException, InterruptedIOException {<a name="line.8556"></a>
-<span class="sourceLineNo">8557</span>    try {<a name="line.8557"></a>
-<span class="sourceLineNo">8558</span>      final long waitTime = Math.min(maxBusyWaitDuration,<a name="line.8558"></a>
-<span class="sourceLineNo">8559</span>          busyWaitDuration * Math.min(multiplier, maxBusyWaitMultiplier));<a name="line.8559"></a>
-<span class="sourceLineNo">8560</span>      if (!lock.tryLock(waitTime, TimeUnit.MILLISECONDS)) {<a name="line.8560"></a>
-<span class="sourceLineNo">8561</span>        // Don't print millis. Message is used as a key over in<a name="line.8561"></a>
-<span class="sourceLineNo">8562</span>        // RetriesExhaustedWithDetailsException processing.<a name="line.8562"></a>
-<span class="sourceLineNo">8563</span>        throw new RegionTooBusyException("Failed to obtain lock; regionName=" +<a name="line.8563"></a>
-<span class="sourceLineNo">8564</span>            (this.getRegionInfo() == null? "unknown":<a name="line.8564"></a>
-<span class="sourceLineNo">8565</span>                this.getRegionInfo().getRegionNameAsString()) +<a name="line.8565"></a>
-<span class="sourceLineNo">8566</span>            ", server=" + (this.getRegionServerServices() == null? "unknown":<a name="line.8566"></a>
-<span class="sourceLineNo">8567</span>                this.getRegionServerServices().getServerName()));<a name="line.8567"></a>
-<span class="sourceLineNo">8568</span>      }<a name="line.8568"></a>
-<span class="sourceLineNo">8569</span>    } catch (InterruptedException ie) {<a name="line.8569"></a>
-<span class="sourceLineNo">8570</span>      LOG.info("Interrupted while waiting for a lock");<a name="line.8570"></a>
-<span class="sourceLineNo">8571</span>      InterruptedIOException iie = new InterruptedIOException();<a name="line.8571"></a>
-<span class="sourceLineNo">8572</span>      iie.initCause(ie);<a name="line.8572"></a>
-<span class="sourceLineNo">8573</span>      throw iie;<a name="line.8573"></a>
-<span class="sourceLineNo">8574</span>    }<a name="line.8574"></a>
-<span class="sourceLineNo">8575</span>  }<a name="line.8575"></a>
-<span class="sourceLineNo">8576</span><a name="line.8576"></a>
-<span class="sourceLineNo">8577</span>  /**<a name="line.8577"></a>
-<span class="sourceLineNo">8578</span>   * Calls sync with the given transaction ID<a name="line.8578"></a>
-<span class="sourceLineNo">8579</span>   * @param txid should sync up to which transaction<a name="line.8579"></a>
-<span class="sourceLineNo">8580</span>   * @throws IOException If anything goes wrong with DFS<a name="line.8580"></a>
-<span class="sourceLineNo">8581</span>   */<a name="line.8581"></a>
-<span class="sourceLineNo">8582</span>  private void sync(long txid, Durability durability) throws IOException {<a name="line.8582"></a>
-<span class="sourceLineNo">8583</span>    if (this.getRegionInfo().isMetaRegion()) {<a name="line.8583"></a>
-<span class="sourceLineNo">8584</span>      this.wal.sync(txid);<a name="line.8584"></a>
-<span class="sourceLineNo">8585</span>    } else {<a name="line.8585"></a>
-<span class="sourceLineNo">8586</span>      switch(durability) {<a name="line.8586"></a>
-<span class="sourceLineNo">8587</span>      case USE_DEFAULT:<a name="line.8587"></a>
-<span class="sourceLineNo">8588</span>        // do what table defaults to<a name="line.8588"></a>
-<span class="sourceLineNo">8589</span>        if (shouldSyncWAL()) {<a name="line.8589"></a>
-<span class="sourceLineNo">8590</span>          this.wal.sync(txid);<a name="line.8590"></a>
-<span class="sourceLineNo">8591</span>        }<a name="line.8591"></a>
-<span class="sourceLineNo">8592</span>        break;<a name="line.8592"></a>
-<span class="sourceLineNo">8593</span>      case SKIP_WAL:<a name="line.8593"></a>
-<span class="sourceLineNo">8594</span>        // nothing do to<a name="line.8594"></a>
-<span class="sourceLineNo">8595</span>        break;<a name="line.8595"></a>
-<span class="sourceLineNo">8596</span>      case ASYNC_WAL:<a name="line.8596"></a>
-<span class="sourceLineNo">8597</span>        // nothing do to<a name="line.8597"></a>
-<span class="sourceLineNo">8598</span>        break;<a name="line.8598"></a>
-<span class="sourceLineNo">8599</span>      case SYNC_WAL:<a name="line.8599"></a>
-<span class="sourceLineNo">8600</span>          this.wal.sync(txid, false);<a name="line.8600"></a>
-<span class="sourceLineNo">8601</span>          break;<a name="line.8601"></a>
-<span class="sourceLineNo">8602</span>      case FSYNC_WAL:<a name="line.8602"></a>
-<span class="sourceLineNo">8603</span>          this.wal.sync(txid, true);<a name="line.8603"></a>
-<span class="sourceLineNo">8604</span>          break;<a name="line.8604"></a>
-<span class="sourceLineNo">8605</span>      default:<a name="line.8605"></a>
-<span class="sourceLineNo">8606</span>        throw new RuntimeException("Unknown durability " + durability);<a name="line.8606"></a>
-<span class="sourceLineNo">8607</span>      }<a name="line.8607"></a>
-<span class="sourceLineNo">8608</span>    }<a name="line.8608"></a>
-<span class="sourceLineNo">8609</span>  }<a name="line.8609"></a>
-<span class="sourceLineNo">8610</span><a name="line.8610"></a>
-<span class="sourceLineNo">8611</span>  /**<a name="line.8611"></a>
-<span class="sourceLineNo">8612</span>   * Check whether we should sync the wal from the table's durability settings<a name="line.8612"></a>
-<span class="sourceLineNo">8613</span>   */<a name="line.8613"></a>
-<span class="sourceLineNo">8614</span>  private boolean shouldSyncWAL() {<a name="line.8614"></a>
-<span class="sourceLineNo">8615</span>    return regionDurability.ordinal() &gt;  Durability.ASYNC_WAL.ordinal();<a name="line.8615"></a>
-<span class="sourceLineNo">8616</span>  }<a name="line.8616"></a>
-<span class="sourceLineNo">8617</span><a name="line.8617"></a>
-<span class="sourceLineNo">8618</span>  /**<a name="line.8618"></a>
-<span class="sourceLineNo">8619</span>   * A mocked list implementation - discards all updates.<a name="line.8619"></a>
-<span class="sourceLineNo">8620</span>   */<a name="line.8620"></a>
-<span class="sourceLineNo">8621</span>  private static final List&lt;Cell&gt; MOCKED_LIST = new AbstractList&lt;Cell&gt;() {<a name="line.8621"></a>
+<span class="sourceLineNo">8478</span>  public void closeRegionOperation() throws IOException {<a name="line.8478"></a>
+<span class="sourceLineNo">8479</span>    closeRegionOperation(Operation.ANY);<a name="line.8479"></a>
+<span class="sourceLineNo">8480</span>  }<a name="line.8480"></a>
+<span class="sourceLineNo">8481</span><a name="line.8481"></a>
+<span class="sourceLineNo">8482</span>  @Override<a name="line.8482"></a>
+<span class="sourceLineNo">8483</span>  public void closeRegionOperation(Operation operation) throws IOException {<a name="line.8483"></a>
+<span class="sourceLineNo">8484</span>    if (operation == Operation.SNAPSHOT) {<a name="line.8484"></a>
+<span class="sourceLineNo">8485</span>      stores.values().forEach(HStore::postSnapshotOperation);<a name="line.8485"></a>
+<span class="sourceLineNo">8486</span>    }<a name="line.8486"></a>
+<span class="sourceLineNo">8487</span>    lock.readLock().unlock();<a name="line.8487"></a>
+<span class="sourceLineNo">8488</span>    if (coprocessorHost != null) {<a name="line.8488"></a>
+<span class="sourceLineNo">8489</span>      coprocessorHost.postCloseRegionOperation(operation);<a name="line.8489"></a>
+<span class="sourceLineNo">8490</span>    }<a name="line.8490"></a>
+<span class="sourceLineNo">8491</span>  }<a name="line.8491"></a>
+<span class="sourceLineNo">8492</span><a name="line.8492"></a>
+<span class="sourceLineNo">8493</span>  /**<a name="line.8493"></a>
+<span class="sourceLineNo">8494</span>   * This method needs to be called before any public call that reads or<a name="line.8494"></a>
+<span class="sourceLineNo">8495</span>   * modifies stores in bulk. It has to be called just before a try.<a name="line.8495"></a>
+<span class="sourceLineNo">8496</span>   * #closeBulkRegionOperation needs to be called in the try's finally block<a name="line.8496"></a>
+<span class="sourceLineNo">8497</span>   * Acquires a writelock and checks if the region is closing or closed.<a name="line.8497"></a>
+<span class="sourceLineNo">8498</span>   * @throws NotServingRegionException when the region is closing or closed<a name="line.8498"></a>
+<span class="sourceLineNo">8499</span>   * @throws RegionTooBusyException if failed to get the lock in time<a name="line.8499"></a>
+<span class="sourceLineNo">8500</span>   * @throws InterruptedIOException if interrupted while waiting for a lock<a name="line.8500"></a>
+<span class="sourceLineNo">8501</span>   */<a name="line.8501"></a>
+<span class="sourceLineNo">8502</span>  private void startBulkRegionOperation(boolean writeLockNeeded)<a name="line.8502"></a>
+<span class="sourceLineNo">8503</span>      throws NotServingRegionException, RegionTooBusyException, InterruptedIOException {<a name="line.8503"></a>
+<span class="sourceLineNo">8504</span>    if (this.closing.get()) {<a name="line.8504"></a>
+<span class="sourceLineNo">8505</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closing");<a name="line.8505"></a>
+<span class="sourceLineNo">8506</span>    }<a name="line.8506"></a>
+<span class="sourceLineNo">8507</span>    if (writeLockNeeded) lock(lock.writeLock());<a name="line.8507"></a>
+<span class="sourceLineNo">8508</span>    else lock(lock.readLock());<a name="line.8508"></a>
+<span class="sourceLineNo">8509</span>    if (this.closed.get()) {<a name="line.8509"></a>
+<span class="sourceLineNo">8510</span>      if (writeLockNeeded) lock.writeLock().unlock();<a name="line.8510"></a>
+<span class="sourceLineNo">8511</span>      else lock.readLock().unlock();<a name="line.8511"></a>
+<span class="sourceLineNo">8512</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closed");<a name="line.8512"></a>
+<span class="sourceLineNo">8513</span>    }<a name="line.8513"></a>
+<span class="sourceLineNo">8514</span>  }<a name="line.8514"></a>
+<span class="sourceLineNo">8515</span><a name="line.8515"></a>
+<span class="sourceLineNo">8516</span>  /**<a name="line.8516"></a>
+<span class="sourceLineNo">8517</span>   * Closes the lock. This needs to be called in the finally block corresponding<a name="line.8517"></a>
+<span class="sourceLineNo">8518</span>   * to the try block of #startRegionOperation<a name="line.8518"></a>
+<span class="sourceLineNo">8519</span>   */<a name="line.8519"></a>
+<span class="sourceLineNo">8520</span>  private void closeBulkRegionOperation(){<a name="line.8520"></a>
+<span class="sourceLineNo">8521</span>    if (lock.writeLock().isHeldByCurrentThread()) lock.writeLock().unlock();<a name="line.8521"></a>
+<span class="sourceLineNo">8522</span>    else lock.readLock().unlock();<a name="line.8522"></a>
+<span class="sourceLineNo">8523</span>  }<a name="line.8523"></a>
+<span class="sourceLineNo">8524</span><a name="line.8524"></a>
+<span class="sourceLineNo">8525</span>  /**<a name="line.8525"></a>
+<span class="sourceLineNo">8526</span>   * Update LongAdders for number of puts without wal and the size of possible data loss.<a name="line.8526"></a>
+<span class="sourceLineNo">8527</span>   * These information are exposed by the region server metrics.<a name="line.8527"></a>
+<span class="sourceLineNo">8528</span>   */<a name="line.8528"></a>
+<span class="sourceLineNo">8529</span>  private void recordMutationWithoutWal(final Map&lt;byte [], List&lt;Cell&gt;&gt; familyMap) {<a name="line.8529"></a>
+<span class="sourceLineNo">8530</span>    numMutationsWithoutWAL.increment();<a name="line.8530"></a>
+<span class="sourceLineNo">8531</span>    if (numMutationsWithoutWAL.sum() &lt;= 1) {<a name="line.8531"></a>
+<span class="sourceLineNo">8532</span>      LOG.info("writing data to region " + this +<a name="line.8532"></a>
+<span class="sourceLineNo">8533</span>               " with WAL disabled. Data may be lost in the event of a crash.");<a name="line.8533"></a>
+<span class="sourceLineNo">8534</span>    }<a name="line.8534"></a>
+<span class="sourceLineNo">8535</span><a name="line.8535"></a>
+<span class="sourceLineNo">8536</span>    long mutationSize = 0;<a name="line.8536"></a>
+<span class="sourceLineNo">8537</span>    for (List&lt;Cell&gt; cells: familyMap.values()) {<a name="line.8537"></a>
+<span class="sourceLineNo">8538</span>      // Optimization: 'foreach' loop is not used. See:<a name="line.8538"></a>
+<span class="sourceLineNo">8539</span>      // HBASE-12023 HRegion.applyFamilyMapToMemstore creates too many iterator objects<a name="line.8539"></a>
+<span class="sourceLineNo">8540</span>      assert cells instanceof RandomAccess;<a name="line.8540"></a>
+<span class="sourceLineNo">8541</span>      int listSize = cells.size();<a name="line.8541"></a>
+<span class="sourceLineNo">8542</span>      for (int i=0; i &lt; listSize; i++) {<a name="line.8542"></a>
+<span class="sourceLineNo">8543</span>        Cell cell = cells.get(i);<a name="line.8543"></a>
+<span class="sourceLineNo">8544</span>        mutationSize += cell.getSerializedSize();<a name="line.8544"></a>
+<span class="sourceLineNo">8545</span>      }<a name="line.8545"></a>
+<span class="sourceLineNo">8546</span>    }<a name="line.8546"></a>
+<span class="sourceLineNo">8547</span><a name="line.8547"></a>
+<span class="sourceLineNo">8548</span>    dataInMemoryWithoutWAL.add(mutationSize);<a name="line.8548"></a>
+<span class="sourceLineNo">8549</span>  }<a name="line.8549"></a>
+<span class="sourceLineNo">8550</span><a name="line.8550"></a>
+<span class="sourceLineNo">8551</span>  private void lock(final Lock lock) throws RegionTooBusyException, InterruptedIOException {<a name="line.8551"></a>
+<span class="sourceLineNo">8552</span>    lock(lock, 1);<a name="line.8552"></a>
+<span class="sourceLineNo">8553</span>  }<a name="line.8553"></a>
+<span class="sourceLineNo">8554</span><a name="line.8554"></a>
+<span class="sourceLineNo">8555</span>  /**<a name="line.8555"></a>
+<span class="sourceLineNo">8556</span>   * Try to acquire a lock.  Throw RegionTooBusyException<a name="line.8556"></a>
+<span class="sourceLineNo">8557</span>   * if failed to get the lock in time. Throw InterruptedIOException<a name="line.8557"></a>
+<span class="sourceLineNo">8558</span>   * if interrupted while waiting for the lock.<a name="line.8558"></a>
+<span class="sourceLineNo">8559</span>   */<a name="line.8559"></a>
+<span class="sourceLineNo">8560</span>  private void lock(final Lock lock, final int multiplier)<a name="line.8560"></a>
+<span class="sourceLineNo">8561</span>      throws RegionTooBusyException, InterruptedIOException {<a name="line.8561"></a>
+<span class="sourceLineNo">8562</span>    try {<a name="line.8562"></a>
+<span class="sourceLineNo">8563</span>      final long waitTime = Math.min(maxBusyWaitDuration,<a name="line.8563"></a>
+<span class="sourceLineNo">8564</span>          busyWaitDuration * Math.min(multiplier, maxBusyWaitMultiplier));<a name="line.8564"></a>
+<span class="sourceLineNo">8565</span>      if (!lock.tryLock(waitTime, TimeUnit.MILLISECONDS)) {<a name="line.8565"></a>
+<span class="sourceLineNo">8566</span>        // Don't print millis. Message is used as a key over in<a name="line.8566"></a>
+<span class="sourceLineNo">8567</span>        // RetriesExhaustedWithDetailsException processing.<a name="line.8567"></a>
+<span class="sourceLineNo">8568</span>        throw new RegionTooBusyException("Failed to obtain lock; regionName=" +<a name="line.8568"></a>
+<span class="sourceLineNo">8569</span>            (this.getRegionInfo() == null? "unknown":<a name="line.8569"></a>
+<span class="sourceLineNo">8570</span>                this.getRegionInfo().getRegionNameAsString()) +<a name="line.8570"></a>
+<span class="sourceLineNo">8571</span>            ", server=" + (this.getRegionServerServices() == null? "unknown":<a name="line.8571"></a>
+<span class="sourceLineNo">8572</span>                this.getRegionServerServices().getServerName()));<a name="line.8572"></a>
+<span class="sourceLineNo">8573</span>      }<a name="line.8573"></a>
+<span class="sourceLineNo">8574</span>    } catch (InterruptedException ie) {<a name="line.8574"></a>
+<span class="sourceLineNo">8575</span>      LOG.info("Interrupted while waiting for a lock");<a name="line.8575"></a>
+<span class="sourceLineNo">8576</span>      InterruptedIOException iie = new InterruptedIOException();<a name="line.8576"></a>
+<span class="sourceLineNo">8577</span>      iie.initCause(ie);<a name="line.8577"></a>
+<span class="sourceLineNo">8578</span>      throw iie;<a name="line.8578"></a>
+<span class="sourceLineNo">8579</span>    }<a name="line.8579"></a>
+<span class="sourceLineNo">8580</span>  }<a name="line.8580"></a>
+<span class="sourceLineNo">8581</span><a name="line.8581"></a>
+<span class="sourceLineNo">8582</span>  /**<a name="line.8582"></a>
+<span class="sourceLineNo">8583</span>   * Calls sync with the given transaction ID<a name="line.8583"></a>
+<span class="sourceLineNo">8584</span>   * @param txid should sync up to which transaction<a name="line.8584"></a>
+<span class="sourceLineNo">8585</span>   * @throws IOException If anything goes wrong with DFS<a name="line.8585"></a>
+<span class="sourceLineNo">8586</span>   */<a name="line.8586"></a>
+<span class="sourceLineNo">8587</span>  private void sync(long txid, Durability durability) throws IOException {<a name="line.8587"></a>
+<span class="sourceLineNo">8588</span>    if (this.getRegionInfo().isMetaRegion()) {<a name="line.8588"></a>
+<span class="sourceLineNo">8589</span>      this.wal.sync(txid);<a name="line.8589"></a>
+<span class="sourceLineNo">8590</span>    } else {<a name="line.8590"></a>
+<span class="sourceLineNo">8591</span>      switch(durability) {<a name="line.8591"></a>
+<span class="sourceLineNo">8592</span>      case USE_DEFAULT:<a name="line.8592"></a>
+<span class="sourceLineNo">8593</span>        // do what table defaults to<a name="line.8593"></a>
+<span class="sourceLineNo">8594</span>        if (shouldSyncWAL()) {<a name="line.8594"></a>
+<span class="sourceLineNo">8595</span>          this.wal.sync(txid);<a name="line.8595"></a>
+<span class="sourceLineNo">8596</span>        }<a name="line.8596"></a>
+<span class="sourceLineNo">8597</span>        break;<a name="line.8597"></a>
+<span class="sourceLineNo">8598</span>      case SKIP_WAL:<a name="line.8598"></a>
+<span class="sourceLineNo">8599</span>        // nothing do to<a name="line.8599"></a>
+<span class="sourceLineNo">8600</span>        break;<a name="line.8600"></a>
+<span class="sourceLineNo">8601</span>      case ASYNC_WAL:<a name="line.8601"></a>
+<span class="sourceLineNo">8602</span>        // nothing do to<a name="line.8602"></a>
+<span class="sourceLineNo">8603</span>        break;<a name="line.8603"></a>
+<span class="sourceLineNo">8604</span>      case SYNC_WAL:<a name="line.8604"></a>
+<span class="sourceLineNo">8605</span>          this.wal.sync(txid, false);<a name="line.8605"></a>
+<span class="sourceLineNo">8606</span>          break;<a name="line.8606"></a>
+<span class="sourceLineNo">8607</span>      case FSYNC_WAL:<a name="line.8607"></a>
+<span class="sourceLineNo">8608</span>          this.wal.sync(txid, true);<a name="line.8608"></a>
+<span class="sourceLineNo">8609</span>          break;<a name="line.8609"></a>
+<span class="sourceLineNo">8610</span>      default:<a name="line.8610"></a>
+<span class="sourceLineNo">8611</span>        throw new RuntimeException("Unknown durability " + durability);<a name="line.8611"></a>
+<span class="sourceLineNo">8612</span>      }<a name="line.8612"></a>
+<span class="sourceLineNo">8613</span>    }<a name="line.8613"></a>
+<span class="sourceLineNo">8614</span>  }<a name="line.8614"></a>
+<span class="sourceLineNo">8615</span><a name="line.8615"></a>
+<span class="sourceLineNo">8616</span>  /**<a name="line.8616"></a>
+<span class="sourceLineNo">8617</span>   * Check whether we should sync the wal from the table's durability settings<a name="line.8617"></a>
+<span class="sourceLineNo">8618</span>   */<a name="line.8618"></a>
+<span class="sourceLineNo">8619</span>  private boolean shouldSyncWAL() {<a name="line.8619"></a>
+<span class="sourceLineNo">8620</span>    return regionDurability.ordinal() &gt;  Durability.ASYNC_WAL.ordinal();<a name="line.8620"></a>
+<span class="sourceLineNo">8621</span>  }<a name="line.8621"></a>
 <span class="sourceLineNo">8622</span><a name="line.8622"></a>
-<span class="sourceLineNo">8623</span>    @Override<a name="line.8623"></a>
-<span class="sourceLineNo">8624</span>    public void add(int index, Cell element) {<a name="line.8624"></a>
-<span class="sourceLineNo">8625</span>      // do nothing<a name="line.8625"></a>
-<span class="sourceLineNo">8626</span>    }<a name="line.8626"></a>
+<span class="sourceLineNo">8623</span>  /**<a name="line.8623"></a>
+<span class="sourceLineNo">8624</span>   * A mocked list implementation - discards all updates.<a name="line.8624"></a>
+<span class="sourceLineNo">8625</span>   */<a name="line.8625"></a>
+<span class="sourceLineNo">8626</span>  private static final List&lt;Cell&gt; MOCKED_LIST = new AbstractList&lt;Cell&gt;() {<a name="line.8626"></a>
 <span class="sourceLineNo">8627</span><a name="line.8627"></a>
 <span class="sourceLineNo">8628</span>    @Override<a name="line.8628"></a>
-<span class="sourceLineNo">8629</span>    public boolean addAll(int index, Collection&lt;? extends Cell&gt; c) {<a name="line.8629"></a>
-<span class="sourceLineNo">8630</span>      return false; // this list is never changed as a result of an update<a name="line.8630"></a>
+<span class="sourceLineNo">8629</span>    public void add(int index, Cell element) {<a name="line.8629"></a>
+<span class="sourceLineNo">8630</span>      // do nothing<a name="line.8630"></a>
 <span class="sourceLineNo">8631</span>    }<a name="line.8631"></a>
 <span class="sourceLineNo">8632</span><a name="line.8632"></a>
 <span class="sourceLineNo">8633</span>    @Override<a name="line.8633"></a>
-<span class="sourceLineNo">8634</span>    public KeyValue get(int index) {<a name="line.8634"></a>
-<span class="sourceLineNo">8635</span>      throw new UnsupportedOperationException();<a name="line.8635"></a>
+<span class="sourceLineNo">8634</span>    public boolean addAll(int index, Collection&lt;? extends Cell&gt; c) {<a name="line.8634"></a>
+<span class="sourceLineNo">8635</span>      return false; // this list is never changed as a result of an update<a name="line.8635"></a>
 <span class="sourceLineNo">8636</span>    }<a name="line.8636"></a>
 <span class="sourceLineNo">8637</span><a name="line.8637"></a>
 <span class="sourceLineNo">8638</span>    @Override<a name="line.8638"></a>
-<span class="sourceLineNo">8639</span>    public int size() {<a name="line.8639"></a>
-<span class="sourceLineNo">8640</span>      return 0;<a name="line.8640"></a>
+<span class="sourceLineNo">8639</span>    public KeyValue get(int index) {<a name="line.8639"></a>
+<span class="sourceLineNo">8640</span>      throw new UnsupportedOperationException();<a name="line.8640"></a>
 <span class="sourceLineNo">8641</span>    }<a name="line.8641"></a>
-<span class="sourceLineNo">8642</span>  };<a name="line.8642"></a>
-<span class="sourceLineNo">8643</span><a name="line.8643"></a>
-<span class="sourceLineNo">8644</span>  /** @return the latest sequence number that was read from storage when this region was opened */<a name="line.8644"></a>
-<span class="sourceLineNo">8645</span>  public long getOpenSeqNum() {<a name="line.8645"></a>
-<span class="sourceLineNo">8646</span>    return this.openSeqNum;<a name="line.8646"></a>
-<span class="sourceLineNo">8647</span>  }<a name="line.8647"></a>
+<span class="sourceLineNo">8642</span><a name="line.8642"></a>
+<span class="sourceLineNo">8643</span>    @Override<a name="line.8643"></a>
+<span class="sourceLineNo">8644</span>    public int size() {<a name="line.8644"></a>
+<span class="sourceLineNo">8645</span>      return 0;<a name="line.8645"></a>
+<span class="sourceLineNo">8646</span>    }<a name="line.8646"></a>
+<span class="sourceLineNo">8647</span>  };<a name="line.8647"></a>
 <span class="sourceLineNo">8648</span><a name="line.8648"></a>
-<span class="sourceLineNo">8649</span>  @Override<a name="line.8649"></a>
-<span class="sourceLineNo">8650</span>  public Map&lt;byte[], Long&gt; getMaxStoreSeqId() {<a name="line.8650"></a>
-<span class="sourceLineNo">8651</span>    return this.maxSeqIdInStores;<a name="line.8651"></a>
+<span class="sourceLineNo">8649</span>  /** @return the latest sequence number that was read from storage when this region was opened */<a name="line.8649"></a>
+<span class="sourceLineNo">8650</span>  public long getOpenSeqNum() {<a name="line.8650"></a>
+<span class="sourceLineNo">8651</span>    return this.openSeqNum;<a name="line.8651"></a>
 <span class="sourceLineNo">8652</span>  }<a name="line.8652"></a>
 <span class="sourceLineNo">8653</span><a name="line.8653"></a>
-<span class="sourceLineNo">8654</span>  public long getOldestSeqIdOfStore(byte[] familyName) {<a name="line.8654"></a>
-<span class="sourceLineNo">8655</span>    return wal.getEarliestMemStoreSeqNum(getRegionInfo().getEncodedNameAsBytes(), familyName);<a name="line.8655"></a>
-<span class="sourceLineNo">8656</span>  }<a name="line.8656"></a>
-<span class="sourceLineNo">8657</span><a name="line.8657"></a>
-<span class="sourceLineNo">8658</span>  @Override<a name="line.8658"></a>
-<span class="sourceLineNo">8659</span>  public CompactionState getCompactionState() {<a name="line.8659"></a>
-<span class="sourceLineNo">8660</span>    boolean hasMajor = majorInProgress.get() &gt; 0, hasMinor = minorInProgress.get() &gt; 0;<a name="line.8660"></a>
-<span class="sourceLineNo">8661</span>    return (hasMajor ? (hasMinor ? CompactionState.MAJOR_AND_MINOR : CompactionState.MAJOR)<a name="line.8661"></a>
-<span class="sourceLineNo">8662</span>        : (hasMinor ? CompactionState.MINOR : CompactionState.NONE));<a name="line.8662"></a>
-<span class="sourceLineNo">8663</span>  }<a name="line.8663"></a>
-<span class="sourceLineNo">8664</span><a name="line.8664"></a>
-<span class="sourceLineNo">8665</span>  public void reportCompactionRequestStart(boolean isMajor){<a name="line.8665"></a>
-<span class="sourceLineNo">8666</span>    (isMajor ? majorInProgress : minorInProgress).incrementAndGet();<a name="line.8666"></a>
-<span class="sourceLineNo">8667</span>  }<a name="line.8667"></a>
-<span class="sourceLineNo">8668</span><a name="line.8668"></a>
-<span class="sourceLineNo">8669</span>  public void reportCompactionRequestEnd(boolean isMajor, int numFiles, long filesSizeCompacted) {<a name="line.8669"></a>
-<span class="sourceLineNo">8670</span>    int newValue = (isMajor ? majorInProgress : minorInProgress).decrementAndGet();<a name="line.8670"></a>
-<span class="sourceLineNo">8671</span><a name="line.8671"></a>
-<span class="sourceLineNo">8672</span>    // metrics<a name="line.8672"></a>
-<span class="sourceLineNo">8673</span>    compactionsFinished.increment();<a name="line.8673"></a>
-<span class="sourceLineNo">8674</span>    compactionNumFilesCompacted.add(numFiles);<a name="line.8674"></a>
-<span class="sourceLineNo">8675</span>    compactionNumBytesCompacted.add(filesSizeCompacted);<a name="line.8675"></a>
+<span class="sourceLineNo">8654</span>  @Override<a name="line.8654"></a>
+<span class="sourceLineNo">8655</span>  public Map&lt;byte[], Long&gt; getMaxStoreSeqId() {<a name="line.8655"></a>
+<span class="sourceLineNo">8656</span>    return this.maxSeqIdInStores;<a name="line.8656"></a>
+<span class="sourceLineNo">8657</span>  }<a name="line.8657"></a>
+<span class="sourceLineNo">8658</span><a name="line.8658"></a>
+<span class="sourceLineNo">8659</span>  public long getOldestSeqIdOfStore(byte[] familyName) {<a name="line.8659"></a>
+<span class="sourceLineNo">8660</span>    return wal.getEarliestMemStoreSeqNum(getRegionInfo().getEncodedNameAsBytes(), familyName);<a name="line.8660"></a>
+<span class="sourceLineNo">8661</span>  }<a name="line.8661"></a>
+<span class="sourceLineNo">8662</span><a name="line.8662"></a>
+<span class="sourceLineNo">8663</span>  @Override<a name="line.8663"></a>
+<span class="sourceLineNo">8664</span>  public CompactionState getCompactionState() {<a name="line.8664"></a>
+<span class="sourceLineNo">8665</span>    boolean hasMajor = majorInProgress.get() &gt; 0, hasMinor = minorInProgress.get() &gt; 0;<a name="line.8665"></a>
+<span class="sourceLineNo">8666</span>    return (hasMajor ? (hasMinor ? CompactionState.MAJOR_AND_MINOR : CompactionState.MAJOR)<a name="line.8666"></a>
+<span class="sourceLineNo">8667</span>        : (hasMinor ? CompactionState.MINOR : CompactionState.NONE));<a name="line.8667"></a>
+<span class="sourceLineNo">8668</span>  }<a name="line.8668"></a>
+<span class="sourceLineNo">8669</span><a name="line.8669"></a>
+<span class="sourceLineNo">8670</span>  public void reportCompactionRequestStart(boolean isMajor){<a name="line.8670"></a>
+<span class="sourceLineNo">8671</span>    (isMajor ? majorInProgress : minorInProgress).incrementAndGet();<a name="line.8671"></a>
+<span class="sourceLineNo">8672</span>  }<a name="line.8672"></a>
+<span class="sourceLineNo">8673</span><a name="line.8673"></a>
+<span class="sourceLineNo">8674</span>  public void reportCompactionRequestEnd(boolean isMajor, int numFiles, long filesSizeCompacted) {<a name="line.8674"></a>
+<span class="sourceLineNo">8675</span>    int newValue = (isMajor ? majorInProgress : minorInProgress).decrementAndGet();<a name="line.8675"></a>
 <span class="sourceLineNo">8676</span><a name="line.8676"></a>
-<span class="sourceLineNo">8677</span>    assert newValue &gt;= 0;<a name="line.8677"></a>
-<span class="sourceLineNo">8678</span>  }<a name="line.8678"></a>
-<span class="sourceLineNo">8679</span><a name="line.8679"></a>
-<span class="sourceLineNo">8680</span>  public void reportCompactionRequestFailure() {<a name="line.8680"></a>
-<span class="sourceLineNo">8681</span>    compactionsFailed.increment();<a name="line.8681"></a>
-<span class="sourceLineNo">8682</span>  }<a name="line.8682"></a>
-<span class="sourceLineNo">8683</span><a name="line.8683"></a>
-<span class="sourceLineNo">8684</span>  public void incrementCompactionsQueuedCount() {<a name="line.8684"></a>
-<span class="sourceLineNo">8685</span>    compactionsQueued.increment();<a name="line.8685"></a>
-<span class="sourceLineNo">8686</span>  }<a name="line.8686"></a>
-<span class="sourceLineNo">8687</span><a name="line.8687"></a>
-<span class="sourceLineNo">8688</span>  public void decrementCompactionsQueuedCount() {<a name="line.8688"></a>
-<span class="sourceLineNo">8689</span>    compactionsQueued.decrement();<a name="line.8689"></a>
-<span class="sourceLineNo">8690</span>  }<a name="line.8690"></a>
-<span class="sourceLineNo">8691</span><a name="line.8691"></a>
-<span class="sourceLineNo">8692</span>  public void incrementFlushesQueuedCount() {<a name="line.8692"></a>
-<span class="sourceLineNo">8693</span>    flushesQueued.increment();<a name="line.8693"></a>
-<span class="sourceLineNo">8694</span>  }<a name="line.8694"></a>
-<span class="sourceLineNo">8695</span><a name="line.8695"></a>
-<span class="sourceLineNo">8696</span>  @VisibleForTesting<a name="line.8696"></a>
-<span class="sourceLineNo">8697</span>  public long getReadPoint() {<a name="line.8697"></a>
-<span class="sourceLineNo">8698</span>    return getReadPoint(IsolationLevel.READ_COMMITTED);<a name="line.8698"></a>
+<span class="sourceLineNo">8677</span>    // metrics<a name="line.8677"></a>
+<span class="sourceLineNo">8678</span>    compactionsFinished.increment();<a name="line.8678"></a>
+<span class="sourceLineNo">8679</span>    compactionNumFilesCompacted.add(numFiles);<a name="line.8679"></a>
+<span class="sourceLineNo">8680</span>    compactionNumBytesCompacted.add(filesSizeCompacted);<a name="line.8680"></a>
+<span class="sourceLineNo">8681</span><a name="line.8681"></a>
+<span class="sourceLineNo">8682</span>    assert newValue &gt;= 0;<a name="line.8682"></a>
+<span class="sourceLineNo">8683</span>  }<a name="line.8683"></a>
+<span class="sourceLineNo">8684</span><a name="line.8684"></a>
+<span class="sourceLineNo">8685</span>  public void reportCompactionRequestFailure() {<a name="line.8685"></a>
+<span class="sourceLineNo">8686</span>    compactionsFailed.increment();<a name="line.8686"></a>
+<span class="sourceLineNo">8687</span>  }<a name="line.8687"></a>
+<span class="sourceLineNo">8688</span><a name="line.8688"></a>
+<span class="sourceLineNo">8689</span>  public void incrementCompactionsQueuedCount() {<a name="line.8689"></a>
+<span class="sourceLineNo">8690</span>    compactionsQueued.increment();<a name="line.8690"></a>
+<span class="sourceLineNo">8691</span>  }<a name="line.8691"></a>
+<span class="sourceLineNo">8692</span><a name="line.8692"></a>
+<span class="sourceLineNo">8693</span>  public void decrementCompactionsQueuedCount() {<a name="line.8693"></a>
+<span class="sourceLineNo">8694</span>    compactionsQueued.decrement();<a name="line.8694"></a>
+<span class="sourceLineNo">8695</span>  }<a name="line.8695"></a>
+<span class="sourceLineNo">8696</span><a name="line.8696"></a>
+<span class="sourceLineNo">8697</span>  public void incrementFlushesQueuedCount() {<a name="line.8697"></a>
+<span class="sourceLineNo">8698</span>    flushesQueued.increment();<a name="line.8698"></a>
 <span class="sourceLineNo">8699</span>  }<a name="line.8699"></a>
 <span class="sourceLineNo">8700</span><a name="line.8700"></a>
-<span class="sourceLineNo">8701</span>  /**<a name="line.8701"></a>
-<span class="sourceLineNo">8702</span>   * {@inheritDoc}<a name="line.8702"></a>
-<span class="sourceLineNo">8703</span>   */<a name="line.8703"></a>
-<span class="sourceLineNo">8704</span>  @Override<a name="line.8704"></a>
-<span class="sourceLineNo">8705</span>  public void onConfigurationChange(Configuration conf) {<a name="line.8705"></a>
-<span class="sourceLineNo">8706</span>    this.storeHotnessProtector.update(conf);<a name="line.8706"></a>
-<span class="sourceLineNo">8707</span>  }<a name="line.8707"></a>
-<span class="sourceLineNo">8708</span><a name="line.8708"></a>
-<span class="sourceLineNo">8709</span>  /**<a name="line.8709"></a>
-<span class="sourceLineNo">8710</span>   * {@inheritDoc}<a name="line.8710"></a>
-<span class="sourceLineNo">8711</span>   */<a name="line.8711"></a>
-<span class="sourceLineNo">8712</span>  @Override<a name="line.8712"></a>
-<span class="sourceLineNo">8713</span>  public void registerChildren(ConfigurationManager manager) {<a name="line.8713"></a>
-<span class="sourceLineNo">8714</span>    configurationManager = Optional.of(manager);<a name="line.8714"></a>
-<span class="sourceLineNo">8715</span>    stores.values().forEach(manager::registerObserver);<a name="line.8715"></a>
-<span class="sourceLineNo">8716</span>  }<a name="line.8716"></a>
-<span class="sourceLineNo">8717</span><a name="line.8717"></a>
-<span class="sourceLineNo">8718</span>  /**<a name="line.8718"></a>
-<span class="sourceLineNo">8719</span>   * {@inheritDoc}<a name="line.8719"></a>
-<span class="sourceLineNo">8720</span>   */<a name="line.8720"></a>
-<span class="sourceLineNo">8721</span>  @Override<a name="line.8721"></a>
-<span class="sourceLineNo">8722</span>  public void deregisterChildren(ConfigurationManager manager) {<a name="line.8722"></a>
-<span class="sourceLineNo">8723</span>    stores.values().forEach(configurationManager.get()::deregisterObserver);<a name="line.8723"></a>
-<span class="sourceLineNo">8724</span>  }<a name="line.8724"></a>
-<span class="sourceLineNo">8725</span><a name="line.8725"></a>
+<span class="sourceLineNo">8701</span>  @VisibleForTesting<a name="line.8701"></a>
+<span class="sourceLineNo">8702</span>  public long getReadPoint() {<a name="line.8702"></a>
+<span class="sourceLineNo">8703</span>    return getReadPoint(IsolationLevel.READ_COMMITTED);<a name="line.8703"></a>
+<span class="sourceLineNo">8704</span>  }<a name="line.8704"></a>
+<span class="sourceLineNo">8705</span><a name="line.8705"></a>
+<span class="sourceLineNo">8706</span>  /**<a name="line.8706"></a>
+<span class="sourceLineNo">8707</span>   * {@inheritDoc}<a name="line.8707"></a>
+<span class="sourceLineNo">8708</span>   */<a name="line.8708"></a>
+<span class="sourceLineNo">8709</span>  @Override<a name="line.8709"></a>
+<span class="sourceLineNo">8710</span>  public void onConfigurationChange(Configuration conf) {<a name="line.8710"></a>
+<span class="sourceLineNo">8711</span>    this.storeHotnessProtector.update(conf);<a name="line.8711"></a>
+<span class="sourceLineNo">8712</span>  }<a name="line.8712"></a>
+<span class="sourceLineNo">8713</span><a name="line.8713"></a>
+<span class="sourceLineNo">8714</span>  /**<a name="line.8714"></a>
+<span class="sourceLineNo">8715</span>   * {@inheritDoc}<a name="line.8715"></a>
+<span class="sourceLineNo">8716</span>   */<a name="line.8716"></a>
+<span class="sourceLineNo">8717</span>  @Override<a name="line.8717"></a>
+<span class="sourceLineNo">8718</span>  public void registerChildren(ConfigurationManager manager) {<a name="line.8718"></a>
+<span class="sourceLineNo">8719</span>    configurationManager = Optional.of(manager);<a name="line.8719"></a>
+<span class="sourceLineNo">8720</span>    stores.values().forEach(manager::registerObserver);<a name="line.8720"></a>
+<span class="sourceLineNo">8721</span>  }<a name="line.8721"></a>
+<span class="sourceLineNo">8722</span><a name="line.8722"></a>
+<span class="sourceLineNo">8723</span>  /**<a name="line.8723"></a>
+<span class="sourceLineNo">8724</span>   * {@inheritDoc}<a name="line.8724"></a>
+<span class="sourceLineNo">8725</span>   */<a name="line.8725"></a>
 <span class="sourceLineNo">8726</span>  @Override<a name="line.8726"></a>
-<span class="sourceLineNo">8727</span>  public CellComparator getCellComparator() {<a name="line.8727"></a>
-<span class="sourceLineNo">8728</span>    return this.getRegionInfo().isMetaRegion() ? CellComparatorImpl.META_COMPARATOR<a name="line.8728"></a>
-<span class="sourceLineNo">8729</span>        : CellComparatorImpl.COMPARATOR;<a name="line.8729"></a>
-<span class="sourceLineNo">8730</span>  }<a name="line.8730"></a>
-<span class="sourceLineNo">8731</span><a name="line.8731"></a>
-<span class="sourceLineNo">8732</span>  public long getMemStoreFlushSize() {<a name="line.8732"></a>
-<span class="sourceLineNo">8733</span>    return this.memstoreFlushSize;<a name="line.8733"></a>
-<span class="sourceLineNo">8734</span>  }<a name="line.8734"></a>
-<span class="sourceLineNo">8735</span><a name="line.8735"></a>
+<span class="sourceLineNo">8727</span>  public void deregisterChildren(ConfigurationManager manager) {<a name="line.8727"></a>
+<span class="sourceLineNo">8728</span>    stores.values().forEach(configurationManager.get()::deregisterObserver);<a name="line.8728"></a>
+<span class="sourceLineNo">8729</span>  }<a name="line.8729"></a>
+<span class="sourceLineNo">8730</span><a name="line.8730"></a>
+<span class="sourceLineNo">8731</span>  @Override<a name="line.8731"></a>
+<span class="sourceLineNo">8732</span>  public CellComparator getCellComparator() {<a name="line.8732"></a>
+<span class="sourceLineNo">8733</span>    return this.getRegionInfo().isMetaRegion() ? CellComparatorImpl.META_COMPARATOR<a name="line.8733"></a>
+<span class="sourceLineNo">8734</span>        : CellComparatorImpl.COMPARATOR;<a name="line.8734"></a>
+<span class="sourceLineNo">8735</span>  }<a name="line.8735"></a>
 <span class="sourceLineNo">8736</span><a name="line.8736"></a>
-<span class="sourceLineNo">8737</span>  //// method for debugging tests<a name="line.8737"></a>
-<span class="sourceLineNo">8738</span>  void throwException(String title, String regionName) {<a name="line.8738"></a>
-<span class="sourceLineNo">8739</span>    StringBuilder buf = new StringBuilder();<a name="line.8739"></a>
-<span class="sourceLineNo">8740</span>    buf.append(title + ", ");<a name="line.8740"></a>
-<span class="sourceLineNo">8741</span>    buf.append(getRegionInfo().toString());<a name="line.8741"></a>
-<span class="sourceLineNo">8742</span>    buf.append(getRegionInfo().isMetaRegion() ? " meta region " : " ");<a name="line.8742"></a>
-<span class="sourceLineNo">8743</span>    buf.append("stores: ");<a name="line.8743"></a>
-<span class="sourceLineNo">8744</span>    for (HStore s : stores.values()) {<a name="line.8744"></a>
-<span class="sourceLineNo">8745</span>      buf.append(s.getColumnFamilyDescriptor().getNameAsString());<a name="line.8745"></a>
-<span class="sourceLineNo">8746</span>      buf.append(" size: ");<a name="line.8746"></a>
-<span class="sourceLineNo">8747</span>      buf.append(s.getMemStoreSize().getDataSize());<a name="line.8747"></a>
-<span class="sourceLineNo">8748</span>      buf.append(" ");<a name="line.8748"></a>
-<span class="sourceLineNo">8749</span>    }<a name="line.8749"></a>
-<span class="sourceLineNo">8750</span>    buf.append("end-of-stores");<a name="line.8750"></a>
-<span class="sourceLineNo">8751</span>    buf.append(", memstore size ");<a name="line.8751"></a>
-<span class="sourceLineNo">8752</span>    buf.append(getMemStoreDataSize());<a name="line.8752"></a>
-<span class="sourceLineNo">8753</span>    if (getRegionInfo().getRegionNameAsString().startsWith(regionName)) {<a name="line.8753"></a>
-<span class="sourceLineNo">8754</span>      throw new RuntimeException(buf.toString());<a name="line.8754"></a>
-<span class="sourceLineNo">8755</span>    }<a name="line.8755"></a>
-<span class="sourceLineNo">8756</span>  }<a name="line.8756"></a>
-<span class="sourceLineNo">8757</span><a name="line.8757"></a>
-<span class="sourceLineNo">8758</span>  @Override<a name="line.8758"></a>
-<span class="sourceLineNo">8759</span>  public void requestCompaction(String why, int priority, boolean major,<a name="line.8759"></a>
-<span class="sourceLineNo">8760</span>      CompactionLifeCycleTracker tracker) throws IOException {<a name="line.8760"></a>
-<span class="sourceLineNo">8761</span>    if (major) {<a name="line.8761"></a>
-<span class="sourceLineNo">8762</span>      stores.values().forEach(HStore::triggerMajorCompaction);<a name="line.8762"></a>
-<span class="sourceLineNo">8763</span>    }<a name="line.8763"></a>
-<span class="sourceLineNo">8764</span>    rsServices.getCompactionRequestor().requestCompaction(this, why, priority, tracker,<a name="line.8764"></a>
-<span class="sourceLineNo">8765</span>        RpcServer.getRequestUser().orElse(null));<a name="line.8765"></a>
-<span class="sourceLineNo">8766</span>  }<a name="line.8766"></a>
-<span class="sourceLineNo">8767</span><a name="line.8767"></a>
-<span class="sourceLineNo">8768</span>  @Override<a name="line.8768"></a>
-<span class="sourceLineNo">8769</span>  public void requestCompaction(byte[] family, String why, int priority, boolean major,<a name="line.8769"></a>
-<span class="sourceLineNo">8770</span>      CompactionLifeCycleTracker tracker) throws IOException {<a name="line.8770"></a>
-<span class="sourceLineNo">8771</span>    HStore store = stores.get(family);<a name="line.8771"></a>
-<span class="sourceLineNo">8772</span>    if (store == null) {<a name="line.8772"></a>
-<span class="sourceLineNo">8773</span>      throw new NoSuchColumnFamilyException("column family " + Bytes.toString(family) +<a name="line.8773"></a>
-<span class="sourceLineNo">8774</span>          " does not exist in region " + getRegionInfo().getRegionNameAsString());<a name="line.8774"></a>
-<span class="sourceLineNo">8775</span>    }<a name="line.8775"></a>
-<span class="sourceLineNo">8776</span>    if (major) {<a name="line.8776"></a>
-<span class="sourceLineNo">8777</span>      store.triggerMajorCompaction();<a name="line.8777"></a>
-<span class="sourceLineNo">8778</span>    }<a name="line.8778"></a>
-<span class="sourceLineNo">8779</span>    rsServices.getCompactionRequestor().requestCompaction(this, store, why, priority, tracker,<a name="line.8779"></a>
-<span class="sourceLineNo">8780</span>        RpcServer.getRequestUser().orElse(null));<a name="line.8780"></a>
-<span class="sourceLineNo">8781</span>  }<a name="line.8781"></a>
-<span class="sourceLineNo">8782</span><a name="line.8782"></a>
-<span class="sourceLineNo">8783</span>  private void requestFlushIfNeeded() throws RegionTooBusyException {<a name="line.8783"></a>
-<span class="sourceLineNo">8784</span>    if(isFlushSize(this.memStoreSizing.getMemStoreSize())) {<a name="line.8784"></a>
-<span class="sourceLineNo">8785</span>      requestFlush();<a name="line.8785"></a>
-<span class="sourceLineNo">8786</span>    }<a name="line.8786"></a>
-<span class="sourceLineNo">8787</span>  }<a name="line.8787"></a>
-<span class="sourceLineNo">8788</span><a name="line.8788"></a>
-<span class="sourceLineNo">8789</span>  private void requestFlush() {<a name="line.8789"></a>
-<span class="sourceLineNo">8790</span>    if (this.rsServices == null) {<a name="line.8790"></a>
-<span class="sourceLineNo">8791</span>      return;<a name="line.8791"></a>
-<span class="sourceLineNo">8792</span>    }<a name="line.8792"></a>
-<span class="sourceLineNo">8793</span>    requestFlush0(FlushLifeCycleTracker.DUMMY);<a name="line.8793"></a>
-<span class="sourceLineNo">8794</span>  }<a name="line.8794"></a>
-<span class="sourceLineNo">8795</span><a name="line.8795"></a>
-<span class="sourceLineNo">8796</span>  private void requestFlush0(FlushLifeCycleTracker tracker) {<a name="line.8796"></a>
-<span class="sourceLineNo">8797</span>    boolean shouldFlush = false;<a name="line.8797"></a>
-<span class="sourceLineNo">8798</span>    synchronized (writestate) {<a name="line.8798"></a>
-<span class="sourceLineNo">8799</span>      if (!this.writestate.isFlushRequested()) {<a name="line.8799"></a>
-<span class="sourceLineNo">8800</span>        shouldFlush = true;<a name="line.8800"></a>
-<span class="sourceLineNo">8801</span>        writestate.flushRequested = true;<a name="line.8801"></a>
-<span class="sourceLineNo">8802</span>      }<a name="line.8802"></a>
-<span class="sourceLineNo">8803</span>    }<a name="line.8803"></a>
-<span class="sourceLineNo">8804</span>    if (shouldFlush) {<a name="line.8804"></a>
-<span class="sourceLineNo">8805</span>      // Make request outside of synchronize block; HBASE-818.<a name="line.8805"></a>
-<span class="sourceLineNo">8806</span>      this.rsServices.getFlushRequester().requestFlush(this, false, tracker);<a name="line.8806"></a>
-<span class="sourceLineNo">8807</span>      if (LOG.isDebugEnabled()) {<a name="line.8807"></a>
-<span class="sourceLineNo">8808</span>        LOG.debug("Flush requested on " + this.getRegionInfo().getEncodedName());<a name="line.8808"></a>
-<span class="sourceLineNo">8809</span>      }<a name="line.8809"></a>
-<span class="sourceLineNo">8810</span>    } else {<a name="line.8810"></a>
-<span class="sourceLineNo">8811</span>      tracker.notExecuted("Flush already requested on " + this);<a name="line.8811"></a>
-<span class="sourceLineNo">8812</span>    }<a name="line.8812"></a>
-<span class="sourceLineNo">8813</span>  }<a name="line.8813"></a>
-<span class="sourceLineNo">8814</span><a name="line.8814"></a>
-<span class="sourceLineNo">8815</span>  @Override<a name="line.8815"></a>
-<span class="sourceLineNo">8816</span>  public void requestFlush(FlushLifeCycleTracker tracker) throws IOException {<a name="line.8816"></a>
-<span class="sourceLineNo">8817</span>    requestFlush0(tracker);<a name="line.8817"></a>
+<span class="sourceLineNo">8737</span>  public long getMemStoreFlushSize() {<a name="line.8737"></a>
+<span class="sourceLineNo">8738</span>    return this.memstoreFlushSize;<a name="line.8738"></a>
+<span class="sourceLineNo">8739</span>  }<a name="line.8739"></a>
+<span class="sourceLineNo">8740</span><a name="line.8740"></a>
+<span class="sourceLineNo">8741</span><a name="line.8741"></a>
+<span class="sourceLineNo">8742</span>  //// method for debugging tests<a name="line.8742"></a>
+<span class="sourceLineNo">8743</span>  void throwException(String title, String regionName) {<a name="line.8743"></a>
+<span class="sourceLineNo">8744</span>    StringBuilder buf = new StringBuilder();<a name="line.8744"></a>
+<span class="sourceLineNo">8745</span>    buf.append(title + ", ");<a name="line.8745"></a>
+<span class="sourceLineNo">8746</span>    buf.append(getRegionInfo().toString());<a name="line.8746"></a>
+<span class="sourceLineNo">8747</span>    buf.append(getRegionInfo().isMetaRegion() ? " meta region " : " ");<a name="line.8747"></a>
+<span class="sourceLineNo">8748</span>    buf.append("stores: ");<a name="line.8748"></a>
+<span class="sourceLineNo">8749</span>    for (HStore s : stores.values()) {<a name="line.8749"></a>
+<span class="sourceLineNo">8750</span>      buf.append(s.getColumnFamilyDescriptor().getNameAsString());<a name="line.8750"></a>
+<span class="sourceLineNo">8751</span>      buf.append(" size: ");<a name="line.8751"></a>
+<span class="sourceLineNo">8752</span>      buf.append(s.getMemStoreSize().getDataSize());<a name="line.8752"></a>
+<span class="sourceLineNo">8753</span>      buf.append(" ");<a name="line.8753"></a>
+<span class="sourceLineNo">8754</span>    }<a name="line.8754"></a>
+<span class="sourceLineNo">8755</span>    buf.append("end-of-stores");<a name="line.8755"></a>
+<span class="sourceLineNo">8756</span>    buf.append(", memstore size ");<a name="line.8756"></a>
+<span class="sourceLineNo">8757</span>    buf.append(getMemStoreDataSize());<a name="line.8757"></a>
+<span class="sourceLineNo">8758</span>    if (getRegionInfo().getRegionNameAsString().startsWith(regionName)) {<a name="line.8758"></a>
+<span class="sourceLineNo">8759</span>      throw new RuntimeException(buf.toString());<a name="line.8759"></a>
+<span class="sourceLineNo">8760</span>    }<a name="line.8760"></a>
+<span class="sourceLineNo">8761</span>  }<a name="line.8761"></a>
+<span class="sourceLineNo">8762</span><a name="line.8762"></a>
+<span class="sourceLineNo">8763</span>  @Override<a name="line.8763"></a>
+<span class="sourceLineNo">8764</span>  public void requestCompaction(String why, int priority, boolean major,<a name="line.8764"></a>
+<span class="sourceLineNo">8765</span>      CompactionLifeCycleTracker tracker) throws IOException {<a name="line.8765"></a>
+<span class="sourceLineNo">8766</span>    if (major) {<a name="line.8766"></a>
+<span class="sourceLineNo">8767</span>      stores.values().forEach(HStore::triggerMajorCompaction);<a name="line.8767"></a>
+<span class="sourceLineNo">8768</span>    }<a name="line.8768"></a>
+<span class="sourceLineNo">8769</span>    rsServices.getCompactionRequestor().requestCompaction(this, why, priority, tracker,<a name="line.8769"></a>
+<span class="sourceLineNo">8770</span>        RpcServer.getRequestUser().orElse(null));<a name="line.8770"></a>
+<span class="sourceLineNo">8771</span>  }<a name="line.8771"></a>
+<span class="sourceLineNo">8772</span><a name="line.8772"></a>
+<span class="sourceLineNo">8773</span>  @Override<a name="line.8773"></a>
+<span class="sourceLineNo">8774</span>  public void requestCompaction(byte[] family, String why, int priority, boolean major,<a name="line.8774"></a>
+<span class="sourceLineNo">8775</span>      CompactionLifeCycleTracker tracker) throws IOException {<a name="line.8775"></a>
+<span class="sourceLineNo">8776</span>    HStore store = stores.get(family);<a name="line.8776"></a>
+<span class="sourceLineNo">8777</span>    if (store == null) {<a name="line.8777"></a>
+<span class="sourceLineNo">8778</span>      throw new NoSuchColumnFamilyException("column family " + Bytes.toString(family) +<a name="line.8778"></a>
+<span class="sourceLineNo">8779</span>          " does not exist in region " + getRegionInfo().getRegionNameAsString());<a name="line.8779"></a>
+<span class="sourceLineNo">8780</span>    }<a name="line.8780"></a>
+<span class="sourceLineNo">8781</span>    if (major) {<a name="line.8781"></a>
+<span class="sourceLineNo">8782</span>      store.triggerMajorCompaction();<a name="line.8782"></a>
+<span class="sourceLineNo">8783</span>    }<a name="line.8783"></a>
+<span class="sourceLineNo">8784</span>    rsServices.getCompactionRequestor().requestCompaction(this, store, why, priority, tracker,<a name="line.8784"></a>
+<span class="sourceLineNo">8785</span>        RpcServer.getRequestUser().orElse(null));<a name="line.8785"></a>
+<span class="sourceLineNo">8786</span>  }<a name="line.8786"></a>
+<span class="sourceLineNo">8787</span><a name="line.8787"></a>
+<span class="sourceLineNo">8788</span>  private void requestFlushIfNeeded() throws RegionTooBusyException {<a name="line.8788"></a>
+<span class="sourceLineNo">8789</span>    if(isFlushSize(this.memStoreSizing.getMemStoreSize())) {<a name="line.8789"></a>
+<span class="sourceLineNo">8790</span>      requestFlush();<a name="line.8790"></a>
+<span class="sourceLineNo">8791</span>    }<a name="line.8791"></a>
+<span class="sourceLineNo">8792</span>  }<a name="line.8792"></a>
+<span class="sourceLineNo">8793</span><a name="line.8793"></a>
+<span class="sourceLineNo">8794</span>  private void requestFlush() {<a name="line.8794"></a>
+<span class="sourceLineNo">8795</span>    if (this.rsServices == null) {<a name="line.8795"></a>
+<span class="sourceLineNo">8796</span>      return;<a name="line.8796"></a>
+<span class="sourceLineNo">8797</span>    }<a name="line.8797"></a>
+<span class="sourceLineNo">8798</span>    requestFlush0(FlushLifeCycleTracker.DUMMY);<a name="line.8798"></a>
+<span class="sourceLineNo">8799</span>  }<a name="line.8799"></a>
+<span class="sourceLineNo">8800</span><a name="line.8800"></a>
+<span class="sourceLineNo">8801</span>  private void requestFlush0(FlushLifeCycleTracker tracker) {<a name="line.8801"></a>
+<span class="sourceLineNo">8802</span>    boolean shouldFlush = false;<a name="line.8802"></a>
+<span class="sourceLineNo">8803</span>    synchronized (writestate) {<a name="line.8803"></a>
+<span class="sourceLineNo">8804</span>      if (!this.writestate.isFlushRequested()) {<a name="line.8804"></a>
+<span class="sourceLineNo">8805</span>        shouldFlush = true;<a name="line.8805"></a>
+<span class="sourceLineNo">8806</span>        writestate.flushRequested = true;<a name="line.8806"></a>
+<span class="sourceLineNo">8807</span>      }<a name="line.8807"></a>
+<span class="sourceLineNo">8808</span>    }<a name="line.8808"></a>
+<span class="sourceLineNo">8809</span>    if (shouldFlush) {<a name="line.8809"></a>
+<span class="sourceLineNo">8810</span>      // Make request outside of synchronize block; HBASE-818.<a name="line.8810"></a>
+<span class="sourceLineNo">8811</span>      this.rsServices.getFlushRequester().requestFlush(this, false, tracker);<a name="line.8811"></a>
+<span class="sourceLineNo">8812</span>      if (LOG.isDebugEnabled()) {<a name="line.8812"></a>
+<span class="sourceLineNo">8813</span>        LOG.debug("Flush requested on " + this.getRegionInfo().getEncodedName());<a name="line.8813"></a>
+<span class="sourceLineNo">8814</span>      }<a name="line.8814"></a>
+<span class="sourceLineNo">8815</span>    } else {<a name="line.8815"></a>
+<span class="sourceLineNo">8816</span>      tracker.notExecuted("Flush already requested on " + this);<a name="line.8816"></a>
+<span class="sourceLineNo">8817</span>    }<a name="line.8817"></a>
 <span class="sourceLineNo">8818</span>  }<a name="line.8818"></a>
 <span class="sourceLineNo">8819</span><a name="line.8819"></a>
-<span class="sourceLineNo">8820</span>  /**<a name="line.8820"></a>
-<span class="sourceLineNo">8821</span>   * This method modifies the region's configuration in order to inject replication-related<a name="line.8821"></a>
-<span class="sourceLineNo">8822</span>   * features<a name="line.8822"></a>
-<span class="sourceLineNo">8823</span>   * @param conf region configurations<a name="line.8823"></a>
-<span class="sourceLineNo">8824</span>   */<a name="line.8824"></a>
-<span class="sourceLineNo">8825</span>  static void decorateRegionConfiguration(Configuration conf) {<a name="line.8825"></a>
-<span class="sourceLineNo">8826</span>    if (ReplicationUtils.isReplicationForBulkLoadDataEnabled(conf)) {<a name="line.8826"></a>
-<span class="sourceLineNo">8827</span>      String plugins = conf.get(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY,"");<a name="line.8827"></a>
-<span class="sourceLineNo">8828</span>      String replicationCoprocessorClass = ReplicationObserver.class.getCanonicalName();<a name="line.8828"></a>
-<span class="sourceLineNo">8829</span>      if (!plugins.contains(replicationCoprocessorClass)) {<a name="line.8829"></a>
-<span class="sourceLineNo">8830</span>        conf.set(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY,<a name="line.8830"></a>
-<span class="sourceLineNo">8831</span>            (plugins.equals("") ? "" : (plugins + ",")) + replicationCoprocessorClass);<a name="line.8831"></a>
-<span class="sourceLineNo">8832</span>      }<a name="line.8832"></a>
-<span class="sourceLineNo">8833</span>    }<a name="line.8833"></a>
-<span class="sourceLineNo">8834</span>  }<a name="line.8834"></a>
-<span class="sourceLineNo">8835</span>}<a name="line.8835"></a>
+<span class="sourceLineNo">8820</span>  @Override<a name="line.8820"></a>
+<span class="sourceLineNo">8821</span>  public void requestFlush(FlushLifeCycleTracker tracker) throws IOException {<a name="line.8821"></a>
+<span class="sourceLineNo">8822</span>    requestFlush0(tracker);<a name="line.8822"></a>
+<span class="sourceLineNo">8823</span>  }<a name="line.8823"></a>
+<span class="sourceLineNo">8824</span><a name="line.8824"></a>
+<span class="sourceLineNo">8825</span>  /**<a name="line.8825"></a>
+<span class="sourceLineNo">8826</span>   * This method modifies the region's configuration in order to inject replication-related<a name="line.8826"></a>
+<span class="sourceLineNo">8827</span>   * features<a name="line.8827"></a>
+<span class="sourceLineNo">8828</span>   * @param conf region configurations<a name="line.8828"></a>
+<span class="sourceLineNo">8829</span>   */<a name="line.8829"></a>
+<span class="sourceLineNo">8830</span>  static void decorateRegionConfiguration(Configuration conf) {<a name="line.8830"></a>
+<span class="sourceLineNo">8831</span>    if (ReplicationUtils.isReplicationForBulkLoadDataEnabled(conf)) {<a name="line.8831"></a>
+<span class="sourceLineNo">8832</span>      String plugins = conf.get(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY,"");<a name="line.8832"></a>
+<span class="sourceLineNo">8833</span>      String replicationCoprocessorClass = ReplicationObserver.class.getCanonicalName();<a name="line.8833"></a>
+<span class="sourceLineNo">8834</span>      if (!plugins.contains(replicationCoprocessorClass)) {<a name="line.8834"></a>
+<span class="sourceLineNo">8835</span>        conf.set(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY,<a name="line.8835"></a>
+<span class="sourceLineNo">8836</span>            (plugins.equals("") ? "" : (plugins + ",")) + replicationCoprocessorClass);<a name="line.8836"></a>
+<span class="sourceLineNo">8837</span>      }<a name="line.8837"></a>
+<span class="sourceLineNo">8838</span>    }<a name="line.8838"></a>
+<span class="sourceLineNo">8839</span>  }<a name="line.8839"></a>
+<span class="sourceLineNo">8840</span>}<a name="line.8840"></a>
 
 
 
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 8fcec33..2147e82 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
@@ -7972,875 +7972,880 @@
 <span class="sourceLineNo">7964</span>    if (walEdit.isReplay()) {<a name="line.7964"></a>
 <span class="sourceLineNo">7965</span>      walKey.setOrigLogSeqNum(origLogSeqNum);<a name="line.7965"></a>
 <span class="sourceLineNo">7966</span>    }<a name="line.7966"></a>
-<span class="sourceLineNo">7967</span>    WriteEntry writeEntry = null;<a name="line.7967"></a>
-<span class="sourceLineNo">7968</span>    try {<a name="line.7968"></a>
-<span class="sourceLineNo">7969</span>      long txid = this.wal.append(this.getRegionInfo(), walKey, walEdit, true);<a name="line.7969"></a>
-<span class="sourceLineNo">7970</span>      // Call sync on our edit.<a name="line.7970"></a>
-<span class="sourceLineNo">7971</span>      if (txid != 0) {<a name="line.7971"></a>
-<span class="sourceLineNo">7972</span>        sync(txid, durability);<a name="line.7972"></a>
-<span class="sourceLineNo">7973</span>      }<a name="line.7973"></a>
-<span class="sourceLineNo">7974</span>      writeEntry = walKey.getWriteEntry();<a name="line.7974"></a>
-<span class="sourceLineNo">7975</span>    } catch (IOException ioe) {<a name="line.7975"></a>
-<span class="sourceLineNo">7976</span>      if (walKey != null &amp;&amp; walKey.getWriteEntry() != null) {<a name="line.7976"></a>
-<span class="sourceLineNo">7977</span>        mvcc.complete(walKey.getWriteEntry());<a name="line.7977"></a>
+<span class="sourceLineNo">7967</span>    //don't call the coproc hook for writes to the WAL caused by<a name="line.7967"></a>
+<span class="sourceLineNo">7968</span>    //system lifecycle events like flushes or compactions<a name="line.7968"></a>
+<span class="sourceLineNo">7969</span>    if (this.coprocessorHost != null &amp;&amp; !walEdit.isMetaEdit()) {<a name="line.7969"></a>
+<span class="sourceLineNo">7970</span>      this.coprocessorHost.preWALAppend(walKey, walEdit);<a name="line.7970"></a>
+<span class="sourceLineNo">7971</span>    }<a name="line.7971"></a>
+<span class="sourceLineNo">7972</span>    WriteEntry writeEntry = null;<a name="line.7972"></a>
+<span class="sourceLineNo">7973</span>    try {<a name="line.7973"></a>
+<span class="sourceLineNo">7974</span>      long txid = this.wal.append(this.getRegionInfo(), walKey, walEdit, true);<a name="line.7974"></a>
+<span class="sourceLineNo">7975</span>      // Call sync on our edit.<a name="line.7975"></a>
+<span class="sourceLineNo">7976</span>      if (txid != 0) {<a name="line.7976"></a>
+<span class="sourceLineNo">7977</span>        sync(txid, durability);<a name="line.7977"></a>
 <span class="sourceLineNo">7978</span>      }<a name="line.7978"></a>
-<span class="sourceLineNo">7979</span>      throw ioe;<a name="line.7979"></a>
-<span class="sourceLineNo">7980</span>    }<a name="line.7980"></a>
-<span class="sourceLineNo">7981</span>    return writeEntry;<a name="line.7981"></a>
-<span class="sourceLineNo">7982</span>  }<a name="line.7982"></a>
-<span class="sourceLineNo">7983</span><a name="line.7983"></a>
-<span class="sourceLineNo">7984</span>  /**<a name="line.7984"></a>
-<span class="sourceLineNo">7985</span>   * Do coprocessor pre-increment or pre-append call.<a name="line.7985"></a>
-<span class="sourceLineNo">7986</span>   * @return Result returned out of the coprocessor, which means bypass all further processing and<a name="line.7986"></a>
-<span class="sourceLineNo">7987</span>   *  return the proffered Result instead, or null which means proceed.<a name="line.7987"></a>
-<span class="sourceLineNo">7988</span>   */<a name="line.7988"></a>
-<span class="sourceLineNo">7989</span>  private Result doCoprocessorPreCall(final Operation op, final Mutation mutation)<a name="line.7989"></a>
-<span class="sourceLineNo">7990</span>  throws IOException {<a name="line.7990"></a>
-<span class="sourceLineNo">7991</span>    Result result = null;<a name="line.7991"></a>
-<span class="sourceLineNo">7992</span>    if (this.coprocessorHost != null) {<a name="line.7992"></a>
-<span class="sourceLineNo">7993</span>      switch(op) {<a name="line.7993"></a>
-<span class="sourceLineNo">7994</span>        case INCREMENT:<a name="line.7994"></a>
-<span class="sourceLineNo">7995</span>          result = this.coprocessorHost.preIncrementAfterRowLock((Increment)mutation);<a name="line.7995"></a>
-<span class="sourceLineNo">7996</span>          break;<a name="line.7996"></a>
-<span class="sourceLineNo">7997</span>        case APPEND:<a name="line.7997"></a>
-<span class="sourceLineNo">7998</span>          result = this.coprocessorHost.preAppendAfterRowLock((Append)mutation);<a name="line.7998"></a>
-<span class="sourceLineNo">7999</span>          break;<a name="line.7999"></a>
-<span class="sourceLineNo">8000</span>        default: throw new UnsupportedOperationException(op.toString());<a name="line.8000"></a>
-<span class="sourceLineNo">8001</span>      }<a name="line.8001"></a>
-<span class="sourceLineNo">8002</span>    }<a name="line.8002"></a>
-<span class="sourceLineNo">8003</span>    return result;<a name="line.8003"></a>
-<span class="sourceLineNo">8004</span>  }<a name="line.8004"></a>
-<span class="sourceLineNo">8005</span><a name="line.8005"></a>
-<span class="sourceLineNo">8006</span>  /**<a name="line.8006"></a>
-<span class="sourceLineNo">8007</span>   * Reckon the Cells to apply to WAL, memstore, and to return to the Client; these Sets are not<a name="line.8007"></a>
-<span class="sourceLineNo">8008</span>   * always the same dependent on whether to write WAL.<a name="line.8008"></a>
-<span class="sourceLineNo">8009</span>   *<a name="line.8009"></a>
-<span class="sourceLineNo">8010</span>   * @param results Fill in here what goes back to the Client if it is non-null (if null, client<a name="line.8010"></a>
-<span class="sourceLineNo">8011</span>   *  doesn't want results).<a name="line.8011"></a>
-<span class="sourceLineNo">8012</span>   * @param forMemStore Fill in here what to apply to the MemStore (by Store).<a name="line.8012"></a>
-<span class="sourceLineNo">8013</span>   * @return A WALEdit to apply to WAL or null if we are to skip the WAL.<a name="line.8013"></a>
-<span class="sourceLineNo">8014</span>   */<a name="line.8014"></a>
-<span class="sourceLineNo">8015</span>  private WALEdit reckonDeltas(Operation op, Mutation mutation, Durability effectiveDurability,<a name="line.8015"></a>
-<span class="sourceLineNo">8016</span>      Map&lt;HStore, List&lt;Cell&gt;&gt; forMemStore, List&lt;Cell&gt; results) throws IOException {<a name="line.8016"></a>
-<span class="sourceLineNo">8017</span>    WALEdit walEdit = null;<a name="line.8017"></a>
-<span class="sourceLineNo">8018</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.8018"></a>
-<span class="sourceLineNo">8019</span>    final boolean writeToWAL = effectiveDurability != Durability.SKIP_WAL;<a name="line.8019"></a>
-<span class="sourceLineNo">8020</span>    // Process a Store/family at a time.<a name="line.8020"></a>
-<span class="sourceLineNo">8021</span>    for (Map.Entry&lt;byte [], List&lt;Cell&gt;&gt; entry: mutation.getFamilyCellMap().entrySet()) {<a name="line.8021"></a>
-<span class="sourceLineNo">8022</span>      final byte[] columnFamilyName = entry.getKey();<a name="line.8022"></a>
-<span class="sourceLineNo">8023</span>      List&lt;Cell&gt; deltas = entry.getValue();<a name="line.8023"></a>
-<span class="sourceLineNo">8024</span>      // Reckon for the Store what to apply to WAL and MemStore.<a name="line.8024"></a>
-<span class="sourceLineNo">8025</span>      List&lt;Cell&gt; toApply = reckonDeltasByStore(stores.get(columnFamilyName), op, mutation,<a name="line.8025"></a>
-<span class="sourceLineNo">8026</span>        effectiveDurability, now, deltas, results);<a name="line.8026"></a>
-<span class="sourceLineNo">8027</span>      if (!toApply.isEmpty()) {<a name="line.8027"></a>
-<span class="sourceLineNo">8028</span>        for (Cell cell : toApply) {<a name="line.8028"></a>
-<span class="sourceLineNo">8029</span>          HStore store = getStore(cell);<a name="line.8029"></a>
-<span class="sourceLineNo">8030</span>          if (store == null) {<a name="line.8030"></a>
-<span class="sourceLineNo">8031</span>            checkFamily(CellUtil.cloneFamily(cell));<a name="line.8031"></a>
-<span class="sourceLineNo">8032</span>          } else {<a name="line.8032"></a>
-<span class="sourceLineNo">8033</span>            forMemStore.computeIfAbsent(store, key -&gt; new ArrayList&lt;&gt;()).add(cell);<a name="line.8033"></a>
-<span class="sourceLineNo">8034</span>          }<a name="line.8034"></a>
-<span class="sourceLineNo">8035</span>        }<a name="line.8035"></a>
-<span class="sourceLineNo">8036</span>        if (writeToWAL) {<a name="line.8036"></a>
-<span class="sourceLineNo">8037</span>          if (walEdit == null) {<a name="line.8037"></a>
-<span class="sourceLineNo">8038</span>            walEdit = new WALEdit();<a name="line.8038"></a>
+<span class="sourceLineNo">7979</span>      writeEntry = walKey.getWriteEntry();<a name="line.7979"></a>
+<span class="sourceLineNo">7980</span>    } catch (IOException ioe) {<a name="line.7980"></a>
+<span class="sourceLineNo">7981</span>      if (walKey != null &amp;&amp; walKey.getWriteEntry() != null) {<a name="line.7981"></a>
+<span class="sourceLineNo">7982</span>        mvcc.complete(walKey.getWriteEntry());<a name="line.7982"></a>
+<span class="sourceLineNo">7983</span>      }<a name="line.7983"></a>
+<span class="sourceLineNo">7984</span>      throw ioe;<a name="line.7984"></a>
+<span class="sourceLineNo">7985</span>    }<a name="line.7985"></a>
+<span class="sourceLineNo">7986</span>    return writeEntry;<a name="line.7986"></a>
+<span class="sourceLineNo">7987</span>  }<a name="line.7987"></a>
+<span class="sourceLineNo">7988</span><a name="line.7988"></a>
+<span class="sourceLineNo">7989</span>  /**<a name="line.7989"></a>
+<span class="sourceLineNo">7990</span>   * Do coprocessor pre-increment or pre-append call.<a name="line.7990"></a>
+<span class="sourceLineNo">7991</span>   * @return Result returned out of the coprocessor, which means bypass all further processing and<a name="line.7991"></a>
+<span class="sourceLineNo">7992</span>   *  return the proffered Result instead, or null which means proceed.<a name="line.7992"></a>
+<span class="sourceLineNo">7993</span>   */<a name="line.7993"></a>
+<span class="sourceLineNo">7994</span>  private Result doCoprocessorPreCall(final Operation op, final Mutation mutation)<a name="line.7994"></a>
+<span class="sourceLineNo">7995</span>  throws IOException {<a name="line.7995"></a>
+<span class="sourceLineNo">7996</span>    Result result = null;<a name="line.7996"></a>
+<span class="sourceLineNo">7997</span>    if (this.coprocessorHost != null) {<a name="line.7997"></a>
+<span class="sourceLineNo">7998</span>      switch(op) {<a name="line.7998"></a>
+<span class="sourceLineNo">7999</span>        case INCREMENT:<a name="line.7999"></a>
+<span class="sourceLineNo">8000</span>          result = this.coprocessorHost.preIncrementAfterRowLock((Increment)mutation);<a name="line.8000"></a>
+<span class="sourceLineNo">8001</span>          break;<a name="line.8001"></a>
+<span class="sourceLineNo">8002</span>        case APPEND:<a name="line.8002"></a>
+<span class="sourceLineNo">8003</span>          result = this.coprocessorHost.preAppendAfterRowLock((Append)mutation);<a name="line.8003"></a>
+<span class="sourceLineNo">8004</span>          break;<a name="line.8004"></a>
+<span class="sourceLineNo">8005</span>        default: throw new UnsupportedOperationException(op.toString());<a name="line.8005"></a>
+<span class="sourceLineNo">8006</span>      }<a name="line.8006"></a>
+<span class="sourceLineNo">8007</span>    }<a name="line.8007"></a>
+<span class="sourceLineNo">8008</span>    return result;<a name="line.8008"></a>
+<span class="sourceLineNo">8009</span>  }<a name="line.8009"></a>
+<span class="sourceLineNo">8010</span><a name="line.8010"></a>
+<span class="sourceLineNo">8011</span>  /**<a name="line.8011"></a>
+<span class="sourceLineNo">8012</span>   * Reckon the Cells to apply to WAL, memstore, and to return to the Client; these Sets are not<a name="line.8012"></a>
+<span class="sourceLineNo">8013</span>   * always the same dependent on whether to write WAL.<a name="line.8013"></a>
+<span class="sourceLineNo">8014</span>   *<a name="line.8014"></a>
+<span class="sourceLineNo">8015</span>   * @param results Fill in here what goes back to the Client if it is non-null (if null, client<a name="line.8015"></a>
+<span class="sourceLineNo">8016</span>   *  doesn't want results).<a name="line.8016"></a>
+<span class="sourceLineNo">8017</span>   * @param forMemStore Fill in here what to apply to the MemStore (by Store).<a name="line.8017"></a>
+<span class="sourceLineNo">8018</span>   * @return A WALEdit to apply to WAL or null if we are to skip the WAL.<a name="line.8018"></a>
+<span class="sourceLineNo">8019</span>   */<a name="line.8019"></a>
+<span class="sourceLineNo">8020</span>  private WALEdit reckonDeltas(Operation op, Mutation mutation, Durability effectiveDurability,<a name="line.8020"></a>
+<span class="sourceLineNo">8021</span>      Map&lt;HStore, List&lt;Cell&gt;&gt; forMemStore, List&lt;Cell&gt; results) throws IOException {<a name="line.8021"></a>
+<span class="sourceLineNo">8022</span>    WALEdit walEdit = null;<a name="line.8022"></a>
+<span class="sourceLineNo">8023</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.8023"></a>
+<span class="sourceLineNo">8024</span>    final boolean writeToWAL = effectiveDurability != Durability.SKIP_WAL;<a name="line.8024"></a>
+<span class="sourceLineNo">8025</span>    // Process a Store/family at a time.<a name="line.8025"></a>
+<span class="sourceLineNo">8026</span>    for (Map.Entry&lt;byte [], List&lt;Cell&gt;&gt; entry: mutation.getFamilyCellMap().entrySet()) {<a name="line.8026"></a>
+<span class="sourceLineNo">8027</span>      final byte[] columnFamilyName = entry.getKey();<a name="line.8027"></a>
+<span class="sourceLineNo">8028</span>      List&lt;Cell&gt; deltas = entry.getValue();<a name="line.8028"></a>
+<span class="sourceLineNo">8029</span>      // Reckon for the Store what to apply to WAL and MemStore.<a name="line.8029"></a>
+<span class="sourceLineNo">8030</span>      List&lt;Cell&gt; toApply = reckonDeltasByStore(stores.get(columnFamilyName), op, mutation,<a name="line.8030"></a>
+<span class="sourceLineNo">8031</span>        effectiveDurability, now, deltas, results);<a name="line.8031"></a>
+<span class="sourceLineNo">8032</span>      if (!toApply.isEmpty()) {<a name="line.8032"></a>
+<span class="sourceLineNo">8033</span>        for (Cell cell : toApply) {<a name="line.8033"></a>
+<span class="sourceLineNo">8034</span>          HStore store = getStore(cell);<a name="line.8034"></a>
+<span class="sourceLineNo">8035</span>          if (store == null) {<a name="line.8035"></a>
+<span class="sourceLineNo">8036</span>            checkFamily(CellUtil.cloneFamily(cell));<a name="line.8036"></a>
+<span class="sourceLineNo">8037</span>          } else {<a name="line.8037"></a>
+<span class="sourceLineNo">8038</span>            forMemStore.computeIfAbsent(store, key -&gt; new ArrayList&lt;&gt;()).add(cell);<a name="line.8038"></a>
 <span class="sourceLineNo">8039</span>          }<a name="line.8039"></a>
-<span class="sourceLineNo">8040</span>          walEdit.getCells().addAll(toApply);<a name="line.8040"></a>
-<span class="sourceLineNo">8041</span>        }<a name="line.8041"></a>
-<span class="sourceLineNo">8042</span>      }<a name="line.8042"></a>
-<span class="sourceLineNo">8043</span>    }<a name="line.8043"></a>
-<span class="sourceLineNo">8044</span>    return walEdit;<a name="line.8044"></a>
-<span class="sourceLineNo">8045</span>  }<a name="line.8045"></a>
-<span class="sourceLineNo">8046</span><a name="line.8046"></a>
-<span class="sourceLineNo">8047</span>  /**<a name="line.8047"></a>
-<span class="sourceLineNo">8048</span>   * Reckon the Cells to apply to WAL, memstore, and to return to the Client in passed<a name="line.8048"></a>
-<span class="sourceLineNo">8049</span>   * column family/Store.<a name="line.8049"></a>
-<span class="sourceLineNo">8050</span>   *<a name="line.8050"></a>
-<span class="sourceLineNo">8051</span>   * Does Get of current value and then adds passed in deltas for this Store returning the result.<a name="line.8051"></a>
-<span class="sourceLineNo">8052</span>   *<a name="line.8052"></a>
-<span class="sourceLineNo">8053</span>   * @param op Whether Increment or Append<a name="line.8053"></a>
-<span class="sourceLineNo">8054</span>   * @param mutation The encompassing Mutation object<a name="line.8054"></a>
-<span class="sourceLineNo">8055</span>   * @param deltas Changes to apply to this Store; either increment amount or data to append<a name="line.8055"></a>
-<span class="sourceLineNo">8056</span>   * @param results In here we accumulate all the Cells we are to return to the client. If null,<a name="line.8056"></a>
-<span class="sourceLineNo">8057</span>   *                client doesn't want results returned.<a name="line.8057"></a>
-<span class="sourceLineNo">8058</span>   * @return Resulting Cells after &lt;code&gt;deltas&lt;/code&gt; have been applied to current<a name="line.8058"></a>
-<span class="sourceLineNo">8059</span>   *  values. Side effect is our filling out of the &lt;code&gt;results&lt;/code&gt; List.<a name="line.8059"></a>
-<span class="sourceLineNo">8060</span>   */<a name="line.8060"></a>
-<span class="sourceLineNo">8061</span>  private List&lt;Cell&gt; reckonDeltasByStore(HStore store, Operation op, Mutation mutation,<a name="line.8061"></a>
-<span class="sourceLineNo">8062</span>      Durability effectiveDurability, long now, List&lt;Cell&gt; deltas, List&lt;Cell&gt; results)<a name="line.8062"></a>
-<span class="sourceLineNo">8063</span>      throws IOException {<a name="line.8063"></a>
-<span class="sourceLineNo">8064</span>    byte[] columnFamily = store.getColumnFamilyDescriptor().getName();<a name="line.8064"></a>
-<span class="sourceLineNo">8065</span>    List&lt;Pair&lt;Cell, Cell&gt;&gt; cellPairs = new ArrayList&lt;&gt;(deltas.size());<a name="line.8065"></a>
-<span class="sourceLineNo">8066</span>    // Get previous values for all columns in this family.<a name="line.8066"></a>
-<span class="sourceLineNo">8067</span>    TimeRange tr = null;<a name="line.8067"></a>
-<span class="sourceLineNo">8068</span>    switch (op) {<a name="line.8068"></a>
-<span class="sourceLineNo">8069</span>      case INCREMENT:<a name="line.8069"></a>
-<span class="sourceLineNo">8070</span>        tr = ((Increment)mutation).getTimeRange();<a name="line.8070"></a>
-<span class="sourceLineNo">8071</span>        break;<a name="line.8071"></a>
-<span class="sourceLineNo">8072</span>      case APPEND:<a name="line.8072"></a>
-<span class="sourceLineNo">8073</span>        tr = ((Append)mutation).getTimeRange();<a name="line.8073"></a>
-<span class="sourceLineNo">8074</span>        break;<a name="line.8074"></a>
-<span class="sourceLineNo">8075</span>      default:<a name="line.8075"></a>
+<span class="sourceLineNo">8040</span>        }<a name="line.8040"></a>
+<span class="sourceLineNo">8041</span>        if (writeToWAL) {<a name="line.8041"></a>
+<span class="sourceLineNo">8042</span>          if (walEdit == null) {<a name="line.8042"></a>
+<span class="sourceLineNo">8043</span>            walEdit = new WALEdit();<a name="line.8043"></a>
+<span class="sourceLineNo">8044</span>          }<a name="line.8044"></a>
+<span class="sourceLineNo">8045</span>          walEdit.getCells().addAll(toApply);<a name="line.8045"></a>
+<span class="sourceLineNo">8046</span>        }<a name="line.8046"></a>
+<span class="sourceLineNo">8047</span>      }<a name="line.8047"></a>
+<span class="sourceLineNo">8048</span>    }<a name="line.8048"></a>
+<span class="sourceLineNo">8049</span>    return walEdit;<a name="line.8049"></a>
+<span class="sourceLineNo">8050</span>  }<a name="line.8050"></a>
+<span class="sourceLineNo">8051</span><a name="line.8051"></a>
+<span class="sourceLineNo">8052</span>  /**<a name="line.8052"></a>
+<span class="sourceLineNo">8053</span>   * Reckon the Cells to apply to WAL, memstore, and to return to the Client in passed<a name="line.8053"></a>
+<span class="sourceLineNo">8054</span>   * column family/Store.<a name="line.8054"></a>
+<span class="sourceLineNo">8055</span>   *<a name="line.8055"></a>
+<span class="sourceLineNo">8056</span>   * Does Get of current value and then adds passed in deltas for this Store returning the result.<a name="line.8056"></a>
+<span class="sourceLineNo">8057</span>   *<a name="line.8057"></a>
+<span class="sourceLineNo">8058</span>   * @param op Whether Increment or Append<a name="line.8058"></a>
+<span class="sourceLineNo">8059</span>   * @param mutation The encompassing Mutation object<a name="line.8059"></a>
+<span class="sourceLineNo">8060</span>   * @param deltas Changes to apply to this Store; either increment amount or data to append<a name="line.8060"></a>
+<span class="sourceLineNo">8061</span>   * @param results In here we accumulate all the Cells we are to return to the client. If null,<a name="line.8061"></a>
+<span class="sourceLineNo">8062</span>   *                client doesn't want results returned.<a name="line.8062"></a>
+<span class="sourceLineNo">8063</span>   * @return Resulting Cells after &lt;code&gt;deltas&lt;/code&gt; have been applied to current<a name="line.8063"></a>
+<span class="sourceLineNo">8064</span>   *  values. Side effect is our filling out of the &lt;code&gt;results&lt;/code&gt; List.<a name="line.8064"></a>
+<span class="sourceLineNo">8065</span>   */<a name="line.8065"></a>
+<span class="sourceLineNo">8066</span>  private List&lt;Cell&gt; reckonDeltasByStore(HStore store, Operation op, Mutation mutation,<a name="line.8066"></a>
+<span class="sourceLineNo">8067</span>      Durability effectiveDurability, long now, List&lt;Cell&gt; deltas, List&lt;Cell&gt; results)<a name="line.8067"></a>
+<span class="sourceLineNo">8068</span>      throws IOException {<a name="line.8068"></a>
+<span class="sourceLineNo">8069</span>    byte[] columnFamily = store.getColumnFamilyDescriptor().getName();<a name="line.8069"></a>
+<span class="sourceLineNo">8070</span>    List&lt;Pair&lt;Cell, Cell&gt;&gt; cellPairs = new ArrayList&lt;&gt;(deltas.size());<a name="line.8070"></a>
+<span class="sourceLineNo">8071</span>    // Get previous values for all columns in this family.<a name="line.8071"></a>
+<span class="sourceLineNo">8072</span>    TimeRange tr = null;<a name="line.8072"></a>
+<span class="sourceLineNo">8073</span>    switch (op) {<a name="line.8073"></a>
+<span class="sourceLineNo">8074</span>      case INCREMENT:<a name="line.8074"></a>
+<span class="sourceLineNo">8075</span>        tr = ((Increment)mutation).getTimeRange();<a name="line.8075"></a>
 <span class="sourceLineNo">8076</span>        break;<a name="line.8076"></a>
-<span class="sourceLineNo">8077</span>    }<a name="line.8077"></a>
-<span class="sourceLineNo">8078</span>    List&lt;Cell&gt; currentValues = get(mutation, store, deltas,null, tr);<a name="line.8078"></a>
-<span class="sourceLineNo">8079</span>    // Iterate the input columns and update existing values if they were found, otherwise<a name="line.8079"></a>
-<span class="sourceLineNo">8080</span>    // add new column initialized to the delta amount<a name="line.8080"></a>
-<span class="sourceLineNo">8081</span>    int currentValuesIndex = 0;<a name="line.8081"></a>
-<span class="sourceLineNo">8082</span>    for (int i = 0; i &lt; deltas.size(); i++) {<a name="line.8082"></a>
-<span class="sourceLineNo">8083</span>      Cell delta = deltas.get(i);<a name="line.8083"></a>
-<span class="sourceLineNo">8084</span>      Cell currentValue = null;<a name="line.8084"></a>
-<span class="sourceLineNo">8085</span>      if (currentValuesIndex &lt; currentValues.size() &amp;&amp;<a name="line.8085"></a>
-<span class="sourceLineNo">8086</span>          CellUtil.matchingQualifier(currentValues.get(currentValuesIndex), delta)) {<a name="line.8086"></a>
-<span class="sourceLineNo">8087</span>        currentValue = currentValues.get(currentValuesIndex);<a name="line.8087"></a>
-<span class="sourceLineNo">8088</span>        if (i &lt; (deltas.size() - 1) &amp;&amp; !CellUtil.matchingQualifier(delta, deltas.get(i + 1))) {<a name="line.8088"></a>
-<span class="sourceLineNo">8089</span>          currentValuesIndex++;<a name="line.8089"></a>
-<span class="sourceLineNo">8090</span>        }<a name="line.8090"></a>
-<span class="sourceLineNo">8091</span>      }<a name="line.8091"></a>
-<span class="sourceLineNo">8092</span><a name="line.8092"></a>
-<span class="sourceLineNo">8093</span>      // Switch on whether this an increment or an append building the new Cell to apply.<a name="line.8093"></a>
-<span class="sourceLineNo">8094</span>      Cell newCell = null;<a name="line.8094"></a>
-<span class="sourceLineNo">8095</span>      switch (op) {<a name="line.8095"></a>
-<span class="sourceLineNo">8096</span>        case INCREMENT:<a name="line.8096"></a>
-<span class="sourceLineNo">8097</span>          long deltaAmount = getLongValue(delta);<a name="line.8097"></a>
-<span class="sourceLineNo">8098</span>          final long newValue = currentValue == null ? deltaAmount : getLongValue(currentValue) + deltaAmount;<a name="line.8098"></a>
-<span class="sourceLineNo">8099</span>          newCell = reckonDelta(delta, currentValue, columnFamily, now, mutation, (oldCell) -&gt; Bytes.toBytes(newValue));<a name="line.8099"></a>
-<span class="sourceLineNo">8100</span>          break;<a name="line.8100"></a>
-<span class="sourceLineNo">8101</span>        case APPEND:<a name="line.8101"></a>
-<span class="sourceLineNo">8102</span>          newCell = reckonDelta(delta, currentValue, columnFamily, now, mutation, (oldCell) -&gt;<a name="line.8102"></a>
-<span class="sourceLineNo">8103</span>            ByteBuffer.wrap(new byte[delta.getValueLength() + oldCell.getValueLength()])<a name="line.8103"></a>
-<span class="sourceLineNo">8104</span>                    .put(oldCell.getValueArray(), oldCell.getValueOffset(), oldCell.getValueLength())<a name="line.8104"></a>
-<span class="sourceLineNo">8105</span>                    .put(delta.getValueArray(), delta.getValueOffset(), delta.getValueLength())<a name="line.8105"></a>
-<span class="sourceLineNo">8106</span>                    .array()<a name="line.8106"></a>
-<span class="sourceLineNo">8107</span>          );<a name="line.8107"></a>
-<span class="sourceLineNo">8108</span>          break;<a name="line.8108"></a>
-<span class="sourceLineNo">8109</span>        default: throw new UnsupportedOperationException(op.toString());<a name="line.8109"></a>
-<span class="sourceLineNo">8110</span>      }<a name="line.8110"></a>
-<span class="sourceLineNo">8111</span>      int newCellSize = PrivateCellUtil.estimatedSerializedSizeOf(newCell);<a name="line.8111"></a>
-<span class="sourceLineNo">8112</span>      if (newCellSize &gt; this.maxCellSize) {<a name="line.8112"></a>
-<span class="sourceLineNo">8113</span>        String msg = "Cell with size " + newCellSize + " exceeds limit of " +<a name="line.8113"></a>
-<span class="sourceLineNo">8114</span>            this.maxCellSize + " bytes";<a name="line.8114"></a>
-<span class="sourceLineNo">8115</span>        if (LOG.isDebugEnabled()) {<a name="line.8115"></a>
-<span class="sourceLineNo">8116</span>          LOG.debug(msg);<a name="line.8116"></a>
-<span class="sourceLineNo">8117</span>        }<a name="line.8117"></a>
-<span class="sourceLineNo">8118</span>        throw new DoNotRetryIOException(msg);<a name="line.8118"></a>
-<span class="sourceLineNo">8119</span>      }<a name="line.8119"></a>
-<span class="sourceLineNo">8120</span>      cellPairs.add(new Pair&lt;&gt;(currentValue, newCell));<a name="line.8120"></a>
-<span class="sourceLineNo">8121</span>      // Add to results to get returned to the Client. If null, cilent does not want results.<a name="line.8121"></a>
-<span class="sourceLineNo">8122</span>      if (results != null) {<a name="line.8122"></a>
-<span class="sourceLineNo">8123</span>        results.add(newCell);<a name="line.8123"></a>
+<span class="sourceLineNo">8077</span>      case APPEND:<a name="line.8077"></a>
+<span class="sourceLineNo">8078</span>        tr = ((Append)mutation).getTimeRange();<a name="line.8078"></a>
+<span class="sourceLineNo">8079</span>        break;<a name="line.8079"></a>
+<span class="sourceLineNo">8080</span>      default:<a name="line.8080"></a>
+<span class="sourceLineNo">8081</span>        break;<a name="line.8081"></a>
+<span class="sourceLineNo">8082</span>    }<a name="line.8082"></a>
+<span class="sourceLineNo">8083</span>    List&lt;Cell&gt; currentValues = get(mutation, store, deltas,null, tr);<a name="line.8083"></a>
+<span class="sourceLineNo">8084</span>    // Iterate the input columns and update existing values if they were found, otherwise<a name="line.8084"></a>
+<span class="sourceLineNo">8085</span>    // add new column initialized to the delta amount<a name="line.8085"></a>
+<span class="sourceLineNo">8086</span>    int currentValuesIndex = 0;<a name="line.8086"></a>
+<span class="sourceLineNo">8087</span>    for (int i = 0; i &lt; deltas.size(); i++) {<a name="line.8087"></a>
+<span class="sourceLineNo">8088</span>      Cell delta = deltas.get(i);<a name="line.8088"></a>
+<span class="sourceLineNo">8089</span>      Cell currentValue = null;<a name="line.8089"></a>
+<span class="sourceLineNo">8090</span>      if (currentValuesIndex &lt; currentValues.size() &amp;&amp;<a name="line.8090"></a>
+<span class="sourceLineNo">8091</span>          CellUtil.matchingQualifier(currentValues.get(currentValuesIndex), delta)) {<a name="line.8091"></a>
+<span class="sourceLineNo">8092</span>        currentValue = currentValues.get(currentValuesIndex);<a name="line.8092"></a>
+<span class="sourceLineNo">8093</span>        if (i &lt; (deltas.size() - 1) &amp;&amp; !CellUtil.matchingQualifier(delta, deltas.get(i + 1))) {<a name="line.8093"></a>
+<span class="sourceLineNo">8094</span>          currentValuesIndex++;<a name="line.8094"></a>
+<span class="sourceLineNo">8095</span>        }<a name="line.8095"></a>
+<span class="sourceLineNo">8096</span>      }<a name="line.8096"></a>
+<span class="sourceLineNo">8097</span><a name="line.8097"></a>
+<span class="sourceLineNo">8098</span>      // Switch on whether this an increment or an append building the new Cell to apply.<a name="line.8098"></a>
+<span class="sourceLineNo">8099</span>      Cell newCell = null;<a name="line.8099"></a>
+<span class="sourceLineNo">8100</span>      switch (op) {<a name="line.8100"></a>
+<span class="sourceLineNo">8101</span>        case INCREMENT:<a name="line.8101"></a>
+<span class="sourceLineNo">8102</span>          long deltaAmount = getLongValue(delta);<a name="line.8102"></a>
+<span class="sourceLineNo">8103</span>          final long newValue = currentValue == null ? deltaAmount : getLongValue(currentValue) + deltaAmount;<a name="line.8103"></a>
+<span class="sourceLineNo">8104</span>          newCell = reckonDelta(delta, currentValue, columnFamily, now, mutation, (oldCell) -&gt; Bytes.toBytes(newValue));<a name="line.8104"></a>
+<span class="sourceLineNo">8105</span>          break;<a name="line.8105"></a>
+<span class="sourceLineNo">8106</span>        case APPEND:<a name="line.8106"></a>
+<span class="sourceLineNo">8107</span>          newCell = reckonDelta(delta, currentValue, columnFamily, now, mutation, (oldCell) -&gt;<a name="line.8107"></a>
+<span class="sourceLineNo">8108</span>            ByteBuffer.wrap(new byte[delta.getValueLength() + oldCell.getValueLength()])<a name="line.8108"></a>
+<span class="sourceLineNo">8109</span>                    .put(oldCell.getValueArray(), oldCell.getValueOffset(), oldCell.getValueLength())<a name="line.8109"></a>
+<span class="sourceLineNo">8110</span>                    .put(delta.getValueArray(), delta.getValueOffset(), delta.getValueLength())<a name="line.8110"></a>
+<span class="sourceLineNo">8111</span>                    .array()<a name="line.8111"></a>
+<span class="sourceLineNo">8112</span>          );<a name="line.8112"></a>
+<span class="sourceLineNo">8113</span>          break;<a name="line.8113"></a>
+<span class="sourceLineNo">8114</span>        default: throw new UnsupportedOperationException(op.toString());<a name="line.8114"></a>
+<span class="sourceLineNo">8115</span>      }<a name="line.8115"></a>
+<span class="sourceLineNo">8116</span>      int newCellSize = PrivateCellUtil.estimatedSerializedSizeOf(newCell);<a name="line.8116"></a>
+<span class="sourceLineNo">8117</span>      if (newCellSize &gt; this.maxCellSize) {<a name="line.8117"></a>
+<span class="sourceLineNo">8118</span>        String msg = "Cell with size " + newCellSize + " exceeds limit of " +<a name="line.8118"></a>
+<span class="sourceLineNo">8119</span>            this.maxCellSize + " bytes";<a name="line.8119"></a>
+<span class="sourceLineNo">8120</span>        if (LOG.isDebugEnabled()) {<a name="line.8120"></a>
+<span class="sourceLineNo">8121</span>          LOG.debug(msg);<a name="line.8121"></a>
+<span class="sourceLineNo">8122</span>        }<a name="line.8122"></a>
+<span class="sourceLineNo">8123</span>        throw new DoNotRetryIOException(msg);<a name="line.8123"></a>
 <span class="sourceLineNo">8124</span>      }<a name="line.8124"></a>
-<span class="sourceLineNo">8125</span>    }<a name="line.8125"></a>
-<span class="sourceLineNo">8126</span><a name="line.8126"></a>
-<span class="sourceLineNo">8127</span>    // Give coprocessors a chance to update the new cells before apply to WAL or memstore<a name="line.8127"></a>
-<span class="sourceLineNo">8128</span>    if (coprocessorHost != null) {<a name="line.8128"></a>
-<span class="sourceLineNo">8129</span>      // Here the operation must be increment or append.<a name="line.8129"></a>
-<span class="sourceLineNo">8130</span>      cellPairs = op == Operation.INCREMENT ?<a name="line.8130"></a>
-<span class="sourceLineNo">8131</span>          coprocessorHost.postIncrementBeforeWAL(mutation, cellPairs) :<a name="line.8131"></a>
-<span class="sourceLineNo">8132</span>          coprocessorHost.postAppendBeforeWAL(mutation, cellPairs);<a name="line.8132"></a>
-<span class="sourceLineNo">8133</span>    }<a name="line.8133"></a>
-<span class="sourceLineNo">8134</span>    return cellPairs.stream().map(Pair::getSecond).collect(Collectors.toList());<a name="line.8134"></a>
-<span class="sourceLineNo">8135</span>  }<a name="line.8135"></a>
-<span class="sourceLineNo">8136</span><a name="line.8136"></a>
-<span class="sourceLineNo">8137</span>  private static Cell reckonDelta(final Cell delta, final Cell currentCell,<a name="line.8137"></a>
-<span class="sourceLineNo">8138</span>                                  final byte[] columnFamily, final long now,<a name="line.8138"></a>
-<span class="sourceLineNo">8139</span>                                  Mutation mutation, Function&lt;Cell, byte[]&gt; supplier) throws IOException {<a name="line.8139"></a>
-<span class="sourceLineNo">8140</span>    // Forward any tags found on the delta.<a name="line.8140"></a>
-<span class="sourceLineNo">8141</span>    List&lt;Tag&gt; tags = TagUtil.carryForwardTags(delta);<a name="line.8141"></a>
-<span class="sourceLineNo">8142</span>    tags = TagUtil.carryForwardTTLTag(tags, mutation.getTTL());<a name="line.8142"></a>
-<span class="sourceLineNo">8143</span>    if (currentCell != null) {<a name="line.8143"></a>
-<span class="sourceLineNo">8144</span>      tags = TagUtil.carryForwardTags(tags, currentCell);<a name="line.8144"></a>
-<span class="sourceLineNo">8145</span>      byte[] newValue = supplier.apply(currentCell);<a name="line.8145"></a>
-<span class="sourceLineNo">8146</span>      return ExtendedCellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.8146"></a>
-<span class="sourceLineNo">8147</span>              .setRow(mutation.getRow(), 0, mutation.getRow().length)<a name="line.8147"></a>
-<span class="sourceLineNo">8148</span>              .setFamily(columnFamily, 0, columnFamily.length)<a name="line.8148"></a>
-<span class="sourceLineNo">8149</span>              // copy the qualifier if the cell is located in shared memory.<a name="line.8149"></a>
-<span class="sourceLineNo">8150</span>              .setQualifier(CellUtil.cloneQualifier(delta))<a name="line.8150"></a>
-<span class="sourceLineNo">8151</span>              .setTimestamp(Math.max(currentCell.getTimestamp() + 1, now))<a name="line.8151"></a>
-<span class="sourceLineNo">8152</span>              .setType(KeyValue.Type.Put.getCode())<a name="line.8152"></a>
-<span class="sourceLineNo">8153</span>              .setValue(newValue, 0, newValue.length)<a name="line.8153"></a>
-<span class="sourceLineNo">8154</span>              .setTags(TagUtil.fromList(tags))<a name="line.8154"></a>
-<span class="sourceLineNo">8155</span>              .build();<a name="line.8155"></a>
-<span class="sourceLineNo">8156</span>    } else {<a name="line.8156"></a>
-<span class="sourceLineNo">8157</span>      PrivateCellUtil.updateLatestStamp(delta, now);<a name="line.8157"></a>
-<span class="sourceLineNo">8158</span>      return CollectionUtils.isEmpty(tags) ? delta : PrivateCellUtil.createCell(delta, tags);<a name="line.8158"></a>
-<span class="sourceLineNo">8159</span>    }<a name="line.8159"></a>
-<span class="sourceLineNo">8160</span>  }<a name="line.8160"></a>
-<span class="sourceLineNo">8161</span><a name="line.8161"></a>
-<span class="sourceLineNo">8162</span>  /**<a name="line.8162"></a>
-<span class="sourceLineNo">8163</span>   * @return Get the long out of the passed in Cell<a name="line.8163"></a>
-<span class="sourceLineNo">8164</span>   */<a name="line.8164"></a>
-<span class="sourceLineNo">8165</span>  private static long getLongValue(final Cell cell) throws DoNotRetryIOException {<a name="line.8165"></a>
-<span class="sourceLineNo">8166</span>    int len = cell.getValueLength();<a name="line.8166"></a>
-<span class="sourceLineNo">8167</span>    if (len != Bytes.SIZEOF_LONG) {<a name="line.8167"></a>
-<span class="sourceLineNo">8168</span>      // throw DoNotRetryIOException instead of IllegalArgumentException<a name="line.8168"></a>
-<span class="sourceLineNo">8169</span>      throw new DoNotRetryIOException("Field is not a long, it's " + len + " bytes wide");<a name="line.8169"></a>
-<span class="sourceLineNo">8170</span>    }<a name="line.8170"></a>
-<span class="sourceLineNo">8171</span>    return PrivateCellUtil.getValueAsLong(cell);<a name="line.8171"></a>
-<span class="sourceLineNo">8172</span>  }<a name="line.8172"></a>
-<span class="sourceLineNo">8173</span><a name="line.8173"></a>
-<span class="sourceLineNo">8174</span>  /**<a name="line.8174"></a>
-<span class="sourceLineNo">8175</span>   * Do a specific Get on passed &lt;code&gt;columnFamily&lt;/code&gt; and column qualifiers.<a name="line.8175"></a>
-<span class="sourceLineNo">8176</span>   * @param mutation Mutation we are doing this Get for.<a name="line.8176"></a>
-<span class="sourceLineNo">8177</span>   * @param store Which column family on row (TODO: Go all Gets in one go)<a name="line.8177"></a>
-<span class="sourceLineNo">8178</span>   * @param coordinates Cells from &lt;code&gt;mutation&lt;/code&gt; used as coordinates applied to Get.<a name="line.8178"></a>
-<span class="sourceLineNo">8179</span>   * @return Return list of Cells found.<a name="line.8179"></a>
-<span class="sourceLineNo">8180</span>   */<a name="line.8180"></a>
-<span class="sourceLineNo">8181</span>  private List&lt;Cell&gt; get(Mutation mutation, HStore store, List&lt;Cell&gt; coordinates,<a name="line.8181"></a>
-<span class="sourceLineNo">8182</span>      IsolationLevel isolation, TimeRange tr) throws IOException {<a name="line.8182"></a>
-<span class="sourceLineNo">8183</span>    // Sort the cells so that they match the order that they appear in the Get results. Otherwise,<a name="line.8183"></a>
-<span class="sourceLineNo">8184</span>    // we won't be able to find the existing values if the cells are not specified in order by the<a name="line.8184"></a>
-<span class="sourceLineNo">8185</span>    // client since cells are in an array list.<a name="line.8185"></a>
-<span class="sourceLineNo">8186</span>    // TODO: I don't get why we are sorting. St.Ack 20150107<a name="line.8186"></a>
-<span class="sourceLineNo">8187</span>    sort(coordinates, store.getComparator());<a name="line.8187"></a>
-<span class="sourceLineNo">8188</span>    Get get = new Get(mutation.getRow());<a name="line.8188"></a>
-<span class="sourceLineNo">8189</span>    if (isolation != null) {<a name="line.8189"></a>
-<span class="sourceLineNo">8190</span>      get.setIsolationLevel(isolation);<a name="line.8190"></a>
-<span class="sourceLineNo">8191</span>    }<a name="line.8191"></a>
-<span class="sourceLineNo">8192</span>    for (Cell cell: coordinates) {<a name="line.8192"></a>
-<span class="sourceLineNo">8193</span>      get.addColumn(store.getColumnFamilyDescriptor().getName(), CellUtil.cloneQualifier(cell));<a name="line.8193"></a>
-<span class="sourceLineNo">8194</span>    }<a name="line.8194"></a>
-<span class="sourceLineNo">8195</span>    // Increments carry time range. If an Increment instance, put it on the Get.<a name="line.8195"></a>
-<span class="sourceLineNo">8196</span>    if (tr != null) {<a name="line.8196"></a>
-<span class="sourceLineNo">8197</span>      get.setTimeRange(tr.getMin(), tr.getMax());<a name="line.8197"></a>
-<span class="sourceLineNo">8198</span>    }<a name="line.8198"></a>
-<span class="sourceLineNo">8199</span>    return get(get, false);<a name="line.8199"></a>
-<span class="sourceLineNo">8200</span>  }<a name="line.8200"></a>
-<span class="sourceLineNo">8201</span><a name="line.8201"></a>
-<span class="sourceLineNo">8202</span>  /**<a name="line.8202"></a>
-<span class="sourceLineNo">8203</span>   * @return Sorted list of &lt;code&gt;cells&lt;/code&gt; using &lt;code&gt;comparator&lt;/code&gt;<a name="line.8203"></a>
-<span class="sourceLineNo">8204</span>   */<a name="line.8204"></a>
-<span class="sourceLineNo">8205</span>  private static List&lt;Cell&gt; sort(List&lt;Cell&gt; cells, final CellComparator comparator) {<a name="line.8205"></a>
-<span class="sourceLineNo">8206</span>    cells.sort(comparator);<a name="line.8206"></a>
-<span class="sourceLineNo">8207</span>    return cells;<a name="line.8207"></a>
-<span class="sourceLineNo">8208</span>  }<a name="line.8208"></a>
-<span class="sourceLineNo">8209</span><a name="line.8209"></a>
-<span class="sourceLineNo">8210</span>  public static final long FIXED_OVERHEAD = ClassSize.align(<a name="line.8210"></a>
-<span class="sourceLineNo">8211</span>      ClassSize.OBJECT +<a name="line.8211"></a>
-<span class="sourceLineNo">8212</span>      ClassSize.ARRAY +<a name="line.8212"></a>
-<span class="sourceLineNo">8213</span>      55 * ClassSize.REFERENCE + 3 * Bytes.SIZEOF_INT +<a name="line.8213"></a>
-<span class="sourceLineNo">8214</span>      (15 * Bytes.SIZEOF_LONG) +<a name="line.8214"></a>
-<span class="sourceLineNo">8215</span>      3 * Bytes.SIZEOF_BOOLEAN);<a name="line.8215"></a>
-<span class="sourceLineNo">8216</span><a name="line.8216"></a>
-<span class="sourceLineNo">8217</span>  // woefully out of date - currently missing:<a name="line.8217"></a>
-<span class="sourceLineNo">8218</span>  // 1 x HashMap - coprocessorServiceHandlers<a name="line.8218"></a>
-<span class="sourceLineNo">8219</span>  // 6 x LongAdder - numMutationsWithoutWAL, dataInMemoryWithoutWAL,<a name="line.8219"></a>
-<span class="sourceLineNo">8220</span>  //   checkAndMutateChecksPassed, checkAndMutateChecksFailed, readRequestsCount,<a name="line.8220"></a>
-<span class="sourceLineNo">8221</span>  //   writeRequestsCount, cpRequestsCount<a name="line.8221"></a>
-<span class="sourceLineNo">8222</span>  // 1 x HRegion$WriteState - writestate<a name="line.8222"></a>
-<span class="sourceLineNo">8223</span>  // 1 x RegionCoprocessorHost - coprocessorHost<a name="line.8223"></a>
-<span class="sourceLineNo">8224</span>  // 1 x RegionSplitPolicy - splitPolicy<a name="line.8224"></a>
-<span class="sourceLineNo">8225</span>  // 1 x MetricsRegion - metricsRegion<a name="line.8225"></a>
-<span class="sourceLineNo">8226</span>  // 1 x MetricsRegionWrapperImpl - metricsRegionWrapper<a name="line.8226"></a>
-<span class="sourceLineNo">8227</span>  public static final long DEEP_OVERHEAD = FIXED_OVERHEAD +<a name="line.8227"></a>
-<span class="sourceLineNo">8228</span>      ClassSize.OBJECT + // closeLock<a name="line.8228"></a>
-<span class="sourceLineNo">8229</span>      (2 * ClassSize.ATOMIC_BOOLEAN) + // closed, closing<a name="line.8229"></a>
-<span class="sourceLineNo">8230</span>      (3 * ClassSize.ATOMIC_LONG) + // numPutsWithoutWAL, dataInMemoryWithoutWAL,<a name="line.8230"></a>
-<span class="sourceLineNo">8231</span>                                    // compactionsFailed<a name="line.8231"></a>
-<span class="sourceLineNo">8232</span>      (2 * ClassSize.CONCURRENT_HASHMAP) +  // lockedRows, scannerReadPoints<a name="line.8232"></a>
-<span class="sourceLineNo">8233</span>      WriteState.HEAP_SIZE + // writestate<a name="line.8233"></a>
-<span class="sourceLineNo">8234</span>      ClassSize.CONCURRENT_SKIPLISTMAP + ClassSize.CONCURRENT_SKIPLISTMAP_ENTRY + // stores<a name="line.8234"></a>
-<span class="sourceLineNo">8235</span>      (2 * ClassSize.REENTRANT_LOCK) + // lock, updatesLock<a name="line.8235"></a>
-<span class="sourceLineNo">8236</span>      MultiVersionConcurrencyControl.FIXED_SIZE // mvcc<a name="line.8236"></a>
-<span class="sourceLineNo">8237</span>      + 2 * ClassSize.TREEMAP // maxSeqIdInStores, replicationScopes<a name="line.8237"></a>
-<span class="sourceLineNo">8238</span>      + 2 * ClassSize.ATOMIC_INTEGER // majorInProgress, minorInProgress<a name="line.8238"></a>
-<span class="sourceLineNo">8239</span>      + ClassSize.STORE_SERVICES // store services<a name="line.8239"></a>
-<span class="sourceLineNo">8240</span>      + StoreHotnessProtector.FIXED_SIZE<a name="line.8240"></a>
-<span class="sourceLineNo">8241</span>      ;<a name="line.8241"></a>
-<span class="sourceLineNo">8242</span><a name="line.8242"></a>
-<span class="sourceLineNo">8243</span>  @Override<a name="line.8243"></a>
-<span class="sourceLineNo">8244</span>  public long heapSize() {<a name="line.8244"></a>
-<span class="sourceLineNo">8245</span>    // this does not take into account row locks, recent flushes, mvcc entries, and more<a name="line.8245"></a>
-<span class="sourceLineNo">8246</span>    return DEEP_OVERHEAD + stores.values().stream().mapToLong(HStore::heapSize).sum();<a name="line.8246"></a>
-<span class="sourceLineNo">8247</span>  }<a name="line.8247"></a>
-<span class="sourceLineNo">8248</span><a name="line.8248"></a>
-<span class="sourceLineNo">8249</span>  /**<a name="line.8249"></a>
-<span class="sourceLineNo">8250</span>   * Registers a new protocol buffer {@link Service} subclass as a coprocessor endpoint to<a name="line.8250"></a>
-<span class="sourceLineNo">8251</span>   * be available for handling Region#execService(com.google.protobuf.RpcController,<a name="line.8251"></a>
-<span class="sourceLineNo">8252</span>   *    org.apache.hadoop.hbase.protobuf.generated.ClientProtos.CoprocessorServiceCall) calls.<a name="line.8252"></a>
-<span class="sourceLineNo">8253</span>   *<a name="line.8253"></a>
-<span class="sourceLineNo">8254</span>   * &lt;p&gt;<a name="line.8254"></a>
-<span class="sourceLineNo">8255</span>   * Only a single instance may be registered per region for a given {@link Service} subclass (the<a name="line.8255"></a>
-<span class="sourceLineNo">8256</span>   * instances are keyed on {@link com.google.protobuf.Descriptors.ServiceDescriptor#getFullName()}.<a name="line.8256"></a>
-<span class="sourceLineNo">8257</span>   * After the first registration, subsequent calls with the same service name will fail with<a name="line.8257"></a>
-<span class="sourceLineNo">8258</span>   * a return value of {@code false}.<a name="line.8258"></a>
-<span class="sourceLineNo">8259</span>   * &lt;/p&gt;<a name="line.8259"></a>
-<span class="sourceLineNo">8260</span>   * @param instance the {@code Service} subclass instance to expose as a coprocessor endpoint<a name="line.8260"></a>
-<span class="sourceLineNo">8261</span>   * @return {@code true} if the registration was successful, {@code false}<a name="line.8261"></a>
-<span class="sourceLineNo">8262</span>   * otherwise<a name="line.8262"></a>
-<span class="sourceLineNo">8263</span>   */<a name="line.8263"></a>
-<span class="sourceLineNo">8264</span>  public boolean registerService(com.google.protobuf.Service instance) {<a name="line.8264"></a>
-<span class="sourceLineNo">8265</span>    /*<a name="line.8265"></a>
-<span class="sourceLineNo">8266</span>     * No stacking of instances is allowed for a single service name<a name="line.8266"></a>
-<span class="sourceLineNo">8267</span>     */<a name="line.8267"></a>
-<span class="sourceLineNo">8268</span>    com.google.protobuf.Descriptors.ServiceDescriptor serviceDesc = instance.getDescriptorForType();<a name="line.8268"></a>
-<span class="sourceLineNo">8269</span>    String serviceName = CoprocessorRpcUtils.getServiceName(serviceDesc);<a name="line.8269"></a>
-<span class="sourceLineNo">8270</span>    if (coprocessorServiceHandlers.containsKey(serviceName)) {<a name="line.8270"></a>
-<span class="sourceLineNo">8271</span>      LOG.error("Coprocessor service " + serviceName +<a name="line.8271"></a>
-<span class="sourceLineNo">8272</span>          " already registered, rejecting request from " + instance);<a name="line.8272"></a>
-<span class="sourceLineNo">8273</span>      return false;<a name="line.8273"></a>
-<span class="sourceLineNo">8274</span>    }<a name="line.8274"></a>
-<span class="sourceLineNo">8275</span><a name="line.8275"></a>
-<span class="sourceLineNo">8276</span>    coprocessorServiceHandlers.put(serviceName, instance);<a name="line.8276"></a>
-<span class="sourceLineNo">8277</span>    if (LOG.isDebugEnabled()) {<a name="line.8277"></a>
-<span class="sourceLineNo">8278</span>      LOG.debug("Registered coprocessor service: region=" +<a name="line.8278"></a>
-<span class="sourceLineNo">8279</span>          Bytes.toStringBinary(getRegionInfo().getRegionName()) +<a name="line.8279"></a>
-<span class="sourceLineNo">8280</span>          " service=" + serviceName);<a name="line.8280"></a>
-<span class="sourceLineNo">8281</span>    }<a name="line.8281"></a>
-<span class="sourceLineNo">8282</span>    return true;<a name="line.8282"></a>
-<span class="sourceLineNo">8283</span>  }<a name="line.8283"></a>
-<span class="sourceLineNo">8284</span><a name="line.8284"></a>
-<span class="sourceLineNo">8285</span>  /**<a name="line.8285"></a>
-<span class="sourceLineNo">8286</span>   * Executes a single protocol buffer coprocessor endpoint {@link Service} method using<a name="line.8286"></a>
-<span class="sourceLineNo">8287</span>   * the registered protocol handlers.  {@link Service} implementations must be registered via the<a name="line.8287"></a>
-<span class="sourceLineNo">8288</span>   * {@link #registerService(com.google.protobuf.Service)}<a name="line.8288"></a>
-<span class="sourceLineNo">8289</span>   * method before they are available.<a name="line.8289"></a>
-<span class="sourceLineNo">8290</span>   *<a name="line.8290"></a>
-<span class="sourceLineNo">8291</span>   * @param controller an {@code RpcContoller} implementation to pass to the invoked service<a name="line.8291"></a>
-<span class="sourceLineNo">8292</span>   * @param call a {@code CoprocessorServiceCall} instance identifying the service, method,<a name="line.8292"></a>
-<span class="sourceLineNo">8293</span>   *     and parameters for the method invocation<a name="line.8293"></a>
-<span class="sourceLineNo">8294</span>   * @return a protocol buffer {@code Message} instance containing the method's result<a name="line.8294"></a>
-<span class="sourceLineNo">8295</span>   * @throws IOException if no registered service handler is found or an error<a name="line.8295"></a>
-<span class="sourceLineNo">8296</span>   *     occurs during the invocation<a name="line.8296"></a>
-<span class="sourceLineNo">8297</span>   * @see #registerService(com.google.protobuf.Service)<a name="line.8297"></a>
-<span class="sourceLineNo">8298</span>   */<a name="line.8298"></a>
-<span class="sourceLineNo">8299</span>  public com.google.protobuf.Message execService(com.google.protobuf.RpcController controller,<a name="line.8299"></a>
-<span class="sourceLineNo">8300</span>      CoprocessorServiceCall call) throws IOException {<a name="line.8300"></a>
-<span class="sourceLineNo">8301</span>    String serviceName = call.getServiceName();<a name="line.8301"></a>
-<span class="sourceLineNo">8302</span>    com.google.protobuf.Service service = coprocessorServiceHandlers.get(serviceName);<a name="line.8302"></a>
-<span class="sourceLineNo">8303</span>    if (service == null) {<a name="line.8303"></a>
-<span class="sourceLineNo">8304</span>      throw new UnknownProtocolException(null, "No registered coprocessor service found for " +<a name="line.8304"></a>
-<span class="sourceLineNo">8305</span>          serviceName + " in region " + Bytes.toStringBinary(getRegionInfo().getRegionName()));<a name="line.8305"></a>
-<span class="sourceLineNo">8306</span>    }<a name="line.8306"></a>
-<span class="sourceLineNo">8307</span>    com.google.protobuf.Descriptors.ServiceDescriptor serviceDesc = service.getDescriptorForType();<a name="line.8307"></a>
-<span class="sourceLineNo">8308</span><a name="line.8308"></a>
-<span class="sourceLineNo">8309</span>    cpRequestsCount.increment();<a name="line.8309"></a>
-<span class="sourceLineNo">8310</span>    String methodName = call.getMethodName();<a name="line.8310"></a>
-<span class="sourceLineNo">8311</span>    com.google.protobuf.Descriptors.MethodDescriptor methodDesc =<a name="line.8311"></a>
-<span class="sourceLineNo">8312</span>        CoprocessorRpcUtils.getMethodDescriptor(methodName, serviceDesc);<a name="line.8312"></a>
+<span class="sourceLineNo">8125</span>      cellPairs.add(new Pair&lt;&gt;(currentValue, newCell));<a name="line.8125"></a>
+<span class="sourceLineNo">8126</span>      // Add to results to get returned to the Client. If null, cilent does not want results.<a name="line.8126"></a>
+<span class="sourceLineNo">8127</span>      if (results != null) {<a name="line.8127"></a>
+<span class="sourceLineNo">8128</span>        results.add(newCell);<a name="line.8128"></a>
+<span class="sourceLineNo">8129</span>      }<a name="line.8129"></a>
+<span class="sourceLineNo">8130</span>    }<a name="line.8130"></a>
+<span class="sourceLineNo">8131</span><a name="line.8131"></a>
+<span class="sourceLineNo">8132</span>    // Give coprocessors a chance to update the new cells before apply to WAL or memstore<a name="line.8132"></a>
+<span class="sourceLineNo">8133</span>    if (coprocessorHost != null) {<a name="line.8133"></a>
+<span class="sourceLineNo">8134</span>      // Here the operation must be increment or append.<a name="line.8134"></a>
+<span class="sourceLineNo">8135</span>      cellPairs = op == Operation.INCREMENT ?<a name="line.8135"></a>
+<span class="sourceLineNo">8136</span>          coprocessorHost.postIncrementBeforeWAL(mutation, cellPairs) :<a name="line.8136"></a>
+<span class="sourceLineNo">8137</span>          coprocessorHost.postAppendBeforeWAL(mutation, cellPairs);<a name="line.8137"></a>
+<span class="sourceLineNo">8138</span>    }<a name="line.8138"></a>
+<span class="sourceLineNo">8139</span>    return cellPairs.stream().map(Pair::getSecond).collect(Collectors.toList());<a name="line.8139"></a>
+<span class="sourceLineNo">8140</span>  }<a name="line.8140"></a>
+<span class="sourceLineNo">8141</span><a name="line.8141"></a>
+<span class="sourceLineNo">8142</span>  private static Cell reckonDelta(final Cell delta, final Cell currentCell,<a name="line.8142"></a>
+<span class="sourceLineNo">8143</span>                                  final byte[] columnFamily, final long now,<a name="line.8143"></a>
+<span class="sourceLineNo">8144</span>                                  Mutation mutation, Function&lt;Cell, byte[]&gt; supplier) throws IOException {<a name="line.8144"></a>
+<span class="sourceLineNo">8145</span>    // Forward any tags found on the delta.<a name="line.8145"></a>
+<span class="sourceLineNo">8146</span>    List&lt;Tag&gt; tags = TagUtil.carryForwardTags(delta);<a name="line.8146"></a>
+<span class="sourceLineNo">8147</span>    tags = TagUtil.carryForwardTTLTag(tags, mutation.getTTL());<a name="line.8147"></a>
+<span class="sourceLineNo">8148</span>    if (currentCell != null) {<a name="line.8148"></a>
+<span class="sourceLineNo">8149</span>      tags = TagUtil.carryForwardTags(tags, currentCell);<a name="line.8149"></a>
+<span class="sourceLineNo">8150</span>      byte[] newValue = supplier.apply(currentCell);<a name="line.8150"></a>
+<span class="sourceLineNo">8151</span>      return ExtendedCellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.8151"></a>
+<span class="sourceLineNo">8152</span>              .setRow(mutation.getRow(), 0, mutation.getRow().length)<a name="line.8152"></a>
+<span class="sourceLineNo">8153</span>              .setFamily(columnFamily, 0, columnFamily.length)<a name="line.8153"></a>
+<span class="sourceLineNo">8154</span>              // copy the qualifier if the cell is located in shared memory.<a name="line.8154"></a>
+<span class="sourceLineNo">8155</span>              .setQualifier(CellUtil.cloneQualifier(delta))<a name="line.8155"></a>
+<span class="sourceLineNo">8156</span>              .setTimestamp(Math.max(currentCell.getTimestamp() + 1, now))<a name="line.8156"></a>
+<span class="sourceLineNo">8157</span>              .setType(KeyValue.Type.Put.getCode())<a name="line.8157"></a>
+<span class="sourceLineNo">8158</span>              .setValue(newValue, 0, newValue.length)<a name="line.8158"></a>
+<span class="sourceLineNo">8159</span>              .setTags(TagUtil.fromList(tags))<a name="line.8159"></a>
+<span class="sourceLineNo">8160</span>              .build();<a name="line.8160"></a>
+<span class="sourceLineNo">8161</span>    } else {<a name="line.8161"></a>
+<span class="sourceLineNo">8162</span>      PrivateCellUtil.updateLatestStamp(delta, now);<a name="line.8162"></a>
+<span class="sourceLineNo">8163</span>      return CollectionUtils.isEmpty(tags) ? delta : PrivateCellUtil.createCell(delta, tags);<a name="line.8163"></a>
+<span class="sourceLineNo">8164</span>    }<a name="line.8164"></a>
+<span class="sourceLineNo">8165</span>  }<a name="line.8165"></a>
+<span class="sourceLineNo">8166</span><a name="line.8166"></a>
+<span class="sourceLineNo">8167</span>  /**<a name="line.8167"></a>
+<span class="sourceLineNo">8168</span>   * @return Get the long out of the passed in Cell<a name="line.8168"></a>
+<span class="sourceLineNo">8169</span>   */<a name="line.8169"></a>
+<span class="sourceLineNo">8170</span>  private static long getLongValue(final Cell cell) throws DoNotRetryIOException {<a name="line.8170"></a>
+<span class="sourceLineNo">8171</span>    int len = cell.getValueLength();<a name="line.8171"></a>
+<span class="sourceLineNo">8172</span>    if (len != Bytes.SIZEOF_LONG) {<a name="line.8172"></a>
+<span class="sourceLineNo">8173</span>      // throw DoNotRetryIOException instead of IllegalArgumentException<a name="line.8173"></a>
+<span class="sourceLineNo">8174</span>      throw new DoNotRetryIOException("Field is not a long, it's " + len + " bytes wide");<a name="line.8174"></a>
+<span class="sourceLineNo">8175</span>    }<a name="line.8175"></a>
+<span class="sourceLineNo">8176</span>    return PrivateCellUtil.getValueAsLong(cell);<a name="line.8176"></a>
+<span class="sourceLineNo">8177</span>  }<a name="line.8177"></a>
+<span class="sourceLineNo">8178</span><a name="line.8178"></a>
+<span class="sourceLineNo">8179</span>  /**<a name="line.8179"></a>
+<span class="sourceLineNo">8180</span>   * Do a specific Get on passed &lt;code&gt;columnFamily&lt;/code&gt; and column qualifiers.<a name="line.8180"></a>
+<span class="sourceLineNo">8181</span>   * @param mutation Mutation we are doing this Get for.<a name="line.8181"></a>
+<span class="sourceLineNo">8182</span>   * @param store Which column family on row (TODO: Go all Gets in one go)<a name="line.8182"></a>
+<span class="sourceLineNo">8183</span>   * @param coordinates Cells from &lt;code&gt;mutation&lt;/code&gt; used as coordinates applied to Get.<a name="line.8183"></a>
+<span class="sourceLineNo">8184</span>   * @return Return list of Cells found.<a name="line.8184"></a>
+<span class="sourceLineNo">8185</span>   */<a name="line.8185"></a>
+<span class="sourceLineNo">8186</span>  private List&lt;Cell&gt; get(Mutation mutation, HStore store, List&lt;Cell&gt; coordinates,<a name="line.8186"></a>
+<span class="sourceLineNo">8187</span>      IsolationLevel isolation, TimeRange tr) throws IOException {<a name="line.8187"></a>
+<span class="sourceLineNo">8188</span>    // Sort the cells so that they match the order that they appear in the Get results. Otherwise,<a name="line.8188"></a>
+<span class="sourceLineNo">8189</span>    // we won't be able to find the existing values if the cells are not specified in order by the<a name="line.8189"></a>
+<span class="sourceLineNo">8190</span>    // client since cells are in an array list.<a name="line.8190"></a>
+<span class="sourceLineNo">8191</span>    // TODO: I don't get why we are sorting. St.Ack 20150107<a name="line.8191"></a>
+<span class="sourceLineNo">8192</span>    sort(coordinates, store.getComparator());<a name="line.8192"></a>
+<span class="sourceLineNo">8193</span>    Get get = new Get(mutation.getRow());<a name="line.8193"></a>
+<span class="sourceLineNo">8194</span>    if (isolation != null) {<a name="line.8194"></a>
+<span class="sourceLineNo">8195</span>      get.setIsolationLevel(isolation);<a name="line.8195"></a>
+<span class="sourceLineNo">8196</span>    }<a name="line.8196"></a>
+<span class="sourceLineNo">8197</span>    for (Cell cell: coordinates) {<a name="line.8197"></a>
+<span class="sourceLineNo">8198</span>      get.addColumn(store.getColumnFamilyDescriptor().getName(), CellUtil.cloneQualifier(cell));<a name="line.8198"></a>
+<span class="sourceLineNo">8199</span>    }<a name="line.8199"></a>
+<span class="sourceLineNo">8200</span>    // Increments carry time range. If an Increment instance, put it on the Get.<a name="line.8200"></a>
+<span class="sourceLineNo">8201</span>    if (tr != null) {<a name="line.8201"></a>
+<span class="sourceLineNo">8202</span>      get.setTimeRange(tr.getMin(), tr.getMax());<a name="line.8202"></a>
+<span class="sourceLineNo">8203</span>    }<a name="line.8203"></a>
+<span class="sourceLineNo">8204</span>    return get(get, false);<a name="line.8204"></a>
+<span class="sourceLineNo">8205</span>  }<a name="line.8205"></a>
+<span class="sourceLineNo">8206</span><a name="line.8206"></a>
+<span class="sourceLineNo">8207</span>  /**<a name="line.8207"></a>
+<span class="sourceLineNo">8208</span>   * @return Sorted list of &lt;code&gt;cells&lt;/code&gt; using &lt;code&gt;comparator&lt;/code&gt;<a name="line.8208"></a>
+<span class="sourceLineNo">8209</span>   */<a name="line.8209"></a>
+<span class="sourceLineNo">8210</span>  private static List&lt;Cell&gt; sort(List&lt;Cell&gt; cells, final CellComparator comparator) {<a name="line.8210"></a>
+<span class="sourceLineNo">8211</span>    cells.sort(comparator);<a name="line.8211"></a>
+<span class="sourceLineNo">8212</span>    return cells;<a name="line.8212"></a>
+<span class="sourceLineNo">8213</span>  }<a name="line.8213"></a>
+<span class="sourceLineNo">8214</span><a name="line.8214"></a>
+<span class="sourceLineNo">8215</span>  public static final long FIXED_OVERHEAD = ClassSize.align(<a name="line.8215"></a>
+<span class="sourceLineNo">8216</span>      ClassSize.OBJECT +<a name="line.8216"></a>
+<span class="sourceLineNo">8217</span>      ClassSize.ARRAY +<a name="line.8217"></a>
+<span class="sourceLineNo">8218</span>      55 * ClassSize.REFERENCE + 3 * Bytes.SIZEOF_INT +<a name="line.8218"></a>
+<span class="sourceLineNo">8219</span>      (15 * Bytes.SIZEOF_LONG) +<a name="line.8219"></a>
+<span class="sourceLineNo">8220</span>      3 * Bytes.SIZEOF_BOOLEAN);<a name="line.8220"></a>
+<span class="sourceLineNo">8221</span><a name="line.8221"></a>
+<span class="sourceLineNo">8222</span>  // woefully out of date - currently missing:<a name="line.8222"></a>
+<span class="sourceLineNo">8223</span>  // 1 x HashMap - coprocessorServiceHandlers<a name="line.8223"></a>
+<span class="sourceLineNo">8224</span>  // 6 x LongAdder - numMutationsWithoutWAL, dataInMemoryWithoutWAL,<a name="line.8224"></a>
+<span class="sourceLineNo">8225</span>  //   checkAndMutateChecksPassed, checkAndMutateChecksFailed, readRequestsCount,<a name="line.8225"></a>
+<span class="sourceLineNo">8226</span>  //   writeRequestsCount, cpRequestsCount<a name="line.8226"></a>
+<span class="sourceLineNo">8227</span>  // 1 x HRegion$WriteState - writestate<a name="line.8227"></a>
+<span class="sourceLineNo">8228</span>  // 1 x RegionCoprocessorHost - coprocessorHost<a name="line.8228"></a>
+<span class="sourceLineNo">8229</span>  // 1 x RegionSplitPolicy - splitPolicy<a name="line.8229"></a>
+<span class="sourceLineNo">8230</span>  // 1 x MetricsRegion - metricsRegion<a name="line.8230"></a>
+<span class="sourceLineNo">8231</span>  // 1 x MetricsRegionWrapperImpl - metricsRegionWrapper<a name="line.8231"></a>
+<span class="sourceLineNo">8232</span>  public static final long DEEP_OVERHEAD = FIXED_OVERHEAD +<a name="line.8232"></a>
+<span class="sourceLineNo">8233</span>      ClassSize.OBJECT + // closeLock<a name="line.8233"></a>
+<span class="sourceLineNo">8234</span>      (2 * ClassSize.ATOMIC_BOOLEAN) + // closed, closing<a name="line.8234"></a>
+<span class="sourceLineNo">8235</span>      (3 * ClassSize.ATOMIC_LONG) + // numPutsWithoutWAL, dataInMemoryWithoutWAL,<a name="line.8235"></a>
+<span class="sourceLineNo">8236</span>                                    // compactionsFailed<a name="line.8236"></a>
+<span class="sourceLineNo">8237</span>      (2 * ClassSize.CONCURRENT_HASHMAP) +  // lockedRows, scannerReadPoints<a name="line.8237"></a>
+<span class="sourceLineNo">8238</span>      WriteState.HEAP_SIZE + // writestate<a name="line.8238"></a>
+<span class="sourceLineNo">8239</span>      ClassSize.CONCURRENT_SKIPLISTMAP + ClassSize.CONCURRENT_SKIPLISTMAP_ENTRY + // stores<a name="line.8239"></a>
+<span class="sourceLineNo">8240</span>      (2 * ClassSize.REENTRANT_LOCK) + // lock, updatesLock<a name="line.8240"></a>
+<span class="sourceLineNo">8241</span>      MultiVersionConcurrencyControl.FIXED_SIZE // mvcc<a name="line.8241"></a>
+<span class="sourceLineNo">8242</span>      + 2 * ClassSize.TREEMAP // maxSeqIdInStores, replicationScopes<a name="line.8242"></a>
+<span class="sourceLineNo">8243</span>      + 2 * ClassSize.ATOMIC_INTEGER // majorInProgress, minorInProgress<a name="line.8243"></a>
+<span class="sourceLineNo">8244</span>      + ClassSize.STORE_SERVICES // store services<a name="line.8244"></a>
+<span class="sourceLineNo">8245</span>      + StoreHotnessProtector.FIXED_SIZE<a name="line.8245"></a>
+<span class="sourceLineNo">8246</span>      ;<a name="line.8246"></a>
+<span class="sourceLineNo">8247</span><a name="line.8247"></a>
+<span class="sourceLineNo">8248</span>  @Override<a name="line.8248"></a>
+<span class="sourceLineNo">8249</span>  public long heapSize() {<a name="line.8249"></a>
+<span class="sourceLineNo">8250</span>    // this does not take into account row locks, recent flushes, mvcc entries, and more<a name="line.8250"></a>
+<span class="sourceLineNo">8251</span>    return DEEP_OVERHEAD + stores.values().stream().mapToLong(HStore::heapSize).sum();<a name="line.8251"></a>
+<span class="sourceLineNo">8252</span>  }<a name="line.8252"></a>
+<span class="sourceLineNo">8253</span><a name="line.8253"></a>
+<span class="sourceLineNo">8254</span>  /**<a name="line.8254"></a>
+<span class="sourceLineNo">8255</span>   * Registers a new protocol buffer {@link Service} subclass as a coprocessor endpoint to<a name="line.8255"></a>
+<span class="sourceLineNo">8256</span>   * be available for handling Region#execService(com.google.protobuf.RpcController,<a name="line.8256"></a>
+<span class="sourceLineNo">8257</span>   *    org.apache.hadoop.hbase.protobuf.generated.ClientProtos.CoprocessorServiceCall) calls.<a name="line.8257"></a>
+<span class="sourceLineNo">8258</span>   *<a name="line.8258"></a>
+<span class="sourceLineNo">8259</span>   * &lt;p&gt;<a name="line.8259"></a>
+<span class="sourceLineNo">8260</span>   * Only a single instance may be registered per region for a given {@link Service} subclass (the<a name="line.8260"></a>
+<span class="sourceLineNo">8261</span>   * instances are keyed on {@link com.google.protobuf.Descriptors.ServiceDescriptor#getFullName()}.<a name="line.8261"></a>
+<span class="sourceLineNo">8262</span>   * After the first registration, subsequent calls with the same service name will fail with<a name="line.8262"></a>
+<span class="sourceLineNo">8263</span>   * a return value of {@code false}.<a name="line.8263"></a>
+<span class="sourceLineNo">8264</span>   * &lt;/p&gt;<a name="line.8264"></a>
+<span class="sourceLineNo">8265</span>   * @param instance the {@code Service} subclass instance to expose as a coprocessor endpoint<a name="line.8265"></a>
+<span class="sourceLineNo">8266</span>   * @return {@code true} if the registration was successful, {@code false}<a name="line.8266"></a>
+<span class="sourceLineNo">8267</span>   * otherwise<a name="line.8267"></a>
+<span class="sourceLineNo">8268</span>   */<a name="line.8268"></a>
+<span class="sourceLineNo">8269</span>  public boolean registerService(com.google.protobuf.Service instance) {<a name="line.8269"></a>
+<span class="sourceLineNo">8270</span>    /*<a name="line.8270"></a>
+<span class="sourceLineNo">8271</span>     * No stacking of instances is allowed for a single service name<a name="line.8271"></a>
+<span class="sourceLineNo">8272</span>     */<a name="line.8272"></a>
+<span class="sourceLineNo">8273</span>    com.google.protobuf.Descriptors.ServiceDescriptor serviceDesc = instance.getDescriptorForType();<a name="line.8273"></a>
+<span class="sourceLineNo">8274</span>    String serviceName = CoprocessorRpcUtils.getServiceName(serviceDesc);<a name="line.8274"></a>
+<span class="sourceLineNo">8275</span>    if (coprocessorServiceHandlers.containsKey(serviceName)) {<a name="line.8275"></a>
+<span class="sourceLineNo">8276</span>      LOG.error("Coprocessor service " + serviceName +<a name="line.8276"></a>
+<span class="sourceLineNo">8277</span>          " already registered, rejecting request from " + instance);<a name="line.8277"></a>
+<span class="sourceLineNo">8278</span>      return false;<a name="line.8278"></a>
+<span class="sourceLineNo">8279</span>    }<a name="line.8279"></a>
+<span class="sourceLineNo">8280</span><a name="line.8280"></a>
+<span class="sourceLineNo">8281</span>    coprocessorServiceHandlers.put(serviceName, instance);<a name="line.8281"></a>
+<span class="sourceLineNo">8282</span>    if (LOG.isDebugEnabled()) {<a name="line.8282"></a>
+<span class="sourceLineNo">8283</span>      LOG.debug("Registered coprocessor service: region=" +<a name="line.8283"></a>
+<span class="sourceLineNo">8284</span>          Bytes.toStringBinary(getRegionInfo().getRegionName()) +<a name="line.8284"></a>
+<span class="sourceLineNo">8285</span>          " service=" + serviceName);<a name="line.8285"></a>
+<span class="sourceLineNo">8286</span>    }<a name="line.8286"></a>
+<span class="sourceLineNo">8287</span>    return true;<a name="line.8287"></a>
+<span class="sourceLineNo">8288</span>  }<a name="line.8288"></a>
+<span class="sourceLineNo">8289</span><a name="line.8289"></a>
+<span class="sourceLineNo">8290</span>  /**<a name="line.8290"></a>
+<span class="sourceLineNo">8291</span>   * Executes a single protocol buffer coprocessor endpoint {@link Service} method using<a name="line.8291"></a>
+<span class="sourceLineNo">8292</span>   * the registered protocol handlers.  {@link Service} implementations must be registered via the<a name="line.8292"></a>
+<span class="sourceLineNo">8293</span>   * {@link #registerService(com.google.protobuf.Service)}<a name="line.8293"></a>
+<span class="sourceLineNo">8294</span>   * method before they are available.<a name="line.8294"></a>
+<span class="sourceLineNo">8295</span>   *<a name="line.8295"></a>
+<span class="sourceLineNo">8296</span>   * @param controller an {@code RpcContoller} implementation to pass to the invoked service<a name="line.8296"></a>
+<span class="sourceLineNo">8297</span>   * @param call a {@code CoprocessorServiceCall} instance identifying the service, method,<a name="line.8297"></a>
+<span class="sourceLineNo">8298</span>   *     and parameters for the method invocation<a name="line.8298"></a>
+<span class="sourceLineNo">8299</span>   * @return a protocol buffer {@code Message} instance containing the method's result<a name="line.8299"></a>
+<span class="sourceLineNo">8300</span>   * @throws IOException if no registered service handler is found or an error<a name="line.8300"></a>
+<span class="sourceLineNo">8301</span>   *     occurs during the invocation<a name="line.8301"></a>
+<span class="sourceLineNo">8302</span>   * @see #registerService(com.google.protobuf.Service)<a name="line.8302"></a>
+<span class="sourceLineNo">8303</span>   */<a name="line.8303"></a>
+<span class="sourceLineNo">8304</span>  public com.google.protobuf.Message execService(com.google.protobuf.RpcController controller,<a name="line.8304"></a>
+<span class="sourceLineNo">8305</span>      CoprocessorServiceCall call) throws IOException {<a name="line.8305"></a>
+<span class="sourceLineNo">8306</span>    String serviceName = call.getServiceName();<a name="line.8306"></a>
+<span class="sourceLineNo">8307</span>    com.google.protobuf.Service service = coprocessorServiceHandlers.get(serviceName);<a name="line.8307"></a>
+<span class="sourceLineNo">8308</span>    if (service == null) {<a name="line.8308"></a>
+<span class="sourceLineNo">8309</span>      throw new UnknownProtocolException(null, "No registered coprocessor service found for " +<a name="line.8309"></a>
+<span class="sourceLineNo">8310</span>          serviceName + " in region " + Bytes.toStringBinary(getRegionInfo().getRegionName()));<a name="line.8310"></a>
+<span class="sourceLineNo">8311</span>    }<a name="line.8311"></a>
+<span class="sourceLineNo">8312</span>    com.google.protobuf.Descriptors.ServiceDescriptor serviceDesc = service.getDescriptorForType();<a name="line.8312"></a>
 <span class="sourceLineNo">8313</span><a name="line.8313"></a>
-<span class="sourceLineNo">8314</span>    com.google.protobuf.Message.Builder builder =<a name="line.8314"></a>
-<span class="sourceLineNo">8315</span>        service.getRequestPrototype(methodDesc).newBuilderForType();<a name="line.8315"></a>
-<span class="sourceLineNo">8316</span><a name="line.8316"></a>
-<span class="sourceLineNo">8317</span>    org.apache.hadoop.hbase.protobuf.ProtobufUtil.mergeFrom(builder,<a name="line.8317"></a>
-<span class="sourceLineNo">8318</span>        call.getRequest().toByteArray());<a name="line.8318"></a>
-<span class="sourceLineNo">8319</span>    com.google.protobuf.Message request =<a name="line.8319"></a>
-<span class="sourceLineNo">8320</span>        CoprocessorRpcUtils.getRequest(service, methodDesc, call.getRequest());<a name="line.8320"></a>
+<span class="sourceLineNo">8314</span>    cpRequestsCount.increment();<a name="line.8314"></a>
+<span class="sourceLineNo">8315</span>    String methodName = call.getMethodName();<a name="line.8315"></a>
+<span class="sourceLineNo">8316</span>    com.google.protobuf.Descriptors.MethodDescriptor methodDesc =<a name="line.8316"></a>
+<span class="sourceLineNo">8317</span>        CoprocessorRpcUtils.getMethodDescriptor(methodName, serviceDesc);<a name="line.8317"></a>
+<span class="sourceLineNo">8318</span><a name="line.8318"></a>
+<span class="sourceLineNo">8319</span>    com.google.protobuf.Message.Builder builder =<a name="line.8319"></a>
+<span class="sourceLineNo">8320</span>        service.getRequestPrototype(methodDesc).newBuilderForType();<a name="line.8320"></a>
 <span class="sourceLineNo">8321</span><a name="line.8321"></a>
-<span class="sourceLineNo">8322</span>    if (coprocessorHost != null) {<a name="line.8322"></a>
-<span class="sourceLineNo">8323</span>      request = coprocessorHost.preEndpointInvocation(service, methodName, request);<a name="line.8323"></a>
-<span class="sourceLineNo">8324</span>    }<a name="line.8324"></a>
-<span class="sourceLineNo">8325</span><a name="line.8325"></a>
-<span class="sourceLineNo">8326</span>    final com.google.protobuf.Message.Builder responseBuilder =<a name="line.8326"></a>
-<span class="sourceLineNo">8327</span>        service.getResponsePrototype(methodDesc).newBuilderForType();<a name="line.8327"></a>
-<span class="sourceLineNo">8328</span>    service.callMethod(methodDesc, controller, request,<a name="line.8328"></a>
-<span class="sourceLineNo">8329</span>        new com.google.protobuf.RpcCallback&lt;com.google.protobuf.Message&gt;() {<a name="line.8329"></a>
-<span class="sourceLineNo">8330</span>      @Override<a name="line.8330"></a>
-<span class="sourceLineNo">8331</span>      public void run(com.google.protobuf.Message message) {<a name="line.8331"></a>
-<span class="sourceLineNo">8332</span>        if (message != null) {<a name="line.8332"></a>
-<span class="sourceLineNo">8333</span>          responseBuilder.mergeFrom(message);<a name="line.8333"></a>
-<span class="sourceLineNo">8334</span>        }<a name="line.8334"></a>
-<span class="sourceLineNo">8335</span>      }<a name="line.8335"></a>
-<span class="sourceLineNo">8336</span>    });<a name="line.8336"></a>
-<span class="sourceLineNo">8337</span><a name="line.8337"></a>
-<span class="sourceLineNo">8338</span>    if (coprocessorHost != null) {<a name="line.8338"></a>
-<span class="sourceLineNo">8339</span>      coprocessorHost.postEndpointInvocation(service, methodName, request, responseBuilder);<a name="line.8339"></a>
-<span class="sourceLineNo">8340</span>    }<a name="line.8340"></a>
-<span class="sourceLineNo">8341</span>    IOException exception =<a name="line.8341"></a>
-<span class="sourceLineNo">8342</span>        org.apache.hadoop.hbase.ipc.CoprocessorRpcUtils.getControllerException(controller);<a name="line.8342"></a>
-<span class="sourceLineNo">8343</span>    if (exception != null) {<a name="line.8343"></a>
-<span class="sourceLineNo">8344</span>      throw exception;<a name="line.8344"></a>
+<span class="sourceLineNo">8322</span>    org.apache.hadoop.hbase.protobuf.ProtobufUtil.mergeFrom(builder,<a name="line.8322"></a>
+<span class="sourceLineNo">8323</span>        call.getRequest().toByteArray());<a name="line.8323"></a>
+<span class="sourceLineNo">8324</span>    com.google.protobuf.Message request =<a name="line.8324"></a>
+<span class="sourceLineNo">8325</span>        CoprocessorRpcUtils.getRequest(service, methodDesc, call.getRequest());<a name="line.8325"></a>
+<span class="sourceLineNo">8326</span><a name="line.8326"></a>
+<span class="sourceLineNo">8327</span>    if (coprocessorHost != null) {<a name="line.8327"></a>
+<span class="sourceLineNo">8328</span>      request = coprocessorHost.preEndpointInvocation(service, methodName, request);<a name="line.8328"></a>
+<span class="sourceLineNo">8329</span>    }<a name="line.8329"></a>
+<span class="sourceLineNo">8330</span><a name="line.8330"></a>
+<span class="sourceLineNo">8331</span>    final com.google.protobuf.Message.Builder responseBuilder =<a name="line.8331"></a>
+<span class="sourceLineNo">8332</span>        service.getResponsePrototype(methodDesc).newBuilderForType();<a name="line.8332"></a>
+<span class="sourceLineNo">8333</span>    service.callMethod(methodDesc, controller, request,<a name="line.8333"></a>
+<span class="sourceLineNo">8334</span>        new com.google.protobuf.RpcCallback&lt;com.google.protobuf.Message&gt;() {<a name="line.8334"></a>
+<span class="sourceLineNo">8335</span>      @Override<a name="line.8335"></a>
+<span class="sourceLineNo">8336</span>      public void run(com.google.protobuf.Message message) {<a name="line.8336"></a>
+<span class="sourceLineNo">8337</span>        if (message != null) {<a name="line.8337"></a>
+<span class="sourceLineNo">8338</span>          responseBuilder.mergeFrom(message);<a name="line.8338"></a>
+<span class="sourceLineNo">8339</span>        }<a name="line.8339"></a>
+<span class="sourceLineNo">8340</span>      }<a name="line.8340"></a>
+<span class="sourceLineNo">8341</span>    });<a name="line.8341"></a>
+<span class="sourceLineNo">8342</span><a name="line.8342"></a>
+<span class="sourceLineNo">8343</span>    if (coprocessorHost != null) {<a name="line.8343"></a>
+<span class="sourceLineNo">8344</span>      coprocessorHost.postEndpointInvocation(service, methodName, request, responseBuilder);<a name="line.8344"></a>
 <span class="sourceLineNo">8345</span>    }<a name="line.8345"></a>
-<span class="sourceLineNo">8346</span><a name="line.8346"></a>
-<span class="sourceLineNo">8347</span>    return responseBuilder.build();<a name="line.8347"></a>
-<span class="sourceLineNo">8348</span>  }<a name="line.8348"></a>
-<span class="sourceLineNo">8349</span><a name="line.8349"></a>
-<span class="sourceLineNo">8350</span>  boolean shouldForceSplit() {<a name="line.8350"></a>
-<span class="sourceLineNo">8351</span>    return this.splitRequest;<a name="line.8351"></a>
-<span class="sourceLineNo">8352</span>  }<a name="line.8352"></a>
-<span class="sourceLineNo">8353</span><a name="line.8353"></a>
-<span class="sourceLineNo">8354</span>  byte[] getExplicitSplitPoint() {<a name="line.8354"></a>
-<span class="sourceLineNo">8355</span>    return this.explicitSplitPoint;<a name="line.8355"></a>
-<span class="sourceLineNo">8356</span>  }<a name="line.8356"></a>
-<span class="sourceLineNo">8357</span><a name="line.8357"></a>
-<span class="sourceLineNo">8358</span>  void forceSplit(byte[] sp) {<a name="line.8358"></a>
-<span class="sourceLineNo">8359</span>    // This HRegion will go away after the forced split is successful<a name="line.8359"></a>
-<span class="sourceLineNo">8360</span>    // But if a forced split fails, we need to clear forced split.<a name="line.8360"></a>
-<span class="sourceLineNo">8361</span>    this.splitRequest = true;<a name="line.8361"></a>
-<span class="sourceLineNo">8362</span>    if (sp != null) {<a name="line.8362"></a>
-<span class="sourceLineNo">8363</span>      this.explicitSplitPoint = sp;<a name="line.8363"></a>
-<span class="sourceLineNo">8364</span>    }<a name="line.8364"></a>
-<span class="sourceLineNo">8365</span>  }<a name="line.8365"></a>
-<span class="sourceLineNo">8366</span><a name="line.8366"></a>
-<span class="sourceLineNo">8367</span>  void clearSplit() {<a name="line.8367"></a>
-<span class="sourceLineNo">8368</span>    this.splitRequest = false;<a name="line.8368"></a>
-<span class="sourceLineNo">8369</span>    this.explicitSplitPoint = null;<a name="line.8369"></a>
+<span class="sourceLineNo">8346</span>    IOException exception =<a name="line.8346"></a>
+<span class="sourceLineNo">8347</span>        org.apache.hadoop.hbase.ipc.CoprocessorRpcUtils.getControllerException(controller);<a name="line.8347"></a>
+<span class="sourceLineNo">8348</span>    if (exception != null) {<a name="line.8348"></a>
+<span class="sourceLineNo">8349</span>      throw exception;<a name="line.8349"></a>
+<span class="sourceLineNo">8350</span>    }<a name="line.8350"></a>
+<span class="sourceLineNo">8351</span><a name="line.8351"></a>
+<span class="sourceLineNo">8352</span>    return responseBuilder.build();<a name="line.8352"></a>
+<span class="sourceLineNo">8353</span>  }<a name="line.8353"></a>
+<span class="sourceLineNo">8354</span><a name="line.8354"></a>
+<span class="sourceLineNo">8355</span>  boolean shouldForceSplit() {<a name="line.8355"></a>
+<span class="sourceLineNo">8356</span>    return this.splitRequest;<a name="line.8356"></a>
+<span class="sourceLineNo">8357</span>  }<a name="line.8357"></a>
+<span class="sourceLineNo">8358</span><a name="line.8358"></a>
+<span class="sourceLineNo">8359</span>  byte[] getExplicitSplitPoint() {<a name="line.8359"></a>
+<span class="sourceLineNo">8360</span>    return this.explicitSplitPoint;<a name="line.8360"></a>
+<span class="sourceLineNo">8361</span>  }<a name="line.8361"></a>
+<span class="sourceLineNo">8362</span><a name="line.8362"></a>
+<span class="sourceLineNo">8363</span>  void forceSplit(byte[] sp) {<a name="line.8363"></a>
+<span class="sourceLineNo">8364</span>    // This HRegion will go away after the forced split is successful<a name="line.8364"></a>
+<span class="sourceLineNo">8365</span>    // But if a forced split fails, we need to clear forced split.<a name="line.8365"></a>
+<span class="sourceLineNo">8366</span>    this.splitRequest = true;<a name="line.8366"></a>
+<span class="sourceLineNo">8367</span>    if (sp != null) {<a name="line.8367"></a>
+<span class="sourceLineNo">8368</span>      this.explicitSplitPoint = sp;<a name="line.8368"></a>
+<span class="sourceLineNo">8369</span>    }<a name="line.8369"></a>
 <span class="sourceLineNo">8370</span>  }<a name="line.8370"></a>
 <span class="sourceLineNo">8371</span><a name="line.8371"></a>
-<span class="sourceLineNo">8372</span>  /**<a name="line.8372"></a>
-<span class="sourceLineNo">8373</span>   * Return the splitpoint. null indicates the region isn't splittable<a name="line.8373"></a>
-<span class="sourceLineNo">8374</span>   * If the splitpoint isn't explicitly specified, it will go over the stores<a name="line.8374"></a>
-<span class="sourceLineNo">8375</span>   * to find the best splitpoint. Currently the criteria of best splitpoint<a name="line.8375"></a>
-<span class="sourceLineNo">8376</span>   * is based on the size of the store.<a name="line.8376"></a>
-<span class="sourceLineNo">8377</span>   */<a name="line.8377"></a>
-<span class="sourceLineNo">8378</span>  public byte[] checkSplit() {<a name="line.8378"></a>
-<span class="sourceLineNo">8379</span>    // Can't split META<a name="line.8379"></a>
-<span class="sourceLineNo">8380</span>    if (this.getRegionInfo().isMetaRegion()) {<a name="line.8380"></a>
-<span class="sourceLineNo">8381</span>      if (shouldForceSplit()) {<a name="line.8381"></a>
-<span class="sourceLineNo">8382</span>        LOG.warn("Cannot split meta region in HBase 0.20 and above");<a name="line.8382"></a>
-<span class="sourceLineNo">8383</span>      }<a name="line.8383"></a>
-<span class="sourceLineNo">8384</span>      return null;<a name="line.8384"></a>
-<span class="sourceLineNo">8385</span>    }<a name="line.8385"></a>
-<span class="sourceLineNo">8386</span><a name="line.8386"></a>
-<span class="sourceLineNo">8387</span>    // Can't split a region that is closing.<a name="line.8387"></a>
-<span class="sourceLineNo">8388</span>    if (this.isClosing()) {<a name="line.8388"></a>
+<span class="sourceLineNo">8372</span>  void clearSplit() {<a name="line.8372"></a>
+<span class="sourceLineNo">8373</span>    this.splitRequest = false;<a name="line.8373"></a>
+<span class="sourceLineNo">8374</span>    this.explicitSplitPoint = null;<a name="line.8374"></a>
+<span class="sourceLineNo">8375</span>  }<a name="line.8375"></a>
+<span class="sourceLineNo">8376</span><a name="line.8376"></a>
+<span class="sourceLineNo">8377</span>  /**<a name="line.8377"></a>
+<span class="sourceLineNo">8378</span>   * Return the splitpoint. null indicates the region isn't splittable<a name="line.8378"></a>
+<span class="sourceLineNo">8379</span>   * If the splitpoint isn't explicitly specified, it will go over the stores<a name="line.8379"></a>
+<span class="sourceLineNo">8380</span>   * to find the best splitpoint. Currently the criteria of best splitpoint<a name="line.8380"></a>
+<span class="sourceLineNo">8381</span>   * is based on the size of the store.<a name="line.8381"></a>
+<span class="sourceLineNo">8382</span>   */<a name="line.8382"></a>
+<span class="sourceLineNo">8383</span>  public byte[] checkSplit() {<a name="line.8383"></a>
+<span class="sourceLineNo">8384</span>    // Can't split META<a name="line.8384"></a>
+<span class="sourceLineNo">8385</span>    if (this.getRegionInfo().isMetaRegion()) {<a name="line.8385"></a>
+<span class="sourceLineNo">8386</span>      if (shouldForceSplit()) {<a name="line.8386"></a>
+<span class="sourceLineNo">8387</span>        LOG.warn("Cannot split meta region in HBase 0.20 and above");<a name="line.8387"></a>
+<span class="sourceLineNo">8388</span>      }<a name="line.8388"></a>
 <span class="sourceLineNo">8389</span>      return null;<a name="line.8389"></a>
 <span class="sourceLineNo">8390</span>    }<a name="line.8390"></a>
 <span class="sourceLineNo">8391</span><a name="line.8391"></a>
-<span class="sourceLineNo">8392</span>    if (!splitPolicy.shouldSplit()) {<a name="line.8392"></a>
-<span class="sourceLineNo">8393</span>      return null;<a name="line.8393"></a>
-<span class="sourceLineNo">8394</span>    }<a name="line.8394"></a>
-<span class="sourceLineNo">8395</span><a name="line.8395"></a>
-<span class="sourceLineNo">8396</span>    byte[] ret = splitPolicy.getSplitPoint();<a name="line.8396"></a>
-<span class="sourceLineNo">8397</span><a name="line.8397"></a>
-<span class="sourceLineNo">8398</span>    if (ret != null) {<a name="line.8398"></a>
-<span class="sourceLineNo">8399</span>      try {<a name="line.8399"></a>
-<span class="sourceLineNo">8400</span>        checkRow(ret, "calculated split");<a name="line.8400"></a>
-<span class="sourceLineNo">8401</span>      } catch (IOException e) {<a name="line.8401"></a>
-<span class="sourceLineNo">8402</span>        LOG.error("Ignoring invalid split", e);<a name="line.8402"></a>
-<span class="sourceLineNo">8403</span>        return null;<a name="line.8403"></a>
-<span class="sourceLineNo">8404</span>      }<a name="line.8404"></a>
-<span class="sourceLineNo">8405</span>    }<a name="line.8405"></a>
-<span class="sourceLineNo">8406</span>    return ret;<a name="line.8406"></a>
-<span class="sourceLineNo">8407</span>  }<a name="line.8407"></a>
-<span class="sourceLineNo">8408</span><a name="line.8408"></a>
-<span class="sourceLineNo">8409</span>  /**<a name="line.8409"></a>
-<span class="sourceLineNo">8410</span>   * @return The priority that this region should have in the compaction queue<a name="line.8410"></a>
-<span class="sourceLineNo">8411</span>   */<a name="line.8411"></a>
-<span class="sourceLineNo">8412</span>  public int getCompactPriority() {<a name="line.8412"></a>
-<span class="sourceLineNo">8413</span>    return stores.values().stream().mapToInt(HStore::getCompactPriority).min()<a name="line.8413"></a>
-<span class="sourceLineNo">8414</span>        .orElse(Store.NO_PRIORITY);<a name="line.8414"></a>
-<span class="sourceLineNo">8415</span>  }<a name="line.8415"></a>
-<span class="sourceLineNo">8416</span><a name="line.8416"></a>
-<span class="sourceLineNo">8417</span>  /** @return the coprocessor host */<a name="line.8417"></a>
-<span class="sourceLineNo">8418</span>  public RegionCoprocessorHost getCoprocessorHost() {<a name="line.8418"></a>
-<span class="sourceLineNo">8419</span>    return coprocessorHost;<a name="line.8419"></a>
+<span class="sourceLineNo">8392</span>    // Can't split a region that is closing.<a name="line.8392"></a>
+<span class="sourceLineNo">8393</span>    if (this.isClosing()) {<a name="line.8393"></a>
+<span class="sourceLineNo">8394</span>      return null;<a name="line.8394"></a>
+<span class="sourceLineNo">8395</span>    }<a name="line.8395"></a>
+<span class="sourceLineNo">8396</span><a name="line.8396"></a>
+<span class="sourceLineNo">8397</span>    if (!splitPolicy.shouldSplit()) {<a name="line.8397"></a>
+<span class="sourceLineNo">8398</span>      return null;<a name="line.8398"></a>
+<span class="sourceLineNo">8399</span>    }<a name="line.8399"></a>
+<span class="sourceLineNo">8400</span><a name="line.8400"></a>
+<span class="sourceLineNo">8401</span>    byte[] ret = splitPolicy.getSplitPoint();<a name="line.8401"></a>
+<span class="sourceLineNo">8402</span><a name="line.8402"></a>
+<span class="sourceLineNo">8403</span>    if (ret != null) {<a name="line.8403"></a>
+<span class="sourceLineNo">8404</span>      try {<a name="line.8404"></a>
+<span class="sourceLineNo">8405</span>        checkRow(ret, "calculated split");<a name="line.8405"></a>
+<span class="sourceLineNo">8406</span>      } catch (IOException e) {<a name="line.8406"></a>
+<span class="sourceLineNo">8407</span>        LOG.error("Ignoring invalid split", e);<a name="line.8407"></a>
+<span class="sourceLineNo">8408</span>        return null;<a name="line.8408"></a>
+<span class="sourceLineNo">8409</span>      }<a name="line.8409"></a>
+<span class="sourceLineNo">8410</span>    }<a name="line.8410"></a>
+<span class="sourceLineNo">8411</span>    return ret;<a name="line.8411"></a>
+<span class="sourceLineNo">8412</span>  }<a name="line.8412"></a>
+<span class="sourceLineNo">8413</span><a name="line.8413"></a>
+<span class="sourceLineNo">8414</span>  /**<a name="line.8414"></a>
+<span class="sourceLineNo">8415</span>   * @return The priority that this region should have in the compaction queue<a name="line.8415"></a>
+<span class="sourceLineNo">8416</span>   */<a name="line.8416"></a>
+<span class="sourceLineNo">8417</span>  public int getCompactPriority() {<a name="line.8417"></a>
+<span class="sourceLineNo">8418</span>    return stores.values().stream().mapToInt(HStore::getCompactPriority).min()<a name="line.8418"></a>
+<span class="sourceLineNo">8419</span>        .orElse(Store.NO_PRIORITY);<a name="line.8419"></a>
 <span class="sourceLineNo">8420</span>  }<a name="line.8420"></a>
 <span class="sourceLineNo">8421</span><a name="line.8421"></a>
-<span class="sourceLineNo">8422</span>  /** @param coprocessorHost the new coprocessor host */<a name="line.8422"></a>
-<span class="sourceLineNo">8423</span>  @VisibleForTesting<a name="line.8423"></a>
-<span class="sourceLineNo">8424</span>  public void setCoprocessorHost(final RegionCoprocessorHost coprocessorHost) {<a name="line.8424"></a>
-<span class="sourceLineNo">8425</span>    this.coprocessorHost = coprocessorHost;<a name="line.8425"></a>
-<span class="sourceLineNo">8426</span>  }<a name="line.8426"></a>
-<span class="sourceLineNo">8427</span><a name="line.8427"></a>
-<span class="sourceLineNo">8428</span>  @Override<a name="line.8428"></a>
-<span class="sourceLineNo">8429</span>  public void startRegionOperation() throws IOException {<a name="line.8429"></a>
-<span class="sourceLineNo">8430</span>    startRegionOperation(Operation.ANY);<a name="line.8430"></a>
+<span class="sourceLineNo">8422</span>  /** @return the coprocessor host */<a name="line.8422"></a>
+<span class="sourceLineNo">8423</span>  public RegionCoprocessorHost getCoprocessorHost() {<a name="line.8423"></a>
+<span class="sourceLineNo">8424</span>    return coprocessorHost;<a name="line.8424"></a>
+<span class="sourceLineNo">8425</span>  }<a name="line.8425"></a>
+<span class="sourceLineNo">8426</span><a name="line.8426"></a>
+<span class="sourceLineNo">8427</span>  /** @param coprocessorHost the new coprocessor host */<a name="line.8427"></a>
+<span class="sourceLineNo">8428</span>  @VisibleForTesting<a name="line.8428"></a>
+<span class="sourceLineNo">8429</span>  public void setCoprocessorHost(final RegionCoprocessorHost coprocessorHost) {<a name="line.8429"></a>
+<span class="sourceLineNo">8430</span>    this.coprocessorHost = coprocessorHost;<a name="line.8430"></a>
 <span class="sourceLineNo">8431</span>  }<a name="line.8431"></a>
 <span class="sourceLineNo">8432</span><a name="line.8432"></a>
 <span class="sourceLineNo">8433</span>  @Override<a name="line.8433"></a>
-<span class="sourceLineNo">8434</span>  public void startRegionOperation(Operation op) throws IOException {<a name="line.8434"></a>
-<span class="sourceLineNo">8435</span>    switch (op) {<a name="line.8435"></a>
-<span class="sourceLineNo">8436</span>      case GET:  // read operations<a name="line.8436"></a>
-<span class="sourceLineNo">8437</span>      case SCAN:<a name="line.8437"></a>
-<span class="sourceLineNo">8438</span>        checkReadsEnabled();<a name="line.8438"></a>
-<span class="sourceLineNo">8439</span>        break;<a name="line.8439"></a>
-<span class="sourceLineNo">8440</span>      default:<a name="line.8440"></a>
-<span class="sourceLineNo">8441</span>        break;<a name="line.8441"></a>
-<span class="sourceLineNo">8442</span>    }<a name="line.8442"></a>
-<span class="sourceLineNo">8443</span>    if (op == Operation.MERGE_REGION || op == Operation.SPLIT_REGION<a name="line.8443"></a>
-<span class="sourceLineNo">8444</span>        || op == Operation.COMPACT_REGION || op == Operation.COMPACT_SWITCH) {<a name="line.8444"></a>
-<span class="sourceLineNo">8445</span>      // split, merge or compact region doesn't need to check the closing/closed state or lock the<a name="line.8445"></a>
-<span class="sourceLineNo">8446</span>      // region<a name="line.8446"></a>
-<span class="sourceLineNo">8447</span>      return;<a name="line.8447"></a>
-<span class="sourceLineNo">8448</span>    }<a name="line.8448"></a>
-<span class="sourceLineNo">8449</span>    if (this.closing.get()) {<a name="line.8449"></a>
-<span class="sourceLineNo">8450</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closing");<a name="line.8450"></a>
-<span class="sourceLineNo">8451</span>    }<a name="line.8451"></a>
-<span class="sourceLineNo">8452</span>    lock(lock.readLock());<a name="line.8452"></a>
-<span class="sourceLineNo">8453</span>    if (this.closed.get()) {<a name="line.8453"></a>
-<span class="sourceLineNo">8454</span>      lock.readLock().unlock();<a name="line.8454"></a>
-<span class="sourceLineNo">8455</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closed");<a name="line.8455"></a>
+<span class="sourceLineNo">8434</span>  public void startRegionOperation() throws IOException {<a name="line.8434"></a>
+<span class="sourceLineNo">8435</span>    startRegionOperation(Operation.ANY);<a name="line.8435"></a>
+<span class="sourceLineNo">8436</span>  }<a name="line.8436"></a>
+<span class="sourceLineNo">8437</span><a name="line.8437"></a>
+<span class="sourceLineNo">8438</span>  @Override<a name="line.8438"></a>
+<span class="sourceLineNo">8439</span>  public void startRegionOperation(Operation op) throws IOException {<a name="line.8439"></a>
+<span class="sourceLineNo">8440</span>    switch (op) {<a name="line.8440"></a>
+<span class="sourceLineNo">8441</span>      case GET:  // read operations<a name="line.8441"></a>
+<span class="sourceLineNo">8442</span>      case SCAN:<a name="line.8442"></a>
+<span class="sourceLineNo">8443</span>        checkReadsEnabled();<a name="line.8443"></a>
+<span class="sourceLineNo">8444</span>        break;<a name="line.8444"></a>
+<span class="sourceLineNo">8445</span>      default:<a name="line.8445"></a>
+<span class="sourceLineNo">8446</span>        break;<a name="line.8446"></a>
+<span class="sourceLineNo">8447</span>    }<a name="line.8447"></a>
+<span class="sourceLineNo">8448</span>    if (op == Operation.MERGE_REGION || op == Operation.SPLIT_REGION<a name="line.8448"></a>
+<span class="sourceLineNo">8449</span>        || op == Operation.COMPACT_REGION || op == Operation.COMPACT_SWITCH) {<a name="line.8449"></a>
+<span class="sourceLineNo">8450</span>      // split, merge or compact region doesn't need to check the closing/closed state or lock the<a name="line.8450"></a>
+<span class="sourceLineNo">8451</span>      // region<a name="line.8451"></a>
+<span class="sourceLineNo">8452</span>      return;<a name="line.8452"></a>
+<span class="sourceLineNo">8453</span>    }<a name="line.8453"></a>
+<span class="sourceLineNo">8454</span>    if (this.closing.get()) {<a name="line.8454"></a>
+<span class="sourceLineNo">8455</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closing");<a name="line.8455"></a>
 <span class="sourceLineNo">8456</span>    }<a name="line.8456"></a>
-<span class="sourceLineNo">8457</span>    // The unit for snapshot is a region. So, all stores for this region must be<a name="line.8457"></a>
-<span class="sourceLineNo">8458</span>    // prepared for snapshot operation before proceeding.<a name="line.8458"></a>
-<span class="sourceLineNo">8459</span>    if (op == Operation.SNAPSHOT) {<a name="line.8459"></a>
-<span class="sourceLineNo">8460</span>      stores.values().forEach(HStore::preSnapshotOperation);<a name="line.8460"></a>
+<span class="sourceLineNo">8457</span>    lock(lock.readLock());<a name="line.8457"></a>
+<span class="sourceLineNo">8458</span>    if (this.closed.get()) {<a name="line.8458"></a>
+<span class="sourceLineNo">8459</span>      lock.readLock().unlock();<a name="line.8459"></a>
+<span class="sourceLineNo">8460</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closed");<a name="line.8460"></a>
 <span class="sourceLineNo">8461</span>    }<a name="line.8461"></a>
-<span class="sourceLineNo">8462</span>    try {<a name="line.8462"></a>
-<span class="sourceLineNo">8463</span>      if (coprocessorHost != null) {<a name="line.8463"></a>
-<span class="sourceLineNo">8464</span>        coprocessorHost.postStartRegionOperation(op);<a name="line.8464"></a>
-<span class="sourceLineNo">8465</span>      }<a name="line.8465"></a>
-<span class="sourceLineNo">8466</span>    } catch (Exception e) {<a name="line.8466"></a>
-<span class="sourceLineNo">8467</span>      lock.readLock().unlock();<a name="line.8467"></a>
-<span class="sourceLineNo">8468</span>      throw new IOException(e);<a name="line.8468"></a>
-<span class="sourceLineNo">8469</span>    }<a name="line.8469"></a>
-<span class="sourceLineNo">8470</span>  }<a name="line.8470"></a>
-<span class="sourceLineNo">8471</span><a name="line.8471"></a>
-<span class="sourceLineNo">8472</span>  @Override<a name="line.8472"></a>
-<span class="sourceLineNo">8473</span>  public void closeRegionOperation() throws IOException {<a name="line.8473"></a>
-<span class="sourceLineNo">8474</span>    closeRegionOperation(Operation.ANY);<a name="line.8474"></a>
+<span class="sourceLineNo">8462</span>    // The unit for snapshot is a region. So, all stores for this region must be<a name="line.8462"></a>
+<span class="sourceLineNo">8463</span>    // prepared for snapshot operation before proceeding.<a name="line.8463"></a>
+<span class="sourceLineNo">8464</span>    if (op == Operation.SNAPSHOT) {<a name="line.8464"></a>
+<span class="sourceLineNo">8465</span>      stores.values().forEach(HStore::preSnapshotOperation);<a name="line.8465"></a>
+<span class="sourceLineNo">8466</span>    }<a name="line.8466"></a>
+<span class="sourceLineNo">8467</span>    try {<a name="line.8467"></a>
+<span class="sourceLineNo">8468</span>      if (coprocessorHost != null) {<a name="line.8468"></a>
+<span class="sourceLineNo">8469</span>        coprocessorHost.postStartRegionOperation(op);<a name="line.8469"></a>
+<span class="sourceLineNo">8470</span>      }<a name="line.8470"></a>
+<span class="sourceLineNo">8471</span>    } catch (Exception e) {<a name="line.8471"></a>
+<span class="sourceLineNo">8472</span>      lock.readLock().unlock();<a name="line.8472"></a>
+<span class="sourceLineNo">8473</span>      throw new IOException(e);<a name="line.8473"></a>
+<span class="sourceLineNo">8474</span>    }<a name="line.8474"></a>
 <span class="sourceLineNo">8475</span>  }<a name="line.8475"></a>
 <span class="sourceLineNo">8476</span><a name="line.8476"></a>
 <span class="sourceLineNo">8477</span>  @Override<a name="line.8477"></a>
-<span class="sourceLineNo">8478</span>  public void closeRegionOperation(Operation operation) throws IOException {<a name="line.8478"></a>
-<span class="sourceLineNo">8479</span>    if (operation == Operation.SNAPSHOT) {<a name="line.8479"></a>
-<span class="sourceLineNo">8480</span>      stores.values().forEach(HStore::postSnapshotOperation);<a name="line.8480"></a>
-<span class="sourceLineNo">8481</span>    }<a name="line.8481"></a>
-<span class="sourceLineNo">8482</span>    lock.readLock().unlock();<a name="line.8482"></a>
-<span class="sourceLineNo">8483</span>    if (coprocessorHost != null) {<a name="line.8483"></a>
-<span class="sourceLineNo">8484</span>      coprocessorHost.postCloseRegionOperation(operation);<a name="line.8484"></a>
-<span class="sourceLineNo">8485</span>    }<a name="line.8485"></a>
-<span class="sourceLineNo">8486</span>  }<a name="line.8486"></a>
-<span class="sourceLineNo">8487</span><a name="line.8487"></a>
-<span class="sourceLineNo">8488</span>  /**<a name="line.8488"></a>
-<span class="sourceLineNo">8489</span>   * This method needs to be called before any public call that reads or<a name="line.8489"></a>
-<span class="sourceLineNo">8490</span>   * modifies stores in bulk. It has to be called just before a try.<a name="line.8490"></a>
-<span class="sourceLineNo">8491</span>   * #closeBulkRegionOperation needs to be called in the try's finally block<a name="line.8491"></a>
-<span class="sourceLineNo">8492</span>   * Acquires a writelock and checks if the region is closing or closed.<a name="line.8492"></a>
-<span class="sourceLineNo">8493</span>   * @throws NotServingRegionException when the region is closing or closed<a name="line.8493"></a>
-<span class="sourceLineNo">8494</span>   * @throws RegionTooBusyException if failed to get the lock in time<a name="line.8494"></a>
-<span class="sourceLineNo">8495</span>   * @throws InterruptedIOException if interrupted while waiting for a lock<a name="line.8495"></a>
-<span class="sourceLineNo">8496</span>   */<a name="line.8496"></a>
-<span class="sourceLineNo">8497</span>  private void startBulkRegionOperation(boolean writeLockNeeded)<a name="line.8497"></a>
-<span class="sourceLineNo">8498</span>      throws NotServingRegionException, RegionTooBusyException, InterruptedIOException {<a name="line.8498"></a>
-<span class="sourceLineNo">8499</span>    if (this.closing.get()) {<a name="line.8499"></a>
-<span class="sourceLineNo">8500</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closing");<a name="line.8500"></a>
-<span class="sourceLineNo">8501</span>    }<a name="line.8501"></a>
-<span class="sourceLineNo">8502</span>    if (writeLockNeeded) lock(lock.writeLock());<a name="line.8502"></a>
-<span class="sourceLineNo">8503</span>    else lock(lock.readLock());<a name="line.8503"></a>
-<span class="sourceLineNo">8504</span>    if (this.closed.get()) {<a name="line.8504"></a>
-<span class="sourceLineNo">8505</span>      if (writeLockNeeded) lock.writeLock().unlock();<a name="line.8505"></a>
-<span class="sourceLineNo">8506</span>      else lock.readLock().unlock();<a name="line.8506"></a>
-<span class="sourceLineNo">8507</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closed");<a name="line.8507"></a>
-<span class="sourceLineNo">8508</span>    }<a name="line.8508"></a>
-<span class="sourceLineNo">8509</span>  }<a name="line.8509"></a>
-<span class="sourceLineNo">8510</span><a name="line.8510"></a>
-<span class="sourceLineNo">8511</span>  /**<a name="line.8511"></a>
-<span class="sourceLineNo">8512</span>   * Closes the lock. This needs to be called in the finally block corresponding<a name="line.8512"></a>
-<span class="sourceLineNo">8513</span>   * to the try block of #startRegionOperation<a name="line.8513"></a>
-<span class="sourceLineNo">8514</span>   */<a name="line.8514"></a>
-<span class="sourceLineNo">8515</span>  private void closeBulkRegionOperation(){<a name="line.8515"></a>
-<span class="sourceLineNo">8516</span>    if (lock.writeLock().isHeldByCurrentThread()) lock.writeLock().unlock();<a name="line.8516"></a>
-<span class="sourceLineNo">8517</span>    else lock.readLock().unlock();<a name="line.8517"></a>
-<span class="sourceLineNo">8518</span>  }<a name="line.8518"></a>
-<span class="sourceLineNo">8519</span><a name="line.8519"></a>
-<span class="sourceLineNo">8520</span>  /**<a name="line.8520"></a>
-<span class="sourceLineNo">8521</span>   * Update LongAdders for number of puts without wal and the size of possible data loss.<a name="line.8521"></a>
-<span class="sourceLineNo">8522</span>   * These information are exposed by the region server metrics.<a name="line.8522"></a>
-<span class="sourceLineNo">8523</span>   */<a name="line.8523"></a>
-<span class="sourceLineNo">8524</span>  private void recordMutationWithoutWal(final Map&lt;byte [], List&lt;Cell&gt;&gt; familyMap) {<a name="line.8524"></a>
-<span class="sourceLineNo">8525</span>    numMutationsWithoutWAL.increment();<a name="line.8525"></a>
-<span class="sourceLineNo">8526</span>    if (numMutationsWithoutWAL.sum() &lt;= 1) {<a name="line.8526"></a>
-<span class="sourceLineNo">8527</span>      LOG.info("writing data to region " + this +<a name="line.8527"></a>
-<span class="sourceLineNo">8528</span>               " with WAL disabled. Data may be lost in the event of a crash.");<a name="line.8528"></a>
-<span class="sourceLineNo">8529</span>    }<a name="line.8529"></a>
-<span class="sourceLineNo">8530</span><a name="line.8530"></a>
-<span class="sourceLineNo">8531</span>    long mutationSize = 0;<a name="line.8531"></a>
-<span class="sourceLineNo">8532</span>    for (List&lt;Cell&gt; cells: familyMap.values()) {<a name="line.8532"></a>
-<span class="sourceLineNo">8533</span>      // Optimization: 'foreach' loop is not used. See:<a name="line.8533"></a>
-<span class="sourceLineNo">8534</span>      // HBASE-12023 HRegion.applyFamilyMapToMemstore creates too many iterator objects<a name="line.8534"></a>
-<span class="sourceLineNo">8535</span>      assert cells instanceof RandomAccess;<a name="line.8535"></a>
-<span class="sourceLineNo">8536</span>      int listSize = cells.size();<a name="line.8536"></a>
-<span class="sourceLineNo">8537</span>      for (int i=0; i &lt; listSize; i++) {<a name="line.8537"></a>
-<span class="sourceLineNo">8538</span>        Cell cell = cells.get(i);<a name="line.8538"></a>
-<span class="sourceLineNo">8539</span>        mutationSize += cell.getSerializedSize();<a name="line.8539"></a>
-<span class="sourceLineNo">8540</span>      }<a name="line.8540"></a>
-<span class="sourceLineNo">8541</span>    }<a name="line.8541"></a>
-<span class="sourceLineNo">8542</span><a name="line.8542"></a>
-<span class="sourceLineNo">8543</span>    dataInMemoryWithoutWAL.add(mutationSize);<a name="line.8543"></a>
-<span class="sourceLineNo">8544</span>  }<a name="line.8544"></a>
-<span class="sourceLineNo">8545</span><a name="line.8545"></a>
-<span class="sourceLineNo">8546</span>  private void lock(final Lock lock) throws RegionTooBusyException, InterruptedIOException {<a name="line.8546"></a>
-<span class="sourceLineNo">8547</span>    lock(lock, 1);<a name="line.8547"></a>
-<span class="sourceLineNo">8548</span>  }<a name="line.8548"></a>
-<span class="sourceLineNo">8549</span><a name="line.8549"></a>
-<span class="sourceLineNo">8550</span>  /**<a name="line.8550"></a>
-<span class="sourceLineNo">8551</span>   * Try to acquire a lock.  Throw RegionTooBusyException<a name="line.8551"></a>
-<span class="sourceLineNo">8552</span>   * if failed to get the lock in time. Throw InterruptedIOException<a name="line.8552"></a>
-<span class="sourceLineNo">8553</span>   * if interrupted while waiting for the lock.<a name="line.8553"></a>
-<span class="sourceLineNo">8554</span>   */<a name="line.8554"></a>
-<span class="sourceLineNo">8555</span>  private void lock(final Lock lock, final int multiplier)<a name="line.8555"></a>
-<span class="sourceLineNo">8556</span>      throws RegionTooBusyException, InterruptedIOException {<a name="line.8556"></a>
-<span class="sourceLineNo">8557</span>    try {<a name="line.8557"></a>
-<span class="sourceLineNo">8558</span>      final long waitTime = Math.min(maxBusyWaitDuration,<a name="line.8558"></a>
-<span class="sourceLineNo">8559</span>          busyWaitDuration * Math.min(multiplier, maxBusyWaitMultiplier));<a name="line.8559"></a>
-<span class="sourceLineNo">8560</span>      if (!lock.tryLock(waitTime, TimeUnit.MILLISECONDS)) {<a name="line.8560"></a>
-<span class="sourceLineNo">8561</span>        // Don't print millis. Message is used as a key over in<a name="line.8561"></a>
-<span class="sourceLineNo">8562</span>        // RetriesExhaustedWithDetailsException processing.<a name="line.8562"></a>
-<span class="sourceLineNo">8563</span>        throw new RegionTooBusyException("Failed to obtain lock; regionName=" +<a name="line.8563"></a>
-<span class="sourceLineNo">8564</span>            (this.getRegionInfo() == null? "unknown":<a name="line.8564"></a>
-<span class="sourceLineNo">8565</span>                this.getRegionInfo().getRegionNameAsString()) +<a name="line.8565"></a>
-<span class="sourceLineNo">8566</span>            ", server=" + (this.getRegionServerServices() == null? "unknown":<a name="line.8566"></a>
-<span class="sourceLineNo">8567</span>                this.getRegionServerServices().getServerName()));<a name="line.8567"></a>
-<span class="sourceLineNo">8568</span>      }<a name="line.8568"></a>
-<span class="sourceLineNo">8569</span>    } catch (InterruptedException ie) {<a name="line.8569"></a>
-<span class="sourceLineNo">8570</span>      LOG.info("Interrupted while waiting for a lock");<a name="line.8570"></a>
-<span class="sourceLineNo">8571</span>      InterruptedIOException iie = new InterruptedIOException();<a name="line.8571"></a>
-<span class="sourceLineNo">8572</span>      iie.initCause(ie);<a name="line.8572"></a>
-<span class="sourceLineNo">8573</span>      throw iie;<a name="line.8573"></a>
-<span class="sourceLineNo">8574</span>    }<a name="line.8574"></a>
-<span class="sourceLineNo">8575</span>  }<a name="line.8575"></a>
-<span class="sourceLineNo">8576</span><a name="line.8576"></a>
-<span class="sourceLineNo">8577</span>  /**<a name="line.8577"></a>
-<span class="sourceLineNo">8578</span>   * Calls sync with the given transaction ID<a name="line.8578"></a>
-<span class="sourceLineNo">8579</span>   * @param txid should sync up to which transaction<a name="line.8579"></a>
-<span class="sourceLineNo">8580</span>   * @throws IOException If anything goes wrong with DFS<a name="line.8580"></a>
-<span class="sourceLineNo">8581</span>   */<a name="line.8581"></a>
-<span class="sourceLineNo">8582</span>  private void sync(long txid, Durability durability) throws IOException {<a name="line.8582"></a>
-<span class="sourceLineNo">8583</span>    if (this.getRegionInfo().isMetaRegion()) {<a name="line.8583"></a>
-<span class="sourceLineNo">8584</span>      this.wal.sync(txid);<a name="line.8584"></a>
-<span class="sourceLineNo">8585</span>    } else {<a name="line.8585"></a>
-<span class="sourceLineNo">8586</span>      switch(durability) {<a name="line.8586"></a>
-<span class="sourceLineNo">8587</span>      case USE_DEFAULT:<a name="line.8587"></a>
-<span class="sourceLineNo">8588</span>        // do what table defaults to<a name="line.8588"></a>
-<span class="sourceLineNo">8589</span>        if (shouldSyncWAL()) {<a name="line.8589"></a>
-<span class="sourceLineNo">8590</span>          this.wal.sync(txid);<a name="line.8590"></a>
-<span class="sourceLineNo">8591</span>        }<a name="line.8591"></a>
-<span class="sourceLineNo">8592</span>        break;<a name="line.8592"></a>
-<span class="sourceLineNo">8593</span>      case SKIP_WAL:<a name="line.8593"></a>
-<span class="sourceLineNo">8594</span>        // nothing do to<a name="line.8594"></a>
-<span class="sourceLineNo">8595</span>        break;<a name="line.8595"></a>
-<span class="sourceLineNo">8596</span>      case ASYNC_WAL:<a name="line.8596"></a>
-<span class="sourceLineNo">8597</span>        // nothing do to<a name="line.8597"></a>
-<span class="sourceLineNo">8598</span>        break;<a name="line.8598"></a>
-<span class="sourceLineNo">8599</span>      case SYNC_WAL:<a name="line.8599"></a>
-<span class="sourceLineNo">8600</span>          this.wal.sync(txid, false);<a name="line.8600"></a>
-<span class="sourceLineNo">8601</span>          break;<a name="line.8601"></a>
-<span class="sourceLineNo">8602</span>      case FSYNC_WAL:<a name="line.8602"></a>
-<span class="sourceLineNo">8603</span>          this.wal.sync(txid, true);<a name="line.8603"></a>
-<span class="sourceLineNo">8604</span>          break;<a name="line.8604"></a>
-<span class="sourceLineNo">8605</span>      default:<a name="line.8605"></a>
-<span class="sourceLineNo">8606</span>        throw new RuntimeException("Unknown durability " + durability);<a name="line.8606"></a>
-<span class="sourceLineNo">8607</span>      }<a name="line.8607"></a>
-<span class="sourceLineNo">8608</span>    }<a name="line.8608"></a>
-<span class="sourceLineNo">8609</span>  }<a name="line.8609"></a>
-<span class="sourceLineNo">8610</span><a name="line.8610"></a>
-<span class="sourceLineNo">8611</span>  /**<a name="line.8611"></a>
-<span class="sourceLineNo">8612</span>   * Check whether we should sync the wal from the table's durability settings<a name="line.8612"></a>
-<span class="sourceLineNo">8613</span>   */<a name="line.8613"></a>
-<span class="sourceLineNo">8614</span>  private boolean shouldSyncWAL() {<a name="line.8614"></a>
-<span class="sourceLineNo">8615</span>    return regionDurability.ordinal() &gt;  Durability.ASYNC_WAL.ordinal();<a name="line.8615"></a>
-<span class="sourceLineNo">8616</span>  }<a name="line.8616"></a>
-<span class="sourceLineNo">8617</span><a name="line.8617"></a>
-<span class="sourceLineNo">8618</span>  /**<a name="line.8618"></a>
-<span class="sourceLineNo">8619</span>   * A mocked list implementation - discards all updates.<a name="line.8619"></a>
-<span class="sourceLineNo">8620</span>   */<a name="line.8620"></a>
-<span class="sourceLineNo">8621</span>  private static final List&lt;Cell&gt; MOCKED_LIST = new AbstractList&lt;Cell&gt;() {<a name="line.8621"></a>
+<span class="sourceLineNo">8478</span>  public void closeRegionOperation() throws IOException {<a name="line.8478"></a>
+<span class="sourceLineNo">8479</span>    closeRegionOperation(Operation.ANY);<a name="line.8479"></a>
+<span class="sourceLineNo">8480</span>  }<a name="line.8480"></a>
+<span class="sourceLineNo">8481</span><a name="line.8481"></a>
+<span class="sourceLineNo">8482</span>  @Override<a name="line.8482"></a>
+<span class="sourceLineNo">8483</span>  public void closeRegionOperation(Operation operation) throws IOException {<a name="line.8483"></a>
+<span class="sourceLineNo">8484</span>    if (operation == Operation.SNAPSHOT) {<a name="line.8484"></a>
+<span class="sourceLineNo">8485</span>      stores.values().forEach(HStore::postSnapshotOperation);<a name="line.8485"></a>
+<span class="sourceLineNo">8486</span>    }<a name="line.8486"></a>
+<span class="sourceLineNo">8487</span>    lock.readLock().unlock();<a name="line.8487"></a>
+<span class="sourceLineNo">8488</span>    if (coprocessorHost != null) {<a name="line.8488"></a>
+<span class="sourceLineNo">8489</span>      coprocessorHost.postCloseRegionOperation(operation);<a name="line.8489"></a>
+<span class="sourceLineNo">8490</span>    }<a name="line.8490"></a>
+<span class="sourceLineNo">8491</span>  }<a name="line.8491"></a>
+<span class="sourceLineNo">8492</span><a name="line.8492"></a>
+<span class="sourceLineNo">8493</span>  /**<a name="line.8493"></a>
+<span class="sourceLineNo">8494</span>   * This method needs to be called before any public call that reads or<a name="line.8494"></a>
+<span class="sourceLineNo">8495</span>   * modifies stores in bulk. It has to be called just before a try.<a name="line.8495"></a>
+<span class="sourceLineNo">8496</span>   * #closeBulkRegionOperation needs to be called in the try's finally block<a name="line.8496"></a>
+<span class="sourceLineNo">8497</span>   * Acquires a writelock and checks if the region is closing or closed.<a name="line.8497"></a>
+<span class="sourceLineNo">8498</span>   * @throws NotServingRegionException when the region is closing or closed<a name="line.8498"></a>
+<span class="sourceLineNo">8499</span>   * @throws RegionTooBusyException if failed to get the lock in time<a name="line.8499"></a>
+<span class="sourceLineNo">8500</span>   * @throws InterruptedIOException if interrupted while waiting for a lock<a name="line.8500"></a>
+<span class="sourceLineNo">8501</span>   */<a name="line.8501"></a>
+<span class="sourceLineNo">8502</span>  private void startBulkRegionOperation(boolean writeLockNeeded)<a name="line.8502"></a>
+<span class="sourceLineNo">8503</span>      throws NotServingRegionException, RegionTooBusyException, InterruptedIOException {<a name="line.8503"></a>
+<span class="sourceLineNo">8504</span>    if (this.closing.get()) {<a name="line.8504"></a>
+<span class="sourceLineNo">8505</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closing");<a name="line.8505"></a>
+<span class="sourceLineNo">8506</span>    }<a name="line.8506"></a>
+<span class="sourceLineNo">8507</span>    if (writeLockNeeded) lock(lock.writeLock());<a name="line.8507"></a>
+<span class="sourceLineNo">8508</span>    else lock(lock.readLock());<a name="line.8508"></a>
+<span class="sourceLineNo">8509</span>    if (this.closed.get()) {<a name="line.8509"></a>
+<span class="sourceLineNo">8510</span>      if (writeLockNeeded) lock.writeLock().unlock();<a name="line.8510"></a>
+<span class="sourceLineNo">8511</span>      else lock.readLock().unlock();<a name="line.8511"></a>
+<span class="sourceLineNo">8512</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closed");<a name="line.8512"></a>
+<span class="sourceLineNo">8513</span>    }<a name="line.8513"></a>
+<span class="sourceLineNo">8514</span>  }<a name="line.8514"></a>
+<span class="sourceLineNo">8515</span><a name="line.8515"></a>
+<span class="sourceLineNo">8516</span>  /**<a name="line.8516"></a>
+<span class="sourceLineNo">8517</span>   * Closes the lock. This needs to be called in the finally block corresponding<a name="line.8517"></a>
+<span class="sourceLineNo">8518</span>   * to the try block of #startRegionOperation<a name="line.8518"></a>
+<span class="sourceLineNo">8519</span>   */<a name="line.8519"></a>
+<span class="sourceLineNo">8520</span>  private void closeBulkRegionOperation(){<a name="line.8520"></a>
+<span class="sourceLineNo">8521</span>    if (lock.writeLock().isHeldByCurrentThread()) lock.writeLock().unlock();<a name="line.8521"></a>
+<span class="sourceLineNo">8522</span>    else lock.readLock().unlock();<a name="line.8522"></a>
+<span class="sourceLineNo">8523</span>  }<a name="line.8523"></a>
+<span class="sourceLineNo">8524</span><a name="line.8524"></a>
+<span class="sourceLineNo">8525</span>  /**<a name="line.8525"></a>
+<span class="sourceLineNo">8526</span>   * Update LongAdders for number of puts without wal and the size of possible data loss.<a name="line.8526"></a>
+<span class="sourceLineNo">8527</span>   * These information are exposed by the region server metrics.<a name="line.8527"></a>
+<span class="sourceLineNo">8528</span>   */<a name="line.8528"></a>
+<span class="sourceLineNo">8529</span>  private void recordMutationWithoutWal(final Map&lt;byte [], List&lt;Cell&gt;&gt; familyMap) {<a name="line.8529"></a>
+<span class="sourceLineNo">8530</span>    numMutationsWithoutWAL.increment();<a name="line.8530"></a>
+<span class="sourceLineNo">8531</span>    if (numMutationsWithoutWAL.sum() &lt;= 1) {<a name="line.8531"></a>
+<span class="sourceLineNo">8532</span>      LOG.info("writing data to region " + this +<a name="line.8532"></a>
+<span class="sourceLineNo">8533</span>               " with WAL disabled. Data may be lost in the event of a crash.");<a name="line.8533"></a>
+<span class="sourceLineNo">8534</span>    }<a name="line.8534"></a>
+<span class="sourceLineNo">8535</span><a name="line.8535"></a>
+<span class="sourceLineNo">8536</span>    long mutationSize = 0;<a name="line.8536"></a>
+<span class="sourceLineNo">8537</span>    for (List&lt;Cell&gt; cells: familyMap.values()) {<a name="line.8537"></a>
+<span class="sourceLineNo">8538</span>      // Optimization: 'foreach' loop is not used. See:<a name="line.8538"></a>
+<span class="sourceLineNo">8539</span>      // HBASE-12023 HRegion.applyFamilyMapToMemstore creates too many iterator objects<a name="line.8539"></a>
+<span class="sourceLineNo">8540</span>      assert cells instanceof RandomAccess;<a name="line.8540"></a>
+<span class="sourceLineNo">8541</span>      int listSize = cells.size();<a name="line.8541"></a>
+<span class="sourceLineNo">8542</span>      for (int i=0; i &lt; listSize; i++) {<a name="line.8542"></a>
+<span class="sourceLineNo">8543</span>        Cell cell = cells.get(i);<a name="line.8543"></a>
+<span class="sourceLineNo">8544</span>        mutationSize += cell.getSerializedSize();<a name="line.8544"></a>
+<span class="sourceLineNo">8545</span>      }<a name="line.8545"></a>
+<span class="sourceLineNo">8546</span>    }<a name="line.8546"></a>
+<span class="sourceLineNo">8547</span><a name="line.8547"></a>
+<span class="sourceLineNo">8548</span>    dataInMemoryWithoutWAL.add(mutationSize);<a name="line.8548"></a>
+<span class="sourceLineNo">8549</span>  }<a name="line.8549"></a>
+<span class="sourceLineNo">8550</span><a name="line.8550"></a>
+<span class="sourceLineNo">8551</span>  private void lock(final Lock lock) throws RegionTooBusyException, InterruptedIOException {<a name="line.8551"></a>
+<span class="sourceLineNo">8552</span>    lock(lock, 1);<a name="line.8552"></a>
+<span class="sourceLineNo">8553</span>  }<a name="line.8553"></a>
+<span class="sourceLineNo">8554</span><a name="line.8554"></a>
+<span class="sourceLineNo">8555</span>  /**<a name="line.8555"></a>
+<span class="sourceLineNo">8556</span>   * Try to acquire a lock.  Throw RegionTooBusyException<a name="line.8556"></a>
+<span class="sourceLineNo">8557</span>   * if failed to get the lock in time. Throw InterruptedIOException<a name="line.8557"></a>
+<span class="sourceLineNo">8558</span>   * if interrupted while waiting for the lock.<a name="line.8558"></a>
+<span class="sourceLineNo">8559</span>   */<a name="line.8559"></a>
+<span class="sourceLineNo">8560</span>  private void lock(final Lock lock, final int multiplier)<a name="line.8560"></a>
+<span class="sourceLineNo">8561</span>      throws RegionTooBusyException, InterruptedIOException {<a name="line.8561"></a>
+<span class="sourceLineNo">8562</span>    try {<a name="line.8562"></a>
+<span class="sourceLineNo">8563</span>      final long waitTime = Math.min(maxBusyWaitDuration,<a name="line.8563"></a>
+<span class="sourceLineNo">8564</span>          busyWaitDuration * Math.min(multiplier, maxBusyWaitMultiplier));<a name="line.8564"></a>
+<span class="sourceLineNo">8565</span>      if (!lock.tryLock(waitTime, TimeUnit.MILLISECONDS)) {<a name="line.8565"></a>
+<span class="sourceLineNo">8566</span>        // Don't print millis. Message is used as a key over in<a name="line.8566"></a>
+<span class="sourceLineNo">8567</span>        // RetriesExhaustedWithDetailsException processing.<a name="line.8567"></a>
+<span class="sourceLineNo">8568</span>        throw new RegionTooBusyException("Failed to obtain lock; regionName=" +<a name="line.8568"></a>
+<span class="sourceLineNo">8569</span>            (this.getRegionInfo() == null? "unknown":<a name="line.8569"></a>
+<span class="sourceLineNo">8570</span>                this.getRegionInfo().getRegionNameAsString()) +<a name="line.8570"></a>
+<span class="sourceLineNo">8571</span>            ", server=" + (this.getRegionServerServices() == null? "unknown":<a name="line.8571"></a>
+<span class="sourceLineNo">8572</span>                this.getRegionServerServices().getServerName()));<a name="line.8572"></a>
+<span class="sourceLineNo">8573</span>      }<a name="line.8573"></a>
+<span class="sourceLineNo">8574</span>    } catch (InterruptedException ie) {<a name="line.8574"></a>
+<span class="sourceLineNo">8575</span>      LOG.info("Interrupted while waiting for a lock");<a name="line.8575"></a>
+<span class="sourceLineNo">8576</span>      InterruptedIOException iie = new InterruptedIOException();<a name="line.8576"></a>
+<span class="sourceLineNo">8577</span>      iie.initCause(ie);<a name="line.8577"></a>
+<span class="sourceLineNo">8578</span>      throw iie;<a name="line.8578"></a>
+<span class="sourceLineNo">8579</span>    }<a name="line.8579"></a>
+<span class="sourceLineNo">8580</span>  }<a name="line.8580"></a>
+<span class="sourceLineNo">8581</span><a name="line.8581"></a>
+<span class="sourceLineNo">8582</span>  /**<a name="line.8582"></a>
+<span class="sourceLineNo">8583</span>   * Calls sync with the given transaction ID<a name="line.8583"></a>
+<span class="sourceLineNo">8584</span>   * @param txid should sync up to which transaction<a name="line.8584"></a>
+<span class="sourceLineNo">8585</span>   * @throws IOException If anything goes wrong with DFS<a name="line.8585"></a>
+<span class="sourceLineNo">8586</span>   */<a name="line.8586"></a>
+<span class="sourceLineNo">8587</span>  private void sync(long txid, Durability durability) throws IOException {<a name="line.8587"></a>
+<span class="sourceLineNo">8588</span>    if (this.getRegionInfo().isMetaRegion()) {<a name="line.8588"></a>
+<span class="sourceLineNo">8589</span>      this.wal.sync(txid);<a name="line.8589"></a>
+<span class="sourceLineNo">8590</span>    } else {<a name="line.8590"></a>
+<span class="sourceLineNo">8591</span>      switch(durability) {<a name="line.8591"></a>
+<span class="sourceLineNo">8592</span>      case USE_DEFAULT:<a name="line.8592"></a>
+<span class="sourceLineNo">8593</span>        // do what table defaults to<a name="line.8593"></a>
+<span class="sourceLineNo">8594</span>        if (shouldSyncWAL()) {<a name="line.8594"></a>
+<span class="sourceLineNo">8595</span>          this.wal.sync(txid);<a name="line.8595"></a>
+<span class="sourceLineNo">8596</span>        }<a name="line.8596"></a>
+<span class="sourceLineNo">8597</span>        break;<a name="line.8597"></a>
+<span class="sourceLineNo">8598</span>      case SKIP_WAL:<a name="line.8598"></a>
+<span class="sourceLineNo">8599</span>        // nothing do to<a name="line.8599"></a>
+<span class="sourceLineNo">8600</span>        break;<a name="line.8600"></a>
+<span class="sourceLineNo">8601</span>      case ASYNC_WAL:<a name="line.8601"></a>
+<span class="sourceLineNo">8602</span>        // nothing do to<a name="line.8602"></a>
+<span class="sourceLineNo">8603</span>        break;<a name="line.8603"></a>
+<span class="sourceLineNo">8604</span>      case SYNC_WAL:<a name="line.8604"></a>
+<span class="sourceLineNo">8605</span>          this.wal.sync(txid, false);<a name="line.8605"></a>
+<span class="sourceLineNo">8606</span>          break;<a name="line.8606"></a>
+<span class="sourceLineNo">8607</span>      case FSYNC_WAL:<a name="line.8607"></a>
+<span class="sourceLineNo">8608</span>          this.wal.sync(txid, true);<a name="line.8608"></a>
+<span class="sourceLineNo">8609</span>          break;<a name="line.8609"></a>
+<span class="sourceLineNo">8610</span>      default:<a name="line.8610"></a>
+<span class="sourceLineNo">8611</span>        throw new RuntimeException("Unknown durability " + durability);<a name="line.8611"></a>
+<span class="sourceLineNo">8612</span>      }<a name="line.8612"></a>
+<span class="sourceLineNo">8613</span>    }<a name="line.8613"></a>
+<span class="sourceLineNo">8614</span>  }<a name="line.8614"></a>
+<span class="sourceLineNo">8615</span><a name="line.8615"></a>
+<span class="sourceLineNo">8616</span>  /**<a name="line.8616"></a>
+<span class="sourceLineNo">8617</span>   * Check whether we should sync the wal from the table's durability settings<a name="line.8617"></a>
+<span class="sourceLineNo">8618</span>   */<a name="line.8618"></a>
+<span class="sourceLineNo">8619</span>  private boolean shouldSyncWAL() {<a name="line.8619"></a>
+<span class="sourceLineNo">8620</span>    return regionDurability.ordinal() &gt;  Durability.ASYNC_WAL.ordinal();<a name="line.8620"></a>
+<span class="sourceLineNo">8621</span>  }<a name="line.8621"></a>
 <span class="sourceLineNo">8622</span><a name="line.8622"></a>
-<span class="sourceLineNo">8623</span>    @Override<a name="line.8623"></a>
-<span class="sourceLineNo">8624</span>    public void add(int index, Cell element) {<a name="line.8624"></a>
-<span class="sourceLineNo">8625</span>      // do nothing<a name="line.8625"></a>
-<span class="sourceLineNo">8626</span>    }<a name="line.8626"></a>
+<span class="sourceLineNo">8623</span>  /**<a name="line.8623"></a>
+<span class="sourceLineNo">8624</span>   * A mocked list implementation - discards all updates.<a name="line.8624"></a>
+<span class="sourceLineNo">8625</span>   */<a name="line.8625"></a>
+<span class="sourceLineNo">8626</span>  private static final List&lt;Cell&gt; MOCKED_LIST = new AbstractList&lt;Cell&gt;() {<a name="line.8626"></a>
 <span class="sourceLineNo">8627</span><a name="line.8627"></a>
 <span class="sourceLineNo">8628</span>    @Override<a name="line.8628"></a>
-<span class="sourceLineNo">8629</span>    public boolean addAll(int index, Collection&lt;? extends Cell&gt; c) {<a name="line.8629"></a>
-<span class="sourceLineNo">8630</span>      return false; // this list is never changed as a result of an update<a name="line.8630"></a>
+<span class="sourceLineNo">8629</span>    public void add(int index, Cell element) {<a name="line.8629"></a>
+<span class="sourceLineNo">8630</span>      // do nothing<a name="line.8630"></a>
 <span class="sourceLineNo">8631</span>    }<a name="line.8631"></a>
 <span class="sourceLineNo">8632</span><a name="line.8632"></a>
 <span class="sourceLineNo">8633</span>    @Override<a name="line.8633"></a>
-<span class="sourceLineNo">8634</span>    public KeyValue get(int index) {<a name="line.8634"></a>
-<span class="sourceLineNo">8635</span>      throw new UnsupportedOperationException();<a name="line.8635"></a>
+<span class="sourceLineNo">8634</span>    public boolean addAll(int index, Collection&lt;? extends Cell&gt; c) {<a name="line.8634"></a>
+<span class="sourceLineNo">8635</span>      return false; // this list is never changed as a result of an update<a name="line.8635"></a>
 <span class="sourceLineNo">8636</span>    }<a name="line.8636"></a>
 <span class="sourceLineNo">8637</span><a name="line.8637"></a>
 <span class="sourceLineNo">8638</span>    @Override<a name="line.8638"></a>
-<span class="sourceLineNo">8639</span>    public int size() {<a name="line.8639"></a>
-<span class="sourceLineNo">8640</span>      return 0;<a name="line.8640"></a>
+<span class="sourceLineNo">8639</span>    public KeyValue get(int index) {<a name="line.8639"></a>
+<span class="sourceLineNo">8640</span>      throw new UnsupportedOperationException();<a name="line.8640"></a>
 <span class="sourceLineNo">8641</span>    }<a name="line.8641"></a>
-<span class="sourceLineNo">8642</span>  };<a name="line.8642"></a>
-<span class="sourceLineNo">8643</span><a name="line.8643"></a>
-<span class="sourceLineNo">8644</span>  /** @return the latest sequence number that was read from storage when this region was opened */<a name="line.8644"></a>
-<span class="sourceLineNo">8645</span>  public long getOpenSeqNum() {<a name="line.8645"></a>
-<span class="sourceLineNo">8646</span>    return this.openSeqNum;<a name="line.8646"></a>
-<span class="sourceLineNo">8647</span>  }<a name="line.8647"></a>
+<span class="sourceLineNo">8642</span><a name="line.8642"></a>
+<span class="sourceLineNo">8643</span>    @Override<a name="line.8643"></a>
+<span class="sourceLineNo">8644</span>    public int size() {<a name="line.8644"></a>
+<span class="sourceLineNo">8645</span>      return 0;<a name="line.8645"></a>
+<span class="sourceLineNo">8646</span>    }<a name="line.8646"></a>
+<span class="sourceLineNo">8647</span>  };<a name="line.8647"></a>
 <span class="sourceLineNo">8648</span><a name="line.8648"></a>
-<span class="sourceLineNo">8649</span>  @Override<a name="line.8649"></a>
-<span class="sourceLineNo">8650</span>  public Map&lt;byte[], Long&gt; getMaxStoreSeqId() {<a name="line.8650"></a>
-<span class="sourceLineNo">8651</span>    return this.maxSeqIdInStores;<a name="line.8651"></a>
+<span class="sourceLineNo">8649</span>  /** @return the latest sequence number that was read from storage when this region was opened */<a name="line.8649"></a>
+<span class="sourceLineNo">8650</span>  public long getOpenSeqNum() {<a name="line.8650"></a>
+<span class="sourceLineNo">8651</span>    return this.openSeqNum;<a name="line.8651"></a>
 <span class="sourceLineNo">8652</span>  }<a name="line.8652"></a>
 <span class="sourceLineNo">8653</span><a name="line.8653"></a>
-<span class="sourceLineNo">8654</span>  public long getOldestSeqIdOfStore(byte[] familyName) {<a name="line.8654"></a>
-<span class="sourceLineNo">8655</span>    return wal.getEarliestMemStoreSeqNum(getRegionInfo().getEncodedNameAsBytes(), familyName);<a name="line.8655"></a>
-<span class="sourceLineNo">8656</span>  }<a name="line.8656"></a>
-<span class="sourceLineNo">8657</span><a name="line.8657"></a>
-<span class="sourceLineNo">8658</span>  @Override<a name="line.8658"></a>
-<span class="sourceLineNo">8659</span>  public CompactionState getCompactionState() {<a name="line.8659"></a>
-<span class="sourceLineNo">8660</span>    boolean hasMajor = majorInProgress.get() &gt; 0, hasMinor = minorInProgress.get() &gt; 0;<a name="line.8660"></a>
-<span class="sourceLineNo">8661</span>    return (hasMajor ? (hasMinor ? CompactionState.MAJOR_AND_MINOR : CompactionState.MAJOR)<a name="line.8661"></a>
-<span class="sourceLineNo">8662</span>        : (hasMinor ? CompactionState.MINOR : CompactionState.NONE));<a name="line.8662"></a>
-<span class="sourceLineNo">8663</span>  }<a name="line.8663"></a>
-<span class="sourceLineNo">8664</span><a name="line.8664"></a>
-<span class="sourceLineNo">8665</span>  public void reportCompactionRequestStart(boolean isMajor){<a name="line.8665"></a>
-<span class="sourceLineNo">8666</span>    (isMajor ? majorInProgress : minorInProgress).incrementAndGet();<a name="line.8666"></a>
-<span class="sourceLineNo">8667</span>  }<a name="line.8667"></a>
-<span class="sourceLineNo">8668</span><a name="line.8668"></a>
-<span class="sourceLineNo">8669</span>  public void reportCompactionRequestEnd(boolean isMajor, int numFiles, long filesSizeCompacted) {<a name="line.8669"></a>
-<span class="sourceLineNo">8670</span>    int newValue = (isMajor ? majorInProgress : minorInProgress).decrementAndGet();<a name="line.8670"></a>
-<span class="sourceLineNo">8671</span><a name="line.8671"></a>
-<span class="sourceLineNo">8672</span>    // metrics<a name="line.8672"></a>
-<span class="sourceLineNo">8673</span>    compactionsFinished.increment();<a name="line.8673"></a>
-<span class="sourceLineNo">8674</span>    compactionNumFilesCompacted.add(numFiles);<a name="line.8674"></a>
-<span class="sourceLineNo">8675</span>    compactionNumBytesCompacted.add(filesSizeCompacted);<a name="line.8675"></a>
+<span class="sourceLineNo">8654</span>  @Override<a name="line.8654"></a>
+<span class="sourceLineNo">8655</span>  public Map&lt;byte[], Long&gt; getMaxStoreSeqId() {<a name="line.8655"></a>
+<span class="sourceLineNo">8656</span>    return this.maxSeqIdInStores;<a name="line.8656"></a>
+<span class="sourceLineNo">8657</span>  }<a name="line.8657"></a>
+<span class="sourceLineNo">8658</span><a name="line.8658"></a>
+<span class="sourceLineNo">8659</span>  public long getOldestSeqIdOfStore(byte[] familyName) {<a name="line.8659"></a>
+<span class="sourceLineNo">8660</span>    return wal.getEarliestMemStoreSeqNum(getRegionInfo().getEncodedNameAsBytes(), familyName);<a name="line.8660"></a>
+<span class="sourceLineNo">8661</span>  }<a name="line.8661"></a>
+<span class="sourceLineNo">8662</span><a name="line.8662"></a>
+<span class="sourceLineNo">8663</span>  @Override<a name="line.8663"></a>
+<span class="sourceLineNo">8664</span>  public CompactionState getCompactionState() {<a name="line.8664"></a>
+<span class="sourceLineNo">8665</span>    boolean hasMajor = majorInProgress.get() &gt; 0, hasMinor = minorInProgress.get() &gt; 0;<a name="line.8665"></a>
+<span class="sourceLineNo">8666</span>    return (hasMajor ? (hasMinor ? CompactionState.MAJOR_AND_MINOR : CompactionState.MAJOR)<a name="line.8666"></a>
+<span class="sourceLineNo">8667</span>        : (hasMinor ? CompactionState.MINOR : CompactionState.NONE));<a name="line.8667"></a>
+<span class="sourceLineNo">8668</span>  }<a name="line.8668"></a>
+<span class="sourceLineNo">8669</span><a name="line.8669"></a>
+<span class="sourceLineNo">8670</span>  public void reportCompactionRequestStart(boolean isMajor){<a name="line.8670"></a>
+<span class="sourceLineNo">8671</span>    (isMajor ? majorInProgress : minorInProgress).incrementAndGet();<a name="line.8671"></a>
+<span class="sourceLineNo">8672</span>  }<a name="line.8672"></a>
+<span class="sourceLineNo">8673</span><a name="line.8673"></a>
+<span class="sourceLineNo">8674</span>  public void reportCompactionRequestEnd(boolean isMajor, int numFiles, long filesSizeCompacted) {<a name="line.8674"></a>
+<span class="sourceLineNo">8675</span>    int newValue = (isMajor ? majorInProgress : minorInProgress).decrementAndGet();<a name="line.8675"></a>
 <span class="sourceLineNo">8676</span><a name="line.8676"></a>
-<span class="sourceLineNo">8677</span>    assert newValue &gt;= 0;<a name="line.8677"></a>
-<span class="sourceLineNo">8678</span>  }<a name="line.8678"></a>
-<span class="sourceLineNo">8679</span><a name="line.8679"></a>
-<span class="sourceLineNo">8680</span>  public void reportCompactionRequestFailure() {<a name="line.8680"></a>
-<span class="sourceLineNo">8681</span>    compactionsFailed.increment();<a name="line.8681"></a>
-<span class="sourceLineNo">8682</span>  }<a name="line.8682"></a>
-<span class="sourceLineNo">8683</span><a name="line.8683"></a>
-<span class="sourceLineNo">8684</span>  public void incrementCompactionsQueuedCount() {<a name="line.8684"></a>
-<span class="sourceLineNo">8685</span>    compactionsQueued.increment();<a name="line.8685"></a>
-<span class="sourceLineNo">8686</span>  }<a name="line.8686"></a>
-<span class="sourceLineNo">8687</span><a name="line.8687"></a>
-<span class="sourceLineNo">8688</span>  public void decrementCompactionsQueuedCount() {<a name="line.8688"></a>
-<span class="sourceLineNo">8689</span>    compactionsQueued.decrement();<a name="line.8689"></a>
-<span class="sourceLineNo">8690</span>  }<a name="line.8690"></a>
-<span class="sourceLineNo">8691</span><a name="line.8691"></a>
-<span class="sourceLineNo">8692</span>  public void incrementFlushesQueuedCount() {<a name="line.8692"></a>
-<span class="sourceLineNo">8693</span>    flushesQueued.increment();<a name="line.8693"></a>
-<span class="sourceLineNo">8694</span>  }<a name="line.8694"></a>
-<span class="sourceLineNo">8695</span><a name="line.8695"></a>
-<span class="sourceLineNo">8696</span>  @VisibleForTesting<a name="line.8696"></a>
-<span class="sourceLineNo">8697</span>  public long getReadPoint() {<a name="line.8697"></a>
-<span class="sourceLineNo">8698</span>    return getReadPoint(IsolationLevel.READ_COMMITTED);<a name="line.8698"></a>
+<span class="sourceLineNo">8677</span>    // metrics<a name="line.8677"></a>
+<span class="sourceLineNo">8678</span>    compactionsFinished.increment();<a name="line.8678"></a>
+<span class="sourceLineNo">8679</span>    compactionNumFilesCompacted.add(numFiles);<a name="line.8679"></a>
+<span class="sourceLineNo">8680</span>    compactionNumBytesCompacted.add(filesSizeCompacted);<a name="line.8680"></a>
+<span class="sourceLineNo">8681</span><a name="line.8681"></a>
+<span class="sourceLineNo">8682</span>    assert newValue &gt;= 0;<a name="line.8682"></a>
+<span class="sourceLineNo">8683</span>  }<a name="line.8683"></a>
+<span class="sourceLineNo">8684</span><a name="line.8684"></a>
+<span class="sourceLineNo">8685</span>  public void reportCompactionRequestFailure() {<a name="line.8685"></a>
+<span class="sourceLineNo">8686</span>    compactionsFailed.increment();<a name="line.8686"></a>
+<span class="sourceLineNo">8687</span>  }<a name="line.8687"></a>
+<span class="sourceLineNo">8688</span><a name="line.8688"></a>
+<span class="sourceLineNo">8689</span>  public void incrementCompactionsQueuedCount() {<a name="line.8689"></a>
+<span class="sourceLineNo">8690</span>    compactionsQueued.increment();<a name="line.8690"></a>
+<span class="sourceLineNo">8691</span>  }<a name="line.8691"></a>
+<span class="sourceLineNo">8692</span><a name="line.8692"></a>
+<span class="sourceLineNo">8693</span>  public void decrementCompactionsQueuedCount() {<a name="line.8693"></a>
+<span class="sourceLineNo">8694</span>    compactionsQueued.decrement();<a name="line.8694"></a>
+<span class="sourceLineNo">8695</span>  }<a name="line.8695"></a>
+<span class="sourceLineNo">8696</span><a name="line.8696"></a>
+<span class="sourceLineNo">8697</span>  public void incrementFlushesQueuedCount() {<a name="line.8697"></a>
+<span class="sourceLineNo">8698</span>    flushesQueued.increment();<a name="line.8698"></a>
 <span class="sourceLineNo">8699</span>  }<a name="line.8699"></a>
 <span class="sourceLineNo">8700</span><a name="line.8700"></a>
-<span class="sourceLineNo">8701</span>  /**<a name="line.8701"></a>
-<span class="sourceLineNo">8702</span>   * {@inheritDoc}<a name="line.8702"></a>
-<span class="sourceLineNo">8703</span>   */<a name="line.8703"></a>
-<span class="sourceLineNo">8704</span>  @Override<a name="line.8704"></a>
-<span class="sourceLineNo">8705</span>  public void onConfigurationChange(Configuration conf) {<a name="line.8705"></a>
-<span class="sourceLineNo">8706</span>    this.storeHotnessProtector.update(conf);<a name="line.8706"></a>
-<span class="sourceLineNo">8707</span>  }<a name="line.8707"></a>
-<span class="sourceLineNo">8708</span><a name="line.8708"></a>
-<span class="sourceLineNo">8709</span>  /**<a name="line.8709"></a>
-<span class="sourceLineNo">8710</span>   * {@inheritDoc}<a name="line.8710"></a>
-<span class="sourceLineNo">8711</span>   */<a name="line.8711"></a>
-<span class="sourceLineNo">8712</span>  @Override<a name="line.8712"></a>
-<span class="sourceLineNo">8713</span>  public void registerChildren(ConfigurationManager manager) {<a name="line.8713"></a>
-<span class="sourceLineNo">8714</span>    configurationManager = Optional.of(manager);<a name="line.8714"></a>
-<span class="sourceLineNo">8715</span>    stores.values().forEach(manager::registerObserver);<a name="line.8715"></a>
-<span class="sourceLineNo">8716</span>  }<a name="line.8716"></a>
-<span class="sourceLineNo">8717</span><a name="line.8717"></a>
-<span class="sourceLineNo">8718</span>  /**<a name="line.8718"></a>
-<span class="sourceLineNo">8719</span>   * {@inheritDoc}<a name="line.8719"></a>
-<span class="sourceLineNo">8720</span>   */<a name="line.8720"></a>
-<span class="sourceLineNo">8721</span>  @Override<a name="line.8721"></a>
-<span class="sourceLineNo">8722</span>  public void deregisterChildren(ConfigurationManager manager) {<a name="line.8722"></a>
-<span class="sourceLineNo">8723</span>    stores.values().forEach(configurationManager.get()::deregisterObserver);<a name="line.8723"></a>
-<span class="sourceLineNo">8724</span>  }<a name="line.8724"></a>
-<span class="sourceLineNo">8725</span><a name="line.8725"></a>
+<span class="sourceLineNo">8701</span>  @VisibleForTesting<a name="line.8701"></a>
+<span class="sourceLineNo">8702</span>  public long getReadPoint() {<a name="line.8702"></a>
+<span class="sourceLineNo">8703</span>    return getReadPoint(IsolationLevel.READ_COMMITTED);<a name="line.8703"></a>
+<span class="sourceLineNo">8704</span>  }<a name="line.8704"></a>
+<span class="sourceLineNo">8705</span><a name="line.8705"></a>
+<span class="sourceLineNo">8706</span>  /**<a name="line.8706"></a>
+<span class="sourceLineNo">8707</span>   * {@inheritDoc}<a name="line.8707"></a>
+<span class="sourceLineNo">8708</span>   */<a name="line.8708"></a>
+<span class="sourceLineNo">8709</span>  @Override<a name="line.8709"></a>
+<span class="sourceLineNo">8710</span>  public void onConfigurationChange(Configuration conf) {<a name="line.8710"></a>
+<span class="sourceLineNo">8711</span>    this.storeHotnessProtector.update(conf);<a name="line.8711"></a>
+<span class="sourceLineNo">8712</span>  }<a name="line.8712"></a>
+<span class="sourceLineNo">8713</span><a name="line.8713"></a>
+<span class="sourceLineNo">8714</span>  /**<a name="line.8714"></a>
+<span class="sourceLineNo">8715</span>   * {@inheritDoc}<a name="line.8715"></a>
+<span class="sourceLineNo">8716</span>   */<a name="line.8716"></a>
+<span class="sourceLineNo">8717</span>  @Override<a name="line.8717"></a>
+<span class="sourceLineNo">8718</span>  public void registerChildren(ConfigurationManager manager) {<a name="line.8718"></a>
+<span class="sourceLineNo">8719</span>    configurationManager = Optional.of(manager);<a name="line.8719"></a>
+<span class="sourceLineNo">8720</span>    stores.values().forEach(manager::registerObserver);<a name="line.8720"></a>
+<span class="sourceLineNo">8721</span>  }<a name="line.8721"></a>
+<span class="sourceLineNo">8722</span><a name="line.8722"></a>
+<span class="sourceLineNo">8723</span>  /**<a name="line.8723"></a>
+<span class="sourceLineNo">8724</span>   * {@inheritDoc}<a name="line.8724"></a>
+<span class="sourceLineNo">8725</span>   */<a name="line.8725"></a>
 <span class="sourceLineNo">8726</span>  @Override<a name="line.8726"></a>
-<span class="sourceLineNo">8727</span>  public CellComparator getCellComparator() {<a name="line.8727"></a>
-<span class="sourceLineNo">8728</span>    return this.getRegionInfo().isMetaRegion() ? CellComparatorImpl.META_COMPARATOR<a name="line.8728"></a>
-<span class="sourceLineNo">8729</span>        : CellComparatorImpl.COMPARATOR;<a name="line.8729"></a>
-<span class="sourceLineNo">8730</span>  }<a name="line.8730"></a>
-<span class="sourceLineNo">8731</span><a name="line.8731"></a>
-<span class="sourceLineNo">8732</span>  public long getMemStoreFlushSize() {<a name="line.8732"></a>
-<span class="sourceLineNo">8733</span>    return this.memstoreFlushSize;<a name="line.8733"></a>
-<span class="sourceLineNo">8734</span>  }<a name="line.8734"></a>
-<span class="sourceLineNo">8735</span><a name="line.8735"></a>
+<span class="sourceLineNo">8727</span>  public void deregisterChildren(ConfigurationManager manager) {<a name="line.8727"></a>
+<span class="sourceLineNo">8728</span>    stores.values().forEach(configurationManager.get()::deregisterObserver);<a name="line.8728"></a>
+<span class="sourceLineNo">8729</span>  }<a name="line.8729"></a>
+<span class="sourceLineNo">8730</span><a name="line.8730"></a>
+<span class="sourceLineNo">8731</span>  @Override<a name="line.8731"></a>
+<span class="sourceLineNo">8732</span>  public CellComparator getCellComparator() {<a name="line.8732"></a>
+<span class="sourceLineNo">8733</span>    return this.getRegionInfo().isMetaRegion() ? CellComparatorImpl.META_COMPARATOR<a name="line.8733"></a>
+<span class="sourceLineNo">8734</span>        : CellComparatorImpl.COMPARATOR;<a name="line.8734"></a>
+<span class="sourceLineNo">8735</span>  }<a name="line.8735"></a>
 <span class="sourceLineNo">8736</span><a name="line.8736"></a>
-<span class="sourceLineNo">8737</span>  //// method for debugging tests<a name="line.8737"></a>
-<span class="sourceLineNo">8738</span>  void throwException(String title, String regionName) {<a name="line.8738"></a>
-<span class="sourceLineNo">8739</span>    StringBuilder buf = new StringBuilder();<a name="line.8739"></a>
-<span class="sourceLineNo">8740</span>    buf.append(title + ", ");<a name="line.8740"></a>
-<span class="sourceLineNo">8741</span>    buf.append(getRegionInfo().toString());<a name="line.8741"></a>
-<span class="sourceLineNo">8742</span>    buf.append(getRegionInfo().isMetaRegion() ? " meta region " : " ");<a name="line.8742"></a>
-<span class="sourceLineNo">8743</span>    buf.append("stores: ");<a name="line.8743"></a>
-<span class="sourceLineNo">8744</span>    for (HStore s : stores.values()) {<a name="line.8744"></a>
-<span class="sourceLineNo">8745</span>      buf.append(s.getColumnFamilyDescriptor().getNameAsString());<a name="line.8745"></a>
-<span class="sourceLineNo">8746</span>      buf.append(" size: ");<a name="line.8746"></a>
-<span class="sourceLineNo">8747</span>      buf.append(s.getMemStoreSize().getDataSize());<a name="line.8747"></a>
-<span class="sourceLineNo">8748</span>      buf.append(" ");<a name="line.8748"></a>
-<span class="sourceLineNo">8749</span>    }<a name="line.8749"></a>
-<span class="sourceLineNo">8750</span>    buf.append("end-of-stores");<a name="line.8750"></a>
-<span class="sourceLineNo">8751</span>    buf.append(", memstore size ");<a name="line.8751"></a>
-<span class="sourceLineNo">8752</span>    buf.append(getMemStoreDataSize());<a name="line.8752"></a>
-<span class="sourceLineNo">8753</span>    if (getRegionInfo().getRegionNameAsString().startsWith(regionName)) {<a name="line.8753"></a>
-<span class="sourceLineNo">8754</span>      throw new RuntimeException(buf.toString());<a name="line.8754"></a>
-<span class="sourceLineNo">8755</span>    }<a name="line.8755"></a>
-<span class="sourceLineNo">8756</span>  }<a name="line.8756"></a>
-<span class="sourceLineNo">8757</span><a name="line.8757"></a>
-<span class="sourceLineNo">8758</span>  @Override<a name="line.8758"></a>
-<span class="sourceLineNo">8759</span>  public void requestCompaction(String why, int priority, boolean major,<a name="line.8759"></a>
-<span class="sourceLineNo">8760</span>      CompactionLifeCycleTracker tracker) throws IOException {<a name="line.8760"></a>
-<span class="sourceLineNo">8761</span>    if (major) {<a name="line.8761"></a>
-<span class="sourceLineNo">8762</span>      stores.values().forEach(HStore::triggerMajorCompaction);<a name="line.8762"></a>
-<span class="sourceLineNo">8763</span>    }<a name="line.8763"></a>
-<span class="sourceLineNo">8764</span>    rsServices.getCompactionRequestor().requestCompaction(this, why, priority, tracker,<a name="line.8764"></a>
-<span class="sourceLineNo">8765</span>        RpcServer.getRequestUser().orElse(null));<a name="line.8765"></a>
-<span class="sourceLineNo">8766</span>  }<a name="line.8766"></a>
-<span class="sourceLineNo">8767</span><a name="line.8767"></a>
-<span class="sourceLineNo">8768</span>  @Override<a name="line.8768"></a>
-<span class="sourceLineNo">8769</span>  public void requestCompaction(byte[] family, String why, int priority, boolean major,<a name="line.8769"></a>
-<span class="sourceLineNo">8770</span>      CompactionLifeCycleTracker tracker) throws IOException {<a name="line.8770"></a>
-<span class="sourceLineNo">8771</span>    HStore store = stores.get(family);<a name="line.8771"></a>
-<span class="sourceLineNo">8772</span>    if (store == null) {<a name="line.8772"></a>
-<span class="sourceLineNo">8773</span>      throw new NoSuchColumnFamilyException("column family " + Bytes.toString(family) +<a name="line.8773"></a>
-<span class="sourceLineNo">8774</span>          " does not exist in region " + getRegionInfo().getRegionNameAsString());<a name="line.8774"></a>
-<span class="sourceLineNo">8775</span>    }<a name="line.8775"></a>
-<span class="sourceLineNo">8776</span>    if (major) {<a name="line.8776"></a>
-<span class="sourceLineNo">8777</span>      store.triggerMajorCompaction();<a name="line.8777"></a>
-<span class="sourceLineNo">8778</span>    }<a name="line.8778"></a>
-<span class="sourceLineNo">8779</span>    rsServices.getCompactionRequestor().requestCompaction(this, store, why, priority, tracker,<a name="line.8779"></a>
-<span class="sourceLineNo">8780</span>        RpcServer.getRequestUser().orElse(null));<a name="line.8780"></a>
-<span class="sourceLineNo">8781</span>  }<a name="line.8781"></a>
-<span class="sourceLineNo">8782</span><a name="line.8782"></a>
-<span class="sourceLineNo">8783</span>  private void requestFlushIfNeeded() throws RegionTooBusyException {<a name="line.8783"></a>
-<span class="sourceLineNo">8784</span>    if(isFlushSize(this.memStoreSizing.getMemStoreSize())) {<a name="line.8784"></a>
-<span class="sourceLineNo">8785</span>      requestFlush();<a name="line.8785"></a>
-<span class="sourceLineNo">8786</span>    }<a name="line.8786"></a>
-<span class="sourceLineNo">8787</span>  }<a name="line.8787"></a>
-<span class="sourceLineNo">8788</span><a name="line.8788"></a>
-<span class="sourceLineNo">8789</span>  private void requestFlush() {<a name="line.8789"></a>
-<span class="sourceLineNo">8790</span>    if (this.rsServices == null) {<a name="line.8790"></a>
-<span class="sourceLineNo">8791</span>      return;<a name="line.8791"></a>
-<span class="sourceLineNo">8792</span>    }<a name="line.8792"></a>
-<span class="sourceLineNo">8793</span>    requestFlush0(FlushLifeCycleTracker.DUMMY);<a name="line.8793"></a>
-<span class="sourceLineNo">8794</span>  }<a name="line.8794"></a>
-<span class="sourceLineNo">8795</span><a name="line.8795"></a>
-<span class="sourceLineNo">8796</span>  private void requestFlush0(FlushLifeCycleTracker tracker) {<a name="line.8796"></a>
-<span class="sourceLineNo">8797</span>    boolean shouldFlush = false;<a name="line.8797"></a>
-<span class="sourceLineNo">8798</span>    synchronized (writestate) {<a name="line.8798"></a>
-<span class="sourceLineNo">8799</span>      if (!this.writestate.isFlushRequested()) {<a name="line.8799"></a>
-<span class="sourceLineNo">8800</span>        shouldFlush = true;<a name="line.8800"></a>
-<span class="sourceLineNo">8801</span>        writestate.flushRequested = true;<a name="line.8801"></a>
-<span class="sourceLineNo">8802</span>      }<a name="line.8802"></a>
-<span class="sourceLineNo">8803</span>    }<a name="line.8803"></a>
-<span class="sourceLineNo">8804</span>    if (shouldFlush) {<a name="line.8804"></a>
-<span class="sourceLineNo">8805</span>      // Make request outside of synchronize block; HBASE-818.<a name="line.8805"></a>
-<span class="sourceLineNo">8806</span>      this.rsServices.getFlushRequester().requestFlush(this, false, tracker);<a name="line.8806"></a>
-<span class="sourceLineNo">8807</span>      if (LOG.isDebugEnabled()) {<a name="line.8807"></a>
-<span class="sourceLineNo">8808</span>        LOG.debug("Flush requested on " + this.getRegionInfo().getEncodedName());<a name="line.8808"></a>
-<span class="sourceLineNo">8809</span>      }<a name="line.8809"></a>
-<span class="sourceLineNo">8810</span>    } else {<a name="line.8810"></a>
-<span class="sourceLineNo">8811</span>      tracker.notExecuted("Flush already requested on " + this);<a name="line.8811"></a>
-<span class="sourceLineNo">8812</span>    }<a name="line.8812"></a>
-<span class="sourceLineNo">8813</span>  }<a name="line.8813"></a>
-<span class="sourceLineNo">8814</span><a name="line.8814"></a>
-<span class="sourceLineNo">8815</span>  @Override<a name="line.8815"></a>
-<span class="sourceLineNo">8816</span>  public void requestFlush(FlushLifeCycleTracker tracker) throws IOException {<a name="line.8816"></a>
-<span class="sourceLineNo">8817</span>    requestFlush0(tracker);<a name="line.8817"></a>
+<span class="sourceLineNo">8737</span>  public long getMemStoreFlushSize() {<a name="line.8737"></a>
+<span class="sourceLineNo">8738</span>    return this.memstoreFlushSize;<a name="line.8738"></a>
+<span class="sourceLineNo">8739</span>  }<a name="line.8739"></a>
+<span class="sourceLineNo">8740</span><a name="line.8740"></a>
+<span class="sourceLineNo">8741</span><a name="line.8741"></a>
+<span class="sourceLineNo">8742</span>  //// method for debugging tests<a name="line.8742"></a>
+<span class="sourceLineNo">8743</span>  void throwException(String title, String regionName) {<a name="line.8743"></a>
+<span class="sourceLineNo">8744</span>    StringBuilder buf = new StringBuilder();<a name="line.8744"></a>
+<span class="sourceLineNo">8745</span>    buf.append(title + ", ");<a name="line.8745"></a>
+<span class="sourceLineNo">8746</span>    buf.append(getRegionInfo().toString());<a name="line.8746"></a>
+<span class="sourceLineNo">8747</span>    buf.append(getRegionInfo().isMetaRegion() ? " meta region " : " ");<a name="line.8747"></a>
+<span class="sourceLineNo">8748</span>    buf.append("stores: ");<a name="line.8748"></a>
+<span class="sourceLineNo">8749</span>    for (HStore s : stores.values()) {<a name="line.8749"></a>
+<span class="sourceLineNo">8750</span>      buf.append(s.getColumnFamilyDescriptor().getNameAsString());<a name="line.8750"></a>
+<span class="sourceLineNo">8751</span>      buf.append(" size: ");<a name="line.8751"></a>
+<span class="sourceLineNo">8752</span>      buf.append(s.getMemStoreSize().getDataSize());<a name="line.8752"></a>
+<span class="sourceLineNo">8753</span>      buf.append(" ");<a name="line.8753"></a>
+<span class="sourceLineNo">8754</span>    }<a name="line.8754"></a>
+<span class="sourceLineNo">8755</span>    buf.append("end-of-stores");<a name="line.8755"></a>
+<span class="sourceLineNo">8756</span>    buf.append(", memstore size ");<a name="line.8756"></a>
+<span class="sourceLineNo">8757</span>    buf.append(getMemStoreDataSize());<a name="line.8757"></a>
+<span class="sourceLineNo">8758</span>    if (getRegionInfo().getRegionNameAsString().startsWith(regionName)) {<a name="line.8758"></a>
+<span class="sourceLineNo">8759</span>      throw new RuntimeException(buf.toString());<a name="line.8759"></a>
+<span class="sourceLineNo">8760</span>    }<a name="line.8760"></a>
+<span class="sourceLineNo">8761</span>  }<a name="line.8761"></a>
+<span class="sourceLineNo">8762</span><a name="line.8762"></a>
+<span class="sourceLineNo">8763</span>  @Override<a name="line.8763"></a>
+<span class="sourceLineNo">8764</span>  public void requestCompaction(String why, int priority, boolean major,<a name="line.8764"></a>
+<span class="sourceLineNo">8765</span>      CompactionLifeCycleTracker tracker) throws IOException {<a name="line.8765"></a>
+<span class="sourceLineNo">8766</span>    if (major) {<a name="line.8766"></a>
+<span class="sourceLineNo">8767</span>      stores.values().forEach(HStore::triggerMajorCompaction);<a name="line.8767"></a>
+<span class="sourceLineNo">8768</span>    }<a name="line.8768"></a>
+<span class="sourceLineNo">8769</span>    rsServices.getCompactionRequestor().requestCompaction(this, why, priority, tracker,<a name="line.8769"></a>
+<span class="sourceLineNo">8770</span>        RpcServer.getRequestUser().orElse(null));<a name="line.8770"></a>
+<span class="sourceLineNo">8771</span>  }<a name="line.8771"></a>
+<span class="sourceLineNo">8772</span><a name="line.8772"></a>
+<span class="sourceLineNo">8773</span>  @Override<a name="line.8773"></a>
+<span class="sourceLineNo">8774</span>  public void requestCompaction(byte[] family, String why, int priority, boolean major,<a name="line.8774"></a>
+<span class="sourceLineNo">8775</span>      CompactionLifeCycleTracker tracker) throws IOException {<a name="line.8775"></a>
+<span class="sourceLineNo">8776</span>    HStore store = stores.get(family);<a name="line.8776"></a>
+<span class="sourceLineNo">8777</span>    if (store == null) {<a name="line.8777"></a>
+<span class="sourceLineNo">8778</span>      throw new NoSuchColumnFamilyException("column family " + Bytes.toString(family) +<a name="line.8778"></a>
+<span class="sourceLineNo">8779</span>          " does not exist in region " + getRegionInfo().getRegionNameAsString());<a name="line.8779"></a>
+<span class="sourceLineNo">8780</span>    }<a name="line.8780"></a>
+<span class="sourceLineNo">8781</span>    if (major) {<a name="line.8781"></a>
+<span class="sourceLineNo">8782</span>      store.triggerMajorCompaction();<a name="line.8782"></a>
+<span class="sourceLineNo">8783</span>    }<a name="line.8783"></a>
+<span class="sourceLineNo">8784</span>    rsServices.getCompactionRequestor().requestCompaction(this, store, why, priority, tracker,<a name="line.8784"></a>
+<span class="sourceLineNo">8785</span>        RpcServer.getRequestUser().orElse(null));<a name="line.8785"></a>
+<span class="sourceLineNo">8786</span>  }<a name="line.8786"></a>
+<span class="sourceLineNo">8787</span><a name="line.8787"></a>
+<span class="sourceLineNo">8788</span>  private void requestFlushIfNeeded() throws RegionTooBusyException {<a name="line.8788"></a>
+<span class="sourceLineNo">8789</span>    if(isFlushSize(this.memStoreSizing.getMemStoreSize())) {<a name="line.8789"></a>
+<span class="sourceLineNo">8790</span>      requestFlush();<a name="line.8790"></a>
+<span class="sourceLineNo">8791</span>    }<a name="line.8791"></a>
+<span class="sourceLineNo">8792</span>  }<a name="line.8792"></a>
+<span class="sourceLineNo">8793</span><a name="line.8793"></a>
+<span class="sourceLineNo">8794</span>  private void requestFlush() {<a name="line.8794"></a>
+<span class="sourceLineNo">8795</span>    if (this.rsServices == null) {<a name="line.8795"></a>
+<span class="sourceLineNo">8796</span>      return;<a name="line.8796"></a>
+<span class="sourceLineNo">8797</span>    }<a name="line.8797"></a>
+<span class="sourceLineNo">8798</span>    requestFlush0(FlushLifeCycleTracker.DUMMY);<a name="line.8798"></a>
+<span class="sourceLineNo">8799</span>  }<a name="line.8799"></a>
+<span class="sourceLineNo">8800</span><a name="line.8800"></a>
+<span class="sourceLineNo">8801</span>  private void requestFlush0(FlushLifeCycleTracker tracker) {<a name="line.8801"></a>
+<span class="sourceLineNo">8802</span>    boolean shouldFlush = false;<a name="line.8802"></a>
+<span class="sourceLineNo">8803</span>    synchronized (writestate) {<a name="line.8803"></a>
+<span class="sourceLineNo">8804</span>      if (!this.writestate.isFlushRequested()) {<a name="line.8804"></a>
+<span class="sourceLineNo">8805</span>        shouldFlush = true;<a name="line.8805"></a>
+<span class="sourceLineNo">8806</span>        writestate.flushRequested = true;<a name="line.8806"></a>
+<span class="sourceLineNo">8807</span>      }<a name="line.8807"></a>
+<span class="sourceLineNo">8808</span>    }<a name="line.8808"></a>
+<span class="sourceLineNo">8809</span>    if (shouldFlush) {<a name="line.8809"></a>
+<span class="sourceLineNo">8810</span>      // Make request outside of synchronize block; HBASE-818.<a name="line.8810"></a>
+<span class="sourceLineNo">8811</span>      this.rsServices.getFlushRequester().requestFlush(this, false, tracker);<a name="line.8811"></a>
+<span class="sourceLineNo">8812</span>      if (LOG.isDebugEnabled()) {<a name="line.8812"></a>
+<span class="sourceLineNo">8813</span>        LOG.debug("Flush requested on " + this.getRegionInfo().getEncodedName());<a name="line.8813"></a>
+<span class="sourceLineNo">8814</span>      }<a name="line.8814"></a>
+<span class="sourceLineNo">8815</span>    } else {<a name="line.8815"></a>
+<span class="sourceLineNo">8816</span>      tracker.notExecuted("Flush already requested on " + this);<a name="line.8816"></a>
+<span class="sourceLineNo">8817</span>    }<a name="line.8817"></a>
 <span class="sourceLineNo">8818</span>  }<a name="line.8818"></a>
 <span class="sourceLineNo">8819</span><a name="line.8819"></a>
-<span class="sourceLineNo">8820</span>  /**<a name="line.8820"></a>
-<span class="sourceLineNo">8821</span>   * This method modifies the region's configuration in order to inject replication-related<a name="line.8821"></a>
-<span class="sourceLineNo">8822</span>   * features<a name="line.8822"></a>
-<span class="sourceLineNo">8823</span>   * @param conf region configurations<a name="line.8823"></a>
-<span class="sourceLineNo">8824</span>   */<a name="line.8824"></a>
-<span class="sourceLineNo">8825</span>  static void decorateRegionConfiguration(Configuration conf) {<a name="line.8825"></a>
-<span class="sourceLineNo">8826</span>    if (ReplicationUtils.isReplicationForBulkLoadDataEnabled(conf)) {<a name="line.8826"></a>
-<span class="sourceLineNo">8827</span>      String plugins = conf.get(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY,"");<a name="line.8827"></a>
-<span class="sourceLineNo">8828</span>      String replicationCoprocessorClass = ReplicationObserver.class.getCanonicalName();<a name="line.8828"></a>
-<span class="sourceLineNo">8829</span>      if (!plugins.contains(replicationCoprocessorClass)) {<a name="line.8829"></a>
-<span class="sourceLineNo">8830</span>        conf.set(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY,<a name="line.8830"></a>
-<span class="sourceLineNo">8831</span>            (plugins.equals("") ? "" : (plugins + ",")) + replicationCoprocessorClass);<a name="line.8831"></a>
-<span class="sourceLineNo">8832</span>      }<a name="line.8832"></a>
-<span class="sourceLineNo">8833</span>    }<a name="line.8833"></a>
-<span class="sourceLineNo">8834</span>  }<a name="line.8834"></a>
-<span class="sourceLineNo">8835</span>}<a name="line.8835"></a>
+<span class="sourceLineNo">8820</span>  @Override<a name="line.8820"></a>
+<span class="sourceLineNo">8821</span>  public void requestFlush(FlushLifeCycleTracker tracker) throws IOException {<a name="line.8821"></a>
+<span class="sourceLineNo">8822</span>    requestFlush0(tracker);<a name="line.8822"></a>
+<span class="sourceLineNo">8823</span>  }<a name="line.8823"></a>
+<span class="sourceLineNo">8824</span><a name="line.8824"></a>
+<span class="sourceLineNo">8825</span>  /**<a name="line.8825"></a>
+<span class="sourceLineNo">8826</span>   * This method modifies the region's configuration in order to inject replication-related<a name="line.8826"></a>
+<span class="sourceLineNo">8827</span>   * features<a name="line.8827"></a>
+<span class="sourceLineNo">8828</span>   * @param conf region configurations<a name="line.8828"></a>
+<span class="sourceLineNo">8829</span>   */<a name="line.8829"></a>
+<span class="sourceLineNo">8830</span>  static void decorateRegionConfiguration(Configuration conf) {<a name="line.8830"></a>
+<span class="sourceLineNo">8831</span>    if (ReplicationUtils.isReplicationForBulkLoadDataEnabled(conf)) {<a name="line.8831"></a>
+<span class="sourceLineNo">8832</span>      String plugins = conf.get(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY,"");<a name="line.8832"></a>
+<span class="sourceLineNo">8833</span>      String replicationCoprocessorClass = ReplicationObserver.class.getCanonicalName();<a name="line.8833"></a>
+<span class="sourceLineNo">8834</span>      if (!plugins.contains(replicationCoprocessorClass)) {<a name="line.8834"></a>
+<span class="sourceLineNo">8835</span>        conf.set(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY,<a name="line.8835"></a>
+<span class="sourceLineNo">8836</span>            (plugins.equals("") ? "" : (plugins + ",")) + replicationCoprocessorClass);<a name="line.8836"></a>
+<span class="sourceLineNo">8837</span>      }<a name="line.8837"></a>
+<span class="sourceLineNo">8838</span>    }<a name="line.8838"></a>
+<span class="sourceLineNo">8839</span>  }<a name="line.8839"></a>
+<span class="sourceLineNo">8840</span>}<a name="line.8840"></a>
 
 
 
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 8fcec33..2147e82 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
@@ -7972,875 +7972,880 @@
 <span class="sourceLineNo">7964</span>    if (walEdit.isReplay()) {<a name="line.7964"></a>
 <span class="sourceLineNo">7965</span>      walKey.setOrigLogSeqNum(origLogSeqNum);<a name="line.7965"></a>
 <span class="sourceLineNo">7966</span>    }<a name="line.7966"></a>
-<span class="sourceLineNo">7967</span>    WriteEntry writeEntry = null;<a name="line.7967"></a>
-<span class="sourceLineNo">7968</span>    try {<a name="line.7968"></a>
-<span class="sourceLineNo">7969</span>      long txid = this.wal.append(this.getRegionInfo(), walKey, walEdit, true);<a name="line.7969"></a>
-<span class="sourceLineNo">7970</span>      // Call sync on our edit.<a name="line.7970"></a>
-<span class="sourceLineNo">7971</span>      if (txid != 0) {<a name="line.7971"></a>
-<span class="sourceLineNo">7972</span>        sync(txid, durability);<a name="line.7972"></a>
-<span class="sourceLineNo">7973</span>      }<a name="line.7973"></a>
-<span class="sourceLineNo">7974</span>      writeEntry = walKey.getWriteEntry();<a name="line.7974"></a>
-<span class="sourceLineNo">7975</span>    } catch (IOException ioe) {<a name="line.7975"></a>
-<span class="sourceLineNo">7976</span>      if (walKey != null &amp;&amp; walKey.getWriteEntry() != null) {<a name="line.7976"></a>
-<span class="sourceLineNo">7977</span>        mvcc.complete(walKey.getWriteEntry());<a name="line.7977"></a>
+<span class="sourceLineNo">7967</span>    //don't call the coproc hook for writes to the WAL caused by<a name="line.7967"></a>
+<span class="sourceLineNo">7968</span>    //system lifecycle events like flushes or compactions<a name="line.7968"></a>
+<span class="sourceLineNo">7969</span>    if (this.coprocessorHost != null &amp;&amp; !walEdit.isMetaEdit()) {<a name="line.7969"></a>
+<span class="sourceLineNo">7970</span>      this.coprocessorHost.preWALAppend(walKey, walEdit);<a name="line.7970"></a>
+<span class="sourceLineNo">7971</span>    }<a name="line.7971"></a>
+<span class="sourceLineNo">7972</span>    WriteEntry writeEntry = null;<a name="line.7972"></a>
+<span class="sourceLineNo">7973</span>    try {<a name="line.7973"></a>
+<span class="sourceLineNo">7974</span>      long txid = this.wal.append(this.getRegionInfo(), walKey, walEdit, true);<a name="line.7974"></a>
+<span class="sourceLineNo">7975</span>      // Call sync on our edit.<a name="line.7975"></a>
+<span class="sourceLineNo">7976</span>      if (txid != 0) {<a name="line.7976"></a>
+<span class="sourceLineNo">7977</span>        sync(txid, durability);<a name="line.7977"></a>
 <span class="sourceLineNo">7978</span>      }<a name="line.7978"></a>
-<span class="sourceLineNo">7979</span>      throw ioe;<a name="line.7979"></a>
-<span class="sourceLineNo">7980</span>    }<a name="line.7980"></a>
-<span class="sourceLineNo">7981</span>    return writeEntry;<a name="line.7981"></a>
-<span class="sourceLineNo">7982</span>  }<a name="line.7982"></a>
-<span class="sourceLineNo">7983</span><a name="line.7983"></a>
-<span class="sourceLineNo">7984</span>  /**<a name="line.7984"></a>
-<span class="sourceLineNo">7985</span>   * Do coprocessor pre-increment or pre-append call.<a name="line.7985"></a>
-<span class="sourceLineNo">7986</span>   * @return Result returned out of the coprocessor, which means bypass all further processing and<a name="line.7986"></a>
-<span class="sourceLineNo">7987</span>   *  return the proffered Result instead, or null which means proceed.<a name="line.7987"></a>
-<span class="sourceLineNo">7988</span>   */<a name="line.7988"></a>
-<span class="sourceLineNo">7989</span>  private Result doCoprocessorPreCall(final Operation op, final Mutation mutation)<a name="line.7989"></a>
-<span class="sourceLineNo">7990</span>  throws IOException {<a name="line.7990"></a>
-<span class="sourceLineNo">7991</span>    Result result = null;<a name="line.7991"></a>
-<span class="sourceLineNo">7992</span>    if (this.coprocessorHost != null) {<a name="line.7992"></a>
-<span class="sourceLineNo">7993</span>      switch(op) {<a name="line.7993"></a>
-<span class="sourceLineNo">7994</span>        case INCREMENT:<a name="line.7994"></a>
-<span class="sourceLineNo">7995</span>          result = this.coprocessorHost.preIncrementAfterRowLock((Increment)mutation);<a name="line.7995"></a>
-<span class="sourceLineNo">7996</span>          break;<a name="line.7996"></a>
-<span class="sourceLineNo">7997</span>        case APPEND:<a name="line.7997"></a>
-<span class="sourceLineNo">7998</span>          result = this.coprocessorHost.preAppendAfterRowLock((Append)mutation);<a name="line.7998"></a>
-<span class="sourceLineNo">7999</span>          break;<a name="line.7999"></a>
-<span class="sourceLineNo">8000</span>        default: throw new UnsupportedOperationException(op.toString());<a name="line.8000"></a>
-<span class="sourceLineNo">8001</span>      }<a name="line.8001"></a>
-<span class="sourceLineNo">8002</span>    }<a name="line.8002"></a>
-<span class="sourceLineNo">8003</span>    return result;<a name="line.8003"></a>
-<span class="sourceLineNo">8004</span>  }<a name="line.8004"></a>
-<span class="sourceLineNo">8005</span><a name="line.8005"></a>
-<span class="sourceLineNo">8006</span>  /**<a name="line.8006"></a>
-<span class="sourceLineNo">8007</span>   * Reckon the Cells to apply to WAL, memstore, and to return to the Client; these Sets are not<a name="line.8007"></a>
-<span class="sourceLineNo">8008</span>   * always the same dependent on whether to write WAL.<a name="line.8008"></a>
-<span class="sourceLineNo">8009</span>   *<a name="line.8009"></a>
-<span class="sourceLineNo">8010</span>   * @param results Fill in here what goes back to the Client if it is non-null (if null, client<a name="line.8010"></a>
-<span class="sourceLineNo">8011</span>   *  doesn't want results).<a name="line.8011"></a>
-<span class="sourceLineNo">8012</span>   * @param forMemStore Fill in here what to apply to the MemStore (by Store).<a name="line.8012"></a>
-<span class="sourceLineNo">8013</span>   * @return A WALEdit to apply to WAL or null if we are to skip the WAL.<a name="line.8013"></a>
-<span class="sourceLineNo">8014</span>   */<a name="line.8014"></a>
-<span class="sourceLineNo">8015</span>  private WALEdit reckonDeltas(Operation op, Mutation mutation, Durability effectiveDurability,<a name="line.8015"></a>
-<span class="sourceLineNo">8016</span>      Map&lt;HStore, List&lt;Cell&gt;&gt; forMemStore, List&lt;Cell&gt; results) throws IOException {<a name="line.8016"></a>
-<span class="sourceLineNo">8017</span>    WALEdit walEdit = null;<a name="line.8017"></a>
-<span class="sourceLineNo">8018</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.8018"></a>
-<span class="sourceLineNo">8019</span>    final boolean writeToWAL = effectiveDurability != Durability.SKIP_WAL;<a name="line.8019"></a>
-<span class="sourceLineNo">8020</span>    // Process a Store/family at a time.<a name="line.8020"></a>
-<span class="sourceLineNo">8021</span>    for (Map.Entry&lt;byte [], List&lt;Cell&gt;&gt; entry: mutation.getFamilyCellMap().entrySet()) {<a name="line.8021"></a>
-<span class="sourceLineNo">8022</span>      final byte[] columnFamilyName = entry.getKey();<a name="line.8022"></a>
-<span class="sourceLineNo">8023</span>      List&lt;Cell&gt; deltas = entry.getValue();<a name="line.8023"></a>
-<span class="sourceLineNo">8024</span>      // Reckon for the Store what to apply to WAL and MemStore.<a name="line.8024"></a>
-<span class="sourceLineNo">8025</span>      List&lt;Cell&gt; toApply = reckonDeltasByStore(stores.get(columnFamilyName), op, mutation,<a name="line.8025"></a>
-<span class="sourceLineNo">8026</span>        effectiveDurability, now, deltas, results);<a name="line.8026"></a>
-<span class="sourceLineNo">8027</span>      if (!toApply.isEmpty()) {<a name="line.8027"></a>
-<span class="sourceLineNo">8028</span>        for (Cell cell : toApply) {<a name="line.8028"></a>
-<span class="sourceLineNo">8029</span>          HStore store = getStore(cell);<a name="line.8029"></a>
-<span class="sourceLineNo">8030</span>          if (store == null) {<a name="line.8030"></a>
-<span class="sourceLineNo">8031</span>            checkFamily(CellUtil.cloneFamily(cell));<a name="line.8031"></a>
-<span class="sourceLineNo">8032</span>          } else {<a name="line.8032"></a>
-<span class="sourceLineNo">8033</span>            forMemStore.computeIfAbsent(store, key -&gt; new ArrayList&lt;&gt;()).add(cell);<a name="line.8033"></a>
-<span class="sourceLineNo">8034</span>          }<a name="line.8034"></a>
-<span class="sourceLineNo">8035</span>        }<a name="line.8035"></a>
-<span class="sourceLineNo">8036</span>        if (writeToWAL) {<a name="line.8036"></a>
-<span class="sourceLineNo">8037</span>          if (walEdit == null) {<a name="line.8037"></a>
-<span class="sourceLineNo">8038</span>            walEdit = new WALEdit();<a name="line.8038"></a>
+<span class="sourceLineNo">7979</span>      writeEntry = walKey.getWriteEntry();<a name="line.7979"></a>
+<span class="sourceLineNo">7980</span>    } catch (IOException ioe) {<a name="line.7980"></a>
+<span class="sourceLineNo">7981</span>      if (walKey != null &amp;&amp; walKey.getWriteEntry() != null) {<a name="line.7981"></a>
+<span class="sourceLineNo">7982</span>        mvcc.complete(walKey.getWriteEntry());<a name="line.7982"></a>
+<span class="sourceLineNo">7983</span>      }<a name="line.7983"></a>
+<span class="sourceLineNo">7984</span>      throw ioe;<a name="line.7984"></a>
+<span class="sourceLineNo">7985</span>    }<a name="line.7985"></a>
+<span class="sourceLineNo">7986</span>    return writeEntry;<a name="line.7986"></a>
+<span class="sourceLineNo">7987</span>  }<a name="line.7987"></a>
+<span class="sourceLineNo">7988</span><a name="line.7988"></a>
+<span class="sourceLineNo">7989</span>  /**<a name="line.7989"></a>
+<span class="sourceLineNo">7990</span>   * Do coprocessor pre-increment or pre-append call.<a name="line.7990"></a>
+<span class="sourceLineNo">7991</span>   * @return Result returned out of the coprocessor, which means bypass all further processing and<a name="line.7991"></a>
+<span class="sourceLineNo">7992</span>   *  return the proffered Result instead, or null which means proceed.<a name="line.7992"></a>
+<span class="sourceLineNo">7993</span>   */<a name="line.7993"></a>
+<span class="sourceLineNo">7994</span>  private Result doCoprocessorPreCall(final Operation op, final Mutation mutation)<a name="line.7994"></a>
+<span class="sourceLineNo">7995</span>  throws IOException {<a name="line.7995"></a>
+<span class="sourceLineNo">7996</span>    Result result = null;<a name="line.7996"></a>
+<span class="sourceLineNo">7997</span>    if (this.coprocessorHost != null) {<a name="line.7997"></a>
+<span class="sourceLineNo">7998</span>      switch(op) {<a name="line.7998"></a>
+<span class="sourceLineNo">7999</span>        case INCREMENT:<a name="line.7999"></a>
+<span class="sourceLineNo">8000</span>          result = this.coprocessorHost.preIncrementAfterRowLock((Increment)mutation);<a name="line.8000"></a>
+<span class="sourceLineNo">8001</span>          break;<a name="line.8001"></a>
+<span class="sourceLineNo">8002</span>        case APPEND:<a name="line.8002"></a>
+<span class="sourceLineNo">8003</span>          result = this.coprocessorHost.preAppendAfterRowLock((Append)mutation);<a name="line.8003"></a>
+<span class="sourceLineNo">8004</span>          break;<a name="line.8004"></a>
+<span class="sourceLineNo">8005</span>        default: throw new UnsupportedOperationException(op.toString());<a name="line.8005"></a>
+<span class="sourceLineNo">8006</span>      }<a name="line.8006"></a>
+<span class="sourceLineNo">8007</span>    }<a name="line.8007"></a>
+<span class="sourceLineNo">8008</span>    return result;<a name="line.8008"></a>
+<span class="sourceLineNo">8009</span>  }<a name="line.8009"></a>
+<span class="sourceLineNo">8010</span><a name="line.8010"></a>
+<span class="sourceLineNo">8011</span>  /**<a name="line.8011"></a>
+<span class="sourceLineNo">8012</span>   * Reckon the Cells to apply to WAL, memstore, and to return to the Client; these Sets are not<a name="line.8012"></a>
+<span class="sourceLineNo">8013</span>   * always the same dependent on whether to write WAL.<a name="line.8013"></a>
+<span class="sourceLineNo">8014</span>   *<a name="line.8014"></a>
+<span class="sourceLineNo">8015</span>   * @param results Fill in here what goes back to the Client if it is non-null (if null, client<a name="line.8015"></a>
+<span class="sourceLineNo">8016</span>   *  doesn't want results).<a name="line.8016"></a>
+<span class="sourceLineNo">8017</span>   * @param forMemStore Fill in here what to apply to the MemStore (by Store).<a name="line.8017"></a>
+<span class="sourceLineNo">8018</span>   * @return A WALEdit to apply to WAL or null if we are to skip the WAL.<a name="line.8018"></a>
+<span class="sourceLineNo">8019</span>   */<a name="line.8019"></a>
+<span class="sourceLineNo">8020</span>  private WALEdit reckonDeltas(Operation op, Mutation mutation, Durability effectiveDurability,<a name="line.8020"></a>
+<span class="sourceLineNo">8021</span>      Map&lt;HStore, List&lt;Cell&gt;&gt; forMemStore, List&lt;Cell&gt; results) throws IOException {<a name="line.8021"></a>
+<span class="sourceLineNo">8022</span>    WALEdit walEdit = null;<a name="line.8022"></a>
+<span class="sourceLineNo">8023</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.8023"></a>
+<span class="sourceLineNo">8024</span>    final boolean writeToWAL = effectiveDurability != Durability.SKIP_WAL;<a name="line.8024"></a>
+<span class="sourceLineNo">8025</span>    // Process a Store/family at a time.<a name="line.8025"></a>
+<span class="sourceLineNo">8026</span>    for (Map.Entry&lt;byte [], List&lt;Cell&gt;&gt; entry: mutation.getFamilyCellMap().entrySet()) {<a name="line.8026"></a>
+<span class="sourceLineNo">8027</span>      final byte[] columnFamilyName = entry.getKey();<a name="line.8027"></a>
+<span class="sourceLineNo">8028</span>      List&lt;Cell&gt; deltas = entry.getValue();<a name="line.8028"></a>
+<span class="sourceLineNo">8029</span>      // Reckon for the Store what to apply to WAL and MemStore.<a name="line.8029"></a>
+<span class="sourceLineNo">8030</span>      List&lt;Cell&gt; toApply = reckonDeltasByStore(stores.get(columnFamilyName), op, mutation,<a name="line.8030"></a>
+<span class="sourceLineNo">8031</span>        effectiveDurability, now, deltas, results);<a name="line.8031"></a>
+<span class="sourceLineNo">8032</span>      if (!toApply.isEmpty()) {<a name="line.8032"></a>
+<span class="sourceLineNo">8033</span>        for (Cell cell : toApply) {<a name="line.8033"></a>
+<span class="sourceLineNo">8034</span>          HStore store = getStore(cell);<a name="line.8034"></a>
+<span class="sourceLineNo">8035</span>          if (store == null) {<a name="line.8035"></a>
+<span class="sourceLineNo">8036</span>            checkFamily(CellUtil.cloneFamily(cell));<a name="line.8036"></a>
+<span class="sourceLineNo">8037</span>          } else {<a name="line.8037"></a>
+<span class="sourceLineNo">8038</span>            forMemStore.computeIfAbsent(store, key -&gt; new ArrayList&lt;&gt;()).add(cell);<a name="line.8038"></a>
 <span class="sourceLineNo">8039</span>          }<a name="line.8039"></a>
-<span class="sourceLineNo">8040</span>          walEdit.getCells().addAll(toApply);<a name="line.8040"></a>
-<span class="sourceLineNo">8041</span>        }<a name="line.8041"></a>
-<span class="sourceLineNo">8042</span>      }<a name="line.8042"></a>
-<span class="sourceLineNo">8043</span>    }<a name="line.8043"></a>
-<span class="sourceLineNo">8044</span>    return walEdit;<a name="line.8044"></a>
-<span class="sourceLineNo">8045</span>  }<a name="line.8045"></a>
-<span class="sourceLineNo">8046</span><a name="line.8046"></a>
-<span class="sourceLineNo">8047</span>  /**<a name="line.8047"></a>
-<span class="sourceLineNo">8048</span>   * Reckon the Cells to apply to WAL, memstore, and to return to the Client in passed<a name="line.8048"></a>
-<span class="sourceLineNo">8049</span>   * column family/Store.<a name="line.8049"></a>
-<span class="sourceLineNo">8050</span>   *<a name="line.8050"></a>
-<span class="sourceLineNo">8051</span>   * Does Get of current value and then adds passed in deltas for this Store returning the result.<a name="line.8051"></a>
-<span class="sourceLineNo">8052</span>   *<a name="line.8052"></a>
-<span class="sourceLineNo">8053</span>   * @param op Whether Increment or Append<a name="line.8053"></a>
-<span class="sourceLineNo">8054</span>   * @param mutation The encompassing Mutation object<a name="line.8054"></a>
-<span class="sourceLineNo">8055</span>   * @param deltas Changes to apply to this Store; either increment amount or data to append<a name="line.8055"></a>
-<span class="sourceLineNo">8056</span>   * @param results In here we accumulate all the Cells we are to return to the client. If null,<a name="line.8056"></a>
-<span class="sourceLineNo">8057</span>   *                client doesn't want results returned.<a name="line.8057"></a>
-<span class="sourceLineNo">8058</span>   * @return Resulting Cells after &lt;code&gt;deltas&lt;/code&gt; have been applied to current<a name="line.8058"></a>
-<span class="sourceLineNo">8059</span>   *  values. Side effect is our filling out of the &lt;code&gt;results&lt;/code&gt; List.<a name="line.8059"></a>
-<span class="sourceLineNo">8060</span>   */<a name="line.8060"></a>
-<span class="sourceLineNo">8061</span>  private List&lt;Cell&gt; reckonDeltasByStore(HStore store, Operation op, Mutation mutation,<a name="line.8061"></a>
-<span class="sourceLineNo">8062</span>      Durability effectiveDurability, long now, List&lt;Cell&gt; deltas, List&lt;Cell&gt; results)<a name="line.8062"></a>
-<span class="sourceLineNo">8063</span>      throws IOException {<a name="line.8063"></a>
-<span class="sourceLineNo">8064</span>    byte[] columnFamily = store.getColumnFamilyDescriptor().getName();<a name="line.8064"></a>
-<span class="sourceLineNo">8065</span>    List&lt;Pair&lt;Cell, Cell&gt;&gt; cellPairs = new ArrayList&lt;&gt;(deltas.size());<a name="line.8065"></a>
-<span class="sourceLineNo">8066</span>    // Get previous values for all columns in this family.<a name="line.8066"></a>
-<span class="sourceLineNo">8067</span>    TimeRange tr = null;<a name="line.8067"></a>
-<span class="sourceLineNo">8068</span>    switch (op) {<a name="line.8068"></a>
-<span class="sourceLineNo">8069</span>      case INCREMENT:<a name="line.8069"></a>
-<span class="sourceLineNo">8070</span>        tr = ((Increment)mutation).getTimeRange();<a name="line.8070"></a>
-<span class="sourceLineNo">8071</span>        break;<a name="line.8071"></a>
-<span class="sourceLineNo">8072</span>      case APPEND:<a name="line.8072"></a>
-<span class="sourceLineNo">8073</span>        tr = ((Append)mutation).getTimeRange();<a name="line.8073"></a>
-<span class="sourceLineNo">8074</span>        break;<a name="line.8074"></a>
-<span class="sourceLineNo">8075</span>      default:<a name="line.8075"></a>
+<span class="sourceLineNo">8040</span>        }<a name="line.8040"></a>
+<span class="sourceLineNo">8041</span>        if (writeToWAL) {<a name="line.8041"></a>
+<span class="sourceLineNo">8042</span>          if (walEdit == null) {<a name="line.8042"></a>
+<span class="sourceLineNo">8043</span>            walEdit = new WALEdit();<a name="line.8043"></a>
+<span class="sourceLineNo">8044</span>          }<a name="line.8044"></a>
+<span class="sourceLineNo">8045</span>          walEdit.getCells().addAll(toApply);<a name="line.8045"></a>
+<span class="sourceLineNo">8046</span>        }<a name="line.8046"></a>
+<span class="sourceLineNo">8047</span>      }<a name="line.8047"></a>
+<span class="sourceLineNo">8048</span>    }<a name="line.8048"></a>
+<span class="sourceLineNo">8049</span>    return walEdit;<a name="line.8049"></a>
+<span class="sourceLineNo">8050</span>  }<a name="line.8050"></a>
+<span class="sourceLineNo">8051</span><a name="line.8051"></a>
+<span class="sourceLineNo">8052</span>  /**<a name="line.8052"></a>
+<span class="sourceLineNo">8053</span>   * Reckon the Cells to apply to WAL, memstore, and to return to the Client in passed<a name="line.8053"></a>
+<span class="sourceLineNo">8054</span>   * column family/Store.<a name="line.8054"></a>
+<span class="sourceLineNo">8055</span>   *<a name="line.8055"></a>
+<span class="sourceLineNo">8056</span>   * Does Get of current value and then adds passed in deltas for this Store returning the result.<a name="line.8056"></a>
+<span class="sourceLineNo">8057</span>   *<a name="line.8057"></a>
+<span class="sourceLineNo">8058</span>   * @param op Whether Increment or Append<a name="line.8058"></a>
+<span class="sourceLineNo">8059</span>   * @param mutation The encompassing Mutation object<a name="line.8059"></a>
+<span class="sourceLineNo">8060</span>   * @param deltas Changes to apply to this Store; either increment amount or data to append<a name="line.8060"></a>
+<span class="sourceLineNo">8061</span>   * @param results In here we accumulate all the Cells we are to return to the client. If null,<a name="line.8061"></a>
+<span class="sourceLineNo">8062</span>   *                client doesn't want results returned.<a name="line.8062"></a>
+<span class="sourceLineNo">8063</span>   * @return Resulting Cells after &lt;code&gt;deltas&lt;/code&gt; have been applied to current<a name="line.8063"></a>
+<span class="sourceLineNo">8064</span>   *  values. Side effect is our filling out of the &lt;code&gt;results&lt;/code&gt; List.<a name="line.8064"></a>
+<span class="sourceLineNo">8065</span>   */<a name="line.8065"></a>
+<span class="sourceLineNo">8066</span>  private List&lt;Cell&gt; reckonDeltasByStore(HStore store, Operation op, Mutation mutation,<a name="line.8066"></a>
+<span class="sourceLineNo">8067</span>      Durability effectiveDurability, long now, List&lt;Cell&gt; deltas, List&lt;Cell&gt; results)<a name="line.8067"></a>
+<span class="sourceLineNo">8068</span>      throws IOException {<a name="line.8068"></a>
+<span class="sourceLineNo">8069</span>    byte[] columnFamily = store.getColumnFamilyDescriptor().getName();<a name="line.8069"></a>
+<span class="sourceLineNo">8070</span>    List&lt;Pair&lt;Cell, Cell&gt;&gt; cellPairs = new ArrayList&lt;&gt;(deltas.size());<a name="line.8070"></a>
+<span class="sourceLineNo">8071</span>    // Get previous values for all columns in this family.<a name="line.8071"></a>
+<span class="sourceLineNo">8072</span>    TimeRange tr = null;<a name="line.8072"></a>
+<span class="sourceLineNo">8073</span>    switch (op) {<a name="line.8073"></a>
+<span class="sourceLineNo">8074</span>      case INCREMENT:<a name="line.8074"></a>
+<span class="sourceLineNo">8075</span>        tr = ((Increment)mutation).getTimeRange();<a name="line.8075"></a>
 <span class="sourceLineNo">8076</span>        break;<a name="line.8076"></a>
-<span class="sourceLineNo">8077</span>    }<a name="line.8077"></a>
-<span class="sourceLineNo">8078</span>    List&lt;Cell&gt; currentValues = get(mutation, store, deltas,null, tr);<a name="line.8078"></a>
-<span class="sourceLineNo">8079</span>    // Iterate the input columns and update existing values if they were found, otherwise<a name="line.8079"></a>
-<span class="sourceLineNo">8080</span>    // add new column initialized to the delta amount<a name="line.8080"></a>
-<span class="sourceLineNo">8081</span>    int currentValuesIndex = 0;<a name="line.8081"></a>
-<span class="sourceLineNo">8082</span>    for (int i = 0; i &lt; deltas.size(); i++) {<a name="line.8082"></a>
-<span class="sourceLineNo">8083</span>      Cell delta = deltas.get(i);<a name="line.8083"></a>
-<span class="sourceLineNo">8084</span>      Cell currentValue = null;<a name="line.8084"></a>
-<span class="sourceLineNo">8085</span>      if (currentValuesIndex &lt; currentValues.size() &amp;&amp;<a name="line.8085"></a>
-<span class="sourceLineNo">8086</span>          CellUtil.matchingQualifier(currentValues.get(currentValuesIndex), delta)) {<a name="line.8086"></a>
-<span class="sourceLineNo">8087</span>        currentValue = currentValues.get(currentValuesIndex);<a name="line.8087"></a>
-<span class="sourceLineNo">8088</span>        if (i &lt; (deltas.size() - 1) &amp;&amp; !CellUtil.matchingQualifier(delta, deltas.get(i + 1))) {<a name="line.8088"></a>
-<span class="sourceLineNo">8089</span>          currentValuesIndex++;<a name="line.8089"></a>
-<span class="sourceLineNo">8090</span>        }<a name="line.8090"></a>
-<span class="sourceLineNo">8091</span>      }<a name="line.8091"></a>
-<span class="sourceLineNo">8092</span><a name="line.8092"></a>
-<span class="sourceLineNo">8093</span>      // Switch on whether this an increment or an append building the new Cell to apply.<a name="line.8093"></a>
-<span class="sourceLineNo">8094</span>      Cell newCell = null;<a name="line.8094"></a>
-<span class="sourceLineNo">8095</span>      switch (op) {<a name="line.8095"></a>
-<span class="sourceLineNo">8096</span>        case INCREMENT:<a name="line.8096"></a>
-<span class="sourceLineNo">8097</span>          long deltaAmount = getLongValue(delta);<a name="line.8097"></a>
-<span class="sourceLineNo">8098</span>          final long newValue = currentValue == null ? deltaAmount : getLongValue(currentValue) + deltaAmount;<a name="line.8098"></a>
-<span class="sourceLineNo">8099</span>          newCell = reckonDelta(delta, currentValue, columnFamily, now, mutation, (oldCell) -&gt; Bytes.toBytes(newValue));<a name="line.8099"></a>
-<span class="sourceLineNo">8100</span>          break;<a name="line.8100"></a>
-<span class="sourceLineNo">8101</span>        case APPEND:<a name="line.8101"></a>
-<span class="sourceLineNo">8102</span>          newCell = reckonDelta(delta, currentValue, columnFamily, now, mutation, (oldCell) -&gt;<a name="line.8102"></a>
-<span class="sourceLineNo">8103</span>            ByteBuffer.wrap(new byte[delta.getValueLength() + oldCell.getValueLength()])<a name="line.8103"></a>
-<span class="sourceLineNo">8104</span>                    .put(oldCell.getValueArray(), oldCell.getValueOffset(), oldCell.getValueLength())<a name="line.8104"></a>
-<span class="sourceLineNo">8105</span>                    .put(delta.getValueArray(), delta.getValueOffset(), delta.getValueLength())<a name="line.8105"></a>
-<span class="sourceLineNo">8106</span>                    .array()<a name="line.8106"></a>
-<span class="sourceLineNo">8107</span>          );<a name="line.8107"></a>
-<span class="sourceLineNo">8108</span>          break;<a name="line.8108"></a>
-<span class="sourceLineNo">8109</span>        default: throw new UnsupportedOperationException(op.toString());<a name="line.8109"></a>
-<span class="sourceLineNo">8110</span>      }<a name="line.8110"></a>
-<span class="sourceLineNo">8111</span>      int newCellSize = PrivateCellUtil.estimatedSerializedSizeOf(newCell);<a name="line.8111"></a>
-<span class="sourceLineNo">8112</span>      if (newCellSize &gt; this.maxCellSize) {<a name="line.8112"></a>
-<span class="sourceLineNo">8113</span>        String msg = "Cell with size " + newCellSize + " exceeds limit of " +<a name="line.8113"></a>
-<span class="sourceLineNo">8114</span>            this.maxCellSize + " bytes";<a name="line.8114"></a>
-<span class="sourceLineNo">8115</span>        if (LOG.isDebugEnabled()) {<a name="line.8115"></a>
-<span class="sourceLineNo">8116</span>          LOG.debug(msg);<a name="line.8116"></a>
-<span class="sourceLineNo">8117</span>        }<a name="line.8117"></a>
-<span class="sourceLineNo">8118</span>        throw new DoNotRetryIOException(msg);<a name="line.8118"></a>
-<span class="sourceLineNo">8119</span>      }<a name="line.8119"></a>
-<span class="sourceLineNo">8120</span>      cellPairs.add(new Pair&lt;&gt;(currentValue, newCell));<a name="line.8120"></a>
-<span class="sourceLineNo">8121</span>      // Add to results to get returned to the Client. If null, cilent does not want results.<a name="line.8121"></a>
-<span class="sourceLineNo">8122</span>      if (results != null) {<a name="line.8122"></a>
-<span class="sourceLineNo">8123</span>        results.add(newCell);<a name="line.8123"></a>
+<span class="sourceLineNo">8077</span>      case APPEND:<a name="line.8077"></a>
+<span class="sourceLineNo">8078</span>        tr = ((Append)mutation).getTimeRange();<a name="line.8078"></a>
+<span class="sourceLineNo">8079</span>        break;<a name="line.8079"></a>
+<span class="sourceLineNo">8080</span>      default:<a name="line.8080"></a>
+<span class="sourceLineNo">8081</span>        break;<a name="line.8081"></a>
+<span class="sourceLineNo">8082</span>    }<a name="line.8082"></a>
+<span class="sourceLineNo">8083</span>    List&lt;Cell&gt; currentValues = get(mutation, store, deltas,null, tr);<a name="line.8083"></a>
+<span class="sourceLineNo">8084</span>    // Iterate the input columns and update existing values if they were found, otherwise<a name="line.8084"></a>
+<span class="sourceLineNo">8085</span>    // add new column initialized to the delta amount<a name="line.8085"></a>
+<span class="sourceLineNo">8086</span>    int currentValuesIndex = 0;<a name="line.8086"></a>
+<span class="sourceLineNo">8087</span>    for (int i = 0; i &lt; deltas.size(); i++) {<a name="line.8087"></a>
+<span class="sourceLineNo">8088</span>      Cell delta = deltas.get(i);<a name="line.8088"></a>
+<span class="sourceLineNo">8089</span>      Cell currentValue = null;<a name="line.8089"></a>
+<span class="sourceLineNo">8090</span>      if (currentValuesIndex &lt; currentValues.size() &amp;&amp;<a name="line.8090"></a>
+<span class="sourceLineNo">8091</span>          CellUtil.matchingQualifier(currentValues.get(currentValuesIndex), delta)) {<a name="line.8091"></a>
+<span class="sourceLineNo">8092</span>        currentValue = currentValues.get(currentValuesIndex);<a name="line.8092"></a>
+<span class="sourceLineNo">8093</span>        if (i &lt; (deltas.size() - 1) &amp;&amp; !CellUtil.matchingQualifier(delta, deltas.get(i + 1))) {<a name="line.8093"></a>
+<span class="sourceLineNo">8094</span>          currentValuesIndex++;<a name="line.8094"></a>
+<span class="sourceLineNo">8095</span>        }<a name="line.8095"></a>
+<span class="sourceLineNo">8096</span>      }<a name="line.8096"></a>
+<span class="sourceLineNo">8097</span><a name="line.8097"></a>
+<span class="sourceLineNo">8098</span>      // Switch on whether this an increment or an append building the new Cell to apply.<a name="line.8098"></a>
+<span class="sourceLineNo">8099</span>      Cell newCell = null;<a name="line.8099"></a>
+<span class="sourceLineNo">8100</span>      switch (op) {<a name="line.8100"></a>
+<span class="sourceLineNo">8101</span>        case INCREMENT:<a name="line.8101"></a>
+<span class="sourceLineNo">8102</span>          long deltaAmount = getLongValue(delta);<a name="line.8102"></a>
+<span class="sourceLineNo">8103</span>          final long newValue = currentValue == null ? deltaAmount : getLongValue(currentValue) + deltaAmount;<a name="line.8103"></a>
+<span class="sourceLineNo">8104</span>          newCell = reckonDelta(delta, currentValue, columnFamily, now, mutation, (oldCell) -&gt; Bytes.toBytes(newValue));<a name="line.8104"></a>
+<span class="sourceLineNo">8105</span>          break;<a name="line.8105"></a>
+<span class="sourceLineNo">8106</span>        case APPEND:<a name="line.8106"></a>
+<span class="sourceLineNo">8107</span>          newCell = reckonDelta(delta, currentValue, columnFamily, now, mutation, (oldCell) -&gt;<a name="line.8107"></a>
+<span class="sourceLineNo">8108</span>            ByteBuffer.wrap(new byte[delta.getValueLength() + oldCell.getValueLength()])<a name="line.8108"></a>
+<span class="sourceLineNo">8109</span>                    .put(oldCell.getValueArray(), oldCell.getValueOffset(), oldCell.getValueLength())<a name="line.8109"></a>
+<span class="sourceLineNo">8110</span>                    .put(delta.getValueArray(), delta.getValueOffset(), delta.getValueLength())<a name="line.8110"></a>
+<span class="sourceLineNo">8111</span>                    .array()<a name="line.8111"></a>
+<span class="sourceLineNo">8112</span>          );<a name="line.8112"></a>
+<span class="sourceLineNo">8113</span>          break;<a name="line.8113"></a>
+<span class="sourceLineNo">8114</span>        default: throw new UnsupportedOperationException(op.toString());<a name="line.8114"></a>
+<span class="sourceLineNo">8115</span>      }<a name="line.8115"></a>
+<span class="sourceLineNo">8116</span>      int newCellSize = PrivateCellUtil.estimatedSerializedSizeOf(newCell);<a name="line.8116"></a>
+<span class="sourceLineNo">8117</span>      if (newCellSize &gt; this.maxCellSize) {<a name="line.8117"></a>
+<span class="sourceLineNo">8118</span>        String msg = "Cell with size " + newCellSize + " exceeds limit of " +<a name="line.8118"></a>
+<span class="sourceLineNo">8119</span>            this.maxCellSize + " bytes";<a name="line.8119"></a>
+<span class="sourceLineNo">8120</span>        if (LOG.isDebugEnabled()) {<a name="line.8120"></a>
+<span class="sourceLineNo">8121</span>          LOG.debug(msg);<a name="line.8121"></a>
+<span class="sourceLineNo">8122</span>        }<a name="line.8122"></a>
+<span class="sourceLineNo">8123</span>        throw new DoNotRetryIOException(msg);<a name="line.8123"></a>
 <span class="sourceLineNo">8124</span>      }<a name="line.8124"></a>
-<span class="sourceLineNo">8125</span>    }<a name="line.8125"></a>
-<span class="sourceLineNo">8126</span><a name="line.8126"></a>
-<span class="sourceLineNo">8127</span>    // Give coprocessors a chance to update the new cells before apply to WAL or memstore<a name="line.8127"></a>
-<span class="sourceLineNo">8128</span>    if (coprocessorHost != null) {<a name="line.8128"></a>
-<span class="sourceLineNo">8129</span>      // Here the operation must be increment or append.<a name="line.8129"></a>
-<span class="sourceLineNo">8130</span>      cellPairs = op == Operation.INCREMENT ?<a name="line.8130"></a>
-<span class="sourceLineNo">8131</span>          coprocessorHost.postIncrementBeforeWAL(mutation, cellPairs) :<a name="line.8131"></a>
-<span class="sourceLineNo">8132</span>          coprocessorHost.postAppendBeforeWAL(mutation, cellPairs);<a name="line.8132"></a>
-<span class="sourceLineNo">8133</span>    }<a name="line.8133"></a>
-<span class="sourceLineNo">8134</span>    return cellPairs.stream().map(Pair::getSecond).collect(Collectors.toList());<a name="line.8134"></a>
-<span class="sourceLineNo">8135</span>  }<a name="line.8135"></a>
-<span class="sourceLineNo">8136</span><a name="line.8136"></a>
-<span class="sourceLineNo">8137</span>  private static Cell reckonDelta(final Cell delta, final Cell currentCell,<a name="line.8137"></a>
-<span class="sourceLineNo">8138</span>                                  final byte[] columnFamily, final long now,<a name="line.8138"></a>
-<span class="sourceLineNo">8139</span>                                  Mutation mutation, Function&lt;Cell, byte[]&gt; supplier) throws IOException {<a name="line.8139"></a>
-<span class="sourceLineNo">8140</span>    // Forward any tags found on the delta.<a name="line.8140"></a>
-<span class="sourceLineNo">8141</span>    List&lt;Tag&gt; tags = TagUtil.carryForwardTags(delta);<a name="line.8141"></a>
-<span class="sourceLineNo">8142</span>    tags = TagUtil.carryForwardTTLTag(tags, mutation.getTTL());<a name="line.8142"></a>
-<span class="sourceLineNo">8143</span>    if (currentCell != null) {<a name="line.8143"></a>
-<span class="sourceLineNo">8144</span>      tags = TagUtil.carryForwardTags(tags, currentCell);<a name="line.8144"></a>
-<span class="sourceLineNo">8145</span>      byte[] newValue = supplier.apply(currentCell);<a name="line.8145"></a>
-<span class="sourceLineNo">8146</span>      return ExtendedCellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.8146"></a>
-<span class="sourceLineNo">8147</span>              .setRow(mutation.getRow(), 0, mutation.getRow().length)<a name="line.8147"></a>
-<span class="sourceLineNo">8148</span>              .setFamily(columnFamily, 0, columnFamily.length)<a name="line.8148"></a>
-<span class="sourceLineNo">8149</span>              // copy the qualifier if the cell is located in shared memory.<a name="line.8149"></a>
-<span class="sourceLineNo">8150</span>              .setQualifier(CellUtil.cloneQualifier(delta))<a name="line.8150"></a>
-<span class="sourceLineNo">8151</span>              .setTimestamp(Math.max(currentCell.getTimestamp() + 1, now))<a name="line.8151"></a>
-<span class="sourceLineNo">8152</span>              .setType(KeyValue.Type.Put.getCode())<a name="line.8152"></a>
-<span class="sourceLineNo">8153</span>              .setValue(newValue, 0, newValue.length)<a name="line.8153"></a>
-<span class="sourceLineNo">8154</span>              .setTags(TagUtil.fromList(tags))<a name="line.8154"></a>
-<span class="sourceLineNo">8155</span>              .build();<a name="line.8155"></a>
-<span class="sourceLineNo">8156</span>    } else {<a name="line.8156"></a>
-<span class="sourceLineNo">8157</span>      PrivateCellUtil.updateLatestStamp(delta, now);<a name="line.8157"></a>
-<span class="sourceLineNo">8158</span>      return CollectionUtils.isEmpty(tags) ? delta : PrivateCellUtil.createCell(delta, tags);<a name="line.8158"></a>
-<span class="sourceLineNo">8159</span>    }<a name="line.8159"></a>
-<span class="sourceLineNo">8160</span>  }<a name="line.8160"></a>
-<span class="sourceLineNo">8161</span><a name="line.8161"></a>
-<span class="sourceLineNo">8162</span>  /**<a name="line.8162"></a>
-<span class="sourceLineNo">8163</span>   * @return Get the long out of the passed in Cell<a name="line.8163"></a>
-<span class="sourceLineNo">8164</span>   */<a name="line.8164"></a>
-<span class="sourceLineNo">8165</span>  private static long getLongValue(final Cell cell) throws DoNotRetryIOException {<a name="line.8165"></a>
-<span class="sourceLineNo">8166</span>    int len = cell.getValueLength();<a name="line.8166"></a>
-<span class="sourceLineNo">8167</span>    if (len != Bytes.SIZEOF_LONG) {<a name="line.8167"></a>
-<span class="sourceLineNo">8168</span>      // throw DoNotRetryIOException instead of IllegalArgumentException<a name="line.8168"></a>
-<span class="sourceLineNo">8169</span>      throw new DoNotRetryIOException("Field is not a long, it's " + len + " bytes wide");<a name="line.8169"></a>
-<span class="sourceLineNo">8170</span>    }<a name="line.8170"></a>
-<span class="sourceLineNo">8171</span>    return PrivateCellUtil.getValueAsLong(cell);<a name="line.8171"></a>
-<span class="sourceLineNo">8172</span>  }<a name="line.8172"></a>
-<span class="sourceLineNo">8173</span><a name="line.8173"></a>
-<span class="sourceLineNo">8174</span>  /**<a name="line.8174"></a>
-<span class="sourceLineNo">8175</span>   * Do a specific Get on passed &lt;code&gt;columnFamily&lt;/code&gt; and column qualifiers.<a name="line.8175"></a>
-<span class="sourceLineNo">8176</span>   * @param mutation Mutation we are doing this Get for.<a name="line.8176"></a>
-<span class="sourceLineNo">8177</span>   * @param store Which column family on row (TODO: Go all Gets in one go)<a name="line.8177"></a>
-<span class="sourceLineNo">8178</span>   * @param coordinates Cells from &lt;code&gt;mutation&lt;/code&gt; used as coordinates applied to Get.<a name="line.8178"></a>
-<span class="sourceLineNo">8179</span>   * @return Return list of Cells found.<a name="line.8179"></a>
-<span class="sourceLineNo">8180</span>   */<a name="line.8180"></a>
-<span class="sourceLineNo">8181</span>  private List&lt;Cell&gt; get(Mutation mutation, HStore store, List&lt;Cell&gt; coordinates,<a name="line.8181"></a>
-<span class="sourceLineNo">8182</span>      IsolationLevel isolation, TimeRange tr) throws IOException {<a name="line.8182"></a>
-<span class="sourceLineNo">8183</span>    // Sort the cells so that they match the order that they appear in the Get results. Otherwise,<a name="line.8183"></a>
-<span class="sourceLineNo">8184</span>    // we won't be able to find the existing values if the cells are not specified in order by the<a name="line.8184"></a>
-<span class="sourceLineNo">8185</span>    // client since cells are in an array list.<a name="line.8185"></a>
-<span class="sourceLineNo">8186</span>    // TODO: I don't get why we are sorting. St.Ack 20150107<a name="line.8186"></a>
-<span class="sourceLineNo">8187</span>    sort(coordinates, store.getComparator());<a name="line.8187"></a>
-<span class="sourceLineNo">8188</span>    Get get = new Get(mutation.getRow());<a name="line.8188"></a>
-<span class="sourceLineNo">8189</span>    if (isolation != null) {<a name="line.8189"></a>
-<span class="sourceLineNo">8190</span>      get.setIsolationLevel(isolation);<a name="line.8190"></a>
-<span class="sourceLineNo">8191</span>    }<a name="line.8191"></a>
-<span class="sourceLineNo">8192</span>    for (Cell cell: coordinates) {<a name="line.8192"></a>
-<span class="sourceLineNo">8193</span>      get.addColumn(store.getColumnFamilyDescriptor().getName(), CellUtil.cloneQualifier(cell));<a name="line.8193"></a>
-<span class="sourceLineNo">8194</span>    }<a name="line.8194"></a>
-<span class="sourceLineNo">8195</span>    // Increments carry time range. If an Increment instance, put it on the Get.<a name="line.8195"></a>
-<span class="sourceLineNo">8196</span>    if (tr != null) {<a name="line.8196"></a>
-<span class="sourceLineNo">8197</span>      get.setTimeRange(tr.getMin(), tr.getMax());<a name="line.8197"></a>
-<span class="sourceLineNo">8198</span>    }<a name="line.8198"></a>
-<span class="sourceLineNo">8199</span>    return get(get, false);<a name="line.8199"></a>
-<span class="sourceLineNo">8200</span>  }<a name="line.8200"></a>
-<span class="sourceLineNo">8201</span><a name="line.8201"></a>
-<span class="sourceLineNo">8202</span>  /**<a name="line.8202"></a>
-<span class="sourceLineNo">8203</span>   * @return Sorted list of &lt;code&gt;cells&lt;/code&gt; using &lt;code&gt;comparator&lt;/code&gt;<a name="line.8203"></a>
-<span class="sourceLineNo">8204</span>   */<a name="line.8204"></a>
-<span class="sourceLineNo">8205</span>  private static List&lt;Cell&gt; sort(List&lt;Cell&gt; cells, final CellComparator comparator) {<a name="line.8205"></a>
-<span class="sourceLineNo">8206</span>    cells.sort(comparator);<a name="line.8206"></a>
-<span class="sourceLineNo">8207</span>    return cells;<a name="line.8207"></a>
-<span class="sourceLineNo">8208</span>  }<a name="line.8208"></a>
-<span class="sourceLineNo">8209</span><a name="line.8209"></a>
-<span class="sourceLineNo">8210</span>  public static final long FIXED_OVERHEAD = ClassSize.align(<a name="line.8210"></a>
-<span class="sourceLineNo">8211</span>      ClassSize.OBJECT +<a name="line.8211"></a>
-<span class="sourceLineNo">8212</span>      ClassSize.ARRAY +<a name="line.8212"></a>
-<span class="sourceLineNo">8213</span>      55 * ClassSize.REFERENCE + 3 * Bytes.SIZEOF_INT +<a name="line.8213"></a>
-<span class="sourceLineNo">8214</span>      (15 * Bytes.SIZEOF_LONG) +<a name="line.8214"></a>
-<span class="sourceLineNo">8215</span>      3 * Bytes.SIZEOF_BOOLEAN);<a name="line.8215"></a>
-<span class="sourceLineNo">8216</span><a name="line.8216"></a>
-<span class="sourceLineNo">8217</span>  // woefully out of date - currently missing:<a name="line.8217"></a>
-<span class="sourceLineNo">8218</span>  // 1 x HashMap - coprocessorServiceHandlers<a name="line.8218"></a>
-<span class="sourceLineNo">8219</span>  // 6 x LongAdder - numMutationsWithoutWAL, dataInMemoryWithoutWAL,<a name="line.8219"></a>
-<span class="sourceLineNo">8220</span>  //   checkAndMutateChecksPassed, checkAndMutateChecksFailed, readRequestsCount,<a name="line.8220"></a>
-<span class="sourceLineNo">8221</span>  //   writeRequestsCount, cpRequestsCount<a name="line.8221"></a>
-<span class="sourceLineNo">8222</span>  // 1 x HRegion$WriteState - writestate<a name="line.8222"></a>
-<span class="sourceLineNo">8223</span>  // 1 x RegionCoprocessorHost - coprocessorHost<a name="line.8223"></a>
-<span class="sourceLineNo">8224</span>  // 1 x RegionSplitPolicy - splitPolicy<a name="line.8224"></a>
-<span class="sourceLineNo">8225</span>  // 1 x MetricsRegion - metricsRegion<a name="line.8225"></a>
-<span class="sourceLineNo">8226</span>  // 1 x MetricsRegionWrapperImpl - metricsRegionWrapper<a name="line.8226"></a>
-<span class="sourceLineNo">8227</span>  public static final long DEEP_OVERHEAD = FIXED_OVERHEAD +<a name="line.8227"></a>
-<span class="sourceLineNo">8228</span>      ClassSize.OBJECT + // closeLock<a name="line.8228"></a>
-<span class="sourceLineNo">8229</span>      (2 * ClassSize.ATOMIC_BOOLEAN) + // closed, closing<a name="line.8229"></a>
-<span class="sourceLineNo">8230</span>      (3 * ClassSize.ATOMIC_LONG) + // numPutsWithoutWAL, dataInMemoryWithoutWAL,<a name="line.8230"></a>
-<span class="sourceLineNo">8231</span>                                    // compactionsFailed<a name="line.8231"></a>
-<span class="sourceLineNo">8232</span>      (2 * ClassSize.CONCURRENT_HASHMAP) +  // lockedRows, scannerReadPoints<a name="line.8232"></a>
-<span class="sourceLineNo">8233</span>      WriteState.HEAP_SIZE + // writestate<a name="line.8233"></a>
-<span class="sourceLineNo">8234</span>      ClassSize.CONCURRENT_SKIPLISTMAP + ClassSize.CONCURRENT_SKIPLISTMAP_ENTRY + // stores<a name="line.8234"></a>
-<span class="sourceLineNo">8235</span>      (2 * ClassSize.REENTRANT_LOCK) + // lock, updatesLock<a name="line.8235"></a>
-<span class="sourceLineNo">8236</span>      MultiVersionConcurrencyControl.FIXED_SIZE // mvcc<a name="line.8236"></a>
-<span class="sourceLineNo">8237</span>      + 2 * ClassSize.TREEMAP // maxSeqIdInStores, replicationScopes<a name="line.8237"></a>
-<span class="sourceLineNo">8238</span>      + 2 * ClassSize.ATOMIC_INTEGER // majorInProgress, minorInProgress<a name="line.8238"></a>
-<span class="sourceLineNo">8239</span>      + ClassSize.STORE_SERVICES // store services<a name="line.8239"></a>
-<span class="sourceLineNo">8240</span>      + StoreHotnessProtector.FIXED_SIZE<a name="line.8240"></a>
-<span class="sourceLineNo">8241</span>      ;<a name="line.8241"></a>
-<span class="sourceLineNo">8242</span><a name="line.8242"></a>
-<span class="sourceLineNo">8243</span>  @Override<a name="line.8243"></a>
-<span class="sourceLineNo">8244</span>  public long heapSize() {<a name="line.8244"></a>
-<span class="sourceLineNo">8245</span>    // this does not take into account row locks, recent flushes, mvcc entries, and more<a name="line.8245"></a>
-<span class="sourceLineNo">8246</span>    return DEEP_OVERHEAD + stores.values().stream().mapToLong(HStore::heapSize).sum();<a name="line.8246"></a>
-<span class="sourceLineNo">8247</span>  }<a name="line.8247"></a>
-<span class="sourceLineNo">8248</span><a name="line.8248"></a>
-<span class="sourceLineNo">8249</span>  /**<a name="line.8249"></a>
-<span class="sourceLineNo">8250</span>   * Registers a new protocol buffer {@link Service} subclass as a coprocessor endpoint to<a name="line.8250"></a>
-<span class="sourceLineNo">8251</span>   * be available for handling Region#execService(com.google.protobuf.RpcController,<a name="line.8251"></a>
-<span class="sourceLineNo">8252</span>   *    org.apache.hadoop.hbase.protobuf.generated.ClientProtos.CoprocessorServiceCall) calls.<a name="line.8252"></a>
-<span class="sourceLineNo">8253</span>   *<a name="line.8253"></a>
-<span class="sourceLineNo">8254</span>   * &lt;p&gt;<a name="line.8254"></a>
-<span class="sourceLineNo">8255</span>   * Only a single instance may be registered per region for a given {@link Service} subclass (the<a name="line.8255"></a>
-<span class="sourceLineNo">8256</span>   * instances are keyed on {@link com.google.protobuf.Descriptors.ServiceDescriptor#getFullName()}.<a name="line.8256"></a>
-<span class="sourceLineNo">8257</span>   * After the first registration, subsequent calls with the same service name will fail with<a name="line.8257"></a>
-<span class="sourceLineNo">8258</span>   * a return value of {@code false}.<a name="line.8258"></a>
-<span class="sourceLineNo">8259</span>   * &lt;/p&gt;<a name="line.8259"></a>
-<span class="sourceLineNo">8260</span>   * @param instance the {@code Service} subclass instance to expose as a coprocessor endpoint<a name="line.8260"></a>
-<span class="sourceLineNo">8261</span>   * @return {@code true} if the registration was successful, {@code false}<a name="line.8261"></a>
-<span class="sourceLineNo">8262</span>   * otherwise<a name="line.8262"></a>
-<span class="sourceLineNo">8263</span>   */<a name="line.8263"></a>
-<span class="sourceLineNo">8264</span>  public boolean registerService(com.google.protobuf.Service instance) {<a name="line.8264"></a>
-<span class="sourceLineNo">8265</span>    /*<a name="line.8265"></a>
-<span class="sourceLineNo">8266</span>     * No stacking of instances is allowed for a single service name<a name="line.8266"></a>
-<span class="sourceLineNo">8267</span>     */<a name="line.8267"></a>
-<span class="sourceLineNo">8268</span>    com.google.protobuf.Descriptors.ServiceDescriptor serviceDesc = instance.getDescriptorForType();<a name="line.8268"></a>
-<span class="sourceLineNo">8269</span>    String serviceName = CoprocessorRpcUtils.getServiceName(serviceDesc);<a name="line.8269"></a>
-<span class="sourceLineNo">8270</span>    if (coprocessorServiceHandlers.containsKey(serviceName)) {<a name="line.8270"></a>
-<span class="sourceLineNo">8271</span>      LOG.error("Coprocessor service " + serviceName +<a name="line.8271"></a>
-<span class="sourceLineNo">8272</span>          " already registered, rejecting request from " + instance);<a name="line.8272"></a>
-<span class="sourceLineNo">8273</span>      return false;<a name="line.8273"></a>
-<span class="sourceLineNo">8274</span>    }<a name="line.8274"></a>
-<span class="sourceLineNo">8275</span><a name="line.8275"></a>
-<span class="sourceLineNo">8276</span>    coprocessorServiceHandlers.put(serviceName, instance);<a name="line.8276"></a>
-<span class="sourceLineNo">8277</span>    if (LOG.isDebugEnabled()) {<a name="line.8277"></a>
-<span class="sourceLineNo">8278</span>      LOG.debug("Registered coprocessor service: region=" +<a name="line.8278"></a>
-<span class="sourceLineNo">8279</span>          Bytes.toStringBinary(getRegionInfo().getRegionName()) +<a name="line.8279"></a>
-<span class="sourceLineNo">8280</span>          " service=" + serviceName);<a name="line.8280"></a>
-<span class="sourceLineNo">8281</span>    }<a name="line.8281"></a>
-<span class="sourceLineNo">8282</span>    return true;<a name="line.8282"></a>
-<span class="sourceLineNo">8283</span>  }<a name="line.8283"></a>
-<span class="sourceLineNo">8284</span><a name="line.8284"></a>
-<span class="sourceLineNo">8285</span>  /**<a name="line.8285"></a>
-<span class="sourceLineNo">8286</span>   * Executes a single protocol buffer coprocessor endpoint {@link Service} method using<a name="line.8286"></a>
-<span class="sourceLineNo">8287</span>   * the registered protocol handlers.  {@link Service} implementations must be registered via the<a name="line.8287"></a>
-<span class="sourceLineNo">8288</span>   * {@link #registerService(com.google.protobuf.Service)}<a name="line.8288"></a>
-<span class="sourceLineNo">8289</span>   * method before they are available.<a name="line.8289"></a>
-<span class="sourceLineNo">8290</span>   *<a name="line.8290"></a>
-<span class="sourceLineNo">8291</span>   * @param controller an {@code RpcContoller} implementation to pass to the invoked service<a name="line.8291"></a>
-<span class="sourceLineNo">8292</span>   * @param call a {@code CoprocessorServiceCall} instance identifying the service, method,<a name="line.8292"></a>
-<span class="sourceLineNo">8293</span>   *     and parameters for the method invocation<a name="line.8293"></a>
-<span class="sourceLineNo">8294</span>   * @return a protocol buffer {@code Message} instance containing the method's result<a name="line.8294"></a>
-<span class="sourceLineNo">8295</span>   * @throws IOException if no registered service handler is found or an error<a name="line.8295"></a>
-<span class="sourceLineNo">8296</span>   *     occurs during the invocation<a name="line.8296"></a>
-<span class="sourceLineNo">8297</span>   * @see #registerService(com.google.protobuf.Service)<a name="line.8297"></a>
-<span class="sourceLineNo">8298</span>   */<a name="line.8298"></a>
-<span class="sourceLineNo">8299</span>  public com.google.protobuf.Message execService(com.google.protobuf.RpcController controller,<a name="line.8299"></a>
-<span class="sourceLineNo">8300</span>      CoprocessorServiceCall call) throws IOException {<a name="line.8300"></a>
-<span class="sourceLineNo">8301</span>    String serviceName = call.getServiceName();<a name="line.8301"></a>
-<span class="sourceLineNo">8302</span>    com.google.protobuf.Service service = coprocessorServiceHandlers.get(serviceName);<a name="line.8302"></a>
-<span class="sourceLineNo">8303</span>    if (service == null) {<a name="line.8303"></a>
-<span class="sourceLineNo">8304</span>      throw new UnknownProtocolException(null, "No registered coprocessor service found for " +<a name="line.8304"></a>
-<span class="sourceLineNo">8305</span>          serviceName + " in region " + Bytes.toStringBinary(getRegionInfo().getRegionName()));<a name="line.8305"></a>
-<span class="sourceLineNo">8306</span>    }<a name="line.8306"></a>
-<span class="sourceLineNo">8307</span>    com.google.protobuf.Descriptors.ServiceDescriptor serviceDesc = service.getDescriptorForType();<a name="line.8307"></a>
-<span class="sourceLineNo">8308</span><a name="line.8308"></a>
-<span class="sourceLineNo">8309</span>    cpRequestsCount.increment();<a name="line.8309"></a>
-<span class="sourceLineNo">8310</span>    String methodName = call.getMethodName();<a name="line.8310"></a>
-<span class="sourceLineNo">8311</span>    com.google.protobuf.Descriptors.MethodDescriptor methodDesc =<a name="line.8311"></a>
-<span class="sourceLineNo">8312</span>        CoprocessorRpcUtils.getMethodDescriptor(methodName, serviceDesc);<a name="line.8312"></a>
+<span class="sourceLineNo">8125</span>      cellPairs.add(new Pair&lt;&gt;(currentValue, newCell));<a name="line.8125"></a>
+<span class="sourceLineNo">8126</span>      // Add to results to get returned to the Client. If null, cilent does not want results.<a name="line.8126"></a>
+<span class="sourceLineNo">8127</span>      if (results != null) {<a name="line.8127"></a>
+<span class="sourceLineNo">8128</span>        results.add(newCell);<a name="line.8128"></a>
+<span class="sourceLineNo">8129</span>      }<a name="line.8129"></a>
+<span class="sourceLineNo">8130</span>    }<a name="line.8130"></a>
+<span class="sourceLineNo">8131</span><a name="line.8131"></a>
+<span class="sourceLineNo">8132</span>    // Give coprocessors a chance to update the new cells before apply to WAL or memstore<a name="line.8132"></a>
+<span class="sourceLineNo">8133</span>    if (coprocessorHost != null) {<a name="line.8133"></a>
+<span class="sourceLineNo">8134</span>      // Here the operation must be increment or append.<a name="line.8134"></a>
+<span class="sourceLineNo">8135</span>      cellPairs = op == Operation.INCREMENT ?<a name="line.8135"></a>
+<span class="sourceLineNo">8136</span>          coprocessorHost.postIncrementBeforeWAL(mutation, cellPairs) :<a name="line.8136"></a>
+<span class="sourceLineNo">8137</span>          coprocessorHost.postAppendBeforeWAL(mutation, cellPairs);<a name="line.8137"></a>
+<span class="sourceLineNo">8138</span>    }<a name="line.8138"></a>
+<span class="sourceLineNo">8139</span>    return cellPairs.stream().map(Pair::getSecond).collect(Collectors.toList());<a name="line.8139"></a>
+<span class="sourceLineNo">8140</span>  }<a name="line.8140"></a>
+<span class="sourceLineNo">8141</span><a name="line.8141"></a>
+<span class="sourceLineNo">8142</span>  private static Cell reckonDelta(final Cell delta, final Cell currentCell,<a name="line.8142"></a>
+<span class="sourceLineNo">8143</span>                                  final byte[] columnFamily, final long now,<a name="line.8143"></a>
+<span class="sourceLineNo">8144</span>                                  Mutation mutation, Function&lt;Cell, byte[]&gt; supplier) throws IOException {<a name="line.8144"></a>
+<span class="sourceLineNo">8145</span>    // Forward any tags found on the delta.<a name="line.8145"></a>
+<span class="sourceLineNo">8146</span>    List&lt;Tag&gt; tags = TagUtil.carryForwardTags(delta);<a name="line.8146"></a>
+<span class="sourceLineNo">8147</span>    tags = TagUtil.carryForwardTTLTag(tags, mutation.getTTL());<a name="line.8147"></a>
+<span class="sourceLineNo">8148</span>    if (currentCell != null) {<a name="line.8148"></a>
+<span class="sourceLineNo">8149</span>      tags = TagUtil.carryForwardTags(tags, currentCell);<a name="line.8149"></a>
+<span class="sourceLineNo">8150</span>      byte[] newValue = supplier.apply(currentCell);<a name="line.8150"></a>
+<span class="sourceLineNo">8151</span>      return ExtendedCellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.8151"></a>
+<span class="sourceLineNo">8152</span>              .setRow(mutation.getRow(), 0, mutation.getRow().length)<a name="line.8152"></a>
+<span class="sourceLineNo">8153</span>              .setFamily(columnFamily, 0, columnFamily.length)<a name="line.8153"></a>
+<span class="sourceLineNo">8154</span>              // copy the qualifier if the cell is located in shared memory.<a name="line.8154"></a>
+<span class="sourceLineNo">8155</span>              .setQualifier(CellUtil.cloneQualifier(delta))<a name="line.8155"></a>
+<span class="sourceLineNo">8156</span>              .setTimestamp(Math.max(currentCell.getTimestamp() + 1, now))<a name="line.8156"></a>
+<span class="sourceLineNo">8157</span>              .setType(KeyValue.Type.Put.getCode())<a name="line.8157"></a>
+<span class="sourceLineNo">8158</span>              .setValue(newValue, 0, newValue.length)<a name="line.8158"></a>
+<span class="sourceLineNo">8159</span>              .setTags(TagUtil.fromList(tags))<a name="line.8159"></a>
+<span class="sourceLineNo">8160</span>              .build();<a name="line.8160"></a>
+<span class="sourceLineNo">8161</span>    } else {<a name="line.8161"></a>
+<span class="sourceLineNo">8162</span>      PrivateCellUtil.updateLatestStamp(delta, now);<a name="line.8162"></a>
+<span class="sourceLineNo">8163</span>      return CollectionUtils.isEmpty(tags) ? delta : PrivateCellUtil.createCell(delta, tags);<a name="line.8163"></a>
+<span class="sourceLineNo">8164</span>    }<a name="line.8164"></a>
+<span class="sourceLineNo">8165</span>  }<a name="line.8165"></a>
+<span class="sourceLineNo">8166</span><a name="line.8166"></a>
+<span class="sourceLineNo">8167</span>  /**<a name="line.8167"></a>
+<span class="sourceLineNo">8168</span>   * @return Get the long out of the passed in Cell<a name="line.8168"></a>
+<span class="sourceLineNo">8169</span>   */<a name="line.8169"></a>
+<span class="sourceLineNo">8170</span>  private static long getLongValue(final Cell cell) throws DoNotRetryIOException {<a name="line.8170"></a>
+<span class="sourceLineNo">8171</span>    int len = cell.getValueLength();<a name="line.8171"></a>
+<span class="sourceLineNo">8172</span>    if (len != Bytes.SIZEOF_LONG) {<a name="line.8172"></a>
+<span class="sourceLineNo">8173</span>      // throw DoNotRetryIOException instead of IllegalArgumentException<a name="line.8173"></a>
+<span class="sourceLineNo">8174</span>      throw new DoNotRetryIOException("Field is not a long, it's " + len + " bytes wide");<a name="line.8174"></a>
+<span class="sourceLineNo">8175</span>    }<a name="line.8175"></a>
+<span class="sourceLineNo">8176</span>    return PrivateCellUtil.getValueAsLong(cell);<a name="line.8176"></a>
+<span class="sourceLineNo">8177</span>  }<a name="line.8177"></a>
+<span class="sourceLineNo">8178</span><a name="line.8178"></a>
+<span class="sourceLineNo">8179</span>  /**<a name="line.8179"></a>
+<span class="sourceLineNo">8180</span>   * Do a specific Get on passed &lt;code&gt;columnFamily&lt;/code&gt; and column qualifiers.<a name="line.8180"></a>
+<span class="sourceLineNo">8181</span>   * @param mutation Mutation we are doing this Get for.<a name="line.8181"></a>
+<span class="sourceLineNo">8182</span>   * @param store Which column family on row (TODO: Go all Gets in one go)<a name="line.8182"></a>
+<span class="sourceLineNo">8183</span>   * @param coordinates Cells from &lt;code&gt;mutation&lt;/code&gt; used as coordinates applied to Get.<a name="line.8183"></a>
+<span class="sourceLineNo">8184</span>   * @return Return list of Cells found.<a name="line.8184"></a>
+<span class="sourceLineNo">8185</span>   */<a name="line.8185"></a>
+<span class="sourceLineNo">8186</span>  private List&lt;Cell&gt; get(Mutation mutation, HStore store, List&lt;Cell&gt; coordinates,<a name="line.8186"></a>
+<span class="sourceLineNo">8187</span>      IsolationLevel isolation, TimeRange tr) throws IOException {<a name="line.8187"></a>
+<span class="sourceLineNo">8188</span>    // Sort the cells so that they match the order that they appear in the Get results. Otherwise,<a name="line.8188"></a>
+<span class="sourceLineNo">8189</span>    // we won't be able to find the existing values if the cells are not specified in order by the<a name="line.8189"></a>
+<span class="sourceLineNo">8190</span>    // client since cells are in an array list.<a name="line.8190"></a>
+<span class="sourceLineNo">8191</span>    // TODO: I don't get why we are sorting. St.Ack 20150107<a name="line.8191"></a>
+<span class="sourceLineNo">8192</span>    sort(coordinates, store.getComparator());<a name="line.8192"></a>
+<span class="sourceLineNo">8193</span>    Get get = new Get(mutation.getRow());<a name="line.8193"></a>
+<span class="sourceLineNo">8194</span>    if (isolation != null) {<a name="line.8194"></a>
+<span class="sourceLineNo">8195</span>      get.setIsolationLevel(isolation);<a name="line.8195"></a>
+<span class="sourceLineNo">8196</span>    }<a name="line.8196"></a>
+<span class="sourceLineNo">8197</span>    for (Cell cell: coordinates) {<a name="line.8197"></a>
+<span class="sourceLineNo">8198</span>      get.addColumn(store.getColumnFamilyDescriptor().getName(), CellUtil.cloneQualifier(cell));<a name="line.8198"></a>
+<span class="sourceLineNo">8199</span>    }<a name="line.8199"></a>
+<span class="sourceLineNo">8200</span>    // Increments carry time range. If an Increment instance, put it on the Get.<a name="line.8200"></a>
+<span class="sourceLineNo">8201</span>    if (tr != null) {<a name="line.8201"></a>
+<span class="sourceLineNo">8202</span>      get.setTimeRange(tr.getMin(), tr.getMax());<a name="line.8202"></a>
+<span class="sourceLineNo">8203</span>    }<a name="line.8203"></a>
+<span class="sourceLineNo">8204</span>    return get(get, false);<a name="line.8204"></a>
+<span class="sourceLineNo">8205</span>  }<a name="line.8205"></a>
+<span class="sourceLineNo">8206</span><a name="line.8206"></a>
+<span class="sourceLineNo">8207</span>  /**<a name="line.8207"></a>
+<span class="sourceLineNo">8208</span>   * @return Sorted list of &lt;code&gt;cells&lt;/code&gt; using &lt;code&gt;comparator&lt;/code&gt;<a name="line.8208"></a>
+<span class="sourceLineNo">8209</span>   */<a name="line.8209"></a>
+<span class="sourceLineNo">8210</span>  private static List&lt;Cell&gt; sort(List&lt;Cell&gt; cells, final CellComparator comparator) {<a name="line.8210"></a>
+<span class="sourceLineNo">8211</span>    cells.sort(comparator);<a name="line.8211"></a>
+<span class="sourceLineNo">8212</span>    return cells;<a name="line.8212"></a>
+<span class="sourceLineNo">8213</span>  }<a name="line.8213"></a>
+<span class="sourceLineNo">8214</span><a name="line.8214"></a>
+<span class="sourceLineNo">8215</span>  public static final long FIXED_OVERHEAD = ClassSize.align(<a name="line.8215"></a>
+<span class="sourceLineNo">8216</span>      ClassSize.OBJECT +<a name="line.8216"></a>
+<span class="sourceLineNo">8217</span>      ClassSize.ARRAY +<a name="line.8217"></a>
+<span class="sourceLineNo">8218</span>      55 * ClassSize.REFERENCE + 3 * Bytes.SIZEOF_INT +<a name="line.8218"></a>
+<span class="sourceLineNo">8219</span>      (15 * Bytes.SIZEOF_LONG) +<a name="line.8219"></a>
+<span class="sourceLineNo">8220</span>      3 * Bytes.SIZEOF_BOOLEAN);<a name="line.8220"></a>
+<span class="sourceLineNo">8221</span><a name="line.8221"></a>
+<span class="sourceLineNo">8222</span>  // woefully out of date - currently missing:<a name="line.8222"></a>
+<span class="sourceLineNo">8223</span>  // 1 x HashMap - coprocessorServiceHandlers<a name="line.8223"></a>
+<span class="sourceLineNo">8224</span>  // 6 x LongAdder - numMutationsWithoutWAL, dataInMemoryWithoutWAL,<a name="line.8224"></a>
+<span class="sourceLineNo">8225</span>  //   checkAndMutateChecksPassed, checkAndMutateChecksFailed, readRequestsCount,<a name="line.8225"></a>
+<span class="sourceLineNo">8226</span>  //   writeRequestsCount, cpRequestsCount<a name="line.8226"></a>
+<span class="sourceLineNo">8227</span>  // 1 x HRegion$WriteState - writestate<a name="line.8227"></a>
+<span class="sourceLineNo">8228</span>  // 1 x RegionCoprocessorHost - coprocessorHost<a name="line.8228"></a>
+<span class="sourceLineNo">8229</span>  // 1 x RegionSplitPolicy - splitPolicy<a name="line.8229"></a>
+<span class="sourceLineNo">8230</span>  // 1 x MetricsRegion - metricsRegion<a name="line.8230"></a>
+<span class="sourceLineNo">8231</span>  // 1 x MetricsRegionWrapperImpl - metricsRegionWrapper<a name="line.8231"></a>
+<span class="sourceLineNo">8232</span>  public static final long DEEP_OVERHEAD = FIXED_OVERHEAD +<a name="line.8232"></a>
+<span class="sourceLineNo">8233</span>      ClassSize.OBJECT + // closeLock<a name="line.8233"></a>
+<span class="sourceLineNo">8234</span>      (2 * ClassSize.ATOMIC_BOOLEAN) + // closed, closing<a name="line.8234"></a>
+<span class="sourceLineNo">8235</span>      (3 * ClassSize.ATOMIC_LONG) + // numPutsWithoutWAL, dataInMemoryWithoutWAL,<a name="line.8235"></a>
+<span class="sourceLineNo">8236</span>                                    // compactionsFailed<a name="line.8236"></a>
+<span class="sourceLineNo">8237</span>      (2 * ClassSize.CONCURRENT_HASHMAP) +  // lockedRows, scannerReadPoints<a name="line.8237"></a>
+<span class="sourceLineNo">8238</span>      WriteState.HEAP_SIZE + // writestate<a name="line.8238"></a>
+<span class="sourceLineNo">8239</span>      ClassSize.CONCURRENT_SKIPLISTMAP + ClassSize.CONCURRENT_SKIPLISTMAP_ENTRY + // stores<a name="line.8239"></a>
+<span class="sourceLineNo">8240</span>      (2 * ClassSize.REENTRANT_LOCK) + // lock, updatesLock<a name="line.8240"></a>
+<span class="sourceLineNo">8241</span>      MultiVersionConcurrencyControl.FIXED_SIZE // mvcc<a name="line.8241"></a>
+<span class="sourceLineNo">8242</span>      + 2 * ClassSize.TREEMAP // maxSeqIdInStores, replicationScopes<a name="line.8242"></a>
+<span class="sourceLineNo">8243</span>      + 2 * ClassSize.ATOMIC_INTEGER // majorInProgress, minorInProgress<a name="line.8243"></a>
+<span class="sourceLineNo">8244</span>      + ClassSize.STORE_SERVICES // store services<a name="line.8244"></a>
+<span class="sourceLineNo">8245</span>      + StoreHotnessProtector.FIXED_SIZE<a name="line.8245"></a>
+<span class="sourceLineNo">8246</span>      ;<a name="line.8246"></a>
+<span class="sourceLineNo">8247</span><a name="line.8247"></a>
+<span class="sourceLineNo">8248</span>  @Override<a name="line.8248"></a>
+<span class="sourceLineNo">8249</span>  public long heapSize() {<a name="line.8249"></a>
+<span class="sourceLineNo">8250</span>    // this does not take into account row locks, recent flushes, mvcc entries, and more<a name="line.8250"></a>
+<span class="sourceLineNo">8251</span>    return DEEP_OVERHEAD + stores.values().stream().mapToLong(HStore::heapSize).sum();<a name="line.8251"></a>
+<span class="sourceLineNo">8252</span>  }<a name="line.8252"></a>
+<span class="sourceLineNo">8253</span><a name="line.8253"></a>
+<span class="sourceLineNo">8254</span>  /**<a name="line.8254"></a>
+<span class="sourceLineNo">8255</span>   * Registers a new protocol buffer {@link Service} subclass as a coprocessor endpoint to<a name="line.8255"></a>
+<span class="sourceLineNo">8256</span>   * be available for handling Region#execService(com.google.protobuf.RpcController,<a name="line.8256"></a>
+<span class="sourceLineNo">8257</span>   *    org.apache.hadoop.hbase.protobuf.generated.ClientProtos.CoprocessorServiceCall) calls.<a name="line.8257"></a>
+<span class="sourceLineNo">8258</span>   *<a name="line.8258"></a>
+<span class="sourceLineNo">8259</span>   * &lt;p&gt;<a name="line.8259"></a>
+<span class="sourceLineNo">8260</span>   * Only a single instance may be registered per region for a given {@link Service} subclass (the<a name="line.8260"></a>
+<span class="sourceLineNo">8261</span>   * instances are keyed on {@link com.google.protobuf.Descriptors.ServiceDescriptor#getFullName()}.<a name="line.8261"></a>
+<span class="sourceLineNo">8262</span>   * After the first registration, subsequent calls with the same service name will fail with<a name="line.8262"></a>
+<span class="sourceLineNo">8263</span>   * a return value of {@code false}.<a name="line.8263"></a>
+<span class="sourceLineNo">8264</span>   * &lt;/p&gt;<a name="line.8264"></a>
+<span class="sourceLineNo">8265</span>   * @param instance the {@code Service} subclass instance to expose as a coprocessor endpoint<a name="line.8265"></a>
+<span class="sourceLineNo">8266</span>   * @return {@code true} if the registration was successful, {@code false}<a name="line.8266"></a>
+<span class="sourceLineNo">8267</span>   * otherwise<a name="line.8267"></a>
+<span class="sourceLineNo">8268</span>   */<a name="line.8268"></a>
+<span class="sourceLineNo">8269</span>  public boolean registerService(com.google.protobuf.Service instance) {<a name="line.8269"></a>
+<span class="sourceLineNo">8270</span>    /*<a name="line.8270"></a>
+<span class="sourceLineNo">8271</span>     * No stacking of instances is allowed for a single service name<a name="line.8271"></a>
+<span class="sourceLineNo">8272</span>     */<a name="line.8272"></a>
+<span class="sourceLineNo">8273</span>    com.google.protobuf.Descriptors.ServiceDescriptor serviceDesc = instance.getDescriptorForType();<a name="line.8273"></a>
+<span class="sourceLineNo">8274</span>    String serviceName = CoprocessorRpcUtils.getServiceName(serviceDesc);<a name="line.8274"></a>
+<span class="sourceLineNo">8275</span>    if (coprocessorServiceHandlers.containsKey(serviceName)) {<a name="line.8275"></a>
+<span class="sourceLineNo">8276</span>      LOG.error("Coprocessor service " + serviceName +<a name="line.8276"></a>
+<span class="sourceLineNo">8277</span>          " already registered, rejecting request from " + instance);<a name="line.8277"></a>
+<span class="sourceLineNo">8278</span>      return false;<a name="line.8278"></a>
+<span class="sourceLineNo">8279</span>    }<a name="line.8279"></a>
+<span class="sourceLineNo">8280</span><a name="line.8280"></a>
+<span class="sourceLineNo">8281</span>    coprocessorServiceHandlers.put(serviceName, instance);<a name="line.8281"></a>
+<span class="sourceLineNo">8282</span>    if (LOG.isDebugEnabled()) {<a name="line.8282"></a>
+<span class="sourceLineNo">8283</span>      LOG.debug("Registered coprocessor service: region=" +<a name="line.8283"></a>
+<span class="sourceLineNo">8284</span>          Bytes.toStringBinary(getRegionInfo().getRegionName()) +<a name="line.8284"></a>
+<span class="sourceLineNo">8285</span>          " service=" + serviceName);<a name="line.8285"></a>
+<span class="sourceLineNo">8286</span>    }<a name="line.8286"></a>
+<span class="sourceLineNo">8287</span>    return true;<a name="line.8287"></a>
+<span class="sourceLineNo">8288</span>  }<a name="line.8288"></a>
+<span class="sourceLineNo">8289</span><a name="line.8289"></a>
+<span class="sourceLineNo">8290</span>  /**<a name="line.8290"></a>
+<span class="sourceLineNo">8291</span>   * Executes a single protocol buffer coprocessor endpoint {@link Service} method using<a name="line.8291"></a>
+<span class="sourceLineNo">8292</span>   * the registered protocol handlers.  {@link Service} implementations must be registered via the<a name="line.8292"></a>
+<span class="sourceLineNo">8293</span>   * {@link #registerService(com.google.protobuf.Service)}<a name="line.8293"></a>
+<span class="sourceLineNo">8294</span>   * method before they are available.<a name="line.8294"></a>
+<span class="sourceLineNo">8295</span>   *<a name="line.8295"></a>
+<span class="sourceLineNo">8296</span>   * @param controller an {@code RpcContoller} implementation to pass to the invoked service<a name="line.8296"></a>
+<span class="sourceLineNo">8297</span>   * @param call a {@code CoprocessorServiceCall} instance identifying the service, method,<a name="line.8297"></a>
+<span class="sourceLineNo">8298</span>   *     and parameters for the method invocation<a name="line.8298"></a>
+<span class="sourceLineNo">8299</span>   * @return a protocol buffer {@code Message} instance containing the method's result<a name="line.8299"></a>
+<span class="sourceLineNo">8300</span>   * @throws IOException if no registered service handler is found or an error<a name="line.8300"></a>
+<span class="sourceLineNo">8301</span>   *     occurs during the invocation<a name="line.8301"></a>
+<span class="sourceLineNo">8302</span>   * @see #registerService(com.google.protobuf.Service)<a name="line.8302"></a>
+<span class="sourceLineNo">8303</span>   */<a name="line.8303"></a>
+<span class="sourceLineNo">8304</span>  public com.google.protobuf.Message execService(com.google.protobuf.RpcController controller,<a name="line.8304"></a>
+<span class="sourceLineNo">8305</span>      CoprocessorServiceCall call) throws IOException {<a name="line.8305"></a>
+<span class="sourceLineNo">8306</span>    String serviceName = call.getServiceName();<a name="line.8306"></a>
+<span class="sourceLineNo">8307</span>    com.google.protobuf.Service service = coprocessorServiceHandlers.get(serviceName);<a name="line.8307"></a>
+<span class="sourceLineNo">8308</span>    if (service == null) {<a name="line.8308"></a>
+<span class="sourceLineNo">8309</span>      throw new UnknownProtocolException(null, "No registered coprocessor service found for " +<a name="line.8309"></a>
+<span class="sourceLineNo">8310</span>          serviceName + " in region " + Bytes.toStringBinary(getRegionInfo().getRegionName()));<a name="line.8310"></a>
+<span class="sourceLineNo">8311</span>    }<a name="line.8311"></a>
+<span class="sourceLineNo">8312</span>    com.google.protobuf.Descriptors.ServiceDescriptor serviceDesc = service.getDescriptorForType();<a name="line.8312"></a>
 <span class="sourceLineNo">8313</span><a name="line.8313"></a>
-<span class="sourceLineNo">8314</span>    com.google.protobuf.Message.Builder builder =<a name="line.8314"></a>
-<span class="sourceLineNo">8315</span>        service.getRequestPrototype(methodDesc).newBuilderForType();<a name="line.8315"></a>
-<span class="sourceLineNo">8316</span><a name="line.8316"></a>
-<span class="sourceLineNo">8317</span>    org.apache.hadoop.hbase.protobuf.ProtobufUtil.mergeFrom(builder,<a name="line.8317"></a>
-<span class="sourceLineNo">8318</span>        call.getRequest().toByteArray());<a name="line.8318"></a>
-<span class="sourceLineNo">8319</span>    com.google.protobuf.Message request =<a name="line.8319"></a>
-<span class="sourceLineNo">8320</span>        CoprocessorRpcUtils.getRequest(service, methodDesc, call.getRequest());<a name="line.8320"></a>
+<span class="sourceLineNo">8314</span>    cpRequestsCount.increment();<a name="line.8314"></a>
+<span class="sourceLineNo">8315</span>    String methodName = call.getMethodName();<a name="line.8315"></a>
+<span class="sourceLineNo">8316</span>    com.google.protobuf.Descriptors.MethodDescriptor methodDesc =<a name="line.8316"></a>
+<span class="sourceLineNo">8317</span>        CoprocessorRpcUtils.getMethodDescriptor(methodName, serviceDesc);<a name="line.8317"></a>
+<span class="sourceLineNo">8318</span><a name="line.8318"></a>
+<span class="sourceLineNo">8319</span>    com.google.protobuf.Message.Builder builder =<a name="line.8319"></a>
+<span class="sourceLineNo">8320</span>        service.getRequestPrototype(methodDesc).newBuilderForType();<a name="line.8320"></a>
 <span class="sourceLineNo">8321</span><a name="line.8321"></a>
-<span class="sourceLineNo">8322</span>    if (coprocessorHost != null) {<a name="line.8322"></a>
-<span class="sourceLineNo">8323</span>      request = coprocessorHost.preEndpointInvocation(service, methodName, request);<a name="line.8323"></a>
-<span class="sourceLineNo">8324</span>    }<a name="line.8324"></a>
-<span class="sourceLineNo">8325</span><a name="line.8325"></a>
-<span class="sourceLineNo">8326</span>    final com.google.protobuf.Message.Builder responseBuilder =<a name="line.8326"></a>
-<span class="sourceLineNo">8327</span>        service.getResponsePrototype(methodDesc).newBuilderForType();<a name="line.8327"></a>
-<span class="sourceLineNo">8328</span>    service.callMethod(methodDesc, controller, request,<a name="line.8328"></a>
-<span class="sourceLineNo">8329</span>        new com.google.protobuf.RpcCallback&lt;com.google.protobuf.Message&gt;() {<a name="line.8329"></a>
-<span class="sourceLineNo">8330</span>      @Override<a name="line.8330"></a>
-<span class="sourceLineNo">8331</span>      public void run(com.google.protobuf.Message message) {<a name="line.8331"></a>
-<span class="sourceLineNo">8332</span>        if (message != null) {<a name="line.8332"></a>
-<span class="sourceLineNo">8333</span>          responseBuilder.mergeFrom(message);<a name="line.8333"></a>
-<span class="sourceLineNo">8334</span>        }<a name="line.8334"></a>
-<span class="sourceLineNo">8335</span>      }<a name="line.8335"></a>
-<span class="sourceLineNo">8336</span>    });<a name="line.8336"></a>
-<span class="sourceLineNo">8337</span><a name="line.8337"></a>
-<span class="sourceLineNo">8338</span>    if (coprocessorHost != null) {<a name="line.8338"></a>
-<span class="sourceLineNo">8339</span>      coprocessorHost.postEndpointInvocation(service, methodName, request, responseBuilder);<a name="line.8339"></a>
-<span class="sourceLineNo">8340</span>    }<a name="line.8340"></a>
-<span class="sourceLineNo">8341</span>    IOException exception =<a name="line.8341"></a>
-<span class="sourceLineNo">8342</span>        org.apache.hadoop.hbase.ipc.CoprocessorRpcUtils.getControllerException(controller);<a name="line.8342"></a>
-<span class="sourceLineNo">8343</span>    if (exception != null) {<a name="line.8343"></a>
-<span class="sourceLineNo">8344</span>      throw exception;<a name="line.8344"></a>
+<span class="sourceLineNo">8322</span>    org.apache.hadoop.hbase.protobuf.ProtobufUtil.mergeFrom(builder,<a name="line.8322"></a>
+<span class="sourceLineNo">8323</span>        call.getRequest().toByteArray());<a name="line.8323"></a>
+<span class="sourceLineNo">8324</span>    com.google.protobuf.Message request =<a name="line.8324"></a>
+<span class="sourceLineNo">8325</span>        CoprocessorRpcUtils.getRequest(service, methodDesc, call.getRequest());<a name="line.8325"></a>
+<span class="sourceLineNo">8326</span><a name="line.8326"></a>
+<span class="sourceLineNo">8327</span>    if (coprocessorHost != null) {<a name="line.8327"></a>
+<span class="sourceLineNo">8328</span>      request = coprocessorHost.preEndpointInvocation(service, methodName, request);<a name="line.8328"></a>
+<span class="sourceLineNo">8329</span>    }<a name="line.8329"></a>
+<span class="sourceLineNo">8330</span><a name="line.8330"></a>
+<span class="sourceLineNo">8331</span>    final com.google.protobuf.Message.Builder responseBuilder =<a name="line.8331"></a>
+<span class="sourceLineNo">8332</span>        service.getResponsePrototype(methodDesc).newBuilderForType();<a name="line.8332"></a>
+<span class="sourceLineNo">8333</span>    service.callMethod(methodDesc, controller, request,<a name="line.8333"></a>
+<span class="sourceLineNo">8334</span>        new com.google.protobuf.RpcCallback&lt;com.google.protobuf.Message&gt;() {<a name="line.8334"></a>
+<span class="sourceLineNo">8335</span>      @Override<a name="line.8335"></a>
+<span class="sourceLineNo">8336</span>      public void run(com.google.protobuf.Message message) {<a name="line.8336"></a>
+<span class="sourceLineNo">8337</span>        if (message != null) {<a name="line.8337"></a>
+<span class="sourceLineNo">8338</span>          responseBuilder.mergeFrom(message);<a name="line.8338"></a>
+<span class="sourceLineNo">8339</span>        }<a name="line.8339"></a>
+<span class="sourceLineNo">8340</span>      }<a name="line.8340"></a>
+<span class="sourceLineNo">8341</span>    });<a name="line.8341"></a>
+<span class="sourceLineNo">8342</span><a name="line.8342"></a>
+<span class="sourceLineNo">8343</span>    if (coprocessorHost != null) {<a name="line.8343"></a>
+<span class="sourceLineNo">8344</span>      coprocessorHost.postEndpointInvocation(service, methodName, request, responseBuilder);<a name="line.8344"></a>
 <span class="sourceLineNo">8345</span>    }<a name="line.8345"></a>
-<span class="sourceLineNo">8346</span><a name="line.8346"></a>
-<span class="sourceLineNo">8347</span>    return responseBuilder.build();<a name="line.8347"></a>
-<span class="sourceLineNo">8348</span>  }<a name="line.8348"></a>
-<span class="sourceLineNo">8349</span><a name="line.8349"></a>
-<span class="sourceLineNo">8350</span>  boolean shouldForceSplit() {<a name="line.8350"></a>
-<span class="sourceLineNo">8351</span>    return this.splitRequest;<a name="line.8351"></a>
-<span class="sourceLineNo">8352</span>  }<a name="line.8352"></a>
-<span class="sourceLineNo">8353</span><a name="line.8353"></a>
-<span class="sourceLineNo">8354</span>  byte[] getExplicitSplitPoint() {<a name="line.8354"></a>
-<span class="sourceLineNo">8355</span>    return this.explicitSplitPoint;<a name="line.8355"></a>
-<span class="sourceLineNo">8356</span>  }<a name="line.8356"></a>
-<span class="sourceLineNo">8357</span><a name="line.8357"></a>
-<span class="sourceLineNo">8358</span>  void forceSplit(byte[] sp) {<a name="line.8358"></a>
-<span class="sourceLineNo">8359</span>    // This HRegion will go away after the forced split is successful<a name="line.8359"></a>
-<span class="sourceLineNo">8360</span>    // But if a forced split fails, we need to clear forced split.<a name="line.8360"></a>
-<span class="sourceLineNo">8361</span>    this.splitRequest = true;<a name="line.8361"></a>
-<span class="sourceLineNo">8362</span>    if (sp != null) {<a name="line.8362"></a>
-<span class="sourceLineNo">8363</span>      this.explicitSplitPoint = sp;<a name="line.8363"></a>
-<span class="sourceLineNo">8364</span>    }<a name="line.8364"></a>
-<span class="sourceLineNo">8365</span>  }<a name="line.8365"></a>
-<span class="sourceLineNo">8366</span><a name="line.8366"></a>
-<span class="sourceLineNo">8367</span>  void clearSplit() {<a name="line.8367"></a>
-<span class="sourceLineNo">8368</span>    this.splitRequest = false;<a name="line.8368"></a>
-<span class="sourceLineNo">8369</span>    this.explicitSplitPoint = null;<a name="line.8369"></a>
+<span class="sourceLineNo">8346</span>    IOException exception =<a name="line.8346"></a>
+<span class="sourceLineNo">8347</span>        org.apache.hadoop.hbase.ipc.CoprocessorRpcUtils.getControllerException(controller);<a name="line.8347"></a>
+<span class="sourceLineNo">8348</span>    if (exception != null) {<a name="line.8348"></a>
+<span class="sourceLineNo">8349</span>      throw exception;<a name="line.8349"></a>
+<span class="sourceLineNo">8350</span>    }<a name="line.8350"></a>
+<span class="sourceLineNo">8351</span><a name="line.8351"></a>
+<span class="sourceLineNo">8352</span>    return responseBuilder.build();<a name="line.8352"></a>
+<span class="sourceLineNo">8353</span>  }<a name="line.8353"></a>
+<span class="sourceLineNo">8354</span><a name="line.8354"></a>
+<span class="sourceLineNo">8355</span>  boolean shouldForceSplit() {<a name="line.8355"></a>
+<span class="sourceLineNo">8356</span>    return this.splitRequest;<a name="line.8356"></a>
+<span class="sourceLineNo">8357</span>  }<a name="line.8357"></a>
+<span class="sourceLineNo">8358</span><a name="line.8358"></a>
+<span class="sourceLineNo">8359</span>  byte[] getExplicitSplitPoint() {<a name="line.8359"></a>
+<span class="sourceLineNo">8360</span>    return this.explicitSplitPoint;<a name="line.8360"></a>
+<span class="sourceLineNo">8361</span>  }<a name="line.8361"></a>
+<span class="sourceLineNo">8362</span><a name="line.8362"></a>
+<span class="sourceLineNo">8363</span>  void forceSplit(byte[] sp) {<a name="line.8363"></a>
+<span class="sourceLineNo">8364</span>    // This HRegion will go away after the forced split is successful<a name="line.8364"></a>
+<span class="sourceLineNo">8365</span>    // But if a forced split fails, we need to clear forced split.<a name="line.8365"></a>
+<span class="sourceLineNo">8366</span>    this.splitRequest = true;<a name="line.8366"></a>
+<span class="sourceLineNo">8367</span>    if (sp != null) {<a name="line.8367"></a>
+<span class="sourceLineNo">8368</span>      this.explicitSplitPoint = sp;<a name="line.8368"></a>
+<span class="sourceLineNo">8369</span>    }<a name="line.8369"></a>
 <span class="sourceLineNo">8370</span>  }<a name="line.8370"></a>
 <span class="sourceLineNo">8371</span><a name="line.8371"></a>
-<span class="sourceLineNo">8372</span>  /**<a name="line.8372"></a>
-<span class="sourceLineNo">8373</span>   * Return the splitpoint. null indicates the region isn't splittable<a name="line.8373"></a>
-<span class="sourceLineNo">8374</span>   * If the splitpoint isn't explicitly specified, it will go over the stores<a name="line.8374"></a>
-<span class="sourceLineNo">8375</span>   * to find the best splitpoint. Currently the criteria of best splitpoint<a name="line.8375"></a>
-<span class="sourceLineNo">8376</span>   * is based on the size of the store.<a name="line.8376"></a>
-<span class="sourceLineNo">8377</span>   */<a name="line.8377"></a>
-<span class="sourceLineNo">8378</span>  public byte[] checkSplit() {<a name="line.8378"></a>
-<span class="sourceLineNo">8379</span>    // Can't split META<a name="line.8379"></a>
-<span class="sourceLineNo">8380</span>    if (this.getRegionInfo().isMetaRegion()) {<a name="line.8380"></a>
-<span class="sourceLineNo">8381</span>      if (shouldForceSplit()) {<a name="line.8381"></a>
-<span class="sourceLineNo">8382</span>        LOG.warn("Cannot split meta region in HBase 0.20 and above");<a name="line.8382"></a>
-<span class="sourceLineNo">8383</span>      }<a name="line.8383"></a>
-<span class="sourceLineNo">8384</span>      return null;<a name="line.8384"></a>
-<span class="sourceLineNo">8385</span>    }<a name="line.8385"></a>
-<span class="sourceLineNo">8386</span><a name="line.8386"></a>
-<span class="sourceLineNo">8387</span>    // Can't split a region that is closing.<a name="line.8387"></a>
-<span class="sourceLineNo">8388</span>    if (this.isClosing()) {<a name="line.8388"></a>
+<span class="sourceLineNo">8372</span>  void clearSplit() {<a name="line.8372"></a>
+<span class="sourceLineNo">8373</span>    this.splitRequest = false;<a name="line.8373"></a>
+<span class="sourceLineNo">8374</span>    this.explicitSplitPoint = null;<a name="line.8374"></a>
+<span class="sourceLineNo">8375</span>  }<a name="line.8375"></a>
+<span class="sourceLineNo">8376</span><a name="line.8376"></a>
+<span class="sourceLineNo">8377</span>  /**<a name="line.8377"></a>
+<span class="sourceLineNo">8378</span>   * Return the splitpoint. null indicates the region isn't splittable<a name="line.8378"></a>
+<span class="sourceLineNo">8379</span>   * If the splitpoint isn't explicitly specified, it will go over the stores<a name="line.8379"></a>
+<span class="sourceLineNo">8380</span>   * to find the best splitpoint. Currently the criteria of best splitpoint<a name="line.8380"></a>
+<span class="sourceLineNo">8381</span>   * is based on the size of the store.<a name="line.8381"></a>
+<span class="sourceLineNo">8382</span>   */<a name="line.8382"></a>
+<span class="sourceLineNo">8383</span>  public byte[] checkSplit() {<a name="line.8383"></a>
+<span class="sourceLineNo">8384</span>    // Can't split META<a name="line.8384"></a>
+<span class="sourceLineNo">8385</span>    if (this.getRegionInfo().isMetaRegion()) {<a name="line.8385"></a>
+<span class="sourceLineNo">8386</span>      if (shouldForceSplit()) {<a name="line.8386"></a>
+<span class="sourceLineNo">8387</span>        LOG.warn("Cannot split meta region in HBase 0.20 and above");<a name="line.8387"></a>
+<span class="sourceLineNo">8388</span>      }<a name="line.8388"></a>
 <span class="sourceLineNo">8389</span>      return null;<a name="line.8389"></a>
 <span class="sourceLineNo">8390</span>    }<a name="line.8390"></a>
 <span class="sourceLineNo">8391</span><a name="line.8391"></a>
-<span class="sourceLineNo">8392</span>    if (!splitPolicy.shouldSplit()) {<a name="line.8392"></a>
-<span class="sourceLineNo">8393</span>      return null;<a name="line.8393"></a>
-<span class="sourceLineNo">8394</span>    }<a name="line.8394"></a>
-<span class="sourceLineNo">8395</span><a name="line.8395"></a>
-<span class="sourceLineNo">8396</span>    byte[] ret = splitPolicy.getSplitPoint();<a name="line.8396"></a>
-<span class="sourceLineNo">8397</span><a name="line.8397"></a>
-<span class="sourceLineNo">8398</span>    if (ret != null) {<a name="line.8398"></a>
-<span class="sourceLineNo">8399</span>      try {<a name="line.8399"></a>
-<span class="sourceLineNo">8400</span>        checkRow(ret, "calculated split");<a name="line.8400"></a>
-<span class="sourceLineNo">8401</span>      } catch (IOException e) {<a name="line.8401"></a>
-<span class="sourceLineNo">8402</span>        LOG.error("Ignoring invalid split", e);<a name="line.8402"></a>
-<span class="sourceLineNo">8403</span>        return null;<a name="line.8403"></a>
-<span class="sourceLineNo">8404</span>      }<a name="line.8404"></a>
-<span class="sourceLineNo">8405</span>    }<a name="line.8405"></a>
-<span class="sourceLineNo">8406</span>    return ret;<a name="line.8406"></a>
-<span class="sourceLineNo">8407</span>  }<a name="line.8407"></a>
-<span class="sourceLineNo">8408</span><a name="line.8408"></a>
-<span class="sourceLineNo">8409</span>  /**<a name="line.8409"></a>
-<span class="sourceLineNo">8410</span>   * @return The priority that this region should have in the compaction queue<a name="line.8410"></a>
-<span class="sourceLineNo">8411</span>   */<a name="line.8411"></a>
-<span class="sourceLineNo">8412</span>  public int getCompactPriority() {<a name="line.8412"></a>
-<span class="sourceLineNo">8413</span>    return stores.values().stream().mapToInt(HStore::getCompactPriority).min()<a name="line.8413"></a>
-<span class="sourceLineNo">8414</span>        .orElse(Store.NO_PRIORITY);<a name="line.8414"></a>
-<span class="sourceLineNo">8415</span>  }<a name="line.8415"></a>
-<span class="sourceLineNo">8416</span><a name="line.8416"></a>
-<span class="sourceLineNo">8417</span>  /** @return the coprocessor host */<a name="line.8417"></a>
-<span class="sourceLineNo">8418</span>  public RegionCoprocessorHost getCoprocessorHost() {<a name="line.8418"></a>
-<span class="sourceLineNo">8419</span>    return coprocessorHost;<a name="line.8419"></a>
+<span class="sourceLineNo">8392</span>    // Can't split a region that is closing.<a name="line.8392"></a>
+<span class="sourceLineNo">8393</span>    if (this.isClosing()) {<a name="line.8393"></a>
+<span class="sourceLineNo">8394</span>      return null;<a name="line.8394"></a>
+<span class="sourceLineNo">8395</span>    }<a name="line.8395"></a>
+<span class="sourceLineNo">8396</span><a name="line.8396"></a>
+<span class="sourceLineNo">8397</span>    if (!splitPolicy.shouldSplit()) {<a name="line.8397"></a>
+<span class="sourceLineNo">8398</span>      return null;<a name="line.8398"></a>
+<span class="sourceLineNo">8399</span>    }<a name="line.8399"></a>
+<span class="sourceLineNo">8400</span><a name="line.8400"></a>
+<span class="sourceLineNo">8401</span>    byte[] ret = splitPolicy.getSplitPoint();<a name="line.8401"></a>
+<span class="sourceLineNo">8402</span><a name="line.8402"></a>
+<span class="sourceLineNo">8403</span>    if (ret != null) {<a name="line.8403"></a>
+<span class="sourceLineNo">8404</span>      try {<a name="line.8404"></a>
+<span class="sourceLineNo">8405</span>        checkRow(ret, "calculated split");<a name="line.8405"></a>
+<span class="sourceLineNo">8406</span>      } catch (IOException e) {<a name="line.8406"></a>
+<span class="sourceLineNo">8407</span>        LOG.error("Ignoring invalid split", e);<a name="line.8407"></a>
+<span class="sourceLineNo">8408</span>        return null;<a name="line.8408"></a>
+<span class="sourceLineNo">8409</span>      }<a name="line.8409"></a>
+<span class="sourceLineNo">8410</span>    }<a name="line.8410"></a>
+<span class="sourceLineNo">8411</span>    return ret;<a name="line.8411"></a>
+<span class="sourceLineNo">8412</span>  }<a name="line.8412"></a>
+<span class="sourceLineNo">8413</span><a name="line.8413"></a>
+<span class="sourceLineNo">8414</span>  /**<a name="line.8414"></a>
+<span class="sourceLineNo">8415</span>   * @return The priority that this region should have in the compaction queue<a name="line.8415"></a>
+<span class="sourceLineNo">8416</span>   */<a name="line.8416"></a>
+<span class="sourceLineNo">8417</span>  public int getCompactPriority() {<a name="line.8417"></a>
+<span class="sourceLineNo">8418</span>    return stores.values().stream().mapToInt(HStore::getCompactPriority).min()<a name="line.8418"></a>
+<span class="sourceLineNo">8419</span>        .orElse(Store.NO_PRIORITY);<a name="line.8419"></a>
 <span class="sourceLineNo">8420</span>  }<a name="line.8420"></a>
 <span class="sourceLineNo">8421</span><a name="line.8421"></a>
-<span class="sourceLineNo">8422</span>  /** @param coprocessorHost the new coprocessor host */<a name="line.8422"></a>
-<span class="sourceLineNo">8423</span>  @VisibleForTesting<a name="line.8423"></a>
-<span class="sourceLineNo">8424</span>  public void setCoprocessorHost(final RegionCoprocessorHost coprocessorHost) {<a name="line.8424"></a>
-<span class="sourceLineNo">8425</span>    this.coprocessorHost = coprocessorHost;<a name="line.8425"></a>
-<span class="sourceLineNo">8426</span>  }<a name="line.8426"></a>
-<span class="sourceLineNo">8427</span><a name="line.8427"></a>
-<span class="sourceLineNo">8428</span>  @Override<a name="line.8428"></a>
-<span class="sourceLineNo">8429</span>  public void startRegionOperation() throws IOException {<a name="line.8429"></a>
-<span class="sourceLineNo">8430</span>    startRegionOperation(Operation.ANY);<a name="line.8430"></a>
+<span class="sourceLineNo">8422</span>  /** @return the coprocessor host */<a name="line.8422"></a>
+<span class="sourceLineNo">8423</span>  public RegionCoprocessorHost getCoprocessorHost() {<a name="line.8423"></a>
+<span class="sourceLineNo">8424</span>    return coprocessorHost;<a name="line.8424"></a>
+<span class="sourceLineNo">8425</span>  }<a name="line.8425"></a>
+<span class="sourceLineNo">8426</span><a name="line.8426"></a>
+<span class="sourceLineNo">8427</span>  /** @param coprocessorHost the new coprocessor host */<a name="line.8427"></a>
+<span class="sourceLineNo">8428</span>  @VisibleForTesting<a name="line.8428"></a>
+<span class="sourceLineNo">8429</span>  public void setCoprocessorHost(final RegionCoprocessorHost coprocessorHost) {<a name="line.8429"></a>
+<span class="sourceLineNo">8430</span>    this.coprocessorHost = coprocessorHost;<a name="line.8430"></a>
 <span class="sourceLineNo">8431</span>  }<a name="line.8431"></a>
 <span class="sourceLineNo">8432</span><a name="line.8432"></a>
 <span class="sourceLineNo">8433</span>  @Override<a name="line.8433"></a>
-<span class="sourceLineNo">8434</span>  public void startRegionOperation(Operation op) throws IOException {<a name="line.8434"></a>
-<span class="sourceLineNo">8435</span>    switch (op) {<a name="line.8435"></a>
-<span class="sourceLineNo">8436</span>      case GET:  // read operations<a name="line.8436"></a>
-<span class="sourceLineNo">8437</span>      case SCAN:<a name="line.8437"></a>
-<span class="sourceLineNo">8438</span>        checkReadsEnabled();<a name="line.8438"></a>
-<span class="sourceLineNo">8439</span>        break;<a name="line.8439"></a>
-<span class="sourceLineNo">8440</span>      default:<a name="line.8440"></a>
-<span class="sourceLineNo">8441</span>        break;<a name="line.8441"></a>
-<span class="sourceLineNo">8442</span>    }<a name="line.8442"></a>
-<span class="sourceLineNo">8443</span>    if (op == Operation.MERGE_REGION || op == Operation.SPLIT_REGION<a name="line.8443"></a>
-<span class="sourceLineNo">8444</span>        || op == Operation.COMPACT_REGION || op == Operation.COMPACT_SWITCH) {<a name="line.8444"></a>
-<span class="sourceLineNo">8445</span>      // split, merge or compact region doesn't need to check the closing/closed state or lock the<a name="line.8445"></a>
-<span class="sourceLineNo">8446</span>      // region<a name="line.8446"></a>
-<span class="sourceLineNo">8447</span>      return;<a name="line.8447"></a>
-<span class="sourceLineNo">8448</span>    }<a name="line.8448"></a>
-<span class="sourceLineNo">8449</span>    if (this.closing.get()) {<a name="line.8449"></a>
-<span class="sourceLineNo">8450</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closing");<a name="line.8450"></a>
-<span class="sourceLineNo">8451</span>    }<a name="line.8451"></a>
-<span class="sourceLineNo">8452</span>    lock(lock.readLock());<a name="line.8452"></a>
-<span class="sourceLineNo">8453</span>    if (this.closed.get()) {<a name="line.8453"></a>
-<span class="sourceLineNo">8454</span>      lock.readLock().unlock();<a name="line.8454"></a>
-<span class="sourceLineNo">8455</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closed");<a name="line.8455"></a>
+<span class="sourceLineNo">8434</span>  public void startRegionOperation() throws IOException {<a name="line.8434"></a>
+<span class="sourceLineNo">8435</span>    startRegionOperation(Operation.ANY);<a name="line.8435"></a>
+<span class="sourceLineNo">8436</span>  }<a name="line.8436"></a>
+<span class="sourceLineNo">8437</span><a name="line.8437"></a>
+<span class="sourceLineNo">8438</span>  @Override<a name="line.8438"></a>
+<span class="sourceLineNo">8439</span>  public void startRegionOperation(Operation op) throws IOException {<a name="line.8439"></a>
+<span class="sourceLineNo">8440</span>    switch (op) {<a name="line.8440"></a>
+<span class="sourceLineNo">8441</span>      case GET:  // read operations<a name="line.8441"></a>
+<span class="sourceLineNo">8442</span>      case SCAN:<a name="line.8442"></a>
+<span class="sourceLineNo">8443</span>        checkReadsEnabled();<a name="line.8443"></a>
+<span class="sourceLineNo">8444</span>        break;<a name="line.8444"></a>
+<span class="sourceLineNo">8445</span>      default:<a name="line.8445"></a>
+<span class="sourceLineNo">8446</span>        break;<a name="line.8446"></a>
+<span class="sourceLineNo">8447</span>    }<a name="line.8447"></a>
+<span class="sourceLineNo">8448</span>    if (op == Operation.MERGE_REGION || op == Operation.SPLIT_REGION<a name="line.8448"></a>
+<span class="sourceLineNo">8449</span>        || op == Operation.COMPACT_REGION || op == Operation.COMPACT_SWITCH) {<a name="line.8449"></a>
+<span class="sourceLineNo">8450</span>      // split, merge or compact region doesn't need to check the closing/closed state or lock the<a name="line.8450"></a>
+<span class="sourceLineNo">8451</span>      // region<a name="line.8451"></a>
+<span class="sourceLineNo">8452</span>      return;<a name="line.8452"></a>
+<span class="sourceLineNo">8453</span>    }<a name="line.8453"></a>
+<span class="sourceLineNo">8454</span>    if (this.closing.get()) {<a name="line.8454"></a>
+<span class="sourceLineNo">8455</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closing");<a name="line.8455"></a>
 <span class="sourceLineNo">8456</span>    }<a name="line.8456"></a>
-<span class="sourceLineNo">8457</span>    // The unit for snapshot is a region. So, all stores for this region must be<a name="line.8457"></a>
-<span class="sourceLineNo">8458</span>    // prepared for snapshot operation before proceeding.<a name="line.8458"></a>
-<span class="sourceLineNo">8459</span>    if (op == Operation.SNAPSHOT) {<a name="line.8459"></a>
-<span class="sourceLineNo">8460</span>      stores.values().forEach(HStore::preSnapshotOperation);<a name="line.8460"></a>
+<span class="sourceLineNo">8457</span>    lock(lock.readLock());<a name="line.8457"></a>
+<span class="sourceLineNo">8458</span>    if (this.closed.get()) {<a name="line.8458"></a>
+<span class="sourceLineNo">8459</span>      lock.readLock().unlock();<a name="line.8459"></a>
+<span class="sourceLineNo">8460</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closed");<a name="line.8460"></a>
 <span class="sourceLineNo">8461</span>    }<a name="line.8461"></a>
-<span class="sourceLineNo">8462</span>    try {<a name="line.8462"></a>
-<span class="sourceLineNo">8463</span>      if (coprocessorHost != null) {<a name="line.8463"></a>
-<span class="sourceLineNo">8464</span>        coprocessorHost.postStartRegionOperation(op);<a name="line.8464"></a>
-<span class="sourceLineNo">8465</span>      }<a name="line.8465"></a>
-<span class="sourceLineNo">8466</span>    } catch (Exception e) {<a name="line.8466"></a>
-<span class="sourceLineNo">8467</span>      lock.readLock().unlock();<a name="line.8467"></a>
-<span class="sourceLineNo">8468</span>      throw new IOException(e);<a name="line.8468"></a>
-<span class="sourceLineNo">8469</span>    }<a name="line.8469"></a>
-<span class="sourceLineNo">8470</span>  }<a name="line.8470"></a>
-<span class="sourceLineNo">8471</span><a name="line.8471"></a>
-<span class="sourceLineNo">8472</span>  @Override<a name="line.8472"></a>
-<span class="sourceLineNo">8473</span>  public void closeRegionOperation() throws IOException {<a name="line.8473"></a>
-<span class="sourceLineNo">8474</span>    closeRegionOperation(Operation.ANY);<a name="line.8474"></a>
+<span class="sourceLineNo">8462</span>    // The unit for snapshot is a region. So, all stores for this region must be<a name="line.8462"></a>
+<span class="sourceLineNo">8463</span>    // prepared for snapshot operation before proceeding.<a name="line.8463"></a>
+<span class="sourceLineNo">8464</span>    if (op == Operation.SNAPSHOT) {<a name="line.8464"></a>
+<span class="sourceLineNo">8465</span>      stores.values().forEach(HStore::preSnapshotOperation);<a name="line.8465"></a>
+<span class="sourceLineNo">8466</span>    }<a name="line.8466"></a>
+<span class="sourceLineNo">8467</span>    try {<a name="line.8467"></a>
+<span class="sourceLineNo">8468</span>      if (coprocessorHost != null) {<a name="line.8468"></a>
+<span class="sourceLineNo">8469</span>        coprocessorHost.postStartRegionOperation(op);<a name="line.8469"></a>
+<span class="sourceLineNo">8470</span>      }<a name="line.8470"></a>
+<span class="sourceLineNo">8471</span>    } catch (Exception e) {<a name="line.8471"></a>
+<span class="sourceLineNo">8472</span>      lock.readLock().unlock();<a name="line.8472"></a>
+<span class="sourceLineNo">8473</span>      throw new IOException(e);<a name="line.8473"></a>
+<span class="sourceLineNo">8474</span>    }<a name="line.8474"></a>
 <span class="sourceLineNo">8475</span>  }<a name="line.8475"></a>
 <span class="sourceLineNo">8476</span><a name="line.8476"></a>
 <span class="sourceLineNo">8477</span>  @Override<a name="line.8477"></a>
-<span class="sourceLineNo">8478</span>  public void closeRegionOperation(Operation operation) throws IOException {<a name="line.8478"></a>
-<span class="sourceLineNo">8479</span>    if (operation == Operation.SNAPSHOT) {<a name="line.8479"></a>
-<span class="sourceLineNo">8480</span>      stores.values().forEach(HStore::postSnapshotOperation);<a name="line.8480"></a>
-<span class="sourceLineNo">8481</span>    }<a name="line.8481"></a>
-<span class="sourceLineNo">8482</span>    lock.readLock().unlock();<a name="line.8482"></a>
-<span class="sourceLineNo">8483</span>    if (coprocessorHost != null) {<a name="line.8483"></a>
-<span class="sourceLineNo">8484</span>      coprocessorHost.postCloseRegionOperation(operation);<a name="line.8484"></a>
-<span class="sourceLineNo">8485</span>    }<a name="line.8485"></a>
-<span class="sourceLineNo">8486</span>  }<a name="line.8486"></a>
-<span class="sourceLineNo">8487</span><a name="line.8487"></a>
-<span class="sourceLineNo">8488</span>  /**<a name="line.8488"></a>
-<span class="sourceLineNo">8489</span>   * This method needs to be called before any public call that reads or<a name="line.8489"></a>
-<span class="sourceLineNo">8490</span>   * modifies stores in bulk. It has to be called just before a try.<a name="line.8490"></a>
-<span class="sourceLineNo">8491</span>   * #closeBulkRegionOperation needs to be called in the try's finally block<a name="line.8491"></a>
-<span class="sourceLineNo">8492</span>   * Acquires a writelock and checks if the region is closing or closed.<a name="line.8492"></a>
-<span class="sourceLineNo">8493</span>   * @throws NotServingRegionException when the region is closing or closed<a name="line.8493"></a>
-<span class="sourceLineNo">8494</span>   * @throws RegionTooBusyException if failed to get the lock in time<a name="line.8494"></a>
-<span class="sourceLineNo">8495</span>   * @throws InterruptedIOException if interrupted while waiting for a lock<a name="line.8495"></a>
-<span class="sourceLineNo">8496</span>   */<a name="line.8496"></a>
-<span class="sourceLineNo">8497</span>  private void startBulkRegionOperation(boolean writeLockNeeded)<a name="line.8497"></a>
-<span class="sourceLineNo">8498</span>      throws NotServingRegionException, RegionTooBusyException, InterruptedIOException {<a name="line.8498"></a>
-<span class="sourceLineNo">8499</span>    if (this.closing.get()) {<a name="line.8499"></a>
-<span class="sourceLineNo">8500</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closing");<a name="line.8500"></a>
-<span class="sourceLineNo">8501</span>    }<a name="line.8501"></a>
-<span class="sourceLineNo">8502</span>    if (writeLockNeeded) lock(lock.writeLock());<a name="line.8502"></a>
-<span class="sourceLineNo">8503</span>    else lock(lock.readLock());<a name="line.8503"></a>
-<span class="sourceLineNo">8504</span>    if (this.closed.get()) {<a name="line.8504"></a>
-<span class="sourceLineNo">8505</span>      if (writeLockNeeded) lock.writeLock().unlock();<a name="line.8505"></a>
-<span class="sourceLineNo">8506</span>      else lock.readLock().unlock();<a name="line.8506"></a>
-<span class="sourceLineNo">8507</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closed");<a name="line.8507"></a>
-<span class="sourceLineNo">8508</span>    }<a name="line.8508"></a>
-<span class="sourceLineNo">8509</span>  }<a name="line.8509"></a>
-<span class="sourceLineNo">8510</span><a name="line.8510"></a>
-<span class="sourceLineNo">8511</span>  /**<a name="line.8511"></a>
-<span class="sourceLineNo">8512</span>   * Closes the lock. This needs to be called in the finally block corresponding<a name="line.8512"></a>
-<span class="sourceLineNo">8513</span>   * to the try block of #startRegionOperation<a name="line.8513"></a>
-<span class="sourceLineNo">8514</span>   */<a name="line.8514"></a>
-<span class="sourceLineNo">8515</span>  private void closeBulkRegionOperation(){<a name="line.8515"></a>
-<span class="sourceLineNo">8516</span>    if (lock.writeLock().isHeldByCurrentThread()) lock.writeLock().unlock();<a name="line.8516"></a>
-<span class="sourceLineNo">8517</span>    else lock.readLock().unlock();<a name="line.8517"></a>
-<span class="sourceLineNo">8518</span>  }<a name="line.8518"></a>
-<span class="sourceLineNo">8519</span><a name="line.8519"></a>
-<span class="sourceLineNo">8520</span>  /**<a name="line.8520"></a>
-<span class="sourceLineNo">8521</span>   * Update LongAdders for number of puts without wal and the size of possible data loss.<a name="line.8521"></a>
-<span class="sourceLineNo">8522</span>   * These information are exposed by the region server metrics.<a name="line.8522"></a>
-<span class="sourceLineNo">8523</span>   */<a name="line.8523"></a>
-<span class="sourceLineNo">8524</span>  private void recordMutationWithoutWal(final Map&lt;byte [], List&lt;Cell&gt;&gt; familyMap) {<a name="line.8524"></a>
-<span class="sourceLineNo">8525</span>    numMutationsWithoutWAL.increment();<a name="line.8525"></a>
-<span class="sourceLineNo">8526</span>    if (numMutationsWithoutWAL.sum() &lt;= 1) {<a name="line.8526"></a>
-<span class="sourceLineNo">8527</span>      LOG.info("writing data to region " + this +<a name="line.8527"></a>
-<span class="sourceLineNo">8528</span>               " with WAL disabled. Data may be lost in the event of a crash.");<a name="line.8528"></a>
-<span class="sourceLineNo">8529</span>    }<a name="line.8529"></a>
-<span class="sourceLineNo">8530</span><a name="line.8530"></a>
-<span class="sourceLineNo">8531</span>    long mutationSize = 0;<a name="line.8531"></a>
-<span class="sourceLineNo">8532</span>    for (List&lt;Cell&gt; cells: familyMap.values()) {<a name="line.8532"></a>
-<span class="sourceLineNo">8533</span>      // Optimization: 'foreach' loop is not used. See:<a name="line.8533"></a>
-<span class="sourceLineNo">8534</span>      // HBASE-12023 HRegion.applyFamilyMapToMemstore creates too many iterator objects<a name="line.8534"></a>
-<span class="sourceLineNo">8535</span>      assert cells instanceof RandomAccess;<a name="line.8535"></a>
-<span class="sourceLineNo">8536</span>      int listSize = cells.size();<a name="line.8536"></a>
-<span class="sourceLineNo">8537</span>      for (int i=0; i &lt; listSize; i++) {<a name="line.8537"></a>
-<span class="sourceLineNo">8538</span>        Cell cell = cells.get(i);<a name="line.8538"></a>
-<span class="sourceLineNo">8539</span>        mutationSize += cell.getSerializedSize();<a name="line.8539"></a>
-<span class="sourceLineNo">8540</span>      }<a name="line.8540"></a>
-<span class="sourceLineNo">8541</span>    }<a name="line.8541"></a>
-<span class="sourceLineNo">8542</span><a name="line.8542"></a>
-<span class="sourceLineNo">8543</span>    dataInMemoryWithoutWAL.add(mutationSize);<a name="line.8543"></a>
-<span class="sourceLineNo">8544</span>  }<a name="line.8544"></a>
-<span class="sourceLineNo">8545</span><a name="line.8545"></a>
-<span class="sourceLineNo">8546</span>  private void lock(final Lock lock) throws RegionTooBusyException, InterruptedIOException {<a name="line.8546"></a>
-<span class="sourceLineNo">8547</span>    lock(lock, 1);<a name="line.8547"></a>
-<span class="sourceLineNo">8548</span>  }<a name="line.8548"></a>
-<span class="sourceLineNo">8549</span><a name="line.8549"></a>
-<span class="sourceLineNo">8550</span>  /**<a name="line.8550"></a>
-<span class="sourceLineNo">8551</span>   * Try to acquire a lock.  Throw RegionTooBusyException<a name="line.8551"></a>
-<span class="sourceLineNo">8552</span>   * if failed to get the lock in time. Throw InterruptedIOException<a name="line.8552"></a>
-<span class="sourceLineNo">8553</span>   * if interrupted while waiting for the lock.<a name="line.8553"></a>
-<span class="sourceLineNo">8554</span>   */<a name="line.8554"></a>
-<span class="sourceLineNo">8555</span>  private void lock(final Lock lock, final int multiplier)<a name="line.8555"></a>
-<span class="sourceLineNo">8556</span>      throws RegionTooBusyException, InterruptedIOException {<a name="line.8556"></a>
-<span class="sourceLineNo">8557</span>    try {<a name="line.8557"></a>
-<span class="sourceLineNo">8558</span>      final long waitTime = Math.min(maxBusyWaitDuration,<a name="line.8558"></a>
-<span class="sourceLineNo">8559</span>          busyWaitDuration * Math.min(multiplier, maxBusyWaitMultiplier));<a name="line.8559"></a>
-<span class="sourceLineNo">8560</span>      if (!lock.tryLock(waitTime, TimeUnit.MILLISECONDS)) {<a name="line.8560"></a>
-<span class="sourceLineNo">8561</span>        // Don't print millis. Message is used as a key over in<a name="line.8561"></a>
-<span class="sourceLineNo">8562</span>        // RetriesExhaustedWithDetailsException processing.<a name="line.8562"></a>
-<span class="sourceLineNo">8563</span>        throw new RegionTooBusyException("Failed to obtain lock; regionName=" +<a name="line.8563"></a>
-<span class="sourceLineNo">8564</span>            (this.getRegionInfo() == null? "unknown":<a name="line.8564"></a>
-<span class="sourceLineNo">8565</span>                this.getRegionInfo().getRegionNameAsString()) +<a name="line.8565"></a>
-<span class="sourceLineNo">8566</span>            ", server=" + (this.getRegionServerServices() == null? "unknown":<a name="line.8566"></a>
-<span class="sourceLineNo">8567</span>                this.getRegionServerServices().getServerName()));<a name="line.8567"></a>
-<span class="sourceLineNo">8568</span>      }<a name="line.8568"></a>
-<span class="sourceLineNo">8569</span>    } catch (InterruptedException ie) {<a name="line.8569"></a>
-<span class="sourceLineNo">8570</span>      LOG.info("Interrupted while waiting for a lock");<a name="line.8570"></a>
-<span class="sourceLineNo">8571</span>      InterruptedIOException iie = new InterruptedIOException();<a name="line.8571"></a>
-<span class="sourceLineNo">8572</span>      iie.initCause(ie);<a name="line.8572"></a>
-<span class="sourceLineNo">8573</span>      throw iie;<a name="line.8573"></a>
-<span class="sourceLineNo">8574</span>    }<a name="line.8574"></a>
-<span class="sourceLineNo">8575</span>  }<a name="line.8575"></a>
-<span class="sourceLineNo">8576</span><a name="line.8576"></a>
-<span class="sourceLineNo">8577</span>  /**<a name="line.8577"></a>
-<span class="sourceLineNo">8578</span>   * Calls sync with the given transaction ID<a name="line.8578"></a>
-<span class="sourceLineNo">8579</span>   * @param txid should sync up to which transaction<a name="line.8579"></a>
-<span class="sourceLineNo">8580</span>   * @throws IOException If anything goes wrong with DFS<a name="line.8580"></a>
-<span class="sourceLineNo">8581</span>   */<a name="line.8581"></a>
-<span class="sourceLineNo">8582</span>  private void sync(long txid, Durability durability) throws IOException {<a name="line.8582"></a>
-<span class="sourceLineNo">8583</span>    if (this.getRegionInfo().isMetaRegion()) {<a name="line.8583"></a>
-<span class="sourceLineNo">8584</span>      this.wal.sync(txid);<a name="line.8584"></a>
-<span class="sourceLineNo">8585</span>    } else {<a name="line.8585"></a>
-<span class="sourceLineNo">8586</span>      switch(durability) {<a name="line.8586"></a>
-<span class="sourceLineNo">8587</span>      case USE_DEFAULT:<a name="line.8587"></a>
-<span class="sourceLineNo">8588</span>        // do what table defaults to<a name="line.8588"></a>
-<span class="sourceLineNo">8589</span>        if (shouldSyncWAL()) {<a name="line.8589"></a>
-<span class="sourceLineNo">8590</span>          this.wal.sync(txid);<a name="line.8590"></a>
-<span class="sourceLineNo">8591</span>        }<a name="line.8591"></a>
-<span class="sourceLineNo">8592</span>        break;<a name="line.8592"></a>
-<span class="sourceLineNo">8593</span>      case SKIP_WAL:<a name="line.8593"></a>
-<span class="sourceLineNo">8594</span>        // nothing do to<a name="line.8594"></a>
-<span class="sourceLineNo">8595</span>        break;<a name="line.8595"></a>
-<span class="sourceLineNo">8596</span>      case ASYNC_WAL:<a name="line.8596"></a>
-<span class="sourceLineNo">8597</span>        // nothing do to<a name="line.8597"></a>
-<span class="sourceLineNo">8598</span>        break;<a name="line.8598"></a>
-<span class="sourceLineNo">8599</span>      case SYNC_WAL:<a name="line.8599"></a>
-<span class="sourceLineNo">8600</span>          this.wal.sync(txid, false);<a name="line.8600"></a>
-<span class="sourceLineNo">8601</span>          break;<a name="line.8601"></a>
-<span class="sourceLineNo">8602</span>      case FSYNC_WAL:<a name="line.8602"></a>
-<span class="sourceLineNo">8603</span>          this.wal.sync(txid, true);<a name="line.8603"></a>
-<span class="sourceLineNo">8604</span>          break;<a name="line.8604"></a>
-<span class="sourceLineNo">8605</span>      default:<a name="line.8605"></a>
-<span class="sourceLineNo">8606</span>        throw new RuntimeException("Unknown durability " + durability);<a name="line.8606"></a>
-<span class="sourceLineNo">8607</span>      }<a name="line.8607"></a>
-<span class="sourceLineNo">8608</span>    }<a name="line.8608"></a>
-<span class="sourceLineNo">8609</span>  }<a name="line.8609"></a>
-<span class="sourceLineNo">8610</span><a name="line.8610"></a>
-<span class="sourceLineNo">8611</span>  /**<a name="line.8611"></a>
-<span class="sourceLineNo">8612</span>   * Check whether we should sync the wal from the table's durability settings<a name="line.8612"></a>
-<span class="sourceLineNo">8613</span>   */<a name="line.8613"></a>
-<span class="sourceLineNo">8614</span>  private boolean shouldSyncWAL() {<a name="line.8614"></a>
-<span class="sourceLineNo">8615</span>    return regionDurability.ordinal() &gt;  Durability.ASYNC_WAL.ordinal();<a name="line.8615"></a>
-<span class="sourceLineNo">8616</span>  }<a name="line.8616"></a>
-<span class="sourceLineNo">8617</span><a name="line.8617"></a>
-<span class="sourceLineNo">8618</span>  /**<a name="line.8618"></a>
-<span class="sourceLineNo">8619</span>   * A mocked list implementation - discards all updates.<a name="line.8619"></a>
-<span class="sourceLineNo">8620</span>   */<a name="line.8620"></a>
-<span class="sourceLineNo">8621</span>  private static final List&lt;Cell&gt; MOCKED_LIST = new AbstractList&lt;Cell&gt;() {<a name="line.8621"></a>
+<span class="sourceLineNo">8478</span>  public void closeRegionOperation() throws IOException {<a name="line.8478"></a>
+<span class="sourceLineNo">8479</span>    closeRegionOperation(Operation.ANY);<a name="line.8479"></a>
+<span class="sourceLineNo">8480</span>  }<a name="line.8480"></a>
+<span class="sourceLineNo">8481</span><a name="line.8481"></a>
+<span class="sourceLineNo">8482</span>  @Override<a name="line.8482"></a>
+<span class="sourceLineNo">8483</span>  public void closeRegionOperation(Operation operation) throws IOException {<a name="line.8483"></a>
+<span class="sourceLineNo">8484</span>    if (operation == Operation.SNAPSHOT) {<a name="line.8484"></a>
+<span class="sourceLineNo">8485</span>      stores.values().forEach(HStore::postSnapshotOperation);<a name="line.8485"></a>
+<span class="sourceLineNo">8486</span>    }<a name="line.8486"></a>
+<span class="sourceLineNo">8487</span>    lock.readLock().unlock();<a name="line.8487"></a>
+<span class="sourceLineNo">8488</span>    if (coprocessorHost != null) {<a name="line.8488"></a>
+<span class="sourceLineNo">8489</span>      coprocessorHost.postCloseRegionOperation(operation);<a name="line.8489"></a>
+<span class="sourceLineNo">8490</span>    }<a name="line.8490"></a>
+<span class="sourceLineNo">8491</span>  }<a name="line.8491"></a>
+<span class="sourceLineNo">8492</span><a name="line.8492"></a>
+<span class="sourceLineNo">8493</span>  /**<a name="line.8493"></a>
+<span class="sourceLineNo">8494</span>   * This method needs to be called before any public call that reads or<a name="line.8494"></a>
+<span class="sourceLineNo">8495</span>   * modifies stores in bulk. It has to be called just before a try.<a name="line.8495"></a>
+<span class="sourceLineNo">8496</span>   * #closeBulkRegionOperation needs to be called in the try's finally block<a name="line.8496"></a>
+<span class="sourceLineNo">8497</span>   * Acquires a writelock and checks if the region is closing or closed.<a name="line.8497"></a>
+<span class="sourceLineNo">8498</span>   * @throws NotServingRegionException when the region is closing or closed<a name="line.8498"></a>
+<span class="sourceLineNo">8499</span>   * @throws RegionTooBusyException if failed to get the lock in time<a name="line.8499"></a>
+<span class="sourceLineNo">8500</span>   * @throws InterruptedIOException if interrupted while waiting for a lock<a name="line.8500"></a>
+<span class="sourceLineNo">8501</span>   */<a name="line.8501"></a>
+<span class="sourceLineNo">8502</span>  private void startBulkRegionOperation(boolean writeLockNeeded)<a name="line.8502"></a>
+<span class="sourceLineNo">8503</span>      throws NotServingRegionException, RegionTooBusyException, InterruptedIOException {<a name="line.8503"></a>
+<span class="sourceLineNo">8504</span>    if (this.closing.get()) {<a name="line.8504"></a>
+<span class="sourceLineNo">8505</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closing");<a name="line.8505"></a>
+<span class="sourceLineNo">8506</span>    }<a name="line.8506"></a>
+<span class="sourceLineNo">8507</span>    if (writeLockNeeded) lock(lock.writeLock());<a name="line.8507"></a>
+<span class="sourceLineNo">8508</span>    else lock(lock.readLock());<a name="line.8508"></a>
+<span class="sourceLineNo">8509</span>    if (this.closed.get()) {<a name="line.8509"></a>
+<span class="sourceLineNo">8510</span>      if (writeLockNeeded) lock.writeLock().unlock();<a name="line.8510"></a>
+<span class="sourceLineNo">8511</span>      else lock.readLock().unlock();<a name="line.8511"></a>
+<span class="sourceLineNo">8512</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closed");<a name="line.8512"></a>
+<span class="sourceLineNo">8513</span>    }<a name="line.8513"></a>
+<span class="sourceLineNo">8514</span>  }<a name="line.8514"></a>
+<span class="sourceLineNo">8515</span><a name="line.8515"></a>
+<span class="sourceLineNo">8516</span>  /**<a name="line.8516"></a>
+<span class="sourceLineNo">8517</span>   * Closes the lock. This needs to be called in the finally block corresponding<a name="line.8517"></a>
+<span class="sourceLineNo">8518</span>   * to the try block of #startRegionOperation<a name="line.8518"></a>
+<span class="sourceLineNo">8519</span>   */<a name="line.8519"></a>
+<span class="sourceLineNo">8520</span>  private void closeBulkRegionOperation(){<a name="line.8520"></a>
+<span class="sourceLineNo">8521</span>    if (lock.writeLock().isHeldByCurrentThread()) lock.writeLock().unlock();<a name="line.8521"></a>
+<span class="sourceLineNo">8522</span>    else lock.readLock().unlock();<a name="line.8522"></a>
+<span class="sourceLineNo">8523</span>  }<a name="line.8523"></a>
+<span class="sourceLineNo">8524</span><a name="line.8524"></a>
+<span class="sourceLineNo">8525</span>  /**<a name="line.8525"></a>
+<span class="sourceLineNo">8526</span>   * Update LongAdders for number of puts without wal and the size of possible data loss.<a name="line.8526"></a>
+<span class="sourceLineNo">8527</span>   * These information are exposed by the region server metrics.<a name="line.8527"></a>
+<span class="sourceLineNo">8528</span>   */<a name="line.8528"></a>
+<span class="sourceLineNo">8529</span>  private void recordMutationWithoutWal(final Map&lt;byte [], List&lt;Cell&gt;&gt; familyMap) {<a name="line.8529"></a>
+<span class="sourceLineNo">8530</span>    numMutationsWithoutWAL.increment();<a name="line.8530"></a>
+<span class="sourceLineNo">8531</span>    if (numMutationsWithoutWAL.sum() &lt;= 1) {<a name="line.8531"></a>
+<span class="sourceLineNo">8532</span>      LOG.info("writing data to region " + this +<a name="line.8532"></a>
+<span class="sourceLineNo">8533</span>               " with WAL disabled. Data may be lost in the event of a crash.");<a name="line.8533"></a>
+<span class="sourceLineNo">8534</span>    }<a name="line.8534"></a>
+<span class="sourceLineNo">8535</span><a name="line.8535"></a>
+<span class="sourceLineNo">8536</span>    long mutationSize = 0;<a name="line.8536"></a>
+<span class="sourceLineNo">8537</span>    for (List&lt;Cell&gt; cells: familyMap.values()) {<a name="line.8537"></a>
+<span class="sourceLineNo">8538</span>      // Optimization: 'foreach' loop is not used. See:<a name="line.8538"></a>
+<span class="sourceLineNo">8539</span>      // HBASE-12023 HRegion.applyFamilyMapToMemstore creates too many iterator objects<a name="line.8539"></a>
+<span class="sourceLineNo">8540</span>      assert cells instanceof RandomAccess;<a name="line.8540"></a>
+<span class="sourceLineNo">8541</span>      int listSize = cells.size();<a name="line.8541"></a>
+<span class="sourceLineNo">8542</span>      for (int i=0; i &lt; listSize; i++) {<a name="line.8542"></a>
+<span class="sourceLineNo">8543</span>        Cell cell = cells.get(i);<a name="line.8543"></a>
+<span class="sourceLineNo">8544</span>        mutationSize += cell.getSerializedSize();<a name="line.8544"></a>
+<span class="sourceLineNo">8545</span>      }<a name="line.8545"></a>
+<span class="sourceLineNo">8546</span>    }<a name="line.8546"></a>
+<span class="sourceLineNo">8547</span><a name="line.8547"></a>
+<span class="sourceLineNo">8548</span>    dataInMemoryWithoutWAL.add(mutationSize);<a name="line.8548"></a>
+<span class="sourceLineNo">8549</span>  }<a name="line.8549"></a>
+<span class="sourceLineNo">8550</span><a name="line.8550"></a>
+<span class="sourceLineNo">8551</span>  private void lock(final Lock lock) throws RegionTooBusyException, InterruptedIOException {<a name="line.8551"></a>
+<span class="sourceLineNo">8552</span>    lock(lock, 1);<a name="line.8552"></a>
+<span class="sourceLineNo">8553</span>  }<a name="line.8553"></a>
+<span class="sourceLineNo">8554</span><a name="line.8554"></a>
+<span class="sourceLineNo">8555</span>  /**<a name="line.8555"></a>
+<span class="sourceLineNo">8556</span>   * Try to acquire a lock.  Throw RegionTooBusyException<a name="line.8556"></a>
+<span class="sourceLineNo">8557</span>   * if failed to get the lock in time. Throw InterruptedIOException<a name="line.8557"></a>
+<span class="sourceLineNo">8558</span>   * if interrupted while waiting for the lock.<a name="line.8558"></a>
+<span class="sourceLineNo">8559</span>   */<a name="line.8559"></a>
+<span class="sourceLineNo">8560</span>  private void lock(final Lock lock, final int multiplier)<a name="line.8560"></a>
+<span class="sourceLineNo">8561</span>      throws RegionTooBusyException, InterruptedIOException {<a name="line.8561"></a>
+<span class="sourceLineNo">8562</span>    try {<a name="line.8562"></a>
+<span class="sourceLineNo">8563</span>      final long waitTime = Math.min(maxBusyWaitDuration,<a name="line.8563"></a>
+<span class="sourceLineNo">8564</span>          busyWaitDuration * Math.min(multiplier, maxBusyWaitMultiplier));<a name="line.8564"></a>
+<span class="sourceLineNo">8565</span>      if (!lock.tryLock(waitTime, TimeUnit.MILLISECONDS)) {<a name="line.8565"></a>
+<span class="sourceLineNo">8566</span>        // Don't print millis. Message is used as a key over in<a name="line.8566"></a>
+<span class="sourceLineNo">8567</span>        // RetriesExhaustedWithDetailsException processing.<a name="line.8567"></a>
+<span class="sourceLineNo">8568</span>        throw new RegionTooBusyException("Failed to obtain lock; regionName=" +<a name="line.8568"></a>
+<span class="sourceLineNo">8569</span>            (this.getRegionInfo() == null? "unknown":<a name="line.8569"></a>
+<span class="sourceLineNo">8570</span>                this.getRegionInfo().getRegionNameAsString()) +<a name="line.8570"></a>
+<span class="sourceLineNo">8571</span>            ", server=" + (this.getRegionServerServices() == null? "unknown":<a name="line.8571"></a>
+<span class="sourceLineNo">8572</span>                this.getRegionServerServices().getServerName()));<a name="line.8572"></a>
+<span class="sourceLineNo">8573</span>      }<a name="line.8573"></a>
+<span class="sourceLineNo">8574</span>    } catch (InterruptedException ie) {<a name="line.8574"></a>
+<span class="sourceLineNo">8575</span>      LOG.info("Interrupted while waiting for a lock");<a name="line.8575"></a>
+<span class="sourceLineNo">8576</span>      InterruptedIOException iie = new InterruptedIOException();<a name="line.8576"></a>
+<span class="sourceLineNo">8577</span>      iie.initCause(ie);<a name="line.8577"></a>
+<span class="sourceLineNo">8578</span>      throw iie;<a name="line.8578"></a>
+<span class="sourceLineNo">8579</span>    }<a name="line.8579"></a>
+<span class="sourceLineNo">8580</span>  }<a name="line.8580"></a>
+<span class="sourceLineNo">8581</span><a name="line.8581"></a>
+<span class="sourceLineNo">8582</span>  /**<a name="line.8582"></a>
+<span class="sourceLineNo">8583</span>   * Calls sync with the given transaction ID<a name="line.8583"></a>
+<span class="sourceLineNo">8584</span>   * @param txid should sync up to which transaction<a name="line.8584"></a>
+<span class="sourceLineNo">8585</span>   * @throws IOException If anything goes wrong with DFS<a name="line.8585"></a>
+<span class="sourceLineNo">8586</span>   */<a name="line.8586"></a>
+<span class="sourceLineNo">8587</span>  private void sync(long txid, Durability durability) throws IOException {<a name="line.8587"></a>
+<span class="sourceLineNo">8588</span>    if (this.getRegionInfo().isMetaRegion()) {<a name="line.8588"></a>
+<span class="sourceLineNo">8589</span>      this.wal.sync(txid);<a name="line.8589"></a>
+<span class="sourceLineNo">8590</span>    } else {<a name="line.8590"></a>
+<span class="sourceLineNo">8591</span>      switch(durability) {<a name="line.8591"></a>
+<span class="sourceLineNo">8592</span>      case USE_DEFAULT:<a name="line.8592"></a>
+<span class="sourceLineNo">8593</span>        // do what table defaults to<a name="line.8593"></a>
+<span class="sourceLineNo">8594</span>        if (shouldSyncWAL()) {<a name="line.8594"></a>
+<span class="sourceLineNo">8595</span>          this.wal.sync(txid);<a name="line.8595"></a>
+<span class="sourceLineNo">8596</span>        }<a name="line.8596"></a>
+<span class="sourceLineNo">8597</span>        break;<a name="line.8597"></a>
+<span class="sourceLineNo">8598</span>      case SKIP_WAL:<a name="line.8598"></a>
+<span class="sourceLineNo">8599</span>        // nothing do to<a name="line.8599"></a>
+<span class="sourceLineNo">8600</span>        break;<a name="line.8600"></a>
+<span class="sourceLineNo">8601</span>      case ASYNC_WAL:<a name="line.8601"></a>
+<span class="sourceLineNo">8602</span>        // nothing do to<a name="line.8602"></a>
+<span class="sourceLineNo">8603</span>        break;<a name="line.8603"></a>
+<span class="sourceLineNo">8604</span>      case SYNC_WAL:<a name="line.8604"></a>
+<span class="sourceLineNo">8605</span>          this.wal.sync(txid, false);<a name="line.8605"></a>
+<span class="sourceLineNo">8606</span>          break;<a name="line.8606"></a>
+<span class="sourceLineNo">8607</span>      case FSYNC_WAL:<a name="line.8607"></a>
+<span class="sourceLineNo">8608</span>          this.wal.sync(txid, true);<a name="line.8608"></a>
+<span class="sourceLineNo">8609</span>          break;<a name="line.8609"></a>
+<span class="sourceLineNo">8610</span>      default:<a name="line.8610"></a>
+<span class="sourceLineNo">8611</span>        throw new RuntimeException("Unknown durability " + durability);<a name="line.8611"></a>
+<span class="sourceLineNo">8612</span>      }<a name="line.8612"></a>
+<span class="sourceLineNo">8613</span>    }<a name="line.8613"></a>
+<span class="sourceLineNo">8614</span>  }<a name="line.8614"></a>
+<span class="sourceLineNo">8615</span><a name="line.8615"></a>
+<span class="sourceLineNo">8616</span>  /**<a name="line.8616"></a>
+<span class="sourceLineNo">8617</span>   * Check whether we should sync the wal from the table's durability settings<a name="line.8617"></a>
+<span class="sourceLineNo">8618</span>   */<a name="line.8618"></a>
+<span class="sourceLineNo">8619</span>  private boolean shouldSyncWAL() {<a name="line.8619"></a>
+<span class="sourceLineNo">8620</span>    return regionDurability.ordinal() &gt;  Durability.ASYNC_WAL.ordinal();<a name="line.8620"></a>
+<span class="sourceLineNo">8621</span>  }<a name="line.8621"></a>
 <span class="sourceLineNo">8622</span><a name="line.8622"></a>
-<span class="sourceLineNo">8623</span>    @Override<a name="line.8623"></a>
-<span class="sourceLineNo">8624</span>    public void add(int index, Cell element) {<a name="line.8624"></a>
-<span class="sourceLineNo">8625</span>      // do nothing<a name="line.8625"></a>
-<span class="sourceLineNo">8626</span>    }<a name="line.8626"></a>
+<span class="sourceLineNo">8623</span>  /**<a name="line.8623"></a>
+<span class="sourceLineNo">8624</span>   * A mocked list implementation - discards all updates.<a name="line.8624"></a>
+<span class="sourceLineNo">8625</span>   */<a name="line.8625"></a>
+<span class="sourceLineNo">8626</span>  private static final List&lt;Cell&gt; MOCKED_LIST = new AbstractList&lt;Cell&gt;() {<a name="line.8626"></a>
 <span class="sourceLineNo">8627</span><a name="line.8627"></a>
 <span class="sourceLineNo">8628</span>    @Override<a name="line.8628"></a>
-<span class="sourceLineNo">8629</span>    public boolean addAll(int index, Collection&lt;? extends Cell&gt; c) {<a name="line.8629"></a>
-<span class="sourceLineNo">8630</span>      return false; // this list is never changed as a result of an update<a name="line.8630"></a>
+<span class="sourceLineNo">8629</span>    public void add(int index, Cell element) {<a name="line.8629"></a>
+<span class="sourceLineNo">8630</span>      // do nothing<a name="line.8630"></a>
 <span class="sourceLineNo">8631</span>    }<a name="line.8631"></a>
 <span class="sourceLineNo">8632</span><a name="line.8632"></a>
 <span class="sourceLineNo">8633</span>    @Override<a name="line.8633"></a>
-<span class="sourceLineNo">8634</span>    public KeyValue get(int index) {<a name="line.8634"></a>
-<span class="sourceLineNo">8635</span>      throw new UnsupportedOperationException();<a name="line.8635"></a>
+<span class="sourceLineNo">8634</span>    public boolean addAll(int index, Collection&lt;? extends Cell&gt; c) {<a name="line.8634"></a>
+<span class="sourceLineNo">8635</span>      return false; // this list is never changed as a result of an update<a name="line.8635"></a>
 <span class="sourceLineNo">8636</span>    }<a name="line.8636"></a>
 <span class="sourceLineNo">8637</span><a name="line.8637"></a>
 <span class="sourceLineNo">8638</span>    @Override<a name="line.8638"></a>
-<span class="sourceLineNo">8639</span>    public int size() {<a name="line.8639"></a>
-<span class="sourceLineNo">8640</span>      return 0;<a name="line.8640"></a>
+<span class="sourceLineNo">8639</span>    public KeyValue get(int index) {<a name="line.8639"></a>
+<span class="sourceLineNo">8640</span>      throw new UnsupportedOperationException();<a name="line.8640"></a>
 <span class="sourceLineNo">8641</span>    }<a name="line.8641"></a>
-<span class="sourceLineNo">8642</span>  };<a name="line.8642"></a>
-<span class="sourceLineNo">8643</span><a name="line.8643"></a>
-<span class="sourceLineNo">8644</span>  /** @return the latest sequence number that was read from storage when this region was opened */<a name="line.8644"></a>
-<span class="sourceLineNo">8645</span>  public long getOpenSeqNum() {<a name="line.8645"></a>
-<span class="sourceLineNo">8646</span>    return this.openSeqNum;<a name="line.8646"></a>
-<span class="sourceLineNo">8647</span>  }<a name="line.8647"></a>
+<span class="sourceLineNo">8642</span><a name="line.8642"></a>
+<span class="sourceLineNo">8643</span>    @Override<a name="line.8643"></a>
+<span class="sourceLineNo">8644</span>    public int size() {<a name="line.8644"></a>
+<span class="sourceLineNo">8645</span>      return 0;<a name="line.8645"></a>
+<span class="sourceLineNo">8646</span>    }<a name="line.8646"></a>
+<span class="sourceLineNo">8647</span>  };<a name="line.8647"></a>
 <span class="sourceLineNo">8648</span><a name="line.8648"></a>
-<span class="sourceLineNo">8649</span>  @Override<a name="line.8649"></a>
-<span class="sourceLineNo">8650</span>  public Map&lt;byte[], Long&gt; getMaxStoreSeqId() {<a name="line.8650"></a>
-<span class="sourceLineNo">8651</span>    return this.maxSeqIdInStores;<a name="line.8651"></a>
+<span class="sourceLineNo">8649</span>  /** @return the latest sequence number that was read from storage when this region was opened */<a name="line.8649"></a>
+<span class="sourceLineNo">8650</span>  public long getOpenSeqNum() {<a name="line.8650"></a>
+<span class="sourceLineNo">8651</span>    return this.openSeqNum;<a name="line.8651"></a>
 <span class="sourceLineNo">8652</span>  }<a name="line.8652"></a>
 <span class="sourceLineNo">8653</span><a name="line.8653"></a>
-<span class="sourceLineNo">8654</span>  public long getOldestSeqIdOfStore(byte[] familyName) {<a name="line.8654"></a>
-<span class="sourceLineNo">8655</span>    return wal.getEarliestMemStoreSeqNum(getRegionInfo().getEncodedNameAsBytes(), familyName);<a name="line.8655"></a>
-<span class="sourceLineNo">8656</span>  }<a name="line.8656"></a>
-<span class="sourceLineNo">8657</span><a name="line.8657"></a>
-<span class="sourceLineNo">8658</span>  @Override<a name="line.8658"></a>
-<span class="sourceLineNo">8659</span>  public CompactionState getCompactionState() {<a name="line.8659"></a>
-<span class="sourceLineNo">8660</span>    boolean hasMajor = majorInProgress.get() &gt; 0, hasMinor = minorInProgress.get() &gt; 0;<a name="line.8660"></a>
-<span class="sourceLineNo">8661</span>    return (hasMajor ? (hasMinor ? CompactionState.MAJOR_AND_MINOR : CompactionState.MAJOR)<a name="line.8661"></a>
-<span class="sourceLineNo">8662</span>        : (hasMinor ? CompactionState.MINOR : CompactionState.NONE));<a name="line.8662"></a>
-<span class="sourceLineNo">8663</span>  }<a name="line.8663"></a>
-<span class="sourceLineNo">8664</span><a name="line.8664"></a>
-<span class="sourceLineNo">8665</span>  public void reportCompactionRequestStart(boolean isMajor){<a name="line.8665"></a>
-<span class="sourceLineNo">8666</span>    (isMajor ? majorInProgress : minorInProgress).incrementAndGet();<a name="line.8666"></a>
-<span class="sourceLineNo">8667</span>  }<a name="line.8667"></a>
-<span class="sourceLineNo">8668</span><a name="line.8668"></a>
-<span class="sourceLineNo">8669</span>  public void reportCompactionRequestEnd(boolean isMajor, int numFiles, long filesSizeCompacted) {<a name="line.8669"></a>
-<span class="sourceLineNo">8670</span>    int newValue = (isMajor ? majorInProgress : minorInProgress).decrementAndGet();<a name="line.8670"></a>
-<span class="sourceLineNo">8671</span><a name="line.8671"></a>
-<span class="sourceLineNo">8672</span>    // metrics<a name="line.8672"></a>
-<span class="sourceLineNo">8673</span>    compactionsFinished.increment();<a name="line.8673"></a>
-<span class="sourceLineNo">8674</span>    compactionNumFilesCompacted.add(numFiles);<a name="line.8674"></a>
-<span class="sourceLineNo">8675</span>    compactionNumBytesCompacted.add(filesSizeCompacted);<a name="line.8675"></a>
+<span class="sourceLineNo">8654</span>  @Override<a name="line.8654"></a>
+<span class="sourceLineNo">8655</span>  public Map&lt;byte[], Long&gt; getMaxStoreSeqId() {<a name="line.8655"></a>
+<span class="sourceLineNo">8656</span>    return this.maxSeqIdInStores;<a name="line.8656"></a>
+<span class="sourceLineNo">8657</span>  }<a name="line.8657"></a>
+<span class="sourceLineNo">8658</span><a name="line.8658"></a>
+<span class="sourceLineNo">8659</span>  public long getOldestSeqIdOfStore(byte[] familyName) {<a name="line.8659"></a>
+<span class="sourceLineNo">8660</span>    return wal.getEarliestMemStoreSeqNum(getRegionInfo().getEncodedNameAsBytes(), familyName);<a name="line.8660"></a>
+<span class="sourceLineNo">8661</span>  }<a name="line.8661"></a>
+<span class="sourceLineNo">8662</span><a name="line.8662"></a>
+<span class="sourceLineNo">8663</span>  @Override<a name="line.8663"></a>
+<span class="sourceLineNo">8664</span>  public CompactionState getCompactionState() {<a name="line.8664"></a>
+<span class="sourceLineNo">8665</span>    boolean hasMajor = majorInProgress.get() &gt; 0, hasMinor = minorInProgress.get() &gt; 0;<a name="line.8665"></a>
+<span class="sourceLineNo">8666</span>    return (hasMajor ? (hasMinor ? CompactionState.MAJOR_AND_MINOR : CompactionState.MAJOR)<a name="line.8666"></a>
+<span class="sourceLineNo">8667</span>        : (hasMinor ? CompactionState.MINOR : CompactionState.NONE));<a name="line.8667"></a>
+<span class="sourceLineNo">8668</span>  }<a name="line.8668"></a>
+<span class="sourceLineNo">8669</span><a name="line.8669"></a>
+<span class="sourceLineNo">8670</span>  public void reportCompactionRequestStart(boolean isMajor){<a name="line.8670"></a>
+<span class="sourceLineNo">8671</span>    (isMajor ? majorInProgress : minorInProgress).incrementAndGet();<a name="line.8671"></a>
+<span class="sourceLineNo">8672</span>  }<a name="line.8672"></a>
+<span class="sourceLineNo">8673</span><a name="line.8673"></a>
+<span class="sourceLineNo">8674</span>  public void reportCompactionRequestEnd(boolean isMajor, int numFiles, long filesSizeCompacted) {<a name="line.8674"></a>
+<span class="sourceLineNo">8675</span>    int newValue = (isMajor ? majorInProgress : minorInProgress).decrementAndGet();<a name="line.8675"></a>
 <span class="sourceLineNo">8676</span><a name="line.8676"></a>
-<span class="sourceLineNo">8677</span>    assert newValue &gt;= 0;<a name="line.8677"></a>
-<span class="sourceLineNo">8678</span>  }<a name="line.8678"></a>
-<span class="sourceLineNo">8679</span><a name="line.8679"></a>
-<span class="sourceLineNo">8680</span>  public void reportCompactionRequestFailure() {<a name="line.8680"></a>
-<span class="sourceLineNo">8681</span>    compactionsFailed.increment();<a name="line.8681"></a>
-<span class="sourceLineNo">8682</span>  }<a name="line.8682"></a>
-<span class="sourceLineNo">8683</span><a name="line.8683"></a>
-<span class="sourceLineNo">8684</span>  public void incrementCompactionsQueuedCount() {<a name="line.8684"></a>
-<span class="sourceLineNo">8685</span>    compactionsQueued.increment();<a name="line.8685"></a>
-<span class="sourceLineNo">8686</span>  }<a name="line.8686"></a>
-<span class="sourceLineNo">8687</span><a name="line.8687"></a>
-<span class="sourceLineNo">8688</span>  public void decrementCompactionsQueuedCount() {<a name="line.8688"></a>
-<span class="sourceLineNo">8689</span>    compactionsQueued.decrement();<a name="line.8689"></a>
-<span class="sourceLineNo">8690</span>  }<a name="line.8690"></a>
-<span class="sourceLineNo">8691</span><a name="line.8691"></a>
-<span class="sourceLineNo">8692</span>  public void incrementFlushesQueuedCount() {<a name="line.8692"></a>
-<span class="sourceLineNo">8693</span>    flushesQueued.increment();<a name="line.8693"></a>
-<span class="sourceLineNo">8694</span>  }<a name="line.8694"></a>
-<span class="sourceLineNo">8695</span><a name="line.8695"></a>
-<span class="sourceLineNo">8696</span>  @VisibleForTesting<a name="line.8696"></a>
-<span class="sourceLineNo">8697</span>  public long getReadPoint() {<a name="line.8697"></a>
-<span class="sourceLineNo">8698</span>    return getReadPoint(IsolationLevel.READ_COMMITTED);<a name="line.8698"></a>
+<span class="sourceLineNo">8677</span>    // metrics<a name="line.8677"></a>
+<span class="sourceLineNo">8678</span>    compactionsFinished.increment();<a name="line.8678"></a>
+<span class="sourceLineNo">8679</span>    compactionNumFilesCompacted.add(numFiles);<a name="line.8679"></a>
+<span class="sourceLineNo">8680</span>    compactionNumBytesCompacted.add(filesSizeCompacted);<a name="line.8680"></a>
+<span class="sourceLineNo">8681</span><a name="line.8681"></a>
+<span class="sourceLineNo">8682</span>    assert newValue &gt;= 0;<a name="line.8682"></a>
+<span class="sourceLineNo">8683</span>  }<a name="line.8683"></a>
+<span class="sourceLineNo">8684</span><a name="line.8684"></a>
+<span class="sourceLineNo">8685</span>  public void reportCompactionRequestFailure() {<a name="line.8685"></a>
+<span class="sourceLineNo">8686</span>    compactionsFailed.increment();<a name="line.8686"></a>
+<span class="sourceLineNo">8687</span>  }<a name="line.8687"></a>
+<span class="sourceLineNo">8688</span><a name="line.8688"></a>
+<span class="sourceLineNo">8689</span>  public void incrementCompactionsQueuedCount() {<a name="line.8689"></a>
+<span class="sourceLineNo">8690</span>    compactionsQueued.increment();<a name="line.8690"></a>
+<span class="sourceLineNo">8691</span>  }<a name="line.8691"></a>
+<span class="sourceLineNo">8692</span><a name="line.8692"></a>
+<span class="sourceLineNo">8693</span>  public void decrementCompactionsQueuedCount() {<a name="line.8693"></a>
+<span class="sourceLineNo">8694</span>    compactionsQueued.decrement();<a name="line.8694"></a>
+<span class="sourceLineNo">8695</span>  }<a name="line.8695"></a>
+<span class="sourceLineNo">8696</span><a name="line.8696"></a>
+<span class="sourceLineNo">8697</span>  public void incrementFlushesQueuedCount() {<a name="line.8697"></a>
+<span class="sourceLineNo">8698</span>    flushesQueued.increment();<a name="line.8698"></a>
 <span class="sourceLineNo">8699</span>  }<a name="line.8699"></a>
 <span class="sourceLineNo">8700</span><a name="line.8700"></a>
-<span class="sourceLineNo">8701</span>  /**<a name="line.8701"></a>
-<span class="sourceLineNo">8702</span>   * {@inheritDoc}<a name="line.8702"></a>
-<span class="sourceLineNo">8703</span>   */<a name="line.8703"></a>
-<span class="sourceLineNo">8704</span>  @Override<a name="line.8704"></a>
-<span class="sourceLineNo">8705</span>  public void onConfigurationChange(Configuration conf) {<a name="line.8705"></a>
-<span class="sourceLineNo">8706</span>    this.storeHotnessProtector.update(conf);<a name="line.8706"></a>
-<span class="sourceLineNo">8707</span>  }<a name="line.8707"></a>
-<span class="sourceLineNo">8708</span><a name="line.8708"></a>
-<span class="sourceLineNo">8709</span>  /**<a name="line.8709"></a>
-<span class="sourceLineNo">8710</span>   * {@inheritDoc}<a name="line.8710"></a>
-<span class="sourceLineNo">8711</span>   */<a name="line.8711"></a>
-<span class="sourceLineNo">8712</span>  @Override<a name="line.8712"></a>
-<span class="sourceLineNo">8713</span>  public void registerChildren(ConfigurationManager manager) {<a name="line.8713"></a>
-<span class="sourceLineNo">8714</span>    configurationManager = Optional.of(manager);<a name="line.8714"></a>
-<span class="sourceLineNo">8715</span>    stores.values().forEach(manager::registerObserver);<a name="line.8715"></a>
-<span class="sourceLineNo">8716</span>  }<a name="line.8716"></a>
-<span class="sourceLineNo">8717</span><a name="line.8717"></a>
-<span class="sourceLineNo">8718</span>  /**<a name="line.8718"></a>
-<span class="sourceLineNo">8719</span>   * {@inheritDoc}<a name="line.8719"></a>
-<span class="sourceLineNo">8720</span>   */<a name="line.8720"></a>
-<span class="sourceLineNo">8721</span>  @Override<a name="line.8721"></a>
-<span class="sourceLineNo">8722</span>  public void deregisterChildren(ConfigurationManager manager) {<a name="line.8722"></a>
-<span class="sourceLineNo">8723</span>    stores.values().forEach(configurationManager.get()::deregisterObserver);<a name="line.8723"></a>
-<span class="sourceLineNo">8724</span>  }<a name="line.8724"></a>
-<span class="sourceLineNo">8725</span><a name="line.8725"></a>
+<span class="sourceLineNo">8701</span>  @VisibleForTesting<a name="line.8701"></a>
+<span class="sourceLineNo">8702</span>  public long getReadPoint() {<a name="line.8702"></a>
+<span class="sourceLineNo">8703</span>    return getReadPoint(IsolationLevel.READ_COMMITTED);<a name="line.8703"></a>
+<span class="sourceLineNo">8704</span>  }<a name="line.8704"></a>
+<span class="sourceLineNo">8705</span><a name="line.8705"></a>
+<span class="sourceLineNo">8706</span>  /**<a name="line.8706"></a>
+<span class="sourceLineNo">8707</span>   * {@inheritDoc}<a name="line.8707"></a>
+<span class="sourceLineNo">8708</span>   */<a name="line.8708"></a>
+<span class="sourceLineNo">8709</span>  @Override<a name="line.8709"></a>
+<span class="sourceLineNo">8710</span>  public void onConfigurationChange(Configuration conf) {<a name="line.8710"></a>
+<span class="sourceLineNo">8711</span>    this.storeHotnessProtector.update(conf);<a name="line.8711"></a>
+<span class="sourceLineNo">8712</span>  }<a name="line.8712"></a>
+<span class="sourceLineNo">8713</span><a name="line.8713"></a>
+<span class="sourceLineNo">8714</span>  /**<a name="line.8714"></a>
+<span class="sourceLineNo">8715</span>   * {@inheritDoc}<a name="line.8715"></a>
+<span class="sourceLineNo">8716</span>   */<a name="line.8716"></a>
+<span class="sourceLineNo">8717</span>  @Override<a name="line.8717"></a>
+<span class="sourceLineNo">8718</span>  public void registerChildren(ConfigurationManager manager) {<a name="line.8718"></a>
+<span class="sourceLineNo">8719</span>    configurationManager = Optional.of(manager);<a name="line.8719"></a>
+<span class="sourceLineNo">8720</span>    stores.values().forEach(manager::registerObserver);<a name="line.8720"></a>
+<span class="sourceLineNo">8721</span>  }<a name="line.8721"></a>
+<span class="sourceLineNo">8722</span><a name="line.8722"></a>
+<span class="sourceLineNo">8723</span>  /**<a name="line.8723"></a>
+<span class="sourceLineNo">8724</span>   * {@inheritDoc}<a name="line.8724"></a>
+<span class="sourceLineNo">8725</span>   */<a name="line.8725"></a>
 <span class="sourceLineNo">8726</span>  @Override<a name="line.8726"></a>
-<span class="sourceLineNo">8727</span>  public CellComparator getCellComparator() {<a name="line.8727"></a>
-<span class="sourceLineNo">8728</span>    return this.getRegionInfo().isMetaRegion() ? CellComparatorImpl.META_COMPARATOR<a name="line.8728"></a>
-<span class="sourceLineNo">8729</span>        : CellComparatorImpl.COMPARATOR;<a name="line.8729"></a>
-<span class="sourceLineNo">8730</span>  }<a name="line.8730"></a>
-<span class="sourceLineNo">8731</span><a name="line.8731"></a>
-<span class="sourceLineNo">8732</span>  public long getMemStoreFlushSize() {<a name="line.8732"></a>
-<span class="sourceLineNo">8733</span>    return this.memstoreFlushSize;<a name="line.8733"></a>
-<span class="sourceLineNo">8734</span>  }<a name="line.8734"></a>
-<span class="sourceLineNo">8735</span><a name="line.8735"></a>
+<span class="sourceLineNo">8727</span>  public void deregisterChildren(ConfigurationManager manager) {<a name="line.8727"></a>
+<span class="sourceLineNo">8728</span>    stores.values().forEach(configurationManager.get()::deregisterObserver);<a name="line.8728"></a>
+<span class="sourceLineNo">8729</span>  }<a name="line.8729"></a>
+<span class="sourceLineNo">8730</span><a name="line.8730"></a>
+<span class="sourceLineNo">8731</span>  @Override<a name="line.8731"></a>
+<span class="sourceLineNo">8732</span>  public CellComparator getCellComparator() {<a name="line.8732"></a>
+<span class="sourceLineNo">8733</span>    return this.getRegionInfo().isMetaRegion() ? CellComparatorImpl.META_COMPARATOR<a name="line.8733"></a>
+<span class="sourceLineNo">8734</span>        : CellComparatorImpl.COMPARATOR;<a name="line.8734"></a>
+<span class="sourceLineNo">8735</span>  }<a name="line.8735"></a>
 <span class="sourceLineNo">8736</span><a name="line.8736"></a>
-<span class="sourceLineNo">8737</span>  //// method for debugging tests<a name="line.8737"></a>
-<span class="sourceLineNo">8738</span>  void throwException(String title, String regionName) {<a name="line.8738"></a>
-<span class="sourceLineNo">8739</span>    StringBuilder buf = new StringBuilder();<a name="line.8739"></a>
-<span class="sourceLineNo">8740</span>    buf.append(title + ", ");<a name="line.8740"></a>
-<span class="sourceLineNo">8741</span>    buf.append(getRegionInfo().toString());<a name="line.8741"></a>
-<span class="sourceLineNo">8742</span>    buf.append(getRegionInfo().isMetaRegion() ? " meta region " : " ");<a name="line.8742"></a>
-<span class="sourceLineNo">8743</span>    buf.append("stores: ");<a name="line.8743"></a>
-<span class="sourceLineNo">8744</span>    for (HStore s : stores.values()) {<a name="line.8744"></a>
-<span class="sourceLineNo">8745</span>      buf.append(s.getColumnFamilyDescriptor().getNameAsString());<a name="line.8745"></a>
-<span class="sourceLineNo">8746</span>      buf.append(" size: ");<a name="line.8746"></a>
-<span class="sourceLineNo">8747</span>      buf.append(s.getMemStoreSize().getDataSize());<a name="line.8747"></a>
-<span class="sourceLineNo">8748</span>      buf.append(" ");<a name="line.8748"></a>
-<span class="sourceLineNo">8749</span>    }<a name="line.8749"></a>
-<span class="sourceLineNo">8750</span>    buf.append("end-of-stores");<a name="line.8750"></a>
-<span class="sourceLineNo">8751</span>    buf.append(", memstore size ");<a name="line.8751"></a>
-<span class="sourceLineNo">8752</span>    buf.append(getMemStoreDataSize());<a name="line.8752"></a>
-<span class="sourceLineNo">8753</span>    if (getRegionInfo().getRegionNameAsString().startsWith(regionName)) {<a name="line.8753"></a>
-<span class="sourceLineNo">8754</span>      throw new RuntimeException(buf.toString());<a name="line.8754"></a>
-<span class="sourceLineNo">8755</span>    }<a name="line.8755"></a>
-<span class="sourceLineNo">8756</span>  }<a name="line.8756"></a>
-<span class="sourceLineNo">8757</span><a name="line.8757"></a>
-<span class="sourceLineNo">8758</span>  @Override<a name="line.8758"></a>
-<span class="sourceLineNo">8759</span>  public void requestCompaction(String why, int priority, boolean major,<a name="line.8759"></a>
-<span class="sourceLineNo">8760</span>      CompactionLifeCycleTracker tracker) throws IOException {<a name="line.8760"></a>
-<span class="sourceLineNo">8761</span>    if (major) {<a name="line.8761"></a>
-<span class="sourceLineNo">8762</span>      stores.values().forEach(HStore::triggerMajorCompaction);<a name="line.8762"></a>
-<span class="sourceLineNo">8763</span>    }<a name="line.8763"></a>
-<span class="sourceLineNo">8764</span>    rsServices.getCompactionRequestor().requestCompaction(this, why, priority, tracker,<a name="line.8764"></a>
-<span class="sourceLineNo">8765</span>        RpcServer.getRequestUser().orElse(null));<a name="line.8765"></a>
-<span class="sourceLineNo">8766</span>  }<a name="line.8766"></a>
-<span class="sourceLineNo">8767</span><a name="line.8767"></a>
-<span class="sourceLineNo">8768</span>  @Override<a name="line.8768"></a>
-<span class="sourceLineNo">8769</span>  public void requestCompaction(byte[] family, String why, int priority, boolean major,<a name="line.8769"></a>
-<span class="sourceLineNo">8770</span>      CompactionLifeCycleTracker tracker) throws IOException {<a name="line.8770"></a>
-<span class="sourceLineNo">8771</span>    HStore store = stores.get(family);<a name="line.8771"></a>
-<span class="sourceLineNo">8772</span>    if (store == null) {<a name="line.8772"></a>
-<span class="sourceLineNo">8773</span>      throw new NoSuchColumnFamilyException("column family " + Bytes.toString(family) +<a name="line.8773"></a>
-<span class="sourceLineNo">8774</span>          " does not exist in region " + getRegionInfo().getRegionNameAsString());<a name="line.8774"></a>
-<span class="sourceLineNo">8775</span>    }<a name="line.8775"></a>
-<span class="sourceLineNo">8776</span>    if (major) {<a name="line.8776"></a>
-<span class="sourceLineNo">8777</span>      store.triggerMajorCompaction();<a name="line.8777"></a>
-<span class="sourceLineNo">8778</span>    }<a name="line.8778"></a>
-<span class="sourceLineNo">8779</span>    rsServices.getCompactionRequestor().requestCompaction(this, store, why, priority, tracker,<a name="line.8779"></a>
-<span class="sourceLineNo">8780</span>        RpcServer.getRequestUser().orElse(null));<a name="line.8780"></a>
-<span class="sourceLineNo">8781</span>  }<a name="line.8781"></a>
-<span class="sourceLineNo">8782</span><a name="line.8782"></a>
-<span class="sourceLineNo">8783</span>  private void requestFlushIfNeeded() throws RegionTooBusyException {<a name="line.8783"></a>
-<span class="sourceLineNo">8784</span>    if(isFlushSize(this.memStoreSizing.getMemStoreSize())) {<a name="line.8784"></a>
-<span class="sourceLineNo">8785</span>      requestFlush();<a name="line.8785"></a>
-<span class="sourceLineNo">8786</span>    }<a name="line.8786"></a>
-<span class="sourceLineNo">8787</span>  }<a name="line.8787"></a>
-<span class="sourceLineNo">8788</span><a name="line.8788"></a>
-<span class="sourceLineNo">8789</span>  private void requestFlush() {<a name="line.8789"></a>
-<span class="sourceLineNo">8790</span>    if (this.rsServices == null) {<a name="line.8790"></a>
-<span class="sourceLineNo">8791</span>      return;<a name="line.8791"></a>
-<span class="sourceLineNo">8792</span>    }<a name="line.8792"></a>
-<span class="sourceLineNo">8793</span>    requestFlush0(FlushLifeCycleTracker.DUMMY);<a name="line.8793"></a>
-<span class="sourceLineNo">8794</span>  }<a name="line.8794"></a>
-<span class="sourceLineNo">8795</span><a name="line.8795"></a>
-<span class="sourceLineNo">8796</span>  private void requestFlush0(FlushLifeCycleTracker tracker) {<a name="line.8796"></a>
-<span class="sourceLineNo">8797</span>    boolean shouldFlush = false;<a name="line.8797"></a>
-<span class="sourceLineNo">8798</span>    synchronized (writestate) {<a name="line.8798"></a>
-<span class="sourceLineNo">8799</span>      if (!this.writestate.isFlushRequested()) {<a name="line.8799"></a>
-<span class="sourceLineNo">8800</span>        shouldFlush = true;<a name="line.8800"></a>
-<span class="sourceLineNo">8801</span>        writestate.flushRequested = true;<a name="line.8801"></a>
-<span class="sourceLineNo">8802</span>      }<a name="line.8802"></a>
-<span class="sourceLineNo">8803</span>    }<a name="line.8803"></a>
-<span class="sourceLineNo">8804</span>    if (shouldFlush) {<a name="line.8804"></a>
-<span class="sourceLineNo">8805</span>      // Make request outside of synchronize block; HBASE-818.<a name="line.8805"></a>
-<span class="sourceLineNo">8806</span>      this.rsServices.getFlushRequester().requestFlush(this, false, tracker);<a name="line.8806"></a>
-<span class="sourceLineNo">8807</span>      if (LOG.isDebugEnabled()) {<a name="line.8807"></a>
-<span class="sourceLineNo">8808</span>        LOG.debug("Flush requested on " + this.getRegionInfo().getEncodedName());<a name="line.8808"></a>
-<span class="sourceLineNo">8809</span>      }<a name="line.8809"></a>
-<span class="sourceLineNo">8810</span>    } else {<a name="line.8810"></a>
-<span class="sourceLineNo">8811</span>      tracker.notExecuted("Flush already requested on " + this);<a name="line.8811"></a>
-<span class="sourceLineNo">8812</span>    }<a name="line.8812"></a>
-<span class="sourceLineNo">8813</span>  }<a name="line.8813"></a>
-<span class="sourceLineNo">8814</span><a name="line.8814"></a>
-<span class="sourceLineNo">8815</span>  @Override<a name="line.8815"></a>
-<span class="sourceLineNo">8816</span>  public void requestFlush(FlushLifeCycleTracker tracker) throws IOException {<a name="line.8816"></a>
-<span class="sourceLineNo">8817</span>    requestFlush0(tracker);<a name="line.8817"></a>
+<span class="sourceLineNo">8737</span>  public long getMemStoreFlushSize() {<a name="line.8737"></a>
+<span class="sourceLineNo">8738</span>    return this.memstoreFlushSize;<a name="line.8738"></a>
+<span class="sourceLineNo">8739</span>  }<a name="line.8739"></a>
+<span class="sourceLineNo">8740</span><a name="line.8740"></a>
+<span class="sourceLineNo">8741</span><a name="line.8741"></a>
+<span class="sourceLineNo">8742</span>  //// method for debugging tests<a name="line.8742"></a>
+<span class="sourceLineNo">8743</span>  void throwException(String title, String regionName) {<a name="line.8743"></a>
+<span class="sourceLineNo">8744</span>    StringBuilder buf = new StringBuilder();<a name="line.8744"></a>
+<span class="sourceLineNo">8745</span>    buf.append(title + ", ");<a name="line.8745"></a>
+<span class="sourceLineNo">8746</span>    buf.append(getRegionInfo().toString());<a name="line.8746"></a>
+<span class="sourceLineNo">8747</span>    buf.append(getRegionInfo().isMetaRegion() ? " meta region " : " ");<a name="line.8747"></a>
+<span class="sourceLineNo">8748</span>    buf.append("stores: ");<a name="line.8748"></a>
+<span class="sourceLineNo">8749</span>    for (HStore s : stores.values()) {<a name="line.8749"></a>
+<span class="sourceLineNo">8750</span>      buf.append(s.getColumnFamilyDescriptor().getNameAsString());<a name="line.8750"></a>
+<span class="sourceLineNo">8751</span>      buf.append(" size: ");<a name="line.8751"></a>
+<span class="sourceLineNo">8752</span>      buf.append(s.getMemStoreSize().getDataSize());<a name="line.8752"></a>
+<span class="sourceLineNo">8753</span>      buf.append(" ");<a name="line.8753"></a>
+<span class="sourceLineNo">8754</span>    }<a name="line.8754"></a>
+<span class="sourceLineNo">8755</span>    buf.append("end-of-stores");<a name="line.8755"></a>
+<span class="sourceLineNo">8756</span>    buf.append(", memstore size ");<a name="line.8756"></a>
+<span class="sourceLineNo">8757</span>    buf.append(getMemStoreDataSize());<a name="line.8757"></a>
+<span class="sourceLineNo">8758</span>    if (getRegionInfo().getRegionNameAsString().startsWith(regionName)) {<a name="line.8758"></a>
+<span class="sourceLineNo">8759</span>      throw new RuntimeException(buf.toString());<a name="line.8759"></a>
+<span class="sourceLineNo">8760</span>    }<a name="line.8760"></a>
+<span class="sourceLineNo">8761</span>  }<a name="line.8761"></a>
+<span class="sourceLineNo">8762</span><a name="line.8762"></a>
+<span class="sourceLineNo">8763</span>  @Override<a name="line.8763"></a>
+<span class="sourceLineNo">8764</span>  public void requestCompaction(String why, int priority, boolean major,<a name="line.8764"></a>
+<span class="sourceLineNo">8765</span>      CompactionLifeCycleTracker tracker) throws IOException {<a name="line.8765"></a>
+<span class="sourceLineNo">8766</span>    if (major) {<a name="line.8766"></a>
+<span class="sourceLineNo">8767</span>      stores.values().forEach(HStore::triggerMajorCompaction);<a name="line.8767"></a>
+<span class="sourceLineNo">8768</span>    }<a name="line.8768"></a>
+<span class="sourceLineNo">8769</span>    rsServices.getCompactionRequestor().requestCompaction(this, why, priority, tracker,<a name="line.8769"></a>
+<span class="sourceLineNo">8770</span>        RpcServer.getRequestUser().orElse(null));<a name="line.8770"></a>
+<span class="sourceLineNo">8771</span>  }<a name="line.8771"></a>
+<span class="sourceLineNo">8772</span><a name="line.8772"></a>
+<span class="sourceLineNo">8773</span>  @Override<a name="line.8773"></a>
+<span class="sourceLineNo">8774</span>  public void requestCompaction(byte[] family, String why, int priority, boolean major,<a name="line.8774"></a>
+<span class="sourceLineNo">8775</span>      CompactionLifeCycleTracker tracker) throws IOException {<a name="line.8775"></a>
+<span class="sourceLineNo">8776</span>    HStore store = stores.get(family);<a name="line.8776"></a>
+<span class="sourceLineNo">8777</span>    if (store == null) {<a name="line.8777"></a>
+<span class="sourceLineNo">8778</span>      throw new NoSuchColumnFamilyException("column family " + Bytes.toString(family) +<a name="line.8778"></a>
+<span class="sourceLineNo">8779</span>          " does not exist in region " + getRegionInfo().getRegionNameAsString());<a name="line.8779"></a>
+<span class="sourceLineNo">8780</span>    }<a name="line.8780"></a>
+<span class="sourceLineNo">8781</span>    if (major) {<a name="line.8781"></a>
+<span class="sourceLineNo">8782</span>      store.triggerMajorCompaction();<a name="line.8782"></a>
+<span class="sourceLineNo">8783</span>    }<a name="line.8783"></a>
+<span class="sourceLineNo">8784</span>    rsServices.getCompactionRequestor().requestCompaction(this, store, why, priority, tracker,<a name="line.8784"></a>
+<span class="sourceLineNo">8785</span>        RpcServer.getRequestUser().orElse(null));<a name="line.8785"></a>
+<span class="sourceLineNo">8786</span>  }<a name="line.8786"></a>
+<span class="sourceLineNo">8787</span><a name="line.8787"></a>
+<span class="sourceLineNo">8788</span>  private void requestFlushIfNeeded() throws RegionTooBusyException {<a name="line.8788"></a>
+<span class="sourceLineNo">8789</span>    if(isFlushSize(this.memStoreSizing.getMemStoreSize())) {<a name="line.8789"></a>
+<span class="sourceLineNo">8790</span>      requestFlush();<a name="line.8790"></a>
+<span class="sourceLineNo">8791</span>    }<a name="line.8791"></a>
+<span class="sourceLineNo">8792</span>  }<a name="line.8792"></a>
+<span class="sourceLineNo">8793</span><a name="line.8793"></a>
+<span class="sourceLineNo">8794</span>  private void requestFlush() {<a name="line.8794"></a>
+<span class="sourceLineNo">8795</span>    if (this.rsServices == null) {<a name="line.8795"></a>
+<span class="sourceLineNo">8796</span>      return;<a name="line.8796"></a>
+<span class="sourceLineNo">8797</span>    }<a name="line.8797"></a>
+<span class="sourceLineNo">8798</span>    requestFlush0(FlushLifeCycleTracker.DUMMY);<a name="line.8798"></a>
+<span class="sourceLineNo">8799</span>  }<a name="line.8799"></a>
+<span class="sourceLineNo">8800</span><a name="line.8800"></a>
+<span class="sourceLineNo">8801</span>  private void requestFlush0(FlushLifeCycleTracker tracker) {<a name="line.8801"></a>
+<span class="sourceLineNo">8802</span>    boolean shouldFlush = false;<a name="line.8802"></a>
+<span class="sourceLineNo">8803</span>    synchronized (writestate) {<a name="line.8803"></a>
+<span class="sourceLineNo">8804</span>      if (!this.writestate.isFlushRequested()) {<a name="line.8804"></a>
+<span class="sourceLineNo">8805</span>        shouldFlush = true;<a name="line.8805"></a>
+<span class="sourceLineNo">8806</span>        writestate.flushRequested = true;<a name="line.8806"></a>
+<span class="sourceLineNo">8807</span>      }<a name="line.8807"></a>
+<span class="sourceLineNo">8808</span>    }<a name="line.8808"></a>
+<span class="sourceLineNo">8809</span>    if (shouldFlush) {<a name="line.8809"></a>
+<span class="sourceLineNo">8810</span>      // Make request outside of synchronize block; HBASE-818.<a name="line.8810"></a>
+<span class="sourceLineNo">8811</span>      this.rsServices.getFlushRequester().requestFlush(this, false, tracker);<a name="line.8811"></a>
+<span class="sourceLineNo">8812</span>      if (LOG.isDebugEnabled()) {<a name="line.8812"></a>
+<span class="sourceLineNo">8813</span>        LOG.debug("Flush requested on " + this.getRegionInfo().getEncodedName());<a name="line.8813"></a>
+<span class="sourceLineNo">8814</span>      }<a name="line.8814"></a>
+<span class="sourceLineNo">8815</span>    } else {<a name="line.8815"></a>
+<span class="sourceLineNo">8816</span>      tracker.notExecuted("Flush already requested on " + this);<a name="line.8816"></a>
+<span class="sourceLineNo">8817</span>    }<a name="line.8817"></a>
 <span class="sourceLineNo">8818</span>  }<a name="line.8818"></a>
 <span class="sourceLineNo">8819</span><a name="line.8819"></a>
-<span class="sourceLineNo">8820</span>  /**<a name="line.8820"></a>
-<span class="sourceLineNo">8821</span>   * This method modifies the region's configuration in order to inject replication-related<a name="line.8821"></a>
-<span class="sourceLineNo">8822</span>   * features<a name="line.8822"></a>
-<span class="sourceLineNo">8823</span>   * @param conf region configurations<a name="line.8823"></a>
-<span class="sourceLineNo">8824</span>   */<a name="line.8824"></a>
-<span class="sourceLineNo">8825</span>  static void decorateRegionConfiguration(Configuration conf) {<a name="line.8825"></a>
-<span class="sourceLineNo">8826</span>    if (ReplicationUtils.isReplicationForBulkLoadDataEnabled(conf)) {<a name="line.8826"></a>
-<span class="sourceLineNo">8827</span>      String plugins = conf.get(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY,"");<a name="line.8827"></a>
-<span class="sourceLineNo">8828</span>      String replicationCoprocessorClass = ReplicationObserver.class.getCanonicalName();<a name="line.8828"></a>
-<span class="sourceLineNo">8829</span>      if (!plugins.contains(replicationCoprocessorClass)) {<a name="line.8829"></a>
-<span class="sourceLineNo">8830</span>        conf.set(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY,<a name="line.8830"></a>
-<span class="sourceLineNo">8831</span>            (plugins.equals("") ? "" : (plugins + ",")) + replicationCoprocessorClass);<a name="line.8831"></a>
-<span class="sourceLineNo">8832</span>      }<a name="line.8832"></a>
-<span class="sourceLineNo">8833</span>    }<a name="line.8833"></a>
-<span class="sourceLineNo">8834</span>  }<a name="line.8834"></a>
-<span class="sourceLineNo">8835</span>}<a name="line.8835"></a>
+<span class="sourceLineNo">8820</span>  @Override<a name="line.8820"></a>
+<span class="sourceLineNo">8821</span>  public void requestFlush(FlushLifeCycleTracker tracker) throws IOException {<a name="line.8821"></a>
+<span class="sourceLineNo">8822</span>    requestFlush0(tracker);<a name="line.8822"></a>
+<span class="sourceLineNo">8823</span>  }<a name="line.8823"></a>
+<span class="sourceLineNo">8824</span><a name="line.8824"></a>
+<span class="sourceLineNo">8825</span>  /**<a name="line.8825"></a>
+<span class="sourceLineNo">8826</span>   * This method modifies the region's configuration in order to inject replication-related<a name="line.8826"></a>
+<span class="sourceLineNo">8827</span>   * features<a name="line.8827"></a>
+<span class="sourceLineNo">8828</span>   * @param conf region configurations<a name="line.8828"></a>
+<span class="sourceLineNo">8829</span>   */<a name="line.8829"></a>
+<span class="sourceLineNo">8830</span>  static void decorateRegionConfiguration(Configuration conf) {<a name="line.8830"></a>
+<span class="sourceLineNo">8831</span>    if (ReplicationUtils.isReplicationForBulkLoadDataEnabled(conf)) {<a name="line.8831"></a>
+<span class="sourceLineNo">8832</span>      String plugins = conf.get(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY,"");<a name="line.8832"></a>
+<span class="sourceLineNo">8833</span>      String replicationCoprocessorClass = ReplicationObserver.class.getCanonicalName();<a name="line.8833"></a>
+<span class="sourceLineNo">8834</span>      if (!plugins.contains(replicationCoprocessorClass)) {<a name="line.8834"></a>
+<span class="sourceLineNo">8835</span>        conf.set(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY,<a name="line.8835"></a>
+<span class="sourceLineNo">8836</span>            (plugins.equals("") ? "" : (plugins + ",")) + replicationCoprocessorClass);<a name="line.8836"></a>
+<span class="sourceLineNo">8837</span>      }<a name="line.8837"></a>
+<span class="sourceLineNo">8838</span>    }<a name="line.8838"></a>
+<span class="sourceLineNo">8839</span>  }<a name="line.8839"></a>
+<span class="sourceLineNo">8840</span>}<a name="line.8840"></a>
 
 
 
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 8fcec33..2147e82 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
@@ -7972,875 +7972,880 @@
 <span class="sourceLineNo">7964</span>    if (walEdit.isReplay()) {<a name="line.7964"></a>
 <span class="sourceLineNo">7965</span>      walKey.setOrigLogSeqNum(origLogSeqNum);<a name="line.7965"></a>
 <span class="sourceLineNo">7966</span>    }<a name="line.7966"></a>
-<span class="sourceLineNo">7967</span>    WriteEntry writeEntry = null;<a name="line.7967"></a>
-<span class="sourceLineNo">7968</span>    try {<a name="line.7968"></a>
-<span class="sourceLineNo">7969</span>      long txid = this.wal.append(this.getRegionInfo(), walKey, walEdit, true);<a name="line.7969"></a>
-<span class="sourceLineNo">7970</span>      // Call sync on our edit.<a name="line.7970"></a>
-<span class="sourceLineNo">7971</span>      if (txid != 0) {<a name="line.7971"></a>
-<span class="sourceLineNo">7972</span>        sync(txid, durability);<a name="line.7972"></a>
-<span class="sourceLineNo">7973</span>      }<a name="line.7973"></a>
-<span class="sourceLineNo">7974</span>      writeEntry = walKey.getWriteEntry();<a name="line.7974"></a>
-<span class="sourceLineNo">7975</span>    } catch (IOException ioe) {<a name="line.7975"></a>
-<span class="sourceLineNo">7976</span>      if (walKey != null &amp;&amp; walKey.getWriteEntry() != null) {<a name="line.7976"></a>
-<span class="sourceLineNo">7977</span>        mvcc.complete(walKey.getWriteEntry());<a name="line.7977"></a>
+<span class="sourceLineNo">7967</span>    //don't call the coproc hook for writes to the WAL caused by<a name="line.7967"></a>
+<span class="sourceLineNo">7968</span>    //system lifecycle events like flushes or compactions<a name="line.7968"></a>
+<span class="sourceLineNo">7969</span>    if (this.coprocessorHost != null &amp;&amp; !walEdit.isMetaEdit()) {<a name="line.7969"></a>
+<span class="sourceLineNo">7970</span>      this.coprocessorHost.preWALAppend(walKey, walEdit);<a name="line.7970"></a>
+<span class="sourceLineNo">7971</span>    }<a name="line.7971"></a>
+<span class="sourceLineNo">7972</span>    WriteEntry writeEntry = null;<a name="line.7972"></a>
+<span class="sourceLineNo">7973</span>    try {<a name="line.7973"></a>
+<span class="sourceLineNo">7974</span>      long txid = this.wal.append(this.getRegionInfo(), walKey, walEdit, true);<a name="line.7974"></a>
+<span class="sourceLineNo">7975</span>      // Call sync on our edit.<a name="line.7975"></a>
+<span class="sourceLineNo">7976</span>      if (txid != 0) {<a name="line.7976"></a>
+<span class="sourceLineNo">7977</span>        sync(txid, durability);<a name="line.7977"></a>
 <span class="sourceLineNo">7978</span>      }<a name="line.7978"></a>
-<span class="sourceLineNo">7979</span>      throw ioe;<a name="line.7979"></a>
-<span class="sourceLineNo">7980</span>    }<a name="line.7980"></a>
-<span class="sourceLineNo">7981</span>    return writeEntry;<a name="line.7981"></a>
-<span class="sourceLineNo">7982</span>  }<a name="line.7982"></a>
-<span class="sourceLineNo">7983</span><a name="line.7983"></a>
-<span class="sourceLineNo">7984</span>  /**<a name="line.7984"></a>
-<span class="sourceLineNo">7985</span>   * Do coprocessor pre-increment or pre-append call.<a name="line.7985"></a>
-<span class="sourceLineNo">7986</span>   * @return Result returned out of the coprocessor, which means bypass all further processing and<a name="line.7986"></a>
-<span class="sourceLineNo">7987</span>   *  return the proffered Result instead, or null which means proceed.<a name="line.7987"></a>
-<span class="sourceLineNo">7988</span>   */<a name="line.7988"></a>
-<span class="sourceLineNo">7989</span>  private Result doCoprocessorPreCall(final Operation op, final Mutation mutation)<a name="line.7989"></a>
-<span class="sourceLineNo">7990</span>  throws IOException {<a name="line.7990"></a>
-<span class="sourceLineNo">7991</span>    Result result = null;<a name="line.7991"></a>
-<span class="sourceLineNo">7992</span>    if (this.coprocessorHost != null) {<a name="line.7992"></a>
-<span class="sourceLineNo">7993</span>      switch(op) {<a name="line.7993"></a>
-<span class="sourceLineNo">7994</span>        case INCREMENT:<a name="line.7994"></a>
-<span class="sourceLineNo">7995</span>          result = this.coprocessorHost.preIncrementAfterRowLock((Increment)mutation);<a name="line.7995"></a>
-<span class="sourceLineNo">7996</span>          break;<a name="line.7996"></a>
-<span class="sourceLineNo">7997</span>        case APPEND:<a name="line.7997"></a>
-<span class="sourceLineNo">7998</span>          result = this.coprocessorHost.preAppendAfterRowLock((Append)mutation);<a name="line.7998"></a>
-<span class="sourceLineNo">7999</span>          break;<a name="line.7999"></a>
-<span class="sourceLineNo">8000</span>        default: throw new UnsupportedOperationException(op.toString());<a name="line.8000"></a>
-<span class="sourceLineNo">8001</span>      }<a name="line.8001"></a>
-<span class="sourceLineNo">8002</span>    }<a name="line.8002"></a>
-<span class="sourceLineNo">8003</span>    return result;<a name="line.8003"></a>
-<span class="sourceLineNo">8004</span>  }<a name="line.8004"></a>
-<span class="sourceLineNo">8005</span><a name="line.8005"></a>
-<span class="sourceLineNo">8006</span>  /**<a name="line.8006"></a>
-<span class="sourceLineNo">8007</span>   * Reckon the Cells to apply to WAL, memstore, and to return to the Client; these Sets are not<a name="line.8007"></a>
-<span class="sourceLineNo">8008</span>   * always the same dependent on whether to write WAL.<a name="line.8008"></a>
-<span class="sourceLineNo">8009</span>   *<a name="line.8009"></a>
-<span class="sourceLineNo">8010</span>   * @param results Fill in here what goes back to the Client if it is non-null (if null, client<a name="line.8010"></a>
-<span class="sourceLineNo">8011</span>   *  doesn't want results).<a name="line.8011"></a>
-<span class="sourceLineNo">8012</span>   * @param forMemStore Fill in here what to apply to the MemStore (by Store).<a name="line.8012"></a>
-<span class="sourceLineNo">8013</span>   * @return A WALEdit to apply to WAL or null if we are to skip the WAL.<a name="line.8013"></a>
-<span class="sourceLineNo">8014</span>   */<a name="line.8014"></a>
-<span class="sourceLineNo">8015</span>  private WALEdit reckonDeltas(Operation op, Mutation mutation, Durability effectiveDurability,<a name="line.8015"></a>
-<span class="sourceLineNo">8016</span>      Map&lt;HStore, List&lt;Cell&gt;&gt; forMemStore, List&lt;Cell&gt; results) throws IOException {<a name="line.8016"></a>
-<span class="sourceLineNo">8017</span>    WALEdit walEdit = null;<a name="line.8017"></a>
-<span class="sourceLineNo">8018</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.8018"></a>
-<span class="sourceLineNo">8019</span>    final boolean writeToWAL = effectiveDurability != Durability.SKIP_WAL;<a name="line.8019"></a>
-<span class="sourceLineNo">8020</span>    // Process a Store/family at a time.<a name="line.8020"></a>
-<span class="sourceLineNo">8021</span>    for (Map.Entry&lt;byte [], List&lt;Cell&gt;&gt; entry: mutation.getFamilyCellMap().entrySet()) {<a name="line.8021"></a>
-<span class="sourceLineNo">8022</span>      final byte[] columnFamilyName = entry.getKey();<a name="line.8022"></a>
-<span class="sourceLineNo">8023</span>      List&lt;Cell&gt; deltas = entry.getValue();<a name="line.8023"></a>
-<span class="sourceLineNo">8024</span>      // Reckon for the Store what to apply to WAL and MemStore.<a name="line.8024"></a>
-<span class="sourceLineNo">8025</span>      List&lt;Cell&gt; toApply = reckonDeltasByStore(stores.get(columnFamilyName), op, mutation,<a name="line.8025"></a>
-<span class="sourceLineNo">8026</span>        effectiveDurability, now, deltas, results);<a name="line.8026"></a>
-<span class="sourceLineNo">8027</span>      if (!toApply.isEmpty()) {<a name="line.8027"></a>
-<span class="sourceLineNo">8028</span>        for (Cell cell : toApply) {<a name="line.8028"></a>
-<span class="sourceLineNo">8029</span>          HStore store = getStore(cell);<a name="line.8029"></a>
-<span class="sourceLineNo">8030</span>          if (store == null) {<a name="line.8030"></a>
-<span class="sourceLineNo">8031</span>            checkFamily(CellUtil.cloneFamily(cell));<a name="line.8031"></a>
-<span class="sourceLineNo">8032</span>          } else {<a name="line.8032"></a>
-<span class="sourceLineNo">8033</span>            forMemStore.computeIfAbsent(store, key -&gt; new ArrayList&lt;&gt;()).add(cell);<a name="line.8033"></a>
-<span class="sourceLineNo">8034</span>          }<a name="line.8034"></a>
-<span class="sourceLineNo">8035</span>        }<a name="line.8035"></a>
-<span class="sourceLineNo">8036</span>        if (writeToWAL) {<a name="line.8036"></a>
-<span class="sourceLineNo">8037</span>          if (walEdit == null) {<a name="line.8037"></a>
-<span class="sourceLineNo">8038</span>            walEdit = new WALEdit();<a name="line.8038"></a>
+<span class="sourceLineNo">7979</span>      writeEntry = walKey.getWriteEntry();<a name="line.7979"></a>
+<span class="sourceLineNo">7980</span>    } catch (IOException ioe) {<a name="line.7980"></a>
+<span class="sourceLineNo">7981</span>      if (walKey != null &amp;&amp; walKey.getWriteEntry() != null) {<a name="line.7981"></a>
+<span class="sourceLineNo">7982</span>        mvcc.complete(walKey.getWriteEntry());<a name="line.7982"></a>
+<span class="sourceLineNo">7983</span>      }<a name="line.7983"></a>
+<span class="sourceLineNo">7984</span>      throw ioe;<a name="line.7984"></a>
+<span class="sourceLineNo">7985</span>    }<a name="line.7985"></a>
+<span class="sourceLineNo">7986</span>    return writeEntry;<a name="line.7986"></a>
+<span class="sourceLineNo">7987</span>  }<a name="line.7987"></a>
+<span class="sourceLineNo">7988</span><a name="line.7988"></a>
+<span class="sourceLineNo">7989</span>  /**<a name="line.7989"></a>
+<span class="sourceLineNo">7990</span>   * Do coprocessor pre-increment or pre-append call.<a name="line.7990"></a>
+<span class="sourceLineNo">7991</span>   * @return Result returned out of the coprocessor, which means bypass all further processing and<a name="line.7991"></a>
+<span class="sourceLineNo">7992</span>   *  return the proffered Result instead, or null which means proceed.<a name="line.7992"></a>
+<span class="sourceLineNo">7993</span>   */<a name="line.7993"></a>
+<span class="sourceLineNo">7994</span>  private Result doCoprocessorPreCall(final Operation op, final Mutation mutation)<a name="line.7994"></a>
+<span class="sourceLineNo">7995</span>  throws IOException {<a name="line.7995"></a>
+<span class="sourceLineNo">7996</span>    Result result = null;<a name="line.7996"></a>
+<span class="sourceLineNo">7997</span>    if (this.coprocessorHost != null) {<a name="line.7997"></a>
+<span class="sourceLineNo">7998</span>      switch(op) {<a name="line.7998"></a>
+<span class="sourceLineNo">7999</span>        case INCREMENT:<a name="line.7999"></a>
+<span class="sourceLineNo">8000</span>          result = this.coprocessorHost.preIncrementAfterRowLock((Increment)mutation);<a name="line.8000"></a>
+<span class="sourceLineNo">8001</span>          break;<a name="line.8001"></a>
+<span class="sourceLineNo">8002</span>        case APPEND:<a name="line.8002"></a>
+<span class="sourceLineNo">8003</span>          result = this.coprocessorHost.preAppendAfterRowLock((Append)mutation);<a name="line.8003"></a>
+<span class="sourceLineNo">8004</span>          break;<a name="line.8004"></a>
+<span class="sourceLineNo">8005</span>        default: throw new UnsupportedOperationException(op.toString());<a name="line.8005"></a>
+<span class="sourceLineNo">8006</span>      }<a name="line.8006"></a>
+<span class="sourceLineNo">8007</span>    }<a name="line.8007"></a>
+<span class="sourceLineNo">8008</span>    return result;<a name="line.8008"></a>
+<span class="sourceLineNo">8009</span>  }<a name="line.8009"></a>
+<span class="sourceLineNo">8010</span><a name="line.8010"></a>
+<span class="sourceLineNo">8011</span>  /**<a name="line.8011"></a>
+<span class="sourceLineNo">8012</span>   * Reckon the Cells to apply to WAL, memstore, and to return to the Client; these Sets are not<a name="line.8012"></a>
+<span class="sourceLineNo">8013</span>   * always the same dependent on whether to write WAL.<a name="line.8013"></a>
+<span class="sourceLineNo">8014</span>   *<a name="line.8014"></a>
+<span class="sourceLineNo">8015</span>   * @param results Fill in here what goes back to the Client if it is non-null (if null, client<a name="line.8015"></a>
+<span class="sourceLineNo">8016</span>   *  doesn't want results).<a name="line.8016"></a>
+<span class="sourceLineNo">8017</span>   * @param forMemStore Fill in here what to apply to the MemStore (by Store).<a name="line.8017"></a>
+<span class="sourceLineNo">8018</span>   * @return A WALEdit to apply to WAL or null if we are to skip the WAL.<a name="line.8018"></a>
+<span class="sourceLineNo">8019</span>   */<a name="line.8019"></a>
+<span class="sourceLineNo">8020</span>  private WALEdit reckonDeltas(Operation op, Mutation mutation, Durability effectiveDurability,<a name="line.8020"></a>
+<span class="sourceLineNo">8021</span>      Map&lt;HStore, List&lt;Cell&gt;&gt; forMemStore, List&lt;Cell&gt; results) throws IOException {<a name="line.8021"></a>
+<span class="sourceLineNo">8022</span>    WALEdit walEdit = null;<a name="line.8022"></a>
+<span class="sourceLineNo">8023</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.8023"></a>
+<span class="sourceLineNo">8024</span>    final boolean writeToWAL = effectiveDurability != Durability.SKIP_WAL;<a name="line.8024"></a>
+<span class="sourceLineNo">8025</span>    // Process a Store/family at a time.<a name="line.8025"></a>
+<span class="sourceLineNo">8026</span>    for (Map.Entry&lt;byte [], List&lt;Cell&gt;&gt; entry: mutation.getFamilyCellMap().entrySet()) {<a name="line.8026"></a>
+<span class="sourceLineNo">8027</span>      final byte[] columnFamilyName = entry.getKey();<a name="line.8027"></a>
+<span class="sourceLineNo">8028</span>      List&lt;Cell&gt; deltas = entry.getValue();<a name="line.8028"></a>
+<span class="sourceLineNo">8029</span>      // Reckon for the Store what to apply to WAL and MemStore.<a name="line.8029"></a>
+<span class="sourceLineNo">8030</span>      List&lt;Cell&gt; toApply = reckonDeltasByStore(stores.get(columnFamilyName), op, mutation,<a name="line.8030"></a>
+<span class="sourceLineNo">8031</span>        effectiveDurability, now, deltas, results);<a name="line.8031"></a>
+<span class="sourceLineNo">8032</span>      if (!toApply.isEmpty()) {<a name="line.8032"></a>
+<span class="sourceLineNo">8033</span>        for (Cell cell : toApply) {<a name="line.8033"></a>
+<span class="sourceLineNo">8034</span>          HStore store = getStore(cell);<a name="line.8034"></a>
+<span class="sourceLineNo">8035</span>          if (store == null) {<a name="line.8035"></a>
+<span class="sourceLineNo">8036</span>            checkFamily(CellUtil.cloneFamily(cell));<a name="line.8036"></a>
+<span class="sourceLineNo">8037</span>          } else {<a name="line.8037"></a>
+<span class="sourceLineNo">8038</span>            forMemStore.computeIfAbsent(store, key -&gt; new ArrayList&lt;&gt;()).add(cell);<a name="line.8038"></a>
 <span class="sourceLineNo">8039</span>          }<a name="line.8039"></a>
-<span class="sourceLineNo">8040</span>          walEdit.getCells().addAll(toApply);<a name="line.8040"></a>
-<span class="sourceLineNo">8041</span>        }<a name="line.8041"></a>
-<span class="sourceLineNo">8042</span>      }<a name="line.8042"></a>
-<span class="sourceLineNo">8043</span>    }<a name="line.8043"></a>
-<span class="sourceLineNo">8044</span>    return walEdit;<a name="line.8044"></a>
-<span class="sourceLineNo">8045</span>  }<a name="line.8045"></a>
-<span class="sourceLineNo">8046</span><a name="line.8046"></a>
-<span class="sourceLineNo">8047</span>  /**<a name="line.8047"></a>
-<span class="sourceLineNo">8048</span>   * Reckon the Cells to apply to WAL, memstore, and to return to the Client in passed<a name="line.8048"></a>
-<span class="sourceLineNo">8049</span>   * column family/Store.<a name="line.8049"></a>
-<span class="sourceLineNo">8050</span>   *<a name="line.8050"></a>
-<span class="sourceLineNo">8051</span>   * Does Get of current value and then adds passed in deltas for this Store returning the result.<a name="line.8051"></a>
-<span class="sourceLineNo">8052</span>   *<a name="line.8052"></a>
-<span class="sourceLineNo">8053</span>   * @param op Whether Increment or Append<a name="line.8053"></a>
-<span class="sourceLineNo">8054</span>   * @param mutation The encompassing Mutation object<a name="line.8054"></a>
-<span class="sourceLineNo">8055</span>   * @param deltas Changes to apply to this Store; either increment amount or data to append<a name="line.8055"></a>
-<span class="sourceLineNo">8056</span>   * @param results In here we accumulate all the Cells we are to return to the client. If null,<a name="line.8056"></a>
-<span class="sourceLineNo">8057</span>   *                client doesn't want results returned.<a name="line.8057"></a>
-<span class="sourceLineNo">8058</span>   * @return Resulting Cells after &lt;code&gt;deltas&lt;/code&gt; have been applied to current<a name="line.8058"></a>
-<span class="sourceLineNo">8059</span>   *  values. Side effect is our filling out of the &lt;code&gt;results&lt;/code&gt; List.<a name="line.8059"></a>
-<span class="sourceLineNo">8060</span>   */<a name="line.8060"></a>
-<span class="sourceLineNo">8061</span>  private List&lt;Cell&gt; reckonDeltasByStore(HStore store, Operation op, Mutation mutation,<a name="line.8061"></a>
-<span class="sourceLineNo">8062</span>      Durability effectiveDurability, long now, List&lt;Cell&gt; deltas, List&lt;Cell&gt; results)<a name="line.8062"></a>
-<span class="sourceLineNo">8063</span>      throws IOException {<a name="line.8063"></a>
-<span class="sourceLineNo">8064</span>    byte[] columnFamily = store.getColumnFamilyDescriptor().getName();<a name="line.8064"></a>
-<span class="sourceLineNo">8065</span>    List&lt;Pair&lt;Cell, Cell&gt;&gt; cellPairs = new ArrayList&lt;&gt;(deltas.size());<a name="line.8065"></a>
-<span class="sourceLineNo">8066</span>    // Get previous values for all columns in this family.<a name="line.8066"></a>
-<span class="sourceLineNo">8067</span>    TimeRange tr = null;<a name="line.8067"></a>
-<span class="sourceLineNo">8068</span>    switch (op) {<a name="line.8068"></a>
-<span class="sourceLineNo">8069</span>      case INCREMENT:<a name="line.8069"></a>
-<span class="sourceLineNo">8070</span>        tr = ((Increment)mutation).getTimeRange();<a name="line.8070"></a>
-<span class="sourceLineNo">8071</span>        break;<a name="line.8071"></a>
-<span class="sourceLineNo">8072</span>      case APPEND:<a name="line.8072"></a>
-<span class="sourceLineNo">8073</span>        tr = ((Append)mutation).getTimeRange();<a name="line.8073"></a>
-<span class="sourceLineNo">8074</span>        break;<a name="line.8074"></a>
-<span class="sourceLineNo">8075</span>      default:<a name="line.8075"></a>
+<span class="sourceLineNo">8040</span>        }<a name="line.8040"></a>
+<span class="sourceLineNo">8041</span>        if (writeToWAL) {<a name="line.8041"></a>
+<span class="sourceLineNo">8042</span>          if (walEdit == null) {<a name="line.8042"></a>
+<span class="sourceLineNo">8043</span>            walEdit = new WALEdit();<a name="line.8043"></a>
+<span class="sourceLineNo">8044</span>          }<a name="line.8044"></a>
+<span class="sourceLineNo">8045</span>          walEdit.getCells().addAll(toApply);<a name="line.8045"></a>
+<span class="sourceLineNo">8046</span>        }<a name="line.8046"></a>
+<span class="sourceLineNo">8047</span>      }<a name="line.8047"></a>
+<span class="sourceLineNo">8048</span>    }<a name="line.8048"></a>
+<span class="sourceLineNo">8049</span>    return walEdit;<a name="line.8049"></a>
+<span class="sourceLineNo">8050</span>  }<a name="line.8050"></a>
+<span class="sourceLineNo">8051</span><a name="line.8051"></a>
+<span class="sourceLineNo">8052</span>  /**<a name="line.8052"></a>
+<span class="sourceLineNo">8053</span>   * Reckon the Cells to apply to WAL, memstore, and to return to the Client in passed<a name="line.8053"></a>
+<span class="sourceLineNo">8054</span>   * column family/Store.<a name="line.8054"></a>
+<span class="sourceLineNo">8055</span>   *<a name="line.8055"></a>
+<span class="sourceLineNo">8056</span>   * Does Get of current value and then adds passed in deltas for this Store returning the result.<a name="line.8056"></a>
+<span class="sourceLineNo">8057</span>   *<a name="line.8057"></a>
+<span class="sourceLineNo">8058</span>   * @param op Whether Increment or Append<a name="line.8058"></a>
+<span class="sourceLineNo">8059</span>   * @param mutation The encompassing Mutation object<a name="line.8059"></a>
+<span class="sourceLineNo">8060</span>   * @param deltas Changes to apply to this Store; either increment amount or data to append<a name="line.8060"></a>
+<span class="sourceLineNo">8061</span>   * @param results In here we accumulate all the Cells we are to return to the client. If null,<a name="line.8061"></a>
+<span class="sourceLineNo">8062</span>   *                client doesn't want results returned.<a name="line.8062"></a>
+<span class="sourceLineNo">8063</span>   * @return Resulting Cells after &lt;code&gt;deltas&lt;/code&gt; have been applied to current<a name="line.8063"></a>
+<span class="sourceLineNo">8064</span>   *  values. Side effect is our filling out of the &lt;code&gt;results&lt;/code&gt; List.<a name="line.8064"></a>
+<span class="sourceLineNo">8065</span>   */<a name="line.8065"></a>
+<span class="sourceLineNo">8066</span>  private List&lt;Cell&gt; reckonDeltasByStore(HStore store, Operation op, Mutation mutation,<a name="line.8066"></a>
+<span class="sourceLineNo">8067</span>      Durability effectiveDurability, long now, List&lt;Cell&gt; deltas, List&lt;Cell&gt; results)<a name="line.8067"></a>
+<span class="sourceLineNo">8068</span>      throws IOException {<a name="line.8068"></a>
+<span class="sourceLineNo">8069</span>    byte[] columnFamily = store.getColumnFamilyDescriptor().getName();<a name="line.8069"></a>
+<span class="sourceLineNo">8070</span>    List&lt;Pair&lt;Cell, Cell&gt;&gt; cellPairs = new ArrayList&lt;&gt;(deltas.size());<a name="line.8070"></a>
+<span class="sourceLineNo">8071</span>    // Get previous values for all columns in this family.<a name="line.8071"></a>
+<span class="sourceLineNo">8072</span>    TimeRange tr = null;<a name="line.8072"></a>
+<span class="sourceLineNo">8073</span>    switch (op) {<a name="line.8073"></a>
+<span class="sourceLineNo">8074</span>      case INCREMENT:<a name="line.8074"></a>
+<span class="sourceLineNo">8075</span>        tr = ((Increment)mutation).getTimeRange();<a name="line.8075"></a>
 <span class="sourceLineNo">8076</span>        break;<a name="line.8076"></a>
-<span class="sourceLineNo">8077</span>    }<a name="line.8077"></a>
-<span class="sourceLineNo">8078</span>    List&lt;Cell&gt; currentValues = get(mutation, store, deltas,null, tr);<a name="line.8078"></a>
-<span class="sourceLineNo">8079</span>    // Iterate the input columns and update existing values if they were found, otherwise<a name="line.8079"></a>
-<span class="sourceLineNo">8080</span>    // add new column initialized to the delta amount<a name="line.8080"></a>
-<span class="sourceLineNo">8081</span>    int currentValuesIndex = 0;<a name="line.8081"></a>
-<span class="sourceLineNo">8082</span>    for (int i = 0; i &lt; deltas.size(); i++) {<a name="line.8082"></a>
-<span class="sourceLineNo">8083</span>      Cell delta = deltas.get(i);<a name="line.8083"></a>
-<span class="sourceLineNo">8084</span>      Cell currentValue = null;<a name="line.8084"></a>
-<span class="sourceLineNo">8085</span>      if (currentValuesIndex &lt; currentValues.size() &amp;&amp;<a name="line.8085"></a>
-<span class="sourceLineNo">8086</span>          CellUtil.matchingQualifier(currentValues.get(currentValuesIndex), delta)) {<a name="line.8086"></a>
-<span class="sourceLineNo">8087</span>        currentValue = currentValues.get(currentValuesIndex);<a name="line.8087"></a>
-<span class="sourceLineNo">8088</span>        if (i &lt; (deltas.size() - 1) &amp;&amp; !CellUtil.matchingQualifier(delta, deltas.get(i + 1))) {<a name="line.8088"></a>
-<span class="sourceLineNo">8089</span>          currentValuesIndex++;<a name="line.8089"></a>
-<span class="sourceLineNo">8090</span>        }<a name="line.8090"></a>
-<span class="sourceLineNo">8091</span>      }<a name="line.8091"></a>
-<span class="sourceLineNo">8092</span><a name="line.8092"></a>
-<span class="sourceLineNo">8093</span>      // Switch on whether this an increment or an append building the new Cell to apply.<a name="line.8093"></a>
-<span class="sourceLineNo">8094</span>      Cell newCell = null;<a name="line.8094"></a>
-<span class="sourceLineNo">8095</span>      switch (op) {<a name="line.8095"></a>
-<span class="sourceLineNo">8096</span>        case INCREMENT:<a name="line.8096"></a>
-<span class="sourceLineNo">8097</span>          long deltaAmount = getLongValue(delta);<a name="line.8097"></a>
-<span class="sourceLineNo">8098</span>          final long newValue = currentValue == null ? deltaAmount : getLongValue(currentValue) + deltaAmount;<a name="line.8098"></a>
-<span class="sourceLineNo">8099</span>          newCell = reckonDelta(delta, currentValue, columnFamily, now, mutation, (oldCell) -&gt; Bytes.toBytes(newValue));<a name="line.8099"></a>
-<span class="sourceLineNo">8100</span>          break;<a name="line.8100"></a>
-<span class="sourceLineNo">8101</span>        case APPEND:<a name="line.8101"></a>
-<span class="sourceLineNo">8102</span>          newCell = reckonDelta(delta, currentValue, columnFamily, now, mutation, (oldCell) -&gt;<a name="line.8102"></a>
-<span class="sourceLineNo">8103</span>            ByteBuffer.wrap(new byte[delta.getValueLength() + oldCell.getValueLength()])<a name="line.8103"></a>
-<span class="sourceLineNo">8104</span>                    .put(oldCell.getValueArray(), oldCell.getValueOffset(), oldCell.getValueLength())<a name="line.8104"></a>
-<span class="sourceLineNo">8105</span>                    .put(delta.getValueArray(), delta.getValueOffset(), delta.getValueLength())<a name="line.8105"></a>
-<span class="sourceLineNo">8106</span>                    .array()<a name="line.8106"></a>
-<span class="sourceLineNo">8107</span>          );<a name="line.8107"></a>
-<span class="sourceLineNo">8108</span>          break;<a name="line.8108"></a>
-<span class="sourceLineNo">8109</span>        default: throw new UnsupportedOperationException(op.toString());<a name="line.8109"></a>
-<span class="sourceLineNo">8110</span>      }<a name="line.8110"></a>
-<span class="sourceLineNo">8111</span>      int newCellSize = PrivateCellUtil.estimatedSerializedSizeOf(newCell);<a name="line.8111"></a>
-<span class="sourceLineNo">8112</span>      if (newCellSize &gt; this.maxCellSize) {<a name="line.8112"></a>
-<span class="sourceLineNo">8113</span>        String msg = "Cell with size " + newCellSize + " exceeds limit of " +<a name="line.8113"></a>
-<span class="sourceLineNo">8114</span>            this.maxCellSize + " bytes";<a name="line.8114"></a>
-<span class="sourceLineNo">8115</span>        if (LOG.isDebugEnabled()) {<a name="line.8115"></a>
-<span class="sourceLineNo">8116</span>          LOG.debug(msg);<a name="line.8116"></a>
-<span class="sourceLineNo">8117</span>        }<a name="line.8117"></a>
-<span class="sourceLineNo">8118</span>        throw new DoNotRetryIOException(msg);<a name="line.8118"></a>
-<span class="sourceLineNo">8119</span>      }<a name="line.8119"></a>
-<span class="sourceLineNo">8120</span>      cellPairs.add(new Pair&lt;&gt;(currentValue, newCell));<a name="line.8120"></a>
-<span class="sourceLineNo">8121</span>      // Add to results to get returned to the Client. If null, cilent does not want results.<a name="line.8121"></a>
-<span class="sourceLineNo">8122</span>      if (results != null) {<a name="line.8122"></a>
-<span class="sourceLineNo">8123</span>        results.add(newCell);<a name="line.8123"></a>
+<span class="sourceLineNo">8077</span>      case APPEND:<a name="line.8077"></a>
+<span class="sourceLineNo">8078</span>        tr = ((Append)mutation).getTimeRange();<a name="line.8078"></a>
+<span class="sourceLineNo">8079</span>        break;<a name="line.8079"></a>
+<span class="sourceLineNo">8080</span>      default:<a name="line.8080"></a>
+<span class="sourceLineNo">8081</span>        break;<a name="line.8081"></a>
+<span class="sourceLineNo">8082</span>    }<a name="line.8082"></a>
+<span class="sourceLineNo">8083</span>    List&lt;Cell&gt; currentValues = get(mutation, store, deltas,null, tr);<a name="line.8083"></a>
+<span class="sourceLineNo">8084</span>    // Iterate the input columns and update existing values if they were found, otherwise<a name="line.8084"></a>
+<span class="sourceLineNo">8085</span>    // add new column initialized to the delta amount<a name="line.8085"></a>
+<span class="sourceLineNo">8086</span>    int currentValuesIndex = 0;<a name="line.8086"></a>
+<span class="sourceLineNo">8087</span>    for (int i = 0; i &lt; deltas.size(); i++) {<a name="line.8087"></a>
+<span class="sourceLineNo">8088</span>      Cell delta = deltas.get(i);<a name="line.8088"></a>
+<span class="sourceLineNo">8089</span>      Cell currentValue = null;<a name="line.8089"></a>
+<span class="sourceLineNo">8090</span>      if (currentValuesIndex &lt; currentValues.size() &amp;&amp;<a name="line.8090"></a>
+<span class="sourceLineNo">8091</span>          CellUtil.matchingQualifier(currentValues.get(currentValuesIndex), delta)) {<a name="line.8091"></a>
+<span class="sourceLineNo">8092</span>        currentValue = currentValues.get(currentValuesIndex);<a name="line.8092"></a>
+<span class="sourceLineNo">8093</span>        if (i &lt; (deltas.size() - 1) &amp;&amp; !CellUtil.matchingQualifier(delta, deltas.get(i + 1))) {<a name="line.8093"></a>
+<span class="sourceLineNo">8094</span>          currentValuesIndex++;<a name="line.8094"></a>
+<span class="sourceLineNo">8095</span>        }<a name="line.8095"></a>
+<span class="sourceLineNo">8096</span>      }<a name="line.8096"></a>
+<span class="sourceLineNo">8097</span><a name="line.8097"></a>
+<span class="sourceLineNo">8098</span>      // Switch on whether this an increment or an append building the new Cell to apply.<a name="line.8098"></a>
+<span class="sourceLineNo">8099</span>      Cell newCell = null;<a name="line.8099"></a>
+<span class="sourceLineNo">8100</span>      switch (op) {<a name="line.8100"></a>
+<span class="sourceLineNo">8101</span>        case INCREMENT:<a name="line.8101"></a>
+<span class="sourceLineNo">8102</span>          long deltaAmount = getLongValue(delta);<a name="line.8102"></a>
+<span class="sourceLineNo">8103</span>          final long newValue = currentValue == null ? deltaAmount : getLongValue(currentValue) + deltaAmount;<a name="line.8103"></a>
+<span class="sourceLineNo">8104</span>          newCell = reckonDelta(delta, currentValue, columnFamily, now, mutation, (oldCell) -&gt; Bytes.toBytes(newValue));<a name="line.8104"></a>
+<span class="sourceLineNo">8105</span>          break;<a name="line.8105"></a>
+<span class="sourceLineNo">8106</span>        case APPEND:<a name="line.8106"></a>
+<span class="sourceLineNo">8107</span>          newCell = reckonDelta(delta, currentValue, columnFamily, now, mutation, (oldCell) -&gt;<a name="line.8107"></a>
+<span class="sourceLineNo">8108</span>            ByteBuffer.wrap(new byte[delta.getValueLength() + oldCell.getValueLength()])<a name="line.8108"></a>
+<span class="sourceLineNo">8109</span>                    .put(oldCell.getValueArray(), oldCell.getValueOffset(), oldCell.getValueLength())<a name="line.8109"></a>
+<span class="sourceLineNo">8110</span>                    .put(delta.getValueArray(), delta.getValueOffset(), delta.getValueLength())<a name="line.8110"></a>
+<span class="sourceLineNo">8111</span>                    .array()<a name="line.8111"></a>
+<span class="sourceLineNo">8112</span>          );<a name="line.8112"></a>
+<span class="sourceLineNo">8113</span>          break;<a name="line.8113"></a>
+<span class="sourceLineNo">8114</span>        default: throw new UnsupportedOperationException(op.toString());<a name="line.8114"></a>
+<span class="sourceLineNo">8115</span>      }<a name="line.8115"></a>
+<span class="sourceLineNo">8116</span>      int newCellSize = PrivateCellUtil.estimatedSerializedSizeOf(newCell);<a name="line.8116"></a>
+<span class="sourceLineNo">8117</span>      if (newCellSize &gt; this.maxCellSize) {<a name="line.8117"></a>
+<span class="sourceLineNo">8118</span>        String msg = "Cell with size " + newCellSize + " exceeds limit of " +<a name="line.8118"></a>
+<span class="sourceLineNo">8119</span>            this.maxCellSize + " bytes";<a name="line.8119"></a>
+<span class="sourceLineNo">8120</span>        if (LOG.isDebugEnabled()) {<a name="line.8120"></a>
+<span class="sourceLineNo">8121</span>          LOG.debug(msg);<a name="line.8121"></a>
+<span class="sourceLineNo">8122</span>        }<a name="line.8122"></a>
+<span class="sourceLineNo">8123</span>        throw new DoNotRetryIOException(msg);<a name="line.8123"></a>
 <span class="sourceLineNo">8124</span>      }<a name="line.8124"></a>
-<span class="sourceLineNo">8125</span>    }<a name="line.8125"></a>
-<span class="sourceLineNo">8126</span><a name="line.8126"></a>
-<span class="sourceLineNo">8127</span>    // Give coprocessors a chance to update the new cells before apply to WAL or memstore<a name="line.8127"></a>
-<span class="sourceLineNo">8128</span>    if (coprocessorHost != null) {<a name="line.8128"></a>
-<span class="sourceLineNo">8129</span>      // Here the operation must be increment or append.<a name="line.8129"></a>
-<span class="sourceLineNo">8130</span>      cellPairs = op == Operation.INCREMENT ?<a name="line.8130"></a>
-<span class="sourceLineNo">8131</span>          coprocessorHost.postIncrementBeforeWAL(mutation, cellPairs) :<a name="line.8131"></a>
-<span class="sourceLineNo">8132</span>          coprocessorHost.postAppendBeforeWAL(mutation, cellPairs);<a name="line.8132"></a>
-<span class="sourceLineNo">8133</span>    }<a name="line.8133"></a>
-<span class="sourceLineNo">8134</span>    return cellPairs.stream().map(Pair::getSecond).collect(Collectors.toList());<a name="line.8134"></a>
-<span class="sourceLineNo">8135</span>  }<a name="line.8135"></a>
-<span class="sourceLineNo">8136</span><a name="line.8136"></a>
-<span class="sourceLineNo">8137</span>  private static Cell reckonDelta(final Cell delta, final Cell currentCell,<a name="line.8137"></a>
-<span class="sourceLineNo">8138</span>                                  final byte[] columnFamily, final long now,<a name="line.8138"></a>
-<span class="sourceLineNo">8139</span>                                  Mutation mutation, Function&lt;Cell, byte[]&gt; supplier) throws IOException {<a name="line.8139"></a>
-<span class="sourceLineNo">8140</span>    // Forward any tags found on the delta.<a name="line.8140"></a>
-<span class="sourceLineNo">8141</span>    List&lt;Tag&gt; tags = TagUtil.carryForwardTags(delta);<a name="line.8141"></a>
-<span class="sourceLineNo">8142</span>    tags = TagUtil.carryForwardTTLTag(tags, mutation.getTTL());<a name="line.8142"></a>
-<span class="sourceLineNo">8143</span>    if (currentCell != null) {<a name="line.8143"></a>
-<span class="sourceLineNo">8144</span>      tags = TagUtil.carryForwardTags(tags, currentCell);<a name="line.8144"></a>
-<span class="sourceLineNo">8145</span>      byte[] newValue = supplier.apply(currentCell);<a name="line.8145"></a>
-<span class="sourceLineNo">8146</span>      return ExtendedCellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.8146"></a>
-<span class="sourceLineNo">8147</span>              .setRow(mutation.getRow(), 0, mutation.getRow().length)<a name="line.8147"></a>
-<span class="sourceLineNo">8148</span>              .setFamily(columnFamily, 0, columnFamily.length)<a name="line.8148"></a>
-<span class="sourceLineNo">8149</span>              // copy the qualifier if the cell is located in shared memory.<a name="line.8149"></a>
-<span class="sourceLineNo">8150</span>              .setQualifier(CellUtil.cloneQualifier(delta))<a name="line.8150"></a>
-<span class="sourceLineNo">8151</span>              .setTimestamp(Math.max(currentCell.getTimestamp() + 1, now))<a name="line.8151"></a>
-<span class="sourceLineNo">8152</span>              .setType(KeyValue.Type.Put.getCode())<a name="line.8152"></a>
-<span class="sourceLineNo">8153</span>              .setValue(newValue, 0, newValue.length)<a name="line.8153"></a>
-<span class="sourceLineNo">8154</span>              .setTags(TagUtil.fromList(tags))<a name="line.8154"></a>
-<span class="sourceLineNo">8155</span>              .build();<a name="line.8155"></a>
-<span class="sourceLineNo">8156</span>    } else {<a name="line.8156"></a>
-<span class="sourceLineNo">8157</span>      PrivateCellUtil.updateLatestStamp(delta, now);<a name="line.8157"></a>
-<span class="sourceLineNo">8158</span>      return CollectionUtils.isEmpty(tags) ? delta : PrivateCellUtil.createCell(delta, tags);<a name="line.8158"></a>
-<span class="sourceLineNo">8159</span>    }<a name="line.8159"></a>
-<span class="sourceLineNo">8160</span>  }<a name="line.8160"></a>
-<span class="sourceLineNo">8161</span><a name="line.8161"></a>
-<span class="sourceLineNo">8162</span>  /**<a name="line.8162"></a>
-<span class="sourceLineNo">8163</span>   * @return Get the long out of the passed in Cell<a name="line.8163"></a>
-<span class="sourceLineNo">8164</span>   */<a name="line.8164"></a>
-<span class="sourceLineNo">8165</span>  private static long getLongValue(final Cell cell) throws DoNotRetryIOException {<a name="line.8165"></a>
-<span class="sourceLineNo">8166</span>    int len = cell.getValueLength();<a name="line.8166"></a>
-<span class="sourceLineNo">8167</span>    if (len != Bytes.SIZEOF_LONG) {<a name="line.8167"></a>
-<span class="sourceLineNo">8168</span>      // throw DoNotRetryIOException instead of IllegalArgumentException<a name="line.8168"></a>
-<span class="sourceLineNo">8169</span>      throw new DoNotRetryIOException("Field is not a long, it's " + len + " bytes wide");<a name="line.8169"></a>
-<span class="sourceLineNo">8170</span>    }<a name="line.8170"></a>
-<span class="sourceLineNo">8171</span>    return PrivateCellUtil.getValueAsLong(cell);<a name="line.8171"></a>
-<span class="sourceLineNo">8172</span>  }<a name="line.8172"></a>
-<span class="sourceLineNo">8173</span><a name="line.8173"></a>
-<span class="sourceLineNo">8174</span>  /**<a name="line.8174"></a>
-<span class="sourceLineNo">8175</span>   * Do a specific Get on passed &lt;code&gt;columnFamily&lt;/code&gt; and column qualifiers.<a name="line.8175"></a>
-<span class="sourceLineNo">8176</span>   * @param mutation Mutation we are doing this Get for.<a name="line.8176"></a>
-<span class="sourceLineNo">8177</span>   * @param store Which column family on row (TODO: Go all Gets in one go)<a name="line.8177"></a>
-<span class="sourceLineNo">8178</span>   * @param coordinates Cells from &lt;code&gt;mutation&lt;/code&gt; used as coordinates applied to Get.<a name="line.8178"></a>
-<span class="sourceLineNo">8179</span>   * @return Return list of Cells found.<a name="line.8179"></a>
-<span class="sourceLineNo">8180</span>   */<a name="line.8180"></a>
-<span class="sourceLineNo">8181</span>  private List&lt;Cell&gt; get(Mutation mutation, HStore store, List&lt;Cell&gt; coordinates,<a name="line.8181"></a>
-<span class="sourceLineNo">8182</span>      IsolationLevel isolation, TimeRange tr) throws IOException {<a name="line.8182"></a>
-<span class="sourceLineNo">8183</span>    // Sort the cells so that they match the order that they appear in the Get results. Otherwise,<a name="line.8183"></a>
-<span class="sourceLineNo">8184</span>    // we won't be able to find the existing values if the cells are not specified in order by the<a name="line.8184"></a>
-<span class="sourceLineNo">8185</span>    // client since cells are in an array list.<a name="line.8185"></a>
-<span class="sourceLineNo">8186</span>    // TODO: I don't get why we are sorting. St.Ack 20150107<a name="line.8186"></a>
-<span class="sourceLineNo">8187</span>    sort(coordinates, store.getComparator());<a name="line.8187"></a>
-<span class="sourceLineNo">8188</span>    Get get = new Get(mutation.getRow());<a name="line.8188"></a>
-<span class="sourceLineNo">8189</span>    if (isolation != null) {<a name="line.8189"></a>
-<span class="sourceLineNo">8190</span>      get.setIsolationLevel(isolation);<a name="line.8190"></a>
-<span class="sourceLineNo">8191</span>    }<a name="line.8191"></a>
-<span class="sourceLineNo">8192</span>    for (Cell cell: coordinates) {<a name="line.8192"></a>
-<span class="sourceLineNo">8193</span>      get.addColumn(store.getColumnFamilyDescriptor().getName(), CellUtil.cloneQualifier(cell));<a name="line.8193"></a>
-<span class="sourceLineNo">8194</span>    }<a name="line.8194"></a>
-<span class="sourceLineNo">8195</span>    // Increments carry time range. If an Increment instance, put it on the Get.<a name="line.8195"></a>
-<span class="sourceLineNo">8196</span>    if (tr != null) {<a name="line.8196"></a>
-<span class="sourceLineNo">8197</span>      get.setTimeRange(tr.getMin(), tr.getMax());<a name="line.8197"></a>
-<span class="sourceLineNo">8198</span>    }<a name="line.8198"></a>
-<span class="sourceLineNo">8199</span>    return get(get, false);<a name="line.8199"></a>
-<span class="sourceLineNo">8200</span>  }<a name="line.8200"></a>
-<span class="sourceLineNo">8201</span><a name="line.8201"></a>
-<span class="sourceLineNo">8202</span>  /**<a name="line.8202"></a>
-<span class="sourceLineNo">8203</span>   * @return Sorted list of &lt;code&gt;cells&lt;/code&gt; using &lt;code&gt;comparator&lt;/code&gt;<a name="line.8203"></a>
-<span class="sourceLineNo">8204</span>   */<a name="line.8204"></a>
-<span class="sourceLineNo">8205</span>  private static List&lt;Cell&gt; sort(List&lt;Cell&gt; cells, final CellComparator comparator) {<a name="line.8205"></a>
-<span class="sourceLineNo">8206</span>    cells.sort(comparator);<a name="line.8206"></a>
-<span class="sourceLineNo">8207</span>    return cells;<a name="line.8207"></a>
-<span class="sourceLineNo">8208</span>  }<a name="line.8208"></a>
-<span class="sourceLineNo">8209</span><a name="line.8209"></a>
-<span class="sourceLineNo">8210</span>  public static final long FIXED_OVERHEAD = ClassSize.align(<a name="line.8210"></a>
-<span class="sourceLineNo">8211</span>      ClassSize.OBJECT +<a name="line.8211"></a>
-<span class="sourceLineNo">8212</span>      ClassSize.ARRAY +<a name="line.8212"></a>
-<span class="sourceLineNo">8213</span>      55 * ClassSize.REFERENCE + 3 * Bytes.SIZEOF_INT +<a name="line.8213"></a>
-<span class="sourceLineNo">8214</span>      (15 * Bytes.SIZEOF_LONG) +<a name="line.8214"></a>
-<span class="sourceLineNo">8215</span>      3 * Bytes.SIZEOF_BOOLEAN);<a name="line.8215"></a>
-<span class="sourceLineNo">8216</span><a name="line.8216"></a>
-<span class="sourceLineNo">8217</span>  // woefully out of date - currently missing:<a name="line.8217"></a>
-<span class="sourceLineNo">8218</span>  // 1 x HashMap - coprocessorServiceHandlers<a name="line.8218"></a>
-<span class="sourceLineNo">8219</span>  // 6 x LongAdder - numMutationsWithoutWAL, dataInMemoryWithoutWAL,<a name="line.8219"></a>
-<span class="sourceLineNo">8220</span>  //   checkAndMutateChecksPassed, checkAndMutateChecksFailed, readRequestsCount,<a name="line.8220"></a>
-<span class="sourceLineNo">8221</span>  //   writeRequestsCount, cpRequestsCount<a name="line.8221"></a>
-<span class="sourceLineNo">8222</span>  // 1 x HRegion$WriteState - writestate<a name="line.8222"></a>
-<span class="sourceLineNo">8223</span>  // 1 x RegionCoprocessorHost - coprocessorHost<a name="line.8223"></a>
-<span class="sourceLineNo">8224</span>  // 1 x RegionSplitPolicy - splitPolicy<a name="line.8224"></a>
-<span class="sourceLineNo">8225</span>  // 1 x MetricsRegion - metricsRegion<a name="line.8225"></a>
-<span class="sourceLineNo">8226</span>  // 1 x MetricsRegionWrapperImpl - metricsRegionWrapper<a name="line.8226"></a>
-<span class="sourceLineNo">8227</span>  public static final long DEEP_OVERHEAD = FIXED_OVERHEAD +<a name="line.8227"></a>
-<span class="sourceLineNo">8228</span>      ClassSize.OBJECT + // closeLock<a name="line.8228"></a>
-<span class="sourceLineNo">8229</span>      (2 * ClassSize.ATOMIC_BOOLEAN) + // closed, closing<a name="line.8229"></a>
-<span class="sourceLineNo">8230</span>      (3 * ClassSize.ATOMIC_LONG) + // numPutsWithoutWAL, dataInMemoryWithoutWAL,<a name="line.8230"></a>
-<span class="sourceLineNo">8231</span>                                    // compactionsFailed<a name="line.8231"></a>
-<span class="sourceLineNo">8232</span>      (2 * ClassSize.CONCURRENT_HASHMAP) +  // lockedRows, scannerReadPoints<a name="line.8232"></a>
-<span class="sourceLineNo">8233</span>      WriteState.HEAP_SIZE + // writestate<a name="line.8233"></a>
-<span class="sourceLineNo">8234</span>      ClassSize.CONCURRENT_SKIPLISTMAP + ClassSize.CONCURRENT_SKIPLISTMAP_ENTRY + // stores<a name="line.8234"></a>
-<span class="sourceLineNo">8235</span>      (2 * ClassSize.REENTRANT_LOCK) + // lock, updatesLock<a name="line.8235"></a>
-<span class="sourceLineNo">8236</span>      MultiVersionConcurrencyControl.FIXED_SIZE // mvcc<a name="line.8236"></a>
-<span class="sourceLineNo">8237</span>      + 2 * ClassSize.TREEMAP // maxSeqIdInStores, replicationScopes<a name="line.8237"></a>
-<span class="sourceLineNo">8238</span>      + 2 * ClassSize.ATOMIC_INTEGER // majorInProgress, minorInProgress<a name="line.8238"></a>
-<span class="sourceLineNo">8239</span>      + ClassSize.STORE_SERVICES // store services<a name="line.8239"></a>
-<span class="sourceLineNo">8240</span>      + StoreHotnessProtector.FIXED_SIZE<a name="line.8240"></a>
-<span class="sourceLineNo">8241</span>      ;<a name="line.8241"></a>
-<span class="sourceLineNo">8242</span><a name="line.8242"></a>
-<span class="sourceLineNo">8243</span>  @Override<a name="line.8243"></a>
-<span class="sourceLineNo">8244</span>  public long heapSize() {<a name="line.8244"></a>
-<span class="sourceLineNo">8245</span>    // this does not take into account row locks, recent flushes, mvcc entries, and more<a name="line.8245"></a>
-<span class="sourceLineNo">8246</span>    return DEEP_OVERHEAD + stores.values().stream().mapToLong(HStore::heapSize).sum();<a name="line.8246"></a>
-<span class="sourceLineNo">8247</span>  }<a name="line.8247"></a>
-<span class="sourceLineNo">8248</span><a name="line.8248"></a>
-<span class="sourceLineNo">8249</span>  /**<a name="line.8249"></a>
-<span class="sourceLineNo">8250</span>   * Registers a new protocol buffer {@link Service} subclass as a coprocessor endpoint to<a name="line.8250"></a>
-<span class="sourceLineNo">8251</span>   * be available for handling Region#execService(com.google.protobuf.RpcController,<a name="line.8251"></a>
-<span class="sourceLineNo">8252</span>   *    org.apache.hadoop.hbase.protobuf.generated.ClientProtos.CoprocessorServiceCall) calls.<a name="line.8252"></a>
-<span class="sourceLineNo">8253</span>   *<a name="line.8253"></a>
-<span class="sourceLineNo">8254</span>   * &lt;p&gt;<a name="line.8254"></a>
-<span class="sourceLineNo">8255</span>   * Only a single instance may be registered per region for a given {@link Service} subclass (the<a name="line.8255"></a>
-<span class="sourceLineNo">8256</span>   * instances are keyed on {@link com.google.protobuf.Descriptors.ServiceDescriptor#getFullName()}.<a name="line.8256"></a>
-<span class="sourceLineNo">8257</span>   * After the first registration, subsequent calls with the same service name will fail with<a name="line.8257"></a>
-<span class="sourceLineNo">8258</span>   * a return value of {@code false}.<a name="line.8258"></a>
-<span class="sourceLineNo">8259</span>   * &lt;/p&gt;<a name="line.8259"></a>
-<span class="sourceLineNo">8260</span>   * @param instance the {@code Service} subclass instance to expose as a coprocessor endpoint<a name="line.8260"></a>
-<span class="sourceLineNo">8261</span>   * @return {@code true} if the registration was successful, {@code false}<a name="line.8261"></a>
-<span class="sourceLineNo">8262</span>   * otherwise<a name="line.8262"></a>
-<span class="sourceLineNo">8263</span>   */<a name="line.8263"></a>
-<span class="sourceLineNo">8264</span>  public boolean registerService(com.google.protobuf.Service instance) {<a name="line.8264"></a>
-<span class="sourceLineNo">8265</span>    /*<a name="line.8265"></a>
-<span class="sourceLineNo">8266</span>     * No stacking of instances is allowed for a single service name<a name="line.8266"></a>
-<span class="sourceLineNo">8267</span>     */<a name="line.8267"></a>
-<span class="sourceLineNo">8268</span>    com.google.protobuf.Descriptors.ServiceDescriptor serviceDesc = instance.getDescriptorForType();<a name="line.8268"></a>
-<span class="sourceLineNo">8269</span>    String serviceName = CoprocessorRpcUtils.getServiceName(serviceDesc);<a name="line.8269"></a>
-<span class="sourceLineNo">8270</span>    if (coprocessorServiceHandlers.containsKey(serviceName)) {<a name="line.8270"></a>
-<span class="sourceLineNo">8271</span>      LOG.error("Coprocessor service " + serviceName +<a name="line.8271"></a>
-<span class="sourceLineNo">8272</span>          " already registered, rejecting request from " + instance);<a name="line.8272"></a>
-<span class="sourceLineNo">8273</span>      return false;<a name="line.8273"></a>
-<span class="sourceLineNo">8274</span>    }<a name="line.8274"></a>
-<span class="sourceLineNo">8275</span><a name="line.8275"></a>
-<span class="sourceLineNo">8276</span>    coprocessorServiceHandlers.put(serviceName, instance);<a name="line.8276"></a>
-<span class="sourceLineNo">8277</span>    if (LOG.isDebugEnabled()) {<a name="line.8277"></a>
-<span class="sourceLineNo">8278</span>      LOG.debug("Registered coprocessor service: region=" +<a name="line.8278"></a>
-<span class="sourceLineNo">8279</span>          Bytes.toStringBinary(getRegionInfo().getRegionName()) +<a name="line.8279"></a>
-<span class="sourceLineNo">8280</span>          " service=" + serviceName);<a name="line.8280"></a>
-<span class="sourceLineNo">8281</span>    }<a name="line.8281"></a>
-<span class="sourceLineNo">8282</span>    return true;<a name="line.8282"></a>
-<span class="sourceLineNo">8283</span>  }<a name="line.8283"></a>
-<span class="sourceLineNo">8284</span><a name="line.8284"></a>
-<span class="sourceLineNo">8285</span>  /**<a name="line.8285"></a>
-<span class="sourceLineNo">8286</span>   * Executes a single protocol buffer coprocessor endpoint {@link Service} method using<a name="line.8286"></a>
-<span class="sourceLineNo">8287</span>   * the registered protocol handlers.  {@link Service} implementations must be registered via the<a name="line.8287"></a>
-<span class="sourceLineNo">8288</span>   * {@link #registerService(com.google.protobuf.Service)}<a name="line.8288"></a>
-<span class="sourceLineNo">8289</span>   * method before they are available.<a name="line.8289"></a>
-<span class="sourceLineNo">8290</span>   *<a name="line.8290"></a>
-<span class="sourceLineNo">8291</span>   * @param controller an {@code RpcContoller} implementation to pass to the invoked service<a name="line.8291"></a>
-<span class="sourceLineNo">8292</span>   * @param call a {@code CoprocessorServiceCall} instance identifying the service, method,<a name="line.8292"></a>
-<span class="sourceLineNo">8293</span>   *     and parameters for the method invocation<a name="line.8293"></a>
-<span class="sourceLineNo">8294</span>   * @return a protocol buffer {@code Message} instance containing the method's result<a name="line.8294"></a>
-<span class="sourceLineNo">8295</span>   * @throws IOException if no registered service handler is found or an error<a name="line.8295"></a>
-<span class="sourceLineNo">8296</span>   *     occurs during the invocation<a name="line.8296"></a>
-<span class="sourceLineNo">8297</span>   * @see #registerService(com.google.protobuf.Service)<a name="line.8297"></a>
-<span class="sourceLineNo">8298</span>   */<a name="line.8298"></a>
-<span class="sourceLineNo">8299</span>  public com.google.protobuf.Message execService(com.google.protobuf.RpcController controller,<a name="line.8299"></a>
-<span class="sourceLineNo">8300</span>      CoprocessorServiceCall call) throws IOException {<a name="line.8300"></a>
-<span class="sourceLineNo">8301</span>    String serviceName = call.getServiceName();<a name="line.8301"></a>
-<span class="sourceLineNo">8302</span>    com.google.protobuf.Service service = coprocessorServiceHandlers.get(serviceName);<a name="line.8302"></a>
-<span class="sourceLineNo">8303</span>    if (service == null) {<a name="line.8303"></a>
-<span class="sourceLineNo">8304</span>      throw new UnknownProtocolException(null, "No registered coprocessor service found for " +<a name="line.8304"></a>
-<span class="sourceLineNo">8305</span>          serviceName + " in region " + Bytes.toStringBinary(getRegionInfo().getRegionName()));<a name="line.8305"></a>
-<span class="sourceLineNo">8306</span>    }<a name="line.8306"></a>
-<span class="sourceLineNo">8307</span>    com.google.protobuf.Descriptors.ServiceDescriptor serviceDesc = service.getDescriptorForType();<a name="line.8307"></a>
-<span class="sourceLineNo">8308</span><a name="line.8308"></a>
-<span class="sourceLineNo">8309</span>    cpRequestsCount.increment();<a name="line.8309"></a>
-<span class="sourceLineNo">8310</span>    String methodName = call.getMethodName();<a name="line.8310"></a>
-<span class="sourceLineNo">8311</span>    com.google.protobuf.Descriptors.MethodDescriptor methodDesc =<a name="line.8311"></a>
-<span class="sourceLineNo">8312</span>        CoprocessorRpcUtils.getMethodDescriptor(methodName, serviceDesc);<a name="line.8312"></a>
+<span class="sourceLineNo">8125</span>      cellPairs.add(new Pair&lt;&gt;(currentValue, newCell));<a name="line.8125"></a>
+<span class="sourceLineNo">8126</span>      // Add to results to get returned to the Client. If null, cilent does not want results.<a name="line.8126"></a>
+<span class="sourceLineNo">8127</span>      if (results != null) {<a name="line.8127"></a>
+<span class="sourceLineNo">8128</span>        results.add(newCell);<a name="line.8128"></a>
+<span class="sourceLineNo">8129</span>      }<a name="line.8129"></a>
+<span class="sourceLineNo">8130</span>    }<a name="line.8130"></a>
+<span class="sourceLineNo">8131</span><a name="line.8131"></a>
+<span class="sourceLineNo">8132</span>    // Give coprocessors a chance to update the new cells before apply to WAL or memstore<a name="line.8132"></a>
+<span class="sourceLineNo">8133</span>    if (coprocessorHost != null) {<a name="line.8133"></a>
+<span class="sourceLineNo">8134</span>      // Here the operation must be increment or append.<a name="line.8134"></a>
+<span class="sourceLineNo">8135</span>      cellPairs = op == Operation.INCREMENT ?<a name="line.8135"></a>
+<span class="sourceLineNo">8136</span>          coprocessorHost.postIncrementBeforeWAL(mutation, cellPairs) :<a name="line.8136"></a>
+<span class="sourceLineNo">8137</span>          coprocessorHost.postAppendBeforeWAL(mutation, cellPairs);<a name="line.8137"></a>
+<span class="sourceLineNo">8138</span>    }<a name="line.8138"></a>
+<span class="sourceLineNo">8139</span>    return cellPairs.stream().map(Pair::getSecond).collect(Collectors.toList());<a name="line.8139"></a>
+<span class="sourceLineNo">8140</span>  }<a name="line.8140"></a>
+<span class="sourceLineNo">8141</span><a name="line.8141"></a>
+<span class="sourceLineNo">8142</span>  private static Cell reckonDelta(final Cell delta, final Cell currentCell,<a name="line.8142"></a>
+<span class="sourceLineNo">8143</span>                                  final byte[] columnFamily, final long now,<a name="line.8143"></a>
+<span class="sourceLineNo">8144</span>                                  Mutation mutation, Function&lt;Cell, byte[]&gt; supplier) throws IOException {<a name="line.8144"></a>
+<span class="sourceLineNo">8145</span>    // Forward any tags found on the delta.<a name="line.8145"></a>
+<span class="sourceLineNo">8146</span>    List&lt;Tag&gt; tags = TagUtil.carryForwardTags(delta);<a name="line.8146"></a>
+<span class="sourceLineNo">8147</span>    tags = TagUtil.carryForwardTTLTag(tags, mutation.getTTL());<a name="line.8147"></a>
+<span class="sourceLineNo">8148</span>    if (currentCell != null) {<a name="line.8148"></a>
+<span class="sourceLineNo">8149</span>      tags = TagUtil.carryForwardTags(tags, currentCell);<a name="line.8149"></a>
+<span class="sourceLineNo">8150</span>      byte[] newValue = supplier.apply(currentCell);<a name="line.8150"></a>
+<span class="sourceLineNo">8151</span>      return ExtendedCellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.8151"></a>
+<span class="sourceLineNo">8152</span>              .setRow(mutation.getRow(), 0, mutation.getRow().length)<a name="line.8152"></a>
+<span class="sourceLineNo">8153</span>              .setFamily(columnFamily, 0, columnFamily.length)<a name="line.8153"></a>
+<span class="sourceLineNo">8154</span>              // copy the qualifier if the cell is located in shared memory.<a name="line.8154"></a>
+<span class="sourceLineNo">8155</span>              .setQualifier(CellUtil.cloneQualifier(delta))<a name="line.8155"></a>
+<span class="sourceLineNo">8156</span>              .setTimestamp(Math.max(currentCell.getTimestamp() + 1, now))<a name="line.8156"></a>
+<span class="sourceLineNo">8157</span>              .setType(KeyValue.Type.Put.getCode())<a name="line.8157"></a>
+<span class="sourceLineNo">8158</span>              .setValue(newValue, 0, newValue.length)<a name="line.8158"></a>
+<span class="sourceLineNo">8159</span>              .setTags(TagUtil.fromList(tags))<a name="line.8159"></a>
+<span class="sourceLineNo">8160</span>              .build();<a name="line.8160"></a>
+<span class="sourceLineNo">8161</span>    } else {<a name="line.8161"></a>
+<span class="sourceLineNo">8162</span>      PrivateCellUtil.updateLatestStamp(delta, now);<a name="line.8162"></a>
+<span class="sourceLineNo">8163</span>      return CollectionUtils.isEmpty(tags) ? delta : PrivateCellUtil.createCell(delta, tags);<a name="line.8163"></a>
+<span class="sourceLineNo">8164</span>    }<a name="line.8164"></a>
+<span class="sourceLineNo">8165</span>  }<a name="line.8165"></a>
+<span class="sourceLineNo">8166</span><a name="line.8166"></a>
+<span class="sourceLineNo">8167</span>  /**<a name="line.8167"></a>
+<span class="sourceLineNo">8168</span>   * @return Get the long out of the passed in Cell<a name="line.8168"></a>
+<span class="sourceLineNo">8169</span>   */<a name="line.8169"></a>
+<span class="sourceLineNo">8170</span>  private static long getLongValue(final Cell cell) throws DoNotRetryIOException {<a name="line.8170"></a>
+<span class="sourceLineNo">8171</span>    int len = cell.getValueLength();<a name="line.8171"></a>
+<span class="sourceLineNo">8172</span>    if (len != Bytes.SIZEOF_LONG) {<a name="line.8172"></a>
+<span class="sourceLineNo">8173</span>      // throw DoNotRetryIOException instead of IllegalArgumentException<a name="line.8173"></a>
+<span class="sourceLineNo">8174</span>      throw new DoNotRetryIOException("Field is not a long, it's " + len + " bytes wide");<a name="line.8174"></a>
+<span class="sourceLineNo">8175</span>    }<a name="line.8175"></a>
+<span class="sourceLineNo">8176</span>    return PrivateCellUtil.getValueAsLong(cell);<a name="line.8176"></a>
+<span class="sourceLineNo">8177</span>  }<a name="line.8177"></a>
+<span class="sourceLineNo">8178</span><a name="line.8178"></a>
+<span class="sourceLineNo">8179</span>  /**<a name="line.8179"></a>
+<span class="sourceLineNo">8180</span>   * Do a specific Get on passed &lt;code&gt;columnFamily&lt;/code&gt; and column qualifiers.<a name="line.8180"></a>
+<span class="sourceLineNo">8181</span>   * @param mutation Mutation we are doing this Get for.<a name="line.8181"></a>
+<span class="sourceLineNo">8182</span>   * @param store Which column family on row (TODO: Go all Gets in one go)<a name="line.8182"></a>
+<span class="sourceLineNo">8183</span>   * @param coordinates Cells from &lt;code&gt;mutation&lt;/code&gt; used as coordinates applied to Get.<a name="line.8183"></a>
+<span class="sourceLineNo">8184</span>   * @return Return list of Cells found.<a name="line.8184"></a>
+<span class="sourceLineNo">8185</span>   */<a name="line.8185"></a>
+<span class="sourceLineNo">8186</span>  private List&lt;Cell&gt; get(Mutation mutation, HStore store, List&lt;Cell&gt; coordinates,<a name="line.8186"></a>
+<span class="sourceLineNo">8187</span>      IsolationLevel isolation, TimeRange tr) throws IOException {<a name="line.8187"></a>
+<span class="sourceLineNo">8188</span>    // Sort the cells so that they match the order that they appear in the Get results. Otherwise,<a name="line.8188"></a>
+<span class="sourceLineNo">8189</span>    // we won't be able to find the existing values if the cells are not specified in order by the<a name="line.8189"></a>
+<span class="sourceLineNo">8190</span>    // client since cells are in an array list.<a name="line.8190"></a>
+<span class="sourceLineNo">8191</span>    // TODO: I don't get why we are sorting. St.Ack 20150107<a name="line.8191"></a>
+<span class="sourceLineNo">8192</span>    sort(coordinates, store.getComparator());<a name="line.8192"></a>
+<span class="sourceLineNo">8193</span>    Get get = new Get(mutation.getRow());<a name="line.8193"></a>
+<span class="sourceLineNo">8194</span>    if (isolation != null) {<a name="line.8194"></a>
+<span class="sourceLineNo">8195</span>      get.setIsolationLevel(isolation);<a name="line.8195"></a>
+<span class="sourceLineNo">8196</span>    }<a name="line.8196"></a>
+<span class="sourceLineNo">8197</span>    for (Cell cell: coordinates) {<a name="line.8197"></a>
+<span class="sourceLineNo">8198</span>      get.addColumn(store.getColumnFamilyDescriptor().getName(), CellUtil.cloneQualifier(cell));<a name="line.8198"></a>
+<span class="sourceLineNo">8199</span>    }<a name="line.8199"></a>
+<span class="sourceLineNo">8200</span>    // Increments carry time range. If an Increment instance, put it on the Get.<a name="line.8200"></a>
+<span class="sourceLineNo">8201</span>    if (tr != null) {<a name="line.8201"></a>
+<span class="sourceLineNo">8202</span>      get.setTimeRange(tr.getMin(), tr.getMax());<a name="line.8202"></a>
+<span class="sourceLineNo">8203</span>    }<a name="line.8203"></a>
+<span class="sourceLineNo">8204</span>    return get(get, false);<a name="line.8204"></a>
+<span class="sourceLineNo">8205</span>  }<a name="line.8205"></a>
+<span class="sourceLineNo">8206</span><a name="line.8206"></a>
+<span class="sourceLineNo">8207</span>  /**<a name="line.8207"></a>
+<span class="sourceLineNo">8208</span>   * @return Sorted list of &lt;code&gt;cells&lt;/code&gt; using &lt;code&gt;comparator&lt;/code&gt;<a name="line.8208"></a>
+<span class="sourceLineNo">8209</span>   */<a name="line.8209"></a>
+<span class="sourceLineNo">8210</span>  private static List&lt;Cell&gt; sort(List&lt;Cell&gt; cells, final CellComparator comparator) {<a name="line.8210"></a>
+<span class="sourceLineNo">8211</span>    cells.sort(comparator);<a name="line.8211"></a>
+<span class="sourceLineNo">8212</span>    return cells;<a name="line.8212"></a>
+<span class="sourceLineNo">8213</span>  }<a name="line.8213"></a>
+<span class="sourceLineNo">8214</span><a name="line.8214"></a>
+<span class="sourceLineNo">8215</span>  public static final long FIXED_OVERHEAD = ClassSize.align(<a name="line.8215"></a>
+<span class="sourceLineNo">8216</span>      ClassSize.OBJECT +<a name="line.8216"></a>
+<span class="sourceLineNo">8217</span>      ClassSize.ARRAY +<a name="line.8217"></a>
+<span class="sourceLineNo">8218</span>      55 * ClassSize.REFERENCE + 3 * Bytes.SIZEOF_INT +<a name="line.8218"></a>
+<span class="sourceLineNo">8219</span>      (15 * Bytes.SIZEOF_LONG) +<a name="line.8219"></a>
+<span class="sourceLineNo">8220</span>      3 * Bytes.SIZEOF_BOOLEAN);<a name="line.8220"></a>
+<span class="sourceLineNo">8221</span><a name="line.8221"></a>
+<span class="sourceLineNo">8222</span>  // woefully out of date - currently missing:<a name="line.8222"></a>
+<span class="sourceLineNo">8223</span>  // 1 x HashMap - coprocessorServiceHandlers<a name="line.8223"></a>
+<span class="sourceLineNo">8224</span>  // 6 x LongAdder - numMutationsWithoutWAL, dataInMemoryWithoutWAL,<a name="line.8224"></a>
+<span class="sourceLineNo">8225</span>  //   checkAndMutateChecksPassed, checkAndMutateChecksFailed, readRequestsCount,<a name="line.8225"></a>
+<span class="sourceLineNo">8226</span>  //   writeRequestsCount, cpRequestsCount<a name="line.8226"></a>
+<span class="sourceLineNo">8227</span>  // 1 x HRegion$WriteState - writestate<a name="line.8227"></a>
+<span class="sourceLineNo">8228</span>  // 1 x RegionCoprocessorHost - coprocessorHost<a name="line.8228"></a>
+<span class="sourceLineNo">8229</span>  // 1 x RegionSplitPolicy - splitPolicy<a name="line.8229"></a>
+<span class="sourceLineNo">8230</span>  // 1 x MetricsRegion - metricsRegion<a name="line.8230"></a>
+<span class="sourceLineNo">8231</span>  // 1 x MetricsRegionWrapperImpl - metricsRegionWrapper<a name="line.8231"></a>
+<span class="sourceLineNo">8232</span>  public static final long DEEP_OVERHEAD = FIXED_OVERHEAD +<a name="line.8232"></a>
+<span class="sourceLineNo">8233</span>      ClassSize.OBJECT + // closeLock<a name="line.8233"></a>
+<span class="sourceLineNo">8234</span>      (2 * ClassSize.ATOMIC_BOOLEAN) + // closed, closing<a name="line.8234"></a>
+<span class="sourceLineNo">8235</span>      (3 * ClassSize.ATOMIC_LONG) + // numPutsWithoutWAL, dataInMemoryWithoutWAL,<a name="line.8235"></a>
+<span class="sourceLineNo">8236</span>                                    // compactionsFailed<a name="line.8236"></a>
+<span class="sourceLineNo">8237</span>      (2 * ClassSize.CONCURRENT_HASHMAP) +  // lockedRows, scannerReadPoints<a name="line.8237"></a>
+<span class="sourceLineNo">8238</span>      WriteState.HEAP_SIZE + // writestate<a name="line.8238"></a>
+<span class="sourceLineNo">8239</span>      ClassSize.CONCURRENT_SKIPLISTMAP + ClassSize.CONCURRENT_SKIPLISTMAP_ENTRY + // stores<a name="line.8239"></a>
+<span class="sourceLineNo">8240</span>      (2 * ClassSize.REENTRANT_LOCK) + // lock, updatesLock<a name="line.8240"></a>
+<span class="sourceLineNo">8241</span>      MultiVersionConcurrencyControl.FIXED_SIZE // mvcc<a name="line.8241"></a>
+<span class="sourceLineNo">8242</span>      + 2 * ClassSize.TREEMAP // maxSeqIdInStores, replicationScopes<a name="line.8242"></a>
+<span class="sourceLineNo">8243</span>      + 2 * ClassSize.ATOMIC_INTEGER // majorInProgress, minorInProgress<a name="line.8243"></a>
+<span class="sourceLineNo">8244</span>      + ClassSize.STORE_SERVICES // store services<a name="line.8244"></a>
+<span class="sourceLineNo">8245</span>      + StoreHotnessProtector.FIXED_SIZE<a name="line.8245"></a>
+<span class="sourceLineNo">8246</span>      ;<a name="line.8246"></a>
+<span class="sourceLineNo">8247</span><a name="line.8247"></a>
+<span class="sourceLineNo">8248</span>  @Override<a name="line.8248"></a>
+<span class="sourceLineNo">8249</span>  public long heapSize() {<a name="line.8249"></a>
+<span class="sourceLineNo">8250</span>    // this does not take into account row locks, recent flushes, mvcc entries, and more<a name="line.8250"></a>
+<span class="sourceLineNo">8251</span>    return DEEP_OVERHEAD + stores.values().stream().mapToLong(HStore::heapSize).sum();<a name="line.8251"></a>
+<span class="sourceLineNo">8252</span>  }<a name="line.8252"></a>
+<span class="sourceLineNo">8253</span><a name="line.8253"></a>
+<span class="sourceLineNo">8254</span>  /**<a name="line.8254"></a>
+<span class="sourceLineNo">8255</span>   * Registers a new protocol buffer {@link Service} subclass as a coprocessor endpoint to<a name="line.8255"></a>
+<span class="sourceLineNo">8256</span>   * be available for handling Region#execService(com.google.protobuf.RpcController,<a name="line.8256"></a>
+<span class="sourceLineNo">8257</span>   *    org.apache.hadoop.hbase.protobuf.generated.ClientProtos.CoprocessorServiceCall) calls.<a name="line.8257"></a>
+<span class="sourceLineNo">8258</span>   *<a name="line.8258"></a>
+<span class="sourceLineNo">8259</span>   * &lt;p&gt;<a name="line.8259"></a>
+<span class="sourceLineNo">8260</span>   * Only a single instance may be registered per region for a given {@link Service} subclass (the<a name="line.8260"></a>
+<span class="sourceLineNo">8261</span>   * instances are keyed on {@link com.google.protobuf.Descriptors.ServiceDescriptor#getFullName()}.<a name="line.8261"></a>
+<span class="sourceLineNo">8262</span>   * After the first registration, subsequent calls with the same service name will fail with<a name="line.8262"></a>
+<span class="sourceLineNo">8263</span>   * a return value of {@code false}.<a name="line.8263"></a>
+<span class="sourceLineNo">8264</span>   * &lt;/p&gt;<a name="line.8264"></a>
+<span class="sourceLineNo">8265</span>   * @param instance the {@code Service} subclass instance to expose as a coprocessor endpoint<a name="line.8265"></a>
+<span class="sourceLineNo">8266</span>   * @return {@code true} if the registration was successful, {@code false}<a name="line.8266"></a>
+<span class="sourceLineNo">8267</span>   * otherwise<a name="line.8267"></a>
+<span class="sourceLineNo">8268</span>   */<a name="line.8268"></a>
+<span class="sourceLineNo">8269</span>  public boolean registerService(com.google.protobuf.Service instance) {<a name="line.8269"></a>
+<span class="sourceLineNo">8270</span>    /*<a name="line.8270"></a>
+<span class="sourceLineNo">8271</span>     * No stacking of instances is allowed for a single service name<a name="line.8271"></a>
+<span class="sourceLineNo">8272</span>     */<a name="line.8272"></a>
+<span class="sourceLineNo">8273</span>    com.google.protobuf.Descriptors.ServiceDescriptor serviceDesc = instance.getDescriptorForType();<a name="line.8273"></a>
+<span class="sourceLineNo">8274</span>    String serviceName = CoprocessorRpcUtils.getServiceName(serviceDesc);<a name="line.8274"></a>
+<span class="sourceLineNo">8275</span>    if (coprocessorServiceHandlers.containsKey(serviceName)) {<a name="line.8275"></a>
+<span class="sourceLineNo">8276</span>      LOG.error("Coprocessor service " + serviceName +<a name="line.8276"></a>
+<span class="sourceLineNo">8277</span>          " already registered, rejecting request from " + instance);<a name="line.8277"></a>
+<span class="sourceLineNo">8278</span>      return false;<a name="line.8278"></a>
+<span class="sourceLineNo">8279</span>    }<a name="line.8279"></a>
+<span class="sourceLineNo">8280</span><a name="line.8280"></a>
+<span class="sourceLineNo">8281</span>    coprocessorServiceHandlers.put(serviceName, instance);<a name="line.8281"></a>
+<span class="sourceLineNo">8282</span>    if (LOG.isDebugEnabled()) {<a name="line.8282"></a>
+<span class="sourceLineNo">8283</span>      LOG.debug("Registered coprocessor service: region=" +<a name="line.8283"></a>
+<span class="sourceLineNo">8284</span>          Bytes.toStringBinary(getRegionInfo().getRegionName()) +<a name="line.8284"></a>
+<span class="sourceLineNo">8285</span>          " service=" + serviceName);<a name="line.8285"></a>
+<span class="sourceLineNo">8286</span>    }<a name="line.8286"></a>
+<span class="sourceLineNo">8287</span>    return true;<a name="line.8287"></a>
+<span class="sourceLineNo">8288</span>  }<a name="line.8288"></a>
+<span class="sourceLineNo">8289</span><a name="line.8289"></a>
+<span class="sourceLineNo">8290</span>  /**<a name="line.8290"></a>
+<span class="sourceLineNo">8291</span>   * Executes a single protocol buffer coprocessor endpoint {@link Service} method using<a name="line.8291"></a>
+<span class="sourceLineNo">8292</span>   * the registered protocol handlers.  {@link Service} implementations must be registered via the<a name="line.8292"></a>
+<span class="sourceLineNo">8293</span>   * {@link #registerService(com.google.protobuf.Service)}<a name="line.8293"></a>
+<span class="sourceLineNo">8294</span>   * method before they are available.<a name="line.8294"></a>
+<span class="sourceLineNo">8295</span>   *<a name="line.8295"></a>
+<span class="sourceLineNo">8296</span>   * @param controller an {@code RpcContoller} implementation to pass to the invoked service<a name="line.8296"></a>
+<span class="sourceLineNo">8297</span>   * @param call a {@code CoprocessorServiceCall} instance identifying the service, method,<a name="line.8297"></a>
+<span class="sourceLineNo">8298</span>   *     and parameters for the method invocation<a name="line.8298"></a>
+<span class="sourceLineNo">8299</span>   * @return a protocol buffer {@code Message} instance containing the method's result<a name="line.8299"></a>
+<span class="sourceLineNo">8300</span>   * @throws IOException if no registered service handler is found or an error<a name="line.8300"></a>
+<span class="sourceLineNo">8301</span>   *     occurs during the invocation<a name="line.8301"></a>
+<span class="sourceLineNo">8302</span>   * @see #registerService(com.google.protobuf.Service)<a name="line.8302"></a>
+<span class="sourceLineNo">8303</span>   */<a name="line.8303"></a>
+<span class="sourceLineNo">8304</span>  public com.google.protobuf.Message execService(com.google.protobuf.RpcController controller,<a name="line.8304"></a>
+<span class="sourceLineNo">8305</span>      CoprocessorServiceCall call) throws IOException {<a name="line.8305"></a>
+<span class="sourceLineNo">8306</span>    String serviceName = call.getServiceName();<a name="line.8306"></a>
+<span class="sourceLineNo">8307</span>    com.google.protobuf.Service service = coprocessorServiceHandlers.get(serviceName);<a name="line.8307"></a>
+<span class="sourceLineNo">8308</span>    if (service == null) {<a name="line.8308"></a>
+<span class="sourceLineNo">8309</span>      throw new UnknownProtocolException(null, "No registered coprocessor service found for " +<a name="line.8309"></a>
+<span class="sourceLineNo">8310</span>          serviceName + " in region " + Bytes.toStringBinary(getRegionInfo().getRegionName()));<a name="line.8310"></a>
+<span class="sourceLineNo">8311</span>    }<a name="line.8311"></a>
+<span class="sourceLineNo">8312</span>    com.google.protobuf.Descriptors.ServiceDescriptor serviceDesc = service.getDescriptorForType();<a name="line.8312"></a>
 <span class="sourceLineNo">8313</span><a name="line.8313"></a>
-<span class="sourceLineNo">8314</span>    com.google.protobuf.Message.Builder builder =<a name="line.8314"></a>
-<span class="sourceLineNo">8315</span>        service.getRequestPrototype(methodDesc).newBuilderForType();<a name="line.8315"></a>
-<span class="sourceLineNo">8316</span><a name="line.8316"></a>
-<span class="sourceLineNo">8317</span>    org.apache.hadoop.hbase.protobuf.ProtobufUtil.mergeFrom(builder,<a name="line.8317"></a>
-<span class="sourceLineNo">8318</span>        call.getRequest().toByteArray());<a name="line.8318"></a>
-<span class="sourceLineNo">8319</span>    com.google.protobuf.Message request =<a name="line.8319"></a>
-<span class="sourceLineNo">8320</span>        CoprocessorRpcUtils.getRequest(service, methodDesc, call.getRequest());<a name="line.8320"></a>
+<span class="sourceLineNo">8314</span>    cpRequestsCount.increment();<a name="line.8314"></a>
+<span class="sourceLineNo">8315</span>    String methodName = call.getMethodName();<a name="line.8315"></a>
+<span class="sourceLineNo">8316</span>    com.google.protobuf.Descriptors.MethodDescriptor methodDesc =<a name="line.8316"></a>
+<span class="sourceLineNo">8317</span>        CoprocessorRpcUtils.getMethodDescriptor(methodName, serviceDesc);<a name="line.8317"></a>
+<span class="sourceLineNo">8318</span><a name="line.8318"></a>
+<span class="sourceLineNo">8319</span>    com.google.protobuf.Message.Builder builder =<a name="line.8319"></a>
+<span class="sourceLineNo">8320</span>        service.getRequestPrototype(methodDesc).newBuilderForType();<a name="line.8320"></a>
 <span class="sourceLineNo">8321</span><a name="line.8321"></a>
-<span class="sourceLineNo">8322</span>    if (coprocessorHost != null) {<a name="line.8322"></a>
-<span class="sourceLineNo">8323</span>      request = coprocessorHost.preEndpointInvocation(service, methodName, request);<a name="line.8323"></a>
-<span class="sourceLineNo">8324</span>    }<a name="line.8324"></a>
-<span class="sourceLineNo">8325</span><a name="line.8325"></a>
-<span class="sourceLineNo">8326</span>    final com.google.protobuf.Message.Builder responseBuilder =<a name="line.8326"></a>
-<span class="sourceLineNo">8327</span>        service.getResponsePrototype(methodDesc).newBuilderForType();<a name="line.8327"></a>
-<span class="sourceLineNo">8328</span>    service.callMethod(methodDesc, controller, request,<a name="line.8328"></a>
-<span class="sourceLineNo">8329</span>        new com.google.protobuf.RpcCallback&lt;com.google.protobuf.Message&gt;() {<a name="line.8329"></a>
-<span class="sourceLineNo">8330</span>      @Override<a name="line.8330"></a>
-<span class="sourceLineNo">8331</span>      public void run(com.google.protobuf.Message message) {<a name="line.8331"></a>
-<span class="sourceLineNo">8332</span>        if (message != null) {<a name="line.8332"></a>
-<span class="sourceLineNo">8333</span>          responseBuilder.mergeFrom(message);<a name="line.8333"></a>
-<span class="sourceLineNo">8334</span>        }<a name="line.8334"></a>
-<span class="sourceLineNo">8335</span>      }<a name="line.8335"></a>
-<span class="sourceLineNo">8336</span>    });<a name="line.8336"></a>
-<span class="sourceLineNo">8337</span><a name="line.8337"></a>
-<span class="sourceLineNo">8338</span>    if (coprocessorHost != null) {<a name="line.8338"></a>
-<span class="sourceLineNo">8339</span>      coprocessorHost.postEndpointInvocation(service, methodName, request, responseBuilder);<a name="line.8339"></a>
-<span class="sourceLineNo">8340</span>    }<a name="line.8340"></a>
-<span class="sourceLineNo">8341</span>    IOException exception =<a name="line.8341"></a>
-<span class="sourceLineNo">8342</span>        org.apache.hadoop.hbase.ipc.CoprocessorRpcUtils.getControllerException(controller);<a name="line.8342"></a>
-<span class="sourceLineNo">8343</span>    if (exception != null) {<a name="line.8343"></a>
-<span class="sourceLineNo">8344</span>      throw exception;<a name="line.8344"></a>
+<span class="sourceLineNo">8322</span>    org.apache.hadoop.hbase.protobuf.ProtobufUtil.mergeFrom(builder,<a name="line.8322"></a>
+<span class="sourceLineNo">8323</span>        call.getRequest().toByteArray());<a name="line.8323"></a>
+<span class="sourceLineNo">8324</span>    com.google.protobuf.Message request =<a name="line.8324"></a>
+<span class="sourceLineNo">8325</span>        CoprocessorRpcUtils.getRequest(service, methodDesc, call.getRequest());<a name="line.8325"></a>
+<span class="sourceLineNo">8326</span><a name="line.8326"></a>
+<span class="sourceLineNo">8327</span>    if (coprocessorHost != null) {<a name="line.8327"></a>
+<span class="sourceLineNo">8328</span>      request = coprocessorHost.preEndpointInvocation(service, methodName, request);<a name="line.8328"></a>
+<span class="sourceLineNo">8329</span>    }<a name="line.8329"></a>
+<span class="sourceLineNo">8330</span><a name="line.8330"></a>
+<span class="sourceLineNo">8331</span>    final com.google.protobuf.Message.Builder responseBuilder =<a name="line.8331"></a>
+<span class="sourceLineNo">8332</span>        service.getResponsePrototype(methodDesc).newBuilderForType();<a name="line.8332"></a>
+<span class="sourceLineNo">8333</span>    service.callMethod(methodDesc, controller, request,<a name="line.8333"></a>
+<span class="sourceLineNo">8334</span>        new com.google.protobuf.RpcCallback&lt;com.google.protobuf.Message&gt;() {<a name="line.8334"></a>
+<span class="sourceLineNo">8335</span>      @Override<a name="line.8335"></a>
+<span class="sourceLineNo">8336</span>      public void run(com.google.protobuf.Message message) {<a name="line.8336"></a>
+<span class="sourceLineNo">8337</span>        if (message != null) {<a name="line.8337"></a>
+<span class="sourceLineNo">8338</span>          responseBuilder.mergeFrom(message);<a name="line.8338"></a>
+<span class="sourceLineNo">8339</span>        }<a name="line.8339"></a>
+<span class="sourceLineNo">8340</span>      }<a name="line.8340"></a>
+<span class="sourceLineNo">8341</span>    });<a name="line.8341"></a>
+<span class="sourceLineNo">8342</span><a name="line.8342"></a>
+<span class="sourceLineNo">8343</span>    if (coprocessorHost != null) {<a name="line.8343"></a>
+<span class="sourceLineNo">8344</span>      coprocessorHost.postEndpointInvocation(service, methodName, request, responseBuilder);<a name="line.8344"></a>
 <span class="sourceLineNo">8345</span>    }<a name="line.8345"></a>
-<span class="sourceLineNo">8346</span><a name="line.8346"></a>
-<span class="sourceLineNo">8347</span>    return responseBuilder.build();<a name="line.8347"></a>
-<span class="sourceLineNo">8348</span>  }<a name="line.8348"></a>
-<span class="sourceLineNo">8349</span><a name="line.8349"></a>
-<span class="sourceLineNo">8350</span>  boolean shouldForceSplit() {<a name="line.8350"></a>
-<span class="sourceLineNo">8351</span>    return this.splitRequest;<a name="line.8351"></a>
-<span class="sourceLineNo">8352</span>  }<a name="line.8352"></a>
-<span class="sourceLineNo">8353</span><a name="line.8353"></a>
-<span class="sourceLineNo">8354</span>  byte[] getExplicitSplitPoint() {<a name="line.8354"></a>
-<span class="sourceLineNo">8355</span>    return this.explicitSplitPoint;<a name="line.8355"></a>
-<span class="sourceLineNo">8356</span>  }<a name="line.8356"></a>
-<span class="sourceLineNo">8357</span><a name="line.8357"></a>
-<span class="sourceLineNo">8358</span>  void forceSplit(byte[] sp) {<a name="line.8358"></a>
-<span class="sourceLineNo">8359</span>    // This HRegion will go away after the forced split is successful<a name="line.8359"></a>
-<span class="sourceLineNo">8360</span>    // But if a forced split fails, we need to clear forced split.<a name="line.8360"></a>
-<span class="sourceLineNo">8361</span>    this.splitRequest = true;<a name="line.8361"></a>
-<span class="sourceLineNo">8362</span>    if (sp != null) {<a name="line.8362"></a>
-<span class="sourceLineNo">8363</span>      this.explicitSplitPoint = sp;<a name="line.8363"></a>
-<span class="sourceLineNo">8364</span>    }<a name="line.8364"></a>
-<span class="sourceLineNo">8365</span>  }<a name="line.8365"></a>
-<span class="sourceLineNo">8366</span><a name="line.8366"></a>
-<span class="sourceLineNo">8367</span>  void clearSplit() {<a name="line.8367"></a>
-<span class="sourceLineNo">8368</span>    this.splitRequest = false;<a name="line.8368"></a>
-<span class="sourceLineNo">8369</span>    this.explicitSplitPoint = null;<a name="line.8369"></a>
+<span class="sourceLineNo">8346</span>    IOException exception =<a name="line.8346"></a>
+<span class="sourceLineNo">8347</span>        org.apache.hadoop.hbase.ipc.CoprocessorRpcUtils.getControllerException(controller);<a name="line.8347"></a>
+<span class="sourceLineNo">8348</span>    if (exception != null) {<a name="line.8348"></a>
+<span class="sourceLineNo">8349</span>      throw exception;<a name="line.8349"></a>
+<span class="sourceLineNo">8350</span>    }<a name="line.8350"></a>
+<span class="sourceLineNo">8351</span><a name="line.8351"></a>
+<span class="sourceLineNo">8352</span>    return responseBuilder.build();<a name="line.8352"></a>
+<span class="sourceLineNo">8353</span>  }<a name="line.8353"></a>
+<span class="sourceLineNo">8354</span><a name="line.8354"></a>
+<span class="sourceLineNo">8355</span>  boolean shouldForceSplit() {<a name="line.8355"></a>
+<span class="sourceLineNo">8356</span>    return this.splitRequest;<a name="line.8356"></a>
+<span class="sourceLineNo">8357</span>  }<a name="line.8357"></a>
+<span class="sourceLineNo">8358</span><a name="line.8358"></a>
+<span class="sourceLineNo">8359</span>  byte[] getExplicitSplitPoint() {<a name="line.8359"></a>
+<span class="sourceLineNo">8360</span>    return this.explicitSplitPoint;<a name="line.8360"></a>
+<span class="sourceLineNo">8361</span>  }<a name="line.8361"></a>
+<span class="sourceLineNo">8362</span><a name="line.8362"></a>
+<span class="sourceLineNo">8363</span>  void forceSplit(byte[] sp) {<a name="line.8363"></a>
+<span class="sourceLineNo">8364</span>    // This HRegion will go away after the forced split is successful<a name="line.8364"></a>
+<span class="sourceLineNo">8365</span>    // But if a forced split fails, we need to clear forced split.<a name="line.8365"></a>
+<span class="sourceLineNo">8366</span>    this.splitRequest = true;<a name="line.8366"></a>
+<span class="sourceLineNo">8367</span>    if (sp != null) {<a name="line.8367"></a>
+<span class="sourceLineNo">8368</span>      this.explicitSplitPoint = sp;<a name="line.8368"></a>
+<span class="sourceLineNo">8369</span>    }<a name="line.8369"></a>
 <span class="sourceLineNo">8370</span>  }<a name="line.8370"></a>
 <span class="sourceLineNo">8371</span><a name="line.8371"></a>
-<span class="sourceLineNo">8372</span>  /**<a name="line.8372"></a>
-<span class="sourceLineNo">8373</span>   * Return the splitpoint. null indicates the region isn't splittable<a name="line.8373"></a>
-<span class="sourceLineNo">8374</span>   * If the splitpoint isn't explicitly specified, it will go over the stores<a name="line.8374"></a>
-<span class="sourceLineNo">8375</span>   * to find the best splitpoint. Currently the criteria of best splitpoint<a name="line.8375"></a>
-<span class="sourceLineNo">8376</span>   * is based on the size of the store.<a name="line.8376"></a>
-<span class="sourceLineNo">8377</span>   */<a name="line.8377"></a>
-<span class="sourceLineNo">8378</span>  public byte[] checkSplit() {<a name="line.8378"></a>
-<span class="sourceLineNo">8379</span>    // Can't split META<a name="line.8379"></a>
-<span class="sourceLineNo">8380</span>    if (this.getRegionInfo().isMetaRegion()) {<a name="line.8380"></a>
-<span class="sourceLineNo">8381</span>      if (shouldForceSplit()) {<a name="line.8381"></a>
-<span class="sourceLineNo">8382</span>        LOG.warn("Cannot split meta region in HBase 0.20 and above");<a name="line.8382"></a>
-<span class="sourceLineNo">8383</span>      }<a name="line.8383"></a>
-<span class="sourceLineNo">8384</span>      return null;<a name="line.8384"></a>
-<span class="sourceLineNo">8385</span>    }<a name="line.8385"></a>
-<span class="sourceLineNo">8386</span><a name="line.8386"></a>
-<span class="sourceLineNo">8387</span>    // Can't split a region that is closing.<a name="line.8387"></a>
-<span class="sourceLineNo">8388</span>    if (this.isClosing()) {<a name="line.8388"></a>
+<span class="sourceLineNo">8372</span>  void clearSplit() {<a name="line.8372"></a>
+<span class="sourceLineNo">8373</span>    this.splitRequest = false;<a name="line.8373"></a>
+<span class="sourceLineNo">8374</span>    this.explicitSplitPoint = null;<a name="line.8374"></a>
+<span class="sourceLineNo">8375</span>  }<a name="line.8375"></a>
+<span class="sourceLineNo">8376</span><a name="line.8376"></a>
+<span class="sourceLineNo">8377</span>  /**<a name="line.8377"></a>
+<span class="sourceLineNo">8378</span>   * Return the splitpoint. null indicates the region isn't splittable<a name="line.8378"></a>
+<span class="sourceLineNo">8379</span>   * If the splitpoint isn't explicitly specified, it will go over the stores<a name="line.8379"></a>
+<span class="sourceLineNo">8380</span>   * to find the best splitpoint. Currently the criteria of best splitpoint<a name="line.8380"></a>
+<span class="sourceLineNo">8381</span>   * is based on the size of the store.<a name="line.8381"></a>
+<span class="sourceLineNo">8382</span>   */<a name="line.8382"></a>
+<span class="sourceLineNo">8383</span>  public byte[] checkSplit() {<a name="line.8383"></a>
+<span class="sourceLineNo">8384</span>    // Can't split META<a name="line.8384"></a>
+<span class="sourceLineNo">8385</span>    if (this.getRegionInfo().isMetaRegion()) {<a name="line.8385"></a>
+<span class="sourceLineNo">8386</span>      if (shouldForceSplit()) {<a name="line.8386"></a>
+<span class="sourceLineNo">8387</span>        LOG.warn("Cannot split meta region in HBase 0.20 and above");<a name="line.8387"></a>
+<span class="sourceLineNo">8388</span>      }<a name="line.8388"></a>
 <span class="sourceLineNo">8389</span>      return null;<a name="line.8389"></a>
 <span class="sourceLineNo">8390</span>    }<a name="line.8390"></a>
 <span class="sourceLineNo">8391</span><a name="line.8391"></a>
-<span class="sourceLineNo">8392</span>    if (!splitPolicy.shouldSplit()) {<a name="line.8392"></a>
-<span class="sourceLineNo">8393</span>      return null;<a name="line.8393"></a>
-<span class="sourceLineNo">8394</span>    }<a name="line.8394"></a>
-<span class="sourceLineNo">8395</span><a name="line.8395"></a>
-<span class="sourceLineNo">8396</span>    byte[] ret = splitPolicy.getSplitPoint();<a name="line.8396"></a>
-<span class="sourceLineNo">8397</span><a name="line.8397"></a>
-<span class="sourceLineNo">8398</span>    if (ret != null) {<a name="line.8398"></a>
-<span class="sourceLineNo">8399</span>      try {<a name="line.8399"></a>
-<span class="sourceLineNo">8400</span>        checkRow(ret, "calculated split");<a name="line.8400"></a>
-<span class="sourceLineNo">8401</span>      } catch (IOException e) {<a name="line.8401"></a>
-<span class="sourceLineNo">8402</span>        LOG.error("Ignoring invalid split", e);<a name="line.8402"></a>
-<span class="sourceLineNo">8403</span>        return null;<a name="line.8403"></a>
-<span class="sourceLineNo">8404</span>      }<a name="line.8404"></a>
-<span class="sourceLineNo">8405</span>    }<a name="line.8405"></a>
-<span class="sourceLineNo">8406</span>    return ret;<a name="line.8406"></a>
-<span class="sourceLineNo">8407</span>  }<a name="line.8407"></a>
-<span class="sourceLineNo">8408</span><a name="line.8408"></a>
-<span class="sourceLineNo">8409</span>  /**<a name="line.8409"></a>
-<span class="sourceLineNo">8410</span>   * @return The priority that this region should have in the compaction queue<a name="line.8410"></a>
-<span class="sourceLineNo">8411</span>   */<a name="line.8411"></a>
-<span class="sourceLineNo">8412</span>  public int getCompactPriority() {<a name="line.8412"></a>
-<span class="sourceLineNo">8413</span>    return stores.values().stream().mapToInt(HStore::getCompactPriority).min()<a name="line.8413"></a>
-<span class="sourceLineNo">8414</span>        .orElse(Store.NO_PRIORITY);<a name="line.8414"></a>
-<span class="sourceLineNo">8415</span>  }<a name="line.8415"></a>
-<span class="sourceLineNo">8416</span><a name="line.8416"></a>
-<span class="sourceLineNo">8417</span>  /** @return the coprocessor host */<a name="line.8417"></a>
-<span class="sourceLineNo">8418</span>  public RegionCoprocessorHost getCoprocessorHost() {<a name="line.8418"></a>
-<span class="sourceLineNo">8419</span>    return coprocessorHost;<a name="line.8419"></a>
+<span class="sourceLineNo">8392</span>    // Can't split a region that is closing.<a name="line.8392"></a>
+<span class="sourceLineNo">8393</span>    if (this.isClosing()) {<a name="line.8393"></a>
+<span class="sourceLineNo">8394</span>      return null;<a name="line.8394"></a>
+<span class="sourceLineNo">8395</span>    }<a name="line.8395"></a>
+<span class="sourceLineNo">8396</span><a name="line.8396"></a>
+<span class="sourceLineNo">8397</span>    if (!splitPolicy.shouldSplit()) {<a name="line.8397"></a>
+<span class="sourceLineNo">8398</span>      return null;<a name="line.8398"></a>
+<span class="sourceLineNo">8399</span>    }<a name="line.8399"></a>
+<span class="sourceLineNo">8400</span><a name="line.8400"></a>
+<span class="sourceLineNo">8401</span>    byte[] ret = splitPolicy.getSplitPoint();<a name="line.8401"></a>
+<span class="sourceLineNo">8402</span><a name="line.8402"></a>
+<span class="sourceLineNo">8403</span>    if (ret != null) {<a name="line.8403"></a>
+<span class="sourceLineNo">8404</span>      try {<a name="line.8404"></a>
+<span class="sourceLineNo">8405</span>        checkRow(ret, "calculated split");<a name="line.8405"></a>
+<span class="sourceLineNo">8406</span>      } catch (IOException e) {<a name="line.8406"></a>
+<span class="sourceLineNo">8407</span>        LOG.error("Ignoring invalid split", e);<a name="line.8407"></a>
+<span class="sourceLineNo">8408</span>        return null;<a name="line.8408"></a>
+<span class="sourceLineNo">8409</span>      }<a name="line.8409"></a>
+<span class="sourceLineNo">8410</span>    }<a name="line.8410"></a>
+<span class="sourceLineNo">8411</span>    return ret;<a name="line.8411"></a>
+<span class="sourceLineNo">8412</span>  }<a name="line.8412"></a>
+<span class="sourceLineNo">8413</span><a name="line.8413"></a>
+<span class="sourceLineNo">8414</span>  /**<a name="line.8414"></a>
+<span class="sourceLineNo">8415</span>   * @return The priority that this region should have in the compaction queue<a name="line.8415"></a>
+<span class="sourceLineNo">8416</span>   */<a name="line.8416"></a>
+<span class="sourceLineNo">8417</span>  public int getCompactPriority() {<a name="line.8417"></a>
+<span class="sourceLineNo">8418</span>    return stores.values().stream().mapToInt(HStore::getCompactPriority).min()<a name="line.8418"></a>
+<span class="sourceLineNo">8419</span>        .orElse(Store.NO_PRIORITY);<a name="line.8419"></a>
 <span class="sourceLineNo">8420</span>  }<a name="line.8420"></a>
 <span class="sourceLineNo">8421</span><a name="line.8421"></a>
-<span class="sourceLineNo">8422</span>  /** @param coprocessorHost the new coprocessor host */<a name="line.8422"></a>
-<span class="sourceLineNo">8423</span>  @VisibleForTesting<a name="line.8423"></a>
-<span class="sourceLineNo">8424</span>  public void setCoprocessorHost(final RegionCoprocessorHost coprocessorHost) {<a name="line.8424"></a>
-<span class="sourceLineNo">8425</span>    this.coprocessorHost = coprocessorHost;<a name="line.8425"></a>
-<span class="sourceLineNo">8426</span>  }<a name="line.8426"></a>
-<span class="sourceLineNo">8427</span><a name="line.8427"></a>
-<span class="sourceLineNo">8428</span>  @Override<a name="line.8428"></a>
-<span class="sourceLineNo">8429</span>  public void startRegionOperation() throws IOException {<a name="line.8429"></a>
-<span class="sourceLineNo">8430</span>    startRegionOperation(Operation.ANY);<a name="line.8430"></a>
+<span class="sourceLineNo">8422</span>  /** @return the coprocessor host */<a name="line.8422"></a>
+<span class="sourceLineNo">8423</span>  public RegionCoprocessorHost getCoprocessorHost() {<a name="line.8423"></a>
+<span class="sourceLineNo">8424</span>    return coprocessorHost;<a name="line.8424"></a>
+<span class="sourceLineNo">8425</span>  }<a name="line.8425"></a>
+<span class="sourceLineNo">8426</span><a name="line.8426"></a>
+<span class="sourceLineNo">8427</span>  /** @param coprocessorHost the new coprocessor host */<a name="line.8427"></a>
+<span class="sourceLineNo">8428</span>  @VisibleForTesting<a name="line.8428"></a>
+<span class="sourceLineNo">8429</span>  public void setCoprocessorHost(final RegionCoprocessorHost coprocessorHost) {<a name="line.8429"></a>
+<span class="sourceLineNo">8430</span>    this.coprocessorHost = coprocessorHost;<a name="line.8430"></a>
 <span class="sourceLineNo">8431</span>  }<a name="line.8431"></a>
 <span class="sourceLineNo">8432</span><a name="line.8432"></a>
 <span class="sourceLineNo">8433</span>  @Override<a name="line.8433"></a>
-<span class="sourceLineNo">8434</span>  public void startRegionOperation(Operation op) throws IOException {<a name="line.8434"></a>
-<span class="sourceLineNo">8435</span>    switch (op) {<a name="line.8435"></a>
-<span class="sourceLineNo">8436</span>      case GET:  // read operations<a name="line.8436"></a>
-<span class="sourceLineNo">8437</span>      case SCAN:<a name="line.8437"></a>
-<span class="sourceLineNo">8438</span>        checkReadsEnabled();<a name="line.8438"></a>
-<span class="sourceLineNo">8439</span>        break;<a name="line.8439"></a>
-<span class="sourceLineNo">8440</span>      default:<a name="line.8440"></a>
-<span class="sourceLineNo">8441</span>        break;<a name="line.8441"></a>
-<span class="sourceLineNo">8442</span>    }<a name="line.8442"></a>
-<span class="sourceLineNo">8443</span>    if (op == Operation.MERGE_REGION || op == Operation.SPLIT_REGION<a name="line.8443"></a>
-<span class="sourceLineNo">8444</span>        || op == Operation.COMPACT_REGION || op == Operation.COMPACT_SWITCH) {<a name="line.8444"></a>
-<span class="sourceLineNo">8445</span>      // split, merge or compact region doesn't need to check the closing/closed state or lock the<a name="line.8445"></a>
-<span class="sourceLineNo">8446</span>      // region<a name="line.8446"></a>
-<span class="sourceLineNo">8447</span>      return;<a name="line.8447"></a>
-<span class="sourceLineNo">8448</span>    }<a name="line.8448"></a>
-<span class="sourceLineNo">8449</span>    if (this.closing.get()) {<a name="line.8449"></a>
-<span class="sourceLineNo">8450</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closing");<a name="line.8450"></a>
-<span class="sourceLineNo">8451</span>    }<a name="line.8451"></a>
-<span class="sourceLineNo">8452</span>    lock(lock.readLock());<a name="line.8452"></a>
-<span class="sourceLineNo">8453</span>    if (this.closed.get()) {<a name="line.8453"></a>
-<span class="sourceLineNo">8454</span>      lock.readLock().unlock();<a name="line.8454"></a>
-<span class="sourceLineNo">8455</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closed");<a name="line.8455"></a>
+<span class="sourceLineNo">8434</span>  public void startRegionOperation() throws IOException {<a name="line.8434"></a>
+<span class="sourceLineNo">8435</span>    startRegionOperation(Operation.ANY);<a name="line.8435"></a>
+<span class="sourceLineNo">8436</span>  }<a name="line.8436"></a>
+<span class="sourceLineNo">8437</span><a name="line.8437"></a>
+<span class="sourceLineNo">8438</span>  @Override<a name="line.8438"></a>
+<span class="sourceLineNo">8439</span>  public void startRegionOperation(Operation op) throws IOException {<a name="line.8439"></a>
+<span class="sourceLineNo">8440</span>    switch (op) {<a name="line.8440"></a>
+<span class="sourceLineNo">8441</span>      case GET:  // read operations<a name="line.8441"></a>
+<span class="sourceLineNo">8442</span>      case SCAN:<a name="line.8442"></a>
+<span class="sourceLineNo">8443</span>        checkReadsEnabled();<a name="line.8443"></a>
+<span class="sourceLineNo">8444</span>        break;<a name="line.8444"></a>
+<span class="sourceLineNo">8445</span>      default:<a name="line.8445"></a>
+<span class="sourceLineNo">8446</span>        break;<a name="line.8446"></a>
+<span class="sourceLineNo">8447</span>    }<a name="line.8447"></a>
+<span class="sourceLineNo">8448</span>    if (op == Operation.MERGE_REGION || op == Operation.SPLIT_REGION<a name="line.8448"></a>
+<span class="sourceLineNo">8449</span>        || op == Operation.COMPACT_REGION || op == Operation.COMPACT_SWITCH) {<a name="line.8449"></a>
+<span class="sourceLineNo">8450</span>      // split, merge or compact region doesn't need to check the closing/closed state or lock the<a name="line.8450"></a>
+<span class="sourceLineNo">8451</span>      // region<a name="line.8451"></a>
+<span class="sourceLineNo">8452</span>      return;<a name="line.8452"></a>
+<span class="sourceLineNo">8453</span>    }<a name="line.8453"></a>
+<span class="sourceLineNo">8454</span>    if (this.closing.get()) {<a name="line.8454"></a>
+<span class="sourceLineNo">8455</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closing");<a name="line.8455"></a>
 <span class="sourceLineNo">8456</span>    }<a name="line.8456"></a>
-<span class="sourceLineNo">8457</span>    // The unit for snapshot is a region. So, all stores for this region must be<a name="line.8457"></a>
-<span class="sourceLineNo">8458</span>    // prepared for snapshot operation before proceeding.<a name="line.8458"></a>
-<span class="sourceLineNo">8459</span>    if (op == Operation.SNAPSHOT) {<a name="line.8459"></a>
-<span class="sourceLineNo">8460</span>      stores.values().forEach(HStore::preSnapshotOperation);<a name="line.8460"></a>
+<span class="sourceLineNo">8457</span>    lock(lock.readLock());<a name="line.8457"></a>
+<span class="sourceLineNo">8458</span>    if (this.closed.get()) {<a name="line.8458"></a>
+<span class="sourceLineNo">8459</span>      lock.readLock().unlock();<a name="line.8459"></a>
+<span class="sourceLineNo">8460</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closed");<a name="line.8460"></a>
 <span class="sourceLineNo">8461</span>    }<a name="line.8461"></a>
-<span class="sourceLineNo">8462</span>    try {<a name="line.8462"></a>
-<span class="sourceLineNo">8463</span>      if (coprocessorHost != null) {<a name="line.8463"></a>
-<span class="sourceLineNo">8464</span>        coprocessorHost.postStartRegionOperation(op);<a name="line.8464"></a>
-<span class="sourceLineNo">8465</span>      }<a name="line.8465"></a>
-<span class="sourceLineNo">8466</span>    } catch (Exception e) {<a name="line.8466"></a>
-<span class="sourceLineNo">8467</span>      lock.readLock().unlock();<a name="line.8467"></a>
-<span class="sourceLineNo">8468</span>      throw new IOException(e);<a name="line.8468"></a>
-<span class="sourceLineNo">8469</span>    }<a name="line.8469"></a>
-<span class="sourceLineNo">8470</span>  }<a name="line.8470"></a>
-<span class="sourceLineNo">8471</span><a name="line.8471"></a>
-<span class="sourceLineNo">8472</span>  @Override<a name="line.8472"></a>
-<span class="sourceLineNo">8473</span>  public void closeRegionOperation() throws IOException {<a name="line.8473"></a>
-<span class="sourceLineNo">8474</span>    closeRegionOperation(Operation.ANY);<a name="line.8474"></a>
+<span class="sourceLineNo">8462</span>    // The unit for snapshot is a region. So, all stores for this region must be<a name="line.8462"></a>
+<span class="sourceLineNo">8463</span>    // prepared for snapshot operation before proceeding.<a name="line.8463"></a>
+<span class="sourceLineNo">8464</span>    if (op == Operation.SNAPSHOT) {<a name="line.8464"></a>
+<span class="sourceLineNo">8465</span>      stores.values().forEach(HStore::preSnapshotOperation);<a name="line.8465"></a>
+<span class="sourceLineNo">8466</span>    }<a name="line.8466"></a>
+<span class="sourceLineNo">8467</span>    try {<a name="line.8467"></a>
+<span class="sourceLineNo">8468</span>      if (coprocessorHost != null) {<a name="line.8468"></a>
+<span class="sourceLineNo">8469</span>        coprocessorHost.postStartRegionOperation(op);<a name="line.8469"></a>
+<span class="sourceLineNo">8470</span>      }<a name="line.8470"></a>
+<span class="sourceLineNo">8471</span>    } catch (Exception e) {<a name="line.8471"></a>
+<span class="sourceLineNo">8472</span>      lock.readLock().unlock();<a name="line.8472"></a>
+<span class="sourceLineNo">8473</span>      throw new IOException(e);<a name="line.8473"></a>
+<span class="sourceLineNo">8474</span>    }<a name="line.8474"></a>
 <span class="sourceLineNo">8475</span>  }<a name="line.8475"></a>
 <span class="sourceLineNo">8476</span><a name="line.8476"></a>
 <span class="sourceLineNo">8477</span>  @Override<a name="line.8477"></a>
-<span class="sourceLineNo">8478</span>  public void closeRegionOperation(Operation operation) throws IOException {<a name="line.8478"></a>
-<span class="sourceLineNo">8479</span>    if (operation == Operation.SNAPSHOT) {<a name="line.8479"></a>
-<span class="sourceLineNo">8480</span>      stores.values().forEach(HStore::postSnapshotOperation);<a name="line.8480"></a>
-<span class="sourceLineNo">8481</span>    }<a name="line.8481"></a>
-<span class="sourceLineNo">8482</span>    lock.readLock().unlock();<a name="line.8482"></a>
-<span class="sourceLineNo">8483</span>    if (coprocessorHost != null) {<a name="line.8483"></a>
-<span class="sourceLineNo">8484</span>      coprocessorHost.postCloseRegionOperation(operation);<a name="line.8484"></a>
-<span class="sourceLineNo">8485</span>    }<a name="line.8485"></a>
-<span class="sourceLineNo">8486</span>  }<a name="line.8486"></a>
-<span class="sourceLineNo">8487</span><a name="line.8487"></a>
-<span class="sourceLineNo">8488</span>  /**<a name="line.8488"></a>
-<span class="sourceLineNo">8489</span>   * This method needs to be called before any public call that reads or<a name="line.8489"></a>
-<span class="sourceLineNo">8490</span>   * modifies stores in bulk. It has to be called just before a try.<a name="line.8490"></a>
-<span class="sourceLineNo">8491</span>   * #closeBulkRegionOperation needs to be called in the try's finally block<a name="line.8491"></a>
-<span class="sourceLineNo">8492</span>   * Acquires a writelock and checks if the region is closing or closed.<a name="line.8492"></a>
-<span class="sourceLineNo">8493</span>   * @throws NotServingRegionException when the region is closing or closed<a name="line.8493"></a>
-<span class="sourceLineNo">8494</span>   * @throws RegionTooBusyException if failed to get the lock in time<a name="line.8494"></a>
-<span class="sourceLineNo">8495</span>   * @throws InterruptedIOException if interrupted while waiting for a lock<a name="line.8495"></a>
-<span class="sourceLineNo">8496</span>   */<a name="line.8496"></a>
-<span class="sourceLineNo">8497</span>  private void startBulkRegionOperation(boolean writeLockNeeded)<a name="line.8497"></a>
-<span class="sourceLineNo">8498</span>      throws NotServingRegionException, RegionTooBusyException, InterruptedIOException {<a name="line.8498"></a>
-<span class="sourceLineNo">8499</span>    if (this.closing.get()) {<a name="line.8499"></a>
-<span class="sourceLineNo">8500</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closing");<a name="line.8500"></a>
-<span class="sourceLineNo">8501</span>    }<a name="line.8501"></a>
-<span class="sourceLineNo">8502</span>    if (writeLockNeeded) lock(lock.writeLock());<a name="line.8502"></a>
-<span class="sourceLineNo">8503</span>    else lock(lock.readLock());<a name="line.8503"></a>
-<span class="sourceLineNo">8504</span>    if (this.closed.get()) {<a name="line.8504"></a>
-<span class="sourceLineNo">8505</span>      if (writeLockNeeded) lock.writeLock().unlock();<a name="line.8505"></a>
-<span class="sourceLineNo">8506</span>      else lock.readLock().unlock();<a name="line.8506"></a>
-<span class="sourceLineNo">8507</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closed");<a name="line.8507"></a>
-<span class="sourceLineNo">8508</span>    }<a name="line.8508"></a>
-<span class="sourceLineNo">8509</span>  }<a name="line.8509"></a>
-<span class="sourceLineNo">8510</span><a name="line.8510"></a>
-<span class="sourceLineNo">8511</span>  /**<a name="line.8511"></a>
-<span class="sourceLineNo">8512</span>   * Closes the lock. This needs to be called in the finally block corresponding<a name="line.8512"></a>
-<span class="sourceLineNo">8513</span>   * to the try block of #startRegionOperation<a name="line.8513"></a>
-<span class="sourceLineNo">8514</span>   */<a name="line.8514"></a>
-<span class="sourceLineNo">8515</span>  private void closeBulkRegionOperation(){<a name="line.8515"></a>
-<span class="sourceLineNo">8516</span>    if (lock.writeLock().isHeldByCurrentThread()) lock.writeLock().unlock();<a name="line.8516"></a>
-<span class="sourceLineNo">8517</span>    else lock.readLock().unlock();<a name="line.8517"></a>
-<span class="sourceLineNo">8518</span>  }<a name="line.8518"></a>
-<span class="sourceLineNo">8519</span><a name="line.8519"></a>
-<span class="sourceLineNo">8520</span>  /**<a name="line.8520"></a>
-<span class="sourceLineNo">8521</span>   * Update LongAdders for number of puts without wal and the size of possible data loss.<a name="line.8521"></a>
-<span class="sourceLineNo">8522</span>   * These information are exposed by the region server metrics.<a name="line.8522"></a>
-<span class="sourceLineNo">8523</span>   */<a name="line.8523"></a>
-<span class="sourceLineNo">8524</span>  private void recordMutationWithoutWal(final Map&lt;byte [], List&lt;Cell&gt;&gt; familyMap) {<a name="line.8524"></a>
-<span class="sourceLineNo">8525</span>    numMutationsWithoutWAL.increment();<a name="line.8525"></a>
-<span class="sourceLineNo">8526</span>    if (numMutationsWithoutWAL.sum() &lt;= 1) {<a name="line.8526"></a>
-<span class="sourceLineNo">8527</span>      LOG.info("writing data to region " + this +<a name="line.8527"></a>
-<span class="sourceLineNo">8528</span>               " with WAL disabled. Data may be lost in the event of a crash.");<a name="line.8528"></a>
-<span class="sourceLineNo">8529</span>    }<a name="line.8529"></a>
-<span class="sourceLineNo">8530</span><a name="line.8530"></a>
-<span class="sourceLineNo">8531</span>    long mutationSize = 0;<a name="line.8531"></a>
-<span class="sourceLineNo">8532</span>    for (List&lt;Cell&gt; cells: familyMap.values()) {<a name="line.8532"></a>
-<span class="sourceLineNo">8533</span>      // Optimization: 'foreach' loop is not used. See:<a name="line.8533"></a>
-<span class="sourceLineNo">8534</span>      // HBASE-12023 HRegion.applyFamilyMapToMemstore creates too many iterator objects<a name="line.8534"></a>
-<span class="sourceLineNo">8535</span>      assert cells instanceof RandomAccess;<a name="line.8535"></a>
-<span class="sourceLineNo">8536</span>      int listSize = cells.size();<a name="line.8536"></a>
-<span class="sourceLineNo">8537</span>      for (int i=0; i &lt; listSize; i++) {<a name="line.8537"></a>
-<span class="sourceLineNo">8538</span>        Cell cell = cells.get(i);<a name="line.8538"></a>
-<span class="sourceLineNo">8539</span>        mutationSize += cell.getSerializedSize();<a name="line.8539"></a>
-<span class="sourceLineNo">8540</span>      }<a name="line.8540"></a>
-<span class="sourceLineNo">8541</span>    }<a name="line.8541"></a>
-<span class="sourceLineNo">8542</span><a name="line.8542"></a>
-<span class="sourceLineNo">8543</span>    dataInMemoryWithoutWAL.add(mutationSize);<a name="line.8543"></a>
-<span class="sourceLineNo">8544</span>  }<a name="line.8544"></a>
-<span class="sourceLineNo">8545</span><a name="line.8545"></a>
-<span class="sourceLineNo">8546</span>  private void lock(final Lock lock) throws RegionTooBusyException, InterruptedIOException {<a name="line.8546"></a>
-<span class="sourceLineNo">8547</span>    lock(lock, 1);<a name="line.8547"></a>
-<span class="sourceLineNo">8548</span>  }<a name="line.8548"></a>
-<span class="sourceLineNo">8549</span><a name="line.8549"></a>
-<span class="sourceLineNo">8550</span>  /**<a name="line.8550"></a>
-<span class="sourceLineNo">8551</span>   * Try to acquire a lock.  Throw RegionTooBusyException<a name="line.8551"></a>
-<span class="sourceLineNo">8552</span>   * if failed to get the lock in time. Throw InterruptedIOException<a name="line.8552"></a>
-<span class="sourceLineNo">8553</span>   * if interrupted while waiting for the lock.<a name="line.8553"></a>
-<span class="sourceLineNo">8554</span>   */<a name="line.8554"></a>
-<span class="sourceLineNo">8555</span>  private void lock(final Lock lock, final int multiplier)<a name="line.8555"></a>
-<span class="sourceLineNo">8556</span>      throws RegionTooBusyException, InterruptedIOException {<a name="line.8556"></a>
-<span class="sourceLineNo">8557</span>    try {<a name="line.8557"></a>
-<span class="sourceLineNo">8558</span>      final long waitTime = Math.min(maxBusyWaitDuration,<a name="line.8558"></a>
-<span class="sourceLineNo">8559</span>          busyWaitDuration * Math.min(multiplier, maxBusyWaitMultiplier));<a name="line.8559"></a>
-<span class="sourceLineNo">8560</span>      if (!lock.tryLock(waitTime, TimeUnit.MILLISECONDS)) {<a name="line.8560"></a>
-<span class="sourceLineNo">8561</span>        // Don't print millis. Message is used as a key over in<a name="line.8561"></a>
-<span class="sourceLineNo">8562</span>        // RetriesExhaustedWithDetailsException processing.<a name="line.8562"></a>
-<span class="sourceLineNo">8563</span>        throw new RegionTooBusyException("Failed to obtain lock; regionName=" +<a name="line.8563"></a>
-<span class="sourceLineNo">8564</span>            (this.getRegionInfo() == null? "unknown":<a name="line.8564"></a>
-<span class="sourceLineNo">8565</span>                this.getRegionInfo().getRegionNameAsString()) +<a name="line.8565"></a>
-<span class="sourceLineNo">8566</span>            ", server=" + (this.getRegionServerServices() == null? "unknown":<a name="line.8566"></a>
-<span class="sourceLineNo">8567</span>                this.getRegionServerServices().getServerName()));<a name="line.8567"></a>
-<span class="sourceLineNo">8568</span>      }<a name="line.8568"></a>
-<span class="sourceLineNo">8569</span>    } catch (InterruptedException ie) {<a name="line.8569"></a>
-<span class="sourceLineNo">8570</span>      LOG.info("Interrupted while waiting for a lock");<a name="line.8570"></a>
-<span class="sourceLineNo">8571</span>      InterruptedIOException iie = new InterruptedIOException();<a name="line.8571"></a>
-<span class="sourceLineNo">8572</span>      iie.initCause(ie);<a name="line.8572"></a>
-<span class="sourceLineNo">8573</span>      throw iie;<a name="line.8573"></a>
-<span class="sourceLineNo">8574</span>    }<a name="line.8574"></a>
-<span class="sourceLineNo">8575</span>  }<a name="line.8575"></a>
-<span class="sourceLineNo">8576</span><a name="line.8576"></a>
-<span class="sourceLineNo">8577</span>  /**<a name="line.8577"></a>
-<span class="sourceLineNo">8578</span>   * Calls sync with the given transaction ID<a name="line.8578"></a>
-<span class="sourceLineNo">8579</span>   * @param txid should sync up to which transaction<a name="line.8579"></a>
-<span class="sourceLineNo">8580</span>   * @throws IOException If anything goes wrong with DFS<a name="line.8580"></a>
-<span class="sourceLineNo">8581</span>   */<a name="line.8581"></a>
-<span class="sourceLineNo">8582</span>  private void sync(long txid, Durability durability) throws IOException {<a name="line.8582"></a>
-<span class="sourceLineNo">8583</span>    if (this.getRegionInfo().isMetaRegion()) {<a name="line.8583"></a>
-<span class="sourceLineNo">8584</span>      this.wal.sync(txid);<a name="line.8584"></a>
-<span class="sourceLineNo">8585</span>    } else {<a name="line.8585"></a>
-<span class="sourceLineNo">8586</span>      switch(durability) {<a name="line.8586"></a>
-<span class="sourceLineNo">8587</span>      case USE_DEFAULT:<a name="line.8587"></a>
-<span class="sourceLineNo">8588</span>        // do what table defaults to<a name="line.8588"></a>
-<span class="sourceLineNo">8589</span>        if (shouldSyncWAL()) {<a name="line.8589"></a>
-<span class="sourceLineNo">8590</span>          this.wal.sync(txid);<a name="line.8590"></a>
-<span class="sourceLineNo">8591</span>        }<a name="line.8591"></a>
-<span class="sourceLineNo">8592</span>        break;<a name="line.8592"></a>
-<span class="sourceLineNo">8593</span>      case SKIP_WAL:<a name="line.8593"></a>
-<span class="sourceLineNo">8594</span>        // nothing do to<a name="line.8594"></a>
-<span class="sourceLineNo">8595</span>        break;<a name="line.8595"></a>
-<span class="sourceLineNo">8596</span>      case ASYNC_WAL:<a name="line.8596"></a>
-<span class="sourceLineNo">8597</span>        // nothing do to<a name="line.8597"></a>
-<span class="sourceLineNo">8598</span>        break;<a name="line.8598"></a>
-<span class="sourceLineNo">8599</span>      case SYNC_WAL:<a name="line.8599"></a>
-<span class="sourceLineNo">8600</span>          this.wal.sync(txid, false);<a name="line.8600"></a>
-<span class="sourceLineNo">8601</span>          break;<a name="line.8601"></a>
-<span class="sourceLineNo">8602</span>      case FSYNC_WAL:<a name="line.8602"></a>
-<span class="sourceLineNo">8603</span>          this.wal.sync(txid, true);<a name="line.8603"></a>
-<span class="sourceLineNo">8604</span>          break;<a name="line.8604"></a>
-<span class="sourceLineNo">8605</span>      default:<a name="line.8605"></a>
-<span class="sourceLineNo">8606</span>        throw new RuntimeException("Unknown durability " + durability);<a name="line.8606"></a>
-<span class="sourceLineNo">8607</span>      }<a name="line.8607"></a>
-<span class="sourceLineNo">8608</span>    }<a name="line.8608"></a>
-<span class="sourceLineNo">8609</span>  }<a name="line.8609"></a>
-<span class="sourceLineNo">8610</span><a name="line.8610"></a>
-<span class="sourceLineNo">8611</span>  /**<a name="line.8611"></a>
-<span class="sourceLineNo">8612</span>   * Check whether we should sync the wal from the table's durability settings<a name="line.8612"></a>
-<span class="sourceLineNo">8613</span>   */<a name="line.8613"></a>
-<span class="sourceLineNo">8614</span>  private boolean shouldSyncWAL() {<a name="line.8614"></a>
-<span class="sourceLineNo">8615</span>    return regionDurability.ordinal() &gt;  Durability.ASYNC_WAL.ordinal();<a name="line.8615"></a>
-<span class="sourceLineNo">8616</span>  }<a name="line.8616"></a>
-<span class="sourceLineNo">8617</span><a name="line.8617"></a>
-<span class="sourceLineNo">8618</span>  /**<a name="line.8618"></a>
-<span class="sourceLineNo">8619</span>   * A mocked list implementation - discards all updates.<a name="line.8619"></a>
-<span class="sourceLineNo">8620</span>   */<a name="line.8620"></a>
-<span class="sourceLineNo">8621</span>  private static final List&lt;Cell&gt; MOCKED_LIST = new AbstractList&lt;Cell&gt;() {<a name="line.8621"></a>
+<span class="sourceLineNo">8478</span>  public void closeRegionOperation() throws IOException {<a name="line.8478"></a>
+<span class="sourceLineNo">8479</span>    closeRegionOperation(Operation.ANY);<a name="line.8479"></a>
+<span class="sourceLineNo">8480</span>  }<a name="line.8480"></a>
+<span class="sourceLineNo">8481</span><a name="line.8481"></a>
+<span class="sourceLineNo">8482</span>  @Override<a name="line.8482"></a>
+<span class="sourceLineNo">8483</span>  public void closeRegionOperation(Operation operation) throws IOException {<a name="line.8483"></a>
+<span class="sourceLineNo">8484</span>    if (operation == Operation.SNAPSHOT) {<a name="line.8484"></a>
+<span class="sourceLineNo">8485</span>      stores.values().forEach(HStore::postSnapshotOperation);<a name="line.8485"></a>
+<span class="sourceLineNo">8486</span>    }<a name="line.8486"></a>
+<span class="sourceLineNo">8487</span>    lock.readLock().unlock();<a name="line.8487"></a>
+<span class="sourceLineNo">8488</span>    if (coprocessorHost != null) {<a name="line.8488"></a>
+<span class="sourceLineNo">8489</span>      coprocessorHost.postCloseRegionOperation(operation);<a name="line.8489"></a>
+<span class="sourceLineNo">8490</span>    }<a name="line.8490"></a>
+<span class="sourceLineNo">8491</span>  }<a name="line.8491"></a>
+<span class="sourceLineNo">8492</span><a name="line.8492"></a>
+<span class="sourceLineNo">8493</span>  /**<a name="line.8493"></a>
+<span class="sourceLineNo">8494</span>   * This method needs to be called before any public call that reads or<a name="line.8494"></a>
+<span class="sourceLineNo">8495</span>   * modifies stores in bulk. It has to be called just before a try.<a name="line.8495"></a>
+<span class="sourceLineNo">8496</span>   * #closeBulkRegionOperation needs to be called in the try's finally block<a name="line.8496"></a>
+<span class="sourceLineNo">8497</span>   * Acquires a writelock and checks if the region is closing or closed.<a name="line.8497"></a>
+<span class="sourceLineNo">8498</span>   * @throws NotServingRegionException when the region is closing or closed<a name="line.8498"></a>
+<span class="sourceLineNo">8499</span>   * @throws RegionTooBusyException if failed to get the lock in time<a name="line.8499"></a>
+<span class="sourceLineNo">8500</span>   * @throws InterruptedIOException if interrupted while waiting for a lock<a name="line.8500"></a>
+<span class="sourceLineNo">8501</span>   */<a name="line.8501"></a>
+<span class="sourceLineNo">8502</span>  private void startBulkRegionOperation(boolean writeLockNeeded)<a name="line.8502"></a>
+<span class="sourceLineNo">8503</span>      throws NotServingRegionException, RegionTooBusyException, InterruptedIOException {<a name="line.8503"></a>
+<span class="sourceLineNo">8504</span>    if (this.closing.get()) {<a name="line.8504"></a>
+<span class="sourceLineNo">8505</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closing");<a name="line.8505"></a>
+<span class="sourceLineNo">8506</span>    }<a name="line.8506"></a>
+<span class="sourceLineNo">8507</span>    if (writeLockNeeded) lock(lock.writeLock());<a name="line.8507"></a>
+<span class="sourceLineNo">8508</span>    else lock(lock.readLock());<a name="line.8508"></a>
+<span class="sourceLineNo">8509</span>    if (this.closed.get()) {<a name="line.8509"></a>
+<span class="sourceLineNo">8510</span>      if (writeLockNeeded) lock.writeLock().unlock();<a name="line.8510"></a>
+<span class="sourceLineNo">8511</span>      else lock.readLock().unlock();<a name="line.8511"></a>
+<span class="sourceLineNo">8512</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closed");<a name="line.8512"></a>
+<span class="sourceLineNo">8513</span>    }<a name="line.8513"></a>
+<span class="sourceLineNo">8514</span>  }<a name="line.8514"></a>
+<span class="sourceLineNo">8515</span><a name="line.8515"></a>
+<span class="sourceLineNo">8516</span>  /**<a name="line.8516"></a>
+<span class="sourceLineNo">8517</span>   * Closes the lock. This needs to be called in the finally block corresponding<a name="line.8517"></a>
+<span class="sourceLineNo">8518</span>   * to the try block of #startRegionOperation<a name="line.8518"></a>
+<span class="sourceLineNo">8519</span>   */<a name="line.8519"></a>
+<span class="sourceLineNo">8520</span>  private void closeBulkRegionOperation(){<a name="line.8520"></a>
+<span class="sourceLineNo">8521</span>    if (lock.writeLock().isHeldByCurrentThread()) lock.writeLock().unlock();<a name="line.8521"></a>
+<span class="sourceLineNo">8522</span>    else lock.readLock().unlock();<a name="line.8522"></a>
+<span class="sourceLineNo">8523</span>  }<a name="line.8523"></a>
+<span class="sourceLineNo">8524</span><a name="line.8524"></a>
+<span class="sourceLineNo">8525</span>  /**<a name="line.8525"></a>
+<span class="sourceLineNo">8526</span>   * Update LongAdders for number of puts without wal and the size of possible data loss.<a name="line.8526"></a>
+<span class="sourceLineNo">8527</span>   * These information are exposed by the region server metrics.<a name="line.8527"></a>
+<span class="sourceLineNo">8528</span>   */<a name="line.8528"></a>
+<span class="sourceLineNo">8529</span>  private void recordMutationWithoutWal(final Map&lt;byte [], List&lt;Cell&gt;&gt; familyMap) {<a name="line.8529"></a>
+<span class="sourceLineNo">8530</span>    numMutationsWithoutWAL.increment();<a name="line.8530"></a>
+<span class="sourceLineNo">8531</span>    if (numMutationsWithoutWAL.sum() &lt;= 1) {<a name="line.8531"></a>
+<span class="sourceLineNo">8532</span>      LOG.info("writing data to region " + this +<a name="line.8532"></a>
+<span class="sourceLineNo">8533</span>               " with WAL disabled. Data may be lost in the event of a crash.");<a name="line.8533"></a>
+<span class="sourceLineNo">8534</span>    }<a name="line.8534"></a>
+<span class="sourceLineNo">8535</span><a name="line.8535"></a>
+<span class="sourceLineNo">8536</span>    long mutationSize = 0;<a name="line.8536"></a>
+<span class="sourceLineNo">8537</span>    for (List&lt;Cell&gt; cells: familyMap.values()) {<a name="line.8537"></a>
+<span class="sourceLineNo">8538</span>      // Optimization: 'foreach' loop is not used. See:<a name="line.8538"></a>
+<span class="sourceLineNo">8539</span>      // HBASE-12023 HRegion.applyFamilyMapToMemstore creates too many iterator objects<a name="line.8539"></a>
+<span class="sourceLineNo">8540</span>      assert cells instanceof RandomAccess;<a name="line.8540"></a>
+<span class="sourceLineNo">8541</span>      int listSize = cells.size();<a name="line.8541"></a>
+<span class="sourceLineNo">8542</span>      for (int i=0; i &lt; listSize; i++) {<a name="line.8542"></a>
+<span class="sourceLineNo">8543</span>        Cell cell = cells.get(i);<a name="line.8543"></a>
+<span class="sourceLineNo">8544</span>        mutationSize += cell.getSerializedSize();<a name="line.8544"></a>
+<span class="sourceLineNo">8545</span>      }<a name="line.8545"></a>
+<span class="sourceLineNo">8546</span>    }<a name="line.8546"></a>
+<span class="sourceLineNo">8547</span><a name="line.8547"></a>
+<span class="sourceLineNo">8548</span>    dataInMemoryWithoutWAL.add(mutationSize);<a name="line.8548"></a>
+<span class="sourceLineNo">8549</span>  }<a name="line.8549"></a>
+<span class="sourceLineNo">8550</span><a name="line.8550"></a>
+<span class="sourceLineNo">8551</span>  private void lock(final Lock lock) throws RegionTooBusyException, InterruptedIOException {<a name="line.8551"></a>
+<span class="sourceLineNo">8552</span>    lock(lock, 1);<a name="line.8552"></a>
+<span class="sourceLineNo">8553</span>  }<a name="line.8553"></a>
+<span class="sourceLineNo">8554</span><a name="line.8554"></a>
+<span class="sourceLineNo">8555</span>  /**<a name="line.8555"></a>
+<span class="sourceLineNo">8556</span>   * Try to acquire a lock.  Throw RegionTooBusyException<a name="line.8556"></a>
+<span class="sourceLineNo">8557</span>   * if failed to get the lock in time. Throw InterruptedIOException<a name="line.8557"></a>
+<span class="sourceLineNo">8558</span>   * if interrupted while waiting for the lock.<a name="line.8558"></a>
+<span class="sourceLineNo">8559</span>   */<a name="line.8559"></a>
+<span class="sourceLineNo">8560</span>  private void lock(final Lock lock, final int multiplier)<a name="line.8560"></a>
+<span class="sourceLineNo">8561</span>      throws RegionTooBusyException, InterruptedIOException {<a name="line.8561"></a>
+<span class="sourceLineNo">8562</span>    try {<a name="line.8562"></a>
+<span class="sourceLineNo">8563</span>      final long waitTime = Math.min(maxBusyWaitDuration,<a name="line.8563"></a>
+<span class="sourceLineNo">8564</span>          busyWaitDuration * Math.min(multiplier, maxBusyWaitMultiplier));<a name="line.8564"></a>
+<span class="sourceLineNo">8565</span>      if (!lock.tryLock(waitTime, TimeUnit.MILLISECONDS)) {<a name="line.8565"></a>
+<span class="sourceLineNo">8566</span>        // Don't print millis. Message is used as a key over in<a name="line.8566"></a>
+<span class="sourceLineNo">8567</span>        // RetriesExhaustedWithDetailsException processing.<a name="line.8567"></a>
+<span class="sourceLineNo">8568</span>        throw new RegionTooBusyException("Failed to obtain lock; regionName=" +<a name="line.8568"></a>
+<span class="sourceLineNo">8569</span>            (this.getRegionInfo() == null? "unknown":<a name="line.8569"></a>
+<span class="sourceLineNo">8570</span>                this.getRegionInfo().getRegionNameAsString()) +<a name="line.8570"></a>
+<span class="sourceLineNo">8571</span>            ", server=" + (this.getRegionServerServices() == null? "unknown":<a name="line.8571"></a>
+<span class="sourceLineNo">8572</span>                this.getRegionServerServices().getServerName()));<a name="line.8572"></a>
+<span class="sourceLineNo">8573</span>      }<a name="line.8573"></a>
+<span class="sourceLineNo">8574</span>    } catch (InterruptedException ie) {<a name="line.8574"></a>
+<span class="sourceLineNo">8575</span>      LOG.info("Interrupted while waiting for a lock");<a name="line.8575"></a>
+<span class="sourceLineNo">8576</span>      InterruptedIOException iie = new InterruptedIOException();<a name="line.8576"></a>
+<span class="sourceLineNo">8577</span>      iie.initCause(ie);<a name="line.8577"></a>
+<span class="sourceLineNo">8578</span>      throw iie;<a name="line.8578"></a>
+<span class="sourceLineNo">8579</span>    }<a name="line.8579"></a>
+<span class="sourceLineNo">8580</span>  }<a name="line.8580"></a>
+<span class="sourceLineNo">8581</span><a name="line.8581"></a>
+<span class="sourceLineNo">8582</span>  /**<a name="line.8582"></a>
+<span class="sourceLineNo">8583</span>   * Calls sync with the given transaction ID<a name="line.8583"></a>
+<span class="sourceLineNo">8584</span>   * @param txid should sync up to which transaction<a name="line.8584"></a>
+<span class="sourceLineNo">8585</span>   * @throws IOException If anything goes wrong with DFS<a name="line.8585"></a>
+<span class="sourceLineNo">8586</span>   */<a name="line.8586"></a>
+<span class="sourceLineNo">8587</span>  private void sync(long txid, Durability durability) throws IOException {<a name="line.8587"></a>
+<span class="sourceLineNo">8588</span>    if (this.getRegionInfo().isMetaRegion()) {<a name="line.8588"></a>
+<span class="sourceLineNo">8589</span>      this.wal.sync(txid);<a name="line.8589"></a>
+<span class="sourceLineNo">8590</span>    } else {<a name="line.8590"></a>
+<span class="sourceLineNo">8591</span>      switch(durability) {<a name="line.8591"></a>
+<span class="sourceLineNo">8592</span>      case USE_DEFAULT:<a name="line.8592"></a>
+<span class="sourceLineNo">8593</span>        // do what table defaults to<a name="line.8593"></a>
+<span class="sourceLineNo">8594</span>        if (shouldSyncWAL()) {<a name="line.8594"></a>
+<span class="sourceLineNo">8595</span>          this.wal.sync(txid);<a name="line.8595"></a>
+<span class="sourceLineNo">8596</span>        }<a name="line.8596"></a>
+<span class="sourceLineNo">8597</span>        break;<a name="line.8597"></a>
+<span class="sourceLineNo">8598</span>      case SKIP_WAL:<a name="line.8598"></a>
+<span class="sourceLineNo">8599</span>        // nothing do to<a name="line.8599"></a>
+<span class="sourceLineNo">8600</span>        break;<a name="line.8600"></a>
+<span class="sourceLineNo">8601</span>      case ASYNC_WAL:<a name="line.8601"></a>
+<span class="sourceLineNo">8602</span>        // nothing do to<a name="line.8602"></a>
+<span class="sourceLineNo">8603</span>        break;<a name="line.8603"></a>
+<span class="sourceLineNo">8604</span>      case SYNC_WAL:<a name="line.8604"></a>
+<span class="sourceLineNo">8605</span>          this.wal.sync(txid, false);<a name="line.8605"></a>
+<span class="sourceLineNo">8606</span>          break;<a name="line.8606"></a>
+<span class="sourceLineNo">8607</span>      case FSYNC_WAL:<a name="line.8607"></a>
+<span class="sourceLineNo">8608</span>          this.wal.sync(txid, true);<a name="line.8608"></a>
+<span class="sourceLineNo">8609</span>          break;<a name="line.8609"></a>
+<span class="sourceLineNo">8610</span>      default:<a name="line.8610"></a>
+<span class="sourceLineNo">8611</span>        throw new RuntimeException("Unknown durability " + durability);<a name="line.8611"></a>
+<span class="sourceLineNo">8612</span>      }<a name="line.8612"></a>
+<span class="sourceLineNo">8613</span>    }<a name="line.8613"></a>
+<span class="sourceLineNo">8614</span>  }<a name="line.8614"></a>
+<span class="sourceLineNo">8615</span><a name="line.8615"></a>
+<span class="sourceLineNo">8616</span>  /**<a name="line.8616"></a>
+<span class="sourceLineNo">8617</span>   * Check whether we should sync the wal from the table's durability settings<a name="line.8617"></a>
+<span class="sourceLineNo">8618</span>   */<a name="line.8618"></a>
+<span class="sourceLineNo">8619</span>  private boolean shouldSyncWAL() {<a name="line.8619"></a>
+<span class="sourceLineNo">8620</span>    return regionDurability.ordinal() &gt;  Durability.ASYNC_WAL.ordinal();<a name="line.8620"></a>
+<span class="sourceLineNo">8621</span>  }<a name="line.8621"></a>
 <span class="sourceLineNo">8622</span><a name="line.8622"></a>
-<span class="sourceLineNo">8623</span>    @Override<a name="line.8623"></a>
-<span class="sourceLineNo">8624</span>    public void add(int index, Cell element) {<a name="line.8624"></a>
-<span class="sourceLineNo">8625</span>      // do nothing<a name="line.8625"></a>
-<span class="sourceLineNo">8626</span>    }<a name="line.8626"></a>
+<span class="sourceLineNo">8623</span>  /**<a name="line.8623"></a>
+<span class="sourceLineNo">8624</span>   * A mocked list implementation - discards all updates.<a name="line.8624"></a>
+<span class="sourceLineNo">8625</span>   */<a name="line.8625"></a>
+<span class="sourceLineNo">8626</span>  private static final List&lt;Cell&gt; MOCKED_LIST = new AbstractList&lt;Cell&gt;() {<a name="line.8626"></a>
 <span class="sourceLineNo">8627</span><a name="line.8627"></a>
 <span class="sourceLineNo">8628</span>    @Override<a name="line.8628"></a>
-<span class="sourceLineNo">8629</span>    public boolean addAll(int index, Collection&lt;? extends Cell&gt; c) {<a name="line.8629"></a>
-<span class="sourceLineNo">8630</span>      return false; // this list is never changed as a result of an update<a name="line.8630"></a>
+<span class="sourceLineNo">8629</span>    public void add(int index, Cell element) {<a name="line.8629"></a>
+<span class="sourceLineNo">8630</span>      // do nothing<a name="line.8630"></a>
 <span class="sourceLineNo">8631</span>    }<a name="line.8631"></a>
 <span class="sourceLineNo">8632</span><a name="line.8632"></a>
 <span class="sourceLineNo">8633</span>    @Override<a name="line.8633"></a>
-<span class="sourceLineNo">8634</span>    public KeyValue get(int index) {<a name="line.8634"></a>
-<span class="sourceLineNo">8635</span>      throw new UnsupportedOperationException();<a name="line.8635"></a>
+<span class="sourceLineNo">8634</span>    public boolean addAll(int index, Collection&lt;? extends Cell&gt; c) {<a name="line.8634"></a>
+<span class="sourceLineNo">8635</span>      return false; // this list is never changed as a result of an update<a name="line.8635"></a>
 <span class="sourceLineNo">8636</span>    }<a name="line.8636"></a>
 <span class="sourceLineNo">8637</span><a name="line.8637"></a>
 <span class="sourceLineNo">8638</span>    @Override<a name="line.8638"></a>
-<span class="sourceLineNo">8639</span>    public int size() {<a name="line.8639"></a>
-<span class="sourceLineNo">8640</span>      return 0;<a name="line.8640"></a>
+<span class="sourceLineNo">8639</span>    public KeyValue get(int index) {<a name="line.8639"></a>
+<span class="sourceLineNo">8640</span>      throw new UnsupportedOperationException();<a name="line.8640"></a>
 <span class="sourceLineNo">8641</span>    }<a name="line.8641"></a>
-<span class="sourceLineNo">8642</span>  };<a name="line.8642"></a>
-<span class="sourceLineNo">8643</span><a name="line.8643"></a>
-<span class="sourceLineNo">8644</span>  /** @return the latest sequence number that was read from storage when this region was opened */<a name="line.8644"></a>
-<span class="sourceLineNo">8645</span>  public long getOpenSeqNum() {<a name="line.8645"></a>
-<span class="sourceLineNo">8646</span>    return this.openSeqNum;<a name="line.8646"></a>
-<span class="sourceLineNo">8647</span>  }<a name="line.8647"></a>
+<span class="sourceLineNo">8642</span><a name="line.8642"></a>
+<span class="sourceLineNo">8643</span>    @Override<a name="line.8643"></a>
+<span class="sourceLineNo">8644</span>    public int size() {<a name="line.8644"></a>
+<span class="sourceLineNo">8645</span>      return 0;<a name="line.8645"></a>
+<span class="sourceLineNo">8646</span>    }<a name="line.8646"></a>
+<span class="sourceLineNo">8647</span>  };<a name="line.8647"></a>
 <span class="sourceLineNo">8648</span><a name="line.8648"></a>
-<span class="sourceLineNo">8649</span>  @Override<a name="line.8649"></a>
-<span class="sourceLineNo">8650</span>  public Map&lt;byte[], Long&gt; getMaxStoreSeqId() {<a name="line.8650"></a>
-<span class="sourceLineNo">8651</span>    return this.maxSeqIdInStores;<a name="line.8651"></a>
+<span class="sourceLineNo">8649</span>  /** @return the latest sequence number that was read from storage when this region was opened */<a name="line.8649"></a>
+<span class="sourceLineNo">8650</span>  public long getOpenSeqNum() {<a name="line.8650"></a>
+<span class="sourceLineNo">8651</span>    return this.openSeqNum;<a name="line.8651"></a>
 <span class="sourceLineNo">8652</span>  }<a name="line.8652"></a>
 <span class="sourceLineNo">8653</span><a name="line.8653"></a>
-<span class="sourceLineNo">8654</span>  public long getOldestSeqIdOfStore(byte[] familyName) {<a name="line.8654"></a>
-<span class="sourceLineNo">8655</span>    return wal.getEarliestMemStoreSeqNum(getRegionInfo().getEncodedNameAsBytes(), familyName);<a name="line.8655"></a>
-<span class="sourceLineNo">8656</span>  }<a name="line.8656"></a>
-<span class="sourceLineNo">8657</span><a name="line.8657"></a>
-<span class="sourceLineNo">8658</span>  @Override<a name="line.8658"></a>
-<span class="sourceLineNo">8659</span>  public CompactionState getCompactionState() {<a name="line.8659"></a>
-<span class="sourceLineNo">8660</span>    boolean hasMajor = majorInProgress.get() &gt; 0, hasMinor = minorInProgress.get() &gt; 0;<a name="line.8660"></a>
-<span class="sourceLineNo">8661</span>    return (hasMajor ? (hasMinor ? CompactionState.MAJOR_AND_MINOR : CompactionState.MAJOR)<a name="line.8661"></a>
-<span class="sourceLineNo">8662</span>        : (hasMinor ? CompactionState.MINOR : CompactionState.NONE));<a name="line.8662"></a>
-<span class="sourceLineNo">8663</span>  }<a name="line.8663"></a>
-<span class="sourceLineNo">8664</span><a name="line.8664"></a>
-<span class="sourceLineNo">8665</span>  public void reportCompactionRequestStart(boolean isMajor){<a name="line.8665"></a>
-<span class="sourceLineNo">8666</span>    (isMajor ? majorInProgress : minorInProgress).incrementAndGet();<a name="line.8666"></a>
-<span class="sourceLineNo">8667</span>  }<a name="line.8667"></a>
-<span class="sourceLineNo">8668</span><a name="line.8668"></a>
-<span class="sourceLineNo">8669</span>  public void reportCompactionRequestEnd(boolean isMajor, int numFiles, long filesSizeCompacted) {<a name="line.8669"></a>
-<span class="sourceLineNo">8670</span>    int newValue = (isMajor ? majorInProgress : minorInProgress).decrementAndGet();<a name="line.8670"></a>
-<span class="sourceLineNo">8671</span><a name="line.8671"></a>
-<span class="sourceLineNo">8672</span>    // metrics<a name="line.8672"></a>
-<span class="sourceLineNo">8673</span>    compactionsFinished.increment();<a name="line.8673"></a>
-<span class="sourceLineNo">8674</span>    compactionNumFilesCompacted.add(numFiles);<a name="line.8674"></a>
-<span class="sourceLineNo">8675</span>    compactionNumBytesCompacted.add(filesSizeCompacted);<a name="line.8675"></a>
+<span class="sourceLineNo">8654</span>  @Override<a name="line.8654"></a>
+<span class="sourceLineNo">8655</span>  public Map&lt;byte[], Long&gt; getMaxStoreSeqId() {<a name="line.8655"></a>
+<span class="sourceLineNo">8656</span>    return this.maxSeqIdInStores;<a name="line.8656"></a>
+<span class="sourceLineNo">8657</span>  }<a name="line.8657"></a>
+<span class="sourceLineNo">8658</span><a name="line.8658"></a>
+<span class="sourceLineNo">8659</span>  public long getOldestSeqIdOfStore(byte[] familyName) {<a name="line.8659"></a>
+<span class="sourceLineNo">8660</span>    return wal.getEarliestMemStoreSeqNum(getRegionInfo().getEncodedNameAsBytes(), familyName);<a name="line.8660"></a>
+<span class="sourceLineNo">8661</span>  }<a name="line.8661"></a>
+<span class="sourceLineNo">8662</span><a name="line.8662"></a>
+<span class="sourceLineNo">8663</span>  @Override<a name="line.8663"></a>
+<span class="sourceLineNo">8664</span>  public CompactionState getCompactionState() {<a name="line.8664"></a>
+<span class="sourceLineNo">8665</span>    boolean hasMajor = majorInProgress.get() &gt; 0, hasMinor = minorInProgress.get() &gt; 0;<a name="line.8665"></a>
+<span class="sourceLineNo">8666</span>    return (hasMajor ? (hasMinor ? CompactionState.MAJOR_AND_MINOR : CompactionState.MAJOR)<a name="line.8666"></a>
+<span class="sourceLineNo">8667</span>        : (hasMinor ? CompactionState.MINOR : CompactionState.NONE));<a name="line.8667"></a>
+<span class="sourceLineNo">8668</span>  }<a name="line.8668"></a>
+<span class="sourceLineNo">8669</span><a name="line.8669"></a>
+<span class="sourceLineNo">8670</span>  public void reportCompactionRequestStart(boolean isMajor){<a name="line.8670"></a>
+<span class="sourceLineNo">8671</span>    (isMajor ? majorInProgress : minorInProgress).incrementAndGet();<a name="line.8671"></a>
+<span class="sourceLineNo">8672</span>  }<a name="line.8672"></a>
+<span class="sourceLineNo">8673</span><a name="line.8673"></a>
+<span class="sourceLineNo">8674</span>  public void reportCompactionRequestEnd(boolean isMajor, int numFiles, long filesSizeCompacted) {<a name="line.8674"></a>
+<span class="sourceLineNo">8675</span>    int newValue = (isMajor ? majorInProgress : minorInProgress).decrementAndGet();<a name="line.8675"></a>
 <span class="sourceLineNo">8676</span><a name="line.8676"></a>
-<span class="sourceLineNo">8677</span>    assert newValue &gt;= 0;<a name="line.8677"></a>
-<span class="sourceLineNo">8678</span>  }<a name="line.8678"></a>
-<span class="sourceLineNo">8679</span><a name="line.8679"></a>
-<span class="sourceLineNo">8680</span>  public void reportCompactionRequestFailure() {<a name="line.8680"></a>
-<span class="sourceLineNo">8681</span>    compactionsFailed.increment();<a name="line.8681"></a>
-<span class="sourceLineNo">8682</span>  }<a name="line.8682"></a>
-<span class="sourceLineNo">8683</span><a name="line.8683"></a>
-<span class="sourceLineNo">8684</span>  public void incrementCompactionsQueuedCount() {<a name="line.8684"></a>
-<span class="sourceLineNo">8685</span>    compactionsQueued.increment();<a name="line.8685"></a>
-<span class="sourceLineNo">8686</span>  }<a name="line.8686"></a>
-<span class="sourceLineNo">8687</span><a name="line.8687"></a>
-<span class="sourceLineNo">8688</span>  public void decrementCompactionsQueuedCount() {<a name="line.8688"></a>
-<span class="sourceLineNo">8689</span>    compactionsQueued.decrement();<a name="line.8689"></a>
-<span class="sourceLineNo">8690</span>  }<a name="line.8690"></a>
-<span class="sourceLineNo">8691</span><a name="line.8691"></a>
-<span class="sourceLineNo">8692</span>  public void incrementFlushesQueuedCount() {<a name="line.8692"></a>
-<span class="sourceLineNo">8693</span>    flushesQueued.increment();<a name="line.8693"></a>
-<span class="sourceLineNo">8694</span>  }<a name="line.8694"></a>
-<span class="sourceLineNo">8695</span><a name="line.8695"></a>
-<span class="sourceLineNo">8696</span>  @VisibleForTesting<a name="line.8696"></a>
-<span class="sourceLineNo">8697</span>  public long getReadPoint() {<a name="line.8697"></a>
-<span class="sourceLineNo">8698</span>    return getReadPoint(IsolationLevel.READ_COMMITTED);<a name="line.8698"></a>
+<span class="sourceLineNo">8677</span>    // metrics<a name="line.8677"></a>
+<span class="sourceLineNo">8678</span>    compactionsFinished.increment();<a name="line.8678"></a>
+<span class="sourceLineNo">8679</span>    compactionNumFilesCompacted.add(numFiles);<a name="line.8679"></a>
+<span class="sourceLineNo">8680</span>    compactionNumBytesCompacted.add(filesSizeCompacted);<a name="line.8680"></a>
+<span class="sourceLineNo">8681</span><a name="line.8681"></a>
+<span class="sourceLineNo">8682</span>    assert newValue &gt;= 0;<a name="line.8682"></a>
+<span class="sourceLineNo">8683</span>  }<a name="line.8683"></a>
+<span class="sourceLineNo">8684</span><a name="line.8684"></a>
+<span class="sourceLineNo">8685</span>  public void reportCompactionRequestFailure() {<a name="line.8685"></a>
+<span class="sourceLineNo">8686</span>    compactionsFailed.increment();<a name="line.8686"></a>
+<span class="sourceLineNo">8687</span>  }<a name="line.8687"></a>
+<span class="sourceLineNo">8688</span><a name="line.8688"></a>
+<span class="sourceLineNo">8689</span>  public void incrementCompactionsQueuedCount() {<a name="line.8689"></a>
+<span class="sourceLineNo">8690</span>    compactionsQueued.increment();<a name="line.8690"></a>
+<span class="sourceLineNo">8691</span>  }<a name="line.8691"></a>
+<span class="sourceLineNo">8692</span><a name="line.8692"></a>
+<span class="sourceLineNo">8693</span>  public void decrementCompactionsQueuedCount() {<a name="line.8693"></a>
+<span class="sourceLineNo">8694</span>    compactionsQueued.decrement();<a name="line.8694"></a>
+<span class="sourceLineNo">8695</span>  }<a name="line.8695"></a>
+<span class="sourceLineNo">8696</span><a name="line.8696"></a>
+<span class="sourceLineNo">8697</span>  public void incrementFlushesQueuedCount() {<a name="line.8697"></a>
+<span class="sourceLineNo">8698</span>    flushesQueued.increment();<a name="line.8698"></a>
 <span class="sourceLineNo">8699</span>  }<a name="line.8699"></a>
 <span class="sourceLineNo">8700</span><a name="line.8700"></a>
-<span class="sourceLineNo">8701</span>  /**<a name="line.8701"></a>
-<span class="sourceLineNo">8702</span>   * {@inheritDoc}<a name="line.8702"></a>
-<span class="sourceLineNo">8703</span>   */<a name="line.8703"></a>
-<span class="sourceLineNo">8704</span>  @Override<a name="line.8704"></a>
-<span class="sourceLineNo">8705</span>  public void onConfigurationChange(Configuration conf) {<a name="line.8705"></a>
-<span class="sourceLineNo">8706</span>    this.storeHotnessProtector.update(conf);<a name="line.8706"></a>
-<span class="sourceLineNo">8707</span>  }<a name="line.8707"></a>
-<span class="sourceLineNo">8708</span><a name="line.8708"></a>
-<span class="sourceLineNo">8709</span>  /**<a name="line.8709"></a>
-<span class="sourceLineNo">8710</span>   * {@inheritDoc}<a name="line.8710"></a>
-<span class="sourceLineNo">8711</span>   */<a name="line.8711"></a>
-<span class="sourceLineNo">8712</span>  @Override<a name="line.8712"></a>
-<span class="sourceLineNo">8713</span>  public void registerChildren(ConfigurationManager manager) {<a name="line.8713"></a>
-<span class="sourceLineNo">8714</span>    configurationManager = Optional.of(manager);<a name="line.8714"></a>
-<span class="sourceLineNo">8715</span>    stores.values().forEach(manager::registerObserver);<a name="line.8715"></a>
-<span class="sourceLineNo">8716</span>  }<a name="line.8716"></a>
-<span class="sourceLineNo">8717</span><a name="line.8717"></a>
-<span class="sourceLineNo">8718</span>  /**<a name="line.8718"></a>
-<span class="sourceLineNo">8719</span>   * {@inheritDoc}<a name="line.8719"></a>
-<span class="sourceLineNo">8720</span>   */<a name="line.8720"></a>
-<span class="sourceLineNo">8721</span>  @Override<a name="line.8721"></a>
-<span class="sourceLineNo">8722</span>  public void deregisterChildren(ConfigurationManager manager) {<a name="line.8722"></a>
-<span class="sourceLineNo">8723</span>    stores.values().forEach(configurationManager.get()::deregisterObserver);<a name="line.8723"></a>
-<span class="sourceLineNo">8724</span>  }<a name="line.8724"></a>
-<span class="sourceLineNo">8725</span><a name="line.8725"></a>
+<span class="sourceLineNo">8701</span>  @VisibleForTesting<a name="line.8701"></a>
+<span class="sourceLineNo">8702</span>  public long getReadPoint() {<a name="line.8702"></a>
+<span class="sourceLineNo">8703</span>    return getReadPoint(IsolationLevel.READ_COMMITTED);<a name="line.8703"></a>
+<span class="sourceLineNo">8704</span>  }<a name="line.8704"></a>
+<span class="sourceLineNo">8705</span><a name="line.8705"></a>
+<span class="sourceLineNo">8706</span>  /**<a name="line.8706"></a>
+<span class="sourceLineNo">8707</span>   * {@inheritDoc}<a name="line.8707"></a>
+<span class="sourceLineNo">8708</span>   */<a name="line.8708"></a>
+<span class="sourceLineNo">8709</span>  @Override<a name="line.8709"></a>
+<span class="sourceLineNo">8710</span>  public void onConfigurationChange(Configuration conf) {<a name="line.8710"></a>
+<span class="sourceLineNo">8711</span>    this.storeHotnessProtector.update(conf);<a name="line.8711"></a>
+<span class="sourceLineNo">8712</span>  }<a name="line.8712"></a>
+<span class="sourceLineNo">8713</span><a name="line.8713"></a>
+<span class="sourceLineNo">8714</span>  /**<a name="line.8714"></a>
+<span class="sourceLineNo">8715</span>   * {@inheritDoc}<a name="line.8715"></a>
+<span class="sourceLineNo">8716</span>   */<a name="line.8716"></a>
+<span class="sourceLineNo">8717</span>  @Override<a name="line.8717"></a>
+<span class="sourceLineNo">8718</span>  public void registerChildren(ConfigurationManager manager) {<a name="line.8718"></a>
+<span class="sourceLineNo">8719</span>    configurationManager = Optional.of(manager);<a name="line.8719"></a>
+<span class="sourceLineNo">8720</span>    stores.values().forEach(manager::registerObserver);<a name="line.8720"></a>
+<span class="sourceLineNo">8721</span>  }<a name="line.8721"></a>
+<span class="sourceLineNo">8722</span><a name="line.8722"></a>
+<span class="sourceLineNo">8723</span>  /**<a name="line.8723"></a>
+<span class="sourceLineNo">8724</span>   * {@inheritDoc}<a name="line.8724"></a>
+<span class="sourceLineNo">8725</span>   */<a name="line.8725"></a>
 <span class="sourceLineNo">8726</span>  @Override<a name="line.8726"></a>
-<span class="sourceLineNo">8727</span>  public CellComparator getCellComparator() {<a name="line.8727"></a>
-<span class="sourceLineNo">8728</span>    return this.getRegionInfo().isMetaRegion() ? CellComparatorImpl.META_COMPARATOR<a name="line.8728"></a>
-<span class="sourceLineNo">8729</span>        : CellComparatorImpl.COMPARATOR;<a name="line.8729"></a>
-<span class="sourceLineNo">8730</span>  }<a name="line.8730"></a>
-<span class="sourceLineNo">8731</span><a name="line.8731"></a>
-<span class="sourceLineNo">8732</span>  public long getMemStoreFlushSize() {<a name="line.8732"></a>
-<span class="sourceLineNo">8733</span>    return this.memstoreFlushSize;<a name="line.8733"></a>
-<span class="sourceLineNo">8734</span>  }<a name="line.8734"></a>
-<span class="sourceLineNo">8735</span><a name="line.8735"></a>
+<span class="sourceLineNo">8727</span>  public void deregisterChildren(ConfigurationManager manager) {<a name="line.8727"></a>
+<span class="sourceLineNo">8728</span>    stores.values().forEach(configurationManager.get()::deregisterObserver);<a name="line.8728"></a>
+<span class="sourceLineNo">8729</span>  }<a name="line.8729"></a>
+<span class="sourceLineNo">8730</span><a name="line.8730"></a>
+<span class="sourceLineNo">8731</span>  @Override<a name="line.8731"></a>
+<span class="sourceLineNo">8732</span>  public CellComparator getCellComparator() {<a name="line.8732"></a>
+<span class="sourceLineNo">8733</span>    return this.getRegionInfo().isMetaRegion() ? CellComparatorImpl.META_COMPARATOR<a name="line.8733"></a>
+<span class="sourceLineNo">8734</span>        : CellComparatorImpl.COMPARATOR;<a name="line.8734"></a>
+<span class="sourceLineNo">8735</span>  }<a name="line.8735"></a>
 <span class="sourceLineNo">8736</span><a name="line.8736"></a>
-<span class="sourceLineNo">8737</span>  //// method for debugging tests<a name="line.8737"></a>
-<span class="sourceLineNo">8738</span>  void throwException(String title, String regionName) {<a name="line.8738"></a>
-<span class="sourceLineNo">8739</span>    StringBuilder buf = new StringBuilder();<a name="line.8739"></a>
-<span class="sourceLineNo">8740</span>    buf.append(title + ", ");<a name="line.8740"></a>
-<span class="sourceLineNo">8741</span>    buf.append(getRegionInfo().toString());<a name="line.8741"></a>
-<span class="sourceLineNo">8742</span>    buf.append(getRegionInfo().isMetaRegion() ? " meta region " : " ");<a name="line.8742"></a>
-<span class="sourceLineNo">8743</span>    buf.append("stores: ");<a name="line.8743"></a>
-<span class="sourceLineNo">8744</span>    for (HStore s : stores.values()) {<a name="line.8744"></a>
-<span class="sourceLineNo">8745</span>      buf.append(s.getColumnFamilyDescriptor().getNameAsString());<a name="line.8745"></a>
-<span class="sourceLineNo">8746</span>      buf.append(" size: ");<a name="line.8746"></a>
-<span class="sourceLineNo">8747</span>      buf.append(s.getMemStoreSize().getDataSize());<a name="line.8747"></a>
-<span class="sourceLineNo">8748</span>      buf.append(" ");<a name="line.8748"></a>
-<span class="sourceLineNo">8749</span>    }<a name="line.8749"></a>
-<span class="sourceLineNo">8750</span>    buf.append("end-of-stores");<a name="line.8750"></a>
-<span class="sourceLineNo">8751</span>    buf.append(", memstore size ");<a name="line.8751"></a>
-<span class="sourceLineNo">8752</span>    buf.append(getMemStoreDataSize());<a name="line.8752"></a>
-<span class="sourceLineNo">8753</span>    if (getRegionInfo().getRegionNameAsString().startsWith(regionName)) {<a name="line.8753"></a>
-<span class="sourceLineNo">8754</span>      throw new RuntimeException(buf.toString());<a name="line.8754"></a>
-<span class="sourceLineNo">8755</span>    }<a name="line.8755"></a>
-<span class="sourceLineNo">8756</span>  }<a name="line.8756"></a>
-<span class="sourceLineNo">8757</span><a name="line.8757"></a>
-<span class="sourceLineNo">8758</span>  @Override<a name="line.8758"></a>
-<span class="sourceLineNo">8759</span>  public void requestCompaction(String why, int priority, boolean major,<a name="line.8759"></a>
-<span class="sourceLineNo">8760</span>      CompactionLifeCycleTracker tracker) throws IOException {<a name="line.8760"></a>
-<span class="sourceLineNo">8761</span>    if (major) {<a name="line.8761"></a>
-<span class="sourceLineNo">8762</span>      stores.values().forEach(HStore::triggerMajorCompaction);<a name="line.8762"></a>
-<span class="sourceLineNo">8763</span>    }<a name="line.8763"></a>
-<span class="sourceLineNo">8764</span>    rsServices.getCompactionRequestor().requestCompaction(this, why, priority, tracker,<a name="line.8764"></a>
-<span class="sourceLineNo">8765</span>        RpcServer.getRequestUser().orElse(null));<a name="line.8765"></a>
-<span class="sourceLineNo">8766</span>  }<a name="line.8766"></a>
-<span class="sourceLineNo">8767</span><a name="line.8767"></a>
-<span class="sourceLineNo">8768</span>  @Override<a name="line.8768"></a>
-<span class="sourceLineNo">8769</span>  public void requestCompaction(byte[] family, String why, int priority, boolean major,<a name="line.8769"></a>
-<span class="sourceLineNo">8770</span>      CompactionLifeCycleTracker tracker) throws IOException {<a name="line.8770"></a>
-<span class="sourceLineNo">8771</span>    HStore store = stores.get(family);<a name="line.8771"></a>
-<span class="sourceLineNo">8772</span>    if (store == null) {<a name="line.8772"></a>
-<span class="sourceLineNo">8773</span>      throw new NoSuchColumnFamilyException("column family " + Bytes.toString(family) +<a name="line.8773"></a>
-<span class="sourceLineNo">8774</span>          " does not exist in region " + getRegionInfo().getRegionNameAsString());<a name="line.8774"></a>
-<span class="sourceLineNo">8775</span>    }<a name="line.8775"></a>
-<span class="sourceLineNo">8776</span>    if (major) {<a name="line.8776"></a>
-<span class="sourceLineNo">8777</span>      store.triggerMajorCompaction();<a name="line.8777"></a>
-<span class="sourceLineNo">8778</span>    }<a name="line.8778"></a>
-<span class="sourceLineNo">8779</span>    rsServices.getCompactionRequestor().requestCompaction(this, store, why, priority, tracker,<a name="line.8779"></a>
-<span class="sourceLineNo">8780</span>        RpcServer.getRequestUser().orElse(null));<a name="line.8780"></a>
-<span class="sourceLineNo">8781</span>  }<a name="line.8781"></a>
-<span class="sourceLineNo">8782</span><a name="line.8782"></a>
-<span class="sourceLineNo">8783</span>  private void requestFlushIfNeeded() throws RegionTooBusyException {<a name="line.8783"></a>
-<span class="sourceLineNo">8784</span>    if(isFlushSize(this.memStoreSizing.getMemStoreSize())) {<a name="line.8784"></a>
-<span class="sourceLineNo">8785</span>      requestFlush();<a name="line.8785"></a>
-<span class="sourceLineNo">8786</span>    }<a name="line.8786"></a>
-<span class="sourceLineNo">8787</span>  }<a name="line.8787"></a>
-<span class="sourceLineNo">8788</span><a name="line.8788"></a>
-<span class="sourceLineNo">8789</span>  private void requestFlush() {<a name="line.8789"></a>
-<span class="sourceLineNo">8790</span>    if (this.rsServices == null) {<a name="line.8790"></a>
-<span class="sourceLineNo">8791</span>      return;<a name="line.8791"></a>
-<span class="sourceLineNo">8792</span>    }<a name="line.8792"></a>
-<span class="sourceLineNo">8793</span>    requestFlush0(FlushLifeCycleTracker.DUMMY);<a name="line.8793"></a>
-<span class="sourceLineNo">8794</span>  }<a name="line.8794"></a>
-<span class="sourceLineNo">8795</span><a name="line.8795"></a>
-<span class="sourceLineNo">8796</span>  private void requestFlush0(FlushLifeCycleTracker tracker) {<a name="line.8796"></a>
-<span class="sourceLineNo">8797</span>    boolean shouldFlush = false;<a name="line.8797"></a>
-<span class="sourceLineNo">8798</span>    synchronized (writestate) {<a name="line.8798"></a>
-<span class="sourceLineNo">8799</span>      if (!this.writestate.isFlushRequested()) {<a name="line.8799"></a>
-<span class="sourceLineNo">8800</span>        shouldFlush = true;<a name="line.8800"></a>
-<span class="sourceLineNo">8801</span>        writestate.flushRequested = true;<a name="line.8801"></a>
-<span class="sourceLineNo">8802</span>      }<a name="line.8802"></a>
-<span class="sourceLineNo">8803</span>    }<a name="line.8803"></a>
-<span class="sourceLineNo">8804</span>    if (shouldFlush) {<a name="line.8804"></a>
-<span class="sourceLineNo">8805</span>      // Make request outside of synchronize block; HBASE-818.<a name="line.8805"></a>
-<span class="sourceLineNo">8806</span>      this.rsServices.getFlushRequester().requestFlush(this, false, tracker);<a name="line.8806"></a>
-<span class="sourceLineNo">8807</span>      if (LOG.isDebugEnabled()) {<a name="line.8807"></a>
-<span class="sourceLineNo">8808</span>        LOG.debug("Flush requested on " + this.getRegionInfo().getEncodedName());<a name="line.8808"></a>
-<span class="sourceLineNo">8809</span>      }<a name="line.8809"></a>
-<span class="sourceLineNo">8810</span>    } else {<a name="line.8810"></a>
-<span class="sourceLineNo">8811</span>      tracker.notExecuted("Flush already requested on " + this);<a name="line.8811"></a>
-<span class="sourceLineNo">8812</span>    }<a name="line.8812"></a>
-<span class="sourceLineNo">8813</span>  }<a name="line.8813"></a>
-<span class="sourceLineNo">8814</span><a name="line.8814"></a>
-<span class="sourceLineNo">8815</span>  @Override<a name="line.8815"></a>
-<span class="sourceLineNo">8816</span>  public void requestFlush(FlushLifeCycleTracker tracker) throws IOException {<a name="line.8816"></a>
-<span class="sourceLineNo">8817</span>    requestFlush0(tracker);<a name="line.8817"></a>
+<span class="sourceLineNo">8737</span>  public long getMemStoreFlushSize() {<a name="line.8737"></a>
+<span class="sourceLineNo">8738</span>    return this.memstoreFlushSize;<a name="line.8738"></a>
+<span class="sourceLineNo">8739</span>  }<a name="line.8739"></a>
+<span class="sourceLineNo">8740</span><a name="line.8740"></a>
+<span class="sourceLineNo">8741</span><a name="line.8741"></a>
+<span class="sourceLineNo">8742</span>  //// method for debugging tests<a name="line.8742"></a>
+<span class="sourceLineNo">8743</span>  void throwException(String title, String regionName) {<a name="line.8743"></a>
+<span class="sourceLineNo">8744</span>    StringBuilder buf = new StringBuilder();<a name="line.8744"></a>
+<span class="sourceLineNo">8745</span>    buf.append(title + ", ");<a name="line.8745"></a>
+<span class="sourceLineNo">8746</span>    buf.append(getRegionInfo().toString());<a name="line.8746"></a>
+<span class="sourceLineNo">8747</span>    buf.append(getRegionInfo().isMetaRegion() ? " meta region " : " ");<a name="line.8747"></a>
+<span class="sourceLineNo">8748</span>    buf.append("stores: ");<a name="line.8748"></a>
+<span class="sourceLineNo">8749</span>    for (HStore s : stores.values()) {<a name="line.8749"></a>
+<span class="sourceLineNo">8750</span>      buf.append(s.getColumnFamilyDescriptor().getNameAsString());<a name="line.8750"></a>
+<span class="sourceLineNo">8751</span>      buf.append(" size: ");<a name="line.8751"></a>
+<span class="sourceLineNo">8752</span>      buf.append(s.getMemStoreSize().getDataSize());<a name="line.8752"></a>
+<span class="sourceLineNo">8753</span>      buf.append(" ");<a name="line.8753"></a>
+<span class="sourceLineNo">8754</span>    }<a name="line.8754"></a>
+<span class="sourceLineNo">8755</span>    buf.append("end-of-stores");<a name="line.8755"></a>
+<span class="sourceLineNo">8756</span>    buf.append(", memstore size ");<a name="line.8756"></a>
+<span class="sourceLineNo">8757</span>    buf.append(getMemStoreDataSize());<a name="line.8757"></a>
+<span class="sourceLineNo">8758</span>    if (getRegionInfo().getRegionNameAsString().startsWith(regionName)) {<a name="line.8758"></a>
+<span class="sourceLineNo">8759</span>      throw new RuntimeException(buf.toString());<a name="line.8759"></a>
+<span class="sourceLineNo">8760</span>    }<a name="line.8760"></a>
+<span class="sourceLineNo">8761</span>  }<a name="line.8761"></a>
+<span class="sourceLineNo">8762</span><a name="line.8762"></a>
+<span class="sourceLineNo">8763</span>  @Override<a name="line.8763"></a>
+<span class="sourceLineNo">8764</span>  public void requestCompaction(String why, int priority, boolean major,<a name="line.8764"></a>
+<span class="sourceLineNo">8765</span>      CompactionLifeCycleTracker tracker) throws IOException {<a name="line.8765"></a>
+<span class="sourceLineNo">8766</span>    if (major) {<a name="line.8766"></a>
+<span class="sourceLineNo">8767</span>      stores.values().forEach(HStore::triggerMajorCompaction);<a name="line.8767"></a>
+<span class="sourceLineNo">8768</span>    }<a name="line.8768"></a>
+<span class="sourceLineNo">8769</span>    rsServices.getCompactionRequestor().requestCompaction(this, why, priority, tracker,<a name="line.8769"></a>
+<span class="sourceLineNo">8770</span>        RpcServer.getRequestUser().orElse(null));<a name="line.8770"></a>
+<span class="sourceLineNo">8771</span>  }<a name="line.8771"></a>
+<span class="sourceLineNo">8772</span><a name="line.8772"></a>
+<span class="sourceLineNo">8773</span>  @Override<a name="line.8773"></a>
+<span class="sourceLineNo">8774</span>  public void requestCompaction(byte[] family, String why, int priority, boolean major,<a name="line.8774"></a>
+<span class="sourceLineNo">8775</span>      CompactionLifeCycleTracker tracker) throws IOException {<a name="line.8775"></a>
+<span class="sourceLineNo">8776</span>    HStore store = stores.get(family);<a name="line.8776"></a>
+<span class="sourceLineNo">8777</span>    if (store == null) {<a name="line.8777"></a>
+<span class="sourceLineNo">8778</span>      throw new NoSuchColumnFamilyException("column family " + Bytes.toString(family) +<a name="line.8778"></a>
+<span class="sourceLineNo">8779</span>          " does not exist in region " + getRegionInfo().getRegionNameAsString());<a name="line.8779"></a>
+<span class="sourceLineNo">8780</span>    }<a name="line.8780"></a>
+<span class="sourceLineNo">8781</span>    if (major) {<a name="line.8781"></a>
+<span class="sourceLineNo">8782</span>      store.triggerMajorCompaction();<a name="line.8782"></a>
+<span class="sourceLineNo">8783</span>    }<a name="line.8783"></a>
+<span class="sourceLineNo">8784</span>    rsServices.getCompactionRequestor().requestCompaction(this, store, why, priority, tracker,<a name="line.8784"></a>
+<span class="sourceLineNo">8785</span>        RpcServer.getRequestUser().orElse(null));<a name="line.8785"></a>
+<span class="sourceLineNo">8786</span>  }<a name="line.8786"></a>
+<span class="sourceLineNo">8787</span><a name="line.8787"></a>
+<span class="sourceLineNo">8788</span>  private void requestFlushIfNeeded() throws RegionTooBusyException {<a name="line.8788"></a>
+<span class="sourceLineNo">8789</span>    if(isFlushSize(this.memStoreSizing.getMemStoreSize())) {<a name="line.8789"></a>
+<span class="sourceLineNo">8790</span>      requestFlush();<a name="line.8790"></a>
+<span class="sourceLineNo">8791</span>    }<a name="line.8791"></a>
+<span class="sourceLineNo">8792</span>  }<a name="line.8792"></a>
+<span class="sourceLineNo">8793</span><a name="line.8793"></a>
+<span class="sourceLineNo">8794</span>  private void requestFlush() {<a name="line.8794"></a>
+<span class="sourceLineNo">8795</span>    if (this.rsServices == null) {<a name="line.8795"></a>
+<span class="sourceLineNo">8796</span>      return;<a name="line.8796"></a>
+<span class="sourceLineNo">8797</span>    }<a name="line.8797"></a>
+<span class="sourceLineNo">8798</span>    requestFlush0(FlushLifeCycleTracker.DUMMY);<a name="line.8798"></a>
+<span class="sourceLineNo">8799</span>  }<a name="line.8799"></a>
+<span class="sourceLineNo">8800</span><a name="line.8800"></a>
+<span class="sourceLineNo">8801</span>  private void requestFlush0(FlushLifeCycleTracker tracker) {<a name="line.8801"></a>
+<span class="sourceLineNo">8802</span>    boolean shouldFlush = false;<a name="line.8802"></a>
+<span class="sourceLineNo">8803</span>    synchronized (writestate) {<a name="line.8803"></a>
+<span class="sourceLineNo">8804</span>      if (!this.writestate.isFlushRequested()) {<a name="line.8804"></a>
+<span class="sourceLineNo">8805</span>        shouldFlush = true;<a name="line.8805"></a>
+<span class="sourceLineNo">8806</span>        writestate.flushRequested = true;<a name="line.8806"></a>
+<span class="sourceLineNo">8807</span>      }<a name="line.8807"></a>
+<span class="sourceLineNo">8808</span>    }<a name="line.8808"></a>
+<span class="sourceLineNo">8809</span>    if (shouldFlush) {<a name="line.8809"></a>
+<span class="sourceLineNo">8810</span>      // Make request outside of synchronize block; HBASE-818.<a name="line.8810"></a>
+<span class="sourceLineNo">8811</span>      this.rsServices.getFlushRequester().requestFlush(this, false, tracker);<a name="line.8811"></a>
+<span class="sourceLineNo">8812</span>      if (LOG.isDebugEnabled()) {<a name="line.8812"></a>
+<span class="sourceLineNo">8813</span>        LOG.debug("Flush requested on " + this.getRegionInfo().getEncodedName());<a name="line.8813"></a>
+<span class="sourceLineNo">8814</span>      }<a name="line.8814"></a>
+<span class="sourceLineNo">8815</span>    } else {<a name="line.8815"></a>
+<span class="sourceLineNo">8816</span>      tracker.notExecuted("Flush already requested on " + this);<a name="line.8816"></a>
+<span class="sourceLineNo">8817</span>    }<a name="line.8817"></a>
 <span class="sourceLineNo">8818</span>  }<a name="line.8818"></a>
 <span class="sourceLineNo">8819</span><a name="line.8819"></a>
-<span class="sourceLineNo">8820</span>  /**<a name="line.8820"></a>
-<span class="sourceLineNo">8821</span>   * This method modifies the region's configuration in order to inject replication-related<a name="line.8821"></a>
-<span class="sourceLineNo">8822</span>   * features<a name="line.8822"></a>
-<span class="sourceLineNo">8823</span>   * @param conf region configurations<a name="line.8823"></a>
-<span class="sourceLineNo">8824</span>   */<a name="line.8824"></a>
-<span class="sourceLineNo">8825</span>  static void decorateRegionConfiguration(Configuration conf) {<a name="line.8825"></a>
-<span class="sourceLineNo">8826</span>    if (ReplicationUtils.isReplicationForBulkLoadDataEnabled(conf)) {<a name="line.8826"></a>
-<span class="sourceLineNo">8827</span>      String plugins = conf.get(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY,"");<a name="line.8827"></a>
-<span class="sourceLineNo">8828</span>      String replicationCoprocessorClass = ReplicationObserver.class.getCanonicalName();<a name="line.8828"></a>
-<span class="sourceLineNo">8829</span>      if (!plugins.contains(replicationCoprocessorClass)) {<a name="line.8829"></a>
-<span class="sourceLineNo">8830</span>        conf.set(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY,<a name="line.8830"></a>
-<span class="sourceLineNo">8831</span>            (plugins.equals("") ? "" : (plugins + ",")) + replicationCoprocessorClass);<a name="line.8831"></a>
-<span class="sourceLineNo">8832</span>      }<a name="line.8832"></a>
-<span class="sourceLineNo">8833</span>    }<a name="line.8833"></a>
-<span class="sourceLineNo">8834</span>  }<a name="line.8834"></a>
-<span class="sourceLineNo">8835</span>}<a name="line.8835"></a>
+<span class="sourceLineNo">8820</span>  @Override<a name="line.8820"></a>
+<span class="sourceLineNo">8821</span>  public void requestFlush(FlushLifeCycleTracker tracker) throws IOException {<a name="line.8821"></a>
+<span class="sourceLineNo">8822</span>    requestFlush0(tracker);<a name="line.8822"></a>
+<span class="sourceLineNo">8823</span>  }<a name="line.8823"></a>
+<span class="sourceLineNo">8824</span><a name="line.8824"></a>
+<span class="sourceLineNo">8825</span>  /**<a name="line.8825"></a>
+<span class="sourceLineNo">8826</span>   * This method modifies the region's configuration in order to inject replication-related<a name="line.8826"></a>
+<span class="sourceLineNo">8827</span>   * features<a name="line.8827"></a>
+<span class="sourceLineNo">8828</span>   * @param conf region configurations<a name="line.8828"></a>
+<span class="sourceLineNo">8829</span>   */<a name="line.8829"></a>
+<span class="sourceLineNo">8830</span>  static void decorateRegionConfiguration(Configuration conf) {<a name="line.8830"></a>
+<span class="sourceLineNo">8831</span>    if (ReplicationUtils.isReplicationForBulkLoadDataEnabled(conf)) {<a name="line.8831"></a>
+<span class="sourceLineNo">8832</span>      String plugins = conf.get(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY,"");<a name="line.8832"></a>
+<span class="sourceLineNo">8833</span>      String replicationCoprocessorClass = ReplicationObserver.class.getCanonicalName();<a name="line.8833"></a>
+<span class="sourceLineNo">8834</span>      if (!plugins.contains(replicationCoprocessorClass)) {<a name="line.8834"></a>
+<span class="sourceLineNo">8835</span>        conf.set(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY,<a name="line.8835"></a>
+<span class="sourceLineNo">8836</span>            (plugins.equals("") ? "" : (plugins + ",")) + replicationCoprocessorClass);<a name="line.8836"></a>
+<span class="sourceLineNo">8837</span>      }<a name="line.8837"></a>
+<span class="sourceLineNo">8838</span>    }<a name="line.8838"></a>
+<span class="sourceLineNo">8839</span>  }<a name="line.8839"></a>
+<span class="sourceLineNo">8840</span>}<a name="line.8840"></a>
 
 
 
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 8fcec33..2147e82 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
@@ -7972,875 +7972,880 @@
 <span class="sourceLineNo">7964</span>    if (walEdit.isReplay()) {<a name="line.7964"></a>
 <span class="sourceLineNo">7965</span>      walKey.setOrigLogSeqNum(origLogSeqNum);<a name="line.7965"></a>
 <span class="sourceLineNo">7966</span>    }<a name="line.7966"></a>
-<span class="sourceLineNo">7967</span>    WriteEntry writeEntry = null;<a name="line.7967"></a>
-<span class="sourceLineNo">7968</span>    try {<a name="line.7968"></a>
-<span class="sourceLineNo">7969</span>      long txid = this.wal.append(this.getRegionInfo(), walKey, walEdit, true);<a name="line.7969"></a>
-<span class="sourceLineNo">7970</span>      // Call sync on our edit.<a name="line.7970"></a>
-<span class="sourceLineNo">7971</span>      if (txid != 0) {<a name="line.7971"></a>
-<span class="sourceLineNo">7972</span>        sync(txid, durability);<a name="line.7972"></a>
-<span class="sourceLineNo">7973</span>      }<a name="line.7973"></a>
-<span class="sourceLineNo">7974</span>      writeEntry = walKey.getWriteEntry();<a name="line.7974"></a>
-<span class="sourceLineNo">7975</span>    } catch (IOException ioe) {<a name="line.7975"></a>
-<span class="sourceLineNo">7976</span>      if (walKey != null &amp;&amp; walKey.getWriteEntry() != null) {<a name="line.7976"></a>
-<span class="sourceLineNo">7977</span>        mvcc.complete(walKey.getWriteEntry());<a name="line.7977"></a>
+<span class="sourceLineNo">7967</span>    //don't call the coproc hook for writes to the WAL caused by<a name="line.7967"></a>
+<span class="sourceLineNo">7968</span>    //system lifecycle events like flushes or compactions<a name="line.7968"></a>
+<span class="sourceLineNo">7969</span>    if (this.coprocessorHost != null &amp;&amp; !walEdit.isMetaEdit()) {<a name="line.7969"></a>
+<span class="sourceLineNo">7970</span>      this.coprocessorHost.preWALAppend(walKey, walEdit);<a name="line.7970"></a>
+<span class="sourceLineNo">7971</span>    }<a name="line.7971"></a>
+<span class="sourceLineNo">7972</span>    WriteEntry writeEntry = null;<a name="line.7972"></a>
+<span class="sourceLineNo">7973</span>    try {<a name="line.7973"></a>
+<span class="sourceLineNo">7974</span>      long txid = this.wal.append(this.getRegionInfo(), walKey, walEdit, true);<a name="line.7974"></a>
+<span class="sourceLineNo">7975</span>      // Call sync on our edit.<a name="line.7975"></a>
+<span class="sourceLineNo">7976</span>      if (txid != 0) {<a name="line.7976"></a>
+<span class="sourceLineNo">7977</span>        sync(txid, durability);<a name="line.7977"></a>
 <span class="sourceLineNo">7978</span>      }<a name="line.7978"></a>
-<span class="sourceLineNo">7979</span>      throw ioe;<a name="line.7979"></a>
-<span class="sourceLineNo">7980</span>    }<a name="line.7980"></a>
-<span class="sourceLineNo">7981</span>    return writeEntry;<a name="line.7981"></a>
-<span class="sourceLineNo">7982</span>  }<a name="line.7982"></a>
-<span class="sourceLineNo">7983</span><a name="line.7983"></a>
-<span class="sourceLineNo">7984</span>  /**<a name="line.7984"></a>
-<span class="sourceLineNo">7985</span>   * Do coprocessor pre-increment or pre-append call.<a name="line.7985"></a>
-<span class="sourceLineNo">7986</span>   * @return Result returned out of the coprocessor, which means bypass all further processing and<a name="line.7986"></a>
-<span class="sourceLineNo">7987</span>   *  return the proffered Result instead, or null which means proceed.<a name="line.7987"></a>
-<span class="sourceLineNo">7988</span>   */<a name="line.7988"></a>
-<span class="sourceLineNo">7989</span>  private Result doCoprocessorPreCall(final Operation op, final Mutation mutation)<a name="line.7989"></a>
-<span class="sourceLineNo">7990</span>  throws IOException {<a name="line.7990"></a>
-<span class="sourceLineNo">7991</span>    Result result = null;<a name="line.7991"></a>
-<span class="sourceLineNo">7992</span>    if (this.coprocessorHost != null) {<a name="line.7992"></a>
-<span class="sourceLineNo">7993</span>      switch(op) {<a name="line.7993"></a>
-<span class="sourceLineNo">7994</span>        case INCREMENT:<a name="line.7994"></a>
-<span class="sourceLineNo">7995</span>          result = this.coprocessorHost.preIncrementAfterRowLock((Increment)mutation);<a name="line.7995"></a>
-<span class="sourceLineNo">7996</span>          break;<a name="line.7996"></a>
-<span class="sourceLineNo">7997</span>        case APPEND:<a name="line.7997"></a>
-<span class="sourceLineNo">7998</span>          result = this.coprocessorHost.preAppendAfterRowLock((Append)mutation);<a name="line.7998"></a>
-<span class="sourceLineNo">7999</span>          break;<a name="line.7999"></a>
-<span class="sourceLineNo">8000</span>        default: throw new UnsupportedOperationException(op.toString());<a name="line.8000"></a>
-<span class="sourceLineNo">8001</span>      }<a name="line.8001"></a>
-<span class="sourceLineNo">8002</span>    }<a name="line.8002"></a>
-<span class="sourceLineNo">8003</span>    return result;<a name="line.8003"></a>
-<span class="sourceLineNo">8004</span>  }<a name="line.8004"></a>
-<span class="sourceLineNo">8005</span><a name="line.8005"></a>
-<span class="sourceLineNo">8006</span>  /**<a name="line.8006"></a>
-<span class="sourceLineNo">8007</span>   * Reckon the Cells to apply to WAL, memstore, and to return to the Client; these Sets are not<a name="line.8007"></a>
-<span class="sourceLineNo">8008</span>   * always the same dependent on whether to write WAL.<a name="line.8008"></a>
-<span class="sourceLineNo">8009</span>   *<a name="line.8009"></a>
-<span class="sourceLineNo">8010</span>   * @param results Fill in here what goes back to the Client if it is non-null (if null, client<a name="line.8010"></a>
-<span class="sourceLineNo">8011</span>   *  doesn't want results).<a name="line.8011"></a>
-<span class="sourceLineNo">8012</span>   * @param forMemStore Fill in here what to apply to the MemStore (by Store).<a name="line.8012"></a>
-<span class="sourceLineNo">8013</span>   * @return A WALEdit to apply to WAL or null if we are to skip the WAL.<a name="line.8013"></a>
-<span class="sourceLineNo">8014</span>   */<a name="line.8014"></a>
-<span class="sourceLineNo">8015</span>  private WALEdit reckonDeltas(Operation op, Mutation mutation, Durability effectiveDurability,<a name="line.8015"></a>
-<span class="sourceLineNo">8016</span>      Map&lt;HStore, List&lt;Cell&gt;&gt; forMemStore, List&lt;Cell&gt; results) throws IOException {<a name="line.8016"></a>
-<span class="sourceLineNo">8017</span>    WALEdit walEdit = null;<a name="line.8017"></a>
-<span class="sourceLineNo">8018</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.8018"></a>
-<span class="sourceLineNo">8019</span>    final boolean writeToWAL = effectiveDurability != Durability.SKIP_WAL;<a name="line.8019"></a>
-<span class="sourceLineNo">8020</span>    // Process a Store/family at a time.<a name="line.8020"></a>
-<span class="sourceLineNo">8021</span>    for (Map.Entry&lt;byte [], List&lt;Cell&gt;&gt; entry: mutation.getFamilyCellMap().entrySet()) {<a name="line.8021"></a>
-<span class="sourceLineNo">8022</span>      final byte[] columnFamilyName = entry.getKey();<a name="line.8022"></a>
-<span class="sourceLineNo">8023</span>      List&lt;Cell&gt; deltas = entry.getValue();<a name="line.8023"></a>
-<span class="sourceLineNo">8024</span>      // Reckon for the Store what to apply to WAL and MemStore.<a name="line.8024"></a>
-<span class="sourceLineNo">8025</span>      List&lt;Cell&gt; toApply = reckonDeltasByStore(stores.get(columnFamilyName), op, mutation,<a name="line.8025"></a>
-<span class="sourceLineNo">8026</span>        effectiveDurability, now, deltas, results);<a name="line.8026"></a>
-<span class="sourceLineNo">8027</span>      if (!toApply.isEmpty()) {<a name="line.8027"></a>
-<span class="sourceLineNo">8028</span>        for (Cell cell : toApply) {<a name="line.8028"></a>
-<span class="sourceLineNo">8029</span>          HStore store = getStore(cell);<a name="line.8029"></a>
-<span class="sourceLineNo">8030</span>          if (store == null) {<a name="line.8030"></a>
-<span class="sourceLineNo">8031</span>            checkFamily(CellUtil.cloneFamily(cell));<a name="line.8031"></a>
-<span class="sourceLineNo">8032</span>          } else {<a name="line.8032"></a>
-<span class="sourceLineNo">8033</span>            forMemStore.computeIfAbsent(store, key -&gt; new ArrayList&lt;&gt;()).add(cell);<a name="line.8033"></a>
-<span class="sourceLineNo">8034</span>          }<a name="line.8034"></a>
-<span class="sourceLineNo">8035</span>        }<a name="line.8035"></a>
-<span class="sourceLineNo">8036</span>        if (writeToWAL) {<a name="line.8036"></a>
-<span class="sourceLineNo">8037</span>          if (walEdit == null) {<a name="line.8037"></a>
-<span class="sourceLineNo">8038</span>            walEdit = new WALEdit();<a name="line.8038"></a>
+<span class="sourceLineNo">7979</span>      writeEntry = walKey.getWriteEntry();<a name="line.7979"></a>
+<span class="sourceLineNo">7980</span>    } catch (IOException ioe) {<a name="line.7980"></a>
+<span class="sourceLineNo">7981</span>      if (walKey != null &amp;&amp; walKey.getWriteEntry() != null) {<a name="line.7981"></a>
+<span class="sourceLineNo">7982</span>        mvcc.complete(walKey.getWriteEntry());<a name="line.7982"></a>
+<span class="sourceLineNo">7983</span>      }<a name="line.7983"></a>
+<span class="sourceLineNo">7984</span>      throw ioe;<a name="line.7984"></a>
+<span class="sourceLineNo">7985</span>    }<a name="line.7985"></a>
+<span class="sourceLineNo">7986</span>    return writeEntry;<a name="line.7986"></a>
+<span class="sourceLineNo">7987</span>  }<a name="line.7987"></a>
+<span class="sourceLineNo">7988</span><a name="line.7988"></a>
+<span class="sourceLineNo">7989</span>  /**<a name="line.7989"></a>
+<span class="sourceLineNo">7990</span>   * Do coprocessor pre-increment or pre-append call.<a name="line.7990"></a>
+<span class="sourceLineNo">7991</span>   * @return Result returned out of the coprocessor, which means bypass all further processing and<a name="line.7991"></a>
+<span class="sourceLineNo">7992</span>   *  return the proffered Result instead, or null which means proceed.<a name="line.7992"></a>
+<span class="sourceLineNo">7993</span>   */<a name="line.7993"></a>
+<span class="sourceLineNo">7994</span>  private Result doCoprocessorPreCall(final Operation op, final Mutation mutation)<a name="line.7994"></a>
+<span class="sourceLineNo">7995</span>  throws IOException {<a name="line.7995"></a>
+<span class="sourceLineNo">7996</span>    Result result = null;<a name="line.7996"></a>
+<span class="sourceLineNo">7997</span>    if (this.coprocessorHost != null) {<a name="line.7997"></a>
+<span class="sourceLineNo">7998</span>      switch(op) {<a name="line.7998"></a>
+<span class="sourceLineNo">7999</span>        case INCREMENT:<a name="line.7999"></a>
+<span class="sourceLineNo">8000</span>          result = this.coprocessorHost.preIncrementAfterRowLock((Increment)mutation);<a name="line.8000"></a>
+<span class="sourceLineNo">8001</span>          break;<a name="line.8001"></a>
+<span class="sourceLineNo">8002</span>        case APPEND:<a name="line.8002"></a>
+<span class="sourceLineNo">8003</span>          result = this.coprocessorHost.preAppendAfterRowLock((Append)mutation);<a name="line.8003"></a>
+<span class="sourceLineNo">8004</span>          break;<a name="line.8004"></a>
+<span class="sourceLineNo">8005</span>        default: throw new UnsupportedOperationException(op.toString());<a name="line.8005"></a>
+<span class="sourceLineNo">8006</span>      }<a name="line.8006"></a>
+<span class="sourceLineNo">8007</span>    }<a name="line.8007"></a>
+<span class="sourceLineNo">8008</span>    return result;<a name="line.8008"></a>
+<span class="sourceLineNo">8009</span>  }<a name="line.8009"></a>
+<span class="sourceLineNo">8010</span><a name="line.8010"></a>
+<span class="sourceLineNo">8011</span>  /**<a name="line.8011"></a>
+<span class="sourceLineNo">8012</span>   * Reckon the Cells to apply to WAL, memstore, and to return to the Client; these Sets are not<a name="line.8012"></a>
+<span class="sourceLineNo">8013</span>   * always the same dependent on whether to write WAL.<a name="line.8013"></a>
+<span class="sourceLineNo">8014</span>   *<a name="line.8014"></a>
+<span class="sourceLineNo">8015</span>   * @param results Fill in here what goes back to the Client if it is non-null (if null, client<a name="line.8015"></a>
+<span class="sourceLineNo">8016</span>   *  doesn't want results).<a name="line.8016"></a>
+<span class="sourceLineNo">8017</span>   * @param forMemStore Fill in here what to apply to the MemStore (by Store).<a name="line.8017"></a>
+<span class="sourceLineNo">8018</span>   * @return A WALEdit to apply to WAL or null if we are to skip the WAL.<a name="line.8018"></a>
+<span class="sourceLineNo">8019</span>   */<a name="line.8019"></a>
+<span class="sourceLineNo">8020</span>  private WALEdit reckonDeltas(Operation op, Mutation mutation, Durability effectiveDurability,<a name="line.8020"></a>
+<span class="sourceLineNo">8021</span>      Map&lt;HStore, List&lt;Cell&gt;&gt; forMemStore, List&lt;Cell&gt; results) throws IOException {<a name="line.8021"></a>
+<span class="sourceLineNo">8022</span>    WALEdit walEdit = null;<a name="line.8022"></a>
+<span class="sourceLineNo">8023</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.8023"></a>
+<span class="sourceLineNo">8024</span>    final boolean writeToWAL = effectiveDurability != Durability.SKIP_WAL;<a name="line.8024"></a>
+<span class="sourceLineNo">8025</span>    // Process a Store/family at a time.<a name="line.8025"></a>
+<span class="sourceLineNo">8026</span>    for (Map.Entry&lt;byte [], List&lt;Cell&gt;&gt; entry: mutation.getFamilyCellMap().entrySet()) {<a name="line.8026"></a>
+<span class="sourceLineNo">8027</span>      final byte[] columnFamilyName = entry.getKey();<a name="line.8027"></a>
+<span class="sourceLineNo">8028</span>      List&lt;Cell&gt; deltas = entry.getValue();<a name="line.8028"></a>
+<span class="sourceLineNo">8029</span>      // Reckon for the Store what to apply to WAL and MemStore.<a name="line.8029"></a>
+<span class="sourceLineNo">8030</span>      List&lt;Cell&gt; toApply = reckonDeltasByStore(stores.get(columnFamilyName), op, mutation,<a name="line.8030"></a>
+<span class="sourceLineNo">8031</span>        effectiveDurability, now, deltas, results);<a name="line.8031"></a>
+<span class="sourceLineNo">8032</span>      if (!toApply.isEmpty()) {<a name="line.8032"></a>
+<span class="sourceLineNo">8033</span>        for (Cell cell : toApply) {<a name="line.8033"></a>
+<span class="sourceLineNo">8034</span>          HStore store = getStore(cell);<a name="line.8034"></a>
+<span class="sourceLineNo">8035</span>          if (store == null) {<a name="line.8035"></a>
+<span class="sourceLineNo">8036</span>            checkFamily(CellUtil.cloneFamily(cell));<a name="line.8036"></a>
+<span class="sourceLineNo">8037</span>          } else {<a name="line.8037"></a>
+<span class="sourceLineNo">8038</span>            forMemStore.computeIfAbsent(store, key -&gt; new ArrayList&lt;&gt;()).add(cell);<a name="line.8038"></a>
 <span class="sourceLineNo">8039</span>          }<a name="line.8039"></a>
-<span class="sourceLineNo">8040</span>          walEdit.getCells().addAll(toApply);<a name="line.8040"></a>
-<span class="sourceLineNo">8041</span>        }<a name="line.8041"></a>
-<span class="sourceLineNo">8042</span>      }<a name="line.8042"></a>
-<span class="sourceLineNo">8043</span>    }<a name="line.8043"></a>
-<span class="sourceLineNo">8044</span>    return walEdit;<a name="line.8044"></a>
-<span class="sourceLineNo">8045</span>  }<a name="line.8045"></a>
-<span class="sourceLineNo">8046</span><a name="line.8046"></a>
-<span class="sourceLineNo">8047</span>  /**<a name="line.8047"></a>
-<span class="sourceLineNo">8048</span>   * Reckon the Cells to apply to WAL, memstore, and to return to the Client in passed<a name="line.8048"></a>
-<span class="sourceLineNo">8049</span>   * column family/Store.<a name="line.8049"></a>
-<span class="sourceLineNo">8050</span>   *<a name="line.8050"></a>
-<span class="sourceLineNo">8051</span>   * Does Get of current value and then adds passed in deltas for this Store returning the result.<a name="line.8051"></a>
-<span class="sourceLineNo">8052</span>   *<a name="line.8052"></a>
-<span class="sourceLineNo">8053</span>   * @param op Whether Increment or Append<a name="line.8053"></a>
-<span class="sourceLineNo">8054</span>   * @param mutation The encompassing Mutation object<a name="line.8054"></a>
-<span class="sourceLineNo">8055</span>   * @param deltas Changes to apply to this Store; either increment amount or data to append<a name="line.8055"></a>
-<span class="sourceLineNo">8056</span>   * @param results In here we accumulate all the Cells we are to return to the client. If null,<a name="line.8056"></a>
-<span class="sourceLineNo">8057</span>   *                client doesn't want results returned.<a name="line.8057"></a>
-<span class="sourceLineNo">8058</span>   * @return Resulting Cells after &lt;code&gt;deltas&lt;/code&gt; have been applied to current<a name="line.8058"></a>
-<span class="sourceLineNo">8059</span>   *  values. Side effect is our filling out of the &lt;code&gt;results&lt;/code&gt; List.<a name="line.8059"></a>
-<span class="sourceLineNo">8060</span>   */<a name="line.8060"></a>
-<span class="sourceLineNo">8061</span>  private List&lt;Cell&gt; reckonDeltasByStore(HStore store, Operation op, Mutation mutation,<a name="line.8061"></a>
-<span class="sourceLineNo">8062</span>      Durability effectiveDurability, long now, List&lt;Cell&gt; deltas, List&lt;Cell&gt; results)<a name="line.8062"></a>
-<span class="sourceLineNo">8063</span>      throws IOException {<a name="line.8063"></a>
-<span class="sourceLineNo">8064</span>    byte[] columnFamily = store.getColumnFamilyDescriptor().getName();<a name="line.8064"></a>
-<span class="sourceLineNo">8065</span>    List&lt;Pair&lt;Cell, Cell&gt;&gt; cellPairs = new ArrayList&lt;&gt;(deltas.size());<a name="line.8065"></a>
-<span class="sourceLineNo">8066</span>    // Get previous values for all columns in this family.<a name="line.8066"></a>
-<span class="sourceLineNo">8067</span>    TimeRange tr = null;<a name="line.8067"></a>
-<span class="sourceLineNo">8068</span>    switch (op) {<a name="line.8068"></a>
-<span class="sourceLineNo">8069</span>      case INCREMENT:<a name="line.8069"></a>
-<span class="sourceLineNo">8070</span>        tr = ((Increment)mutation).getTimeRange();<a name="line.8070"></a>
-<span class="sourceLineNo">8071</span>        break;<a name="line.8071"></a>
-<span class="sourceLineNo">8072</span>      case APPEND:<a name="line.8072"></a>
-<span class="sourceLineNo">8073</span>        tr = ((Append)mutation).getTimeRange();<a name="line.8073"></a>
-<span class="sourceLineNo">8074</span>        break;<a name="line.8074"></a>
-<span class="sourceLineNo">8075</span>      default:<a name="line.8075"></a>
+<span class="sourceLineNo">8040</span>        }<a name="line.8040"></a>
+<span class="sourceLineNo">8041</span>        if (writeToWAL) {<a name="line.8041"></a>
+<span class="sourceLineNo">8042</span>          if (walEdit == null) {<a name="line.8042"></a>
+<span class="sourceLineNo">8043</span>            walEdit = new WALEdit();<a name="line.8043"></a>
+<span class="sourceLineNo">8044</span>          }<a name="line.8044"></a>
+<span class="sourceLineNo">8045</span>          walEdit.getCells().addAll(toApply);<a name="line.8045"></a>
+<span class="sourceLineNo">8046</span>        }<a name="line.8046"></a>
+<span class="sourceLineNo">8047</span>      }<a name="line.8047"></a>
+<span class="sourceLineNo">8048</span>    }<a name="line.8048"></a>
+<span class="sourceLineNo">8049</span>    return walEdit;<a name="line.8049"></a>
+<span class="sourceLineNo">8050</span>  }<a name="line.8050"></a>
+<span class="sourceLineNo">8051</span><a name="line.8051"></a>
+<span class="sourceLineNo">8052</span>  /**<a name="line.8052"></a>
+<span class="sourceLineNo">8053</span>   * Reckon the Cells to apply to WAL, memstore, and to return to the Client in passed<a name="line.8053"></a>
+<span class="sourceLineNo">8054</span>   * column family/Store.<a name="line.8054"></a>
+<span class="sourceLineNo">8055</span>   *<a name="line.8055"></a>
+<span class="sourceLineNo">8056</span>   * Does Get of current value and then adds passed in deltas for this Store returning the result.<a name="line.8056"></a>
+<span class="sourceLineNo">8057</span>   *<a name="line.8057"></a>
+<span class="sourceLineNo">8058</span>   * @param op Whether Increment or Append<a name="line.8058"></a>
+<span class="sourceLineNo">8059</span>   * @param mutation The encompassing Mutation object<a name="line.8059"></a>
+<span class="sourceLineNo">8060</span>   * @param deltas Changes to apply to this Store; either increment amount or data to append<a name="line.8060"></a>
+<span class="sourceLineNo">8061</span>   * @param results In here we accumulate all the Cells we are to return to the client. If null,<a name="line.8061"></a>
+<span class="sourceLineNo">8062</span>   *                client doesn't want results returned.<a name="line.8062"></a>
+<span class="sourceLineNo">8063</span>   * @return Resulting Cells after &lt;code&gt;deltas&lt;/code&gt; have been applied to current<a name="line.8063"></a>
+<span class="sourceLineNo">8064</span>   *  values. Side effect is our filling out of the &lt;code&gt;results&lt;/code&gt; List.<a name="line.8064"></a>
+<span class="sourceLineNo">8065</span>   */<a name="line.8065"></a>
+<span class="sourceLineNo">8066</span>  private List&lt;Cell&gt; reckonDeltasByStore(HStore store, Operation op, Mutation mutation,<a name="line.8066"></a>
+<span class="sourceLineNo">8067</span>      Durability effectiveDurability, long now, List&lt;Cell&gt; deltas, List&lt;Cell&gt; results)<a name="line.8067"></a>
+<span class="sourceLineNo">8068</span>      throws IOException {<a name="line.8068"></a>
+<span class="sourceLineNo">8069</span>    byte[] columnFamily = store.getColumnFamilyDescriptor().getName();<a name="line.8069"></a>
+<span class="sourceLineNo">8070</span>    List&lt;Pair&lt;Cell, Cell&gt;&gt; cellPairs = new ArrayList&lt;&gt;(deltas.size());<a name="line.8070"></a>
+<span class="sourceLineNo">8071</span>    // Get previous values for all columns in this family.<a name="line.8071"></a>
+<span class="sourceLineNo">8072</span>    TimeRange tr = null;<a name="line.8072"></a>
+<span class="sourceLineNo">8073</span>    switch (op) {<a name="line.8073"></a>
+<span class="sourceLineNo">8074</span>      case INCREMENT:<a name="line.8074"></a>
+<span class="sourceLineNo">8075</span>        tr = ((Increment)mutation).getTimeRange();<a name="line.8075"></a>
 <span class="sourceLineNo">8076</span>        break;<a name="line.8076"></a>
-<span class="sourceLineNo">8077</span>    }<a name="line.8077"></a>
-<span class="sourceLineNo">8078</span>    List&lt;Cell&gt; currentValues = get(mutation, store, deltas,null, tr);<a name="line.8078"></a>
-<span class="sourceLineNo">8079</span>    // Iterate the input columns and update existing values if they were found, otherwise<a name="line.8079"></a>
-<span class="sourceLineNo">8080</span>    // add new column initialized to the delta amount<a name="line.8080"></a>
-<span class="sourceLineNo">8081</span>    int currentValuesIndex = 0;<a name="line.8081"></a>
-<span class="sourceLineNo">8082</span>    for (int i = 0; i &lt; deltas.size(); i++) {<a name="line.8082"></a>
-<span class="sourceLineNo">8083</span>      Cell delta = deltas.get(i);<a name="line.8083"></a>
-<span class="sourceLineNo">8084</span>      Cell currentValue = null;<a name="line.8084"></a>
-<span class="sourceLineNo">8085</span>      if (currentValuesIndex &lt; currentValues.size() &amp;&amp;<a name="line.8085"></a>
-<span class="sourceLineNo">8086</span>          CellUtil.matchingQualifier(currentValues.get(currentValuesIndex), delta)) {<a name="line.8086"></a>
-<span class="sourceLineNo">8087</span>        currentValue = currentValues.get(currentValuesIndex);<a name="line.8087"></a>
-<span class="sourceLineNo">8088</span>        if (i &lt; (deltas.size() - 1) &amp;&amp; !CellUtil.matchingQualifier(delta, deltas.get(i + 1))) {<a name="line.8088"></a>
-<span class="sourceLineNo">8089</span>          currentValuesIndex++;<a name="line.8089"></a>
-<span class="sourceLineNo">8090</span>        }<a name="line.8090"></a>
-<span class="sourceLineNo">8091</span>      }<a name="line.8091"></a>
-<span class="sourceLineNo">8092</span><a name="line.8092"></a>
-<span class="sourceLineNo">8093</span>      // Switch on whether this an increment or an append building the new Cell to apply.<a name="line.8093"></a>
-<span class="sourceLineNo">8094</span>      Cell newCell = null;<a name="line.8094"></a>
-<span class="sourceLineNo">8095</span>      switch (op) {<a name="line.8095"></a>
-<span class="sourceLineNo">8096</span>        case INCREMENT:<a name="line.8096"></a>
-<span class="sourceLineNo">8097</span>          long deltaAmount = getLongValue(delta);<a name="line.8097"></a>
-<span class="sourceLineNo">8098</span>          final long newValue = currentValue == null ? deltaAmount : getLongValue(currentValue) + deltaAmount;<a name="line.8098"></a>
-<span class="sourceLineNo">8099</span>          newCell = reckonDelta(delta, currentValue, columnFamily, now, mutation, (oldCell) -&gt; Bytes.toBytes(newValue));<a name="line.8099"></a>
-<span class="sourceLineNo">8100</span>          break;<a name="line.8100"></a>
-<span class="sourceLineNo">8101</span>        case APPEND:<a name="line.8101"></a>
-<span class="sourceLineNo">8102</span>          newCell = reckonDelta(delta, currentValue, columnFamily, now, mutation, (oldCell) -&gt;<a name="line.8102"></a>
-<span class="sourceLineNo">8103</span>            ByteBuffer.wrap(new byte[delta.getValueLength() + oldCell.getValueLength()])<a name="line.8103"></a>
-<span class="sourceLineNo">8104</span>                    .put(oldCell.getValueArray(), oldCell.getValueOffset(), oldCell.getValueLength())<a name="line.8104"></a>
-<span class="sourceLineNo">8105</span>                    .put(delta.getValueArray(), delta.getValueOffset(), delta.getValueLength())<a name="line.8105"></a>
-<span class="sourceLineNo">8106</span>                    .array()<a name="line.8106"></a>
-<span class="sourceLineNo">8107</span>          );<a name="line.8107"></a>
-<span class="sourceLineNo">8108</span>          break;<a name="line.8108"></a>
-<span class="sourceLineNo">8109</span>        default: throw new UnsupportedOperationException(op.toString());<a name="line.8109"></a>
-<span class="sourceLineNo">8110</span>      }<a name="line.8110"></a>
-<span class="sourceLineNo">8111</span>      int newCellSize = PrivateCellUtil.estimatedSerializedSizeOf(newCell);<a name="line.8111"></a>
-<span class="sourceLineNo">8112</span>      if (newCellSize &gt; this.maxCellSize) {<a name="line.8112"></a>
-<span class="sourceLineNo">8113</span>        String msg = "Cell with size " + newCellSize + " exceeds limit of " +<a name="line.8113"></a>
-<span class="sourceLineNo">8114</span>            this.maxCellSize + " bytes";<a name="line.8114"></a>
-<span class="sourceLineNo">8115</span>        if (LOG.isDebugEnabled()) {<a name="line.8115"></a>
-<span class="sourceLineNo">8116</span>          LOG.debug(msg);<a name="line.8116"></a>
-<span class="sourceLineNo">8117</span>        }<a name="line.8117"></a>
-<span class="sourceLineNo">8118</span>        throw new DoNotRetryIOException(msg);<a name="line.8118"></a>
-<span class="sourceLineNo">8119</span>      }<a name="line.8119"></a>
-<span class="sourceLineNo">8120</span>      cellPairs.add(new Pair&lt;&gt;(currentValue, newCell));<a name="line.8120"></a>
-<span class="sourceLineNo">8121</span>      // Add to results to get returned to the Client. If null, cilent does not want results.<a name="line.8121"></a>
-<span class="sourceLineNo">8122</span>      if (results != null) {<a name="line.8122"></a>
-<span class="sourceLineNo">8123</span>        results.add(newCell);<a name="line.8123"></a>
+<span class="sourceLineNo">8077</span>      case APPEND:<a name="line.8077"></a>
+<span class="sourceLineNo">8078</span>        tr = ((Append)mutation).getTimeRange();<a name="line.8078"></a>
+<span class="sourceLineNo">8079</span>        break;<a name="line.8079"></a>
+<span class="sourceLineNo">8080</span>      default:<a name="line.8080"></a>
+<span class="sourceLineNo">8081</span>        break;<a name="line.8081"></a>
+<span class="sourceLineNo">8082</span>    }<a name="line.8082"></a>
+<span class="sourceLineNo">8083</span>    List&lt;Cell&gt; currentValues = get(mutation, store, deltas,null, tr);<a name="line.8083"></a>
+<span class="sourceLineNo">8084</span>    // Iterate the input columns and update existing values if they were found, otherwise<a name="line.8084"></a>
+<span class="sourceLineNo">8085</span>    // add new column initialized to the delta amount<a name="line.8085"></a>
+<span class="sourceLineNo">8086</span>    int currentValuesIndex = 0;<a name="line.8086"></a>
+<span class="sourceLineNo">8087</span>    for (int i = 0; i &lt; deltas.size(); i++) {<a name="line.8087"></a>
+<span class="sourceLineNo">8088</span>      Cell delta = deltas.get(i);<a name="line.8088"></a>
+<span class="sourceLineNo">8089</span>      Cell currentValue = null;<a name="line.8089"></a>
+<span class="sourceLineNo">8090</span>      if (currentValuesIndex &lt; currentValues.size() &amp;&amp;<a name="line.8090"></a>
+<span class="sourceLineNo">8091</span>          CellUtil.matchingQualifier(currentValues.get(currentValuesIndex), delta)) {<a name="line.8091"></a>
+<span class="sourceLineNo">8092</span>        currentValue = currentValues.get(currentValuesIndex);<a name="line.8092"></a>
+<span class="sourceLineNo">8093</span>        if (i &lt; (deltas.size() - 1) &amp;&amp; !CellUtil.matchingQualifier(delta, deltas.get(i + 1))) {<a name="line.8093"></a>
+<span class="sourceLineNo">8094</span>          currentValuesIndex++;<a name="line.8094"></a>
+<span class="sourceLineNo">8095</span>        }<a name="line.8095"></a>
+<span class="sourceLineNo">8096</span>      }<a name="line.8096"></a>
+<span class="sourceLineNo">8097</span><a name="line.8097"></a>
+<span class="sourceLineNo">8098</span>      // Switch on whether this an increment or an append building the new Cell to apply.<a name="line.8098"></a>
+<span class="sourceLineNo">8099</span>      Cell newCell = null;<a name="line.8099"></a>
+<span class="sourceLineNo">8100</span>      switch (op) {<a name="line.8100"></a>
+<span class="sourceLineNo">8101</span>        case INCREMENT:<a name="line.8101"></a>
+<span class="sourceLineNo">8102</span>          long deltaAmount = getLongValue(delta);<a name="line.8102"></a>
+<span class="sourceLineNo">8103</span>          final long newValue = currentValue == null ? deltaAmount : getLongValue(currentValue) + deltaAmount;<a name="line.8103"></a>
+<span class="sourceLineNo">8104</span>          newCell = reckonDelta(delta, currentValue, columnFamily, now, mutation, (oldCell) -&gt; Bytes.toBytes(newValue));<a name="line.8104"></a>
+<span class="sourceLineNo">8105</span>          break;<a name="line.8105"></a>
+<span class="sourceLineNo">8106</span>        case APPEND:<a name="line.8106"></a>
+<span class="sourceLineNo">8107</span>          newCell = reckonDelta(delta, currentValue, columnFamily, now, mutation, (oldCell) -&gt;<a name="line.8107"></a>
+<span class="sourceLineNo">8108</span>            ByteBuffer.wrap(new byte[delta.getValueLength() + oldCell.getValueLength()])<a name="line.8108"></a>
+<span class="sourceLineNo">8109</span>                    .put(oldCell.getValueArray(), oldCell.getValueOffset(), oldCell.getValueLength())<a name="line.8109"></a>
+<span class="sourceLineNo">8110</span>                    .put(delta.getValueArray(), delta.getValueOffset(), delta.getValueLength())<a name="line.8110"></a>
+<span class="sourceLineNo">8111</span>                    .array()<a name="line.8111"></a>
+<span class="sourceLineNo">8112</span>          );<a name="line.8112"></a>
+<span class="sourceLineNo">8113</span>          break;<a name="line.8113"></a>
+<span class="sourceLineNo">8114</span>        default: throw new UnsupportedOperationException(op.toString());<a name="line.8114"></a>
+<span class="sourceLineNo">8115</span>      }<a name="line.8115"></a>
+<span class="sourceLineNo">8116</span>      int newCellSize = PrivateCellUtil.estimatedSerializedSizeOf(newCell);<a name="line.8116"></a>
+<span class="sourceLineNo">8117</span>      if (newCellSize &gt; this.maxCellSize) {<a name="line.8117"></a>
+<span class="sourceLineNo">8118</span>        String msg = "Cell with size " + newCellSize + " exceeds limit of " +<a name="line.8118"></a>
+<span class="sourceLineNo">8119</span>            this.maxCellSize + " bytes";<a name="line.8119"></a>
+<span class="sourceLineNo">8120</span>        if (LOG.isDebugEnabled()) {<a name="line.8120"></a>
+<span class="sourceLineNo">8121</span>          LOG.debug(msg);<a name="line.8121"></a>
+<span class="sourceLineNo">8122</span>        }<a name="line.8122"></a>
+<span class="sourceLineNo">8123</span>        throw new DoNotRetryIOException(msg);<a name="line.8123"></a>
 <span class="sourceLineNo">8124</span>      }<a name="line.8124"></a>
-<span class="sourceLineNo">8125</span>    }<a name="line.8125"></a>
-<span class="sourceLineNo">8126</span><a name="line.8126"></a>
-<span class="sourceLineNo">8127</span>    // Give coprocessors a chance to update the new cells before apply to WAL or memstore<a name="line.8127"></a>
-<span class="sourceLineNo">8128</span>    if (coprocessorHost != null) {<a name="line.8128"></a>
-<span class="sourceLineNo">8129</span>      // Here the operation must be increment or append.<a name="line.8129"></a>
-<span class="sourceLineNo">8130</span>      cellPairs = op == Operation.INCREMENT ?<a name="line.8130"></a>
-<span class="sourceLineNo">8131</span>          coprocessorHost.postIncrementBeforeWAL(mutation, cellPairs) :<a name="line.8131"></a>
-<span class="sourceLineNo">8132</span>          coprocessorHost.postAppendBeforeWAL(mutation, cellPairs);<a name="line.8132"></a>
-<span class="sourceLineNo">8133</span>    }<a name="line.8133"></a>
-<span class="sourceLineNo">8134</span>    return cellPairs.stream().map(Pair::getSecond).collect(Collectors.toList());<a name="line.8134"></a>
-<span class="sourceLineNo">8135</span>  }<a name="line.8135"></a>
-<span class="sourceLineNo">8136</span><a name="line.8136"></a>
-<span class="sourceLineNo">8137</span>  private static Cell reckonDelta(final Cell delta, final Cell currentCell,<a name="line.8137"></a>
-<span class="sourceLineNo">8138</span>                                  final byte[] columnFamily, final long now,<a name="line.8138"></a>
-<span class="sourceLineNo">8139</span>                                  Mutation mutation, Function&lt;Cell, byte[]&gt; supplier) throws IOException {<a name="line.8139"></a>
-<span class="sourceLineNo">8140</span>    // Forward any tags found on the delta.<a name="line.8140"></a>
-<span class="sourceLineNo">8141</span>    List&lt;Tag&gt; tags = TagUtil.carryForwardTags(delta);<a name="line.8141"></a>
-<span class="sourceLineNo">8142</span>    tags = TagUtil.carryForwardTTLTag(tags, mutation.getTTL());<a name="line.8142"></a>
-<span class="sourceLineNo">8143</span>    if (currentCell != null) {<a name="line.8143"></a>
-<span class="sourceLineNo">8144</span>      tags = TagUtil.carryForwardTags(tags, currentCell);<a name="line.8144"></a>
-<span class="sourceLineNo">8145</span>      byte[] newValue = supplier.apply(currentCell);<a name="line.8145"></a>
-<span class="sourceLineNo">8146</span>      return ExtendedCellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.8146"></a>
-<span class="sourceLineNo">8147</span>              .setRow(mutation.getRow(), 0, mutation.getRow().length)<a name="line.8147"></a>
-<span class="sourceLineNo">8148</span>              .setFamily(columnFamily, 0, columnFamily.length)<a name="line.8148"></a>
-<span class="sourceLineNo">8149</span>              // copy the qualifier if the cell is located in shared memory.<a name="line.8149"></a>
-<span class="sourceLineNo">8150</span>              .setQualifier(CellUtil.cloneQualifier(delta))<a name="line.8150"></a>
-<span class="sourceLineNo">8151</span>              .setTimestamp(Math.max(currentCell.getTimestamp() + 1, now))<a name="line.8151"></a>
-<span class="sourceLineNo">8152</span>              .setType(KeyValue.Type.Put.getCode())<a name="line.8152"></a>
-<span class="sourceLineNo">8153</span>              .setValue(newValue, 0, newValue.length)<a name="line.8153"></a>
-<span class="sourceLineNo">8154</span>              .setTags(TagUtil.fromList(tags))<a name="line.8154"></a>
-<span class="sourceLineNo">8155</span>              .build();<a name="line.8155"></a>
-<span class="sourceLineNo">8156</span>    } else {<a name="line.8156"></a>
-<span class="sourceLineNo">8157</span>      PrivateCellUtil.updateLatestStamp(delta, now);<a name="line.8157"></a>
-<span class="sourceLineNo">8158</span>      return CollectionUtils.isEmpty(tags) ? delta : PrivateCellUtil.createCell(delta, tags);<a name="line.8158"></a>
-<span class="sourceLineNo">8159</span>    }<a name="line.8159"></a>
-<span class="sourceLineNo">8160</span>  }<a name="line.8160"></a>
-<span class="sourceLineNo">8161</span><a name="line.8161"></a>
-<span class="sourceLineNo">8162</span>  /**<a name="line.8162"></a>
-<span class="sourceLineNo">8163</span>   * @return Get the long out of the passed in Cell<a name="line.8163"></a>
-<span class="sourceLineNo">8164</span>   */<a name="line.8164"></a>
-<span class="sourceLineNo">8165</span>  private static long getLongValue(final Cell cell) throws DoNotRetryIOException {<a name="line.8165"></a>
-<span class="sourceLineNo">8166</span>    int len = cell.getValueLength();<a name="line.8166"></a>
-<span class="sourceLineNo">8167</span>    if (len != Bytes.SIZEOF_LONG) {<a name="line.8167"></a>
-<span class="sourceLineNo">8168</span>      // throw DoNotRetryIOException instead of IllegalArgumentException<a name="line.8168"></a>
-<span class="sourceLineNo">8169</span>      throw new DoNotRetryIOException("Field is not a long, it's " + len + " bytes wide");<a name="line.8169"></a>
-<span class="sourceLineNo">8170</span>    }<a name="line.8170"></a>
-<span class="sourceLineNo">8171</span>    return PrivateCellUtil.getValueAsLong(cell);<a name="line.8171"></a>
-<span class="sourceLineNo">8172</span>  }<a name="line.8172"></a>
-<span class="sourceLineNo">8173</span><a name="line.8173"></a>
-<span class="sourceLineNo">8174</span>  /**<a name="line.8174"></a>
-<span class="sourceLineNo">8175</span>   * Do a specific Get on passed &lt;code&gt;columnFamily&lt;/code&gt; and column qualifiers.<a name="line.8175"></a>
-<span class="sourceLineNo">8176</span>   * @param mutation Mutation we are doing this Get for.<a name="line.8176"></a>
-<span class="sourceLineNo">8177</span>   * @param store Which column family on row (TODO: Go all Gets in one go)<a name="line.8177"></a>
-<span class="sourceLineNo">8178</span>   * @param coordinates Cells from &lt;code&gt;mutation&lt;/code&gt; used as coordinates applied to Get.<a name="line.8178"></a>
-<span class="sourceLineNo">8179</span>   * @return Return list of Cells found.<a name="line.8179"></a>
-<span class="sourceLineNo">8180</span>   */<a name="line.8180"></a>
-<span class="sourceLineNo">8181</span>  private List&lt;Cell&gt; get(Mutation mutation, HStore store, List&lt;Cell&gt; coordinates,<a name="line.8181"></a>
-<span class="sourceLineNo">8182</span>      IsolationLevel isolation, TimeRange tr) throws IOException {<a name="line.8182"></a>
-<span class="sourceLineNo">8183</span>    // Sort the cells so that they match the order that they appear in the Get results. Otherwise,<a name="line.8183"></a>
-<span class="sourceLineNo">8184</span>    // we won't be able to find the existing values if the cells are not specified in order by the<a name="line.8184"></a>
-<span class="sourceLineNo">8185</span>    // client since cells are in an array list.<a name="line.8185"></a>
-<span class="sourceLineNo">8186</span>    // TODO: I don't get why we are sorting. St.Ack 20150107<a name="line.8186"></a>
-<span class="sourceLineNo">8187</span>    sort(coordinates, store.getComparator());<a name="line.8187"></a>
-<span class="sourceLineNo">8188</span>    Get get = new Get(mutation.getRow());<a name="line.8188"></a>
-<span class="sourceLineNo">8189</span>    if (isolation != null) {<a name="line.8189"></a>
-<span class="sourceLineNo">8190</span>      get.setIsolationLevel(isolation);<a name="line.8190"></a>
-<span class="sourceLineNo">8191</span>    }<a name="line.8191"></a>
-<span class="sourceLineNo">8192</span>    for (Cell cell: coordinates) {<a name="line.8192"></a>
-<span class="sourceLineNo">8193</span>      get.addColumn(store.getColumnFamilyDescriptor().getName(), CellUtil.cloneQualifier(cell));<a name="line.8193"></a>
-<span class="sourceLineNo">8194</span>    }<a name="line.8194"></a>
-<span class="sourceLineNo">8195</span>    // Increments carry time range. If an Increment instance, put it on the Get.<a name="line.8195"></a>
-<span class="sourceLineNo">8196</span>    if (tr != null) {<a name="line.8196"></a>
-<span class="sourceLineNo">8197</span>      get.setTimeRange(tr.getMin(), tr.getMax());<a name="line.8197"></a>
-<span class="sourceLineNo">8198</span>    }<a name="line.8198"></a>
-<span class="sourceLineNo">8199</span>    return get(get, false);<a name="line.8199"></a>
-<span class="sourceLineNo">8200</span>  }<a name="line.8200"></a>
-<span class="sourceLineNo">8201</span><a name="line.8201"></a>
-<span class="sourceLineNo">8202</span>  /**<a name="line.8202"></a>
-<span class="sourceLineNo">8203</span>   * @return Sorted list of &lt;code&gt;cells&lt;/code&gt; using &lt;code&gt;comparator&lt;/code&gt;<a name="line.8203"></a>
-<span class="sourceLineNo">8204</span>   */<a name="line.8204"></a>
-<span class="sourceLineNo">8205</span>  private static List&lt;Cell&gt; sort(List&lt;Cell&gt; cells, final CellComparator comparator) {<a name="line.8205"></a>
-<span class="sourceLineNo">8206</span>    cells.sort(comparator);<a name="line.8206"></a>
-<span class="sourceLineNo">8207</span>    return cells;<a name="line.8207"></a>
-<span class="sourceLineNo">8208</span>  }<a name="line.8208"></a>
-<span class="sourceLineNo">8209</span><a name="line.8209"></a>
-<span class="sourceLineNo">8210</span>  public static final long FIXED_OVERHEAD = ClassSize.align(<a name="line.8210"></a>
-<span class="sourceLineNo">8211</span>      ClassSize.OBJECT +<a name="line.8211"></a>
-<span class="sourceLineNo">8212</span>      ClassSize.ARRAY +<a name="line.8212"></a>
-<span class="sourceLineNo">8213</span>      55 * ClassSize.REFERENCE + 3 * Bytes.SIZEOF_INT +<a name="line.8213"></a>
-<span class="sourceLineNo">8214</span>      (15 * Bytes.SIZEOF_LONG) +<a name="line.8214"></a>
-<span class="sourceLineNo">8215</span>      3 * Bytes.SIZEOF_BOOLEAN);<a name="line.8215"></a>
-<span class="sourceLineNo">8216</span><a name="line.8216"></a>
-<span class="sourceLineNo">8217</span>  // woefully out of date - currently missing:<a name="line.8217"></a>
-<span class="sourceLineNo">8218</span>  // 1 x HashMap - coprocessorServiceHandlers<a name="line.8218"></a>
-<span class="sourceLineNo">8219</span>  // 6 x LongAdder - numMutationsWithoutWAL, dataInMemoryWithoutWAL,<a name="line.8219"></a>
-<span class="sourceLineNo">8220</span>  //   checkAndMutateChecksPassed, checkAndMutateChecksFailed, readRequestsCount,<a name="line.8220"></a>
-<span class="sourceLineNo">8221</span>  //   writeRequestsCount, cpRequestsCount<a name="line.8221"></a>
-<span class="sourceLineNo">8222</span>  // 1 x HRegion$WriteState - writestate<a name="line.8222"></a>
-<span class="sourceLineNo">8223</span>  // 1 x RegionCoprocessorHost - coprocessorHost<a name="line.8223"></a>
-<span class="sourceLineNo">8224</span>  // 1 x RegionSplitPolicy - splitPolicy<a name="line.8224"></a>
-<span class="sourceLineNo">8225</span>  // 1 x MetricsRegion - metricsRegion<a name="line.8225"></a>
-<span class="sourceLineNo">8226</span>  // 1 x MetricsRegionWrapperImpl - metricsRegionWrapper<a name="line.8226"></a>
-<span class="sourceLineNo">8227</span>  public static final long DEEP_OVERHEAD = FIXED_OVERHEAD +<a name="line.8227"></a>
-<span class="sourceLineNo">8228</span>      ClassSize.OBJECT + // closeLock<a name="line.8228"></a>
-<span class="sourceLineNo">8229</span>      (2 * ClassSize.ATOMIC_BOOLEAN) + // closed, closing<a name="line.8229"></a>
-<span class="sourceLineNo">8230</span>      (3 * ClassSize.ATOMIC_LONG) + // numPutsWithoutWAL, dataInMemoryWithoutWAL,<a name="line.8230"></a>
-<span class="sourceLineNo">8231</span>                                    // compactionsFailed<a name="line.8231"></a>
-<span class="sourceLineNo">8232</span>      (2 * ClassSize.CONCURRENT_HASHMAP) +  // lockedRows, scannerReadPoints<a name="line.8232"></a>
-<span class="sourceLineNo">8233</span>      WriteState.HEAP_SIZE + // writestate<a name="line.8233"></a>
-<span class="sourceLineNo">8234</span>      ClassSize.CONCURRENT_SKIPLISTMAP + ClassSize.CONCURRENT_SKIPLISTMAP_ENTRY + // stores<a name="line.8234"></a>
-<span class="sourceLineNo">8235</span>      (2 * ClassSize.REENTRANT_LOCK) + // lock, updatesLock<a name="line.8235"></a>
-<span class="sourceLineNo">8236</span>      MultiVersionConcurrencyControl.FIXED_SIZE // mvcc<a name="line.8236"></a>
-<span class="sourceLineNo">8237</span>      + 2 * ClassSize.TREEMAP // maxSeqIdInStores, replicationScopes<a name="line.8237"></a>
-<span class="sourceLineNo">8238</span>      + 2 * ClassSize.ATOMIC_INTEGER // majorInProgress, minorInProgress<a name="line.8238"></a>
-<span class="sourceLineNo">8239</span>      + ClassSize.STORE_SERVICES // store services<a name="line.8239"></a>
-<span class="sourceLineNo">8240</span>      + StoreHotnessProtector.FIXED_SIZE<a name="line.8240"></a>
-<span class="sourceLineNo">8241</span>      ;<a name="line.8241"></a>
-<span class="sourceLineNo">8242</span><a name="line.8242"></a>
-<span class="sourceLineNo">8243</span>  @Override<a name="line.8243"></a>
-<span class="sourceLineNo">8244</span>  public long heapSize() {<a name="line.8244"></a>
-<span class="sourceLineNo">8245</span>    // this does not take into account row locks, recent flushes, mvcc entries, and more<a name="line.8245"></a>
-<span class="sourceLineNo">8246</span>    return DEEP_OVERHEAD + stores.values().stream().mapToLong(HStore::heapSize).sum();<a name="line.8246"></a>
-<span class="sourceLineNo">8247</span>  }<a name="line.8247"></a>
-<span class="sourceLineNo">8248</span><a name="line.8248"></a>
-<span class="sourceLineNo">8249</span>  /**<a name="line.8249"></a>
-<span class="sourceLineNo">8250</span>   * Registers a new protocol buffer {@link Service} subclass as a coprocessor endpoint to<a name="line.8250"></a>
-<span class="sourceLineNo">8251</span>   * be available for handling Region#execService(com.google.protobuf.RpcController,<a name="line.8251"></a>
-<span class="sourceLineNo">8252</span>   *    org.apache.hadoop.hbase.protobuf.generated.ClientProtos.CoprocessorServiceCall) calls.<a name="line.8252"></a>
-<span class="sourceLineNo">8253</span>   *<a name="line.8253"></a>
-<span class="sourceLineNo">8254</span>   * &lt;p&gt;<a name="line.8254"></a>
-<span class="sourceLineNo">8255</span>   * Only a single instance may be registered per region for a given {@link Service} subclass (the<a name="line.8255"></a>
-<span class="sourceLineNo">8256</span>   * instances are keyed on {@link com.google.protobuf.Descriptors.ServiceDescriptor#getFullName()}.<a name="line.8256"></a>
-<span class="sourceLineNo">8257</span>   * After the first registration, subsequent calls with the same service name will fail with<a name="line.8257"></a>
-<span class="sourceLineNo">8258</span>   * a return value of {@code false}.<a name="line.8258"></a>
-<span class="sourceLineNo">8259</span>   * &lt;/p&gt;<a name="line.8259"></a>
-<span class="sourceLineNo">8260</span>   * @param instance the {@code Service} subclass instance to expose as a coprocessor endpoint<a name="line.8260"></a>
-<span class="sourceLineNo">8261</span>   * @return {@code true} if the registration was successful, {@code false}<a name="line.8261"></a>
-<span class="sourceLineNo">8262</span>   * otherwise<a name="line.8262"></a>
-<span class="sourceLineNo">8263</span>   */<a name="line.8263"></a>
-<span class="sourceLineNo">8264</span>  public boolean registerService(com.google.protobuf.Service instance) {<a name="line.8264"></a>
-<span class="sourceLineNo">8265</span>    /*<a name="line.8265"></a>
-<span class="sourceLineNo">8266</span>     * No stacking of instances is allowed for a single service name<a name="line.8266"></a>
-<span class="sourceLineNo">8267</span>     */<a name="line.8267"></a>
-<span class="sourceLineNo">8268</span>    com.google.protobuf.Descriptors.ServiceDescriptor serviceDesc = instance.getDescriptorForType();<a name="line.8268"></a>
-<span class="sourceLineNo">8269</span>    String serviceName = CoprocessorRpcUtils.getServiceName(serviceDesc);<a name="line.8269"></a>
-<span class="sourceLineNo">8270</span>    if (coprocessorServiceHandlers.containsKey(serviceName)) {<a name="line.8270"></a>
-<span class="sourceLineNo">8271</span>      LOG.error("Coprocessor service " + serviceName +<a name="line.8271"></a>
-<span class="sourceLineNo">8272</span>          " already registered, rejecting request from " + instance);<a name="line.8272"></a>
-<span class="sourceLineNo">8273</span>      return false;<a name="line.8273"></a>
-<span class="sourceLineNo">8274</span>    }<a name="line.8274"></a>
-<span class="sourceLineNo">8275</span><a name="line.8275"></a>
-<span class="sourceLineNo">8276</span>    coprocessorServiceHandlers.put(serviceName, instance);<a name="line.8276"></a>
-<span class="sourceLineNo">8277</span>    if (LOG.isDebugEnabled()) {<a name="line.8277"></a>
-<span class="sourceLineNo">8278</span>      LOG.debug("Registered coprocessor service: region=" +<a name="line.8278"></a>
-<span class="sourceLineNo">8279</span>          Bytes.toStringBinary(getRegionInfo().getRegionName()) +<a name="line.8279"></a>
-<span class="sourceLineNo">8280</span>          " service=" + serviceName);<a name="line.8280"></a>
-<span class="sourceLineNo">8281</span>    }<a name="line.8281"></a>
-<span class="sourceLineNo">8282</span>    return true;<a name="line.8282"></a>
-<span class="sourceLineNo">8283</span>  }<a name="line.8283"></a>
-<span class="sourceLineNo">8284</span><a name="line.8284"></a>
-<span class="sourceLineNo">8285</span>  /**<a name="line.8285"></a>
-<span class="sourceLineNo">8286</span>   * Executes a single protocol buffer coprocessor endpoint {@link Service} method using<a name="line.8286"></a>
-<span class="sourceLineNo">8287</span>   * the registered protocol handlers.  {@link Service} implementations must be registered via the<a name="line.8287"></a>
-<span class="sourceLineNo">8288</span>   * {@link #registerService(com.google.protobuf.Service)}<a name="line.8288"></a>
-<span class="sourceLineNo">8289</span>   * method before they are available.<a name="line.8289"></a>
-<span class="sourceLineNo">8290</span>   *<a name="line.8290"></a>
-<span class="sourceLineNo">8291</span>   * @param controller an {@code RpcContoller} implementation to pass to the invoked service<a name="line.8291"></a>
-<span class="sourceLineNo">8292</span>   * @param call a {@code CoprocessorServiceCall} instance identifying the service, method,<a name="line.8292"></a>
-<span class="sourceLineNo">8293</span>   *     and parameters for the method invocation<a name="line.8293"></a>
-<span class="sourceLineNo">8294</span>   * @return a protocol buffer {@code Message} instance containing the method's result<a name="line.8294"></a>
-<span class="sourceLineNo">8295</span>   * @throws IOException if no registered service handler is found or an error<a name="line.8295"></a>
-<span class="sourceLineNo">8296</span>   *     occurs during the invocation<a name="line.8296"></a>
-<span class="sourceLineNo">8297</span>   * @see #registerService(com.google.protobuf.Service)<a name="line.8297"></a>
-<span class="sourceLineNo">8298</span>   */<a name="line.8298"></a>
-<span class="sourceLineNo">8299</span>  public com.google.protobuf.Message execService(com.google.protobuf.RpcController controller,<a name="line.8299"></a>
-<span class="sourceLineNo">8300</span>      CoprocessorServiceCall call) throws IOException {<a name="line.8300"></a>
-<span class="sourceLineNo">8301</span>    String serviceName = call.getServiceName();<a name="line.8301"></a>
-<span class="sourceLineNo">8302</span>    com.google.protobuf.Service service = coprocessorServiceHandlers.get(serviceName);<a name="line.8302"></a>
-<span class="sourceLineNo">8303</span>    if (service == null) {<a name="line.8303"></a>
-<span class="sourceLineNo">8304</span>      throw new UnknownProtocolException(null, "No registered coprocessor service found for " +<a name="line.8304"></a>
-<span class="sourceLineNo">8305</span>          serviceName + " in region " + Bytes.toStringBinary(getRegionInfo().getRegionName()));<a name="line.8305"></a>
-<span class="sourceLineNo">8306</span>    }<a name="line.8306"></a>
-<span class="sourceLineNo">8307</span>    com.google.protobuf.Descriptors.ServiceDescriptor serviceDesc = service.getDescriptorForType();<a name="line.8307"></a>
-<span class="sourceLineNo">8308</span><a name="line.8308"></a>
-<span class="sourceLineNo">8309</span>    cpRequestsCount.increment();<a name="line.8309"></a>
-<span class="sourceLineNo">8310</span>    String methodName = call.getMethodName();<a name="line.8310"></a>
-<span class="sourceLineNo">8311</span>    com.google.protobuf.Descriptors.MethodDescriptor methodDesc =<a name="line.8311"></a>
-<span class="sourceLineNo">8312</span>        CoprocessorRpcUtils.getMethodDescriptor(methodName, serviceDesc);<a name="line.8312"></a>
+<span class="sourceLineNo">8125</span>      cellPairs.add(new Pair&lt;&gt;(currentValue, newCell));<a name="line.8125"></a>
+<span class="sourceLineNo">8126</span>      // Add to results to get returned to the Client. If null, cilent does not want results.<a name="line.8126"></a>
+<span class="sourceLineNo">8127</span>      if (results != null) {<a name="line.8127"></a>
+<span class="sourceLineNo">8128</span>        results.add(newCell);<a name="line.8128"></a>
+<span class="sourceLineNo">8129</span>      }<a name="line.8129"></a>
+<span class="sourceLineNo">8130</span>    }<a name="line.8130"></a>
+<span class="sourceLineNo">8131</span><a name="line.8131"></a>
+<span class="sourceLineNo">8132</span>    // Give coprocessors a chance to update the new cells before apply to WAL or memstore<a name="line.8132"></a>
+<span class="sourceLineNo">8133</span>    if (coprocessorHost != null) {<a name="line.8133"></a>
+<span class="sourceLineNo">8134</span>      // Here the operation must be increment or append.<a name="line.8134"></a>
+<span class="sourceLineNo">8135</span>      cellPairs = op == Operation.INCREMENT ?<a name="line.8135"></a>
+<span class="sourceLineNo">8136</span>          coprocessorHost.postIncrementBeforeWAL(mutation, cellPairs) :<a name="line.8136"></a>
+<span class="sourceLineNo">8137</span>          coprocessorHost.postAppendBeforeWAL(mutation, cellPairs);<a name="line.8137"></a>
+<span class="sourceLineNo">8138</span>    }<a name="line.8138"></a>
+<span class="sourceLineNo">8139</span>    return cellPairs.stream().map(Pair::getSecond).collect(Collectors.toList());<a name="line.8139"></a>
+<span class="sourceLineNo">8140</span>  }<a name="line.8140"></a>
+<span class="sourceLineNo">8141</span><a name="line.8141"></a>
+<span class="sourceLineNo">8142</span>  private static Cell reckonDelta(final Cell delta, final Cell currentCell,<a name="line.8142"></a>
+<span class="sourceLineNo">8143</span>                                  final byte[] columnFamily, final long now,<a name="line.8143"></a>
+<span class="sourceLineNo">8144</span>                                  Mutation mutation, Function&lt;Cell, byte[]&gt; supplier) throws IOException {<a name="line.8144"></a>
+<span class="sourceLineNo">8145</span>    // Forward any tags found on the delta.<a name="line.8145"></a>
+<span class="sourceLineNo">8146</span>    List&lt;Tag&gt; tags = TagUtil.carryForwardTags(delta);<a name="line.8146"></a>
+<span class="sourceLineNo">8147</span>    tags = TagUtil.carryForwardTTLTag(tags, mutation.getTTL());<a name="line.8147"></a>
+<span class="sourceLineNo">8148</span>    if (currentCell != null) {<a name="line.8148"></a>
+<span class="sourceLineNo">8149</span>      tags = TagUtil.carryForwardTags(tags, currentCell);<a name="line.8149"></a>
+<span class="sourceLineNo">8150</span>      byte[] newValue = supplier.apply(currentCell);<a name="line.8150"></a>
+<span class="sourceLineNo">8151</span>      return ExtendedCellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.8151"></a>
+<span class="sourceLineNo">8152</span>              .setRow(mutation.getRow(), 0, mutation.getRow().length)<a name="line.8152"></a>
+<span class="sourceLineNo">8153</span>              .setFamily(columnFamily, 0, columnFamily.length)<a name="line.8153"></a>
+<span class="sourceLineNo">8154</span>              // copy the qualifier if the cell is located in shared memory.<a name="line.8154"></a>
+<span class="sourceLineNo">8155</span>              .setQualifier(CellUtil.cloneQualifier(delta))<a name="line.8155"></a>
+<span class="sourceLineNo">8156</span>              .setTimestamp(Math.max(currentCell.getTimestamp() + 1, now))<a name="line.8156"></a>
+<span class="sourceLineNo">8157</span>              .setType(KeyValue.Type.Put.getCode())<a name="line.8157"></a>
+<span class="sourceLineNo">8158</span>              .setValue(newValue, 0, newValue.length)<a name="line.8158"></a>
+<span class="sourceLineNo">8159</span>              .setTags(TagUtil.fromList(tags))<a name="line.8159"></a>
+<span class="sourceLineNo">8160</span>              .build();<a name="line.8160"></a>
+<span class="sourceLineNo">8161</span>    } else {<a name="line.8161"></a>
+<span class="sourceLineNo">8162</span>      PrivateCellUtil.updateLatestStamp(delta, now);<a name="line.8162"></a>
+<span class="sourceLineNo">8163</span>      return CollectionUtils.isEmpty(tags) ? delta : PrivateCellUtil.createCell(delta, tags);<a name="line.8163"></a>
+<span class="sourceLineNo">8164</span>    }<a name="line.8164"></a>
+<span class="sourceLineNo">8165</span>  }<a name="line.8165"></a>
+<span class="sourceLineNo">8166</span><a name="line.8166"></a>
+<span class="sourceLineNo">8167</span>  /**<a name="line.8167"></a>
+<span class="sourceLineNo">8168</span>   * @return Get the long out of the passed in Cell<a name="line.8168"></a>
+<span class="sourceLineNo">8169</span>   */<a name="line.8169"></a>
+<span class="sourceLineNo">8170</span>  private static long getLongValue(final Cell cell) throws DoNotRetryIOException {<a name="line.8170"></a>
+<span class="sourceLineNo">8171</span>    int len = cell.getValueLength();<a name="line.8171"></a>
+<span class="sourceLineNo">8172</span>    if (len != Bytes.SIZEOF_LONG) {<a name="line.8172"></a>
+<span class="sourceLineNo">8173</span>      // throw DoNotRetryIOException instead of IllegalArgumentException<a name="line.8173"></a>
+<span class="sourceLineNo">8174</span>      throw new DoNotRetryIOException("Field is not a long, it's " + len + " bytes wide");<a name="line.8174"></a>
+<span class="sourceLineNo">8175</span>    }<a name="line.8175"></a>
+<span class="sourceLineNo">8176</span>    return PrivateCellUtil.getValueAsLong(cell);<a name="line.8176"></a>
+<span class="sourceLineNo">8177</span>  }<a name="line.8177"></a>
+<span class="sourceLineNo">8178</span><a name="line.8178"></a>
+<span class="sourceLineNo">8179</span>  /**<a name="line.8179"></a>
+<span class="sourceLineNo">8180</span>   * Do a specific Get on passed &lt;code&gt;columnFamily&lt;/code&gt; and column qualifiers.<a name="line.8180"></a>
+<span class="sourceLineNo">8181</span>   * @param mutation Mutation we are doing this Get for.<a name="line.8181"></a>
+<span class="sourceLineNo">8182</span>   * @param store Which column family on row (TODO: Go all Gets in one go)<a name="line.8182"></a>
+<span class="sourceLineNo">8183</span>   * @param coordinates Cells from &lt;code&gt;mutation&lt;/code&gt; used as coordinates applied to Get.<a name="line.8183"></a>
+<span class="sourceLineNo">8184</span>   * @return Return list of Cells found.<a name="line.8184"></a>
+<span class="sourceLineNo">8185</span>   */<a name="line.8185"></a>
+<span class="sourceLineNo">8186</span>  private List&lt;Cell&gt; get(Mutation mutation, HStore store, List&lt;Cell&gt; coordinates,<a name="line.8186"></a>
+<span class="sourceLineNo">8187</span>      IsolationLevel isolation, TimeRange tr) throws IOException {<a name="line.8187"></a>
+<span class="sourceLineNo">8188</span>    // Sort the cells so that they match the order that they appear in the Get results. Otherwise,<a name="line.8188"></a>
+<span class="sourceLineNo">8189</span>    // we won't be able to find the existing values if the cells are not specified in order by the<a name="line.8189"></a>
+<span class="sourceLineNo">8190</span>    // client since cells are in an array list.<a name="line.8190"></a>
+<span class="sourceLineNo">8191</span>    // TODO: I don't get why we are sorting. St.Ack 20150107<a name="line.8191"></a>
+<span class="sourceLineNo">8192</span>    sort(coordinates, store.getComparator());<a name="line.8192"></a>
+<span class="sourceLineNo">8193</span>    Get get = new Get(mutation.getRow());<a name="line.8193"></a>
+<span class="sourceLineNo">8194</span>    if (isolation != null) {<a name="line.8194"></a>
+<span class="sourceLineNo">8195</span>      get.setIsolationLevel(isolation);<a name="line.8195"></a>
+<span class="sourceLineNo">8196</span>    }<a name="line.8196"></a>
+<span class="sourceLineNo">8197</span>    for (Cell cell: coordinates) {<a name="line.8197"></a>
+<span class="sourceLineNo">8198</span>      get.addColumn(store.getColumnFamilyDescriptor().getName(), CellUtil.cloneQualifier(cell));<a name="line.8198"></a>
+<span class="sourceLineNo">8199</span>    }<a name="line.8199"></a>
+<span class="sourceLineNo">8200</span>    // Increments carry time range. If an Increment instance, put it on the Get.<a name="line.8200"></a>
+<span class="sourceLineNo">8201</span>    if (tr != null) {<a name="line.8201"></a>
+<span class="sourceLineNo">8202</span>      get.setTimeRange(tr.getMin(), tr.getMax());<a name="line.8202"></a>
+<span class="sourceLineNo">8203</span>    }<a name="line.8203"></a>
+<span class="sourceLineNo">8204</span>    return get(get, false);<a name="line.8204"></a>
+<span class="sourceLineNo">8205</span>  }<a name="line.8205"></a>
+<span class="sourceLineNo">8206</span><a name="line.8206"></a>
+<span class="sourceLineNo">8207</span>  /**<a name="line.8207"></a>
+<span class="sourceLineNo">8208</span>   * @return Sorted list of &lt;code&gt;cells&lt;/code&gt; using &lt;code&gt;comparator&lt;/code&gt;<a name="line.8208"></a>
+<span class="sourceLineNo">8209</span>   */<a name="line.8209"></a>
+<span class="sourceLineNo">8210</span>  private static List&lt;Cell&gt; sort(List&lt;Cell&gt; cells, final CellComparator comparator) {<a name="line.8210"></a>
+<span class="sourceLineNo">8211</span>    cells.sort(comparator);<a name="line.8211"></a>
+<span class="sourceLineNo">8212</span>    return cells;<a name="line.8212"></a>
+<span class="sourceLineNo">8213</span>  }<a name="line.8213"></a>
+<span class="sourceLineNo">8214</span><a name="line.8214"></a>
+<span class="sourceLineNo">8215</span>  public static final long FIXED_OVERHEAD = ClassSize.align(<a name="line.8215"></a>
+<span class="sourceLineNo">8216</span>      ClassSize.OBJECT +<a name="line.8216"></a>
+<span class="sourceLineNo">8217</span>      ClassSize.ARRAY +<a name="line.8217"></a>
+<span class="sourceLineNo">8218</span>      55 * ClassSize.REFERENCE + 3 * Bytes.SIZEOF_INT +<a name="line.8218"></a>
+<span class="sourceLineNo">8219</span>      (15 * Bytes.SIZEOF_LONG) +<a name="line.8219"></a>
+<span class="sourceLineNo">8220</span>      3 * Bytes.SIZEOF_BOOLEAN);<a name="line.8220"></a>
+<span class="sourceLineNo">8221</span><a name="line.8221"></a>
+<span class="sourceLineNo">8222</span>  // woefully out of date - currently missing:<a name="line.8222"></a>
+<span class="sourceLineNo">8223</span>  // 1 x HashMap - coprocessorServiceHandlers<a name="line.8223"></a>
+<span class="sourceLineNo">8224</span>  // 6 x LongAdder - numMutationsWithoutWAL, dataInMemoryWithoutWAL,<a name="line.8224"></a>
+<span class="sourceLineNo">8225</span>  //   checkAndMutateChecksPassed, checkAndMutateChecksFailed, readRequestsCount,<a name="line.8225"></a>
+<span class="sourceLineNo">8226</span>  //   writeRequestsCount, cpRequestsCount<a name="line.8226"></a>
+<span class="sourceLineNo">8227</span>  // 1 x HRegion$WriteState - writestate<a name="line.8227"></a>
+<span class="sourceLineNo">8228</span>  // 1 x RegionCoprocessorHost - coprocessorHost<a name="line.8228"></a>
+<span class="sourceLineNo">8229</span>  // 1 x RegionSplitPolicy - splitPolicy<a name="line.8229"></a>
+<span class="sourceLineNo">8230</span>  // 1 x MetricsRegion - metricsRegion<a name="line.8230"></a>
+<span class="sourceLineNo">8231</span>  // 1 x MetricsRegionWrapperImpl - metricsRegionWrapper<a name="line.8231"></a>
+<span class="sourceLineNo">8232</span>  public static final long DEEP_OVERHEAD = FIXED_OVERHEAD +<a name="line.8232"></a>
+<span class="sourceLineNo">8233</span>      ClassSize.OBJECT + // closeLock<a name="line.8233"></a>
+<span class="sourceLineNo">8234</span>      (2 * ClassSize.ATOMIC_BOOLEAN) + // closed, closing<a name="line.8234"></a>
+<span class="sourceLineNo">8235</span>      (3 * ClassSize.ATOMIC_LONG) + // numPutsWithoutWAL, dataInMemoryWithoutWAL,<a name="line.8235"></a>
+<span class="sourceLineNo">8236</span>                                    // compactionsFailed<a name="line.8236"></a>
+<span class="sourceLineNo">8237</span>      (2 * ClassSize.CONCURRENT_HASHMAP) +  // lockedRows, scannerReadPoints<a name="line.8237"></a>
+<span class="sourceLineNo">8238</span>      WriteState.HEAP_SIZE + // writestate<a name="line.8238"></a>
+<span class="sourceLineNo">8239</span>      ClassSize.CONCURRENT_SKIPLISTMAP + ClassSize.CONCURRENT_SKIPLISTMAP_ENTRY + // stores<a name="line.8239"></a>
+<span class="sourceLineNo">8240</span>      (2 * ClassSize.REENTRANT_LOCK) + // lock, updatesLock<a name="line.8240"></a>
+<span class="sourceLineNo">8241</span>      MultiVersionConcurrencyControl.FIXED_SIZE // mvcc<a name="line.8241"></a>
+<span class="sourceLineNo">8242</span>      + 2 * ClassSize.TREEMAP // maxSeqIdInStores, replicationScopes<a name="line.8242"></a>
+<span class="sourceLineNo">8243</span>      + 2 * ClassSize.ATOMIC_INTEGER // majorInProgress, minorInProgress<a name="line.8243"></a>
+<span class="sourceLineNo">8244</span>      + ClassSize.STORE_SERVICES // store services<a name="line.8244"></a>
+<span class="sourceLineNo">8245</span>      + StoreHotnessProtector.FIXED_SIZE<a name="line.8245"></a>
+<span class="sourceLineNo">8246</span>      ;<a name="line.8246"></a>
+<span class="sourceLineNo">8247</span><a name="line.8247"></a>
+<span class="sourceLineNo">8248</span>  @Override<a name="line.8248"></a>
+<span class="sourceLineNo">8249</span>  public long heapSize() {<a name="line.8249"></a>
+<span class="sourceLineNo">8250</span>    // this does not take into account row locks, recent flushes, mvcc entries, and more<a name="line.8250"></a>
+<span class="sourceLineNo">8251</span>    return DEEP_OVERHEAD + stores.values().stream().mapToLong(HStore::heapSize).sum();<a name="line.8251"></a>
+<span class="sourceLineNo">8252</span>  }<a name="line.8252"></a>
+<span class="sourceLineNo">8253</span><a name="line.8253"></a>
+<span class="sourceLineNo">8254</span>  /**<a name="line.8254"></a>
+<span class="sourceLineNo">8255</span>   * Registers a new protocol buffer {@link Service} subclass as a coprocessor endpoint to<a name="line.8255"></a>
+<span class="sourceLineNo">8256</span>   * be available for handling Region#execService(com.google.protobuf.RpcController,<a name="line.8256"></a>
+<span class="sourceLineNo">8257</span>   *    org.apache.hadoop.hbase.protobuf.generated.ClientProtos.CoprocessorServiceCall) calls.<a name="line.8257"></a>
+<span class="sourceLineNo">8258</span>   *<a name="line.8258"></a>
+<span class="sourceLineNo">8259</span>   * &lt;p&gt;<a name="line.8259"></a>
+<span class="sourceLineNo">8260</span>   * Only a single instance may be registered per region for a given {@link Service} subclass (the<a name="line.8260"></a>
+<span class="sourceLineNo">8261</span>   * instances are keyed on {@link com.google.protobuf.Descriptors.ServiceDescriptor#getFullName()}.<a name="line.8261"></a>
+<span class="sourceLineNo">8262</span>   * After the first registration, subsequent calls with the same service name will fail with<a name="line.8262"></a>
+<span class="sourceLineNo">8263</span>   * a return value of {@code false}.<a name="line.8263"></a>
+<span class="sourceLineNo">8264</span>   * &lt;/p&gt;<a name="line.8264"></a>
+<span class="sourceLineNo">8265</span>   * @param instance the {@code Service} subclass instance to expose as a coprocessor endpoint<a name="line.8265"></a>
+<span class="sourceLineNo">8266</span>   * @return {@code true} if the registration was successful, {@code false}<a name="line.8266"></a>
+<span class="sourceLineNo">8267</span>   * otherwise<a name="line.8267"></a>
+<span class="sourceLineNo">8268</span>   */<a name="line.8268"></a>
+<span class="sourceLineNo">8269</span>  public boolean registerService(com.google.protobuf.Service instance) {<a name="line.8269"></a>
+<span class="sourceLineNo">8270</span>    /*<a name="line.8270"></a>
+<span class="sourceLineNo">8271</span>     * No stacking of instances is allowed for a single service name<a name="line.8271"></a>
+<span class="sourceLineNo">8272</span>     */<a name="line.8272"></a>
+<span class="sourceLineNo">8273</span>    com.google.protobuf.Descriptors.ServiceDescriptor serviceDesc = instance.getDescriptorForType();<a name="line.8273"></a>
+<span class="sourceLineNo">8274</span>    String serviceName = CoprocessorRpcUtils.getServiceName(serviceDesc);<a name="line.8274"></a>
+<span class="sourceLineNo">8275</span>    if (coprocessorServiceHandlers.containsKey(serviceName)) {<a name="line.8275"></a>
+<span class="sourceLineNo">8276</span>      LOG.error("Coprocessor service " + serviceName +<a name="line.8276"></a>
+<span class="sourceLineNo">8277</span>          " already registered, rejecting request from " + instance);<a name="line.8277"></a>
+<span class="sourceLineNo">8278</span>      return false;<a name="line.8278"></a>
+<span class="sourceLineNo">8279</span>    }<a name="line.8279"></a>
+<span class="sourceLineNo">8280</span><a name="line.8280"></a>
+<span class="sourceLineNo">8281</span>    coprocessorServiceHandlers.put(serviceName, instance);<a name="line.8281"></a>
+<span class="sourceLineNo">8282</span>    if (LOG.isDebugEnabled()) {<a name="line.8282"></a>
+<span class="sourceLineNo">8283</span>      LOG.debug("Registered coprocessor service: region=" +<a name="line.8283"></a>
+<span class="sourceLineNo">8284</span>          Bytes.toStringBinary(getRegionInfo().getRegionName()) +<a name="line.8284"></a>
+<span class="sourceLineNo">8285</span>          " service=" + serviceName);<a name="line.8285"></a>
+<span class="sourceLineNo">8286</span>    }<a name="line.8286"></a>
+<span class="sourceLineNo">8287</span>    return true;<a name="line.8287"></a>
+<span class="sourceLineNo">8288</span>  }<a name="line.8288"></a>
+<span class="sourceLineNo">8289</span><a name="line.8289"></a>
+<span class="sourceLineNo">8290</span>  /**<a name="line.8290"></a>
+<span class="sourceLineNo">8291</span>   * Executes a single protocol buffer coprocessor endpoint {@link Service} method using<a name="line.8291"></a>
+<span class="sourceLineNo">8292</span>   * the registered protocol handlers.  {@link Service} implementations must be registered via the<a name="line.8292"></a>
+<span class="sourceLineNo">8293</span>   * {@link #registerService(com.google.protobuf.Service)}<a name="line.8293"></a>
+<span class="sourceLineNo">8294</span>   * method before they are available.<a name="line.8294"></a>
+<span class="sourceLineNo">8295</span>   *<a name="line.8295"></a>
+<span class="sourceLineNo">8296</span>   * @param controller an {@code RpcContoller} implementation to pass to the invoked service<a name="line.8296"></a>
+<span class="sourceLineNo">8297</span>   * @param call a {@code CoprocessorServiceCall} instance identifying the service, method,<a name="line.8297"></a>
+<span class="sourceLineNo">8298</span>   *     and parameters for the method invocation<a name="line.8298"></a>
+<span class="sourceLineNo">8299</span>   * @return a protocol buffer {@code Message} instance containing the method's result<a name="line.8299"></a>
+<span class="sourceLineNo">8300</span>   * @throws IOException if no registered service handler is found or an error<a name="line.8300"></a>
+<span class="sourceLineNo">8301</span>   *     occurs during the invocation<a name="line.8301"></a>
+<span class="sourceLineNo">8302</span>   * @see #registerService(com.google.protobuf.Service)<a name="line.8302"></a>
+<span class="sourceLineNo">8303</span>   */<a name="line.8303"></a>
+<span class="sourceLineNo">8304</span>  public com.google.protobuf.Message execService(com.google.protobuf.RpcController controller,<a name="line.8304"></a>
+<span class="sourceLineNo">8305</span>      CoprocessorServiceCall call) throws IOException {<a name="line.8305"></a>
+<span class="sourceLineNo">8306</span>    String serviceName = call.getServiceName();<a name="line.8306"></a>
+<span class="sourceLineNo">8307</span>    com.google.protobuf.Service service = coprocessorServiceHandlers.get(serviceName);<a name="line.8307"></a>
+<span class="sourceLineNo">8308</span>    if (service == null) {<a name="line.8308"></a>
+<span class="sourceLineNo">8309</span>      throw new UnknownProtocolException(null, "No registered coprocessor service found for " +<a name="line.8309"></a>
+<span class="sourceLineNo">8310</span>          serviceName + " in region " + Bytes.toStringBinary(getRegionInfo().getRegionName()));<a name="line.8310"></a>
+<span class="sourceLineNo">8311</span>    }<a name="line.8311"></a>
+<span class="sourceLineNo">8312</span>    com.google.protobuf.Descriptors.ServiceDescriptor serviceDesc = service.getDescriptorForType();<a name="line.8312"></a>
 <span class="sourceLineNo">8313</span><a name="line.8313"></a>
-<span class="sourceLineNo">8314</span>    com.google.protobuf.Message.Builder builder =<a name="line.8314"></a>
-<span class="sourceLineNo">8315</span>        service.getRequestPrototype(methodDesc).newBuilderForType();<a name="line.8315"></a>
-<span class="sourceLineNo">8316</span><a name="line.8316"></a>
-<span class="sourceLineNo">8317</span>    org.apache.hadoop.hbase.protobuf.ProtobufUtil.mergeFrom(builder,<a name="line.8317"></a>
-<span class="sourceLineNo">8318</span>        call.getRequest().toByteArray());<a name="line.8318"></a>
-<span class="sourceLineNo">8319</span>    com.google.protobuf.Message request =<a name="line.8319"></a>
-<span class="sourceLineNo">8320</span>        CoprocessorRpcUtils.getRequest(service, methodDesc, call.getRequest());<a name="line.8320"></a>
+<span class="sourceLineNo">8314</span>    cpRequestsCount.increment();<a name="line.8314"></a>
+<span class="sourceLineNo">8315</span>    String methodName = call.getMethodName();<a name="line.8315"></a>
+<span class="sourceLineNo">8316</span>    com.google.protobuf.Descriptors.MethodDescriptor methodDesc =<a name="line.8316"></a>
+<span class="sourceLineNo">8317</span>        CoprocessorRpcUtils.getMethodDescriptor(methodName, serviceDesc);<a name="line.8317"></a>
+<span class="sourceLineNo">8318</span><a name="line.8318"></a>
+<span class="sourceLineNo">8319</span>    com.google.protobuf.Message.Builder builder =<a name="line.8319"></a>
+<span class="sourceLineNo">8320</span>        service.getRequestPrototype(methodDesc).newBuilderForType();<a name="line.8320"></a>
 <span class="sourceLineNo">8321</span><a name="line.8321"></a>
-<span class="sourceLineNo">8322</span>    if (coprocessorHost != null) {<a name="line.8322"></a>
-<span class="sourceLineNo">8323</span>      request = coprocessorHost.preEndpointInvocation(service, methodName, request);<a name="line.8323"></a>
-<span class="sourceLineNo">8324</span>    }<a name="line.8324"></a>
-<span class="sourceLineNo">8325</span><a name="line.8325"></a>
-<span class="sourceLineNo">8326</span>    final com.google.protobuf.Message.Builder responseBuilder =<a name="line.8326"></a>
-<span class="sourceLineNo">8327</span>        service.getResponsePrototype(methodDesc).newBuilderForType();<a name="line.8327"></a>
-<span class="sourceLineNo">8328</span>    service.callMethod(methodDesc, controller, request,<a name="line.8328"></a>
-<span class="sourceLineNo">8329</span>        new com.google.protobuf.RpcCallback&lt;com.google.protobuf.Message&gt;() {<a name="line.8329"></a>
-<span class="sourceLineNo">8330</span>      @Override<a name="line.8330"></a>
-<span class="sourceLineNo">8331</span>      public void run(com.google.protobuf.Message message) {<a name="line.8331"></a>
-<span class="sourceLineNo">8332</span>        if (message != null) {<a name="line.8332"></a>
-<span class="sourceLineNo">8333</span>          responseBuilder.mergeFrom(message);<a name="line.8333"></a>
-<span class="sourceLineNo">8334</span>        }<a name="line.8334"></a>
-<span class="sourceLineNo">8335</span>      }<a name="line.8335"></a>
-<span class="sourceLineNo">8336</span>    });<a name="line.8336"></a>
-<span class="sourceLineNo">8337</span><a name="line.8337"></a>
-<span class="sourceLineNo">8338</span>    if (coprocessorHost != null) {<a name="line.8338"></a>
-<span class="sourceLineNo">8339</span>      coprocessorHost.postEndpointInvocation(service, methodName, request, responseBuilder);<a name="line.8339"></a>
-<span class="sourceLineNo">8340</span>    }<a name="line.8340"></a>
-<span class="sourceLineNo">8341</span>    IOException exception =<a name="line.8341"></a>
-<span class="sourceLineNo">8342</span>        org.apache.hadoop.hbase.ipc.CoprocessorRpcUtils.getControllerException(controller);<a name="line.8342"></a>
-<span class="sourceLineNo">8343</span>    if (exception != null) {<a name="line.8343"></a>
-<span class="sourceLineNo">8344</span>      throw exception;<a name="line.8344"></a>
+<span class="sourceLineNo">8322</span>    org.apache.hadoop.hbase.protobuf.ProtobufUtil.mergeFrom(builder,<a name="line.8322"></a>
+<span class="sourceLineNo">8323</span>        call.getRequest().toByteArray());<a name="line.8323"></a>
+<span class="sourceLineNo">8324</span>    com.google.protobuf.Message request =<a name="line.8324"></a>
+<span class="sourceLineNo">8325</span>        CoprocessorRpcUtils.getRequest(service, methodDesc, call.getRequest());<a name="line.8325"></a>
+<span class="sourceLineNo">8326</span><a name="line.8326"></a>
+<span class="sourceLineNo">8327</span>    if (coprocessorHost != null) {<a name="line.8327"></a>
+<span class="sourceLineNo">8328</span>      request = coprocessorHost.preEndpointInvocation(service, methodName, request);<a name="line.8328"></a>
+<span class="sourceLineNo">8329</span>    }<a name="line.8329"></a>
+<span class="sourceLineNo">8330</span><a name="line.8330"></a>
+<span class="sourceLineNo">8331</span>    final com.google.protobuf.Message.Builder responseBuilder =<a name="line.8331"></a>
+<span class="sourceLineNo">8332</span>        service.getResponsePrototype(methodDesc).newBuilderForType();<a name="line.8332"></a>
+<span class="sourceLineNo">8333</span>    service.callMethod(methodDesc, controller, request,<a name="line.8333"></a>
+<span class="sourceLineNo">8334</span>        new com.google.protobuf.RpcCallback&lt;com.google.protobuf.Message&gt;() {<a name="line.8334"></a>
+<span class="sourceLineNo">8335</span>      @Override<a name="line.8335"></a>
+<span class="sourceLineNo">8336</span>      public void run(com.google.protobuf.Message message) {<a name="line.8336"></a>
+<span class="sourceLineNo">8337</span>        if (message != null) {<a name="line.8337"></a>
+<span class="sourceLineNo">8338</span>          responseBuilder.mergeFrom(message);<a name="line.8338"></a>
+<span class="sourceLineNo">8339</span>        }<a name="line.8339"></a>
+<span class="sourceLineNo">8340</span>      }<a name="line.8340"></a>
+<span class="sourceLineNo">8341</span>    });<a name="line.8341"></a>
+<span class="sourceLineNo">8342</span><a name="line.8342"></a>
+<span class="sourceLineNo">8343</span>    if (coprocessorHost != null) {<a name="line.8343"></a>
+<span class="sourceLineNo">8344</span>      coprocessorHost.postEndpointInvocation(service, methodName, request, responseBuilder);<a name="line.8344"></a>
 <span class="sourceLineNo">8345</span>    }<a name="line.8345"></a>
-<span class="sourceLineNo">8346</span><a name="line.8346"></a>
-<span class="sourceLineNo">8347</span>    return responseBuilder.build();<a name="line.8347"></a>
-<span class="sourceLineNo">8348</span>  }<a name="line.8348"></a>
-<span class="sourceLineNo">8349</span><a name="line.8349"></a>
-<span class="sourceLineNo">8350</span>  boolean shouldForceSplit() {<a name="line.8350"></a>
-<span class="sourceLineNo">8351</span>    return this.splitRequest;<a name="line.8351"></a>
-<span class="sourceLineNo">8352</span>  }<a name="line.8352"></a>
-<span class="sourceLineNo">8353</span><a name="line.8353"></a>
-<span class="sourceLineNo">8354</span>  byte[] getExplicitSplitPoint() {<a name="line.8354"></a>
-<span class="sourceLineNo">8355</span>    return this.explicitSplitPoint;<a name="line.8355"></a>
-<span class="sourceLineNo">8356</span>  }<a name="line.8356"></a>
-<span class="sourceLineNo">8357</span><a name="line.8357"></a>
-<span class="sourceLineNo">8358</span>  void forceSplit(byte[] sp) {<a name="line.8358"></a>
-<span class="sourceLineNo">8359</span>    // This HRegion will go away after the forced split is successful<a name="line.8359"></a>
-<span class="sourceLineNo">8360</span>    // But if a forced split fails, we need to clear forced split.<a name="line.8360"></a>
-<span class="sourceLineNo">8361</span>    this.splitRequest = true;<a name="line.8361"></a>
-<span class="sourceLineNo">8362</span>    if (sp != null) {<a name="line.8362"></a>
-<span class="sourceLineNo">8363</span>      this.explicitSplitPoint = sp;<a name="line.8363"></a>
-<span class="sourceLineNo">8364</span>    }<a name="line.8364"></a>
-<span class="sourceLineNo">8365</span>  }<a name="line.8365"></a>
-<span class="sourceLineNo">8366</span><a name="line.8366"></a>
-<span class="sourceLineNo">8367</span>  void clearSplit() {<a name="line.8367"></a>
-<span class="sourceLineNo">8368</span>    this.splitRequest = false;<a name="line.8368"></a>
-<span class="sourceLineNo">8369</span>    this.explicitSplitPoint = null;<a name="line.8369"></a>
+<span class="sourceLineNo">8346</span>    IOException exception =<a name="line.8346"></a>
+<span class="sourceLineNo">8347</span>        org.apache.hadoop.hbase.ipc.CoprocessorRpcUtils.getControllerException(controller);<a name="line.8347"></a>
+<span class="sourceLineNo">8348</span>    if (exception != null) {<a name="line.8348"></a>
+<span class="sourceLineNo">8349</span>      throw exception;<a name="line.8349"></a>
+<span class="sourceLineNo">8350</span>    }<a name="line.8350"></a>
+<span class="sourceLineNo">8351</span><a name="line.8351"></a>
+<span class="sourceLineNo">8352</span>    return responseBuilder.build();<a name="line.8352"></a>
+<span class="sourceLineNo">8353</span>  }<a name="line.8353"></a>
+<span class="sourceLineNo">8354</span><a name="line.8354"></a>
+<span class="sourceLineNo">8355</span>  boolean shouldForceSplit() {<a name="line.8355"></a>
+<span class="sourceLineNo">8356</span>    return this.splitRequest;<a name="line.8356"></a>
+<span class="sourceLineNo">8357</span>  }<a name="line.8357"></a>
+<span class="sourceLineNo">8358</span><a name="line.8358"></a>
+<span class="sourceLineNo">8359</span>  byte[] getExplicitSplitPoint() {<a name="line.8359"></a>
+<span class="sourceLineNo">8360</span>    return this.explicitSplitPoint;<a name="line.8360"></a>
+<span class="sourceLineNo">8361</span>  }<a name="line.8361"></a>
+<span class="sourceLineNo">8362</span><a name="line.8362"></a>
+<span class="sourceLineNo">8363</span>  void forceSplit(byte[] sp) {<a name="line.8363"></a>
+<span class="sourceLineNo">8364</span>    // This HRegion will go away after the forced split is successful<a name="line.8364"></a>
+<span class="sourceLineNo">8365</span>    // But if a forced split fails, we need to clear forced split.<a name="line.8365"></a>
+<span class="sourceLineNo">8366</span>    this.splitRequest = true;<a name="line.8366"></a>
+<span class="sourceLineNo">8367</span>    if (sp != null) {<a name="line.8367"></a>
+<span class="sourceLineNo">8368</span>      this.explicitSplitPoint = sp;<a name="line.8368"></a>
+<span class="sourceLineNo">8369</span>    }<a name="line.8369"></a>
 <span class="sourceLineNo">8370</span>  }<a name="line.8370"></a>
 <span class="sourceLineNo">8371</span><a name="line.8371"></a>
-<span class="sourceLineNo">8372</span>  /**<a name="line.8372"></a>
-<span class="sourceLineNo">8373</span>   * Return the splitpoint. null indicates the region isn't splittable<a name="line.8373"></a>
-<span class="sourceLineNo">8374</span>   * If the splitpoint isn't explicitly specified, it will go over the stores<a name="line.8374"></a>
-<span class="sourceLineNo">8375</span>   * to find the best splitpoint. Currently the criteria of best splitpoint<a name="line.8375"></a>
-<span class="sourceLineNo">8376</span>   * is based on the size of the store.<a name="line.8376"></a>
-<span class="sourceLineNo">8377</span>   */<a name="line.8377"></a>
-<span class="sourceLineNo">8378</span>  public byte[] checkSplit() {<a name="line.8378"></a>
-<span class="sourceLineNo">8379</span>    // Can't split META<a name="line.8379"></a>
-<span class="sourceLineNo">8380</span>    if (this.getRegionInfo().isMetaRegion()) {<a name="line.8380"></a>
-<span class="sourceLineNo">8381</span>      if (shouldForceSplit()) {<a name="line.8381"></a>
-<span class="sourceLineNo">8382</span>        LOG.warn("Cannot split meta region in HBase 0.20 and above");<a name="line.8382"></a>
-<span class="sourceLineNo">8383</span>      }<a name="line.8383"></a>
-<span class="sourceLineNo">8384</span>      return null;<a name="line.8384"></a>
-<span class="sourceLineNo">8385</span>    }<a name="line.8385"></a>
-<span class="sourceLineNo">8386</span><a name="line.8386"></a>
-<span class="sourceLineNo">8387</span>    // Can't split a region that is closing.<a name="line.8387"></a>
-<span class="sourceLineNo">8388</span>    if (this.isClosing()) {<a name="line.8388"></a>
+<span class="sourceLineNo">8372</span>  void clearSplit() {<a name="line.8372"></a>
+<span class="sourceLineNo">8373</span>    this.splitRequest = false;<a name="line.8373"></a>
+<span class="sourceLineNo">8374</span>    this.explicitSplitPoint = null;<a name="line.8374"></a>
+<span class="sourceLineNo">8375</span>  }<a name="line.8375"></a>
+<span class="sourceLineNo">8376</span><a name="line.8376"></a>
+<span class="sourceLineNo">8377</span>  /**<a name="line.8377"></a>
+<span class="sourceLineNo">8378</span>   * Return the splitpoint. null indicates the region isn't splittable<a name="line.8378"></a>
+<span class="sourceLineNo">8379</span>   * If the splitpoint isn't explicitly specified, it will go over the stores<a name="line.8379"></a>
+<span class="sourceLineNo">8380</span>   * to find the best splitpoint. Currently the criteria of best splitpoint<a name="line.8380"></a>
+<span class="sourceLineNo">8381</span>   * is based on the size of the store.<a name="line.8381"></a>
+<span class="sourceLineNo">8382</span>   */<a name="line.8382"></a>
+<span class="sourceLineNo">8383</span>  public byte[] checkSplit() {<a name="line.8383"></a>
+<span class="sourceLineNo">8384</span>    // Can't split META<a name="line.8384"></a>
+<span class="sourceLineNo">8385</span>    if (this.getRegionInfo().isMetaRegion()) {<a name="line.8385"></a>
+<span class="sourceLineNo">8386</span>      if (shouldForceSplit()) {<a name="line.8386"></a>
+<span class="sourceLineNo">8387</span>        LOG.warn("Cannot split meta region in HBase 0.20 and above");<a name="line.8387"></a>
+<span class="sourceLineNo">8388</span>      }<a name="line.8388"></a>
 <span class="sourceLineNo">8389</span>      return null;<a name="line.8389"></a>
 <span class="sourceLineNo">8390</span>    }<a name="line.8390"></a>
 <span class="sourceLineNo">8391</span><a name="line.8391"></a>
-<span class="sourceLineNo">8392</span>    if (!splitPolicy.shouldSplit()) {<a name="line.8392"></a>
-<span class="sourceLineNo">8393</span>      return null;<a name="line.8393"></a>
-<span class="sourceLineNo">8394</span>    }<a name="line.8394"></a>
-<span class="sourceLineNo">8395</span><a name="line.8395"></a>
-<span class="sourceLineNo">8396</span>    byte[] ret = splitPolicy.getSplitPoint();<a name="line.8396"></a>
-<span class="sourceLineNo">8397</span><a name="line.8397"></a>
-<span class="sourceLineNo">8398</span>    if (ret != null) {<a name="line.8398"></a>
-<span class="sourceLineNo">8399</span>      try {<a name="line.8399"></a>
-<span class="sourceLineNo">8400</span>        checkRow(ret, "calculated split");<a name="line.8400"></a>
-<span class="sourceLineNo">8401</span>      } catch (IOException e) {<a name="line.8401"></a>
-<span class="sourceLineNo">8402</span>        LOG.error("Ignoring invalid split", e);<a name="line.8402"></a>
-<span class="sourceLineNo">8403</span>        return null;<a name="line.8403"></a>
-<span class="sourceLineNo">8404</span>      }<a name="line.8404"></a>
-<span class="sourceLineNo">8405</span>    }<a name="line.8405"></a>
-<span class="sourceLineNo">8406</span>    return ret;<a name="line.8406"></a>
-<span class="sourceLineNo">8407</span>  }<a name="line.8407"></a>
-<span class="sourceLineNo">8408</span><a name="line.8408"></a>
-<span class="sourceLineNo">8409</span>  /**<a name="line.8409"></a>
-<span class="sourceLineNo">8410</span>   * @return The priority that this region should have in the compaction queue<a name="line.8410"></a>
-<span class="sourceLineNo">8411</span>   */<a name="line.8411"></a>
-<span class="sourceLineNo">8412</span>  public int getCompactPriority() {<a name="line.8412"></a>
-<span class="sourceLineNo">8413</span>    return stores.values().stream().mapToInt(HStore::getCompactPriority).min()<a name="line.8413"></a>
-<span class="sourceLineNo">8414</span>        .orElse(Store.NO_PRIORITY);<a name="line.8414"></a>
-<span class="sourceLineNo">8415</span>  }<a name="line.8415"></a>
-<span class="sourceLineNo">8416</span><a name="line.8416"></a>
-<span class="sourceLineNo">8417</span>  /** @return the coprocessor host */<a name="line.8417"></a>
-<span class="sourceLineNo">8418</span>  public RegionCoprocessorHost getCoprocessorHost() {<a name="line.8418"></a>
-<span class="sourceLineNo">8419</span>    return coprocessorHost;<a name="line.8419"></a>
+<span class="sourceLineNo">8392</span>    // Can't split a region that is closing.<a name="line.8392"></a>
+<span class="sourceLineNo">8393</span>    if (this.isClosing()) {<a name="line.8393"></a>
+<span class="sourceLineNo">8394</span>      return null;<a name="line.8394"></a>
+<span class="sourceLineNo">8395</span>    }<a name="line.8395"></a>
+<span class="sourceLineNo">8396</span><a name="line.8396"></a>
+<span class="sourceLineNo">8397</span>    if (!splitPolicy.shouldSplit()) {<a name="line.8397"></a>
+<span class="sourceLineNo">8398</span>      return null;<a name="line.8398"></a>
+<span class="sourceLineNo">8399</span>    }<a name="line.8399"></a>
+<span class="sourceLineNo">8400</span><a name="line.8400"></a>
+<span class="sourceLineNo">8401</span>    byte[] ret = splitPolicy.getSplitPoint();<a name="line.8401"></a>
+<span class="sourceLineNo">8402</span><a name="line.8402"></a>
+<span class="sourceLineNo">8403</span>    if (ret != null) {<a name="line.8403"></a>
+<span class="sourceLineNo">8404</span>      try {<a name="line.8404"></a>
+<span class="sourceLineNo">8405</span>        checkRow(ret, "calculated split");<a name="line.8405"></a>
+<span class="sourceLineNo">8406</span>      } catch (IOException e) {<a name="line.8406"></a>
+<span class="sourceLineNo">8407</span>        LOG.error("Ignoring invalid split", e);<a name="line.8407"></a>
+<span class="sourceLineNo">8408</span>        return null;<a name="line.8408"></a>
+<span class="sourceLineNo">8409</span>      }<a name="line.8409"></a>
+<span class="sourceLineNo">8410</span>    }<a name="line.8410"></a>
+<span class="sourceLineNo">8411</span>    return ret;<a name="line.8411"></a>
+<span class="sourceLineNo">8412</span>  }<a name="line.8412"></a>
+<span class="sourceLineNo">8413</span><a name="line.8413"></a>
+<span class="sourceLineNo">8414</span>  /**<a name="line.8414"></a>
+<span class="sourceLineNo">8415</span>   * @return The priority that this region should have in the compaction queue<a name="line.8415"></a>
+<span class="sourceLineNo">8416</span>   */<a name="line.8416"></a>
+<span class="sourceLineNo">8417</span>  public int getCompactPriority() {<a name="line.8417"></a>
+<span class="sourceLineNo">8418</span>    return stores.values().stream().mapToInt(HStore::getCompactPriority).min()<a name="line.8418"></a>
+<span class="sourceLineNo">8419</span>        .orElse(Store.NO_PRIORITY);<a name="line.8419"></a>
 <span class="sourceLineNo">8420</span>  }<a name="line.8420"></a>
 <span class="sourceLineNo">8421</span><a name="line.8421"></a>
-<span class="sourceLineNo">8422</span>  /** @param coprocessorHost the new coprocessor host */<a name="line.8422"></a>
-<span class="sourceLineNo">8423</span>  @VisibleForTesting<a name="line.8423"></a>
-<span class="sourceLineNo">8424</span>  public void setCoprocessorHost(final RegionCoprocessorHost coprocessorHost) {<a name="line.8424"></a>
-<span class="sourceLineNo">8425</span>    this.coprocessorHost = coprocessorHost;<a name="line.8425"></a>
-<span class="sourceLineNo">8426</span>  }<a name="line.8426"></a>
-<span class="sourceLineNo">8427</span><a name="line.8427"></a>
-<span class="sourceLineNo">8428</span>  @Override<a name="line.8428"></a>
-<span class="sourceLineNo">8429</span>  public void startRegionOperation() throws IOException {<a name="line.8429"></a>
-<span class="sourceLineNo">8430</span>    startRegionOperation(Operation.ANY);<a name="line.8430"></a>
+<span class="sourceLineNo">8422</span>  /** @return the coprocessor host */<a name="line.8422"></a>
+<span class="sourceLineNo">8423</span>  public RegionCoprocessorHost getCoprocessorHost() {<a name="line.8423"></a>
+<span class="sourceLineNo">8424</span>    return coprocessorHost;<a name="line.8424"></a>
+<span class="sourceLineNo">8425</span>  }<a name="line.8425"></a>
+<span class="sourceLineNo">8426</span><a name="line.8426"></a>
+<span class="sourceLineNo">8427</span>  /** @param coprocessorHost the new coprocessor host */<a name="line.8427"></a>
+<span class="sourceLineNo">8428</span>  @VisibleForTesting<a name="line.8428"></a>
+<span class="sourceLineNo">8429</span>  public void setCoprocessorHost(final RegionCoprocessorHost coprocessorHost) {<a name="line.8429"></a>
+<span class="sourceLineNo">8430</span>    this.coprocessorHost = coprocessorHost;<a name="line.8430"></a>
 <span class="sourceLineNo">8431</span>  }<a name="line.8431"></a>
 <span class="sourceLineNo">8432</span><a name="line.8432"></a>
 <span class="sourceLineNo">8433</span>  @Override<a name="line.8433"></a>
-<span class="sourceLineNo">8434</span>  public void startRegionOperation(Operation op) throws IOException {<a name="line.8434"></a>
-<span class="sourceLineNo">8435</span>    switch (op) {<a name="line.8435"></a>
-<span class="sourceLineNo">8436</span>      case GET:  // read operations<a name="line.8436"></a>
-<span class="sourceLineNo">8437</span>      case SCAN:<a name="line.8437"></a>
-<span class="sourceLineNo">8438</span>        checkReadsEnabled();<a name="line.8438"></a>
-<span class="sourceLineNo">8439</span>        break;<a name="line.8439"></a>
-<span class="sourceLineNo">8440</span>      default:<a name="line.8440"></a>
-<span class="sourceLineNo">8441</span>        break;<a name="line.8441"></a>
-<span class="sourceLineNo">8442</span>    }<a name="line.8442"></a>
-<span class="sourceLineNo">8443</span>    if (op == Operation.MERGE_REGION || op == Operation.SPLIT_REGION<a name="line.8443"></a>
-<span class="sourceLineNo">8444</span>        || op == Operation.COMPACT_REGION || op == Operation.COMPACT_SWITCH) {<a name="line.8444"></a>
-<span class="sourceLineNo">8445</span>      // split, merge or compact region doesn't need to check the closing/closed state or lock the<a name="line.8445"></a>
-<span class="sourceLineNo">8446</span>      // region<a name="line.8446"></a>
-<span class="sourceLineNo">8447</span>      return;<a name="line.8447"></a>
-<span class="sourceLineNo">8448</span>    }<a name="line.8448"></a>
-<span class="sourceLineNo">8449</span>    if (this.closing.get()) {<a name="line.8449"></a>
-<span class="sourceLineNo">8450</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closing");<a name="line.8450"></a>
-<span class="sourceLineNo">8451</span>    }<a name="line.8451"></a>
-<span class="sourceLineNo">8452</span>    lock(lock.readLock());<a name="line.8452"></a>
-<span class="sourceLineNo">8453</span>    if (this.closed.get()) {<a name="line.8453"></a>
-<span class="sourceLineNo">8454</span>      lock.readLock().unlock();<a name="line.8454"></a>
-<span class="sourceLineNo">8455</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closed");<a name="line.8455"></a>
+<span class="sourceLineNo">8434</span>  public void startRegionOperation() throws IOException {<a name="line.8434"></a>
+<span class="sourceLineNo">8435</span>    startRegionOperation(Operation.ANY);<a name="line.8435"></a>
+<span class="sourceLineNo">8436</span>  }<a name="line.8436"></a>
+<span class="sourceLineNo">8437</span><a name="line.8437"></a>
+<span class="sourceLineNo">8438</span>  @Override<a name="line.8438"></a>
+<span class="sourceLineNo">8439</span>  public void startRegionOperation(Operation op) throws IOException {<a name="line.8439"></a>
+<span class="sourceLineNo">8440</span>    switch (op) {<a name="line.8440"></a>
+<span class="sourceLineNo">8441</span>      case GET:  // read operations<a name="line.8441"></a>
+<span class="sourceLineNo">8442</span>      case SCAN:<a name="line.8442"></a>
+<span class="sourceLineNo">8443</span>        checkReadsEnabled();<a name="line.8443"></a>
+<span class="sourceLineNo">8444</span>        break;<a name="line.8444"></a>
+<span class="sourceLineNo">8445</span>      default:<a name="line.8445"></a>
+<span class="sourceLineNo">8446</span>        break;<a name="line.8446"></a>
+<span class="sourceLineNo">8447</span>    }<a name="line.8447"></a>
+<span class="sourceLineNo">8448</span>    if (op == Operation.MERGE_REGION || op == Operation.SPLIT_REGION<a name="line.8448"></a>
+<span class="sourceLineNo">8449</span>        || op == Operation.COMPACT_REGION || op == Operation.COMPACT_SWITCH) {<a name="line.8449"></a>
+<span class="sourceLineNo">8450</span>      // split, merge or compact region doesn't need to check the closing/closed state or lock the<a name="line.8450"></a>
+<span class="sourceLineNo">8451</span>      // region<a name="line.8451"></a>
+<span class="sourceLineNo">8452</span>      return;<a name="line.8452"></a>
+<span class="sourceLineNo">8453</span>    }<a name="line.8453"></a>
+<span class="sourceLineNo">8454</span>    if (this.closing.get()) {<a name="line.8454"></a>
+<span class="sourceLineNo">8455</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closing");<a name="line.8455"></a>
 <span class="sourceLineNo">8456</span>    }<a name="line.8456"></a>
-<span class="sourceLineNo">8457</span>    // The unit for snapshot is a region. So, all stores for this region must be<a name="line.8457"></a>
-<span class="sourceLineNo">8458</span>    // prepared for snapshot operation before proceeding.<a name="line.8458"></a>
-<span class="sourceLineNo">8459</span>    if (op == Operation.SNAPSHOT) {<a name="line.8459"></a>
-<span class="sourceLineNo">8460</span>      stores.values().forEach(HStore::preSnapshotOperation);<a name="line.8460"></a>
+<span class="sourceLineNo">8457</span>    lock(lock.readLock());<a name="line.8457"></a>
+<span class="sourceLineNo">8458</span>    if (this.closed.get()) {<a name="line.8458"></a>
+<span class="sourceLineNo">8459</span>      lock.readLock().unlock();<a name="line.8459"></a>
+<span class="sourceLineNo">8460</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closed");<a name="line.8460"></a>
 <span class="sourceLineNo">8461</span>    }<a name="line.8461"></a>
-<span class="sourceLineNo">8462</span>    try {<a name="line.8462"></a>
-<span class="sourceLineNo">8463</span>      if (coprocessorHost != null) {<a name="line.8463"></a>
-<span class="sourceLineNo">8464</span>        coprocessorHost.postStartRegionOperation(op);<a name="line.8464"></a>
-<span class="sourceLineNo">8465</span>      }<a name="line.8465"></a>
-<span class="sourceLineNo">8466</span>    } catch (Exception e) {<a name="line.8466"></a>
-<span class="sourceLineNo">8467</span>      lock.readLock().unlock();<a name="line.8467"></a>
-<span class="sourceLineNo">8468</span>      throw new IOException(e);<a name="line.8468"></a>
-<span class="sourceLineNo">8469</span>    }<a name="line.8469"></a>
-<span class="sourceLineNo">8470</span>  }<a name="line.8470"></a>
-<span class="sourceLineNo">8471</span><a name="line.8471"></a>
-<span class="sourceLineNo">8472</span>  @Override<a name="line.8472"></a>
-<span class="sourceLineNo">8473</span>  public void closeRegionOperation() throws IOException {<a name="line.8473"></a>
-<span class="sourceLineNo">8474</span>    closeRegionOperation(Operation.ANY);<a name="line.8474"></a>
+<span class="sourceLineNo">8462</span>    // The unit for snapshot is a region. So, all stores for this region must be<a name="line.8462"></a>
+<span class="sourceLineNo">8463</span>    // prepared for snapshot operation before proceeding.<a name="line.8463"></a>
+<span class="sourceLineNo">8464</span>    if (op == Operation.SNAPSHOT) {<a name="line.8464"></a>
+<span class="sourceLineNo">8465</span>      stores.values().forEach(HStore::preSnapshotOperation);<a name="line.8465"></a>
+<span class="sourceLineNo">8466</span>    }<a name="line.8466"></a>
+<span class="sourceLineNo">8467</span>    try {<a name="line.8467"></a>
+<span class="sourceLineNo">8468</span>      if (coprocessorHost != null) {<a name="line.8468"></a>
+<span class="sourceLineNo">8469</span>        coprocessorHost.postStartRegionOperation(op);<a name="line.8469"></a>
+<span class="sourceLineNo">8470</span>      }<a name="line.8470"></a>
+<span class="sourceLineNo">8471</span>    } catch (Exception e) {<a name="line.8471"></a>
+<span class="sourceLineNo">8472</span>      lock.readLock().unlock();<a name="line.8472"></a>
+<span class="sourceLineNo">8473</span>      throw new IOException(e);<a name="line.8473"></a>
+<span class="sourceLineNo">8474</span>    }<a name="line.8474"></a>
 <span class="sourceLineNo">8475</span>  }<a name="line.8475"></a>
 <span class="sourceLineNo">8476</span><a name="line.8476"></a>
 <span class="sourceLineNo">8477</span>  @Override<a name="line.8477"></a>
-<span class="sourceLineNo">8478</span>  public void closeRegionOperation(Operation operation) throws IOException {<a name="line.8478"></a>
-<span class="sourceLineNo">8479</span>    if (operation == Operation.SNAPSHOT) {<a name="line.8479"></a>
-<span class="sourceLineNo">8480</span>      stores.values().forEach(HStore::postSnapshotOperation);<a name="line.8480"></a>
-<span class="sourceLineNo">8481</span>    }<a name="line.8481"></a>
-<span class="sourceLineNo">8482</span>    lock.readLock().unlock();<a name="line.8482"></a>
-<span class="sourceLineNo">8483</span>    if (coprocessorHost != null) {<a name="line.8483"></a>
-<span class="sourceLineNo">8484</span>      coprocessorHost.postCloseRegionOperation(operation);<a name="line.8484"></a>
-<span class="sourceLineNo">8485</span>    }<a name="line.8485"></a>
-<span class="sourceLineNo">8486</span>  }<a name="line.8486"></a>
-<span class="sourceLineNo">8487</span><a name="line.8487"></a>
-<span class="sourceLineNo">8488</span>  /**<a name="line.8488"></a>
-<span class="sourceLineNo">8489</span>   * This method needs to be called before any public call that reads or<a name="line.8489"></a>
-<span class="sourceLineNo">8490</span>   * modifies stores in bulk. It has to be called just before a try.<a name="line.8490"></a>
-<span class="sourceLineNo">8491</span>   * #closeBulkRegionOperation needs to be called in the try's finally block<a name="line.8491"></a>
-<span class="sourceLineNo">8492</span>   * Acquires a writelock and checks if the region is closing or closed.<a name="line.8492"></a>
-<span class="sourceLineNo">8493</span>   * @throws NotServingRegionException when the region is closing or closed<a name="line.8493"></a>
-<span class="sourceLineNo">8494</span>   * @throws RegionTooBusyException if failed to get the lock in time<a name="line.8494"></a>
-<span class="sourceLineNo">8495</span>   * @throws InterruptedIOException if interrupted while waiting for a lock<a name="line.8495"></a>
-<span class="sourceLineNo">8496</span>   */<a name="line.8496"></a>
-<span class="sourceLineNo">8497</span>  private void startBulkRegionOperation(boolean writeLockNeeded)<a name="line.8497"></a>
-<span class="sourceLineNo">8498</span>      throws NotServingRegionException, RegionTooBusyException, InterruptedIOException {<a name="line.8498"></a>
-<span class="sourceLineNo">8499</span>    if (this.closing.get()) {<a name="line.8499"></a>
-<span class="sourceLineNo">8500</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closing");<a name="line.8500"></a>
-<span class="sourceLineNo">8501</span>    }<a name="line.8501"></a>
-<span class="sourceLineNo">8502</span>    if (writeLockNeeded) lock(lock.writeLock());<a name="line.8502"></a>
-<span class="sourceLineNo">8503</span>    else lock(lock.readLock());<a name="line.8503"></a>
-<span class="sourceLineNo">8504</span>    if (this.closed.get()) {<a name="line.8504"></a>
-<span class="sourceLineNo">8505</span>      if (writeLockNeeded) lock.writeLock().unlock();<a name="line.8505"></a>
-<span class="sourceLineNo">8506</span>      else lock.readLock().unlock();<a name="line.8506"></a>
-<span class="sourceLineNo">8507</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closed");<a name="line.8507"></a>
-<span class="sourceLineNo">8508</span>    }<a name="line.8508"></a>
-<span class="sourceLineNo">8509</span>  }<a name="line.8509"></a>
-<span class="sourceLineNo">8510</span><a name="line.8510"></a>
-<span class="sourceLineNo">8511</span>  /**<a name="line.8511"></a>
-<span class="sourceLineNo">8512</span>   * Closes the lock. This needs to be called in the finally block corresponding<a name="line.8512"></a>
-<span class="sourceLineNo">8513</span>   * to the try block of #startRegionOperation<a name="line.8513"></a>
-<span class="sourceLineNo">8514</span>   */<a name="line.8514"></a>
-<span class="sourceLineNo">8515</span>  private void closeBulkRegionOperation(){<a name="line.8515"></a>
-<span class="sourceLineNo">8516</span>    if (lock.writeLock().isHeldByCurrentThread()) lock.writeLock().unlock();<a name="line.8516"></a>
-<span class="sourceLineNo">8517</span>    else lock.readLock().unlock();<a name="line.8517"></a>
-<span class="sourceLineNo">8518</span>  }<a name="line.8518"></a>
-<span class="sourceLineNo">8519</span><a name="line.8519"></a>
-<span class="sourceLineNo">8520</span>  /**<a name="line.8520"></a>
-<span class="sourceLineNo">8521</span>   * Update LongAdders for number of puts without wal and the size of possible data loss.<a name="line.8521"></a>
-<span class="sourceLineNo">8522</span>   * These information are exposed by the region server metrics.<a name="line.8522"></a>
-<span class="sourceLineNo">8523</span>   */<a name="line.8523"></a>
-<span class="sourceLineNo">8524</span>  private void recordMutationWithoutWal(final Map&lt;byte [], List&lt;Cell&gt;&gt; familyMap) {<a name="line.8524"></a>
-<span class="sourceLineNo">8525</span>    numMutationsWithoutWAL.increment();<a name="line.8525"></a>
-<span class="sourceLineNo">8526</span>    if (numMutationsWithoutWAL.sum() &lt;= 1) {<a name="line.8526"></a>
-<span class="sourceLineNo">8527</span>      LOG.info("writing data to region " + this +<a name="line.8527"></a>
-<span class="sourceLineNo">8528</span>               " with WAL disabled. Data may be lost in the event of a crash.");<a name="line.8528"></a>
-<span class="sourceLineNo">8529</span>    }<a name="line.8529"></a>
-<span class="sourceLineNo">8530</span><a name="line.8530"></a>
-<span class="sourceLineNo">8531</span>    long mutationSize = 0;<a name="line.8531"></a>
-<span class="sourceLineNo">8532</span>    for (List&lt;Cell&gt; cells: familyMap.values()) {<a name="line.8532"></a>
-<span class="sourceLineNo">8533</span>      // Optimization: 'foreach' loop is not used. See:<a name="line.8533"></a>
-<span class="sourceLineNo">8534</span>      // HBASE-12023 HRegion.applyFamilyMapToMemstore creates too many iterator objects<a name="line.8534"></a>
-<span class="sourceLineNo">8535</span>      assert cells instanceof RandomAccess;<a name="line.8535"></a>
-<span class="sourceLineNo">8536</span>      int listSize = cells.size();<a name="line.8536"></a>
-<span class="sourceLineNo">8537</span>      for (int i=0; i &lt; listSize; i++) {<a name="line.8537"></a>
-<span class="sourceLineNo">8538</span>        Cell cell = cells.get(i);<a name="line.8538"></a>
-<span class="sourceLineNo">8539</span>        mutationSize += cell.getSerializedSize();<a name="line.8539"></a>
-<span class="sourceLineNo">8540</span>      }<a name="line.8540"></a>
-<span class="sourceLineNo">8541</span>    }<a name="line.8541"></a>
-<span class="sourceLineNo">8542</span><a name="line.8542"></a>
-<span class="sourceLineNo">8543</span>    dataInMemoryWithoutWAL.add(mutationSize);<a name="line.8543"></a>
-<span class="sourceLineNo">8544</span>  }<a name="line.8544"></a>
-<span class="sourceLineNo">8545</span><a name="line.8545"></a>
-<span class="sourceLineNo">8546</span>  private void lock(final Lock lock) throws RegionTooBusyException, InterruptedIOException {<a name="line.8546"></a>
-<span class="sourceLineNo">8547</span>    lock(lock, 1);<a name="line.8547"></a>
-<span class="sourceLineNo">8548</span>  }<a name="line.8548"></a>
-<span class="sourceLineNo">8549</span><a name="line.8549"></a>
-<span class="sourceLineNo">8550</span>  /**<a name="line.8550"></a>
-<span class="sourceLineNo">8551</span>   * Try to acquire a lock.  Throw RegionTooBusyException<a name="line.8551"></a>
-<span class="sourceLineNo">8552</span>   * if failed to get the lock in time. Throw InterruptedIOException<a name="line.8552"></a>
-<span class="sourceLineNo">8553</span>   * if interrupted while waiting for the lock.<a name="line.8553"></a>
-<span class="sourceLineNo">8554</span>   */<a name="line.8554"></a>
-<span class="sourceLineNo">8555</span>  private void lock(final Lock lock, final int multiplier)<a name="line.8555"></a>
-<span class="sourceLineNo">8556</span>      throws RegionTooBusyException, InterruptedIOException {<a name="line.8556"></a>
-<span class="sourceLineNo">8557</span>    try {<a name="line.8557"></a>
-<span class="sourceLineNo">8558</span>      final long waitTime = Math.min(maxBusyWaitDuration,<a name="line.8558"></a>
-<span class="sourceLineNo">8559</span>          busyWaitDuration * Math.min(multiplier, maxBusyWaitMultiplier));<a name="line.8559"></a>
-<span class="sourceLineNo">8560</span>      if (!lock.tryLock(waitTime, TimeUnit.MILLISECONDS)) {<a name="line.8560"></a>
-<span class="sourceLineNo">8561</span>        // Don't print millis. Message is used as a key over in<a name="line.8561"></a>
-<span class="sourceLineNo">8562</span>        // RetriesExhaustedWithDetailsException processing.<a name="line.8562"></a>
-<span class="sourceLineNo">8563</span>        throw new RegionTooBusyException("Failed to obtain lock; regionName=" +<a name="line.8563"></a>
-<span class="sourceLineNo">8564</span>            (this.getRegionInfo() == null? "unknown":<a name="line.8564"></a>
-<span class="sourceLineNo">8565</span>                this.getRegionInfo().getRegionNameAsString()) +<a name="line.8565"></a>
-<span class="sourceLineNo">8566</span>            ", server=" + (this.getRegionServerServices() == null? "unknown":<a name="line.8566"></a>
-<span class="sourceLineNo">8567</span>                this.getRegionServerServices().getServerName()));<a name="line.8567"></a>
-<span class="sourceLineNo">8568</span>      }<a name="line.8568"></a>
-<span class="sourceLineNo">8569</span>    } catch (InterruptedException ie) {<a name="line.8569"></a>
-<span class="sourceLineNo">8570</span>      LOG.info("Interrupted while waiting for a lock");<a name="line.8570"></a>
-<span class="sourceLineNo">8571</span>      InterruptedIOException iie = new InterruptedIOException();<a name="line.8571"></a>
-<span class="sourceLineNo">8572</span>      iie.initCause(ie);<a name="line.8572"></a>
-<span class="sourceLineNo">8573</span>      throw iie;<a name="line.8573"></a>
-<span class="sourceLineNo">8574</span>    }<a name="line.8574"></a>
-<span class="sourceLineNo">8575</span>  }<a name="line.8575"></a>
-<span class="sourceLineNo">8576</span><a name="line.8576"></a>
-<span class="sourceLineNo">8577</span>  /**<a name="line.8577"></a>
-<span class="sourceLineNo">8578</span>   * Calls sync with the given transaction ID<a name="line.8578"></a>
-<span class="sourceLineNo">8579</span>   * @param txid should sync up to which transaction<a name="line.8579"></a>
-<span class="sourceLineNo">8580</span>   * @throws IOException If anything goes wrong with DFS<a name="line.8580"></a>
-<span class="sourceLineNo">8581</span>   */<a name="line.8581"></a>
-<span class="sourceLineNo">8582</span>  private void sync(long txid, Durability durability) throws IOException {<a name="line.8582"></a>
-<span class="sourceLineNo">8583</span>    if (this.getRegionInfo().isMetaRegion()) {<a name="line.8583"></a>
-<span class="sourceLineNo">8584</span>      this.wal.sync(txid);<a name="line.8584"></a>
-<span class="sourceLineNo">8585</span>    } else {<a name="line.8585"></a>
-<span class="sourceLineNo">8586</span>      switch(durability) {<a name="line.8586"></a>
-<span class="sourceLineNo">8587</span>      case USE_DEFAULT:<a name="line.8587"></a>
-<span class="sourceLineNo">8588</span>        // do what table defaults to<a name="line.8588"></a>
-<span class="sourceLineNo">8589</span>        if (shouldSyncWAL()) {<a name="line.8589"></a>
-<span class="sourceLineNo">8590</span>          this.wal.sync(txid);<a name="line.8590"></a>
-<span class="sourceLineNo">8591</span>        }<a name="line.8591"></a>
-<span class="sourceLineNo">8592</span>        break;<a name="line.8592"></a>
-<span class="sourceLineNo">8593</span>      case SKIP_WAL:<a name="line.8593"></a>
-<span class="sourceLineNo">8594</span>        // nothing do to<a name="line.8594"></a>
-<span class="sourceLineNo">8595</span>        break;<a name="line.8595"></a>
-<span class="sourceLineNo">8596</span>      case ASYNC_WAL:<a name="line.8596"></a>
-<span class="sourceLineNo">8597</span>        // nothing do to<a name="line.8597"></a>
-<span class="sourceLineNo">8598</span>        break;<a name="line.8598"></a>
-<span class="sourceLineNo">8599</span>      case SYNC_WAL:<a name="line.8599"></a>
-<span class="sourceLineNo">8600</span>          this.wal.sync(txid, false);<a name="line.8600"></a>
-<span class="sourceLineNo">8601</span>          break;<a name="line.8601"></a>
-<span class="sourceLineNo">8602</span>      case FSYNC_WAL:<a name="line.8602"></a>
-<span class="sourceLineNo">8603</span>          this.wal.sync(txid, true);<a name="line.8603"></a>
-<span class="sourceLineNo">8604</span>          break;<a name="line.8604"></a>
-<span class="sourceLineNo">8605</span>      default:<a name="line.8605"></a>
-<span class="sourceLineNo">8606</span>        throw new RuntimeException("Unknown durability " + durability);<a name="line.8606"></a>
-<span class="sourceLineNo">8607</span>      }<a name="line.8607"></a>
-<span class="sourceLineNo">8608</span>    }<a name="line.8608"></a>
-<span class="sourceLineNo">8609</span>  }<a name="line.8609"></a>
-<span class="sourceLineNo">8610</span><a name="line.8610"></a>
-<span class="sourceLineNo">8611</span>  /**<a name="line.8611"></a>
-<span class="sourceLineNo">8612</span>   * Check whether we should sync the wal from the table's durability settings<a name="line.8612"></a>
-<span class="sourceLineNo">8613</span>   */<a name="line.8613"></a>
-<span class="sourceLineNo">8614</span>  private boolean shouldSyncWAL() {<a name="line.8614"></a>
-<span class="sourceLineNo">8615</span>    return regionDurability.ordinal() &gt;  Durability.ASYNC_WAL.ordinal();<a name="line.8615"></a>
-<span class="sourceLineNo">8616</span>  }<a name="line.8616"></a>
-<span class="sourceLineNo">8617</span><a name="line.8617"></a>
-<span class="sourceLineNo">8618</span>  /**<a name="line.8618"></a>
-<span class="sourceLineNo">8619</span>   * A mocked list implementation - discards all updates.<a name="line.8619"></a>
-<span class="sourceLineNo">8620</span>   */<a name="line.8620"></a>
-<span class="sourceLineNo">8621</span>  private static final List&lt;Cell&gt; MOCKED_LIST = new AbstractList&lt;Cell&gt;() {<a name="line.8621"></a>
+<span class="sourceLineNo">8478</span>  public void closeRegionOperation() throws IOException {<a name="line.8478"></a>
+<span class="sourceLineNo">8479</span>    closeRegionOperation(Operation.ANY);<a name="line.8479"></a>
+<span class="sourceLineNo">8480</span>  }<a name="line.8480"></a>
+<span class="sourceLineNo">8481</span><a name="line.8481"></a>
+<span class="sourceLineNo">8482</span>  @Override<a name="line.8482"></a>
+<span class="sourceLineNo">8483</span>  public void closeRegionOperation(Operation operation) throws IOException {<a name="line.8483"></a>
+<span class="sourceLineNo">8484</span>    if (operation == Operation.SNAPSHOT) {<a name="line.8484"></a>
+<span class="sourceLineNo">8485</span>      stores.values().forEach(HStore::postSnapshotOperation);<a name="line.8485"></a>
+<span class="sourceLineNo">8486</span>    }<a name="line.8486"></a>
+<span class="sourceLineNo">8487</span>    lock.readLock().unlock();<a name="line.8487"></a>
+<span class="sourceLineNo">8488</span>    if (coprocessorHost != null) {<a name="line.8488"></a>
+<span class="sourceLineNo">8489</span>      coprocessorHost.postCloseRegionOperation(operation);<a name="line.8489"></a>
+<span class="sourceLineNo">8490</span>    }<a name="line.8490"></a>
+<span class="sourceLineNo">8491</span>  }<a name="line.8491"></a>
+<span class="sourceLineNo">8492</span><a name="line.8492"></a>
+<span class="sourceLineNo">8493</span>  /**<a name="line.8493"></a>
+<span class="sourceLineNo">8494</span>   * This method needs to be called before any public call that reads or<a name="line.8494"></a>
+<span class="sourceLineNo">8495</span>   * modifies stores in bulk. It has to be called just before a try.<a name="line.8495"></a>
+<span class="sourceLineNo">8496</span>   * #closeBulkRegionOperation needs to be called in the try's finally block<a name="line.8496"></a>
+<span class="sourceLineNo">8497</span>   * Acquires a writelock and checks if the region is closing or closed.<a name="line.8497"></a>
+<span class="sourceLineNo">8498</span>   * @throws NotServingRegionException when the region is closing or closed<a name="line.8498"></a>
+<span class="sourceLineNo">8499</span>   * @throws RegionTooBusyException if failed to get the lock in time<a name="line.8499"></a>
+<span class="sourceLineNo">8500</span>   * @throws InterruptedIOException if interrupted while waiting for a lock<a name="line.8500"></a>
+<span class="sourceLineNo">8501</span>   */<a name="line.8501"></a>
+<span class="sourceLineNo">8502</span>  private void startBulkRegionOperation(boolean writeLockNeeded)<a name="line.8502"></a>
+<span class="sourceLineNo">8503</span>      throws NotServingRegionException, RegionTooBusyException, InterruptedIOException {<a name="line.8503"></a>
+<span class="sourceLineNo">8504</span>    if (this.closing.get()) {<a name="line.8504"></a>
+<span class="sourceLineNo">8505</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closing");<a name="line.8505"></a>
+<span class="sourceLineNo">8506</span>    }<a name="line.8506"></a>
+<span class="sourceLineNo">8507</span>    if (writeLockNeeded) lock(lock.writeLock());<a name="line.8507"></a>
+<span class="sourceLineNo">8508</span>    else lock(lock.readLock());<a name="line.8508"></a>
+<span class="sourceLineNo">8509</span>    if (this.closed.get()) {<a name="line.8509"></a>
+<span class="sourceLineNo">8510</span>      if (writeLockNeeded) lock.writeLock().unlock();<a name="line.8510"></a>
+<span class="sourceLineNo">8511</span>      else lock.readLock().unlock();<a name="line.8511"></a>
+<span class="sourceLineNo">8512</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closed");<a name="line.8512"></a>
+<span class="sourceLineNo">8513</span>    }<a name="line.8513"></a>
+<span class="sourceLineNo">8514</span>  }<a name="line.8514"></a>
+<span class="sourceLineNo">8515</span><a name="line.8515"></a>
+<span class="sourceLineNo">8516</span>  /**<a name="line.8516"></a>
+<span class="sourceLineNo">8517</span>   * Closes the lock. This needs to be called in the finally block corresponding<a name="line.8517"></a>
+<span class="sourceLineNo">8518</span>   * to the try block of #startRegionOperation<a name="line.8518"></a>
+<span class="sourceLineNo">8519</span>   */<a name="line.8519"></a>
+<span class="sourceLineNo">8520</span>  private void closeBulkRegionOperation(){<a name="line.8520"></a>
+<span class="sourceLineNo">8521</span>    if (lock.writeLock().isHeldByCurrentThread()) lock.writeLock().unlock();<a name="line.8521"></a>
+<span class="sourceLineNo">8522</span>    else lock.readLock().unlock();<a name="line.8522"></a>
+<span class="sourceLineNo">8523</span>  }<a name="line.8523"></a>
+<span class="sourceLineNo">8524</span><a name="line.8524"></a>
+<span class="sourceLineNo">8525</span>  /**<a name="line.8525"></a>
+<span class="sourceLineNo">8526</span>   * Update LongAdders for number of puts without wal and the size of possible data loss.<a name="line.8526"></a>
+<span class="sourceLineNo">8527</span>   * These information are exposed by the region server metrics.<a name="line.8527"></a>
+<span class="sourceLineNo">8528</span>   */<a name="line.8528"></a>
+<span class="sourceLineNo">8529</span>  private void recordMutationWithoutWal(final Map&lt;byte [], List&lt;Cell&gt;&gt; familyMap) {<a name="line.8529"></a>
+<span class="sourceLineNo">8530</span>    numMutationsWithoutWAL.increment();<a name="line.8530"></a>
+<span class="sourceLineNo">8531</span>    if (numMutationsWithoutWAL.sum() &lt;= 1) {<a name="line.8531"></a>
+<span class="sourceLineNo">8532</span>      LOG.info("writing data to region " + this +<a name="line.8532"></a>
+<span class="sourceLineNo">8533</span>               " with WAL disabled. Data may be lost in the event of a crash.");<a name="line.8533"></a>
+<span class="sourceLineNo">8534</span>    }<a name="line.8534"></a>
+<span class="sourceLineNo">8535</span><a name="line.8535"></a>
+<span class="sourceLineNo">8536</span>    long mutationSize = 0;<a name="line.8536"></a>
+<span class="sourceLineNo">8537</span>    for (List&lt;Cell&gt; cells: familyMap.values()) {<a name="line.8537"></a>
+<span class="sourceLineNo">8538</span>      // Optimization: 'foreach' loop is not used. See:<a name="line.8538"></a>
+<span class="sourceLineNo">8539</span>      // HBASE-12023 HRegion.applyFamilyMapToMemstore creates too many iterator objects<a name="line.8539"></a>
+<span class="sourceLineNo">8540</span>      assert cells instanceof RandomAccess;<a name="line.8540"></a>
+<span class="sourceLineNo">8541</span>      int listSize = cells.size();<a name="line.8541"></a>
+<span class="sourceLineNo">8542</span>      for (int i=0; i &lt; listSize; i++) {<a name="line.8542"></a>
+<span class="sourceLineNo">8543</span>        Cell cell = cells.get(i);<a name="line.8543"></a>
+<span class="sourceLineNo">8544</span>        mutationSize += cell.getSerializedSize();<a name="line.8544"></a>
+<span class="sourceLineNo">8545</span>      }<a name="line.8545"></a>
+<span class="sourceLineNo">8546</span>    }<a name="line.8546"></a>
+<span class="sourceLineNo">8547</span><a name="line.8547"></a>
+<span class="sourceLineNo">8548</span>    dataInMemoryWithoutWAL.add(mutationSize);<a name="line.8548"></a>
+<span class="sourceLineNo">8549</span>  }<a name="line.8549"></a>
+<span class="sourceLineNo">8550</span><a name="line.8550"></a>
+<span class="sourceLineNo">8551</span>  private void lock(final Lock lock) throws RegionTooBusyException, InterruptedIOException {<a name="line.8551"></a>
+<span class="sourceLineNo">8552</span>    lock(lock, 1);<a name="line.8552"></a>
+<span class="sourceLineNo">8553</span>  }<a name="line.8553"></a>
+<span class="sourceLineNo">8554</span><a name="line.8554"></a>
+<span class="sourceLineNo">8555</span>  /**<a name="line.8555"></a>
+<span class="sourceLineNo">8556</span>   * Try to acquire a lock.  Throw RegionTooBusyException<a name="line.8556"></a>
+<span class="sourceLineNo">8557</span>   * if failed to get the lock in time. Throw InterruptedIOException<a name="line.8557"></a>
+<span class="sourceLineNo">8558</span>   * if interrupted while waiting for the lock.<a name="line.8558"></a>
+<span class="sourceLineNo">8559</span>   */<a name="line.8559"></a>
+<span class="sourceLineNo">8560</span>  private void lock(final Lock lock, final int multiplier)<a name="line.8560"></a>
+<span class="sourceLineNo">8561</span>      throws RegionTooBusyException, InterruptedIOException {<a name="line.8561"></a>
+<span class="sourceLineNo">8562</span>    try {<a name="line.8562"></a>
+<span class="sourceLineNo">8563</span>      final long waitTime = Math.min(maxBusyWaitDuration,<a name="line.8563"></a>
+<span class="sourceLineNo">8564</span>          busyWaitDuration * Math.min(multiplier, maxBusyWaitMultiplier));<a name="line.8564"></a>
+<span class="sourceLineNo">8565</span>      if (!lock.tryLock(waitTime, TimeUnit.MILLISECONDS)) {<a name="line.8565"></a>
+<span class="sourceLineNo">8566</span>        // Don't print millis. Message is used as a key over in<a name="line.8566"></a>
+<span class="sourceLineNo">8567</span>        // RetriesExhaustedWithDetailsException processing.<a name="line.8567"></a>
+<span class="sourceLineNo">8568</span>        throw new RegionTooBusyException("Failed to obtain lock; regionName=" +<a name="line.8568"></a>
+<span class="sourceLineNo">8569</span>            (this.getRegionInfo() == null? "unknown":<a name="line.8569"></a>
+<span class="sourceLineNo">8570</span>                this.getRegionInfo().getRegionNameAsString()) +<a name="line.8570"></a>
+<span class="sourceLineNo">8571</span>            ", server=" + (this.getRegionServerServices() == null? "unknown":<a name="line.8571"></a>
+<span class="sourceLineNo">8572</span>                this.getRegionServerServices().getServerName()));<a name="line.8572"></a>
+<span class="sourceLineNo">8573</span>      }<a name="line.8573"></a>
+<span class="sourceLineNo">8574</span>    } catch (InterruptedException ie) {<a name="line.8574"></a>
+<span class="sourceLineNo">8575</span>      LOG.info("Interrupted while waiting for a lock");<a name="line.8575"></a>
+<span class="sourceLineNo">8576</span>      InterruptedIOException iie = new InterruptedIOException();<a name="line.8576"></a>
+<span class="sourceLineNo">8577</span>      iie.initCause(ie);<a name="line.8577"></a>
+<span class="sourceLineNo">8578</span>      throw iie;<a name="line.8578"></a>
+<span class="sourceLineNo">8579</span>    }<a name="line.8579"></a>
+<span class="sourceLineNo">8580</span>  }<a name="line.8580"></a>
+<span class="sourceLineNo">8581</span><a name="line.8581"></a>
+<span class="sourceLineNo">8582</span>  /**<a name="line.8582"></a>
+<span class="sourceLineNo">8583</span>   * Calls sync with the given transaction ID<a name="line.8583"></a>
+<span class="sourceLineNo">8584</span>   * @param txid should sync up to which transaction<a name="line.8584"></a>
+<span class="sourceLineNo">8585</span>   * @throws IOException If anything goes wrong with DFS<a name="line.8585"></a>
+<span class="sourceLineNo">8586</span>   */<a name="line.8586"></a>
+<span class="sourceLineNo">8587</span>  private void sync(long txid, Durability durability) throws IOException {<a name="line.8587"></a>
+<span class="sourceLineNo">8588</span>    if (this.getRegionInfo().isMetaRegion()) {<a name="line.8588"></a>
+<span class="sourceLineNo">8589</span>      this.wal.sync(txid);<a name="line.8589"></a>
+<span class="sourceLineNo">8590</span>    } else {<a name="line.8590"></a>
+<span class="sourceLineNo">8591</span>      switch(durability) {<a name="line.8591"></a>
+<span class="sourceLineNo">8592</span>      case USE_DEFAULT:<a name="line.8592"></a>
+<span class="sourceLineNo">8593</span>        // do what table defaults to<a name="line.8593"></a>
+<span class="sourceLineNo">8594</span>        if (shouldSyncWAL()) {<a name="line.8594"></a>
+<span class="sourceLineNo">8595</span>          this.wal.sync(txid);<a name="line.8595"></a>
+<span class="sourceLineNo">8596</span>        }<a name="line.8596"></a>
+<span class="sourceLineNo">8597</span>        break;<a name="line.8597"></a>
+<span class="sourceLineNo">8598</span>      case SKIP_WAL:<a name="line.8598"></a>
+<span class="sourceLineNo">8599</span>        // nothing do to<a name="line.8599"></a>
+<span class="sourceLineNo">8600</span>        break;<a name="line.8600"></a>
+<span class="sourceLineNo">8601</span>      case ASYNC_WAL:<a name="line.8601"></a>
+<span class="sourceLineNo">8602</span>        // nothing do to<a name="line.8602"></a>
+<span class="sourceLineNo">8603</span>        break;<a name="line.8603"></a>
+<span class="sourceLineNo">8604</span>      case SYNC_WAL:<a name="line.8604"></a>
+<span class="sourceLineNo">8605</span>          this.wal.sync(txid, false);<a name="line.8605"></a>
+<span class="sourceLineNo">8606</span>          break;<a name="line.8606"></a>
+<span class="sourceLineNo">8607</span>      case FSYNC_WAL:<a name="line.8607"></a>
+<span class="sourceLineNo">8608</span>          this.wal.sync(txid, true);<a name="line.8608"></a>
+<span class="sourceLineNo">8609</span>          break;<a name="line.8609"></a>
+<span class="sourceLineNo">8610</span>      default:<a name="line.8610"></a>
+<span class="sourceLineNo">8611</span>        throw new RuntimeException("Unknown durability " + durability);<a name="line.8611"></a>
+<span class="sourceLineNo">8612</span>      }<a name="line.8612"></a>
+<span class="sourceLineNo">8613</span>    }<a name="line.8613"></a>
+<span class="sourceLineNo">8614</span>  }<a name="line.8614"></a>
+<span class="sourceLineNo">8615</span><a name="line.8615"></a>
+<span class="sourceLineNo">8616</span>  /**<a name="line.8616"></a>
+<span class="sourceLineNo">8617</span>   * Check whether we should sync the wal from the table's durability settings<a name="line.8617"></a>
+<span class="sourceLineNo">8618</span>   */<a name="line.8618"></a>
+<span class="sourceLineNo">8619</span>  private boolean shouldSyncWAL() {<a name="line.8619"></a>
+<span class="sourceLineNo">8620</span>    return regionDurability.ordinal() &gt;  Durability.ASYNC_WAL.ordinal();<a name="line.8620"></a>
+<span class="sourceLineNo">8621</span>  }<a name="line.8621"></a>
 <span class="sourceLineNo">8622</span><a name="line.8622"></a>
-<span class="sourceLineNo">8623</span>    @Override<a name="line.8623"></a>
-<span class="sourceLineNo">8624</span>    public void add(int index, Cell element) {<a name="line.8624"></a>
-<span class="sourceLineNo">8625</span>      // do nothing<a name="line.8625"></a>
-<span class="sourceLineNo">8626</span>    }<a name="line.8626"></a>
+<span class="sourceLineNo">8623</span>  /**<a name="line.8623"></a>
+<span class="sourceLineNo">8624</span>   * A mocked list implementation - discards all updates.<a name="line.8624"></a>
+<span class="sourceLineNo">8625</span>   */<a name="line.8625"></a>
+<span class="sourceLineNo">8626</span>  private static final List&lt;Cell&gt; MOCKED_LIST = new AbstractList&lt;Cell&gt;() {<a name="line.8626"></a>
 <span class="sourceLineNo">8627</span><a name="line.8627"></a>
 <span class="sourceLineNo">8628</span>    @Override<a name="line.8628"></a>
-<span class="sourceLineNo">8629</span>    public boolean addAll(int index, Collection&lt;? extends Cell&gt; c) {<a name="line.8629"></a>
-<span class="sourceLineNo">8630</span>      return false; // this list is never changed as a result of an update<a name="line.8630"></a>
+<span class="sourceLineNo">8629</span>    public void add(int index, Cell element) {<a name="line.8629"></a>
+<span class="sourceLineNo">8630</span>      // do nothing<a name="line.8630"></a>
 <span class="sourceLineNo">8631</span>    }<a name="line.8631"></a>
 <span class="sourceLineNo">8632</span><a name="line.8632"></a>
 <span class="sourceLineNo">8633</span>    @Override<a name="line.8633"></a>
-<span class="sourceLineNo">8634</span>    public KeyValue get(int index) {<a name="line.8634"></a>
-<span class="sourceLineNo">8635</span>      throw new UnsupportedOperationException();<a name="line.8635"></a>
+<span class="sourceLineNo">8634</span>    public boolean addAll(int index, Collection&lt;? extends Cell&gt; c) {<a name="line.8634"></a>
+<span class="sourceLineNo">8635</span>      return false; // this list is never changed as a result of an update<a name="line.8635"></a>
 <span class="sourceLineNo">8636</span>    }<a name="line.8636"></a>
 <span class="sourceLineNo">8637</span><a name="line.8637"></a>
 <span class="sourceLineNo">8638</span>    @Override<a name="line.8638"></a>
-<span class="sourceLineNo">8639</span>    public int size() {<a name="line.8639"></a>
-<span class="sourceLineNo">8640</span>      return 0;<a name="line.8640"></a>
+<span class="sourceLineNo">8639</span>    public KeyValue get(int index) {<a name="line.8639"></a>
+<span class="sourceLineNo">8640</span>      throw new UnsupportedOperationException();<a name="line.8640"></a>
 <span class="sourceLineNo">8641</span>    }<a name="line.8641"></a>
-<span class="sourceLineNo">8642</span>  };<a name="line.8642"></a>
-<span class="sourceLineNo">8643</span><a name="line.8643"></a>
-<span class="sourceLineNo">8644</span>  /** @return the latest sequence number that was read from storage when this region was opened */<a name="line.8644"></a>
-<span class="sourceLineNo">8645</span>  public long getOpenSeqNum() {<a name="line.8645"></a>
-<span class="sourceLineNo">8646</span>    return this.openSeqNum;<a name="line.8646"></a>
-<span class="sourceLineNo">8647</span>  }<a name="line.8647"></a>
+<span class="sourceLineNo">8642</span><a name="line.8642"></a>
+<span class="sourceLineNo">8643</span>    @Override<a name="line.8643"></a>
+<span class="sourceLineNo">8644</span>    public int size() {<a name="line.8644"></a>
+<span class="sourceLineNo">8645</span>      return 0;<a name="line.8645"></a>
+<span class="sourceLineNo">8646</span>    }<a name="line.8646"></a>
+<span class="sourceLineNo">8647</span>  };<a name="line.8647"></a>
 <span class="sourceLineNo">8648</span><a name="line.8648"></a>
-<span class="sourceLineNo">8649</span>  @Override<a name="line.8649"></a>
-<span class="sourceLineNo">8650</span>  public Map&lt;byte[], Long&gt; getMaxStoreSeqId() {<a name="line.8650"></a>
-<span class="sourceLineNo">8651</span>    return this.maxSeqIdInStores;<a name="line.8651"></a>
+<span class="sourceLineNo">8649</span>  /** @return the latest sequence number that was read from storage when this region was opened */<a name="line.8649"></a>
+<span class="sourceLineNo">8650</span>  public long getOpenSeqNum() {<a name="line.8650"></a>
+<span class="sourceLineNo">8651</span>    return this.openSeqNum;<a name="line.8651"></a>
 <span class="sourceLineNo">8652</span>  }<a name="line.8652"></a>
 <span class="sourceLineNo">8653</span><a name="line.8653"></a>
-<span class="sourceLineNo">8654</span>  public long getOldestSeqIdOfStore(byte[] familyName) {<a name="line.8654"></a>
-<span class="sourceLineNo">8655</span>    return wal.getEarliestMemStoreSeqNum(getRegionInfo().getEncodedNameAsBytes(), familyName);<a name="line.8655"></a>
-<span class="sourceLineNo">8656</span>  }<a name="line.8656"></a>
-<span class="sourceLineNo">8657</span><a name="line.8657"></a>
-<span class="sourceLineNo">8658</span>  @Override<a name="line.8658"></a>
-<span class="sourceLineNo">8659</span>  public CompactionState getCompactionState() {<a name="line.8659"></a>
-<span class="sourceLineNo">8660</span>    boolean hasMajor = majorInProgress.get() &gt; 0, hasMinor = minorInProgress.get() &gt; 0;<a name="line.8660"></a>
-<span class="sourceLineNo">8661</span>    return (hasMajor ? (hasMinor ? CompactionState.MAJOR_AND_MINOR : CompactionState.MAJOR)<a name="line.8661"></a>
-<span class="sourceLineNo">8662</span>        : (hasMinor ? CompactionState.MINOR : CompactionState.NONE));<a name="line.8662"></a>
-<span class="sourceLineNo">8663</span>  }<a name="line.8663"></a>
-<span class="sourceLineNo">8664</span><a name="line.8664"></a>
-<span class="sourceLineNo">8665</span>  public void reportCompactionRequestStart(boolean isMajor){<a name="line.8665"></a>
-<span class="sourceLineNo">8666</span>    (isMajor ? majorInProgress : minorInProgress).incrementAndGet();<a name="line.8666"></a>
-<span class="sourceLineNo">8667</span>  }<a name="line.8667"></a>
-<span class="sourceLineNo">8668</span><a name="line.8668"></a>
-<span class="sourceLineNo">8669</span>  public void reportCompactionRequestEnd(boolean isMajor, int numFiles, long filesSizeCompacted) {<a name="line.8669"></a>
-<span class="sourceLineNo">8670</span>    int newValue = (isMajor ? majorInProgress : minorInProgress).decrementAndGet();<a name="line.8670"></a>
-<span class="sourceLineNo">8671</span><a name="line.8671"></a>
-<span class="sourceLineNo">8672</span>    // metrics<a name="line.8672"></a>
-<span class="sourceLineNo">8673</span>    compactionsFinished.increment();<a name="line.8673"></a>
-<span class="sourceLineNo">8674</span>    compactionNumFilesCompacted.add(numFiles);<a name="line.8674"></a>
-<span class="sourceLineNo">8675</span>    compactionNumBytesCompacted.add(filesSizeCompacted);<a name="line.8675"></a>
+<span class="sourceLineNo">8654</span>  @Override<a name="line.8654"></a>
+<span class="sourceLineNo">8655</span>  public Map&lt;byte[], Long&gt; getMaxStoreSeqId() {<a name="line.8655"></a>
+<span class="sourceLineNo">8656</span>    return this.maxSeqIdInStores;<a name="line.8656"></a>
+<span class="sourceLineNo">8657</span>  }<a name="line.8657"></a>
+<span class="sourceLineNo">8658</span><a name="line.8658"></a>
+<span class="sourceLineNo">8659</span>  public long getOldestSeqIdOfStore(byte[] familyName) {<a name="line.8659"></a>
+<span class="sourceLineNo">8660</span>    return wal.getEarliestMemStoreSeqNum(getRegionInfo().getEncodedNameAsBytes(), familyName);<a name="line.8660"></a>
+<span class="sourceLineNo">8661</span>  }<a name="line.8661"></a>
+<span class="sourceLineNo">8662</span><a name="line.8662"></a>
+<span class="sourceLineNo">8663</span>  @Override<a name="line.8663"></a>
+<span class="sourceLineNo">8664</span>  public CompactionState getCompactionState() {<a name="line.8664"></a>
+<span class="sourceLineNo">8665</span>    boolean hasMajor = majorInProgress.get() &gt; 0, hasMinor = minorInProgress.get() &gt; 0;<a name="line.8665"></a>
+<span class="sourceLineNo">8666</span>    return (hasMajor ? (hasMinor ? CompactionState.MAJOR_AND_MINOR : CompactionState.MAJOR)<a name="line.8666"></a>
+<span class="sourceLineNo">8667</span>        : (hasMinor ? CompactionState.MINOR : CompactionState.NONE));<a name="line.8667"></a>
+<span class="sourceLineNo">8668</span>  }<a name="line.8668"></a>
+<span class="sourceLineNo">8669</span><a name="line.8669"></a>
+<span class="sourceLineNo">8670</span>  public void reportCompactionRequestStart(boolean isMajor){<a name="line.8670"></a>
+<span class="sourceLineNo">8671</span>    (isMajor ? majorInProgress : minorInProgress).incrementAndGet();<a name="line.8671"></a>
+<span class="sourceLineNo">8672</span>  }<a name="line.8672"></a>
+<span class="sourceLineNo">8673</span><a name="line.8673"></a>
+<span class="sourceLineNo">8674</span>  public void reportCompactionRequestEnd(boolean isMajor, int numFiles, long filesSizeCompacted) {<a name="line.8674"></a>
+<span class="sourceLineNo">8675</span>    int newValue = (isMajor ? majorInProgress : minorInProgress).decrementAndGet();<a name="line.8675"></a>
 <span class="sourceLineNo">8676</span><a name="line.8676"></a>
-<span class="sourceLineNo">8677</span>    assert newValue &gt;= 0;<a name="line.8677"></a>
-<span class="sourceLineNo">8678</span>  }<a name="line.8678"></a>
-<span class="sourceLineNo">8679</span><a name="line.8679"></a>
-<span class="sourceLineNo">8680</span>  public void reportCompactionRequestFailure() {<a name="line.8680"></a>
-<span class="sourceLineNo">8681</span>    compactionsFailed.increment();<a name="line.8681"></a>
-<span class="sourceLineNo">8682</span>  }<a name="line.8682"></a>
-<span class="sourceLineNo">8683</span><a name="line.8683"></a>
-<span class="sourceLineNo">8684</span>  public void incrementCompactionsQueuedCount() {<a name="line.8684"></a>
-<span class="sourceLineNo">8685</span>    compactionsQueued.increment();<a name="line.8685"></a>
-<span class="sourceLineNo">8686</span>  }<a name="line.8686"></a>
-<span class="sourceLineNo">8687</span><a name="line.8687"></a>
-<span class="sourceLineNo">8688</span>  public void decrementCompactionsQueuedCount() {<a name="line.8688"></a>
-<span class="sourceLineNo">8689</span>    compactionsQueued.decrement();<a name="line.8689"></a>
-<span class="sourceLineNo">8690</span>  }<a name="line.8690"></a>
-<span class="sourceLineNo">8691</span><a name="line.8691"></a>
-<span class="sourceLineNo">8692</span>  public void incrementFlushesQueuedCount() {<a name="line.8692"></a>
-<span class="sourceLineNo">8693</span>    flushesQueued.increment();<a name="line.8693"></a>
-<span class="sourceLineNo">8694</span>  }<a name="line.8694"></a>
-<span class="sourceLineNo">8695</span><a name="line.8695"></a>
-<span class="sourceLineNo">8696</span>  @VisibleForTesting<a name="line.8696"></a>
-<span class="sourceLineNo">8697</span>  public long getReadPoint() {<a name="line.8697"></a>
-<span class="sourceLineNo">8698</span>    return getReadPoint(IsolationLevel.READ_COMMITTED);<a name="line.8698"></a>
+<span class="sourceLineNo">8677</span>    // metrics<a name="line.8677"></a>
+<span class="sourceLineNo">8678</span>    compactionsFinished.increment();<a name="line.8678"></a>
+<span class="sourceLineNo">8679</span>    compactionNumFilesCompacted.add(numFiles);<a name="line.8679"></a>
+<span class="sourceLineNo">8680</span>    compactionNumBytesCompacted.add(filesSizeCompacted);<a name="line.8680"></a>
+<span class="sourceLineNo">8681</span><a name="line.8681"></a>
+<span class="sourceLineNo">8682</span>    assert newValue &gt;= 0;<a name="line.8682"></a>
+<span class="sourceLineNo">8683</span>  }<a name="line.8683"></a>
+<span class="sourceLineNo">8684</span><a name="line.8684"></a>
+<span class="sourceLineNo">8685</span>  public void reportCompactionRequestFailure() {<a name="line.8685"></a>
+<span class="sourceLineNo">8686</span>    compactionsFailed.increment();<a name="line.8686"></a>
+<span class="sourceLineNo">8687</span>  }<a name="line.8687"></a>
+<span class="sourceLineNo">8688</span><a name="line.8688"></a>
+<span class="sourceLineNo">8689</span>  public void incrementCompactionsQueuedCount() {<a name="line.8689"></a>
+<span class="sourceLineNo">8690</span>    compactionsQueued.increment();<a name="line.8690"></a>
+<span class="sourceLineNo">8691</span>  }<a name="line.8691"></a>
+<span class="sourceLineNo">8692</span><a name="line.8692"></a>
+<span class="sourceLineNo">8693</span>  public void decrementCompactionsQueuedCount() {<a name="line.8693"></a>
+<span class="sourceLineNo">8694</span>    compactionsQueued.decrement();<a name="line.8694"></a>
+<span class="sourceLineNo">8695</span>  }<a name="line.8695"></a>
+<span class="sourceLineNo">8696</span><a name="line.8696"></a>
+<span class="sourceLineNo">8697</span>  public void incrementFlushesQueuedCount() {<a name="line.8697"></a>
+<span class="sourceLineNo">8698</span>    flushesQueued.increment();<a name="line.8698"></a>
 <span class="sourceLineNo">8699</span>  }<a name="line.8699"></a>
 <span class="sourceLineNo">8700</span><a name="line.8700"></a>
-<span class="sourceLineNo">8701</span>  /**<a name="line.8701"></a>
-<span class="sourceLineNo">8702</span>   * {@inheritDoc}<a name="line.8702"></a>
-<span class="sourceLineNo">8703</span>   */<a name="line.8703"></a>
-<span class="sourceLineNo">8704</span>  @Override<a name="line.8704"></a>
-<span class="sourceLineNo">8705</span>  public void onConfigurationChange(Configuration conf) {<a name="line.8705"></a>
-<span class="sourceLineNo">8706</span>    this.storeHotnessProtector.update(conf);<a name="line.8706"></a>
-<span class="sourceLineNo">8707</span>  }<a name="line.8707"></a>
-<span class="sourceLineNo">8708</span><a name="line.8708"></a>
-<span class="sourceLineNo">8709</span>  /**<a name="line.8709"></a>
-<span class="sourceLineNo">8710</span>   * {@inheritDoc}<a name="line.8710"></a>
-<span class="sourceLineNo">8711</span>   */<a name="line.8711"></a>
-<span class="sourceLineNo">8712</span>  @Override<a name="line.8712"></a>
-<span class="sourceLineNo">8713</span>  public void registerChildren(ConfigurationManager manager) {<a name="line.8713"></a>
-<span class="sourceLineNo">8714</span>    configurationManager = Optional.of(manager);<a name="line.8714"></a>
-<span class="sourceLineNo">8715</span>    stores.values().forEach(manager::registerObserver);<a name="line.8715"></a>
-<span class="sourceLineNo">8716</span>  }<a name="line.8716"></a>
-<span class="sourceLineNo">8717</span><a name="line.8717"></a>
-<span class="sourceLineNo">8718</span>  /**<a name="line.8718"></a>
-<span class="sourceLineNo">8719</span>   * {@inheritDoc}<a name="line.8719"></a>
-<span class="sourceLineNo">8720</span>   */<a name="line.8720"></a>
-<span class="sourceLineNo">8721</span>  @Override<a name="line.8721"></a>
-<span class="sourceLineNo">8722</span>  public void deregisterChildren(ConfigurationManager manager) {<a name="line.8722"></a>
-<span class="sourceLineNo">8723</span>    stores.values().forEach(configurationManager.get()::deregisterObserver);<a name="line.8723"></a>
-<span class="sourceLineNo">8724</span>  }<a name="line.8724"></a>
-<span class="sourceLineNo">8725</span><a name="line.8725"></a>
+<span class="sourceLineNo">8701</span>  @VisibleForTesting<a name="line.8701"></a>
+<span class="sourceLineNo">8702</span>  public long getReadPoint() {<a name="line.8702"></a>
+<span class="sourceLineNo">8703</span>    return getReadPoint(IsolationLevel.READ_COMMITTED);<a name="line.8703"></a>
+<span class="sourceLineNo">8704</span>  }<a name="line.8704"></a>
+<span class="sourceLineNo">8705</span><a name="line.8705"></a>
+<span class="sourceLineNo">8706</span>  /**<a name="line.8706"></a>
+<span class="sourceLineNo">8707</span>   * {@inheritDoc}<a name="line.8707"></a>
+<span class="sourceLineNo">8708</span>   */<a name="line.8708"></a>
+<span class="sourceLineNo">8709</span>  @Override<a name="line.8709"></a>
+<span class="sourceLineNo">8710</span>  public void onConfigurationChange(Configuration conf) {<a name="line.8710"></a>
+<span class="sourceLineNo">8711</span>    this.storeHotnessProtector.update(conf);<a name="line.8711"></a>
+<span class="sourceLineNo">8712</span>  }<a name="line.8712"></a>
+<span class="sourceLineNo">8713</span><a name="line.8713"></a>
+<span class="sourceLineNo">8714</span>  /**<a name="line.8714"></a>
+<span class="sourceLineNo">8715</span>   * {@inheritDoc}<a name="line.8715"></a>
+<span class="sourceLineNo">8716</span>   */<a name="line.8716"></a>
+<span class="sourceLineNo">8717</span>  @Override<a name="line.8717"></a>
+<span class="sourceLineNo">8718</span>  public void registerChildren(ConfigurationManager manager) {<a name="line.8718"></a>
+<span class="sourceLineNo">8719</span>    configurationManager = Optional.of(manager);<a name="line.8719"></a>
+<span class="sourceLineNo">8720</span>    stores.values().forEach(manager::registerObserver);<a name="line.8720"></a>
+<span class="sourceLineNo">8721</span>  }<a name="line.8721"></a>
+<span class="sourceLineNo">8722</span><a name="line.8722"></a>
+<span class="sourceLineNo">8723</span>  /**<a name="line.8723"></a>
+<span class="sourceLineNo">8724</span>   * {@inheritDoc}<a name="line.8724"></a>
+<span class="sourceLineNo">8725</span>   */<a name="line.8725"></a>
 <span class="sourceLineNo">8726</span>  @Override<a name="line.8726"></a>
-<span class="sourceLineNo">8727</span>  public CellComparator getCellComparator() {<a name="line.8727"></a>
-<span class="sourceLineNo">8728</span>    return this.getRegionInfo().isMetaRegion() ? CellComparatorImpl.META_COMPARATOR<a name="line.8728"></a>
-<span class="sourceLineNo">8729</span>        : CellComparatorImpl.COMPARATOR;<a name="line.8729"></a>
-<span class="sourceLineNo">8730</span>  }<a name="line.8730"></a>
-<span class="sourceLineNo">8731</span><a name="line.8731"></a>
-<span class="sourceLineNo">8732</span>  public long getMemStoreFlushSize() {<a name="line.8732"></a>
-<span class="sourceLineNo">8733</span>    return this.memstoreFlushSize;<a name="line.8733"></a>
-<span class="sourceLineNo">8734</span>  }<a name="line.8734"></a>
-<span class="sourceLineNo">8735</span><a name="line.8735"></a>
+<span class="sourceLineNo">8727</span>  public void deregisterChildren(ConfigurationManager manager) {<a name="line.8727"></a>
+<span class="sourceLineNo">8728</span>    stores.values().forEach(configurationManager.get()::deregisterObserver);<a name="line.8728"></a>
+<span class="sourceLineNo">8729</span>  }<a name="line.8729"></a>
+<span class="sourceLineNo">8730</span><a name="line.8730"></a>
+<span class="sourceLineNo">8731</span>  @Override<a name="line.8731"></a>
+<span class="sourceLineNo">8732</span>  public CellComparator getCellComparator() {<a name="line.8732"></a>
+<span class="sourceLineNo">8733</span>    return this.getRegionInfo().isMetaRegion() ? CellComparatorImpl.META_COMPARATOR<a name="line.8733"></a>
+<span class="sourceLineNo">8734</span>        : CellComparatorImpl.COMPARATOR;<a name="line.8734"></a>
+<span class="sourceLineNo">8735</span>  }<a name="line.8735"></a>
 <span class="sourceLineNo">8736</span><a name="line.8736"></a>
-<span class="sourceLineNo">8737</span>  //// method for debugging tests<a name="line.8737"></a>
-<span class="sourceLineNo">8738</span>  void throwException(String title, String regionName) {<a name="line.8738"></a>
-<span class="sourceLineNo">8739</span>    StringBuilder buf = new StringBuilder();<a name="line.8739"></a>
-<span class="sourceLineNo">8740</span>    buf.append(title + ", ");<a name="line.8740"></a>
-<span class="sourceLineNo">8741</span>    buf.append(getRegionInfo().toString());<a name="line.8741"></a>
-<span class="sourceLineNo">8742</span>    buf.append(getRegionInfo().isMetaRegion() ? " meta region " : " ");<a name="line.8742"></a>
-<span class="sourceLineNo">8743</span>    buf.append("stores: ");<a name="line.8743"></a>
-<span class="sourceLineNo">8744</span>    for (HStore s : stores.values()) {<a name="line.8744"></a>
-<span class="sourceLineNo">8745</span>      buf.append(s.getColumnFamilyDescriptor().getNameAsString());<a name="line.8745"></a>
-<span class="sourceLineNo">8746</span>      buf.append(" size: ");<a name="line.8746"></a>
-<span class="sourceLineNo">8747</span>      buf.append(s.getMemStoreSize().getDataSize());<a name="line.8747"></a>
-<span class="sourceLineNo">8748</span>      buf.append(" ");<a name="line.8748"></a>
-<span class="sourceLineNo">8749</span>    }<a name="line.8749"></a>
-<span class="sourceLineNo">8750</span>    buf.append("end-of-stores");<a name="line.8750"></a>
-<span class="sourceLineNo">8751</span>    buf.append(", memstore size ");<a name="line.8751"></a>
-<span class="sourceLineNo">8752</span>    buf.append(getMemStoreDataSize());<a name="line.8752"></a>
-<span class="sourceLineNo">8753</span>    if (getRegionInfo().getRegionNameAsString().startsWith(regionName)) {<a name="line.8753"></a>
-<span class="sourceLineNo">8754</span>      throw new RuntimeException(buf.toString());<a name="line.8754"></a>
-<span class="sourceLineNo">8755</span>    }<a name="line.8755"></a>
-<span class="sourceLineNo">8756</span>  }<a name="line.8756"></a>
-<span class="sourceLineNo">8757</span><a name="line.8757"></a>
-<span class="sourceLineNo">8758</span>  @Override<a name="line.8758"></a>
-<span class="sourceLineNo">8759</span>  public void requestCompaction(String why, int priority, boolean major,<a name="line.8759"></a>
-<span class="sourceLineNo">8760</span>      CompactionLifeCycleTracker tracker) throws IOException {<a name="line.8760"></a>
-<span class="sourceLineNo">8761</span>    if (major) {<a name="line.8761"></a>
-<span class="sourceLineNo">8762</span>      stores.values().forEach(HStore::triggerMajorCompaction);<a name="line.8762"></a>
-<span class="sourceLineNo">8763</span>    }<a name="line.8763"></a>
-<span class="sourceLineNo">8764</span>    rsServices.getCompactionRequestor().requestCompaction(this, why, priority, tracker,<a name="line.8764"></a>
-<span class="sourceLineNo">8765</span>        RpcServer.getRequestUser().orElse(null));<a name="line.8765"></a>
-<span class="sourceLineNo">8766</span>  }<a name="line.8766"></a>
-<span class="sourceLineNo">8767</span><a name="line.8767"></a>
-<span class="sourceLineNo">8768</span>  @Override<a name="line.8768"></a>
-<span class="sourceLineNo">8769</span>  public void requestCompaction(byte[] family, String why, int priority, boolean major,<a name="line.8769"></a>
-<span class="sourceLineNo">8770</span>      CompactionLifeCycleTracker tracker) throws IOException {<a name="line.8770"></a>
-<span class="sourceLineNo">8771</span>    HStore store = stores.get(family);<a name="line.8771"></a>
-<span class="sourceLineNo">8772</span>    if (store == null) {<a name="line.8772"></a>
-<span class="sourceLineNo">8773</span>      throw new NoSuchColumnFamilyException("column family " + Bytes.toString(family) +<a name="line.8773"></a>
-<span class="sourceLineNo">8774</span>          " does not exist in region " + getRegionInfo().getRegionNameAsString());<a name="line.8774"></a>
-<span class="sourceLineNo">8775</span>    }<a name="line.8775"></a>
-<span class="sourceLineNo">8776</span>    if (major) {<a name="line.8776"></a>
-<span class="sourceLineNo">8777</span>      store.triggerMajorCompaction();<a name="line.8777"></a>
-<span class="sourceLineNo">8778</span>    }<a name="line.8778"></a>
-<span class="sourceLineNo">8779</span>    rsServices.getCompactionRequestor().requestCompaction(this, store, why, priority, tracker,<a name="line.8779"></a>
-<span class="sourceLineNo">8780</span>        RpcServer.getRequestUser().orElse(null));<a name="line.8780"></a>
-<span class="sourceLineNo">8781</span>  }<a name="line.8781"></a>
-<span class="sourceLineNo">8782</span><a name="line.8782"></a>
-<span class="sourceLineNo">8783</span>  private void requestFlushIfNeeded() throws RegionTooBusyException {<a name="line.8783"></a>
-<span class="sourceLineNo">8784</span>    if(isFlushSize(this.memStoreSizing.getMemStoreSize())) {<a name="line.8784"></a>
-<span class="sourceLineNo">8785</span>      requestFlush();<a name="line.8785"></a>
-<span class="sourceLineNo">8786</span>    }<a name="line.8786"></a>
-<span class="sourceLineNo">8787</span>  }<a name="line.8787"></a>
-<span class="sourceLineNo">8788</span><a name="line.8788"></a>
-<span class="sourceLineNo">8789</span>  private void requestFlush() {<a name="line.8789"></a>
-<span class="sourceLineNo">8790</span>    if (this.rsServices == null) {<a name="line.8790"></a>
-<span class="sourceLineNo">8791</span>      return;<a name="line.8791"></a>
-<span class="sourceLineNo">8792</span>    }<a name="line.8792"></a>
-<span class="sourceLineNo">8793</span>    requestFlush0(FlushLifeCycleTracker.DUMMY);<a name="line.8793"></a>
-<span class="sourceLineNo">8794</span>  }<a name="line.8794"></a>
-<span class="sourceLineNo">8795</span><a name="line.8795"></a>
-<span class="sourceLineNo">8796</span>  private void requestFlush0(FlushLifeCycleTracker tracker) {<a name="line.8796"></a>
-<span class="sourceLineNo">8797</span>    boolean shouldFlush = false;<a name="line.8797"></a>
-<span class="sourceLineNo">8798</span>    synchronized (writestate) {<a name="line.8798"></a>
-<span class="sourceLineNo">8799</span>      if (!this.writestate.isFlushRequested()) {<a name="line.8799"></a>
-<span class="sourceLineNo">8800</span>        shouldFlush = true;<a name="line.8800"></a>
-<span class="sourceLineNo">8801</span>        writestate.flushRequested = true;<a name="line.8801"></a>
-<span class="sourceLineNo">8802</span>      }<a name="line.8802"></a>
-<span class="sourceLineNo">8803</span>    }<a name="line.8803"></a>
-<span class="sourceLineNo">8804</span>    if (shouldFlush) {<a name="line.8804"></a>
-<span class="sourceLineNo">8805</span>      // Make request outside of synchronize block; HBASE-818.<a name="line.8805"></a>
-<span class="sourceLineNo">8806</span>      this.rsServices.getFlushRequester().requestFlush(this, false, tracker);<a name="line.8806"></a>
-<span class="sourceLineNo">8807</span>      if (LOG.isDebugEnabled()) {<a name="line.8807"></a>
-<span class="sourceLineNo">8808</span>        LOG.debug("Flush requested on " + this.getRegionInfo().getEncodedName());<a name="line.8808"></a>
-<span class="sourceLineNo">8809</span>      }<a name="line.8809"></a>
-<span class="sourceLineNo">8810</span>    } else {<a name="line.8810"></a>
-<span class="sourceLineNo">8811</span>      tracker.notExecuted("Flush already requested on " + this);<a name="line.8811"></a>
-<span class="sourceLineNo">8812</span>    }<a name="line.8812"></a>
-<span class="sourceLineNo">8813</span>  }<a name="line.8813"></a>
-<span class="sourceLineNo">8814</span><a name="line.8814"></a>
-<span class="sourceLineNo">8815</span>  @Override<a name="line.8815"></a>
-<span class="sourceLineNo">8816</span>  public void requestFlush(FlushLifeCycleTracker tracker) throws IOException {<a name="line.8816"></a>
-<span class="sourceLineNo">8817</span>    requestFlush0(tracker);<a name="line.8817"></a>
+<span class="sourceLineNo">8737</span>  public long getMemStoreFlushSize() {<a name="line.8737"></a>
+<span class="sourceLineNo">8738</span>    return this.memstoreFlushSize;<a name="line.8738"></a>
+<span class="sourceLineNo">8739</span>  }<a name="line.8739"></a>
+<span class="sourceLineNo">8740</span><a name="line.8740"></a>
+<span class="sourceLineNo">8741</span><a name="line.8741"></a>
+<span class="sourceLineNo">8742</span>  //// method for debugging tests<a name="line.8742"></a>
+<span class="sourceLineNo">8743</span>  void throwException(String title, String regionName) {<a name="line.8743"></a>
+<span class="sourceLineNo">8744</span>    StringBuilder buf = new StringBuilder();<a name="line.8744"></a>
+<span class="sourceLineNo">8745</span>    buf.append(title + ", ");<a name="line.8745"></a>
+<span class="sourceLineNo">8746</span>    buf.append(getRegionInfo().toString());<a name="line.8746"></a>
+<span class="sourceLineNo">8747</span>    buf.append(getRegionInfo().isMetaRegion() ? " meta region " : " ");<a name="line.8747"></a>
+<span class="sourceLineNo">8748</span>    buf.append("stores: ");<a name="line.8748"></a>
+<span class="sourceLineNo">8749</span>    for (HStore s : stores.values()) {<a name="line.8749"></a>
+<span class="sourceLineNo">8750</span>      buf.append(s.getColumnFamilyDescriptor().getNameAsString());<a name="line.8750"></a>
+<span class="sourceLineNo">8751</span>      buf.append(" size: ");<a name="line.8751"></a>
+<span class="sourceLineNo">8752</span>      buf.append(s.getMemStoreSize().getDataSize());<a name="line.8752"></a>
+<span class="sourceLineNo">8753</span>      buf.append(" ");<a name="line.8753"></a>
+<span class="sourceLineNo">8754</span>    }<a name="line.8754"></a>
+<span class="sourceLineNo">8755</span>    buf.append("end-of-stores");<a name="line.8755"></a>
+<span class="sourceLineNo">8756</span>    buf.append(", memstore size ");<a name="line.8756"></a>
+<span class="sourceLineNo">8757</span>    buf.append(getMemStoreDataSize());<a name="line.8757"></a>
+<span class="sourceLineNo">8758</span>    if (getRegionInfo().getRegionNameAsString().startsWith(regionName)) {<a name="line.8758"></a>
+<span class="sourceLineNo">8759</span>      throw new RuntimeException(buf.toString());<a name="line.8759"></a>
+<span class="sourceLineNo">8760</span>    }<a name="line.8760"></a>
+<span class="sourceLineNo">8761</span>  }<a name="line.8761"></a>
+<span class="sourceLineNo">8762</span><a name="line.8762"></a>
+<span class="sourceLineNo">8763</span>  @Override<a name="line.8763"></a>
+<span class="sourceLineNo">8764</span>  public void requestCompaction(String why, int priority, boolean major,<a name="line.8764"></a>
+<span class="sourceLineNo">8765</span>      CompactionLifeCycleTracker tracker) throws IOException {<a name="line.8765"></a>
+<span class="sourceLineNo">8766</span>    if (major) {<a name="line.8766"></a>
+<span class="sourceLineNo">8767</span>      stores.values().forEach(HStore::triggerMajorCompaction);<a name="line.8767"></a>
+<span class="sourceLineNo">8768</span>    }<a name="line.8768"></a>
+<span class="sourceLineNo">8769</span>    rsServices.getCompactionRequestor().requestCompaction(this, why, priority, tracker,<a name="line.8769"></a>
+<span class="sourceLineNo">8770</span>        RpcServer.getRequestUser().orElse(null));<a name="line.8770"></a>
+<span class="sourceLineNo">8771</span>  }<a name="line.8771"></a>
+<span class="sourceLineNo">8772</span><a name="line.8772"></a>
+<span class="sourceLineNo">8773</span>  @Override<a name="line.8773"></a>
+<span class="sourceLineNo">8774</span>  public void requestCompaction(byte[] family, String why, int priority, boolean major,<a name="line.8774"></a>
+<span class="sourceLineNo">8775</span>      CompactionLifeCycleTracker tracker) throws IOException {<a name="line.8775"></a>
+<span class="sourceLineNo">8776</span>    HStore store = stores.get(family);<a name="line.8776"></a>
+<span class="sourceLineNo">8777</span>    if (store == null) {<a name="line.8777"></a>
+<span class="sourceLineNo">8778</span>      throw new NoSuchColumnFamilyException("column family " + Bytes.toString(family) +<a name="line.8778"></a>
+<span class="sourceLineNo">8779</span>          " does not exist in region " + getRegionInfo().getRegionNameAsString());<a name="line.8779"></a>
+<span class="sourceLineNo">8780</span>    }<a name="line.8780"></a>
+<span class="sourceLineNo">8781</span>    if (major) {<a name="line.8781"></a>
+<span class="sourceLineNo">8782</span>      store.triggerMajorCompaction();<a name="line.8782"></a>
+<span class="sourceLineNo">8783</span>    }<a name="line.8783"></a>
+<span class="sourceLineNo">8784</span>    rsServices.getCompactionRequestor().requestCompaction(this, store, why, priority, tracker,<a name="line.8784"></a>
+<span class="sourceLineNo">8785</span>        RpcServer.getRequestUser().orElse(null));<a name="line.8785"></a>
+<span class="sourceLineNo">8786</span>  }<a name="line.8786"></a>
+<span class="sourceLineNo">8787</span><a name="line.8787"></a>
+<span class="sourceLineNo">8788</span>  private void requestFlushIfNeeded() throws RegionTooBusyException {<a name="line.8788"></a>
+<span class="sourceLineNo">8789</span>    if(isFlushSize(this.memStoreSizing.getMemStoreSize())) {<a name="line.8789"></a>
+<span class="sourceLineNo">8790</span>      requestFlush();<a name="line.8790"></a>
+<span class="sourceLineNo">8791</span>    }<a name="line.8791"></a>
+<span class="sourceLineNo">8792</span>  }<a name="line.8792"></a>
+<span class="sourceLineNo">8793</span><a name="line.8793"></a>
+<span class="sourceLineNo">8794</span>  private void requestFlush() {<a name="line.8794"></a>
+<span class="sourceLineNo">8795</span>    if (this.rsServices == null) {<a name="line.8795"></a>
+<span class="sourceLineNo">8796</span>      return;<a name="line.8796"></a>
+<span class="sourceLineNo">8797</span>    }<a name="line.8797"></a>
+<span class="sourceLineNo">8798</span>    requestFlush0(FlushLifeCycleTracker.DUMMY);<a name="line.8798"></a>
+<span class="sourceLineNo">8799</span>  }<a name="line.8799"></a>
+<span class="sourceLineNo">8800</span><a name="line.8800"></a>
+<span class="sourceLineNo">8801</span>  private void requestFlush0(FlushLifeCycleTracker tracker) {<a name="line.8801"></a>
+<span class="sourceLineNo">8802</span>    boolean shouldFlush = false;<a name="line.8802"></a>
+<span class="sourceLineNo">8803</span>    synchronized (writestate) {<a name="line.8803"></a>
+<span class="sourceLineNo">8804</span>      if (!this.writestate.isFlushRequested()) {<a name="line.8804"></a>
+<span class="sourceLineNo">8805</span>        shouldFlush = true;<a name="line.8805"></a>
+<span class="sourceLineNo">8806</span>        writestate.flushRequested = true;<a name="line.8806"></a>
+<span class="sourceLineNo">8807</span>      }<a name="line.8807"></a>
+<span class="sourceLineNo">8808</span>    }<a name="line.8808"></a>
+<span class="sourceLineNo">8809</span>    if (shouldFlush) {<a name="line.8809"></a>
+<span class="sourceLineNo">8810</span>      // Make request outside of synchronize block; HBASE-818.<a name="line.8810"></a>
+<span class="sourceLineNo">8811</span>      this.rsServices.getFlushRequester().requestFlush(this, false, tracker);<a name="line.8811"></a>
+<span class="sourceLineNo">8812</span>      if (LOG.isDebugEnabled()) {<a name="line.8812"></a>
+<span class="sourceLineNo">8813</span>        LOG.debug("Flush requested on " + this.getRegionInfo().getEncodedName());<a name="line.8813"></a>
+<span class="sourceLineNo">8814</span>      }<a name="line.8814"></a>
+<span class="sourceLineNo">8815</span>    } else {<a name="line.8815"></a>
+<span class="sourceLineNo">8816</span>      tracker.notExecuted("Flush already requested on " + this);<a name="line.8816"></a>
+<span class="sourceLineNo">8817</span>    }<a name="line.8817"></a>
 <span class="sourceLineNo">8818</span>  }<a name="line.8818"></a>
 <span class="sourceLineNo">8819</span><a name="line.8819"></a>
-<span class="sourceLineNo">8820</span>  /**<a name="line.8820"></a>
-<span class="sourceLineNo">8821</span>   * This method modifies the region's configuration in order to inject replication-related<a name="line.8821"></a>
-<span class="sourceLineNo">8822</span>   * features<a name="line.8822"></a>
-<span class="sourceLineNo">8823</span>   * @param conf region configurations<a name="line.8823"></a>
-<span class="sourceLineNo">8824</span>   */<a name="line.8824"></a>
-<span class="sourceLineNo">8825</span>  static void decorateRegionConfiguration(Configuration conf) {<a name="line.8825"></a>
-<span class="sourceLineNo">8826</span>    if (ReplicationUtils.isReplicationForBulkLoadDataEnabled(conf)) {<a name="line.8826"></a>
-<span class="sourceLineNo">8827</span>      String plugins = conf.get(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY,"");<a name="line.8827"></a>
-<span class="sourceLineNo">8828</span>      String replicationCoprocessorClass = ReplicationObserver.class.getCanonicalName();<a name="line.8828"></a>
-<span class="sourceLineNo">8829</span>      if (!plugins.contains(replicationCoprocessorClass)) {<a name="line.8829"></a>
-<span class="sourceLineNo">8830</span>        conf.set(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY,<a name="line.8830"></a>
-<span class="sourceLineNo">8831</span>            (plugins.equals("") ? "" : (plugins + ",")) + replicationCoprocessorClass);<a name="line.8831"></a>
-<span class="sourceLineNo">8832</span>      }<a name="line.8832"></a>
-<span class="sourceLineNo">8833</span>    }<a name="line.8833"></a>
-<span class="sourceLineNo">8834</span>  }<a name="line.8834"></a>
-<span class="sourceLineNo">8835</span>}<a name="line.8835"></a>
+<span class="sourceLineNo">8820</span>  @Override<a name="line.8820"></a>
+<span class="sourceLineNo">8821</span>  public void requestFlush(FlushLifeCycleTracker tracker) throws IOException {<a name="line.8821"></a>
+<span class="sourceLineNo">8822</span>    requestFlush0(tracker);<a name="line.8822"></a>
+<span class="sourceLineNo">8823</span>  }<a name="line.8823"></a>
+<span class="sourceLineNo">8824</span><a name="line.8824"></a>
+<span class="sourceLineNo">8825</span>  /**<a name="line.8825"></a>
+<span class="sourceLineNo">8826</span>   * This method modifies the region's configuration in order to inject replication-related<a name="line.8826"></a>
+<span class="sourceLineNo">8827</span>   * features<a name="line.8827"></a>
+<span class="sourceLineNo">8828</span>   * @param conf region configurations<a name="line.8828"></a>
+<span class="sourceLineNo">8829</span>   */<a name="line.8829"></a>
+<span class="sourceLineNo">8830</span>  static void decorateRegionConfiguration(Configuration conf) {<a name="line.8830"></a>
+<span class="sourceLineNo">8831</span>    if (ReplicationUtils.isReplicationForBulkLoadDataEnabled(conf)) {<a name="line.8831"></a>
+<span class="sourceLineNo">8832</span>      String plugins = conf.get(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY,"");<a name="line.8832"></a>
+<span class="sourceLineNo">8833</span>      String replicationCoprocessorClass = ReplicationObserver.class.getCanonicalName();<a name="line.8833"></a>
+<span class="sourceLineNo">8834</span>      if (!plugins.contains(replicationCoprocessorClass)) {<a name="line.8834"></a>
+<span class="sourceLineNo">8835</span>        conf.set(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY,<a name="line.8835"></a>
+<span class="sourceLineNo">8836</span>            (plugins.equals("") ? "" : (plugins + ",")) + replicationCoprocessorClass);<a name="line.8836"></a>
+<span class="sourceLineNo">8837</span>      }<a name="line.8837"></a>
+<span class="sourceLineNo">8838</span>    }<a name="line.8838"></a>
+<span class="sourceLineNo">8839</span>  }<a name="line.8839"></a>
+<span class="sourceLineNo">8840</span>}<a name="line.8840"></a>
 
 
 
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 8fcec33..2147e82 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
@@ -7972,875 +7972,880 @@
 <span class="sourceLineNo">7964</span>    if (walEdit.isReplay()) {<a name="line.7964"></a>
 <span class="sourceLineNo">7965</span>      walKey.setOrigLogSeqNum(origLogSeqNum);<a name="line.7965"></a>
 <span class="sourceLineNo">7966</span>    }<a name="line.7966"></a>
-<span class="sourceLineNo">7967</span>    WriteEntry writeEntry = null;<a name="line.7967"></a>
-<span class="sourceLineNo">7968</span>    try {<a name="line.7968"></a>
-<span class="sourceLineNo">7969</span>      long txid = this.wal.append(this.getRegionInfo(), walKey, walEdit, true);<a name="line.7969"></a>
-<span class="sourceLineNo">7970</span>      // Call sync on our edit.<a name="line.7970"></a>
-<span class="sourceLineNo">7971</span>      if (txid != 0) {<a name="line.7971"></a>
-<span class="sourceLineNo">7972</span>        sync(txid, durability);<a name="line.7972"></a>
-<span class="sourceLineNo">7973</span>      }<a name="line.7973"></a>
-<span class="sourceLineNo">7974</span>      writeEntry = walKey.getWriteEntry();<a name="line.7974"></a>
-<span class="sourceLineNo">7975</span>    } catch (IOException ioe) {<a name="line.7975"></a>
-<span class="sourceLineNo">7976</span>      if (walKey != null &amp;&amp; walKey.getWriteEntry() != null) {<a name="line.7976"></a>
-<span class="sourceLineNo">7977</span>        mvcc.complete(walKey.getWriteEntry());<a name="line.7977"></a>
+<span class="sourceLineNo">7967</span>    //don't call the coproc hook for writes to the WAL caused by<a name="line.7967"></a>
+<span class="sourceLineNo">7968</span>    //system lifecycle events like flushes or compactions<a name="line.7968"></a>
+<span class="sourceLineNo">7969</span>    if (this.coprocessorHost != null &amp;&amp; !walEdit.isMetaEdit()) {<a name="line.7969"></a>
+<span class="sourceLineNo">7970</span>      this.coprocessorHost.preWALAppend(walKey, walEdit);<a name="line.7970"></a>
+<span class="sourceLineNo">7971</span>    }<a name="line.7971"></a>
+<span class="sourceLineNo">7972</span>    WriteEntry writeEntry = null;<a name="line.7972"></a>
+<span class="sourceLineNo">7973</span>    try {<a name="line.7973"></a>
+<span class="sourceLineNo">7974</span>      long txid = this.wal.append(this.getRegionInfo(), walKey, walEdit, true);<a name="line.7974"></a>
+<span class="sourceLineNo">7975</span>      // Call sync on our edit.<a name="line.7975"></a>
+<span class="sourceLineNo">7976</span>      if (txid != 0) {<a name="line.7976"></a>
+<span class="sourceLineNo">7977</span>        sync(txid, durability);<a name="line.7977"></a>
 <span class="sourceLineNo">7978</span>      }<a name="line.7978"></a>
-<span class="sourceLineNo">7979</span>      throw ioe;<a name="line.7979"></a>
-<span class="sourceLineNo">7980</span>    }<a name="line.7980"></a>
-<span class="sourceLineNo">7981</span>    return writeEntry;<a name="line.7981"></a>
-<span class="sourceLineNo">7982</span>  }<a name="line.7982"></a>
-<span class="sourceLineNo">7983</span><a name="line.7983"></a>
-<span class="sourceLineNo">7984</span>  /**<a name="line.7984"></a>
-<span class="sourceLineNo">7985</span>   * Do coprocessor pre-increment or pre-append call.<a name="line.7985"></a>
-<span class="sourceLineNo">7986</span>   * @return Result returned out of the coprocessor, which means bypass all further processing and<a name="line.7986"></a>
-<span class="sourceLineNo">7987</span>   *  return the proffered Result instead, or null which means proceed.<a name="line.7987"></a>
-<span class="sourceLineNo">7988</span>   */<a name="line.7988"></a>
-<span class="sourceLineNo">7989</span>  private Result doCoprocessorPreCall(final Operation op, final Mutation mutation)<a name="line.7989"></a>
-<span class="sourceLineNo">7990</span>  throws IOException {<a name="line.7990"></a>
-<span class="sourceLineNo">7991</span>    Result result = null;<a name="line.7991"></a>
-<span class="sourceLineNo">7992</span>    if (this.coprocessorHost != null) {<a name="line.7992"></a>
-<span class="sourceLineNo">7993</span>      switch(op) {<a name="line.7993"></a>
-<span class="sourceLineNo">7994</span>        case INCREMENT:<a name="line.7994"></a>
-<span class="sourceLineNo">7995</span>          result = this.coprocessorHost.preIncrementAfterRowLock((Increment)mutation);<a name="line.7995"></a>
-<span class="sourceLineNo">7996</span>          break;<a name="line.7996"></a>
-<span class="sourceLineNo">7997</span>        case APPEND:<a name="line.7997"></a>
-<span class="sourceLineNo">7998</span>          result = this.coprocessorHost.preAppendAfterRowLock((Append)mutation);<a name="line.7998"></a>
-<span class="sourceLineNo">7999</span>          break;<a name="line.7999"></a>
-<span class="sourceLineNo">8000</span>        default: throw new UnsupportedOperationException(op.toString());<a name="line.8000"></a>
-<span class="sourceLineNo">8001</span>      }<a name="line.8001"></a>
-<span class="sourceLineNo">8002</span>    }<a name="line.8002"></a>
-<span class="sourceLineNo">8003</span>    return result;<a name="line.8003"></a>
-<span class="sourceLineNo">8004</span>  }<a name="line.8004"></a>
-<span class="sourceLineNo">8005</span><a name="line.8005"></a>
-<span class="sourceLineNo">8006</span>  /**<a name="line.8006"></a>
-<span class="sourceLineNo">8007</span>   * Reckon the Cells to apply to WAL, memstore, and to return to the Client; these Sets are not<a name="line.8007"></a>
-<span class="sourceLineNo">8008</span>   * always the same dependent on whether to write WAL.<a name="line.8008"></a>
-<span class="sourceLineNo">8009</span>   *<a name="line.8009"></a>
-<span class="sourceLineNo">8010</span>   * @param results Fill in here what goes back to the Client if it is non-null (if null, client<a name="line.8010"></a>
-<span class="sourceLineNo">8011</span>   *  doesn't want results).<a name="line.8011"></a>
-<span class="sourceLineNo">8012</span>   * @param forMemStore Fill in here what to apply to the MemStore (by Store).<a name="line.8012"></a>
-<span class="sourceLineNo">8013</span>   * @return A WALEdit to apply to WAL or null if we are to skip the WAL.<a name="line.8013"></a>
-<span class="sourceLineNo">8014</span>   */<a name="line.8014"></a>
-<span class="sourceLineNo">8015</span>  private WALEdit reckonDeltas(Operation op, Mutation mutation, Durability effectiveDurability,<a name="line.8015"></a>
-<span class="sourceLineNo">8016</span>      Map&lt;HStore, List&lt;Cell&gt;&gt; forMemStore, List&lt;Cell&gt; results) throws IOException {<a name="line.8016"></a>
-<span class="sourceLineNo">8017</span>    WALEdit walEdit = null;<a name="line.8017"></a>
-<span class="sourceLineNo">8018</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.8018"></a>
-<span class="sourceLineNo">8019</span>    final boolean writeToWAL = effectiveDurability != Durability.SKIP_WAL;<a name="line.8019"></a>
-<span class="sourceLineNo">8020</span>    // Process a Store/family at a time.<a name="line.8020"></a>
-<span class="sourceLineNo">8021</span>    for (Map.Entry&lt;byte [], List&lt;Cell&gt;&gt; entry: mutation.getFamilyCellMap().entrySet()) {<a name="line.8021"></a>
-<span class="sourceLineNo">8022</span>      final byte[] columnFamilyName = entry.getKey();<a name="line.8022"></a>
-<span class="sourceLineNo">8023</span>      List&lt;Cell&gt; deltas = entry.getValue();<a name="line.8023"></a>
-<span class="sourceLineNo">8024</span>      // Reckon for the Store what to apply to WAL and MemStore.<a name="line.8024"></a>
-<span class="sourceLineNo">8025</span>      List&lt;Cell&gt; toApply = reckonDeltasByStore(stores.get(columnFamilyName), op, mutation,<a name="line.8025"></a>
-<span class="sourceLineNo">8026</span>        effectiveDurability, now, deltas, results);<a name="line.8026"></a>
-<span class="sourceLineNo">8027</span>      if (!toApply.isEmpty()) {<a name="line.8027"></a>
-<span class="sourceLineNo">8028</span>        for (Cell cell : toApply) {<a name="line.8028"></a>
-<span class="sourceLineNo">8029</span>          HStore store = getStore(cell);<a name="line.8029"></a>
-<span class="sourceLineNo">8030</span>          if (store == null) {<a name="line.8030"></a>
-<span class="sourceLineNo">8031</span>            checkFamily(CellUtil.cloneFamily(cell));<a name="line.8031"></a>
-<span class="sourceLineNo">8032</span>          } else {<a name="line.8032"></a>
-<span class="sourceLineNo">8033</span>            forMemStore.computeIfAbsent(store, key -&gt; new ArrayList&lt;&gt;()).add(cell);<a name="line.8033"></a>
-<span class="sourceLineNo">8034</span>          }<a name="line.8034"></a>
-<span class="sourceLineNo">8035</span>        }<a name="line.8035"></a>
-<span class="sourceLineNo">8036</span>        if (writeToWAL) {<a name="line.8036"></a>
-<span class="sourceLineNo">8037</span>          if (walEdit == null) {<a name="line.8037"></a>
-<span class="sourceLineNo">8038</span>            walEdit = new WALEdit();<a name="line.8038"></a>
+<span class="sourceLineNo">7979</span>      writeEntry = walKey.getWriteEntry();<a name="line.7979"></a>
+<span class="sourceLineNo">7980</span>    } catch (IOException ioe) {<a name="line.7980"></a>
+<span class="sourceLineNo">7981</span>      if (walKey != null &amp;&amp; walKey.getWriteEntry() != null) {<a name="line.7981"></a>
+<span class="sourceLineNo">7982</span>        mvcc.complete(walKey.getWriteEntry());<a name="line.7982"></a>
+<span class="sourceLineNo">7983</span>      }<a name="line.7983"></a>
+<span class="sourceLineNo">7984</span>      throw ioe;<a name="line.7984"></a>
+<span class="sourceLineNo">7985</span>    }<a name="line.7985"></a>
+<span class="sourceLineNo">7986</span>    return writeEntry;<a name="line.7986"></a>
+<span class="sourceLineNo">7987</span>  }<a name="line.7987"></a>
+<span class="sourceLineNo">7988</span><a name="line.7988"></a>
+<span class="sourceLineNo">7989</span>  /**<a name="line.7989"></a>
+<span class="sourceLineNo">7990</span>   * Do coprocessor pre-increment or pre-append call.<a name="line.7990"></a>
+<span class="sourceLineNo">7991</span>   * @return Result returned out of the coprocessor, which means bypass all further processing and<a name="line.7991"></a>
+<span class="sourceLineNo">7992</span>   *  return the proffered Result instead, or null which means proceed.<a name="line.7992"></a>
+<span class="sourceLineNo">7993</span>   */<a name="line.7993"></a>
+<span class="sourceLineNo">7994</span>  private Result doCoprocessorPreCall(final Operation op, final Mutation mutation)<a name="line.7994"></a>
+<span class="sourceLineNo">7995</span>  throws IOException {<a name="line.7995"></a>
+<span class="sourceLineNo">7996</span>    Result result = null;<a name="line.7996"></a>
+<span class="sourceLineNo">7997</span>    if (this.coprocessorHost != null) {<a name="line.7997"></a>
+<span class="sourceLineNo">7998</span>      switch(op) {<a name="line.7998"></a>
+<span class="sourceLineNo">7999</span>        case INCREMENT:<a name="line.7999"></a>
+<span class="sourceLineNo">8000</span>          result = this.coprocessorHost.preIncrementAfterRowLock((Increment)mutation);<a name="line.8000"></a>
+<span class="sourceLineNo">8001</span>          break;<a name="line.8001"></a>
+<span class="sourceLineNo">8002</span>        case APPEND:<a name="line.8002"></a>
+<span class="sourceLineNo">8003</span>          result = this.coprocessorHost.preAppendAfterRowLock((Append)mutation);<a name="line.8003"></a>
+<span class="sourceLineNo">8004</span>          break;<a name="line.8004"></a>
+<span class="sourceLineNo">8005</span>        default: throw new UnsupportedOperationException(op.toString());<a name="line.8005"></a>
+<span class="sourceLineNo">8006</span>      }<a name="line.8006"></a>
+<span class="sourceLineNo">8007</span>    }<a name="line.8007"></a>
+<span class="sourceLineNo">8008</span>    return result;<a name="line.8008"></a>
+<span class="sourceLineNo">8009</span>  }<a name="line.8009"></a>
+<span class="sourceLineNo">8010</span><a name="line.8010"></a>
+<span class="sourceLineNo">8011</span>  /**<a name="line.8011"></a>
+<span class="sourceLineNo">8012</span>   * Reckon the Cells to apply to WAL, memstore, and to return to the Client; these Sets are not<a name="line.8012"></a>
+<span class="sourceLineNo">8013</span>   * always the same dependent on whether to write WAL.<a name="line.8013"></a>
+<span class="sourceLineNo">8014</span>   *<a name="line.8014"></a>
+<span class="sourceLineNo">8015</span>   * @param results Fill in here what goes back to the Client if it is non-null (if null, client<a name="line.8015"></a>
+<span class="sourceLineNo">8016</span>   *  doesn't want results).<a name="line.8016"></a>
+<span class="sourceLineNo">8017</span>   * @param forMemStore Fill in here what to apply to the MemStore (by Store).<a name="line.8017"></a>
+<span class="sourceLineNo">8018</span>   * @return A WALEdit to apply to WAL or null if we are to skip the WAL.<a name="line.8018"></a>
+<span class="sourceLineNo">8019</span>   */<a name="line.8019"></a>
+<span class="sourceLineNo">8020</span>  private WALEdit reckonDeltas(Operation op, Mutation mutation, Durability effectiveDurability,<a name="line.8020"></a>
+<span class="sourceLineNo">8021</span>      Map&lt;HStore, List&lt;Cell&gt;&gt; forMemStore, List&lt;Cell&gt; results) throws IOException {<a name="line.8021"></a>
+<span class="sourceLineNo">8022</span>    WALEdit walEdit = null;<a name="line.8022"></a>
+<span class="sourceLineNo">8023</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.8023"></a>
+<span class="sourceLineNo">8024</span>    final boolean writeToWAL = effectiveDurability != Durability.SKIP_WAL;<a name="line.8024"></a>
+<span class="sourceLineNo">8025</span>    // Process a Store/family at a time.<a name="line.8025"></a>
+<span class="sourceLineNo">8026</span>    for (Map.Entry&lt;byte [], List&lt;Cell&gt;&gt; entry: mutation.getFamilyCellMap().entrySet()) {<a name="line.8026"></a>
+<span class="sourceLineNo">8027</span>      final byte[] columnFamilyName = entry.getKey();<a name="line.8027"></a>
+<span class="sourceLineNo">8028</span>      List&lt;Cell&gt; deltas = entry.getValue();<a name="line.8028"></a>
+<span class="sourceLineNo">8029</span>      // Reckon for the Store what to apply to WAL and MemStore.<a name="line.8029"></a>
+<span class="sourceLineNo">8030</span>      List&lt;Cell&gt; toApply = reckonDeltasByStore(stores.get(columnFamilyName), op, mutation,<a name="line.8030"></a>
+<span class="sourceLineNo">8031</span>        effectiveDurability, now, deltas, results);<a name="line.8031"></a>
+<span class="sourceLineNo">8032</span>      if (!toApply.isEmpty()) {<a name="line.8032"></a>
+<span class="sourceLineNo">8033</span>        for (Cell cell : toApply) {<a name="line.8033"></a>
+<span class="sourceLineNo">8034</span>          HStore store = getStore(cell);<a name="line.8034"></a>
+<span class="sourceLineNo">8035</span>          if (store == null) {<a name="line.8035"></a>
+<span class="sourceLineNo">8036</span>            checkFamily(CellUtil.cloneFamily(cell));<a name="line.8036"></a>
+<span class="sourceLineNo">8037</span>          } else {<a name="line.8037"></a>
+<span class="sourceLineNo">8038</span>            forMemStore.computeIfAbsent(store, key -&gt; new ArrayList&lt;&gt;()).add(cell);<a name="line.8038"></a>
 <span class="sourceLineNo">8039</span>          }<a name="line.8039"></a>
-<span class="sourceLineNo">8040</span>          walEdit.getCells().addAll(toApply);<a name="line.8040"></a>
-<span class="sourceLineNo">8041</span>        }<a name="line.8041"></a>
-<span class="sourceLineNo">8042</span>      }<a name="line.8042"></a>
-<span class="sourceLineNo">8043</span>    }<a name="line.8043"></a>
-<span class="sourceLineNo">8044</span>    return walEdit;<a name="line.8044"></a>
-<span class="sourceLineNo">8045</span>  }<a name="line.8045"></a>
-<span class="sourceLineNo">8046</span><a name="line.8046"></a>
-<span class="sourceLineNo">8047</span>  /**<a name="line.8047"></a>
-<span class="sourceLineNo">8048</span>   * Reckon the Cells to apply to WAL, memstore, and to return to the Client in passed<a name="line.8048"></a>
-<span class="sourceLineNo">8049</span>   * column family/Store.<a name="line.8049"></a>
-<span class="sourceLineNo">8050</span>   *<a name="line.8050"></a>
-<span class="sourceLineNo">8051</span>   * Does Get of current value and then adds passed in deltas for this Store returning the result.<a name="line.8051"></a>
-<span class="sourceLineNo">8052</span>   *<a name="line.8052"></a>
-<span class="sourceLineNo">8053</span>   * @param op Whether Increment or Append<a name="line.8053"></a>
-<span class="sourceLineNo">8054</span>   * @param mutation The encompassing Mutation object<a name="line.8054"></a>
-<span class="sourceLineNo">8055</span>   * @param deltas Changes to apply to this Store; either increment amount or data to append<a name="line.8055"></a>
-<span class="sourceLineNo">8056</span>   * @param results In here we accumulate all the Cells we are to return to the client. If null,<a name="line.8056"></a>
-<span class="sourceLineNo">8057</span>   *                client doesn't want results returned.<a name="line.8057"></a>
-<span class="sourceLineNo">8058</span>   * @return Resulting Cells after &lt;code&gt;deltas&lt;/code&gt; have been applied to current<a name="line.8058"></a>
-<span class="sourceLineNo">8059</span>   *  values. Side effect is our filling out of the &lt;code&gt;results&lt;/code&gt; List.<a name="line.8059"></a>
-<span class="sourceLineNo">8060</span>   */<a name="line.8060"></a>
-<span class="sourceLineNo">8061</span>  private List&lt;Cell&gt; reckonDeltasByStore(HStore store, Operation op, Mutation mutation,<a name="line.8061"></a>
-<span class="sourceLineNo">8062</span>      Durability effectiveDurability, long now, List&lt;Cell&gt; deltas, List&lt;Cell&gt; results)<a name="line.8062"></a>
-<span class="sourceLineNo">8063</span>      throws IOException {<a name="line.8063"></a>
-<span class="sourceLineNo">8064</span>    byte[] columnFamily = store.getColumnFamilyDescriptor().getName();<a name="line.8064"></a>
-<span class="sourceLineNo">8065</span>    List&lt;Pair&lt;Cell, Cell&gt;&gt; cellPairs = new ArrayList&lt;&gt;(deltas.size());<a name="line.8065"></a>
-<span class="sourceLineNo">8066</span>    // Get previous values for all columns in this family.<a name="line.8066"></a>
-<span class="sourceLineNo">8067</span>    TimeRange tr = null;<a name="line.8067"></a>
-<span class="sourceLineNo">8068</span>    switch (op) {<a name="line.8068"></a>
-<span class="sourceLineNo">8069</span>      case INCREMENT:<a name="line.8069"></a>
-<span class="sourceLineNo">8070</span>        tr = ((Increment)mutation).getTimeRange();<a name="line.8070"></a>
-<span class="sourceLineNo">8071</span>        break;<a name="line.8071"></a>
-<span class="sourceLineNo">8072</span>      case APPEND:<a name="line.8072"></a>
-<span class="sourceLineNo">8073</span>        tr = ((Append)mutation).getTimeRange();<a name="line.8073"></a>
-<span class="sourceLineNo">8074</span>        break;<a name="line.8074"></a>
-<span class="sourceLineNo">8075</span>      default:<a name="line.8075"></a>
+<span class="sourceLineNo">8040</span>        }<a name="line.8040"></a>
+<span class="sourceLineNo">8041</span>        if (writeToWAL) {<a name="line.8041"></a>
+<span class="sourceLineNo">8042</span>          if (walEdit == null) {<a name="line.8042"></a>
+<span class="sourceLineNo">8043</span>            walEdit = new WALEdit();<a name="line.8043"></a>
+<span class="sourceLineNo">8044</span>          }<a name="line.8044"></a>
+<span class="sourceLineNo">8045</span>          walEdit.getCells().addAll(toApply);<a name="line.8045"></a>
+<span class="sourceLineNo">8046</span>        }<a name="line.8046"></a>
+<span class="sourceLineNo">8047</span>      }<a name="line.8047"></a>
+<span class="sourceLineNo">8048</span>    }<a name="line.8048"></a>
+<span class="sourceLineNo">8049</span>    return walEdit;<a name="line.8049"></a>
+<span class="sourceLineNo">8050</span>  }<a name="line.8050"></a>
+<span class="sourceLineNo">8051</span><a name="line.8051"></a>
+<span class="sourceLineNo">8052</span>  /**<a name="line.8052"></a>
+<span class="sourceLineNo">8053</span>   * Reckon the Cells to apply to WAL, memstore, and to return to the Client in passed<a name="line.8053"></a>
+<span class="sourceLineNo">8054</span>   * column family/Store.<a name="line.8054"></a>
+<span class="sourceLineNo">8055</span>   *<a name="line.8055"></a>
+<span class="sourceLineNo">8056</span>   * Does Get of current value and then adds passed in deltas for this Store returning the result.<a name="line.8056"></a>
+<span class="sourceLineNo">8057</span>   *<a name="line.8057"></a>
+<span class="sourceLineNo">8058</span>   * @param op Whether Increment or Append<a name="line.8058"></a>
+<span class="sourceLineNo">8059</span>   * @param mutation The encompassing Mutation object<a name="line.8059"></a>
+<span class="sourceLineNo">8060</span>   * @param deltas Changes to apply to this Store; either increment amount or data to append<a name="line.8060"></a>
+<span class="sourceLineNo">8061</span>   * @param results In here we accumulate all the Cells we are to return to the client. If null,<a name="line.8061"></a>
+<span class="sourceLineNo">8062</span>   *                client doesn't want results returned.<a name="line.8062"></a>
+<span class="sourceLineNo">8063</span>   * @return Resulting Cells after &lt;code&gt;deltas&lt;/code&gt; have been applied to current<a name="line.8063"></a>
+<span class="sourceLineNo">8064</span>   *  values. Side effect is our filling out of the &lt;code&gt;results&lt;/code&gt; List.<a name="line.8064"></a>
+<span class="sourceLineNo">8065</span>   */<a name="line.8065"></a>
+<span class="sourceLineNo">8066</span>  private List&lt;Cell&gt; reckonDeltasByStore(HStore store, Operation op, Mutation mutation,<a name="line.8066"></a>
+<span class="sourceLineNo">8067</span>      Durability effectiveDurability, long now, List&lt;Cell&gt; deltas, List&lt;Cell&gt; results)<a name="line.8067"></a>
+<span class="sourceLineNo">8068</span>      throws IOException {<a name="line.8068"></a>
+<span class="sourceLineNo">8069</span>    byte[] columnFamily = store.getColumnFamilyDescriptor().getName();<a name="line.8069"></a>
+<span class="sourceLineNo">8070</span>    List&lt;Pair&lt;Cell, Cell&gt;&gt; cellPairs = new ArrayList&lt;&gt;(deltas.size());<a name="line.8070"></a>
+<span class="sourceLineNo">8071</span>    // Get previous values for all columns in this family.<a name="line.8071"></a>
+<span class="sourceLineNo">8072</span>    TimeRange tr = null;<a name="line.8072"></a>
+<span class="sourceLineNo">8073</span>    switch (op) {<a name="line.8073"></a>
+<span class="sourceLineNo">8074</span>      case INCREMENT:<a name="line.8074"></a>
+<span class="sourceLineNo">8075</span>        tr = ((Increment)mutation).getTimeRange();<a name="line.8075"></a>
 <span class="sourceLineNo">8076</span>        break;<a name="line.8076"></a>
-<span class="sourceLineNo">8077</span>    }<a name="line.8077"></a>
-<span class="sourceLineNo">8078</span>    List&lt;Cell&gt; currentValues = get(mutation, store, deltas,null, tr);<a name="line.8078"></a>
-<span class="sourceLineNo">8079</span>    // Iterate the input columns and update existing values if they were found, otherwise<a name="line.8079"></a>
-<span class="sourceLineNo">8080</span>    // add new column initialized to the delta amount<a name="line.8080"></a>
-<span class="sourceLineNo">8081</span>    int currentValuesIndex = 0;<a name="line.8081"></a>
-<span class="sourceLineNo">8082</span>    for (int i = 0; i &lt; deltas.size(); i++) {<a name="line.8082"></a>
-<span class="sourceLineNo">8083</span>      Cell delta = deltas.get(i);<a name="line.8083"></a>
-<span class="sourceLineNo">8084</span>      Cell currentValue = null;<a name="line.8084"></a>
-<span class="sourceLineNo">8085</span>      if (currentValuesIndex &lt; currentValues.size() &amp;&amp;<a name="line.8085"></a>
-<span class="sourceLineNo">8086</span>          CellUtil.matchingQualifier(currentValues.get(currentValuesIndex), delta)) {<a name="line.8086"></a>
-<span class="sourceLineNo">8087</span>        currentValue = currentValues.get(currentValuesIndex);<a name="line.8087"></a>
-<span class="sourceLineNo">8088</span>        if (i &lt; (deltas.size() - 1) &amp;&amp; !CellUtil.matchingQualifier(delta, deltas.get(i + 1))) {<a name="line.8088"></a>
-<span class="sourceLineNo">8089</span>          currentValuesIndex++;<a name="line.8089"></a>
-<span class="sourceLineNo">8090</span>        }<a name="line.8090"></a>
-<span class="sourceLineNo">8091</span>      }<a name="line.8091"></a>
-<span class="sourceLineNo">8092</span><a name="line.8092"></a>
-<span class="sourceLineNo">8093</span>      // Switch on whether this an increment or an append building the new Cell to apply.<a name="line.8093"></a>
-<span class="sourceLineNo">8094</span>      Cell newCell = null;<a name="line.8094"></a>
-<span class="sourceLineNo">8095</span>      switch (op) {<a name="line.8095"></a>
-<span class="sourceLineNo">8096</span>        case INCREMENT:<a name="line.8096"></a>
-<span class="sourceLineNo">8097</span>          long deltaAmount = getLongValue(delta);<a name="line.8097"></a>
-<span class="sourceLineNo">8098</span>          final long newValue = currentValue == null ? deltaAmount : getLongValue(currentValue) + deltaAmount;<a name="line.8098"></a>
-<span class="sourceLineNo">8099</span>          newCell = reckonDelta(delta, currentValue, columnFamily, now, mutation, (oldCell) -&gt; Bytes.toBytes(newValue));<a name="line.8099"></a>
-<span class="sourceLineNo">8100</span>          break;<a name="line.8100"></a>
-<span class="sourceLineNo">8101</span>        case APPEND:<a name="line.8101"></a>
-<span class="sourceLineNo">8102</span>          newCell = reckonDelta(delta, currentValue, columnFamily, now, mutation, (oldCell) -&gt;<a name="line.8102"></a>
-<span class="sourceLineNo">8103</span>            ByteBuffer.wrap(new byte[delta.getValueLength() + oldCell.getValueLength()])<a name="line.8103"></a>
-<span class="sourceLineNo">8104</span>                    .put(oldCell.getValueArray(), oldCell.getValueOffset(), oldCell.getValueLength())<a name="line.8104"></a>
-<span class="sourceLineNo">8105</span>                    .put(delta.getValueArray(), delta.getValueOffset(), delta.getValueLength())<a name="line.8105"></a>
-<span class="sourceLineNo">8106</span>                    .array()<a name="line.8106"></a>
-<span class="sourceLineNo">8107</span>          );<a name="line.8107"></a>
-<span class="sourceLineNo">8108</span>          break;<a name="line.8108"></a>
-<span class="sourceLineNo">8109</span>        default: throw new UnsupportedOperationException(op.toString());<a name="line.8109"></a>
-<span class="sourceLineNo">8110</span>      }<a name="line.8110"></a>
-<span class="sourceLineNo">8111</span>      int newCellSize = PrivateCellUtil.estimatedSerializedSizeOf(newCell);<a name="line.8111"></a>
-<span class="sourceLineNo">8112</span>      if (newCellSize &gt; this.maxCellSize) {<a name="line.8112"></a>
-<span class="sourceLineNo">8113</span>        String msg = "Cell with size " + newCellSize + " exceeds limit of " +<a name="line.8113"></a>
-<span class="sourceLineNo">8114</span>            this.maxCellSize + " bytes";<a name="line.8114"></a>
-<span class="sourceLineNo">8115</span>        if (LOG.isDebugEnabled()) {<a name="line.8115"></a>
-<span class="sourceLineNo">8116</span>          LOG.debug(msg);<a name="line.8116"></a>
-<span class="sourceLineNo">8117</span>        }<a name="line.8117"></a>
-<span class="sourceLineNo">8118</span>        throw new DoNotRetryIOException(msg);<a name="line.8118"></a>
-<span class="sourceLineNo">8119</span>      }<a name="line.8119"></a>
-<span class="sourceLineNo">8120</span>      cellPairs.add(new Pair&lt;&gt;(currentValue, newCell));<a name="line.8120"></a>
-<span class="sourceLineNo">8121</span>      // Add to results to get returned to the Client. If null, cilent does not want results.<a name="line.8121"></a>
-<span class="sourceLineNo">8122</span>      if (results != null) {<a name="line.8122"></a>
-<span class="sourceLineNo">8123</span>        results.add(newCell);<a name="line.8123"></a>
+<span class="sourceLineNo">8077</span>      case APPEND:<a name="line.8077"></a>
+<span class="sourceLineNo">8078</span>        tr = ((Append)mutation).getTimeRange();<a name="line.8078"></a>
+<span class="sourceLineNo">8079</span>        break;<a name="line.8079"></a>
+<span class="sourceLineNo">8080</span>      default:<a name="line.8080"></a>
+<span class="sourceLineNo">8081</span>        break;<a name="line.8081"></a>
+<span class="sourceLineNo">8082</span>    }<a name="line.8082"></a>
+<span class="sourceLineNo">8083</span>    List&lt;Cell&gt; currentValues = get(mutation, store, deltas,null, tr);<a name="line.8083"></a>
+<span class="sourceLineNo">8084</span>    // Iterate the input columns and update existing values if they were found, otherwise<a name="line.8084"></a>
+<span class="sourceLineNo">8085</span>    // add new column initialized to the delta amount<a name="line.8085"></a>
+<span class="sourceLineNo">8086</span>    int currentValuesIndex = 0;<a name="line.8086"></a>
+<span class="sourceLineNo">8087</span>    for (int i = 0; i &lt; deltas.size(); i++) {<a name="line.8087"></a>
+<span class="sourceLineNo">8088</span>      Cell delta = deltas.get(i);<a name="line.8088"></a>
+<span class="sourceLineNo">8089</span>      Cell currentValue = null;<a name="line.8089"></a>
+<span class="sourceLineNo">8090</span>      if (currentValuesIndex &lt; currentValues.size() &amp;&amp;<a name="line.8090"></a>
+<span class="sourceLineNo">8091</span>          CellUtil.matchingQualifier(currentValues.get(currentValuesIndex), delta)) {<a name="line.8091"></a>
+<span class="sourceLineNo">8092</span>        currentValue = currentValues.get(currentValuesIndex);<a name="line.8092"></a>
+<span class="sourceLineNo">8093</span>        if (i &lt; (deltas.size() - 1) &amp;&amp; !CellUtil.matchingQualifier(delta, deltas.get(i + 1))) {<a name="line.8093"></a>
+<span class="sourceLineNo">8094</span>          currentValuesIndex++;<a name="line.8094"></a>
+<span class="sourceLineNo">8095</span>        }<a name="line.8095"></a>
+<span class="sourceLineNo">8096</span>      }<a name="line.8096"></a>
+<span class="sourceLineNo">8097</span><a name="line.8097"></a>
+<span class="sourceLineNo">8098</span>      // Switch on whether this an increment or an append building the new Cell to apply.<a name="line.8098"></a>
+<span class="sourceLineNo">8099</span>      Cell newCell = null;<a name="line.8099"></a>
+<span class="sourceLineNo">8100</span>      switch (op) {<a name="line.8100"></a>
+<span class="sourceLineNo">8101</span>        case INCREMENT:<a name="line.8101"></a>
+<span class="sourceLineNo">8102</span>          long deltaAmount = getLongValue(delta);<a name="line.8102"></a>
+<span class="sourceLineNo">8103</span>          final long newValue = currentValue == null ? deltaAmount : getLongValue(currentValue) + deltaAmount;<a name="line.8103"></a>
+<span class="sourceLineNo">8104</span>          newCell = reckonDelta(delta, currentValue, columnFamily, now, mutation, (oldCell) -&gt; Bytes.toBytes(newValue));<a name="line.8104"></a>
+<span class="sourceLineNo">8105</span>          break;<a name="line.8105"></a>
+<span class="sourceLineNo">8106</span>        case APPEND:<a name="line.8106"></a>
+<span class="sourceLineNo">8107</span>          newCell = reckonDelta(delta, currentValue, columnFamily, now, mutation, (oldCell) -&gt;<a name="line.8107"></a>
+<span class="sourceLineNo">8108</span>            ByteBuffer.wrap(new byte[delta.getValueLength() + oldCell.getValueLength()])<a name="line.8108"></a>
+<span class="sourceLineNo">8109</span>                    .put(oldCell.getValueArray(), oldCell.getValueOffset(), oldCell.getValueLength())<a name="line.8109"></a>
+<span class="sourceLineNo">8110</span>                    .put(delta.getValueArray(), delta.getValueOffset(), delta.getValueLength())<a name="line.8110"></a>
+<span class="sourceLineNo">8111</span>                    .array()<a name="line.8111"></a>
+<span class="sourceLineNo">8112</span>          );<a name="line.8112"></a>
+<span class="sourceLineNo">8113</span>          break;<a name="line.8113"></a>
+<span class="sourceLineNo">8114</span>        default: throw new UnsupportedOperationException(op.toString());<a name="line.8114"></a>
+<span class="sourceLineNo">8115</span>      }<a name="line.8115"></a>
+<span class="sourceLineNo">8116</span>      int newCellSize = PrivateCellUtil.estimatedSerializedSizeOf(newCell);<a name="line.8116"></a>
+<span class="sourceLineNo">8117</span>      if (newCellSize &gt; this.maxCellSize) {<a name="line.8117"></a>
+<span class="sourceLineNo">8118</span>        String msg = "Cell with size " + newCellSize + " exceeds limit of " +<a name="line.8118"></a>
+<span class="sourceLineNo">8119</span>            this.maxCellSize + " bytes";<a name="line.8119"></a>
+<span class="sourceLineNo">8120</span>        if (LOG.isDebugEnabled()) {<a name="line.8120"></a>
+<span class="sourceLineNo">8121</span>          LOG.debug(msg);<a name="line.8121"></a>
+<span class="sourceLineNo">8122</span>        }<a name="line.8122"></a>
+<span class="sourceLineNo">8123</span>        throw new DoNotRetryIOException(msg);<a name="line.8123"></a>
 <span class="sourceLineNo">8124</span>      }<a name="line.8124"></a>
-<span class="sourceLineNo">8125</span>    }<a name="line.8125"></a>
-<span class="sourceLineNo">8126</span><a name="line.8126"></a>
-<span class="sourceLineNo">8127</span>    // Give coprocessors a chance to update the new cells before apply to WAL or memstore<a name="line.8127"></a>
-<span class="sourceLineNo">8128</span>    if (coprocessorHost != null) {<a name="line.8128"></a>
-<span class="sourceLineNo">8129</span>      // Here the operation must be increment or append.<a name="line.8129"></a>
-<span class="sourceLineNo">8130</span>      cellPairs = op == Operation.INCREMENT ?<a name="line.8130"></a>
-<span class="sourceLineNo">8131</span>          coprocessorHost.postIncrementBeforeWAL(mutation, cellPairs) :<a name="line.8131"></a>
-<span class="sourceLineNo">8132</span>          coprocessorHost.postAppendBeforeWAL(mutation, cellPairs);<a name="line.8132"></a>
-<span class="sourceLineNo">8133</span>    }<a name="line.8133"></a>
-<span class="sourceLineNo">8134</span>    return cellPairs.stream().map(Pair::getSecond).collect(Collectors.toList());<a name="line.8134"></a>
-<span class="sourceLineNo">8135</span>  }<a name="line.8135"></a>
-<span class="sourceLineNo">8136</span><a name="line.8136"></a>
-<span class="sourceLineNo">8137</span>  private static Cell reckonDelta(final Cell delta, final Cell currentCell,<a name="line.8137"></a>
-<span class="sourceLineNo">8138</span>                                  final byte[] columnFamily, final long now,<a name="line.8138"></a>
-<span class="sourceLineNo">8139</span>                                  Mutation mutation, Function&lt;Cell, byte[]&gt; supplier) throws IOException {<a name="line.8139"></a>
-<span class="sourceLineNo">8140</span>    // Forward any tags found on the delta.<a name="line.8140"></a>
-<span class="sourceLineNo">8141</span>    List&lt;Tag&gt; tags = TagUtil.carryForwardTags(delta);<a name="line.8141"></a>
-<span class="sourceLineNo">8142</span>    tags = TagUtil.carryForwardTTLTag(tags, mutation.getTTL());<a name="line.8142"></a>
-<span class="sourceLineNo">8143</span>    if (currentCell != null) {<a name="line.8143"></a>
-<span class="sourceLineNo">8144</span>      tags = TagUtil.carryForwardTags(tags, currentCell);<a name="line.8144"></a>
-<span class="sourceLineNo">8145</span>      byte[] newValue = supplier.apply(currentCell);<a name="line.8145"></a>
-<span class="sourceLineNo">8146</span>      return ExtendedCellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.8146"></a>
-<span class="sourceLineNo">8147</span>              .setRow(mutation.getRow(), 0, mutation.getRow().length)<a name="line.8147"></a>
-<span class="sourceLineNo">8148</span>              .setFamily(columnFamily, 0, columnFamily.length)<a name="line.8148"></a>
-<span class="sourceLineNo">8149</span>              // copy the qualifier if the cell is located in shared memory.<a name="line.8149"></a>
-<span class="sourceLineNo">8150</span>              .setQualifier(CellUtil.cloneQualifier(delta))<a name="line.8150"></a>
-<span class="sourceLineNo">8151</span>              .setTimestamp(Math.max(currentCell.getTimestamp() + 1, now))<a name="line.8151"></a>
-<span class="sourceLineNo">8152</span>              .setType(KeyValue.Type.Put.getCode())<a name="line.8152"></a>
-<span class="sourceLineNo">8153</span>              .setValue(newValue, 0, newValue.length)<a name="line.8153"></a>
-<span class="sourceLineNo">8154</span>              .setTags(TagUtil.fromList(tags))<a name="line.8154"></a>
-<span class="sourceLineNo">8155</span>              .build();<a name="line.8155"></a>
-<span class="sourceLineNo">8156</span>    } else {<a name="line.8156"></a>
-<span class="sourceLineNo">8157</span>      PrivateCellUtil.updateLatestStamp(delta, now);<a name="line.8157"></a>
-<span class="sourceLineNo">8158</span>      return CollectionUtils.isEmpty(tags) ? delta : PrivateCellUtil.createCell(delta, tags);<a name="line.8158"></a>
-<span class="sourceLineNo">8159</span>    }<a name="line.8159"></a>
-<span class="sourceLineNo">8160</span>  }<a name="line.8160"></a>
-<span class="sourceLineNo">8161</span><a name="line.8161"></a>
-<span class="sourceLineNo">8162</span>  /**<a name="line.8162"></a>
-<span class="sourceLineNo">8163</span>   * @return Get the long out of the passed in Cell<a name="line.8163"></a>
-<span class="sourceLineNo">8164</span>   */<a name="line.8164"></a>
-<span class="sourceLineNo">8165</span>  private static long getLongValue(final Cell cell) throws DoNotRetryIOException {<a name="line.8165"></a>
-<span class="sourceLineNo">8166</span>    int len = cell.getValueLength();<a name="line.8166"></a>
-<span class="sourceLineNo">8167</span>    if (len != Bytes.SIZEOF_LONG) {<a name="line.8167"></a>
-<span class="sourceLineNo">8168</span>      // throw DoNotRetryIOException instead of IllegalArgumentException<a name="line.8168"></a>
-<span class="sourceLineNo">8169</span>      throw new DoNotRetryIOException("Field is not a long, it's " + len + " bytes wide");<a name="line.8169"></a>
-<span class="sourceLineNo">8170</span>    }<a name="line.8170"></a>
-<span class="sourceLineNo">8171</span>    return PrivateCellUtil.getValueAsLong(cell);<a name="line.8171"></a>
-<span class="sourceLineNo">8172</span>  }<a name="line.8172"></a>
-<span class="sourceLineNo">8173</span><a name="line.8173"></a>
-<span class="sourceLineNo">8174</span>  /**<a name="line.8174"></a>
-<span class="sourceLineNo">8175</span>   * Do a specific Get on passed &lt;code&gt;columnFamily&lt;/code&gt; and column qualifiers.<a name="line.8175"></a>
-<span class="sourceLineNo">8176</span>   * @param mutation Mutation we are doing this Get for.<a name="line.8176"></a>
-<span class="sourceLineNo">8177</span>   * @param store Which column family on row (TODO: Go all Gets in one go)<a name="line.8177"></a>
-<span class="sourceLineNo">8178</span>   * @param coordinates Cells from &lt;code&gt;mutation&lt;/code&gt; used as coordinates applied to Get.<a name="line.8178"></a>
-<span class="sourceLineNo">8179</span>   * @return Return list of Cells found.<a name="line.8179"></a>
-<span class="sourceLineNo">8180</span>   */<a name="line.8180"></a>
-<span class="sourceLineNo">8181</span>  private List&lt;Cell&gt; get(Mutation mutation, HStore store, List&lt;Cell&gt; coordinates,<a name="line.8181"></a>
-<span class="sourceLineNo">8182</span>      IsolationLevel isolation, TimeRange tr) throws IOException {<a name="line.8182"></a>
-<span class="sourceLineNo">8183</span>    // Sort the cells so that they match the order that they appear in the Get results. Otherwise,<a name="line.8183"></a>
-<span class="sourceLineNo">8184</span>    // we won't be able to find the existing values if the cells are not specified in order by the<a name="line.8184"></a>
-<span class="sourceLineNo">8185</span>    // client since cells are in an array list.<a name="line.8185"></a>
-<span class="sourceLineNo">8186</span>    // TODO: I don't get why we are sorting. St.Ack 20150107<a name="line.8186"></a>
-<span class="sourceLineNo">8187</span>    sort(coordinates, store.getComparator());<a name="line.8187"></a>
-<span class="sourceLineNo">8188</span>    Get get = new Get(mutation.getRow());<a name="line.8188"></a>
-<span class="sourceLineNo">8189</span>    if (isolation != null) {<a name="line.8189"></a>
-<span class="sourceLineNo">8190</span>      get.setIsolationLevel(isolation);<a name="line.8190"></a>
-<span class="sourceLineNo">8191</span>    }<a name="line.8191"></a>
-<span class="sourceLineNo">8192</span>    for (Cell cell: coordinates) {<a name="line.8192"></a>
-<span class="sourceLineNo">8193</span>      get.addColumn(store.getColumnFamilyDescriptor().getName(), CellUtil.cloneQualifier(cell));<a name="line.8193"></a>
-<span class="sourceLineNo">8194</span>    }<a name="line.8194"></a>
-<span class="sourceLineNo">8195</span>    // Increments carry time range. If an Increment instance, put it on the Get.<a name="line.8195"></a>
-<span class="sourceLineNo">8196</span>    if (tr != null) {<a name="line.8196"></a>
-<span class="sourceLineNo">8197</span>      get.setTimeRange(tr.getMin(), tr.getMax());<a name="line.8197"></a>
-<span class="sourceLineNo">8198</span>    }<a name="line.8198"></a>
-<span class="sourceLineNo">8199</span>    return get(get, false);<a name="line.8199"></a>
-<span class="sourceLineNo">8200</span>  }<a name="line.8200"></a>
-<span class="sourceLineNo">8201</span><a name="line.8201"></a>
-<span class="sourceLineNo">8202</span>  /**<a name="line.8202"></a>
-<span class="sourceLineNo">8203</span>   * @return Sorted list of &lt;code&gt;cells&lt;/code&gt; using &lt;code&gt;comparator&lt;/code&gt;<a name="line.8203"></a>
-<span class="sourceLineNo">8204</span>   */<a name="line.8204"></a>
-<span class="sourceLineNo">8205</span>  private static List&lt;Cell&gt; sort(List&lt;Cell&gt; cells, final CellComparator comparator) {<a name="line.8205"></a>
-<span class="sourceLineNo">8206</span>    cells.sort(comparator);<a name="line.8206"></a>
-<span class="sourceLineNo">8207</span>    return cells;<a name="line.8207"></a>
-<span class="sourceLineNo">8208</span>  }<a name="line.8208"></a>
-<span class="sourceLineNo">8209</span><a name="line.8209"></a>
-<span class="sourceLineNo">8210</span>  public static final long FIXED_OVERHEAD = ClassSize.align(<a name="line.8210"></a>
-<span class="sourceLineNo">8211</span>      ClassSize.OBJECT +<a name="line.8211"></a>
-<span class="sourceLineNo">8212</span>      ClassSize.ARRAY +<a name="line.8212"></a>
-<span class="sourceLineNo">8213</span>      55 * ClassSize.REFERENCE + 3 * Bytes.SIZEOF_INT +<a name="line.8213"></a>
-<span class="sourceLineNo">8214</span>      (15 * Bytes.SIZEOF_LONG) +<a name="line.8214"></a>
-<span class="sourceLineNo">8215</span>      3 * Bytes.SIZEOF_BOOLEAN);<a name="line.8215"></a>
-<span class="sourceLineNo">8216</span><a name="line.8216"></a>
-<span class="sourceLineNo">8217</span>  // woefully out of date - currently missing:<a name="line.8217"></a>
-<span class="sourceLineNo">8218</span>  // 1 x HashMap - coprocessorServiceHandlers<a name="line.8218"></a>
-<span class="sourceLineNo">8219</span>  // 6 x LongAdder - numMutationsWithoutWAL, dataInMemoryWithoutWAL,<a name="line.8219"></a>
-<span class="sourceLineNo">8220</span>  //   checkAndMutateChecksPassed, checkAndMutateChecksFailed, readRequestsCount,<a name="line.8220"></a>
-<span class="sourceLineNo">8221</span>  //   writeRequestsCount, cpRequestsCount<a name="line.8221"></a>
-<span class="sourceLineNo">8222</span>  // 1 x HRegion$WriteState - writestate<a name="line.8222"></a>
-<span class="sourceLineNo">8223</span>  // 1 x RegionCoprocessorHost - coprocessorHost<a name="line.8223"></a>
-<span class="sourceLineNo">8224</span>  // 1 x RegionSplitPolicy - splitPolicy<a name="line.8224"></a>
-<span class="sourceLineNo">8225</span>  // 1 x MetricsRegion - metricsRegion<a name="line.8225"></a>
-<span class="sourceLineNo">8226</span>  // 1 x MetricsRegionWrapperImpl - metricsRegionWrapper<a name="line.8226"></a>
-<span class="sourceLineNo">8227</span>  public static final long DEEP_OVERHEAD = FIXED_OVERHEAD +<a name="line.8227"></a>
-<span class="sourceLineNo">8228</span>      ClassSize.OBJECT + // closeLock<a name="line.8228"></a>
-<span class="sourceLineNo">8229</span>      (2 * ClassSize.ATOMIC_BOOLEAN) + // closed, closing<a name="line.8229"></a>
-<span class="sourceLineNo">8230</span>      (3 * ClassSize.ATOMIC_LONG) + // numPutsWithoutWAL, dataInMemoryWithoutWAL,<a name="line.8230"></a>
-<span class="sourceLineNo">8231</span>                                    // compactionsFailed<a name="line.8231"></a>
-<span class="sourceLineNo">8232</span>      (2 * ClassSize.CONCURRENT_HASHMAP) +  // lockedRows, scannerReadPoints<a name="line.8232"></a>
-<span class="sourceLineNo">8233</span>      WriteState.HEAP_SIZE + // writestate<a name="line.8233"></a>
-<span class="sourceLineNo">8234</span>      ClassSize.CONCURRENT_SKIPLISTMAP + ClassSize.CONCURRENT_SKIPLISTMAP_ENTRY + // stores<a name="line.8234"></a>
-<span class="sourceLineNo">8235</span>      (2 * ClassSize.REENTRANT_LOCK) + // lock, updatesLock<a name="line.8235"></a>
-<span class="sourceLineNo">8236</span>      MultiVersionConcurrencyControl.FIXED_SIZE // mvcc<a name="line.8236"></a>
-<span class="sourceLineNo">8237</span>      + 2 * ClassSize.TREEMAP // maxSeqIdInStores, replicationScopes<a name="line.8237"></a>
-<span class="sourceLineNo">8238</span>      + 2 * ClassSize.ATOMIC_INTEGER // majorInProgress, minorInProgress<a name="line.8238"></a>
-<span class="sourceLineNo">8239</span>      + ClassSize.STORE_SERVICES // store services<a name="line.8239"></a>
-<span class="sourceLineNo">8240</span>      + StoreHotnessProtector.FIXED_SIZE<a name="line.8240"></a>
-<span class="sourceLineNo">8241</span>      ;<a name="line.8241"></a>
-<span class="sourceLineNo">8242</span><a name="line.8242"></a>
-<span class="sourceLineNo">8243</span>  @Override<a name="line.8243"></a>
-<span class="sourceLineNo">8244</span>  public long heapSize() {<a name="line.8244"></a>
-<span class="sourceLineNo">8245</span>    // this does not take into account row locks, recent flushes, mvcc entries, and more<a name="line.8245"></a>
-<span class="sourceLineNo">8246</span>    return DEEP_OVERHEAD + stores.values().stream().mapToLong(HStore::heapSize).sum();<a name="line.8246"></a>
-<span class="sourceLineNo">8247</span>  }<a name="line.8247"></a>
-<span class="sourceLineNo">8248</span><a name="line.8248"></a>
-<span class="sourceLineNo">8249</span>  /**<a name="line.8249"></a>
-<span class="sourceLineNo">8250</span>   * Registers a new protocol buffer {@link Service} subclass as a coprocessor endpoint to<a name="line.8250"></a>
-<span class="sourceLineNo">8251</span>   * be available for handling Region#execService(com.google.protobuf.RpcController,<a name="line.8251"></a>
-<span class="sourceLineNo">8252</span>   *    org.apache.hadoop.hbase.protobuf.generated.ClientProtos.CoprocessorServiceCall) calls.<a name="line.8252"></a>
-<span class="sourceLineNo">8253</span>   *<a name="line.8253"></a>
-<span class="sourceLineNo">8254</span>   * &lt;p&gt;<a name="line.8254"></a>
-<span class="sourceLineNo">8255</span>   * Only a single instance may be registered per region for a given {@link Service} subclass (the<a name="line.8255"></a>
-<span class="sourceLineNo">8256</span>   * instances are keyed on {@link com.google.protobuf.Descriptors.ServiceDescriptor#getFullName()}.<a name="line.8256"></a>
-<span class="sourceLineNo">8257</span>   * After the first registration, subsequent calls with the same service name will fail with<a name="line.8257"></a>
-<span class="sourceLineNo">8258</span>   * a return value of {@code false}.<a name="line.8258"></a>
-<span class="sourceLineNo">8259</span>   * &lt;/p&gt;<a name="line.8259"></a>
-<span class="sourceLineNo">8260</span>   * @param instance the {@code Service} subclass instance to expose as a coprocessor endpoint<a name="line.8260"></a>
-<span class="sourceLineNo">8261</span>   * @return {@code true} if the registration was successful, {@code false}<a name="line.8261"></a>
-<span class="sourceLineNo">8262</span>   * otherwise<a name="line.8262"></a>
-<span class="sourceLineNo">8263</span>   */<a name="line.8263"></a>
-<span class="sourceLineNo">8264</span>  public boolean registerService(com.google.protobuf.Service instance) {<a name="line.8264"></a>
-<span class="sourceLineNo">8265</span>    /*<a name="line.8265"></a>
-<span class="sourceLineNo">8266</span>     * No stacking of instances is allowed for a single service name<a name="line.8266"></a>
-<span class="sourceLineNo">8267</span>     */<a name="line.8267"></a>
-<span class="sourceLineNo">8268</span>    com.google.protobuf.Descriptors.ServiceDescriptor serviceDesc = instance.getDescriptorForType();<a name="line.8268"></a>
-<span class="sourceLineNo">8269</span>    String serviceName = CoprocessorRpcUtils.getServiceName(serviceDesc);<a name="line.8269"></a>
-<span class="sourceLineNo">8270</span>    if (coprocessorServiceHandlers.containsKey(serviceName)) {<a name="line.8270"></a>
-<span class="sourceLineNo">8271</span>      LOG.error("Coprocessor service " + serviceName +<a name="line.8271"></a>
-<span class="sourceLineNo">8272</span>          " already registered, rejecting request from " + instance);<a name="line.8272"></a>
-<span class="sourceLineNo">8273</span>      return false;<a name="line.8273"></a>
-<span class="sourceLineNo">8274</span>    }<a name="line.8274"></a>
-<span class="sourceLineNo">8275</span><a name="line.8275"></a>
-<span class="sourceLineNo">8276</span>    coprocessorServiceHandlers.put(serviceName, instance);<a name="line.8276"></a>
-<span class="sourceLineNo">8277</span>    if (LOG.isDebugEnabled()) {<a name="line.8277"></a>
-<span class="sourceLineNo">8278</span>      LOG.debug("Registered coprocessor service: region=" +<a name="line.8278"></a>
-<span class="sourceLineNo">8279</span>          Bytes.toStringBinary(getRegionInfo().getRegionName()) +<a name="line.8279"></a>
-<span class="sourceLineNo">8280</span>          " service=" + serviceName);<a name="line.8280"></a>
-<span class="sourceLineNo">8281</span>    }<a name="line.8281"></a>
-<span class="sourceLineNo">8282</span>    return true;<a name="line.8282"></a>
-<span class="sourceLineNo">8283</span>  }<a name="line.8283"></a>
-<span class="sourceLineNo">8284</span><a name="line.8284"></a>
-<span class="sourceLineNo">8285</span>  /**<a name="line.8285"></a>
-<span class="sourceLineNo">8286</span>   * Executes a single protocol buffer coprocessor endpoint {@link Service} method using<a name="line.8286"></a>
-<span class="sourceLineNo">8287</span>   * the registered protocol handlers.  {@link Service} implementations must be registered via the<a name="line.8287"></a>
-<span class="sourceLineNo">8288</span>   * {@link #registerService(com.google.protobuf.Service)}<a name="line.8288"></a>
-<span class="sourceLineNo">8289</span>   * method before they are available.<a name="line.8289"></a>
-<span class="sourceLineNo">8290</span>   *<a name="line.8290"></a>
-<span class="sourceLineNo">8291</span>   * @param controller an {@code RpcContoller} implementation to pass to the invoked service<a name="line.8291"></a>
-<span class="sourceLineNo">8292</span>   * @param call a {@code CoprocessorServiceCall} instance identifying the service, method,<a name="line.8292"></a>
-<span class="sourceLineNo">8293</span>   *     and parameters for the method invocation<a name="line.8293"></a>
-<span class="sourceLineNo">8294</span>   * @return a protocol buffer {@code Message} instance containing the method's result<a name="line.8294"></a>
-<span class="sourceLineNo">8295</span>   * @throws IOException if no registered service handler is found or an error<a name="line.8295"></a>
-<span class="sourceLineNo">8296</span>   *     occurs during the invocation<a name="line.8296"></a>
-<span class="sourceLineNo">8297</span>   * @see #registerService(com.google.protobuf.Service)<a name="line.8297"></a>
-<span class="sourceLineNo">8298</span>   */<a name="line.8298"></a>
-<span class="sourceLineNo">8299</span>  public com.google.protobuf.Message execService(com.google.protobuf.RpcController controller,<a name="line.8299"></a>
-<span class="sourceLineNo">8300</span>      CoprocessorServiceCall call) throws IOException {<a name="line.8300"></a>
-<span class="sourceLineNo">8301</span>    String serviceName = call.getServiceName();<a name="line.8301"></a>
-<span class="sourceLineNo">8302</span>    com.google.protobuf.Service service = coprocessorServiceHandlers.get(serviceName);<a name="line.8302"></a>
-<span class="sourceLineNo">8303</span>    if (service == null) {<a name="line.8303"></a>
-<span class="sourceLineNo">8304</span>      throw new UnknownProtocolException(null, "No registered coprocessor service found for " +<a name="line.8304"></a>
-<span class="sourceLineNo">8305</span>          serviceName + " in region " + Bytes.toStringBinary(getRegionInfo().getRegionName()));<a name="line.8305"></a>
-<span class="sourceLineNo">8306</span>    }<a name="line.8306"></a>
-<span class="sourceLineNo">8307</span>    com.google.protobuf.Descriptors.ServiceDescriptor serviceDesc = service.getDescriptorForType();<a name="line.8307"></a>
-<span class="sourceLineNo">8308</span><a name="line.8308"></a>
-<span class="sourceLineNo">8309</span>    cpRequestsCount.increment();<a name="line.8309"></a>
-<span class="sourceLineNo">8310</span>    String methodName = call.getMethodName();<a name="line.8310"></a>
-<span class="sourceLineNo">8311</span>    com.google.protobuf.Descriptors.MethodDescriptor methodDesc =<a name="line.8311"></a>
-<span class="sourceLineNo">8312</span>        CoprocessorRpcUtils.getMethodDescriptor(methodName, serviceDesc);<a name="line.8312"></a>
+<span class="sourceLineNo">8125</span>      cellPairs.add(new Pair&lt;&gt;(currentValue, newCell));<a name="line.8125"></a>
+<span class="sourceLineNo">8126</span>      // Add to results to get returned to the Client. If null, cilent does not want results.<a name="line.8126"></a>
+<span class="sourceLineNo">8127</span>      if (results != null) {<a name="line.8127"></a>
+<span class="sourceLineNo">8128</span>        results.add(newCell);<a name="line.8128"></a>
+<span class="sourceLineNo">8129</span>      }<a name="line.8129"></a>
+<span class="sourceLineNo">8130</span>    }<a name="line.8130"></a>
+<span class="sourceLineNo">8131</span><a name="line.8131"></a>
+<span class="sourceLineNo">8132</span>    // Give coprocessors a chance to update the new cells before apply to WAL or memstore<a name="line.8132"></a>
+<span class="sourceLineNo">8133</span>    if (coprocessorHost != null) {<a name="line.8133"></a>
+<span class="sourceLineNo">8134</span>      // Here the operation must be increment or append.<a name="line.8134"></a>
+<span class="sourceLineNo">8135</span>      cellPairs = op == Operation.INCREMENT ?<a name="line.8135"></a>
+<span class="sourceLineNo">8136</span>          coprocessorHost.postIncrementBeforeWAL(mutation, cellPairs) :<a name="line.8136"></a>
+<span class="sourceLineNo">8137</span>          coprocessorHost.postAppendBeforeWAL(mutation, cellPairs);<a name="line.8137"></a>
+<span class="sourceLineNo">8138</span>    }<a name="line.8138"></a>
+<span class="sourceLineNo">8139</span>    return cellPairs.stream().map(Pair::getSecond).collect(Collectors.toList());<a name="line.8139"></a>
+<span class="sourceLineNo">8140</span>  }<a name="line.8140"></a>
+<span class="sourceLineNo">8141</span><a name="line.8141"></a>
+<span class="sourceLineNo">8142</span>  private static Cell reckonDelta(final Cell delta, final Cell currentCell,<a name="line.8142"></a>
+<span class="sourceLineNo">8143</span>                                  final byte[] columnFamily, final long now,<a name="line.8143"></a>
+<span class="sourceLineNo">8144</span>                                  Mutation mutation, Function&lt;Cell, byte[]&gt; supplier) throws IOException {<a name="line.8144"></a>
+<span class="sourceLineNo">8145</span>    // Forward any tags found on the delta.<a name="line.8145"></a>
+<span class="sourceLineNo">8146</span>    List&lt;Tag&gt; tags = TagUtil.carryForwardTags(delta);<a name="line.8146"></a>
+<span class="sourceLineNo">8147</span>    tags = TagUtil.carryForwardTTLTag(tags, mutation.getTTL());<a name="line.8147"></a>
+<span class="sourceLineNo">8148</span>    if (currentCell != null) {<a name="line.8148"></a>
+<span class="sourceLineNo">8149</span>      tags = TagUtil.carryForwardTags(tags, currentCell);<a name="line.8149"></a>
+<span class="sourceLineNo">8150</span>      byte[] newValue = supplier.apply(currentCell);<a name="line.8150"></a>
+<span class="sourceLineNo">8151</span>      return ExtendedCellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.8151"></a>
+<span class="sourceLineNo">8152</span>              .setRow(mutation.getRow(), 0, mutation.getRow().length)<a name="line.8152"></a>
+<span class="sourceLineNo">8153</span>              .setFamily(columnFamily, 0, columnFamily.length)<a name="line.8153"></a>
+<span class="sourceLineNo">8154</span>              // copy the qualifier if the cell is located in shared memory.<a name="line.8154"></a>
+<span class="sourceLineNo">8155</span>              .setQualifier(CellUtil.cloneQualifier(delta))<a name="line.8155"></a>
+<span class="sourceLineNo">8156</span>              .setTimestamp(Math.max(currentCell.getTimestamp() + 1, now))<a name="line.8156"></a>
+<span class="sourceLineNo">8157</span>              .setType(KeyValue.Type.Put.getCode())<a name="line.8157"></a>
+<span class="sourceLineNo">8158</span>              .setValue(newValue, 0, newValue.length)<a name="line.8158"></a>
+<span class="sourceLineNo">8159</span>              .setTags(TagUtil.fromList(tags))<a name="line.8159"></a>
+<span class="sourceLineNo">8160</span>              .build();<a name="line.8160"></a>
+<span class="sourceLineNo">8161</span>    } else {<a name="line.8161"></a>
+<span class="sourceLineNo">8162</span>      PrivateCellUtil.updateLatestStamp(delta, now);<a name="line.8162"></a>
+<span class="sourceLineNo">8163</span>      return CollectionUtils.isEmpty(tags) ? delta : PrivateCellUtil.createCell(delta, tags);<a name="line.8163"></a>
+<span class="sourceLineNo">8164</span>    }<a name="line.8164"></a>
+<span class="sourceLineNo">8165</span>  }<a name="line.8165"></a>
+<span class="sourceLineNo">8166</span><a name="line.8166"></a>
+<span class="sourceLineNo">8167</span>  /**<a name="line.8167"></a>
+<span class="sourceLineNo">8168</span>   * @return Get the long out of the passed in Cell<a name="line.8168"></a>
+<span class="sourceLineNo">8169</span>   */<a name="line.8169"></a>
+<span class="sourceLineNo">8170</span>  private static long getLongValue(final Cell cell) throws DoNotRetryIOException {<a name="line.8170"></a>
+<span class="sourceLineNo">8171</span>    int len = cell.getValueLength();<a name="line.8171"></a>
+<span class="sourceLineNo">8172</span>    if (len != Bytes.SIZEOF_LONG) {<a name="line.8172"></a>
+<span class="sourceLineNo">8173</span>      // throw DoNotRetryIOException instead of IllegalArgumentException<a name="line.8173"></a>
+<span class="sourceLineNo">8174</span>      throw new DoNotRetryIOException("Field is not a long, it's " + len + " bytes wide");<a name="line.8174"></a>
+<span class="sourceLineNo">8175</span>    }<a name="line.8175"></a>
+<span class="sourceLineNo">8176</span>    return PrivateCellUtil.getValueAsLong(cell);<a name="line.8176"></a>
+<span class="sourceLineNo">8177</span>  }<a name="line.8177"></a>
+<span class="sourceLineNo">8178</span><a name="line.8178"></a>
+<span class="sourceLineNo">8179</span>  /**<a name="line.8179"></a>
+<span class="sourceLineNo">8180</span>   * Do a specific Get on passed &lt;code&gt;columnFamily&lt;/code&gt; and column qualifiers.<a name="line.8180"></a>
+<span class="sourceLineNo">8181</span>   * @param mutation Mutation we are doing this Get for.<a name="line.8181"></a>
+<span class="sourceLineNo">8182</span>   * @param store Which column family on row (TODO: Go all Gets in one go)<a name="line.8182"></a>
+<span class="sourceLineNo">8183</span>   * @param coordinates Cells from &lt;code&gt;mutation&lt;/code&gt; used as coordinates applied to Get.<a name="line.8183"></a>
+<span class="sourceLineNo">8184</span>   * @return Return list of Cells found.<a name="line.8184"></a>
+<span class="sourceLineNo">8185</span>   */<a name="line.8185"></a>
+<span class="sourceLineNo">8186</span>  private List&lt;Cell&gt; get(Mutation mutation, HStore store, List&lt;Cell&gt; coordinates,<a name="line.8186"></a>
+<span class="sourceLineNo">8187</span>      IsolationLevel isolation, TimeRange tr) throws IOException {<a name="line.8187"></a>
+<span class="sourceLineNo">8188</span>    // Sort the cells so that they match the order that they appear in the Get results. Otherwise,<a name="line.8188"></a>
+<span class="sourceLineNo">8189</span>    // we won't be able to find the existing values if the cells are not specified in order by the<a name="line.8189"></a>
+<span class="sourceLineNo">8190</span>    // client since cells are in an array list.<a name="line.8190"></a>
+<span class="sourceLineNo">8191</span>    // TODO: I don't get why we are sorting. St.Ack 20150107<a name="line.8191"></a>
+<span class="sourceLineNo">8192</span>    sort(coordinates, store.getComparator());<a name="line.8192"></a>
+<span class="sourceLineNo">8193</span>    Get get = new Get(mutation.getRow());<a name="line.8193"></a>
+<span class="sourceLineNo">8194</span>    if (isolation != null) {<a name="line.8194"></a>
+<span class="sourceLineNo">8195</span>      get.setIsolationLevel(isolation);<a name="line.8195"></a>
+<span class="sourceLineNo">8196</span>    }<a name="line.8196"></a>
+<span class="sourceLineNo">8197</span>    for (Cell cell: coordinates) {<a name="line.8197"></a>
+<span class="sourceLineNo">8198</span>      get.addColumn(store.getColumnFamilyDescriptor().getName(), CellUtil.cloneQualifier(cell));<a name="line.8198"></a>
+<span class="sourceLineNo">8199</span>    }<a name="line.8199"></a>
+<span class="sourceLineNo">8200</span>    // Increments carry time range. If an Increment instance, put it on the Get.<a name="line.8200"></a>
+<span class="sourceLineNo">8201</span>    if (tr != null) {<a name="line.8201"></a>
+<span class="sourceLineNo">8202</span>      get.setTimeRange(tr.getMin(), tr.getMax());<a name="line.8202"></a>
+<span class="sourceLineNo">8203</span>    }<a name="line.8203"></a>
+<span class="sourceLineNo">8204</span>    return get(get, false);<a name="line.8204"></a>
+<span class="sourceLineNo">8205</span>  }<a name="line.8205"></a>
+<span class="sourceLineNo">8206</span><a name="line.8206"></a>
+<span class="sourceLineNo">8207</span>  /**<a name="line.8207"></a>
+<span class="sourceLineNo">8208</span>   * @return Sorted list of &lt;code&gt;cells&lt;/code&gt; using &lt;code&gt;comparator&lt;/code&gt;<a name="line.8208"></a>
+<span class="sourceLineNo">8209</span>   */<a name="line.8209"></a>
+<span class="sourceLineNo">8210</span>  private static List&lt;Cell&gt; sort(List&lt;Cell&gt; cells, final CellComparator comparator) {<a name="line.8210"></a>
+<span class="sourceLineNo">8211</span>    cells.sort(comparator);<a name="line.8211"></a>
+<span class="sourceLineNo">8212</span>    return cells;<a name="line.8212"></a>
+<span class="sourceLineNo">8213</span>  }<a name="line.8213"></a>
+<span class="sourceLineNo">8214</span><a name="line.8214"></a>
+<span class="sourceLineNo">8215</span>  public static final long FIXED_OVERHEAD = ClassSize.align(<a name="line.8215"></a>
+<span class="sourceLineNo">8216</span>      ClassSize.OBJECT +<a name="line.8216"></a>
+<span class="sourceLineNo">8217</span>      ClassSize.ARRAY +<a name="line.8217"></a>
+<span class="sourceLineNo">8218</span>      55 * ClassSize.REFERENCE + 3 * Bytes.SIZEOF_INT +<a name="line.8218"></a>
+<span class="sourceLineNo">8219</span>      (15 * Bytes.SIZEOF_LONG) +<a name="line.8219"></a>
+<span class="sourceLineNo">8220</span>      3 * Bytes.SIZEOF_BOOLEAN);<a name="line.8220"></a>
+<span class="sourceLineNo">8221</span><a name="line.8221"></a>
+<span class="sourceLineNo">8222</span>  // woefully out of date - currently missing:<a name="line.8222"></a>
+<span class="sourceLineNo">8223</span>  // 1 x HashMap - coprocessorServiceHandlers<a name="line.8223"></a>
+<span class="sourceLineNo">8224</span>  // 6 x LongAdder - numMutationsWithoutWAL, dataInMemoryWithoutWAL,<a name="line.8224"></a>
+<span class="sourceLineNo">8225</span>  //   checkAndMutateChecksPassed, checkAndMutateChecksFailed, readRequestsCount,<a name="line.8225"></a>
+<span class="sourceLineNo">8226</span>  //   writeRequestsCount, cpRequestsCount<a name="line.8226"></a>
+<span class="sourceLineNo">8227</span>  // 1 x HRegion$WriteState - writestate<a name="line.8227"></a>
+<span class="sourceLineNo">8228</span>  // 1 x RegionCoprocessorHost - coprocessorHost<a name="line.8228"></a>
+<span class="sourceLineNo">8229</span>  // 1 x RegionSplitPolicy - splitPolicy<a name="line.8229"></a>
+<span class="sourceLineNo">8230</span>  // 1 x MetricsRegion - metricsRegion<a name="line.8230"></a>
+<span class="sourceLineNo">8231</span>  // 1 x MetricsRegionWrapperImpl - metricsRegionWrapper<a name="line.8231"></a>
+<span class="sourceLineNo">8232</span>  public static final long DEEP_OVERHEAD = FIXED_OVERHEAD +<a name="line.8232"></a>
+<span class="sourceLineNo">8233</span>      ClassSize.OBJECT + // closeLock<a name="line.8233"></a>
+<span class="sourceLineNo">8234</span>      (2 * ClassSize.ATOMIC_BOOLEAN) + // closed, closing<a name="line.8234"></a>
+<span class="sourceLineNo">8235</span>      (3 * ClassSize.ATOMIC_LONG) + // numPutsWithoutWAL, dataInMemoryWithoutWAL,<a name="line.8235"></a>
+<span class="sourceLineNo">8236</span>                                    // compactionsFailed<a name="line.8236"></a>
+<span class="sourceLineNo">8237</span>      (2 * ClassSize.CONCURRENT_HASHMAP) +  // lockedRows, scannerReadPoints<a name="line.8237"></a>
+<span class="sourceLineNo">8238</span>      WriteState.HEAP_SIZE + // writestate<a name="line.8238"></a>
+<span class="sourceLineNo">8239</span>      ClassSize.CONCURRENT_SKIPLISTMAP + ClassSize.CONCURRENT_SKIPLISTMAP_ENTRY + // stores<a name="line.8239"></a>
+<span class="sourceLineNo">8240</span>      (2 * ClassSize.REENTRANT_LOCK) + // lock, updatesLock<a name="line.8240"></a>
+<span class="sourceLineNo">8241</span>      MultiVersionConcurrencyControl.FIXED_SIZE // mvcc<a name="line.8241"></a>
+<span class="sourceLineNo">8242</span>      + 2 * ClassSize.TREEMAP // maxSeqIdInStores, replicationScopes<a name="line.8242"></a>
+<span class="sourceLineNo">8243</span>      + 2 * ClassSize.ATOMIC_INTEGER // majorInProgress, minorInProgress<a name="line.8243"></a>
+<span class="sourceLineNo">8244</span>      + ClassSize.STORE_SERVICES // store services<a name="line.8244"></a>
+<span class="sourceLineNo">8245</span>      + StoreHotnessProtector.FIXED_SIZE<a name="line.8245"></a>
+<span class="sourceLineNo">8246</span>      ;<a name="line.8246"></a>
+<span class="sourceLineNo">8247</span><a name="line.8247"></a>
+<span class="sourceLineNo">8248</span>  @Override<a name="line.8248"></a>
+<span class="sourceLineNo">8249</span>  public long heapSize() {<a name="line.8249"></a>
+<span class="sourceLineNo">8250</span>    // this does not take into account row locks, recent flushes, mvcc entries, and more<a name="line.8250"></a>
+<span class="sourceLineNo">8251</span>    return DEEP_OVERHEAD + stores.values().stream().mapToLong(HStore::heapSize).sum();<a name="line.8251"></a>
+<span class="sourceLineNo">8252</span>  }<a name="line.8252"></a>
+<span class="sourceLineNo">8253</span><a name="line.8253"></a>
+<span class="sourceLineNo">8254</span>  /**<a name="line.8254"></a>
+<span class="sourceLineNo">8255</span>   * Registers a new protocol buffer {@link Service} subclass as a coprocessor endpoint to<a name="line.8255"></a>
+<span class="sourceLineNo">8256</span>   * be available for handling Region#execService(com.google.protobuf.RpcController,<a name="line.8256"></a>
+<span class="sourceLineNo">8257</span>   *    org.apache.hadoop.hbase.protobuf.generated.ClientProtos.CoprocessorServiceCall) calls.<a name="line.8257"></a>
+<span class="sourceLineNo">8258</span>   *<a name="line.8258"></a>
+<span class="sourceLineNo">8259</span>   * &lt;p&gt;<a name="line.8259"></a>
+<span class="sourceLineNo">8260</span>   * Only a single instance may be registered per region for a given {@link Service} subclass (the<a name="line.8260"></a>
+<span class="sourceLineNo">8261</span>   * instances are keyed on {@link com.google.protobuf.Descriptors.ServiceDescriptor#getFullName()}.<a name="line.8261"></a>
+<span class="sourceLineNo">8262</span>   * After the first registration, subsequent calls with the same service name will fail with<a name="line.8262"></a>
+<span class="sourceLineNo">8263</span>   * a return value of {@code false}.<a name="line.8263"></a>
+<span class="sourceLineNo">8264</span>   * &lt;/p&gt;<a name="line.8264"></a>
+<span class="sourceLineNo">8265</span>   * @param instance the {@code Service} subclass instance to expose as a coprocessor endpoint<a name="line.8265"></a>
+<span class="sourceLineNo">8266</span>   * @return {@code true} if the registration was successful, {@code false}<a name="line.8266"></a>
+<span class="sourceLineNo">8267</span>   * otherwise<a name="line.8267"></a>
+<span class="sourceLineNo">8268</span>   */<a name="line.8268"></a>
+<span class="sourceLineNo">8269</span>  public boolean registerService(com.google.protobuf.Service instance) {<a name="line.8269"></a>
+<span class="sourceLineNo">8270</span>    /*<a name="line.8270"></a>
+<span class="sourceLineNo">8271</span>     * No stacking of instances is allowed for a single service name<a name="line.8271"></a>
+<span class="sourceLineNo">8272</span>     */<a name="line.8272"></a>
+<span class="sourceLineNo">8273</span>    com.google.protobuf.Descriptors.ServiceDescriptor serviceDesc = instance.getDescriptorForType();<a name="line.8273"></a>
+<span class="sourceLineNo">8274</span>    String serviceName = CoprocessorRpcUtils.getServiceName(serviceDesc);<a name="line.8274"></a>
+<span class="sourceLineNo">8275</span>    if (coprocessorServiceHandlers.containsKey(serviceName)) {<a name="line.8275"></a>
+<span class="sourceLineNo">8276</span>      LOG.error("Coprocessor service " + serviceName +<a name="line.8276"></a>
+<span class="sourceLineNo">8277</span>          " already registered, rejecting request from " + instance);<a name="line.8277"></a>
+<span class="sourceLineNo">8278</span>      return false;<a name="line.8278"></a>
+<span class="sourceLineNo">8279</span>    }<a name="line.8279"></a>
+<span class="sourceLineNo">8280</span><a name="line.8280"></a>
+<span class="sourceLineNo">8281</span>    coprocessorServiceHandlers.put(serviceName, instance);<a name="line.8281"></a>
+<span class="sourceLineNo">8282</span>    if (LOG.isDebugEnabled()) {<a name="line.8282"></a>
+<span class="sourceLineNo">8283</span>      LOG.debug("Registered coprocessor service: region=" +<a name="line.8283"></a>
+<span class="sourceLineNo">8284</span>          Bytes.toStringBinary(getRegionInfo().getRegionName()) +<a name="line.8284"></a>
+<span class="sourceLineNo">8285</span>          " service=" + serviceName);<a name="line.8285"></a>
+<span class="sourceLineNo">8286</span>    }<a name="line.8286"></a>
+<span class="sourceLineNo">8287</span>    return true;<a name="line.8287"></a>
+<span class="sourceLineNo">8288</span>  }<a name="line.8288"></a>
+<span class="sourceLineNo">8289</span><a name="line.8289"></a>
+<span class="sourceLineNo">8290</span>  /**<a name="line.8290"></a>
+<span class="sourceLineNo">8291</span>   * Executes a single protocol buffer coprocessor endpoint {@link Service} method using<a name="line.8291"></a>
+<span class="sourceLineNo">8292</span>   * the registered protocol handlers.  {@link Service} implementations must be registered via the<a name="line.8292"></a>
+<span class="sourceLineNo">8293</span>   * {@link #registerService(com.google.protobuf.Service)}<a name="line.8293"></a>
+<span class="sourceLineNo">8294</span>   * method before they are available.<a name="line.8294"></a>
+<span class="sourceLineNo">8295</span>   *<a name="line.8295"></a>
+<span class="sourceLineNo">8296</span>   * @param controller an {@code RpcContoller} implementation to pass to the invoked service<a name="line.8296"></a>
+<span class="sourceLineNo">8297</span>   * @param call a {@code CoprocessorServiceCall} instance identifying the service, method,<a name="line.8297"></a>
+<span class="sourceLineNo">8298</span>   *     and parameters for the method invocation<a name="line.8298"></a>
+<span class="sourceLineNo">8299</span>   * @return a protocol buffer {@code Message} instance containing the method's result<a name="line.8299"></a>
+<span class="sourceLineNo">8300</span>   * @throws IOException if no registered service handler is found or an error<a name="line.8300"></a>
+<span class="sourceLineNo">8301</span>   *     occurs during the invocation<a name="line.8301"></a>
+<span class="sourceLineNo">8302</span>   * @see #registerService(com.google.protobuf.Service)<a name="line.8302"></a>
+<span class="sourceLineNo">8303</span>   */<a name="line.8303"></a>
+<span class="sourceLineNo">8304</span>  public com.google.protobuf.Message execService(com.google.protobuf.RpcController controller,<a name="line.8304"></a>
+<span class="sourceLineNo">8305</span>      CoprocessorServiceCall call) throws IOException {<a name="line.8305"></a>
+<span class="sourceLineNo">8306</span>    String serviceName = call.getServiceName();<a name="line.8306"></a>
+<span class="sourceLineNo">8307</span>    com.google.protobuf.Service service = coprocessorServiceHandlers.get(serviceName);<a name="line.8307"></a>
+<span class="sourceLineNo">8308</span>    if (service == null) {<a name="line.8308"></a>
+<span class="sourceLineNo">8309</span>      throw new UnknownProtocolException(null, "No registered coprocessor service found for " +<a name="line.8309"></a>
+<span class="sourceLineNo">8310</span>          serviceName + " in region " + Bytes.toStringBinary(getRegionInfo().getRegionName()));<a name="line.8310"></a>
+<span class="sourceLineNo">8311</span>    }<a name="line.8311"></a>
+<span class="sourceLineNo">8312</span>    com.google.protobuf.Descriptors.ServiceDescriptor serviceDesc = service.getDescriptorForType();<a name="line.8312"></a>
 <span class="sourceLineNo">8313</span><a name="line.8313"></a>
-<span class="sourceLineNo">8314</span>    com.google.protobuf.Message.Builder builder =<a name="line.8314"></a>
-<span class="sourceLineNo">8315</span>        service.getRequestPrototype(methodDesc).newBuilderForType();<a name="line.8315"></a>
-<span class="sourceLineNo">8316</span><a name="line.8316"></a>
-<span class="sourceLineNo">8317</span>    org.apache.hadoop.hbase.protobuf.ProtobufUtil.mergeFrom(builder,<a name="line.8317"></a>
-<span class="sourceLineNo">8318</span>        call.getRequest().toByteArray());<a name="line.8318"></a>
-<span class="sourceLineNo">8319</span>    com.google.protobuf.Message request =<a name="line.8319"></a>
-<span class="sourceLineNo">8320</span>        CoprocessorRpcUtils.getRequest(service, methodDesc, call.getRequest());<a name="line.8320"></a>
+<span class="sourceLineNo">8314</span>    cpRequestsCount.increment();<a name="line.8314"></a>
+<span class="sourceLineNo">8315</span>    String methodName = call.getMethodName();<a name="line.8315"></a>
+<span class="sourceLineNo">8316</span>    com.google.protobuf.Descriptors.MethodDescriptor methodDesc =<a name="line.8316"></a>
+<span class="sourceLineNo">8317</span>        CoprocessorRpcUtils.getMethodDescriptor(methodName, serviceDesc);<a name="line.8317"></a>
+<span class="sourceLineNo">8318</span><a name="line.8318"></a>
+<span class="sourceLineNo">8319</span>    com.google.protobuf.Message.Builder builder =<a name="line.8319"></a>
+<span class="sourceLineNo">8320</span>        service.getRequestPrototype(methodDesc).newBuilderForType();<a name="line.8320"></a>
 <span class="sourceLineNo">8321</span><a name="line.8321"></a>
-<span class="sourceLineNo">8322</span>    if (coprocessorHost != null) {<a name="line.8322"></a>
-<span class="sourceLineNo">8323</span>      request = coprocessorHost.preEndpointInvocation(service, methodName, request);<a name="line.8323"></a>
-<span class="sourceLineNo">8324</span>    }<a name="line.8324"></a>
-<span class="sourceLineNo">8325</span><a name="line.8325"></a>
-<span class="sourceLineNo">8326</span>    final com.google.protobuf.Message.Builder responseBuilder =<a name="line.8326"></a>
-<span class="sourceLineNo">8327</span>        service.getResponsePrototype(methodDesc).newBuilderForType();<a name="line.8327"></a>
-<span class="sourceLineNo">8328</span>    service.callMethod(methodDesc, controller, request,<a name="line.8328"></a>
-<span class="sourceLineNo">8329</span>        new com.google.protobuf.RpcCallback&lt;com.google.protobuf.Message&gt;() {<a name="line.8329"></a>
-<span class="sourceLineNo">8330</span>      @Override<a name="line.8330"></a>
-<span class="sourceLineNo">8331</span>      public void run(com.google.protobuf.Message message) {<a name="line.8331"></a>
-<span class="sourceLineNo">8332</span>        if (message != null) {<a name="line.8332"></a>
-<span class="sourceLineNo">8333</span>          responseBuilder.mergeFrom(message);<a name="line.8333"></a>
-<span class="sourceLineNo">8334</span>        }<a name="line.8334"></a>
-<span class="sourceLineNo">8335</span>      }<a name="line.8335"></a>
-<span class="sourceLineNo">8336</span>    });<a name="line.8336"></a>
-<span class="sourceLineNo">8337</span><a name="line.8337"></a>
-<span class="sourceLineNo">8338</span>    if (coprocessorHost != null) {<a name="line.8338"></a>
-<span class="sourceLineNo">8339</span>      coprocessorHost.postEndpointInvocation(service, methodName, request, responseBuilder);<a name="line.8339"></a>
-<span class="sourceLineNo">8340</span>    }<a name="line.8340"></a>
-<span class="sourceLineNo">8341</span>    IOException exception =<a name="line.8341"></a>
-<span class="sourceLineNo">8342</span>        org.apache.hadoop.hbase.ipc.CoprocessorRpcUtils.getControllerException(controller);<a name="line.8342"></a>
-<span class="sourceLineNo">8343</span>    if (exception != null) {<a name="line.8343"></a>
-<span class="sourceLineNo">8344</span>      throw exception;<a name="line.8344"></a>
+<span class="sourceLineNo">8322</span>    org.apache.hadoop.hbase.protobuf.ProtobufUtil.mergeFrom(builder,<a name="line.8322"></a>
+<span class="sourceLineNo">8323</span>        call.getRequest().toByteArray());<a name="line.8323"></a>
+<span class="sourceLineNo">8324</span>    com.google.protobuf.Message request =<a name="line.8324"></a>
+<span class="sourceLineNo">8325</span>        CoprocessorRpcUtils.getRequest(service, methodDesc, call.getRequest());<a name="line.8325"></a>
+<span class="sourceLineNo">8326</span><a name="line.8326"></a>
+<span class="sourceLineNo">8327</span>    if (coprocessorHost != null) {<a name="line.8327"></a>
+<span class="sourceLineNo">8328</span>      request = coprocessorHost.preEndpointInvocation(service, methodName, request);<a name="line.8328"></a>
+<span class="sourceLineNo">8329</span>    }<a name="line.8329"></a>
+<span class="sourceLineNo">8330</span><a name="line.8330"></a>
+<span class="sourceLineNo">8331</span>    final com.google.protobuf.Message.Builder responseBuilder =<a name="line.8331"></a>
+<span class="sourceLineNo">8332</span>        service.getResponsePrototype(methodDesc).newBuilderForType();<a name="line.8332"></a>
+<span class="sourceLineNo">8333</span>    service.callMethod(methodDesc, controller, request,<a name="line.8333"></a>
+<span class="sourceLineNo">8334</span>        new com.google.protobuf.RpcCallback&lt;com.google.protobuf.Message&gt;() {<a name="line.8334"></a>
+<span class="sourceLineNo">8335</span>      @Override<a name="line.8335"></a>
+<span class="sourceLineNo">8336</span>      public void run(com.google.protobuf.Message message) {<a name="line.8336"></a>
+<span class="sourceLineNo">8337</span>        if (message != null) {<a name="line.8337"></a>
+<span class="sourceLineNo">8338</span>          responseBuilder.mergeFrom(message);<a name="line.8338"></a>
+<span class="sourceLineNo">8339</span>        }<a name="line.8339"></a>
+<span class="sourceLineNo">8340</span>      }<a name="line.8340"></a>
+<span class="sourceLineNo">8341</span>    });<a name="line.8341"></a>
+<span class="sourceLineNo">8342</span><a name="line.8342"></a>
+<span class="sourceLineNo">8343</span>    if (coprocessorHost != null) {<a name="line.8343"></a>
+<span class="sourceLineNo">8344</span>      coprocessorHost.postEndpointInvocation(service, methodName, request, responseBuilder);<a name="line.8344"></a>
 <span class="sourceLineNo">8345</span>    }<a name="line.8345"></a>
-<span class="sourceLineNo">8346</span><a name="line.8346"></a>
-<span class="sourceLineNo">8347</span>    return responseBuilder.build();<a name="line.8347"></a>
-<span class="sourceLineNo">8348</span>  }<a name="line.8348"></a>
-<span class="sourceLineNo">8349</span><a name="line.8349"></a>
-<span class="sourceLineNo">8350</span>  boolean shouldForceSplit() {<a name="line.8350"></a>
-<span class="sourceLineNo">8351</span>    return this.splitRequest;<a name="line.8351"></a>
-<span class="sourceLineNo">8352</span>  }<a name="line.8352"></a>
-<span class="sourceLineNo">8353</span><a name="line.8353"></a>
-<span class="sourceLineNo">8354</span>  byte[] getExplicitSplitPoint() {<a name="line.8354"></a>
-<span class="sourceLineNo">8355</span>    return this.explicitSplitPoint;<a name="line.8355"></a>
-<span class="sourceLineNo">8356</span>  }<a name="line.8356"></a>
-<span class="sourceLineNo">8357</span><a name="line.8357"></a>
-<span class="sourceLineNo">8358</span>  void forceSplit(byte[] sp) {<a name="line.8358"></a>
-<span class="sourceLineNo">8359</span>    // This HRegion will go away after the forced split is successful<a name="line.8359"></a>
-<span class="sourceLineNo">8360</span>    // But if a forced split fails, we need to clear forced split.<a name="line.8360"></a>
-<span class="sourceLineNo">8361</span>    this.splitRequest = true;<a name="line.8361"></a>
-<span class="sourceLineNo">8362</span>    if (sp != null) {<a name="line.8362"></a>
-<span class="sourceLineNo">8363</span>      this.explicitSplitPoint = sp;<a name="line.8363"></a>
-<span class="sourceLineNo">8364</span>    }<a name="line.8364"></a>
-<span class="sourceLineNo">8365</span>  }<a name="line.8365"></a>
-<span class="sourceLineNo">8366</span><a name="line.8366"></a>
-<span class="sourceLineNo">8367</span>  void clearSplit() {<a name="line.8367"></a>
-<span class="sourceLineNo">8368</span>    this.splitRequest = false;<a name="line.8368"></a>
-<span class="sourceLineNo">8369</span>    this.explicitSplitPoint = null;<a name="line.8369"></a>
+<span class="sourceLineNo">8346</span>    IOException exception =<a name="line.8346"></a>
+<span class="sourceLineNo">8347</span>        org.apache.hadoop.hbase.ipc.CoprocessorRpcUtils.getControllerException(controller);<a name="line.8347"></a>
+<span class="sourceLineNo">8348</span>    if (exception != null) {<a name="line.8348"></a>
+<span class="sourceLineNo">8349</span>      throw exception;<a name="line.8349"></a>
+<span class="sourceLineNo">8350</span>    }<a name="line.8350"></a>
+<span class="sourceLineNo">8351</span><a name="line.8351"></a>
+<span class="sourceLineNo">8352</span>    return responseBuilder.build();<a name="line.8352"></a>
+<span class="sourceLineNo">8353</span>  }<a name="line.8353"></a>
+<span class="sourceLineNo">8354</span><a name="line.8354"></a>
+<span class="sourceLineNo">8355</span>  boolean shouldForceSplit() {<a name="line.8355"></a>
+<span class="sourceLineNo">8356</span>    return this.splitRequest;<a name="line.8356"></a>
+<span class="sourceLineNo">8357</span>  }<a name="line.8357"></a>
+<span class="sourceLineNo">8358</span><a name="line.8358"></a>
+<span class="sourceLineNo">8359</span>  byte[] getExplicitSplitPoint() {<a name="line.8359"></a>
+<span class="sourceLineNo">8360</span>    return this.explicitSplitPoint;<a name="line.8360"></a>
+<span class="sourceLineNo">8361</span>  }<a name="line.8361"></a>
+<span class="sourceLineNo">8362</span><a name="line.8362"></a>
+<span class="sourceLineNo">8363</span>  void forceSplit(byte[] sp) {<a name="line.8363"></a>
+<span class="sourceLineNo">8364</span>    // This HRegion will go away after the forced split is successful<a name="line.8364"></a>
+<span class="sourceLineNo">8365</span>    // But if a forced split fails, we need to clear forced split.<a name="line.8365"></a>
+<span class="sourceLineNo">8366</span>    this.splitRequest = true;<a name="line.8366"></a>
+<span class="sourceLineNo">8367</span>    if (sp != null) {<a name="line.8367"></a>
+<span class="sourceLineNo">8368</span>      this.explicitSplitPoint = sp;<a name="line.8368"></a>
+<span class="sourceLineNo">8369</span>    }<a name="line.8369"></a>
 <span class="sourceLineNo">8370</span>  }<a name="line.8370"></a>
 <span class="sourceLineNo">8371</span><a name="line.8371"></a>
-<span class="sourceLineNo">8372</span>  /**<a name="line.8372"></a>
-<span class="sourceLineNo">8373</span>   * Return the splitpoint. null indicates the region isn't splittable<a name="line.8373"></a>
-<span class="sourceLineNo">8374</span>   * If the splitpoint isn't explicitly specified, it will go over the stores<a name="line.8374"></a>
-<span class="sourceLineNo">8375</span>   * to find the best splitpoint. Currently the criteria of best splitpoint<a name="line.8375"></a>
-<span class="sourceLineNo">8376</span>   * is based on the size of the store.<a name="line.8376"></a>
-<span class="sourceLineNo">8377</span>   */<a name="line.8377"></a>
-<span class="sourceLineNo">8378</span>  public byte[] checkSplit() {<a name="line.8378"></a>
-<span class="sourceLineNo">8379</span>    // Can't split META<a name="line.8379"></a>
-<span class="sourceLineNo">8380</span>    if (this.getRegionInfo().isMetaRegion()) {<a name="line.8380"></a>
-<span class="sourceLineNo">8381</span>      if (shouldForceSplit()) {<a name="line.8381"></a>
-<span class="sourceLineNo">8382</span>        LOG.warn("Cannot split meta region in HBase 0.20 and above");<a name="line.8382"></a>
-<span class="sourceLineNo">8383</span>      }<a name="line.8383"></a>
-<span class="sourceLineNo">8384</span>      return null;<a name="line.8384"></a>
-<span class="sourceLineNo">8385</span>    }<a name="line.8385"></a>
-<span class="sourceLineNo">8386</span><a name="line.8386"></a>
-<span class="sourceLineNo">8387</span>    // Can't split a region that is closing.<a name="line.8387"></a>
-<span class="sourceLineNo">8388</span>    if (this.isClosing()) {<a name="line.8388"></a>
+<span class="sourceLineNo">8372</span>  void clearSplit() {<a name="line.8372"></a>
+<span class="sourceLineNo">8373</span>    this.splitRequest = false;<a name="line.8373"></a>
+<span class="sourceLineNo">8374</span>    this.explicitSplitPoint = null;<a name="line.8374"></a>
+<span class="sourceLineNo">8375</span>  }<a name="line.8375"></a>
+<span class="sourceLineNo">8376</span><a name="line.8376"></a>
+<span class="sourceLineNo">8377</span>  /**<a name="line.8377"></a>
+<span class="sourceLineNo">8378</span>   * Return the splitpoint. null indicates the region isn't splittable<a name="line.8378"></a>
+<span class="sourceLineNo">8379</span>   * If the splitpoint isn't explicitly specified, it will go over the stores<a name="line.8379"></a>
+<span class="sourceLineNo">8380</span>   * to find the best splitpoint. Currently the criteria of best splitpoint<a name="line.8380"></a>
+<span class="sourceLineNo">8381</span>   * is based on the size of the store.<a name="line.8381"></a>
+<span class="sourceLineNo">8382</span>   */<a name="line.8382"></a>
+<span class="sourceLineNo">8383</span>  public byte[] checkSplit() {<a name="line.8383"></a>
+<span class="sourceLineNo">8384</span>    // Can't split META<a name="line.8384"></a>
+<span class="sourceLineNo">8385</span>    if (this.getRegionInfo().isMetaRegion()) {<a name="line.8385"></a>
+<span class="sourceLineNo">8386</span>      if (shouldForceSplit()) {<a name="line.8386"></a>
+<span class="sourceLineNo">8387</span>        LOG.warn("Cannot split meta region in HBase 0.20 and above");<a name="line.8387"></a>
+<span class="sourceLineNo">8388</span>      }<a name="line.8388"></a>
 <span class="sourceLineNo">8389</span>      return null;<a name="line.8389"></a>
 <span class="sourceLineNo">8390</span>    }<a name="line.8390"></a>
 <span class="sourceLineNo">8391</span><a name="line.8391"></a>
-<span class="sourceLineNo">8392</span>    if (!splitPolicy.shouldSplit()) {<a name="line.8392"></a>
-<span class="sourceLineNo">8393</span>      return null;<a name="line.8393"></a>
-<span class="sourceLineNo">8394</span>    }<a name="line.8394"></a>
-<span class="sourceLineNo">8395</span><a name="line.8395"></a>
-<span class="sourceLineNo">8396</span>    byte[] ret = splitPolicy.getSplitPoint();<a name="line.8396"></a>
-<span class="sourceLineNo">8397</span><a name="line.8397"></a>
-<span class="sourceLineNo">8398</span>    if (ret != null) {<a name="line.8398"></a>
-<span class="sourceLineNo">8399</span>      try {<a name="line.8399"></a>
-<span class="sourceLineNo">8400</span>        checkRow(ret, "calculated split");<a name="line.8400"></a>
-<span class="sourceLineNo">8401</span>      } catch (IOException e) {<a name="line.8401"></a>
-<span class="sourceLineNo">8402</span>        LOG.error("Ignoring invalid split", e);<a name="line.8402"></a>
-<span class="sourceLineNo">8403</span>        return null;<a name="line.8403"></a>
-<span class="sourceLineNo">8404</span>      }<a name="line.8404"></a>
-<span class="sourceLineNo">8405</span>    }<a name="line.8405"></a>
-<span class="sourceLineNo">8406</span>    return ret;<a name="line.8406"></a>
-<span class="sourceLineNo">8407</span>  }<a name="line.8407"></a>
-<span class="sourceLineNo">8408</span><a name="line.8408"></a>
-<span class="sourceLineNo">8409</span>  /**<a name="line.8409"></a>
-<span class="sourceLineNo">8410</span>   * @return The priority that this region should have in the compaction queue<a name="line.8410"></a>
-<span class="sourceLineNo">8411</span>   */<a name="line.8411"></a>
-<span class="sourceLineNo">8412</span>  public int getCompactPriority() {<a name="line.8412"></a>
-<span class="sourceLineNo">8413</span>    return stores.values().stream().mapToInt(HStore::getCompactPriority).min()<a name="line.8413"></a>
-<span class="sourceLineNo">8414</span>        .orElse(Store.NO_PRIORITY);<a name="line.8414"></a>
-<span class="sourceLineNo">8415</span>  }<a name="line.8415"></a>
-<span class="sourceLineNo">8416</span><a name="line.8416"></a>
-<span class="sourceLineNo">8417</span>  /** @return the coprocessor host */<a name="line.8417"></a>
-<span class="sourceLineNo">8418</span>  public RegionCoprocessorHost getCoprocessorHost() {<a name="line.8418"></a>
-<span class="sourceLineNo">8419</span>    return coprocessorHost;<a name="line.8419"></a>
+<span class="sourceLineNo">8392</span>    // Can't split a region that is closing.<a name="line.8392"></a>
+<span class="sourceLineNo">8393</span>    if (this.isClosing()) {<a name="line.8393"></a>
+<span class="sourceLineNo">8394</span>      return null;<a name="line.8394"></a>
+<span class="sourceLineNo">8395</span>    }<a name="line.8395"></a>
+<span class="sourceLineNo">8396</span><a name="line.8396"></a>
+<span class="sourceLineNo">8397</span>    if (!splitPolicy.shouldSplit()) {<a name="line.8397"></a>
+<span class="sourceLineNo">8398</span>      return null;<a name="line.8398"></a>
+<span class="sourceLineNo">8399</span>    }<a name="line.8399"></a>
+<span class="sourceLineNo">8400</span><a name="line.8400"></a>
+<span class="sourceLineNo">8401</span>    byte[] ret = splitPolicy.getSplitPoint();<a name="line.8401"></a>
+<span class="sourceLineNo">8402</span><a name="line.8402"></a>
+<span class="sourceLineNo">8403</span>    if (ret != null) {<a name="line.8403"></a>
+<span class="sourceLineNo">8404</span>      try {<a name="line.8404"></a>
+<span class="sourceLineNo">8405</span>        checkRow(ret, "calculated split");<a name="line.8405"></a>
+<span class="sourceLineNo">8406</span>      } catch (IOException e) {<a name="line.8406"></a>
+<span class="sourceLineNo">8407</span>        LOG.error("Ignoring invalid split", e);<a name="line.8407"></a>
+<span class="sourceLineNo">8408</span>        return null;<a name="line.8408"></a>
+<span class="sourceLineNo">8409</span>      }<a name="line.8409"></a>
+<span class="sourceLineNo">8410</span>    }<a name="line.8410"></a>
+<span class="sourceLineNo">8411</span>    return ret;<a name="line.8411"></a>
+<span class="sourceLineNo">8412</span>  }<a name="line.8412"></a>
+<span class="sourceLineNo">8413</span><a name="line.8413"></a>
+<span class="sourceLineNo">8414</span>  /**<a name="line.8414"></a>
+<span class="sourceLineNo">8415</span>   * @return The priority that this region should have in the compaction queue<a name="line.8415"></a>
+<span class="sourceLineNo">8416</span>   */<a name="line.8416"></a>
+<span class="sourceLineNo">8417</span>  public int getCompactPriority() {<a name="line.8417"></a>
+<span class="sourceLineNo">8418</span>    return stores.values().stream().mapToInt(HStore::getCompactPriority).min()<a name="line.8418"></a>
+<span class="sourceLineNo">8419</span>        .orElse(Store.NO_PRIORITY);<a name="line.8419"></a>
 <span class="sourceLineNo">8420</span>  }<a name="line.8420"></a>
 <span class="sourceLineNo">8421</span><a name="line.8421"></a>
-<span class="sourceLineNo">8422</span>  /** @param coprocessorHost the new coprocessor host */<a name="line.8422"></a>
-<span class="sourceLineNo">8423</span>  @VisibleForTesting<a name="line.8423"></a>
-<span class="sourceLineNo">8424</span>  public void setCoprocessorHost(final RegionCoprocessorHost coprocessorHost) {<a name="line.8424"></a>
-<span class="sourceLineNo">8425</span>    this.coprocessorHost = coprocessorHost;<a name="line.8425"></a>
-<span class="sourceLineNo">8426</span>  }<a name="line.8426"></a>
-<span class="sourceLineNo">8427</span><a name="line.8427"></a>
-<span class="sourceLineNo">8428</span>  @Override<a name="line.8428"></a>
-<span class="sourceLineNo">8429</span>  public void startRegionOperation() throws IOException {<a name="line.8429"></a>
-<span class="sourceLineNo">8430</span>    startRegionOperation(Operation.ANY);<a name="line.8430"></a>
+<span class="sourceLineNo">8422</span>  /** @return the coprocessor host */<a name="line.8422"></a>
+<span class="sourceLineNo">8423</span>  public RegionCoprocessorHost getCoprocessorHost() {<a name="line.8423"></a>
+<span class="sourceLineNo">8424</span>    return coprocessorHost;<a name="line.8424"></a>
+<span class="sourceLineNo">8425</span>  }<a name="line.8425"></a>
+<span class="sourceLineNo">8426</span><a name="line.8426"></a>
+<span class="sourceLineNo">8427</span>  /** @param coprocessorHost the new coprocessor host */<a name="line.8427"></a>
+<span class="sourceLineNo">8428</span>  @VisibleForTesting<a name="line.8428"></a>
+<span class="sourceLineNo">8429</span>  public void setCoprocessorHost(final RegionCoprocessorHost coprocessorHost) {<a name="line.8429"></a>
+<span class="sourceLineNo">8430</span>    this.coprocessorHost = coprocessorHost;<a name="line.8430"></a>
 <span class="sourceLineNo">8431</span>  }<a name="line.8431"></a>
 <span class="sourceLineNo">8432</span><a name="line.8432"></a>
 <span class="sourceLineNo">8433</span>  @Override<a name="line.8433"></a>
-<span class="sourceLineNo">8434</span>  public void startRegionOperation(Operation op) throws IOException {<a name="line.8434"></a>
-<span class="sourceLineNo">8435</span>    switch (op) {<a name="line.8435"></a>
-<span class="sourceLineNo">8436</span>      case GET:  // read operations<a name="line.8436"></a>
-<span class="sourceLineNo">8437</span>      case SCAN:<a name="line.8437"></a>
-<span class="sourceLineNo">8438</span>        checkReadsEnabled();<a name="line.8438"></a>
-<span class="sourceLineNo">8439</span>        break;<a name="line.8439"></a>
-<span class="sourceLineNo">8440</span>      default:<a name="line.8440"></a>
-<span class="sourceLineNo">8441</span>        break;<a name="line.8441"></a>
-<span class="sourceLineNo">8442</span>    }<a name="line.8442"></a>
-<span class="sourceLineNo">8443</span>    if (op == Operation.MERGE_REGION || op == Operation.SPLIT_REGION<a name="line.8443"></a>
-<span class="sourceLineNo">8444</span>        || op == Operation.COMPACT_REGION || op == Operation.COMPACT_SWITCH) {<a name="line.8444"></a>
-<span class="sourceLineNo">8445</span>      // split, merge or compact region doesn't need to check the closing/closed state or lock the<a name="line.8445"></a>
-<span class="sourceLineNo">8446</span>      // region<a name="line.8446"></a>
-<span class="sourceLineNo">8447</span>      return;<a name="line.8447"></a>
-<span class="sourceLineNo">8448</span>    }<a name="line.8448"></a>
-<span class="sourceLineNo">8449</span>    if (this.closing.get()) {<a name="line.8449"></a>
-<span class="sourceLineNo">8450</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closing");<a name="line.8450"></a>
-<span class="sourceLineNo">8451</span>    }<a name="line.8451"></a>
-<span class="sourceLineNo">8452</span>    lock(lock.readLock());<a name="line.8452"></a>
-<span class="sourceLineNo">8453</span>    if (this.closed.get()) {<a name="line.8453"></a>
-<span class="sourceLineNo">8454</span>      lock.readLock().unlock();<a name="line.8454"></a>
-<span class="sourceLineNo">8455</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closed");<a name="line.8455"></a>
+<span class="sourceLineNo">8434</span>  public void startRegionOperation() throws IOException {<a name="line.8434"></a>
+<span class="sourceLineNo">8435</span>    startRegionOperation(Operation.ANY);<a name="line.8435"></a>
+<span class="sourceLineNo">8436</span>  }<a name="line.8436"></a>
+<span class="sourceLineNo">8437</span><a name="line.8437"></a>
+<span class="sourceLineNo">8438</span>  @Override<a name="line.8438"></a>
+<span class="sourceLineNo">8439</span>  public void startRegionOperation(Operation op) throws IOException {<a name="line.8439"></a>
+<span class="sourceLineNo">8440</span>    switch (op) {<a name="line.8440"></a>
+<span class="sourceLineNo">8441</span>      case GET:  // read operations<a name="line.8441"></a>
+<span class="sourceLineNo">8442</span>      case SCAN:<a name="line.8442"></a>
+<span class="sourceLineNo">8443</span>        checkReadsEnabled();<a name="line.8443"></a>
+<span class="sourceLineNo">8444</span>        break;<a name="line.8444"></a>
+<span class="sourceLineNo">8445</span>      default:<a name="line.8445"></a>
+<span class="sourceLineNo">8446</span>        break;<a name="line.8446"></a>
+<span class="sourceLineNo">8447</span>    }<a name="line.8447"></a>
+<span class="sourceLineNo">8448</span>    if (op == Operation.MERGE_REGION || op == Operation.SPLIT_REGION<a name="line.8448"></a>
+<span class="sourceLineNo">8449</span>        || op == Operation.COMPACT_REGION || op == Operation.COMPACT_SWITCH) {<a name="line.8449"></a>
+<span class="sourceLineNo">8450</span>      // split, merge or compact region doesn't need to check the closing/closed state or lock the<a name="line.8450"></a>
+<span class="sourceLineNo">8451</span>      // region<a name="line.8451"></a>
+<span class="sourceLineNo">8452</span>      return;<a name="line.8452"></a>
+<span class="sourceLineNo">8453</span>    }<a name="line.8453"></a>
+<span class="sourceLineNo">8454</span>    if (this.closing.get()) {<a name="line.8454"></a>
+<span class="sourceLineNo">8455</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closing");<a name="line.8455"></a>
 <span class="sourceLineNo">8456</span>    }<a name="line.8456"></a>
-<span class="sourceLineNo">8457</span>    // The unit for snapshot is a region. So, all stores for this region must be<a name="line.8457"></a>
-<span class="sourceLineNo">8458</span>    // prepared for snapshot operation before proceeding.<a name="line.8458"></a>
-<span class="sourceLineNo">8459</span>    if (op == Operation.SNAPSHOT) {<a name="line.8459"></a>
-<span class="sourceLineNo">8460</span>      stores.values().forEach(HStore::preSnapshotOperation);<a name="line.8460"></a>
+<span class="sourceLineNo">8457</span>    lock(lock.readLock());<a name="line.8457"></a>
+<span class="sourceLineNo">8458</span>    if (this.closed.get()) {<a name="line.8458"></a>
+<span class="sourceLineNo">8459</span>      lock.readLock().unlock();<a name="line.8459"></a>
+<span class="sourceLineNo">8460</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closed");<a name="line.8460"></a>
 <span class="sourceLineNo">8461</span>    }<a name="line.8461"></a>
-<span class="sourceLineNo">8462</span>    try {<a name="line.8462"></a>
-<span class="sourceLineNo">8463</span>      if (coprocessorHost != null) {<a name="line.8463"></a>
-<span class="sourceLineNo">8464</span>        coprocessorHost.postStartRegionOperation(op);<a name="line.8464"></a>
-<span class="sourceLineNo">8465</span>      }<a name="line.8465"></a>
-<span class="sourceLineNo">8466</span>    } catch (Exception e) {<a name="line.8466"></a>
-<span class="sourceLineNo">8467</span>      lock.readLock().unlock();<a name="line.8467"></a>
-<span class="sourceLineNo">8468</span>      throw new IOException(e);<a name="line.8468"></a>
-<span class="sourceLineNo">8469</span>    }<a name="line.8469"></a>
-<span class="sourceLineNo">8470</span>  }<a name="line.8470"></a>
-<span class="sourceLineNo">8471</span><a name="line.8471"></a>
-<span class="sourceLineNo">8472</span>  @Override<a name="line.8472"></a>
-<span class="sourceLineNo">8473</span>  public void closeRegionOperation() throws IOException {<a name="line.8473"></a>
-<span class="sourceLineNo">8474</span>    closeRegionOperation(Operation.ANY);<a name="line.8474"></a>
+<span class="sourceLineNo">8462</span>    // The unit for snapshot is a region. So, all stores for this region must be<a name="line.8462"></a>
+<span class="sourceLineNo">8463</span>    // prepared for snapshot operation before proceeding.<a name="line.8463"></a>
+<span class="sourceLineNo">8464</span>    if (op == Operation.SNAPSHOT) {<a name="line.8464"></a>
+<span class="sourceLineNo">8465</span>      stores.values().forEach(HStore::preSnapshotOperation);<a name="line.8465"></a>
+<span class="sourceLineNo">8466</span>    }<a name="line.8466"></a>
+<span class="sourceLineNo">8467</span>    try {<a name="line.8467"></a>
+<span class="sourceLineNo">8468</span>      if (coprocessorHost != null) {<a name="line.8468"></a>
+<span class="sourceLineNo">8469</span>        coprocessorHost.postStartRegionOperation(op);<a name="line.8469"></a>
+<span class="sourceLineNo">8470</span>      }<a name="line.8470"></a>
+<span class="sourceLineNo">8471</span>    } catch (Exception e) {<a name="line.8471"></a>
+<span class="sourceLineNo">8472</span>      lock.readLock().unlock();<a name="line.8472"></a>
+<span class="sourceLineNo">8473</span>      throw new IOException(e);<a name="line.8473"></a>
+<span class="sourceLineNo">8474</span>    }<a name="line.8474"></a>
 <span class="sourceLineNo">8475</span>  }<a name="line.8475"></a>
 <span class="sourceLineNo">8476</span><a name="line.8476"></a>
 <span class="sourceLineNo">8477</span>  @Override<a name="line.8477"></a>
-<span class="sourceLineNo">8478</span>  public void closeRegionOperation(Operation operation) throws IOException {<a name="line.8478"></a>
-<span class="sourceLineNo">8479</span>    if (operation == Operation.SNAPSHOT) {<a name="line.8479"></a>
-<span class="sourceLineNo">8480</span>      stores.values().forEach(HStore::postSnapshotOperation);<a name="line.8480"></a>
-<span class="sourceLineNo">8481</span>    }<a name="line.8481"></a>
-<span class="sourceLineNo">8482</span>    lock.readLock().unlock();<a name="line.8482"></a>
-<span class="sourceLineNo">8483</span>    if (coprocessorHost != null) {<a name="line.8483"></a>
-<span class="sourceLineNo">8484</span>      coprocessorHost.postCloseRegionOperation(operation);<a name="line.8484"></a>
-<span class="sourceLineNo">8485</span>    }<a name="line.8485"></a>
-<span class="sourceLineNo">8486</span>  }<a name="line.8486"></a>
-<span class="sourceLineNo">8487</span><a name="line.8487"></a>
-<span class="sourceLineNo">8488</span>  /**<a name="line.8488"></a>
-<span class="sourceLineNo">8489</span>   * This method needs to be called before any public call that reads or<a name="line.8489"></a>
-<span class="sourceLineNo">8490</span>   * modifies stores in bulk. It has to be called just before a try.<a name="line.8490"></a>
-<span class="sourceLineNo">8491</span>   * #closeBulkRegionOperation needs to be called in the try's finally block<a name="line.8491"></a>
-<span class="sourceLineNo">8492</span>   * Acquires a writelock and checks if the region is closing or closed.<a name="line.8492"></a>
-<span class="sourceLineNo">8493</span>   * @throws NotServingRegionException when the region is closing or closed<a name="line.8493"></a>
-<span class="sourceLineNo">8494</span>   * @throws RegionTooBusyException if failed to get the lock in time<a name="line.8494"></a>
-<span class="sourceLineNo">8495</span>   * @throws InterruptedIOException if interrupted while waiting for a lock<a name="line.8495"></a>
-<span class="sourceLineNo">8496</span>   */<a name="line.8496"></a>
-<span class="sourceLineNo">8497</span>  private void startBulkRegionOperation(boolean writeLockNeeded)<a name="line.8497"></a>
-<span class="sourceLineNo">8498</span>      throws NotServingRegionException, RegionTooBusyException, InterruptedIOException {<a name="line.8498"></a>
-<span class="sourceLineNo">8499</span>    if (this.closing.get()) {<a name="line.8499"></a>
-<span class="sourceLineNo">8500</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closing");<a name="line.8500"></a>
-<span class="sourceLineNo">8501</span>    }<a name="line.8501"></a>
-<span class="sourceLineNo">8502</span>    if (writeLockNeeded) lock(lock.writeLock());<a name="line.8502"></a>
-<span class="sourceLineNo">8503</span>    else lock(lock.readLock());<a name="line.8503"></a>
-<span class="sourceLineNo">8504</span>    if (this.closed.get()) {<a name="line.8504"></a>
-<span class="sourceLineNo">8505</span>      if (writeLockNeeded) lock.writeLock().unlock();<a name="line.8505"></a>
-<span class="sourceLineNo">8506</span>      else lock.readLock().unlock();<a name="line.8506"></a>
-<span class="sourceLineNo">8507</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closed");<a name="line.8507"></a>
-<span class="sourceLineNo">8508</span>    }<a name="line.8508"></a>
-<span class="sourceLineNo">8509</span>  }<a name="line.8509"></a>
-<span class="sourceLineNo">8510</span><a name="line.8510"></a>
-<span class="sourceLineNo">8511</span>  /**<a name="line.8511"></a>
-<span class="sourceLineNo">8512</span>   * Closes the lock. This needs to be called in the finally block corresponding<a name="line.8512"></a>
-<span class="sourceLineNo">8513</span>   * to the try block of #startRegionOperation<a name="line.8513"></a>
-<span class="sourceLineNo">8514</span>   */<a name="line.8514"></a>
-<span class="sourceLineNo">8515</span>  private void closeBulkRegionOperation(){<a name="line.8515"></a>
-<span class="sourceLineNo">8516</span>    if (lock.writeLock().isHeldByCurrentThread()) lock.writeLock().unlock();<a name="line.8516"></a>
-<span class="sourceLineNo">8517</span>    else lock.readLock().unlock();<a name="line.8517"></a>
-<span class="sourceLineNo">8518</span>  }<a name="line.8518"></a>
-<span class="sourceLineNo">8519</span><a name="line.8519"></a>
-<span class="sourceLineNo">8520</span>  /**<a name="line.8520"></a>
-<span class="sourceLineNo">8521</span>   * Update LongAdders for number of puts without wal and the size of possible data loss.<a name="line.8521"></a>
-<span class="sourceLineNo">8522</span>   * These information are exposed by the region server metrics.<a name="line.8522"></a>
-<span class="sourceLineNo">8523</span>   */<a name="line.8523"></a>
-<span class="sourceLineNo">8524</span>  private void recordMutationWithoutWal(final Map&lt;byte [], List&lt;Cell&gt;&gt; familyMap) {<a name="line.8524"></a>
-<span class="sourceLineNo">8525</span>    numMutationsWithoutWAL.increment();<a name="line.8525"></a>
-<span class="sourceLineNo">8526</span>    if (numMutationsWithoutWAL.sum() &lt;= 1) {<a name="line.8526"></a>
-<span class="sourceLineNo">8527</span>      LOG.info("writing data to region " + this +<a name="line.8527"></a>
-<span class="sourceLineNo">8528</span>               " with WAL disabled. Data may be lost in the event of a crash.");<a name="line.8528"></a>
-<span class="sourceLineNo">8529</span>    }<a name="line.8529"></a>
-<span class="sourceLineNo">8530</span><a name="line.8530"></a>
-<span class="sourceLineNo">8531</span>    long mutationSize = 0;<a name="line.8531"></a>
-<span class="sourceLineNo">8532</span>    for (List&lt;Cell&gt; cells: familyMap.values()) {<a name="line.8532"></a>
-<span class="sourceLineNo">8533</span>      // Optimization: 'foreach' loop is not used. See:<a name="line.8533"></a>
-<span class="sourceLineNo">8534</span>      // HBASE-12023 HRegion.applyFamilyMapToMemstore creates too many iterator objects<a name="line.8534"></a>
-<span class="sourceLineNo">8535</span>      assert cells instanceof RandomAccess;<a name="line.8535"></a>
-<span class="sourceLineNo">8536</span>      int listSize = cells.size();<a name="line.8536"></a>
-<span class="sourceLineNo">8537</span>      for (int i=0; i &lt; listSize; i++) {<a name="line.8537"></a>
-<span class="sourceLineNo">8538</span>        Cell cell = cells.get(i);<a name="line.8538"></a>
-<span class="sourceLineNo">8539</span>        mutationSize += cell.getSerializedSize();<a name="line.8539"></a>
-<span class="sourceLineNo">8540</span>      }<a name="line.8540"></a>
-<span class="sourceLineNo">8541</span>    }<a name="line.8541"></a>
-<span class="sourceLineNo">8542</span><a name="line.8542"></a>
-<span class="sourceLineNo">8543</span>    dataInMemoryWithoutWAL.add(mutationSize);<a name="line.8543"></a>
-<span class="sourceLineNo">8544</span>  }<a name="line.8544"></a>
-<span class="sourceLineNo">8545</span><a name="line.8545"></a>
-<span class="sourceLineNo">8546</span>  private void lock(final Lock lock) throws RegionTooBusyException, InterruptedIOException {<a name="line.8546"></a>
-<span class="sourceLineNo">8547</span>    lock(lock, 1);<a name="line.8547"></a>
-<span class="sourceLineNo">8548</span>  }<a name="line.8548"></a>
-<span class="sourceLineNo">8549</span><a name="line.8549"></a>
-<span class="sourceLineNo">8550</span>  /**<a name="line.8550"></a>
-<span class="sourceLineNo">8551</span>   * Try to acquire a lock.  Throw RegionTooBusyException<a name="line.8551"></a>
-<span class="sourceLineNo">8552</span>   * if failed to get the lock in time. Throw InterruptedIOException<a name="line.8552"></a>
-<span class="sourceLineNo">8553</span>   * if interrupted while waiting for the lock.<a name="line.8553"></a>
-<span class="sourceLineNo">8554</span>   */<a name="line.8554"></a>
-<span class="sourceLineNo">8555</span>  private void lock(final Lock lock, final int multiplier)<a name="line.8555"></a>
-<span class="sourceLineNo">8556</span>      throws RegionTooBusyException, InterruptedIOException {<a name="line.8556"></a>
-<span class="sourceLineNo">8557</span>    try {<a name="line.8557"></a>
-<span class="sourceLineNo">8558</span>      final long waitTime = Math.min(maxBusyWaitDuration,<a name="line.8558"></a>
-<span class="sourceLineNo">8559</span>          busyWaitDuration * Math.min(multiplier, maxBusyWaitMultiplier));<a name="line.8559"></a>
-<span class="sourceLineNo">8560</span>      if (!lock.tryLock(waitTime, TimeUnit.MILLISECONDS)) {<a name="line.8560"></a>
-<span class="sourceLineNo">8561</span>        // Don't print millis. Message is used as a key over in<a name="line.8561"></a>
-<span class="sourceLineNo">8562</span>        // RetriesExhaustedWithDetailsException processing.<a name="line.8562"></a>
-<span class="sourceLineNo">8563</span>        throw new RegionTooBusyException("Failed to obtain lock; regionName=" +<a name="line.8563"></a>
-<span class="sourceLineNo">8564</span>            (this.getRegionInfo() == null? "unknown":<a name="line.8564"></a>
-<span class="sourceLineNo">8565</span>                this.getRegionInfo().getRegionNameAsString()) +<a name="line.8565"></a>
-<span class="sourceLineNo">8566</span>            ", server=" + (this.getRegionServerServices() == null? "unknown":<a name="line.8566"></a>
-<span class="sourceLineNo">8567</span>                this.getRegionServerServices().getServerName()));<a name="line.8567"></a>
-<span class="sourceLineNo">8568</span>      }<a name="line.8568"></a>
-<span class="sourceLineNo">8569</span>    } catch (InterruptedException ie) {<a name="line.8569"></a>
-<span class="sourceLineNo">8570</span>      LOG.info("Interrupted while waiting for a lock");<a name="line.8570"></a>
-<span class="sourceLineNo">8571</span>      InterruptedIOException iie = new InterruptedIOException();<a name="line.8571"></a>
-<span class="sourceLineNo">8572</span>      iie.initCause(ie);<a name="line.8572"></a>
-<span class="sourceLineNo">8573</span>      throw iie;<a name="line.8573"></a>
-<span class="sourceLineNo">8574</span>    }<a name="line.8574"></a>
-<span class="sourceLineNo">8575</span>  }<a name="line.8575"></a>
-<span class="sourceLineNo">8576</span><a name="line.8576"></a>
-<span class="sourceLineNo">8577</span>  /**<a name="line.8577"></a>
-<span class="sourceLineNo">8578</span>   * Calls sync with the given transaction ID<a name="line.8578"></a>
-<span class="sourceLineNo">8579</span>   * @param txid should sync up to which transaction<a name="line.8579"></a>
-<span class="sourceLineNo">8580</span>   * @throws IOException If anything goes wrong with DFS<a name="line.8580"></a>
-<span class="sourceLineNo">8581</span>   */<a name="line.8581"></a>
-<span class="sourceLineNo">8582</span>  private void sync(long txid, Durability durability) throws IOException {<a name="line.8582"></a>
-<span class="sourceLineNo">8583</span>    if (this.getRegionInfo().isMetaRegion()) {<a name="line.8583"></a>
-<span class="sourceLineNo">8584</span>      this.wal.sync(txid);<a name="line.8584"></a>
-<span class="sourceLineNo">8585</span>    } else {<a name="line.8585"></a>
-<span class="sourceLineNo">8586</span>      switch(durability) {<a name="line.8586"></a>
-<span class="sourceLineNo">8587</span>      case USE_DEFAULT:<a name="line.8587"></a>
-<span class="sourceLineNo">8588</span>        // do what table defaults to<a name="line.8588"></a>
-<span class="sourceLineNo">8589</span>        if (shouldSyncWAL()) {<a name="line.8589"></a>
-<span class="sourceLineNo">8590</span>          this.wal.sync(txid);<a name="line.8590"></a>
-<span class="sourceLineNo">8591</span>        }<a name="line.8591"></a>
-<span class="sourceLineNo">8592</span>        break;<a name="line.8592"></a>
-<span class="sourceLineNo">8593</span>      case SKIP_WAL:<a name="line.8593"></a>
-<span class="sourceLineNo">8594</span>        // nothing do to<a name="line.8594"></a>
-<span class="sourceLineNo">8595</span>        break;<a name="line.8595"></a>
-<span class="sourceLineNo">8596</span>      case ASYNC_WAL:<a name="line.8596"></a>
-<span class="sourceLineNo">8597</span>        // nothing do to<a name="line.8597"></a>
-<span class="sourceLineNo">8598</span>        break;<a name="line.8598"></a>
-<span class="sourceLineNo">8599</span>      case SYNC_WAL:<a name="line.8599"></a>
-<span class="sourceLineNo">8600</span>          this.wal.sync(txid, false);<a name="line.8600"></a>
-<span class="sourceLineNo">8601</span>          break;<a name="line.8601"></a>
-<span class="sourceLineNo">8602</span>      case FSYNC_WAL:<a name="line.8602"></a>
-<span class="sourceLineNo">8603</span>          this.wal.sync(txid, true);<a name="line.8603"></a>
-<span class="sourceLineNo">8604</span>          break;<a name="line.8604"></a>
-<span class="sourceLineNo">8605</span>      default:<a name="line.8605"></a>
-<span class="sourceLineNo">8606</span>        throw new RuntimeException("Unknown durability " + durability);<a name="line.8606"></a>
-<span class="sourceLineNo">8607</span>      }<a name="line.8607"></a>
-<span class="sourceLineNo">8608</span>    }<a name="line.8608"></a>
-<span class="sourceLineNo">8609</span>  }<a name="line.8609"></a>
-<span class="sourceLineNo">8610</span><a name="line.8610"></a>
-<span class="sourceLineNo">8611</span>  /**<a name="line.8611"></a>
-<span class="sourceLineNo">8612</span>   * Check whether we should sync the wal from the table's durability settings<a name="line.8612"></a>
-<span class="sourceLineNo">8613</span>   */<a name="line.8613"></a>
-<span class="sourceLineNo">8614</span>  private boolean shouldSyncWAL() {<a name="line.8614"></a>
-<span class="sourceLineNo">8615</span>    return regionDurability.ordinal() &gt;  Durability.ASYNC_WAL.ordinal();<a name="line.8615"></a>
-<span class="sourceLineNo">8616</span>  }<a name="line.8616"></a>
-<span class="sourceLineNo">8617</span><a name="line.8617"></a>
-<span class="sourceLineNo">8618</span>  /**<a name="line.8618"></a>
-<span class="sourceLineNo">8619</span>   * A mocked list implementation - discards all updates.<a name="line.8619"></a>
-<span class="sourceLineNo">8620</span>   */<a name="line.8620"></a>
-<span class="sourceLineNo">8621</span>  private static final List&lt;Cell&gt; MOCKED_LIST = new AbstractList&lt;Cell&gt;() {<a name="line.8621"></a>
+<span class="sourceLineNo">8478</span>  public void closeRegionOperation() throws IOException {<a name="line.8478"></a>
+<span class="sourceLineNo">8479</span>    closeRegionOperation(Operation.ANY);<a name="line.8479"></a>
+<span class="sourceLineNo">8480</span>  }<a name="line.8480"></a>
+<span class="sourceLineNo">8481</span><a name="line.8481"></a>
+<span class="sourceLineNo">8482</span>  @Override<a name="line.8482"></a>
+<span class="sourceLineNo">8483</span>  public void closeRegionOperation(Operation operation) throws IOException {<a name="line.8483"></a>
+<span class="sourceLineNo">8484</span>    if (operation == Operation.SNAPSHOT) {<a name="line.8484"></a>
+<span class="sourceLineNo">8485</span>      stores.values().forEach(HStore::postSnapshotOperation);<a name="line.8485"></a>
+<span class="sourceLineNo">8486</span>    }<a name="line.8486"></a>
+<span class="sourceLineNo">8487</span>    lock.readLock().unlock();<a name="line.8487"></a>
+<span class="sourceLineNo">8488</span>    if (coprocessorHost != null) {<a name="line.8488"></a>
+<span class="sourceLineNo">8489</span>      coprocessorHost.postCloseRegionOperation(operation);<a name="line.8489"></a>
+<span class="sourceLineNo">8490</span>    }<a name="line.8490"></a>
+<span class="sourceLineNo">8491</span>  }<a name="line.8491"></a>
+<span class="sourceLineNo">8492</span><a name="line.8492"></a>
+<span class="sourceLineNo">8493</span>  /**<a name="line.8493"></a>
+<span class="sourceLineNo">8494</span>   * This method needs to be called before any public call that reads or<a name="line.8494"></a>
+<span class="sourceLineNo">8495</span>   * modifies stores in bulk. It has to be called just before a try.<a name="line.8495"></a>
+<span class="sourceLineNo">8496</span>   * #closeBulkRegionOperation needs to be called in the try's finally block<a name="line.8496"></a>
+<span class="sourceLineNo">8497</span>   * Acquires a writelock and checks if the region is closing or closed.<a name="line.8497"></a>
+<span class="sourceLineNo">8498</span>   * @throws NotServingRegionException when the region is closing or closed<a name="line.8498"></a>
+<span class="sourceLineNo">8499</span>   * @throws RegionTooBusyException if failed to get the lock in time<a name="line.8499"></a>
+<span class="sourceLineNo">8500</span>   * @throws InterruptedIOException if interrupted while waiting for a lock<a name="line.8500"></a>
+<span class="sourceLineNo">8501</span>   */<a name="line.8501"></a>
+<span class="sourceLineNo">8502</span>  private void startBulkRegionOperation(boolean writeLockNeeded)<a name="line.8502"></a>
+<span class="sourceLineNo">8503</span>      throws NotServingRegionException, RegionTooBusyException, InterruptedIOException {<a name="line.8503"></a>
+<span class="sourceLineNo">8504</span>    if (this.closing.get()) {<a name="line.8504"></a>
+<span class="sourceLineNo">8505</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closing");<a name="line.8505"></a>
+<span class="sourceLineNo">8506</span>    }<a name="line.8506"></a>
+<span class="sourceLineNo">8507</span>    if (writeLockNeeded) lock(lock.writeLock());<a name="line.8507"></a>
+<span class="sourceLineNo">8508</span>    else lock(lock.readLock());<a name="line.8508"></a>
+<span class="sourceLineNo">8509</span>    if (this.closed.get()) {<a name="line.8509"></a>
+<span class="sourceLineNo">8510</span>      if (writeLockNeeded) lock.writeLock().unlock();<a name="line.8510"></a>
+<span class="sourceLineNo">8511</span>      else lock.readLock().unlock();<a name="line.8511"></a>
+<span class="sourceLineNo">8512</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closed");<a name="line.8512"></a>
+<span class="sourceLineNo">8513</span>    }<a name="line.8513"></a>
+<span class="sourceLineNo">8514</span>  }<a name="line.8514"></a>
+<span class="sourceLineNo">8515</span><a name="line.8515"></a>
+<span class="sourceLineNo">8516</span>  /**<a name="line.8516"></a>
+<span class="sourceLineNo">8517</span>   * Closes the lock. This needs to be called in the finally block corresponding<a name="line.8517"></a>
+<span class="sourceLineNo">8518</span>   * to the try block of #startRegionOperation<a name="line.8518"></a>
+<span class="sourceLineNo">8519</span>   */<a name="line.8519"></a>
+<span class="sourceLineNo">8520</span>  private void closeBulkRegionOperation(){<a name="line.8520"></a>
+<span class="sourceLineNo">8521</span>    if (lock.writeLock().isHeldByCurrentThread()) lock.writeLock().unlock();<a name="line.8521"></a>
+<span class="sourceLineNo">8522</span>    else lock.readLock().unlock();<a name="line.8522"></a>
+<span class="sourceLineNo">8523</span>  }<a name="line.8523"></a>
+<span class="sourceLineNo">8524</span><a name="line.8524"></a>
+<span class="sourceLineNo">8525</span>  /**<a name="line.8525"></a>
+<span class="sourceLineNo">8526</span>   * Update LongAdders for number of puts without wal and the size of possible data loss.<a name="line.8526"></a>
+<span class="sourceLineNo">8527</span>   * These information are exposed by the region server metrics.<a name="line.8527"></a>
+<span class="sourceLineNo">8528</span>   */<a name="line.8528"></a>
+<span class="sourceLineNo">8529</span>  private void recordMutationWithoutWal(final Map&lt;byte [], List&lt;Cell&gt;&gt; familyMap) {<a name="line.8529"></a>
+<span class="sourceLineNo">8530</span>    numMutationsWithoutWAL.increment();<a name="line.8530"></a>
+<span class="sourceLineNo">8531</span>    if (numMutationsWithoutWAL.sum() &lt;= 1) {<a name="line.8531"></a>
+<span class="sourceLineNo">8532</span>      LOG.info("writing data to region " + this +<a name="line.8532"></a>
+<span class="sourceLineNo">8533</span>               " with WAL disabled. Data may be lost in the event of a crash.");<a name="line.8533"></a>
+<span class="sourceLineNo">8534</span>    }<a name="line.8534"></a>
+<span class="sourceLineNo">8535</span><a name="line.8535"></a>
+<span class="sourceLineNo">8536</span>    long mutationSize = 0;<a name="line.8536"></a>
+<span class="sourceLineNo">8537</span>    for (List&lt;Cell&gt; cells: familyMap.values()) {<a name="line.8537"></a>
+<span class="sourceLineNo">8538</span>      // Optimization: 'foreach' loop is not used. See:<a name="line.8538"></a>
+<span class="sourceLineNo">8539</span>      // HBASE-12023 HRegion.applyFamilyMapToMemstore creates too many iterator objects<a name="line.8539"></a>
+<span class="sourceLineNo">8540</span>      assert cells instanceof RandomAccess;<a name="line.8540"></a>
+<span class="sourceLineNo">8541</span>      int listSize = cells.size();<a name="line.8541"></a>
+<span class="sourceLineNo">8542</span>      for (int i=0; i &lt; listSize; i++) {<a name="line.8542"></a>
+<span class="sourceLineNo">8543</span>        Cell cell = cells.get(i);<a name="line.8543"></a>
+<span class="sourceLineNo">8544</span>        mutationSize += cell.getSerializedSize();<a name="line.8544"></a>
+<span class="sourceLineNo">8545</span>      }<a name="line.8545"></a>
+<span class="sourceLineNo">8546</span>    }<a name="line.8546"></a>
+<span class="sourceLineNo">8547</span><a name="line.8547"></a>
+<span class="sourceLineNo">8548</span>    dataInMemoryWithoutWAL.add(mutationSize);<a name="line.8548"></a>
+<span class="sourceLineNo">8549</span>  }<a name="line.8549"></a>
+<span class="sourceLineNo">8550</span><a name="line.8550"></a>
+<span class="sourceLineNo">8551</span>  private void lock(final Lock lock) throws RegionTooBusyException, InterruptedIOException {<a name="line.8551"></a>
+<span class="sourceLineNo">8552</span>    lock(lock, 1);<a name="line.8552"></a>
+<span class="sourceLineNo">8553</span>  }<a name="line.8553"></a>
+<span class="sourceLineNo">8554</span><a name="line.8554"></a>
+<span class="sourceLineNo">8555</span>  /**<a name="line.8555"></a>
+<span class="sourceLineNo">8556</span>   * Try to acquire a lock.  Throw RegionTooBusyException<a name="line.8556"></a>
+<span class="sourceLineNo">8557</span>   * if failed to get the lock in time. Throw InterruptedIOException<a name="line.8557"></a>
+<span class="sourceLineNo">8558</span>   * if interrupted while waiting for the lock.<a name="line.8558"></a>
+<span class="sourceLineNo">8559</span>   */<a name="line.8559"></a>
+<span class="sourceLineNo">8560</span>  private void lock(final Lock lock, final int multiplier)<a name="line.8560"></a>
+<span class="sourceLineNo">8561</span>      throws RegionTooBusyException, InterruptedIOException {<a name="line.8561"></a>
+<span class="sourceLineNo">8562</span>    try {<a name="line.8562"></a>
+<span class="sourceLineNo">8563</span>      final long waitTime = Math.min(maxBusyWaitDuration,<a name="line.8563"></a>
+<span class="sourceLineNo">8564</span>          busyWaitDuration * Math.min(multiplier, maxBusyWaitMultiplier));<a name="line.8564"></a>
+<span class="sourceLineNo">8565</span>      if (!lock.tryLock(waitTime, TimeUnit.MILLISECONDS)) {<a name="line.8565"></a>
+<span class="sourceLineNo">8566</span>        // Don't print millis. Message is used as a key over in<a name="line.8566"></a>
+<span class="sourceLineNo">8567</span>        // RetriesExhaustedWithDetailsException processing.<a name="line.8567"></a>
+<span class="sourceLineNo">8568</span>        throw new RegionTooBusyException("Failed to obtain lock; regionName=" +<a name="line.8568"></a>
+<span class="sourceLineNo">8569</span>            (this.getRegionInfo() == null? "unknown":<a name="line.8569"></a>
+<span class="sourceLineNo">8570</span>                this.getRegionInfo().getRegionNameAsString()) +<a name="line.8570"></a>
+<span class="sourceLineNo">8571</span>            ", server=" + (this.getRegionServerServices() == null? "unknown":<a name="line.8571"></a>
+<span class="sourceLineNo">8572</span>                this.getRegionServerServices().getServerName()));<a name="line.8572"></a>
+<span class="sourceLineNo">8573</span>      }<a name="line.8573"></a>
+<span class="sourceLineNo">8574</span>    } catch (InterruptedException ie) {<a name="line.8574"></a>
+<span class="sourceLineNo">8575</span>      LOG.info("Interrupted while waiting for a lock");<a name="line.8575"></a>
+<span class="sourceLineNo">8576</span>      InterruptedIOException iie = new InterruptedIOException();<a name="line.8576"></a>
+<span class="sourceLineNo">8577</span>      iie.initCause(ie);<a name="line.8577"></a>
+<span class="sourceLineNo">8578</span>      throw iie;<a name="line.8578"></a>
+<span class="sourceLineNo">8579</span>    }<a name="line.8579"></a>
+<span class="sourceLineNo">8580</span>  }<a name="line.8580"></a>
+<span class="sourceLineNo">8581</span><a name="line.8581"></a>
+<span class="sourceLineNo">8582</span>  /**<a name="line.8582"></a>
+<span class="sourceLineNo">8583</span>   * Calls sync with the given transaction ID<a name="line.8583"></a>
+<span class="sourceLineNo">8584</span>   * @param txid should sync up to which transaction<a name="line.8584"></a>
+<span class="sourceLineNo">8585</span>   * @throws IOException If anything goes wrong with DFS<a name="line.8585"></a>
+<span class="sourceLineNo">8586</span>   */<a name="line.8586"></a>
+<span class="sourceLineNo">8587</span>  private void sync(long txid, Durability durability) throws IOException {<a name="line.8587"></a>
+<span class="sourceLineNo">8588</span>    if (this.getRegionInfo().isMetaRegion()) {<a name="line.8588"></a>
+<span class="sourceLineNo">8589</span>      this.wal.sync(txid);<a name="line.8589"></a>
+<span class="sourceLineNo">8590</span>    } else {<a name="line.8590"></a>
+<span class="sourceLineNo">8591</span>      switch(durability) {<a name="line.8591"></a>
+<span class="sourceLineNo">8592</span>      case USE_DEFAULT:<a name="line.8592"></a>
+<span class="sourceLineNo">8593</span>        // do what table defaults to<a name="line.8593"></a>
+<span class="sourceLineNo">8594</span>        if (shouldSyncWAL()) {<a name="line.8594"></a>
+<span class="sourceLineNo">8595</span>          this.wal.sync(txid);<a name="line.8595"></a>
+<span class="sourceLineNo">8596</span>        }<a name="line.8596"></a>
+<span class="sourceLineNo">8597</span>        break;<a name="line.8597"></a>
+<span class="sourceLineNo">8598</span>      case SKIP_WAL:<a name="line.8598"></a>
+<span class="sourceLineNo">8599</span>        // nothing do to<a name="line.8599"></a>
+<span class="sourceLineNo">8600</span>        break;<a name="line.8600"></a>
+<span class="sourceLineNo">8601</span>      case ASYNC_WAL:<a name="line.8601"></a>
+<span class="sourceLineNo">8602</span>        // nothing do to<a name="line.8602"></a>
+<span class="sourceLineNo">8603</span>        break;<a name="line.8603"></a>
+<span class="sourceLineNo">8604</span>      case SYNC_WAL:<a name="line.8604"></a>
+<span class="sourceLineNo">8605</span>          this.wal.sync(txid, false);<a name="line.8605"></a>
+<span class="sourceLineNo">8606</span>          break;<a name="line.8606"></a>
+<span class="sourceLineNo">8607</span>      case FSYNC_WAL:<a name="line.8607"></a>
+<span class="sourceLineNo">8608</span>          this.wal.sync(txid, true);<a name="line.8608"></a>
+<span class="sourceLineNo">8609</span>          break;<a name="line.8609"></a>
+<span class="sourceLineNo">8610</span>      default:<a name="line.8610"></a>
+<span class="sourceLineNo">8611</span>        throw new RuntimeException("Unknown durability " + durability);<a name="line.8611"></a>
+<span class="sourceLineNo">8612</span>      }<a name="line.8612"></a>
+<span class="sourceLineNo">8613</span>    }<a name="line.8613"></a>
+<span class="sourceLineNo">8614</span>  }<a name="line.8614"></a>
+<span class="sourceLineNo">8615</span><a name="line.8615"></a>
+<span class="sourceLineNo">8616</span>  /**<a name="line.8616"></a>
+<span class="sourceLineNo">8617</span>   * Check whether we should sync the wal from the table's durability settings<a name="line.8617"></a>
+<span class="sourceLineNo">8618</span>   */<a name="line.8618"></a>
+<span class="sourceLineNo">8619</span>  private boolean shouldSyncWAL() {<a name="line.8619"></a>
+<span class="sourceLineNo">8620</span>    return regionDurability.ordinal() &gt;  Durability.ASYNC_WAL.ordinal();<a name="line.8620"></a>
+<span class="sourceLineNo">8621</span>  }<a name="line.8621"></a>
 <span class="sourceLineNo">8622</span><a name="line.8622"></a>
-<span class="sourceLineNo">8623</span>    @Override<a name="line.8623"></a>
-<span class="sourceLineNo">8624</span>    public void add(int index, Cell element) {<a name="line.8624"></a>
-<span class="sourceLineNo">8625</span>      // do nothing<a name="line.8625"></a>
-<span class="sourceLineNo">8626</span>    }<a name="line.8626"></a>
+<span class="sourceLineNo">8623</span>  /**<a name="line.8623"></a>
+<span class="sourceLineNo">8624</span>   * A mocked list implementation - discards all updates.<a name="line.8624"></a>
+<span class="sourceLineNo">8625</span>   */<a name="line.8625"></a>
+<span class="sourceLineNo">8626</span>  private static final List&lt;Cell&gt; MOCKED_LIST = new AbstractList&lt;Cell&gt;() {<a name="line.8626"></a>
 <span class="sourceLineNo">8627</span><a name="line.8627"></a>
 <span class="sourceLineNo">8628</span>    @Override<a name="line.8628"></a>
-<span class="sourceLineNo">8629</span>    public boolean addAll(int index, Collection&lt;? extends Cell&gt; c) {<a name="line.8629"></a>
-<span class="sourceLineNo">8630</span>      return false; // this list is never changed as a result of an update<a name="line.8630"></a>
+<span class="sourceLineNo">8629</span>    public void add(int index, Cell element) {<a name="line.8629"></a>
+<span class="sourceLineNo">8630</span>      // do nothing<a name="line.8630"></a>
 <span class="sourceLineNo">8631</span>    }<a name="line.8631"></a>
 <span class="sourceLineNo">8632</span><a name="line.8632"></a>
 <span class="sourceLineNo">8633</span>    @Override<a name="line.8633"></a>
-<span class="sourceLineNo">8634</span>    public KeyValue get(int index) {<a name="line.8634"></a>
-<span class="sourceLineNo">8635</span>      throw new UnsupportedOperationException();<a name="line.8635"></a>
+<span class="sourceLineNo">8634</span>    public boolean addAll(int index, Collection&lt;? extends Cell&gt; c) {<a name="line.8634"></a>
+<span class="sourceLineNo">8635</span>      return false; // this list is never changed as a result of an update<a name="line.8635"></a>
 <span class="sourceLineNo">8636</span>    }<a name="line.8636"></a>
 <span class="sourceLineNo">8637</span><a name="line.8637"></a>
 <span class="sourceLineNo">8638</span>    @Override<a name="line.8638"></a>
-<span class="sourceLineNo">8639</span>    public int size() {<a name="line.8639"></a>
-<span class="sourceLineNo">8640</span>      return 0;<a name="line.8640"></a>
+<span class="sourceLineNo">8639</span>    public KeyValue get(int index) {<a name="line.8639"></a>
+<span class="sourceLineNo">8640</span>      throw new UnsupportedOperationException();<a name="line.8640"></a>
 <span class="sourceLineNo">8641</span>    }<a name="line.8641"></a>
-<span class="sourceLineNo">8642</span>  };<a name="line.8642"></a>
-<span class="sourceLineNo">8643</span><a name="line.8643"></a>
-<span class="sourceLineNo">8644</span>  /** @return the latest sequence number that was read from storage when this region was opened */<a name="line.8644"></a>
-<span class="sourceLineNo">8645</span>  public long getOpenSeqNum() {<a name="line.8645"></a>
-<span class="sourceLineNo">8646</span>    return this.openSeqNum;<a name="line.8646"></a>
-<span class="sourceLineNo">8647</span>  }<a name="line.8647"></a>
+<span class="sourceLineNo">8642</span><a name="line.8642"></a>
+<span class="sourceLineNo">8643</span>    @Override<a name="line.8643"></a>
+<span class="sourceLineNo">8644</span>    public int size() {<a name="line.8644"></a>
+<span class="sourceLineNo">8645</span>      return 0;<a name="line.8645"></a>
+<span class="sourceLineNo">8646</span>    }<a name="line.8646"></a>
+<span class="sourceLineNo">8647</span>  };<a name="line.8647"></a>
 <span class="sourceLineNo">8648</span><a name="line.8648"></a>
-<span class="sourceLineNo">8649</span>  @Override<a name="line.8649"></a>
-<span class="sourceLineNo">8650</span>  public Map&lt;byte[], Long&gt; getMaxStoreSeqId() {<a name="line.8650"></a>
-<span class="sourceLineNo">8651</span>    return this.maxSeqIdInStores;<a name="line.8651"></a>
+<span class="sourceLineNo">8649</span>  /** @return the latest sequence number that was read from storage when this region was opened */<a name="line.8649"></a>
+<span class="sourceLineNo">8650</span>  public long getOpenSeqNum() {<a name="line.8650"></a>
+<span class="sourceLineNo">8651</span>    return this.openSeqNum;<a name="line.8651"></a>
 <span class="sourceLineNo">8652</span>  }<a name="line.8652"></a>
 <span class="sourceLineNo">8653</span><a name="line.8653"></a>
-<span class="sourceLineNo">8654</span>  public long getOldestSeqIdOfStore(byte[] familyName) {<a name="line.8654"></a>
-<span class="sourceLineNo">8655</span>    return wal.getEarliestMemStoreSeqNum(getRegionInfo().getEncodedNameAsBytes(), familyName);<a name="line.8655"></a>
-<span class="sourceLineNo">8656</span>  }<a name="line.8656"></a>
-<span class="sourceLineNo">8657</span><a name="line.8657"></a>
-<span class="sourceLineNo">8658</span>  @Override<a name="line.8658"></a>
-<span class="sourceLineNo">8659</span>  public CompactionState getCompactionState() {<a name="line.8659"></a>
-<span class="sourceLineNo">8660</span>    boolean hasMajor = majorInProgress.get() &gt; 0, hasMinor = minorInProgress.get() &gt; 0;<a name="line.8660"></a>
-<span class="sourceLineNo">8661</span>    return (hasMajor ? (hasMinor ? CompactionState.MAJOR_AND_MINOR : CompactionState.MAJOR)<a name="line.8661"></a>
-<span class="sourceLineNo">8662</span>        : (hasMinor ? CompactionState.MINOR : CompactionState.NONE));<a name="line.8662"></a>
-<span class="sourceLineNo">8663</span>  }<a name="line.8663"></a>
-<span class="sourceLineNo">8664</span><a name="line.8664"></a>
-<span class="sourceLineNo">8665</span>  public void reportCompactionRequestStart(boolean isMajor){<a name="line.8665"></a>
-<span class="sourceLineNo">8666</span>    (isMajor ? majorInProgress : minorInProgress).incrementAndGet();<a name="line.8666"></a>
-<span class="sourceLineNo">8667</span>  }<a name="line.8667"></a>
-<span class="sourceLineNo">8668</span><a name="line.8668"></a>
-<span class="sourceLineNo">8669</span>  public void reportCompactionRequestEnd(boolean isMajor, int numFiles, long filesSizeCompacted) {<a name="line.8669"></a>
-<span class="sourceLineNo">8670</span>    int newValue = (isMajor ? majorInProgress : minorInProgress).decrementAndGet();<a name="line.8670"></a>
-<span class="sourceLineNo">8671</span><a name="line.8671"></a>
-<span class="sourceLineNo">8672</span>    // metrics<a name="line.8672"></a>
-<span class="sourceLineNo">8673</span>    compactionsFinished.increment();<a name="line.8673"></a>
-<span class="sourceLineNo">8674</span>    compactionNumFilesCompacted.add(numFiles);<a name="line.8674"></a>
-<span class="sourceLineNo">8675</span>    compactionNumBytesCompacted.add(filesSizeCompacted);<a name="line.8675"></a>
+<span class="sourceLineNo">8654</span>  @Override<a name="line.8654"></a>
+<span class="sourceLineNo">8655</span>  public Map&lt;byte[], Long&gt; getMaxStoreSeqId() {<a name="line.8655"></a>
+<span class="sourceLineNo">8656</span>    return this.maxSeqIdInStores;<a name="line.8656"></a>
+<span class="sourceLineNo">8657</span>  }<a name="line.8657"></a>
+<span class="sourceLineNo">8658</span><a name="line.8658"></a>
+<span class="sourceLineNo">8659</span>  public long getOldestSeqIdOfStore(byte[] familyName) {<a name="line.8659"></a>
+<span class="sourceLineNo">8660</span>    return wal.getEarliestMemStoreSeqNum(getRegionInfo().getEncodedNameAsBytes(), familyName);<a name="line.8660"></a>
+<span class="sourceLineNo">8661</span>  }<a name="line.8661"></a>
+<span class="sourceLineNo">8662</span><a name="line.8662"></a>
+<span class="sourceLineNo">8663</span>  @Override<a name="line.8663"></a>
+<span class="sourceLineNo">8664</span>  public CompactionState getCompactionState() {<a name="line.8664"></a>
+<span class="sourceLineNo">8665</span>    boolean hasMajor = majorInProgress.get() &gt; 0, hasMinor = minorInProgress.get() &gt; 0;<a name="line.8665"></a>
+<span class="sourceLineNo">8666</span>    return (hasMajor ? (hasMinor ? CompactionState.MAJOR_AND_MINOR : CompactionState.MAJOR)<a name="line.8666"></a>
+<span class="sourceLineNo">8667</span>        : (hasMinor ? CompactionState.MINOR : CompactionState.NONE));<a name="line.8667"></a>
+<span class="sourceLineNo">8668</span>  }<a name="line.8668"></a>
+<span class="sourceLineNo">8669</span><a name="line.8669"></a>
+<span class="sourceLineNo">8670</span>  public void reportCompactionRequestStart(boolean isMajor){<a name="line.8670"></a>
+<span class="sourceLineNo">8671</span>    (isMajor ? majorInProgress : minorInProgress).incrementAndGet();<a name="line.8671"></a>
+<span class="sourceLineNo">8672</span>  }<a name="line.8672"></a>
+<span class="sourceLineNo">8673</span><a name="line.8673"></a>
+<span class="sourceLineNo">8674</span>  public void reportCompactionRequestEnd(boolean isMajor, int numFiles, long filesSizeCompacted) {<a name="line.8674"></a>
+<span class="sourceLineNo">8675</span>    int newValue = (isMajor ? majorInProgress : minorInProgress).decrementAndGet();<a name="line.8675"></a>
 <span class="sourceLineNo">8676</span><a name="line.8676"></a>
-<span class="sourceLineNo">8677</span>    assert newValue &gt;= 0;<a name="line.8677"></a>
-<span class="sourceLineNo">8678</span>  }<a name="line.8678"></a>
-<span class="sourceLineNo">8679</span><a name="line.8679"></a>
-<span class="sourceLineNo">8680</span>  public void reportCompactionRequestFailure() {<a name="line.8680"></a>
-<span class="sourceLineNo">8681</span>    compactionsFailed.increment();<a name="line.8681"></a>
-<span class="sourceLineNo">8682</span>  }<a name="line.8682"></a>
-<span class="sourceLineNo">8683</span><a name="line.8683"></a>
-<span class="sourceLineNo">8684</span>  public void incrementCompactionsQueuedCount() {<a name="line.8684"></a>
-<span class="sourceLineNo">8685</span>    compactionsQueued.increment();<a name="line.8685"></a>
-<span class="sourceLineNo">8686</span>  }<a name="line.8686"></a>
-<span class="sourceLineNo">8687</span><a name="line.8687"></a>
-<span class="sourceLineNo">8688</span>  public void decrementCompactionsQueuedCount() {<a name="line.8688"></a>
-<span class="sourceLineNo">8689</span>    compactionsQueued.decrement();<a name="line.8689"></a>
-<span class="sourceLineNo">8690</span>  }<a name="line.8690"></a>
-<span class="sourceLineNo">8691</span><a name="line.8691"></a>
-<span class="sourceLineNo">8692</span>  public void incrementFlushesQueuedCount() {<a name="line.8692"></a>
-<span class="sourceLineNo">8693</span>    flushesQueued.increment();<a name="line.8693"></a>
-<span class="sourceLineNo">8694</span>  }<a name="line.8694"></a>
-<span class="sourceLineNo">8695</span><a name="line.8695"></a>
-<span class="sourceLineNo">8696</span>  @VisibleForTesting<a name="line.8696"></a>
-<span class="sourceLineNo">8697</span>  public long getReadPoint() {<a name="line.8697"></a>
-<span class="sourceLineNo">8698</span>    return getReadPoint(IsolationLevel.READ_COMMITTED);<a name="line.8698"></a>
+<span class="sourceLineNo">8677</span>    // metrics<a name="line.8677"></a>
+<span class="sourceLineNo">8678</span>    compactionsFinished.increment();<a name="line.8678"></a>
+<span class="sourceLineNo">8679</span>    compactionNumFilesCompacted.add(numFiles);<a name="line.8679"></a>
+<span class="sourceLineNo">8680</span>    compactionNumBytesCompacted.add(filesSizeCompacted);<a name="line.8680"></a>
+<span class="sourceLineNo">8681</span><a name="line.8681"></a>
+<span class="sourceLineNo">8682</span>    assert newValue &gt;= 0;<a name="line.8682"></a>
+<span class="sourceLineNo">8683</span>  }<a name="line.8683"></a>
+<span class="sourceLineNo">8684</span><a name="line.8684"></a>
+<span class="sourceLineNo">8685</span>  public void reportCompactionRequestFailure() {<a name="line.8685"></a>
+<span class="sourceLineNo">8686</span>    compactionsFailed.increment();<a name="line.8686"></a>
+<span class="sourceLineNo">8687</span>  }<a name="line.8687"></a>
+<span class="sourceLineNo">8688</span><a name="line.8688"></a>
+<span class="sourceLineNo">8689</span>  public void incrementCompactionsQueuedCount() {<a name="line.8689"></a>
+<span class="sourceLineNo">8690</span>    compactionsQueued.increment();<a name="line.8690"></a>
+<span class="sourceLineNo">8691</span>  }<a name="line.8691"></a>
+<span class="sourceLineNo">8692</span><a name="line.8692"></a>
+<span class="sourceLineNo">8693</span>  public void decrementCompactionsQueuedCount() {<a name="line.8693"></a>
+<span class="sourceLineNo">8694</span>    compactionsQueued.decrement();<a name="line.8694"></a>
+<span class="sourceLineNo">8695</span>  }<a name="line.8695"></a>
+<span class="sourceLineNo">8696</span><a name="line.8696"></a>
+<span class="sourceLineNo">8697</span>  public void incrementFlushesQueuedCount() {<a name="line.8697"></a>
+<span class="sourceLineNo">8698</span>    flushesQueued.increment();<a name="line.8698"></a>
 <span class="sourceLineNo">8699</span>  }<a name="line.8699"></a>
 <span class="sourceLineNo">8700</span><a name="line.8700"></a>
-<span class="sourceLineNo">8701</span>  /**<a name="line.8701"></a>
-<span class="sourceLineNo">8702</span>   * {@inheritDoc}<a name="line.8702"></a>
-<span class="sourceLineNo">8703</span>   */<a name="line.8703"></a>
-<span class="sourceLineNo">8704</span>  @Override<a name="line.8704"></a>
-<span class="sourceLineNo">8705</span>  public void onConfigurationChange(Configuration conf) {<a name="line.8705"></a>
-<span class="sourceLineNo">8706</span>    this.storeHotnessProtector.update(conf);<a name="line.8706"></a>
-<span class="sourceLineNo">8707</span>  }<a name="line.8707"></a>
-<span class="sourceLineNo">8708</span><a name="line.8708"></a>
-<span class="sourceLineNo">8709</span>  /**<a name="line.8709"></a>
-<span class="sourceLineNo">8710</span>   * {@inheritDoc}<a name="line.8710"></a>
-<span class="sourceLineNo">8711</span>   */<a name="line.8711"></a>
-<span class="sourceLineNo">8712</span>  @Override<a name="line.8712"></a>
-<span class="sourceLineNo">8713</span>  public void registerChildren(ConfigurationManager manager) {<a name="line.8713"></a>
-<span class="sourceLineNo">8714</span>    configurationManager = Optional.of(manager);<a name="line.8714"></a>
-<span class="sourceLineNo">8715</span>    stores.values().forEach(manager::registerObserver);<a name="line.8715"></a>
-<span class="sourceLineNo">8716</span>  }<a name="line.8716"></a>
-<span class="sourceLineNo">8717</span><a name="line.8717"></a>
-<span class="sourceLineNo">8718</span>  /**<a name="line.8718"></a>
-<span class="sourceLineNo">8719</span>   * {@inheritDoc}<a name="line.8719"></a>
-<span class="sourceLineNo">8720</span>   */<a name="line.8720"></a>
-<span class="sourceLineNo">8721</span>  @Override<a name="line.8721"></a>
-<span class="sourceLineNo">8722</span>  public void deregisterChildren(ConfigurationManager manager) {<a name="line.8722"></a>
-<span class="sourceLineNo">8723</span>    stores.values().forEach(configurationManager.get()::deregisterObserver);<a name="line.8723"></a>
-<span class="sourceLineNo">8724</span>  }<a name="line.8724"></a>
-<span class="sourceLineNo">8725</span><a name="line.8725"></a>
+<span class="sourceLineNo">8701</span>  @VisibleForTesting<a name="line.8701"></a>
+<span class="sourceLineNo">8702</span>  public long getReadPoint() {<a name="line.8702"></a>
+<span class="sourceLineNo">8703</span>    return getReadPoint(IsolationLevel.READ_COMMITTED);<a name="line.8703"></a>
+<span class="sourceLineNo">8704</span>  }<a name="line.8704"></a>
+<span class="sourceLineNo">8705</span><a name="line.8705"></a>
+<span class="sourceLineNo">8706</span>  /**<a name="line.8706"></a>
+<span class="sourceLineNo">8707</span>   * {@inheritDoc}<a name="line.8707"></a>
+<span class="sourceLineNo">8708</span>   */<a name="line.8708"></a>
+<span class="sourceLineNo">8709</span>  @Override<a name="line.8709"></a>
+<span class="sourceLineNo">8710</span>  public void onConfigurationChange(Configuration conf) {<a name="line.8710"></a>
+<span class="sourceLineNo">8711</span>    this.storeHotnessProtector.update(conf);<a name="line.8711"></a>
+<span class="sourceLineNo">8712</span>  }<a name="line.8712"></a>
+<span class="sourceLineNo">8713</span><a name="line.8713"></a>
+<span class="sourceLineNo">8714</span>  /**<a name="line.8714"></a>
+<span class="sourceLineNo">8715</span>   * {@inheritDoc}<a name="line.8715"></a>
+<span class="sourceLineNo">8716</span>   */<a name="line.8716"></a>
+<span class="sourceLineNo">8717</span>  @Override<a name="line.8717"></a>
+<span class="sourceLineNo">8718</span>  public void registerChildren(ConfigurationManager manager) {<a name="line.8718"></a>
+<span class="sourceLineNo">8719</span>    configurationManager = Optional.of(manager);<a name="line.8719"></a>
+<span class="sourceLineNo">8720</span>    stores.values().forEach(manager::registerObserver);<a name="line.8720"></a>
+<span class="sourceLineNo">8721</span>  }<a name="line.8721"></a>
+<span class="sourceLineNo">8722</span><a name="line.8722"></a>
+<span class="sourceLineNo">8723</span>  /**<a name="line.8723"></a>
+<span class="sourceLineNo">8724</span>   * {@inheritDoc}<a name="line.8724"></a>
+<span class="sourceLineNo">8725</span>   */<a name="line.8725"></a>
 <span class="sourceLineNo">8726</span>  @Override<a name="line.8726"></a>
-<span class="sourceLineNo">8727</span>  public CellComparator getCellComparator() {<a name="line.8727"></a>
-<span class="sourceLineNo">8728</span>    return this.getRegionInfo().isMetaRegion() ? CellComparatorImpl.META_COMPARATOR<a name="line.8728"></a>
-<span class="sourceLineNo">8729</span>        : CellComparatorImpl.COMPARATOR;<a name="line.8729"></a>
-<span class="sourceLineNo">8730</span>  }<a name="line.8730"></a>
-<span class="sourceLineNo">8731</span><a name="line.8731"></a>
-<span class="sourceLineNo">8732</span>  public long getMemStoreFlushSize() {<a name="line.8732"></a>
-<span class="sourceLineNo">8733</span>    return this.memstoreFlushSize;<a name="line.8733"></a>
-<span class="sourceLineNo">8734</span>  }<a name="line.8734"></a>
-<span class="sourceLineNo">8735</span><a name="line.8735"></a>
+<span class="sourceLineNo">8727</span>  public void deregisterChildren(ConfigurationManager manager) {<a name="line.8727"></a>
+<span class="sourceLineNo">8728</span>    stores.values().forEach(configurationManager.get()::deregisterObserver);<a name="line.8728"></a>
+<span class="sourceLineNo">8729</span>  }<a name="line.8729"></a>
+<span class="sourceLineNo">8730</span><a name="line.8730"></a>
+<span class="sourceLineNo">8731</span>  @Override<a name="line.8731"></a>
+<span class="sourceLineNo">8732</span>  public CellComparator getCellComparator() {<a name="line.8732"></a>
+<span class="sourceLineNo">8733</span>    return this.getRegionInfo().isMetaRegion() ? CellComparatorImpl.META_COMPARATOR<a name="line.8733"></a>
+<span class="sourceLineNo">8734</span>        : CellComparatorImpl.COMPARATOR;<a name="line.8734"></a>
+<span class="sourceLineNo">8735</span>  }<a name="line.8735"></a>
 <span class="sourceLineNo">8736</span><a name="line.8736"></a>
-<span class="sourceLineNo">8737</span>  //// method for debugging tests<a name="line.8737"></a>
-<span class="sourceLineNo">8738</span>  void throwException(String title, String regionName) {<a name="line.8738"></a>
-<span class="sourceLineNo">8739</span>    StringBuilder buf = new StringBuilder();<a name="line.8739"></a>
-<span class="sourceLineNo">8740</span>    buf.append(title + ", ");<a name="line.8740"></a>
-<span class="sourceLineNo">8741</span>    buf.append(getRegionInfo().toString());<a name="line.8741"></a>
-<span class="sourceLineNo">8742</span>    buf.append(getRegionInfo().isMetaRegion() ? " meta region " : " ");<a name="line.8742"></a>
-<span class="sourceLineNo">8743</span>    buf.append("stores: ");<a name="line.8743"></a>
-<span class="sourceLineNo">8744</span>    for (HStore s : stores.values()) {<a name="line.8744"></a>
-<span class="sourceLineNo">8745</span>      buf.append(s.getColumnFamilyDescriptor().getNameAsString());<a name="line.8745"></a>
-<span class="sourceLineNo">8746</span>      buf.append(" size: ");<a name="line.8746"></a>
-<span class="sourceLineNo">8747</span>      buf.append(s.getMemStoreSize().getDataSize());<a name="line.8747"></a>
-<span class="sourceLineNo">8748</span>      buf.append(" ");<a name="line.8748"></a>
-<span class="sourceLineNo">8749</span>    }<a name="line.8749"></a>
-<span class="sourceLineNo">8750</span>    buf.append("end-of-stores");<a name="line.8750"></a>
-<span class="sourceLineNo">8751</span>    buf.append(", memstore size ");<a name="line.8751"></a>
-<span class="sourceLineNo">8752</span>    buf.append(getMemStoreDataSize());<a name="line.8752"></a>
-<span class="sourceLineNo">8753</span>    if (getRegionInfo().getRegionNameAsString().startsWith(regionName)) {<a name="line.8753"></a>
-<span class="sourceLineNo">8754</span>      throw new RuntimeException(buf.toString());<a name="line.8754"></a>
-<span class="sourceLineNo">8755</span>    }<a name="line.8755"></a>
-<span class="sourceLineNo">8756</span>  }<a name="line.8756"></a>
-<span class="sourceLineNo">8757</span><a name="line.8757"></a>
-<span class="sourceLineNo">8758</span>  @Override<a name="line.8758"></a>
-<span class="sourceLineNo">8759</span>  public void requestCompaction(String why, int priority, boolean major,<a name="line.8759"></a>
-<span class="sourceLineNo">8760</span>      CompactionLifeCycleTracker tracker) throws IOException {<a name="line.8760"></a>
-<span class="sourceLineNo">8761</span>    if (major) {<a name="line.8761"></a>
-<span class="sourceLineNo">8762</span>      stores.values().forEach(HStore::triggerMajorCompaction);<a name="line.8762"></a>
-<span class="sourceLineNo">8763</span>    }<a name="line.8763"></a>
-<span class="sourceLineNo">8764</span>    rsServices.getCompactionRequestor().requestCompaction(this, why, priority, tracker,<a name="line.8764"></a>
-<span class="sourceLineNo">8765</span>        RpcServer.getRequestUser().orElse(null));<a name="line.8765"></a>
-<span class="sourceLineNo">8766</span>  }<a name="line.8766"></a>
-<span class="sourceLineNo">8767</span><a name="line.8767"></a>
-<span class="sourceLineNo">8768</span>  @Override<a name="line.8768"></a>
-<span class="sourceLineNo">8769</span>  public void requestCompaction(byte[] family, String why, int priority, boolean major,<a name="line.8769"></a>
-<span class="sourceLineNo">8770</span>      CompactionLifeCycleTracker tracker) throws IOException {<a name="line.8770"></a>
-<span class="sourceLineNo">8771</span>    HStore store = stores.get(family);<a name="line.8771"></a>
-<span class="sourceLineNo">8772</span>    if (store == null) {<a name="line.8772"></a>
-<span class="sourceLineNo">8773</span>      throw new NoSuchColumnFamilyException("column family " + Bytes.toString(family) +<a name="line.8773"></a>
-<span class="sourceLineNo">8774</span>          " does not exist in region " + getRegionInfo().getRegionNameAsString());<a name="line.8774"></a>
-<span class="sourceLineNo">8775</span>    }<a name="line.8775"></a>
-<span class="sourceLineNo">8776</span>    if (major) {<a name="line.8776"></a>
-<span class="sourceLineNo">8777</span>      store.triggerMajorCompaction();<a name="line.8777"></a>
-<span class="sourceLineNo">8778</span>    }<a name="line.8778"></a>
-<span class="sourceLineNo">8779</span>    rsServices.getCompactionRequestor().requestCompaction(this, store, why, priority, tracker,<a name="line.8779"></a>
-<span class="sourceLineNo">8780</span>        RpcServer.getRequestUser().orElse(null));<a name="line.8780"></a>
-<span class="sourceLineNo">8781</span>  }<a name="line.8781"></a>
-<span class="sourceLineNo">8782</span><a name="line.8782"></a>
-<span class="sourceLineNo">8783</span>  private void requestFlushIfNeeded() throws RegionTooBusyException {<a name="line.8783"></a>
-<span class="sourceLineNo">8784</span>    if(isFlushSize(this.memStoreSizing.getMemStoreSize())) {<a name="line.8784"></a>
-<span class="sourceLineNo">8785</span>      requestFlush();<a name="line.8785"></a>
-<span class="sourceLineNo">8786</span>    }<a name="line.8786"></a>
-<span class="sourceLineNo">8787</span>  }<a name="line.8787"></a>
-<span class="sourceLineNo">8788</span><a name="line.8788"></a>
-<span class="sourceLineNo">8789</span>  private void requestFlush() {<a name="line.8789"></a>
-<span class="sourceLineNo">8790</span>    if (this.rsServices == null) {<a name="line.8790"></a>
-<span class="sourceLineNo">8791</span>      return;<a name="line.8791"></a>
-<span class="sourceLineNo">8792</span>    }<a name="line.8792"></a>
-<span class="sourceLineNo">8793</span>    requestFlush0(FlushLifeCycleTracker.DUMMY);<a name="line.8793"></a>
-<span class="sourceLineNo">8794</span>  }<a name="line.8794"></a>
-<span class="sourceLineNo">8795</span><a name="line.8795"></a>
-<span class="sourceLineNo">8796</span>  private void requestFlush0(FlushLifeCycleTracker tracker) {<a name="line.8796"></a>
-<span class="sourceLineNo">8797</span>    boolean shouldFlush = false;<a name="line.8797"></a>
-<span class="sourceLineNo">8798</span>    synchronized (writestate) {<a name="line.8798"></a>
-<span class="sourceLineNo">8799</span>      if (!this.writestate.isFlushRequested()) {<a name="line.8799"></a>
-<span class="sourceLineNo">8800</span>        shouldFlush = true;<a name="line.8800"></a>
-<span class="sourceLineNo">8801</span>        writestate.flushRequested = true;<a name="line.8801"></a>
-<span class="sourceLineNo">8802</span>      }<a name="line.8802"></a>
-<span class="sourceLineNo">8803</span>    }<a name="line.8803"></a>
-<span class="sourceLineNo">8804</span>    if (shouldFlush) {<a name="line.8804"></a>
-<span class="sourceLineNo">8805</span>      // Make request outside of synchronize block; HBASE-818.<a name="line.8805"></a>
-<span class="sourceLineNo">8806</span>      this.rsServices.getFlushRequester().requestFlush(this, false, tracker);<a name="line.8806"></a>
-<span class="sourceLineNo">8807</span>      if (LOG.isDebugEnabled()) {<a name="line.8807"></a>
-<span class="sourceLineNo">8808</span>        LOG.debug("Flush requested on " + this.getRegionInfo().getEncodedName());<a name="line.8808"></a>
-<span class="sourceLineNo">8809</span>      }<a name="line.8809"></a>
-<span class="sourceLineNo">8810</span>    } else {<a name="line.8810"></a>
-<span class="sourceLineNo">8811</span>      tracker.notExecuted("Flush already requested on " + this);<a name="line.8811"></a>
-<span class="sourceLineNo">8812</span>    }<a name="line.8812"></a>
-<span class="sourceLineNo">8813</span>  }<a name="line.8813"></a>
-<span class="sourceLineNo">8814</span><a name="line.8814"></a>
-<span class="sourceLineNo">8815</span>  @Override<a name="line.8815"></a>
-<span class="sourceLineNo">8816</span>  public void requestFlush(FlushLifeCycleTracker tracker) throws IOException {<a name="line.8816"></a>
-<span class="sourceLineNo">8817</span>    requestFlush0(tracker);<a name="line.8817"></a>
+<span class="sourceLineNo">8737</span>  public long getMemStoreFlushSize() {<a name="line.8737"></a>
+<span class="sourceLineNo">8738</span>    return this.memstoreFlushSize;<a name="line.8738"></a>
+<span class="sourceLineNo">8739</span>  }<a name="line.8739"></a>
+<span class="sourceLineNo">8740</span><a name="line.8740"></a>
+<span class="sourceLineNo">8741</span><a name="line.8741"></a>
+<span class="sourceLineNo">8742</span>  //// method for debugging tests<a name="line.8742"></a>
+<span class="sourceLineNo">8743</span>  void throwException(String title, String regionName) {<a name="line.8743"></a>
+<span class="sourceLineNo">8744</span>    StringBuilder buf = new StringBuilder();<a name="line.8744"></a>
+<span class="sourceLineNo">8745</span>    buf.append(title + ", ");<a name="line.8745"></a>
+<span class="sourceLineNo">8746</span>    buf.append(getRegionInfo().toString());<a name="line.8746"></a>
+<span class="sourceLineNo">8747</span>    buf.append(getRegionInfo().isMetaRegion() ? " meta region " : " ");<a name="line.8747"></a>
+<span class="sourceLineNo">8748</span>    buf.append("stores: ");<a name="line.8748"></a>
+<span class="sourceLineNo">8749</span>    for (HStore s : stores.values()) {<a name="line.8749"></a>
+<span class="sourceLineNo">8750</span>      buf.append(s.getColumnFamilyDescriptor().getNameAsString());<a name="line.8750"></a>
+<span class="sourceLineNo">8751</span>      buf.append(" size: ");<a name="line.8751"></a>
+<span class="sourceLineNo">8752</span>      buf.append(s.getMemStoreSize().getDataSize());<a name="line.8752"></a>
+<span class="sourceLineNo">8753</span>      buf.append(" ");<a name="line.8753"></a>
+<span class="sourceLineNo">8754</span>    }<a name="line.8754"></a>
+<span class="sourceLineNo">8755</span>    buf.append("end-of-stores");<a name="line.8755"></a>
+<span class="sourceLineNo">8756</span>    buf.append(", memstore size ");<a name="line.8756"></a>
+<span class="sourceLineNo">8757</span>    buf.append(getMemStoreDataSize());<a name="line.8757"></a>
+<span class="sourceLineNo">8758</span>    if (getRegionInfo().getRegionNameAsString().startsWith(regionName)) {<a name="line.8758"></a>
+<span class="sourceLineNo">8759</span>      throw new RuntimeException(buf.toString());<a name="line.8759"></a>
+<span class="sourceLineNo">8760</span>    }<a name="line.8760"></a>
+<span class="sourceLineNo">8761</span>  }<a name="line.8761"></a>
+<span class="sourceLineNo">8762</span><a name="line.8762"></a>
+<span class="sourceLineNo">8763</span>  @Override<a name="line.8763"></a>
+<span class="sourceLineNo">8764</span>  public void requestCompaction(String why, int priority, boolean major,<a name="line.8764"></a>
+<span class="sourceLineNo">8765</span>      CompactionLifeCycleTracker tracker) throws IOException {<a name="line.8765"></a>
+<span class="sourceLineNo">8766</span>    if (major) {<a name="line.8766"></a>
+<span class="sourceLineNo">8767</span>      stores.values().forEach(HStore::triggerMajorCompaction);<a name="line.8767"></a>
+<span class="sourceLineNo">8768</span>    }<a name="line.8768"></a>
+<span class="sourceLineNo">8769</span>    rsServices.getCompactionRequestor().requestCompaction(this, why, priority, tracker,<a name="line.8769"></a>
+<span class="sourceLineNo">8770</span>        RpcServer.getRequestUser().orElse(null));<a name="line.8770"></a>
+<span class="sourceLineNo">8771</span>  }<a name="line.8771"></a>
+<span class="sourceLineNo">8772</span><a name="line.8772"></a>
+<span class="sourceLineNo">8773</span>  @Override<a name="line.8773"></a>
+<span class="sourceLineNo">8774</span>  public void requestCompaction(byte[] family, String why, int priority, boolean major,<a name="line.8774"></a>
+<span class="sourceLineNo">8775</span>      CompactionLifeCycleTracker tracker) throws IOException {<a name="line.8775"></a>
+<span class="sourceLineNo">8776</span>    HStore store = stores.get(family);<a name="line.8776"></a>
+<span class="sourceLineNo">8777</span>    if (store == null) {<a name="line.8777"></a>
+<span class="sourceLineNo">8778</span>      throw new NoSuchColumnFamilyException("column family " + Bytes.toString(family) +<a name="line.8778"></a>
+<span class="sourceLineNo">8779</span>          " does not exist in region " + getRegionInfo().getRegionNameAsString());<a name="line.8779"></a>
+<span class="sourceLineNo">8780</span>    }<a name="line.8780"></a>
+<span class="sourceLineNo">8781</span>    if (major) {<a name="line.8781"></a>
+<span class="sourceLineNo">8782</span>      store.triggerMajorCompaction();<a name="line.8782"></a>
+<span class="sourceLineNo">8783</span>    }<a name="line.8783"></a>
+<span class="sourceLineNo">8784</span>    rsServices.getCompactionRequestor().requestCompaction(this, store, why, priority, tracker,<a name="line.8784"></a>
+<span class="sourceLineNo">8785</span>        RpcServer.getRequestUser().orElse(null));<a name="line.8785"></a>
+<span class="sourceLineNo">8786</span>  }<a name="line.8786"></a>
+<span class="sourceLineNo">8787</span><a name="line.8787"></a>
+<span class="sourceLineNo">8788</span>  private void requestFlushIfNeeded() throws RegionTooBusyException {<a name="line.8788"></a>
+<span class="sourceLineNo">8789</span>    if(isFlushSize(this.memStoreSizing.getMemStoreSize())) {<a name="line.8789"></a>
+<span class="sourceLineNo">8790</span>      requestFlush();<a name="line.8790"></a>
+<span class="sourceLineNo">8791</span>    }<a name="line.8791"></a>
+<span class="sourceLineNo">8792</span>  }<a name="line.8792"></a>
+<span class="sourceLineNo">8793</span><a name="line.8793"></a>
+<span class="sourceLineNo">8794</span>  private void requestFlush() {<a name="line.8794"></a>
+<span class="sourceLineNo">8795</span>    if (this.rsServices == null) {<a name="line.8795"></a>
+<span class="sourceLineNo">8796</span>      return;<a name="line.8796"></a>
+<span class="sourceLineNo">8797</span>    }<a name="line.8797"></a>
+<span class="sourceLineNo">8798</span>    requestFlush0(FlushLifeCycleTracker.DUMMY);<a name="line.8798"></a>
+<span class="sourceLineNo">8799</span>  }<a name="line.8799"></a>
+<span class="sourceLineNo">8800</span><a name="line.8800"></a>
+<span class="sourceLineNo">8801</span>  private void requestFlush0(FlushLifeCycleTracker tracker) {<a name="line.8801"></a>
+<span class="sourceLineNo">8802</span>    boolean shouldFlush = false;<a name="line.8802"></a>
+<span class="sourceLineNo">8803</span>    synchronized (writestate) {<a name="line.8803"></a>
+<span class="sourceLineNo">8804</span>      if (!this.writestate.isFlushRequested()) {<a name="line.8804"></a>
+<span class="sourceLineNo">8805</span>        shouldFlush = true;<a name="line.8805"></a>
+<span class="sourceLineNo">8806</span>        writestate.flushRequested = true;<a name="line.8806"></a>
+<span class="sourceLineNo">8807</span>      }<a name="line.8807"></a>
+<span class="sourceLineNo">8808</span>    }<a name="line.8808"></a>
+<span class="sourceLineNo">8809</span>    if (shouldFlush) {<a name="line.8809"></a>
+<span class="sourceLineNo">8810</span>      // Make request outside of synchronize block; HBASE-818.<a name="line.8810"></a>
+<span class="sourceLineNo">8811</span>      this.rsServices.getFlushRequester().requestFlush(this, false, tracker);<a name="line.8811"></a>
+<span class="sourceLineNo">8812</span>      if (LOG.isDebugEnabled()) {<a name="line.8812"></a>
+<span class="sourceLineNo">8813</span>        LOG.debug("Flush requested on " + this.getRegionInfo().getEncodedName());<a name="line.8813"></a>
+<span class="sourceLineNo">8814</span>      }<a name="line.8814"></a>
+<span class="sourceLineNo">8815</span>    } else {<a name="line.8815"></a>
+<span class="sourceLineNo">8816</span>      tracker.notExecuted("Flush already requested on " + this);<a name="line.8816"></a>
+<span class="sourceLineNo">8817</span>    }<a name="line.8817"></a>
 <span class="sourceLineNo">8818</span>  }<a name="line.8818"></a>
 <span class="sourceLineNo">8819</span><a name="line.8819"></a>
-<span class="sourceLineNo">8820</span>  /**<a name="line.8820"></a>
-<span class="sourceLineNo">8821</span>   * This method modifies the region's configuration in order to inject replication-related<a name="line.8821"></a>
-<span class="sourceLineNo">8822</span>   * features<a name="line.8822"></a>
-<span class="sourceLineNo">8823</span>   * @param conf region configurations<a name="line.8823"></a>
-<span class="sourceLineNo">8824</span>   */<a name="line.8824"></a>
-<span class="sourceLineNo">8825</span>  static void decorateRegionConfiguration(Configuration conf) {<a name="line.8825"></a>
-<span class="sourceLineNo">8826</span>    if (ReplicationUtils.isReplicationForBulkLoadDataEnabled(conf)) {<a name="line.8826"></a>
-<span class="sourceLineNo">8827</span>      String plugins = conf.get(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY,"");<a name="line.8827"></a>
-<span class="sourceLineNo">8828</span>      String replicationCoprocessorClass = ReplicationObserver.class.getCanonicalName();<a name="line.8828"></a>
-<span class="sourceLineNo">8829</span>      if (!plugins.contains(replicationCoprocessorClass)) {<a name="line.8829"></a>
-<span class="sourceLineNo">8830</span>        conf.set(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY,<a name="line.8830"></a>
-<span class="sourceLineNo">8831</span>            (plugins.equals("") ? "" : (plugins + ",")) + replicationCoprocessorClass);<a name="line.8831"></a>
-<span class="sourceLineNo">8832</span>      }<a name="line.8832"></a>
-<span class="sourceLineNo">8833</span>    }<a name="line.8833"></a>
-<span class="sourceLineNo">8834</span>  }<a name="line.8834"></a>
-<span class="sourceLineNo">8835</span>}<a name="line.8835"></a>
+<span class="sourceLineNo">8820</span>  @Override<a name="line.8820"></a>
+<span class="sourceLineNo">8821</span>  public void requestFlush(FlushLifeCycleTracker tracker) throws IOException {<a name="line.8821"></a>
+<span class="sourceLineNo">8822</span>    requestFlush0(tracker);<a name="line.8822"></a>
+<span class="sourceLineNo">8823</span>  }<a name="line.8823"></a>
+<span class="sourceLineNo">8824</span><a name="line.8824"></a>
+<span class="sourceLineNo">8825</span>  /**<a name="line.8825"></a>
+<span class="sourceLineNo">8826</span>   * This method modifies the region's configuration in order to inject replication-related<a name="line.8826"></a>
+<span class="sourceLineNo">8827</span>   * features<a name="line.8827"></a>
+<span class="sourceLineNo">8828</span>   * @param conf region configurations<a name="line.8828"></a>
+<span class="sourceLineNo">8829</span>   */<a name="line.8829"></a>
+<span class="sourceLineNo">8830</span>  static void decorateRegionConfiguration(Configuration conf) {<a name="line.8830"></a>
+<span class="sourceLineNo">8831</span>    if (ReplicationUtils.isReplicationForBulkLoadDataEnabled(conf)) {<a name="line.8831"></a>
+<span class="sourceLineNo">8832</span>      String plugins = conf.get(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY,"");<a name="line.8832"></a>
+<span class="sourceLineNo">8833</span>      String replicationCoprocessorClass = ReplicationObserver.class.getCanonicalName();<a name="line.8833"></a>
+<span class="sourceLineNo">8834</span>      if (!plugins.contains(replicationCoprocessorClass)) {<a name="line.8834"></a>
+<span class="sourceLineNo">8835</span>        conf.set(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY,<a name="line.8835"></a>
+<span class="sourceLineNo">8836</span>            (plugins.equals("") ? "" : (plugins + ",")) + replicationCoprocessorClass);<a name="line.8836"></a>
+<span class="sourceLineNo">8837</span>      }<a name="line.8837"></a>
+<span class="sourceLineNo">8838</span>    }<a name="line.8838"></a>
+<span class="sourceLineNo">8839</span>  }<a name="line.8839"></a>
+<span class="sourceLineNo">8840</span>}<a name="line.8840"></a>
 
 
 
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 8fcec33..2147e82 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
@@ -7972,875 +7972,880 @@
 <span class="sourceLineNo">7964</span>    if (walEdit.isReplay()) {<a name="line.7964"></a>
 <span class="sourceLineNo">7965</span>      walKey.setOrigLogSeqNum(origLogSeqNum);<a name="line.7965"></a>
 <span class="sourceLineNo">7966</span>    }<a name="line.7966"></a>
-<span class="sourceLineNo">7967</span>    WriteEntry writeEntry = null;<a name="line.7967"></a>
-<span class="sourceLineNo">7968</span>    try {<a name="line.7968"></a>
-<span class="sourceLineNo">7969</span>      long txid = this.wal.append(this.getRegionInfo(), walKey, walEdit, true);<a name="line.7969"></a>
-<span class="sourceLineNo">7970</span>      // Call sync on our edit.<a name="line.7970"></a>
-<span class="sourceLineNo">7971</span>      if (txid != 0) {<a name="line.7971"></a>
-<span class="sourceLineNo">7972</span>        sync(txid, durability);<a name="line.7972"></a>
-<span class="sourceLineNo">7973</span>      }<a name="line.7973"></a>
-<span class="sourceLineNo">7974</span>      writeEntry = walKey.getWriteEntry();<a name="line.7974"></a>
-<span class="sourceLineNo">7975</span>    } catch (IOException ioe) {<a name="line.7975"></a>
-<span class="sourceLineNo">7976</span>      if (walKey != null &amp;&amp; walKey.getWriteEntry() != null) {<a name="line.7976"></a>
-<span class="sourceLineNo">7977</span>        mvcc.complete(walKey.getWriteEntry());<a name="line.7977"></a>
+<span class="sourceLineNo">7967</span>    //don't call the coproc hook for writes to the WAL caused by<a name="line.7967"></a>
+<span class="sourceLineNo">7968</span>    //system lifecycle events like flushes or compactions<a name="line.7968"></a>
+<span class="sourceLineNo">7969</span>    if (this.coprocessorHost != null &amp;&amp; !walEdit.isMetaEdit()) {<a name="line.7969"></a>
+<span class="sourceLineNo">7970</span>      this.coprocessorHost.preWALAppend(walKey, walEdit);<a name="line.7970"></a>
+<span class="sourceLineNo">7971</span>    }<a name="line.7971"></a>
+<span class="sourceLineNo">7972</span>    WriteEntry writeEntry = null;<a name="line.7972"></a>
+<span class="sourceLineNo">7973</span>    try {<a name="line.7973"></a>
+<span class="sourceLineNo">7974</span>      long txid = this.wal.append(this.getRegionInfo(), walKey, walEdit, true);<a name="line.7974"></a>
+<span class="sourceLineNo">7975</span>      // Call sync on our edit.<a name="line.7975"></a>
+<span class="sourceLineNo">7976</span>      if (txid != 0) {<a name="line.7976"></a>
+<span class="sourceLineNo">7977</span>        sync(txid, durability);<a name="line.7977"></a>
 <span class="sourceLineNo">7978</span>      }<a name="line.7978"></a>
-<span class="sourceLineNo">7979</span>      throw ioe;<a name="line.7979"></a>
-<span class="sourceLineNo">7980</span>    }<a name="line.7980"></a>
-<span class="sourceLineNo">7981</span>    return writeEntry;<a name="line.7981"></a>
-<span class="sourceLineNo">7982</span>  }<a name="line.7982"></a>
-<span class="sourceLineNo">7983</span><a name="line.7983"></a>
-<span class="sourceLineNo">7984</span>  /**<a name="line.7984"></a>
-<span class="sourceLineNo">7985</span>   * Do coprocessor pre-increment or pre-append call.<a name="line.7985"></a>
-<span class="sourceLineNo">7986</span>   * @return Result returned out of the coprocessor, which means bypass all further processing and<a name="line.7986"></a>
-<span class="sourceLineNo">7987</span>   *  return the proffered Result instead, or null which means proceed.<a name="line.7987"></a>
-<span class="sourceLineNo">7988</span>   */<a name="line.7988"></a>
-<span class="sourceLineNo">7989</span>  private Result doCoprocessorPreCall(final Operation op, final Mutation mutation)<a name="line.7989"></a>
-<span class="sourceLineNo">7990</span>  throws IOException {<a name="line.7990"></a>
-<span class="sourceLineNo">7991</span>    Result result = null;<a name="line.7991"></a>
-<span class="sourceLineNo">7992</span>    if (this.coprocessorHost != null) {<a name="line.7992"></a>
-<span class="sourceLineNo">7993</span>      switch(op) {<a name="line.7993"></a>
-<span class="sourceLineNo">7994</span>        case INCREMENT:<a name="line.7994"></a>
-<span class="sourceLineNo">7995</span>          result = this.coprocessorHost.preIncrementAfterRowLock((Increment)mutation);<a name="line.7995"></a>
-<span class="sourceLineNo">7996</span>          break;<a name="line.7996"></a>
-<span class="sourceLineNo">7997</span>        case APPEND:<a name="line.7997"></a>
-<span class="sourceLineNo">7998</span>          result = this.coprocessorHost.preAppendAfterRowLock((Append)mutation);<a name="line.7998"></a>
-<span class="sourceLineNo">7999</span>          break;<a name="line.7999"></a>
-<span class="sourceLineNo">8000</span>        default: throw new UnsupportedOperationException(op.toString());<a name="line.8000"></a>
-<span class="sourceLineNo">8001</span>      }<a name="line.8001"></a>
-<span class="sourceLineNo">8002</span>    }<a name="line.8002"></a>
-<span class="sourceLineNo">8003</span>    return result;<a name="line.8003"></a>
-<span class="sourceLineNo">8004</span>  }<a name="line.8004"></a>
-<span class="sourceLineNo">8005</span><a name="line.8005"></a>
-<span class="sourceLineNo">8006</span>  /**<a name="line.8006"></a>
-<span class="sourceLineNo">8007</span>   * Reckon the Cells to apply to WAL, memstore, and to return to the Client; these Sets are not<a name="line.8007"></a>
-<span class="sourceLineNo">8008</span>   * always the same dependent on whether to write WAL.<a name="line.8008"></a>
-<span class="sourceLineNo">8009</span>   *<a name="line.8009"></a>
-<span class="sourceLineNo">8010</span>   * @param results Fill in here what goes back to the Client if it is non-null (if null, client<a name="line.8010"></a>
-<span class="sourceLineNo">8011</span>   *  doesn't want results).<a name="line.8011"></a>
-<span class="sourceLineNo">8012</span>   * @param forMemStore Fill in here what to apply to the MemStore (by Store).<a name="line.8012"></a>
-<span class="sourceLineNo">8013</span>   * @return A WALEdit to apply to WAL or null if we are to skip the WAL.<a name="line.8013"></a>
-<span class="sourceLineNo">8014</span>   */<a name="line.8014"></a>
-<span class="sourceLineNo">8015</span>  private WALEdit reckonDeltas(Operation op, Mutation mutation, Durability effectiveDurability,<a name="line.8015"></a>
-<span class="sourceLineNo">8016</span>      Map&lt;HStore, List&lt;Cell&gt;&gt; forMemStore, List&lt;Cell&gt; results) throws IOException {<a name="line.8016"></a>
-<span class="sourceLineNo">8017</span>    WALEdit walEdit = null;<a name="line.8017"></a>
-<span class="sourceLineNo">8018</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.8018"></a>
-<span class="sourceLineNo">8019</span>    final boolean writeToWAL = effectiveDurability != Durability.SKIP_WAL;<a name="line.8019"></a>
-<span class="sourceLineNo">8020</span>    // Process a Store/family at a time.<a name="line.8020"></a>
-<span class="sourceLineNo">8021</span>    for (Map.Entry&lt;byte [], List&lt;Cell&gt;&gt; entry: mutation.getFamilyCellMap().entrySet()) {<a name="line.8021"></a>
-<span class="sourceLineNo">8022</span>      final byte[] columnFamilyName = entry.getKey();<a name="line.8022"></a>
-<span class="sourceLineNo">8023</span>      List&lt;Cell&gt; deltas = entry.getValue();<a name="line.8023"></a>
-<span class="sourceLineNo">8024</span>      // Reckon for the Store what to apply to WAL and MemStore.<a name="line.8024"></a>
-<span class="sourceLineNo">8025</span>      List&lt;Cell&gt; toApply = reckonDeltasByStore(stores.get(columnFamilyName), op, mutation,<a name="line.8025"></a>
-<span class="sourceLineNo">8026</span>        effectiveDurability, now, deltas, results);<a name="line.8026"></a>
-<span class="sourceLineNo">8027</span>      if (!toApply.isEmpty()) {<a name="line.8027"></a>
-<span class="sourceLineNo">8028</span>        for (Cell cell : toApply) {<a name="line.8028"></a>
-<span class="sourceLineNo">8029</span>          HStore store = getStore(cell);<a name="line.8029"></a>
-<span class="sourceLineNo">8030</span>          if (store == null) {<a name="line.8030"></a>
-<span class="sourceLineNo">8031</span>            checkFamily(CellUtil.cloneFamily(cell));<a name="line.8031"></a>
-<span class="sourceLineNo">8032</span>          } else {<a name="line.8032"></a>
-<span class="sourceLineNo">8033</span>            forMemStore.computeIfAbsent(store, key -&gt; new ArrayList&lt;&gt;()).add(cell);<a name="line.8033"></a>
-<span class="sourceLineNo">8034</span>          }<a name="line.8034"></a>
-<span class="sourceLineNo">8035</span>        }<a name="line.8035"></a>
-<span class="sourceLineNo">8036</span>        if (writeToWAL) {<a name="line.8036"></a>
-<span class="sourceLineNo">8037</span>          if (walEdit == null) {<a name="line.8037"></a>
-<span class="sourceLineNo">8038</span>            walEdit = new WALEdit();<a name="line.8038"></a>
+<span class="sourceLineNo">7979</span>      writeEntry = walKey.getWriteEntry();<a name="line.7979"></a>
+<span class="sourceLineNo">7980</span>    } catch (IOException ioe) {<a name="line.7980"></a>
+<span class="sourceLineNo">7981</span>      if (walKey != null &amp;&amp; walKey.getWriteEntry() != null) {<a name="line.7981"></a>
+<span class="sourceLineNo">7982</span>        mvcc.complete(walKey.getWriteEntry());<a name="line.7982"></a>
+<span class="sourceLineNo">7983</span>      }<a name="line.7983"></a>
+<span class="sourceLineNo">7984</span>      throw ioe;<a name="line.7984"></a>
+<span class="sourceLineNo">7985</span>    }<a name="line.7985"></a>
+<span class="sourceLineNo">7986</span>    return writeEntry;<a name="line.7986"></a>
+<span class="sourceLineNo">7987</span>  }<a name="line.7987"></a>
+<span class="sourceLineNo">7988</span><a name="line.7988"></a>
+<span class="sourceLineNo">7989</span>  /**<a name="line.7989"></a>
+<span class="sourceLineNo">7990</span>   * Do coprocessor pre-increment or pre-append call.<a name="line.7990"></a>
+<span class="sourceLineNo">7991</span>   * @return Result returned out of the coprocessor, which means bypass all further processing and<a name="line.7991"></a>
+<span class="sourceLineNo">7992</span>   *  return the proffered Result instead, or null which means proceed.<a name="line.7992"></a>
+<span class="sourceLineNo">7993</span>   */<a name="line.7993"></a>
+<span class="sourceLineNo">7994</span>  private Result doCoprocessorPreCall(final Operation op, final Mutation mutation)<a name="line.7994"></a>
+<span class="sourceLineNo">7995</span>  throws IOException {<a name="line.7995"></a>
+<span class="sourceLineNo">7996</span>    Result result = null;<a name="line.7996"></a>
+<span class="sourceLineNo">7997</span>    if (this.coprocessorHost != null) {<a name="line.7997"></a>
+<span class="sourceLineNo">7998</span>      switch(op) {<a name="line.7998"></a>
+<span class="sourceLineNo">7999</span>        case INCREMENT:<a name="line.7999"></a>
+<span class="sourceLineNo">8000</span>          result = this.coprocessorHost.preIncrementAfterRowLock((Increment)mutation);<a name="line.8000"></a>
+<span class="sourceLineNo">8001</span>          break;<a name="line.8001"></a>
+<span class="sourceLineNo">8002</span>        case APPEND:<a name="line.8002"></a>
+<span class="sourceLineNo">8003</span>          result = this.coprocessorHost.preAppendAfterRowLock((Append)mutation);<a name="line.8003"></a>
+<span class="sourceLineNo">8004</span>          break;<a name="line.8004"></a>
+<span class="sourceLineNo">8005</span>        default: throw new UnsupportedOperationException(op.toString());<a name="line.8005"></a>
+<span class="sourceLineNo">8006</span>      }<a name="line.8006"></a>
+<span class="sourceLineNo">8007</span>    }<a name="line.8007"></a>
+<span class="sourceLineNo">8008</span>    return result;<a name="line.8008"></a>
+<span class="sourceLineNo">8009</span>  }<a name="line.8009"></a>
+<span class="sourceLineNo">8010</span><a name="line.8010"></a>
+<span class="sourceLineNo">8011</span>  /**<a name="line.8011"></a>
+<span class="sourceLineNo">8012</span>   * Reckon the Cells to apply to WAL, memstore, and to return to the Client; these Sets are not<a name="line.8012"></a>
+<span class="sourceLineNo">8013</span>   * always the same dependent on whether to write WAL.<a name="line.8013"></a>
+<span class="sourceLineNo">8014</span>   *<a name="line.8014"></a>
+<span class="sourceLineNo">8015</span>   * @param results Fill in here what goes back to the Client if it is non-null (if null, client<a name="line.8015"></a>
+<span class="sourceLineNo">8016</span>   *  doesn't want results).<a name="line.8016"></a>
+<span class="sourceLineNo">8017</span>   * @param forMemStore Fill in here what to apply to the MemStore (by Store).<a name="line.8017"></a>
+<span class="sourceLineNo">8018</span>   * @return A WALEdit to apply to WAL or null if we are to skip the WAL.<a name="line.8018"></a>
+<span class="sourceLineNo">8019</span>   */<a name="line.8019"></a>
+<span class="sourceLineNo">8020</span>  private WALEdit reckonDeltas(Operation op, Mutation mutation, Durability effectiveDurability,<a name="line.8020"></a>
+<span class="sourceLineNo">8021</span>      Map&lt;HStore, List&lt;Cell&gt;&gt; forMemStore, List&lt;Cell&gt; results) throws IOException {<a name="line.8021"></a>
+<span class="sourceLineNo">8022</span>    WALEdit walEdit = null;<a name="line.8022"></a>
+<span class="sourceLineNo">8023</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.8023"></a>
+<span class="sourceLineNo">8024</span>    final boolean writeToWAL = effectiveDurability != Durability.SKIP_WAL;<a name="line.8024"></a>
+<span class="sourceLineNo">8025</span>    // Process a Store/family at a time.<a name="line.8025"></a>
+<span class="sourceLineNo">8026</span>    for (Map.Entry&lt;byte [], List&lt;Cell&gt;&gt; entry: mutation.getFamilyCellMap().entrySet()) {<a name="line.8026"></a>
+<span class="sourceLineNo">8027</span>      final byte[] columnFamilyName = entry.getKey();<a name="line.8027"></a>
+<span class="sourceLineNo">8028</span>      List&lt;Cell&gt; deltas = entry.getValue();<a name="line.8028"></a>
+<span class="sourceLineNo">8029</span>      // Reckon for the Store what to apply to WAL and MemStore.<a name="line.8029"></a>
+<span class="sourceLineNo">8030</span>      List&lt;Cell&gt; toApply = reckonDeltasByStore(stores.get(columnFamilyName), op, mutation,<a name="line.8030"></a>
+<span class="sourceLineNo">8031</span>        effectiveDurability, now, deltas, results);<a name="line.8031"></a>
+<span class="sourceLineNo">8032</span>      if (!toApply.isEmpty()) {<a name="line.8032"></a>
+<span class="sourceLineNo">8033</span>        for (Cell cell : toApply) {<a name="line.8033"></a>
+<span class="sourceLineNo">8034</span>          HStore store = getStore(cell);<a name="line.8034"></a>
+<span class="sourceLineNo">8035</span>          if (store == null) {<a name="line.8035"></a>
+<span class="sourceLineNo">8036</span>            checkFamily(CellUtil.cloneFamily(cell));<a name="line.8036"></a>
+<span class="sourceLineNo">8037</span>          } else {<a name="line.8037"></a>
+<span class="sourceLineNo">8038</span>            forMemStore.computeIfAbsent(store, key -&gt; new ArrayList&lt;&gt;()).add(cell);<a name="line.8038"></a>
 <span class="sourceLineNo">8039</span>          }<a name="line.8039"></a>
-<span class="sourceLineNo">8040</span>          walEdit.getCells().addAll(toApply);<a name="line.8040"></a>
-<span class="sourceLineNo">8041</span>        }<a name="line.8041"></a>
-<span class="sourceLineNo">8042</span>      }<a name="line.8042"></a>
-<span class="sourceLineNo">8043</span>    }<a name="line.8043"></a>
-<span class="sourceLineNo">8044</span>    return walEdit;<a name="line.8044"></a>
-<span class="sourceLineNo">8045</span>  }<a name="line.8045"></a>
-<span class="sourceLineNo">8046</span><a name="line.8046"></a>
-<span class="sourceLineNo">8047</span>  /**<a name="line.8047"></a>
-<span class="sourceLineNo">8048</span>   * Reckon the Cells to apply to WAL, memstore, and to return to the Client in passed<a name="line.8048"></a>
-<span class="sourceLineNo">8049</span>   * column family/Store.<a name="line.8049"></a>
-<span class="sourceLineNo">8050</span>   *<a name="line.8050"></a>
-<span class="sourceLineNo">8051</span>   * Does Get of current value and then adds passed in deltas for this Store returning the result.<a name="line.8051"></a>
-<span class="sourceLineNo">8052</span>   *<a name="line.8052"></a>
-<span class="sourceLineNo">8053</span>   * @param op Whether Increment or Append<a name="line.8053"></a>
-<span class="sourceLineNo">8054</span>   * @param mutation The encompassing Mutation object<a name="line.8054"></a>
-<span class="sourceLineNo">8055</span>   * @param deltas Changes to apply to this Store; either increment amount or data to append<a name="line.8055"></a>
-<span class="sourceLineNo">8056</span>   * @param results In here we accumulate all the Cells we are to return to the client. If null,<a name="line.8056"></a>
-<span class="sourceLineNo">8057</span>   *                client doesn't want results returned.<a name="line.8057"></a>
-<span class="sourceLineNo">8058</span>   * @return Resulting Cells after &lt;code&gt;deltas&lt;/code&gt; have been applied to current<a name="line.8058"></a>
-<span class="sourceLineNo">8059</span>   *  values. Side effect is our filling out of the &lt;code&gt;results&lt;/code&gt; List.<a name="line.8059"></a>
-<span class="sourceLineNo">8060</span>   */<a name="line.8060"></a>
-<span class="sourceLineNo">8061</span>  private List&lt;Cell&gt; reckonDeltasByStore(HStore store, Operation op, Mutation mutation,<a name="line.8061"></a>
-<span class="sourceLineNo">8062</span>      Durability effectiveDurability, long now, List&lt;Cell&gt; deltas, List&lt;Cell&gt; results)<a name="line.8062"></a>
-<span class="sourceLineNo">8063</span>      throws IOException {<a name="line.8063"></a>
-<span class="sourceLineNo">8064</span>    byte[] columnFamily = store.getColumnFamilyDescriptor().getName();<a name="line.8064"></a>
-<span class="sourceLineNo">8065</span>    List&lt;Pair&lt;Cell, Cell&gt;&gt; cellPairs = new ArrayList&lt;&gt;(deltas.size());<a name="line.8065"></a>
-<span class="sourceLineNo">8066</span>    // Get previous values for all columns in this family.<a name="line.8066"></a>
-<span class="sourceLineNo">8067</span>    TimeRange tr = null;<a name="line.8067"></a>
-<span class="sourceLineNo">8068</span>    switch (op) {<a name="line.8068"></a>
-<span class="sourceLineNo">8069</span>      case INCREMENT:<a name="line.8069"></a>
-<span class="sourceLineNo">8070</span>        tr = ((Increment)mutation).getTimeRange();<a name="line.8070"></a>
-<span class="sourceLineNo">8071</span>        break;<a name="line.8071"></a>
-<span class="sourceLineNo">8072</span>      case APPEND:<a name="line.8072"></a>
-<span class="sourceLineNo">8073</span>        tr = ((Append)mutation).getTimeRange();<a name="line.8073"></a>
-<span class="sourceLineNo">8074</span>        break;<a name="line.8074"></a>
-<span class="sourceLineNo">8075</span>      default:<a name="line.8075"></a>
+<span class="sourceLineNo">8040</span>        }<a name="line.8040"></a>
+<span class="sourceLineNo">8041</span>        if (writeToWAL) {<a name="line.8041"></a>
+<span class="sourceLineNo">8042</span>          if (walEdit == null) {<a name="line.8042"></a>
+<span class="sourceLineNo">8043</span>            walEdit = new WALEdit();<a name="line.8043"></a>
+<span class="sourceLineNo">8044</span>          }<a name="line.8044"></a>
+<span class="sourceLineNo">8045</span>          walEdit.getCells().addAll(toApply);<a name="line.8045"></a>
+<span class="sourceLineNo">8046</span>        }<a name="line.8046"></a>
+<span class="sourceLineNo">8047</span>      }<a name="line.8047"></a>
+<span class="sourceLineNo">8048</span>    }<a name="line.8048"></a>
+<span class="sourceLineNo">8049</span>    return walEdit;<a name="line.8049"></a>
+<span class="sourceLineNo">8050</span>  }<a name="line.8050"></a>
+<span class="sourceLineNo">8051</span><a name="line.8051"></a>
+<span class="sourceLineNo">8052</span>  /**<a name="line.8052"></a>
+<span class="sourceLineNo">8053</span>   * Reckon the Cells to apply to WAL, memstore, and to return to the Client in passed<a name="line.8053"></a>
+<span class="sourceLineNo">8054</span>   * column family/Store.<a name="line.8054"></a>
+<span class="sourceLineNo">8055</span>   *<a name="line.8055"></a>
+<span class="sourceLineNo">8056</span>   * Does Get of current value and then adds passed in deltas for this Store returning the result.<a name="line.8056"></a>
+<span class="sourceLineNo">8057</span>   *<a name="line.8057"></a>
+<span class="sourceLineNo">8058</span>   * @param op Whether Increment or Append<a name="line.8058"></a>
+<span class="sourceLineNo">8059</span>   * @param mutation The encompassing Mutation object<a name="line.8059"></a>
+<span class="sourceLineNo">8060</span>   * @param deltas Changes to apply to this Store; either increment amount or data to append<a name="line.8060"></a>
+<span class="sourceLineNo">8061</span>   * @param results In here we accumulate all the Cells we are to return to the client. If null,<a name="line.8061"></a>
+<span class="sourceLineNo">8062</span>   *                client doesn't want results returned.<a name="line.8062"></a>
+<span class="sourceLineNo">8063</span>   * @return Resulting Cells after &lt;code&gt;deltas&lt;/code&gt; have been applied to current<a name="line.8063"></a>
+<span class="sourceLineNo">8064</span>   *  values. Side effect is our filling out of the &lt;code&gt;results&lt;/code&gt; List.<a name="line.8064"></a>
+<span class="sourceLineNo">8065</span>   */<a name="line.8065"></a>
+<span class="sourceLineNo">8066</span>  private List&lt;Cell&gt; reckonDeltasByStore(HStore store, Operation op, Mutation mutation,<a name="line.8066"></a>
+<span class="sourceLineNo">8067</span>      Durability effectiveDurability, long now, List&lt;Cell&gt; deltas, List&lt;Cell&gt; results)<a name="line.8067"></a>
+<span class="sourceLineNo">8068</span>      throws IOException {<a name="line.8068"></a>
+<span class="sourceLineNo">8069</span>    byte[] columnFamily = store.getColumnFamilyDescriptor().getName();<a name="line.8069"></a>
+<span class="sourceLineNo">8070</span>    List&lt;Pair&lt;Cell, Cell&gt;&gt; cellPairs = new ArrayList&lt;&gt;(deltas.size());<a name="line.8070"></a>
+<span class="sourceLineNo">8071</span>    // Get previous values for all columns in this family.<a name="line.8071"></a>
+<span class="sourceLineNo">8072</span>    TimeRange tr = null;<a name="line.8072"></a>
+<span class="sourceLineNo">8073</span>    switch (op) {<a name="line.8073"></a>
+<span class="sourceLineNo">8074</span>      case INCREMENT:<a name="line.8074"></a>
+<span class="sourceLineNo">8075</span>        tr = ((Increment)mutation).getTimeRange();<a name="line.8075"></a>
 <span class="sourceLineNo">8076</span>        break;<a name="line.8076"></a>
-<span class="sourceLineNo">8077</span>    }<a name="line.8077"></a>
-<span class="sourceLineNo">8078</span>    List&lt;Cell&gt; currentValues = get(mutation, store, deltas,null, tr);<a name="line.8078"></a>
-<span class="sourceLineNo">8079</span>    // Iterate the input columns and update existing values if they were found, otherwise<a name="line.8079"></a>
-<span class="sourceLineNo">8080</span>    // add new column initialized to the delta amount<a name="line.8080"></a>
-<span class="sourceLineNo">8081</span>    int currentValuesIndex = 0;<a name="line.8081"></a>
-<span class="sourceLineNo">8082</span>    for (int i = 0; i &lt; deltas.size(); i++) {<a name="line.8082"></a>
-<span class="sourceLineNo">8083</span>      Cell delta = deltas.get(i);<a name="line.8083"></a>
-<span class="sourceLineNo">8084</span>      Cell currentValue = null;<a name="line.8084"></a>
-<span class="sourceLineNo">8085</span>      if (currentValuesIndex &lt; currentValues.size() &amp;&amp;<a name="line.8085"></a>
-<span class="sourceLineNo">8086</span>          CellUtil.matchingQualifier(currentValues.get(currentValuesIndex), delta)) {<a name="line.8086"></a>
-<span class="sourceLineNo">8087</span>        currentValue = currentValues.get(currentValuesIndex);<a name="line.8087"></a>
-<span class="sourceLineNo">8088</span>        if (i &lt; (deltas.size() - 1) &amp;&amp; !CellUtil.matchingQualifier(delta, deltas.get(i + 1))) {<a name="line.8088"></a>
-<span class="sourceLineNo">8089</span>          currentValuesIndex++;<a name="line.8089"></a>
-<span class="sourceLineNo">8090</span>        }<a name="line.8090"></a>
-<span class="sourceLineNo">8091</span>      }<a name="line.8091"></a>
-<span class="sourceLineNo">8092</span><a name="line.8092"></a>
-<span class="sourceLineNo">8093</span>      // Switch on whether this an increment or an append building the new Cell to apply.<a name="line.8093"></a>
-<span class="sourceLineNo">8094</span>      Cell newCell = null;<a name="line.8094"></a>
-<span class="sourceLineNo">8095</span>      switch (op) {<a name="line.8095"></a>
-<span class="sourceLineNo">8096</span>        case INCREMENT:<a name="line.8096"></a>
-<span class="sourceLineNo">8097</span>          long deltaAmount = getLongValue(delta);<a name="line.8097"></a>
-<span class="sourceLineNo">8098</span>          final long newValue = currentValue == null ? deltaAmount : getLongValue(currentValue) + deltaAmount;<a name="line.8098"></a>
-<span class="sourceLineNo">8099</span>          newCell = reckonDelta(delta, currentValue, columnFamily, now, mutation, (oldCell) -&gt; Bytes.toBytes(newValue));<a name="line.8099"></a>
-<span class="sourceLineNo">8100</span>          break;<a name="line.8100"></a>
-<span class="sourceLineNo">8101</span>        case APPEND:<a name="line.8101"></a>
-<span class="sourceLineNo">8102</span>          newCell = reckonDelta(delta, currentValue, columnFamily, now, mutation, (oldCell) -&gt;<a name="line.8102"></a>
-<span class="sourceLineNo">8103</span>            ByteBuffer.wrap(new byte[delta.getValueLength() + oldCell.getValueLength()])<a name="line.8103"></a>
-<span class="sourceLineNo">8104</span>                    .put(oldCell.getValueArray(), oldCell.getValueOffset(), oldCell.getValueLength())<a name="line.8104"></a>
-<span class="sourceLineNo">8105</span>                    .put(delta.getValueArray(), delta.getValueOffset(), delta.getValueLength())<a name="line.8105"></a>
-<span class="sourceLineNo">8106</span>                    .array()<a name="line.8106"></a>
-<span class="sourceLineNo">8107</span>          );<a name="line.8107"></a>
-<span class="sourceLineNo">8108</span>          break;<a name="line.8108"></a>
-<span class="sourceLineNo">8109</span>        default: throw new UnsupportedOperationException(op.toString());<a name="line.8109"></a>
-<span class="sourceLineNo">8110</span>      }<a name="line.8110"></a>
-<span class="sourceLineNo">8111</span>      int newCellSize = PrivateCellUtil.estimatedSerializedSizeOf(newCell);<a name="line.8111"></a>
-<span class="sourceLineNo">8112</span>      if (newCellSize &gt; this.maxCellSize) {<a name="line.8112"></a>
-<span class="sourceLineNo">8113</span>        String msg = "Cell with size " + newCellSize + " exceeds limit of " +<a name="line.8113"></a>
-<span class="sourceLineNo">8114</span>            this.maxCellSize + " bytes";<a name="line.8114"></a>
-<span class="sourceLineNo">8115</span>        if (LOG.isDebugEnabled()) {<a name="line.8115"></a>
-<span class="sourceLineNo">8116</span>          LOG.debug(msg);<a name="line.8116"></a>
-<span class="sourceLineNo">8117</span>        }<a name="line.8117"></a>
-<span class="sourceLineNo">8118</span>        throw new DoNotRetryIOException(msg);<a name="line.8118"></a>
-<span class="sourceLineNo">8119</span>      }<a name="line.8119"></a>
-<span class="sourceLineNo">8120</span>      cellPairs.add(new Pair&lt;&gt;(currentValue, newCell));<a name="line.8120"></a>
-<span class="sourceLineNo">8121</span>      // Add to results to get returned to the Client. If null, cilent does not want results.<a name="line.8121"></a>
-<span class="sourceLineNo">8122</span>      if (results != null) {<a name="line.8122"></a>
-<span class="sourceLineNo">8123</span>        results.add(newCell);<a name="line.8123"></a>
+<span class="sourceLineNo">8077</span>      case APPEND:<a name="line.8077"></a>
+<span class="sourceLineNo">8078</span>        tr = ((Append)mutation).getTimeRange();<a name="line.8078"></a>
+<span class="sourceLineNo">8079</span>        break;<a name="line.8079"></a>
+<span class="sourceLineNo">8080</span>      default:<a name="line.8080"></a>
+<span class="sourceLineNo">8081</span>        break;<a name="line.8081"></a>
+<span class="sourceLineNo">8082</span>    }<a name="line.8082"></a>
+<span class="sourceLineNo">8083</span>    List&lt;Cell&gt; currentValues = get(mutation, store, deltas,null, tr);<a name="line.8083"></a>
+<span class="sourceLineNo">8084</span>    // Iterate the input columns and update existing values if they were found, otherwise<a name="line.8084"></a>
+<span class="sourceLineNo">8085</span>    // add new column initialized to the delta amount<a name="line.8085"></a>
+<span class="sourceLineNo">8086</span>    int currentValuesIndex = 0;<a name="line.8086"></a>
+<span class="sourceLineNo">8087</span>    for (int i = 0; i &lt; deltas.size(); i++) {<a name="line.8087"></a>
+<span class="sourceLineNo">8088</span>      Cell delta = deltas.get(i);<a name="line.8088"></a>
+<span class="sourceLineNo">8089</span>      Cell currentValue = null;<a name="line.8089"></a>
+<span class="sourceLineNo">8090</span>      if (currentValuesIndex &lt; currentValues.size() &amp;&amp;<a name="line.8090"></a>
+<span class="sourceLineNo">8091</span>          CellUtil.matchingQualifier(currentValues.get(currentValuesIndex), delta)) {<a name="line.8091"></a>
+<span class="sourceLineNo">8092</span>        currentValue = currentValues.get(currentValuesIndex);<a name="line.8092"></a>
+<span class="sourceLineNo">8093</span>        if (i &lt; (deltas.size() - 1) &amp;&amp; !CellUtil.matchingQualifier(delta, deltas.get(i + 1))) {<a name="line.8093"></a>
+<span class="sourceLineNo">8094</span>          currentValuesIndex++;<a name="line.8094"></a>
+<span class="sourceLineNo">8095</span>        }<a name="line.8095"></a>
+<span class="sourceLineNo">8096</span>      }<a name="line.8096"></a>
+<span class="sourceLineNo">8097</span><a name="line.8097"></a>
+<span class="sourceLineNo">8098</span>      // Switch on whether this an increment or an append building the new Cell to apply.<a name="line.8098"></a>
+<span class="sourceLineNo">8099</span>      Cell newCell = null;<a name="line.8099"></a>
+<span class="sourceLineNo">8100</span>      switch (op) {<a name="line.8100"></a>
+<span class="sourceLineNo">8101</span>        case INCREMENT:<a name="line.8101"></a>
+<span class="sourceLineNo">8102</span>          long deltaAmount = getLongValue(delta);<a name="line.8102"></a>
+<span class="sourceLineNo">8103</span>          final long newValue = currentValue == null ? deltaAmount : getLongValue(currentValue) + deltaAmount;<a name="line.8103"></a>
+<span class="sourceLineNo">8104</span>          newCell = reckonDelta(delta, currentValue, columnFamily, now, mutation, (oldCell) -&gt; Bytes.toBytes(newValue));<a name="line.8104"></a>
+<span class="sourceLineNo">8105</span>          break;<a name="line.8105"></a>
+<span class="sourceLineNo">8106</span>        case APPEND:<a name="line.8106"></a>
+<span class="sourceLineNo">8107</span>          newCell = reckonDelta(delta, currentValue, columnFamily, now, mutation, (oldCell) -&gt;<a name="line.8107"></a>
+<span class="sourceLineNo">8108</span>            ByteBuffer.wrap(new byte[delta.getValueLength() + oldCell.getValueLength()])<a name="line.8108"></a>
+<span class="sourceLineNo">8109</span>                    .put(oldCell.getValueArray(), oldCell.getValueOffset(), oldCell.getValueLength())<a name="line.8109"></a>
+<span class="sourceLineNo">8110</span>                    .put(delta.getValueArray(), delta.getValueOffset(), delta.getValueLength())<a name="line.8110"></a>
+<span class="sourceLineNo">8111</span>                    .array()<a name="line.8111"></a>
+<span class="sourceLineNo">8112</span>          );<a name="line.8112"></a>
+<span class="sourceLineNo">8113</span>          break;<a name="line.8113"></a>
+<span class="sourceLineNo">8114</span>        default: throw new UnsupportedOperationException(op.toString());<a name="line.8114"></a>
+<span class="sourceLineNo">8115</span>      }<a name="line.8115"></a>
+<span class="sourceLineNo">8116</span>      int newCellSize = PrivateCellUtil.estimatedSerializedSizeOf(newCell);<a name="line.8116"></a>
+<span class="sourceLineNo">8117</span>      if (newCellSize &gt; this.maxCellSize) {<a name="line.8117"></a>
+<span class="sourceLineNo">8118</span>        String msg = "Cell with size " + newCellSize + " exceeds limit of " +<a name="line.8118"></a>
+<span class="sourceLineNo">8119</span>            this.maxCellSize + " bytes";<a name="line.8119"></a>
+<span class="sourceLineNo">8120</span>        if (LOG.isDebugEnabled()) {<a name="line.8120"></a>
+<span class="sourceLineNo">8121</span>          LOG.debug(msg);<a name="line.8121"></a>
+<span class="sourceLineNo">8122</span>        }<a name="line.8122"></a>
+<span class="sourceLineNo">8123</span>        throw new DoNotRetryIOException(msg);<a name="line.8123"></a>
 <span class="sourceLineNo">8124</span>      }<a name="line.8124"></a>
-<span class="sourceLineNo">8125</span>    }<a name="line.8125"></a>
-<span class="sourceLineNo">8126</span><a name="line.8126"></a>
-<span class="sourceLineNo">8127</span>    // Give coprocessors a chance to update the new cells before apply to WAL or memstore<a name="line.8127"></a>
-<span class="sourceLineNo">8128</span>    if (coprocessorHost != null) {<a name="line.8128"></a>
-<span class="sourceLineNo">8129</span>      // Here the operation must be increment or append.<a name="line.8129"></a>
-<span class="sourceLineNo">8130</span>      cellPairs = op == Operation.INCREMENT ?<a name="line.8130"></a>
-<span class="sourceLineNo">8131</span>          coprocessorHost.postIncrementBeforeWAL(mutation, cellPairs) :<a name="line.8131"></a>
-<span class="sourceLineNo">8132</span>          coprocessorHost.postAppendBeforeWAL(mutation, cellPairs);<a name="line.8132"></a>
-<span class="sourceLineNo">8133</span>    }<a name="line.8133"></a>
-<span class="sourceLineNo">8134</span>    return cellPairs.stream().map(Pair::getSecond).collect(Collectors.toList());<a name="line.8134"></a>
-<span class="sourceLineNo">8135</span>  }<a name="line.8135"></a>
-<span class="sourceLineNo">8136</span><a name="line.8136"></a>
-<span class="sourceLineNo">8137</span>  private static Cell reckonDelta(final Cell delta, final Cell currentCell,<a name="line.8137"></a>
-<span class="sourceLineNo">8138</span>                                  final byte[] columnFamily, final long now,<a name="line.8138"></a>
-<span class="sourceLineNo">8139</span>                                  Mutation mutation, Function&lt;Cell, byte[]&gt; supplier) throws IOException {<a name="line.8139"></a>
-<span class="sourceLineNo">8140</span>    // Forward any tags found on the delta.<a name="line.8140"></a>
-<span class="sourceLineNo">8141</span>    List&lt;Tag&gt; tags = TagUtil.carryForwardTags(delta);<a name="line.8141"></a>
-<span class="sourceLineNo">8142</span>    tags = TagUtil.carryForwardTTLTag(tags, mutation.getTTL());<a name="line.8142"></a>
-<span class="sourceLineNo">8143</span>    if (currentCell != null) {<a name="line.8143"></a>
-<span class="sourceLineNo">8144</span>      tags = TagUtil.carryForwardTags(tags, currentCell);<a name="line.8144"></a>
-<span class="sourceLineNo">8145</span>      byte[] newValue = supplier.apply(currentCell);<a name="line.8145"></a>
-<span class="sourceLineNo">8146</span>      return ExtendedCellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.8146"></a>
-<span class="sourceLineNo">8147</span>              .setRow(mutation.getRow(), 0, mutation.getRow().length)<a name="line.8147"></a>
-<span class="sourceLineNo">8148</span>              .setFamily(columnFamily, 0, columnFamily.length)<a name="line.8148"></a>
-<span class="sourceLineNo">8149</span>              // copy the qualifier if the cell is located in shared memory.<a name="line.8149"></a>
-<span class="sourceLineNo">8150</span>              .setQualifier(CellUtil.cloneQualifier(delta))<a name="line.8150"></a>
-<span class="sourceLineNo">8151</span>              .setTimestamp(Math.max(currentCell.getTimestamp() + 1, now))<a name="line.8151"></a>
-<span class="sourceLineNo">8152</span>              .setType(KeyValue.Type.Put.getCode())<a name="line.8152"></a>
-<span class="sourceLineNo">8153</span>              .setValue(newValue, 0, newValue.length)<a name="line.8153"></a>
-<span class="sourceLineNo">8154</span>              .setTags(TagUtil.fromList(tags))<a name="line.8154"></a>
-<span class="sourceLineNo">8155</span>              .build();<a name="line.8155"></a>
-<span class="sourceLineNo">8156</span>    } else {<a name="line.8156"></a>
-<span class="sourceLineNo">8157</span>      PrivateCellUtil.updateLatestStamp(delta, now);<a name="line.8157"></a>
-<span class="sourceLineNo">8158</span>      return CollectionUtils.isEmpty(tags) ? delta : PrivateCellUtil.createCell(delta, tags);<a name="line.8158"></a>
-<span class="sourceLineNo">8159</span>    }<a name="line.8159"></a>
-<span class="sourceLineNo">8160</span>  }<a name="line.8160"></a>
-<span class="sourceLineNo">8161</span><a name="line.8161"></a>
-<span class="sourceLineNo">8162</span>  /**<a name="line.8162"></a>
-<span class="sourceLineNo">8163</span>   * @return Get the long out of the passed in Cell<a name="line.8163"></a>
-<span class="sourceLineNo">8164</span>   */<a name="line.8164"></a>
-<span class="sourceLineNo">8165</span>  private static long getLongValue(final Cell cell) throws DoNotRetryIOException {<a name="line.8165"></a>
-<span class="sourceLineNo">8166</span>    int len = cell.getValueLength();<a name="line.8166"></a>
-<span class="sourceLineNo">8167</span>    if (len != Bytes.SIZEOF_LONG) {<a name="line.8167"></a>
-<span class="sourceLineNo">8168</span>      // throw DoNotRetryIOException instead of IllegalArgumentException<a name="line.8168"></a>
-<span class="sourceLineNo">8169</span>      throw new DoNotRetryIOException("Field is not a long, it's " + len + " bytes wide");<a name="line.8169"></a>
-<span class="sourceLineNo">8170</span>    }<a name="line.8170"></a>
-<span class="sourceLineNo">8171</span>    return PrivateCellUtil.getValueAsLong(cell);<a name="line.8171"></a>
-<span class="sourceLineNo">8172</span>  }<a name="line.8172"></a>
-<span class="sourceLineNo">8173</span><a name="line.8173"></a>
-<span class="sourceLineNo">8174</span>  /**<a name="line.8174"></a>
-<span class="sourceLineNo">8175</span>   * Do a specific Get on passed &lt;code&gt;columnFamily&lt;/code&gt; and column qualifiers.<a name="line.8175"></a>
-<span class="sourceLineNo">8176</span>   * @param mutation Mutation we are doing this Get for.<a name="line.8176"></a>
-<span class="sourceLineNo">8177</span>   * @param store Which column family on row (TODO: Go all Gets in one go)<a name="line.8177"></a>
-<span class="sourceLineNo">8178</span>   * @param coordinates Cells from &lt;code&gt;mutation&lt;/code&gt; used as coordinates applied to Get.<a name="line.8178"></a>
-<span class="sourceLineNo">8179</span>   * @return Return list of Cells found.<a name="line.8179"></a>
-<span class="sourceLineNo">8180</span>   */<a name="line.8180"></a>
-<span class="sourceLineNo">8181</span>  private List&lt;Cell&gt; get(Mutation mutation, HStore store, List&lt;Cell&gt; coordinates,<a name="line.8181"></a>
-<span class="sourceLineNo">8182</span>      IsolationLevel isolation, TimeRange tr) throws IOException {<a name="line.8182"></a>
-<span class="sourceLineNo">8183</span>    // Sort the cells so that they match the order that they appear in the Get results. Otherwise,<a name="line.8183"></a>
-<span class="sourceLineNo">8184</span>    // we won't be able to find the existing values if the cells are not specified in order by the<a name="line.8184"></a>
-<span class="sourceLineNo">8185</span>    // client since cells are in an array list.<a name="line.8185"></a>
-<span class="sourceLineNo">8186</span>    // TODO: I don't get why we are sorting. St.Ack 20150107<a name="line.8186"></a>
-<span class="sourceLineNo">8187</span>    sort(coordinates, store.getComparator());<a name="line.8187"></a>
-<span class="sourceLineNo">8188</span>    Get get = new Get(mutation.getRow());<a name="line.8188"></a>
-<span class="sourceLineNo">8189</span>    if (isolation != null) {<a name="line.8189"></a>
-<span class="sourceLineNo">8190</span>      get.setIsolationLevel(isolation);<a name="line.8190"></a>
-<span class="sourceLineNo">8191</span>    }<a name="line.8191"></a>
-<span class="sourceLineNo">8192</span>    for (Cell cell: coordinates) {<a name="line.8192"></a>
-<span class="sourceLineNo">8193</span>      get.addColumn(store.getColumnFamilyDescriptor().getName(), CellUtil.cloneQualifier(cell));<a name="line.8193"></a>
-<span class="sourceLineNo">8194</span>    }<a name="line.8194"></a>
-<span class="sourceLineNo">8195</span>    // Increments carry time range. If an Increment instance, put it on the Get.<a name="line.8195"></a>
-<span class="sourceLineNo">8196</span>    if (tr != null) {<a name="line.8196"></a>
-<span class="sourceLineNo">8197</span>      get.setTimeRange(tr.getMin(), tr.getMax());<a name="line.8197"></a>
-<span class="sourceLineNo">8198</span>    }<a name="line.8198"></a>
-<span class="sourceLineNo">8199</span>    return get(get, false);<a name="line.8199"></a>
-<span class="sourceLineNo">8200</span>  }<a name="line.8200"></a>
-<span class="sourceLineNo">8201</span><a name="line.8201"></a>
-<span class="sourceLineNo">8202</span>  /**<a name="line.8202"></a>
-<span class="sourceLineNo">8203</span>   * @return Sorted list of &lt;code&gt;cells&lt;/code&gt; using &lt;code&gt;comparator&lt;/code&gt;<a name="line.8203"></a>
-<span class="sourceLineNo">8204</span>   */<a name="line.8204"></a>
-<span class="sourceLineNo">8205</span>  private static List&lt;Cell&gt; sort(List&lt;Cell&gt; cells, final CellComparator comparator) {<a name="line.8205"></a>
-<span class="sourceLineNo">8206</span>    cells.sort(comparator);<a name="line.8206"></a>
-<span class="sourceLineNo">8207</span>    return cells;<a name="line.8207"></a>
-<span class="sourceLineNo">8208</span>  }<a name="line.8208"></a>
-<span class="sourceLineNo">8209</span><a name="line.8209"></a>
-<span class="sourceLineNo">8210</span>  public static final long FIXED_OVERHEAD = ClassSize.align(<a name="line.8210"></a>
-<span class="sourceLineNo">8211</span>      ClassSize.OBJECT +<a name="line.8211"></a>
-<span class="sourceLineNo">8212</span>      ClassSize.ARRAY +<a name="line.8212"></a>
-<span class="sourceLineNo">8213</span>      55 * ClassSize.REFERENCE + 3 * Bytes.SIZEOF_INT +<a name="line.8213"></a>
-<span class="sourceLineNo">8214</span>      (15 * Bytes.SIZEOF_LONG) +<a name="line.8214"></a>
-<span class="sourceLineNo">8215</span>      3 * Bytes.SIZEOF_BOOLEAN);<a name="line.8215"></a>
-<span class="sourceLineNo">8216</span><a name="line.8216"></a>
-<span class="sourceLineNo">8217</span>  // woefully out of date - currently missing:<a name="line.8217"></a>
-<span class="sourceLineNo">8218</span>  // 1 x HashMap - coprocessorServiceHandlers<a name="line.8218"></a>
-<span class="sourceLineNo">8219</span>  // 6 x LongAdder - numMutationsWithoutWAL, dataInMemoryWithoutWAL,<a name="line.8219"></a>
-<span class="sourceLineNo">8220</span>  //   checkAndMutateChecksPassed, checkAndMutateChecksFailed, readRequestsCount,<a name="line.8220"></a>
-<span class="sourceLineNo">8221</span>  //   writeRequestsCount, cpRequestsCount<a name="line.8221"></a>
-<span class="sourceLineNo">8222</span>  // 1 x HRegion$WriteState - writestate<a name="line.8222"></a>
-<span class="sourceLineNo">8223</span>  // 1 x RegionCoprocessorHost - coprocessorHost<a name="line.8223"></a>
-<span class="sourceLineNo">8224</span>  // 1 x RegionSplitPolicy - splitPolicy<a name="line.8224"></a>
-<span class="sourceLineNo">8225</span>  // 1 x MetricsRegion - metricsRegion<a name="line.8225"></a>
-<span class="sourceLineNo">8226</span>  // 1 x MetricsRegionWrapperImpl - metricsRegionWrapper<a name="line.8226"></a>
-<span class="sourceLineNo">8227</span>  public static final long DEEP_OVERHEAD = FIXED_OVERHEAD +<a name="line.8227"></a>
-<span class="sourceLineNo">8228</span>      ClassSize.OBJECT + // closeLock<a name="line.8228"></a>
-<span class="sourceLineNo">8229</span>      (2 * ClassSize.ATOMIC_BOOLEAN) + // closed, closing<a name="line.8229"></a>
-<span class="sourceLineNo">8230</span>      (3 * ClassSize.ATOMIC_LONG) + // numPutsWithoutWAL, dataInMemoryWithoutWAL,<a name="line.8230"></a>
-<span class="sourceLineNo">8231</span>                                    // compactionsFailed<a name="line.8231"></a>
-<span class="sourceLineNo">8232</span>      (2 * ClassSize.CONCURRENT_HASHMAP) +  // lockedRows, scannerReadPoints<a name="line.8232"></a>
-<span class="sourceLineNo">8233</span>      WriteState.HEAP_SIZE + // writestate<a name="line.8233"></a>
-<span class="sourceLineNo">8234</span>      ClassSize.CONCURRENT_SKIPLISTMAP + ClassSize.CONCURRENT_SKIPLISTMAP_ENTRY + // stores<a name="line.8234"></a>
-<span class="sourceLineNo">8235</span>      (2 * ClassSize.REENTRANT_LOCK) + // lock, updatesLock<a name="line.8235"></a>
-<span class="sourceLineNo">8236</span>      MultiVersionConcurrencyControl.FIXED_SIZE // mvcc<a name="line.8236"></a>
-<span class="sourceLineNo">8237</span>      + 2 * ClassSize.TREEMAP // maxSeqIdInStores, replicationScopes<a name="line.8237"></a>
-<span class="sourceLineNo">8238</span>      + 2 * ClassSize.ATOMIC_INTEGER // majorInProgress, minorInProgress<a name="line.8238"></a>
-<span class="sourceLineNo">8239</span>      + ClassSize.STORE_SERVICES // store services<a name="line.8239"></a>
-<span class="sourceLineNo">8240</span>      + StoreHotnessProtector.FIXED_SIZE<a name="line.8240"></a>
-<span class="sourceLineNo">8241</span>      ;<a name="line.8241"></a>
-<span class="sourceLineNo">8242</span><a name="line.8242"></a>
-<span class="sourceLineNo">8243</span>  @Override<a name="line.8243"></a>
-<span class="sourceLineNo">8244</span>  public long heapSize() {<a name="line.8244"></a>
-<span class="sourceLineNo">8245</span>    // this does not take into account row locks, recent flushes, mvcc entries, and more<a name="line.8245"></a>
-<span class="sourceLineNo">8246</span>    return DEEP_OVERHEAD + stores.values().stream().mapToLong(HStore::heapSize).sum();<a name="line.8246"></a>
-<span class="sourceLineNo">8247</span>  }<a name="line.8247"></a>
-<span class="sourceLineNo">8248</span><a name="line.8248"></a>
-<span class="sourceLineNo">8249</span>  /**<a name="line.8249"></a>
-<span class="sourceLineNo">8250</span>   * Registers a new protocol buffer {@link Service} subclass as a coprocessor endpoint to<a name="line.8250"></a>
-<span class="sourceLineNo">8251</span>   * be available for handling Region#execService(com.google.protobuf.RpcController,<a name="line.8251"></a>
-<span class="sourceLineNo">8252</span>   *    org.apache.hadoop.hbase.protobuf.generated.ClientProtos.CoprocessorServiceCall) calls.<a name="line.8252"></a>
-<span class="sourceLineNo">8253</span>   *<a name="line.8253"></a>
-<span class="sourceLineNo">8254</span>   * &lt;p&gt;<a name="line.8254"></a>
-<span class="sourceLineNo">8255</span>   * Only a single instance may be registered per region for a given {@link Service} subclass (the<a name="line.8255"></a>
-<span class="sourceLineNo">8256</span>   * instances are keyed on {@link com.google.protobuf.Descriptors.ServiceDescriptor#getFullName()}.<a name="line.8256"></a>
-<span class="sourceLineNo">8257</span>   * After the first registration, subsequent calls with the same service name will fail with<a name="line.8257"></a>
-<span class="sourceLineNo">8258</span>   * a return value of {@code false}.<a name="line.8258"></a>
-<span class="sourceLineNo">8259</span>   * &lt;/p&gt;<a name="line.8259"></a>
-<span class="sourceLineNo">8260</span>   * @param instance the {@code Service} subclass instance to expose as a coprocessor endpoint<a name="line.8260"></a>
-<span class="sourceLineNo">8261</span>   * @return {@code true} if the registration was successful, {@code false}<a name="line.8261"></a>
-<span class="sourceLineNo">8262</span>   * otherwise<a name="line.8262"></a>
-<span class="sourceLineNo">8263</span>   */<a name="line.8263"></a>
-<span class="sourceLineNo">8264</span>  public boolean registerService(com.google.protobuf.Service instance) {<a name="line.8264"></a>
-<span class="sourceLineNo">8265</span>    /*<a name="line.8265"></a>
-<span class="sourceLineNo">8266</span>     * No stacking of instances is allowed for a single service name<a name="line.8266"></a>
-<span class="sourceLineNo">8267</span>     */<a name="line.8267"></a>
-<span class="sourceLineNo">8268</span>    com.google.protobuf.Descriptors.ServiceDescriptor serviceDesc = instance.getDescriptorForType();<a name="line.8268"></a>
-<span class="sourceLineNo">8269</span>    String serviceName = CoprocessorRpcUtils.getServiceName(serviceDesc);<a name="line.8269"></a>
-<span class="sourceLineNo">8270</span>    if (coprocessorServiceHandlers.containsKey(serviceName)) {<a name="line.8270"></a>
-<span class="sourceLineNo">8271</span>      LOG.error("Coprocessor service " + serviceName +<a name="line.8271"></a>
-<span class="sourceLineNo">8272</span>          " already registered, rejecting request from " + instance);<a name="line.8272"></a>
-<span class="sourceLineNo">8273</span>      return false;<a name="line.8273"></a>
-<span class="sourceLineNo">8274</span>    }<a name="line.8274"></a>
-<span class="sourceLineNo">8275</span><a name="line.8275"></a>
-<span class="sourceLineNo">8276</span>    coprocessorServiceHandlers.put(serviceName, instance);<a name="line.8276"></a>
-<span class="sourceLineNo">8277</span>    if (LOG.isDebugEnabled()) {<a name="line.8277"></a>
-<span class="sourceLineNo">8278</span>      LOG.debug("Registered coprocessor service: region=" +<a name="line.8278"></a>
-<span class="sourceLineNo">8279</span>          Bytes.toStringBinary(getRegionInfo().getRegionName()) +<a name="line.8279"></a>
-<span class="sourceLineNo">8280</span>          " service=" + serviceName);<a name="line.8280"></a>
-<span class="sourceLineNo">8281</span>    }<a name="line.8281"></a>
-<span class="sourceLineNo">8282</span>    return true;<a name="line.8282"></a>
-<span class="sourceLineNo">8283</span>  }<a name="line.8283"></a>
-<span class="sourceLineNo">8284</span><a name="line.8284"></a>
-<span class="sourceLineNo">8285</span>  /**<a name="line.8285"></a>
-<span class="sourceLineNo">8286</span>   * Executes a single protocol buffer coprocessor endpoint {@link Service} method using<a name="line.8286"></a>
-<span class="sourceLineNo">8287</span>   * the registered protocol handlers.  {@link Service} implementations must be registered via the<a name="line.8287"></a>
-<span class="sourceLineNo">8288</span>   * {@link #registerService(com.google.protobuf.Service)}<a name="line.8288"></a>
-<span class="sourceLineNo">8289</span>   * method before they are available.<a name="line.8289"></a>
-<span class="sourceLineNo">8290</span>   *<a name="line.8290"></a>
-<span class="sourceLineNo">8291</span>   * @param controller an {@code RpcContoller} implementation to pass to the invoked service<a name="line.8291"></a>
-<span class="sourceLineNo">8292</span>   * @param call a {@code CoprocessorServiceCall} instance identifying the service, method,<a name="line.8292"></a>
-<span class="sourceLineNo">8293</span>   *     and parameters for the method invocation<a name="line.8293"></a>
-<span class="sourceLineNo">8294</span>   * @return a protocol buffer {@code Message} instance containing the method's result<a name="line.8294"></a>
-<span class="sourceLineNo">8295</span>   * @throws IOException if no registered service handler is found or an error<a name="line.8295"></a>
-<span class="sourceLineNo">8296</span>   *     occurs during the invocation<a name="line.8296"></a>
-<span class="sourceLineNo">8297</span>   * @see #registerService(com.google.protobuf.Service)<a name="line.8297"></a>
-<span class="sourceLineNo">8298</span>   */<a name="line.8298"></a>
-<span class="sourceLineNo">8299</span>  public com.google.protobuf.Message execService(com.google.protobuf.RpcController controller,<a name="line.8299"></a>
-<span class="sourceLineNo">8300</span>      CoprocessorServiceCall call) throws IOException {<a name="line.8300"></a>
-<span class="sourceLineNo">8301</span>    String serviceName = call.getServiceName();<a name="line.8301"></a>
-<span class="sourceLineNo">8302</span>    com.google.protobuf.Service service = coprocessorServiceHandlers.get(serviceName);<a name="line.8302"></a>
-<span class="sourceLineNo">8303</span>    if (service == null) {<a name="line.8303"></a>
-<span class="sourceLineNo">8304</span>      throw new UnknownProtocolException(null, "No registered coprocessor service found for " +<a name="line.8304"></a>
-<span class="sourceLineNo">8305</span>          serviceName + " in region " + Bytes.toStringBinary(getRegionInfo().getRegionName()));<a name="line.8305"></a>
-<span class="sourceLineNo">8306</span>    }<a name="line.8306"></a>
-<span class="sourceLineNo">8307</span>    com.google.protobuf.Descriptors.ServiceDescriptor serviceDesc = service.getDescriptorForType();<a name="line.8307"></a>
-<span class="sourceLineNo">8308</span><a name="line.8308"></a>
-<span class="sourceLineNo">8309</span>    cpRequestsCount.increment();<a name="line.8309"></a>
-<span class="sourceLineNo">8310</span>    String methodName = call.getMethodName();<a name="line.8310"></a>
-<span class="sourceLineNo">8311</span>    com.google.protobuf.Descriptors.MethodDescriptor methodDesc =<a name="line.8311"></a>
-<span class="sourceLineNo">8312</span>        CoprocessorRpcUtils.getMethodDescriptor(methodName, serviceDesc);<a name="line.8312"></a>
+<span class="sourceLineNo">8125</span>      cellPairs.add(new Pair&lt;&gt;(currentValue, newCell));<a name="line.8125"></a>
+<span class="sourceLineNo">8126</span>      // Add to results to get returned to the Client. If null, cilent does not want results.<a name="line.8126"></a>
+<span class="sourceLineNo">8127</span>      if (results != null) {<a name="line.8127"></a>
+<span class="sourceLineNo">8128</span>        results.add(newCell);<a name="line.8128"></a>
+<span class="sourceLineNo">8129</span>      }<a name="line.8129"></a>
+<span class="sourceLineNo">8130</span>    }<a name="line.8130"></a>
+<span class="sourceLineNo">8131</span><a name="line.8131"></a>
+<span class="sourceLineNo">8132</span>    // Give coprocessors a chance to update the new cells before apply to WAL or memstore<a name="line.8132"></a>
+<span class="sourceLineNo">8133</span>    if (coprocessorHost != null) {<a name="line.8133"></a>
+<span class="sourceLineNo">8134</span>      // Here the operation must be increment or append.<a name="line.8134"></a>
+<span class="sourceLineNo">8135</span>      cellPairs = op == Operation.INCREMENT ?<a name="line.8135"></a>
+<span class="sourceLineNo">8136</span>          coprocessorHost.postIncrementBeforeWAL(mutation, cellPairs) :<a name="line.8136"></a>
+<span class="sourceLineNo">8137</span>          coprocessorHost.postAppendBeforeWAL(mutation, cellPairs);<a name="line.8137"></a>
+<span class="sourceLineNo">8138</span>    }<a name="line.8138"></a>
+<span class="sourceLineNo">8139</span>    return cellPairs.stream().map(Pair::getSecond).collect(Collectors.toList());<a name="line.8139"></a>
+<span class="sourceLineNo">8140</span>  }<a name="line.8140"></a>
+<span class="sourceLineNo">8141</span><a name="line.8141"></a>
+<span class="sourceLineNo">8142</span>  private static Cell reckonDelta(final Cell delta, final Cell currentCell,<a name="line.8142"></a>
+<span class="sourceLineNo">8143</span>                                  final byte[] columnFamily, final long now,<a name="line.8143"></a>
+<span class="sourceLineNo">8144</span>                                  Mutation mutation, Function&lt;Cell, byte[]&gt; supplier) throws IOException {<a name="line.8144"></a>
+<span class="sourceLineNo">8145</span>    // Forward any tags found on the delta.<a name="line.8145"></a>
+<span class="sourceLineNo">8146</span>    List&lt;Tag&gt; tags = TagUtil.carryForwardTags(delta);<a name="line.8146"></a>
+<span class="sourceLineNo">8147</span>    tags = TagUtil.carryForwardTTLTag(tags, mutation.getTTL());<a name="line.8147"></a>
+<span class="sourceLineNo">8148</span>    if (currentCell != null) {<a name="line.8148"></a>
+<span class="sourceLineNo">8149</span>      tags = TagUtil.carryForwardTags(tags, currentCell);<a name="line.8149"></a>
+<span class="sourceLineNo">8150</span>      byte[] newValue = supplier.apply(currentCell);<a name="line.8150"></a>
+<span class="sourceLineNo">8151</span>      return ExtendedCellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.8151"></a>
+<span class="sourceLineNo">8152</span>              .setRow(mutation.getRow(), 0, mutation.getRow().length)<a name="line.8152"></a>
+<span class="sourceLineNo">8153</span>              .setFamily(columnFamily, 0, columnFamily.length)<a name="line.8153"></a>
+<span class="sourceLineNo">8154</span>              // copy the qualifier if the cell is located in shared memory.<a name="line.8154"></a>
+<span class="sourceLineNo">8155</span>              .setQualifier(CellUtil.cloneQualifier(delta))<a name="line.8155"></a>
+<span class="sourceLineNo">8156</span>              .setTimestamp(Math.max(currentCell.getTimestamp() + 1, now))<a name="line.8156"></a>
+<span class="sourceLineNo">8157</span>              .setType(KeyValue.Type.Put.getCode())<a name="line.8157"></a>
+<span class="sourceLineNo">8158</span>              .setValue(newValue, 0, newValue.length)<a name="line.8158"></a>
+<span class="sourceLineNo">8159</span>              .setTags(TagUtil.fromList(tags))<a name="line.8159"></a>
+<span class="sourceLineNo">8160</span>              .build();<a name="line.8160"></a>
+<span class="sourceLineNo">8161</span>    } else {<a name="line.8161"></a>
+<span class="sourceLineNo">8162</span>      PrivateCellUtil.updateLatestStamp(delta, now);<a name="line.8162"></a>
+<span class="sourceLineNo">8163</span>      return CollectionUtils.isEmpty(tags) ? delta : PrivateCellUtil.createCell(delta, tags);<a name="line.8163"></a>
+<span class="sourceLineNo">8164</span>    }<a name="line.8164"></a>
+<span class="sourceLineNo">8165</span>  }<a name="line.8165"></a>
+<span class="sourceLineNo">8166</span><a name="line.8166"></a>
+<span class="sourceLineNo">8167</span>  /**<a name="line.8167"></a>
+<span class="sourceLineNo">8168</span>   * @return Get the long out of the passed in Cell<a name="line.8168"></a>
+<span class="sourceLineNo">8169</span>   */<a name="line.8169"></a>
+<span class="sourceLineNo">8170</span>  private static long getLongValue(final Cell cell) throws DoNotRetryIOException {<a name="line.8170"></a>
+<span class="sourceLineNo">8171</span>    int len = cell.getValueLength();<a name="line.8171"></a>
+<span class="sourceLineNo">8172</span>    if (len != Bytes.SIZEOF_LONG) {<a name="line.8172"></a>
+<span class="sourceLineNo">8173</span>      // throw DoNotRetryIOException instead of IllegalArgumentException<a name="line.8173"></a>
+<span class="sourceLineNo">8174</span>      throw new DoNotRetryIOException("Field is not a long, it's " + len + " bytes wide");<a name="line.8174"></a>
+<span class="sourceLineNo">8175</span>    }<a name="line.8175"></a>
+<span class="sourceLineNo">8176</span>    return PrivateCellUtil.getValueAsLong(cell);<a name="line.8176"></a>
+<span class="sourceLineNo">8177</span>  }<a name="line.8177"></a>
+<span class="sourceLineNo">8178</span><a name="line.8178"></a>
+<span class="sourceLineNo">8179</span>  /**<a name="line.8179"></a>
+<span class="sourceLineNo">8180</span>   * Do a specific Get on passed &lt;code&gt;columnFamily&lt;/code&gt; and column qualifiers.<a name="line.8180"></a>
+<span class="sourceLineNo">8181</span>   * @param mutation Mutation we are doing this Get for.<a name="line.8181"></a>
+<span class="sourceLineNo">8182</span>   * @param store Which column family on row (TODO: Go all Gets in one go)<a name="line.8182"></a>
+<span class="sourceLineNo">8183</span>   * @param coordinates Cells from &lt;code&gt;mutation&lt;/code&gt; used as coordinates applied to Get.<a name="line.8183"></a>
+<span class="sourceLineNo">8184</span>   * @return Return list of Cells found.<a name="line.8184"></a>
+<span class="sourceLineNo">8185</span>   */<a name="line.8185"></a>
+<span class="sourceLineNo">8186</span>  private List&lt;Cell&gt; get(Mutation mutation, HStore store, List&lt;Cell&gt; coordinates,<a name="line.8186"></a>
+<span class="sourceLineNo">8187</span>      IsolationLevel isolation, TimeRange tr) throws IOException {<a name="line.8187"></a>
+<span class="sourceLineNo">8188</span>    // Sort the cells so that they match the order that they appear in the Get results. Otherwise,<a name="line.8188"></a>
+<span class="sourceLineNo">8189</span>    // we won't be able to find the existing values if the cells are not specified in order by the<a name="line.8189"></a>
+<span class="sourceLineNo">8190</span>    // client since cells are in an array list.<a name="line.8190"></a>
+<span class="sourceLineNo">8191</span>    // TODO: I don't get why we are sorting. St.Ack 20150107<a name="line.8191"></a>
+<span class="sourceLineNo">8192</span>    sort(coordinates, store.getComparator());<a name="line.8192"></a>
+<span class="sourceLineNo">8193</span>    Get get = new Get(mutation.getRow());<a name="line.8193"></a>
+<span class="sourceLineNo">8194</span>    if (isolation != null) {<a name="line.8194"></a>
+<span class="sourceLineNo">8195</span>      get.setIsolationLevel(isolation);<a name="line.8195"></a>
+<span class="sourceLineNo">8196</span>    }<a name="line.8196"></a>
+<span class="sourceLineNo">8197</span>    for (Cell cell: coordinates) {<a name="line.8197"></a>
+<span class="sourceLineNo">8198</span>      get.addColumn(store.getColumnFamilyDescriptor().getName(), CellUtil.cloneQualifier(cell));<a name="line.8198"></a>
+<span class="sourceLineNo">8199</span>    }<a name="line.8199"></a>
+<span class="sourceLineNo">8200</span>    // Increments carry time range. If an Increment instance, put it on the Get.<a name="line.8200"></a>
+<span class="sourceLineNo">8201</span>    if (tr != null) {<a name="line.8201"></a>
+<span class="sourceLineNo">8202</span>      get.setTimeRange(tr.getMin(), tr.getMax());<a name="line.8202"></a>
+<span class="sourceLineNo">8203</span>    }<a name="line.8203"></a>
+<span class="sourceLineNo">8204</span>    return get(get, false);<a name="line.8204"></a>
+<span class="sourceLineNo">8205</span>  }<a name="line.8205"></a>
+<span class="sourceLineNo">8206</span><a name="line.8206"></a>
+<span class="sourceLineNo">8207</span>  /**<a name="line.8207"></a>
+<span class="sourceLineNo">8208</span>   * @return Sorted list of &lt;code&gt;cells&lt;/code&gt; using &lt;code&gt;comparator&lt;/code&gt;<a name="line.8208"></a>
+<span class="sourceLineNo">8209</span>   */<a name="line.8209"></a>
+<span class="sourceLineNo">8210</span>  private static List&lt;Cell&gt; sort(List&lt;Cell&gt; cells, final CellComparator comparator) {<a name="line.8210"></a>
+<span class="sourceLineNo">8211</span>    cells.sort(comparator);<a name="line.8211"></a>
+<span class="sourceLineNo">8212</span>    return cells;<a name="line.8212"></a>
+<span class="sourceLineNo">8213</span>  }<a name="line.8213"></a>
+<span class="sourceLineNo">8214</span><a name="line.8214"></a>
+<span class="sourceLineNo">8215</span>  public static final long FIXED_OVERHEAD = ClassSize.align(<a name="line.8215"></a>
+<span class="sourceLineNo">8216</span>      ClassSize.OBJECT +<a name="line.8216"></a>
+<span class="sourceLineNo">8217</span>      ClassSize.ARRAY +<a name="line.8217"></a>
+<span class="sourceLineNo">8218</span>      55 * ClassSize.REFERENCE + 3 * Bytes.SIZEOF_INT +<a name="line.8218"></a>
+<span class="sourceLineNo">8219</span>      (15 * Bytes.SIZEOF_LONG) +<a name="line.8219"></a>
+<span class="sourceLineNo">8220</span>      3 * Bytes.SIZEOF_BOOLEAN);<a name="line.8220"></a>
+<span class="sourceLineNo">8221</span><a name="line.8221"></a>
+<span class="sourceLineNo">8222</span>  // woefully out of date - currently missing:<a name="line.8222"></a>
+<span class="sourceLineNo">8223</span>  // 1 x HashMap - coprocessorServiceHandlers<a name="line.8223"></a>
+<span class="sourceLineNo">8224</span>  // 6 x LongAdder - numMutationsWithoutWAL, dataInMemoryWithoutWAL,<a name="line.8224"></a>
+<span class="sourceLineNo">8225</span>  //   checkAndMutateChecksPassed, checkAndMutateChecksFailed, readRequestsCount,<a name="line.8225"></a>
+<span class="sourceLineNo">8226</span>  //   writeRequestsCount, cpRequestsCount<a name="line.8226"></a>
+<span class="sourceLineNo">8227</span>  // 1 x HRegion$WriteState - writestate<a name="line.8227"></a>
+<span class="sourceLineNo">8228</span>  // 1 x RegionCoprocessorHost - coprocessorHost<a name="line.8228"></a>
+<span class="sourceLineNo">8229</span>  // 1 x RegionSplitPolicy - splitPolicy<a name="line.8229"></a>
+<span class="sourceLineNo">8230</span>  // 1 x MetricsRegion - metricsRegion<a name="line.8230"></a>
+<span class="sourceLineNo">8231</span>  // 1 x MetricsRegionWrapperImpl - metricsRegionWrapper<a name="line.8231"></a>
+<span class="sourceLineNo">8232</span>  public static final long DEEP_OVERHEAD = FIXED_OVERHEAD +<a name="line.8232"></a>
+<span class="sourceLineNo">8233</span>      ClassSize.OBJECT + // closeLock<a name="line.8233"></a>
+<span class="sourceLineNo">8234</span>      (2 * ClassSize.ATOMIC_BOOLEAN) + // closed, closing<a name="line.8234"></a>
+<span class="sourceLineNo">8235</span>      (3 * ClassSize.ATOMIC_LONG) + // numPutsWithoutWAL, dataInMemoryWithoutWAL,<a name="line.8235"></a>
+<span class="sourceLineNo">8236</span>                                    // compactionsFailed<a name="line.8236"></a>
+<span class="sourceLineNo">8237</span>      (2 * ClassSize.CONCURRENT_HASHMAP) +  // lockedRows, scannerReadPoints<a name="line.8237"></a>
+<span class="sourceLineNo">8238</span>      WriteState.HEAP_SIZE + // writestate<a name="line.8238"></a>
+<span class="sourceLineNo">8239</span>      ClassSize.CONCURRENT_SKIPLISTMAP + ClassSize.CONCURRENT_SKIPLISTMAP_ENTRY + // stores<a name="line.8239"></a>
+<span class="sourceLineNo">8240</span>      (2 * ClassSize.REENTRANT_LOCK) + // lock, updatesLock<a name="line.8240"></a>
+<span class="sourceLineNo">8241</span>      MultiVersionConcurrencyControl.FIXED_SIZE // mvcc<a name="line.8241"></a>
+<span class="sourceLineNo">8242</span>      + 2 * ClassSize.TREEMAP // maxSeqIdInStores, replicationScopes<a name="line.8242"></a>
+<span class="sourceLineNo">8243</span>      + 2 * ClassSize.ATOMIC_INTEGER // majorInProgress, minorInProgress<a name="line.8243"></a>
+<span class="sourceLineNo">8244</span>      + ClassSize.STORE_SERVICES // store services<a name="line.8244"></a>
+<span class="sourceLineNo">8245</span>      + StoreHotnessProtector.FIXED_SIZE<a name="line.8245"></a>
+<span class="sourceLineNo">8246</span>      ;<a name="line.8246"></a>
+<span class="sourceLineNo">8247</span><a name="line.8247"></a>
+<span class="sourceLineNo">8248</span>  @Override<a name="line.8248"></a>
+<span class="sourceLineNo">8249</span>  public long heapSize() {<a name="line.8249"></a>
+<span class="sourceLineNo">8250</span>    // this does not take into account row locks, recent flushes, mvcc entries, and more<a name="line.8250"></a>
+<span class="sourceLineNo">8251</span>    return DEEP_OVERHEAD + stores.values().stream().mapToLong(HStore::heapSize).sum();<a name="line.8251"></a>
+<span class="sourceLineNo">8252</span>  }<a name="line.8252"></a>
+<span class="sourceLineNo">8253</span><a name="line.8253"></a>
+<span class="sourceLineNo">8254</span>  /**<a name="line.8254"></a>
+<span class="sourceLineNo">8255</span>   * Registers a new protocol buffer {@link Service} subclass as a coprocessor endpoint to<a name="line.8255"></a>
+<span class="sourceLineNo">8256</span>   * be available for handling Region#execService(com.google.protobuf.RpcController,<a name="line.8256"></a>
+<span class="sourceLineNo">8257</span>   *    org.apache.hadoop.hbase.protobuf.generated.ClientProtos.CoprocessorServiceCall) calls.<a name="line.8257"></a>
+<span class="sourceLineNo">8258</span>   *<a name="line.8258"></a>
+<span class="sourceLineNo">8259</span>   * &lt;p&gt;<a name="line.8259"></a>
+<span class="sourceLineNo">8260</span>   * Only a single instance may be registered per region for a given {@link Service} subclass (the<a name="line.8260"></a>
+<span class="sourceLineNo">8261</span>   * instances are keyed on {@link com.google.protobuf.Descriptors.ServiceDescriptor#getFullName()}.<a name="line.8261"></a>
+<span class="sourceLineNo">8262</span>   * After the first registration, subsequent calls with the same service name will fail with<a name="line.8262"></a>
+<span class="sourceLineNo">8263</span>   * a return value of {@code false}.<a name="line.8263"></a>
+<span class="sourceLineNo">8264</span>   * &lt;/p&gt;<a name="line.8264"></a>
+<span class="sourceLineNo">8265</span>   * @param instance the {@code Service} subclass instance to expose as a coprocessor endpoint<a name="line.8265"></a>
+<span class="sourceLineNo">8266</span>   * @return {@code true} if the registration was successful, {@code false}<a name="line.8266"></a>
+<span class="sourceLineNo">8267</span>   * otherwise<a name="line.8267"></a>
+<span class="sourceLineNo">8268</span>   */<a name="line.8268"></a>
+<span class="sourceLineNo">8269</span>  public boolean registerService(com.google.protobuf.Service instance) {<a name="line.8269"></a>
+<span class="sourceLineNo">8270</span>    /*<a name="line.8270"></a>
+<span class="sourceLineNo">8271</span>     * No stacking of instances is allowed for a single service name<a name="line.8271"></a>
+<span class="sourceLineNo">8272</span>     */<a name="line.8272"></a>
+<span class="sourceLineNo">8273</span>    com.google.protobuf.Descriptors.ServiceDescriptor serviceDesc = instance.getDescriptorForType();<a name="line.8273"></a>
+<span class="sourceLineNo">8274</span>    String serviceName = CoprocessorRpcUtils.getServiceName(serviceDesc);<a name="line.8274"></a>
+<span class="sourceLineNo">8275</span>    if (coprocessorServiceHandlers.containsKey(serviceName)) {<a name="line.8275"></a>
+<span class="sourceLineNo">8276</span>      LOG.error("Coprocessor service " + serviceName +<a name="line.8276"></a>
+<span class="sourceLineNo">8277</span>          " already registered, rejecting request from " + instance);<a name="line.8277"></a>
+<span class="sourceLineNo">8278</span>      return false;<a name="line.8278"></a>
+<span class="sourceLineNo">8279</span>    }<a name="line.8279"></a>
+<span class="sourceLineNo">8280</span><a name="line.8280"></a>
+<span class="sourceLineNo">8281</span>    coprocessorServiceHandlers.put(serviceName, instance);<a name="line.8281"></a>
+<span class="sourceLineNo">8282</span>    if (LOG.isDebugEnabled()) {<a name="line.8282"></a>
+<span class="sourceLineNo">8283</span>      LOG.debug("Registered coprocessor service: region=" +<a name="line.8283"></a>
+<span class="sourceLineNo">8284</span>          Bytes.toStringBinary(getRegionInfo().getRegionName()) +<a name="line.8284"></a>
+<span class="sourceLineNo">8285</span>          " service=" + serviceName);<a name="line.8285"></a>
+<span class="sourceLineNo">8286</span>    }<a name="line.8286"></a>
+<span class="sourceLineNo">8287</span>    return true;<a name="line.8287"></a>
+<span class="sourceLineNo">8288</span>  }<a name="line.8288"></a>
+<span class="sourceLineNo">8289</span><a name="line.8289"></a>
+<span class="sourceLineNo">8290</span>  /**<a name="line.8290"></a>
+<span class="sourceLineNo">8291</span>   * Executes a single protocol buffer coprocessor endpoint {@link Service} method using<a name="line.8291"></a>
+<span class="sourceLineNo">8292</span>   * the registered protocol handlers.  {@link Service} implementations must be registered via the<a name="line.8292"></a>
+<span class="sourceLineNo">8293</span>   * {@link #registerService(com.google.protobuf.Service)}<a name="line.8293"></a>
+<span class="sourceLineNo">8294</span>   * method before they are available.<a name="line.8294"></a>
+<span class="sourceLineNo">8295</span>   *<a name="line.8295"></a>
+<span class="sourceLineNo">8296</span>   * @param controller an {@code RpcContoller} implementation to pass to the invoked service<a name="line.8296"></a>
+<span class="sourceLineNo">8297</span>   * @param call a {@code CoprocessorServiceCall} instance identifying the service, method,<a name="line.8297"></a>
+<span class="sourceLineNo">8298</span>   *     and parameters for the method invocation<a name="line.8298"></a>
+<span class="sourceLineNo">8299</span>   * @return a protocol buffer {@code Message} instance containing the method's result<a name="line.8299"></a>
+<span class="sourceLineNo">8300</span>   * @throws IOException if no registered service handler is found or an error<a name="line.8300"></a>
+<span class="sourceLineNo">8301</span>   *     occurs during the invocation<a name="line.8301"></a>
+<span class="sourceLineNo">8302</span>   * @see #registerService(com.google.protobuf.Service)<a name="line.8302"></a>
+<span class="sourceLineNo">8303</span>   */<a name="line.8303"></a>
+<span class="sourceLineNo">8304</span>  public com.google.protobuf.Message execService(com.google.protobuf.RpcController controller,<a name="line.8304"></a>
+<span class="sourceLineNo">8305</span>      CoprocessorServiceCall call) throws IOException {<a name="line.8305"></a>
+<span class="sourceLineNo">8306</span>    String serviceName = call.getServiceName();<a name="line.8306"></a>
+<span class="sourceLineNo">8307</span>    com.google.protobuf.Service service = coprocessorServiceHandlers.get(serviceName);<a name="line.8307"></a>
+<span class="sourceLineNo">8308</span>    if (service == null) {<a name="line.8308"></a>
+<span class="sourceLineNo">8309</span>      throw new UnknownProtocolException(null, "No registered coprocessor service found for " +<a name="line.8309"></a>
+<span class="sourceLineNo">8310</span>          serviceName + " in region " + Bytes.toStringBinary(getRegionInfo().getRegionName()));<a name="line.8310"></a>
+<span class="sourceLineNo">8311</span>    }<a name="line.8311"></a>
+<span class="sourceLineNo">8312</span>    com.google.protobuf.Descriptors.ServiceDescriptor serviceDesc = service.getDescriptorForType();<a name="line.8312"></a>
 <span class="sourceLineNo">8313</span><a name="line.8313"></a>
-<span class="sourceLineNo">8314</span>    com.google.protobuf.Message.Builder builder =<a name="line.8314"></a>
-<span class="sourceLineNo">8315</span>        service.getRequestPrototype(methodDesc).newBuilderForType();<a name="line.8315"></a>
-<span class="sourceLineNo">8316</span><a name="line.8316"></a>
-<span class="sourceLineNo">8317</span>    org.apache.hadoop.hbase.protobuf.ProtobufUtil.mergeFrom(builder,<a name="line.8317"></a>
-<span class="sourceLineNo">8318</span>        call.getRequest().toByteArray());<a name="line.8318"></a>
-<span class="sourceLineNo">8319</span>    com.google.protobuf.Message request =<a name="line.8319"></a>
-<span class="sourceLineNo">8320</span>        CoprocessorRpcUtils.getRequest(service, methodDesc, call.getRequest());<a name="line.8320"></a>
+<span class="sourceLineNo">8314</span>    cpRequestsCount.increment();<a name="line.8314"></a>
+<span class="sourceLineNo">8315</span>    String methodName = call.getMethodName();<a name="line.8315"></a>
+<span class="sourceLineNo">8316</span>    com.google.protobuf.Descriptors.MethodDescriptor methodDesc =<a name="line.8316"></a>
+<span class="sourceLineNo">8317</span>        CoprocessorRpcUtils.getMethodDescriptor(methodName, serviceDesc);<a name="line.8317"></a>
+<span class="sourceLineNo">8318</span><a name="line.8318"></a>
+<span class="sourceLineNo">8319</span>    com.google.protobuf.Message.Builder builder =<a name="line.8319"></a>
+<span class="sourceLineNo">8320</span>        service.getRequestPrototype(methodDesc).newBuilderForType();<a name="line.8320"></a>
 <span class="sourceLineNo">8321</span><a name="line.8321"></a>
-<span class="sourceLineNo">8322</span>    if (coprocessorHost != null) {<a name="line.8322"></a>
-<span class="sourceLineNo">8323</span>      request = coprocessorHost.preEndpointInvocation(service, methodName, request);<a name="line.8323"></a>
-<span class="sourceLineNo">8324</span>    }<a name="line.8324"></a>
-<span class="sourceLineNo">8325</span><a name="line.8325"></a>
-<span class="sourceLineNo">8326</span>    final com.google.protobuf.Message.Builder responseBuilder =<a name="line.8326"></a>
-<span class="sourceLineNo">8327</span>        service.getResponsePrototype(methodDesc).newBuilderForType();<a name="line.8327"></a>
-<span class="sourceLineNo">8328</span>    service.callMethod(methodDesc, controller, request,<a name="line.8328"></a>
-<span class="sourceLineNo">8329</span>        new com.google.protobuf.RpcCallback&lt;com.google.protobuf.Message&gt;() {<a name="line.8329"></a>
-<span class="sourceLineNo">8330</span>      @Override<a name="line.8330"></a>
-<span class="sourceLineNo">8331</span>      public void run(com.google.protobuf.Message message) {<a name="line.8331"></a>
-<span class="sourceLineNo">8332</span>        if (message != null) {<a name="line.8332"></a>
-<span class="sourceLineNo">8333</span>          responseBuilder.mergeFrom(message);<a name="line.8333"></a>
-<span class="sourceLineNo">8334</span>        }<a name="line.8334"></a>
-<span class="sourceLineNo">8335</span>      }<a name="line.8335"></a>
-<span class="sourceLineNo">8336</span>    });<a name="line.8336"></a>
-<span class="sourceLineNo">8337</span><a name="line.8337"></a>
-<span class="sourceLineNo">8338</span>    if (coprocessorHost != null) {<a name="line.8338"></a>
-<span class="sourceLineNo">8339</span>      coprocessorHost.postEndpointInvocation(service, methodName, request, responseBuilder);<a name="line.8339"></a>
-<span class="sourceLineNo">8340</span>    }<a name="line.8340"></a>
-<span class="sourceLineNo">8341</span>    IOException exception =<a name="line.8341"></a>
-<span class="sourceLineNo">8342</span>        org.apache.hadoop.hbase.ipc.CoprocessorRpcUtils.getControllerException(controller);<a name="line.8342"></a>
-<span class="sourceLineNo">8343</span>    if (exception != null) {<a name="line.8343"></a>
-<span class="sourceLineNo">8344</span>      throw exception;<a name="line.8344"></a>
+<span class="sourceLineNo">8322</span>    org.apache.hadoop.hbase.protobuf.ProtobufUtil.mergeFrom(builder,<a name="line.8322"></a>
+<span class="sourceLineNo">8323</span>        call.getRequest().toByteArray());<a name="line.8323"></a>
+<span class="sourceLineNo">8324</span>    com.google.protobuf.Message request =<a name="line.8324"></a>
+<span class="sourceLineNo">8325</span>        CoprocessorRpcUtils.getRequest(service, methodDesc, call.getRequest());<a name="line.8325"></a>
+<span class="sourceLineNo">8326</span><a name="line.8326"></a>
+<span class="sourceLineNo">8327</span>    if (coprocessorHost != null) {<a name="line.8327"></a>
+<span class="sourceLineNo">8328</span>      request = coprocessorHost.preEndpointInvocation(service, methodName, request);<a name="line.8328"></a>
+<span class="sourceLineNo">8329</span>    }<a name="line.8329"></a>
+<span class="sourceLineNo">8330</span><a name="line.8330"></a>
+<span class="sourceLineNo">8331</span>    final com.google.protobuf.Message.Builder responseBuilder =<a name="line.8331"></a>
+<span class="sourceLineNo">8332</span>        service.getResponsePrototype(methodDesc).newBuilderForType();<a name="line.8332"></a>
+<span class="sourceLineNo">8333</span>    service.callMethod(methodDesc, controller, request,<a name="line.8333"></a>
+<span class="sourceLineNo">8334</span>        new com.google.protobuf.RpcCallback&lt;com.google.protobuf.Message&gt;() {<a name="line.8334"></a>
+<span class="sourceLineNo">8335</span>      @Override<a name="line.8335"></a>
+<span class="sourceLineNo">8336</span>      public void run(com.google.protobuf.Message message) {<a name="line.8336"></a>
+<span class="sourceLineNo">8337</span>        if (message != null) {<a name="line.8337"></a>
+<span class="sourceLineNo">8338</span>          responseBuilder.mergeFrom(message);<a name="line.8338"></a>
+<span class="sourceLineNo">8339</span>        }<a name="line.8339"></a>
+<span class="sourceLineNo">8340</span>      }<a name="line.8340"></a>
+<span class="sourceLineNo">8341</span>    });<a name="line.8341"></a>
+<span class="sourceLineNo">8342</span><a name="line.8342"></a>
+<span class="sourceLineNo">8343</span>    if (coprocessorHost != null) {<a name="line.8343"></a>
+<span class="sourceLineNo">8344</span>      coprocessorHost.postEndpointInvocation(service, methodName, request, responseBuilder);<a name="line.8344"></a>
 <span class="sourceLineNo">8345</span>    }<a name="line.8345"></a>
-<span class="sourceLineNo">8346</span><a name="line.8346"></a>
-<span class="sourceLineNo">8347</span>    return responseBuilder.build();<a name="line.8347"></a>
-<span class="sourceLineNo">8348</span>  }<a name="line.8348"></a>
-<span class="sourceLineNo">8349</span><a name="line.8349"></a>
-<span class="sourceLineNo">8350</span>  boolean shouldForceSplit() {<a name="line.8350"></a>
-<span class="sourceLineNo">8351</span>    return this.splitRequest;<a name="line.8351"></a>
-<span class="sourceLineNo">8352</span>  }<a name="line.8352"></a>
-<span class="sourceLineNo">8353</span><a name="line.8353"></a>
-<span class="sourceLineNo">8354</span>  byte[] getExplicitSplitPoint() {<a name="line.8354"></a>
-<span class="sourceLineNo">8355</span>    return this.explicitSplitPoint;<a name="line.8355"></a>
-<span class="sourceLineNo">8356</span>  }<a name="line.8356"></a>
-<span class="sourceLineNo">8357</span><a name="line.8357"></a>
-<span class="sourceLineNo">8358</span>  void forceSplit(byte[] sp) {<a name="line.8358"></a>
-<span class="sourceLineNo">8359</span>    // This HRegion will go away after the forced split is successful<a name="line.8359"></a>
-<span class="sourceLineNo">8360</span>    // But if a forced split fails, we need to clear forced split.<a name="line.8360"></a>
-<span class="sourceLineNo">8361</span>    this.splitRequest = true;<a name="line.8361"></a>
-<span class="sourceLineNo">8362</span>    if (sp != null) {<a name="line.8362"></a>
-<span class="sourceLineNo">8363</span>      this.explicitSplitPoint = sp;<a name="line.8363"></a>
-<span class="sourceLineNo">8364</span>    }<a name="line.8364"></a>
-<span class="sourceLineNo">8365</span>  }<a name="line.8365"></a>
-<span class="sourceLineNo">8366</span><a name="line.8366"></a>
-<span class="sourceLineNo">8367</span>  void clearSplit() {<a name="line.8367"></a>
-<span class="sourceLineNo">8368</span>    this.splitRequest = false;<a name="line.8368"></a>
-<span class="sourceLineNo">8369</span>    this.explicitSplitPoint = null;<a name="line.8369"></a>
+<span class="sourceLineNo">8346</span>    IOException exception =<a name="line.8346"></a>
+<span class="sourceLineNo">8347</span>        org.apache.hadoop.hbase.ipc.CoprocessorRpcUtils.getControllerException(controller);<a name="line.8347"></a>
+<span class="sourceLineNo">8348</span>    if (exception != null) {<a name="line.8348"></a>
+<span class="sourceLineNo">8349</span>      throw exception;<a name="line.8349"></a>
+<span class="sourceLineNo">8350</span>    }<a name="line.8350"></a>
+<span class="sourceLineNo">8351</span><a name="line.8351"></a>
+<span class="sourceLineNo">8352</span>    return responseBuilder.build();<a name="line.8352"></a>
+<span class="sourceLineNo">8353</span>  }<a name="line.8353"></a>
+<span class="sourceLineNo">8354</span><a name="line.8354"></a>
+<span class="sourceLineNo">8355</span>  boolean shouldForceSplit() {<a name="line.8355"></a>
+<span class="sourceLineNo">8356</span>    return this.splitRequest;<a name="line.8356"></a>
+<span class="sourceLineNo">8357</span>  }<a name="line.8357"></a>
+<span class="sourceLineNo">8358</span><a name="line.8358"></a>
+<span class="sourceLineNo">8359</span>  byte[] getExplicitSplitPoint() {<a name="line.8359"></a>
+<span class="sourceLineNo">8360</span>    return this.explicitSplitPoint;<a name="line.8360"></a>
+<span class="sourceLineNo">8361</span>  }<a name="line.8361"></a>
+<span class="sourceLineNo">8362</span><a name="line.8362"></a>
+<span class="sourceLineNo">8363</span>  void forceSplit(byte[] sp) {<a name="line.8363"></a>
+<span class="sourceLineNo">8364</span>    // This HRegion will go away after the forced split is successful<a name="line.8364"></a>
+<span class="sourceLineNo">8365</span>    // But if a forced split fails, we need to clear forced split.<a name="line.8365"></a>
+<span class="sourceLineNo">8366</span>    this.splitRequest = true;<a name="line.8366"></a>
+<span class="sourceLineNo">8367</span>    if (sp != null) {<a name="line.8367"></a>
+<span class="sourceLineNo">8368</span>      this.explicitSplitPoint = sp;<a name="line.8368"></a>
+<span class="sourceLineNo">8369</span>    }<a name="line.8369"></a>
 <span class="sourceLineNo">8370</span>  }<a name="line.8370"></a>
 <span class="sourceLineNo">8371</span><a name="line.8371"></a>
-<span class="sourceLineNo">8372</span>  /**<a name="line.8372"></a>
-<span class="sourceLineNo">8373</span>   * Return the splitpoint. null indicates the region isn't splittable<a name="line.8373"></a>
-<span class="sourceLineNo">8374</span>   * If the splitpoint isn't explicitly specified, it will go over the stores<a name="line.8374"></a>
-<span class="sourceLineNo">8375</span>   * to find the best splitpoint. Currently the criteria of best splitpoint<a name="line.8375"></a>
-<span class="sourceLineNo">8376</span>   * is based on the size of the store.<a name="line.8376"></a>
-<span class="sourceLineNo">8377</span>   */<a name="line.8377"></a>
-<span class="sourceLineNo">8378</span>  public byte[] checkSplit() {<a name="line.8378"></a>
-<span class="sourceLineNo">8379</span>    // Can't split META<a name="line.8379"></a>
-<span class="sourceLineNo">8380</span>    if (this.getRegionInfo().isMetaRegion()) {<a name="line.8380"></a>
-<span class="sourceLineNo">8381</span>      if (shouldForceSplit()) {<a name="line.8381"></a>
-<span class="sourceLineNo">8382</span>        LOG.warn("Cannot split meta region in HBase 0.20 and above");<a name="line.8382"></a>
-<span class="sourceLineNo">8383</span>      }<a name="line.8383"></a>
-<span class="sourceLineNo">8384</span>      return null;<a name="line.8384"></a>
-<span class="sourceLineNo">8385</span>    }<a name="line.8385"></a>
-<span class="sourceLineNo">8386</span><a name="line.8386"></a>
-<span class="sourceLineNo">8387</span>    // Can't split a region that is closing.<a name="line.8387"></a>
-<span class="sourceLineNo">8388</span>    if (this.isClosing()) {<a name="line.8388"></a>
+<span class="sourceLineNo">8372</span>  void clearSplit() {<a name="line.8372"></a>
+<span class="sourceLineNo">8373</span>    this.splitRequest = false;<a name="line.8373"></a>
+<span class="sourceLineNo">8374</span>    this.explicitSplitPoint = null;<a name="line.8374"></a>
+<span class="sourceLineNo">8375</span>  }<a name="line.8375"></a>
+<span class="sourceLineNo">8376</span><a name="line.8376"></a>
+<span class="sourceLineNo">8377</span>  /**<a name="line.8377"></a>
+<span class="sourceLineNo">8378</span>   * Return the splitpoint. null indicates the region isn't splittable<a name="line.8378"></a>
+<span class="sourceLineNo">8379</span>   * If the splitpoint isn't explicitly specified, it will go over the stores<a name="line.8379"></a>
+<span class="sourceLineNo">8380</span>   * to find the best splitpoint. Currently the criteria of best splitpoint<a name="line.8380"></a>
+<span class="sourceLineNo">8381</span>   * is based on the size of the store.<a name="line.8381"></a>
+<span class="sourceLineNo">8382</span>   */<a name="line.8382"></a>
+<span class="sourceLineNo">8383</span>  public byte[] checkSplit() {<a name="line.8383"></a>
+<span class="sourceLineNo">8384</span>    // Can't split META<a name="line.8384"></a>
+<span class="sourceLineNo">8385</span>    if (this.getRegionInfo().isMetaRegion()) {<a name="line.8385"></a>
+<span class="sourceLineNo">8386</span>      if (shouldForceSplit()) {<a name="line.8386"></a>
+<span class="sourceLineNo">8387</span>        LOG.warn("Cannot split meta region in HBase 0.20 and above");<a name="line.8387"></a>
+<span class="sourceLineNo">8388</span>      }<a name="line.8388"></a>
 <span class="sourceLineNo">8389</span>      return null;<a name="line.8389"></a>
 <span class="sourceLineNo">8390</span>    }<a name="line.8390"></a>
 <span class="sourceLineNo">8391</span><a name="line.8391"></a>
-<span class="sourceLineNo">8392</span>    if (!splitPolicy.shouldSplit()) {<a name="line.8392"></a>
-<span class="sourceLineNo">8393</span>      return null;<a name="line.8393"></a>
-<span class="sourceLineNo">8394</span>    }<a name="line.8394"></a>
-<span class="sourceLineNo">8395</span><a name="line.8395"></a>
-<span class="sourceLineNo">8396</span>    byte[] ret = splitPolicy.getSplitPoint();<a name="line.8396"></a>
-<span class="sourceLineNo">8397</span><a name="line.8397"></a>
-<span class="sourceLineNo">8398</span>    if (ret != null) {<a name="line.8398"></a>
-<span class="sourceLineNo">8399</span>      try {<a name="line.8399"></a>
-<span class="sourceLineNo">8400</span>        checkRow(ret, "calculated split");<a name="line.8400"></a>
-<span class="sourceLineNo">8401</span>      } catch (IOException e) {<a name="line.8401"></a>
-<span class="sourceLineNo">8402</span>        LOG.error("Ignoring invalid split", e);<a name="line.8402"></a>
-<span class="sourceLineNo">8403</span>        return null;<a name="line.8403"></a>
-<span class="sourceLineNo">8404</span>      }<a name="line.8404"></a>
-<span class="sourceLineNo">8405</span>    }<a name="line.8405"></a>
-<span class="sourceLineNo">8406</span>    return ret;<a name="line.8406"></a>
-<span class="sourceLineNo">8407</span>  }<a name="line.8407"></a>
-<span class="sourceLineNo">8408</span><a name="line.8408"></a>
-<span class="sourceLineNo">8409</span>  /**<a name="line.8409"></a>
-<span class="sourceLineNo">8410</span>   * @return The priority that this region should have in the compaction queue<a name="line.8410"></a>
-<span class="sourceLineNo">8411</span>   */<a name="line.8411"></a>
-<span class="sourceLineNo">8412</span>  public int getCompactPriority() {<a name="line.8412"></a>
-<span class="sourceLineNo">8413</span>    return stores.values().stream().mapToInt(HStore::getCompactPriority).min()<a name="line.8413"></a>
-<span class="sourceLineNo">8414</span>        .orElse(Store.NO_PRIORITY);<a name="line.8414"></a>
-<span class="sourceLineNo">8415</span>  }<a name="line.8415"></a>
-<span class="sourceLineNo">8416</span><a name="line.8416"></a>
-<span class="sourceLineNo">8417</span>  /** @return the coprocessor host */<a name="line.8417"></a>
-<span class="sourceLineNo">8418</span>  public RegionCoprocessorHost getCoprocessorHost() {<a name="line.8418"></a>
-<span class="sourceLineNo">8419</span>    return coprocessorHost;<a name="line.8419"></a>
+<span class="sourceLineNo">8392</span>    // Can't split a region that is closing.<a name="line.8392"></a>
+<span class="sourceLineNo">8393</span>    if (this.isClosing()) {<a name="line.8393"></a>
+<span class="sourceLineNo">8394</span>      return null;<a name="line.8394"></a>
+<span class="sourceLineNo">8395</span>    }<a name="line.8395"></a>
+<span class="sourceLineNo">8396</span><a name="line.8396"></a>
+<span class="sourceLineNo">8397</span>    if (!splitPolicy.shouldSplit()) {<a name="line.8397"></a>
+<span class="sourceLineNo">8398</span>      return null;<a name="line.8398"></a>
+<span class="sourceLineNo">8399</span>    }<a name="line.8399"></a>
+<span class="sourceLineNo">8400</span><a name="line.8400"></a>
+<span class="sourceLineNo">8401</span>    byte[] ret = splitPolicy.getSplitPoint();<a name="line.8401"></a>
+<span class="sourceLineNo">8402</span><a name="line.8402"></a>
+<span class="sourceLineNo">8403</span>    if (ret != null) {<a name="line.8403"></a>
+<span class="sourceLineNo">8404</span>      try {<a name="line.8404"></a>
+<span class="sourceLineNo">8405</span>        checkRow(ret, "calculated split");<a name="line.8405"></a>
+<span class="sourceLineNo">8406</span>      } catch (IOException e) {<a name="line.8406"></a>
+<span class="sourceLineNo">8407</span>        LOG.error("Ignoring invalid split", e);<a name="line.8407"></a>
+<span class="sourceLineNo">8408</span>        return null;<a name="line.8408"></a>
+<span class="sourceLineNo">8409</span>      }<a name="line.8409"></a>
+<span class="sourceLineNo">8410</span>    }<a name="line.8410"></a>
+<span class="sourceLineNo">8411</span>    return ret;<a name="line.8411"></a>
+<span class="sourceLineNo">8412</span>  }<a name="line.8412"></a>
+<span class="sourceLineNo">8413</span><a name="line.8413"></a>
+<span class="sourceLineNo">8414</span>  /**<a name="line.8414"></a>
+<span class="sourceLineNo">8415</span>   * @return The priority that this region should have in the compaction queue<a name="line.8415"></a>
+<span class="sourceLineNo">8416</span>   */<a name="line.8416"></a>
+<span class="sourceLineNo">8417</span>  public int getCompactPriority() {<a name="line.8417"></a>
+<span class="sourceLineNo">8418</span>    return stores.values().stream().mapToInt(HStore::getCompactPriority).min()<a name="line.8418"></a>
+<span class="sourceLineNo">8419</span>        .orElse(Store.NO_PRIORITY);<a name="line.8419"></a>
 <span class="sourceLineNo">8420</span>  }<a name="line.8420"></a>
 <span class="sourceLineNo">8421</span><a name="line.8421"></a>
-<span class="sourceLineNo">8422</span>  /** @param coprocessorHost the new coprocessor host */<a name="line.8422"></a>
-<span class="sourceLineNo">8423</span>  @VisibleForTesting<a name="line.8423"></a>
-<span class="sourceLineNo">8424</span>  public void setCoprocessorHost(final RegionCoprocessorHost coprocessorHost) {<a name="line.8424"></a>
-<span class="sourceLineNo">8425</span>    this.coprocessorHost = coprocessorHost;<a name="line.8425"></a>
-<span class="sourceLineNo">8426</span>  }<a name="line.8426"></a>
-<span class="sourceLineNo">8427</span><a name="line.8427"></a>
-<span class="sourceLineNo">8428</span>  @Override<a name="line.8428"></a>
-<span class="sourceLineNo">8429</span>  public void startRegionOperation() throws IOException {<a name="line.8429"></a>
-<span class="sourceLineNo">8430</span>    startRegionOperation(Operation.ANY);<a name="line.8430"></a>
+<span class="sourceLineNo">8422</span>  /** @return the coprocessor host */<a name="line.8422"></a>
+<span class="sourceLineNo">8423</span>  public RegionCoprocessorHost getCoprocessorHost() {<a name="line.8423"></a>
+<span class="sourceLineNo">8424</span>    return coprocessorHost;<a name="line.8424"></a>
+<span class="sourceLineNo">8425</span>  }<a name="line.8425"></a>
+<span class="sourceLineNo">8426</span><a name="line.8426"></a>
+<span class="sourceLineNo">8427</span>  /** @param coprocessorHost the new coprocessor host */<a name="line.8427"></a>
+<span class="sourceLineNo">8428</span>  @VisibleForTesting<a name="line.8428"></a>
+<span class="sourceLineNo">8429</span>  public void setCoprocessorHost(final RegionCoprocessorHost coprocessorHost) {<a name="line.8429"></a>
+<span class="sourceLineNo">8430</span>    this.coprocessorHost = coprocessorHost;<a name="line.8430"></a>
 <span class="sourceLineNo">8431</span>  }<a name="line.8431"></a>
 <span class="sourceLineNo">8432</span><a name="line.8432"></a>
 <span class="sourceLineNo">8433</span>  @Override<a name="line.8433"></a>
-<span class="sourceLineNo">8434</span>  public void startRegionOperation(Operation op) throws IOException {<a name="line.8434"></a>
-<span class="sourceLineNo">8435</span>    switch (op) {<a name="line.8435"></a>
-<span class="sourceLineNo">8436</span>      case GET:  // read operations<a name="line.8436"></a>
-<span class="sourceLineNo">8437</span>      case SCAN:<a name="line.8437"></a>
-<span class="sourceLineNo">8438</span>        checkReadsEnabled();<a name="line.8438"></a>
-<span class="sourceLineNo">8439</span>        break;<a name="line.8439"></a>
-<span class="sourceLineNo">8440</span>      default:<a name="line.8440"></a>
-<span class="sourceLineNo">8441</span>        break;<a name="line.8441"></a>
-<span class="sourceLineNo">8442</span>    }<a name="line.8442"></a>
-<span class="sourceLineNo">8443</span>    if (op == Operation.MERGE_REGION || op == Operation.SPLIT_REGION<a name="line.8443"></a>
-<span class="sourceLineNo">8444</span>        || op == Operation.COMPACT_REGION || op == Operation.COMPACT_SWITCH) {<a name="line.8444"></a>
-<span class="sourceLineNo">8445</span>      // split, merge or compact region doesn't need to check the closing/closed state or lock the<a name="line.8445"></a>
-<span class="sourceLineNo">8446</span>      // region<a name="line.8446"></a>
-<span class="sourceLineNo">8447</span>      return;<a name="line.8447"></a>
-<span class="sourceLineNo">8448</span>    }<a name="line.8448"></a>
-<span class="sourceLineNo">8449</span>    if (this.closing.get()) {<a name="line.8449"></a>
-<span class="sourceLineNo">8450</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closing");<a name="line.8450"></a>
-<span class="sourceLineNo">8451</span>    }<a name="line.8451"></a>
-<span class="sourceLineNo">8452</span>    lock(lock.readLock());<a name="line.8452"></a>
-<span class="sourceLineNo">8453</span>    if (this.closed.get()) {<a name="line.8453"></a>
-<span class="sourceLineNo">8454</span>      lock.readLock().unlock();<a name="line.8454"></a>
-<span class="sourceLineNo">8455</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closed");<a name="line.8455"></a>
+<span class="sourceLineNo">8434</span>  public void startRegionOperation() throws IOException {<a name="line.8434"></a>
+<span class="sourceLineNo">8435</span>    startRegionOperation(Operation.ANY);<a name="line.8435"></a>
+<span class="sourceLineNo">8436</span>  }<a name="line.8436"></a>
+<span class="sourceLineNo">8437</span><a name="line.8437"></a>
+<span class="sourceLineNo">8438</span>  @Override<a name="line.8438"></a>
+<span class="sourceLineNo">8439</span>  public void startRegionOperation(Operation op) throws IOException {<a name="line.8439"></a>
+<span class="sourceLineNo">8440</span>    switch (op) {<a name="line.8440"></a>
+<span class="sourceLineNo">8441</span>      case GET:  // read operations<a name="line.8441"></a>
+<span class="sourceLineNo">8442</span>      case SCAN:<a name="line.8442"></a>
+<span class="sourceLineNo">8443</span>        checkReadsEnabled();<a name="line.8443"></a>
+<span class="sourceLineNo">8444</span>        break;<a name="line.8444"></a>
+<span class="sourceLineNo">8445</span>      default:<a name="line.8445"></a>
+<span class="sourceLineNo">8446</span>        break;<a name="line.8446"></a>
+<span class="sourceLineNo">8447</span>    }<a name="line.8447"></a>
+<span class="sourceLineNo">8448</span>    if (op == Operation.MERGE_REGION || op == Operation.SPLIT_REGION<a name="line.8448"></a>
+<span class="sourceLineNo">8449</span>        || op == Operation.COMPACT_REGION || op == Operation.COMPACT_SWITCH) {<a name="line.8449"></a>
+<span class="sourceLineNo">8450</span>      // split, merge or compact region doesn't need to check the closing/closed state or lock the<a name="line.8450"></a>
+<span class="sourceLineNo">8451</span>      // region<a name="line.8451"></a>
+<span class="sourceLineNo">8452</span>      return;<a name="line.8452"></a>
+<span class="sourceLineNo">8453</span>    }<a name="line.8453"></a>
+<span class="sourceLineNo">8454</span>    if (this.closing.get()) {<a name="line.8454"></a>
+<span class="sourceLineNo">8455</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closing");<a name="line.8455"></a>
 <span class="sourceLineNo">8456</span>    }<a name="line.8456"></a>
-<span class="sourceLineNo">8457</span>    // The unit for snapshot is a region. So, all stores for this region must be<a name="line.8457"></a>
-<span class="sourceLineNo">8458</span>    // prepared for snapshot operation before proceeding.<a name="line.8458"></a>
-<span class="sourceLineNo">8459</span>    if (op == Operation.SNAPSHOT) {<a name="line.8459"></a>
-<span class="sourceLineNo">8460</span>      stores.values().forEach(HStore::preSnapshotOperation);<a name="line.8460"></a>
+<span class="sourceLineNo">8457</span>    lock(lock.readLock());<a name="line.8457"></a>
+<span class="sourceLineNo">8458</span>    if (this.closed.get()) {<a name="line.8458"></a>
+<span class="sourceLineNo">8459</span>      lock.readLock().unlock();<a name="line.8459"></a>
+<span class="sourceLineNo">8460</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closed");<a name="line.8460"></a>
 <span class="sourceLineNo">8461</span>    }<a name="line.8461"></a>
-<span class="sourceLineNo">8462</span>    try {<a name="line.8462"></a>
-<span class="sourceLineNo">8463</span>      if (coprocessorHost != null) {<a name="line.8463"></a>
-<span class="sourceLineNo">8464</span>        coprocessorHost.postStartRegionOperation(op);<a name="line.8464"></a>
-<span class="sourceLineNo">8465</span>      }<a name="line.8465"></a>
-<span class="sourceLineNo">8466</span>    } catch (Exception e) {<a name="line.8466"></a>
-<span class="sourceLineNo">8467</span>      lock.readLock().unlock();<a name="line.8467"></a>
-<span class="sourceLineNo">8468</span>      throw new IOException(e);<a name="line.8468"></a>
-<span class="sourceLineNo">8469</span>    }<a name="line.8469"></a>
-<span class="sourceLineNo">8470</span>  }<a name="line.8470"></a>
-<span class="sourceLineNo">8471</span><a name="line.8471"></a>
-<span class="sourceLineNo">8472</span>  @Override<a name="line.8472"></a>
-<span class="sourceLineNo">8473</span>  public void closeRegionOperation() throws IOException {<a name="line.8473"></a>
-<span class="sourceLineNo">8474</span>    closeRegionOperation(Operation.ANY);<a name="line.8474"></a>
+<span class="sourceLineNo">8462</span>    // The unit for snapshot is a region. So, all stores for this region must be<a name="line.8462"></a>
+<span class="sourceLineNo">8463</span>    // prepared for snapshot operation before proceeding.<a name="line.8463"></a>
+<span class="sourceLineNo">8464</span>    if (op == Operation.SNAPSHOT) {<a name="line.8464"></a>
+<span class="sourceLineNo">8465</span>      stores.values().forEach(HStore::preSnapshotOperation);<a name="line.8465"></a>
+<span class="sourceLineNo">8466</span>    }<a name="line.8466"></a>
+<span class="sourceLineNo">8467</span>    try {<a name="line.8467"></a>
+<span class="sourceLineNo">8468</span>      if (coprocessorHost != null) {<a name="line.8468"></a>
+<span class="sourceLineNo">8469</span>        coprocessorHost.postStartRegionOperation(op);<a name="line.8469"></a>
+<span class="sourceLineNo">8470</span>      }<a name="line.8470"></a>
+<span class="sourceLineNo">8471</span>    } catch (Exception e) {<a name="line.8471"></a>
+<span class="sourceLineNo">8472</span>      lock.readLock().unlock();<a name="line.8472"></a>
+<span class="sourceLineNo">8473</span>      throw new IOException(e);<a name="line.8473"></a>
+<span class="sourceLineNo">8474</span>    }<a name="line.8474"></a>
 <span class="sourceLineNo">8475</span>  }<a name="line.8475"></a>
 <span class="sourceLineNo">8476</span><a name="line.8476"></a>
 <span class="sourceLineNo">8477</span>  @Override<a name="line.8477"></a>
-<span class="sourceLineNo">8478</span>  public void closeRegionOperation(Operation operation) throws IOException {<a name="line.8478"></a>
-<span class="sourceLineNo">8479</span>    if (operation == Operation.SNAPSHOT) {<a name="line.8479"></a>
-<span class="sourceLineNo">8480</span>      stores.values().forEach(HStore::postSnapshotOperation);<a name="line.8480"></a>
-<span class="sourceLineNo">8481</span>    }<a name="line.8481"></a>
-<span class="sourceLineNo">8482</span>    lock.readLock().unlock();<a name="line.8482"></a>
-<span class="sourceLineNo">8483</span>    if (coprocessorHost != null) {<a name="line.8483"></a>
-<span class="sourceLineNo">8484</span>      coprocessorHost.postCloseRegionOperation(operation);<a name="line.8484"></a>
-<span class="sourceLineNo">8485</span>    }<a name="line.8485"></a>
-<span class="sourceLineNo">8486</span>  }<a name="line.8486"></a>
-<span class="sourceLineNo">8487</span><a name="line.8487"></a>
-<span class="sourceLineNo">8488</span>  /**<a name="line.8488"></a>
-<span class="sourceLineNo">8489</span>   * This method needs to be called before any public call that reads or<a name="line.8489"></a>
-<span class="sourceLineNo">8490</span>   * modifies stores in bulk. It has to be called just before a try.<a name="line.8490"></a>
-<span class="sourceLineNo">8491</span>   * #closeBulkRegionOperation needs to be called in the try's finally block<a name="line.8491"></a>
-<span class="sourceLineNo">8492</span>   * Acquires a writelock and checks if the region is closing or closed.<a name="line.8492"></a>
-<span class="sourceLineNo">8493</span>   * @throws NotServingRegionException when the region is closing or closed<a name="line.8493"></a>
-<span class="sourceLineNo">8494</span>   * @throws RegionTooBusyException if failed to get the lock in time<a name="line.8494"></a>
-<span class="sourceLineNo">8495</span>   * @throws InterruptedIOException if interrupted while waiting for a lock<a name="line.8495"></a>
-<span class="sourceLineNo">8496</span>   */<a name="line.8496"></a>
-<span class="sourceLineNo">8497</span>  private void startBulkRegionOperation(boolean writeLockNeeded)<a name="line.8497"></a>
-<span class="sourceLineNo">8498</span>      throws NotServingRegionException, RegionTooBusyException, InterruptedIOException {<a name="line.8498"></a>
-<span class="sourceLineNo">8499</span>    if (this.closing.get()) {<a name="line.8499"></a>
-<span class="sourceLineNo">8500</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closing");<a name="line.8500"></a>
-<span class="sourceLineNo">8501</span>    }<a name="line.8501"></a>
-<span class="sourceLineNo">8502</span>    if (writeLockNeeded) lock(lock.writeLock());<a name="line.8502"></a>
-<span class="sourceLineNo">8503</span>    else lock(lock.readLock());<a name="line.8503"></a>
-<span class="sourceLineNo">8504</span>    if (this.closed.get()) {<a name="line.8504"></a>
-<span class="sourceLineNo">8505</span>      if (writeLockNeeded) lock.writeLock().unlock();<a name="line.8505"></a>
-<span class="sourceLineNo">8506</span>      else lock.readLock().unlock();<a name="line.8506"></a>
-<span class="sourceLineNo">8507</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closed");<a name="line.8507"></a>
-<span class="sourceLineNo">8508</span>    }<a name="line.8508"></a>
-<span class="sourceLineNo">8509</span>  }<a name="line.8509"></a>
-<span class="sourceLineNo">8510</span><a name="line.8510"></a>
-<span class="sourceLineNo">8511</span>  /**<a name="line.8511"></a>
-<span class="sourceLineNo">8512</span>   * Closes the lock. This needs to be called in the finally block corresponding<a name="line.8512"></a>
-<span class="sourceLineNo">8513</span>   * to the try block of #startRegionOperation<a name="line.8513"></a>
-<span class="sourceLineNo">8514</span>   */<a name="line.8514"></a>
-<span class="sourceLineNo">8515</span>  private void closeBulkRegionOperation(){<a name="line.8515"></a>
-<span class="sourceLineNo">8516</span>    if (lock.writeLock().isHeldByCurrentThread()) lock.writeLock().unlock();<a name="line.8516"></a>
-<span class="sourceLineNo">8517</span>    else lock.readLock().unlock();<a name="line.8517"></a>
-<span class="sourceLineNo">8518</span>  }<a name="line.8518"></a>
-<span class="sourceLineNo">8519</span><a name="line.8519"></a>
-<span class="sourceLineNo">8520</span>  /**<a name="line.8520"></a>
-<span class="sourceLineNo">8521</span>   * Update LongAdders for number of puts without wal and the size of possible data loss.<a name="line.8521"></a>
-<span class="sourceLineNo">8522</span>   * These information are exposed by the region server metrics.<a name="line.8522"></a>
-<span class="sourceLineNo">8523</span>   */<a name="line.8523"></a>
-<span class="sourceLineNo">8524</span>  private void recordMutationWithoutWal(final Map&lt;byte [], List&lt;Cell&gt;&gt; familyMap) {<a name="line.8524"></a>
-<span class="sourceLineNo">8525</span>    numMutationsWithoutWAL.increment();<a name="line.8525"></a>
-<span class="sourceLineNo">8526</span>    if (numMutationsWithoutWAL.sum() &lt;= 1) {<a name="line.8526"></a>
-<span class="sourceLineNo">8527</span>      LOG.info("writing data to region " + this +<a name="line.8527"></a>
-<span class="sourceLineNo">8528</span>               " with WAL disabled. Data may be lost in the event of a crash.");<a name="line.8528"></a>
-<span class="sourceLineNo">8529</span>    }<a name="line.8529"></a>
-<span class="sourceLineNo">8530</span><a name="line.8530"></a>
-<span class="sourceLineNo">8531</span>    long mutationSize = 0;<a name="line.8531"></a>
-<span class="sourceLineNo">8532</span>    for (List&lt;Cell&gt; cells: familyMap.values()) {<a name="line.8532"></a>
-<span class="sourceLineNo">8533</span>      // Optimization: 'foreach' loop is not used. See:<a name="line.8533"></a>
-<span class="sourceLineNo">8534</span>      // HBASE-12023 HRegion.applyFamilyMapToMemstore creates too many iterator objects<a name="line.8534"></a>
-<span class="sourceLineNo">8535</span>      assert cells instanceof RandomAccess;<a name="line.8535"></a>
-<span class="sourceLineNo">8536</span>      int listSize = cells.size();<a name="line.8536"></a>
-<span class="sourceLineNo">8537</span>      for (int i=0; i &lt; listSize; i++) {<a name="line.8537"></a>
-<span class="sourceLineNo">8538</span>        Cell cell = cells.get(i);<a name="line.8538"></a>
-<span class="sourceLineNo">8539</span>        mutationSize += cell.getSerializedSize();<a name="line.8539"></a>
-<span class="sourceLineNo">8540</span>      }<a name="line.8540"></a>
-<span class="sourceLineNo">8541</span>    }<a name="line.8541"></a>
-<span class="sourceLineNo">8542</span><a name="line.8542"></a>
-<span class="sourceLineNo">8543</span>    dataInMemoryWithoutWAL.add(mutationSize);<a name="line.8543"></a>
-<span class="sourceLineNo">8544</span>  }<a name="line.8544"></a>
-<span class="sourceLineNo">8545</span><a name="line.8545"></a>
-<span class="sourceLineNo">8546</span>  private void lock(final Lock lock) throws RegionTooBusyException, InterruptedIOException {<a name="line.8546"></a>
-<span class="sourceLineNo">8547</span>    lock(lock, 1);<a name="line.8547"></a>
-<span class="sourceLineNo">8548</span>  }<a name="line.8548"></a>
-<span class="sourceLineNo">8549</span><a name="line.8549"></a>
-<span class="sourceLineNo">8550</span>  /**<a name="line.8550"></a>
-<span class="sourceLineNo">8551</span>   * Try to acquire a lock.  Throw RegionTooBusyException<a name="line.8551"></a>
-<span class="sourceLineNo">8552</span>   * if failed to get the lock in time. Throw InterruptedIOException<a name="line.8552"></a>
-<span class="sourceLineNo">8553</span>   * if interrupted while waiting for the lock.<a name="line.8553"></a>
-<span class="sourceLineNo">8554</span>   */<a name="line.8554"></a>
-<span class="sourceLineNo">8555</span>  private void lock(final Lock lock, final int multiplier)<a name="line.8555"></a>
-<span class="sourceLineNo">8556</span>      throws RegionTooBusyException, InterruptedIOException {<a name="line.8556"></a>
-<span class="sourceLineNo">8557</span>    try {<a name="line.8557"></a>
-<span class="sourceLineNo">8558</span>      final long waitTime = Math.min(maxBusyWaitDuration,<a name="line.8558"></a>
-<span class="sourceLineNo">8559</span>          busyWaitDuration * Math.min(multiplier, maxBusyWaitMultiplier));<a name="line.8559"></a>
-<span class="sourceLineNo">8560</span>      if (!lock.tryLock(waitTime, TimeUnit.MILLISECONDS)) {<a name="line.8560"></a>
-<span class="sourceLineNo">8561</span>        // Don't print millis. Message is used as a key over in<a name="line.8561"></a>
-<span class="sourceLineNo">8562</span>        // RetriesExhaustedWithDetailsException processing.<a name="line.8562"></a>
-<span class="sourceLineNo">8563</span>        throw new RegionTooBusyException("Failed to obtain lock; regionName=" +<a name="line.8563"></a>
-<span class="sourceLineNo">8564</span>            (this.getRegionInfo() == null? "unknown":<a name="line.8564"></a>
-<span class="sourceLineNo">8565</span>                this.getRegionInfo().getRegionNameAsString()) +<a name="line.8565"></a>
-<span class="sourceLineNo">8566</span>            ", server=" + (this.getRegionServerServices() == null? "unknown":<a name="line.8566"></a>
-<span class="sourceLineNo">8567</span>                this.getRegionServerServices().getServerName()));<a name="line.8567"></a>
-<span class="sourceLineNo">8568</span>      }<a name="line.8568"></a>
-<span class="sourceLineNo">8569</span>    } catch (InterruptedException ie) {<a name="line.8569"></a>
-<span class="sourceLineNo">8570</span>      LOG.info("Interrupted while waiting for a lock");<a name="line.8570"></a>
-<span class="sourceLineNo">8571</span>      InterruptedIOException iie = new InterruptedIOException();<a name="line.8571"></a>
-<span class="sourceLineNo">8572</span>      iie.initCause(ie);<a name="line.8572"></a>
-<span class="sourceLineNo">8573</span>      throw iie;<a name="line.8573"></a>
-<span class="sourceLineNo">8574</span>    }<a name="line.8574"></a>
-<span class="sourceLineNo">8575</span>  }<a name="line.8575"></a>
-<span class="sourceLineNo">8576</span><a name="line.8576"></a>
-<span class="sourceLineNo">8577</span>  /**<a name="line.8577"></a>
-<span class="sourceLineNo">8578</span>   * Calls sync with the given transaction ID<a name="line.8578"></a>
-<span class="sourceLineNo">8579</span>   * @param txid should sync up to which transaction<a name="line.8579"></a>
-<span class="sourceLineNo">8580</span>   * @throws IOException If anything goes wrong with DFS<a name="line.8580"></a>
-<span class="sourceLineNo">8581</span>   */<a name="line.8581"></a>
-<span class="sourceLineNo">8582</span>  private void sync(long txid, Durability durability) throws IOException {<a name="line.8582"></a>
-<span class="sourceLineNo">8583</span>    if (this.getRegionInfo().isMetaRegion()) {<a name="line.8583"></a>
-<span class="sourceLineNo">8584</span>      this.wal.sync(txid);<a name="line.8584"></a>
-<span class="sourceLineNo">8585</span>    } else {<a name="line.8585"></a>
-<span class="sourceLineNo">8586</span>      switch(durability) {<a name="line.8586"></a>
-<span class="sourceLineNo">8587</span>      case USE_DEFAULT:<a name="line.8587"></a>
-<span class="sourceLineNo">8588</span>        // do what table defaults to<a name="line.8588"></a>
-<span class="sourceLineNo">8589</span>        if (shouldSyncWAL()) {<a name="line.8589"></a>
-<span class="sourceLineNo">8590</span>          this.wal.sync(txid);<a name="line.8590"></a>
-<span class="sourceLineNo">8591</span>        }<a name="line.8591"></a>
-<span class="sourceLineNo">8592</span>        break;<a name="line.8592"></a>
-<span class="sourceLineNo">8593</span>      case SKIP_WAL:<a name="line.8593"></a>
-<span class="sourceLineNo">8594</span>        // nothing do to<a name="line.8594"></a>
-<span class="sourceLineNo">8595</span>        break;<a name="line.8595"></a>
-<span class="sourceLineNo">8596</span>      case ASYNC_WAL:<a name="line.8596"></a>
-<span class="sourceLineNo">8597</span>        // nothing do to<a name="line.8597"></a>
-<span class="sourceLineNo">8598</span>        break;<a name="line.8598"></a>
-<span class="sourceLineNo">8599</span>      case SYNC_WAL:<a name="line.8599"></a>
-<span class="sourceLineNo">8600</span>          this.wal.sync(txid, false);<a name="line.8600"></a>
-<span class="sourceLineNo">8601</span>          break;<a name="line.8601"></a>
-<span class="sourceLineNo">8602</span>      case FSYNC_WAL:<a name="line.8602"></a>
-<span class="sourceLineNo">8603</span>          this.wal.sync(txid, true);<a name="line.8603"></a>
-<span class="sourceLineNo">8604</span>          break;<a name="line.8604"></a>
-<span class="sourceLineNo">8605</span>      default:<a name="line.8605"></a>
-<span class="sourceLineNo">8606</span>        throw new RuntimeException("Unknown durability " + durability);<a name="line.8606"></a>
-<span class="sourceLineNo">8607</span>      }<a name="line.8607"></a>
-<span class="sourceLineNo">8608</span>    }<a name="line.8608"></a>
-<span class="sourceLineNo">8609</span>  }<a name="line.8609"></a>
-<span class="sourceLineNo">8610</span><a name="line.8610"></a>
-<span class="sourceLineNo">8611</span>  /**<a name="line.8611"></a>
-<span class="sourceLineNo">8612</span>   * Check whether we should sync the wal from the table's durability settings<a name="line.8612"></a>
-<span class="sourceLineNo">8613</span>   */<a name="line.8613"></a>
-<span class="sourceLineNo">8614</span>  private boolean shouldSyncWAL() {<a name="line.8614"></a>
-<span class="sourceLineNo">8615</span>    return regionDurability.ordinal() &gt;  Durability.ASYNC_WAL.ordinal();<a name="line.8615"></a>
-<span class="sourceLineNo">8616</span>  }<a name="line.8616"></a>
-<span class="sourceLineNo">8617</span><a name="line.8617"></a>
-<span class="sourceLineNo">8618</span>  /**<a name="line.8618"></a>
-<span class="sourceLineNo">8619</span>   * A mocked list implementation - discards all updates.<a name="line.8619"></a>
-<span class="sourceLineNo">8620</span>   */<a name="line.8620"></a>
-<span class="sourceLineNo">8621</span>  private static final List&lt;Cell&gt; MOCKED_LIST = new AbstractList&lt;Cell&gt;() {<a name="line.8621"></a>
+<span class="sourceLineNo">8478</span>  public void closeRegionOperation() throws IOException {<a name="line.8478"></a>
+<span class="sourceLineNo">8479</span>    closeRegionOperation(Operation.ANY);<a name="line.8479"></a>
+<span class="sourceLineNo">8480</span>  }<a name="line.8480"></a>
+<span class="sourceLineNo">8481</span><a name="line.8481"></a>
+<span class="sourceLineNo">8482</span>  @Override<a name="line.8482"></a>
+<span class="sourceLineNo">8483</span>  public void closeRegionOperation(Operation operation) throws IOException {<a name="line.8483"></a>
+<span class="sourceLineNo">8484</span>    if (operation == Operation.SNAPSHOT) {<a name="line.8484"></a>
+<span class="sourceLineNo">8485</span>      stores.values().forEach(HStore::postSnapshotOperation);<a name="line.8485"></a>
+<span class="sourceLineNo">8486</span>    }<a name="line.8486"></a>
+<span class="sourceLineNo">8487</span>    lock.readLock().unlock();<a name="line.8487"></a>
+<span class="sourceLineNo">8488</span>    if (coprocessorHost != null) {<a name="line.8488"></a>
+<span class="sourceLineNo">8489</span>      coprocessorHost.postCloseRegionOperation(operation);<a name="line.8489"></a>
+<span class="sourceLineNo">8490</span>    }<a name="line.8490"></a>
+<span class="sourceLineNo">8491</span>  }<a name="line.8491"></a>
+<span class="sourceLineNo">8492</span><a name="line.8492"></a>
+<span class="sourceLineNo">8493</span>  /**<a name="line.8493"></a>
+<span class="sourceLineNo">8494</span>   * This method needs to be called before any public call that reads or<a name="line.8494"></a>
+<span class="sourceLineNo">8495</span>   * modifies stores in bulk. It has to be called just before a try.<a name="line.8495"></a>
+<span class="sourceLineNo">8496</span>   * #closeBulkRegionOperation needs to be called in the try's finally block<a name="line.8496"></a>
+<span class="sourceLineNo">8497</span>   * Acquires a writelock and checks if the region is closing or closed.<a name="line.8497"></a>
+<span class="sourceLineNo">8498</span>   * @throws NotServingRegionException when the region is closing or closed<a name="line.8498"></a>
+<span class="sourceLineNo">8499</span>   * @throws RegionTooBusyException if failed to get the lock in time<a name="line.8499"></a>
+<span class="sourceLineNo">8500</span>   * @throws InterruptedIOException if interrupted while waiting for a lock<a name="line.8500"></a>
+<span class="sourceLineNo">8501</span>   */<a name="line.8501"></a>
+<span class="sourceLineNo">8502</span>  private void startBulkRegionOperation(boolean writeLockNeeded)<a name="line.8502"></a>
+<span class="sourceLineNo">8503</span>      throws NotServingRegionException, RegionTooBusyException, InterruptedIOException {<a name="line.8503"></a>
+<span class="sourceLineNo">8504</span>    if (this.closing.get()) {<a name="line.8504"></a>
+<span class="sourceLineNo">8505</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closing");<a name="line.8505"></a>
+<span class="sourceLineNo">8506</span>    }<a name="line.8506"></a>
+<span class="sourceLineNo">8507</span>    if (writeLockNeeded) lock(lock.writeLock());<a name="line.8507"></a>
+<span class="sourceLineNo">8508</span>    else lock(lock.readLock());<a name="line.8508"></a>
+<span class="sourceLineNo">8509</span>    if (this.closed.get()) {<a name="line.8509"></a>
+<span class="sourceLineNo">8510</span>      if (writeLockNeeded) lock.writeLock().unlock();<a name="line.8510"></a>
+<span class="sourceLineNo">8511</span>      else lock.readLock().unlock();<a name="line.8511"></a>
+<span class="sourceLineNo">8512</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closed");<a name="line.8512"></a>
+<span class="sourceLineNo">8513</span>    }<a name="line.8513"></a>
+<span class="sourceLineNo">8514</span>  }<a name="line.8514"></a>
+<span class="sourceLineNo">8515</span><a name="line.8515"></a>
+<span class="sourceLineNo">8516</span>  /**<a name="line.8516"></a>
+<span class="sourceLineNo">8517</span>   * Closes the lock. This needs to be called in the finally block corresponding<a name="line.8517"></a>
+<span class="sourceLineNo">8518</span>   * to the try block of #startRegionOperation<a name="line.8518"></a>
+<span class="sourceLineNo">8519</span>   */<a name="line.8519"></a>
+<span class="sourceLineNo">8520</span>  private void closeBulkRegionOperation(){<a name="line.8520"></a>
+<span class="sourceLineNo">8521</span>    if (lock.writeLock().isHeldByCurrentThread()) lock.writeLock().unlock();<a name="line.8521"></a>
+<span class="sourceLineNo">8522</span>    else lock.readLock().unlock();<a name="line.8522"></a>
+<span class="sourceLineNo">8523</span>  }<a name="line.8523"></a>
+<span class="sourceLineNo">8524</span><a name="line.8524"></a>
+<span class="sourceLineNo">8525</span>  /**<a name="line.8525"></a>
+<span class="sourceLineNo">8526</span>   * Update LongAdders for number of puts without wal and the size of possible data loss.<a name="line.8526"></a>
+<span class="sourceLineNo">8527</span>   * These information are exposed by the region server metrics.<a name="line.8527"></a>
+<span class="sourceLineNo">8528</span>   */<a name="line.8528"></a>
+<span class="sourceLineNo">8529</span>  private void recordMutationWithoutWal(final Map&lt;byte [], List&lt;Cell&gt;&gt; familyMap) {<a name="line.8529"></a>
+<span class="sourceLineNo">8530</span>    numMutationsWithoutWAL.increment();<a name="line.8530"></a>
+<span class="sourceLineNo">8531</span>    if (numMutationsWithoutWAL.sum() &lt;= 1) {<a name="line.8531"></a>
+<span class="sourceLineNo">8532</span>      LOG.info("writing data to region " + this +<a name="line.8532"></a>
+<span class="sourceLineNo">8533</span>               " with WAL disabled. Data may be lost in the event of a crash.");<a name="line.8533"></a>
+<span class="sourceLineNo">8534</span>    }<a name="line.8534"></a>
+<span class="sourceLineNo">8535</span><a name="line.8535"></a>
+<span class="sourceLineNo">8536</span>    long mutationSize = 0;<a name="line.8536"></a>
+<span class="sourceLineNo">8537</span>    for (List&lt;Cell&gt; cells: familyMap.values()) {<a name="line.8537"></a>
+<span class="sourceLineNo">8538</span>      // Optimization: 'foreach' loop is not used. See:<a name="line.8538"></a>
+<span class="sourceLineNo">8539</span>      // HBASE-12023 HRegion.applyFamilyMapToMemstore creates too many iterator objects<a name="line.8539"></a>
+<span class="sourceLineNo">8540</span>      assert cells instanceof RandomAccess;<a name="line.8540"></a>
+<span class="sourceLineNo">8541</span>      int listSize = cells.size();<a name="line.8541"></a>
+<span class="sourceLineNo">8542</span>      for (int i=0; i &lt; listSize; i++) {<a name="line.8542"></a>
+<span class="sourceLineNo">8543</span>        Cell cell = cells.get(i);<a name="line.8543"></a>
+<span class="sourceLineNo">8544</span>        mutationSize += cell.getSerializedSize();<a name="line.8544"></a>
+<span class="sourceLineNo">8545</span>      }<a name="line.8545"></a>
+<span class="sourceLineNo">8546</span>    }<a name="line.8546"></a>
+<span class="sourceLineNo">8547</span><a name="line.8547"></a>
+<span class="sourceLineNo">8548</span>    dataInMemoryWithoutWAL.add(mutationSize);<a name="line.8548"></a>
+<span class="sourceLineNo">8549</span>  }<a name="line.8549"></a>
+<span class="sourceLineNo">8550</span><a name="line.8550"></a>
+<span class="sourceLineNo">8551</span>  private void lock(final Lock lock) throws RegionTooBusyException, InterruptedIOException {<a name="line.8551"></a>
+<span class="sourceLineNo">8552</span>    lock(lock, 1);<a name="line.8552"></a>
+<span class="sourceLineNo">8553</span>  }<a name="line.8553"></a>
+<span class="sourceLineNo">8554</span><a name="line.8554"></a>
+<span class="sourceLineNo">8555</span>  /**<a name="line.8555"></a>
+<span class="sourceLineNo">8556</span>   * Try to acquire a lock.  Throw RegionTooBusyException<a name="line.8556"></a>
+<span class="sourceLineNo">8557</span>   * if failed to get the lock in time. Throw InterruptedIOException<a name="line.8557"></a>
+<span class="sourceLineNo">8558</span>   * if interrupted while waiting for the lock.<a name="line.8558"></a>
+<span class="sourceLineNo">8559</span>   */<a name="line.8559"></a>
+<span class="sourceLineNo">8560</span>  private void lock(final Lock lock, final int multiplier)<a name="line.8560"></a>
+<span class="sourceLineNo">8561</span>      throws RegionTooBusyException, InterruptedIOException {<a name="line.8561"></a>
+<span class="sourceLineNo">8562</span>    try {<a name="line.8562"></a>
+<span class="sourceLineNo">8563</span>      final long waitTime = Math.min(maxBusyWaitDuration,<a name="line.8563"></a>
+<span class="sourceLineNo">8564</span>          busyWaitDuration * Math.min(multiplier, maxBusyWaitMultiplier));<a name="line.8564"></a>
+<span class="sourceLineNo">8565</span>      if (!lock.tryLock(waitTime, TimeUnit.MILLISECONDS)) {<a name="line.8565"></a>
+<span class="sourceLineNo">8566</span>        // Don't print millis. Message is used as a key over in<a name="line.8566"></a>
+<span class="sourceLineNo">8567</span>        // RetriesExhaustedWithDetailsException processing.<a name="line.8567"></a>
+<span class="sourceLineNo">8568</span>        throw new RegionTooBusyException("Failed to obtain lock; regionName=" +<a name="line.8568"></a>
+<span class="sourceLineNo">8569</span>            (this.getRegionInfo() == null? "unknown":<a name="line.8569"></a>
+<span class="sourceLineNo">8570</span>                this.getRegionInfo().getRegionNameAsString()) +<a name="line.8570"></a>
+<span class="sourceLineNo">8571</span>            ", server=" + (this.getRegionServerServices() == null? "unknown":<a name="line.8571"></a>
+<span class="sourceLineNo">8572</span>                this.getRegionServerServices().getServerName()));<a name="line.8572"></a>
+<span class="sourceLineNo">8573</span>      }<a name="line.8573"></a>
+<span class="sourceLineNo">8574</span>    } catch (InterruptedException ie) {<a name="line.8574"></a>
+<span class="sourceLineNo">8575</span>      LOG.info("Interrupted while waiting for a lock");<a name="line.8575"></a>
+<span class="sourceLineNo">8576</span>      InterruptedIOException iie = new InterruptedIOException();<a name="line.8576"></a>
+<span class="sourceLineNo">8577</span>      iie.initCause(ie);<a name="line.8577"></a>
+<span class="sourceLineNo">8578</span>      throw iie;<a name="line.8578"></a>
+<span class="sourceLineNo">8579</span>    }<a name="line.8579"></a>
+<span class="sourceLineNo">8580</span>  }<a name="line.8580"></a>
+<span class="sourceLineNo">8581</span><a name="line.8581"></a>
+<span class="sourceLineNo">8582</span>  /**<a name="line.8582"></a>
+<span class="sourceLineNo">8583</span>   * Calls sync with the given transaction ID<a name="line.8583"></a>
+<span class="sourceLineNo">8584</span>   * @param txid should sync up to which transaction<a name="line.8584"></a>
+<span class="sourceLineNo">8585</span>   * @throws IOException If anything goes wrong with DFS<a name="line.8585"></a>
+<span class="sourceLineNo">8586</span>   */<a name="line.8586"></a>
+<span class="sourceLineNo">8587</span>  private void sync(long txid, Durability durability) throws IOException {<a name="line.8587"></a>
+<span class="sourceLineNo">8588</span>    if (this.getRegionInfo().isMetaRegion()) {<a name="line.8588"></a>
+<span class="sourceLineNo">8589</span>      this.wal.sync(txid);<a name="line.8589"></a>
+<span class="sourceLineNo">8590</span>    } else {<a name="line.8590"></a>
+<span class="sourceLineNo">8591</span>      switch(durability) {<a name="line.8591"></a>
+<span class="sourceLineNo">8592</span>      case USE_DEFAULT:<a name="line.8592"></a>
+<span class="sourceLineNo">8593</span>        // do what table defaults to<a name="line.8593"></a>
+<span class="sourceLineNo">8594</span>        if (shouldSyncWAL()) {<a name="line.8594"></a>
+<span class="sourceLineNo">8595</span>          this.wal.sync(txid);<a name="line.8595"></a>
+<span class="sourceLineNo">8596</span>        }<a name="line.8596"></a>
+<span class="sourceLineNo">8597</span>        break;<a name="line.8597"></a>
+<span class="sourceLineNo">8598</span>      case SKIP_WAL:<a name="line.8598"></a>
+<span class="sourceLineNo">8599</span>        // nothing do to<a name="line.8599"></a>
+<span class="sourceLineNo">8600</span>        break;<a name="line.8600"></a>
+<span class="sourceLineNo">8601</span>      case ASYNC_WAL:<a name="line.8601"></a>
+<span class="sourceLineNo">8602</span>        // nothing do to<a name="line.8602"></a>
+<span class="sourceLineNo">8603</span>        break;<a name="line.8603"></a>
+<span class="sourceLineNo">8604</span>      case SYNC_WAL:<a name="line.8604"></a>
+<span class="sourceLineNo">8605</span>          this.wal.sync(txid, false);<a name="line.8605"></a>
+<span class="sourceLineNo">8606</span>          break;<a name="line.8606"></a>
+<span class="sourceLineNo">8607</span>      case FSYNC_WAL:<a name="line.8607"></a>
+<span class="sourceLineNo">8608</span>          this.wal.sync(txid, true);<a name="line.8608"></a>
+<span class="sourceLineNo">8609</span>          break;<a name="line.8609"></a>
+<span class="sourceLineNo">8610</span>      default:<a name="line.8610"></a>
+<span class="sourceLineNo">8611</span>        throw new RuntimeException("Unknown durability " + durability);<a name="line.8611"></a>
+<span class="sourceLineNo">8612</span>      }<a name="line.8612"></a>
+<span class="sourceLineNo">8613</span>    }<a name="line.8613"></a>
+<span class="sourceLineNo">8614</span>  }<a name="line.8614"></a>
+<span class="sourceLineNo">8615</span><a name="line.8615"></a>
+<span class="sourceLineNo">8616</span>  /**<a name="line.8616"></a>
+<span class="sourceLineNo">8617</span>   * Check whether we should sync the wal from the table's durability settings<a name="line.8617"></a>
+<span class="sourceLineNo">8618</span>   */<a name="line.8618"></a>
+<span class="sourceLineNo">8619</span>  private boolean shouldSyncWAL() {<a name="line.8619"></a>
+<span class="sourceLineNo">8620</span>    return regionDurability.ordinal() &gt;  Durability.ASYNC_WAL.ordinal();<a name="line.8620"></a>
+<span class="sourceLineNo">8621</span>  }<a name="line.8621"></a>
 <span class="sourceLineNo">8622</span><a name="line.8622"></a>
-<span class="sourceLineNo">8623</span>    @Override<a name="line.8623"></a>
-<span class="sourceLineNo">8624</span>    public void add(int index, Cell element) {<a name="line.8624"></a>
-<span class="sourceLineNo">8625</span>      // do nothing<a name="line.8625"></a>
-<span class="sourceLineNo">8626</span>    }<a name="line.8626"></a>
+<span class="sourceLineNo">8623</span>  /**<a name="line.8623"></a>
+<span class="sourceLineNo">8624</span>   * A mocked list implementation - discards all updates.<a name="line.8624"></a>
+<span class="sourceLineNo">8625</span>   */<a name="line.8625"></a>
+<span class="sourceLineNo">8626</span>  private static final List&lt;Cell&gt; MOCKED_LIST = new AbstractList&lt;Cell&gt;() {<a name="line.8626"></a>
 <span class="sourceLineNo">8627</span><a name="line.8627"></a>
 <span class="sourceLineNo">8628</span>    @Override<a name="line.8628"></a>
-<span class="sourceLineNo">8629</span>    public boolean addAll(int index, Collection&lt;? extends Cell&gt; c) {<a name="line.8629"></a>
-<span class="sourceLineNo">8630</span>      return false; // this list is never changed as a result of an update<a name="line.8630"></a>
+<span class="sourceLineNo">8629</span>    public void add(int index, Cell element) {<a name="line.8629"></a>
+<span class="sourceLineNo">8630</span>      // do nothing<a name="line.8630"></a>
 <span class="sourceLineNo">8631</span>    }<a name="line.8631"></a>
 <span class="sourceLineNo">8632</span><a name="line.8632"></a>
 <span class="sourceLineNo">8633</span>    @Override<a name="line.8633"></a>
-<span class="sourceLineNo">8634</span>    public KeyValue get(int index) {<a name="line.8634"></a>
-<span class="sourceLineNo">8635</span>      throw new UnsupportedOperationException();<a name="line.8635"></a>
+<span class="sourceLineNo">8634</span>    public boolean addAll(int index, Collection&lt;? extends Cell&gt; c) {<a name="line.8634"></a>
+<span class="sourceLineNo">8635</span>      return false; // this list is never changed as a result of an update<a name="line.8635"></a>
 <span class="sourceLineNo">8636</span>    }<a name="line.8636"></a>
 <span class="sourceLineNo">8637</span><a name="line.8637"></a>
 <span class="sourceLineNo">8638</span>    @Override<a name="line.8638"></a>
-<span class="sourceLineNo">8639</span>    public int size() {<a name="line.8639"></a>
-<span class="sourceLineNo">8640</span>      return 0;<a name="line.8640"></a>
+<span class="sourceLineNo">8639</span>    public KeyValue get(int index) {<a name="line.8639"></a>
+<span class="sourceLineNo">8640</span>      throw new UnsupportedOperationException();<a name="line.8640"></a>
 <span class="sourceLineNo">8641</span>    }<a name="line.8641"></a>
-<span class="sourceLineNo">8642</span>  };<a name="line.8642"></a>
-<span class="sourceLineNo">8643</span><a name="line.8643"></a>
-<span class="sourceLineNo">8644</span>  /** @return the latest sequence number that was read from storage when this region was opened */<a name="line.8644"></a>
-<span class="sourceLineNo">8645</span>  public long getOpenSeqNum() {<a name="line.8645"></a>
-<span class="sourceLineNo">8646</span>    return this.openSeqNum;<a name="line.8646"></a>
-<span class="sourceLineNo">8647</span>  }<a name="line.8647"></a>
+<span class="sourceLineNo">8642</span><a name="line.8642"></a>
+<span class="sourceLineNo">8643</span>    @Override<a name="line.8643"></a>
+<span class="sourceLineNo">8644</span>    public int size() {<a name="line.8644"></a>
+<span class="sourceLineNo">8645</span>      return 0;<a name="line.8645"></a>
+<span class="sourceLineNo">8646</span>    }<a name="line.8646"></a>
+<span class="sourceLineNo">8647</span>  };<a name="line.8647"></a>
 <span class="sourceLineNo">8648</span><a name="line.8648"></a>
-<span class="sourceLineNo">8649</span>  @Override<a name="line.8649"></a>
-<span class="sourceLineNo">8650</span>  public Map&lt;byte[], Long&gt; getMaxStoreSeqId() {<a name="line.8650"></a>
-<span class="sourceLineNo">8651</span>    return this.maxSeqIdInStores;<a name="line.8651"></a>
+<span class="sourceLineNo">8649</span>  /** @return the latest sequence number that was read from storage when this region was opened */<a name="line.8649"></a>
+<span class="sourceLineNo">8650</span>  public long getOpenSeqNum() {<a name="line.8650"></a>
+<span class="sourceLineNo">8651</span>    return this.openSeqNum;<a name="line.8651"></a>
 <span class="sourceLineNo">8652</span>  }<a name="line.8652"></a>
 <span class="sourceLineNo">8653</span><a name="line.8653"></a>
-<span class="sourceLineNo">8654</span>  public long getOldestSeqIdOfStore(byte[] familyName) {<a name="line.8654"></a>
-<span class="sourceLineNo">8655</span>    return wal.getEarliestMemStoreSeqNum(getRegionInfo().getEncodedNameAsBytes(), familyName);<a name="line.8655"></a>
-<span class="sourceLineNo">8656</span>  }<a name="line.8656"></a>
-<span class="sourceLineNo">8657</span><a name="line.8657"></a>
-<span class="sourceLineNo">8658</span>  @Override<a name="line.8658"></a>
-<span class="sourceLineNo">8659</span>  public CompactionState getCompactionState() {<a name="line.8659"></a>
-<span class="sourceLineNo">8660</span>    boolean hasMajor = majorInProgress.get() &gt; 0, hasMinor = minorInProgress.get() &gt; 0;<a name="line.8660"></a>
-<span class="sourceLineNo">8661</span>    return (hasMajor ? (hasMinor ? CompactionState.MAJOR_AND_MINOR : CompactionState.MAJOR)<a name="line.8661"></a>
-<span class="sourceLineNo">8662</span>        : (hasMinor ? CompactionState.MINOR : CompactionState.NONE));<a name="line.8662"></a>
-<span class="sourceLineNo">8663</span>  }<a name="line.8663"></a>
-<span class="sourceLineNo">8664</span><a name="line.8664"></a>
-<span class="sourceLineNo">8665</span>  public void reportCompactionRequestStart(boolean isMajor){<a name="line.8665"></a>
-<span class="sourceLineNo">8666</span>    (isMajor ? majorInProgress : minorInProgress).incrementAndGet();<a name="line.8666"></a>
-<span class="sourceLineNo">8667</span>  }<a name="line.8667"></a>
-<span class="sourceLineNo">8668</span><a name="line.8668"></a>
-<span class="sourceLineNo">8669</span>  public void reportCompactionRequestEnd(boolean isMajor, int numFiles, long filesSizeCompacted) {<a name="line.8669"></a>
-<span class="sourceLineNo">8670</span>    int newValue = (isMajor ? majorInProgress : minorInProgress).decrementAndGet();<a name="line.8670"></a>
-<span class="sourceLineNo">8671</span><a name="line.8671"></a>
-<span class="sourceLineNo">8672</span>    // metrics<a name="line.8672"></a>
-<span class="sourceLineNo">8673</span>    compactionsFinished.increment();<a name="line.8673"></a>
-<span class="sourceLineNo">8674</span>    compactionNumFilesCompacted.add(numFiles);<a name="line.8674"></a>
-<span class="sourceLineNo">8675</span>    compactionNumBytesCompacted.add(filesSizeCompacted);<a name="line.8675"></a>
+<span class="sourceLineNo">8654</span>  @Override<a name="line.8654"></a>
+<span class="sourceLineNo">8655</span>  public Map&lt;byte[], Long&gt; getMaxStoreSeqId() {<a name="line.8655"></a>
+<span class="sourceLineNo">8656</span>    return this.maxSeqIdInStores;<a name="line.8656"></a>
+<span class="sourceLineNo">8657</span>  }<a name="line.8657"></a>
+<span class="sourceLineNo">8658</span><a name="line.8658"></a>
+<span class="sourceLineNo">8659</span>  public long getOldestSeqIdOfStore(byte[] familyName) {<a name="line.8659"></a>
+<span class="sourceLineNo">8660</span>    return wal.getEarliestMemStoreSeqNum(getRegionInfo().getEncodedNameAsBytes(), familyName);<a name="line.8660"></a>
+<span class="sourceLineNo">8661</span>  }<a name="line.8661"></a>
+<span class="sourceLineNo">8662</span><a name="line.8662"></a>
+<span class="sourceLineNo">8663</span>  @Override<a name="line.8663"></a>
+<span class="sourceLineNo">8664</span>  public CompactionState getCompactionState() {<a name="line.8664"></a>
+<span class="sourceLineNo">8665</span>    boolean hasMajor = majorInProgress.get() &gt; 0, hasMinor = minorInProgress.get() &gt; 0;<a name="line.8665"></a>
+<span class="sourceLineNo">8666</span>    return (hasMajor ? (hasMinor ? CompactionState.MAJOR_AND_MINOR : CompactionState.MAJOR)<a name="line.8666"></a>
+<span class="sourceLineNo">8667</span>        : (hasMinor ? CompactionState.MINOR : CompactionState.NONE));<a name="line.8667"></a>
+<span class="sourceLineNo">8668</span>  }<a name="line.8668"></a>
+<span class="sourceLineNo">8669</span><a name="line.8669"></a>
+<span class="sourceLineNo">8670</span>  public void reportCompactionRequestStart(boolean isMajor){<a name="line.8670"></a>
+<span class="sourceLineNo">8671</span>    (isMajor ? majorInProgress : minorInProgress).incrementAndGet();<a name="line.8671"></a>
+<span class="sourceLineNo">8672</span>  }<a name="line.8672"></a>
+<span class="sourceLineNo">8673</span><a name="line.8673"></a>
+<span class="sourceLineNo">8674</span>  public void reportCompactionRequestEnd(boolean isMajor, int numFiles, long filesSizeCompacted) {<a name="line.8674"></a>
+<span class="sourceLineNo">8675</span>    int newValue = (isMajor ? majorInProgress : minorInProgress).decrementAndGet();<a name="line.8675"></a>
 <span class="sourceLineNo">8676</span><a name="line.8676"></a>
-<span class="sourceLineNo">8677</span>    assert newValue &gt;= 0;<a name="line.8677"></a>
-<span class="sourceLineNo">8678</span>  }<a name="line.8678"></a>
-<span class="sourceLineNo">8679</span><a name="line.8679"></a>
-<span class="sourceLineNo">8680</span>  public void reportCompactionRequestFailure() {<a name="line.8680"></a>
-<span class="sourceLineNo">8681</span>    compactionsFailed.increment();<a name="line.8681"></a>
-<span class="sourceLineNo">8682</span>  }<a name="line.8682"></a>
-<span class="sourceLineNo">8683</span><a name="line.8683"></a>
-<span class="sourceLineNo">8684</span>  public void incrementCompactionsQueuedCount() {<a name="line.8684"></a>
-<span class="sourceLineNo">8685</span>    compactionsQueued.increment();<a name="line.8685"></a>
-<span class="sourceLineNo">8686</span>  }<a name="line.8686"></a>
-<span class="sourceLineNo">8687</span><a name="line.8687"></a>
-<span class="sourceLineNo">8688</span>  public void decrementCompactionsQueuedCount() {<a name="line.8688"></a>
-<span class="sourceLineNo">8689</span>    compactionsQueued.decrement();<a name="line.8689"></a>
-<span class="sourceLineNo">8690</span>  }<a name="line.8690"></a>
-<span class="sourceLineNo">8691</span><a name="line.8691"></a>
-<span class="sourceLineNo">8692</span>  public void incrementFlushesQueuedCount() {<a name="line.8692"></a>
-<span class="sourceLineNo">8693</span>    flushesQueued.increment();<a name="line.8693"></a>
-<span class="sourceLineNo">8694</span>  }<a name="line.8694"></a>
-<span class="sourceLineNo">8695</span><a name="line.8695"></a>
-<span class="sourceLineNo">8696</span>  @VisibleForTesting<a name="line.8696"></a>
-<span class="sourceLineNo">8697</span>  public long getReadPoint() {<a name="line.8697"></a>
-<span class="sourceLineNo">8698</span>    return getReadPoint(IsolationLevel.READ_COMMITTED);<a name="line.8698"></a>
+<span class="sourceLineNo">8677</span>    // metrics<a name="line.8677"></a>
+<span class="sourceLineNo">8678</span>    compactionsFinished.increment();<a name="line.8678"></a>
+<span class="sourceLineNo">8679</span>    compactionNumFilesCompacted.add(numFiles);<a name="line.8679"></a>
+<span class="sourceLineNo">8680</span>    compactionNumBytesCompacted.add(filesSizeCompacted);<a name="line.8680"></a>
+<span class="sourceLineNo">8681</span><a name="line.8681"></a>
+<span class="sourceLineNo">8682</span>    assert newValue &gt;= 0;<a name="line.8682"></a>
+<span class="sourceLineNo">8683</span>  }<a name="line.8683"></a>
+<span class="sourceLineNo">8684</span><a name="line.8684"></a>
+<span class="sourceLineNo">8685</span>  public void reportCompactionRequestFailure() {<a name="line.8685"></a>
+<span class="sourceLineNo">8686</span>    compactionsFailed.increment();<a name="line.8686"></a>
+<span class="sourceLineNo">8687</span>  }<a name="line.8687"></a>
+<span class="sourceLineNo">8688</span><a name="line.8688"></a>
+<span class="sourceLineNo">8689</span>  public void incrementCompactionsQueuedCount() {<a name="line.8689"></a>
+<span class="sourceLineNo">8690</span>    compactionsQueued.increment();<a name="line.8690"></a>
+<span class="sourceLineNo">8691</span>  }<a name="line.8691"></a>
+<span class="sourceLineNo">8692</span><a name="line.8692"></a>
+<span class="sourceLineNo">8693</span>  public void decrementCompactionsQueuedCount() {<a name="line.8693"></a>
+<span class="sourceLineNo">8694</span>    compactionsQueued.decrement();<a name="line.8694"></a>
+<span class="sourceLineNo">8695</span>  }<a name="line.8695"></a>
+<span class="sourceLineNo">8696</span><a name="line.8696"></a>
+<span class="sourceLineNo">8697</span>  public void incrementFlushesQueuedCount() {<a name="line.8697"></a>
+<span class="sourceLineNo">8698</span>    flushesQueued.increment();<a name="line.8698"></a>
 <span class="sourceLineNo">8699</span>  }<a name="line.8699"></a>
 <span class="sourceLineNo">8700</span><a name="line.8700"></a>
-<span class="sourceLineNo">8701</span>  /**<a name="line.8701"></a>
-<span class="sourceLineNo">8702</span>   * {@inheritDoc}<a name="line.8702"></a>
-<span class="sourceLineNo">8703</span>   */<a name="line.8703"></a>
-<span class="sourceLineNo">8704</span>  @Override<a name="line.8704"></a>
-<span class="sourceLineNo">8705</span>  public void onConfigurationChange(Configuration conf) {<a name="line.8705"></a>
-<span class="sourceLineNo">8706</span>    this.storeHotnessProtector.update(conf);<a name="line.8706"></a>
-<span class="sourceLineNo">8707</span>  }<a name="line.8707"></a>
-<span class="sourceLineNo">8708</span><a name="line.8708"></a>
-<span class="sourceLineNo">8709</span>  /**<a name="line.8709"></a>
-<span class="sourceLineNo">8710</span>   * {@inheritDoc}<a name="line.8710"></a>
-<span class="sourceLineNo">8711</span>   */<a name="line.8711"></a>
-<span class="sourceLineNo">8712</span>  @Override<a name="line.8712"></a>
-<span class="sourceLineNo">8713</span>  public void registerChildren(ConfigurationManager manager) {<a name="line.8713"></a>
-<span class="sourceLineNo">8714</span>    configurationManager = Optional.of(manager);<a name="line.8714"></a>
-<span class="sourceLineNo">8715</span>    stores.values().forEach(manager::registerObserver);<a name="line.8715"></a>
-<span class="sourceLineNo">8716</span>  }<a name="line.8716"></a>
-<span class="sourceLineNo">8717</span><a name="line.8717"></a>
-<span class="sourceLineNo">8718</span>  /**<a name="line.8718"></a>
-<span class="sourceLineNo">8719</span>   * {@inheritDoc}<a name="line.8719"></a>
-<span class="sourceLineNo">8720</span>   */<a name="line.8720"></a>
-<span class="sourceLineNo">8721</span>  @Override<a name="line.8721"></a>
-<span class="sourceLineNo">8722</span>  public void deregisterChildren(ConfigurationManager manager) {<a name="line.8722"></a>
-<span class="sourceLineNo">8723</span>    stores.values().forEach(configurationManager.get()::deregisterObserver);<a name="line.8723"></a>
-<span class="sourceLineNo">8724</span>  }<a name="line.8724"></a>
-<span class="sourceLineNo">8725</span><a name="line.8725"></a>
+<span class="sourceLineNo">8701</span>  @VisibleForTesting<a name="line.8701"></a>
+<span class="sourceLineNo">8702</span>  public long getReadPoint() {<a name="line.8702"></a>
+<span class="sourceLineNo">8703</span>    return getReadPoint(IsolationLevel.READ_COMMITTED);<a name="line.8703"></a>
+<span class="sourceLineNo">8704</span>  }<a name="line.8704"></a>
+<span class="sourceLineNo">8705</span><a name="line.8705"></a>
+<span class="sourceLineNo">8706</span>  /**<a name="line.8706"></a>
+<span class="sourceLineNo">8707</span>   * {@inheritDoc}<a name="line.8707"></a>
+<span class="sourceLineNo">8708</span>   */<a name="line.8708"></a>
+<span class="sourceLineNo">8709</span>  @Override<a name="line.8709"></a>
+<span class="sourceLineNo">8710</span>  public void onConfigurationChange(Configuration conf) {<a name="line.8710"></a>
+<span class="sourceLineNo">8711</span>    this.storeHotnessProtector.update(conf);<a name="line.8711"></a>
+<span class="sourceLineNo">8712</span>  }<a name="line.8712"></a>
+<span class="sourceLineNo">8713</span><a name="line.8713"></a>
+<span class="sourceLineNo">8714</span>  /**<a name="line.8714"></a>
+<span class="sourceLineNo">8715</span>   * {@inheritDoc}<a name="line.8715"></a>
+<span class="sourceLineNo">8716</span>   */<a name="line.8716"></a>
+<span class="sourceLineNo">8717</span>  @Override<a name="line.8717"></a>
+<span class="sourceLineNo">8718</span>  public void registerChildren(ConfigurationManager manager) {<a name="line.8718"></a>
+<span class="sourceLineNo">8719</span>    configurationManager = Optional.of(manager);<a name="line.8719"></a>
+<span class="sourceLineNo">8720</span>    stores.values().forEach(manager::registerObserver);<a name="line.8720"></a>
+<span class="sourceLineNo">8721</span>  }<a name="line.8721"></a>
+<span class="sourceLineNo">8722</span><a name="line.8722"></a>
+<span class="sourceLineNo">8723</span>  /**<a name="line.8723"></a>
+<span class="sourceLineNo">8724</span>   * {@inheritDoc}<a name="line.8724"></a>
+<span class="sourceLineNo">8725</span>   */<a name="line.8725"></a>
 <span class="sourceLineNo">8726</span>  @Override<a name="line.8726"></a>
-<span class="sourceLineNo">8727</span>  public CellComparator getCellComparator() {<a name="line.8727"></a>
-<span class="sourceLineNo">8728</span>    return this.getRegionInfo().isMetaRegion() ? CellComparatorImpl.META_COMPARATOR<a name="line.8728"></a>
-<span class="sourceLineNo">8729</span>        : CellComparatorImpl.COMPARATOR;<a name="line.8729"></a>
-<span class="sourceLineNo">8730</span>  }<a name="line.8730"></a>
-<span class="sourceLineNo">8731</span><a name="line.8731"></a>
-<span class="sourceLineNo">8732</span>  public long getMemStoreFlushSize() {<a name="line.8732"></a>
-<span class="sourceLineNo">8733</span>    return this.memstoreFlushSize;<a name="line.8733"></a>
-<span class="sourceLineNo">8734</span>  }<a name="line.8734"></a>
-<span class="sourceLineNo">8735</span><a name="line.8735"></a>
+<span class="sourceLineNo">8727</span>  public void deregisterChildren(ConfigurationManager manager) {<a name="line.8727"></a>
+<span class="sourceLineNo">8728</span>    stores.values().forEach(configurationManager.get()::deregisterObserver);<a name="line.8728"></a>
+<span class="sourceLineNo">8729</span>  }<a name="line.8729"></a>
+<span class="sourceLineNo">8730</span><a name="line.8730"></a>
+<span class="sourceLineNo">8731</span>  @Override<a name="line.8731"></a>
+<span class="sourceLineNo">8732</span>  public CellComparator getCellComparator() {<a name="line.8732"></a>
+<span class="sourceLineNo">8733</span>    return this.getRegionInfo().isMetaRegion() ? CellComparatorImpl.META_COMPARATOR<a name="line.8733"></a>
+<span class="sourceLineNo">8734</span>        : CellComparatorImpl.COMPARATOR;<a name="line.8734"></a>
+<span class="sourceLineNo">8735</span>  }<a name="line.8735"></a>
 <span class="sourceLineNo">8736</span><a name="line.8736"></a>
-<span class="sourceLineNo">8737</span>  //// method for debugging tests<a name="line.8737"></a>
-<span class="sourceLineNo">8738</span>  void throwException(String title, String regionName) {<a name="line.8738"></a>
-<span class="sourceLineNo">8739</span>    StringBuilder buf = new StringBuilder();<a name="line.8739"></a>
-<span class="sourceLineNo">8740</span>    buf.append(title + ", ");<a name="line.8740"></a>
-<span class="sourceLineNo">8741</span>    buf.append(getRegionInfo().toString());<a name="line.8741"></a>
-<span class="sourceLineNo">8742</span>    buf.append(getRegionInfo().isMetaRegion() ? " meta region " : " ");<a name="line.8742"></a>
-<span class="sourceLineNo">8743</span>    buf.append("stores: ");<a name="line.8743"></a>
-<span class="sourceLineNo">8744</span>    for (HStore s : stores.values()) {<a name="line.8744"></a>
-<span class="sourceLineNo">8745</span>      buf.append(s.getColumnFamilyDescriptor().getNameAsString());<a name="line.8745"></a>
-<span class="sourceLineNo">8746</span>      buf.append(" size: ");<a name="line.8746"></a>
-<span class="sourceLineNo">8747</span>      buf.append(s.getMemStoreSize().getDataSize());<a name="line.8747"></a>
-<span class="sourceLineNo">8748</span>      buf.append(" ");<a name="line.8748"></a>
-<span class="sourceLineNo">8749</span>    }<a name="line.8749"></a>
-<span class="sourceLineNo">8750</span>    buf.append("end-of-stores");<a name="line.8750"></a>
-<span class="sourceLineNo">8751</span>    buf.append(", memstore size ");<a name="line.8751"></a>
-<span class="sourceLineNo">8752</span>    buf.append(getMemStoreDataSize());<a name="line.8752"></a>
-<span class="sourceLineNo">8753</span>    if (getRegionInfo().getRegionNameAsString().startsWith(regionName)) {<a name="line.8753"></a>
-<span class="sourceLineNo">8754</span>      throw new RuntimeException(buf.toString());<a name="line.8754"></a>
-<span class="sourceLineNo">8755</span>    }<a name="line.8755"></a>
-<span class="sourceLineNo">8756</span>  }<a name="line.8756"></a>
-<span class="sourceLineNo">8757</span><a name="line.8757"></a>
-<span class="sourceLineNo">8758</span>  @Override<a name="line.8758"></a>
-<span class="sourceLineNo">8759</span>  public void requestCompaction(String why, int priority, boolean major,<a name="line.8759"></a>
-<span class="sourceLineNo">8760</span>      CompactionLifeCycleTracker tracker) throws IOException {<a name="line.8760"></a>
-<span class="sourceLineNo">8761</span>    if (major) {<a name="line.8761"></a>
-<span class="sourceLineNo">8762</span>      stores.values().forEach(HStore::triggerMajorCompaction);<a name="line.8762"></a>
-<span class="sourceLineNo">8763</span>    }<a name="line.8763"></a>
-<span class="sourceLineNo">8764</span>    rsServices.getCompactionRequestor().requestCompaction(this, why, priority, tracker,<a name="line.8764"></a>
-<span class="sourceLineNo">8765</span>        RpcServer.getRequestUser().orElse(null));<a name="line.8765"></a>
-<span class="sourceLineNo">8766</span>  }<a name="line.8766"></a>
-<span class="sourceLineNo">8767</span><a name="line.8767"></a>
-<span class="sourceLineNo">8768</span>  @Override<a name="line.8768"></a>
-<span class="sourceLineNo">8769</span>  public void requestCompaction(byte[] family, String why, int priority, boolean major,<a name="line.8769"></a>
-<span class="sourceLineNo">8770</span>      CompactionLifeCycleTracker tracker) throws IOException {<a name="line.8770"></a>
-<span class="sourceLineNo">8771</span>    HStore store = stores.get(family);<a name="line.8771"></a>
-<span class="sourceLineNo">8772</span>    if (store == null) {<a name="line.8772"></a>
-<span class="sourceLineNo">8773</span>      throw new NoSuchColumnFamilyException("column family " + Bytes.toString(family) +<a name="line.8773"></a>
-<span class="sourceLineNo">8774</span>          " does not exist in region " + getRegionInfo().getRegionNameAsString());<a name="line.8774"></a>
-<span class="sourceLineNo">8775</span>    }<a name="line.8775"></a>
-<span class="sourceLineNo">8776</span>    if (major) {<a name="line.8776"></a>
-<span class="sourceLineNo">8777</span>      store.triggerMajorCompaction();<a name="line.8777"></a>
-<span class="sourceLineNo">8778</span>    }<a name="line.8778"></a>
-<span class="sourceLineNo">8779</span>    rsServices.getCompactionRequestor().requestCompaction(this, store, why, priority, tracker,<a name="line.8779"></a>
-<span class="sourceLineNo">8780</span>        RpcServer.getRequestUser().orElse(null));<a name="line.8780"></a>
-<span class="sourceLineNo">8781</span>  }<a name="line.8781"></a>
-<span class="sourceLineNo">8782</span><a name="line.8782"></a>
-<span class="sourceLineNo">8783</span>  private void requestFlushIfNeeded() throws RegionTooBusyException {<a name="line.8783"></a>
-<span class="sourceLineNo">8784</span>    if(isFlushSize(this.memStoreSizing.getMemStoreSize())) {<a name="line.8784"></a>
-<span class="sourceLineNo">8785</span>      requestFlush();<a name="line.8785"></a>
-<span class="sourceLineNo">8786</span>    }<a name="line.8786"></a>
-<span class="sourceLineNo">8787</span>  }<a name="line.8787"></a>
-<span class="sourceLineNo">8788</span><a name="line.8788"></a>
-<span class="sourceLineNo">8789</span>  private void requestFlush() {<a name="line.8789"></a>
-<span class="sourceLineNo">8790</span>    if (this.rsServices == null) {<a name="line.8790"></a>
-<span class="sourceLineNo">8791</span>      return;<a name="line.8791"></a>
-<span class="sourceLineNo">8792</span>    }<a name="line.8792"></a>
-<span class="sourceLineNo">8793</span>    requestFlush0(FlushLifeCycleTracker.DUMMY);<a name="line.8793"></a>
-<span class="sourceLineNo">8794</span>  }<a name="line.8794"></a>
-<span class="sourceLineNo">8795</span><a name="line.8795"></a>
-<span class="sourceLineNo">8796</span>  private void requestFlush0(FlushLifeCycleTracker tracker) {<a name="line.8796"></a>
-<span class="sourceLineNo">8797</span>    boolean shouldFlush = false;<a name="line.8797"></a>
-<span class="sourceLineNo">8798</span>    synchronized (writestate) {<a name="line.8798"></a>
-<span class="sourceLineNo">8799</span>      if (!this.writestate.isFlushRequested()) {<a name="line.8799"></a>
-<span class="sourceLineNo">8800</span>        shouldFlush = true;<a name="line.8800"></a>
-<span class="sourceLineNo">8801</span>        writestate.flushRequested = true;<a name="line.8801"></a>
-<span class="sourceLineNo">8802</span>      }<a name="line.8802"></a>
-<span class="sourceLineNo">8803</span>    }<a name="line.8803"></a>
-<span class="sourceLineNo">8804</span>    if (shouldFlush) {<a name="line.8804"></a>
-<span class="sourceLineNo">8805</span>      // Make request outside of synchronize block; HBASE-818.<a name="line.8805"></a>
-<span class="sourceLineNo">8806</span>      this.rsServices.getFlushRequester().requestFlush(this, false, tracker);<a name="line.8806"></a>
-<span class="sourceLineNo">8807</span>      if (LOG.isDebugEnabled()) {<a name="line.8807"></a>
-<span class="sourceLineNo">8808</span>        LOG.debug("Flush requested on " + this.getRegionInfo().getEncodedName());<a name="line.8808"></a>
-<span class="sourceLineNo">8809</span>      }<a name="line.8809"></a>
-<span class="sourceLineNo">8810</span>    } else {<a name="line.8810"></a>
-<span class="sourceLineNo">8811</span>      tracker.notExecuted("Flush already requested on " + this);<a name="line.8811"></a>
-<span class="sourceLineNo">8812</span>    }<a name="line.8812"></a>
-<span class="sourceLineNo">8813</span>  }<a name="line.8813"></a>
-<span class="sourceLineNo">8814</span><a name="line.8814"></a>
-<span class="sourceLineNo">8815</span>  @Override<a name="line.8815"></a>
-<span class="sourceLineNo">8816</span>  public void requestFlush(FlushLifeCycleTracker tracker) throws IOException {<a name="line.8816"></a>
-<span class="sourceLineNo">8817</span>    requestFlush0(tracker);<a name="line.8817"></a>
+<span class="sourceLineNo">8737</span>  public long getMemStoreFlushSize() {<a name="line.8737"></a>
+<span class="sourceLineNo">8738</span>    return this.memstoreFlushSize;<a name="line.8738"></a>
+<span class="sourceLineNo">8739</span>  }<a name="line.8739"></a>
+<span class="sourceLineNo">8740</span><a name="line.8740"></a>
+<span class="sourceLineNo">8741</span><a name="line.8741"></a>
+<span class="sourceLineNo">8742</span>  //// method for debugging tests<a name="line.8742"></a>
+<span class="sourceLineNo">8743</span>  void throwException(String title, String regionName) {<a name="line.8743"></a>
+<span class="sourceLineNo">8744</span>    StringBuilder buf = new StringBuilder();<a name="line.8744"></a>
+<span class="sourceLineNo">8745</span>    buf.append(title + ", ");<a name="line.8745"></a>
+<span class="sourceLineNo">8746</span>    buf.append(getRegionInfo().toString());<a name="line.8746"></a>
+<span class="sourceLineNo">8747</span>    buf.append(getRegionInfo().isMetaRegion() ? " meta region " : " ");<a name="line.8747"></a>
+<span class="sourceLineNo">8748</span>    buf.append("stores: ");<a name="line.8748"></a>
+<span class="sourceLineNo">8749</span>    for (HStore s : stores.values()) {<a name="line.8749"></a>
+<span class="sourceLineNo">8750</span>      buf.append(s.getColumnFamilyDescriptor().getNameAsString());<a name="line.8750"></a>
+<span class="sourceLineNo">8751</span>      buf.append(" size: ");<a name="line.8751"></a>
+<span class="sourceLineNo">8752</span>      buf.append(s.getMemStoreSize().getDataSize());<a name="line.8752"></a>
+<span class="sourceLineNo">8753</span>      buf.append(" ");<a name="line.8753"></a>
+<span class="sourceLineNo">8754</span>    }<a name="line.8754"></a>
+<span class="sourceLineNo">8755</span>    buf.append("end-of-stores");<a name="line.8755"></a>
+<span class="sourceLineNo">8756</span>    buf.append(", memstore size ");<a name="line.8756"></a>
+<span class="sourceLineNo">8757</span>    buf.append(getMemStoreDataSize());<a name="line.8757"></a>
+<span class="sourceLineNo">8758</span>    if (getRegionInfo().getRegionNameAsString().startsWith(regionName)) {<a name="line.8758"></a>
+<span class="sourceLineNo">8759</span>      throw new RuntimeException(buf.toString());<a name="line.8759"></a>
+<span class="sourceLineNo">8760</span>    }<a name="line.8760"></a>
+<span class="sourceLineNo">8761</span>  }<a name="line.8761"></a>
+<span class="sourceLineNo">8762</span><a name="line.8762"></a>
+<span class="sourceLineNo">8763</span>  @Override<a name="line.8763"></a>
+<span class="sourceLineNo">8764</span>  public void requestCompaction(String why, int priority, boolean major,<a name="line.8764"></a>
+<span class="sourceLineNo">8765</span>      CompactionLifeCycleTracker tracker) throws IOException {<a name="line.8765"></a>
+<span class="sourceLineNo">8766</span>    if (major) {<a name="line.8766"></a>
+<span class="sourceLineNo">8767</span>      stores.values().forEach(HStore::triggerMajorCompaction);<a name="line.8767"></a>
+<span class="sourceLineNo">8768</span>    }<a name="line.8768"></a>
+<span class="sourceLineNo">8769</span>    rsServices.getCompactionRequestor().requestCompaction(this, why, priority, tracker,<a name="line.8769"></a>
+<span class="sourceLineNo">8770</span>        RpcServer.getRequestUser().orElse(null));<a name="line.8770"></a>
+<span class="sourceLineNo">8771</span>  }<a name="line.8771"></a>
+<span class="sourceLineNo">8772</span><a name="line.8772"></a>
+<span class="sourceLineNo">8773</span>  @Override<a name="line.8773"></a>
+<span class="sourceLineNo">8774</span>  public void requestCompaction(byte[] family, String why, int priority, boolean major,<a name="line.8774"></a>
+<span class="sourceLineNo">8775</span>      CompactionLifeCycleTracker tracker) throws IOException {<a name="line.8775"></a>
+<span class="sourceLineNo">8776</span>    HStore store = stores.get(family);<a name="line.8776"></a>
+<span class="sourceLineNo">8777</span>    if (store == null) {<a name="line.8777"></a>
+<span class="sourceLineNo">8778</span>      throw new NoSuchColumnFamilyException("column family " + Bytes.toString(family) +<a name="line.8778"></a>
+<span class="sourceLineNo">8779</span>          " does not exist in region " + getRegionInfo().getRegionNameAsString());<a name="line.8779"></a>
+<span class="sourceLineNo">8780</span>    }<a name="line.8780"></a>
+<span class="sourceLineNo">8781</span>    if (major) {<a name="line.8781"></a>
+<span class="sourceLineNo">8782</span>      store.triggerMajorCompaction();<a name="line.8782"></a>
+<span class="sourceLineNo">8783</span>    }<a name="line.8783"></a>
+<span class="sourceLineNo">8784</span>    rsServices.getCompactionRequestor().requestCompaction(this, store, why, priority, tracker,<a name="line.8784"></a>
+<span class="sourceLineNo">8785</span>        RpcServer.getRequestUser().orElse(null));<a name="line.8785"></a>
+<span class="sourceLineNo">8786</span>  }<a name="line.8786"></a>
+<span class="sourceLineNo">8787</span><a name="line.8787"></a>
+<span class="sourceLineNo">8788</span>  private void requestFlushIfNeeded() throws RegionTooBusyException {<a name="line.8788"></a>
+<span class="sourceLineNo">8789</span>    if(isFlushSize(this.memStoreSizing.getMemStoreSize())) {<a name="line.8789"></a>
+<span class="sourceLineNo">8790</span>      requestFlush();<a name="line.8790"></a>
+<span class="sourceLineNo">8791</span>    }<a name="line.8791"></a>
+<span class="sourceLineNo">8792</span>  }<a name="line.8792"></a>
+<span class="sourceLineNo">8793</span><a name="line.8793"></a>
+<span class="sourceLineNo">8794</span>  private void requestFlush() {<a name="line.8794"></a>
+<span class="sourceLineNo">8795</span>    if (this.rsServices == null) {<a name="line.8795"></a>
+<span class="sourceLineNo">8796</span>      return;<a name="line.8796"></a>
+<span class="sourceLineNo">8797</span>    }<a name="line.8797"></a>
+<span class="sourceLineNo">8798</span>    requestFlush0(FlushLifeCycleTracker.DUMMY);<a name="line.8798"></a>
+<span class="sourceLineNo">8799</span>  }<a name="line.8799"></a>
+<span class="sourceLineNo">8800</span><a name="line.8800"></a>
+<span class="sourceLineNo">8801</span>  private void requestFlush0(FlushLifeCycleTracker tracker) {<a name="line.8801"></a>
+<span class="sourceLineNo">8802</span>    boolean shouldFlush = false;<a name="line.8802"></a>
+<span class="sourceLineNo">8803</span>    synchronized (writestate) {<a name="line.8803"></a>
+<span class="sourceLineNo">8804</span>      if (!this.writestate.isFlushRequested()) {<a name="line.8804"></a>
+<span class="sourceLineNo">8805</span>        shouldFlush = true;<a name="line.8805"></a>
+<span class="sourceLineNo">8806</span>        writestate.flushRequested = true;<a name="line.8806"></a>
+<span class="sourceLineNo">8807</span>      }<a name="line.8807"></a>
+<span class="sourceLineNo">8808</span>    }<a name="line.8808"></a>
+<span class="sourceLineNo">8809</span>    if (shouldFlush) {<a name="line.8809"></a>
+<span class="sourceLineNo">8810</span>      // Make request outside of synchronize block; HBASE-818.<a name="line.8810"></a>
+<span class="sourceLineNo">8811</span>      this.rsServices.getFlushRequester().requestFlush(this, false, tracker);<a name="line.8811"></a>
+<span class="sourceLineNo">8812</span>      if (LOG.isDebugEnabled()) {<a name="line.8812"></a>
+<span class="sourceLineNo">8813</span>        LOG.debug("Flush requested on " + this.getRegionInfo().getEncodedName());<a name="line.8813"></a>
+<span class="sourceLineNo">8814</span>      }<a name="line.8814"></a>
+<span class="sourceLineNo">8815</span>    } else {<a name="line.8815"></a>
+<span class="sourceLineNo">8816</span>      tracker.notExecuted("Flush already requested on " + this);<a name="line.8816"></a>
+<span class="sourceLineNo">8817</span>    }<a name="line.8817"></a>
 <span class="sourceLineNo">8818</span>  }<a name="line.8818"></a>
 <span class="sourceLineNo">8819</span><a name="line.8819"></a>
-<span class="sourceLineNo">8820</span>  /**<a name="line.8820"></a>
-<span class="sourceLineNo">8821</span>   * This method modifies the region's configuration in order to inject replication-related<a name="line.8821"></a>
-<span class="sourceLineNo">8822</span>   * features<a name="line.8822"></a>
-<span class="sourceLineNo">8823</span>   * @param conf region configurations<a name="line.8823"></a>
-<span class="sourceLineNo">8824</span>   */<a name="line.8824"></a>
-<span class="sourceLineNo">8825</span>  static void decorateRegionConfiguration(Configuration conf) {<a name="line.8825"></a>
-<span class="sourceLineNo">8826</span>    if (ReplicationUtils.isReplicationForBulkLoadDataEnabled(conf)) {<a name="line.8826"></a>
-<span class="sourceLineNo">8827</span>      String plugins = conf.get(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY,"");<a name="line.8827"></a>
-<span class="sourceLineNo">8828</span>      String replicationCoprocessorClass = ReplicationObserver.class.getCanonicalName();<a name="line.8828"></a>
-<span class="sourceLineNo">8829</span>      if (!plugins.contains(replicationCoprocessorClass)) {<a name="line.8829"></a>
-<span class="sourceLineNo">8830</span>        conf.set(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY,<a name="line.8830"></a>
-<span class="sourceLineNo">8831</span>            (plugins.equals("") ? "" : (plugins + ",")) + replicationCoprocessorClass);<a name="line.8831"></a>
-<span class="sourceLineNo">8832</span>      }<a name="line.8832"></a>
-<span class="sourceLineNo">8833</span>    }<a name="line.8833"></a>
-<span class="sourceLineNo">8834</span>  }<a name="line.8834"></a>
-<span class="sourceLineNo">8835</span>}<a name="line.8835"></a>
+<span class="sourceLineNo">8820</span>  @Override<a name="line.8820"></a>
+<span class="sourceLineNo">8821</span>  public void requestFlush(FlushLifeCycleTracker tracker) throws IOException {<a name="line.8821"></a>
+<span class="sourceLineNo">8822</span>    requestFlush0(tracker);<a name="line.8822"></a>
+<span class="sourceLineNo">8823</span>  }<a name="line.8823"></a>
+<span class="sourceLineNo">8824</span><a name="line.8824"></a>
+<span class="sourceLineNo">8825</span>  /**<a name="line.8825"></a>
+<span class="sourceLineNo">8826</span>   * This method modifies the region's configuration in order to inject replication-related<a name="line.8826"></a>
+<span class="sourceLineNo">8827</span>   * features<a name="line.8827"></a>
+<span class="sourceLineNo">8828</span>   * @param conf region configurations<a name="line.8828"></a>
+<span class="sourceLineNo">8829</span>   */<a name="line.8829"></a>
+<span class="sourceLineNo">8830</span>  static void decorateRegionConfiguration(Configuration conf) {<a name="line.8830"></a>
+<span class="sourceLineNo">8831</span>    if (ReplicationUtils.isReplicationForBulkLoadDataEnabled(conf)) {<a name="line.8831"></a>
+<span class="sourceLineNo">8832</span>      String plugins = conf.get(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY,"");<a name="line.8832"></a>
+<span class="sourceLineNo">8833</span>      String replicationCoprocessorClass = ReplicationObserver.class.getCanonicalName();<a name="line.8833"></a>
+<span class="sourceLineNo">8834</span>      if (!plugins.contains(replicationCoprocessorClass)) {<a name="line.8834"></a>
+<span class="sourceLineNo">8835</span>        conf.set(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY,<a name="line.8835"></a>
+<span class="sourceLineNo">8836</span>            (plugins.equals("") ? "" : (plugins + ",")) + replicationCoprocessorClass);<a name="line.8836"></a>
+<span class="sourceLineNo">8837</span>      }<a name="line.8837"></a>
+<span class="sourceLineNo">8838</span>    }<a name="line.8838"></a>
+<span class="sourceLineNo">8839</span>  }<a name="line.8839"></a>
+<span class="sourceLineNo">8840</span>}<a name="line.8840"></a>
 
 
 
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 8fcec33..2147e82 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
@@ -7972,875 +7972,880 @@
 <span class="sourceLineNo">7964</span>    if (walEdit.isReplay()) {<a name="line.7964"></a>
 <span class="sourceLineNo">7965</span>      walKey.setOrigLogSeqNum(origLogSeqNum);<a name="line.7965"></a>
 <span class="sourceLineNo">7966</span>    }<a name="line.7966"></a>
-<span class="sourceLineNo">7967</span>    WriteEntry writeEntry = null;<a name="line.7967"></a>
-<span class="sourceLineNo">7968</span>    try {<a name="line.7968"></a>
-<span class="sourceLineNo">7969</span>      long txid = this.wal.append(this.getRegionInfo(), walKey, walEdit, true);<a name="line.7969"></a>
-<span class="sourceLineNo">7970</span>      // Call sync on our edit.<a name="line.7970"></a>
-<span class="sourceLineNo">7971</span>      if (txid != 0) {<a name="line.7971"></a>
-<span class="sourceLineNo">7972</span>        sync(txid, durability);<a name="line.7972"></a>
-<span class="sourceLineNo">7973</span>      }<a name="line.7973"></a>
-<span class="sourceLineNo">7974</span>      writeEntry = walKey.getWriteEntry();<a name="line.7974"></a>
-<span class="sourceLineNo">7975</span>    } catch (IOException ioe) {<a name="line.7975"></a>
-<span class="sourceLineNo">7976</span>      if (walKey != null &amp;&amp; walKey.getWriteEntry() != null) {<a name="line.7976"></a>
-<span class="sourceLineNo">7977</span>        mvcc.complete(walKey.getWriteEntry());<a name="line.7977"></a>
+<span class="sourceLineNo">7967</span>    //don't call the coproc hook for writes to the WAL caused by<a name="line.7967"></a>
+<span class="sourceLineNo">7968</span>    //system lifecycle events like flushes or compactions<a name="line.7968"></a>
+<span class="sourceLineNo">7969</span>    if (this.coprocessorHost != null &amp;&amp; !walEdit.isMetaEdit()) {<a name="line.7969"></a>
+<span class="sourceLineNo">7970</span>      this.coprocessorHost.preWALAppend(walKey, walEdit);<a name="line.7970"></a>
+<span class="sourceLineNo">7971</span>    }<a name="line.7971"></a>
+<span class="sourceLineNo">7972</span>    WriteEntry writeEntry = null;<a name="line.7972"></a>
+<span class="sourceLineNo">7973</span>    try {<a name="line.7973"></a>
+<span class="sourceLineNo">7974</span>      long txid = this.wal.append(this.getRegionInfo(), walKey, walEdit, true);<a name="line.7974"></a>
+<span class="sourceLineNo">7975</span>      // Call sync on our edit.<a name="line.7975"></a>
+<span class="sourceLineNo">7976</span>      if (txid != 0) {<a name="line.7976"></a>
+<span class="sourceLineNo">7977</span>        sync(txid, durability);<a name="line.7977"></a>
 <span class="sourceLineNo">7978</span>      }<a name="line.7978"></a>
-<span class="sourceLineNo">7979</span>      throw ioe;<a name="line.7979"></a>
-<span class="sourceLineNo">7980</span>    }<a name="line.7980"></a>
-<span class="sourceLineNo">7981</span>    return writeEntry;<a name="line.7981"></a>
-<span class="sourceLineNo">7982</span>  }<a name="line.7982"></a>
-<span class="sourceLineNo">7983</span><a name="line.7983"></a>
-<span class="sourceLineNo">7984</span>  /**<a name="line.7984"></a>
-<span class="sourceLineNo">7985</span>   * Do coprocessor pre-increment or pre-append call.<a name="line.7985"></a>
-<span class="sourceLineNo">7986</span>   * @return Result returned out of the coprocessor, which means bypass all further processing and<a name="line.7986"></a>
-<span class="sourceLineNo">7987</span>   *  return the proffered Result instead, or null which means proceed.<a name="line.7987"></a>
-<span class="sourceLineNo">7988</span>   */<a name="line.7988"></a>
-<span class="sourceLineNo">7989</span>  private Result doCoprocessorPreCall(final Operation op, final Mutation mutation)<a name="line.7989"></a>
-<span class="sourceLineNo">7990</span>  throws IOException {<a name="line.7990"></a>
-<span class="sourceLineNo">7991</span>    Result result = null;<a name="line.7991"></a>
-<span class="sourceLineNo">7992</span>    if (this.coprocessorHost != null) {<a name="line.7992"></a>
-<span class="sourceLineNo">7993</span>      switch(op) {<a name="line.7993"></a>
-<span class="sourceLineNo">7994</span>        case INCREMENT:<a name="line.7994"></a>
-<span class="sourceLineNo">7995</span>          result = this.coprocessorHost.preIncrementAfterRowLock((Increment)mutation);<a name="line.7995"></a>
-<span class="sourceLineNo">7996</span>          break;<a name="line.7996"></a>
-<span class="sourceLineNo">7997</span>        case APPEND:<a name="line.7997"></a>
-<span class="sourceLineNo">7998</span>          result = this.coprocessorHost.preAppendAfterRowLock((Append)mutation);<a name="line.7998"></a>
-<span class="sourceLineNo">7999</span>          break;<a name="line.7999"></a>
-<span class="sourceLineNo">8000</span>        default: throw new UnsupportedOperationException(op.toString());<a name="line.8000"></a>
-<span class="sourceLineNo">8001</span>      }<a name="line.8001"></a>
-<span class="sourceLineNo">8002</span>    }<a name="line.8002"></a>
-<span class="sourceLineNo">8003</span>    return result;<a name="line.8003"></a>
-<span class="sourceLineNo">8004</span>  }<a name="line.8004"></a>
-<span class="sourceLineNo">8005</span><a name="line.8005"></a>
-<span class="sourceLineNo">8006</span>  /**<a name="line.8006"></a>
-<span class="sourceLineNo">8007</span>   * Reckon the Cells to apply to WAL, memstore, and to return to the Client; these Sets are not<a name="line.8007"></a>
-<span class="sourceLineNo">8008</span>   * always the same dependent on whether to write WAL.<a name="line.8008"></a>
-<span class="sourceLineNo">8009</span>   *<a name="line.8009"></a>
-<span class="sourceLineNo">8010</span>   * @param results Fill in here what goes back to the Client if it is non-null (if null, client<a name="line.8010"></a>
-<span class="sourceLineNo">8011</span>   *  doesn't want results).<a name="line.8011"></a>
-<span class="sourceLineNo">8012</span>   * @param forMemStore Fill in here what to apply to the MemStore (by Store).<a name="line.8012"></a>
-<span class="sourceLineNo">8013</span>   * @return A WALEdit to apply to WAL or null if we are to skip the WAL.<a name="line.8013"></a>
-<span class="sourceLineNo">8014</span>   */<a name="line.8014"></a>
-<span class="sourceLineNo">8015</span>  private WALEdit reckonDeltas(Operation op, Mutation mutation, Durability effectiveDurability,<a name="line.8015"></a>
-<span class="sourceLineNo">8016</span>      Map&lt;HStore, List&lt;Cell&gt;&gt; forMemStore, List&lt;Cell&gt; results) throws IOException {<a name="line.8016"></a>
-<span class="sourceLineNo">8017</span>    WALEdit walEdit = null;<a name="line.8017"></a>
-<span class="sourceLineNo">8018</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.8018"></a>
-<span class="sourceLineNo">8019</span>    final boolean writeToWAL = effectiveDurability != Durability.SKIP_WAL;<a name="line.8019"></a>
-<span class="sourceLineNo">8020</span>    // Process a Store/family at a time.<a name="line.8020"></a>
-<span class="sourceLineNo">8021</span>    for (Map.Entry&lt;byte [], List&lt;Cell&gt;&gt; entry: mutation.getFamilyCellMap().entrySet()) {<a name="line.8021"></a>
-<span class="sourceLineNo">8022</span>      final byte[] columnFamilyName = entry.getKey();<a name="line.8022"></a>
-<span class="sourceLineNo">8023</span>      List&lt;Cell&gt; deltas = entry.getValue();<a name="line.8023"></a>
-<span class="sourceLineNo">8024</span>      // Reckon for the Store what to apply to WAL and MemStore.<a name="line.8024"></a>
-<span class="sourceLineNo">8025</span>      List&lt;Cell&gt; toApply = reckonDeltasByStore(stores.get(columnFamilyName), op, mutation,<a name="line.8025"></a>
-<span class="sourceLineNo">8026</span>        effectiveDurability, now, deltas, results);<a name="line.8026"></a>
-<span class="sourceLineNo">8027</span>      if (!toApply.isEmpty()) {<a name="line.8027"></a>
-<span class="sourceLineNo">8028</span>        for (Cell cell : toApply) {<a name="line.8028"></a>
-<span class="sourceLineNo">8029</span>          HStore store = getStore(cell);<a name="line.8029"></a>
-<span class="sourceLineNo">8030</span>          if (store == null) {<a name="line.8030"></a>
-<span class="sourceLineNo">8031</span>            checkFamily(CellUtil.cloneFamily(cell));<a name="line.8031"></a>
-<span class="sourceLineNo">8032</span>          } else {<a name="line.8032"></a>
-<span class="sourceLineNo">8033</span>            forMemStore.computeIfAbsent(store, key -&gt; new ArrayList&lt;&gt;()).add(cell);<a name="line.8033"></a>
-<span class="sourceLineNo">8034</span>          }<a name="line.8034"></a>
-<span class="sourceLineNo">8035</span>        }<a name="line.8035"></a>
-<span class="sourceLineNo">8036</span>        if (writeToWAL) {<a name="line.8036"></a>
-<span class="sourceLineNo">8037</span>          if (walEdit == null) {<a name="line.8037"></a>
-<span class="sourceLineNo">8038</span>            walEdit = new WALEdit();<a name="line.8038"></a>
+<span class="sourceLineNo">7979</span>      writeEntry = walKey.getWriteEntry();<a name="line.7979"></a>
+<span class="sourceLineNo">7980</span>    } catch (IOException ioe) {<a name="line.7980"></a>
+<span class="sourceLineNo">7981</span>      if (walKey != null &amp;&amp; walKey.getWriteEntry() != null) {<a name="line.7981"></a>
+<span class="sourceLineNo">7982</span>        mvcc.complete(walKey.getWriteEntry());<a name="line.7982"></a>
+<span class="sourceLineNo">7983</span>      }<a name="line.7983"></a>
+<span class="sourceLineNo">7984</span>      throw ioe;<a name="line.7984"></a>
+<span class="sourceLineNo">7985</span>    }<a name="line.7985"></a>
+<span class="sourceLineNo">7986</span>    return writeEntry;<a name="line.7986"></a>
+<span class="sourceLineNo">7987</span>  }<a name="line.7987"></a>
+<span class="sourceLineNo">7988</span><a name="line.7988"></a>
+<span class="sourceLineNo">7989</span>  /**<a name="line.7989"></a>
+<span class="sourceLineNo">7990</span>   * Do coprocessor pre-increment or pre-append call.<a name="line.7990"></a>
+<span class="sourceLineNo">7991</span>   * @return Result returned out of the coprocessor, which means bypass all further processing and<a name="line.7991"></a>
+<span class="sourceLineNo">7992</span>   *  return the proffered Result instead, or null which means proceed.<a name="line.7992"></a>
+<span class="sourceLineNo">7993</span>   */<a name="line.7993"></a>
+<span class="sourceLineNo">7994</span>  private Result doCoprocessorPreCall(final Operation op, final Mutation mutation)<a name="line.7994"></a>
+<span class="sourceLineNo">7995</span>  throws IOException {<a name="line.7995"></a>
+<span class="sourceLineNo">7996</span>    Result result = null;<a name="line.7996"></a>
+<span class="sourceLineNo">7997</span>    if (this.coprocessorHost != null) {<a name="line.7997"></a>
+<span class="sourceLineNo">7998</span>      switch(op) {<a name="line.7998"></a>
+<span class="sourceLineNo">7999</span>        case INCREMENT:<a name="line.7999"></a>
+<span class="sourceLineNo">8000</span>          result = this.coprocessorHost.preIncrementAfterRowLock((Increment)mutation);<a name="line.8000"></a>
+<span class="sourceLineNo">8001</span>          break;<a name="line.8001"></a>
+<span class="sourceLineNo">8002</span>        case APPEND:<a name="line.8002"></a>
+<span class="sourceLineNo">8003</span>          result = this.coprocessorHost.preAppendAfterRowLock((Append)mutation);<a name="line.8003"></a>
+<span class="sourceLineNo">8004</span>          break;<a name="line.8004"></a>
+<span class="sourceLineNo">8005</span>        default: throw new UnsupportedOperationException(op.toString());<a name="line.8005"></a>
+<span class="sourceLineNo">8006</span>      }<a name="line.8006"></a>
+<span class="sourceLineNo">8007</span>    }<a name="line.8007"></a>
+<span class="sourceLineNo">8008</span>    return result;<a name="line.8008"></a>
+<span class="sourceLineNo">8009</span>  }<a name="line.8009"></a>
+<span class="sourceLineNo">8010</span><a name="line.8010"></a>
+<span class="sourceLineNo">8011</span>  /**<a name="line.8011"></a>
+<span class="sourceLineNo">8012</span>   * Reckon the Cells to apply to WAL, memstore, and to return to the Client; these Sets are not<a name="line.8012"></a>
+<span class="sourceLineNo">8013</span>   * always the same dependent on whether to write WAL.<a name="line.8013"></a>
+<span class="sourceLineNo">8014</span>   *<a name="line.8014"></a>
+<span class="sourceLineNo">8015</span>   * @param results Fill in here what goes back to the Client if it is non-null (if null, client<a name="line.8015"></a>
+<span class="sourceLineNo">8016</span>   *  doesn't want results).<a name="line.8016"></a>
+<span class="sourceLineNo">8017</span>   * @param forMemStore Fill in here what to apply to the MemStore (by Store).<a name="line.8017"></a>
+<span class="sourceLineNo">8018</span>   * @return A WALEdit to apply to WAL or null if we are to skip the WAL.<a name="line.8018"></a>
+<span class="sourceLineNo">8019</span>   */<a name="line.8019"></a>
+<span class="sourceLineNo">8020</span>  private WALEdit reckonDeltas(Operation op, Mutation mutation, Durability effectiveDurability,<a name="line.8020"></a>
+<span class="sourceLineNo">8021</span>      Map&lt;HStore, List&lt;Cell&gt;&gt; forMemStore, List&lt;Cell&gt; results) throws IOException {<a name="line.8021"></a>
+<span class="sourceLineNo">8022</span>    WALEdit walEdit = null;<a name="line.8022"></a>
+<span class="sourceLineNo">8023</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.8023"></a>
+<span class="sourceLineNo">8024</span>    final boolean writeToWAL = effectiveDurability != Durability.SKIP_WAL;<a name="line.8024"></a>
+<span class="sourceLineNo">8025</span>    // Process a Store/family at a time.<a name="line.8025"></a>
+<span class="sourceLineNo">8026</span>    for (Map.Entry&lt;byte [], List&lt;Cell&gt;&gt; entry: mutation.getFamilyCellMap().entrySet()) {<a name="line.8026"></a>
+<span class="sourceLineNo">8027</span>      final byte[] columnFamilyName = entry.getKey();<a name="line.8027"></a>
+<span class="sourceLineNo">8028</span>      List&lt;Cell&gt; deltas = entry.getValue();<a name="line.8028"></a>
+<span class="sourceLineNo">8029</span>      // Reckon for the Store what to apply to WAL and MemStore.<a name="line.8029"></a>
+<span class="sourceLineNo">8030</span>      List&lt;Cell&gt; toApply = reckonDeltasByStore(stores.get(columnFamilyName), op, mutation,<a name="line.8030"></a>
+<span class="sourceLineNo">8031</span>        effectiveDurability, now, deltas, results);<a name="line.8031"></a>
+<span class="sourceLineNo">8032</span>      if (!toApply.isEmpty()) {<a name="line.8032"></a>
+<span class="sourceLineNo">8033</span>        for (Cell cell : toApply) {<a name="line.8033"></a>
+<span class="sourceLineNo">8034</span>          HStore store = getStore(cell);<a name="line.8034"></a>
+<span class="sourceLineNo">8035</span>          if (store == null) {<a name="line.8035"></a>
+<span class="sourceLineNo">8036</span>            checkFamily(CellUtil.cloneFamily(cell));<a name="line.8036"></a>
+<span class="sourceLineNo">8037</span>          } else {<a name="line.8037"></a>
+<span class="sourceLineNo">8038</span>            forMemStore.computeIfAbsent(store, key -&gt; new ArrayList&lt;&gt;()).add(cell);<a name="line.8038"></a>
 <span class="sourceLineNo">8039</span>          }<a name="line.8039"></a>
-<span class="sourceLineNo">8040</span>          walEdit.getCells().addAll(toApply);<a name="line.8040"></a>
-<span class="sourceLineNo">8041</span>        }<a name="line.8041"></a>
-<span class="sourceLineNo">8042</span>      }<a name="line.8042"></a>
-<span class="sourceLineNo">8043</span>    }<a name="line.8043"></a>
-<span class="sourceLineNo">8044</span>    return walEdit;<a name="line.8044"></a>
-<span class="sourceLineNo">8045</span>  }<a name="line.8045"></a>
-<span class="sourceLineNo">8046</span><a name="line.8046"></a>
-<span class="sourceLineNo">8047</span>  /**<a name="line.8047"></a>
-<span class="sourceLineNo">8048</span>   * Reckon the Cells to apply to WAL, memstore, and to return to the Client in passed<a name="line.8048"></a>
-<span class="sourceLineNo">8049</span>   * column family/Store.<a name="line.8049"></a>
-<span class="sourceLineNo">8050</span>   *<a name="line.8050"></a>
-<span class="sourceLineNo">8051</span>   * Does Get of current value and then adds passed in deltas for this Store returning the result.<a name="line.8051"></a>
-<span class="sourceLineNo">8052</span>   *<a name="line.8052"></a>
-<span class="sourceLineNo">8053</span>   * @param op Whether Increment or Append<a name="line.8053"></a>
-<span class="sourceLineNo">8054</span>   * @param mutation The encompassing Mutation object<a name="line.8054"></a>
-<span class="sourceLineNo">8055</span>   * @param deltas Changes to apply to this Store; either increment amount or data to append<a name="line.8055"></a>
-<span class="sourceLineNo">8056</span>   * @param results In here we accumulate all the Cells we are to return to the client. If null,<a name="line.8056"></a>
-<span class="sourceLineNo">8057</span>   *                client doesn't want results returned.<a name="line.8057"></a>
-<span class="sourceLineNo">8058</span>   * @return Resulting Cells after &lt;code&gt;deltas&lt;/code&gt; have been applied to current<a name="line.8058"></a>
-<span class="sourceLineNo">8059</span>   *  values. Side effect is our filling out of the &lt;code&gt;results&lt;/code&gt; List.<a name="line.8059"></a>
-<span class="sourceLineNo">8060</span>   */<a name="line.8060"></a>
-<span class="sourceLineNo">8061</span>  private List&lt;Cell&gt; reckonDeltasByStore(HStore store, Operation op, Mutation mutation,<a name="line.8061"></a>
-<span class="sourceLineNo">8062</span>      Durability effectiveDurability, long now, List&lt;Cell&gt; deltas, List&lt;Cell&gt; results)<a name="line.8062"></a>
-<span class="sourceLineNo">8063</span>      throws IOException {<a name="line.8063"></a>
-<span class="sourceLineNo">8064</span>    byte[] columnFamily = store.getColumnFamilyDescriptor().getName();<a name="line.8064"></a>
-<span class="sourceLineNo">8065</span>    List&lt;Pair&lt;Cell, Cell&gt;&gt; cellPairs = new ArrayList&lt;&gt;(deltas.size());<a name="line.8065"></a>
-<span class="sourceLineNo">8066</span>    // Get previous values for all columns in this family.<a name="line.8066"></a>
-<span class="sourceLineNo">8067</span>    TimeRange tr = null;<a name="line.8067"></a>
-<span class="sourceLineNo">8068</span>    switch (op) {<a name="line.8068"></a>
-<span class="sourceLineNo">8069</span>      case INCREMENT:<a name="line.8069"></a>
-<span class="sourceLineNo">8070</span>        tr = ((Increment)mutation).getTimeRange();<a name="line.8070"></a>
-<span class="sourceLineNo">8071</span>        break;<a name="line.8071"></a>
-<span class="sourceLineNo">8072</span>      case APPEND:<a name="line.8072"></a>
-<span class="sourceLineNo">8073</span>        tr = ((Append)mutation).getTimeRange();<a name="line.8073"></a>
-<span class="sourceLineNo">8074</span>        break;<a name="line.8074"></a>
-<span class="sourceLineNo">8075</span>      default:<a name="line.8075"></a>
+<span class="sourceLineNo">8040</span>        }<a name="line.8040"></a>
+<span class="sourceLineNo">8041</span>        if (writeToWAL) {<a name="line.8041"></a>
+<span class="sourceLineNo">8042</span>          if (walEdit == null) {<a name="line.8042"></a>
+<span class="sourceLineNo">8043</span>            walEdit = new WALEdit();<a name="line.8043"></a>
+<span class="sourceLineNo">8044</span>          }<a name="line.8044"></a>
+<span class="sourceLineNo">8045</span>          walEdit.getCells().addAll(toApply);<a name="line.8045"></a>
+<span class="sourceLineNo">8046</span>        }<a name="line.8046"></a>
+<span class="sourceLineNo">8047</span>      }<a name="line.8047"></a>
+<span class="sourceLineNo">8048</span>    }<a name="line.8048"></a>
+<span class="sourceLineNo">8049</span>    return walEdit;<a name="line.8049"></a>
+<span class="sourceLineNo">8050</span>  }<a name="line.8050"></a>
+<span class="sourceLineNo">8051</span><a name="line.8051"></a>
+<span class="sourceLineNo">8052</span>  /**<a name="line.8052"></a>
+<span class="sourceLineNo">8053</span>   * Reckon the Cells to apply to WAL, memstore, and to return to the Client in passed<a name="line.8053"></a>
+<span class="sourceLineNo">8054</span>   * column family/Store.<a name="line.8054"></a>
+<span class="sourceLineNo">8055</span>   *<a name="line.8055"></a>
+<span class="sourceLineNo">8056</span>   * Does Get of current value and then adds passed in deltas for this Store returning the result.<a name="line.8056"></a>
+<span class="sourceLineNo">8057</span>   *<a name="line.8057"></a>
+<span class="sourceLineNo">8058</span>   * @param op Whether Increment or Append<a name="line.8058"></a>
+<span class="sourceLineNo">8059</span>   * @param mutation The encompassing Mutation object<a name="line.8059"></a>
+<span class="sourceLineNo">8060</span>   * @param deltas Changes to apply to this Store; either increment amount or data to append<a name="line.8060"></a>
+<span class="sourceLineNo">8061</span>   * @param results In here we accumulate all the Cells we are to return to the client. If null,<a name="line.8061"></a>
+<span class="sourceLineNo">8062</span>   *                client doesn't want results returned.<a name="line.8062"></a>
+<span class="sourceLineNo">8063</span>   * @return Resulting Cells after &lt;code&gt;deltas&lt;/code&gt; have been applied to current<a name="line.8063"></a>
+<span class="sourceLineNo">8064</span>   *  values. Side effect is our filling out of the &lt;code&gt;results&lt;/code&gt; List.<a name="line.8064"></a>
+<span class="sourceLineNo">8065</span>   */<a name="line.8065"></a>
+<span class="sourceLineNo">8066</span>  private List&lt;Cell&gt; reckonDeltasByStore(HStore store, Operation op, Mutation mutation,<a name="line.8066"></a>
+<span class="sourceLineNo">8067</span>      Durability effectiveDurability, long now, List&lt;Cell&gt; deltas, List&lt;Cell&gt; results)<a name="line.8067"></a>
+<span class="sourceLineNo">8068</span>      throws IOException {<a name="line.8068"></a>
+<span class="sourceLineNo">8069</span>    byte[] columnFamily = store.getColumnFamilyDescriptor().getName();<a name="line.8069"></a>
+<span class="sourceLineNo">8070</span>    List&lt;Pair&lt;Cell, Cell&gt;&gt; cellPairs = new ArrayList&lt;&gt;(deltas.size());<a name="line.8070"></a>
+<span class="sourceLineNo">8071</span>    // Get previous values for all columns in this family.<a name="line.8071"></a>
+<span class="sourceLineNo">8072</span>    TimeRange tr = null;<a name="line.8072"></a>
+<span class="sourceLineNo">8073</span>    switch (op) {<a name="line.8073"></a>
+<span class="sourceLineNo">8074</span>      case INCREMENT:<a name="line.8074"></a>
+<span class="sourceLineNo">8075</span>        tr = ((Increment)mutation).getTimeRange();<a name="line.8075"></a>
 <span class="sourceLineNo">8076</span>        break;<a name="line.8076"></a>
-<span class="sourceLineNo">8077</span>    }<a name="line.8077"></a>
-<span class="sourceLineNo">8078</span>    List&lt;Cell&gt; currentValues = get(mutation, store, deltas,null, tr);<a name="line.8078"></a>
-<span class="sourceLineNo">8079</span>    // Iterate the input columns and update existing values if they were found, otherwise<a name="line.8079"></a>
-<span class="sourceLineNo">8080</span>    // add new column initialized to the delta amount<a name="line.8080"></a>
-<span class="sourceLineNo">8081</span>    int currentValuesIndex = 0;<a name="line.8081"></a>
-<span class="sourceLineNo">8082</span>    for (int i = 0; i &lt; deltas.size(); i++) {<a name="line.8082"></a>
-<span class="sourceLineNo">8083</span>      Cell delta = deltas.get(i);<a name="line.8083"></a>
-<span class="sourceLineNo">8084</span>      Cell currentValue = null;<a name="line.8084"></a>
-<span class="sourceLineNo">8085</span>      if (currentValuesIndex &lt; currentValues.size() &amp;&amp;<a name="line.8085"></a>
-<span class="sourceLineNo">8086</span>          CellUtil.matchingQualifier(currentValues.get(currentValuesIndex), delta)) {<a name="line.8086"></a>
-<span class="sourceLineNo">8087</span>        currentValue = currentValues.get(currentValuesIndex);<a name="line.8087"></a>
-<span class="sourceLineNo">8088</span>        if (i &lt; (deltas.size() - 1) &amp;&amp; !CellUtil.matchingQualifier(delta, deltas.get(i + 1))) {<a name="line.8088"></a>
-<span class="sourceLineNo">8089</span>          currentValuesIndex++;<a name="line.8089"></a>
-<span class="sourceLineNo">8090</span>        }<a name="line.8090"></a>
-<span class="sourceLineNo">8091</span>      }<a name="line.8091"></a>
-<span class="sourceLineNo">8092</span><a name="line.8092"></a>
-<span class="sourceLineNo">8093</span>      // Switch on whether this an increment or an append building the new Cell to apply.<a name="line.8093"></a>
-<span class="sourceLineNo">8094</span>      Cell newCell = null;<a name="line.8094"></a>
-<span class="sourceLineNo">8095</span>      switch (op) {<a name="line.8095"></a>
-<span class="sourceLineNo">8096</span>        case INCREMENT:<a name="line.8096"></a>
-<span class="sourceLineNo">8097</span>          long deltaAmount = getLongValue(delta);<a name="line.8097"></a>
-<span class="sourceLineNo">8098</span>          final long newValue = currentValue == null ? deltaAmount : getLongValue(currentValue) + deltaAmount;<a name="line.8098"></a>
-<span class="sourceLineNo">8099</span>          newCell = reckonDelta(delta, currentValue, columnFamily, now, mutation, (oldCell) -&gt; Bytes.toBytes(newValue));<a name="line.8099"></a>
-<span class="sourceLineNo">8100</span>          break;<a name="line.8100"></a>
-<span class="sourceLineNo">8101</span>        case APPEND:<a name="line.8101"></a>
-<span class="sourceLineNo">8102</span>          newCell = reckonDelta(delta, currentValue, columnFamily, now, mutation, (oldCell) -&gt;<a name="line.8102"></a>
-<span class="sourceLineNo">8103</span>            ByteBuffer.wrap(new byte[delta.getValueLength() + oldCell.getValueLength()])<a name="line.8103"></a>
-<span class="sourceLineNo">8104</span>                    .put(oldCell.getValueArray(), oldCell.getValueOffset(), oldCell.getValueLength())<a name="line.8104"></a>
-<span class="sourceLineNo">8105</span>                    .put(delta.getValueArray(), delta.getValueOffset(), delta.getValueLength())<a name="line.8105"></a>
-<span class="sourceLineNo">8106</span>                    .array()<a name="line.8106"></a>
-<span class="sourceLineNo">8107</span>          );<a name="line.8107"></a>
-<span class="sourceLineNo">8108</span>          break;<a name="line.8108"></a>
-<span class="sourceLineNo">8109</span>        default: throw new UnsupportedOperationException(op.toString());<a name="line.8109"></a>
-<span class="sourceLineNo">8110</span>      }<a name="line.8110"></a>
-<span class="sourceLineNo">8111</span>      int newCellSize = PrivateCellUtil.estimatedSerializedSizeOf(newCell);<a name="line.8111"></a>
-<span class="sourceLineNo">8112</span>      if (newCellSize &gt; this.maxCellSize) {<a name="line.8112"></a>
-<span class="sourceLineNo">8113</span>        String msg = "Cell with size " + newCellSize + " exceeds limit of " +<a name="line.8113"></a>
-<span class="sourceLineNo">8114</span>            this.maxCellSize + " bytes";<a name="line.8114"></a>
-<span class="sourceLineNo">8115</span>        if (LOG.isDebugEnabled()) {<a name="line.8115"></a>
-<span class="sourceLineNo">8116</span>          LOG.debug(msg);<a name="line.8116"></a>
-<span class="sourceLineNo">8117</span>        }<a name="line.8117"></a>
-<span class="sourceLineNo">8118</span>        throw new DoNotRetryIOException(msg);<a name="line.8118"></a>
-<span class="sourceLineNo">8119</span>      }<a name="line.8119"></a>
-<span class="sourceLineNo">8120</span>      cellPairs.add(new Pair&lt;&gt;(currentValue, newCell));<a name="line.8120"></a>
-<span class="sourceLineNo">8121</span>      // Add to results to get returned to the Client. If null, cilent does not want results.<a name="line.8121"></a>
-<span class="sourceLineNo">8122</span>      if (results != null) {<a name="line.8122"></a>
-<span class="sourceLineNo">8123</span>        results.add(newCell);<a name="line.8123"></a>
+<span class="sourceLineNo">8077</span>      case APPEND:<a name="line.8077"></a>
+<span class="sourceLineNo">8078</span>        tr = ((Append)mutation).getTimeRange();<a name="line.8078"></a>
+<span class="sourceLineNo">8079</span>        break;<a name="line.8079"></a>
+<span class="sourceLineNo">8080</span>      default:<a name="line.8080"></a>
+<span class="sourceLineNo">8081</span>        break;<a name="line.8081"></a>
+<span class="sourceLineNo">8082</span>    }<a name="line.8082"></a>
+<span class="sourceLineNo">8083</span>    List&lt;Cell&gt; currentValues = get(mutation, store, deltas,null, tr);<a name="line.8083"></a>
+<span class="sourceLineNo">8084</span>    // Iterate the input columns and update existing values if they were found, otherwise<a name="line.8084"></a>
+<span class="sourceLineNo">8085</span>    // add new column initialized to the delta amount<a name="line.8085"></a>
+<span class="sourceLineNo">8086</span>    int currentValuesIndex = 0;<a name="line.8086"></a>
+<span class="sourceLineNo">8087</span>    for (int i = 0; i &lt; deltas.size(); i++) {<a name="line.8087"></a>
+<span class="sourceLineNo">8088</span>      Cell delta = deltas.get(i);<a name="line.8088"></a>
+<span class="sourceLineNo">8089</span>      Cell currentValue = null;<a name="line.8089"></a>
+<span class="sourceLineNo">8090</span>      if (currentValuesIndex &lt; currentValues.size() &amp;&amp;<a name="line.8090"></a>
+<span class="sourceLineNo">8091</span>          CellUtil.matchingQualifier(currentValues.get(currentValuesIndex), delta)) {<a name="line.8091"></a>
+<span class="sourceLineNo">8092</span>        currentValue = currentValues.get(currentValuesIndex);<a name="line.8092"></a>
+<span class="sourceLineNo">8093</span>        if (i &lt; (deltas.size() - 1) &amp;&amp; !CellUtil.matchingQualifier(delta, deltas.get(i + 1))) {<a name="line.8093"></a>
+<span class="sourceLineNo">8094</span>          currentValuesIndex++;<a name="line.8094"></a>
+<span class="sourceLineNo">8095</span>        }<a name="line.8095"></a>
+<span class="sourceLineNo">8096</span>      }<a name="line.8096"></a>
+<span class="sourceLineNo">8097</span><a name="line.8097"></a>
+<span class="sourceLineNo">8098</span>      // Switch on whether this an increment or an append building the new Cell to apply.<a name="line.8098"></a>
+<span class="sourceLineNo">8099</span>      Cell newCell = null;<a name="line.8099"></a>
+<span class="sourceLineNo">8100</span>      switch (op) {<a name="line.8100"></a>
+<span class="sourceLineNo">8101</span>        case INCREMENT:<a name="line.8101"></a>
+<span class="sourceLineNo">8102</span>          long deltaAmount = getLongValue(delta);<a name="line.8102"></a>
+<span class="sourceLineNo">8103</span>          final long newValue = currentValue == null ? deltaAmount : getLongValue(currentValue) + deltaAmount;<a name="line.8103"></a>
+<span class="sourceLineNo">8104</span>          newCell = reckonDelta(delta, currentValue, columnFamily, now, mutation, (oldCell) -&gt; Bytes.toBytes(newValue));<a name="line.8104"></a>
+<span class="sourceLineNo">8105</span>          break;<a name="line.8105"></a>
+<span class="sourceLineNo">8106</span>        case APPEND:<a name="line.8106"></a>
+<span class="sourceLineNo">8107</span>          newCell = reckonDelta(delta, currentValue, columnFamily, now, mutation, (oldCell) -&gt;<a name="line.8107"></a>
+<span class="sourceLineNo">8108</span>            ByteBuffer.wrap(new byte[delta.getValueLength() + oldCell.getValueLength()])<a name="line.8108"></a>
+<span class="sourceLineNo">8109</span>                    .put(oldCell.getValueArray(), oldCell.getValueOffset(), oldCell.getValueLength())<a name="line.8109"></a>
+<span class="sourceLineNo">8110</span>                    .put(delta.getValueArray(), delta.getValueOffset(), delta.getValueLength())<a name="line.8110"></a>
+<span class="sourceLineNo">8111</span>                    .array()<a name="line.8111"></a>
+<span class="sourceLineNo">8112</span>          );<a name="line.8112"></a>
+<span class="sourceLineNo">8113</span>          break;<a name="line.8113"></a>
+<span class="sourceLineNo">8114</span>        default: throw new UnsupportedOperationException(op.toString());<a name="line.8114"></a>
+<span class="sourceLineNo">8115</span>      }<a name="line.8115"></a>
+<span class="sourceLineNo">8116</span>      int newCellSize = PrivateCellUtil.estimatedSerializedSizeOf(newCell);<a name="line.8116"></a>
+<span class="sourceLineNo">8117</span>      if (newCellSize &gt; this.maxCellSize) {<a name="line.8117"></a>
+<span class="sourceLineNo">8118</span>        String msg = "Cell with size " + newCellSize + " exceeds limit of " +<a name="line.8118"></a>
+<span class="sourceLineNo">8119</span>            this.maxCellSize + " bytes";<a name="line.8119"></a>
+<span class="sourceLineNo">8120</span>        if (LOG.isDebugEnabled()) {<a name="line.8120"></a>
+<span class="sourceLineNo">8121</span>          LOG.debug(msg);<a name="line.8121"></a>
+<span class="sourceLineNo">8122</span>        }<a name="line.8122"></a>
+<span class="sourceLineNo">8123</span>        throw new DoNotRetryIOException(msg);<a name="line.8123"></a>
 <span class="sourceLineNo">8124</span>      }<a name="line.8124"></a>
-<span class="sourceLineNo">8125</span>    }<a name="line.8125"></a>
-<span class="sourceLineNo">8126</span><a name="line.8126"></a>
-<span class="sourceLineNo">8127</span>    // Give coprocessors a chance to update the new cells before apply to WAL or memstore<a name="line.8127"></a>
-<span class="sourceLineNo">8128</span>    if (coprocessorHost != null) {<a name="line.8128"></a>
-<span class="sourceLineNo">8129</span>      // Here the operation must be increment or append.<a name="line.8129"></a>
-<span class="sourceLineNo">8130</span>      cellPairs = op == Operation.INCREMENT ?<a name="line.8130"></a>
-<span class="sourceLineNo">8131</span>          coprocessorHost.postIncrementBeforeWAL(mutation, cellPairs) :<a name="line.8131"></a>
-<span class="sourceLineNo">8132</span>          coprocessorHost.postAppendBeforeWAL(mutation, cellPairs);<a name="line.8132"></a>
-<span class="sourceLineNo">8133</span>    }<a name="line.8133"></a>
-<span class="sourceLineNo">8134</span>    return cellPairs.stream().map(Pair::getSecond).collect(Collectors.toList());<a name="line.8134"></a>
-<span class="sourceLineNo">8135</span>  }<a name="line.8135"></a>
-<span class="sourceLineNo">8136</span><a name="line.8136"></a>
-<span class="sourceLineNo">8137</span>  private static Cell reckonDelta(final Cell delta, final Cell currentCell,<a name="line.8137"></a>
-<span class="sourceLineNo">8138</span>                                  final byte[] columnFamily, final long now,<a name="line.8138"></a>
-<span class="sourceLineNo">8139</span>                                  Mutation mutation, Function&lt;Cell, byte[]&gt; supplier) throws IOException {<a name="line.8139"></a>
-<span class="sourceLineNo">8140</span>    // Forward any tags found on the delta.<a name="line.8140"></a>
-<span class="sourceLineNo">8141</span>    List&lt;Tag&gt; tags = TagUtil.carryForwardTags(delta);<a name="line.8141"></a>
-<span class="sourceLineNo">8142</span>    tags = TagUtil.carryForwardTTLTag(tags, mutation.getTTL());<a name="line.8142"></a>
-<span class="sourceLineNo">8143</span>    if (currentCell != null) {<a name="line.8143"></a>
-<span class="sourceLineNo">8144</span>      tags = TagUtil.carryForwardTags(tags, currentCell);<a name="line.8144"></a>
-<span class="sourceLineNo">8145</span>      byte[] newValue = supplier.apply(currentCell);<a name="line.8145"></a>
-<span class="sourceLineNo">8146</span>      return ExtendedCellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.8146"></a>
-<span class="sourceLineNo">8147</span>              .setRow(mutation.getRow(), 0, mutation.getRow().length)<a name="line.8147"></a>
-<span class="sourceLineNo">8148</span>              .setFamily(columnFamily, 0, columnFamily.length)<a name="line.8148"></a>
-<span class="sourceLineNo">8149</span>              // copy the qualifier if the cell is located in shared memory.<a name="line.8149"></a>
-<span class="sourceLineNo">8150</span>              .setQualifier(CellUtil.cloneQualifier(delta))<a name="line.8150"></a>
-<span class="sourceLineNo">8151</span>              .setTimestamp(Math.max(currentCell.getTimestamp() + 1, now))<a name="line.8151"></a>
-<span class="sourceLineNo">8152</span>              .setType(KeyValue.Type.Put.getCode())<a name="line.8152"></a>
-<span class="sourceLineNo">8153</span>              .setValue(newValue, 0, newValue.length)<a name="line.8153"></a>
-<span class="sourceLineNo">8154</span>              .setTags(TagUtil.fromList(tags))<a name="line.8154"></a>
-<span class="sourceLineNo">8155</span>              .build();<a name="line.8155"></a>
-<span class="sourceLineNo">8156</span>    } else {<a name="line.8156"></a>
-<span class="sourceLineNo">8157</span>      PrivateCellUtil.updateLatestStamp(delta, now);<a name="line.8157"></a>
-<span class="sourceLineNo">8158</span>      return CollectionUtils.isEmpty(tags) ? delta : PrivateCellUtil.createCell(delta, tags);<a name="line.8158"></a>
-<span class="sourceLineNo">8159</span>    }<a name="line.8159"></a>
-<span class="sourceLineNo">8160</span>  }<a name="line.8160"></a>
-<span class="sourceLineNo">8161</span><a name="line.8161"></a>
-<span class="sourceLineNo">8162</span>  /**<a name="line.8162"></a>
-<span class="sourceLineNo">8163</span>   * @return Get the long out of the passed in Cell<a name="line.8163"></a>
-<span class="sourceLineNo">8164</span>   */<a name="line.8164"></a>
-<span class="sourceLineNo">8165</span>  private static long getLongValue(final Cell cell) throws DoNotRetryIOException {<a name="line.8165"></a>
-<span class="sourceLineNo">8166</span>    int len = cell.getValueLength();<a name="line.8166"></a>
-<span class="sourceLineNo">8167</span>    if (len != Bytes.SIZEOF_LONG) {<a name="line.8167"></a>
-<span class="sourceLineNo">8168</span>      // throw DoNotRetryIOException instead of IllegalArgumentException<a name="line.8168"></a>
-<span class="sourceLineNo">8169</span>      throw new DoNotRetryIOException("Field is not a long, it's " + len + " bytes wide");<a name="line.8169"></a>
-<span class="sourceLineNo">8170</span>    }<a name="line.8170"></a>
-<span class="sourceLineNo">8171</span>    return PrivateCellUtil.getValueAsLong(cell);<a name="line.8171"></a>
-<span class="sourceLineNo">8172</span>  }<a name="line.8172"></a>
-<span class="sourceLineNo">8173</span><a name="line.8173"></a>
-<span class="sourceLineNo">8174</span>  /**<a name="line.8174"></a>
-<span class="sourceLineNo">8175</span>   * Do a specific Get on passed &lt;code&gt;columnFamily&lt;/code&gt; and column qualifiers.<a name="line.8175"></a>
-<span class="sourceLineNo">8176</span>   * @param mutation Mutation we are doing this Get for.<a name="line.8176"></a>
-<span class="sourceLineNo">8177</span>   * @param store Which column family on row (TODO: Go all Gets in one go)<a name="line.8177"></a>
-<span class="sourceLineNo">8178</span>   * @param coordinates Cells from &lt;code&gt;mutation&lt;/code&gt; used as coordinates applied to Get.<a name="line.8178"></a>
-<span class="sourceLineNo">8179</span>   * @return Return list of Cells found.<a name="line.8179"></a>
-<span class="sourceLineNo">8180</span>   */<a name="line.8180"></a>
-<span class="sourceLineNo">8181</span>  private List&lt;Cell&gt; get(Mutation mutation, HStore store, List&lt;Cell&gt; coordinates,<a name="line.8181"></a>
-<span class="sourceLineNo">8182</span>      IsolationLevel isolation, TimeRange tr) throws IOException {<a name="line.8182"></a>
-<span class="sourceLineNo">8183</span>    // Sort the cells so that they match the order that they appear in the Get results. Otherwise,<a name="line.8183"></a>
-<span class="sourceLineNo">8184</span>    // we won't be able to find the existing values if the cells are not specified in order by the<a name="line.8184"></a>
-<span class="sourceLineNo">8185</span>    // client since cells are in an array list.<a name="line.8185"></a>
-<span class="sourceLineNo">8186</span>    // TODO: I don't get why we are sorting. St.Ack 20150107<a name="line.8186"></a>
-<span class="sourceLineNo">8187</span>    sort(coordinates, store.getComparator());<a name="line.8187"></a>
-<span class="sourceLineNo">8188</span>    Get get = new Get(mutation.getRow());<a name="line.8188"></a>
-<span class="sourceLineNo">8189</span>    if (isolation != null) {<a name="line.8189"></a>
-<span class="sourceLineNo">8190</span>      get.setIsolationLevel(isolation);<a name="line.8190"></a>
-<span class="sourceLineNo">8191</span>    }<a name="line.8191"></a>
-<span class="sourceLineNo">8192</span>    for (Cell cell: coordinates) {<a name="line.8192"></a>
-<span class="sourceLineNo">8193</span>      get.addColumn(store.getColumnFamilyDescriptor().getName(), CellUtil.cloneQualifier(cell));<a name="line.8193"></a>
-<span class="sourceLineNo">8194</span>    }<a name="line.8194"></a>
-<span class="sourceLineNo">8195</span>    // Increments carry time range. If an Increment instance, put it on the Get.<a name="line.8195"></a>
-<span class="sourceLineNo">8196</span>    if (tr != null) {<a name="line.8196"></a>
-<span class="sourceLineNo">8197</span>      get.setTimeRange(tr.getMin(), tr.getMax());<a name="line.8197"></a>
-<span class="sourceLineNo">8198</span>    }<a name="line.8198"></a>
-<span class="sourceLineNo">8199</span>    return get(get, false);<a name="line.8199"></a>
-<span class="sourceLineNo">8200</span>  }<a name="line.8200"></a>
-<span class="sourceLineNo">8201</span><a name="line.8201"></a>
-<span class="sourceLineNo">8202</span>  /**<a name="line.8202"></a>
-<span class="sourceLineNo">8203</span>   * @return Sorted list of &lt;code&gt;cells&lt;/code&gt; using &lt;code&gt;comparator&lt;/code&gt;<a name="line.8203"></a>
-<span class="sourceLineNo">8204</span>   */<a name="line.8204"></a>
-<span class="sourceLineNo">8205</span>  private static List&lt;Cell&gt; sort(List&lt;Cell&gt; cells, final CellComparator comparator) {<a name="line.8205"></a>
-<span class="sourceLineNo">8206</span>    cells.sort(comparator);<a name="line.8206"></a>
-<span class="sourceLineNo">8207</span>    return cells;<a name="line.8207"></a>
-<span class="sourceLineNo">8208</span>  }<a name="line.8208"></a>
-<span class="sourceLineNo">8209</span><a name="line.8209"></a>
-<span class="sourceLineNo">8210</span>  public static final long FIXED_OVERHEAD = ClassSize.align(<a name="line.8210"></a>
-<span class="sourceLineNo">8211</span>      ClassSize.OBJECT +<a name="line.8211"></a>
-<span class="sourceLineNo">8212</span>      ClassSize.ARRAY +<a name="line.8212"></a>
-<span class="sourceLineNo">8213</span>      55 * ClassSize.REFERENCE + 3 * Bytes.SIZEOF_INT +<a name="line.8213"></a>
-<span class="sourceLineNo">8214</span>      (15 * Bytes.SIZEOF_LONG) +<a name="line.8214"></a>
-<span class="sourceLineNo">8215</span>      3 * Bytes.SIZEOF_BOOLEAN);<a name="line.8215"></a>
-<span class="sourceLineNo">8216</span><a name="line.8216"></a>
-<span class="sourceLineNo">8217</span>  // woefully out of date - currently missing:<a name="line.8217"></a>
-<span class="sourceLineNo">8218</span>  // 1 x HashMap - coprocessorServiceHandlers<a name="line.8218"></a>
-<span class="sourceLineNo">8219</span>  // 6 x LongAdder - numMutationsWithoutWAL, dataInMemoryWithoutWAL,<a name="line.8219"></a>
-<span class="sourceLineNo">8220</span>  //   checkAndMutateChecksPassed, checkAndMutateChecksFailed, readRequestsCount,<a name="line.8220"></a>
-<span class="sourceLineNo">8221</span>  //   writeRequestsCount, cpRequestsCount<a name="line.8221"></a>
-<span class="sourceLineNo">8222</span>  // 1 x HRegion$WriteState - writestate<a name="line.8222"></a>
-<span class="sourceLineNo">8223</span>  // 1 x RegionCoprocessorHost - coprocessorHost<a name="line.8223"></a>
-<span class="sourceLineNo">8224</span>  // 1 x RegionSplitPolicy - splitPolicy<a name="line.8224"></a>
-<span class="sourceLineNo">8225</span>  // 1 x MetricsRegion - metricsRegion<a name="line.8225"></a>
-<span class="sourceLineNo">8226</span>  // 1 x MetricsRegionWrapperImpl - metricsRegionWrapper<a name="line.8226"></a>
-<span class="sourceLineNo">8227</span>  public static final long DEEP_OVERHEAD = FIXED_OVERHEAD +<a name="line.8227"></a>
-<span class="sourceLineNo">8228</span>      ClassSize.OBJECT + // closeLock<a name="line.8228"></a>
-<span class="sourceLineNo">8229</span>      (2 * ClassSize.ATOMIC_BOOLEAN) + // closed, closing<a name="line.8229"></a>
-<span class="sourceLineNo">8230</span>      (3 * ClassSize.ATOMIC_LONG) + // numPutsWithoutWAL, dataInMemoryWithoutWAL,<a name="line.8230"></a>
-<span class="sourceLineNo">8231</span>                                    // compactionsFailed<a name="line.8231"></a>
-<span class="sourceLineNo">8232</span>      (2 * ClassSize.CONCURRENT_HASHMAP) +  // lockedRows, scannerReadPoints<a name="line.8232"></a>
-<span class="sourceLineNo">8233</span>      WriteState.HEAP_SIZE + // writestate<a name="line.8233"></a>
-<span class="sourceLineNo">8234</span>      ClassSize.CONCURRENT_SKIPLISTMAP + ClassSize.CONCURRENT_SKIPLISTMAP_ENTRY + // stores<a name="line.8234"></a>
-<span class="sourceLineNo">8235</span>      (2 * ClassSize.REENTRANT_LOCK) + // lock, updatesLock<a name="line.8235"></a>
-<span class="sourceLineNo">8236</span>      MultiVersionConcurrencyControl.FIXED_SIZE // mvcc<a name="line.8236"></a>
-<span class="sourceLineNo">8237</span>      + 2 * ClassSize.TREEMAP // maxSeqIdInStores, replicationScopes<a name="line.8237"></a>
-<span class="sourceLineNo">8238</span>      + 2 * ClassSize.ATOMIC_INTEGER // majorInProgress, minorInProgress<a name="line.8238"></a>
-<span class="sourceLineNo">8239</span>      + ClassSize.STORE_SERVICES // store services<a name="line.8239"></a>
-<span class="sourceLineNo">8240</span>      + StoreHotnessProtector.FIXED_SIZE<a name="line.8240"></a>
-<span class="sourceLineNo">8241</span>      ;<a name="line.8241"></a>
-<span class="sourceLineNo">8242</span><a name="line.8242"></a>
-<span class="sourceLineNo">8243</span>  @Override<a name="line.8243"></a>
-<span class="sourceLineNo">8244</span>  public long heapSize() {<a name="line.8244"></a>
-<span class="sourceLineNo">8245</span>    // this does not take into account row locks, recent flushes, mvcc entries, and more<a name="line.8245"></a>
-<span class="sourceLineNo">8246</span>    return DEEP_OVERHEAD + stores.values().stream().mapToLong(HStore::heapSize).sum();<a name="line.8246"></a>
-<span class="sourceLineNo">8247</span>  }<a name="line.8247"></a>
-<span class="sourceLineNo">8248</span><a name="line.8248"></a>
-<span class="sourceLineNo">8249</span>  /**<a name="line.8249"></a>
-<span class="sourceLineNo">8250</span>   * Registers a new protocol buffer {@link Service} subclass as a coprocessor endpoint to<a name="line.8250"></a>
-<span class="sourceLineNo">8251</span>   * be available for handling Region#execService(com.google.protobuf.RpcController,<a name="line.8251"></a>
-<span class="sourceLineNo">8252</span>   *    org.apache.hadoop.hbase.protobuf.generated.ClientProtos.CoprocessorServiceCall) calls.<a name="line.8252"></a>
-<span class="sourceLineNo">8253</span>   *<a name="line.8253"></a>
-<span class="sourceLineNo">8254</span>   * &lt;p&gt;<a name="line.8254"></a>
-<span class="sourceLineNo">8255</span>   * Only a single instance may be registered per region for a given {@link Service} subclass (the<a name="line.8255"></a>
-<span class="sourceLineNo">8256</span>   * instances are keyed on {@link com.google.protobuf.Descriptors.ServiceDescriptor#getFullName()}.<a name="line.8256"></a>
-<span class="sourceLineNo">8257</span>   * After the first registration, subsequent calls with the same service name will fail with<a name="line.8257"></a>
-<span class="sourceLineNo">8258</span>   * a return value of {@code false}.<a name="line.8258"></a>
-<span class="sourceLineNo">8259</span>   * &lt;/p&gt;<a name="line.8259"></a>
-<span class="sourceLineNo">8260</span>   * @param instance the {@code Service} subclass instance to expose as a coprocessor endpoint<a name="line.8260"></a>
-<span class="sourceLineNo">8261</span>   * @return {@code true} if the registration was successful, {@code false}<a name="line.8261"></a>
-<span class="sourceLineNo">8262</span>   * otherwise<a name="line.8262"></a>
-<span class="sourceLineNo">8263</span>   */<a name="line.8263"></a>
-<span class="sourceLineNo">8264</span>  public boolean registerService(com.google.protobuf.Service instance) {<a name="line.8264"></a>
-<span class="sourceLineNo">8265</span>    /*<a name="line.8265"></a>
-<span class="sourceLineNo">8266</span>     * No stacking of instances is allowed for a single service name<a name="line.8266"></a>
-<span class="sourceLineNo">8267</span>     */<a name="line.8267"></a>
-<span class="sourceLineNo">8268</span>    com.google.protobuf.Descriptors.ServiceDescriptor serviceDesc = instance.getDescriptorForType();<a name="line.8268"></a>
-<span class="sourceLineNo">8269</span>    String serviceName = CoprocessorRpcUtils.getServiceName(serviceDesc);<a name="line.8269"></a>
-<span class="sourceLineNo">8270</span>    if (coprocessorServiceHandlers.containsKey(serviceName)) {<a name="line.8270"></a>
-<span class="sourceLineNo">8271</span>      LOG.error("Coprocessor service " + serviceName +<a name="line.8271"></a>
-<span class="sourceLineNo">8272</span>          " already registered, rejecting request from " + instance);<a name="line.8272"></a>
-<span class="sourceLineNo">8273</span>      return false;<a name="line.8273"></a>
-<span class="sourceLineNo">8274</span>    }<a name="line.8274"></a>
-<span class="sourceLineNo">8275</span><a name="line.8275"></a>
-<span class="sourceLineNo">8276</span>    coprocessorServiceHandlers.put(serviceName, instance);<a name="line.8276"></a>
-<span class="sourceLineNo">8277</span>    if (LOG.isDebugEnabled()) {<a name="line.8277"></a>
-<span class="sourceLineNo">8278</span>      LOG.debug("Registered coprocessor service: region=" +<a name="line.8278"></a>
-<span class="sourceLineNo">8279</span>          Bytes.toStringBinary(getRegionInfo().getRegionName()) +<a name="line.8279"></a>
-<span class="sourceLineNo">8280</span>          " service=" + serviceName);<a name="line.8280"></a>
-<span class="sourceLineNo">8281</span>    }<a name="line.8281"></a>
-<span class="sourceLineNo">8282</span>    return true;<a name="line.8282"></a>
-<span class="sourceLineNo">8283</span>  }<a name="line.8283"></a>
-<span class="sourceLineNo">8284</span><a name="line.8284"></a>
-<span class="sourceLineNo">8285</span>  /**<a name="line.8285"></a>
-<span class="sourceLineNo">8286</span>   * Executes a single protocol buffer coprocessor endpoint {@link Service} method using<a name="line.8286"></a>
-<span class="sourceLineNo">8287</span>   * the registered protocol handlers.  {@link Service} implementations must be registered via the<a name="line.8287"></a>
-<span class="sourceLineNo">8288</span>   * {@link #registerService(com.google.protobuf.Service)}<a name="line.8288"></a>
-<span class="sourceLineNo">8289</span>   * method before they are available.<a name="line.8289"></a>
-<span class="sourceLineNo">8290</span>   *<a name="line.8290"></a>
-<span class="sourceLineNo">8291</span>   * @param controller an {@code RpcContoller} implementation to pass to the invoked service<a name="line.8291"></a>
-<span class="sourceLineNo">8292</span>   * @param call a {@code CoprocessorServiceCall} instance identifying the service, method,<a name="line.8292"></a>
-<span class="sourceLineNo">8293</span>   *     and parameters for the method invocation<a name="line.8293"></a>
-<span class="sourceLineNo">8294</span>   * @return a protocol buffer {@code Message} instance containing the method's result<a name="line.8294"></a>
-<span class="sourceLineNo">8295</span>   * @throws IOException if no registered service handler is found or an error<a name="line.8295"></a>
-<span class="sourceLineNo">8296</span>   *     occurs during the invocation<a name="line.8296"></a>
-<span class="sourceLineNo">8297</span>   * @see #registerService(com.google.protobuf.Service)<a name="line.8297"></a>
-<span class="sourceLineNo">8298</span>   */<a name="line.8298"></a>
-<span class="sourceLineNo">8299</span>  public com.google.protobuf.Message execService(com.google.protobuf.RpcController controller,<a name="line.8299"></a>
-<span class="sourceLineNo">8300</span>      CoprocessorServiceCall call) throws IOException {<a name="line.8300"></a>
-<span class="sourceLineNo">8301</span>    String serviceName = call.getServiceName();<a name="line.8301"></a>
-<span class="sourceLineNo">8302</span>    com.google.protobuf.Service service = coprocessorServiceHandlers.get(serviceName);<a name="line.8302"></a>
-<span class="sourceLineNo">8303</span>    if (service == null) {<a name="line.8303"></a>
-<span class="sourceLineNo">8304</span>      throw new UnknownProtocolException(null, "No registered coprocessor service found for " +<a name="line.8304"></a>
-<span class="sourceLineNo">8305</span>          serviceName + " in region " + Bytes.toStringBinary(getRegionInfo().getRegionName()));<a name="line.8305"></a>
-<span class="sourceLineNo">8306</span>    }<a name="line.8306"></a>
-<span class="sourceLineNo">8307</span>    com.google.protobuf.Descriptors.ServiceDescriptor serviceDesc = service.getDescriptorForType();<a name="line.8307"></a>
-<span class="sourceLineNo">8308</span><a name="line.8308"></a>
-<span class="sourceLineNo">8309</span>    cpRequestsCount.increment();<a name="line.8309"></a>
-<span class="sourceLineNo">8310</span>    String methodName = call.getMethodName();<a name="line.8310"></a>
-<span class="sourceLineNo">8311</span>    com.google.protobuf.Descriptors.MethodDescriptor methodDesc =<a name="line.8311"></a>
-<span class="sourceLineNo">8312</span>        CoprocessorRpcUtils.getMethodDescriptor(methodName, serviceDesc);<a name="line.8312"></a>
+<span class="sourceLineNo">8125</span>      cellPairs.add(new Pair&lt;&gt;(currentValue, newCell));<a name="line.8125"></a>
+<span class="sourceLineNo">8126</span>      // Add to results to get returned to the Client. If null, cilent does not want results.<a name="line.8126"></a>
+<span class="sourceLineNo">8127</span>      if (results != null) {<a name="line.8127"></a>
+<span class="sourceLineNo">8128</span>        results.add(newCell);<a name="line.8128"></a>
+<span class="sourceLineNo">8129</span>      }<a name="line.8129"></a>
+<span class="sourceLineNo">8130</span>    }<a name="line.8130"></a>
+<span class="sourceLineNo">8131</span><a name="line.8131"></a>
+<span class="sourceLineNo">8132</span>    // Give coprocessors a chance to update the new cells before apply to WAL or memstore<a name="line.8132"></a>
+<span class="sourceLineNo">8133</span>    if (coprocessorHost != null) {<a name="line.8133"></a>
+<span class="sourceLineNo">8134</span>      // Here the operation must be increment or append.<a name="line.8134"></a>
+<span class="sourceLineNo">8135</span>      cellPairs = op == Operation.INCREMENT ?<a name="line.8135"></a>
+<span class="sourceLineNo">8136</span>          coprocessorHost.postIncrementBeforeWAL(mutation, cellPairs) :<a name="line.8136"></a>
+<span class="sourceLineNo">8137</span>          coprocessorHost.postAppendBeforeWAL(mutation, cellPairs);<a name="line.8137"></a>
+<span class="sourceLineNo">8138</span>    }<a name="line.8138"></a>
+<span class="sourceLineNo">8139</span>    return cellPairs.stream().map(Pair::getSecond).collect(Collectors.toList());<a name="line.8139"></a>
+<span class="sourceLineNo">8140</span>  }<a name="line.8140"></a>
+<span class="sourceLineNo">8141</span><a name="line.8141"></a>
+<span class="sourceLineNo">8142</span>  private static Cell reckonDelta(final Cell delta, final Cell currentCell,<a name="line.8142"></a>
+<span class="sourceLineNo">8143</span>                                  final byte[] columnFamily, final long now,<a name="line.8143"></a>
+<span class="sourceLineNo">8144</span>                                  Mutation mutation, Function&lt;Cell, byte[]&gt; supplier) throws IOException {<a name="line.8144"></a>
+<span class="sourceLineNo">8145</span>    // Forward any tags found on the delta.<a name="line.8145"></a>
+<span class="sourceLineNo">8146</span>    List&lt;Tag&gt; tags = TagUtil.carryForwardTags(delta);<a name="line.8146"></a>
+<span class="sourceLineNo">8147</span>    tags = TagUtil.carryForwardTTLTag(tags, mutation.getTTL());<a name="line.8147"></a>
+<span class="sourceLineNo">8148</span>    if (currentCell != null) {<a name="line.8148"></a>
+<span class="sourceLineNo">8149</span>      tags = TagUtil.carryForwardTags(tags, currentCell);<a name="line.8149"></a>
+<span class="sourceLineNo">8150</span>      byte[] newValue = supplier.apply(currentCell);<a name="line.8150"></a>
+<span class="sourceLineNo">8151</span>      return ExtendedCellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.8151"></a>
+<span class="sourceLineNo">8152</span>              .setRow(mutation.getRow(), 0, mutation.getRow().length)<a name="line.8152"></a>
+<span class="sourceLineNo">8153</span>              .setFamily(columnFamily, 0, columnFamily.length)<a name="line.8153"></a>
+<span class="sourceLineNo">8154</span>              // copy the qualifier if the cell is located in shared memory.<a name="line.8154"></a>
+<span class="sourceLineNo">8155</span>              .setQualifier(CellUtil.cloneQualifier(delta))<a name="line.8155"></a>
+<span class="sourceLineNo">8156</span>              .setTimestamp(Math.max(currentCell.getTimestamp() + 1, now))<a name="line.8156"></a>
+<span class="sourceLineNo">8157</span>              .setType(KeyValue.Type.Put.getCode())<a name="line.8157"></a>
+<span class="sourceLineNo">8158</span>              .setValue(newValue, 0, newValue.length)<a name="line.8158"></a>
+<span class="sourceLineNo">8159</span>              .setTags(TagUtil.fromList(tags))<a name="line.8159"></a>
+<span class="sourceLineNo">8160</span>              .build();<a name="line.8160"></a>
+<span class="sourceLineNo">8161</span>    } else {<a name="line.8161"></a>
+<span class="sourceLineNo">8162</span>      PrivateCellUtil.updateLatestStamp(delta, now);<a name="line.8162"></a>
+<span class="sourceLineNo">8163</span>      return CollectionUtils.isEmpty(tags) ? delta : PrivateCellUtil.createCell(delta, tags);<a name="line.8163"></a>
+<span class="sourceLineNo">8164</span>    }<a name="line.8164"></a>
+<span class="sourceLineNo">8165</span>  }<a name="line.8165"></a>
+<span class="sourceLineNo">8166</span><a name="line.8166"></a>
+<span class="sourceLineNo">8167</span>  /**<a name="line.8167"></a>
+<span class="sourceLineNo">8168</span>   * @return Get the long out of the passed in Cell<a name="line.8168"></a>
+<span class="sourceLineNo">8169</span>   */<a name="line.8169"></a>
+<span class="sourceLineNo">8170</span>  private static long getLongValue(final Cell cell) throws DoNotRetryIOException {<a name="line.8170"></a>
+<span class="sourceLineNo">8171</span>    int len = cell.getValueLength();<a name="line.8171"></a>
+<span class="sourceLineNo">8172</span>    if (len != Bytes.SIZEOF_LONG) {<a name="line.8172"></a>
+<span class="sourceLineNo">8173</span>      // throw DoNotRetryIOException instead of IllegalArgumentException<a name="line.8173"></a>
+<span class="sourceLineNo">8174</span>      throw new DoNotRetryIOException("Field is not a long, it's " + len + " bytes wide");<a name="line.8174"></a>
+<span class="sourceLineNo">8175</span>    }<a name="line.8175"></a>
+<span class="sourceLineNo">8176</span>    return PrivateCellUtil.getValueAsLong(cell);<a name="line.8176"></a>
+<span class="sourceLineNo">8177</span>  }<a name="line.8177"></a>
+<span class="sourceLineNo">8178</span><a name="line.8178"></a>
+<span class="sourceLineNo">8179</span>  /**<a name="line.8179"></a>
+<span class="sourceLineNo">8180</span>   * Do a specific Get on passed &lt;code&gt;columnFamily&lt;/code&gt; and column qualifiers.<a name="line.8180"></a>
+<span class="sourceLineNo">8181</span>   * @param mutation Mutation we are doing this Get for.<a name="line.8181"></a>
+<span class="sourceLineNo">8182</span>   * @param store Which column family on row (TODO: Go all Gets in one go)<a name="line.8182"></a>
+<span class="sourceLineNo">8183</span>   * @param coordinates Cells from &lt;code&gt;mutation&lt;/code&gt; used as coordinates applied to Get.<a name="line.8183"></a>
+<span class="sourceLineNo">8184</span>   * @return Return list of Cells found.<a name="line.8184"></a>
+<span class="sourceLineNo">8185</span>   */<a name="line.8185"></a>
+<span class="sourceLineNo">8186</span>  private List&lt;Cell&gt; get(Mutation mutation, HStore store, List&lt;Cell&gt; coordinates,<a name="line.8186"></a>
+<span class="sourceLineNo">8187</span>      IsolationLevel isolation, TimeRange tr) throws IOException {<a name="line.8187"></a>
+<span class="sourceLineNo">8188</span>    // Sort the cells so that they match the order that they appear in the Get results. Otherwise,<a name="line.8188"></a>
+<span class="sourceLineNo">8189</span>    // we won't be able to find the existing values if the cells are not specified in order by the<a name="line.8189"></a>
+<span class="sourceLineNo">8190</span>    // client since cells are in an array list.<a name="line.8190"></a>
+<span class="sourceLineNo">8191</span>    // TODO: I don't get why we are sorting. St.Ack 20150107<a name="line.8191"></a>
+<span class="sourceLineNo">8192</span>    sort(coordinates, store.getComparator());<a name="line.8192"></a>
+<span class="sourceLineNo">8193</span>    Get get = new Get(mutation.getRow());<a name="line.8193"></a>
+<span class="sourceLineNo">8194</span>    if (isolation != null) {<a name="line.8194"></a>
+<span class="sourceLineNo">8195</span>      get.setIsolationLevel(isolation);<a name="line.8195"></a>
+<span class="sourceLineNo">8196</span>    }<a name="line.8196"></a>
+<span class="sourceLineNo">8197</span>    for (Cell cell: coordinates) {<a name="line.8197"></a>
+<span class="sourceLineNo">8198</span>      get.addColumn(store.getColumnFamilyDescriptor().getName(), CellUtil.cloneQualifier(cell));<a name="line.8198"></a>
+<span class="sourceLineNo">8199</span>    }<a name="line.8199"></a>
+<span class="sourceLineNo">8200</span>    // Increments carry time range. If an Increment instance, put it on the Get.<a name="line.8200"></a>
+<span class="sourceLineNo">8201</span>    if (tr != null) {<a name="line.8201"></a>
+<span class="sourceLineNo">8202</span>      get.setTimeRange(tr.getMin(), tr.getMax());<a name="line.8202"></a>
+<span class="sourceLineNo">8203</span>    }<a name="line.8203"></a>
+<span class="sourceLineNo">8204</span>    return get(get, false);<a name="line.8204"></a>
+<span class="sourceLineNo">8205</span>  }<a name="line.8205"></a>
+<span class="sourceLineNo">8206</span><a name="line.8206"></a>
+<span class="sourceLineNo">8207</span>  /**<a name="line.8207"></a>
+<span class="sourceLineNo">8208</span>   * @return Sorted list of &lt;code&gt;cells&lt;/code&gt; using &lt;code&gt;comparator&lt;/code&gt;<a name="line.8208"></a>
+<span class="sourceLineNo">8209</span>   */<a name="line.8209"></a>
+<span class="sourceLineNo">8210</span>  private static List&lt;Cell&gt; sort(List&lt;Cell&gt; cells, final CellComparator comparator) {<a name="line.8210"></a>
+<span class="sourceLineNo">8211</span>    cells.sort(comparator);<a name="line.8211"></a>
+<span class="sourceLineNo">8212</span>    return cells;<a name="line.8212"></a>
+<span class="sourceLineNo">8213</span>  }<a name="line.8213"></a>
+<span class="sourceLineNo">8214</span><a name="line.8214"></a>
+<span class="sourceLineNo">8215</span>  public static final long FIXED_OVERHEAD = ClassSize.align(<a name="line.8215"></a>
+<span class="sourceLineNo">8216</span>      ClassSize.OBJECT +<a name="line.8216"></a>
+<span class="sourceLineNo">8217</span>      ClassSize.ARRAY +<a name="line.8217"></a>
+<span class="sourceLineNo">8218</span>      55 * ClassSize.REFERENCE + 3 * Bytes.SIZEOF_INT +<a name="line.8218"></a>
+<span class="sourceLineNo">8219</span>      (15 * Bytes.SIZEOF_LONG) +<a name="line.8219"></a>
+<span class="sourceLineNo">8220</span>      3 * Bytes.SIZEOF_BOOLEAN);<a name="line.8220"></a>
+<span class="sourceLineNo">8221</span><a name="line.8221"></a>
+<span class="sourceLineNo">8222</span>  // woefully out of date - currently missing:<a name="line.8222"></a>
+<span class="sourceLineNo">8223</span>  // 1 x HashMap - coprocessorServiceHandlers<a name="line.8223"></a>
+<span class="sourceLineNo">8224</span>  // 6 x LongAdder - numMutationsWithoutWAL, dataInMemoryWithoutWAL,<a name="line.8224"></a>
+<span class="sourceLineNo">8225</span>  //   checkAndMutateChecksPassed, checkAndMutateChecksFailed, readRequestsCount,<a name="line.8225"></a>
+<span class="sourceLineNo">8226</span>  //   writeRequestsCount, cpRequestsCount<a name="line.8226"></a>
+<span class="sourceLineNo">8227</span>  // 1 x HRegion$WriteState - writestate<a name="line.8227"></a>
+<span class="sourceLineNo">8228</span>  // 1 x RegionCoprocessorHost - coprocessorHost<a name="line.8228"></a>
+<span class="sourceLineNo">8229</span>  // 1 x RegionSplitPolicy - splitPolicy<a name="line.8229"></a>
+<span class="sourceLineNo">8230</span>  // 1 x MetricsRegion - metricsRegion<a name="line.8230"></a>
+<span class="sourceLineNo">8231</span>  // 1 x MetricsRegionWrapperImpl - metricsRegionWrapper<a name="line.8231"></a>
+<span class="sourceLineNo">8232</span>  public static final long DEEP_OVERHEAD = FIXED_OVERHEAD +<a name="line.8232"></a>
+<span class="sourceLineNo">8233</span>      ClassSize.OBJECT + // closeLock<a name="line.8233"></a>
+<span class="sourceLineNo">8234</span>      (2 * ClassSize.ATOMIC_BOOLEAN) + // closed, closing<a name="line.8234"></a>
+<span class="sourceLineNo">8235</span>      (3 * ClassSize.ATOMIC_LONG) + // numPutsWithoutWAL, dataInMemoryWithoutWAL,<a name="line.8235"></a>
+<span class="sourceLineNo">8236</span>                                    // compactionsFailed<a name="line.8236"></a>
+<span class="sourceLineNo">8237</span>      (2 * ClassSize.CONCURRENT_HASHMAP) +  // lockedRows, scannerReadPoints<a name="line.8237"></a>
+<span class="sourceLineNo">8238</span>      WriteState.HEAP_SIZE + // writestate<a name="line.8238"></a>
+<span class="sourceLineNo">8239</span>      ClassSize.CONCURRENT_SKIPLISTMAP + ClassSize.CONCURRENT_SKIPLISTMAP_ENTRY + // stores<a name="line.8239"></a>
+<span class="sourceLineNo">8240</span>      (2 * ClassSize.REENTRANT_LOCK) + // lock, updatesLock<a name="line.8240"></a>
+<span class="sourceLineNo">8241</span>      MultiVersionConcurrencyControl.FIXED_SIZE // mvcc<a name="line.8241"></a>
+<span class="sourceLineNo">8242</span>      + 2 * ClassSize.TREEMAP // maxSeqIdInStores, replicationScopes<a name="line.8242"></a>
+<span class="sourceLineNo">8243</span>      + 2 * ClassSize.ATOMIC_INTEGER // majorInProgress, minorInProgress<a name="line.8243"></a>
+<span class="sourceLineNo">8244</span>      + ClassSize.STORE_SERVICES // store services<a name="line.8244"></a>
+<span class="sourceLineNo">8245</span>      + StoreHotnessProtector.FIXED_SIZE<a name="line.8245"></a>
+<span class="sourceLineNo">8246</span>      ;<a name="line.8246"></a>
+<span class="sourceLineNo">8247</span><a name="line.8247"></a>
+<span class="sourceLineNo">8248</span>  @Override<a name="line.8248"></a>
+<span class="sourceLineNo">8249</span>  public long heapSize() {<a name="line.8249"></a>
+<span class="sourceLineNo">8250</span>    // this does not take into account row locks, recent flushes, mvcc entries, and more<a name="line.8250"></a>
+<span class="sourceLineNo">8251</span>    return DEEP_OVERHEAD + stores.values().stream().mapToLong(HStore::heapSize).sum();<a name="line.8251"></a>
+<span class="sourceLineNo">8252</span>  }<a name="line.8252"></a>
+<span class="sourceLineNo">8253</span><a name="line.8253"></a>
+<span class="sourceLineNo">8254</span>  /**<a name="line.8254"></a>
+<span class="sourceLineNo">8255</span>   * Registers a new protocol buffer {@link Service} subclass as a coprocessor endpoint to<a name="line.8255"></a>
+<span class="sourceLineNo">8256</span>   * be available for handling Region#execService(com.google.protobuf.RpcController,<a name="line.8256"></a>
+<span class="sourceLineNo">8257</span>   *    org.apache.hadoop.hbase.protobuf.generated.ClientProtos.CoprocessorServiceCall) calls.<a name="line.8257"></a>
+<span class="sourceLineNo">8258</span>   *<a name="line.8258"></a>
+<span class="sourceLineNo">8259</span>   * &lt;p&gt;<a name="line.8259"></a>
+<span class="sourceLineNo">8260</span>   * Only a single instance may be registered per region for a given {@link Service} subclass (the<a name="line.8260"></a>
+<span class="sourceLineNo">8261</span>   * instances are keyed on {@link com.google.protobuf.Descriptors.ServiceDescriptor#getFullName()}.<a name="line.8261"></a>
+<span class="sourceLineNo">8262</span>   * After the first registration, subsequent calls with the same service name will fail with<a name="line.8262"></a>
+<span class="sourceLineNo">8263</span>   * a return value of {@code false}.<a name="line.8263"></a>
+<span class="sourceLineNo">8264</span>   * &lt;/p&gt;<a name="line.8264"></a>
+<span class="sourceLineNo">8265</span>   * @param instance the {@code Service} subclass instance to expose as a coprocessor endpoint<a name="line.8265"></a>
+<span class="sourceLineNo">8266</span>   * @return {@code true} if the registration was successful, {@code false}<a name="line.8266"></a>
+<span class="sourceLineNo">8267</span>   * otherwise<a name="line.8267"></a>
+<span class="sourceLineNo">8268</span>   */<a name="line.8268"></a>
+<span class="sourceLineNo">8269</span>  public boolean registerService(com.google.protobuf.Service instance) {<a name="line.8269"></a>
+<span class="sourceLineNo">8270</span>    /*<a name="line.8270"></a>
+<span class="sourceLineNo">8271</span>     * No stacking of instances is allowed for a single service name<a name="line.8271"></a>
+<span class="sourceLineNo">8272</span>     */<a name="line.8272"></a>
+<span class="sourceLineNo">8273</span>    com.google.protobuf.Descriptors.ServiceDescriptor serviceDesc = instance.getDescriptorForType();<a name="line.8273"></a>
+<span class="sourceLineNo">8274</span>    String serviceName = CoprocessorRpcUtils.getServiceName(serviceDesc);<a name="line.8274"></a>
+<span class="sourceLineNo">8275</span>    if (coprocessorServiceHandlers.containsKey(serviceName)) {<a name="line.8275"></a>
+<span class="sourceLineNo">8276</span>      LOG.error("Coprocessor service " + serviceName +<a name="line.8276"></a>
+<span class="sourceLineNo">8277</span>          " already registered, rejecting request from " + instance);<a name="line.8277"></a>
+<span class="sourceLineNo">8278</span>      return false;<a name="line.8278"></a>
+<span class="sourceLineNo">8279</span>    }<a name="line.8279"></a>
+<span class="sourceLineNo">8280</span><a name="line.8280"></a>
+<span class="sourceLineNo">8281</span>    coprocessorServiceHandlers.put(serviceName, instance);<a name="line.8281"></a>
+<span class="sourceLineNo">8282</span>    if (LOG.isDebugEnabled()) {<a name="line.8282"></a>
+<span class="sourceLineNo">8283</span>      LOG.debug("Registered coprocessor service: region=" +<a name="line.8283"></a>
+<span class="sourceLineNo">8284</span>          Bytes.toStringBinary(getRegionInfo().getRegionName()) +<a name="line.8284"></a>
+<span class="sourceLineNo">8285</span>          " service=" + serviceName);<a name="line.8285"></a>
+<span class="sourceLineNo">8286</span>    }<a name="line.8286"></a>
+<span class="sourceLineNo">8287</span>    return true;<a name="line.8287"></a>
+<span class="sourceLineNo">8288</span>  }<a name="line.8288"></a>
+<span class="sourceLineNo">8289</span><a name="line.8289"></a>
+<span class="sourceLineNo">8290</span>  /**<a name="line.8290"></a>
+<span class="sourceLineNo">8291</span>   * Executes a single protocol buffer coprocessor endpoint {@link Service} method using<a name="line.8291"></a>
+<span class="sourceLineNo">8292</span>   * the registered protocol handlers.  {@link Service} implementations must be registered via the<a name="line.8292"></a>
+<span class="sourceLineNo">8293</span>   * {@link #registerService(com.google.protobuf.Service)}<a name="line.8293"></a>
+<span class="sourceLineNo">8294</span>   * method before they are available.<a name="line.8294"></a>
+<span class="sourceLineNo">8295</span>   *<a name="line.8295"></a>
+<span class="sourceLineNo">8296</span>   * @param controller an {@code RpcContoller} implementation to pass to the invoked service<a name="line.8296"></a>
+<span class="sourceLineNo">8297</span>   * @param call a {@code CoprocessorServiceCall} instance identifying the service, method,<a name="line.8297"></a>
+<span class="sourceLineNo">8298</span>   *     and parameters for the method invocation<a name="line.8298"></a>
+<span class="sourceLineNo">8299</span>   * @return a protocol buffer {@code Message} instance containing the method's result<a name="line.8299"></a>
+<span class="sourceLineNo">8300</span>   * @throws IOException if no registered service handler is found or an error<a name="line.8300"></a>
+<span class="sourceLineNo">8301</span>   *     occurs during the invocation<a name="line.8301"></a>
+<span class="sourceLineNo">8302</span>   * @see #registerService(com.google.protobuf.Service)<a name="line.8302"></a>
+<span class="sourceLineNo">8303</span>   */<a name="line.8303"></a>
+<span class="sourceLineNo">8304</span>  public com.google.protobuf.Message execService(com.google.protobuf.RpcController controller,<a name="line.8304"></a>
+<span class="sourceLineNo">8305</span>      CoprocessorServiceCall call) throws IOException {<a name="line.8305"></a>
+<span class="sourceLineNo">8306</span>    String serviceName = call.getServiceName();<a name="line.8306"></a>
+<span class="sourceLineNo">8307</span>    com.google.protobuf.Service service = coprocessorServiceHandlers.get(serviceName);<a name="line.8307"></a>
+<span class="sourceLineNo">8308</span>    if (service == null) {<a name="line.8308"></a>
+<span class="sourceLineNo">8309</span>      throw new UnknownProtocolException(null, "No registered coprocessor service found for " +<a name="line.8309"></a>
+<span class="sourceLineNo">8310</span>          serviceName + " in region " + Bytes.toStringBinary(getRegionInfo().getRegionName()));<a name="line.8310"></a>
+<span class="sourceLineNo">8311</span>    }<a name="line.8311"></a>
+<span class="sourceLineNo">8312</span>    com.google.protobuf.Descriptors.ServiceDescriptor serviceDesc = service.getDescriptorForType();<a name="line.8312"></a>
 <span class="sourceLineNo">8313</span><a name="line.8313"></a>
-<span class="sourceLineNo">8314</span>    com.google.protobuf.Message.Builder builder =<a name="line.8314"></a>
-<span class="sourceLineNo">8315</span>        service.getRequestPrototype(methodDesc).newBuilderForType();<a name="line.8315"></a>
-<span class="sourceLineNo">8316</span><a name="line.8316"></a>
-<span class="sourceLineNo">8317</span>    org.apache.hadoop.hbase.protobuf.ProtobufUtil.mergeFrom(builder,<a name="line.8317"></a>
-<span class="sourceLineNo">8318</span>        call.getRequest().toByteArray());<a name="line.8318"></a>
-<span class="sourceLineNo">8319</span>    com.google.protobuf.Message request =<a name="line.8319"></a>
-<span class="sourceLineNo">8320</span>        CoprocessorRpcUtils.getRequest(service, methodDesc, call.getRequest());<a name="line.8320"></a>
+<span class="sourceLineNo">8314</span>    cpRequestsCount.increment();<a name="line.8314"></a>
+<span class="sourceLineNo">8315</span>    String methodName = call.getMethodName();<a name="line.8315"></a>
+<span class="sourceLineNo">8316</span>    com.google.protobuf.Descriptors.MethodDescriptor methodDesc =<a name="line.8316"></a>
+<span class="sourceLineNo">8317</span>        CoprocessorRpcUtils.getMethodDescriptor(methodName, serviceDesc);<a name="line.8317"></a>
+<span class="sourceLineNo">8318</span><a name="line.8318"></a>
+<span class="sourceLineNo">8319</span>    com.google.protobuf.Message.Builder builder =<a name="line.8319"></a>
+<span class="sourceLineNo">8320</span>        service.getRequestPrototype(methodDesc).newBuilderForType();<a name="line.8320"></a>
 <span class="sourceLineNo">8321</span><a name="line.8321"></a>
-<span class="sourceLineNo">8322</span>    if (coprocessorHost != null) {<a name="line.8322"></a>
-<span class="sourceLineNo">8323</span>      request = coprocessorHost.preEndpointInvocation(service, methodName, request);<a name="line.8323"></a>
-<span class="sourceLineNo">8324</span>    }<a name="line.8324"></a>
-<span class="sourceLineNo">8325</span><a name="line.8325"></a>
-<span class="sourceLineNo">8326</span>    final com.google.protobuf.Message.Builder responseBuilder =<a name="line.8326"></a>
-<span class="sourceLineNo">8327</span>        service.getResponsePrototype(methodDesc).newBuilderForType();<a name="line.8327"></a>
-<span class="sourceLineNo">8328</span>    service.callMethod(methodDesc, controller, request,<a name="line.8328"></a>
-<span class="sourceLineNo">8329</span>        new com.google.protobuf.RpcCallback&lt;com.google.protobuf.Message&gt;() {<a name="line.8329"></a>
-<span class="sourceLineNo">8330</span>      @Override<a name="line.8330"></a>
-<span class="sourceLineNo">8331</span>      public void run(com.google.protobuf.Message message) {<a name="line.8331"></a>
-<span class="sourceLineNo">8332</span>        if (message != null) {<a name="line.8332"></a>
-<span class="sourceLineNo">8333</span>          responseBuilder.mergeFrom(message);<a name="line.8333"></a>
-<span class="sourceLineNo">8334</span>        }<a name="line.8334"></a>
-<span class="sourceLineNo">8335</span>      }<a name="line.8335"></a>
-<span class="sourceLineNo">8336</span>    });<a name="line.8336"></a>
-<span class="sourceLineNo">8337</span><a name="line.8337"></a>
-<span class="sourceLineNo">8338</span>    if (coprocessorHost != null) {<a name="line.8338"></a>
-<span class="sourceLineNo">8339</span>      coprocessorHost.postEndpointInvocation(service, methodName, request, responseBuilder);<a name="line.8339"></a>
-<span class="sourceLineNo">8340</span>    }<a name="line.8340"></a>
-<span class="sourceLineNo">8341</span>    IOException exception =<a name="line.8341"></a>
-<span class="sourceLineNo">8342</span>        org.apache.hadoop.hbase.ipc.CoprocessorRpcUtils.getControllerException(controller);<a name="line.8342"></a>
-<span class="sourceLineNo">8343</span>    if (exception != null) {<a name="line.8343"></a>
-<span class="sourceLineNo">8344</span>      throw exception;<a name="line.8344"></a>
+<span class="sourceLineNo">8322</span>    org.apache.hadoop.hbase.protobuf.ProtobufUtil.mergeFrom(builder,<a name="line.8322"></a>
+<span class="sourceLineNo">8323</span>        call.getRequest().toByteArray());<a name="line.8323"></a>
+<span class="sourceLineNo">8324</span>    com.google.protobuf.Message request =<a name="line.8324"></a>
+<span class="sourceLineNo">8325</span>        CoprocessorRpcUtils.getRequest(service, methodDesc, call.getRequest());<a name="line.8325"></a>
+<span class="sourceLineNo">8326</span><a name="line.8326"></a>
+<span class="sourceLineNo">8327</span>    if (coprocessorHost != null) {<a name="line.8327"></a>
+<span class="sourceLineNo">8328</span>      request = coprocessorHost.preEndpointInvocation(service, methodName, request);<a name="line.8328"></a>
+<span class="sourceLineNo">8329</span>    }<a name="line.8329"></a>
+<span class="sourceLineNo">8330</span><a name="line.8330"></a>
+<span class="sourceLineNo">8331</span>    final com.google.protobuf.Message.Builder responseBuilder =<a name="line.8331"></a>
+<span class="sourceLineNo">8332</span>        service.getResponsePrototype(methodDesc).newBuilderForType();<a name="line.8332"></a>
+<span class="sourceLineNo">8333</span>    service.callMethod(methodDesc, controller, request,<a name="line.8333"></a>
+<span class="sourceLineNo">8334</span>        new com.google.protobuf.RpcCallback&lt;com.google.protobuf.Message&gt;() {<a name="line.8334"></a>
+<span class="sourceLineNo">8335</span>      @Override<a name="line.8335"></a>
+<span class="sourceLineNo">8336</span>      public void run(com.google.protobuf.Message message) {<a name="line.8336"></a>
+<span class="sourceLineNo">8337</span>        if (message != null) {<a name="line.8337"></a>
+<span class="sourceLineNo">8338</span>          responseBuilder.mergeFrom(message);<a name="line.8338"></a>
+<span class="sourceLineNo">8339</span>        }<a name="line.8339"></a>
+<span class="sourceLineNo">8340</span>      }<a name="line.8340"></a>
+<span class="sourceLineNo">8341</span>    });<a name="line.8341"></a>
+<span class="sourceLineNo">8342</span><a name="line.8342"></a>
+<span class="sourceLineNo">8343</span>    if (coprocessorHost != null) {<a name="line.8343"></a>
+<span class="sourceLineNo">8344</span>      coprocessorHost.postEndpointInvocation(service, methodName, request, responseBuilder);<a name="line.8344"></a>
 <span class="sourceLineNo">8345</span>    }<a name="line.8345"></a>
-<span class="sourceLineNo">8346</span><a name="line.8346"></a>
-<span class="sourceLineNo">8347</span>    return responseBuilder.build();<a name="line.8347"></a>
-<span class="sourceLineNo">8348</span>  }<a name="line.8348"></a>
-<span class="sourceLineNo">8349</span><a name="line.8349"></a>
-<span class="sourceLineNo">8350</span>  boolean shouldForceSplit() {<a name="line.8350"></a>
-<span class="sourceLineNo">8351</span>    return this.splitRequest;<a name="line.8351"></a>
-<span class="sourceLineNo">8352</span>  }<a name="line.8352"></a>
-<span class="sourceLineNo">8353</span><a name="line.8353"></a>
-<span class="sourceLineNo">8354</span>  byte[] getExplicitSplitPoint() {<a name="line.8354"></a>
-<span class="sourceLineNo">8355</span>    return this.explicitSplitPoint;<a name="line.8355"></a>
-<span class="sourceLineNo">8356</span>  }<a name="line.8356"></a>
-<span class="sourceLineNo">8357</span><a name="line.8357"></a>
-<span class="sourceLineNo">8358</span>  void forceSplit(byte[] sp) {<a name="line.8358"></a>
-<span class="sourceLineNo">8359</span>    // This HRegion will go away after the forced split is successful<a name="line.8359"></a>
-<span class="sourceLineNo">8360</span>    // But if a forced split fails, we need to clear forced split.<a name="line.8360"></a>
-<span class="sourceLineNo">8361</span>    this.splitRequest = true;<a name="line.8361"></a>
-<span class="sourceLineNo">8362</span>    if (sp != null) {<a name="line.8362"></a>
-<span class="sourceLineNo">8363</span>      this.explicitSplitPoint = sp;<a name="line.8363"></a>
-<span class="sourceLineNo">8364</span>    }<a name="line.8364"></a>
-<span class="sourceLineNo">8365</span>  }<a name="line.8365"></a>
-<span class="sourceLineNo">8366</span><a name="line.8366"></a>
-<span class="sourceLineNo">8367</span>  void clearSplit() {<a name="line.8367"></a>
-<span class="sourceLineNo">8368</span>    this.splitRequest = false;<a name="line.8368"></a>
-<span class="sourceLineNo">8369</span>    this.explicitSplitPoint = null;<a name="line.8369"></a>
+<span class="sourceLineNo">8346</span>    IOException exception =<a name="line.8346"></a>
+<span class="sourceLineNo">8347</span>        org.apache.hadoop.hbase.ipc.CoprocessorRpcUtils.getControllerException(controller);<a name="line.8347"></a>
+<span class="sourceLineNo">8348</span>    if (exception != null) {<a name="line.8348"></a>
+<span class="sourceLineNo">8349</span>      throw exception;<a name="line.8349"></a>
+<span class="sourceLineNo">8350</span>    }<a name="line.8350"></a>
+<span class="sourceLineNo">8351</span><a name="line.8351"></a>
+<span class="sourceLineNo">8352</span>    return responseBuilder.build();<a name="line.8352"></a>
+<span class="sourceLineNo">8353</span>  }<a name="line.8353"></a>
+<span class="sourceLineNo">8354</span><a name="line.8354"></a>
+<span class="sourceLineNo">8355</span>  boolean shouldForceSplit() {<a name="line.8355"></a>
+<span class="sourceLineNo">8356</span>    return this.splitRequest;<a name="line.8356"></a>
+<span class="sourceLineNo">8357</span>  }<a name="line.8357"></a>
+<span class="sourceLineNo">8358</span><a name="line.8358"></a>
+<span class="sourceLineNo">8359</span>  byte[] getExplicitSplitPoint() {<a name="line.8359"></a>
+<span class="sourceLineNo">8360</span>    return this.explicitSplitPoint;<a name="line.8360"></a>
+<span class="sourceLineNo">8361</span>  }<a name="line.8361"></a>
+<span class="sourceLineNo">8362</span><a name="line.8362"></a>
+<span class="sourceLineNo">8363</span>  void forceSplit(byte[] sp) {<a name="line.8363"></a>
+<span class="sourceLineNo">8364</span>    // This HRegion will go away after the forced split is successful<a name="line.8364"></a>
+<span class="sourceLineNo">8365</span>    // But if a forced split fails, we need to clear forced split.<a name="line.8365"></a>
+<span class="sourceLineNo">8366</span>    this.splitRequest = true;<a name="line.8366"></a>
+<span class="sourceLineNo">8367</span>    if (sp != null) {<a name="line.8367"></a>
+<span class="sourceLineNo">8368</span>      this.explicitSplitPoint = sp;<a name="line.8368"></a>
+<span class="sourceLineNo">8369</span>    }<a name="line.8369"></a>
 <span class="sourceLineNo">8370</span>  }<a name="line.8370"></a>
 <span class="sourceLineNo">8371</span><a name="line.8371"></a>
-<span class="sourceLineNo">8372</span>  /**<a name="line.8372"></a>
-<span class="sourceLineNo">8373</span>   * Return the splitpoint. null indicates the region isn't splittable<a name="line.8373"></a>
-<span class="sourceLineNo">8374</span>   * If the splitpoint isn't explicitly specified, it will go over the stores<a name="line.8374"></a>
-<span class="sourceLineNo">8375</span>   * to find the best splitpoint. Currently the criteria of best splitpoint<a name="line.8375"></a>
-<span class="sourceLineNo">8376</span>   * is based on the size of the store.<a name="line.8376"></a>
-<span class="sourceLineNo">8377</span>   */<a name="line.8377"></a>
-<span class="sourceLineNo">8378</span>  public byte[] checkSplit() {<a name="line.8378"></a>
-<span class="sourceLineNo">8379</span>    // Can't split META<a name="line.8379"></a>
-<span class="sourceLineNo">8380</span>    if (this.getRegionInfo().isMetaRegion()) {<a name="line.8380"></a>
-<span class="sourceLineNo">8381</span>      if (shouldForceSplit()) {<a name="line.8381"></a>
-<span class="sourceLineNo">8382</span>        LOG.warn("Cannot split meta region in HBase 0.20 and above");<a name="line.8382"></a>
-<span class="sourceLineNo">8383</span>      }<a name="line.8383"></a>
-<span class="sourceLineNo">8384</span>      return null;<a name="line.8384"></a>
-<span class="sourceLineNo">8385</span>    }<a name="line.8385"></a>
-<span class="sourceLineNo">8386</span><a name="line.8386"></a>
-<span class="sourceLineNo">8387</span>    // Can't split a region that is closing.<a name="line.8387"></a>
-<span class="sourceLineNo">8388</span>    if (this.isClosing()) {<a name="line.8388"></a>
+<span class="sourceLineNo">8372</span>  void clearSplit() {<a name="line.8372"></a>
+<span class="sourceLineNo">8373</span>    this.splitRequest = false;<a name="line.8373"></a>
+<span class="sourceLineNo">8374</span>    this.explicitSplitPoint = null;<a name="line.8374"></a>
+<span class="sourceLineNo">8375</span>  }<a name="line.8375"></a>
+<span class="sourceLineNo">8376</span><a name="line.8376"></a>
+<span class="sourceLineNo">8377</span>  /**<a name="line.8377"></a>
+<span class="sourceLineNo">8378</span>   * Return the splitpoint. null indicates the region isn't splittable<a name="line.8378"></a>
+<span class="sourceLineNo">8379</span>   * If the splitpoint isn't explicitly specified, it will go over the stores<a name="line.8379"></a>
+<span class="sourceLineNo">8380</span>   * to find the best splitpoint. Currently the criteria of best splitpoint<a name="line.8380"></a>
+<span class="sourceLineNo">8381</span>   * is based on the size of the store.<a name="line.8381"></a>
+<span class="sourceLineNo">8382</span>   */<a name="line.8382"></a>
+<span class="sourceLineNo">8383</span>  public byte[] checkSplit() {<a name="line.8383"></a>
+<span class="sourceLineNo">8384</span>    // Can't split META<a name="line.8384"></a>
+<span class="sourceLineNo">8385</span>    if (this.getRegionInfo().isMetaRegion()) {<a name="line.8385"></a>
+<span class="sourceLineNo">8386</span>      if (shouldForceSplit()) {<a name="line.8386"></a>
+<span class="sourceLineNo">8387</span>        LOG.warn("Cannot split meta region in HBase 0.20 and above");<a name="line.8387"></a>
+<span class="sourceLineNo">8388</span>      }<a name="line.8388"></a>
 <span class="sourceLineNo">8389</span>      return null;<a name="line.8389"></a>
 <span class="sourceLineNo">8390</span>    }<a name="line.8390"></a>
 <span class="sourceLineNo">8391</span><a name="line.8391"></a>
-<span class="sourceLineNo">8392</span>    if (!splitPolicy.shouldSplit()) {<a name="line.8392"></a>
-<span class="sourceLineNo">8393</span>      return null;<a name="line.8393"></a>
-<span class="sourceLineNo">8394</span>    }<a name="line.8394"></a>
-<span class="sourceLineNo">8395</span><a name="line.8395"></a>
-<span class="sourceLineNo">8396</span>    byte[] ret = splitPolicy.getSplitPoint();<a name="line.8396"></a>
-<span class="sourceLineNo">8397</span><a name="line.8397"></a>
-<span class="sourceLineNo">8398</span>    if (ret != null) {<a name="line.8398"></a>
-<span class="sourceLineNo">8399</span>      try {<a name="line.8399"></a>
-<span class="sourceLineNo">8400</span>        checkRow(ret, "calculated split");<a name="line.8400"></a>
-<span class="sourceLineNo">8401</span>      } catch (IOException e) {<a name="line.8401"></a>
-<span class="sourceLineNo">8402</span>        LOG.error("Ignoring invalid split", e);<a name="line.8402"></a>
-<span class="sourceLineNo">8403</span>        return null;<a name="line.8403"></a>
-<span class="sourceLineNo">8404</span>      }<a name="line.8404"></a>
-<span class="sourceLineNo">8405</span>    }<a name="line.8405"></a>
-<span class="sourceLineNo">8406</span>    return ret;<a name="line.8406"></a>
-<span class="sourceLineNo">8407</span>  }<a name="line.8407"></a>
-<span class="sourceLineNo">8408</span><a name="line.8408"></a>
-<span class="sourceLineNo">8409</span>  /**<a name="line.8409"></a>
-<span class="sourceLineNo">8410</span>   * @return The priority that this region should have in the compaction queue<a name="line.8410"></a>
-<span class="sourceLineNo">8411</span>   */<a name="line.8411"></a>
-<span class="sourceLineNo">8412</span>  public int getCompactPriority() {<a name="line.8412"></a>
-<span class="sourceLineNo">8413</span>    return stores.values().stream().mapToInt(HStore::getCompactPriority).min()<a name="line.8413"></a>
-<span class="sourceLineNo">8414</span>        .orElse(Store.NO_PRIORITY);<a name="line.8414"></a>
-<span class="sourceLineNo">8415</span>  }<a name="line.8415"></a>
-<span class="sourceLineNo">8416</span><a name="line.8416"></a>
-<span class="sourceLineNo">8417</span>  /** @return the coprocessor host */<a name="line.8417"></a>
-<span class="sourceLineNo">8418</span>  public RegionCoprocessorHost getCoprocessorHost() {<a name="line.8418"></a>
-<span class="sourceLineNo">8419</span>    return coprocessorHost;<a name="line.8419"></a>
+<span class="sourceLineNo">8392</span>    // Can't split a region that is closing.<a name="line.8392"></a>
+<span class="sourceLineNo">8393</span>    if (this.isClosing()) {<a name="line.8393"></a>
+<span class="sourceLineNo">8394</span>      return null;<a name="line.8394"></a>
+<span class="sourceLineNo">8395</span>    }<a name="line.8395"></a>
+<span class="sourceLineNo">8396</span><a name="line.8396"></a>
+<span class="sourceLineNo">8397</span>    if (!splitPolicy.shouldSplit()) {<a name="line.8397"></a>
+<span class="sourceLineNo">8398</span>      return null;<a name="line.8398"></a>
+<span class="sourceLineNo">8399</span>    }<a name="line.8399"></a>
+<span class="sourceLineNo">8400</span><a name="line.8400"></a>
+<span class="sourceLineNo">8401</span>    byte[] ret = splitPolicy.getSplitPoint();<a name="line.8401"></a>
+<span class="sourceLineNo">8402</span><a name="line.8402"></a>
+<span class="sourceLineNo">8403</span>    if (ret != null) {<a name="line.8403"></a>
+<span class="sourceLineNo">8404</span>      try {<a name="line.8404"></a>
+<span class="sourceLineNo">8405</span>        checkRow(ret, "calculated split");<a name="line.8405"></a>
+<span class="sourceLineNo">8406</span>      } catch (IOException e) {<a name="line.8406"></a>
+<span class="sourceLineNo">8407</span>        LOG.error("Ignoring invalid split", e);<a name="line.8407"></a>
+<span class="sourceLineNo">8408</span>        return null;<a name="line.8408"></a>
+<span class="sourceLineNo">8409</span>      }<a name="line.8409"></a>
+<span class="sourceLineNo">8410</span>    }<a name="line.8410"></a>
+<span class="sourceLineNo">8411</span>    return ret;<a name="line.8411"></a>
+<span class="sourceLineNo">8412</span>  }<a name="line.8412"></a>
+<span class="sourceLineNo">8413</span><a name="line.8413"></a>
+<span class="sourceLineNo">8414</span>  /**<a name="line.8414"></a>
+<span class="sourceLineNo">8415</span>   * @return The priority that this region should have in the compaction queue<a name="line.8415"></a>
+<span class="sourceLineNo">8416</span>   */<a name="line.8416"></a>
+<span class="sourceLineNo">8417</span>  public int getCompactPriority() {<a name="line.8417"></a>
+<span class="sourceLineNo">8418</span>    return stores.values().stream().mapToInt(HStore::getCompactPriority).min()<a name="line.8418"></a>
+<span class="sourceLineNo">8419</span>        .orElse(Store.NO_PRIORITY);<a name="line.8419"></a>
 <span class="sourceLineNo">8420</span>  }<a name="line.8420"></a>
 <span class="sourceLineNo">8421</span><a name="line.8421"></a>
-<span class="sourceLineNo">8422</span>  /** @param coprocessorHost the new coprocessor host */<a name="line.8422"></a>
-<span class="sourceLineNo">8423</span>  @VisibleForTesting<a name="line.8423"></a>
-<span class="sourceLineNo">8424</span>  public void setCoprocessorHost(final RegionCoprocessorHost coprocessorHost) {<a name="line.8424"></a>
-<span class="sourceLineNo">8425</span>    this.coprocessorHost = coprocessorHost;<a name="line.8425"></a>
-<span class="sourceLineNo">8426</span>  }<a name="line.8426"></a>
-<span class="sourceLineNo">8427</span><a name="line.8427"></a>
-<span class="sourceLineNo">8428</span>  @Override<a name="line.8428"></a>
-<span class="sourceLineNo">8429</span>  public void startRegionOperation() throws IOException {<a name="line.8429"></a>
-<span class="sourceLineNo">8430</span>    startRegionOperation(Operation.ANY);<a name="line.8430"></a>
+<span class="sourceLineNo">8422</span>  /** @return the coprocessor host */<a name="line.8422"></a>
+<span class="sourceLineNo">8423</span>  public RegionCoprocessorHost getCoprocessorHost() {<a name="line.8423"></a>
+<span class="sourceLineNo">8424</span>    return coprocessorHost;<a name="line.8424"></a>
+<span class="sourceLineNo">8425</span>  }<a name="line.8425"></a>
+<span class="sourceLineNo">8426</span><a name="line.8426"></a>
+<span class="sourceLineNo">8427</span>  /** @param coprocessorHost the new coprocessor host */<a name="line.8427"></a>
+<span class="sourceLineNo">8428</span>  @VisibleForTesting<a name="line.8428"></a>
+<span class="sourceLineNo">8429</span>  public void setCoprocessorHost(final RegionCoprocessorHost coprocessorHost) {<a name="line.8429"></a>
+<span class="sourceLineNo">8430</span>    this.coprocessorHost = coprocessorHost;<a name="line.8430"></a>
 <span class="sourceLineNo">8431</span>  }<a name="line.8431"></a>
 <span class="sourceLineNo">8432</span><a name="line.8432"></a>
 <span class="sourceLineNo">8433</span>  @Override<a name="line.8433"></a>
-<span class="sourceLineNo">8434</span>  public void startRegionOperation(Operation op) throws IOException {<a name="line.8434"></a>
-<span class="sourceLineNo">8435</span>    switch (op) {<a name="line.8435"></a>
-<span class="sourceLineNo">8436</span>      case GET:  // read operations<a name="line.8436"></a>
-<span class="sourceLineNo">8437</span>      case SCAN:<a name="line.8437"></a>
-<span class="sourceLineNo">8438</span>        checkReadsEnabled();<a name="line.8438"></a>
-<span class="sourceLineNo">8439</span>        break;<a name="line.8439"></a>
-<span class="sourceLineNo">8440</span>      default:<a name="line.8440"></a>
-<span class="sourceLineNo">8441</span>        break;<a name="line.8441"></a>
-<span class="sourceLineNo">8442</span>    }<a name="line.8442"></a>
-<span class="sourceLineNo">8443</span>    if (op == Operation.MERGE_REGION || op == Operation.SPLIT_REGION<a name="line.8443"></a>
-<span class="sourceLineNo">8444</span>        || op == Operation.COMPACT_REGION || op == Operation.COMPACT_SWITCH) {<a name="line.8444"></a>
-<span class="sourceLineNo">8445</span>      // split, merge or compact region doesn't need to check the closing/closed state or lock the<a name="line.8445"></a>
-<span class="sourceLineNo">8446</span>      // region<a name="line.8446"></a>
-<span class="sourceLineNo">8447</span>      return;<a name="line.8447"></a>
-<span class="sourceLineNo">8448</span>    }<a name="line.8448"></a>
-<span class="sourceLineNo">8449</span>    if (this.closing.get()) {<a name="line.8449"></a>
-<span class="sourceLineNo">8450</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closing");<a name="line.8450"></a>
-<span class="sourceLineNo">8451</span>    }<a name="line.8451"></a>
-<span class="sourceLineNo">8452</span>    lock(lock.readLock());<a name="line.8452"></a>
-<span class="sourceLineNo">8453</span>    if (this.closed.get()) {<a name="line.8453"></a>
-<span class="sourceLineNo">8454</span>      lock.readLock().unlock();<a name="line.8454"></a>
-<span class="sourceLineNo">8455</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closed");<a name="line.8455"></a>
+<span class="sourceLineNo">8434</span>  public void startRegionOperation() throws IOException {<a name="line.8434"></a>
+<span class="sourceLineNo">8435</span>    startRegionOperation(Operation.ANY);<a name="line.8435"></a>
+<span class="sourceLineNo">8436</span>  }<a name="line.8436"></a>
+<span class="sourceLineNo">8437</span><a name="line.8437"></a>
+<span class="sourceLineNo">8438</span>  @Override<a name="line.8438"></a>
+<span class="sourceLineNo">8439</span>  public void startRegionOperation(Operation op) throws IOException {<a name="line.8439"></a>
+<span class="sourceLineNo">8440</span>    switch (op) {<a name="line.8440"></a>
+<span class="sourceLineNo">8441</span>      case GET:  // read operations<a name="line.8441"></a>
+<span class="sourceLineNo">8442</span>      case SCAN:<a name="line.8442"></a>
+<span class="sourceLineNo">8443</span>        checkReadsEnabled();<a name="line.8443"></a>
+<span class="sourceLineNo">8444</span>        break;<a name="line.8444"></a>
+<span class="sourceLineNo">8445</span>      default:<a name="line.8445"></a>
+<span class="sourceLineNo">8446</span>        break;<a name="line.8446"></a>
+<span class="sourceLineNo">8447</span>    }<a name="line.8447"></a>
+<span class="sourceLineNo">8448</span>    if (op == Operation.MERGE_REGION || op == Operation.SPLIT_REGION<a name="line.8448"></a>
+<span class="sourceLineNo">8449</span>        || op == Operation.COMPACT_REGION || op == Operation.COMPACT_SWITCH) {<a name="line.8449"></a>
+<span class="sourceLineNo">8450</span>      // split, merge or compact region doesn't need to check the closing/closed state or lock the<a name="line.8450"></a>
+<span class="sourceLineNo">8451</span>      // region<a name="line.8451"></a>
+<span class="sourceLineNo">8452</span>      return;<a name="line.8452"></a>
+<span class="sourceLineNo">8453</span>    }<a name="line.8453"></a>
+<span class="sourceLineNo">8454</span>    if (this.closing.get()) {<a name="line.8454"></a>
+<span class="sourceLineNo">8455</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closing");<a name="line.8455"></a>
 <span class="sourceLineNo">8456</span>    }<a name="line.8456"></a>
-<span class="sourceLineNo">8457</span>    // The unit for snapshot is a region. So, all stores for this region must be<a name="line.8457"></a>
-<span class="sourceLineNo">8458</span>    // prepared for snapshot operation before proceeding.<a name="line.8458"></a>
-<span class="sourceLineNo">8459</span>    if (op == Operation.SNAPSHOT) {<a name="line.8459"></a>
-<span class="sourceLineNo">8460</span>      stores.values().forEach(HStore::preSnapshotOperation);<a name="line.8460"></a>
+<span class="sourceLineNo">8457</span>    lock(lock.readLock());<a name="line.8457"></a>
+<span class="sourceLineNo">8458</span>    if (this.closed.get()) {<a name="line.8458"></a>
+<span class="sourceLineNo">8459</span>      lock.readLock().unlock();<a name="line.8459"></a>
+<span class="sourceLineNo">8460</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closed");<a name="line.8460"></a>
 <span class="sourceLineNo">8461</span>    }<a name="line.8461"></a>
-<span class="sourceLineNo">8462</span>    try {<a name="line.8462"></a>
-<span class="sourceLineNo">8463</span>      if (coprocessorHost != null) {<a name="line.8463"></a>
-<span class="sourceLineNo">8464</span>        coprocessorHost.postStartRegionOperation(op);<a name="line.8464"></a>
-<span class="sourceLineNo">8465</span>      }<a name="line.8465"></a>
-<span class="sourceLineNo">8466</span>    } catch (Exception e) {<a name="line.8466"></a>
-<span class="sourceLineNo">8467</span>      lock.readLock().unlock();<a name="line.8467"></a>
-<span class="sourceLineNo">8468</span>      throw new IOException(e);<a name="line.8468"></a>
-<span class="sourceLineNo">8469</span>    }<a name="line.8469"></a>
-<span class="sourceLineNo">8470</span>  }<a name="line.8470"></a>
-<span class="sourceLineNo">8471</span><a name="line.8471"></a>
-<span class="sourceLineNo">8472</span>  @Override<a name="line.8472"></a>
-<span class="sourceLineNo">8473</span>  public void closeRegionOperation() throws IOException {<a name="line.8473"></a>
-<span class="sourceLineNo">8474</span>    closeRegionOperation(Operation.ANY);<a name="line.8474"></a>
+<span class="sourceLineNo">8462</span>    // The unit for snapshot is a region. So, all stores for this region must be<a name="line.8462"></a>
+<span class="sourceLineNo">8463</span>    // prepared for snapshot operation before proceeding.<a name="line.8463"></a>
+<span class="sourceLineNo">8464</span>    if (op == Operation.SNAPSHOT) {<a name="line.8464"></a>
+<span class="sourceLineNo">8465</span>      stores.values().forEach(HStore::preSnapshotOperation);<a name="line.8465"></a>
+<span class="sourceLineNo">8466</span>    }<a name="line.8466"></a>
+<span class="sourceLineNo">8467</span>    try {<a name="line.8467"></a>
+<span class="sourceLineNo">8468</span>      if (coprocessorHost != null) {<a name="line.8468"></a>
+<span class="sourceLineNo">8469</span>        coprocessorHost.postStartRegionOperation(op);<a name="line.8469"></a>
+<span class="sourceLineNo">8470</span>      }<a name="line.8470"></a>
+<span class="sourceLineNo">8471</span>    } catch (Exception e) {<a name="line.8471"></a>
+<span class="sourceLineNo">8472</span>      lock.readLock().unlock();<a name="line.8472"></a>
+<span class="sourceLineNo">8473</span>      throw new IOException(e);<a name="line.8473"></a>
+<span class="sourceLineNo">8474</span>    }<a name="line.8474"></a>
 <span class="sourceLineNo">8475</span>  }<a name="line.8475"></a>
 <span class="sourceLineNo">8476</span><a name="line.8476"></a>
 <span class="sourceLineNo">8477</span>  @Override<a name="line.8477"></a>
-<span class="sourceLineNo">8478</span>  public void closeRegionOperation(Operation operation) throws IOException {<a name="line.8478"></a>
-<span class="sourceLineNo">8479</span>    if (operation == Operation.SNAPSHOT) {<a name="line.8479"></a>
-<span class="sourceLineNo">8480</span>      stores.values().forEach(HStore::postSnapshotOperation);<a name="line.8480"></a>
-<span class="sourceLineNo">8481</span>    }<a name="line.8481"></a>
-<span class="sourceLineNo">8482</span>    lock.readLock().unlock();<a name="line.8482"></a>
-<span class="sourceLineNo">8483</span>    if (coprocessorHost != null) {<a name="line.8483"></a>
-<span class="sourceLineNo">8484</span>      coprocessorHost.postCloseRegionOperation(operation);<a name="line.8484"></a>
-<span class="sourceLineNo">8485</span>    }<a name="line.8485"></a>
-<span class="sourceLineNo">8486</span>  }<a name="line.8486"></a>
-<span class="sourceLineNo">8487</span><a name="line.8487"></a>
-<span class="sourceLineNo">8488</span>  /**<a name="line.8488"></a>
-<span class="sourceLineNo">8489</span>   * This method needs to be called before any public call that reads or<a name="line.8489"></a>
-<span class="sourceLineNo">8490</span>   * modifies stores in bulk. It has to be called just before a try.<a name="line.8490"></a>
-<span class="sourceLineNo">8491</span>   * #closeBulkRegionOperation needs to be called in the try's finally block<a name="line.8491"></a>
-<span class="sourceLineNo">8492</span>   * Acquires a writelock and checks if the region is closing or closed.<a name="line.8492"></a>
-<span class="sourceLineNo">8493</span>   * @throws NotServingRegionException when the region is closing or closed<a name="line.8493"></a>
-<span class="sourceLineNo">8494</span>   * @throws RegionTooBusyException if failed to get the lock in time<a name="line.8494"></a>
-<span class="sourceLineNo">8495</span>   * @throws InterruptedIOException if interrupted while waiting for a lock<a name="line.8495"></a>
-<span class="sourceLineNo">8496</span>   */<a name="line.8496"></a>
-<span class="sourceLineNo">8497</span>  private void startBulkRegionOperation(boolean writeLockNeeded)<a name="line.8497"></a>
-<span class="sourceLineNo">8498</span>      throws NotServingRegionException, RegionTooBusyException, InterruptedIOException {<a name="line.8498"></a>
-<span class="sourceLineNo">8499</span>    if (this.closing.get()) {<a name="line.8499"></a>
-<span class="sourceLineNo">8500</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closing");<a name="line.8500"></a>
-<span class="sourceLineNo">8501</span>    }<a name="line.8501"></a>
-<span class="sourceLineNo">8502</span>    if (writeLockNeeded) lock(lock.writeLock());<a name="line.8502"></a>
-<span class="sourceLineNo">8503</span>    else lock(lock.readLock());<a name="line.8503"></a>
-<span class="sourceLineNo">8504</span>    if (this.closed.get()) {<a name="line.8504"></a>
-<span class="sourceLineNo">8505</span>      if (writeLockNeeded) lock.writeLock().unlock();<a name="line.8505"></a>
-<span class="sourceLineNo">8506</span>      else lock.readLock().unlock();<a name="line.8506"></a>
-<span class="sourceLineNo">8507</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closed");<a name="line.8507"></a>
-<span class="sourceLineNo">8508</span>    }<a name="line.8508"></a>
-<span class="sourceLineNo">8509</span>  }<a name="line.8509"></a>
-<span class="sourceLineNo">8510</span><a name="line.8510"></a>
-<span class="sourceLineNo">8511</span>  /**<a name="line.8511"></a>
-<span class="sourceLineNo">8512</span>   * Closes the lock. This needs to be called in the finally block corresponding<a name="line.8512"></a>
-<span class="sourceLineNo">8513</span>   * to the try block of #startRegionOperation<a name="line.8513"></a>
-<span class="sourceLineNo">8514</span>   */<a name="line.8514"></a>
-<span class="sourceLineNo">8515</span>  private void closeBulkRegionOperation(){<a name="line.8515"></a>
-<span class="sourceLineNo">8516</span>    if (lock.writeLock().isHeldByCurrentThread()) lock.writeLock().unlock();<a name="line.8516"></a>
-<span class="sourceLineNo">8517</span>    else lock.readLock().unlock();<a name="line.8517"></a>
-<span class="sourceLineNo">8518</span>  }<a name="line.8518"></a>
-<span class="sourceLineNo">8519</span><a name="line.8519"></a>
-<span class="sourceLineNo">8520</span>  /**<a name="line.8520"></a>
-<span class="sourceLineNo">8521</span>   * Update LongAdders for number of puts without wal and the size of possible data loss.<a name="line.8521"></a>
-<span class="sourceLineNo">8522</span>   * These information are exposed by the region server metrics.<a name="line.8522"></a>
-<span class="sourceLineNo">8523</span>   */<a name="line.8523"></a>
-<span class="sourceLineNo">8524</span>  private void recordMutationWithoutWal(final Map&lt;byte [], List&lt;Cell&gt;&gt; familyMap) {<a name="line.8524"></a>
-<span class="sourceLineNo">8525</span>    numMutationsWithoutWAL.increment();<a name="line.8525"></a>
-<span class="sourceLineNo">8526</span>    if (numMutationsWithoutWAL.sum() &lt;= 1) {<a name="line.8526"></a>
-<span class="sourceLineNo">8527</span>      LOG.info("writing data to region " + this +<a name="line.8527"></a>
-<span class="sourceLineNo">8528</span>               " with WAL disabled. Data may be lost in the event of a crash.");<a name="line.8528"></a>
-<span class="sourceLineNo">8529</span>    }<a name="line.8529"></a>
-<span class="sourceLineNo">8530</span><a name="line.8530"></a>
-<span class="sourceLineNo">8531</span>    long mutationSize = 0;<a name="line.8531"></a>
-<span class="sourceLineNo">8532</span>    for (List&lt;Cell&gt; cells: familyMap.values()) {<a name="line.8532"></a>
-<span class="sourceLineNo">8533</span>      // Optimization: 'foreach' loop is not used. See:<a name="line.8533"></a>
-<span class="sourceLineNo">8534</span>      // HBASE-12023 HRegion.applyFamilyMapToMemstore creates too many iterator objects<a name="line.8534"></a>
-<span class="sourceLineNo">8535</span>      assert cells instanceof RandomAccess;<a name="line.8535"></a>
-<span class="sourceLineNo">8536</span>      int listSize = cells.size();<a name="line.8536"></a>
-<span class="sourceLineNo">8537</span>      for (int i=0; i &lt; listSize; i++) {<a name="line.8537"></a>
-<span class="sourceLineNo">8538</span>        Cell cell = cells.get(i);<a name="line.8538"></a>
-<span class="sourceLineNo">8539</span>        mutationSize += cell.getSerializedSize();<a name="line.8539"></a>
-<span class="sourceLineNo">8540</span>      }<a name="line.8540"></a>
-<span class="sourceLineNo">8541</span>    }<a name="line.8541"></a>
-<span class="sourceLineNo">8542</span><a name="line.8542"></a>
-<span class="sourceLineNo">8543</span>    dataInMemoryWithoutWAL.add(mutationSize);<a name="line.8543"></a>
-<span class="sourceLineNo">8544</span>  }<a name="line.8544"></a>
-<span class="sourceLineNo">8545</span><a name="line.8545"></a>
-<span class="sourceLineNo">8546</span>  private void lock(final Lock lock) throws RegionTooBusyException, InterruptedIOException {<a name="line.8546"></a>
-<span class="sourceLineNo">8547</span>    lock(lock, 1);<a name="line.8547"></a>
-<span class="sourceLineNo">8548</span>  }<a name="line.8548"></a>
-<span class="sourceLineNo">8549</span><a name="line.8549"></a>
-<span class="sourceLineNo">8550</span>  /**<a name="line.8550"></a>
-<span class="sourceLineNo">8551</span>   * Try to acquire a lock.  Throw RegionTooBusyException<a name="line.8551"></a>
-<span class="sourceLineNo">8552</span>   * if failed to get the lock in time. Throw InterruptedIOException<a name="line.8552"></a>
-<span class="sourceLineNo">8553</span>   * if interrupted while waiting for the lock.<a name="line.8553"></a>
-<span class="sourceLineNo">8554</span>   */<a name="line.8554"></a>
-<span class="sourceLineNo">8555</span>  private void lock(final Lock lock, final int multiplier)<a name="line.8555"></a>
-<span class="sourceLineNo">8556</span>      throws RegionTooBusyException, InterruptedIOException {<a name="line.8556"></a>
-<span class="sourceLineNo">8557</span>    try {<a name="line.8557"></a>
-<span class="sourceLineNo">8558</span>      final long waitTime = Math.min(maxBusyWaitDuration,<a name="line.8558"></a>
-<span class="sourceLineNo">8559</span>          busyWaitDuration * Math.min(multiplier, maxBusyWaitMultiplier));<a name="line.8559"></a>
-<span class="sourceLineNo">8560</span>      if (!lock.tryLock(waitTime, TimeUnit.MILLISECONDS)) {<a name="line.8560"></a>
-<span class="sourceLineNo">8561</span>        // Don't print millis. Message is used as a key over in<a name="line.8561"></a>
-<span class="sourceLineNo">8562</span>        // RetriesExhaustedWithDetailsException processing.<a name="line.8562"></a>
-<span class="sourceLineNo">8563</span>        throw new RegionTooBusyException("Failed to obtain lock; regionName=" +<a name="line.8563"></a>
-<span class="sourceLineNo">8564</span>            (this.getRegionInfo() == null? "unknown":<a name="line.8564"></a>
-<span class="sourceLineNo">8565</span>                this.getRegionInfo().getRegionNameAsString()) +<a name="line.8565"></a>
-<span class="sourceLineNo">8566</span>            ", server=" + (this.getRegionServerServices() == null? "unknown":<a name="line.8566"></a>
-<span class="sourceLineNo">8567</span>                this.getRegionServerServices().getServerName()));<a name="line.8567"></a>
-<span class="sourceLineNo">8568</span>      }<a name="line.8568"></a>
-<span class="sourceLineNo">8569</span>    } catch (InterruptedException ie) {<a name="line.8569"></a>
-<span class="sourceLineNo">8570</span>      LOG.info("Interrupted while waiting for a lock");<a name="line.8570"></a>
-<span class="sourceLineNo">8571</span>      InterruptedIOException iie = new InterruptedIOException();<a name="line.8571"></a>
-<span class="sourceLineNo">8572</span>      iie.initCause(ie);<a name="line.8572"></a>
-<span class="sourceLineNo">8573</span>      throw iie;<a name="line.8573"></a>
-<span class="sourceLineNo">8574</span>    }<a name="line.8574"></a>
-<span class="sourceLineNo">8575</span>  }<a name="line.8575"></a>
-<span class="sourceLineNo">8576</span><a name="line.8576"></a>
-<span class="sourceLineNo">8577</span>  /**<a name="line.8577"></a>
-<span class="sourceLineNo">8578</span>   * Calls sync with the given transaction ID<a name="line.8578"></a>
-<span class="sourceLineNo">8579</span>   * @param txid should sync up to which transaction<a name="line.8579"></a>
-<span class="sourceLineNo">8580</span>   * @throws IOException If anything goes wrong with DFS<a name="line.8580"></a>
-<span class="sourceLineNo">8581</span>   */<a name="line.8581"></a>
-<span class="sourceLineNo">8582</span>  private void sync(long txid, Durability durability) throws IOException {<a name="line.8582"></a>
-<span class="sourceLineNo">8583</span>    if (this.getRegionInfo().isMetaRegion()) {<a name="line.8583"></a>
-<span class="sourceLineNo">8584</span>      this.wal.sync(txid);<a name="line.8584"></a>
-<span class="sourceLineNo">8585</span>    } else {<a name="line.8585"></a>
-<span class="sourceLineNo">8586</span>      switch(durability) {<a name="line.8586"></a>
-<span class="sourceLineNo">8587</span>      case USE_DEFAULT:<a name="line.8587"></a>
-<span class="sourceLineNo">8588</span>        // do what table defaults to<a name="line.8588"></a>
-<span class="sourceLineNo">8589</span>        if (shouldSyncWAL()) {<a name="line.8589"></a>
-<span class="sourceLineNo">8590</span>          this.wal.sync(txid);<a name="line.8590"></a>
-<span class="sourceLineNo">8591</span>        }<a name="line.8591"></a>
-<span class="sourceLineNo">8592</span>        break;<a name="line.8592"></a>
-<span class="sourceLineNo">8593</span>      case SKIP_WAL:<a name="line.8593"></a>
-<span class="sourceLineNo">8594</span>        // nothing do to<a name="line.8594"></a>
-<span class="sourceLineNo">8595</span>        break;<a name="line.8595"></a>
-<span class="sourceLineNo">8596</span>      case ASYNC_WAL:<a name="line.8596"></a>
-<span class="sourceLineNo">8597</span>        // nothing do to<a name="line.8597"></a>
-<span class="sourceLineNo">8598</span>        break;<a name="line.8598"></a>
-<span class="sourceLineNo">8599</span>      case SYNC_WAL:<a name="line.8599"></a>
-<span class="sourceLineNo">8600</span>          this.wal.sync(txid, false);<a name="line.8600"></a>
-<span class="sourceLineNo">8601</span>          break;<a name="line.8601"></a>
-<span class="sourceLineNo">8602</span>      case FSYNC_WAL:<a name="line.8602"></a>
-<span class="sourceLineNo">8603</span>          this.wal.sync(txid, true);<a name="line.8603"></a>
-<span class="sourceLineNo">8604</span>          break;<a name="line.8604"></a>
-<span class="sourceLineNo">8605</span>      default:<a name="line.8605"></a>
-<span class="sourceLineNo">8606</span>        throw new RuntimeException("Unknown durability " + durability);<a name="line.8606"></a>
-<span class="sourceLineNo">8607</span>      }<a name="line.8607"></a>
-<span class="sourceLineNo">8608</span>    }<a name="line.8608"></a>
-<span class="sourceLineNo">8609</span>  }<a name="line.8609"></a>
-<span class="sourceLineNo">8610</span><a name="line.8610"></a>
-<span class="sourceLineNo">8611</span>  /**<a name="line.8611"></a>
-<span class="sourceLineNo">8612</span>   * Check whether we should sync the wal from the table's durability settings<a name="line.8612"></a>
-<span class="sourceLineNo">8613</span>   */<a name="line.8613"></a>
-<span class="sourceLineNo">8614</span>  private boolean shouldSyncWAL() {<a name="line.8614"></a>
-<span class="sourceLineNo">8615</span>    return regionDurability.ordinal() &gt;  Durability.ASYNC_WAL.ordinal();<a name="line.8615"></a>
-<span class="sourceLineNo">8616</span>  }<a name="line.8616"></a>
-<span class="sourceLineNo">8617</span><a name="line.8617"></a>
-<span class="sourceLineNo">8618</span>  /**<a name="line.8618"></a>
-<span class="sourceLineNo">8619</span>   * A mocked list implementation - discards all updates.<a name="line.8619"></a>
-<span class="sourceLineNo">8620</span>   */<a name="line.8620"></a>
-<span class="sourceLineNo">8621</span>  private static final List&lt;Cell&gt; MOCKED_LIST = new AbstractList&lt;Cell&gt;() {<a name="line.8621"></a>
+<span class="sourceLineNo">8478</span>  public void closeRegionOperation() throws IOException {<a name="line.8478"></a>
+<span class="sourceLineNo">8479</span>    closeRegionOperation(Operation.ANY);<a name="line.8479"></a>
+<span class="sourceLineNo">8480</span>  }<a name="line.8480"></a>
+<span class="sourceLineNo">8481</span><a name="line.8481"></a>
+<span class="sourceLineNo">8482</span>  @Override<a name="line.8482"></a>
+<span class="sourceLineNo">8483</span>  public void closeRegionOperation(Operation operation) throws IOException {<a name="line.8483"></a>
+<span class="sourceLineNo">8484</span>    if (operation == Operation.SNAPSHOT) {<a name="line.8484"></a>
+<span class="sourceLineNo">8485</span>      stores.values().forEach(HStore::postSnapshotOperation);<a name="line.8485"></a>
+<span class="sourceLineNo">8486</span>    }<a name="line.8486"></a>
+<span class="sourceLineNo">8487</span>    lock.readLock().unlock();<a name="line.8487"></a>
+<span class="sourceLineNo">8488</span>    if (coprocessorHost != null) {<a name="line.8488"></a>
+<span class="sourceLineNo">8489</span>      coprocessorHost.postCloseRegionOperation(operation);<a name="line.8489"></a>
+<span class="sourceLineNo">8490</span>    }<a name="line.8490"></a>
+<span class="sourceLineNo">8491</span>  }<a name="line.8491"></a>
+<span class="sourceLineNo">8492</span><a name="line.8492"></a>
+<span class="sourceLineNo">8493</span>  /**<a name="line.8493"></a>
+<span class="sourceLineNo">8494</span>   * This method needs to be called before any public call that reads or<a name="line.8494"></a>
+<span class="sourceLineNo">8495</span>   * modifies stores in bulk. It has to be called just before a try.<a name="line.8495"></a>
+<span class="sourceLineNo">8496</span>   * #closeBulkRegionOperation needs to be called in the try's finally block<a name="line.8496"></a>
+<span class="sourceLineNo">8497</span>   * Acquires a writelock and checks if the region is closing or closed.<a name="line.8497"></a>
+<span class="sourceLineNo">8498</span>   * @throws NotServingRegionException when the region is closing or closed<a name="line.8498"></a>
+<span class="sourceLineNo">8499</span>   * @throws RegionTooBusyException if failed to get the lock in time<a name="line.8499"></a>
+<span class="sourceLineNo">8500</span>   * @throws InterruptedIOException if interrupted while waiting for a lock<a name="line.8500"></a>
+<span class="sourceLineNo">8501</span>   */<a name="line.8501"></a>
+<span class="sourceLineNo">8502</span>  private void startBulkRegionOperation(boolean writeLockNeeded)<a name="line.8502"></a>
+<span class="sourceLineNo">8503</span>      throws NotServingRegionException, RegionTooBusyException, InterruptedIOException {<a name="line.8503"></a>
+<span class="sourceLineNo">8504</span>    if (this.closing.get()) {<a name="line.8504"></a>
+<span class="sourceLineNo">8505</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closing");<a name="line.8505"></a>
+<span class="sourceLineNo">8506</span>    }<a name="line.8506"></a>
+<span class="sourceLineNo">8507</span>    if (writeLockNeeded) lock(lock.writeLock());<a name="line.8507"></a>
+<span class="sourceLineNo">8508</span>    else lock(lock.readLock());<a name="line.8508"></a>
+<span class="sourceLineNo">8509</span>    if (this.closed.get()) {<a name="line.8509"></a>
+<span class="sourceLineNo">8510</span>      if (writeLockNeeded) lock.writeLock().unlock();<a name="line.8510"></a>
+<span class="sourceLineNo">8511</span>      else lock.readLock().unlock();<a name="line.8511"></a>
+<span class="sourceLineNo">8512</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closed");<a name="line.8512"></a>
+<span class="sourceLineNo">8513</span>    }<a name="line.8513"></a>
+<span class="sourceLineNo">8514</span>  }<a name="line.8514"></a>
+<span class="sourceLineNo">8515</span><a name="line.8515"></a>
+<span class="sourceLineNo">8516</span>  /**<a name="line.8516"></a>
+<span class="sourceLineNo">8517</span>   * Closes the lock. This needs to be called in the finally block corresponding<a name="line.8517"></a>
+<span class="sourceLineNo">8518</span>   * to the try block of #startRegionOperation<a name="line.8518"></a>
+<span class="sourceLineNo">8519</span>   */<a name="line.8519"></a>
+<span class="sourceLineNo">8520</span>  private void closeBulkRegionOperation(){<a name="line.8520"></a>
+<span class="sourceLineNo">8521</span>    if (lock.writeLock().isHeldByCurrentThread()) lock.writeLock().unlock();<a name="line.8521"></a>
+<span class="sourceLineNo">8522</span>    else lock.readLock().unlock();<a name="line.8522"></a>
+<span class="sourceLineNo">8523</span>  }<a name="line.8523"></a>
+<span class="sourceLineNo">8524</span><a name="line.8524"></a>
+<span class="sourceLineNo">8525</span>  /**<a name="line.8525"></a>
+<span class="sourceLineNo">8526</span>   * Update LongAdders for number of puts without wal and the size of possible data loss.<a name="line.8526"></a>
+<span class="sourceLineNo">8527</span>   * These information are exposed by the region server metrics.<a name="line.8527"></a>
+<span class="sourceLineNo">8528</span>   */<a name="line.8528"></a>
+<span class="sourceLineNo">8529</span>  private void recordMutationWithoutWal(final Map&lt;byte [], List&lt;Cell&gt;&gt; familyMap) {<a name="line.8529"></a>
+<span class="sourceLineNo">8530</span>    numMutationsWithoutWAL.increment();<a name="line.8530"></a>
+<span class="sourceLineNo">8531</span>    if (numMutationsWithoutWAL.sum() &lt;= 1) {<a name="line.8531"></a>
+<span class="sourceLineNo">8532</span>      LOG.info("writing data to region " + this +<a name="line.8532"></a>
+<span class="sourceLineNo">8533</span>               " with WAL disabled. Data may be lost in the event of a crash.");<a name="line.8533"></a>
+<span class="sourceLineNo">8534</span>    }<a name="line.8534"></a>
+<span class="sourceLineNo">8535</span><a name="line.8535"></a>
+<span class="sourceLineNo">8536</span>    long mutationSize = 0;<a name="line.8536"></a>
+<span class="sourceLineNo">8537</span>    for (List&lt;Cell&gt; cells: familyMap.values()) {<a name="line.8537"></a>
+<span class="sourceLineNo">8538</span>      // Optimization: 'foreach' loop is not used. See:<a name="line.8538"></a>
+<span class="sourceLineNo">8539</span>      // HBASE-12023 HRegion.applyFamilyMapToMemstore creates too many iterator objects<a name="line.8539"></a>
+<span class="sourceLineNo">8540</span>      assert cells instanceof RandomAccess;<a name="line.8540"></a>
+<span class="sourceLineNo">8541</span>      int listSize = cells.size();<a name="line.8541"></a>
+<span class="sourceLineNo">8542</span>      for (int i=0; i &lt; listSize; i++) {<a name="line.8542"></a>
+<span class="sourceLineNo">8543</span>        Cell cell = cells.get(i);<a name="line.8543"></a>
+<span class="sourceLineNo">8544</span>        mutationSize += cell.getSerializedSize();<a name="line.8544"></a>
+<span class="sourceLineNo">8545</span>      }<a name="line.8545"></a>
+<span class="sourceLineNo">8546</span>    }<a name="line.8546"></a>
+<span class="sourceLineNo">8547</span><a name="line.8547"></a>
+<span class="sourceLineNo">8548</span>    dataInMemoryWithoutWAL.add(mutationSize);<a name="line.8548"></a>
+<span class="sourceLineNo">8549</span>  }<a name="line.8549"></a>
+<span class="sourceLineNo">8550</span><a name="line.8550"></a>
+<span class="sourceLineNo">8551</span>  private void lock(final Lock lock) throws RegionTooBusyException, InterruptedIOException {<a name="line.8551"></a>
+<span class="sourceLineNo">8552</span>    lock(lock, 1);<a name="line.8552"></a>
+<span class="sourceLineNo">8553</span>  }<a name="line.8553"></a>
+<span class="sourceLineNo">8554</span><a name="line.8554"></a>
+<span class="sourceLineNo">8555</span>  /**<a name="line.8555"></a>
+<span class="sourceLineNo">8556</span>   * Try to acquire a lock.  Throw RegionTooBusyException<a name="line.8556"></a>
+<span class="sourceLineNo">8557</span>   * if failed to get the lock in time. Throw InterruptedIOException<a name="line.8557"></a>
+<span class="sourceLineNo">8558</span>   * if interrupted while waiting for the lock.<a name="line.8558"></a>
+<span class="sourceLineNo">8559</span>   */<a name="line.8559"></a>
+<span class="sourceLineNo">8560</span>  private void lock(final Lock lock, final int multiplier)<a name="line.8560"></a>
+<span class="sourceLineNo">8561</span>      throws RegionTooBusyException, InterruptedIOException {<a name="line.8561"></a>
+<span class="sourceLineNo">8562</span>    try {<a name="line.8562"></a>
+<span class="sourceLineNo">8563</span>      final long waitTime = Math.min(maxBusyWaitDuration,<a name="line.8563"></a>
+<span class="sourceLineNo">8564</span>          busyWaitDuration * Math.min(multiplier, maxBusyWaitMultiplier));<a name="line.8564"></a>
+<span class="sourceLineNo">8565</span>      if (!lock.tryLock(waitTime, TimeUnit.MILLISECONDS)) {<a name="line.8565"></a>
+<span class="sourceLineNo">8566</span>        // Don't print millis. Message is used as a key over in<a name="line.8566"></a>
+<span class="sourceLineNo">8567</span>        // RetriesExhaustedWithDetailsException processing.<a name="line.8567"></a>
+<span class="sourceLineNo">8568</span>        throw new RegionTooBusyException("Failed to obtain lock; regionName=" +<a name="line.8568"></a>
+<span class="sourceLineNo">8569</span>            (this.getRegionInfo() == null? "unknown":<a name="line.8569"></a>
+<span class="sourceLineNo">8570</span>                this.getRegionInfo().getRegionNameAsString()) +<a name="line.8570"></a>
+<span class="sourceLineNo">8571</span>            ", server=" + (this.getRegionServerServices() == null? "unknown":<a name="line.8571"></a>
+<span class="sourceLineNo">8572</span>                this.getRegionServerServices().getServerName()));<a name="line.8572"></a>
+<span class="sourceLineNo">8573</span>      }<a name="line.8573"></a>
+<span class="sourceLineNo">8574</span>    } catch (InterruptedException ie) {<a name="line.8574"></a>
+<span class="sourceLineNo">8575</span>      LOG.info("Interrupted while waiting for a lock");<a name="line.8575"></a>
+<span class="sourceLineNo">8576</span>      InterruptedIOException iie = new InterruptedIOException();<a name="line.8576"></a>
+<span class="sourceLineNo">8577</span>      iie.initCause(ie);<a name="line.8577"></a>
+<span class="sourceLineNo">8578</span>      throw iie;<a name="line.8578"></a>
+<span class="sourceLineNo">8579</span>    }<a name="line.8579"></a>
+<span class="sourceLineNo">8580</span>  }<a name="line.8580"></a>
+<span class="sourceLineNo">8581</span><a name="line.8581"></a>
+<span class="sourceLineNo">8582</span>  /**<a name="line.8582"></a>
+<span class="sourceLineNo">8583</span>   * Calls sync with the given transaction ID<a name="line.8583"></a>
+<span class="sourceLineNo">8584</span>   * @param txid should sync up to which transaction<a name="line.8584"></a>
+<span class="sourceLineNo">8585</span>   * @throws IOException If anything goes wrong with DFS<a name="line.8585"></a>
+<span class="sourceLineNo">8586</span>   */<a name="line.8586"></a>
+<span class="sourceLineNo">8587</span>  private void sync(long txid, Durability durability) throws IOException {<a name="line.8587"></a>
+<span class="sourceLineNo">8588</span>    if (this.getRegionInfo().isMetaRegion()) {<a name="line.8588"></a>
+<span class="sourceLineNo">8589</span>      this.wal.sync(txid);<a name="line.8589"></a>
+<span class="sourceLineNo">8590</span>    } else {<a name="line.8590"></a>
+<span class="sourceLineNo">8591</span>      switch(durability) {<a name="line.8591"></a>
+<span class="sourceLineNo">8592</span>      case USE_DEFAULT:<a name="line.8592"></a>
+<span class="sourceLineNo">8593</span>        // do what table defaults to<a name="line.8593"></a>
+<span class="sourceLineNo">8594</span>        if (shouldSyncWAL()) {<a name="line.8594"></a>
+<span class="sourceLineNo">8595</span>          this.wal.sync(txid);<a name="line.8595"></a>
+<span class="sourceLineNo">8596</span>        }<a name="line.8596"></a>
+<span class="sourceLineNo">8597</span>        break;<a name="line.8597"></a>
+<span class="sourceLineNo">8598</span>      case SKIP_WAL:<a name="line.8598"></a>
+<span class="sourceLineNo">8599</span>        // nothing do to<a name="line.8599"></a>
+<span class="sourceLineNo">8600</span>        break;<a name="line.8600"></a>
+<span class="sourceLineNo">8601</span>      case ASYNC_WAL:<a name="line.8601"></a>
+<span class="sourceLineNo">8602</span>        // nothing do to<a name="line.8602"></a>
+<span class="sourceLineNo">8603</span>        break;<a name="line.8603"></a>
+<span class="sourceLineNo">8604</span>      case SYNC_WAL:<a name="line.8604"></a>
+<span class="sourceLineNo">8605</span>          this.wal.sync(txid, false);<a name="line.8605"></a>
+<span class="sourceLineNo">8606</span>          break;<a name="line.8606"></a>
+<span class="sourceLineNo">8607</span>      case FSYNC_WAL:<a name="line.8607"></a>
+<span class="sourceLineNo">8608</span>          this.wal.sync(txid, true);<a name="line.8608"></a>
+<span class="sourceLineNo">8609</span>          break;<a name="line.8609"></a>
+<span class="sourceLineNo">8610</span>      default:<a name="line.8610"></a>
+<span class="sourceLineNo">8611</span>        throw new RuntimeException("Unknown durability " + durability);<a name="line.8611"></a>
+<span class="sourceLineNo">8612</span>      }<a name="line.8612"></a>
+<span class="sourceLineNo">8613</span>    }<a name="line.8613"></a>
+<span class="sourceLineNo">8614</span>  }<a name="line.8614"></a>
+<span class="sourceLineNo">8615</span><a name="line.8615"></a>
+<span class="sourceLineNo">8616</span>  /**<a name="line.8616"></a>
+<span class="sourceLineNo">8617</span>   * Check whether we should sync the wal from the table's durability settings<a name="line.8617"></a>
+<span class="sourceLineNo">8618</span>   */<a name="line.8618"></a>
+<span class="sourceLineNo">8619</span>  private boolean shouldSyncWAL() {<a name="line.8619"></a>
+<span class="sourceLineNo">8620</span>    return regionDurability.ordinal() &gt;  Durability.ASYNC_WAL.ordinal();<a name="line.8620"></a>
+<span class="sourceLineNo">8621</span>  }<a name="line.8621"></a>
 <span class="sourceLineNo">8622</span><a name="line.8622"></a>
-<span class="sourceLineNo">8623</span>    @Override<a name="line.8623"></a>
-<span class="sourceLineNo">8624</span>    public void add(int index, Cell element) {<a name="line.8624"></a>
-<span class="sourceLineNo">8625</span>      // do nothing<a name="line.8625"></a>
-<span class="sourceLineNo">8626</span>    }<a name="line.8626"></a>
+<span class="sourceLineNo">8623</span>  /**<a name="line.8623"></a>
+<span class="sourceLineNo">8624</span>   * A mocked list implementation - discards all updates.<a name="line.8624"></a>
+<span class="sourceLineNo">8625</span>   */<a name="line.8625"></a>
+<span class="sourceLineNo">8626</span>  private static final List&lt;Cell&gt; MOCKED_LIST = new AbstractList&lt;Cell&gt;() {<a name="line.8626"></a>
 <span class="sourceLineNo">8627</span><a name="line.8627"></a>
 <span class="sourceLineNo">8628</span>    @Override<a name="line.8628"></a>
-<span class="sourceLineNo">8629</span>    public boolean addAll(int index, Collection&lt;? extends Cell&gt; c) {<a name="line.8629"></a>
-<span class="sourceLineNo">8630</span>      return false; // this list is never changed as a result of an update<a name="line.8630"></a>
+<span class="sourceLineNo">8629</span>    public void add(int index, Cell element) {<a name="line.8629"></a>
+<span class="sourceLineNo">8630</span>      // do nothing<a name="line.8630"></a>
 <span class="sourceLineNo">8631</span>    }<a name="line.8631"></a>
 <span class="sourceLineNo">8632</span><a name="line.8632"></a>
 <span class="sourceLineNo">8633</span>    @Override<a name="line.8633"></a>
-<span class="sourceLineNo">8634</span>    public KeyValue get(int index) {<a name="line.8634"></a>
-<span class="sourceLineNo">8635</span>      throw new UnsupportedOperationException();<a name="line.8635"></a>
+<span class="sourceLineNo">8634</span>    public boolean addAll(int index, Collection&lt;? extends Cell&gt; c) {<a name="line.8634"></a>
+<span class="sourceLineNo">8635</span>      return false; // this list is never changed as a result of an update<a name="line.8635"></a>
 <span class="sourceLineNo">8636</span>    }<a name="line.8636"></a>
 <span class="sourceLineNo">8637</span><a name="line.8637"></a>
 <span class="sourceLineNo">8638</span>    @Override<a name="line.8638"></a>
-<span class="sourceLineNo">8639</span>    public int size() {<a name="line.8639"></a>
-<span class="sourceLineNo">8640</span>      return 0;<a name="line.8640"></a>
+<span class="sourceLineNo">8639</span>    public KeyValue get(int index) {<a name="line.8639"></a>
+<span class="sourceLineNo">8640</span>      throw new UnsupportedOperationException();<a name="line.8640"></a>
 <span class="sourceLineNo">8641</span>    }<a name="line.8641"></a>
-<span class="sourceLineNo">8642</span>  };<a name="line.8642"></a>
-<span class="sourceLineNo">8643</span><a name="line.8643"></a>
-<span class="sourceLineNo">8644</span>  /** @return the latest sequence number that was read from storage when this region was opened */<a name="line.8644"></a>
-<span class="sourceLineNo">8645</span>  public long getOpenSeqNum() {<a name="line.8645"></a>
-<span class="sourceLineNo">8646</span>    return this.openSeqNum;<a name="line.8646"></a>
-<span class="sourceLineNo">8647</span>  }<a name="line.8647"></a>
+<span class="sourceLineNo">8642</span><a name="line.8642"></a>
+<span class="sourceLineNo">8643</span>    @Override<a name="line.8643"></a>
+<span class="sourceLineNo">8644</span>    public int size() {<a name="line.8644"></a>
+<span class="sourceLineNo">8645</span>      return 0;<a name="line.8645"></a>
+<span class="sourceLineNo">8646</span>    }<a name="line.8646"></a>
+<span class="sourceLineNo">8647</span>  };<a name="line.8647"></a>
 <span class="sourceLineNo">8648</span><a name="line.8648"></a>
-<span class="sourceLineNo">8649</span>  @Override<a name="line.8649"></a>
-<span class="sourceLineNo">8650</span>  public Map&lt;byte[], Long&gt; getMaxStoreSeqId() {<a name="line.8650"></a>
-<span class="sourceLineNo">8651</span>    return this.maxSeqIdInStores;<a name="line.8651"></a>
+<span class="sourceLineNo">8649</span>  /** @return the latest sequence number that was read from storage when this region was opened */<a name="line.8649"></a>
+<span class="sourceLineNo">8650</span>  public long getOpenSeqNum() {<a name="line.8650"></a>
+<span class="sourceLineNo">8651</span>    return this.openSeqNum;<a name="line.8651"></a>
 <span class="sourceLineNo">8652</span>  }<a name="line.8652"></a>
 <span class="sourceLineNo">8653</span><a name="line.8653"></a>
-<span class="sourceLineNo">8654</span>  public long getOldestSeqIdOfStore(byte[] familyName) {<a name="line.8654"></a>
-<span class="sourceLineNo">8655</span>    return wal.getEarliestMemStoreSeqNum(getRegionInfo().getEncodedNameAsBytes(), familyName);<a name="line.8655"></a>
-<span class="sourceLineNo">8656</span>  }<a name="line.8656"></a>
-<span class="sourceLineNo">8657</span><a name="line.8657"></a>
-<span class="sourceLineNo">8658</span>  @Override<a name="line.8658"></a>
-<span class="sourceLineNo">8659</span>  public CompactionState getCompactionState() {<a name="line.8659"></a>
-<span class="sourceLineNo">8660</span>    boolean hasMajor = majorInProgress.get() &gt; 0, hasMinor = minorInProgress.get() &gt; 0;<a name="line.8660"></a>
-<span class="sourceLineNo">8661</span>    return (hasMajor ? (hasMinor ? CompactionState.MAJOR_AND_MINOR : CompactionState.MAJOR)<a name="line.8661"></a>
-<span class="sourceLineNo">8662</span>        : (hasMinor ? CompactionState.MINOR : CompactionState.NONE));<a name="line.8662"></a>
-<span class="sourceLineNo">8663</span>  }<a name="line.8663"></a>
-<span class="sourceLineNo">8664</span><a name="line.8664"></a>
-<span class="sourceLineNo">8665</span>  public void reportCompactionRequestStart(boolean isMajor){<a name="line.8665"></a>
-<span class="sourceLineNo">8666</span>    (isMajor ? majorInProgress : minorInProgress).incrementAndGet();<a name="line.8666"></a>
-<span class="sourceLineNo">8667</span>  }<a name="line.8667"></a>
-<span class="sourceLineNo">8668</span><a name="line.8668"></a>
-<span class="sourceLineNo">8669</span>  public void reportCompactionRequestEnd(boolean isMajor, int numFiles, long filesSizeCompacted) {<a name="line.8669"></a>
-<span class="sourceLineNo">8670</span>    int newValue = (isMajor ? majorInProgress : minorInProgress).decrementAndGet();<a name="line.8670"></a>
-<span class="sourceLineNo">8671</span><a name="line.8671"></a>
-<span class="sourceLineNo">8672</span>    // metrics<a name="line.8672"></a>
-<span class="sourceLineNo">8673</span>    compactionsFinished.increment();<a name="line.8673"></a>
-<span class="sourceLineNo">8674</span>    compactionNumFilesCompacted.add(numFiles);<a name="line.8674"></a>
-<span class="sourceLineNo">8675</span>    compactionNumBytesCompacted.add(filesSizeCompacted);<a name="line.8675"></a>
+<span class="sourceLineNo">8654</span>  @Override<a name="line.8654"></a>
+<span class="sourceLineNo">8655</span>  public Map&lt;byte[], Long&gt; getMaxStoreSeqId() {<a name="line.8655"></a>
+<span class="sourceLineNo">8656</span>    return this.maxSeqIdInStores;<a name="line.8656"></a>
+<span class="sourceLineNo">8657</span>  }<a name="line.8657"></a>
+<span class="sourceLineNo">8658</span><a name="line.8658"></a>
+<span class="sourceLineNo">8659</span>  public long getOldestSeqIdOfStore(byte[] familyName) {<a name="line.8659"></a>
+<span class="sourceLineNo">8660</span>    return wal.getEarliestMemStoreSeqNum(getRegionInfo().getEncodedNameAsBytes(), familyName);<a name="line.8660"></a>
+<span class="sourceLineNo">8661</span>  }<a name="line.8661"></a>
+<span class="sourceLineNo">8662</span><a name="line.8662"></a>
+<span class="sourceLineNo">8663</span>  @Override<a name="line.8663"></a>
+<span class="sourceLineNo">8664</span>  public CompactionState getCompactionState() {<a name="line.8664"></a>
+<span class="sourceLineNo">8665</span>    boolean hasMajor = majorInProgress.get() &gt; 0, hasMinor = minorInProgress.get() &gt; 0;<a name="line.8665"></a>
+<span class="sourceLineNo">8666</span>    return (hasMajor ? (hasMinor ? CompactionState.MAJOR_AND_MINOR : CompactionState.MAJOR)<a name="line.8666"></a>
+<span class="sourceLineNo">8667</span>        : (hasMinor ? CompactionState.MINOR : CompactionState.NONE));<a name="line.8667"></a>
+<span class="sourceLineNo">8668</span>  }<a name="line.8668"></a>
+<span class="sourceLineNo">8669</span><a name="line.8669"></a>
+<span class="sourceLineNo">8670</span>  public void reportCompactionRequestStart(boolean isMajor){<a name="line.8670"></a>
+<span class="sourceLineNo">8671</span>    (isMajor ? majorInProgress : minorInProgress).incrementAndGet();<a name="line.8671"></a>
+<span class="sourceLineNo">8672</span>  }<a name="line.8672"></a>
+<span class="sourceLineNo">8673</span><a name="line.8673"></a>
+<span class="sourceLineNo">8674</span>  public void reportCompactionRequestEnd(boolean isMajor, int numFiles, long filesSizeCompacted) {<a name="line.8674"></a>
+<span class="sourceLineNo">8675</span>    int newValue = (isMajor ? majorInProgress : minorInProgress).decrementAndGet();<a name="line.8675"></a>
 <span class="sourceLineNo">8676</span><a name="line.8676"></a>
-<span class="sourceLineNo">8677</span>    assert newValue &gt;= 0;<a name="line.8677"></a>
-<span class="sourceLineNo">8678</span>  }<a name="line.8678"></a>
-<span class="sourceLineNo">8679</span><a name="line.8679"></a>
-<span class="sourceLineNo">8680</span>  public void reportCompactionRequestFailure() {<a name="line.8680"></a>
-<span class="sourceLineNo">8681</span>    compactionsFailed.increment();<a name="line.8681"></a>
-<span class="sourceLineNo">8682</span>  }<a name="line.8682"></a>
-<span class="sourceLineNo">8683</span><a name="line.8683"></a>
-<span class="sourceLineNo">8684</span>  public void incrementCompactionsQueuedCount() {<a name="line.8684"></a>
-<span class="sourceLineNo">8685</span>    compactionsQueued.increment();<a name="line.8685"></a>
-<span class="sourceLineNo">8686</span>  }<a name="line.8686"></a>
-<span class="sourceLineNo">8687</span><a name="line.8687"></a>
-<span class="sourceLineNo">8688</span>  public void decrementCompactionsQueuedCount() {<a name="line.8688"></a>
-<span class="sourceLineNo">8689</span>    compactionsQueued.decrement();<a name="line.8689"></a>
-<span class="sourceLineNo">8690</span>  }<a name="line.8690"></a>
-<span class="sourceLineNo">8691</span><a name="line.8691"></a>
-<span class="sourceLineNo">8692</span>  public void incrementFlushesQueuedCount() {<a name="line.8692"></a>
-<span class="sourceLineNo">8693</span>    flushesQueued.increment();<a name="line.8693"></a>
-<span class="sourceLineNo">8694</span>  }<a name="line.8694"></a>
-<span class="sourceLineNo">8695</span><a name="line.8695"></a>
-<span class="sourceLineNo">8696</span>  @VisibleForTesting<a name="line.8696"></a>
-<span class="sourceLineNo">8697</span>  public long getReadPoint() {<a name="line.8697"></a>
-<span class="sourceLineNo">8698</span>    return getReadPoint(IsolationLevel.READ_COMMITTED);<a name="line.8698"></a>
+<span class="sourceLineNo">8677</span>    // metrics<a name="line.8677"></a>
+<span class="sourceLineNo">8678</span>    compactionsFinished.increment();<a name="line.8678"></a>
+<span class="sourceLineNo">8679</span>    compactionNumFilesCompacted.add(numFiles);<a name="line.8679"></a>
+<span class="sourceLineNo">8680</span>    compactionNumBytesCompacted.add(filesSizeCompacted);<a name="line.8680"></a>
+<span class="sourceLineNo">8681</span><a name="line.8681"></a>
+<span class="sourceLineNo">8682</span>    assert newValue &gt;= 0;<a name="line.8682"></a>
+<span class="sourceLineNo">8683</span>  }<a name="line.8683"></a>
+<span class="sourceLineNo">8684</span><a name="line.8684"></a>
+<span class="sourceLineNo">8685</span>  public void reportCompactionRequestFailure() {<a name="line.8685"></a>
+<span class="sourceLineNo">8686</span>    compactionsFailed.increment();<a name="line.8686"></a>
+<span class="sourceLineNo">8687</span>  }<a name="line.8687"></a>
+<span class="sourceLineNo">8688</span><a name="line.8688"></a>
+<span class="sourceLineNo">8689</span>  public void incrementCompactionsQueuedCount() {<a name="line.8689"></a>
+<span class="sourceLineNo">8690</span>    compactionsQueued.increment();<a name="line.8690"></a>
+<span class="sourceLineNo">8691</span>  }<a name="line.8691"></a>
+<span class="sourceLineNo">8692</span><a name="line.8692"></a>
+<span class="sourceLineNo">8693</span>  public void decrementCompactionsQueuedCount() {<a name="line.8693"></a>
+<span class="sourceLineNo">8694</span>    compactionsQueued.decrement();<a name="line.8694"></a>
+<span class="sourceLineNo">8695</span>  }<a name="line.8695"></a>
+<span class="sourceLineNo">8696</span><a name="line.8696"></a>
+<span class="sourceLineNo">8697</span>  public void incrementFlushesQueuedCount() {<a name="line.8697"></a>
+<span class="sourceLineNo">8698</span>    flushesQueued.increment();<a name="line.8698"></a>
 <span class="sourceLineNo">8699</span>  }<a name="line.8699"></a>
 <span class="sourceLineNo">8700</span><a name="line.8700"></a>
-<span class="sourceLineNo">8701</span>  /**<a name="line.8701"></a>
-<span class="sourceLineNo">8702</span>   * {@inheritDoc}<a name="line.8702"></a>
-<span class="sourceLineNo">8703</span>   */<a name="line.8703"></a>
-<span class="sourceLineNo">8704</span>  @Override<a name="line.8704"></a>
-<span class="sourceLineNo">8705</span>  public void onConfigurationChange(Configuration conf) {<a name="line.8705"></a>
-<span class="sourceLineNo">8706</span>    this.storeHotnessProtector.update(conf);<a name="line.8706"></a>
-<span class="sourceLineNo">8707</span>  }<a name="line.8707"></a>
-<span class="sourceLineNo">8708</span><a name="line.8708"></a>
-<span class="sourceLineNo">8709</span>  /**<a name="line.8709"></a>
-<span class="sourceLineNo">8710</span>   * {@inheritDoc}<a name="line.8710"></a>
-<span class="sourceLineNo">8711</span>   */<a name="line.8711"></a>
-<span class="sourceLineNo">8712</span>  @Override<a name="line.8712"></a>
-<span class="sourceLineNo">8713</span>  public void registerChildren(ConfigurationManager manager) {<a name="line.8713"></a>
-<span class="sourceLineNo">8714</span>    configurationManager = Optional.of(manager);<a name="line.8714"></a>
-<span class="sourceLineNo">8715</span>    stores.values().forEach(manager::registerObserver);<a name="line.8715"></a>
-<span class="sourceLineNo">8716</span>  }<a name="line.8716"></a>
-<span class="sourceLineNo">8717</span><a name="line.8717"></a>
-<span class="sourceLineNo">8718</span>  /**<a name="line.8718"></a>
-<span class="sourceLineNo">8719</span>   * {@inheritDoc}<a name="line.8719"></a>
-<span class="sourceLineNo">8720</span>   */<a name="line.8720"></a>
-<span class="sourceLineNo">8721</span>  @Override<a name="line.8721"></a>
-<span class="sourceLineNo">8722</span>  public void deregisterChildren(ConfigurationManager manager) {<a name="line.8722"></a>
-<span class="sourceLineNo">8723</span>    stores.values().forEach(configurationManager.get()::deregisterObserver);<a name="line.8723"></a>
-<span class="sourceLineNo">8724</span>  }<a name="line.8724"></a>
-<span class="sourceLineNo">8725</span><a name="line.8725"></a>
+<span class="sourceLineNo">8701</span>  @VisibleForTesting<a name="line.8701"></a>
+<span class="sourceLineNo">8702</span>  public long getReadPoint() {<a name="line.8702"></a>
+<span class="sourceLineNo">8703</span>    return getReadPoint(IsolationLevel.READ_COMMITTED);<a name="line.8703"></a>
+<span class="sourceLineNo">8704</span>  }<a name="line.8704"></a>
+<span class="sourceLineNo">8705</span><a name="line.8705"></a>
+<span class="sourceLineNo">8706</span>  /**<a name="line.8706"></a>
+<span class="sourceLineNo">8707</span>   * {@inheritDoc}<a name="line.8707"></a>
+<span class="sourceLineNo">8708</span>   */<a name="line.8708"></a>
+<span class="sourceLineNo">8709</span>  @Override<a name="line.8709"></a>
+<span class="sourceLineNo">8710</span>  public void onConfigurationChange(Configuration conf) {<a name="line.8710"></a>
+<span class="sourceLineNo">8711</span>    this.storeHotnessProtector.update(conf);<a name="line.8711"></a>
+<span class="sourceLineNo">8712</span>  }<a name="line.8712"></a>
+<span class="sourceLineNo">8713</span><a name="line.8713"></a>
+<span class="sourceLineNo">8714</span>  /**<a name="line.8714"></a>
+<span class="sourceLineNo">8715</span>   * {@inheritDoc}<a name="line.8715"></a>
+<span class="sourceLineNo">8716</span>   */<a name="line.8716"></a>
+<span class="sourceLineNo">8717</span>  @Override<a name="line.8717"></a>
+<span class="sourceLineNo">8718</span>  public void registerChildren(ConfigurationManager manager) {<a name="line.8718"></a>
+<span class="sourceLineNo">8719</span>    configurationManager = Optional.of(manager);<a name="line.8719"></a>
+<span class="sourceLineNo">8720</span>    stores.values().forEach(manager::registerObserver);<a name="line.8720"></a>
+<span class="sourceLineNo">8721</span>  }<a name="line.8721"></a>
+<span class="sourceLineNo">8722</span><a name="line.8722"></a>
+<span class="sourceLineNo">8723</span>  /**<a name="line.8723"></a>
+<span class="sourceLineNo">8724</span>   * {@inheritDoc}<a name="line.8724"></a>
+<span class="sourceLineNo">8725</span>   */<a name="line.8725"></a>
 <span class="sourceLineNo">8726</span>  @Override<a name="line.8726"></a>
-<span class="sourceLineNo">8727</span>  public CellComparator getCellComparator() {<a name="line.8727"></a>
-<span class="sourceLineNo">8728</span>    return this.getRegionInfo().isMetaRegion() ? CellComparatorImpl.META_COMPARATOR<a name="line.8728"></a>
-<span class="sourceLineNo">8729</span>        : CellComparatorImpl.COMPARATOR;<a name="line.8729"></a>
-<span class="sourceLineNo">8730</span>  }<a name="line.8730"></a>
-<span class="sourceLineNo">8731</span><a name="line.8731"></a>
-<span class="sourceLineNo">8732</span>  public long getMemStoreFlushSize() {<a name="line.8732"></a>
-<span class="sourceLineNo">8733</span>    return this.memstoreFlushSize;<a name="line.8733"></a>
-<span class="sourceLineNo">8734</span>  }<a name="line.8734"></a>
-<span class="sourceLineNo">8735</span><a name="line.8735"></a>
+<span class="sourceLineNo">8727</span>  public void deregisterChildren(ConfigurationManager manager) {<a name="line.8727"></a>
+<span class="sourceLineNo">8728</span>    stores.values().forEach(configurationManager.get()::deregisterObserver);<a name="line.8728"></a>
+<span class="sourceLineNo">8729</span>  }<a name="line.8729"></a>
+<span class="sourceLineNo">8730</span><a name="line.8730"></a>
+<span class="sourceLineNo">8731</span>  @Override<a name="line.8731"></a>
+<span class="sourceLineNo">8732</span>  public CellComparator getCellComparator() {<a name="line.8732"></a>
+<span class="sourceLineNo">8733</span>    return this.getRegionInfo().isMetaRegion() ? CellComparatorImpl.META_COMPARATOR<a name="line.8733"></a>
+<span class="sourceLineNo">8734</span>        : CellComparatorImpl.COMPARATOR;<a name="line.8734"></a>
+<span class="sourceLineNo">8735</span>  }<a name="line.8735"></a>
 <span class="sourceLineNo">8736</span><a name="line.8736"></a>
-<span class="sourceLineNo">8737</span>  //// method for debugging tests<a name="line.8737"></a>
-<span class="sourceLineNo">8738</span>  void throwException(String title, String regionName) {<a name="line.8738"></a>
-<span class="sourceLineNo">8739</span>    StringBuilder buf = new StringBuilder();<a name="line.8739"></a>
-<span class="sourceLineNo">8740</span>    buf.append(title + ", ");<a name="line.8740"></a>
-<span class="sourceLineNo">8741</span>    buf.append(getRegionInfo().toString());<a name="line.8741"></a>
-<span class="sourceLineNo">8742</span>    buf.append(getRegionInfo().isMetaRegion() ? " meta region " : " ");<a name="line.8742"></a>
-<span class="sourceLineNo">8743</span>    buf.append("stores: ");<a name="line.8743"></a>
-<span class="sourceLineNo">8744</span>    for (HStore s : stores.values()) {<a name="line.8744"></a>
-<span class="sourceLineNo">8745</span>      buf.append(s.getColumnFamilyDescriptor().getNameAsString());<a name="line.8745"></a>
-<span class="sourceLineNo">8746</span>      buf.append(" size: ");<a name="line.8746"></a>
-<span class="sourceLineNo">8747</span>      buf.append(s.getMemStoreSize().getDataSize());<a name="line.8747"></a>
-<span class="sourceLineNo">8748</span>      buf.append(" ");<a name="line.8748"></a>
-<span class="sourceLineNo">8749</span>    }<a name="line.8749"></a>
-<span class="sourceLineNo">8750</span>    buf.append("end-of-stores");<a name="line.8750"></a>
-<span class="sourceLineNo">8751</span>    buf.append(", memstore size ");<a name="line.8751"></a>
-<span class="sourceLineNo">8752</span>    buf.append(getMemStoreDataSize());<a name="line.8752"></a>
-<span class="sourceLineNo">8753</span>    if (getRegionInfo().getRegionNameAsString().startsWith(regionName)) {<a name="line.8753"></a>
-<span class="sourceLineNo">8754</span>      throw new RuntimeException(buf.toString());<a name="line.8754"></a>
-<span class="sourceLineNo">8755</span>    }<a name="line.8755"></a>
-<span class="sourceLineNo">8756</span>  }<a name="line.8756"></a>
-<span class="sourceLineNo">8757</span><a name="line.8757"></a>
-<span class="sourceLineNo">8758</span>  @Override<a name="line.8758"></a>
-<span class="sourceLineNo">8759</span>  public void requestCompaction(String why, int priority, boolean major,<a name="line.8759"></a>
-<span class="sourceLineNo">8760</span>      CompactionLifeCycleTracker tracker) throws IOException {<a name="line.8760"></a>
-<span class="sourceLineNo">8761</span>    if (major) {<a name="line.8761"></a>
-<span class="sourceLineNo">8762</span>      stores.values().forEach(HStore::triggerMajorCompaction);<a name="line.8762"></a>
-<span class="sourceLineNo">8763</span>    }<a name="line.8763"></a>
-<span class="sourceLineNo">8764</span>    rsServices.getCompactionRequestor().requestCompaction(this, why, priority, tracker,<a name="line.8764"></a>
-<span class="sourceLineNo">8765</span>        RpcServer.getRequestUser().orElse(null));<a name="line.8765"></a>
-<span class="sourceLineNo">8766</span>  }<a name="line.8766"></a>
-<span class="sourceLineNo">8767</span><a name="line.8767"></a>
-<span class="sourceLineNo">8768</span>  @Override<a name="line.8768"></a>
-<span class="sourceLineNo">8769</span>  public void requestCompaction(byte[] family, String why, int priority, boolean major,<a name="line.8769"></a>
-<span class="sourceLineNo">8770</span>      CompactionLifeCycleTracker tracker) throws IOException {<a name="line.8770"></a>
-<span class="sourceLineNo">8771</span>    HStore store = stores.get(family);<a name="line.8771"></a>
-<span class="sourceLineNo">8772</span>    if (store == null) {<a name="line.8772"></a>
-<span class="sourceLineNo">8773</span>      throw new NoSuchColumnFamilyException("column family " + Bytes.toString(family) +<a name="line.8773"></a>
-<span class="sourceLineNo">8774</span>          " does not exist in region " + getRegionInfo().getRegionNameAsString());<a name="line.8774"></a>
-<span class="sourceLineNo">8775</span>    }<a name="line.8775"></a>
-<span class="sourceLineNo">8776</span>    if (major) {<a name="line.8776"></a>
-<span class="sourceLineNo">8777</span>      store.triggerMajorCompaction();<a name="line.8777"></a>
-<span class="sourceLineNo">8778</span>    }<a name="line.8778"></a>
-<span class="sourceLineNo">8779</span>    rsServices.getCompactionRequestor().requestCompaction(this, store, why, priority, tracker,<a name="line.8779"></a>
-<span class="sourceLineNo">8780</span>        RpcServer.getRequestUser().orElse(null));<a name="line.8780"></a>
-<span class="sourceLineNo">8781</span>  }<a name="line.8781"></a>
-<span class="sourceLineNo">8782</span><a name="line.8782"></a>
-<span class="sourceLineNo">8783</span>  private void requestFlushIfNeeded() throws RegionTooBusyException {<a name="line.8783"></a>
-<span class="sourceLineNo">8784</span>    if(isFlushSize(this.memStoreSizing.getMemStoreSize())) {<a name="line.8784"></a>
-<span class="sourceLineNo">8785</span>      requestFlush();<a name="line.8785"></a>
-<span class="sourceLineNo">8786</span>    }<a name="line.8786"></a>
-<span class="sourceLineNo">8787</span>  }<a name="line.8787"></a>
-<span class="sourceLineNo">8788</span><a name="line.8788"></a>
-<span class="sourceLineNo">8789</span>  private void requestFlush() {<a name="line.8789"></a>
-<span class="sourceLineNo">8790</span>    if (this.rsServices == null) {<a name="line.8790"></a>
-<span class="sourceLineNo">8791</span>      return;<a name="line.8791"></a>
-<span class="sourceLineNo">8792</span>    }<a name="line.8792"></a>
-<span class="sourceLineNo">8793</span>    requestFlush0(FlushLifeCycleTracker.DUMMY);<a name="line.8793"></a>
-<span class="sourceLineNo">8794</span>  }<a name="line.8794"></a>
-<span class="sourceLineNo">8795</span><a name="line.8795"></a>
-<span class="sourceLineNo">8796</span>  private void requestFlush0(FlushLifeCycleTracker tracker) {<a name="line.8796"></a>
-<span class="sourceLineNo">8797</span>    boolean shouldFlush = false;<a name="line.8797"></a>
-<span class="sourceLineNo">8798</span>    synchronized (writestate) {<a name="line.8798"></a>
-<span class="sourceLineNo">8799</span>      if (!this.writestate.isFlushRequested()) {<a name="line.8799"></a>
-<span class="sourceLineNo">8800</span>        shouldFlush = true;<a name="line.8800"></a>
-<span class="sourceLineNo">8801</span>        writestate.flushRequested = true;<a name="line.8801"></a>
-<span class="sourceLineNo">8802</span>      }<a name="line.8802"></a>
-<span class="sourceLineNo">8803</span>    }<a name="line.8803"></a>
-<span class="sourceLineNo">8804</span>    if (shouldFlush) {<a name="line.8804"></a>
-<span class="sourceLineNo">8805</span>      // Make request outside of synchronize block; HBASE-818.<a name="line.8805"></a>
-<span class="sourceLineNo">8806</span>      this.rsServices.getFlushRequester().requestFlush(this, false, tracker);<a name="line.8806"></a>
-<span class="sourceLineNo">8807</span>      if (LOG.isDebugEnabled()) {<a name="line.8807"></a>
-<span class="sourceLineNo">8808</span>        LOG.debug("Flush requested on " + this.getRegionInfo().getEncodedName());<a name="line.8808"></a>
-<span class="sourceLineNo">8809</span>      }<a name="line.8809"></a>
-<span class="sourceLineNo">8810</span>    } else {<a name="line.8810"></a>
-<span class="sourceLineNo">8811</span>      tracker.notExecuted("Flush already requested on " + this);<a name="line.8811"></a>
-<span class="sourceLineNo">8812</span>    }<a name="line.8812"></a>
-<span class="sourceLineNo">8813</span>  }<a name="line.8813"></a>
-<span class="sourceLineNo">8814</span><a name="line.8814"></a>
-<span class="sourceLineNo">8815</span>  @Override<a name="line.8815"></a>
-<span class="sourceLineNo">8816</span>  public void requestFlush(FlushLifeCycleTracker tracker) throws IOException {<a name="line.8816"></a>
-<span class="sourceLineNo">8817</span>    requestFlush0(tracker);<a name="line.8817"></a>
+<span class="sourceLineNo">8737</span>  public long getMemStoreFlushSize() {<a name="line.8737"></a>
+<span class="sourceLineNo">8738</span>    return this.memstoreFlushSize;<a name="line.8738"></a>
+<span class="sourceLineNo">8739</span>  }<a name="line.8739"></a>
+<span class="sourceLineNo">8740</span><a name="line.8740"></a>
+<span class="sourceLineNo">8741</span><a name="line.8741"></a>
+<span class="sourceLineNo">8742</span>  //// method for debugging tests<a name="line.8742"></a>
+<span class="sourceLineNo">8743</span>  void throwException(String title, String regionName) {<a name="line.8743"></a>
+<span class="sourceLineNo">8744</span>    StringBuilder buf = new StringBuilder();<a name="line.8744"></a>
+<span class="sourceLineNo">8745</span>    buf.append(title + ", ");<a name="line.8745"></a>
+<span class="sourceLineNo">8746</span>    buf.append(getRegionInfo().toString());<a name="line.8746"></a>
+<span class="sourceLineNo">8747</span>    buf.append(getRegionInfo().isMetaRegion() ? " meta region " : " ");<a name="line.8747"></a>
+<span class="sourceLineNo">8748</span>    buf.append("stores: ");<a name="line.8748"></a>
+<span class="sourceLineNo">8749</span>    for (HStore s : stores.values()) {<a name="line.8749"></a>
+<span class="sourceLineNo">8750</span>      buf.append(s.getColumnFamilyDescriptor().getNameAsString());<a name="line.8750"></a>
+<span class="sourceLineNo">8751</span>      buf.append(" size: ");<a name="line.8751"></a>
+<span class="sourceLineNo">8752</span>      buf.append(s.getMemStoreSize().getDataSize());<a name="line.8752"></a>
+<span class="sourceLineNo">8753</span>      buf.append(" ");<a name="line.8753"></a>
+<span class="sourceLineNo">8754</span>    }<a name="line.8754"></a>
+<span class="sourceLineNo">8755</span>    buf.append("end-of-stores");<a name="line.8755"></a>
+<span class="sourceLineNo">8756</span>    buf.append(", memstore size ");<a name="line.8756"></a>
+<span class="sourceLineNo">8757</span>    buf.append(getMemStoreDataSize());<a name="line.8757"></a>
+<span class="sourceLineNo">8758</span>    if (getRegionInfo().getRegionNameAsString().startsWith(regionName)) {<a name="line.8758"></a>
+<span class="sourceLineNo">8759</span>      throw new RuntimeException(buf.toString());<a name="line.8759"></a>
+<span class="sourceLineNo">8760</span>    }<a name="line.8760"></a>
+<span class="sourceLineNo">8761</span>  }<a name="line.8761"></a>
+<span class="sourceLineNo">8762</span><a name="line.8762"></a>
+<span class="sourceLineNo">8763</span>  @Override<a name="line.8763"></a>
+<span class="sourceLineNo">8764</span>  public void requestCompaction(String why, int priority, boolean major,<a name="line.8764"></a>
+<span class="sourceLineNo">8765</span>      CompactionLifeCycleTracker tracker) throws IOException {<a name="line.8765"></a>
+<span class="sourceLineNo">8766</span>    if (major) {<a name="line.8766"></a>
+<span class="sourceLineNo">8767</span>      stores.values().forEach(HStore::triggerMajorCompaction);<a name="line.8767"></a>
+<span class="sourceLineNo">8768</span>    }<a name="line.8768"></a>
+<span class="sourceLineNo">8769</span>    rsServices.getCompactionRequestor().requestCompaction(this, why, priority, tracker,<a name="line.8769"></a>
+<span class="sourceLineNo">8770</span>        RpcServer.getRequestUser().orElse(null));<a name="line.8770"></a>
+<span class="sourceLineNo">8771</span>  }<a name="line.8771"></a>
+<span class="sourceLineNo">8772</span><a name="line.8772"></a>
+<span class="sourceLineNo">8773</span>  @Override<a name="line.8773"></a>
+<span class="sourceLineNo">8774</span>  public void requestCompaction(byte[] family, String why, int priority, boolean major,<a name="line.8774"></a>
+<span class="sourceLineNo">8775</span>      CompactionLifeCycleTracker tracker) throws IOException {<a name="line.8775"></a>
+<span class="sourceLineNo">8776</span>    HStore store = stores.get(family);<a name="line.8776"></a>
+<span class="sourceLineNo">8777</span>    if (store == null) {<a name="line.8777"></a>
+<span class="sourceLineNo">8778</span>      throw new NoSuchColumnFamilyException("column family " + Bytes.toString(family) +<a name="line.8778"></a>
+<span class="sourceLineNo">8779</span>          " does not exist in region " + getRegionInfo().getRegionNameAsString());<a name="line.8779"></a>
+<span class="sourceLineNo">8780</span>    }<a name="line.8780"></a>
+<span class="sourceLineNo">8781</span>    if (major) {<a name="line.8781"></a>
+<span class="sourceLineNo">8782</span>      store.triggerMajorCompaction();<a name="line.8782"></a>
+<span class="sourceLineNo">8783</span>    }<a name="line.8783"></a>
+<span class="sourceLineNo">8784</span>    rsServices.getCompactionRequestor().requestCompaction(this, store, why, priority, tracker,<a name="line.8784"></a>
+<span class="sourceLineNo">8785</span>        RpcServer.getRequestUser().orElse(null));<a name="line.8785"></a>
+<span class="sourceLineNo">8786</span>  }<a name="line.8786"></a>
+<span class="sourceLineNo">8787</span><a name="line.8787"></a>
+<span class="sourceLineNo">8788</span>  private void requestFlushIfNeeded() throws RegionTooBusyException {<a name="line.8788"></a>
+<span class="sourceLineNo">8789</span>    if(isFlushSize(this.memStoreSizing.getMemStoreSize())) {<a name="line.8789"></a>
+<span class="sourceLineNo">8790</span>      requestFlush();<a name="line.8790"></a>
+<span class="sourceLineNo">8791</span>    }<a name="line.8791"></a>
+<span class="sourceLineNo">8792</span>  }<a name="line.8792"></a>
+<span class="sourceLineNo">8793</span><a name="line.8793"></a>
+<span class="sourceLineNo">8794</span>  private void requestFlush() {<a name="line.8794"></a>
+<span class="sourceLineNo">8795</span>    if (this.rsServices == null) {<a name="line.8795"></a>
+<span class="sourceLineNo">8796</span>      return;<a name="line.8796"></a>
+<span class="sourceLineNo">8797</span>    }<a name="line.8797"></a>
+<span class="sourceLineNo">8798</span>    requestFlush0(FlushLifeCycleTracker.DUMMY);<a name="line.8798"></a>
+<span class="sourceLineNo">8799</span>  }<a name="line.8799"></a>
+<span class="sourceLineNo">8800</span><a name="line.8800"></a>
+<span class="sourceLineNo">8801</span>  private void requestFlush0(FlushLifeCycleTracker tracker) {<a name="line.8801"></a>
+<span class="sourceLineNo">8802</span>    boolean shouldFlush = false;<a name="line.8802"></a>
+<span class="sourceLineNo">8803</span>    synchronized (writestate) {<a name="line.8803"></a>
+<span class="sourceLineNo">8804</span>      if (!this.writestate.isFlushRequested()) {<a name="line.8804"></a>
+<span class="sourceLineNo">8805</span>        shouldFlush = true;<a name="line.8805"></a>
+<span class="sourceLineNo">8806</span>        writestate.flushRequested = true;<a name="line.8806"></a>
+<span class="sourceLineNo">8807</span>      }<a name="line.8807"></a>
+<span class="sourceLineNo">8808</span>    }<a name="line.8808"></a>
+<span class="sourceLineNo">8809</span>    if (shouldFlush) {<a name="line.8809"></a>
+<span class="sourceLineNo">8810</span>      // Make request outside of synchronize block; HBASE-818.<a name="line.8810"></a>
+<span class="sourceLineNo">8811</span>      this.rsServices.getFlushRequester().requestFlush(this, false, tracker);<a name="line.8811"></a>
+<span class="sourceLineNo">8812</span>      if (LOG.isDebugEnabled()) {<a name="line.8812"></a>
+<span class="sourceLineNo">8813</span>        LOG.debug("Flush requested on " + this.getRegionInfo().getEncodedName());<a name="line.8813"></a>
+<span class="sourceLineNo">8814</span>      }<a name="line.8814"></a>
+<span class="sourceLineNo">8815</span>    } else {<a name="line.8815"></a>
+<span class="sourceLineNo">8816</span>      tracker.notExecuted("Flush already requested on " + this);<a name="line.8816"></a>
+<span class="sourceLineNo">8817</span>    }<a name="line.8817"></a>
 <span class="sourceLineNo">8818</span>  }<a name="line.8818"></a>
 <span class="sourceLineNo">8819</span><a name="line.8819"></a>
-<span class="sourceLineNo">8820</span>  /**<a name="line.8820"></a>
-<span class="sourceLineNo">8821</span>   * This method modifies the region's configuration in order to inject replication-related<a name="line.8821"></a>
-<span class="sourceLineNo">8822</span>   * features<a name="line.8822"></a>
-<span class="sourceLineNo">8823</span>   * @param conf region configurations<a name="line.8823"></a>
-<span class="sourceLineNo">8824</span>   */<a name="line.8824"></a>
-<span class="sourceLineNo">8825</span>  static void decorateRegionConfiguration(Configuration conf) {<a name="line.8825"></a>
-<span class="sourceLineNo">8826</span>    if (ReplicationUtils.isReplicationForBulkLoadDataEnabled(conf)) {<a name="line.8826"></a>
-<span class="sourceLineNo">8827</span>      String plugins = conf.get(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY,"");<a name="line.8827"></a>
-<span class="sourceLineNo">8828</span>      String replicationCoprocessorClass = ReplicationObserver.class.getCanonicalName();<a name="line.8828"></a>
-<span class="sourceLineNo">8829</span>      if (!plugins.contains(replicationCoprocessorClass)) {<a name="line.8829"></a>
-<span class="sourceLineNo">8830</span>        conf.set(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY,<a name="line.8830"></a>
-<span class="sourceLineNo">8831</span>            (plugins.equals("") ? "" : (plugins + ",")) + replicationCoprocessorClass);<a name="line.8831"></a>
-<span class="sourceLineNo">8832</span>      }<a name="line.8832"></a>
-<span class="sourceLineNo">8833</span>    }<a name="line.8833"></a>
-<span class="sourceLineNo">8834</span>  }<a name="line.8834"></a>
-<span class="sourceLineNo">8835</span>}<a name="line.8835"></a>
+<span class="sourceLineNo">8820</span>  @Override<a name="line.8820"></a>
+<span class="sourceLineNo">8821</span>  public void requestFlush(FlushLifeCycleTracker tracker) throws IOException {<a name="line.8821"></a>
+<span class="sourceLineNo">8822</span>    requestFlush0(tracker);<a name="line.8822"></a>
+<span class="sourceLineNo">8823</span>  }<a name="line.8823"></a>
+<span class="sourceLineNo">8824</span><a name="line.8824"></a>
+<span class="sourceLineNo">8825</span>  /**<a name="line.8825"></a>
+<span class="sourceLineNo">8826</span>   * This method modifies the region's configuration in order to inject replication-related<a name="line.8826"></a>
+<span class="sourceLineNo">8827</span>   * features<a name="line.8827"></a>
+<span class="sourceLineNo">8828</span>   * @param conf region configurations<a name="line.8828"></a>
+<span class="sourceLineNo">8829</span>   */<a name="line.8829"></a>
+<span class="sourceLineNo">8830</span>  static void decorateRegionConfiguration(Configuration conf) {<a name="line.8830"></a>
+<span class="sourceLineNo">8831</span>    if (ReplicationUtils.isReplicationForBulkLoadDataEnabled(conf)) {<a name="line.8831"></a>
+<span class="sourceLineNo">8832</span>      String plugins = conf.get(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY,"");<a name="line.8832"></a>
+<span class="sourceLineNo">8833</span>      String replicationCoprocessorClass = ReplicationObserver.class.getCanonicalName();<a name="line.8833"></a>
+<span class="sourceLineNo">8834</span>      if (!plugins.contains(replicationCoprocessorClass)) {<a name="line.8834"></a>
+<span class="sourceLineNo">8835</span>        conf.set(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY,<a name="line.8835"></a>
+<span class="sourceLineNo">8836</span>            (plugins.equals("") ? "" : (plugins + ",")) + replicationCoprocessorClass);<a name="line.8836"></a>
+<span class="sourceLineNo">8837</span>      }<a name="line.8837"></a>
+<span class="sourceLineNo">8838</span>    }<a name="line.8838"></a>
+<span class="sourceLineNo">8839</span>  }<a name="line.8839"></a>
+<span class="sourceLineNo">8840</span>}<a name="line.8840"></a>
 
 
 
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 8fcec33..2147e82 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
@@ -7972,875 +7972,880 @@
 <span class="sourceLineNo">7964</span>    if (walEdit.isReplay()) {<a name="line.7964"></a>
 <span class="sourceLineNo">7965</span>      walKey.setOrigLogSeqNum(origLogSeqNum);<a name="line.7965"></a>
 <span class="sourceLineNo">7966</span>    }<a name="line.7966"></a>
-<span class="sourceLineNo">7967</span>    WriteEntry writeEntry = null;<a name="line.7967"></a>
-<span class="sourceLineNo">7968</span>    try {<a name="line.7968"></a>
-<span class="sourceLineNo">7969</span>      long txid = this.wal.append(this.getRegionInfo(), walKey, walEdit, true);<a name="line.7969"></a>
-<span class="sourceLineNo">7970</span>      // Call sync on our edit.<a name="line.7970"></a>
-<span class="sourceLineNo">7971</span>      if (txid != 0) {<a name="line.7971"></a>
-<span class="sourceLineNo">7972</span>        sync(txid, durability);<a name="line.7972"></a>
-<span class="sourceLineNo">7973</span>      }<a name="line.7973"></a>
-<span class="sourceLineNo">7974</span>      writeEntry = walKey.getWriteEntry();<a name="line.7974"></a>
-<span class="sourceLineNo">7975</span>    } catch (IOException ioe) {<a name="line.7975"></a>
-<span class="sourceLineNo">7976</span>      if (walKey != null &amp;&amp; walKey.getWriteEntry() != null) {<a name="line.7976"></a>
-<span class="sourceLineNo">7977</span>        mvcc.complete(walKey.getWriteEntry());<a name="line.7977"></a>
+<span class="sourceLineNo">7967</span>    //don't call the coproc hook for writes to the WAL caused by<a name="line.7967"></a>
+<span class="sourceLineNo">7968</span>    //system lifecycle events like flushes or compactions<a name="line.7968"></a>
+<span class="sourceLineNo">7969</span>    if (this.coprocessorHost != null &amp;&amp; !walEdit.isMetaEdit()) {<a name="line.7969"></a>
+<span class="sourceLineNo">7970</span>      this.coprocessorHost.preWALAppend(walKey, walEdit);<a name="line.7970"></a>
+<span class="sourceLineNo">7971</span>    }<a name="line.7971"></a>
+<span class="sourceLineNo">7972</span>    WriteEntry writeEntry = null;<a name="line.7972"></a>
+<span class="sourceLineNo">7973</span>    try {<a name="line.7973"></a>
+<span class="sourceLineNo">7974</span>      long txid = this.wal.append(this.getRegionInfo(), walKey, walEdit, true);<a name="line.7974"></a>
+<span class="sourceLineNo">7975</span>      // Call sync on our edit.<a name="line.7975"></a>
+<span class="sourceLineNo">7976</span>      if (txid != 0) {<a name="line.7976"></a>
+<span class="sourceLineNo">7977</span>        sync(txid, durability);<a name="line.7977"></a>
 <span class="sourceLineNo">7978</span>      }<a name="line.7978"></a>
-<span class="sourceLineNo">7979</span>      throw ioe;<a name="line.7979"></a>
-<span class="sourceLineNo">7980</span>    }<a name="line.7980"></a>
-<span class="sourceLineNo">7981</span>    return writeEntry;<a name="line.7981"></a>
-<span class="sourceLineNo">7982</span>  }<a name="line.7982"></a>
-<span class="sourceLineNo">7983</span><a name="line.7983"></a>
-<span class="sourceLineNo">7984</span>  /**<a name="line.7984"></a>
-<span class="sourceLineNo">7985</span>   * Do coprocessor pre-increment or pre-append call.<a name="line.7985"></a>
-<span class="sourceLineNo">7986</span>   * @return Result returned out of the coprocessor, which means bypass all further processing and<a name="line.7986"></a>
-<span class="sourceLineNo">7987</span>   *  return the proffered Result instead, or null which means proceed.<a name="line.7987"></a>
-<span class="sourceLineNo">7988</span>   */<a name="line.7988"></a>
-<span class="sourceLineNo">7989</span>  private Result doCoprocessorPreCall(final Operation op, final Mutation mutation)<a name="line.7989"></a>
-<span class="sourceLineNo">7990</span>  throws IOException {<a name="line.7990"></a>
-<span class="sourceLineNo">7991</span>    Result result = null;<a name="line.7991"></a>
-<span class="sourceLineNo">7992</span>    if (this.coprocessorHost != null) {<a name="line.7992"></a>
-<span class="sourceLineNo">7993</span>      switch(op) {<a name="line.7993"></a>
-<span class="sourceLineNo">7994</span>        case INCREMENT:<a name="line.7994"></a>
-<span class="sourceLineNo">7995</span>          result = this.coprocessorHost.preIncrementAfterRowLock((Increment)mutation);<a name="line.7995"></a>
-<span class="sourceLineNo">7996</span>          break;<a name="line.7996"></a>
-<span class="sourceLineNo">7997</span>        case APPEND:<a name="line.7997"></a>
-<span class="sourceLineNo">7998</span>          result = this.coprocessorHost.preAppendAfterRowLock((Append)mutation);<a name="line.7998"></a>
-<span class="sourceLineNo">7999</span>          break;<a name="line.7999"></a>
-<span class="sourceLineNo">8000</span>        default: throw new UnsupportedOperationException(op.toString());<a name="line.8000"></a>
-<span class="sourceLineNo">8001</span>      }<a name="line.8001"></a>
-<span class="sourceLineNo">8002</span>    }<a name="line.8002"></a>
-<span class="sourceLineNo">8003</span>    return result;<a name="line.8003"></a>
-<span class="sourceLineNo">8004</span>  }<a name="line.8004"></a>
-<span class="sourceLineNo">8005</span><a name="line.8005"></a>
-<span class="sourceLineNo">8006</span>  /**<a name="line.8006"></a>
-<span class="sourceLineNo">8007</span>   * Reckon the Cells to apply to WAL, memstore, and to return to the Client; these Sets are not<a name="line.8007"></a>
-<span class="sourceLineNo">8008</span>   * always the same dependent on whether to write WAL.<a name="line.8008"></a>
-<span class="sourceLineNo">8009</span>   *<a name="line.8009"></a>
-<span class="sourceLineNo">8010</span>   * @param results Fill in here what goes back to the Client if it is non-null (if null, client<a name="line.8010"></a>
-<span class="sourceLineNo">8011</span>   *  doesn't want results).<a name="line.8011"></a>
-<span class="sourceLineNo">8012</span>   * @param forMemStore Fill in here what to apply to the MemStore (by Store).<a name="line.8012"></a>
-<span class="sourceLineNo">8013</span>   * @return A WALEdit to apply to WAL or null if we are to skip the WAL.<a name="line.8013"></a>
-<span class="sourceLineNo">8014</span>   */<a name="line.8014"></a>
-<span class="sourceLineNo">8015</span>  private WALEdit reckonDeltas(Operation op, Mutation mutation, Durability effectiveDurability,<a name="line.8015"></a>
-<span class="sourceLineNo">8016</span>      Map&lt;HStore, List&lt;Cell&gt;&gt; forMemStore, List&lt;Cell&gt; results) throws IOException {<a name="line.8016"></a>
-<span class="sourceLineNo">8017</span>    WALEdit walEdit = null;<a name="line.8017"></a>
-<span class="sourceLineNo">8018</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.8018"></a>
-<span class="sourceLineNo">8019</span>    final boolean writeToWAL = effectiveDurability != Durability.SKIP_WAL;<a name="line.8019"></a>
-<span class="sourceLineNo">8020</span>    // Process a Store/family at a time.<a name="line.8020"></a>
-<span class="sourceLineNo">8021</span>    for (Map.Entry&lt;byte [], List&lt;Cell&gt;&gt; entry: mutation.getFamilyCellMap().entrySet()) {<a name="line.8021"></a>
-<span class="sourceLineNo">8022</span>      final byte[] columnFamilyName = entry.getKey();<a name="line.8022"></a>
-<span class="sourceLineNo">8023</span>      List&lt;Cell&gt; deltas = entry.getValue();<a name="line.8023"></a>
-<span class="sourceLineNo">8024</span>      // Reckon for the Store what to apply to WAL and MemStore.<a name="line.8024"></a>
-<span class="sourceLineNo">8025</span>      List&lt;Cell&gt; toApply = reckonDeltasByStore(stores.get(columnFamilyName), op, mutation,<a name="line.8025"></a>
-<span class="sourceLineNo">8026</span>        effectiveDurability, now, deltas, results);<a name="line.8026"></a>
-<span class="sourceLineNo">8027</span>      if (!toApply.isEmpty()) {<a name="line.8027"></a>
-<span class="sourceLineNo">8028</span>        for (Cell cell : toApply) {<a name="line.8028"></a>
-<span class="sourceLineNo">8029</span>          HStore store = getStore(cell);<a name="line.8029"></a>
-<span class="sourceLineNo">8030</span>          if (store == null) {<a name="line.8030"></a>
-<span class="sourceLineNo">8031</span>            checkFamily(CellUtil.cloneFamily(cell));<a name="line.8031"></a>
-<span class="sourceLineNo">8032</span>          } else {<a name="line.8032"></a>
-<span class="sourceLineNo">8033</span>            forMemStore.computeIfAbsent(store, key -&gt; new ArrayList&lt;&gt;()).add(cell);<a name="line.8033"></a>
-<span class="sourceLineNo">8034</span>          }<a name="line.8034"></a>
-<span class="sourceLineNo">8035</span>        }<a name="line.8035"></a>
-<span class="sourceLineNo">8036</span>        if (writeToWAL) {<a name="line.8036"></a>
-<span class="sourceLineNo">8037</span>          if (walEdit == null) {<a name="line.8037"></a>
-<span class="sourceLineNo">8038</span>            walEdit = new WALEdit();<a name="line.8038"></a>
+<span class="sourceLineNo">7979</span>      writeEntry = walKey.getWriteEntry();<a name="line.7979"></a>
+<span class="sourceLineNo">7980</span>    } catch (IOException ioe) {<a name="line.7980"></a>
+<span class="sourceLineNo">7981</span>      if (walKey != null &amp;&amp; walKey.getWriteEntry() != null) {<a name="line.7981"></a>
+<span class="sourceLineNo">7982</span>        mvcc.complete(walKey.getWriteEntry());<a name="line.7982"></a>
+<span class="sourceLineNo">7983</span>      }<a name="line.7983"></a>
+<span class="sourceLineNo">7984</span>      throw ioe;<a name="line.7984"></a>
+<span class="sourceLineNo">7985</span>    }<a name="line.7985"></a>
+<span class="sourceLineNo">7986</span>    return writeEntry;<a name="line.7986"></a>
+<span class="sourceLineNo">7987</span>  }<a name="line.7987"></a>
+<span class="sourceLineNo">7988</span><a name="line.7988"></a>
+<span class="sourceLineNo">7989</span>  /**<a name="line.7989"></a>
+<span class="sourceLineNo">7990</span>   * Do coprocessor pre-increment or pre-append call.<a name="line.7990"></a>
+<span class="sourceLineNo">7991</span>   * @return Result returned out of the coprocessor, which means bypass all further processing and<a name="line.7991"></a>
+<span class="sourceLineNo">7992</span>   *  return the proffered Result instead, or null which means proceed.<a name="line.7992"></a>
+<span class="sourceLineNo">7993</span>   */<a name="line.7993"></a>
+<span class="sourceLineNo">7994</span>  private Result doCoprocessorPreCall(final Operation op, final Mutation mutation)<a name="line.7994"></a>
+<span class="sourceLineNo">7995</span>  throws IOException {<a name="line.7995"></a>
+<span class="sourceLineNo">7996</span>    Result result = null;<a name="line.7996"></a>
+<span class="sourceLineNo">7997</span>    if (this.coprocessorHost != null) {<a name="line.7997"></a>
+<span class="sourceLineNo">7998</span>      switch(op) {<a name="line.7998"></a>
+<span class="sourceLineNo">7999</span>        case INCREMENT:<a name="line.7999"></a>
+<span class="sourceLineNo">8000</span>          result = this.coprocessorHost.preIncrementAfterRowLock((Increment)mutation);<a name="line.8000"></a>
+<span class="sourceLineNo">8001</span>          break;<a name="line.8001"></a>
+<span class="sourceLineNo">8002</span>        case APPEND:<a name="line.8002"></a>
+<span class="sourceLineNo">8003</span>          result = this.coprocessorHost.preAppendAfterRowLock((Append)mutation);<a name="line.8003"></a>
+<span class="sourceLineNo">8004</span>          break;<a name="line.8004"></a>
+<span class="sourceLineNo">8005</span>        default: throw new UnsupportedOperationException(op.toString());<a name="line.8005"></a>
+<span class="sourceLineNo">8006</span>      }<a name="line.8006"></a>
+<span class="sourceLineNo">8007</span>    }<a name="line.8007"></a>
+<span class="sourceLineNo">8008</span>    return result;<a name="line.8008"></a>
+<span class="sourceLineNo">8009</span>  }<a name="line.8009"></a>
+<span class="sourceLineNo">8010</span><a name="line.8010"></a>
+<span class="sourceLineNo">8011</span>  /**<a name="line.8011"></a>
+<span class="sourceLineNo">8012</span>   * Reckon the Cells to apply to WAL, memstore, and to return to the Client; these Sets are not<a name="line.8012"></a>
+<span class="sourceLineNo">8013</span>   * always the same dependent on whether to write WAL.<a name="line.8013"></a>
+<span class="sourceLineNo">8014</span>   *<a name="line.8014"></a>
+<span class="sourceLineNo">8015</span>   * @param results Fill in here what goes back to the Client if it is non-null (if null, client<a name="line.8015"></a>
+<span class="sourceLineNo">8016</span>   *  doesn't want results).<a name="line.8016"></a>
+<span class="sourceLineNo">8017</span>   * @param forMemStore Fill in here what to apply to the MemStore (by Store).<a name="line.8017"></a>
+<span class="sourceLineNo">8018</span>   * @return A WALEdit to apply to WAL or null if we are to skip the WAL.<a name="line.8018"></a>
+<span class="sourceLineNo">8019</span>   */<a name="line.8019"></a>
+<span class="sourceLineNo">8020</span>  private WALEdit reckonDeltas(Operation op, Mutation mutation, Durability effectiveDurability,<a name="line.8020"></a>
+<span class="sourceLineNo">8021</span>      Map&lt;HStore, List&lt;Cell&gt;&gt; forMemStore, List&lt;Cell&gt; results) throws IOException {<a name="line.8021"></a>
+<span class="sourceLineNo">8022</span>    WALEdit walEdit = null;<a name="line.8022"></a>
+<span class="sourceLineNo">8023</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.8023"></a>
+<span class="sourceLineNo">8024</span>    final boolean writeToWAL = effectiveDurability != Durability.SKIP_WAL;<a name="line.8024"></a>
+<span class="sourceLineNo">8025</span>    // Process a Store/family at a time.<a name="line.8025"></a>
+<span class="sourceLineNo">8026</span>    for (Map.Entry&lt;byte [], List&lt;Cell&gt;&gt; entry: mutation.getFamilyCellMap().entrySet()) {<a name="line.8026"></a>
+<span class="sourceLineNo">8027</span>      final byte[] columnFamilyName = entry.getKey();<a name="line.8027"></a>
+<span class="sourceLineNo">8028</span>      List&lt;Cell&gt; deltas = entry.getValue();<a name="line.8028"></a>
+<span class="sourceLineNo">8029</span>      // Reckon for the Store what to apply to WAL and MemStore.<a name="line.8029"></a>
+<span class="sourceLineNo">8030</span>      List&lt;Cell&gt; toApply = reckonDeltasByStore(stores.get(columnFamilyName), op, mutation,<a name="line.8030"></a>
+<span class="sourceLineNo">8031</span>        effectiveDurability, now, deltas, results);<a name="line.8031"></a>
+<span class="sourceLineNo">8032</span>      if (!toApply.isEmpty()) {<a name="line.8032"></a>
+<span class="sourceLineNo">8033</span>        for (Cell cell : toApply) {<a name="line.8033"></a>
+<span class="sourceLineNo">8034</span>          HStore store = getStore(cell);<a name="line.8034"></a>
+<span class="sourceLineNo">8035</span>          if (store == null) {<a name="line.8035"></a>
+<span class="sourceLineNo">8036</span>            checkFamily(CellUtil.cloneFamily(cell));<a name="line.8036"></a>
+<span class="sourceLineNo">8037</span>          } else {<a name="line.8037"></a>
+<span class="sourceLineNo">8038</span>            forMemStore.computeIfAbsent(store, key -&gt; new ArrayList&lt;&gt;()).add(cell);<a name="line.8038"></a>
 <span class="sourceLineNo">8039</span>          }<a name="line.8039"></a>
-<span class="sourceLineNo">8040</span>          walEdit.getCells().addAll(toApply);<a name="line.8040"></a>
-<span class="sourceLineNo">8041</span>        }<a name="line.8041"></a>
-<span class="sourceLineNo">8042</span>      }<a name="line.8042"></a>
-<span class="sourceLineNo">8043</span>    }<a name="line.8043"></a>
-<span class="sourceLineNo">8044</span>    return walEdit;<a name="line.8044"></a>
-<span class="sourceLineNo">8045</span>  }<a name="line.8045"></a>
-<span class="sourceLineNo">8046</span><a name="line.8046"></a>
-<span class="sourceLineNo">8047</span>  /**<a name="line.8047"></a>
-<span class="sourceLineNo">8048</span>   * Reckon the Cells to apply to WAL, memstore, and to return to the Client in passed<a name="line.8048"></a>
-<span class="sourceLineNo">8049</span>   * column family/Store.<a name="line.8049"></a>
-<span class="sourceLineNo">8050</span>   *<a name="line.8050"></a>
-<span class="sourceLineNo">8051</span>   * Does Get of current value and then adds passed in deltas for this Store returning the result.<a name="line.8051"></a>
-<span class="sourceLineNo">8052</span>   *<a name="line.8052"></a>
-<span class="sourceLineNo">8053</span>   * @param op Whether Increment or Append<a name="line.8053"></a>
-<span class="sourceLineNo">8054</span>   * @param mutation The encompassing Mutation object<a name="line.8054"></a>
-<span class="sourceLineNo">8055</span>   * @param deltas Changes to apply to this Store; either increment amount or data to append<a name="line.8055"></a>
-<span class="sourceLineNo">8056</span>   * @param results In here we accumulate all the Cells we are to return to the client. If null,<a name="line.8056"></a>
-<span class="sourceLineNo">8057</span>   *                client doesn't want results returned.<a name="line.8057"></a>
-<span class="sourceLineNo">8058</span>   * @return Resulting Cells after &lt;code&gt;deltas&lt;/code&gt; have been applied to current<a name="line.8058"></a>
-<span class="sourceLineNo">8059</span>   *  values. Side effect is our filling out of the &lt;code&gt;results&lt;/code&gt; List.<a name="line.8059"></a>
-<span class="sourceLineNo">8060</span>   */<a name="line.8060"></a>
-<span class="sourceLineNo">8061</span>  private List&lt;Cell&gt; reckonDeltasByStore(HStore store, Operation op, Mutation mutation,<a name="line.8061"></a>
-<span class="sourceLineNo">8062</span>      Durability effectiveDurability, long now, List&lt;Cell&gt; deltas, List&lt;Cell&gt; results)<a name="line.8062"></a>
-<span class="sourceLineNo">8063</span>      throws IOException {<a name="line.8063"></a>
-<span class="sourceLineNo">8064</span>    byte[] columnFamily = store.getColumnFamilyDescriptor().getName();<a name="line.8064"></a>
-<span class="sourceLineNo">8065</span>    List&lt;Pair&lt;Cell, Cell&gt;&gt; cellPairs = new ArrayList&lt;&gt;(deltas.size());<a name="line.8065"></a>
-<span class="sourceLineNo">8066</span>    // Get previous values for all columns in this family.<a name="line.8066"></a>
-<span class="sourceLineNo">8067</span>    TimeRange tr = null;<a name="line.8067"></a>
-<span class="sourceLineNo">8068</span>    switch (op) {<a name="line.8068"></a>
-<span class="sourceLineNo">8069</span>      case INCREMENT:<a name="line.8069"></a>
-<span class="sourceLineNo">8070</span>        tr = ((Increment)mutation).getTimeRange();<a name="line.8070"></a>
-<span class="sourceLineNo">8071</span>        break;<a name="line.8071"></a>
-<span class="sourceLineNo">8072</span>      case APPEND:<a name="line.8072"></a>
-<span class="sourceLineNo">8073</span>        tr = ((Append)mutation).getTimeRange();<a name="line.8073"></a>
-<span class="sourceLineNo">8074</span>        break;<a name="line.8074"></a>
-<span class="sourceLineNo">8075</span>      default:<a name="line.8075"></a>
+<span class="sourceLineNo">8040</span>        }<a name="line.8040"></a>
+<span class="sourceLineNo">8041</span>        if (writeToWAL) {<a name="line.8041"></a>
+<span class="sourceLineNo">8042</span>          if (walEdit == null) {<a name="line.8042"></a>
+<span class="sourceLineNo">8043</span>            walEdit = new WALEdit();<a name="line.8043"></a>
+<span class="sourceLineNo">8044</span>          }<a name="line.8044"></a>
+<span class="sourceLineNo">8045</span>          walEdit.getCells().addAll(toApply);<a name="line.8045"></a>
+<span class="sourceLineNo">8046</span>        }<a name="line.8046"></a>
+<span class="sourceLineNo">8047</span>      }<a name="line.8047"></a>
+<span class="sourceLineNo">8048</span>    }<a name="line.8048"></a>
+<span class="sourceLineNo">8049</span>    return walEdit;<a name="line.8049"></a>
+<span class="sourceLineNo">8050</span>  }<a name="line.8050"></a>
+<span class="sourceLineNo">8051</span><a name="line.8051"></a>
+<span class="sourceLineNo">8052</span>  /**<a name="line.8052"></a>
+<span class="sourceLineNo">8053</span>   * Reckon the Cells to apply to WAL, memstore, and to return to the Client in passed<a name="line.8053"></a>
+<span class="sourceLineNo">8054</span>   * column family/Store.<a name="line.8054"></a>
+<span class="sourceLineNo">8055</span>   *<a name="line.8055"></a>
+<span class="sourceLineNo">8056</span>   * Does Get of current value and then adds passed in deltas for this Store returning the result.<a name="line.8056"></a>
+<span class="sourceLineNo">8057</span>   *<a name="line.8057"></a>
+<span class="sourceLineNo">8058</span>   * @param op Whether Increment or Append<a name="line.8058"></a>
+<span class="sourceLineNo">8059</span>   * @param mutation The encompassing Mutation object<a name="line.8059"></a>
+<span class="sourceLineNo">8060</span>   * @param deltas Changes to apply to this Store; either increment amount or data to append<a name="line.8060"></a>
+<span class="sourceLineNo">8061</span>   * @param results In here we accumulate all the Cells we are to return to the client. If null,<a name="line.8061"></a>
+<span class="sourceLineNo">8062</span>   *                client doesn't want results returned.<a name="line.8062"></a>
+<span class="sourceLineNo">8063</span>   * @return Resulting Cells after &lt;code&gt;deltas&lt;/code&gt; have been applied to current<a name="line.8063"></a>
+<span class="sourceLineNo">8064</span>   *  values. Side effect is our filling out of the &lt;code&gt;results&lt;/code&gt; List.<a name="line.8064"></a>
+<span class="sourceLineNo">8065</span>   */<a name="line.8065"></a>
+<span class="sourceLineNo">8066</span>  private List&lt;Cell&gt; reckonDeltasByStore(HStore store, Operation op, Mutation mutation,<a name="line.8066"></a>
+<span class="sourceLineNo">8067</span>      Durability effectiveDurability, long now, List&lt;Cell&gt; deltas, List&lt;Cell&gt; results)<a name="line.8067"></a>
+<span class="sourceLineNo">8068</span>      throws IOException {<a name="line.8068"></a>
+<span class="sourceLineNo">8069</span>    byte[] columnFamily = store.getColumnFamilyDescriptor().getName();<a name="line.8069"></a>
+<span class="sourceLineNo">8070</span>    List&lt;Pair&lt;Cell, Cell&gt;&gt; cellPairs = new ArrayList&lt;&gt;(deltas.size());<a name="line.8070"></a>
+<span class="sourceLineNo">8071</span>    // Get previous values for all columns in this family.<a name="line.8071"></a>
+<span class="sourceLineNo">8072</span>    TimeRange tr = null;<a name="line.8072"></a>
+<span class="sourceLineNo">8073</span>    switch (op) {<a name="line.8073"></a>
+<span class="sourceLineNo">8074</span>      case INCREMENT:<a name="line.8074"></a>
+<span class="sourceLineNo">8075</span>        tr = ((Increment)mutation).getTimeRange();<a name="line.8075"></a>
 <span class="sourceLineNo">8076</span>        break;<a name="line.8076"></a>
-<span class="sourceLineNo">8077</span>    }<a name="line.8077"></a>
-<span class="sourceLineNo">8078</span>    List&lt;Cell&gt; currentValues = get(mutation, store, deltas,null, tr);<a name="line.8078"></a>
-<span class="sourceLineNo">8079</span>    // Iterate the input columns and update existing values if they were found, otherwise<a name="line.8079"></a>
-<span class="sourceLineNo">8080</span>    // add new column initialized to the delta amount<a name="line.8080"></a>
-<span class="sourceLineNo">8081</span>    int currentValuesIndex = 0;<a name="line.8081"></a>
-<span class="sourceLineNo">8082</span>    for (int i = 0; i &lt; deltas.size(); i++) {<a name="line.8082"></a>
-<span class="sourceLineNo">8083</span>      Cell delta = deltas.get(i);<a name="line.8083"></a>
-<span class="sourceLineNo">8084</span>      Cell currentValue = null;<a name="line.8084"></a>
-<span class="sourceLineNo">8085</span>      if (currentValuesIndex &lt; currentValues.size() &amp;&amp;<a name="line.8085"></a>
-<span class="sourceLineNo">8086</span>          CellUtil.matchingQualifier(currentValues.get(currentValuesIndex), delta)) {<a name="line.8086"></a>
-<span class="sourceLineNo">8087</span>        currentValue = currentValues.get(currentValuesIndex);<a name="line.8087"></a>
-<span class="sourceLineNo">8088</span>        if (i &lt; (deltas.size() - 1) &amp;&amp; !CellUtil.matchingQualifier(delta, deltas.get(i + 1))) {<a name="line.8088"></a>
-<span class="sourceLineNo">8089</span>          currentValuesIndex++;<a name="line.8089"></a>
-<span class="sourceLineNo">8090</span>        }<a name="line.8090"></a>
-<span class="sourceLineNo">8091</span>      }<a name="line.8091"></a>
-<span class="sourceLineNo">8092</span><a name="line.8092"></a>
-<span class="sourceLineNo">8093</span>      // Switch on whether this an increment or an append building the new Cell to apply.<a name="line.8093"></a>
-<span class="sourceLineNo">8094</span>      Cell newCell = null;<a name="line.8094"></a>
-<span class="sourceLineNo">8095</span>      switch (op) {<a name="line.8095"></a>
-<span class="sourceLineNo">8096</span>        case INCREMENT:<a name="line.8096"></a>
-<span class="sourceLineNo">8097</span>          long deltaAmount = getLongValue(delta);<a name="line.8097"></a>
-<span class="sourceLineNo">8098</span>          final long newValue = currentValue == null ? deltaAmount : getLongValue(currentValue) + deltaAmount;<a name="line.8098"></a>
-<span class="sourceLineNo">8099</span>          newCell = reckonDelta(delta, currentValue, columnFamily, now, mutation, (oldCell) -&gt; Bytes.toBytes(newValue));<a name="line.8099"></a>
-<span class="sourceLineNo">8100</span>          break;<a name="line.8100"></a>
-<span class="sourceLineNo">8101</span>        case APPEND:<a name="line.8101"></a>
-<span class="sourceLineNo">8102</span>          newCell = reckonDelta(delta, currentValue, columnFamily, now, mutation, (oldCell) -&gt;<a name="line.8102"></a>
-<span class="sourceLineNo">8103</span>            ByteBuffer.wrap(new byte[delta.getValueLength() + oldCell.getValueLength()])<a name="line.8103"></a>
-<span class="sourceLineNo">8104</span>                    .put(oldCell.getValueArray(), oldCell.getValueOffset(), oldCell.getValueLength())<a name="line.8104"></a>
-<span class="sourceLineNo">8105</span>                    .put(delta.getValueArray(), delta.getValueOffset(), delta.getValueLength())<a name="line.8105"></a>
-<span class="sourceLineNo">8106</span>                    .array()<a name="line.8106"></a>
-<span class="sourceLineNo">8107</span>          );<a name="line.8107"></a>
-<span class="sourceLineNo">8108</span>          break;<a name="line.8108"></a>
-<span class="sourceLineNo">8109</span>        default: throw new UnsupportedOperationException(op.toString());<a name="line.8109"></a>
-<span class="sourceLineNo">8110</span>      }<a name="line.8110"></a>
-<span class="sourceLineNo">8111</span>      int newCellSize = PrivateCellUtil.estimatedSerializedSizeOf(newCell);<a name="line.8111"></a>
-<span class="sourceLineNo">8112</span>      if (newCellSize &gt; this.maxCellSize) {<a name="line.8112"></a>
-<span class="sourceLineNo">8113</span>        String msg = "Cell with size " + newCellSize + " exceeds limit of " +<a name="line.8113"></a>
-<span class="sourceLineNo">8114</span>            this.maxCellSize + " bytes";<a name="line.8114"></a>
-<span class="sourceLineNo">8115</span>        if (LOG.isDebugEnabled()) {<a name="line.8115"></a>
-<span class="sourceLineNo">8116</span>          LOG.debug(msg);<a name="line.8116"></a>
-<span class="sourceLineNo">8117</span>        }<a name="line.8117"></a>
-<span class="sourceLineNo">8118</span>        throw new DoNotRetryIOException(msg);<a name="line.8118"></a>
-<span class="sourceLineNo">8119</span>      }<a name="line.8119"></a>
-<span class="sourceLineNo">8120</span>      cellPairs.add(new Pair&lt;&gt;(currentValue, newCell));<a name="line.8120"></a>
-<span class="sourceLineNo">8121</span>      // Add to results to get returned to the Client. If null, cilent does not want results.<a name="line.8121"></a>
-<span class="sourceLineNo">8122</span>      if (results != null) {<a name="line.8122"></a>
-<span class="sourceLineNo">8123</span>        results.add(newCell);<a name="line.8123"></a>
+<span class="sourceLineNo">8077</span>      case APPEND:<a name="line.8077"></a>
+<span class="sourceLineNo">8078</span>        tr = ((Append)mutation).getTimeRange();<a name="line.8078"></a>
+<span class="sourceLineNo">8079</span>        break;<a name="line.8079"></a>
+<span class="sourceLineNo">8080</span>      default:<a name="line.8080"></a>
+<span class="sourceLineNo">8081</span>        break;<a name="line.8081"></a>
+<span class="sourceLineNo">8082</span>    }<a name="line.8082"></a>
+<span class="sourceLineNo">8083</span>    List&lt;Cell&gt; currentValues = get(mutation, store, deltas,null, tr);<a name="line.8083"></a>
+<span class="sourceLineNo">8084</span>    // Iterate the input columns and update existing values if they were found, otherwise<a name="line.8084"></a>
+<span class="sourceLineNo">8085</span>    // add new column initialized to the delta amount<a name="line.8085"></a>
+<span class="sourceLineNo">8086</span>    int currentValuesIndex = 0;<a name="line.8086"></a>
+<span class="sourceLineNo">8087</span>    for (int i = 0; i &lt; deltas.size(); i++) {<a name="line.8087"></a>
+<span class="sourceLineNo">8088</span>      Cell delta = deltas.get(i);<a name="line.8088"></a>
+<span class="sourceLineNo">8089</span>      Cell currentValue = null;<a name="line.8089"></a>
+<span class="sourceLineNo">8090</span>      if (currentValuesIndex &lt; currentValues.size() &amp;&amp;<a name="line.8090"></a>
+<span class="sourceLineNo">8091</span>          CellUtil.matchingQualifier(currentValues.get(currentValuesIndex), delta)) {<a name="line.8091"></a>
+<span class="sourceLineNo">8092</span>        currentValue = currentValues.get(currentValuesIndex);<a name="line.8092"></a>
+<span class="sourceLineNo">8093</span>        if (i &lt; (deltas.size() - 1) &amp;&amp; !CellUtil.matchingQualifier(delta, deltas.get(i + 1))) {<a name="line.8093"></a>
+<span class="sourceLineNo">8094</span>          currentValuesIndex++;<a name="line.8094"></a>
+<span class="sourceLineNo">8095</span>        }<a name="line.8095"></a>
+<span class="sourceLineNo">8096</span>      }<a name="line.8096"></a>
+<span class="sourceLineNo">8097</span><a name="line.8097"></a>
+<span class="sourceLineNo">8098</span>      // Switch on whether this an increment or an append building the new Cell to apply.<a name="line.8098"></a>
+<span class="sourceLineNo">8099</span>      Cell newCell = null;<a name="line.8099"></a>
+<span class="sourceLineNo">8100</span>      switch (op) {<a name="line.8100"></a>
+<span class="sourceLineNo">8101</span>        case INCREMENT:<a name="line.8101"></a>
+<span class="sourceLineNo">8102</span>          long deltaAmount = getLongValue(delta);<a name="line.8102"></a>
+<span class="sourceLineNo">8103</span>          final long newValue = currentValue == null ? deltaAmount : getLongValue(currentValue) + deltaAmount;<a name="line.8103"></a>
+<span class="sourceLineNo">8104</span>          newCell = reckonDelta(delta, currentValue, columnFamily, now, mutation, (oldCell) -&gt; Bytes.toBytes(newValue));<a name="line.8104"></a>
+<span class="sourceLineNo">8105</span>          break;<a name="line.8105"></a>
+<span class="sourceLineNo">8106</span>        case APPEND:<a name="line.8106"></a>
+<span class="sourceLineNo">8107</span>          newCell = reckonDelta(delta, currentValue, columnFamily, now, mutation, (oldCell) -&gt;<a name="line.8107"></a>
+<span class="sourceLineNo">8108</span>            ByteBuffer.wrap(new byte[delta.getValueLength() + oldCell.getValueLength()])<a name="line.8108"></a>
+<span class="sourceLineNo">8109</span>                    .put(oldCell.getValueArray(), oldCell.getValueOffset(), oldCell.getValueLength())<a name="line.8109"></a>
+<span class="sourceLineNo">8110</span>                    .put(delta.getValueArray(), delta.getValueOffset(), delta.getValueLength())<a name="line.8110"></a>
+<span class="sourceLineNo">8111</span>                    .array()<a name="line.8111"></a>
+<span class="sourceLineNo">8112</span>          );<a name="line.8112"></a>
+<span class="sourceLineNo">8113</span>          break;<a name="line.8113"></a>
+<span class="sourceLineNo">8114</span>        default: throw new UnsupportedOperationException(op.toString());<a name="line.8114"></a>
+<span class="sourceLineNo">8115</span>      }<a name="line.8115"></a>
+<span class="sourceLineNo">8116</span>      int newCellSize = PrivateCellUtil.estimatedSerializedSizeOf(newCell);<a name="line.8116"></a>
+<span class="sourceLineNo">8117</span>      if (newCellSize &gt; this.maxCellSize) {<a name="line.8117"></a>
+<span class="sourceLineNo">8118</span>        String msg = "Cell with size " + newCellSize + " exceeds limit of " +<a name="line.8118"></a>
+<span class="sourceLineNo">8119</span>            this.maxCellSize + " bytes";<a name="line.8119"></a>
+<span class="sourceLineNo">8120</span>        if (LOG.isDebugEnabled()) {<a name="line.8120"></a>
+<span class="sourceLineNo">8121</span>          LOG.debug(msg);<a name="line.8121"></a>
+<span class="sourceLineNo">8122</span>        }<a name="line.8122"></a>
+<span class="sourceLineNo">8123</span>        throw new DoNotRetryIOException(msg);<a name="line.8123"></a>
 <span class="sourceLineNo">8124</span>      }<a name="line.8124"></a>
-<span class="sourceLineNo">8125</span>    }<a name="line.8125"></a>
-<span class="sourceLineNo">8126</span><a name="line.8126"></a>
-<span class="sourceLineNo">8127</span>    // Give coprocessors a chance to update the new cells before apply to WAL or memstore<a name="line.8127"></a>
-<span class="sourceLineNo">8128</span>    if (coprocessorHost != null) {<a name="line.8128"></a>
-<span class="sourceLineNo">8129</span>      // Here the operation must be increment or append.<a name="line.8129"></a>
-<span class="sourceLineNo">8130</span>      cellPairs = op == Operation.INCREMENT ?<a name="line.8130"></a>
-<span class="sourceLineNo">8131</span>          coprocessorHost.postIncrementBeforeWAL(mutation, cellPairs) :<a name="line.8131"></a>
-<span class="sourceLineNo">8132</span>          coprocessorHost.postAppendBeforeWAL(mutation, cellPairs);<a name="line.8132"></a>
-<span class="sourceLineNo">8133</span>    }<a name="line.8133"></a>
-<span class="sourceLineNo">8134</span>    return cellPairs.stream().map(Pair::getSecond).collect(Collectors.toList());<a name="line.8134"></a>
-<span class="sourceLineNo">8135</span>  }<a name="line.8135"></a>
-<span class="sourceLineNo">8136</span><a name="line.8136"></a>
-<span class="sourceLineNo">8137</span>  private static Cell reckonDelta(final Cell delta, final Cell currentCell,<a name="line.8137"></a>
-<span class="sourceLineNo">8138</span>                                  final byte[] columnFamily, final long now,<a name="line.8138"></a>
-<span class="sourceLineNo">8139</span>                                  Mutation mutation, Function&lt;Cell, byte[]&gt; supplier) throws IOException {<a name="line.8139"></a>
-<span class="sourceLineNo">8140</span>    // Forward any tags found on the delta.<a name="line.8140"></a>
-<span class="sourceLineNo">8141</span>    List&lt;Tag&gt; tags = TagUtil.carryForwardTags(delta);<a name="line.8141"></a>
-<span class="sourceLineNo">8142</span>    tags = TagUtil.carryForwardTTLTag(tags, mutation.getTTL());<a name="line.8142"></a>
-<span class="sourceLineNo">8143</span>    if (currentCell != null) {<a name="line.8143"></a>
-<span class="sourceLineNo">8144</span>      tags = TagUtil.carryForwardTags(tags, currentCell);<a name="line.8144"></a>
-<span class="sourceLineNo">8145</span>      byte[] newValue = supplier.apply(currentCell);<a name="line.8145"></a>
-<span class="sourceLineNo">8146</span>      return ExtendedCellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.8146"></a>
-<span class="sourceLineNo">8147</span>              .setRow(mutation.getRow(), 0, mutation.getRow().length)<a name="line.8147"></a>
-<span class="sourceLineNo">8148</span>              .setFamily(columnFamily, 0, columnFamily.length)<a name="line.8148"></a>
-<span class="sourceLineNo">8149</span>              // copy the qualifier if the cell is located in shared memory.<a name="line.8149"></a>
-<span class="sourceLineNo">8150</span>              .setQualifier(CellUtil.cloneQualifier(delta))<a name="line.8150"></a>
-<span class="sourceLineNo">8151</span>              .setTimestamp(Math.max(currentCell.getTimestamp() + 1, now))<a name="line.8151"></a>
-<span class="sourceLineNo">8152</span>              .setType(KeyValue.Type.Put.getCode())<a name="line.8152"></a>
-<span class="sourceLineNo">8153</span>              .setValue(newValue, 0, newValue.length)<a name="line.8153"></a>
-<span class="sourceLineNo">8154</span>              .setTags(TagUtil.fromList(tags))<a name="line.8154"></a>
-<span class="sourceLineNo">8155</span>              .build();<a name="line.8155"></a>
-<span class="sourceLineNo">8156</span>    } else {<a name="line.8156"></a>
-<span class="sourceLineNo">8157</span>      PrivateCellUtil.updateLatestStamp(delta, now);<a name="line.8157"></a>
-<span class="sourceLineNo">8158</span>      return CollectionUtils.isEmpty(tags) ? delta : PrivateCellUtil.createCell(delta, tags);<a name="line.8158"></a>
-<span class="sourceLineNo">8159</span>    }<a name="line.8159"></a>
-<span class="sourceLineNo">8160</span>  }<a name="line.8160"></a>
-<span class="sourceLineNo">8161</span><a name="line.8161"></a>
-<span class="sourceLineNo">8162</span>  /**<a name="line.8162"></a>
-<span class="sourceLineNo">8163</span>   * @return Get the long out of the passed in Cell<a name="line.8163"></a>
-<span class="sourceLineNo">8164</span>   */<a name="line.8164"></a>
-<span class="sourceLineNo">8165</span>  private static long getLongValue(final Cell cell) throws DoNotRetryIOException {<a name="line.8165"></a>
-<span class="sourceLineNo">8166</span>    int len = cell.getValueLength();<a name="line.8166"></a>
-<span class="sourceLineNo">8167</span>    if (len != Bytes.SIZEOF_LONG) {<a name="line.8167"></a>
-<span class="sourceLineNo">8168</span>      // throw DoNotRetryIOException instead of IllegalArgumentException<a name="line.8168"></a>
-<span class="sourceLineNo">8169</span>      throw new DoNotRetryIOException("Field is not a long, it's " + len + " bytes wide");<a name="line.8169"></a>
-<span class="sourceLineNo">8170</span>    }<a name="line.8170"></a>
-<span class="sourceLineNo">8171</span>    return PrivateCellUtil.getValueAsLong(cell);<a name="line.8171"></a>
-<span class="sourceLineNo">8172</span>  }<a name="line.8172"></a>
-<span class="sourceLineNo">8173</span><a name="line.8173"></a>
-<span class="sourceLineNo">8174</span>  /**<a name="line.8174"></a>
-<span class="sourceLineNo">8175</span>   * Do a specific Get on passed &lt;code&gt;columnFamily&lt;/code&gt; and column qualifiers.<a name="line.8175"></a>
-<span class="sourceLineNo">8176</span>   * @param mutation Mutation we are doing this Get for.<a name="line.8176"></a>
-<span class="sourceLineNo">8177</span>   * @param store Which column family on row (TODO: Go all Gets in one go)<a name="line.8177"></a>
-<span class="sourceLineNo">8178</span>   * @param coordinates Cells from &lt;code&gt;mutation&lt;/code&gt; used as coordinates applied to Get.<a name="line.8178"></a>
-<span class="sourceLineNo">8179</span>   * @return Return list of Cells found.<a name="line.8179"></a>
-<span class="sourceLineNo">8180</span>   */<a name="line.8180"></a>
-<span class="sourceLineNo">8181</span>  private List&lt;Cell&gt; get(Mutation mutation, HStore store, List&lt;Cell&gt; coordinates,<a name="line.8181"></a>
-<span class="sourceLineNo">8182</span>      IsolationLevel isolation, TimeRange tr) throws IOException {<a name="line.8182"></a>
-<span class="sourceLineNo">8183</span>    // Sort the cells so that they match the order that they appear in the Get results. Otherwise,<a name="line.8183"></a>
-<span class="sourceLineNo">8184</span>    // we won't be able to find the existing values if the cells are not specified in order by the<a name="line.8184"></a>
-<span class="sourceLineNo">8185</span>    // client since cells are in an array list.<a name="line.8185"></a>
-<span class="sourceLineNo">8186</span>    // TODO: I don't get why we are sorting. St.Ack 20150107<a name="line.8186"></a>
-<span class="sourceLineNo">8187</span>    sort(coordinates, store.getComparator());<a name="line.8187"></a>
-<span class="sourceLineNo">8188</span>    Get get = new Get(mutation.getRow());<a name="line.8188"></a>
-<span class="sourceLineNo">8189</span>    if (isolation != null) {<a name="line.8189"></a>
-<span class="sourceLineNo">8190</span>      get.setIsolationLevel(isolation);<a name="line.8190"></a>
-<span class="sourceLineNo">8191</span>    }<a name="line.8191"></a>
-<span class="sourceLineNo">8192</span>    for (Cell cell: coordinates) {<a name="line.8192"></a>
-<span class="sourceLineNo">8193</span>      get.addColumn(store.getColumnFamilyDescriptor().getName(), CellUtil.cloneQualifier(cell));<a name="line.8193"></a>
-<span class="sourceLineNo">8194</span>    }<a name="line.8194"></a>
-<span class="sourceLineNo">8195</span>    // Increments carry time range. If an Increment instance, put it on the Get.<a name="line.8195"></a>
-<span class="sourceLineNo">8196</span>    if (tr != null) {<a name="line.8196"></a>
-<span class="sourceLineNo">8197</span>      get.setTimeRange(tr.getMin(), tr.getMax());<a name="line.8197"></a>
-<span class="sourceLineNo">8198</span>    }<a name="line.8198"></a>
-<span class="sourceLineNo">8199</span>    return get(get, false);<a name="line.8199"></a>
-<span class="sourceLineNo">8200</span>  }<a name="line.8200"></a>
-<span class="sourceLineNo">8201</span><a name="line.8201"></a>
-<span class="sourceLineNo">8202</span>  /**<a name="line.8202"></a>
-<span class="sourceLineNo">8203</span>   * @return Sorted list of &lt;code&gt;cells&lt;/code&gt; using &lt;code&gt;comparator&lt;/code&gt;<a name="line.8203"></a>
-<span class="sourceLineNo">8204</span>   */<a name="line.8204"></a>
-<span class="sourceLineNo">8205</span>  private static List&lt;Cell&gt; sort(List&lt;Cell&gt; cells, final CellComparator comparator) {<a name="line.8205"></a>
-<span class="sourceLineNo">8206</span>    cells.sort(comparator);<a name="line.8206"></a>
-<span class="sourceLineNo">8207</span>    return cells;<a name="line.8207"></a>
-<span class="sourceLineNo">8208</span>  }<a name="line.8208"></a>
-<span class="sourceLineNo">8209</span><a name="line.8209"></a>
-<span class="sourceLineNo">8210</span>  public static final long FIXED_OVERHEAD = ClassSize.align(<a name="line.8210"></a>
-<span class="sourceLineNo">8211</span>      ClassSize.OBJECT +<a name="line.8211"></a>
-<span class="sourceLineNo">8212</span>      ClassSize.ARRAY +<a name="line.8212"></a>
-<span class="sourceLineNo">8213</span>      55 * ClassSize.REFERENCE + 3 * Bytes.SIZEOF_INT +<a name="line.8213"></a>
-<span class="sourceLineNo">8214</span>      (15 * Bytes.SIZEOF_LONG) +<a name="line.8214"></a>
-<span class="sourceLineNo">8215</span>      3 * Bytes.SIZEOF_BOOLEAN);<a name="line.8215"></a>
-<span class="sourceLineNo">8216</span><a name="line.8216"></a>
-<span class="sourceLineNo">8217</span>  // woefully out of date - currently missing:<a name="line.8217"></a>
-<span class="sourceLineNo">8218</span>  // 1 x HashMap - coprocessorServiceHandlers<a name="line.8218"></a>
-<span class="sourceLineNo">8219</span>  // 6 x LongAdder - numMutationsWithoutWAL, dataInMemoryWithoutWAL,<a name="line.8219"></a>
-<span class="sourceLineNo">8220</span>  //   checkAndMutateChecksPassed, checkAndMutateChecksFailed, readRequestsCount,<a name="line.8220"></a>
-<span class="sourceLineNo">8221</span>  //   writeRequestsCount, cpRequestsCount<a name="line.8221"></a>
-<span class="sourceLineNo">8222</span>  // 1 x HRegion$WriteState - writestate<a name="line.8222"></a>
-<span class="sourceLineNo">8223</span>  // 1 x RegionCoprocessorHost - coprocessorHost<a name="line.8223"></a>
-<span class="sourceLineNo">8224</span>  // 1 x RegionSplitPolicy - splitPolicy<a name="line.8224"></a>
-<span class="sourceLineNo">8225</span>  // 1 x MetricsRegion - metricsRegion<a name="line.8225"></a>
-<span class="sourceLineNo">8226</span>  // 1 x MetricsRegionWrapperImpl - metricsRegionWrapper<a name="line.8226"></a>
-<span class="sourceLineNo">8227</span>  public static final long DEEP_OVERHEAD = FIXED_OVERHEAD +<a name="line.8227"></a>
-<span class="sourceLineNo">8228</span>      ClassSize.OBJECT + // closeLock<a name="line.8228"></a>
-<span class="sourceLineNo">8229</span>      (2 * ClassSize.ATOMIC_BOOLEAN) + // closed, closing<a name="line.8229"></a>
-<span class="sourceLineNo">8230</span>      (3 * ClassSize.ATOMIC_LONG) + // numPutsWithoutWAL, dataInMemoryWithoutWAL,<a name="line.8230"></a>
-<span class="sourceLineNo">8231</span>                                    // compactionsFailed<a name="line.8231"></a>
-<span class="sourceLineNo">8232</span>      (2 * ClassSize.CONCURRENT_HASHMAP) +  // lockedRows, scannerReadPoints<a name="line.8232"></a>
-<span class="sourceLineNo">8233</span>      WriteState.HEAP_SIZE + // writestate<a name="line.8233"></a>
-<span class="sourceLineNo">8234</span>      ClassSize.CONCURRENT_SKIPLISTMAP + ClassSize.CONCURRENT_SKIPLISTMAP_ENTRY + // stores<a name="line.8234"></a>
-<span class="sourceLineNo">8235</span>      (2 * ClassSize.REENTRANT_LOCK) + // lock, updatesLock<a name="line.8235"></a>
-<span class="sourceLineNo">8236</span>      MultiVersionConcurrencyControl.FIXED_SIZE // mvcc<a name="line.8236"></a>
-<span class="sourceLineNo">8237</span>      + 2 * ClassSize.TREEMAP // maxSeqIdInStores, replicationScopes<a name="line.8237"></a>
-<span class="sourceLineNo">8238</span>      + 2 * ClassSize.ATOMIC_INTEGER // majorInProgress, minorInProgress<a name="line.8238"></a>
-<span class="sourceLineNo">8239</span>      + ClassSize.STORE_SERVICES // store services<a name="line.8239"></a>
-<span class="sourceLineNo">8240</span>      + StoreHotnessProtector.FIXED_SIZE<a name="line.8240"></a>
-<span class="sourceLineNo">8241</span>      ;<a name="line.8241"></a>
-<span class="sourceLineNo">8242</span><a name="line.8242"></a>
-<span class="sourceLineNo">8243</span>  @Override<a name="line.8243"></a>
-<span class="sourceLineNo">8244</span>  public long heapSize() {<a name="line.8244"></a>
-<span class="sourceLineNo">8245</span>    // this does not take into account row locks, recent flushes, mvcc entries, and more<a name="line.8245"></a>
-<span class="sourceLineNo">8246</span>    return DEEP_OVERHEAD + stores.values().stream().mapToLong(HStore::heapSize).sum();<a name="line.8246"></a>
-<span class="sourceLineNo">8247</span>  }<a name="line.8247"></a>
-<span class="sourceLineNo">8248</span><a name="line.8248"></a>
-<span class="sourceLineNo">8249</span>  /**<a name="line.8249"></a>
-<span class="sourceLineNo">8250</span>   * Registers a new protocol buffer {@link Service} subclass as a coprocessor endpoint to<a name="line.8250"></a>
-<span class="sourceLineNo">8251</span>   * be available for handling Region#execService(com.google.protobuf.RpcController,<a name="line.8251"></a>
-<span class="sourceLineNo">8252</span>   *    org.apache.hadoop.hbase.protobuf.generated.ClientProtos.CoprocessorServiceCall) calls.<a name="line.8252"></a>
-<span class="sourceLineNo">8253</span>   *<a name="line.8253"></a>
-<span class="sourceLineNo">8254</span>   * &lt;p&gt;<a name="line.8254"></a>
-<span class="sourceLineNo">8255</span>   * Only a single instance may be registered per region for a given {@link Service} subclass (the<a name="line.8255"></a>
-<span class="sourceLineNo">8256</span>   * instances are keyed on {@link com.google.protobuf.Descriptors.ServiceDescriptor#getFullName()}.<a name="line.8256"></a>
-<span class="sourceLineNo">8257</span>   * After the first registration, subsequent calls with the same service name will fail with<a name="line.8257"></a>
-<span class="sourceLineNo">8258</span>   * a return value of {@code false}.<a name="line.8258"></a>
-<span class="sourceLineNo">8259</span>   * &lt;/p&gt;<a name="line.8259"></a>
-<span class="sourceLineNo">8260</span>   * @param instance the {@code Service} subclass instance to expose as a coprocessor endpoint<a name="line.8260"></a>
-<span class="sourceLineNo">8261</span>   * @return {@code true} if the registration was successful, {@code false}<a name="line.8261"></a>
-<span class="sourceLineNo">8262</span>   * otherwise<a name="line.8262"></a>
-<span class="sourceLineNo">8263</span>   */<a name="line.8263"></a>
-<span class="sourceLineNo">8264</span>  public boolean registerService(com.google.protobuf.Service instance) {<a name="line.8264"></a>
-<span class="sourceLineNo">8265</span>    /*<a name="line.8265"></a>
-<span class="sourceLineNo">8266</span>     * No stacking of instances is allowed for a single service name<a name="line.8266"></a>
-<span class="sourceLineNo">8267</span>     */<a name="line.8267"></a>
-<span class="sourceLineNo">8268</span>    com.google.protobuf.Descriptors.ServiceDescriptor serviceDesc = instance.getDescriptorForType();<a name="line.8268"></a>
-<span class="sourceLineNo">8269</span>    String serviceName = CoprocessorRpcUtils.getServiceName(serviceDesc);<a name="line.8269"></a>
-<span class="sourceLineNo">8270</span>    if (coprocessorServiceHandlers.containsKey(serviceName)) {<a name="line.8270"></a>
-<span class="sourceLineNo">8271</span>      LOG.error("Coprocessor service " + serviceName +<a name="line.8271"></a>
-<span class="sourceLineNo">8272</span>          " already registered, rejecting request from " + instance);<a name="line.8272"></a>
-<span class="sourceLineNo">8273</span>      return false;<a name="line.8273"></a>
-<span class="sourceLineNo">8274</span>    }<a name="line.8274"></a>
-<span class="sourceLineNo">8275</span><a name="line.8275"></a>
-<span class="sourceLineNo">8276</span>    coprocessorServiceHandlers.put(serviceName, instance);<a name="line.8276"></a>
-<span class="sourceLineNo">8277</span>    if (LOG.isDebugEnabled()) {<a name="line.8277"></a>
-<span class="sourceLineNo">8278</span>      LOG.debug("Registered coprocessor service: region=" +<a name="line.8278"></a>
-<span class="sourceLineNo">8279</span>          Bytes.toStringBinary(getRegionInfo().getRegionName()) +<a name="line.8279"></a>
-<span class="sourceLineNo">8280</span>          " service=" + serviceName);<a name="line.8280"></a>
-<span class="sourceLineNo">8281</span>    }<a name="line.8281"></a>
-<span class="sourceLineNo">8282</span>    return true;<a name="line.8282"></a>
-<span class="sourceLineNo">8283</span>  }<a name="line.8283"></a>
-<span class="sourceLineNo">8284</span><a name="line.8284"></a>
-<span class="sourceLineNo">8285</span>  /**<a name="line.8285"></a>
-<span class="sourceLineNo">8286</span>   * Executes a single protocol buffer coprocessor endpoint {@link Service} method using<a name="line.8286"></a>
-<span class="sourceLineNo">8287</span>   * the registered protocol handlers.  {@link Service} implementations must be registered via the<a name="line.8287"></a>
-<span class="sourceLineNo">8288</span>   * {@link #registerService(com.google.protobuf.Service)}<a name="line.8288"></a>
-<span class="sourceLineNo">8289</span>   * method before they are available.<a name="line.8289"></a>
-<span class="sourceLineNo">8290</span>   *<a name="line.8290"></a>
-<span class="sourceLineNo">8291</span>   * @param controller an {@code RpcContoller} implementation to pass to the invoked service<a name="line.8291"></a>
-<span class="sourceLineNo">8292</span>   * @param call a {@code CoprocessorServiceCall} instance identifying the service, method,<a name="line.8292"></a>
-<span class="sourceLineNo">8293</span>   *     and parameters for the method invocation<a name="line.8293"></a>
-<span class="sourceLineNo">8294</span>   * @return a protocol buffer {@code Message} instance containing the method's result<a name="line.8294"></a>
-<span class="sourceLineNo">8295</span>   * @throws IOException if no registered service handler is found or an error<a name="line.8295"></a>
-<span class="sourceLineNo">8296</span>   *     occurs during the invocation<a name="line.8296"></a>
-<span class="sourceLineNo">8297</span>   * @see #registerService(com.google.protobuf.Service)<a name="line.8297"></a>
-<span class="sourceLineNo">8298</span>   */<a name="line.8298"></a>
-<span class="sourceLineNo">8299</span>  public com.google.protobuf.Message execService(com.google.protobuf.RpcController controller,<a name="line.8299"></a>
-<span class="sourceLineNo">8300</span>      CoprocessorServiceCall call) throws IOException {<a name="line.8300"></a>
-<span class="sourceLineNo">8301</span>    String serviceName = call.getServiceName();<a name="line.8301"></a>
-<span class="sourceLineNo">8302</span>    com.google.protobuf.Service service = coprocessorServiceHandlers.get(serviceName);<a name="line.8302"></a>
-<span class="sourceLineNo">8303</span>    if (service == null) {<a name="line.8303"></a>
-<span class="sourceLineNo">8304</span>      throw new UnknownProtocolException(null, "No registered coprocessor service found for " +<a name="line.8304"></a>
-<span class="sourceLineNo">8305</span>          serviceName + " in region " + Bytes.toStringBinary(getRegionInfo().getRegionName()));<a name="line.8305"></a>
-<span class="sourceLineNo">8306</span>    }<a name="line.8306"></a>
-<span class="sourceLineNo">8307</span>    com.google.protobuf.Descriptors.ServiceDescriptor serviceDesc = service.getDescriptorForType();<a name="line.8307"></a>
-<span class="sourceLineNo">8308</span><a name="line.8308"></a>
-<span class="sourceLineNo">8309</span>    cpRequestsCount.increment();<a name="line.8309"></a>
-<span class="sourceLineNo">8310</span>    String methodName = call.getMethodName();<a name="line.8310"></a>
-<span class="sourceLineNo">8311</span>    com.google.protobuf.Descriptors.MethodDescriptor methodDesc =<a name="line.8311"></a>
-<span class="sourceLineNo">8312</span>        CoprocessorRpcUtils.getMethodDescriptor(methodName, serviceDesc);<a name="line.8312"></a>
+<span class="sourceLineNo">8125</span>      cellPairs.add(new Pair&lt;&gt;(currentValue, newCell));<a name="line.8125"></a>
+<span class="sourceLineNo">8126</span>      // Add to results to get returned to the Client. If null, cilent does not want results.<a name="line.8126"></a>
+<span class="sourceLineNo">8127</span>      if (results != null) {<a name="line.8127"></a>
+<span class="sourceLineNo">8128</span>        results.add(newCell);<a name="line.8128"></a>
+<span class="sourceLineNo">8129</span>      }<a name="line.8129"></a>
+<span class="sourceLineNo">8130</span>    }<a name="line.8130"></a>
+<span class="sourceLineNo">8131</span><a name="line.8131"></a>
+<span class="sourceLineNo">8132</span>    // Give coprocessors a chance to update the new cells before apply to WAL or memstore<a name="line.8132"></a>
+<span class="sourceLineNo">8133</span>    if (coprocessorHost != null) {<a name="line.8133"></a>
+<span class="sourceLineNo">8134</span>      // Here the operation must be increment or append.<a name="line.8134"></a>
+<span class="sourceLineNo">8135</span>      cellPairs = op == Operation.INCREMENT ?<a name="line.8135"></a>
+<span class="sourceLineNo">8136</span>          coprocessorHost.postIncrementBeforeWAL(mutation, cellPairs) :<a name="line.8136"></a>
+<span class="sourceLineNo">8137</span>          coprocessorHost.postAppendBeforeWAL(mutation, cellPairs);<a name="line.8137"></a>
+<span class="sourceLineNo">8138</span>    }<a name="line.8138"></a>
+<span class="sourceLineNo">8139</span>    return cellPairs.stream().map(Pair::getSecond).collect(Collectors.toList());<a name="line.8139"></a>
+<span class="sourceLineNo">8140</span>  }<a name="line.8140"></a>
+<span class="sourceLineNo">8141</span><a name="line.8141"></a>
+<span class="sourceLineNo">8142</span>  private static Cell reckonDelta(final Cell delta, final Cell currentCell,<a name="line.8142"></a>
+<span class="sourceLineNo">8143</span>                                  final byte[] columnFamily, final long now,<a name="line.8143"></a>
+<span class="sourceLineNo">8144</span>                                  Mutation mutation, Function&lt;Cell, byte[]&gt; supplier) throws IOException {<a name="line.8144"></a>
+<span class="sourceLineNo">8145</span>    // Forward any tags found on the delta.<a name="line.8145"></a>
+<span class="sourceLineNo">8146</span>    List&lt;Tag&gt; tags = TagUtil.carryForwardTags(delta);<a name="line.8146"></a>
+<span class="sourceLineNo">8147</span>    tags = TagUtil.carryForwardTTLTag(tags, mutation.getTTL());<a name="line.8147"></a>
+<span class="sourceLineNo">8148</span>    if (currentCell != null) {<a name="line.8148"></a>
+<span class="sourceLineNo">8149</span>      tags = TagUtil.carryForwardTags(tags, currentCell);<a name="line.8149"></a>
+<span class="sourceLineNo">8150</span>      byte[] newValue = supplier.apply(currentCell);<a name="line.8150"></a>
+<span class="sourceLineNo">8151</span>      return ExtendedCellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.8151"></a>
+<span class="sourceLineNo">8152</span>              .setRow(mutation.getRow(), 0, mutation.getRow().length)<a name="line.8152"></a>
+<span class="sourceLineNo">8153</span>              .setFamily(columnFamily, 0, columnFamily.length)<a name="line.8153"></a>
+<span class="sourceLineNo">8154</span>              // copy the qualifier if the cell is located in shared memory.<a name="line.8154"></a>
+<span class="sourceLineNo">8155</span>              .setQualifier(CellUtil.cloneQualifier(delta))<a name="line.8155"></a>
+<span class="sourceLineNo">8156</span>              .setTimestamp(Math.max(currentCell.getTimestamp() + 1, now))<a name="line.8156"></a>
+<span class="sourceLineNo">8157</span>              .setType(KeyValue.Type.Put.getCode())<a name="line.8157"></a>
+<span class="sourceLineNo">8158</span>              .setValue(newValue, 0, newValue.length)<a name="line.8158"></a>
+<span class="sourceLineNo">8159</span>              .setTags(TagUtil.fromList(tags))<a name="line.8159"></a>
+<span class="sourceLineNo">8160</span>              .build();<a name="line.8160"></a>
+<span class="sourceLineNo">8161</span>    } else {<a name="line.8161"></a>
+<span class="sourceLineNo">8162</span>      PrivateCellUtil.updateLatestStamp(delta, now);<a name="line.8162"></a>
+<span class="sourceLineNo">8163</span>      return CollectionUtils.isEmpty(tags) ? delta : PrivateCellUtil.createCell(delta, tags);<a name="line.8163"></a>
+<span class="sourceLineNo">8164</span>    }<a name="line.8164"></a>
+<span class="sourceLineNo">8165</span>  }<a name="line.8165"></a>
+<span class="sourceLineNo">8166</span><a name="line.8166"></a>
+<span class="sourceLineNo">8167</span>  /**<a name="line.8167"></a>
+<span class="sourceLineNo">8168</span>   * @return Get the long out of the passed in Cell<a name="line.8168"></a>
+<span class="sourceLineNo">8169</span>   */<a name="line.8169"></a>
+<span class="sourceLineNo">8170</span>  private static long getLongValue(final Cell cell) throws DoNotRetryIOException {<a name="line.8170"></a>
+<span class="sourceLineNo">8171</span>    int len = cell.getValueLength();<a name="line.8171"></a>
+<span class="sourceLineNo">8172</span>    if (len != Bytes.SIZEOF_LONG) {<a name="line.8172"></a>
+<span class="sourceLineNo">8173</span>      // throw DoNotRetryIOException instead of IllegalArgumentException<a name="line.8173"></a>
+<span class="sourceLineNo">8174</span>      throw new DoNotRetryIOException("Field is not a long, it's " + len + " bytes wide");<a name="line.8174"></a>
+<span class="sourceLineNo">8175</span>    }<a name="line.8175"></a>
+<span class="sourceLineNo">8176</span>    return PrivateCellUtil.getValueAsLong(cell);<a name="line.8176"></a>
+<span class="sourceLineNo">8177</span>  }<a name="line.8177"></a>
+<span class="sourceLineNo">8178</span><a name="line.8178"></a>
+<span class="sourceLineNo">8179</span>  /**<a name="line.8179"></a>
+<span class="sourceLineNo">8180</span>   * Do a specific Get on passed &lt;code&gt;columnFamily&lt;/code&gt; and column qualifiers.<a name="line.8180"></a>
+<span class="sourceLineNo">8181</span>   * @param mutation Mutation we are doing this Get for.<a name="line.8181"></a>
+<span class="sourceLineNo">8182</span>   * @param store Which column family on row (TODO: Go all Gets in one go)<a name="line.8182"></a>
+<span class="sourceLineNo">8183</span>   * @param coordinates Cells from &lt;code&gt;mutation&lt;/code&gt; used as coordinates applied to Get.<a name="line.8183"></a>
+<span class="sourceLineNo">8184</span>   * @return Return list of Cells found.<a name="line.8184"></a>
+<span class="sourceLineNo">8185</span>   */<a name="line.8185"></a>
+<span class="sourceLineNo">8186</span>  private List&lt;Cell&gt; get(Mutation mutation, HStore store, List&lt;Cell&gt; coordinates,<a name="line.8186"></a>
+<span class="sourceLineNo">8187</span>      IsolationLevel isolation, TimeRange tr) throws IOException {<a name="line.8187"></a>
+<span class="sourceLineNo">8188</span>    // Sort the cells so that they match the order that they appear in the Get results. Otherwise,<a name="line.8188"></a>
+<span class="sourceLineNo">8189</span>    // we won't be able to find the existing values if the cells are not specified in order by the<a name="line.8189"></a>
+<span class="sourceLineNo">8190</span>    // client since cells are in an array list.<a name="line.8190"></a>
+<span class="sourceLineNo">8191</span>    // TODO: I don't get why we are sorting. St.Ack 20150107<a name="line.8191"></a>
+<span class="sourceLineNo">8192</span>    sort(coordinates, store.getComparator());<a name="line.8192"></a>
+<span class="sourceLineNo">8193</span>    Get get = new Get(mutation.getRow());<a name="line.8193"></a>
+<span class="sourceLineNo">8194</span>    if (isolation != null) {<a name="line.8194"></a>
+<span class="sourceLineNo">8195</span>      get.setIsolationLevel(isolation);<a name="line.8195"></a>
+<span class="sourceLineNo">8196</span>    }<a name="line.8196"></a>
+<span class="sourceLineNo">8197</span>    for (Cell cell: coordinates) {<a name="line.8197"></a>
+<span class="sourceLineNo">8198</span>      get.addColumn(store.getColumnFamilyDescriptor().getName(), CellUtil.cloneQualifier(cell));<a name="line.8198"></a>
+<span class="sourceLineNo">8199</span>    }<a name="line.8199"></a>
+<span class="sourceLineNo">8200</span>    // Increments carry time range. If an Increment instance, put it on the Get.<a name="line.8200"></a>
+<span class="sourceLineNo">8201</span>    if (tr != null) {<a name="line.8201"></a>
+<span class="sourceLineNo">8202</span>      get.setTimeRange(tr.getMin(), tr.getMax());<a name="line.8202"></a>
+<span class="sourceLineNo">8203</span>    }<a name="line.8203"></a>
+<span class="sourceLineNo">8204</span>    return get(get, false);<a name="line.8204"></a>
+<span class="sourceLineNo">8205</span>  }<a name="line.8205"></a>
+<span class="sourceLineNo">8206</span><a name="line.8206"></a>
+<span class="sourceLineNo">8207</span>  /**<a name="line.8207"></a>
+<span class="sourceLineNo">8208</span>   * @return Sorted list of &lt;code&gt;cells&lt;/code&gt; using &lt;code&gt;comparator&lt;/code&gt;<a name="line.8208"></a>
+<span class="sourceLineNo">8209</span>   */<a name="line.8209"></a>
+<span class="sourceLineNo">8210</span>  private static List&lt;Cell&gt; sort(List&lt;Cell&gt; cells, final CellComparator comparator) {<a name="line.8210"></a>
+<span class="sourceLineNo">8211</span>    cells.sort(comparator);<a name="line.8211"></a>
+<span class="sourceLineNo">8212</span>    return cells;<a name="line.8212"></a>
+<span class="sourceLineNo">8213</span>  }<a name="line.8213"></a>
+<span class="sourceLineNo">8214</span><a name="line.8214"></a>
+<span class="sourceLineNo">8215</span>  public static final long FIXED_OVERHEAD = ClassSize.align(<a name="line.8215"></a>
+<span class="sourceLineNo">8216</span>      ClassSize.OBJECT +<a name="line.8216"></a>
+<span class="sourceLineNo">8217</span>      ClassSize.ARRAY +<a name="line.8217"></a>
+<span class="sourceLineNo">8218</span>      55 * ClassSize.REFERENCE + 3 * Bytes.SIZEOF_INT +<a name="line.8218"></a>
+<span class="sourceLineNo">8219</span>      (15 * Bytes.SIZEOF_LONG) +<a name="line.8219"></a>
+<span class="sourceLineNo">8220</span>      3 * Bytes.SIZEOF_BOOLEAN);<a name="line.8220"></a>
+<span class="sourceLineNo">8221</span><a name="line.8221"></a>
+<span class="sourceLineNo">8222</span>  // woefully out of date - currently missing:<a name="line.8222"></a>
+<span class="sourceLineNo">8223</span>  // 1 x HashMap - coprocessorServiceHandlers<a name="line.8223"></a>
+<span class="sourceLineNo">8224</span>  // 6 x LongAdder - numMutationsWithoutWAL, dataInMemoryWithoutWAL,<a name="line.8224"></a>
+<span class="sourceLineNo">8225</span>  //   checkAndMutateChecksPassed, checkAndMutateChecksFailed, readRequestsCount,<a name="line.8225"></a>
+<span class="sourceLineNo">8226</span>  //   writeRequestsCount, cpRequestsCount<a name="line.8226"></a>
+<span class="sourceLineNo">8227</span>  // 1 x HRegion$WriteState - writestate<a name="line.8227"></a>
+<span class="sourceLineNo">8228</span>  // 1 x RegionCoprocessorHost - coprocessorHost<a name="line.8228"></a>
+<span class="sourceLineNo">8229</span>  // 1 x RegionSplitPolicy - splitPolicy<a name="line.8229"></a>
+<span class="sourceLineNo">8230</span>  // 1 x MetricsRegion - metricsRegion<a name="line.8230"></a>
+<span class="sourceLineNo">8231</span>  // 1 x MetricsRegionWrapperImpl - metricsRegionWrapper<a name="line.8231"></a>
+<span class="sourceLineNo">8232</span>  public static final long DEEP_OVERHEAD = FIXED_OVERHEAD +<a name="line.8232"></a>
+<span class="sourceLineNo">8233</span>      ClassSize.OBJECT + // closeLock<a name="line.8233"></a>
+<span class="sourceLineNo">8234</span>      (2 * ClassSize.ATOMIC_BOOLEAN) + // closed, closing<a name="line.8234"></a>
+<span class="sourceLineNo">8235</span>      (3 * ClassSize.ATOMIC_LONG) + // numPutsWithoutWAL, dataInMemoryWithoutWAL,<a name="line.8235"></a>
+<span class="sourceLineNo">8236</span>                                    // compactionsFailed<a name="line.8236"></a>
+<span class="sourceLineNo">8237</span>      (2 * ClassSize.CONCURRENT_HASHMAP) +  // lockedRows, scannerReadPoints<a name="line.8237"></a>
+<span class="sourceLineNo">8238</span>      WriteState.HEAP_SIZE + // writestate<a name="line.8238"></a>
+<span class="sourceLineNo">8239</span>      ClassSize.CONCURRENT_SKIPLISTMAP + ClassSize.CONCURRENT_SKIPLISTMAP_ENTRY + // stores<a name="line.8239"></a>
+<span class="sourceLineNo">8240</span>      (2 * ClassSize.REENTRANT_LOCK) + // lock, updatesLock<a name="line.8240"></a>
+<span class="sourceLineNo">8241</span>      MultiVersionConcurrencyControl.FIXED_SIZE // mvcc<a name="line.8241"></a>
+<span class="sourceLineNo">8242</span>      + 2 * ClassSize.TREEMAP // maxSeqIdInStores, replicationScopes<a name="line.8242"></a>
+<span class="sourceLineNo">8243</span>      + 2 * ClassSize.ATOMIC_INTEGER // majorInProgress, minorInProgress<a name="line.8243"></a>
+<span class="sourceLineNo">8244</span>      + ClassSize.STORE_SERVICES // store services<a name="line.8244"></a>
+<span class="sourceLineNo">8245</span>      + StoreHotnessProtector.FIXED_SIZE<a name="line.8245"></a>
+<span class="sourceLineNo">8246</span>      ;<a name="line.8246"></a>
+<span class="sourceLineNo">8247</span><a name="line.8247"></a>
+<span class="sourceLineNo">8248</span>  @Override<a name="line.8248"></a>
+<span class="sourceLineNo">8249</span>  public long heapSize() {<a name="line.8249"></a>
+<span class="sourceLineNo">8250</span>    // this does not take into account row locks, recent flushes, mvcc entries, and more<a name="line.8250"></a>
+<span class="sourceLineNo">8251</span>    return DEEP_OVERHEAD + stores.values().stream().mapToLong(HStore::heapSize).sum();<a name="line.8251"></a>
+<span class="sourceLineNo">8252</span>  }<a name="line.8252"></a>
+<span class="sourceLineNo">8253</span><a name="line.8253"></a>
+<span class="sourceLineNo">8254</span>  /**<a name="line.8254"></a>
+<span class="sourceLineNo">8255</span>   * Registers a new protocol buffer {@link Service} subclass as a coprocessor endpoint to<a name="line.8255"></a>
+<span class="sourceLineNo">8256</span>   * be available for handling Region#execService(com.google.protobuf.RpcController,<a name="line.8256"></a>
+<span class="sourceLineNo">8257</span>   *    org.apache.hadoop.hbase.protobuf.generated.ClientProtos.CoprocessorServiceCall) calls.<a name="line.8257"></a>
+<span class="sourceLineNo">8258</span>   *<a name="line.8258"></a>
+<span class="sourceLineNo">8259</span>   * &lt;p&gt;<a name="line.8259"></a>
+<span class="sourceLineNo">8260</span>   * Only a single instance may be registered per region for a given {@link Service} subclass (the<a name="line.8260"></a>
+<span class="sourceLineNo">8261</span>   * instances are keyed on {@link com.google.protobuf.Descriptors.ServiceDescriptor#getFullName()}.<a name="line.8261"></a>
+<span class="sourceLineNo">8262</span>   * After the first registration, subsequent calls with the same service name will fail with<a name="line.8262"></a>
+<span class="sourceLineNo">8263</span>   * a return value of {@code false}.<a name="line.8263"></a>
+<span class="sourceLineNo">8264</span>   * &lt;/p&gt;<a name="line.8264"></a>
+<span class="sourceLineNo">8265</span>   * @param instance the {@code Service} subclass instance to expose as a coprocessor endpoint<a name="line.8265"></a>
+<span class="sourceLineNo">8266</span>   * @return {@code true} if the registration was successful, {@code false}<a name="line.8266"></a>
+<span class="sourceLineNo">8267</span>   * otherwise<a name="line.8267"></a>
+<span class="sourceLineNo">8268</span>   */<a name="line.8268"></a>
+<span class="sourceLineNo">8269</span>  public boolean registerService(com.google.protobuf.Service instance) {<a name="line.8269"></a>
+<span class="sourceLineNo">8270</span>    /*<a name="line.8270"></a>
+<span class="sourceLineNo">8271</span>     * No stacking of instances is allowed for a single service name<a name="line.8271"></a>
+<span class="sourceLineNo">8272</span>     */<a name="line.8272"></a>
+<span class="sourceLineNo">8273</span>    com.google.protobuf.Descriptors.ServiceDescriptor serviceDesc = instance.getDescriptorForType();<a name="line.8273"></a>
+<span class="sourceLineNo">8274</span>    String serviceName = CoprocessorRpcUtils.getServiceName(serviceDesc);<a name="line.8274"></a>
+<span class="sourceLineNo">8275</span>    if (coprocessorServiceHandlers.containsKey(serviceName)) {<a name="line.8275"></a>
+<span class="sourceLineNo">8276</span>      LOG.error("Coprocessor service " + serviceName +<a name="line.8276"></a>
+<span class="sourceLineNo">8277</span>          " already registered, rejecting request from " + instance);<a name="line.8277"></a>
+<span class="sourceLineNo">8278</span>      return false;<a name="line.8278"></a>
+<span class="sourceLineNo">8279</span>    }<a name="line.8279"></a>
+<span class="sourceLineNo">8280</span><a name="line.8280"></a>
+<span class="sourceLineNo">8281</span>    coprocessorServiceHandlers.put(serviceName, instance);<a name="line.8281"></a>
+<span class="sourceLineNo">8282</span>    if (LOG.isDebugEnabled()) {<a name="line.8282"></a>
+<span class="sourceLineNo">8283</span>      LOG.debug("Registered coprocessor service: region=" +<a name="line.8283"></a>
+<span class="sourceLineNo">8284</span>          Bytes.toStringBinary(getRegionInfo().getRegionName()) +<a name="line.8284"></a>
+<span class="sourceLineNo">8285</span>          " service=" + serviceName);<a name="line.8285"></a>
+<span class="sourceLineNo">8286</span>    }<a name="line.8286"></a>
+<span class="sourceLineNo">8287</span>    return true;<a name="line.8287"></a>
+<span class="sourceLineNo">8288</span>  }<a name="line.8288"></a>
+<span class="sourceLineNo">8289</span><a name="line.8289"></a>
+<span class="sourceLineNo">8290</span>  /**<a name="line.8290"></a>
+<span class="sourceLineNo">8291</span>   * Executes a single protocol buffer coprocessor endpoint {@link Service} method using<a name="line.8291"></a>
+<span class="sourceLineNo">8292</span>   * the registered protocol handlers.  {@link Service} implementations must be registered via the<a name="line.8292"></a>
+<span class="sourceLineNo">8293</span>   * {@link #registerService(com.google.protobuf.Service)}<a name="line.8293"></a>
+<span class="sourceLineNo">8294</span>   * method before they are available.<a name="line.8294"></a>
+<span class="sourceLineNo">8295</span>   *<a name="line.8295"></a>
+<span class="sourceLineNo">8296</span>   * @param controller an {@code RpcContoller} implementation to pass to the invoked service<a name="line.8296"></a>
+<span class="sourceLineNo">8297</span>   * @param call a {@code CoprocessorServiceCall} instance identifying the service, method,<a name="line.8297"></a>
+<span class="sourceLineNo">8298</span>   *     and parameters for the method invocation<a name="line.8298"></a>
+<span class="sourceLineNo">8299</span>   * @return a protocol buffer {@code Message} instance containing the method's result<a name="line.8299"></a>
+<span class="sourceLineNo">8300</span>   * @throws IOException if no registered service handler is found or an error<a name="line.8300"></a>
+<span class="sourceLineNo">8301</span>   *     occurs during the invocation<a name="line.8301"></a>
+<span class="sourceLineNo">8302</span>   * @see #registerService(com.google.protobuf.Service)<a name="line.8302"></a>
+<span class="sourceLineNo">8303</span>   */<a name="line.8303"></a>
+<span class="sourceLineNo">8304</span>  public com.google.protobuf.Message execService(com.google.protobuf.RpcController controller,<a name="line.8304"></a>
+<span class="sourceLineNo">8305</span>      CoprocessorServiceCall call) throws IOException {<a name="line.8305"></a>
+<span class="sourceLineNo">8306</span>    String serviceName = call.getServiceName();<a name="line.8306"></a>
+<span class="sourceLineNo">8307</span>    com.google.protobuf.Service service = coprocessorServiceHandlers.get(serviceName);<a name="line.8307"></a>
+<span class="sourceLineNo">8308</span>    if (service == null) {<a name="line.8308"></a>
+<span class="sourceLineNo">8309</span>      throw new UnknownProtocolException(null, "No registered coprocessor service found for " +<a name="line.8309"></a>
+<span class="sourceLineNo">8310</span>          serviceName + " in region " + Bytes.toStringBinary(getRegionInfo().getRegionName()));<a name="line.8310"></a>
+<span class="sourceLineNo">8311</span>    }<a name="line.8311"></a>
+<span class="sourceLineNo">8312</span>    com.google.protobuf.Descriptors.ServiceDescriptor serviceDesc = service.getDescriptorForType();<a name="line.8312"></a>
 <span class="sourceLineNo">8313</span><a name="line.8313"></a>
-<span class="sourceLineNo">8314</span>    com.google.protobuf.Message.Builder builder =<a name="line.8314"></a>
-<span class="sourceLineNo">8315</span>        service.getRequestPrototype(methodDesc).newBuilderForType();<a name="line.8315"></a>
-<span class="sourceLineNo">8316</span><a name="line.8316"></a>
-<span class="sourceLineNo">8317</span>    org.apache.hadoop.hbase.protobuf.ProtobufUtil.mergeFrom(builder,<a name="line.8317"></a>
-<span class="sourceLineNo">8318</span>        call.getRequest().toByteArray());<a name="line.8318"></a>
-<span class="sourceLineNo">8319</span>    com.google.protobuf.Message request =<a name="line.8319"></a>
-<span class="sourceLineNo">8320</span>        CoprocessorRpcUtils.getRequest(service, methodDesc, call.getRequest());<a name="line.8320"></a>
+<span class="sourceLineNo">8314</span>    cpRequestsCount.increment();<a name="line.8314"></a>
+<span class="sourceLineNo">8315</span>    String methodName = call.getMethodName();<a name="line.8315"></a>
+<span class="sourceLineNo">8316</span>    com.google.protobuf.Descriptors.MethodDescriptor methodDesc =<a name="line.8316"></a>
+<span class="sourceLineNo">8317</span>        CoprocessorRpcUtils.getMethodDescriptor(methodName, serviceDesc);<a name="line.8317"></a>
+<span class="sourceLineNo">8318</span><a name="line.8318"></a>
+<span class="sourceLineNo">8319</span>    com.google.protobuf.Message.Builder builder =<a name="line.8319"></a>
+<span class="sourceLineNo">8320</span>        service.getRequestPrototype(methodDesc).newBuilderForType();<a name="line.8320"></a>
 <span class="sourceLineNo">8321</span><a name="line.8321"></a>
-<span class="sourceLineNo">8322</span>    if (coprocessorHost != null) {<a name="line.8322"></a>
-<span class="sourceLineNo">8323</span>      request = coprocessorHost.preEndpointInvocation(service, methodName, request);<a name="line.8323"></a>
-<span class="sourceLineNo">8324</span>    }<a name="line.8324"></a>
-<span class="sourceLineNo">8325</span><a name="line.8325"></a>
-<span class="sourceLineNo">8326</span>    final com.google.protobuf.Message.Builder responseBuilder =<a name="line.8326"></a>
-<span class="sourceLineNo">8327</span>        service.getResponsePrototype(methodDesc).newBuilderForType();<a name="line.8327"></a>
-<span class="sourceLineNo">8328</span>    service.callMethod(methodDesc, controller, request,<a name="line.8328"></a>
-<span class="sourceLineNo">8329</span>        new com.google.protobuf.RpcCallback&lt;com.google.protobuf.Message&gt;() {<a name="line.8329"></a>
-<span class="sourceLineNo">8330</span>      @Override<a name="line.8330"></a>
-<span class="sourceLineNo">8331</span>      public void run(com.google.protobuf.Message message) {<a name="line.8331"></a>
-<span class="sourceLineNo">8332</span>        if (message != null) {<a name="line.8332"></a>
-<span class="sourceLineNo">8333</span>          responseBuilder.mergeFrom(message);<a name="line.8333"></a>
-<span class="sourceLineNo">8334</span>        }<a name="line.8334"></a>
-<span class="sourceLineNo">8335</span>      }<a name="line.8335"></a>
-<span class="sourceLineNo">8336</span>    });<a name="line.8336"></a>
-<span class="sourceLineNo">8337</span><a name="line.8337"></a>
-<span class="sourceLineNo">8338</span>    if (coprocessorHost != null) {<a name="line.8338"></a>
-<span class="sourceLineNo">8339</span>      coprocessorHost.postEndpointInvocation(service, methodName, request, responseBuilder);<a name="line.8339"></a>
-<span class="sourceLineNo">8340</span>    }<a name="line.8340"></a>
-<span class="sourceLineNo">8341</span>    IOException exception =<a name="line.8341"></a>
-<span class="sourceLineNo">8342</span>        org.apache.hadoop.hbase.ipc.CoprocessorRpcUtils.getControllerException(controller);<a name="line.8342"></a>
-<span class="sourceLineNo">8343</span>    if (exception != null) {<a name="line.8343"></a>
-<span class="sourceLineNo">8344</span>      throw exception;<a name="line.8344"></a>
+<span class="sourceLineNo">8322</span>    org.apache.hadoop.hbase.protobuf.ProtobufUtil.mergeFrom(builder,<a name="line.8322"></a>
+<span class="sourceLineNo">8323</span>        call.getRequest().toByteArray());<a name="line.8323"></a>
+<span class="sourceLineNo">8324</span>    com.google.protobuf.Message request =<a name="line.8324"></a>
+<span class="sourceLineNo">8325</span>        CoprocessorRpcUtils.getRequest(service, methodDesc, call.getRequest());<a name="line.8325"></a>
+<span class="sourceLineNo">8326</span><a name="line.8326"></a>
+<span class="sourceLineNo">8327</span>    if (coprocessorHost != null) {<a name="line.8327"></a>
+<span class="sourceLineNo">8328</span>      request = coprocessorHost.preEndpointInvocation(service, methodName, request);<a name="line.8328"></a>
+<span class="sourceLineNo">8329</span>    }<a name="line.8329"></a>
+<span class="sourceLineNo">8330</span><a name="line.8330"></a>
+<span class="sourceLineNo">8331</span>    final com.google.protobuf.Message.Builder responseBuilder =<a name="line.8331"></a>
+<span class="sourceLineNo">8332</span>        service.getResponsePrototype(methodDesc).newBuilderForType();<a name="line.8332"></a>
+<span class="sourceLineNo">8333</span>    service.callMethod(methodDesc, controller, request,<a name="line.8333"></a>
+<span class="sourceLineNo">8334</span>        new com.google.protobuf.RpcCallback&lt;com.google.protobuf.Message&gt;() {<a name="line.8334"></a>
+<span class="sourceLineNo">8335</span>      @Override<a name="line.8335"></a>
+<span class="sourceLineNo">8336</span>      public void run(com.google.protobuf.Message message) {<a name="line.8336"></a>
+<span class="sourceLineNo">8337</span>        if (message != null) {<a name="line.8337"></a>
+<span class="sourceLineNo">8338</span>          responseBuilder.mergeFrom(message);<a name="line.8338"></a>
+<span class="sourceLineNo">8339</span>        }<a name="line.8339"></a>
+<span class="sourceLineNo">8340</span>      }<a name="line.8340"></a>
+<span class="sourceLineNo">8341</span>    });<a name="line.8341"></a>
+<span class="sourceLineNo">8342</span><a name="line.8342"></a>
+<span class="sourceLineNo">8343</span>    if (coprocessorHost != null) {<a name="line.8343"></a>
+<span class="sourceLineNo">8344</span>      coprocessorHost.postEndpointInvocation(service, methodName, request, responseBuilder);<a name="line.8344"></a>
 <span class="sourceLineNo">8345</span>    }<a name="line.8345"></a>
-<span class="sourceLineNo">8346</span><a name="line.8346"></a>
-<span class="sourceLineNo">8347</span>    return responseBuilder.build();<a name="line.8347"></a>
-<span class="sourceLineNo">8348</span>  }<a name="line.8348"></a>
-<span class="sourceLineNo">8349</span><a name="line.8349"></a>
-<span class="sourceLineNo">8350</span>  boolean shouldForceSplit() {<a name="line.8350"></a>
-<span class="sourceLineNo">8351</span>    return this.splitRequest;<a name="line.8351"></a>
-<span class="sourceLineNo">8352</span>  }<a name="line.8352"></a>
-<span class="sourceLineNo">8353</span><a name="line.8353"></a>
-<span class="sourceLineNo">8354</span>  byte[] getExplicitSplitPoint() {<a name="line.8354"></a>
-<span class="sourceLineNo">8355</span>    return this.explicitSplitPoint;<a name="line.8355"></a>
-<span class="sourceLineNo">8356</span>  }<a name="line.8356"></a>
-<span class="sourceLineNo">8357</span><a name="line.8357"></a>
-<span class="sourceLineNo">8358</span>  void forceSplit(byte[] sp) {<a name="line.8358"></a>
-<span class="sourceLineNo">8359</span>    // This HRegion will go away after the forced split is successful<a name="line.8359"></a>
-<span class="sourceLineNo">8360</span>    // But if a forced split fails, we need to clear forced split.<a name="line.8360"></a>
-<span class="sourceLineNo">8361</span>    this.splitRequest = true;<a name="line.8361"></a>
-<span class="sourceLineNo">8362</span>    if (sp != null) {<a name="line.8362"></a>
-<span class="sourceLineNo">8363</span>      this.explicitSplitPoint = sp;<a name="line.8363"></a>
-<span class="sourceLineNo">8364</span>    }<a name="line.8364"></a>
-<span class="sourceLineNo">8365</span>  }<a name="line.8365"></a>
-<span class="sourceLineNo">8366</span><a name="line.8366"></a>
-<span class="sourceLineNo">8367</span>  void clearSplit() {<a name="line.8367"></a>
-<span class="sourceLineNo">8368</span>    this.splitRequest = false;<a name="line.8368"></a>
-<span class="sourceLineNo">8369</span>    this.explicitSplitPoint = null;<a name="line.8369"></a>
+<span class="sourceLineNo">8346</span>    IOException exception =<a name="line.8346"></a>
+<span class="sourceLineNo">8347</span>        org.apache.hadoop.hbase.ipc.CoprocessorRpcUtils.getControllerException(controller);<a name="line.8347"></a>
+<span class="sourceLineNo">8348</span>    if (exception != null) {<a name="line.8348"></a>
+<span class="sourceLineNo">8349</span>      throw exception;<a name="line.8349"></a>
+<span class="sourceLineNo">8350</span>    }<a name="line.8350"></a>
+<span class="sourceLineNo">8351</span><a name="line.8351"></a>
+<span class="sourceLineNo">8352</span>    return responseBuilder.build();<a name="line.8352"></a>
+<span class="sourceLineNo">8353</span>  }<a name="line.8353"></a>
+<span class="sourceLineNo">8354</span><a name="line.8354"></a>
+<span class="sourceLineNo">8355</span>  boolean shouldForceSplit() {<a name="line.8355"></a>
+<span class="sourceLineNo">8356</span>    return this.splitRequest;<a name="line.8356"></a>
+<span class="sourceLineNo">8357</span>  }<a name="line.8357"></a>
+<span class="sourceLineNo">8358</span><a name="line.8358"></a>
+<span class="sourceLineNo">8359</span>  byte[] getExplicitSplitPoint() {<a name="line.8359"></a>
+<span class="sourceLineNo">8360</span>    return this.explicitSplitPoint;<a name="line.8360"></a>
+<span class="sourceLineNo">8361</span>  }<a name="line.8361"></a>
+<span class="sourceLineNo">8362</span><a name="line.8362"></a>
+<span class="sourceLineNo">8363</span>  void forceSplit(byte[] sp) {<a name="line.8363"></a>
+<span class="sourceLineNo">8364</span>    // This HRegion will go away after the forced split is successful<a name="line.8364"></a>
+<span class="sourceLineNo">8365</span>    // But if a forced split fails, we need to clear forced split.<a name="line.8365"></a>
+<span class="sourceLineNo">8366</span>    this.splitRequest = true;<a name="line.8366"></a>
+<span class="sourceLineNo">8367</span>    if (sp != null) {<a name="line.8367"></a>
+<span class="sourceLineNo">8368</span>      this.explicitSplitPoint = sp;<a name="line.8368"></a>
+<span class="sourceLineNo">8369</span>    }<a name="line.8369"></a>
 <span class="sourceLineNo">8370</span>  }<a name="line.8370"></a>
 <span class="sourceLineNo">8371</span><a name="line.8371"></a>
-<span class="sourceLineNo">8372</span>  /**<a name="line.8372"></a>
-<span class="sourceLineNo">8373</span>   * Return the splitpoint. null indicates the region isn't splittable<a name="line.8373"></a>
-<span class="sourceLineNo">8374</span>   * If the splitpoint isn't explicitly specified, it will go over the stores<a name="line.8374"></a>
-<span class="sourceLineNo">8375</span>   * to find the best splitpoint. Currently the criteria of best splitpoint<a name="line.8375"></a>
-<span class="sourceLineNo">8376</span>   * is based on the size of the store.<a name="line.8376"></a>
-<span class="sourceLineNo">8377</span>   */<a name="line.8377"></a>
-<span class="sourceLineNo">8378</span>  public byte[] checkSplit() {<a name="line.8378"></a>
-<span class="sourceLineNo">8379</span>    // Can't split META<a name="line.8379"></a>
-<span class="sourceLineNo">8380</span>    if (this.getRegionInfo().isMetaRegion()) {<a name="line.8380"></a>
-<span class="sourceLineNo">8381</span>      if (shouldForceSplit()) {<a name="line.8381"></a>
-<span class="sourceLineNo">8382</span>        LOG.warn("Cannot split meta region in HBase 0.20 and above");<a name="line.8382"></a>
-<span class="sourceLineNo">8383</span>      }<a name="line.8383"></a>
-<span class="sourceLineNo">8384</span>      return null;<a name="line.8384"></a>
-<span class="sourceLineNo">8385</span>    }<a name="line.8385"></a>
-<span class="sourceLineNo">8386</span><a name="line.8386"></a>
-<span class="sourceLineNo">8387</span>    // Can't split a region that is closing.<a name="line.8387"></a>
-<span class="sourceLineNo">8388</span>    if (this.isClosing()) {<a name="line.8388"></a>
+<span class="sourceLineNo">8372</span>  void clearSplit() {<a name="line.8372"></a>
+<span class="sourceLineNo">8373</span>    this.splitRequest = false;<a name="line.8373"></a>
+<span class="sourceLineNo">8374</span>    this.explicitSplitPoint = null;<a name="line.8374"></a>
+<span class="sourceLineNo">8375</span>  }<a name="line.8375"></a>
+<span class="sourceLineNo">8376</span><a name="line.8376"></a>
+<span class="sourceLineNo">8377</span>  /**<a name="line.8377"></a>
+<span class="sourceLineNo">8378</span>   * Return the splitpoint. null indicates the region isn't splittable<a name="line.8378"></a>
+<span class="sourceLineNo">8379</span>   * If the splitpoint isn't explicitly specified, it will go over the stores<a name="line.8379"></a>
+<span class="sourceLineNo">8380</span>   * to find the best splitpoint. Currently the criteria of best splitpoint<a name="line.8380"></a>
+<span class="sourceLineNo">8381</span>   * is based on the size of the store.<a name="line.8381"></a>
+<span class="sourceLineNo">8382</span>   */<a name="line.8382"></a>
+<span class="sourceLineNo">8383</span>  public byte[] checkSplit() {<a name="line.8383"></a>
+<span class="sourceLineNo">8384</span>    // Can't split META<a name="line.8384"></a>
+<span class="sourceLineNo">8385</span>    if (this.getRegionInfo().isMetaRegion()) {<a name="line.8385"></a>
+<span class="sourceLineNo">8386</span>      if (shouldForceSplit()) {<a name="line.8386"></a>
+<span class="sourceLineNo">8387</span>        LOG.warn("Cannot split meta region in HBase 0.20 and above");<a name="line.8387"></a>
+<span class="sourceLineNo">8388</span>      }<a name="line.8388"></a>
 <span class="sourceLineNo">8389</span>      return null;<a name="line.8389"></a>
 <span class="sourceLineNo">8390</span>    }<a name="line.8390"></a>
 <span class="sourceLineNo">8391</span><a name="line.8391"></a>
-<span class="sourceLineNo">8392</span>    if (!splitPolicy.shouldSplit()) {<a name="line.8392"></a>
-<span class="sourceLineNo">8393</span>      return null;<a name="line.8393"></a>
-<span class="sourceLineNo">8394</span>    }<a name="line.8394"></a>
-<span class="sourceLineNo">8395</span><a name="line.8395"></a>
-<span class="sourceLineNo">8396</span>    byte[] ret = splitPolicy.getSplitPoint();<a name="line.8396"></a>
-<span class="sourceLineNo">8397</span><a name="line.8397"></a>
-<span class="sourceLineNo">8398</span>    if (ret != null) {<a name="line.8398"></a>
-<span class="sourceLineNo">8399</span>      try {<a name="line.8399"></a>
-<span class="sourceLineNo">8400</span>        checkRow(ret, "calculated split");<a name="line.8400"></a>
-<span class="sourceLineNo">8401</span>      } catch (IOException e) {<a name="line.8401"></a>
-<span class="sourceLineNo">8402</span>        LOG.error("Ignoring invalid split", e);<a name="line.8402"></a>
-<span class="sourceLineNo">8403</span>        return null;<a name="line.8403"></a>
-<span class="sourceLineNo">8404</span>      }<a name="line.8404"></a>
-<span class="sourceLineNo">8405</span>    }<a name="line.8405"></a>
-<span class="sourceLineNo">8406</span>    return ret;<a name="line.8406"></a>
-<span class="sourceLineNo">8407</span>  }<a name="line.8407"></a>
-<span class="sourceLineNo">8408</span><a name="line.8408"></a>
-<span class="sourceLineNo">8409</span>  /**<a name="line.8409"></a>
-<span class="sourceLineNo">8410</span>   * @return The priority that this region should have in the compaction queue<a name="line.8410"></a>
-<span class="sourceLineNo">8411</span>   */<a name="line.8411"></a>
-<span class="sourceLineNo">8412</span>  public int getCompactPriority() {<a name="line.8412"></a>
-<span class="sourceLineNo">8413</span>    return stores.values().stream().mapToInt(HStore::getCompactPriority).min()<a name="line.8413"></a>
-<span class="sourceLineNo">8414</span>        .orElse(Store.NO_PRIORITY);<a name="line.8414"></a>
-<span class="sourceLineNo">8415</span>  }<a name="line.8415"></a>
-<span class="sourceLineNo">8416</span><a name="line.8416"></a>
-<span class="sourceLineNo">8417</span>  /** @return the coprocessor host */<a name="line.8417"></a>
-<span class="sourceLineNo">8418</span>  public RegionCoprocessorHost getCoprocessorHost() {<a name="line.8418"></a>
-<span class="sourceLineNo">8419</span>    return coprocessorHost;<a name="line.8419"></a>
+<span class="sourceLineNo">8392</span>    // Can't split a region that is closing.<a name="line.8392"></a>
+<span class="sourceLineNo">8393</span>    if (this.isClosing()) {<a name="line.8393"></a>
+<span class="sourceLineNo">8394</span>      return null;<a name="line.8394"></a>
+<span class="sourceLineNo">8395</span>    }<a name="line.8395"></a>
+<span class="sourceLineNo">8396</span><a name="line.8396"></a>
+<span class="sourceLineNo">8397</span>    if (!splitPolicy.shouldSplit()) {<a name="line.8397"></a>
+<span class="sourceLineNo">8398</span>      return null;<a name="line.8398"></a>
+<span class="sourceLineNo">8399</span>    }<a name="line.8399"></a>
+<span class="sourceLineNo">8400</span><a name="line.8400"></a>
+<span class="sourceLineNo">8401</span>    byte[] ret = splitPolicy.getSplitPoint();<a name="line.8401"></a>
+<span class="sourceLineNo">8402</span><a name="line.8402"></a>
+<span class="sourceLineNo">8403</span>    if (ret != null) {<a name="line.8403"></a>
+<span class="sourceLineNo">8404</span>      try {<a name="line.8404"></a>
+<span class="sourceLineNo">8405</span>        checkRow(ret, "calculated split");<a name="line.8405"></a>
+<span class="sourceLineNo">8406</span>      } catch (IOException e) {<a name="line.8406"></a>
+<span class="sourceLineNo">8407</span>        LOG.error("Ignoring invalid split", e);<a name="line.8407"></a>
+<span class="sourceLineNo">8408</span>        return null;<a name="line.8408"></a>
+<span class="sourceLineNo">8409</span>      }<a name="line.8409"></a>
+<span class="sourceLineNo">8410</span>    }<a name="line.8410"></a>
+<span class="sourceLineNo">8411</span>    return ret;<a name="line.8411"></a>
+<span class="sourceLineNo">8412</span>  }<a name="line.8412"></a>
+<span class="sourceLineNo">8413</span><a name="line.8413"></a>
+<span class="sourceLineNo">8414</span>  /**<a name="line.8414"></a>
+<span class="sourceLineNo">8415</span>   * @return The priority that this region should have in the compaction queue<a name="line.8415"></a>
+<span class="sourceLineNo">8416</span>   */<a name="line.8416"></a>
+<span class="sourceLineNo">8417</span>  public int getCompactPriority() {<a name="line.8417"></a>
+<span class="sourceLineNo">8418</span>    return stores.values().stream().mapToInt(HStore::getCompactPriority).min()<a name="line.8418"></a>
+<span class="sourceLineNo">8419</span>        .orElse(Store.NO_PRIORITY);<a name="line.8419"></a>
 <span class="sourceLineNo">8420</span>  }<a name="line.8420"></a>
 <span class="sourceLineNo">8421</span><a name="line.8421"></a>
-<span class="sourceLineNo">8422</span>  /** @param coprocessorHost the new coprocessor host */<a name="line.8422"></a>
-<span class="sourceLineNo">8423</span>  @VisibleForTesting<a name="line.8423"></a>
-<span class="sourceLineNo">8424</span>  public void setCoprocessorHost(final RegionCoprocessorHost coprocessorHost) {<a name="line.8424"></a>
-<span class="sourceLineNo">8425</span>    this.coprocessorHost = coprocessorHost;<a name="line.8425"></a>
-<span class="sourceLineNo">8426</span>  }<a name="line.8426"></a>
-<span class="sourceLineNo">8427</span><a name="line.8427"></a>
-<span class="sourceLineNo">8428</span>  @Override<a name="line.8428"></a>
-<span class="sourceLineNo">8429</span>  public void startRegionOperation() throws IOException {<a name="line.8429"></a>
-<span class="sourceLineNo">8430</span>    startRegionOperation(Operation.ANY);<a name="line.8430"></a>
+<span class="sourceLineNo">8422</span>  /** @return the coprocessor host */<a name="line.8422"></a>
+<span class="sourceLineNo">8423</span>  public RegionCoprocessorHost getCoprocessorHost() {<a name="line.8423"></a>
+<span class="sourceLineNo">8424</span>    return coprocessorHost;<a name="line.8424"></a>
+<span class="sourceLineNo">8425</span>  }<a name="line.8425"></a>
+<span class="sourceLineNo">8426</span><a name="line.8426"></a>
+<span class="sourceLineNo">8427</span>  /** @param coprocessorHost the new coprocessor host */<a name="line.8427"></a>
+<span class="sourceLineNo">8428</span>  @VisibleForTesting<a name="line.8428"></a>
+<span class="sourceLineNo">8429</span>  public void setCoprocessorHost(final RegionCoprocessorHost coprocessorHost) {<a name="line.8429"></a>
+<span class="sourceLineNo">8430</span>    this.coprocessorHost = coprocessorHost;<a name="line.8430"></a>
 <span class="sourceLineNo">8431</span>  }<a name="line.8431"></a>
 <span class="sourceLineNo">8432</span><a name="line.8432"></a>
 <span class="sourceLineNo">8433</span>  @Override<a name="line.8433"></a>
-<span class="sourceLineNo">8434</span>  public void startRegionOperation(Operation op) throws IOException {<a name="line.8434"></a>
-<span class="sourceLineNo">8435</span>    switch (op) {<a name="line.8435"></a>
-<span class="sourceLineNo">8436</span>      case GET:  // read operations<a name="line.8436"></a>
-<span class="sourceLineNo">8437</span>      case SCAN:<a name="line.8437"></a>
-<span class="sourceLineNo">8438</span>        checkReadsEnabled();<a name="line.8438"></a>
-<span class="sourceLineNo">8439</span>        break;<a name="line.8439"></a>
-<span class="sourceLineNo">8440</span>      default:<a name="line.8440"></a>
-<span class="sourceLineNo">8441</span>        break;<a name="line.8441"></a>
-<span class="sourceLineNo">8442</span>    }<a name="line.8442"></a>
-<span class="sourceLineNo">8443</span>    if (op == Operation.MERGE_REGION || op == Operation.SPLIT_REGION<a name="line.8443"></a>
-<span class="sourceLineNo">8444</span>        || op == Operation.COMPACT_REGION || op == Operation.COMPACT_SWITCH) {<a name="line.8444"></a>
-<span class="sourceLineNo">8445</span>      // split, merge or compact region doesn't need to check the closing/closed state or lock the<a name="line.8445"></a>
-<span class="sourceLineNo">8446</span>      // region<a name="line.8446"></a>
-<span class="sourceLineNo">8447</span>      return;<a name="line.8447"></a>
-<span class="sourceLineNo">8448</span>    }<a name="line.8448"></a>
-<span class="sourceLineNo">8449</span>    if (this.closing.get()) {<a name="line.8449"></a>
-<span class="sourceLineNo">8450</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closing");<a name="line.8450"></a>
-<span class="sourceLineNo">8451</span>    }<a name="line.8451"></a>
-<span class="sourceLineNo">8452</span>    lock(lock.readLock());<a name="line.8452"></a>
-<span class="sourceLineNo">8453</span>    if (this.closed.get()) {<a name="line.8453"></a>
-<span class="sourceLineNo">8454</span>      lock.readLock().unlock();<a name="line.8454"></a>
-<span class="sourceLineNo">8455</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closed");<a name="line.8455"></a>
+<span class="sourceLineNo">8434</span>  public void startRegionOperation() throws IOException {<a name="line.8434"></a>
+<span class="sourceLineNo">8435</span>    startRegionOperation(Operation.ANY);<a name="line.8435"></a>
+<span class="sourceLineNo">8436</span>  }<a name="line.8436"></a>
+<span class="sourceLineNo">8437</span><a name="line.8437"></a>
+<span class="sourceLineNo">8438</span>  @Override<a name="line.8438"></a>
+<span class="sourceLineNo">8439</span>  public void startRegionOperation(Operation op) throws IOException {<a name="line.8439"></a>
+<span class="sourceLineNo">8440</span>    switch (op) {<a name="line.8440"></a>
+<span class="sourceLineNo">8441</span>      case GET:  // read operations<a name="line.8441"></a>
+<span class="sourceLineNo">8442</span>      case SCAN:<a name="line.8442"></a>
+<span class="sourceLineNo">8443</span>        checkReadsEnabled();<a name="line.8443"></a>
+<span class="sourceLineNo">8444</span>        break;<a name="line.8444"></a>
+<span class="sourceLineNo">8445</span>      default:<a name="line.8445"></a>
+<span class="sourceLineNo">8446</span>        break;<a name="line.8446"></a>
+<span class="sourceLineNo">8447</span>    }<a name="line.8447"></a>
+<span class="sourceLineNo">8448</span>    if (op == Operation.MERGE_REGION || op == Operation.SPLIT_REGION<a name="line.8448"></a>
+<span class="sourceLineNo">8449</span>        || op == Operation.COMPACT_REGION || op == Operation.COMPACT_SWITCH) {<a name="line.8449"></a>
+<span class="sourceLineNo">8450</span>      // split, merge or compact region doesn't need to check the closing/closed state or lock the<a name="line.8450"></a>
+<span class="sourceLineNo">8451</span>      // region<a name="line.8451"></a>
+<span class="sourceLineNo">8452</span>      return;<a name="line.8452"></a>
+<span class="sourceLineNo">8453</span>    }<a name="line.8453"></a>
+<span class="sourceLineNo">8454</span>    if (this.closing.get()) {<a name="line.8454"></a>
+<span class="sourceLineNo">8455</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closing");<a name="line.8455"></a>
 <span class="sourceLineNo">8456</span>    }<a name="line.8456"></a>
-<span class="sourceLineNo">8457</span>    // The unit for snapshot is a region. So, all stores for this region must be<a name="line.8457"></a>
-<span class="sourceLineNo">8458</span>    // prepared for snapshot operation before proceeding.<a name="line.8458"></a>
-<span class="sourceLineNo">8459</span>    if (op == Operation.SNAPSHOT) {<a name="line.8459"></a>
-<span class="sourceLineNo">8460</span>      stores.values().forEach(HStore::preSnapshotOperation);<a name="line.8460"></a>
+<span class="sourceLineNo">8457</span>    lock(lock.readLock());<a name="line.8457"></a>
+<span class="sourceLineNo">8458</span>    if (this.closed.get()) {<a name="line.8458"></a>
+<span class="sourceLineNo">8459</span>      lock.readLock().unlock();<a name="line.8459"></a>
+<span class="sourceLineNo">8460</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closed");<a name="line.8460"></a>
 <span class="sourceLineNo">8461</span>    }<a name="line.8461"></a>
-<span class="sourceLineNo">8462</span>    try {<a name="line.8462"></a>
-<span class="sourceLineNo">8463</span>      if (coprocessorHost != null) {<a name="line.8463"></a>
-<span class="sourceLineNo">8464</span>        coprocessorHost.postStartRegionOperation(op);<a name="line.8464"></a>
-<span class="sourceLineNo">8465</span>      }<a name="line.8465"></a>
-<span class="sourceLineNo">8466</span>    } catch (Exception e) {<a name="line.8466"></a>
-<span class="sourceLineNo">8467</span>      lock.readLock().unlock();<a name="line.8467"></a>
-<span class="sourceLineNo">8468</span>      throw new IOException(e);<a name="line.8468"></a>
-<span class="sourceLineNo">8469</span>    }<a name="line.8469"></a>
-<span class="sourceLineNo">8470</span>  }<a name="line.8470"></a>
-<span class="sourceLineNo">8471</span><a name="line.8471"></a>
-<span class="sourceLineNo">8472</span>  @Override<a name="line.8472"></a>
-<span class="sourceLineNo">8473</span>  public void closeRegionOperation() throws IOException {<a name="line.8473"></a>
-<span class="sourceLineNo">8474</span>    closeRegionOperation(Operation.ANY);<a name="line.8474"></a>
+<span class="sourceLineNo">8462</span>    // The unit for snapshot is a region. So, all stores for this region must be<a name="line.8462"></a>
+<span class="sourceLineNo">8463</span>    // prepared for snapshot operation before proceeding.<a name="line.8463"></a>
+<span class="sourceLineNo">8464</span>    if (op == Operation.SNAPSHOT) {<a name="line.8464"></a>
+<span class="sourceLineNo">8465</span>      stores.values().forEach(HStore::preSnapshotOperation);<a name="line.8465"></a>
+<span class="sourceLineNo">8466</span>    }<a name="line.8466"></a>
+<span class="sourceLineNo">8467</span>    try {<a name="line.8467"></a>
+<span class="sourceLineNo">8468</span>      if (coprocessorHost != null) {<a name="line.8468"></a>
+<span class="sourceLineNo">8469</span>        coprocessorHost.postStartRegionOperation(op);<a name="line.8469"></a>
+<span class="sourceLineNo">8470</span>      }<a name="line.8470"></a>
+<span class="sourceLineNo">8471</span>    } catch (Exception e) {<a name="line.8471"></a>
+<span class="sourceLineNo">8472</span>      lock.readLock().unlock();<a name="line.8472"></a>
+<span class="sourceLineNo">8473</span>      throw new IOException(e);<a name="line.8473"></a>
+<span class="sourceLineNo">8474</span>    }<a name="line.8474"></a>
 <span class="sourceLineNo">8475</span>  }<a name="line.8475"></a>
 <span class="sourceLineNo">8476</span><a name="line.8476"></a>
 <span class="sourceLineNo">8477</span>  @Override<a name="line.8477"></a>
-<span class="sourceLineNo">8478</span>  public void closeRegionOperation(Operation operation) throws IOException {<a name="line.8478"></a>
-<span class="sourceLineNo">8479</span>    if (operation == Operation.SNAPSHOT) {<a name="line.8479"></a>
-<span class="sourceLineNo">8480</span>      stores.values().forEach(HStore::postSnapshotOperation);<a name="line.8480"></a>
-<span class="sourceLineNo">8481</span>    }<a name="line.8481"></a>
-<span class="sourceLineNo">8482</span>    lock.readLock().unlock();<a name="line.8482"></a>
-<span class="sourceLineNo">8483</span>    if (coprocessorHost != null) {<a name="line.8483"></a>
-<span class="sourceLineNo">8484</span>      coprocessorHost.postCloseRegionOperation(operation);<a name="line.8484"></a>
-<span class="sourceLineNo">8485</span>    }<a name="line.8485"></a>
-<span class="sourceLineNo">8486</span>  }<a name="line.8486"></a>
-<span class="sourceLineNo">8487</span><a name="line.8487"></a>
-<span class="sourceLineNo">8488</span>  /**<a name="line.8488"></a>
-<span class="sourceLineNo">8489</span>   * This method needs to be called before any public call that reads or<a name="line.8489"></a>
-<span class="sourceLineNo">8490</span>   * modifies stores in bulk. It has to be called just before a try.<a name="line.8490"></a>
-<span class="sourceLineNo">8491</span>   * #closeBulkRegionOperation needs to be called in the try's finally block<a name="line.8491"></a>
-<span class="sourceLineNo">8492</span>   * Acquires a writelock and checks if the region is closing or closed.<a name="line.8492"></a>
-<span class="sourceLineNo">8493</span>   * @throws NotServingRegionException when the region is closing or closed<a name="line.8493"></a>
-<span class="sourceLineNo">8494</span>   * @throws RegionTooBusyException if failed to get the lock in time<a name="line.8494"></a>
-<span class="sourceLineNo">8495</span>   * @throws InterruptedIOException if interrupted while waiting for a lock<a name="line.8495"></a>
-<span class="sourceLineNo">8496</span>   */<a name="line.8496"></a>
-<span class="sourceLineNo">8497</span>  private void startBulkRegionOperation(boolean writeLockNeeded)<a name="line.8497"></a>
-<span class="sourceLineNo">8498</span>      throws NotServingRegionException, RegionTooBusyException, InterruptedIOException {<a name="line.8498"></a>
-<span class="sourceLineNo">8499</span>    if (this.closing.get()) {<a name="line.8499"></a>
-<span class="sourceLineNo">8500</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closing");<a name="line.8500"></a>
-<span class="sourceLineNo">8501</span>    }<a name="line.8501"></a>
-<span class="sourceLineNo">8502</span>    if (writeLockNeeded) lock(lock.writeLock());<a name="line.8502"></a>
-<span class="sourceLineNo">8503</span>    else lock(lock.readLock());<a name="line.8503"></a>
-<span class="sourceLineNo">8504</span>    if (this.closed.get()) {<a name="line.8504"></a>
-<span class="sourceLineNo">8505</span>      if (writeLockNeeded) lock.writeLock().unlock();<a name="line.8505"></a>
-<span class="sourceLineNo">8506</span>      else lock.readLock().unlock();<a name="line.8506"></a>
-<span class="sourceLineNo">8507</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closed");<a name="line.8507"></a>
-<span class="sourceLineNo">8508</span>    }<a name="line.8508"></a>
-<span class="sourceLineNo">8509</span>  }<a name="line.8509"></a>
-<span class="sourceLineNo">8510</span><a name="line.8510"></a>
-<span class="sourceLineNo">8511</span>  /**<a name="line.8511"></a>
-<span class="sourceLineNo">8512</span>   * Closes the lock. This needs to be called in the finally block corresponding<a name="line.8512"></a>
-<span class="sourceLineNo">8513</span>   * to the try block of #startRegionOperation<a name="line.8513"></a>
-<span class="sourceLineNo">8514</span>   */<a name="line.8514"></a>
-<span class="sourceLineNo">8515</span>  private void closeBulkRegionOperation(){<a name="line.8515"></a>
-<span class="sourceLineNo">8516</span>    if (lock.writeLock().isHeldByCurrentThread()) lock.writeLock().unlock();<a name="line.8516"></a>
-<span class="sourceLineNo">8517</span>    else lock.readLock().unlock();<a name="line.8517"></a>
-<span class="sourceLineNo">8518</span>  }<a name="line.8518"></a>
-<span class="sourceLineNo">8519</span><a name="line.8519"></a>
-<span class="sourceLineNo">8520</span>  /**<a name="line.8520"></a>
-<span class="sourceLineNo">8521</span>   * Update LongAdders for number of puts without wal and the size of possible data loss.<a name="line.8521"></a>
-<span class="sourceLineNo">8522</span>   * These information are exposed by the region server metrics.<a name="line.8522"></a>
-<span class="sourceLineNo">8523</span>   */<a name="line.8523"></a>
-<span class="sourceLineNo">8524</span>  private void recordMutationWithoutWal(final Map&lt;byte [], List&lt;Cell&gt;&gt; familyMap) {<a name="line.8524"></a>
-<span class="sourceLineNo">8525</span>    numMutationsWithoutWAL.increment();<a name="line.8525"></a>
-<span class="sourceLineNo">8526</span>    if (numMutationsWithoutWAL.sum() &lt;= 1) {<a name="line.8526"></a>
-<span class="sourceLineNo">8527</span>      LOG.info("writing data to region " + this +<a name="line.8527"></a>
-<span class="sourceLineNo">8528</span>               " with WAL disabled. Data may be lost in the event of a crash.");<a name="line.8528"></a>
-<span class="sourceLineNo">8529</span>    }<a name="line.8529"></a>
-<span class="sourceLineNo">8530</span><a name="line.8530"></a>
-<span class="sourceLineNo">8531</span>    long mutationSize = 0;<a name="line.8531"></a>
-<span class="sourceLineNo">8532</span>    for (List&lt;Cell&gt; cells: familyMap.values()) {<a name="line.8532"></a>
-<span class="sourceLineNo">8533</span>      // Optimization: 'foreach' loop is not used. See:<a name="line.8533"></a>
-<span class="sourceLineNo">8534</span>      // HBASE-12023 HRegion.applyFamilyMapToMemstore creates too many iterator objects<a name="line.8534"></a>
-<span class="sourceLineNo">8535</span>      assert cells instanceof RandomAccess;<a name="line.8535"></a>
-<span class="sourceLineNo">8536</span>      int listSize = cells.size();<a name="line.8536"></a>
-<span class="sourceLineNo">8537</span>      for (int i=0; i &lt; listSize; i++) {<a name="line.8537"></a>
-<span class="sourceLineNo">8538</span>        Cell cell = cells.get(i);<a name="line.8538"></a>
-<span class="sourceLineNo">8539</span>        mutationSize += cell.getSerializedSize();<a name="line.8539"></a>
-<span class="sourceLineNo">8540</span>      }<a name="line.8540"></a>
-<span class="sourceLineNo">8541</span>    }<a name="line.8541"></a>
-<span class="sourceLineNo">8542</span><a name="line.8542"></a>
-<span class="sourceLineNo">8543</span>    dataInMemoryWithoutWAL.add(mutationSize);<a name="line.8543"></a>
-<span class="sourceLineNo">8544</span>  }<a name="line.8544"></a>
-<span class="sourceLineNo">8545</span><a name="line.8545"></a>
-<span class="sourceLineNo">8546</span>  private void lock(final Lock lock) throws RegionTooBusyException, InterruptedIOException {<a name="line.8546"></a>
-<span class="sourceLineNo">8547</span>    lock(lock, 1);<a name="line.8547"></a>
-<span class="sourceLineNo">8548</span>  }<a name="line.8548"></a>
-<span class="sourceLineNo">8549</span><a name="line.8549"></a>
-<span class="sourceLineNo">8550</span>  /**<a name="line.8550"></a>
-<span class="sourceLineNo">8551</span>   * Try to acquire a lock.  Throw RegionTooBusyException<a name="line.8551"></a>
-<span class="sourceLineNo">8552</span>   * if failed to get the lock in time. Throw InterruptedIOException<a name="line.8552"></a>
-<span class="sourceLineNo">8553</span>   * if interrupted while waiting for the lock.<a name="line.8553"></a>
-<span class="sourceLineNo">8554</span>   */<a name="line.8554"></a>
-<span class="sourceLineNo">8555</span>  private void lock(final Lock lock, final int multiplier)<a name="line.8555"></a>
-<span class="sourceLineNo">8556</span>      throws RegionTooBusyException, InterruptedIOException {<a name="line.8556"></a>
-<span class="sourceLineNo">8557</span>    try {<a name="line.8557"></a>
-<span class="sourceLineNo">8558</span>      final long waitTime = Math.min(maxBusyWaitDuration,<a name="line.8558"></a>
-<span class="sourceLineNo">8559</span>          busyWaitDuration * Math.min(multiplier, maxBusyWaitMultiplier));<a name="line.8559"></a>
-<span class="sourceLineNo">8560</span>      if (!lock.tryLock(waitTime, TimeUnit.MILLISECONDS)) {<a name="line.8560"></a>
-<span class="sourceLineNo">8561</span>        // Don't print millis. Message is used as a key over in<a name="line.8561"></a>
-<span class="sourceLineNo">8562</span>        // RetriesExhaustedWithDetailsException processing.<a name="line.8562"></a>
-<span class="sourceLineNo">8563</span>        throw new RegionTooBusyException("Failed to obtain lock; regionName=" +<a name="line.8563"></a>
-<span class="sourceLineNo">8564</span>            (this.getRegionInfo() == null? "unknown":<a name="line.8564"></a>
-<span class="sourceLineNo">8565</span>                this.getRegionInfo().getRegionNameAsString()) +<a name="line.8565"></a>
-<span class="sourceLineNo">8566</span>            ", server=" + (this.getRegionServerServices() == null? "unknown":<a name="line.8566"></a>
-<span class="sourceLineNo">8567</span>                this.getRegionServerServices().getServerName()));<a name="line.8567"></a>
-<span class="sourceLineNo">8568</span>      }<a name="line.8568"></a>
-<span class="sourceLineNo">8569</span>    } catch (InterruptedException ie) {<a name="line.8569"></a>
-<span class="sourceLineNo">8570</span>      LOG.info("Interrupted while waiting for a lock");<a name="line.8570"></a>
-<span class="sourceLineNo">8571</span>      InterruptedIOException iie = new InterruptedIOException();<a name="line.8571"></a>
-<span class="sourceLineNo">8572</span>      iie.initCause(ie);<a name="line.8572"></a>
-<span class="sourceLineNo">8573</span>      throw iie;<a name="line.8573"></a>
-<span class="sourceLineNo">8574</span>    }<a name="line.8574"></a>
-<span class="sourceLineNo">8575</span>  }<a name="line.8575"></a>
-<span class="sourceLineNo">8576</span><a name="line.8576"></a>
-<span class="sourceLineNo">8577</span>  /**<a name="line.8577"></a>
-<span class="sourceLineNo">8578</span>   * Calls sync with the given transaction ID<a name="line.8578"></a>
-<span class="sourceLineNo">8579</span>   * @param txid should sync up to which transaction<a name="line.8579"></a>
-<span class="sourceLineNo">8580</span>   * @throws IOException If anything goes wrong with DFS<a name="line.8580"></a>
-<span class="sourceLineNo">8581</span>   */<a name="line.8581"></a>
-<span class="sourceLineNo">8582</span>  private void sync(long txid, Durability durability) throws IOException {<a name="line.8582"></a>
-<span class="sourceLineNo">8583</span>    if (this.getRegionInfo().isMetaRegion()) {<a name="line.8583"></a>
-<span class="sourceLineNo">8584</span>      this.wal.sync(txid);<a name="line.8584"></a>
-<span class="sourceLineNo">8585</span>    } else {<a name="line.8585"></a>
-<span class="sourceLineNo">8586</span>      switch(durability) {<a name="line.8586"></a>
-<span class="sourceLineNo">8587</span>      case USE_DEFAULT:<a name="line.8587"></a>
-<span class="sourceLineNo">8588</span>        // do what table defaults to<a name="line.8588"></a>
-<span class="sourceLineNo">8589</span>        if (shouldSyncWAL()) {<a name="line.8589"></a>
-<span class="sourceLineNo">8590</span>          this.wal.sync(txid);<a name="line.8590"></a>
-<span class="sourceLineNo">8591</span>        }<a name="line.8591"></a>
-<span class="sourceLineNo">8592</span>        break;<a name="line.8592"></a>
-<span class="sourceLineNo">8593</span>      case SKIP_WAL:<a name="line.8593"></a>
-<span class="sourceLineNo">8594</span>        // nothing do to<a name="line.8594"></a>
-<span class="sourceLineNo">8595</span>        break;<a name="line.8595"></a>
-<span class="sourceLineNo">8596</span>      case ASYNC_WAL:<a name="line.8596"></a>
-<span class="sourceLineNo">8597</span>        // nothing do to<a name="line.8597"></a>
-<span class="sourceLineNo">8598</span>        break;<a name="line.8598"></a>
-<span class="sourceLineNo">8599</span>      case SYNC_WAL:<a name="line.8599"></a>
-<span class="sourceLineNo">8600</span>          this.wal.sync(txid, false);<a name="line.8600"></a>
-<span class="sourceLineNo">8601</span>          break;<a name="line.8601"></a>
-<span class="sourceLineNo">8602</span>      case FSYNC_WAL:<a name="line.8602"></a>
-<span class="sourceLineNo">8603</span>          this.wal.sync(txid, true);<a name="line.8603"></a>
-<span class="sourceLineNo">8604</span>          break;<a name="line.8604"></a>
-<span class="sourceLineNo">8605</span>      default:<a name="line.8605"></a>
-<span class="sourceLineNo">8606</span>        throw new RuntimeException("Unknown durability " + durability);<a name="line.8606"></a>
-<span class="sourceLineNo">8607</span>      }<a name="line.8607"></a>
-<span class="sourceLineNo">8608</span>    }<a name="line.8608"></a>
-<span class="sourceLineNo">8609</span>  }<a name="line.8609"></a>
-<span class="sourceLineNo">8610</span><a name="line.8610"></a>
-<span class="sourceLineNo">8611</span>  /**<a name="line.8611"></a>
-<span class="sourceLineNo">8612</span>   * Check whether we should sync the wal from the table's durability settings<a name="line.8612"></a>
-<span class="sourceLineNo">8613</span>   */<a name="line.8613"></a>
-<span class="sourceLineNo">8614</span>  private boolean shouldSyncWAL() {<a name="line.8614"></a>
-<span class="sourceLineNo">8615</span>    return regionDurability.ordinal() &gt;  Durability.ASYNC_WAL.ordinal();<a name="line.8615"></a>
-<span class="sourceLineNo">8616</span>  }<a name="line.8616"></a>
-<span class="sourceLineNo">8617</span><a name="line.8617"></a>
-<span class="sourceLineNo">8618</span>  /**<a name="line.8618"></a>
-<span class="sourceLineNo">8619</span>   * A mocked list implementation - discards all updates.<a name="line.8619"></a>
-<span class="sourceLineNo">8620</span>   */<a name="line.8620"></a>
-<span class="sourceLineNo">8621</span>  private static final List&lt;Cell&gt; MOCKED_LIST = new AbstractList&lt;Cell&gt;() {<a name="line.8621"></a>
+<span class="sourceLineNo">8478</span>  public void closeRegionOperation() throws IOException {<a name="line.8478"></a>
+<span class="sourceLineNo">8479</span>    closeRegionOperation(Operation.ANY);<a name="line.8479"></a>
+<span class="sourceLineNo">8480</span>  }<a name="line.8480"></a>
+<span class="sourceLineNo">8481</span><a name="line.8481"></a>
+<span class="sourceLineNo">8482</span>  @Override<a name="line.8482"></a>
+<span class="sourceLineNo">8483</span>  public void closeRegionOperation(Operation operation) throws IOException {<a name="line.8483"></a>
+<span class="sourceLineNo">8484</span>    if (operation == Operation.SNAPSHOT) {<a name="line.8484"></a>
+<span class="sourceLineNo">8485</span>      stores.values().forEach(HStore::postSnapshotOperation);<a name="line.8485"></a>
+<span class="sourceLineNo">8486</span>    }<a name="line.8486"></a>
+<span class="sourceLineNo">8487</span>    lock.readLock().unlock();<a name="line.8487"></a>
+<span class="sourceLineNo">8488</span>    if (coprocessorHost != null) {<a name="line.8488"></a>
+<span class="sourceLineNo">8489</span>      coprocessorHost.postCloseRegionOperation(operation);<a name="line.8489"></a>
+<span class="sourceLineNo">8490</span>    }<a name="line.8490"></a>
+<span class="sourceLineNo">8491</span>  }<a name="line.8491"></a>
+<span class="sourceLineNo">8492</span><a name="line.8492"></a>
+<span class="sourceLineNo">8493</span>  /**<a name="line.8493"></a>
+<span class="sourceLineNo">8494</span>   * This method needs to be called before any public call that reads or<a name="line.8494"></a>
+<span class="sourceLineNo">8495</span>   * modifies stores in bulk. It has to be called just before a try.<a name="line.8495"></a>
+<span class="sourceLineNo">8496</span>   * #closeBulkRegionOperation needs to be called in the try's finally block<a name="line.8496"></a>
+<span class="sourceLineNo">8497</span>   * Acquires a writelock and checks if the region is closing or closed.<a name="line.8497"></a>
+<span class="sourceLineNo">8498</span>   * @throws NotServingRegionException when the region is closing or closed<a name="line.8498"></a>
+<span class="sourceLineNo">8499</span>   * @throws RegionTooBusyException if failed to get the lock in time<a name="line.8499"></a>
+<span class="sourceLineNo">8500</span>   * @throws InterruptedIOException if interrupted while waiting for a lock<a name="line.8500"></a>
+<span class="sourceLineNo">8501</span>   */<a name="line.8501"></a>
+<span class="sourceLineNo">8502</span>  private void startBulkRegionOperation(boolean writeLockNeeded)<a name="line.8502"></a>
+<span class="sourceLineNo">8503</span>      throws NotServingRegionException, RegionTooBusyException, InterruptedIOException {<a name="line.8503"></a>
+<span class="sourceLineNo">8504</span>    if (this.closing.get()) {<a name="line.8504"></a>
+<span class="sourceLineNo">8505</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closing");<a name="line.8505"></a>
+<span class="sourceLineNo">8506</span>    }<a name="line.8506"></a>
+<span class="sourceLineNo">8507</span>    if (writeLockNeeded) lock(lock.writeLock());<a name="line.8507"></a>
+<span class="sourceLineNo">8508</span>    else lock(lock.readLock());<a name="line.8508"></a>
+<span class="sourceLineNo">8509</span>    if (this.closed.get()) {<a name="line.8509"></a>
+<span class="sourceLineNo">8510</span>      if (writeLockNeeded) lock.writeLock().unlock();<a name="line.8510"></a>
+<span class="sourceLineNo">8511</span>      else lock.readLock().unlock();<a name="line.8511"></a>
+<span class="sourceLineNo">8512</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closed");<a name="line.8512"></a>
+<span class="sourceLineNo">8513</span>    }<a name="line.8513"></a>
+<span class="sourceLineNo">8514</span>  }<a name="line.8514"></a>
+<span class="sourceLineNo">8515</span><a name="line.8515"></a>
+<span class="sourceLineNo">8516</span>  /**<a name="line.8516"></a>
+<span class="sourceLineNo">8517</span>   * Closes the lock. This needs to be called in the finally block corresponding<a name="line.8517"></a>
+<span class="sourceLineNo">8518</span>   * to the try block of #startRegionOperation<a name="line.8518"></a>
+<span class="sourceLineNo">8519</span>   */<a name="line.8519"></a>
+<span class="sourceLineNo">8520</span>  private void closeBulkRegionOperation(){<a name="line.8520"></a>
+<span class="sourceLineNo">8521</span>    if (lock.writeLock().isHeldByCurrentThread()) lock.writeLock().unlock();<a name="line.8521"></a>
+<span class="sourceLineNo">8522</span>    else lock.readLock().unlock();<a name="line.8522"></a>
+<span class="sourceLineNo">8523</span>  }<a name="line.8523"></a>
+<span class="sourceLineNo">8524</span><a name="line.8524"></a>
+<span class="sourceLineNo">8525</span>  /**<a name="line.8525"></a>
+<span class="sourceLineNo">8526</span>   * Update LongAdders for number of puts without wal and the size of possible data loss.<a name="line.8526"></a>
+<span class="sourceLineNo">8527</span>   * These information are exposed by the region server metrics.<a name="line.8527"></a>
+<span class="sourceLineNo">8528</span>   */<a name="line.8528"></a>
+<span class="sourceLineNo">8529</span>  private void recordMutationWithoutWal(final Map&lt;byte [], List&lt;Cell&gt;&gt; familyMap) {<a name="line.8529"></a>
+<span class="sourceLineNo">8530</span>    numMutationsWithoutWAL.increment();<a name="line.8530"></a>
+<span class="sourceLineNo">8531</span>    if (numMutationsWithoutWAL.sum() &lt;= 1) {<a name="line.8531"></a>
+<span class="sourceLineNo">8532</span>      LOG.info("writing data to region " + this +<a name="line.8532"></a>
+<span class="sourceLineNo">8533</span>               " with WAL disabled. Data may be lost in the event of a crash.");<a name="line.8533"></a>
+<span class="sourceLineNo">8534</span>    }<a name="line.8534"></a>
+<span class="sourceLineNo">8535</span><a name="line.8535"></a>
+<span class="sourceLineNo">8536</span>    long mutationSize = 0;<a name="line.8536"></a>
+<span class="sourceLineNo">8537</span>    for (List&lt;Cell&gt; cells: familyMap.values()) {<a name="line.8537"></a>
+<span class="sourceLineNo">8538</span>      // Optimization: 'foreach' loop is not used. See:<a name="line.8538"></a>
+<span class="sourceLineNo">8539</span>      // HBASE-12023 HRegion.applyFamilyMapToMemstore creates too many iterator objects<a name="line.8539"></a>
+<span class="sourceLineNo">8540</span>      assert cells instanceof RandomAccess;<a name="line.8540"></a>
+<span class="sourceLineNo">8541</span>      int listSize = cells.size();<a name="line.8541"></a>
+<span class="sourceLineNo">8542</span>      for (int i=0; i &lt; listSize; i++) {<a name="line.8542"></a>
+<span class="sourceLineNo">8543</span>        Cell cell = cells.get(i);<a name="line.8543"></a>
+<span class="sourceLineNo">8544</span>        mutationSize += cell.getSerializedSize();<a name="line.8544"></a>
+<span class="sourceLineNo">8545</span>      }<a name="line.8545"></a>
+<span class="sourceLineNo">8546</span>    }<a name="line.8546"></a>
+<span class="sourceLineNo">8547</span><a name="line.8547"></a>
+<span class="sourceLineNo">8548</span>    dataInMemoryWithoutWAL.add(mutationSize);<a name="line.8548"></a>
+<span class="sourceLineNo">8549</span>  }<a name="line.8549"></a>
+<span class="sourceLineNo">8550</span><a name="line.8550"></a>
+<span class="sourceLineNo">8551</span>  private void lock(final Lock lock) throws RegionTooBusyException, InterruptedIOException {<a name="line.8551"></a>
+<span class="sourceLineNo">8552</span>    lock(lock, 1);<a name="line.8552"></a>
+<span class="sourceLineNo">8553</span>  }<a name="line.8553"></a>
+<span class="sourceLineNo">8554</span><a name="line.8554"></a>
+<span class="sourceLineNo">8555</span>  /**<a name="line.8555"></a>
+<span class="sourceLineNo">8556</span>   * Try to acquire a lock.  Throw RegionTooBusyException<a name="line.8556"></a>
+<span class="sourceLineNo">8557</span>   * if failed to get the lock in time. Throw InterruptedIOException<a name="line.8557"></a>
+<span class="sourceLineNo">8558</span>   * if interrupted while waiting for the lock.<a name="line.8558"></a>
+<span class="sourceLineNo">8559</span>   */<a name="line.8559"></a>
+<span class="sourceLineNo">8560</span>  private void lock(final Lock lock, final int multiplier)<a name="line.8560"></a>
+<span class="sourceLineNo">8561</span>      throws RegionTooBusyException, InterruptedIOException {<a name="line.8561"></a>
+<span class="sourceLineNo">8562</span>    try {<a name="line.8562"></a>
+<span class="sourceLineNo">8563</span>      final long waitTime = Math.min(maxBusyWaitDuration,<a name="line.8563"></a>
+<span class="sourceLineNo">8564</span>          busyWaitDuration * Math.min(multiplier, maxBusyWaitMultiplier));<a name="line.8564"></a>
+<span class="sourceLineNo">8565</span>      if (!lock.tryLock(waitTime, TimeUnit.MILLISECONDS)) {<a name="line.8565"></a>
+<span class="sourceLineNo">8566</span>        // Don't print millis. Message is used as a key over in<a name="line.8566"></a>
+<span class="sourceLineNo">8567</span>        // RetriesExhaustedWithDetailsException processing.<a name="line.8567"></a>
+<span class="sourceLineNo">8568</span>        throw new RegionTooBusyException("Failed to obtain lock; regionName=" +<a name="line.8568"></a>
+<span class="sourceLineNo">8569</span>            (this.getRegionInfo() == null? "unknown":<a name="line.8569"></a>
+<span class="sourceLineNo">8570</span>                this.getRegionInfo().getRegionNameAsString()) +<a name="line.8570"></a>
+<span class="sourceLineNo">8571</span>            ", server=" + (this.getRegionServerServices() == null? "unknown":<a name="line.8571"></a>
+<span class="sourceLineNo">8572</span>                this.getRegionServerServices().getServerName()));<a name="line.8572"></a>
+<span class="sourceLineNo">8573</span>      }<a name="line.8573"></a>
+<span class="sourceLineNo">8574</span>    } catch (InterruptedException ie) {<a name="line.8574"></a>
+<span class="sourceLineNo">8575</span>      LOG.info("Interrupted while waiting for a lock");<a name="line.8575"></a>
+<span class="sourceLineNo">8576</span>      InterruptedIOException iie = new InterruptedIOException();<a name="line.8576"></a>
+<span class="sourceLineNo">8577</span>      iie.initCause(ie);<a name="line.8577"></a>
+<span class="sourceLineNo">8578</span>      throw iie;<a name="line.8578"></a>
+<span class="sourceLineNo">8579</span>    }<a name="line.8579"></a>
+<span class="sourceLineNo">8580</span>  }<a name="line.8580"></a>
+<span class="sourceLineNo">8581</span><a name="line.8581"></a>
+<span class="sourceLineNo">8582</span>  /**<a name="line.8582"></a>
+<span class="sourceLineNo">8583</span>   * Calls sync with the given transaction ID<a name="line.8583"></a>
+<span class="sourceLineNo">8584</span>   * @param txid should sync up to which transaction<a name="line.8584"></a>
+<span class="sourceLineNo">8585</span>   * @throws IOException If anything goes wrong with DFS<a name="line.8585"></a>
+<span class="sourceLineNo">8586</span>   */<a name="line.8586"></a>
+<span class="sourceLineNo">8587</span>  private void sync(long txid, Durability durability) throws IOException {<a name="line.8587"></a>
+<span class="sourceLineNo">8588</span>    if (this.getRegionInfo().isMetaRegion()) {<a name="line.8588"></a>
+<span class="sourceLineNo">8589</span>      this.wal.sync(txid);<a name="line.8589"></a>
+<span class="sourceLineNo">8590</span>    } else {<a name="line.8590"></a>
+<span class="sourceLineNo">8591</span>      switch(durability) {<a name="line.8591"></a>
+<span class="sourceLineNo">8592</span>      case USE_DEFAULT:<a name="line.8592"></a>
+<span class="sourceLineNo">8593</span>        // do what table defaults to<a name="line.8593"></a>
+<span class="sourceLineNo">8594</span>        if (shouldSyncWAL()) {<a name="line.8594"></a>
+<span class="sourceLineNo">8595</span>          this.wal.sync(txid);<a name="line.8595"></a>
+<span class="sourceLineNo">8596</span>        }<a name="line.8596"></a>
+<span class="sourceLineNo">8597</span>        break;<a name="line.8597"></a>
+<span class="sourceLineNo">8598</span>      case SKIP_WAL:<a name="line.8598"></a>
+<span class="sourceLineNo">8599</span>        // nothing do to<a name="line.8599"></a>
+<span class="sourceLineNo">8600</span>        break;<a name="line.8600"></a>
+<span class="sourceLineNo">8601</span>      case ASYNC_WAL:<a name="line.8601"></a>
+<span class="sourceLineNo">8602</span>        // nothing do to<a name="line.8602"></a>
+<span class="sourceLineNo">8603</span>        break;<a name="line.8603"></a>
+<span class="sourceLineNo">8604</span>      case SYNC_WAL:<a name="line.8604"></a>
+<span class="sourceLineNo">8605</span>          this.wal.sync(txid, false);<a name="line.8605"></a>
+<span class="sourceLineNo">8606</span>          break;<a name="line.8606"></a>
+<span class="sourceLineNo">8607</span>      case FSYNC_WAL:<a name="line.8607"></a>
+<span class="sourceLineNo">8608</span>          this.wal.sync(txid, true);<a name="line.8608"></a>
+<span class="sourceLineNo">8609</span>          break;<a name="line.8609"></a>
+<span class="sourceLineNo">8610</span>      default:<a name="line.8610"></a>
+<span class="sourceLineNo">8611</span>        throw new RuntimeException("Unknown durability " + durability);<a name="line.8611"></a>
+<span class="sourceLineNo">8612</span>      }<a name="line.8612"></a>
+<span class="sourceLineNo">8613</span>    }<a name="line.8613"></a>
+<span class="sourceLineNo">8614</span>  }<a name="line.8614"></a>
+<span class="sourceLineNo">8615</span><a name="line.8615"></a>
+<span class="sourceLineNo">8616</span>  /**<a name="line.8616"></a>
+<span class="sourceLineNo">8617</span>   * Check whether we should sync the wal from the table's durability settings<a name="line.8617"></a>
+<span class="sourceLineNo">8618</span>   */<a name="line.8618"></a>
+<span class="sourceLineNo">8619</span>  private boolean shouldSyncWAL() {<a name="line.8619"></a>
+<span class="sourceLineNo">8620</span>    return regionDurability.ordinal() &gt;  Durability.ASYNC_WAL.ordinal();<a name="line.8620"></a>
+<span class="sourceLineNo">8621</span>  }<a name="line.8621"></a>
 <span class="sourceLineNo">8622</span><a name="line.8622"></a>
-<span class="sourceLineNo">8623</span>    @Override<a name="line.8623"></a>
-<span class="sourceLineNo">8624</span>    public void add(int index, Cell element) {<a name="line.8624"></a>
-<span class="sourceLineNo">8625</span>      // do nothing<a name="line.8625"></a>
-<span class="sourceLineNo">8626</span>    }<a name="line.8626"></a>
+<span class="sourceLineNo">8623</span>  /**<a name="line.8623"></a>
+<span class="sourceLineNo">8624</span>   * A mocked list implementation - discards all updates.<a name="line.8624"></a>
+<span class="sourceLineNo">8625</span>   */<a name="line.8625"></a>
+<span class="sourceLineNo">8626</span>  private static final List&lt;Cell&gt; MOCKED_LIST = new AbstractList&lt;Cell&gt;() {<a name="line.8626"></a>
 <span class="sourceLineNo">8627</span><a name="line.8627"></a>
 <span class="sourceLineNo">8628</span>    @Override<a name="line.8628"></a>
-<span class="sourceLineNo">8629</span>    public boolean addAll(int index, Collection&lt;? extends Cell&gt; c) {<a name="line.8629"></a>
-<span class="sourceLineNo">8630</span>      return false; // this list is never changed as a result of an update<a name="line.8630"></a>
+<span class="sourceLineNo">8629</span>    public void add(int index, Cell element) {<a name="line.8629"></a>
+<span class="sourceLineNo">8630</span>      // do nothing<a name="line.8630"></a>
 <span class="sourceLineNo">8631</span>    }<a name="line.8631"></a>
 <span class="sourceLineNo">8632</span><a name="line.8632"></a>
 <span class="sourceLineNo">8633</span>    @Override<a name="line.8633"></a>
-<span class="sourceLineNo">8634</span>    public KeyValue get(int index) {<a name="line.8634"></a>
-<span class="sourceLineNo">8635</span>      throw new UnsupportedOperationException();<a name="line.8635"></a>
+<span class="sourceLineNo">8634</span>    public boolean addAll(int index, Collection&lt;? extends Cell&gt; c) {<a name="line.8634"></a>
+<span class="sourceLineNo">8635</span>      return false; // this list is never changed as a result of an update<a name="line.8635"></a>
 <span class="sourceLineNo">8636</span>    }<a name="line.8636"></a>
 <span class="sourceLineNo">8637</span><a name="line.8637"></a>
 <span class="sourceLineNo">8638</span>    @Override<a name="line.8638"></a>
-<span class="sourceLineNo">8639</span>    public int size() {<a name="line.8639"></a>
-<span class="sourceLineNo">8640</span>      return 0;<a name="line.8640"></a>
+<span class="sourceLineNo">8639</span>    public KeyValue get(int index) {<a name="line.8639"></a>
+<span class="sourceLineNo">8640</span>      throw new UnsupportedOperationException();<a name="line.8640"></a>
 <span class="sourceLineNo">8641</span>    }<a name="line.8641"></a>
-<span class="sourceLineNo">8642</span>  };<a name="line.8642"></a>
-<span class="sourceLineNo">8643</span><a name="line.8643"></a>
-<span class="sourceLineNo">8644</span>  /** @return the latest sequence number that was read from storage when this region was opened */<a name="line.8644"></a>
-<span class="sourceLineNo">8645</span>  public long getOpenSeqNum() {<a name="line.8645"></a>
-<span class="sourceLineNo">8646</span>    return this.openSeqNum;<a name="line.8646"></a>
-<span class="sourceLineNo">8647</span>  }<a name="line.8647"></a>
+<span class="sourceLineNo">8642</span><a name="line.8642"></a>
+<span class="sourceLineNo">8643</span>    @Override<a name="line.8643"></a>
+<span class="sourceLineNo">8644</span>    public int size() {<a name="line.8644"></a>
+<span class="sourceLineNo">8645</span>      return 0;<a name="line.8645"></a>
+<span class="sourceLineNo">8646</span>    }<a name="line.8646"></a>
+<span class="sourceLineNo">8647</span>  };<a name="line.8647"></a>
 <span class="sourceLineNo">8648</span><a name="line.8648"></a>
-<span class="sourceLineNo">8649</span>  @Override<a name="line.8649"></a>
-<span class="sourceLineNo">8650</span>  public Map&lt;byte[], Long&gt; getMaxStoreSeqId() {<a name="line.8650"></a>
-<span class="sourceLineNo">8651</span>    return this.maxSeqIdInStores;<a name="line.8651"></a>
+<span class="sourceLineNo">8649</span>  /** @return the latest sequence number that was read from storage when this region was opened */<a name="line.8649"></a>
+<span class="sourceLineNo">8650</span>  public long getOpenSeqNum() {<a name="line.8650"></a>
+<span class="sourceLineNo">8651</span>    return this.openSeqNum;<a name="line.8651"></a>
 <span class="sourceLineNo">8652</span>  }<a name="line.8652"></a>
 <span class="sourceLineNo">8653</span><a name="line.8653"></a>
-<span class="sourceLineNo">8654</span>  public long getOldestSeqIdOfStore(byte[] familyName) {<a name="line.8654"></a>
-<span class="sourceLineNo">8655</span>    return wal.getEarliestMemStoreSeqNum(getRegionInfo().getEncodedNameAsBytes(), familyName);<a name="line.8655"></a>
-<span class="sourceLineNo">8656</span>  }<a name="line.8656"></a>
-<span class="sourceLineNo">8657</span><a name="line.8657"></a>
-<span class="sourceLineNo">8658</span>  @Override<a name="line.8658"></a>
-<span class="sourceLineNo">8659</span>  public CompactionState getCompactionState() {<a name="line.8659"></a>
-<span class="sourceLineNo">8660</span>    boolean hasMajor = majorInProgress.get() &gt; 0, hasMinor = minorInProgress.get() &gt; 0;<a name="line.8660"></a>
-<span class="sourceLineNo">8661</span>    return (hasMajor ? (hasMinor ? CompactionState.MAJOR_AND_MINOR : CompactionState.MAJOR)<a name="line.8661"></a>
-<span class="sourceLineNo">8662</span>        : (hasMinor ? CompactionState.MINOR : CompactionState.NONE));<a name="line.8662"></a>
-<span class="sourceLineNo">8663</span>  }<a name="line.8663"></a>
-<span class="sourceLineNo">8664</span><a name="line.8664"></a>
-<span class="sourceLineNo">8665</span>  public void reportCompactionRequestStart(boolean isMajor){<a name="line.8665"></a>
-<span class="sourceLineNo">8666</span>    (isMajor ? majorInProgress : minorInProgress).incrementAndGet();<a name="line.8666"></a>
-<span class="sourceLineNo">8667</span>  }<a name="line.8667"></a>
-<span class="sourceLineNo">8668</span><a name="line.8668"></a>
-<span class="sourceLineNo">8669</span>  public void reportCompactionRequestEnd(boolean isMajor, int numFiles, long filesSizeCompacted) {<a name="line.8669"></a>
-<span class="sourceLineNo">8670</span>    int newValue = (isMajor ? majorInProgress : minorInProgress).decrementAndGet();<a name="line.8670"></a>
-<span class="sourceLineNo">8671</span><a name="line.8671"></a>
-<span class="sourceLineNo">8672</span>    // metrics<a name="line.8672"></a>
-<span class="sourceLineNo">8673</span>    compactionsFinished.increment();<a name="line.8673"></a>
-<span class="sourceLineNo">8674</span>    compactionNumFilesCompacted.add(numFiles);<a name="line.8674"></a>
-<span class="sourceLineNo">8675</span>    compactionNumBytesCompacted.add(filesSizeCompacted);<a name="line.8675"></a>
+<span class="sourceLineNo">8654</span>  @Override<a name="line.8654"></a>
+<span class="sourceLineNo">8655</span>  public Map&lt;byte[], Long&gt; getMaxStoreSeqId() {<a name="line.8655"></a>
+<span class="sourceLineNo">8656</span>    return this.maxSeqIdInStores;<a name="line.8656"></a>
+<span class="sourceLineNo">8657</span>  }<a name="line.8657"></a>
+<span class="sourceLineNo">8658</span><a name="line.8658"></a>
+<span class="sourceLineNo">8659</span>  public long getOldestSeqIdOfStore(byte[] familyName) {<a name="line.8659"></a>
+<span class="sourceLineNo">8660</span>    return wal.getEarliestMemStoreSeqNum(getRegionInfo().getEncodedNameAsBytes(), familyName);<a name="line.8660"></a>
+<span class="sourceLineNo">8661</span>  }<a name="line.8661"></a>
+<span class="sourceLineNo">8662</span><a name="line.8662"></a>
+<span class="sourceLineNo">8663</span>  @Override<a name="line.8663"></a>
+<span class="sourceLineNo">8664</span>  public CompactionState getCompactionState() {<a name="line.8664"></a>
+<span class="sourceLineNo">8665</span>    boolean hasMajor = majorInProgress.get() &gt; 0, hasMinor = minorInProgress.get() &gt; 0;<a name="line.8665"></a>
+<span class="sourceLineNo">8666</span>    return (hasMajor ? (hasMinor ? CompactionState.MAJOR_AND_MINOR : CompactionState.MAJOR)<a name="line.8666"></a>
+<span class="sourceLineNo">8667</span>        : (hasMinor ? CompactionState.MINOR : CompactionState.NONE));<a name="line.8667"></a>
+<span class="sourceLineNo">8668</span>  }<a name="line.8668"></a>
+<span class="sourceLineNo">8669</span><a name="line.8669"></a>
+<span class="sourceLineNo">8670</span>  public void reportCompactionRequestStart(boolean isMajor){<a name="line.8670"></a>
+<span class="sourceLineNo">8671</span>    (isMajor ? majorInProgress : minorInProgress).incrementAndGet();<a name="line.8671"></a>
+<span class="sourceLineNo">8672</span>  }<a name="line.8672"></a>
+<span class="sourceLineNo">8673</span><a name="line.8673"></a>
+<span class="sourceLineNo">8674</span>  public void reportCompactionRequestEnd(boolean isMajor, int numFiles, long filesSizeCompacted) {<a name="line.8674"></a>
+<span class="sourceLineNo">8675</span>    int newValue = (isMajor ? majorInProgress : minorInProgress).decrementAndGet();<a name="line.8675"></a>
 <span class="sourceLineNo">8676</span><a name="line.8676"></a>
-<span class="sourceLineNo">8677</span>    assert newValue &gt;= 0;<a name="line.8677"></a>
-<span class="sourceLineNo">8678</span>  }<a name="line.8678"></a>
-<span class="sourceLineNo">8679</span><a name="line.8679"></a>
-<span class="sourceLineNo">8680</span>  public void reportCompactionRequestFailure() {<a name="line.8680"></a>
-<span class="sourceLineNo">8681</span>    compactionsFailed.increment();<a name="line.8681"></a>
-<span class="sourceLineNo">8682</span>  }<a name="line.8682"></a>
-<span class="sourceLineNo">8683</span><a name="line.8683"></a>
-<span class="sourceLineNo">8684</span>  public void incrementCompactionsQueuedCount() {<a name="line.8684"></a>
-<span class="sourceLineNo">8685</span>    compactionsQueued.increment();<a name="line.8685"></a>
-<span class="sourceLineNo">8686</span>  }<a name="line.8686"></a>
-<span class="sourceLineNo">8687</span><a name="line.8687"></a>
-<span class="sourceLineNo">8688</span>  public void decrementCompactionsQueuedCount() {<a name="line.8688"></a>
-<span class="sourceLineNo">8689</span>    compactionsQueued.decrement();<a name="line.8689"></a>
-<span class="sourceLineNo">8690</span>  }<a name="line.8690"></a>
-<span class="sourceLineNo">8691</span><a name="line.8691"></a>
-<span class="sourceLineNo">8692</span>  public void incrementFlushesQueuedCount() {<a name="line.8692"></a>
-<span class="sourceLineNo">8693</span>    flushesQueued.increment();<a name="line.8693"></a>
-<span class="sourceLineNo">8694</span>  }<a name="line.8694"></a>
-<span class="sourceLineNo">8695</span><a name="line.8695"></a>
-<span class="sourceLineNo">8696</span>  @VisibleForTesting<a name="line.8696"></a>
-<span class="sourceLineNo">8697</span>  public long getReadPoint() {<a name="line.8697"></a>
-<span class="sourceLineNo">8698</span>    return getReadPoint(IsolationLevel.READ_COMMITTED);<a name="line.8698"></a>
+<span class="sourceLineNo">8677</span>    // metrics<a name="line.8677"></a>
+<span class="sourceLineNo">8678</span>    compactionsFinished.increment();<a name="line.8678"></a>
+<span class="sourceLineNo">8679</span>    compactionNumFilesCompacted.add(numFiles);<a name="line.8679"></a>
+<span class="sourceLineNo">8680</span>    compactionNumBytesCompacted.add(filesSizeCompacted);<a name="line.8680"></a>
+<span class="sourceLineNo">8681</span><a name="line.8681"></a>
+<span class="sourceLineNo">8682</span>    assert newValue &gt;= 0;<a name="line.8682"></a>
+<span class="sourceLineNo">8683</span>  }<a name="line.8683"></a>
+<span class="sourceLineNo">8684</span><a name="line.8684"></a>
+<span class="sourceLineNo">8685</span>  public void reportCompactionRequestFailure() {<a name="line.8685"></a>
+<span class="sourceLineNo">8686</span>    compactionsFailed.increment();<a name="line.8686"></a>
+<span class="sourceLineNo">8687</span>  }<a name="line.8687"></a>
+<span class="sourceLineNo">8688</span><a name="line.8688"></a>
+<span class="sourceLineNo">8689</span>  public void incrementCompactionsQueuedCount() {<a name="line.8689"></a>
+<span class="sourceLineNo">8690</span>    compactionsQueued.increment();<a name="line.8690"></a>
+<span class="sourceLineNo">8691</span>  }<a name="line.8691"></a>
+<span class="sourceLineNo">8692</span><a name="line.8692"></a>
+<span class="sourceLineNo">8693</span>  public void decrementCompactionsQueuedCount() {<a name="line.8693"></a>
+<span class="sourceLineNo">8694</span>    compactionsQueued.decrement();<a name="line.8694"></a>
+<span class="sourceLineNo">8695</span>  }<a name="line.8695"></a>
+<span class="sourceLineNo">8696</span><a name="line.8696"></a>
+<span class="sourceLineNo">8697</span>  public void incrementFlushesQueuedCount() {<a name="line.8697"></a>
+<span class="sourceLineNo">8698</span>    flushesQueued.increment();<a name="line.8698"></a>
 <span class="sourceLineNo">8699</span>  }<a name="line.8699"></a>
 <span class="sourceLineNo">8700</span><a name="line.8700"></a>
-<span class="sourceLineNo">8701</span>  /**<a name="line.8701"></a>
-<span class="sourceLineNo">8702</span>   * {@inheritDoc}<a name="line.8702"></a>
-<span class="sourceLineNo">8703</span>   */<a name="line.8703"></a>
-<span class="sourceLineNo">8704</span>  @Override<a name="line.8704"></a>
-<span class="sourceLineNo">8705</span>  public void onConfigurationChange(Configuration conf) {<a name="line.8705"></a>
-<span class="sourceLineNo">8706</span>    this.storeHotnessProtector.update(conf);<a name="line.8706"></a>
-<span class="sourceLineNo">8707</span>  }<a name="line.8707"></a>
-<span class="sourceLineNo">8708</span><a name="line.8708"></a>
-<span class="sourceLineNo">8709</span>  /**<a name="line.8709"></a>
-<span class="sourceLineNo">8710</span>   * {@inheritDoc}<a name="line.8710"></a>
-<span class="sourceLineNo">8711</span>   */<a name="line.8711"></a>
-<span class="sourceLineNo">8712</span>  @Override<a name="line.8712"></a>
-<span class="sourceLineNo">8713</span>  public void registerChildren(ConfigurationManager manager) {<a name="line.8713"></a>
-<span class="sourceLineNo">8714</span>    configurationManager = Optional.of(manager);<a name="line.8714"></a>
-<span class="sourceLineNo">8715</span>    stores.values().forEach(manager::registerObserver);<a name="line.8715"></a>
-<span class="sourceLineNo">8716</span>  }<a name="line.8716"></a>
-<span class="sourceLineNo">8717</span><a name="line.8717"></a>
-<span class="sourceLineNo">8718</span>  /**<a name="line.8718"></a>
-<span class="sourceLineNo">8719</span>   * {@inheritDoc}<a name="line.8719"></a>
-<span class="sourceLineNo">8720</span>   */<a name="line.8720"></a>
-<span class="sourceLineNo">8721</span>  @Override<a name="line.8721"></a>
-<span class="sourceLineNo">8722</span>  public void deregisterChildren(ConfigurationManager manager) {<a name="line.8722"></a>
-<span class="sourceLineNo">8723</span>    stores.values().forEach(configurationManager.get()::deregisterObserver);<a name="line.8723"></a>
-<span class="sourceLineNo">8724</span>  }<a name="line.8724"></a>
-<span class="sourceLineNo">8725</span><a name="line.8725"></a>
+<span class="sourceLineNo">8701</span>  @VisibleForTesting<a name="line.8701"></a>
+<span class="sourceLineNo">8702</span>  public long getReadPoint() {<a name="line.8702"></a>
+<span class="sourceLineNo">8703</span>    return getReadPoint(IsolationLevel.READ_COMMITTED);<a name="line.8703"></a>
+<span class="sourceLineNo">8704</span>  }<a name="line.8704"></a>
+<span class="sourceLineNo">8705</span><a name="line.8705"></a>
+<span class="sourceLineNo">8706</span>  /**<a name="line.8706"></a>
+<span class="sourceLineNo">8707</span>   * {@inheritDoc}<a name="line.8707"></a>
+<span class="sourceLineNo">8708</span>   */<a name="line.8708"></a>
+<span class="sourceLineNo">8709</span>  @Override<a name="line.8709"></a>
+<span class="sourceLineNo">8710</span>  public void onConfigurationChange(Configuration conf) {<a name="line.8710"></a>
+<span class="sourceLineNo">8711</span>    this.storeHotnessProtector.update(conf);<a name="line.8711"></a>
+<span class="sourceLineNo">8712</span>  }<a name="line.8712"></a>
+<span class="sourceLineNo">8713</span><a name="line.8713"></a>
+<span class="sourceLineNo">8714</span>  /**<a name="line.8714"></a>
+<span class="sourceLineNo">8715</span>   * {@inheritDoc}<a name="line.8715"></a>
+<span class="sourceLineNo">8716</span>   */<a name="line.8716"></a>
+<span class="sourceLineNo">8717</span>  @Override<a name="line.8717"></a>
+<span class="sourceLineNo">8718</span>  public void registerChildren(ConfigurationManager manager) {<a name="line.8718"></a>
+<span class="sourceLineNo">8719</span>    configurationManager = Optional.of(manager);<a name="line.8719"></a>
+<span class="sourceLineNo">8720</span>    stores.values().forEach(manager::registerObserver);<a name="line.8720"></a>
+<span class="sourceLineNo">8721</span>  }<a name="line.8721"></a>
+<span class="sourceLineNo">8722</span><a name="line.8722"></a>
+<span class="sourceLineNo">8723</span>  /**<a name="line.8723"></a>
+<span class="sourceLineNo">8724</span>   * {@inheritDoc}<a name="line.8724"></a>
+<span class="sourceLineNo">8725</span>   */<a name="line.8725"></a>
 <span class="sourceLineNo">8726</span>  @Override<a name="line.8726"></a>
-<span class="sourceLineNo">8727</span>  public CellComparator getCellComparator() {<a name="line.8727"></a>
-<span class="sourceLineNo">8728</span>    return this.getRegionInfo().isMetaRegion() ? CellComparatorImpl.META_COMPARATOR<a name="line.8728"></a>
-<span class="sourceLineNo">8729</span>        : CellComparatorImpl.COMPARATOR;<a name="line.8729"></a>
-<span class="sourceLineNo">8730</span>  }<a name="line.8730"></a>
-<span class="sourceLineNo">8731</span><a name="line.8731"></a>
-<span class="sourceLineNo">8732</span>  public long getMemStoreFlushSize() {<a name="line.8732"></a>
-<span class="sourceLineNo">8733</span>    return this.memstoreFlushSize;<a name="line.8733"></a>
-<span class="sourceLineNo">8734</span>  }<a name="line.8734"></a>
-<span class="sourceLineNo">8735</span><a name="line.8735"></a>
+<span class="sourceLineNo">8727</span>  public void deregisterChildren(ConfigurationManager manager) {<a name="line.8727"></a>
+<span class="sourceLineNo">8728</span>    stores.values().forEach(configurationManager.get()::deregisterObserver);<a name="line.8728"></a>
+<span class="sourceLineNo">8729</span>  }<a name="line.8729"></a>
+<span class="sourceLineNo">8730</span><a name="line.8730"></a>
+<span class="sourceLineNo">8731</span>  @Override<a name="line.8731"></a>
+<span class="sourceLineNo">8732</span>  public CellComparator getCellComparator() {<a name="line.8732"></a>
+<span class="sourceLineNo">8733</span>    return this.getRegionInfo().isMetaRegion() ? CellComparatorImpl.META_COMPARATOR<a name="line.8733"></a>
+<span class="sourceLineNo">8734</span>        : CellComparatorImpl.COMPARATOR;<a name="line.8734"></a>
+<span class="sourceLineNo">8735</span>  }<a name="line.8735"></a>
 <span class="sourceLineNo">8736</span><a name="line.8736"></a>
-<span class="sourceLineNo">8737</span>  //// method for debugging tests<a name="line.8737"></a>
-<span class="sourceLineNo">8738</span>  void throwException(String title, String regionName) {<a name="line.8738"></a>
-<span class="sourceLineNo">8739</span>    StringBuilder buf = new StringBuilder();<a name="line.8739"></a>
-<span class="sourceLineNo">8740</span>    buf.append(title + ", ");<a name="line.8740"></a>
-<span class="sourceLineNo">8741</span>    buf.append(getRegionInfo().toString());<a name="line.8741"></a>
-<span class="sourceLineNo">8742</span>    buf.append(getRegionInfo().isMetaRegion() ? " meta region " : " ");<a name="line.8742"></a>
-<span class="sourceLineNo">8743</span>    buf.append("stores: ");<a name="line.8743"></a>
-<span class="sourceLineNo">8744</span>    for (HStore s : stores.values()) {<a name="line.8744"></a>
-<span class="sourceLineNo">8745</span>      buf.append(s.getColumnFamilyDescriptor().getNameAsString());<a name="line.8745"></a>
-<span class="sourceLineNo">8746</span>      buf.append(" size: ");<a name="line.8746"></a>
-<span class="sourceLineNo">8747</span>      buf.append(s.getMemStoreSize().getDataSize());<a name="line.8747"></a>
-<span class="sourceLineNo">8748</span>      buf.append(" ");<a name="line.8748"></a>
-<span class="sourceLineNo">8749</span>    }<a name="line.8749"></a>
-<span class="sourceLineNo">8750</span>    buf.append("end-of-stores");<a name="line.8750"></a>
-<span class="sourceLineNo">8751</span>    buf.append(", memstore size ");<a name="line.8751"></a>
-<span class="sourceLineNo">8752</span>    buf.append(getMemStoreDataSize());<a name="line.8752"></a>
-<span class="sourceLineNo">8753</span>    if (getRegionInfo().getRegionNameAsString().startsWith(regionName)) {<a name="line.8753"></a>
-<span class="sourceLineNo">8754</span>      throw new RuntimeException(buf.toString());<a name="line.8754"></a>
-<span class="sourceLineNo">8755</span>    }<a name="line.8755"></a>
-<span class="sourceLineNo">8756</span>  }<a name="line.8756"></a>
-<span class="sourceLineNo">8757</span><a name="line.8757"></a>
-<span class="sourceLineNo">8758</span>  @Override<a name="line.8758"></a>
-<span class="sourceLineNo">8759</span>  public void requestCompaction(String why, int priority, boolean major,<a name="line.8759"></a>
-<span class="sourceLineNo">8760</span>      CompactionLifeCycleTracker tracker) throws IOException {<a name="line.8760"></a>
-<span class="sourceLineNo">8761</span>    if (major) {<a name="line.8761"></a>
-<span class="sourceLineNo">8762</span>      stores.values().forEach(HStore::triggerMajorCompaction);<a name="line.8762"></a>
-<span class="sourceLineNo">8763</span>    }<a name="line.8763"></a>
-<span class="sourceLineNo">8764</span>    rsServices.getCompactionRequestor().requestCompaction(this, why, priority, tracker,<a name="line.8764"></a>
-<span class="sourceLineNo">8765</span>        RpcServer.getRequestUser().orElse(null));<a name="line.8765"></a>
-<span class="sourceLineNo">8766</span>  }<a name="line.8766"></a>
-<span class="sourceLineNo">8767</span><a name="line.8767"></a>
-<span class="sourceLineNo">8768</span>  @Override<a name="line.8768"></a>
-<span class="sourceLineNo">8769</span>  public void requestCompaction(byte[] family, String why, int priority, boolean major,<a name="line.8769"></a>
-<span class="sourceLineNo">8770</span>      CompactionLifeCycleTracker tracker) throws IOException {<a name="line.8770"></a>
-<span class="sourceLineNo">8771</span>    HStore store = stores.get(family);<a name="line.8771"></a>
-<span class="sourceLineNo">8772</span>    if (store == null) {<a name="line.8772"></a>
-<span class="sourceLineNo">8773</span>      throw new NoSuchColumnFamilyException("column family " + Bytes.toString(family) +<a name="line.8773"></a>
-<span class="sourceLineNo">8774</span>          " does not exist in region " + getRegionInfo().getRegionNameAsString());<a name="line.8774"></a>
-<span class="sourceLineNo">8775</span>    }<a name="line.8775"></a>
-<span class="sourceLineNo">8776</span>    if (major) {<a name="line.8776"></a>
-<span class="sourceLineNo">8777</span>      store.triggerMajorCompaction();<a name="line.8777"></a>
-<span class="sourceLineNo">8778</span>    }<a name="line.8778"></a>
-<span class="sourceLineNo">8779</span>    rsServices.getCompactionRequestor().requestCompaction(this, store, why, priority, tracker,<a name="line.8779"></a>
-<span class="sourceLineNo">8780</span>        RpcServer.getRequestUser().orElse(null));<a name="line.8780"></a>
-<span class="sourceLineNo">8781</span>  }<a name="line.8781"></a>
-<span class="sourceLineNo">8782</span><a name="line.8782"></a>
-<span class="sourceLineNo">8783</span>  private void requestFlushIfNeeded() throws RegionTooBusyException {<a name="line.8783"></a>
-<span class="sourceLineNo">8784</span>    if(isFlushSize(this.memStoreSizing.getMemStoreSize())) {<a name="line.8784"></a>
-<span class="sourceLineNo">8785</span>      requestFlush();<a name="line.8785"></a>
-<span class="sourceLineNo">8786</span>    }<a name="line.8786"></a>
-<span class="sourceLineNo">8787</span>  }<a name="line.8787"></a>
-<span class="sourceLineNo">8788</span><a name="line.8788"></a>
-<span class="sourceLineNo">8789</span>  private void requestFlush() {<a name="line.8789"></a>
-<span class="sourceLineNo">8790</span>    if (this.rsServices == null) {<a name="line.8790"></a>
-<span class="sourceLineNo">8791</span>      return;<a name="line.8791"></a>
-<span class="sourceLineNo">8792</span>    }<a name="line.8792"></a>
-<span class="sourceLineNo">8793</span>    requestFlush0(FlushLifeCycleTracker.DUMMY);<a name="line.8793"></a>
-<span class="sourceLineNo">8794</span>  }<a name="line.8794"></a>
-<span class="sourceLineNo">8795</span><a name="line.8795"></a>
-<span class="sourceLineNo">8796</span>  private void requestFlush0(FlushLifeCycleTracker tracker) {<a name="line.8796"></a>
-<span class="sourceLineNo">8797</span>    boolean shouldFlush = false;<a name="line.8797"></a>
-<span class="sourceLineNo">8798</span>    synchronized (writestate) {<a name="line.8798"></a>
-<span class="sourceLineNo">8799</span>      if (!this.writestate.isFlushRequested()) {<a name="line.8799"></a>
-<span class="sourceLineNo">8800</span>        shouldFlush = true;<a name="line.8800"></a>
-<span class="sourceLineNo">8801</span>        writestate.flushRequested = true;<a name="line.8801"></a>
-<span class="sourceLineNo">8802</span>      }<a name="line.8802"></a>
-<span class="sourceLineNo">8803</span>    }<a name="line.8803"></a>
-<span class="sourceLineNo">8804</span>    if (shouldFlush) {<a name="line.8804"></a>
-<span class="sourceLineNo">8805</span>      // Make request outside of synchronize block; HBASE-818.<a name="line.8805"></a>
-<span class="sourceLineNo">8806</span>      this.rsServices.getFlushRequester().requestFlush(this, false, tracker);<a name="line.8806"></a>
-<span class="sourceLineNo">8807</span>      if (LOG.isDebugEnabled()) {<a name="line.8807"></a>
-<span class="sourceLineNo">8808</span>        LOG.debug("Flush requested on " + this.getRegionInfo().getEncodedName());<a name="line.8808"></a>
-<span class="sourceLineNo">8809</span>      }<a name="line.8809"></a>
-<span class="sourceLineNo">8810</span>    } else {<a name="line.8810"></a>
-<span class="sourceLineNo">8811</span>      tracker.notExecuted("Flush already requested on " + this);<a name="line.8811"></a>
-<span class="sourceLineNo">8812</span>    }<a name="line.8812"></a>
-<span class="sourceLineNo">8813</span>  }<a name="line.8813"></a>
-<span class="sourceLineNo">8814</span><a name="line.8814"></a>
-<span class="sourceLineNo">8815</span>  @Override<a name="line.8815"></a>
-<span class="sourceLineNo">8816</span>  public void requestFlush(FlushLifeCycleTracker tracker) throws IOException {<a name="line.8816"></a>
-<span class="sourceLineNo">8817</span>    requestFlush0(tracker);<a name="line.8817"></a>
+<span class="sourceLineNo">8737</span>  public long getMemStoreFlushSize() {<a name="line.8737"></a>
+<span class="sourceLineNo">8738</span>    return this.memstoreFlushSize;<a name="line.8738"></a>
+<span class="sourceLineNo">8739</span>  }<a name="line.8739"></a>
+<span class="sourceLineNo">8740</span><a name="line.8740"></a>
+<span class="sourceLineNo">8741</span><a name="line.8741"></a>
+<span class="sourceLineNo">8742</span>  //// method for debugging tests<a name="line.8742"></a>
+<span class="sourceLineNo">8743</span>  void throwException(String title, String regionName) {<a name="line.8743"></a>
+<span class="sourceLineNo">8744</span>    StringBuilder buf = new StringBuilder();<a name="line.8744"></a>
+<span class="sourceLineNo">8745</span>    buf.append(title + ", ");<a name="line.8745"></a>
+<span class="sourceLineNo">8746</span>    buf.append(getRegionInfo().toString());<a name="line.8746"></a>
+<span class="sourceLineNo">8747</span>    buf.append(getRegionInfo().isMetaRegion() ? " meta region " : " ");<a name="line.8747"></a>
+<span class="sourceLineNo">8748</span>    buf.append("stores: ");<a name="line.8748"></a>
+<span class="sourceLineNo">8749</span>    for (HStore s : stores.values()) {<a name="line.8749"></a>
+<span class="sourceLineNo">8750</span>      buf.append(s.getColumnFamilyDescriptor().getNameAsString());<a name="line.8750"></a>
+<span class="sourceLineNo">8751</span>      buf.append(" size: ");<a name="line.8751"></a>
+<span class="sourceLineNo">8752</span>      buf.append(s.getMemStoreSize().getDataSize());<a name="line.8752"></a>
+<span class="sourceLineNo">8753</span>      buf.append(" ");<a name="line.8753"></a>
+<span class="sourceLineNo">8754</span>    }<a name="line.8754"></a>
+<span class="sourceLineNo">8755</span>    buf.append("end-of-stores");<a name="line.8755"></a>
+<span class="sourceLineNo">8756</span>    buf.append(", memstore size ");<a name="line.8756"></a>
+<span class="sourceLineNo">8757</span>    buf.append(getMemStoreDataSize());<a name="line.8757"></a>
+<span class="sourceLineNo">8758</span>    if (getRegionInfo().getRegionNameAsString().startsWith(regionName)) {<a name="line.8758"></a>
+<span class="sourceLineNo">8759</span>      throw new RuntimeException(buf.toString());<a name="line.8759"></a>
+<span class="sourceLineNo">8760</span>    }<a name="line.8760"></a>
+<span class="sourceLineNo">8761</span>  }<a name="line.8761"></a>
+<span class="sourceLineNo">8762</span><a name="line.8762"></a>
+<span class="sourceLineNo">8763</span>  @Override<a name="line.8763"></a>
+<span class="sourceLineNo">8764</span>  public void requestCompaction(String why, int priority, boolean major,<a name="line.8764"></a>
+<span class="sourceLineNo">8765</span>      CompactionLifeCycleTracker tracker) throws IOException {<a name="line.8765"></a>
+<span class="sourceLineNo">8766</span>    if (major) {<a name="line.8766"></a>
+<span class="sourceLineNo">8767</span>      stores.values().forEach(HStore::triggerMajorCompaction);<a name="line.8767"></a>
+<span class="sourceLineNo">8768</span>    }<a name="line.8768"></a>
+<span class="sourceLineNo">8769</span>    rsServices.getCompactionRequestor().requestCompaction(this, why, priority, tracker,<a name="line.8769"></a>
+<span class="sourceLineNo">8770</span>        RpcServer.getRequestUser().orElse(null));<a name="line.8770"></a>
+<span class="sourceLineNo">8771</span>  }<a name="line.8771"></a>
+<span class="sourceLineNo">8772</span><a name="line.8772"></a>
+<span class="sourceLineNo">8773</span>  @Override<a name="line.8773"></a>
+<span class="sourceLineNo">8774</span>  public void requestCompaction(byte[] family, String why, int priority, boolean major,<a name="line.8774"></a>
+<span class="sourceLineNo">8775</span>      CompactionLifeCycleTracker tracker) throws IOException {<a name="line.8775"></a>
+<span class="sourceLineNo">8776</span>    HStore store = stores.get(family);<a name="line.8776"></a>
+<span class="sourceLineNo">8777</span>    if (store == null) {<a name="line.8777"></a>
+<span class="sourceLineNo">8778</span>      throw new NoSuchColumnFamilyException("column family " + Bytes.toString(family) +<a name="line.8778"></a>
+<span class="sourceLineNo">8779</span>          " does not exist in region " + getRegionInfo().getRegionNameAsString());<a name="line.8779"></a>
+<span class="sourceLineNo">8780</span>    }<a name="line.8780"></a>
+<span class="sourceLineNo">8781</span>    if (major) {<a name="line.8781"></a>
+<span class="sourceLineNo">8782</span>      store.triggerMajorCompaction();<a name="line.8782"></a>
+<span class="sourceLineNo">8783</span>    }<a name="line.8783"></a>
+<span class="sourceLineNo">8784</span>    rsServices.getCompactionRequestor().requestCompaction(this, store, why, priority, tracker,<a name="line.8784"></a>
+<span class="sourceLineNo">8785</span>        RpcServer.getRequestUser().orElse(null));<a name="line.8785"></a>
+<span class="sourceLineNo">8786</span>  }<a name="line.8786"></a>
+<span class="sourceLineNo">8787</span><a name="line.8787"></a>
+<span class="sourceLineNo">8788</span>  private void requestFlushIfNeeded() throws RegionTooBusyException {<a name="line.8788"></a>
+<span class="sourceLineNo">8789</span>    if(isFlushSize(this.memStoreSizing.getMemStoreSize())) {<a name="line.8789"></a>
+<span class="sourceLineNo">8790</span>      requestFlush();<a name="line.8790"></a>
+<span class="sourceLineNo">8791</span>    }<a name="line.8791"></a>
+<span class="sourceLineNo">8792</span>  }<a name="line.8792"></a>
+<span class="sourceLineNo">8793</span><a name="line.8793"></a>
+<span class="sourceLineNo">8794</span>  private void requestFlush() {<a name="line.8794"></a>
+<span class="sourceLineNo">8795</span>    if (this.rsServices == null) {<a name="line.8795"></a>
+<span class="sourceLineNo">8796</span>      return;<a name="line.8796"></a>
+<span class="sourceLineNo">8797</span>    }<a name="line.8797"></a>
+<span class="sourceLineNo">8798</span>    requestFlush0(FlushLifeCycleTracker.DUMMY);<a name="line.8798"></a>
+<span class="sourceLineNo">8799</span>  }<a name="line.8799"></a>
+<span class="sourceLineNo">8800</span><a name="line.8800"></a>
+<span class="sourceLineNo">8801</span>  private void requestFlush0(FlushLifeCycleTracker tracker) {<a name="line.8801"></a>
+<span class="sourceLineNo">8802</span>    boolean shouldFlush = false;<a name="line.8802"></a>
+<span class="sourceLineNo">8803</span>    synchronized (writestate) {<a name="line.8803"></a>
+<span class="sourceLineNo">8804</span>      if (!this.writestate.isFlushRequested()) {<a name="line.8804"></a>
+<span class="sourceLineNo">8805</span>        shouldFlush = true;<a name="line.8805"></a>
+<span class="sourceLineNo">8806</span>        writestate.flushRequested = true;<a name="line.8806"></a>
+<span class="sourceLineNo">8807</span>      }<a name="line.8807"></a>
+<span class="sourceLineNo">8808</span>    }<a name="line.8808"></a>
+<span class="sourceLineNo">8809</span>    if (shouldFlush) {<a name="line.8809"></a>
+<span class="sourceLineNo">8810</span>      // Make request outside of synchronize block; HBASE-818.<a name="line.8810"></a>
+<span class="sourceLineNo">8811</span>      this.rsServices.getFlushRequester().requestFlush(this, false, tracker);<a name="line.8811"></a>
+<span class="sourceLineNo">8812</span>      if (LOG.isDebugEnabled()) {<a name="line.8812"></a>
+<span class="sourceLineNo">8813</span>        LOG.debug("Flush requested on " + this.getRegionInfo().getEncodedName());<a name="line.8813"></a>
+<span class="sourceLineNo">8814</span>      }<a name="line.8814"></a>
+<span class="sourceLineNo">8815</span>    } else {<a name="line.8815"></a>
+<span class="sourceLineNo">8816</span>      tracker.notExecuted("Flush already requested on " + this);<a name="line.8816"></a>
+<span class="sourceLineNo">8817</span>    }<a name="line.8817"></a>
 <span class="sourceLineNo">8818</span>  }<a name="line.8818"></a>
 <span class="sourceLineNo">8819</span><a name="line.8819"></a>
-<span class="sourceLineNo">8820</span>  /**<a name="line.8820"></a>
-<span class="sourceLineNo">8821</span>   * This method modifies the region's configuration in order to inject replication-related<a name="line.8821"></a>
-<span class="sourceLineNo">8822</span>   * features<a name="line.8822"></a>
-<span class="sourceLineNo">8823</span>   * @param conf region configurations<a name="line.8823"></a>
-<span class="sourceLineNo">8824</span>   */<a name="line.8824"></a>
-<span class="sourceLineNo">8825</span>  static void decorateRegionConfiguration(Configuration conf) {<a name="line.8825"></a>
-<span class="sourceLineNo">8826</span>    if (ReplicationUtils.isReplicationForBulkLoadDataEnabled(conf)) {<a name="line.8826"></a>
-<span class="sourceLineNo">8827</span>      String plugins = conf.get(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY,"");<a name="line.8827"></a>
-<span class="sourceLineNo">8828</span>      String replicationCoprocessorClass = ReplicationObserver.class.getCanonicalName();<a name="line.8828"></a>
-<span class="sourceLineNo">8829</span>      if (!plugins.contains(replicationCoprocessorClass)) {<a name="line.8829"></a>
-<span class="sourceLineNo">8830</span>        conf.set(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY,<a name="line.8830"></a>
-<span class="sourceLineNo">8831</span>            (plugins.equals("") ? "" : (plugins + ",")) + replicationCoprocessorClass);<a name="line.8831"></a>
-<span class="sourceLineNo">8832</span>      }<a name="line.8832"></a>
-<span class="sourceLineNo">8833</span>    }<a name="line.8833"></a>
-<span class="sourceLineNo">8834</span>  }<a name="line.8834"></a>
-<span class="sourceLineNo">8835</span>}<a name="line.8835"></a>
+<span class="sourceLineNo">8820</span>  @Override<a name="line.8820"></a>
+<span class="sourceLineNo">8821</span>  public void requestFlush(FlushLifeCycleTracker tracker) throws IOException {<a name="line.8821"></a>
+<span class="sourceLineNo">8822</span>    requestFlush0(tracker);<a name="line.8822"></a>
+<span class="sourceLineNo">8823</span>  }<a name="line.8823"></a>
+<span class="sourceLineNo">8824</span><a name="line.8824"></a>
+<span class="sourceLineNo">8825</span>  /**<a name="line.8825"></a>
+<span class="sourceLineNo">8826</span>   * This method modifies the region's configuration in order to inject replication-related<a name="line.8826"></a>
+<span class="sourceLineNo">8827</span>   * features<a name="line.8827"></a>
+<span class="sourceLineNo">8828</span>   * @param conf region configurations<a name="line.8828"></a>
+<span class="sourceLineNo">8829</span>   */<a name="line.8829"></a>
+<span class="sourceLineNo">8830</span>  static void decorateRegionConfiguration(Configuration conf) {<a name="line.8830"></a>
+<span class="sourceLineNo">8831</span>    if (ReplicationUtils.isReplicationForBulkLoadDataEnabled(conf)) {<a name="line.8831"></a>
+<span class="sourceLineNo">8832</span>      String plugins = conf.get(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY,"");<a name="line.8832"></a>
+<span class="sourceLineNo">8833</span>      String replicationCoprocessorClass = ReplicationObserver.class.getCanonicalName();<a name="line.8833"></a>
+<span class="sourceLineNo">8834</span>      if (!plugins.contains(replicationCoprocessorClass)) {<a name="line.8834"></a>
+<span class="sourceLineNo">8835</span>        conf.set(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY,<a name="line.8835"></a>
+<span class="sourceLineNo">8836</span>            (plugins.equals("") ? "" : (plugins + ",")) + replicationCoprocessorClass);<a name="line.8836"></a>
+<span class="sourceLineNo">8837</span>      }<a name="line.8837"></a>
+<span class="sourceLineNo">8838</span>    }<a name="line.8838"></a>
+<span class="sourceLineNo">8839</span>  }<a name="line.8839"></a>
+<span class="sourceLineNo">8840</span>}<a name="line.8840"></a>
 
 
 
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 8fcec33..2147e82 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
@@ -7972,875 +7972,880 @@
 <span class="sourceLineNo">7964</span>    if (walEdit.isReplay()) {<a name="line.7964"></a>
 <span class="sourceLineNo">7965</span>      walKey.setOrigLogSeqNum(origLogSeqNum);<a name="line.7965"></a>
 <span class="sourceLineNo">7966</span>    }<a name="line.7966"></a>
-<span class="sourceLineNo">7967</span>    WriteEntry writeEntry = null;<a name="line.7967"></a>
-<span class="sourceLineNo">7968</span>    try {<a name="line.7968"></a>
-<span class="sourceLineNo">7969</span>      long txid = this.wal.append(this.getRegionInfo(), walKey, walEdit, true);<a name="line.7969"></a>
-<span class="sourceLineNo">7970</span>      // Call sync on our edit.<a name="line.7970"></a>
-<span class="sourceLineNo">7971</span>      if (txid != 0) {<a name="line.7971"></a>
-<span class="sourceLineNo">7972</span>        sync(txid, durability);<a name="line.7972"></a>
-<span class="sourceLineNo">7973</span>      }<a name="line.7973"></a>
-<span class="sourceLineNo">7974</span>      writeEntry = walKey.getWriteEntry();<a name="line.7974"></a>
-<span class="sourceLineNo">7975</span>    } catch (IOException ioe) {<a name="line.7975"></a>
-<span class="sourceLineNo">7976</span>      if (walKey != null &amp;&amp; walKey.getWriteEntry() != null) {<a name="line.7976"></a>
-<span class="sourceLineNo">7977</span>        mvcc.complete(walKey.getWriteEntry());<a name="line.7977"></a>
+<span class="sourceLineNo">7967</span>    //don't call the coproc hook for writes to the WAL caused by<a name="line.7967"></a>
+<span class="sourceLineNo">7968</span>    //system lifecycle events like flushes or compactions<a name="line.7968"></a>
+<span class="sourceLineNo">7969</span>    if (this.coprocessorHost != null &amp;&amp; !walEdit.isMetaEdit()) {<a name="line.7969"></a>
+<span class="sourceLineNo">7970</span>      this.coprocessorHost.preWALAppend(walKey, walEdit);<a name="line.7970"></a>
+<span class="sourceLineNo">7971</span>    }<a name="line.7971"></a>
+<span class="sourceLineNo">7972</span>    WriteEntry writeEntry = null;<a name="line.7972"></a>
+<span class="sourceLineNo">7973</span>    try {<a name="line.7973"></a>
+<span class="sourceLineNo">7974</span>      long txid = this.wal.append(this.getRegionInfo(), walKey, walEdit, true);<a name="line.7974"></a>
+<span class="sourceLineNo">7975</span>      // Call sync on our edit.<a name="line.7975"></a>
+<span class="sourceLineNo">7976</span>      if (txid != 0) {<a name="line.7976"></a>
+<span class="sourceLineNo">7977</span>        sync(txid, durability);<a name="line.7977"></a>
 <span class="sourceLineNo">7978</span>      }<a name="line.7978"></a>
-<span class="sourceLineNo">7979</span>      throw ioe;<a name="line.7979"></a>
-<span class="sourceLineNo">7980</span>    }<a name="line.7980"></a>
-<span class="sourceLineNo">7981</span>    return writeEntry;<a name="line.7981"></a>
-<span class="sourceLineNo">7982</span>  }<a name="line.7982"></a>
-<span class="sourceLineNo">7983</span><a name="line.7983"></a>
-<span class="sourceLineNo">7984</span>  /**<a name="line.7984"></a>
-<span class="sourceLineNo">7985</span>   * Do coprocessor pre-increment or pre-append call.<a name="line.7985"></a>
-<span class="sourceLineNo">7986</span>   * @return Result returned out of the coprocessor, which means bypass all further processing and<a name="line.7986"></a>
-<span class="sourceLineNo">7987</span>   *  return the proffered Result instead, or null which means proceed.<a name="line.7987"></a>
-<span class="sourceLineNo">7988</span>   */<a name="line.7988"></a>
-<span class="sourceLineNo">7989</span>  private Result doCoprocessorPreCall(final Operation op, final Mutation mutation)<a name="line.7989"></a>
-<span class="sourceLineNo">7990</span>  throws IOException {<a name="line.7990"></a>
-<span class="sourceLineNo">7991</span>    Result result = null;<a name="line.7991"></a>
-<span class="sourceLineNo">7992</span>    if (this.coprocessorHost != null) {<a name="line.7992"></a>
-<span class="sourceLineNo">7993</span>      switch(op) {<a name="line.7993"></a>
-<span class="sourceLineNo">7994</span>        case INCREMENT:<a name="line.7994"></a>
-<span class="sourceLineNo">7995</span>          result = this.coprocessorHost.preIncrementAfterRowLock((Increment)mutation);<a name="line.7995"></a>
-<span class="sourceLineNo">7996</span>          break;<a name="line.7996"></a>
-<span class="sourceLineNo">7997</span>        case APPEND:<a name="line.7997"></a>
-<span class="sourceLineNo">7998</span>          result = this.coprocessorHost.preAppendAfterRowLock((Append)mutation);<a name="line.7998"></a>
-<span class="sourceLineNo">7999</span>          break;<a name="line.7999"></a>
-<span class="sourceLineNo">8000</span>        default: throw new UnsupportedOperationException(op.toString());<a name="line.8000"></a>
-<span class="sourceLineNo">8001</span>      }<a name="line.8001"></a>
-<span class="sourceLineNo">8002</span>    }<a name="line.8002"></a>
-<span class="sourceLineNo">8003</span>    return result;<a name="line.8003"></a>
-<span class="sourceLineNo">8004</span>  }<a name="line.8004"></a>
-<span class="sourceLineNo">8005</span><a name="line.8005"></a>
-<span class="sourceLineNo">8006</span>  /**<a name="line.8006"></a>
-<span class="sourceLineNo">8007</span>   * Reckon the Cells to apply to WAL, memstore, and to return to the Client; these Sets are not<a name="line.8007"></a>
-<span class="sourceLineNo">8008</span>   * always the same dependent on whether to write WAL.<a name="line.8008"></a>
-<span class="sourceLineNo">8009</span>   *<a name="line.8009"></a>
-<span class="sourceLineNo">8010</span>   * @param results Fill in here what goes back to the Client if it is non-null (if null, client<a name="line.8010"></a>
-<span class="sourceLineNo">8011</span>   *  doesn't want results).<a name="line.8011"></a>
-<span class="sourceLineNo">8012</span>   * @param forMemStore Fill in here what to apply to the MemStore (by Store).<a name="line.8012"></a>
-<span class="sourceLineNo">8013</span>   * @return A WALEdit to apply to WAL or null if we are to skip the WAL.<a name="line.8013"></a>
-<span class="sourceLineNo">8014</span>   */<a name="line.8014"></a>
-<span class="sourceLineNo">8015</span>  private WALEdit reckonDeltas(Operation op, Mutation mutation, Durability effectiveDurability,<a name="line.8015"></a>
-<span class="sourceLineNo">8016</span>      Map&lt;HStore, List&lt;Cell&gt;&gt; forMemStore, List&lt;Cell&gt; results) throws IOException {<a name="line.8016"></a>
-<span class="sourceLineNo">8017</span>    WALEdit walEdit = null;<a name="line.8017"></a>
-<span class="sourceLineNo">8018</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.8018"></a>
-<span class="sourceLineNo">8019</span>    final boolean writeToWAL = effectiveDurability != Durability.SKIP_WAL;<a name="line.8019"></a>
-<span class="sourceLineNo">8020</span>    // Process a Store/family at a time.<a name="line.8020"></a>
-<span class="sourceLineNo">8021</span>    for (Map.Entry&lt;byte [], List&lt;Cell&gt;&gt; entry: mutation.getFamilyCellMap().entrySet()) {<a name="line.8021"></a>
-<span class="sourceLineNo">8022</span>      final byte[] columnFamilyName = entry.getKey();<a name="line.8022"></a>
-<span class="sourceLineNo">8023</span>      List&lt;Cell&gt; deltas = entry.getValue();<a name="line.8023"></a>
-<span class="sourceLineNo">8024</span>      // Reckon for the Store what to apply to WAL and MemStore.<a name="line.8024"></a>
-<span class="sourceLineNo">8025</span>      List&lt;Cell&gt; toApply = reckonDeltasByStore(stores.get(columnFamilyName), op, mutation,<a name="line.8025"></a>
-<span class="sourceLineNo">8026</span>        effectiveDurability, now, deltas, results);<a name="line.8026"></a>
-<span class="sourceLineNo">8027</span>      if (!toApply.isEmpty()) {<a name="line.8027"></a>
-<span class="sourceLineNo">8028</span>        for (Cell cell : toApply) {<a name="line.8028"></a>
-<span class="sourceLineNo">8029</span>          HStore store = getStore(cell);<a name="line.8029"></a>
-<span class="sourceLineNo">8030</span>          if (store == null) {<a name="line.8030"></a>
-<span class="sourceLineNo">8031</span>            checkFamily(CellUtil.cloneFamily(cell));<a name="line.8031"></a>
-<span class="sourceLineNo">8032</span>          } else {<a name="line.8032"></a>
-<span class="sourceLineNo">8033</span>            forMemStore.computeIfAbsent(store, key -&gt; new ArrayList&lt;&gt;()).add(cell);<a name="line.8033"></a>
-<span class="sourceLineNo">8034</span>          }<a name="line.8034"></a>
-<span class="sourceLineNo">8035</span>        }<a name="line.8035"></a>
-<span class="sourceLineNo">8036</span>        if (writeToWAL) {<a name="line.8036"></a>
-<span class="sourceLineNo">8037</span>          if (walEdit == null) {<a name="line.8037"></a>
-<span class="sourceLineNo">8038</span>            walEdit = new WALEdit();<a name="line.8038"></a>
+<span class="sourceLineNo">7979</span>      writeEntry = walKey.getWriteEntry();<a name="line.7979"></a>
+<span class="sourceLineNo">7980</span>    } catch (IOException ioe) {<a name="line.7980"></a>
+<span class="sourceLineNo">7981</span>      if (walKey != null &amp;&amp; walKey.getWriteEntry() != null) {<a name="line.7981"></a>
+<span class="sourceLineNo">7982</span>        mvcc.complete(walKey.getWriteEntry());<a name="line.7982"></a>
+<span class="sourceLineNo">7983</span>      }<a name="line.7983"></a>
+<span class="sourceLineNo">7984</span>      throw ioe;<a name="line.7984"></a>
+<span class="sourceLineNo">7985</span>    }<a name="line.7985"></a>
+<span class="sourceLineNo">7986</span>    return writeEntry;<a name="line.7986"></a>
+<span class="sourceLineNo">7987</span>  }<a name="line.7987"></a>
+<span class="sourceLineNo">7988</span><a name="line.7988"></a>
+<span class="sourceLineNo">7989</span>  /**<a name="line.7989"></a>
+<span class="sourceLineNo">7990</span>   * Do coprocessor pre-increment or pre-append call.<a name="line.7990"></a>
+<span class="sourceLineNo">7991</span>   * @return Result returned out of the coprocessor, which means bypass all further processing and<a name="line.7991"></a>
+<span class="sourceLineNo">7992</span>   *  return the proffered Result instead, or null which means proceed.<a name="line.7992"></a>
+<span class="sourceLineNo">7993</span>   */<a name="line.7993"></a>
+<span class="sourceLineNo">7994</span>  private Result doCoprocessorPreCall(final Operation op, final Mutation mutation)<a name="line.7994"></a>
+<span class="sourceLineNo">7995</span>  throws IOException {<a name="line.7995"></a>
+<span class="sourceLineNo">7996</span>    Result result = null;<a name="line.7996"></a>
+<span class="sourceLineNo">7997</span>    if (this.coprocessorHost != null) {<a name="line.7997"></a>
+<span class="sourceLineNo">7998</span>      switch(op) {<a name="line.7998"></a>
+<span class="sourceLineNo">7999</span>        case INCREMENT:<a name="line.7999"></a>
+<span class="sourceLineNo">8000</span>          result = this.coprocessorHost.preIncrementAfterRowLock((Increment)mutation);<a name="line.8000"></a>
+<span class="sourceLineNo">8001</span>          break;<a name="line.8001"></a>
+<span class="sourceLineNo">8002</span>        case APPEND:<a name="line.8002"></a>
+<span class="sourceLineNo">8003</span>          result = this.coprocessorHost.preAppendAfterRowLock((Append)mutation);<a name="line.8003"></a>
+<span class="sourceLineNo">8004</span>          break;<a name="line.8004"></a>
+<span class="sourceLineNo">8005</span>        default: throw new UnsupportedOperationException(op.toString());<a name="line.8005"></a>
+<span class="sourceLineNo">8006</span>      }<a name="line.8006"></a>
+<span class="sourceLineNo">8007</span>    }<a name="line.8007"></a>
+<span class="sourceLineNo">8008</span>    return result;<a name="line.8008"></a>
+<span class="sourceLineNo">8009</span>  }<a name="line.8009"></a>
+<span class="sourceLineNo">8010</span><a name="line.8010"></a>
+<span class="sourceLineNo">8011</span>  /**<a name="line.8011"></a>
+<span class="sourceLineNo">8012</span>   * Reckon the Cells to apply to WAL, memstore, and to return to the Client; these Sets are not<a name="line.8012"></a>
+<span class="sourceLineNo">8013</span>   * always the same dependent on whether to write WAL.<a name="line.8013"></a>
+<span class="sourceLineNo">8014</span>   *<a name="line.8014"></a>
+<span class="sourceLineNo">8015</span>   * @param results Fill in here what goes back to the Client if it is non-null (if null, client<a name="line.8015"></a>
+<span class="sourceLineNo">8016</span>   *  doesn't want results).<a name="line.8016"></a>
+<span class="sourceLineNo">8017</span>   * @param forMemStore Fill in here what to apply to the MemStore (by Store).<a name="line.8017"></a>
+<span class="sourceLineNo">8018</span>   * @return A WALEdit to apply to WAL or null if we are to skip the WAL.<a name="line.8018"></a>
+<span class="sourceLineNo">8019</span>   */<a name="line.8019"></a>
+<span class="sourceLineNo">8020</span>  private WALEdit reckonDeltas(Operation op, Mutation mutation, Durability effectiveDurability,<a name="line.8020"></a>
+<span class="sourceLineNo">8021</span>      Map&lt;HStore, List&lt;Cell&gt;&gt; forMemStore, List&lt;Cell&gt; results) throws IOException {<a name="line.8021"></a>
+<span class="sourceLineNo">8022</span>    WALEdit walEdit = null;<a name="line.8022"></a>
+<span class="sourceLineNo">8023</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.8023"></a>
+<span class="sourceLineNo">8024</span>    final boolean writeToWAL = effectiveDurability != Durability.SKIP_WAL;<a name="line.8024"></a>
+<span class="sourceLineNo">8025</span>    // Process a Store/family at a time.<a name="line.8025"></a>
+<span class="sourceLineNo">8026</span>    for (Map.Entry&lt;byte [], List&lt;Cell&gt;&gt; entry: mutation.getFamilyCellMap().entrySet()) {<a name="line.8026"></a>
+<span class="sourceLineNo">8027</span>      final byte[] columnFamilyName = entry.getKey();<a name="line.8027"></a>
+<span class="sourceLineNo">8028</span>      List&lt;Cell&gt; deltas = entry.getValue();<a name="line.8028"></a>
+<span class="sourceLineNo">8029</span>      // Reckon for the Store what to apply to WAL and MemStore.<a name="line.8029"></a>
+<span class="sourceLineNo">8030</span>      List&lt;Cell&gt; toApply = reckonDeltasByStore(stores.get(columnFamilyName), op, mutation,<a name="line.8030"></a>
+<span class="sourceLineNo">8031</span>        effectiveDurability, now, deltas, results);<a name="line.8031"></a>
+<span class="sourceLineNo">8032</span>      if (!toApply.isEmpty()) {<a name="line.8032"></a>
+<span class="sourceLineNo">8033</span>        for (Cell cell : toApply) {<a name="line.8033"></a>
+<span class="sourceLineNo">8034</span>          HStore store = getStore(cell);<a name="line.8034"></a>
+<span class="sourceLineNo">8035</span>          if (store == null) {<a name="line.8035"></a>
+<span class="sourceLineNo">8036</span>            checkFamily(CellUtil.cloneFamily(cell));<a name="line.8036"></a>
+<span class="sourceLineNo">8037</span>          } else {<a name="line.8037"></a>
+<span class="sourceLineNo">8038</span>            forMemStore.computeIfAbsent(store, key -&gt; new ArrayList&lt;&gt;()).add(cell);<a name="line.8038"></a>
 <span class="sourceLineNo">8039</span>          }<a name="line.8039"></a>
-<span class="sourceLineNo">8040</span>          walEdit.getCells().addAll(toApply);<a name="line.8040"></a>
-<span class="sourceLineNo">8041</span>        }<a name="line.8041"></a>
-<span class="sourceLineNo">8042</span>      }<a name="line.8042"></a>
-<span class="sourceLineNo">8043</span>    }<a name="line.8043"></a>
-<span class="sourceLineNo">8044</span>    return walEdit;<a name="line.8044"></a>
-<span class="sourceLineNo">8045</span>  }<a name="line.8045"></a>
-<span class="sourceLineNo">8046</span><a name="line.8046"></a>
-<span class="sourceLineNo">8047</span>  /**<a name="line.8047"></a>
-<span class="sourceLineNo">8048</span>   * Reckon the Cells to apply to WAL, memstore, and to return to the Client in passed<a name="line.8048"></a>
-<span class="sourceLineNo">8049</span>   * column family/Store.<a name="line.8049"></a>
-<span class="sourceLineNo">8050</span>   *<a name="line.8050"></a>
-<span class="sourceLineNo">8051</span>   * Does Get of current value and then adds passed in deltas for this Store returning the result.<a name="line.8051"></a>
-<span class="sourceLineNo">8052</span>   *<a name="line.8052"></a>
-<span class="sourceLineNo">8053</span>   * @param op Whether Increment or Append<a name="line.8053"></a>
-<span class="sourceLineNo">8054</span>   * @param mutation The encompassing Mutation object<a name="line.8054"></a>
-<span class="sourceLineNo">8055</span>   * @param deltas Changes to apply to this Store; either increment amount or data to append<a name="line.8055"></a>
-<span class="sourceLineNo">8056</span>   * @param results In here we accumulate all the Cells we are to return to the client. If null,<a name="line.8056"></a>
-<span class="sourceLineNo">8057</span>   *                client doesn't want results returned.<a name="line.8057"></a>
-<span class="sourceLineNo">8058</span>   * @return Resulting Cells after &lt;code&gt;deltas&lt;/code&gt; have been applied to current<a name="line.8058"></a>
-<span class="sourceLineNo">8059</span>   *  values. Side effect is our filling out of the &lt;code&gt;results&lt;/code&gt; List.<a name="line.8059"></a>
-<span class="sourceLineNo">8060</span>   */<a name="line.8060"></a>
-<span class="sourceLineNo">8061</span>  private List&lt;Cell&gt; reckonDeltasByStore(HStore store, Operation op, Mutation mutation,<a name="line.8061"></a>
-<span class="sourceLineNo">8062</span>      Durability effectiveDurability, long now, List&lt;Cell&gt; deltas, List&lt;Cell&gt; results)<a name="line.8062"></a>
-<span class="sourceLineNo">8063</span>      throws IOException {<a name="line.8063"></a>
-<span class="sourceLineNo">8064</span>    byte[] columnFamily = store.getColumnFamilyDescriptor().getName();<a name="line.8064"></a>
-<span class="sourceLineNo">8065</span>    List&lt;Pair&lt;Cell, Cell&gt;&gt; cellPairs = new ArrayList&lt;&gt;(deltas.size());<a name="line.8065"></a>
-<span class="sourceLineNo">8066</span>    // Get previous values for all columns in this family.<a name="line.8066"></a>
-<span class="sourceLineNo">8067</span>    TimeRange tr = null;<a name="line.8067"></a>
-<span class="sourceLineNo">8068</span>    switch (op) {<a name="line.8068"></a>
-<span class="sourceLineNo">8069</span>      case INCREMENT:<a name="line.8069"></a>
-<span class="sourceLineNo">8070</span>        tr = ((Increment)mutation).getTimeRange();<a name="line.8070"></a>
-<span class="sourceLineNo">8071</span>        break;<a name="line.8071"></a>
-<span class="sourceLineNo">8072</span>      case APPEND:<a name="line.8072"></a>
-<span class="sourceLineNo">8073</span>        tr = ((Append)mutation).getTimeRange();<a name="line.8073"></a>
-<span class="sourceLineNo">8074</span>        break;<a name="line.8074"></a>
-<span class="sourceLineNo">8075</span>      default:<a name="line.8075"></a>
+<span class="sourceLineNo">8040</span>        }<a name="line.8040"></a>
+<span class="sourceLineNo">8041</span>        if (writeToWAL) {<a name="line.8041"></a>
+<span class="sourceLineNo">8042</span>          if (walEdit == null) {<a name="line.8042"></a>
+<span class="sourceLineNo">8043</span>            walEdit = new WALEdit();<a name="line.8043"></a>
+<span class="sourceLineNo">8044</span>          }<a name="line.8044"></a>
+<span class="sourceLineNo">8045</span>          walEdit.getCells().addAll(toApply);<a name="line.8045"></a>
+<span class="sourceLineNo">8046</span>        }<a name="line.8046"></a>
+<span class="sourceLineNo">8047</span>      }<a name="line.8047"></a>
+<span class="sourceLineNo">8048</span>    }<a name="line.8048"></a>
+<span class="sourceLineNo">8049</span>    return walEdit;<a name="line.8049"></a>
+<span class="sourceLineNo">8050</span>  }<a name="line.8050"></a>
+<span class="sourceLineNo">8051</span><a name="line.8051"></a>
+<span class="sourceLineNo">8052</span>  /**<a name="line.8052"></a>
+<span class="sourceLineNo">8053</span>   * Reckon the Cells to apply to WAL, memstore, and to return to the Client in passed<a name="line.8053"></a>
+<span class="sourceLineNo">8054</span>   * column family/Store.<a name="line.8054"></a>
+<span class="sourceLineNo">8055</span>   *<a name="line.8055"></a>
+<span class="sourceLineNo">8056</span>   * Does Get of current value and then adds passed in deltas for this Store returning the result.<a name="line.8056"></a>
+<span class="sourceLineNo">8057</span>   *<a name="line.8057"></a>
+<span class="sourceLineNo">8058</span>   * @param op Whether Increment or Append<a name="line.8058"></a>
+<span class="sourceLineNo">8059</span>   * @param mutation The encompassing Mutation object<a name="line.8059"></a>
+<span class="sourceLineNo">8060</span>   * @param deltas Changes to apply to this Store; either increment amount or data to append<a name="line.8060"></a>
+<span class="sourceLineNo">8061</span>   * @param results In here we accumulate all the Cells we are to return to the client. If null,<a name="line.8061"></a>
+<span class="sourceLineNo">8062</span>   *                client doesn't want results returned.<a name="line.8062"></a>
+<span class="sourceLineNo">8063</span>   * @return Resulting Cells after &lt;code&gt;deltas&lt;/code&gt; have been applied to current<a name="line.8063"></a>
+<span class="sourceLineNo">8064</span>   *  values. Side effect is our filling out of the &lt;code&gt;results&lt;/code&gt; List.<a name="line.8064"></a>
+<span class="sourceLineNo">8065</span>   */<a name="line.8065"></a>
+<span class="sourceLineNo">8066</span>  private List&lt;Cell&gt; reckonDeltasByStore(HStore store, Operation op, Mutation mutation,<a name="line.8066"></a>
+<span class="sourceLineNo">8067</span>      Durability effectiveDurability, long now, List&lt;Cell&gt; deltas, List&lt;Cell&gt; results)<a name="line.8067"></a>
+<span class="sourceLineNo">8068</span>      throws IOException {<a name="line.8068"></a>
+<span class="sourceLineNo">8069</span>    byte[] columnFamily = store.getColumnFamilyDescriptor().getName();<a name="line.8069"></a>
+<span class="sourceLineNo">8070</span>    List&lt;Pair&lt;Cell, Cell&gt;&gt; cellPairs = new ArrayList&lt;&gt;(deltas.size());<a name="line.8070"></a>
+<span class="sourceLineNo">8071</span>    // Get previous values for all columns in this family.<a name="line.8071"></a>
+<span class="sourceLineNo">8072</span>    TimeRange tr = null;<a name="line.8072"></a>
+<span class="sourceLineNo">8073</span>    switch (op) {<a name="line.8073"></a>
+<span class="sourceLineNo">8074</span>      case INCREMENT:<a name="line.8074"></a>
+<span class="sourceLineNo">8075</span>        tr = ((Increment)mutation).getTimeRange();<a name="line.8075"></a>
 <span class="sourceLineNo">8076</span>        break;<a name="line.8076"></a>
-<span class="sourceLineNo">8077</span>    }<a name="line.8077"></a>
-<span class="sourceLineNo">8078</span>    List&lt;Cell&gt; currentValues = get(mutation, store, deltas,null, tr);<a name="line.8078"></a>
-<span class="sourceLineNo">8079</span>    // Iterate the input columns and update existing values if they were found, otherwise<a name="line.8079"></a>
-<span class="sourceLineNo">8080</span>    // add new column initialized to the delta amount<a name="line.8080"></a>
-<span class="sourceLineNo">8081</span>    int currentValuesIndex = 0;<a name="line.8081"></a>
-<span class="sourceLineNo">8082</span>    for (int i = 0; i &lt; deltas.size(); i++) {<a name="line.8082"></a>
-<span class="sourceLineNo">8083</span>      Cell delta = deltas.get(i);<a name="line.8083"></a>
-<span class="sourceLineNo">8084</span>      Cell currentValue = null;<a name="line.8084"></a>
-<span class="sourceLineNo">8085</span>      if (currentValuesIndex &lt; currentValues.size() &amp;&amp;<a name="line.8085"></a>
-<span class="sourceLineNo">8086</span>          CellUtil.matchingQualifier(currentValues.get(currentValuesIndex), delta)) {<a name="line.8086"></a>
-<span class="sourceLineNo">8087</span>        currentValue = currentValues.get(currentValuesIndex);<a name="line.8087"></a>
-<span class="sourceLineNo">8088</span>        if (i &lt; (deltas.size() - 1) &amp;&amp; !CellUtil.matchingQualifier(delta, deltas.get(i + 1))) {<a name="line.8088"></a>
-<span class="sourceLineNo">8089</span>          currentValuesIndex++;<a name="line.8089"></a>
-<span class="sourceLineNo">8090</span>        }<a name="line.8090"></a>
-<span class="sourceLineNo">8091</span>      }<a name="line.8091"></a>
-<span class="sourceLineNo">8092</span><a name="line.8092"></a>
-<span class="sourceLineNo">8093</span>      // Switch on whether this an increment or an append building the new Cell to apply.<a name="line.8093"></a>
-<span class="sourceLineNo">8094</span>      Cell newCell = null;<a name="line.8094"></a>
-<span class="sourceLineNo">8095</span>      switch (op) {<a name="line.8095"></a>
-<span class="sourceLineNo">8096</span>        case INCREMENT:<a name="line.8096"></a>
-<span class="sourceLineNo">8097</span>          long deltaAmount = getLongValue(delta);<a name="line.8097"></a>
-<span class="sourceLineNo">8098</span>          final long newValue = currentValue == null ? deltaAmount : getLongValue(currentValue) + deltaAmount;<a name="line.8098"></a>
-<span class="sourceLineNo">8099</span>          newCell = reckonDelta(delta, currentValue, columnFamily, now, mutation, (oldCell) -&gt; Bytes.toBytes(newValue));<a name="line.8099"></a>
-<span class="sourceLineNo">8100</span>          break;<a name="line.8100"></a>
-<span class="sourceLineNo">8101</span>        case APPEND:<a name="line.8101"></a>
-<span class="sourceLineNo">8102</span>          newCell = reckonDelta(delta, currentValue, columnFamily, now, mutation, (oldCell) -&gt;<a name="line.8102"></a>
-<span class="sourceLineNo">8103</span>            ByteBuffer.wrap(new byte[delta.getValueLength() + oldCell.getValueLength()])<a name="line.8103"></a>
-<span class="sourceLineNo">8104</span>                    .put(oldCell.getValueArray(), oldCell.getValueOffset(), oldCell.getValueLength())<a name="line.8104"></a>
-<span class="sourceLineNo">8105</span>                    .put(delta.getValueArray(), delta.getValueOffset(), delta.getValueLength())<a name="line.8105"></a>
-<span class="sourceLineNo">8106</span>                    .array()<a name="line.8106"></a>
-<span class="sourceLineNo">8107</span>          );<a name="line.8107"></a>
-<span class="sourceLineNo">8108</span>          break;<a name="line.8108"></a>
-<span class="sourceLineNo">8109</span>        default: throw new UnsupportedOperationException(op.toString());<a name="line.8109"></a>
-<span class="sourceLineNo">8110</span>      }<a name="line.8110"></a>
-<span class="sourceLineNo">8111</span>      int newCellSize = PrivateCellUtil.estimatedSerializedSizeOf(newCell);<a name="line.8111"></a>
-<span class="sourceLineNo">8112</span>      if (newCellSize &gt; this.maxCellSize) {<a name="line.8112"></a>
-<span class="sourceLineNo">8113</span>        String msg = "Cell with size " + newCellSize + " exceeds limit of " +<a name="line.8113"></a>
-<span class="sourceLineNo">8114</span>            this.maxCellSize + " bytes";<a name="line.8114"></a>
-<span class="sourceLineNo">8115</span>        if (LOG.isDebugEnabled()) {<a name="line.8115"></a>
-<span class="sourceLineNo">8116</span>          LOG.debug(msg);<a name="line.8116"></a>
-<span class="sourceLineNo">8117</span>        }<a name="line.8117"></a>
-<span class="sourceLineNo">8118</span>        throw new DoNotRetryIOException(msg);<a name="line.8118"></a>
-<span class="sourceLineNo">8119</span>      }<a name="line.8119"></a>
-<span class="sourceLineNo">8120</span>      cellPairs.add(new Pair&lt;&gt;(currentValue, newCell));<a name="line.8120"></a>
-<span class="sourceLineNo">8121</span>      // Add to results to get returned to the Client. If null, cilent does not want results.<a name="line.8121"></a>
-<span class="sourceLineNo">8122</span>      if (results != null) {<a name="line.8122"></a>
-<span class="sourceLineNo">8123</span>        results.add(newCell);<a name="line.8123"></a>
+<span class="sourceLineNo">8077</span>      case APPEND:<a name="line.8077"></a>
+<span class="sourceLineNo">8078</span>        tr = ((Append)mutation).getTimeRange();<a name="line.8078"></a>
+<span class="sourceLineNo">8079</span>        break;<a name="line.8079"></a>
+<span class="sourceLineNo">8080</span>      default:<a name="line.8080"></a>
+<span class="sourceLineNo">8081</span>        break;<a name="line.8081"></a>
+<span class="sourceLineNo">8082</span>    }<a name="line.8082"></a>
+<span class="sourceLineNo">8083</span>    List&lt;Cell&gt; currentValues = get(mutation, store, deltas,null, tr);<a name="line.8083"></a>
+<span class="sourceLineNo">8084</span>    // Iterate the input columns and update existing values if they were found, otherwise<a name="line.8084"></a>
+<span class="sourceLineNo">8085</span>    // add new column initialized to the delta amount<a name="line.8085"></a>
+<span class="sourceLineNo">8086</span>    int currentValuesIndex = 0;<a name="line.8086"></a>
+<span class="sourceLineNo">8087</span>    for (int i = 0; i &lt; deltas.size(); i++) {<a name="line.8087"></a>
+<span class="sourceLineNo">8088</span>      Cell delta = deltas.get(i);<a name="line.8088"></a>
+<span class="sourceLineNo">8089</span>      Cell currentValue = null;<a name="line.8089"></a>
+<span class="sourceLineNo">8090</span>      if (currentValuesIndex &lt; currentValues.size() &amp;&amp;<a name="line.8090"></a>
+<span class="sourceLineNo">8091</span>          CellUtil.matchingQualifier(currentValues.get(currentValuesIndex), delta)) {<a name="line.8091"></a>
+<span class="sourceLineNo">8092</span>        currentValue = currentValues.get(currentValuesIndex);<a name="line.8092"></a>
+<span class="sourceLineNo">8093</span>        if (i &lt; (deltas.size() - 1) &amp;&amp; !CellUtil.matchingQualifier(delta, deltas.get(i + 1))) {<a name="line.8093"></a>
+<span class="sourceLineNo">8094</span>          currentValuesIndex++;<a name="line.8094"></a>
+<span class="sourceLineNo">8095</span>        }<a name="line.8095"></a>
+<span class="sourceLineNo">8096</span>      }<a name="line.8096"></a>
+<span class="sourceLineNo">8097</span><a name="line.8097"></a>
+<span class="sourceLineNo">8098</span>      // Switch on whether this an increment or an append building the new Cell to apply.<a name="line.8098"></a>
+<span class="sourceLineNo">8099</span>      Cell newCell = null;<a name="line.8099"></a>
+<span class="sourceLineNo">8100</span>      switch (op) {<a name="line.8100"></a>
+<span class="sourceLineNo">8101</span>        case INCREMENT:<a name="line.8101"></a>
+<span class="sourceLineNo">8102</span>          long deltaAmount = getLongValue(delta);<a name="line.8102"></a>
+<span class="sourceLineNo">8103</span>          final long newValue = currentValue == null ? deltaAmount : getLongValue(currentValue) + deltaAmount;<a name="line.8103"></a>
+<span class="sourceLineNo">8104</span>          newCell = reckonDelta(delta, currentValue, columnFamily, now, mutation, (oldCell) -&gt; Bytes.toBytes(newValue));<a name="line.8104"></a>
+<span class="sourceLineNo">8105</span>          break;<a name="line.8105"></a>
+<span class="sourceLineNo">8106</span>        case APPEND:<a name="line.8106"></a>
+<span class="sourceLineNo">8107</span>          newCell = reckonDelta(delta, currentValue, columnFamily, now, mutation, (oldCell) -&gt;<a name="line.8107"></a>
+<span class="sourceLineNo">8108</span>            ByteBuffer.wrap(new byte[delta.getValueLength() + oldCell.getValueLength()])<a name="line.8108"></a>
+<span class="sourceLineNo">8109</span>                    .put(oldCell.getValueArray(), oldCell.getValueOffset(), oldCell.getValueLength())<a name="line.8109"></a>
+<span class="sourceLineNo">8110</span>                    .put(delta.getValueArray(), delta.getValueOffset(), delta.getValueLength())<a name="line.8110"></a>
+<span class="sourceLineNo">8111</span>                    .array()<a name="line.8111"></a>
+<span class="sourceLineNo">8112</span>          );<a name="line.8112"></a>
+<span class="sourceLineNo">8113</span>          break;<a name="line.8113"></a>
+<span class="sourceLineNo">8114</span>        default: throw new UnsupportedOperationException(op.toString());<a name="line.8114"></a>
+<span class="sourceLineNo">8115</span>      }<a name="line.8115"></a>
+<span class="sourceLineNo">8116</span>      int newCellSize = PrivateCellUtil.estimatedSerializedSizeOf(newCell);<a name="line.8116"></a>
+<span class="sourceLineNo">8117</span>      if (newCellSize &gt; this.maxCellSize) {<a name="line.8117"></a>
+<span class="sourceLineNo">8118</span>        String msg = "Cell with size " + newCellSize + " exceeds limit of " +<a name="line.8118"></a>
+<span class="sourceLineNo">8119</span>            this.maxCellSize + " bytes";<a name="line.8119"></a>
+<span class="sourceLineNo">8120</span>        if (LOG.isDebugEnabled()) {<a name="line.8120"></a>
+<span class="sourceLineNo">8121</span>          LOG.debug(msg);<a name="line.8121"></a>
+<span class="sourceLineNo">8122</span>        }<a name="line.8122"></a>
+<span class="sourceLineNo">8123</span>        throw new DoNotRetryIOException(msg);<a name="line.8123"></a>
 <span class="sourceLineNo">8124</span>      }<a name="line.8124"></a>
-<span class="sourceLineNo">8125</span>    }<a name="line.8125"></a>
-<span class="sourceLineNo">8126</span><a name="line.8126"></a>
-<span class="sourceLineNo">8127</span>    // Give coprocessors a chance to update the new cells before apply to WAL or memstore<a name="line.8127"></a>
-<span class="sourceLineNo">8128</span>    if (coprocessorHost != null) {<a name="line.8128"></a>
-<span class="sourceLineNo">8129</span>      // Here the operation must be increment or append.<a name="line.8129"></a>
-<span class="sourceLineNo">8130</span>      cellPairs = op == Operation.INCREMENT ?<a name="line.8130"></a>
-<span class="sourceLineNo">8131</span>          coprocessorHost.postIncrementBeforeWAL(mutation, cellPairs) :<a name="line.8131"></a>
-<span class="sourceLineNo">8132</span>          coprocessorHost.postAppendBeforeWAL(mutation, cellPairs);<a name="line.8132"></a>
-<span class="sourceLineNo">8133</span>    }<a name="line.8133"></a>
-<span class="sourceLineNo">8134</span>    return cellPairs.stream().map(Pair::getSecond).collect(Collectors.toList());<a name="line.8134"></a>
-<span class="sourceLineNo">8135</span>  }<a name="line.8135"></a>
-<span class="sourceLineNo">8136</span><a name="line.8136"></a>
-<span class="sourceLineNo">8137</span>  private static Cell reckonDelta(final Cell delta, final Cell currentCell,<a name="line.8137"></a>
-<span class="sourceLineNo">8138</span>                                  final byte[] columnFamily, final long now,<a name="line.8138"></a>
-<span class="sourceLineNo">8139</span>                                  Mutation mutation, Function&lt;Cell, byte[]&gt; supplier) throws IOException {<a name="line.8139"></a>
-<span class="sourceLineNo">8140</span>    // Forward any tags found on the delta.<a name="line.8140"></a>
-<span class="sourceLineNo">8141</span>    List&lt;Tag&gt; tags = TagUtil.carryForwardTags(delta);<a name="line.8141"></a>
-<span class="sourceLineNo">8142</span>    tags = TagUtil.carryForwardTTLTag(tags, mutation.getTTL());<a name="line.8142"></a>
-<span class="sourceLineNo">8143</span>    if (currentCell != null) {<a name="line.8143"></a>
-<span class="sourceLineNo">8144</span>      tags = TagUtil.carryForwardTags(tags, currentCell);<a name="line.8144"></a>
-<span class="sourceLineNo">8145</span>      byte[] newValue = supplier.apply(currentCell);<a name="line.8145"></a>
-<span class="sourceLineNo">8146</span>      return ExtendedCellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.8146"></a>
-<span class="sourceLineNo">8147</span>              .setRow(mutation.getRow(), 0, mutation.getRow().length)<a name="line.8147"></a>
-<span class="sourceLineNo">8148</span>              .setFamily(columnFamily, 0, columnFamily.length)<a name="line.8148"></a>
-<span class="sourceLineNo">8149</span>              // copy the qualifier if the cell is located in shared memory.<a name="line.8149"></a>
-<span class="sourceLineNo">8150</span>              .setQualifier(CellUtil.cloneQualifier(delta))<a name="line.8150"></a>
-<span class="sourceLineNo">8151</span>              .setTimestamp(Math.max(currentCell.getTimestamp() + 1, now))<a name="line.8151"></a>
-<span class="sourceLineNo">8152</span>              .setType(KeyValue.Type.Put.getCode())<a name="line.8152"></a>
-<span class="sourceLineNo">8153</span>              .setValue(newValue, 0, newValue.length)<a name="line.8153"></a>
-<span class="sourceLineNo">8154</span>              .setTags(TagUtil.fromList(tags))<a name="line.8154"></a>
-<span class="sourceLineNo">8155</span>              .build();<a name="line.8155"></a>
-<span class="sourceLineNo">8156</span>    } else {<a name="line.8156"></a>
-<span class="sourceLineNo">8157</span>      PrivateCellUtil.updateLatestStamp(delta, now);<a name="line.8157"></a>
-<span class="sourceLineNo">8158</span>      return CollectionUtils.isEmpty(tags) ? delta : PrivateCellUtil.createCell(delta, tags);<a name="line.8158"></a>
-<span class="sourceLineNo">8159</span>    }<a name="line.8159"></a>
-<span class="sourceLineNo">8160</span>  }<a name="line.8160"></a>
-<span class="sourceLineNo">8161</span><a name="line.8161"></a>
-<span class="sourceLineNo">8162</span>  /**<a name="line.8162"></a>
-<span class="sourceLineNo">8163</span>   * @return Get the long out of the passed in Cell<a name="line.8163"></a>
-<span class="sourceLineNo">8164</span>   */<a name="line.8164"></a>
-<span class="sourceLineNo">8165</span>  private static long getLongValue(final Cell cell) throws DoNotRetryIOException {<a name="line.8165"></a>
-<span class="sourceLineNo">8166</span>    int len = cell.getValueLength();<a name="line.8166"></a>
-<span class="sourceLineNo">8167</span>    if (len != Bytes.SIZEOF_LONG) {<a name="line.8167"></a>
-<span class="sourceLineNo">8168</span>      // throw DoNotRetryIOException instead of IllegalArgumentException<a name="line.8168"></a>
-<span class="sourceLineNo">8169</span>      throw new DoNotRetryIOException("Field is not a long, it's " + len + " bytes wide");<a name="line.8169"></a>
-<span class="sourceLineNo">8170</span>    }<a name="line.8170"></a>
-<span class="sourceLineNo">8171</span>    return PrivateCellUtil.getValueAsLong(cell);<a name="line.8171"></a>
-<span class="sourceLineNo">8172</span>  }<a name="line.8172"></a>
-<span class="sourceLineNo">8173</span><a name="line.8173"></a>
-<span class="sourceLineNo">8174</span>  /**<a name="line.8174"></a>
-<span class="sourceLineNo">8175</span>   * Do a specific Get on passed &lt;code&gt;columnFamily&lt;/code&gt; and column qualifiers.<a name="line.8175"></a>
-<span class="sourceLineNo">8176</span>   * @param mutation Mutation we are doing this Get for.<a name="line.8176"></a>
-<span class="sourceLineNo">8177</span>   * @param store Which column family on row (TODO: Go all Gets in one go)<a name="line.8177"></a>
-<span class="sourceLineNo">8178</span>   * @param coordinates Cells from &lt;code&gt;mutation&lt;/code&gt; used as coordinates applied to Get.<a name="line.8178"></a>
-<span class="sourceLineNo">8179</span>   * @return Return list of Cells found.<a name="line.8179"></a>
-<span class="sourceLineNo">8180</span>   */<a name="line.8180"></a>
-<span class="sourceLineNo">8181</span>  private List&lt;Cell&gt; get(Mutation mutation, HStore store, List&lt;Cell&gt; coordinates,<a name="line.8181"></a>
-<span class="sourceLineNo">8182</span>      IsolationLevel isolation, TimeRange tr) throws IOException {<a name="line.8182"></a>
-<span class="sourceLineNo">8183</span>    // Sort the cells so that they match the order that they appear in the Get results. Otherwise,<a name="line.8183"></a>
-<span class="sourceLineNo">8184</span>    // we won't be able to find the existing values if the cells are not specified in order by the<a name="line.8184"></a>
-<span class="sourceLineNo">8185</span>    // client since cells are in an array list.<a name="line.8185"></a>
-<span class="sourceLineNo">8186</span>    // TODO: I don't get why we are sorting. St.Ack 20150107<a name="line.8186"></a>
-<span class="sourceLineNo">8187</span>    sort(coordinates, store.getComparator());<a name="line.8187"></a>
-<span class="sourceLineNo">8188</span>    Get get = new Get(mutation.getRow());<a name="line.8188"></a>
-<span class="sourceLineNo">8189</span>    if (isolation != null) {<a name="line.8189"></a>
-<span class="sourceLineNo">8190</span>      get.setIsolationLevel(isolation);<a name="line.8190"></a>
-<span class="sourceLineNo">8191</span>    }<a name="line.8191"></a>
-<span class="sourceLineNo">8192</span>    for (Cell cell: coordinates) {<a name="line.8192"></a>
-<span class="sourceLineNo">8193</span>      get.addColumn(store.getColumnFamilyDescriptor().getName(), CellUtil.cloneQualifier(cell));<a name="line.8193"></a>
-<span class="sourceLineNo">8194</span>    }<a name="line.8194"></a>
-<span class="sourceLineNo">8195</span>    // Increments carry time range. If an Increment instance, put it on the Get.<a name="line.8195"></a>
-<span class="sourceLineNo">8196</span>    if (tr != null) {<a name="line.8196"></a>
-<span class="sourceLineNo">8197</span>      get.setTimeRange(tr.getMin(), tr.getMax());<a name="line.8197"></a>
-<span class="sourceLineNo">8198</span>    }<a name="line.8198"></a>
-<span class="sourceLineNo">8199</span>    return get(get, false);<a name="line.8199"></a>
-<span class="sourceLineNo">8200</span>  }<a name="line.8200"></a>
-<span class="sourceLineNo">8201</span><a name="line.8201"></a>
-<span class="sourceLineNo">8202</span>  /**<a name="line.8202"></a>
-<span class="sourceLineNo">8203</span>   * @return Sorted list of &lt;code&gt;cells&lt;/code&gt; using &lt;code&gt;comparator&lt;/code&gt;<a name="line.8203"></a>
-<span class="sourceLineNo">8204</span>   */<a name="line.8204"></a>
-<span class="sourceLineNo">8205</span>  private static List&lt;Cell&gt; sort(List&lt;Cell&gt; cells, final CellComparator comparator) {<a name="line.8205"></a>
-<span class="sourceLineNo">8206</span>    cells.sort(comparator);<a name="line.8206"></a>
-<span class="sourceLineNo">8207</span>    return cells;<a name="line.8207"></a>
-<span class="sourceLineNo">8208</span>  }<a name="line.8208"></a>
-<span class="sourceLineNo">8209</span><a name="line.8209"></a>
-<span class="sourceLineNo">8210</span>  public static final long FIXED_OVERHEAD = ClassSize.align(<a name="line.8210"></a>
-<span class="sourceLineNo">8211</span>      ClassSize.OBJECT +<a name="line.8211"></a>
-<span class="sourceLineNo">8212</span>      ClassSize.ARRAY +<a name="line.8212"></a>
-<span class="sourceLineNo">8213</span>      55 * ClassSize.REFERENCE + 3 * Bytes.SIZEOF_INT +<a name="line.8213"></a>
-<span class="sourceLineNo">8214</span>      (15 * Bytes.SIZEOF_LONG) +<a name="line.8214"></a>
-<span class="sourceLineNo">8215</span>      3 * Bytes.SIZEOF_BOOLEAN);<a name="line.8215"></a>
-<span class="sourceLineNo">8216</span><a name="line.8216"></a>
-<span class="sourceLineNo">8217</span>  // woefully out of date - currently missing:<a name="line.8217"></a>
-<span class="sourceLineNo">8218</span>  // 1 x HashMap - coprocessorServiceHandlers<a name="line.8218"></a>
-<span class="sourceLineNo">8219</span>  // 6 x LongAdder - numMutationsWithoutWAL, dataInMemoryWithoutWAL,<a name="line.8219"></a>
-<span class="sourceLineNo">8220</span>  //   checkAndMutateChecksPassed, checkAndMutateChecksFailed, readRequestsCount,<a name="line.8220"></a>
-<span class="sourceLineNo">8221</span>  //   writeRequestsCount, cpRequestsCount<a name="line.8221"></a>
-<span class="sourceLineNo">8222</span>  // 1 x HRegion$WriteState - writestate<a name="line.8222"></a>
-<span class="sourceLineNo">8223</span>  // 1 x RegionCoprocessorHost - coprocessorHost<a name="line.8223"></a>
-<span class="sourceLineNo">8224</span>  // 1 x RegionSplitPolicy - splitPolicy<a name="line.8224"></a>
-<span class="sourceLineNo">8225</span>  // 1 x MetricsRegion - metricsRegion<a name="line.8225"></a>
-<span class="sourceLineNo">8226</span>  // 1 x MetricsRegionWrapperImpl - metricsRegionWrapper<a name="line.8226"></a>
-<span class="sourceLineNo">8227</span>  public static final long DEEP_OVERHEAD = FIXED_OVERHEAD +<a name="line.8227"></a>
-<span class="sourceLineNo">8228</span>      ClassSize.OBJECT + // closeLock<a name="line.8228"></a>
-<span class="sourceLineNo">8229</span>      (2 * ClassSize.ATOMIC_BOOLEAN) + // closed, closing<a name="line.8229"></a>
-<span class="sourceLineNo">8230</span>      (3 * ClassSize.ATOMIC_LONG) + // numPutsWithoutWAL, dataInMemoryWithoutWAL,<a name="line.8230"></a>
-<span class="sourceLineNo">8231</span>                                    // compactionsFailed<a name="line.8231"></a>
-<span class="sourceLineNo">8232</span>      (2 * ClassSize.CONCURRENT_HASHMAP) +  // lockedRows, scannerReadPoints<a name="line.8232"></a>
-<span class="sourceLineNo">8233</span>      WriteState.HEAP_SIZE + // writestate<a name="line.8233"></a>
-<span class="sourceLineNo">8234</span>      ClassSize.CONCURRENT_SKIPLISTMAP + ClassSize.CONCURRENT_SKIPLISTMAP_ENTRY + // stores<a name="line.8234"></a>
-<span class="sourceLineNo">8235</span>      (2 * ClassSize.REENTRANT_LOCK) + // lock, updatesLock<a name="line.8235"></a>
-<span class="sourceLineNo">8236</span>      MultiVersionConcurrencyControl.FIXED_SIZE // mvcc<a name="line.8236"></a>
-<span class="sourceLineNo">8237</span>      + 2 * ClassSize.TREEMAP // maxSeqIdInStores, replicationScopes<a name="line.8237"></a>
-<span class="sourceLineNo">8238</span>      + 2 * ClassSize.ATOMIC_INTEGER // majorInProgress, minorInProgress<a name="line.8238"></a>
-<span class="sourceLineNo">8239</span>      + ClassSize.STORE_SERVICES // store services<a name="line.8239"></a>
-<span class="sourceLineNo">8240</span>      + StoreHotnessProtector.FIXED_SIZE<a name="line.8240"></a>
-<span class="sourceLineNo">8241</span>      ;<a name="line.8241"></a>
-<span class="sourceLineNo">8242</span><a name="line.8242"></a>
-<span class="sourceLineNo">8243</span>  @Override<a name="line.8243"></a>
-<span class="sourceLineNo">8244</span>  public long heapSize() {<a name="line.8244"></a>
-<span class="sourceLineNo">8245</span>    // this does not take into account row locks, recent flushes, mvcc entries, and more<a name="line.8245"></a>
-<span class="sourceLineNo">8246</span>    return DEEP_OVERHEAD + stores.values().stream().mapToLong(HStore::heapSize).sum();<a name="line.8246"></a>
-<span class="sourceLineNo">8247</span>  }<a name="line.8247"></a>
-<span class="sourceLineNo">8248</span><a name="line.8248"></a>
-<span class="sourceLineNo">8249</span>  /**<a name="line.8249"></a>
-<span class="sourceLineNo">8250</span>   * Registers a new protocol buffer {@link Service} subclass as a coprocessor endpoint to<a name="line.8250"></a>
-<span class="sourceLineNo">8251</span>   * be available for handling Region#execService(com.google.protobuf.RpcController,<a name="line.8251"></a>
-<span class="sourceLineNo">8252</span>   *    org.apache.hadoop.hbase.protobuf.generated.ClientProtos.CoprocessorServiceCall) calls.<a name="line.8252"></a>
-<span class="sourceLineNo">8253</span>   *<a name="line.8253"></a>
-<span class="sourceLineNo">8254</span>   * &lt;p&gt;<a name="line.8254"></a>
-<span class="sourceLineNo">8255</span>   * Only a single instance may be registered per region for a given {@link Service} subclass (the<a name="line.8255"></a>
-<span class="sourceLineNo">8256</span>   * instances are keyed on {@link com.google.protobuf.Descriptors.ServiceDescriptor#getFullName()}.<a name="line.8256"></a>
-<span class="sourceLineNo">8257</span>   * After the first registration, subsequent calls with the same service name will fail with<a name="line.8257"></a>
-<span class="sourceLineNo">8258</span>   * a return value of {@code false}.<a name="line.8258"></a>
-<span class="sourceLineNo">8259</span>   * &lt;/p&gt;<a name="line.8259"></a>
-<span class="sourceLineNo">8260</span>   * @param instance the {@code Service} subclass instance to expose as a coprocessor endpoint<a name="line.8260"></a>
-<span class="sourceLineNo">8261</span>   * @return {@code true} if the registration was successful, {@code false}<a name="line.8261"></a>
-<span class="sourceLineNo">8262</span>   * otherwise<a name="line.8262"></a>
-<span class="sourceLineNo">8263</span>   */<a name="line.8263"></a>
-<span class="sourceLineNo">8264</span>  public boolean registerService(com.google.protobuf.Service instance) {<a name="line.8264"></a>
-<span class="sourceLineNo">8265</span>    /*<a name="line.8265"></a>
-<span class="sourceLineNo">8266</span>     * No stacking of instances is allowed for a single service name<a name="line.8266"></a>
-<span class="sourceLineNo">8267</span>     */<a name="line.8267"></a>
-<span class="sourceLineNo">8268</span>    com.google.protobuf.Descriptors.ServiceDescriptor serviceDesc = instance.getDescriptorForType();<a name="line.8268"></a>
-<span class="sourceLineNo">8269</span>    String serviceName = CoprocessorRpcUtils.getServiceName(serviceDesc);<a name="line.8269"></a>
-<span class="sourceLineNo">8270</span>    if (coprocessorServiceHandlers.containsKey(serviceName)) {<a name="line.8270"></a>
-<span class="sourceLineNo">8271</span>      LOG.error("Coprocessor service " + serviceName +<a name="line.8271"></a>
-<span class="sourceLineNo">8272</span>          " already registered, rejecting request from " + instance);<a name="line.8272"></a>
-<span class="sourceLineNo">8273</span>      return false;<a name="line.8273"></a>
-<span class="sourceLineNo">8274</span>    }<a name="line.8274"></a>
-<span class="sourceLineNo">8275</span><a name="line.8275"></a>
-<span class="sourceLineNo">8276</span>    coprocessorServiceHandlers.put(serviceName, instance);<a name="line.8276"></a>
-<span class="sourceLineNo">8277</span>    if (LOG.isDebugEnabled()) {<a name="line.8277"></a>
-<span class="sourceLineNo">8278</span>      LOG.debug("Registered coprocessor service: region=" +<a name="line.8278"></a>
-<span class="sourceLineNo">8279</span>          Bytes.toStringBinary(getRegionInfo().getRegionName()) +<a name="line.8279"></a>
-<span class="sourceLineNo">8280</span>          " service=" + serviceName);<a name="line.8280"></a>
-<span class="sourceLineNo">8281</span>    }<a name="line.8281"></a>
-<span class="sourceLineNo">8282</span>    return true;<a name="line.8282"></a>
-<span class="sourceLineNo">8283</span>  }<a name="line.8283"></a>
-<span class="sourceLineNo">8284</span><a name="line.8284"></a>
-<span class="sourceLineNo">8285</span>  /**<a name="line.8285"></a>
-<span class="sourceLineNo">8286</span>   * Executes a single protocol buffer coprocessor endpoint {@link Service} method using<a name="line.8286"></a>
-<span class="sourceLineNo">8287</span>   * the registered protocol handlers.  {@link Service} implementations must be registered via the<a name="line.8287"></a>
-<span class="sourceLineNo">8288</span>   * {@link #registerService(com.google.protobuf.Service)}<a name="line.8288"></a>
-<span class="sourceLineNo">8289</span>   * method before they are available.<a name="line.8289"></a>
-<span class="sourceLineNo">8290</span>   *<a name="line.8290"></a>
-<span class="sourceLineNo">8291</span>   * @param controller an {@code RpcContoller} implementation to pass to the invoked service<a name="line.8291"></a>
-<span class="sourceLineNo">8292</span>   * @param call a {@code CoprocessorServiceCall} instance identifying the service, method,<a name="line.8292"></a>
-<span class="sourceLineNo">8293</span>   *     and parameters for the method invocation<a name="line.8293"></a>
-<span class="sourceLineNo">8294</span>   * @return a protocol buffer {@code Message} instance containing the method's result<a name="line.8294"></a>
-<span class="sourceLineNo">8295</span>   * @throws IOException if no registered service handler is found or an error<a name="line.8295"></a>
-<span class="sourceLineNo">8296</span>   *     occurs during the invocation<a name="line.8296"></a>
-<span class="sourceLineNo">8297</span>   * @see #registerService(com.google.protobuf.Service)<a name="line.8297"></a>
-<span class="sourceLineNo">8298</span>   */<a name="line.8298"></a>
-<span class="sourceLineNo">8299</span>  public com.google.protobuf.Message execService(com.google.protobuf.RpcController controller,<a name="line.8299"></a>
-<span class="sourceLineNo">8300</span>      CoprocessorServiceCall call) throws IOException {<a name="line.8300"></a>
-<span class="sourceLineNo">8301</span>    String serviceName = call.getServiceName();<a name="line.8301"></a>
-<span class="sourceLineNo">8302</span>    com.google.protobuf.Service service = coprocessorServiceHandlers.get(serviceName);<a name="line.8302"></a>
-<span class="sourceLineNo">8303</span>    if (service == null) {<a name="line.8303"></a>
-<span class="sourceLineNo">8304</span>      throw new UnknownProtocolException(null, "No registered coprocessor service found for " +<a name="line.8304"></a>
-<span class="sourceLineNo">8305</span>          serviceName + " in region " + Bytes.toStringBinary(getRegionInfo().getRegionName()));<a name="line.8305"></a>
-<span class="sourceLineNo">8306</span>    }<a name="line.8306"></a>
-<span class="sourceLineNo">8307</span>    com.google.protobuf.Descriptors.ServiceDescriptor serviceDesc = service.getDescriptorForType();<a name="line.8307"></a>
-<span class="sourceLineNo">8308</span><a name="line.8308"></a>
-<span class="sourceLineNo">8309</span>    cpRequestsCount.increment();<a name="line.8309"></a>
-<span class="sourceLineNo">8310</span>    String methodName = call.getMethodName();<a name="line.8310"></a>
-<span class="sourceLineNo">8311</span>    com.google.protobuf.Descriptors.MethodDescriptor methodDesc =<a name="line.8311"></a>
-<span class="sourceLineNo">8312</span>        CoprocessorRpcUtils.getMethodDescriptor(methodName, serviceDesc);<a name="line.8312"></a>
+<span class="sourceLineNo">8125</span>      cellPairs.add(new Pair&lt;&gt;(currentValue, newCell));<a name="line.8125"></a>
+<span class="sourceLineNo">8126</span>      // Add to results to get returned to the Client. If null, cilent does not want results.<a name="line.8126"></a>
+<span class="sourceLineNo">8127</span>      if (results != null) {<a name="line.8127"></a>
+<span class="sourceLineNo">8128</span>        results.add(newCell);<a name="line.8128"></a>
+<span class="sourceLineNo">8129</span>      }<a name="line.8129"></a>
+<span class="sourceLineNo">8130</span>    }<a name="line.8130"></a>
+<span class="sourceLineNo">8131</span><a name="line.8131"></a>
+<span class="sourceLineNo">8132</span>    // Give coprocessors a chance to update the new cells before apply to WAL or memstore<a name="line.8132"></a>
+<span class="sourceLineNo">8133</span>    if (coprocessorHost != null) {<a name="line.8133"></a>
+<span class="sourceLineNo">8134</span>      // Here the operation must be increment or append.<a name="line.8134"></a>
+<span class="sourceLineNo">8135</span>      cellPairs = op == Operation.INCREMENT ?<a name="line.8135"></a>
+<span class="sourceLineNo">8136</span>          coprocessorHost.postIncrementBeforeWAL(mutation, cellPairs) :<a name="line.8136"></a>
+<span class="sourceLineNo">8137</span>          coprocessorHost.postAppendBeforeWAL(mutation, cellPairs);<a name="line.8137"></a>
+<span class="sourceLineNo">8138</span>    }<a name="line.8138"></a>
+<span class="sourceLineNo">8139</span>    return cellPairs.stream().map(Pair::getSecond).collect(Collectors.toList());<a name="line.8139"></a>
+<span class="sourceLineNo">8140</span>  }<a name="line.8140"></a>
+<span class="sourceLineNo">8141</span><a name="line.8141"></a>
+<span class="sourceLineNo">8142</span>  private static Cell reckonDelta(final Cell delta, final Cell currentCell,<a name="line.8142"></a>
+<span class="sourceLineNo">8143</span>                                  final byte[] columnFamily, final long now,<a name="line.8143"></a>
+<span class="sourceLineNo">8144</span>                                  Mutation mutation, Function&lt;Cell, byte[]&gt; supplier) throws IOException {<a name="line.8144"></a>
+<span class="sourceLineNo">8145</span>    // Forward any tags found on the delta.<a name="line.8145"></a>
+<span class="sourceLineNo">8146</span>    List&lt;Tag&gt; tags = TagUtil.carryForwardTags(delta);<a name="line.8146"></a>
+<span class="sourceLineNo">8147</span>    tags = TagUtil.carryForwardTTLTag(tags, mutation.getTTL());<a name="line.8147"></a>
+<span class="sourceLineNo">8148</span>    if (currentCell != null) {<a name="line.8148"></a>
+<span class="sourceLineNo">8149</span>      tags = TagUtil.carryForwardTags(tags, currentCell);<a name="line.8149"></a>
+<span class="sourceLineNo">8150</span>      byte[] newValue = supplier.apply(currentCell);<a name="line.8150"></a>
+<span class="sourceLineNo">8151</span>      return ExtendedCellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.8151"></a>
+<span class="sourceLineNo">8152</span>              .setRow(mutation.getRow(), 0, mutation.getRow().length)<a name="line.8152"></a>
+<span class="sourceLineNo">8153</span>              .setFamily(columnFamily, 0, columnFamily.length)<a name="line.8153"></a>
+<span class="sourceLineNo">8154</span>              // copy the qualifier if the cell is located in shared memory.<a name="line.8154"></a>
+<span class="sourceLineNo">8155</span>              .setQualifier(CellUtil.cloneQualifier(delta))<a name="line.8155"></a>
+<span class="sourceLineNo">8156</span>              .setTimestamp(Math.max(currentCell.getTimestamp() + 1, now))<a name="line.8156"></a>
+<span class="sourceLineNo">8157</span>              .setType(KeyValue.Type.Put.getCode())<a name="line.8157"></a>
+<span class="sourceLineNo">8158</span>              .setValue(newValue, 0, newValue.length)<a name="line.8158"></a>
+<span class="sourceLineNo">8159</span>              .setTags(TagUtil.fromList(tags))<a name="line.8159"></a>
+<span class="sourceLineNo">8160</span>              .build();<a name="line.8160"></a>
+<span class="sourceLineNo">8161</span>    } else {<a name="line.8161"></a>
+<span class="sourceLineNo">8162</span>      PrivateCellUtil.updateLatestStamp(delta, now);<a name="line.8162"></a>
+<span class="sourceLineNo">8163</span>      return CollectionUtils.isEmpty(tags) ? delta : PrivateCellUtil.createCell(delta, tags);<a name="line.8163"></a>
+<span class="sourceLineNo">8164</span>    }<a name="line.8164"></a>
+<span class="sourceLineNo">8165</span>  }<a name="line.8165"></a>
+<span class="sourceLineNo">8166</span><a name="line.8166"></a>
+<span class="sourceLineNo">8167</span>  /**<a name="line.8167"></a>
+<span class="sourceLineNo">8168</span>   * @return Get the long out of the passed in Cell<a name="line.8168"></a>
+<span class="sourceLineNo">8169</span>   */<a name="line.8169"></a>
+<span class="sourceLineNo">8170</span>  private static long getLongValue(final Cell cell) throws DoNotRetryIOException {<a name="line.8170"></a>
+<span class="sourceLineNo">8171</span>    int len = cell.getValueLength();<a name="line.8171"></a>
+<span class="sourceLineNo">8172</span>    if (len != Bytes.SIZEOF_LONG) {<a name="line.8172"></a>
+<span class="sourceLineNo">8173</span>      // throw DoNotRetryIOException instead of IllegalArgumentException<a name="line.8173"></a>
+<span class="sourceLineNo">8174</span>      throw new DoNotRetryIOException("Field is not a long, it's " + len + " bytes wide");<a name="line.8174"></a>
+<span class="sourceLineNo">8175</span>    }<a name="line.8175"></a>
+<span class="sourceLineNo">8176</span>    return PrivateCellUtil.getValueAsLong(cell);<a name="line.8176"></a>
+<span class="sourceLineNo">8177</span>  }<a name="line.8177"></a>
+<span class="sourceLineNo">8178</span><a name="line.8178"></a>
+<span class="sourceLineNo">8179</span>  /**<a name="line.8179"></a>
+<span class="sourceLineNo">8180</span>   * Do a specific Get on passed &lt;code&gt;columnFamily&lt;/code&gt; and column qualifiers.<a name="line.8180"></a>
+<span class="sourceLineNo">8181</span>   * @param mutation Mutation we are doing this Get for.<a name="line.8181"></a>
+<span class="sourceLineNo">8182</span>   * @param store Which column family on row (TODO: Go all Gets in one go)<a name="line.8182"></a>
+<span class="sourceLineNo">8183</span>   * @param coordinates Cells from &lt;code&gt;mutation&lt;/code&gt; used as coordinates applied to Get.<a name="line.8183"></a>
+<span class="sourceLineNo">8184</span>   * @return Return list of Cells found.<a name="line.8184"></a>
+<span class="sourceLineNo">8185</span>   */<a name="line.8185"></a>
+<span class="sourceLineNo">8186</span>  private List&lt;Cell&gt; get(Mutation mutation, HStore store, List&lt;Cell&gt; coordinates,<a name="line.8186"></a>
+<span class="sourceLineNo">8187</span>      IsolationLevel isolation, TimeRange tr) throws IOException {<a name="line.8187"></a>
+<span class="sourceLineNo">8188</span>    // Sort the cells so that they match the order that they appear in the Get results. Otherwise,<a name="line.8188"></a>
+<span class="sourceLineNo">8189</span>    // we won't be able to find the existing values if the cells are not specified in order by the<a name="line.8189"></a>
+<span class="sourceLineNo">8190</span>    // client since cells are in an array list.<a name="line.8190"></a>
+<span class="sourceLineNo">8191</span>    // TODO: I don't get why we are sorting. St.Ack 20150107<a name="line.8191"></a>
+<span class="sourceLineNo">8192</span>    sort(coordinates, store.getComparator());<a name="line.8192"></a>
+<span class="sourceLineNo">8193</span>    Get get = new Get(mutation.getRow());<a name="line.8193"></a>
+<span class="sourceLineNo">8194</span>    if (isolation != null) {<a name="line.8194"></a>
+<span class="sourceLineNo">8195</span>      get.setIsolationLevel(isolation);<a name="line.8195"></a>
+<span class="sourceLineNo">8196</span>    }<a name="line.8196"></a>
+<span class="sourceLineNo">8197</span>    for (Cell cell: coordinates) {<a name="line.8197"></a>
+<span class="sourceLineNo">8198</span>      get.addColumn(store.getColumnFamilyDescriptor().getName(), CellUtil.cloneQualifier(cell));<a name="line.8198"></a>
+<span class="sourceLineNo">8199</span>    }<a name="line.8199"></a>
+<span class="sourceLineNo">8200</span>    // Increments carry time range. If an Increment instance, put it on the Get.<a name="line.8200"></a>
+<span class="sourceLineNo">8201</span>    if (tr != null) {<a name="line.8201"></a>
+<span class="sourceLineNo">8202</span>      get.setTimeRange(tr.getMin(), tr.getMax());<a name="line.8202"></a>
+<span class="sourceLineNo">8203</span>    }<a name="line.8203"></a>
+<span class="sourceLineNo">8204</span>    return get(get, false);<a name="line.8204"></a>
+<span class="sourceLineNo">8205</span>  }<a name="line.8205"></a>
+<span class="sourceLineNo">8206</span><a name="line.8206"></a>
+<span class="sourceLineNo">8207</span>  /**<a name="line.8207"></a>
+<span class="sourceLineNo">8208</span>   * @return Sorted list of &lt;code&gt;cells&lt;/code&gt; using &lt;code&gt;comparator&lt;/code&gt;<a name="line.8208"></a>
+<span class="sourceLineNo">8209</span>   */<a name="line.8209"></a>
+<span class="sourceLineNo">8210</span>  private static List&lt;Cell&gt; sort(List&lt;Cell&gt; cells, final CellComparator comparator) {<a name="line.8210"></a>
+<span class="sourceLineNo">8211</span>    cells.sort(comparator);<a name="line.8211"></a>
+<span class="sourceLineNo">8212</span>    return cells;<a name="line.8212"></a>
+<span class="sourceLineNo">8213</span>  }<a name="line.8213"></a>
+<span class="sourceLineNo">8214</span><a name="line.8214"></a>
+<span class="sourceLineNo">8215</span>  public static final long FIXED_OVERHEAD = ClassSize.align(<a name="line.8215"></a>
+<span class="sourceLineNo">8216</span>      ClassSize.OBJECT +<a name="line.8216"></a>
+<span class="sourceLineNo">8217</span>      ClassSize.ARRAY +<a name="line.8217"></a>
+<span class="sourceLineNo">8218</span>      55 * ClassSize.REFERENCE + 3 * Bytes.SIZEOF_INT +<a name="line.8218"></a>
+<span class="sourceLineNo">8219</span>      (15 * Bytes.SIZEOF_LONG) +<a name="line.8219"></a>
+<span class="sourceLineNo">8220</span>      3 * Bytes.SIZEOF_BOOLEAN);<a name="line.8220"></a>
+<span class="sourceLineNo">8221</span><a name="line.8221"></a>
+<span class="sourceLineNo">8222</span>  // woefully out of date - currently missing:<a name="line.8222"></a>
+<span class="sourceLineNo">8223</span>  // 1 x HashMap - coprocessorServiceHandlers<a name="line.8223"></a>
+<span class="sourceLineNo">8224</span>  // 6 x LongAdder - numMutationsWithoutWAL, dataInMemoryWithoutWAL,<a name="line.8224"></a>
+<span class="sourceLineNo">8225</span>  //   checkAndMutateChecksPassed, checkAndMutateChecksFailed, readRequestsCount,<a name="line.8225"></a>
+<span class="sourceLineNo">8226</span>  //   writeRequestsCount, cpRequestsCount<a name="line.8226"></a>
+<span class="sourceLineNo">8227</span>  // 1 x HRegion$WriteState - writestate<a name="line.8227"></a>
+<span class="sourceLineNo">8228</span>  // 1 x RegionCoprocessorHost - coprocessorHost<a name="line.8228"></a>
+<span class="sourceLineNo">8229</span>  // 1 x RegionSplitPolicy - splitPolicy<a name="line.8229"></a>
+<span class="sourceLineNo">8230</span>  // 1 x MetricsRegion - metricsRegion<a name="line.8230"></a>
+<span class="sourceLineNo">8231</span>  // 1 x MetricsRegionWrapperImpl - metricsRegionWrapper<a name="line.8231"></a>
+<span class="sourceLineNo">8232</span>  public static final long DEEP_OVERHEAD = FIXED_OVERHEAD +<a name="line.8232"></a>
+<span class="sourceLineNo">8233</span>      ClassSize.OBJECT + // closeLock<a name="line.8233"></a>
+<span class="sourceLineNo">8234</span>      (2 * ClassSize.ATOMIC_BOOLEAN) + // closed, closing<a name="line.8234"></a>
+<span class="sourceLineNo">8235</span>      (3 * ClassSize.ATOMIC_LONG) + // numPutsWithoutWAL, dataInMemoryWithoutWAL,<a name="line.8235"></a>
+<span class="sourceLineNo">8236</span>                                    // compactionsFailed<a name="line.8236"></a>
+<span class="sourceLineNo">8237</span>      (2 * ClassSize.CONCURRENT_HASHMAP) +  // lockedRows, scannerReadPoints<a name="line.8237"></a>
+<span class="sourceLineNo">8238</span>      WriteState.HEAP_SIZE + // writestate<a name="line.8238"></a>
+<span class="sourceLineNo">8239</span>      ClassSize.CONCURRENT_SKIPLISTMAP + ClassSize.CONCURRENT_SKIPLISTMAP_ENTRY + // stores<a name="line.8239"></a>
+<span class="sourceLineNo">8240</span>      (2 * ClassSize.REENTRANT_LOCK) + // lock, updatesLock<a name="line.8240"></a>
+<span class="sourceLineNo">8241</span>      MultiVersionConcurrencyControl.FIXED_SIZE // mvcc<a name="line.8241"></a>
+<span class="sourceLineNo">8242</span>      + 2 * ClassSize.TREEMAP // maxSeqIdInStores, replicationScopes<a name="line.8242"></a>
+<span class="sourceLineNo">8243</span>      + 2 * ClassSize.ATOMIC_INTEGER // majorInProgress, minorInProgress<a name="line.8243"></a>
+<span class="sourceLineNo">8244</span>      + ClassSize.STORE_SERVICES // store services<a name="line.8244"></a>
+<span class="sourceLineNo">8245</span>      + StoreHotnessProtector.FIXED_SIZE<a name="line.8245"></a>
+<span class="sourceLineNo">8246</span>      ;<a name="line.8246"></a>
+<span class="sourceLineNo">8247</span><a name="line.8247"></a>
+<span class="sourceLineNo">8248</span>  @Override<a name="line.8248"></a>
+<span class="sourceLineNo">8249</span>  public long heapSize() {<a name="line.8249"></a>
+<span class="sourceLineNo">8250</span>    // this does not take into account row locks, recent flushes, mvcc entries, and more<a name="line.8250"></a>
+<span class="sourceLineNo">8251</span>    return DEEP_OVERHEAD + stores.values().stream().mapToLong(HStore::heapSize).sum();<a name="line.8251"></a>
+<span class="sourceLineNo">8252</span>  }<a name="line.8252"></a>
+<span class="sourceLineNo">8253</span><a name="line.8253"></a>
+<span class="sourceLineNo">8254</span>  /**<a name="line.8254"></a>
+<span class="sourceLineNo">8255</span>   * Registers a new protocol buffer {@link Service} subclass as a coprocessor endpoint to<a name="line.8255"></a>
+<span class="sourceLineNo">8256</span>   * be available for handling Region#execService(com.google.protobuf.RpcController,<a name="line.8256"></a>
+<span class="sourceLineNo">8257</span>   *    org.apache.hadoop.hbase.protobuf.generated.ClientProtos.CoprocessorServiceCall) calls.<a name="line.8257"></a>
+<span class="sourceLineNo">8258</span>   *<a name="line.8258"></a>
+<span class="sourceLineNo">8259</span>   * &lt;p&gt;<a name="line.8259"></a>
+<span class="sourceLineNo">8260</span>   * Only a single instance may be registered per region for a given {@link Service} subclass (the<a name="line.8260"></a>
+<span class="sourceLineNo">8261</span>   * instances are keyed on {@link com.google.protobuf.Descriptors.ServiceDescriptor#getFullName()}.<a name="line.8261"></a>
+<span class="sourceLineNo">8262</span>   * After the first registration, subsequent calls with the same service name will fail with<a name="line.8262"></a>
+<span class="sourceLineNo">8263</span>   * a return value of {@code false}.<a name="line.8263"></a>
+<span class="sourceLineNo">8264</span>   * &lt;/p&gt;<a name="line.8264"></a>
+<span class="sourceLineNo">8265</span>   * @param instance the {@code Service} subclass instance to expose as a coprocessor endpoint<a name="line.8265"></a>
+<span class="sourceLineNo">8266</span>   * @return {@code true} if the registration was successful, {@code false}<a name="line.8266"></a>
+<span class="sourceLineNo">8267</span>   * otherwise<a name="line.8267"></a>
+<span class="sourceLineNo">8268</span>   */<a name="line.8268"></a>
+<span class="sourceLineNo">8269</span>  public boolean registerService(com.google.protobuf.Service instance) {<a name="line.8269"></a>
+<span class="sourceLineNo">8270</span>    /*<a name="line.8270"></a>
+<span class="sourceLineNo">8271</span>     * No stacking of instances is allowed for a single service name<a name="line.8271"></a>
+<span class="sourceLineNo">8272</span>     */<a name="line.8272"></a>
+<span class="sourceLineNo">8273</span>    com.google.protobuf.Descriptors.ServiceDescriptor serviceDesc = instance.getDescriptorForType();<a name="line.8273"></a>
+<span class="sourceLineNo">8274</span>    String serviceName = CoprocessorRpcUtils.getServiceName(serviceDesc);<a name="line.8274"></a>
+<span class="sourceLineNo">8275</span>    if (coprocessorServiceHandlers.containsKey(serviceName)) {<a name="line.8275"></a>
+<span class="sourceLineNo">8276</span>      LOG.error("Coprocessor service " + serviceName +<a name="line.8276"></a>
+<span class="sourceLineNo">8277</span>          " already registered, rejecting request from " + instance);<a name="line.8277"></a>
+<span class="sourceLineNo">8278</span>      return false;<a name="line.8278"></a>
+<span class="sourceLineNo">8279</span>    }<a name="line.8279"></a>
+<span class="sourceLineNo">8280</span><a name="line.8280"></a>
+<span class="sourceLineNo">8281</span>    coprocessorServiceHandlers.put(serviceName, instance);<a name="line.8281"></a>
+<span class="sourceLineNo">8282</span>    if (LOG.isDebugEnabled()) {<a name="line.8282"></a>
+<span class="sourceLineNo">8283</span>      LOG.debug("Registered coprocessor service: region=" +<a name="line.8283"></a>
+<span class="sourceLineNo">8284</span>          Bytes.toStringBinary(getRegionInfo().getRegionName()) +<a name="line.8284"></a>
+<span class="sourceLineNo">8285</span>          " service=" + serviceName);<a name="line.8285"></a>
+<span class="sourceLineNo">8286</span>    }<a name="line.8286"></a>
+<span class="sourceLineNo">8287</span>    return true;<a name="line.8287"></a>
+<span class="sourceLineNo">8288</span>  }<a name="line.8288"></a>
+<span class="sourceLineNo">8289</span><a name="line.8289"></a>
+<span class="sourceLineNo">8290</span>  /**<a name="line.8290"></a>
+<span class="sourceLineNo">8291</span>   * Executes a single protocol buffer coprocessor endpoint {@link Service} method using<a name="line.8291"></a>
+<span class="sourceLineNo">8292</span>   * the registered protocol handlers.  {@link Service} implementations must be registered via the<a name="line.8292"></a>
+<span class="sourceLineNo">8293</span>   * {@link #registerService(com.google.protobuf.Service)}<a name="line.8293"></a>
+<span class="sourceLineNo">8294</span>   * method before they are available.<a name="line.8294"></a>
+<span class="sourceLineNo">8295</span>   *<a name="line.8295"></a>
+<span class="sourceLineNo">8296</span>   * @param controller an {@code RpcContoller} implementation to pass to the invoked service<a name="line.8296"></a>
+<span class="sourceLineNo">8297</span>   * @param call a {@code CoprocessorServiceCall} instance identifying the service, method,<a name="line.8297"></a>
+<span class="sourceLineNo">8298</span>   *     and parameters for the method invocation<a name="line.8298"></a>
+<span class="sourceLineNo">8299</span>   * @return a protocol buffer {@code Message} instance containing the method's result<a name="line.8299"></a>
+<span class="sourceLineNo">8300</span>   * @throws IOException if no registered service handler is found or an error<a name="line.8300"></a>
+<span class="sourceLineNo">8301</span>   *     occurs during the invocation<a name="line.8301"></a>
+<span class="sourceLineNo">8302</span>   * @see #registerService(com.google.protobuf.Service)<a name="line.8302"></a>
+<span class="sourceLineNo">8303</span>   */<a name="line.8303"></a>
+<span class="sourceLineNo">8304</span>  public com.google.protobuf.Message execService(com.google.protobuf.RpcController controller,<a name="line.8304"></a>
+<span class="sourceLineNo">8305</span>      CoprocessorServiceCall call) throws IOException {<a name="line.8305"></a>
+<span class="sourceLineNo">8306</span>    String serviceName = call.getServiceName();<a name="line.8306"></a>
+<span class="sourceLineNo">8307</span>    com.google.protobuf.Service service = coprocessorServiceHandlers.get(serviceName);<a name="line.8307"></a>
+<span class="sourceLineNo">8308</span>    if (service == null) {<a name="line.8308"></a>
+<span class="sourceLineNo">8309</span>      throw new UnknownProtocolException(null, "No registered coprocessor service found for " +<a name="line.8309"></a>
+<span class="sourceLineNo">8310</span>          serviceName + " in region " + Bytes.toStringBinary(getRegionInfo().getRegionName()));<a name="line.8310"></a>
+<span class="sourceLineNo">8311</span>    }<a name="line.8311"></a>
+<span class="sourceLineNo">8312</span>    com.google.protobuf.Descriptors.ServiceDescriptor serviceDesc = service.getDescriptorForType();<a name="line.8312"></a>
 <span class="sourceLineNo">8313</span><a name="line.8313"></a>
-<span class="sourceLineNo">8314</span>    com.google.protobuf.Message.Builder builder =<a name="line.8314"></a>
-<span class="sourceLineNo">8315</span>        service.getRequestPrototype(methodDesc).newBuilderForType();<a name="line.8315"></a>
-<span class="sourceLineNo">8316</span><a name="line.8316"></a>
-<span class="sourceLineNo">8317</span>    org.apache.hadoop.hbase.protobuf.ProtobufUtil.mergeFrom(builder,<a name="line.8317"></a>
-<span class="sourceLineNo">8318</span>        call.getRequest().toByteArray());<a name="line.8318"></a>
-<span class="sourceLineNo">8319</span>    com.google.protobuf.Message request =<a name="line.8319"></a>
-<span class="sourceLineNo">8320</span>        CoprocessorRpcUtils.getRequest(service, methodDesc, call.getRequest());<a name="line.8320"></a>
+<span class="sourceLineNo">8314</span>    cpRequestsCount.increment();<a name="line.8314"></a>
+<span class="sourceLineNo">8315</span>    String methodName = call.getMethodName();<a name="line.8315"></a>
+<span class="sourceLineNo">8316</span>    com.google.protobuf.Descriptors.MethodDescriptor methodDesc =<a name="line.8316"></a>
+<span class="sourceLineNo">8317</span>        CoprocessorRpcUtils.getMethodDescriptor(methodName, serviceDesc);<a name="line.8317"></a>
+<span class="sourceLineNo">8318</span><a name="line.8318"></a>
+<span class="sourceLineNo">8319</span>    com.google.protobuf.Message.Builder builder =<a name="line.8319"></a>
+<span class="sourceLineNo">8320</span>        service.getRequestPrototype(methodDesc).newBuilderForType();<a name="line.8320"></a>
 <span class="sourceLineNo">8321</span><a name="line.8321"></a>
-<span class="sourceLineNo">8322</span>    if (coprocessorHost != null) {<a name="line.8322"></a>
-<span class="sourceLineNo">8323</span>      request = coprocessorHost.preEndpointInvocation(service, methodName, request);<a name="line.8323"></a>
-<span class="sourceLineNo">8324</span>    }<a name="line.8324"></a>
-<span class="sourceLineNo">8325</span><a name="line.8325"></a>
-<span class="sourceLineNo">8326</span>    final com.google.protobuf.Message.Builder responseBuilder =<a name="line.8326"></a>
-<span class="sourceLineNo">8327</span>        service.getResponsePrototype(methodDesc).newBuilderForType();<a name="line.8327"></a>
-<span class="sourceLineNo">8328</span>    service.callMethod(methodDesc, controller, request,<a name="line.8328"></a>
-<span class="sourceLineNo">8329</span>        new com.google.protobuf.RpcCallback&lt;com.google.protobuf.Message&gt;() {<a name="line.8329"></a>
-<span class="sourceLineNo">8330</span>      @Override<a name="line.8330"></a>
-<span class="sourceLineNo">8331</span>      public void run(com.google.protobuf.Message message) {<a name="line.8331"></a>
-<span class="sourceLineNo">8332</span>        if (message != null) {<a name="line.8332"></a>
-<span class="sourceLineNo">8333</span>          responseBuilder.mergeFrom(message);<a name="line.8333"></a>
-<span class="sourceLineNo">8334</span>        }<a name="line.8334"></a>
-<span class="sourceLineNo">8335</span>      }<a name="line.8335"></a>
-<span class="sourceLineNo">8336</span>    });<a name="line.8336"></a>
-<span class="sourceLineNo">8337</span><a name="line.8337"></a>
-<span class="sourceLineNo">8338</span>    if (coprocessorHost != null) {<a name="line.8338"></a>
-<span class="sourceLineNo">8339</span>      coprocessorHost.postEndpointInvocation(service, methodName, request, responseBuilder);<a name="line.8339"></a>
-<span class="sourceLineNo">8340</span>    }<a name="line.8340"></a>
-<span class="sourceLineNo">8341</span>    IOException exception =<a name="line.8341"></a>
-<span class="sourceLineNo">8342</span>        org.apache.hadoop.hbase.ipc.CoprocessorRpcUtils.getControllerException(controller);<a name="line.8342"></a>
-<span class="sourceLineNo">8343</span>    if (exception != null) {<a name="line.8343"></a>
-<span class="sourceLineNo">8344</span>      throw exception;<a name="line.8344"></a>
+<span class="sourceLineNo">8322</span>    org.apache.hadoop.hbase.protobuf.ProtobufUtil.mergeFrom(builder,<a name="line.8322"></a>
+<span class="sourceLineNo">8323</span>        call.getRequest().toByteArray());<a name="line.8323"></a>
+<span class="sourceLineNo">8324</span>    com.google.protobuf.Message request =<a name="line.8324"></a>
+<span class="sourceLineNo">8325</span>        CoprocessorRpcUtils.getRequest(service, methodDesc, call.getRequest());<a name="line.8325"></a>
+<span class="sourceLineNo">8326</span><a name="line.8326"></a>
+<span class="sourceLineNo">8327</span>    if (coprocessorHost != null) {<a name="line.8327"></a>
+<span class="sourceLineNo">8328</span>      request = coprocessorHost.preEndpointInvocation(service, methodName, request);<a name="line.8328"></a>
+<span class="sourceLineNo">8329</span>    }<a name="line.8329"></a>
+<span class="sourceLineNo">8330</span><a name="line.8330"></a>
+<span class="sourceLineNo">8331</span>    final com.google.protobuf.Message.Builder responseBuilder =<a name="line.8331"></a>
+<span class="sourceLineNo">8332</span>        service.getResponsePrototype(methodDesc).newBuilderForType();<a name="line.8332"></a>
+<span class="sourceLineNo">8333</span>    service.callMethod(methodDesc, controller, request,<a name="line.8333"></a>
+<span class="sourceLineNo">8334</span>        new com.google.protobuf.RpcCallback&lt;com.google.protobuf.Message&gt;() {<a name="line.8334"></a>
+<span class="sourceLineNo">8335</span>      @Override<a name="line.8335"></a>
+<span class="sourceLineNo">8336</span>      public void run(com.google.protobuf.Message message) {<a name="line.8336"></a>
+<span class="sourceLineNo">8337</span>        if (message != null) {<a name="line.8337"></a>
+<span class="sourceLineNo">8338</span>          responseBuilder.mergeFrom(message);<a name="line.8338"></a>
+<span class="sourceLineNo">8339</span>        }<a name="line.8339"></a>
+<span class="sourceLineNo">8340</span>      }<a name="line.8340"></a>
+<span class="sourceLineNo">8341</span>    });<a name="line.8341"></a>
+<span class="sourceLineNo">8342</span><a name="line.8342"></a>
+<span class="sourceLineNo">8343</span>    if (coprocessorHost != null) {<a name="line.8343"></a>
+<span class="sourceLineNo">8344</span>      coprocessorHost.postEndpointInvocation(service, methodName, request, responseBuilder);<a name="line.8344"></a>
 <span class="sourceLineNo">8345</span>    }<a name="line.8345"></a>
-<span class="sourceLineNo">8346</span><a name="line.8346"></a>
-<span class="sourceLineNo">8347</span>    return responseBuilder.build();<a name="line.8347"></a>
-<span class="sourceLineNo">8348</span>  }<a name="line.8348"></a>
-<span class="sourceLineNo">8349</span><a name="line.8349"></a>
-<span class="sourceLineNo">8350</span>  boolean shouldForceSplit() {<a name="line.8350"></a>
-<span class="sourceLineNo">8351</span>    return this.splitRequest;<a name="line.8351"></a>
-<span class="sourceLineNo">8352</span>  }<a name="line.8352"></a>
-<span class="sourceLineNo">8353</span><a name="line.8353"></a>
-<span class="sourceLineNo">8354</span>  byte[] getExplicitSplitPoint() {<a name="line.8354"></a>
-<span class="sourceLineNo">8355</span>    return this.explicitSplitPoint;<a name="line.8355"></a>
-<span class="sourceLineNo">8356</span>  }<a name="line.8356"></a>
-<span class="sourceLineNo">8357</span><a name="line.8357"></a>
-<span class="sourceLineNo">8358</span>  void forceSplit(byte[] sp) {<a name="line.8358"></a>
-<span class="sourceLineNo">8359</span>    // This HRegion will go away after the forced split is successful<a name="line.8359"></a>
-<span class="sourceLineNo">8360</span>    // But if a forced split fails, we need to clear forced split.<a name="line.8360"></a>
-<span class="sourceLineNo">8361</span>    this.splitRequest = true;<a name="line.8361"></a>
-<span class="sourceLineNo">8362</span>    if (sp != null) {<a name="line.8362"></a>
-<span class="sourceLineNo">8363</span>      this.explicitSplitPoint = sp;<a name="line.8363"></a>
-<span class="sourceLineNo">8364</span>    }<a name="line.8364"></a>
-<span class="sourceLineNo">8365</span>  }<a name="line.8365"></a>
-<span class="sourceLineNo">8366</span><a name="line.8366"></a>
-<span class="sourceLineNo">8367</span>  void clearSplit() {<a name="line.8367"></a>
-<span class="sourceLineNo">8368</span>    this.splitRequest = false;<a name="line.8368"></a>
-<span class="sourceLineNo">8369</span>    this.explicitSplitPoint = null;<a name="line.8369"></a>
+<span class="sourceLineNo">8346</span>    IOException exception =<a name="line.8346"></a>
+<span class="sourceLineNo">8347</span>        org.apache.hadoop.hbase.ipc.CoprocessorRpcUtils.getControllerException(controller);<a name="line.8347"></a>
+<span class="sourceLineNo">8348</span>    if (exception != null) {<a name="line.8348"></a>
+<span class="sourceLineNo">8349</span>      throw exception;<a name="line.8349"></a>
+<span class="sourceLineNo">8350</span>    }<a name="line.8350"></a>
+<span class="sourceLineNo">8351</span><a name="line.8351"></a>
+<span class="sourceLineNo">8352</span>    return responseBuilder.build();<a name="line.8352"></a>
+<span class="sourceLineNo">8353</span>  }<a name="line.8353"></a>
+<span class="sourceLineNo">8354</span><a name="line.8354"></a>
+<span class="sourceLineNo">8355</span>  boolean shouldForceSplit() {<a name="line.8355"></a>
+<span class="sourceLineNo">8356</span>    return this.splitRequest;<a name="line.8356"></a>
+<span class="sourceLineNo">8357</span>  }<a name="line.8357"></a>
+<span class="sourceLineNo">8358</span><a name="line.8358"></a>
+<span class="sourceLineNo">8359</span>  byte[] getExplicitSplitPoint() {<a name="line.8359"></a>
+<span class="sourceLineNo">8360</span>    return this.explicitSplitPoint;<a name="line.8360"></a>
+<span class="sourceLineNo">8361</span>  }<a name="line.8361"></a>
+<span class="sourceLineNo">8362</span><a name="line.8362"></a>
+<span class="sourceLineNo">8363</span>  void forceSplit(byte[] sp) {<a name="line.8363"></a>
+<span class="sourceLineNo">8364</span>    // This HRegion will go away after the forced split is successful<a name="line.8364"></a>
+<span class="sourceLineNo">8365</span>    // But if a forced split fails, we need to clear forced split.<a name="line.8365"></a>
+<span class="sourceLineNo">8366</span>    this.splitRequest = true;<a name="line.8366"></a>
+<span class="sourceLineNo">8367</span>    if (sp != null) {<a name="line.8367"></a>
+<span class="sourceLineNo">8368</span>      this.explicitSplitPoint = sp;<a name="line.8368"></a>
+<span class="sourceLineNo">8369</span>    }<a name="line.8369"></a>
 <span class="sourceLineNo">8370</span>  }<a name="line.8370"></a>
 <span class="sourceLineNo">8371</span><a name="line.8371"></a>
-<span class="sourceLineNo">8372</span>  /**<a name="line.8372"></a>
-<span class="sourceLineNo">8373</span>   * Return the splitpoint. null indicates the region isn't splittable<a name="line.8373"></a>
-<span class="sourceLineNo">8374</span>   * If the splitpoint isn't explicitly specified, it will go over the stores<a name="line.8374"></a>
-<span class="sourceLineNo">8375</span>   * to find the best splitpoint. Currently the criteria of best splitpoint<a name="line.8375"></a>
-<span class="sourceLineNo">8376</span>   * is based on the size of the store.<a name="line.8376"></a>
-<span class="sourceLineNo">8377</span>   */<a name="line.8377"></a>
-<span class="sourceLineNo">8378</span>  public byte[] checkSplit() {<a name="line.8378"></a>
-<span class="sourceLineNo">8379</span>    // Can't split META<a name="line.8379"></a>
-<span class="sourceLineNo">8380</span>    if (this.getRegionInfo().isMetaRegion()) {<a name="line.8380"></a>
-<span class="sourceLineNo">8381</span>      if (shouldForceSplit()) {<a name="line.8381"></a>
-<span class="sourceLineNo">8382</span>        LOG.warn("Cannot split meta region in HBase 0.20 and above");<a name="line.8382"></a>
-<span class="sourceLineNo">8383</span>      }<a name="line.8383"></a>
-<span class="sourceLineNo">8384</span>      return null;<a name="line.8384"></a>
-<span class="sourceLineNo">8385</span>    }<a name="line.8385"></a>
-<span class="sourceLineNo">8386</span><a name="line.8386"></a>
-<span class="sourceLineNo">8387</span>    // Can't split a region that is closing.<a name="line.8387"></a>
-<span class="sourceLineNo">8388</span>    if (this.isClosing()) {<a name="line.8388"></a>
+<span class="sourceLineNo">8372</span>  void clearSplit() {<a name="line.8372"></a>
+<span class="sourceLineNo">8373</span>    this.splitRequest = false;<a name="line.8373"></a>
+<span class="sourceLineNo">8374</span>    this.explicitSplitPoint = null;<a name="line.8374"></a>
+<span class="sourceLineNo">8375</span>  }<a name="line.8375"></a>
+<span class="sourceLineNo">8376</span><a name="line.8376"></a>
+<span class="sourceLineNo">8377</span>  /**<a name="line.8377"></a>
+<span class="sourceLineNo">8378</span>   * Return the splitpoint. null indicates the region isn't splittable<a name="line.8378"></a>
+<span class="sourceLineNo">8379</span>   * If the splitpoint isn't explicitly specified, it will go over the stores<a name="line.8379"></a>
+<span class="sourceLineNo">8380</span>   * to find the best splitpoint. Currently the criteria of best splitpoint<a name="line.8380"></a>
+<span class="sourceLineNo">8381</span>   * is based on the size of the store.<a name="line.8381"></a>
+<span class="sourceLineNo">8382</span>   */<a name="line.8382"></a>
+<span class="sourceLineNo">8383</span>  public byte[] checkSplit() {<a name="line.8383"></a>
+<span class="sourceLineNo">8384</span>    // Can't split META<a name="line.8384"></a>
+<span class="sourceLineNo">8385</span>    if (this.getRegionInfo().isMetaRegion()) {<a name="line.8385"></a>
+<span class="sourceLineNo">8386</span>      if (shouldForceSplit()) {<a name="line.8386"></a>
+<span class="sourceLineNo">8387</span>        LOG.warn("Cannot split meta region in HBase 0.20 and above");<a name="line.8387"></a>
+<span class="sourceLineNo">8388</span>      }<a name="line.8388"></a>
 <span class="sourceLineNo">8389</span>      return null;<a name="line.8389"></a>
 <span class="sourceLineNo">8390</span>    }<a name="line.8390"></a>
 <span class="sourceLineNo">8391</span><a name="line.8391"></a>
-<span class="sourceLineNo">8392</span>    if (!splitPolicy.shouldSplit()) {<a name="line.8392"></a>
-<span class="sourceLineNo">8393</span>      return null;<a name="line.8393"></a>
-<span class="sourceLineNo">8394</span>    }<a name="line.8394"></a>
-<span class="sourceLineNo">8395</span><a name="line.8395"></a>
-<span class="sourceLineNo">8396</span>    byte[] ret = splitPolicy.getSplitPoint();<a name="line.8396"></a>
-<span class="sourceLineNo">8397</span><a name="line.8397"></a>
-<span class="sourceLineNo">8398</span>    if (ret != null) {<a name="line.8398"></a>
-<span class="sourceLineNo">8399</span>      try {<a name="line.8399"></a>
-<span class="sourceLineNo">8400</span>        checkRow(ret, "calculated split");<a name="line.8400"></a>
-<span class="sourceLineNo">8401</span>      } catch (IOException e) {<a name="line.8401"></a>
-<span class="sourceLineNo">8402</span>        LOG.error("Ignoring invalid split", e);<a name="line.8402"></a>
-<span class="sourceLineNo">8403</span>        return null;<a name="line.8403"></a>
-<span class="sourceLineNo">8404</span>      }<a name="line.8404"></a>
-<span class="sourceLineNo">8405</span>    }<a name="line.8405"></a>
-<span class="sourceLineNo">8406</span>    return ret;<a name="line.8406"></a>
-<span class="sourceLineNo">8407</span>  }<a name="line.8407"></a>
-<span class="sourceLineNo">8408</span><a name="line.8408"></a>
-<span class="sourceLineNo">8409</span>  /**<a name="line.8409"></a>
-<span class="sourceLineNo">8410</span>   * @return The priority that this region should have in the compaction queue<a name="line.8410"></a>
-<span class="sourceLineNo">8411</span>   */<a name="line.8411"></a>
-<span class="sourceLineNo">8412</span>  public int getCompactPriority() {<a name="line.8412"></a>
-<span class="sourceLineNo">8413</span>    return stores.values().stream().mapToInt(HStore::getCompactPriority).min()<a name="line.8413"></a>
-<span class="sourceLineNo">8414</span>        .orElse(Store.NO_PRIORITY);<a name="line.8414"></a>
-<span class="sourceLineNo">8415</span>  }<a name="line.8415"></a>
-<span class="sourceLineNo">8416</span><a name="line.8416"></a>
-<span class="sourceLineNo">8417</span>  /** @return the coprocessor host */<a name="line.8417"></a>
-<span class="sourceLineNo">8418</span>  public RegionCoprocessorHost getCoprocessorHost() {<a name="line.8418"></a>
-<span class="sourceLineNo">8419</span>    return coprocessorHost;<a name="line.8419"></a>
+<span class="sourceLineNo">8392</span>    // Can't split a region that is closing.<a name="line.8392"></a>
+<span class="sourceLineNo">8393</span>    if (this.isClosing()) {<a name="line.8393"></a>
+<span class="sourceLineNo">8394</span>      return null;<a name="line.8394"></a>
+<span class="sourceLineNo">8395</span>    }<a name="line.8395"></a>
+<span class="sourceLineNo">8396</span><a name="line.8396"></a>
+<span class="sourceLineNo">8397</span>    if (!splitPolicy.shouldSplit()) {<a name="line.8397"></a>
+<span class="sourceLineNo">8398</span>      return null;<a name="line.8398"></a>
+<span class="sourceLineNo">8399</span>    }<a name="line.8399"></a>
+<span class="sourceLineNo">8400</span><a name="line.8400"></a>
+<span class="sourceLineNo">8401</span>    byte[] ret = splitPolicy.getSplitPoint();<a name="line.8401"></a>
+<span class="sourceLineNo">8402</span><a name="line.8402"></a>
+<span class="sourceLineNo">8403</span>    if (ret != null) {<a name="line.8403"></a>
+<span class="sourceLineNo">8404</span>      try {<a name="line.8404"></a>
+<span class="sourceLineNo">8405</span>        checkRow(ret, "calculated split");<a name="line.8405"></a>
+<span class="sourceLineNo">8406</span>      } catch (IOException e) {<a name="line.8406"></a>
+<span class="sourceLineNo">8407</span>        LOG.error("Ignoring invalid split", e);<a name="line.8407"></a>
+<span class="sourceLineNo">8408</span>        return null;<a name="line.8408"></a>
+<span class="sourceLineNo">8409</span>      }<a name="line.8409"></a>
+<span class="sourceLineNo">8410</span>    }<a name="line.8410"></a>
+<span class="sourceLineNo">8411</span>    return ret;<a name="line.8411"></a>
+<span class="sourceLineNo">8412</span>  }<a name="line.8412"></a>
+<span class="sourceLineNo">8413</span><a name="line.8413"></a>
+<span class="sourceLineNo">8414</span>  /**<a name="line.8414"></a>
+<span class="sourceLineNo">8415</span>   * @return The priority that this region should have in the compaction queue<a name="line.8415"></a>
+<span class="sourceLineNo">8416</span>   */<a name="line.8416"></a>
+<span class="sourceLineNo">8417</span>  public int getCompactPriority() {<a name="line.8417"></a>
+<span class="sourceLineNo">8418</span>    return stores.values().stream().mapToInt(HStore::getCompactPriority).min()<a name="line.8418"></a>
+<span class="sourceLineNo">8419</span>        .orElse(Store.NO_PRIORITY);<a name="line.8419"></a>
 <span class="sourceLineNo">8420</span>  }<a name="line.8420"></a>
 <span class="sourceLineNo">8421</span><a name="line.8421"></a>
-<span class="sourceLineNo">8422</span>  /** @param coprocessorHost the new coprocessor host */<a name="line.8422"></a>
-<span class="sourceLineNo">8423</span>  @VisibleForTesting<a name="line.8423"></a>
-<span class="sourceLineNo">8424</span>  public void setCoprocessorHost(final RegionCoprocessorHost coprocessorHost) {<a name="line.8424"></a>
-<span class="sourceLineNo">8425</span>    this.coprocessorHost = coprocessorHost;<a name="line.8425"></a>
-<span class="sourceLineNo">8426</span>  }<a name="line.8426"></a>
-<span class="sourceLineNo">8427</span><a name="line.8427"></a>
-<span class="sourceLineNo">8428</span>  @Override<a name="line.8428"></a>
-<span class="sourceLineNo">8429</span>  public void startRegionOperation() throws IOException {<a name="line.8429"></a>
-<span class="sourceLineNo">8430</span>    startRegionOperation(Operation.ANY);<a name="line.8430"></a>
+<span class="sourceLineNo">8422</span>  /** @return the coprocessor host */<a name="line.8422"></a>
+<span class="sourceLineNo">8423</span>  public RegionCoprocessorHost getCoprocessorHost() {<a name="line.8423"></a>
+<span class="sourceLineNo">8424</span>    return coprocessorHost;<a name="line.8424"></a>
+<span class="sourceLineNo">8425</span>  }<a name="line.8425"></a>
+<span class="sourceLineNo">8426</span><a name="line.8426"></a>
+<span class="sourceLineNo">8427</span>  /** @param coprocessorHost the new coprocessor host */<a name="line.8427"></a>
+<span class="sourceLineNo">8428</span>  @VisibleForTesting<a name="line.8428"></a>
+<span class="sourceLineNo">8429</span>  public void setCoprocessorHost(final RegionCoprocessorHost coprocessorHost) {<a name="line.8429"></a>
+<span class="sourceLineNo">8430</span>    this.coprocessorHost = coprocessorHost;<a name="line.8430"></a>
 <span class="sourceLineNo">8431</span>  }<a name="line.8431"></a>
 <span class="sourceLineNo">8432</span><a name="line.8432"></a>
 <span class="sourceLineNo">8433</span>  @Override<a name="line.8433"></a>
-<span class="sourceLineNo">8434</span>  public void startRegionOperation(Operation op) throws IOException {<a name="line.8434"></a>
-<span class="sourceLineNo">8435</span>    switch (op) {<a name="line.8435"></a>
-<span class="sourceLineNo">8436</span>      case GET:  // read operations<a name="line.8436"></a>
-<span class="sourceLineNo">8437</span>      case SCAN:<a name="line.8437"></a>
-<span class="sourceLineNo">8438</span>        checkReadsEnabled();<a name="line.8438"></a>
-<span class="sourceLineNo">8439</span>        break;<a name="line.8439"></a>
-<span class="sourceLineNo">8440</span>      default:<a name="line.8440"></a>
-<span class="sourceLineNo">8441</span>        break;<a name="line.8441"></a>
-<span class="sourceLineNo">8442</span>    }<a name="line.8442"></a>
-<span class="sourceLineNo">8443</span>    if (op == Operation.MERGE_REGION || op == Operation.SPLIT_REGION<a name="line.8443"></a>
-<span class="sourceLineNo">8444</span>        || op == Operation.COMPACT_REGION || op == Operation.COMPACT_SWITCH) {<a name="line.8444"></a>
-<span class="sourceLineNo">8445</span>      // split, merge or compact region doesn't need to check the closing/closed state or lock the<a name="line.8445"></a>
-<span class="sourceLineNo">8446</span>      // region<a name="line.8446"></a>
-<span class="sourceLineNo">8447</span>      return;<a name="line.8447"></a>
-<span class="sourceLineNo">8448</span>    }<a name="line.8448"></a>
-<span class="sourceLineNo">8449</span>    if (this.closing.get()) {<a name="line.8449"></a>
-<span class="sourceLineNo">8450</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closing");<a name="line.8450"></a>
-<span class="sourceLineNo">8451</span>    }<a name="line.8451"></a>
-<span class="sourceLineNo">8452</span>    lock(lock.readLock());<a name="line.8452"></a>
-<span class="sourceLineNo">8453</span>    if (this.closed.get()) {<a name="line.8453"></a>
-<span class="sourceLineNo">8454</span>      lock.readLock().unlock();<a name="line.8454"></a>
-<span class="sourceLineNo">8455</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closed");<a name="line.8455"></a>
+<span class="sourceLineNo">8434</span>  public void startRegionOperation() throws IOException {<a name="line.8434"></a>
+<span class="sourceLineNo">8435</span>    startRegionOperation(Operation.ANY);<a name="line.8435"></a>
+<span class="sourceLineNo">8436</span>  }<a name="line.8436"></a>
+<span class="sourceLineNo">8437</span><a name="line.8437"></a>
+<span class="sourceLineNo">8438</span>  @Override<a name="line.8438"></a>
+<span class="sourceLineNo">8439</span>  public void startRegionOperation(Operation op) throws IOException {<a name="line.8439"></a>
+<span class="sourceLineNo">8440</span>    switch (op) {<a name="line.8440"></a>
+<span class="sourceLineNo">8441</span>      case GET:  // read operations<a name="line.8441"></a>
+<span class="sourceLineNo">8442</span>      case SCAN:<a name="line.8442"></a>
+<span class="sourceLineNo">8443</span>        checkReadsEnabled();<a name="line.8443"></a>
+<span class="sourceLineNo">8444</span>        break;<a name="line.8444"></a>
+<span class="sourceLineNo">8445</span>      default:<a name="line.8445"></a>
+<span class="sourceLineNo">8446</span>        break;<a name="line.8446"></a>
+<span class="sourceLineNo">8447</span>    }<a name="line.8447"></a>
+<span class="sourceLineNo">8448</span>    if (op == Operation.MERGE_REGION || op == Operation.SPLIT_REGION<a name="line.8448"></a>
+<span class="sourceLineNo">8449</span>        || op == Operation.COMPACT_REGION || op == Operation.COMPACT_SWITCH) {<a name="line.8449"></a>
+<span class="sourceLineNo">8450</span>      // split, merge or compact region doesn't need to check the closing/closed state or lock the<a name="line.8450"></a>
+<span class="sourceLineNo">8451</span>      // region<a name="line.8451"></a>
+<span class="sourceLineNo">8452</span>      return;<a name="line.8452"></a>
+<span class="sourceLineNo">8453</span>    }<a name="line.8453"></a>
+<span class="sourceLineNo">8454</span>    if (this.closing.get()) {<a name="line.8454"></a>
+<span class="sourceLineNo">8455</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closing");<a name="line.8455"></a>
 <span class="sourceLineNo">8456</span>    }<a name="line.8456"></a>
-<span class="sourceLineNo">8457</span>    // The unit for snapshot is a region. So, all stores for this region must be<a name="line.8457"></a>
-<span class="sourceLineNo">8458</span>    // prepared for snapshot operation before proceeding.<a name="line.8458"></a>
-<span class="sourceLineNo">8459</span>    if (op == Operation.SNAPSHOT) {<a name="line.8459"></a>
-<span class="sourceLineNo">8460</span>      stores.values().forEach(HStore::preSnapshotOperation);<a name="line.8460"></a>
+<span class="sourceLineNo">8457</span>    lock(lock.readLock());<a name="line.8457"></a>
+<span class="sourceLineNo">8458</span>    if (this.closed.get()) {<a name="line.8458"></a>
+<span class="sourceLineNo">8459</span>      lock.readLock().unlock();<a name="line.8459"></a>
+<span class="sourceLineNo">8460</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closed");<a name="line.8460"></a>
 <span class="sourceLineNo">8461</span>    }<a name="line.8461"></a>
-<span class="sourceLineNo">8462</span>    try {<a name="line.8462"></a>
-<span class="sourceLineNo">8463</span>      if (coprocessorHost != null) {<a name="line.8463"></a>
-<span class="sourceLineNo">8464</span>        coprocessorHost.postStartRegionOperation(op);<a name="line.8464"></a>
-<span class="sourceLineNo">8465</span>      }<a name="line.8465"></a>
-<span class="sourceLineNo">8466</span>    } catch (Exception e) {<a name="line.8466"></a>
-<span class="sourceLineNo">8467</span>      lock.readLock().unlock();<a name="line.8467"></a>
-<span class="sourceLineNo">8468</span>      throw new IOException(e);<a name="line.8468"></a>
-<span class="sourceLineNo">8469</span>    }<a name="line.8469"></a>
-<span class="sourceLineNo">8470</span>  }<a name="line.8470"></a>
-<span class="sourceLineNo">8471</span><a name="line.8471"></a>
-<span class="sourceLineNo">8472</span>  @Override<a name="line.8472"></a>
-<span class="sourceLineNo">8473</span>  public void closeRegionOperation() throws IOException {<a name="line.8473"></a>
-<span class="sourceLineNo">8474</span>    closeRegionOperation(Operation.ANY);<a name="line.8474"></a>
+<span class="sourceLineNo">8462</span>    // The unit for snapshot is a region. So, all stores for this region must be<a name="line.8462"></a>
+<span class="sourceLineNo">8463</span>    // prepared for snapshot operation before proceeding.<a name="line.8463"></a>
+<span class="sourceLineNo">8464</span>    if (op == Operation.SNAPSHOT) {<a name="line.8464"></a>
+<span class="sourceLineNo">8465</span>      stores.values().forEach(HStore::preSnapshotOperation);<a name="line.8465"></a>
+<span class="sourceLineNo">8466</span>    }<a name="line.8466"></a>
+<span class="sourceLineNo">8467</span>    try {<a name="line.8467"></a>
+<span class="sourceLineNo">8468</span>      if (coprocessorHost != null) {<a name="line.8468"></a>
+<span class="sourceLineNo">8469</span>        coprocessorHost.postStartRegionOperation(op);<a name="line.8469"></a>
+<span class="sourceLineNo">8470</span>      }<a name="line.8470"></a>
+<span class="sourceLineNo">8471</span>    } catch (Exception e) {<a name="line.8471"></a>
+<span class="sourceLineNo">8472</span>      lock.readLock().unlock();<a name="line.8472"></a>
+<span class="sourceLineNo">8473</span>      throw new IOException(e);<a name="line.8473"></a>
+<span class="sourceLineNo">8474</span>    }<a name="line.8474"></a>
 <span class="sourceLineNo">8475</span>  }<a name="line.8475"></a>
 <span class="sourceLineNo">8476</span><a name="line.8476"></a>
 <span class="sourceLineNo">8477</span>  @Override<a name="line.8477"></a>
-<span class="sourceLineNo">8478</span>  public void closeRegionOperation(Operation operation) throws IOException {<a name="line.8478"></a>
-<span class="sourceLineNo">8479</span>    if (operation == Operation.SNAPSHOT) {<a name="line.8479"></a>
-<span class="sourceLineNo">8480</span>      stores.values().forEach(HStore::postSnapshotOperation);<a name="line.8480"></a>
-<span class="sourceLineNo">8481</span>    }<a name="line.8481"></a>
-<span class="sourceLineNo">8482</span>    lock.readLock().unlock();<a name="line.8482"></a>
-<span class="sourceLineNo">8483</span>    if (coprocessorHost != null) {<a name="line.8483"></a>
-<span class="sourceLineNo">8484</span>      coprocessorHost.postCloseRegionOperation(operation);<a name="line.8484"></a>
-<span class="sourceLineNo">8485</span>    }<a name="line.8485"></a>
-<span class="sourceLineNo">8486</span>  }<a name="line.8486"></a>
-<span class="sourceLineNo">8487</span><a name="line.8487"></a>
-<span class="sourceLineNo">8488</span>  /**<a name="line.8488"></a>
-<span class="sourceLineNo">8489</span>   * This method needs to be called before any public call that reads or<a name="line.8489"></a>
-<span class="sourceLineNo">8490</span>   * modifies stores in bulk. It has to be called just before a try.<a name="line.8490"></a>
-<span class="sourceLineNo">8491</span>   * #closeBulkRegionOperation needs to be called in the try's finally block<a name="line.8491"></a>
-<span class="sourceLineNo">8492</span>   * Acquires a writelock and checks if the region is closing or closed.<a name="line.8492"></a>
-<span class="sourceLineNo">8493</span>   * @throws NotServingRegionException when the region is closing or closed<a name="line.8493"></a>
-<span class="sourceLineNo">8494</span>   * @throws RegionTooBusyException if failed to get the lock in time<a name="line.8494"></a>
-<span class="sourceLineNo">8495</span>   * @throws InterruptedIOException if interrupted while waiting for a lock<a name="line.8495"></a>
-<span class="sourceLineNo">8496</span>   */<a name="line.8496"></a>
-<span class="sourceLineNo">8497</span>  private void startBulkRegionOperation(boolean writeLockNeeded)<a name="line.8497"></a>
-<span class="sourceLineNo">8498</span>      throws NotServingRegionException, RegionTooBusyException, InterruptedIOException {<a name="line.8498"></a>
-<span class="sourceLineNo">8499</span>    if (this.closing.get()) {<a name="line.8499"></a>
-<span class="sourceLineNo">8500</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closing");<a name="line.8500"></a>
-<span class="sourceLineNo">8501</span>    }<a name="line.8501"></a>
-<span class="sourceLineNo">8502</span>    if (writeLockNeeded) lock(lock.writeLock());<a name="line.8502"></a>
-<span class="sourceLineNo">8503</span>    else lock(lock.readLock());<a name="line.8503"></a>
-<span class="sourceLineNo">8504</span>    if (this.closed.get()) {<a name="line.8504"></a>
-<span class="sourceLineNo">8505</span>      if (writeLockNeeded) lock.writeLock().unlock();<a name="line.8505"></a>
-<span class="sourceLineNo">8506</span>      else lock.readLock().unlock();<a name="line.8506"></a>
-<span class="sourceLineNo">8507</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closed");<a name="line.8507"></a>
-<span class="sourceLineNo">8508</span>    }<a name="line.8508"></a>
-<span class="sourceLineNo">8509</span>  }<a name="line.8509"></a>
-<span class="sourceLineNo">8510</span><a name="line.8510"></a>
-<span class="sourceLineNo">8511</span>  /**<a name="line.8511"></a>
-<span class="sourceLineNo">8512</span>   * Closes the lock. This needs to be called in the finally block corresponding<a name="line.8512"></a>
-<span class="sourceLineNo">8513</span>   * to the try block of #startRegionOperation<a name="line.8513"></a>
-<span class="sourceLineNo">8514</span>   */<a name="line.8514"></a>
-<span class="sourceLineNo">8515</span>  private void closeBulkRegionOperation(){<a name="line.8515"></a>
-<span class="sourceLineNo">8516</span>    if (lock.writeLock().isHeldByCurrentThread()) lock.writeLock().unlock();<a name="line.8516"></a>
-<span class="sourceLineNo">8517</span>    else lock.readLock().unlock();<a name="line.8517"></a>
-<span class="sourceLineNo">8518</span>  }<a name="line.8518"></a>
-<span class="sourceLineNo">8519</span><a name="line.8519"></a>
-<span class="sourceLineNo">8520</span>  /**<a name="line.8520"></a>
-<span class="sourceLineNo">8521</span>   * Update LongAdders for number of puts without wal and the size of possible data loss.<a name="line.8521"></a>
-<span class="sourceLineNo">8522</span>   * These information are exposed by the region server metrics.<a name="line.8522"></a>
-<span class="sourceLineNo">8523</span>   */<a name="line.8523"></a>
-<span class="sourceLineNo">8524</span>  private void recordMutationWithoutWal(final Map&lt;byte [], List&lt;Cell&gt;&gt; familyMap) {<a name="line.8524"></a>
-<span class="sourceLineNo">8525</span>    numMutationsWithoutWAL.increment();<a name="line.8525"></a>
-<span class="sourceLineNo">8526</span>    if (numMutationsWithoutWAL.sum() &lt;= 1) {<a name="line.8526"></a>
-<span class="sourceLineNo">8527</span>      LOG.info("writing data to region " + this +<a name="line.8527"></a>
-<span class="sourceLineNo">8528</span>               " with WAL disabled. Data may be lost in the event of a crash.");<a name="line.8528"></a>
-<span class="sourceLineNo">8529</span>    }<a name="line.8529"></a>
-<span class="sourceLineNo">8530</span><a name="line.8530"></a>
-<span class="sourceLineNo">8531</span>    long mutationSize = 0;<a name="line.8531"></a>
-<span class="sourceLineNo">8532</span>    for (List&lt;Cell&gt; cells: familyMap.values()) {<a name="line.8532"></a>
-<span class="sourceLineNo">8533</span>      // Optimization: 'foreach' loop is not used. See:<a name="line.8533"></a>
-<span class="sourceLineNo">8534</span>      // HBASE-12023 HRegion.applyFamilyMapToMemstore creates too many iterator objects<a name="line.8534"></a>
-<span class="sourceLineNo">8535</span>      assert cells instanceof RandomAccess;<a name="line.8535"></a>
-<span class="sourceLineNo">8536</span>      int listSize = cells.size();<a name="line.8536"></a>
-<span class="sourceLineNo">8537</span>      for (int i=0; i &lt; listSize; i++) {<a name="line.8537"></a>
-<span class="sourceLineNo">8538</span>        Cell cell = cells.get(i);<a name="line.8538"></a>
-<span class="sourceLineNo">8539</span>        mutationSize += cell.getSerializedSize();<a name="line.8539"></a>
-<span class="sourceLineNo">8540</span>      }<a name="line.8540"></a>
-<span class="sourceLineNo">8541</span>    }<a name="line.8541"></a>
-<span class="sourceLineNo">8542</span><a name="line.8542"></a>
-<span class="sourceLineNo">8543</span>    dataInMemoryWithoutWAL.add(mutationSize);<a name="line.8543"></a>
-<span class="sourceLineNo">8544</span>  }<a name="line.8544"></a>
-<span class="sourceLineNo">8545</span><a name="line.8545"></a>
-<span class="sourceLineNo">8546</span>  private void lock(final Lock lock) throws RegionTooBusyException, InterruptedIOException {<a name="line.8546"></a>
-<span class="sourceLineNo">8547</span>    lock(lock, 1);<a name="line.8547"></a>
-<span class="sourceLineNo">8548</span>  }<a name="line.8548"></a>
-<span class="sourceLineNo">8549</span><a name="line.8549"></a>
-<span class="sourceLineNo">8550</span>  /**<a name="line.8550"></a>
-<span class="sourceLineNo">8551</span>   * Try to acquire a lock.  Throw RegionTooBusyException<a name="line.8551"></a>
-<span class="sourceLineNo">8552</span>   * if failed to get the lock in time. Throw InterruptedIOException<a name="line.8552"></a>
-<span class="sourceLineNo">8553</span>   * if interrupted while waiting for the lock.<a name="line.8553"></a>
-<span class="sourceLineNo">8554</span>   */<a name="line.8554"></a>
-<span class="sourceLineNo">8555</span>  private void lock(final Lock lock, final int multiplier)<a name="line.8555"></a>
-<span class="sourceLineNo">8556</span>      throws RegionTooBusyException, InterruptedIOException {<a name="line.8556"></a>
-<span class="sourceLineNo">8557</span>    try {<a name="line.8557"></a>
-<span class="sourceLineNo">8558</span>      final long waitTime = Math.min(maxBusyWaitDuration,<a name="line.8558"></a>
-<span class="sourceLineNo">8559</span>          busyWaitDuration * Math.min(multiplier, maxBusyWaitMultiplier));<a name="line.8559"></a>
-<span class="sourceLineNo">8560</span>      if (!lock.tryLock(waitTime, TimeUnit.MILLISECONDS)) {<a name="line.8560"></a>
-<span class="sourceLineNo">8561</span>        // Don't print millis. Message is used as a key over in<a name="line.8561"></a>
-<span class="sourceLineNo">8562</span>        // RetriesExhaustedWithDetailsException processing.<a name="line.8562"></a>
-<span class="sourceLineNo">8563</span>        throw new RegionTooBusyException("Failed to obtain lock; regionName=" +<a name="line.8563"></a>
-<span class="sourceLineNo">8564</span>            (this.getRegionInfo() == null? "unknown":<a name="line.8564"></a>
-<span class="sourceLineNo">8565</span>                this.getRegionInfo().getRegionNameAsString()) +<a name="line.8565"></a>
-<span class="sourceLineNo">8566</span>            ", server=" + (this.getRegionServerServices() == null? "unknown":<a name="line.8566"></a>
-<span class="sourceLineNo">8567</span>                this.getRegionServerServices().getServerName()));<a name="line.8567"></a>
-<span class="sourceLineNo">8568</span>      }<a name="line.8568"></a>
-<span class="sourceLineNo">8569</span>    } catch (InterruptedException ie) {<a name="line.8569"></a>
-<span class="sourceLineNo">8570</span>      LOG.info("Interrupted while waiting for a lock");<a name="line.8570"></a>
-<span class="sourceLineNo">8571</span>      InterruptedIOException iie = new InterruptedIOException();<a name="line.8571"></a>
-<span class="sourceLineNo">8572</span>      iie.initCause(ie);<a name="line.8572"></a>
-<span class="sourceLineNo">8573</span>      throw iie;<a name="line.8573"></a>
-<span class="sourceLineNo">8574</span>    }<a name="line.8574"></a>
-<span class="sourceLineNo">8575</span>  }<a name="line.8575"></a>
-<span class="sourceLineNo">8576</span><a name="line.8576"></a>
-<span class="sourceLineNo">8577</span>  /**<a name="line.8577"></a>
-<span class="sourceLineNo">8578</span>   * Calls sync with the given transaction ID<a name="line.8578"></a>
-<span class="sourceLineNo">8579</span>   * @param txid should sync up to which transaction<a name="line.8579"></a>
-<span class="sourceLineNo">8580</span>   * @throws IOException If anything goes wrong with DFS<a name="line.8580"></a>
-<span class="sourceLineNo">8581</span>   */<a name="line.8581"></a>
-<span class="sourceLineNo">8582</span>  private void sync(long txid, Durability durability) throws IOException {<a name="line.8582"></a>
-<span class="sourceLineNo">8583</span>    if (this.getRegionInfo().isMetaRegion()) {<a name="line.8583"></a>
-<span class="sourceLineNo">8584</span>      this.wal.sync(txid);<a name="line.8584"></a>
-<span class="sourceLineNo">8585</span>    } else {<a name="line.8585"></a>
-<span class="sourceLineNo">8586</span>      switch(durability) {<a name="line.8586"></a>
-<span class="sourceLineNo">8587</span>      case USE_DEFAULT:<a name="line.8587"></a>
-<span class="sourceLineNo">8588</span>        // do what table defaults to<a name="line.8588"></a>
-<span class="sourceLineNo">8589</span>        if (shouldSyncWAL()) {<a name="line.8589"></a>
-<span class="sourceLineNo">8590</span>          this.wal.sync(txid);<a name="line.8590"></a>
-<span class="sourceLineNo">8591</span>        }<a name="line.8591"></a>
-<span class="sourceLineNo">8592</span>        break;<a name="line.8592"></a>
-<span class="sourceLineNo">8593</span>      case SKIP_WAL:<a name="line.8593"></a>
-<span class="sourceLineNo">8594</span>        // nothing do to<a name="line.8594"></a>
-<span class="sourceLineNo">8595</span>        break;<a name="line.8595"></a>
-<span class="sourceLineNo">8596</span>      case ASYNC_WAL:<a name="line.8596"></a>
-<span class="sourceLineNo">8597</span>        // nothing do to<a name="line.8597"></a>
-<span class="sourceLineNo">8598</span>        break;<a name="line.8598"></a>
-<span class="sourceLineNo">8599</span>      case SYNC_WAL:<a name="line.8599"></a>
-<span class="sourceLineNo">8600</span>          this.wal.sync(txid, false);<a name="line.8600"></a>
-<span class="sourceLineNo">8601</span>          break;<a name="line.8601"></a>
-<span class="sourceLineNo">8602</span>      case FSYNC_WAL:<a name="line.8602"></a>
-<span class="sourceLineNo">8603</span>          this.wal.sync(txid, true);<a name="line.8603"></a>
-<span class="sourceLineNo">8604</span>          break;<a name="line.8604"></a>
-<span class="sourceLineNo">8605</span>      default:<a name="line.8605"></a>
-<span class="sourceLineNo">8606</span>        throw new RuntimeException("Unknown durability " + durability);<a name="line.8606"></a>
-<span class="sourceLineNo">8607</span>      }<a name="line.8607"></a>
-<span class="sourceLineNo">8608</span>    }<a name="line.8608"></a>
-<span class="sourceLineNo">8609</span>  }<a name="line.8609"></a>
-<span class="sourceLineNo">8610</span><a name="line.8610"></a>
-<span class="sourceLineNo">8611</span>  /**<a name="line.8611"></a>
-<span class="sourceLineNo">8612</span>   * Check whether we should sync the wal from the table's durability settings<a name="line.8612"></a>
-<span class="sourceLineNo">8613</span>   */<a name="line.8613"></a>
-<span class="sourceLineNo">8614</span>  private boolean shouldSyncWAL() {<a name="line.8614"></a>
-<span class="sourceLineNo">8615</span>    return regionDurability.ordinal() &gt;  Durability.ASYNC_WAL.ordinal();<a name="line.8615"></a>
-<span class="sourceLineNo">8616</span>  }<a name="line.8616"></a>
-<span class="sourceLineNo">8617</span><a name="line.8617"></a>
-<span class="sourceLineNo">8618</span>  /**<a name="line.8618"></a>
-<span class="sourceLineNo">8619</span>   * A mocked list implementation - discards all updates.<a name="line.8619"></a>
-<span class="sourceLineNo">8620</span>   */<a name="line.8620"></a>
-<span class="sourceLineNo">8621</span>  private static final List&lt;Cell&gt; MOCKED_LIST = new AbstractList&lt;Cell&gt;() {<a name="line.8621"></a>
+<span class="sourceLineNo">8478</span>  public void closeRegionOperation() throws IOException {<a name="line.8478"></a>
+<span class="sourceLineNo">8479</span>    closeRegionOperation(Operation.ANY);<a name="line.8479"></a>
+<span class="sourceLineNo">8480</span>  }<a name="line.8480"></a>
+<span class="sourceLineNo">8481</span><a name="line.8481"></a>
+<span class="sourceLineNo">8482</span>  @Override<a name="line.8482"></a>
+<span class="sourceLineNo">8483</span>  public void closeRegionOperation(Operation operation) throws IOException {<a name="line.8483"></a>
+<span class="sourceLineNo">8484</span>    if (operation == Operation.SNAPSHOT) {<a name="line.8484"></a>
+<span class="sourceLineNo">8485</span>      stores.values().forEach(HStore::postSnapshotOperation);<a name="line.8485"></a>
+<span class="sourceLineNo">8486</span>    }<a name="line.8486"></a>
+<span class="sourceLineNo">8487</span>    lock.readLock().unlock();<a name="line.8487"></a>
+<span class="sourceLineNo">8488</span>    if (coprocessorHost != null) {<a name="line.8488"></a>
+<span class="sourceLineNo">8489</span>      coprocessorHost.postCloseRegionOperation(operation);<a name="line.8489"></a>
+<span class="sourceLineNo">8490</span>    }<a name="line.8490"></a>
+<span class="sourceLineNo">8491</span>  }<a name="line.8491"></a>
+<span class="sourceLineNo">8492</span><a name="line.8492"></a>
+<span class="sourceLineNo">8493</span>  /**<a name="line.8493"></a>
+<span class="sourceLineNo">8494</span>   * This method needs to be called before any public call that reads or<a name="line.8494"></a>
+<span class="sourceLineNo">8495</span>   * modifies stores in bulk. It has to be called just before a try.<a name="line.8495"></a>
+<span class="sourceLineNo">8496</span>   * #closeBulkRegionOperation needs to be called in the try's finally block<a name="line.8496"></a>
+<span class="sourceLineNo">8497</span>   * Acquires a writelock and checks if the region is closing or closed.<a name="line.8497"></a>
+<span class="sourceLineNo">8498</span>   * @throws NotServingRegionException when the region is closing or closed<a name="line.8498"></a>
+<span class="sourceLineNo">8499</span>   * @throws RegionTooBusyException if failed to get the lock in time<a name="line.8499"></a>
+<span class="sourceLineNo">8500</span>   * @throws InterruptedIOException if interrupted while waiting for a lock<a name="line.8500"></a>
+<span class="sourceLineNo">8501</span>   */<a name="line.8501"></a>
+<span class="sourceLineNo">8502</span>  private void startBulkRegionOperation(boolean writeLockNeeded)<a name="line.8502"></a>
+<span class="sourceLineNo">8503</span>      throws NotServingRegionException, RegionTooBusyException, InterruptedIOException {<a name="line.8503"></a>
+<span class="sourceLineNo">8504</span>    if (this.closing.get()) {<a name="line.8504"></a>
+<span class="sourceLineNo">8505</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closing");<a name="line.8505"></a>
+<span class="sourceLineNo">8506</span>    }<a name="line.8506"></a>
+<span class="sourceLineNo">8507</span>    if (writeLockNeeded) lock(lock.writeLock());<a name="line.8507"></a>
+<span class="sourceLineNo">8508</span>    else lock(lock.readLock());<a name="line.8508"></a>
+<span class="sourceLineNo">8509</span>    if (this.closed.get()) {<a name="line.8509"></a>
+<span class="sourceLineNo">8510</span>      if (writeLockNeeded) lock.writeLock().unlock();<a name="line.8510"></a>
+<span class="sourceLineNo">8511</span>      else lock.readLock().unlock();<a name="line.8511"></a>
+<span class="sourceLineNo">8512</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closed");<a name="line.8512"></a>
+<span class="sourceLineNo">8513</span>    }<a name="line.8513"></a>
+<span class="sourceLineNo">8514</span>  }<a name="line.8514"></a>
+<span class="sourceLineNo">8515</span><a name="line.8515"></a>
+<span class="sourceLineNo">8516</span>  /**<a name="line.8516"></a>
+<span class="sourceLineNo">8517</span>   * Closes the lock. This needs to be called in the finally block corresponding<a name="line.8517"></a>
+<span class="sourceLineNo">8518</span>   * to the try block of #startRegionOperation<a name="line.8518"></a>
+<span class="sourceLineNo">8519</span>   */<a name="line.8519"></a>
+<span class="sourceLineNo">8520</span>  private void closeBulkRegionOperation(){<a name="line.8520"></a>
+<span class="sourceLineNo">8521</span>    if (lock.writeLock().isHeldByCurrentThread()) lock.writeLock().unlock();<a name="line.8521"></a>
+<span class="sourceLineNo">8522</span>    else lock.readLock().unlock();<a name="line.8522"></a>
+<span class="sourceLineNo">8523</span>  }<a name="line.8523"></a>
+<span class="sourceLineNo">8524</span><a name="line.8524"></a>
+<span class="sourceLineNo">8525</span>  /**<a name="line.8525"></a>
+<span class="sourceLineNo">8526</span>   * Update LongAdders for number of puts without wal and the size of possible data loss.<a name="line.8526"></a>
+<span class="sourceLineNo">8527</span>   * These information are exposed by the region server metrics.<a name="line.8527"></a>
+<span class="sourceLineNo">8528</span>   */<a name="line.8528"></a>
+<span class="sourceLineNo">8529</span>  private void recordMutationWithoutWal(final Map&lt;byte [], List&lt;Cell&gt;&gt; familyMap) {<a name="line.8529"></a>
+<span class="sourceLineNo">8530</span>    numMutationsWithoutWAL.increment();<a name="line.8530"></a>
+<span class="sourceLineNo">8531</span>    if (numMutationsWithoutWAL.sum() &lt;= 1) {<a name="line.8531"></a>
+<span class="sourceLineNo">8532</span>      LOG.info("writing data to region " + this +<a name="line.8532"></a>
+<span class="sourceLineNo">8533</span>               " with WAL disabled. Data may be lost in the event of a crash.");<a name="line.8533"></a>
+<span class="sourceLineNo">8534</span>    }<a name="line.8534"></a>
+<span class="sourceLineNo">8535</span><a name="line.8535"></a>
+<span class="sourceLineNo">8536</span>    long mutationSize = 0;<a name="line.8536"></a>
+<span class="sourceLineNo">8537</span>    for (List&lt;Cell&gt; cells: familyMap.values()) {<a name="line.8537"></a>
+<span class="sourceLineNo">8538</span>      // Optimization: 'foreach' loop is not used. See:<a name="line.8538"></a>
+<span class="sourceLineNo">8539</span>      // HBASE-12023 HRegion.applyFamilyMapToMemstore creates too many iterator objects<a name="line.8539"></a>
+<span class="sourceLineNo">8540</span>      assert cells instanceof RandomAccess;<a name="line.8540"></a>
+<span class="sourceLineNo">8541</span>      int listSize = cells.size();<a name="line.8541"></a>
+<span class="sourceLineNo">8542</span>      for (int i=0; i &lt; listSize; i++) {<a name="line.8542"></a>
+<span class="sourceLineNo">8543</span>        Cell cell = cells.get(i);<a name="line.8543"></a>
+<span class="sourceLineNo">8544</span>        mutationSize += cell.getSerializedSize();<a name="line.8544"></a>
+<span class="sourceLineNo">8545</span>      }<a name="line.8545"></a>
+<span class="sourceLineNo">8546</span>    }<a name="line.8546"></a>
+<span class="sourceLineNo">8547</span><a name="line.8547"></a>
+<span class="sourceLineNo">8548</span>    dataInMemoryWithoutWAL.add(mutationSize);<a name="line.8548"></a>
+<span class="sourceLineNo">8549</span>  }<a name="line.8549"></a>
+<span class="sourceLineNo">8550</span><a name="line.8550"></a>
+<span class="sourceLineNo">8551</span>  private void lock(final Lock lock) throws RegionTooBusyException, InterruptedIOException {<a name="line.8551"></a>
+<span class="sourceLineNo">8552</span>    lock(lock, 1);<a name="line.8552"></a>
+<span class="sourceLineNo">8553</span>  }<a name="line.8553"></a>
+<span class="sourceLineNo">8554</span><a name="line.8554"></a>
+<span class="sourceLineNo">8555</span>  /**<a name="line.8555"></a>
+<span class="sourceLineNo">8556</span>   * Try to acquire a lock.  Throw RegionTooBusyException<a name="line.8556"></a>
+<span class="sourceLineNo">8557</span>   * if failed to get the lock in time. Throw InterruptedIOException<a name="line.8557"></a>
+<span class="sourceLineNo">8558</span>   * if interrupted while waiting for the lock.<a name="line.8558"></a>
+<span class="sourceLineNo">8559</span>   */<a name="line.8559"></a>
+<span class="sourceLineNo">8560</span>  private void lock(final Lock lock, final int multiplier)<a name="line.8560"></a>
+<span class="sourceLineNo">8561</span>      throws RegionTooBusyException, InterruptedIOException {<a name="line.8561"></a>
+<span class="sourceLineNo">8562</span>    try {<a name="line.8562"></a>
+<span class="sourceLineNo">8563</span>      final long waitTime = Math.min(maxBusyWaitDuration,<a name="line.8563"></a>
+<span class="sourceLineNo">8564</span>          busyWaitDuration * Math.min(multiplier, maxBusyWaitMultiplier));<a name="line.8564"></a>
+<span class="sourceLineNo">8565</span>      if (!lock.tryLock(waitTime, TimeUnit.MILLISECONDS)) {<a name="line.8565"></a>
+<span class="sourceLineNo">8566</span>        // Don't print millis. Message is used as a key over in<a name="line.8566"></a>
+<span class="sourceLineNo">8567</span>        // RetriesExhaustedWithDetailsException processing.<a name="line.8567"></a>
+<span class="sourceLineNo">8568</span>        throw new RegionTooBusyException("Failed to obtain lock; regionName=" +<a name="line.8568"></a>
+<span class="sourceLineNo">8569</span>            (this.getRegionInfo() == null? "unknown":<a name="line.8569"></a>
+<span class="sourceLineNo">8570</span>                this.getRegionInfo().getRegionNameAsString()) +<a name="line.8570"></a>
+<span class="sourceLineNo">8571</span>            ", server=" + (this.getRegionServerServices() == null? "unknown":<a name="line.8571"></a>
+<span class="sourceLineNo">8572</span>                this.getRegionServerServices().getServerName()));<a name="line.8572"></a>
+<span class="sourceLineNo">8573</span>      }<a name="line.8573"></a>
+<span class="sourceLineNo">8574</span>    } catch (InterruptedException ie) {<a name="line.8574"></a>
+<span class="sourceLineNo">8575</span>      LOG.info("Interrupted while waiting for a lock");<a name="line.8575"></a>
+<span class="sourceLineNo">8576</span>      InterruptedIOException iie = new InterruptedIOException();<a name="line.8576"></a>
+<span class="sourceLineNo">8577</span>      iie.initCause(ie);<a name="line.8577"></a>
+<span class="sourceLineNo">8578</span>      throw iie;<a name="line.8578"></a>
+<span class="sourceLineNo">8579</span>    }<a name="line.8579"></a>
+<span class="sourceLineNo">8580</span>  }<a name="line.8580"></a>
+<span class="sourceLineNo">8581</span><a name="line.8581"></a>
+<span class="sourceLineNo">8582</span>  /**<a name="line.8582"></a>
+<span class="sourceLineNo">8583</span>   * Calls sync with the given transaction ID<a name="line.8583"></a>
+<span class="sourceLineNo">8584</span>   * @param txid should sync up to which transaction<a name="line.8584"></a>
+<span class="sourceLineNo">8585</span>   * @throws IOException If anything goes wrong with DFS<a name="line.8585"></a>
+<span class="sourceLineNo">8586</span>   */<a name="line.8586"></a>
+<span class="sourceLineNo">8587</span>  private void sync(long txid, Durability durability) throws IOException {<a name="line.8587"></a>
+<span class="sourceLineNo">8588</span>    if (this.getRegionInfo().isMetaRegion()) {<a name="line.8588"></a>
+<span class="sourceLineNo">8589</span>      this.wal.sync(txid);<a name="line.8589"></a>
+<span class="sourceLineNo">8590</span>    } else {<a name="line.8590"></a>
+<span class="sourceLineNo">8591</span>      switch(durability) {<a name="line.8591"></a>
+<span class="sourceLineNo">8592</span>      case USE_DEFAULT:<a name="line.8592"></a>
+<span class="sourceLineNo">8593</span>        // do what table defaults to<a name="line.8593"></a>
+<span class="sourceLineNo">8594</span>        if (shouldSyncWAL()) {<a name="line.8594"></a>
+<span class="sourceLineNo">8595</span>          this.wal.sync(txid);<a name="line.8595"></a>
+<span class="sourceLineNo">8596</span>        }<a name="line.8596"></a>
+<span class="sourceLineNo">8597</span>        break;<a name="line.8597"></a>
+<span class="sourceLineNo">8598</span>      case SKIP_WAL:<a name="line.8598"></a>
+<span class="sourceLineNo">8599</span>        // nothing do to<a name="line.8599"></a>
+<span class="sourceLineNo">8600</span>        break;<a name="line.8600"></a>
+<span class="sourceLineNo">8601</span>      case ASYNC_WAL:<a name="line.8601"></a>
+<span class="sourceLineNo">8602</span>        // nothing do to<a name="line.8602"></a>
+<span class="sourceLineNo">8603</span>        break;<a name="line.8603"></a>
+<span class="sourceLineNo">8604</span>      case SYNC_WAL:<a name="line.8604"></a>
+<span class="sourceLineNo">8605</span>          this.wal.sync(txid, false);<a name="line.8605"></a>
+<span class="sourceLineNo">8606</span>          break;<a name="line.8606"></a>
+<span class="sourceLineNo">8607</span>      case FSYNC_WAL:<a name="line.8607"></a>
+<span class="sourceLineNo">8608</span>          this.wal.sync(txid, true);<a name="line.8608"></a>
+<span class="sourceLineNo">8609</span>          break;<a name="line.8609"></a>
+<span class="sourceLineNo">8610</span>      default:<a name="line.8610"></a>
+<span class="sourceLineNo">8611</span>        throw new RuntimeException("Unknown durability " + durability);<a name="line.8611"></a>
+<span class="sourceLineNo">8612</span>      }<a name="line.8612"></a>
+<span class="sourceLineNo">8613</span>    }<a name="line.8613"></a>
+<span class="sourceLineNo">8614</span>  }<a name="line.8614"></a>
+<span class="sourceLineNo">8615</span><a name="line.8615"></a>
+<span class="sourceLineNo">8616</span>  /**<a name="line.8616"></a>
+<span class="sourceLineNo">8617</span>   * Check whether we should sync the wal from the table's durability settings<a name="line.8617"></a>
+<span class="sourceLineNo">8618</span>   */<a name="line.8618"></a>
+<span class="sourceLineNo">8619</span>  private boolean shouldSyncWAL() {<a name="line.8619"></a>
+<span class="sourceLineNo">8620</span>    return regionDurability.ordinal() &gt;  Durability.ASYNC_WAL.ordinal();<a name="line.8620"></a>
+<span class="sourceLineNo">8621</span>  }<a name="line.8621"></a>
 <span class="sourceLineNo">8622</span><a name="line.8622"></a>
-<span class="sourceLineNo">8623</span>    @Override<a name="line.8623"></a>
-<span class="sourceLineNo">8624</span>    public void add(int index, Cell element) {<a name="line.8624"></a>
-<span class="sourceLineNo">8625</span>      // do nothing<a name="line.8625"></a>
-<span class="sourceLineNo">8626</span>    }<a name="line.8626"></a>
+<span class="sourceLineNo">8623</span>  /**<a name="line.8623"></a>
+<span class="sourceLineNo">8624</span>   * A mocked list implementation - discards all updates.<a name="line.8624"></a>
+<span class="sourceLineNo">8625</span>   */<a name="line.8625"></a>
+<span class="sourceLineNo">8626</span>  private static final List&lt;Cell&gt; MOCKED_LIST = new AbstractList&lt;Cell&gt;() {<a name="line.8626"></a>
 <span class="sourceLineNo">8627</span><a name="line.8627"></a>
 <span class="sourceLineNo">8628</span>    @Override<a name="line.8628"></a>
-<span class="sourceLineNo">8629</span>    public boolean addAll(int index, Collection&lt;? extends Cell&gt; c) {<a name="line.8629"></a>
-<span class="sourceLineNo">8630</span>      return false; // this list is never changed as a result of an update<a name="line.8630"></a>
+<span class="sourceLineNo">8629</span>    public void add(int index, Cell element) {<a name="line.8629"></a>
+<span class="sourceLineNo">8630</span>      // do nothing<a name="line.8630"></a>
 <span class="sourceLineNo">8631</span>    }<a name="line.8631"></a>
 <span class="sourceLineNo">8632</span><a name="line.8632"></a>
 <span class="sourceLineNo">8633</span>    @Override<a name="line.8633"></a>
-<span class="sourceLineNo">8634</span>    public KeyValue get(int index) {<a name="line.8634"></a>
-<span class="sourceLineNo">8635</span>      throw new UnsupportedOperationException();<a name="line.8635"></a>
+<span class="sourceLineNo">8634</span>    public boolean addAll(int index, Collection&lt;? extends Cell&gt; c) {<a name="line.8634"></a>
+<span class="sourceLineNo">8635</span>      return false; // this list is never changed as a result of an update<a name="line.8635"></a>
 <span class="sourceLineNo">8636</span>    }<a name="line.8636"></a>
 <span class="sourceLineNo">8637</span><a name="line.8637"></a>
 <span class="sourceLineNo">8638</span>    @Override<a name="line.8638"></a>
-<span class="sourceLineNo">8639</span>    public int size() {<a name="line.8639"></a>
-<span class="sourceLineNo">8640</span>      return 0;<a name="line.8640"></a>
+<span class="sourceLineNo">8639</span>    public KeyValue get(int index) {<a name="line.8639"></a>
+<span class="sourceLineNo">8640</span>      throw new UnsupportedOperationException();<a name="line.8640"></a>
 <span class="sourceLineNo">8641</span>    }<a name="line.8641"></a>
-<span class="sourceLineNo">8642</span>  };<a name="line.8642"></a>
-<span class="sourceLineNo">8643</span><a name="line.8643"></a>
-<span class="sourceLineNo">8644</span>  /** @return the latest sequence number that was read from storage when this region was opened */<a name="line.8644"></a>
-<span class="sourceLineNo">8645</span>  public long getOpenSeqNum() {<a name="line.8645"></a>
-<span class="sourceLineNo">8646</span>    return this.openSeqNum;<a name="line.8646"></a>
-<span class="sourceLineNo">8647</span>  }<a name="line.8647"></a>
+<span class="sourceLineNo">8642</span><a name="line.8642"></a>
+<span class="sourceLineNo">8643</span>    @Override<a name="line.8643"></a>
+<span class="sourceLineNo">8644</span>    public int size() {<a name="line.8644"></a>
+<span class="sourceLineNo">8645</span>      return 0;<a name="line.8645"></a>
+<span class="sourceLineNo">8646</span>    }<a name="line.8646"></a>
+<span class="sourceLineNo">8647</span>  };<a name="line.8647"></a>
 <span class="sourceLineNo">8648</span><a name="line.8648"></a>
-<span class="sourceLineNo">8649</span>  @Override<a name="line.8649"></a>
-<span class="sourceLineNo">8650</span>  public Map&lt;byte[], Long&gt; getMaxStoreSeqId() {<a name="line.8650"></a>
-<span class="sourceLineNo">8651</span>    return this.maxSeqIdInStores;<a name="line.8651"></a>
+<span class="sourceLineNo">8649</span>  /** @return the latest sequence number that was read from storage when this region was opened */<a name="line.8649"></a>
+<span class="sourceLineNo">8650</span>  public long getOpenSeqNum() {<a name="line.8650"></a>
+<span class="sourceLineNo">8651</span>    return this.openSeqNum;<a name="line.8651"></a>
 <span class="sourceLineNo">8652</span>  }<a name="line.8652"></a>
 <span class="sourceLineNo">8653</span><a name="line.8653"></a>
-<span class="sourceLineNo">8654</span>  public long getOldestSeqIdOfStore(byte[] familyName) {<a name="line.8654"></a>
-<span class="sourceLineNo">8655</span>    return wal.getEarliestMemStoreSeqNum(getRegionInfo().getEncodedNameAsBytes(), familyName);<a name="line.8655"></a>
-<span class="sourceLineNo">8656</span>  }<a name="line.8656"></a>
-<span class="sourceLineNo">8657</span><a name="line.8657"></a>
-<span class="sourceLineNo">8658</span>  @Override<a name="line.8658"></a>
-<span class="sourceLineNo">8659</span>  public CompactionState getCompactionState() {<a name="line.8659"></a>
-<span class="sourceLineNo">8660</span>    boolean hasMajor = majorInProgress.get() &gt; 0, hasMinor = minorInProgress.get() &gt; 0;<a name="line.8660"></a>
-<span class="sourceLineNo">8661</span>    return (hasMajor ? (hasMinor ? CompactionState.MAJOR_AND_MINOR : CompactionState.MAJOR)<a name="line.8661"></a>
-<span class="sourceLineNo">8662</span>        : (hasMinor ? CompactionState.MINOR : CompactionState.NONE));<a name="line.8662"></a>
-<span class="sourceLineNo">8663</span>  }<a name="line.8663"></a>
-<span class="sourceLineNo">8664</span><a name="line.8664"></a>
-<span class="sourceLineNo">8665</span>  public void reportCompactionRequestStart(boolean isMajor){<a name="line.8665"></a>
-<span class="sourceLineNo">8666</span>    (isMajor ? majorInProgress : minorInProgress).incrementAndGet();<a name="line.8666"></a>
-<span class="sourceLineNo">8667</span>  }<a name="line.8667"></a>
-<span class="sourceLineNo">8668</span><a name="line.8668"></a>
-<span class="sourceLineNo">8669</span>  public void reportCompactionRequestEnd(boolean isMajor, int numFiles, long filesSizeCompacted) {<a name="line.8669"></a>
-<span class="sourceLineNo">8670</span>    int newValue = (isMajor ? majorInProgress : minorInProgress).decrementAndGet();<a name="line.8670"></a>
-<span class="sourceLineNo">8671</span><a name="line.8671"></a>
-<span class="sourceLineNo">8672</span>    // metrics<a name="line.8672"></a>
-<span class="sourceLineNo">8673</span>    compactionsFinished.increment();<a name="line.8673"></a>
-<span class="sourceLineNo">8674</span>    compactionNumFilesCompacted.add(numFiles);<a name="line.8674"></a>
-<span class="sourceLineNo">8675</span>    compactionNumBytesCompacted.add(filesSizeCompacted);<a name="line.8675"></a>
+<span class="sourceLineNo">8654</span>  @Override<a name="line.8654"></a>
+<span class="sourceLineNo">8655</span>  public Map&lt;byte[], Long&gt; getMaxStoreSeqId() {<a name="line.8655"></a>
+<span class="sourceLineNo">8656</span>    return this.maxSeqIdInStores;<a name="line.8656"></a>
+<span class="sourceLineNo">8657</span>  }<a name="line.8657"></a>
+<span class="sourceLineNo">8658</span><a name="line.8658"></a>
+<span class="sourceLineNo">8659</span>  public long getOldestSeqIdOfStore(byte[] familyName) {<a name="line.8659"></a>
+<span class="sourceLineNo">8660</span>    return wal.getEarliestMemStoreSeqNum(getRegionInfo().getEncodedNameAsBytes(), familyName);<a name="line.8660"></a>
+<span class="sourceLineNo">8661</span>  }<a name="line.8661"></a>
+<span class="sourceLineNo">8662</span><a name="line.8662"></a>
+<span class="sourceLineNo">8663</span>  @Override<a name="line.8663"></a>
+<span class="sourceLineNo">8664</span>  public CompactionState getCompactionState() {<a name="line.8664"></a>
+<span class="sourceLineNo">8665</span>    boolean hasMajor = majorInProgress.get() &gt; 0, hasMinor = minorInProgress.get() &gt; 0;<a name="line.8665"></a>
+<span class="sourceLineNo">8666</span>    return (hasMajor ? (hasMinor ? CompactionState.MAJOR_AND_MINOR : CompactionState.MAJOR)<a name="line.8666"></a>
+<span class="sourceLineNo">8667</span>        : (hasMinor ? CompactionState.MINOR : CompactionState.NONE));<a name="line.8667"></a>
+<span class="sourceLineNo">8668</span>  }<a name="line.8668"></a>
+<span class="sourceLineNo">8669</span><a name="line.8669"></a>
+<span class="sourceLineNo">8670</span>  public void reportCompactionRequestStart(boolean isMajor){<a name="line.8670"></a>
+<span class="sourceLineNo">8671</span>    (isMajor ? majorInProgress : minorInProgress).incrementAndGet();<a name="line.8671"></a>
+<span class="sourceLineNo">8672</span>  }<a name="line.8672"></a>
+<span class="sourceLineNo">8673</span><a name="line.8673"></a>
+<span class="sourceLineNo">8674</span>  public void reportCompactionRequestEnd(boolean isMajor, int numFiles, long filesSizeCompacted) {<a name="line.8674"></a>
+<span class="sourceLineNo">8675</span>    int newValue = (isMajor ? majorInProgress : minorInProgress).decrementAndGet();<a name="line.8675"></a>
 <span class="sourceLineNo">8676</span><a name="line.8676"></a>
-<span class="sourceLineNo">8677</span>    assert newValue &gt;= 0;<a name="line.8677"></a>
-<span class="sourceLineNo">8678</span>  }<a name="line.8678"></a>
-<span class="sourceLineNo">8679</span><a name="line.8679"></a>
-<span class="sourceLineNo">8680</span>  public void reportCompactionRequestFailure() {<a name="line.8680"></a>
-<span class="sourceLineNo">8681</span>    compactionsFailed.increment();<a name="line.8681"></a>
-<span class="sourceLineNo">8682</span>  }<a name="line.8682"></a>
-<span class="sourceLineNo">8683</span><a name="line.8683"></a>
-<span class="sourceLineNo">8684</span>  public void incrementCompactionsQueuedCount() {<a name="line.8684"></a>
-<span class="sourceLineNo">8685</span>    compactionsQueued.increment();<a name="line.8685"></a>
-<span class="sourceLineNo">8686</span>  }<a name="line.8686"></a>
-<span class="sourceLineNo">8687</span><a name="line.8687"></a>
-<span class="sourceLineNo">8688</span>  public void decrementCompactionsQueuedCount() {<a name="line.8688"></a>
-<span class="sourceLineNo">8689</span>    compactionsQueued.decrement();<a name="line.8689"></a>
-<span class="sourceLineNo">8690</span>  }<a name="line.8690"></a>
-<span class="sourceLineNo">8691</span><a name="line.8691"></a>
-<span class="sourceLineNo">8692</span>  public void incrementFlushesQueuedCount() {<a name="line.8692"></a>
-<span class="sourceLineNo">8693</span>    flushesQueued.increment();<a name="line.8693"></a>
-<span class="sourceLineNo">8694</span>  }<a name="line.8694"></a>
-<span class="sourceLineNo">8695</span><a name="line.8695"></a>
-<span class="sourceLineNo">8696</span>  @VisibleForTesting<a name="line.8696"></a>
-<span class="sourceLineNo">8697</span>  public long getReadPoint() {<a name="line.8697"></a>
-<span class="sourceLineNo">8698</span>    return getReadPoint(IsolationLevel.READ_COMMITTED);<a name="line.8698"></a>
+<span class="sourceLineNo">8677</span>    // metrics<a name="line.8677"></a>
+<span class="sourceLineNo">8678</span>    compactionsFinished.increment();<a name="line.8678"></a>
+<span class="sourceLineNo">8679</span>    compactionNumFilesCompacted.add(numFiles);<a name="line.8679"></a>
+<span class="sourceLineNo">8680</span>    compactionNumBytesCompacted.add(filesSizeCompacted);<a name="line.8680"></a>
+<span class="sourceLineNo">8681</span><a name="line.8681"></a>
+<span class="sourceLineNo">8682</span>    assert newValue &gt;= 0;<a name="line.8682"></a>
+<span class="sourceLineNo">8683</span>  }<a name="line.8683"></a>
+<span class="sourceLineNo">8684</span><a name="line.8684"></a>
+<span class="sourceLineNo">8685</span>  public void reportCompactionRequestFailure() {<a name="line.8685"></a>
+<span class="sourceLineNo">8686</span>    compactionsFailed.increment();<a name="line.8686"></a>
+<span class="sourceLineNo">8687</span>  }<a name="line.8687"></a>
+<span class="sourceLineNo">8688</span><a name="line.8688"></a>
+<span class="sourceLineNo">8689</span>  public void incrementCompactionsQueuedCount() {<a name="line.8689"></a>
+<span class="sourceLineNo">8690</span>    compactionsQueued.increment();<a name="line.8690"></a>
+<span class="sourceLineNo">8691</span>  }<a name="line.8691"></a>
+<span class="sourceLineNo">8692</span><a name="line.8692"></a>
+<span class="sourceLineNo">8693</span>  public void decrementCompactionsQueuedCount() {<a name="line.8693"></a>
+<span class="sourceLineNo">8694</span>    compactionsQueued.decrement();<a name="line.8694"></a>
+<span class="sourceLineNo">8695</span>  }<a name="line.8695"></a>
+<span class="sourceLineNo">8696</span><a name="line.8696"></a>
+<span class="sourceLineNo">8697</span>  public void incrementFlushesQueuedCount() {<a name="line.8697"></a>
+<span class="sourceLineNo">8698</span>    flushesQueued.increment();<a name="line.8698"></a>
 <span class="sourceLineNo">8699</span>  }<a name="line.8699"></a>
 <span class="sourceLineNo">8700</span><a name="line.8700"></a>
-<span class="sourceLineNo">8701</span>  /**<a name="line.8701"></a>
-<span class="sourceLineNo">8702</span>   * {@inheritDoc}<a name="line.8702"></a>
-<span class="sourceLineNo">8703</span>   */<a name="line.8703"></a>
-<span class="sourceLineNo">8704</span>  @Override<a name="line.8704"></a>
-<span class="sourceLineNo">8705</span>  public void onConfigurationChange(Configuration conf) {<a name="line.8705"></a>
-<span class="sourceLineNo">8706</span>    this.storeHotnessProtector.update(conf);<a name="line.8706"></a>
-<span class="sourceLineNo">8707</span>  }<a name="line.8707"></a>
-<span class="sourceLineNo">8708</span><a name="line.8708"></a>
-<span class="sourceLineNo">8709</span>  /**<a name="line.8709"></a>
-<span class="sourceLineNo">8710</span>   * {@inheritDoc}<a name="line.8710"></a>
-<span class="sourceLineNo">8711</span>   */<a name="line.8711"></a>
-<span class="sourceLineNo">8712</span>  @Override<a name="line.8712"></a>
-<span class="sourceLineNo">8713</span>  public void registerChildren(ConfigurationManager manager) {<a name="line.8713"></a>
-<span class="sourceLineNo">8714</span>    configurationManager = Optional.of(manager);<a name="line.8714"></a>
-<span class="sourceLineNo">8715</span>    stores.values().forEach(manager::registerObserver);<a name="line.8715"></a>
-<span class="sourceLineNo">8716</span>  }<a name="line.8716"></a>
-<span class="sourceLineNo">8717</span><a name="line.8717"></a>
-<span class="sourceLineNo">8718</span>  /**<a name="line.8718"></a>
-<span class="sourceLineNo">8719</span>   * {@inheritDoc}<a name="line.8719"></a>
-<span class="sourceLineNo">8720</span>   */<a name="line.8720"></a>
-<span class="sourceLineNo">8721</span>  @Override<a name="line.8721"></a>
-<span class="sourceLineNo">8722</span>  public void deregisterChildren(ConfigurationManager manager) {<a name="line.8722"></a>
-<span class="sourceLineNo">8723</span>    stores.values().forEach(configurationManager.get()::deregisterObserver);<a name="line.8723"></a>
-<span class="sourceLineNo">8724</span>  }<a name="line.8724"></a>
-<span class="sourceLineNo">8725</span><a name="line.8725"></a>
+<span class="sourceLineNo">8701</span>  @VisibleForTesting<a name="line.8701"></a>
+<span class="sourceLineNo">8702</span>  public long getReadPoint() {<a name="line.8702"></a>
+<span class="sourceLineNo">8703</span>    return getReadPoint(IsolationLevel.READ_COMMITTED);<a name="line.8703"></a>
+<span class="sourceLineNo">8704</span>  }<a name="line.8704"></a>
+<span class="sourceLineNo">8705</span><a name="line.8705"></a>
+<span class="sourceLineNo">8706</span>  /**<a name="line.8706"></a>
+<span class="sourceLineNo">8707</span>   * {@inheritDoc}<a name="line.8707"></a>
+<span class="sourceLineNo">8708</span>   */<a name="line.8708"></a>
+<span class="sourceLineNo">8709</span>  @Override<a name="line.8709"></a>
+<span class="sourceLineNo">8710</span>  public void onConfigurationChange(Configuration conf) {<a name="line.8710"></a>
+<span class="sourceLineNo">8711</span>    this.storeHotnessProtector.update(conf);<a name="line.8711"></a>
+<span class="sourceLineNo">8712</span>  }<a name="line.8712"></a>
+<span class="sourceLineNo">8713</span><a name="line.8713"></a>
+<span class="sourceLineNo">8714</span>  /**<a name="line.8714"></a>
+<span class="sourceLineNo">8715</span>   * {@inheritDoc}<a name="line.8715"></a>
+<span class="sourceLineNo">8716</span>   */<a name="line.8716"></a>
+<span class="sourceLineNo">8717</span>  @Override<a name="line.8717"></a>
+<span class="sourceLineNo">8718</span>  public void registerChildren(ConfigurationManager manager) {<a name="line.8718"></a>
+<span class="sourceLineNo">8719</span>    configurationManager = Optional.of(manager);<a name="line.8719"></a>
+<span class="sourceLineNo">8720</span>    stores.values().forEach(manager::registerObserver);<a name="line.8720"></a>
+<span class="sourceLineNo">8721</span>  }<a name="line.8721"></a>
+<span class="sourceLineNo">8722</span><a name="line.8722"></a>
+<span class="sourceLineNo">8723</span>  /**<a name="line.8723"></a>
+<span class="sourceLineNo">8724</span>   * {@inheritDoc}<a name="line.8724"></a>
+<span class="sourceLineNo">8725</span>   */<a name="line.8725"></a>
 <span class="sourceLineNo">8726</span>  @Override<a name="line.8726"></a>
-<span class="sourceLineNo">8727</span>  public CellComparator getCellComparator() {<a name="line.8727"></a>
-<span class="sourceLineNo">8728</span>    return this.getRegionInfo().isMetaRegion() ? CellComparatorImpl.META_COMPARATOR<a name="line.8728"></a>
-<span class="sourceLineNo">8729</span>        : CellComparatorImpl.COMPARATOR;<a name="line.8729"></a>
-<span class="sourceLineNo">8730</span>  }<a name="line.8730"></a>
-<span class="sourceLineNo">8731</span><a name="line.8731"></a>
-<span class="sourceLineNo">8732</span>  public long getMemStoreFlushSize() {<a name="line.8732"></a>
-<span class="sourceLineNo">8733</span>    return this.memstoreFlushSize;<a name="line.8733"></a>
-<span class="sourceLineNo">8734</span>  }<a name="line.8734"></a>
-<span class="sourceLineNo">8735</span><a name="line.8735"></a>
+<span class="sourceLineNo">8727</span>  public void deregisterChildren(ConfigurationManager manager) {<a name="line.8727"></a>
+<span class="sourceLineNo">8728</span>    stores.values().forEach(configurationManager.get()::deregisterObserver);<a name="line.8728"></a>
+<span class="sourceLineNo">8729</span>  }<a name="line.8729"></a>
+<span class="sourceLineNo">8730</span><a name="line.8730"></a>
+<span class="sourceLineNo">8731</span>  @Override<a name="line.8731"></a>
+<span class="sourceLineNo">8732</span>  public CellComparator getCellComparator() {<a name="line.8732"></a>
+<span class="sourceLineNo">8733</span>    return this.getRegionInfo().isMetaRegion() ? CellComparatorImpl.META_COMPARATOR<a name="line.8733"></a>
+<span class="sourceLineNo">8734</span>        : CellComparatorImpl.COMPARATOR;<a name="line.8734"></a>
+<span class="sourceLineNo">8735</span>  }<a name="line.8735"></a>
 <span class="sourceLineNo">8736</span><a name="line.8736"></a>
-<span class="sourceLineNo">8737</span>  //// method for debugging tests<a name="line.8737"></a>
-<span class="sourceLineNo">8738</span>  void throwException(String title, String regionName) {<a name="line.8738"></a>
-<span class="sourceLineNo">8739</span>    StringBuilder buf = new StringBuilder();<a name="line.8739"></a>
-<span class="sourceLineNo">8740</span>    buf.append(title + ", ");<a name="line.8740"></a>
-<span class="sourceLineNo">8741</span>    buf.append(getRegionInfo().toString());<a name="line.8741"></a>
-<span class="sourceLineNo">8742</span>    buf.append(getRegionInfo().isMetaRegion() ? " meta region " : " ");<a name="line.8742"></a>
-<span class="sourceLineNo">8743</span>    buf.append("stores: ");<a name="line.8743"></a>
-<span class="sourceLineNo">8744</span>    for (HStore s : stores.values()) {<a name="line.8744"></a>
-<span class="sourceLineNo">8745</span>      buf.append(s.getColumnFamilyDescriptor().getNameAsString());<a name="line.8745"></a>
-<span class="sourceLineNo">8746</span>      buf.append(" size: ");<a name="line.8746"></a>
-<span class="sourceLineNo">8747</span>      buf.append(s.getMemStoreSize().getDataSize());<a name="line.8747"></a>
-<span class="sourceLineNo">8748</span>      buf.append(" ");<a name="line.8748"></a>
-<span class="sourceLineNo">8749</span>    }<a name="line.8749"></a>
-<span class="sourceLineNo">8750</span>    buf.append("end-of-stores");<a name="line.8750"></a>
-<span class="sourceLineNo">8751</span>    buf.append(", memstore size ");<a name="line.8751"></a>
-<span class="sourceLineNo">8752</span>    buf.append(getMemStoreDataSize());<a name="line.8752"></a>
-<span class="sourceLineNo">8753</span>    if (getRegionInfo().getRegionNameAsString().startsWith(regionName)) {<a name="line.8753"></a>
-<span class="sourceLineNo">8754</span>      throw new RuntimeException(buf.toString());<a name="line.8754"></a>
-<span class="sourceLineNo">8755</span>    }<a name="line.8755"></a>
-<span class="sourceLineNo">8756</span>  }<a name="line.8756"></a>
-<span class="sourceLineNo">8757</span><a name="line.8757"></a>
-<span class="sourceLineNo">8758</span>  @Override<a name="line.8758"></a>
-<span class="sourceLineNo">8759</span>  public void requestCompaction(String why, int priority, boolean major,<a name="line.8759"></a>
-<span class="sourceLineNo">8760</span>      CompactionLifeCycleTracker tracker) throws IOException {<a name="line.8760"></a>
-<span class="sourceLineNo">8761</span>    if (major) {<a name="line.8761"></a>
-<span class="sourceLineNo">8762</span>      stores.values().forEach(HStore::triggerMajorCompaction);<a name="line.8762"></a>
-<span class="sourceLineNo">8763</span>    }<a name="line.8763"></a>
-<span class="sourceLineNo">8764</span>    rsServices.getCompactionRequestor().requestCompaction(this, why, priority, tracker,<a name="line.8764"></a>
-<span class="sourceLineNo">8765</span>        RpcServer.getRequestUser().orElse(null));<a name="line.8765"></a>
-<span class="sourceLineNo">8766</span>  }<a name="line.8766"></a>
-<span class="sourceLineNo">8767</span><a name="line.8767"></a>
-<span class="sourceLineNo">8768</span>  @Override<a name="line.8768"></a>
-<span class="sourceLineNo">8769</span>  public void requestCompaction(byte[] family, String why, int priority, boolean major,<a name="line.8769"></a>
-<span class="sourceLineNo">8770</span>      CompactionLifeCycleTracker tracker) throws IOException {<a name="line.8770"></a>
-<span class="sourceLineNo">8771</span>    HStore store = stores.get(family);<a name="line.8771"></a>
-<span class="sourceLineNo">8772</span>    if (store == null) {<a name="line.8772"></a>
-<span class="sourceLineNo">8773</span>      throw new NoSuchColumnFamilyException("column family " + Bytes.toString(family) +<a name="line.8773"></a>
-<span class="sourceLineNo">8774</span>          " does not exist in region " + getRegionInfo().getRegionNameAsString());<a name="line.8774"></a>
-<span class="sourceLineNo">8775</span>    }<a name="line.8775"></a>
-<span class="sourceLineNo">8776</span>    if (major) {<a name="line.8776"></a>
-<span class="sourceLineNo">8777</span>      store.triggerMajorCompaction();<a name="line.8777"></a>
-<span class="sourceLineNo">8778</span>    }<a name="line.8778"></a>
-<span class="sourceLineNo">8779</span>    rsServices.getCompactionRequestor().requestCompaction(this, store, why, priority, tracker,<a name="line.8779"></a>
-<span class="sourceLineNo">8780</span>        RpcServer.getRequestUser().orElse(null));<a name="line.8780"></a>
-<span class="sourceLineNo">8781</span>  }<a name="line.8781"></a>
-<span class="sourceLineNo">8782</span><a name="line.8782"></a>
-<span class="sourceLineNo">8783</span>  private void requestFlushIfNeeded() throws RegionTooBusyException {<a name="line.8783"></a>
-<span class="sourceLineNo">8784</span>    if(isFlushSize(this.memStoreSizing.getMemStoreSize())) {<a name="line.8784"></a>
-<span class="sourceLineNo">8785</span>      requestFlush();<a name="line.8785"></a>
-<span class="sourceLineNo">8786</span>    }<a name="line.8786"></a>
-<span class="sourceLineNo">8787</span>  }<a name="line.8787"></a>
-<span class="sourceLineNo">8788</span><a name="line.8788"></a>
-<span class="sourceLineNo">8789</span>  private void requestFlush() {<a name="line.8789"></a>
-<span class="sourceLineNo">8790</span>    if (this.rsServices == null) {<a name="line.8790"></a>
-<span class="sourceLineNo">8791</span>      return;<a name="line.8791"></a>
-<span class="sourceLineNo">8792</span>    }<a name="line.8792"></a>
-<span class="sourceLineNo">8793</span>    requestFlush0(FlushLifeCycleTracker.DUMMY);<a name="line.8793"></a>
-<span class="sourceLineNo">8794</span>  }<a name="line.8794"></a>
-<span class="sourceLineNo">8795</span><a name="line.8795"></a>
-<span class="sourceLineNo">8796</span>  private void requestFlush0(FlushLifeCycleTracker tracker) {<a name="line.8796"></a>
-<span class="sourceLineNo">8797</span>    boolean shouldFlush = false;<a name="line.8797"></a>
-<span class="sourceLineNo">8798</span>    synchronized (writestate) {<a name="line.8798"></a>
-<span class="sourceLineNo">8799</span>      if (!this.writestate.isFlushRequested()) {<a name="line.8799"></a>
-<span class="sourceLineNo">8800</span>        shouldFlush = true;<a name="line.8800"></a>
-<span class="sourceLineNo">8801</span>        writestate.flushRequested = true;<a name="line.8801"></a>
-<span class="sourceLineNo">8802</span>      }<a name="line.8802"></a>
-<span class="sourceLineNo">8803</span>    }<a name="line.8803"></a>
-<span class="sourceLineNo">8804</span>    if (shouldFlush) {<a name="line.8804"></a>
-<span class="sourceLineNo">8805</span>      // Make request outside of synchronize block; HBASE-818.<a name="line.8805"></a>
-<span class="sourceLineNo">8806</span>      this.rsServices.getFlushRequester().requestFlush(this, false, tracker);<a name="line.8806"></a>
-<span class="sourceLineNo">8807</span>      if (LOG.isDebugEnabled()) {<a name="line.8807"></a>
-<span class="sourceLineNo">8808</span>        LOG.debug("Flush requested on " + this.getRegionInfo().getEncodedName());<a name="line.8808"></a>
-<span class="sourceLineNo">8809</span>      }<a name="line.8809"></a>
-<span class="sourceLineNo">8810</span>    } else {<a name="line.8810"></a>
-<span class="sourceLineNo">8811</span>      tracker.notExecuted("Flush already requested on " + this);<a name="line.8811"></a>
-<span class="sourceLineNo">8812</span>    }<a name="line.8812"></a>
-<span class="sourceLineNo">8813</span>  }<a name="line.8813"></a>
-<span class="sourceLineNo">8814</span><a name="line.8814"></a>
-<span class="sourceLineNo">8815</span>  @Override<a name="line.8815"></a>
-<span class="sourceLineNo">8816</span>  public void requestFlush(FlushLifeCycleTracker tracker) throws IOException {<a name="line.8816"></a>
-<span class="sourceLineNo">8817</span>    requestFlush0(tracker);<a name="line.8817"></a>
+<span class="sourceLineNo">8737</span>  public long getMemStoreFlushSize() {<a name="line.8737"></a>
+<span class="sourceLineNo">8738</span>    return this.memstoreFlushSize;<a name="line.8738"></a>
+<span class="sourceLineNo">8739</span>  }<a name="line.8739"></a>
+<span class="sourceLineNo">8740</span><a name="line.8740"></a>
+<span class="sourceLineNo">8741</span><a name="line.8741"></a>
+<span class="sourceLineNo">8742</span>  //// method for debugging tests<a name="line.8742"></a>
+<span class="sourceLineNo">8743</span>  void throwException(String title, String regionName) {<a name="line.8743"></a>
+<span class="sourceLineNo">8744</span>    StringBuilder buf = new StringBuilder();<a name="line.8744"></a>
+<span class="sourceLineNo">8745</span>    buf.append(title + ", ");<a name="line.8745"></a>
+<span class="sourceLineNo">8746</span>    buf.append(getRegionInfo().toString());<a name="line.8746"></a>
+<span class="sourceLineNo">8747</span>    buf.append(getRegionInfo().isMetaRegion() ? " meta region " : " ");<a name="line.8747"></a>
+<span class="sourceLineNo">8748</span>    buf.append("stores: ");<a name="line.8748"></a>
+<span class="sourceLineNo">8749</span>    for (HStore s : stores.values()) {<a name="line.8749"></a>
+<span class="sourceLineNo">8750</span>      buf.append(s.getColumnFamilyDescriptor().getNameAsString());<a name="line.8750"></a>
+<span class="sourceLineNo">8751</span>      buf.append(" size: ");<a name="line.8751"></a>
+<span class="sourceLineNo">8752</span>      buf.append(s.getMemStoreSize().getDataSize());<a name="line.8752"></a>
+<span class="sourceLineNo">8753</span>      buf.append(" ");<a name="line.8753"></a>
+<span class="sourceLineNo">8754</span>    }<a name="line.8754"></a>
+<span class="sourceLineNo">8755</span>    buf.append("end-of-stores");<a name="line.8755"></a>
+<span class="sourceLineNo">8756</span>    buf.append(", memstore size ");<a name="line.8756"></a>
+<span class="sourceLineNo">8757</span>    buf.append(getMemStoreDataSize());<a name="line.8757"></a>
+<span class="sourceLineNo">8758</span>    if (getRegionInfo().getRegionNameAsString().startsWith(regionName)) {<a name="line.8758"></a>
+<span class="sourceLineNo">8759</span>      throw new RuntimeException(buf.toString());<a name="line.8759"></a>
+<span class="sourceLineNo">8760</span>    }<a name="line.8760"></a>
+<span class="sourceLineNo">8761</span>  }<a name="line.8761"></a>
+<span class="sourceLineNo">8762</span><a name="line.8762"></a>
+<span class="sourceLineNo">8763</span>  @Override<a name="line.8763"></a>
+<span class="sourceLineNo">8764</span>  public void requestCompaction(String why, int priority, boolean major,<a name="line.8764"></a>
+<span class="sourceLineNo">8765</span>      CompactionLifeCycleTracker tracker) throws IOException {<a name="line.8765"></a>
+<span class="sourceLineNo">8766</span>    if (major) {<a name="line.8766"></a>
+<span class="sourceLineNo">8767</span>      stores.values().forEach(HStore::triggerMajorCompaction);<a name="line.8767"></a>
+<span class="sourceLineNo">8768</span>    }<a name="line.8768"></a>
+<span class="sourceLineNo">8769</span>    rsServices.getCompactionRequestor().requestCompaction(this, why, priority, tracker,<a name="line.8769"></a>
+<span class="sourceLineNo">8770</span>        RpcServer.getRequestUser().orElse(null));<a name="line.8770"></a>
+<span class="sourceLineNo">8771</span>  }<a name="line.8771"></a>
+<span class="sourceLineNo">8772</span><a name="line.8772"></a>
+<span class="sourceLineNo">8773</span>  @Override<a name="line.8773"></a>
+<span class="sourceLineNo">8774</span>  public void requestCompaction(byte[] family, String why, int priority, boolean major,<a name="line.8774"></a>
+<span class="sourceLineNo">8775</span>      CompactionLifeCycleTracker tracker) throws IOException {<a name="line.8775"></a>
+<span class="sourceLineNo">8776</span>    HStore store = stores.get(family);<a name="line.8776"></a>
+<span class="sourceLineNo">8777</span>    if (store == null) {<a name="line.8777"></a>
+<span class="sourceLineNo">8778</span>      throw new NoSuchColumnFamilyException("column family " + Bytes.toString(family) +<a name="line.8778"></a>
+<span class="sourceLineNo">8779</span>          " does not exist in region " + getRegionInfo().getRegionNameAsString());<a name="line.8779"></a>
+<span class="sourceLineNo">8780</span>    }<a name="line.8780"></a>
+<span class="sourceLineNo">8781</span>    if (major) {<a name="line.8781"></a>
+<span class="sourceLineNo">8782</span>      store.triggerMajorCompaction();<a name="line.8782"></a>
+<span class="sourceLineNo">8783</span>    }<a name="line.8783"></a>
+<span class="sourceLineNo">8784</span>    rsServices.getCompactionRequestor().requestCompaction(this, store, why, priority, tracker,<a name="line.8784"></a>
+<span class="sourceLineNo">8785</span>        RpcServer.getRequestUser().orElse(null));<a name="line.8785"></a>
+<span class="sourceLineNo">8786</span>  }<a name="line.8786"></a>
+<span class="sourceLineNo">8787</span><a name="line.8787"></a>
+<span class="sourceLineNo">8788</span>  private void requestFlushIfNeeded() throws RegionTooBusyException {<a name="line.8788"></a>
+<span class="sourceLineNo">8789</span>    if(isFlushSize(this.memStoreSizing.getMemStoreSize())) {<a name="line.8789"></a>
+<span class="sourceLineNo">8790</span>      requestFlush();<a name="line.8790"></a>
+<span class="sourceLineNo">8791</span>    }<a name="line.8791"></a>
+<span class="sourceLineNo">8792</span>  }<a name="line.8792"></a>
+<span class="sourceLineNo">8793</span><a name="line.8793"></a>
+<span class="sourceLineNo">8794</span>  private void requestFlush() {<a name="line.8794"></a>
+<span class="sourceLineNo">8795</span>    if (this.rsServices == null) {<a name="line.8795"></a>
+<span class="sourceLineNo">8796</span>      return;<a name="line.8796"></a>
+<span class="sourceLineNo">8797</span>    }<a name="line.8797"></a>
+<span class="sourceLineNo">8798</span>    requestFlush0(FlushLifeCycleTracker.DUMMY);<a name="line.8798"></a>
+<span class="sourceLineNo">8799</span>  }<a name="line.8799"></a>
+<span class="sourceLineNo">8800</span><a name="line.8800"></a>
+<span class="sourceLineNo">8801</span>  private void requestFlush0(FlushLifeCycleTracker tracker) {<a name="line.8801"></a>
+<span class="sourceLineNo">8802</span>    boolean shouldFlush = false;<a name="line.8802"></a>
+<span class="sourceLineNo">8803</span>    synchronized (writestate) {<a name="line.8803"></a>
+<span class="sourceLineNo">8804</span>      if (!this.writestate.isFlushRequested()) {<a name="line.8804"></a>
+<span class="sourceLineNo">8805</span>        shouldFlush = true;<a name="line.8805"></a>
+<span class="sourceLineNo">8806</span>        writestate.flushRequested = true;<a name="line.8806"></a>
+<span class="sourceLineNo">8807</span>      }<a name="line.8807"></a>
+<span class="sourceLineNo">8808</span>    }<a name="line.8808"></a>
+<span class="sourceLineNo">8809</span>    if (shouldFlush) {<a name="line.8809"></a>
+<span class="sourceLineNo">8810</span>      // Make request outside of synchronize block; HBASE-818.<a name="line.8810"></a>
+<span class="sourceLineNo">8811</span>      this.rsServices.getFlushRequester().requestFlush(this, false, tracker);<a name="line.8811"></a>
+<span class="sourceLineNo">8812</span>      if (LOG.isDebugEnabled()) {<a name="line.8812"></a>
+<span class="sourceLineNo">8813</span>        LOG.debug("Flush requested on " + this.getRegionInfo().getEncodedName());<a name="line.8813"></a>
+<span class="sourceLineNo">8814</span>      }<a name="line.8814"></a>
+<span class="sourceLineNo">8815</span>    } else {<a name="line.8815"></a>
+<span class="sourceLineNo">8816</span>      tracker.notExecuted("Flush already requested on " + this);<a name="line.8816"></a>
+<span class="sourceLineNo">8817</span>    }<a name="line.8817"></a>
 <span class="sourceLineNo">8818</span>  }<a name="line.8818"></a>
 <span class="sourceLineNo">8819</span><a name="line.8819"></a>
-<span class="sourceLineNo">8820</span>  /**<a name="line.8820"></a>
-<span class="sourceLineNo">8821</span>   * This method modifies the region's configuration in order to inject replication-related<a name="line.8821"></a>
-<span class="sourceLineNo">8822</span>   * features<a name="line.8822"></a>
-<span class="sourceLineNo">8823</span>   * @param conf region configurations<a name="line.8823"></a>
-<span class="sourceLineNo">8824</span>   */<a name="line.8824"></a>
-<span class="sourceLineNo">8825</span>  static void decorateRegionConfiguration(Configuration conf) {<a name="line.8825"></a>
-<span class="sourceLineNo">8826</span>    if (ReplicationUtils.isReplicationForBulkLoadDataEnabled(conf)) {<a name="line.8826"></a>
-<span class="sourceLineNo">8827</span>      String plugins = conf.get(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY,"");<a name="line.8827"></a>
-<span class="sourceLineNo">8828</span>      String replicationCoprocessorClass = ReplicationObserver.class.getCanonicalName();<a name="line.8828"></a>
-<span class="sourceLineNo">8829</span>      if (!plugins.contains(replicationCoprocessorClass)) {<a name="line.8829"></a>
-<span class="sourceLineNo">8830</span>        conf.set(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY,<a name="line.8830"></a>
-<span class="sourceLineNo">8831</span>            (plugins.equals("") ? "" : (plugins + ",")) + replicationCoprocessorClass);<a name="line.8831"></a>
-<span class="sourceLineNo">8832</span>      }<a name="line.8832"></a>
-<span class="sourceLineNo">8833</span>    }<a name="line.8833"></a>
-<span class="sourceLineNo">8834</span>  }<a name="line.8834"></a>
-<span class="sourceLineNo">8835</span>}<a name="line.8835"></a>
+<span class="sourceLineNo">8820</span>  @Override<a name="line.8820"></a>
+<span class="sourceLineNo">8821</span>  public void requestFlush(FlushLifeCycleTracker tracker) throws IOException {<a name="line.8821"></a>
+<span class="sourceLineNo">8822</span>    requestFlush0(tracker);<a name="line.8822"></a>
+<span class="sourceLineNo">8823</span>  }<a name="line.8823"></a>
+<span class="sourceLineNo">8824</span><a name="line.8824"></a>
+<span class="sourceLineNo">8825</span>  /**<a name="line.8825"></a>
+<span class="sourceLineNo">8826</span>   * This method modifies the region's configuration in order to inject replication-related<a name="line.8826"></a>
+<span class="sourceLineNo">8827</span>   * features<a name="line.8827"></a>
+<span class="sourceLineNo">8828</span>   * @param conf region configurations<a name="line.8828"></a>
+<span class="sourceLineNo">8829</span>   */<a name="line.8829"></a>
+<span class="sourceLineNo">8830</span>  static void decorateRegionConfiguration(Configuration conf) {<a name="line.8830"></a>
+<span class="sourceLineNo">8831</span>    if (ReplicationUtils.isReplicationForBulkLoadDataEnabled(conf)) {<a name="line.8831"></a>
+<span class="sourceLineNo">8832</span>      String plugins = conf.get(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY,"");<a name="line.8832"></a>
+<span class="sourceLineNo">8833</span>      String replicationCoprocessorClass = ReplicationObserver.class.getCanonicalName();<a name="line.8833"></a>
+<span class="sourceLineNo">8834</span>      if (!plugins.contains(replicationCoprocessorClass)) {<a name="line.8834"></a>
+<span class="sourceLineNo">8835</span>        conf.set(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY,<a name="line.8835"></a>
+<span class="sourceLineNo">8836</span>            (plugins.equals("") ? "" : (plugins + ",")) + replicationCoprocessorClass);<a name="line.8836"></a>
+<span class="sourceLineNo">8837</span>      }<a name="line.8837"></a>
+<span class="sourceLineNo">8838</span>    }<a name="line.8838"></a>
+<span class="sourceLineNo">8839</span>  }<a name="line.8839"></a>
+<span class="sourceLineNo">8840</span>}<a name="line.8840"></a>
 
 
 
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 8fcec33..2147e82 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
@@ -7972,875 +7972,880 @@
 <span class="sourceLineNo">7964</span>    if (walEdit.isReplay()) {<a name="line.7964"></a>
 <span class="sourceLineNo">7965</span>      walKey.setOrigLogSeqNum(origLogSeqNum);<a name="line.7965"></a>
 <span class="sourceLineNo">7966</span>    }<a name="line.7966"></a>
-<span class="sourceLineNo">7967</span>    WriteEntry writeEntry = null;<a name="line.7967"></a>
-<span class="sourceLineNo">7968</span>    try {<a name="line.7968"></a>
-<span class="sourceLineNo">7969</span>      long txid = this.wal.append(this.getRegionInfo(), walKey, walEdit, true);<a name="line.7969"></a>
-<span class="sourceLineNo">7970</span>      // Call sync on our edit.<a name="line.7970"></a>
-<span class="sourceLineNo">7971</span>      if (txid != 0) {<a name="line.7971"></a>
-<span class="sourceLineNo">7972</span>        sync(txid, durability);<a name="line.7972"></a>
-<span class="sourceLineNo">7973</span>      }<a name="line.7973"></a>
-<span class="sourceLineNo">7974</span>      writeEntry = walKey.getWriteEntry();<a name="line.7974"></a>
-<span class="sourceLineNo">7975</span>    } catch (IOException ioe) {<a name="line.7975"></a>
-<span class="sourceLineNo">7976</span>      if (walKey != null &amp;&amp; walKey.getWriteEntry() != null) {<a name="line.7976"></a>
-<span class="sourceLineNo">7977</span>        mvcc.complete(walKey.getWriteEntry());<a name="line.7977"></a>
+<span class="sourceLineNo">7967</span>    //don't call the coproc hook for writes to the WAL caused by<a name="line.7967"></a>
+<span class="sourceLineNo">7968</span>    //system lifecycle events like flushes or compactions<a name="line.7968"></a>
+<span class="sourceLineNo">7969</span>    if (this.coprocessorHost != null &amp;&amp; !walEdit.isMetaEdit()) {<a name="line.7969"></a>
+<span class="sourceLineNo">7970</span>      this.coprocessorHost.preWALAppend(walKey, walEdit);<a name="line.7970"></a>
+<span class="sourceLineNo">7971</span>    }<a name="line.7971"></a>
+<span class="sourceLineNo">7972</span>    WriteEntry writeEntry = null;<a name="line.7972"></a>
+<span class="sourceLineNo">7973</span>    try {<a name="line.7973"></a>
+<span class="sourceLineNo">7974</span>      long txid = this.wal.append(this.getRegionInfo(), walKey, walEdit, true);<a name="line.7974"></a>
+<span class="sourceLineNo">7975</span>      // Call sync on our edit.<a name="line.7975"></a>
+<span class="sourceLineNo">7976</span>      if (txid != 0) {<a name="line.7976"></a>
+<span class="sourceLineNo">7977</span>        sync(txid, durability);<a name="line.7977"></a>
 <span class="sourceLineNo">7978</span>      }<a name="line.7978"></a>
-<span class="sourceLineNo">7979</span>      throw ioe;<a name="line.7979"></a>
-<span class="sourceLineNo">7980</span>    }<a name="line.7980"></a>
-<span class="sourceLineNo">7981</span>    return writeEntry;<a name="line.7981"></a>
-<span class="sourceLineNo">7982</span>  }<a name="line.7982"></a>
-<span class="sourceLineNo">7983</span><a name="line.7983"></a>
-<span class="sourceLineNo">7984</span>  /**<a name="line.7984"></a>
-<span class="sourceLineNo">7985</span>   * Do coprocessor pre-increment or pre-append call.<a name="line.7985"></a>
-<span class="sourceLineNo">7986</span>   * @return Result returned out of the coprocessor, which means bypass all further processing and<a name="line.7986"></a>
-<span class="sourceLineNo">7987</span>   *  return the proffered Result instead, or null which means proceed.<a name="line.7987"></a>
-<span class="sourceLineNo">7988</span>   */<a name="line.7988"></a>
-<span class="sourceLineNo">7989</span>  private Result doCoprocessorPreCall(final Operation op, final Mutation mutation)<a name="line.7989"></a>
-<span class="sourceLineNo">7990</span>  throws IOException {<a name="line.7990"></a>
-<span class="sourceLineNo">7991</span>    Result result = null;<a name="line.7991"></a>
-<span class="sourceLineNo">7992</span>    if (this.coprocessorHost != null) {<a name="line.7992"></a>
-<span class="sourceLineNo">7993</span>      switch(op) {<a name="line.7993"></a>
-<span class="sourceLineNo">7994</span>        case INCREMENT:<a name="line.7994"></a>
-<span class="sourceLineNo">7995</span>          result = this.coprocessorHost.preIncrementAfterRowLock((Increment)mutation);<a name="line.7995"></a>
-<span class="sourceLineNo">7996</span>          break;<a name="line.7996"></a>
-<span class="sourceLineNo">7997</span>        case APPEND:<a name="line.7997"></a>
-<span class="sourceLineNo">7998</span>          result = this.coprocessorHost.preAppendAfterRowLock((Append)mutation);<a name="line.7998"></a>
-<span class="sourceLineNo">7999</span>          break;<a name="line.7999"></a>
-<span class="sourceLineNo">8000</span>        default: throw new UnsupportedOperationException(op.toString());<a name="line.8000"></a>
-<span class="sourceLineNo">8001</span>      }<a name="line.8001"></a>
-<span class="sourceLineNo">8002</span>    }<a name="line.8002"></a>
-<span class="sourceLineNo">8003</span>    return result;<a name="line.8003"></a>
-<span class="sourceLineNo">8004</span>  }<a name="line.8004"></a>
-<span class="sourceLineNo">8005</span><a name="line.8005"></a>
-<span class="sourceLineNo">8006</span>  /**<a name="line.8006"></a>
-<span class="sourceLineNo">8007</span>   * Reckon the Cells to apply to WAL, memstore, and to return to the Client; these Sets are not<a name="line.8007"></a>
-<span class="sourceLineNo">8008</span>   * always the same dependent on whether to write WAL.<a name="line.8008"></a>
-<span class="sourceLineNo">8009</span>   *<a name="line.8009"></a>
-<span class="sourceLineNo">8010</span>   * @param results Fill in here what goes back to the Client if it is non-null (if null, client<a name="line.8010"></a>
-<span class="sourceLineNo">8011</span>   *  doesn't want results).<a name="line.8011"></a>
-<span class="sourceLineNo">8012</span>   * @param forMemStore Fill in here what to apply to the MemStore (by Store).<a name="line.8012"></a>
-<span class="sourceLineNo">8013</span>   * @return A WALEdit to apply to WAL or null if we are to skip the WAL.<a name="line.8013"></a>
-<span class="sourceLineNo">8014</span>   */<a name="line.8014"></a>
-<span class="sourceLineNo">8015</span>  private WALEdit reckonDeltas(Operation op, Mutation mutation, Durability effectiveDurability,<a name="line.8015"></a>
-<span class="sourceLineNo">8016</span>      Map&lt;HStore, List&lt;Cell&gt;&gt; forMemStore, List&lt;Cell&gt; results) throws IOException {<a name="line.8016"></a>
-<span class="sourceLineNo">8017</span>    WALEdit walEdit = null;<a name="line.8017"></a>
-<span class="sourceLineNo">8018</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.8018"></a>
-<span class="sourceLineNo">8019</span>    final boolean writeToWAL = effectiveDurability != Durability.SKIP_WAL;<a name="line.8019"></a>
-<span class="sourceLineNo">8020</span>    // Process a Store/family at a time.<a name="line.8020"></a>
-<span class="sourceLineNo">8021</span>    for (Map.Entry&lt;byte [], List&lt;Cell&gt;&gt; entry: mutation.getFamilyCellMap().entrySet()) {<a name="line.8021"></a>
-<span class="sourceLineNo">8022</span>      final byte[] columnFamilyName = entry.getKey();<a name="line.8022"></a>
-<span class="sourceLineNo">8023</span>      List&lt;Cell&gt; deltas = entry.getValue();<a name="line.8023"></a>
-<span class="sourceLineNo">8024</span>      // Reckon for the Store what to apply to WAL and MemStore.<a name="line.8024"></a>
-<span class="sourceLineNo">8025</span>      List&lt;Cell&gt; toApply = reckonDeltasByStore(stores.get(columnFamilyName), op, mutation,<a name="line.8025"></a>
-<span class="sourceLineNo">8026</span>        effectiveDurability, now, deltas, results);<a name="line.8026"></a>
-<span class="sourceLineNo">8027</span>      if (!toApply.isEmpty()) {<a name="line.8027"></a>
-<span class="sourceLineNo">8028</span>        for (Cell cell : toApply) {<a name="line.8028"></a>
-<span class="sourceLineNo">8029</span>          HStore store = getStore(cell);<a name="line.8029"></a>
-<span class="sourceLineNo">8030</span>          if (store == null) {<a name="line.8030"></a>
-<span class="sourceLineNo">8031</span>            checkFamily(CellUtil.cloneFamily(cell));<a name="line.8031"></a>
-<span class="sourceLineNo">8032</span>          } else {<a name="line.8032"></a>
-<span class="sourceLineNo">8033</span>            forMemStore.computeIfAbsent(store, key -&gt; new ArrayList&lt;&gt;()).add(cell);<a name="line.8033"></a>
-<span class="sourceLineNo">8034</span>          }<a name="line.8034"></a>
-<span class="sourceLineNo">8035</span>        }<a name="line.8035"></a>
-<span class="sourceLineNo">8036</span>        if (writeToWAL) {<a name="line.8036"></a>
-<span class="sourceLineNo">8037</span>          if (walEdit == null) {<a name="line.8037"></a>
-<span class="sourceLineNo">8038</span>            walEdit = new WALEdit();<a name="line.8038"></a>
+<span class="sourceLineNo">7979</span>      writeEntry = walKey.getWriteEntry();<a name="line.7979"></a>
+<span class="sourceLineNo">7980</span>    } catch (IOException ioe) {<a name="line.7980"></a>
+<span class="sourceLineNo">7981</span>      if (walKey != null &amp;&amp; walKey.getWriteEntry() != null) {<a name="line.7981"></a>
+<span class="sourceLineNo">7982</span>        mvcc.complete(walKey.getWriteEntry());<a name="line.7982"></a>
+<span class="sourceLineNo">7983</span>      }<a name="line.7983"></a>
+<span class="sourceLineNo">7984</span>      throw ioe;<a name="line.7984"></a>
+<span class="sourceLineNo">7985</span>    }<a name="line.7985"></a>
+<span class="sourceLineNo">7986</span>    return writeEntry;<a name="line.7986"></a>
+<span class="sourceLineNo">7987</span>  }<a name="line.7987"></a>
+<span class="sourceLineNo">7988</span><a name="line.7988"></a>
+<span class="sourceLineNo">7989</span>  /**<a name="line.7989"></a>
+<span class="sourceLineNo">7990</span>   * Do coprocessor pre-increment or pre-append call.<a name="line.7990"></a>
+<span class="sourceLineNo">7991</span>   * @return Result returned out of the coprocessor, which means bypass all further processing and<a name="line.7991"></a>
+<span class="sourceLineNo">7992</span>   *  return the proffered Result instead, or null which means proceed.<a name="line.7992"></a>
+<span class="sourceLineNo">7993</span>   */<a name="line.7993"></a>
+<span class="sourceLineNo">7994</span>  private Result doCoprocessorPreCall(final Operation op, final Mutation mutation)<a name="line.7994"></a>
+<span class="sourceLineNo">7995</span>  throws IOException {<a name="line.7995"></a>
+<span class="sourceLineNo">7996</span>    Result result = null;<a name="line.7996"></a>
+<span class="sourceLineNo">7997</span>    if (this.coprocessorHost != null) {<a name="line.7997"></a>
+<span class="sourceLineNo">7998</span>      switch(op) {<a name="line.7998"></a>
+<span class="sourceLineNo">7999</span>        case INCREMENT:<a name="line.7999"></a>
+<span class="sourceLineNo">8000</span>          result = this.coprocessorHost.preIncrementAfterRowLock((Increment)mutation);<a name="line.8000"></a>
+<span class="sourceLineNo">8001</span>          break;<a name="line.8001"></a>
+<span class="sourceLineNo">8002</span>        case APPEND:<a name="line.8002"></a>
+<span class="sourceLineNo">8003</span>          result = this.coprocessorHost.preAppendAfterRowLock((Append)mutation);<a name="line.8003"></a>
+<span class="sourceLineNo">8004</span>          break;<a name="line.8004"></a>
+<span class="sourceLineNo">8005</span>        default: throw new UnsupportedOperationException(op.toString());<a name="line.8005"></a>
+<span class="sourceLineNo">8006</span>      }<a name="line.8006"></a>
+<span class="sourceLineNo">8007</span>    }<a name="line.8007"></a>
+<span class="sourceLineNo">8008</span>    return result;<a name="line.8008"></a>
+<span class="sourceLineNo">8009</span>  }<a name="line.8009"></a>
+<span class="sourceLineNo">8010</span><a name="line.8010"></a>
+<span class="sourceLineNo">8011</span>  /**<a name="line.8011"></a>
+<span class="sourceLineNo">8012</span>   * Reckon the Cells to apply to WAL, memstore, and to return to the Client; these Sets are not<a name="line.8012"></a>
+<span class="sourceLineNo">8013</span>   * always the same dependent on whether to write WAL.<a name="line.8013"></a>
+<span class="sourceLineNo">8014</span>   *<a name="line.8014"></a>
+<span class="sourceLineNo">8015</span>   * @param results Fill in here what goes back to the Client if it is non-null (if null, client<a name="line.8015"></a>
+<span class="sourceLineNo">8016</span>   *  doesn't want results).<a name="line.8016"></a>
+<span class="sourceLineNo">8017</span>   * @param forMemStore Fill in here what to apply to the MemStore (by Store).<a name="line.8017"></a>
+<span class="sourceLineNo">8018</span>   * @return A WALEdit to apply to WAL or null if we are to skip the WAL.<a name="line.8018"></a>
+<span class="sourceLineNo">8019</span>   */<a name="line.8019"></a>
+<span class="sourceLineNo">8020</span>  private WALEdit reckonDeltas(Operation op, Mutation mutation, Durability effectiveDurability,<a name="line.8020"></a>
+<span class="sourceLineNo">8021</span>      Map&lt;HStore, List&lt;Cell&gt;&gt; forMemStore, List&lt;Cell&gt; results) throws IOException {<a name="line.8021"></a>
+<span class="sourceLineNo">8022</span>    WALEdit walEdit = null;<a name="line.8022"></a>
+<span class="sourceLineNo">8023</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.8023"></a>
+<span class="sourceLineNo">8024</span>    final boolean writeToWAL = effectiveDurability != Durability.SKIP_WAL;<a name="line.8024"></a>
+<span class="sourceLineNo">8025</span>    // Process a Store/family at a time.<a name="line.8025"></a>
+<span class="sourceLineNo">8026</span>    for (Map.Entry&lt;byte [], List&lt;Cell&gt;&gt; entry: mutation.getFamilyCellMap().entrySet()) {<a name="line.8026"></a>
+<span class="sourceLineNo">8027</span>      final byte[] columnFamilyName = entry.getKey();<a name="line.8027"></a>
+<span class="sourceLineNo">8028</span>      List&lt;Cell&gt; deltas = entry.getValue();<a name="line.8028"></a>
+<span class="sourceLineNo">8029</span>      // Reckon for the Store what to apply to WAL and MemStore.<a name="line.8029"></a>
+<span class="sourceLineNo">8030</span>      List&lt;Cell&gt; toApply = reckonDeltasByStore(stores.get(columnFamilyName), op, mutation,<a name="line.8030"></a>
+<span class="sourceLineNo">8031</span>        effectiveDurability, now, deltas, results);<a name="line.8031"></a>
+<span class="sourceLineNo">8032</span>      if (!toApply.isEmpty()) {<a name="line.8032"></a>
+<span class="sourceLineNo">8033</span>        for (Cell cell : toApply) {<a name="line.8033"></a>
+<span class="sourceLineNo">8034</span>          HStore store = getStore(cell);<a name="line.8034"></a>
+<span class="sourceLineNo">8035</span>          if (store == null) {<a name="line.8035"></a>
+<span class="sourceLineNo">8036</span>            checkFamily(CellUtil.cloneFamily(cell));<a name="line.8036"></a>
+<span class="sourceLineNo">8037</span>          } else {<a name="line.8037"></a>
+<span class="sourceLineNo">8038</span>            forMemStore.computeIfAbsent(store, key -&gt; new ArrayList&lt;&gt;()).add(cell);<a name="line.8038"></a>
 <span class="sourceLineNo">8039</span>          }<a name="line.8039"></a>
-<span class="sourceLineNo">8040</span>          walEdit.getCells().addAll(toApply);<a name="line.8040"></a>
-<span class="sourceLineNo">8041</span>        }<a name="line.8041"></a>
-<span class="sourceLineNo">8042</span>      }<a name="line.8042"></a>
-<span class="sourceLineNo">8043</span>    }<a name="line.8043"></a>
-<span class="sourceLineNo">8044</span>    return walEdit;<a name="line.8044"></a>
-<span class="sourceLineNo">8045</span>  }<a name="line.8045"></a>
-<span class="sourceLineNo">8046</span><a name="line.8046"></a>
-<span class="sourceLineNo">8047</span>  /**<a name="line.8047"></a>
-<span class="sourceLineNo">8048</span>   * Reckon the Cells to apply to WAL, memstore, and to return to the Client in passed<a name="line.8048"></a>
-<span class="sourceLineNo">8049</span>   * column family/Store.<a name="line.8049"></a>
-<span class="sourceLineNo">8050</span>   *<a name="line.8050"></a>
-<span class="sourceLineNo">8051</span>   * Does Get of current value and then adds passed in deltas for this Store returning the result.<a name="line.8051"></a>
-<span class="sourceLineNo">8052</span>   *<a name="line.8052"></a>
-<span class="sourceLineNo">8053</span>   * @param op Whether Increment or Append<a name="line.8053"></a>
-<span class="sourceLineNo">8054</span>   * @param mutation The encompassing Mutation object<a name="line.8054"></a>
-<span class="sourceLineNo">8055</span>   * @param deltas Changes to apply to this Store; either increment amount or data to append<a name="line.8055"></a>
-<span class="sourceLineNo">8056</span>   * @param results In here we accumulate all the Cells we are to return to the client. If null,<a name="line.8056"></a>
-<span class="sourceLineNo">8057</span>   *                client doesn't want results returned.<a name="line.8057"></a>
-<span class="sourceLineNo">8058</span>   * @return Resulting Cells after &lt;code&gt;deltas&lt;/code&gt; have been applied to current<a name="line.8058"></a>
-<span class="sourceLineNo">8059</span>   *  values. Side effect is our filling out of the &lt;code&gt;results&lt;/code&gt; List.<a name="line.8059"></a>
-<span class="sourceLineNo">8060</span>   */<a name="line.8060"></a>
-<span class="sourceLineNo">8061</span>  private List&lt;Cell&gt; reckonDeltasByStore(HStore store, Operation op, Mutation mutation,<a name="line.8061"></a>
-<span class="sourceLineNo">8062</span>      Durability effectiveDurability, long now, List&lt;Cell&gt; deltas, List&lt;Cell&gt; results)<a name="line.8062"></a>
-<span class="sourceLineNo">8063</span>      throws IOException {<a name="line.8063"></a>
-<span class="sourceLineNo">8064</span>    byte[] columnFamily = store.getColumnFamilyDescriptor().getName();<a name="line.8064"></a>
-<span class="sourceLineNo">8065</span>    List&lt;Pair&lt;Cell, Cell&gt;&gt; cellPairs = new ArrayList&lt;&gt;(deltas.size());<a name="line.8065"></a>
-<span class="sourceLineNo">8066</span>    // Get previous values for all columns in this family.<a name="line.8066"></a>
-<span class="sourceLineNo">8067</span>    TimeRange tr = null;<a name="line.8067"></a>
-<span class="sourceLineNo">8068</span>    switch (op) {<a name="line.8068"></a>
-<span class="sourceLineNo">8069</span>      case INCREMENT:<a name="line.8069"></a>
-<span class="sourceLineNo">8070</span>        tr = ((Increment)mutation).getTimeRange();<a name="line.8070"></a>
-<span class="sourceLineNo">8071</span>        break;<a name="line.8071"></a>
-<span class="sourceLineNo">8072</span>      case APPEND:<a name="line.8072"></a>
-<span class="sourceLineNo">8073</span>        tr = ((Append)mutation).getTimeRange();<a name="line.8073"></a>
-<span class="sourceLineNo">8074</span>        break;<a name="line.8074"></a>
-<span class="sourceLineNo">8075</span>      default:<a name="line.8075"></a>
+<span class="sourceLineNo">8040</span>        }<a name="line.8040"></a>
+<span class="sourceLineNo">8041</span>        if (writeToWAL) {<a name="line.8041"></a>
+<span class="sourceLineNo">8042</span>          if (walEdit == null) {<a name="line.8042"></a>
+<span class="sourceLineNo">8043</span>            walEdit = new WALEdit();<a name="line.8043"></a>
+<span class="sourceLineNo">8044</span>          }<a name="line.8044"></a>
+<span class="sourceLineNo">8045</span>          walEdit.getCells().addAll(toApply);<a name="line.8045"></a>
+<span class="sourceLineNo">8046</span>        }<a name="line.8046"></a>
+<span class="sourceLineNo">8047</span>      }<a name="line.8047"></a>
+<span class="sourceLineNo">8048</span>    }<a name="line.8048"></a>
+<span class="sourceLineNo">8049</span>    return walEdit;<a name="line.8049"></a>
+<span class="sourceLineNo">8050</span>  }<a name="line.8050"></a>
+<span class="sourceLineNo">8051</span><a name="line.8051"></a>
+<span class="sourceLineNo">8052</span>  /**<a name="line.8052"></a>
+<span class="sourceLineNo">8053</span>   * Reckon the Cells to apply to WAL, memstore, and to return to the Client in passed<a name="line.8053"></a>
+<span class="sourceLineNo">8054</span>   * column family/Store.<a name="line.8054"></a>
+<span class="sourceLineNo">8055</span>   *<a name="line.8055"></a>
+<span class="sourceLineNo">8056</span>   * Does Get of current value and then adds passed in deltas for this Store returning the result.<a name="line.8056"></a>
+<span class="sourceLineNo">8057</span>   *<a name="line.8057"></a>
+<span class="sourceLineNo">8058</span>   * @param op Whether Increment or Append<a name="line.8058"></a>
+<span class="sourceLineNo">8059</span>   * @param mutation The encompassing Mutation object<a name="line.8059"></a>
+<span class="sourceLineNo">8060</span>   * @param deltas Changes to apply to this Store; either increment amount or data to append<a name="line.8060"></a>
+<span class="sourceLineNo">8061</span>   * @param results In here we accumulate all the Cells we are to return to the client. If null,<a name="line.8061"></a>
+<span class="sourceLineNo">8062</span>   *                client doesn't want results returned.<a name="line.8062"></a>
+<span class="sourceLineNo">8063</span>   * @return Resulting Cells after &lt;code&gt;deltas&lt;/code&gt; have been applied to current<a name="line.8063"></a>
+<span class="sourceLineNo">8064</span>   *  values. Side effect is our filling out of the &lt;code&gt;results&lt;/code&gt; List.<a name="line.8064"></a>
+<span class="sourceLineNo">8065</span>   */<a name="line.8065"></a>
+<span class="sourceLineNo">8066</span>  private List&lt;Cell&gt; reckonDeltasByStore(HStore store, Operation op, Mutation mutation,<a name="line.8066"></a>
+<span class="sourceLineNo">8067</span>      Durability effectiveDurability, long now, List&lt;Cell&gt; deltas, List&lt;Cell&gt; results)<a name="line.8067"></a>
+<span class="sourceLineNo">8068</span>      throws IOException {<a name="line.8068"></a>
+<span class="sourceLineNo">8069</span>    byte[] columnFamily = store.getColumnFamilyDescriptor().getName();<a name="line.8069"></a>
+<span class="sourceLineNo">8070</span>    List&lt;Pair&lt;Cell, Cell&gt;&gt; cellPairs = new ArrayList&lt;&gt;(deltas.size());<a name="line.8070"></a>
+<span class="sourceLineNo">8071</span>    // Get previous values for all columns in this family.<a name="line.8071"></a>
+<span class="sourceLineNo">8072</span>    TimeRange tr = null;<a name="line.8072"></a>
+<span class="sourceLineNo">8073</span>    switch (op) {<a name="line.8073"></a>
+<span class="sourceLineNo">8074</span>      case INCREMENT:<a name="line.8074"></a>
+<span class="sourceLineNo">8075</span>        tr = ((Increment)mutation).getTimeRange();<a name="line.8075"></a>
 <span class="sourceLineNo">8076</span>        break;<a name="line.8076"></a>
-<span class="sourceLineNo">8077</span>    }<a name="line.8077"></a>
-<span class="sourceLineNo">8078</span>    List&lt;Cell&gt; currentValues = get(mutation, store, deltas,null, tr);<a name="line.8078"></a>
-<span class="sourceLineNo">8079</span>    // Iterate the input columns and update existing values if they were found, otherwise<a name="line.8079"></a>
-<span class="sourceLineNo">8080</span>    // add new column initialized to the delta amount<a name="line.8080"></a>
-<span class="sourceLineNo">8081</span>    int currentValuesIndex = 0;<a name="line.8081"></a>
-<span class="sourceLineNo">8082</span>    for (int i = 0; i &lt; deltas.size(); i++) {<a name="line.8082"></a>
-<span class="sourceLineNo">8083</span>      Cell delta = deltas.get(i);<a name="line.8083"></a>
-<span class="sourceLineNo">8084</span>      Cell currentValue = null;<a name="line.8084"></a>
-<span class="sourceLineNo">8085</span>      if (currentValuesIndex &lt; currentValues.size() &amp;&amp;<a name="line.8085"></a>
-<span class="sourceLineNo">8086</span>          CellUtil.matchingQualifier(currentValues.get(currentValuesIndex), delta)) {<a name="line.8086"></a>
-<span class="sourceLineNo">8087</span>        currentValue = currentValues.get(currentValuesIndex);<a name="line.8087"></a>
-<span class="sourceLineNo">8088</span>        if (i &lt; (deltas.size() - 1) &amp;&amp; !CellUtil.matchingQualifier(delta, deltas.get(i + 1))) {<a name="line.8088"></a>
-<span class="sourceLineNo">8089</span>          currentValuesIndex++;<a name="line.8089"></a>
-<span class="sourceLineNo">8090</span>        }<a name="line.8090"></a>
-<span class="sourceLineNo">8091</span>      }<a name="line.8091"></a>
-<span class="sourceLineNo">8092</span><a name="line.8092"></a>
-<span class="sourceLineNo">8093</span>      // Switch on whether this an increment or an append building the new Cell to apply.<a name="line.8093"></a>
-<span class="sourceLineNo">8094</span>      Cell newCell = null;<a name="line.8094"></a>
-<span class="sourceLineNo">8095</span>      switch (op) {<a name="line.8095"></a>
-<span class="sourceLineNo">8096</span>        case INCREMENT:<a name="line.8096"></a>
-<span class="sourceLineNo">8097</span>          long deltaAmount = getLongValue(delta);<a name="line.8097"></a>
-<span class="sourceLineNo">8098</span>          final long newValue = currentValue == null ? deltaAmount : getLongValue(currentValue) + deltaAmount;<a name="line.8098"></a>
-<span class="sourceLineNo">8099</span>          newCell = reckonDelta(delta, currentValue, columnFamily, now, mutation, (oldCell) -&gt; Bytes.toBytes(newValue));<a name="line.8099"></a>
-<span class="sourceLineNo">8100</span>          break;<a name="line.8100"></a>
-<span class="sourceLineNo">8101</span>        case APPEND:<a name="line.8101"></a>
-<span class="sourceLineNo">8102</span>          newCell = reckonDelta(delta, currentValue, columnFamily, now, mutation, (oldCell) -&gt;<a name="line.8102"></a>
-<span class="sourceLineNo">8103</span>            ByteBuffer.wrap(new byte[delta.getValueLength() + oldCell.getValueLength()])<a name="line.8103"></a>
-<span class="sourceLineNo">8104</span>                    .put(oldCell.getValueArray(), oldCell.getValueOffset(), oldCell.getValueLength())<a name="line.8104"></a>
-<span class="sourceLineNo">8105</span>                    .put(delta.getValueArray(), delta.getValueOffset(), delta.getValueLength())<a name="line.8105"></a>
-<span class="sourceLineNo">8106</span>                    .array()<a name="line.8106"></a>
-<span class="sourceLineNo">8107</span>          );<a name="line.8107"></a>
-<span class="sourceLineNo">8108</span>          break;<a name="line.8108"></a>
-<span class="sourceLineNo">8109</span>        default: throw new UnsupportedOperationException(op.toString());<a name="line.8109"></a>
-<span class="sourceLineNo">8110</span>      }<a name="line.8110"></a>
-<span class="sourceLineNo">8111</span>      int newCellSize = PrivateCellUtil.estimatedSerializedSizeOf(newCell);<a name="line.8111"></a>
-<span class="sourceLineNo">8112</span>      if (newCellSize &gt; this.maxCellSize) {<a name="line.8112"></a>
-<span class="sourceLineNo">8113</span>        String msg = "Cell with size " + newCellSize + " exceeds limit of " +<a name="line.8113"></a>
-<span class="sourceLineNo">8114</span>            this.maxCellSize + " bytes";<a name="line.8114"></a>
-<span class="sourceLineNo">8115</span>        if (LOG.isDebugEnabled()) {<a name="line.8115"></a>
-<span class="sourceLineNo">8116</span>          LOG.debug(msg);<a name="line.8116"></a>
-<span class="sourceLineNo">8117</span>        }<a name="line.8117"></a>
-<span class="sourceLineNo">8118</span>        throw new DoNotRetryIOException(msg);<a name="line.8118"></a>
-<span class="sourceLineNo">8119</span>      }<a name="line.8119"></a>
-<span class="sourceLineNo">8120</span>      cellPairs.add(new Pair&lt;&gt;(currentValue, newCell));<a name="line.8120"></a>
-<span class="sourceLineNo">8121</span>      // Add to results to get returned to the Client. If null, cilent does not want results.<a name="line.8121"></a>
-<span class="sourceLineNo">8122</span>      if (results != null) {<a name="line.8122"></a>
-<span class="sourceLineNo">8123</span>        results.add(newCell);<a name="line.8123"></a>
+<span class="sourceLineNo">8077</span>      case APPEND:<a name="line.8077"></a>
+<span class="sourceLineNo">8078</span>        tr = ((Append)mutation).getTimeRange();<a name="line.8078"></a>
+<span class="sourceLineNo">8079</span>        break;<a name="line.8079"></a>
+<span class="sourceLineNo">8080</span>      default:<a name="line.8080"></a>
+<span class="sourceLineNo">8081</span>        break;<a name="line.8081"></a>
+<span class="sourceLineNo">8082</span>    }<a name="line.8082"></a>
+<span class="sourceLineNo">8083</span>    List&lt;Cell&gt; currentValues = get(mutation, store, deltas,null, tr);<a name="line.8083"></a>
+<span class="sourceLineNo">8084</span>    // Iterate the input columns and update existing values if they were found, otherwise<a name="line.8084"></a>
+<span class="sourceLineNo">8085</span>    // add new column initialized to the delta amount<a name="line.8085"></a>
+<span class="sourceLineNo">8086</span>    int currentValuesIndex = 0;<a name="line.8086"></a>
+<span class="sourceLineNo">8087</span>    for (int i = 0; i &lt; deltas.size(); i++) {<a name="line.8087"></a>
+<span class="sourceLineNo">8088</span>      Cell delta = deltas.get(i);<a name="line.8088"></a>
+<span class="sourceLineNo">8089</span>      Cell currentValue = null;<a name="line.8089"></a>
+<span class="sourceLineNo">8090</span>      if (currentValuesIndex &lt; currentValues.size() &amp;&amp;<a name="line.8090"></a>
+<span class="sourceLineNo">8091</span>          CellUtil.matchingQualifier(currentValues.get(currentValuesIndex), delta)) {<a name="line.8091"></a>
+<span class="sourceLineNo">8092</span>        currentValue = currentValues.get(currentValuesIndex);<a name="line.8092"></a>
+<span class="sourceLineNo">8093</span>        if (i &lt; (deltas.size() - 1) &amp;&amp; !CellUtil.matchingQualifier(delta, deltas.get(i + 1))) {<a name="line.8093"></a>
+<span class="sourceLineNo">8094</span>          currentValuesIndex++;<a name="line.8094"></a>
+<span class="sourceLineNo">8095</span>        }<a name="line.8095"></a>
+<span class="sourceLineNo">8096</span>      }<a name="line.8096"></a>
+<span class="sourceLineNo">8097</span><a name="line.8097"></a>
+<span class="sourceLineNo">8098</span>      // Switch on whether this an increment or an append building the new Cell to apply.<a name="line.8098"></a>
+<span class="sourceLineNo">8099</span>      Cell newCell = null;<a name="line.8099"></a>
+<span class="sourceLineNo">8100</span>      switch (op) {<a name="line.8100"></a>
+<span class="sourceLineNo">8101</span>        case INCREMENT:<a name="line.8101"></a>
+<span class="sourceLineNo">8102</span>          long deltaAmount = getLongValue(delta);<a name="line.8102"></a>
+<span class="sourceLineNo">8103</span>          final long newValue = currentValue == null ? deltaAmount : getLongValue(currentValue) + deltaAmount;<a name="line.8103"></a>
+<span class="sourceLineNo">8104</span>          newCell = reckonDelta(delta, currentValue, columnFamily, now, mutation, (oldCell) -&gt; Bytes.toBytes(newValue));<a name="line.8104"></a>
+<span class="sourceLineNo">8105</span>          break;<a name="line.8105"></a>
+<span class="sourceLineNo">8106</span>        case APPEND:<a name="line.8106"></a>
+<span class="sourceLineNo">8107</span>          newCell = reckonDelta(delta, currentValue, columnFamily, now, mutation, (oldCell) -&gt;<a name="line.8107"></a>
+<span class="sourceLineNo">8108</span>            ByteBuffer.wrap(new byte[delta.getValueLength() + oldCell.getValueLength()])<a name="line.8108"></a>
+<span class="sourceLineNo">8109</span>                    .put(oldCell.getValueArray(), oldCell.getValueOffset(), oldCell.getValueLength())<a name="line.8109"></a>
+<span class="sourceLineNo">8110</span>                    .put(delta.getValueArray(), delta.getValueOffset(), delta.getValueLength())<a name="line.8110"></a>
+<span class="sourceLineNo">8111</span>                    .array()<a name="line.8111"></a>
+<span class="sourceLineNo">8112</span>          );<a name="line.8112"></a>
+<span class="sourceLineNo">8113</span>          break;<a name="line.8113"></a>
+<span class="sourceLineNo">8114</span>        default: throw new UnsupportedOperationException(op.toString());<a name="line.8114"></a>
+<span class="sourceLineNo">8115</span>      }<a name="line.8115"></a>
+<span class="sourceLineNo">8116</span>      int newCellSize = PrivateCellUtil.estimatedSerializedSizeOf(newCell);<a name="line.8116"></a>
+<span class="sourceLineNo">8117</span>      if (newCellSize &gt; this.maxCellSize) {<a name="line.8117"></a>
+<span class="sourceLineNo">8118</span>        String msg = "Cell with size " + newCellSize + " exceeds limit of " +<a name="line.8118"></a>
+<span class="sourceLineNo">8119</span>            this.maxCellSize + " bytes";<a name="line.8119"></a>
+<span class="sourceLineNo">8120</span>        if (LOG.isDebugEnabled()) {<a name="line.8120"></a>
+<span class="sourceLineNo">8121</span>          LOG.debug(msg);<a name="line.8121"></a>
+<span class="sourceLineNo">8122</span>        }<a name="line.8122"></a>
+<span class="sourceLineNo">8123</span>        throw new DoNotRetryIOException(msg);<a name="line.8123"></a>
 <span class="sourceLineNo">8124</span>      }<a name="line.8124"></a>
-<span class="sourceLineNo">8125</span>    }<a name="line.8125"></a>
-<span class="sourceLineNo">8126</span><a name="line.8126"></a>
-<span class="sourceLineNo">8127</span>    // Give coprocessors a chance to update the new cells before apply to WAL or memstore<a name="line.8127"></a>
-<span class="sourceLineNo">8128</span>    if (coprocessorHost != null) {<a name="line.8128"></a>
-<span class="sourceLineNo">8129</span>      // Here the operation must be increment or append.<a name="line.8129"></a>
-<span class="sourceLineNo">8130</span>      cellPairs = op == Operation.INCREMENT ?<a name="line.8130"></a>
-<span class="sourceLineNo">8131</span>          coprocessorHost.postIncrementBeforeWAL(mutation, cellPairs) :<a name="line.8131"></a>
-<span class="sourceLineNo">8132</span>          coprocessorHost.postAppendBeforeWAL(mutation, cellPairs);<a name="line.8132"></a>
-<span class="sourceLineNo">8133</span>    }<a name="line.8133"></a>
-<span class="sourceLineNo">8134</span>    return cellPairs.stream().map(Pair::getSecond).collect(Collectors.toList());<a name="line.8134"></a>
-<span class="sourceLineNo">8135</span>  }<a name="line.8135"></a>
-<span class="sourceLineNo">8136</span><a name="line.8136"></a>
-<span class="sourceLineNo">8137</span>  private static Cell reckonDelta(final Cell delta, final Cell currentCell,<a name="line.8137"></a>
-<span class="sourceLineNo">8138</span>                                  final byte[] columnFamily, final long now,<a name="line.8138"></a>
-<span class="sourceLineNo">8139</span>                                  Mutation mutation, Function&lt;Cell, byte[]&gt; supplier) throws IOException {<a name="line.8139"></a>
-<span class="sourceLineNo">8140</span>    // Forward any tags found on the delta.<a name="line.8140"></a>
-<span class="sourceLineNo">8141</span>    List&lt;Tag&gt; tags = TagUtil.carryForwardTags(delta);<a name="line.8141"></a>
-<span class="sourceLineNo">8142</span>    tags = TagUtil.carryForwardTTLTag(tags, mutation.getTTL());<a name="line.8142"></a>
-<span class="sourceLineNo">8143</span>    if (currentCell != null) {<a name="line.8143"></a>
-<span class="sourceLineNo">8144</span>      tags = TagUtil.carryForwardTags(tags, currentCell);<a name="line.8144"></a>
-<span class="sourceLineNo">8145</span>      byte[] newValue = supplier.apply(currentCell);<a name="line.8145"></a>
-<span class="sourceLineNo">8146</span>      return ExtendedCellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.8146"></a>
-<span class="sourceLineNo">8147</span>              .setRow(mutation.getRow(), 0, mutation.getRow().length)<a name="line.8147"></a>
-<span class="sourceLineNo">8148</span>              .setFamily(columnFamily, 0, columnFamily.length)<a name="line.8148"></a>
-<span class="sourceLineNo">8149</span>              // copy the qualifier if the cell is located in shared memory.<a name="line.8149"></a>
-<span class="sourceLineNo">8150</span>              .setQualifier(CellUtil.cloneQualifier(delta))<a name="line.8150"></a>
-<span class="sourceLineNo">8151</span>              .setTimestamp(Math.max(currentCell.getTimestamp() + 1, now))<a name="line.8151"></a>
-<span class="sourceLineNo">8152</span>              .setType(KeyValue.Type.Put.getCode())<a name="line.8152"></a>
-<span class="sourceLineNo">8153</span>              .setValue(newValue, 0, newValue.length)<a name="line.8153"></a>
-<span class="sourceLineNo">8154</span>              .setTags(TagUtil.fromList(tags))<a name="line.8154"></a>
-<span class="sourceLineNo">8155</span>              .build();<a name="line.8155"></a>
-<span class="sourceLineNo">8156</span>    } else {<a name="line.8156"></a>
-<span class="sourceLineNo">8157</span>      PrivateCellUtil.updateLatestStamp(delta, now);<a name="line.8157"></a>
-<span class="sourceLineNo">8158</span>      return CollectionUtils.isEmpty(tags) ? delta : PrivateCellUtil.createCell(delta, tags);<a name="line.8158"></a>
-<span class="sourceLineNo">8159</span>    }<a name="line.8159"></a>
-<span class="sourceLineNo">8160</span>  }<a name="line.8160"></a>
-<span class="sourceLineNo">8161</span><a name="line.8161"></a>
-<span class="sourceLineNo">8162</span>  /**<a name="line.8162"></a>
-<span class="sourceLineNo">8163</span>   * @return Get the long out of the passed in Cell<a name="line.8163"></a>
-<span class="sourceLineNo">8164</span>   */<a name="line.8164"></a>
-<span class="sourceLineNo">8165</span>  private static long getLongValue(final Cell cell) throws DoNotRetryIOException {<a name="line.8165"></a>
-<span class="sourceLineNo">8166</span>    int len = cell.getValueLength();<a name="line.8166"></a>
-<span class="sourceLineNo">8167</span>    if (len != Bytes.SIZEOF_LONG) {<a name="line.8167"></a>
-<span class="sourceLineNo">8168</span>      // throw DoNotRetryIOException instead of IllegalArgumentException<a name="line.8168"></a>
-<span class="sourceLineNo">8169</span>      throw new DoNotRetryIOException("Field is not a long, it's " + len + " bytes wide");<a name="line.8169"></a>
-<span class="sourceLineNo">8170</span>    }<a name="line.8170"></a>
-<span class="sourceLineNo">8171</span>    return PrivateCellUtil.getValueAsLong(cell);<a name="line.8171"></a>
-<span class="sourceLineNo">8172</span>  }<a name="line.8172"></a>
-<span class="sourceLineNo">8173</span><a name="line.8173"></a>
-<span class="sourceLineNo">8174</span>  /**<a name="line.8174"></a>
-<span class="sourceLineNo">8175</span>   * Do a specific Get on passed &lt;code&gt;columnFamily&lt;/code&gt; and column qualifiers.<a name="line.8175"></a>
-<span class="sourceLineNo">8176</span>   * @param mutation Mutation we are doing this Get for.<a name="line.8176"></a>
-<span class="sourceLineNo">8177</span>   * @param store Which column family on row (TODO: Go all Gets in one go)<a name="line.8177"></a>
-<span class="sourceLineNo">8178</span>   * @param coordinates Cells from &lt;code&gt;mutation&lt;/code&gt; used as coordinates applied to Get.<a name="line.8178"></a>
-<span class="sourceLineNo">8179</span>   * @return Return list of Cells found.<a name="line.8179"></a>
-<span class="sourceLineNo">8180</span>   */<a name="line.8180"></a>
-<span class="sourceLineNo">8181</span>  private List&lt;Cell&gt; get(Mutation mutation, HStore store, List&lt;Cell&gt; coordinates,<a name="line.8181"></a>
-<span class="sourceLineNo">8182</span>      IsolationLevel isolation, TimeRange tr) throws IOException {<a name="line.8182"></a>
-<span class="sourceLineNo">8183</span>    // Sort the cells so that they match the order that they appear in the Get results. Otherwise,<a name="line.8183"></a>
-<span class="sourceLineNo">8184</span>    // we won't be able to find the existing values if the cells are not specified in order by the<a name="line.8184"></a>
-<span class="sourceLineNo">8185</span>    // client since cells are in an array list.<a name="line.8185"></a>
-<span class="sourceLineNo">8186</span>    // TODO: I don't get why we are sorting. St.Ack 20150107<a name="line.8186"></a>
-<span class="sourceLineNo">8187</span>    sort(coordinates, store.getComparator());<a name="line.8187"></a>
-<span class="sourceLineNo">8188</span>    Get get = new Get(mutation.getRow());<a name="line.8188"></a>
-<span class="sourceLineNo">8189</span>    if (isolation != null) {<a name="line.8189"></a>
-<span class="sourceLineNo">8190</span>      get.setIsolationLevel(isolation);<a name="line.8190"></a>
-<span class="sourceLineNo">8191</span>    }<a name="line.8191"></a>
-<span class="sourceLineNo">8192</span>    for (Cell cell: coordinates) {<a name="line.8192"></a>
-<span class="sourceLineNo">8193</span>      get.addColumn(store.getColumnFamilyDescriptor().getName(), CellUtil.cloneQualifier(cell));<a name="line.8193"></a>
-<span class="sourceLineNo">8194</span>    }<a name="line.8194"></a>
-<span class="sourceLineNo">8195</span>    // Increments carry time range. If an Increment instance, put it on the Get.<a name="line.8195"></a>
-<span class="sourceLineNo">8196</span>    if (tr != null) {<a name="line.8196"></a>
-<span class="sourceLineNo">8197</span>      get.setTimeRange(tr.getMin(), tr.getMax());<a name="line.8197"></a>
-<span class="sourceLineNo">8198</span>    }<a name="line.8198"></a>
-<span class="sourceLineNo">8199</span>    return get(get, false);<a name="line.8199"></a>
-<span class="sourceLineNo">8200</span>  }<a name="line.8200"></a>
-<span class="sourceLineNo">8201</span><a name="line.8201"></a>
-<span class="sourceLineNo">8202</span>  /**<a name="line.8202"></a>
-<span class="sourceLineNo">8203</span>   * @return Sorted list of &lt;code&gt;cells&lt;/code&gt; using &lt;code&gt;comparator&lt;/code&gt;<a name="line.8203"></a>
-<span class="sourceLineNo">8204</span>   */<a name="line.8204"></a>
-<span class="sourceLineNo">8205</span>  private static List&lt;Cell&gt; sort(List&lt;Cell&gt; cells, final CellComparator comparator) {<a name="line.8205"></a>
-<span class="sourceLineNo">8206</span>    cells.sort(comparator);<a name="line.8206"></a>
-<span class="sourceLineNo">8207</span>    return cells;<a name="line.8207"></a>
-<span class="sourceLineNo">8208</span>  }<a name="line.8208"></a>
-<span class="sourceLineNo">8209</span><a name="line.8209"></a>
-<span class="sourceLineNo">8210</span>  public static final long FIXED_OVERHEAD = ClassSize.align(<a name="line.8210"></a>
-<span class="sourceLineNo">8211</span>      ClassSize.OBJECT +<a name="line.8211"></a>
-<span class="sourceLineNo">8212</span>      ClassSize.ARRAY +<a name="line.8212"></a>
-<span class="sourceLineNo">8213</span>      55 * ClassSize.REFERENCE + 3 * Bytes.SIZEOF_INT +<a name="line.8213"></a>
-<span class="sourceLineNo">8214</span>      (15 * Bytes.SIZEOF_LONG) +<a name="line.8214"></a>
-<span class="sourceLineNo">8215</span>      3 * Bytes.SIZEOF_BOOLEAN);<a name="line.8215"></a>
-<span class="sourceLineNo">8216</span><a name="line.8216"></a>
-<span class="sourceLineNo">8217</span>  // woefully out of date - currently missing:<a name="line.8217"></a>
-<span class="sourceLineNo">8218</span>  // 1 x HashMap - coprocessorServiceHandlers<a name="line.8218"></a>
-<span class="sourceLineNo">8219</span>  // 6 x LongAdder - numMutationsWithoutWAL, dataInMemoryWithoutWAL,<a name="line.8219"></a>
-<span class="sourceLineNo">8220</span>  //   checkAndMutateChecksPassed, checkAndMutateChecksFailed, readRequestsCount,<a name="line.8220"></a>
-<span class="sourceLineNo">8221</span>  //   writeRequestsCount, cpRequestsCount<a name="line.8221"></a>
-<span class="sourceLineNo">8222</span>  // 1 x HRegion$WriteState - writestate<a name="line.8222"></a>
-<span class="sourceLineNo">8223</span>  // 1 x RegionCoprocessorHost - coprocessorHost<a name="line.8223"></a>
-<span class="sourceLineNo">8224</span>  // 1 x RegionSplitPolicy - splitPolicy<a name="line.8224"></a>
-<span class="sourceLineNo">8225</span>  // 1 x MetricsRegion - metricsRegion<a name="line.8225"></a>
-<span class="sourceLineNo">8226</span>  // 1 x MetricsRegionWrapperImpl - metricsRegionWrapper<a name="line.8226"></a>
-<span class="sourceLineNo">8227</span>  public static final long DEEP_OVERHEAD = FIXED_OVERHEAD +<a name="line.8227"></a>
-<span class="sourceLineNo">8228</span>      ClassSize.OBJECT + // closeLock<a name="line.8228"></a>
-<span class="sourceLineNo">8229</span>      (2 * ClassSize.ATOMIC_BOOLEAN) + // closed, closing<a name="line.8229"></a>
-<span class="sourceLineNo">8230</span>      (3 * ClassSize.ATOMIC_LONG) + // numPutsWithoutWAL, dataInMemoryWithoutWAL,<a name="line.8230"></a>
-<span class="sourceLineNo">8231</span>                                    // compactionsFailed<a name="line.8231"></a>
-<span class="sourceLineNo">8232</span>      (2 * ClassSize.CONCURRENT_HASHMAP) +  // lockedRows, scannerReadPoints<a name="line.8232"></a>
-<span class="sourceLineNo">8233</span>      WriteState.HEAP_SIZE + // writestate<a name="line.8233"></a>
-<span class="sourceLineNo">8234</span>      ClassSize.CONCURRENT_SKIPLISTMAP + ClassSize.CONCURRENT_SKIPLISTMAP_ENTRY + // stores<a name="line.8234"></a>
-<span class="sourceLineNo">8235</span>      (2 * ClassSize.REENTRANT_LOCK) + // lock, updatesLock<a name="line.8235"></a>
-<span class="sourceLineNo">8236</span>      MultiVersionConcurrencyControl.FIXED_SIZE // mvcc<a name="line.8236"></a>
-<span class="sourceLineNo">8237</span>      + 2 * ClassSize.TREEMAP // maxSeqIdInStores, replicationScopes<a name="line.8237"></a>
-<span class="sourceLineNo">8238</span>      + 2 * ClassSize.ATOMIC_INTEGER // majorInProgress, minorInProgress<a name="line.8238"></a>
-<span class="sourceLineNo">8239</span>      + ClassSize.STORE_SERVICES // store services<a name="line.8239"></a>
-<span class="sourceLineNo">8240</span>      + StoreHotnessProtector.FIXED_SIZE<a name="line.8240"></a>
-<span class="sourceLineNo">8241</span>      ;<a name="line.8241"></a>
-<span class="sourceLineNo">8242</span><a name="line.8242"></a>
-<span class="sourceLineNo">8243</span>  @Override<a name="line.8243"></a>
-<span class="sourceLineNo">8244</span>  public long heapSize() {<a name="line.8244"></a>
-<span class="sourceLineNo">8245</span>    // this does not take into account row locks, recent flushes, mvcc entries, and more<a name="line.8245"></a>
-<span class="sourceLineNo">8246</span>    return DEEP_OVERHEAD + stores.values().stream().mapToLong(HStore::heapSize).sum();<a name="line.8246"></a>
-<span class="sourceLineNo">8247</span>  }<a name="line.8247"></a>
-<span class="sourceLineNo">8248</span><a name="line.8248"></a>
-<span class="sourceLineNo">8249</span>  /**<a name="line.8249"></a>
-<span class="sourceLineNo">8250</span>   * Registers a new protocol buffer {@link Service} subclass as a coprocessor endpoint to<a name="line.8250"></a>
-<span class="sourceLineNo">8251</span>   * be available for handling Region#execService(com.google.protobuf.RpcController,<a name="line.8251"></a>
-<span class="sourceLineNo">8252</span>   *    org.apache.hadoop.hbase.protobuf.generated.ClientProtos.CoprocessorServiceCall) calls.<a name="line.8252"></a>
-<span class="sourceLineNo">8253</span>   *<a name="line.8253"></a>
-<span class="sourceLineNo">8254</span>   * &lt;p&gt;<a name="line.8254"></a>
-<span class="sourceLineNo">8255</span>   * Only a single instance may be registered per region for a given {@link Service} subclass (the<a name="line.8255"></a>
-<span class="sourceLineNo">8256</span>   * instances are keyed on {@link com.google.protobuf.Descriptors.ServiceDescriptor#getFullName()}.<a name="line.8256"></a>
-<span class="sourceLineNo">8257</span>   * After the first registration, subsequent calls with the same service name will fail with<a name="line.8257"></a>
-<span class="sourceLineNo">8258</span>   * a return value of {@code false}.<a name="line.8258"></a>
-<span class="sourceLineNo">8259</span>   * &lt;/p&gt;<a name="line.8259"></a>
-<span class="sourceLineNo">8260</span>   * @param instance the {@code Service} subclass instance to expose as a coprocessor endpoint<a name="line.8260"></a>
-<span class="sourceLineNo">8261</span>   * @return {@code true} if the registration was successful, {@code false}<a name="line.8261"></a>
-<span class="sourceLineNo">8262</span>   * otherwise<a name="line.8262"></a>
-<span class="sourceLineNo">8263</span>   */<a name="line.8263"></a>
-<span class="sourceLineNo">8264</span>  public boolean registerService(com.google.protobuf.Service instance) {<a name="line.8264"></a>
-<span class="sourceLineNo">8265</span>    /*<a name="line.8265"></a>
-<span class="sourceLineNo">8266</span>     * No stacking of instances is allowed for a single service name<a name="line.8266"></a>
-<span class="sourceLineNo">8267</span>     */<a name="line.8267"></a>
-<span class="sourceLineNo">8268</span>    com.google.protobuf.Descriptors.ServiceDescriptor serviceDesc = instance.getDescriptorForType();<a name="line.8268"></a>
-<span class="sourceLineNo">8269</span>    String serviceName = CoprocessorRpcUtils.getServiceName(serviceDesc);<a name="line.8269"></a>
-<span class="sourceLineNo">8270</span>    if (coprocessorServiceHandlers.containsKey(serviceName)) {<a name="line.8270"></a>
-<span class="sourceLineNo">8271</span>      LOG.error("Coprocessor service " + serviceName +<a name="line.8271"></a>
-<span class="sourceLineNo">8272</span>          " already registered, rejecting request from " + instance);<a name="line.8272"></a>
-<span class="sourceLineNo">8273</span>      return false;<a name="line.8273"></a>
-<span class="sourceLineNo">8274</span>    }<a name="line.8274"></a>
-<span class="sourceLineNo">8275</span><a name="line.8275"></a>
-<span class="sourceLineNo">8276</span>    coprocessorServiceHandlers.put(serviceName, instance);<a name="line.8276"></a>
-<span class="sourceLineNo">8277</span>    if (LOG.isDebugEnabled()) {<a name="line.8277"></a>
-<span class="sourceLineNo">8278</span>      LOG.debug("Registered coprocessor service: region=" +<a name="line.8278"></a>
-<span class="sourceLineNo">8279</span>          Bytes.toStringBinary(getRegionInfo().getRegionName()) +<a name="line.8279"></a>
-<span class="sourceLineNo">8280</span>          " service=" + serviceName);<a name="line.8280"></a>
-<span class="sourceLineNo">8281</span>    }<a name="line.8281"></a>
-<span class="sourceLineNo">8282</span>    return true;<a name="line.8282"></a>
-<span class="sourceLineNo">8283</span>  }<a name="line.8283"></a>
-<span class="sourceLineNo">8284</span><a name="line.8284"></a>
-<span class="sourceLineNo">8285</span>  /**<a name="line.8285"></a>
-<span class="sourceLineNo">8286</span>   * Executes a single protocol buffer coprocessor endpoint {@link Service} method using<a name="line.8286"></a>
-<span class="sourceLineNo">8287</span>   * the registered protocol handlers.  {@link Service} implementations must be registered via the<a name="line.8287"></a>
-<span class="sourceLineNo">8288</span>   * {@link #registerService(com.google.protobuf.Service)}<a name="line.8288"></a>
-<span class="sourceLineNo">8289</span>   * method before they are available.<a name="line.8289"></a>
-<span class="sourceLineNo">8290</span>   *<a name="line.8290"></a>
-<span class="sourceLineNo">8291</span>   * @param controller an {@code RpcContoller} implementation to pass to the invoked service<a name="line.8291"></a>
-<span class="sourceLineNo">8292</span>   * @param call a {@code CoprocessorServiceCall} instance identifying the service, method,<a name="line.8292"></a>
-<span class="sourceLineNo">8293</span>   *     and parameters for the method invocation<a name="line.8293"></a>
-<span class="sourceLineNo">8294</span>   * @return a protocol buffer {@code Message} instance containing the method's result<a name="line.8294"></a>
-<span class="sourceLineNo">8295</span>   * @throws IOException if no registered service handler is found or an error<a name="line.8295"></a>
-<span class="sourceLineNo">8296</span>   *     occurs during the invocation<a name="line.8296"></a>
-<span class="sourceLineNo">8297</span>   * @see #registerService(com.google.protobuf.Service)<a name="line.8297"></a>
-<span class="sourceLineNo">8298</span>   */<a name="line.8298"></a>
-<span class="sourceLineNo">8299</span>  public com.google.protobuf.Message execService(com.google.protobuf.RpcController controller,<a name="line.8299"></a>
-<span class="sourceLineNo">8300</span>      CoprocessorServiceCall call) throws IOException {<a name="line.8300"></a>
-<span class="sourceLineNo">8301</span>    String serviceName = call.getServiceName();<a name="line.8301"></a>
-<span class="sourceLineNo">8302</span>    com.google.protobuf.Service service = coprocessorServiceHandlers.get(serviceName);<a name="line.8302"></a>
-<span class="sourceLineNo">8303</span>    if (service == null) {<a name="line.8303"></a>
-<span class="sourceLineNo">8304</span>      throw new UnknownProtocolException(null, "No registered coprocessor service found for " +<a name="line.8304"></a>
-<span class="sourceLineNo">8305</span>          serviceName + " in region " + Bytes.toStringBinary(getRegionInfo().getRegionName()));<a name="line.8305"></a>
-<span class="sourceLineNo">8306</span>    }<a name="line.8306"></a>
-<span class="sourceLineNo">8307</span>    com.google.protobuf.Descriptors.ServiceDescriptor serviceDesc = service.getDescriptorForType();<a name="line.8307"></a>
-<span class="sourceLineNo">8308</span><a name="line.8308"></a>
-<span class="sourceLineNo">8309</span>    cpRequestsCount.increment();<a name="line.8309"></a>
-<span class="sourceLineNo">8310</span>    String methodName = call.getMethodName();<a name="line.8310"></a>
-<span class="sourceLineNo">8311</span>    com.google.protobuf.Descriptors.MethodDescriptor methodDesc =<a name="line.8311"></a>
-<span class="sourceLineNo">8312</span>        CoprocessorRpcUtils.getMethodDescriptor(methodName, serviceDesc);<a name="line.8312"></a>
+<span class="sourceLineNo">8125</span>      cellPairs.add(new Pair&lt;&gt;(currentValue, newCell));<a name="line.8125"></a>
+<span class="sourceLineNo">8126</span>      // Add to results to get returned to the Client. If null, cilent does not want results.<a name="line.8126"></a>
+<span class="sourceLineNo">8127</span>      if (results != null) {<a name="line.8127"></a>
+<span class="sourceLineNo">8128</span>        results.add(newCell);<a name="line.8128"></a>
+<span class="sourceLineNo">8129</span>      }<a name="line.8129"></a>
+<span class="sourceLineNo">8130</span>    }<a name="line.8130"></a>
+<span class="sourceLineNo">8131</span><a name="line.8131"></a>
+<span class="sourceLineNo">8132</span>    // Give coprocessors a chance to update the new cells before apply to WAL or memstore<a name="line.8132"></a>
+<span class="sourceLineNo">8133</span>    if (coprocessorHost != null) {<a name="line.8133"></a>
+<span class="sourceLineNo">8134</span>      // Here the operation must be increment or append.<a name="line.8134"></a>
+<span class="sourceLineNo">8135</span>      cellPairs = op == Operation.INCREMENT ?<a name="line.8135"></a>
+<span class="sourceLineNo">8136</span>          coprocessorHost.postIncrementBeforeWAL(mutation, cellPairs) :<a name="line.8136"></a>
+<span class="sourceLineNo">8137</span>          coprocessorHost.postAppendBeforeWAL(mutation, cellPairs);<a name="line.8137"></a>
+<span class="sourceLineNo">8138</span>    }<a name="line.8138"></a>
+<span class="sourceLineNo">8139</span>    return cellPairs.stream().map(Pair::getSecond).collect(Collectors.toList());<a name="line.8139"></a>
+<span class="sourceLineNo">8140</span>  }<a name="line.8140"></a>
+<span class="sourceLineNo">8141</span><a name="line.8141"></a>
+<span class="sourceLineNo">8142</span>  private static Cell reckonDelta(final Cell delta, final Cell currentCell,<a name="line.8142"></a>
+<span class="sourceLineNo">8143</span>                                  final byte[] columnFamily, final long now,<a name="line.8143"></a>
+<span class="sourceLineNo">8144</span>                                  Mutation mutation, Function&lt;Cell, byte[]&gt; supplier) throws IOException {<a name="line.8144"></a>
+<span class="sourceLineNo">8145</span>    // Forward any tags found on the delta.<a name="line.8145"></a>
+<span class="sourceLineNo">8146</span>    List&lt;Tag&gt; tags = TagUtil.carryForwardTags(delta);<a name="line.8146"></a>
+<span class="sourceLineNo">8147</span>    tags = TagUtil.carryForwardTTLTag(tags, mutation.getTTL());<a name="line.8147"></a>
+<span class="sourceLineNo">8148</span>    if (currentCell != null) {<a name="line.8148"></a>
+<span class="sourceLineNo">8149</span>      tags = TagUtil.carryForwardTags(tags, currentCell);<a name="line.8149"></a>
+<span class="sourceLineNo">8150</span>      byte[] newValue = supplier.apply(currentCell);<a name="line.8150"></a>
+<span class="sourceLineNo">8151</span>      return ExtendedCellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.8151"></a>
+<span class="sourceLineNo">8152</span>              .setRow(mutation.getRow(), 0, mutation.getRow().length)<a name="line.8152"></a>
+<span class="sourceLineNo">8153</span>              .setFamily(columnFamily, 0, columnFamily.length)<a name="line.8153"></a>
+<span class="sourceLineNo">8154</span>              // copy the qualifier if the cell is located in shared memory.<a name="line.8154"></a>
+<span class="sourceLineNo">8155</span>              .setQualifier(CellUtil.cloneQualifier(delta))<a name="line.8155"></a>
+<span class="sourceLineNo">8156</span>              .setTimestamp(Math.max(currentCell.getTimestamp() + 1, now))<a name="line.8156"></a>
+<span class="sourceLineNo">8157</span>              .setType(KeyValue.Type.Put.getCode())<a name="line.8157"></a>
+<span class="sourceLineNo">8158</span>              .setValue(newValue, 0, newValue.length)<a name="line.8158"></a>
+<span class="sourceLineNo">8159</span>              .setTags(TagUtil.fromList(tags))<a name="line.8159"></a>
+<span class="sourceLineNo">8160</span>              .build();<a name="line.8160"></a>
+<span class="sourceLineNo">8161</span>    } else {<a name="line.8161"></a>
+<span class="sourceLineNo">8162</span>      PrivateCellUtil.updateLatestStamp(delta, now);<a name="line.8162"></a>
+<span class="sourceLineNo">8163</span>      return CollectionUtils.isEmpty(tags) ? delta : PrivateCellUtil.createCell(delta, tags);<a name="line.8163"></a>
+<span class="sourceLineNo">8164</span>    }<a name="line.8164"></a>
+<span class="sourceLineNo">8165</span>  }<a name="line.8165"></a>
+<span class="sourceLineNo">8166</span><a name="line.8166"></a>
+<span class="sourceLineNo">8167</span>  /**<a name="line.8167"></a>
+<span class="sourceLineNo">8168</span>   * @return Get the long out of the passed in Cell<a name="line.8168"></a>
+<span class="sourceLineNo">8169</span>   */<a name="line.8169"></a>
+<span class="sourceLineNo">8170</span>  private static long getLongValue(final Cell cell) throws DoNotRetryIOException {<a name="line.8170"></a>
+<span class="sourceLineNo">8171</span>    int len = cell.getValueLength();<a name="line.8171"></a>
+<span class="sourceLineNo">8172</span>    if (len != Bytes.SIZEOF_LONG) {<a name="line.8172"></a>
+<span class="sourceLineNo">8173</span>      // throw DoNotRetryIOException instead of IllegalArgumentException<a name="line.8173"></a>
+<span class="sourceLineNo">8174</span>      throw new DoNotRetryIOException("Field is not a long, it's " + len + " bytes wide");<a name="line.8174"></a>
+<span class="sourceLineNo">8175</span>    }<a name="line.8175"></a>
+<span class="sourceLineNo">8176</span>    return PrivateCellUtil.getValueAsLong(cell);<a name="line.8176"></a>
+<span class="sourceLineNo">8177</span>  }<a name="line.8177"></a>
+<span class="sourceLineNo">8178</span><a name="line.8178"></a>
+<span class="sourceLineNo">8179</span>  /**<a name="line.8179"></a>
+<span class="sourceLineNo">8180</span>   * Do a specific Get on passed &lt;code&gt;columnFamily&lt;/code&gt; and column qualifiers.<a name="line.8180"></a>
+<span class="sourceLineNo">8181</span>   * @param mutation Mutation we are doing this Get for.<a name="line.8181"></a>
+<span class="sourceLineNo">8182</span>   * @param store Which column family on row (TODO: Go all Gets in one go)<a name="line.8182"></a>
+<span class="sourceLineNo">8183</span>   * @param coordinates Cells from &lt;code&gt;mutation&lt;/code&gt; used as coordinates applied to Get.<a name="line.8183"></a>
+<span class="sourceLineNo">8184</span>   * @return Return list of Cells found.<a name="line.8184"></a>
+<span class="sourceLineNo">8185</span>   */<a name="line.8185"></a>
+<span class="sourceLineNo">8186</span>  private List&lt;Cell&gt; get(Mutation mutation, HStore store, List&lt;Cell&gt; coordinates,<a name="line.8186"></a>
+<span class="sourceLineNo">8187</span>      IsolationLevel isolation, TimeRange tr) throws IOException {<a name="line.8187"></a>
+<span class="sourceLineNo">8188</span>    // Sort the cells so that they match the order that they appear in the Get results. Otherwise,<a name="line.8188"></a>
+<span class="sourceLineNo">8189</span>    // we won't be able to find the existing values if the cells are not specified in order by the<a name="line.8189"></a>
+<span class="sourceLineNo">8190</span>    // client since cells are in an array list.<a name="line.8190"></a>
+<span class="sourceLineNo">8191</span>    // TODO: I don't get why we are sorting. St.Ack 20150107<a name="line.8191"></a>
+<span class="sourceLineNo">8192</span>    sort(coordinates, store.getComparator());<a name="line.8192"></a>
+<span class="sourceLineNo">8193</span>    Get get = new Get(mutation.getRow());<a name="line.8193"></a>
+<span class="sourceLineNo">8194</span>    if (isolation != null) {<a name="line.8194"></a>
+<span class="sourceLineNo">8195</span>      get.setIsolationLevel(isolation);<a name="line.8195"></a>
+<span class="sourceLineNo">8196</span>    }<a name="line.8196"></a>
+<span class="sourceLineNo">8197</span>    for (Cell cell: coordinates) {<a name="line.8197"></a>
+<span class="sourceLineNo">8198</span>      get.addColumn(store.getColumnFamilyDescriptor().getName(), CellUtil.cloneQualifier(cell));<a name="line.8198"></a>
+<span class="sourceLineNo">8199</span>    }<a name="line.8199"></a>
+<span class="sourceLineNo">8200</span>    // Increments carry time range. If an Increment instance, put it on the Get.<a name="line.8200"></a>
+<span class="sourceLineNo">8201</span>    if (tr != null) {<a name="line.8201"></a>
+<span class="sourceLineNo">8202</span>      get.setTimeRange(tr.getMin(), tr.getMax());<a name="line.8202"></a>
+<span class="sourceLineNo">8203</span>    }<a name="line.8203"></a>
+<span class="sourceLineNo">8204</span>    return get(get, false);<a name="line.8204"></a>
+<span class="sourceLineNo">8205</span>  }<a name="line.8205"></a>
+<span class="sourceLineNo">8206</span><a name="line.8206"></a>
+<span class="sourceLineNo">8207</span>  /**<a name="line.8207"></a>
+<span class="sourceLineNo">8208</span>   * @return Sorted list of &lt;code&gt;cells&lt;/code&gt; using &lt;code&gt;comparator&lt;/code&gt;<a name="line.8208"></a>
+<span class="sourceLineNo">8209</span>   */<a name="line.8209"></a>
+<span class="sourceLineNo">8210</span>  private static List&lt;Cell&gt; sort(List&lt;Cell&gt; cells, final CellComparator comparator) {<a name="line.8210"></a>
+<span class="sourceLineNo">8211</span>    cells.sort(comparator);<a name="line.8211"></a>
+<span class="sourceLineNo">8212</span>    return cells;<a name="line.8212"></a>
+<span class="sourceLineNo">8213</span>  }<a name="line.8213"></a>
+<span class="sourceLineNo">8214</span><a name="line.8214"></a>
+<span class="sourceLineNo">8215</span>  public static final long FIXED_OVERHEAD = ClassSize.align(<a name="line.8215"></a>
+<span class="sourceLineNo">8216</span>      ClassSize.OBJECT +<a name="line.8216"></a>
+<span class="sourceLineNo">8217</span>      ClassSize.ARRAY +<a name="line.8217"></a>
+<span class="sourceLineNo">8218</span>      55 * ClassSize.REFERENCE + 3 * Bytes.SIZEOF_INT +<a name="line.8218"></a>
+<span class="sourceLineNo">8219</span>      (15 * Bytes.SIZEOF_LONG) +<a name="line.8219"></a>
+<span class="sourceLineNo">8220</span>      3 * Bytes.SIZEOF_BOOLEAN);<a name="line.8220"></a>
+<span class="sourceLineNo">8221</span><a name="line.8221"></a>
+<span class="sourceLineNo">8222</span>  // woefully out of date - currently missing:<a name="line.8222"></a>
+<span class="sourceLineNo">8223</span>  // 1 x HashMap - coprocessorServiceHandlers<a name="line.8223"></a>
+<span class="sourceLineNo">8224</span>  // 6 x LongAdder - numMutationsWithoutWAL, dataInMemoryWithoutWAL,<a name="line.8224"></a>
+<span class="sourceLineNo">8225</span>  //   checkAndMutateChecksPassed, checkAndMutateChecksFailed, readRequestsCount,<a name="line.8225"></a>
+<span class="sourceLineNo">8226</span>  //   writeRequestsCount, cpRequestsCount<a name="line.8226"></a>
+<span class="sourceLineNo">8227</span>  // 1 x HRegion$WriteState - writestate<a name="line.8227"></a>
+<span class="sourceLineNo">8228</span>  // 1 x RegionCoprocessorHost - coprocessorHost<a name="line.8228"></a>
+<span class="sourceLineNo">8229</span>  // 1 x RegionSplitPolicy - splitPolicy<a name="line.8229"></a>
+<span class="sourceLineNo">8230</span>  // 1 x MetricsRegion - metricsRegion<a name="line.8230"></a>
+<span class="sourceLineNo">8231</span>  // 1 x MetricsRegionWrapperImpl - metricsRegionWrapper<a name="line.8231"></a>
+<span class="sourceLineNo">8232</span>  public static final long DEEP_OVERHEAD = FIXED_OVERHEAD +<a name="line.8232"></a>
+<span class="sourceLineNo">8233</span>      ClassSize.OBJECT + // closeLock<a name="line.8233"></a>
+<span class="sourceLineNo">8234</span>      (2 * ClassSize.ATOMIC_BOOLEAN) + // closed, closing<a name="line.8234"></a>
+<span class="sourceLineNo">8235</span>      (3 * ClassSize.ATOMIC_LONG) + // numPutsWithoutWAL, dataInMemoryWithoutWAL,<a name="line.8235"></a>
+<span class="sourceLineNo">8236</span>                                    // compactionsFailed<a name="line.8236"></a>
+<span class="sourceLineNo">8237</span>      (2 * ClassSize.CONCURRENT_HASHMAP) +  // lockedRows, scannerReadPoints<a name="line.8237"></a>
+<span class="sourceLineNo">8238</span>      WriteState.HEAP_SIZE + // writestate<a name="line.8238"></a>
+<span class="sourceLineNo">8239</span>      ClassSize.CONCURRENT_SKIPLISTMAP + ClassSize.CONCURRENT_SKIPLISTMAP_ENTRY + // stores<a name="line.8239"></a>
+<span class="sourceLineNo">8240</span>      (2 * ClassSize.REENTRANT_LOCK) + // lock, updatesLock<a name="line.8240"></a>
+<span class="sourceLineNo">8241</span>      MultiVersionConcurrencyControl.FIXED_SIZE // mvcc<a name="line.8241"></a>
+<span class="sourceLineNo">8242</span>      + 2 * ClassSize.TREEMAP // maxSeqIdInStores, replicationScopes<a name="line.8242"></a>
+<span class="sourceLineNo">8243</span>      + 2 * ClassSize.ATOMIC_INTEGER // majorInProgress, minorInProgress<a name="line.8243"></a>
+<span class="sourceLineNo">8244</span>      + ClassSize.STORE_SERVICES // store services<a name="line.8244"></a>
+<span class="sourceLineNo">8245</span>      + StoreHotnessProtector.FIXED_SIZE<a name="line.8245"></a>
+<span class="sourceLineNo">8246</span>      ;<a name="line.8246"></a>
+<span class="sourceLineNo">8247</span><a name="line.8247"></a>
+<span class="sourceLineNo">8248</span>  @Override<a name="line.8248"></a>
+<span class="sourceLineNo">8249</span>  public long heapSize() {<a name="line.8249"></a>
+<span class="sourceLineNo">8250</span>    // this does not take into account row locks, recent flushes, mvcc entries, and more<a name="line.8250"></a>
+<span class="sourceLineNo">8251</span>    return DEEP_OVERHEAD + stores.values().stream().mapToLong(HStore::heapSize).sum();<a name="line.8251"></a>
+<span class="sourceLineNo">8252</span>  }<a name="line.8252"></a>
+<span class="sourceLineNo">8253</span><a name="line.8253"></a>
+<span class="sourceLineNo">8254</span>  /**<a name="line.8254"></a>
+<span class="sourceLineNo">8255</span>   * Registers a new protocol buffer {@link Service} subclass as a coprocessor endpoint to<a name="line.8255"></a>
+<span class="sourceLineNo">8256</span>   * be available for handling Region#execService(com.google.protobuf.RpcController,<a name="line.8256"></a>
+<span class="sourceLineNo">8257</span>   *    org.apache.hadoop.hbase.protobuf.generated.ClientProtos.CoprocessorServiceCall) calls.<a name="line.8257"></a>
+<span class="sourceLineNo">8258</span>   *<a name="line.8258"></a>
+<span class="sourceLineNo">8259</span>   * &lt;p&gt;<a name="line.8259"></a>
+<span class="sourceLineNo">8260</span>   * Only a single instance may be registered per region for a given {@link Service} subclass (the<a name="line.8260"></a>
+<span class="sourceLineNo">8261</span>   * instances are keyed on {@link com.google.protobuf.Descriptors.ServiceDescriptor#getFullName()}.<a name="line.8261"></a>
+<span class="sourceLineNo">8262</span>   * After the first registration, subsequent calls with the same service name will fail with<a name="line.8262"></a>
+<span class="sourceLineNo">8263</span>   * a return value of {@code false}.<a name="line.8263"></a>
+<span class="sourceLineNo">8264</span>   * &lt;/p&gt;<a name="line.8264"></a>
+<span class="sourceLineNo">8265</span>   * @param instance the {@code Service} subclass instance to expose as a coprocessor endpoint<a name="line.8265"></a>
+<span class="sourceLineNo">8266</span>   * @return {@code true} if the registration was successful, {@code false}<a name="line.8266"></a>
+<span class="sourceLineNo">8267</span>   * otherwise<a name="line.8267"></a>
+<span class="sourceLineNo">8268</span>   */<a name="line.8268"></a>
+<span class="sourceLineNo">8269</span>  public boolean registerService(com.google.protobuf.Service instance) {<a name="line.8269"></a>
+<span class="sourceLineNo">8270</span>    /*<a name="line.8270"></a>
+<span class="sourceLineNo">8271</span>     * No stacking of instances is allowed for a single service name<a name="line.8271"></a>
+<span class="sourceLineNo">8272</span>     */<a name="line.8272"></a>
+<span class="sourceLineNo">8273</span>    com.google.protobuf.Descriptors.ServiceDescriptor serviceDesc = instance.getDescriptorForType();<a name="line.8273"></a>
+<span class="sourceLineNo">8274</span>    String serviceName = CoprocessorRpcUtils.getServiceName(serviceDesc);<a name="line.8274"></a>
+<span class="sourceLineNo">8275</span>    if (coprocessorServiceHandlers.containsKey(serviceName)) {<a name="line.8275"></a>
+<span class="sourceLineNo">8276</span>      LOG.error("Coprocessor service " + serviceName +<a name="line.8276"></a>
+<span class="sourceLineNo">8277</span>          " already registered, rejecting request from " + instance);<a name="line.8277"></a>
+<span class="sourceLineNo">8278</span>      return false;<a name="line.8278"></a>
+<span class="sourceLineNo">8279</span>    }<a name="line.8279"></a>
+<span class="sourceLineNo">8280</span><a name="line.8280"></a>
+<span class="sourceLineNo">8281</span>    coprocessorServiceHandlers.put(serviceName, instance);<a name="line.8281"></a>
+<span class="sourceLineNo">8282</span>    if (LOG.isDebugEnabled()) {<a name="line.8282"></a>
+<span class="sourceLineNo">8283</span>      LOG.debug("Registered coprocessor service: region=" +<a name="line.8283"></a>
+<span class="sourceLineNo">8284</span>          Bytes.toStringBinary(getRegionInfo().getRegionName()) +<a name="line.8284"></a>
+<span class="sourceLineNo">8285</span>          " service=" + serviceName);<a name="line.8285"></a>
+<span class="sourceLineNo">8286</span>    }<a name="line.8286"></a>
+<span class="sourceLineNo">8287</span>    return true;<a name="line.8287"></a>
+<span class="sourceLineNo">8288</span>  }<a name="line.8288"></a>
+<span class="sourceLineNo">8289</span><a name="line.8289"></a>
+<span class="sourceLineNo">8290</span>  /**<a name="line.8290"></a>
+<span class="sourceLineNo">8291</span>   * Executes a single protocol buffer coprocessor endpoint {@link Service} method using<a name="line.8291"></a>
+<span class="sourceLineNo">8292</span>   * the registered protocol handlers.  {@link Service} implementations must be registered via the<a name="line.8292"></a>
+<span class="sourceLineNo">8293</span>   * {@link #registerService(com.google.protobuf.Service)}<a name="line.8293"></a>
+<span class="sourceLineNo">8294</span>   * method before they are available.<a name="line.8294"></a>
+<span class="sourceLineNo">8295</span>   *<a name="line.8295"></a>
+<span class="sourceLineNo">8296</span>   * @param controller an {@code RpcContoller} implementation to pass to the invoked service<a name="line.8296"></a>
+<span class="sourceLineNo">8297</span>   * @param call a {@code CoprocessorServiceCall} instance identifying the service, method,<a name="line.8297"></a>
+<span class="sourceLineNo">8298</span>   *     and parameters for the method invocation<a name="line.8298"></a>
+<span class="sourceLineNo">8299</span>   * @return a protocol buffer {@code Message} instance containing the method's result<a name="line.8299"></a>
+<span class="sourceLineNo">8300</span>   * @throws IOException if no registered service handler is found or an error<a name="line.8300"></a>
+<span class="sourceLineNo">8301</span>   *     occurs during the invocation<a name="line.8301"></a>
+<span class="sourceLineNo">8302</span>   * @see #registerService(com.google.protobuf.Service)<a name="line.8302"></a>
+<span class="sourceLineNo">8303</span>   */<a name="line.8303"></a>
+<span class="sourceLineNo">8304</span>  public com.google.protobuf.Message execService(com.google.protobuf.RpcController controller,<a name="line.8304"></a>
+<span class="sourceLineNo">8305</span>      CoprocessorServiceCall call) throws IOException {<a name="line.8305"></a>
+<span class="sourceLineNo">8306</span>    String serviceName = call.getServiceName();<a name="line.8306"></a>
+<span class="sourceLineNo">8307</span>    com.google.protobuf.Service service = coprocessorServiceHandlers.get(serviceName);<a name="line.8307"></a>
+<span class="sourceLineNo">8308</span>    if (service == null) {<a name="line.8308"></a>
+<span class="sourceLineNo">8309</span>      throw new UnknownProtocolException(null, "No registered coprocessor service found for " +<a name="line.8309"></a>
+<span class="sourceLineNo">8310</span>          serviceName + " in region " + Bytes.toStringBinary(getRegionInfo().getRegionName()));<a name="line.8310"></a>
+<span class="sourceLineNo">8311</span>    }<a name="line.8311"></a>
+<span class="sourceLineNo">8312</span>    com.google.protobuf.Descriptors.ServiceDescriptor serviceDesc = service.getDescriptorForType();<a name="line.8312"></a>
 <span class="sourceLineNo">8313</span><a name="line.8313"></a>
-<span class="sourceLineNo">8314</span>    com.google.protobuf.Message.Builder builder =<a name="line.8314"></a>
-<span class="sourceLineNo">8315</span>        service.getRequestPrototype(methodDesc).newBuilderForType();<a name="line.8315"></a>
-<span class="sourceLineNo">8316</span><a name="line.8316"></a>
-<span class="sourceLineNo">8317</span>    org.apache.hadoop.hbase.protobuf.ProtobufUtil.mergeFrom(builder,<a name="line.8317"></a>
-<span class="sourceLineNo">8318</span>        call.getRequest().toByteArray());<a name="line.8318"></a>
-<span class="sourceLineNo">8319</span>    com.google.protobuf.Message request =<a name="line.8319"></a>
-<span class="sourceLineNo">8320</span>        CoprocessorRpcUtils.getRequest(service, methodDesc, call.getRequest());<a name="line.8320"></a>
+<span class="sourceLineNo">8314</span>    cpRequestsCount.increment();<a name="line.8314"></a>
+<span class="sourceLineNo">8315</span>    String methodName = call.getMethodName();<a name="line.8315"></a>
+<span class="sourceLineNo">8316</span>    com.google.protobuf.Descriptors.MethodDescriptor methodDesc =<a name="line.8316"></a>
+<span class="sourceLineNo">8317</span>        CoprocessorRpcUtils.getMethodDescriptor(methodName, serviceDesc);<a name="line.8317"></a>
+<span class="sourceLineNo">8318</span><a name="line.8318"></a>
+<span class="sourceLineNo">8319</span>    com.google.protobuf.Message.Builder builder =<a name="line.8319"></a>
+<span class="sourceLineNo">8320</span>        service.getRequestPrototype(methodDesc).newBuilderForType();<a name="line.8320"></a>
 <span class="sourceLineNo">8321</span><a name="line.8321"></a>
-<span class="sourceLineNo">8322</span>    if (coprocessorHost != null) {<a name="line.8322"></a>
-<span class="sourceLineNo">8323</span>      request = coprocessorHost.preEndpointInvocation(service, methodName, request);<a name="line.8323"></a>
-<span class="sourceLineNo">8324</span>    }<a name="line.8324"></a>
-<span class="sourceLineNo">8325</span><a name="line.8325"></a>
-<span class="sourceLineNo">8326</span>    final com.google.protobuf.Message.Builder responseBuilder =<a name="line.8326"></a>
-<span class="sourceLineNo">8327</span>        service.getResponsePrototype(methodDesc).newBuilderForType();<a name="line.8327"></a>
-<span class="sourceLineNo">8328</span>    service.callMethod(methodDesc, controller, request,<a name="line.8328"></a>
-<span class="sourceLineNo">8329</span>        new com.google.protobuf.RpcCallback&lt;com.google.protobuf.Message&gt;() {<a name="line.8329"></a>
-<span class="sourceLineNo">8330</span>      @Override<a name="line.8330"></a>
-<span class="sourceLineNo">8331</span>      public void run(com.google.protobuf.Message message) {<a name="line.8331"></a>
-<span class="sourceLineNo">8332</span>        if (message != null) {<a name="line.8332"></a>
-<span class="sourceLineNo">8333</span>          responseBuilder.mergeFrom(message);<a name="line.8333"></a>
-<span class="sourceLineNo">8334</span>        }<a name="line.8334"></a>
-<span class="sourceLineNo">8335</span>      }<a name="line.8335"></a>
-<span class="sourceLineNo">8336</span>    });<a name="line.8336"></a>
-<span class="sourceLineNo">8337</span><a name="line.8337"></a>
-<span class="sourceLineNo">8338</span>    if (coprocessorHost != null) {<a name="line.8338"></a>
-<span class="sourceLineNo">8339</span>      coprocessorHost.postEndpointInvocation(service, methodName, request, responseBuilder);<a name="line.8339"></a>
-<span class="sourceLineNo">8340</span>    }<a name="line.8340"></a>
-<span class="sourceLineNo">8341</span>    IOException exception =<a name="line.8341"></a>
-<span class="sourceLineNo">8342</span>        org.apache.hadoop.hbase.ipc.CoprocessorRpcUtils.getControllerException(controller);<a name="line.8342"></a>
-<span class="sourceLineNo">8343</span>    if (exception != null) {<a name="line.8343"></a>
-<span class="sourceLineNo">8344</span>      throw exception;<a name="line.8344"></a>
+<span class="sourceLineNo">8322</span>    org.apache.hadoop.hbase.protobuf.ProtobufUtil.mergeFrom(builder,<a name="line.8322"></a>
+<span class="sourceLineNo">8323</span>        call.getRequest().toByteArray());<a name="line.8323"></a>
+<span class="sourceLineNo">8324</span>    com.google.protobuf.Message request =<a name="line.8324"></a>
+<span class="sourceLineNo">8325</span>        CoprocessorRpcUtils.getRequest(service, methodDesc, call.getRequest());<a name="line.8325"></a>
+<span class="sourceLineNo">8326</span><a name="line.8326"></a>
+<span class="sourceLineNo">8327</span>    if (coprocessorHost != null) {<a name="line.8327"></a>
+<span class="sourceLineNo">8328</span>      request = coprocessorHost.preEndpointInvocation(service, methodName, request);<a name="line.8328"></a>
+<span class="sourceLineNo">8329</span>    }<a name="line.8329"></a>
+<span class="sourceLineNo">8330</span><a name="line.8330"></a>
+<span class="sourceLineNo">8331</span>    final com.google.protobuf.Message.Builder responseBuilder =<a name="line.8331"></a>
+<span class="sourceLineNo">8332</span>        service.getResponsePrototype(methodDesc).newBuilderForType();<a name="line.8332"></a>
+<span class="sourceLineNo">8333</span>    service.callMethod(methodDesc, controller, request,<a name="line.8333"></a>
+<span class="sourceLineNo">8334</span>        new com.google.protobuf.RpcCallback&lt;com.google.protobuf.Message&gt;() {<a name="line.8334"></a>
+<span class="sourceLineNo">8335</span>      @Override<a name="line.8335"></a>
+<span class="sourceLineNo">8336</span>      public void run(com.google.protobuf.Message message) {<a name="line.8336"></a>
+<span class="sourceLineNo">8337</span>        if (message != null) {<a name="line.8337"></a>
+<span class="sourceLineNo">8338</span>          responseBuilder.mergeFrom(message);<a name="line.8338"></a>
+<span class="sourceLineNo">8339</span>        }<a name="line.8339"></a>
+<span class="sourceLineNo">8340</span>      }<a name="line.8340"></a>
+<span class="sourceLineNo">8341</span>    });<a name="line.8341"></a>
+<span class="sourceLineNo">8342</span><a name="line.8342"></a>
+<span class="sourceLineNo">8343</span>    if (coprocessorHost != null) {<a name="line.8343"></a>
+<span class="sourceLineNo">8344</span>      coprocessorHost.postEndpointInvocation(service, methodName, request, responseBuilder);<a name="line.8344"></a>
 <span class="sourceLineNo">8345</span>    }<a name="line.8345"></a>
-<span class="sourceLineNo">8346</span><a name="line.8346"></a>
-<span class="sourceLineNo">8347</span>    return responseBuilder.build();<a name="line.8347"></a>
-<span class="sourceLineNo">8348</span>  }<a name="line.8348"></a>
-<span class="sourceLineNo">8349</span><a name="line.8349"></a>
-<span class="sourceLineNo">8350</span>  boolean shouldForceSplit() {<a name="line.8350"></a>
-<span class="sourceLineNo">8351</span>    return this.splitRequest;<a name="line.8351"></a>
-<span class="sourceLineNo">8352</span>  }<a name="line.8352"></a>
-<span class="sourceLineNo">8353</span><a name="line.8353"></a>
-<span class="sourceLineNo">8354</span>  byte[] getExplicitSplitPoint() {<a name="line.8354"></a>
-<span class="sourceLineNo">8355</span>    return this.explicitSplitPoint;<a name="line.8355"></a>
-<span class="sourceLineNo">8356</span>  }<a name="line.8356"></a>
-<span class="sourceLineNo">8357</span><a name="line.8357"></a>
-<span class="sourceLineNo">8358</span>  void forceSplit(byte[] sp) {<a name="line.8358"></a>
-<span class="sourceLineNo">8359</span>    // This HRegion will go away after the forced split is successful<a name="line.8359"></a>
-<span class="sourceLineNo">8360</span>    // But if a forced split fails, we need to clear forced split.<a name="line.8360"></a>
-<span class="sourceLineNo">8361</span>    this.splitRequest = true;<a name="line.8361"></a>
-<span class="sourceLineNo">8362</span>    if (sp != null) {<a name="line.8362"></a>
-<span class="sourceLineNo">8363</span>      this.explicitSplitPoint = sp;<a name="line.8363"></a>
-<span class="sourceLineNo">8364</span>    }<a name="line.8364"></a>
-<span class="sourceLineNo">8365</span>  }<a name="line.8365"></a>
-<span class="sourceLineNo">8366</span><a name="line.8366"></a>
-<span class="sourceLineNo">8367</span>  void clearSplit() {<a name="line.8367"></a>
-<span class="sourceLineNo">8368</span>    this.splitRequest = false;<a name="line.8368"></a>
-<span class="sourceLineNo">8369</span>    this.explicitSplitPoint = null;<a name="line.8369"></a>
+<span class="sourceLineNo">8346</span>    IOException exception =<a name="line.8346"></a>
+<span class="sourceLineNo">8347</span>        org.apache.hadoop.hbase.ipc.CoprocessorRpcUtils.getControllerException(controller);<a name="line.8347"></a>
+<span class="sourceLineNo">8348</span>    if (exception != null) {<a name="line.8348"></a>
+<span class="sourceLineNo">8349</span>      throw exception;<a name="line.8349"></a>
+<span class="sourceLineNo">8350</span>    }<a name="line.8350"></a>
+<span class="sourceLineNo">8351</span><a name="line.8351"></a>
+<span class="sourceLineNo">8352</span>    return responseBuilder.build();<a name="line.8352"></a>
+<span class="sourceLineNo">8353</span>  }<a name="line.8353"></a>
+<span class="sourceLineNo">8354</span><a name="line.8354"></a>
+<span class="sourceLineNo">8355</span>  boolean shouldForceSplit() {<a name="line.8355"></a>
+<span class="sourceLineNo">8356</span>    return this.splitRequest;<a name="line.8356"></a>
+<span class="sourceLineNo">8357</span>  }<a name="line.8357"></a>
+<span class="sourceLineNo">8358</span><a name="line.8358"></a>
+<span class="sourceLineNo">8359</span>  byte[] getExplicitSplitPoint() {<a name="line.8359"></a>
+<span class="sourceLineNo">8360</span>    return this.explicitSplitPoint;<a name="line.8360"></a>
+<span class="sourceLineNo">8361</span>  }<a name="line.8361"></a>
+<span class="sourceLineNo">8362</span><a name="line.8362"></a>
+<span class="sourceLineNo">8363</span>  void forceSplit(byte[] sp) {<a name="line.8363"></a>
+<span class="sourceLineNo">8364</span>    // This HRegion will go away after the forced split is successful<a name="line.8364"></a>
+<span class="sourceLineNo">8365</span>    // But if a forced split fails, we need to clear forced split.<a name="line.8365"></a>
+<span class="sourceLineNo">8366</span>    this.splitRequest = true;<a name="line.8366"></a>
+<span class="sourceLineNo">8367</span>    if (sp != null) {<a name="line.8367"></a>
+<span class="sourceLineNo">8368</span>      this.explicitSplitPoint = sp;<a name="line.8368"></a>
+<span class="sourceLineNo">8369</span>    }<a name="line.8369"></a>
 <span class="sourceLineNo">8370</span>  }<a name="line.8370"></a>
 <span class="sourceLineNo">8371</span><a name="line.8371"></a>
-<span class="sourceLineNo">8372</span>  /**<a name="line.8372"></a>
-<span class="sourceLineNo">8373</span>   * Return the splitpoint. null indicates the region isn't splittable<a name="line.8373"></a>
-<span class="sourceLineNo">8374</span>   * If the splitpoint isn't explicitly specified, it will go over the stores<a name="line.8374"></a>
-<span class="sourceLineNo">8375</span>   * to find the best splitpoint. Currently the criteria of best splitpoint<a name="line.8375"></a>
-<span class="sourceLineNo">8376</span>   * is based on the size of the store.<a name="line.8376"></a>
-<span class="sourceLineNo">8377</span>   */<a name="line.8377"></a>
-<span class="sourceLineNo">8378</span>  public byte[] checkSplit() {<a name="line.8378"></a>
-<span class="sourceLineNo">8379</span>    // Can't split META<a name="line.8379"></a>
-<span class="sourceLineNo">8380</span>    if (this.getRegionInfo().isMetaRegion()) {<a name="line.8380"></a>
-<span class="sourceLineNo">8381</span>      if (shouldForceSplit()) {<a name="line.8381"></a>
-<span class="sourceLineNo">8382</span>        LOG.warn("Cannot split meta region in HBase 0.20 and above");<a name="line.8382"></a>
-<span class="sourceLineNo">8383</span>      }<a name="line.8383"></a>
-<span class="sourceLineNo">8384</span>      return null;<a name="line.8384"></a>
-<span class="sourceLineNo">8385</span>    }<a name="line.8385"></a>
-<span class="sourceLineNo">8386</span><a name="line.8386"></a>
-<span class="sourceLineNo">8387</span>    // Can't split a region that is closing.<a name="line.8387"></a>
-<span class="sourceLineNo">8388</span>    if (this.isClosing()) {<a name="line.8388"></a>
+<span class="sourceLineNo">8372</span>  void clearSplit() {<a name="line.8372"></a>
+<span class="sourceLineNo">8373</span>    this.splitRequest = false;<a name="line.8373"></a>
+<span class="sourceLineNo">8374</span>    this.explicitSplitPoint = null;<a name="line.8374"></a>
+<span class="sourceLineNo">8375</span>  }<a name="line.8375"></a>
+<span class="sourceLineNo">8376</span><a name="line.8376"></a>
+<span class="sourceLineNo">8377</span>  /**<a name="line.8377"></a>
+<span class="sourceLineNo">8378</span>   * Return the splitpoint. null indicates the region isn't splittable<a name="line.8378"></a>
+<span class="sourceLineNo">8379</span>   * If the splitpoint isn't explicitly specified, it will go over the stores<a name="line.8379"></a>
+<span class="sourceLineNo">8380</span>   * to find the best splitpoint. Currently the criteria of best splitpoint<a name="line.8380"></a>
+<span class="sourceLineNo">8381</span>   * is based on the size of the store.<a name="line.8381"></a>
+<span class="sourceLineNo">8382</span>   */<a name="line.8382"></a>
+<span class="sourceLineNo">8383</span>  public byte[] checkSplit() {<a name="line.8383"></a>
+<span class="sourceLineNo">8384</span>    // Can't split META<a name="line.8384"></a>
+<span class="sourceLineNo">8385</span>    if (this.getRegionInfo().isMetaRegion()) {<a name="line.8385"></a>
+<span class="sourceLineNo">8386</span>      if (shouldForceSplit()) {<a name="line.8386"></a>
+<span class="sourceLineNo">8387</span>        LOG.warn("Cannot split meta region in HBase 0.20 and above");<a name="line.8387"></a>
+<span class="sourceLineNo">8388</span>      }<a name="line.8388"></a>
 <span class="sourceLineNo">8389</span>      return null;<a name="line.8389"></a>
 <span class="sourceLineNo">8390</span>    }<a name="line.8390"></a>
 <span class="sourceLineNo">8391</span><a name="line.8391"></a>
-<span class="sourceLineNo">8392</span>    if (!splitPolicy.shouldSplit()) {<a name="line.8392"></a>
-<span class="sourceLineNo">8393</span>      return null;<a name="line.8393"></a>
-<span class="sourceLineNo">8394</span>    }<a name="line.8394"></a>
-<span class="sourceLineNo">8395</span><a name="line.8395"></a>
-<span class="sourceLineNo">8396</span>    byte[] ret = splitPolicy.getSplitPoint();<a name="line.8396"></a>
-<span class="sourceLineNo">8397</span><a name="line.8397"></a>
-<span class="sourceLineNo">8398</span>    if (ret != null) {<a name="line.8398"></a>
-<span class="sourceLineNo">8399</span>      try {<a name="line.8399"></a>
-<span class="sourceLineNo">8400</span>        checkRow(ret, "calculated split");<a name="line.8400"></a>
-<span class="sourceLineNo">8401</span>      } catch (IOException e) {<a name="line.8401"></a>
-<span class="sourceLineNo">8402</span>        LOG.error("Ignoring invalid split", e);<a name="line.8402"></a>
-<span class="sourceLineNo">8403</span>        return null;<a name="line.8403"></a>
-<span class="sourceLineNo">8404</span>      }<a name="line.8404"></a>
-<span class="sourceLineNo">8405</span>    }<a name="line.8405"></a>
-<span class="sourceLineNo">8406</span>    return ret;<a name="line.8406"></a>
-<span class="sourceLineNo">8407</span>  }<a name="line.8407"></a>
-<span class="sourceLineNo">8408</span><a name="line.8408"></a>
-<span class="sourceLineNo">8409</span>  /**<a name="line.8409"></a>
-<span class="sourceLineNo">8410</span>   * @return The priority that this region should have in the compaction queue<a name="line.8410"></a>
-<span class="sourceLineNo">8411</span>   */<a name="line.8411"></a>
-<span class="sourceLineNo">8412</span>  public int getCompactPriority() {<a name="line.8412"></a>
-<span class="sourceLineNo">8413</span>    return stores.values().stream().mapToInt(HStore::getCompactPriority).min()<a name="line.8413"></a>
-<span class="sourceLineNo">8414</span>        .orElse(Store.NO_PRIORITY);<a name="line.8414"></a>
-<span class="sourceLineNo">8415</span>  }<a name="line.8415"></a>
-<span class="sourceLineNo">8416</span><a name="line.8416"></a>
-<span class="sourceLineNo">8417</span>  /** @return the coprocessor host */<a name="line.8417"></a>
-<span class="sourceLineNo">8418</span>  public RegionCoprocessorHost getCoprocessorHost() {<a name="line.8418"></a>
-<span class="sourceLineNo">8419</span>    return coprocessorHost;<a name="line.8419"></a>
+<span class="sourceLineNo">8392</span>    // Can't split a region that is closing.<a name="line.8392"></a>
+<span class="sourceLineNo">8393</span>    if (this.isClosing()) {<a name="line.8393"></a>
+<span class="sourceLineNo">8394</span>      return null;<a name="line.8394"></a>
+<span class="sourceLineNo">8395</span>    }<a name="line.8395"></a>
+<span class="sourceLineNo">8396</span><a name="line.8396"></a>
+<span class="sourceLineNo">8397</span>    if (!splitPolicy.shouldSplit()) {<a name="line.8397"></a>
+<span class="sourceLineNo">8398</span>      return null;<a name="line.8398"></a>
+<span class="sourceLineNo">8399</span>    }<a name="line.8399"></a>
+<span class="sourceLineNo">8400</span><a name="line.8400"></a>
+<span class="sourceLineNo">8401</span>    byte[] ret = splitPolicy.getSplitPoint();<a name="line.8401"></a>
+<span class="sourceLineNo">8402</span><a name="line.8402"></a>
+<span class="sourceLineNo">8403</span>    if (ret != null) {<a name="line.8403"></a>
+<span class="sourceLineNo">8404</span>      try {<a name="line.8404"></a>
+<span class="sourceLineNo">8405</span>        checkRow(ret, "calculated split");<a name="line.8405"></a>
+<span class="sourceLineNo">8406</span>      } catch (IOException e) {<a name="line.8406"></a>
+<span class="sourceLineNo">8407</span>        LOG.error("Ignoring invalid split", e);<a name="line.8407"></a>
+<span class="sourceLineNo">8408</span>        return null;<a name="line.8408"></a>
+<span class="sourceLineNo">8409</span>      }<a name="line.8409"></a>
+<span class="sourceLineNo">8410</span>    }<a name="line.8410"></a>
+<span class="sourceLineNo">8411</span>    return ret;<a name="line.8411"></a>
+<span class="sourceLineNo">8412</span>  }<a name="line.8412"></a>
+<span class="sourceLineNo">8413</span><a name="line.8413"></a>
+<span class="sourceLineNo">8414</span>  /**<a name="line.8414"></a>
+<span class="sourceLineNo">8415</span>   * @return The priority that this region should have in the compaction queue<a name="line.8415"></a>
+<span class="sourceLineNo">8416</span>   */<a name="line.8416"></a>
+<span class="sourceLineNo">8417</span>  public int getCompactPriority() {<a name="line.8417"></a>
+<span class="sourceLineNo">8418</span>    return stores.values().stream().mapToInt(HStore::getCompactPriority).min()<a name="line.8418"></a>
+<span class="sourceLineNo">8419</span>        .orElse(Store.NO_PRIORITY);<a name="line.8419"></a>
 <span class="sourceLineNo">8420</span>  }<a name="line.8420"></a>
 <span class="sourceLineNo">8421</span><a name="line.8421"></a>
-<span class="sourceLineNo">8422</span>  /** @param coprocessorHost the new coprocessor host */<a name="line.8422"></a>
-<span class="sourceLineNo">8423</span>  @VisibleForTesting<a name="line.8423"></a>
-<span class="sourceLineNo">8424</span>  public void setCoprocessorHost(final RegionCoprocessorHost coprocessorHost) {<a name="line.8424"></a>
-<span class="sourceLineNo">8425</span>    this.coprocessorHost = coprocessorHost;<a name="line.8425"></a>
-<span class="sourceLineNo">8426</span>  }<a name="line.8426"></a>
-<span class="sourceLineNo">8427</span><a name="line.8427"></a>
-<span class="sourceLineNo">8428</span>  @Override<a name="line.8428"></a>
-<span class="sourceLineNo">8429</span>  public void startRegionOperation() throws IOException {<a name="line.8429"></a>
-<span class="sourceLineNo">8430</span>    startRegionOperation(Operation.ANY);<a name="line.8430"></a>
+<span class="sourceLineNo">8422</span>  /** @return the coprocessor host */<a name="line.8422"></a>
+<span class="sourceLineNo">8423</span>  public RegionCoprocessorHost getCoprocessorHost() {<a name="line.8423"></a>
+<span class="sourceLineNo">8424</span>    return coprocessorHost;<a name="line.8424"></a>
+<span class="sourceLineNo">8425</span>  }<a name="line.8425"></a>
+<span class="sourceLineNo">8426</span><a name="line.8426"></a>
+<span class="sourceLineNo">8427</span>  /** @param coprocessorHost the new coprocessor host */<a name="line.8427"></a>
+<span class="sourceLineNo">8428</span>  @VisibleForTesting<a name="line.8428"></a>
+<span class="sourceLineNo">8429</span>  public void setCoprocessorHost(final RegionCoprocessorHost coprocessorHost) {<a name="line.8429"></a>
+<span class="sourceLineNo">8430</span>    this.coprocessorHost = coprocessorHost;<a name="line.8430"></a>
 <span class="sourceLineNo">8431</span>  }<a name="line.8431"></a>
 <span class="sourceLineNo">8432</span><a name="line.8432"></a>
 <span class="sourceLineNo">8433</span>  @Override<a name="line.8433"></a>
-<span class="sourceLineNo">8434</span>  public void startRegionOperation(Operation op) throws IOException {<a name="line.8434"></a>
-<span class="sourceLineNo">8435</span>    switch (op) {<a name="line.8435"></a>
-<span class="sourceLineNo">8436</span>      case GET:  // read operations<a name="line.8436"></a>
-<span class="sourceLineNo">8437</span>      case SCAN:<a name="line.8437"></a>
-<span class="sourceLineNo">8438</span>        checkReadsEnabled();<a name="line.8438"></a>
-<span class="sourceLineNo">8439</span>        break;<a name="line.8439"></a>
-<span class="sourceLineNo">8440</span>      default:<a name="line.8440"></a>
-<span class="sourceLineNo">8441</span>        break;<a name="line.8441"></a>
-<span class="sourceLineNo">8442</span>    }<a name="line.8442"></a>
-<span class="sourceLineNo">8443</span>    if (op == Operation.MERGE_REGION || op == Operation.SPLIT_REGION<a name="line.8443"></a>
-<span class="sourceLineNo">8444</span>        || op == Operation.COMPACT_REGION || op == Operation.COMPACT_SWITCH) {<a name="line.8444"></a>
-<span class="sourceLineNo">8445</span>      // split, merge or compact region doesn't need to check the closing/closed state or lock the<a name="line.8445"></a>
-<span class="sourceLineNo">8446</span>      // region<a name="line.8446"></a>
-<span class="sourceLineNo">8447</span>      return;<a name="line.8447"></a>
-<span class="sourceLineNo">8448</span>    }<a name="line.8448"></a>
-<span class="sourceLineNo">8449</span>    if (this.closing.get()) {<a name="line.8449"></a>
-<span class="sourceLineNo">8450</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closing");<a name="line.8450"></a>
-<span class="sourceLineNo">8451</span>    }<a name="line.8451"></a>
-<span class="sourceLineNo">8452</span>    lock(lock.readLock());<a name="line.8452"></a>
-<span class="sourceLineNo">8453</span>    if (this.closed.get()) {<a name="line.8453"></a>
-<span class="sourceLineNo">8454</span>      lock.readLock().unlock();<a name="line.8454"></a>
-<span class="sourceLineNo">8455</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closed");<a name="line.8455"></a>
+<span class="sourceLineNo">8434</span>  public void startRegionOperation() throws IOException {<a name="line.8434"></a>
+<span class="sourceLineNo">8435</span>    startRegionOperation(Operation.ANY);<a name="line.8435"></a>
+<span class="sourceLineNo">8436</span>  }<a name="line.8436"></a>
+<span class="sourceLineNo">8437</span><a name="line.8437"></a>
+<span class="sourceLineNo">8438</span>  @Override<a name="line.8438"></a>
+<span class="sourceLineNo">8439</span>  public void startRegionOperation(Operation op) throws IOException {<a name="line.8439"></a>
+<span class="sourceLineNo">8440</span>    switch (op) {<a name="line.8440"></a>
+<span class="sourceLineNo">8441</span>      case GET:  // read operations<a name="line.8441"></a>
+<span class="sourceLineNo">8442</span>      case SCAN:<a name="line.8442"></a>
+<span class="sourceLineNo">8443</span>        checkReadsEnabled();<a name="line.8443"></a>
+<span class="sourceLineNo">8444</span>        break;<a name="line.8444"></a>
+<span class="sourceLineNo">8445</span>      default:<a name="line.8445"></a>
+<span class="sourceLineNo">8446</span>        break;<a name="line.8446"></a>
+<span class="sourceLineNo">8447</span>    }<a name="line.8447"></a>
+<span class="sourceLineNo">8448</span>    if (op == Operation.MERGE_REGION || op == Operation.SPLIT_REGION<a name="line.8448"></a>
+<span class="sourceLineNo">8449</span>        || op == Operation.COMPACT_REGION || op == Operation.COMPACT_SWITCH) {<a name="line.8449"></a>
+<span class="sourceLineNo">8450</span>      // split, merge or compact region doesn't need to check the closing/closed state or lock the<a name="line.8450"></a>
+<span class="sourceLineNo">8451</span>      // region<a name="line.8451"></a>
+<span class="sourceLineNo">8452</span>      return;<a name="line.8452"></a>
+<span class="sourceLineNo">8453</span>    }<a name="line.8453"></a>
+<span class="sourceLineNo">8454</span>    if (this.closing.get()) {<a name="line.8454"></a>
+<span class="sourceLineNo">8455</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closing");<a name="line.8455"></a>
 <span class="sourceLineNo">8456</span>    }<a name="line.8456"></a>
-<span class="sourceLineNo">8457</span>    // The unit for snapshot is a region. So, all stores for this region must be<a name="line.8457"></a>
-<span class="sourceLineNo">8458</span>    // prepared for snapshot operation before proceeding.<a name="line.8458"></a>
-<span class="sourceLineNo">8459</span>    if (op == Operation.SNAPSHOT) {<a name="line.8459"></a>
-<span class="sourceLineNo">8460</span>      stores.values().forEach(HStore::preSnapshotOperation);<a name="line.8460"></a>
+<span class="sourceLineNo">8457</span>    lock(lock.readLock());<a name="line.8457"></a>
+<span class="sourceLineNo">8458</span>    if (this.closed.get()) {<a name="line.8458"></a>
+<span class="sourceLineNo">8459</span>      lock.readLock().unlock();<a name="line.8459"></a>
+<span class="sourceLineNo">8460</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closed");<a name="line.8460"></a>
 <span class="sourceLineNo">8461</span>    }<a name="line.8461"></a>
-<span class="sourceLineNo">8462</span>    try {<a name="line.8462"></a>
-<span class="sourceLineNo">8463</span>      if (coprocessorHost != null) {<a name="line.8463"></a>
-<span class="sourceLineNo">8464</span>        coprocessorHost.postStartRegionOperation(op);<a name="line.8464"></a>
-<span class="sourceLineNo">8465</span>      }<a name="line.8465"></a>
-<span class="sourceLineNo">8466</span>    } catch (Exception e) {<a name="line.8466"></a>
-<span class="sourceLineNo">8467</span>      lock.readLock().unlock();<a name="line.8467"></a>
-<span class="sourceLineNo">8468</span>      throw new IOException(e);<a name="line.8468"></a>
-<span class="sourceLineNo">8469</span>    }<a name="line.8469"></a>
-<span class="sourceLineNo">8470</span>  }<a name="line.8470"></a>
-<span class="sourceLineNo">8471</span><a name="line.8471"></a>
-<span class="sourceLineNo">8472</span>  @Override<a name="line.8472"></a>
-<span class="sourceLineNo">8473</span>  public void closeRegionOperation() throws IOException {<a name="line.8473"></a>
-<span class="sourceLineNo">8474</span>    closeRegionOperation(Operation.ANY);<a name="line.8474"></a>
+<span class="sourceLineNo">8462</span>    // The unit for snapshot is a region. So, all stores for this region must be<a name="line.8462"></a>
+<span class="sourceLineNo">8463</span>    // prepared for snapshot operation before proceeding.<a name="line.8463"></a>
+<span class="sourceLineNo">8464</span>    if (op == Operation.SNAPSHOT) {<a name="line.8464"></a>
+<span class="sourceLineNo">8465</span>      stores.values().forEach(HStore::preSnapshotOperation);<a name="line.8465"></a>
+<span class="sourceLineNo">8466</span>    }<a name="line.8466"></a>
+<span class="sourceLineNo">8467</span>    try {<a name="line.8467"></a>
+<span class="sourceLineNo">8468</span>      if (coprocessorHost != null) {<a name="line.8468"></a>
+<span class="sourceLineNo">8469</span>        coprocessorHost.postStartRegionOperation(op);<a name="line.8469"></a>
+<span class="sourceLineNo">8470</span>      }<a name="line.8470"></a>
+<span class="sourceLineNo">8471</span>    } catch (Exception e) {<a name="line.8471"></a>
+<span class="sourceLineNo">8472</span>      lock.readLock().unlock();<a name="line.8472"></a>
+<span class="sourceLineNo">8473</span>      throw new IOException(e);<a name="line.8473"></a>
+<span class="sourceLineNo">8474</span>    }<a name="line.8474"></a>
 <span class="sourceLineNo">8475</span>  }<a name="line.8475"></a>
 <span class="sourceLineNo">8476</span><a name="line.8476"></a>
 <span class="sourceLineNo">8477</span>  @Override<a name="line.8477"></a>
-<span class="sourceLineNo">8478</span>  public void closeRegionOperation(Operation operation) throws IOException {<a name="line.8478"></a>
-<span class="sourceLineNo">8479</span>    if (operation == Operation.SNAPSHOT) {<a name="line.8479"></a>
-<span class="sourceLineNo">8480</span>      stores.values().forEach(HStore::postSnapshotOperation);<a name="line.8480"></a>
-<span class="sourceLineNo">8481</span>    }<a name="line.8481"></a>
-<span class="sourceLineNo">8482</span>    lock.readLock().unlock();<a name="line.8482"></a>
-<span class="sourceLineNo">8483</span>    if (coprocessorHost != null) {<a name="line.8483"></a>
-<span class="sourceLineNo">8484</span>      coprocessorHost.postCloseRegionOperation(operation);<a name="line.8484"></a>
-<span class="sourceLineNo">8485</span>    }<a name="line.8485"></a>
-<span class="sourceLineNo">8486</span>  }<a name="line.8486"></a>
-<span class="sourceLineNo">8487</span><a name="line.8487"></a>
-<span class="sourceLineNo">8488</span>  /**<a name="line.8488"></a>
-<span class="sourceLineNo">8489</span>   * This method needs to be called before any public call that reads or<a name="line.8489"></a>
-<span class="sourceLineNo">8490</span>   * modifies stores in bulk. It has to be called just before a try.<a name="line.8490"></a>
-<span class="sourceLineNo">8491</span>   * #closeBulkRegionOperation needs to be called in the try's finally block<a name="line.8491"></a>
-<span class="sourceLineNo">8492</span>   * Acquires a writelock and checks if the region is closing or closed.<a name="line.8492"></a>
-<span class="sourceLineNo">8493</span>   * @throws NotServingRegionException when the region is closing or closed<a name="line.8493"></a>
-<span class="sourceLineNo">8494</span>   * @throws RegionTooBusyException if failed to get the lock in time<a name="line.8494"></a>
-<span class="sourceLineNo">8495</span>   * @throws InterruptedIOException if interrupted while waiting for a lock<a name="line.8495"></a>
-<span class="sourceLineNo">8496</span>   */<a name="line.8496"></a>
-<span class="sourceLineNo">8497</span>  private void startBulkRegionOperation(boolean writeLockNeeded)<a name="line.8497"></a>
-<span class="sourceLineNo">8498</span>      throws NotServingRegionException, RegionTooBusyException, InterruptedIOException {<a name="line.8498"></a>
-<span class="sourceLineNo">8499</span>    if (this.closing.get()) {<a name="line.8499"></a>
-<span class="sourceLineNo">8500</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closing");<a name="line.8500"></a>
-<span class="sourceLineNo">8501</span>    }<a name="line.8501"></a>
-<span class="sourceLineNo">8502</span>    if (writeLockNeeded) lock(lock.writeLock());<a name="line.8502"></a>
-<span class="sourceLineNo">8503</span>    else lock(lock.readLock());<a name="line.8503"></a>
-<span class="sourceLineNo">8504</span>    if (this.closed.get()) {<a name="line.8504"></a>
-<span class="sourceLineNo">8505</span>      if (writeLockNeeded) lock.writeLock().unlock();<a name="line.8505"></a>
-<span class="sourceLineNo">8506</span>      else lock.readLock().unlock();<a name="line.8506"></a>
-<span class="sourceLineNo">8507</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closed");<a name="line.8507"></a>
-<span class="sourceLineNo">8508</span>    }<a name="line.8508"></a>
-<span class="sourceLineNo">8509</span>  }<a name="line.8509"></a>
-<span class="sourceLineNo">8510</span><a name="line.8510"></a>
-<span class="sourceLineNo">8511</span>  /**<a name="line.8511"></a>
-<span class="sourceLineNo">8512</span>   * Closes the lock. This needs to be called in the finally block corresponding<a name="line.8512"></a>
-<span class="sourceLineNo">8513</span>   * to the try block of #startRegionOperation<a name="line.8513"></a>
-<span class="sourceLineNo">8514</span>   */<a name="line.8514"></a>
-<span class="sourceLineNo">8515</span>  private void closeBulkRegionOperation(){<a name="line.8515"></a>
-<span class="sourceLineNo">8516</span>    if (lock.writeLock().isHeldByCurrentThread()) lock.writeLock().unlock();<a name="line.8516"></a>
-<span class="sourceLineNo">8517</span>    else lock.readLock().unlock();<a name="line.8517"></a>
-<span class="sourceLineNo">8518</span>  }<a name="line.8518"></a>
-<span class="sourceLineNo">8519</span><a name="line.8519"></a>
-<span class="sourceLineNo">8520</span>  /**<a name="line.8520"></a>
-<span class="sourceLineNo">8521</span>   * Update LongAdders for number of puts without wal and the size of possible data loss.<a name="line.8521"></a>
-<span class="sourceLineNo">8522</span>   * These information are exposed by the region server metrics.<a name="line.8522"></a>
-<span class="sourceLineNo">8523</span>   */<a name="line.8523"></a>
-<span class="sourceLineNo">8524</span>  private void recordMutationWithoutWal(final Map&lt;byte [], List&lt;Cell&gt;&gt; familyMap) {<a name="line.8524"></a>
-<span class="sourceLineNo">8525</span>    numMutationsWithoutWAL.increment();<a name="line.8525"></a>
-<span class="sourceLineNo">8526</span>    if (numMutationsWithoutWAL.sum() &lt;= 1) {<a name="line.8526"></a>
-<span class="sourceLineNo">8527</span>      LOG.info("writing data to region " + this +<a name="line.8527"></a>
-<span class="sourceLineNo">8528</span>               " with WAL disabled. Data may be lost in the event of a crash.");<a name="line.8528"></a>
-<span class="sourceLineNo">8529</span>    }<a name="line.8529"></a>
-<span class="sourceLineNo">8530</span><a name="line.8530"></a>
-<span class="sourceLineNo">8531</span>    long mutationSize = 0;<a name="line.8531"></a>
-<span class="sourceLineNo">8532</span>    for (List&lt;Cell&gt; cells: familyMap.values()) {<a name="line.8532"></a>
-<span class="sourceLineNo">8533</span>      // Optimization: 'foreach' loop is not used. See:<a name="line.8533"></a>
-<span class="sourceLineNo">8534</span>      // HBASE-12023 HRegion.applyFamilyMapToMemstore creates too many iterator objects<a name="line.8534"></a>
-<span class="sourceLineNo">8535</span>      assert cells instanceof RandomAccess;<a name="line.8535"></a>
-<span class="sourceLineNo">8536</span>      int listSize = cells.size();<a name="line.8536"></a>
-<span class="sourceLineNo">8537</span>      for (int i=0; i &lt; listSize; i++) {<a name="line.8537"></a>
-<span class="sourceLineNo">8538</span>        Cell cell = cells.get(i);<a name="line.8538"></a>
-<span class="sourceLineNo">8539</span>        mutationSize += cell.getSerializedSize();<a name="line.8539"></a>
-<span class="sourceLineNo">8540</span>      }<a name="line.8540"></a>
-<span class="sourceLineNo">8541</span>    }<a name="line.8541"></a>
-<span class="sourceLineNo">8542</span><a name="line.8542"></a>
-<span class="sourceLineNo">8543</span>    dataInMemoryWithoutWAL.add(mutationSize);<a name="line.8543"></a>
-<span class="sourceLineNo">8544</span>  }<a name="line.8544"></a>
-<span class="sourceLineNo">8545</span><a name="line.8545"></a>
-<span class="sourceLineNo">8546</span>  private void lock(final Lock lock) throws RegionTooBusyException, InterruptedIOException {<a name="line.8546"></a>
-<span class="sourceLineNo">8547</span>    lock(lock, 1);<a name="line.8547"></a>
-<span class="sourceLineNo">8548</span>  }<a name="line.8548"></a>
-<span class="sourceLineNo">8549</span><a name="line.8549"></a>
-<span class="sourceLineNo">8550</span>  /**<a name="line.8550"></a>
-<span class="sourceLineNo">8551</span>   * Try to acquire a lock.  Throw RegionTooBusyException<a name="line.8551"></a>
-<span class="sourceLineNo">8552</span>   * if failed to get the lock in time. Throw InterruptedIOException<a name="line.8552"></a>
-<span class="sourceLineNo">8553</span>   * if interrupted while waiting for the lock.<a name="line.8553"></a>
-<span class="sourceLineNo">8554</span>   */<a name="line.8554"></a>
-<span class="sourceLineNo">8555</span>  private void lock(final Lock lock, final int multiplier)<a name="line.8555"></a>
-<span class="sourceLineNo">8556</span>      throws RegionTooBusyException, InterruptedIOException {<a name="line.8556"></a>
-<span class="sourceLineNo">8557</span>    try {<a name="line.8557"></a>
-<span class="sourceLineNo">8558</span>      final long waitTime = Math.min(maxBusyWaitDuration,<a name="line.8558"></a>
-<span class="sourceLineNo">8559</span>          busyWaitDuration * Math.min(multiplier, maxBusyWaitMultiplier));<a name="line.8559"></a>
-<span class="sourceLineNo">8560</span>      if (!lock.tryLock(waitTime, TimeUnit.MILLISECONDS)) {<a name="line.8560"></a>
-<span class="sourceLineNo">8561</span>        // Don't print millis. Message is used as a key over in<a name="line.8561"></a>
-<span class="sourceLineNo">8562</span>        // RetriesExhaustedWithDetailsException processing.<a name="line.8562"></a>
-<span class="sourceLineNo">8563</span>        throw new RegionTooBusyException("Failed to obtain lock; regionName=" +<a name="line.8563"></a>
-<span class="sourceLineNo">8564</span>            (this.getRegionInfo() == null? "unknown":<a name="line.8564"></a>
-<span class="sourceLineNo">8565</span>                this.getRegionInfo().getRegionNameAsString()) +<a name="line.8565"></a>
-<span class="sourceLineNo">8566</span>            ", server=" + (this.getRegionServerServices() == null? "unknown":<a name="line.8566"></a>
-<span class="sourceLineNo">8567</span>                this.getRegionServerServices().getServerName()));<a name="line.8567"></a>
-<span class="sourceLineNo">8568</span>      }<a name="line.8568"></a>
-<span class="sourceLineNo">8569</span>    } catch (InterruptedException ie) {<a name="line.8569"></a>
-<span class="sourceLineNo">8570</span>      LOG.info("Interrupted while waiting for a lock");<a name="line.8570"></a>
-<span class="sourceLineNo">8571</span>      InterruptedIOException iie = new InterruptedIOException();<a name="line.8571"></a>
-<span class="sourceLineNo">8572</span>      iie.initCause(ie);<a name="line.8572"></a>
-<span class="sourceLineNo">8573</span>      throw iie;<a name="line.8573"></a>
-<span class="sourceLineNo">8574</span>    }<a name="line.8574"></a>
-<span class="sourceLineNo">8575</span>  }<a name="line.8575"></a>
-<span class="sourceLineNo">8576</span><a name="line.8576"></a>
-<span class="sourceLineNo">8577</span>  /**<a name="line.8577"></a>
-<span class="sourceLineNo">8578</span>   * Calls sync with the given transaction ID<a name="line.8578"></a>
-<span class="sourceLineNo">8579</span>   * @param txid should sync up to which transaction<a name="line.8579"></a>
-<span class="sourceLineNo">8580</span>   * @throws IOException If anything goes wrong with DFS<a name="line.8580"></a>
-<span class="sourceLineNo">8581</span>   */<a name="line.8581"></a>
-<span class="sourceLineNo">8582</span>  private void sync(long txid, Durability durability) throws IOException {<a name="line.8582"></a>
-<span class="sourceLineNo">8583</span>    if (this.getRegionInfo().isMetaRegion()) {<a name="line.8583"></a>
-<span class="sourceLineNo">8584</span>      this.wal.sync(txid);<a name="line.8584"></a>
-<span class="sourceLineNo">8585</span>    } else {<a name="line.8585"></a>
-<span class="sourceLineNo">8586</span>      switch(durability) {<a name="line.8586"></a>
-<span class="sourceLineNo">8587</span>      case USE_DEFAULT:<a name="line.8587"></a>
-<span class="sourceLineNo">8588</span>        // do what table defaults to<a name="line.8588"></a>
-<span class="sourceLineNo">8589</span>        if (shouldSyncWAL()) {<a name="line.8589"></a>
-<span class="sourceLineNo">8590</span>          this.wal.sync(txid);<a name="line.8590"></a>
-<span class="sourceLineNo">8591</span>        }<a name="line.8591"></a>
-<span class="sourceLineNo">8592</span>        break;<a name="line.8592"></a>
-<span class="sourceLineNo">8593</span>      case SKIP_WAL:<a name="line.8593"></a>
-<span class="sourceLineNo">8594</span>        // nothing do to<a name="line.8594"></a>
-<span class="sourceLineNo">8595</span>        break;<a name="line.8595"></a>
-<span class="sourceLineNo">8596</span>      case ASYNC_WAL:<a name="line.8596"></a>
-<span class="sourceLineNo">8597</span>        // nothing do to<a name="line.8597"></a>
-<span class="sourceLineNo">8598</span>        break;<a name="line.8598"></a>
-<span class="sourceLineNo">8599</span>      case SYNC_WAL:<a name="line.8599"></a>
-<span class="sourceLineNo">8600</span>          this.wal.sync(txid, false);<a name="line.8600"></a>
-<span class="sourceLineNo">8601</span>          break;<a name="line.8601"></a>
-<span class="sourceLineNo">8602</span>      case FSYNC_WAL:<a name="line.8602"></a>
-<span class="sourceLineNo">8603</span>          this.wal.sync(txid, true);<a name="line.8603"></a>
-<span class="sourceLineNo">8604</span>          break;<a name="line.8604"></a>
-<span class="sourceLineNo">8605</span>      default:<a name="line.8605"></a>
-<span class="sourceLineNo">8606</span>        throw new RuntimeException("Unknown durability " + durability);<a name="line.8606"></a>
-<span class="sourceLineNo">8607</span>      }<a name="line.8607"></a>
-<span class="sourceLineNo">8608</span>    }<a name="line.8608"></a>
-<span class="sourceLineNo">8609</span>  }<a name="line.8609"></a>
-<span class="sourceLineNo">8610</span><a name="line.8610"></a>
-<span class="sourceLineNo">8611</span>  /**<a name="line.8611"></a>
-<span class="sourceLineNo">8612</span>   * Check whether we should sync the wal from the table's durability settings<a name="line.8612"></a>
-<span class="sourceLineNo">8613</span>   */<a name="line.8613"></a>
-<span class="sourceLineNo">8614</span>  private boolean shouldSyncWAL() {<a name="line.8614"></a>
-<span class="sourceLineNo">8615</span>    return regionDurability.ordinal() &gt;  Durability.ASYNC_WAL.ordinal();<a name="line.8615"></a>
-<span class="sourceLineNo">8616</span>  }<a name="line.8616"></a>
-<span class="sourceLineNo">8617</span><a name="line.8617"></a>
-<span class="sourceLineNo">8618</span>  /**<a name="line.8618"></a>
-<span class="sourceLineNo">8619</span>   * A mocked list implementation - discards all updates.<a name="line.8619"></a>
-<span class="sourceLineNo">8620</span>   */<a name="line.8620"></a>
-<span class="sourceLineNo">8621</span>  private static final List&lt;Cell&gt; MOCKED_LIST = new AbstractList&lt;Cell&gt;() {<a name="line.8621"></a>
+<span class="sourceLineNo">8478</span>  public void closeRegionOperation() throws IOException {<a name="line.8478"></a>
+<span class="sourceLineNo">8479</span>    closeRegionOperation(Operation.ANY);<a name="line.8479"></a>
+<span class="sourceLineNo">8480</span>  }<a name="line.8480"></a>
+<span class="sourceLineNo">8481</span><a name="line.8481"></a>
+<span class="sourceLineNo">8482</span>  @Override<a name="line.8482"></a>
+<span class="sourceLineNo">8483</span>  public void closeRegionOperation(Operation operation) throws IOException {<a name="line.8483"></a>
+<span class="sourceLineNo">8484</span>    if (operation == Operation.SNAPSHOT) {<a name="line.8484"></a>
+<span class="sourceLineNo">8485</span>      stores.values().forEach(HStore::postSnapshotOperation);<a name="line.8485"></a>
+<span class="sourceLineNo">8486</span>    }<a name="line.8486"></a>
+<span class="sourceLineNo">8487</span>    lock.readLock().unlock();<a name="line.8487"></a>
+<span class="sourceLineNo">8488</span>    if (coprocessorHost != null) {<a name="line.8488"></a>
+<span class="sourceLineNo">8489</span>      coprocessorHost.postCloseRegionOperation(operation);<a name="line.8489"></a>
+<span class="sourceLineNo">8490</span>    }<a name="line.8490"></a>
+<span class="sourceLineNo">8491</span>  }<a name="line.8491"></a>
+<span class="sourceLineNo">8492</span><a name="line.8492"></a>
+<span class="sourceLineNo">8493</span>  /**<a name="line.8493"></a>
+<span class="sourceLineNo">8494</span>   * This method needs to be called before any public call that reads or<a name="line.8494"></a>
+<span class="sourceLineNo">8495</span>   * modifies stores in bulk. It has to be called just before a try.<a name="line.8495"></a>
+<span class="sourceLineNo">8496</span>   * #closeBulkRegionOperation needs to be called in the try's finally block<a name="line.8496"></a>
+<span class="sourceLineNo">8497</span>   * Acquires a writelock and checks if the region is closing or closed.<a name="line.8497"></a>
+<span class="sourceLineNo">8498</span>   * @throws NotServingRegionException when the region is closing or closed<a name="line.8498"></a>
+<span class="sourceLineNo">8499</span>   * @throws RegionTooBusyException if failed to get the lock in time<a name="line.8499"></a>
+<span class="sourceLineNo">8500</span>   * @throws InterruptedIOException if interrupted while waiting for a lock<a name="line.8500"></a>
+<span class="sourceLineNo">8501</span>   */<a name="line.8501"></a>
+<span class="sourceLineNo">8502</span>  private void startBulkRegionOperation(boolean writeLockNeeded)<a name="line.8502"></a>
+<span class="sourceLineNo">8503</span>      throws NotServingRegionException, RegionTooBusyException, InterruptedIOException {<a name="line.8503"></a>
+<span class="sourceLineNo">8504</span>    if (this.closing.get()) {<a name="line.8504"></a>
+<span class="sourceLineNo">8505</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closing");<a name="line.8505"></a>
+<span class="sourceLineNo">8506</span>    }<a name="line.8506"></a>
+<span class="sourceLineNo">8507</span>    if (writeLockNeeded) lock(lock.writeLock());<a name="line.8507"></a>
+<span class="sourceLineNo">8508</span>    else lock(lock.readLock());<a name="line.8508"></a>
+<span class="sourceLineNo">8509</span>    if (this.closed.get()) {<a name="line.8509"></a>
+<span class="sourceLineNo">8510</span>      if (writeLockNeeded) lock.writeLock().unlock();<a name="line.8510"></a>
+<span class="sourceLineNo">8511</span>      else lock.readLock().unlock();<a name="line.8511"></a>
+<span class="sourceLineNo">8512</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closed");<a name="line.8512"></a>
+<span class="sourceLineNo">8513</span>    }<a name="line.8513"></a>
+<span class="sourceLineNo">8514</span>  }<a name="line.8514"></a>
+<span class="sourceLineNo">8515</span><a name="line.8515"></a>
+<span class="sourceLineNo">8516</span>  /**<a name="line.8516"></a>
+<span class="sourceLineNo">8517</span>   * Closes the lock. This needs to be called in the finally block corresponding<a name="line.8517"></a>
+<span class="sourceLineNo">8518</span>   * to the try block of #startRegionOperation<a name="line.8518"></a>
+<span class="sourceLineNo">8519</span>   */<a name="line.8519"></a>
+<span class="sourceLineNo">8520</span>  private void closeBulkRegionOperation(){<a name="line.8520"></a>
+<span class="sourceLineNo">8521</span>    if (lock.writeLock().isHeldByCurrentThread()) lock.writeLock().unlock();<a name="line.8521"></a>
+<span class="sourceLineNo">8522</span>    else lock.readLock().unlock();<a name="line.8522"></a>
+<span class="sourceLineNo">8523</span>  }<a name="line.8523"></a>
+<span class="sourceLineNo">8524</span><a name="line.8524"></a>
+<span class="sourceLineNo">8525</span>  /**<a name="line.8525"></a>
+<span class="sourceLineNo">8526</span>   * Update LongAdders for number of puts without wal and the size of possible data loss.<a name="line.8526"></a>
+<span class="sourceLineNo">8527</span>   * These information are exposed by the region server metrics.<a name="line.8527"></a>
+<span class="sourceLineNo">8528</span>   */<a name="line.8528"></a>
+<span class="sourceLineNo">8529</span>  private void recordMutationWithoutWal(final Map&lt;byte [], List&lt;Cell&gt;&gt; familyMap) {<a name="line.8529"></a>
+<span class="sourceLineNo">8530</span>    numMutationsWithoutWAL.increment();<a name="line.8530"></a>
+<span class="sourceLineNo">8531</span>    if (numMutationsWithoutWAL.sum() &lt;= 1) {<a name="line.8531"></a>
+<span class="sourceLineNo">8532</span>      LOG.info("writing data to region " + this +<a name="line.8532"></a>
+<span class="sourceLineNo">8533</span>               " with WAL disabled. Data may be lost in the event of a crash.");<a name="line.8533"></a>
+<span class="sourceLineNo">8534</span>    }<a name="line.8534"></a>
+<span class="sourceLineNo">8535</span><a name="line.8535"></a>
+<span class="sourceLineNo">8536</span>    long mutationSize = 0;<a name="line.8536"></a>
+<span class="sourceLineNo">8537</span>    for (List&lt;Cell&gt; cells: familyMap.values()) {<a name="line.8537"></a>
+<span class="sourceLineNo">8538</span>      // Optimization: 'foreach' loop is not used. See:<a name="line.8538"></a>
+<span class="sourceLineNo">8539</span>      // HBASE-12023 HRegion.applyFamilyMapToMemstore creates too many iterator objects<a name="line.8539"></a>
+<span class="sourceLineNo">8540</span>      assert cells instanceof RandomAccess;<a name="line.8540"></a>
+<span class="sourceLineNo">8541</span>      int listSize = cells.size();<a name="line.8541"></a>
+<span class="sourceLineNo">8542</span>      for (int i=0; i &lt; listSize; i++) {<a name="line.8542"></a>
+<span class="sourceLineNo">8543</span>        Cell cell = cells.get(i);<a name="line.8543"></a>
+<span class="sourceLineNo">8544</span>        mutationSize += cell.getSerializedSize();<a name="line.8544"></a>
+<span class="sourceLineNo">8545</span>      }<a name="line.8545"></a>
+<span class="sourceLineNo">8546</span>    }<a name="line.8546"></a>
+<span class="sourceLineNo">8547</span><a name="line.8547"></a>
+<span class="sourceLineNo">8548</span>    dataInMemoryWithoutWAL.add(mutationSize);<a name="line.8548"></a>
+<span class="sourceLineNo">8549</span>  }<a name="line.8549"></a>
+<span class="sourceLineNo">8550</span><a name="line.8550"></a>
+<span class="sourceLineNo">8551</span>  private void lock(final Lock lock) throws RegionTooBusyException, InterruptedIOException {<a name="line.8551"></a>
+<span class="sourceLineNo">8552</span>    lock(lock, 1);<a name="line.8552"></a>
+<span class="sourceLineNo">8553</span>  }<a name="line.8553"></a>
+<span class="sourceLineNo">8554</span><a name="line.8554"></a>
+<span class="sourceLineNo">8555</span>  /**<a name="line.8555"></a>
+<span class="sourceLineNo">8556</span>   * Try to acquire a lock.  Throw RegionTooBusyException<a name="line.8556"></a>
+<span class="sourceLineNo">8557</span>   * if failed to get the lock in time. Throw InterruptedIOException<a name="line.8557"></a>
+<span class="sourceLineNo">8558</span>   * if interrupted while waiting for the lock.<a name="line.8558"></a>
+<span class="sourceLineNo">8559</span>   */<a name="line.8559"></a>
+<span class="sourceLineNo">8560</span>  private void lock(final Lock lock, final int multiplier)<a name="line.8560"></a>
+<span class="sourceLineNo">8561</span>      throws RegionTooBusyException, InterruptedIOException {<a name="line.8561"></a>
+<span class="sourceLineNo">8562</span>    try {<a name="line.8562"></a>
+<span class="sourceLineNo">8563</span>      final long waitTime = Math.min(maxBusyWaitDuration,<a name="line.8563"></a>
+<span class="sourceLineNo">8564</span>          busyWaitDuration * Math.min(multiplier, maxBusyWaitMultiplier));<a name="line.8564"></a>
+<span class="sourceLineNo">8565</span>      if (!lock.tryLock(waitTime, TimeUnit.MILLISECONDS)) {<a name="line.8565"></a>
+<span class="sourceLineNo">8566</span>        // Don't print millis. Message is used as a key over in<a name="line.8566"></a>
+<span class="sourceLineNo">8567</span>        // RetriesExhaustedWithDetailsException processing.<a name="line.8567"></a>
+<span class="sourceLineNo">8568</span>        throw new RegionTooBusyException("Failed to obtain lock; regionName=" +<a name="line.8568"></a>
+<span class="sourceLineNo">8569</span>            (this.getRegionInfo() == null? "unknown":<a name="line.8569"></a>
+<span class="sourceLineNo">8570</span>                this.getRegionInfo().getRegionNameAsString()) +<a name="line.8570"></a>
+<span class="sourceLineNo">8571</span>            ", server=" + (this.getRegionServerServices() == null? "unknown":<a name="line.8571"></a>
+<span class="sourceLineNo">8572</span>                this.getRegionServerServices().getServerName()));<a name="line.8572"></a>
+<span class="sourceLineNo">8573</span>      }<a name="line.8573"></a>
+<span class="sourceLineNo">8574</span>    } catch (InterruptedException ie) {<a name="line.8574"></a>
+<span class="sourceLineNo">8575</span>      LOG.info("Interrupted while waiting for a lock");<a name="line.8575"></a>
+<span class="sourceLineNo">8576</span>      InterruptedIOException iie = new InterruptedIOException();<a name="line.8576"></a>
+<span class="sourceLineNo">8577</span>      iie.initCause(ie);<a name="line.8577"></a>
+<span class="sourceLineNo">8578</span>      throw iie;<a name="line.8578"></a>
+<span class="sourceLineNo">8579</span>    }<a name="line.8579"></a>
+<span class="sourceLineNo">8580</span>  }<a name="line.8580"></a>
+<span class="sourceLineNo">8581</span><a name="line.8581"></a>
+<span class="sourceLineNo">8582</span>  /**<a name="line.8582"></a>
+<span class="sourceLineNo">8583</span>   * Calls sync with the given transaction ID<a name="line.8583"></a>
+<span class="sourceLineNo">8584</span>   * @param txid should sync up to which transaction<a name="line.8584"></a>
+<span class="sourceLineNo">8585</span>   * @throws IOException If anything goes wrong with DFS<a name="line.8585"></a>
+<span class="sourceLineNo">8586</span>   */<a name="line.8586"></a>
+<span class="sourceLineNo">8587</span>  private void sync(long txid, Durability durability) throws IOException {<a name="line.8587"></a>
+<span class="sourceLineNo">8588</span>    if (this.getRegionInfo().isMetaRegion()) {<a name="line.8588"></a>
+<span class="sourceLineNo">8589</span>      this.wal.sync(txid);<a name="line.8589"></a>
+<span class="sourceLineNo">8590</span>    } else {<a name="line.8590"></a>
+<span class="sourceLineNo">8591</span>      switch(durability) {<a name="line.8591"></a>
+<span class="sourceLineNo">8592</span>      case USE_DEFAULT:<a name="line.8592"></a>
+<span class="sourceLineNo">8593</span>        // do what table defaults to<a name="line.8593"></a>
+<span class="sourceLineNo">8594</span>        if (shouldSyncWAL()) {<a name="line.8594"></a>
+<span class="sourceLineNo">8595</span>          this.wal.sync(txid);<a name="line.8595"></a>
+<span class="sourceLineNo">8596</span>        }<a name="line.8596"></a>
+<span class="sourceLineNo">8597</span>        break;<a name="line.8597"></a>
+<span class="sourceLineNo">8598</span>      case SKIP_WAL:<a name="line.8598"></a>
+<span class="sourceLineNo">8599</span>        // nothing do to<a name="line.8599"></a>
+<span class="sourceLineNo">8600</span>        break;<a name="line.8600"></a>
+<span class="sourceLineNo">8601</span>      case ASYNC_WAL:<a name="line.8601"></a>
+<span class="sourceLineNo">8602</span>        // nothing do to<a name="line.8602"></a>
+<span class="sourceLineNo">8603</span>        break;<a name="line.8603"></a>
+<span class="sourceLineNo">8604</span>      case SYNC_WAL:<a name="line.8604"></a>
+<span class="sourceLineNo">8605</span>          this.wal.sync(txid, false);<a name="line.8605"></a>
+<span class="sourceLineNo">8606</span>          break;<a name="line.8606"></a>
+<span class="sourceLineNo">8607</span>      case FSYNC_WAL:<a name="line.8607"></a>
+<span class="sourceLineNo">8608</span>          this.wal.sync(txid, true);<a name="line.8608"></a>
+<span class="sourceLineNo">8609</span>          break;<a name="line.8609"></a>
+<span class="sourceLineNo">8610</span>      default:<a name="line.8610"></a>
+<span class="sourceLineNo">8611</span>        throw new RuntimeException("Unknown durability " + durability);<a name="line.8611"></a>
+<span class="sourceLineNo">8612</span>      }<a name="line.8612"></a>
+<span class="sourceLineNo">8613</span>    }<a name="line.8613"></a>
+<span class="sourceLineNo">8614</span>  }<a name="line.8614"></a>
+<span class="sourceLineNo">8615</span><a name="line.8615"></a>
+<span class="sourceLineNo">8616</span>  /**<a name="line.8616"></a>
+<span class="sourceLineNo">8617</span>   * Check whether we should sync the wal from the table's durability settings<a name="line.8617"></a>
+<span class="sourceLineNo">8618</span>   */<a name="line.8618"></a>
+<span class="sourceLineNo">8619</span>  private boolean shouldSyncWAL() {<a name="line.8619"></a>
+<span class="sourceLineNo">8620</span>    return regionDurability.ordinal() &gt;  Durability.ASYNC_WAL.ordinal();<a name="line.8620"></a>
+<span class="sourceLineNo">8621</span>  }<a name="line.8621"></a>
 <span class="sourceLineNo">8622</span><a name="line.8622"></a>
-<span class="sourceLineNo">8623</span>    @Override<a name="line.8623"></a>
-<span class="sourceLineNo">8624</span>    public void add(int index, Cell element) {<a name="line.8624"></a>
-<span class="sourceLineNo">8625</span>      // do nothing<a name="line.8625"></a>
-<span class="sourceLineNo">8626</span>    }<a name="line.8626"></a>
+<span class="sourceLineNo">8623</span>  /**<a name="line.8623"></a>
+<span class="sourceLineNo">8624</span>   * A mocked list implementation - discards all updates.<a name="line.8624"></a>
+<span class="sourceLineNo">8625</span>   */<a name="line.8625"></a>
+<span class="sourceLineNo">8626</span>  private static final List&lt;Cell&gt; MOCKED_LIST = new AbstractList&lt;Cell&gt;() {<a name="line.8626"></a>
 <span class="sourceLineNo">8627</span><a name="line.8627"></a>
 <span class="sourceLineNo">8628</span>    @Override<a name="line.8628"></a>
-<span class="sourceLineNo">8629</span>    public boolean addAll(int index, Collection&lt;? extends Cell&gt; c) {<a name="line.8629"></a>
-<span class="sourceLineNo">8630</span>      return false; // this list is never changed as a result of an update<a name="line.8630"></a>
+<span class="sourceLineNo">8629</span>    public void add(int index, Cell element) {<a name="line.8629"></a>
+<span class="sourceLineNo">8630</span>      // do nothing<a name="line.8630"></a>
 <span class="sourceLineNo">8631</span>    }<a name="line.8631"></a>
 <span class="sourceLineNo">8632</span><a name="line.8632"></a>
 <span class="sourceLineNo">8633</span>    @Override<a name="line.8633"></a>
-<span class="sourceLineNo">8634</span>    public KeyValue get(int index) {<a name="line.8634"></a>
-<span class="sourceLineNo">8635</span>      throw new UnsupportedOperationException();<a name="line.8635"></a>
+<span class="sourceLineNo">8634</span>    public boolean addAll(int index, Collection&lt;? extends Cell&gt; c) {<a name="line.8634"></a>
+<span class="sourceLineNo">8635</span>      return false; // this list is never changed as a result of an update<a name="line.8635"></a>
 <span class="sourceLineNo">8636</span>    }<a name="line.8636"></a>
 <span class="sourceLineNo">8637</span><a name="line.8637"></a>
 <span class="sourceLineNo">8638</span>    @Override<a name="line.8638"></a>
-<span class="sourceLineNo">8639</span>    public int size() {<a name="line.8639"></a>
-<span class="sourceLineNo">8640</span>      return 0;<a name="line.8640"></a>
+<span class="sourceLineNo">8639</span>    public KeyValue get(int index) {<a name="line.8639"></a>
+<span class="sourceLineNo">8640</span>      throw new UnsupportedOperationException();<a name="line.8640"></a>
 <span class="sourceLineNo">8641</span>    }<a name="line.8641"></a>
-<span class="sourceLineNo">8642</span>  };<a name="line.8642"></a>
-<span class="sourceLineNo">8643</span><a name="line.8643"></a>
-<span class="sourceLineNo">8644</span>  /** @return the latest sequence number that was read from storage when this region was opened */<a name="line.8644"></a>
-<span class="sourceLineNo">8645</span>  public long getOpenSeqNum() {<a name="line.8645"></a>
-<span class="sourceLineNo">8646</span>    return this.openSeqNum;<a name="line.8646"></a>
-<span class="sourceLineNo">8647</span>  }<a name="line.8647"></a>
+<span class="sourceLineNo">8642</span><a name="line.8642"></a>
+<span class="sourceLineNo">8643</span>    @Override<a name="line.8643"></a>
+<span class="sourceLineNo">8644</span>    public int size() {<a name="line.8644"></a>
+<span class="sourceLineNo">8645</span>      return 0;<a name="line.8645"></a>
+<span class="sourceLineNo">8646</span>    }<a name="line.8646"></a>
+<span class="sourceLineNo">8647</span>  };<a name="line.8647"></a>
 <span class="sourceLineNo">8648</span><a name="line.8648"></a>
-<span class="sourceLineNo">8649</span>  @Override<a name="line.8649"></a>
-<span class="sourceLineNo">8650</span>  public Map&lt;byte[], Long&gt; getMaxStoreSeqId() {<a name="line.8650"></a>
-<span class="sourceLineNo">8651</span>    return this.maxSeqIdInStores;<a name="line.8651"></a>
+<span class="sourceLineNo">8649</span>  /** @return the latest sequence number that was read from storage when this region was opened */<a name="line.8649"></a>
+<span class="sourceLineNo">8650</span>  public long getOpenSeqNum() {<a name="line.8650"></a>
+<span class="sourceLineNo">8651</span>    return this.openSeqNum;<a name="line.8651"></a>
 <span class="sourceLineNo">8652</span>  }<a name="line.8652"></a>
 <span class="sourceLineNo">8653</span><a name="line.8653"></a>
-<span class="sourceLineNo">8654</span>  public long getOldestSeqIdOfStore(byte[] familyName) {<a name="line.8654"></a>
-<span class="sourceLineNo">8655</span>    return wal.getEarliestMemStoreSeqNum(getRegionInfo().getEncodedNameAsBytes(), familyName);<a name="line.8655"></a>
-<span class="sourceLineNo">8656</span>  }<a name="line.8656"></a>
-<span class="sourceLineNo">8657</span><a name="line.8657"></a>
-<span class="sourceLineNo">8658</span>  @Override<a name="line.8658"></a>
-<span class="sourceLineNo">8659</span>  public CompactionState getCompactionState() {<a name="line.8659"></a>
-<span class="sourceLineNo">8660</span>    boolean hasMajor = majorInProgress.get() &gt; 0, hasMinor = minorInProgress.get() &gt; 0;<a name="line.8660"></a>
-<span class="sourceLineNo">8661</span>    return (hasMajor ? (hasMinor ? CompactionState.MAJOR_AND_MINOR : CompactionState.MAJOR)<a name="line.8661"></a>
-<span class="sourceLineNo">8662</span>        : (hasMinor ? CompactionState.MINOR : CompactionState.NONE));<a name="line.8662"></a>
-<span class="sourceLineNo">8663</span>  }<a name="line.8663"></a>
-<span class="sourceLineNo">8664</span><a name="line.8664"></a>
-<span class="sourceLineNo">8665</span>  public void reportCompactionRequestStart(boolean isMajor){<a name="line.8665"></a>
-<span class="sourceLineNo">8666</span>    (isMajor ? majorInProgress : minorInProgress).incrementAndGet();<a name="line.8666"></a>
-<span class="sourceLineNo">8667</span>  }<a name="line.8667"></a>
-<span class="sourceLineNo">8668</span><a name="line.8668"></a>
-<span class="sourceLineNo">8669</span>  public void reportCompactionRequestEnd(boolean isMajor, int numFiles, long filesSizeCompacted) {<a name="line.8669"></a>
-<span class="sourceLineNo">8670</span>    int newValue = (isMajor ? majorInProgress : minorInProgress).decrementAndGet();<a name="line.8670"></a>
-<span class="sourceLineNo">8671</span><a name="line.8671"></a>
-<span class="sourceLineNo">8672</span>    // metrics<a name="line.8672"></a>
-<span class="sourceLineNo">8673</span>    compactionsFinished.increment();<a name="line.8673"></a>
-<span class="sourceLineNo">8674</span>    compactionNumFilesCompacted.add(numFiles);<a name="line.8674"></a>
-<span class="sourceLineNo">8675</span>    compactionNumBytesCompacted.add(filesSizeCompacted);<a name="line.8675"></a>
+<span class="sourceLineNo">8654</span>  @Override<a name="line.8654"></a>
+<span class="sourceLineNo">8655</span>  public Map&lt;byte[], Long&gt; getMaxStoreSeqId() {<a name="line.8655"></a>
+<span class="sourceLineNo">8656</span>    return this.maxSeqIdInStores;<a name="line.8656"></a>
+<span class="sourceLineNo">8657</span>  }<a name="line.8657"></a>
+<span class="sourceLineNo">8658</span><a name="line.8658"></a>
+<span class="sourceLineNo">8659</span>  public long getOldestSeqIdOfStore(byte[] familyName) {<a name="line.8659"></a>
+<span class="sourceLineNo">8660</span>    return wal.getEarliestMemStoreSeqNum(getRegionInfo().getEncodedNameAsBytes(), familyName);<a name="line.8660"></a>
+<span class="sourceLineNo">8661</span>  }<a name="line.8661"></a>
+<span class="sourceLineNo">8662</span><a name="line.8662"></a>
+<span class="sourceLineNo">8663</span>  @Override<a name="line.8663"></a>
+<span class="sourceLineNo">8664</span>  public CompactionState getCompactionState() {<a name="line.8664"></a>
+<span class="sourceLineNo">8665</span>    boolean hasMajor = majorInProgress.get() &gt; 0, hasMinor = minorInProgress.get() &gt; 0;<a name="line.8665"></a>
+<span class="sourceLineNo">8666</span>    return (hasMajor ? (hasMinor ? CompactionState.MAJOR_AND_MINOR : CompactionState.MAJOR)<a name="line.8666"></a>
+<span class="sourceLineNo">8667</span>        : (hasMinor ? CompactionState.MINOR : CompactionState.NONE));<a name="line.8667"></a>
+<span class="sourceLineNo">8668</span>  }<a name="line.8668"></a>
+<span class="sourceLineNo">8669</span><a name="line.8669"></a>
+<span class="sourceLineNo">8670</span>  public void reportCompactionRequestStart(boolean isMajor){<a name="line.8670"></a>
+<span class="sourceLineNo">8671</span>    (isMajor ? majorInProgress : minorInProgress).incrementAndGet();<a name="line.8671"></a>
+<span class="sourceLineNo">8672</span>  }<a name="line.8672"></a>
+<span class="sourceLineNo">8673</span><a name="line.8673"></a>
+<span class="sourceLineNo">8674</span>  public void reportCompactionRequestEnd(boolean isMajor, int numFiles, long filesSizeCompacted) {<a name="line.8674"></a>
+<span class="sourceLineNo">8675</span>    int newValue = (isMajor ? majorInProgress : minorInProgress).decrementAndGet();<a name="line.8675"></a>
 <span class="sourceLineNo">8676</span><a name="line.8676"></a>
-<span class="sourceLineNo">8677</span>    assert newValue &gt;= 0;<a name="line.8677"></a>
-<span class="sourceLineNo">8678</span>  }<a name="line.8678"></a>
-<span class="sourceLineNo">8679</span><a name="line.8679"></a>
-<span class="sourceLineNo">8680</span>  public void reportCompactionRequestFailure() {<a name="line.8680"></a>
-<span class="sourceLineNo">8681</span>    compactionsFailed.increment();<a name="line.8681"></a>
-<span class="sourceLineNo">8682</span>  }<a name="line.8682"></a>
-<span class="sourceLineNo">8683</span><a name="line.8683"></a>
-<span class="sourceLineNo">8684</span>  public void incrementCompactionsQueuedCount() {<a name="line.8684"></a>
-<span class="sourceLineNo">8685</span>    compactionsQueued.increment();<a name="line.8685"></a>
-<span class="sourceLineNo">8686</span>  }<a name="line.8686"></a>
-<span class="sourceLineNo">8687</span><a name="line.8687"></a>
-<span class="sourceLineNo">8688</span>  public void decrementCompactionsQueuedCount() {<a name="line.8688"></a>
-<span class="sourceLineNo">8689</span>    compactionsQueued.decrement();<a name="line.8689"></a>
-<span class="sourceLineNo">8690</span>  }<a name="line.8690"></a>
-<span class="sourceLineNo">8691</span><a name="line.8691"></a>
-<span class="sourceLineNo">8692</span>  public void incrementFlushesQueuedCount() {<a name="line.8692"></a>
-<span class="sourceLineNo">8693</span>    flushesQueued.increment();<a name="line.8693"></a>
-<span class="sourceLineNo">8694</span>  }<a name="line.8694"></a>
-<span class="sourceLineNo">8695</span><a name="line.8695"></a>
-<span class="sourceLineNo">8696</span>  @VisibleForTesting<a name="line.8696"></a>
-<span class="sourceLineNo">8697</span>  public long getReadPoint() {<a name="line.8697"></a>
-<span class="sourceLineNo">8698</span>    return getReadPoint(IsolationLevel.READ_COMMITTED);<a name="line.8698"></a>
+<span class="sourceLineNo">8677</span>    // metrics<a name="line.8677"></a>
+<span class="sourceLineNo">8678</span>    compactionsFinished.increment();<a name="line.8678"></a>
+<span class="sourceLineNo">8679</span>    compactionNumFilesCompacted.add(numFiles);<a name="line.8679"></a>
+<span class="sourceLineNo">8680</span>    compactionNumBytesCompacted.add(filesSizeCompacted);<a name="line.8680"></a>
+<span class="sourceLineNo">8681</span><a name="line.8681"></a>
+<span class="sourceLineNo">8682</span>    assert newValue &gt;= 0;<a name="line.8682"></a>
+<span class="sourceLineNo">8683</span>  }<a name="line.8683"></a>
+<span class="sourceLineNo">8684</span><a name="line.8684"></a>
+<span class="sourceLineNo">8685</span>  public void reportCompactionRequestFailure() {<a name="line.8685"></a>
+<span class="sourceLineNo">8686</span>    compactionsFailed.increment();<a name="line.8686"></a>
+<span class="sourceLineNo">8687</span>  }<a name="line.8687"></a>
+<span class="sourceLineNo">8688</span><a name="line.8688"></a>
+<span class="sourceLineNo">8689</span>  public void incrementCompactionsQueuedCount() {<a name="line.8689"></a>
+<span class="sourceLineNo">8690</span>    compactionsQueued.increment();<a name="line.8690"></a>
+<span class="sourceLineNo">8691</span>  }<a name="line.8691"></a>
+<span class="sourceLineNo">8692</span><a name="line.8692"></a>
+<span class="sourceLineNo">8693</span>  public void decrementCompactionsQueuedCount() {<a name="line.8693"></a>
+<span class="sourceLineNo">8694</span>    compactionsQueued.decrement();<a name="line.8694"></a>
+<span class="sourceLineNo">8695</span>  }<a name="line.8695"></a>
+<span class="sourceLineNo">8696</span><a name="line.8696"></a>
+<span class="sourceLineNo">8697</span>  public void incrementFlushesQueuedCount() {<a name="line.8697"></a>
+<span class="sourceLineNo">8698</span>    flushesQueued.increment();<a name="line.8698"></a>
 <span class="sourceLineNo">8699</span>  }<a name="line.8699"></a>
 <span class="sourceLineNo">8700</span><a name="line.8700"></a>
-<span class="sourceLineNo">8701</span>  /**<a name="line.8701"></a>
-<span class="sourceLineNo">8702</span>   * {@inheritDoc}<a name="line.8702"></a>
-<span class="sourceLineNo">8703</span>   */<a name="line.8703"></a>
-<span class="sourceLineNo">8704</span>  @Override<a name="line.8704"></a>
-<span class="sourceLineNo">8705</span>  public void onConfigurationChange(Configuration conf) {<a name="line.8705"></a>
-<span class="sourceLineNo">8706</span>    this.storeHotnessProtector.update(conf);<a name="line.8706"></a>
-<span class="sourceLineNo">8707</span>  }<a name="line.8707"></a>
-<span class="sourceLineNo">8708</span><a name="line.8708"></a>
-<span class="sourceLineNo">8709</span>  /**<a name="line.8709"></a>
-<span class="sourceLineNo">8710</span>   * {@inheritDoc}<a name="line.8710"></a>
-<span class="sourceLineNo">8711</span>   */<a name="line.8711"></a>
-<span class="sourceLineNo">8712</span>  @Override<a name="line.8712"></a>
-<span class="sourceLineNo">8713</span>  public void registerChildren(ConfigurationManager manager) {<a name="line.8713"></a>
-<span class="sourceLineNo">8714</span>    configurationManager = Optional.of(manager);<a name="line.8714"></a>
-<span class="sourceLineNo">8715</span>    stores.values().forEach(manager::registerObserver);<a name="line.8715"></a>
-<span class="sourceLineNo">8716</span>  }<a name="line.8716"></a>
-<span class="sourceLineNo">8717</span><a name="line.8717"></a>
-<span class="sourceLineNo">8718</span>  /**<a name="line.8718"></a>
-<span class="sourceLineNo">8719</span>   * {@inheritDoc}<a name="line.8719"></a>
-<span class="sourceLineNo">8720</span>   */<a name="line.8720"></a>
-<span class="sourceLineNo">8721</span>  @Override<a name="line.8721"></a>
-<span class="sourceLineNo">8722</span>  public void deregisterChildren(ConfigurationManager manager) {<a name="line.8722"></a>
-<span class="sourceLineNo">8723</span>    stores.values().forEach(configurationManager.get()::deregisterObserver);<a name="line.8723"></a>
-<span class="sourceLineNo">8724</span>  }<a name="line.8724"></a>
-<span class="sourceLineNo">8725</span><a name="line.8725"></a>
+<span class="sourceLineNo">8701</span>  @VisibleForTesting<a name="line.8701"></a>
+<span class="sourceLineNo">8702</span>  public long getReadPoint() {<a name="line.8702"></a>
+<span class="sourceLineNo">8703</span>    return getReadPoint(IsolationLevel.READ_COMMITTED);<a name="line.8703"></a>
+<span class="sourceLineNo">8704</span>  }<a name="line.8704"></a>
+<span class="sourceLineNo">8705</span><a name="line.8705"></a>
+<span class="sourceLineNo">8706</span>  /**<a name="line.8706"></a>
+<span class="sourceLineNo">8707</span>   * {@inheritDoc}<a name="line.8707"></a>
+<span class="sourceLineNo">8708</span>   */<a name="line.8708"></a>
+<span class="sourceLineNo">8709</span>  @Override<a name="line.8709"></a>
+<span class="sourceLineNo">8710</span>  public void onConfigurationChange(Configuration conf) {<a name="line.8710"></a>
+<span class="sourceLineNo">8711</span>    this.storeHotnessProtector.update(conf);<a name="line.8711"></a>
+<span class="sourceLineNo">8712</span>  }<a name="line.8712"></a>
+<span class="sourceLineNo">8713</span><a name="line.8713"></a>
+<span class="sourceLineNo">8714</span>  /**<a name="line.8714"></a>
+<span class="sourceLineNo">8715</span>   * {@inheritDoc}<a name="line.8715"></a>
+<span class="sourceLineNo">8716</span>   */<a name="line.8716"></a>
+<span class="sourceLineNo">8717</span>  @Override<a name="line.8717"></a>
+<span class="sourceLineNo">8718</span>  public void registerChildren(ConfigurationManager manager) {<a name="line.8718"></a>
+<span class="sourceLineNo">8719</span>    configurationManager = Optional.of(manager);<a name="line.8719"></a>
+<span class="sourceLineNo">8720</span>    stores.values().forEach(manager::registerObserver);<a name="line.8720"></a>
+<span class="sourceLineNo">8721</span>  }<a name="line.8721"></a>
+<span class="sourceLineNo">8722</span><a name="line.8722"></a>
+<span class="sourceLineNo">8723</span>  /**<a name="line.8723"></a>
+<span class="sourceLineNo">8724</span>   * {@inheritDoc}<a name="line.8724"></a>
+<span class="sourceLineNo">8725</span>   */<a name="line.8725"></a>
 <span class="sourceLineNo">8726</span>  @Override<a name="line.8726"></a>
-<span class="sourceLineNo">8727</span>  public CellComparator getCellComparator() {<a name="line.8727"></a>
-<span class="sourceLineNo">8728</span>    return this.getRegionInfo().isMetaRegion() ? CellComparatorImpl.META_COMPARATOR<a name="line.8728"></a>
-<span class="sourceLineNo">8729</span>        : CellComparatorImpl.COMPARATOR;<a name="line.8729"></a>
-<span class="sourceLineNo">8730</span>  }<a name="line.8730"></a>
-<span class="sourceLineNo">8731</span><a name="line.8731"></a>
-<span class="sourceLineNo">8732</span>  public long getMemStoreFlushSize() {<a name="line.8732"></a>
-<span class="sourceLineNo">8733</span>    return this.memstoreFlushSize;<a name="line.8733"></a>
-<span class="sourceLineNo">8734</span>  }<a name="line.8734"></a>
-<span class="sourceLineNo">8735</span><a name="line.8735"></a>
+<span class="sourceLineNo">8727</span>  public void deregisterChildren(ConfigurationManager manager) {<a name="line.8727"></a>
+<span class="sourceLineNo">8728</span>    stores.values().forEach(configurationManager.get()::deregisterObserver);<a name="line.8728"></a>
+<span class="sourceLineNo">8729</span>  }<a name="line.8729"></a>
+<span class="sourceLineNo">8730</span><a name="line.8730"></a>
+<span class="sourceLineNo">8731</span>  @Override<a name="line.8731"></a>
+<span class="sourceLineNo">8732</span>  public CellComparator getCellComparator() {<a name="line.8732"></a>
+<span class="sourceLineNo">8733</span>    return this.getRegionInfo().isMetaRegion() ? CellComparatorImpl.META_COMPARATOR<a name="line.8733"></a>
+<span class="sourceLineNo">8734</span>        : CellComparatorImpl.COMPARATOR;<a name="line.8734"></a>
+<span class="sourceLineNo">8735</span>  }<a name="line.8735"></a>
 <span class="sourceLineNo">8736</span><a name="line.8736"></a>
-<span class="sourceLineNo">8737</span>  //// method for debugging tests<a name="line.8737"></a>
-<span class="sourceLineNo">8738</span>  void throwException(String title, String regionName) {<a name="line.8738"></a>
-<span class="sourceLineNo">8739</span>    StringBuilder buf = new StringBuilder();<a name="line.8739"></a>
-<span class="sourceLineNo">8740</span>    buf.append(title + ", ");<a name="line.8740"></a>
-<span class="sourceLineNo">8741</span>    buf.append(getRegionInfo().toString());<a name="line.8741"></a>
-<span class="sourceLineNo">8742</span>    buf.append(getRegionInfo().isMetaRegion() ? " meta region " : " ");<a name="line.8742"></a>
-<span class="sourceLineNo">8743</span>    buf.append("stores: ");<a name="line.8743"></a>
-<span class="sourceLineNo">8744</span>    for (HStore s : stores.values()) {<a name="line.8744"></a>
-<span class="sourceLineNo">8745</span>      buf.append(s.getColumnFamilyDescriptor().getNameAsString());<a name="line.8745"></a>
-<span class="sourceLineNo">8746</span>      buf.append(" size: ");<a name="line.8746"></a>
-<span class="sourceLineNo">8747</span>      buf.append(s.getMemStoreSize().getDataSize());<a name="line.8747"></a>
-<span class="sourceLineNo">8748</span>      buf.append(" ");<a name="line.8748"></a>
-<span class="sourceLineNo">8749</span>    }<a name="line.8749"></a>
-<span class="sourceLineNo">8750</span>    buf.append("end-of-stores");<a name="line.8750"></a>
-<span class="sourceLineNo">8751</span>    buf.append(", memstore size ");<a name="line.8751"></a>
-<span class="sourceLineNo">8752</span>    buf.append(getMemStoreDataSize());<a name="line.8752"></a>
-<span class="sourceLineNo">8753</span>    if (getRegionInfo().getRegionNameAsString().startsWith(regionName)) {<a name="line.8753"></a>
-<span class="sourceLineNo">8754</span>      throw new RuntimeException(buf.toString());<a name="line.8754"></a>
-<span class="sourceLineNo">8755</span>    }<a name="line.8755"></a>
-<span class="sourceLineNo">8756</span>  }<a name="line.8756"></a>
-<span class="sourceLineNo">8757</span><a name="line.8757"></a>
-<span class="sourceLineNo">8758</span>  @Override<a name="line.8758"></a>
-<span class="sourceLineNo">8759</span>  public void requestCompaction(String why, int priority, boolean major,<a name="line.8759"></a>
-<span class="sourceLineNo">8760</span>      CompactionLifeCycleTracker tracker) throws IOException {<a name="line.8760"></a>
-<span class="sourceLineNo">8761</span>    if (major) {<a name="line.8761"></a>
-<span class="sourceLineNo">8762</span>      stores.values().forEach(HStore::triggerMajorCompaction);<a name="line.8762"></a>
-<span class="sourceLineNo">8763</span>    }<a name="line.8763"></a>
-<span class="sourceLineNo">8764</span>    rsServices.getCompactionRequestor().requestCompaction(this, why, priority, tracker,<a name="line.8764"></a>
-<span class="sourceLineNo">8765</span>        RpcServer.getRequestUser().orElse(null));<a name="line.8765"></a>
-<span class="sourceLineNo">8766</span>  }<a name="line.8766"></a>
-<span class="sourceLineNo">8767</span><a name="line.8767"></a>
-<span class="sourceLineNo">8768</span>  @Override<a name="line.8768"></a>
-<span class="sourceLineNo">8769</span>  public void requestCompaction(byte[] family, String why, int priority, boolean major,<a name="line.8769"></a>
-<span class="sourceLineNo">8770</span>      CompactionLifeCycleTracker tracker) throws IOException {<a name="line.8770"></a>
-<span class="sourceLineNo">8771</span>    HStore store = stores.get(family);<a name="line.8771"></a>
-<span class="sourceLineNo">8772</span>    if (store == null) {<a name="line.8772"></a>
-<span class="sourceLineNo">8773</span>      throw new NoSuchColumnFamilyException("column family " + Bytes.toString(family) +<a name="line.8773"></a>
-<span class="sourceLineNo">8774</span>          " does not exist in region " + getRegionInfo().getRegionNameAsString());<a name="line.8774"></a>
-<span class="sourceLineNo">8775</span>    }<a name="line.8775"></a>
-<span class="sourceLineNo">8776</span>    if (major) {<a name="line.8776"></a>
-<span class="sourceLineNo">8777</span>      store.triggerMajorCompaction();<a name="line.8777"></a>
-<span class="sourceLineNo">8778</span>    }<a name="line.8778"></a>
-<span class="sourceLineNo">8779</span>    rsServices.getCompactionRequestor().requestCompaction(this, store, why, priority, tracker,<a name="line.8779"></a>
-<span class="sourceLineNo">8780</span>        RpcServer.getRequestUser().orElse(null));<a name="line.8780"></a>
-<span class="sourceLineNo">8781</span>  }<a name="line.8781"></a>
-<span class="sourceLineNo">8782</span><a name="line.8782"></a>
-<span class="sourceLineNo">8783</span>  private void requestFlushIfNeeded() throws RegionTooBusyException {<a name="line.8783"></a>
-<span class="sourceLineNo">8784</span>    if(isFlushSize(this.memStoreSizing.getMemStoreSize())) {<a name="line.8784"></a>
-<span class="sourceLineNo">8785</span>      requestFlush();<a name="line.8785"></a>
-<span class="sourceLineNo">8786</span>    }<a name="line.8786"></a>
-<span class="sourceLineNo">8787</span>  }<a name="line.8787"></a>
-<span class="sourceLineNo">8788</span><a name="line.8788"></a>
-<span class="sourceLineNo">8789</span>  private void requestFlush() {<a name="line.8789"></a>
-<span class="sourceLineNo">8790</span>    if (this.rsServices == null) {<a name="line.8790"></a>
-<span class="sourceLineNo">8791</span>      return;<a name="line.8791"></a>
-<span class="sourceLineNo">8792</span>    }<a name="line.8792"></a>
-<span class="sourceLineNo">8793</span>    requestFlush0(FlushLifeCycleTracker.DUMMY);<a name="line.8793"></a>
-<span class="sourceLineNo">8794</span>  }<a name="line.8794"></a>
-<span class="sourceLineNo">8795</span><a name="line.8795"></a>
-<span class="sourceLineNo">8796</span>  private void requestFlush0(FlushLifeCycleTracker tracker) {<a name="line.8796"></a>
-<span class="sourceLineNo">8797</span>    boolean shouldFlush = false;<a name="line.8797"></a>
-<span class="sourceLineNo">8798</span>    synchronized (writestate) {<a name="line.8798"></a>
-<span class="sourceLineNo">8799</span>      if (!this.writestate.isFlushRequested()) {<a name="line.8799"></a>
-<span class="sourceLineNo">8800</span>        shouldFlush = true;<a name="line.8800"></a>
-<span class="sourceLineNo">8801</span>        writestate.flushRequested = true;<a name="line.8801"></a>
-<span class="sourceLineNo">8802</span>      }<a name="line.8802"></a>
-<span class="sourceLineNo">8803</span>    }<a name="line.8803"></a>
-<span class="sourceLineNo">8804</span>    if (shouldFlush) {<a name="line.8804"></a>
-<span class="sourceLineNo">8805</span>      // Make request outside of synchronize block; HBASE-818.<a name="line.8805"></a>
-<span class="sourceLineNo">8806</span>      this.rsServices.getFlushRequester().requestFlush(this, false, tracker);<a name="line.8806"></a>
-<span class="sourceLineNo">8807</span>      if (LOG.isDebugEnabled()) {<a name="line.8807"></a>
-<span class="sourceLineNo">8808</span>        LOG.debug("Flush requested on " + this.getRegionInfo().getEncodedName());<a name="line.8808"></a>
-<span class="sourceLineNo">8809</span>      }<a name="line.8809"></a>
-<span class="sourceLineNo">8810</span>    } else {<a name="line.8810"></a>
-<span class="sourceLineNo">8811</span>      tracker.notExecuted("Flush already requested on " + this);<a name="line.8811"></a>
-<span class="sourceLineNo">8812</span>    }<a name="line.8812"></a>
-<span class="sourceLineNo">8813</span>  }<a name="line.8813"></a>
-<span class="sourceLineNo">8814</span><a name="line.8814"></a>
-<span class="sourceLineNo">8815</span>  @Override<a name="line.8815"></a>
-<span class="sourceLineNo">8816</span>  public void requestFlush(FlushLifeCycleTracker tracker) throws IOException {<a name="line.8816"></a>
-<span class="sourceLineNo">8817</span>    requestFlush0(tracker);<a name="line.8817"></a>
+<span class="sourceLineNo">8737</span>  public long getMemStoreFlushSize() {<a name="line.8737"></a>
+<span class="sourceLineNo">8738</span>    return this.memstoreFlushSize;<a name="line.8738"></a>
+<span class="sourceLineNo">8739</span>  }<a name="line.8739"></a>
+<span class="sourceLineNo">8740</span><a name="line.8740"></a>
+<span class="sourceLineNo">8741</span><a name="line.8741"></a>
+<span class="sourceLineNo">8742</span>  //// method for debugging tests<a name="line.8742"></a>
+<span class="sourceLineNo">8743</span>  void throwException(String title, String regionName) {<a name="line.8743"></a>
+<span class="sourceLineNo">8744</span>    StringBuilder buf = new StringBuilder();<a name="line.8744"></a>
+<span class="sourceLineNo">8745</span>    buf.append(title + ", ");<a name="line.8745"></a>
+<span class="sourceLineNo">8746</span>    buf.append(getRegionInfo().toString());<a name="line.8746"></a>
+<span class="sourceLineNo">8747</span>    buf.append(getRegionInfo().isMetaRegion() ? " meta region " : " ");<a name="line.8747"></a>
+<span class="sourceLineNo">8748</span>    buf.append("stores: ");<a name="line.8748"></a>
+<span class="sourceLineNo">8749</span>    for (HStore s : stores.values()) {<a name="line.8749"></a>
+<span class="sourceLineNo">8750</span>      buf.append(s.getColumnFamilyDescriptor().getNameAsString());<a name="line.8750"></a>
+<span class="sourceLineNo">8751</span>      buf.append(" size: ");<a name="line.8751"></a>
+<span class="sourceLineNo">8752</span>      buf.append(s.getMemStoreSize().getDataSize());<a name="line.8752"></a>
+<span class="sourceLineNo">8753</span>      buf.append(" ");<a name="line.8753"></a>
+<span class="sourceLineNo">8754</span>    }<a name="line.8754"></a>
+<span class="sourceLineNo">8755</span>    buf.append("end-of-stores");<a name="line.8755"></a>
+<span class="sourceLineNo">8756</span>    buf.append(", memstore size ");<a name="line.8756"></a>
+<span class="sourceLineNo">8757</span>    buf.append(getMemStoreDataSize());<a name="line.8757"></a>
+<span class="sourceLineNo">8758</span>    if (getRegionInfo().getRegionNameAsString().startsWith(regionName)) {<a name="line.8758"></a>
+<span class="sourceLineNo">8759</span>      throw new RuntimeException(buf.toString());<a name="line.8759"></a>
+<span class="sourceLineNo">8760</span>    }<a name="line.8760"></a>
+<span class="sourceLineNo">8761</span>  }<a name="line.8761"></a>
+<span class="sourceLineNo">8762</span><a name="line.8762"></a>
+<span class="sourceLineNo">8763</span>  @Override<a name="line.8763"></a>
+<span class="sourceLineNo">8764</span>  public void requestCompaction(String why, int priority, boolean major,<a name="line.8764"></a>
+<span class="sourceLineNo">8765</span>      CompactionLifeCycleTracker tracker) throws IOException {<a name="line.8765"></a>
+<span class="sourceLineNo">8766</span>    if (major) {<a name="line.8766"></a>
+<span class="sourceLineNo">8767</span>      stores.values().forEach(HStore::triggerMajorCompaction);<a name="line.8767"></a>
+<span class="sourceLineNo">8768</span>    }<a name="line.8768"></a>
+<span class="sourceLineNo">8769</span>    rsServices.getCompactionRequestor().requestCompaction(this, why, priority, tracker,<a name="line.8769"></a>
+<span class="sourceLineNo">8770</span>        RpcServer.getRequestUser().orElse(null));<a name="line.8770"></a>
+<span class="sourceLineNo">8771</span>  }<a name="line.8771"></a>
+<span class="sourceLineNo">8772</span><a name="line.8772"></a>
+<span class="sourceLineNo">8773</span>  @Override<a name="line.8773"></a>
+<span class="sourceLineNo">8774</span>  public void requestCompaction(byte[] family, String why, int priority, boolean major,<a name="line.8774"></a>
+<span class="sourceLineNo">8775</span>      CompactionLifeCycleTracker tracker) throws IOException {<a name="line.8775"></a>
+<span class="sourceLineNo">8776</span>    HStore store = stores.get(family);<a name="line.8776"></a>
+<span class="sourceLineNo">8777</span>    if (store == null) {<a name="line.8777"></a>
+<span class="sourceLineNo">8778</span>      throw new NoSuchColumnFamilyException("column family " + Bytes.toString(family) +<a name="line.8778"></a>
+<span class="sourceLineNo">8779</span>          " does not exist in region " + getRegionInfo().getRegionNameAsString());<a name="line.8779"></a>
+<span class="sourceLineNo">8780</span>    }<a name="line.8780"></a>
+<span class="sourceLineNo">8781</span>    if (major) {<a name="line.8781"></a>
+<span class="sourceLineNo">8782</span>      store.triggerMajorCompaction();<a name="line.8782"></a>
+<span class="sourceLineNo">8783</span>    }<a name="line.8783"></a>
+<span class="sourceLineNo">8784</span>    rsServices.getCompactionRequestor().requestCompaction(this, store, why, priority, tracker,<a name="line.8784"></a>
+<span class="sourceLineNo">8785</span>        RpcServer.getRequestUser().orElse(null));<a name="line.8785"></a>
+<span class="sourceLineNo">8786</span>  }<a name="line.8786"></a>
+<span class="sourceLineNo">8787</span><a name="line.8787"></a>
+<span class="sourceLineNo">8788</span>  private void requestFlushIfNeeded() throws RegionTooBusyException {<a name="line.8788"></a>
+<span class="sourceLineNo">8789</span>    if(isFlushSize(this.memStoreSizing.getMemStoreSize())) {<a name="line.8789"></a>
+<span class="sourceLineNo">8790</span>      requestFlush();<a name="line.8790"></a>
+<span class="sourceLineNo">8791</span>    }<a name="line.8791"></a>
+<span class="sourceLineNo">8792</span>  }<a name="line.8792"></a>
+<span class="sourceLineNo">8793</span><a name="line.8793"></a>
+<span class="sourceLineNo">8794</span>  private void requestFlush() {<a name="line.8794"></a>
+<span class="sourceLineNo">8795</span>    if (this.rsServices == null) {<a name="line.8795"></a>
+<span class="sourceLineNo">8796</span>      return;<a name="line.8796"></a>
+<span class="sourceLineNo">8797</span>    }<a name="line.8797"></a>
+<span class="sourceLineNo">8798</span>    requestFlush0(FlushLifeCycleTracker.DUMMY);<a name="line.8798"></a>
+<span class="sourceLineNo">8799</span>  }<a name="line.8799"></a>
+<span class="sourceLineNo">8800</span><a name="line.8800"></a>
+<span class="sourceLineNo">8801</span>  private void requestFlush0(FlushLifeCycleTracker tracker) {<a name="line.8801"></a>
+<span class="sourceLineNo">8802</span>    boolean shouldFlush = false;<a name="line.8802"></a>
+<span class="sourceLineNo">8803</span>    synchronized (writestate) {<a name="line.8803"></a>
+<span class="sourceLineNo">8804</span>      if (!this.writestate.isFlushRequested()) {<a name="line.8804"></a>
+<span class="sourceLineNo">8805</span>        shouldFlush = true;<a name="line.8805"></a>
+<span class="sourceLineNo">8806</span>        writestate.flushRequested = true;<a name="line.8806"></a>
+<span class="sourceLineNo">8807</span>      }<a name="line.8807"></a>
+<span class="sourceLineNo">8808</span>    }<a name="line.8808"></a>
+<span class="sourceLineNo">8809</span>    if (shouldFlush) {<a name="line.8809"></a>
+<span class="sourceLineNo">8810</span>      // Make request outside of synchronize block; HBASE-818.<a name="line.8810"></a>
+<span class="sourceLineNo">8811</span>      this.rsServices.getFlushRequester().requestFlush(this, false, tracker);<a name="line.8811"></a>
+<span class="sourceLineNo">8812</span>      if (LOG.isDebugEnabled()) {<a name="line.8812"></a>
+<span class="sourceLineNo">8813</span>        LOG.debug("Flush requested on " + this.getRegionInfo().getEncodedName());<a name="line.8813"></a>
+<span class="sourceLineNo">8814</span>      }<a name="line.8814"></a>
+<span class="sourceLineNo">8815</span>    } else {<a name="line.8815"></a>
+<span class="sourceLineNo">8816</span>      tracker.notExecuted("Flush already requested on " + this);<a name="line.8816"></a>
+<span class="sourceLineNo">8817</span>    }<a name="line.8817"></a>
 <span class="sourceLineNo">8818</span>  }<a name="line.8818"></a>
 <span class="sourceLineNo">8819</span><a name="line.8819"></a>
-<span class="sourceLineNo">8820</span>  /**<a name="line.8820"></a>
-<span class="sourceLineNo">8821</span>   * This method modifies the region's configuration in order to inject replication-related<a name="line.8821"></a>
-<span class="sourceLineNo">8822</span>   * features<a name="line.8822"></a>
-<span class="sourceLineNo">8823</span>   * @param conf region configurations<a name="line.8823"></a>
-<span class="sourceLineNo">8824</span>   */<a name="line.8824"></a>
-<span class="sourceLineNo">8825</span>  static void decorateRegionConfiguration(Configuration conf) {<a name="line.8825"></a>
-<span class="sourceLineNo">8826</span>    if (ReplicationUtils.isReplicationForBulkLoadDataEnabled(conf)) {<a name="line.8826"></a>
-<span class="sourceLineNo">8827</span>      String plugins = conf.get(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY,"");<a name="line.8827"></a>
-<span class="sourceLineNo">8828</span>      String replicationCoprocessorClass = ReplicationObserver.class.getCanonicalName();<a name="line.8828"></a>
-<span class="sourceLineNo">8829</span>      if (!plugins.contains(replicationCoprocessorClass)) {<a name="line.8829"></a>
-<span class="sourceLineNo">8830</span>        conf.set(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY,<a name="line.8830"></a>
-<span class="sourceLineNo">8831</span>            (plugins.equals("") ? "" : (plugins + ",")) + replicationCoprocessorClass);<a name="line.8831"></a>
-<span class="sourceLineNo">8832</span>      }<a name="line.8832"></a>
-<span class="sourceLineNo">8833</span>    }<a name="line.8833"></a>
-<span class="sourceLineNo">8834</span>  }<a name="line.8834"></a>
-<span class="sourceLineNo">8835</span>}<a name="line.8835"></a>
+<span class="sourceLineNo">8820</span>  @Override<a name="line.8820"></a>
+<span class="sourceLineNo">8821</span>  public void requestFlush(FlushLifeCycleTracker tracker) throws IOException {<a name="line.8821"></a>
+<span class="sourceLineNo">8822</span>    requestFlush0(tracker);<a name="line.8822"></a>
+<span class="sourceLineNo">8823</span>  }<a name="line.8823"></a>
+<span class="sourceLineNo">8824</span><a name="line.8824"></a>
+<span class="sourceLineNo">8825</span>  /**<a name="line.8825"></a>
+<span class="sourceLineNo">8826</span>   * This method modifies the region's configuration in order to inject replication-related<a name="line.8826"></a>
+<span class="sourceLineNo">8827</span>   * features<a name="line.8827"></a>
+<span class="sourceLineNo">8828</span>   * @param conf region configurations<a name="line.8828"></a>
+<span class="sourceLineNo">8829</span>   */<a name="line.8829"></a>
+<span class="sourceLineNo">8830</span>  static void decorateRegionConfiguration(Configuration conf) {<a name="line.8830"></a>
+<span class="sourceLineNo">8831</span>    if (ReplicationUtils.isReplicationForBulkLoadDataEnabled(conf)) {<a name="line.8831"></a>
+<span class="sourceLineNo">8832</span>      String plugins = conf.get(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY,"");<a name="line.8832"></a>
+<span class="sourceLineNo">8833</span>      String replicationCoprocessorClass = ReplicationObserver.class.getCanonicalName();<a name="line.8833"></a>
+<span class="sourceLineNo">8834</span>      if (!plugins.contains(replicationCoprocessorClass)) {<a name="line.8834"></a>
+<span class="sourceLineNo">8835</span>        conf.set(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY,<a name="line.8835"></a>
+<span class="sourceLineNo">8836</span>            (plugins.equals("") ? "" : (plugins + ",")) + replicationCoprocessorClass);<a name="line.8836"></a>
+<span class="sourceLineNo">8837</span>      }<a name="line.8837"></a>
+<span class="sourceLineNo">8838</span>    }<a name="line.8838"></a>
+<span class="sourceLineNo">8839</span>  }<a name="line.8839"></a>
+<span class="sourceLineNo">8840</span>}<a name="line.8840"></a>
 
 
 
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 8fcec33..2147e82 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
@@ -7972,875 +7972,880 @@
 <span class="sourceLineNo">7964</span>    if (walEdit.isReplay()) {<a name="line.7964"></a>
 <span class="sourceLineNo">7965</span>      walKey.setOrigLogSeqNum(origLogSeqNum);<a name="line.7965"></a>
 <span class="sourceLineNo">7966</span>    }<a name="line.7966"></a>
-<span class="sourceLineNo">7967</span>    WriteEntry writeEntry = null;<a name="line.7967"></a>
-<span class="sourceLineNo">7968</span>    try {<a name="line.7968"></a>
-<span class="sourceLineNo">7969</span>      long txid = this.wal.append(this.getRegionInfo(), walKey, walEdit, true);<a name="line.7969"></a>
-<span class="sourceLineNo">7970</span>      // Call sync on our edit.<a name="line.7970"></a>
-<span class="sourceLineNo">7971</span>      if (txid != 0) {<a name="line.7971"></a>
-<span class="sourceLineNo">7972</span>        sync(txid, durability);<a name="line.7972"></a>
-<span class="sourceLineNo">7973</span>      }<a name="line.7973"></a>
-<span class="sourceLineNo">7974</span>      writeEntry = walKey.getWriteEntry();<a name="line.7974"></a>
-<span class="sourceLineNo">7975</span>    } catch (IOException ioe) {<a name="line.7975"></a>
-<span class="sourceLineNo">7976</span>      if (walKey != null &amp;&amp; walKey.getWriteEntry() != null) {<a name="line.7976"></a>
-<span class="sourceLineNo">7977</span>        mvcc.complete(walKey.getWriteEntry());<a name="line.7977"></a>
+<span class="sourceLineNo">7967</span>    //don't call the coproc hook for writes to the WAL caused by<a name="line.7967"></a>
+<span class="sourceLineNo">7968</span>    //system lifecycle events like flushes or compactions<a name="line.7968"></a>
+<span class="sourceLineNo">7969</span>    if (this.coprocessorHost != null &amp;&amp; !walEdit.isMetaEdit()) {<a name="line.7969"></a>
+<span class="sourceLineNo">7970</span>      this.coprocessorHost.preWALAppend(walKey, walEdit);<a name="line.7970"></a>
+<span class="sourceLineNo">7971</span>    }<a name="line.7971"></a>
+<span class="sourceLineNo">7972</span>    WriteEntry writeEntry = null;<a name="line.7972"></a>
+<span class="sourceLineNo">7973</span>    try {<a name="line.7973"></a>
+<span class="sourceLineNo">7974</span>      long txid = this.wal.append(this.getRegionInfo(), walKey, walEdit, true);<a name="line.7974"></a>
+<span class="sourceLineNo">7975</span>      // Call sync on our edit.<a name="line.7975"></a>
+<span class="sourceLineNo">7976</span>      if (txid != 0) {<a name="line.7976"></a>
+<span class="sourceLineNo">7977</span>        sync(txid, durability);<a name="line.7977"></a>
 <span class="sourceLineNo">7978</span>      }<a name="line.7978"></a>
-<span class="sourceLineNo">7979</span>      throw ioe;<a name="line.7979"></a>
-<span class="sourceLineNo">7980</span>    }<a name="line.7980"></a>
-<span class="sourceLineNo">7981</span>    return writeEntry;<a name="line.7981"></a>
-<span class="sourceLineNo">7982</span>  }<a name="line.7982"></a>
-<span class="sourceLineNo">7983</span><a name="line.7983"></a>
-<span class="sourceLineNo">7984</span>  /**<a name="line.7984"></a>
-<span class="sourceLineNo">7985</span>   * Do coprocessor pre-increment or pre-append call.<a name="line.7985"></a>
-<span class="sourceLineNo">7986</span>   * @return Result returned out of the coprocessor, which means bypass all further processing and<a name="line.7986"></a>
-<span class="sourceLineNo">7987</span>   *  return the proffered Result instead, or null which means proceed.<a name="line.7987"></a>
-<span class="sourceLineNo">7988</span>   */<a name="line.7988"></a>
-<span class="sourceLineNo">7989</span>  private Result doCoprocessorPreCall(final Operation op, final Mutation mutation)<a name="line.7989"></a>
-<span class="sourceLineNo">7990</span>  throws IOException {<a name="line.7990"></a>
-<span class="sourceLineNo">7991</span>    Result result = null;<a name="line.7991"></a>
-<span class="sourceLineNo">7992</span>    if (this.coprocessorHost != null) {<a name="line.7992"></a>
-<span class="sourceLineNo">7993</span>      switch(op) {<a name="line.7993"></a>
-<span class="sourceLineNo">7994</span>        case INCREMENT:<a name="line.7994"></a>
-<span class="sourceLineNo">7995</span>          result = this.coprocessorHost.preIncrementAfterRowLock((Increment)mutation);<a name="line.7995"></a>
-<span class="sourceLineNo">7996</span>          break;<a name="line.7996"></a>
-<span class="sourceLineNo">7997</span>        case APPEND:<a name="line.7997"></a>
-<span class="sourceLineNo">7998</span>          result = this.coprocessorHost.preAppendAfterRowLock((Append)mutation);<a name="line.7998"></a>
-<span class="sourceLineNo">7999</span>          break;<a name="line.7999"></a>
-<span class="sourceLineNo">8000</span>        default: throw new UnsupportedOperationException(op.toString());<a name="line.8000"></a>
-<span class="sourceLineNo">8001</span>      }<a name="line.8001"></a>
-<span class="sourceLineNo">8002</span>    }<a name="line.8002"></a>
-<span class="sourceLineNo">8003</span>    return result;<a name="line.8003"></a>
-<span class="sourceLineNo">8004</span>  }<a name="line.8004"></a>
-<span class="sourceLineNo">8005</span><a name="line.8005"></a>
-<span class="sourceLineNo">8006</span>  /**<a name="line.8006"></a>
-<span class="sourceLineNo">8007</span>   * Reckon the Cells to apply to WAL, memstore, and to return to the Client; these Sets are not<a name="line.8007"></a>
-<span class="sourceLineNo">8008</span>   * always the same dependent on whether to write WAL.<a name="line.8008"></a>
-<span class="sourceLineNo">8009</span>   *<a name="line.8009"></a>
-<span class="sourceLineNo">8010</span>   * @param results Fill in here what goes back to the Client if it is non-null (if null, client<a name="line.8010"></a>
-<span class="sourceLineNo">8011</span>   *  doesn't want results).<a name="line.8011"></a>
-<span class="sourceLineNo">8012</span>   * @param forMemStore Fill in here what to apply to the MemStore (by Store).<a name="line.8012"></a>
-<span class="sourceLineNo">8013</span>   * @return A WALEdit to apply to WAL or null if we are to skip the WAL.<a name="line.8013"></a>
-<span class="sourceLineNo">8014</span>   */<a name="line.8014"></a>
-<span class="sourceLineNo">8015</span>  private WALEdit reckonDeltas(Operation op, Mutation mutation, Durability effectiveDurability,<a name="line.8015"></a>
-<span class="sourceLineNo">8016</span>      Map&lt;HStore, List&lt;Cell&gt;&gt; forMemStore, List&lt;Cell&gt; results) throws IOException {<a name="line.8016"></a>
-<span class="sourceLineNo">8017</span>    WALEdit walEdit = null;<a name="line.8017"></a>
-<span class="sourceLineNo">8018</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.8018"></a>
-<span class="sourceLineNo">8019</span>    final boolean writeToWAL = effectiveDurability != Durability.SKIP_WAL;<a name="line.8019"></a>
-<span class="sourceLineNo">8020</span>    // Process a Store/family at a time.<a name="line.8020"></a>
-<span class="sourceLineNo">8021</span>    for (Map.Entry&lt;byte [], List&lt;Cell&gt;&gt; entry: mutation.getFamilyCellMap().entrySet()) {<a name="line.8021"></a>
-<span class="sourceLineNo">8022</span>      final byte[] columnFamilyName = entry.getKey();<a name="line.8022"></a>
-<span class="sourceLineNo">8023</span>      List&lt;Cell&gt; deltas = entry.getValue();<a name="line.8023"></a>
-<span class="sourceLineNo">8024</span>      // Reckon for the Store what to apply to WAL and MemStore.<a name="line.8024"></a>
-<span class="sourceLineNo">8025</span>      List&lt;Cell&gt; toApply = reckonDeltasByStore(stores.get(columnFamilyName), op, mutation,<a name="line.8025"></a>
-<span class="sourceLineNo">8026</span>        effectiveDurability, now, deltas, results);<a name="line.8026"></a>
-<span class="sourceLineNo">8027</span>      if (!toApply.isEmpty()) {<a name="line.8027"></a>
-<span class="sourceLineNo">8028</span>        for (Cell cell : toApply) {<a name="line.8028"></a>
-<span class="sourceLineNo">8029</span>          HStore store = getStore(cell);<a name="line.8029"></a>
-<span class="sourceLineNo">8030</span>          if (store == null) {<a name="line.8030"></a>
-<span class="sourceLineNo">8031</span>            checkFamily(CellUtil.cloneFamily(cell));<a name="line.8031"></a>
-<span class="sourceLineNo">8032</span>          } else {<a name="line.8032"></a>
-<span class="sourceLineNo">8033</span>            forMemStore.computeIfAbsent(store, key -&gt; new ArrayList&lt;&gt;()).add(cell);<a name="line.8033"></a>
-<span class="sourceLineNo">8034</span>          }<a name="line.8034"></a>
-<span class="sourceLineNo">8035</span>        }<a name="line.8035"></a>
-<span class="sourceLineNo">8036</span>        if (writeToWAL) {<a name="line.8036"></a>
-<span class="sourceLineNo">8037</span>          if (walEdit == null) {<a name="line.8037"></a>
-<span class="sourceLineNo">8038</span>            walEdit = new WALEdit();<a name="line.8038"></a>
+<span class="sourceLineNo">7979</span>      writeEntry = walKey.getWriteEntry();<a name="line.7979"></a>
+<span class="sourceLineNo">7980</span>    } catch (IOException ioe) {<a name="line.7980"></a>
+<span class="sourceLineNo">7981</span>      if (walKey != null &amp;&amp; walKey.getWriteEntry() != null) {<a name="line.7981"></a>
+<span class="sourceLineNo">7982</span>        mvcc.complete(walKey.getWriteEntry());<a name="line.7982"></a>
+<span class="sourceLineNo">7983</span>      }<a name="line.7983"></a>
+<span class="sourceLineNo">7984</span>      throw ioe;<a name="line.7984"></a>
+<span class="sourceLineNo">7985</span>    }<a name="line.7985"></a>
+<span class="sourceLineNo">7986</span>    return writeEntry;<a name="line.7986"></a>
+<span class="sourceLineNo">7987</span>  }<a name="line.7987"></a>
+<span class="sourceLineNo">7988</span><a name="line.7988"></a>
+<span class="sourceLineNo">7989</span>  /**<a name="line.7989"></a>
+<span class="sourceLineNo">7990</span>   * Do coprocessor pre-increment or pre-append call.<a name="line.7990"></a>
+<span class="sourceLineNo">7991</span>   * @return Result returned out of the coprocessor, which means bypass all further processing and<a name="line.7991"></a>
+<span class="sourceLineNo">7992</span>   *  return the proffered Result instead, or null which means proceed.<a name="line.7992"></a>
+<span class="sourceLineNo">7993</span>   */<a name="line.7993"></a>
+<span class="sourceLineNo">7994</span>  private Result doCoprocessorPreCall(final Operation op, final Mutation mutation)<a name="line.7994"></a>
+<span class="sourceLineNo">7995</span>  throws IOException {<a name="line.7995"></a>
+<span class="sourceLineNo">7996</span>    Result result = null;<a name="line.7996"></a>
+<span class="sourceLineNo">7997</span>    if (this.coprocessorHost != null) {<a name="line.7997"></a>
+<span class="sourceLineNo">7998</span>      switch(op) {<a name="line.7998"></a>
+<span class="sourceLineNo">7999</span>        case INCREMENT:<a name="line.7999"></a>
+<span class="sourceLineNo">8000</span>          result = this.coprocessorHost.preIncrementAfterRowLock((Increment)mutation);<a name="line.8000"></a>
+<span class="sourceLineNo">8001</span>          break;<a name="line.8001"></a>
+<span class="sourceLineNo">8002</span>        case APPEND:<a name="line.8002"></a>
+<span class="sourceLineNo">8003</span>          result = this.coprocessorHost.preAppendAfterRowLock((Append)mutation);<a name="line.8003"></a>
+<span class="sourceLineNo">8004</span>          break;<a name="line.8004"></a>
+<span class="sourceLineNo">8005</span>        default: throw new UnsupportedOperationException(op.toString());<a name="line.8005"></a>
+<span class="sourceLineNo">8006</span>      }<a name="line.8006"></a>
+<span class="sourceLineNo">8007</span>    }<a name="line.8007"></a>
+<span class="sourceLineNo">8008</span>    return result;<a name="line.8008"></a>
+<span class="sourceLineNo">8009</span>  }<a name="line.8009"></a>
+<span class="sourceLineNo">8010</span><a name="line.8010"></a>
+<span class="sourceLineNo">8011</span>  /**<a name="line.8011"></a>
+<span class="sourceLineNo">8012</span>   * Reckon the Cells to apply to WAL, memstore, and to return to the Client; these Sets are not<a name="line.8012"></a>
+<span class="sourceLineNo">8013</span>   * always the same dependent on whether to write WAL.<a name="line.8013"></a>
+<span class="sourceLineNo">8014</span>   *<a name="line.8014"></a>
+<span class="sourceLineNo">8015</span>   * @param results Fill in here what goes back to the Client if it is non-null (if null, client<a name="line.8015"></a>
+<span class="sourceLineNo">8016</span>   *  doesn't want results).<a name="line.8016"></a>
+<span class="sourceLineNo">8017</span>   * @param forMemStore Fill in here what to apply to the MemStore (by Store).<a name="line.8017"></a>
+<span class="sourceLineNo">8018</span>   * @return A WALEdit to apply to WAL or null if we are to skip the WAL.<a name="line.8018"></a>
+<span class="sourceLineNo">8019</span>   */<a name="line.8019"></a>
+<span class="sourceLineNo">8020</span>  private WALEdit reckonDeltas(Operation op, Mutation mutation, Durability effectiveDurability,<a name="line.8020"></a>
+<span class="sourceLineNo">8021</span>      Map&lt;HStore, List&lt;Cell&gt;&gt; forMemStore, List&lt;Cell&gt; results) throws IOException {<a name="line.8021"></a>
+<span class="sourceLineNo">8022</span>    WALEdit walEdit = null;<a name="line.8022"></a>
+<span class="sourceLineNo">8023</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.8023"></a>
+<span class="sourceLineNo">8024</span>    final boolean writeToWAL = effectiveDurability != Durability.SKIP_WAL;<a name="line.8024"></a>
+<span class="sourceLineNo">8025</span>    // Process a Store/family at a time.<a name="line.8025"></a>
+<span class="sourceLineNo">8026</span>    for (Map.Entry&lt;byte [], List&lt;Cell&gt;&gt; entry: mutation.getFamilyCellMap().entrySet()) {<a name="line.8026"></a>
+<span class="sourceLineNo">8027</span>      final byte[] columnFamilyName = entry.getKey();<a name="line.8027"></a>
+<span class="sourceLineNo">8028</span>      List&lt;Cell&gt; deltas = entry.getValue();<a name="line.8028"></a>
+<span class="sourceLineNo">8029</span>      // Reckon for the Store what to apply to WAL and MemStore.<a name="line.8029"></a>
+<span class="sourceLineNo">8030</span>      List&lt;Cell&gt; toApply = reckonDeltasByStore(stores.get(columnFamilyName), op, mutation,<a name="line.8030"></a>
+<span class="sourceLineNo">8031</span>        effectiveDurability, now, deltas, results);<a name="line.8031"></a>
+<span class="sourceLineNo">8032</span>      if (!toApply.isEmpty()) {<a name="line.8032"></a>
+<span class="sourceLineNo">8033</span>        for (Cell cell : toApply) {<a name="line.8033"></a>
+<span class="sourceLineNo">8034</span>          HStore store = getStore(cell);<a name="line.8034"></a>
+<span class="sourceLineNo">8035</span>          if (store == null) {<a name="line.8035"></a>
+<span class="sourceLineNo">8036</span>            checkFamily(CellUtil.cloneFamily(cell));<a name="line.8036"></a>
+<span class="sourceLineNo">8037</span>          } else {<a name="line.8037"></a>
+<span class="sourceLineNo">8038</span>            forMemStore.computeIfAbsent(store, key -&gt; new ArrayList&lt;&gt;()).add(cell);<a name="line.8038"></a>
 <span class="sourceLineNo">8039</span>          }<a name="line.8039"></a>
-<span class="sourceLineNo">8040</span>          walEdit.getCells().addAll(toApply);<a name="line.8040"></a>
-<span class="sourceLineNo">8041</span>        }<a name="line.8041"></a>
-<span class="sourceLineNo">8042</span>      }<a name="line.8042"></a>
-<span class="sourceLineNo">8043</span>    }<a name="line.8043"></a>
-<span class="sourceLineNo">8044</span>    return walEdit;<a name="line.8044"></a>
-<span class="sourceLineNo">8045</span>  }<a name="line.8045"></a>
-<span class="sourceLineNo">8046</span><a name="line.8046"></a>
-<span class="sourceLineNo">8047</span>  /**<a name="line.8047"></a>
-<span class="sourceLineNo">8048</span>   * Reckon the Cells to apply to WAL, memstore, and to return to the Client in passed<a name="line.8048"></a>
-<span class="sourceLineNo">8049</span>   * column family/Store.<a name="line.8049"></a>
-<span class="sourceLineNo">8050</span>   *<a name="line.8050"></a>
-<span class="sourceLineNo">8051</span>   * Does Get of current value and then adds passed in deltas for this Store returning the result.<a name="line.8051"></a>
-<span class="sourceLineNo">8052</span>   *<a name="line.8052"></a>
-<span class="sourceLineNo">8053</span>   * @param op Whether Increment or Append<a name="line.8053"></a>
-<span class="sourceLineNo">8054</span>   * @param mutation The encompassing Mutation object<a name="line.8054"></a>
-<span class="sourceLineNo">8055</span>   * @param deltas Changes to apply to this Store; either increment amount or data to append<a name="line.8055"></a>
-<span class="sourceLineNo">8056</span>   * @param results In here we accumulate all the Cells we are to return to the client. If null,<a name="line.8056"></a>
-<span class="sourceLineNo">8057</span>   *                client doesn't want results returned.<a name="line.8057"></a>
-<span class="sourceLineNo">8058</span>   * @return Resulting Cells after &lt;code&gt;deltas&lt;/code&gt; have been applied to current<a name="line.8058"></a>
-<span class="sourceLineNo">8059</span>   *  values. Side effect is our filling out of the &lt;code&gt;results&lt;/code&gt; List.<a name="line.8059"></a>
-<span class="sourceLineNo">8060</span>   */<a name="line.8060"></a>
-<span class="sourceLineNo">8061</span>  private List&lt;Cell&gt; reckonDeltasByStore(HStore store, Operation op, Mutation mutation,<a name="line.8061"></a>
-<span class="sourceLineNo">8062</span>      Durability effectiveDurability, long now, List&lt;Cell&gt; deltas, List&lt;Cell&gt; results)<a name="line.8062"></a>
-<span class="sourceLineNo">8063</span>      throws IOException {<a name="line.8063"></a>
-<span class="sourceLineNo">8064</span>    byte[] columnFamily = store.getColumnFamilyDescriptor().getName();<a name="line.8064"></a>
-<span class="sourceLineNo">8065</span>    List&lt;Pair&lt;Cell, Cell&gt;&gt; cellPairs = new ArrayList&lt;&gt;(deltas.size());<a name="line.8065"></a>
-<span class="sourceLineNo">8066</span>    // Get previous values for all columns in this family.<a name="line.8066"></a>
-<span class="sourceLineNo">8067</span>    TimeRange tr = null;<a name="line.8067"></a>
-<span class="sourceLineNo">8068</span>    switch (op) {<a name="line.8068"></a>
-<span class="sourceLineNo">8069</span>      case INCREMENT:<a name="line.8069"></a>
-<span class="sourceLineNo">8070</span>        tr = ((Increment)mutation).getTimeRange();<a name="line.8070"></a>
-<span class="sourceLineNo">8071</span>        break;<a name="line.8071"></a>
-<span class="sourceLineNo">8072</span>      case APPEND:<a name="line.8072"></a>
-<span class="sourceLineNo">8073</span>        tr = ((Append)mutation).getTimeRange();<a name="line.8073"></a>
-<span class="sourceLineNo">8074</span>        break;<a name="line.8074"></a>
-<span class="sourceLineNo">8075</span>      default:<a name="line.8075"></a>
+<span class="sourceLineNo">8040</span>        }<a name="line.8040"></a>
+<span class="sourceLineNo">8041</span>        if (writeToWAL) {<a name="line.8041"></a>
+<span class="sourceLineNo">8042</span>          if (walEdit == null) {<a name="line.8042"></a>
+<span class="sourceLineNo">8043</span>            walEdit = new WALEdit();<a name="line.8043"></a>
+<span class="sourceLineNo">8044</span>          }<a name="line.8044"></a>
+<span class="sourceLineNo">8045</span>          walEdit.getCells().addAll(toApply);<a name="line.8045"></a>
+<span class="sourceLineNo">8046</span>        }<a name="line.8046"></a>
+<span class="sourceLineNo">8047</span>      }<a name="line.8047"></a>
+<span class="sourceLineNo">8048</span>    }<a name="line.8048"></a>
+<span class="sourceLineNo">8049</span>    return walEdit;<a name="line.8049"></a>
+<span class="sourceLineNo">8050</span>  }<a name="line.8050"></a>
+<span class="sourceLineNo">8051</span><a name="line.8051"></a>
+<span class="sourceLineNo">8052</span>  /**<a name="line.8052"></a>
+<span class="sourceLineNo">8053</span>   * Reckon the Cells to apply to WAL, memstore, and to return to the Client in passed<a name="line.8053"></a>
+<span class="sourceLineNo">8054</span>   * column family/Store.<a name="line.8054"></a>
+<span class="sourceLineNo">8055</span>   *<a name="line.8055"></a>
+<span class="sourceLineNo">8056</span>   * Does Get of current value and then adds passed in deltas for this Store returning the result.<a name="line.8056"></a>
+<span class="sourceLineNo">8057</span>   *<a name="line.8057"></a>
+<span class="sourceLineNo">8058</span>   * @param op Whether Increment or Append<a name="line.8058"></a>
+<span class="sourceLineNo">8059</span>   * @param mutation The encompassing Mutation object<a name="line.8059"></a>
+<span class="sourceLineNo">8060</span>   * @param deltas Changes to apply to this Store; either increment amount or data to append<a name="line.8060"></a>
+<span class="sourceLineNo">8061</span>   * @param results In here we accumulate all the Cells we are to return to the client. If null,<a name="line.8061"></a>
+<span class="sourceLineNo">8062</span>   *                client doesn't want results returned.<a name="line.8062"></a>
+<span class="sourceLineNo">8063</span>   * @return Resulting Cells after &lt;code&gt;deltas&lt;/code&gt; have been applied to current<a name="line.8063"></a>
+<span class="sourceLineNo">8064</span>   *  values. Side effect is our filling out of the &lt;code&gt;results&lt;/code&gt; List.<a name="line.8064"></a>
+<span class="sourceLineNo">8065</span>   */<a name="line.8065"></a>
+<span class="sourceLineNo">8066</span>  private List&lt;Cell&gt; reckonDeltasByStore(HStore store, Operation op, Mutation mutation,<a name="line.8066"></a>
+<span class="sourceLineNo">8067</span>      Durability effectiveDurability, long now, List&lt;Cell&gt; deltas, List&lt;Cell&gt; results)<a name="line.8067"></a>
+<span class="sourceLineNo">8068</span>      throws IOException {<a name="line.8068"></a>
+<span class="sourceLineNo">8069</span>    byte[] columnFamily = store.getColumnFamilyDescriptor().getName();<a name="line.8069"></a>
+<span class="sourceLineNo">8070</span>    List&lt;Pair&lt;Cell, Cell&gt;&gt; cellPairs = new ArrayList&lt;&gt;(deltas.size());<a name="line.8070"></a>
+<span class="sourceLineNo">8071</span>    // Get previous values for all columns in this family.<a name="line.8071"></a>
+<span class="sourceLineNo">8072</span>    TimeRange tr = null;<a name="line.8072"></a>
+<span class="sourceLineNo">8073</span>    switch (op) {<a name="line.8073"></a>
+<span class="sourceLineNo">8074</span>      case INCREMENT:<a name="line.8074"></a>
+<span class="sourceLineNo">8075</span>        tr = ((Increment)mutation).getTimeRange();<a name="line.8075"></a>
 <span class="sourceLineNo">8076</span>        break;<a name="line.8076"></a>
-<span class="sourceLineNo">8077</span>    }<a name="line.8077"></a>
-<span class="sourceLineNo">8078</span>    List&lt;Cell&gt; currentValues = get(mutation, store, deltas,null, tr);<a name="line.8078"></a>
-<span class="sourceLineNo">8079</span>    // Iterate the input columns and update existing values if they were found, otherwise<a name="line.8079"></a>
-<span class="sourceLineNo">8080</span>    // add new column initialized to the delta amount<a name="line.8080"></a>
-<span class="sourceLineNo">8081</span>    int currentValuesIndex = 0;<a name="line.8081"></a>
-<span class="sourceLineNo">8082</span>    for (int i = 0; i &lt; deltas.size(); i++) {<a name="line.8082"></a>
-<span class="sourceLineNo">8083</span>      Cell delta = deltas.get(i);<a name="line.8083"></a>
-<span class="sourceLineNo">8084</span>      Cell currentValue = null;<a name="line.8084"></a>
-<span class="sourceLineNo">8085</span>      if (currentValuesIndex &lt; currentValues.size() &amp;&amp;<a name="line.8085"></a>
-<span class="sourceLineNo">8086</span>          CellUtil.matchingQualifier(currentValues.get(currentValuesIndex), delta)) {<a name="line.8086"></a>
-<span class="sourceLineNo">8087</span>        currentValue = currentValues.get(currentValuesIndex);<a name="line.8087"></a>
-<span class="sourceLineNo">8088</span>        if (i &lt; (deltas.size() - 1) &amp;&amp; !CellUtil.matchingQualifier(delta, deltas.get(i + 1))) {<a name="line.8088"></a>
-<span class="sourceLineNo">8089</span>          currentValuesIndex++;<a name="line.8089"></a>
-<span class="sourceLineNo">8090</span>        }<a name="line.8090"></a>
-<span class="sourceLineNo">8091</span>      }<a name="line.8091"></a>
-<span class="sourceLineNo">8092</span><a name="line.8092"></a>
-<span class="sourceLineNo">8093</span>      // Switch on whether this an increment or an append building the new Cell to apply.<a name="line.8093"></a>
-<span class="sourceLineNo">8094</span>      Cell newCell = null;<a name="line.8094"></a>
-<span class="sourceLineNo">8095</span>      switch (op) {<a name="line.8095"></a>
-<span class="sourceLineNo">8096</span>        case INCREMENT:<a name="line.8096"></a>
-<span class="sourceLineNo">8097</span>          long deltaAmount = getLongValue(delta);<a name="line.8097"></a>
-<span class="sourceLineNo">8098</span>          final long newValue = currentValue == null ? deltaAmount : getLongValue(currentValue) + deltaAmount;<a name="line.8098"></a>
-<span class="sourceLineNo">8099</span>          newCell = reckonDelta(delta, currentValue, columnFamily, now, mutation, (oldCell) -&gt; Bytes.toBytes(newValue));<a name="line.8099"></a>
-<span class="sourceLineNo">8100</span>          break;<a name="line.8100"></a>
-<span class="sourceLineNo">8101</span>        case APPEND:<a name="line.8101"></a>
-<span class="sourceLineNo">8102</span>          newCell = reckonDelta(delta, currentValue, columnFamily, now, mutation, (oldCell) -&gt;<a name="line.8102"></a>
-<span class="sourceLineNo">8103</span>            ByteBuffer.wrap(new byte[delta.getValueLength() + oldCell.getValueLength()])<a name="line.8103"></a>
-<span class="sourceLineNo">8104</span>                    .put(oldCell.getValueArray(), oldCell.getValueOffset(), oldCell.getValueLength())<a name="line.8104"></a>
-<span class="sourceLineNo">8105</span>                    .put(delta.getValueArray(), delta.getValueOffset(), delta.getValueLength())<a name="line.8105"></a>
-<span class="sourceLineNo">8106</span>                    .array()<a name="line.8106"></a>
-<span class="sourceLineNo">8107</span>          );<a name="line.8107"></a>
-<span class="sourceLineNo">8108</span>          break;<a name="line.8108"></a>
-<span class="sourceLineNo">8109</span>        default: throw new UnsupportedOperationException(op.toString());<a name="line.8109"></a>
-<span class="sourceLineNo">8110</span>      }<a name="line.8110"></a>
-<span class="sourceLineNo">8111</span>      int newCellSize = PrivateCellUtil.estimatedSerializedSizeOf(newCell);<a name="line.8111"></a>
-<span class="sourceLineNo">8112</span>      if (newCellSize &gt; this.maxCellSize) {<a name="line.8112"></a>
-<span class="sourceLineNo">8113</span>        String msg = "Cell with size " + newCellSize + " exceeds limit of " +<a name="line.8113"></a>
-<span class="sourceLineNo">8114</span>            this.maxCellSize + " bytes";<a name="line.8114"></a>
-<span class="sourceLineNo">8115</span>        if (LOG.isDebugEnabled()) {<a name="line.8115"></a>
-<span class="sourceLineNo">8116</span>          LOG.debug(msg);<a name="line.8116"></a>
-<span class="sourceLineNo">8117</span>        }<a name="line.8117"></a>
-<span class="sourceLineNo">8118</span>        throw new DoNotRetryIOException(msg);<a name="line.8118"></a>
-<span class="sourceLineNo">8119</span>      }<a name="line.8119"></a>
-<span class="sourceLineNo">8120</span>      cellPairs.add(new Pair&lt;&gt;(currentValue, newCell));<a name="line.8120"></a>
-<span class="sourceLineNo">8121</span>      // Add to results to get returned to the Client. If null, cilent does not want results.<a name="line.8121"></a>
-<span class="sourceLineNo">8122</span>      if (results != null) {<a name="line.8122"></a>
-<span class="sourceLineNo">8123</span>        results.add(newCell);<a name="line.8123"></a>
+<span class="sourceLineNo">8077</span>      case APPEND:<a name="line.8077"></a>
+<span class="sourceLineNo">8078</span>        tr = ((Append)mutation).getTimeRange();<a name="line.8078"></a>
+<span class="sourceLineNo">8079</span>        break;<a name="line.8079"></a>
+<span class="sourceLineNo">8080</span>      default:<a name="line.8080"></a>
+<span class="sourceLineNo">8081</span>        break;<a name="line.8081"></a>
+<span class="sourceLineNo">8082</span>    }<a name="line.8082"></a>
+<span class="sourceLineNo">8083</span>    List&lt;Cell&gt; currentValues = get(mutation, store, deltas,null, tr);<a name="line.8083"></a>
+<span class="sourceLineNo">8084</span>    // Iterate the input columns and update existing values if they were found, otherwise<a name="line.8084"></a>
+<span class="sourceLineNo">8085</span>    // add new column initialized to the delta amount<a name="line.8085"></a>
+<span class="sourceLineNo">8086</span>    int currentValuesIndex = 0;<a name="line.8086"></a>
+<span class="sourceLineNo">8087</span>    for (int i = 0; i &lt; deltas.size(); i++) {<a name="line.8087"></a>
+<span class="sourceLineNo">8088</span>      Cell delta = deltas.get(i);<a name="line.8088"></a>
+<span class="sourceLineNo">8089</span>      Cell currentValue = null;<a name="line.8089"></a>
+<span class="sourceLineNo">8090</span>      if (currentValuesIndex &lt; currentValues.size() &amp;&amp;<a name="line.8090"></a>
+<span class="sourceLineNo">8091</span>          CellUtil.matchingQualifier(currentValues.get(currentValuesIndex), delta)) {<a name="line.8091"></a>
+<span class="sourceLineNo">8092</span>        currentValue = currentValues.get(currentValuesIndex);<a name="line.8092"></a>
+<span class="sourceLineNo">8093</span>        if (i &lt; (deltas.size() - 1) &amp;&amp; !CellUtil.matchingQualifier(delta, deltas.get(i + 1))) {<a name="line.8093"></a>
+<span class="sourceLineNo">8094</span>          currentValuesIndex++;<a name="line.8094"></a>
+<span class="sourceLineNo">8095</span>        }<a name="line.8095"></a>
+<span class="sourceLineNo">8096</span>      }<a name="line.8096"></a>
+<span class="sourceLineNo">8097</span><a name="line.8097"></a>
+<span class="sourceLineNo">8098</span>      // Switch on whether this an increment or an append building the new Cell to apply.<a name="line.8098"></a>
+<span class="sourceLineNo">8099</span>      Cell newCell = null;<a name="line.8099"></a>
+<span class="sourceLineNo">8100</span>      switch (op) {<a name="line.8100"></a>
+<span class="sourceLineNo">8101</span>        case INCREMENT:<a name="line.8101"></a>
+<span class="sourceLineNo">8102</span>          long deltaAmount = getLongValue(delta);<a name="line.8102"></a>
+<span class="sourceLineNo">8103</span>          final long newValue = currentValue == null ? deltaAmount : getLongValue(currentValue) + deltaAmount;<a name="line.8103"></a>
+<span class="sourceLineNo">8104</span>          newCell = reckonDelta(delta, currentValue, columnFamily, now, mutation, (oldCell) -&gt; Bytes.toBytes(newValue));<a name="line.8104"></a>
+<span class="sourceLineNo">8105</span>          break;<a name="line.8105"></a>
+<span class="sourceLineNo">8106</span>        case APPEND:<a name="line.8106"></a>
+<span class="sourceLineNo">8107</span>          newCell = reckonDelta(delta, currentValue, columnFamily, now, mutation, (oldCell) -&gt;<a name="line.8107"></a>
+<span class="sourceLineNo">8108</span>            ByteBuffer.wrap(new byte[delta.getValueLength() + oldCell.getValueLength()])<a name="line.8108"></a>
+<span class="sourceLineNo">8109</span>                    .put(oldCell.getValueArray(), oldCell.getValueOffset(), oldCell.getValueLength())<a name="line.8109"></a>
+<span class="sourceLineNo">8110</span>                    .put(delta.getValueArray(), delta.getValueOffset(), delta.getValueLength())<a name="line.8110"></a>
+<span class="sourceLineNo">8111</span>                    .array()<a name="line.8111"></a>
+<span class="sourceLineNo">8112</span>          );<a name="line.8112"></a>
+<span class="sourceLineNo">8113</span>          break;<a name="line.8113"></a>
+<span class="sourceLineNo">8114</span>        default: throw new UnsupportedOperationException(op.toString());<a name="line.8114"></a>
+<span class="sourceLineNo">8115</span>      }<a name="line.8115"></a>
+<span class="sourceLineNo">8116</span>      int newCellSize = PrivateCellUtil.estimatedSerializedSizeOf(newCell);<a name="line.8116"></a>
+<span class="sourceLineNo">8117</span>      if (newCellSize &gt; this.maxCellSize) {<a name="line.8117"></a>
+<span class="sourceLineNo">8118</span>        String msg = "Cell with size " + newCellSize + " exceeds limit of " +<a name="line.8118"></a>
+<span class="sourceLineNo">8119</span>            this.maxCellSize + " bytes";<a name="line.8119"></a>
+<span class="sourceLineNo">8120</span>        if (LOG.isDebugEnabled()) {<a name="line.8120"></a>
+<span class="sourceLineNo">8121</span>          LOG.debug(msg);<a name="line.8121"></a>
+<span class="sourceLineNo">8122</span>        }<a name="line.8122"></a>
+<span class="sourceLineNo">8123</span>        throw new DoNotRetryIOException(msg);<a name="line.8123"></a>
 <span class="sourceLineNo">8124</span>      }<a name="line.8124"></a>
-<span class="sourceLineNo">8125</span>    }<a name="line.8125"></a>
-<span class="sourceLineNo">8126</span><a name="line.8126"></a>
-<span class="sourceLineNo">8127</span>    // Give coprocessors a chance to update the new cells before apply to WAL or memstore<a name="line.8127"></a>
-<span class="sourceLineNo">8128</span>    if (coprocessorHost != null) {<a name="line.8128"></a>
-<span class="sourceLineNo">8129</span>      // Here the operation must be increment or append.<a name="line.8129"></a>
-<span class="sourceLineNo">8130</span>      cellPairs = op == Operation.INCREMENT ?<a name="line.8130"></a>
-<span class="sourceLineNo">8131</span>          coprocessorHost.postIncrementBeforeWAL(mutation, cellPairs) :<a name="line.8131"></a>
-<span class="sourceLineNo">8132</span>          coprocessorHost.postAppendBeforeWAL(mutation, cellPairs);<a name="line.8132"></a>
-<span class="sourceLineNo">8133</span>    }<a name="line.8133"></a>
-<span class="sourceLineNo">8134</span>    return cellPairs.stream().map(Pair::getSecond).collect(Collectors.toList());<a name="line.8134"></a>
-<span class="sourceLineNo">8135</span>  }<a name="line.8135"></a>
-<span class="sourceLineNo">8136</span><a name="line.8136"></a>
-<span class="sourceLineNo">8137</span>  private static Cell reckonDelta(final Cell delta, final Cell currentCell,<a name="line.8137"></a>
-<span class="sourceLineNo">8138</span>                                  final byte[] columnFamily, final long now,<a name="line.8138"></a>
-<span class="sourceLineNo">8139</span>                                  Mutation mutation, Function&lt;Cell, byte[]&gt; supplier) throws IOException {<a name="line.8139"></a>
-<span class="sourceLineNo">8140</span>    // Forward any tags found on the delta.<a name="line.8140"></a>
-<span class="sourceLineNo">8141</span>    List&lt;Tag&gt; tags = TagUtil.carryForwardTags(delta);<a name="line.8141"></a>
-<span class="sourceLineNo">8142</span>    tags = TagUtil.carryForwardTTLTag(tags, mutation.getTTL());<a name="line.8142"></a>
-<span class="sourceLineNo">8143</span>    if (currentCell != null) {<a name="line.8143"></a>
-<span class="sourceLineNo">8144</span>      tags = TagUtil.carryForwardTags(tags, currentCell);<a name="line.8144"></a>
-<span class="sourceLineNo">8145</span>      byte[] newValue = supplier.apply(currentCell);<a name="line.8145"></a>
-<span class="sourceLineNo">8146</span>      return ExtendedCellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.8146"></a>
-<span class="sourceLineNo">8147</span>              .setRow(mutation.getRow(), 0, mutation.getRow().length)<a name="line.8147"></a>
-<span class="sourceLineNo">8148</span>              .setFamily(columnFamily, 0, columnFamily.length)<a name="line.8148"></a>
-<span class="sourceLineNo">8149</span>              // copy the qualifier if the cell is located in shared memory.<a name="line.8149"></a>
-<span class="sourceLineNo">8150</span>              .setQualifier(CellUtil.cloneQualifier(delta))<a name="line.8150"></a>
-<span class="sourceLineNo">8151</span>              .setTimestamp(Math.max(currentCell.getTimestamp() + 1, now))<a name="line.8151"></a>
-<span class="sourceLineNo">8152</span>              .setType(KeyValue.Type.Put.getCode())<a name="line.8152"></a>
-<span class="sourceLineNo">8153</span>              .setValue(newValue, 0, newValue.length)<a name="line.8153"></a>
-<span class="sourceLineNo">8154</span>              .setTags(TagUtil.fromList(tags))<a name="line.8154"></a>
-<span class="sourceLineNo">8155</span>              .build();<a name="line.8155"></a>
-<span class="sourceLineNo">8156</span>    } else {<a name="line.8156"></a>
-<span class="sourceLineNo">8157</span>      PrivateCellUtil.updateLatestStamp(delta, now);<a name="line.8157"></a>
-<span class="sourceLineNo">8158</span>      return CollectionUtils.isEmpty(tags) ? delta : PrivateCellUtil.createCell(delta, tags);<a name="line.8158"></a>
-<span class="sourceLineNo">8159</span>    }<a name="line.8159"></a>
-<span class="sourceLineNo">8160</span>  }<a name="line.8160"></a>
-<span class="sourceLineNo">8161</span><a name="line.8161"></a>
-<span class="sourceLineNo">8162</span>  /**<a name="line.8162"></a>
-<span class="sourceLineNo">8163</span>   * @return Get the long out of the passed in Cell<a name="line.8163"></a>
-<span class="sourceLineNo">8164</span>   */<a name="line.8164"></a>
-<span class="sourceLineNo">8165</span>  private static long getLongValue(final Cell cell) throws DoNotRetryIOException {<a name="line.8165"></a>
-<span class="sourceLineNo">8166</span>    int len = cell.getValueLength();<a name="line.8166"></a>
-<span class="sourceLineNo">8167</span>    if (len != Bytes.SIZEOF_LONG) {<a name="line.8167"></a>
-<span class="sourceLineNo">8168</span>      // throw DoNotRetryIOException instead of IllegalArgumentException<a name="line.8168"></a>
-<span class="sourceLineNo">8169</span>      throw new DoNotRetryIOException("Field is not a long, it's " + len + " bytes wide");<a name="line.8169"></a>
-<span class="sourceLineNo">8170</span>    }<a name="line.8170"></a>
-<span class="sourceLineNo">8171</span>    return PrivateCellUtil.getValueAsLong(cell);<a name="line.8171"></a>
-<span class="sourceLineNo">8172</span>  }<a name="line.8172"></a>
-<span class="sourceLineNo">8173</span><a name="line.8173"></a>
-<span class="sourceLineNo">8174</span>  /**<a name="line.8174"></a>
-<span class="sourceLineNo">8175</span>   * Do a specific Get on passed &lt;code&gt;columnFamily&lt;/code&gt; and column qualifiers.<a name="line.8175"></a>
-<span class="sourceLineNo">8176</span>   * @param mutation Mutation we are doing this Get for.<a name="line.8176"></a>
-<span class="sourceLineNo">8177</span>   * @param store Which column family on row (TODO: Go all Gets in one go)<a name="line.8177"></a>
-<span class="sourceLineNo">8178</span>   * @param coordinates Cells from &lt;code&gt;mutation&lt;/code&gt; used as coordinates applied to Get.<a name="line.8178"></a>
-<span class="sourceLineNo">8179</span>   * @return Return list of Cells found.<a name="line.8179"></a>
-<span class="sourceLineNo">8180</span>   */<a name="line.8180"></a>
-<span class="sourceLineNo">8181</span>  private List&lt;Cell&gt; get(Mutation mutation, HStore store, List&lt;Cell&gt; coordinates,<a name="line.8181"></a>
-<span class="sourceLineNo">8182</span>      IsolationLevel isolation, TimeRange tr) throws IOException {<a name="line.8182"></a>
-<span class="sourceLineNo">8183</span>    // Sort the cells so that they match the order that they appear in the Get results. Otherwise,<a name="line.8183"></a>
-<span class="sourceLineNo">8184</span>    // we won't be able to find the existing values if the cells are not specified in order by the<a name="line.8184"></a>
-<span class="sourceLineNo">8185</span>    // client since cells are in an array list.<a name="line.8185"></a>
-<span class="sourceLineNo">8186</span>    // TODO: I don't get why we are sorting. St.Ack 20150107<a name="line.8186"></a>
-<span class="sourceLineNo">8187</span>    sort(coordinates, store.getComparator());<a name="line.8187"></a>
-<span class="sourceLineNo">8188</span>    Get get = new Get(mutation.getRow());<a name="line.8188"></a>
-<span class="sourceLineNo">8189</span>    if (isolation != null) {<a name="line.8189"></a>
-<span class="sourceLineNo">8190</span>      get.setIsolationLevel(isolation);<a name="line.8190"></a>
-<span class="sourceLineNo">8191</span>    }<a name="line.8191"></a>
-<span class="sourceLineNo">8192</span>    for (Cell cell: coordinates) {<a name="line.8192"></a>
-<span class="sourceLineNo">8193</span>      get.addColumn(store.getColumnFamilyDescriptor().getName(), CellUtil.cloneQualifier(cell));<a name="line.8193"></a>
-<span class="sourceLineNo">8194</span>    }<a name="line.8194"></a>
-<span class="sourceLineNo">8195</span>    // Increments carry time range. If an Increment instance, put it on the Get.<a name="line.8195"></a>
-<span class="sourceLineNo">8196</span>    if (tr != null) {<a name="line.8196"></a>
-<span class="sourceLineNo">8197</span>      get.setTimeRange(tr.getMin(), tr.getMax());<a name="line.8197"></a>
-<span class="sourceLineNo">8198</span>    }<a name="line.8198"></a>
-<span class="sourceLineNo">8199</span>    return get(get, false);<a name="line.8199"></a>
-<span class="sourceLineNo">8200</span>  }<a name="line.8200"></a>
-<span class="sourceLineNo">8201</span><a name="line.8201"></a>
-<span class="sourceLineNo">8202</span>  /**<a name="line.8202"></a>
-<span class="sourceLineNo">8203</span>   * @return Sorted list of &lt;code&gt;cells&lt;/code&gt; using &lt;code&gt;comparator&lt;/code&gt;<a name="line.8203"></a>
-<span class="sourceLineNo">8204</span>   */<a name="line.8204"></a>
-<span class="sourceLineNo">8205</span>  private static List&lt;Cell&gt; sort(List&lt;Cell&gt; cells, final CellComparator comparator) {<a name="line.8205"></a>
-<span class="sourceLineNo">8206</span>    cells.sort(comparator);<a name="line.8206"></a>
-<span class="sourceLineNo">8207</span>    return cells;<a name="line.8207"></a>
-<span class="sourceLineNo">8208</span>  }<a name="line.8208"></a>
-<span class="sourceLineNo">8209</span><a name="line.8209"></a>
-<span class="sourceLineNo">8210</span>  public static final long FIXED_OVERHEAD = ClassSize.align(<a name="line.8210"></a>
-<span class="sourceLineNo">8211</span>      ClassSize.OBJECT +<a name="line.8211"></a>
-<span class="sourceLineNo">8212</span>      ClassSize.ARRAY +<a name="line.8212"></a>
-<span class="sourceLineNo">8213</span>      55 * ClassSize.REFERENCE + 3 * Bytes.SIZEOF_INT +<a name="line.8213"></a>
-<span class="sourceLineNo">8214</span>      (15 * Bytes.SIZEOF_LONG) +<a name="line.8214"></a>
-<span class="sourceLineNo">8215</span>      3 * Bytes.SIZEOF_BOOLEAN);<a name="line.8215"></a>
-<span class="sourceLineNo">8216</span><a name="line.8216"></a>
-<span class="sourceLineNo">8217</span>  // woefully out of date - currently missing:<a name="line.8217"></a>
-<span class="sourceLineNo">8218</span>  // 1 x HashMap - coprocessorServiceHandlers<a name="line.8218"></a>
-<span class="sourceLineNo">8219</span>  // 6 x LongAdder - numMutationsWithoutWAL, dataInMemoryWithoutWAL,<a name="line.8219"></a>
-<span class="sourceLineNo">8220</span>  //   checkAndMutateChecksPassed, checkAndMutateChecksFailed, readRequestsCount,<a name="line.8220"></a>
-<span class="sourceLineNo">8221</span>  //   writeRequestsCount, cpRequestsCount<a name="line.8221"></a>
-<span class="sourceLineNo">8222</span>  // 1 x HRegion$WriteState - writestate<a name="line.8222"></a>
-<span class="sourceLineNo">8223</span>  // 1 x RegionCoprocessorHost - coprocessorHost<a name="line.8223"></a>
-<span class="sourceLineNo">8224</span>  // 1 x RegionSplitPolicy - splitPolicy<a name="line.8224"></a>
-<span class="sourceLineNo">8225</span>  // 1 x MetricsRegion - metricsRegion<a name="line.8225"></a>
-<span class="sourceLineNo">8226</span>  // 1 x MetricsRegionWrapperImpl - metricsRegionWrapper<a name="line.8226"></a>
-<span class="sourceLineNo">8227</span>  public static final long DEEP_OVERHEAD = FIXED_OVERHEAD +<a name="line.8227"></a>
-<span class="sourceLineNo">8228</span>      ClassSize.OBJECT + // closeLock<a name="line.8228"></a>
-<span class="sourceLineNo">8229</span>      (2 * ClassSize.ATOMIC_BOOLEAN) + // closed, closing<a name="line.8229"></a>
-<span class="sourceLineNo">8230</span>      (3 * ClassSize.ATOMIC_LONG) + // numPutsWithoutWAL, dataInMemoryWithoutWAL,<a name="line.8230"></a>
-<span class="sourceLineNo">8231</span>                                    // compactionsFailed<a name="line.8231"></a>
-<span class="sourceLineNo">8232</span>      (2 * ClassSize.CONCURRENT_HASHMAP) +  // lockedRows, scannerReadPoints<a name="line.8232"></a>
-<span class="sourceLineNo">8233</span>      WriteState.HEAP_SIZE + // writestate<a name="line.8233"></a>
-<span class="sourceLineNo">8234</span>      ClassSize.CONCURRENT_SKIPLISTMAP + ClassSize.CONCURRENT_SKIPLISTMAP_ENTRY + // stores<a name="line.8234"></a>
-<span class="sourceLineNo">8235</span>      (2 * ClassSize.REENTRANT_LOCK) + // lock, updatesLock<a name="line.8235"></a>
-<span class="sourceLineNo">8236</span>      MultiVersionConcurrencyControl.FIXED_SIZE // mvcc<a name="line.8236"></a>
-<span class="sourceLineNo">8237</span>      + 2 * ClassSize.TREEMAP // maxSeqIdInStores, replicationScopes<a name="line.8237"></a>
-<span class="sourceLineNo">8238</span>      + 2 * ClassSize.ATOMIC_INTEGER // majorInProgress, minorInProgress<a name="line.8238"></a>
-<span class="sourceLineNo">8239</span>      + ClassSize.STORE_SERVICES // store services<a name="line.8239"></a>
-<span class="sourceLineNo">8240</span>      + StoreHotnessProtector.FIXED_SIZE<a name="line.8240"></a>
-<span class="sourceLineNo">8241</span>      ;<a name="line.8241"></a>
-<span class="sourceLineNo">8242</span><a name="line.8242"></a>
-<span class="sourceLineNo">8243</span>  @Override<a name="line.8243"></a>
-<span class="sourceLineNo">8244</span>  public long heapSize() {<a name="line.8244"></a>
-<span class="sourceLineNo">8245</span>    // this does not take into account row locks, recent flushes, mvcc entries, and more<a name="line.8245"></a>
-<span class="sourceLineNo">8246</span>    return DEEP_OVERHEAD + stores.values().stream().mapToLong(HStore::heapSize).sum();<a name="line.8246"></a>
-<span class="sourceLineNo">8247</span>  }<a name="line.8247"></a>
-<span class="sourceLineNo">8248</span><a name="line.8248"></a>
-<span class="sourceLineNo">8249</span>  /**<a name="line.8249"></a>
-<span class="sourceLineNo">8250</span>   * Registers a new protocol buffer {@link Service} subclass as a coprocessor endpoint to<a name="line.8250"></a>
-<span class="sourceLineNo">8251</span>   * be available for handling Region#execService(com.google.protobuf.RpcController,<a name="line.8251"></a>
-<span class="sourceLineNo">8252</span>   *    org.apache.hadoop.hbase.protobuf.generated.ClientProtos.CoprocessorServiceCall) calls.<a name="line.8252"></a>
-<span class="sourceLineNo">8253</span>   *<a name="line.8253"></a>
-<span class="sourceLineNo">8254</span>   * &lt;p&gt;<a name="line.8254"></a>
-<span class="sourceLineNo">8255</span>   * Only a single instance may be registered per region for a given {@link Service} subclass (the<a name="line.8255"></a>
-<span class="sourceLineNo">8256</span>   * instances are keyed on {@link com.google.protobuf.Descriptors.ServiceDescriptor#getFullName()}.<a name="line.8256"></a>
-<span class="sourceLineNo">8257</span>   * After the first registration, subsequent calls with the same service name will fail with<a name="line.8257"></a>
-<span class="sourceLineNo">8258</span>   * a return value of {@code false}.<a name="line.8258"></a>
-<span class="sourceLineNo">8259</span>   * &lt;/p&gt;<a name="line.8259"></a>
-<span class="sourceLineNo">8260</span>   * @param instance the {@code Service} subclass instance to expose as a coprocessor endpoint<a name="line.8260"></a>
-<span class="sourceLineNo">8261</span>   * @return {@code true} if the registration was successful, {@code false}<a name="line.8261"></a>
-<span class="sourceLineNo">8262</span>   * otherwise<a name="line.8262"></a>
-<span class="sourceLineNo">8263</span>   */<a name="line.8263"></a>
-<span class="sourceLineNo">8264</span>  public boolean registerService(com.google.protobuf.Service instance) {<a name="line.8264"></a>
-<span class="sourceLineNo">8265</span>    /*<a name="line.8265"></a>
-<span class="sourceLineNo">8266</span>     * No stacking of instances is allowed for a single service name<a name="line.8266"></a>
-<span class="sourceLineNo">8267</span>     */<a name="line.8267"></a>
-<span class="sourceLineNo">8268</span>    com.google.protobuf.Descriptors.ServiceDescriptor serviceDesc = instance.getDescriptorForType();<a name="line.8268"></a>
-<span class="sourceLineNo">8269</span>    String serviceName = CoprocessorRpcUtils.getServiceName(serviceDesc);<a name="line.8269"></a>
-<span class="sourceLineNo">8270</span>    if (coprocessorServiceHandlers.containsKey(serviceName)) {<a name="line.8270"></a>
-<span class="sourceLineNo">8271</span>      LOG.error("Coprocessor service " + serviceName +<a name="line.8271"></a>
-<span class="sourceLineNo">8272</span>          " already registered, rejecting request from " + instance);<a name="line.8272"></a>
-<span class="sourceLineNo">8273</span>      return false;<a name="line.8273"></a>
-<span class="sourceLineNo">8274</span>    }<a name="line.8274"></a>
-<span class="sourceLineNo">8275</span><a name="line.8275"></a>
-<span class="sourceLineNo">8276</span>    coprocessorServiceHandlers.put(serviceName, instance);<a name="line.8276"></a>
-<span class="sourceLineNo">8277</span>    if (LOG.isDebugEnabled()) {<a name="line.8277"></a>
-<span class="sourceLineNo">8278</span>      LOG.debug("Registered coprocessor service: region=" +<a name="line.8278"></a>
-<span class="sourceLineNo">8279</span>          Bytes.toStringBinary(getRegionInfo().getRegionName()) +<a name="line.8279"></a>
-<span class="sourceLineNo">8280</span>          " service=" + serviceName);<a name="line.8280"></a>
-<span class="sourceLineNo">8281</span>    }<a name="line.8281"></a>
-<span class="sourceLineNo">8282</span>    return true;<a name="line.8282"></a>
-<span class="sourceLineNo">8283</span>  }<a name="line.8283"></a>
-<span class="sourceLineNo">8284</span><a name="line.8284"></a>
-<span class="sourceLineNo">8285</span>  /**<a name="line.8285"></a>
-<span class="sourceLineNo">8286</span>   * Executes a single protocol buffer coprocessor endpoint {@link Service} method using<a name="line.8286"></a>
-<span class="sourceLineNo">8287</span>   * the registered protocol handlers.  {@link Service} implementations must be registered via the<a name="line.8287"></a>
-<span class="sourceLineNo">8288</span>   * {@link #registerService(com.google.protobuf.Service)}<a name="line.8288"></a>
-<span class="sourceLineNo">8289</span>   * method before they are available.<a name="line.8289"></a>
-<span class="sourceLineNo">8290</span>   *<a name="line.8290"></a>
-<span class="sourceLineNo">8291</span>   * @param controller an {@code RpcContoller} implementation to pass to the invoked service<a name="line.8291"></a>
-<span class="sourceLineNo">8292</span>   * @param call a {@code CoprocessorServiceCall} instance identifying the service, method,<a name="line.8292"></a>
-<span class="sourceLineNo">8293</span>   *     and parameters for the method invocation<a name="line.8293"></a>
-<span class="sourceLineNo">8294</span>   * @return a protocol buffer {@code Message} instance containing the method's result<a name="line.8294"></a>
-<span class="sourceLineNo">8295</span>   * @throws IOException if no registered service handler is found or an error<a name="line.8295"></a>
-<span class="sourceLineNo">8296</span>   *     occurs during the invocation<a name="line.8296"></a>
-<span class="sourceLineNo">8297</span>   * @see #registerService(com.google.protobuf.Service)<a name="line.8297"></a>
-<span class="sourceLineNo">8298</span>   */<a name="line.8298"></a>
-<span class="sourceLineNo">8299</span>  public com.google.protobuf.Message execService(com.google.protobuf.RpcController controller,<a name="line.8299"></a>
-<span class="sourceLineNo">8300</span>      CoprocessorServiceCall call) throws IOException {<a name="line.8300"></a>
-<span class="sourceLineNo">8301</span>    String serviceName = call.getServiceName();<a name="line.8301"></a>
-<span class="sourceLineNo">8302</span>    com.google.protobuf.Service service = coprocessorServiceHandlers.get(serviceName);<a name="line.8302"></a>
-<span class="sourceLineNo">8303</span>    if (service == null) {<a name="line.8303"></a>
-<span class="sourceLineNo">8304</span>      throw new UnknownProtocolException(null, "No registered coprocessor service found for " +<a name="line.8304"></a>
-<span class="sourceLineNo">8305</span>          serviceName + " in region " + Bytes.toStringBinary(getRegionInfo().getRegionName()));<a name="line.8305"></a>
-<span class="sourceLineNo">8306</span>    }<a name="line.8306"></a>
-<span class="sourceLineNo">8307</span>    com.google.protobuf.Descriptors.ServiceDescriptor serviceDesc = service.getDescriptorForType();<a name="line.8307"></a>
-<span class="sourceLineNo">8308</span><a name="line.8308"></a>
-<span class="sourceLineNo">8309</span>    cpRequestsCount.increment();<a name="line.8309"></a>
-<span class="sourceLineNo">8310</span>    String methodName = call.getMethodName();<a name="line.8310"></a>
-<span class="sourceLineNo">8311</span>    com.google.protobuf.Descriptors.MethodDescriptor methodDesc =<a name="line.8311"></a>
-<span class="sourceLineNo">8312</span>        CoprocessorRpcUtils.getMethodDescriptor(methodName, serviceDesc);<a name="line.8312"></a>
+<span class="sourceLineNo">8125</span>      cellPairs.add(new Pair&lt;&gt;(currentValue, newCell));<a name="line.8125"></a>
+<span class="sourceLineNo">8126</span>      // Add to results to get returned to the Client. If null, cilent does not want results.<a name="line.8126"></a>
+<span class="sourceLineNo">8127</span>      if (results != null) {<a name="line.8127"></a>
+<span class="sourceLineNo">8128</span>        results.add(newCell);<a name="line.8128"></a>
+<span class="sourceLineNo">8129</span>      }<a name="line.8129"></a>
+<span class="sourceLineNo">8130</span>    }<a name="line.8130"></a>
+<span class="sourceLineNo">8131</span><a name="line.8131"></a>
+<span class="sourceLineNo">8132</span>    // Give coprocessors a chance to update the new cells before apply to WAL or memstore<a name="line.8132"></a>
+<span class="sourceLineNo">8133</span>    if (coprocessorHost != null) {<a name="line.8133"></a>
+<span class="sourceLineNo">8134</span>      // Here the operation must be increment or append.<a name="line.8134"></a>
+<span class="sourceLineNo">8135</span>      cellPairs = op == Operation.INCREMENT ?<a name="line.8135"></a>
+<span class="sourceLineNo">8136</span>          coprocessorHost.postIncrementBeforeWAL(mutation, cellPairs) :<a name="line.8136"></a>
+<span class="sourceLineNo">8137</span>          coprocessorHost.postAppendBeforeWAL(mutation, cellPairs);<a name="line.8137"></a>
+<span class="sourceLineNo">8138</span>    }<a name="line.8138"></a>
+<span class="sourceLineNo">8139</span>    return cellPairs.stream().map(Pair::getSecond).collect(Collectors.toList());<a name="line.8139"></a>
+<span class="sourceLineNo">8140</span>  }<a name="line.8140"></a>
+<span class="sourceLineNo">8141</span><a name="line.8141"></a>
+<span class="sourceLineNo">8142</span>  private static Cell reckonDelta(final Cell delta, final Cell currentCell,<a name="line.8142"></a>
+<span class="sourceLineNo">8143</span>                                  final byte[] columnFamily, final long now,<a name="line.8143"></a>
+<span class="sourceLineNo">8144</span>                                  Mutation mutation, Function&lt;Cell, byte[]&gt; supplier) throws IOException {<a name="line.8144"></a>
+<span class="sourceLineNo">8145</span>    // Forward any tags found on the delta.<a name="line.8145"></a>
+<span class="sourceLineNo">8146</span>    List&lt;Tag&gt; tags = TagUtil.carryForwardTags(delta);<a name="line.8146"></a>
+<span class="sourceLineNo">8147</span>    tags = TagUtil.carryForwardTTLTag(tags, mutation.getTTL());<a name="line.8147"></a>
+<span class="sourceLineNo">8148</span>    if (currentCell != null) {<a name="line.8148"></a>
+<span class="sourceLineNo">8149</span>      tags = TagUtil.carryForwardTags(tags, currentCell);<a name="line.8149"></a>
+<span class="sourceLineNo">8150</span>      byte[] newValue = supplier.apply(currentCell);<a name="line.8150"></a>
+<span class="sourceLineNo">8151</span>      return ExtendedCellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.8151"></a>
+<span class="sourceLineNo">8152</span>              .setRow(mutation.getRow(), 0, mutation.getRow().length)<a name="line.8152"></a>
+<span class="sourceLineNo">8153</span>              .setFamily(columnFamily, 0, columnFamily.length)<a name="line.8153"></a>
+<span class="sourceLineNo">8154</span>              // copy the qualifier if the cell is located in shared memory.<a name="line.8154"></a>
+<span class="sourceLineNo">8155</span>              .setQualifier(CellUtil.cloneQualifier(delta))<a name="line.8155"></a>
+<span class="sourceLineNo">8156</span>              .setTimestamp(Math.max(currentCell.getTimestamp() + 1, now))<a name="line.8156"></a>
+<span class="sourceLineNo">8157</span>              .setType(KeyValue.Type.Put.getCode())<a name="line.8157"></a>
+<span class="sourceLineNo">8158</span>              .setValue(newValue, 0, newValue.length)<a name="line.8158"></a>
+<span class="sourceLineNo">8159</span>              .setTags(TagUtil.fromList(tags))<a name="line.8159"></a>
+<span class="sourceLineNo">8160</span>              .build();<a name="line.8160"></a>
+<span class="sourceLineNo">8161</span>    } else {<a name="line.8161"></a>
+<span class="sourceLineNo">8162</span>      PrivateCellUtil.updateLatestStamp(delta, now);<a name="line.8162"></a>
+<span class="sourceLineNo">8163</span>      return CollectionUtils.isEmpty(tags) ? delta : PrivateCellUtil.createCell(delta, tags);<a name="line.8163"></a>
+<span class="sourceLineNo">8164</span>    }<a name="line.8164"></a>
+<span class="sourceLineNo">8165</span>  }<a name="line.8165"></a>
+<span class="sourceLineNo">8166</span><a name="line.8166"></a>
+<span class="sourceLineNo">8167</span>  /**<a name="line.8167"></a>
+<span class="sourceLineNo">8168</span>   * @return Get the long out of the passed in Cell<a name="line.8168"></a>
+<span class="sourceLineNo">8169</span>   */<a name="line.8169"></a>
+<span class="sourceLineNo">8170</span>  private static long getLongValue(final Cell cell) throws DoNotRetryIOException {<a name="line.8170"></a>
+<span class="sourceLineNo">8171</span>    int len = cell.getValueLength();<a name="line.8171"></a>
+<span class="sourceLineNo">8172</span>    if (len != Bytes.SIZEOF_LONG) {<a name="line.8172"></a>
+<span class="sourceLineNo">8173</span>      // throw DoNotRetryIOException instead of IllegalArgumentException<a name="line.8173"></a>
+<span class="sourceLineNo">8174</span>      throw new DoNotRetryIOException("Field is not a long, it's " + len + " bytes wide");<a name="line.8174"></a>
+<span class="sourceLineNo">8175</span>    }<a name="line.8175"></a>
+<span class="sourceLineNo">8176</span>    return PrivateCellUtil.getValueAsLong(cell);<a name="line.8176"></a>
+<span class="sourceLineNo">8177</span>  }<a name="line.8177"></a>
+<span class="sourceLineNo">8178</span><a name="line.8178"></a>
+<span class="sourceLineNo">8179</span>  /**<a name="line.8179"></a>
+<span class="sourceLineNo">8180</span>   * Do a specific Get on passed &lt;code&gt;columnFamily&lt;/code&gt; and column qualifiers.<a name="line.8180"></a>
+<span class="sourceLineNo">8181</span>   * @param mutation Mutation we are doing this Get for.<a name="line.8181"></a>
+<span class="sourceLineNo">8182</span>   * @param store Which column family on row (TODO: Go all Gets in one go)<a name="line.8182"></a>
+<span class="sourceLineNo">8183</span>   * @param coordinates Cells from &lt;code&gt;mutation&lt;/code&gt; used as coordinates applied to Get.<a name="line.8183"></a>
+<span class="sourceLineNo">8184</span>   * @return Return list of Cells found.<a name="line.8184"></a>
+<span class="sourceLineNo">8185</span>   */<a name="line.8185"></a>
+<span class="sourceLineNo">8186</span>  private List&lt;Cell&gt; get(Mutation mutation, HStore store, List&lt;Cell&gt; coordinates,<a name="line.8186"></a>
+<span class="sourceLineNo">8187</span>      IsolationLevel isolation, TimeRange tr) throws IOException {<a name="line.8187"></a>
+<span class="sourceLineNo">8188</span>    // Sort the cells so that they match the order that they appear in the Get results. Otherwise,<a name="line.8188"></a>
+<span class="sourceLineNo">8189</span>    // we won't be able to find the existing values if the cells are not specified in order by the<a name="line.8189"></a>
+<span class="sourceLineNo">8190</span>    // client since cells are in an array list.<a name="line.8190"></a>
+<span class="sourceLineNo">8191</span>    // TODO: I don't get why we are sorting. St.Ack 20150107<a name="line.8191"></a>
+<span class="sourceLineNo">8192</span>    sort(coordinates, store.getComparator());<a name="line.8192"></a>
+<span class="sourceLineNo">8193</span>    Get get = new Get(mutation.getRow());<a name="line.8193"></a>
+<span class="sourceLineNo">8194</span>    if (isolation != null) {<a name="line.8194"></a>
+<span class="sourceLineNo">8195</span>      get.setIsolationLevel(isolation);<a name="line.8195"></a>
+<span class="sourceLineNo">8196</span>    }<a name="line.8196"></a>
+<span class="sourceLineNo">8197</span>    for (Cell cell: coordinates) {<a name="line.8197"></a>
+<span class="sourceLineNo">8198</span>      get.addColumn(store.getColumnFamilyDescriptor().getName(), CellUtil.cloneQualifier(cell));<a name="line.8198"></a>
+<span class="sourceLineNo">8199</span>    }<a name="line.8199"></a>
+<span class="sourceLineNo">8200</span>    // Increments carry time range. If an Increment instance, put it on the Get.<a name="line.8200"></a>
+<span class="sourceLineNo">8201</span>    if (tr != null) {<a name="line.8201"></a>
+<span class="sourceLineNo">8202</span>      get.setTimeRange(tr.getMin(), tr.getMax());<a name="line.8202"></a>
+<span class="sourceLineNo">8203</span>    }<a name="line.8203"></a>
+<span class="sourceLineNo">8204</span>    return get(get, false);<a name="line.8204"></a>
+<span class="sourceLineNo">8205</span>  }<a name="line.8205"></a>
+<span class="sourceLineNo">8206</span><a name="line.8206"></a>
+<span class="sourceLineNo">8207</span>  /**<a name="line.8207"></a>
+<span class="sourceLineNo">8208</span>   * @return Sorted list of &lt;code&gt;cells&lt;/code&gt; using &lt;code&gt;comparator&lt;/code&gt;<a name="line.8208"></a>
+<span class="sourceLineNo">8209</span>   */<a name="line.8209"></a>
+<span class="sourceLineNo">8210</span>  private static List&lt;Cell&gt; sort(List&lt;Cell&gt; cells, final CellComparator comparator) {<a name="line.8210"></a>
+<span class="sourceLineNo">8211</span>    cells.sort(comparator);<a name="line.8211"></a>
+<span class="sourceLineNo">8212</span>    return cells;<a name="line.8212"></a>
+<span class="sourceLineNo">8213</span>  }<a name="line.8213"></a>
+<span class="sourceLineNo">8214</span><a name="line.8214"></a>
+<span class="sourceLineNo">8215</span>  public static final long FIXED_OVERHEAD = ClassSize.align(<a name="line.8215"></a>
+<span class="sourceLineNo">8216</span>      ClassSize.OBJECT +<a name="line.8216"></a>
+<span class="sourceLineNo">8217</span>      ClassSize.ARRAY +<a name="line.8217"></a>
+<span class="sourceLineNo">8218</span>      55 * ClassSize.REFERENCE + 3 * Bytes.SIZEOF_INT +<a name="line.8218"></a>
+<span class="sourceLineNo">8219</span>      (15 * Bytes.SIZEOF_LONG) +<a name="line.8219"></a>
+<span class="sourceLineNo">8220</span>      3 * Bytes.SIZEOF_BOOLEAN);<a name="line.8220"></a>
+<span class="sourceLineNo">8221</span><a name="line.8221"></a>
+<span class="sourceLineNo">8222</span>  // woefully out of date - currently missing:<a name="line.8222"></a>
+<span class="sourceLineNo">8223</span>  // 1 x HashMap - coprocessorServiceHandlers<a name="line.8223"></a>
+<span class="sourceLineNo">8224</span>  // 6 x LongAdder - numMutationsWithoutWAL, dataInMemoryWithoutWAL,<a name="line.8224"></a>
+<span class="sourceLineNo">8225</span>  //   checkAndMutateChecksPassed, checkAndMutateChecksFailed, readRequestsCount,<a name="line.8225"></a>
+<span class="sourceLineNo">8226</span>  //   writeRequestsCount, cpRequestsCount<a name="line.8226"></a>
+<span class="sourceLineNo">8227</span>  // 1 x HRegion$WriteState - writestate<a name="line.8227"></a>
+<span class="sourceLineNo">8228</span>  // 1 x RegionCoprocessorHost - coprocessorHost<a name="line.8228"></a>
+<span class="sourceLineNo">8229</span>  // 1 x RegionSplitPolicy - splitPolicy<a name="line.8229"></a>
+<span class="sourceLineNo">8230</span>  // 1 x MetricsRegion - metricsRegion<a name="line.8230"></a>
+<span class="sourceLineNo">8231</span>  // 1 x MetricsRegionWrapperImpl - metricsRegionWrapper<a name="line.8231"></a>
+<span class="sourceLineNo">8232</span>  public static final long DEEP_OVERHEAD = FIXED_OVERHEAD +<a name="line.8232"></a>
+<span class="sourceLineNo">8233</span>      ClassSize.OBJECT + // closeLock<a name="line.8233"></a>
+<span class="sourceLineNo">8234</span>      (2 * ClassSize.ATOMIC_BOOLEAN) + // closed, closing<a name="line.8234"></a>
+<span class="sourceLineNo">8235</span>      (3 * ClassSize.ATOMIC_LONG) + // numPutsWithoutWAL, dataInMemoryWithoutWAL,<a name="line.8235"></a>
+<span class="sourceLineNo">8236</span>                                    // compactionsFailed<a name="line.8236"></a>
+<span class="sourceLineNo">8237</span>      (2 * ClassSize.CONCURRENT_HASHMAP) +  // lockedRows, scannerReadPoints<a name="line.8237"></a>
+<span class="sourceLineNo">8238</span>      WriteState.HEAP_SIZE + // writestate<a name="line.8238"></a>
+<span class="sourceLineNo">8239</span>      ClassSize.CONCURRENT_SKIPLISTMAP + ClassSize.CONCURRENT_SKIPLISTMAP_ENTRY + // stores<a name="line.8239"></a>
+<span class="sourceLineNo">8240</span>      (2 * ClassSize.REENTRANT_LOCK) + // lock, updatesLock<a name="line.8240"></a>
+<span class="sourceLineNo">8241</span>      MultiVersionConcurrencyControl.FIXED_SIZE // mvcc<a name="line.8241"></a>
+<span class="sourceLineNo">8242</span>      + 2 * ClassSize.TREEMAP // maxSeqIdInStores, replicationScopes<a name="line.8242"></a>
+<span class="sourceLineNo">8243</span>      + 2 * ClassSize.ATOMIC_INTEGER // majorInProgress, minorInProgress<a name="line.8243"></a>
+<span class="sourceLineNo">8244</span>      + ClassSize.STORE_SERVICES // store services<a name="line.8244"></a>
+<span class="sourceLineNo">8245</span>      + StoreHotnessProtector.FIXED_SIZE<a name="line.8245"></a>
+<span class="sourceLineNo">8246</span>      ;<a name="line.8246"></a>
+<span class="sourceLineNo">8247</span><a name="line.8247"></a>
+<span class="sourceLineNo">8248</span>  @Override<a name="line.8248"></a>
+<span class="sourceLineNo">8249</span>  public long heapSize() {<a name="line.8249"></a>
+<span class="sourceLineNo">8250</span>    // this does not take into account row locks, recent flushes, mvcc entries, and more<a name="line.8250"></a>
+<span class="sourceLineNo">8251</span>    return DEEP_OVERHEAD + stores.values().stream().mapToLong(HStore::heapSize).sum();<a name="line.8251"></a>
+<span class="sourceLineNo">8252</span>  }<a name="line.8252"></a>
+<span class="sourceLineNo">8253</span><a name="line.8253"></a>
+<span class="sourceLineNo">8254</span>  /**<a name="line.8254"></a>
+<span class="sourceLineNo">8255</span>   * Registers a new protocol buffer {@link Service} subclass as a coprocessor endpoint to<a name="line.8255"></a>
+<span class="sourceLineNo">8256</span>   * be available for handling Region#execService(com.google.protobuf.RpcController,<a name="line.8256"></a>
+<span class="sourceLineNo">8257</span>   *    org.apache.hadoop.hbase.protobuf.generated.ClientProtos.CoprocessorServiceCall) calls.<a name="line.8257"></a>
+<span class="sourceLineNo">8258</span>   *<a name="line.8258"></a>
+<span class="sourceLineNo">8259</span>   * &lt;p&gt;<a name="line.8259"></a>
+<span class="sourceLineNo">8260</span>   * Only a single instance may be registered per region for a given {@link Service} subclass (the<a name="line.8260"></a>
+<span class="sourceLineNo">8261</span>   * instances are keyed on {@link com.google.protobuf.Descriptors.ServiceDescriptor#getFullName()}.<a name="line.8261"></a>
+<span class="sourceLineNo">8262</span>   * After the first registration, subsequent calls with the same service name will fail with<a name="line.8262"></a>
+<span class="sourceLineNo">8263</span>   * a return value of {@code false}.<a name="line.8263"></a>
+<span class="sourceLineNo">8264</span>   * &lt;/p&gt;<a name="line.8264"></a>
+<span class="sourceLineNo">8265</span>   * @param instance the {@code Service} subclass instance to expose as a coprocessor endpoint<a name="line.8265"></a>
+<span class="sourceLineNo">8266</span>   * @return {@code true} if the registration was successful, {@code false}<a name="line.8266"></a>
+<span class="sourceLineNo">8267</span>   * otherwise<a name="line.8267"></a>
+<span class="sourceLineNo">8268</span>   */<a name="line.8268"></a>
+<span class="sourceLineNo">8269</span>  public boolean registerService(com.google.protobuf.Service instance) {<a name="line.8269"></a>
+<span class="sourceLineNo">8270</span>    /*<a name="line.8270"></a>
+<span class="sourceLineNo">8271</span>     * No stacking of instances is allowed for a single service name<a name="line.8271"></a>
+<span class="sourceLineNo">8272</span>     */<a name="line.8272"></a>
+<span class="sourceLineNo">8273</span>    com.google.protobuf.Descriptors.ServiceDescriptor serviceDesc = instance.getDescriptorForType();<a name="line.8273"></a>
+<span class="sourceLineNo">8274</span>    String serviceName = CoprocessorRpcUtils.getServiceName(serviceDesc);<a name="line.8274"></a>
+<span class="sourceLineNo">8275</span>    if (coprocessorServiceHandlers.containsKey(serviceName)) {<a name="line.8275"></a>
+<span class="sourceLineNo">8276</span>      LOG.error("Coprocessor service " + serviceName +<a name="line.8276"></a>
+<span class="sourceLineNo">8277</span>          " already registered, rejecting request from " + instance);<a name="line.8277"></a>
+<span class="sourceLineNo">8278</span>      return false;<a name="line.8278"></a>
+<span class="sourceLineNo">8279</span>    }<a name="line.8279"></a>
+<span class="sourceLineNo">8280</span><a name="line.8280"></a>
+<span class="sourceLineNo">8281</span>    coprocessorServiceHandlers.put(serviceName, instance);<a name="line.8281"></a>
+<span class="sourceLineNo">8282</span>    if (LOG.isDebugEnabled()) {<a name="line.8282"></a>
+<span class="sourceLineNo">8283</span>      LOG.debug("Registered coprocessor service: region=" +<a name="line.8283"></a>
+<span class="sourceLineNo">8284</span>          Bytes.toStringBinary(getRegionInfo().getRegionName()) +<a name="line.8284"></a>
+<span class="sourceLineNo">8285</span>          " service=" + serviceName);<a name="line.8285"></a>
+<span class="sourceLineNo">8286</span>    }<a name="line.8286"></a>
+<span class="sourceLineNo">8287</span>    return true;<a name="line.8287"></a>
+<span class="sourceLineNo">8288</span>  }<a name="line.8288"></a>
+<span class="sourceLineNo">8289</span><a name="line.8289"></a>
+<span class="sourceLineNo">8290</span>  /**<a name="line.8290"></a>
+<span class="sourceLineNo">8291</span>   * Executes a single protocol buffer coprocessor endpoint {@link Service} method using<a name="line.8291"></a>
+<span class="sourceLineNo">8292</span>   * the registered protocol handlers.  {@link Service} implementations must be registered via the<a name="line.8292"></a>
+<span class="sourceLineNo">8293</span>   * {@link #registerService(com.google.protobuf.Service)}<a name="line.8293"></a>
+<span class="sourceLineNo">8294</span>   * method before they are available.<a name="line.8294"></a>
+<span class="sourceLineNo">8295</span>   *<a name="line.8295"></a>
+<span class="sourceLineNo">8296</span>   * @param controller an {@code RpcContoller} implementation to pass to the invoked service<a name="line.8296"></a>
+<span class="sourceLineNo">8297</span>   * @param call a {@code CoprocessorServiceCall} instance identifying the service, method,<a name="line.8297"></a>
+<span class="sourceLineNo">8298</span>   *     and parameters for the method invocation<a name="line.8298"></a>
+<span class="sourceLineNo">8299</span>   * @return a protocol buffer {@code Message} instance containing the method's result<a name="line.8299"></a>
+<span class="sourceLineNo">8300</span>   * @throws IOException if no registered service handler is found or an error<a name="line.8300"></a>
+<span class="sourceLineNo">8301</span>   *     occurs during the invocation<a name="line.8301"></a>
+<span class="sourceLineNo">8302</span>   * @see #registerService(com.google.protobuf.Service)<a name="line.8302"></a>
+<span class="sourceLineNo">8303</span>   */<a name="line.8303"></a>
+<span class="sourceLineNo">8304</span>  public com.google.protobuf.Message execService(com.google.protobuf.RpcController controller,<a name="line.8304"></a>
+<span class="sourceLineNo">8305</span>      CoprocessorServiceCall call) throws IOException {<a name="line.8305"></a>
+<span class="sourceLineNo">8306</span>    String serviceName = call.getServiceName();<a name="line.8306"></a>
+<span class="sourceLineNo">8307</span>    com.google.protobuf.Service service = coprocessorServiceHandlers.get(serviceName);<a name="line.8307"></a>
+<span class="sourceLineNo">8308</span>    if (service == null) {<a name="line.8308"></a>
+<span class="sourceLineNo">8309</span>      throw new UnknownProtocolException(null, "No registered coprocessor service found for " +<a name="line.8309"></a>
+<span class="sourceLineNo">8310</span>          serviceName + " in region " + Bytes.toStringBinary(getRegionInfo().getRegionName()));<a name="line.8310"></a>
+<span class="sourceLineNo">8311</span>    }<a name="line.8311"></a>
+<span class="sourceLineNo">8312</span>    com.google.protobuf.Descriptors.ServiceDescriptor serviceDesc = service.getDescriptorForType();<a name="line.8312"></a>
 <span class="sourceLineNo">8313</span><a name="line.8313"></a>
-<span class="sourceLineNo">8314</span>    com.google.protobuf.Message.Builder builder =<a name="line.8314"></a>
-<span class="sourceLineNo">8315</span>        service.getRequestPrototype(methodDesc).newBuilderForType();<a name="line.8315"></a>
-<span class="sourceLineNo">8316</span><a name="line.8316"></a>
-<span class="sourceLineNo">8317</span>    org.apache.hadoop.hbase.protobuf.ProtobufUtil.mergeFrom(builder,<a name="line.8317"></a>
-<span class="sourceLineNo">8318</span>        call.getRequest().toByteArray());<a name="line.8318"></a>
-<span class="sourceLineNo">8319</span>    com.google.protobuf.Message request =<a name="line.8319"></a>
-<span class="sourceLineNo">8320</span>        CoprocessorRpcUtils.getRequest(service, methodDesc, call.getRequest());<a name="line.8320"></a>
+<span class="sourceLineNo">8314</span>    cpRequestsCount.increment();<a name="line.8314"></a>
+<span class="sourceLineNo">8315</span>    String methodName = call.getMethodName();<a name="line.8315"></a>
+<span class="sourceLineNo">8316</span>    com.google.protobuf.Descriptors.MethodDescriptor methodDesc =<a name="line.8316"></a>
+<span class="sourceLineNo">8317</span>        CoprocessorRpcUtils.getMethodDescriptor(methodName, serviceDesc);<a name="line.8317"></a>
+<span class="sourceLineNo">8318</span><a name="line.8318"></a>
+<span class="sourceLineNo">8319</span>    com.google.protobuf.Message.Builder builder =<a name="line.8319"></a>
+<span class="sourceLineNo">8320</span>        service.getRequestPrototype(methodDesc).newBuilderForType();<a name="line.8320"></a>
 <span class="sourceLineNo">8321</span><a name="line.8321"></a>
-<span class="sourceLineNo">8322</span>    if (coprocessorHost != null) {<a name="line.8322"></a>
-<span class="sourceLineNo">8323</span>      request = coprocessorHost.preEndpointInvocation(service, methodName, request);<a name="line.8323"></a>
-<span class="sourceLineNo">8324</span>    }<a name="line.8324"></a>
-<span class="sourceLineNo">8325</span><a name="line.8325"></a>
-<span class="sourceLineNo">8326</span>    final com.google.protobuf.Message.Builder responseBuilder =<a name="line.8326"></a>
-<span class="sourceLineNo">8327</span>        service.getResponsePrototype(methodDesc).newBuilderForType();<a name="line.8327"></a>
-<span class="sourceLineNo">8328</span>    service.callMethod(methodDesc, controller, request,<a name="line.8328"></a>
-<span class="sourceLineNo">8329</span>        new com.google.protobuf.RpcCallback&lt;com.google.protobuf.Message&gt;() {<a name="line.8329"></a>
-<span class="sourceLineNo">8330</span>      @Override<a name="line.8330"></a>
-<span class="sourceLineNo">8331</span>      public void run(com.google.protobuf.Message message) {<a name="line.8331"></a>
-<span class="sourceLineNo">8332</span>        if (message != null) {<a name="line.8332"></a>
-<span class="sourceLineNo">8333</span>          responseBuilder.mergeFrom(message);<a name="line.8333"></a>
-<span class="sourceLineNo">8334</span>        }<a name="line.8334"></a>
-<span class="sourceLineNo">8335</span>      }<a name="line.8335"></a>
-<span class="sourceLineNo">8336</span>    });<a name="line.8336"></a>
-<span class="sourceLineNo">8337</span><a name="line.8337"></a>
-<span class="sourceLineNo">8338</span>    if (coprocessorHost != null) {<a name="line.8338"></a>
-<span class="sourceLineNo">8339</span>      coprocessorHost.postEndpointInvocation(service, methodName, request, responseBuilder);<a name="line.8339"></a>
-<span class="sourceLineNo">8340</span>    }<a name="line.8340"></a>
-<span class="sourceLineNo">8341</span>    IOException exception =<a name="line.8341"></a>
-<span class="sourceLineNo">8342</span>        org.apache.hadoop.hbase.ipc.CoprocessorRpcUtils.getControllerException(controller);<a name="line.8342"></a>
-<span class="sourceLineNo">8343</span>    if (exception != null) {<a name="line.8343"></a>
-<span class="sourceLineNo">8344</span>      throw exception;<a name="line.8344"></a>
+<span class="sourceLineNo">8322</span>    org.apache.hadoop.hbase.protobuf.ProtobufUtil.mergeFrom(builder,<a name="line.8322"></a>
+<span class="sourceLineNo">8323</span>        call.getRequest().toByteArray());<a name="line.8323"></a>
+<span class="sourceLineNo">8324</span>    com.google.protobuf.Message request =<a name="line.8324"></a>
+<span class="sourceLineNo">8325</span>        CoprocessorRpcUtils.getRequest(service, methodDesc, call.getRequest());<a name="line.8325"></a>
+<span class="sourceLineNo">8326</span><a name="line.8326"></a>
+<span class="sourceLineNo">8327</span>    if (coprocessorHost != null) {<a name="line.8327"></a>
+<span class="sourceLineNo">8328</span>      request = coprocessorHost.preEndpointInvocation(service, methodName, request);<a name="line.8328"></a>
+<span class="sourceLineNo">8329</span>    }<a name="line.8329"></a>
+<span class="sourceLineNo">8330</span><a name="line.8330"></a>
+<span class="sourceLineNo">8331</span>    final com.google.protobuf.Message.Builder responseBuilder =<a name="line.8331"></a>
+<span class="sourceLineNo">8332</span>        service.getResponsePrototype(methodDesc).newBuilderForType();<a name="line.8332"></a>
+<span class="sourceLineNo">8333</span>    service.callMethod(methodDesc, controller, request,<a name="line.8333"></a>
+<span class="sourceLineNo">8334</span>        new com.google.protobuf.RpcCallback&lt;com.google.protobuf.Message&gt;() {<a name="line.8334"></a>
+<span class="sourceLineNo">8335</span>      @Override<a name="line.8335"></a>
+<span class="sourceLineNo">8336</span>      public void run(com.google.protobuf.Message message) {<a name="line.8336"></a>
+<span class="sourceLineNo">8337</span>        if (message != null) {<a name="line.8337"></a>
+<span class="sourceLineNo">8338</span>          responseBuilder.mergeFrom(message);<a name="line.8338"></a>
+<span class="sourceLineNo">8339</span>        }<a name="line.8339"></a>
+<span class="sourceLineNo">8340</span>      }<a name="line.8340"></a>
+<span class="sourceLineNo">8341</span>    });<a name="line.8341"></a>
+<span class="sourceLineNo">8342</span><a name="line.8342"></a>
+<span class="sourceLineNo">8343</span>    if (coprocessorHost != null) {<a name="line.8343"></a>
+<span class="sourceLineNo">8344</span>      coprocessorHost.postEndpointInvocation(service, methodName, request, responseBuilder);<a name="line.8344"></a>
 <span class="sourceLineNo">8345</span>    }<a name="line.8345"></a>
-<span class="sourceLineNo">8346</span><a name="line.8346"></a>
-<span class="sourceLineNo">8347</span>    return responseBuilder.build();<a name="line.8347"></a>
-<span class="sourceLineNo">8348</span>  }<a name="line.8348"></a>
-<span class="sourceLineNo">8349</span><a name="line.8349"></a>
-<span class="sourceLineNo">8350</span>  boolean shouldForceSplit() {<a name="line.8350"></a>
-<span class="sourceLineNo">8351</span>    return this.splitRequest;<a name="line.8351"></a>
-<span class="sourceLineNo">8352</span>  }<a name="line.8352"></a>
-<span class="sourceLineNo">8353</span><a name="line.8353"></a>
-<span class="sourceLineNo">8354</span>  byte[] getExplicitSplitPoint() {<a name="line.8354"></a>
-<span class="sourceLineNo">8355</span>    return this.explicitSplitPoint;<a name="line.8355"></a>
-<span class="sourceLineNo">8356</span>  }<a name="line.8356"></a>
-<span class="sourceLineNo">8357</span><a name="line.8357"></a>
-<span class="sourceLineNo">8358</span>  void forceSplit(byte[] sp) {<a name="line.8358"></a>
-<span class="sourceLineNo">8359</span>    // This HRegion will go away after the forced split is successful<a name="line.8359"></a>
-<span class="sourceLineNo">8360</span>    // But if a forced split fails, we need to clear forced split.<a name="line.8360"></a>
-<span class="sourceLineNo">8361</span>    this.splitRequest = true;<a name="line.8361"></a>
-<span class="sourceLineNo">8362</span>    if (sp != null) {<a name="line.8362"></a>
-<span class="sourceLineNo">8363</span>      this.explicitSplitPoint = sp;<a name="line.8363"></a>
-<span class="sourceLineNo">8364</span>    }<a name="line.8364"></a>
-<span class="sourceLineNo">8365</span>  }<a name="line.8365"></a>
-<span class="sourceLineNo">8366</span><a name="line.8366"></a>
-<span class="sourceLineNo">8367</span>  void clearSplit() {<a name="line.8367"></a>
-<span class="sourceLineNo">8368</span>    this.splitRequest = false;<a name="line.8368"></a>
-<span class="sourceLineNo">8369</span>    this.explicitSplitPoint = null;<a name="line.8369"></a>
+<span class="sourceLineNo">8346</span>    IOException exception =<a name="line.8346"></a>
+<span class="sourceLineNo">8347</span>        org.apache.hadoop.hbase.ipc.CoprocessorRpcUtils.getControllerException(controller);<a name="line.8347"></a>
+<span class="sourceLineNo">8348</span>    if (exception != null) {<a name="line.8348"></a>
+<span class="sourceLineNo">8349</span>      throw exception;<a name="line.8349"></a>
+<span class="sourceLineNo">8350</span>    }<a name="line.8350"></a>
+<span class="sourceLineNo">8351</span><a name="line.8351"></a>
+<span class="sourceLineNo">8352</span>    return responseBuilder.build();<a name="line.8352"></a>
+<span class="sourceLineNo">8353</span>  }<a name="line.8353"></a>
+<span class="sourceLineNo">8354</span><a name="line.8354"></a>
+<span class="sourceLineNo">8355</span>  boolean shouldForceSplit() {<a name="line.8355"></a>
+<span class="sourceLineNo">8356</span>    return this.splitRequest;<a name="line.8356"></a>
+<span class="sourceLineNo">8357</span>  }<a name="line.8357"></a>
+<span class="sourceLineNo">8358</span><a name="line.8358"></a>
+<span class="sourceLineNo">8359</span>  byte[] getExplicitSplitPoint() {<a name="line.8359"></a>
+<span class="sourceLineNo">8360</span>    return this.explicitSplitPoint;<a name="line.8360"></a>
+<span class="sourceLineNo">8361</span>  }<a name="line.8361"></a>
+<span class="sourceLineNo">8362</span><a name="line.8362"></a>
+<span class="sourceLineNo">8363</span>  void forceSplit(byte[] sp) {<a name="line.8363"></a>
+<span class="sourceLineNo">8364</span>    // This HRegion will go away after the forced split is successful<a name="line.8364"></a>
+<span class="sourceLineNo">8365</span>    // But if a forced split fails, we need to clear forced split.<a name="line.8365"></a>
+<span class="sourceLineNo">8366</span>    this.splitRequest = true;<a name="line.8366"></a>
+<span class="sourceLineNo">8367</span>    if (sp != null) {<a name="line.8367"></a>
+<span class="sourceLineNo">8368</span>      this.explicitSplitPoint = sp;<a name="line.8368"></a>
+<span class="sourceLineNo">8369</span>    }<a name="line.8369"></a>
 <span class="sourceLineNo">8370</span>  }<a name="line.8370"></a>
 <span class="sourceLineNo">8371</span><a name="line.8371"></a>
-<span class="sourceLineNo">8372</span>  /**<a name="line.8372"></a>
-<span class="sourceLineNo">8373</span>   * Return the splitpoint. null indicates the region isn't splittable<a name="line.8373"></a>
-<span class="sourceLineNo">8374</span>   * If the splitpoint isn't explicitly specified, it will go over the stores<a name="line.8374"></a>
-<span class="sourceLineNo">8375</span>   * to find the best splitpoint. Currently the criteria of best splitpoint<a name="line.8375"></a>
-<span class="sourceLineNo">8376</span>   * is based on the size of the store.<a name="line.8376"></a>
-<span class="sourceLineNo">8377</span>   */<a name="line.8377"></a>
-<span class="sourceLineNo">8378</span>  public byte[] checkSplit() {<a name="line.8378"></a>
-<span class="sourceLineNo">8379</span>    // Can't split META<a name="line.8379"></a>
-<span class="sourceLineNo">8380</span>    if (this.getRegionInfo().isMetaRegion()) {<a name="line.8380"></a>
-<span class="sourceLineNo">8381</span>      if (shouldForceSplit()) {<a name="line.8381"></a>
-<span class="sourceLineNo">8382</span>        LOG.warn("Cannot split meta region in HBase 0.20 and above");<a name="line.8382"></a>
-<span class="sourceLineNo">8383</span>      }<a name="line.8383"></a>
-<span class="sourceLineNo">8384</span>      return null;<a name="line.8384"></a>
-<span class="sourceLineNo">8385</span>    }<a name="line.8385"></a>
-<span class="sourceLineNo">8386</span><a name="line.8386"></a>
-<span class="sourceLineNo">8387</span>    // Can't split a region that is closing.<a name="line.8387"></a>
-<span class="sourceLineNo">8388</span>    if (this.isClosing()) {<a name="line.8388"></a>
+<span class="sourceLineNo">8372</span>  void clearSplit() {<a name="line.8372"></a>
+<span class="sourceLineNo">8373</span>    this.splitRequest = false;<a name="line.8373"></a>
+<span class="sourceLineNo">8374</span>    this.explicitSplitPoint = null;<a name="line.8374"></a>
+<span class="sourceLineNo">8375</span>  }<a name="line.8375"></a>
+<span class="sourceLineNo">8376</span><a name="line.8376"></a>
+<span class="sourceLineNo">8377</span>  /**<a name="line.8377"></a>
+<span class="sourceLineNo">8378</span>   * Return the splitpoint. null indicates the region isn't splittable<a name="line.8378"></a>
+<span class="sourceLineNo">8379</span>   * If the splitpoint isn't explicitly specified, it will go over the stores<a name="line.8379"></a>
+<span class="sourceLineNo">8380</span>   * to find the best splitpoint. Currently the criteria of best splitpoint<a name="line.8380"></a>
+<span class="sourceLineNo">8381</span>   * is based on the size of the store.<a name="line.8381"></a>
+<span class="sourceLineNo">8382</span>   */<a name="line.8382"></a>
+<span class="sourceLineNo">8383</span>  public byte[] checkSplit() {<a name="line.8383"></a>
+<span class="sourceLineNo">8384</span>    // Can't split META<a name="line.8384"></a>
+<span class="sourceLineNo">8385</span>    if (this.getRegionInfo().isMetaRegion()) {<a name="line.8385"></a>
+<span class="sourceLineNo">8386</span>      if (shouldForceSplit()) {<a name="line.8386"></a>
+<span class="sourceLineNo">8387</span>        LOG.warn("Cannot split meta region in HBase 0.20 and above");<a name="line.8387"></a>
+<span class="sourceLineNo">8388</span>      }<a name="line.8388"></a>
 <span class="sourceLineNo">8389</span>      return null;<a name="line.8389"></a>
 <span class="sourceLineNo">8390</span>    }<a name="line.8390"></a>
 <span class="sourceLineNo">8391</span><a name="line.8391"></a>
-<span class="sourceLineNo">8392</span>    if (!splitPolicy.shouldSplit()) {<a name="line.8392"></a>
-<span class="sourceLineNo">8393</span>      return null;<a name="line.8393"></a>
-<span class="sourceLineNo">8394</span>    }<a name="line.8394"></a>
-<span class="sourceLineNo">8395</span><a name="line.8395"></a>
-<span class="sourceLineNo">8396</span>    byte[] ret = splitPolicy.getSplitPoint();<a name="line.8396"></a>
-<span class="sourceLineNo">8397</span><a name="line.8397"></a>
-<span class="sourceLineNo">8398</span>    if (ret != null) {<a name="line.8398"></a>
-<span class="sourceLineNo">8399</span>      try {<a name="line.8399"></a>
-<span class="sourceLineNo">8400</span>        checkRow(ret, "calculated split");<a name="line.8400"></a>
-<span class="sourceLineNo">8401</span>      } catch (IOException e) {<a name="line.8401"></a>
-<span class="sourceLineNo">8402</span>        LOG.error("Ignoring invalid split", e);<a name="line.8402"></a>
-<span class="sourceLineNo">8403</span>        return null;<a name="line.8403"></a>
-<span class="sourceLineNo">8404</span>      }<a name="line.8404"></a>
-<span class="sourceLineNo">8405</span>    }<a name="line.8405"></a>
-<span class="sourceLineNo">8406</span>    return ret;<a name="line.8406"></a>
-<span class="sourceLineNo">8407</span>  }<a name="line.8407"></a>
-<span class="sourceLineNo">8408</span><a name="line.8408"></a>
-<span class="sourceLineNo">8409</span>  /**<a name="line.8409"></a>
-<span class="sourceLineNo">8410</span>   * @return The priority that this region should have in the compaction queue<a name="line.8410"></a>
-<span class="sourceLineNo">8411</span>   */<a name="line.8411"></a>
-<span class="sourceLineNo">8412</span>  public int getCompactPriority() {<a name="line.8412"></a>
-<span class="sourceLineNo">8413</span>    return stores.values().stream().mapToInt(HStore::getCompactPriority).min()<a name="line.8413"></a>
-<span class="sourceLineNo">8414</span>        .orElse(Store.NO_PRIORITY);<a name="line.8414"></a>
-<span class="sourceLineNo">8415</span>  }<a name="line.8415"></a>
-<span class="sourceLineNo">8416</span><a name="line.8416"></a>
-<span class="sourceLineNo">8417</span>  /** @return the coprocessor host */<a name="line.8417"></a>
-<span class="sourceLineNo">8418</span>  public RegionCoprocessorHost getCoprocessorHost() {<a name="line.8418"></a>
-<span class="sourceLineNo">8419</span>    return coprocessorHost;<a name="line.8419"></a>
+<span class="sourceLineNo">8392</span>    // Can't split a region that is closing.<a name="line.8392"></a>
+<span class="sourceLineNo">8393</span>    if (this.isClosing()) {<a name="line.8393"></a>
+<span class="sourceLineNo">8394</span>      return null;<a name="line.8394"></a>
+<span class="sourceLineNo">8395</span>    }<a name="line.8395"></a>
+<span class="sourceLineNo">8396</span><a name="line.8396"></a>
+<span class="sourceLineNo">8397</span>    if (!splitPolicy.shouldSplit()) {<a name="line.8397"></a>
+<span class="sourceLineNo">8398</span>      return null;<a name="line.8398"></a>
+<span class="sourceLineNo">8399</span>    }<a name="line.8399"></a>
+<span class="sourceLineNo">8400</span><a name="line.8400"></a>
+<span class="sourceLineNo">8401</span>    byte[] ret = splitPolicy.getSplitPoint();<a name="line.8401"></a>
+<span class="sourceLineNo">8402</span><a name="line.8402"></a>
+<span class="sourceLineNo">8403</span>    if (ret != null) {<a name="line.8403"></a>
+<span class="sourceLineNo">8404</span>      try {<a name="line.8404"></a>
+<span class="sourceLineNo">8405</span>        checkRow(ret, "calculated split");<a name="line.8405"></a>
+<span class="sourceLineNo">8406</span>      } catch (IOException e) {<a name="line.8406"></a>
+<span class="sourceLineNo">8407</span>        LOG.error("Ignoring invalid split", e);<a name="line.8407"></a>
+<span class="sourceLineNo">8408</span>        return null;<a name="line.8408"></a>
+<span class="sourceLineNo">8409</span>      }<a name="line.8409"></a>
+<span class="sourceLineNo">8410</span>    }<a name="line.8410"></a>
+<span class="sourceLineNo">8411</span>    return ret;<a name="line.8411"></a>
+<span class="sourceLineNo">8412</span>  }<a name="line.8412"></a>
+<span class="sourceLineNo">8413</span><a name="line.8413"></a>
+<span class="sourceLineNo">8414</span>  /**<a name="line.8414"></a>
+<span class="sourceLineNo">8415</span>   * @return The priority that this region should have in the compaction queue<a name="line.8415"></a>
+<span class="sourceLineNo">8416</span>   */<a name="line.8416"></a>
+<span class="sourceLineNo">8417</span>  public int getCompactPriority() {<a name="line.8417"></a>
+<span class="sourceLineNo">8418</span>    return stores.values().stream().mapToInt(HStore::getCompactPriority).min()<a name="line.8418"></a>
+<span class="sourceLineNo">8419</span>        .orElse(Store.NO_PRIORITY);<a name="line.8419"></a>
 <span class="sourceLineNo">8420</span>  }<a name="line.8420"></a>
 <span class="sourceLineNo">8421</span><a name="line.8421"></a>
-<span class="sourceLineNo">8422</span>  /** @param coprocessorHost the new coprocessor host */<a name="line.8422"></a>
-<span class="sourceLineNo">8423</span>  @VisibleForTesting<a name="line.8423"></a>
-<span class="sourceLineNo">8424</span>  public void setCoprocessorHost(final RegionCoprocessorHost coprocessorHost) {<a name="line.8424"></a>
-<span class="sourceLineNo">8425</span>    this.coprocessorHost = coprocessorHost;<a name="line.8425"></a>
-<span class="sourceLineNo">8426</span>  }<a name="line.8426"></a>
-<span class="sourceLineNo">8427</span><a name="line.8427"></a>
-<span class="sourceLineNo">8428</span>  @Override<a name="line.8428"></a>
-<span class="sourceLineNo">8429</span>  public void startRegionOperation() throws IOException {<a name="line.8429"></a>
-<span class="sourceLineNo">8430</span>    startRegionOperation(Operation.ANY);<a name="line.8430"></a>
+<span class="sourceLineNo">8422</span>  /** @return the coprocessor host */<a name="line.8422"></a>
+<span class="sourceLineNo">8423</span>  public RegionCoprocessorHost getCoprocessorHost() {<a name="line.8423"></a>
+<span class="sourceLineNo">8424</span>    return coprocessorHost;<a name="line.8424"></a>
+<span class="sourceLineNo">8425</span>  }<a name="line.8425"></a>
+<span class="sourceLineNo">8426</span><a name="line.8426"></a>
+<span class="sourceLineNo">8427</span>  /** @param coprocessorHost the new coprocessor host */<a name="line.8427"></a>
+<span class="sourceLineNo">8428</span>  @VisibleForTesting<a name="line.8428"></a>
+<span class="sourceLineNo">8429</span>  public void setCoprocessorHost(final RegionCoprocessorHost coprocessorHost) {<a name="line.8429"></a>
+<span class="sourceLineNo">8430</span>    this.coprocessorHost = coprocessorHost;<a name="line.8430"></a>
 <span class="sourceLineNo">8431</span>  }<a name="line.8431"></a>
 <span class="sourceLineNo">8432</span><a name="line.8432"></a>
 <span class="sourceLineNo">8433</span>  @Override<a name="line.8433"></a>
-<span class="sourceLineNo">8434</span>  public void startRegionOperation(Operation op) throws IOException {<a name="line.8434"></a>
-<span class="sourceLineNo">8435</span>    switch (op) {<a name="line.8435"></a>
-<span class="sourceLineNo">8436</span>      case GET:  // read operations<a name="line.8436"></a>
-<span class="sourceLineNo">8437</span>      case SCAN:<a name="line.8437"></a>
-<span class="sourceLineNo">8438</span>        checkReadsEnabled();<a name="line.8438"></a>
-<span class="sourceLineNo">8439</span>        break;<a name="line.8439"></a>
-<span class="sourceLineNo">8440</span>      default:<a name="line.8440"></a>
-<span class="sourceLineNo">8441</span>        break;<a name="line.8441"></a>
-<span class="sourceLineNo">8442</span>    }<a name="line.8442"></a>
-<span class="sourceLineNo">8443</span>    if (op == Operation.MERGE_REGION || op == Operation.SPLIT_REGION<a name="line.8443"></a>
-<span class="sourceLineNo">8444</span>        || op == Operation.COMPACT_REGION || op == Operation.COMPACT_SWITCH) {<a name="line.8444"></a>
-<span class="sourceLineNo">8445</span>      // split, merge or compact region doesn't need to check the closing/closed state or lock the<a name="line.8445"></a>
-<span class="sourceLineNo">8446</span>      // region<a name="line.8446"></a>
-<span class="sourceLineNo">8447</span>      return;<a name="line.8447"></a>
-<span class="sourceLineNo">8448</span>    }<a name="line.8448"></a>
-<span class="sourceLineNo">8449</span>    if (this.closing.get()) {<a name="line.8449"></a>
-<span class="sourceLineNo">8450</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closing");<a name="line.8450"></a>
-<span class="sourceLineNo">8451</span>    }<a name="line.8451"></a>
-<span class="sourceLineNo">8452</span>    lock(lock.readLock());<a name="line.8452"></a>
-<span class="sourceLineNo">8453</span>    if (this.closed.get()) {<a name="line.8453"></a>
-<span class="sourceLineNo">8454</span>      lock.readLock().unlock();<a name="line.8454"></a>
-<span class="sourceLineNo">8455</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closed");<a name="line.8455"></a>
+<span class="sourceLineNo">8434</span>  public void startRegionOperation() throws IOException {<a name="line.8434"></a>
+<span class="sourceLineNo">8435</span>    startRegionOperation(Operation.ANY);<a name="line.8435"></a>
+<span class="sourceLineNo">8436</span>  }<a name="line.8436"></a>
+<span class="sourceLineNo">8437</span><a name="line.8437"></a>
+<span class="sourceLineNo">8438</span>  @Override<a name="line.8438"></a>
+<span class="sourceLineNo">8439</span>  public void startRegionOperation(Operation op) throws IOException {<a name="line.8439"></a>
+<span class="sourceLineNo">8440</span>    switch (op) {<a name="line.8440"></a>
+<span class="sourceLineNo">8441</span>      case GET:  // read operations<a name="line.8441"></a>
+<span class="sourceLineNo">8442</span>      case SCAN:<a name="line.8442"></a>
+<span class="sourceLineNo">8443</span>        checkReadsEnabled();<a name="line.8443"></a>
+<span class="sourceLineNo">8444</span>        break;<a name="line.8444"></a>
+<span class="sourceLineNo">8445</span>      default:<a name="line.8445"></a>
+<span class="sourceLineNo">8446</span>        break;<a name="line.8446"></a>
+<span class="sourceLineNo">8447</span>    }<a name="line.8447"></a>
+<span class="sourceLineNo">8448</span>    if (op == Operation.MERGE_REGION || op == Operation.SPLIT_REGION<a name="line.8448"></a>
+<span class="sourceLineNo">8449</span>        || op == Operation.COMPACT_REGION || op == Operation.COMPACT_SWITCH) {<a name="line.8449"></a>
+<span class="sourceLineNo">8450</span>      // split, merge or compact region doesn't need to check the closing/closed state or lock the<a name="line.8450"></a>
+<span class="sourceLineNo">8451</span>      // region<a name="line.8451"></a>
+<span class="sourceLineNo">8452</span>      return;<a name="line.8452"></a>
+<span class="sourceLineNo">8453</span>    }<a name="line.8453"></a>
+<span class="sourceLineNo">8454</span>    if (this.closing.get()) {<a name="line.8454"></a>
+<span class="sourceLineNo">8455</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closing");<a name="line.8455"></a>
 <span class="sourceLineNo">8456</span>    }<a name="line.8456"></a>
-<span class="sourceLineNo">8457</span>    // The unit for snapshot is a region. So, all stores for this region must be<a name="line.8457"></a>
-<span class="sourceLineNo">8458</span>    // prepared for snapshot operation before proceeding.<a name="line.8458"></a>
-<span class="sourceLineNo">8459</span>    if (op == Operation.SNAPSHOT) {<a name="line.8459"></a>
-<span class="sourceLineNo">8460</span>      stores.values().forEach(HStore::preSnapshotOperation);<a name="line.8460"></a>
+<span class="sourceLineNo">8457</span>    lock(lock.readLock());<a name="line.8457"></a>
+<span class="sourceLineNo">8458</span>    if (this.closed.get()) {<a name="line.8458"></a>
+<span class="sourceLineNo">8459</span>      lock.readLock().unlock();<a name="line.8459"></a>
+<span class="sourceLineNo">8460</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closed");<a name="line.8460"></a>
 <span class="sourceLineNo">8461</span>    }<a name="line.8461"></a>
-<span class="sourceLineNo">8462</span>    try {<a name="line.8462"></a>
-<span class="sourceLineNo">8463</span>      if (coprocessorHost != null) {<a name="line.8463"></a>
-<span class="sourceLineNo">8464</span>        coprocessorHost.postStartRegionOperation(op);<a name="line.8464"></a>
-<span class="sourceLineNo">8465</span>      }<a name="line.8465"></a>
-<span class="sourceLineNo">8466</span>    } catch (Exception e) {<a name="line.8466"></a>
-<span class="sourceLineNo">8467</span>      lock.readLock().unlock();<a name="line.8467"></a>
-<span class="sourceLineNo">8468</span>      throw new IOException(e);<a name="line.8468"></a>
-<span class="sourceLineNo">8469</span>    }<a name="line.8469"></a>
-<span class="sourceLineNo">8470</span>  }<a name="line.8470"></a>
-<span class="sourceLineNo">8471</span><a name="line.8471"></a>
-<span class="sourceLineNo">8472</span>  @Override<a name="line.8472"></a>
-<span class="sourceLineNo">8473</span>  public void closeRegionOperation() throws IOException {<a name="line.8473"></a>
-<span class="sourceLineNo">8474</span>    closeRegionOperation(Operation.ANY);<a name="line.8474"></a>
+<span class="sourceLineNo">8462</span>    // The unit for snapshot is a region. So, all stores for this region must be<a name="line.8462"></a>
+<span class="sourceLineNo">8463</span>    // prepared for snapshot operation before proceeding.<a name="line.8463"></a>
+<span class="sourceLineNo">8464</span>    if (op == Operation.SNAPSHOT) {<a name="line.8464"></a>
+<span class="sourceLineNo">8465</span>      stores.values().forEach(HStore::preSnapshotOperation);<a name="line.8465"></a>
+<span class="sourceLineNo">8466</span>    }<a name="line.8466"></a>
+<span class="sourceLineNo">8467</span>    try {<a name="line.8467"></a>
+<span class="sourceLineNo">8468</span>      if (coprocessorHost != null) {<a name="line.8468"></a>
+<span class="sourceLineNo">8469</span>        coprocessorHost.postStartRegionOperation(op);<a name="line.8469"></a>
+<span class="sourceLineNo">8470</span>      }<a name="line.8470"></a>
+<span class="sourceLineNo">8471</span>    } catch (Exception e) {<a name="line.8471"></a>
+<span class="sourceLineNo">8472</span>      lock.readLock().unlock();<a name="line.8472"></a>
+<span class="sourceLineNo">8473</span>      throw new IOException(e);<a name="line.8473"></a>
+<span class="sourceLineNo">8474</span>    }<a name="line.8474"></a>
 <span class="sourceLineNo">8475</span>  }<a name="line.8475"></a>
 <span class="sourceLineNo">8476</span><a name="line.8476"></a>
 <span class="sourceLineNo">8477</span>  @Override<a name="line.8477"></a>
-<span class="sourceLineNo">8478</span>  public void closeRegionOperation(Operation operation) throws IOException {<a name="line.8478"></a>
-<span class="sourceLineNo">8479</span>    if (operation == Operation.SNAPSHOT) {<a name="line.8479"></a>
-<span class="sourceLineNo">8480</span>      stores.values().forEach(HStore::postSnapshotOperation);<a name="line.8480"></a>
-<span class="sourceLineNo">8481</span>    }<a name="line.8481"></a>
-<span class="sourceLineNo">8482</span>    lock.readLock().unlock();<a name="line.8482"></a>
-<span class="sourceLineNo">8483</span>    if (coprocessorHost != null) {<a name="line.8483"></a>
-<span class="sourceLineNo">8484</span>      coprocessorHost.postCloseRegionOperation(operation);<a name="line.8484"></a>
-<span class="sourceLineNo">8485</span>    }<a name="line.8485"></a>
-<span class="sourceLineNo">8486</span>  }<a name="line.8486"></a>
-<span class="sourceLineNo">8487</span><a name="line.8487"></a>
-<span class="sourceLineNo">8488</span>  /**<a name="line.8488"></a>
-<span class="sourceLineNo">8489</span>   * This method needs to be called before any public call that reads or<a name="line.8489"></a>
-<span class="sourceLineNo">8490</span>   * modifies stores in bulk. It has to be called just before a try.<a name="line.8490"></a>
-<span class="sourceLineNo">8491</span>   * #closeBulkRegionOperation needs to be called in the try's finally block<a name="line.8491"></a>
-<span class="sourceLineNo">8492</span>   * Acquires a writelock and checks if the region is closing or closed.<a name="line.8492"></a>
-<span class="sourceLineNo">8493</span>   * @throws NotServingRegionException when the region is closing or closed<a name="line.8493"></a>
-<span class="sourceLineNo">8494</span>   * @throws RegionTooBusyException if failed to get the lock in time<a name="line.8494"></a>
-<span class="sourceLineNo">8495</span>   * @throws InterruptedIOException if interrupted while waiting for a lock<a name="line.8495"></a>
-<span class="sourceLineNo">8496</span>   */<a name="line.8496"></a>
-<span class="sourceLineNo">8497</span>  private void startBulkRegionOperation(boolean writeLockNeeded)<a name="line.8497"></a>
-<span class="sourceLineNo">8498</span>      throws NotServingRegionException, RegionTooBusyException, InterruptedIOException {<a name="line.8498"></a>
-<span class="sourceLineNo">8499</span>    if (this.closing.get()) {<a name="line.8499"></a>
-<span class="sourceLineNo">8500</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closing");<a name="line.8500"></a>
-<span class="sourceLineNo">8501</span>    }<a name="line.8501"></a>
-<span class="sourceLineNo">8502</span>    if (writeLockNeeded) lock(lock.writeLock());<a name="line.8502"></a>
-<span class="sourceLineNo">8503</span>    else lock(lock.readLock());<a name="line.8503"></a>
-<span class="sourceLineNo">8504</span>    if (this.closed.get()) {<a name="line.8504"></a>
-<span class="sourceLineNo">8505</span>      if (writeLockNeeded) lock.writeLock().unlock();<a name="line.8505"></a>
-<span class="sourceLineNo">8506</span>      else lock.readLock().unlock();<a name="line.8506"></a>
-<span class="sourceLineNo">8507</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closed");<a name="line.8507"></a>
-<span class="sourceLineNo">8508</span>    }<a name="line.8508"></a>
-<span class="sourceLineNo">8509</span>  }<a name="line.8509"></a>
-<span class="sourceLineNo">8510</span><a name="line.8510"></a>
-<span class="sourceLineNo">8511</span>  /**<a name="line.8511"></a>
-<span class="sourceLineNo">8512</span>   * Closes the lock. This needs to be called in the finally block corresponding<a name="line.8512"></a>
-<span class="sourceLineNo">8513</span>   * to the try block of #startRegionOperation<a name="line.8513"></a>
-<span class="sourceLineNo">8514</span>   */<a name="line.8514"></a>
-<span class="sourceLineNo">8515</span>  private void closeBulkRegionOperation(){<a name="line.8515"></a>
-<span class="sourceLineNo">8516</span>    if (lock.writeLock().isHeldByCurrentThread()) lock.writeLock().unlock();<a name="line.8516"></a>
-<span class="sourceLineNo">8517</span>    else lock.readLock().unlock();<a name="line.8517"></a>
-<span class="sourceLineNo">8518</span>  }<a name="line.8518"></a>
-<span class="sourceLineNo">8519</span><a name="line.8519"></a>
-<span class="sourceLineNo">8520</span>  /**<a name="line.8520"></a>
-<span class="sourceLineNo">8521</span>   * Update LongAdders for number of puts without wal and the size of possible data loss.<a name="line.8521"></a>
-<span class="sourceLineNo">8522</span>   * These information are exposed by the region server metrics.<a name="line.8522"></a>
-<span class="sourceLineNo">8523</span>   */<a name="line.8523"></a>
-<span class="sourceLineNo">8524</span>  private void recordMutationWithoutWal(final Map&lt;byte [], List&lt;Cell&gt;&gt; familyMap) {<a name="line.8524"></a>
-<span class="sourceLineNo">8525</span>    numMutationsWithoutWAL.increment();<a name="line.8525"></a>
-<span class="sourceLineNo">8526</span>    if (numMutationsWithoutWAL.sum() &lt;= 1) {<a name="line.8526"></a>
-<span class="sourceLineNo">8527</span>      LOG.info("writing data to region " + this +<a name="line.8527"></a>
-<span class="sourceLineNo">8528</span>               " with WAL disabled. Data may be lost in the event of a crash.");<a name="line.8528"></a>
-<span class="sourceLineNo">8529</span>    }<a name="line.8529"></a>
-<span class="sourceLineNo">8530</span><a name="line.8530"></a>
-<span class="sourceLineNo">8531</span>    long mutationSize = 0;<a name="line.8531"></a>
-<span class="sourceLineNo">8532</span>    for (List&lt;Cell&gt; cells: familyMap.values()) {<a name="line.8532"></a>
-<span class="sourceLineNo">8533</span>      // Optimization: 'foreach' loop is not used. See:<a name="line.8533"></a>
-<span class="sourceLineNo">8534</span>      // HBASE-12023 HRegion.applyFamilyMapToMemstore creates too many iterator objects<a name="line.8534"></a>
-<span class="sourceLineNo">8535</span>      assert cells instanceof RandomAccess;<a name="line.8535"></a>
-<span class="sourceLineNo">8536</span>      int listSize = cells.size();<a name="line.8536"></a>
-<span class="sourceLineNo">8537</span>      for (int i=0; i &lt; listSize; i++) {<a name="line.8537"></a>
-<span class="sourceLineNo">8538</span>        Cell cell = cells.get(i);<a name="line.8538"></a>
-<span class="sourceLineNo">8539</span>        mutationSize += cell.getSerializedSize();<a name="line.8539"></a>
-<span class="sourceLineNo">8540</span>      }<a name="line.8540"></a>
-<span class="sourceLineNo">8541</span>    }<a name="line.8541"></a>
-<span class="sourceLineNo">8542</span><a name="line.8542"></a>
-<span class="sourceLineNo">8543</span>    dataInMemoryWithoutWAL.add(mutationSize);<a name="line.8543"></a>
-<span class="sourceLineNo">8544</span>  }<a name="line.8544"></a>
-<span class="sourceLineNo">8545</span><a name="line.8545"></a>
-<span class="sourceLineNo">8546</span>  private void lock(final Lock lock) throws RegionTooBusyException, InterruptedIOException {<a name="line.8546"></a>
-<span class="sourceLineNo">8547</span>    lock(lock, 1);<a name="line.8547"></a>
-<span class="sourceLineNo">8548</span>  }<a name="line.8548"></a>
-<span class="sourceLineNo">8549</span><a name="line.8549"></a>
-<span class="sourceLineNo">8550</span>  /**<a name="line.8550"></a>
-<span class="sourceLineNo">8551</span>   * Try to acquire a lock.  Throw RegionTooBusyException<a name="line.8551"></a>
-<span class="sourceLineNo">8552</span>   * if failed to get the lock in time. Throw InterruptedIOException<a name="line.8552"></a>
-<span class="sourceLineNo">8553</span>   * if interrupted while waiting for the lock.<a name="line.8553"></a>
-<span class="sourceLineNo">8554</span>   */<a name="line.8554"></a>
-<span class="sourceLineNo">8555</span>  private void lock(final Lock lock, final int multiplier)<a name="line.8555"></a>
-<span class="sourceLineNo">8556</span>      throws RegionTooBusyException, InterruptedIOException {<a name="line.8556"></a>
-<span class="sourceLineNo">8557</span>    try {<a name="line.8557"></a>
-<span class="sourceLineNo">8558</span>      final long waitTime = Math.min(maxBusyWaitDuration,<a name="line.8558"></a>
-<span class="sourceLineNo">8559</span>          busyWaitDuration * Math.min(multiplier, maxBusyWaitMultiplier));<a name="line.8559"></a>
-<span class="sourceLineNo">8560</span>      if (!lock.tryLock(waitTime, TimeUnit.MILLISECONDS)) {<a name="line.8560"></a>
-<span class="sourceLineNo">8561</span>        // Don't print millis. Message is used as a key over in<a name="line.8561"></a>
-<span class="sourceLineNo">8562</span>        // RetriesExhaustedWithDetailsException processing.<a name="line.8562"></a>
-<span class="sourceLineNo">8563</span>        throw new RegionTooBusyException("Failed to obtain lock; regionName=" +<a name="line.8563"></a>
-<span class="sourceLineNo">8564</span>            (this.getRegionInfo() == null? "unknown":<a name="line.8564"></a>
-<span class="sourceLineNo">8565</span>                this.getRegionInfo().getRegionNameAsString()) +<a name="line.8565"></a>
-<span class="sourceLineNo">8566</span>            ", server=" + (this.getRegionServerServices() == null? "unknown":<a name="line.8566"></a>
-<span class="sourceLineNo">8567</span>                this.getRegionServerServices().getServerName()));<a name="line.8567"></a>
-<span class="sourceLineNo">8568</span>      }<a name="line.8568"></a>
-<span class="sourceLineNo">8569</span>    } catch (InterruptedException ie) {<a name="line.8569"></a>
-<span class="sourceLineNo">8570</span>      LOG.info("Interrupted while waiting for a lock");<a name="line.8570"></a>
-<span class="sourceLineNo">8571</span>      InterruptedIOException iie = new InterruptedIOException();<a name="line.8571"></a>
-<span class="sourceLineNo">8572</span>      iie.initCause(ie);<a name="line.8572"></a>
-<span class="sourceLineNo">8573</span>      throw iie;<a name="line.8573"></a>
-<span class="sourceLineNo">8574</span>    }<a name="line.8574"></a>
-<span class="sourceLineNo">8575</span>  }<a name="line.8575"></a>
-<span class="sourceLineNo">8576</span><a name="line.8576"></a>
-<span class="sourceLineNo">8577</span>  /**<a name="line.8577"></a>
-<span class="sourceLineNo">8578</span>   * Calls sync with the given transaction ID<a name="line.8578"></a>
-<span class="sourceLineNo">8579</span>   * @param txid should sync up to which transaction<a name="line.8579"></a>
-<span class="sourceLineNo">8580</span>   * @throws IOException If anything goes wrong with DFS<a name="line.8580"></a>
-<span class="sourceLineNo">8581</span>   */<a name="line.8581"></a>
-<span class="sourceLineNo">8582</span>  private void sync(long txid, Durability durability) throws IOException {<a name="line.8582"></a>
-<span class="sourceLineNo">8583</span>    if (this.getRegionInfo().isMetaRegion()) {<a name="line.8583"></a>
-<span class="sourceLineNo">8584</span>      this.wal.sync(txid);<a name="line.8584"></a>
-<span class="sourceLineNo">8585</span>    } else {<a name="line.8585"></a>
-<span class="sourceLineNo">8586</span>      switch(durability) {<a name="line.8586"></a>
-<span class="sourceLineNo">8587</span>      case USE_DEFAULT:<a name="line.8587"></a>
-<span class="sourceLineNo">8588</span>        // do what table defaults to<a name="line.8588"></a>
-<span class="sourceLineNo">8589</span>        if (shouldSyncWAL()) {<a name="line.8589"></a>
-<span class="sourceLineNo">8590</span>          this.wal.sync(txid);<a name="line.8590"></a>
-<span class="sourceLineNo">8591</span>        }<a name="line.8591"></a>
-<span class="sourceLineNo">8592</span>        break;<a name="line.8592"></a>
-<span class="sourceLineNo">8593</span>      case SKIP_WAL:<a name="line.8593"></a>
-<span class="sourceLineNo">8594</span>        // nothing do to<a name="line.8594"></a>
-<span class="sourceLineNo">8595</span>        break;<a name="line.8595"></a>
-<span class="sourceLineNo">8596</span>      case ASYNC_WAL:<a name="line.8596"></a>
-<span class="sourceLineNo">8597</span>        // nothing do to<a name="line.8597"></a>
-<span class="sourceLineNo">8598</span>        break;<a name="line.8598"></a>
-<span class="sourceLineNo">8599</span>      case SYNC_WAL:<a name="line.8599"></a>
-<span class="sourceLineNo">8600</span>          this.wal.sync(txid, false);<a name="line.8600"></a>
-<span class="sourceLineNo">8601</span>          break;<a name="line.8601"></a>
-<span class="sourceLineNo">8602</span>      case FSYNC_WAL:<a name="line.8602"></a>
-<span class="sourceLineNo">8603</span>          this.wal.sync(txid, true);<a name="line.8603"></a>
-<span class="sourceLineNo">8604</span>          break;<a name="line.8604"></a>
-<span class="sourceLineNo">8605</span>      default:<a name="line.8605"></a>
-<span class="sourceLineNo">8606</span>        throw new RuntimeException("Unknown durability " + durability);<a name="line.8606"></a>
-<span class="sourceLineNo">8607</span>      }<a name="line.8607"></a>
-<span class="sourceLineNo">8608</span>    }<a name="line.8608"></a>
-<span class="sourceLineNo">8609</span>  }<a name="line.8609"></a>
-<span class="sourceLineNo">8610</span><a name="line.8610"></a>
-<span class="sourceLineNo">8611</span>  /**<a name="line.8611"></a>
-<span class="sourceLineNo">8612</span>   * Check whether we should sync the wal from the table's durability settings<a name="line.8612"></a>
-<span class="sourceLineNo">8613</span>   */<a name="line.8613"></a>
-<span class="sourceLineNo">8614</span>  private boolean shouldSyncWAL() {<a name="line.8614"></a>
-<span class="sourceLineNo">8615</span>    return regionDurability.ordinal() &gt;  Durability.ASYNC_WAL.ordinal();<a name="line.8615"></a>
-<span class="sourceLineNo">8616</span>  }<a name="line.8616"></a>
-<span class="sourceLineNo">8617</span><a name="line.8617"></a>
-<span class="sourceLineNo">8618</span>  /**<a name="line.8618"></a>
-<span class="sourceLineNo">8619</span>   * A mocked list implementation - discards all updates.<a name="line.8619"></a>
-<span class="sourceLineNo">8620</span>   */<a name="line.8620"></a>
-<span class="sourceLineNo">8621</span>  private static final List&lt;Cell&gt; MOCKED_LIST = new AbstractList&lt;Cell&gt;() {<a name="line.8621"></a>
+<span class="sourceLineNo">8478</span>  public void closeRegionOperation() throws IOException {<a name="line.8478"></a>
+<span class="sourceLineNo">8479</span>    closeRegionOperation(Operation.ANY);<a name="line.8479"></a>
+<span class="sourceLineNo">8480</span>  }<a name="line.8480"></a>
+<span class="sourceLineNo">8481</span><a name="line.8481"></a>
+<span class="sourceLineNo">8482</span>  @Override<a name="line.8482"></a>
+<span class="sourceLineNo">8483</span>  public void closeRegionOperation(Operation operation) throws IOException {<a name="line.8483"></a>
+<span class="sourceLineNo">8484</span>    if (operation == Operation.SNAPSHOT) {<a name="line.8484"></a>
+<span class="sourceLineNo">8485</span>      stores.values().forEach(HStore::postSnapshotOperation);<a name="line.8485"></a>
+<span class="sourceLineNo">8486</span>    }<a name="line.8486"></a>
+<span class="sourceLineNo">8487</span>    lock.readLock().unlock();<a name="line.8487"></a>
+<span class="sourceLineNo">8488</span>    if (coprocessorHost != null) {<a name="line.8488"></a>
+<span class="sourceLineNo">8489</span>      coprocessorHost.postCloseRegionOperation(operation);<a name="line.8489"></a>
+<span class="sourceLineNo">8490</span>    }<a name="line.8490"></a>
+<span class="sourceLineNo">8491</span>  }<a name="line.8491"></a>
+<span class="sourceLineNo">8492</span><a name="line.8492"></a>
+<span class="sourceLineNo">8493</span>  /**<a name="line.8493"></a>
+<span class="sourceLineNo">8494</span>   * This method needs to be called before any public call that reads or<a name="line.8494"></a>
+<span class="sourceLineNo">8495</span>   * modifies stores in bulk. It has to be called just before a try.<a name="line.8495"></a>
+<span class="sourceLineNo">8496</span>   * #closeBulkRegionOperation needs to be called in the try's finally block<a name="line.8496"></a>
+<span class="sourceLineNo">8497</span>   * Acquires a writelock and checks if the region is closing or closed.<a name="line.8497"></a>
+<span class="sourceLineNo">8498</span>   * @throws NotServingRegionException when the region is closing or closed<a name="line.8498"></a>
+<span class="sourceLineNo">8499</span>   * @throws RegionTooBusyException if failed to get the lock in time<a name="line.8499"></a>
+<span class="sourceLineNo">8500</span>   * @throws InterruptedIOException if interrupted while waiting for a lock<a name="line.8500"></a>
+<span class="sourceLineNo">8501</span>   */<a name="line.8501"></a>
+<span class="sourceLineNo">8502</span>  private void startBulkRegionOperation(boolean writeLockNeeded)<a name="line.8502"></a>
+<span class="sourceLineNo">8503</span>      throws NotServingRegionException, RegionTooBusyException, InterruptedIOException {<a name="line.8503"></a>
+<span class="sourceLineNo">8504</span>    if (this.closing.get()) {<a name="line.8504"></a>
+<span class="sourceLineNo">8505</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closing");<a name="line.8505"></a>
+<span class="sourceLineNo">8506</span>    }<a name="line.8506"></a>
+<span class="sourceLineNo">8507</span>    if (writeLockNeeded) lock(lock.writeLock());<a name="line.8507"></a>
+<span class="sourceLineNo">8508</span>    else lock(lock.readLock());<a name="line.8508"></a>
+<span class="sourceLineNo">8509</span>    if (this.closed.get()) {<a name="line.8509"></a>
+<span class="sourceLineNo">8510</span>      if (writeLockNeeded) lock.writeLock().unlock();<a name="line.8510"></a>
+<span class="sourceLineNo">8511</span>      else lock.readLock().unlock();<a name="line.8511"></a>
+<span class="sourceLineNo">8512</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closed");<a name="line.8512"></a>
+<span class="sourceLineNo">8513</span>    }<a name="line.8513"></a>
+<span class="sourceLineNo">8514</span>  }<a name="line.8514"></a>
+<span class="sourceLineNo">8515</span><a name="line.8515"></a>
+<span class="sourceLineNo">8516</span>  /**<a name="line.8516"></a>
+<span class="sourceLineNo">8517</span>   * Closes the lock. This needs to be called in the finally block corresponding<a name="line.8517"></a>
+<span class="sourceLineNo">8518</span>   * to the try block of #startRegionOperation<a name="line.8518"></a>
+<span class="sourceLineNo">8519</span>   */<a name="line.8519"></a>
+<span class="sourceLineNo">8520</span>  private void closeBulkRegionOperation(){<a name="line.8520"></a>
+<span class="sourceLineNo">8521</span>    if (lock.writeLock().isHeldByCurrentThread()) lock.writeLock().unlock();<a name="line.8521"></a>
+<span class="sourceLineNo">8522</span>    else lock.readLock().unlock();<a name="line.8522"></a>
+<span class="sourceLineNo">8523</span>  }<a name="line.8523"></a>
+<span class="sourceLineNo">8524</span><a name="line.8524"></a>
+<span class="sourceLineNo">8525</span>  /**<a name="line.8525"></a>
+<span class="sourceLineNo">8526</span>   * Update LongAdders for number of puts without wal and the size of possible data loss.<a name="line.8526"></a>
+<span class="sourceLineNo">8527</span>   * These information are exposed by the region server metrics.<a name="line.8527"></a>
+<span class="sourceLineNo">8528</span>   */<a name="line.8528"></a>
+<span class="sourceLineNo">8529</span>  private void recordMutationWithoutWal(final Map&lt;byte [], List&lt;Cell&gt;&gt; familyMap) {<a name="line.8529"></a>
+<span class="sourceLineNo">8530</span>    numMutationsWithoutWAL.increment();<a name="line.8530"></a>
+<span class="sourceLineNo">8531</span>    if (numMutationsWithoutWAL.sum() &lt;= 1) {<a name="line.8531"></a>
+<span class="sourceLineNo">8532</span>      LOG.info("writing data to region " + this +<a name="line.8532"></a>
+<span class="sourceLineNo">8533</span>               " with WAL disabled. Data may be lost in the event of a crash.");<a name="line.8533"></a>
+<span class="sourceLineNo">8534</span>    }<a name="line.8534"></a>
+<span class="sourceLineNo">8535</span><a name="line.8535"></a>
+<span class="sourceLineNo">8536</span>    long mutationSize = 0;<a name="line.8536"></a>
+<span class="sourceLineNo">8537</span>    for (List&lt;Cell&gt; cells: familyMap.values()) {<a name="line.8537"></a>
+<span class="sourceLineNo">8538</span>      // Optimization: 'foreach' loop is not used. See:<a name="line.8538"></a>
+<span class="sourceLineNo">8539</span>      // HBASE-12023 HRegion.applyFamilyMapToMemstore creates too many iterator objects<a name="line.8539"></a>
+<span class="sourceLineNo">8540</span>      assert cells instanceof RandomAccess;<a name="line.8540"></a>
+<span class="sourceLineNo">8541</span>      int listSize = cells.size();<a name="line.8541"></a>
+<span class="sourceLineNo">8542</span>      for (int i=0; i &lt; listSize; i++) {<a name="line.8542"></a>
+<span class="sourceLineNo">8543</span>        Cell cell = cells.get(i);<a name="line.8543"></a>
+<span class="sourceLineNo">8544</span>        mutationSize += cell.getSerializedSize();<a name="line.8544"></a>
+<span class="sourceLineNo">8545</span>      }<a name="line.8545"></a>
+<span class="sourceLineNo">8546</span>    }<a name="line.8546"></a>
+<span class="sourceLineNo">8547</span><a name="line.8547"></a>
+<span class="sourceLineNo">8548</span>    dataInMemoryWithoutWAL.add(mutationSize);<a name="line.8548"></a>
+<span class="sourceLineNo">8549</span>  }<a name="line.8549"></a>
+<span class="sourceLineNo">8550</span><a name="line.8550"></a>
+<span class="sourceLineNo">8551</span>  private void lock(final Lock lock) throws RegionTooBusyException, InterruptedIOException {<a name="line.8551"></a>
+<span class="sourceLineNo">8552</span>    lock(lock, 1);<a name="line.8552"></a>
+<span class="sourceLineNo">8553</span>  }<a name="line.8553"></a>
+<span class="sourceLineNo">8554</span><a name="line.8554"></a>
+<span class="sourceLineNo">8555</span>  /**<a name="line.8555"></a>
+<span class="sourceLineNo">8556</span>   * Try to acquire a lock.  Throw RegionTooBusyException<a name="line.8556"></a>
+<span class="sourceLineNo">8557</span>   * if failed to get the lock in time. Throw InterruptedIOException<a name="line.8557"></a>
+<span class="sourceLineNo">8558</span>   * if interrupted while waiting for the lock.<a name="line.8558"></a>
+<span class="sourceLineNo">8559</span>   */<a name="line.8559"></a>
+<span class="sourceLineNo">8560</span>  private void lock(final Lock lock, final int multiplier)<a name="line.8560"></a>
+<span class="sourceLineNo">8561</span>      throws RegionTooBusyException, InterruptedIOException {<a name="line.8561"></a>
+<span class="sourceLineNo">8562</span>    try {<a name="line.8562"></a>
+<span class="sourceLineNo">8563</span>      final long waitTime = Math.min(maxBusyWaitDuration,<a name="line.8563"></a>
+<span class="sourceLineNo">8564</span>          busyWaitDuration * Math.min(multiplier, maxBusyWaitMultiplier));<a name="line.8564"></a>
+<span class="sourceLineNo">8565</span>      if (!lock.tryLock(waitTime, TimeUnit.MILLISECONDS)) {<a name="line.8565"></a>
+<span class="sourceLineNo">8566</span>        // Don't print millis. Message is used as a key over in<a name="line.8566"></a>
+<span class="sourceLineNo">8567</span>        // RetriesExhaustedWithDetailsException processing.<a name="line.8567"></a>
+<span class="sourceLineNo">8568</span>        throw new RegionTooBusyException("Failed to obtain lock; regionName=" +<a name="line.8568"></a>
+<span class="sourceLineNo">8569</span>            (this.getRegionInfo() == null? "unknown":<a name="line.8569"></a>
+<span class="sourceLineNo">8570</span>                this.getRegionInfo().getRegionNameAsString()) +<a name="line.8570"></a>
+<span class="sourceLineNo">8571</span>            ", server=" + (this.getRegionServerServices() == null? "unknown":<a name="line.8571"></a>
+<span class="sourceLineNo">8572</span>                this.getRegionServerServices().getServerName()));<a name="line.8572"></a>
+<span class="sourceLineNo">8573</span>      }<a name="line.8573"></a>
+<span class="sourceLineNo">8574</span>    } catch (InterruptedException ie) {<a name="line.8574"></a>
+<span class="sourceLineNo">8575</span>      LOG.info("Interrupted while waiting for a lock");<a name="line.8575"></a>
+<span class="sourceLineNo">8576</span>      InterruptedIOException iie = new InterruptedIOException();<a name="line.8576"></a>
+<span class="sourceLineNo">8577</span>      iie.initCause(ie);<a name="line.8577"></a>
+<span class="sourceLineNo">8578</span>      throw iie;<a name="line.8578"></a>
+<span class="sourceLineNo">8579</span>    }<a name="line.8579"></a>
+<span class="sourceLineNo">8580</span>  }<a name="line.8580"></a>
+<span class="sourceLineNo">8581</span><a name="line.8581"></a>
+<span class="sourceLineNo">8582</span>  /**<a name="line.8582"></a>
+<span class="sourceLineNo">8583</span>   * Calls sync with the given transaction ID<a name="line.8583"></a>
+<span class="sourceLineNo">8584</span>   * @param txid should sync up to which transaction<a name="line.8584"></a>
+<span class="sourceLineNo">8585</span>   * @throws IOException If anything goes wrong with DFS<a name="line.8585"></a>
+<span class="sourceLineNo">8586</span>   */<a name="line.8586"></a>
+<span class="sourceLineNo">8587</span>  private void sync(long txid, Durability durability) throws IOException {<a name="line.8587"></a>
+<span class="sourceLineNo">8588</span>    if (this.getRegionInfo().isMetaRegion()) {<a name="line.8588"></a>
+<span class="sourceLineNo">8589</span>      this.wal.sync(txid);<a name="line.8589"></a>
+<span class="sourceLineNo">8590</span>    } else {<a name="line.8590"></a>
+<span class="sourceLineNo">8591</span>      switch(durability) {<a name="line.8591"></a>
+<span class="sourceLineNo">8592</span>      case USE_DEFAULT:<a name="line.8592"></a>
+<span class="sourceLineNo">8593</span>        // do what table defaults to<a name="line.8593"></a>
+<span class="sourceLineNo">8594</span>        if (shouldSyncWAL()) {<a name="line.8594"></a>
+<span class="sourceLineNo">8595</span>          this.wal.sync(txid);<a name="line.8595"></a>
+<span class="sourceLineNo">8596</span>        }<a name="line.8596"></a>
+<span class="sourceLineNo">8597</span>        break;<a name="line.8597"></a>
+<span class="sourceLineNo">8598</span>      case SKIP_WAL:<a name="line.8598"></a>
+<span class="sourceLineNo">8599</span>        // nothing do to<a name="line.8599"></a>
+<span class="sourceLineNo">8600</span>        break;<a name="line.8600"></a>
+<span class="sourceLineNo">8601</span>      case ASYNC_WAL:<a name="line.8601"></a>
+<span class="sourceLineNo">8602</span>        // nothing do to<a name="line.8602"></a>
+<span class="sourceLineNo">8603</span>        break;<a name="line.8603"></a>
+<span class="sourceLineNo">8604</span>      case SYNC_WAL:<a name="line.8604"></a>
+<span class="sourceLineNo">8605</span>          this.wal.sync(txid, false);<a name="line.8605"></a>
+<span class="sourceLineNo">8606</span>          break;<a name="line.8606"></a>
+<span class="sourceLineNo">8607</span>      case FSYNC_WAL:<a name="line.8607"></a>
+<span class="sourceLineNo">8608</span>          this.wal.sync(txid, true);<a name="line.8608"></a>
+<span class="sourceLineNo">8609</span>          break;<a name="line.8609"></a>
+<span class="sourceLineNo">8610</span>      default:<a name="line.8610"></a>
+<span class="sourceLineNo">8611</span>        throw new RuntimeException("Unknown durability " + durability);<a name="line.8611"></a>
+<span class="sourceLineNo">8612</span>      }<a name="line.8612"></a>
+<span class="sourceLineNo">8613</span>    }<a name="line.8613"></a>
+<span class="sourceLineNo">8614</span>  }<a name="line.8614"></a>
+<span class="sourceLineNo">8615</span><a name="line.8615"></a>
+<span class="sourceLineNo">8616</span>  /**<a name="line.8616"></a>
+<span class="sourceLineNo">8617</span>   * Check whether we should sync the wal from the table's durability settings<a name="line.8617"></a>
+<span class="sourceLineNo">8618</span>   */<a name="line.8618"></a>
+<span class="sourceLineNo">8619</span>  private boolean shouldSyncWAL() {<a name="line.8619"></a>
+<span class="sourceLineNo">8620</span>    return regionDurability.ordinal() &gt;  Durability.ASYNC_WAL.ordinal();<a name="line.8620"></a>
+<span class="sourceLineNo">8621</span>  }<a name="line.8621"></a>
 <span class="sourceLineNo">8622</span><a name="line.8622"></a>
-<span class="sourceLineNo">8623</span>    @Override<a name="line.8623"></a>
-<span class="sourceLineNo">8624</span>    public void add(int index, Cell element) {<a name="line.8624"></a>
-<span class="sourceLineNo">8625</span>      // do nothing<a name="line.8625"></a>
-<span class="sourceLineNo">8626</span>    }<a name="line.8626"></a>
+<span class="sourceLineNo">8623</span>  /**<a name="line.8623"></a>
+<span class="sourceLineNo">8624</span>   * A mocked list implementation - discards all updates.<a name="line.8624"></a>
+<span class="sourceLineNo">8625</span>   */<a name="line.8625"></a>
+<span class="sourceLineNo">8626</span>  private static final List&lt;Cell&gt; MOCKED_LIST = new AbstractList&lt;Cell&gt;() {<a name="line.8626"></a>
 <span class="sourceLineNo">8627</span><a name="line.8627"></a>
 <span class="sourceLineNo">8628</span>    @Override<a name="line.8628"></a>
-<span class="sourceLineNo">8629</span>    public boolean addAll(int index, Collection&lt;? extends Cell&gt; c) {<a name="line.8629"></a>
-<span class="sourceLineNo">8630</span>      return false; // this list is never changed as a result of an update<a name="line.8630"></a>
+<span class="sourceLineNo">8629</span>    public void add(int index, Cell element) {<a name="line.8629"></a>
+<span class="sourceLineNo">8630</span>      // do nothing<a name="line.8630"></a>
 <span class="sourceLineNo">8631</span>    }<a name="line.8631"></a>
 <span class="sourceLineNo">8632</span><a name="line.8632"></a>
 <span class="sourceLineNo">8633</span>    @Override<a name="line.8633"></a>
-<span class="sourceLineNo">8634</span>    public KeyValue get(int index) {<a name="line.8634"></a>
-<span class="sourceLineNo">8635</span>      throw new UnsupportedOperationException();<a name="line.8635"></a>
+<span class="sourceLineNo">8634</span>    public boolean addAll(int index, Collection&lt;? extends Cell&gt; c) {<a name="line.8634"></a>
+<span class="sourceLineNo">8635</span>      return false; // this list is never changed as a result of an update<a name="line.8635"></a>
 <span class="sourceLineNo">8636</span>    }<a name="line.8636"></a>
 <span class="sourceLineNo">8637</span><a name="line.8637"></a>
 <span class="sourceLineNo">8638</span>    @Override<a name="line.8638"></a>
-<span class="sourceLineNo">8639</span>    public int size() {<a name="line.8639"></a>
-<span class="sourceLineNo">8640</span>      return 0;<a name="line.8640"></a>
+<span class="sourceLineNo">8639</span>    public KeyValue get(int index) {<a name="line.8639"></a>
+<span class="sourceLineNo">8640</span>      throw new UnsupportedOperationException();<a name="line.8640"></a>
 <span class="sourceLineNo">8641</span>    }<a name="line.8641"></a>
-<span class="sourceLineNo">8642</span>  };<a name="line.8642"></a>
-<span class="sourceLineNo">8643</span><a name="line.8643"></a>
-<span class="sourceLineNo">8644</span>  /** @return the latest sequence number that was read from storage when this region was opened */<a name="line.8644"></a>
-<span class="sourceLineNo">8645</span>  public long getOpenSeqNum() {<a name="line.8645"></a>
-<span class="sourceLineNo">8646</span>    return this.openSeqNum;<a name="line.8646"></a>
-<span class="sourceLineNo">8647</span>  }<a name="line.8647"></a>
+<span class="sourceLineNo">8642</span><a name="line.8642"></a>
+<span class="sourceLineNo">8643</span>    @Override<a name="line.8643"></a>
+<span class="sourceLineNo">8644</span>    public int size() {<a name="line.8644"></a>
+<span class="sourceLineNo">8645</span>      return 0;<a name="line.8645"></a>
+<span class="sourceLineNo">8646</span>    }<a name="line.8646"></a>
+<span class="sourceLineNo">8647</span>  };<a name="line.8647"></a>
 <span class="sourceLineNo">8648</span><a name="line.8648"></a>
-<span class="sourceLineNo">8649</span>  @Override<a name="line.8649"></a>
-<span class="sourceLineNo">8650</span>  public Map&lt;byte[], Long&gt; getMaxStoreSeqId() {<a name="line.8650"></a>
-<span class="sourceLineNo">8651</span>    return this.maxSeqIdInStores;<a name="line.8651"></a>
+<span class="sourceLineNo">8649</span>  /** @return the latest sequence number that was read from storage when this region was opened */<a name="line.8649"></a>
+<span class="sourceLineNo">8650</span>  public long getOpenSeqNum() {<a name="line.8650"></a>
+<span class="sourceLineNo">8651</span>    return this.openSeqNum;<a name="line.8651"></a>
 <span class="sourceLineNo">8652</span>  }<a name="line.8652"></a>
 <span class="sourceLineNo">8653</span><a name="line.8653"></a>
-<span class="sourceLineNo">8654</span>  public long getOldestSeqIdOfStore(byte[] familyName) {<a name="line.8654"></a>
-<span class="sourceLineNo">8655</span>    return wal.getEarliestMemStoreSeqNum(getRegionInfo().getEncodedNameAsBytes(), familyName);<a name="line.8655"></a>
-<span class="sourceLineNo">8656</span>  }<a name="line.8656"></a>
-<span class="sourceLineNo">8657</span><a name="line.8657"></a>
-<span class="sourceLineNo">8658</span>  @Override<a name="line.8658"></a>
-<span class="sourceLineNo">8659</span>  public CompactionState getCompactionState() {<a name="line.8659"></a>
-<span class="sourceLineNo">8660</span>    boolean hasMajor = majorInProgress.get() &gt; 0, hasMinor = minorInProgress.get() &gt; 0;<a name="line.8660"></a>
-<span class="sourceLineNo">8661</span>    return (hasMajor ? (hasMinor ? CompactionState.MAJOR_AND_MINOR : CompactionState.MAJOR)<a name="line.8661"></a>
-<span class="sourceLineNo">8662</span>        : (hasMinor ? CompactionState.MINOR : CompactionState.NONE));<a name="line.8662"></a>
-<span class="sourceLineNo">8663</span>  }<a name="line.8663"></a>
-<span class="sourceLineNo">8664</span><a name="line.8664"></a>
-<span class="sourceLineNo">8665</span>  public void reportCompactionRequestStart(boolean isMajor){<a name="line.8665"></a>
-<span class="sourceLineNo">8666</span>    (isMajor ? majorInProgress : minorInProgress).incrementAndGet();<a name="line.8666"></a>
-<span class="sourceLineNo">8667</span>  }<a name="line.8667"></a>
-<span class="sourceLineNo">8668</span><a name="line.8668"></a>
-<span class="sourceLineNo">8669</span>  public void reportCompactionRequestEnd(boolean isMajor, int numFiles, long filesSizeCompacted) {<a name="line.8669"></a>
-<span class="sourceLineNo">8670</span>    int newValue = (isMajor ? majorInProgress : minorInProgress).decrementAndGet();<a name="line.8670"></a>
-<span class="sourceLineNo">8671</span><a name="line.8671"></a>
-<span class="sourceLineNo">8672</span>    // metrics<a name="line.8672"></a>
-<span class="sourceLineNo">8673</span>    compactionsFinished.increment();<a name="line.8673"></a>
-<span class="sourceLineNo">8674</span>    compactionNumFilesCompacted.add(numFiles);<a name="line.8674"></a>
-<span class="sourceLineNo">8675</span>    compactionNumBytesCompacted.add(filesSizeCompacted);<a name="line.8675"></a>
+<span class="sourceLineNo">8654</span>  @Override<a name="line.8654"></a>
+<span class="sourceLineNo">8655</span>  public Map&lt;byte[], Long&gt; getMaxStoreSeqId() {<a name="line.8655"></a>
+<span class="sourceLineNo">8656</span>    return this.maxSeqIdInStores;<a name="line.8656"></a>
+<span class="sourceLineNo">8657</span>  }<a name="line.8657"></a>
+<span class="sourceLineNo">8658</span><a name="line.8658"></a>
+<span class="sourceLineNo">8659</span>  public long getOldestSeqIdOfStore(byte[] familyName) {<a name="line.8659"></a>
+<span class="sourceLineNo">8660</span>    return wal.getEarliestMemStoreSeqNum(getRegionInfo().getEncodedNameAsBytes(), familyName);<a name="line.8660"></a>
+<span class="sourceLineNo">8661</span>  }<a name="line.8661"></a>
+<span class="sourceLineNo">8662</span><a name="line.8662"></a>
+<span class="sourceLineNo">8663</span>  @Override<a name="line.8663"></a>
+<span class="sourceLineNo">8664</span>  public CompactionState getCompactionState() {<a name="line.8664"></a>
+<span class="sourceLineNo">8665</span>    boolean hasMajor = majorInProgress.get() &gt; 0, hasMinor = minorInProgress.get() &gt; 0;<a name="line.8665"></a>
+<span class="sourceLineNo">8666</span>    return (hasMajor ? (hasMinor ? CompactionState.MAJOR_AND_MINOR : CompactionState.MAJOR)<a name="line.8666"></a>
+<span class="sourceLineNo">8667</span>        : (hasMinor ? CompactionState.MINOR : CompactionState.NONE));<a name="line.8667"></a>
+<span class="sourceLineNo">8668</span>  }<a name="line.8668"></a>
+<span class="sourceLineNo">8669</span><a name="line.8669"></a>
+<span class="sourceLineNo">8670</span>  public void reportCompactionRequestStart(boolean isMajor){<a name="line.8670"></a>
+<span class="sourceLineNo">8671</span>    (isMajor ? majorInProgress : minorInProgress).incrementAndGet();<a name="line.8671"></a>
+<span class="sourceLineNo">8672</span>  }<a name="line.8672"></a>
+<span class="sourceLineNo">8673</span><a name="line.8673"></a>
+<span class="sourceLineNo">8674</span>  public void reportCompactionRequestEnd(boolean isMajor, int numFiles, long filesSizeCompacted) {<a name="line.8674"></a>
+<span class="sourceLineNo">8675</span>    int newValue = (isMajor ? majorInProgress : minorInProgress).decrementAndGet();<a name="line.8675"></a>
 <span class="sourceLineNo">8676</span><a name="line.8676"></a>
-<span class="sourceLineNo">8677</span>    assert newValue &gt;= 0;<a name="line.8677"></a>
-<span class="sourceLineNo">8678</span>  }<a name="line.8678"></a>
-<span class="sourceLineNo">8679</span><a name="line.8679"></a>
-<span class="sourceLineNo">8680</span>  public void reportCompactionRequestFailure() {<a name="line.8680"></a>
-<span class="sourceLineNo">8681</span>    compactionsFailed.increment();<a name="line.8681"></a>
-<span class="sourceLineNo">8682</span>  }<a name="line.8682"></a>
-<span class="sourceLineNo">8683</span><a name="line.8683"></a>
-<span class="sourceLineNo">8684</span>  public void incrementCompactionsQueuedCount() {<a name="line.8684"></a>
-<span class="sourceLineNo">8685</span>    compactionsQueued.increment();<a name="line.8685"></a>
-<span class="sourceLineNo">8686</span>  }<a name="line.8686"></a>
-<span class="sourceLineNo">8687</span><a name="line.8687"></a>
-<span class="sourceLineNo">8688</span>  public void decrementCompactionsQueuedCount() {<a name="line.8688"></a>
-<span class="sourceLineNo">8689</span>    compactionsQueued.decrement();<a name="line.8689"></a>
-<span class="sourceLineNo">8690</span>  }<a name="line.8690"></a>
-<span class="sourceLineNo">8691</span><a name="line.8691"></a>
-<span class="sourceLineNo">8692</span>  public void incrementFlushesQueuedCount() {<a name="line.8692"></a>
-<span class="sourceLineNo">8693</span>    flushesQueued.increment();<a name="line.8693"></a>
-<span class="sourceLineNo">8694</span>  }<a name="line.8694"></a>
-<span class="sourceLineNo">8695</span><a name="line.8695"></a>
-<span class="sourceLineNo">8696</span>  @VisibleForTesting<a name="line.8696"></a>
-<span class="sourceLineNo">8697</span>  public long getReadPoint() {<a name="line.8697"></a>
-<span class="sourceLineNo">8698</span>    return getReadPoint(IsolationLevel.READ_COMMITTED);<a name="line.8698"></a>
+<span class="sourceLineNo">8677</span>    // metrics<a name="line.8677"></a>
+<span class="sourceLineNo">8678</span>    compactionsFinished.increment();<a name="line.8678"></a>
+<span class="sourceLineNo">8679</span>    compactionNumFilesCompacted.add(numFiles);<a name="line.8679"></a>
+<span class="sourceLineNo">8680</span>    compactionNumBytesCompacted.add(filesSizeCompacted);<a name="line.8680"></a>
+<span class="sourceLineNo">8681</span><a name="line.8681"></a>
+<span class="sourceLineNo">8682</span>    assert newValue &gt;= 0;<a name="line.8682"></a>
+<span class="sourceLineNo">8683</span>  }<a name="line.8683"></a>
+<span class="sourceLineNo">8684</span><a name="line.8684"></a>
+<span class="sourceLineNo">8685</span>  public void reportCompactionRequestFailure() {<a name="line.8685"></a>
+<span class="sourceLineNo">8686</span>    compactionsFailed.increment();<a name="line.8686"></a>
+<span class="sourceLineNo">8687</span>  }<a name="line.8687"></a>
+<span class="sourceLineNo">8688</span><a name="line.8688"></a>
+<span class="sourceLineNo">8689</span>  public void incrementCompactionsQueuedCount() {<a name="line.8689"></a>
+<span class="sourceLineNo">8690</span>    compactionsQueued.increment();<a name="line.8690"></a>
+<span class="sourceLineNo">8691</span>  }<a name="line.8691"></a>
+<span class="sourceLineNo">8692</span><a name="line.8692"></a>
+<span class="sourceLineNo">8693</span>  public void decrementCompactionsQueuedCount() {<a name="line.8693"></a>
+<span class="sourceLineNo">8694</span>    compactionsQueued.decrement();<a name="line.8694"></a>
+<span class="sourceLineNo">8695</span>  }<a name="line.8695"></a>
+<span class="sourceLineNo">8696</span><a name="line.8696"></a>
+<span class="sourceLineNo">8697</span>  public void incrementFlushesQueuedCount() {<a name="line.8697"></a>
+<span class="sourceLineNo">8698</span>    flushesQueued.increment();<a name="line.8698"></a>
 <span class="sourceLineNo">8699</span>  }<a name="line.8699"></a>
 <span class="sourceLineNo">8700</span><a name="line.8700"></a>
-<span class="sourceLineNo">8701</span>  /**<a name="line.8701"></a>
-<span class="sourceLineNo">8702</span>   * {@inheritDoc}<a name="line.8702"></a>
-<span class="sourceLineNo">8703</span>   */<a name="line.8703"></a>
-<span class="sourceLineNo">8704</span>  @Override<a name="line.8704"></a>
-<span class="sourceLineNo">8705</span>  public void onConfigurationChange(Configuration conf) {<a name="line.8705"></a>
-<span class="sourceLineNo">8706</span>    this.storeHotnessProtector.update(conf);<a name="line.8706"></a>
-<span class="sourceLineNo">8707</span>  }<a name="line.8707"></a>
-<span class="sourceLineNo">8708</span><a name="line.8708"></a>
-<span class="sourceLineNo">8709</span>  /**<a name="line.8709"></a>
-<span class="sourceLineNo">8710</span>   * {@inheritDoc}<a name="line.8710"></a>
-<span class="sourceLineNo">8711</span>   */<a name="line.8711"></a>
-<span class="sourceLineNo">8712</span>  @Override<a name="line.8712"></a>
-<span class="sourceLineNo">8713</span>  public void registerChildren(ConfigurationManager manager) {<a name="line.8713"></a>
-<span class="sourceLineNo">8714</span>    configurationManager = Optional.of(manager);<a name="line.8714"></a>
-<span class="sourceLineNo">8715</span>    stores.values().forEach(manager::registerObserver);<a name="line.8715"></a>
-<span class="sourceLineNo">8716</span>  }<a name="line.8716"></a>
-<span class="sourceLineNo">8717</span><a name="line.8717"></a>
-<span class="sourceLineNo">8718</span>  /**<a name="line.8718"></a>
-<span class="sourceLineNo">8719</span>   * {@inheritDoc}<a name="line.8719"></a>
-<span class="sourceLineNo">8720</span>   */<a name="line.8720"></a>
-<span class="sourceLineNo">8721</span>  @Override<a name="line.8721"></a>
-<span class="sourceLineNo">8722</span>  public void deregisterChildren(ConfigurationManager manager) {<a name="line.8722"></a>
-<span class="sourceLineNo">8723</span>    stores.values().forEach(configurationManager.get()::deregisterObserver);<a name="line.8723"></a>
-<span class="sourceLineNo">8724</span>  }<a name="line.8724"></a>
-<span class="sourceLineNo">8725</span><a name="line.8725"></a>
+<span class="sourceLineNo">8701</span>  @VisibleForTesting<a name="line.8701"></a>
+<span class="sourceLineNo">8702</span>  public long getReadPoint() {<a name="line.8702"></a>
+<span class="sourceLineNo">8703</span>    return getReadPoint(IsolationLevel.READ_COMMITTED);<a name="line.8703"></a>
+<span class="sourceLineNo">8704</span>  }<a name="line.8704"></a>
+<span class="sourceLineNo">8705</span><a name="line.8705"></a>
+<span class="sourceLineNo">8706</span>  /**<a name="line.8706"></a>
+<span class="sourceLineNo">8707</span>   * {@inheritDoc}<a name="line.8707"></a>
+<span class="sourceLineNo">8708</span>   */<a name="line.8708"></a>
+<span class="sourceLineNo">8709</span>  @Override<a name="line.8709"></a>
+<span class="sourceLineNo">8710</span>  public void onConfigurationChange(Configuration conf) {<a name="line.8710"></a>
+<span class="sourceLineNo">8711</span>    this.storeHotnessProtector.update(conf);<a name="line.8711"></a>
+<span class="sourceLineNo">8712</span>  }<a name="line.8712"></a>
+<span class="sourceLineNo">8713</span><a name="line.8713"></a>
+<span class="sourceLineNo">8714</span>  /**<a name="line.8714"></a>
+<span class="sourceLineNo">8715</span>   * {@inheritDoc}<a name="line.8715"></a>
+<span class="sourceLineNo">8716</span>   */<a name="line.8716"></a>
+<span class="sourceLineNo">8717</span>  @Override<a name="line.8717"></a>
+<span class="sourceLineNo">8718</span>  public void registerChildren(ConfigurationManager manager) {<a name="line.8718"></a>
+<span class="sourceLineNo">8719</span>    configurationManager = Optional.of(manager);<a name="line.8719"></a>
+<span class="sourceLineNo">8720</span>    stores.values().forEach(manager::registerObserver);<a name="line.8720"></a>
+<span class="sourceLineNo">8721</span>  }<a name="line.8721"></a>
+<span class="sourceLineNo">8722</span><a name="line.8722"></a>
+<span class="sourceLineNo">8723</span>  /**<a name="line.8723"></a>
+<span class="sourceLineNo">8724</span>   * {@inheritDoc}<a name="line.8724"></a>
+<span class="sourceLineNo">8725</span>   */<a name="line.8725"></a>
 <span class="sourceLineNo">8726</span>  @Override<a name="line.8726"></a>
-<span class="sourceLineNo">8727</span>  public CellComparator getCellComparator() {<a name="line.8727"></a>
-<span class="sourceLineNo">8728</span>    return this.getRegionInfo().isMetaRegion() ? CellComparatorImpl.META_COMPARATOR<a name="line.8728"></a>
-<span class="sourceLineNo">8729</span>        : CellComparatorImpl.COMPARATOR;<a name="line.8729"></a>
-<span class="sourceLineNo">8730</span>  }<a name="line.8730"></a>
-<span class="sourceLineNo">8731</span><a name="line.8731"></a>
-<span class="sourceLineNo">8732</span>  public long getMemStoreFlushSize() {<a name="line.8732"></a>
-<span class="sourceLineNo">8733</span>    return this.memstoreFlushSize;<a name="line.8733"></a>
-<span class="sourceLineNo">8734</span>  }<a name="line.8734"></a>
-<span class="sourceLineNo">8735</span><a name="line.8735"></a>
+<span class="sourceLineNo">8727</span>  public void deregisterChildren(ConfigurationManager manager) {<a name="line.8727"></a>
+<span class="sourceLineNo">8728</span>    stores.values().forEach(configurationManager.get()::deregisterObserver);<a name="line.8728"></a>
+<span class="sourceLineNo">8729</span>  }<a name="line.8729"></a>
+<span class="sourceLineNo">8730</span><a name="line.8730"></a>
+<span class="sourceLineNo">8731</span>  @Override<a name="line.8731"></a>
+<span class="sourceLineNo">8732</span>  public CellComparator getCellComparator() {<a name="line.8732"></a>
+<span class="sourceLineNo">8733</span>    return this.getRegionInfo().isMetaRegion() ? CellComparatorImpl.META_COMPARATOR<a name="line.8733"></a>
+<span class="sourceLineNo">8734</span>        : CellComparatorImpl.COMPARATOR;<a name="line.8734"></a>
+<span class="sourceLineNo">8735</span>  }<a name="line.8735"></a>
 <span class="sourceLineNo">8736</span><a name="line.8736"></a>
-<span class="sourceLineNo">8737</span>  //// method for debugging tests<a name="line.8737"></a>
-<span class="sourceLineNo">8738</span>  void throwException(String title, String regionName) {<a name="line.8738"></a>
-<span class="sourceLineNo">8739</span>    StringBuilder buf = new StringBuilder();<a name="line.8739"></a>
-<span class="sourceLineNo">8740</span>    buf.append(title + ", ");<a name="line.8740"></a>
-<span class="sourceLineNo">8741</span>    buf.append(getRegionInfo().toString());<a name="line.8741"></a>
-<span class="sourceLineNo">8742</span>    buf.append(getRegionInfo().isMetaRegion() ? " meta region " : " ");<a name="line.8742"></a>
-<span class="sourceLineNo">8743</span>    buf.append("stores: ");<a name="line.8743"></a>
-<span class="sourceLineNo">8744</span>    for (HStore s : stores.values()) {<a name="line.8744"></a>
-<span class="sourceLineNo">8745</span>      buf.append(s.getColumnFamilyDescriptor().getNameAsString());<a name="line.8745"></a>
-<span class="sourceLineNo">8746</span>      buf.append(" size: ");<a name="line.8746"></a>
-<span class="sourceLineNo">8747</span>      buf.append(s.getMemStoreSize().getDataSize());<a name="line.8747"></a>
-<span class="sourceLineNo">8748</span>      buf.append(" ");<a name="line.8748"></a>
-<span class="sourceLineNo">8749</span>    }<a name="line.8749"></a>
-<span class="sourceLineNo">8750</span>    buf.append("end-of-stores");<a name="line.8750"></a>
-<span class="sourceLineNo">8751</span>    buf.append(", memstore size ");<a name="line.8751"></a>
-<span class="sourceLineNo">8752</span>    buf.append(getMemStoreDataSize());<a name="line.8752"></a>
-<span class="sourceLineNo">8753</span>    if (getRegionInfo().getRegionNameAsString().startsWith(regionName)) {<a name="line.8753"></a>
-<span class="sourceLineNo">8754</span>      throw new RuntimeException(buf.toString());<a name="line.8754"></a>
-<span class="sourceLineNo">8755</span>    }<a name="line.8755"></a>
-<span class="sourceLineNo">8756</span>  }<a name="line.8756"></a>
-<span class="sourceLineNo">8757</span><a name="line.8757"></a>
-<span class="sourceLineNo">8758</span>  @Override<a name="line.8758"></a>
-<span class="sourceLineNo">8759</span>  public void requestCompaction(String why, int priority, boolean major,<a name="line.8759"></a>
-<span class="sourceLineNo">8760</span>      CompactionLifeCycleTracker tracker) throws IOException {<a name="line.8760"></a>
-<span class="sourceLineNo">8761</span>    if (major) {<a name="line.8761"></a>
-<span class="sourceLineNo">8762</span>      stores.values().forEach(HStore::triggerMajorCompaction);<a name="line.8762"></a>
-<span class="sourceLineNo">8763</span>    }<a name="line.8763"></a>
-<span class="sourceLineNo">8764</span>    rsServices.getCompactionRequestor().requestCompaction(this, why, priority, tracker,<a name="line.8764"></a>
-<span class="sourceLineNo">8765</span>        RpcServer.getRequestUser().orElse(null));<a name="line.8765"></a>
-<span class="sourceLineNo">8766</span>  }<a name="line.8766"></a>
-<span class="sourceLineNo">8767</span><a name="line.8767"></a>
-<span class="sourceLineNo">8768</span>  @Override<a name="line.8768"></a>
-<span class="sourceLineNo">8769</span>  public void requestCompaction(byte[] family, String why, int priority, boolean major,<a name="line.8769"></a>
-<span class="sourceLineNo">8770</span>      CompactionLifeCycleTracker tracker) throws IOException {<a name="line.8770"></a>
-<span class="sourceLineNo">8771</span>    HStore store = stores.get(family);<a name="line.8771"></a>
-<span class="sourceLineNo">8772</span>    if (store == null) {<a name="line.8772"></a>
-<span class="sourceLineNo">8773</span>      throw new NoSuchColumnFamilyException("column family " + Bytes.toString(family) +<a name="line.8773"></a>
-<span class="sourceLineNo">8774</span>          " does not exist in region " + getRegionInfo().getRegionNameAsString());<a name="line.8774"></a>
-<span class="sourceLineNo">8775</span>    }<a name="line.8775"></a>
-<span class="sourceLineNo">8776</span>    if (major) {<a name="line.8776"></a>
-<span class="sourceLineNo">8777</span>      store.triggerMajorCompaction();<a name="line.8777"></a>
-<span class="sourceLineNo">8778</span>    }<a name="line.8778"></a>
-<span class="sourceLineNo">8779</span>    rsServices.getCompactionRequestor().requestCompaction(this, store, why, priority, tracker,<a name="line.8779"></a>
-<span class="sourceLineNo">8780</span>        RpcServer.getRequestUser().orElse(null));<a name="line.8780"></a>
-<span class="sourceLineNo">8781</span>  }<a name="line.8781"></a>
-<span class="sourceLineNo">8782</span><a name="line.8782"></a>
-<span class="sourceLineNo">8783</span>  private void requestFlushIfNeeded() throws RegionTooBusyException {<a name="line.8783"></a>
-<span class="sourceLineNo">8784</span>    if(isFlushSize(this.memStoreSizing.getMemStoreSize())) {<a name="line.8784"></a>
-<span class="sourceLineNo">8785</span>      requestFlush();<a name="line.8785"></a>
-<span class="sourceLineNo">8786</span>    }<a name="line.8786"></a>
-<span class="sourceLineNo">8787</span>  }<a name="line.8787"></a>
-<span class="sourceLineNo">8788</span><a name="line.8788"></a>
-<span class="sourceLineNo">8789</span>  private void requestFlush() {<a name="line.8789"></a>
-<span class="sourceLineNo">8790</span>    if (this.rsServices == null) {<a name="line.8790"></a>
-<span class="sourceLineNo">8791</span>      return;<a name="line.8791"></a>
-<span class="sourceLineNo">8792</span>    }<a name="line.8792"></a>
-<span class="sourceLineNo">8793</span>    requestFlush0(FlushLifeCycleTracker.DUMMY);<a name="line.8793"></a>
-<span class="sourceLineNo">8794</span>  }<a name="line.8794"></a>
-<span class="sourceLineNo">8795</span><a name="line.8795"></a>
-<span class="sourceLineNo">8796</span>  private void requestFlush0(FlushLifeCycleTracker tracker) {<a name="line.8796"></a>
-<span class="sourceLineNo">8797</span>    boolean shouldFlush = false;<a name="line.8797"></a>
-<span class="sourceLineNo">8798</span>    synchronized (writestate) {<a name="line.8798"></a>
-<span class="sourceLineNo">8799</span>      if (!this.writestate.isFlushRequested()) {<a name="line.8799"></a>
-<span class="sourceLineNo">8800</span>        shouldFlush = true;<a name="line.8800"></a>
-<span class="sourceLineNo">8801</span>        writestate.flushRequested = true;<a name="line.8801"></a>
-<span class="sourceLineNo">8802</span>      }<a name="line.8802"></a>
-<span class="sourceLineNo">8803</span>    }<a name="line.8803"></a>
-<span class="sourceLineNo">8804</span>    if (shouldFlush) {<a name="line.8804"></a>
-<span class="sourceLineNo">8805</span>      // Make request outside of synchronize block; HBASE-818.<a name="line.8805"></a>
-<span class="sourceLineNo">8806</span>      this.rsServices.getFlushRequester().requestFlush(this, false, tracker);<a name="line.8806"></a>
-<span class="sourceLineNo">8807</span>      if (LOG.isDebugEnabled()) {<a name="line.8807"></a>
-<span class="sourceLineNo">8808</span>        LOG.debug("Flush requested on " + this.getRegionInfo().getEncodedName());<a name="line.8808"></a>
-<span class="sourceLineNo">8809</span>      }<a name="line.8809"></a>
-<span class="sourceLineNo">8810</span>    } else {<a name="line.8810"></a>
-<span class="sourceLineNo">8811</span>      tracker.notExecuted("Flush already requested on " + this);<a name="line.8811"></a>
-<span class="sourceLineNo">8812</span>    }<a name="line.8812"></a>
-<span class="sourceLineNo">8813</span>  }<a name="line.8813"></a>
-<span class="sourceLineNo">8814</span><a name="line.8814"></a>
-<span class="sourceLineNo">8815</span>  @Override<a name="line.8815"></a>
-<span class="sourceLineNo">8816</span>  public void requestFlush(FlushLifeCycleTracker tracker) throws IOException {<a name="line.8816"></a>
-<span class="sourceLineNo">8817</span>    requestFlush0(tracker);<a name="line.8817"></a>
+<span class="sourceLineNo">8737</span>  public long getMemStoreFlushSize() {<a name="line.8737"></a>
+<span class="sourceLineNo">8738</span>    return this.memstoreFlushSize;<a name="line.8738"></a>
+<span class="sourceLineNo">8739</span>  }<a name="line.8739"></a>
+<span class="sourceLineNo">8740</span><a name="line.8740"></a>
+<span class="sourceLineNo">8741</span><a name="line.8741"></a>
+<span class="sourceLineNo">8742</span>  //// method for debugging tests<a name="line.8742"></a>
+<span class="sourceLineNo">8743</span>  void throwException(String title, String regionName) {<a name="line.8743"></a>
+<span class="sourceLineNo">8744</span>    StringBuilder buf = new StringBuilder();<a name="line.8744"></a>
+<span class="sourceLineNo">8745</span>    buf.append(title + ", ");<a name="line.8745"></a>
+<span class="sourceLineNo">8746</span>    buf.append(getRegionInfo().toString());<a name="line.8746"></a>
+<span class="sourceLineNo">8747</span>    buf.append(getRegionInfo().isMetaRegion() ? " meta region " : " ");<a name="line.8747"></a>
+<span class="sourceLineNo">8748</span>    buf.append("stores: ");<a name="line.8748"></a>
+<span class="sourceLineNo">8749</span>    for (HStore s : stores.values()) {<a name="line.8749"></a>
+<span class="sourceLineNo">8750</span>      buf.append(s.getColumnFamilyDescriptor().getNameAsString());<a name="line.8750"></a>
+<span class="sourceLineNo">8751</span>      buf.append(" size: ");<a name="line.8751"></a>
+<span class="sourceLineNo">8752</span>      buf.append(s.getMemStoreSize().getDataSize());<a name="line.8752"></a>
+<span class="sourceLineNo">8753</span>      buf.append(" ");<a name="line.8753"></a>
+<span class="sourceLineNo">8754</span>    }<a name="line.8754"></a>
+<span class="sourceLineNo">8755</span>    buf.append("end-of-stores");<a name="line.8755"></a>
+<span class="sourceLineNo">8756</span>    buf.append(", memstore size ");<a name="line.8756"></a>
+<span class="sourceLineNo">8757</span>    buf.append(getMemStoreDataSize());<a name="line.8757"></a>
+<span class="sourceLineNo">8758</span>    if (getRegionInfo().getRegionNameAsString().startsWith(regionName)) {<a name="line.8758"></a>
+<span class="sourceLineNo">8759</span>      throw new RuntimeException(buf.toString());<a name="line.8759"></a>
+<span class="sourceLineNo">8760</span>    }<a name="line.8760"></a>
+<span class="sourceLineNo">8761</span>  }<a name="line.8761"></a>
+<span class="sourceLineNo">8762</span><a name="line.8762"></a>
+<span class="sourceLineNo">8763</span>  @Override<a name="line.8763"></a>
+<span class="sourceLineNo">8764</span>  public void requestCompaction(String why, int priority, boolean major,<a name="line.8764"></a>
+<span class="sourceLineNo">8765</span>      CompactionLifeCycleTracker tracker) throws IOException {<a name="line.8765"></a>
+<span class="sourceLineNo">8766</span>    if (major) {<a name="line.8766"></a>
+<span class="sourceLineNo">8767</span>      stores.values().forEach(HStore::triggerMajorCompaction);<a name="line.8767"></a>
+<span class="sourceLineNo">8768</span>    }<a name="line.8768"></a>
+<span class="sourceLineNo">8769</span>    rsServices.getCompactionRequestor().requestCompaction(this, why, priority, tracker,<a name="line.8769"></a>
+<span class="sourceLineNo">8770</span>        RpcServer.getRequestUser().orElse(null));<a name="line.8770"></a>
+<span class="sourceLineNo">8771</span>  }<a name="line.8771"></a>
+<span class="sourceLineNo">8772</span><a name="line.8772"></a>
+<span class="sourceLineNo">8773</span>  @Override<a name="line.8773"></a>
+<span class="sourceLineNo">8774</span>  public void requestCompaction(byte[] family, String why, int priority, boolean major,<a name="line.8774"></a>
+<span class="sourceLineNo">8775</span>      CompactionLifeCycleTracker tracker) throws IOException {<a name="line.8775"></a>
+<span class="sourceLineNo">8776</span>    HStore store = stores.get(family);<a name="line.8776"></a>
+<span class="sourceLineNo">8777</span>    if (store == null) {<a name="line.8777"></a>
+<span class="sourceLineNo">8778</span>      throw new NoSuchColumnFamilyException("column family " + Bytes.toString(family) +<a name="line.8778"></a>
+<span class="sourceLineNo">8779</span>          " does not exist in region " + getRegionInfo().getRegionNameAsString());<a name="line.8779"></a>
+<span class="sourceLineNo">8780</span>    }<a name="line.8780"></a>
+<span class="sourceLineNo">8781</span>    if (major) {<a name="line.8781"></a>
+<span class="sourceLineNo">8782</span>      store.triggerMajorCompaction();<a name="line.8782"></a>
+<span class="sourceLineNo">8783</span>    }<a name="line.8783"></a>
+<span class="sourceLineNo">8784</span>    rsServices.getCompactionRequestor().requestCompaction(this, store, why, priority, tracker,<a name="line.8784"></a>
+<span class="sourceLineNo">8785</span>        RpcServer.getRequestUser().orElse(null));<a name="line.8785"></a>
+<span class="sourceLineNo">8786</span>  }<a name="line.8786"></a>
+<span class="sourceLineNo">8787</span><a name="line.8787"></a>
+<span class="sourceLineNo">8788</span>  private void requestFlushIfNeeded() throws RegionTooBusyException {<a name="line.8788"></a>
+<span class="sourceLineNo">8789</span>    if(isFlushSize(this.memStoreSizing.getMemStoreSize())) {<a name="line.8789"></a>
+<span class="sourceLineNo">8790</span>      requestFlush();<a name="line.8790"></a>
+<span class="sourceLineNo">8791</span>    }<a name="line.8791"></a>
+<span class="sourceLineNo">8792</span>  }<a name="line.8792"></a>
+<span class="sourceLineNo">8793</span><a name="line.8793"></a>
+<span class="sourceLineNo">8794</span>  private void requestFlush() {<a name="line.8794"></a>
+<span class="sourceLineNo">8795</span>    if (this.rsServices == null) {<a name="line.8795"></a>
+<span class="sourceLineNo">8796</span>      return;<a name="line.8796"></a>
+<span class="sourceLineNo">8797</span>    }<a name="line.8797"></a>
+<span class="sourceLineNo">8798</span>    requestFlush0(FlushLifeCycleTracker.DUMMY);<a name="line.8798"></a>
+<span class="sourceLineNo">8799</span>  }<a name="line.8799"></a>
+<span class="sourceLineNo">8800</span><a name="line.8800"></a>
+<span class="sourceLineNo">8801</span>  private void requestFlush0(FlushLifeCycleTracker tracker) {<a name="line.8801"></a>
+<span class="sourceLineNo">8802</span>    boolean shouldFlush = false;<a name="line.8802"></a>
+<span class="sourceLineNo">8803</span>    synchronized (writestate) {<a name="line.8803"></a>
+<span class="sourceLineNo">8804</span>      if (!this.writestate.isFlushRequested()) {<a name="line.8804"></a>
+<span class="sourceLineNo">8805</span>        shouldFlush = true;<a name="line.8805"></a>
+<span class="sourceLineNo">8806</span>        writestate.flushRequested = true;<a name="line.8806"></a>
+<span class="sourceLineNo">8807</span>      }<a name="line.8807"></a>
+<span class="sourceLineNo">8808</span>    }<a name="line.8808"></a>
+<span class="sourceLineNo">8809</span>    if (shouldFlush) {<a name="line.8809"></a>
+<span class="sourceLineNo">8810</span>      // Make request outside of synchronize block; HBASE-818.<a name="line.8810"></a>
+<span class="sourceLineNo">8811</span>      this.rsServices.getFlushRequester().requestFlush(this, false, tracker);<a name="line.8811"></a>
+<span class="sourceLineNo">8812</span>      if (LOG.isDebugEnabled()) {<a name="line.8812"></a>
+<span class="sourceLineNo">8813</span>        LOG.debug("Flush requested on " + this.getRegionInfo().getEncodedName());<a name="line.8813"></a>
+<span class="sourceLineNo">8814</span>      }<a name="line.8814"></a>
+<span class="sourceLineNo">8815</span>    } else {<a name="line.8815"></a>
+<span class="sourceLineNo">8816</span>      tracker.notExecuted("Flush already requested on " + this);<a name="line.8816"></a>
+<span class="sourceLineNo">8817</span>    }<a name="line.8817"></a>
 <span class="sourceLineNo">8818</span>  }<a name="line.8818"></a>
 <span class="sourceLineNo">8819</span><a name="line.8819"></a>
-<span class="sourceLineNo">8820</span>  /**<a name="line.8820"></a>
-<span class="sourceLineNo">8821</span>   * This method modifies the region's configuration in order to inject replication-related<a name="line.8821"></a>
-<span class="sourceLineNo">8822</span>   * features<a name="line.8822"></a>
-<span class="sourceLineNo">8823</span>   * @param conf region configurations<a name="line.8823"></a>
-<span class="sourceLineNo">8824</span>   */<a name="line.8824"></a>
-<span class="sourceLineNo">8825</span>  static void decorateRegionConfiguration(Configuration conf) {<a name="line.8825"></a>
-<span class="sourceLineNo">8826</span>    if (ReplicationUtils.isReplicationForBulkLoadDataEnabled(conf)) {<a name="line.8826"></a>
-<span class="sourceLineNo">8827</span>      String plugins = conf.get(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY,"");<a name="line.8827"></a>
-<span class="sourceLineNo">8828</span>      String replicationCoprocessorClass = ReplicationObserver.class.getCanonicalName();<a name="line.8828"></a>
-<span class="sourceLineNo">8829</span>      if (!plugins.contains(replicationCoprocessorClass)) {<a name="line.8829"></a>
-<span class="sourceLineNo">8830</span>        conf.set(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY,<a name="line.8830"></a>
-<span class="sourceLineNo">8831</span>            (plugins.equals("") ? "" : (plugins + ",")) + replicationCoprocessorClass);<a name="line.8831"></a>
-<span class="sourceLineNo">8832</span>      }<a name="line.8832"></a>
-<span class="sourceLineNo">8833</span>    }<a name="line.8833"></a>
-<span class="sourceLineNo">8834</span>  }<a name="line.8834"></a>
-<span class="sourceLineNo">8835</span>}<a name="line.8835"></a>
+<span class="sourceLineNo">8820</span>  @Override<a name="line.8820"></a>
+<span class="sourceLineNo">8821</span>  public void requestFlush(FlushLifeCycleTracker tracker) throws IOException {<a name="line.8821"></a>
+<span class="sourceLineNo">8822</span>    requestFlush0(tracker);<a name="line.8822"></a>
+<span class="sourceLineNo">8823</span>  }<a name="line.8823"></a>
+<span class="sourceLineNo">8824</span><a name="line.8824"></a>
+<span class="sourceLineNo">8825</span>  /**<a name="line.8825"></a>
+<span class="sourceLineNo">8826</span>   * This method modifies the region's configuration in order to inject replication-related<a name="line.8826"></a>
+<span class="sourceLineNo">8827</span>   * features<a name="line.8827"></a>
+<span class="sourceLineNo">8828</span>   * @param conf region configurations<a name="line.8828"></a>
+<span class="sourceLineNo">8829</span>   */<a name="line.8829"></a>
+<span class="sourceLineNo">8830</span>  static void decorateRegionConfiguration(Configuration conf) {<a name="line.8830"></a>
+<span class="sourceLineNo">8831</span>    if (ReplicationUtils.isReplicationForBulkLoadDataEnabled(conf)) {<a name="line.8831"></a>
+<span class="sourceLineNo">8832</span>      String plugins = conf.get(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY,"");<a name="line.8832"></a>
+<span class="sourceLineNo">8833</span>      String replicationCoprocessorClass = ReplicationObserver.class.getCanonicalName();<a name="line.8833"></a>
+<span class="sourceLineNo">8834</span>      if (!plugins.contains(replicationCoprocessorClass)) {<a name="line.8834"></a>
+<span class="sourceLineNo">8835</span>        conf.set(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY,<a name="line.8835"></a>
+<span class="sourceLineNo">8836</span>            (plugins.equals("") ? "" : (plugins + ",")) + replicationCoprocessorClass);<a name="line.8836"></a>
+<span class="sourceLineNo">8837</span>      }<a name="line.8837"></a>
+<span class="sourceLineNo">8838</span>    }<a name="line.8838"></a>
+<span class="sourceLineNo">8839</span>  }<a name="line.8839"></a>
+<span class="sourceLineNo">8840</span>}<a name="line.8840"></a>
 
 
 
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 8fcec33..2147e82 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.html
@@ -7972,875 +7972,880 @@
 <span class="sourceLineNo">7964</span>    if (walEdit.isReplay()) {<a name="line.7964"></a>
 <span class="sourceLineNo">7965</span>      walKey.setOrigLogSeqNum(origLogSeqNum);<a name="line.7965"></a>
 <span class="sourceLineNo">7966</span>    }<a name="line.7966"></a>
-<span class="sourceLineNo">7967</span>    WriteEntry writeEntry = null;<a name="line.7967"></a>
-<span class="sourceLineNo">7968</span>    try {<a name="line.7968"></a>
-<span class="sourceLineNo">7969</span>      long txid = this.wal.append(this.getRegionInfo(), walKey, walEdit, true);<a name="line.7969"></a>
-<span class="sourceLineNo">7970</span>      // Call sync on our edit.<a name="line.7970"></a>
-<span class="sourceLineNo">7971</span>      if (txid != 0) {<a name="line.7971"></a>
-<span class="sourceLineNo">7972</span>        sync(txid, durability);<a name="line.7972"></a>
-<span class="sourceLineNo">7973</span>      }<a name="line.7973"></a>
-<span class="sourceLineNo">7974</span>      writeEntry = walKey.getWriteEntry();<a name="line.7974"></a>
-<span class="sourceLineNo">7975</span>    } catch (IOException ioe) {<a name="line.7975"></a>
-<span class="sourceLineNo">7976</span>      if (walKey != null &amp;&amp; walKey.getWriteEntry() != null) {<a name="line.7976"></a>
-<span class="sourceLineNo">7977</span>        mvcc.complete(walKey.getWriteEntry());<a name="line.7977"></a>
+<span class="sourceLineNo">7967</span>    //don't call the coproc hook for writes to the WAL caused by<a name="line.7967"></a>
+<span class="sourceLineNo">7968</span>    //system lifecycle events like flushes or compactions<a name="line.7968"></a>
+<span class="sourceLineNo">7969</span>    if (this.coprocessorHost != null &amp;&amp; !walEdit.isMetaEdit()) {<a name="line.7969"></a>
+<span class="sourceLineNo">7970</span>      this.coprocessorHost.preWALAppend(walKey, walEdit);<a name="line.7970"></a>
+<span class="sourceLineNo">7971</span>    }<a name="line.7971"></a>
+<span class="sourceLineNo">7972</span>    WriteEntry writeEntry = null;<a name="line.7972"></a>
+<span class="sourceLineNo">7973</span>    try {<a name="line.7973"></a>
+<span class="sourceLineNo">7974</span>      long txid = this.wal.append(this.getRegionInfo(), walKey, walEdit, true);<a name="line.7974"></a>
+<span class="sourceLineNo">7975</span>      // Call sync on our edit.<a name="line.7975"></a>
+<span class="sourceLineNo">7976</span>      if (txid != 0) {<a name="line.7976"></a>
+<span class="sourceLineNo">7977</span>        sync(txid, durability);<a name="line.7977"></a>
 <span class="sourceLineNo">7978</span>      }<a name="line.7978"></a>
-<span class="sourceLineNo">7979</span>      throw ioe;<a name="line.7979"></a>
-<span class="sourceLineNo">7980</span>    }<a name="line.7980"></a>
-<span class="sourceLineNo">7981</span>    return writeEntry;<a name="line.7981"></a>
-<span class="sourceLineNo">7982</span>  }<a name="line.7982"></a>
-<span class="sourceLineNo">7983</span><a name="line.7983"></a>
-<span class="sourceLineNo">7984</span>  /**<a name="line.7984"></a>
-<span class="sourceLineNo">7985</span>   * Do coprocessor pre-increment or pre-append call.<a name="line.7985"></a>
-<span class="sourceLineNo">7986</span>   * @return Result returned out of the coprocessor, which means bypass all further processing and<a name="line.7986"></a>
-<span class="sourceLineNo">7987</span>   *  return the proffered Result instead, or null which means proceed.<a name="line.7987"></a>
-<span class="sourceLineNo">7988</span>   */<a name="line.7988"></a>
-<span class="sourceLineNo">7989</span>  private Result doCoprocessorPreCall(final Operation op, final Mutation mutation)<a name="line.7989"></a>
-<span class="sourceLineNo">7990</span>  throws IOException {<a name="line.7990"></a>
-<span class="sourceLineNo">7991</span>    Result result = null;<a name="line.7991"></a>
-<span class="sourceLineNo">7992</span>    if (this.coprocessorHost != null) {<a name="line.7992"></a>
-<span class="sourceLineNo">7993</span>      switch(op) {<a name="line.7993"></a>
-<span class="sourceLineNo">7994</span>        case INCREMENT:<a name="line.7994"></a>
-<span class="sourceLineNo">7995</span>          result = this.coprocessorHost.preIncrementAfterRowLock((Increment)mutation);<a name="line.7995"></a>
-<span class="sourceLineNo">7996</span>          break;<a name="line.7996"></a>
-<span class="sourceLineNo">7997</span>        case APPEND:<a name="line.7997"></a>
-<span class="sourceLineNo">7998</span>          result = this.coprocessorHost.preAppendAfterRowLock((Append)mutation);<a name="line.7998"></a>
-<span class="sourceLineNo">7999</span>          break;<a name="line.7999"></a>
-<span class="sourceLineNo">8000</span>        default: throw new UnsupportedOperationException(op.toString());<a name="line.8000"></a>
-<span class="sourceLineNo">8001</span>      }<a name="line.8001"></a>
-<span class="sourceLineNo">8002</span>    }<a name="line.8002"></a>
-<span class="sourceLineNo">8003</span>    return result;<a name="line.8003"></a>
-<span class="sourceLineNo">8004</span>  }<a name="line.8004"></a>
-<span class="sourceLineNo">8005</span><a name="line.8005"></a>
-<span class="sourceLineNo">8006</span>  /**<a name="line.8006"></a>
-<span class="sourceLineNo">8007</span>   * Reckon the Cells to apply to WAL, memstore, and to return to the Client; these Sets are not<a name="line.8007"></a>
-<span class="sourceLineNo">8008</span>   * always the same dependent on whether to write WAL.<a name="line.8008"></a>
-<span class="sourceLineNo">8009</span>   *<a name="line.8009"></a>
-<span class="sourceLineNo">8010</span>   * @param results Fill in here what goes back to the Client if it is non-null (if null, client<a name="line.8010"></a>
-<span class="sourceLineNo">8011</span>   *  doesn't want results).<a name="line.8011"></a>
-<span class="sourceLineNo">8012</span>   * @param forMemStore Fill in here what to apply to the MemStore (by Store).<a name="line.8012"></a>
-<span class="sourceLineNo">8013</span>   * @return A WALEdit to apply to WAL or null if we are to skip the WAL.<a name="line.8013"></a>
-<span class="sourceLineNo">8014</span>   */<a name="line.8014"></a>
-<span class="sourceLineNo">8015</span>  private WALEdit reckonDeltas(Operation op, Mutation mutation, Durability effectiveDurability,<a name="line.8015"></a>
-<span class="sourceLineNo">8016</span>      Map&lt;HStore, List&lt;Cell&gt;&gt; forMemStore, List&lt;Cell&gt; results) throws IOException {<a name="line.8016"></a>
-<span class="sourceLineNo">8017</span>    WALEdit walEdit = null;<a name="line.8017"></a>
-<span class="sourceLineNo">8018</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.8018"></a>
-<span class="sourceLineNo">8019</span>    final boolean writeToWAL = effectiveDurability != Durability.SKIP_WAL;<a name="line.8019"></a>
-<span class="sourceLineNo">8020</span>    // Process a Store/family at a time.<a name="line.8020"></a>
-<span class="sourceLineNo">8021</span>    for (Map.Entry&lt;byte [], List&lt;Cell&gt;&gt; entry: mutation.getFamilyCellMap().entrySet()) {<a name="line.8021"></a>
-<span class="sourceLineNo">8022</span>      final byte[] columnFamilyName = entry.getKey();<a name="line.8022"></a>
-<span class="sourceLineNo">8023</span>      List&lt;Cell&gt; deltas = entry.getValue();<a name="line.8023"></a>
-<span class="sourceLineNo">8024</span>      // Reckon for the Store what to apply to WAL and MemStore.<a name="line.8024"></a>
-<span class="sourceLineNo">8025</span>      List&lt;Cell&gt; toApply = reckonDeltasByStore(stores.get(columnFamilyName), op, mutation,<a name="line.8025"></a>
-<span class="sourceLineNo">8026</span>        effectiveDurability, now, deltas, results);<a name="line.8026"></a>
-<span class="sourceLineNo">8027</span>      if (!toApply.isEmpty()) {<a name="line.8027"></a>
-<span class="sourceLineNo">8028</span>        for (Cell cell : toApply) {<a name="line.8028"></a>
-<span class="sourceLineNo">8029</span>          HStore store = getStore(cell);<a name="line.8029"></a>
-<span class="sourceLineNo">8030</span>          if (store == null) {<a name="line.8030"></a>
-<span class="sourceLineNo">8031</span>            checkFamily(CellUtil.cloneFamily(cell));<a name="line.8031"></a>
-<span class="sourceLineNo">8032</span>          } else {<a name="line.8032"></a>
-<span class="sourceLineNo">8033</span>            forMemStore.computeIfAbsent(store, key -&gt; new ArrayList&lt;&gt;()).add(cell);<a name="line.8033"></a>
-<span class="sourceLineNo">8034</span>          }<a name="line.8034"></a>
-<span class="sourceLineNo">8035</span>        }<a name="line.8035"></a>
-<span class="sourceLineNo">8036</span>        if (writeToWAL) {<a name="line.8036"></a>
-<span class="sourceLineNo">8037</span>          if (walEdit == null) {<a name="line.8037"></a>
-<span class="sourceLineNo">8038</span>            walEdit = new WALEdit();<a name="line.8038"></a>
+<span class="sourceLineNo">7979</span>      writeEntry = walKey.getWriteEntry();<a name="line.7979"></a>
+<span class="sourceLineNo">7980</span>    } catch (IOException ioe) {<a name="line.7980"></a>
+<span class="sourceLineNo">7981</span>      if (walKey != null &amp;&amp; walKey.getWriteEntry() != null) {<a name="line.7981"></a>
+<span class="sourceLineNo">7982</span>        mvcc.complete(walKey.getWriteEntry());<a name="line.7982"></a>
+<span class="sourceLineNo">7983</span>      }<a name="line.7983"></a>
+<span class="sourceLineNo">7984</span>      throw ioe;<a name="line.7984"></a>
+<span class="sourceLineNo">7985</span>    }<a name="line.7985"></a>
+<span class="sourceLineNo">7986</span>    return writeEntry;<a name="line.7986"></a>
+<span class="sourceLineNo">7987</span>  }<a name="line.7987"></a>
+<span class="sourceLineNo">7988</span><a name="line.7988"></a>
+<span class="sourceLineNo">7989</span>  /**<a name="line.7989"></a>
+<span class="sourceLineNo">7990</span>   * Do coprocessor pre-increment or pre-append call.<a name="line.7990"></a>
+<span class="sourceLineNo">7991</span>   * @return Result returned out of the coprocessor, which means bypass all further processing and<a name="line.7991"></a>
+<span class="sourceLineNo">7992</span>   *  return the proffered Result instead, or null which means proceed.<a name="line.7992"></a>
+<span class="sourceLineNo">7993</span>   */<a name="line.7993"></a>
+<span class="sourceLineNo">7994</span>  private Result doCoprocessorPreCall(final Operation op, final Mutation mutation)<a name="line.7994"></a>
+<span class="sourceLineNo">7995</span>  throws IOException {<a name="line.7995"></a>
+<span class="sourceLineNo">7996</span>    Result result = null;<a name="line.7996"></a>
+<span class="sourceLineNo">7997</span>    if (this.coprocessorHost != null) {<a name="line.7997"></a>
+<span class="sourceLineNo">7998</span>      switch(op) {<a name="line.7998"></a>
+<span class="sourceLineNo">7999</span>        case INCREMENT:<a name="line.7999"></a>
+<span class="sourceLineNo">8000</span>          result = this.coprocessorHost.preIncrementAfterRowLock((Increment)mutation);<a name="line.8000"></a>
+<span class="sourceLineNo">8001</span>          break;<a name="line.8001"></a>
+<span class="sourceLineNo">8002</span>        case APPEND:<a name="line.8002"></a>
+<span class="sourceLineNo">8003</span>          result = this.coprocessorHost.preAppendAfterRowLock((Append)mutation);<a name="line.8003"></a>
+<span class="sourceLineNo">8004</span>          break;<a name="line.8004"></a>
+<span class="sourceLineNo">8005</span>        default: throw new UnsupportedOperationException(op.toString());<a name="line.8005"></a>
+<span class="sourceLineNo">8006</span>      }<a name="line.8006"></a>
+<span class="sourceLineNo">8007</span>    }<a name="line.8007"></a>
+<span class="sourceLineNo">8008</span>    return result;<a name="line.8008"></a>
+<span class="sourceLineNo">8009</span>  }<a name="line.8009"></a>
+<span class="sourceLineNo">8010</span><a name="line.8010"></a>
+<span class="sourceLineNo">8011</span>  /**<a name="line.8011"></a>
+<span class="sourceLineNo">8012</span>   * Reckon the Cells to apply to WAL, memstore, and to return to the Client; these Sets are not<a name="line.8012"></a>
+<span class="sourceLineNo">8013</span>   * always the same dependent on whether to write WAL.<a name="line.8013"></a>
+<span class="sourceLineNo">8014</span>   *<a name="line.8014"></a>
+<span class="sourceLineNo">8015</span>   * @param results Fill in here what goes back to the Client if it is non-null (if null, client<a name="line.8015"></a>
+<span class="sourceLineNo">8016</span>   *  doesn't want results).<a name="line.8016"></a>
+<span class="sourceLineNo">8017</span>   * @param forMemStore Fill in here what to apply to the MemStore (by Store).<a name="line.8017"></a>
+<span class="sourceLineNo">8018</span>   * @return A WALEdit to apply to WAL or null if we are to skip the WAL.<a name="line.8018"></a>
+<span class="sourceLineNo">8019</span>   */<a name="line.8019"></a>
+<span class="sourceLineNo">8020</span>  private WALEdit reckonDeltas(Operation op, Mutation mutation, Durability effectiveDurability,<a name="line.8020"></a>
+<span class="sourceLineNo">8021</span>      Map&lt;HStore, List&lt;Cell&gt;&gt; forMemStore, List&lt;Cell&gt; results) throws IOException {<a name="line.8021"></a>
+<span class="sourceLineNo">8022</span>    WALEdit walEdit = null;<a name="line.8022"></a>
+<span class="sourceLineNo">8023</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.8023"></a>
+<span class="sourceLineNo">8024</span>    final boolean writeToWAL = effectiveDurability != Durability.SKIP_WAL;<a name="line.8024"></a>
+<span class="sourceLineNo">8025</span>    // Process a Store/family at a time.<a name="line.8025"></a>
+<span class="sourceLineNo">8026</span>    for (Map.Entry&lt;byte [], List&lt;Cell&gt;&gt; entry: mutation.getFamilyCellMap().entrySet()) {<a name="line.8026"></a>
+<span class="sourceLineNo">8027</span>      final byte[] columnFamilyName = entry.getKey();<a name="line.8027"></a>
+<span class="sourceLineNo">8028</span>      List&lt;Cell&gt; deltas = entry.getValue();<a name="line.8028"></a>
+<span class="sourceLineNo">8029</span>      // Reckon for the Store what to apply to WAL and MemStore.<a name="line.8029"></a>
+<span class="sourceLineNo">8030</span>      List&lt;Cell&gt; toApply = reckonDeltasByStore(stores.get(columnFamilyName), op, mutation,<a name="line.8030"></a>
+<span class="sourceLineNo">8031</span>        effectiveDurability, now, deltas, results);<a name="line.8031"></a>
+<span class="sourceLineNo">8032</span>      if (!toApply.isEmpty()) {<a name="line.8032"></a>
+<span class="sourceLineNo">8033</span>        for (Cell cell : toApply) {<a name="line.8033"></a>
+<span class="sourceLineNo">8034</span>          HStore store = getStore(cell);<a name="line.8034"></a>
+<span class="sourceLineNo">8035</span>          if (store == null) {<a name="line.8035"></a>
+<span class="sourceLineNo">8036</span>            checkFamily(CellUtil.cloneFamily(cell));<a name="line.8036"></a>
+<span class="sourceLineNo">8037</span>          } else {<a name="line.8037"></a>
+<span class="sourceLineNo">8038</span>            forMemStore.computeIfAbsent(store, key -&gt; new ArrayList&lt;&gt;()).add(cell);<a name="line.8038"></a>
 <span class="sourceLineNo">8039</span>          }<a name="line.8039"></a>
-<span class="sourceLineNo">8040</span>          walEdit.getCells().addAll(toApply);<a name="line.8040"></a>
-<span class="sourceLineNo">8041</span>        }<a name="line.8041"></a>
-<span class="sourceLineNo">8042</span>      }<a name="line.8042"></a>
-<span class="sourceLineNo">8043</span>    }<a name="line.8043"></a>
-<span class="sourceLineNo">8044</span>    return walEdit;<a name="line.8044"></a>
-<span class="sourceLineNo">8045</span>  }<a name="line.8045"></a>
-<span class="sourceLineNo">8046</span><a name="line.8046"></a>
-<span class="sourceLineNo">8047</span>  /**<a name="line.8047"></a>
-<span class="sourceLineNo">8048</span>   * Reckon the Cells to apply to WAL, memstore, and to return to the Client in passed<a name="line.8048"></a>
-<span class="sourceLineNo">8049</span>   * column family/Store.<a name="line.8049"></a>
-<span class="sourceLineNo">8050</span>   *<a name="line.8050"></a>
-<span class="sourceLineNo">8051</span>   * Does Get of current value and then adds passed in deltas for this Store returning the result.<a name="line.8051"></a>
-<span class="sourceLineNo">8052</span>   *<a name="line.8052"></a>
-<span class="sourceLineNo">8053</span>   * @param op Whether Increment or Append<a name="line.8053"></a>
-<span class="sourceLineNo">8054</span>   * @param mutation The encompassing Mutation object<a name="line.8054"></a>
-<span class="sourceLineNo">8055</span>   * @param deltas Changes to apply to this Store; either increment amount or data to append<a name="line.8055"></a>
-<span class="sourceLineNo">8056</span>   * @param results In here we accumulate all the Cells we are to return to the client. If null,<a name="line.8056"></a>
-<span class="sourceLineNo">8057</span>   *                client doesn't want results returned.<a name="line.8057"></a>
-<span class="sourceLineNo">8058</span>   * @return Resulting Cells after &lt;code&gt;deltas&lt;/code&gt; have been applied to current<a name="line.8058"></a>
-<span class="sourceLineNo">8059</span>   *  values. Side effect is our filling out of the &lt;code&gt;results&lt;/code&gt; List.<a name="line.8059"></a>
-<span class="sourceLineNo">8060</span>   */<a name="line.8060"></a>
-<span class="sourceLineNo">8061</span>  private List&lt;Cell&gt; reckonDeltasByStore(HStore store, Operation op, Mutation mutation,<a name="line.8061"></a>
-<span class="sourceLineNo">8062</span>      Durability effectiveDurability, long now, List&lt;Cell&gt; deltas, List&lt;Cell&gt; results)<a name="line.8062"></a>
-<span class="sourceLineNo">8063</span>      throws IOException {<a name="line.8063"></a>
-<span class="sourceLineNo">8064</span>    byte[] columnFamily = store.getColumnFamilyDescriptor().getName();<a name="line.8064"></a>
-<span class="sourceLineNo">8065</span>    List&lt;Pair&lt;Cell, Cell&gt;&gt; cellPairs = new ArrayList&lt;&gt;(deltas.size());<a name="line.8065"></a>
-<span class="sourceLineNo">8066</span>    // Get previous values for all columns in this family.<a name="line.8066"></a>
-<span class="sourceLineNo">8067</span>    TimeRange tr = null;<a name="line.8067"></a>
-<span class="sourceLineNo">8068</span>    switch (op) {<a name="line.8068"></a>
-<span class="sourceLineNo">8069</span>      case INCREMENT:<a name="line.8069"></a>
-<span class="sourceLineNo">8070</span>        tr = ((Increment)mutation).getTimeRange();<a name="line.8070"></a>
-<span class="sourceLineNo">8071</span>        break;<a name="line.8071"></a>
-<span class="sourceLineNo">8072</span>      case APPEND:<a name="line.8072"></a>
-<span class="sourceLineNo">8073</span>        tr = ((Append)mutation).getTimeRange();<a name="line.8073"></a>
-<span class="sourceLineNo">8074</span>        break;<a name="line.8074"></a>
-<span class="sourceLineNo">8075</span>      default:<a name="line.8075"></a>
+<span class="sourceLineNo">8040</span>        }<a name="line.8040"></a>
+<span class="sourceLineNo">8041</span>        if (writeToWAL) {<a name="line.8041"></a>
+<span class="sourceLineNo">8042</span>          if (walEdit == null) {<a name="line.8042"></a>
+<span class="sourceLineNo">8043</span>            walEdit = new WALEdit();<a name="line.8043"></a>
+<span class="sourceLineNo">8044</span>          }<a name="line.8044"></a>
+<span class="sourceLineNo">8045</span>          walEdit.getCells().addAll(toApply);<a name="line.8045"></a>
+<span class="sourceLineNo">8046</span>        }<a name="line.8046"></a>
+<span class="sourceLineNo">8047</span>      }<a name="line.8047"></a>
+<span class="sourceLineNo">8048</span>    }<a name="line.8048"></a>
+<span class="sourceLineNo">8049</span>    return walEdit;<a name="line.8049"></a>
+<span class="sourceLineNo">8050</span>  }<a name="line.8050"></a>
+<span class="sourceLineNo">8051</span><a name="line.8051"></a>
+<span class="sourceLineNo">8052</span>  /**<a name="line.8052"></a>
+<span class="sourceLineNo">8053</span>   * Reckon the Cells to apply to WAL, memstore, and to return to the Client in passed<a name="line.8053"></a>
+<span class="sourceLineNo">8054</span>   * column family/Store.<a name="line.8054"></a>
+<span class="sourceLineNo">8055</span>   *<a name="line.8055"></a>
+<span class="sourceLineNo">8056</span>   * Does Get of current value and then adds passed in deltas for this Store returning the result.<a name="line.8056"></a>
+<span class="sourceLineNo">8057</span>   *<a name="line.8057"></a>
+<span class="sourceLineNo">8058</span>   * @param op Whether Increment or Append<a name="line.8058"></a>
+<span class="sourceLineNo">8059</span>   * @param mutation The encompassing Mutation object<a name="line.8059"></a>
+<span class="sourceLineNo">8060</span>   * @param deltas Changes to apply to this Store; either increment amount or data to append<a name="line.8060"></a>
+<span class="sourceLineNo">8061</span>   * @param results In here we accumulate all the Cells we are to return to the client. If null,<a name="line.8061"></a>
+<span class="sourceLineNo">8062</span>   *                client doesn't want results returned.<a name="line.8062"></a>
+<span class="sourceLineNo">8063</span>   * @return Resulting Cells after &lt;code&gt;deltas&lt;/code&gt; have been applied to current<a name="line.8063"></a>
+<span class="sourceLineNo">8064</span>   *  values. Side effect is our filling out of the &lt;code&gt;results&lt;/code&gt; List.<a name="line.8064"></a>
+<span class="sourceLineNo">8065</span>   */<a name="line.8065"></a>
+<span class="sourceLineNo">8066</span>  private List&lt;Cell&gt; reckonDeltasByStore(HStore store, Operation op, Mutation mutation,<a name="line.8066"></a>
+<span class="sourceLineNo">8067</span>      Durability effectiveDurability, long now, List&lt;Cell&gt; deltas, List&lt;Cell&gt; results)<a name="line.8067"></a>
+<span class="sourceLineNo">8068</span>      throws IOException {<a name="line.8068"></a>
+<span class="sourceLineNo">8069</span>    byte[] columnFamily = store.getColumnFamilyDescriptor().getName();<a name="line.8069"></a>
+<span class="sourceLineNo">8070</span>    List&lt;Pair&lt;Cell, Cell&gt;&gt; cellPairs = new ArrayList&lt;&gt;(deltas.size());<a name="line.8070"></a>
+<span class="sourceLineNo">8071</span>    // Get previous values for all columns in this family.<a name="line.8071"></a>
+<span class="sourceLineNo">8072</span>    TimeRange tr = null;<a name="line.8072"></a>
+<span class="sourceLineNo">8073</span>    switch (op) {<a name="line.8073"></a>
+<span class="sourceLineNo">8074</span>      case INCREMENT:<a name="line.8074"></a>
+<span class="sourceLineNo">8075</span>        tr = ((Increment)mutation).getTimeRange();<a name="line.8075"></a>
 <span class="sourceLineNo">8076</span>        break;<a name="line.8076"></a>
-<span class="sourceLineNo">8077</span>    }<a name="line.8077"></a>
-<span class="sourceLineNo">8078</span>    List&lt;Cell&gt; currentValues = get(mutation, store, deltas,null, tr);<a name="line.8078"></a>
-<span class="sourceLineNo">8079</span>    // Iterate the input columns and update existing values if they were found, otherwise<a name="line.8079"></a>
-<span class="sourceLineNo">8080</span>    // add new column initialized to the delta amount<a name="line.8080"></a>
-<span class="sourceLineNo">8081</span>    int currentValuesIndex = 0;<a name="line.8081"></a>
-<span class="sourceLineNo">8082</span>    for (int i = 0; i &lt; deltas.size(); i++) {<a name="line.8082"></a>
-<span class="sourceLineNo">8083</span>      Cell delta = deltas.get(i);<a name="line.8083"></a>
-<span class="sourceLineNo">8084</span>      Cell currentValue = null;<a name="line.8084"></a>
-<span class="sourceLineNo">8085</span>      if (currentValuesIndex &lt; currentValues.size() &amp;&amp;<a name="line.8085"></a>
-<span class="sourceLineNo">8086</span>          CellUtil.matchingQualifier(currentValues.get(currentValuesIndex), delta)) {<a name="line.8086"></a>
-<span class="sourceLineNo">8087</span>        currentValue = currentValues.get(currentValuesIndex);<a name="line.8087"></a>
-<span class="sourceLineNo">8088</span>        if (i &lt; (deltas.size() - 1) &amp;&amp; !CellUtil.matchingQualifier(delta, deltas.get(i + 1))) {<a name="line.8088"></a>
-<span class="sourceLineNo">8089</span>          currentValuesIndex++;<a name="line.8089"></a>
-<span class="sourceLineNo">8090</span>        }<a name="line.8090"></a>
-<span class="sourceLineNo">8091</span>      }<a name="line.8091"></a>
-<span class="sourceLineNo">8092</span><a name="line.8092"></a>
-<span class="sourceLineNo">8093</span>      // Switch on whether this an increment or an append building the new Cell to apply.<a name="line.8093"></a>
-<span class="sourceLineNo">8094</span>      Cell newCell = null;<a name="line.8094"></a>
-<span class="sourceLineNo">8095</span>      switch (op) {<a name="line.8095"></a>
-<span class="sourceLineNo">8096</span>        case INCREMENT:<a name="line.8096"></a>
-<span class="sourceLineNo">8097</span>          long deltaAmount = getLongValue(delta);<a name="line.8097"></a>
-<span class="sourceLineNo">8098</span>          final long newValue = currentValue == null ? deltaAmount : getLongValue(currentValue) + deltaAmount;<a name="line.8098"></a>
-<span class="sourceLineNo">8099</span>          newCell = reckonDelta(delta, currentValue, columnFamily, now, mutation, (oldCell) -&gt; Bytes.toBytes(newValue));<a name="line.8099"></a>
-<span class="sourceLineNo">8100</span>          break;<a name="line.8100"></a>
-<span class="sourceLineNo">8101</span>        case APPEND:<a name="line.8101"></a>
-<span class="sourceLineNo">8102</span>          newCell = reckonDelta(delta, currentValue, columnFamily, now, mutation, (oldCell) -&gt;<a name="line.8102"></a>
-<span class="sourceLineNo">8103</span>            ByteBuffer.wrap(new byte[delta.getValueLength() + oldCell.getValueLength()])<a name="line.8103"></a>
-<span class="sourceLineNo">8104</span>                    .put(oldCell.getValueArray(), oldCell.getValueOffset(), oldCell.getValueLength())<a name="line.8104"></a>
-<span class="sourceLineNo">8105</span>                    .put(delta.getValueArray(), delta.getValueOffset(), delta.getValueLength())<a name="line.8105"></a>
-<span class="sourceLineNo">8106</span>                    .array()<a name="line.8106"></a>
-<span class="sourceLineNo">8107</span>          );<a name="line.8107"></a>
-<span class="sourceLineNo">8108</span>          break;<a name="line.8108"></a>
-<span class="sourceLineNo">8109</span>        default: throw new UnsupportedOperationException(op.toString());<a name="line.8109"></a>
-<span class="sourceLineNo">8110</span>      }<a name="line.8110"></a>
-<span class="sourceLineNo">8111</span>      int newCellSize = PrivateCellUtil.estimatedSerializedSizeOf(newCell);<a name="line.8111"></a>
-<span class="sourceLineNo">8112</span>      if (newCellSize &gt; this.maxCellSize) {<a name="line.8112"></a>
-<span class="sourceLineNo">8113</span>        String msg = "Cell with size " + newCellSize + " exceeds limit of " +<a name="line.8113"></a>
-<span class="sourceLineNo">8114</span>            this.maxCellSize + " bytes";<a name="line.8114"></a>
-<span class="sourceLineNo">8115</span>        if (LOG.isDebugEnabled()) {<a name="line.8115"></a>
-<span class="sourceLineNo">8116</span>          LOG.debug(msg);<a name="line.8116"></a>
-<span class="sourceLineNo">8117</span>        }<a name="line.8117"></a>
-<span class="sourceLineNo">8118</span>        throw new DoNotRetryIOException(msg);<a name="line.8118"></a>
-<span class="sourceLineNo">8119</span>      }<a name="line.8119"></a>
-<span class="sourceLineNo">8120</span>      cellPairs.add(new Pair&lt;&gt;(currentValue, newCell));<a name="line.8120"></a>
-<span class="sourceLineNo">8121</span>      // Add to results to get returned to the Client. If null, cilent does not want results.<a name="line.8121"></a>
-<span class="sourceLineNo">8122</span>      if (results != null) {<a name="line.8122"></a>
-<span class="sourceLineNo">8123</span>        results.add(newCell);<a name="line.8123"></a>
+<span class="sourceLineNo">8077</span>      case APPEND:<a name="line.8077"></a>
+<span class="sourceLineNo">8078</span>        tr = ((Append)mutation).getTimeRange();<a name="line.8078"></a>
+<span class="sourceLineNo">8079</span>        break;<a name="line.8079"></a>
+<span class="sourceLineNo">8080</span>      default:<a name="line.8080"></a>
+<span class="sourceLineNo">8081</span>        break;<a name="line.8081"></a>
+<span class="sourceLineNo">8082</span>    }<a name="line.8082"></a>
+<span class="sourceLineNo">8083</span>    List&lt;Cell&gt; currentValues = get(mutation, store, deltas,null, tr);<a name="line.8083"></a>
+<span class="sourceLineNo">8084</span>    // Iterate the input columns and update existing values if they were found, otherwise<a name="line.8084"></a>
+<span class="sourceLineNo">8085</span>    // add new column initialized to the delta amount<a name="line.8085"></a>
+<span class="sourceLineNo">8086</span>    int currentValuesIndex = 0;<a name="line.8086"></a>
+<span class="sourceLineNo">8087</span>    for (int i = 0; i &lt; deltas.size(); i++) {<a name="line.8087"></a>
+<span class="sourceLineNo">8088</span>      Cell delta = deltas.get(i);<a name="line.8088"></a>
+<span class="sourceLineNo">8089</span>      Cell currentValue = null;<a name="line.8089"></a>
+<span class="sourceLineNo">8090</span>      if (currentValuesIndex &lt; currentValues.size() &amp;&amp;<a name="line.8090"></a>
+<span class="sourceLineNo">8091</span>          CellUtil.matchingQualifier(currentValues.get(currentValuesIndex), delta)) {<a name="line.8091"></a>
+<span class="sourceLineNo">8092</span>        currentValue = currentValues.get(currentValuesIndex);<a name="line.8092"></a>
+<span class="sourceLineNo">8093</span>        if (i &lt; (deltas.size() - 1) &amp;&amp; !CellUtil.matchingQualifier(delta, deltas.get(i + 1))) {<a name="line.8093"></a>
+<span class="sourceLineNo">8094</span>          currentValuesIndex++;<a name="line.8094"></a>
+<span class="sourceLineNo">8095</span>        }<a name="line.8095"></a>
+<span class="sourceLineNo">8096</span>      }<a name="line.8096"></a>
+<span class="sourceLineNo">8097</span><a name="line.8097"></a>
+<span class="sourceLineNo">8098</span>      // Switch on whether this an increment or an append building the new Cell to apply.<a name="line.8098"></a>
+<span class="sourceLineNo">8099</span>      Cell newCell = null;<a name="line.8099"></a>
+<span class="sourceLineNo">8100</span>      switch (op) {<a name="line.8100"></a>
+<span class="sourceLineNo">8101</span>        case INCREMENT:<a name="line.8101"></a>
+<span class="sourceLineNo">8102</span>          long deltaAmount = getLongValue(delta);<a name="line.8102"></a>
+<span class="sourceLineNo">8103</span>          final long newValue = currentValue == null ? deltaAmount : getLongValue(currentValue) + deltaAmount;<a name="line.8103"></a>
+<span class="sourceLineNo">8104</span>          newCell = reckonDelta(delta, currentValue, columnFamily, now, mutation, (oldCell) -&gt; Bytes.toBytes(newValue));<a name="line.8104"></a>
+<span class="sourceLineNo">8105</span>          break;<a name="line.8105"></a>
+<span class="sourceLineNo">8106</span>        case APPEND:<a name="line.8106"></a>
+<span class="sourceLineNo">8107</span>          newCell = reckonDelta(delta, currentValue, columnFamily, now, mutation, (oldCell) -&gt;<a name="line.8107"></a>
+<span class="sourceLineNo">8108</span>            ByteBuffer.wrap(new byte[delta.getValueLength() + oldCell.getValueLength()])<a name="line.8108"></a>
+<span class="sourceLineNo">8109</span>                    .put(oldCell.getValueArray(), oldCell.getValueOffset(), oldCell.getValueLength())<a name="line.8109"></a>
+<span class="sourceLineNo">8110</span>                    .put(delta.getValueArray(), delta.getValueOffset(), delta.getValueLength())<a name="line.8110"></a>
+<span class="sourceLineNo">8111</span>                    .array()<a name="line.8111"></a>
+<span class="sourceLineNo">8112</span>          );<a name="line.8112"></a>
+<span class="sourceLineNo">8113</span>          break;<a name="line.8113"></a>
+<span class="sourceLineNo">8114</span>        default: throw new UnsupportedOperationException(op.toString());<a name="line.8114"></a>
+<span class="sourceLineNo">8115</span>      }<a name="line.8115"></a>
+<span class="sourceLineNo">8116</span>      int newCellSize = PrivateCellUtil.estimatedSerializedSizeOf(newCell);<a name="line.8116"></a>
+<span class="sourceLineNo">8117</span>      if (newCellSize &gt; this.maxCellSize) {<a name="line.8117"></a>
+<span class="sourceLineNo">8118</span>        String msg = "Cell with size " + newCellSize + " exceeds limit of " +<a name="line.8118"></a>
+<span class="sourceLineNo">8119</span>            this.maxCellSize + " bytes";<a name="line.8119"></a>
+<span class="sourceLineNo">8120</span>        if (LOG.isDebugEnabled()) {<a name="line.8120"></a>
+<span class="sourceLineNo">8121</span>          LOG.debug(msg);<a name="line.8121"></a>
+<span class="sourceLineNo">8122</span>        }<a name="line.8122"></a>
+<span class="sourceLineNo">8123</span>        throw new DoNotRetryIOException(msg);<a name="line.8123"></a>
 <span class="sourceLineNo">8124</span>      }<a name="line.8124"></a>
-<span class="sourceLineNo">8125</span>    }<a name="line.8125"></a>
-<span class="sourceLineNo">8126</span><a name="line.8126"></a>
-<span class="sourceLineNo">8127</span>    // Give coprocessors a chance to update the new cells before apply to WAL or memstore<a name="line.8127"></a>
-<span class="sourceLineNo">8128</span>    if (coprocessorHost != null) {<a name="line.8128"></a>
-<span class="sourceLineNo">8129</span>      // Here the operation must be increment or append.<a name="line.8129"></a>
-<span class="sourceLineNo">8130</span>      cellPairs = op == Operation.INCREMENT ?<a name="line.8130"></a>
-<span class="sourceLineNo">8131</span>          coprocessorHost.postIncrementBeforeWAL(mutation, cellPairs) :<a name="line.8131"></a>
-<span class="sourceLineNo">8132</span>          coprocessorHost.postAppendBeforeWAL(mutation, cellPairs);<a name="line.8132"></a>
-<span class="sourceLineNo">8133</span>    }<a name="line.8133"></a>
-<span class="sourceLineNo">8134</span>    return cellPairs.stream().map(Pair::getSecond).collect(Collectors.toList());<a name="line.8134"></a>
-<span class="sourceLineNo">8135</span>  }<a name="line.8135"></a>
-<span class="sourceLineNo">8136</span><a name="line.8136"></a>
-<span class="sourceLineNo">8137</span>  private static Cell reckonDelta(final Cell delta, final Cell currentCell,<a name="line.8137"></a>
-<span class="sourceLineNo">8138</span>                                  final byte[] columnFamily, final long now,<a name="line.8138"></a>
-<span class="sourceLineNo">8139</span>                                  Mutation mutation, Function&lt;Cell, byte[]&gt; supplier) throws IOException {<a name="line.8139"></a>
-<span class="sourceLineNo">8140</span>    // Forward any tags found on the delta.<a name="line.8140"></a>
-<span class="sourceLineNo">8141</span>    List&lt;Tag&gt; tags = TagUtil.carryForwardTags(delta);<a name="line.8141"></a>
-<span class="sourceLineNo">8142</span>    tags = TagUtil.carryForwardTTLTag(tags, mutation.getTTL());<a name="line.8142"></a>
-<span class="sourceLineNo">8143</span>    if (currentCell != null) {<a name="line.8143"></a>
-<span class="sourceLineNo">8144</span>      tags = TagUtil.carryForwardTags(tags, currentCell);<a name="line.8144"></a>
-<span class="sourceLineNo">8145</span>      byte[] newValue = supplier.apply(currentCell);<a name="line.8145"></a>
-<span class="sourceLineNo">8146</span>      return ExtendedCellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.8146"></a>
-<span class="sourceLineNo">8147</span>              .setRow(mutation.getRow(), 0, mutation.getRow().length)<a name="line.8147"></a>
-<span class="sourceLineNo">8148</span>              .setFamily(columnFamily, 0, columnFamily.length)<a name="line.8148"></a>
-<span class="sourceLineNo">8149</span>              // copy the qualifier if the cell is located in shared memory.<a name="line.8149"></a>
-<span class="sourceLineNo">8150</span>              .setQualifier(CellUtil.cloneQualifier(delta))<a name="line.8150"></a>
-<span class="sourceLineNo">8151</span>              .setTimestamp(Math.max(currentCell.getTimestamp() + 1, now))<a name="line.8151"></a>
-<span class="sourceLineNo">8152</span>              .setType(KeyValue.Type.Put.getCode())<a name="line.8152"></a>
-<span class="sourceLineNo">8153</span>              .setValue(newValue, 0, newValue.length)<a name="line.8153"></a>
-<span class="sourceLineNo">8154</span>              .setTags(TagUtil.fromList(tags))<a name="line.8154"></a>
-<span class="sourceLineNo">8155</span>              .build();<a name="line.8155"></a>
-<span class="sourceLineNo">8156</span>    } else {<a name="line.8156"></a>
-<span class="sourceLineNo">8157</span>      PrivateCellUtil.updateLatestStamp(delta, now);<a name="line.8157"></a>
-<span class="sourceLineNo">8158</span>      return CollectionUtils.isEmpty(tags) ? delta : PrivateCellUtil.createCell(delta, tags);<a name="line.8158"></a>
-<span class="sourceLineNo">8159</span>    }<a name="line.8159"></a>
-<span class="sourceLineNo">8160</span>  }<a name="line.8160"></a>
-<span class="sourceLineNo">8161</span><a name="line.8161"></a>
-<span class="sourceLineNo">8162</span>  /**<a name="line.8162"></a>
-<span class="sourceLineNo">8163</span>   * @return Get the long out of the passed in Cell<a name="line.8163"></a>
-<span class="sourceLineNo">8164</span>   */<a name="line.8164"></a>
-<span class="sourceLineNo">8165</span>  private static long getLongValue(final Cell cell) throws DoNotRetryIOException {<a name="line.8165"></a>
-<span class="sourceLineNo">8166</span>    int len = cell.getValueLength();<a name="line.8166"></a>
-<span class="sourceLineNo">8167</span>    if (len != Bytes.SIZEOF_LONG) {<a name="line.8167"></a>
-<span class="sourceLineNo">8168</span>      // throw DoNotRetryIOException instead of IllegalArgumentException<a name="line.8168"></a>
-<span class="sourceLineNo">8169</span>      throw new DoNotRetryIOException("Field is not a long, it's " + len + " bytes wide");<a name="line.8169"></a>
-<span class="sourceLineNo">8170</span>    }<a name="line.8170"></a>
-<span class="sourceLineNo">8171</span>    return PrivateCellUtil.getValueAsLong(cell);<a name="line.8171"></a>
-<span class="sourceLineNo">8172</span>  }<a name="line.8172"></a>
-<span class="sourceLineNo">8173</span><a name="line.8173"></a>
-<span class="sourceLineNo">8174</span>  /**<a name="line.8174"></a>
-<span class="sourceLineNo">8175</span>   * Do a specific Get on passed &lt;code&gt;columnFamily&lt;/code&gt; and column qualifiers.<a name="line.8175"></a>
-<span class="sourceLineNo">8176</span>   * @param mutation Mutation we are doing this Get for.<a name="line.8176"></a>
-<span class="sourceLineNo">8177</span>   * @param store Which column family on row (TODO: Go all Gets in one go)<a name="line.8177"></a>
-<span class="sourceLineNo">8178</span>   * @param coordinates Cells from &lt;code&gt;mutation&lt;/code&gt; used as coordinates applied to Get.<a name="line.8178"></a>
-<span class="sourceLineNo">8179</span>   * @return Return list of Cells found.<a name="line.8179"></a>
-<span class="sourceLineNo">8180</span>   */<a name="line.8180"></a>
-<span class="sourceLineNo">8181</span>  private List&lt;Cell&gt; get(Mutation mutation, HStore store, List&lt;Cell&gt; coordinates,<a name="line.8181"></a>
-<span class="sourceLineNo">8182</span>      IsolationLevel isolation, TimeRange tr) throws IOException {<a name="line.8182"></a>
-<span class="sourceLineNo">8183</span>    // Sort the cells so that they match the order that they appear in the Get results. Otherwise,<a name="line.8183"></a>
-<span class="sourceLineNo">8184</span>    // we won't be able to find the existing values if the cells are not specified in order by the<a name="line.8184"></a>
-<span class="sourceLineNo">8185</span>    // client since cells are in an array list.<a name="line.8185"></a>
-<span class="sourceLineNo">8186</span>    // TODO: I don't get why we are sorting. St.Ack 20150107<a name="line.8186"></a>
-<span class="sourceLineNo">8187</span>    sort(coordinates, store.getComparator());<a name="line.8187"></a>
-<span class="sourceLineNo">8188</span>    Get get = new Get(mutation.getRow());<a name="line.8188"></a>
-<span class="sourceLineNo">8189</span>    if (isolation != null) {<a name="line.8189"></a>
-<span class="sourceLineNo">8190</span>      get.setIsolationLevel(isolation);<a name="line.8190"></a>
-<span class="sourceLineNo">8191</span>    }<a name="line.8191"></a>
-<span class="sourceLineNo">8192</span>    for (Cell cell: coordinates) {<a name="line.8192"></a>
-<span class="sourceLineNo">8193</span>      get.addColumn(store.getColumnFamilyDescriptor().getName(), CellUtil.cloneQualifier(cell));<a name="line.8193"></a>
-<span class="sourceLineNo">8194</span>    }<a name="line.8194"></a>
-<span class="sourceLineNo">8195</span>    // Increments carry time range. If an Increment instance, put it on the Get.<a name="line.8195"></a>
-<span class="sourceLineNo">8196</span>    if (tr != null) {<a name="line.8196"></a>
-<span class="sourceLineNo">8197</span>      get.setTimeRange(tr.getMin(), tr.getMax());<a name="line.8197"></a>
-<span class="sourceLineNo">8198</span>    }<a name="line.8198"></a>
-<span class="sourceLineNo">8199</span>    return get(get, false);<a name="line.8199"></a>
-<span class="sourceLineNo">8200</span>  }<a name="line.8200"></a>
-<span class="sourceLineNo">8201</span><a name="line.8201"></a>
-<span class="sourceLineNo">8202</span>  /**<a name="line.8202"></a>
-<span class="sourceLineNo">8203</span>   * @return Sorted list of &lt;code&gt;cells&lt;/code&gt; using &lt;code&gt;comparator&lt;/code&gt;<a name="line.8203"></a>
-<span class="sourceLineNo">8204</span>   */<a name="line.8204"></a>
-<span class="sourceLineNo">8205</span>  private static List&lt;Cell&gt; sort(List&lt;Cell&gt; cells, final CellComparator comparator) {<a name="line.8205"></a>
-<span class="sourceLineNo">8206</span>    cells.sort(comparator);<a name="line.8206"></a>
-<span class="sourceLineNo">8207</span>    return cells;<a name="line.8207"></a>
-<span class="sourceLineNo">8208</span>  }<a name="line.8208"></a>
-<span class="sourceLineNo">8209</span><a name="line.8209"></a>
-<span class="sourceLineNo">8210</span>  public static final long FIXED_OVERHEAD = ClassSize.align(<a name="line.8210"></a>
-<span class="sourceLineNo">8211</span>      ClassSize.OBJECT +<a name="line.8211"></a>
-<span class="sourceLineNo">8212</span>      ClassSize.ARRAY +<a name="line.8212"></a>
-<span class="sourceLineNo">8213</span>      55 * ClassSize.REFERENCE + 3 * Bytes.SIZEOF_INT +<a name="line.8213"></a>
-<span class="sourceLineNo">8214</span>      (15 * Bytes.SIZEOF_LONG) +<a name="line.8214"></a>
-<span class="sourceLineNo">8215</span>      3 * Bytes.SIZEOF_BOOLEAN);<a name="line.8215"></a>
-<span class="sourceLineNo">8216</span><a name="line.8216"></a>
-<span class="sourceLineNo">8217</span>  // woefully out of date - currently missing:<a name="line.8217"></a>
-<span class="sourceLineNo">8218</span>  // 1 x HashMap - coprocessorServiceHandlers<a name="line.8218"></a>
-<span class="sourceLineNo">8219</span>  // 6 x LongAdder - numMutationsWithoutWAL, dataInMemoryWithoutWAL,<a name="line.8219"></a>
-<span class="sourceLineNo">8220</span>  //   checkAndMutateChecksPassed, checkAndMutateChecksFailed, readRequestsCount,<a name="line.8220"></a>
-<span class="sourceLineNo">8221</span>  //   writeRequestsCount, cpRequestsCount<a name="line.8221"></a>
-<span class="sourceLineNo">8222</span>  // 1 x HRegion$WriteState - writestate<a name="line.8222"></a>
-<span class="sourceLineNo">8223</span>  // 1 x RegionCoprocessorHost - coprocessorHost<a name="line.8223"></a>
-<span class="sourceLineNo">8224</span>  // 1 x RegionSplitPolicy - splitPolicy<a name="line.8224"></a>
-<span class="sourceLineNo">8225</span>  // 1 x MetricsRegion - metricsRegion<a name="line.8225"></a>
-<span class="sourceLineNo">8226</span>  // 1 x MetricsRegionWrapperImpl - metricsRegionWrapper<a name="line.8226"></a>
-<span class="sourceLineNo">8227</span>  public static final long DEEP_OVERHEAD = FIXED_OVERHEAD +<a name="line.8227"></a>
-<span class="sourceLineNo">8228</span>      ClassSize.OBJECT + // closeLock<a name="line.8228"></a>
-<span class="sourceLineNo">8229</span>      (2 * ClassSize.ATOMIC_BOOLEAN) + // closed, closing<a name="line.8229"></a>
-<span class="sourceLineNo">8230</span>      (3 * ClassSize.ATOMIC_LONG) + // numPutsWithoutWAL, dataInMemoryWithoutWAL,<a name="line.8230"></a>
-<span class="sourceLineNo">8231</span>                                    // compactionsFailed<a name="line.8231"></a>
-<span class="sourceLineNo">8232</span>      (2 * ClassSize.CONCURRENT_HASHMAP) +  // lockedRows, scannerReadPoints<a name="line.8232"></a>
-<span class="sourceLineNo">8233</span>      WriteState.HEAP_SIZE + // writestate<a name="line.8233"></a>
-<span class="sourceLineNo">8234</span>      ClassSize.CONCURRENT_SKIPLISTMAP + ClassSize.CONCURRENT_SKIPLISTMAP_ENTRY + // stores<a name="line.8234"></a>
-<span class="sourceLineNo">8235</span>      (2 * ClassSize.REENTRANT_LOCK) + // lock, updatesLock<a name="line.8235"></a>
-<span class="sourceLineNo">8236</span>      MultiVersionConcurrencyControl.FIXED_SIZE // mvcc<a name="line.8236"></a>
-<span class="sourceLineNo">8237</span>      + 2 * ClassSize.TREEMAP // maxSeqIdInStores, replicationScopes<a name="line.8237"></a>
-<span class="sourceLineNo">8238</span>      + 2 * ClassSize.ATOMIC_INTEGER // majorInProgress, minorInProgress<a name="line.8238"></a>
-<span class="sourceLineNo">8239</span>      + ClassSize.STORE_SERVICES // store services<a name="line.8239"></a>
-<span class="sourceLineNo">8240</span>      + StoreHotnessProtector.FIXED_SIZE<a name="line.8240"></a>
-<span class="sourceLineNo">8241</span>      ;<a name="line.8241"></a>
-<span class="sourceLineNo">8242</span><a name="line.8242"></a>
-<span class="sourceLineNo">8243</span>  @Override<a name="line.8243"></a>
-<span class="sourceLineNo">8244</span>  public long heapSize() {<a name="line.8244"></a>
-<span class="sourceLineNo">8245</span>    // this does not take into account row locks, recent flushes, mvcc entries, and more<a name="line.8245"></a>
-<span class="sourceLineNo">8246</span>    return DEEP_OVERHEAD + stores.values().stream().mapToLong(HStore::heapSize).sum();<a name="line.8246"></a>
-<span class="sourceLineNo">8247</span>  }<a name="line.8247"></a>
-<span class="sourceLineNo">8248</span><a name="line.8248"></a>
-<span class="sourceLineNo">8249</span>  /**<a name="line.8249"></a>
-<span class="sourceLineNo">8250</span>   * Registers a new protocol buffer {@link Service} subclass as a coprocessor endpoint to<a name="line.8250"></a>
-<span class="sourceLineNo">8251</span>   * be available for handling Region#execService(com.google.protobuf.RpcController,<a name="line.8251"></a>
-<span class="sourceLineNo">8252</span>   *    org.apache.hadoop.hbase.protobuf.generated.ClientProtos.CoprocessorServiceCall) calls.<a name="line.8252"></a>
-<span class="sourceLineNo">8253</span>   *<a name="line.8253"></a>
-<span class="sourceLineNo">8254</span>   * &lt;p&gt;<a name="line.8254"></a>
-<span class="sourceLineNo">8255</span>   * Only a single instance may be registered per region for a given {@link Service} subclass (the<a name="line.8255"></a>
-<span class="sourceLineNo">8256</span>   * instances are keyed on {@link com.google.protobuf.Descriptors.ServiceDescriptor#getFullName()}.<a name="line.8256"></a>
-<span class="sourceLineNo">8257</span>   * After the first registration, subsequent calls with the same service name will fail with<a name="line.8257"></a>
-<span class="sourceLineNo">8258</span>   * a return value of {@code false}.<a name="line.8258"></a>
-<span class="sourceLineNo">8259</span>   * &lt;/p&gt;<a name="line.8259"></a>
-<span class="sourceLineNo">8260</span>   * @param instance the {@code Service} subclass instance to expose as a coprocessor endpoint<a name="line.8260"></a>
-<span class="sourceLineNo">8261</span>   * @return {@code true} if the registration was successful, {@code false}<a name="line.8261"></a>
-<span class="sourceLineNo">8262</span>   * otherwise<a name="line.8262"></a>
-<span class="sourceLineNo">8263</span>   */<a name="line.8263"></a>
-<span class="sourceLineNo">8264</span>  public boolean registerService(com.google.protobuf.Service instance) {<a name="line.8264"></a>
-<span class="sourceLineNo">8265</span>    /*<a name="line.8265"></a>
-<span class="sourceLineNo">8266</span>     * No stacking of instances is allowed for a single service name<a name="line.8266"></a>
-<span class="sourceLineNo">8267</span>     */<a name="line.8267"></a>
-<span class="sourceLineNo">8268</span>    com.google.protobuf.Descriptors.ServiceDescriptor serviceDesc = instance.getDescriptorForType();<a name="line.8268"></a>
-<span class="sourceLineNo">8269</span>    String serviceName = CoprocessorRpcUtils.getServiceName(serviceDesc);<a name="line.8269"></a>
-<span class="sourceLineNo">8270</span>    if (coprocessorServiceHandlers.containsKey(serviceName)) {<a name="line.8270"></a>
-<span class="sourceLineNo">8271</span>      LOG.error("Coprocessor service " + serviceName +<a name="line.8271"></a>
-<span class="sourceLineNo">8272</span>          " already registered, rejecting request from " + instance);<a name="line.8272"></a>
-<span class="sourceLineNo">8273</span>      return false;<a name="line.8273"></a>
-<span class="sourceLineNo">8274</span>    }<a name="line.8274"></a>
-<span class="sourceLineNo">8275</span><a name="line.8275"></a>
-<span class="sourceLineNo">8276</span>    coprocessorServiceHandlers.put(serviceName, instance);<a name="line.8276"></a>
-<span class="sourceLineNo">8277</span>    if (LOG.isDebugEnabled()) {<a name="line.8277"></a>
-<span class="sourceLineNo">8278</span>      LOG.debug("Registered coprocessor service: region=" +<a name="line.8278"></a>
-<span class="sourceLineNo">8279</span>          Bytes.toStringBinary(getRegionInfo().getRegionName()) +<a name="line.8279"></a>
-<span class="sourceLineNo">8280</span>          " service=" + serviceName);<a name="line.8280"></a>
-<span class="sourceLineNo">8281</span>    }<a name="line.8281"></a>
-<span class="sourceLineNo">8282</span>    return true;<a name="line.8282"></a>
-<span class="sourceLineNo">8283</span>  }<a name="line.8283"></a>
-<span class="sourceLineNo">8284</span><a name="line.8284"></a>
-<span class="sourceLineNo">8285</span>  /**<a name="line.8285"></a>
-<span class="sourceLineNo">8286</span>   * Executes a single protocol buffer coprocessor endpoint {@link Service} method using<a name="line.8286"></a>
-<span class="sourceLineNo">8287</span>   * the registered protocol handlers.  {@link Service} implementations must be registered via the<a name="line.8287"></a>
-<span class="sourceLineNo">8288</span>   * {@link #registerService(com.google.protobuf.Service)}<a name="line.8288"></a>
-<span class="sourceLineNo">8289</span>   * method before they are available.<a name="line.8289"></a>
-<span class="sourceLineNo">8290</span>   *<a name="line.8290"></a>
-<span class="sourceLineNo">8291</span>   * @param controller an {@code RpcContoller} implementation to pass to the invoked service<a name="line.8291"></a>
-<span class="sourceLineNo">8292</span>   * @param call a {@code CoprocessorServiceCall} instance identifying the service, method,<a name="line.8292"></a>
-<span class="sourceLineNo">8293</span>   *     and parameters for the method invocation<a name="line.8293"></a>
-<span class="sourceLineNo">8294</span>   * @return a protocol buffer {@code Message} instance containing the method's result<a name="line.8294"></a>
-<span class="sourceLineNo">8295</span>   * @throws IOException if no registered service handler is found or an error<a name="line.8295"></a>
-<span class="sourceLineNo">8296</span>   *     occurs during the invocation<a name="line.8296"></a>
-<span class="sourceLineNo">8297</span>   * @see #registerService(com.google.protobuf.Service)<a name="line.8297"></a>
-<span class="sourceLineNo">8298</span>   */<a name="line.8298"></a>
-<span class="sourceLineNo">8299</span>  public com.google.protobuf.Message execService(com.google.protobuf.RpcController controller,<a name="line.8299"></a>
-<span class="sourceLineNo">8300</span>      CoprocessorServiceCall call) throws IOException {<a name="line.8300"></a>
-<span class="sourceLineNo">8301</span>    String serviceName = call.getServiceName();<a name="line.8301"></a>
-<span class="sourceLineNo">8302</span>    com.google.protobuf.Service service = coprocessorServiceHandlers.get(serviceName);<a name="line.8302"></a>
-<span class="sourceLineNo">8303</span>    if (service == null) {<a name="line.8303"></a>
-<span class="sourceLineNo">8304</span>      throw new UnknownProtocolException(null, "No registered coprocessor service found for " +<a name="line.8304"></a>
-<span class="sourceLineNo">8305</span>          serviceName + " in region " + Bytes.toStringBinary(getRegionInfo().getRegionName()));<a name="line.8305"></a>
-<span class="sourceLineNo">8306</span>    }<a name="line.8306"></a>
-<span class="sourceLineNo">8307</span>    com.google.protobuf.Descriptors.ServiceDescriptor serviceDesc = service.getDescriptorForType();<a name="line.8307"></a>
-<span class="sourceLineNo">8308</span><a name="line.8308"></a>
-<span class="sourceLineNo">8309</span>    cpRequestsCount.increment();<a name="line.8309"></a>
-<span class="sourceLineNo">8310</span>    String methodName = call.getMethodName();<a name="line.8310"></a>
-<span class="sourceLineNo">8311</span>    com.google.protobuf.Descriptors.MethodDescriptor methodDesc =<a name="line.8311"></a>
-<span class="sourceLineNo">8312</span>        CoprocessorRpcUtils.getMethodDescriptor(methodName, serviceDesc);<a name="line.8312"></a>
+<span class="sourceLineNo">8125</span>      cellPairs.add(new Pair&lt;&gt;(currentValue, newCell));<a name="line.8125"></a>
+<span class="sourceLineNo">8126</span>      // Add to results to get returned to the Client. If null, cilent does not want results.<a name="line.8126"></a>
+<span class="sourceLineNo">8127</span>      if (results != null) {<a name="line.8127"></a>
+<span class="sourceLineNo">8128</span>        results.add(newCell);<a name="line.8128"></a>
+<span class="sourceLineNo">8129</span>      }<a name="line.8129"></a>
+<span class="sourceLineNo">8130</span>    }<a name="line.8130"></a>
+<span class="sourceLineNo">8131</span><a name="line.8131"></a>
+<span class="sourceLineNo">8132</span>    // Give coprocessors a chance to update the new cells before apply to WAL or memstore<a name="line.8132"></a>
+<span class="sourceLineNo">8133</span>    if (coprocessorHost != null) {<a name="line.8133"></a>
+<span class="sourceLineNo">8134</span>      // Here the operation must be increment or append.<a name="line.8134"></a>
+<span class="sourceLineNo">8135</span>      cellPairs = op == Operation.INCREMENT ?<a name="line.8135"></a>
+<span class="sourceLineNo">8136</span>          coprocessorHost.postIncrementBeforeWAL(mutation, cellPairs) :<a name="line.8136"></a>
+<span class="sourceLineNo">8137</span>          coprocessorHost.postAppendBeforeWAL(mutation, cellPairs);<a name="line.8137"></a>
+<span class="sourceLineNo">8138</span>    }<a name="line.8138"></a>
+<span class="sourceLineNo">8139</span>    return cellPairs.stream().map(Pair::getSecond).collect(Collectors.toList());<a name="line.8139"></a>
+<span class="sourceLineNo">8140</span>  }<a name="line.8140"></a>
+<span class="sourceLineNo">8141</span><a name="line.8141"></a>
+<span class="sourceLineNo">8142</span>  private static Cell reckonDelta(final Cell delta, final Cell currentCell,<a name="line.8142"></a>
+<span class="sourceLineNo">8143</span>                                  final byte[] columnFamily, final long now,<a name="line.8143"></a>
+<span class="sourceLineNo">8144</span>                                  Mutation mutation, Function&lt;Cell, byte[]&gt; supplier) throws IOException {<a name="line.8144"></a>
+<span class="sourceLineNo">8145</span>    // Forward any tags found on the delta.<a name="line.8145"></a>
+<span class="sourceLineNo">8146</span>    List&lt;Tag&gt; tags = TagUtil.carryForwardTags(delta);<a name="line.8146"></a>
+<span class="sourceLineNo">8147</span>    tags = TagUtil.carryForwardTTLTag(tags, mutation.getTTL());<a name="line.8147"></a>
+<span class="sourceLineNo">8148</span>    if (currentCell != null) {<a name="line.8148"></a>
+<span class="sourceLineNo">8149</span>      tags = TagUtil.carryForwardTags(tags, currentCell);<a name="line.8149"></a>
+<span class="sourceLineNo">8150</span>      byte[] newValue = supplier.apply(currentCell);<a name="line.8150"></a>
+<span class="sourceLineNo">8151</span>      return ExtendedCellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.8151"></a>
+<span class="sourceLineNo">8152</span>              .setRow(mutation.getRow(), 0, mutation.getRow().length)<a name="line.8152"></a>
+<span class="sourceLineNo">8153</span>              .setFamily(columnFamily, 0, columnFamily.length)<a name="line.8153"></a>
+<span class="sourceLineNo">8154</span>              // copy the qualifier if the cell is located in shared memory.<a name="line.8154"></a>
+<span class="sourceLineNo">8155</span>              .setQualifier(CellUtil.cloneQualifier(delta))<a name="line.8155"></a>
+<span class="sourceLineNo">8156</span>              .setTimestamp(Math.max(currentCell.getTimestamp() + 1, now))<a name="line.8156"></a>
+<span class="sourceLineNo">8157</span>              .setType(KeyValue.Type.Put.getCode())<a name="line.8157"></a>
+<span class="sourceLineNo">8158</span>              .setValue(newValue, 0, newValue.length)<a name="line.8158"></a>
+<span class="sourceLineNo">8159</span>              .setTags(TagUtil.fromList(tags))<a name="line.8159"></a>
+<span class="sourceLineNo">8160</span>              .build();<a name="line.8160"></a>
+<span class="sourceLineNo">8161</span>    } else {<a name="line.8161"></a>
+<span class="sourceLineNo">8162</span>      PrivateCellUtil.updateLatestStamp(delta, now);<a name="line.8162"></a>
+<span class="sourceLineNo">8163</span>      return CollectionUtils.isEmpty(tags) ? delta : PrivateCellUtil.createCell(delta, tags);<a name="line.8163"></a>
+<span class="sourceLineNo">8164</span>    }<a name="line.8164"></a>
+<span class="sourceLineNo">8165</span>  }<a name="line.8165"></a>
+<span class="sourceLineNo">8166</span><a name="line.8166"></a>
+<span class="sourceLineNo">8167</span>  /**<a name="line.8167"></a>
+<span class="sourceLineNo">8168</span>   * @return Get the long out of the passed in Cell<a name="line.8168"></a>
+<span class="sourceLineNo">8169</span>   */<a name="line.8169"></a>
+<span class="sourceLineNo">8170</span>  private static long getLongValue(final Cell cell) throws DoNotRetryIOException {<a name="line.8170"></a>
+<span class="sourceLineNo">8171</span>    int len = cell.getValueLength();<a name="line.8171"></a>
+<span class="sourceLineNo">8172</span>    if (len != Bytes.SIZEOF_LONG) {<a name="line.8172"></a>
+<span class="sourceLineNo">8173</span>      // throw DoNotRetryIOException instead of IllegalArgumentException<a name="line.8173"></a>
+<span class="sourceLineNo">8174</span>      throw new DoNotRetryIOException("Field is not a long, it's " + len + " bytes wide");<a name="line.8174"></a>
+<span class="sourceLineNo">8175</span>    }<a name="line.8175"></a>
+<span class="sourceLineNo">8176</span>    return PrivateCellUtil.getValueAsLong(cell);<a name="line.8176"></a>
+<span class="sourceLineNo">8177</span>  }<a name="line.8177"></a>
+<span class="sourceLineNo">8178</span><a name="line.8178"></a>
+<span class="sourceLineNo">8179</span>  /**<a name="line.8179"></a>
+<span class="sourceLineNo">8180</span>   * Do a specific Get on passed &lt;code&gt;columnFamily&lt;/code&gt; and column qualifiers.<a name="line.8180"></a>
+<span class="sourceLineNo">8181</span>   * @param mutation Mutation we are doing this Get for.<a name="line.8181"></a>
+<span class="sourceLineNo">8182</span>   * @param store Which column family on row (TODO: Go all Gets in one go)<a name="line.8182"></a>
+<span class="sourceLineNo">8183</span>   * @param coordinates Cells from &lt;code&gt;mutation&lt;/code&gt; used as coordinates applied to Get.<a name="line.8183"></a>
+<span class="sourceLineNo">8184</span>   * @return Return list of Cells found.<a name="line.8184"></a>
+<span class="sourceLineNo">8185</span>   */<a name="line.8185"></a>
+<span class="sourceLineNo">8186</span>  private List&lt;Cell&gt; get(Mutation mutation, HStore store, List&lt;Cell&gt; coordinates,<a name="line.8186"></a>
+<span class="sourceLineNo">8187</span>      IsolationLevel isolation, TimeRange tr) throws IOException {<a name="line.8187"></a>
+<span class="sourceLineNo">8188</span>    // Sort the cells so that they match the order that they appear in the Get results. Otherwise,<a name="line.8188"></a>
+<span class="sourceLineNo">8189</span>    // we won't be able to find the existing values if the cells are not specified in order by the<a name="line.8189"></a>
+<span class="sourceLineNo">8190</span>    // client since cells are in an array list.<a name="line.8190"></a>
+<span class="sourceLineNo">8191</span>    // TODO: I don't get why we are sorting. St.Ack 20150107<a name="line.8191"></a>
+<span class="sourceLineNo">8192</span>    sort(coordinates, store.getComparator());<a name="line.8192"></a>
+<span class="sourceLineNo">8193</span>    Get get = new Get(mutation.getRow());<a name="line.8193"></a>
+<span class="sourceLineNo">8194</span>    if (isolation != null) {<a name="line.8194"></a>
+<span class="sourceLineNo">8195</span>      get.setIsolationLevel(isolation);<a name="line.8195"></a>
+<span class="sourceLineNo">8196</span>    }<a name="line.8196"></a>
+<span class="sourceLineNo">8197</span>    for (Cell cell: coordinates) {<a name="line.8197"></a>
+<span class="sourceLineNo">8198</span>      get.addColumn(store.getColumnFamilyDescriptor().getName(), CellUtil.cloneQualifier(cell));<a name="line.8198"></a>
+<span class="sourceLineNo">8199</span>    }<a name="line.8199"></a>
+<span class="sourceLineNo">8200</span>    // Increments carry time range. If an Increment instance, put it on the Get.<a name="line.8200"></a>
+<span class="sourceLineNo">8201</span>    if (tr != null) {<a name="line.8201"></a>
+<span class="sourceLineNo">8202</span>      get.setTimeRange(tr.getMin(), tr.getMax());<a name="line.8202"></a>
+<span class="sourceLineNo">8203</span>    }<a name="line.8203"></a>
+<span class="sourceLineNo">8204</span>    return get(get, false);<a name="line.8204"></a>
+<span class="sourceLineNo">8205</span>  }<a name="line.8205"></a>
+<span class="sourceLineNo">8206</span><a name="line.8206"></a>
+<span class="sourceLineNo">8207</span>  /**<a name="line.8207"></a>
+<span class="sourceLineNo">8208</span>   * @return Sorted list of &lt;code&gt;cells&lt;/code&gt; using &lt;code&gt;comparator&lt;/code&gt;<a name="line.8208"></a>
+<span class="sourceLineNo">8209</span>   */<a name="line.8209"></a>
+<span class="sourceLineNo">8210</span>  private static List&lt;Cell&gt; sort(List&lt;Cell&gt; cells, final CellComparator comparator) {<a name="line.8210"></a>
+<span class="sourceLineNo">8211</span>    cells.sort(comparator);<a name="line.8211"></a>
+<span class="sourceLineNo">8212</span>    return cells;<a name="line.8212"></a>
+<span class="sourceLineNo">8213</span>  }<a name="line.8213"></a>
+<span class="sourceLineNo">8214</span><a name="line.8214"></a>
+<span class="sourceLineNo">8215</span>  public static final long FIXED_OVERHEAD = ClassSize.align(<a name="line.8215"></a>
+<span class="sourceLineNo">8216</span>      ClassSize.OBJECT +<a name="line.8216"></a>
+<span class="sourceLineNo">8217</span>      ClassSize.ARRAY +<a name="line.8217"></a>
+<span class="sourceLineNo">8218</span>      55 * ClassSize.REFERENCE + 3 * Bytes.SIZEOF_INT +<a name="line.8218"></a>
+<span class="sourceLineNo">8219</span>      (15 * Bytes.SIZEOF_LONG) +<a name="line.8219"></a>
+<span class="sourceLineNo">8220</span>      3 * Bytes.SIZEOF_BOOLEAN);<a name="line.8220"></a>
+<span class="sourceLineNo">8221</span><a name="line.8221"></a>
+<span class="sourceLineNo">8222</span>  // woefully out of date - currently missing:<a name="line.8222"></a>
+<span class="sourceLineNo">8223</span>  // 1 x HashMap - coprocessorServiceHandlers<a name="line.8223"></a>
+<span class="sourceLineNo">8224</span>  // 6 x LongAdder - numMutationsWithoutWAL, dataInMemoryWithoutWAL,<a name="line.8224"></a>
+<span class="sourceLineNo">8225</span>  //   checkAndMutateChecksPassed, checkAndMutateChecksFailed, readRequestsCount,<a name="line.8225"></a>
+<span class="sourceLineNo">8226</span>  //   writeRequestsCount, cpRequestsCount<a name="line.8226"></a>
+<span class="sourceLineNo">8227</span>  // 1 x HRegion$WriteState - writestate<a name="line.8227"></a>
+<span class="sourceLineNo">8228</span>  // 1 x RegionCoprocessorHost - coprocessorHost<a name="line.8228"></a>
+<span class="sourceLineNo">8229</span>  // 1 x RegionSplitPolicy - splitPolicy<a name="line.8229"></a>
+<span class="sourceLineNo">8230</span>  // 1 x MetricsRegion - metricsRegion<a name="line.8230"></a>
+<span class="sourceLineNo">8231</span>  // 1 x MetricsRegionWrapperImpl - metricsRegionWrapper<a name="line.8231"></a>
+<span class="sourceLineNo">8232</span>  public static final long DEEP_OVERHEAD = FIXED_OVERHEAD +<a name="line.8232"></a>
+<span class="sourceLineNo">8233</span>      ClassSize.OBJECT + // closeLock<a name="line.8233"></a>
+<span class="sourceLineNo">8234</span>      (2 * ClassSize.ATOMIC_BOOLEAN) + // closed, closing<a name="line.8234"></a>
+<span class="sourceLineNo">8235</span>      (3 * ClassSize.ATOMIC_LONG) + // numPutsWithoutWAL, dataInMemoryWithoutWAL,<a name="line.8235"></a>
+<span class="sourceLineNo">8236</span>                                    // compactionsFailed<a name="line.8236"></a>
+<span class="sourceLineNo">8237</span>      (2 * ClassSize.CONCURRENT_HASHMAP) +  // lockedRows, scannerReadPoints<a name="line.8237"></a>
+<span class="sourceLineNo">8238</span>      WriteState.HEAP_SIZE + // writestate<a name="line.8238"></a>
+<span class="sourceLineNo">8239</span>      ClassSize.CONCURRENT_SKIPLISTMAP + ClassSize.CONCURRENT_SKIPLISTMAP_ENTRY + // stores<a name="line.8239"></a>
+<span class="sourceLineNo">8240</span>      (2 * ClassSize.REENTRANT_LOCK) + // lock, updatesLock<a name="line.8240"></a>
+<span class="sourceLineNo">8241</span>      MultiVersionConcurrencyControl.FIXED_SIZE // mvcc<a name="line.8241"></a>
+<span class="sourceLineNo">8242</span>      + 2 * ClassSize.TREEMAP // maxSeqIdInStores, replicationScopes<a name="line.8242"></a>
+<span class="sourceLineNo">8243</span>      + 2 * ClassSize.ATOMIC_INTEGER // majorInProgress, minorInProgress<a name="line.8243"></a>
+<span class="sourceLineNo">8244</span>      + ClassSize.STORE_SERVICES // store services<a name="line.8244"></a>
+<span class="sourceLineNo">8245</span>      + StoreHotnessProtector.FIXED_SIZE<a name="line.8245"></a>
+<span class="sourceLineNo">8246</span>      ;<a name="line.8246"></a>
+<span class="sourceLineNo">8247</span><a name="line.8247"></a>
+<span class="sourceLineNo">8248</span>  @Override<a name="line.8248"></a>
+<span class="sourceLineNo">8249</span>  public long heapSize() {<a name="line.8249"></a>
+<span class="sourceLineNo">8250</span>    // this does not take into account row locks, recent flushes, mvcc entries, and more<a name="line.8250"></a>
+<span class="sourceLineNo">8251</span>    return DEEP_OVERHEAD + stores.values().stream().mapToLong(HStore::heapSize).sum();<a name="line.8251"></a>
+<span class="sourceLineNo">8252</span>  }<a name="line.8252"></a>
+<span class="sourceLineNo">8253</span><a name="line.8253"></a>
+<span class="sourceLineNo">8254</span>  /**<a name="line.8254"></a>
+<span class="sourceLineNo">8255</span>   * Registers a new protocol buffer {@link Service} subclass as a coprocessor endpoint to<a name="line.8255"></a>
+<span class="sourceLineNo">8256</span>   * be available for handling Region#execService(com.google.protobuf.RpcController,<a name="line.8256"></a>
+<span class="sourceLineNo">8257</span>   *    org.apache.hadoop.hbase.protobuf.generated.ClientProtos.CoprocessorServiceCall) calls.<a name="line.8257"></a>
+<span class="sourceLineNo">8258</span>   *<a name="line.8258"></a>
+<span class="sourceLineNo">8259</span>   * &lt;p&gt;<a name="line.8259"></a>
+<span class="sourceLineNo">8260</span>   * Only a single instance may be registered per region for a given {@link Service} subclass (the<a name="line.8260"></a>
+<span class="sourceLineNo">8261</span>   * instances are keyed on {@link com.google.protobuf.Descriptors.ServiceDescriptor#getFullName()}.<a name="line.8261"></a>
+<span class="sourceLineNo">8262</span>   * After the first registration, subsequent calls with the same service name will fail with<a name="line.8262"></a>
+<span class="sourceLineNo">8263</span>   * a return value of {@code false}.<a name="line.8263"></a>
+<span class="sourceLineNo">8264</span>   * &lt;/p&gt;<a name="line.8264"></a>
+<span class="sourceLineNo">8265</span>   * @param instance the {@code Service} subclass instance to expose as a coprocessor endpoint<a name="line.8265"></a>
+<span class="sourceLineNo">8266</span>   * @return {@code true} if the registration was successful, {@code false}<a name="line.8266"></a>
+<span class="sourceLineNo">8267</span>   * otherwise<a name="line.8267"></a>
+<span class="sourceLineNo">8268</span>   */<a name="line.8268"></a>
+<span class="sourceLineNo">8269</span>  public boolean registerService(com.google.protobuf.Service instance) {<a name="line.8269"></a>
+<span class="sourceLineNo">8270</span>    /*<a name="line.8270"></a>
+<span class="sourceLineNo">8271</span>     * No stacking of instances is allowed for a single service name<a name="line.8271"></a>
+<span class="sourceLineNo">8272</span>     */<a name="line.8272"></a>
+<span class="sourceLineNo">8273</span>    com.google.protobuf.Descriptors.ServiceDescriptor serviceDesc = instance.getDescriptorForType();<a name="line.8273"></a>
+<span class="sourceLineNo">8274</span>    String serviceName = CoprocessorRpcUtils.getServiceName(serviceDesc);<a name="line.8274"></a>
+<span class="sourceLineNo">8275</span>    if (coprocessorServiceHandlers.containsKey(serviceName)) {<a name="line.8275"></a>
+<span class="sourceLineNo">8276</span>      LOG.error("Coprocessor service " + serviceName +<a name="line.8276"></a>
+<span class="sourceLineNo">8277</span>          " already registered, rejecting request from " + instance);<a name="line.8277"></a>
+<span class="sourceLineNo">8278</span>      return false;<a name="line.8278"></a>
+<span class="sourceLineNo">8279</span>    }<a name="line.8279"></a>
+<span class="sourceLineNo">8280</span><a name="line.8280"></a>
+<span class="sourceLineNo">8281</span>    coprocessorServiceHandlers.put(serviceName, instance);<a name="line.8281"></a>
+<span class="sourceLineNo">8282</span>    if (LOG.isDebugEnabled()) {<a name="line.8282"></a>
+<span class="sourceLineNo">8283</span>      LOG.debug("Registered coprocessor service: region=" +<a name="line.8283"></a>
+<span class="sourceLineNo">8284</span>          Bytes.toStringBinary(getRegionInfo().getRegionName()) +<a name="line.8284"></a>
+<span class="sourceLineNo">8285</span>          " service=" + serviceName);<a name="line.8285"></a>
+<span class="sourceLineNo">8286</span>    }<a name="line.8286"></a>
+<span class="sourceLineNo">8287</span>    return true;<a name="line.8287"></a>
+<span class="sourceLineNo">8288</span>  }<a name="line.8288"></a>
+<span class="sourceLineNo">8289</span><a name="line.8289"></a>
+<span class="sourceLineNo">8290</span>  /**<a name="line.8290"></a>
+<span class="sourceLineNo">8291</span>   * Executes a single protocol buffer coprocessor endpoint {@link Service} method using<a name="line.8291"></a>
+<span class="sourceLineNo">8292</span>   * the registered protocol handlers.  {@link Service} implementations must be registered via the<a name="line.8292"></a>
+<span class="sourceLineNo">8293</span>   * {@link #registerService(com.google.protobuf.Service)}<a name="line.8293"></a>
+<span class="sourceLineNo">8294</span>   * method before they are available.<a name="line.8294"></a>
+<span class="sourceLineNo">8295</span>   *<a name="line.8295"></a>
+<span class="sourceLineNo">8296</span>   * @param controller an {@code RpcContoller} implementation to pass to the invoked service<a name="line.8296"></a>
+<span class="sourceLineNo">8297</span>   * @param call a {@code CoprocessorServiceCall} instance identifying the service, method,<a name="line.8297"></a>
+<span class="sourceLineNo">8298</span>   *     and parameters for the method invocation<a name="line.8298"></a>
+<span class="sourceLineNo">8299</span>   * @return a protocol buffer {@code Message} instance containing the method's result<a name="line.8299"></a>
+<span class="sourceLineNo">8300</span>   * @throws IOException if no registered service handler is found or an error<a name="line.8300"></a>
+<span class="sourceLineNo">8301</span>   *     occurs during the invocation<a name="line.8301"></a>
+<span class="sourceLineNo">8302</span>   * @see #registerService(com.google.protobuf.Service)<a name="line.8302"></a>
+<span class="sourceLineNo">8303</span>   */<a name="line.8303"></a>
+<span class="sourceLineNo">8304</span>  public com.google.protobuf.Message execService(com.google.protobuf.RpcController controller,<a name="line.8304"></a>
+<span class="sourceLineNo">8305</span>      CoprocessorServiceCall call) throws IOException {<a name="line.8305"></a>
+<span class="sourceLineNo">8306</span>    String serviceName = call.getServiceName();<a name="line.8306"></a>
+<span class="sourceLineNo">8307</span>    com.google.protobuf.Service service = coprocessorServiceHandlers.get(serviceName);<a name="line.8307"></a>
+<span class="sourceLineNo">8308</span>    if (service == null) {<a name="line.8308"></a>
+<span class="sourceLineNo">8309</span>      throw new UnknownProtocolException(null, "No registered coprocessor service found for " +<a name="line.8309"></a>
+<span class="sourceLineNo">8310</span>          serviceName + " in region " + Bytes.toStringBinary(getRegionInfo().getRegionName()));<a name="line.8310"></a>
+<span class="sourceLineNo">8311</span>    }<a name="line.8311"></a>
+<span class="sourceLineNo">8312</span>    com.google.protobuf.Descriptors.ServiceDescriptor serviceDesc = service.getDescriptorForType();<a name="line.8312"></a>
 <span class="sourceLineNo">8313</span><a name="line.8313"></a>
-<span class="sourceLineNo">8314</span>    com.google.protobuf.Message.Builder builder =<a name="line.8314"></a>
-<span class="sourceLineNo">8315</span>        service.getRequestPrototype(methodDesc).newBuilderForType();<a name="line.8315"></a>
-<span class="sourceLineNo">8316</span><a name="line.8316"></a>
-<span class="sourceLineNo">8317</span>    org.apache.hadoop.hbase.protobuf.ProtobufUtil.mergeFrom(builder,<a name="line.8317"></a>
-<span class="sourceLineNo">8318</span>        call.getRequest().toByteArray());<a name="line.8318"></a>
-<span class="sourceLineNo">8319</span>    com.google.protobuf.Message request =<a name="line.8319"></a>
-<span class="sourceLineNo">8320</span>        CoprocessorRpcUtils.getRequest(service, methodDesc, call.getRequest());<a name="line.8320"></a>
+<span class="sourceLineNo">8314</span>    cpRequestsCount.increment();<a name="line.8314"></a>
+<span class="sourceLineNo">8315</span>    String methodName = call.getMethodName();<a name="line.8315"></a>
+<span class="sourceLineNo">8316</span>    com.google.protobuf.Descriptors.MethodDescriptor methodDesc =<a name="line.8316"></a>
+<span class="sourceLineNo">8317</span>        CoprocessorRpcUtils.getMethodDescriptor(methodName, serviceDesc);<a name="line.8317"></a>
+<span class="sourceLineNo">8318</span><a name="line.8318"></a>
+<span class="sourceLineNo">8319</span>    com.google.protobuf.Message.Builder builder =<a name="line.8319"></a>
+<span class="sourceLineNo">8320</span>        service.getRequestPrototype(methodDesc).newBuilderForType();<a name="line.8320"></a>
 <span class="sourceLineNo">8321</span><a name="line.8321"></a>
-<span class="sourceLineNo">8322</span>    if (coprocessorHost != null) {<a name="line.8322"></a>
-<span class="sourceLineNo">8323</span>      request = coprocessorHost.preEndpointInvocation(service, methodName, request);<a name="line.8323"></a>
-<span class="sourceLineNo">8324</span>    }<a name="line.8324"></a>
-<span class="sourceLineNo">8325</span><a name="line.8325"></a>
-<span class="sourceLineNo">8326</span>    final com.google.protobuf.Message.Builder responseBuilder =<a name="line.8326"></a>
-<span class="sourceLineNo">8327</span>        service.getResponsePrototype(methodDesc).newBuilderForType();<a name="line.8327"></a>
-<span class="sourceLineNo">8328</span>    service.callMethod(methodDesc, controller, request,<a name="line.8328"></a>
-<span class="sourceLineNo">8329</span>        new com.google.protobuf.RpcCallback&lt;com.google.protobuf.Message&gt;() {<a name="line.8329"></a>
-<span class="sourceLineNo">8330</span>      @Override<a name="line.8330"></a>
-<span class="sourceLineNo">8331</span>      public void run(com.google.protobuf.Message message) {<a name="line.8331"></a>
-<span class="sourceLineNo">8332</span>        if (message != null) {<a name="line.8332"></a>
-<span class="sourceLineNo">8333</span>          responseBuilder.mergeFrom(message);<a name="line.8333"></a>
-<span class="sourceLineNo">8334</span>        }<a name="line.8334"></a>
-<span class="sourceLineNo">8335</span>      }<a name="line.8335"></a>
-<span class="sourceLineNo">8336</span>    });<a name="line.8336"></a>
-<span class="sourceLineNo">8337</span><a name="line.8337"></a>
-<span class="sourceLineNo">8338</span>    if (coprocessorHost != null) {<a name="line.8338"></a>
-<span class="sourceLineNo">8339</span>      coprocessorHost.postEndpointInvocation(service, methodName, request, responseBuilder);<a name="line.8339"></a>
-<span class="sourceLineNo">8340</span>    }<a name="line.8340"></a>
-<span class="sourceLineNo">8341</span>    IOException exception =<a name="line.8341"></a>
-<span class="sourceLineNo">8342</span>        org.apache.hadoop.hbase.ipc.CoprocessorRpcUtils.getControllerException(controller);<a name="line.8342"></a>
-<span class="sourceLineNo">8343</span>    if (exception != null) {<a name="line.8343"></a>
-<span class="sourceLineNo">8344</span>      throw exception;<a name="line.8344"></a>
+<span class="sourceLineNo">8322</span>    org.apache.hadoop.hbase.protobuf.ProtobufUtil.mergeFrom(builder,<a name="line.8322"></a>
+<span class="sourceLineNo">8323</span>        call.getRequest().toByteArray());<a name="line.8323"></a>
+<span class="sourceLineNo">8324</span>    com.google.protobuf.Message request =<a name="line.8324"></a>
+<span class="sourceLineNo">8325</span>        CoprocessorRpcUtils.getRequest(service, methodDesc, call.getRequest());<a name="line.8325"></a>
+<span class="sourceLineNo">8326</span><a name="line.8326"></a>
+<span class="sourceLineNo">8327</span>    if (coprocessorHost != null) {<a name="line.8327"></a>
+<span class="sourceLineNo">8328</span>      request = coprocessorHost.preEndpointInvocation(service, methodName, request);<a name="line.8328"></a>
+<span class="sourceLineNo">8329</span>    }<a name="line.8329"></a>
+<span class="sourceLineNo">8330</span><a name="line.8330"></a>
+<span class="sourceLineNo">8331</span>    final com.google.protobuf.Message.Builder responseBuilder =<a name="line.8331"></a>
+<span class="sourceLineNo">8332</span>        service.getResponsePrototype(methodDesc).newBuilderForType();<a name="line.8332"></a>
+<span class="sourceLineNo">8333</span>    service.callMethod(methodDesc, controller, request,<a name="line.8333"></a>
+<span class="sourceLineNo">8334</span>        new com.google.protobuf.RpcCallback&lt;com.google.protobuf.Message&gt;() {<a name="line.8334"></a>
+<span class="sourceLineNo">8335</span>      @Override<a name="line.8335"></a>
+<span class="sourceLineNo">8336</span>      public void run(com.google.protobuf.Message message) {<a name="line.8336"></a>
+<span class="sourceLineNo">8337</span>        if (message != null) {<a name="line.8337"></a>
+<span class="sourceLineNo">8338</span>          responseBuilder.mergeFrom(message);<a name="line.8338"></a>
+<span class="sourceLineNo">8339</span>        }<a name="line.8339"></a>
+<span class="sourceLineNo">8340</span>      }<a name="line.8340"></a>
+<span class="sourceLineNo">8341</span>    });<a name="line.8341"></a>
+<span class="sourceLineNo">8342</span><a name="line.8342"></a>
+<span class="sourceLineNo">8343</span>    if (coprocessorHost != null) {<a name="line.8343"></a>
+<span class="sourceLineNo">8344</span>      coprocessorHost.postEndpointInvocation(service, methodName, request, responseBuilder);<a name="line.8344"></a>
 <span class="sourceLineNo">8345</span>    }<a name="line.8345"></a>
-<span class="sourceLineNo">8346</span><a name="line.8346"></a>
-<span class="sourceLineNo">8347</span>    return responseBuilder.build();<a name="line.8347"></a>
-<span class="sourceLineNo">8348</span>  }<a name="line.8348"></a>
-<span class="sourceLineNo">8349</span><a name="line.8349"></a>
-<span class="sourceLineNo">8350</span>  boolean shouldForceSplit() {<a name="line.8350"></a>
-<span class="sourceLineNo">8351</span>    return this.splitRequest;<a name="line.8351"></a>
-<span class="sourceLineNo">8352</span>  }<a name="line.8352"></a>
-<span class="sourceLineNo">8353</span><a name="line.8353"></a>
-<span class="sourceLineNo">8354</span>  byte[] getExplicitSplitPoint() {<a name="line.8354"></a>
-<span class="sourceLineNo">8355</span>    return this.explicitSplitPoint;<a name="line.8355"></a>
-<span class="sourceLineNo">8356</span>  }<a name="line.8356"></a>
-<span class="sourceLineNo">8357</span><a name="line.8357"></a>
-<span class="sourceLineNo">8358</span>  void forceSplit(byte[] sp) {<a name="line.8358"></a>
-<span class="sourceLineNo">8359</span>    // This HRegion will go away after the forced split is successful<a name="line.8359"></a>
-<span class="sourceLineNo">8360</span>    // But if a forced split fails, we need to clear forced split.<a name="line.8360"></a>
-<span class="sourceLineNo">8361</span>    this.splitRequest = true;<a name="line.8361"></a>
-<span class="sourceLineNo">8362</span>    if (sp != null) {<a name="line.8362"></a>
-<span class="sourceLineNo">8363</span>      this.explicitSplitPoint = sp;<a name="line.8363"></a>
-<span class="sourceLineNo">8364</span>    }<a name="line.8364"></a>
-<span class="sourceLineNo">8365</span>  }<a name="line.8365"></a>
-<span class="sourceLineNo">8366</span><a name="line.8366"></a>
-<span class="sourceLineNo">8367</span>  void clearSplit() {<a name="line.8367"></a>
-<span class="sourceLineNo">8368</span>    this.splitRequest = false;<a name="line.8368"></a>
-<span class="sourceLineNo">8369</span>    this.explicitSplitPoint = null;<a name="line.8369"></a>
+<span class="sourceLineNo">8346</span>    IOException exception =<a name="line.8346"></a>
+<span class="sourceLineNo">8347</span>        org.apache.hadoop.hbase.ipc.CoprocessorRpcUtils.getControllerException(controller);<a name="line.8347"></a>
+<span class="sourceLineNo">8348</span>    if (exception != null) {<a name="line.8348"></a>
+<span class="sourceLineNo">8349</span>      throw exception;<a name="line.8349"></a>
+<span class="sourceLineNo">8350</span>    }<a name="line.8350"></a>
+<span class="sourceLineNo">8351</span><a name="line.8351"></a>
+<span class="sourceLineNo">8352</span>    return responseBuilder.build();<a name="line.8352"></a>
+<span class="sourceLineNo">8353</span>  }<a name="line.8353"></a>
+<span class="sourceLineNo">8354</span><a name="line.8354"></a>
+<span class="sourceLineNo">8355</span>  boolean shouldForceSplit() {<a name="line.8355"></a>
+<span class="sourceLineNo">8356</span>    return this.splitRequest;<a name="line.8356"></a>
+<span class="sourceLineNo">8357</span>  }<a name="line.8357"></a>
+<span class="sourceLineNo">8358</span><a name="line.8358"></a>
+<span class="sourceLineNo">8359</span>  byte[] getExplicitSplitPoint() {<a name="line.8359"></a>
+<span class="sourceLineNo">8360</span>    return this.explicitSplitPoint;<a name="line.8360"></a>
+<span class="sourceLineNo">8361</span>  }<a name="line.8361"></a>
+<span class="sourceLineNo">8362</span><a name="line.8362"></a>
+<span class="sourceLineNo">8363</span>  void forceSplit(byte[] sp) {<a name="line.8363"></a>
+<span class="sourceLineNo">8364</span>    // This HRegion will go away after the forced split is successful<a name="line.8364"></a>
+<span class="sourceLineNo">8365</span>    // But if a forced split fails, we need to clear forced split.<a name="line.8365"></a>
+<span class="sourceLineNo">8366</span>    this.splitRequest = true;<a name="line.8366"></a>
+<span class="sourceLineNo">8367</span>    if (sp != null) {<a name="line.8367"></a>
+<span class="sourceLineNo">8368</span>      this.explicitSplitPoint = sp;<a name="line.8368"></a>
+<span class="sourceLineNo">8369</span>    }<a name="line.8369"></a>
 <span class="sourceLineNo">8370</span>  }<a name="line.8370"></a>
 <span class="sourceLineNo">8371</span><a name="line.8371"></a>
-<span class="sourceLineNo">8372</span>  /**<a name="line.8372"></a>
-<span class="sourceLineNo">8373</span>   * Return the splitpoint. null indicates the region isn't splittable<a name="line.8373"></a>
-<span class="sourceLineNo">8374</span>   * If the splitpoint isn't explicitly specified, it will go over the stores<a name="line.8374"></a>
-<span class="sourceLineNo">8375</span>   * to find the best splitpoint. Currently the criteria of best splitpoint<a name="line.8375"></a>
-<span class="sourceLineNo">8376</span>   * is based on the size of the store.<a name="line.8376"></a>
-<span class="sourceLineNo">8377</span>   */<a name="line.8377"></a>
-<span class="sourceLineNo">8378</span>  public byte[] checkSplit() {<a name="line.8378"></a>
-<span class="sourceLineNo">8379</span>    // Can't split META<a name="line.8379"></a>
-<span class="sourceLineNo">8380</span>    if (this.getRegionInfo().isMetaRegion()) {<a name="line.8380"></a>
-<span class="sourceLineNo">8381</span>      if (shouldForceSplit()) {<a name="line.8381"></a>
-<span class="sourceLineNo">8382</span>        LOG.warn("Cannot split meta region in HBase 0.20 and above");<a name="line.8382"></a>
-<span class="sourceLineNo">8383</span>      }<a name="line.8383"></a>
-<span class="sourceLineNo">8384</span>      return null;<a name="line.8384"></a>
-<span class="sourceLineNo">8385</span>    }<a name="line.8385"></a>
-<span class="sourceLineNo">8386</span><a name="line.8386"></a>
-<span class="sourceLineNo">8387</span>    // Can't split a region that is closing.<a name="line.8387"></a>
-<span class="sourceLineNo">8388</span>    if (this.isClosing()) {<a name="line.8388"></a>
+<span class="sourceLineNo">8372</span>  void clearSplit() {<a name="line.8372"></a>
+<span class="sourceLineNo">8373</span>    this.splitRequest = false;<a name="line.8373"></a>
+<span class="sourceLineNo">8374</span>    this.explicitSplitPoint = null;<a name="line.8374"></a>
+<span class="sourceLineNo">8375</span>  }<a name="line.8375"></a>
+<span class="sourceLineNo">8376</span><a name="line.8376"></a>
+<span class="sourceLineNo">8377</span>  /**<a name="line.8377"></a>
+<span class="sourceLineNo">8378</span>   * Return the splitpoint. null indicates the region isn't splittable<a name="line.8378"></a>
+<span class="sourceLineNo">8379</span>   * If the splitpoint isn't explicitly specified, it will go over the stores<a name="line.8379"></a>
+<span class="sourceLineNo">8380</span>   * to find the best splitpoint. Currently the criteria of best splitpoint<a name="line.8380"></a>
+<span class="sourceLineNo">8381</span>   * is based on the size of the store.<a name="line.8381"></a>
+<span class="sourceLineNo">8382</span>   */<a name="line.8382"></a>
+<span class="sourceLineNo">8383</span>  public byte[] checkSplit() {<a name="line.8383"></a>
+<span class="sourceLineNo">8384</span>    // Can't split META<a name="line.8384"></a>
+<span class="sourceLineNo">8385</span>    if (this.getRegionInfo().isMetaRegion()) {<a name="line.8385"></a>
+<span class="sourceLineNo">8386</span>      if (shouldForceSplit()) {<a name="line.8386"></a>
+<span class="sourceLineNo">8387</span>        LOG.warn("Cannot split meta region in HBase 0.20 and above");<a name="line.8387"></a>
+<span class="sourceLineNo">8388</span>      }<a name="line.8388"></a>
 <span class="sourceLineNo">8389</span>      return null;<a name="line.8389"></a>
 <span class="sourceLineNo">8390</span>    }<a name="line.8390"></a>
 <span class="sourceLineNo">8391</span><a name="line.8391"></a>
-<span class="sourceLineNo">8392</span>    if (!splitPolicy.shouldSplit()) {<a name="line.8392"></a>
-<span class="sourceLineNo">8393</span>      return null;<a name="line.8393"></a>
-<span class="sourceLineNo">8394</span>    }<a name="line.8394"></a>
-<span class="sourceLineNo">8395</span><a name="line.8395"></a>
-<span class="sourceLineNo">8396</span>    byte[] ret = splitPolicy.getSplitPoint();<a name="line.8396"></a>
-<span class="sourceLineNo">8397</span><a name="line.8397"></a>
-<span class="sourceLineNo">8398</span>    if (ret != null) {<a name="line.8398"></a>
-<span class="sourceLineNo">8399</span>      try {<a name="line.8399"></a>
-<span class="sourceLineNo">8400</span>        checkRow(ret, "calculated split");<a name="line.8400"></a>
-<span class="sourceLineNo">8401</span>      } catch (IOException e) {<a name="line.8401"></a>
-<span class="sourceLineNo">8402</span>        LOG.error("Ignoring invalid split", e);<a name="line.8402"></a>
-<span class="sourceLineNo">8403</span>        return null;<a name="line.8403"></a>
-<span class="sourceLineNo">8404</span>      }<a name="line.8404"></a>
-<span class="sourceLineNo">8405</span>    }<a name="line.8405"></a>
-<span class="sourceLineNo">8406</span>    return ret;<a name="line.8406"></a>
-<span class="sourceLineNo">8407</span>  }<a name="line.8407"></a>
-<span class="sourceLineNo">8408</span><a name="line.8408"></a>
-<span class="sourceLineNo">8409</span>  /**<a name="line.8409"></a>
-<span class="sourceLineNo">8410</span>   * @return The priority that this region should have in the compaction queue<a name="line.8410"></a>
-<span class="sourceLineNo">8411</span>   */<a name="line.8411"></a>
-<span class="sourceLineNo">8412</span>  public int getCompactPriority() {<a name="line.8412"></a>
-<span class="sourceLineNo">8413</span>    return stores.values().stream().mapToInt(HStore::getCompactPriority).min()<a name="line.8413"></a>
-<span class="sourceLineNo">8414</span>        .orElse(Store.NO_PRIORITY);<a name="line.8414"></a>
-<span class="sourceLineNo">8415</span>  }<a name="line.8415"></a>
-<span class="sourceLineNo">8416</span><a name="line.8416"></a>
-<span class="sourceLineNo">8417</span>  /** @return the coprocessor host */<a name="line.8417"></a>
-<span class="sourceLineNo">8418</span>  public RegionCoprocessorHost getCoprocessorHost() {<a name="line.8418"></a>
-<span class="sourceLineNo">8419</span>    return coprocessorHost;<a name="line.8419"></a>
+<span class="sourceLineNo">8392</span>    // Can't split a region that is closing.<a name="line.8392"></a>
+<span class="sourceLineNo">8393</span>    if (this.isClosing()) {<a name="line.8393"></a>
+<span class="sourceLineNo">8394</span>      return null;<a name="line.8394"></a>
+<span class="sourceLineNo">8395</span>    }<a name="line.8395"></a>
+<span class="sourceLineNo">8396</span><a name="line.8396"></a>
+<span class="sourceLineNo">8397</span>    if (!splitPolicy.shouldSplit()) {<a name="line.8397"></a>
+<span class="sourceLineNo">8398</span>      return null;<a name="line.8398"></a>
+<span class="sourceLineNo">8399</span>    }<a name="line.8399"></a>
+<span class="sourceLineNo">8400</span><a name="line.8400"></a>
+<span class="sourceLineNo">8401</span>    byte[] ret = splitPolicy.getSplitPoint();<a name="line.8401"></a>
+<span class="sourceLineNo">8402</span><a name="line.8402"></a>
+<span class="sourceLineNo">8403</span>    if (ret != null) {<a name="line.8403"></a>
+<span class="sourceLineNo">8404</span>      try {<a name="line.8404"></a>
+<span class="sourceLineNo">8405</span>        checkRow(ret, "calculated split");<a name="line.8405"></a>
+<span class="sourceLineNo">8406</span>      } catch (IOException e) {<a name="line.8406"></a>
+<span class="sourceLineNo">8407</span>        LOG.error("Ignoring invalid split", e);<a name="line.8407"></a>
+<span class="sourceLineNo">8408</span>        return null;<a name="line.8408"></a>
+<span class="sourceLineNo">8409</span>      }<a name="line.8409"></a>
+<span class="sourceLineNo">8410</span>    }<a name="line.8410"></a>
+<span class="sourceLineNo">8411</span>    return ret;<a name="line.8411"></a>
+<span class="sourceLineNo">8412</span>  }<a name="line.8412"></a>
+<span class="sourceLineNo">8413</span><a name="line.8413"></a>
+<span class="sourceLineNo">8414</span>  /**<a name="line.8414"></a>
+<span class="sourceLineNo">8415</span>   * @return The priority that this region should have in the compaction queue<a name="line.8415"></a>
+<span class="sourceLineNo">8416</span>   */<a name="line.8416"></a>
+<span class="sourceLineNo">8417</span>  public int getCompactPriority() {<a name="line.8417"></a>
+<span class="sourceLineNo">8418</span>    return stores.values().stream().mapToInt(HStore::getCompactPriority).min()<a name="line.8418"></a>
+<span class="sourceLineNo">8419</span>        .orElse(Store.NO_PRIORITY);<a name="line.8419"></a>
 <span class="sourceLineNo">8420</span>  }<a name="line.8420"></a>
 <span class="sourceLineNo">8421</span><a name="line.8421"></a>
-<span class="sourceLineNo">8422</span>  /** @param coprocessorHost the new coprocessor host */<a name="line.8422"></a>
-<span class="sourceLineNo">8423</span>  @VisibleForTesting<a name="line.8423"></a>
-<span class="sourceLineNo">8424</span>  public void setCoprocessorHost(final RegionCoprocessorHost coprocessorHost) {<a name="line.8424"></a>
-<span class="sourceLineNo">8425</span>    this.coprocessorHost = coprocessorHost;<a name="line.8425"></a>
-<span class="sourceLineNo">8426</span>  }<a name="line.8426"></a>
-<span class="sourceLineNo">8427</span><a name="line.8427"></a>
-<span class="sourceLineNo">8428</span>  @Override<a name="line.8428"></a>
-<span class="sourceLineNo">8429</span>  public void startRegionOperation() throws IOException {<a name="line.8429"></a>
-<span class="sourceLineNo">8430</span>    startRegionOperation(Operation.ANY);<a name="line.8430"></a>
+<span class="sourceLineNo">8422</span>  /** @return the coprocessor host */<a name="line.8422"></a>
+<span class="sourceLineNo">8423</span>  public RegionCoprocessorHost getCoprocessorHost() {<a name="line.8423"></a>
+<span class="sourceLineNo">8424</span>    return coprocessorHost;<a name="line.8424"></a>
+<span class="sourceLineNo">8425</span>  }<a name="line.8425"></a>
+<span class="sourceLineNo">8426</span><a name="line.8426"></a>
+<span class="sourceLineNo">8427</span>  /** @param coprocessorHost the new coprocessor host */<a name="line.8427"></a>
+<span class="sourceLineNo">8428</span>  @VisibleForTesting<a name="line.8428"></a>
+<span class="sourceLineNo">8429</span>  public void setCoprocessorHost(final RegionCoprocessorHost coprocessorHost) {<a name="line.8429"></a>
+<span class="sourceLineNo">8430</span>    this.coprocessorHost = coprocessorHost;<a name="line.8430"></a>
 <span class="sourceLineNo">8431</span>  }<a name="line.8431"></a>
 <span class="sourceLineNo">8432</span><a name="line.8432"></a>
 <span class="sourceLineNo">8433</span>  @Override<a name="line.8433"></a>
-<span class="sourceLineNo">8434</span>  public void startRegionOperation(Operation op) throws IOException {<a name="line.8434"></a>
-<span class="sourceLineNo">8435</span>    switch (op) {<a name="line.8435"></a>
-<span class="sourceLineNo">8436</span>      case GET:  // read operations<a name="line.8436"></a>
-<span class="sourceLineNo">8437</span>      case SCAN:<a name="line.8437"></a>
-<span class="sourceLineNo">8438</span>        checkReadsEnabled();<a name="line.8438"></a>
-<span class="sourceLineNo">8439</span>        break;<a name="line.8439"></a>
-<span class="sourceLineNo">8440</span>      default:<a name="line.8440"></a>
-<span class="sourceLineNo">8441</span>        break;<a name="line.8441"></a>
-<span class="sourceLineNo">8442</span>    }<a name="line.8442"></a>
-<span class="sourceLineNo">8443</span>    if (op == Operation.MERGE_REGION || op == Operation.SPLIT_REGION<a name="line.8443"></a>
-<span class="sourceLineNo">8444</span>        || op == Operation.COMPACT_REGION || op == Operation.COMPACT_SWITCH) {<a name="line.8444"></a>
-<span class="sourceLineNo">8445</span>      // split, merge or compact region doesn't need to check the closing/closed state or lock the<a name="line.8445"></a>
-<span class="sourceLineNo">8446</span>      // region<a name="line.8446"></a>
-<span class="sourceLineNo">8447</span>      return;<a name="line.8447"></a>
-<span class="sourceLineNo">8448</span>    }<a name="line.8448"></a>
-<span class="sourceLineNo">8449</span>    if (this.closing.get()) {<a name="line.8449"></a>
-<span class="sourceLineNo">8450</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closing");<a name="line.8450"></a>
-<span class="sourceLineNo">8451</span>    }<a name="line.8451"></a>
-<span class="sourceLineNo">8452</span>    lock(lock.readLock());<a name="line.8452"></a>
-<span class="sourceLineNo">8453</span>    if (this.closed.get()) {<a name="line.8453"></a>
-<span class="sourceLineNo">8454</span>      lock.readLock().unlock();<a name="line.8454"></a>
-<span class="sourceLineNo">8455</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closed");<a name="line.8455"></a>
+<span class="sourceLineNo">8434</span>  public void startRegionOperation() throws IOException {<a name="line.8434"></a>
+<span class="sourceLineNo">8435</span>    startRegionOperation(Operation.ANY);<a name="line.8435"></a>
+<span class="sourceLineNo">8436</span>  }<a name="line.8436"></a>
+<span class="sourceLineNo">8437</span><a name="line.8437"></a>
+<span class="sourceLineNo">8438</span>  @Override<a name="line.8438"></a>
+<span class="sourceLineNo">8439</span>  public void startRegionOperation(Operation op) throws IOException {<a name="line.8439"></a>
+<span class="sourceLineNo">8440</span>    switch (op) {<a name="line.8440"></a>
+<span class="sourceLineNo">8441</span>      case GET:  // read operations<a name="line.8441"></a>
+<span class="sourceLineNo">8442</span>      case SCAN:<a name="line.8442"></a>
+<span class="sourceLineNo">8443</span>        checkReadsEnabled();<a name="line.8443"></a>
+<span class="sourceLineNo">8444</span>        break;<a name="line.8444"></a>
+<span class="sourceLineNo">8445</span>      default:<a name="line.8445"></a>
+<span class="sourceLineNo">8446</span>        break;<a name="line.8446"></a>
+<span class="sourceLineNo">8447</span>    }<a name="line.8447"></a>
+<span class="sourceLineNo">8448</span>    if (op == Operation.MERGE_REGION || op == Operation.SPLIT_REGION<a name="line.8448"></a>
+<span class="sourceLineNo">8449</span>        || op == Operation.COMPACT_REGION || op == Operation.COMPACT_SWITCH) {<a name="line.8449"></a>
+<span class="sourceLineNo">8450</span>      // split, merge or compact region doesn't need to check the closing/closed state or lock the<a name="line.8450"></a>
+<span class="sourceLineNo">8451</span>      // region<a name="line.8451"></a>
+<span class="sourceLineNo">8452</span>      return;<a name="line.8452"></a>
+<span class="sourceLineNo">8453</span>    }<a name="line.8453"></a>
+<span class="sourceLineNo">8454</span>    if (this.closing.get()) {<a name="line.8454"></a>
+<span class="sourceLineNo">8455</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closing");<a name="line.8455"></a>
 <span class="sourceLineNo">8456</span>    }<a name="line.8456"></a>
-<span class="sourceLineNo">8457</span>    // The unit for snapshot is a region. So, all stores for this region must be<a name="line.8457"></a>
-<span class="sourceLineNo">8458</span>    // prepared for snapshot operation before proceeding.<a name="line.8458"></a>
-<span class="sourceLineNo">8459</span>    if (op == Operation.SNAPSHOT) {<a name="line.8459"></a>
-<span class="sourceLineNo">8460</span>      stores.values().forEach(HStore::preSnapshotOperation);<a name="line.8460"></a>
+<span class="sourceLineNo">8457</span>    lock(lock.readLock());<a name="line.8457"></a>
+<span class="sourceLineNo">8458</span>    if (this.closed.get()) {<a name="line.8458"></a>
+<span class="sourceLineNo">8459</span>      lock.readLock().unlock();<a name="line.8459"></a>
+<span class="sourceLineNo">8460</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closed");<a name="line.8460"></a>
 <span class="sourceLineNo">8461</span>    }<a name="line.8461"></a>
-<span class="sourceLineNo">8462</span>    try {<a name="line.8462"></a>
-<span class="sourceLineNo">8463</span>      if (coprocessorHost != null) {<a name="line.8463"></a>
-<span class="sourceLineNo">8464</span>        coprocessorHost.postStartRegionOperation(op);<a name="line.8464"></a>
-<span class="sourceLineNo">8465</span>      }<a name="line.8465"></a>
-<span class="sourceLineNo">8466</span>    } catch (Exception e) {<a name="line.8466"></a>
-<span class="sourceLineNo">8467</span>      lock.readLock().unlock();<a name="line.8467"></a>
-<span class="sourceLineNo">8468</span>      throw new IOException(e);<a name="line.8468"></a>
-<span class="sourceLineNo">8469</span>    }<a name="line.8469"></a>
-<span class="sourceLineNo">8470</span>  }<a name="line.8470"></a>
-<span class="sourceLineNo">8471</span><a name="line.8471"></a>
-<span class="sourceLineNo">8472</span>  @Override<a name="line.8472"></a>
-<span class="sourceLineNo">8473</span>  public void closeRegionOperation() throws IOException {<a name="line.8473"></a>
-<span class="sourceLineNo">8474</span>    closeRegionOperation(Operation.ANY);<a name="line.8474"></a>
+<span class="sourceLineNo">8462</span>    // The unit for snapshot is a region. So, all stores for this region must be<a name="line.8462"></a>
+<span class="sourceLineNo">8463</span>    // prepared for snapshot operation before proceeding.<a name="line.8463"></a>
+<span class="sourceLineNo">8464</span>    if (op == Operation.SNAPSHOT) {<a name="line.8464"></a>
+<span class="sourceLineNo">8465</span>      stores.values().forEach(HStore::preSnapshotOperation);<a name="line.8465"></a>
+<span class="sourceLineNo">8466</span>    }<a name="line.8466"></a>
+<span class="sourceLineNo">8467</span>    try {<a name="line.8467"></a>
+<span class="sourceLineNo">8468</span>      if (coprocessorHost != null) {<a name="line.8468"></a>
+<span class="sourceLineNo">8469</span>        coprocessorHost.postStartRegionOperation(op);<a name="line.8469"></a>
+<span class="sourceLineNo">8470</span>      }<a name="line.8470"></a>
+<span class="sourceLineNo">8471</span>    } catch (Exception e) {<a name="line.8471"></a>
+<span class="sourceLineNo">8472</span>      lock.readLock().unlock();<a name="line.8472"></a>
+<span class="sourceLineNo">8473</span>      throw new IOException(e);<a name="line.8473"></a>
+<span class="sourceLineNo">8474</span>    }<a name="line.8474"></a>
 <span class="sourceLineNo">8475</span>  }<a name="line.8475"></a>
 <span class="sourceLineNo">8476</span><a name="line.8476"></a>
 <span class="sourceLineNo">8477</span>  @Override<a name="line.8477"></a>
-<span class="sourceLineNo">8478</span>  public void closeRegionOperation(Operation operation) throws IOException {<a name="line.8478"></a>
-<span class="sourceLineNo">8479</span>    if (operation == Operation.SNAPSHOT) {<a name="line.8479"></a>
-<span class="sourceLineNo">8480</span>      stores.values().forEach(HStore::postSnapshotOperation);<a name="line.8480"></a>
-<span class="sourceLineNo">8481</span>    }<a name="line.8481"></a>
-<span class="sourceLineNo">8482</span>    lock.readLock().unlock();<a name="line.8482"></a>
-<span class="sourceLineNo">8483</span>    if (coprocessorHost != null) {<a name="line.8483"></a>
-<span class="sourceLineNo">8484</span>      coprocessorHost.postCloseRegionOperation(operation);<a name="line.8484"></a>
-<span class="sourceLineNo">8485</span>    }<a name="line.8485"></a>
-<span class="sourceLineNo">8486</span>  }<a name="line.8486"></a>
-<span class="sourceLineNo">8487</span><a name="line.8487"></a>
-<span class="sourceLineNo">8488</span>  /**<a name="line.8488"></a>
-<span class="sourceLineNo">8489</span>   * This method needs to be called before any public call that reads or<a name="line.8489"></a>
-<span class="sourceLineNo">8490</span>   * modifies stores in bulk. It has to be called just before a try.<a name="line.8490"></a>
-<span class="sourceLineNo">8491</span>   * #closeBulkRegionOperation needs to be called in the try's finally block<a name="line.8491"></a>
-<span class="sourceLineNo">8492</span>   * Acquires a writelock and checks if the region is closing or closed.<a name="line.8492"></a>
-<span class="sourceLineNo">8493</span>   * @throws NotServingRegionException when the region is closing or closed<a name="line.8493"></a>
-<span class="sourceLineNo">8494</span>   * @throws RegionTooBusyException if failed to get the lock in time<a name="line.8494"></a>
-<span class="sourceLineNo">8495</span>   * @throws InterruptedIOException if interrupted while waiting for a lock<a name="line.8495"></a>
-<span class="sourceLineNo">8496</span>   */<a name="line.8496"></a>
-<span class="sourceLineNo">8497</span>  private void startBulkRegionOperation(boolean writeLockNeeded)<a name="line.8497"></a>
-<span class="sourceLineNo">8498</span>      throws NotServingRegionException, RegionTooBusyException, InterruptedIOException {<a name="line.8498"></a>
-<span class="sourceLineNo">8499</span>    if (this.closing.get()) {<a name="line.8499"></a>
-<span class="sourceLineNo">8500</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closing");<a name="line.8500"></a>
-<span class="sourceLineNo">8501</span>    }<a name="line.8501"></a>
-<span class="sourceLineNo">8502</span>    if (writeLockNeeded) lock(lock.writeLock());<a name="line.8502"></a>
-<span class="sourceLineNo">8503</span>    else lock(lock.readLock());<a name="line.8503"></a>
-<span class="sourceLineNo">8504</span>    if (this.closed.get()) {<a name="line.8504"></a>
-<span class="sourceLineNo">8505</span>      if (writeLockNeeded) lock.writeLock().unlock();<a name="line.8505"></a>
-<span class="sourceLineNo">8506</span>      else lock.readLock().unlock();<a name="line.8506"></a>
-<span class="sourceLineNo">8507</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closed");<a name="line.8507"></a>
-<span class="sourceLineNo">8508</span>    }<a name="line.8508"></a>
-<span class="sourceLineNo">8509</span>  }<a name="line.8509"></a>
-<span class="sourceLineNo">8510</span><a name="line.8510"></a>
-<span class="sourceLineNo">8511</span>  /**<a name="line.8511"></a>
-<span class="sourceLineNo">8512</span>   * Closes the lock. This needs to be called in the finally block corresponding<a name="line.8512"></a>
-<span class="sourceLineNo">8513</span>   * to the try block of #startRegionOperation<a name="line.8513"></a>
-<span class="sourceLineNo">8514</span>   */<a name="line.8514"></a>
-<span class="sourceLineNo">8515</span>  private void closeBulkRegionOperation(){<a name="line.8515"></a>
-<span class="sourceLineNo">8516</span>    if (lock.writeLock().isHeldByCurrentThread()) lock.writeLock().unlock();<a name="line.8516"></a>
-<span class="sourceLineNo">8517</span>    else lock.readLock().unlock();<a name="line.8517"></a>
-<span class="sourceLineNo">8518</span>  }<a name="line.8518"></a>
-<span class="sourceLineNo">8519</span><a name="line.8519"></a>
-<span class="sourceLineNo">8520</span>  /**<a name="line.8520"></a>
-<span class="sourceLineNo">8521</span>   * Update LongAdders for number of puts without wal and the size of possible data loss.<a name="line.8521"></a>
-<span class="sourceLineNo">8522</span>   * These information are exposed by the region server metrics.<a name="line.8522"></a>
-<span class="sourceLineNo">8523</span>   */<a name="line.8523"></a>
-<span class="sourceLineNo">8524</span>  private void recordMutationWithoutWal(final Map&lt;byte [], List&lt;Cell&gt;&gt; familyMap) {<a name="line.8524"></a>
-<span class="sourceLineNo">8525</span>    numMutationsWithoutWAL.increment();<a name="line.8525"></a>
-<span class="sourceLineNo">8526</span>    if (numMutationsWithoutWAL.sum() &lt;= 1) {<a name="line.8526"></a>
-<span class="sourceLineNo">8527</span>      LOG.info("writing data to region " + this +<a name="line.8527"></a>
-<span class="sourceLineNo">8528</span>               " with WAL disabled. Data may be lost in the event of a crash.");<a name="line.8528"></a>
-<span class="sourceLineNo">8529</span>    }<a name="line.8529"></a>
-<span class="sourceLineNo">8530</span><a name="line.8530"></a>
-<span class="sourceLineNo">8531</span>    long mutationSize = 0;<a name="line.8531"></a>
-<span class="sourceLineNo">8532</span>    for (List&lt;Cell&gt; cells: familyMap.values()) {<a name="line.8532"></a>
-<span class="sourceLineNo">8533</span>      // Optimization: 'foreach' loop is not used. See:<a name="line.8533"></a>
-<span class="sourceLineNo">8534</span>      // HBASE-12023 HRegion.applyFamilyMapToMemstore creates too many iterator objects<a name="line.8534"></a>
-<span class="sourceLineNo">8535</span>      assert cells instanceof RandomAccess;<a name="line.8535"></a>
-<span class="sourceLineNo">8536</span>      int listSize = cells.size();<a name="line.8536"></a>
-<span class="sourceLineNo">8537</span>      for (int i=0; i &lt; listSize; i++) {<a name="line.8537"></a>
-<span class="sourceLineNo">8538</span>        Cell cell = cells.get(i);<a name="line.8538"></a>
-<span class="sourceLineNo">8539</span>        mutationSize += cell.getSerializedSize();<a name="line.8539"></a>
-<span class="sourceLineNo">8540</span>      }<a name="line.8540"></a>
-<span class="sourceLineNo">8541</span>    }<a name="line.8541"></a>
-<span class="sourceLineNo">8542</span><a name="line.8542"></a>
-<span class="sourceLineNo">8543</span>    dataInMemoryWithoutWAL.add(mutationSize);<a name="line.8543"></a>
-<span class="sourceLineNo">8544</span>  }<a name="line.8544"></a>
-<span class="sourceLineNo">8545</span><a name="line.8545"></a>
-<span class="sourceLineNo">8546</span>  private void lock(final Lock lock) throws RegionTooBusyException, InterruptedIOException {<a name="line.8546"></a>
-<span class="sourceLineNo">8547</span>    lock(lock, 1);<a name="line.8547"></a>
-<span class="sourceLineNo">8548</span>  }<a name="line.8548"></a>
-<span class="sourceLineNo">8549</span><a name="line.8549"></a>
-<span class="sourceLineNo">8550</span>  /**<a name="line.8550"></a>
-<span class="sourceLineNo">8551</span>   * Try to acquire a lock.  Throw RegionTooBusyException<a name="line.8551"></a>
-<span class="sourceLineNo">8552</span>   * if failed to get the lock in time. Throw InterruptedIOException<a name="line.8552"></a>
-<span class="sourceLineNo">8553</span>   * if interrupted while waiting for the lock.<a name="line.8553"></a>
-<span class="sourceLineNo">8554</span>   */<a name="line.8554"></a>
-<span class="sourceLineNo">8555</span>  private void lock(final Lock lock, final int multiplier)<a name="line.8555"></a>
-<span class="sourceLineNo">8556</span>      throws RegionTooBusyException, InterruptedIOException {<a name="line.8556"></a>
-<span class="sourceLineNo">8557</span>    try {<a name="line.8557"></a>
-<span class="sourceLineNo">8558</span>      final long waitTime = Math.min(maxBusyWaitDuration,<a name="line.8558"></a>
-<span class="sourceLineNo">8559</span>          busyWaitDuration * Math.min(multiplier, maxBusyWaitMultiplier));<a name="line.8559"></a>
-<span class="sourceLineNo">8560</span>      if (!lock.tryLock(waitTime, TimeUnit.MILLISECONDS)) {<a name="line.8560"></a>
-<span class="sourceLineNo">8561</span>        // Don't print millis. Message is used as a key over in<a name="line.8561"></a>
-<span class="sourceLineNo">8562</span>        // RetriesExhaustedWithDetailsException processing.<a name="line.8562"></a>
-<span class="sourceLineNo">8563</span>        throw new RegionTooBusyException("Failed to obtain lock; regionName=" +<a name="line.8563"></a>
-<span class="sourceLineNo">8564</span>            (this.getRegionInfo() == null? "unknown":<a name="line.8564"></a>
-<span class="sourceLineNo">8565</span>                this.getRegionInfo().getRegionNameAsString()) +<a name="line.8565"></a>
-<span class="sourceLineNo">8566</span>            ", server=" + (this.getRegionServerServices() == null? "unknown":<a name="line.8566"></a>
-<span class="sourceLineNo">8567</span>                this.getRegionServerServices().getServerName()));<a name="line.8567"></a>
-<span class="sourceLineNo">8568</span>      }<a name="line.8568"></a>
-<span class="sourceLineNo">8569</span>    } catch (InterruptedException ie) {<a name="line.8569"></a>
-<span class="sourceLineNo">8570</span>      LOG.info("Interrupted while waiting for a lock");<a name="line.8570"></a>
-<span class="sourceLineNo">8571</span>      InterruptedIOException iie = new InterruptedIOException();<a name="line.8571"></a>
-<span class="sourceLineNo">8572</span>      iie.initCause(ie);<a name="line.8572"></a>
-<span class="sourceLineNo">8573</span>      throw iie;<a name="line.8573"></a>
-<span class="sourceLineNo">8574</span>    }<a name="line.8574"></a>
-<span class="sourceLineNo">8575</span>  }<a name="line.8575"></a>
-<span class="sourceLineNo">8576</span><a name="line.8576"></a>
-<span class="sourceLineNo">8577</span>  /**<a name="line.8577"></a>
-<span class="sourceLineNo">8578</span>   * Calls sync with the given transaction ID<a name="line.8578"></a>
-<span class="sourceLineNo">8579</span>   * @param txid should sync up to which transaction<a name="line.8579"></a>
-<span class="sourceLineNo">8580</span>   * @throws IOException If anything goes wrong with DFS<a name="line.8580"></a>
-<span class="sourceLineNo">8581</span>   */<a name="line.8581"></a>
-<span class="sourceLineNo">8582</span>  private void sync(long txid, Durability durability) throws IOException {<a name="line.8582"></a>
-<span class="sourceLineNo">8583</span>    if (this.getRegionInfo().isMetaRegion()) {<a name="line.8583"></a>
-<span class="sourceLineNo">8584</span>      this.wal.sync(txid);<a name="line.8584"></a>
-<span class="sourceLineNo">8585</span>    } else {<a name="line.8585"></a>
-<span class="sourceLineNo">8586</span>      switch(durability) {<a name="line.8586"></a>
-<span class="sourceLineNo">8587</span>      case USE_DEFAULT:<a name="line.8587"></a>
-<span class="sourceLineNo">8588</span>        // do what table defaults to<a name="line.8588"></a>
-<span class="sourceLineNo">8589</span>        if (shouldSyncWAL()) {<a name="line.8589"></a>
-<span class="sourceLineNo">8590</span>          this.wal.sync(txid);<a name="line.8590"></a>
-<span class="sourceLineNo">8591</span>        }<a name="line.8591"></a>
-<span class="sourceLineNo">8592</span>        break;<a name="line.8592"></a>
-<span class="sourceLineNo">8593</span>      case SKIP_WAL:<a name="line.8593"></a>
-<span class="sourceLineNo">8594</span>        // nothing do to<a name="line.8594"></a>
-<span class="sourceLineNo">8595</span>        break;<a name="line.8595"></a>
-<span class="sourceLineNo">8596</span>      case ASYNC_WAL:<a name="line.8596"></a>
-<span class="sourceLineNo">8597</span>        // nothing do to<a name="line.8597"></a>
-<span class="sourceLineNo">8598</span>        break;<a name="line.8598"></a>
-<span class="sourceLineNo">8599</span>      case SYNC_WAL:<a name="line.8599"></a>
-<span class="sourceLineNo">8600</span>          this.wal.sync(txid, false);<a name="line.8600"></a>
-<span class="sourceLineNo">8601</span>          break;<a name="line.8601"></a>
-<span class="sourceLineNo">8602</span>      case FSYNC_WAL:<a name="line.8602"></a>
-<span class="sourceLineNo">8603</span>          this.wal.sync(txid, true);<a name="line.8603"></a>
-<span class="sourceLineNo">8604</span>          break;<a name="line.8604"></a>
-<span class="sourceLineNo">8605</span>      default:<a name="line.8605"></a>
-<span class="sourceLineNo">8606</span>        throw new RuntimeException("Unknown durability " + durability);<a name="line.8606"></a>
-<span class="sourceLineNo">8607</span>      }<a name="line.8607"></a>
-<span class="sourceLineNo">8608</span>    }<a name="line.8608"></a>
-<span class="sourceLineNo">8609</span>  }<a name="line.8609"></a>
-<span class="sourceLineNo">8610</span><a name="line.8610"></a>
-<span class="sourceLineNo">8611</span>  /**<a name="line.8611"></a>
-<span class="sourceLineNo">8612</span>   * Check whether we should sync the wal from the table's durability settings<a name="line.8612"></a>
-<span class="sourceLineNo">8613</span>   */<a name="line.8613"></a>
-<span class="sourceLineNo">8614</span>  private boolean shouldSyncWAL() {<a name="line.8614"></a>
-<span class="sourceLineNo">8615</span>    return regionDurability.ordinal() &gt;  Durability.ASYNC_WAL.ordinal();<a name="line.8615"></a>
-<span class="sourceLineNo">8616</span>  }<a name="line.8616"></a>
-<span class="sourceLineNo">8617</span><a name="line.8617"></a>
-<span class="sourceLineNo">8618</span>  /**<a name="line.8618"></a>
-<span class="sourceLineNo">8619</span>   * A mocked list implementation - discards all updates.<a name="line.8619"></a>
-<span class="sourceLineNo">8620</span>   */<a name="line.8620"></a>
-<span class="sourceLineNo">8621</span>  private static final List&lt;Cell&gt; MOCKED_LIST = new AbstractList&lt;Cell&gt;() {<a name="line.8621"></a>
+<span class="sourceLineNo">8478</span>  public void closeRegionOperation() throws IOException {<a name="line.8478"></a>
+<span class="sourceLineNo">8479</span>    closeRegionOperation(Operation.ANY);<a name="line.8479"></a>
+<span class="sourceLineNo">8480</span>  }<a name="line.8480"></a>
+<span class="sourceLineNo">8481</span><a name="line.8481"></a>
+<span class="sourceLineNo">8482</span>  @Override<a name="line.8482"></a>
+<span class="sourceLineNo">8483</span>  public void closeRegionOperation(Operation operation) throws IOException {<a name="line.8483"></a>
+<span class="sourceLineNo">8484</span>    if (operation == Operation.SNAPSHOT) {<a name="line.8484"></a>
+<span class="sourceLineNo">8485</span>      stores.values().forEach(HStore::postSnapshotOperation);<a name="line.8485"></a>
+<span class="sourceLineNo">8486</span>    }<a name="line.8486"></a>
+<span class="sourceLineNo">8487</span>    lock.readLock().unlock();<a name="line.8487"></a>
+<span class="sourceLineNo">8488</span>    if (coprocessorHost != null) {<a name="line.8488"></a>
+<span class="sourceLineNo">8489</span>      coprocessorHost.postCloseRegionOperation(operation);<a name="line.8489"></a>
+<span class="sourceLineNo">8490</span>    }<a name="line.8490"></a>
+<span class="sourceLineNo">8491</span>  }<a name="line.8491"></a>
+<span class="sourceLineNo">8492</span><a name="line.8492"></a>
+<span class="sourceLineNo">8493</span>  /**<a name="line.8493"></a>
+<span class="sourceLineNo">8494</span>   * This method needs to be called before any public call that reads or<a name="line.8494"></a>
+<span class="sourceLineNo">8495</span>   * modifies stores in bulk. It has to be called just before a try.<a name="line.8495"></a>
+<span class="sourceLineNo">8496</span>   * #closeBulkRegionOperation needs to be called in the try's finally block<a name="line.8496"></a>
+<span class="sourceLineNo">8497</span>   * Acquires a writelock and checks if the region is closing or closed.<a name="line.8497"></a>
+<span class="sourceLineNo">8498</span>   * @throws NotServingRegionException when the region is closing or closed<a name="line.8498"></a>
+<span class="sourceLineNo">8499</span>   * @throws RegionTooBusyException if failed to get the lock in time<a name="line.8499"></a>
+<span class="sourceLineNo">8500</span>   * @throws InterruptedIOException if interrupted while waiting for a lock<a name="line.8500"></a>
+<span class="sourceLineNo">8501</span>   */<a name="line.8501"></a>
+<span class="sourceLineNo">8502</span>  private void startBulkRegionOperation(boolean writeLockNeeded)<a name="line.8502"></a>
+<span class="sourceLineNo">8503</span>      throws NotServingRegionException, RegionTooBusyException, InterruptedIOException {<a name="line.8503"></a>
+<span class="sourceLineNo">8504</span>    if (this.closing.get()) {<a name="line.8504"></a>
+<span class="sourceLineNo">8505</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closing");<a name="line.8505"></a>
+<span class="sourceLineNo">8506</span>    }<a name="line.8506"></a>
+<span class="sourceLineNo">8507</span>    if (writeLockNeeded) lock(lock.writeLock());<a name="line.8507"></a>
+<span class="sourceLineNo">8508</span>    else lock(lock.readLock());<a name="line.8508"></a>
+<span class="sourceLineNo">8509</span>    if (this.closed.get()) {<a name="line.8509"></a>
+<span class="sourceLineNo">8510</span>      if (writeLockNeeded) lock.writeLock().unlock();<a name="line.8510"></a>
+<span class="sourceLineNo">8511</span>      else lock.readLock().unlock();<a name="line.8511"></a>
+<span class="sourceLineNo">8512</span>      throw new NotServingRegionException(getRegionInfo().getRegionNameAsString() + " is closed");<a name="line.8512"></a>
+<span class="sourceLineNo">8513</span>    }<a name="line.8513"></a>
+<span class="sourceLineNo">8514</span>  }<a name="line.8514"></a>
+<span class="sourceLineNo">8515</span><a name="line.8515"></a>
+<span class="sourceLineNo">8516</span>  /**<a name="line.8516"></a>
+<span class="sourceLineNo">8517</span>   * Closes the lock. This needs to be called in the finally block corresponding<a name="line.8517"></a>
+<span class="sourceLineNo">8518</span>   * to the try block of #startRegionOperation<a name="line.8518"></a>
+<span class="sourceLineNo">8519</span>   */<a name="line.8519"></a>
+<span class="sourceLineNo">8520</span>  private void closeBulkRegionOperation(){<a name="line.8520"></a>
+<span class="sourceLineNo">8521</span>    if (lock.writeLock().isHeldByCurrentThread()) lock.writeLock().unlock();<a name="line.8521"></a>
+<span class="sourceLineNo">8522</span>    else lock.readLock().unlock();<a name="line.8522"></a>
+<span class="sourceLineNo">8523</span>  }<a name="line.8523"></a>
+<span class="sourceLineNo">8524</span><a name="line.8524"></a>
+<span class="sourceLineNo">8525</span>  /**<a name="line.8525"></a>
+<span class="sourceLineNo">8526</span>   * Update LongAdders for number of puts without wal and the size of possible data loss.<a name="line.8526"></a>
+<span class="sourceLineNo">8527</span>   * These information are exposed by the region server metrics.<a name="line.8527"></a>
+<span class="sourceLineNo">8528</span>   */<a name="line.8528"></a>
+<span class="sourceLineNo">8529</span>  private void recordMutationWithoutWal(final Map&lt;byte [], List&lt;Cell&gt;&gt; familyMap) {<a name="line.8529"></a>
+<span class="sourceLineNo">8530</span>    numMutationsWithoutWAL.increment();<a name="line.8530"></a>
+<span class="sourceLineNo">8531</span>    if (numMutationsWithoutWAL.sum() &lt;= 1) {<a name="line.8531"></a>
+<span class="sourceLineNo">8532</span>      LOG.info("writing data to region " + this +<a name="line.8532"></a>
+<span class="sourceLineNo">8533</span>               " with WAL disabled. Data may be lost in the event of a crash.");<a name="line.8533"></a>
+<span class="sourceLineNo">8534</span>    }<a name="line.8534"></a>
+<span class="sourceLineNo">8535</span><a name="line.8535"></a>
+<span class="sourceLineNo">8536</span>    long mutationSize = 0;<a name="line.8536"></a>
+<span class="sourceLineNo">8537</span>    for (List&lt;Cell&gt; cells: familyMap.values()) {<a name="line.8537"></a>
+<span class="sourceLineNo">8538</span>      // Optimization: 'foreach' loop is not used. See:<a name="line.8538"></a>
+<span class="sourceLineNo">8539</span>      // HBASE-12023 HRegion.applyFamilyMapToMemstore creates too many iterator objects<a name="line.8539"></a>
+<span class="sourceLineNo">8540</span>      assert cells instanceof RandomAccess;<a name="line.8540"></a>
+<span class="sourceLineNo">8541</span>      int listSize = cells.size();<a name="line.8541"></a>
+<span class="sourceLineNo">8542</span>      for (int i=0; i &lt; listSize; i++) {<a name="line.8542"></a>
+<span class="sourceLineNo">8543</span>        Cell cell = cells.get(i);<a name="line.8543"></a>
+<span class="sourceLineNo">8544</span>        mutationSize += cell.getSerializedSize();<a name="line.8544"></a>
+<span class="sourceLineNo">8545</span>      }<a name="line.8545"></a>
+<span class="sourceLineNo">8546</span>    }<a name="line.8546"></a>
+<span class="sourceLineNo">8547</span><a name="line.8547"></a>
+<span class="sourceLineNo">8548</span>    dataInMemoryWithoutWAL.add(mutationSize);<a name="line.8548"></a>
+<span class="sourceLineNo">8549</span>  }<a name="line.8549"></a>
+<span class="sourceLineNo">8550</span><a name="line.8550"></a>
+<span class="sourceLineNo">8551</span>  private void lock(final Lock lock) throws RegionTooBusyException, InterruptedIOException {<a name="line.8551"></a>
+<span class="sourceLineNo">8552</span>    lock(lock, 1);<a name="line.8552"></a>
+<span class="sourceLineNo">8553</span>  }<a name="line.8553"></a>
+<span class="sourceLineNo">8554</span><a name="line.8554"></a>
+<span class="sourceLineNo">8555</span>  /**<a name="line.8555"></a>
+<span class="sourceLineNo">8556</span>   * Try to acquire a lock.  Throw RegionTooBusyException<a name="line.8556"></a>
+<span class="sourceLineNo">8557</span>   * if failed to get the lock in time. Throw InterruptedIOException<a name="line.8557"></a>
+<span class="sourceLineNo">8558</span>   * if interrupted while waiting for the lock.<a name="line.8558"></a>
+<span class="sourceLineNo">8559</span>   */<a name="line.8559"></a>
+<span class="sourceLineNo">8560</span>  private void lock(final Lock lock, final int multiplier)<a name="line.8560"></a>
+<span class="sourceLineNo">8561</span>      throws RegionTooBusyException, InterruptedIOException {<a name="line.8561"></a>
+<span class="sourceLineNo">8562</span>    try {<a name="line.8562"></a>
+<span class="sourceLineNo">8563</span>      final long waitTime = Math.min(maxBusyWaitDuration,<a name="line.8563"></a>
+<span class="sourceLineNo">8564</span>          busyWaitDuration * Math.min(multiplier, maxBusyWaitMultiplier));<a name="line.8564"></a>
+<span class="sourceLineNo">8565</span>      if (!lock.tryLock(waitTime, TimeUnit.MILLISECONDS)) {<a name="line.8565"></a>
+<span class="sourceLineNo">8566</span>        // Don't print millis. Message is used as a key over in<a name="line.8566"></a>
+<span class="sourceLineNo">8567</span>        // RetriesExhaustedWithDetailsException processing.<a name="line.8567"></a>
+<span class="sourceLineNo">8568</span>        throw new RegionTooBusyException("Failed to obtain lock; regionName=" +<a name="line.8568"></a>
+<span class="sourceLineNo">8569</span>            (this.getRegionInfo() == null? "unknown":<a name="line.8569"></a>
+<span class="sourceLineNo">8570</span>                this.getRegionInfo().getRegionNameAsString()) +<a name="line.8570"></a>
+<span class="sourceLineNo">8571</span>            ", server=" + (this.getRegionServerServices() == null? "unknown":<a name="line.8571"></a>
+<span class="sourceLineNo">8572</span>                this.getRegionServerServices().getServerName()));<a name="line.8572"></a>
+<span class="sourceLineNo">8573</span>      }<a name="line.8573"></a>
+<span class="sourceLineNo">8574</span>    } catch (InterruptedException ie) {<a name="line.8574"></a>
+<span class="sourceLineNo">8575</span>      LOG.info("Interrupted while waiting for a lock");<a name="line.8575"></a>
+<span class="sourceLineNo">8576</span>      InterruptedIOException iie = new InterruptedIOException();<a name="line.8576"></a>
+<span class="sourceLineNo">8577</span>      iie.initCause(ie);<a name="line.8577"></a>
+<span class="sourceLineNo">8578</span>      throw iie;<a name="line.8578"></a>
+<span class="sourceLineNo">8579</span>    }<a name="line.8579"></a>
+<span class="sourceLineNo">8580</span>  }<a name="line.8580"></a>
+<span class="sourceLineNo">8581</span><a name="line.8581"></a>
+<span class="sourceLineNo">8582</span>  /**<a name="line.8582"></a>
+<span class="sourceLineNo">8583</span>   * Calls sync with the given transaction ID<a name="line.8583"></a>
+<span class="sourceLineNo">8584</span>   * @param txid should sync up to which transaction<a name="line.8584"></a>
+<span class="sourceLineNo">8585</span>   * @throws IOException If anything goes wrong with DFS<a name="line.8585"></a>
+<span class="sourceLineNo">8586</span>   */<a name="line.8586"></a>
+<span class="sourceLineNo">8587</span>  private void sync(long txid, Durability durability) throws IOException {<a name="line.8587"></a>
+<span class="sourceLineNo">8588</span>    if (this.getRegionInfo().isMetaRegion()) {<a name="line.8588"></a>
+<span class="sourceLineNo">8589</span>      this.wal.sync(txid);<a name="line.8589"></a>
+<span class="sourceLineNo">8590</span>    } else {<a name="line.8590"></a>
+<span class="sourceLineNo">8591</span>      switch(durability) {<a name="line.8591"></a>
+<span class="sourceLineNo">8592</span>      case USE_DEFAULT:<a name="line.8592"></a>
+<span class="sourceLineNo">8593</span>        // do what table defaults to<a name="line.8593"></a>
+<span class="sourceLineNo">8594</span>        if (shouldSyncWAL()) {<a name="line.8594"></a>
+<span class="sourceLineNo">8595</span>          this.wal.sync(txid);<a name="line.8595"></a>
+<span class="sourceLineNo">8596</span>        }<a name="line.8596"></a>
+<span class="sourceLineNo">8597</span>        break;<a name="line.8597"></a>
+<span class="sourceLineNo">8598</span>      case SKIP_WAL:<a name="line.8598"></a>
+<span class="sourceLineNo">8599</span>        // nothing do to<a name="line.8599"></a>
+<span class="sourceLineNo">8600</span>        break;<a name="line.8600"></a>
+<span class="sourceLineNo">8601</span>      case ASYNC_WAL:<a name="line.8601"></a>
+<span class="sourceLineNo">8602</span>        // nothing do to<a name="line.8602"></a>
+<span class="sourceLineNo">8603</span>        break;<a name="line.8603"></a>
+<span class="sourceLineNo">8604</span>      case SYNC_WAL:<a name="line.8604"></a>
+<span class="sourceLineNo">8605</span>          this.wal.sync(txid, false);<a name="line.8605"></a>
+<span class="sourceLineNo">8606</span>          break;<a name="line.8606"></a>
+<span class="sourceLineNo">8607</span>      case FSYNC_WAL:<a name="line.8607"></a>
+<span class="sourceLineNo">8608</span>          this.wal.sync(txid, true);<a name="line.8608"></a>
+<span class="sourceLineNo">8609</span>          break;<a name="line.8609"></a>
+<span class="sourceLineNo">8610</span>      default:<a name="line.8610"></a>
+<span class="sourceLineNo">8611</span>        throw new RuntimeException("Unknown durability " + durability);<a name="line.8611"></a>
+<span class="sourceLineNo">8612</span>      }<a name="line.8612"></a>
+<span class="sourceLineNo">8613</span>    }<a name="line.8613"></a>
+<span class="sourceLineNo">8614</span>  }<a name="line.8614"></a>
+<span class="sourceLineNo">8615</span><a name="line.8615"></a>
+<span class="sourceLineNo">8616</span>  /**<a name="line.8616"></a>
+<span class="sourceLineNo">8617</span>   * Check whether we should sync the wal from the table's durability settings<a name="line.8617"></a>
+<span class="sourceLineNo">8618</span>   */<a name="line.8618"></a>
+<span class="sourceLineNo">8619</span>  private boolean shouldSyncWAL() {<a name="line.8619"></a>
+<span class="sourceLineNo">8620</span>    return regionDurability.ordinal() &gt;  Durability.ASYNC_WAL.ordinal();<a name="line.8620"></a>
+<span class="sourceLineNo">8621</span>  }<a name="line.8621"></a>
 <span class="sourceLineNo">8622</span><a name="line.8622"></a>
-<span class="sourceLineNo">8623</span>    @Override<a name="line.8623"></a>
-<span class="sourceLineNo">8624</span>    public void add(int index, Cell element) {<a name="line.8624"></a>
-<span class="sourceLineNo">8625</span>      // do nothing<a name="line.8625"></a>
-<span class="sourceLineNo">8626</span>    }<a name="line.8626"></a>
+<span class="sourceLineNo">8623</span>  /**<a name="line.8623"></a>
+<span class="sourceLineNo">8624</span>   * A mocked list implementation - discards all updates.<a name="line.8624"></a>
+<span class="sourceLineNo">8625</span>   */<a name="line.8625"></a>
+<span class="sourceLineNo">8626</span>  private static final List&lt;Cell&gt; MOCKED_LIST = new AbstractList&lt;Cell&gt;() {<a name="line.8626"></a>
 <span class="sourceLineNo">8627</span><a name="line.8627"></a>
 <span class="sourceLineNo">8628</span>    @Override<a name="line.8628"></a>
-<span class="sourceLineNo">8629</span>    public boolean addAll(int index, Collection&lt;? extends Cell&gt; c) {<a name="line.8629"></a>
-<span class="sourceLineNo">8630</span>      return false; // this list is never changed as a result of an update<a name="line.8630"></a>
+<span class="sourceLineNo">8629</span>    public void add(int index, Cell element) {<a name="line.8629"></a>
+<span class="sourceLineNo">8630</span>      // do nothing<a name="line.8630"></a>
 <span class="sourceLineNo">8631</span>    }<a name="line.8631"></a>
 <span class="sourceLineNo">8632</span><a name="line.8632"></a>
 <span class="sourceLineNo">8633</span>    @Override<a name="line.8633"></a>
-<span class="sourceLineNo">8634</span>    public KeyValue get(int index) {<a name="line.8634"></a>
-<span class="sourceLineNo">8635</span>      throw new UnsupportedOperationException();<a name="line.8635"></a>
+<span class="sourceLineNo">8634</span>    public boolean addAll(int index, Collection&lt;? extends Cell&gt; c) {<a name="line.8634"></a>
+<span class="sourceLineNo">8635</span>      return false; // this list is never changed as a result of an update<a name="line.8635"></a>
 <span class="sourceLineNo">8636</span>    }<a name="line.8636"></a>
 <span class="sourceLineNo">8637</span><a name="line.8637"></a>
 <span class="sourceLineNo">8638</span>    @Override<a name="line.8638"></a>
-<span class="sourceLineNo">8639</span>    public int size() {<a name="line.8639"></a>
-<span class="sourceLineNo">8640</span>      return 0;<a name="line.8640"></a>
+<span class="sourceLineNo">8639</span>    public KeyValue get(int index) {<a name="line.8639"></a>
+<span class="sourceLineNo">8640</span>      throw new UnsupportedOperationException();<a name="line.8640"></a>
 <span class="sourceLineNo">8641</span>    }<a name="line.8641"></a>
-<span class="sourceLineNo">8642</span>  };<a name="line.8642"></a>
-<span class="sourceLineNo">8643</span><a name="line.8643"></a>
-<span class="sourceLineNo">8644</span>  /** @return the latest sequence number that was read from storage when this region was opened */<a name="line.8644"></a>
-<span class="sourceLineNo">8645</span>  public long getOpenSeqNum() {<a name="line.8645"></a>
-<span class="sourceLineNo">8646</span>    return this.openSeqNum;<a name="line.8646"></a>
-<span class="sourceLineNo">8647</span>  }<a name="line.8647"></a>
+<span class="sourceLineNo">8642</span><a name="line.8642"></a>
+<span class="sourceLineNo">8643</span>    @Override<a name="line.8643"></a>
+<span class="sourceLineNo">8644</span>    public int size() {<a name="line.8644"></a>
+<span class="sourceLineNo">8645</span>      return 0;<a name="line.8645"></a>
+<span class="sourceLineNo">8646</span>    }<a name="line.8646"></a>
+<span class="sourceLineNo">8647</span>  };<a name="line.8647"></a>
 <span class="sourceLineNo">8648</span><a name="line.8648"></a>
-<span class="sourceLineNo">8649</span>  @Override<a name="line.8649"></a>
-<span class="sourceLineNo">8650</span>  public Map&lt;byte[], Long&gt; getMaxStoreSeqId() {<a name="line.8650"></a>
-<span class="sourceLineNo">8651</span>    return this.maxSeqIdInStores;<a name="line.8651"></a>
+<span class="sourceLineNo">8649</span>  /** @return the latest sequence number that was read from storage when this region was opened */<a name="line.8649"></a>
+<span class="sourceLineNo">8650</span>  public long getOpenSeqNum() {<a name="line.8650"></a>
+<span class="sourceLineNo">8651</span>    return this.openSeqNum;<a name="line.8651"></a>
 <span class="sourceLineNo">8652</span>  }<a name="line.8652"></a>
 <span class="sourceLineNo">8653</span><a name="line.8653"></a>
-<span class="sourceLineNo">8654</span>  public long getOldestSeqIdOfStore(byte[] familyName) {<a name="line.8654"></a>
-<span class="sourceLineNo">8655</span>    return wal.getEarliestMemStoreSeqNum(getRegionInfo().getEncodedNameAsBytes(), familyName);<a name="line.8655"></a>
-<span class="sourceLineNo">8656</span>  }<a name="line.8656"></a>
-<span class="sourceLineNo">8657</span><a name="line.8657"></a>
-<span class="sourceLineNo">8658</span>  @Override<a name="line.8658"></a>
-<span class="sourceLineNo">8659</span>  public CompactionState getCompactionState() {<a name="line.8659"></a>
-<span class="sourceLineNo">8660</span>    boolean hasMajor = majorInProgress.get() &gt; 0, hasMinor = minorInProgress.get() &gt; 0;<a name="line.8660"></a>
-<span class="sourceLineNo">8661</span>    return (hasMajor ? (hasMinor ? CompactionState.MAJOR_AND_MINOR : CompactionState.MAJOR)<a name="line.8661"></a>
-<span class="sourceLineNo">8662</span>        : (hasMinor ? CompactionState.MINOR : CompactionState.NONE));<a name="line.8662"></a>
-<span class="sourceLineNo">8663</span>  }<a name="line.8663"></a>
-<span class="sourceLineNo">8664</span><a name="line.8664"></a>
-<span class="sourceLineNo">8665</span>  public void reportCompactionRequestStart(boolean isMajor){<a name="line.8665"></a>
-<span class="sourceLineNo">8666</span>    (isMajor ? majorInProgress : minorInProgress).incrementAndGet();<a name="line.8666"></a>
-<span class="sourceLineNo">8667</span>  }<a name="line.8667"></a>
-<span class="sourceLineNo">8668</span><a name="line.8668"></a>
-<span class="sourceLineNo">8669</span>  public void reportCompactionRequestEnd(boolean isMajor, int numFiles, long filesSizeCompacted) {<a name="line.8669"></a>
-<span class="sourceLineNo">8670</span>    int newValue = (isMajor ? majorInProgress : minorInProgress).decrementAndGet();<a name="line.8670"></a>
-<span class="sourceLineNo">8671</span><a name="line.8671"></a>
-<span class="sourceLineNo">8672</span>    // metrics<a name="line.8672"></a>
-<span class="sourceLineNo">8673</span>    compactionsFinished.increment();<a name="line.8673"></a>
-<span class="sourceLineNo">8674</span>    compactionNumFilesCompacted.add(numFiles);<a name="line.8674"></a>
-<span class="sourceLineNo">8675</span>    compactionNumBytesCompacted.add(filesSizeCompacted);<a name="line.8675"></a>
+<span class="sourceLineNo">8654</span>  @Override<a name="line.8654"></a>
+<span class="sourceLineNo">8655</span>  public Map&lt;byte[], Long&gt; getMaxStoreSeqId() {<a name="line.8655"></a>
+<span class="sourceLineNo">8656</span>    return this.maxSeqIdInStores;<a name="line.8656"></a>
+<span class="sourceLineNo">8657</span>  }<a name="line.8657"></a>
+<span class="sourceLineNo">8658</span><a name="line.8658"></a>
+<span class="sourceLineNo">8659</span>  public long getOldestSeqIdOfStore(byte[] familyName) {<a name="line.8659"></a>
+<span class="sourceLineNo">8660</span>    return wal.getEarliestMemStoreSeqNum(getRegionInfo().getEncodedNameAsBytes(), familyName);<a name="line.8660"></a>
+<span class="sourceLineNo">8661</span>  }<a name="line.8661"></a>
+<span class="sourceLineNo">8662</span><a name="line.8662"></a>
+<span class="sourceLineNo">8663</span>  @Override<a name="line.8663"></a>
+<span class="sourceLineNo">8664</span>  public CompactionState getCompactionState() {<a name="line.8664"></a>
+<span class="sourceLineNo">8665</span>    boolean hasMajor = majorInProgress.get() &gt; 0, hasMinor = minorInProgress.get() &gt; 0;<a name="line.8665"></a>
+<span class="sourceLineNo">8666</span>    return (hasMajor ? (hasMinor ? CompactionState.MAJOR_AND_MINOR : CompactionState.MAJOR)<a name="line.8666"></a>
+<span class="sourceLineNo">8667</span>        : (hasMinor ? CompactionState.MINOR : CompactionState.NONE));<a name="line.8667"></a>
+<span class="sourceLineNo">8668</span>  }<a name="line.8668"></a>
+<span class="sourceLineNo">8669</span><a name="line.8669"></a>
+<span class="sourceLineNo">8670</span>  public void reportCompactionRequestStart(boolean isMajor){<a name="line.8670"></a>
+<span class="sourceLineNo">8671</span>    (isMajor ? majorInProgress : minorInProgress).incrementAndGet();<a name="line.8671"></a>
+<span class="sourceLineNo">8672</span>  }<a name="line.8672"></a>
+<span class="sourceLineNo">8673</span><a name="line.8673"></a>
+<span class="sourceLineNo">8674</span>  public void reportCompactionRequestEnd(boolean isMajor, int numFiles, long filesSizeCompacted) {<a name="line.8674"></a>
+<span class="sourceLineNo">8675</span>    int newValue = (isMajor ? majorInProgress : minorInProgress).decrementAndGet();<a name="line.8675"></a>
 <span class="sourceLineNo">8676</span><a name="line.8676"></a>
-<span class="sourceLineNo">8677</span>    assert newValue &gt;= 0;<a name="line.8677"></a>
-<span class="sourceLineNo">8678</span>  }<a name="line.8678"></a>
-<span class="sourceLineNo">8679</span><a name="line.8679"></a>
-<span class="sourceLineNo">8680</span>  public void reportCompactionRequestFailure() {<a name="line.8680"></a>
-<span class="sourceLineNo">8681</span>    compactionsFailed.increment();<a name="line.8681"></a>
-<span class="sourceLineNo">8682</span>  }<a name="line.8682"></a>
-<span class="sourceLineNo">8683</span><a name="line.8683"></a>
-<span class="sourceLineNo">8684</span>  public void incrementCompactionsQueuedCount() {<a name="line.8684"></a>
-<span class="sourceLineNo">8685</span>    compactionsQueued.increment();<a name="line.8685"></a>
-<span class="sourceLineNo">8686</span>  }<a name="line.8686"></a>
-<span class="sourceLineNo">8687</span><a name="line.8687"></a>
-<span class="sourceLineNo">8688</span>  public void decrementCompactionsQueuedCount() {<a name="line.8688"></a>
-<span class="sourceLineNo">8689</span>    compactionsQueued.decrement();<a name="line.8689"></a>
-<span class="sourceLineNo">8690</span>  }<a name="line.8690"></a>
-<span class="sourceLineNo">8691</span><a name="line.8691"></a>
-<span class="sourceLineNo">8692</span>  public void incrementFlushesQueuedCount() {<a name="line.8692"></a>
-<span class="sourceLineNo">8693</span>    flushesQueued.increment();<a name="line.8693"></a>
-<span class="sourceLineNo">8694</span>  }<a name="line.8694"></a>
-<span class="sourceLineNo">8695</span><a name="line.8695"></a>
-<span class="sourceLineNo">8696</span>  @VisibleForTesting<a name="line.8696"></a>
-<span class="sourceLineNo">8697</span>  public long getReadPoint() {<a name="line.8697"></a>
-<span class="sourceLineNo">8698</span>    return getReadPoint(IsolationLevel.READ_COMMITTED);<a name="line.8698"></a>
+<span class="sourceLineNo">8677</span>    // metrics<a name="line.8677"></a>
+<span class="sourceLineNo">8678</span>    compactionsFinished.increment();<a name="line.8678"></a>
+<span class="sourceLineNo">8679</span>    compactionNumFilesCompacted.add(numFiles);<a name="line.8679"></a>
+<span class="sourceLineNo">8680</span>    compactionNumBytesCompacted.add(filesSizeCompacted);<a name="line.8680"></a>
+<span class="sourceLineNo">8681</span><a name="line.8681"></a>
+<span class="sourceLineNo">8682</span>    assert newValue &gt;= 0;<a name="line.8682"></a>
+<span class="sourceLineNo">8683</span>  }<a name="line.8683"></a>
+<span class="sourceLineNo">8684</span><a name="line.8684"></a>
+<span class="sourceLineNo">8685</span>  public void reportCompactionRequestFailure() {<a name="line.8685"></a>
+<span class="sourceLineNo">8686</span>    compactionsFailed.increment();<a name="line.8686"></a>
+<span class="sourceLineNo">8687</span>  }<a name="line.8687"></a>
+<span class="sourceLineNo">8688</span><a name="line.8688"></a>
+<span class="sourceLineNo">8689</span>  public void incrementCompactionsQueuedCount() {<a name="line.8689"></a>
+<span class="sourceLineNo">8690</span>    compactionsQueued.increment();<a name="line.8690"></a>
+<span class="sourceLineNo">8691</span>  }<a name="line.8691"></a>
+<span class="sourceLineNo">8692</span><a name="line.8692"></a>
+<span class="sourceLineNo">8693</span>  public void decrementCompactionsQueuedCount() {<a name="line.8693"></a>
+<span class="sourceLineNo">8694</span>    compactionsQueued.decrement();<a name="line.8694"></a>
+<span class="sourceLineNo">8695</span>  }<a name="line.8695"></a>
+<span class="sourceLineNo">8696</span><a name="line.8696"></a>
+<span class="sourceLineNo">8697</span>  public void incrementFlushesQueuedCount() {<a name="line.8697"></a>
+<span class="sourceLineNo">8698</span>    flushesQueued.increment();<a name="line.8698"></a>
 <span class="sourceLineNo">8699</span>  }<a name="line.8699"></a>
 <span class="sourceLineNo">8700</span><a name="line.8700"></a>
-<span class="sourceLineNo">8701</span>  /**<a name="line.8701"></a>
-<span class="sourceLineNo">8702</span>   * {@inheritDoc}<a name="line.8702"></a>
-<span class="sourceLineNo">8703</span>   */<a name="line.8703"></a>
-<span class="sourceLineNo">8704</span>  @Override<a name="line.8704"></a>
-<span class="sourceLineNo">8705</span>  public void onConfigurationChange(Configuration conf) {<a name="line.8705"></a>
-<span class="sourceLineNo">8706</span>    this.storeHotnessProtector.update(conf);<a name="line.8706"></a>
-<span class="sourceLineNo">8707</span>  }<a name="line.8707"></a>
-<span class="sourceLineNo">8708</span><a name="line.8708"></a>
-<span class="sourceLineNo">8709</span>  /**<a name="line.8709"></a>
-<span class="sourceLineNo">8710</span>   * {@inheritDoc}<a name="line.8710"></a>
-<span class="sourceLineNo">8711</span>   */<a name="line.8711"></a>
-<span class="sourceLineNo">8712</span>  @Override<a name="line.8712"></a>
-<span class="sourceLineNo">8713</span>  public void registerChildren(ConfigurationManager manager) {<a name="line.8713"></a>
-<span class="sourceLineNo">8714</span>    configurationManager = Optional.of(manager);<a name="line.8714"></a>
-<span class="sourceLineNo">8715</span>    stores.values().forEach(manager::registerObserver);<a name="line.8715"></a>
-<span class="sourceLineNo">8716</span>  }<a name="line.8716"></a>
-<span class="sourceLineNo">8717</span><a name="line.8717"></a>
-<span class="sourceLineNo">8718</span>  /**<a name="line.8718"></a>
-<span class="sourceLineNo">8719</span>   * {@inheritDoc}<a name="line.8719"></a>
-<span class="sourceLineNo">8720</span>   */<a name="line.8720"></a>
-<span class="sourceLineNo">8721</span>  @Override<a name="line.8721"></a>
-<span class="sourceLineNo">8722</span>  public void deregisterChildren(ConfigurationManager manager) {<a name="line.8722"></a>
-<span class="sourceLineNo">8723</span>    stores.values().forEach(configurationManager.get()::deregisterObserver);<a name="line.8723"></a>
-<span class="sourceLineNo">8724</span>  }<a name="line.8724"></a>
-<span class="sourceLineNo">8725</span><a name="line.8725"></a>
+<span class="sourceLineNo">8701</span>  @VisibleForTesting<a name="line.8701"></a>
+<span class="sourceLineNo">8702</span>  public long getReadPoint() {<a name="line.8702"></a>
+<span class="sourceLineNo">8703</span>    return getReadPoint(IsolationLevel.READ_COMMITTED);<a name="line.8703"></a>
+<span class="sourceLineNo">8704</span>  }<a name="line.8704"></a>
+<span class="sourceLineNo">8705</span><a name="line.8705"></a>
+<span class="sourceLineNo">8706</span>  /**<a name="line.8706"></a>
+<span class="sourceLineNo">8707</span>   * {@inheritDoc}<a name="line.8707"></a>
+<span class="sourceLineNo">8708</span>   */<a name="line.8708"></a>
+<span class="sourceLineNo">8709</span>  @Override<a name="line.8709"></a>
+<span class="sourceLineNo">8710</span>  public void onConfigurationChange(Configuration conf) {<a name="line.8710"></a>
+<span class="sourceLineNo">8711</span>    this.storeHotnessProtector.update(conf);<a name="line.8711"></a>
+<span class="sourceLineNo">8712</span>  }<a name="line.8712"></a>
+<span class="sourceLineNo">8713</span><a name="line.8713"></a>
+<span class="sourceLineNo">8714</span>  /**<a name="line.8714"></a>
+<span class="sourceLineNo">8715</span>   * {@inheritDoc}<a name="line.8715"></a>
+<span class="sourceLineNo">8716</span>   */<a name="line.8716"></a>
+<span class="sourceLineNo">8717</span>  @Override<a name="line.8717"></a>
+<span class="sourceLineNo">8718</span>  public void registerChildren(ConfigurationManager manager) {<a name="line.8718"></a>
+<span class="sourceLineNo">8719</span>    configurationManager = Optional.of(manager);<a name="line.8719"></a>
+<span class="sourceLineNo">8720</span>    stores.values().forEach(manager::registerObserver);<a name="line.8720"></a>
+<span class="sourceLineNo">8721</span>  }<a name="line.8721"></a>
+<span class="sourceLineNo">8722</span><a name="line.8722"></a>
+<span class="sourceLineNo">8723</span>  /**<a name="line.8723"></a>
+<span class="sourceLineNo">8724</span>   * {@inheritDoc}<a name="line.8724"></a>
+<span class="sourceLineNo">8725</span>   */<a name="line.8725"></a>
 <span class="sourceLineNo">8726</span>  @Override<a name="line.8726"></a>
-<span class="sourceLineNo">8727</span>  public CellComparator getCellComparator() {<a name="line.8727"></a>
-<span class="sourceLineNo">8728</span>    return this.getRegionInfo().isMetaRegion() ? CellComparatorImpl.META_COMPARATOR<a name="line.8728"></a>
-<span class="sourceLineNo">8729</span>        : CellComparatorImpl.COMPARATOR;<a name="line.8729"></a>
-<span class="sourceLineNo">8730</span>  }<a name="line.8730"></a>
-<span class="sourceLineNo">8731</span><a name="line.8731"></a>
-<span class="sourceLineNo">8732</span>  public long getMemStoreFlushSize() {<a name="line.8732"></a>
-<span class="sourceLineNo">8733</span>    return this.memstoreFlushSize;<a name="line.8733"></a>
-<span class="sourceLineNo">8734</span>  }<a name="line.8734"></a>
-<span class="sourceLineNo">8735</span><a name="line.8735"></a>
+<span class="sourceLineNo">8727</span>  public void deregisterChildren(ConfigurationManager manager) {<a name="line.8727"></a>
+<span class="sourceLineNo">8728</span>    stores.values().forEach(configurationManager.get()::deregisterObserver);<a name="line.8728"></a>
+<span class="sourceLineNo">8729</span>  }<a name="line.8729"></a>
+<span class="sourceLineNo">8730</span><a name="line.8730"></a>
+<span class="sourceLineNo">8731</span>  @Override<a name="line.8731"></a>
+<span class="sourceLineNo">8732</span>  public CellComparator getCellComparator() {<a name="line.8732"></a>
+<span class="sourceLineNo">8733</span>    return this.getRegionInfo().isMetaRegion() ? CellComparatorImpl.META_COMPARATOR<a name="line.8733"></a>
+<span class="sourceLineNo">8734</span>        : CellComparatorImpl.COMPARATOR;<a name="line.8734"></a>
+<span class="sourceLineNo">8735</span>  }<a name="line.8735"></a>
 <span class="sourceLineNo">8736</span><a name="line.8736"></a>
-<span class="sourceLineNo">8737</span>  //// method for debugging tests<a name="line.8737"></a>
-<span class="sourceLineNo">8738</span>  void throwException(String title, String regionName) {<a name="line.8738"></a>
-<span class="sourceLineNo">8739</span>    StringBuilder buf = new StringBuilder();<a name="line.8739"></a>
-<span class="sourceLineNo">8740</span>    buf.append(title + ", ");<a name="line.8740"></a>
-<span class="sourceLineNo">8741</span>    buf.append(getRegionInfo().toString());<a name="line.8741"></a>
-<span class="sourceLineNo">8742</span>    buf.append(getRegionInfo().isMetaRegion() ? " meta region " : " ");<a name="line.8742"></a>
-<span class="sourceLineNo">8743</span>    buf.append("stores: ");<a name="line.8743"></a>
-<span class="sourceLineNo">8744</span>    for (HStore s : stores.values()) {<a name="line.8744"></a>
-<span class="sourceLineNo">8745</span>      buf.append(s.getColumnFamilyDescriptor().getNameAsString());<a name="line.8745"></a>
-<span class="sourceLineNo">8746</span>      buf.append(" size: ");<a name="line.8746"></a>
-<span class="sourceLineNo">8747</span>      buf.append(s.getMemStoreSize().getDataSize());<a name="line.8747"></a>
-<span class="sourceLineNo">8748</span>      buf.append(" ");<a name="line.8748"></a>
-<span class="sourceLineNo">8749</span>    }<a name="line.8749"></a>
-<span class="sourceLineNo">8750</span>    buf.append("end-of-stores");<a name="line.8750"></a>
-<span class="sourceLineNo">8751</span>    buf.append(", memstore size ");<a name="line.8751"></a>
-<span class="sourceLineNo">8752</span>    buf.append(getMemStoreDataSize());<a name="line.8752"></a>
-<span class="sourceLineNo">8753</span>    if (getRegionInfo().getRegionNameAsString().startsWith(regionName)) {<a name="line.8753"></a>
-<span class="sourceLineNo">8754</span>      throw new RuntimeException(buf.toString());<a name="line.8754"></a>
-<span class="sourceLineNo">8755</span>    }<a name="line.8755"></a>
-<span class="sourceLineNo">8756</span>  }<a name="line.8756"></a>
-<span class="sourceLineNo">8757</span><a name="line.8757"></a>
-<span class="sourceLineNo">8758</span>  @Override<a name="line.8758"></a>
-<span class="sourceLineNo">8759</span>  public void requestCompaction(String why, int priority, boolean major,<a name="line.8759"></a>
-<span class="sourceLineNo">8760</span>      CompactionLifeCycleTracker tracker) throws IOException {<a name="line.8760"></a>
-<span class="sourceLineNo">8761</span>    if (major) {<a name="line.8761"></a>
-<span class="sourceLineNo">8762</span>      stores.values().forEach(HStore::triggerMajorCompaction);<a name="line.8762"></a>
-<span class="sourceLineNo">8763</span>    }<a name="line.8763"></a>
-<span class="sourceLineNo">8764</span>    rsServices.getCompactionRequestor().requestCompaction(this, why, priority, tracker,<a name="line.8764"></a>
-<span class="sourceLineNo">8765</span>        RpcServer.getRequestUser().orElse(null));<a name="line.8765"></a>
-<span class="sourceLineNo">8766</span>  }<a name="line.8766"></a>
-<span class="sourceLineNo">8767</span><a name="line.8767"></a>
-<span class="sourceLineNo">8768</span>  @Override<a name="line.8768"></a>
-<span class="sourceLineNo">8769</span>  public void requestCompaction(byte[] family, String why, int priority, boolean major,<a name="line.8769"></a>
-<span class="sourceLineNo">8770</span>      CompactionLifeCycleTracker tracker) throws IOException {<a name="line.8770"></a>
-<span class="sourceLineNo">8771</span>    HStore store = stores.get(family);<a name="line.8771"></a>
-<span class="sourceLineNo">8772</span>    if (store == null) {<a name="line.8772"></a>
-<span class="sourceLineNo">8773</span>      throw new NoSuchColumnFamilyException("column family " + Bytes.toString(family) +<a name="line.8773"></a>
-<span class="sourceLineNo">8774</span>          " does not exist in region " + getRegionInfo().getRegionNameAsString());<a name="line.8774"></a>
-<span class="sourceLineNo">8775</span>    }<a name="line.8775"></a>
-<span class="sourceLineNo">8776</span>    if (major) {<a name="line.8776"></a>
-<span class="sourceLineNo">8777</span>      store.triggerMajorCompaction();<a name="line.8777"></a>
-<span class="sourceLineNo">8778</span>    }<a name="line.8778"></a>
-<span class="sourceLineNo">8779</span>    rsServices.getCompactionRequestor().requestCompaction(this, store, why, priority, tracker,<a name="line.8779"></a>
-<span class="sourceLineNo">8780</span>        RpcServer.getRequestUser().orElse(null));<a name="line.8780"></a>
-<span class="sourceLineNo">8781</span>  }<a name="line.8781"></a>
-<span class="sourceLineNo">8782</span><a name="line.8782"></a>
-<span class="sourceLineNo">8783</span>  private void requestFlushIfNeeded() throws RegionTooBusyException {<a name="line.8783"></a>
-<span class="sourceLineNo">8784</span>    if(isFlushSize(this.memStoreSizing.getMemStoreSize())) {<a name="line.8784"></a>
-<span class="sourceLineNo">8785</span>      requestFlush();<a name="line.8785"></a>
-<span class="sourceLineNo">8786</span>    }<a name="line.8786"></a>
-<span class="sourceLineNo">8787</span>  }<a name="line.8787"></a>
-<span class="sourceLineNo">8788</span><a name="line.8788"></a>
-<span class="sourceLineNo">8789</span>  private void requestFlush() {<a name="line.8789"></a>
-<span class="sourceLineNo">8790</span>    if (this.rsServices == null) {<a name="line.8790"></a>
-<span class="sourceLineNo">8791</span>      return;<a name="line.8791"></a>
-<span class="sourceLineNo">8792</span>    }<a name="line.8792"></a>
-<span class="sourceLineNo">8793</span>    requestFlush0(FlushLifeCycleTracker.DUMMY);<a name="line.8793"></a>
-<span class="sourceLineNo">8794</span>  }<a name="line.8794"></a>
-<span class="sourceLineNo">8795</span><a name="line.8795"></a>
-<span class="sourceLineNo">8796</span>  private void requestFlush0(FlushLifeCycleTracker tracker) {<a name="line.8796"></a>
-<span class="sourceLineNo">8797</span>    boolean shouldFlush = false;<a name="line.8797"></a>
-<span class="sourceLineNo">8798</span>    synchronized (writestate) {<a name="line.8798"></a>
-<span class="sourceLineNo">8799</span>      if (!this.writestate.isFlushRequested()) {<a name="line.8799"></a>
-<span class="sourceLineNo">8800</span>        shouldFlush = true;<a name="line.8800"></a>
-<span class="sourceLineNo">8801</span>        writestate.flushRequested = true;<a name="line.8801"></a>
-<span class="sourceLineNo">8802</span>      }<a name="line.8802"></a>
-<span class="sourceLineNo">8803</span>    }<a name="line.8803"></a>
-<span class="sourceLineNo">8804</span>    if (shouldFlush) {<a name="line.8804"></a>
-<span class="sourceLineNo">8805</span>      // Make request outside of synchronize block; HBASE-818.<a name="line.8805"></a>
-<span class="sourceLineNo">8806</span>      this.rsServices.getFlushRequester().requestFlush(this, false, tracker);<a name="line.8806"></a>
-<span class="sourceLineNo">8807</span>      if (LOG.isDebugEnabled()) {<a name="line.8807"></a>
-<span class="sourceLineNo">8808</span>        LOG.debug("Flush requested on " + this.getRegionInfo().getEncodedName());<a name="line.8808"></a>
-<span class="sourceLineNo">8809</span>      }<a name="line.8809"></a>
-<span class="sourceLineNo">8810</span>    } else {<a name="line.8810"></a>
-<span class="sourceLineNo">8811</span>      tracker.notExecuted("Flush already requested on " + this);<a name="line.8811"></a>
-<span class="sourceLineNo">8812</span>    }<a name="line.8812"></a>
-<span class="sourceLineNo">8813</span>  }<a name="line.8813"></a>
-<span class="sourceLineNo">8814</span><a name="line.8814"></a>
-<span class="sourceLineNo">8815</span>  @Override<a name="line.8815"></a>
-<span class="sourceLineNo">8816</span>  public void requestFlush(FlushLifeCycleTracker tracker) throws IOException {<a name="line.8816"></a>
-<span class="sourceLineNo">8817</span>    requestFlush0(tracker);<a name="line.8817"></a>
+<span class="sourceLineNo">8737</span>  public long getMemStoreFlushSize() {<a name="line.8737"></a>
+<span class="sourceLineNo">8738</span>    return this.memstoreFlushSize;<a name="line.8738"></a>
+<span class="sourceLineNo">8739</span>  }<a name="line.8739"></a>
+<span class="sourceLineNo">8740</span><a name="line.8740"></a>
+<span class="sourceLineNo">8741</span><a name="line.8741"></a>
+<span class="sourceLineNo">8742</span>  //// method for debugging tests<a name="line.8742"></a>
+<span class="sourceLineNo">8743</span>  void throwException(String title, String regionName) {<a name="line.8743"></a>
+<span class="sourceLineNo">8744</span>    StringBuilder buf = new StringBuilder();<a name="line.8744"></a>
+<span class="sourceLineNo">8745</span>    buf.append(title + ", ");<a name="line.8745"></a>
+<span class="sourceLineNo">8746</span>    buf.append(getRegionInfo().toString());<a name="line.8746"></a>
+<span class="sourceLineNo">8747</span>    buf.append(getRegionInfo().isMetaRegion() ? " meta region " : " ");<a name="line.8747"></a>
+<span class="sourceLineNo">8748</span>    buf.append("stores: ");<a name="line.8748"></a>
+<span class="sourceLineNo">8749</span>    for (HStore s : stores.values()) {<a name="line.8749"></a>
+<span class="sourceLineNo">8750</span>      buf.append(s.getColumnFamilyDescriptor().getNameAsString());<a name="line.8750"></a>
+<span class="sourceLineNo">8751</span>      buf.append(" size: ");<a name="line.8751"></a>
+<span class="sourceLineNo">8752</span>      buf.append(s.getMemStoreSize().getDataSize());<a name="line.8752"></a>
+<span class="sourceLineNo">8753</span>      buf.append(" ");<a name="line.8753"></a>
+<span class="sourceLineNo">8754</span>    }<a name="line.8754"></a>
+<span class="sourceLineNo">8755</span>    buf.append("end-of-stores");<a name="line.8755"></a>
+<span class="sourceLineNo">8756</span>    buf.append(", memstore size ");<a name="line.8756"></a>
+<span class="sourceLineNo">8757</span>    buf.append(getMemStoreDataSize());<a name="line.8757"></a>
+<span class="sourceLineNo">8758</span>    if (getRegionInfo().getRegionNameAsString().startsWith(regionName)) {<a name="line.8758"></a>
+<span class="sourceLineNo">8759</span>      throw new RuntimeException(buf.toString());<a name="line.8759"></a>
+<span class="sourceLineNo">8760</span>    }<a name="line.8760"></a>
+<span class="sourceLineNo">8761</span>  }<a name="line.8761"></a>
+<span class="sourceLineNo">8762</span><a name="line.8762"></a>
+<span class="sourceLineNo">8763</span>  @Override<a name="line.8763"></a>
+<span class="sourceLineNo">8764</span>  public void requestCompaction(String why, int priority, boolean major,<a name="line.8764"></a>
+<span class="sourceLineNo">8765</span>      CompactionLifeCycleTracker tracker) throws IOException {<a name="line.8765"></a>
+<span class="sourceLineNo">8766</span>    if (major) {<a name="line.8766"></a>
+<span class="sourceLineNo">8767</span>      stores.values().forEach(HStore::triggerMajorCompaction);<a name="line.8767"></a>
+<span class="sourceLineNo">8768</span>    }<a name="line.8768"></a>
+<span class="sourceLineNo">8769</span>    rsServices.getCompactionRequestor().requestCompaction(this, why, priority, tracker,<a name="line.8769"></a>
+<span class="sourceLineNo">8770</span>        RpcServer.getRequestUser().orElse(null));<a name="line.8770"></a>
+<span class="sourceLineNo">8771</span>  }<a name="line.8771"></a>
+<span class="sourceLineNo">8772</span><a name="line.8772"></a>
+<span class="sourceLineNo">8773</span>  @Override<a name="line.8773"></a>
+<span class="sourceLineNo">8774</span>  public void requestCompaction(byte[] family, String why, int priority, boolean major,<a name="line.8774"></a>
+<span class="sourceLineNo">8775</span>      CompactionLifeCycleTracker tracker) throws IOException {<a name="line.8775"></a>
+<span class="sourceLineNo">8776</span>    HStore store = stores.get(family);<a name="line.8776"></a>
+<span class="sourceLineNo">8777</span>    if (store == null) {<a name="line.8777"></a>
+<span class="sourceLineNo">8778</span>      throw new NoSuchColumnFamilyException("column family " + Bytes.toString(family) +<a name="line.8778"></a>
+<span class="sourceLineNo">8779</span>          " does not exist in region " + getRegionInfo().getRegionNameAsString());<a name="line.8779"></a>
+<span class="sourceLineNo">8780</span>    }<a name="line.8780"></a>
+<span class="sourceLineNo">8781</span>    if (major) {<a name="line.8781"></a>
+<span class="sourceLineNo">8782</span>      store.triggerMajorCompaction();<a name="line.8782"></a>
+<span class="sourceLineNo">8783</span>    }<a name="line.8783"></a>
+<span class="sourceLineNo">8784</span>    rsServices.getCompactionRequestor().requestCompaction(this, store, why, priority, tracker,<a name="line.8784"></a>
+<span class="sourceLineNo">8785</span>        RpcServer.getRequestUser().orElse(null));<a name="line.8785"></a>
+<span class="sourceLineNo">8786</span>  }<a name="line.8786"></a>
+<span class="sourceLineNo">8787</span><a name="line.8787"></a>
+<span class="sourceLineNo">8788</span>  private void requestFlushIfNeeded() throws RegionTooBusyException {<a name="line.8788"></a>
+<span class="sourceLineNo">8789</span>    if(isFlushSize(this.memStoreSizing.getMemStoreSize())) {<a name="line.8789"></a>
+<span class="sourceLineNo">8790</span>      requestFlush();<a name="line.8790"></a>
+<span class="sourceLineNo">8791</span>    }<a name="line.8791"></a>
+<span class="sourceLineNo">8792</span>  }<a name="line.8792"></a>
+<span class="sourceLineNo">8793</span><a name="line.8793"></a>
+<span class="sourceLineNo">8794</span>  private void requestFlush() {<a name="line.8794"></a>
+<span class="sourceLineNo">8795</span>    if (this.rsServices == null) {<a name="line.8795"></a>
+<span class="sourceLineNo">8796</span>      return;<a name="line.8796"></a>
+<span class="sourceLineNo">8797</span>    }<a name="line.8797"></a>
+<span class="sourceLineNo">8798</span>    requestFlush0(FlushLifeCycleTracker.DUMMY);<a name="line.8798"></a>
+<span class="sourceLineNo">8799</span>  }<a name="line.8799"></a>
+<span class="sourceLineNo">8800</span><a name="line.8800"></a>
+<span class="sourceLineNo">8801</span>  private void requestFlush0(FlushLifeCycleTracker tracker) {<a name="line.8801"></a>
+<span class="sourceLineNo">8802</span>    boolean shouldFlush = false;<a name="line.8802"></a>
+<span class="sourceLineNo">8803</span>    synchronized (writestate) {<a name="line.8803"></a>
+<span class="sourceLineNo">8804</span>      if (!this.writestate.isFlushRequested()) {<a name="line.8804"></a>
+<span class="sourceLineNo">8805</span>        shouldFlush = true;<a name="line.8805"></a>
+<span class="sourceLineNo">8806</span>        writestate.flushRequested = true;<a name="line.8806"></a>
+<span class="sourceLineNo">8807</span>      }<a name="line.8807"></a>
+<span class="sourceLineNo">8808</span>    }<a name="line.8808"></a>
+<span class="sourceLineNo">8809</span>    if (shouldFlush) {<a name="line.8809"></a>
+<span class="sourceLineNo">8810</span>      // Make request outside of synchronize block; HBASE-818.<a name="line.8810"></a>
+<span class="sourceLineNo">8811</span>      this.rsServices.getFlushRequester().requestFlush(this, false, tracker);<a name="line.8811"></a>
+<span class="sourceLineNo">8812</span>      if (LOG.isDebugEnabled()) {<a name="line.8812"></a>
+<span class="sourceLineNo">8813</span>        LOG.debug("Flush requested on " + this.getRegionInfo().getEncodedName());<a name="line.8813"></a>
+<span class="sourceLineNo">8814</span>      }<a name="line.8814"></a>
+<span class="sourceLineNo">8815</span>    } else {<a name="line.8815"></a>
+<span class="sourceLineNo">8816</span>      tracker.notExecuted("Flush already requested on " + this);<a name="line.8816"></a>
+<span class="sourceLineNo">8817</span>    }<a name="line.8817"></a>
 <span class="sourceLineNo">8818</span>  }<a name="line.8818"></a>
 <span class="sourceLineNo">8819</span><a name="line.8819"></a>
-<span class="sourceLineNo">8820</span>  /**<a name="line.8820"></a>
-<span class="sourceLineNo">8821</span>   * This method modifies the region's configuration in order to inject replication-related<a name="line.8821"></a>
-<span class="sourceLineNo">8822</span>   * features<a name="line.8822"></a>
-<span class="sourceLineNo">8823</span>   * @param conf region configurations<a name="line.8823"></a>
-<span class="sourceLineNo">8824</span>   */<a name="line.8824"></a>
-<span class="sourceLineNo">8825</span>  static void decorateRegionConfiguration(Configuration conf) {<a name="line.8825"></a>
-<span class="sourceLineNo">8826</span>    if (ReplicationUtils.isReplicationForBulkLoadDataEnabled(conf)) {<a name="line.8826"></a>
-<span class="sourceLineNo">8827</span>      String plugins = conf.get(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY,"");<a name="line.8827"></a>
-<span class="sourceLineNo">8828</span>      String replicationCoprocessorClass = ReplicationObserver.class.getCanonicalName();<a name="line.8828"></a>
-<span class="sourceLineNo">8829</span>      if (!plugins.contains(replicationCoprocessorClass)) {<a name="line.8829"></a>
-<span class="sourceLineNo">8830</span>        conf.set(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY,<a name="line.8830"></a>
-<span class="sourceLineNo">8831</span>            (plugins.equals("") ? "" : (plugins + ",")) + replicationCoprocessorClass);<a name="line.8831"></a>
-<span class="sourceLineNo">8832</span>      }<a name="line.8832"></a>
-<span class="sourceLineNo">8833</span>    }<a name="line.8833"></a>
-<span class="sourceLineNo">8834</span>  }<a name="line.8834"></a>
-<span class="sourceLineNo">8835</span>}<a name="line.8835"></a>
+<span class="sourceLineNo">8820</span>  @Override<a name="line.8820"></a>
+<span class="sourceLineNo">8821</span>  public void requestFlush(FlushLifeCycleTracker tracker) throws IOException {<a name="line.8821"></a>
+<span class="sourceLineNo">8822</span>    requestFlush0(tracker);<a name="line.8822"></a>
+<span class="sourceLineNo">8823</span>  }<a name="line.8823"></a>
+<span class="sourceLineNo">8824</span><a name="line.8824"></a>
+<span class="sourceLineNo">8825</span>  /**<a name="line.8825"></a>
+<span class="sourceLineNo">8826</span>   * This method modifies the region's configuration in order to inject replication-related<a name="line.8826"></a>
+<span class="sourceLineNo">8827</span>   * features<a name="line.8827"></a>
+<span class="sourceLineNo">8828</span>   * @param conf region configurations<a name="line.8828"></a>
+<span class="sourceLineNo">8829</span>   */<a name="line.8829"></a>
+<span class="sourceLineNo">8830</span>  static void decorateRegionConfiguration(Configuration conf) {<a name="line.8830"></a>
+<span class="sourceLineNo">8831</span>    if (ReplicationUtils.isReplicationForBulkLoadDataEnabled(conf)) {<a name="line.8831"></a>
+<span class="sourceLineNo">8832</span>      String plugins = conf.get(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY,"");<a name="line.8832"></a>
+<span class="sourceLineNo">8833</span>      String replicationCoprocessorClass = ReplicationObserver.class.getCanonicalName();<a name="line.8833"></a>
+<span class="sourceLineNo">8834</span>      if (!plugins.contains(replicationCoprocessorClass)) {<a name="line.8834"></a>
+<span class="sourceLineNo">8835</span>        conf.set(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY,<a name="line.8835"></a>
+<span class="sourceLineNo">8836</span>            (plugins.equals("") ? "" : (plugins + ",")) + replicationCoprocessorClass);<a name="line.8836"></a>
+<span class="sourceLineNo">8837</span>      }<a name="line.8837"></a>
+<span class="sourceLineNo">8838</span>    }<a name="line.8838"></a>
+<span class="sourceLineNo">8839</span>  }<a name="line.8839"></a>
+<span class="sourceLineNo">8840</span>}<a name="line.8840"></a>
 
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.BulkLoadObserverOperation.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.BulkLoadObserverOperation.html
index 04e8cb5..8bed22d 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.BulkLoadObserverOperation.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.BulkLoadObserverOperation.html
@@ -1728,69 +1728,81 @@
 <span class="sourceLineNo">1720</span>        });<a name="line.1720"></a>
 <span class="sourceLineNo">1721</span>  }<a name="line.1721"></a>
 <span class="sourceLineNo">1722</span><a name="line.1722"></a>
-<span class="sourceLineNo">1723</span>  public Message preEndpointInvocation(final Service service, final String methodName,<a name="line.1723"></a>
-<span class="sourceLineNo">1724</span>      Message request) throws IOException {<a name="line.1724"></a>
-<span class="sourceLineNo">1725</span>    if (coprocEnvironments.isEmpty()) {<a name="line.1725"></a>
-<span class="sourceLineNo">1726</span>      return request;<a name="line.1726"></a>
-<span class="sourceLineNo">1727</span>    }<a name="line.1727"></a>
-<span class="sourceLineNo">1728</span>    return execOperationWithResult(new ObserverOperationWithResult&lt;EndpointObserver,<a name="line.1728"></a>
-<span class="sourceLineNo">1729</span>        Message&gt;(endpointObserverGetter, request) {<a name="line.1729"></a>
-<span class="sourceLineNo">1730</span>      @Override<a name="line.1730"></a>
-<span class="sourceLineNo">1731</span>      public Message call(EndpointObserver observer) throws IOException {<a name="line.1731"></a>
-<span class="sourceLineNo">1732</span>        return observer.preEndpointInvocation(this, service, methodName, getResult());<a name="line.1732"></a>
-<span class="sourceLineNo">1733</span>      }<a name="line.1733"></a>
-<span class="sourceLineNo">1734</span>    });<a name="line.1734"></a>
-<span class="sourceLineNo">1735</span>  }<a name="line.1735"></a>
-<span class="sourceLineNo">1736</span><a name="line.1736"></a>
-<span class="sourceLineNo">1737</span>  public void postEndpointInvocation(final Service service, final String methodName,<a name="line.1737"></a>
-<span class="sourceLineNo">1738</span>      final Message request, final Message.Builder responseBuilder) throws IOException {<a name="line.1738"></a>
-<span class="sourceLineNo">1739</span>    execOperation(coprocEnvironments.isEmpty() ? null :<a name="line.1739"></a>
-<span class="sourceLineNo">1740</span>        new ObserverOperationWithoutResult&lt;EndpointObserver&gt;(endpointObserverGetter) {<a name="line.1740"></a>
-<span class="sourceLineNo">1741</span>          @Override<a name="line.1741"></a>
-<span class="sourceLineNo">1742</span>          public void call(EndpointObserver observer) throws IOException {<a name="line.1742"></a>
-<span class="sourceLineNo">1743</span>            observer.postEndpointInvocation(this, service, methodName, request, responseBuilder);<a name="line.1743"></a>
-<span class="sourceLineNo">1744</span>          }<a name="line.1744"></a>
-<span class="sourceLineNo">1745</span>        });<a name="line.1745"></a>
-<span class="sourceLineNo">1746</span>  }<a name="line.1746"></a>
-<span class="sourceLineNo">1747</span><a name="line.1747"></a>
-<span class="sourceLineNo">1748</span>  /**<a name="line.1748"></a>
-<span class="sourceLineNo">1749</span>   * @deprecated Since 2.0 with out any replacement and will be removed in 3.0<a name="line.1749"></a>
-<span class="sourceLineNo">1750</span>   */<a name="line.1750"></a>
-<span class="sourceLineNo">1751</span>  @Deprecated<a name="line.1751"></a>
-<span class="sourceLineNo">1752</span>  public DeleteTracker postInstantiateDeleteTracker(DeleteTracker result) throws IOException {<a name="line.1752"></a>
-<span class="sourceLineNo">1753</span>    if (this.coprocEnvironments.isEmpty()) {<a name="line.1753"></a>
-<span class="sourceLineNo">1754</span>      return result;<a name="line.1754"></a>
-<span class="sourceLineNo">1755</span>    }<a name="line.1755"></a>
-<span class="sourceLineNo">1756</span>    return execOperationWithResult(new ObserverOperationWithResult&lt;RegionObserver, DeleteTracker&gt;(<a name="line.1756"></a>
-<span class="sourceLineNo">1757</span>        regionObserverGetter, result) {<a name="line.1757"></a>
-<span class="sourceLineNo">1758</span>      @Override<a name="line.1758"></a>
-<span class="sourceLineNo">1759</span>      public DeleteTracker call(RegionObserver observer) throws IOException {<a name="line.1759"></a>
-<span class="sourceLineNo">1760</span>        return observer.postInstantiateDeleteTracker(this, getResult());<a name="line.1760"></a>
-<span class="sourceLineNo">1761</span>      }<a name="line.1761"></a>
-<span class="sourceLineNo">1762</span>    });<a name="line.1762"></a>
-<span class="sourceLineNo">1763</span>  }<a name="line.1763"></a>
-<span class="sourceLineNo">1764</span><a name="line.1764"></a>
-<span class="sourceLineNo">1765</span>  /////////////////////////////////////////////////////////////////////////////////////////////////<a name="line.1765"></a>
-<span class="sourceLineNo">1766</span>  // BulkLoadObserver hooks<a name="line.1766"></a>
-<span class="sourceLineNo">1767</span>  /////////////////////////////////////////////////////////////////////////////////////////////////<a name="line.1767"></a>
-<span class="sourceLineNo">1768</span>  public void prePrepareBulkLoad(User user) throws IOException {<a name="line.1768"></a>
-<span class="sourceLineNo">1769</span>    execOperation(coprocEnvironments.isEmpty() ? null :<a name="line.1769"></a>
-<span class="sourceLineNo">1770</span>        new BulkLoadObserverOperation(user) {<a name="line.1770"></a>
-<span class="sourceLineNo">1771</span>          @Override protected void call(BulkLoadObserver observer) throws IOException {<a name="line.1771"></a>
-<span class="sourceLineNo">1772</span>            observer.prePrepareBulkLoad(this);<a name="line.1772"></a>
-<span class="sourceLineNo">1773</span>          }<a name="line.1773"></a>
-<span class="sourceLineNo">1774</span>        });<a name="line.1774"></a>
+<span class="sourceLineNo">1723</span>  public void preWALAppend(WALKey key, WALEdit edit) throws IOException {<a name="line.1723"></a>
+<span class="sourceLineNo">1724</span>    if (this.coprocEnvironments.isEmpty()){<a name="line.1724"></a>
+<span class="sourceLineNo">1725</span>      return;<a name="line.1725"></a>
+<span class="sourceLineNo">1726</span>    }<a name="line.1726"></a>
+<span class="sourceLineNo">1727</span>    execOperation(new RegionObserverOperationWithoutResult() {<a name="line.1727"></a>
+<span class="sourceLineNo">1728</span>      @Override<a name="line.1728"></a>
+<span class="sourceLineNo">1729</span>      public void call(RegionObserver observer) throws IOException {<a name="line.1729"></a>
+<span class="sourceLineNo">1730</span>        observer.preWALAppend(this, key, edit);<a name="line.1730"></a>
+<span class="sourceLineNo">1731</span>      }<a name="line.1731"></a>
+<span class="sourceLineNo">1732</span>    });<a name="line.1732"></a>
+<span class="sourceLineNo">1733</span>  }<a name="line.1733"></a>
+<span class="sourceLineNo">1734</span><a name="line.1734"></a>
+<span class="sourceLineNo">1735</span>  public Message preEndpointInvocation(final Service service, final String methodName,<a name="line.1735"></a>
+<span class="sourceLineNo">1736</span>      Message request) throws IOException {<a name="line.1736"></a>
+<span class="sourceLineNo">1737</span>    if (coprocEnvironments.isEmpty()) {<a name="line.1737"></a>
+<span class="sourceLineNo">1738</span>      return request;<a name="line.1738"></a>
+<span class="sourceLineNo">1739</span>    }<a name="line.1739"></a>
+<span class="sourceLineNo">1740</span>    return execOperationWithResult(new ObserverOperationWithResult&lt;EndpointObserver,<a name="line.1740"></a>
+<span class="sourceLineNo">1741</span>        Message&gt;(endpointObserverGetter, request) {<a name="line.1741"></a>
+<span class="sourceLineNo">1742</span>      @Override<a name="line.1742"></a>
+<span class="sourceLineNo">1743</span>      public Message call(EndpointObserver observer) throws IOException {<a name="line.1743"></a>
+<span class="sourceLineNo">1744</span>        return observer.preEndpointInvocation(this, service, methodName, getResult());<a name="line.1744"></a>
+<span class="sourceLineNo">1745</span>      }<a name="line.1745"></a>
+<span class="sourceLineNo">1746</span>    });<a name="line.1746"></a>
+<span class="sourceLineNo">1747</span>  }<a name="line.1747"></a>
+<span class="sourceLineNo">1748</span><a name="line.1748"></a>
+<span class="sourceLineNo">1749</span>  public void postEndpointInvocation(final Service service, final String methodName,<a name="line.1749"></a>
+<span class="sourceLineNo">1750</span>      final Message request, final Message.Builder responseBuilder) throws IOException {<a name="line.1750"></a>
+<span class="sourceLineNo">1751</span>    execOperation(coprocEnvironments.isEmpty() ? null :<a name="line.1751"></a>
+<span class="sourceLineNo">1752</span>        new ObserverOperationWithoutResult&lt;EndpointObserver&gt;(endpointObserverGetter) {<a name="line.1752"></a>
+<span class="sourceLineNo">1753</span>          @Override<a name="line.1753"></a>
+<span class="sourceLineNo">1754</span>          public void call(EndpointObserver observer) throws IOException {<a name="line.1754"></a>
+<span class="sourceLineNo">1755</span>            observer.postEndpointInvocation(this, service, methodName, request, responseBuilder);<a name="line.1755"></a>
+<span class="sourceLineNo">1756</span>          }<a name="line.1756"></a>
+<span class="sourceLineNo">1757</span>        });<a name="line.1757"></a>
+<span class="sourceLineNo">1758</span>  }<a name="line.1758"></a>
+<span class="sourceLineNo">1759</span><a name="line.1759"></a>
+<span class="sourceLineNo">1760</span>  /**<a name="line.1760"></a>
+<span class="sourceLineNo">1761</span>   * @deprecated Since 2.0 with out any replacement and will be removed in 3.0<a name="line.1761"></a>
+<span class="sourceLineNo">1762</span>   */<a name="line.1762"></a>
+<span class="sourceLineNo">1763</span>  @Deprecated<a name="line.1763"></a>
+<span class="sourceLineNo">1764</span>  public DeleteTracker postInstantiateDeleteTracker(DeleteTracker result) throws IOException {<a name="line.1764"></a>
+<span class="sourceLineNo">1765</span>    if (this.coprocEnvironments.isEmpty()) {<a name="line.1765"></a>
+<span class="sourceLineNo">1766</span>      return result;<a name="line.1766"></a>
+<span class="sourceLineNo">1767</span>    }<a name="line.1767"></a>
+<span class="sourceLineNo">1768</span>    return execOperationWithResult(new ObserverOperationWithResult&lt;RegionObserver, DeleteTracker&gt;(<a name="line.1768"></a>
+<span class="sourceLineNo">1769</span>        regionObserverGetter, result) {<a name="line.1769"></a>
+<span class="sourceLineNo">1770</span>      @Override<a name="line.1770"></a>
+<span class="sourceLineNo">1771</span>      public DeleteTracker call(RegionObserver observer) throws IOException {<a name="line.1771"></a>
+<span class="sourceLineNo">1772</span>        return observer.postInstantiateDeleteTracker(this, getResult());<a name="line.1772"></a>
+<span class="sourceLineNo">1773</span>      }<a name="line.1773"></a>
+<span class="sourceLineNo">1774</span>    });<a name="line.1774"></a>
 <span class="sourceLineNo">1775</span>  }<a name="line.1775"></a>
 <span class="sourceLineNo">1776</span><a name="line.1776"></a>
-<span class="sourceLineNo">1777</span>  public void preCleanupBulkLoad(User user) throws IOException {<a name="line.1777"></a>
-<span class="sourceLineNo">1778</span>    execOperation(coprocEnvironments.isEmpty() ? null :<a name="line.1778"></a>
-<span class="sourceLineNo">1779</span>        new BulkLoadObserverOperation(user) {<a name="line.1779"></a>
-<span class="sourceLineNo">1780</span>          @Override protected void call(BulkLoadObserver observer) throws IOException {<a name="line.1780"></a>
-<span class="sourceLineNo">1781</span>            observer.preCleanupBulkLoad(this);<a name="line.1781"></a>
-<span class="sourceLineNo">1782</span>          }<a name="line.1782"></a>
-<span class="sourceLineNo">1783</span>        });<a name="line.1783"></a>
-<span class="sourceLineNo">1784</span>  }<a name="line.1784"></a>
-<span class="sourceLineNo">1785</span>}<a name="line.1785"></a>
+<span class="sourceLineNo">1777</span>  /////////////////////////////////////////////////////////////////////////////////////////////////<a name="line.1777"></a>
+<span class="sourceLineNo">1778</span>  // BulkLoadObserver hooks<a name="line.1778"></a>
+<span class="sourceLineNo">1779</span>  /////////////////////////////////////////////////////////////////////////////////////////////////<a name="line.1779"></a>
+<span class="sourceLineNo">1780</span>  public void prePrepareBulkLoad(User user) throws IOException {<a name="line.1780"></a>
+<span class="sourceLineNo">1781</span>    execOperation(coprocEnvironments.isEmpty() ? null :<a name="line.1781"></a>
+<span class="sourceLineNo">1782</span>        new BulkLoadObserverOperation(user) {<a name="line.1782"></a>
+<span class="sourceLineNo">1783</span>          @Override protected void call(BulkLoadObserver observer) throws IOException {<a name="line.1783"></a>
+<span class="sourceLineNo">1784</span>            observer.prePrepareBulkLoad(this);<a name="line.1784"></a>
+<span class="sourceLineNo">1785</span>          }<a name="line.1785"></a>
+<span class="sourceLineNo">1786</span>        });<a name="line.1786"></a>
+<span class="sourceLineNo">1787</span>  }<a name="line.1787"></a>
+<span class="sourceLineNo">1788</span><a name="line.1788"></a>
+<span class="sourceLineNo">1789</span>  public void preCleanupBulkLoad(User user) throws IOException {<a name="line.1789"></a>
+<span class="sourceLineNo">1790</span>    execOperation(coprocEnvironments.isEmpty() ? null :<a name="line.1790"></a>
+<span class="sourceLineNo">1791</span>        new BulkLoadObserverOperation(user) {<a name="line.1791"></a>
+<span class="sourceLineNo">1792</span>          @Override protected void call(BulkLoadObserver observer) throws IOException {<a name="line.1792"></a>
+<span class="sourceLineNo">1793</span>            observer.preCleanupBulkLoad(this);<a name="line.1793"></a>
+<span class="sourceLineNo">1794</span>          }<a name="line.1794"></a>
+<span class="sourceLineNo">1795</span>        });<a name="line.1795"></a>
+<span class="sourceLineNo">1796</span>  }<a name="line.1796"></a>
+<span class="sourceLineNo">1797</span>}<a name="line.1797"></a>
 
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.RegionEnvironment.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.RegionEnvironment.html
index 04e8cb5..8bed22d 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.RegionEnvironment.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.RegionEnvironment.html
@@ -1728,69 +1728,81 @@
 <span class="sourceLineNo">1720</span>        });<a name="line.1720"></a>
 <span class="sourceLineNo">1721</span>  }<a name="line.1721"></a>
 <span class="sourceLineNo">1722</span><a name="line.1722"></a>
-<span class="sourceLineNo">1723</span>  public Message preEndpointInvocation(final Service service, final String methodName,<a name="line.1723"></a>
-<span class="sourceLineNo">1724</span>      Message request) throws IOException {<a name="line.1724"></a>
-<span class="sourceLineNo">1725</span>    if (coprocEnvironments.isEmpty()) {<a name="line.1725"></a>
-<span class="sourceLineNo">1726</span>      return request;<a name="line.1726"></a>
-<span class="sourceLineNo">1727</span>    }<a name="line.1727"></a>
-<span class="sourceLineNo">1728</span>    return execOperationWithResult(new ObserverOperationWithResult&lt;EndpointObserver,<a name="line.1728"></a>
-<span class="sourceLineNo">1729</span>        Message&gt;(endpointObserverGetter, request) {<a name="line.1729"></a>
-<span class="sourceLineNo">1730</span>      @Override<a name="line.1730"></a>
-<span class="sourceLineNo">1731</span>      public Message call(EndpointObserver observer) throws IOException {<a name="line.1731"></a>
-<span class="sourceLineNo">1732</span>        return observer.preEndpointInvocation(this, service, methodName, getResult());<a name="line.1732"></a>
-<span class="sourceLineNo">1733</span>      }<a name="line.1733"></a>
-<span class="sourceLineNo">1734</span>    });<a name="line.1734"></a>
-<span class="sourceLineNo">1735</span>  }<a name="line.1735"></a>
-<span class="sourceLineNo">1736</span><a name="line.1736"></a>
-<span class="sourceLineNo">1737</span>  public void postEndpointInvocation(final Service service, final String methodName,<a name="line.1737"></a>
-<span class="sourceLineNo">1738</span>      final Message request, final Message.Builder responseBuilder) throws IOException {<a name="line.1738"></a>
-<span class="sourceLineNo">1739</span>    execOperation(coprocEnvironments.isEmpty() ? null :<a name="line.1739"></a>
-<span class="sourceLineNo">1740</span>        new ObserverOperationWithoutResult&lt;EndpointObserver&gt;(endpointObserverGetter) {<a name="line.1740"></a>
-<span class="sourceLineNo">1741</span>          @Override<a name="line.1741"></a>
-<span class="sourceLineNo">1742</span>          public void call(EndpointObserver observer) throws IOException {<a name="line.1742"></a>
-<span class="sourceLineNo">1743</span>            observer.postEndpointInvocation(this, service, methodName, request, responseBuilder);<a name="line.1743"></a>
-<span class="sourceLineNo">1744</span>          }<a name="line.1744"></a>
-<span class="sourceLineNo">1745</span>        });<a name="line.1745"></a>
-<span class="sourceLineNo">1746</span>  }<a name="line.1746"></a>
-<span class="sourceLineNo">1747</span><a name="line.1747"></a>
-<span class="sourceLineNo">1748</span>  /**<a name="line.1748"></a>
-<span class="sourceLineNo">1749</span>   * @deprecated Since 2.0 with out any replacement and will be removed in 3.0<a name="line.1749"></a>
-<span class="sourceLineNo">1750</span>   */<a name="line.1750"></a>
-<span class="sourceLineNo">1751</span>  @Deprecated<a name="line.1751"></a>
-<span class="sourceLineNo">1752</span>  public DeleteTracker postInstantiateDeleteTracker(DeleteTracker result) throws IOException {<a name="line.1752"></a>
-<span class="sourceLineNo">1753</span>    if (this.coprocEnvironments.isEmpty()) {<a name="line.1753"></a>
-<span class="sourceLineNo">1754</span>      return result;<a name="line.1754"></a>
-<span class="sourceLineNo">1755</span>    }<a name="line.1755"></a>
-<span class="sourceLineNo">1756</span>    return execOperationWithResult(new ObserverOperationWithResult&lt;RegionObserver, DeleteTracker&gt;(<a name="line.1756"></a>
-<span class="sourceLineNo">1757</span>        regionObserverGetter, result) {<a name="line.1757"></a>
-<span class="sourceLineNo">1758</span>      @Override<a name="line.1758"></a>
-<span class="sourceLineNo">1759</span>      public DeleteTracker call(RegionObserver observer) throws IOException {<a name="line.1759"></a>
-<span class="sourceLineNo">1760</span>        return observer.postInstantiateDeleteTracker(this, getResult());<a name="line.1760"></a>
-<span class="sourceLineNo">1761</span>      }<a name="line.1761"></a>
-<span class="sourceLineNo">1762</span>    });<a name="line.1762"></a>
-<span class="sourceLineNo">1763</span>  }<a name="line.1763"></a>
-<span class="sourceLineNo">1764</span><a name="line.1764"></a>
-<span class="sourceLineNo">1765</span>  /////////////////////////////////////////////////////////////////////////////////////////////////<a name="line.1765"></a>
-<span class="sourceLineNo">1766</span>  // BulkLoadObserver hooks<a name="line.1766"></a>
-<span class="sourceLineNo">1767</span>  /////////////////////////////////////////////////////////////////////////////////////////////////<a name="line.1767"></a>
-<span class="sourceLineNo">1768</span>  public void prePrepareBulkLoad(User user) throws IOException {<a name="line.1768"></a>
-<span class="sourceLineNo">1769</span>    execOperation(coprocEnvironments.isEmpty() ? null :<a name="line.1769"></a>
-<span class="sourceLineNo">1770</span>        new BulkLoadObserverOperation(user) {<a name="line.1770"></a>
-<span class="sourceLineNo">1771</span>          @Override protected void call(BulkLoadObserver observer) throws IOException {<a name="line.1771"></a>
-<span class="sourceLineNo">1772</span>            observer.prePrepareBulkLoad(this);<a name="line.1772"></a>
-<span class="sourceLineNo">1773</span>          }<a name="line.1773"></a>
-<span class="sourceLineNo">1774</span>        });<a name="line.1774"></a>
+<span class="sourceLineNo">1723</span>  public void preWALAppend(WALKey key, WALEdit edit) throws IOException {<a name="line.1723"></a>
+<span class="sourceLineNo">1724</span>    if (this.coprocEnvironments.isEmpty()){<a name="line.1724"></a>
+<span class="sourceLineNo">1725</span>      return;<a name="line.1725"></a>
+<span class="sourceLineNo">1726</span>    }<a name="line.1726"></a>
+<span class="sourceLineNo">1727</span>    execOperation(new RegionObserverOperationWithoutResult() {<a name="line.1727"></a>
+<span class="sourceLineNo">1728</span>      @Override<a name="line.1728"></a>
+<span class="sourceLineNo">1729</span>      public void call(RegionObserver observer) throws IOException {<a name="line.1729"></a>
+<span class="sourceLineNo">1730</span>        observer.preWALAppend(this, key, edit);<a name="line.1730"></a>
+<span class="sourceLineNo">1731</span>      }<a name="line.1731"></a>
+<span class="sourceLineNo">1732</span>    });<a name="line.1732"></a>
+<span class="sourceLineNo">1733</span>  }<a name="line.1733"></a>
+<span class="sourceLineNo">1734</span><a name="line.1734"></a>
+<span class="sourceLineNo">1735</span>  public Message preEndpointInvocation(final Service service, final String methodName,<a name="line.1735"></a>
+<span class="sourceLineNo">1736</span>      Message request) throws IOException {<a name="line.1736"></a>
+<span class="sourceLineNo">1737</span>    if (coprocEnvironments.isEmpty()) {<a name="line.1737"></a>
+<span class="sourceLineNo">1738</span>      return request;<a name="line.1738"></a>
+<span class="sourceLineNo">1739</span>    }<a name="line.1739"></a>
+<span class="sourceLineNo">1740</span>    return execOperationWithResult(new ObserverOperationWithResult&lt;EndpointObserver,<a name="line.1740"></a>
+<span class="sourceLineNo">1741</span>        Message&gt;(endpointObserverGetter, request) {<a name="line.1741"></a>
+<span class="sourceLineNo">1742</span>      @Override<a name="line.1742"></a>
+<span class="sourceLineNo">1743</span>      public Message call(EndpointObserver observer) throws IOException {<a name="line.1743"></a>
+<span class="sourceLineNo">1744</span>        return observer.preEndpointInvocation(this, service, methodName, getResult());<a name="line.1744"></a>
+<span class="sourceLineNo">1745</span>      }<a name="line.1745"></a>
+<span class="sourceLineNo">1746</span>    });<a name="line.1746"></a>
+<span class="sourceLineNo">1747</span>  }<a name="line.1747"></a>
+<span class="sourceLineNo">1748</span><a name="line.1748"></a>
+<span class="sourceLineNo">1749</span>  public void postEndpointInvocation(final Service service, final String methodName,<a name="line.1749"></a>
+<span class="sourceLineNo">1750</span>      final Message request, final Message.Builder responseBuilder) throws IOException {<a name="line.1750"></a>
+<span class="sourceLineNo">1751</span>    execOperation(coprocEnvironments.isEmpty() ? null :<a name="line.1751"></a>
+<span class="sourceLineNo">1752</span>        new ObserverOperationWithoutResult&lt;EndpointObserver&gt;(endpointObserverGetter) {<a name="line.1752"></a>
+<span class="sourceLineNo">1753</span>          @Override<a name="line.1753"></a>
+<span class="sourceLineNo">1754</span>          public void call(EndpointObserver observer) throws IOException {<a name="line.1754"></a>
+<span class="sourceLineNo">1755</span>            observer.postEndpointInvocation(this, service, methodName, request, responseBuilder);<a name="line.1755"></a>
+<span class="sourceLineNo">1756</span>          }<a name="line.1756"></a>
+<span class="sourceLineNo">1757</span>        });<a name="line.1757"></a>
+<span class="sourceLineNo">1758</span>  }<a name="line.1758"></a>
+<span class="sourceLineNo">1759</span><a name="line.1759"></a>
+<span class="sourceLineNo">1760</span>  /**<a name="line.1760"></a>
+<span class="sourceLineNo">1761</span>   * @deprecated Since 2.0 with out any replacement and will be removed in 3.0<a name="line.1761"></a>
+<span class="sourceLineNo">1762</span>   */<a name="line.1762"></a>
+<span class="sourceLineNo">1763</span>  @Deprecated<a name="line.1763"></a>
+<span class="sourceLineNo">1764</span>  public DeleteTracker postInstantiateDeleteTracker(DeleteTracker result) throws IOException {<a name="line.1764"></a>
+<span class="sourceLineNo">1765</span>    if (this.coprocEnvironments.isEmpty()) {<a name="line.1765"></a>
+<span class="sourceLineNo">1766</span>      return result;<a name="line.1766"></a>
+<span class="sourceLineNo">1767</span>    }<a name="line.1767"></a>
+<span class="sourceLineNo">1768</span>    return execOperationWithResult(new ObserverOperationWithResult&lt;RegionObserver, DeleteTracker&gt;(<a name="line.1768"></a>
+<span class="sourceLineNo">1769</span>        regionObserverGetter, result) {<a name="line.1769"></a>
+<span class="sourceLineNo">1770</span>      @Override<a name="line.1770"></a>
+<span class="sourceLineNo">1771</span>      public DeleteTracker call(RegionObserver observer) throws IOException {<a name="line.1771"></a>
+<span class="sourceLineNo">1772</span>        return observer.postInstantiateDeleteTracker(this, getResult());<a name="line.1772"></a>
+<span class="sourceLineNo">1773</span>      }<a name="line.1773"></a>
+<span class="sourceLineNo">1774</span>    });<a name="line.1774"></a>
 <span class="sourceLineNo">1775</span>  }<a name="line.1775"></a>
 <span class="sourceLineNo">1776</span><a name="line.1776"></a>
-<span class="sourceLineNo">1777</span>  public void preCleanupBulkLoad(User user) throws IOException {<a name="line.1777"></a>
-<span class="sourceLineNo">1778</span>    execOperation(coprocEnvironments.isEmpty() ? null :<a name="line.1778"></a>
-<span class="sourceLineNo">1779</span>        new BulkLoadObserverOperation(user) {<a name="line.1779"></a>
-<span class="sourceLineNo">1780</span>          @Override protected void call(BulkLoadObserver observer) throws IOException {<a name="line.1780"></a>
-<span class="sourceLineNo">1781</span>            observer.preCleanupBulkLoad(this);<a name="line.1781"></a>
-<span class="sourceLineNo">1782</span>          }<a name="line.1782"></a>
-<span class="sourceLineNo">1783</span>        });<a name="line.1783"></a>
-<span class="sourceLineNo">1784</span>  }<a name="line.1784"></a>
-<span class="sourceLineNo">1785</span>}<a name="line.1785"></a>
+<span class="sourceLineNo">1777</span>  /////////////////////////////////////////////////////////////////////////////////////////////////<a name="line.1777"></a>
+<span class="sourceLineNo">1778</span>  // BulkLoadObserver hooks<a name="line.1778"></a>
+<span class="sourceLineNo">1779</span>  /////////////////////////////////////////////////////////////////////////////////////////////////<a name="line.1779"></a>
+<span class="sourceLineNo">1780</span>  public void prePrepareBulkLoad(User user) throws IOException {<a name="line.1780"></a>
+<span class="sourceLineNo">1781</span>    execOperation(coprocEnvironments.isEmpty() ? null :<a name="line.1781"></a>
+<span class="sourceLineNo">1782</span>        new BulkLoadObserverOperation(user) {<a name="line.1782"></a>
+<span class="sourceLineNo">1783</span>          @Override protected void call(BulkLoadObserver observer) throws IOException {<a name="line.1783"></a>
+<span class="sourceLineNo">1784</span>            observer.prePrepareBulkLoad(this);<a name="line.1784"></a>
+<span class="sourceLineNo">1785</span>          }<a name="line.1785"></a>
+<span class="sourceLineNo">1786</span>        });<a name="line.1786"></a>
+<span class="sourceLineNo">1787</span>  }<a name="line.1787"></a>
+<span class="sourceLineNo">1788</span><a name="line.1788"></a>
+<span class="sourceLineNo">1789</span>  public void preCleanupBulkLoad(User user) throws IOException {<a name="line.1789"></a>
+<span class="sourceLineNo">1790</span>    execOperation(coprocEnvironments.isEmpty() ? null :<a name="line.1790"></a>
+<span class="sourceLineNo">1791</span>        new BulkLoadObserverOperation(user) {<a name="line.1791"></a>
+<span class="sourceLineNo">1792</span>          @Override protected void call(BulkLoadObserver observer) throws IOException {<a name="line.1792"></a>
+<span class="sourceLineNo">1793</span>            observer.preCleanupBulkLoad(this);<a name="line.1793"></a>
+<span class="sourceLineNo">1794</span>          }<a name="line.1794"></a>
+<span class="sourceLineNo">1795</span>        });<a name="line.1795"></a>
+<span class="sourceLineNo">1796</span>  }<a name="line.1796"></a>
+<span class="sourceLineNo">1797</span>}<a name="line.1797"></a>
 
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.RegionEnvironmentForCoreCoprocessors.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.RegionEnvironmentForCoreCoprocessors.html
index 04e8cb5..8bed22d 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.RegionEnvironmentForCoreCoprocessors.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.RegionEnvironmentForCoreCoprocessors.html
@@ -1728,69 +1728,81 @@
 <span class="sourceLineNo">1720</span>        });<a name="line.1720"></a>
 <span class="sourceLineNo">1721</span>  }<a name="line.1721"></a>
 <span class="sourceLineNo">1722</span><a name="line.1722"></a>
-<span class="sourceLineNo">1723</span>  public Message preEndpointInvocation(final Service service, final String methodName,<a name="line.1723"></a>
-<span class="sourceLineNo">1724</span>      Message request) throws IOException {<a name="line.1724"></a>
-<span class="sourceLineNo">1725</span>    if (coprocEnvironments.isEmpty()) {<a name="line.1725"></a>
-<span class="sourceLineNo">1726</span>      return request;<a name="line.1726"></a>
-<span class="sourceLineNo">1727</span>    }<a name="line.1727"></a>
-<span class="sourceLineNo">1728</span>    return execOperationWithResult(new ObserverOperationWithResult&lt;EndpointObserver,<a name="line.1728"></a>
-<span class="sourceLineNo">1729</span>        Message&gt;(endpointObserverGetter, request) {<a name="line.1729"></a>
-<span class="sourceLineNo">1730</span>      @Override<a name="line.1730"></a>
-<span class="sourceLineNo">1731</span>      public Message call(EndpointObserver observer) throws IOException {<a name="line.1731"></a>
-<span class="sourceLineNo">1732</span>        return observer.preEndpointInvocation(this, service, methodName, getResult());<a name="line.1732"></a>
-<span class="sourceLineNo">1733</span>      }<a name="line.1733"></a>
-<span class="sourceLineNo">1734</span>    });<a name="line.1734"></a>
-<span class="sourceLineNo">1735</span>  }<a name="line.1735"></a>
-<span class="sourceLineNo">1736</span><a name="line.1736"></a>
-<span class="sourceLineNo">1737</span>  public void postEndpointInvocation(final Service service, final String methodName,<a name="line.1737"></a>
-<span class="sourceLineNo">1738</span>      final Message request, final Message.Builder responseBuilder) throws IOException {<a name="line.1738"></a>
-<span class="sourceLineNo">1739</span>    execOperation(coprocEnvironments.isEmpty() ? null :<a name="line.1739"></a>
-<span class="sourceLineNo">1740</span>        new ObserverOperationWithoutResult&lt;EndpointObserver&gt;(endpointObserverGetter) {<a name="line.1740"></a>
-<span class="sourceLineNo">1741</span>          @Override<a name="line.1741"></a>
-<span class="sourceLineNo">1742</span>          public void call(EndpointObserver observer) throws IOException {<a name="line.1742"></a>
-<span class="sourceLineNo">1743</span>            observer.postEndpointInvocation(this, service, methodName, request, responseBuilder);<a name="line.1743"></a>
-<span class="sourceLineNo">1744</span>          }<a name="line.1744"></a>
-<span class="sourceLineNo">1745</span>        });<a name="line.1745"></a>
-<span class="sourceLineNo">1746</span>  }<a name="line.1746"></a>
-<span class="sourceLineNo">1747</span><a name="line.1747"></a>
-<span class="sourceLineNo">1748</span>  /**<a name="line.1748"></a>
-<span class="sourceLineNo">1749</span>   * @deprecated Since 2.0 with out any replacement and will be removed in 3.0<a name="line.1749"></a>
-<span class="sourceLineNo">1750</span>   */<a name="line.1750"></a>
-<span class="sourceLineNo">1751</span>  @Deprecated<a name="line.1751"></a>
-<span class="sourceLineNo">1752</span>  public DeleteTracker postInstantiateDeleteTracker(DeleteTracker result) throws IOException {<a name="line.1752"></a>
-<span class="sourceLineNo">1753</span>    if (this.coprocEnvironments.isEmpty()) {<a name="line.1753"></a>
-<span class="sourceLineNo">1754</span>      return result;<a name="line.1754"></a>
-<span class="sourceLineNo">1755</span>    }<a name="line.1755"></a>
-<span class="sourceLineNo">1756</span>    return execOperationWithResult(new ObserverOperationWithResult&lt;RegionObserver, DeleteTracker&gt;(<a name="line.1756"></a>
-<span class="sourceLineNo">1757</span>        regionObserverGetter, result) {<a name="line.1757"></a>
-<span class="sourceLineNo">1758</span>      @Override<a name="line.1758"></a>
-<span class="sourceLineNo">1759</span>      public DeleteTracker call(RegionObserver observer) throws IOException {<a name="line.1759"></a>
-<span class="sourceLineNo">1760</span>        return observer.postInstantiateDeleteTracker(this, getResult());<a name="line.1760"></a>
-<span class="sourceLineNo">1761</span>      }<a name="line.1761"></a>
-<span class="sourceLineNo">1762</span>    });<a name="line.1762"></a>
-<span class="sourceLineNo">1763</span>  }<a name="line.1763"></a>
-<span class="sourceLineNo">1764</span><a name="line.1764"></a>
-<span class="sourceLineNo">1765</span>  /////////////////////////////////////////////////////////////////////////////////////////////////<a name="line.1765"></a>
-<span class="sourceLineNo">1766</span>  // BulkLoadObserver hooks<a name="line.1766"></a>
-<span class="sourceLineNo">1767</span>  /////////////////////////////////////////////////////////////////////////////////////////////////<a name="line.1767"></a>
-<span class="sourceLineNo">1768</span>  public void prePrepareBulkLoad(User user) throws IOException {<a name="line.1768"></a>
-<span class="sourceLineNo">1769</span>    execOperation(coprocEnvironments.isEmpty() ? null :<a name="line.1769"></a>
-<span class="sourceLineNo">1770</span>        new BulkLoadObserverOperation(user) {<a name="line.1770"></a>
-<span class="sourceLineNo">1771</span>          @Override protected void call(BulkLoadObserver observer) throws IOException {<a name="line.1771"></a>
-<span class="sourceLineNo">1772</span>            observer.prePrepareBulkLoad(this);<a name="line.1772"></a>
-<span class="sourceLineNo">1773</span>          }<a name="line.1773"></a>
-<span class="sourceLineNo">1774</span>        });<a name="line.1774"></a>
+<span class="sourceLineNo">1723</span>  public void preWALAppend(WALKey key, WALEdit edit) throws IOException {<a name="line.1723"></a>
+<span class="sourceLineNo">1724</span>    if (this.coprocEnvironments.isEmpty()){<a name="line.1724"></a>
+<span class="sourceLineNo">1725</span>      return;<a name="line.1725"></a>
+<span class="sourceLineNo">1726</span>    }<a name="line.1726"></a>
+<span class="sourceLineNo">1727</span>    execOperation(new RegionObserverOperationWithoutResult() {<a name="line.1727"></a>
+<span class="sourceLineNo">1728</span>      @Override<a name="line.1728"></a>
+<span class="sourceLineNo">1729</span>      public void call(RegionObserver observer) throws IOException {<a name="line.1729"></a>
+<span class="sourceLineNo">1730</span>        observer.preWALAppend(this, key, edit);<a name="line.1730"></a>
+<span class="sourceLineNo">1731</span>      }<a name="line.1731"></a>
+<span class="sourceLineNo">1732</span>    });<a name="line.1732"></a>
+<span class="sourceLineNo">1733</span>  }<a name="line.1733"></a>
+<span class="sourceLineNo">1734</span><a name="line.1734"></a>
+<span class="sourceLineNo">1735</span>  public Message preEndpointInvocation(final Service service, final String methodName,<a name="line.1735"></a>
+<span class="sourceLineNo">1736</span>      Message request) throws IOException {<a name="line.1736"></a>
+<span class="sourceLineNo">1737</span>    if (coprocEnvironments.isEmpty()) {<a name="line.1737"></a>
+<span class="sourceLineNo">1738</span>      return request;<a name="line.1738"></a>
+<span class="sourceLineNo">1739</span>    }<a name="line.1739"></a>
+<span class="sourceLineNo">1740</span>    return execOperationWithResult(new ObserverOperationWithResult&lt;EndpointObserver,<a name="line.1740"></a>
+<span class="sourceLineNo">1741</span>        Message&gt;(endpointObserverGetter, request) {<a name="line.1741"></a>
+<span class="sourceLineNo">1742</span>      @Override<a name="line.1742"></a>
+<span class="sourceLineNo">1743</span>      public Message call(EndpointObserver observer) throws IOException {<a name="line.1743"></a>
+<span class="sourceLineNo">1744</span>        return observer.preEndpointInvocation(this, service, methodName, getResult());<a name="line.1744"></a>
+<span class="sourceLineNo">1745</span>      }<a name="line.1745"></a>
+<span class="sourceLineNo">1746</span>    });<a name="line.1746"></a>
+<span class="sourceLineNo">1747</span>  }<a name="line.1747"></a>
+<span class="sourceLineNo">1748</span><a name="line.1748"></a>
+<span class="sourceLineNo">1749</span>  public void postEndpointInvocation(final Service service, final String methodName,<a name="line.1749"></a>
+<span class="sourceLineNo">1750</span>      final Message request, final Message.Builder responseBuilder) throws IOException {<a name="line.1750"></a>
+<span class="sourceLineNo">1751</span>    execOperation(coprocEnvironments.isEmpty() ? null :<a name="line.1751"></a>
+<span class="sourceLineNo">1752</span>        new ObserverOperationWithoutResult&lt;EndpointObserver&gt;(endpointObserverGetter) {<a name="line.1752"></a>
+<span class="sourceLineNo">1753</span>          @Override<a name="line.1753"></a>
+<span class="sourceLineNo">1754</span>          public void call(EndpointObserver observer) throws IOException {<a name="line.1754"></a>
+<span class="sourceLineNo">1755</span>            observer.postEndpointInvocation(this, service, methodName, request, responseBuilder);<a name="line.1755"></a>
+<span class="sourceLineNo">1756</span>          }<a name="line.1756"></a>
+<span class="sourceLineNo">1757</span>        });<a name="line.1757"></a>
+<span class="sourceLineNo">1758</span>  }<a name="line.1758"></a>
+<span class="sourceLineNo">1759</span><a name="line.1759"></a>
+<span class="sourceLineNo">1760</span>  /**<a name="line.1760"></a>
+<span class="sourceLineNo">1761</span>   * @deprecated Since 2.0 with out any replacement and will be removed in 3.0<a name="line.1761"></a>
+<span class="sourceLineNo">1762</span>   */<a name="line.1762"></a>
+<span class="sourceLineNo">1763</span>  @Deprecated<a name="line.1763"></a>
+<span class="sourceLineNo">1764</span>  public DeleteTracker postInstantiateDeleteTracker(DeleteTracker result) throws IOException {<a name="line.1764"></a>
+<span class="sourceLineNo">1765</span>    if (this.coprocEnvironments.isEmpty()) {<a name="line.1765"></a>
+<span class="sourceLineNo">1766</span>      return result;<a name="line.1766"></a>
+<span class="sourceLineNo">1767</span>    }<a name="line.1767"></a>
+<span class="sourceLineNo">1768</span>    return execOperationWithResult(new ObserverOperationWithResult&lt;RegionObserver, DeleteTracker&gt;(<a name="line.1768"></a>
+<span class="sourceLineNo">1769</span>        regionObserverGetter, result) {<a name="line.1769"></a>
+<span class="sourceLineNo">1770</span>      @Override<a name="line.1770"></a>
+<span class="sourceLineNo">1771</span>      public DeleteTracker call(RegionObserver observer) throws IOException {<a name="line.1771"></a>
+<span class="sourceLineNo">1772</span>        return observer.postInstantiateDeleteTracker(this, getResult());<a name="line.1772"></a>
+<span class="sourceLineNo">1773</span>      }<a name="line.1773"></a>
+<span class="sourceLineNo">1774</span>    });<a name="line.1774"></a>
 <span class="sourceLineNo">1775</span>  }<a name="line.1775"></a>
 <span class="sourceLineNo">1776</span><a name="line.1776"></a>
-<span class="sourceLineNo">1777</span>  public void preCleanupBulkLoad(User user) throws IOException {<a name="line.1777"></a>
-<span class="sourceLineNo">1778</span>    execOperation(coprocEnvironments.isEmpty() ? null :<a name="line.1778"></a>
-<span class="sourceLineNo">1779</span>        new BulkLoadObserverOperation(user) {<a name="line.1779"></a>
-<span class="sourceLineNo">1780</span>          @Override protected void call(BulkLoadObserver observer) throws IOException {<a name="line.1780"></a>
-<span class="sourceLineNo">1781</span>            observer.preCleanupBulkLoad(this);<a name="line.1781"></a>
-<span class="sourceLineNo">1782</span>          }<a name="line.1782"></a>
-<span class="sourceLineNo">1783</span>        });<a name="line.1783"></a>
-<span class="sourceLineNo">1784</span>  }<a name="line.1784"></a>
-<span class="sourceLineNo">1785</span>}<a name="line.1785"></a>
+<span class="sourceLineNo">1777</span>  /////////////////////////////////////////////////////////////////////////////////////////////////<a name="line.1777"></a>
+<span class="sourceLineNo">1778</span>  // BulkLoadObserver hooks<a name="line.1778"></a>
+<span class="sourceLineNo">1779</span>  /////////////////////////////////////////////////////////////////////////////////////////////////<a name="line.1779"></a>
+<span class="sourceLineNo">1780</span>  public void prePrepareBulkLoad(User user) throws IOException {<a name="line.1780"></a>
+<span class="sourceLineNo">1781</span>    execOperation(coprocEnvironments.isEmpty() ? null :<a name="line.1781"></a>
+<span class="sourceLineNo">1782</span>        new BulkLoadObserverOperation(user) {<a name="line.1782"></a>
+<span class="sourceLineNo">1783</span>          @Override protected void call(BulkLoadObserver observer) throws IOException {<a name="line.1783"></a>
+<span class="sourceLineNo">1784</span>            observer.prePrepareBulkLoad(this);<a name="line.1784"></a>
+<span class="sourceLineNo">1785</span>          }<a name="line.1785"></a>
+<span class="sourceLineNo">1786</span>        });<a name="line.1786"></a>
+<span class="sourceLineNo">1787</span>  }<a name="line.1787"></a>
+<span class="sourceLineNo">1788</span><a name="line.1788"></a>
+<span class="sourceLineNo">1789</span>  public void preCleanupBulkLoad(User user) throws IOException {<a name="line.1789"></a>
+<span class="sourceLineNo">1790</span>    execOperation(coprocEnvironments.isEmpty() ? null :<a name="line.1790"></a>
+<span class="sourceLineNo">1791</span>        new BulkLoadObserverOperation(user) {<a name="line.1791"></a>
+<span class="sourceLineNo">1792</span>          @Override protected void call(BulkLoadObserver observer) throws IOException {<a name="line.1792"></a>
+<span class="sourceLineNo">1793</span>            observer.preCleanupBulkLoad(this);<a name="line.1793"></a>
+<span class="sourceLineNo">1794</span>          }<a name="line.1794"></a>
+<span class="sourceLineNo">1795</span>        });<a name="line.1795"></a>
+<span class="sourceLineNo">1796</span>  }<a name="line.1796"></a>
+<span class="sourceLineNo">1797</span>}<a name="line.1797"></a>
 
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.RegionObserverOperationWithoutResult.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.RegionObserverOperationWithoutResult.html
index 04e8cb5..8bed22d 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.RegionObserverOperationWithoutResult.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.RegionObserverOperationWithoutResult.html
@@ -1728,69 +1728,81 @@
 <span class="sourceLineNo">1720</span>        });<a name="line.1720"></a>
 <span class="sourceLineNo">1721</span>  }<a name="line.1721"></a>
 <span class="sourceLineNo">1722</span><a name="line.1722"></a>
-<span class="sourceLineNo">1723</span>  public Message preEndpointInvocation(final Service service, final String methodName,<a name="line.1723"></a>
-<span class="sourceLineNo">1724</span>      Message request) throws IOException {<a name="line.1724"></a>
-<span class="sourceLineNo">1725</span>    if (coprocEnvironments.isEmpty()) {<a name="line.1725"></a>
-<span class="sourceLineNo">1726</span>      return request;<a name="line.1726"></a>
-<span class="sourceLineNo">1727</span>    }<a name="line.1727"></a>
-<span class="sourceLineNo">1728</span>    return execOperationWithResult(new ObserverOperationWithResult&lt;EndpointObserver,<a name="line.1728"></a>
-<span class="sourceLineNo">1729</span>        Message&gt;(endpointObserverGetter, request) {<a name="line.1729"></a>
-<span class="sourceLineNo">1730</span>      @Override<a name="line.1730"></a>
-<span class="sourceLineNo">1731</span>      public Message call(EndpointObserver observer) throws IOException {<a name="line.1731"></a>
-<span class="sourceLineNo">1732</span>        return observer.preEndpointInvocation(this, service, methodName, getResult());<a name="line.1732"></a>
-<span class="sourceLineNo">1733</span>      }<a name="line.1733"></a>
-<span class="sourceLineNo">1734</span>    });<a name="line.1734"></a>
-<span class="sourceLineNo">1735</span>  }<a name="line.1735"></a>
-<span class="sourceLineNo">1736</span><a name="line.1736"></a>
-<span class="sourceLineNo">1737</span>  public void postEndpointInvocation(final Service service, final String methodName,<a name="line.1737"></a>
-<span class="sourceLineNo">1738</span>      final Message request, final Message.Builder responseBuilder) throws IOException {<a name="line.1738"></a>
-<span class="sourceLineNo">1739</span>    execOperation(coprocEnvironments.isEmpty() ? null :<a name="line.1739"></a>
-<span class="sourceLineNo">1740</span>        new ObserverOperationWithoutResult&lt;EndpointObserver&gt;(endpointObserverGetter) {<a name="line.1740"></a>
-<span class="sourceLineNo">1741</span>          @Override<a name="line.1741"></a>
-<span class="sourceLineNo">1742</span>          public void call(EndpointObserver observer) throws IOException {<a name="line.1742"></a>
-<span class="sourceLineNo">1743</span>            observer.postEndpointInvocation(this, service, methodName, request, responseBuilder);<a name="line.1743"></a>
-<span class="sourceLineNo">1744</span>          }<a name="line.1744"></a>
-<span class="sourceLineNo">1745</span>        });<a name="line.1745"></a>
-<span class="sourceLineNo">1746</span>  }<a name="line.1746"></a>
-<span class="sourceLineNo">1747</span><a name="line.1747"></a>
-<span class="sourceLineNo">1748</span>  /**<a name="line.1748"></a>
-<span class="sourceLineNo">1749</span>   * @deprecated Since 2.0 with out any replacement and will be removed in 3.0<a name="line.1749"></a>
-<span class="sourceLineNo">1750</span>   */<a name="line.1750"></a>
-<span class="sourceLineNo">1751</span>  @Deprecated<a name="line.1751"></a>
-<span class="sourceLineNo">1752</span>  public DeleteTracker postInstantiateDeleteTracker(DeleteTracker result) throws IOException {<a name="line.1752"></a>
-<span class="sourceLineNo">1753</span>    if (this.coprocEnvironments.isEmpty()) {<a name="line.1753"></a>
-<span class="sourceLineNo">1754</span>      return result;<a name="line.1754"></a>
-<span class="sourceLineNo">1755</span>    }<a name="line.1755"></a>
-<span class="sourceLineNo">1756</span>    return execOperationWithResult(new ObserverOperationWithResult&lt;RegionObserver, DeleteTracker&gt;(<a name="line.1756"></a>
-<span class="sourceLineNo">1757</span>        regionObserverGetter, result) {<a name="line.1757"></a>
-<span class="sourceLineNo">1758</span>      @Override<a name="line.1758"></a>
-<span class="sourceLineNo">1759</span>      public DeleteTracker call(RegionObserver observer) throws IOException {<a name="line.1759"></a>
-<span class="sourceLineNo">1760</span>        return observer.postInstantiateDeleteTracker(this, getResult());<a name="line.1760"></a>
-<span class="sourceLineNo">1761</span>      }<a name="line.1761"></a>
-<span class="sourceLineNo">1762</span>    });<a name="line.1762"></a>
-<span class="sourceLineNo">1763</span>  }<a name="line.1763"></a>
-<span class="sourceLineNo">1764</span><a name="line.1764"></a>
-<span class="sourceLineNo">1765</span>  /////////////////////////////////////////////////////////////////////////////////////////////////<a name="line.1765"></a>
-<span class="sourceLineNo">1766</span>  // BulkLoadObserver hooks<a name="line.1766"></a>
-<span class="sourceLineNo">1767</span>  /////////////////////////////////////////////////////////////////////////////////////////////////<a name="line.1767"></a>
-<span class="sourceLineNo">1768</span>  public void prePrepareBulkLoad(User user) throws IOException {<a name="line.1768"></a>
-<span class="sourceLineNo">1769</span>    execOperation(coprocEnvironments.isEmpty() ? null :<a name="line.1769"></a>
-<span class="sourceLineNo">1770</span>        new BulkLoadObserverOperation(user) {<a name="line.1770"></a>
-<span class="sourceLineNo">1771</span>          @Override protected void call(BulkLoadObserver observer) throws IOException {<a name="line.1771"></a>
-<span class="sourceLineNo">1772</span>            observer.prePrepareBulkLoad(this);<a name="line.1772"></a>
-<span class="sourceLineNo">1773</span>          }<a name="line.1773"></a>
-<span class="sourceLineNo">1774</span>        });<a name="line.1774"></a>
+<span class="sourceLineNo">1723</span>  public void preWALAppend(WALKey key, WALEdit edit) throws IOException {<a name="line.1723"></a>
+<span class="sourceLineNo">1724</span>    if (this.coprocEnvironments.isEmpty()){<a name="line.1724"></a>
+<span class="sourceLineNo">1725</span>      return;<a name="line.1725"></a>
+<span class="sourceLineNo">1726</span>    }<a name="line.1726"></a>
+<span class="sourceLineNo">1727</span>    execOperation(new RegionObserverOperationWithoutResult() {<a name="line.1727"></a>
+<span class="sourceLineNo">1728</span>      @Override<a name="line.1728"></a>
+<span class="sourceLineNo">1729</span>      public void call(RegionObserver observer) throws IOException {<a name="line.1729"></a>
+<span class="sourceLineNo">1730</span>        observer.preWALAppend(this, key, edit);<a name="line.1730"></a>
+<span class="sourceLineNo">1731</span>      }<a name="line.1731"></a>
+<span class="sourceLineNo">1732</span>    });<a name="line.1732"></a>
+<span class="sourceLineNo">1733</span>  }<a name="line.1733"></a>
+<span class="sourceLineNo">1734</span><a name="line.1734"></a>
+<span class="sourceLineNo">1735</span>  public Message preEndpointInvocation(final Service service, final String methodName,<a name="line.1735"></a>
+<span class="sourceLineNo">1736</span>      Message request) throws IOException {<a name="line.1736"></a>
+<span class="sourceLineNo">1737</span>    if (coprocEnvironments.isEmpty()) {<a name="line.1737"></a>
+<span class="sourceLineNo">1738</span>      return request;<a name="line.1738"></a>
+<span class="sourceLineNo">1739</span>    }<a name="line.1739"></a>
+<span class="sourceLineNo">1740</span>    return execOperationWithResult(new ObserverOperationWithResult&lt;EndpointObserver,<a name="line.1740"></a>
+<span class="sourceLineNo">1741</span>        Message&gt;(endpointObserverGetter, request) {<a name="line.1741"></a>
+<span class="sourceLineNo">1742</span>      @Override<a name="line.1742"></a>
+<span class="sourceLineNo">1743</span>      public Message call(EndpointObserver observer) throws IOException {<a name="line.1743"></a>
+<span class="sourceLineNo">1744</span>        return observer.preEndpointInvocation(this, service, methodName, getResult());<a name="line.1744"></a>
+<span class="sourceLineNo">1745</span>      }<a name="line.1745"></a>
+<span class="sourceLineNo">1746</span>    });<a name="line.1746"></a>
+<span class="sourceLineNo">1747</span>  }<a name="line.1747"></a>
+<span class="sourceLineNo">1748</span><a name="line.1748"></a>
+<span class="sourceLineNo">1749</span>  public void postEndpointInvocation(final Service service, final String methodName,<a name="line.1749"></a>
+<span class="sourceLineNo">1750</span>      final Message request, final Message.Builder responseBuilder) throws IOException {<a name="line.1750"></a>
+<span class="sourceLineNo">1751</span>    execOperation(coprocEnvironments.isEmpty() ? null :<a name="line.1751"></a>
+<span class="sourceLineNo">1752</span>        new ObserverOperationWithoutResult&lt;EndpointObserver&gt;(endpointObserverGetter) {<a name="line.1752"></a>
+<span class="sourceLineNo">1753</span>          @Override<a name="line.1753"></a>
+<span class="sourceLineNo">1754</span>          public void call(EndpointObserver observer) throws IOException {<a name="line.1754"></a>
+<span class="sourceLineNo">1755</span>            observer.postEndpointInvocation(this, service, methodName, request, responseBuilder);<a name="line.1755"></a>
+<span class="sourceLineNo">1756</span>          }<a name="line.1756"></a>
+<span class="sourceLineNo">1757</span>        });<a name="line.1757"></a>
+<span class="sourceLineNo">1758</span>  }<a name="line.1758"></a>
+<span class="sourceLineNo">1759</span><a name="line.1759"></a>
+<span class="sourceLineNo">1760</span>  /**<a name="line.1760"></a>
+<span class="sourceLineNo">1761</span>   * @deprecated Since 2.0 with out any replacement and will be removed in 3.0<a name="line.1761"></a>
+<span class="sourceLineNo">1762</span>   */<a name="line.1762"></a>
+<span class="sourceLineNo">1763</span>  @Deprecated<a name="line.1763"></a>
+<span class="sourceLineNo">1764</span>  public DeleteTracker postInstantiateDeleteTracker(DeleteTracker result) throws IOException {<a name="line.1764"></a>
+<span class="sourceLineNo">1765</span>    if (this.coprocEnvironments.isEmpty()) {<a name="line.1765"></a>
+<span class="sourceLineNo">1766</span>      return result;<a name="line.1766"></a>
+<span class="sourceLineNo">1767</span>    }<a name="line.1767"></a>
+<span class="sourceLineNo">1768</span>    return execOperationWithResult(new ObserverOperationWithResult&lt;RegionObserver, DeleteTracker&gt;(<a name="line.1768"></a>
+<span class="sourceLineNo">1769</span>        regionObserverGetter, result) {<a name="line.1769"></a>
+<span class="sourceLineNo">1770</span>      @Override<a name="line.1770"></a>
+<span class="sourceLineNo">1771</span>      public DeleteTracker call(RegionObserver observer) throws IOException {<a name="line.1771"></a>
+<span class="sourceLineNo">1772</span>        return observer.postInstantiateDeleteTracker(this, getResult());<a name="line.1772"></a>
+<span class="sourceLineNo">1773</span>      }<a name="line.1773"></a>
+<span class="sourceLineNo">1774</span>    });<a name="line.1774"></a>
 <span class="sourceLineNo">1775</span>  }<a name="line.1775"></a>
 <span class="sourceLineNo">1776</span><a name="line.1776"></a>
-<span class="sourceLineNo">1777</span>  public void preCleanupBulkLoad(User user) throws IOException {<a name="line.1777"></a>
-<span class="sourceLineNo">1778</span>    execOperation(coprocEnvironments.isEmpty() ? null :<a name="line.1778"></a>
-<span class="sourceLineNo">1779</span>        new BulkLoadObserverOperation(user) {<a name="line.1779"></a>
-<span class="sourceLineNo">1780</span>          @Override protected void call(BulkLoadObserver observer) throws IOException {<a name="line.1780"></a>
-<span class="sourceLineNo">1781</span>            observer.preCleanupBulkLoad(this);<a name="line.1781"></a>
-<span class="sourceLineNo">1782</span>          }<a name="line.1782"></a>
-<span class="sourceLineNo">1783</span>        });<a name="line.1783"></a>
-<span class="sourceLineNo">1784</span>  }<a name="line.1784"></a>
-<span class="sourceLineNo">1785</span>}<a name="line.1785"></a>
+<span class="sourceLineNo">1777</span>  /////////////////////////////////////////////////////////////////////////////////////////////////<a name="line.1777"></a>
+<span class="sourceLineNo">1778</span>  // BulkLoadObserver hooks<a name="line.1778"></a>
+<span class="sourceLineNo">1779</span>  /////////////////////////////////////////////////////////////////////////////////////////////////<a name="line.1779"></a>
+<span class="sourceLineNo">1780</span>  public void prePrepareBulkLoad(User user) throws IOException {<a name="line.1780"></a>
+<span class="sourceLineNo">1781</span>    execOperation(coprocEnvironments.isEmpty() ? null :<a name="line.1781"></a>
+<span class="sourceLineNo">1782</span>        new BulkLoadObserverOperation(user) {<a name="line.1782"></a>
+<span class="sourceLineNo">1783</span>          @Override protected void call(BulkLoadObserver observer) throws IOException {<a name="line.1783"></a>
+<span class="sourceLineNo">1784</span>            observer.prePrepareBulkLoad(this);<a name="line.1784"></a>
+<span class="sourceLineNo">1785</span>          }<a name="line.1785"></a>
+<span class="sourceLineNo">1786</span>        });<a name="line.1786"></a>
+<span class="sourceLineNo">1787</span>  }<a name="line.1787"></a>
+<span class="sourceLineNo">1788</span><a name="line.1788"></a>
+<span class="sourceLineNo">1789</span>  public void preCleanupBulkLoad(User user) throws IOException {<a name="line.1789"></a>
+<span class="sourceLineNo">1790</span>    execOperation(coprocEnvironments.isEmpty() ? null :<a name="line.1790"></a>
+<span class="sourceLineNo">1791</span>        new BulkLoadObserverOperation(user) {<a name="line.1791"></a>
+<span class="sourceLineNo">1792</span>          @Override protected void call(BulkLoadObserver observer) throws IOException {<a name="line.1792"></a>
+<span class="sourceLineNo">1793</span>            observer.preCleanupBulkLoad(this);<a name="line.1793"></a>
+<span class="sourceLineNo">1794</span>          }<a name="line.1794"></a>
+<span class="sourceLineNo">1795</span>        });<a name="line.1795"></a>
+<span class="sourceLineNo">1796</span>  }<a name="line.1796"></a>
+<span class="sourceLineNo">1797</span>}<a name="line.1797"></a>
 
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.TableCoprocessorAttribute.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.TableCoprocessorAttribute.html
index 04e8cb5..8bed22d 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.TableCoprocessorAttribute.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.TableCoprocessorAttribute.html
@@ -1728,69 +1728,81 @@
 <span class="sourceLineNo">1720</span>        });<a name="line.1720"></a>
 <span class="sourceLineNo">1721</span>  }<a name="line.1721"></a>
 <span class="sourceLineNo">1722</span><a name="line.1722"></a>
-<span class="sourceLineNo">1723</span>  public Message preEndpointInvocation(final Service service, final String methodName,<a name="line.1723"></a>
-<span class="sourceLineNo">1724</span>      Message request) throws IOException {<a name="line.1724"></a>
-<span class="sourceLineNo">1725</span>    if (coprocEnvironments.isEmpty()) {<a name="line.1725"></a>
-<span class="sourceLineNo">1726</span>      return request;<a name="line.1726"></a>
-<span class="sourceLineNo">1727</span>    }<a name="line.1727"></a>
-<span class="sourceLineNo">1728</span>    return execOperationWithResult(new ObserverOperationWithResult&lt;EndpointObserver,<a name="line.1728"></a>
-<span class="sourceLineNo">1729</span>        Message&gt;(endpointObserverGetter, request) {<a name="line.1729"></a>
-<span class="sourceLineNo">1730</span>      @Override<a name="line.1730"></a>
-<span class="sourceLineNo">1731</span>      public Message call(EndpointObserver observer) throws IOException {<a name="line.1731"></a>
-<span class="sourceLineNo">1732</span>        return observer.preEndpointInvocation(this, service, methodName, getResult());<a name="line.1732"></a>
-<span class="sourceLineNo">1733</span>      }<a name="line.1733"></a>
-<span class="sourceLineNo">1734</span>    });<a name="line.1734"></a>
-<span class="sourceLineNo">1735</span>  }<a name="line.1735"></a>
-<span class="sourceLineNo">1736</span><a name="line.1736"></a>
-<span class="sourceLineNo">1737</span>  public void postEndpointInvocation(final Service service, final String methodName,<a name="line.1737"></a>
-<span class="sourceLineNo">1738</span>      final Message request, final Message.Builder responseBuilder) throws IOException {<a name="line.1738"></a>
-<span class="sourceLineNo">1739</span>    execOperation(coprocEnvironments.isEmpty() ? null :<a name="line.1739"></a>
-<span class="sourceLineNo">1740</span>        new ObserverOperationWithoutResult&lt;EndpointObserver&gt;(endpointObserverGetter) {<a name="line.1740"></a>
-<span class="sourceLineNo">1741</span>          @Override<a name="line.1741"></a>
-<span class="sourceLineNo">1742</span>          public void call(EndpointObserver observer) throws IOException {<a name="line.1742"></a>
-<span class="sourceLineNo">1743</span>            observer.postEndpointInvocation(this, service, methodName, request, responseBuilder);<a name="line.1743"></a>
-<span class="sourceLineNo">1744</span>          }<a name="line.1744"></a>
-<span class="sourceLineNo">1745</span>        });<a name="line.1745"></a>
-<span class="sourceLineNo">1746</span>  }<a name="line.1746"></a>
-<span class="sourceLineNo">1747</span><a name="line.1747"></a>
-<span class="sourceLineNo">1748</span>  /**<a name="line.1748"></a>
-<span class="sourceLineNo">1749</span>   * @deprecated Since 2.0 with out any replacement and will be removed in 3.0<a name="line.1749"></a>
-<span class="sourceLineNo">1750</span>   */<a name="line.1750"></a>
-<span class="sourceLineNo">1751</span>  @Deprecated<a name="line.1751"></a>
-<span class="sourceLineNo">1752</span>  public DeleteTracker postInstantiateDeleteTracker(DeleteTracker result) throws IOException {<a name="line.1752"></a>
-<span class="sourceLineNo">1753</span>    if (this.coprocEnvironments.isEmpty()) {<a name="line.1753"></a>
-<span class="sourceLineNo">1754</span>      return result;<a name="line.1754"></a>
-<span class="sourceLineNo">1755</span>    }<a name="line.1755"></a>
-<span class="sourceLineNo">1756</span>    return execOperationWithResult(new ObserverOperationWithResult&lt;RegionObserver, DeleteTracker&gt;(<a name="line.1756"></a>
-<span class="sourceLineNo">1757</span>        regionObserverGetter, result) {<a name="line.1757"></a>
-<span class="sourceLineNo">1758</span>      @Override<a name="line.1758"></a>
-<span class="sourceLineNo">1759</span>      public DeleteTracker call(RegionObserver observer) throws IOException {<a name="line.1759"></a>
-<span class="sourceLineNo">1760</span>        return observer.postInstantiateDeleteTracker(this, getResult());<a name="line.1760"></a>
-<span class="sourceLineNo">1761</span>      }<a name="line.1761"></a>
-<span class="sourceLineNo">1762</span>    });<a name="line.1762"></a>
-<span class="sourceLineNo">1763</span>  }<a name="line.1763"></a>
-<span class="sourceLineNo">1764</span><a name="line.1764"></a>
-<span class="sourceLineNo">1765</span>  /////////////////////////////////////////////////////////////////////////////////////////////////<a name="line.1765"></a>
-<span class="sourceLineNo">1766</span>  // BulkLoadObserver hooks<a name="line.1766"></a>
-<span class="sourceLineNo">1767</span>  /////////////////////////////////////////////////////////////////////////////////////////////////<a name="line.1767"></a>
-<span class="sourceLineNo">1768</span>  public void prePrepareBulkLoad(User user) throws IOException {<a name="line.1768"></a>
-<span class="sourceLineNo">1769</span>    execOperation(coprocEnvironments.isEmpty() ? null :<a name="line.1769"></a>
-<span class="sourceLineNo">1770</span>        new BulkLoadObserverOperation(user) {<a name="line.1770"></a>
-<span class="sourceLineNo">1771</span>          @Override protected void call(BulkLoadObserver observer) throws IOException {<a name="line.1771"></a>
-<span class="sourceLineNo">1772</span>            observer.prePrepareBulkLoad(this);<a name="line.1772"></a>
-<span class="sourceLineNo">1773</span>          }<a name="line.1773"></a>
-<span class="sourceLineNo">1774</span>        });<a name="line.1774"></a>
+<span class="sourceLineNo">1723</span>  public void preWALAppend(WALKey key, WALEdit edit) throws IOException {<a name="line.1723"></a>
+<span class="sourceLineNo">1724</span>    if (this.coprocEnvironments.isEmpty()){<a name="line.1724"></a>
+<span class="sourceLineNo">1725</span>      return;<a name="line.1725"></a>
+<span class="sourceLineNo">1726</span>    }<a name="line.1726"></a>
+<span class="sourceLineNo">1727</span>    execOperation(new RegionObserverOperationWithoutResult() {<a name="line.1727"></a>
+<span class="sourceLineNo">1728</span>      @Override<a name="line.1728"></a>
+<span class="sourceLineNo">1729</span>      public void call(RegionObserver observer) throws IOException {<a name="line.1729"></a>
+<span class="sourceLineNo">1730</span>        observer.preWALAppend(this, key, edit);<a name="line.1730"></a>
+<span class="sourceLineNo">1731</span>      }<a name="line.1731"></a>
+<span class="sourceLineNo">1732</span>    });<a name="line.1732"></a>
+<span class="sourceLineNo">1733</span>  }<a name="line.1733"></a>
+<span class="sourceLineNo">1734</span><a name="line.1734"></a>
+<span class="sourceLineNo">1735</span>  public Message preEndpointInvocation(final Service service, final String methodName,<a name="line.1735"></a>
+<span class="sourceLineNo">1736</span>      Message request) throws IOException {<a name="line.1736"></a>
+<span class="sourceLineNo">1737</span>    if (coprocEnvironments.isEmpty()) {<a name="line.1737"></a>
+<span class="sourceLineNo">1738</span>      return request;<a name="line.1738"></a>
+<span class="sourceLineNo">1739</span>    }<a name="line.1739"></a>
+<span class="sourceLineNo">1740</span>    return execOperationWithResult(new ObserverOperationWithResult&lt;EndpointObserver,<a name="line.1740"></a>
+<span class="sourceLineNo">1741</span>        Message&gt;(endpointObserverGetter, request) {<a name="line.1741"></a>
+<span class="sourceLineNo">1742</span>      @Override<a name="line.1742"></a>
+<span class="sourceLineNo">1743</span>      public Message call(EndpointObserver observer) throws IOException {<a name="line.1743"></a>
+<span class="sourceLineNo">1744</span>        return observer.preEndpointInvocation(this, service, methodName, getResult());<a name="line.1744"></a>
+<span class="sourceLineNo">1745</span>      }<a name="line.1745"></a>
+<span class="sourceLineNo">1746</span>    });<a name="line.1746"></a>
+<span class="sourceLineNo">1747</span>  }<a name="line.1747"></a>
+<span class="sourceLineNo">1748</span><a name="line.1748"></a>
+<span class="sourceLineNo">1749</span>  public void postEndpointInvocation(final Service service, final String methodName,<a name="line.1749"></a>
+<span class="sourceLineNo">1750</span>      final Message request, final Message.Builder responseBuilder) throws IOException {<a name="line.1750"></a>
+<span class="sourceLineNo">1751</span>    execOperation(coprocEnvironments.isEmpty() ? null :<a name="line.1751"></a>
+<span class="sourceLineNo">1752</span>        new ObserverOperationWithoutResult&lt;EndpointObserver&gt;(endpointObserverGetter) {<a name="line.1752"></a>
+<span class="sourceLineNo">1753</span>          @Override<a name="line.1753"></a>
+<span class="sourceLineNo">1754</span>          public void call(EndpointObserver observer) throws IOException {<a name="line.1754"></a>
+<span class="sourceLineNo">1755</span>            observer.postEndpointInvocation(this, service, methodName, request, responseBuilder);<a name="line.1755"></a>
+<span class="sourceLineNo">1756</span>          }<a name="line.1756"></a>
+<span class="sourceLineNo">1757</span>        });<a name="line.1757"></a>
+<span class="sourceLineNo">1758</span>  }<a name="line.1758"></a>
+<span class="sourceLineNo">1759</span><a name="line.1759"></a>
+<span class="sourceLineNo">1760</span>  /**<a name="line.1760"></a>
+<span class="sourceLineNo">1761</span>   * @deprecated Since 2.0 with out any replacement and will be removed in 3.0<a name="line.1761"></a>
+<span class="sourceLineNo">1762</span>   */<a name="line.1762"></a>
+<span class="sourceLineNo">1763</span>  @Deprecated<a name="line.1763"></a>
+<span class="sourceLineNo">1764</span>  public DeleteTracker postInstantiateDeleteTracker(DeleteTracker result) throws IOException {<a name="line.1764"></a>
+<span class="sourceLineNo">1765</span>    if (this.coprocEnvironments.isEmpty()) {<a name="line.1765"></a>
+<span class="sourceLineNo">1766</span>      return result;<a name="line.1766"></a>
+<span class="sourceLineNo">1767</span>    }<a name="line.1767"></a>
+<span class="sourceLineNo">1768</span>    return execOperationWithResult(new ObserverOperationWithResult&lt;RegionObserver, DeleteTracker&gt;(<a name="line.1768"></a>
+<span class="sourceLineNo">1769</span>        regionObserverGetter, result) {<a name="line.1769"></a>
+<span class="sourceLineNo">1770</span>      @Override<a name="line.1770"></a>
+<span class="sourceLineNo">1771</span>      public DeleteTracker call(RegionObserver observer) throws IOException {<a name="line.1771"></a>
+<span class="sourceLineNo">1772</span>        return observer.postInstantiateDeleteTracker(this, getResult());<a name="line.1772"></a>
+<span class="sourceLineNo">1773</span>      }<a name="line.1773"></a>
+<span class="sourceLineNo">1774</span>    });<a name="line.1774"></a>
 <span class="sourceLineNo">1775</span>  }<a name="line.1775"></a>
 <span class="sourceLineNo">1776</span><a name="line.1776"></a>
-<span class="sourceLineNo">1777</span>  public void preCleanupBulkLoad(User user) throws IOException {<a name="line.1777"></a>
-<span class="sourceLineNo">1778</span>    execOperation(coprocEnvironments.isEmpty() ? null :<a name="line.1778"></a>
-<span class="sourceLineNo">1779</span>        new BulkLoadObserverOperation(user) {<a name="line.1779"></a>
-<span class="sourceLineNo">1780</span>          @Override protected void call(BulkLoadObserver observer) throws IOException {<a name="line.1780"></a>
-<span class="sourceLineNo">1781</span>            observer.preCleanupBulkLoad(this);<a name="line.1781"></a>
-<span class="sourceLineNo">1782</span>          }<a name="line.1782"></a>
-<span class="sourceLineNo">1783</span>        });<a name="line.1783"></a>
-<span class="sourceLineNo">1784</span>  }<a name="line.1784"></a>
-<span class="sourceLineNo">1785</span>}<a name="line.1785"></a>
+<span class="sourceLineNo">1777</span>  /////////////////////////////////////////////////////////////////////////////////////////////////<a name="line.1777"></a>
+<span class="sourceLineNo">1778</span>  // BulkLoadObserver hooks<a name="line.1778"></a>
+<span class="sourceLineNo">1779</span>  /////////////////////////////////////////////////////////////////////////////////////////////////<a name="line.1779"></a>
+<span class="sourceLineNo">1780</span>  public void prePrepareBulkLoad(User user) throws IOException {<a name="line.1780"></a>
+<span class="sourceLineNo">1781</span>    execOperation(coprocEnvironments.isEmpty() ? null :<a name="line.1781"></a>
+<span class="sourceLineNo">1782</span>        new BulkLoadObserverOperation(user) {<a name="line.1782"></a>
+<span class="sourceLineNo">1783</span>          @Override protected void call(BulkLoadObserver observer) throws IOException {<a name="line.1783"></a>
+<span class="sourceLineNo">1784</span>            observer.prePrepareBulkLoad(this);<a name="line.1784"></a>
+<span class="sourceLineNo">1785</span>          }<a name="line.1785"></a>
+<span class="sourceLineNo">1786</span>        });<a name="line.1786"></a>
+<span class="sourceLineNo">1787</span>  }<a name="line.1787"></a>
+<span class="sourceLineNo">1788</span><a name="line.1788"></a>
+<span class="sourceLineNo">1789</span>  public void preCleanupBulkLoad(User user) throws IOException {<a name="line.1789"></a>
+<span class="sourceLineNo">1790</span>    execOperation(coprocEnvironments.isEmpty() ? null :<a name="line.1790"></a>
+<span class="sourceLineNo">1791</span>        new BulkLoadObserverOperation(user) {<a name="line.1791"></a>
+<span class="sourceLineNo">1792</span>          @Override protected void call(BulkLoadObserver observer) throws IOException {<a name="line.1792"></a>
+<span class="sourceLineNo">1793</span>            observer.preCleanupBulkLoad(this);<a name="line.1793"></a>
+<span class="sourceLineNo">1794</span>          }<a name="line.1794"></a>
+<span class="sourceLineNo">1795</span>        });<a name="line.1795"></a>
+<span class="sourceLineNo">1796</span>  }<a name="line.1796"></a>
+<span class="sourceLineNo">1797</span>}<a name="line.1797"></a>
 
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.html
index 04e8cb5..8bed22d 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.html
@@ -1728,69 +1728,81 @@
 <span class="sourceLineNo">1720</span>        });<a name="line.1720"></a>
 <span class="sourceLineNo">1721</span>  }<a name="line.1721"></a>
 <span class="sourceLineNo">1722</span><a name="line.1722"></a>
-<span class="sourceLineNo">1723</span>  public Message preEndpointInvocation(final Service service, final String methodName,<a name="line.1723"></a>
-<span class="sourceLineNo">1724</span>      Message request) throws IOException {<a name="line.1724"></a>
-<span class="sourceLineNo">1725</span>    if (coprocEnvironments.isEmpty()) {<a name="line.1725"></a>
-<span class="sourceLineNo">1726</span>      return request;<a name="line.1726"></a>
-<span class="sourceLineNo">1727</span>    }<a name="line.1727"></a>
-<span class="sourceLineNo">1728</span>    return execOperationWithResult(new ObserverOperationWithResult&lt;EndpointObserver,<a name="line.1728"></a>
-<span class="sourceLineNo">1729</span>        Message&gt;(endpointObserverGetter, request) {<a name="line.1729"></a>
-<span class="sourceLineNo">1730</span>      @Override<a name="line.1730"></a>
-<span class="sourceLineNo">1731</span>      public Message call(EndpointObserver observer) throws IOException {<a name="line.1731"></a>
-<span class="sourceLineNo">1732</span>        return observer.preEndpointInvocation(this, service, methodName, getResult());<a name="line.1732"></a>
-<span class="sourceLineNo">1733</span>      }<a name="line.1733"></a>
-<span class="sourceLineNo">1734</span>    });<a name="line.1734"></a>
-<span class="sourceLineNo">1735</span>  }<a name="line.1735"></a>
-<span class="sourceLineNo">1736</span><a name="line.1736"></a>
-<span class="sourceLineNo">1737</span>  public void postEndpointInvocation(final Service service, final String methodName,<a name="line.1737"></a>
-<span class="sourceLineNo">1738</span>      final Message request, final Message.Builder responseBuilder) throws IOException {<a name="line.1738"></a>
-<span class="sourceLineNo">1739</span>    execOperation(coprocEnvironments.isEmpty() ? null :<a name="line.1739"></a>
-<span class="sourceLineNo">1740</span>        new ObserverOperationWithoutResult&lt;EndpointObserver&gt;(endpointObserverGetter) {<a name="line.1740"></a>
-<span class="sourceLineNo">1741</span>          @Override<a name="line.1741"></a>
-<span class="sourceLineNo">1742</span>          public void call(EndpointObserver observer) throws IOException {<a name="line.1742"></a>
-<span class="sourceLineNo">1743</span>            observer.postEndpointInvocation(this, service, methodName, request, responseBuilder);<a name="line.1743"></a>
-<span class="sourceLineNo">1744</span>          }<a name="line.1744"></a>
-<span class="sourceLineNo">1745</span>        });<a name="line.1745"></a>
-<span class="sourceLineNo">1746</span>  }<a name="line.1746"></a>
-<span class="sourceLineNo">1747</span><a name="line.1747"></a>
-<span class="sourceLineNo">1748</span>  /**<a name="line.1748"></a>
-<span class="sourceLineNo">1749</span>   * @deprecated Since 2.0 with out any replacement and will be removed in 3.0<a name="line.1749"></a>
-<span class="sourceLineNo">1750</span>   */<a name="line.1750"></a>
-<span class="sourceLineNo">1751</span>  @Deprecated<a name="line.1751"></a>
-<span class="sourceLineNo">1752</span>  public DeleteTracker postInstantiateDeleteTracker(DeleteTracker result) throws IOException {<a name="line.1752"></a>
-<span class="sourceLineNo">1753</span>    if (this.coprocEnvironments.isEmpty()) {<a name="line.1753"></a>
-<span class="sourceLineNo">1754</span>      return result;<a name="line.1754"></a>
-<span class="sourceLineNo">1755</span>    }<a name="line.1755"></a>
-<span class="sourceLineNo">1756</span>    return execOperationWithResult(new ObserverOperationWithResult&lt;RegionObserver, DeleteTracker&gt;(<a name="line.1756"></a>
-<span class="sourceLineNo">1757</span>        regionObserverGetter, result) {<a name="line.1757"></a>
-<span class="sourceLineNo">1758</span>      @Override<a name="line.1758"></a>
-<span class="sourceLineNo">1759</span>      public DeleteTracker call(RegionObserver observer) throws IOException {<a name="line.1759"></a>
-<span class="sourceLineNo">1760</span>        return observer.postInstantiateDeleteTracker(this, getResult());<a name="line.1760"></a>
-<span class="sourceLineNo">1761</span>      }<a name="line.1761"></a>
-<span class="sourceLineNo">1762</span>    });<a name="line.1762"></a>
-<span class="sourceLineNo">1763</span>  }<a name="line.1763"></a>
-<span class="sourceLineNo">1764</span><a name="line.1764"></a>
-<span class="sourceLineNo">1765</span>  /////////////////////////////////////////////////////////////////////////////////////////////////<a name="line.1765"></a>
-<span class="sourceLineNo">1766</span>  // BulkLoadObserver hooks<a name="line.1766"></a>
-<span class="sourceLineNo">1767</span>  /////////////////////////////////////////////////////////////////////////////////////////////////<a name="line.1767"></a>
-<span class="sourceLineNo">1768</span>  public void prePrepareBulkLoad(User user) throws IOException {<a name="line.1768"></a>
-<span class="sourceLineNo">1769</span>    execOperation(coprocEnvironments.isEmpty() ? null :<a name="line.1769"></a>
-<span class="sourceLineNo">1770</span>        new BulkLoadObserverOperation(user) {<a name="line.1770"></a>
-<span class="sourceLineNo">1771</span>          @Override protected void call(BulkLoadObserver observer) throws IOException {<a name="line.1771"></a>
-<span class="sourceLineNo">1772</span>            observer.prePrepareBulkLoad(this);<a name="line.1772"></a>
-<span class="sourceLineNo">1773</span>          }<a name="line.1773"></a>
-<span class="sourceLineNo">1774</span>        });<a name="line.1774"></a>
+<span class="sourceLineNo">1723</span>  public void preWALAppend(WALKey key, WALEdit edit) throws IOException {<a name="line.1723"></a>
+<span class="sourceLineNo">1724</span>    if (this.coprocEnvironments.isEmpty()){<a name="line.1724"></a>
+<span class="sourceLineNo">1725</span>      return;<a name="line.1725"></a>
+<span class="sourceLineNo">1726</span>    }<a name="line.1726"></a>
+<span class="sourceLineNo">1727</span>    execOperation(new RegionObserverOperationWithoutResult() {<a name="line.1727"></a>
+<span class="sourceLineNo">1728</span>      @Override<a name="line.1728"></a>
+<span class="sourceLineNo">1729</span>      public void call(RegionObserver observer) throws IOException {<a name="line.1729"></a>
+<span class="sourceLineNo">1730</span>        observer.preWALAppend(this, key, edit);<a name="line.1730"></a>
+<span class="sourceLineNo">1731</span>      }<a name="line.1731"></a>
+<span class="sourceLineNo">1732</span>    });<a name="line.1732"></a>
+<span class="sourceLineNo">1733</span>  }<a name="line.1733"></a>
+<span class="sourceLineNo">1734</span><a name="line.1734"></a>
+<span class="sourceLineNo">1735</span>  public Message preEndpointInvocation(final Service service, final String methodName,<a name="line.1735"></a>
+<span class="sourceLineNo">1736</span>      Message request) throws IOException {<a name="line.1736"></a>
+<span class="sourceLineNo">1737</span>    if (coprocEnvironments.isEmpty()) {<a name="line.1737"></a>
+<span class="sourceLineNo">1738</span>      return request;<a name="line.1738"></a>
+<span class="sourceLineNo">1739</span>    }<a name="line.1739"></a>
+<span class="sourceLineNo">1740</span>    return execOperationWithResult(new ObserverOperationWithResult&lt;EndpointObserver,<a name="line.1740"></a>
+<span class="sourceLineNo">1741</span>        Message&gt;(endpointObserverGetter, request) {<a name="line.1741"></a>
+<span class="sourceLineNo">1742</span>      @Override<a name="line.1742"></a>
+<span class="sourceLineNo">1743</span>      public Message call(EndpointObserver observer) throws IOException {<a name="line.1743"></a>
+<span class="sourceLineNo">1744</span>        return observer.preEndpointInvocation(this, service, methodName, getResult());<a name="line.1744"></a>
+<span class="sourceLineNo">1745</span>      }<a name="line.1745"></a>
+<span class="sourceLineNo">1746</span>    });<a name="line.1746"></a>
+<span class="sourceLineNo">1747</span>  }<a name="line.1747"></a>
+<span class="sourceLineNo">1748</span><a name="line.1748"></a>
+<span class="sourceLineNo">1749</span>  public void postEndpointInvocation(final Service service, final String methodName,<a name="line.1749"></a>
+<span class="sourceLineNo">1750</span>      final Message request, final Message.Builder responseBuilder) throws IOException {<a name="line.1750"></a>
+<span class="sourceLineNo">1751</span>    execOperation(coprocEnvironments.isEmpty() ? null :<a name="line.1751"></a>
+<span class="sourceLineNo">1752</span>        new ObserverOperationWithoutResult&lt;EndpointObserver&gt;(endpointObserverGetter) {<a name="line.1752"></a>
+<span class="sourceLineNo">1753</span>          @Override<a name="line.1753"></a>
+<span class="sourceLineNo">1754</span>          public void call(EndpointObserver observer) throws IOException {<a name="line.1754"></a>
+<span class="sourceLineNo">1755</span>            observer.postEndpointInvocation(this, service, methodName, request, responseBuilder);<a name="line.1755"></a>
+<span class="sourceLineNo">1756</span>          }<a name="line.1756"></a>
+<span class="sourceLineNo">1757</span>        });<a name="line.1757"></a>
+<span class="sourceLineNo">1758</span>  }<a name="line.1758"></a>
+<span class="sourceLineNo">1759</span><a name="line.1759"></a>
+<span class="sourceLineNo">1760</span>  /**<a name="line.1760"></a>
+<span class="sourceLineNo">1761</span>   * @deprecated Since 2.0 with out any replacement and will be removed in 3.0<a name="line.1761"></a>
+<span class="sourceLineNo">1762</span>   */<a name="line.1762"></a>
+<span class="sourceLineNo">1763</span>  @Deprecated<a name="line.1763"></a>
+<span class="sourceLineNo">1764</span>  public DeleteTracker postInstantiateDeleteTracker(DeleteTracker result) throws IOException {<a name="line.1764"></a>
+<span class="sourceLineNo">1765</span>    if (this.coprocEnvironments.isEmpty()) {<a name="line.1765"></a>
+<span class="sourceLineNo">1766</span>      return result;<a name="line.1766"></a>
+<span class="sourceLineNo">1767</span>    }<a name="line.1767"></a>
+<span class="sourceLineNo">1768</span>    return execOperationWithResult(new ObserverOperationWithResult&lt;RegionObserver, DeleteTracker&gt;(<a name="line.1768"></a>
+<span class="sourceLineNo">1769</span>        regionObserverGetter, result) {<a name="line.1769"></a>
+<span class="sourceLineNo">1770</span>      @Override<a name="line.1770"></a>
+<span class="sourceLineNo">1771</span>      public DeleteTracker call(RegionObserver observer) throws IOException {<a name="line.1771"></a>
+<span class="sourceLineNo">1772</span>        return observer.postInstantiateDeleteTracker(this, getResult());<a name="line.1772"></a>
+<span class="sourceLineNo">1773</span>      }<a name="line.1773"></a>
+<span class="sourceLineNo">1774</span>    });<a name="line.1774"></a>
 <span class="sourceLineNo">1775</span>  }<a name="line.1775"></a>
 <span class="sourceLineNo">1776</span><a name="line.1776"></a>
-<span class="sourceLineNo">1777</span>  public void preCleanupBulkLoad(User user) throws IOException {<a name="line.1777"></a>
-<span class="sourceLineNo">1778</span>    execOperation(coprocEnvironments.isEmpty() ? null :<a name="line.1778"></a>
-<span class="sourceLineNo">1779</span>        new BulkLoadObserverOperation(user) {<a name="line.1779"></a>
-<span class="sourceLineNo">1780</span>          @Override protected void call(BulkLoadObserver observer) throws IOException {<a name="line.1780"></a>
-<span class="sourceLineNo">1781</span>            observer.preCleanupBulkLoad(this);<a name="line.1781"></a>
-<span class="sourceLineNo">1782</span>          }<a name="line.1782"></a>
-<span class="sourceLineNo">1783</span>        });<a name="line.1783"></a>
-<span class="sourceLineNo">1784</span>  }<a name="line.1784"></a>
-<span class="sourceLineNo">1785</span>}<a name="line.1785"></a>
+<span class="sourceLineNo">1777</span>  /////////////////////////////////////////////////////////////////////////////////////////////////<a name="line.1777"></a>
+<span class="sourceLineNo">1778</span>  // BulkLoadObserver hooks<a name="line.1778"></a>
+<span class="sourceLineNo">1779</span>  /////////////////////////////////////////////////////////////////////////////////////////////////<a name="line.1779"></a>
+<span class="sourceLineNo">1780</span>  public void prePrepareBulkLoad(User user) throws IOException {<a name="line.1780"></a>
+<span class="sourceLineNo">1781</span>    execOperation(coprocEnvironments.isEmpty() ? null :<a name="line.1781"></a>
+<span class="sourceLineNo">1782</span>        new BulkLoadObserverOperation(user) {<a name="line.1782"></a>
+<span class="sourceLineNo">1783</span>          @Override protected void call(BulkLoadObserver observer) throws IOException {<a name="line.1783"></a>
+<span class="sourceLineNo">1784</span>            observer.prePrepareBulkLoad(this);<a name="line.1784"></a>
+<span class="sourceLineNo">1785</span>          }<a name="line.1785"></a>
+<span class="sourceLineNo">1786</span>        });<a name="line.1786"></a>
+<span class="sourceLineNo">1787</span>  }<a name="line.1787"></a>
+<span class="sourceLineNo">1788</span><a name="line.1788"></a>
+<span class="sourceLineNo">1789</span>  public void preCleanupBulkLoad(User user) throws IOException {<a name="line.1789"></a>
+<span class="sourceLineNo">1790</span>    execOperation(coprocEnvironments.isEmpty() ? null :<a name="line.1790"></a>
+<span class="sourceLineNo">1791</span>        new BulkLoadObserverOperation(user) {<a name="line.1791"></a>
+<span class="sourceLineNo">1792</span>          @Override protected void call(BulkLoadObserver observer) throws IOException {<a name="line.1792"></a>
+<span class="sourceLineNo">1793</span>            observer.preCleanupBulkLoad(this);<a name="line.1793"></a>
+<span class="sourceLineNo">1794</span>          }<a name="line.1794"></a>
+<span class="sourceLineNo">1795</span>        });<a name="line.1795"></a>
+<span class="sourceLineNo">1796</span>  }<a name="line.1796"></a>
+<span class="sourceLineNo">1797</span>}<a name="line.1797"></a>
 
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/wal/WALKey.html b/devapidocs/src-html/org/apache/hadoop/hbase/wal/WALKey.html
index 8f13a7f..69f07e0 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/wal/WALKey.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/wal/WALKey.html
@@ -42,94 +42,100 @@
 <span class="sourceLineNo">034</span><a name="line.34"></a>
 <span class="sourceLineNo">035</span>/**<a name="line.35"></a>
 <span class="sourceLineNo">036</span> * Key for WAL Entry.<a name="line.36"></a>
-<span class="sourceLineNo">037</span> * Read-only. No Setters. For limited audience such as Coprocessors.<a name="line.37"></a>
-<span class="sourceLineNo">038</span> */<a name="line.38"></a>
-<span class="sourceLineNo">039</span>@InterfaceAudience.LimitedPrivate({HBaseInterfaceAudience.REPLICATION,<a name="line.39"></a>
-<span class="sourceLineNo">040</span>    HBaseInterfaceAudience.COPROC})<a name="line.40"></a>
-<span class="sourceLineNo">041</span>public interface WALKey extends SequenceId, Comparable&lt;WALKey&gt; {<a name="line.41"></a>
-<span class="sourceLineNo">042</span>  /**<a name="line.42"></a>
-<span class="sourceLineNo">043</span>   * Unmodifiable empty list of UUIDs.<a name="line.43"></a>
-<span class="sourceLineNo">044</span>   */<a name="line.44"></a>
-<span class="sourceLineNo">045</span>  List&lt;UUID&gt; EMPTY_UUIDS = Collections.unmodifiableList(new ArrayList&lt;UUID&gt;());<a name="line.45"></a>
-<span class="sourceLineNo">046</span><a name="line.46"></a>
-<span class="sourceLineNo">047</span>  default long estimatedSerializedSizeOf() {<a name="line.47"></a>
-<span class="sourceLineNo">048</span>    return 0;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>  }<a name="line.49"></a>
-<span class="sourceLineNo">050</span><a name="line.50"></a>
-<span class="sourceLineNo">051</span>  /**<a name="line.51"></a>
-<span class="sourceLineNo">052</span>   * @return encoded region name<a name="line.52"></a>
-<span class="sourceLineNo">053</span>   */<a name="line.53"></a>
-<span class="sourceLineNo">054</span>  byte[] getEncodedRegionName();<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>   * @return table name<a name="line.57"></a>
-<span class="sourceLineNo">058</span>   */<a name="line.58"></a>
-<span class="sourceLineNo">059</span>  TableName getTableName();<a name="line.59"></a>
-<span class="sourceLineNo">060</span><a name="line.60"></a>
-<span class="sourceLineNo">061</span>  /**<a name="line.61"></a>
-<span class="sourceLineNo">062</span>   * @return the write time<a name="line.62"></a>
-<span class="sourceLineNo">063</span>   */<a name="line.63"></a>
-<span class="sourceLineNo">064</span>  long getWriteTime();<a name="line.64"></a>
-<span class="sourceLineNo">065</span><a name="line.65"></a>
-<span class="sourceLineNo">066</span>  /**<a name="line.66"></a>
-<span class="sourceLineNo">067</span>   * @return The nonce group<a name="line.67"></a>
-<span class="sourceLineNo">068</span>   */<a name="line.68"></a>
-<span class="sourceLineNo">069</span>  default long getNonceGroup() {<a name="line.69"></a>
-<span class="sourceLineNo">070</span>    return HConstants.NO_NONCE;<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>  /**<a name="line.73"></a>
-<span class="sourceLineNo">074</span>   * @return The nonce<a name="line.74"></a>
-<span class="sourceLineNo">075</span>   */<a name="line.75"></a>
-<span class="sourceLineNo">076</span>  default long getNonce() {<a name="line.76"></a>
-<span class="sourceLineNo">077</span>    return HConstants.NO_NONCE;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>  }<a name="line.78"></a>
-<span class="sourceLineNo">079</span><a name="line.79"></a>
-<span class="sourceLineNo">080</span>  UUID getOriginatingClusterId();<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>   * Return a positive long if current WALKeyImpl is created from a replay edit; a replay edit is an<a name="line.83"></a>
-<span class="sourceLineNo">084</span>   * edit that came in when replaying WALs of a crashed server.<a name="line.84"></a>
-<span class="sourceLineNo">085</span>   * @return original sequence number of the WALEdit<a name="line.85"></a>
-<span class="sourceLineNo">086</span>   */<a name="line.86"></a>
-<span class="sourceLineNo">087</span>  long getOrigLogSeqNum();<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>     * Return a named String value injected into the WALKey during processing, such as by a<a name="line.90"></a>
-<span class="sourceLineNo">091</span>     * coprocessor<a name="line.91"></a>
-<span class="sourceLineNo">092</span>     * @param attributeKey The key of a key / value pair<a name="line.92"></a>
-<span class="sourceLineNo">093</span>     */<a name="line.93"></a>
-<span class="sourceLineNo">094</span>  default byte[] getExtendedAttribute(String attributeKey){<a name="line.94"></a>
-<span class="sourceLineNo">095</span>    return null;<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>     * Returns a map of all extended attributes injected into this WAL key.<a name="line.99"></a>
-<span class="sourceLineNo">100</span>     */<a name="line.100"></a>
-<span class="sourceLineNo">101</span>  default Map&lt;String, byte[]&gt; getExtendedAttributes() {<a name="line.101"></a>
-<span class="sourceLineNo">102</span>    return new HashMap&lt;&gt;();<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>   * Produces a string map for this key. Useful for programmatic use and<a name="line.105"></a>
-<span class="sourceLineNo">106</span>   * manipulation of the data stored in an WALKeyImpl, for example, printing<a name="line.106"></a>
-<span class="sourceLineNo">107</span>   * as JSON.<a name="line.107"></a>
-<span class="sourceLineNo">108</span>   *<a name="line.108"></a>
-<span class="sourceLineNo">109</span>   * @return a Map containing data from this key<a name="line.109"></a>
-<span class="sourceLineNo">110</span>   */<a name="line.110"></a>
-<span class="sourceLineNo">111</span>  default Map&lt;String, Object&gt; toStringMap() {<a name="line.111"></a>
-<span class="sourceLineNo">112</span>    Map&lt;String, Object&gt; stringMap = new HashMap&lt;&gt;();<a name="line.112"></a>
-<span class="sourceLineNo">113</span>    stringMap.put("table", getTableName());<a name="line.113"></a>
-<span class="sourceLineNo">114</span>    stringMap.put("region", Bytes.toStringBinary(getEncodedRegionName()));<a name="line.114"></a>
-<span class="sourceLineNo">115</span>    stringMap.put("sequence", getSequenceId());<a name="line.115"></a>
-<span class="sourceLineNo">116</span>    Map&lt;String, byte[]&gt; extendedAttributes = getExtendedAttributes();<a name="line.116"></a>
-<span class="sourceLineNo">117</span>    if (extendedAttributes != null){<a name="line.117"></a>
-<span class="sourceLineNo">118</span>      for (Map.Entry&lt;String, byte[]&gt; entry : extendedAttributes.entrySet()){<a name="line.118"></a>
-<span class="sourceLineNo">119</span>        stringMap.put(entry.getKey(), Bytes.toStringBinary(entry.getValue()));<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>    return stringMap;<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">037</span> */<a name="line.37"></a>
+<span class="sourceLineNo">038</span>@InterfaceAudience.LimitedPrivate({HBaseInterfaceAudience.REPLICATION,<a name="line.38"></a>
+<span class="sourceLineNo">039</span>    HBaseInterfaceAudience.COPROC})<a name="line.39"></a>
+<span class="sourceLineNo">040</span>public interface WALKey extends SequenceId, Comparable&lt;WALKey&gt; {<a name="line.40"></a>
+<span class="sourceLineNo">041</span>  /**<a name="line.41"></a>
+<span class="sourceLineNo">042</span>   * Unmodifiable empty list of UUIDs.<a name="line.42"></a>
+<span class="sourceLineNo">043</span>   */<a name="line.43"></a>
+<span class="sourceLineNo">044</span>  List&lt;UUID&gt; EMPTY_UUIDS = Collections.unmodifiableList(new ArrayList&lt;UUID&gt;());<a name="line.44"></a>
+<span class="sourceLineNo">045</span><a name="line.45"></a>
+<span class="sourceLineNo">046</span>  default long estimatedSerializedSizeOf() {<a name="line.46"></a>
+<span class="sourceLineNo">047</span>    return 0;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>  }<a name="line.48"></a>
+<span class="sourceLineNo">049</span><a name="line.49"></a>
+<span class="sourceLineNo">050</span>  /**<a name="line.50"></a>
+<span class="sourceLineNo">051</span>   * @return encoded region name<a name="line.51"></a>
+<span class="sourceLineNo">052</span>   */<a name="line.52"></a>
+<span class="sourceLineNo">053</span>  byte[] getEncodedRegionName();<a name="line.53"></a>
+<span class="sourceLineNo">054</span><a name="line.54"></a>
+<span class="sourceLineNo">055</span>  /**<a name="line.55"></a>
+<span class="sourceLineNo">056</span>   * @return table name<a name="line.56"></a>
+<span class="sourceLineNo">057</span>   */<a name="line.57"></a>
+<span class="sourceLineNo">058</span>  TableName getTableName();<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>   * @return the write time<a name="line.61"></a>
+<span class="sourceLineNo">062</span>   */<a name="line.62"></a>
+<span class="sourceLineNo">063</span>  long getWriteTime();<a name="line.63"></a>
+<span class="sourceLineNo">064</span><a name="line.64"></a>
+<span class="sourceLineNo">065</span>  /**<a name="line.65"></a>
+<span class="sourceLineNo">066</span>   * @return The nonce group<a name="line.66"></a>
+<span class="sourceLineNo">067</span>   */<a name="line.67"></a>
+<span class="sourceLineNo">068</span>  default long getNonceGroup() {<a name="line.68"></a>
+<span class="sourceLineNo">069</span>    return HConstants.NO_NONCE;<a name="line.69"></a>
+<span class="sourceLineNo">070</span>  }<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>   * @return The nonce<a name="line.73"></a>
+<span class="sourceLineNo">074</span>   */<a name="line.74"></a>
+<span class="sourceLineNo">075</span>  default long getNonce() {<a name="line.75"></a>
+<span class="sourceLineNo">076</span>    return HConstants.NO_NONCE;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>  }<a name="line.77"></a>
+<span class="sourceLineNo">078</span><a name="line.78"></a>
+<span class="sourceLineNo">079</span>  UUID getOriginatingClusterId();<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>   * Return a positive long if current WALKeyImpl is created from a replay edit; a replay edit is an<a name="line.82"></a>
+<span class="sourceLineNo">083</span>   * edit that came in when replaying WALs of a crashed server.<a name="line.83"></a>
+<span class="sourceLineNo">084</span>   * @return original sequence number of the WALEdit<a name="line.84"></a>
+<span class="sourceLineNo">085</span>   */<a name="line.85"></a>
+<span class="sourceLineNo">086</span>  long getOrigLogSeqNum();<a name="line.86"></a>
+<span class="sourceLineNo">087</span><a name="line.87"></a>
+<span class="sourceLineNo">088</span>  /**<a name="line.88"></a>
+<span class="sourceLineNo">089</span>   * Add a named String value to this WALKey to be persisted into the WAL<a name="line.89"></a>
+<span class="sourceLineNo">090</span>   * @param attributeKey Name of the attribute<a name="line.90"></a>
+<span class="sourceLineNo">091</span>   * @param attributeValue Value of the attribute<a name="line.91"></a>
+<span class="sourceLineNo">092</span>   */<a name="line.92"></a>
+<span class="sourceLineNo">093</span>  void addExtendedAttribute(String attributeKey, byte[] attributeValue);<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>     * Return a named String value injected into the WALKey during processing, such as by a<a name="line.96"></a>
+<span class="sourceLineNo">097</span>     * coprocessor<a name="line.97"></a>
+<span class="sourceLineNo">098</span>     * @param attributeKey The key of a key / value pair<a name="line.98"></a>
+<span class="sourceLineNo">099</span>     */<a name="line.99"></a>
+<span class="sourceLineNo">100</span>  default byte[] getExtendedAttribute(String attributeKey){<a name="line.100"></a>
+<span class="sourceLineNo">101</span>    return null;<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>     * Returns a map of all extended attributes injected into this WAL key.<a name="line.105"></a>
+<span class="sourceLineNo">106</span>     */<a name="line.106"></a>
+<span class="sourceLineNo">107</span>  default Map&lt;String, byte[]&gt; getExtendedAttributes() {<a name="line.107"></a>
+<span class="sourceLineNo">108</span>    return new HashMap&lt;&gt;();<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>   * Produces a string map for this key. Useful for programmatic use and<a name="line.111"></a>
+<span class="sourceLineNo">112</span>   * manipulation of the data stored in an WALKeyImpl, for example, printing<a name="line.112"></a>
+<span class="sourceLineNo">113</span>   * as JSON.<a name="line.113"></a>
+<span class="sourceLineNo">114</span>   *<a name="line.114"></a>
+<span class="sourceLineNo">115</span>   * @return a Map containing data from this key<a name="line.115"></a>
+<span class="sourceLineNo">116</span>   */<a name="line.116"></a>
+<span class="sourceLineNo">117</span>  default Map&lt;String, Object&gt; toStringMap() {<a name="line.117"></a>
+<span class="sourceLineNo">118</span>    Map&lt;String, Object&gt; stringMap = new HashMap&lt;&gt;();<a name="line.118"></a>
+<span class="sourceLineNo">119</span>    stringMap.put("table", getTableName());<a name="line.119"></a>
+<span class="sourceLineNo">120</span>    stringMap.put("region", Bytes.toStringBinary(getEncodedRegionName()));<a name="line.120"></a>
+<span class="sourceLineNo">121</span>    stringMap.put("sequence", getSequenceId());<a name="line.121"></a>
+<span class="sourceLineNo">122</span>    Map&lt;String, byte[]&gt; extendedAttributes = getExtendedAttributes();<a name="line.122"></a>
+<span class="sourceLineNo">123</span>    if (extendedAttributes != null){<a name="line.123"></a>
+<span class="sourceLineNo">124</span>      for (Map.Entry&lt;String, byte[]&gt; entry : extendedAttributes.entrySet()){<a name="line.124"></a>
+<span class="sourceLineNo">125</span>        stringMap.put(entry.getKey(), Bytes.toStringBinary(entry.getValue()));<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>    return stringMap;<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>
 
 
 
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/wal/WALKeyImpl.html b/devapidocs/src-html/org/apache/hadoop/hbase/wal/WALKeyImpl.html
index 531ee51..30de3ab 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/wal/WALKeyImpl.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/wal/WALKeyImpl.html
@@ -204,469 +204,508 @@
 <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>  /**<a name="line.198"></a>
-<span class="sourceLineNo">199</span>   * Create the log key for writing to somewhere.<a name="line.199"></a>
-<span class="sourceLineNo">200</span>   * We maintain the tablename mainly for debugging purposes.<a name="line.200"></a>
-<span class="sourceLineNo">201</span>   * A regionName is always a sub-table object.<a name="line.201"></a>
-<span class="sourceLineNo">202</span>   * &lt;p&gt;Used by log splitting and snapshots.<a name="line.202"></a>
-<span class="sourceLineNo">203</span>   *<a name="line.203"></a>
-<span class="sourceLineNo">204</span>   * @param encodedRegionName Encoded name of the region as returned by<a name="line.204"></a>
-<span class="sourceLineNo">205</span>   *                         &lt;code&gt;HRegionInfo#getEncodedNameAsBytes()&lt;/code&gt;.<a name="line.205"></a>
-<span class="sourceLineNo">206</span>   * @param tablename         - name of table<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   * @param logSeqNum         - log sequence number<a name="line.207"></a>
-<span class="sourceLineNo">208</span>   * @param now               Time at which this edit was written.<a name="line.208"></a>
-<span class="sourceLineNo">209</span>   * @param clusterIds        the clusters that have consumed the change(used in Replication)<a name="line.209"></a>
-<span class="sourceLineNo">210</span>   * @param nonceGroup        the nonceGroup<a name="line.210"></a>
-<span class="sourceLineNo">211</span>   * @param nonce             the nonce<a name="line.211"></a>
-<span class="sourceLineNo">212</span>   * @param mvcc              the mvcc associate the WALKeyImpl<a name="line.212"></a>
-<span class="sourceLineNo">213</span>   * @param replicationScope  the non-default replication scope<a name="line.213"></a>
-<span class="sourceLineNo">214</span>   *                          associated with the region's column families<a name="line.214"></a>
-<span class="sourceLineNo">215</span>   */<a name="line.215"></a>
-<span class="sourceLineNo">216</span>  // TODO: Fix being able to pass in sequenceid.<a name="line.216"></a>
-<span class="sourceLineNo">217</span>  public WALKeyImpl(final byte[] encodedRegionName, final TableName tablename, long logSeqNum,<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      final long now, List&lt;UUID&gt; clusterIds, long nonceGroup, long nonce,<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      MultiVersionConcurrencyControl mvcc, final NavigableMap&lt;byte[], Integer&gt; replicationScope) {<a name="line.219"></a>
-<span class="sourceLineNo">220</span>    init(encodedRegionName, tablename, logSeqNum, now, clusterIds, nonceGroup, nonce, mvcc,<a name="line.220"></a>
-<span class="sourceLineNo">221</span>        replicationScope, null);<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>   * Create the log key for writing to somewhere.<a name="line.225"></a>
-<span class="sourceLineNo">226</span>   * We maintain the tablename mainly for debugging purposes.<a name="line.226"></a>
-<span class="sourceLineNo">227</span>   * A regionName is always a sub-table object.<a name="line.227"></a>
-<span class="sourceLineNo">228</span>   * &lt;p&gt;Used by log splitting and snapshots.<a name="line.228"></a>
-<span class="sourceLineNo">229</span>   *<a name="line.229"></a>
-<span class="sourceLineNo">230</span>   * @param encodedRegionName Encoded name of the region as returned by<a name="line.230"></a>
-<span class="sourceLineNo">231</span>   *                          &lt;code&gt;HRegionInfo#getEncodedNameAsBytes()&lt;/code&gt;.<a name="line.231"></a>
-<span class="sourceLineNo">232</span>   * @param tablename         - name of table<a name="line.232"></a>
-<span class="sourceLineNo">233</span>   * @param logSeqNum         - log sequence number<a name="line.233"></a>
-<span class="sourceLineNo">234</span>   * @param now               Time at which this edit was written.<a name="line.234"></a>
-<span class="sourceLineNo">235</span>   * @param clusterIds        the clusters that have consumed the change(used in Replication)<a name="line.235"></a>
-<span class="sourceLineNo">236</span>   */<a name="line.236"></a>
-<span class="sourceLineNo">237</span>  // TODO: Fix being able to pass in sequenceid.<a name="line.237"></a>
-<span class="sourceLineNo">238</span>  public WALKeyImpl(final byte[] encodedRegionName,<a name="line.238"></a>
-<span class="sourceLineNo">239</span>                final TableName tablename,<a name="line.239"></a>
-<span class="sourceLineNo">240</span>                long logSeqNum,<a name="line.240"></a>
-<span class="sourceLineNo">241</span>                final long now,<a name="line.241"></a>
-<span class="sourceLineNo">242</span>                List&lt;UUID&gt; clusterIds,<a name="line.242"></a>
-<span class="sourceLineNo">243</span>                long nonceGroup,<a name="line.243"></a>
-<span class="sourceLineNo">244</span>                long nonce,<a name="line.244"></a>
-<span class="sourceLineNo">245</span>                MultiVersionConcurrencyControl mvcc) {<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    init(encodedRegionName, tablename, logSeqNum, now, clusterIds, nonceGroup,<a name="line.246"></a>
-<span class="sourceLineNo">247</span>        nonce, mvcc, null, null);<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>  /**<a name="line.250"></a>
-<span class="sourceLineNo">251</span>   * Create the log key for writing to somewhere.<a name="line.251"></a>
-<span class="sourceLineNo">252</span>   * We maintain the tablename mainly for debugging purposes.<a name="line.252"></a>
-<span class="sourceLineNo">253</span>   * A regionName is always a sub-table object.<a name="line.253"></a>
-<span class="sourceLineNo">254</span>   *<a name="line.254"></a>
-<span class="sourceLineNo">255</span>   * @param encodedRegionName Encoded name of the region as returned by<a name="line.255"></a>
-<span class="sourceLineNo">256</span>   *                          &lt;code&gt;HRegionInfo#getEncodedNameAsBytes()&lt;/code&gt;.<a name="line.256"></a>
-<span class="sourceLineNo">257</span>   * @param tablename         the tablename<a name="line.257"></a>
-<span class="sourceLineNo">258</span>   * @param now               Time at which this edit was written.<a name="line.258"></a>
-<span class="sourceLineNo">259</span>   * @param clusterIds        the clusters that have consumed the change(used in Replication)<a name="line.259"></a>
-<span class="sourceLineNo">260</span>   * @param nonceGroup<a name="line.260"></a>
-<span class="sourceLineNo">261</span>   * @param nonce<a name="line.261"></a>
-<span class="sourceLineNo">262</span>   * @param mvcc mvcc control used to generate sequence numbers and control read/write points<a name="line.262"></a>
-<span class="sourceLineNo">263</span>   */<a name="line.263"></a>
-<span class="sourceLineNo">264</span>  public WALKeyImpl(final byte[] encodedRegionName, final TableName tablename,<a name="line.264"></a>
-<span class="sourceLineNo">265</span>                final long now, List&lt;UUID&gt; clusterIds, long nonceGroup,<a name="line.265"></a>
-<span class="sourceLineNo">266</span>                final long nonce, final MultiVersionConcurrencyControl mvcc) {<a name="line.266"></a>
-<span class="sourceLineNo">267</span>    init(encodedRegionName, tablename, NO_SEQUENCE_ID, now, clusterIds, nonceGroup, nonce, mvcc,<a name="line.267"></a>
-<span class="sourceLineNo">268</span>        null, null);<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>   * Create the log key for writing to somewhere.<a name="line.272"></a>
-<span class="sourceLineNo">273</span>   * We maintain the tablename mainly for debugging purposes.<a name="line.273"></a>
-<span class="sourceLineNo">274</span>   * A regionName is always a sub-table object.<a name="line.274"></a>
-<span class="sourceLineNo">275</span>   *<a name="line.275"></a>
-<span class="sourceLineNo">276</span>   * @param encodedRegionName Encoded name of the region as returned by<a name="line.276"></a>
-<span class="sourceLineNo">277</span>   *                          &lt;code&gt;HRegionInfo#getEncodedNameAsBytes()&lt;/code&gt;.<a name="line.277"></a>
-<span class="sourceLineNo">278</span>   * @param tablename<a name="line.278"></a>
-<span class="sourceLineNo">279</span>   * @param now               Time at which this edit was written.<a name="line.279"></a>
-<span class="sourceLineNo">280</span>   * @param clusterIds        the clusters that have consumed the change(used in Replication)<a name="line.280"></a>
-<span class="sourceLineNo">281</span>   * @param nonceGroup        the nonceGroup<a name="line.281"></a>
-<span class="sourceLineNo">282</span>   * @param nonce             the nonce<a name="line.282"></a>
-<span class="sourceLineNo">283</span>   * @param mvcc mvcc control used to generate sequence numbers and control read/write points<a name="line.283"></a>
-<span class="sourceLineNo">284</span>   * @param replicationScope  the non-default replication scope of the column families<a name="line.284"></a>
-<span class="sourceLineNo">285</span>   */<a name="line.285"></a>
-<span class="sourceLineNo">286</span>  public WALKeyImpl(final byte[] encodedRegionName, final TableName tablename,<a name="line.286"></a>
-<span class="sourceLineNo">287</span>                final long now, List&lt;UUID&gt; clusterIds, long nonceGroup,<a name="line.287"></a>
-<span class="sourceLineNo">288</span>                final long nonce, final MultiVersionConcurrencyControl mvcc,<a name="line.288"></a>
-<span class="sourceLineNo">289</span>                NavigableMap&lt;byte[], Integer&gt; replicationScope) {<a name="line.289"></a>
-<span class="sourceLineNo">290</span>    init(encodedRegionName, tablename, NO_SEQUENCE_ID, now, clusterIds, nonceGroup, nonce, mvcc,<a name="line.290"></a>
-<span class="sourceLineNo">291</span>        replicationScope, null);<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>  /**<a name="line.294"></a>
-<span class="sourceLineNo">295</span>   * Create the log key for writing to somewhere.<a name="line.295"></a>
-<span class="sourceLineNo">296</span>   * We maintain the tablename mainly for debugging purposes.<a name="line.296"></a>
-<span class="sourceLineNo">297</span>   * A regionName is always a sub-table object.<a name="line.297"></a>
-<span class="sourceLineNo">298</span>   *<a name="line.298"></a>
-<span class="sourceLineNo">299</span>   * @param encodedRegionName Encoded name of the region as returned by<a name="line.299"></a>
-<span class="sourceLineNo">300</span>   *                          &lt;code&gt;HRegionInfo#getEncodedNameAsBytes()&lt;/code&gt;.<a name="line.300"></a>
-<span class="sourceLineNo">301</span>   * @param tablename<a name="line.301"></a>
-<span class="sourceLineNo">302</span>   * @param logSeqNum<a name="line.302"></a>
-<span class="sourceLineNo">303</span>   * @param nonceGroup<a name="line.303"></a>
-<span class="sourceLineNo">304</span>   * @param nonce<a name="line.304"></a>
-<span class="sourceLineNo">305</span>   */<a name="line.305"></a>
-<span class="sourceLineNo">306</span>  // TODO: Fix being able to pass in sequenceid.<a name="line.306"></a>
-<span class="sourceLineNo">307</span>  public WALKeyImpl(final byte[] encodedRegionName,<a name="line.307"></a>
-<span class="sourceLineNo">308</span>                final TableName tablename,<a name="line.308"></a>
-<span class="sourceLineNo">309</span>                long logSeqNum,<a name="line.309"></a>
-<span class="sourceLineNo">310</span>                long nonceGroup,<a name="line.310"></a>
-<span class="sourceLineNo">311</span>                long nonce,<a name="line.311"></a>
-<span class="sourceLineNo">312</span>                final MultiVersionConcurrencyControl mvcc) {<a name="line.312"></a>
-<span class="sourceLineNo">313</span>    init(encodedRegionName,<a name="line.313"></a>
-<span class="sourceLineNo">314</span>        tablename,<a name="line.314"></a>
-<span class="sourceLineNo">315</span>        logSeqNum,<a name="line.315"></a>
-<span class="sourceLineNo">316</span>        EnvironmentEdgeManager.currentTime(),<a name="line.316"></a>
-<span class="sourceLineNo">317</span>        EMPTY_UUIDS,<a name="line.317"></a>
-<span class="sourceLineNo">318</span>        nonceGroup,<a name="line.318"></a>
-<span class="sourceLineNo">319</span>        nonce,<a name="line.319"></a>
-<span class="sourceLineNo">320</span>        mvcc, null, null);<a name="line.320"></a>
-<span class="sourceLineNo">321</span>  }<a name="line.321"></a>
-<span class="sourceLineNo">322</span><a name="line.322"></a>
-<span class="sourceLineNo">323</span>  public WALKeyImpl(final byte[] encodedRegionName, final TableName tablename,<a name="line.323"></a>
-<span class="sourceLineNo">324</span>                    final long now, List&lt;UUID&gt; clusterIds, long nonceGroup,<a name="line.324"></a>
-<span class="sourceLineNo">325</span>                    final long nonce, final MultiVersionConcurrencyControl mvcc,<a name="line.325"></a>
-<span class="sourceLineNo">326</span>                    NavigableMap&lt;byte[], Integer&gt; replicationScope,<a name="line.326"></a>
-<span class="sourceLineNo">327</span>                    Map&lt;String, byte[]&gt; extendedAttributes){<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    init(encodedRegionName,<a name="line.328"></a>
-<span class="sourceLineNo">329</span>        tablename,<a name="line.329"></a>
-<span class="sourceLineNo">330</span>        NO_SEQUENCE_ID,<a name="line.330"></a>
-<span class="sourceLineNo">331</span>        now,<a name="line.331"></a>
-<span class="sourceLineNo">332</span>        clusterIds,<a name="line.332"></a>
-<span class="sourceLineNo">333</span>        nonceGroup,<a name="line.333"></a>
-<span class="sourceLineNo">334</span>        nonce,<a name="line.334"></a>
-<span class="sourceLineNo">335</span>        mvcc, replicationScope, extendedAttributes);<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>  @InterfaceAudience.Private<a name="line.338"></a>
-<span class="sourceLineNo">339</span>  protected void init(final byte[] encodedRegionName,<a name="line.339"></a>
-<span class="sourceLineNo">340</span>                      final TableName tablename,<a name="line.340"></a>
-<span class="sourceLineNo">341</span>                      long logSeqNum,<a name="line.341"></a>
-<span class="sourceLineNo">342</span>                      final long now,<a name="line.342"></a>
-<span class="sourceLineNo">343</span>                      List&lt;UUID&gt; clusterIds,<a name="line.343"></a>
-<span class="sourceLineNo">344</span>                      long nonceGroup,<a name="line.344"></a>
-<span class="sourceLineNo">345</span>                      long nonce,<a name="line.345"></a>
-<span class="sourceLineNo">346</span>                      MultiVersionConcurrencyControl mvcc,<a name="line.346"></a>
-<span class="sourceLineNo">347</span>                      NavigableMap&lt;byte[], Integer&gt; replicationScope,<a name="line.347"></a>
-<span class="sourceLineNo">348</span>                      Map&lt;String, byte[]&gt; extendedAttributes) {<a name="line.348"></a>
-<span class="sourceLineNo">349</span>    this.sequenceId = logSeqNum;<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    this.writeTime = now;<a name="line.350"></a>
-<span class="sourceLineNo">351</span>    this.clusterIds = clusterIds;<a name="line.351"></a>
-<span class="sourceLineNo">352</span>    this.encodedRegionName = encodedRegionName;<a name="line.352"></a>
-<span class="sourceLineNo">353</span>    this.tablename = tablename;<a name="line.353"></a>
-<span class="sourceLineNo">354</span>    this.nonceGroup = nonceGroup;<a name="line.354"></a>
-<span class="sourceLineNo">355</span>    this.nonce = nonce;<a name="line.355"></a>
-<span class="sourceLineNo">356</span>    this.mvcc = mvcc;<a name="line.356"></a>
-<span class="sourceLineNo">357</span>    if (logSeqNum != NO_SEQUENCE_ID) {<a name="line.357"></a>
-<span class="sourceLineNo">358</span>      setSequenceId(logSeqNum);<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    }<a name="line.359"></a>
-<span class="sourceLineNo">360</span>    this.replicationScope = replicationScope;<a name="line.360"></a>
-<span class="sourceLineNo">361</span>    this.extendedAttributes = extendedAttributes;<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>  // For deserialization. DO NOT USE. See setWriteEntry below.<a name="line.364"></a>
-<span class="sourceLineNo">365</span>  @InterfaceAudience.Private<a name="line.365"></a>
-<span class="sourceLineNo">366</span>  protected void setSequenceId(long sequenceId) {<a name="line.366"></a>
-<span class="sourceLineNo">367</span>    this.sequenceId = sequenceId;<a name="line.367"></a>
-<span class="sourceLineNo">368</span>  }<a name="line.368"></a>
-<span class="sourceLineNo">369</span><a name="line.369"></a>
-<span class="sourceLineNo">370</span>  /** @return encoded region name */<a name="line.370"></a>
-<span class="sourceLineNo">371</span>  @Override<a name="line.371"></a>
-<span class="sourceLineNo">372</span>  public byte [] getEncodedRegionName() {<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    return encodedRegionName;<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>  /** @return table name */<a name="line.376"></a>
-<span class="sourceLineNo">377</span>  @Override<a name="line.377"></a>
-<span class="sourceLineNo">378</span>  public TableName getTableName() {<a name="line.378"></a>
-<span class="sourceLineNo">379</span>    return tablename;<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>   * Used to set original sequenceId for WALKeyImpl during WAL replay<a name="line.383"></a>
-<span class="sourceLineNo">384</span>   */<a name="line.384"></a>
-<span class="sourceLineNo">385</span>  public void setOrigLogSeqNum(final long sequenceId) {<a name="line.385"></a>
-<span class="sourceLineNo">386</span>    this.origLogSeqNum = sequenceId;<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>   * Return a positive long if current WALKeyImpl is created from a replay edit; a replay edit is an<a name="line.390"></a>
-<span class="sourceLineNo">391</span>   * edit that came in when replaying WALs of a crashed server.<a name="line.391"></a>
-<span class="sourceLineNo">392</span>   * @return original sequence number of the WALEdit<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   */<a name="line.393"></a>
-<span class="sourceLineNo">394</span>  @Override<a name="line.394"></a>
-<span class="sourceLineNo">395</span>  public long getOrigLogSeqNum() {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    return this.origLogSeqNum;<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>   * SequenceId is only available post WAL-assign. Calls before this will get you a<a name="line.400"></a>
-<span class="sourceLineNo">401</span>   * {@link SequenceId#NO_SEQUENCE_ID}. See the comment on FSHLog#append and #getWriteNumber in this<a name="line.401"></a>
-<span class="sourceLineNo">402</span>   * method for more on when this sequenceId comes available.<a name="line.402"></a>
-<span class="sourceLineNo">403</span>   * @return long the new assigned sequence number<a name="line.403"></a>
-<span class="sourceLineNo">404</span>   */<a name="line.404"></a>
-<span class="sourceLineNo">405</span>  @Override<a name="line.405"></a>
-<span class="sourceLineNo">406</span>  public long getSequenceId() {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    return this.sequenceId;<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>   * @return the write time<a name="line.411"></a>
-<span class="sourceLineNo">412</span>   */<a name="line.412"></a>
-<span class="sourceLineNo">413</span>  @Override<a name="line.413"></a>
-<span class="sourceLineNo">414</span>  public long getWriteTime() {<a name="line.414"></a>
-<span class="sourceLineNo">415</span>    return this.writeTime;<a name="line.415"></a>
-<span class="sourceLineNo">416</span>  }<a name="line.416"></a>
-<span class="sourceLineNo">417</span><a name="line.417"></a>
-<span class="sourceLineNo">418</span>  public NavigableMap&lt;byte[], Integer&gt; getReplicationScopes() {<a name="line.418"></a>
-<span class="sourceLineNo">419</span>    return replicationScope;<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>  /** @return The nonce group */<a name="line.422"></a>
-<span class="sourceLineNo">423</span>  @Override<a name="line.423"></a>
-<span class="sourceLineNo">424</span>  public long getNonceGroup() {<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    return nonceGroup;<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>  /** @return The nonce */<a name="line.428"></a>
-<span class="sourceLineNo">429</span>  @Override<a name="line.429"></a>
-<span class="sourceLineNo">430</span>  public long getNonce() {<a name="line.430"></a>
-<span class="sourceLineNo">431</span>    return nonce;<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>  private void setReplicationScope(NavigableMap&lt;byte[], Integer&gt; replicationScope) {<a name="line.434"></a>
-<span class="sourceLineNo">435</span>    this.replicationScope = replicationScope;<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>  public void clearReplicationScope() {<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    setReplicationScope(null);<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>  /**<a name="line.442"></a>
-<span class="sourceLineNo">443</span>   * Marks that the cluster with the given clusterId has consumed the change<a name="line.443"></a>
-<span class="sourceLineNo">444</span>   */<a name="line.444"></a>
-<span class="sourceLineNo">445</span>  public void addClusterId(UUID clusterId) {<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    if (!clusterIds.contains(clusterId)) {<a name="line.446"></a>
-<span class="sourceLineNo">447</span>      clusterIds.add(clusterId);<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>  /**<a name="line.451"></a>
-<span class="sourceLineNo">452</span>   * @return the set of cluster Ids that have consumed the change<a name="line.452"></a>
-<span class="sourceLineNo">453</span>   */<a name="line.453"></a>
-<span class="sourceLineNo">454</span>  public List&lt;UUID&gt; getClusterIds() {<a name="line.454"></a>
-<span class="sourceLineNo">455</span>    return clusterIds;<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>   * @return the cluster id on which the change has originated. It there is no such cluster, it<a name="line.459"></a>
-<span class="sourceLineNo">460</span>   *         returns DEFAULT_CLUSTER_ID (cases where replication is not enabled)<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 UUID getOriginatingClusterId(){<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    return clusterIds.isEmpty()? HConstants.DEFAULT_CLUSTER_ID: clusterIds.get(0);<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>  @Override<a name="line.467"></a>
-<span class="sourceLineNo">468</span>  public byte[] getExtendedAttribute(String attributeKey){<a name="line.468"></a>
-<span class="sourceLineNo">469</span>    return extendedAttributes != null ? extendedAttributes.get(attributeKey) : null;<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>  @Override<a name="line.472"></a>
-<span class="sourceLineNo">473</span>  public Map&lt;String, byte[]&gt; getExtendedAttributes(){<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    return extendedAttributes != null ? new HashMap&lt;String, byte[]&gt;(extendedAttributes) :<a name="line.474"></a>
-<span class="sourceLineNo">475</span>        new HashMap&lt;String, byte[]&gt;();<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 String toString() {<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    return tablename + "/" + Bytes.toString(encodedRegionName) + "/" + sequenceId;<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>  @Override<a name="line.483"></a>
-<span class="sourceLineNo">484</span>  public boolean equals(Object obj) {<a name="line.484"></a>
-<span class="sourceLineNo">485</span>    if (this == obj) {<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      return true;<a name="line.486"></a>
-<span class="sourceLineNo">487</span>    }<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    if (obj == null || getClass() != obj.getClass()) {<a name="line.488"></a>
-<span class="sourceLineNo">489</span>      return false;<a name="line.489"></a>
-<span class="sourceLineNo">490</span>    }<a name="line.490"></a>
-<span class="sourceLineNo">491</span>    return compareTo((WALKey)obj) == 0;<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>  @Override<a name="line.494"></a>
-<span class="sourceLineNo">495</span>  public int hashCode() {<a name="line.495"></a>
-<span class="sourceLineNo">496</span>    int result = Bytes.hashCode(this.encodedRegionName);<a name="line.496"></a>
-<span class="sourceLineNo">497</span>    result = (int) (result ^ getSequenceId());<a name="line.497"></a>
-<span class="sourceLineNo">498</span>    result = (int) (result ^ this.writeTime);<a name="line.498"></a>
-<span class="sourceLineNo">499</span>    return result;<a name="line.499"></a>
-<span class="sourceLineNo">500</span>  }<a name="line.500"></a>
-<span class="sourceLineNo">501</span><a name="line.501"></a>
-<span class="sourceLineNo">502</span>  @Override<a name="line.502"></a>
-<span class="sourceLineNo">503</span>  public int compareTo(WALKey o) {<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    int result = Bytes.compareTo(this.encodedRegionName, o.getEncodedRegionName());<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    if (result == 0) {<a name="line.505"></a>
-<span class="sourceLineNo">506</span>      long sid = getSequenceId();<a name="line.506"></a>
-<span class="sourceLineNo">507</span>      long otherSid = o.getSequenceId();<a name="line.507"></a>
-<span class="sourceLineNo">508</span>      if (sid &lt; otherSid) {<a name="line.508"></a>
-<span class="sourceLineNo">509</span>        result = -1;<a name="line.509"></a>
-<span class="sourceLineNo">510</span>      } else if (sid  &gt; otherSid) {<a name="line.510"></a>
-<span class="sourceLineNo">511</span>        result = 1;<a name="line.511"></a>
-<span class="sourceLineNo">512</span>      }<a name="line.512"></a>
-<span class="sourceLineNo">513</span>      if (result == 0) {<a name="line.513"></a>
-<span class="sourceLineNo">514</span>        if (this.writeTime &lt; o.getWriteTime()) {<a name="line.514"></a>
-<span class="sourceLineNo">515</span>          result = -1;<a name="line.515"></a>
-<span class="sourceLineNo">516</span>        } else if (this.writeTime &gt; o.getWriteTime()) {<a name="line.516"></a>
-<span class="sourceLineNo">517</span>          return 1;<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>    // why isn't cluster id accounted for?<a name="line.521"></a>
-<span class="sourceLineNo">522</span>    return result;<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>  /**<a name="line.525"></a>
-<span class="sourceLineNo">526</span>   * Drop this instance's tablename byte array and instead<a name="line.526"></a>
-<span class="sourceLineNo">527</span>   * hold a reference to the provided tablename. This is not<a name="line.527"></a>
-<span class="sourceLineNo">528</span>   * meant to be a general purpose setter - it's only used<a name="line.528"></a>
-<span class="sourceLineNo">529</span>   * to collapse references to conserve memory.<a name="line.529"></a>
-<span class="sourceLineNo">530</span>   */<a name="line.530"></a>
-<span class="sourceLineNo">531</span>  void internTableName(TableName tablename) {<a name="line.531"></a>
-<span class="sourceLineNo">532</span>    // We should not use this as a setter - only to swap<a name="line.532"></a>
-<span class="sourceLineNo">533</span>    // in a new reference to the same table name.<a name="line.533"></a>
-<span class="sourceLineNo">534</span>    assert tablename.equals(this.tablename);<a name="line.534"></a>
-<span class="sourceLineNo">535</span>    this.tablename = tablename;<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 name="line.538"></a>
-<span class="sourceLineNo">539</span>   * Drop this instance's region name byte array and instead<a name="line.539"></a>
-<span class="sourceLineNo">540</span>   * hold a reference to the provided region name. This is not<a name="line.540"></a>
-<span class="sourceLineNo">541</span>   * meant to be a general purpose setter - it's only used<a name="line.541"></a>
-<span class="sourceLineNo">542</span>   * to collapse references to conserve memory.<a name="line.542"></a>
-<span class="sourceLineNo">543</span>   */<a name="line.543"></a>
-<span class="sourceLineNo">544</span>  void internEncodedRegionName(byte []encodedRegionName) {<a name="line.544"></a>
-<span class="sourceLineNo">545</span>    // We should not use this as a setter - only to swap<a name="line.545"></a>
-<span class="sourceLineNo">546</span>    // in a new reference to the same table name.<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    assert Bytes.equals(this.encodedRegionName, encodedRegionName);<a name="line.547"></a>
-<span class="sourceLineNo">548</span>    this.encodedRegionName = encodedRegionName;<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>  public WALProtos.WALKey.Builder getBuilder(WALCellCodec.ByteStringCompressor compressor)<a name="line.551"></a>
-<span class="sourceLineNo">552</span>      throws IOException {<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    WALProtos.WALKey.Builder builder = WALProtos.WALKey.newBuilder();<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    builder.setEncodedRegionName(<a name="line.554"></a>
-<span class="sourceLineNo">555</span>      compressor.compress(this.encodedRegionName, CompressionContext.DictionaryIndex.REGION));<a name="line.555"></a>
-<span class="sourceLineNo">556</span>    builder.setTableName(<a name="line.556"></a>
-<span class="sourceLineNo">557</span>      compressor.compress(this.tablename.getName(), CompressionContext.DictionaryIndex.TABLE));<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    builder.setLogSequenceNumber(getSequenceId());<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    builder.setWriteTime(writeTime);<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    if (this.origLogSeqNum &gt; 0) {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      builder.setOrigSequenceNumber(this.origLogSeqNum);<a name="line.561"></a>
-<span class="sourceLineNo">562</span>    }<a name="line.562"></a>
-<span class="sourceLineNo">563</span>    if (this.nonce != HConstants.NO_NONCE) {<a name="line.563"></a>
-<span class="sourceLineNo">564</span>      builder.setNonce(nonce);<a name="line.564"></a>
-<span class="sourceLineNo">565</span>    }<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    if (this.nonceGroup != HConstants.NO_NONCE) {<a name="line.566"></a>
-<span class="sourceLineNo">567</span>      builder.setNonceGroup(nonceGroup);<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    }<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    HBaseProtos.UUID.Builder uuidBuilder = HBaseProtos.UUID.newBuilder();<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    for (UUID clusterId : clusterIds) {<a name="line.570"></a>
-<span class="sourceLineNo">571</span>      uuidBuilder.setLeastSigBits(clusterId.getLeastSignificantBits());<a name="line.571"></a>
-<span class="sourceLineNo">572</span>      uuidBuilder.setMostSigBits(clusterId.getMostSignificantBits());<a name="line.572"></a>
-<span class="sourceLineNo">573</span>      builder.addClusterIds(uuidBuilder.build());<a name="line.573"></a>
-<span class="sourceLineNo">574</span>    }<a name="line.574"></a>
-<span class="sourceLineNo">575</span>    if (replicationScope != null) {<a name="line.575"></a>
-<span class="sourceLineNo">576</span>      for (Map.Entry&lt;byte[], Integer&gt; e : replicationScope.entrySet()) {<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        ByteString family =<a name="line.577"></a>
-<span class="sourceLineNo">578</span>            compressor.compress(e.getKey(), CompressionContext.DictionaryIndex.FAMILY);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        builder.addScopes(FamilyScope.newBuilder().setFamily(family)<a name="line.579"></a>
-<span class="sourceLineNo">580</span>            .setScopeType(ScopeType.forNumber(e.getValue())));<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>    if (extendedAttributes != null){<a name="line.583"></a>
-<span class="sourceLineNo">584</span>      for (Map.Entry&lt;String, byte[]&gt; e : extendedAttributes.entrySet()){<a name="line.584"></a>
-<span class="sourceLineNo">585</span>        WALProtos.Attribute attr = WALProtos.Attribute.newBuilder().<a name="line.585"></a>
-<span class="sourceLineNo">586</span>            setKey(e.getKey()).setValue(compressor.compress(e.getValue(),<a name="line.586"></a>
-<span class="sourceLineNo">587</span>            CompressionContext.DictionaryIndex.TABLE)).build();<a name="line.587"></a>
-<span class="sourceLineNo">588</span>        builder.addExtendedAttributes(attr);<a name="line.588"></a>
-<span class="sourceLineNo">589</span>      }<a name="line.589"></a>
-<span class="sourceLineNo">590</span>    }<a name="line.590"></a>
-<span class="sourceLineNo">591</span>    return builder;<a name="line.591"></a>
-<span class="sourceLineNo">592</span>  }<a name="line.592"></a>
-<span class="sourceLineNo">593</span><a name="line.593"></a>
-<span class="sourceLineNo">594</span>  public void readFieldsFromPb(WALProtos.WALKey walKey,<a name="line.594"></a>
-<span class="sourceLineNo">595</span>      WALCellCodec.ByteStringUncompressor uncompressor) throws IOException {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    this.encodedRegionName = uncompressor.uncompress(walKey.getEncodedRegionName(),<a name="line.596"></a>
-<span class="sourceLineNo">597</span>      CompressionContext.DictionaryIndex.REGION);<a name="line.597"></a>
-<span class="sourceLineNo">598</span>    byte[] tablenameBytes =<a name="line.598"></a>
-<span class="sourceLineNo">599</span>        uncompressor.uncompress(walKey.getTableName(), CompressionContext.DictionaryIndex.TABLE);<a name="line.599"></a>
-<span class="sourceLineNo">600</span>    this.tablename = TableName.valueOf(tablenameBytes);<a name="line.600"></a>
-<span class="sourceLineNo">601</span>    clusterIds.clear();<a name="line.601"></a>
-<span class="sourceLineNo">602</span>    for (HBaseProtos.UUID clusterId : walKey.getClusterIdsList()) {<a name="line.602"></a>
-<span class="sourceLineNo">603</span>      clusterIds.add(new UUID(clusterId.getMostSigBits(), clusterId.getLeastSigBits()));<a name="line.603"></a>
+<span class="sourceLineNo">199</span>   * Copy constructor that takes in an existing WALKeyImpl plus some extended attributes.<a name="line.199"></a>
+<span class="sourceLineNo">200</span>   * Intended for coprocessors to add annotations to a system-generated WALKey<a name="line.200"></a>
+<span class="sourceLineNo">201</span>   * for persistence to the WAL.<a name="line.201"></a>
+<span class="sourceLineNo">202</span>   * @param key Key to be copied into this new key<a name="line.202"></a>
+<span class="sourceLineNo">203</span>   * @param extendedAttributes Extra attributes to copy into the new key<a name="line.203"></a>
+<span class="sourceLineNo">204</span>   */<a name="line.204"></a>
+<span class="sourceLineNo">205</span>  public WALKeyImpl(WALKeyImpl key,<a name="line.205"></a>
+<span class="sourceLineNo">206</span>                    Map&lt;String, byte[]&gt; extendedAttributes){<a name="line.206"></a>
+<span class="sourceLineNo">207</span>    init(key.getEncodedRegionName(), key.getTableName(), key.getSequenceId(),<a name="line.207"></a>
+<span class="sourceLineNo">208</span>        key.getWriteTime(), key.getClusterIds(), key.getNonceGroup(), key.getNonce(),<a name="line.208"></a>
+<span class="sourceLineNo">209</span>        key.getMvcc(), key.getReplicationScopes(), extendedAttributes);<a name="line.209"></a>
+<span class="sourceLineNo">210</span><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>  /**<a name="line.213"></a>
+<span class="sourceLineNo">214</span>   * Copy constructor that takes in an existing WALKey, the extra WALKeyImpl fields that the<a name="line.214"></a>
+<span class="sourceLineNo">215</span>   * parent interface is missing, plus some extended attributes. Intended<a name="line.215"></a>
+<span class="sourceLineNo">216</span>   * for coprocessors to add annotations to a system-generated WALKey for<a name="line.216"></a>
+<span class="sourceLineNo">217</span>   * persistence to the WAL.<a name="line.217"></a>
+<span class="sourceLineNo">218</span>   */<a name="line.218"></a>
+<span class="sourceLineNo">219</span>  public WALKeyImpl(WALKey key,<a name="line.219"></a>
+<span class="sourceLineNo">220</span>                    List&lt;UUID&gt; clusterIds,<a name="line.220"></a>
+<span class="sourceLineNo">221</span>                    MultiVersionConcurrencyControl mvcc,<a name="line.221"></a>
+<span class="sourceLineNo">222</span>                    final NavigableMap&lt;byte[], Integer&gt; replicationScopes,<a name="line.222"></a>
+<span class="sourceLineNo">223</span>                    Map&lt;String, byte[]&gt; extendedAttributes){<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    init(key.getEncodedRegionName(), key.getTableName(), key.getSequenceId(),<a name="line.224"></a>
+<span class="sourceLineNo">225</span>        key.getWriteTime(), clusterIds, key.getNonceGroup(), key.getNonce(),<a name="line.225"></a>
+<span class="sourceLineNo">226</span>        mvcc, replicationScopes, extendedAttributes);<a name="line.226"></a>
+<span class="sourceLineNo">227</span><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>   * Create the log key for writing to somewhere.<a name="line.230"></a>
+<span class="sourceLineNo">231</span>   * We maintain the tablename mainly for debugging purposes.<a name="line.231"></a>
+<span class="sourceLineNo">232</span>   * A regionName is always a sub-table object.<a name="line.232"></a>
+<span class="sourceLineNo">233</span>   * &lt;p&gt;Used by log splitting and snapshots.<a name="line.233"></a>
+<span class="sourceLineNo">234</span>   *<a name="line.234"></a>
+<span class="sourceLineNo">235</span>   * @param encodedRegionName Encoded name of the region as returned by<a name="line.235"></a>
+<span class="sourceLineNo">236</span>   *                         &lt;code&gt;HRegionInfo#getEncodedNameAsBytes()&lt;/code&gt;.<a name="line.236"></a>
+<span class="sourceLineNo">237</span>   * @param tablename         - name of table<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   * @param logSeqNum         - log sequence number<a name="line.238"></a>
+<span class="sourceLineNo">239</span>   * @param now               Time at which this edit was written.<a name="line.239"></a>
+<span class="sourceLineNo">240</span>   * @param clusterIds        the clusters that have consumed the change(used in Replication)<a name="line.240"></a>
+<span class="sourceLineNo">241</span>   * @param nonceGroup        the nonceGroup<a name="line.241"></a>
+<span class="sourceLineNo">242</span>   * @param nonce             the nonce<a name="line.242"></a>
+<span class="sourceLineNo">243</span>   * @param mvcc              the mvcc associate the WALKeyImpl<a name="line.243"></a>
+<span class="sourceLineNo">244</span>   * @param replicationScope  the non-default replication scope<a name="line.244"></a>
+<span class="sourceLineNo">245</span>   *                          associated with the region's column families<a name="line.245"></a>
+<span class="sourceLineNo">246</span>   */<a name="line.246"></a>
+<span class="sourceLineNo">247</span>  // TODO: Fix being able to pass in sequenceid.<a name="line.247"></a>
+<span class="sourceLineNo">248</span>  public WALKeyImpl(final byte[] encodedRegionName, final TableName tablename, long logSeqNum,<a name="line.248"></a>
+<span class="sourceLineNo">249</span>      final long now, List&lt;UUID&gt; clusterIds, long nonceGroup, long nonce,<a name="line.249"></a>
+<span class="sourceLineNo">250</span>      MultiVersionConcurrencyControl mvcc, final NavigableMap&lt;byte[], Integer&gt; replicationScope) {<a name="line.250"></a>
+<span class="sourceLineNo">251</span>    init(encodedRegionName, tablename, logSeqNum, now, clusterIds, nonceGroup, nonce, mvcc,<a name="line.251"></a>
+<span class="sourceLineNo">252</span>        replicationScope, null);<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>   * Create the log key for writing to somewhere.<a name="line.256"></a>
+<span class="sourceLineNo">257</span>   * We maintain the tablename mainly for debugging purposes.<a name="line.257"></a>
+<span class="sourceLineNo">258</span>   * A regionName is always a sub-table object.<a name="line.258"></a>
+<span class="sourceLineNo">259</span>   * &lt;p&gt;Used by log splitting and snapshots.<a name="line.259"></a>
+<span class="sourceLineNo">260</span>   *<a name="line.260"></a>
+<span class="sourceLineNo">261</span>   * @param encodedRegionName Encoded name of the region as returned by<a name="line.261"></a>
+<span class="sourceLineNo">262</span>   *                          &lt;code&gt;HRegionInfo#getEncodedNameAsBytes()&lt;/code&gt;.<a name="line.262"></a>
+<span class="sourceLineNo">263</span>   * @param tablename         - name of table<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   * @param logSeqNum         - log sequence number<a name="line.264"></a>
+<span class="sourceLineNo">265</span>   * @param now               Time at which this edit was written.<a name="line.265"></a>
+<span class="sourceLineNo">266</span>   * @param clusterIds        the clusters that have consumed the change(used in Replication)<a name="line.266"></a>
+<span class="sourceLineNo">267</span>   */<a name="line.267"></a>
+<span class="sourceLineNo">268</span>  // TODO: Fix being able to pass in sequenceid.<a name="line.268"></a>
+<span class="sourceLineNo">269</span>  public WALKeyImpl(final byte[] encodedRegionName,<a name="line.269"></a>
+<span class="sourceLineNo">270</span>                final TableName tablename,<a name="line.270"></a>
+<span class="sourceLineNo">271</span>                long logSeqNum,<a name="line.271"></a>
+<span class="sourceLineNo">272</span>                final long now,<a name="line.272"></a>
+<span class="sourceLineNo">273</span>                List&lt;UUID&gt; clusterIds,<a name="line.273"></a>
+<span class="sourceLineNo">274</span>                long nonceGroup,<a name="line.274"></a>
+<span class="sourceLineNo">275</span>                long nonce,<a name="line.275"></a>
+<span class="sourceLineNo">276</span>                MultiVersionConcurrencyControl mvcc) {<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    init(encodedRegionName, tablename, logSeqNum, now, clusterIds, nonceGroup,<a name="line.277"></a>
+<span class="sourceLineNo">278</span>        nonce, mvcc, null, null);<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>   * Create the log key for writing to somewhere.<a name="line.282"></a>
+<span class="sourceLineNo">283</span>   * We maintain the tablename mainly for debugging purposes.<a name="line.283"></a>
+<span class="sourceLineNo">284</span>   * A regionName is always a sub-table object.<a name="line.284"></a>
+<span class="sourceLineNo">285</span>   *<a name="line.285"></a>
+<span class="sourceLineNo">286</span>   * @param encodedRegionName Encoded name of the region as returned by<a name="line.286"></a>
+<span class="sourceLineNo">287</span>   *                          &lt;code&gt;HRegionInfo#getEncodedNameAsBytes()&lt;/code&gt;.<a name="line.287"></a>
+<span class="sourceLineNo">288</span>   * @param tablename         the tablename<a name="line.288"></a>
+<span class="sourceLineNo">289</span>   * @param now               Time at which this edit was written.<a name="line.289"></a>
+<span class="sourceLineNo">290</span>   * @param clusterIds        the clusters that have consumed the change(used in Replication)<a name="line.290"></a>
+<span class="sourceLineNo">291</span>   * @param nonceGroup<a name="line.291"></a>
+<span class="sourceLineNo">292</span>   * @param nonce<a name="line.292"></a>
+<span class="sourceLineNo">293</span>   * @param mvcc mvcc control used to generate sequence numbers and control read/write points<a name="line.293"></a>
+<span class="sourceLineNo">294</span>   */<a name="line.294"></a>
+<span class="sourceLineNo">295</span>  public WALKeyImpl(final byte[] encodedRegionName, final TableName tablename,<a name="line.295"></a>
+<span class="sourceLineNo">296</span>                final long now, List&lt;UUID&gt; clusterIds, long nonceGroup,<a name="line.296"></a>
+<span class="sourceLineNo">297</span>                final long nonce, final MultiVersionConcurrencyControl mvcc) {<a name="line.297"></a>
+<span class="sourceLineNo">298</span>    init(encodedRegionName, tablename, NO_SEQUENCE_ID, now, clusterIds, nonceGroup, nonce, mvcc,<a name="line.298"></a>
+<span class="sourceLineNo">299</span>        null, 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>
+<span class="sourceLineNo">303</span>   * Create the log key for writing to somewhere.<a name="line.303"></a>
+<span class="sourceLineNo">304</span>   * We maintain the tablename mainly for debugging purposes.<a name="line.304"></a>
+<span class="sourceLineNo">305</span>   * A regionName is always a sub-table object.<a name="line.305"></a>
+<span class="sourceLineNo">306</span>   *<a name="line.306"></a>
+<span class="sourceLineNo">307</span>   * @param encodedRegionName Encoded name of the region as returned by<a name="line.307"></a>
+<span class="sourceLineNo">308</span>   *                          &lt;code&gt;HRegionInfo#getEncodedNameAsBytes()&lt;/code&gt;.<a name="line.308"></a>
+<span class="sourceLineNo">309</span>   * @param tablename<a name="line.309"></a>
+<span class="sourceLineNo">310</span>   * @param now               Time at which this edit was written.<a name="line.310"></a>
+<span class="sourceLineNo">311</span>   * @param clusterIds        the clusters that have consumed the change(used in Replication)<a name="line.311"></a>
+<span class="sourceLineNo">312</span>   * @param nonceGroup        the nonceGroup<a name="line.312"></a>
+<span class="sourceLineNo">313</span>   * @param nonce             the nonce<a name="line.313"></a>
+<span class="sourceLineNo">314</span>   * @param mvcc mvcc control used to generate sequence numbers and control read/write points<a name="line.314"></a>
+<span class="sourceLineNo">315</span>   * @param replicationScope  the non-default replication scope of the column families<a name="line.315"></a>
+<span class="sourceLineNo">316</span>   */<a name="line.316"></a>
+<span class="sourceLineNo">317</span>  public WALKeyImpl(final byte[] encodedRegionName, final TableName tablename,<a name="line.317"></a>
+<span class="sourceLineNo">318</span>                final long now, List&lt;UUID&gt; clusterIds, long nonceGroup,<a name="line.318"></a>
+<span class="sourceLineNo">319</span>                final long nonce, final MultiVersionConcurrencyControl mvcc,<a name="line.319"></a>
+<span class="sourceLineNo">320</span>                NavigableMap&lt;byte[], Integer&gt; replicationScope) {<a name="line.320"></a>
+<span class="sourceLineNo">321</span>    init(encodedRegionName, tablename, NO_SEQUENCE_ID, now, clusterIds, nonceGroup, nonce, mvcc,<a name="line.321"></a>
+<span class="sourceLineNo">322</span>        replicationScope, null);<a name="line.322"></a>
+<span class="sourceLineNo">323</span>  }<a name="line.323"></a>
+<span class="sourceLineNo">324</span><a name="line.324"></a>
+<span class="sourceLineNo">325</span>  /**<a name="line.325"></a>
+<span class="sourceLineNo">326</span>   * Create the log key for writing to somewhere.<a name="line.326"></a>
+<span class="sourceLineNo">327</span>   * We maintain the tablename mainly for debugging purposes.<a name="line.327"></a>
+<span class="sourceLineNo">328</span>   * A regionName is always a sub-table object.<a name="line.328"></a>
+<span class="sourceLineNo">329</span>   *<a name="line.329"></a>
+<span class="sourceLineNo">330</span>   * @param encodedRegionName Encoded name of the region as returned by<a name="line.330"></a>
+<span class="sourceLineNo">331</span>   *                          &lt;code&gt;HRegionInfo#getEncodedNameAsBytes()&lt;/code&gt;.<a name="line.331"></a>
+<span class="sourceLineNo">332</span>   * @param tablename<a name="line.332"></a>
+<span class="sourceLineNo">333</span>   * @param logSeqNum<a name="line.333"></a>
+<span class="sourceLineNo">334</span>   * @param nonceGroup<a name="line.334"></a>
+<span class="sourceLineNo">335</span>   * @param nonce<a name="line.335"></a>
+<span class="sourceLineNo">336</span>   */<a name="line.336"></a>
+<span class="sourceLineNo">337</span>  // TODO: Fix being able to pass in sequenceid.<a name="line.337"></a>
+<span class="sourceLineNo">338</span>  public WALKeyImpl(final byte[] encodedRegionName,<a name="line.338"></a>
+<span class="sourceLineNo">339</span>                final TableName tablename,<a name="line.339"></a>
+<span class="sourceLineNo">340</span>                long logSeqNum,<a name="line.340"></a>
+<span class="sourceLineNo">341</span>                long nonceGroup,<a name="line.341"></a>
+<span class="sourceLineNo">342</span>                long nonce,<a name="line.342"></a>
+<span class="sourceLineNo">343</span>                final MultiVersionConcurrencyControl mvcc) {<a name="line.343"></a>
+<span class="sourceLineNo">344</span>    init(encodedRegionName,<a name="line.344"></a>
+<span class="sourceLineNo">345</span>        tablename,<a name="line.345"></a>
+<span class="sourceLineNo">346</span>        logSeqNum,<a name="line.346"></a>
+<span class="sourceLineNo">347</span>        EnvironmentEdgeManager.currentTime(),<a name="line.347"></a>
+<span class="sourceLineNo">348</span>        EMPTY_UUIDS,<a name="line.348"></a>
+<span class="sourceLineNo">349</span>        nonceGroup,<a name="line.349"></a>
+<span class="sourceLineNo">350</span>        nonce,<a name="line.350"></a>
+<span class="sourceLineNo">351</span>        mvcc, null, null);<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>  public WALKeyImpl(final byte[] encodedRegionName, final TableName tablename,<a name="line.354"></a>
+<span class="sourceLineNo">355</span>                    final long now, List&lt;UUID&gt; clusterIds, long nonceGroup,<a name="line.355"></a>
+<span class="sourceLineNo">356</span>                    final long nonce, final MultiVersionConcurrencyControl mvcc,<a name="line.356"></a>
+<span class="sourceLineNo">357</span>                    NavigableMap&lt;byte[], Integer&gt; replicationScope,<a name="line.357"></a>
+<span class="sourceLineNo">358</span>                    Map&lt;String, byte[]&gt; extendedAttributes){<a name="line.358"></a>
+<span class="sourceLineNo">359</span>    init(encodedRegionName,<a name="line.359"></a>
+<span class="sourceLineNo">360</span>        tablename,<a name="line.360"></a>
+<span class="sourceLineNo">361</span>        NO_SEQUENCE_ID,<a name="line.361"></a>
+<span class="sourceLineNo">362</span>        now,<a name="line.362"></a>
+<span class="sourceLineNo">363</span>        clusterIds,<a name="line.363"></a>
+<span class="sourceLineNo">364</span>        nonceGroup,<a name="line.364"></a>
+<span class="sourceLineNo">365</span>        nonce,<a name="line.365"></a>
+<span class="sourceLineNo">366</span>        mvcc, replicationScope, extendedAttributes);<a name="line.366"></a>
+<span class="sourceLineNo">367</span>  }<a name="line.367"></a>
+<span class="sourceLineNo">368</span><a name="line.368"></a>
+<span class="sourceLineNo">369</span>  @InterfaceAudience.Private<a name="line.369"></a>
+<span class="sourceLineNo">370</span>  protected void init(final byte[] encodedRegionName,<a name="line.370"></a>
+<span class="sourceLineNo">371</span>                      final TableName tablename,<a name="line.371"></a>
+<span class="sourceLineNo">372</span>                      long logSeqNum,<a name="line.372"></a>
+<span class="sourceLineNo">373</span>                      final long now,<a name="line.373"></a>
+<span class="sourceLineNo">374</span>                      List&lt;UUID&gt; clusterIds,<a name="line.374"></a>
+<span class="sourceLineNo">375</span>                      long nonceGroup,<a name="line.375"></a>
+<span class="sourceLineNo">376</span>                      long nonce,<a name="line.376"></a>
+<span class="sourceLineNo">377</span>                      MultiVersionConcurrencyControl mvcc,<a name="line.377"></a>
+<span class="sourceLineNo">378</span>                      NavigableMap&lt;byte[], Integer&gt; replicationScope,<a name="line.378"></a>
+<span class="sourceLineNo">379</span>                      Map&lt;String, byte[]&gt; extendedAttributes) {<a name="line.379"></a>
+<span class="sourceLineNo">380</span>    this.sequenceId = logSeqNum;<a name="line.380"></a>
+<span class="sourceLineNo">381</span>    this.writeTime = now;<a name="line.381"></a>
+<span class="sourceLineNo">382</span>    this.clusterIds = clusterIds;<a name="line.382"></a>
+<span class="sourceLineNo">383</span>    this.encodedRegionName = encodedRegionName;<a name="line.383"></a>
+<span class="sourceLineNo">384</span>    this.tablename = tablename;<a name="line.384"></a>
+<span class="sourceLineNo">385</span>    this.nonceGroup = nonceGroup;<a name="line.385"></a>
+<span class="sourceLineNo">386</span>    this.nonce = nonce;<a name="line.386"></a>
+<span class="sourceLineNo">387</span>    this.mvcc = mvcc;<a name="line.387"></a>
+<span class="sourceLineNo">388</span>    if (logSeqNum != NO_SEQUENCE_ID) {<a name="line.388"></a>
+<span class="sourceLineNo">389</span>      setSequenceId(logSeqNum);<a name="line.389"></a>
+<span class="sourceLineNo">390</span>    }<a name="line.390"></a>
+<span class="sourceLineNo">391</span>    this.replicationScope = replicationScope;<a name="line.391"></a>
+<span class="sourceLineNo">392</span>    this.extendedAttributes = extendedAttributes;<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>  // For deserialization. DO NOT USE. See setWriteEntry below.<a name="line.395"></a>
+<span class="sourceLineNo">396</span>  @InterfaceAudience.Private<a name="line.396"></a>
+<span class="sourceLineNo">397</span>  protected void setSequenceId(long sequenceId) {<a name="line.397"></a>
+<span class="sourceLineNo">398</span>    this.sequenceId = sequenceId;<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>  /** @return encoded region name */<a name="line.401"></a>
+<span class="sourceLineNo">402</span>  @Override<a name="line.402"></a>
+<span class="sourceLineNo">403</span>  public byte [] getEncodedRegionName() {<a name="line.403"></a>
+<span class="sourceLineNo">404</span>    return encodedRegionName;<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 table name */<a name="line.407"></a>
+<span class="sourceLineNo">408</span>  @Override<a name="line.408"></a>
+<span class="sourceLineNo">409</span>  public TableName getTableName() {<a name="line.409"></a>
+<span class="sourceLineNo">410</span>    return tablename;<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>   * Used to set original sequenceId for WALKeyImpl during WAL replay<a name="line.414"></a>
+<span class="sourceLineNo">415</span>   */<a name="line.415"></a>
+<span class="sourceLineNo">416</span>  public void setOrigLogSeqNum(final long sequenceId) {<a name="line.416"></a>
+<span class="sourceLineNo">417</span>    this.origLogSeqNum = sequenceId;<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>  /**<a name="line.420"></a>
+<span class="sourceLineNo">421</span>   * Return a positive long if current WALKeyImpl is created from a replay edit; a replay edit is an<a name="line.421"></a>
+<span class="sourceLineNo">422</span>   * edit that came in when replaying WALs of a crashed server.<a name="line.422"></a>
+<span class="sourceLineNo">423</span>   * @return original sequence number of the WALEdit<a name="line.423"></a>
+<span class="sourceLineNo">424</span>   */<a name="line.424"></a>
+<span class="sourceLineNo">425</span>  @Override<a name="line.425"></a>
+<span class="sourceLineNo">426</span>  public long getOrigLogSeqNum() {<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    return this.origLogSeqNum;<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>  /**<a name="line.430"></a>
+<span class="sourceLineNo">431</span>   * SequenceId is only available post WAL-assign. Calls before this will get you a<a name="line.431"></a>
+<span class="sourceLineNo">432</span>   * {@link SequenceId#NO_SEQUENCE_ID}. See the comment on FSHLog#append and #getWriteNumber in this<a name="line.432"></a>
+<span class="sourceLineNo">433</span>   * method for more on when this sequenceId comes available.<a name="line.433"></a>
+<span class="sourceLineNo">434</span>   * @return long the new assigned sequence number<a name="line.434"></a>
+<span class="sourceLineNo">435</span>   */<a name="line.435"></a>
+<span class="sourceLineNo">436</span>  @Override<a name="line.436"></a>
+<span class="sourceLineNo">437</span>  public long getSequenceId() {<a name="line.437"></a>
+<span class="sourceLineNo">438</span>    return this.sequenceId;<a name="line.438"></a>
+<span class="sourceLineNo">439</span>  }<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>   * @return the write time<a name="line.442"></a>
+<span class="sourceLineNo">443</span>   */<a name="line.443"></a>
+<span class="sourceLineNo">444</span>  @Override<a name="line.444"></a>
+<span class="sourceLineNo">445</span>  public long getWriteTime() {<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    return this.writeTime;<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>  public NavigableMap&lt;byte[], Integer&gt; getReplicationScopes() {<a name="line.449"></a>
+<span class="sourceLineNo">450</span>    return replicationScope;<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>  /** @return The nonce group */<a name="line.453"></a>
+<span class="sourceLineNo">454</span>  @Override<a name="line.454"></a>
+<span class="sourceLineNo">455</span>  public long getNonceGroup() {<a name="line.455"></a>
+<span class="sourceLineNo">456</span>    return nonceGroup;<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>  /** @return The nonce */<a name="line.459"></a>
+<span class="sourceLineNo">460</span>  @Override<a name="line.460"></a>
+<span class="sourceLineNo">461</span>  public long getNonce() {<a name="line.461"></a>
+<span class="sourceLineNo">462</span>    return nonce;<a name="line.462"></a>
+<span class="sourceLineNo">463</span>  }<a name="line.463"></a>
+<span class="sourceLineNo">464</span><a name="line.464"></a>
+<span class="sourceLineNo">465</span>  private void setReplicationScope(NavigableMap&lt;byte[], Integer&gt; replicationScope) {<a name="line.465"></a>
+<span class="sourceLineNo">466</span>    this.replicationScope = replicationScope;<a name="line.466"></a>
+<span class="sourceLineNo">467</span>  }<a name="line.467"></a>
+<span class="sourceLineNo">468</span><a name="line.468"></a>
+<span class="sourceLineNo">469</span>  public void clearReplicationScope() {<a name="line.469"></a>
+<span class="sourceLineNo">470</span>    setReplicationScope(null);<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>   * Marks that the cluster with the given clusterId has consumed the change<a name="line.474"></a>
+<span class="sourceLineNo">475</span>   */<a name="line.475"></a>
+<span class="sourceLineNo">476</span>  public void addClusterId(UUID clusterId) {<a name="line.476"></a>
+<span class="sourceLineNo">477</span>    if (!clusterIds.contains(clusterId)) {<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      clusterIds.add(clusterId);<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><a name="line.481"></a>
+<span class="sourceLineNo">482</span>  /**<a name="line.482"></a>
+<span class="sourceLineNo">483</span>   * @return the set of cluster Ids that have consumed the change<a name="line.483"></a>
+<span class="sourceLineNo">484</span>   */<a name="line.484"></a>
+<span class="sourceLineNo">485</span>  public List&lt;UUID&gt; getClusterIds() {<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    return clusterIds;<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>  /**<a name="line.489"></a>
+<span class="sourceLineNo">490</span>   * @return the cluster id on which the change has originated. It there is no such cluster, it<a name="line.490"></a>
+<span class="sourceLineNo">491</span>   *         returns DEFAULT_CLUSTER_ID (cases where replication is not enabled)<a name="line.491"></a>
+<span class="sourceLineNo">492</span>   */<a name="line.492"></a>
+<span class="sourceLineNo">493</span>  @Override<a name="line.493"></a>
+<span class="sourceLineNo">494</span>  public UUID getOriginatingClusterId(){<a name="line.494"></a>
+<span class="sourceLineNo">495</span>    return clusterIds.isEmpty()? HConstants.DEFAULT_CLUSTER_ID: clusterIds.get(0);<a name="line.495"></a>
+<span class="sourceLineNo">496</span>  }<a name="line.496"></a>
+<span class="sourceLineNo">497</span><a name="line.497"></a>
+<span class="sourceLineNo">498</span>  @Override<a name="line.498"></a>
+<span class="sourceLineNo">499</span>  public void addExtendedAttribute(String attributeKey, byte[] attributeValue){<a name="line.499"></a>
+<span class="sourceLineNo">500</span>    if (extendedAttributes == null){<a name="line.500"></a>
+<span class="sourceLineNo">501</span>      extendedAttributes = new HashMap&lt;String, byte[]&gt;();<a name="line.501"></a>
+<span class="sourceLineNo">502</span>    }<a name="line.502"></a>
+<span class="sourceLineNo">503</span>    extendedAttributes.put(attributeKey, attributeValue);<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>  @Override<a name="line.506"></a>
+<span class="sourceLineNo">507</span>  public byte[] getExtendedAttribute(String attributeKey){<a name="line.507"></a>
+<span class="sourceLineNo">508</span>    return extendedAttributes != null ? extendedAttributes.get(attributeKey) : null;<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>  @Override<a name="line.511"></a>
+<span class="sourceLineNo">512</span>  public Map&lt;String, byte[]&gt; getExtendedAttributes(){<a name="line.512"></a>
+<span class="sourceLineNo">513</span>    return extendedAttributes != null ? new HashMap&lt;String, byte[]&gt;(extendedAttributes) :<a name="line.513"></a>
+<span class="sourceLineNo">514</span>        new HashMap&lt;String, byte[]&gt;();<a name="line.514"></a>
+<span class="sourceLineNo">515</span>  }<a name="line.515"></a>
+<span class="sourceLineNo">516</span><a name="line.516"></a>
+<span class="sourceLineNo">517</span>  @Override<a name="line.517"></a>
+<span class="sourceLineNo">518</span>  public String toString() {<a name="line.518"></a>
+<span class="sourceLineNo">519</span>    return tablename + "/" + Bytes.toString(encodedRegionName) + "/" + sequenceId;<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>  @Override<a name="line.522"></a>
+<span class="sourceLineNo">523</span>  public boolean equals(Object obj) {<a name="line.523"></a>
+<span class="sourceLineNo">524</span>    if (this == obj) {<a name="line.524"></a>
+<span class="sourceLineNo">525</span>      return true;<a name="line.525"></a>
+<span class="sourceLineNo">526</span>    }<a name="line.526"></a>
+<span class="sourceLineNo">527</span>    if (obj == null || getClass() != obj.getClass()) {<a name="line.527"></a>
+<span class="sourceLineNo">528</span>      return false;<a name="line.528"></a>
+<span class="sourceLineNo">529</span>    }<a name="line.529"></a>
+<span class="sourceLineNo">530</span>    return compareTo((WALKey)obj) == 0;<a name="line.530"></a>
+<span class="sourceLineNo">531</span>  }<a name="line.531"></a>
+<span class="sourceLineNo">532</span><a name="line.532"></a>
+<span class="sourceLineNo">533</span>  @Override<a name="line.533"></a>
+<span class="sourceLineNo">534</span>  public int hashCode() {<a name="line.534"></a>
+<span class="sourceLineNo">535</span>    int result = Bytes.hashCode(this.encodedRegionName);<a name="line.535"></a>
+<span class="sourceLineNo">536</span>    result = (int) (result ^ getSequenceId());<a name="line.536"></a>
+<span class="sourceLineNo">537</span>    result = (int) (result ^ this.writeTime);<a name="line.537"></a>
+<span class="sourceLineNo">538</span>    return result;<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>  @Override<a name="line.541"></a>
+<span class="sourceLineNo">542</span>  public int compareTo(WALKey o) {<a name="line.542"></a>
+<span class="sourceLineNo">543</span>    int result = Bytes.compareTo(this.encodedRegionName, o.getEncodedRegionName());<a name="line.543"></a>
+<span class="sourceLineNo">544</span>    if (result == 0) {<a name="line.544"></a>
+<span class="sourceLineNo">545</span>      long sid = getSequenceId();<a name="line.545"></a>
+<span class="sourceLineNo">546</span>      long otherSid = o.getSequenceId();<a name="line.546"></a>
+<span class="sourceLineNo">547</span>      if (sid &lt; otherSid) {<a name="line.547"></a>
+<span class="sourceLineNo">548</span>        result = -1;<a name="line.548"></a>
+<span class="sourceLineNo">549</span>      } else if (sid  &gt; otherSid) {<a name="line.549"></a>
+<span class="sourceLineNo">550</span>        result = 1;<a name="line.550"></a>
+<span class="sourceLineNo">551</span>      }<a name="line.551"></a>
+<span class="sourceLineNo">552</span>      if (result == 0) {<a name="line.552"></a>
+<span class="sourceLineNo">553</span>        if (this.writeTime &lt; o.getWriteTime()) {<a name="line.553"></a>
+<span class="sourceLineNo">554</span>          result = -1;<a name="line.554"></a>
+<span class="sourceLineNo">555</span>        } else if (this.writeTime &gt; o.getWriteTime()) {<a name="line.555"></a>
+<span class="sourceLineNo">556</span>          return 1;<a name="line.556"></a>
+<span class="sourceLineNo">557</span>        }<a name="line.557"></a>
+<span class="sourceLineNo">558</span>      }<a name="line.558"></a>
+<span class="sourceLineNo">559</span>    }<a name="line.559"></a>
+<span class="sourceLineNo">560</span>    // why isn't cluster id accounted for?<a name="line.560"></a>
+<span class="sourceLineNo">561</span>    return result;<a name="line.561"></a>
+<span class="sourceLineNo">562</span>  }<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>   * Drop this instance's tablename byte array and instead<a name="line.565"></a>
+<span class="sourceLineNo">566</span>   * hold a reference to the provided tablename. This is not<a name="line.566"></a>
+<span class="sourceLineNo">567</span>   * meant to be a general purpose setter - it's only used<a name="line.567"></a>
+<span class="sourceLineNo">568</span>   * to collapse references to conserve memory.<a name="line.568"></a>
+<span class="sourceLineNo">569</span>   */<a name="line.569"></a>
+<span class="sourceLineNo">570</span>  void internTableName(TableName tablename) {<a name="line.570"></a>
+<span class="sourceLineNo">571</span>    // We should not use this as a setter - only to swap<a name="line.571"></a>
+<span class="sourceLineNo">572</span>    // in a new reference to the same table name.<a name="line.572"></a>
+<span class="sourceLineNo">573</span>    assert tablename.equals(this.tablename);<a name="line.573"></a>
+<span class="sourceLineNo">574</span>    this.tablename = tablename;<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>  /**<a name="line.577"></a>
+<span class="sourceLineNo">578</span>   * Drop this instance's region name byte array and instead<a name="line.578"></a>
+<span class="sourceLineNo">579</span>   * hold a reference to the provided region name. This is not<a name="line.579"></a>
+<span class="sourceLineNo">580</span>   * meant to be a general purpose setter - it's only used<a name="line.580"></a>
+<span class="sourceLineNo">581</span>   * to collapse references to conserve memory.<a name="line.581"></a>
+<span class="sourceLineNo">582</span>   */<a name="line.582"></a>
+<span class="sourceLineNo">583</span>  void internEncodedRegionName(byte []encodedRegionName) {<a name="line.583"></a>
+<span class="sourceLineNo">584</span>    // We should not use this as a setter - only to swap<a name="line.584"></a>
+<span class="sourceLineNo">585</span>    // in a new reference to the same table name.<a name="line.585"></a>
+<span class="sourceLineNo">586</span>    assert Bytes.equals(this.encodedRegionName, encodedRegionName);<a name="line.586"></a>
+<span class="sourceLineNo">587</span>    this.encodedRegionName = encodedRegionName;<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>  public WALProtos.WALKey.Builder getBuilder(WALCellCodec.ByteStringCompressor compressor)<a name="line.590"></a>
+<span class="sourceLineNo">591</span>      throws IOException {<a name="line.591"></a>
+<span class="sourceLineNo">592</span>    WALProtos.WALKey.Builder builder = WALProtos.WALKey.newBuilder();<a name="line.592"></a>
+<span class="sourceLineNo">593</span>    builder.setEncodedRegionName(<a name="line.593"></a>
+<span class="sourceLineNo">594</span>      compressor.compress(this.encodedRegionName, CompressionContext.DictionaryIndex.REGION));<a name="line.594"></a>
+<span class="sourceLineNo">595</span>    builder.setTableName(<a name="line.595"></a>
+<span class="sourceLineNo">596</span>      compressor.compress(this.tablename.getName(), CompressionContext.DictionaryIndex.TABLE));<a name="line.596"></a>
+<span class="sourceLineNo">597</span>    builder.setLogSequenceNumber(getSequenceId());<a name="line.597"></a>
+<span class="sourceLineNo">598</span>    builder.setWriteTime(writeTime);<a name="line.598"></a>
+<span class="sourceLineNo">599</span>    if (this.origLogSeqNum &gt; 0) {<a name="line.599"></a>
+<span class="sourceLineNo">600</span>      builder.setOrigSequenceNumber(this.origLogSeqNum);<a name="line.600"></a>
+<span class="sourceLineNo">601</span>    }<a name="line.601"></a>
+<span class="sourceLineNo">602</span>    if (this.nonce != HConstants.NO_NONCE) {<a name="line.602"></a>
+<span class="sourceLineNo">603</span>      builder.setNonce(nonce);<a name="line.603"></a>
 <span class="sourceLineNo">604</span>    }<a name="line.604"></a>
-<span class="sourceLineNo">605</span>    if (walKey.hasNonceGroup()) {<a name="line.605"></a>
-<span class="sourceLineNo">606</span>      this.nonceGroup = walKey.getNonceGroup();<a name="line.606"></a>
+<span class="sourceLineNo">605</span>    if (this.nonceGroup != HConstants.NO_NONCE) {<a name="line.605"></a>
+<span class="sourceLineNo">606</span>      builder.setNonceGroup(nonceGroup);<a name="line.606"></a>
 <span class="sourceLineNo">607</span>    }<a name="line.607"></a>
-<span class="sourceLineNo">608</span>    if (walKey.hasNonce()) {<a name="line.608"></a>
-<span class="sourceLineNo">609</span>      this.nonce = walKey.getNonce();<a name="line.609"></a>
-<span class="sourceLineNo">610</span>    }<a name="line.610"></a>
-<span class="sourceLineNo">611</span>    this.replicationScope = null;<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    if (walKey.getScopesCount() &gt; 0) {<a name="line.612"></a>
-<span class="sourceLineNo">613</span>      this.replicationScope = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.613"></a>
-<span class="sourceLineNo">614</span>      for (FamilyScope scope : walKey.getScopesList()) {<a name="line.614"></a>
-<span class="sourceLineNo">615</span>        byte[] family =<a name="line.615"></a>
-<span class="sourceLineNo">616</span>            uncompressor.uncompress(scope.getFamily(), CompressionContext.DictionaryIndex.FAMILY);<a name="line.616"></a>
-<span class="sourceLineNo">617</span>        this.replicationScope.put(family, scope.getScopeType().getNumber());<a name="line.617"></a>
-<span class="sourceLineNo">618</span>      }<a name="line.618"></a>
-<span class="sourceLineNo">619</span>    }<a name="line.619"></a>
-<span class="sourceLineNo">620</span>    setSequenceId(walKey.getLogSequenceNumber());<a name="line.620"></a>
-<span class="sourceLineNo">621</span>    this.writeTime = walKey.getWriteTime();<a name="line.621"></a>
-<span class="sourceLineNo">622</span>    if (walKey.hasOrigSequenceNumber()) {<a name="line.622"></a>
-<span class="sourceLineNo">623</span>      this.origLogSeqNum = walKey.getOrigSequenceNumber();<a name="line.623"></a>
-<span class="sourceLineNo">624</span>    }<a name="line.624"></a>
-<span class="sourceLineNo">625</span>    if (walKey.getExtendedAttributesCount() &gt; 0){<a name="line.625"></a>
-<span class="sourceLineNo">626</span>      this.extendedAttributes = new HashMap&lt;&gt;(walKey.getExtendedAttributesCount());<a name="line.626"></a>
-<span class="sourceLineNo">627</span>      for (WALProtos.Attribute attr : walKey.getExtendedAttributesList()){<a name="line.627"></a>
-<span class="sourceLineNo">628</span>        byte[] value =<a name="line.628"></a>
-<span class="sourceLineNo">629</span>            uncompressor.uncompress(attr.getValue(), CompressionContext.DictionaryIndex.TABLE);<a name="line.629"></a>
-<span class="sourceLineNo">630</span>        extendedAttributes.put(attr.getKey(), value);<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>  }<a name="line.633"></a>
-<span class="sourceLineNo">634</span><a name="line.634"></a>
-<span class="sourceLineNo">635</span>  @Override<a name="line.635"></a>
-<span class="sourceLineNo">636</span>  public long estimatedSerializedSizeOf() {<a name="line.636"></a>
-<span class="sourceLineNo">637</span>    long size = encodedRegionName != null ? encodedRegionName.length : 0;<a name="line.637"></a>
-<span class="sourceLineNo">638</span>    size += tablename != null ? tablename.toBytes().length : 0;<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    if (clusterIds != null) {<a name="line.639"></a>
-<span class="sourceLineNo">640</span>      size += 16 * clusterIds.size();<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    }<a name="line.641"></a>
-<span class="sourceLineNo">642</span>    if (nonceGroup != HConstants.NO_NONCE) {<a name="line.642"></a>
-<span class="sourceLineNo">643</span>      size += Bytes.SIZEOF_LONG; // nonce group<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    }<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    if (nonce != HConstants.NO_NONCE) {<a name="line.645"></a>
-<span class="sourceLineNo">646</span>      size += Bytes.SIZEOF_LONG; // nonce<a name="line.646"></a>
-<span class="sourceLineNo">647</span>    }<a name="line.647"></a>
-<span class="sourceLineNo">648</span>    if (replicationScope != null) {<a name="line.648"></a>
-<span class="sourceLineNo">649</span>      for (Map.Entry&lt;byte[], Integer&gt; scope: replicationScope.entrySet()) {<a name="line.649"></a>
-<span class="sourceLineNo">650</span>        size += scope.getKey().length;<a name="line.650"></a>
-<span class="sourceLineNo">651</span>        size += Bytes.SIZEOF_INT;<a name="line.651"></a>
-<span class="sourceLineNo">652</span>      }<a name="line.652"></a>
-<span class="sourceLineNo">653</span>    }<a name="line.653"></a>
-<span class="sourceLineNo">654</span>    size += Bytes.SIZEOF_LONG; // sequence number<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    size += Bytes.SIZEOF_LONG; // write time<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    if (origLogSeqNum &gt; 0) {<a name="line.656"></a>
-<span class="sourceLineNo">657</span>      size += Bytes.SIZEOF_LONG; // original sequence number<a name="line.657"></a>
+<span class="sourceLineNo">608</span>    HBaseProtos.UUID.Builder uuidBuilder = HBaseProtos.UUID.newBuilder();<a name="line.608"></a>
+<span class="sourceLineNo">609</span>    for (UUID clusterId : clusterIds) {<a name="line.609"></a>
+<span class="sourceLineNo">610</span>      uuidBuilder.setLeastSigBits(clusterId.getLeastSignificantBits());<a name="line.610"></a>
+<span class="sourceLineNo">611</span>      uuidBuilder.setMostSigBits(clusterId.getMostSignificantBits());<a name="line.611"></a>
+<span class="sourceLineNo">612</span>      builder.addClusterIds(uuidBuilder.build());<a name="line.612"></a>
+<span class="sourceLineNo">613</span>    }<a name="line.613"></a>
+<span class="sourceLineNo">614</span>    if (replicationScope != null) {<a name="line.614"></a>
+<span class="sourceLineNo">615</span>      for (Map.Entry&lt;byte[], Integer&gt; e : replicationScope.entrySet()) {<a name="line.615"></a>
+<span class="sourceLineNo">616</span>        ByteString family =<a name="line.616"></a>
+<span class="sourceLineNo">617</span>            compressor.compress(e.getKey(), CompressionContext.DictionaryIndex.FAMILY);<a name="line.617"></a>
+<span class="sourceLineNo">618</span>        builder.addScopes(FamilyScope.newBuilder().setFamily(family)<a name="line.618"></a>
+<span class="sourceLineNo">619</span>            .setScopeType(ScopeType.forNumber(e.getValue())));<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>    if (extendedAttributes != null){<a name="line.622"></a>
+<span class="sourceLineNo">623</span>      for (Map.Entry&lt;String, byte[]&gt; e : extendedAttributes.entrySet()){<a name="line.623"></a>
+<span class="sourceLineNo">624</span>        WALProtos.Attribute attr = WALProtos.Attribute.newBuilder().<a name="line.624"></a>
+<span class="sourceLineNo">625</span>            setKey(e.getKey()).setValue(compressor.compress(e.getValue(),<a name="line.625"></a>
+<span class="sourceLineNo">626</span>            CompressionContext.DictionaryIndex.TABLE)).build();<a name="line.626"></a>
+<span class="sourceLineNo">627</span>        builder.addExtendedAttributes(attr);<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>    return builder;<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>  public void readFieldsFromPb(WALProtos.WALKey walKey,<a name="line.633"></a>
+<span class="sourceLineNo">634</span>      WALCellCodec.ByteStringUncompressor uncompressor) throws IOException {<a name="line.634"></a>
+<span class="sourceLineNo">635</span>    this.encodedRegionName = uncompressor.uncompress(walKey.getEncodedRegionName(),<a name="line.635"></a>
+<span class="sourceLineNo">636</span>      CompressionContext.DictionaryIndex.REGION);<a name="line.636"></a>
+<span class="sourceLineNo">637</span>    byte[] tablenameBytes =<a name="line.637"></a>
+<span class="sourceLineNo">638</span>        uncompressor.uncompress(walKey.getTableName(), CompressionContext.DictionaryIndex.TABLE);<a name="line.638"></a>
+<span class="sourceLineNo">639</span>    this.tablename = TableName.valueOf(tablenameBytes);<a name="line.639"></a>
+<span class="sourceLineNo">640</span>    clusterIds.clear();<a name="line.640"></a>
+<span class="sourceLineNo">641</span>    for (HBaseProtos.UUID clusterId : walKey.getClusterIdsList()) {<a name="line.641"></a>
+<span class="sourceLineNo">642</span>      clusterIds.add(new UUID(clusterId.getMostSigBits(), clusterId.getLeastSigBits()));<a name="line.642"></a>
+<span class="sourceLineNo">643</span>    }<a name="line.643"></a>
+<span class="sourceLineNo">644</span>    if (walKey.hasNonceGroup()) {<a name="line.644"></a>
+<span class="sourceLineNo">645</span>      this.nonceGroup = walKey.getNonceGroup();<a name="line.645"></a>
+<span class="sourceLineNo">646</span>    }<a name="line.646"></a>
+<span class="sourceLineNo">647</span>    if (walKey.hasNonce()) {<a name="line.647"></a>
+<span class="sourceLineNo">648</span>      this.nonce = walKey.getNonce();<a name="line.648"></a>
+<span class="sourceLineNo">649</span>    }<a name="line.649"></a>
+<span class="sourceLineNo">650</span>    this.replicationScope = null;<a name="line.650"></a>
+<span class="sourceLineNo">651</span>    if (walKey.getScopesCount() &gt; 0) {<a name="line.651"></a>
+<span class="sourceLineNo">652</span>      this.replicationScope = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.652"></a>
+<span class="sourceLineNo">653</span>      for (FamilyScope scope : walKey.getScopesList()) {<a name="line.653"></a>
+<span class="sourceLineNo">654</span>        byte[] family =<a name="line.654"></a>
+<span class="sourceLineNo">655</span>            uncompressor.uncompress(scope.getFamily(), CompressionContext.DictionaryIndex.FAMILY);<a name="line.655"></a>
+<span class="sourceLineNo">656</span>        this.replicationScope.put(family, scope.getScopeType().getNumber());<a name="line.656"></a>
+<span class="sourceLineNo">657</span>      }<a name="line.657"></a>
 <span class="sourceLineNo">658</span>    }<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    return size;<a name="line.659"></a>
-<span class="sourceLineNo">660</span>  }<a name="line.660"></a>
-<span class="sourceLineNo">661</span>}<a name="line.661"></a>
+<span class="sourceLineNo">659</span>    setSequenceId(walKey.getLogSequenceNumber());<a name="line.659"></a>
+<span class="sourceLineNo">660</span>    this.writeTime = walKey.getWriteTime();<a name="line.660"></a>
+<span class="sourceLineNo">661</span>    if (walKey.hasOrigSequenceNumber()) {<a name="line.661"></a>
+<span class="sourceLineNo">662</span>      this.origLogSeqNum = walKey.getOrigSequenceNumber();<a name="line.662"></a>
+<span class="sourceLineNo">663</span>    }<a name="line.663"></a>
+<span class="sourceLineNo">664</span>    if (walKey.getExtendedAttributesCount() &gt; 0){<a name="line.664"></a>
+<span class="sourceLineNo">665</span>      this.extendedAttributes = new HashMap&lt;&gt;(walKey.getExtendedAttributesCount());<a name="line.665"></a>
+<span class="sourceLineNo">666</span>      for (WALProtos.Attribute attr : walKey.getExtendedAttributesList()){<a name="line.666"></a>
+<span class="sourceLineNo">667</span>        byte[] value =<a name="line.667"></a>
+<span class="sourceLineNo">668</span>            uncompressor.uncompress(attr.getValue(), CompressionContext.DictionaryIndex.TABLE);<a name="line.668"></a>
+<span class="sourceLineNo">669</span>        extendedAttributes.put(attr.getKey(), value);<a name="line.669"></a>
+<span class="sourceLineNo">670</span>      }<a name="line.670"></a>
+<span class="sourceLineNo">671</span>    }<a name="line.671"></a>
+<span class="sourceLineNo">672</span>  }<a name="line.672"></a>
+<span class="sourceLineNo">673</span><a name="line.673"></a>
+<span class="sourceLineNo">674</span>  @Override<a name="line.674"></a>
+<span class="sourceLineNo">675</span>  public long estimatedSerializedSizeOf() {<a name="line.675"></a>
+<span class="sourceLineNo">676</span>    long size = encodedRegionName != null ? encodedRegionName.length : 0;<a name="line.676"></a>
+<span class="sourceLineNo">677</span>    size += tablename != null ? tablename.toBytes().length : 0;<a name="line.677"></a>
+<span class="sourceLineNo">678</span>    if (clusterIds != null) {<a name="line.678"></a>
+<span class="sourceLineNo">679</span>      size += 16 * clusterIds.size();<a name="line.679"></a>
+<span class="sourceLineNo">680</span>    }<a name="line.680"></a>
+<span class="sourceLineNo">681</span>    if (nonceGroup != HConstants.NO_NONCE) {<a name="line.681"></a>
+<span class="sourceLineNo">682</span>      size += Bytes.SIZEOF_LONG; // nonce group<a name="line.682"></a>
+<span class="sourceLineNo">683</span>    }<a name="line.683"></a>
+<span class="sourceLineNo">684</span>    if (nonce != HConstants.NO_NONCE) {<a name="line.684"></a>
+<span class="sourceLineNo">685</span>      size += Bytes.SIZEOF_LONG; // nonce<a name="line.685"></a>
+<span class="sourceLineNo">686</span>    }<a name="line.686"></a>
+<span class="sourceLineNo">687</span>    if (replicationScope != null) {<a name="line.687"></a>
+<span class="sourceLineNo">688</span>      for (Map.Entry&lt;byte[], Integer&gt; scope: replicationScope.entrySet()) {<a name="line.688"></a>
+<span class="sourceLineNo">689</span>        size += scope.getKey().length;<a name="line.689"></a>
+<span class="sourceLineNo">690</span>        size += Bytes.SIZEOF_INT;<a name="line.690"></a>
+<span class="sourceLineNo">691</span>      }<a name="line.691"></a>
+<span class="sourceLineNo">692</span>    }<a name="line.692"></a>
+<span class="sourceLineNo">693</span>    size += Bytes.SIZEOF_LONG; // sequence number<a name="line.693"></a>
+<span class="sourceLineNo">694</span>    size += Bytes.SIZEOF_LONG; // write time<a name="line.694"></a>
+<span class="sourceLineNo">695</span>    if (origLogSeqNum &gt; 0) {<a name="line.695"></a>
+<span class="sourceLineNo">696</span>      size += Bytes.SIZEOF_LONG; // original sequence number<a name="line.696"></a>
+<span class="sourceLineNo">697</span>    }<a name="line.697"></a>
+<span class="sourceLineNo">698</span>    return size;<a name="line.698"></a>
+<span class="sourceLineNo">699</span>  }<a name="line.699"></a>
+<span class="sourceLineNo">700</span>}<a name="line.700"></a>
 
 
 
diff --git a/downloads.html b/downloads.html
index fc74e11..d39a79d 100644
--- a/downloads.html
+++ b/downloads.html
@@ -394,7 +394,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-09</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-10</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/export_control.html b/export_control.html
index 4cc90f8..18ee08d 100644
--- a/export_control.html
+++ b/export_control.html
@@ -180,7 +180,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-09</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-10</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/index.html b/index.html
index 7ad03e7..463583d 100644
--- a/index.html
+++ b/index.html
@@ -258,7 +258,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-09</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-10</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/issue-tracking.html b/issue-tracking.html
index 82ae291..bc4c8c8 100644
--- a/issue-tracking.html
+++ b/issue-tracking.html
@@ -152,7 +152,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-09</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-10</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/mail-lists.html b/mail-lists.html
index ccf11c3..4bb97a3 100644
--- a/mail-lists.html
+++ b/mail-lists.html
@@ -205,7 +205,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-09</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-10</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/metrics.html b/metrics.html
index 2dc72d1..9c07a98 100644
--- a/metrics.html
+++ b/metrics.html
@@ -308,7 +308,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-09</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-10</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/old_news.html b/old_news.html
index 6ec5fc5..e1aed9c 100644
--- a/old_news.html
+++ b/old_news.html
@@ -299,7 +299,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-09</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-10</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/plugin-management.html b/plugin-management.html
index 06c92ca..faf2841 100644
--- a/plugin-management.html
+++ b/plugin-management.html
@@ -304,7 +304,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-09</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-10</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/plugins.html b/plugins.html
index 21165dc..72caeef 100644
--- a/plugins.html
+++ b/plugins.html
@@ -231,7 +231,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-09</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-10</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/poweredbyhbase.html b/poweredbyhbase.html
index 7554abf..19dda59 100644
--- a/poweredbyhbase.html
+++ b/poweredbyhbase.html
@@ -618,7 +618,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-09</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-10</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/project-info.html b/project-info.html
index caf427d..4c1c76d 100644
--- a/project-info.html
+++ b/project-info.html
@@ -193,7 +193,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-09</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-10</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/project-reports.html b/project-reports.html
index 8ec0dde..bc700a4 100644
--- a/project-reports.html
+++ b/project-reports.html
@@ -169,7 +169,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-09</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-10</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/project-summary.html b/project-summary.html
index d2b774e..8628833 100644
--- a/project-summary.html
+++ b/project-summary.html
@@ -195,7 +195,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-09</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-10</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/pseudo-distributed.html b/pseudo-distributed.html
index 68de384..cb9c951 100644
--- a/pseudo-distributed.html
+++ b/pseudo-distributed.html
@@ -157,7 +157,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-09</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-10</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/replication.html b/replication.html
index 65444fe..b09f7be 100644
--- a/replication.html
+++ b/replication.html
@@ -152,7 +152,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-09</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-10</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/resources.html b/resources.html
index bf13e7d..4630818 100644
--- a/resources.html
+++ b/resources.html
@@ -180,7 +180,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-09</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-10</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/source-repository.html b/source-repository.html
index 83673d8..397a9ce 100644
--- a/source-repository.html
+++ b/source-repository.html
@@ -163,7 +163,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-09</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-10</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/sponsors.html b/sponsors.html
index 8bea59d..941ed3f 100644
--- a/sponsors.html
+++ b/sponsors.html
@@ -182,7 +182,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-09</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-10</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/supportingprojects.html b/supportingprojects.html
index de9a527..9b77dee 100644
--- a/supportingprojects.html
+++ b/supportingprojects.html
@@ -369,7 +369,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-09</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-10</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/team-list.html b/team-list.html
index c4ee67b..04a95b9 100644
--- a/team-list.html
+++ b/team-list.html
@@ -666,7 +666,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-09</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-10</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/testdevapidocs/allclasses-frame.html b/testdevapidocs/allclasses-frame.html
index 1df76a7..52eff6c 100644
--- a/testdevapidocs/allclasses-frame.html
+++ b/testdevapidocs/allclasses-frame.html
@@ -1889,6 +1889,7 @@
 <li><a href="org/apache/hadoop/hbase/coprocessor/TestRegionObserverForAddingMutationsFromCoprocessors.TestWALObserver.html" title="class in org.apache.hadoop.hbase.coprocessor" target="classFrame">TestRegionObserverForAddingMutationsFromCoprocessors.TestWALObserver</a></li>
 <li><a href="org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html" title="class in org.apache.hadoop.hbase.coprocessor" target="classFrame">TestRegionObserverInterface</a></li>
 <li><a href="org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.EvenOnlyCompactor.html" title="class in org.apache.hadoop.hbase.coprocessor" target="classFrame">TestRegionObserverInterface.EvenOnlyCompactor</a></li>
+<li><a href="org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.PreWALAppendWALActionsListener.html" title="class in org.apache.hadoop.hbase.coprocessor" target="classFrame">TestRegionObserverInterface.PreWALAppendWALActionsListener</a></li>
 <li><a href="org/apache/hadoop/hbase/coprocessor/TestRegionObserverPreFlushAndPreCompact.html" title="class in org.apache.hadoop.hbase.coprocessor" target="classFrame">TestRegionObserverPreFlushAndPreCompact</a></li>
 <li><a href="org/apache/hadoop/hbase/coprocessor/TestRegionObserverPreFlushAndPreCompact.TestRegionObserver.html" title="class in org.apache.hadoop.hbase.coprocessor" target="classFrame">TestRegionObserverPreFlushAndPreCompact.TestRegionObserver</a></li>
 <li><a href="org/apache/hadoop/hbase/coprocessor/TestRegionObserverScannerOpenHook.html" title="class in org.apache.hadoop.hbase.coprocessor" target="classFrame">TestRegionObserverScannerOpenHook</a></li>
diff --git a/testdevapidocs/allclasses-noframe.html b/testdevapidocs/allclasses-noframe.html
index 6bb8f25..1505802 100644
--- a/testdevapidocs/allclasses-noframe.html
+++ b/testdevapidocs/allclasses-noframe.html
@@ -1889,6 +1889,7 @@
 <li><a href="org/apache/hadoop/hbase/coprocessor/TestRegionObserverForAddingMutationsFromCoprocessors.TestWALObserver.html" title="class in org.apache.hadoop.hbase.coprocessor">TestRegionObserverForAddingMutationsFromCoprocessors.TestWALObserver</a></li>
 <li><a href="org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html" title="class in org.apache.hadoop.hbase.coprocessor">TestRegionObserverInterface</a></li>
 <li><a href="org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.EvenOnlyCompactor.html" title="class in org.apache.hadoop.hbase.coprocessor">TestRegionObserverInterface.EvenOnlyCompactor</a></li>
+<li><a href="org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.PreWALAppendWALActionsListener.html" title="class in org.apache.hadoop.hbase.coprocessor">TestRegionObserverInterface.PreWALAppendWALActionsListener</a></li>
 <li><a href="org/apache/hadoop/hbase/coprocessor/TestRegionObserverPreFlushAndPreCompact.html" title="class in org.apache.hadoop.hbase.coprocessor">TestRegionObserverPreFlushAndPreCompact</a></li>
 <li><a href="org/apache/hadoop/hbase/coprocessor/TestRegionObserverPreFlushAndPreCompact.TestRegionObserver.html" title="class in org.apache.hadoop.hbase.coprocessor">TestRegionObserverPreFlushAndPreCompact.TestRegionObserver</a></li>
 <li><a href="org/apache/hadoop/hbase/coprocessor/TestRegionObserverScannerOpenHook.html" title="class in org.apache.hadoop.hbase.coprocessor">TestRegionObserverScannerOpenHook</a></li>
diff --git a/testdevapidocs/index-all.html b/testdevapidocs/index-all.html
index f35d21d..510557e 100644
--- a/testdevapidocs/index-all.html
+++ b/testdevapidocs/index-all.html
@@ -11847,6 +11847,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreStoreFileReaderOpen">ctPreStoreFileReaderOpen</a></span> - Variable in class org.apache.hadoop.hbase.coprocessor.<a href="org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html" title="class in org.apache.hadoop.hbase.coprocessor">SimpleRegionObserver</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreWALAppend">ctPreWALAppend</a></span> - Variable in class org.apache.hadoop.hbase.coprocessor.<a href="org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html" title="class in org.apache.hadoop.hbase.coprocessor">SimpleRegionObserver</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreWALRestore">ctPreWALRestore</a></span> - Variable in class org.apache.hadoop.hbase.coprocessor.<a href="org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html" title="class in org.apache.hadoop.hbase.coprocessor">SimpleRegionObserver</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/MultithreadedTestUtil.TestThread.html#ctx">ctx</a></span> - Variable in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/MultithreadedTestUtil.TestThread.html" title="class in org.apache.hadoop.hbase">MultithreadedTestUtil.TestThread</a></dt>
@@ -14636,6 +14638,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/security/visibility/ExpAsStringVisibilityLabelServiceImpl.html#expressionParser">expressionParser</a></span> - Variable in class org.apache.hadoop.hbase.security.visibility.<a href="org/apache/hadoop/hbase/security/visibility/ExpAsStringVisibilityLabelServiceImpl.html" title="class in org.apache.hadoop.hbase.security.visibility">ExpAsStringVisibilityLabelServiceImpl</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#extendedAttributes">extendedAttributes</a></span> - Variable in class org.apache.hadoop.hbase.coprocessor.<a href="org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html" title="class in org.apache.hadoop.hbase.coprocessor">SimpleRegionObserver</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/util/RedundantKVGenerator.ExtendedOffheapKeyValue.html#ExtendedOffheapKeyValue-java.nio.ByteBuffer-int-int-long-">ExtendedOffheapKeyValue(ByteBuffer, int, int, long)</a></span> - Constructor for class org.apache.hadoop.hbase.util.<a href="org/apache/hadoop/hbase/util/RedundantKVGenerator.ExtendedOffheapKeyValue.html" title="class in org.apache.hadoop.hbase.util">RedundantKVGenerator.ExtendedOffheapKeyValue</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/TestStoreScannerClosure.ExtendedStoreScanner.html#ExtendedStoreScanner-org.apache.hadoop.hbase.regionserver.HStore-org.apache.hadoop.hbase.regionserver.ScanInfo-org.apache.hadoop.hbase.client.Scan-java.util.NavigableSet-long-">ExtendedStoreScanner(HStore, ScanInfo, Scan, NavigableSet&lt;byte[]&gt;, long)</a></span> - Constructor for class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestStoreScannerClosure.ExtendedStoreScanner.html" title="class in org.apache.hadoop.hbase.regionserver">TestStoreScannerClosure.ExtendedStoreScanner</a></dt>
@@ -15158,6 +15162,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/coprocessor/TestPassCustomCellViaRegionObserver.html#FAMILY">FAMILY</a></span> - Static variable in class org.apache.hadoop.hbase.coprocessor.<a href="org/apache/hadoop/hbase/coprocessor/TestPassCustomCellViaRegionObserver.html" title="class in org.apache.hadoop.hbase.coprocessor">TestPassCustomCellViaRegionObserver</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html#FAMILY">FAMILY</a></span> - Static variable 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/filter/TestFilterFromRegionSide.html#FAMILY">FAMILY</a></span> - Static variable in class org.apache.hadoop.hbase.filter.<a href="org/apache/hadoop/hbase/filter/TestFilterFromRegionSide.html" title="class in org.apache.hadoop.hbase.filter">TestFilterFromRegionSide</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/filter/TestFilterListOrOperatorWithBlkCnt.html#family">family</a></span> - Variable in class org.apache.hadoop.hbase.filter.<a href="org/apache/hadoop/hbase/filter/TestFilterListOrOperatorWithBlkCnt.html" title="class in org.apache.hadoop.hbase.filter">TestFilterListOrOperatorWithBlkCnt</a></dt>
@@ -17581,6 +17587,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreReplayWALs--">getCtPreReplayWALs()</a></span> - Method in class org.apache.hadoop.hbase.coprocessor.<a href="org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html" title="class in org.apache.hadoop.hbase.coprocessor">SimpleRegionObserver</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreWALAppend--">getCtPreWALAppend()</a></span> - Method in class org.apache.hadoop.hbase.coprocessor.<a href="org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html" title="class in org.apache.hadoop.hbase.coprocessor">SimpleRegionObserver</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreWALRestore--">getCtPreWALRestore()</a></span> - Method in class org.apache.hadoop.hbase.coprocessor.<a href="org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html" title="class in org.apache.hadoop.hbase.coprocessor">SimpleRegionObserver</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/thrift/TestThriftServer.html#getCurrentCount-java.lang.String-int-org.apache.hadoop.hbase.thrift.ThriftMetrics-">getCurrentCount(String, int, ThriftMetrics)</a></span> - Method in class org.apache.hadoop.hbase.thrift.<a href="org/apache/hadoop/hbase/thrift/TestThriftServer.html" title="class in org.apache.hadoop.hbase.thrift">TestThriftServer</a></dt>
@@ -20677,6 +20685,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/mapreduce/TestWALRecordReader.html#getWalKeyImpl-long-java.util.NavigableMap-">getWalKeyImpl(long, NavigableMap&lt;byte[], Integer&gt;)</a></span> - Method in class org.apache.hadoop.hbase.mapreduce.<a href="org/apache/hadoop/hbase/mapreduce/TestWALRecordReader.html" title="class in org.apache.hadoop.hbase.mapreduce">TestWALRecordReader</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.PreWALAppendWALActionsListener.html#getWalKeysCorrectArray--">getWalKeysCorrectArray()</a></span> - Method in class org.apache.hadoop.hbase.coprocessor.<a href="org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.PreWALAppendWALActionsListener.html" title="class in org.apache.hadoop.hbase.coprocessor">TestRegionObserverInterface.PreWALAppendWALActionsListener</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/coprocessor/SampleRegionWALCoprocessor.html#getWALObserver--">getWALObserver()</a></span> - Method in class org.apache.hadoop.hbase.coprocessor.<a href="org/apache/hadoop/hbase/coprocessor/SampleRegionWALCoprocessor.html" title="class in org.apache.hadoop.hbase.coprocessor">SampleRegionWALCoprocessor</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/coprocessor/TestCoprocessorMetrics.CustomWALObserver.html#getWALObserver--">getWALObserver()</a></span> - Method in class org.apache.hadoop.hbase.coprocessor.<a href="org/apache/hadoop/hbase/coprocessor/TestCoprocessorMetrics.CustomWALObserver.html" title="class in org.apache.hadoop.hbase.coprocessor">TestCoprocessorMetrics.CustomWALObserver</a></dt>
@@ -31547,6 +31557,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/coprocessor/TestIncrementAndAppendWithNullResult.MyObserver.html#postAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-org.apache.hadoop.hbase.client.Result-">postAppend(ObserverContext&lt;RegionCoprocessorEnvironment&gt;, Append, Result)</a></span> - Method in class org.apache.hadoop.hbase.coprocessor.<a href="org/apache/hadoop/hbase/coprocessor/TestIncrementAndAppendWithNullResult.MyObserver.html" title="class in org.apache.hadoop.hbase.coprocessor">TestIncrementAndAppendWithNullResult.MyObserver</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.PreWALAppendWALActionsListener.html#postAppend-long-long-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">postAppend(long, long, WALKey, WALEdit)</a></span> - Method in class org.apache.hadoop.hbase.coprocessor.<a href="org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.PreWALAppendWALActionsListener.html" title="class in org.apache.hadoop.hbase.coprocessor">TestRegionObserverInterface.PreWALAppendWALActionsListener</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/coprocessor/TestPostIncrementAndAppendBeforeWAL.ChangeCellWithDifferntColumnFamilyObserver.html#postAppendBeforeWAL-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Mutation-java.util.List-">postAppendBeforeWAL(ObserverContext&lt;RegionCoprocessorEnvironment&gt;, Mutation, List&lt;Pair&lt;Cell, Cell&gt;&gt;)</a></span> - Method in class org.apache.hadoop.hbase.coprocessor.<a href="org/apache/hadoop/hbase/coprocessor/TestPostIncrementAndAppendBeforeWAL.ChangeCellWithDifferntColumnFamilyObserver.html" title="class in org.apache.hadoop.hbase.coprocessor">TestPostIncrementAndAppendBeforeWAL.ChangeCellWithDifferntColumnFamilyObserver</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/coprocessor/TestPostIncrementAndAppendBeforeWAL.ChangeCellWithNotExistColumnFamilyObserver.html#postAppendBeforeWAL-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Mutation-java.util.List-">postAppendBeforeWAL(ObserverContext&lt;RegionCoprocessorEnvironment&gt;, Mutation, List&lt;Pair&lt;Cell, Cell&gt;&gt;)</a></span> - Method in class org.apache.hadoop.hbase.coprocessor.<a href="org/apache/hadoop/hbase/coprocessor/TestPostIncrementAndAppendBeforeWAL.ChangeCellWithNotExistColumnFamilyObserver.html" title="class in org.apache.hadoop.hbase.coprocessor">TestPostIncrementAndAppendBeforeWAL.ChangeCellWithNotExistColumnFamilyObserver</a></dt>
@@ -32797,6 +32809,10 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/util/NonRepeatedEnvironmentEdge.html#prevTime">prevTime</a></span> - Variable in class org.apache.hadoop.hbase.util.<a href="org/apache/hadoop/hbase/util/NonRepeatedEnvironmentEdge.html" title="class in org.apache.hadoop.hbase.util">NonRepeatedEnvironmentEdge</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preWALAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">preWALAppend(ObserverContext&lt;RegionCoprocessorEnvironment&gt;, WALKey, WALEdit)</a></span> - Method in class org.apache.hadoop.hbase.coprocessor.<a href="org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html" title="class in org.apache.hadoop.hbase.coprocessor">SimpleRegionObserver</a></dt>
+<dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.PreWALAppendWALActionsListener.html#PreWALAppendWALActionsListener--">PreWALAppendWALActionsListener()</a></span> - Constructor for class org.apache.hadoop.hbase.coprocessor.<a href="org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.PreWALAppendWALActionsListener.html" title="class in org.apache.hadoop.hbase.coprocessor">TestRegionObserverInterface.PreWALAppendWALActionsListener</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/coprocessor/SampleRegionWALCoprocessor.html#preWALRestore-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">preWALRestore(ObserverContext&lt;? extends RegionCoprocessorEnvironment&gt;, RegionInfo, WALKey, WALEdit)</a></span> - Method in class org.apache.hadoop.hbase.coprocessor.<a href="org/apache/hadoop/hbase/coprocessor/SampleRegionWALCoprocessor.html" title="class in org.apache.hadoop.hbase.coprocessor">SampleRegionWALCoprocessor</a></dt>
 <dd>
 <div class="block">Triggered before  <code>HRegion</code> when WAL is
@@ -60951,6 +60967,14 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/io/hfile/TestHFileBlock.html#testPreviousOffsetInternals--">testPreviousOffsetInternals()</a></span> - Method in class org.apache.hadoop.hbase.io.hfile.<a href="org/apache/hadoop/hbase/io/hfile/TestHFileBlock.html" title="class in org.apache.hadoop.hbase.io.hfile">TestHFileBlock</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html#testPreWALAppend--">testPreWALAppend()</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/coprocessor/TestRegionObserverInterface.html#testPreWALAppendHook-org.apache.hadoop.hbase.client.Table-org.apache.hadoop.hbase.TableName-">testPreWALAppendHook(Table, TableName)</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/coprocessor/TestRegionObserverInterface.html#testPreWALAppendIsWrittenToWAL--">testPreWALAppendIsWrittenToWAL()</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/coprocessor/TestRegionObserverInterface.html#testPreWALAppendNotCalledOnMetaEdit--">testPreWALAppendNotCalledOnMetaEdit()</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/coprocessor/TestRegionObserverInterface.html#testPreWALRestoreSkip--">testPreWALRestoreSkip()</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/regionserver/TestRegionReplicaFailover.html#testPrimaryRegionKill--">testPrimaryRegionKill()</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestRegionReplicaFailover.html" title="class in org.apache.hadoop.hbase.regionserver">TestRegionReplicaFailover</a></dt>
@@ -62391,6 +62415,8 @@
 <dd>&nbsp;</dd>
 <dt><a href="org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.EvenOnlyCompactor.html" title="class in org.apache.hadoop.hbase.coprocessor"><span class="typeNameLink">TestRegionObserverInterface.EvenOnlyCompactor</span></a> - Class in <a href="org/apache/hadoop/hbase/coprocessor/package-summary.html">org.apache.hadoop.hbase.coprocessor</a></dt>
 <dd>&nbsp;</dd>
+<dt><a href="org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.PreWALAppendWALActionsListener.html" title="class in org.apache.hadoop.hbase.coprocessor"><span class="typeNameLink">TestRegionObserverInterface.PreWALAppendWALActionsListener</span></a> - Class in <a href="org/apache/hadoop/hbase/coprocessor/package-summary.html">org.apache.hadoop.hbase.coprocessor</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/coprocessor/TestCoprocessorMetrics.html#testRegionObserverMultiCoprocessor--">testRegionObserverMultiCoprocessor()</a></span> - Method in class org.apache.hadoop.hbase.coprocessor.<a href="org/apache/hadoop/hbase/coprocessor/TestCoprocessorMetrics.html" title="class in org.apache.hadoop.hbase.coprocessor">TestCoprocessorMetrics</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/coprocessor/TestCoprocessorMetrics.html#testRegionObserverMultiRegion--">testRegionObserverMultiRegion()</a></span> - Method in class org.apache.hadoop.hbase.coprocessor.<a href="org/apache/hadoop/hbase/coprocessor/TestCoprocessorMetrics.html" title="class in org.apache.hadoop.hbase.coprocessor">TestCoprocessorMetrics</a></dt>
@@ -73957,6 +73983,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/wal/TestWALReaderOnSecureWAL.html#WAL_ENCRYPTION">WAL_ENCRYPTION</a></span> - Static variable in class org.apache.hadoop.hbase.wal.<a href="org/apache/hadoop/hbase/wal/TestWALReaderOnSecureWAL.html" title="class in org.apache.hadoop.hbase.wal">TestWALReaderOnSecureWAL</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#WAL_EXTENDED_ATTRIBUTE_BYTES">WAL_EXTENDED_ATTRIBUTE_BYTES</a></span> - Static variable in class org.apache.hadoop.hbase.coprocessor.<a href="org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html" title="class in org.apache.hadoop.hbase.coprocessor">SimpleRegionObserver</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/replication/regionserver/TestSerialReplicationChecker.html#WAL_FILE_NAME">WAL_FILE_NAME</a></span> - Static 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>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/util/TestHBaseFsckCleanReplicationBarriers.html#WAL_FILE_NAME">WAL_FILE_NAME</a></span> - Static variable in class org.apache.hadoop.hbase.util.<a href="org/apache/hadoop/hbase/util/TestHBaseFsckCleanReplicationBarriers.html" title="class in org.apache.hadoop.hbase.util">TestHBaseFsckCleanReplicationBarriers</a></dt>
@@ -73999,6 +74027,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/test/IntegrationTestBigLinkedList.Generator.GeneratorMapper.html#walkersStop">walkersStop</a></span> - Variable in class org.apache.hadoop.hbase.test.<a href="org/apache/hadoop/hbase/test/IntegrationTestBigLinkedList.Generator.GeneratorMapper.html" title="class in org.apache.hadoop.hbase.test">IntegrationTestBigLinkedList.Generator.GeneratorMapper</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.PreWALAppendWALActionsListener.html#walKeysCorrect">walKeysCorrect</a></span> - Variable in class org.apache.hadoop.hbase.coprocessor.<a href="org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.PreWALAppendWALActionsListener.html" title="class in org.apache.hadoop.hbase.coprocessor">TestRegionObserverInterface.PreWALAppendWALActionsListener</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/test/IntegrationTestBigLinkedList.Generator.GeneratorMapper.ContinuousConcurrentWalker.html#walkLoop-long-">walkLoop(long)</a></span> - Method in class org.apache.hadoop.hbase.test.<a href="org/apache/hadoop/hbase/test/IntegrationTestBigLinkedList.Generator.GeneratorMapper.ContinuousConcurrentWalker.html" title="class in org.apache.hadoop.hbase.test">IntegrationTestBigLinkedList.Generator.GeneratorMapper.ContinuousConcurrentWalker</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/assignment/MockMasterServices.html#walManager">walManager</a></span> - Variable in class org.apache.hadoop.hbase.master.assignment.<a href="org/apache/hadoop/hbase/master/assignment/MockMasterServices.html" title="class in org.apache.hadoop.hbase.master.assignment">MockMasterServices</a></dt>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/TestJMXConnectorServer.MyAccessController.html b/testdevapidocs/org/apache/hadoop/hbase/TestJMXConnectorServer.MyAccessController.html
index 9a041fa..c448144 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/TestJMXConnectorServer.MyAccessController.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/TestJMXConnectorServer.MyAccessController.html
@@ -243,7 +243,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.RegionObserver</h3>
-<code>postAppend, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postExists, postFlush, postFlush, postGetOp, postIncrement, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postReplayWALs, postScannerNext, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preCommitStoreFile, preCompactScannerOpen, preCompactSelection, preFlush, preFlushScannerOpen, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, prePrepareTimeStampForDeleteVersion, preReplayWALs, preStoreFileReaderOpen, preStoreScannerOpen, preWALRestore</code></li>
+<code>postAppend, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postExists, postFlush, postFlush, postGetOp, postIncrement, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postReplayWALs, postScannerNext, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preCommitStoreFile, preCompactScannerOpen, preCompactSelection, preFlush, preFlushScannerOpen, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, prePrepareTimeStampForDeleteVersion, preReplayWALs, preStoreFileReaderOpen, preStoreScannerOpen, preWALAppend, preWALRestore</code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.org.apache.hadoop.hbase.coprocessor.RegionServerObserver">
diff --git a/testdevapidocs/org/apache/hadoop/hbase/client/AbstractTestAsyncTableRegionReplicasRead.FailPrimaryGetCP.html b/testdevapidocs/org/apache/hadoop/hbase/client/AbstractTestAsyncTableRegionReplicasRead.FailPrimaryGetCP.html
index f577a87..91d09aa 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/client/AbstractTestAsyncTableRegionReplicasRead.FailPrimaryGetCP.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/client/AbstractTestAsyncTableRegionReplicasRead.FailPrimaryGetCP.html
@@ -224,7 +224,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.RegionObserver</h3>
-<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preStoreFileReaderOpen, preStoreScannerOpen, preWALRestore</code></li>
+<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preStoreFileReaderOpen, preStoreScannerOpen, preWALAppend, preWALRestore</code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.org.apache.hadoop.hbase.coprocessor.RegionCoprocessor">
diff --git a/testdevapidocs/org/apache/hadoop/hbase/client/AbstractTestCITimeout.SleepAndFailFirstTime.html b/testdevapidocs/org/apache/hadoop/hbase/client/AbstractTestCITimeout.SleepAndFailFirstTime.html
index e82712f..ee90fc0 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/client/AbstractTestCITimeout.SleepAndFailFirstTime.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/client/AbstractTestCITimeout.SleepAndFailFirstTime.html
@@ -276,7 +276,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.RegionObserver</h3>
-<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preExists, preFlush, preFlush, preFlushScannerOpen, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALRestore</code></li>
+<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preExists, preFlush, preFlush, preFlushScannerOpen, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALAppend, preWALRestore</code></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/client/AbstractTestCITimeout.SleepCoprocessor.html b/testdevapidocs/org/apache/hadoop/hbase/client/AbstractTestCITimeout.SleepCoprocessor.html
index a2c8fca..c1c67b6 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/client/AbstractTestCITimeout.SleepCoprocessor.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/client/AbstractTestCITimeout.SleepCoprocessor.html
@@ -259,7 +259,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.RegionObserver</h3>
-<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preExists, preFlush, preFlush, preFlushScannerOpen, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALRestore</code></li>
+<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preExists, preFlush, preFlush, preFlushScannerOpen, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALAppend, preWALRestore</code></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/client/SleepAtFirstRpcCall.html b/testdevapidocs/org/apache/hadoop/hbase/client/SleepAtFirstRpcCall.html
index 62b0702..158a9a9 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/client/SleepAtFirstRpcCall.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/client/SleepAtFirstRpcCall.html
@@ -259,7 +259,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.RegionObserver</h3>
-<code>postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALRestore</code></li>
+<code>postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALAppend, preWALRestore</code></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/client/TestAsyncNonMetaRegionLocatorConcurrenyLimit.CountingRegionObserver.html b/testdevapidocs/org/apache/hadoop/hbase/client/TestAsyncNonMetaRegionLocatorConcurrenyLimit.CountingRegionObserver.html
index 7d83c19..5194d62 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/client/TestAsyncNonMetaRegionLocatorConcurrenyLimit.CountingRegionObserver.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/client/TestAsyncNonMetaRegionLocatorConcurrenyLimit.CountingRegionObserver.html
@@ -239,7 +239,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.RegionObserver</h3>
-<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALRestore</code></li>
+<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALAppend, preWALRestore</code></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/client/TestAsyncRegionLocator.SleepRegionObserver.html b/testdevapidocs/org/apache/hadoop/hbase/client/TestAsyncRegionLocator.SleepRegionObserver.html
index 12ed731..0844162 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/client/TestAsyncRegionLocator.SleepRegionObserver.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/client/TestAsyncRegionLocator.SleepRegionObserver.html
@@ -228,7 +228,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.RegionObserver</h3>
-<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preStoreFileReaderOpen, preStoreScannerOpen, preWALRestore</code></li>
+<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preStoreFileReaderOpen, preStoreScannerOpen, preWALAppend, preWALRestore</code></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/client/TestAsyncTableBatch.ErrorInjectObserver.html b/testdevapidocs/org/apache/hadoop/hbase/client/TestAsyncTableBatch.ErrorInjectObserver.html
index c929a28..8ba4d4f 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/client/TestAsyncTableBatch.ErrorInjectObserver.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/client/TestAsyncTableBatch.ErrorInjectObserver.html
@@ -229,7 +229,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.RegionObserver</h3>
-<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALRestore</code></li>
+<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALAppend, preWALRestore</code></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/client/TestAsyncTableNoncedRetry.SleepOnceCP.html b/testdevapidocs/org/apache/hadoop/hbase/client/TestAsyncTableNoncedRetry.SleepOnceCP.html
index fafef76..ed049fa 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/client/TestAsyncTableNoncedRetry.SleepOnceCP.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/client/TestAsyncTableNoncedRetry.SleepOnceCP.html
@@ -221,7 +221,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.RegionObserver</h3>
-<code>postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALRestore</code></li>
+<code>postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALAppend, preWALRestore</code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.org.apache.hadoop.hbase.coprocessor.RegionCoprocessor">
diff --git a/testdevapidocs/org/apache/hadoop/hbase/client/TestAsyncTableScanException.ErrorCP.html b/testdevapidocs/org/apache/hadoop/hbase/client/TestAsyncTableScanException.ErrorCP.html
index f398104..318a0b1 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/client/TestAsyncTableScanException.ErrorCP.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/client/TestAsyncTableScanException.ErrorCP.html
@@ -217,7 +217,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.RegionObserver</h3>
-<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALRestore</code></li>
+<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALAppend, preWALRestore</code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.org.apache.hadoop.hbase.coprocessor.RegionCoprocessor">
diff --git a/testdevapidocs/org/apache/hadoop/hbase/client/TestAsyncTableUseMetaReplicas.FailPrimaryMetaScanCp.html b/testdevapidocs/org/apache/hadoop/hbase/client/TestAsyncTableUseMetaReplicas.FailPrimaryMetaScanCp.html
index 7804c77..3dd0735 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/client/TestAsyncTableUseMetaReplicas.FailPrimaryMetaScanCp.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/client/TestAsyncTableUseMetaReplicas.FailPrimaryMetaScanCp.html
@@ -214,7 +214,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.RegionObserver</h3>
-<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preStoreFileReaderOpen, preStoreScannerOpen, preWALRestore</code></li>
+<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preStoreFileReaderOpen, preStoreScannerOpen, preWALAppend, preWALRestore</code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.org.apache.hadoop.hbase.coprocessor.RegionCoprocessor">
diff --git a/testdevapidocs/org/apache/hadoop/hbase/client/TestAvoidCellReferencesIntoShippedBlocks.CompactorRegionObserver.html b/testdevapidocs/org/apache/hadoop/hbase/client/TestAvoidCellReferencesIntoShippedBlocks.CompactorRegionObserver.html
index 19bc7b7..a84000e 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/client/TestAvoidCellReferencesIntoShippedBlocks.CompactorRegionObserver.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/client/TestAvoidCellReferencesIntoShippedBlocks.CompactorRegionObserver.html
@@ -232,7 +232,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.RegionObserver</h3>
-<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALRestore</code></li>
+<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALAppend, preWALRestore</code></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/client/TestBlockEvictionFromClient.CustomInnerRegionObserver.html b/testdevapidocs/org/apache/hadoop/hbase/client/TestBlockEvictionFromClient.CustomInnerRegionObserver.html
index 2e56d5e..80594c6 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/client/TestBlockEvictionFromClient.CustomInnerRegionObserver.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/client/TestBlockEvictionFromClient.CustomInnerRegionObserver.html
@@ -277,7 +277,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.RegionObserver</h3>
-<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALRestore</code></li>
+<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALAppend, preWALRestore</code></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/client/TestBlockEvictionFromClient.CustomInnerRegionObserverWrapper.html b/testdevapidocs/org/apache/hadoop/hbase/client/TestBlockEvictionFromClient.CustomInnerRegionObserverWrapper.html
index 841e657..f7cd3ce 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/client/TestBlockEvictionFromClient.CustomInnerRegionObserverWrapper.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/client/TestBlockEvictionFromClient.CustomInnerRegionObserverWrapper.html
@@ -243,7 +243,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.RegionObserver</h3>
-<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALRestore</code></li>
+<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALAppend, preWALRestore</code></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/client/TestClientOperationInterrupt.TestCoprocessor.html b/testdevapidocs/org/apache/hadoop/hbase/client/TestClientOperationInterrupt.TestCoprocessor.html
index 8c2920e..7363cb0 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/client/TestClientOperationInterrupt.TestCoprocessor.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/client/TestClientOperationInterrupt.TestCoprocessor.html
@@ -229,7 +229,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.RegionObserver</h3>
-<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALRestore</code></li>
+<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALAppend, preWALRestore</code></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/client/TestDropTimeoutRequest.SleepLongerAtFirstCoprocessor.html b/testdevapidocs/org/apache/hadoop/hbase/client/TestDropTimeoutRequest.SleepLongerAtFirstCoprocessor.html
index 1382b5c..32b742c 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/client/TestDropTimeoutRequest.SleepLongerAtFirstCoprocessor.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/client/TestDropTimeoutRequest.SleepLongerAtFirstCoprocessor.html
@@ -245,7 +245,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.RegionObserver</h3>
-<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALRestore</code></li>
+<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALAppend, preWALRestore</code></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/client/TestFromClientSide3.WaitingForMultiMutationsObserver.html b/testdevapidocs/org/apache/hadoop/hbase/client/TestFromClientSide3.WaitingForMultiMutationsObserver.html
index d631b63..cbb8368 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/client/TestFromClientSide3.WaitingForMultiMutationsObserver.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/client/TestFromClientSide3.WaitingForMultiMutationsObserver.html
@@ -239,7 +239,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.RegionObserver</h3>
-<code>postAppend, postAppendBeforeWAL, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALRestore</code></li>
+<code>postAppend, postAppendBeforeWAL, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALAppend, preWALRestore</code></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/client/TestFromClientSide3.WaitingForScanObserver.html b/testdevapidocs/org/apache/hadoop/hbase/client/TestFromClientSide3.WaitingForScanObserver.html
index 6fd2201..eac82d1 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/client/TestFromClientSide3.WaitingForScanObserver.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/client/TestFromClientSide3.WaitingForScanObserver.html
@@ -245,7 +245,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.RegionObserver</h3>
-<code>postAppend, postAppendBeforeWAL, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALRestore</code></li>
+<code>postAppend, postAppendBeforeWAL, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALAppend, preWALRestore</code></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/client/TestMobCloneSnapshotFromClientCloneLinksAfterDelete.DelayFlushCoprocessor.html b/testdevapidocs/org/apache/hadoop/hbase/client/TestMobCloneSnapshotFromClientCloneLinksAfterDelete.DelayFlushCoprocessor.html
index d26b70d..b0c72f1 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/client/TestMobCloneSnapshotFromClientCloneLinksAfterDelete.DelayFlushCoprocessor.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/client/TestMobCloneSnapshotFromClientCloneLinksAfterDelete.DelayFlushCoprocessor.html
@@ -229,7 +229,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.RegionObserver</h3>
-<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALRestore</code></li>
+<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALAppend, preWALRestore</code></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/client/TestReplicaWithCluster.RegionServerHostingPrimayMetaRegionSlowOrStopCopro.html b/testdevapidocs/org/apache/hadoop/hbase/client/TestReplicaWithCluster.RegionServerHostingPrimayMetaRegionSlowOrStopCopro.html
index 536ec57..213b625 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/client/TestReplicaWithCluster.RegionServerHostingPrimayMetaRegionSlowOrStopCopro.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/client/TestReplicaWithCluster.RegionServerHostingPrimayMetaRegionSlowOrStopCopro.html
@@ -250,7 +250,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.RegionObserver</h3>
-<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preStoreFileReaderOpen, preStoreScannerOpen, preWALRestore</code></li>
+<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preStoreFileReaderOpen, preStoreScannerOpen, preWALAppend, preWALRestore</code></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/client/TestReplicaWithCluster.RegionServerStoppedCopro.html b/testdevapidocs/org/apache/hadoop/hbase/client/TestReplicaWithCluster.RegionServerStoppedCopro.html
index 5ef108f..9e5da7c 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/client/TestReplicaWithCluster.RegionServerStoppedCopro.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/client/TestReplicaWithCluster.RegionServerStoppedCopro.html
@@ -235,7 +235,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.RegionObserver</h3>
-<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preStoreFileReaderOpen, preStoreScannerOpen, preWALRestore</code></li>
+<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preStoreFileReaderOpen, preStoreScannerOpen, preWALAppend, preWALRestore</code></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/client/TestReplicaWithCluster.SlowMeCopro.html b/testdevapidocs/org/apache/hadoop/hbase/client/TestReplicaWithCluster.SlowMeCopro.html
index 448e0ae..fb9f3b8 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/client/TestReplicaWithCluster.SlowMeCopro.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/client/TestReplicaWithCluster.SlowMeCopro.html
@@ -245,7 +245,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.RegionObserver</h3>
-<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALRestore</code></li>
+<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALAppend, preWALRestore</code></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/client/TestReplicasClient.SlowMeCopro.html b/testdevapidocs/org/apache/hadoop/hbase/client/TestReplicasClient.SlowMeCopro.html
index 8eb6351..52bc780 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/client/TestReplicasClient.SlowMeCopro.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/client/TestReplicasClient.SlowMeCopro.html
@@ -286,7 +286,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.RegionObserver</h3>
-<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preStoreFileReaderOpen, preStoreScannerOpen, preWALRestore</code></li>
+<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preStoreFileReaderOpen, preStoreScannerOpen, preWALAppend, preWALRestore</code></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/client/TestResultFromCoprocessor.MyObserver.html b/testdevapidocs/org/apache/hadoop/hbase/client/TestResultFromCoprocessor.MyObserver.html
index 41fb733..92e50a8 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/client/TestResultFromCoprocessor.MyObserver.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/client/TestResultFromCoprocessor.MyObserver.html
@@ -243,7 +243,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.RegionObserver</h3>
-<code>postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALRestore</code></li>
+<code>postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALAppend, preWALRestore</code></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/client/TestServerBusyException.SleepCoprocessor.html b/testdevapidocs/org/apache/hadoop/hbase/client/TestServerBusyException.SleepCoprocessor.html
index 8cff9be..16311cc 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/client/TestServerBusyException.SleepCoprocessor.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/client/TestServerBusyException.SleepCoprocessor.html
@@ -259,7 +259,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.RegionObserver</h3>
-<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preExists, preFlush, preFlush, preFlushScannerOpen, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALRestore</code></li>
+<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preExists, preFlush, preFlush, preFlushScannerOpen, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALAppend, preWALRestore</code></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/client/TestServerBusyException.SleepLongerAtFirstCoprocessor.html b/testdevapidocs/org/apache/hadoop/hbase/client/TestServerBusyException.SleepLongerAtFirstCoprocessor.html
index d1c0159..c6bd577 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/client/TestServerBusyException.SleepLongerAtFirstCoprocessor.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/client/TestServerBusyException.SleepLongerAtFirstCoprocessor.html
@@ -244,7 +244,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.RegionObserver</h3>
-<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALRestore</code></li>
+<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALAppend, preWALRestore</code></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/client/TestTableOperationException.ThrowDoNotRetryIOExceptionCoprocessor.html b/testdevapidocs/org/apache/hadoop/hbase/client/TestTableOperationException.ThrowDoNotRetryIOExceptionCoprocessor.html
index e39b656..3ff15b2 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/client/TestTableOperationException.ThrowDoNotRetryIOExceptionCoprocessor.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/client/TestTableOperationException.ThrowDoNotRetryIOExceptionCoprocessor.html
@@ -253,7 +253,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.RegionObserver</h3>
-<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preExists, preFlush, preFlush, preFlushScannerOpen, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALRestore</code></li>
+<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preExists, preFlush, preFlush, preFlushScannerOpen, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALAppend, preWALRestore</code></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/client/TestTableOperationException.ThrowIOExceptionCoprocessor.html b/testdevapidocs/org/apache/hadoop/hbase/client/TestTableOperationException.ThrowIOExceptionCoprocessor.html
index c402017..fa03682 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/client/TestTableOperationException.ThrowIOExceptionCoprocessor.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/client/TestTableOperationException.ThrowIOExceptionCoprocessor.html
@@ -253,7 +253,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.RegionObserver</h3>
-<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preExists, preFlush, preFlush, preFlushScannerOpen, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALRestore</code></li>
+<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preExists, preFlush, preFlush, preFlushScannerOpen, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALAppend, preWALRestore</code></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/coprocessor/SampleRegionWALCoprocessor.html b/testdevapidocs/org/apache/hadoop/hbase/coprocessor/SampleRegionWALCoprocessor.html
index 4d7d478..775f29f 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/coprocessor/SampleRegionWALCoprocessor.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/coprocessor/SampleRegionWALCoprocessor.html
@@ -377,7 +377,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.RegionObserver</h3>
-<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen</code></li>
+<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALAppend</code></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html b/testdevapidocs/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html
index 04e8093..130b219 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.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,"i20":10,"i21":10,"i22":10,"i23":10,"i24":10,"i25":10,"i26":10,"i27":10,"i28":10,"i29":10,"i30":10,"i31":10,"i32":10,"i33":10,"i34":10,"i35":10,"i36":10,"i37":10,"i38":10,"i39":10,"i40":10,"i41":10,"i42":10,"i43":10,"i44":10,"i45":10,"i46":10,"i47":10,"i48":10,"i49":10,"i50":10,"i51":10,"i52":10,"i53":10,"i54":10,"i55":10,"i56":10,"i57":10,"i58":10,"i59":10,"i60":10,"i61":10,"i62":10,"i63":10,"i64":10,"i65":10,"i66":10,"i67":10,"i68":10,"i69":10,"i70":10,"i71":10,"i72":10,"i73":10,"i74":10,"i75":10,"i76":10,"i77":10,"i78":10,"i79":10,"i80":10,"i81":10,"i82":10,"i83":10,"i84":10,"i85":10,"i86":10,"i87":10,"i88":10,"i89":10,"i90":10,"i91":10,"i92":10,"i93":10,"i94":10,"i95":10,"i96":10,"i97":10,"i98":10,"i99":10,"i100":10,"i101":10,"i102":10,"i103":10,"i104":10,"i105":10,"i106":10,"i107":10,"i108":10,"i109":10,"i110":10,"i111":10,"i112":10,"i113":10,"i114":10,"i115":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,"i22":10,"i23":10,"i24":10,"i25":10,"i26":10,"i27":10,"i28":10,"i29":10,"i30":10,"i31":10,"i32":10,"i33":10,"i34":10,"i35":10,"i36":10,"i37":10,"i38":10,"i39":10,"i40":10,"i41":10,"i42":10,"i43":10,"i44":10,"i45":10,"i46":10,"i47":10,"i48":10,"i49":10,"i50":10,"i51":10,"i52":10,"i53":10,"i54":10,"i55":10,"i56":10,"i57":10,"i58":10,"i59":10,"i60":10,"i61":10,"i62":10,"i63":10,"i64":10,"i65":10,"i66":10,"i67":10,"i68":10,"i69":10,"i70":10,"i71":10,"i72":10,"i73":10,"i74":10,"i75":10,"i76":10,"i77":10,"i78":10,"i79":10,"i80":10,"i81":10,"i82":10,"i83":10,"i84":10,"i85":10,"i86":10,"i87":10,"i88":10,"i89":10,"i90":10,"i91":10,"i92":10,"i93":10,"i94":10,"i95":10,"i96":10,"i97":10,"i98":10,"i99":10,"i100":10,"i101":10,"i102":10,"i103":10,"i104":10,"i105":10,"i106":10,"i107":10,"i108":10,"i109":10,"i110":10,"i111":10,"i112":10,"i113":10,"i114":10,"i115":10,"i116":10,"i117":10};
 var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
@@ -117,7 +117,7 @@
 </dl>
 <hr>
 <br>
-<pre>public class <a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.74">SimpleRegionObserver</a>
+<pre>public class <a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.75">SimpleRegionObserver</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 org.apache.hadoop.hbase.coprocessor.RegionCoprocessor, org.apache.hadoop.hbase.coprocessor.RegionObserver</pre>
 <div class="block">A sample region observer that tests the RegionObserver interface.
@@ -360,8 +360,16 @@
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><code>(package 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/coprocessor/SimpleRegionObserver.html#ctPreWALAppend">ctPreWALAppend</a></span></code>&nbsp;</td>
+</tr>
+<tr class="altColor">
+<td class="colFirst"><code>(package 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/coprocessor/SimpleRegionObserver.html#ctPreWALRestore">ctPreWALRestore</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/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>,byte[]&gt;</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#extendedAttributes">extendedAttributes</a></span></code>&nbsp;</td>
+</tr>
 <tr class="altColor">
 <td class="colFirst"><code>(package 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/coprocessor/SimpleRegionObserver.html#TABLE_SKIPPED">TABLE_SKIPPED</a></span></code>&nbsp;</td>
@@ -370,6 +378,10 @@
 <td class="colFirst"><code>(package private) <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></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#throwOnPostFlush">throwOnPostFlush</a></span></code>&nbsp;</td>
 </tr>
+<tr class="altColor">
+<td class="colFirst"><code>(package private) static byte[]</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#WAL_EXTENDED_ATTRIBUTE_BYTES">WAL_EXTENDED_ATTRIBUTE_BYTES</a></span></code>&nbsp;</td>
+</tr>
 </table>
 <ul class="blockList">
 <li class="blockList"><a name="fields.inherited.from.class.org.apache.hadoop.hbase.Coprocessor">
@@ -507,156 +519,160 @@
 </tr>
 <tr id="i24" class="altColor">
 <td class="colFirst"><code>int</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreWALRestore--">getCtPreWALRestore</a></span>()</code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreWALAppend--">getCtPreWALAppend</a></span>()</code>&nbsp;</td>
 </tr>
 <tr id="i25" class="rowColor">
+<td class="colFirst"><code>int</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreWALRestore--">getCtPreWALRestore</a></span>()</code>&nbsp;</td>
+</tr>
+<tr id="i26" class="altColor">
 <td class="colFirst"><code><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;org.apache.hadoop.hbase.coprocessor.RegionObserver&gt;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getRegionObserver--">getRegionObserver</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i26" class="altColor">
+<tr id="i27" class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadDelete--">hadDelete</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i27" class="rowColor">
+<tr id="i28" class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadDeleted--">hadDeleted</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i28" class="altColor">
+<tr id="i29" class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostAppend--">hadPostAppend</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i29" class="rowColor">
+<tr id="i30" class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostBatchMutate--">hadPostBatchMutate</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i30" class="altColor">
+<tr id="i31" class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostBatchMutateIndispensably--">hadPostBatchMutateIndispensably</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i31" class="rowColor">
+<tr id="i32" class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostBulkLoadHFile--">hadPostBulkLoadHFile</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i32" class="altColor">
+<tr id="i33" class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostCheckAndDelete--">hadPostCheckAndDelete</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i33" class="rowColor">
+<tr id="i34" class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostCheckAndPut--">hadPostCheckAndPut</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i34" class="altColor">
+<tr id="i35" class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostCloseRegionOperation--">hadPostCloseRegionOperation</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i35" class="rowColor">
+<tr id="i36" class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostGet--">hadPostGet</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i36" class="altColor">
+<tr id="i37" class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostIncrement--">hadPostIncrement</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i37" class="rowColor">
+<tr id="i38" class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostPut--">hadPostPut</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i38" class="altColor">
+<tr id="i39" class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostReplayWALs--">hadPostReplayWALs</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i39" class="rowColor">
+<tr id="i40" class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostStartRegionOperation--">hadPostStartRegionOperation</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i40" class="altColor">
+<tr id="i41" class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostWALRestore--">hadPostWALRestore</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i41" class="rowColor">
+<tr id="i42" class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreAppend--">hadPreAppend</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i42" class="altColor">
+<tr id="i43" class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreAppendAfterRowLock--">hadPreAppendAfterRowLock</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i43" class="rowColor">
+<tr id="i44" class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreBatchMutate--">hadPreBatchMutate</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i44" class="altColor">
+<tr id="i45" class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreBulkLoadHFile--">hadPreBulkLoadHFile</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i45" class="rowColor">
+<tr id="i46" class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreCheckAndDelete--">hadPreCheckAndDelete</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i46" class="altColor">
+<tr id="i47" class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreCheckAndDeleteAfterRowLock--">hadPreCheckAndDeleteAfterRowLock</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i47" class="rowColor">
+<tr id="i48" class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreCheckAndPut--">hadPreCheckAndPut</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i48" class="altColor">
+<tr id="i49" class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreCheckAndPutAfterRowLock--">hadPreCheckAndPutAfterRowLock</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i49" class="rowColor">
+<tr id="i50" class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreGet--">hadPreGet</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i50" class="altColor">
+<tr id="i51" class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreIncrement--">hadPreIncrement</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i51" class="rowColor">
+<tr id="i52" class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreIncrementAfterRowLock--">hadPreIncrementAfterRowLock</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i52" class="altColor">
+<tr id="i53" class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPrePreparedDeleteTS--">hadPrePreparedDeleteTS</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i53" class="rowColor">
+<tr id="i54" class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPrePut--">hadPrePut</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i54" class="altColor">
+<tr id="i55" class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreReplayWALs--">hadPreReplayWALs</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i55" class="rowColor">
+<tr id="i56" class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreWALRestore--">hadPreWALRestore</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i56" class="altColor">
+<tr id="i57" class="rowColor">
 <td class="colFirst"><code>org.apache.hadoop.hbase.client.Result</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-org.apache.hadoop.hbase.client.Result-">postAppend</a></span>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;e,
           org.apache.hadoop.hbase.client.Append&nbsp;append,
           org.apache.hadoop.hbase.client.Result&nbsp;result)</code>&nbsp;</td>
 </tr>
-<tr id="i57" class="rowColor">
+<tr id="i58" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postBatchMutate-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-">postBatchMutate</a></span>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
                org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress&lt;org.apache.hadoop.hbase.client.Mutation&gt;&nbsp;miniBatchOp)</code>&nbsp;</td>
 </tr>
-<tr id="i58" class="altColor">
+<tr id="i59" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postBatchMutateIndispensably-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-boolean-">postBatchMutateIndispensably</a></span>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;ctx,
                             org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress&lt;org.apache.hadoop.hbase.client.Mutation&gt;&nbsp;miniBatchOp,
                             boolean&nbsp;success)</code>&nbsp;</td>
 </tr>
-<tr id="i59" class="rowColor">
+<tr id="i60" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postBulkLoadHFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.List-java.util.Map-">postBulkLoadHFile</a></span>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;ctx,
                  <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.hbase.util.Pair&lt;byte[],<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;familyPaths,
                  <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;org.apache.hadoop.fs.Path&gt;&gt;&nbsp;map)</code>&nbsp;</td>
 </tr>
-<tr id="i60" class="altColor">
+<tr id="i61" class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postCheckAndDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">postCheckAndDelete</a></span>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;e,
                   byte[]&nbsp;row,
@@ -667,7 +683,7 @@
                   org.apache.hadoop.hbase.client.Delete&nbsp;delete,
                   boolean&nbsp;result)</code>&nbsp;</td>
 </tr>
-<tr id="i61" class="rowColor">
+<tr id="i62" class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postCheckAndPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">postCheckAndPut</a></span>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;e,
                byte[]&nbsp;row,
@@ -678,17 +694,17 @@
                org.apache.hadoop.hbase.client.Put&nbsp;put,
                boolean&nbsp;result)</code>&nbsp;</td>
 </tr>
-<tr id="i62" class="altColor">
+<tr id="i63" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-boolean-">postClose</a></span>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
          boolean&nbsp;abortRequested)</code>&nbsp;</td>
 </tr>
-<tr id="i63" class="rowColor">
+<tr id="i64" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postCloseRegionOperation-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Region.Operation-">postCloseRegionOperation</a></span>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;ctx,
                         org.apache.hadoop.hbase.regionserver.Region.Operation&nbsp;op)</code>&nbsp;</td>
 </tr>
-<tr id="i64" class="altColor">
+<tr id="i65" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postCompact-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.StoreFile-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">postCompact</a></span>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
            org.apache.hadoop.hbase.regionserver.Store&nbsp;store,
@@ -696,7 +712,7 @@
            org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker&nbsp;tracker,
            org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest&nbsp;request)</code>&nbsp;</td>
 </tr>
-<tr id="i65" class="rowColor">
+<tr id="i66" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postCompactSelection-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-java.util.List-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">postCompactSelection</a></span>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
                     org.apache.hadoop.hbase.regionserver.Store&nbsp;store,
@@ -704,62 +720,62 @@
                     org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker&nbsp;tracker,
                     org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest&nbsp;request)</code>&nbsp;</td>
 </tr>
-<tr id="i66" class="altColor">
+<tr id="i67" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Delete-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">postDelete</a></span>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
           org.apache.hadoop.hbase.client.Delete&nbsp;delete,
           org.apache.hadoop.hbase.wal.WALEdit&nbsp;edit,
           org.apache.hadoop.hbase.client.Durability&nbsp;durability)</code>&nbsp;</td>
 </tr>
-<tr id="i67" class="rowColor">
+<tr id="i68" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.StoreFile-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">postFlush</a></span>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
          org.apache.hadoop.hbase.regionserver.Store&nbsp;store,
          org.apache.hadoop.hbase.regionserver.StoreFile&nbsp;resultFile,
          org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker&nbsp;tracker)</code>&nbsp;</td>
 </tr>
-<tr id="i68" class="altColor">
+<tr id="i69" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postGetOp-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-java.util.List-">postGetOp</a></span>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
          org.apache.hadoop.hbase.client.Get&nbsp;get,
          <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.hbase.Cell&gt;&nbsp;results)</code>&nbsp;</td>
 </tr>
-<tr id="i69" class="rowColor">
+<tr id="i70" class="altColor">
 <td class="colFirst"><code>org.apache.hadoop.hbase.client.Result</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postIncrement-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-org.apache.hadoop.hbase.client.Result-">postIncrement</a></span>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
              org.apache.hadoop.hbase.client.Increment&nbsp;increment,
              org.apache.hadoop.hbase.client.Result&nbsp;result)</code>&nbsp;</td>
 </tr>
-<tr id="i70" class="altColor">
+<tr id="i71" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-">postOpen</a></span>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c)</code>&nbsp;</td>
 </tr>
-<tr id="i71" class="rowColor">
+<tr id="i72" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Put-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">postPut</a></span>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
        org.apache.hadoop.hbase.client.Put&nbsp;put,
        org.apache.hadoop.hbase.wal.WALEdit&nbsp;edit,
        org.apache.hadoop.hbase.client.Durability&nbsp;durability)</code>&nbsp;</td>
 </tr>
-<tr id="i72" class="altColor">
+<tr id="i73" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postReplayWALs-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.fs.Path-">postReplayWALs</a></span>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;env,
               org.apache.hadoop.hbase.client.RegionInfo&nbsp;info,
               org.apache.hadoop.fs.Path&nbsp;edits)</code>&nbsp;</td>
 </tr>
-<tr id="i73" class="rowColor">
+<tr id="i74" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postScannerClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-">postScannerClose</a></span>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
                 org.apache.hadoop.hbase.regionserver.InternalScanner&nbsp;s)</code>&nbsp;</td>
 </tr>
-<tr id="i74" class="altColor">
+<tr id="i75" class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postScannerFilterRow-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.Cell-boolean-">postScannerFilterRow</a></span>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;e,
                     org.apache.hadoop.hbase.regionserver.InternalScanner&nbsp;s,
                     org.apache.hadoop.hbase.Cell&nbsp;currentRow,
                     boolean&nbsp;hasMore)</code>&nbsp;</td>
 </tr>
-<tr id="i75" class="rowColor">
+<tr id="i76" class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postScannerNext-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-java.util.List-int-boolean-">postScannerNext</a></span>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
                org.apache.hadoop.hbase.regionserver.InternalScanner&nbsp;s,
@@ -767,18 +783,18 @@
                int&nbsp;limit,
                boolean&nbsp;hasMore)</code>&nbsp;</td>
 </tr>
-<tr id="i76" class="altColor">
+<tr id="i77" class="rowColor">
 <td class="colFirst"><code>org.apache.hadoop.hbase.regionserver.RegionScanner</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Scan-org.apache.hadoop.hbase.regionserver.RegionScanner-">postScannerOpen</a></span>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
                org.apache.hadoop.hbase.client.Scan&nbsp;scan,
                org.apache.hadoop.hbase.regionserver.RegionScanner&nbsp;s)</code>&nbsp;</td>
 </tr>
-<tr id="i77" class="rowColor">
+<tr id="i78" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postStartRegionOperation-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Region.Operation-">postStartRegionOperation</a></span>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;ctx,
                         org.apache.hadoop.hbase.regionserver.Region.Operation&nbsp;op)</code>&nbsp;</td>
 </tr>
-<tr id="i78" class="altColor">
+<tr id="i79" class="rowColor">
 <td class="colFirst"><code>org.apache.hadoop.hbase.regionserver.StoreFileReader</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postStoreFileReaderOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-org.apache.hadoop.hbase.io.FSDataInputStreamWrapper-long-org.apache.hadoop.hbase.io.hfile.CacheConfig-org.apache.hadoop.hbase.io.Reference-org.apache.hadoop.hbase.regionserver.StoreFileReader-">postStoreFileReaderOpen</a></span>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;ctx,
                        org.apache.hadoop.fs.FileSystem&nbsp;fs,
@@ -789,34 +805,34 @@
                        org.apache.hadoop.hbase.io.Reference&nbsp;r,
                        org.apache.hadoop.hbase.regionserver.StoreFileReader&nbsp;reader)</code>&nbsp;</td>
 </tr>
-<tr id="i79" class="rowColor">
+<tr id="i80" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postWALRestore-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">postWALRestore</a></span>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;env,
               org.apache.hadoop.hbase.client.RegionInfo&nbsp;info,
               org.apache.hadoop.hbase.wal.WALKey&nbsp;logKey,
               org.apache.hadoop.hbase.wal.WALEdit&nbsp;logEdit)</code>&nbsp;</td>
 </tr>
-<tr id="i80" class="altColor">
+<tr id="i81" class="rowColor">
 <td class="colFirst"><code>org.apache.hadoop.hbase.client.Result</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-">preAppend</a></span>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;e,
          org.apache.hadoop.hbase.client.Append&nbsp;append)</code>&nbsp;</td>
 </tr>
-<tr id="i81" class="rowColor">
+<tr id="i82" class="altColor">
 <td class="colFirst"><code>org.apache.hadoop.hbase.client.Result</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preAppendAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-">preAppendAfterRowLock</a></span>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;e,
                      org.apache.hadoop.hbase.client.Append&nbsp;append)</code>&nbsp;</td>
 </tr>
-<tr id="i82" class="altColor">
+<tr id="i83" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preBatchMutate-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-">preBatchMutate</a></span>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
               org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress&lt;org.apache.hadoop.hbase.client.Mutation&gt;&nbsp;miniBatchOp)</code>&nbsp;</td>
 </tr>
-<tr id="i83" class="rowColor">
+<tr id="i84" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preBulkLoadHFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.List-">preBulkLoadHFile</a></span>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;ctx,
                 <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.hbase.util.Pair&lt;byte[],<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;familyPaths)</code>&nbsp;</td>
 </tr>
-<tr id="i84" class="altColor">
+<tr id="i85" class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preCheckAndDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">preCheckAndDelete</a></span>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;e,
                  byte[]&nbsp;row,
@@ -827,7 +843,7 @@
                  org.apache.hadoop.hbase.client.Delete&nbsp;delete,
                  boolean&nbsp;result)</code>&nbsp;</td>
 </tr>
-<tr id="i85" class="rowColor">
+<tr id="i86" class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preCheckAndDeleteAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">preCheckAndDeleteAfterRowLock</a></span>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;e,
                              byte[]&nbsp;row,
@@ -838,7 +854,7 @@
                              org.apache.hadoop.hbase.client.Delete&nbsp;delete,
                              boolean&nbsp;result)</code>&nbsp;</td>
 </tr>
-<tr id="i86" class="altColor">
+<tr id="i87" class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preCheckAndPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">preCheckAndPut</a></span>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;e,
               byte[]&nbsp;row,
@@ -849,7 +865,7 @@
               org.apache.hadoop.hbase.client.Put&nbsp;put,
               boolean&nbsp;result)</code>&nbsp;</td>
 </tr>
-<tr id="i87" class="rowColor">
+<tr id="i88" class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preCheckAndPutAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">preCheckAndPutAfterRowLock</a></span>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;e,
                           byte[]&nbsp;row,
@@ -860,12 +876,12 @@
                           org.apache.hadoop.hbase.client.Put&nbsp;put,
                           boolean&nbsp;result)</code>&nbsp;</td>
 </tr>
-<tr id="i88" class="altColor">
+<tr id="i89" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-boolean-">preClose</a></span>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
         boolean&nbsp;abortRequested)</code>&nbsp;</td>
 </tr>
-<tr id="i89" class="rowColor">
+<tr id="i90" class="altColor">
 <td class="colFirst"><code>org.apache.hadoop.hbase.regionserver.InternalScanner</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preCompact-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.regionserver.ScanType-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">preCompact</a></span>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
           org.apache.hadoop.hbase.regionserver.Store&nbsp;store,
@@ -874,48 +890,48 @@
           org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker&nbsp;tracker,
           org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest&nbsp;request)</code>&nbsp;</td>
 </tr>
-<tr id="i90" class="altColor">
+<tr id="i91" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preCompactSelection-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-java.util.List-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-">preCompactSelection</a></span>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
                    org.apache.hadoop.hbase.regionserver.Store&nbsp;store,
                    <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;? extends org.apache.hadoop.hbase.regionserver.StoreFile&gt;&nbsp;candidates,
                    org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker&nbsp;tracker)</code>&nbsp;</td>
 </tr>
-<tr id="i91" class="rowColor">
+<tr id="i92" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Delete-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">preDelete</a></span>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
          org.apache.hadoop.hbase.client.Delete&nbsp;delete,
          org.apache.hadoop.hbase.wal.WALEdit&nbsp;edit,
          org.apache.hadoop.hbase.client.Durability&nbsp;durability)</code>&nbsp;</td>
 </tr>
-<tr id="i92" class="altColor">
+<tr id="i93" class="rowColor">
 <td class="colFirst"><code>org.apache.hadoop.hbase.regionserver.InternalScanner</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">preFlush</a></span>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
         org.apache.hadoop.hbase.regionserver.Store&nbsp;store,
         org.apache.hadoop.hbase.regionserver.InternalScanner&nbsp;scanner,
         org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker&nbsp;tracker)</code>&nbsp;</td>
 </tr>
-<tr id="i93" class="rowColor">
+<tr id="i94" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preGetOp-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-java.util.List-">preGetOp</a></span>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
         org.apache.hadoop.hbase.client.Get&nbsp;get,
         <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.hbase.Cell&gt;&nbsp;results)</code>&nbsp;</td>
 </tr>
-<tr id="i94" class="altColor">
+<tr id="i95" class="rowColor">
 <td class="colFirst"><code>org.apache.hadoop.hbase.client.Result</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preIncrement-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-">preIncrement</a></span>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
             org.apache.hadoop.hbase.client.Increment&nbsp;increment)</code>&nbsp;</td>
 </tr>
-<tr id="i95" class="rowColor">
+<tr id="i96" class="altColor">
 <td class="colFirst"><code>org.apache.hadoop.hbase.client.Result</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preIncrementAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-">preIncrementAfterRowLock</a></span>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;e,
                         org.apache.hadoop.hbase.client.Increment&nbsp;increment)</code>&nbsp;</td>
 </tr>
-<tr id="i96" class="altColor">
+<tr id="i97" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-">preOpen</a></span>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c)</code>&nbsp;</td>
 </tr>
-<tr id="i97" class="rowColor">
+<tr id="i98" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#prePrepareTimeStampForDeleteVersion-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Mutation-org.apache.hadoop.hbase.Cell-byte:A-org.apache.hadoop.hbase.client.Get-">prePrepareTimeStampForDeleteVersion</a></span>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;e,
                                    org.apache.hadoop.hbase.client.Mutation&nbsp;delete,
@@ -923,25 +939,25 @@
                                    byte[]&nbsp;byteNow,
                                    org.apache.hadoop.hbase.client.Get&nbsp;get)</code>&nbsp;</td>
 </tr>
-<tr id="i98" class="altColor">
+<tr id="i99" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#prePut-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Put-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">prePut</a></span>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
       org.apache.hadoop.hbase.client.Put&nbsp;put,
       org.apache.hadoop.hbase.wal.WALEdit&nbsp;edit,
       org.apache.hadoop.hbase.client.Durability&nbsp;durability)</code>&nbsp;</td>
 </tr>
-<tr id="i99" class="rowColor">
+<tr id="i100" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preReplayWALs-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.fs.Path-">preReplayWALs</a></span>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;env,
              org.apache.hadoop.hbase.client.RegionInfo&nbsp;info,
              org.apache.hadoop.fs.Path&nbsp;edits)</code>&nbsp;</td>
 </tr>
-<tr id="i100" class="altColor">
+<tr id="i101" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preScannerClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-">preScannerClose</a></span>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
                org.apache.hadoop.hbase.regionserver.InternalScanner&nbsp;s)</code>&nbsp;</td>
 </tr>
-<tr id="i101" class="rowColor">
+<tr id="i102" class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preScannerNext-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-java.util.List-int-boolean-">preScannerNext</a></span>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
               org.apache.hadoop.hbase.regionserver.InternalScanner&nbsp;s,
@@ -949,12 +965,12 @@
               int&nbsp;limit,
               boolean&nbsp;hasMore)</code>&nbsp;</td>
 </tr>
-<tr id="i102" class="altColor">
+<tr id="i103" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Scan-">preScannerOpen</a></span>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
               org.apache.hadoop.hbase.client.Scan&nbsp;scan)</code>&nbsp;</td>
 </tr>
-<tr id="i103" class="rowColor">
+<tr id="i104" class="altColor">
 <td class="colFirst"><code>org.apache.hadoop.hbase.regionserver.StoreFileReader</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preStoreFileReaderOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-org.apache.hadoop.hbase.io.FSDataInputStreamWrapper-long-org.apache.hadoop.hbase.io.hfile.CacheConfig-org.apache.hadoop.hbase.io.Reference-org.apache.hadoop.hbase.regionserver.StoreFileReader-">preStoreFileReaderOpen</a></span>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;ctx,
                       org.apache.hadoop.fs.FileSystem&nbsp;fs,
@@ -965,54 +981,60 @@
                       org.apache.hadoop.hbase.io.Reference&nbsp;r,
                       org.apache.hadoop.hbase.regionserver.StoreFileReader&nbsp;reader)</code>&nbsp;</td>
 </tr>
-<tr id="i104" class="altColor">
+<tr id="i105" class="rowColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preWALAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">preWALAppend</a></span>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;ctx,
+            org.apache.hadoop.hbase.wal.WALKey&nbsp;key,
+            org.apache.hadoop.hbase.wal.WALEdit&nbsp;edit)</code>&nbsp;</td>
+</tr>
+<tr id="i106" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preWALRestore-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">preWALRestore</a></span>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;env,
              org.apache.hadoop.hbase.client.RegionInfo&nbsp;info,
              org.apache.hadoop.hbase.wal.WALKey&nbsp;logKey,
              org.apache.hadoop.hbase.wal.WALEdit&nbsp;logEdit)</code>&nbsp;</td>
 </tr>
-<tr id="i105" class="rowColor">
+<tr id="i107" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#setThrowOnPostFlush-java.lang.Boolean-">setThrowOnPostFlush</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Boolean.html?is-external=true" title="class or interface in java.lang">Boolean</a>&nbsp;val)</code>&nbsp;</td>
 </tr>
-<tr id="i106" class="altColor">
+<tr id="i108" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#start-org.apache.hadoop.hbase.CoprocessorEnvironment-">start</a></span>(org.apache.hadoop.hbase.CoprocessorEnvironment&nbsp;e)</code>&nbsp;</td>
 </tr>
-<tr id="i107" class="rowColor">
+<tr id="i109" class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasClosed--">wasClosed</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i108" class="altColor">
+<tr id="i110" class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasCompacted--">wasCompacted</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i109" class="rowColor">
+<tr id="i111" class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasFlushed--">wasFlushed</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i110" class="altColor">
+<tr id="i112" class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasOpened--">wasOpened</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i111" class="rowColor">
+<tr id="i113" class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasScannerCloseCalled--">wasScannerCloseCalled</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i112" class="altColor">
+<tr id="i114" class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasScannerFilterRowCalled--">wasScannerFilterRowCalled</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i113" class="rowColor">
+<tr id="i115" class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasScannerNextCalled--">wasScannerNextCalled</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i114" class="altColor">
+<tr id="i116" class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasScannerOpenCalled--">wasScannerOpenCalled</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i115" class="rowColor">
+<tr id="i117" class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasStoreFileReaderOpenCalled--">wasStoreFileReaderOpenCalled</a></span>()</code>&nbsp;</td>
 </tr>
@@ -1065,7 +1087,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>ctBeforeDelete</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/coprocessor/SimpleRegionObserver.html#line.76">ctBeforeDelete</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/coprocessor/SimpleRegionObserver.html#line.77">ctBeforeDelete</a></pre>
 </li>
 </ul>
 <a name="ctPreOpen">
@@ -1074,7 +1096,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>ctPreOpen</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/coprocessor/SimpleRegionObserver.html#line.77">ctPreOpen</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/coprocessor/SimpleRegionObserver.html#line.78">ctPreOpen</a></pre>
 </li>
 </ul>
 <a name="ctPostOpen">
@@ -1083,7 +1105,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>ctPostOpen</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/coprocessor/SimpleRegionObserver.html#line.78">ctPostOpen</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/coprocessor/SimpleRegionObserver.html#line.79">ctPostOpen</a></pre>
 </li>
 </ul>
 <a name="ctPreClose">
@@ -1092,7 +1114,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>ctPreClose</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/coprocessor/SimpleRegionObserver.html#line.79">ctPreClose</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/coprocessor/SimpleRegionObserver.html#line.80">ctPreClose</a></pre>
 </li>
 </ul>
 <a name="ctPostClose">
@@ -1101,7 +1123,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>ctPostClose</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/coprocessor/SimpleRegionObserver.html#line.80">ctPostClose</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/coprocessor/SimpleRegionObserver.html#line.81">ctPostClose</a></pre>
 </li>
 </ul>
 <a name="ctPreFlush">
@@ -1110,7 +1132,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>ctPreFlush</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/coprocessor/SimpleRegionObserver.html#line.81">ctPreFlush</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/coprocessor/SimpleRegionObserver.html#line.82">ctPreFlush</a></pre>
 </li>
 </ul>
 <a name="ctPostFlush">
@@ -1119,7 +1141,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>ctPostFlush</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/coprocessor/SimpleRegionObserver.html#line.82">ctPostFlush</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/coprocessor/SimpleRegionObserver.html#line.83">ctPostFlush</a></pre>
 </li>
 </ul>
 <a name="ctPreCompactSelect">
@@ -1128,7 +1150,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>ctPreCompactSelect</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/coprocessor/SimpleRegionObserver.html#line.83">ctPreCompactSelect</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/coprocessor/SimpleRegionObserver.html#line.84">ctPreCompactSelect</a></pre>
 </li>
 </ul>
 <a name="ctPostCompactSelect">
@@ -1137,7 +1159,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>ctPostCompactSelect</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/coprocessor/SimpleRegionObserver.html#line.84">ctPostCompactSelect</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/coprocessor/SimpleRegionObserver.html#line.85">ctPostCompactSelect</a></pre>
 </li>
 </ul>
 <a name="ctPreCompact">
@@ -1146,7 +1168,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>ctPreCompact</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/coprocessor/SimpleRegionObserver.html#line.85">ctPreCompact</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/coprocessor/SimpleRegionObserver.html#line.86">ctPreCompact</a></pre>
 </li>
 </ul>
 <a name="ctPostCompact">
@@ -1155,7 +1177,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>ctPostCompact</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/coprocessor/SimpleRegionObserver.html#line.86">ctPostCompact</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/coprocessor/SimpleRegionObserver.html#line.87">ctPostCompact</a></pre>
 </li>
 </ul>
 <a name="ctPreGet">
@@ -1164,7 +1186,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>ctPreGet</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/coprocessor/SimpleRegionObserver.html#line.87">ctPreGet</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/coprocessor/SimpleRegionObserver.html#line.88">ctPreGet</a></pre>
 </li>
 </ul>
 <a name="ctPostGet">
@@ -1173,7 +1195,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>ctPostGet</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/coprocessor/SimpleRegionObserver.html#line.88">ctPostGet</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/coprocessor/SimpleRegionObserver.html#line.89">ctPostGet</a></pre>
 </li>
 </ul>
 <a name="ctPrePut">
@@ -1182,7 +1204,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>ctPrePut</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/coprocessor/SimpleRegionObserver.html#line.89">ctPrePut</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/coprocessor/SimpleRegionObserver.html#line.90">ctPrePut</a></pre>
 </li>
 </ul>
 <a name="ctPostPut">
@@ -1191,7 +1213,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>ctPostPut</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/coprocessor/SimpleRegionObserver.html#line.90">ctPostPut</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/coprocessor/SimpleRegionObserver.html#line.91">ctPostPut</a></pre>
 </li>
 </ul>
 <a name="ctPreDeleted">
@@ -1200,7 +1222,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>ctPreDeleted</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/coprocessor/SimpleRegionObserver.html#line.91">ctPreDeleted</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/coprocessor/SimpleRegionObserver.html#line.92">ctPreDeleted</a></pre>
 </li>
 </ul>
 <a name="ctPrePrepareDeleteTS">
@@ -1209,7 +1231,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>ctPrePrepareDeleteTS</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/coprocessor/SimpleRegionObserver.html#line.92">ctPrePrepareDeleteTS</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/coprocessor/SimpleRegionObserver.html#line.93">ctPrePrepareDeleteTS</a></pre>
 </li>
 </ul>
 <a name="ctPostDeleted">
@@ -1218,7 +1240,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>ctPostDeleted</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/coprocessor/SimpleRegionObserver.html#line.93">ctPostDeleted</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/coprocessor/SimpleRegionObserver.html#line.94">ctPostDeleted</a></pre>
 </li>
 </ul>
 <a name="ctPreIncrement">
@@ -1227,7 +1249,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>ctPreIncrement</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/coprocessor/SimpleRegionObserver.html#line.94">ctPreIncrement</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/coprocessor/SimpleRegionObserver.html#line.95">ctPreIncrement</a></pre>
 </li>
 </ul>
 <a name="ctPreIncrementAfterRowLock">
@@ -1236,7 +1258,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>ctPreIncrementAfterRowLock</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/coprocessor/SimpleRegionObserver.html#line.95">ctPreIncrementAfterRowLock</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/coprocessor/SimpleRegionObserver.html#line.96">ctPreIncrementAfterRowLock</a></pre>
 </li>
 </ul>
 <a name="ctPreAppend">
@@ -1245,7 +1267,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>ctPreAppend</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/coprocessor/SimpleRegionObserver.html#line.96">ctPreAppend</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/coprocessor/SimpleRegionObserver.html#line.97">ctPreAppend</a></pre>
 </li>
 </ul>
 <a name="ctPreAppendAfterRowLock">
@@ -1254,7 +1276,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>ctPreAppendAfterRowLock</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/coprocessor/SimpleRegionObserver.html#line.97">ctPreAppendAfterRowLock</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/coprocessor/SimpleRegionObserver.html#line.98">ctPreAppendAfterRowLock</a></pre>
 </li>
 </ul>
 <a name="ctPostIncrement">
@@ -1263,7 +1285,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>ctPostIncrement</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/coprocessor/SimpleRegionObserver.html#line.98">ctPostIncrement</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/coprocessor/SimpleRegionObserver.html#line.99">ctPostIncrement</a></pre>
 </li>
 </ul>
 <a name="ctPostAppend">
@@ -1272,7 +1294,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>ctPostAppend</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/coprocessor/SimpleRegionObserver.html#line.99">ctPostAppend</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/coprocessor/SimpleRegionObserver.html#line.100">ctPostAppend</a></pre>
 </li>
 </ul>
 <a name="ctPreCheckAndPut">
@@ -1281,7 +1303,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>ctPreCheckAndPut</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/coprocessor/SimpleRegionObserver.html#line.100">ctPreCheckAndPut</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/coprocessor/SimpleRegionObserver.html#line.101">ctPreCheckAndPut</a></pre>
 </li>
 </ul>
 <a name="ctPreCheckAndPutAfterRowLock">
@@ -1290,7 +1312,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>ctPreCheckAndPutAfterRowLock</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/coprocessor/SimpleRegionObserver.html#line.101">ctPreCheckAndPutAfterRowLock</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/coprocessor/SimpleRegionObserver.html#line.102">ctPreCheckAndPutAfterRowLock</a></pre>
 </li>
 </ul>
 <a name="ctPostCheckAndPut">
@@ -1299,7 +1321,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>ctPostCheckAndPut</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/coprocessor/SimpleRegionObserver.html#line.102">ctPostCheckAndPut</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/coprocessor/SimpleRegionObserver.html#line.103">ctPostCheckAndPut</a></pre>
 </li>
 </ul>
 <a name="ctPreCheckAndDelete">
@@ -1308,7 +1330,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>ctPreCheckAndDelete</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/coprocessor/SimpleRegionObserver.html#line.103">ctPreCheckAndDelete</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/coprocessor/SimpleRegionObserver.html#line.104">ctPreCheckAndDelete</a></pre>
 </li>
 </ul>
 <a name="ctPreCheckAndDeleteAfterRowLock">
@@ -1317,7 +1339,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>ctPreCheckAndDeleteAfterRowLock</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/coprocessor/SimpleRegionObserver.html#line.104">ctPreCheckAndDeleteAfterRowLock</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/coprocessor/SimpleRegionObserver.html#line.105">ctPreCheckAndDeleteAfterRowLock</a></pre>
 </li>
 </ul>
 <a name="ctPostCheckAndDelete">
@@ -1326,7 +1348,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>ctPostCheckAndDelete</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/coprocessor/SimpleRegionObserver.html#line.105">ctPostCheckAndDelete</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/coprocessor/SimpleRegionObserver.html#line.106">ctPostCheckAndDelete</a></pre>
 </li>
 </ul>
 <a name="ctPreScannerNext">
@@ -1335,7 +1357,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>ctPreScannerNext</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/coprocessor/SimpleRegionObserver.html#line.106">ctPreScannerNext</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/coprocessor/SimpleRegionObserver.html#line.107">ctPreScannerNext</a></pre>
 </li>
 </ul>
 <a name="ctPostScannerNext">
@@ -1344,7 +1366,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>ctPostScannerNext</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/coprocessor/SimpleRegionObserver.html#line.107">ctPostScannerNext</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/coprocessor/SimpleRegionObserver.html#line.108">ctPostScannerNext</a></pre>
 </li>
 </ul>
 <a name="ctPostScannerFilterRow">
@@ -1353,7 +1375,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>ctPostScannerFilterRow</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/coprocessor/SimpleRegionObserver.html#line.108">ctPostScannerFilterRow</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/coprocessor/SimpleRegionObserver.html#line.109">ctPostScannerFilterRow</a></pre>
 </li>
 </ul>
 <a name="ctPreScannerClose">
@@ -1362,7 +1384,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>ctPreScannerClose</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/coprocessor/SimpleRegionObserver.html#line.109">ctPreScannerClose</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/coprocessor/SimpleRegionObserver.html#line.110">ctPreScannerClose</a></pre>
 </li>
 </ul>
 <a name="ctPostScannerClose">
@@ -1371,7 +1393,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>ctPostScannerClose</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/coprocessor/SimpleRegionObserver.html#line.110">ctPostScannerClose</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/coprocessor/SimpleRegionObserver.html#line.111">ctPostScannerClose</a></pre>
 </li>
 </ul>
 <a name="ctPreScannerOpen">
@@ -1380,7 +1402,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>ctPreScannerOpen</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/coprocessor/SimpleRegionObserver.html#line.111">ctPreScannerOpen</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/coprocessor/SimpleRegionObserver.html#line.112">ctPreScannerOpen</a></pre>
 </li>
 </ul>
 <a name="ctPostScannerOpen">
@@ -1389,7 +1411,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>ctPostScannerOpen</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/coprocessor/SimpleRegionObserver.html#line.112">ctPostScannerOpen</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/coprocessor/SimpleRegionObserver.html#line.113">ctPostScannerOpen</a></pre>
 </li>
 </ul>
 <a name="ctPreBulkLoadHFile">
@@ -1398,7 +1420,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>ctPreBulkLoadHFile</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/coprocessor/SimpleRegionObserver.html#line.113">ctPreBulkLoadHFile</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/coprocessor/SimpleRegionObserver.html#line.114">ctPreBulkLoadHFile</a></pre>
 </li>
 </ul>
 <a name="ctPostBulkLoadHFile">
@@ -1407,7 +1429,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>ctPostBulkLoadHFile</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/coprocessor/SimpleRegionObserver.html#line.114">ctPostBulkLoadHFile</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/coprocessor/SimpleRegionObserver.html#line.115">ctPostBulkLoadHFile</a></pre>
 </li>
 </ul>
 <a name="ctPreBatchMutate">
@@ -1416,7 +1438,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>ctPreBatchMutate</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/coprocessor/SimpleRegionObserver.html#line.115">ctPreBatchMutate</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/coprocessor/SimpleRegionObserver.html#line.116">ctPreBatchMutate</a></pre>
 </li>
 </ul>
 <a name="ctPostBatchMutate">
@@ -1425,7 +1447,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>ctPostBatchMutate</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/coprocessor/SimpleRegionObserver.html#line.116">ctPostBatchMutate</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/coprocessor/SimpleRegionObserver.html#line.117">ctPostBatchMutate</a></pre>
 </li>
 </ul>
 <a name="ctPreReplayWALs">
@@ -1434,7 +1456,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>ctPreReplayWALs</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/coprocessor/SimpleRegionObserver.html#line.117">ctPreReplayWALs</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/coprocessor/SimpleRegionObserver.html#line.118">ctPreReplayWALs</a></pre>
 </li>
 </ul>
 <a name="ctPostReplayWALs">
@@ -1443,7 +1465,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>ctPostReplayWALs</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/coprocessor/SimpleRegionObserver.html#line.118">ctPostReplayWALs</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/coprocessor/SimpleRegionObserver.html#line.119">ctPostReplayWALs</a></pre>
 </li>
 </ul>
 <a name="ctPreWALRestore">
@@ -1452,7 +1474,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>ctPreWALRestore</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/coprocessor/SimpleRegionObserver.html#line.119">ctPreWALRestore</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/coprocessor/SimpleRegionObserver.html#line.120">ctPreWALRestore</a></pre>
 </li>
 </ul>
 <a name="ctPostWALRestore">
@@ -1461,7 +1483,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>ctPostWALRestore</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/coprocessor/SimpleRegionObserver.html#line.120">ctPostWALRestore</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/coprocessor/SimpleRegionObserver.html#line.121">ctPostWALRestore</a></pre>
 </li>
 </ul>
 <a name="ctPreStoreFileReaderOpen">
@@ -1470,7 +1492,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>ctPreStoreFileReaderOpen</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/coprocessor/SimpleRegionObserver.html#line.121">ctPreStoreFileReaderOpen</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/coprocessor/SimpleRegionObserver.html#line.122">ctPreStoreFileReaderOpen</a></pre>
 </li>
 </ul>
 <a name="ctPostStoreFileReaderOpen">
@@ -1479,7 +1501,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>ctPostStoreFileReaderOpen</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/coprocessor/SimpleRegionObserver.html#line.122">ctPostStoreFileReaderOpen</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/coprocessor/SimpleRegionObserver.html#line.123">ctPostStoreFileReaderOpen</a></pre>
 </li>
 </ul>
 <a name="ctPostBatchMutateIndispensably">
@@ -1488,7 +1510,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>ctPostBatchMutateIndispensably</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/coprocessor/SimpleRegionObserver.html#line.123">ctPostBatchMutateIndispensably</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/coprocessor/SimpleRegionObserver.html#line.124">ctPostBatchMutateIndispensably</a></pre>
 </li>
 </ul>
 <a name="ctPostStartRegionOperation">
@@ -1497,7 +1519,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>ctPostStartRegionOperation</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/coprocessor/SimpleRegionObserver.html#line.124">ctPostStartRegionOperation</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/coprocessor/SimpleRegionObserver.html#line.125">ctPostStartRegionOperation</a></pre>
 </li>
 </ul>
 <a name="ctPostCloseRegionOperation">
@@ -1506,7 +1528,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>ctPostCloseRegionOperation</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/coprocessor/SimpleRegionObserver.html#line.125">ctPostCloseRegionOperation</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/coprocessor/SimpleRegionObserver.html#line.126">ctPostCloseRegionOperation</a></pre>
 </li>
 </ul>
 <a name="throwOnPostFlush">
@@ -1515,22 +1537,49 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>throwOnPostFlush</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/coprocessor/SimpleRegionObserver.html#line.126">throwOnPostFlush</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/coprocessor/SimpleRegionObserver.html#line.127">throwOnPostFlush</a></pre>
+</li>
+</ul>
+<a name="ctPreWALAppend">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>ctPreWALAppend</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/coprocessor/SimpleRegionObserver.html#line.128">ctPreWALAppend</a></pre>
 </li>
 </ul>
 <a name="TABLE_SKIPPED">
 <!--   -->
 </a>
-<ul class="blockListLast">
+<ul class="blockList">
 <li class="blockList">
 <h4>TABLE_SKIPPED</h4>
-<pre>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/coprocessor/SimpleRegionObserver.html#line.127">TABLE_SKIPPED</a></pre>
+<pre>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/coprocessor/SimpleRegionObserver.html#line.130">TABLE_SKIPPED</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.coprocessor.SimpleRegionObserver.TABLE_SKIPPED">Constant Field Values</a></dd>
 </dl>
 </li>
 </ul>
+<a name="extendedAttributes">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>extendedAttributes</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;<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>,byte[]&gt; <a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.131">extendedAttributes</a></pre>
+</li>
+</ul>
+<a name="WAL_EXTENDED_ATTRIBUTE_BYTES">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>WAL_EXTENDED_ATTRIBUTE_BYTES</h4>
+<pre>static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.132">WAL_EXTENDED_ATTRIBUTE_BYTES</a></pre>
+</li>
+</ul>
 </li>
 </ul>
 <!-- ========= CONSTRUCTOR DETAIL ======== -->
@@ -1545,7 +1594,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>SimpleRegionObserver</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.74">SimpleRegionObserver</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.75">SimpleRegionObserver</a>()</pre>
 </li>
 </ul>
 </li>
@@ -1562,7 +1611,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>setThrowOnPostFlush</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.129">setThrowOnPostFlush</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Boolean.html?is-external=true" title="class or interface in java.lang">Boolean</a>&nbsp;val)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.134">setThrowOnPostFlush</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Boolean.html?is-external=true" title="class or interface in java.lang">Boolean</a>&nbsp;val)</pre>
 </li>
 </ul>
 <a name="getRegionObserver--">
@@ -1571,7 +1620,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionObserver</h4>
-<pre>public&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;org.apache.hadoop.hbase.coprocessor.RegionObserver&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.134">getRegionObserver</a>()</pre>
+<pre>public&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;org.apache.hadoop.hbase.coprocessor.RegionObserver&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.139">getRegionObserver</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code>getRegionObserver</code>&nbsp;in interface&nbsp;<code>org.apache.hadoop.hbase.coprocessor.RegionCoprocessor</code></dd>
@@ -1584,7 +1633,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>start</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.139">start</a>(org.apache.hadoop.hbase.CoprocessorEnvironment&nbsp;e)
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.144">start</a>(org.apache.hadoop.hbase.CoprocessorEnvironment&nbsp;e)
            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>
@@ -1600,7 +1649,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>preOpen</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.143">preOpen</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.148">preOpen</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code>preOpen</code>&nbsp;in interface&nbsp;<code>org.apache.hadoop.hbase.coprocessor.RegionObserver</code></dd>
@@ -1613,7 +1662,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>postOpen</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.148">postOpen</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.153">postOpen</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code>postOpen</code>&nbsp;in interface&nbsp;<code>org.apache.hadoop.hbase.coprocessor.RegionObserver</code></dd>
@@ -1626,7 +1675,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>wasOpened</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.152">wasOpened</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.157">wasOpened</a>()</pre>
 </li>
 </ul>
 <a name="preClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-boolean-">
@@ -1635,7 +1684,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>preClose</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.157">preClose</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.162">preClose</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
                      boolean&nbsp;abortRequested)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
@@ -1649,7 +1698,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>postClose</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.162">postClose</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.167">postClose</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
                       boolean&nbsp;abortRequested)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
@@ -1663,7 +1712,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>wasClosed</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.166">wasClosed</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.171">wasClosed</a>()</pre>
 </li>
 </ul>
 <a name="preFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">
@@ -1672,7 +1721,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>preFlush</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.regionserver.InternalScanner&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.171">preFlush</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<pre>public&nbsp;org.apache.hadoop.hbase.regionserver.InternalScanner&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.176">preFlush</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
                                                                      org.apache.hadoop.hbase.regionserver.Store&nbsp;store,
                                                                      org.apache.hadoop.hbase.regionserver.InternalScanner&nbsp;scanner,
                                                                      org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker&nbsp;tracker)
@@ -1691,7 +1740,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>postFlush</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.178">postFlush</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.183">postFlush</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
                       org.apache.hadoop.hbase.regionserver.Store&nbsp;store,
                       org.apache.hadoop.hbase.regionserver.StoreFile&nbsp;resultFile,
                       org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker&nbsp;tracker)
@@ -1710,7 +1759,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>wasFlushed</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.186">wasFlushed</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.191">wasFlushed</a>()</pre>
 </li>
 </ul>
 <a name="preCompactSelection-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-java.util.List-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-">
@@ -1719,7 +1768,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>preCompactSelection</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.191">preCompactSelection</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.196">preCompactSelection</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
                                 org.apache.hadoop.hbase.regionserver.Store&nbsp;store,
                                 <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;? extends org.apache.hadoop.hbase.regionserver.StoreFile&gt;&nbsp;candidates,
                                 org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker&nbsp;tracker)
@@ -1738,7 +1787,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>postCompactSelection</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.197">postCompactSelection</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.202">postCompactSelection</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
                                  org.apache.hadoop.hbase.regionserver.Store&nbsp;store,
                                  <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;? extends org.apache.hadoop.hbase.regionserver.StoreFile&gt;&nbsp;selected,
                                  org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker&nbsp;tracker,
@@ -1755,7 +1804,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>preCompact</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.regionserver.InternalScanner&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.204">preCompact</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<pre>public&nbsp;org.apache.hadoop.hbase.regionserver.InternalScanner&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.209">preCompact</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
                                                                        org.apache.hadoop.hbase.regionserver.Store&nbsp;store,
                                                                        org.apache.hadoop.hbase.regionserver.InternalScanner&nbsp;scanner,
                                                                        org.apache.hadoop.hbase.regionserver.ScanType&nbsp;scanType,
@@ -1776,7 +1825,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>postCompact</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.212">postCompact</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.217">postCompact</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
                         org.apache.hadoop.hbase.regionserver.Store&nbsp;store,
                         org.apache.hadoop.hbase.regionserver.StoreFile&nbsp;resultFile,
                         org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker&nbsp;tracker,
@@ -1796,7 +1845,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>wasCompacted</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.218">wasCompacted</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.223">wasCompacted</a>()</pre>
 </li>
 </ul>
 <a name="preScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Scan-">
@@ -1805,7 +1854,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>preScannerOpen</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.223">preScannerOpen</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.228">preScannerOpen</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
                            org.apache.hadoop.hbase.client.Scan&nbsp;scan)
                     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>
@@ -1822,7 +1871,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>postScannerOpen</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.regionserver.RegionScanner&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.229">postScannerOpen</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<pre>public&nbsp;org.apache.hadoop.hbase.regionserver.RegionScanner&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.234">postScannerOpen</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
                                                                           org.apache.hadoop.hbase.client.Scan&nbsp;scan,
                                                                           org.apache.hadoop.hbase.regionserver.RegionScanner&nbsp;s)
                                                                    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>
@@ -1840,7 +1889,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>preScannerNext</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.237">preScannerNext</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.242">preScannerNext</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
                               org.apache.hadoop.hbase.regionserver.InternalScanner&nbsp;s,
                               <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.hbase.client.Result&gt;&nbsp;results,
                               int&nbsp;limit,
@@ -1860,7 +1909,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>postScannerNext</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.245">postScannerNext</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.250">postScannerNext</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
                                org.apache.hadoop.hbase.regionserver.InternalScanner&nbsp;s,
                                <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.hbase.client.Result&gt;&nbsp;results,
                                int&nbsp;limit,
@@ -1880,7 +1929,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>postScannerFilterRow</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.253">postScannerFilterRow</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;e,
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.258">postScannerFilterRow</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;e,
                                     org.apache.hadoop.hbase.regionserver.InternalScanner&nbsp;s,
                                     org.apache.hadoop.hbase.Cell&nbsp;currentRow,
                                     boolean&nbsp;hasMore)
@@ -1899,7 +1948,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>preScannerClose</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.260">preScannerClose</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.265">preScannerClose</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
                             org.apache.hadoop.hbase.regionserver.InternalScanner&nbsp;s)
                      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>
@@ -1916,7 +1965,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>postScannerClose</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.266">postScannerClose</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.271">postScannerClose</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
                              org.apache.hadoop.hbase.regionserver.InternalScanner&nbsp;s)
                       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>
@@ -1933,7 +1982,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>preGetOp</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.272">preGetOp</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.277">preGetOp</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
                      org.apache.hadoop.hbase.client.Get&nbsp;get,
                      <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.hbase.Cell&gt;&nbsp;results)
               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>
@@ -1951,7 +2000,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>postGetOp</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.283">postGetOp</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.288">postGetOp</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
                       org.apache.hadoop.hbase.client.Get&nbsp;get,
                       <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.hbase.Cell&gt;&nbsp;results)</pre>
 <dl>
@@ -1966,7 +2015,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>prePut</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.314">prePut</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.319">prePut</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
                    org.apache.hadoop.hbase.client.Put&nbsp;put,
                    org.apache.hadoop.hbase.wal.WALEdit&nbsp;edit,
                    org.apache.hadoop.hbase.client.Durability&nbsp;durability)
@@ -1985,7 +2034,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>postPut</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.350">postPut</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.355">postPut</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
                     org.apache.hadoop.hbase.client.Put&nbsp;put,
                     org.apache.hadoop.hbase.wal.WALEdit&nbsp;edit,
                     org.apache.hadoop.hbase.client.Durability&nbsp;durability)
@@ -2004,7 +2053,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>preDelete</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.389">preDelete</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.394">preDelete</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
                       org.apache.hadoop.hbase.client.Delete&nbsp;delete,
                       org.apache.hadoop.hbase.wal.WALEdit&nbsp;edit,
                       org.apache.hadoop.hbase.client.Durability&nbsp;durability)
@@ -2023,7 +2072,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>prePrepareTimeStampForDeleteVersion</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.403">prePrepareTimeStampForDeleteVersion</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;e,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.408">prePrepareTimeStampForDeleteVersion</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;e,
                                                 org.apache.hadoop.hbase.client.Mutation&nbsp;delete,
                                                 org.apache.hadoop.hbase.Cell&nbsp;cell,
                                                 byte[]&nbsp;byteNow,
@@ -2043,7 +2092,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>postDelete</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.409">postDelete</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.414">postDelete</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
                        org.apache.hadoop.hbase.client.Delete&nbsp;delete,
                        org.apache.hadoop.hbase.wal.WALEdit&nbsp;edit,
                        org.apache.hadoop.hbase.client.Durability&nbsp;durability)
@@ -2062,7 +2111,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>preBatchMutate</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.422">preBatchMutate</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.427">preBatchMutate</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
                            org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress&lt;org.apache.hadoop.hbase.client.Mutation&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>
 <dl>
@@ -2079,7 +2128,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>postBatchMutate</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.432">postBatchMutate</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.437">postBatchMutate</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
                             org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress&lt;org.apache.hadoop.hbase.client.Mutation&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>
 <dl>
@@ -2096,7 +2145,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>postStartRegionOperation</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.442">postStartRegionOperation</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;ctx,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.447">postStartRegionOperation</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;ctx,
                                      org.apache.hadoop.hbase.regionserver.Region.Operation&nbsp;op)
                               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>
@@ -2113,7 +2162,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>postCloseRegionOperation</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.448">postCloseRegionOperation</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;ctx,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.453">postCloseRegionOperation</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;ctx,
                                      org.apache.hadoop.hbase.regionserver.Region.Operation&nbsp;op)
                               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>
@@ -2130,7 +2179,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>postBatchMutateIndispensably</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.456">postBatchMutateIndispensably</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;ctx,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.461">postBatchMutateIndispensably</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;ctx,
                                          org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress&lt;org.apache.hadoop.hbase.client.Mutation&gt;&nbsp;miniBatchOp,
                                          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>
@@ -2148,7 +2197,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>preIncrement</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.client.Result&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.462">preIncrement</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<pre>public&nbsp;org.apache.hadoop.hbase.client.Result&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.467">preIncrement</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
                                                           org.apache.hadoop.hbase.client.Increment&nbsp;increment)
                                                    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>
@@ -2165,7 +2214,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>preIncrementAfterRowLock</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.client.Result&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.469">preIncrementAfterRowLock</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;e,
+<pre>public&nbsp;org.apache.hadoop.hbase.client.Result&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.474">preIncrementAfterRowLock</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;e,
                                                                       org.apache.hadoop.hbase.client.Increment&nbsp;increment)
                                                                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>
@@ -2182,7 +2231,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>postIncrement</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.client.Result&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.476">postIncrement</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
+<pre>public&nbsp;org.apache.hadoop.hbase.client.Result&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.481">postIncrement</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;c,
                                                            org.apache.hadoop.hbase.client.Increment&nbsp;increment,
                                                            org.apache.hadoop.hbase.client.Result&nbsp;result)
                                                     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>
@@ -2200,7 +2249,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>preCheckAndPut</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.483">preCheckAndPut</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;e,
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.488">preCheckAndPut</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;e,
                               byte[]&nbsp;row,
                               byte[]&nbsp;family,
                               byte[]&nbsp;qualifier,
@@ -2223,7 +2272,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>preCheckAndPutAfterRowLock</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.491">preCheckAndPutAfterRowLock</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;e,
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.496">preCheckAndPutAfterRowLock</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;e,
                                           byte[]&nbsp;row,
                                           byte[]&nbsp;family,
                                           byte[]&nbsp;qualifier,
@@ -2246,7 +2295,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>postCheckAndPut</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.499">postCheckAndPut</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;e,
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.504">postCheckAndPut</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;e,
                                byte[]&nbsp;row,
                                byte[]&nbsp;family,
                                byte[]&nbsp;qualifier,
@@ -2269,7 +2318,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>preCheckAndDelete</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.507">preCheckAndDelete</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;e,
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.512">preCheckAndDelete</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;e,
                                  byte[]&nbsp;row,
                                  byte[]&nbsp;family,
                                  byte[]&nbsp;qualifier,
@@ -2292,7 +2341,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>preCheckAndDeleteAfterRowLock</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.515">preCheckAndDeleteAfterRowLock</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;e,
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.520">preCheckAndDeleteAfterRowLock</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;e,
                                              byte[]&nbsp;row,
                                              byte[]&nbsp;family,
                                              byte[]&nbsp;qualifier,
@@ -2315,7 +2364,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>postCheckAndDelete</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.523">postCheckAndDelete</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;e,
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.528">postCheckAndDelete</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;e,
                                   byte[]&nbsp;row,
                                   byte[]&nbsp;family,
                                   byte[]&nbsp;qualifier,
@@ -2338,7 +2387,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>preAppendAfterRowLock</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.client.Result&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.531">preAppendAfterRowLock</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;e,
+<pre>public&nbsp;org.apache.hadoop.hbase.client.Result&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.536">preAppendAfterRowLock</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;e,
                                                                    org.apache.hadoop.hbase.client.Append&nbsp;append)
                                                             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>
@@ -2355,7 +2404,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>preAppend</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.client.Result&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.538">preAppend</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;e,
+<pre>public&nbsp;org.apache.hadoop.hbase.client.Result&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.543">preAppend</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;e,
                                                        org.apache.hadoop.hbase.client.Append&nbsp;append)
                                                 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>
@@ -2372,7 +2421,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>postAppend</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.client.Result&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.545">postAppend</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;e,
+<pre>public&nbsp;org.apache.hadoop.hbase.client.Result&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.550">postAppend</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;e,
                                                         org.apache.hadoop.hbase.client.Append&nbsp;append,
                                                         org.apache.hadoop.hbase.client.Result&nbsp;result)
                                                  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>
@@ -2390,7 +2439,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>preBulkLoadHFile</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.552">preBulkLoadHFile</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;ctx,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.557">preBulkLoadHFile</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;ctx,
                              <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.hbase.util.Pair&lt;byte[],<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;familyPaths)
                       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>
@@ -2407,7 +2456,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>postBulkLoadHFile</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.570">postBulkLoadHFile</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;ctx,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.575">postBulkLoadHFile</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;ctx,
                               <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.hbase.util.Pair&lt;byte[],<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;familyPaths,
                               <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;org.apache.hadoop.fs.Path&gt;&gt;&nbsp;map)
                        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>
@@ -2425,7 +2474,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>preReplayWALs</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.589">preReplayWALs</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;env,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.594">preReplayWALs</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;env,
                           org.apache.hadoop.hbase.client.RegionInfo&nbsp;info,
                           org.apache.hadoop.fs.Path&nbsp;edits)
                    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>
@@ -2443,7 +2492,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>postReplayWALs</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.595">postReplayWALs</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;env,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.600">postReplayWALs</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;env,
                            org.apache.hadoop.hbase.client.RegionInfo&nbsp;info,
                            org.apache.hadoop.fs.Path&nbsp;edits)
                     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>
@@ -2461,7 +2510,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>preWALRestore</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.601">preWALRestore</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;env,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.606">preWALRestore</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;env,
                           org.apache.hadoop.hbase.client.RegionInfo&nbsp;info,
                           org.apache.hadoop.hbase.wal.WALKey&nbsp;logKey,
                           org.apache.hadoop.hbase.wal.WALEdit&nbsp;logEdit)
@@ -2480,7 +2529,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>postWALRestore</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.613">postWALRestore</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;env,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.618">postWALRestore</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;? extends org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;env,
                            org.apache.hadoop.hbase.client.RegionInfo&nbsp;info,
                            org.apache.hadoop.hbase.wal.WALKey&nbsp;logKey,
                            org.apache.hadoop.hbase.wal.WALEdit&nbsp;logEdit)
@@ -2499,7 +2548,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>preStoreFileReaderOpen</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.regionserver.StoreFileReader&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.619">preStoreFileReaderOpen</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;ctx,
+<pre>public&nbsp;org.apache.hadoop.hbase.regionserver.StoreFileReader&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.624">preStoreFileReaderOpen</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;ctx,
                                                                                    org.apache.hadoop.fs.FileSystem&nbsp;fs,
                                                                                    org.apache.hadoop.fs.Path&nbsp;p,
                                                                                    org.apache.hadoop.hbase.io.FSDataInputStreamWrapper&nbsp;in,
@@ -2522,7 +2571,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>postStoreFileReaderOpen</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.regionserver.StoreFileReader&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.627">postStoreFileReaderOpen</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;ctx,
+<pre>public&nbsp;org.apache.hadoop.hbase.regionserver.StoreFileReader&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.632">postStoreFileReaderOpen</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;ctx,
                                                                                     org.apache.hadoop.fs.FileSystem&nbsp;fs,
                                                                                     org.apache.hadoop.fs.Path&nbsp;p,
                                                                                     org.apache.hadoop.hbase.io.FSDataInputStreamWrapper&nbsp;in,
@@ -2539,13 +2588,31 @@
 </dl>
 </li>
 </ul>
+<a name="preWALAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>preWALAppend</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.640">preWALAppend</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;ctx,
+                         org.apache.hadoop.hbase.wal.WALKey&nbsp;key,
+                         org.apache.hadoop.hbase.wal.WALEdit&nbsp;edit)
+                  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>preWALAppend</code>&nbsp;in interface&nbsp;<code>org.apache.hadoop.hbase.coprocessor.RegionObserver</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="hadPreGet--">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>hadPreGet</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.634">hadPreGet</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.648">hadPreGet</a>()</pre>
 </li>
 </ul>
 <a name="hadPostGet--">
@@ -2554,7 +2621,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>hadPostGet</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.638">hadPostGet</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.652">hadPostGet</a>()</pre>
 </li>
 </ul>
 <a name="hadPrePut--">
@@ -2563,7 +2630,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>hadPrePut</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.642">hadPrePut</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.656">hadPrePut</a>()</pre>
 </li>
 </ul>
 <a name="hadPostPut--">
@@ -2572,7 +2639,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>hadPostPut</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.646">hadPostPut</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.660">hadPostPut</a>()</pre>
 </li>
 </ul>
 <a name="hadPreBatchMutate--">
@@ -2581,7 +2648,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>hadPreBatchMutate</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.650">hadPreBatchMutate</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.664">hadPreBatchMutate</a>()</pre>
 </li>
 </ul>
 <a name="hadPostBatchMutate--">
@@ -2590,7 +2657,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>hadPostBatchMutate</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.654">hadPostBatchMutate</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.668">hadPostBatchMutate</a>()</pre>
 </li>
 </ul>
 <a name="hadPostBatchMutateIndispensably--">
@@ -2599,7 +2666,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>hadPostBatchMutateIndispensably</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.658">hadPostBatchMutateIndispensably</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.672">hadPostBatchMutateIndispensably</a>()</pre>
 </li>
 </ul>
 <a name="hadPostStartRegionOperation--">
@@ -2608,7 +2675,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>hadPostStartRegionOperation</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.662">hadPostStartRegionOperation</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.676">hadPostStartRegionOperation</a>()</pre>
 </li>
 </ul>
 <a name="hadPostCloseRegionOperation--">
@@ -2617,7 +2684,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>hadPostCloseRegionOperation</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.666">hadPostCloseRegionOperation</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.680">hadPostCloseRegionOperation</a>()</pre>
 </li>
 </ul>
 <a name="hadDelete--">
@@ -2626,7 +2693,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>hadDelete</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.670">hadDelete</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.684">hadDelete</a>()</pre>
 </li>
 </ul>
 <a name="getCtPostStartRegionOperation--">
@@ -2635,7 +2702,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>getCtPostStartRegionOperation</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.674">getCtPostStartRegionOperation</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.688">getCtPostStartRegionOperation</a>()</pre>
 </li>
 </ul>
 <a name="getCtPostCloseRegionOperation--">
@@ -2644,7 +2711,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>getCtPostCloseRegionOperation</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.678">getCtPostCloseRegionOperation</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.692">getCtPostCloseRegionOperation</a>()</pre>
 </li>
 </ul>
 <a name="hadPreCheckAndPut--">
@@ -2653,7 +2720,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>hadPreCheckAndPut</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.682">hadPreCheckAndPut</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.696">hadPreCheckAndPut</a>()</pre>
 </li>
 </ul>
 <a name="hadPreCheckAndPutAfterRowLock--">
@@ -2662,7 +2729,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>hadPreCheckAndPutAfterRowLock</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.686">hadPreCheckAndPutAfterRowLock</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.700">hadPreCheckAndPutAfterRowLock</a>()</pre>
 </li>
 </ul>
 <a name="hadPostCheckAndPut--">
@@ -2671,7 +2738,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>hadPostCheckAndPut</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.690">hadPostCheckAndPut</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.704">hadPostCheckAndPut</a>()</pre>
 </li>
 </ul>
 <a name="hadPreCheckAndDelete--">
@@ -2680,7 +2747,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>hadPreCheckAndDelete</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.694">hadPreCheckAndDelete</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.708">hadPreCheckAndDelete</a>()</pre>
 </li>
 </ul>
 <a name="hadPreCheckAndDeleteAfterRowLock--">
@@ -2689,7 +2756,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>hadPreCheckAndDeleteAfterRowLock</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.698">hadPreCheckAndDeleteAfterRowLock</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.712">hadPreCheckAndDeleteAfterRowLock</a>()</pre>
 </li>
 </ul>
 <a name="hadPostCheckAndDelete--">
@@ -2698,7 +2765,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>hadPostCheckAndDelete</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.702">hadPostCheckAndDelete</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.716">hadPostCheckAndDelete</a>()</pre>
 </li>
 </ul>
 <a name="hadPreIncrement--">
@@ -2707,7 +2774,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>hadPreIncrement</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.706">hadPreIncrement</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.720">hadPreIncrement</a>()</pre>
 </li>
 </ul>
 <a name="hadPreIncrementAfterRowLock--">
@@ -2716,7 +2783,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>hadPreIncrementAfterRowLock</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.710">hadPreIncrementAfterRowLock</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.724">hadPreIncrementAfterRowLock</a>()</pre>
 </li>
 </ul>
 <a name="hadPostIncrement--">
@@ -2725,7 +2792,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>hadPostIncrement</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.714">hadPostIncrement</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.728">hadPostIncrement</a>()</pre>
 </li>
 </ul>
 <a name="hadPreAppend--">
@@ -2734,7 +2801,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>hadPreAppend</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.718">hadPreAppend</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.732">hadPreAppend</a>()</pre>
 </li>
 </ul>
 <a name="hadPreAppendAfterRowLock--">
@@ -2743,7 +2810,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>hadPreAppendAfterRowLock</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.722">hadPreAppendAfterRowLock</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.736">hadPreAppendAfterRowLock</a>()</pre>
 </li>
 </ul>
 <a name="hadPostAppend--">
@@ -2752,7 +2819,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>hadPostAppend</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.726">hadPostAppend</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.740">hadPostAppend</a>()</pre>
 </li>
 </ul>
 <a name="hadPrePreparedDeleteTS--">
@@ -2761,7 +2828,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>hadPrePreparedDeleteTS</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.730">hadPrePreparedDeleteTS</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.744">hadPrePreparedDeleteTS</a>()</pre>
 </li>
 </ul>
 <a name="hadPreReplayWALs--">
@@ -2770,7 +2837,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>hadPreReplayWALs</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.734">hadPreReplayWALs</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.748">hadPreReplayWALs</a>()</pre>
 </li>
 </ul>
 <a name="hadPostReplayWALs--">
@@ -2779,7 +2846,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>hadPostReplayWALs</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.738">hadPostReplayWALs</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.752">hadPostReplayWALs</a>()</pre>
 </li>
 </ul>
 <a name="hadPreWALRestore--">
@@ -2788,7 +2855,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>hadPreWALRestore</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.742">hadPreWALRestore</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.756">hadPreWALRestore</a>()</pre>
 </li>
 </ul>
 <a name="hadPostWALRestore--">
@@ -2797,7 +2864,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>hadPostWALRestore</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.746">hadPostWALRestore</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.760">hadPostWALRestore</a>()</pre>
 </li>
 </ul>
 <a name="wasScannerNextCalled--">
@@ -2806,7 +2873,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>wasScannerNextCalled</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.750">wasScannerNextCalled</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.764">wasScannerNextCalled</a>()</pre>
 </li>
 </ul>
 <a name="wasScannerFilterRowCalled--">
@@ -2815,7 +2882,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>wasScannerFilterRowCalled</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.753">wasScannerFilterRowCalled</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.767">wasScannerFilterRowCalled</a>()</pre>
 </li>
 </ul>
 <a name="wasScannerCloseCalled--">
@@ -2824,7 +2891,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>wasScannerCloseCalled</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.756">wasScannerCloseCalled</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.770">wasScannerCloseCalled</a>()</pre>
 </li>
 </ul>
 <a name="wasScannerOpenCalled--">
@@ -2833,7 +2900,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>wasScannerOpenCalled</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.759">wasScannerOpenCalled</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.773">wasScannerOpenCalled</a>()</pre>
 </li>
 </ul>
 <a name="hadDeleted--">
@@ -2842,7 +2909,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>hadDeleted</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.762">hadDeleted</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.776">hadDeleted</a>()</pre>
 </li>
 </ul>
 <a name="hadPostBulkLoadHFile--">
@@ -2851,7 +2918,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>hadPostBulkLoadHFile</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.766">hadPostBulkLoadHFile</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.780">hadPostBulkLoadHFile</a>()</pre>
 </li>
 </ul>
 <a name="hadPreBulkLoadHFile--">
@@ -2860,7 +2927,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>hadPreBulkLoadHFile</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.770">hadPreBulkLoadHFile</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.784">hadPreBulkLoadHFile</a>()</pre>
 </li>
 </ul>
 <a name="getCtBeforeDelete--">
@@ -2869,7 +2936,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>getCtBeforeDelete</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.775">getCtBeforeDelete</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.789">getCtBeforeDelete</a>()</pre>
 </li>
 </ul>
 <a name="getCtPreOpen--">
@@ -2878,7 +2945,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>getCtPreOpen</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.779">getCtPreOpen</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.793">getCtPreOpen</a>()</pre>
 </li>
 </ul>
 <a name="getCtPostOpen--">
@@ -2887,7 +2954,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>getCtPostOpen</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.783">getCtPostOpen</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.797">getCtPostOpen</a>()</pre>
 </li>
 </ul>
 <a name="getCtPreClose--">
@@ -2896,7 +2963,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>getCtPreClose</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.787">getCtPreClose</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.801">getCtPreClose</a>()</pre>
 </li>
 </ul>
 <a name="getCtPostClose--">
@@ -2905,7 +2972,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>getCtPostClose</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.791">getCtPostClose</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.805">getCtPostClose</a>()</pre>
 </li>
 </ul>
 <a name="getCtPreFlush--">
@@ -2914,7 +2981,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>getCtPreFlush</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.795">getCtPreFlush</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.809">getCtPreFlush</a>()</pre>
 </li>
 </ul>
 <a name="getCtPostFlush--">
@@ -2923,7 +2990,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>getCtPostFlush</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.799">getCtPostFlush</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.813">getCtPostFlush</a>()</pre>
 </li>
 </ul>
 <a name="getCtPreCompactSelect--">
@@ -2932,7 +2999,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>getCtPreCompactSelect</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.803">getCtPreCompactSelect</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.817">getCtPreCompactSelect</a>()</pre>
 </li>
 </ul>
 <a name="getCtPostCompactSelect--">
@@ -2941,7 +3008,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>getCtPostCompactSelect</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.807">getCtPostCompactSelect</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.821">getCtPostCompactSelect</a>()</pre>
 </li>
 </ul>
 <a name="getCtPreCompact--">
@@ -2950,7 +3017,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>getCtPreCompact</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.811">getCtPreCompact</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.825">getCtPreCompact</a>()</pre>
 </li>
 </ul>
 <a name="getCtPostCompact--">
@@ -2959,7 +3026,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>getCtPostCompact</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.815">getCtPostCompact</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.829">getCtPostCompact</a>()</pre>
 </li>
 </ul>
 <a name="getCtPreGet--">
@@ -2968,7 +3035,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>getCtPreGet</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.819">getCtPreGet</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.833">getCtPreGet</a>()</pre>
 </li>
 </ul>
 <a name="getCtPostGet--">
@@ -2977,7 +3044,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>getCtPostGet</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.823">getCtPostGet</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.837">getCtPostGet</a>()</pre>
 </li>
 </ul>
 <a name="getCtPrePut--">
@@ -2986,7 +3053,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>getCtPrePut</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.827">getCtPrePut</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.841">getCtPrePut</a>()</pre>
 </li>
 </ul>
 <a name="getCtPostPut--">
@@ -2995,7 +3062,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>getCtPostPut</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.831">getCtPostPut</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.845">getCtPostPut</a>()</pre>
 </li>
 </ul>
 <a name="getCtPreDeleted--">
@@ -3004,7 +3071,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>getCtPreDeleted</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.835">getCtPreDeleted</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.849">getCtPreDeleted</a>()</pre>
 </li>
 </ul>
 <a name="getCtPostDeleted--">
@@ -3013,7 +3080,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>getCtPostDeleted</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.839">getCtPostDeleted</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.853">getCtPostDeleted</a>()</pre>
 </li>
 </ul>
 <a name="getCtPreIncrement--">
@@ -3022,7 +3089,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>getCtPreIncrement</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.843">getCtPreIncrement</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.857">getCtPreIncrement</a>()</pre>
 </li>
 </ul>
 <a name="getCtPostIncrement--">
@@ -3031,7 +3098,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>getCtPostIncrement</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.847">getCtPostIncrement</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.861">getCtPostIncrement</a>()</pre>
 </li>
 </ul>
 <a name="getCtPreReplayWALs--">
@@ -3040,7 +3107,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>getCtPreReplayWALs</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.851">getCtPreReplayWALs</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.865">getCtPreReplayWALs</a>()</pre>
 </li>
 </ul>
 <a name="getCtPostReplayWALs--">
@@ -3049,7 +3116,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>getCtPostReplayWALs</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.855">getCtPostReplayWALs</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.869">getCtPostReplayWALs</a>()</pre>
 </li>
 </ul>
 <a name="getCtPreWALRestore--">
@@ -3058,7 +3125,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>getCtPreWALRestore</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.859">getCtPreWALRestore</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.873">getCtPreWALRestore</a>()</pre>
 </li>
 </ul>
 <a name="getCtPostWALRestore--">
@@ -3067,7 +3134,16 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>getCtPostWALRestore</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.863">getCtPostWALRestore</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.877">getCtPostWALRestore</a>()</pre>
+</li>
+</ul>
+<a name="getCtPreWALAppend--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>getCtPreWALAppend</h4>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.881">getCtPreWALAppend</a>()</pre>
 </li>
 </ul>
 <a name="wasStoreFileReaderOpenCalled--">
@@ -3076,7 +3152,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>wasStoreFileReaderOpenCalled</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.867">wasStoreFileReaderOpenCalled</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#line.885">wasStoreFileReaderOpenCalled</a>()</pre>
 </li>
 </ul>
 </li>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestAppendTimeRange.MyObserver.html b/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestAppendTimeRange.MyObserver.html
index eaadc02..6bdd0db 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestAppendTimeRange.MyObserver.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestAppendTimeRange.MyObserver.html
@@ -243,7 +243,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.RegionObserver</h3>
-<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALRestore</code></li>
+<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALAppend, preWALRestore</code></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestCoprocessorHost.SimpleRegionObserverV2.html b/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestCoprocessorHost.SimpleRegionObserverV2.html
index 208a0cf..d0b8fa8 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestCoprocessorHost.SimpleRegionObserverV2.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestCoprocessorHost.SimpleRegionObserverV2.html
@@ -157,7 +157,7 @@
 <!--   -->
 </a>
 <h3>Fields inherited from class&nbsp;org.apache.hadoop.hbase.coprocessor.<a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html" title="class in org.apache.hadoop.hbase.coprocessor">SimpleRegionObserver</a></h3>
-<code><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctBeforeDelete">ctBeforeDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostAppend">ctPostAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostBatchMutate">ctPostBatchMutate</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostBatchMutateIndispensably">ctPostBatchMutateIndispensably</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostBulkLoadHFile">ctPostBulkLoadHFile</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostCheckAndDelete">ctPostCheckAndDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostCheckAndPut">ctPostCheckAndPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostClose">ctPostClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostCloseRegionOperation">ctPostCloseRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostCompact">ctPostCompact</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostCompactSelect">ctPostCompactSelect</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostDeleted">ctPostDeleted</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostFlush">ctPostFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostGet">ctPostGet</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostIncrement">ctPostIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostOpen">ctPostOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostPut">ctPostPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostReplayWALs">ctPostReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostScannerClose">ctPostScannerClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostScannerFilterRow">ctPostScannerFilterRow</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostScannerNext">ctPostScannerNext</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostScannerOpen">ctPostScannerOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostStartRegionOperation">ctPostStartRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostStoreFileReaderOpen">ctPostStoreFileReaderOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostWALRestore">ctPostWALRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreAppend">ctPreAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreAppendAfterRowLock">ctPreAppendAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreBatchMutate">ctPreBatchMutate</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreBulkLoadHFile">ctPreBulkLoadHFile</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreCheckAndDelete">ctPreCheckAndDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreCheckAndDeleteAfterRowLock">ctPreCheckAndDeleteAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreCheckAndPut">ctPreCheckAndPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreCheckAndPutAfterRowLock">ctPreCheckAndPutAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreClose">ctPreClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreCompact">ctPreCompact</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreCompactSelect">ctPreCompactSelect</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreDeleted">ctPreDeleted</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreFlush">ctPreFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreGet">ctPreGet</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreIncrement">ctPreIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreIncrementAfterRowLock">ctPreIncrementAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreOpen">ctPreOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPrePrepareDeleteTS">ctPrePrepareDeleteTS</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPrePut">ctPrePut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreReplayWALs">ctPreReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreScannerClose">ctPreScannerClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreScannerNext">ctPreScannerNext</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreScannerOpen">ctPreScannerOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreStoreFileReaderOpen">ctPreStoreFileReaderOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreWALRestore">ctPreWALRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#TABLE_SKIPPED">TABLE_SKIPPED</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#throwOnPostFlush">throwOnPostFlush</a></code></li>
+<code><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctBeforeDelete">ctBeforeDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostAppend">ctPostAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostBatchMutate">ctPostBatchMutate</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostBatchMutateIndispensably">ctPostBatchMutateIndispensably</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostBulkLoadHFile">ctPostBulkLoadHFile</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostCheckAndDelete">ctPostCheckAndDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostCheckAndPut">ctPostCheckAndPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostClose">ctPostClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostCloseRegionOperation">ctPostCloseRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostCompact">ctPostCompact</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostCompactSelect">ctPostCompactSelect</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostDeleted">ctPostDeleted</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostFlush">ctPostFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostGet">ctPostGet</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostIncrement">ctPostIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostOpen">ctPostOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostPut">ctPostPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostReplayWALs">ctPostReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostScannerClose">ctPostScannerClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostScannerFilterRow">ctPostScannerFilterRow</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostScannerNext">ctPostScannerNext</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostScannerOpen">ctPostScannerOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostStartRegionOperation">ctPostStartRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostStoreFileReaderOpen">ctPostStoreFileReaderOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostWALRestore">ctPostWALRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreAppend">ctPreAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreAppendAfterRowLock">ctPreAppendAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreBatchMutate">ctPreBatchMutate</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreBulkLoadHFile">ctPreBulkLoadHFile</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreCheckAndDelete">ctPreCheckAndDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreCheckAndDeleteAfterRowLock">ctPreCheckAndDeleteAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreCheckAndPut">ctPreCheckAndPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreCheckAndPutAfterRowLock">ctPreCheckAndPutAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreClose">ctPreClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreCompact">ctPreCompact</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreCompactSelect">ctPreCompactSelect</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreDeleted">ctPreDeleted</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreFlush">ctPreFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreGet">ctPreGet</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreIncrement">ctPreIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreIncrementAfterRowLock">ctPreIncrementAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreOpen">ctPreOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPrePrepareDeleteTS">ctPrePrepareDeleteTS</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPrePut">ctPrePut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreReplayWALs">ctPreReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreScannerClose">ctPreScannerClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreScannerNext">ctPreScannerNext</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreScannerOpen">ctPreScannerOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreStoreFileReaderOpen">ctPreStoreFileReaderOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreWALAppend">ctPreWALAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreWALRestore">ctPreWALRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#extendedAttributes">extendedAttributes</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#TABLE_SKIPPED">TABLE_SKIPPED</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#throwOnPostFlush">throwOnPostFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#WAL_EXTENDED_ATTRIBUTE_BYTES">WAL_EXTENDED_ATTRIBUTE_BYTES</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="fields.inherited.from.class.org.apache.hadoop.hbase.Coprocessor">
@@ -196,7 +196,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.coprocessor.<a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html" title="class in org.apache.hadoop.hbase.coprocessor">SimpleRegionObserver</a></h3>
-<code><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtBeforeDelete--">getCtBeforeDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostClose--">getCtPostClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostCloseRegionOperation--">getCtPostCloseRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostCompact--">getCtPostCompact</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostCompactSelect--">getCtPostCompactSelect</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostDeleted--">getCtPostDeleted</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostFlush--">getCtPostFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostGet--">getCtPostGet</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostIncrement--">getCtPostIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostOpen--">getCtPostOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostPut--">getCtPostPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostReplayWALs--">getCtPostReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostStartRegionOperation--">getCtPostStartRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostWALRestore--">getCtPostWALRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreClose--">getCtPreClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreCompact--">getCtPreCompact</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreCompactSelect--">getCtPreCompactSelect</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreDeleted--">getCtPreDeleted</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreFlush--">getCtPreFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreGet--">getCtPreGet</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreIncrement--">getCtPreIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreOpen--">getCtPreOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPrePut--">getCtPrePut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreReplayWALs--">getCtPreReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreWALRestore--">getCtPreWALRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getRegionObserver--">getRegionObserver</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadDelete--">hadDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadDeleted--">hadDeleted</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostAppend--">hadPostAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostBatchMutate--">hadPostBatchMutate</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostBatchMutateIndispensably--">hadPostBatchMutateIndispensably</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostBulkLoadHFile--">hadPostBulkLoadHFile</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostCheckAndDelete--">hadPostCheckAndDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostCheckAndPut--">hadPostCheckAndPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostCloseRegionOperation--">hadPostCloseRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostGet--">hadPostGet</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostIncrement--">hadPostIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostPut--">hadPostPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostReplayWALs--">hadPostReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostStartRegionOperation--">hadPostStartRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostWALRestore--">hadPostWALRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreAppend--">hadPreAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreAppendAfterRowLock--">hadPreAppendAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreBatchMutate--">hadPreBatchMutate</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreBulkLoadHFile--">hadPreBulkLoadHFile</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreCheckAndDelete--">hadPreCheckAndDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreCheckAndDeleteAfterRowLock--">hadPreCheckAndDeleteAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreCheckAndPut--">hadPreCheckAndPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreCheckAndPutAfterRowLock--">hadPreCheckAndPutAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreGet--">hadPreGet</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreIncrement--">hadPreIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreIncrementAfterRowLock--">hadPreIncrementAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPrePreparedDeleteTS--">hadPrePreparedDeleteTS</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPrePut--">hadPrePut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreReplayWALs--">hadPreReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreWALRestore--">hadPreWALRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-org.apache.hadoop.hbase.client.Result-">postAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postBatchMutate-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-">postBatchMutate</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postBatchMutateIndispensably-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-boolean-">postBatchMutateIndispensably</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postBulkLoadHFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.List-java.util.Map-">postBulkLoadHFile</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postCheckAndDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">postCheckAndDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postCheckAndPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">postCheckAndPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-boolean-">postClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postCloseRegionOperation-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Region.Operation-">postCloseRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postCompact-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.StoreFile-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">postCompact</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postCompactSelection-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-java.util.List-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">postCompactSelection</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Delete-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">postDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.StoreFile-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">postFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postGetOp-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-java.util.List-">postGetOp</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postIncrement-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-org.apache.hadoop.hbase.client.Result-">postIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-">postOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Put-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">postPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postReplayWALs-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.fs.Path-">postReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postScannerClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-">postScannerClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postScannerFilterRow-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.Cell-boolean-">postScannerFilterRow</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postScannerNext-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-java.util.List-int-boolean-">postScannerNext</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Scan-org.apache.hadoop.hbase.regionserver.RegionScanner-">postScannerOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postStartRegionOperation-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Region.Operation-">postStartRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postStoreFileReaderOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-org.apache.hadoop.hbase.io.FSDataInputStreamWrapper-long-org.apache.hadoop.hbase.io.hfile.CacheConfig-org.apache.hadoop.hbase.io.Reference-org.apache.hadoop.hbase.regionserver.StoreFileReader-">postStoreFileReaderOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postWALRestore-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">postWALRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-">preAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preAppendAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-">preAppendAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preBatchMutate-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-">preBatchMutate</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preBulkLoadHFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.List-">preBulkLoadHFile</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preCheckAndDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">preCheckAndDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preCheckAndDeleteAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">preCheckAndDeleteAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preCheckAndPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">preCheckAndPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preCheckAndPutAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">preCheckAndPutAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-boolean-">preClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preCompact-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.regionserver.ScanType-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">preCompact</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preCompactSelection-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-java.util.List-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-">preCompactSelection</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Delete-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">preDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">preFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preGetOp-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-java.util.List-">preGetOp</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preIncrement-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-">preIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preIncrementAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-">preIncrementAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-">preOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#prePrepareTimeStampForDeleteVersion-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Mutation-org.apache.hadoop.hbase.Cell-byte:A-org.apache.hadoop.hbase.client.Get-">prePrepareTimeStampForDeleteVersion</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#prePut-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Put-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">prePut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preReplayWALs-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.fs.Path-">preReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preScannerClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-">preScannerClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preScannerNext-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-java.util.List-int-boolean-">preScannerNext</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Scan-">preScannerOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preStoreFileReaderOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-org.apache.hadoop.hbase.io.FSDataInputStreamWrapper-long-org.apache.hadoop.hbase.io.hfile.CacheConfig-org.apache.hadoop.hbase.io.Reference-org.apache.hadoop.hbase.regionserver.StoreFileReader-">preStoreFileReaderOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preWALRestore-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">preWALRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#setThrowOnPostFlush-java.lang.Boolean-">setThrowOnPostFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#start-org.apache.hadoop.hbase.CoprocessorEnvironment-">start</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasClosed--">wasClosed</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasCompacted--">wasCompacted</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasFlushed--">wasFlushed</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasOpened--">wasOpened</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasScannerCloseCalled--">wasScannerCloseCalled</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasScannerFilterRowCalled--">wasScannerFilterRowCalled</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasScannerNextCalled--">wasScannerNextCalled</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasScannerOpenCalled--">wasScannerOpenCalled</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasStoreFileReaderOpenCalled--">wasStoreFileReaderOpenCalled</a></code></li>
+<code><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtBeforeDelete--">getCtBeforeDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostClose--">getCtPostClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostCloseRegionOperation--">getCtPostCloseRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostCompact--">getCtPostCompact</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostCompactSelect--">getCtPostCompactSelect</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostDeleted--">getCtPostDeleted</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostFlush--">getCtPostFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostGet--">getCtPostGet</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostIncrement--">getCtPostIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostOpen--">getCtPostOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostPut--">getCtPostPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostReplayWALs--">getCtPostReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostStartRegionOperation--">getCtPostStartRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostWALRestore--">getCtPostWALRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreClose--">getCtPreClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreCompact--">getCtPreCompact</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreCompactSelect--">getCtPreCompactSelect</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreDeleted--">getCtPreDeleted</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreFlush--">getCtPreFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreGet--">getCtPreGet</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreIncrement--">getCtPreIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreOpen--">getCtPreOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPrePut--">getCtPrePut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreReplayWALs--">getCtPreReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreWALAppend--">getCtPreWALAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreWALRestore--">getCtPreWALRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getRegionObserver--">getRegionObserver</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadDelete--">hadDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadDeleted--">hadDeleted</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostAppend--">hadPostAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostBatchMutate--">hadPostBatchMutate</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostBatchMutateIndispensably--">hadPostBatchMutateIndispensably</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostBulkLoadHFile--">hadPostBulkLoadHFile</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostCheckAndDelete--">hadPostCheckAndDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostCheckAndPut--">hadPostCheckAndPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostCloseRegionOperation--">hadPostCloseRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostGet--">hadPostGet</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostIncrement--">hadPostIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostPut--">hadPostPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostReplayWALs--">hadPostReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostStartRegionOperation--">hadPostStartRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostWALRestore--">hadPostWALRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreAppend--">hadPreAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreAppendAfterRowLock--">hadPreAppendAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreBatchMutate--">hadPreBatchMutate</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreBulkLoadHFile--">hadPreBulkLoadHFile</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreCheckAndDelete--">hadPreCheckAndDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreCheckAndDeleteAfterRowLock--">hadPreCheckAndDeleteAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreCheckAndPut--">hadPreCheckAndPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreCheckAndPutAfterRowLock--">hadPreCheckAndPutAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreGet--">hadPreGet</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreIncrement--">hadPreIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreIncrementAfterRowLock--">hadPreIncrementAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPrePreparedDeleteTS--">hadPrePreparedDeleteTS</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPrePut--">hadPrePut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreReplayWALs--">hadPreReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreWALRestore--">hadPreWALRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-org.apache.hadoop.hbase.client.Result-">postAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postBatchMutate-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-">postBatchMutate</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postBatchMutateIndispensably-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-boolean-">postBatchMutateIndispensably</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postBulkLoadHFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.List-java.util.Map-">postBulkLoadHFile</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postCheckAndDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">postCheckAndDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postCheckAndPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">postCheckAndPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-boolean-">postClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postCloseRegionOperation-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Region.Operation-">postCloseRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postCompact-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.StoreFile-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">postCompact</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postCompactSelection-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-java.util.List-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">postCompactSelection</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Delete-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">postDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.StoreFile-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">postFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postGetOp-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-java.util.List-">postGetOp</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postIncrement-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-org.apache.hadoop.hbase.client.Result-">postIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-">postOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Put-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">postPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postReplayWALs-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.fs.Path-">postReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postScannerClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-">postScannerClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postScannerFilterRow-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.Cell-boolean-">postScannerFilterRow</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postScannerNext-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-java.util.List-int-boolean-">postScannerNext</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Scan-org.apache.hadoop.hbase.regionserver.RegionScanner-">postScannerOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postStartRegionOperation-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Region.Operation-">postStartRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postStoreFileReaderOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-org.apache.hadoop.hbase.io.FSDataInputStreamWrapper-long-org.apache.hadoop.hbase.io.hfile.CacheConfig-org.apache.hadoop.hbase.io.Reference-org.apache.hadoop.hbase.regionserver.StoreFileReader-">postStoreFileReaderOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postWALRestore-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">postWALRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-">preAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preAppendAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-">preAppendAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preBatchMutate-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-">preBatchMutate</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preBulkLoadHFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.List-">preBulkLoadHFile</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preCheckAndDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">preCheckAndDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preCheckAndDeleteAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">preCheckAndDeleteAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preCheckAndPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">preCheckAndPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preCheckAndPutAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">preCheckAndPutAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-boolean-">preClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preCompact-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.regionserver.ScanType-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">preCompact</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preCompactSelection-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-java.util.List-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-">preCompactSelection</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Delete-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">preDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">preFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preGetOp-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-java.util.List-">preGetOp</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preIncrement-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-">preIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preIncrementAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-">preIncrementAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-">preOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#prePrepareTimeStampForDeleteVersion-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Mutation-org.apache.hadoop.hbase.Cell-byte:A-org.apache.hadoop.hbase.client.Get-">prePrepareTimeStampForDeleteVersion</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#prePut-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Put-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">prePut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preReplayWALs-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.fs.Path-">preReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preScannerClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-">preScannerClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preScannerNext-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-java.util.List-int-boolean-">preScannerNext</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Scan-">preScannerOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preStoreFileReaderOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-org.apache.hadoop.hbase.io.FSDataInputStreamWrapper-long-org.apache.hadoop.hbase.io.hfile.CacheConfig-org.apache.hadoop.hbase.io.Reference-org.apache.hadoop.hbase.regionserver.StoreFileReader-">preStoreFileReaderOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preWALAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">preWALAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preWALRestore-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">preWALRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#setThrowOnPostFlush-java.lang.Boolean-">setThrowOnPostFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#start-org.apache.hadoop.hbase.CoprocessorEnvironment-">start</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasClosed--">wasClosed</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasCompacted--">wasCompacted</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasFlushed--">wasFlushed</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasOpened--">wasOpened</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasScannerCloseCalled--">wasScannerCloseCalled</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasScannerFilterRowCalled--">wasScannerFilterRowCalled</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasScannerNextCalled--">wasScannerNextCalled</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasScannerOpenCalled--">wasScannerOpenCalled</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasStoreFileReaderOpenCalled--">wasStoreFileReaderOpenCalled</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
diff --git a/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestCoprocessorInterface.CoprocessorImpl.html b/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestCoprocessorInterface.CoprocessorImpl.html
index 65bf2ff..f778890 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestCoprocessorInterface.CoprocessorImpl.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestCoprocessorInterface.CoprocessorImpl.html
@@ -361,7 +361,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.RegionObserver</h3>
-<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postCloseRegionOperation, postCommitStoreFile, postCompactSelection, postDelete, postExists, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preCommitStoreFile, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALRestore</code></li>
+<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postCloseRegionOperation, postCommitStoreFile, postCompactSelection, postDelete, postExists, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preCommitStoreFile, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALAppend, preWALRestore</code></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestCoprocessorMetrics.CustomRegionObserver.html b/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestCoprocessorMetrics.CustomRegionObserver.html
index 5f0c149..5fee318 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestCoprocessorMetrics.CustomRegionObserver.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestCoprocessorMetrics.CustomRegionObserver.html
@@ -249,7 +249,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.RegionObserver</h3>
-<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALRestore</code></li>
+<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALAppend, preWALRestore</code></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestCoprocessorMetrics.CustomRegionObserver2.html b/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestCoprocessorMetrics.CustomRegionObserver2.html
index c92f8a2..d295719 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestCoprocessorMetrics.CustomRegionObserver2.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestCoprocessorMetrics.CustomRegionObserver2.html
@@ -217,7 +217,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.RegionObserver</h3>
-<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALRestore</code></li>
+<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALAppend, preWALRestore</code></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestIncrementAndAppendWithNullResult.MyObserver.html b/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestIncrementAndAppendWithNullResult.MyObserver.html
index 4cee843..6d7359d 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestIncrementAndAppendWithNullResult.MyObserver.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestIncrementAndAppendWithNullResult.MyObserver.html
@@ -256,7 +256,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.RegionObserver</h3>
-<code>postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALRestore</code></li>
+<code>postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALAppend, preWALRestore</code></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestIncrementTimeRange.MyObserver.html b/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestIncrementTimeRange.MyObserver.html
index 5fb54db..fcca482 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestIncrementTimeRange.MyObserver.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestIncrementTimeRange.MyObserver.html
@@ -178,7 +178,7 @@
 <!--   -->
 </a>
 <h3>Fields inherited from class&nbsp;org.apache.hadoop.hbase.coprocessor.<a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html" title="class in org.apache.hadoop.hbase.coprocessor">SimpleRegionObserver</a></h3>
-<code><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctBeforeDelete">ctBeforeDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostAppend">ctPostAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostBatchMutate">ctPostBatchMutate</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostBatchMutateIndispensably">ctPostBatchMutateIndispensably</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostBulkLoadHFile">ctPostBulkLoadHFile</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostCheckAndDelete">ctPostCheckAndDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostCheckAndPut">ctPostCheckAndPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostClose">ctPostClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostCloseRegionOperation">ctPostCloseRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostCompact">ctPostCompact</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostCompactSelect">ctPostCompactSelect</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostDeleted">ctPostDeleted</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostFlush">ctPostFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostGet">ctPostGet</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostIncrement">ctPostIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostOpen">ctPostOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostPut">ctPostPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostReplayWALs">ctPostReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostScannerClose">ctPostScannerClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostScannerFilterRow">ctPostScannerFilterRow</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostScannerNext">ctPostScannerNext</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostScannerOpen">ctPostScannerOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostStartRegionOperation">ctPostStartRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostStoreFileReaderOpen">ctPostStoreFileReaderOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostWALRestore">ctPostWALRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreAppend">ctPreAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreAppendAfterRowLock">ctPreAppendAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreBatchMutate">ctPreBatchMutate</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreBulkLoadHFile">ctPreBulkLoadHFile</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreCheckAndDelete">ctPreCheckAndDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreCheckAndDeleteAfterRowLock">ctPreCheckAndDeleteAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreCheckAndPut">ctPreCheckAndPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreCheckAndPutAfterRowLock">ctPreCheckAndPutAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreClose">ctPreClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreCompact">ctPreCompact</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreCompactSelect">ctPreCompactSelect</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreDeleted">ctPreDeleted</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreFlush">ctPreFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreGet">ctPreGet</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreIncrement">ctPreIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreIncrementAfterRowLock">ctPreIncrementAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreOpen">ctPreOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPrePrepareDeleteTS">ctPrePrepareDeleteTS</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPrePut">ctPrePut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreReplayWALs">ctPreReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreScannerClose">ctPreScannerClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreScannerNext">ctPreScannerNext</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreScannerOpen">ctPreScannerOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreStoreFileReaderOpen">ctPreStoreFileReaderOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreWALRestore">ctPreWALRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#TABLE_SKIPPED">TABLE_SKIPPED</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#throwOnPostFlush">throwOnPostFlush</a></code></li>
+<code><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctBeforeDelete">ctBeforeDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostAppend">ctPostAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostBatchMutate">ctPostBatchMutate</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostBatchMutateIndispensably">ctPostBatchMutateIndispensably</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostBulkLoadHFile">ctPostBulkLoadHFile</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostCheckAndDelete">ctPostCheckAndDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostCheckAndPut">ctPostCheckAndPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostClose">ctPostClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostCloseRegionOperation">ctPostCloseRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostCompact">ctPostCompact</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostCompactSelect">ctPostCompactSelect</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostDeleted">ctPostDeleted</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostFlush">ctPostFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostGet">ctPostGet</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostIncrement">ctPostIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostOpen">ctPostOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostPut">ctPostPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostReplayWALs">ctPostReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostScannerClose">ctPostScannerClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostScannerFilterRow">ctPostScannerFilterRow</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostScannerNext">ctPostScannerNext</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostScannerOpen">ctPostScannerOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostStartRegionOperation">ctPostStartRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostStoreFileReaderOpen">ctPostStoreFileReaderOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostWALRestore">ctPostWALRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreAppend">ctPreAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreAppendAfterRowLock">ctPreAppendAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreBatchMutate">ctPreBatchMutate</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreBulkLoadHFile">ctPreBulkLoadHFile</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreCheckAndDelete">ctPreCheckAndDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreCheckAndDeleteAfterRowLock">ctPreCheckAndDeleteAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreCheckAndPut">ctPreCheckAndPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreCheckAndPutAfterRowLock">ctPreCheckAndPutAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreClose">ctPreClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreCompact">ctPreCompact</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreCompactSelect">ctPreCompactSelect</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreDeleted">ctPreDeleted</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreFlush">ctPreFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreGet">ctPreGet</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreIncrement">ctPreIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreIncrementAfterRowLock">ctPreIncrementAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreOpen">ctPreOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPrePrepareDeleteTS">ctPrePrepareDeleteTS</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPrePut">ctPrePut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreReplayWALs">ctPreReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreScannerClose">ctPreScannerClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreScannerNext">ctPreScannerNext</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreScannerOpen">ctPreScannerOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreStoreFileReaderOpen">ctPreStoreFileReaderOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreWALAppend">ctPreWALAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreWALRestore">ctPreWALRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#extendedAttributes">extendedAttributes</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#TABLE_SKIPPED">TABLE_SKIPPED</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#throwOnPostFlush">throwOnPostFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#WAL_EXTENDED_ATTRIBUTE_BYTES">WAL_EXTENDED_ATTRIBUTE_BYTES</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="fields.inherited.from.class.org.apache.hadoop.hbase.Coprocessor">
@@ -229,7 +229,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.coprocessor.<a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html" title="class in org.apache.hadoop.hbase.coprocessor">SimpleRegionObserver</a></h3>
-<code><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtBeforeDelete--">getCtBeforeDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostClose--">getCtPostClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostCloseRegionOperation--">getCtPostCloseRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostCompact--">getCtPostCompact</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostCompactSelect--">getCtPostCompactSelect</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostDeleted--">getCtPostDeleted</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostFlush--">getCtPostFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostGet--">getCtPostGet</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostIncrement--">getCtPostIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostOpen--">getCtPostOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostPut--">getCtPostPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostReplayWALs--">getCtPostReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostStartRegionOperation--">getCtPostStartRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostWALRestore--">getCtPostWALRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreClose--">getCtPreClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreCompact--">getCtPreCompact</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreCompactSelect--">getCtPreCompactSelect</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreDeleted--">getCtPreDeleted</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreFlush--">getCtPreFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreGet--">getCtPreGet</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreIncrement--">getCtPreIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreOpen--">getCtPreOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPrePut--">getCtPrePut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreReplayWALs--">getCtPreReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreWALRestore--">getCtPreWALRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getRegionObserver--">getRegionObserver</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadDelete--">hadDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadDeleted--">hadDeleted</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostAppend--">hadPostAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostBatchMutate--">hadPostBatchMutate</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostBatchMutateIndispensably--">hadPostBatchMutateIndispensably</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostBulkLoadHFile--">hadPostBulkLoadHFile</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostCheckAndDelete--">hadPostCheckAndDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostCheckAndPut--">hadPostCheckAndPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostCloseRegionOperation--">hadPostCloseRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostGet--">hadPostGet</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostIncrement--">hadPostIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostPut--">hadPostPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostReplayWALs--">hadPostReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostStartRegionOperation--">hadPostStartRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostWALRestore--">hadPostWALRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreAppend--">hadPreAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreAppendAfterRowLock--">hadPreAppendAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreBatchMutate--">hadPreBatchMutate</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreBulkLoadHFile--">hadPreBulkLoadHFile</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreCheckAndDelete--">hadPreCheckAndDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreCheckAndDeleteAfterRowLock--">hadPreCheckAndDeleteAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreCheckAndPut--">hadPreCheckAndPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreCheckAndPutAfterRowLock--">hadPreCheckAndPutAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreGet--">hadPreGet</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreIncrement--">hadPreIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreIncrementAfterRowLock--">hadPreIncrementAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPrePreparedDeleteTS--">hadPrePreparedDeleteTS</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPrePut--">hadPrePut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreReplayWALs--">hadPreReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreWALRestore--">hadPreWALRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-org.apache.hadoop.hbase.client.Result-">postAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postBatchMutate-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-">postBatchMutate</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postBatchMutateIndispensably-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-boolean-">postBatchMutateIndispensably</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postBulkLoadHFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.List-java.util.Map-">postBulkLoadHFile</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postCheckAndDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">postCheckAndDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postCheckAndPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">postCheckAndPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-boolean-">postClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postCloseRegionOperation-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Region.Operation-">postCloseRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postCompact-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.StoreFile-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">postCompact</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postCompactSelection-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-java.util.List-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">postCompactSelection</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Delete-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">postDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.StoreFile-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">postFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postGetOp-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-java.util.List-">postGetOp</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postIncrement-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-org.apache.hadoop.hbase.client.Result-">postIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-">postOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Put-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">postPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postReplayWALs-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.fs.Path-">postReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postScannerClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-">postScannerClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postScannerFilterRow-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.Cell-boolean-">postScannerFilterRow</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postScannerNext-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-java.util.List-int-boolean-">postScannerNext</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Scan-org.apache.hadoop.hbase.regionserver.RegionScanner-">postScannerOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postStartRegionOperation-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Region.Operation-">postStartRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postStoreFileReaderOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-org.apache.hadoop.hbase.io.FSDataInputStreamWrapper-long-org.apache.hadoop.hbase.io.hfile.CacheConfig-org.apache.hadoop.hbase.io.Reference-org.apache.hadoop.hbase.regionserver.StoreFileReader-">postStoreFileReaderOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postWALRestore-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">postWALRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-">preAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preAppendAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-">preAppendAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preBatchMutate-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-">preBatchMutate</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preBulkLoadHFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.List-">preBulkLoadHFile</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preCheckAndDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">preCheckAndDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preCheckAndDeleteAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">preCheckAndDeleteAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preCheckAndPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">preCheckAndPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preCheckAndPutAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">preCheckAndPutAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-boolean-">preClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preCompact-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.regionserver.ScanType-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">preCompact</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preCompactSelection-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-java.util.List-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-">preCompactSelection</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Delete-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">preDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">preFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preGetOp-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-java.util.List-">preGetOp</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preIncrementAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-">preIncrementAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-">preOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#prePrepareTimeStampForDeleteVersion-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Mutation-org.apache.hadoop.hbase.Cell-byte:A-org.apache.hadoop.hbase.client.Get-">prePrepareTimeStampForDeleteVersion</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#prePut-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Put-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">prePut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preReplayWALs-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.fs.Path-">preReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preScannerClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-">preScannerClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preScannerNext-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-java.util.List-int-boolean-">preScannerNext</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Scan-">preScannerOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preStoreFileReaderOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-org.apache.hadoop.hbase.io.FSDataInputStreamWrapper-long-org.apache.hadoop.hbase.io.hfile.CacheConfig-org.apache.hadoop.hbase.io.Reference-org.apache.hadoop.hbase.regionserver.StoreFileReader-">preStoreFileReaderOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preWALRestore-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">preWALRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#setThrowOnPostFlush-java.lang.Boolean-">setThrowOnPostFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#start-org.apache.hadoop.hbase.CoprocessorEnvironment-">start</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasClosed--">wasClosed</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasCompacted--">wasCompacted</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasFlushed--">wasFlushed</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasOpened--">wasOpened</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasScannerCloseCalled--">wasScannerCloseCalled</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasScannerFilterRowCalled--">wasScannerFilterRowCalled</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasScannerNextCalled--">wasScannerNextCalled</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasScannerOpenCalled--">wasScannerOpenCalled</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasStoreFileReaderOpenCalled--">wasStoreFileReaderOpenCalled</a></code></li>
+<code><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtBeforeDelete--">getCtBeforeDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostClose--">getCtPostClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostCloseRegionOperation--">getCtPostCloseRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostCompact--">getCtPostCompact</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostCompactSelect--">getCtPostCompactSelect</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostDeleted--">getCtPostDeleted</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostFlush--">getCtPostFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostGet--">getCtPostGet</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostIncrement--">getCtPostIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostOpen--">getCtPostOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostPut--">getCtPostPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostReplayWALs--">getCtPostReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostStartRegionOperation--">getCtPostStartRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostWALRestore--">getCtPostWALRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreClose--">getCtPreClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreCompact--">getCtPreCompact</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreCompactSelect--">getCtPreCompactSelect</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreDeleted--">getCtPreDeleted</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreFlush--">getCtPreFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreGet--">getCtPreGet</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreIncrement--">getCtPreIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreOpen--">getCtPreOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPrePut--">getCtPrePut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreReplayWALs--">getCtPreReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreWALAppend--">getCtPreWALAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreWALRestore--">getCtPreWALRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getRegionObserver--">getRegionObserver</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadDelete--">hadDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadDeleted--">hadDeleted</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostAppend--">hadPostAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostBatchMutate--">hadPostBatchMutate</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostBatchMutateIndispensably--">hadPostBatchMutateIndispensably</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostBulkLoadHFile--">hadPostBulkLoadHFile</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostCheckAndDelete--">hadPostCheckAndDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostCheckAndPut--">hadPostCheckAndPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostCloseRegionOperation--">hadPostCloseRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostGet--">hadPostGet</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostIncrement--">hadPostIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostPut--">hadPostPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostReplayWALs--">hadPostReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostStartRegionOperation--">hadPostStartRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostWALRestore--">hadPostWALRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreAppend--">hadPreAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreAppendAfterRowLock--">hadPreAppendAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreBatchMutate--">hadPreBatchMutate</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreBulkLoadHFile--">hadPreBulkLoadHFile</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreCheckAndDelete--">hadPreCheckAndDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreCheckAndDeleteAfterRowLock--">hadPreCheckAndDeleteAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreCheckAndPut--">hadPreCheckAndPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreCheckAndPutAfterRowLock--">hadPreCheckAndPutAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreGet--">hadPreGet</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreIncrement--">hadPreIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreIncrementAfterRowLock--">hadPreIncrementAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPrePreparedDeleteTS--">hadPrePreparedDeleteTS</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPrePut--">hadPrePut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreReplayWALs--">hadPreReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreWALRestore--">hadPreWALRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-org.apache.hadoop.hbase.client.Result-">postAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postBatchMutate-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-">postBatchMutate</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postBatchMutateIndispensably-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-boolean-">postBatchMutateIndispensably</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postBulkLoadHFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.List-java.util.Map-">postBulkLoadHFile</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postCheckAndDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">postCheckAndDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postCheckAndPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">postCheckAndPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-boolean-">postClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postCloseRegionOperation-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Region.Operation-">postCloseRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postCompact-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.StoreFile-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">postCompact</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postCompactSelection-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-java.util.List-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">postCompactSelection</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Delete-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">postDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.StoreFile-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">postFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postGetOp-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-java.util.List-">postGetOp</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postIncrement-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-org.apache.hadoop.hbase.client.Result-">postIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-">postOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Put-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">postPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postReplayWALs-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.fs.Path-">postReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postScannerClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-">postScannerClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postScannerFilterRow-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.Cell-boolean-">postScannerFilterRow</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postScannerNext-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-java.util.List-int-boolean-">postScannerNext</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Scan-org.apache.hadoop.hbase.regionserver.RegionScanner-">postScannerOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postStartRegionOperation-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Region.Operation-">postStartRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postStoreFileReaderOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-org.apache.hadoop.hbase.io.FSDataInputStreamWrapper-long-org.apache.hadoop.hbase.io.hfile.CacheConfig-org.apache.hadoop.hbase.io.Reference-org.apache.hadoop.hbase.regionserver.StoreFileReader-">postStoreFileReaderOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postWALRestore-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">postWALRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-">preAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preAppendAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-">preAppendAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preBatchMutate-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-">preBatchMutate</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preBulkLoadHFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.List-">preBulkLoadHFile</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preCheckAndDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">preCheckAndDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preCheckAndDeleteAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">preCheckAndDeleteAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preCheckAndPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">preCheckAndPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preCheckAndPutAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">preCheckAndPutAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-boolean-">preClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preCompact-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.regionserver.ScanType-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">preCompact</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preCompactSelection-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-java.util.List-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-">preCompactSelection</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Delete-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">preDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">preFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preGetOp-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-java.util.List-">preGetOp</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preIncrementAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-">preIncrementAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-">preOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#prePrepareTimeStampForDeleteVersion-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Mutation-org.apache.hadoop.hbase.Cell-byte:A-org.apache.hadoop.hbase.client.Get-">prePrepareTimeStampForDeleteVersion</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#prePut-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Put-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">prePut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preReplayWALs-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.fs.Path-">preReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preScannerClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-">preScannerClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preScannerNext-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-java.util.List-int-boolean-">preScannerNext</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Scan-">preScannerOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preStoreFileReaderOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-org.apache.hadoop.hbase.io.FSDataInputStreamWrapper-long-org.apache.hadoop.hbase.io.hfile.CacheConfig-org.apache.hadoop.hbase.io.Reference-org.apache.hadoop.hbase.regionserver.StoreFileReader-">preStoreFileReaderOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preWALAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">preWALAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preWALRestore-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">preWALRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#setThrowOnPostFlush-java.lang.Boolean-">setThrowOnPostFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#start-org.apache.hadoop.hbase.CoprocessorEnvironment-">start</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasClosed--">wasClosed</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasCompacted--">wasCompacted</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasFlushed--">wasFlushed</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasOpened--">wasOpened</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasScannerCloseCalled--">wasScannerCloseCalled</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasScannerFilterRowCalled--">wasScannerFilterRowCalled</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasScannerNextCalled--">wasScannerNextCalled</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasScannerOpenCalled--">wasScannerOpenCalled</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasStoreFileReaderOpenCalled--">wasStoreFileReaderOpenCalled</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
diff --git a/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestNegativeMemStoreSizeWithSlowCoprocessor.FlushingRegionObserver.html b/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestNegativeMemStoreSizeWithSlowCoprocessor.FlushingRegionObserver.html
index 98c5be9..5297d68 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestNegativeMemStoreSizeWithSlowCoprocessor.FlushingRegionObserver.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestNegativeMemStoreSizeWithSlowCoprocessor.FlushingRegionObserver.html
@@ -163,7 +163,7 @@
 <!--   -->
 </a>
 <h3>Fields inherited from class&nbsp;org.apache.hadoop.hbase.coprocessor.<a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html" title="class in org.apache.hadoop.hbase.coprocessor">SimpleRegionObserver</a></h3>
-<code><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctBeforeDelete">ctBeforeDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostAppend">ctPostAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostBatchMutate">ctPostBatchMutate</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostBatchMutateIndispensably">ctPostBatchMutateIndispensably</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostBulkLoadHFile">ctPostBulkLoadHFile</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostCheckAndDelete">ctPostCheckAndDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostCheckAndPut">ctPostCheckAndPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostClose">ctPostClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostCloseRegionOperation">ctPostCloseRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostCompact">ctPostCompact</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostCompactSelect">ctPostCompactSelect</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostDeleted">ctPostDeleted</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostFlush">ctPostFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostGet">ctPostGet</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostIncrement">ctPostIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostOpen">ctPostOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostPut">ctPostPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostReplayWALs">ctPostReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostScannerClose">ctPostScannerClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostScannerFilterRow">ctPostScannerFilterRow</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostScannerNext">ctPostScannerNext</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostScannerOpen">ctPostScannerOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostStartRegionOperation">ctPostStartRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostStoreFileReaderOpen">ctPostStoreFileReaderOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostWALRestore">ctPostWALRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreAppend">ctPreAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreAppendAfterRowLock">ctPreAppendAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreBatchMutate">ctPreBatchMutate</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreBulkLoadHFile">ctPreBulkLoadHFile</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreCheckAndDelete">ctPreCheckAndDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreCheckAndDeleteAfterRowLock">ctPreCheckAndDeleteAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreCheckAndPut">ctPreCheckAndPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreCheckAndPutAfterRowLock">ctPreCheckAndPutAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreClose">ctPreClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreCompact">ctPreCompact</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreCompactSelect">ctPreCompactSelect</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreDeleted">ctPreDeleted</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreFlush">ctPreFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreGet">ctPreGet</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreIncrement">ctPreIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreIncrementAfterRowLock">ctPreIncrementAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreOpen">ctPreOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPrePrepareDeleteTS">ctPrePrepareDeleteTS</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPrePut">ctPrePut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreReplayWALs">ctPreReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreScannerClose">ctPreScannerClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreScannerNext">ctPreScannerNext</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreScannerOpen">ctPreScannerOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreStoreFileReaderOpen">ctPreStoreFileReaderOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreWALRestore">ctPreWALRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#TABLE_SKIPPED">TABLE_SKIPPED</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#throwOnPostFlush">throwOnPostFlush</a></code></li>
+<code><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctBeforeDelete">ctBeforeDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostAppend">ctPostAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostBatchMutate">ctPostBatchMutate</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostBatchMutateIndispensably">ctPostBatchMutateIndispensably</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostBulkLoadHFile">ctPostBulkLoadHFile</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostCheckAndDelete">ctPostCheckAndDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostCheckAndPut">ctPostCheckAndPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostClose">ctPostClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostCloseRegionOperation">ctPostCloseRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostCompact">ctPostCompact</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostCompactSelect">ctPostCompactSelect</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostDeleted">ctPostDeleted</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostFlush">ctPostFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostGet">ctPostGet</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostIncrement">ctPostIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostOpen">ctPostOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostPut">ctPostPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostReplayWALs">ctPostReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostScannerClose">ctPostScannerClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostScannerFilterRow">ctPostScannerFilterRow</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostScannerNext">ctPostScannerNext</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostScannerOpen">ctPostScannerOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostStartRegionOperation">ctPostStartRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostStoreFileReaderOpen">ctPostStoreFileReaderOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostWALRestore">ctPostWALRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreAppend">ctPreAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreAppendAfterRowLock">ctPreAppendAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreBatchMutate">ctPreBatchMutate</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreBulkLoadHFile">ctPreBulkLoadHFile</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreCheckAndDelete">ctPreCheckAndDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreCheckAndDeleteAfterRowLock">ctPreCheckAndDeleteAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreCheckAndPut">ctPreCheckAndPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreCheckAndPutAfterRowLock">ctPreCheckAndPutAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreClose">ctPreClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreCompact">ctPreCompact</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreCompactSelect">ctPreCompactSelect</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreDeleted">ctPreDeleted</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreFlush">ctPreFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreGet">ctPreGet</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreIncrement">ctPreIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreIncrementAfterRowLock">ctPreIncrementAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreOpen">ctPreOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPrePrepareDeleteTS">ctPrePrepareDeleteTS</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPrePut">ctPrePut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreReplayWALs">ctPreReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreScannerClose">ctPreScannerClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreScannerNext">ctPreScannerNext</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreScannerOpen">ctPreScannerOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreStoreFileReaderOpen">ctPreStoreFileReaderOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreWALAppend">ctPreWALAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreWALRestore">ctPreWALRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#extendedAttributes">extendedAttributes</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#TABLE_SKIPPED">TABLE_SKIPPED</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#throwOnPostFlush">throwOnPostFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#WAL_EXTENDED_ATTRIBUTE_BYTES">WAL_EXTENDED_ATTRIBUTE_BYTES</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="fields.inherited.from.class.org.apache.hadoop.hbase.Coprocessor">
@@ -216,7 +216,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.coprocessor.<a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html" title="class in org.apache.hadoop.hbase.coprocessor">SimpleRegionObserver</a></h3>
-<code><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtBeforeDelete--">getCtBeforeDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostClose--">getCtPostClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostCloseRegionOperation--">getCtPostCloseRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostCompact--">getCtPostCompact</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostCompactSelect--">getCtPostCompactSelect</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostDeleted--">getCtPostDeleted</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostFlush--">getCtPostFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostGet--">getCtPostGet</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostIncrement--">getCtPostIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostOpen--">getCtPostOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostPut--">getCtPostPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostReplayWALs--">getCtPostReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostStartRegionOperation--">getCtPostStartRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostWALRestore--">getCtPostWALRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreClose--">getCtPreClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreCompact--">getCtPreCompact</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreCompactSelect--">getCtPreCompactSelect</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreDeleted--">getCtPreDeleted</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreFlush--">getCtPreFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreGet--">getCtPreGet</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreIncrement--">getCtPreIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreOpen--">getCtPreOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPrePut--">getCtPrePut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreReplayWALs--">getCtPreReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreWALRestore--">getCtPreWALRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getRegionObserver--">getRegionObserver</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadDelete--">hadDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadDeleted--">hadDeleted</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostAppend--">hadPostAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostBatchMutate--">hadPostBatchMutate</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostBatchMutateIndispensably--">hadPostBatchMutateIndispensably</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostBulkLoadHFile--">hadPostBulkLoadHFile</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostCheckAndDelete--">hadPostCheckAndDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostCheckAndPut--">hadPostCheckAndPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostCloseRegionOperation--">hadPostCloseRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostGet--">hadPostGet</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostIncrement--">hadPostIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostPut--">hadPostPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostReplayWALs--">hadPostReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostStartRegionOperation--">hadPostStartRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostWALRestore--">hadPostWALRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreAppend--">hadPreAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreAppendAfterRowLock--">hadPreAppendAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreBatchMutate--">hadPreBatchMutate</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreBulkLoadHFile--">hadPreBulkLoadHFile</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreCheckAndDelete--">hadPreCheckAndDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreCheckAndDeleteAfterRowLock--">hadPreCheckAndDeleteAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreCheckAndPut--">hadPreCheckAndPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreCheckAndPutAfterRowLock--">hadPreCheckAndPutAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreGet--">hadPreGet</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreIncrement--">hadPreIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreIncrementAfterRowLock--">hadPreIncrementAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPrePreparedDeleteTS--">hadPrePreparedDeleteTS</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPrePut--">hadPrePut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreReplayWALs--">hadPreReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreWALRestore--">hadPreWALRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-org.apache.hadoop.hbase.client.Result-">postAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postBatchMutate-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-">postBatchMutate</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postBatchMutateIndispensably-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-boolean-">postBatchMutateIndispensably</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postBulkLoadHFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.List-java.util.Map-">postBulkLoadHFile</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postCheckAndDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">postCheckAndDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postCheckAndPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">postCheckAndPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-boolean-">postClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postCloseRegionOperation-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Region.Operation-">postCloseRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postCompact-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.StoreFile-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">postCompact</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postCompactSelection-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-java.util.List-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">postCompactSelection</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Delete-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">postDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.StoreFile-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">postFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postGetOp-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-java.util.List-">postGetOp</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postIncrement-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-org.apache.hadoop.hbase.client.Result-">postIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-">postOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postReplayWALs-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.fs.Path-">postReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postScannerClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-">postScannerClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postScannerFilterRow-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.Cell-boolean-">postScannerFilterRow</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postScannerNext-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-java.util.List-int-boolean-">postScannerNext</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Scan-org.apache.hadoop.hbase.regionserver.RegionScanner-">postScannerOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postStartRegionOperation-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Region.Operation-">postStartRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postStoreFileReaderOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-org.apache.hadoop.hbase.io.FSDataInputStreamWrapper-long-org.apache.hadoop.hbase.io.hfile.CacheConfig-org.apache.hadoop.hbase.io.Reference-org.apache.hadoop.hbase.regionserver.StoreFileReader-">postStoreFileReaderOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postWALRestore-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">postWALRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-">preAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preAppendAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-">preAppendAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preBatchMutate-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-">preBatchMutate</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preBulkLoadHFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.List-">preBulkLoadHFile</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preCheckAndDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">preCheckAndDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preCheckAndDeleteAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">preCheckAndDeleteAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preCheckAndPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">preCheckAndPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preCheckAndPutAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">preCheckAndPutAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-boolean-">preClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preCompact-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.regionserver.ScanType-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">preCompact</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preCompactSelection-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-java.util.List-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-">preCompactSelection</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Delete-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">preDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">preFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preGetOp-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-java.util.List-">preGetOp</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preIncrement-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-">preIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preIncrementAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-">preIncrementAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-">preOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#prePrepareTimeStampForDeleteVersion-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Mutation-org.apache.hadoop.hbase.Cell-byte:A-org.apache.hadoop.hbase.client.Get-">prePrepareTimeStampForDeleteVersion</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#prePut-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Put-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">prePut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preReplayWALs-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.fs.Path-">preReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preScannerClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-">preScannerClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preScannerNext-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-java.util.List-int-boolean-">preScannerNext</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Scan-">preScannerOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preStoreFileReaderOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-org.apache.hadoop.hbase.io.FSDataInputStreamWrapper-long-org.apache.hadoop.hbase.io.hfile.CacheConfig-org.apache.hadoop.hbase.io.Reference-org.apache.hadoop.hbase.regionserver.StoreFileReader-">preStoreFileReaderOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preWALRestore-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">preWALRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#setThrowOnPostFlush-java.lang.Boolean-">setThrowOnPostFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#start-org.apache.hadoop.hbase.CoprocessorEnvironment-">start</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasClosed--">wasClosed</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasCompacted--">wasCompacted</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasFlushed--">wasFlushed</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasOpened--">wasOpened</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasScannerCloseCalled--">wasScannerCloseCalled</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasScannerFilterRowCalled--">wasScannerFilterRowCalled</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasScannerNextCalled--">wasScannerNextCalled</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasScannerOpenCalled--">wasScannerOpenCalled</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasStoreFileReaderOpenCalled--">wasStoreFileReaderOpenCalled</a></code></li>
+<code><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtBeforeDelete--">getCtBeforeDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostClose--">getCtPostClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostCloseRegionOperation--">getCtPostCloseRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostCompact--">getCtPostCompact</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostCompactSelect--">getCtPostCompactSelect</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostDeleted--">getCtPostDeleted</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostFlush--">getCtPostFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostGet--">getCtPostGet</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostIncrement--">getCtPostIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostOpen--">getCtPostOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostPut--">getCtPostPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostReplayWALs--">getCtPostReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostStartRegionOperation--">getCtPostStartRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostWALRestore--">getCtPostWALRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreClose--">getCtPreClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreCompact--">getCtPreCompact</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreCompactSelect--">getCtPreCompactSelect</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreDeleted--">getCtPreDeleted</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreFlush--">getCtPreFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreGet--">getCtPreGet</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreIncrement--">getCtPreIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreOpen--">getCtPreOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPrePut--">getCtPrePut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreReplayWALs--">getCtPreReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreWALAppend--">getCtPreWALAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreWALRestore--">getCtPreWALRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getRegionObserver--">getRegionObserver</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadDelete--">hadDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadDeleted--">hadDeleted</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostAppend--">hadPostAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostBatchMutate--">hadPostBatchMutate</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostBatchMutateIndispensably--">hadPostBatchMutateIndispensably</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostBulkLoadHFile--">hadPostBulkLoadHFile</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostCheckAndDelete--">hadPostCheckAndDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostCheckAndPut--">hadPostCheckAndPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostCloseRegionOperation--">hadPostCloseRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostGet--">hadPostGet</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostIncrement--">hadPostIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostPut--">hadPostPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostReplayWALs--">hadPostReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostStartRegionOperation--">hadPostStartRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostWALRestore--">hadPostWALRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreAppend--">hadPreAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreAppendAfterRowLock--">hadPreAppendAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreBatchMutate--">hadPreBatchMutate</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreBulkLoadHFile--">hadPreBulkLoadHFile</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreCheckAndDelete--">hadPreCheckAndDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreCheckAndDeleteAfterRowLock--">hadPreCheckAndDeleteAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreCheckAndPut--">hadPreCheckAndPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreCheckAndPutAfterRowLock--">hadPreCheckAndPutAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreGet--">hadPreGet</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreIncrement--">hadPreIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreIncrementAfterRowLock--">hadPreIncrementAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPrePreparedDeleteTS--">hadPrePreparedDeleteTS</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPrePut--">hadPrePut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreReplayWALs--">hadPreReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreWALRestore--">hadPreWALRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-org.apache.hadoop.hbase.client.Result-">postAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postBatchMutate-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-">postBatchMutate</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postBatchMutateIndispensably-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-boolean-">postBatchMutateIndispensably</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postBulkLoadHFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.List-java.util.Map-">postBulkLoadHFile</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postCheckAndDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">postCheckAndDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postCheckAndPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">postCheckAndPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-boolean-">postClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postCloseRegionOperation-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Region.Operation-">postCloseRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postCompact-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.StoreFile-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">postCompact</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postCompactSelection-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-java.util.List-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">postCompactSelection</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Delete-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">postDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.StoreFile-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">postFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postGetOp-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-java.util.List-">postGetOp</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postIncrement-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-org.apache.hadoop.hbase.client.Result-">postIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-">postOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postReplayWALs-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.fs.Path-">postReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postScannerClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-">postScannerClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postScannerFilterRow-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.Cell-boolean-">postScannerFilterRow</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postScannerNext-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-java.util.List-int-boolean-">postScannerNext</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Scan-org.apache.hadoop.hbase.regionserver.RegionScanner-">postScannerOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postStartRegionOperation-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Region.Operation-">postStartRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postStoreFileReaderOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-org.apache.hadoop.hbase.io.FSDataInputStreamWrapper-long-org.apache.hadoop.hbase.io.hfile.CacheConfig-org.apache.hadoop.hbase.io.Reference-org.apache.hadoop.hbase.regionserver.StoreFileReader-">postStoreFileReaderOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postWALRestore-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">postWALRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-">preAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preAppendAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-">preAppendAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preBatchMutate-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-">preBatchMutate</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preBulkLoadHFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.List-">preBulkLoadHFile</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preCheckAndDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">preCheckAndDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preCheckAndDeleteAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">preCheckAndDeleteAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preCheckAndPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">preCheckAndPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preCheckAndPutAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">preCheckAndPutAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-boolean-">preClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preCompact-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.regionserver.ScanType-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">preCompact</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preCompactSelection-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-java.util.List-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-">preCompactSelection</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Delete-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">preDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">preFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preGetOp-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-java.util.List-">preGetOp</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preIncrement-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-">preIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preIncrementAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-">preIncrementAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-">preOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#prePrepareTimeStampForDeleteVersion-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Mutation-org.apache.hadoop.hbase.Cell-byte:A-org.apache.hadoop.hbase.client.Get-">prePrepareTimeStampForDeleteVersion</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#prePut-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Put-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">prePut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preReplayWALs-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.fs.Path-">preReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preScannerClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-">preScannerClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preScannerNext-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-java.util.List-int-boolean-">preScannerNext</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Scan-">preScannerOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preStoreFileReaderOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-org.apache.hadoop.hbase.io.FSDataInputStreamWrapper-long-org.apache.hadoop.hbase.io.hfile.CacheConfig-org.apache.hadoop.hbase.io.Reference-org.apache.hadoop.hbase.regionserver.StoreFileReader-">preStoreFileReaderOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preWALAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">preWALAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preWALRestore-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">preWALRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#setThrowOnPostFlush-java.lang.Boolean-">setThrowOnPostFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#start-org.apache.hadoop.hbase.CoprocessorEnvironment-">start</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasClosed--">wasClosed</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasCompacted--">wasCompacted</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasFlushed--">wasFlushed</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasOpened--">wasOpened</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasScannerCloseCalled--">wasScannerCloseCalled</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasScannerFilterRowCalled--">wasScannerFilterRowCalled</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasScannerNextCalled--">wasScannerNextCalled</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasScannerOpenCalled--">wasScannerOpenCalled</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasStoreFileReaderOpenCalled--">wasStoreFileReaderOpenCalled</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
diff --git a/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestOpenTableInCoprocessor.CustomThreadPoolCoprocessor.html b/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestOpenTableInCoprocessor.CustomThreadPoolCoprocessor.html
index 901c1a7..3a977b9 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestOpenTableInCoprocessor.CustomThreadPoolCoprocessor.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestOpenTableInCoprocessor.CustomThreadPoolCoprocessor.html
@@ -235,7 +235,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.RegionObserver</h3>
-<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALRestore</code></li>
+<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALAppend, preWALRestore</code></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestOpenTableInCoprocessor.SendToOtherTableCoprocessor.html b/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestOpenTableInCoprocessor.SendToOtherTableCoprocessor.html
index dff999d..d941544 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestOpenTableInCoprocessor.SendToOtherTableCoprocessor.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestOpenTableInCoprocessor.SendToOtherTableCoprocessor.html
@@ -231,7 +231,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.RegionObserver</h3>
-<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALRestore</code></li>
+<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALAppend, preWALRestore</code></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestPassCustomCellViaRegionObserver.RegionObserverImpl.html b/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestPassCustomCellViaRegionObserver.RegionObserverImpl.html
index 0ca435e..202356f 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestPassCustomCellViaRegionObserver.RegionObserverImpl.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestPassCustomCellViaRegionObserver.RegionObserverImpl.html
@@ -280,7 +280,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.RegionObserver</h3>
-<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDeleteAfterRowLock, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALRestore</code></li>
+<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDeleteAfterRowLock, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALAppend, preWALRestore</code></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestPostIncrementAndAppendBeforeWAL.ChangeCellWithDifferntColumnFamilyObserver.html b/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestPostIncrementAndAppendBeforeWAL.ChangeCellWithDifferntColumnFamilyObserver.html
index 9d356c4..6e04a61 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestPostIncrementAndAppendBeforeWAL.ChangeCellWithDifferntColumnFamilyObserver.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestPostIncrementAndAppendBeforeWAL.ChangeCellWithDifferntColumnFamilyObserver.html
@@ -239,7 +239,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.RegionObserver</h3>
-<code>postAppend, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALRestore</code></li>
+<code>postAppend, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALAppend, preWALRestore</code></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestPostIncrementAndAppendBeforeWAL.ChangeCellWithNotExistColumnFamilyObserver.html b/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestPostIncrementAndAppendBeforeWAL.ChangeCellWithNotExistColumnFamilyObserver.html
index 8c2769f..4f70a3f 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestPostIncrementAndAppendBeforeWAL.ChangeCellWithNotExistColumnFamilyObserver.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestPostIncrementAndAppendBeforeWAL.ChangeCellWithNotExistColumnFamilyObserver.html
@@ -239,7 +239,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.RegionObserver</h3>
-<code>postAppend, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALRestore</code></li>
+<code>postAppend, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALAppend, preWALRestore</code></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionObserverBypass.TestCoprocessor.html b/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionObserverBypass.TestCoprocessor.html
index 97e4745..1516de7 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionObserverBypass.TestCoprocessor.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionObserverBypass.TestCoprocessor.html
@@ -249,7 +249,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.RegionObserver</h3>
-<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALRestore</code></li>
+<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALAppend, preWALRestore</code></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionObserverBypass.TestCoprocessor2.html b/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionObserverBypass.TestCoprocessor2.html
index 9c45e87..ecbf894 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionObserverBypass.TestCoprocessor2.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionObserverBypass.TestCoprocessor2.html
@@ -225,7 +225,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.RegionObserver</h3>
-<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALRestore</code></li>
+<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALAppend, preWALRestore</code></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionObserverBypass.TestCoprocessor3.html b/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionObserverBypass.TestCoprocessor3.html
index 46d3a86..6618174 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionObserverBypass.TestCoprocessor3.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionObserverBypass.TestCoprocessor3.html
@@ -225,7 +225,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.RegionObserver</h3>
-<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALRestore</code></li>
+<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALAppend, preWALRestore</code></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionObserverForAddingMutationsFromCoprocessors.TestDeleteCellCoprocessor.html b/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionObserverForAddingMutationsFromCoprocessors.TestDeleteCellCoprocessor.html
index 959908f..f712be8 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionObserverForAddingMutationsFromCoprocessors.TestDeleteCellCoprocessor.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionObserverForAddingMutationsFromCoprocessors.TestDeleteCellCoprocessor.html
@@ -228,7 +228,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.RegionObserver</h3>
-<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALRestore</code></li>
+<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALAppend, preWALRestore</code></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionObserverForAddingMutationsFromCoprocessors.TestDeleteFamilyCoprocessor.html b/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionObserverForAddingMutationsFromCoprocessors.TestDeleteFamilyCoprocessor.html
index 8403068..71fc5f8 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionObserverForAddingMutationsFromCoprocessors.TestDeleteFamilyCoprocessor.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionObserverForAddingMutationsFromCoprocessors.TestDeleteFamilyCoprocessor.html
@@ -228,7 +228,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.RegionObserver</h3>
-<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALRestore</code></li>
+<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALAppend, preWALRestore</code></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionObserverForAddingMutationsFromCoprocessors.TestDeleteRowCoprocessor.html b/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionObserverForAddingMutationsFromCoprocessors.TestDeleteRowCoprocessor.html
index 2f5a9df..93ba38f 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionObserverForAddingMutationsFromCoprocessors.TestDeleteRowCoprocessor.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionObserverForAddingMutationsFromCoprocessors.TestDeleteRowCoprocessor.html
@@ -228,7 +228,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.RegionObserver</h3>
-<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALRestore</code></li>
+<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALAppend, preWALRestore</code></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionObserverForAddingMutationsFromCoprocessors.TestMultiMutationCoprocessor.html b/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionObserverForAddingMutationsFromCoprocessors.TestMultiMutationCoprocessor.html
index 73da77f..92fba37 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionObserverForAddingMutationsFromCoprocessors.TestMultiMutationCoprocessor.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionObserverForAddingMutationsFromCoprocessors.TestMultiMutationCoprocessor.html
@@ -228,7 +228,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.RegionObserver</h3>
-<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALRestore</code></li>
+<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALAppend, preWALRestore</code></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionObserverForAddingMutationsFromCoprocessors.TestPutWithTTLCoprocessor.html b/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionObserverForAddingMutationsFromCoprocessors.TestPutWithTTLCoprocessor.html
index 6f9a64a..21a8217 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionObserverForAddingMutationsFromCoprocessors.TestPutWithTTLCoprocessor.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionObserverForAddingMutationsFromCoprocessors.TestPutWithTTLCoprocessor.html
@@ -228,7 +228,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.RegionObserver</h3>
-<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALRestore</code></li>
+<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALAppend, preWALRestore</code></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.EvenOnlyCompactor.html b/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.EvenOnlyCompactor.html
index 3c5d833..ac90494 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.EvenOnlyCompactor.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.EvenOnlyCompactor.html
@@ -50,7 +50,7 @@
 <div class="subNav">
 <ul class="navList">
 <li><a href="../../../../../org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html" title="class in org.apache.hadoop.hbase.coprocessor"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
-<li><a href="../../../../../org/apache/hadoop/hbase/coprocessor/TestRegionObserverPreFlushAndPreCompact.html" title="class in org.apache.hadoop.hbase.coprocessor"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.PreWALAppendWALActionsListener.html" title="class in org.apache.hadoop.hbase.coprocessor"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
 </ul>
 <ul class="navList">
 <li><a href="../../../../../index.html?org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.EvenOnlyCompactor.html" target="_top">Frames</a></li>
@@ -117,7 +117,7 @@
 </dl>
 <hr>
 <br>
-<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html#line.420">TestRegionObserverInterface.EvenOnlyCompactor</a>
+<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html#line.431">TestRegionObserverInterface.EvenOnlyCompactor</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 org.apache.hadoop.hbase.coprocessor.RegionCoprocessor, org.apache.hadoop.hbase.coprocessor.RegionObserver</pre>
 </li>
@@ -260,7 +260,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.RegionObserver</h3>
-<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompactSelection, postDelete, postExists, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALRestore</code></li>
+<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompactSelection, postDelete, postExists, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALAppend, preWALRestore</code></li>
 </ul>
 </li>
 </ul>
@@ -282,7 +282,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>lastCompaction</h4>
-<pre>long <a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.EvenOnlyCompactor.html#line.421">lastCompaction</a></pre>
+<pre>long <a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.EvenOnlyCompactor.html#line.432">lastCompaction</a></pre>
 </li>
 </ul>
 <a name="lastFlush">
@@ -291,7 +291,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>lastFlush</h4>
-<pre>long <a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.EvenOnlyCompactor.html#line.422">lastFlush</a></pre>
+<pre>long <a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.EvenOnlyCompactor.html#line.433">lastFlush</a></pre>
 </li>
 </ul>
 </li>
@@ -308,7 +308,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>EvenOnlyCompactor</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.EvenOnlyCompactor.html#line.420">EvenOnlyCompactor</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.EvenOnlyCompactor.html#line.431">EvenOnlyCompactor</a>()</pre>
 </li>
 </ul>
 </li>
@@ -325,7 +325,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionObserver</h4>
-<pre>public&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;org.apache.hadoop.hbase.coprocessor.RegionObserver&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.EvenOnlyCompactor.html#line.425">getRegionObserver</a>()</pre>
+<pre>public&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;org.apache.hadoop.hbase.coprocessor.RegionObserver&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.EvenOnlyCompactor.html#line.436">getRegionObserver</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code>getRegionObserver</code>&nbsp;in interface&nbsp;<code>org.apache.hadoop.hbase.coprocessor.RegionCoprocessor</code></dd>
@@ -338,7 +338,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>preCompact</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.regionserver.InternalScanner&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.EvenOnlyCompactor.html#line.430">preCompact</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;e,
+<pre>public&nbsp;org.apache.hadoop.hbase.regionserver.InternalScanner&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.EvenOnlyCompactor.html#line.441">preCompact</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;e,
                                                                        org.apache.hadoop.hbase.regionserver.Store&nbsp;store,
                                                                        org.apache.hadoop.hbase.regionserver.InternalScanner&nbsp;scanner,
                                                                        org.apache.hadoop.hbase.regionserver.ScanType&nbsp;scanType,
@@ -356,7 +356,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>postCompact</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.EvenOnlyCompactor.html#line.466">postCompact</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;e,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.EvenOnlyCompactor.html#line.477">postCompact</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;e,
                         org.apache.hadoop.hbase.regionserver.Store&nbsp;store,
                         org.apache.hadoop.hbase.regionserver.StoreFile&nbsp;resultFile,
                         org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker&nbsp;tracker,
@@ -373,7 +373,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>postFlush</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.EvenOnlyCompactor.html#line.472">postFlush</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;e,
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.EvenOnlyCompactor.html#line.483">postFlush</a>(org.apache.hadoop.hbase.coprocessor.ObserverContext&lt;org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment&gt;&nbsp;e,
                       org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker&nbsp;tracker)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
@@ -410,7 +410,7 @@
 <div class="subNav">
 <ul class="navList">
 <li><a href="../../../../../org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html" title="class in org.apache.hadoop.hbase.coprocessor"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
-<li><a href="../../../../../org/apache/hadoop/hbase/coprocessor/TestRegionObserverPreFlushAndPreCompact.html" title="class in org.apache.hadoop.hbase.coprocessor"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.PreWALAppendWALActionsListener.html" title="class in org.apache.hadoop.hbase.coprocessor"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
 </ul>
 <ul class="navList">
 <li><a href="../../../../../index.html?org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.EvenOnlyCompactor.html" target="_top">Frames</a></li>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.PreWALAppendWALActionsListener.html b/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.PreWALAppendWALActionsListener.html
new file mode 100644
index 0000000..06dc303
--- /dev/null
+++ b/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.PreWALAppendWALActionsListener.html
@@ -0,0 +1,367 @@
+<!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>TestRegionObserverInterface.PreWALAppendWALActionsListener (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="TestRegionObserverInterface.PreWALAppendWALActionsListener (Apache HBase 3.0.0-SNAPSHOT Test API)";
+        }
+    }
+    catch(err) {
+    }
+//-->
+var methods = {"i0":10,"i1":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/TestRegionObserverInterface.PreWALAppendWALActionsListener.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/coprocessor/TestRegionObserverInterface.EvenOnlyCompactor.html" title="class in org.apache.hadoop.hbase.coprocessor"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/coprocessor/TestRegionObserverPreFlushAndPreCompact.html" title="class in org.apache.hadoop.hbase.coprocessor"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
+</ul>
+<ul class="navList">
+<li><a href="../../../../../index.html?org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.PreWALAppendWALActionsListener.html" target="_top">Frames</a></li>
+<li><a href="TestRegionObserverInterface.PreWALAppendWALActionsListener.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.coprocessor</div>
+<h2 title="Class TestRegionObserverInterface.PreWALAppendWALActionsListener" class="title">Class TestRegionObserverInterface.PreWALAppendWALActionsListener</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.coprocessor.TestRegionObserverInterface.PreWALAppendWALActionsListener</li>
+</ul>
+</li>
+</ul>
+<div class="description">
+<ul class="blockList">
+<li class="blockList">
+<dl>
+<dt>All Implemented Interfaces:</dt>
+<dd>org.apache.hadoop.hbase.regionserver.wal.WALActionsListener</dd>
+</dl>
+<dl>
+<dt>Enclosing class:</dt>
+<dd><a href="../../../../../org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html" title="class in org.apache.hadoop.hbase.coprocessor">TestRegionObserverInterface</a></dd>
+</dl>
+<hr>
+<br>
+<pre>private static class <a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html#line.817">TestRegionObserverInterface.PreWALAppendWALActionsListener</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 org.apache.hadoop.hbase.regionserver.wal.WALActionsListener</pre>
+</li>
+</ul>
+</div>
+<div class="summary">
+<ul class="blockList">
+<li class="blockList">
+<!-- ======== NESTED CLASS SUMMARY ======== -->
+<ul class="blockList">
+<li class="blockList"><a name="nested.class.summary">
+<!--   -->
+</a>
+<h3>Nested Class Summary</h3>
+<ul class="blockList">
+<li class="blockList"><a name="nested.classes.inherited.from.class.org.apache.hadoop.hbase.regionserver.wal.WALActionsListener">
+<!--   -->
+</a>
+<h3>Nested classes/interfaces inherited from interface&nbsp;org.apache.hadoop.hbase.regionserver.wal.WALActionsListener</h3>
+<code>org.apache.hadoop.hbase.regionserver.wal.WALActionsListener.RollRequestReason</code></li>
+</ul>
+</li>
+</ul>
+<!-- =========== 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>(package private) boolean[]</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.PreWALAppendWALActionsListener.html#walKeysCorrect">walKeysCorrect</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="colFirst" scope="col">Modifier</th>
+<th class="colLast" scope="col">Constructor and Description</th>
+</tr>
+<tr class="altColor">
+<td class="colFirst"><code>private </code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.PreWALAppendWALActionsListener.html#PreWALAppendWALActionsListener--">PreWALAppendWALActionsListener</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>(package private) boolean[]</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.PreWALAppendWALActionsListener.html#getWalKeysCorrectArray--">getWalKeysCorrectArray</a></span>()</code>&nbsp;</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/coprocessor/TestRegionObserverInterface.PreWALAppendWALActionsListener.html#postAppend-long-long-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">postAppend</a></span>(long&nbsp;entryLen,
+          long&nbsp;elapsedTimeMillis,
+          org.apache.hadoop.hbase.wal.WALKey&nbsp;logKey,
+          org.apache.hadoop.hbase.wal.WALEdit&nbsp;logEdit)</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/java/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>
+<ul class="blockList">
+<li class="blockList"><a name="methods.inherited.from.class.org.apache.hadoop.hbase.regionserver.wal.WALActionsListener">
+<!--   -->
+</a>
+<h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.regionserver.wal.WALActionsListener</h3>
+<code>logCloseRequested, logRollRequested, postLogArchive, postLogRoll, postSync, preLogArchive, preLogRoll, visitLogEntryBeforeWrite, visitLogEntryBeforeWrite</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="walKeysCorrect">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>walKeysCorrect</h4>
+<pre>boolean[] <a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.PreWALAppendWALActionsListener.html#line.818">walKeysCorrect</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="PreWALAppendWALActionsListener--">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>PreWALAppendWALActionsListener</h4>
+<pre>private&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.PreWALAppendWALActionsListener.html#line.817">PreWALAppendWALActionsListener</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="postAppend-long-long-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>postAppend</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.PreWALAppendWALActionsListener.html#line.821">postAppend</a>(long&nbsp;entryLen,
+                       long&nbsp;elapsedTimeMillis,
+                       org.apache.hadoop.hbase.wal.WALKey&nbsp;logKey,
+                       org.apache.hadoop.hbase.wal.WALEdit&nbsp;logEdit)
+                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>postAppend</code>&nbsp;in interface&nbsp;<code>org.apache.hadoop.hbase.regionserver.wal.WALActionsListener</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="getWalKeysCorrectArray--">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>getWalKeysCorrectArray</h4>
+<pre>boolean[]&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.PreWALAppendWALActionsListener.html#line.831">getWalKeysCorrectArray</a>()</pre>
+</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/TestRegionObserverInterface.PreWALAppendWALActionsListener.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/coprocessor/TestRegionObserverInterface.EvenOnlyCompactor.html" title="class in org.apache.hadoop.hbase.coprocessor"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/coprocessor/TestRegionObserverPreFlushAndPreCompact.html" title="class in org.apache.hadoop.hbase.coprocessor"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
+</ul>
+<ul class="navList">
+<li><a href="../../../../../index.html?org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.PreWALAppendWALActionsListener.html" target="_top">Frames</a></li>
+<li><a href="TestRegionObserverInterface.PreWALAppendWALActionsListener.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;2019 <a href="https://www.apache.org/">The Apache Software Foundation</a>. All rights reserved.</small></p>
+</body>
+</html>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html b/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html
index 5bb3cf1..1951efd 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html
@@ -18,7 +18,7 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":10,"i1":9,"i2":9,"i3":9,"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};
+var methods = {"i0":10,"i1":9,"i2":9,"i3":9,"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};
 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 @@
 <li class="blockList">
 <hr>
 <br>
-<pre>public class <a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html#line.93">TestRegionObserverInterface</a>
+<pre>public class <a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html#line.103">TestRegionObserverInterface</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>
@@ -133,6 +133,10 @@
 <td class="colFirst"><code>static class&nbsp;</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.EvenOnlyCompactor.html" title="class in org.apache.hadoop.hbase.coprocessor">TestRegionObserverInterface.EvenOnlyCompactor</a></span></code>&nbsp;</td>
 </tr>
+<tr class="rowColor">
+<td class="colFirst"><code>private static class&nbsp;</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.PreWALAppendWALActionsListener.html" title="class in org.apache.hadoop.hbase.coprocessor">TestRegionObserverInterface.PreWALAppendWALActionsListener</a></span></code>&nbsp;</td>
+</tr>
 </table>
 </li>
 </ul>
@@ -169,22 +173,26 @@
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html#cluster">cluster</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
+<td class="colFirst"><code>static byte[]</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html#FAMILY">FAMILY</a></span></code>&nbsp;</td>
+</tr>
+<tr class="altColor">
 <td class="colFirst"><code>private static org.slf4j.Logger</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html#LOG">LOG</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<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/coprocessor/TestRegionObserverInterface.html#name">name</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>static byte[]</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html#ROW">ROW</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>static org.apache.hadoop.hbase.TableName</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html#TEST_TABLE">TEST_TABLE</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<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/coprocessor/TestRegionObserverInterface.html#util">util</a></span></code>&nbsp;</td>
 </tr>
@@ -276,21 +284,38 @@
 </tr>
 <tr id="i12" class="altColor">
 <td class="colFirst"><code>void</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html#testPreWALRestoreSkip--">testPreWALRestoreSkip</a></span>()</code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html#testPreWALAppend--">testPreWALAppend</a></span>()</code>&nbsp;</td>
 </tr>
 <tr id="i13" class="rowColor">
-<td class="colFirst"><code>void</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html#testRecovery--">testRecovery</a></span>()</code>&nbsp;</td>
+<td class="colFirst"><code>private void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html#testPreWALAppendHook-org.apache.hadoop.hbase.client.Table-org.apache.hadoop.hbase.TableName-">testPreWALAppendHook</a></span>(org.apache.hadoop.hbase.client.Table&nbsp;table,
+                    org.apache.hadoop.hbase.TableName&nbsp;tableName)</code>&nbsp;</td>
 </tr>
 <tr id="i14" class="altColor">
 <td class="colFirst"><code>void</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html#testRegionObserver--">testRegionObserver</a></span>()</code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html#testPreWALAppendIsWrittenToWAL--">testPreWALAppendIsWrittenToWAL</a></span>()</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/coprocessor/TestRegionObserverInterface.html#testRowMutation--">testRowMutation</a></span>()</code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html#testPreWALAppendNotCalledOnMetaEdit--">testPreWALAppendNotCalledOnMetaEdit</a></span>()</code>&nbsp;</td>
 </tr>
 <tr id="i16" class="altColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html#testPreWALRestoreSkip--">testPreWALRestoreSkip</a></span>()</code>&nbsp;</td>
+</tr>
+<tr id="i17" class="rowColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html#testRecovery--">testRecovery</a></span>()</code>&nbsp;</td>
+</tr>
+<tr id="i18" class="altColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html#testRegionObserver--">testRegionObserver</a></span>()</code>&nbsp;</td>
+</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/coprocessor/TestRegionObserverInterface.html#testRowMutation--">testRowMutation</a></span>()</code>&nbsp;</td>
+</tr>
+<tr id="i20" class="altColor">
 <td class="colFirst"><code>private void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html#verifyMethodResult-java.lang.Class-java.lang.String:A-org.apache.hadoop.hbase.TableName-java.lang.Object:A-">verifyMethodResult</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;?&gt;&nbsp;coprocessor,
                   <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;methodName,
@@ -325,7 +350,7 @@
 <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/coprocessor/TestRegionObserverInterface.html#line.96">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/coprocessor/TestRegionObserverInterface.html#line.106">CLASS_RULE</a></pre>
 </li>
 </ul>
 <a name="LOG">
@@ -334,7 +359,7 @@
 <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/coprocessor/TestRegionObserverInterface.html#line.99">LOG</a></pre>
+<pre>private static final&nbsp;org.slf4j.Logger <a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html#line.109">LOG</a></pre>
 </li>
 </ul>
 <a name="TEST_TABLE">
@@ -343,7 +368,16 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>TEST_TABLE</h4>
-<pre>public static final&nbsp;org.apache.hadoop.hbase.TableName <a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html#line.101">TEST_TABLE</a></pre>
+<pre>public static final&nbsp;org.apache.hadoop.hbase.TableName <a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html#line.111">TEST_TABLE</a></pre>
+</li>
+</ul>
+<a name="FAMILY">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>FAMILY</h4>
+<pre>public static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html#line.112">FAMILY</a></pre>
 </li>
 </ul>
 <a name="A">
@@ -352,7 +386,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>A</h4>
-<pre>public static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html#line.102">A</a></pre>
+<pre>public static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html#line.113">A</a></pre>
 </li>
 </ul>
 <a name="B">
@@ -361,7 +395,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>B</h4>
-<pre>public static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html#line.103">B</a></pre>
+<pre>public static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html#line.114">B</a></pre>
 </li>
 </ul>
 <a name="C">
@@ -370,7 +404,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>C</h4>
-<pre>public static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html#line.104">C</a></pre>
+<pre>public static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html#line.115">C</a></pre>
 </li>
 </ul>
 <a name="ROW">
@@ -379,7 +413,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>ROW</h4>
-<pre>public static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html#line.105">ROW</a></pre>
+<pre>public static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html#line.116">ROW</a></pre>
 </li>
 </ul>
 <a name="util">
@@ -388,7 +422,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>util</h4>
-<pre>private static&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/coprocessor/TestRegionObserverInterface.html#line.107">util</a></pre>
+<pre>private static&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/coprocessor/TestRegionObserverInterface.html#line.118">util</a></pre>
 </li>
 </ul>
 <a name="cluster">
@@ -397,7 +431,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>cluster</h4>
-<pre>private static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html" title="class in org.apache.hadoop.hbase">MiniHBaseCluster</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html#line.108">cluster</a></pre>
+<pre>private static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/MiniHBaseCluster.html" title="class in org.apache.hadoop.hbase">MiniHBaseCluster</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html#line.119">cluster</a></pre>
 </li>
 </ul>
 <a name="name">
@@ -406,7 +440,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>name</h4>
-<pre>public&nbsp;org.junit.rules.TestName <a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html#line.111">name</a></pre>
+<pre>public&nbsp;org.junit.rules.TestName <a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html#line.122">name</a></pre>
 </li>
 </ul>
 </li>
@@ -423,7 +457,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>TestRegionObserverInterface</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html#line.93">TestRegionObserverInterface</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html#line.103">TestRegionObserverInterface</a>()</pre>
 </li>
 </ul>
 </li>
@@ -440,7 +474,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>setupBeforeClass</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html#line.114">setupBeforeClass</a>()
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html#line.125">setupBeforeClass</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>
@@ -454,7 +488,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>tearDownAfterClass</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html#line.126">tearDownAfterClass</a>()
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html#line.137">tearDownAfterClass</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>
@@ -468,7 +502,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testRegionObserver</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html#line.131">testRegionObserver</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html#line.142">testRegionObserver</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>
@@ -482,7 +516,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testRowMutation</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html#line.191">testRowMutation</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html#line.202">testRowMutation</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>
@@ -496,7 +530,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testIncrementHook</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html#line.223">testIncrementHook</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html#line.234">testIncrementHook</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>
@@ -510,7 +544,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testCheckAndPutHooks</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html#line.246">testCheckAndPutHooks</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html#line.257">testCheckAndPutHooks</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>
@@ -524,7 +558,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testCheckAndDeleteHooks</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html#line.267">testCheckAndDeleteHooks</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html#line.278">testCheckAndDeleteHooks</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>
@@ -538,7 +572,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testAppendHook</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html#line.292">testAppendHook</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html#line.303">testAppendHook</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>
@@ -552,7 +586,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testHBase3583</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html#line.316">testHBase3583</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html#line.327">testHBase3583</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>
@@ -566,7 +600,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testHBASE14489</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html#line.358">testHBASE14489</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html#line.369">testHBASE14489</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>
@@ -580,7 +614,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testHBase3758</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html#line.383">testHBase3758</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html#line.394">testHBase3758</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>
@@ -594,7 +628,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testCompactionOverride</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html#line.483">testCompactionOverride</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html#line.494">testCompactionOverride</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>
 <div class="block">Tests overriding compaction handling via coprocessor hooks</div>
 <dl>
@@ -609,7 +643,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>bulkLoadHFileTest</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html#line.553">bulkLoadHFileTest</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html#line.564">bulkLoadHFileTest</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>
@@ -623,7 +657,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testRecovery</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html#line.582">testRecovery</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html#line.593">testRecovery</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>
@@ -637,7 +671,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testPreWALRestoreSkip</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html#line.632">testPreWALRestoreSkip</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html#line.643">testPreWALRestoreSkip</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>
@@ -645,13 +679,70 @@
 </dl>
 </li>
 </ul>
+<a name="testPreWALAppendHook-org.apache.hadoop.hbase.client.Table-org.apache.hadoop.hbase.TableName-">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>testPreWALAppendHook</h4>
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html#line.678">testPreWALAppendHook</a>(org.apache.hadoop.hbase.client.Table&nbsp;table,
+                                  org.apache.hadoop.hbase.TableName&nbsp;tableName)
+                           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="testPreWALAppend--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>testPreWALAppend</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html#line.709">testPreWALAppend</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>
+<a name="testPreWALAppendIsWrittenToWAL--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>testPreWALAppendIsWrittenToWAL</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html#line.722">testPreWALAppendIsWrittenToWAL</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>
+<a name="testPreWALAppendNotCalledOnMetaEdit--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>testPreWALAppendNotCalledOnMetaEdit</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html#line.739">testPreWALAppendNotCalledOnMetaEdit</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>
 <a name="verifyMethodResult-java.lang.Class-java.lang.String:A-org.apache.hadoop.hbase.TableName-java.lang.Object:A-">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>verifyMethodResult</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html#line.667">verifyMethodResult</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;?&gt;&nbsp;coprocessor,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html#line.769">verifyMethodResult</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;?&gt;&nbsp;coprocessor,
                                 <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;methodName,
                                 org.apache.hadoop.hbase.TableName&nbsp;tableName,
                                 <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;value)
@@ -668,7 +759,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>createHFile</h4>
-<pre>private static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html#line.698">createHFile</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
+<pre>private static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html#line.800">createHFile</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
                                 org.apache.hadoop.fs.FileSystem&nbsp;fs,
                                 org.apache.hadoop.fs.Path&nbsp;path,
                                 byte[]&nbsp;family,
diff --git a/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionObserverPreFlushAndPreCompact.TestRegionObserver.html b/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionObserverPreFlushAndPreCompact.TestRegionObserver.html
index 81dbb5c..af3c718 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionObserverPreFlushAndPreCompact.TestRegionObserver.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionObserverPreFlushAndPreCompact.TestRegionObserver.html
@@ -226,7 +226,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.RegionObserver</h3>
-<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALRestore</code></li>
+<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALAppend, preWALRestore</code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.org.apache.hadoop.hbase.coprocessor.RegionCoprocessor">
diff --git a/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionObserverPreFlushAndPreCompact.html b/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionObserverPreFlushAndPreCompact.html
index 60d1412..1b0d2d6 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionObserverPreFlushAndPreCompact.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionObserverPreFlushAndPreCompact.html
@@ -49,7 +49,7 @@
 </div>
 <div class="subNav">
 <ul class="navList">
-<li><a href="../../../../../org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.EvenOnlyCompactor.html" title="class in org.apache.hadoop.hbase.coprocessor"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.PreWALAppendWALActionsListener.html" title="class in org.apache.hadoop.hbase.coprocessor"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
 <li><a href="../../../../../org/apache/hadoop/hbase/coprocessor/TestRegionObserverPreFlushAndPreCompact.TestRegionObserver.html" title="class in org.apache.hadoop.hbase.coprocessor"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
 </ul>
 <ul class="navList">
@@ -346,7 +346,7 @@
 </div>
 <div class="subNav">
 <ul class="navList">
-<li><a href="../../../../../org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.EvenOnlyCompactor.html" title="class in org.apache.hadoop.hbase.coprocessor"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
+<li><a href="../../../../../org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.PreWALAppendWALActionsListener.html" title="class in org.apache.hadoop.hbase.coprocessor"><span class="typeNameLink">Prev&nbsp;Class</span></a></li>
 <li><a href="../../../../../org/apache/hadoop/hbase/coprocessor/TestRegionObserverPreFlushAndPreCompact.TestRegionObserver.html" title="class in org.apache.hadoop.hbase.coprocessor"><span class="typeNameLink">Next&nbsp;Class</span></a></li>
 </ul>
 <ul class="navList">
diff --git a/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionObserverScannerOpenHook.EmptyRegionObsever.html b/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionObserverScannerOpenHook.EmptyRegionObsever.html
index 81872ad..09db176 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionObserverScannerOpenHook.EmptyRegionObsever.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionObserverScannerOpenHook.EmptyRegionObsever.html
@@ -224,7 +224,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.RegionObserver</h3>
-<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALRestore</code></li>
+<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALAppend, preWALRestore</code></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionObserverScannerOpenHook.NoDataFromCompaction.html b/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionObserverScannerOpenHook.NoDataFromCompaction.html
index 076d29c..861f0bf 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionObserverScannerOpenHook.NoDataFromCompaction.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionObserverScannerOpenHook.NoDataFromCompaction.html
@@ -234,7 +234,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.RegionObserver</h3>
-<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALRestore</code></li>
+<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALAppend, preWALRestore</code></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionObserverScannerOpenHook.NoDataFromFlush.html b/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionObserverScannerOpenHook.NoDataFromFlush.html
index 94705dd..31a8106 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionObserverScannerOpenHook.NoDataFromFlush.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionObserverScannerOpenHook.NoDataFromFlush.html
@@ -231,7 +231,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.RegionObserver</h3>
-<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALRestore</code></li>
+<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALAppend, preWALRestore</code></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionObserverScannerOpenHook.NoDataFromScan.html b/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionObserverScannerOpenHook.NoDataFromScan.html
index 0a622b1..ce8abd2 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionObserverScannerOpenHook.NoDataFromScan.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionObserverScannerOpenHook.NoDataFromScan.html
@@ -235,7 +235,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.RegionObserver</h3>
-<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preStoreFileReaderOpen, preStoreScannerOpen, preWALRestore</code></li>
+<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preStoreFileReaderOpen, preStoreScannerOpen, preWALAppend, preWALRestore</code></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionObserverStacking.ObserverA.html b/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionObserverStacking.ObserverA.html
index eb7c16a..0064e4f 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionObserverStacking.ObserverA.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionObserverStacking.ObserverA.html
@@ -241,7 +241,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.RegionObserver</h3>
-<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALRestore</code></li>
+<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALAppend, preWALRestore</code></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionObserverStacking.ObserverB.html b/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionObserverStacking.ObserverB.html
index 3e5d1ff..f4ef25c 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionObserverStacking.ObserverB.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionObserverStacking.ObserverB.html
@@ -241,7 +241,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.RegionObserver</h3>
-<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALRestore</code></li>
+<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALAppend, preWALRestore</code></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionObserverStacking.ObserverC.html b/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionObserverStacking.ObserverC.html
index c86fbf2..04a92cb 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionObserverStacking.ObserverC.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionObserverStacking.ObserverC.html
@@ -241,7 +241,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.RegionObserver</h3>
-<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALRestore</code></li>
+<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALAppend, preWALRestore</code></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionServerCoprocessorExceptionWithAbort.BuggyRegionObserver.html b/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionServerCoprocessorExceptionWithAbort.BuggyRegionObserver.html
index 7ea6b8a..dfa044b 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionServerCoprocessorExceptionWithAbort.BuggyRegionObserver.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionServerCoprocessorExceptionWithAbort.BuggyRegionObserver.html
@@ -163,7 +163,7 @@
 <!--   -->
 </a>
 <h3>Fields inherited from class&nbsp;org.apache.hadoop.hbase.coprocessor.<a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html" title="class in org.apache.hadoop.hbase.coprocessor">SimpleRegionObserver</a></h3>
-<code><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctBeforeDelete">ctBeforeDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostAppend">ctPostAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostBatchMutate">ctPostBatchMutate</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostBatchMutateIndispensably">ctPostBatchMutateIndispensably</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostBulkLoadHFile">ctPostBulkLoadHFile</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostCheckAndDelete">ctPostCheckAndDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostCheckAndPut">ctPostCheckAndPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostClose">ctPostClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostCloseRegionOperation">ctPostCloseRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostCompact">ctPostCompact</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostCompactSelect">ctPostCompactSelect</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostDeleted">ctPostDeleted</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostFlush">ctPostFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostGet">ctPostGet</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostIncrement">ctPostIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostOpen">ctPostOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostPut">ctPostPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostReplayWALs">ctPostReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostScannerClose">ctPostScannerClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostScannerFilterRow">ctPostScannerFilterRow</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostScannerNext">ctPostScannerNext</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostScannerOpen">ctPostScannerOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostStartRegionOperation">ctPostStartRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostStoreFileReaderOpen">ctPostStoreFileReaderOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostWALRestore">ctPostWALRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreAppend">ctPreAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreAppendAfterRowLock">ctPreAppendAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreBatchMutate">ctPreBatchMutate</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreBulkLoadHFile">ctPreBulkLoadHFile</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreCheckAndDelete">ctPreCheckAndDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreCheckAndDeleteAfterRowLock">ctPreCheckAndDeleteAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreCheckAndPut">ctPreCheckAndPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreCheckAndPutAfterRowLock">ctPreCheckAndPutAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreClose">ctPreClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreCompact">ctPreCompact</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreCompactSelect">ctPreCompactSelect</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreDeleted">ctPreDeleted</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreFlush">ctPreFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreGet">ctPreGet</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreIncrement">ctPreIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreIncrementAfterRowLock">ctPreIncrementAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreOpen">ctPreOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPrePrepareDeleteTS">ctPrePrepareDeleteTS</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPrePut">ctPrePut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreReplayWALs">ctPreReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreScannerClose">ctPreScannerClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreScannerNext">ctPreScannerNext</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreScannerOpen">ctPreScannerOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreStoreFileReaderOpen">ctPreStoreFileReaderOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreWALRestore">ctPreWALRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#TABLE_SKIPPED">TABLE_SKIPPED</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#throwOnPostFlush">throwOnPostFlush</a></code></li>
+<code><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctBeforeDelete">ctBeforeDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostAppend">ctPostAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostBatchMutate">ctPostBatchMutate</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostBatchMutateIndispensably">ctPostBatchMutateIndispensably</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostBulkLoadHFile">ctPostBulkLoadHFile</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostCheckAndDelete">ctPostCheckAndDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostCheckAndPut">ctPostCheckAndPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostClose">ctPostClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostCloseRegionOperation">ctPostCloseRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostCompact">ctPostCompact</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostCompactSelect">ctPostCompactSelect</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostDeleted">ctPostDeleted</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostFlush">ctPostFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostGet">ctPostGet</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostIncrement">ctPostIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostOpen">ctPostOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostPut">ctPostPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostReplayWALs">ctPostReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostScannerClose">ctPostScannerClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostScannerFilterRow">ctPostScannerFilterRow</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostScannerNext">ctPostScannerNext</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostScannerOpen">ctPostScannerOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostStartRegionOperation">ctPostStartRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostStoreFileReaderOpen">ctPostStoreFileReaderOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostWALRestore">ctPostWALRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreAppend">ctPreAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreAppendAfterRowLock">ctPreAppendAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreBatchMutate">ctPreBatchMutate</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreBulkLoadHFile">ctPreBulkLoadHFile</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreCheckAndDelete">ctPreCheckAndDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreCheckAndDeleteAfterRowLock">ctPreCheckAndDeleteAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreCheckAndPut">ctPreCheckAndPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreCheckAndPutAfterRowLock">ctPreCheckAndPutAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreClose">ctPreClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreCompact">ctPreCompact</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreCompactSelect">ctPreCompactSelect</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreDeleted">ctPreDeleted</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreFlush">ctPreFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreGet">ctPreGet</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreIncrement">ctPreIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreIncrementAfterRowLock">ctPreIncrementAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreOpen">ctPreOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPrePrepareDeleteTS">ctPrePrepareDeleteTS</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPrePut">ctPrePut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreReplayWALs">ctPreReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreScannerClose">ctPreScannerClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreScannerNext">ctPreScannerNext</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreScannerOpen">ctPreScannerOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreStoreFileReaderOpen">ctPreStoreFileReaderOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreWALAppend">ctPreWALAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreWALRestore">ctPreWALRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#extendedAttributes">extendedAttributes</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#TABLE_SKIPPED">TABLE_SKIPPED</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#throwOnPostFlush">throwOnPostFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#WAL_EXTENDED_ATTRIBUTE_BYTES">WAL_EXTENDED_ATTRIBUTE_BYTES</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="fields.inherited.from.class.org.apache.hadoop.hbase.Coprocessor">
@@ -216,7 +216,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.coprocessor.<a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html" title="class in org.apache.hadoop.hbase.coprocessor">SimpleRegionObserver</a></h3>
-<code><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtBeforeDelete--">getCtBeforeDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostClose--">getCtPostClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostCloseRegionOperation--">getCtPostCloseRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostCompact--">getCtPostCompact</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostCompactSelect--">getCtPostCompactSelect</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostDeleted--">getCtPostDeleted</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostFlush--">getCtPostFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostGet--">getCtPostGet</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostIncrement--">getCtPostIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostOpen--">getCtPostOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostPut--">getCtPostPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostReplayWALs--">getCtPostReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostStartRegionOperation--">getCtPostStartRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostWALRestore--">getCtPostWALRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreClose--">getCtPreClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreCompact--">getCtPreCompact</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreCompactSelect--">getCtPreCompactSelect</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreDeleted--">getCtPreDeleted</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreFlush--">getCtPreFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreGet--">getCtPreGet</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreIncrement--">getCtPreIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreOpen--">getCtPreOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPrePut--">getCtPrePut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreReplayWALs--">getCtPreReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreWALRestore--">getCtPreWALRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getRegionObserver--">getRegionObserver</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadDelete--">hadDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadDeleted--">hadDeleted</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostAppend--">hadPostAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostBatchMutate--">hadPostBatchMutate</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostBatchMutateIndispensably--">hadPostBatchMutateIndispensably</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostBulkLoadHFile--">hadPostBulkLoadHFile</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostCheckAndDelete--">hadPostCheckAndDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostCheckAndPut--">hadPostCheckAndPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostCloseRegionOperation--">hadPostCloseRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostGet--">hadPostGet</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostIncrement--">hadPostIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostPut--">hadPostPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostReplayWALs--">hadPostReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostStartRegionOperation--">hadPostStartRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostWALRestore--">hadPostWALRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreAppend--">hadPreAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreAppendAfterRowLock--">hadPreAppendAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreBatchMutate--">hadPreBatchMutate</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreBulkLoadHFile--">hadPreBulkLoadHFile</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreCheckAndDelete--">hadPreCheckAndDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreCheckAndDeleteAfterRowLock--">hadPreCheckAndDeleteAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreCheckAndPut--">hadPreCheckAndPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreCheckAndPutAfterRowLock--">hadPreCheckAndPutAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreGet--">hadPreGet</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreIncrement--">hadPreIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreIncrementAfterRowLock--">hadPreIncrementAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPrePreparedDeleteTS--">hadPrePreparedDeleteTS</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPrePut--">hadPrePut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreReplayWALs--">hadPreReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreWALRestore--">hadPreWALRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-org.apache.hadoop.hbase.client.Result-">postAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postBatchMutate-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-">postBatchMutate</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postBatchMutateIndispensably-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-boolean-">postBatchMutateIndispensably</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postBulkLoadHFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.List-java.util.Map-">postBulkLoadHFile</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postCheckAndDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">postCheckAndDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postCheckAndPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">postCheckAndPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-boolean-">postClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postCloseRegionOperation-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Region.Operation-">postCloseRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postCompact-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.StoreFile-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">postCompact</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postCompactSelection-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-java.util.List-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">postCompactSelection</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Delete-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">postDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.StoreFile-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">postFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postGetOp-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-java.util.List-">postGetOp</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postIncrement-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-org.apache.hadoop.hbase.client.Result-">postIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-">postOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Put-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">postPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postReplayWALs-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.fs.Path-">postReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postScannerClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-">postScannerClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postScannerFilterRow-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.Cell-boolean-">postScannerFilterRow</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postScannerNext-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-java.util.List-int-boolean-">postScannerNext</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Scan-org.apache.hadoop.hbase.regionserver.RegionScanner-">postScannerOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postStartRegionOperation-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Region.Operation-">postStartRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postStoreFileReaderOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-org.apache.hadoop.hbase.io.FSDataInputStreamWrapper-long-org.apache.hadoop.hbase.io.hfile.CacheConfig-org.apache.hadoop.hbase.io.Reference-org.apache.hadoop.hbase.regionserver.StoreFileReader-">postStoreFileReaderOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postWALRestore-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">postWALRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-">preAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preAppendAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-">preAppendAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preBatchMutate-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-">preBatchMutate</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preBulkLoadHFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.List-">preBulkLoadHFile</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preCheckAndDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">preCheckAndDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preCheckAndDeleteAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">preCheckAndDeleteAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preCheckAndPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">preCheckAndPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preCheckAndPutAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">preCheckAndPutAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-boolean-">preClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preCompact-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.regionserver.ScanType-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">preCompact</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preCompactSelection-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-java.util.List-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-">preCompactSelection</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Delete-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">preDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">preFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preGetOp-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-java.util.List-">preGetOp</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preIncrement-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-">preIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preIncrementAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-">preIncrementAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-">preOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#prePrepareTimeStampForDeleteVersion-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Mutation-org.apache.hadoop.hbase.Cell-byte:A-org.apache.hadoop.hbase.client.Get-">prePrepareTimeStampForDeleteVersion</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preReplayWALs-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.fs.Path-">preReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preScannerClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-">preScannerClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preScannerNext-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-java.util.List-int-boolean-">preScannerNext</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Scan-">preScannerOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preStoreFileReaderOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-org.apache.hadoop.hbase.io.FSDataInputStreamWrapper-long-org.apache.hadoop.hbase.io.hfile.CacheConfig-org.apache.hadoop.hbase.io.Reference-org.apache.hadoop.hbase.regionserver.StoreFileReader-">preStoreFileReaderOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preWALRestore-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">preWALRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#setThrowOnPostFlush-java.lang.Boolean-">setThrowOnPostFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#start-org.apache.hadoop.hbase.CoprocessorEnvironment-">start</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasClosed--">wasClosed</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasCompacted--">wasCompacted</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasFlushed--">wasFlushed</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasOpened--">wasOpened</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasScannerCloseCalled--">wasScannerCloseCalled</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasScannerFilterRowCalled--">wasScannerFilterRowCalled</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasScannerNextCalled--">wasScannerNextCalled</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasScannerOpenCalled--">wasScannerOpenCalled</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasStoreFileReaderOpenCalled--">wasStoreFileReaderOpenCalled</a></code></li>
+<code><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtBeforeDelete--">getCtBeforeDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostClose--">getCtPostClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostCloseRegionOperation--">getCtPostCloseRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostCompact--">getCtPostCompact</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostCompactSelect--">getCtPostCompactSelect</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostDeleted--">getCtPostDeleted</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostFlush--">getCtPostFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostGet--">getCtPostGet</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostIncrement--">getCtPostIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostOpen--">getCtPostOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostPut--">getCtPostPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostReplayWALs--">getCtPostReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostStartRegionOperation--">getCtPostStartRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostWALRestore--">getCtPostWALRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreClose--">getCtPreClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreCompact--">getCtPreCompact</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreCompactSelect--">getCtPreCompactSelect</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreDeleted--">getCtPreDeleted</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreFlush--">getCtPreFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreGet--">getCtPreGet</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreIncrement--">getCtPreIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreOpen--">getCtPreOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPrePut--">getCtPrePut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreReplayWALs--">getCtPreReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreWALAppend--">getCtPreWALAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreWALRestore--">getCtPreWALRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getRegionObserver--">getRegionObserver</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadDelete--">hadDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadDeleted--">hadDeleted</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostAppend--">hadPostAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostBatchMutate--">hadPostBatchMutate</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostBatchMutateIndispensably--">hadPostBatchMutateIndispensably</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostBulkLoadHFile--">hadPostBulkLoadHFile</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostCheckAndDelete--">hadPostCheckAndDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostCheckAndPut--">hadPostCheckAndPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostCloseRegionOperation--">hadPostCloseRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostGet--">hadPostGet</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostIncrement--">hadPostIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostPut--">hadPostPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostReplayWALs--">hadPostReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostStartRegionOperation--">hadPostStartRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostWALRestore--">hadPostWALRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreAppend--">hadPreAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreAppendAfterRowLock--">hadPreAppendAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreBatchMutate--">hadPreBatchMutate</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreBulkLoadHFile--">hadPreBulkLoadHFile</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreCheckAndDelete--">hadPreCheckAndDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreCheckAndDeleteAfterRowLock--">hadPreCheckAndDeleteAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreCheckAndPut--">hadPreCheckAndPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreCheckAndPutAfterRowLock--">hadPreCheckAndPutAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreGet--">hadPreGet</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreIncrement--">hadPreIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreIncrementAfterRowLock--">hadPreIncrementAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPrePreparedDeleteTS--">hadPrePreparedDeleteTS</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPrePut--">hadPrePut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreReplayWALs--">hadPreReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreWALRestore--">hadPreWALRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-org.apache.hadoop.hbase.client.Result-">postAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postBatchMutate-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-">postBatchMutate</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postBatchMutateIndispensably-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-boolean-">postBatchMutateIndispensably</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postBulkLoadHFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.List-java.util.Map-">postBulkLoadHFile</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postCheckAndDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">postCheckAndDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postCheckAndPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">postCheckAndPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-boolean-">postClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postCloseRegionOperation-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Region.Operation-">postCloseRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postCompact-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.StoreFile-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">postCompact</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postCompactSelection-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-java.util.List-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">postCompactSelection</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Delete-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">postDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.StoreFile-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">postFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postGetOp-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-java.util.List-">postGetOp</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postIncrement-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-org.apache.hadoop.hbase.client.Result-">postIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-">postOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Put-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">postPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postReplayWALs-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.fs.Path-">postReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postScannerClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-">postScannerClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postScannerFilterRow-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.Cell-boolean-">postScannerFilterRow</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postScannerNext-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-java.util.List-int-boolean-">postScannerNext</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Scan-org.apache.hadoop.hbase.regionserver.RegionScanner-">postScannerOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postStartRegionOperation-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Region.Operation-">postStartRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postStoreFileReaderOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-org.apache.hadoop.hbase.io.FSDataInputStreamWrapper-long-org.apache.hadoop.hbase.io.hfile.CacheConfig-org.apache.hadoop.hbase.io.Reference-org.apache.hadoop.hbase.regionserver.StoreFileReader-">postStoreFileReaderOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postWALRestore-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">postWALRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-">preAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preAppendAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-">preAppendAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preBatchMutate-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-">preBatchMutate</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preBulkLoadHFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.List-">preBulkLoadHFile</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preCheckAndDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">preCheckAndDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preCheckAndDeleteAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">preCheckAndDeleteAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preCheckAndPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">preCheckAndPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preCheckAndPutAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">preCheckAndPutAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-boolean-">preClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preCompact-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.regionserver.ScanType-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">preCompact</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preCompactSelection-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-java.util.List-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-">preCompactSelection</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Delete-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">preDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">preFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preGetOp-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-java.util.List-">preGetOp</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preIncrement-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-">preIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preIncrementAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-">preIncrementAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-">preOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#prePrepareTimeStampForDeleteVersion-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Mutation-org.apache.hadoop.hbase.Cell-byte:A-org.apache.hadoop.hbase.client.Get-">prePrepareTimeStampForDeleteVersion</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preReplayWALs-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.fs.Path-">preReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preScannerClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-">preScannerClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preScannerNext-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-java.util.List-int-boolean-">preScannerNext</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Scan-">preScannerOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preStoreFileReaderOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-org.apache.hadoop.hbase.io.FSDataInputStreamWrapper-long-org.apache.hadoop.hbase.io.hfile.CacheConfig-org.apache.hadoop.hbase.io.Reference-org.apache.hadoop.hbase.regionserver.StoreFileReader-">preStoreFileReaderOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preWALAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">preWALAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preWALRestore-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">preWALRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#setThrowOnPostFlush-java.lang.Boolean-">setThrowOnPostFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#start-org.apache.hadoop.hbase.CoprocessorEnvironment-">start</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasClosed--">wasClosed</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasCompacted--">wasCompacted</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasFlushed--">wasFlushed</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasOpened--">wasOpened</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasScannerCloseCalled--">wasScannerCloseCalled</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasScannerFilterRowCalled--">wasScannerFilterRowCalled</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasScannerNextCalled--">wasScannerNextCalled</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasScannerOpenCalled--">wasScannerOpenCalled</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasStoreFileReaderOpenCalled--">wasStoreFileReaderOpenCalled</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
diff --git a/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionServerCoprocessorExceptionWithRemove.BuggyRegionObserver.html b/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionServerCoprocessorExceptionWithRemove.BuggyRegionObserver.html
index 86ca971..d696cee 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionServerCoprocessorExceptionWithRemove.BuggyRegionObserver.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/coprocessor/TestRegionServerCoprocessorExceptionWithRemove.BuggyRegionObserver.html
@@ -163,7 +163,7 @@
 <!--   -->
 </a>
 <h3>Fields inherited from class&nbsp;org.apache.hadoop.hbase.coprocessor.<a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html" title="class in org.apache.hadoop.hbase.coprocessor">SimpleRegionObserver</a></h3>
-<code><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctBeforeDelete">ctBeforeDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostAppend">ctPostAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostBatchMutate">ctPostBatchMutate</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostBatchMutateIndispensably">ctPostBatchMutateIndispensably</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostBulkLoadHFile">ctPostBulkLoadHFile</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostCheckAndDelete">ctPostCheckAndDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostCheckAndPut">ctPostCheckAndPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostClose">ctPostClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostCloseRegionOperation">ctPostCloseRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostCompact">ctPostCompact</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostCompactSelect">ctPostCompactSelect</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostDeleted">ctPostDeleted</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostFlush">ctPostFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostGet">ctPostGet</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostIncrement">ctPostIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostOpen">ctPostOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostPut">ctPostPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostReplayWALs">ctPostReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostScannerClose">ctPostScannerClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostScannerFilterRow">ctPostScannerFilterRow</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostScannerNext">ctPostScannerNext</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostScannerOpen">ctPostScannerOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostStartRegionOperation">ctPostStartRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostStoreFileReaderOpen">ctPostStoreFileReaderOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostWALRestore">ctPostWALRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreAppend">ctPreAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreAppendAfterRowLock">ctPreAppendAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreBatchMutate">ctPreBatchMutate</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreBulkLoadHFile">ctPreBulkLoadHFile</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreCheckAndDelete">ctPreCheckAndDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreCheckAndDeleteAfterRowLock">ctPreCheckAndDeleteAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreCheckAndPut">ctPreCheckAndPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreCheckAndPutAfterRowLock">ctPreCheckAndPutAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreClose">ctPreClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreCompact">ctPreCompact</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreCompactSelect">ctPreCompactSelect</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreDeleted">ctPreDeleted</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreFlush">ctPreFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreGet">ctPreGet</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreIncrement">ctPreIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreIncrementAfterRowLock">ctPreIncrementAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreOpen">ctPreOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPrePrepareDeleteTS">ctPrePrepareDeleteTS</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPrePut">ctPrePut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreReplayWALs">ctPreReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreScannerClose">ctPreScannerClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreScannerNext">ctPreScannerNext</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreScannerOpen">ctPreScannerOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreStoreFileReaderOpen">ctPreStoreFileReaderOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreWALRestore">ctPreWALRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#TABLE_SKIPPED">TABLE_SKIPPED</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#throwOnPostFlush">throwOnPostFlush</a></code></li>
+<code><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctBeforeDelete">ctBeforeDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostAppend">ctPostAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostBatchMutate">ctPostBatchMutate</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostBatchMutateIndispensably">ctPostBatchMutateIndispensably</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostBulkLoadHFile">ctPostBulkLoadHFile</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostCheckAndDelete">ctPostCheckAndDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostCheckAndPut">ctPostCheckAndPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostClose">ctPostClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostCloseRegionOperation">ctPostCloseRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostCompact">ctPostCompact</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostCompactSelect">ctPostCompactSelect</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostDeleted">ctPostDeleted</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostFlush">ctPostFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostGet">ctPostGet</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostIncrement">ctPostIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostOpen">ctPostOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostPut">ctPostPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostReplayWALs">ctPostReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostScannerClose">ctPostScannerClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostScannerFilterRow">ctPostScannerFilterRow</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostScannerNext">ctPostScannerNext</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostScannerOpen">ctPostScannerOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostStartRegionOperation">ctPostStartRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostStoreFileReaderOpen">ctPostStoreFileReaderOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPostWALRestore">ctPostWALRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreAppend">ctPreAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreAppendAfterRowLock">ctPreAppendAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreBatchMutate">ctPreBatchMutate</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreBulkLoadHFile">ctPreBulkLoadHFile</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreCheckAndDelete">ctPreCheckAndDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreCheckAndDeleteAfterRowLock">ctPreCheckAndDeleteAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreCheckAndPut">ctPreCheckAndPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreCheckAndPutAfterRowLock">ctPreCheckAndPutAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreClose">ctPreClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreCompact">ctPreCompact</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreCompactSelect">ctPreCompactSelect</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreDeleted">ctPreDeleted</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreFlush">ctPreFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreGet">ctPreGet</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreIncrement">ctPreIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreIncrementAfterRowLock">ctPreIncrementAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreOpen">ctPreOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPrePrepareDeleteTS">ctPrePrepareDeleteTS</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPrePut">ctPrePut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreReplayWALs">ctPreReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreScannerClose">ctPreScannerClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreScannerNext">ctPreScannerNext</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreScannerOpen">ctPreScannerOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreStoreFileReaderOpen">ctPreStoreFileReaderOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreWALAppend">ctPreWALAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#ctPreWALRestore">ctPreWALRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#extendedAttributes">extendedAttributes</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#TABLE_SKIPPED">TABLE_SKIPPED</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#throwOnPostFlush">throwOnPostFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#WAL_EXTENDED_ATTRIBUTE_BYTES">WAL_EXTENDED_ATTRIBUTE_BYTES</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="fields.inherited.from.class.org.apache.hadoop.hbase.Coprocessor">
@@ -216,7 +216,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from class&nbsp;org.apache.hadoop.hbase.coprocessor.<a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html" title="class in org.apache.hadoop.hbase.coprocessor">SimpleRegionObserver</a></h3>
-<code><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtBeforeDelete--">getCtBeforeDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostClose--">getCtPostClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostCloseRegionOperation--">getCtPostCloseRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostCompact--">getCtPostCompact</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostCompactSelect--">getCtPostCompactSelect</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostDeleted--">getCtPostDeleted</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostFlush--">getCtPostFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostGet--">getCtPostGet</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostIncrement--">getCtPostIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostOpen--">getCtPostOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostPut--">getCtPostPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostReplayWALs--">getCtPostReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostStartRegionOperation--">getCtPostStartRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostWALRestore--">getCtPostWALRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreClose--">getCtPreClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreCompact--">getCtPreCompact</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreCompactSelect--">getCtPreCompactSelect</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreDeleted--">getCtPreDeleted</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreFlush--">getCtPreFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreGet--">getCtPreGet</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreIncrement--">getCtPreIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreOpen--">getCtPreOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPrePut--">getCtPrePut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreReplayWALs--">getCtPreReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreWALRestore--">getCtPreWALRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getRegionObserver--">getRegionObserver</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadDelete--">hadDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadDeleted--">hadDeleted</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostAppend--">hadPostAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostBatchMutate--">hadPostBatchMutate</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostBatchMutateIndispensably--">hadPostBatchMutateIndispensably</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostBulkLoadHFile--">hadPostBulkLoadHFile</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostCheckAndDelete--">hadPostCheckAndDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostCheckAndPut--">hadPostCheckAndPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostCloseRegionOperation--">hadPostCloseRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostGet--">hadPostGet</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostIncrement--">hadPostIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostPut--">hadPostPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostReplayWALs--">hadPostReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostStartRegionOperation--">hadPostStartRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostWALRestore--">hadPostWALRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreAppend--">hadPreAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreAppendAfterRowLock--">hadPreAppendAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreBatchMutate--">hadPreBatchMutate</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreBulkLoadHFile--">hadPreBulkLoadHFile</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreCheckAndDelete--">hadPreCheckAndDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreCheckAndDeleteAfterRowLock--">hadPreCheckAndDeleteAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreCheckAndPut--">hadPreCheckAndPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreCheckAndPutAfterRowLock--">hadPreCheckAndPutAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreGet--">hadPreGet</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreIncrement--">hadPreIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreIncrementAfterRowLock--">hadPreIncrementAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPrePreparedDeleteTS--">hadPrePreparedDeleteTS</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPrePut--">hadPrePut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreReplayWALs--">hadPreReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreWALRestore--">hadPreWALRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-org.apache.hadoop.hbase.client.Result-">postAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postBatchMutate-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-">postBatchMutate</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postBatchMutateIndispensably-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-boolean-">postBatchMutateIndispensably</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postBulkLoadHFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.List-java.util.Map-">postBulkLoadHFile</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postCheckAndDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">postCheckAndDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postCheckAndPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">postCheckAndPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-boolean-">postClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postCloseRegionOperation-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Region.Operation-">postCloseRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postCompact-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.StoreFile-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">postCompact</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postCompactSelection-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-java.util.List-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">postCompactSelection</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Delete-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">postDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.StoreFile-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">postFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postGetOp-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-java.util.List-">postGetOp</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postIncrement-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-org.apache.hadoop.hbase.client.Result-">postIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-">postOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Put-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">postPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postReplayWALs-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.fs.Path-">postReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postScannerClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-">postScannerClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postScannerFilterRow-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.Cell-boolean-">postScannerFilterRow</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postScannerNext-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-java.util.List-int-boolean-">postScannerNext</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Scan-org.apache.hadoop.hbase.regionserver.RegionScanner-">postScannerOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postStartRegionOperation-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Region.Operation-">postStartRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postStoreFileReaderOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-org.apache.hadoop.hbase.io.FSDataInputStreamWrapper-long-org.apache.hadoop.hbase.io.hfile.CacheConfig-org.apache.hadoop.hbase.io.Reference-org.apache.hadoop.hbase.regionserver.StoreFileReader-">postStoreFileReaderOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postWALRestore-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">postWALRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-">preAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preAppendAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-">preAppendAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preBatchMutate-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-">preBatchMutate</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preBulkLoadHFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.List-">preBulkLoadHFile</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preCheckAndDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">preCheckAndDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preCheckAndDeleteAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">preCheckAndDeleteAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preCheckAndPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">preCheckAndPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preCheckAndPutAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">preCheckAndPutAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-boolean-">preClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preCompact-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.regionserver.ScanType-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">preCompact</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preCompactSelection-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-java.util.List-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-">preCompactSelection</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Delete-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">preDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">preFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preGetOp-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-java.util.List-">preGetOp</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preIncrement-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-">preIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preIncrementAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-">preIncrementAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-">preOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#prePrepareTimeStampForDeleteVersion-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Mutation-org.apache.hadoop.hbase.Cell-byte:A-org.apache.hadoop.hbase.client.Get-">prePrepareTimeStampForDeleteVersion</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preReplayWALs-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.fs.Path-">preReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preScannerClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-">preScannerClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preScannerNext-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-java.util.List-int-boolean-">preScannerNext</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Scan-">preScannerOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preStoreFileReaderOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-org.apache.hadoop.hbase.io.FSDataInputStreamWrapper-long-org.apache.hadoop.hbase.io.hfile.CacheConfig-org.apache.hadoop.hbase.io.Reference-org.apache.hadoop.hbase.regionserver.StoreFileReader-">preStoreFileReaderOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preWALRestore-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">preWALRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#setThrowOnPostFlush-java.lang.Boolean-">setThrowOnPostFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#start-org.apache.hadoop.hbase.CoprocessorEnvironment-">start</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasClosed--">wasClosed</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasCompacted--">wasCompacted</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasFlushed--">wasFlushed</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasOpened--">wasOpened</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasScannerCloseCalled--">wasScannerCloseCalled</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasScannerFilterRowCalled--">wasScannerFilterRowCalled</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasScannerNextCalled--">wasScannerNextCalled</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasScannerOpenCalled--">wasScannerOpenCalled</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasStoreFileReaderOpenCalled--">wasStoreFileReaderOpenCalled</a></code></li>
+<code><a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtBeforeDelete--">getCtBeforeDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostClose--">getCtPostClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostCloseRegionOperation--">getCtPostCloseRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostCompact--">getCtPostCompact</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostCompactSelect--">getCtPostCompactSelect</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostDeleted--">getCtPostDeleted</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostFlush--">getCtPostFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostGet--">getCtPostGet</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostIncrement--">getCtPostIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostOpen--">getCtPostOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostPut--">getCtPostPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostReplayWALs--">getCtPostReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostStartRegionOperation--">getCtPostStartRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPostWALRestore--">getCtPostWALRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreClose--">getCtPreClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreCompact--">getCtPreCompact</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreCompactSelect--">getCtPreCompactSelect</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreDeleted--">getCtPreDeleted</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreFlush--">getCtPreFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreGet--">getCtPreGet</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreIncrement--">getCtPreIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreOpen--">getCtPreOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPrePut--">getCtPrePut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreReplayWALs--">getCtPreReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreWALAppend--">getCtPreWALAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getCtPreWALRestore--">getCtPreWALRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#getRegionObserver--">getRegionObserver</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadDelete--">hadDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadDeleted--">hadDeleted</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostAppend--">hadPostAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostBatchMutate--">hadPostBatchMutate</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostBatchMutateIndispensably--">hadPostBatchMutateIndispensably</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostBulkLoadHFile--">hadPostBulkLoadHFile</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostCheckAndDelete--">hadPostCheckAndDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostCheckAndPut--">hadPostCheckAndPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostCloseRegionOperation--">hadPostCloseRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostGet--">hadPostGet</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostIncrement--">hadPostIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostPut--">hadPostPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostReplayWALs--">hadPostReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostStartRegionOperation--">hadPostStartRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPostWALRestore--">hadPostWALRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreAppend--">hadPreAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreAppendAfterRowLock--">hadPreAppendAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreBatchMutate--">hadPreBatchMutate</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreBulkLoadHFile--">hadPreBulkLoadHFile</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreCheckAndDelete--">hadPreCheckAndDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreCheckAndDeleteAfterRowLock--">hadPreCheckAndDeleteAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreCheckAndPut--">hadPreCheckAndPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreCheckAndPutAfterRowLock--">hadPreCheckAndPutAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreGet--">hadPreGet</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreIncrement--">hadPreIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreIncrementAfterRowLock--">hadPreIncrementAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPrePreparedDeleteTS--">hadPrePreparedDeleteTS</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPrePut--">hadPrePut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreReplayWALs--">hadPreReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#hadPreWALRestore--">hadPreWALRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-org.apache.hadoop.hbase.client.Result-">postAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postBatchMutate-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-">postBatchMutate</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postBatchMutateIndispensably-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-boolean-">postBatchMutateIndispensably</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postBulkLoadHFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.List-java.util.Map-">postBulkLoadHFile</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postCheckAndDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">postCheckAndDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postCheckAndPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">postCheckAndPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-boolean-">postClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postCloseRegionOperation-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Region.Operation-">postCloseRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postCompact-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.StoreFile-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">postCompact</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postCompactSelection-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-java.util.List-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">postCompactSelection</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Delete-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">postDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.StoreFile-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">postFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postGetOp-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-java.util.List-">postGetOp</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postIncrement-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-org.apache.hadoop.hbase.client.Result-">postIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-">postOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Put-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">postPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postReplayWALs-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.fs.Path-">postReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postScannerClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-">postScannerClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postScannerFilterRow-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.Cell-boolean-">postScannerFilterRow</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postScannerNext-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-java.util.List-int-boolean-">postScannerNext</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Scan-org.apache.hadoop.hbase.regionserver.RegionScanner-">postScannerOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postStartRegionOperation-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Region.Operation-">postStartRegionOperation</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postStoreFileReaderOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-org.apache.hadoop.hbase.io.FSDataInputStreamWrapper-long-org.apache.hadoop.hbase.io.hfile.CacheConfig-org.apache.hadoop.hbase.io.Reference-org.apache.hadoop.hbase.regionserver.StoreFileReader-">postStoreFileReaderOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#postWALRestore-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">postWALRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-">preAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preAppendAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Append-">preAppendAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preBatchMutate-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress-">preBatchMutate</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preBulkLoadHFile-org.apache.hadoop.hbase.coprocessor.ObserverContext-java.util.List-">preBulkLoadHFile</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preCheckAndDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">preCheckAndDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preCheckAndDeleteAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Delete-boolean-">preCheckAndDeleteAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preCheckAndPut-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">preCheckAndPut</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preCheckAndPutAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-byte:A-byte:A-byte:A-org.apache.hadoop.hbase.CompareOperator-org.apache.hadoop.hbase.filter.ByteArrayComparable-org.apache.hadoop.hbase.client.Put-boolean-">preCheckAndPutAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-boolean-">preClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preCompact-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.regionserver.ScanType-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest-">preCompact</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preCompactSelection-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-java.util.List-org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker-">preCompactSelection</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preDelete-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Delete-org.apache.hadoop.hbase.wal.WALEdit-org.apache.hadoop.hbase.client.Durability-">preDelete</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preFlush-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.Store-org.apache.hadoop.hbase.regionserver.InternalScanner-org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker-">preFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preGetOp-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Get-java.util.List-">preGetOp</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preIncrement-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-">preIncrement</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preIncrementAfterRowLock-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Increment-">preIncrementAfterRowLock</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-">preOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#prePrepareTimeStampForDeleteVersion-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Mutation-org.apache.hadoop.hbase.Cell-byte:A-org.apache.hadoop.hbase.client.Get-">prePrepareTimeStampForDeleteVersion</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preReplayWALs-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.fs.Path-">preReplayWALs</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preScannerClose-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-">preScannerClose</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preScannerNext-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.regionserver.InternalScanner-java.util.List-int-boolean-">preScannerNext</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preScannerOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.Scan-">preScannerOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preStoreFileReaderOpen-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.fs.FileSystem-org.apache.hadoop.fs.Path-org.apache.hadoop.hbase.io.FSDataInputStreamWrapper-long-org.apache.hadoop.hbase.io.hfile.CacheConfig-org.apache.hadoop.hbase.io.Reference-org.apache.hadoop.hbase.regionserver.StoreFileReader-">preStoreFileReaderOpen</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preWALAppend-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">preWALAppend</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#preWALRestore-org.apache.hadoop.hbase.coprocessor.ObserverContext-org.apache.hadoop.hbase.client.RegionInfo-org.apache.hadoop.hbase.wal.WALKey-org.apache.hadoop.hbase.wal.WALEdit-">preWALRestore</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#setThrowOnPostFlush-java.lang.Boolean-">setThrowOnPostFlush</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#start-org.apache.hadoop.hbase.CoprocessorEnvironment-">start</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasClosed--">wasClosed</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasCompacted--">wasCompacted</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasFlushed--">wasFlushed</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasOpened--">wasOpened</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasScannerCloseCalled--">wasScannerCloseCalled</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasScannerFilterRowCalled--">wasScannerFilterRowCalled</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasScannerNextCalled--">wasScannerNextCalled</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasScannerOpenCalled--">wasScannerOpenCalled</a>, <a href="../../../../../org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html#wasStoreFileReaderOpenCalled--">wasStoreFileReaderOpenCalled</a></code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.java.lang.Object">
diff --git a/testdevapidocs/org/apache/hadoop/hbase/coprocessor/class-use/TestRegionObserverInterface.PreWALAppendWALActionsListener.html b/testdevapidocs/org/apache/hadoop/hbase/coprocessor/class-use/TestRegionObserverInterface.PreWALAppendWALActionsListener.html
new file mode 100644
index 0000000..77d82ed
--- /dev/null
+++ b/testdevapidocs/org/apache/hadoop/hbase/coprocessor/class-use/TestRegionObserverInterface.PreWALAppendWALActionsListener.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.coprocessor.TestRegionObserverInterface.PreWALAppendWALActionsListener (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.coprocessor.TestRegionObserverInterface.PreWALAppendWALActionsListener (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/coprocessor/TestRegionObserverInterface.PreWALAppendWALActionsListener.html" title="class in org.apache.hadoop.hbase.coprocessor">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/coprocessor/class-use/TestRegionObserverInterface.PreWALAppendWALActionsListener.html" target="_top">Frames</a></li>
+<li><a href="TestRegionObserverInterface.PreWALAppendWALActionsListener.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.coprocessor.TestRegionObserverInterface.PreWALAppendWALActionsListener" class="title">Uses of Class<br>org.apache.hadoop.hbase.coprocessor.TestRegionObserverInterface.PreWALAppendWALActionsListener</h2>
+</div>
+<div class="classUseContainer">No usage of org.apache.hadoop.hbase.coprocessor.TestRegionObserverInterface.PreWALAppendWALActionsListener</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/coprocessor/TestRegionObserverInterface.PreWALAppendWALActionsListener.html" title="class in org.apache.hadoop.hbase.coprocessor">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/coprocessor/class-use/TestRegionObserverInterface.PreWALAppendWALActionsListener.html" target="_top">Frames</a></li>
+<li><a href="TestRegionObserverInterface.PreWALAppendWALActionsListener.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;2019 <a href="https://www.apache.org/">The Apache Software Foundation</a>. All rights reserved.</small></p>
+</body>
+</html>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/coprocessor/package-frame.html b/testdevapidocs/org/apache/hadoop/hbase/coprocessor/package-frame.html
index 2c6c6d0..bdaf4bb 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/coprocessor/package-frame.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/coprocessor/package-frame.html
@@ -105,6 +105,7 @@
 <li><a href="TestRegionObserverForAddingMutationsFromCoprocessors.TestWALObserver.html" title="class in org.apache.hadoop.hbase.coprocessor" target="classFrame">TestRegionObserverForAddingMutationsFromCoprocessors.TestWALObserver</a></li>
 <li><a href="TestRegionObserverInterface.html" title="class in org.apache.hadoop.hbase.coprocessor" target="classFrame">TestRegionObserverInterface</a></li>
 <li><a href="TestRegionObserverInterface.EvenOnlyCompactor.html" title="class in org.apache.hadoop.hbase.coprocessor" target="classFrame">TestRegionObserverInterface.EvenOnlyCompactor</a></li>
+<li><a href="TestRegionObserverInterface.PreWALAppendWALActionsListener.html" title="class in org.apache.hadoop.hbase.coprocessor" target="classFrame">TestRegionObserverInterface.PreWALAppendWALActionsListener</a></li>
 <li><a href="TestRegionObserverPreFlushAndPreCompact.html" title="class in org.apache.hadoop.hbase.coprocessor" target="classFrame">TestRegionObserverPreFlushAndPreCompact</a></li>
 <li><a href="TestRegionObserverPreFlushAndPreCompact.TestRegionObserver.html" title="class in org.apache.hadoop.hbase.coprocessor" target="classFrame">TestRegionObserverPreFlushAndPreCompact.TestRegionObserver</a></li>
 <li><a href="TestRegionObserverScannerOpenHook.html" title="class in org.apache.hadoop.hbase.coprocessor" target="classFrame">TestRegionObserverScannerOpenHook</a></li>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/coprocessor/package-summary.html b/testdevapidocs/org/apache/hadoop/hbase/coprocessor/package-summary.html
index 20f3521..55fb403 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/coprocessor/package-summary.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/coprocessor/package-summary.html
@@ -540,6 +540,10 @@
 <td class="colLast">&nbsp;</td>
 </tr>
 <tr class="altColor">
+<td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.PreWALAppendWALActionsListener.html" title="class in org.apache.hadoop.hbase.coprocessor">TestRegionObserverInterface.PreWALAppendWALActionsListener</a></td>
+<td class="colLast">&nbsp;</td>
+</tr>
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/TestRegionObserverPreFlushAndPreCompact.html" title="class in org.apache.hadoop.hbase.coprocessor">TestRegionObserverPreFlushAndPreCompact</a></td>
 <td class="colLast">
 <div class="block">Test that we fail if a Coprocessor tries to return a null scanner out
@@ -548,131 +552,131 @@
  CompactionLifeCycleTracker, CompactionRequest)</code></div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/TestRegionObserverPreFlushAndPreCompact.TestRegionObserver.html" title="class in org.apache.hadoop.hbase.coprocessor">TestRegionObserverPreFlushAndPreCompact.TestRegionObserver</a></td>
 <td class="colLast">
 <div class="block">Coprocessor that returns null when preCompact or preFlush is called.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/TestRegionObserverScannerOpenHook.html" title="class in org.apache.hadoop.hbase.coprocessor">TestRegionObserverScannerOpenHook</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/TestRegionObserverScannerOpenHook.CompactionCompletionNotifyingRegion.html" title="class in org.apache.hadoop.hbase.coprocessor">TestRegionObserverScannerOpenHook.CompactionCompletionNotifyingRegion</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/TestRegionObserverScannerOpenHook.EmptyRegionObsever.html" title="class in org.apache.hadoop.hbase.coprocessor">TestRegionObserverScannerOpenHook.EmptyRegionObsever</a></td>
 <td class="colLast">
 <div class="block">Do the default logic in <code>RegionObserver</code> interface.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/TestRegionObserverScannerOpenHook.NoDataFilter.html" title="class in org.apache.hadoop.hbase.coprocessor">TestRegionObserverScannerOpenHook.NoDataFilter</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/TestRegionObserverScannerOpenHook.NoDataFromCompaction.html" title="class in org.apache.hadoop.hbase.coprocessor">TestRegionObserverScannerOpenHook.NoDataFromCompaction</a></td>
 <td class="colLast">
 <div class="block">Don't allow any data to be written out in the compaction by creating a custom
  <code>StoreScanner</code>.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/TestRegionObserverScannerOpenHook.NoDataFromFlush.html" title="class in org.apache.hadoop.hbase.coprocessor">TestRegionObserverScannerOpenHook.NoDataFromFlush</a></td>
 <td class="colLast">
 <div class="block">Don't allow any data in a flush by creating a custom <code>StoreScanner</code>.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/TestRegionObserverScannerOpenHook.NoDataFromScan.html" title="class in org.apache.hadoop.hbase.coprocessor">TestRegionObserverScannerOpenHook.NoDataFromScan</a></td>
 <td class="colLast">
 <div class="block">Don't return any data from a scan by creating a custom <code>StoreScanner</code>.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/TestRegionObserverStacking.html" title="class in org.apache.hadoop.hbase.coprocessor">TestRegionObserverStacking</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/TestRegionObserverStacking.ObserverA.html" title="class in org.apache.hadoop.hbase.coprocessor">TestRegionObserverStacking.ObserverA</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/TestRegionObserverStacking.ObserverB.html" title="class in org.apache.hadoop.hbase.coprocessor">TestRegionObserverStacking.ObserverB</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/TestRegionObserverStacking.ObserverC.html" title="class in org.apache.hadoop.hbase.coprocessor">TestRegionObserverStacking.ObserverC</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/TestRegionServerCoprocessorEndpoint.html" title="class in org.apache.hadoop.hbase.coprocessor">TestRegionServerCoprocessorEndpoint</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/TestRegionServerCoprocessorEndpoint.DummyRegionServerEndpoint.html" title="class in org.apache.hadoop.hbase.coprocessor">TestRegionServerCoprocessorEndpoint.DummyRegionServerEndpoint</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/TestRegionServerCoprocessorExceptionWithAbort.html" title="class in org.apache.hadoop.hbase.coprocessor">TestRegionServerCoprocessorExceptionWithAbort</a></td>
 <td class="colLast">
 <div class="block">Tests unhandled exceptions thrown by coprocessors running on a regionserver..</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/TestRegionServerCoprocessorExceptionWithAbort.BuggyRegionObserver.html" title="class in org.apache.hadoop.hbase.coprocessor">TestRegionServerCoprocessorExceptionWithAbort.BuggyRegionObserver</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/TestRegionServerCoprocessorExceptionWithAbort.FailedInitializationObserver.html" title="class in org.apache.hadoop.hbase.coprocessor">TestRegionServerCoprocessorExceptionWithAbort.FailedInitializationObserver</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/TestRegionServerCoprocessorExceptionWithRemove.html" title="class in org.apache.hadoop.hbase.coprocessor">TestRegionServerCoprocessorExceptionWithRemove</a></td>
 <td class="colLast">
 <div class="block">Tests unhandled exceptions thrown by coprocessors running on regionserver.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/TestRegionServerCoprocessorExceptionWithRemove.BuggyRegionObserver.html" title="class in org.apache.hadoop.hbase.coprocessor">TestRegionServerCoprocessorExceptionWithRemove.BuggyRegionObserver</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/TestRowProcessorEndpoint.html" title="class in org.apache.hadoop.hbase.coprocessor">TestRowProcessorEndpoint</a></td>
 <td class="colLast">
 <div class="block">Verifies ProcessEndpoint works.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/TestRowProcessorEndpoint.RowProcessorEndpoint.html" title="class in org.apache.hadoop.hbase.coprocessor">TestRowProcessorEndpoint.RowProcessorEndpoint</a>&lt;S extends com.google.protobuf.Message,T extends com.google.protobuf.Message&gt;</td>
 <td class="colLast">
 <div class="block">This class defines two RowProcessors:
  IncrementCounterProcessor and FriendsOfFriendsProcessor.</div>
 </td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/TestRowProcessorEndpoint.RowProcessorEndpoint.FriendsOfFriendsProcessor.html" title="class in org.apache.hadoop.hbase.coprocessor">TestRowProcessorEndpoint.RowProcessorEndpoint.FriendsOfFriendsProcessor</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/TestRowProcessorEndpoint.RowProcessorEndpoint.IncrementCounterProcessor.html" title="class in org.apache.hadoop.hbase.coprocessor">TestRowProcessorEndpoint.RowProcessorEndpoint.IncrementCounterProcessor</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/TestRowProcessorEndpoint.RowProcessorEndpoint.RowSwapProcessor.html" title="class in org.apache.hadoop.hbase.coprocessor">TestRowProcessorEndpoint.RowProcessorEndpoint.RowSwapProcessor</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/TestRowProcessorEndpoint.RowProcessorEndpoint.TimeoutProcessor.html" title="class in org.apache.hadoop.hbase.coprocessor">TestRowProcessorEndpoint.RowProcessorEndpoint.TimeoutProcessor</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/TestSecureExport.html" title="class in org.apache.hadoop.hbase.coprocessor">TestSecureExport</a></td>
 <td class="colLast">&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a href="../../../../../org/apache/hadoop/hbase/coprocessor/TestWALObserver.html" title="class in org.apache.hadoop.hbase.coprocessor">TestWALObserver</a></td>
 <td class="colLast">
 <div class="block">Tests invocation of the
diff --git a/testdevapidocs/org/apache/hadoop/hbase/coprocessor/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/coprocessor/package-tree.html
index 22a2099..7ca63785 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/coprocessor/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/coprocessor/package-tree.html
@@ -257,6 +257,7 @@
 <li type="circle">org.apache.hadoop.hbase.coprocessor.<a href="../../../../../org/apache/hadoop/hbase/coprocessor/TestRegionObserverForAddingMutationsFromCoprocessors.TestWALObserver.html" title="class in org.apache.hadoop.hbase.coprocessor"><span class="typeNameLink">TestRegionObserverForAddingMutationsFromCoprocessors.TestWALObserver</span></a> (implements org.apache.hadoop.hbase.coprocessor.WALCoprocessor, org.apache.hadoop.hbase.coprocessor.WALObserver)</li>
 <li type="circle">org.apache.hadoop.hbase.coprocessor.<a href="../../../../../org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html" title="class in org.apache.hadoop.hbase.coprocessor"><span class="typeNameLink">TestRegionObserverInterface</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.coprocessor.<a href="../../../../../org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.EvenOnlyCompactor.html" title="class in org.apache.hadoop.hbase.coprocessor"><span class="typeNameLink">TestRegionObserverInterface.EvenOnlyCompactor</span></a> (implements org.apache.hadoop.hbase.coprocessor.RegionCoprocessor, org.apache.hadoop.hbase.coprocessor.RegionObserver)</li>
+<li type="circle">org.apache.hadoop.hbase.coprocessor.<a href="../../../../../org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.PreWALAppendWALActionsListener.html" title="class in org.apache.hadoop.hbase.coprocessor"><span class="typeNameLink">TestRegionObserverInterface.PreWALAppendWALActionsListener</span></a> (implements org.apache.hadoop.hbase.regionserver.wal.WALActionsListener)</li>
 <li type="circle">org.apache.hadoop.hbase.coprocessor.<a href="../../../../../org/apache/hadoop/hbase/coprocessor/TestRegionObserverPreFlushAndPreCompact.html" title="class in org.apache.hadoop.hbase.coprocessor"><span class="typeNameLink">TestRegionObserverPreFlushAndPreCompact</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.coprocessor.<a href="../../../../../org/apache/hadoop/hbase/coprocessor/TestRegionObserverPreFlushAndPreCompact.TestRegionObserver.html" title="class in org.apache.hadoop.hbase.coprocessor"><span class="typeNameLink">TestRegionObserverPreFlushAndPreCompact.TestRegionObserver</span></a> (implements org.apache.hadoop.hbase.coprocessor.RegionCoprocessor, org.apache.hadoop.hbase.coprocessor.RegionObserver)</li>
 <li type="circle">org.apache.hadoop.hbase.coprocessor.<a href="../../../../../org/apache/hadoop/hbase/coprocessor/TestRegionObserverScannerOpenHook.html" title="class in org.apache.hadoop.hbase.coprocessor"><span class="typeNameLink">TestRegionObserverScannerOpenHook</span></a></li>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
index 97a72e5..97b14f0 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
@@ -162,8 +162,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.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/TestCacheOnWrite.CacheOnWriteType.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">TestCacheOnWrite.CacheOnWriteType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/TagUsage.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">TagUsage</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/TestCacheOnWrite.CacheOnWriteType.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">TestCacheOnWrite.CacheOnWriteType</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/mapreduce/IntegrationTestBulkLoad.SlowMeCoproScanOperations.html b/testdevapidocs/org/apache/hadoop/hbase/mapreduce/IntegrationTestBulkLoad.SlowMeCoproScanOperations.html
index 059e648..3f73079 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/mapreduce/IntegrationTestBulkLoad.SlowMeCoproScanOperations.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/mapreduce/IntegrationTestBulkLoad.SlowMeCoproScanOperations.html
@@ -263,7 +263,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.RegionObserver</h3>
-<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preStoreFileReaderOpen, preStoreScannerOpen, preWALRestore</code></li>
+<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preStoreFileReaderOpen, preStoreScannerOpen, preWALAppend, preWALRestore</code></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/mapreduce/TestImportTSVWithOperationAttributes.OperationAttributesTestController.html b/testdevapidocs/org/apache/hadoop/hbase/mapreduce/TestImportTSVWithOperationAttributes.OperationAttributesTestController.html
index 5fc6188..94c6936 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/mapreduce/TestImportTSVWithOperationAttributes.OperationAttributesTestController.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/mapreduce/TestImportTSVWithOperationAttributes.OperationAttributesTestController.html
@@ -230,7 +230,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.RegionObserver</h3>
-<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALRestore</code></li>
+<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALAppend, preWALRestore</code></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/mapreduce/TestImportTSVWithTTLs.TTLCheckingObserver.html b/testdevapidocs/org/apache/hadoop/hbase/mapreduce/TestImportTSVWithTTLs.TTLCheckingObserver.html
index b168c78..c0104ee 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/mapreduce/TestImportTSVWithTTLs.TTLCheckingObserver.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/mapreduce/TestImportTSVWithTTLs.TTLCheckingObserver.html
@@ -230,7 +230,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.RegionObserver</h3>
-<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALRestore</code></li>
+<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALAppend, preWALRestore</code></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/master/TestMasterAbortAndRSGotKilled.DelayCloseCP.html b/testdevapidocs/org/apache/hadoop/hbase/master/TestMasterAbortAndRSGotKilled.DelayCloseCP.html
index 0f23ee3..c7afea1 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/master/TestMasterAbortAndRSGotKilled.DelayCloseCP.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/master/TestMasterAbortAndRSGotKilled.DelayCloseCP.html
@@ -228,7 +228,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.RegionObserver</h3>
-<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALRestore</code></li>
+<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALAppend, preWALRestore</code></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/master/TestMasterCoprocessorServices.MockAccessController.html b/testdevapidocs/org/apache/hadoop/hbase/master/TestMasterCoprocessorServices.MockAccessController.html
index 219a1c9..089dc1d 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/master/TestMasterCoprocessorServices.MockAccessController.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/master/TestMasterCoprocessorServices.MockAccessController.html
@@ -265,7 +265,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.RegionObserver</h3>
-<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALRestore</code></li>
+<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALAppend, preWALRestore</code></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/master/TestMasterCoprocessorServices.MockVisibilityController.html b/testdevapidocs/org/apache/hadoop/hbase/master/TestMasterCoprocessorServices.MockVisibilityController.html
index 8aa63b0..77ea683 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/master/TestMasterCoprocessorServices.MockVisibilityController.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/master/TestMasterCoprocessorServices.MockVisibilityController.html
@@ -265,7 +265,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.RegionObserver</h3>
-<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALRestore</code></li>
+<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALAppend, preWALRestore</code></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/master/TestMasterHandlerFullWhenTransitRegion.DelayOpenCP.html b/testdevapidocs/org/apache/hadoop/hbase/master/TestMasterHandlerFullWhenTransitRegion.DelayOpenCP.html
index 101fea8..5b6e384 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/master/TestMasterHandlerFullWhenTransitRegion.DelayOpenCP.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/master/TestMasterHandlerFullWhenTransitRegion.DelayOpenCP.html
@@ -228,7 +228,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.RegionObserver</h3>
-<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALRestore</code></li>
+<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALAppend, preWALRestore</code></li>
 </ul>
 </li>
 </ul>
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 d82cf30..8594285 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/master/procedure/TestProcedurePriority.MyCP.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/master/procedure/TestProcedurePriority.MyCP.html
@@ -222,7 +222,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.RegionObserver</h3>
-<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALRestore</code></li>
+<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALAppend, preWALRestore</code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.org.apache.hadoop.hbase.coprocessor.RegionCoprocessor">
diff --git a/testdevapidocs/org/apache/hadoop/hbase/mob/compactions/TestMobCompactor.CompactTwoLatestHfilesCopro.html b/testdevapidocs/org/apache/hadoop/hbase/mob/compactions/TestMobCompactor.CompactTwoLatestHfilesCopro.html
index 73c220a..19ebc4c 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/mob/compactions/TestMobCompactor.CompactTwoLatestHfilesCopro.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/mob/compactions/TestMobCompactor.CompactTwoLatestHfilesCopro.html
@@ -232,7 +232,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.RegionObserver</h3>
-<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALRestore</code></li>
+<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALAppend, preWALRestore</code></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.CustomObserver.html b/testdevapidocs/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.CustomObserver.html
index 8d4b51d..9cf2270 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.CustomObserver.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/namespace/TestNamespaceAuditor.CustomObserver.html
@@ -246,7 +246,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.RegionObserver</h3>
-<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALRestore</code></li>
+<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALAppend, preWALRestore</code></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/package-tree.html
index b0bd825..d6048ae 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/package-tree.html
@@ -592,15 +592,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/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.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/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/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/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/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/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/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/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/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/ResourceChecker.Phase.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ResourceChecker.Phase</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/procedure/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/procedure/package-tree.html
index b2cf5a6..8e8d54b 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/procedure/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/procedure/package-tree.html
@@ -81,16 +81,16 @@
 <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.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/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.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/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.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/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.ProcedureManager
 <ul>
 <li type="circle">org.apache.hadoop.hbase.procedure.MasterProcedureManager (implements org.apache.hadoop.hbase.Stoppable)
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/NoOpScanPolicyObserver.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/NoOpScanPolicyObserver.html
index d286112..5659d66 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/NoOpScanPolicyObserver.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/NoOpScanPolicyObserver.html
@@ -239,7 +239,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.RegionObserver</h3>
-<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALRestore</code></li>
+<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALAppend, preWALRestore</code></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestCompactionLifeCycleTracker.CompactionObserver.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestCompactionLifeCycleTracker.CompactionObserver.html
index f1d7bdc..5d2a8f2 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestCompactionLifeCycleTracker.CompactionObserver.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestCompactionLifeCycleTracker.CompactionObserver.html
@@ -241,7 +241,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.RegionObserver</h3>
-<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompactScannerOpen, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALRestore</code></li>
+<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompactScannerOpen, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALAppend, preWALRestore</code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.org.apache.hadoop.hbase.coprocessor.RegionCoprocessor">
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestFlushLifeCycleTracker.FlushObserver.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestFlushLifeCycleTracker.FlushObserver.html
index 29680ec..b236ff1 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestFlushLifeCycleTracker.FlushObserver.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestFlushLifeCycleTracker.FlushObserver.html
@@ -233,7 +233,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.RegionObserver</h3>
-<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALRestore</code></li>
+<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALAppend, preWALRestore</code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.org.apache.hadoop.hbase.coprocessor.RegionCoprocessor">
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.Appender.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.Appender.html
index 79784d2..d74f6bf 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.Appender.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.Appender.html
@@ -117,7 +117,7 @@
 </dl>
 <hr>
 <br>
-<pre>private static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4281">TestHRegion.Appender</a>
+<pre>private static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4291">TestHRegion.Appender</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">TestCase for append</div>
@@ -228,7 +228,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>region</h4>
-<pre>private&nbsp;org.apache.hadoop.hbase.regionserver.HRegion <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Appender.html#line.4282">region</a></pre>
+<pre>private&nbsp;org.apache.hadoop.hbase.regionserver.HRegion <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Appender.html#line.4292">region</a></pre>
 </li>
 </ul>
 <a name="appendRow">
@@ -237,7 +237,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>appendRow</h4>
-<pre>private static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Appender.html#line.4283">appendRow</a></pre>
+<pre>private static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Appender.html#line.4293">appendRow</a></pre>
 </li>
 </ul>
 <a name="family">
@@ -246,7 +246,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>family</h4>
-<pre>private static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Appender.html#line.4284">family</a></pre>
+<pre>private static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Appender.html#line.4294">family</a></pre>
 </li>
 </ul>
 <a name="qualifier">
@@ -255,7 +255,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>qualifier</h4>
-<pre>private static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Appender.html#line.4285">qualifier</a></pre>
+<pre>private static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Appender.html#line.4295">qualifier</a></pre>
 </li>
 </ul>
 <a name="CHAR">
@@ -264,7 +264,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>CHAR</h4>
-<pre>private static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Appender.html#line.4286">CHAR</a></pre>
+<pre>private static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Appender.html#line.4296">CHAR</a></pre>
 </li>
 </ul>
 <a name="appendCounter">
@@ -273,7 +273,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>appendCounter</h4>
-<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Appender.html#line.4287">appendCounter</a></pre>
+<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Appender.html#line.4297">appendCounter</a></pre>
 </li>
 </ul>
 </li>
@@ -290,7 +290,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>Appender</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Appender.html#line.4289">Appender</a>(org.apache.hadoop.hbase.regionserver.HRegion&nbsp;region,
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Appender.html#line.4299">Appender</a>(org.apache.hadoop.hbase.regionserver.HRegion&nbsp;region,
                 int&nbsp;appendCounter)</pre>
 </li>
 </ul>
@@ -308,7 +308,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>run</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Appender.html#line.4295">run</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Appender.html#line.4305">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>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.FlushThread.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.FlushThread.html
index 6cf00db..ffcf8f7 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.FlushThread.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.FlushThread.html
@@ -122,7 +122,7 @@
 </dl>
 <hr>
 <br>
-<pre>protected class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3502">TestHRegion.FlushThread</a>
+<pre>protected class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3512">TestHRegion.FlushThread</a>
 extends <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></pre>
 </li>
 </ul>
@@ -255,7 +255,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>done</h4>
-<pre>private volatile&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.FlushThread.html#line.3503">done</a></pre>
+<pre>private volatile&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.FlushThread.html#line.3513">done</a></pre>
 </li>
 </ul>
 <a name="error">
@@ -264,7 +264,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>error</h4>
-<pre>private&nbsp;<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> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.FlushThread.html#line.3504">error</a></pre>
+<pre>private&nbsp;<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> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.FlushThread.html#line.3514">error</a></pre>
 </li>
 </ul>
 </li>
@@ -281,7 +281,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>FlushThread</h4>
-<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.FlushThread.html#line.3506">FlushThread</a>()</pre>
+<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.FlushThread.html#line.3516">FlushThread</a>()</pre>
 </li>
 </ul>
 </li>
@@ -298,7 +298,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>done</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.FlushThread.html#line.3510">done</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.FlushThread.html#line.3520">done</a>()</pre>
 </li>
 </ul>
 <a name="checkNoError--">
@@ -307,7 +307,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>checkNoError</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.FlushThread.html#line.3517">checkNoError</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.FlushThread.html#line.3527">checkNoError</a>()</pre>
 </li>
 </ul>
 <a name="run--">
@@ -316,7 +316,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>run</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.FlushThread.html#line.3524">run</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.FlushThread.html#line.3534">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>
@@ -331,7 +331,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>flush</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.FlushThread.html#line.3551">flush</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.FlushThread.html#line.3561">flush</a>()</pre>
 </li>
 </ul>
 </li>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.GetTillDoneOrException.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.GetTillDoneOrException.html
index ebfd00a..7e75192 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.GetTillDoneOrException.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.GetTillDoneOrException.html
@@ -122,7 +122,7 @@
 </dl>
 <hr>
 <br>
-<pre>class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1312">TestHRegion.GetTillDoneOrException</a>
+<pre>class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1313">TestHRegion.GetTillDoneOrException</a>
 extends <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></pre>
 </li>
 </ul>
@@ -254,7 +254,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>g</h4>
-<pre>private final&nbsp;org.apache.hadoop.hbase.client.Get <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.GetTillDoneOrException.html#line.1313">g</a></pre>
+<pre>private final&nbsp;org.apache.hadoop.hbase.client.Get <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.GetTillDoneOrException.html#line.1314">g</a></pre>
 </li>
 </ul>
 <a name="done">
@@ -263,7 +263,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>done</h4>
-<pre>private 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/TestHRegion.GetTillDoneOrException.html#line.1314">done</a></pre>
+<pre>private 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/TestHRegion.GetTillDoneOrException.html#line.1315">done</a></pre>
 </li>
 </ul>
 <a name="count">
@@ -272,7 +272,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>count</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/TestHRegion.GetTillDoneOrException.html#line.1315">count</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/TestHRegion.GetTillDoneOrException.html#line.1316">count</a></pre>
 </li>
 </ul>
 <a name="e">
@@ -281,7 +281,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>e</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/TestHRegion.GetTillDoneOrException.html#line.1316">e</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/TestHRegion.GetTillDoneOrException.html#line.1317">e</a></pre>
 </li>
 </ul>
 </li>
@@ -298,7 +298,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>GetTillDoneOrException</h4>
-<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.GetTillDoneOrException.html#line.1318">GetTillDoneOrException</a>(int&nbsp;i,
+<pre><a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.GetTillDoneOrException.html#line.1319">GetTillDoneOrException</a>(int&nbsp;i,
                        byte[]&nbsp;r,
                        <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>&nbsp;d,
                        <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>&nbsp;c)</pre>
@@ -318,7 +318,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>run</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.GetTillDoneOrException.html#line.1327">run</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.GetTillDoneOrException.html#line.1328">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>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionForTesting.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionForTesting.html
index e4bf04f..d858571 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionForTesting.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionForTesting.html
@@ -122,7 +122,7 @@
 </dl>
 <hr>
 <br>
-<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.6333">TestHRegion.HRegionForTesting</a>
+<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.6343">TestHRegion.HRegionForTesting</a>
 extends org.apache.hadoop.hbase.regionserver.HRegion</pre>
 <div class="block">The same as HRegion class, the only difference is that instantiateHStore will
  create a different HStore - HStoreForTesting. [HBASE-8518]</div>
@@ -260,7 +260,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>HRegionForTesting</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionForTesting.html#line.6335">HRegionForTesting</a>(org.apache.hadoop.fs.Path&nbsp;tableDir,
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionForTesting.html#line.6345">HRegionForTesting</a>(org.apache.hadoop.fs.Path&nbsp;tableDir,
                          org.apache.hadoop.hbase.wal.WAL&nbsp;wal,
                          org.apache.hadoop.fs.FileSystem&nbsp;fs,
                          org.apache.hadoop.conf.Configuration&nbsp;confParam,
@@ -275,7 +275,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>HRegionForTesting</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionForTesting.html#line.6342">HRegionForTesting</a>(org.apache.hadoop.hbase.regionserver.HRegionFileSystem&nbsp;fs,
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionForTesting.html#line.6352">HRegionForTesting</a>(org.apache.hadoop.hbase.regionserver.HRegionFileSystem&nbsp;fs,
                          org.apache.hadoop.hbase.wal.WAL&nbsp;wal,
                          org.apache.hadoop.conf.Configuration&nbsp;confParam,
                          org.apache.hadoop.hbase.client.TableDescriptor&nbsp;htd,
@@ -296,7 +296,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>instantiateHStore</h4>
-<pre>protected&nbsp;org.apache.hadoop.hbase.regionserver.HStore&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionForTesting.html#line.6353">instantiateHStore</a>(org.apache.hadoop.hbase.client.ColumnFamilyDescriptor&nbsp;family,
+<pre>protected&nbsp;org.apache.hadoop.hbase.regionserver.HStore&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionForTesting.html#line.6363">instantiateHStore</a>(org.apache.hadoop.hbase.client.ColumnFamilyDescriptor&nbsp;family,
                                                                         boolean&nbsp;warmup)
                                                                  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">Create HStore instance.</div>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionWithSeqId.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionWithSeqId.html
index da8d2c7..cac290a 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionWithSeqId.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionWithSeqId.html
@@ -122,7 +122,7 @@
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.5674">TestHRegion.HRegionWithSeqId</a>
+<pre>static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.5684">TestHRegion.HRegionWithSeqId</a>
 extends org.apache.hadoop.hbase.regionserver.HRegion</pre>
 </li>
 </ul>
@@ -248,7 +248,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>HRegionWithSeqId</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionWithSeqId.html#line.5675">HRegionWithSeqId</a>(org.apache.hadoop.fs.Path&nbsp;tableDir,
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionWithSeqId.html#line.5685">HRegionWithSeqId</a>(org.apache.hadoop.fs.Path&nbsp;tableDir,
                         org.apache.hadoop.hbase.wal.WAL&nbsp;wal,
                         org.apache.hadoop.fs.FileSystem&nbsp;fs,
                         org.apache.hadoop.conf.Configuration&nbsp;confParam,
@@ -271,7 +271,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getNextSequenceId</h4>
-<pre>protected&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionWithSeqId.html#line.5681">getNextSequenceId</a>(org.apache.hadoop.hbase.wal.WAL&nbsp;wal)
+<pre>protected&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionWithSeqId.html#line.5691">getNextSequenceId</a>(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="overrideSpecifyLabel">Overrides:</span></dt>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.HStoreForTesting.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.HStoreForTesting.html
index cc4261f..9d56015 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.HStoreForTesting.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.HStoreForTesting.html
@@ -122,7 +122,7 @@
 </dl>
 <hr>
 <br>
-<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.6375">TestHRegion.HStoreForTesting</a>
+<pre>public static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.6385">TestHRegion.HStoreForTesting</a>
 extends org.apache.hadoop.hbase.regionserver.HStore</pre>
 <div class="block">HStoreForTesting is merely the same as HStore, the difference is in the doCompaction method
  of HStoreForTesting there is a checkpoint "hbase.hstore.compaction.complete" which
@@ -235,7 +235,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>HStoreForTesting</h4>
-<pre>protected&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.HStoreForTesting.html#line.6377">HStoreForTesting</a>(org.apache.hadoop.hbase.regionserver.HRegion&nbsp;region,
+<pre>protected&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.HStoreForTesting.html#line.6387">HStoreForTesting</a>(org.apache.hadoop.hbase.regionserver.HRegion&nbsp;region,
                            org.apache.hadoop.hbase.client.ColumnFamilyDescriptor&nbsp;family,
                            org.apache.hadoop.conf.Configuration&nbsp;confParam,
                            boolean&nbsp;warmup)
@@ -260,7 +260,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>doCompaction</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;org.apache.hadoop.hbase.regionserver.HStoreFile&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.HStoreForTesting.html#line.6384">doCompaction</a>(org.apache.hadoop.hbase.regionserver.compactions.CompactionRequestImpl&nbsp;cr,
+<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;org.apache.hadoop.hbase.regionserver.HStoreFile&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.HStoreForTesting.html#line.6394">doCompaction</a>(org.apache.hadoop.hbase.regionserver.compactions.CompactionRequestImpl&nbsp;cr,
                                                                              <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;org.apache.hadoop.hbase.regionserver.HStoreFile&gt;&nbsp;filesToCompact,
                                                                              org.apache.hadoop.hbase.security.User&nbsp;user,
                                                                              long&nbsp;compactionStartTime,
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.Incrementer.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.Incrementer.html
index ff496d2..6bbc7ce 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.Incrementer.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.Incrementer.html
@@ -117,7 +117,7 @@
 </dl>
 <hr>
 <br>
-<pre>private static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4195">TestHRegion.Incrementer</a>
+<pre>private static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4205">TestHRegion.Incrementer</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">TestCase for increment</div>
@@ -228,7 +228,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>region</h4>
-<pre>private&nbsp;org.apache.hadoop.hbase.regionserver.HRegion <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Incrementer.html#line.4196">region</a></pre>
+<pre>private&nbsp;org.apache.hadoop.hbase.regionserver.HRegion <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Incrementer.html#line.4206">region</a></pre>
 </li>
 </ul>
 <a name="incRow">
@@ -237,7 +237,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>incRow</h4>
-<pre>private static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Incrementer.html#line.4197">incRow</a></pre>
+<pre>private static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Incrementer.html#line.4207">incRow</a></pre>
 </li>
 </ul>
 <a name="family">
@@ -246,7 +246,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>family</h4>
-<pre>private static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Incrementer.html#line.4198">family</a></pre>
+<pre>private static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Incrementer.html#line.4208">family</a></pre>
 </li>
 </ul>
 <a name="qualifier">
@@ -255,7 +255,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>qualifier</h4>
-<pre>private static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Incrementer.html#line.4199">qualifier</a></pre>
+<pre>private static final&nbsp;byte[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Incrementer.html#line.4209">qualifier</a></pre>
 </li>
 </ul>
 <a name="ONE">
@@ -264,7 +264,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>ONE</h4>
-<pre>private static final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Incrementer.html#line.4200">ONE</a></pre>
+<pre>private static final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Incrementer.html#line.4210">ONE</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.regionserver.TestHRegion.Incrementer.ONE">Constant Field Values</a></dd>
@@ -277,7 +277,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>incCounter</h4>
-<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Incrementer.html#line.4201">incCounter</a></pre>
+<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Incrementer.html#line.4211">incCounter</a></pre>
 </li>
 </ul>
 </li>
@@ -294,7 +294,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>Incrementer</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Incrementer.html#line.4203">Incrementer</a>(org.apache.hadoop.hbase.regionserver.HRegion&nbsp;region,
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Incrementer.html#line.4213">Incrementer</a>(org.apache.hadoop.hbase.regionserver.HRegion&nbsp;region,
                    int&nbsp;incCounter)</pre>
 </li>
 </ul>
@@ -312,7 +312,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>run</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Incrementer.html#line.4209">run</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Incrementer.html#line.4219">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>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.IsFlushWALMarker.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.IsFlushWALMarker.html
index 45ff007..767fdda 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.IsFlushWALMarker.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.IsFlushWALMarker.html
@@ -117,7 +117,7 @@
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1111">TestHRegion.IsFlushWALMarker</a>
+<pre>static class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1112">TestHRegion.IsFlushWALMarker</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 org.mockito.ArgumentMatcher&lt;org.apache.hadoop.hbase.wal.WALEdit&gt;</pre>
 </li>
@@ -210,7 +210,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>actions</h4>
-<pre>volatile&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos.FlushDescriptor.FlushAction[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.IsFlushWALMarker.html#line.1112">actions</a></pre>
+<pre>volatile&nbsp;org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos.FlushDescriptor.FlushAction[] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.IsFlushWALMarker.html#line.1113">actions</a></pre>
 </li>
 </ul>
 </li>
@@ -227,7 +227,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>IsFlushWALMarker</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.IsFlushWALMarker.html#line.1113">IsFlushWALMarker</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos.FlushDescriptor.FlushAction...&nbsp;actions)</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.IsFlushWALMarker.html#line.1114">IsFlushWALMarker</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos.FlushDescriptor.FlushAction...&nbsp;actions)</pre>
 </li>
 </ul>
 </li>
@@ -244,7 +244,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>matches</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.IsFlushWALMarker.html#line.1117">matches</a>(org.apache.hadoop.hbase.wal.WALEdit&nbsp;edit)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.IsFlushWALMarker.html#line.1118">matches</a>(org.apache.hadoop.hbase.wal.WALEdit&nbsp;edit)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code>matches</code>&nbsp;in interface&nbsp;<code>org.mockito.ArgumentMatcher&lt;org.apache.hadoop.hbase.wal.WALEdit&gt;</code></dd>
@@ -257,7 +257,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>set</h4>
-<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestHRegion.IsFlushWALMarker.html" title="class in org.apache.hadoop.hbase.regionserver">TestHRegion.IsFlushWALMarker</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.IsFlushWALMarker.html#line.1140">set</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos.FlushDescriptor.FlushAction...&nbsp;actions)</pre>
+<pre>public&nbsp;<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestHRegion.IsFlushWALMarker.html" title="class in org.apache.hadoop.hbase.regionserver">TestHRegion.IsFlushWALMarker</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.IsFlushWALMarker.html#line.1141">set</a>(org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos.FlushDescriptor.FlushAction...&nbsp;actions)</pre>
 </li>
 </ul>
 </li>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html
index 0d4697f..fb22d6b 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html
@@ -122,7 +122,7 @@
 </dl>
 <hr>
 <br>
-<pre>protected class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3657">TestHRegion.PutThread</a>
+<pre>protected class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3667">TestHRegion.PutThread</a>
 extends <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></pre>
 </li>
 </ul>
@@ -277,7 +277,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>done</h4>
-<pre>private volatile&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html#line.3658">done</a></pre>
+<pre>private volatile&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html#line.3668">done</a></pre>
 </li>
 </ul>
 <a name="numPutsFinished">
@@ -286,7 +286,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>numPutsFinished</h4>
-<pre>private volatile&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html#line.3659">numPutsFinished</a></pre>
+<pre>private volatile&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html#line.3669">numPutsFinished</a></pre>
 </li>
 </ul>
 <a name="error">
@@ -295,7 +295,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>error</h4>
-<pre>private&nbsp;<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> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html#line.3661">error</a></pre>
+<pre>private&nbsp;<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> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html#line.3671">error</a></pre>
 </li>
 </ul>
 <a name="numRows">
@@ -304,7 +304,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>numRows</h4>
-<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html#line.3662">numRows</a></pre>
+<pre>private&nbsp;int <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html#line.3672">numRows</a></pre>
 </li>
 </ul>
 <a name="families">
@@ -313,7 +313,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>families</h4>
-<pre>private&nbsp;byte[][] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html#line.3663">families</a></pre>
+<pre>private&nbsp;byte[][] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html#line.3673">families</a></pre>
 </li>
 </ul>
 <a name="qualifiers">
@@ -322,7 +322,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>qualifiers</h4>
-<pre>private&nbsp;byte[][] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html#line.3664">qualifiers</a></pre>
+<pre>private&nbsp;byte[][] <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html#line.3674">qualifiers</a></pre>
 </li>
 </ul>
 </li>
@@ -339,7 +339,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>PutThread</h4>
-<pre>private&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html#line.3666">PutThread</a>(int&nbsp;numRows,
+<pre>private&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html#line.3676">PutThread</a>(int&nbsp;numRows,
                   byte[][]&nbsp;families,
                   byte[][]&nbsp;qualifiers)</pre>
 </li>
@@ -358,7 +358,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>waitForFirstPut</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html#line.3676">waitForFirstPut</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html#line.3686">waitForFirstPut</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">Block calling thread until this instance of PutThread has put at least one row.</div>
 <dl>
@@ -373,7 +373,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>done</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html#line.3684">done</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html#line.3694">done</a>()</pre>
 </li>
 </ul>
 <a name="checkNoError--">
@@ -382,7 +382,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>checkNoError</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html#line.3691">checkNoError</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html#line.3701">checkNoError</a>()</pre>
 </li>
 </ul>
 <a name="run--">
@@ -391,7 +391,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>run</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html#line.3698">run</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html#line.3708">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>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.html
index e2eecff..daa8557 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegion.html
@@ -1391,7 +1391,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testFlushAndMemstoreSizeCounting</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.445">testFlushAndMemstoreSizeCounting</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.446">testFlushAndMemstoreSizeCounting</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>
 <div class="block">A test case of HBASE-21041</div>
 <dl>
@@ -1406,7 +1406,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testFlushSizeAccounting</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.486">testFlushSizeAccounting</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.487">testFlushSizeAccounting</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>
 <div class="block">Test we do not lose data if we fail a flush and then close.
  Part of HBase-10466.  Tests the following from the issue description:
@@ -1432,7 +1432,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testCloseWithFailingFlush</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.551">testCloseWithFailingFlush</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.552">testCloseWithFailingFlush</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>
@@ -1446,7 +1446,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testCompactionAffectedByScanners</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.607">testCompactionAffectedByScanners</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.608">testCompactionAffectedByScanners</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>
@@ -1460,7 +1460,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testToShowNPEOnRegionScannerReseek</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.655">testToShowNPEOnRegionScannerReseek</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.656">testToShowNPEOnRegionScannerReseek</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>
@@ -1474,7 +1474,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testSkipRecoveredEditsReplay</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.685">testSkipRecoveredEditsReplay</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.686">testSkipRecoveredEditsReplay</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>
@@ -1488,7 +1488,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testSkipRecoveredEditsReplaySomeIgnored</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.736">testSkipRecoveredEditsReplaySomeIgnored</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.737">testSkipRecoveredEditsReplaySomeIgnored</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>
@@ -1502,7 +1502,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testSkipRecoveredEditsReplayAllIgnored</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.792">testSkipRecoveredEditsReplayAllIgnored</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.793">testSkipRecoveredEditsReplayAllIgnored</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>
@@ -1516,7 +1516,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testSkipRecoveredEditsReplayTheLastFileIgnored</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.819">testSkipRecoveredEditsReplayTheLastFileIgnored</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.820">testSkipRecoveredEditsReplayTheLastFileIgnored</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>
@@ -1530,7 +1530,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testRecoveredEditsReplayCompaction</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.882">testRecoveredEditsReplayCompaction</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.883">testRecoveredEditsReplayCompaction</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>
@@ -1544,7 +1544,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testRecoveredEditsReplayCompaction</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.887">testRecoveredEditsReplayCompaction</a>(boolean&nbsp;mismatchedRegionName)
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.888">testRecoveredEditsReplayCompaction</a>(boolean&nbsp;mismatchedRegionName)
                                         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>
@@ -1558,7 +1558,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testFlushMarkers</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.996">testFlushMarkers</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.997">testFlushMarkers</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>
@@ -1572,7 +1572,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testFlushMarkersWALFail</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1147">testFlushMarkersWALFail</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1148">testFlushMarkersWALFail</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>
@@ -1586,7 +1586,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testGetWhileRegionClose</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1258">testGetWhileRegionClose</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1259">testGetWhileRegionClose</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>
@@ -1600,7 +1600,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testWeirdCacheBehaviour</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1344">testWeirdCacheBehaviour</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1345">testWeirdCacheBehaviour</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>
@@ -1614,7 +1614,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testAppendWithReadOnlyTable</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1382">testAppendWithReadOnlyTable</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1383">testAppendWithReadOnlyTable</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>
@@ -1628,7 +1628,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testIncrWithReadOnlyTable</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1399">testIncrWithReadOnlyTable</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1400">testIncrWithReadOnlyTable</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>
@@ -1642,7 +1642,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>deleteColumns</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1414">deleteColumns</a>(org.apache.hadoop.hbase.regionserver.HRegion&nbsp;r,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1415">deleteColumns</a>(org.apache.hadoop.hbase.regionserver.HRegion&nbsp;r,
                            <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;value,
                            <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;keyPrefix)
                     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>
@@ -1658,7 +1658,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>getNumberOfRows</h4>
-<pre>private&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1433">getNumberOfRows</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;keyPrefix,
+<pre>private&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1434">getNumberOfRows</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;keyPrefix,
                             <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;value,
                             org.apache.hadoop.hbase.regionserver.HRegion&nbsp;r)
                      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>
@@ -1674,7 +1674,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>buildScanner</h4>
-<pre>private&nbsp;org.apache.hadoop.hbase.regionserver.InternalScanner&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1452">buildScanner</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;keyPrefix,
+<pre>private&nbsp;org.apache.hadoop.hbase.regionserver.InternalScanner&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1453">buildScanner</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;keyPrefix,
                                                                           <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;value,
                                                                           org.apache.hadoop.hbase.regionserver.HRegion&nbsp;r)
                                                                    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>
@@ -1690,7 +1690,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>putRows</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1472">putRows</a>(org.apache.hadoop.hbase.regionserver.HRegion&nbsp;r,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1473">putRows</a>(org.apache.hadoop.hbase.regionserver.HRegion&nbsp;r,
                      int&nbsp;numRows,
                      <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;value,
                      <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;key)
@@ -1707,7 +1707,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testFamilyWithAndWithoutColon</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1488">testFamilyWithAndWithoutColon</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1489">testFamilyWithAndWithoutColon</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>
@@ -1721,7 +1721,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testBatchPut_whileNoRowLocksHeld</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1504">testBatchPut_whileNoRowLocksHeld</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1505">testBatchPut_whileNoRowLocksHeld</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>
@@ -1735,7 +1735,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testBatchPut_whileMultipleRowLocksHeld</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1529">testBatchPut_whileMultipleRowLocksHeld</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1530">testBatchPut_whileMultipleRowLocksHeld</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>
@@ -1749,7 +1749,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>waitForCounter</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1603">waitForCounter</a>(org.apache.hadoop.hbase.regionserver.wal.MetricsWALSource&nbsp;source,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1604">waitForCounter</a>(org.apache.hadoop.hbase.regionserver.wal.MetricsWALSource&nbsp;source,
                             <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;metricName,
                             long&nbsp;expectedCount)
                      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>
@@ -1765,7 +1765,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testAtomicBatchPut</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1617">testAtomicBatchPut</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1618">testAtomicBatchPut</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>
@@ -1779,7 +1779,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testBatchPutWithTsSlop</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1681">testBatchPutWithTsSlop</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1682">testBatchPutWithTsSlop</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>
@@ -1793,7 +1793,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>prepareRegionForBachPut</h4>
-<pre>private&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1700">prepareRegionForBachPut</a>(org.apache.hadoop.hbase.client.Put[]&nbsp;puts,
+<pre>private&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1701">prepareRegionForBachPut</a>(org.apache.hadoop.hbase.client.Put[]&nbsp;puts,
                                      org.apache.hadoop.hbase.regionserver.wal.MetricsWALSource&nbsp;source,
                                      boolean&nbsp;slop)
                               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>
@@ -1811,7 +1811,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testCheckAndMutate_WithEmptyRowValue</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1720">testCheckAndMutate_WithEmptyRowValue</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1721">testCheckAndMutate_WithEmptyRowValue</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>
@@ -1825,7 +1825,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testCheckAndMutate_WithWrongValue</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1789">testCheckAndMutate_WithWrongValue</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1790">testCheckAndMutate_WithWrongValue</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>
@@ -1839,7 +1839,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testCheckAndMutate_WithCorrectValue</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1838">testCheckAndMutate_WithCorrectValue</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1839">testCheckAndMutate_WithCorrectValue</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>
@@ -1853,7 +1853,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testCheckAndMutate_WithNonEqualCompareOp</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1885">testCheckAndMutate_WithNonEqualCompareOp</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1886">testCheckAndMutate_WithNonEqualCompareOp</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>
@@ -1867,7 +1867,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testCheckAndPut_ThatPutWasWritten</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1974">testCheckAndPut_ThatPutWasWritten</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.1975">testCheckAndPut_ThatPutWasWritten</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>
@@ -1881,7 +1881,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testCheckAndPut_wrongRowInPut</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2015">testCheckAndPut_wrongRowInPut</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2016">testCheckAndPut_wrongRowInPut</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>
@@ -1895,7 +1895,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testCheckAndDelete_ThatDeleteWasWritten</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2029">testCheckAndDelete_ThatDeleteWasWritten</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2030">testCheckAndDelete_ThatDeleteWasWritten</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>
@@ -1909,7 +1909,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testDelete_multiDeleteColumn</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2103">testDelete_multiDeleteColumn</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2104">testDelete_multiDeleteColumn</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>
@@ -1923,7 +1923,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testDelete_CheckFamily</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2129">testDelete_CheckFamily</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2130">testDelete_CheckFamily</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>
@@ -1937,7 +1937,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testDelete_mixed</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2161">testDelete_mixed</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2162">testDelete_mixed</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>,
                              <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>
 <dl>
@@ -1953,7 +1953,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testDeleteRowWithFutureTs</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2223">testDeleteRowWithFutureTs</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2224">testDeleteRowWithFutureTs</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>
@@ -1967,7 +1967,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testPutWithLatestTS</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2260">testPutWithLatestTS</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2261">testPutWithLatestTS</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">Tests that the special LATEST_TIMESTAMP option for puts gets replaced by
  the actual timestamp</div>
@@ -1983,7 +1983,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testPutWithTsSlop</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2305">testPutWithTsSlop</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2306">testPutWithTsSlop</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">Tests that there is server-side filtering for invalid timestamp upper
  bound. Note that the timestamp lower bound is automatically handled for us
@@ -2000,7 +2000,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testScanner_DeleteOneFamilyNotAnother</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2328">testScanner_DeleteOneFamilyNotAnother</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2329">testScanner_DeleteOneFamilyNotAnother</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>
@@ -2014,7 +2014,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testDataInMemoryWithoutWAL</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2365">testDataInMemoryWithoutWAL</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2366">testDataInMemoryWithoutWAL</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>
@@ -2028,7 +2028,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testDataInMemoryWithoutWAL</h4>
-<pre>private static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2414">testDataInMemoryWithoutWAL</a>(org.apache.hadoop.hbase.regionserver.HRegion&nbsp;region,
+<pre>private static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2415">testDataInMemoryWithoutWAL</a>(org.apache.hadoop.hbase.regionserver.HRegion&nbsp;region,
                                                org.apache.hadoop.hbase.client.Put&nbsp;originalPut,
                                                org.apache.hadoop.hbase.client.Put&nbsp;addPut,
                                                long&nbsp;delta)
@@ -2045,7 +2045,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testDeleteColumns_PostInsert</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2439">testDeleteColumns_PostInsert</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2449">testDeleteColumns_PostInsert</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>,
                                          <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>
 <dl>
@@ -2061,7 +2061,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testaddFamily_PostInsert</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2446">testaddFamily_PostInsert</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2456">testaddFamily_PostInsert</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>,
                                      <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>
 <dl>
@@ -2077,7 +2077,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>doTestDelete_AndPostInsert</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2452">doTestDelete_AndPostInsert</a>(org.apache.hadoop.hbase.client.Delete&nbsp;delete)
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2462">doTestDelete_AndPostInsert</a>(org.apache.hadoop.hbase.client.Delete&nbsp;delete)
                                 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>
 <dl>
@@ -2093,7 +2093,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testDelete_CheckTimestampUpdated</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2492">testDelete_CheckTimestampUpdated</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2502">testDelete_CheckTimestampUpdated</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>
@@ -2107,7 +2107,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testGet_FamilyChecker</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2527">testGet_FamilyChecker</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2537">testGet_FamilyChecker</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>
@@ -2121,7 +2121,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testGet_Basic</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2548">testGet_Basic</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2558">testGet_Basic</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>
@@ -2135,7 +2135,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testGet_Empty</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2594">testGet_Empty</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2604">testGet_Empty</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>
@@ -2149,7 +2149,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testGetWithFilter</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2607">testGetWithFilter</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2617">testGetWithFilter</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>,
                               <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>
 <dl>
@@ -2165,7 +2165,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testGetScanner_WithOkFamilies</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2667">testGetScanner_WithOkFamilies</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2677">testGetScanner_WithOkFamilies</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>
@@ -2179,7 +2179,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testGetScanner_WithNotOkFamilies</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2686">testGetScanner_WithNotOkFamilies</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2696">testGetScanner_WithNotOkFamilies</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>
@@ -2193,7 +2193,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testGetScanner_WithNoFamilies</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2706">testGetScanner_WithNoFamilies</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2716">testGetScanner_WithNoFamilies</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>
@@ -2207,7 +2207,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testGetScanner_WithRegionClosed</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2748">testGetScanner_WithRegionClosed</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2758">testGetScanner_WithRegionClosed</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 method tests https://issues.apache.org/jira/browse/HBASE-2516.</div>
 <dl>
@@ -2222,7 +2222,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testRegionScanner_Next</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2775">testRegionScanner_Next</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2785">testRegionScanner_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>
@@ -2236,7 +2236,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testScanner_ExplicitColumns_FromMemStore_EnforceVersions</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2835">testScanner_ExplicitColumns_FromMemStore_EnforceVersions</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2845">testScanner_ExplicitColumns_FromMemStore_EnforceVersions</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>
@@ -2250,7 +2250,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testScanner_ExplicitColumns_FromFilesOnly_EnforceVersions</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2888">testScanner_ExplicitColumns_FromFilesOnly_EnforceVersions</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2898">testScanner_ExplicitColumns_FromFilesOnly_EnforceVersions</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>
@@ -2264,7 +2264,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testScanner_ExplicitColumns_FromMemStoreAndFiles_EnforceVersions</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2945">testScanner_ExplicitColumns_FromMemStoreAndFiles_EnforceVersions</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.2955">testScanner_ExplicitColumns_FromMemStoreAndFiles_EnforceVersions</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>
@@ -2278,7 +2278,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testScanner_Wildcard_FromMemStore_EnforceVersions</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3022">testScanner_Wildcard_FromMemStore_EnforceVersions</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3032">testScanner_Wildcard_FromMemStore_EnforceVersions</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>
@@ -2292,7 +2292,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testScanner_Wildcard_FromFilesOnly_EnforceVersions</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3077">testScanner_Wildcard_FromFilesOnly_EnforceVersions</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3087">testScanner_Wildcard_FromFilesOnly_EnforceVersions</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>
@@ -2306,7 +2306,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testScanner_StopRow1542</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3132">testScanner_StopRow1542</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3142">testScanner_StopRow1542</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>
@@ -2320,7 +2320,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testScanner_Wildcard_FromMemStoreAndFiles_EnforceVersions</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3175">testScanner_Wildcard_FromMemStoreAndFiles_EnforceVersions</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3185">testScanner_Wildcard_FromMemStoreAndFiles_EnforceVersions</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>
@@ -2334,7 +2334,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testScanner_JoinedScanners</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3254">testScanner_JoinedScanners</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3264">testScanner_JoinedScanners</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">Added for HBASE-5416
 
@@ -2352,7 +2352,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testScanner_JoinedScannersWithLimits</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3317">testScanner_JoinedScannersWithLimits</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3327">testScanner_JoinedScannersWithLimits</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">HBASE-5416
 
@@ -2369,7 +2369,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testLongQualifier</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3411">testLongQualifier</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3421">testLongQualifier</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>
 <div class="block">Write an HFile block full with Cells whose qualifier that are identical between
  0 and Short.MAX_VALUE. See HBASE-13329.</div>
@@ -2385,7 +2385,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testFlushCacheWhileScanning</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3437">testFlushCacheWhileScanning</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3447">testFlushCacheWhileScanning</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>,
                                         <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">Flushes the cache in a thread while scanning. The tests verify that the
@@ -2404,7 +2404,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testWritesWhileScanning</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3568">testWritesWhileScanning</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3578">testWritesWhileScanning</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>,
                                     <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">Writes very wide records and scans for the latest every time.. Flushes and
@@ -2422,7 +2422,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testWritesWhileGetting</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3745">testWritesWhileGetting</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3755">testWritesWhileGetting</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>
 <div class="block">Writes very wide records and gets the latest row every time.. Flushes and
  compacts the region aggressivly to catch issues.</div>
@@ -2440,7 +2440,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testHolesInMeta</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3850">testHolesInMeta</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3860">testHolesInMeta</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>
@@ -2454,7 +2454,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testIndexesScanWithOneDeletedRow</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3868">testIndexesScanWithOneDeletedRow</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3878">testIndexesScanWithOneDeletedRow</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>
@@ -2468,7 +2468,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testBloomFilterSize</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3905">testBloomFilterSize</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3915">testBloomFilterSize</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>
@@ -2482,7 +2482,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testAllColumnsWithBloomFilter</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3959">testAllColumnsWithBloomFilter</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.3969">testAllColumnsWithBloomFilter</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>
@@ -2496,7 +2496,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testDeleteRowWithBloomFilter</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4002">testDeleteRowWithBloomFilter</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4012">testDeleteRowWithBloomFilter</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">Testcase to cover bug-fix for HBASE-2823 Ensures correct delete when
  issuing delete row on columns with bloom filter set to row+col
@@ -2513,7 +2513,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testgetHDFSBlocksDistribution</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4035">testgetHDFSBlocksDistribution</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4045">testgetHDFSBlocksDistribution</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>
@@ -2527,7 +2527,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testStatusSettingToAbortIfAnyExceptionDuringRegionInitilization</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4114">testStatusSettingToAbortIfAnyExceptionDuringRegionInitilization</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4124">testStatusSettingToAbortIfAnyExceptionDuringRegionInitilization</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>
 <div class="block">Testcase to check state of region initialization task set to ABORTED or not
  if any exceptions during initialization</div>
@@ -2543,7 +2543,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testRegionInfoFileCreation</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4146">testRegionInfoFileCreation</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4156">testRegionInfoFileCreation</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">Verifies that the .regioninfo file is written on region creation and that
  is recreated if missing during region opening.</div>
@@ -2559,7 +2559,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testParallelIncrementWithMemStoreFlush</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4230">testParallelIncrementWithMemStoreFlush</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4240">testParallelIncrementWithMemStoreFlush</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>
 <div class="block">Test case to check increment function with memstore flushing</div>
 <dl>
@@ -2574,7 +2574,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testParallelAppendWithMemStoreFlush</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4316">testParallelAppendWithMemStoreFlush</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4326">testParallelAppendWithMemStoreFlush</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>
 <div class="block">Test case to check append function with memstore flushing</div>
 <dl>
@@ -2589,7 +2589,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testPutWithMemStoreFlush</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4375">testPutWithMemStoreFlush</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4385">testPutWithMemStoreFlush</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>
 <div class="block">Test case to check put function with memstore flushing for same row, same ts</div>
 <dl>
@@ -2604,7 +2604,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testDurability</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4430">testDurability</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4440">testDurability</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>
@@ -2618,7 +2618,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>durabilityTest</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4479">durabilityTest</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;method,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4489">durabilityTest</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;method,
                             org.apache.hadoop.hbase.client.Durability&nbsp;tableDurability,
                             org.apache.hadoop.hbase.client.Durability&nbsp;mutationDurability,
                             long&nbsp;timeout,
@@ -2638,7 +2638,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testRegionReplicaSecondary</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4534">testRegionReplicaSecondary</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4544">testRegionReplicaSecondary</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>
@@ -2652,7 +2652,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testRegionReplicaSecondaryIsReadOnly</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4584">testRegionReplicaSecondaryIsReadOnly</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4594">testRegionReplicaSecondaryIsReadOnly</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>
@@ -2666,7 +2666,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>createWALFactory</h4>
-<pre>static&nbsp;org.apache.hadoop.hbase.wal.WALFactory&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4638">createWALFactory</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
+<pre>static&nbsp;org.apache.hadoop.hbase.wal.WALFactory&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4648">createWALFactory</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
                                                                org.apache.hadoop.fs.Path&nbsp;rootDir)
                                                         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>
@@ -2681,7 +2681,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testCompactionFromPrimary</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4645">testCompactionFromPrimary</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4655">testCompactionFromPrimary</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>
@@ -2695,7 +2695,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>putData</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4699">putData</a>(int&nbsp;startRow,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4709">putData</a>(int&nbsp;startRow,
                      int&nbsp;numRows,
                      byte[]&nbsp;qf,
                      byte[]...&nbsp;families)
@@ -2712,7 +2712,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>putData</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4704">putData</a>(org.apache.hadoop.hbase.regionserver.HRegion&nbsp;region,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4714">putData</a>(org.apache.hadoop.hbase.regionserver.HRegion&nbsp;region,
                      int&nbsp;startRow,
                      int&nbsp;numRows,
                      byte[]&nbsp;qf,
@@ -2730,7 +2730,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>putData</h4>
-<pre>static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4709">putData</a>(org.apache.hadoop.hbase.regionserver.HRegion&nbsp;region,
+<pre>static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4719">putData</a>(org.apache.hadoop.hbase.regionserver.HRegion&nbsp;region,
                     org.apache.hadoop.hbase.client.Durability&nbsp;durability,
                     int&nbsp;startRow,
                     int&nbsp;numRows,
@@ -2749,7 +2749,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>verifyData</h4>
-<pre>static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4722">verifyData</a>(org.apache.hadoop.hbase.regionserver.HRegion&nbsp;newReg,
+<pre>static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4732">verifyData</a>(org.apache.hadoop.hbase.regionserver.HRegion&nbsp;newReg,
                        int&nbsp;startRow,
                        int&nbsp;numRows,
                        byte[]&nbsp;qf,
@@ -2767,7 +2767,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>assertGet</h4>
-<pre>static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4741">assertGet</a>(org.apache.hadoop.hbase.regionserver.HRegion&nbsp;r,
+<pre>static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4751">assertGet</a>(org.apache.hadoop.hbase.regionserver.HRegion&nbsp;r,
                       byte[]&nbsp;family,
                       byte[]&nbsp;k)
                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>
@@ -2783,7 +2783,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>assertScan</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4763">assertScan</a>(org.apache.hadoop.hbase.regionserver.HRegion&nbsp;r,
+<pre>protected&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4773">assertScan</a>(org.apache.hadoop.hbase.regionserver.HRegion&nbsp;r,
                           byte[]&nbsp;fs,
                           byte[]&nbsp;firstValue)
                    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>
@@ -2799,7 +2799,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testFlushResult</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4795">testFlushResult</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4805">testFlushResult</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">Test that we get the expected flush results back</div>
 <dl>
@@ -2814,7 +2814,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>initSplit</h4>
-<pre>protected&nbsp;org.apache.hadoop.conf.Configuration&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4824">initSplit</a>()</pre>
+<pre>protected&nbsp;org.apache.hadoop.conf.Configuration&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4834">initSplit</a>()</pre>
 </li>
 </ul>
 <a name="initHRegion-org.apache.hadoop.hbase.TableName-java.lang.String-org.apache.hadoop.conf.Configuration-byte:A...-">
@@ -2823,7 +2823,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>initHRegion</h4>
-<pre>protected&nbsp;org.apache.hadoop.hbase.regionserver.HRegion&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4843">initHRegion</a>(org.apache.hadoop.hbase.TableName&nbsp;tableName,
+<pre>protected&nbsp;org.apache.hadoop.hbase.regionserver.HRegion&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4853">initHRegion</a>(org.apache.hadoop.hbase.TableName&nbsp;tableName,
                                                                    <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;callingMethod,
                                                                    org.apache.hadoop.conf.Configuration&nbsp;conf,
                                                                    byte[]...&nbsp;families)
@@ -2843,7 +2843,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>initHRegion</h4>
-<pre>protected&nbsp;org.apache.hadoop.hbase.regionserver.HRegion&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4852">initHRegion</a>(org.apache.hadoop.hbase.TableName&nbsp;tableName,
+<pre>protected&nbsp;org.apache.hadoop.hbase.regionserver.HRegion&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4862">initHRegion</a>(org.apache.hadoop.hbase.TableName&nbsp;tableName,
                                                                    <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;callingMethod,
                                                                    org.apache.hadoop.conf.Configuration&nbsp;conf,
                                                                    boolean&nbsp;isReadOnly,
@@ -2864,7 +2864,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>initHRegion</h4>
-<pre>protected&nbsp;org.apache.hadoop.hbase.regionserver.HRegion&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4857">initHRegion</a>(org.apache.hadoop.hbase.TableName&nbsp;tableName,
+<pre>protected&nbsp;org.apache.hadoop.hbase.regionserver.HRegion&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4867">initHRegion</a>(org.apache.hadoop.hbase.TableName&nbsp;tableName,
                                                                    byte[]&nbsp;startKey,
                                                                    byte[]&nbsp;stopKey,
                                                                    <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;callingMethod,
@@ -2884,7 +2884,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>initHRegion</h4>
-<pre>public&nbsp;org.apache.hadoop.hbase.regionserver.HRegion&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4872">initHRegion</a>(org.apache.hadoop.hbase.TableName&nbsp;tableName,
+<pre>public&nbsp;org.apache.hadoop.hbase.regionserver.HRegion&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4882">initHRegion</a>(org.apache.hadoop.hbase.TableName&nbsp;tableName,
                                                                 byte[]&nbsp;startKey,
                                                                 byte[]&nbsp;stopKey,
                                                                 boolean&nbsp;isReadOnly,
@@ -2907,7 +2907,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>checkOneCell</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4882">checkOneCell</a>(org.apache.hadoop.hbase.Cell&nbsp;kv,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4892">checkOneCell</a>(org.apache.hadoop.hbase.Cell&nbsp;kv,
                           byte[]&nbsp;cf,
                           int&nbsp;rowIdx,
                           int&nbsp;colIdx,
@@ -2922,7 +2922,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testReverseScanner_FromMemStore_SingleCF_Normal</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4896">testReverseScanner_FromMemStore_SingleCF_Normal</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4906">testReverseScanner_FromMemStore_SingleCF_Normal</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>
@@ -2936,7 +2936,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testReverseScanner_FromMemStore_SingleCF_LargerKey</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4949">testReverseScanner_FromMemStore_SingleCF_LargerKey</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.4959">testReverseScanner_FromMemStore_SingleCF_LargerKey</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>
@@ -2950,7 +2950,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testReverseScanner_FromMemStore_SingleCF_FullScan</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.5003">testReverseScanner_FromMemStore_SingleCF_FullScan</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.5013">testReverseScanner_FromMemStore_SingleCF_FullScan</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>
@@ -2964,7 +2964,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testReverseScanner_moreRowsMayExistAfter</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.5054">testReverseScanner_moreRowsMayExistAfter</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.5064">testReverseScanner_moreRowsMayExistAfter</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>
@@ -2978,7 +2978,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testReverseScanner_smaller_blocksize</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.5130">testReverseScanner_smaller_blocksize</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.5140">testReverseScanner_smaller_blocksize</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>
@@ -2992,7 +2992,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testReverseScanner_FromMemStoreAndHFiles_MultiCFs1</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.5208">testReverseScanner_FromMemStoreAndHFiles_MultiCFs1</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.5218">testReverseScanner_FromMemStoreAndHFiles_MultiCFs1</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>
@@ -3006,7 +3006,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testReverseScanner_FromMemStoreAndHFiles_MultiCFs2</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.5371">testReverseScanner_FromMemStoreAndHFiles_MultiCFs2</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.5381">testReverseScanner_FromMemStoreAndHFiles_MultiCFs2</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>
@@ -3020,7 +3020,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testReverseScanner_StackOverflow</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.5446">testReverseScanner_StackOverflow</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.5456">testReverseScanner_StackOverflow</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">Test for HBASE-14497: Reverse Scan threw StackOverflow caused by readPt checking</div>
 <dl>
@@ -3035,7 +3035,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testReverseScanShouldNotScanMemstoreIfReadPtLesser</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.5495">testReverseScanShouldNotScanMemstoreIfReadPtLesser</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.5505">testReverseScanShouldNotScanMemstoreIfReadPtLesser</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>
@@ -3049,7 +3049,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testReverseScanWhenPutCellsAfterOpenReverseScan</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.5547">testReverseScanWhenPutCellsAfterOpenReverseScan</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.5557">testReverseScanWhenPutCellsAfterOpenReverseScan</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>
@@ -3063,7 +3063,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testWriteRequestsCounter</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.5587">testWriteRequestsCounter</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.5597">testWriteRequestsCounter</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>
@@ -3077,7 +3077,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testOpenRegionWrittenToWAL</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.5610">testOpenRegionWrittenToWAL</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.5620">testOpenRegionWrittenToWAL</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>
@@ -3091,7 +3091,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testFlushedFileWithNoTags</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.5687">testFlushedFileWithNoTags</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.5697">testFlushedFileWithNoTags</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>
@@ -3105,7 +3105,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>mockWAL</h4>
-<pre>private&nbsp;org.apache.hadoop.hbase.wal.WAL&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.5712">mockWAL</a>()
+<pre>private&nbsp;org.apache.hadoop.hbase.wal.WAL&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.5722">mockWAL</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">Utility method to setup a WAL mock.
  Needs to do the bit where we close latch on the WALKeyImpl on append else test hangs.</div>
@@ -3123,7 +3123,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testCloseRegionWrittenToWAL</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.5730">testCloseRegionWrittenToWAL</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.5740">testCloseRegionWrittenToWAL</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>
@@ -3137,7 +3137,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testRegionTooBusy</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.5796">testRegionTooBusy</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.5806">testRegionTooBusy</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">Test RegionTooBusyException thrown when region is busy</div>
 <dl>
@@ -3152,7 +3152,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testCellTTLs</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.5844">testCellTTLs</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.5854">testCellTTLs</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>
@@ -3166,7 +3166,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testIncrementTimestampsAreMonotonic</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.5966">testIncrementTimestampsAreMonotonic</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.5976">testIncrementTimestampsAreMonotonic</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>
@@ -3180,7 +3180,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testAppendTimestampsAreMonotonic</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.5991">testAppendTimestampsAreMonotonic</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.6001">testAppendTimestampsAreMonotonic</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>
@@ -3194,7 +3194,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testCheckAndMutateTimestampsAreMonotonic</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.6022">testCheckAndMutateTimestampsAreMonotonic</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.6032">testCheckAndMutateTimestampsAreMonotonic</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>
@@ -3208,7 +3208,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testBatchMutateWithWrongRegionException</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.6052">testBatchMutateWithWrongRegionException</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.6062">testBatchMutateWithWrongRegionException</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>
@@ -3222,7 +3222,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testCheckAndRowMutateTimestampsAreMonotonic</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.6141">testCheckAndRowMutateTimestampsAreMonotonic</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.6151">testCheckAndRowMutateTimestampsAreMonotonic</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>
@@ -3236,7 +3236,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>initHRegion</h4>
-<pre>org.apache.hadoop.hbase.regionserver.HRegion&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.6175">initHRegion</a>(org.apache.hadoop.hbase.TableName&nbsp;tableName,
+<pre>org.apache.hadoop.hbase.regionserver.HRegion&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.6185">initHRegion</a>(org.apache.hadoop.hbase.TableName&nbsp;tableName,
                                                          <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;callingMethod,
                                                          byte[]...&nbsp;families)
                                                   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>
@@ -3252,7 +3252,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testWritesWhileRollWriter</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.6186">testWritesWhileRollWriter</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.6196">testWritesWhileRollWriter</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">HBASE-16429 Make sure no stuck if roll writer when ring buffer is filled with appends</div>
 <dl>
@@ -3267,7 +3267,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testMutateRow_WriteRequestCount</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.6251">testMutateRow_WriteRequestCount</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.6261">testMutateRow_WriteRequestCount</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>
@@ -3281,7 +3281,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testBulkLoadReplicationEnabled</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.6270">testBulkLoadReplicationEnabled</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.6280">testBulkLoadReplicationEnabled</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>
@@ -3295,7 +3295,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>testOpenRegionFailedMemoryLeak</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.6292">testOpenRegionFailedMemoryLeak</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html#line.6302">testOpenRegionFailedMemoryLeak</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>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegionServerBulkLoad.MyObserver.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegionServerBulkLoad.MyObserver.html
index aaef86c..9cd4fed 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegionServerBulkLoad.MyObserver.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestHRegionServerBulkLoad.MyObserver.html
@@ -243,7 +243,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.RegionObserver</h3>
-<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALRestore</code></li>
+<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALAppend, preWALRestore</code></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestRegionServerAbort.StopBlockingRegionObserver.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestRegionServerAbort.StopBlockingRegionObserver.html
index dd2db20..e68d38a 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestRegionServerAbort.StopBlockingRegionObserver.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestRegionServerAbort.StopBlockingRegionObserver.html
@@ -264,7 +264,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.RegionObserver</h3>
-<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALRestore</code></li>
+<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALAppend, preWALRestore</code></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestRegionServerAbortTimeout.SleepWhenCloseCoprocessor.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestRegionServerAbortTimeout.SleepWhenCloseCoprocessor.html
index f8663ac..d96a3a0 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestRegionServerAbortTimeout.SleepWhenCloseCoprocessor.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestRegionServerAbortTimeout.SleepWhenCloseCoprocessor.html
@@ -228,7 +228,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.RegionObserver</h3>
-<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALRestore</code></li>
+<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALAppend, preWALRestore</code></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestRegionServerReadRequestMetrics.ScanRegionCoprocessor.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestRegionServerReadRequestMetrics.ScanRegionCoprocessor.html
index ea2f13b..fd73b13 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestRegionServerReadRequestMetrics.ScanRegionCoprocessor.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestRegionServerReadRequestMetrics.ScanRegionCoprocessor.html
@@ -231,7 +231,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.RegionObserver</h3>
-<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALRestore</code></li>
+<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALAppend, preWALRestore</code></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestScannerRetriableFailure.FaultyScannerObserver.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestScannerRetriableFailure.FaultyScannerObserver.html
index f37964c..3fb08c5 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestScannerRetriableFailure.FaultyScannerObserver.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestScannerRetriableFailure.FaultyScannerObserver.html
@@ -242,7 +242,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.RegionObserver</h3>
-<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALRestore</code></li>
+<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALAppend, preWALRestore</code></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestScannerWithCorruptHFile.CorruptHFileCoprocessor.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestScannerWithCorruptHFile.CorruptHFileCoprocessor.html
index c8b2fec..c021aa4 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestScannerWithCorruptHFile.CorruptHFileCoprocessor.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestScannerWithCorruptHFile.CorruptHFileCoprocessor.html
@@ -231,7 +231,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.RegionObserver</h3>
-<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALRestore</code></li>
+<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALAppend, preWALRestore</code></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestSettingTimeoutOnBlockingPoint.SleepCoprocessor.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestSettingTimeoutOnBlockingPoint.SleepCoprocessor.html
index b204b2d..cdb42e2 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestSettingTimeoutOnBlockingPoint.SleepCoprocessor.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestSettingTimeoutOnBlockingPoint.SleepCoprocessor.html
@@ -239,7 +239,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.RegionObserver</h3>
-<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALRestore</code></li>
+<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALAppend, preWALRestore</code></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestTags.TestCoprocessorForTags.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestTags.TestCoprocessorForTags.html
index e4fa919..37b5bc4 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestTags.TestCoprocessorForTags.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestTags.TestCoprocessorForTags.html
@@ -267,7 +267,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.RegionObserver</h3>
-<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALRestore</code></li>
+<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALAppend, preWALRestore</code></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
index 2ee4f6a..0f9aa29 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
@@ -709,11 +709,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/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/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/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/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/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/TestMultiLogThreshold.ActionType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestMultiLogThreshold.ActionType</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/replication/TestMasterReplication.CoprocessorCounter.html b/testdevapidocs/org/apache/hadoop/hbase/replication/TestMasterReplication.CoprocessorCounter.html
index 365ec8d..2b1e737 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/replication/TestMasterReplication.CoprocessorCounter.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/replication/TestMasterReplication.CoprocessorCounter.html
@@ -260,7 +260,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.RegionObserver</h3>
-<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALRestore</code></li>
+<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALAppend, preWALRestore</code></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationWithTags.TestCoprocessorForTagsAtSink.html b/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationWithTags.TestCoprocessorForTagsAtSink.html
index 6f7eff6..fbf7415 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationWithTags.TestCoprocessorForTagsAtSink.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationWithTags.TestCoprocessorForTagsAtSink.html
@@ -240,7 +240,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.RegionObserver</h3>
-<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALRestore</code></li>
+<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALAppend, preWALRestore</code></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationWithTags.TestCoprocessorForTagsAtSource.html b/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationWithTags.TestCoprocessorForTagsAtSource.html
index 221bb50..0a2db8e 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationWithTags.TestCoprocessorForTagsAtSource.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/replication/TestReplicationWithTags.TestCoprocessorForTagsAtSource.html
@@ -230,7 +230,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.RegionObserver</h3>
-<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALRestore</code></li>
+<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALAppend, preWALRestore</code></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/security/access/TestAccessController2.MyAccessController.html b/testdevapidocs/org/apache/hadoop/hbase/security/access/TestAccessController2.MyAccessController.html
index 64316a0..64fbfe7 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/security/access/TestAccessController2.MyAccessController.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/security/access/TestAccessController2.MyAccessController.html
@@ -210,7 +210,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.RegionObserver</h3>
-<code>postAppend, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postExists, postFlush, postFlush, postGetOp, postIncrement, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postReplayWALs, postScannerNext, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preCommitStoreFile, preCompactScannerOpen, preCompactSelection, preFlush, preFlushScannerOpen, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, prePrepareTimeStampForDeleteVersion, preReplayWALs, preStoreFileReaderOpen, preStoreScannerOpen, preWALRestore</code></li>
+<code>postAppend, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postExists, postFlush, postFlush, postGetOp, postIncrement, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postReplayWALs, postScannerNext, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preCommitStoreFile, preCompactScannerOpen, preCompactSelection, preFlush, preFlushScannerOpen, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, prePrepareTimeStampForDeleteVersion, preReplayWALs, preStoreFileReaderOpen, preStoreScannerOpen, preWALAppend, preWALRestore</code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.org.apache.hadoop.hbase.coprocessor.RegionServerObserver">
diff --git a/testdevapidocs/org/apache/hadoop/hbase/security/access/TestAccessController3.FaultyAccessController.html b/testdevapidocs/org/apache/hadoop/hbase/security/access/TestAccessController3.FaultyAccessController.html
index 54b31a3..ff24c07 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/security/access/TestAccessController3.FaultyAccessController.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/security/access/TestAccessController3.FaultyAccessController.html
@@ -227,7 +227,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.RegionObserver</h3>
-<code>postAppend, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postExists, postFlush, postFlush, postGetOp, postIncrement, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postReplayWALs, postScannerNext, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preCommitStoreFile, preCompactScannerOpen, preCompactSelection, preFlush, preFlushScannerOpen, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, prePrepareTimeStampForDeleteVersion, preReplayWALs, preStoreFileReaderOpen, preStoreScannerOpen, preWALRestore</code></li>
+<code>postAppend, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postExists, postFlush, postFlush, postGetOp, postIncrement, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postReplayWALs, postScannerNext, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preCommitStoreFile, preCompactScannerOpen, preCompactSelection, preFlush, preFlushScannerOpen, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, prePrepareTimeStampForDeleteVersion, preReplayWALs, preStoreFileReaderOpen, preStoreScannerOpen, preWALAppend, preWALRestore</code></li>
 </ul>
 <ul class="blockList">
 <li class="blockList"><a name="methods.inherited.from.class.org.apache.hadoop.hbase.coprocessor.RegionServerObserver">
diff --git a/testdevapidocs/org/apache/hadoop/hbase/security/access/TestCoprocessorWhitelistMasterObserver.TestRegionObserver.html b/testdevapidocs/org/apache/hadoop/hbase/security/access/TestCoprocessorWhitelistMasterObserver.TestRegionObserver.html
index 8b952b1..c12a9af 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/security/access/TestCoprocessorWhitelistMasterObserver.TestRegionObserver.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/security/access/TestCoprocessorWhitelistMasterObserver.TestRegionObserver.html
@@ -223,7 +223,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.RegionObserver</h3>
-<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALRestore</code></li>
+<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALAppend, preWALRestore</code></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/security/visibility/TestVisibilityLabelsReplication.SimpleCP.html b/testdevapidocs/org/apache/hadoop/hbase/security/visibility/TestVisibilityLabelsReplication.SimpleCP.html
index 075c33c..f1253ea 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/security/visibility/TestVisibilityLabelsReplication.SimpleCP.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/security/visibility/TestVisibilityLabelsReplication.SimpleCP.html
@@ -230,7 +230,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.RegionObserver</h3>
-<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALRestore</code></li>
+<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALAppend, preWALRestore</code></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/security/visibility/TestVisibilityLabelsReplication.TestCoprocessorForTagsAtSink.html b/testdevapidocs/org/apache/hadoop/hbase/security/visibility/TestVisibilityLabelsReplication.TestCoprocessorForTagsAtSink.html
index 4aa0fdc..f307d02 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/security/visibility/TestVisibilityLabelsReplication.TestCoprocessorForTagsAtSink.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/security/visibility/TestVisibilityLabelsReplication.TestCoprocessorForTagsAtSink.html
@@ -240,7 +240,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.RegionObserver</h3>
-<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALRestore</code></li>
+<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preGetOp, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALAppend, preWALRestore</code></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/test/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/test/package-tree.html
index e60a80c..b22b911 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/test/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/test/package-tree.html
@@ -254,8 +254,8 @@
 <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.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/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.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/IntegrationTestLoadAndVerify.Counters.html" title="enum in org.apache.hadoop.hbase.test"><span class="typeNameLink">IntegrationTestLoadAndVerify.Counters</span></a></li>
 </ul>
 </li>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/thrift/ErrorThrowingGetObserver.html b/testdevapidocs/org/apache/hadoop/hbase/thrift/ErrorThrowingGetObserver.html
index 80dec86..f560b08 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/thrift/ErrorThrowingGetObserver.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/thrift/ErrorThrowingGetObserver.html
@@ -248,7 +248,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.RegionObserver</h3>
-<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALRestore</code></li>
+<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALAppend, preWALRestore</code></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/thrift2/TestThriftHBaseServiceHandler.DelayingRegionObserver.html b/testdevapidocs/org/apache/hadoop/hbase/thrift2/TestThriftHBaseServiceHandler.DelayingRegionObserver.html
index 86dc2af..8a5b9c2 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/thrift2/TestThriftHBaseServiceHandler.DelayingRegionObserver.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/thrift2/TestThriftHBaseServiceHandler.DelayingRegionObserver.html
@@ -248,7 +248,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.RegionObserver</h3>
-<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALRestore</code></li>
+<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompact, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlush, preFlushScannerOpen, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, prePut, preReplayWALs, preScannerClose, preScannerNext, preScannerOpen, preStoreFileReaderOpen, preStoreScannerOpen, preWALAppend, preWALRestore</code></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/util/TestCoprocessorScanPolicy.ScanObserver.html b/testdevapidocs/org/apache/hadoop/hbase/util/TestCoprocessorScanPolicy.ScanObserver.html
index afa6be4..e263974 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/util/TestCoprocessorScanPolicy.ScanObserver.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/util/TestCoprocessorScanPolicy.ScanObserver.html
@@ -277,7 +277,7 @@
 <!--   -->
 </a>
 <h3>Methods inherited from interface&nbsp;org.apache.hadoop.hbase.coprocessor.RegionObserver</h3>
-<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlushScannerOpen, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, preReplayWALs, preScannerClose, preScannerNext, preStoreFileReaderOpen, preStoreScannerOpen, preWALRestore</code></li>
+<code>postAppend, postAppendBeforeWAL, postBatchMutate, postBatchMutateIndispensably, postBulkLoadHFile, postCheckAndDelete, postCheckAndPut, postClose, postCloseRegionOperation, postCommitStoreFile, postCompact, postCompactSelection, postDelete, postExists, postFlush, postFlush, postGetOp, postIncrement, postIncrementBeforeWAL, postInstantiateDeleteTracker, postMemStoreCompaction, postMutationBeforeWAL, postOpen, postPut, postReplayWALs, postScannerClose, postScannerFilterRow, postScannerNext, postScannerOpen, postStartRegionOperation, postStoreFileReaderOpen, postWALRestore, preAppend, preAppendAfterRowLock, preBatchMutate, preBulkLoadHFile, preCheckAndDelete, preCheckAndDeleteAfterRowLock, preCheckAndPut, preCheckAndPutAfterRowLock, preClose, preCommitStoreFile, preCompactScannerOpen, preCompactSelection, preDelete, preExists, preFlush, preFlushScannerOpen, preIncrement, preIncrementAfterRowLock, preMemStoreCompaction, preMemStoreCompactionCompact, preMemStoreCompactionCompactScannerOpen, preOpen, prePrepareTimeStampForDeleteVersion, preReplayWALs, preScannerClose, preScannerNext, preStoreFileReaderOpen, preStoreScannerOpen, preWALAppend, preWALRestore</code></li>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/wal/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/wal/package-tree.html
index 2ad43aa..1c3d149 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/wal/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/wal/package-tree.html
@@ -163,8 +163,8 @@
 <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/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>
+<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>
 </ul>
 </li>
 </ul>
diff --git a/testdevapidocs/overview-tree.html b/testdevapidocs/overview-tree.html
index b50785f..8785cf9 100644
--- a/testdevapidocs/overview-tree.html
+++ b/testdevapidocs/overview-tree.html
@@ -3564,6 +3564,7 @@
 <li type="circle">org.apache.hadoop.hbase.coprocessor.<a href="org/apache/hadoop/hbase/coprocessor/TestRegionObserverForAddingMutationsFromCoprocessors.TestWALObserver.html" title="class in org.apache.hadoop.hbase.coprocessor"><span class="typeNameLink">TestRegionObserverForAddingMutationsFromCoprocessors.TestWALObserver</span></a> (implements org.apache.hadoop.hbase.coprocessor.WALCoprocessor, org.apache.hadoop.hbase.coprocessor.WALObserver)</li>
 <li type="circle">org.apache.hadoop.hbase.coprocessor.<a href="org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html" title="class in org.apache.hadoop.hbase.coprocessor"><span class="typeNameLink">TestRegionObserverInterface</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.coprocessor.<a href="org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.EvenOnlyCompactor.html" title="class in org.apache.hadoop.hbase.coprocessor"><span class="typeNameLink">TestRegionObserverInterface.EvenOnlyCompactor</span></a> (implements org.apache.hadoop.hbase.coprocessor.RegionCoprocessor, org.apache.hadoop.hbase.coprocessor.RegionObserver)</li>
+<li type="circle">org.apache.hadoop.hbase.coprocessor.<a href="org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.PreWALAppendWALActionsListener.html" title="class in org.apache.hadoop.hbase.coprocessor"><span class="typeNameLink">TestRegionObserverInterface.PreWALAppendWALActionsListener</span></a> (implements org.apache.hadoop.hbase.regionserver.wal.WALActionsListener)</li>
 <li type="circle">org.apache.hadoop.hbase.coprocessor.<a href="org/apache/hadoop/hbase/coprocessor/TestRegionObserverPreFlushAndPreCompact.html" title="class in org.apache.hadoop.hbase.coprocessor"><span class="typeNameLink">TestRegionObserverPreFlushAndPreCompact</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.coprocessor.<a href="org/apache/hadoop/hbase/coprocessor/TestRegionObserverPreFlushAndPreCompact.TestRegionObserver.html" title="class in org.apache.hadoop.hbase.coprocessor"><span class="typeNameLink">TestRegionObserverPreFlushAndPreCompact.TestRegionObserver</span></a> (implements org.apache.hadoop.hbase.coprocessor.RegionCoprocessor, org.apache.hadoop.hbase.coprocessor.RegionObserver)</li>
 <li type="circle">org.apache.hadoop.hbase.coprocessor.<a href="org/apache/hadoop/hbase/coprocessor/TestRegionObserverScannerOpenHook.html" title="class in org.apache.hadoop.hbase.coprocessor"><span class="typeNameLink">TestRegionObserverScannerOpenHook</span></a></li>
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html
index cf2439d..0eec2ab 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/coprocessor/SimpleRegionObserver.html
@@ -33,849 +33,867 @@
 <span class="sourceLineNo">025</span>import static org.junit.Assert.assertTrue;<a name="line.25"></a>
 <span class="sourceLineNo">026</span><a name="line.26"></a>
 <span class="sourceLineNo">027</span>import java.io.IOException;<a name="line.27"></a>
-<span class="sourceLineNo">028</span>import java.util.List;<a name="line.28"></a>
-<span class="sourceLineNo">029</span>import java.util.Map;<a name="line.29"></a>
-<span class="sourceLineNo">030</span>import java.util.Optional;<a name="line.30"></a>
-<span class="sourceLineNo">031</span>import java.util.concurrent.atomic.AtomicBoolean;<a name="line.31"></a>
-<span class="sourceLineNo">032</span>import java.util.concurrent.atomic.AtomicInteger;<a name="line.32"></a>
-<span class="sourceLineNo">033</span><a name="line.33"></a>
-<span class="sourceLineNo">034</span>import org.apache.hadoop.fs.FileSystem;<a name="line.34"></a>
-<span class="sourceLineNo">035</span>import org.apache.hadoop.fs.Path;<a name="line.35"></a>
-<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.Cell;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.CellUtil;<a name="line.37"></a>
-<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.CompareOperator;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.CoprocessorEnvironment;<a name="line.39"></a>
-<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.client.Append;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.client.Get;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.client.Mutation;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.client.Put;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.client.Result;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.filter.ByteArrayComparable;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.io.FSDataInputStreamWrapper;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.io.Reference;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.io.hfile.CacheConfig;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.regionserver.InternalScanner;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress;<a name="line.56"></a>
-<span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.regionserver.Region.Operation;<a name="line.57"></a>
-<span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.regionserver.RegionScanner;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.regionserver.ScanType;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.regionserver.Store;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.regionserver.StoreFile;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.regionserver.StoreFileReader;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.66"></a>
-<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.wal.WALEdit;<a name="line.67"></a>
-<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.wal.WALKey;<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> * A sample region observer that tests the RegionObserver interface.<a name="line.71"></a>
-<span class="sourceLineNo">072</span> * It works with TestRegionObserverInterface to provide the test case.<a name="line.72"></a>
-<span class="sourceLineNo">073</span> */<a name="line.73"></a>
-<span class="sourceLineNo">074</span>public class SimpleRegionObserver implements RegionCoprocessor, RegionObserver {<a name="line.74"></a>
-<span class="sourceLineNo">075</span><a name="line.75"></a>
-<span class="sourceLineNo">076</span>  final AtomicInteger ctBeforeDelete = new AtomicInteger(1);<a name="line.76"></a>
-<span class="sourceLineNo">077</span>  final AtomicInteger ctPreOpen = new AtomicInteger(0);<a name="line.77"></a>
-<span class="sourceLineNo">078</span>  final AtomicInteger ctPostOpen = new AtomicInteger(0);<a name="line.78"></a>
-<span class="sourceLineNo">079</span>  final AtomicInteger ctPreClose = new AtomicInteger(0);<a name="line.79"></a>
-<span class="sourceLineNo">080</span>  final AtomicInteger ctPostClose = new AtomicInteger(0);<a name="line.80"></a>
-<span class="sourceLineNo">081</span>  final AtomicInteger ctPreFlush = new AtomicInteger(0);<a name="line.81"></a>
-<span class="sourceLineNo">082</span>  final AtomicInteger ctPostFlush = new AtomicInteger(0);<a name="line.82"></a>
-<span class="sourceLineNo">083</span>  final AtomicInteger ctPreCompactSelect = new AtomicInteger(0);<a name="line.83"></a>
-<span class="sourceLineNo">084</span>  final AtomicInteger ctPostCompactSelect = new AtomicInteger(0);<a name="line.84"></a>
-<span class="sourceLineNo">085</span>  final AtomicInteger ctPreCompact = new AtomicInteger(0);<a name="line.85"></a>
-<span class="sourceLineNo">086</span>  final AtomicInteger ctPostCompact = new AtomicInteger(0);<a name="line.86"></a>
-<span class="sourceLineNo">087</span>  final AtomicInteger ctPreGet = new AtomicInteger(0);<a name="line.87"></a>
-<span class="sourceLineNo">088</span>  final AtomicInteger ctPostGet = new AtomicInteger(0);<a name="line.88"></a>
-<span class="sourceLineNo">089</span>  final AtomicInteger ctPrePut = new AtomicInteger(0);<a name="line.89"></a>
-<span class="sourceLineNo">090</span>  final AtomicInteger ctPostPut = new AtomicInteger(0);<a name="line.90"></a>
-<span class="sourceLineNo">091</span>  final AtomicInteger ctPreDeleted = new AtomicInteger(0);<a name="line.91"></a>
-<span class="sourceLineNo">092</span>  final AtomicInteger ctPrePrepareDeleteTS = new AtomicInteger(0);<a name="line.92"></a>
-<span class="sourceLineNo">093</span>  final AtomicInteger ctPostDeleted = new AtomicInteger(0);<a name="line.93"></a>
-<span class="sourceLineNo">094</span>  final AtomicInteger ctPreIncrement = new AtomicInteger(0);<a name="line.94"></a>
-<span class="sourceLineNo">095</span>  final AtomicInteger ctPreIncrementAfterRowLock = new AtomicInteger(0);<a name="line.95"></a>
-<span class="sourceLineNo">096</span>  final AtomicInteger ctPreAppend = new AtomicInteger(0);<a name="line.96"></a>
-<span class="sourceLineNo">097</span>  final AtomicInteger ctPreAppendAfterRowLock = new AtomicInteger(0);<a name="line.97"></a>
-<span class="sourceLineNo">098</span>  final AtomicInteger ctPostIncrement = new AtomicInteger(0);<a name="line.98"></a>
-<span class="sourceLineNo">099</span>  final AtomicInteger ctPostAppend = new AtomicInteger(0);<a name="line.99"></a>
-<span class="sourceLineNo">100</span>  final AtomicInteger ctPreCheckAndPut = new AtomicInteger(0);<a name="line.100"></a>
-<span class="sourceLineNo">101</span>  final AtomicInteger ctPreCheckAndPutAfterRowLock = new AtomicInteger(0);<a name="line.101"></a>
-<span class="sourceLineNo">102</span>  final AtomicInteger ctPostCheckAndPut = new AtomicInteger(0);<a name="line.102"></a>
-<span class="sourceLineNo">103</span>  final AtomicInteger ctPreCheckAndDelete = new AtomicInteger(0);<a name="line.103"></a>
-<span class="sourceLineNo">104</span>  final AtomicInteger ctPreCheckAndDeleteAfterRowLock = new AtomicInteger(0);<a name="line.104"></a>
-<span class="sourceLineNo">105</span>  final AtomicInteger ctPostCheckAndDelete = new AtomicInteger(0);<a name="line.105"></a>
-<span class="sourceLineNo">106</span>  final AtomicInteger ctPreScannerNext = new AtomicInteger(0);<a name="line.106"></a>
-<span class="sourceLineNo">107</span>  final AtomicInteger ctPostScannerNext = new AtomicInteger(0);<a name="line.107"></a>
-<span class="sourceLineNo">108</span>  final AtomicInteger ctPostScannerFilterRow = new AtomicInteger(0);<a name="line.108"></a>
-<span class="sourceLineNo">109</span>  final AtomicInteger ctPreScannerClose = new AtomicInteger(0);<a name="line.109"></a>
-<span class="sourceLineNo">110</span>  final AtomicInteger ctPostScannerClose = new AtomicInteger(0);<a name="line.110"></a>
-<span class="sourceLineNo">111</span>  final AtomicInteger ctPreScannerOpen = new AtomicInteger(0);<a name="line.111"></a>
-<span class="sourceLineNo">112</span>  final AtomicInteger ctPostScannerOpen = new AtomicInteger(0);<a name="line.112"></a>
-<span class="sourceLineNo">113</span>  final AtomicInteger ctPreBulkLoadHFile = new AtomicInteger(0);<a name="line.113"></a>
-<span class="sourceLineNo">114</span>  final AtomicInteger ctPostBulkLoadHFile = new AtomicInteger(0);<a name="line.114"></a>
-<span class="sourceLineNo">115</span>  final AtomicInteger ctPreBatchMutate = new AtomicInteger(0);<a name="line.115"></a>
-<span class="sourceLineNo">116</span>  final AtomicInteger ctPostBatchMutate = new AtomicInteger(0);<a name="line.116"></a>
-<span class="sourceLineNo">117</span>  final AtomicInteger ctPreReplayWALs = new AtomicInteger(0);<a name="line.117"></a>
-<span class="sourceLineNo">118</span>  final AtomicInteger ctPostReplayWALs = new AtomicInteger(0);<a name="line.118"></a>
-<span class="sourceLineNo">119</span>  final AtomicInteger ctPreWALRestore = new AtomicInteger(0);<a name="line.119"></a>
-<span class="sourceLineNo">120</span>  final AtomicInteger ctPostWALRestore = new AtomicInteger(0);<a name="line.120"></a>
-<span class="sourceLineNo">121</span>  final AtomicInteger ctPreStoreFileReaderOpen = new AtomicInteger(0);<a name="line.121"></a>
-<span class="sourceLineNo">122</span>  final AtomicInteger ctPostStoreFileReaderOpen = new AtomicInteger(0);<a name="line.122"></a>
-<span class="sourceLineNo">123</span>  final AtomicInteger ctPostBatchMutateIndispensably = new AtomicInteger(0);<a name="line.123"></a>
-<span class="sourceLineNo">124</span>  final AtomicInteger ctPostStartRegionOperation = new AtomicInteger(0);<a name="line.124"></a>
-<span class="sourceLineNo">125</span>  final AtomicInteger ctPostCloseRegionOperation = new AtomicInteger(0);<a name="line.125"></a>
-<span class="sourceLineNo">126</span>  final AtomicBoolean throwOnPostFlush = new AtomicBoolean(false);<a name="line.126"></a>
-<span class="sourceLineNo">127</span>  static final String TABLE_SKIPPED = "SKIPPED_BY_PREWALRESTORE";<a name="line.127"></a>
-<span class="sourceLineNo">128</span><a name="line.128"></a>
-<span class="sourceLineNo">129</span>  public void setThrowOnPostFlush(Boolean val){<a name="line.129"></a>
-<span class="sourceLineNo">130</span>    throwOnPostFlush.set(val);<a name="line.130"></a>
-<span class="sourceLineNo">131</span>  }<a name="line.131"></a>
-<span class="sourceLineNo">132</span><a name="line.132"></a>
-<span class="sourceLineNo">133</span>  @Override<a name="line.133"></a>
-<span class="sourceLineNo">134</span>  public Optional&lt;RegionObserver&gt; getRegionObserver() {<a name="line.134"></a>
-<span class="sourceLineNo">135</span>    return Optional.of(this);<a name="line.135"></a>
+<span class="sourceLineNo">028</span>import java.util.HashMap;<a name="line.28"></a>
+<span class="sourceLineNo">029</span>import java.util.List;<a name="line.29"></a>
+<span class="sourceLineNo">030</span>import java.util.Map;<a name="line.30"></a>
+<span class="sourceLineNo">031</span>import java.util.Optional;<a name="line.31"></a>
+<span class="sourceLineNo">032</span>import java.util.concurrent.atomic.AtomicBoolean;<a name="line.32"></a>
+<span class="sourceLineNo">033</span>import java.util.concurrent.atomic.AtomicInteger;<a name="line.33"></a>
+<span class="sourceLineNo">034</span><a name="line.34"></a>
+<span class="sourceLineNo">035</span>import org.apache.hadoop.fs.FileSystem;<a name="line.35"></a>
+<span class="sourceLineNo">036</span>import org.apache.hadoop.fs.Path;<a name="line.36"></a>
+<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.Cell;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.CellUtil;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.CompareOperator;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.CoprocessorEnvironment;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.client.Append;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.client.Get;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.client.Mutation;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.client.Put;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.client.Result;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.filter.ByteArrayComparable;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.io.FSDataInputStreamWrapper;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.io.Reference;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.io.hfile.CacheConfig;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.regionserver.InternalScanner;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.regionserver.MiniBatchOperationInProgress;<a name="line.57"></a>
+<span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.regionserver.Region.Operation;<a name="line.58"></a>
+<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.regionserver.RegionScanner;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.regionserver.ScanType;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.regionserver.Store;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.regionserver.StoreFile;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.regionserver.StoreFileReader;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.wal.WALEdit;<a name="line.68"></a>
+<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.wal.WALKey;<a name="line.69"></a>
+<span class="sourceLineNo">070</span><a name="line.70"></a>
+<span class="sourceLineNo">071</span>/**<a name="line.71"></a>
+<span class="sourceLineNo">072</span> * A sample region observer that tests the RegionObserver interface.<a name="line.72"></a>
+<span class="sourceLineNo">073</span> * It works with TestRegionObserverInterface to provide the test case.<a name="line.73"></a>
+<span class="sourceLineNo">074</span> */<a name="line.74"></a>
+<span class="sourceLineNo">075</span>public class SimpleRegionObserver implements RegionCoprocessor, RegionObserver {<a name="line.75"></a>
+<span class="sourceLineNo">076</span><a name="line.76"></a>
+<span class="sourceLineNo">077</span>  final AtomicInteger ctBeforeDelete = new AtomicInteger(1);<a name="line.77"></a>
+<span class="sourceLineNo">078</span>  final AtomicInteger ctPreOpen = new AtomicInteger(0);<a name="line.78"></a>
+<span class="sourceLineNo">079</span>  final AtomicInteger ctPostOpen = new AtomicInteger(0);<a name="line.79"></a>
+<span class="sourceLineNo">080</span>  final AtomicInteger ctPreClose = new AtomicInteger(0);<a name="line.80"></a>
+<span class="sourceLineNo">081</span>  final AtomicInteger ctPostClose = new AtomicInteger(0);<a name="line.81"></a>
+<span class="sourceLineNo">082</span>  final AtomicInteger ctPreFlush = new AtomicInteger(0);<a name="line.82"></a>
+<span class="sourceLineNo">083</span>  final AtomicInteger ctPostFlush = new AtomicInteger(0);<a name="line.83"></a>
+<span class="sourceLineNo">084</span>  final AtomicInteger ctPreCompactSelect = new AtomicInteger(0);<a name="line.84"></a>
+<span class="sourceLineNo">085</span>  final AtomicInteger ctPostCompactSelect = new AtomicInteger(0);<a name="line.85"></a>
+<span class="sourceLineNo">086</span>  final AtomicInteger ctPreCompact = new AtomicInteger(0);<a name="line.86"></a>
+<span class="sourceLineNo">087</span>  final AtomicInteger ctPostCompact = new AtomicInteger(0);<a name="line.87"></a>
+<span class="sourceLineNo">088</span>  final AtomicInteger ctPreGet = new AtomicInteger(0);<a name="line.88"></a>
+<span class="sourceLineNo">089</span>  final AtomicInteger ctPostGet = new AtomicInteger(0);<a name="line.89"></a>
+<span class="sourceLineNo">090</span>  final AtomicInteger ctPrePut = new AtomicInteger(0);<a name="line.90"></a>
+<span class="sourceLineNo">091</span>  final AtomicInteger ctPostPut = new AtomicInteger(0);<a name="line.91"></a>
+<span class="sourceLineNo">092</span>  final AtomicInteger ctPreDeleted = new AtomicInteger(0);<a name="line.92"></a>
+<span class="sourceLineNo">093</span>  final AtomicInteger ctPrePrepareDeleteTS = new AtomicInteger(0);<a name="line.93"></a>
+<span class="sourceLineNo">094</span>  final AtomicInteger ctPostDeleted = new AtomicInteger(0);<a name="line.94"></a>
+<span class="sourceLineNo">095</span>  final AtomicInteger ctPreIncrement = new AtomicInteger(0);<a name="line.95"></a>
+<span class="sourceLineNo">096</span>  final AtomicInteger ctPreIncrementAfterRowLock = new AtomicInteger(0);<a name="line.96"></a>
+<span class="sourceLineNo">097</span>  final AtomicInteger ctPreAppend = new AtomicInteger(0);<a name="line.97"></a>
+<span class="sourceLineNo">098</span>  final AtomicInteger ctPreAppendAfterRowLock = new AtomicInteger(0);<a name="line.98"></a>
+<span class="sourceLineNo">099</span>  final AtomicInteger ctPostIncrement = new AtomicInteger(0);<a name="line.99"></a>
+<span class="sourceLineNo">100</span>  final AtomicInteger ctPostAppend = new AtomicInteger(0);<a name="line.100"></a>
+<span class="sourceLineNo">101</span>  final AtomicInteger ctPreCheckAndPut = new AtomicInteger(0);<a name="line.101"></a>
+<span class="sourceLineNo">102</span>  final AtomicInteger ctPreCheckAndPutAfterRowLock = new AtomicInteger(0);<a name="line.102"></a>
+<span class="sourceLineNo">103</span>  final AtomicInteger ctPostCheckAndPut = new AtomicInteger(0);<a name="line.103"></a>
+<span class="sourceLineNo">104</span>  final AtomicInteger ctPreCheckAndDelete = new AtomicInteger(0);<a name="line.104"></a>
+<span class="sourceLineNo">105</span>  final AtomicInteger ctPreCheckAndDeleteAfterRowLock = new AtomicInteger(0);<a name="line.105"></a>
+<span class="sourceLineNo">106</span>  final AtomicInteger ctPostCheckAndDelete = new AtomicInteger(0);<a name="line.106"></a>
+<span class="sourceLineNo">107</span>  final AtomicInteger ctPreScannerNext = new AtomicInteger(0);<a name="line.107"></a>
+<span class="sourceLineNo">108</span>  final AtomicInteger ctPostScannerNext = new AtomicInteger(0);<a name="line.108"></a>
+<span class="sourceLineNo">109</span>  final AtomicInteger ctPostScannerFilterRow = new AtomicInteger(0);<a name="line.109"></a>
+<span class="sourceLineNo">110</span>  final AtomicInteger ctPreScannerClose = new AtomicInteger(0);<a name="line.110"></a>
+<span class="sourceLineNo">111</span>  final AtomicInteger ctPostScannerClose = new AtomicInteger(0);<a name="line.111"></a>
+<span class="sourceLineNo">112</span>  final AtomicInteger ctPreScannerOpen = new AtomicInteger(0);<a name="line.112"></a>
+<span class="sourceLineNo">113</span>  final AtomicInteger ctPostScannerOpen = new AtomicInteger(0);<a name="line.113"></a>
+<span class="sourceLineNo">114</span>  final AtomicInteger ctPreBulkLoadHFile = new AtomicInteger(0);<a name="line.114"></a>
+<span class="sourceLineNo">115</span>  final AtomicInteger ctPostBulkLoadHFile = new AtomicInteger(0);<a name="line.115"></a>
+<span class="sourceLineNo">116</span>  final AtomicInteger ctPreBatchMutate = new AtomicInteger(0);<a name="line.116"></a>
+<span class="sourceLineNo">117</span>  final AtomicInteger ctPostBatchMutate = new AtomicInteger(0);<a name="line.117"></a>
+<span class="sourceLineNo">118</span>  final AtomicInteger ctPreReplayWALs = new AtomicInteger(0);<a name="line.118"></a>
+<span class="sourceLineNo">119</span>  final AtomicInteger ctPostReplayWALs = new AtomicInteger(0);<a name="line.119"></a>
+<span class="sourceLineNo">120</span>  final AtomicInteger ctPreWALRestore = new AtomicInteger(0);<a name="line.120"></a>
+<span class="sourceLineNo">121</span>  final AtomicInteger ctPostWALRestore = new AtomicInteger(0);<a name="line.121"></a>
+<span class="sourceLineNo">122</span>  final AtomicInteger ctPreStoreFileReaderOpen = new AtomicInteger(0);<a name="line.122"></a>
+<span class="sourceLineNo">123</span>  final AtomicInteger ctPostStoreFileReaderOpen = new AtomicInteger(0);<a name="line.123"></a>
+<span class="sourceLineNo">124</span>  final AtomicInteger ctPostBatchMutateIndispensably = new AtomicInteger(0);<a name="line.124"></a>
+<span class="sourceLineNo">125</span>  final AtomicInteger ctPostStartRegionOperation = new AtomicInteger(0);<a name="line.125"></a>
+<span class="sourceLineNo">126</span>  final AtomicInteger ctPostCloseRegionOperation = new AtomicInteger(0);<a name="line.126"></a>
+<span class="sourceLineNo">127</span>  final AtomicBoolean throwOnPostFlush = new AtomicBoolean(false);<a name="line.127"></a>
+<span class="sourceLineNo">128</span>  final AtomicInteger ctPreWALAppend = new AtomicInteger(0);<a name="line.128"></a>
+<span class="sourceLineNo">129</span><a name="line.129"></a>
+<span class="sourceLineNo">130</span>  static final String TABLE_SKIPPED = "SKIPPED_BY_PREWALRESTORE";<a name="line.130"></a>
+<span class="sourceLineNo">131</span>  Map&lt;String, byte[]&gt; extendedAttributes = new HashMap&lt;String,byte[]&gt;();<a name="line.131"></a>
+<span class="sourceLineNo">132</span>  static final byte[] WAL_EXTENDED_ATTRIBUTE_BYTES = Bytes.toBytes("foo");<a name="line.132"></a>
+<span class="sourceLineNo">133</span><a name="line.133"></a>
+<span class="sourceLineNo">134</span>  public void setThrowOnPostFlush(Boolean val){<a name="line.134"></a>
+<span class="sourceLineNo">135</span>    throwOnPostFlush.set(val);<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>  @Override<a name="line.138"></a>
-<span class="sourceLineNo">139</span>  public void start(CoprocessorEnvironment e) throws IOException {<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>  @Override<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  public void preOpen(ObserverContext&lt;RegionCoprocessorEnvironment&gt; c) {<a name="line.143"></a>
-<span class="sourceLineNo">144</span>    ctPreOpen.incrementAndGet();<a name="line.144"></a>
+<span class="sourceLineNo">139</span>  public Optional&lt;RegionObserver&gt; getRegionObserver() {<a name="line.139"></a>
+<span class="sourceLineNo">140</span>    return Optional.of(this);<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>  @Override<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  public void start(CoprocessorEnvironment e) throws IOException {<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>  @Override<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  public void postOpen(ObserverContext&lt;RegionCoprocessorEnvironment&gt; c) {<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    ctPostOpen.incrementAndGet();<a name="line.149"></a>
+<span class="sourceLineNo">148</span>  public void preOpen(ObserverContext&lt;RegionCoprocessorEnvironment&gt; c) {<a name="line.148"></a>
+<span class="sourceLineNo">149</span>    ctPreOpen.incrementAndGet();<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>  public boolean wasOpened() {<a name="line.152"></a>
-<span class="sourceLineNo">153</span>    return ctPreOpen.get() &gt; 0 &amp;&amp; ctPostOpen.get() &gt; 0;<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  }<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 preClose(ObserverContext&lt;RegionCoprocessorEnvironment&gt; c, boolean abortRequested) {<a name="line.157"></a>
-<span class="sourceLineNo">158</span>    ctPreClose.incrementAndGet();<a name="line.158"></a>
+<span class="sourceLineNo">152</span>  @Override<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  public void postOpen(ObserverContext&lt;RegionCoprocessorEnvironment&gt; c) {<a name="line.153"></a>
+<span class="sourceLineNo">154</span>    ctPostOpen.incrementAndGet();<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>  public boolean wasOpened() {<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    return ctPreOpen.get() &gt; 0 &amp;&amp; ctPostOpen.get() &gt; 0;<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>  @Override<a name="line.161"></a>
-<span class="sourceLineNo">162</span>  public void postClose(ObserverContext&lt;RegionCoprocessorEnvironment&gt; c, boolean abortRequested) {<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    ctPostClose.incrementAndGet();<a name="line.163"></a>
+<span class="sourceLineNo">162</span>  public void preClose(ObserverContext&lt;RegionCoprocessorEnvironment&gt; c, boolean abortRequested) {<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    ctPreClose.incrementAndGet();<a name="line.163"></a>
 <span class="sourceLineNo">164</span>  }<a name="line.164"></a>
 <span class="sourceLineNo">165</span><a name="line.165"></a>
-<span class="sourceLineNo">166</span>  public boolean wasClosed() {<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    return ctPreClose.get() &gt; 0 &amp;&amp; ctPostClose.get() &gt; 0;<a name="line.167"></a>
-<span class="sourceLineNo">168</span>  }<a name="line.168"></a>
-<span class="sourceLineNo">169</span><a name="line.169"></a>
-<span class="sourceLineNo">170</span>  @Override<a name="line.170"></a>
-<span class="sourceLineNo">171</span>  public InternalScanner preFlush(ObserverContext&lt;RegionCoprocessorEnvironment&gt; c,<a name="line.171"></a>
-<span class="sourceLineNo">172</span>      Store store, InternalScanner scanner, FlushLifeCycleTracker tracker) throws IOException {<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    ctPreFlush.incrementAndGet();<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    return scanner;<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 postFlush(ObserverContext&lt;RegionCoprocessorEnvironment&gt; c,<a name="line.178"></a>
-<span class="sourceLineNo">179</span>      Store store, StoreFile resultFile, FlushLifeCycleTracker tracker) throws IOException {<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    ctPostFlush.incrementAndGet();<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    if (throwOnPostFlush.get()){<a name="line.181"></a>
-<span class="sourceLineNo">182</span>      throw new IOException("throwOnPostFlush is true in postFlush");<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><a name="line.185"></a>
-<span class="sourceLineNo">186</span>  public boolean wasFlushed() {<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    return ctPreFlush.get() &gt; 0 &amp;&amp; ctPostFlush.get() &gt; 0;<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>  @Override<a name="line.190"></a>
-<span class="sourceLineNo">191</span>  public void preCompactSelection(ObserverContext&lt;RegionCoprocessorEnvironment&gt; c, Store store,<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      List&lt;? extends StoreFile&gt; candidates, CompactionLifeCycleTracker tracker) throws IOException {<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    ctPreCompactSelect.incrementAndGet();<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>  public void postCompactSelection(ObserverContext&lt;RegionCoprocessorEnvironment&gt; c, Store store,<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      List&lt;? extends StoreFile&gt; selected, CompactionLifeCycleTracker tracker,<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      CompactionRequest request) {<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    ctPostCompactSelect.incrementAndGet();<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>  public InternalScanner preCompact(ObserverContext&lt;RegionCoprocessorEnvironment&gt; c, Store store,<a name="line.204"></a>
-<span class="sourceLineNo">205</span>      InternalScanner scanner, ScanType scanType, CompactionLifeCycleTracker tracker,<a name="line.205"></a>
-<span class="sourceLineNo">206</span>      CompactionRequest request) throws IOException {<a name="line.206"></a>
-<span class="sourceLineNo">207</span>    ctPreCompact.incrementAndGet();<a name="line.207"></a>
-<span class="sourceLineNo">208</span>    return scanner;<a name="line.208"></a>
-<span class="sourceLineNo">209</span>  }<a name="line.209"></a>
-<span class="sourceLineNo">210</span><a name="line.210"></a>
-<span class="sourceLineNo">211</span>  @Override<a name="line.211"></a>
-<span class="sourceLineNo">212</span>  public void postCompact(ObserverContext&lt;RegionCoprocessorEnvironment&gt; c, Store store,<a name="line.212"></a>
-<span class="sourceLineNo">213</span>      StoreFile resultFile, CompactionLifeCycleTracker tracker,<a name="line.213"></a>
-<span class="sourceLineNo">214</span>      CompactionRequest request) throws IOException {<a name="line.214"></a>
-<span class="sourceLineNo">215</span>    ctPostCompact.incrementAndGet();<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>  public boolean wasCompacted() {<a name="line.218"></a>
-<span class="sourceLineNo">219</span>    return ctPreCompact.get() &gt; 0 &amp;&amp; ctPostCompact.get() &gt; 0;<a name="line.219"></a>
-<span class="sourceLineNo">220</span>  }<a name="line.220"></a>
-<span class="sourceLineNo">221</span><a name="line.221"></a>
-<span class="sourceLineNo">222</span>  @Override<a name="line.222"></a>
-<span class="sourceLineNo">223</span>  public void preScannerOpen(final ObserverContext&lt;RegionCoprocessorEnvironment&gt; c, final Scan scan)<a name="line.223"></a>
-<span class="sourceLineNo">224</span>      throws IOException {<a name="line.224"></a>
-<span class="sourceLineNo">225</span>    ctPreScannerOpen.incrementAndGet();<a name="line.225"></a>
-<span class="sourceLineNo">226</span>  }<a name="line.226"></a>
-<span class="sourceLineNo">227</span><a name="line.227"></a>
-<span class="sourceLineNo">228</span>  @Override<a name="line.228"></a>
-<span class="sourceLineNo">229</span>  public RegionScanner postScannerOpen(final ObserverContext&lt;RegionCoprocessorEnvironment&gt; c,<a name="line.229"></a>
-<span class="sourceLineNo">230</span>      final Scan scan, final RegionScanner s)<a name="line.230"></a>
-<span class="sourceLineNo">231</span>      throws IOException {<a name="line.231"></a>
-<span class="sourceLineNo">232</span>    ctPostScannerOpen.incrementAndGet();<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    return s;<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>  @Override<a name="line.236"></a>
-<span class="sourceLineNo">237</span>  public boolean preScannerNext(final ObserverContext&lt;RegionCoprocessorEnvironment&gt; c,<a name="line.237"></a>
-<span class="sourceLineNo">238</span>      final InternalScanner s, final List&lt;Result&gt; results,<a name="line.238"></a>
-<span class="sourceLineNo">239</span>      final int limit, final boolean hasMore) throws IOException {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    ctPreScannerNext.incrementAndGet();<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    return hasMore;<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>  @Override<a name="line.244"></a>
-<span class="sourceLineNo">245</span>  public boolean postScannerNext(final ObserverContext&lt;RegionCoprocessorEnvironment&gt; c,<a name="line.245"></a>
-<span class="sourceLineNo">246</span>      final InternalScanner s, final List&lt;Result&gt; results, final int limit,<a name="line.246"></a>
-<span class="sourceLineNo">247</span>      final boolean hasMore) throws IOException {<a name="line.247"></a>
-<span class="sourceLineNo">248</span>    ctPostScannerNext.incrementAndGet();<a name="line.248"></a>
-<span class="sourceLineNo">249</span>    return hasMore;<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>  @Override<a name="line.252"></a>
-<span class="sourceLineNo">253</span>  public boolean postScannerFilterRow(final ObserverContext&lt;RegionCoprocessorEnvironment&gt; e,<a name="line.253"></a>
-<span class="sourceLineNo">254</span>      final InternalScanner s, final Cell currentRow, final boolean hasMore) throws IOException {<a name="line.254"></a>
-<span class="sourceLineNo">255</span>    ctPostScannerFilterRow.incrementAndGet();<a name="line.255"></a>
-<span class="sourceLineNo">256</span>    return hasMore;<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>  @Override<a name="line.259"></a>
-<span class="sourceLineNo">260</span>  public void preScannerClose(final ObserverContext&lt;RegionCoprocessorEnvironment&gt; c,<a name="line.260"></a>
-<span class="sourceLineNo">261</span>      final InternalScanner s) throws IOException {<a name="line.261"></a>
-<span class="sourceLineNo">262</span>    ctPreScannerClose.incrementAndGet();<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 void postScannerClose(final ObserverContext&lt;RegionCoprocessorEnvironment&gt; c,<a name="line.266"></a>
-<span class="sourceLineNo">267</span>      final InternalScanner s) throws IOException {<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    ctPostScannerClose.incrementAndGet();<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>  @Override<a name="line.271"></a>
-<span class="sourceLineNo">272</span>  public void preGetOp(final ObserverContext&lt;RegionCoprocessorEnvironment&gt; c, final Get get,<a name="line.272"></a>
-<span class="sourceLineNo">273</span>      final List&lt;Cell&gt; results) throws IOException {<a name="line.273"></a>
-<span class="sourceLineNo">274</span>    RegionCoprocessorEnvironment e = c.getEnvironment();<a name="line.274"></a>
-<span class="sourceLineNo">275</span>    assertNotNull(e);<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    assertNotNull(e.getRegion());<a name="line.276"></a>
-<span class="sourceLineNo">277</span>    assertNotNull(get);<a name="line.277"></a>
-<span class="sourceLineNo">278</span>    assertNotNull(results);<a name="line.278"></a>
-<span class="sourceLineNo">279</span>    ctPreGet.incrementAndGet();<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>  @Override<a name="line.282"></a>
-<span class="sourceLineNo">283</span>  public void postGetOp(final ObserverContext&lt;RegionCoprocessorEnvironment&gt; c, final Get get,<a name="line.283"></a>
-<span class="sourceLineNo">284</span>      final List&lt;Cell&gt; results) {<a name="line.284"></a>
-<span class="sourceLineNo">285</span>    RegionCoprocessorEnvironment e = c.getEnvironment();<a name="line.285"></a>
-<span class="sourceLineNo">286</span>    assertNotNull(e);<a name="line.286"></a>
-<span class="sourceLineNo">287</span>    assertNotNull(e.getRegion());<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    assertNotNull(get);<a name="line.288"></a>
-<span class="sourceLineNo">289</span>    assertNotNull(results);<a name="line.289"></a>
-<span class="sourceLineNo">290</span>    if (e.getRegion().getTableDescriptor().getTableName().equals(<a name="line.290"></a>
-<span class="sourceLineNo">291</span>        TestRegionObserverInterface.TEST_TABLE)) {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>      boolean foundA = false;<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      boolean foundB = false;<a name="line.293"></a>
-<span class="sourceLineNo">294</span>      boolean foundC = false;<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      for (Cell kv: results) {<a name="line.295"></a>
-<span class="sourceLineNo">296</span>        if (CellUtil.matchingFamily(kv, TestRegionObserverInterface.A)) {<a name="line.296"></a>
-<span class="sourceLineNo">297</span>          foundA = true;<a name="line.297"></a>
-<span class="sourceLineNo">298</span>        }<a name="line.298"></a>
-<span class="sourceLineNo">299</span>        if (CellUtil.matchingFamily(kv, TestRegionObserverInterface.B)) {<a name="line.299"></a>
-<span class="sourceLineNo">300</span>          foundB = true;<a name="line.300"></a>
-<span class="sourceLineNo">301</span>        }<a name="line.301"></a>
-<span class="sourceLineNo">302</span>        if (CellUtil.matchingFamily(kv, TestRegionObserverInterface.C)) {<a name="line.302"></a>
-<span class="sourceLineNo">303</span>          foundC = true;<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>      assertTrue(foundA);<a name="line.306"></a>
-<span class="sourceLineNo">307</span>      assertTrue(foundB);<a name="line.307"></a>
-<span class="sourceLineNo">308</span>      assertTrue(foundC);<a name="line.308"></a>
-<span class="sourceLineNo">309</span>    }<a name="line.309"></a>
-<span class="sourceLineNo">310</span>    ctPostGet.incrementAndGet();<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>  @Override<a name="line.313"></a>
-<span class="sourceLineNo">314</span>  public void prePut(final ObserverContext&lt;RegionCoprocessorEnvironment&gt; c,<a name="line.314"></a>
-<span class="sourceLineNo">315</span>      final Put put, final WALEdit edit,<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      final Durability durability) throws IOException {<a name="line.316"></a>
-<span class="sourceLineNo">317</span>    Map&lt;byte[], List&lt;Cell&gt;&gt; familyMap  = put.getFamilyCellMap();<a name="line.317"></a>
-<span class="sourceLineNo">318</span>    RegionCoprocessorEnvironment e = c.getEnvironment();<a name="line.318"></a>
-<span class="sourceLineNo">319</span>    assertNotNull(e);<a name="line.319"></a>
-<span class="sourceLineNo">320</span>    assertNotNull(e.getRegion());<a name="line.320"></a>
-<span class="sourceLineNo">321</span>    assertNotNull(familyMap);<a name="line.321"></a>
-<span class="sourceLineNo">322</span>    if (e.getRegion().getTableDescriptor().getTableName().equals(<a name="line.322"></a>
-<span class="sourceLineNo">323</span>        TestRegionObserverInterface.TEST_TABLE)) {<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      List&lt;Cell&gt; cells = familyMap.get(TestRegionObserverInterface.A);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      assertNotNull(cells);<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      assertNotNull(cells.get(0));<a name="line.326"></a>
-<span class="sourceLineNo">327</span>      Cell cell = cells.get(0);<a name="line.327"></a>
-<span class="sourceLineNo">328</span>      assertTrue(Bytes.equals(cell.getQualifierArray(), cell.getQualifierOffset(),<a name="line.328"></a>
-<span class="sourceLineNo">329</span>        cell.getQualifierLength(), TestRegionObserverInterface.A, 0,<a name="line.329"></a>
-<span class="sourceLineNo">330</span>        TestRegionObserverInterface.A.length));<a name="line.330"></a>
-<span class="sourceLineNo">331</span>      cells = familyMap.get(TestRegionObserverInterface.B);<a name="line.331"></a>
-<span class="sourceLineNo">332</span>      assertNotNull(cells);<a name="line.332"></a>
-<span class="sourceLineNo">333</span>      assertNotNull(cells.get(0));<a name="line.333"></a>
-<span class="sourceLineNo">334</span>      cell = cells.get(0);<a name="line.334"></a>
-<span class="sourceLineNo">335</span>      assertTrue(Bytes.equals(cell.getQualifierArray(), cell.getQualifierOffset(),<a name="line.335"></a>
-<span class="sourceLineNo">336</span>        cell.getQualifierLength(), TestRegionObserverInterface.B, 0,<a name="line.336"></a>
-<span class="sourceLineNo">337</span>        TestRegionObserverInterface.B.length));<a name="line.337"></a>
-<span class="sourceLineNo">338</span>      cells = familyMap.get(TestRegionObserverInterface.C);<a name="line.338"></a>
-<span class="sourceLineNo">339</span>      assertNotNull(cells);<a name="line.339"></a>
-<span class="sourceLineNo">340</span>      assertNotNull(cells.get(0));<a name="line.340"></a>
-<span class="sourceLineNo">341</span>      cell = cells.get(0);<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      assertTrue(Bytes.equals(cell.getQualifierArray(), cell.getQualifierOffset(),<a name="line.342"></a>
-<span class="sourceLineNo">343</span>        cell.getQualifierLength(), TestRegionObserverInterface.C, 0,<a name="line.343"></a>
-<span class="sourceLineNo">344</span>        TestRegionObserverInterface.C.length));<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    }<a name="line.345"></a>
-<span class="sourceLineNo">346</span>    ctPrePut.incrementAndGet();<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>  @Override<a name="line.349"></a>
-<span class="sourceLineNo">350</span>  public void postPut(final ObserverContext&lt;RegionCoprocessorEnvironment&gt; c,<a name="line.350"></a>
-<span class="sourceLineNo">351</span>      final Put put, final WALEdit edit,<a name="line.351"></a>
-<span class="sourceLineNo">352</span>      final Durability durability) throws IOException {<a name="line.352"></a>
-<span class="sourceLineNo">353</span>    Map&lt;byte[], List&lt;Cell&gt;&gt; familyMap  = put.getFamilyCellMap();<a name="line.353"></a>
-<span class="sourceLineNo">354</span>    RegionCoprocessorEnvironment e = c.getEnvironment();<a name="line.354"></a>
-<span class="sourceLineNo">355</span>    assertNotNull(e);<a name="line.355"></a>
-<span class="sourceLineNo">356</span>    assertNotNull(e.getRegion());<a name="line.356"></a>
-<span class="sourceLineNo">357</span>    assertNotNull(familyMap);<a name="line.357"></a>
-<span class="sourceLineNo">358</span>    List&lt;Cell&gt; cells = familyMap.get(TestRegionObserverInterface.A);<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    if (e.getRegion().getTableDescriptor().getTableName().equals(<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        TestRegionObserverInterface.TEST_TABLE)) {<a name="line.360"></a>
-<span class="sourceLineNo">361</span>      assertNotNull(cells);<a name="line.361"></a>
-<span class="sourceLineNo">362</span>      assertNotNull(cells.get(0));<a name="line.362"></a>
-<span class="sourceLineNo">363</span>      // KeyValue v1 expectation.  Cast for now until we go all Cell all the time. TODO<a name="line.363"></a>
-<span class="sourceLineNo">364</span>      Cell cell = cells.get(0);<a name="line.364"></a>
-<span class="sourceLineNo">365</span>      assertTrue(Bytes.equals(cell.getQualifierArray(), cell.getQualifierOffset(),<a name="line.365"></a>
-<span class="sourceLineNo">366</span>        cell.getQualifierLength(), TestRegionObserverInterface.A, 0,<a name="line.366"></a>
-<span class="sourceLineNo">367</span>        TestRegionObserverInterface.A.length));<a name="line.367"></a>
-<span class="sourceLineNo">368</span>      cells = familyMap.get(TestRegionObserverInterface.B);<a name="line.368"></a>
-<span class="sourceLineNo">369</span>      assertNotNull(cells);<a name="line.369"></a>
-<span class="sourceLineNo">370</span>      assertNotNull(cells.get(0));<a name="line.370"></a>
-<span class="sourceLineNo">371</span>      // KeyValue v1 expectation.  Cast for now until we go all Cell all the time. TODO<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      cell = cells.get(0);<a name="line.372"></a>
-<span class="sourceLineNo">373</span>      assertTrue(Bytes.equals(cell.getQualifierArray(), cell.getQualifierOffset(),<a name="line.373"></a>
-<span class="sourceLineNo">374</span>        cell.getQualifierLength(), TestRegionObserverInterface.B, 0,<a name="line.374"></a>
-<span class="sourceLineNo">375</span>        TestRegionObserverInterface.B.length));<a name="line.375"></a>
-<span class="sourceLineNo">376</span>      cells = familyMap.get(TestRegionObserverInterface.C);<a name="line.376"></a>
-<span class="sourceLineNo">377</span>      assertNotNull(cells);<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      assertNotNull(cells.get(0));<a name="line.378"></a>
-<span class="sourceLineNo">379</span>      // KeyValue v1 expectation.  Cast for now until we go all Cell all the time. TODO<a name="line.379"></a>
-<span class="sourceLineNo">380</span>      cell = cells.get(0);<a name="line.380"></a>
-<span class="sourceLineNo">381</span>      assertTrue(Bytes.equals(cell.getQualifierArray(), cell.getQualifierOffset(),<a name="line.381"></a>
-<span class="sourceLineNo">382</span>        cell.getQualifierLength(), TestRegionObserverInterface.C, 0,<a name="line.382"></a>
-<span class="sourceLineNo">383</span>        TestRegionObserverInterface.C.length));<a name="line.383"></a>
-<span class="sourceLineNo">384</span>    }<a name="line.384"></a>
-<span class="sourceLineNo">385</span>    ctPostPut.incrementAndGet();<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>  @Override<a name="line.388"></a>
-<span class="sourceLineNo">389</span>  public void preDelete(final ObserverContext&lt;RegionCoprocessorEnvironment&gt; c,<a name="line.389"></a>
-<span class="sourceLineNo">390</span>      final Delete delete, final WALEdit edit,<a name="line.390"></a>
-<span class="sourceLineNo">391</span>      final Durability durability) throws IOException {<a name="line.391"></a>
-<span class="sourceLineNo">392</span>    Map&lt;byte[], List&lt;Cell&gt;&gt; familyMap  = delete.getFamilyCellMap();<a name="line.392"></a>
-<span class="sourceLineNo">393</span>    RegionCoprocessorEnvironment e = c.getEnvironment();<a name="line.393"></a>
-<span class="sourceLineNo">394</span>    assertNotNull(e);<a name="line.394"></a>
-<span class="sourceLineNo">395</span>    assertNotNull(e.getRegion());<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    assertNotNull(familyMap);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    if (ctBeforeDelete.get() &gt; 0) {<a name="line.397"></a>
-<span class="sourceLineNo">398</span>      ctPreDeleted.incrementAndGet();<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>  @Override<a name="line.402"></a>
-<span class="sourceLineNo">403</span>  public void prePrepareTimeStampForDeleteVersion(ObserverContext&lt;RegionCoprocessorEnvironment&gt; e,<a name="line.403"></a>
-<span class="sourceLineNo">404</span>      Mutation delete, Cell cell, byte[] byteNow, Get get) throws IOException {<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    ctPrePrepareDeleteTS.incrementAndGet();<a name="line.405"></a>
-<span class="sourceLineNo">406</span>  }<a name="line.406"></a>
-<span class="sourceLineNo">407</span><a name="line.407"></a>
-<span class="sourceLineNo">408</span>  @Override<a name="line.408"></a>
-<span class="sourceLineNo">409</span>  public void postDelete(final ObserverContext&lt;RegionCoprocessorEnvironment&gt; c,<a name="line.409"></a>
-<span class="sourceLineNo">410</span>      final Delete delete, final WALEdit edit,<a name="line.410"></a>
-<span class="sourceLineNo">411</span>      final Durability durability) throws IOException {<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    Map&lt;byte[], List&lt;Cell&gt;&gt; familyMap  = delete.getFamilyCellMap();<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    RegionCoprocessorEnvironment e = c.getEnvironment();<a name="line.413"></a>
-<span class="sourceLineNo">414</span>    assertNotNull(e);<a name="line.414"></a>
-<span class="sourceLineNo">415</span>    assertNotNull(e.getRegion());<a name="line.415"></a>
-<span class="sourceLineNo">416</span>    assertNotNull(familyMap);<a name="line.416"></a>
-<span class="sourceLineNo">417</span>    ctBeforeDelete.set(0);<a name="line.417"></a>
-<span class="sourceLineNo">418</span>    ctPostDeleted.incrementAndGet();<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 preBatchMutate(ObserverContext&lt;RegionCoprocessorEnvironment&gt; c,<a name="line.422"></a>
-<span class="sourceLineNo">423</span>      MiniBatchOperationInProgress&lt;Mutation&gt; miniBatchOp) throws IOException {<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    RegionCoprocessorEnvironment e = c.getEnvironment();<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    assertNotNull(e);<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    assertNotNull(e.getRegion());<a name="line.426"></a>
-<span class="sourceLineNo">427</span>    assertNotNull(miniBatchOp);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>    ctPreBatchMutate.incrementAndGet();<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>  @Override<a name="line.431"></a>
-<span class="sourceLineNo">432</span>  public void postBatchMutate(final ObserverContext&lt;RegionCoprocessorEnvironment&gt; c,<a name="line.432"></a>
-<span class="sourceLineNo">433</span>      final MiniBatchOperationInProgress&lt;Mutation&gt; miniBatchOp) throws IOException {<a name="line.433"></a>
-<span class="sourceLineNo">434</span>    RegionCoprocessorEnvironment e = c.getEnvironment();<a name="line.434"></a>
-<span class="sourceLineNo">435</span>    assertNotNull(e);<a name="line.435"></a>
-<span class="sourceLineNo">436</span>    assertNotNull(e.getRegion());<a name="line.436"></a>
-<span class="sourceLineNo">437</span>    assertNotNull(miniBatchOp);<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    ctPostBatchMutate.incrementAndGet();<a name="line.438"></a>
-<span class="sourceLineNo">439</span>  }<a name="line.439"></a>
-<span class="sourceLineNo">440</span><a name="line.440"></a>
-<span class="sourceLineNo">441</span>  @Override<a name="line.441"></a>
-<span class="sourceLineNo">442</span>  public void postStartRegionOperation(final ObserverContext&lt;RegionCoprocessorEnvironment&gt; ctx,<a name="line.442"></a>
-<span class="sourceLineNo">443</span>      Operation op) throws IOException {<a name="line.443"></a>
-<span class="sourceLineNo">444</span>    ctPostStartRegionOperation.incrementAndGet();<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>  @Override<a name="line.447"></a>
-<span class="sourceLineNo">448</span>  public void postCloseRegionOperation(final ObserverContext&lt;RegionCoprocessorEnvironment&gt; ctx,<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      Operation op) throws IOException {<a name="line.449"></a>
-<span class="sourceLineNo">450</span>    if (ctPostStartRegionOperation.get() &gt; 0) {<a name="line.450"></a>
-<span class="sourceLineNo">451</span>      ctPostCloseRegionOperation.incrementAndGet();<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><a name="line.454"></a>
-<span class="sourceLineNo">455</span>  @Override<a name="line.455"></a>
-<span class="sourceLineNo">456</span>  public void postBatchMutateIndispensably(final ObserverContext&lt;RegionCoprocessorEnvironment&gt; ctx,<a name="line.456"></a>
-<span class="sourceLineNo">457</span>      MiniBatchOperationInProgress&lt;Mutation&gt; miniBatchOp, final boolean success) throws IOException {<a name="line.457"></a>
-<span class="sourceLineNo">458</span>    ctPostBatchMutateIndispensably.incrementAndGet();<a name="line.458"></a>
-<span class="sourceLineNo">459</span>  }<a name="line.459"></a>
-<span class="sourceLineNo">460</span><a name="line.460"></a>
-<span class="sourceLineNo">461</span>  @Override<a name="line.461"></a>
-<span class="sourceLineNo">462</span>  public Result preIncrement(final ObserverContext&lt;RegionCoprocessorEnvironment&gt; c,<a name="line.462"></a>
-<span class="sourceLineNo">463</span>      final Increment increment) throws IOException {<a name="line.463"></a>
-<span class="sourceLineNo">464</span>    ctPreIncrement.incrementAndGet();<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    return null;<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 Result preIncrementAfterRowLock(ObserverContext&lt;RegionCoprocessorEnvironment&gt; e,<a name="line.469"></a>
-<span class="sourceLineNo">470</span>      Increment increment) throws IOException {<a name="line.470"></a>
-<span class="sourceLineNo">471</span>    ctPreIncrementAfterRowLock.incrementAndGet();<a name="line.471"></a>
-<span class="sourceLineNo">472</span>    return null;<a name="line.472"></a>
-<span class="sourceLineNo">473</span>  }<a name="line.473"></a>
-<span class="sourceLineNo">474</span><a name="line.474"></a>
-<span class="sourceLineNo">475</span>  @Override<a name="line.475"></a>
-<span class="sourceLineNo">476</span>  public Result postIncrement(final ObserverContext&lt;RegionCoprocessorEnvironment&gt; c,<a name="line.476"></a>
-<span class="sourceLineNo">477</span>      final Increment increment, final Result result) throws IOException {<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    ctPostIncrement.incrementAndGet();<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    return result;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>  }<a name="line.480"></a>
-<span class="sourceLineNo">481</span><a name="line.481"></a>
-<span class="sourceLineNo">482</span>  @Override<a name="line.482"></a>
-<span class="sourceLineNo">483</span>  public boolean preCheckAndPut(ObserverContext&lt;RegionCoprocessorEnvironment&gt; e, byte[] row,<a name="line.483"></a>
-<span class="sourceLineNo">484</span>                                byte[] family, byte[] qualifier, CompareOperator compareOp, ByteArrayComparable comparator,<a name="line.484"></a>
-<span class="sourceLineNo">485</span>                                Put put, boolean result) throws IOException {<a name="line.485"></a>
-<span class="sourceLineNo">486</span>    ctPreCheckAndPut.incrementAndGet();<a name="line.486"></a>
-<span class="sourceLineNo">487</span>    return true;<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>  @Override<a name="line.490"></a>
-<span class="sourceLineNo">491</span>  public boolean preCheckAndPutAfterRowLock(ObserverContext&lt;RegionCoprocessorEnvironment&gt; e,<a name="line.491"></a>
-<span class="sourceLineNo">492</span>      byte[] row, byte[] family, byte[] qualifier, CompareOperator compareOp,<a name="line.492"></a>
-<span class="sourceLineNo">493</span>      ByteArrayComparable comparator, Put put, boolean result) throws IOException {<a name="line.493"></a>
-<span class="sourceLineNo">494</span>    ctPreCheckAndPutAfterRowLock.incrementAndGet();<a name="line.494"></a>
-<span class="sourceLineNo">495</span>    return true;<a name="line.495"></a>
-<span class="sourceLineNo">496</span>  }<a name="line.496"></a>
-<span class="sourceLineNo">497</span><a name="line.497"></a>
-<span class="sourceLineNo">498</span>  @Override<a name="line.498"></a>
-<span class="sourceLineNo">499</span>  public boolean postCheckAndPut(ObserverContext&lt;RegionCoprocessorEnvironment&gt; e, byte[] row,<a name="line.499"></a>
-<span class="sourceLineNo">500</span>                                 byte[] family, byte[] qualifier, CompareOperator compareOp, ByteArrayComparable comparator,<a name="line.500"></a>
-<span class="sourceLineNo">501</span>                                 Put put, boolean result) throws IOException {<a name="line.501"></a>
-<span class="sourceLineNo">502</span>    ctPostCheckAndPut.incrementAndGet();<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    return true;<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>  @Override<a name="line.506"></a>
-<span class="sourceLineNo">507</span>  public boolean preCheckAndDelete(ObserverContext&lt;RegionCoprocessorEnvironment&gt; e, byte[] row,<a name="line.507"></a>
-<span class="sourceLineNo">508</span>                                   byte[] family, byte[] qualifier, CompareOperator compareOp, ByteArrayComparable comparator,<a name="line.508"></a>
-<span class="sourceLineNo">509</span>                                   Delete delete, boolean result) throws IOException {<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    ctPreCheckAndDelete.incrementAndGet();<a name="line.510"></a>
-<span class="sourceLineNo">511</span>    return true;<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>  @Override<a name="line.514"></a>
-<span class="sourceLineNo">515</span>  public boolean preCheckAndDeleteAfterRowLock(ObserverContext&lt;RegionCoprocessorEnvironment&gt; e,<a name="line.515"></a>
-<span class="sourceLineNo">516</span>      byte[] row, byte[] family, byte[] qualifier, CompareOperator compareOp,<a name="line.516"></a>
-<span class="sourceLineNo">517</span>      ByteArrayComparable comparator, Delete delete, boolean result) throws IOException {<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    ctPreCheckAndDeleteAfterRowLock.incrementAndGet();<a name="line.518"></a>
-<span class="sourceLineNo">519</span>    return true;<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>  @Override<a name="line.522"></a>
-<span class="sourceLineNo">523</span>  public boolean postCheckAndDelete(ObserverContext&lt;RegionCoprocessorEnvironment&gt; e, byte[] row,<a name="line.523"></a>
-<span class="sourceLineNo">524</span>                                    byte[] family, byte[] qualifier, CompareOperator compareOp, ByteArrayComparable comparator,<a name="line.524"></a>
-<span class="sourceLineNo">525</span>                                    Delete delete, boolean result) throws IOException {<a name="line.525"></a>
-<span class="sourceLineNo">526</span>    ctPostCheckAndDelete.incrementAndGet();<a name="line.526"></a>
-<span class="sourceLineNo">527</span>    return true;<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>  @Override<a name="line.530"></a>
-<span class="sourceLineNo">531</span>  public Result preAppendAfterRowLock(ObserverContext&lt;RegionCoprocessorEnvironment&gt; e,<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      Append append) throws IOException {<a name="line.532"></a>
-<span class="sourceLineNo">533</span>    ctPreAppendAfterRowLock.incrementAndGet();<a name="line.533"></a>
-<span class="sourceLineNo">534</span>    return null;<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>  @Override<a name="line.537"></a>
-<span class="sourceLineNo">538</span>  public Result preAppend(ObserverContext&lt;RegionCoprocessorEnvironment&gt; e, Append append)<a name="line.538"></a>
-<span class="sourceLineNo">539</span>      throws IOException {<a name="line.539"></a>
-<span class="sourceLineNo">540</span>    ctPreAppend.incrementAndGet();<a name="line.540"></a>
-<span class="sourceLineNo">541</span>    return null;<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>  @Override<a name="line.544"></a>
-<span class="sourceLineNo">545</span>  public Result postAppend(ObserverContext&lt;RegionCoprocessorEnvironment&gt; e, Append append,<a name="line.545"></a>
-<span class="sourceLineNo">546</span>      Result result) throws IOException {<a name="line.546"></a>
-<span class="sourceLineNo">547</span>    ctPostAppend.incrementAndGet();<a name="line.547"></a>
-<span class="sourceLineNo">548</span>    return null;<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>  @Override<a name="line.551"></a>
-<span class="sourceLineNo">552</span>  public void preBulkLoadHFile(ObserverContext&lt;RegionCoprocessorEnvironment&gt; ctx,<a name="line.552"></a>
-<span class="sourceLineNo">553</span>                               List&lt;Pair&lt;byte[], String&gt;&gt; familyPaths) throws IOException {<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    RegionCoprocessorEnvironment e = ctx.getEnvironment();<a name="line.554"></a>
-<span class="sourceLineNo">555</span>    assertNotNull(e);<a name="line.555"></a>
-<span class="sourceLineNo">556</span>    assertNotNull(e.getRegion());<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    if (e.getRegion().getTableDescriptor().getTableName().equals(<a name="line.557"></a>
-<span class="sourceLineNo">558</span>        TestRegionObserverInterface.TEST_TABLE)) {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>      assertNotNull(familyPaths);<a name="line.559"></a>
-<span class="sourceLineNo">560</span>      assertEquals(1,familyPaths.size());<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      assertArrayEquals(TestRegionObserverInterface.A, familyPaths.get(0).getFirst());<a name="line.561"></a>
-<span class="sourceLineNo">562</span>      String familyPath = familyPaths.get(0).getSecond();<a name="line.562"></a>
-<span class="sourceLineNo">563</span>      String familyName = Bytes.toString(TestRegionObserverInterface.A);<a name="line.563"></a>
-<span class="sourceLineNo">564</span>      assertEquals(familyPath.substring(familyPath.length()-familyName.length()-1),"/"+familyName);<a name="line.564"></a>
-<span class="sourceLineNo">565</span>    }<a name="line.565"></a>
-<span class="sourceLineNo">566</span>    ctPreBulkLoadHFile.incrementAndGet();<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>  @Override<a name="line.569"></a>
-<span class="sourceLineNo">570</span>  public void postBulkLoadHFile(ObserverContext&lt;RegionCoprocessorEnvironment&gt; ctx,<a name="line.570"></a>
-<span class="sourceLineNo">571</span>      List&lt;Pair&lt;byte[], String&gt;&gt; familyPaths, Map&lt;byte[], List&lt;Path&gt;&gt; map)<a name="line.571"></a>
-<span class="sourceLineNo">572</span>          throws IOException {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>    RegionCoprocessorEnvironment e = ctx.getEnvironment();<a name="line.573"></a>
-<span class="sourceLineNo">574</span>    assertNotNull(e);<a name="line.574"></a>
-<span class="sourceLineNo">575</span>    assertNotNull(e.getRegion());<a name="line.575"></a>
-<span class="sourceLineNo">576</span>    if (e.getRegion().getTableDescriptor().getTableName().equals(<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        TestRegionObserverInterface.TEST_TABLE)) {<a name="line.577"></a>
-<span class="sourceLineNo">578</span>      assertNotNull(familyPaths);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>      assertEquals(1,familyPaths.size());<a name="line.579"></a>
-<span class="sourceLineNo">580</span>      assertArrayEquals(TestRegionObserverInterface.A, familyPaths.get(0).getFirst());<a name="line.580"></a>
-<span class="sourceLineNo">581</span>      String familyPath = familyPaths.get(0).getSecond();<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      String familyName = Bytes.toString(TestRegionObserverInterface.A);<a name="line.582"></a>
-<span class="sourceLineNo">583</span>      assertEquals(familyPath.substring(familyPath.length()-familyName.length()-1),"/"+familyName);<a name="line.583"></a>
-<span class="sourceLineNo">584</span>    }<a name="line.584"></a>
-<span class="sourceLineNo">585</span>    ctPostBulkLoadHFile.incrementAndGet();<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>  @Override<a name="line.588"></a>
-<span class="sourceLineNo">589</span>  public void preReplayWALs(ObserverContext&lt;? extends RegionCoprocessorEnvironment&gt; env,<a name="line.589"></a>
-<span class="sourceLineNo">590</span>      RegionInfo info, Path edits) throws IOException {<a name="line.590"></a>
-<span class="sourceLineNo">591</span>    ctPreReplayWALs.incrementAndGet();<a name="line.591"></a>
-<span class="sourceLineNo">592</span>  }<a name="line.592"></a>
-<span class="sourceLineNo">593</span><a name="line.593"></a>
-<span class="sourceLineNo">594</span>  @Override<a name="line.594"></a>
-<span class="sourceLineNo">595</span>  public void postReplayWALs(ObserverContext&lt;? extends RegionCoprocessorEnvironment&gt; env,<a name="line.595"></a>
-<span class="sourceLineNo">596</span>      RegionInfo info, Path edits) throws IOException {<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    ctPostReplayWALs.incrementAndGet();<a name="line.597"></a>
-<span class="sourceLineNo">598</span>  }<a name="line.598"></a>
-<span class="sourceLineNo">599</span><a name="line.599"></a>
-<span class="sourceLineNo">600</span>  @Override<a name="line.600"></a>
-<span class="sourceLineNo">601</span>  public void preWALRestore(ObserverContext&lt;? extends RegionCoprocessorEnvironment&gt; env,<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      RegionInfo info, WALKey logKey, WALEdit logEdit) throws IOException {<a name="line.602"></a>
-<span class="sourceLineNo">603</span>    String tableName = logKey.getTableName().getNameAsString();<a name="line.603"></a>
-<span class="sourceLineNo">604</span>    if (tableName.equals(TABLE_SKIPPED)) {<a name="line.604"></a>
-<span class="sourceLineNo">605</span>      // skip recovery of TABLE_SKIPPED for testing purpose<a name="line.605"></a>
-<span class="sourceLineNo">606</span>      env.bypass();<a name="line.606"></a>
-<span class="sourceLineNo">607</span>      return;<a name="line.607"></a>
-<span class="sourceLineNo">608</span>    }<a name="line.608"></a>
-<span class="sourceLineNo">609</span>    ctPreWALRestore.incrementAndGet();<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>  @Override<a name="line.612"></a>
-<span class="sourceLineNo">613</span>  public void postWALRestore(ObserverContext&lt;? extends RegionCoprocessorEnvironment&gt; env,<a name="line.613"></a>
-<span class="sourceLineNo">614</span>                             RegionInfo info, WALKey logKey, WALEdit logEdit) throws IOException {<a name="line.614"></a>
-<span class="sourceLineNo">615</span>    ctPostWALRestore.incrementAndGet();<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>  @Override<a name="line.618"></a>
-<span class="sourceLineNo">619</span>  public StoreFileReader preStoreFileReaderOpen(ObserverContext&lt;RegionCoprocessorEnvironment&gt; ctx,<a name="line.619"></a>
-<span class="sourceLineNo">620</span>      FileSystem fs, Path p, FSDataInputStreamWrapper in, long size, CacheConfig cacheConf,<a name="line.620"></a>
-<span class="sourceLineNo">621</span>      Reference r, StoreFileReader reader) throws IOException {<a name="line.621"></a>
-<span class="sourceLineNo">622</span>    ctPreStoreFileReaderOpen.incrementAndGet();<a name="line.622"></a>
-<span class="sourceLineNo">623</span>    return null;<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>  @Override<a name="line.626"></a>
-<span class="sourceLineNo">627</span>  public StoreFileReader postStoreFileReaderOpen(ObserverContext&lt;RegionCoprocessorEnvironment&gt; ctx,<a name="line.627"></a>
-<span class="sourceLineNo">628</span>      FileSystem fs, Path p, FSDataInputStreamWrapper in, long size, CacheConfig cacheConf,<a name="line.628"></a>
-<span class="sourceLineNo">629</span>      Reference r, StoreFileReader reader) throws IOException {<a name="line.629"></a>
-<span class="sourceLineNo">630</span>    ctPostStoreFileReaderOpen.incrementAndGet();<a name="line.630"></a>
-<span class="sourceLineNo">631</span>    return reader;<a name="line.631"></a>
-<span class="sourceLineNo">632</span>  }<a name="line.632"></a>
-<span class="sourceLineNo">633</span><a name="line.633"></a>
-<span class="sourceLineNo">634</span>  public boolean hadPreGet() {<a name="line.634"></a>
-<span class="sourceLineNo">635</span>    return ctPreGet.get() &gt; 0;<a name="line.635"></a>
-<span class="sourceLineNo">636</span>  }<a name="line.636"></a>
-<span class="sourceLineNo">637</span><a name="line.637"></a>
-<span class="sourceLineNo">638</span>  public boolean hadPostGet() {<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    return ctPostGet.get() &gt; 0;<a name="line.639"></a>
-<span class="sourceLineNo">640</span>  }<a name="line.640"></a>
-<span class="sourceLineNo">641</span><a name="line.641"></a>
-<span class="sourceLineNo">642</span>  public boolean hadPrePut() {<a name="line.642"></a>
-<span class="sourceLineNo">643</span>    return ctPrePut.get() &gt; 0;<a name="line.643"></a>
-<span class="sourceLineNo">644</span>  }<a name="line.644"></a>
-<span class="sourceLineNo">645</span><a name="line.645"></a>
-<span class="sourceLineNo">646</span>  public boolean hadPostPut() {<a name="line.646"></a>
-<span class="sourceLineNo">647</span>    return ctPostPut.get() &gt; 0;<a name="line.647"></a>
-<span class="sourceLineNo">648</span>  }<a name="line.648"></a>
-<span class="sourceLineNo">649</span><a name="line.649"></a>
-<span class="sourceLineNo">650</span>  public boolean hadPreBatchMutate() {<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    return ctPreBatchMutate.get() &gt; 0;<a name="line.651"></a>
-<span class="sourceLineNo">652</span>  }<a name="line.652"></a>
-<span class="sourceLineNo">653</span><a name="line.653"></a>
-<span class="sourceLineNo">654</span>  public boolean hadPostBatchMutate() {<a name="line.654"></a>
-<span class="sourceLineNo">655</span>    return ctPostBatchMutate.get() &gt; 0;<a name="line.655"></a>
-<span class="sourceLineNo">656</span>  }<a name="line.656"></a>
-<span class="sourceLineNo">657</span><a name="line.657"></a>
-<span class="sourceLineNo">658</span>  public boolean hadPostBatchMutateIndispensably() {<a name="line.658"></a>
-<span class="sourceLineNo">659</span>    return ctPostBatchMutateIndispensably.get() &gt; 0;<a name="line.659"></a>
-<span class="sourceLineNo">660</span>  }<a name="line.660"></a>
-<span class="sourceLineNo">661</span><a name="line.661"></a>
-<span class="sourceLineNo">662</span>  public boolean hadPostStartRegionOperation() {<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    return ctPostStartRegionOperation.get() &gt; 0;<a name="line.663"></a>
-<span class="sourceLineNo">664</span>  }<a name="line.664"></a>
-<span class="sourceLineNo">665</span><a name="line.665"></a>
-<span class="sourceLineNo">666</span>  public boolean hadPostCloseRegionOperation() {<a name="line.666"></a>
-<span class="sourceLineNo">667</span>    return ctPostCloseRegionOperation.get() &gt; 0;<a name="line.667"></a>
-<span class="sourceLineNo">668</span>  }<a name="line.668"></a>
-<span class="sourceLineNo">669</span><a name="line.669"></a>
-<span class="sourceLineNo">670</span>  public boolean hadDelete() {<a name="line.670"></a>
-<span class="sourceLineNo">671</span>    return !(ctBeforeDelete.get() &gt; 0);<a name="line.671"></a>
-<span class="sourceLineNo">672</span>  }<a name="line.672"></a>
-<span class="sourceLineNo">673</span><a name="line.673"></a>
-<span class="sourceLineNo">674</span>  public int getCtPostStartRegionOperation() {<a name="line.674"></a>
-<span class="sourceLineNo">675</span>    return ctPostStartRegionOperation.get();<a name="line.675"></a>
-<span class="sourceLineNo">676</span>  }<a name="line.676"></a>
-<span class="sourceLineNo">677</span><a name="line.677"></a>
-<span class="sourceLineNo">678</span>  public int getCtPostCloseRegionOperation() {<a name="line.678"></a>
-<span class="sourceLineNo">679</span>    return ctPostCloseRegionOperation.get();<a name="line.679"></a>
-<span class="sourceLineNo">680</span>  }<a name="line.680"></a>
-<span class="sourceLineNo">681</span><a name="line.681"></a>
-<span class="sourceLineNo">682</span>  public boolean hadPreCheckAndPut() {<a name="line.682"></a>
-<span class="sourceLineNo">683</span>    return ctPreCheckAndPut.get() &gt; 0;<a name="line.683"></a>
-<span class="sourceLineNo">684</span>  }<a name="line.684"></a>
-<span class="sourceLineNo">685</span><a name="line.685"></a>
-<span class="sourceLineNo">686</span>  public boolean hadPreCheckAndPutAfterRowLock() {<a name="line.686"></a>
-<span class="sourceLineNo">687</span>    return ctPreCheckAndPutAfterRowLock.get() &gt; 0;<a name="line.687"></a>
-<span class="sourceLineNo">688</span>  }<a name="line.688"></a>
-<span class="sourceLineNo">689</span><a name="line.689"></a>
-<span class="sourceLineNo">690</span>  public boolean hadPostCheckAndPut() {<a name="line.690"></a>
-<span class="sourceLineNo">691</span>    return ctPostCheckAndPut.get() &gt; 0;<a name="line.691"></a>
-<span class="sourceLineNo">692</span>  }<a name="line.692"></a>
-<span class="sourceLineNo">693</span><a name="line.693"></a>
-<span class="sourceLineNo">694</span>  public boolean hadPreCheckAndDelete() {<a name="line.694"></a>
-<span class="sourceLineNo">695</span>    return ctPreCheckAndDelete.get() &gt; 0;<a name="line.695"></a>
-<span class="sourceLineNo">696</span>  }<a name="line.696"></a>
-<span class="sourceLineNo">697</span><a name="line.697"></a>
-<span class="sourceLineNo">698</span>  public boolean hadPreCheckAndDeleteAfterRowLock() {<a name="line.698"></a>
-<span class="sourceLineNo">699</span>    return ctPreCheckAndDeleteAfterRowLock.get() &gt; 0;<a name="line.699"></a>
-<span class="sourceLineNo">700</span>  }<a name="line.700"></a>
-<span class="sourceLineNo">701</span><a name="line.701"></a>
-<span class="sourceLineNo">702</span>  public boolean hadPostCheckAndDelete() {<a name="line.702"></a>
-<span class="sourceLineNo">703</span>    return ctPostCheckAndDelete.get() &gt; 0;<a name="line.703"></a>
-<span class="sourceLineNo">704</span>  }<a name="line.704"></a>
-<span class="sourceLineNo">705</span><a name="line.705"></a>
-<span class="sourceLineNo">706</span>  public boolean hadPreIncrement() {<a name="line.706"></a>
-<span class="sourceLineNo">707</span>    return ctPreIncrement.get() &gt; 0;<a name="line.707"></a>
-<span class="sourceLineNo">708</span>  }<a name="line.708"></a>
-<span class="sourceLineNo">709</span><a name="line.709"></a>
-<span class="sourceLineNo">710</span>  public boolean hadPreIncrementAfterRowLock() {<a name="line.710"></a>
-<span class="sourceLineNo">711</span>    return ctPreIncrementAfterRowLock.get() &gt; 0;<a name="line.711"></a>
-<span class="sourceLineNo">712</span>  }<a name="line.712"></a>
-<span class="sourceLineNo">713</span><a name="line.713"></a>
-<span class="sourceLineNo">714</span>  public boolean hadPostIncrement() {<a name="line.714"></a>
-<span class="sourceLineNo">715</span>    return ctPostIncrement.get() &gt; 0;<a name="line.715"></a>
-<span class="sourceLineNo">716</span>  }<a name="line.716"></a>
-<span class="sourceLineNo">717</span><a name="line.717"></a>
-<span class="sourceLineNo">718</span>  public boolean hadPreAppend() {<a name="line.718"></a>
-<span class="sourceLineNo">719</span>    return ctPreAppend.get() &gt; 0;<a name="line.719"></a>
-<span class="sourceLineNo">720</span>  }<a name="line.720"></a>
-<span class="sourceLineNo">721</span><a name="line.721"></a>
-<span class="sourceLineNo">722</span>  public boolean hadPreAppendAfterRowLock() {<a name="line.722"></a>
-<span class="sourceLineNo">723</span>    return ctPreAppendAfterRowLock.get() &gt; 0;<a name="line.723"></a>
-<span class="sourceLineNo">724</span>  }<a name="line.724"></a>
-<span class="sourceLineNo">725</span><a name="line.725"></a>
-<span class="sourceLineNo">726</span>  public boolean hadPostAppend() {<a name="line.726"></a>
-<span class="sourceLineNo">727</span>    return ctPostAppend.get() &gt; 0;<a name="line.727"></a>
-<span class="sourceLineNo">728</span>  }<a name="line.728"></a>
-<span class="sourceLineNo">729</span><a name="line.729"></a>
-<span class="sourceLineNo">730</span>  public boolean hadPrePreparedDeleteTS() {<a name="line.730"></a>
-<span class="sourceLineNo">731</span>    return ctPrePrepareDeleteTS.get() &gt; 0;<a name="line.731"></a>
-<span class="sourceLineNo">732</span>  }<a name="line.732"></a>
-<span class="sourceLineNo">733</span><a name="line.733"></a>
-<span class="sourceLineNo">734</span>  public boolean hadPreReplayWALs() {<a name="line.734"></a>
-<span class="sourceLineNo">735</span>    return ctPreReplayWALs.get() &gt; 0;<a name="line.735"></a>
-<span class="sourceLineNo">736</span>  }<a name="line.736"></a>
-<span class="sourceLineNo">737</span><a name="line.737"></a>
-<span class="sourceLineNo">738</span>  public boolean hadPostReplayWALs() {<a name="line.738"></a>
-<span class="sourceLineNo">739</span>    return ctPostReplayWALs.get() &gt; 0;<a name="line.739"></a>
-<span class="sourceLineNo">740</span>  }<a name="line.740"></a>
-<span class="sourceLineNo">741</span><a name="line.741"></a>
-<span class="sourceLineNo">742</span>  public boolean hadPreWALRestore() {<a name="line.742"></a>
-<span class="sourceLineNo">743</span>    return ctPreWALRestore.get() &gt; 0;<a name="line.743"></a>
-<span class="sourceLineNo">744</span>  }<a name="line.744"></a>
-<span class="sourceLineNo">745</span><a name="line.745"></a>
-<span class="sourceLineNo">746</span>  public boolean hadPostWALRestore() {<a name="line.746"></a>
-<span class="sourceLineNo">747</span>    return ctPostWALRestore.get() &gt; 0;<a name="line.747"></a>
-<span class="sourceLineNo">748</span>  }<a name="line.748"></a>
-<span class="sourceLineNo">749</span><a name="line.749"></a>
-<span class="sourceLineNo">750</span>  public boolean wasScannerNextCalled() {<a name="line.750"></a>
-<span class="sourceLineNo">751</span>    return ctPreScannerNext.get() &gt; 0 &amp;&amp; ctPostScannerNext.get() &gt; 0;<a name="line.751"></a>
-<span class="sourceLineNo">752</span>  }<a name="line.752"></a>
-<span class="sourceLineNo">753</span>  public boolean wasScannerFilterRowCalled() {<a name="line.753"></a>
-<span class="sourceLineNo">754</span>    return ctPostScannerFilterRow.get() &gt; 0;<a name="line.754"></a>
-<span class="sourceLineNo">755</span>  }<a name="line.755"></a>
-<span class="sourceLineNo">756</span>  public boolean wasScannerCloseCalled() {<a name="line.756"></a>
-<span class="sourceLineNo">757</span>    return ctPreScannerClose.get() &gt; 0 &amp;&amp; ctPostScannerClose.get() &gt; 0;<a name="line.757"></a>
+<span class="sourceLineNo">166</span>  @Override<a name="line.166"></a>
+<span class="sourceLineNo">167</span>  public void postClose(ObserverContext&lt;RegionCoprocessorEnvironment&gt; c, boolean abortRequested) {<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    ctPostClose.incrementAndGet();<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>  public boolean wasClosed() {<a name="line.171"></a>
+<span class="sourceLineNo">172</span>    return ctPreClose.get() &gt; 0 &amp;&amp; ctPostClose.get() &gt; 0;<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>  @Override<a name="line.175"></a>
+<span class="sourceLineNo">176</span>  public InternalScanner preFlush(ObserverContext&lt;RegionCoprocessorEnvironment&gt; c,<a name="line.176"></a>
+<span class="sourceLineNo">177</span>      Store store, InternalScanner scanner, FlushLifeCycleTracker tracker) throws IOException {<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    ctPreFlush.incrementAndGet();<a name="line.178"></a>
+<span class="sourceLineNo">179</span>    return scanner;<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>  @Override<a name="line.182"></a>
+<span class="sourceLineNo">183</span>  public void postFlush(ObserverContext&lt;RegionCoprocessorEnvironment&gt; c,<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      Store store, StoreFile resultFile, FlushLifeCycleTracker tracker) throws IOException {<a name="line.184"></a>
+<span class="sourceLineNo">185</span>    ctPostFlush.incrementAndGet();<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    if (throwOnPostFlush.get()){<a name="line.186"></a>
+<span class="sourceLineNo">187</span>      throw new IOException("throwOnPostFlush is true in postFlush");<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>  public boolean wasFlushed() {<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    return ctPreFlush.get() &gt; 0 &amp;&amp; ctPostFlush.get() &gt; 0;<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>  @Override<a name="line.195"></a>
+<span class="sourceLineNo">196</span>  public void preCompactSelection(ObserverContext&lt;RegionCoprocessorEnvironment&gt; c, Store store,<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      List&lt;? extends StoreFile&gt; candidates, CompactionLifeCycleTracker tracker) throws IOException {<a name="line.197"></a>
+<span class="sourceLineNo">198</span>    ctPreCompactSelect.incrementAndGet();<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>  @Override<a name="line.201"></a>
+<span class="sourceLineNo">202</span>  public void postCompactSelection(ObserverContext&lt;RegionCoprocessorEnvironment&gt; c, Store store,<a name="line.202"></a>
+<span class="sourceLineNo">203</span>      List&lt;? extends StoreFile&gt; selected, CompactionLifeCycleTracker tracker,<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      CompactionRequest request) {<a name="line.204"></a>
+<span class="sourceLineNo">205</span>    ctPostCompactSelect.incrementAndGet();<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>  public InternalScanner preCompact(ObserverContext&lt;RegionCoprocessorEnvironment&gt; c, Store store,<a name="line.209"></a>
+<span class="sourceLineNo">210</span>      InternalScanner scanner, ScanType scanType, CompactionLifeCycleTracker tracker,<a name="line.210"></a>
+<span class="sourceLineNo">211</span>      CompactionRequest request) throws IOException {<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    ctPreCompact.incrementAndGet();<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    return scanner;<a name="line.213"></a>
+<span class="sourceLineNo">214</span>  }<a name="line.214"></a>
+<span class="sourceLineNo">215</span><a name="line.215"></a>
+<span class="sourceLineNo">216</span>  @Override<a name="line.216"></a>
+<span class="sourceLineNo">217</span>  public void postCompact(ObserverContext&lt;RegionCoprocessorEnvironment&gt; c, Store store,<a name="line.217"></a>
+<span class="sourceLineNo">218</span>      StoreFile resultFile, CompactionLifeCycleTracker tracker,<a name="line.218"></a>
+<span class="sourceLineNo">219</span>      CompactionRequest request) throws IOException {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    ctPostCompact.incrementAndGet();<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>  public boolean wasCompacted() {<a name="line.223"></a>
+<span class="sourceLineNo">224</span>    return ctPreCompact.get() &gt; 0 &amp;&amp; ctPostCompact.get() &gt; 0;<a name="line.224"></a>
+<span class="sourceLineNo">225</span>  }<a name="line.225"></a>
+<span class="sourceLineNo">226</span><a name="line.226"></a>
+<span class="sourceLineNo">227</span>  @Override<a name="line.227"></a>
+<span class="sourceLineNo">228</span>  public void preScannerOpen(final ObserverContext&lt;RegionCoprocessorEnvironment&gt; c, final Scan scan)<a name="line.228"></a>
+<span class="sourceLineNo">229</span>      throws IOException {<a name="line.229"></a>
+<span class="sourceLineNo">230</span>    ctPreScannerOpen.incrementAndGet();<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>  @Override<a name="line.233"></a>
+<span class="sourceLineNo">234</span>  public RegionScanner postScannerOpen(final ObserverContext&lt;RegionCoprocessorEnvironment&gt; c,<a name="line.234"></a>
+<span class="sourceLineNo">235</span>      final Scan scan, final RegionScanner s)<a name="line.235"></a>
+<span class="sourceLineNo">236</span>      throws IOException {<a name="line.236"></a>
+<span class="sourceLineNo">237</span>    ctPostScannerOpen.incrementAndGet();<a name="line.237"></a>
+<span class="sourceLineNo">238</span>    return s;<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>  @Override<a name="line.241"></a>
+<span class="sourceLineNo">242</span>  public boolean preScannerNext(final ObserverContext&lt;RegionCoprocessorEnvironment&gt; c,<a name="line.242"></a>
+<span class="sourceLineNo">243</span>      final InternalScanner s, final List&lt;Result&gt; results,<a name="line.243"></a>
+<span class="sourceLineNo">244</span>      final int limit, final boolean hasMore) throws IOException {<a name="line.244"></a>
+<span class="sourceLineNo">245</span>    ctPreScannerNext.incrementAndGet();<a name="line.245"></a>
+<span class="sourceLineNo">246</span>    return hasMore;<a name="line.246"></a>
+<span class="sourceLineNo">247</span>  }<a name="line.247"></a>
+<span class="sourceLineNo">248</span><a name="line.248"></a>
+<span class="sourceLineNo">249</span>  @Override<a name="line.249"></a>
+<span class="sourceLineNo">250</span>  public boolean postScannerNext(final ObserverContext&lt;RegionCoprocessorEnvironment&gt; c,<a name="line.250"></a>
+<span class="sourceLineNo">251</span>      final InternalScanner s, final List&lt;Result&gt; results, final int limit,<a name="line.251"></a>
+<span class="sourceLineNo">252</span>      final boolean hasMore) throws IOException {<a name="line.252"></a>
+<span class="sourceLineNo">253</span>    ctPostScannerNext.incrementAndGet();<a name="line.253"></a>
+<span class="sourceLineNo">254</span>    return hasMore;<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 boolean postScannerFilterRow(final ObserverContext&lt;RegionCoprocessorEnvironment&gt; e,<a name="line.258"></a>
+<span class="sourceLineNo">259</span>      final InternalScanner s, final Cell currentRow, final boolean hasMore) throws IOException {<a name="line.259"></a>
+<span class="sourceLineNo">260</span>    ctPostScannerFilterRow.incrementAndGet();<a name="line.260"></a>
+<span class="sourceLineNo">261</span>    return hasMore;<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>  @Override<a name="line.264"></a>
+<span class="sourceLineNo">265</span>  public void preScannerClose(final ObserverContext&lt;RegionCoprocessorEnvironment&gt; c,<a name="line.265"></a>
+<span class="sourceLineNo">266</span>      final InternalScanner s) throws IOException {<a name="line.266"></a>
+<span class="sourceLineNo">267</span>    ctPreScannerClose.incrementAndGet();<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>  @Override<a name="line.270"></a>
+<span class="sourceLineNo">271</span>  public void postScannerClose(final ObserverContext&lt;RegionCoprocessorEnvironment&gt; c,<a name="line.271"></a>
+<span class="sourceLineNo">272</span>      final InternalScanner s) throws IOException {<a name="line.272"></a>
+<span class="sourceLineNo">273</span>    ctPostScannerClose.incrementAndGet();<a name="line.273"></a>
+<span class="sourceLineNo">274</span>  }<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>  public void preGetOp(final ObserverContext&lt;RegionCoprocessorEnvironment&gt; c, final Get get,<a name="line.277"></a>
+<span class="sourceLineNo">278</span>      final List&lt;Cell&gt; results) throws IOException {<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    RegionCoprocessorEnvironment e = c.getEnvironment();<a name="line.279"></a>
+<span class="sourceLineNo">280</span>    assertNotNull(e);<a name="line.280"></a>
+<span class="sourceLineNo">281</span>    assertNotNull(e.getRegion());<a name="line.281"></a>
+<span class="sourceLineNo">282</span>    assertNotNull(get);<a name="line.282"></a>
+<span class="sourceLineNo">283</span>    assertNotNull(results);<a name="line.283"></a>
+<span class="sourceLineNo">284</span>    ctPreGet.incrementAndGet();<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>  @Override<a name="line.287"></a>
+<span class="sourceLineNo">288</span>  public void postGetOp(final ObserverContext&lt;RegionCoprocessorEnvironment&gt; c, final Get get,<a name="line.288"></a>
+<span class="sourceLineNo">289</span>      final List&lt;Cell&gt; results) {<a name="line.289"></a>
+<span class="sourceLineNo">290</span>    RegionCoprocessorEnvironment e = c.getEnvironment();<a name="line.290"></a>
+<span class="sourceLineNo">291</span>    assertNotNull(e);<a name="line.291"></a>
+<span class="sourceLineNo">292</span>    assertNotNull(e.getRegion());<a name="line.292"></a>
+<span class="sourceLineNo">293</span>    assertNotNull(get);<a name="line.293"></a>
+<span class="sourceLineNo">294</span>    assertNotNull(results);<a name="line.294"></a>
+<span class="sourceLineNo">295</span>    if (e.getRegion().getTableDescriptor().getTableName().equals(<a name="line.295"></a>
+<span class="sourceLineNo">296</span>        TestRegionObserverInterface.TEST_TABLE)) {<a name="line.296"></a>
+<span class="sourceLineNo">297</span>      boolean foundA = false;<a name="line.297"></a>
+<span class="sourceLineNo">298</span>      boolean foundB = false;<a name="line.298"></a>
+<span class="sourceLineNo">299</span>      boolean foundC = false;<a name="line.299"></a>
+<span class="sourceLineNo">300</span>      for (Cell kv: results) {<a name="line.300"></a>
+<span class="sourceLineNo">301</span>        if (CellUtil.matchingFamily(kv, TestRegionObserverInterface.A)) {<a name="line.301"></a>
+<span class="sourceLineNo">302</span>          foundA = true;<a name="line.302"></a>
+<span class="sourceLineNo">303</span>        }<a name="line.303"></a>
+<span class="sourceLineNo">304</span>        if (CellUtil.matchingFamily(kv, TestRegionObserverInterface.B)) {<a name="line.304"></a>
+<span class="sourceLineNo">305</span>          foundB = true;<a name="line.305"></a>
+<span class="sourceLineNo">306</span>        }<a name="line.306"></a>
+<span class="sourceLineNo">307</span>        if (CellUtil.matchingFamily(kv, TestRegionObserverInterface.C)) {<a name="line.307"></a>
+<span class="sourceLineNo">308</span>          foundC = true;<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>      assertTrue(foundA);<a name="line.311"></a>
+<span class="sourceLineNo">312</span>      assertTrue(foundB);<a name="line.312"></a>
+<span class="sourceLineNo">313</span>      assertTrue(foundC);<a name="line.313"></a>
+<span class="sourceLineNo">314</span>    }<a name="line.314"></a>
+<span class="sourceLineNo">315</span>    ctPostGet.incrementAndGet();<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>  @Override<a name="line.318"></a>
+<span class="sourceLineNo">319</span>  public void prePut(final ObserverContext&lt;RegionCoprocessorEnvironment&gt; c,<a name="line.319"></a>
+<span class="sourceLineNo">320</span>      final Put put, final WALEdit edit,<a name="line.320"></a>
+<span class="sourceLineNo">321</span>      final Durability durability) throws IOException {<a name="line.321"></a>
+<span class="sourceLineNo">322</span>    Map&lt;byte[], List&lt;Cell&gt;&gt; familyMap  = put.getFamilyCellMap();<a name="line.322"></a>
+<span class="sourceLineNo">323</span>    RegionCoprocessorEnvironment e = c.getEnvironment();<a name="line.323"></a>
+<span class="sourceLineNo">324</span>    assertNotNull(e);<a name="line.324"></a>
+<span class="sourceLineNo">325</span>    assertNotNull(e.getRegion());<a name="line.325"></a>
+<span class="sourceLineNo">326</span>    assertNotNull(familyMap);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>    if (e.getRegion().getTableDescriptor().getTableName().equals(<a name="line.327"></a>
+<span class="sourceLineNo">328</span>        TestRegionObserverInterface.TEST_TABLE)) {<a name="line.328"></a>
+<span class="sourceLineNo">329</span>      List&lt;Cell&gt; cells = familyMap.get(TestRegionObserverInterface.A);<a name="line.329"></a>
+<span class="sourceLineNo">330</span>      assertNotNull(cells);<a name="line.330"></a>
+<span class="sourceLineNo">331</span>      assertNotNull(cells.get(0));<a name="line.331"></a>
+<span class="sourceLineNo">332</span>      Cell cell = cells.get(0);<a name="line.332"></a>
+<span class="sourceLineNo">333</span>      assertTrue(Bytes.equals(cell.getQualifierArray(), cell.getQualifierOffset(),<a name="line.333"></a>
+<span class="sourceLineNo">334</span>        cell.getQualifierLength(), TestRegionObserverInterface.A, 0,<a name="line.334"></a>
+<span class="sourceLineNo">335</span>        TestRegionObserverInterface.A.length));<a name="line.335"></a>
+<span class="sourceLineNo">336</span>      cells = familyMap.get(TestRegionObserverInterface.B);<a name="line.336"></a>
+<span class="sourceLineNo">337</span>      assertNotNull(cells);<a name="line.337"></a>
+<span class="sourceLineNo">338</span>      assertNotNull(cells.get(0));<a name="line.338"></a>
+<span class="sourceLineNo">339</span>      cell = cells.get(0);<a name="line.339"></a>
+<span class="sourceLineNo">340</span>      assertTrue(Bytes.equals(cell.getQualifierArray(), cell.getQualifierOffset(),<a name="line.340"></a>
+<span class="sourceLineNo">341</span>        cell.getQualifierLength(), TestRegionObserverInterface.B, 0,<a name="line.341"></a>
+<span class="sourceLineNo">342</span>        TestRegionObserverInterface.B.length));<a name="line.342"></a>
+<span class="sourceLineNo">343</span>      cells = familyMap.get(TestRegionObserverInterface.C);<a name="line.343"></a>
+<span class="sourceLineNo">344</span>      assertNotNull(cells);<a name="line.344"></a>
+<span class="sourceLineNo">345</span>      assertNotNull(cells.get(0));<a name="line.345"></a>
+<span class="sourceLineNo">346</span>      cell = cells.get(0);<a name="line.346"></a>
+<span class="sourceLineNo">347</span>      assertTrue(Bytes.equals(cell.getQualifierArray(), cell.getQualifierOffset(),<a name="line.347"></a>
+<span class="sourceLineNo">348</span>        cell.getQualifierLength(), TestRegionObserverInterface.C, 0,<a name="line.348"></a>
+<span class="sourceLineNo">349</span>        TestRegionObserverInterface.C.length));<a name="line.349"></a>
+<span class="sourceLineNo">350</span>    }<a name="line.350"></a>
+<span class="sourceLineNo">351</span>    ctPrePut.incrementAndGet();<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>  public void postPut(final ObserverContext&lt;RegionCoprocessorEnvironment&gt; c,<a name="line.355"></a>
+<span class="sourceLineNo">356</span>      final Put put, final WALEdit edit,<a name="line.356"></a>
+<span class="sourceLineNo">357</span>      final Durability durability) throws IOException {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>    Map&lt;byte[], List&lt;Cell&gt;&gt; familyMap  = put.getFamilyCellMap();<a name="line.358"></a>
+<span class="sourceLineNo">359</span>    RegionCoprocessorEnvironment e = c.getEnvironment();<a name="line.359"></a>
+<span class="sourceLineNo">360</span>    assertNotNull(e);<a name="line.360"></a>
+<span class="sourceLineNo">361</span>    assertNotNull(e.getRegion());<a name="line.361"></a>
+<span class="sourceLineNo">362</span>    assertNotNull(familyMap);<a name="line.362"></a>
+<span class="sourceLineNo">363</span>    List&lt;Cell&gt; cells = familyMap.get(TestRegionObserverInterface.A);<a name="line.363"></a>
+<span class="sourceLineNo">364</span>    if (e.getRegion().getTableDescriptor().getTableName().equals(<a name="line.364"></a>
+<span class="sourceLineNo">365</span>        TestRegionObserverInterface.TEST_TABLE)) {<a name="line.365"></a>
+<span class="sourceLineNo">366</span>      assertNotNull(cells);<a name="line.366"></a>
+<span class="sourceLineNo">367</span>      assertNotNull(cells.get(0));<a name="line.367"></a>
+<span class="sourceLineNo">368</span>      // KeyValue v1 expectation.  Cast for now until we go all Cell all the time. TODO<a name="line.368"></a>
+<span class="sourceLineNo">369</span>      Cell cell = cells.get(0);<a name="line.369"></a>
+<span class="sourceLineNo">370</span>      assertTrue(Bytes.equals(cell.getQualifierArray(), cell.getQualifierOffset(),<a name="line.370"></a>
+<span class="sourceLineNo">371</span>        cell.getQualifierLength(), TestRegionObserverInterface.A, 0,<a name="line.371"></a>
+<span class="sourceLineNo">372</span>        TestRegionObserverInterface.A.length));<a name="line.372"></a>
+<span class="sourceLineNo">373</span>      cells = familyMap.get(TestRegionObserverInterface.B);<a name="line.373"></a>
+<span class="sourceLineNo">374</span>      assertNotNull(cells);<a name="line.374"></a>
+<span class="sourceLineNo">375</span>      assertNotNull(cells.get(0));<a name="line.375"></a>
+<span class="sourceLineNo">376</span>      // KeyValue v1 expectation.  Cast for now until we go all Cell all the time. TODO<a name="line.376"></a>
+<span class="sourceLineNo">377</span>      cell = cells.get(0);<a name="line.377"></a>
+<span class="sourceLineNo">378</span>      assertTrue(Bytes.equals(cell.getQualifierArray(), cell.getQualifierOffset(),<a name="line.378"></a>
+<span class="sourceLineNo">379</span>        cell.getQualifierLength(), TestRegionObserverInterface.B, 0,<a name="line.379"></a>
+<span class="sourceLineNo">380</span>        TestRegionObserverInterface.B.length));<a name="line.380"></a>
+<span class="sourceLineNo">381</span>      cells = familyMap.get(TestRegionObserverInterface.C);<a name="line.381"></a>
+<span class="sourceLineNo">382</span>      assertNotNull(cells);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>      assertNotNull(cells.get(0));<a name="line.383"></a>
+<span class="sourceLineNo">384</span>      // KeyValue v1 expectation.  Cast for now until we go all Cell all the time. TODO<a name="line.384"></a>
+<span class="sourceLineNo">385</span>      cell = cells.get(0);<a name="line.385"></a>
+<span class="sourceLineNo">386</span>      assertTrue(Bytes.equals(cell.getQualifierArray(), cell.getQualifierOffset(),<a name="line.386"></a>
+<span class="sourceLineNo">387</span>        cell.getQualifierLength(), TestRegionObserverInterface.C, 0,<a name="line.387"></a>
+<span class="sourceLineNo">388</span>        TestRegionObserverInterface.C.length));<a name="line.388"></a>
+<span class="sourceLineNo">389</span>    }<a name="line.389"></a>
+<span class="sourceLineNo">390</span>    ctPostPut.incrementAndGet();<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>  @Override<a name="line.393"></a>
+<span class="sourceLineNo">394</span>  public void preDelete(final ObserverContext&lt;RegionCoprocessorEnvironment&gt; c,<a name="line.394"></a>
+<span class="sourceLineNo">395</span>      final Delete delete, final WALEdit edit,<a name="line.395"></a>
+<span class="sourceLineNo">396</span>      final Durability durability) throws IOException {<a name="line.396"></a>
+<span class="sourceLineNo">397</span>    Map&lt;byte[], List&lt;Cell&gt;&gt; familyMap  = delete.getFamilyCellMap();<a name="line.397"></a>
+<span class="sourceLineNo">398</span>    RegionCoprocessorEnvironment e = c.getEnvironment();<a name="line.398"></a>
+<span class="sourceLineNo">399</span>    assertNotNull(e);<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    assertNotNull(e.getRegion());<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    assertNotNull(familyMap);<a name="line.401"></a>
+<span class="sourceLineNo">402</span>    if (ctBeforeDelete.get() &gt; 0) {<a name="line.402"></a>
+<span class="sourceLineNo">403</span>      ctPreDeleted.incrementAndGet();<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>  @Override<a name="line.407"></a>
+<span class="sourceLineNo">408</span>  public void prePrepareTimeStampForDeleteVersion(ObserverContext&lt;RegionCoprocessorEnvironment&gt; e,<a name="line.408"></a>
+<span class="sourceLineNo">409</span>      Mutation delete, Cell cell, byte[] byteNow, Get get) throws IOException {<a name="line.409"></a>
+<span class="sourceLineNo">410</span>    ctPrePrepareDeleteTS.incrementAndGet();<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>  @Override<a name="line.413"></a>
+<span class="sourceLineNo">414</span>  public void postDelete(final ObserverContext&lt;RegionCoprocessorEnvironment&gt; c,<a name="line.414"></a>
+<span class="sourceLineNo">415</span>      final Delete delete, final WALEdit edit,<a name="line.415"></a>
+<span class="sourceLineNo">416</span>      final Durability durability) throws IOException {<a name="line.416"></a>
+<span class="sourceLineNo">417</span>    Map&lt;byte[], List&lt;Cell&gt;&gt; familyMap  = delete.getFamilyCellMap();<a name="line.417"></a>
+<span class="sourceLineNo">418</span>    RegionCoprocessorEnvironment e = c.getEnvironment();<a name="line.418"></a>
+<span class="sourceLineNo">419</span>    assertNotNull(e);<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    assertNotNull(e.getRegion());<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    assertNotNull(familyMap);<a name="line.421"></a>
+<span class="sourceLineNo">422</span>    ctBeforeDelete.set(0);<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    ctPostDeleted.incrementAndGet();<a name="line.423"></a>
+<span class="sourceLineNo">424</span>  }<a name="line.424"></a>
+<span class="sourceLineNo">425</span><a name="line.425"></a>
+<span class="sourceLineNo">426</span>  @Override<a name="line.426"></a>
+<span class="sourceLineNo">427</span>  public void preBatchMutate(ObserverContext&lt;RegionCoprocessorEnvironment&gt; c,<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      MiniBatchOperationInProgress&lt;Mutation&gt; miniBatchOp) throws IOException {<a name="line.428"></a>
+<span class="sourceLineNo">429</span>    RegionCoprocessorEnvironment e = c.getEnvironment();<a name="line.429"></a>
+<span class="sourceLineNo">430</span>    assertNotNull(e);<a name="line.430"></a>
+<span class="sourceLineNo">431</span>    assertNotNull(e.getRegion());<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    assertNotNull(miniBatchOp);<a name="line.432"></a>
+<span class="sourceLineNo">433</span>    ctPreBatchMutate.incrementAndGet();<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>  @Override<a name="line.436"></a>
+<span class="sourceLineNo">437</span>  public void postBatchMutate(final ObserverContext&lt;RegionCoprocessorEnvironment&gt; c,<a name="line.437"></a>
+<span class="sourceLineNo">438</span>      final MiniBatchOperationInProgress&lt;Mutation&gt; miniBatchOp) throws IOException {<a name="line.438"></a>
+<span class="sourceLineNo">439</span>    RegionCoprocessorEnvironment e = c.getEnvironment();<a name="line.439"></a>
+<span class="sourceLineNo">440</span>    assertNotNull(e);<a name="line.440"></a>
+<span class="sourceLineNo">441</span>    assertNotNull(e.getRegion());<a name="line.441"></a>
+<span class="sourceLineNo">442</span>    assertNotNull(miniBatchOp);<a name="line.442"></a>
+<span class="sourceLineNo">443</span>    ctPostBatchMutate.incrementAndGet();<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>  @Override<a name="line.446"></a>
+<span class="sourceLineNo">447</span>  public void postStartRegionOperation(final ObserverContext&lt;RegionCoprocessorEnvironment&gt; ctx,<a name="line.447"></a>
+<span class="sourceLineNo">448</span>      Operation op) throws IOException {<a name="line.448"></a>
+<span class="sourceLineNo">449</span>    ctPostStartRegionOperation.incrementAndGet();<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>  @Override<a name="line.452"></a>
+<span class="sourceLineNo">453</span>  public void postCloseRegionOperation(final ObserverContext&lt;RegionCoprocessorEnvironment&gt; ctx,<a name="line.453"></a>
+<span class="sourceLineNo">454</span>      Operation op) throws IOException {<a name="line.454"></a>
+<span class="sourceLineNo">455</span>    if (ctPostStartRegionOperation.get() &gt; 0) {<a name="line.455"></a>
+<span class="sourceLineNo">456</span>      ctPostCloseRegionOperation.incrementAndGet();<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><a name="line.459"></a>
+<span class="sourceLineNo">460</span>  @Override<a name="line.460"></a>
+<span class="sourceLineNo">461</span>  public void postBatchMutateIndispensably(final ObserverContext&lt;RegionCoprocessorEnvironment&gt; ctx,<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      MiniBatchOperationInProgress&lt;Mutation&gt; miniBatchOp, final boolean success) throws IOException {<a name="line.462"></a>
+<span class="sourceLineNo">463</span>    ctPostBatchMutateIndispensably.incrementAndGet();<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>  @Override<a name="line.466"></a>
+<span class="sourceLineNo">467</span>  public Result preIncrement(final ObserverContext&lt;RegionCoprocessorEnvironment&gt; c,<a name="line.467"></a>
+<span class="sourceLineNo">468</span>      final Increment increment) throws IOException {<a name="line.468"></a>
+<span class="sourceLineNo">469</span>    ctPreIncrement.incrementAndGet();<a name="line.469"></a>
+<span class="sourceLineNo">470</span>    return null;<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>  @Override<a name="line.473"></a>
+<span class="sourceLineNo">474</span>  public Result preIncrementAfterRowLock(ObserverContext&lt;RegionCoprocessorEnvironment&gt; e,<a name="line.474"></a>
+<span class="sourceLineNo">475</span>      Increment increment) throws IOException {<a name="line.475"></a>
+<span class="sourceLineNo">476</span>    ctPreIncrementAfterRowLock.incrementAndGet();<a name="line.476"></a>
+<span class="sourceLineNo">477</span>    return null;<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>  @Override<a name="line.480"></a>
+<span class="sourceLineNo">481</span>  public Result postIncrement(final ObserverContext&lt;RegionCoprocessorEnvironment&gt; c,<a name="line.481"></a>
+<span class="sourceLineNo">482</span>      final Increment increment, final Result result) throws IOException {<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    ctPostIncrement.incrementAndGet();<a name="line.483"></a>
+<span class="sourceLineNo">484</span>    return result;<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>  @Override<a name="line.487"></a>
+<span class="sourceLineNo">488</span>  public boolean preCheckAndPut(ObserverContext&lt;RegionCoprocessorEnvironment&gt; e, byte[] row,<a name="line.488"></a>
+<span class="sourceLineNo">489</span>                                byte[] family, byte[] qualifier, CompareOperator compareOp, ByteArrayComparable comparator,<a name="line.489"></a>
+<span class="sourceLineNo">490</span>                                Put put, boolean result) throws IOException {<a name="line.490"></a>
+<span class="sourceLineNo">491</span>    ctPreCheckAndPut.incrementAndGet();<a name="line.491"></a>
+<span class="sourceLineNo">492</span>    return true;<a name="line.492"></a>
+<span class="sourceLineNo">493</span>  }<a name="line.493"></a>
+<span class="sourceLineNo">494</span><a name="line.494"></a>
+<span class="sourceLineNo">495</span>  @Override<a name="line.495"></a>
+<span class="sourceLineNo">496</span>  public boolean preCheckAndPutAfterRowLock(ObserverContext&lt;RegionCoprocessorEnvironment&gt; e,<a name="line.496"></a>
+<span class="sourceLineNo">497</span>      byte[] row, byte[] family, byte[] qualifier, CompareOperator compareOp,<a name="line.497"></a>
+<span class="sourceLineNo">498</span>      ByteArrayComparable comparator, Put put, boolean result) throws IOException {<a name="line.498"></a>
+<span class="sourceLineNo">499</span>    ctPreCheckAndPutAfterRowLock.incrementAndGet();<a name="line.499"></a>
+<span class="sourceLineNo">500</span>    return true;<a name="line.500"></a>
+<span class="sourceLineNo">501</span>  }<a name="line.501"></a>
+<span class="sourceLineNo">502</span><a name="line.502"></a>
+<span class="sourceLineNo">503</span>  @Override<a name="line.503"></a>
+<span class="sourceLineNo">504</span>  public boolean postCheckAndPut(ObserverContext&lt;RegionCoprocessorEnvironment&gt; e, byte[] row,<a name="line.504"></a>
+<span class="sourceLineNo">505</span>                                 byte[] family, byte[] qualifier, CompareOperator compareOp, ByteArrayComparable comparator,<a name="line.505"></a>
+<span class="sourceLineNo">506</span>                                 Put put, boolean result) throws IOException {<a name="line.506"></a>
+<span class="sourceLineNo">507</span>    ctPostCheckAndPut.incrementAndGet();<a name="line.507"></a>
+<span class="sourceLineNo">508</span>    return true;<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>  @Override<a name="line.511"></a>
+<span class="sourceLineNo">512</span>  public boolean preCheckAndDelete(ObserverContext&lt;RegionCoprocessorEnvironment&gt; e, byte[] row,<a name="line.512"></a>
+<span class="sourceLineNo">513</span>                                   byte[] family, byte[] qualifier, CompareOperator compareOp, ByteArrayComparable comparator,<a name="line.513"></a>
+<span class="sourceLineNo">514</span>                                   Delete delete, boolean result) throws IOException {<a name="line.514"></a>
+<span class="sourceLineNo">515</span>    ctPreCheckAndDelete.incrementAndGet();<a name="line.515"></a>
+<span class="sourceLineNo">516</span>    return true;<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>  @Override<a name="line.519"></a>
+<span class="sourceLineNo">520</span>  public boolean preCheckAndDeleteAfterRowLock(ObserverContext&lt;RegionCoprocessorEnvironment&gt; e,<a name="line.520"></a>
+<span class="sourceLineNo">521</span>      byte[] row, byte[] family, byte[] qualifier, CompareOperator compareOp,<a name="line.521"></a>
+<span class="sourceLineNo">522</span>      ByteArrayComparable comparator, Delete delete, boolean result) throws IOException {<a name="line.522"></a>
+<span class="sourceLineNo">523</span>    ctPreCheckAndDeleteAfterRowLock.incrementAndGet();<a name="line.523"></a>
+<span class="sourceLineNo">524</span>    return true;<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 boolean postCheckAndDelete(ObserverContext&lt;RegionCoprocessorEnvironment&gt; e, byte[] row,<a name="line.528"></a>
+<span class="sourceLineNo">529</span>                                    byte[] family, byte[] qualifier, CompareOperator compareOp, ByteArrayComparable comparator,<a name="line.529"></a>
+<span class="sourceLineNo">530</span>                                    Delete delete, boolean result) throws IOException {<a name="line.530"></a>
+<span class="sourceLineNo">531</span>    ctPostCheckAndDelete.incrementAndGet();<a name="line.531"></a>
+<span class="sourceLineNo">532</span>    return true;<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 preAppendAfterRowLock(ObserverContext&lt;RegionCoprocessorEnvironment&gt; e,<a name="line.536"></a>
+<span class="sourceLineNo">537</span>      Append append) throws IOException {<a name="line.537"></a>
+<span class="sourceLineNo">538</span>    ctPreAppendAfterRowLock.incrementAndGet();<a name="line.538"></a>
+<span class="sourceLineNo">539</span>    return null;<a name="line.539"></a>
+<span class="sourceLineNo">540</span>  }<a name="line.540"></a>
+<span class="sourceLineNo">541</span><a name="line.541"></a>
+<span class="sourceLineNo">542</span>  @Override<a name="line.542"></a>
+<span class="sourceLineNo">543</span>  public Result preAppend(ObserverContext&lt;RegionCoprocessorEnvironment&gt; e, Append append)<a name="line.543"></a>
+<span class="sourceLineNo">544</span>      throws IOException {<a name="line.544"></a>
+<span class="sourceLineNo">545</span>    ctPreAppend.incrementAndGet();<a name="line.545"></a>
+<span class="sourceLineNo">546</span>    return null;<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>  @Override<a name="line.549"></a>
+<span class="sourceLineNo">550</span>  public Result postAppend(ObserverContext&lt;RegionCoprocessorEnvironment&gt; e, Append append,<a name="line.550"></a>
+<span class="sourceLineNo">551</span>      Result result) throws IOException {<a name="line.551"></a>
+<span class="sourceLineNo">552</span>    ctPostAppend.incrementAndGet();<a name="line.552"></a>
+<span class="sourceLineNo">553</span>    return null;<a name="line.553"></a>
+<span class="sourceLineNo">554</span>  }<a name="line.554"></a>
+<span class="sourceLineNo">555</span><a name="line.555"></a>
+<span class="sourceLineNo">556</span>  @Override<a name="line.556"></a>
+<span class="sourceLineNo">557</span>  public void preBulkLoadHFile(ObserverContext&lt;RegionCoprocessorEnvironment&gt; ctx,<a name="line.557"></a>
+<span class="sourceLineNo">558</span>                               List&lt;Pair&lt;byte[], String&gt;&gt; familyPaths) throws IOException {<a name="line.558"></a>
+<span class="sourceLineNo">559</span>    RegionCoprocessorEnvironment e = ctx.getEnvironment();<a name="line.559"></a>
+<span class="sourceLineNo">560</span>    assertNotNull(e);<a name="line.560"></a>
+<span class="sourceLineNo">561</span>    assertNotNull(e.getRegion());<a name="line.561"></a>
+<span class="sourceLineNo">562</span>    if (e.getRegion().getTableDescriptor().getTableName().equals(<a name="line.562"></a>
+<span class="sourceLineNo">563</span>        TestRegionObserverInterface.TEST_TABLE)) {<a name="line.563"></a>
+<span class="sourceLineNo">564</span>      assertNotNull(familyPaths);<a name="line.564"></a>
+<span class="sourceLineNo">565</span>      assertEquals(1,familyPaths.size());<a name="line.565"></a>
+<span class="sourceLineNo">566</span>      assertArrayEquals(TestRegionObserverInterface.A, familyPaths.get(0).getFirst());<a name="line.566"></a>
+<span class="sourceLineNo">567</span>      String familyPath = familyPaths.get(0).getSecond();<a name="line.567"></a>
+<span class="sourceLineNo">568</span>      String familyName = Bytes.toString(TestRegionObserverInterface.A);<a name="line.568"></a>
+<span class="sourceLineNo">569</span>      assertEquals(familyPath.substring(familyPath.length()-familyName.length()-1),"/"+familyName);<a name="line.569"></a>
+<span class="sourceLineNo">570</span>    }<a name="line.570"></a>
+<span class="sourceLineNo">571</span>    ctPreBulkLoadHFile.incrementAndGet();<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>  @Override<a name="line.574"></a>
+<span class="sourceLineNo">575</span>  public void postBulkLoadHFile(ObserverContext&lt;RegionCoprocessorEnvironment&gt; ctx,<a name="line.575"></a>
+<span class="sourceLineNo">576</span>      List&lt;Pair&lt;byte[], String&gt;&gt; familyPaths, Map&lt;byte[], List&lt;Path&gt;&gt; map)<a name="line.576"></a>
+<span class="sourceLineNo">577</span>          throws IOException {<a name="line.577"></a>
+<span class="sourceLineNo">578</span>    RegionCoprocessorEnvironment e = ctx.getEnvironment();<a name="line.578"></a>
+<span class="sourceLineNo">579</span>    assertNotNull(e);<a name="line.579"></a>
+<span class="sourceLineNo">580</span>    assertNotNull(e.getRegion());<a name="line.580"></a>
+<span class="sourceLineNo">581</span>    if (e.getRegion().getTableDescriptor().getTableName().equals(<a name="line.581"></a>
+<span class="sourceLineNo">582</span>        TestRegionObserverInterface.TEST_TABLE)) {<a name="line.582"></a>
+<span class="sourceLineNo">583</span>      assertNotNull(familyPaths);<a name="line.583"></a>
+<span class="sourceLineNo">584</span>      assertEquals(1,familyPaths.size());<a name="line.584"></a>
+<span class="sourceLineNo">585</span>      assertArrayEquals(TestRegionObserverInterface.A, familyPaths.get(0).getFirst());<a name="line.585"></a>
+<span class="sourceLineNo">586</span>      String familyPath = familyPaths.get(0).getSecond();<a name="line.586"></a>
+<span class="sourceLineNo">587</span>      String familyName = Bytes.toString(TestRegionObserverInterface.A);<a name="line.587"></a>
+<span class="sourceLineNo">588</span>      assertEquals(familyPath.substring(familyPath.length()-familyName.length()-1),"/"+familyName);<a name="line.588"></a>
+<span class="sourceLineNo">589</span>    }<a name="line.589"></a>
+<span class="sourceLineNo">590</span>    ctPostBulkLoadHFile.incrementAndGet();<a name="line.590"></a>
+<span class="sourceLineNo">591</span>  }<a name="line.591"></a>
+<span class="sourceLineNo">592</span><a name="line.592"></a>
+<span class="sourceLineNo">593</span>  @Override<a name="line.593"></a>
+<span class="sourceLineNo">594</span>  public void preReplayWALs(ObserverContext&lt;? extends RegionCoprocessorEnvironment&gt; env,<a name="line.594"></a>
+<span class="sourceLineNo">595</span>      RegionInfo info, Path edits) throws IOException {<a name="line.595"></a>
+<span class="sourceLineNo">596</span>    ctPreReplayWALs.incrementAndGet();<a name="line.596"></a>
+<span class="sourceLineNo">597</span>  }<a name="line.597"></a>
+<span class="sourceLineNo">598</span><a name="line.598"></a>
+<span class="sourceLineNo">599</span>  @Override<a name="line.599"></a>
+<span class="sourceLineNo">600</span>  public void postReplayWALs(ObserverContext&lt;? extends RegionCoprocessorEnvironment&gt; env,<a name="line.600"></a>
+<span class="sourceLineNo">601</span>      RegionInfo info, Path edits) throws IOException {<a name="line.601"></a>
+<span class="sourceLineNo">602</span>    ctPostReplayWALs.incrementAndGet();<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>  @Override<a name="line.605"></a>
+<span class="sourceLineNo">606</span>  public void preWALRestore(ObserverContext&lt;? extends RegionCoprocessorEnvironment&gt; env,<a name="line.606"></a>
+<span class="sourceLineNo">607</span>      RegionInfo info, WALKey logKey, WALEdit logEdit) throws IOException {<a name="line.607"></a>
+<span class="sourceLineNo">608</span>    String tableName = logKey.getTableName().getNameAsString();<a name="line.608"></a>
+<span class="sourceLineNo">609</span>    if (tableName.equals(TABLE_SKIPPED)) {<a name="line.609"></a>
+<span class="sourceLineNo">610</span>      // skip recovery of TABLE_SKIPPED for testing purpose<a name="line.610"></a>
+<span class="sourceLineNo">611</span>      env.bypass();<a name="line.611"></a>
+<span class="sourceLineNo">612</span>      return;<a name="line.612"></a>
+<span class="sourceLineNo">613</span>    }<a name="line.613"></a>
+<span class="sourceLineNo">614</span>    ctPreWALRestore.incrementAndGet();<a name="line.614"></a>
+<span class="sourceLineNo">615</span>  }<a name="line.615"></a>
+<span class="sourceLineNo">616</span><a name="line.616"></a>
+<span class="sourceLineNo">617</span>  @Override<a name="line.617"></a>
+<span class="sourceLineNo">618</span>  public void postWALRestore(ObserverContext&lt;? extends RegionCoprocessorEnvironment&gt; env,<a name="line.618"></a>
+<span class="sourceLineNo">619</span>                             RegionInfo info, WALKey logKey, WALEdit logEdit) throws IOException {<a name="line.619"></a>
+<span class="sourceLineNo">620</span>    ctPostWALRestore.incrementAndGet();<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>  @Override<a name="line.623"></a>
+<span class="sourceLineNo">624</span>  public StoreFileReader preStoreFileReaderOpen(ObserverContext&lt;RegionCoprocessorEnvironment&gt; ctx,<a name="line.624"></a>
+<span class="sourceLineNo">625</span>      FileSystem fs, Path p, FSDataInputStreamWrapper in, long size, CacheConfig cacheConf,<a name="line.625"></a>
+<span class="sourceLineNo">626</span>      Reference r, StoreFileReader reader) throws IOException {<a name="line.626"></a>
+<span class="sourceLineNo">627</span>    ctPreStoreFileReaderOpen.incrementAndGet();<a name="line.627"></a>
+<span class="sourceLineNo">628</span>    return null;<a name="line.628"></a>
+<span class="sourceLineNo">629</span>  }<a name="line.629"></a>
+<span class="sourceLineNo">630</span><a name="line.630"></a>
+<span class="sourceLineNo">631</span>  @Override<a name="line.631"></a>
+<span class="sourceLineNo">632</span>  public StoreFileReader postStoreFileReaderOpen(ObserverContext&lt;RegionCoprocessorEnvironment&gt; ctx,<a name="line.632"></a>
+<span class="sourceLineNo">633</span>      FileSystem fs, Path p, FSDataInputStreamWrapper in, long size, CacheConfig cacheConf,<a name="line.633"></a>
+<span class="sourceLineNo">634</span>      Reference r, StoreFileReader reader) throws IOException {<a name="line.634"></a>
+<span class="sourceLineNo">635</span>    ctPostStoreFileReaderOpen.incrementAndGet();<a name="line.635"></a>
+<span class="sourceLineNo">636</span>    return reader;<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>  @Override<a name="line.639"></a>
+<span class="sourceLineNo">640</span>  public void preWALAppend(ObserverContext&lt;RegionCoprocessorEnvironment&gt; ctx,<a name="line.640"></a>
+<span class="sourceLineNo">641</span>                                 WALKey key, WALEdit edit) throws IOException {<a name="line.641"></a>
+<span class="sourceLineNo">642</span>    ctPreWALAppend.incrementAndGet();<a name="line.642"></a>
+<span class="sourceLineNo">643</span><a name="line.643"></a>
+<span class="sourceLineNo">644</span>    key.addExtendedAttribute(Integer.toString(ctPreWALAppend.get()),<a name="line.644"></a>
+<span class="sourceLineNo">645</span>        Bytes.toBytes("foo"));<a name="line.645"></a>
+<span class="sourceLineNo">646</span>  }<a name="line.646"></a>
+<span class="sourceLineNo">647</span><a name="line.647"></a>
+<span class="sourceLineNo">648</span>  public boolean hadPreGet() {<a name="line.648"></a>
+<span class="sourceLineNo">649</span>    return ctPreGet.get() &gt; 0;<a name="line.649"></a>
+<span class="sourceLineNo">650</span>  }<a name="line.650"></a>
+<span class="sourceLineNo">651</span><a name="line.651"></a>
+<span class="sourceLineNo">652</span>  public boolean hadPostGet() {<a name="line.652"></a>
+<span class="sourceLineNo">653</span>    return ctPostGet.get() &gt; 0;<a name="line.653"></a>
+<span class="sourceLineNo">654</span>  }<a name="line.654"></a>
+<span class="sourceLineNo">655</span><a name="line.655"></a>
+<span class="sourceLineNo">656</span>  public boolean hadPrePut() {<a name="line.656"></a>
+<span class="sourceLineNo">657</span>    return ctPrePut.get() &gt; 0;<a name="line.657"></a>
+<span class="sourceLineNo">658</span>  }<a name="line.658"></a>
+<span class="sourceLineNo">659</span><a name="line.659"></a>
+<span class="sourceLineNo">660</span>  public boolean hadPostPut() {<a name="line.660"></a>
+<span class="sourceLineNo">661</span>    return ctPostPut.get() &gt; 0;<a name="line.661"></a>
+<span class="sourceLineNo">662</span>  }<a name="line.662"></a>
+<span class="sourceLineNo">663</span><a name="line.663"></a>
+<span class="sourceLineNo">664</span>  public boolean hadPreBatchMutate() {<a name="line.664"></a>
+<span class="sourceLineNo">665</span>    return ctPreBatchMutate.get() &gt; 0;<a name="line.665"></a>
+<span class="sourceLineNo">666</span>  }<a name="line.666"></a>
+<span class="sourceLineNo">667</span><a name="line.667"></a>
+<span class="sourceLineNo">668</span>  public boolean hadPostBatchMutate() {<a name="line.668"></a>
+<span class="sourceLineNo">669</span>    return ctPostBatchMutate.get() &gt; 0;<a name="line.669"></a>
+<span class="sourceLineNo">670</span>  }<a name="line.670"></a>
+<span class="sourceLineNo">671</span><a name="line.671"></a>
+<span class="sourceLineNo">672</span>  public boolean hadPostBatchMutateIndispensably() {<a name="line.672"></a>
+<span class="sourceLineNo">673</span>    return ctPostBatchMutateIndispensably.get() &gt; 0;<a name="line.673"></a>
+<span class="sourceLineNo">674</span>  }<a name="line.674"></a>
+<span class="sourceLineNo">675</span><a name="line.675"></a>
+<span class="sourceLineNo">676</span>  public boolean hadPostStartRegionOperation() {<a name="line.676"></a>
+<span class="sourceLineNo">677</span>    return ctPostStartRegionOperation.get() &gt; 0;<a name="line.677"></a>
+<span class="sourceLineNo">678</span>  }<a name="line.678"></a>
+<span class="sourceLineNo">679</span><a name="line.679"></a>
+<span class="sourceLineNo">680</span>  public boolean hadPostCloseRegionOperation() {<a name="line.680"></a>
+<span class="sourceLineNo">681</span>    return ctPostCloseRegionOperation.get() &gt; 0;<a name="line.681"></a>
+<span class="sourceLineNo">682</span>  }<a name="line.682"></a>
+<span class="sourceLineNo">683</span><a name="line.683"></a>
+<span class="sourceLineNo">684</span>  public boolean hadDelete() {<a name="line.684"></a>
+<span class="sourceLineNo">685</span>    return !(ctBeforeDelete.get() &gt; 0);<a name="line.685"></a>
+<span class="sourceLineNo">686</span>  }<a name="line.686"></a>
+<span class="sourceLineNo">687</span><a name="line.687"></a>
+<span class="sourceLineNo">688</span>  public int getCtPostStartRegionOperation() {<a name="line.688"></a>
+<span class="sourceLineNo">689</span>    return ctPostStartRegionOperation.get();<a name="line.689"></a>
+<span class="sourceLineNo">690</span>  }<a name="line.690"></a>
+<span class="sourceLineNo">691</span><a name="line.691"></a>
+<span class="sourceLineNo">692</span>  public int getCtPostCloseRegionOperation() {<a name="line.692"></a>
+<span class="sourceLineNo">693</span>    return ctPostCloseRegionOperation.get();<a name="line.693"></a>
+<span class="sourceLineNo">694</span>  }<a name="line.694"></a>
+<span class="sourceLineNo">695</span><a name="line.695"></a>
+<span class="sourceLineNo">696</span>  public boolean hadPreCheckAndPut() {<a name="line.696"></a>
+<span class="sourceLineNo">697</span>    return ctPreCheckAndPut.get() &gt; 0;<a name="line.697"></a>
+<span class="sourceLineNo">698</span>  }<a name="line.698"></a>
+<span class="sourceLineNo">699</span><a name="line.699"></a>
+<span class="sourceLineNo">700</span>  public boolean hadPreCheckAndPutAfterRowLock() {<a name="line.700"></a>
+<span class="sourceLineNo">701</span>    return ctPreCheckAndPutAfterRowLock.get() &gt; 0;<a name="line.701"></a>
+<span class="sourceLineNo">702</span>  }<a name="line.702"></a>
+<span class="sourceLineNo">703</span><a name="line.703"></a>
+<span class="sourceLineNo">704</span>  public boolean hadPostCheckAndPut() {<a name="line.704"></a>
+<span class="sourceLineNo">705</span>    return ctPostCheckAndPut.get() &gt; 0;<a name="line.705"></a>
+<span class="sourceLineNo">706</span>  }<a name="line.706"></a>
+<span class="sourceLineNo">707</span><a name="line.707"></a>
+<span class="sourceLineNo">708</span>  public boolean hadPreCheckAndDelete() {<a name="line.708"></a>
+<span class="sourceLineNo">709</span>    return ctPreCheckAndDelete.get() &gt; 0;<a name="line.709"></a>
+<span class="sourceLineNo">710</span>  }<a name="line.710"></a>
+<span class="sourceLineNo">711</span><a name="line.711"></a>
+<span class="sourceLineNo">712</span>  public boolean hadPreCheckAndDeleteAfterRowLock() {<a name="line.712"></a>
+<span class="sourceLineNo">713</span>    return ctPreCheckAndDeleteAfterRowLock.get() &gt; 0;<a name="line.713"></a>
+<span class="sourceLineNo">714</span>  }<a name="line.714"></a>
+<span class="sourceLineNo">715</span><a name="line.715"></a>
+<span class="sourceLineNo">716</span>  public boolean hadPostCheckAndDelete() {<a name="line.716"></a>
+<span class="sourceLineNo">717</span>    return ctPostCheckAndDelete.get() &gt; 0;<a name="line.717"></a>
+<span class="sourceLineNo">718</span>  }<a name="line.718"></a>
+<span class="sourceLineNo">719</span><a name="line.719"></a>
+<span class="sourceLineNo">720</span>  public boolean hadPreIncrement() {<a name="line.720"></a>
+<span class="sourceLineNo">721</span>    return ctPreIncrement.get() &gt; 0;<a name="line.721"></a>
+<span class="sourceLineNo">722</span>  }<a name="line.722"></a>
+<span class="sourceLineNo">723</span><a name="line.723"></a>
+<span class="sourceLineNo">724</span>  public boolean hadPreIncrementAfterRowLock() {<a name="line.724"></a>
+<span class="sourceLineNo">725</span>    return ctPreIncrementAfterRowLock.get() &gt; 0;<a name="line.725"></a>
+<span class="sourceLineNo">726</span>  }<a name="line.726"></a>
+<span class="sourceLineNo">727</span><a name="line.727"></a>
+<span class="sourceLineNo">728</span>  public boolean hadPostIncrement() {<a name="line.728"></a>
+<span class="sourceLineNo">729</span>    return ctPostIncrement.get() &gt; 0;<a name="line.729"></a>
+<span class="sourceLineNo">730</span>  }<a name="line.730"></a>
+<span class="sourceLineNo">731</span><a name="line.731"></a>
+<span class="sourceLineNo">732</span>  public boolean hadPreAppend() {<a name="line.732"></a>
+<span class="sourceLineNo">733</span>    return ctPreAppend.get() &gt; 0;<a name="line.733"></a>
+<span class="sourceLineNo">734</span>  }<a name="line.734"></a>
+<span class="sourceLineNo">735</span><a name="line.735"></a>
+<span class="sourceLineNo">736</span>  public boolean hadPreAppendAfterRowLock() {<a name="line.736"></a>
+<span class="sourceLineNo">737</span>    return ctPreAppendAfterRowLock.get() &gt; 0;<a name="line.737"></a>
+<span class="sourceLineNo">738</span>  }<a name="line.738"></a>
+<span class="sourceLineNo">739</span><a name="line.739"></a>
+<span class="sourceLineNo">740</span>  public boolean hadPostAppend() {<a name="line.740"></a>
+<span class="sourceLineNo">741</span>    return ctPostAppend.get() &gt; 0;<a name="line.741"></a>
+<span class="sourceLineNo">742</span>  }<a name="line.742"></a>
+<span class="sourceLineNo">743</span><a name="line.743"></a>
+<span class="sourceLineNo">744</span>  public boolean hadPrePreparedDeleteTS() {<a name="line.744"></a>
+<span class="sourceLineNo">745</span>    return ctPrePrepareDeleteTS.get() &gt; 0;<a name="line.745"></a>
+<span class="sourceLineNo">746</span>  }<a name="line.746"></a>
+<span class="sourceLineNo">747</span><a name="line.747"></a>
+<span class="sourceLineNo">748</span>  public boolean hadPreReplayWALs() {<a name="line.748"></a>
+<span class="sourceLineNo">749</span>    return ctPreReplayWALs.get() &gt; 0;<a name="line.749"></a>
+<span class="sourceLineNo">750</span>  }<a name="line.750"></a>
+<span class="sourceLineNo">751</span><a name="line.751"></a>
+<span class="sourceLineNo">752</span>  public boolean hadPostReplayWALs() {<a name="line.752"></a>
+<span class="sourceLineNo">753</span>    return ctPostReplayWALs.get() &gt; 0;<a name="line.753"></a>
+<span class="sourceLineNo">754</span>  }<a name="line.754"></a>
+<span class="sourceLineNo">755</span><a name="line.755"></a>
+<span class="sourceLineNo">756</span>  public boolean hadPreWALRestore() {<a name="line.756"></a>
+<span class="sourceLineNo">757</span>    return ctPreWALRestore.get() &gt; 0;<a name="line.757"></a>
 <span class="sourceLineNo">758</span>  }<a name="line.758"></a>
-<span class="sourceLineNo">759</span>  public boolean wasScannerOpenCalled() {<a name="line.759"></a>
-<span class="sourceLineNo">760</span>    return ctPreScannerOpen.get() &gt; 0 &amp;&amp; ctPostScannerOpen.get() &gt; 0;<a name="line.760"></a>
-<span class="sourceLineNo">761</span>  }<a name="line.761"></a>
-<span class="sourceLineNo">762</span>  public boolean hadDeleted() {<a name="line.762"></a>
-<span class="sourceLineNo">763</span>    return ctPreDeleted.get() &gt; 0 &amp;&amp; ctPostDeleted.get() &gt; 0;<a name="line.763"></a>
-<span class="sourceLineNo">764</span>  }<a name="line.764"></a>
-<span class="sourceLineNo">765</span><a name="line.765"></a>
-<span class="sourceLineNo">766</span>  public boolean hadPostBulkLoadHFile() {<a name="line.766"></a>
-<span class="sourceLineNo">767</span>    return ctPostBulkLoadHFile.get() &gt; 0;<a name="line.767"></a>
-<span class="sourceLineNo">768</span>  }<a name="line.768"></a>
-<span class="sourceLineNo">769</span><a name="line.769"></a>
-<span class="sourceLineNo">770</span>  public boolean hadPreBulkLoadHFile() {<a name="line.770"></a>
-<span class="sourceLineNo">771</span>    return ctPreBulkLoadHFile.get() &gt; 0;<a name="line.771"></a>
+<span class="sourceLineNo">759</span><a name="line.759"></a>
+<span class="sourceLineNo">760</span>  public boolean hadPostWALRestore() {<a name="line.760"></a>
+<span class="sourceLineNo">761</span>    return ctPostWALRestore.get() &gt; 0;<a name="line.761"></a>
+<span class="sourceLineNo">762</span>  }<a name="line.762"></a>
+<span class="sourceLineNo">763</span><a name="line.763"></a>
+<span class="sourceLineNo">764</span>  public boolean wasScannerNextCalled() {<a name="line.764"></a>
+<span class="sourceLineNo">765</span>    return ctPreScannerNext.get() &gt; 0 &amp;&amp; ctPostScannerNext.get() &gt; 0;<a name="line.765"></a>
+<span class="sourceLineNo">766</span>  }<a name="line.766"></a>
+<span class="sourceLineNo">767</span>  public boolean wasScannerFilterRowCalled() {<a name="line.767"></a>
+<span class="sourceLineNo">768</span>    return ctPostScannerFilterRow.get() &gt; 0;<a name="line.768"></a>
+<span class="sourceLineNo">769</span>  }<a name="line.769"></a>
+<span class="sourceLineNo">770</span>  public boolean wasScannerCloseCalled() {<a name="line.770"></a>
+<span class="sourceLineNo">771</span>    return ctPreScannerClose.get() &gt; 0 &amp;&amp; ctPostScannerClose.get() &gt; 0;<a name="line.771"></a>
 <span class="sourceLineNo">772</span>  }<a name="line.772"></a>
-<span class="sourceLineNo">773</span><a name="line.773"></a>
-<span class="sourceLineNo">774</span><a name="line.774"></a>
-<span class="sourceLineNo">775</span>  public int getCtBeforeDelete() {<a name="line.775"></a>
-<span class="sourceLineNo">776</span>    return ctBeforeDelete.get();<a name="line.776"></a>
-<span class="sourceLineNo">777</span>  }<a name="line.777"></a>
-<span class="sourceLineNo">778</span><a name="line.778"></a>
-<span class="sourceLineNo">779</span>  public int getCtPreOpen() {<a name="line.779"></a>
-<span class="sourceLineNo">780</span>    return ctPreOpen.get();<a name="line.780"></a>
-<span class="sourceLineNo">781</span>  }<a name="line.781"></a>
-<span class="sourceLineNo">782</span><a name="line.782"></a>
-<span class="sourceLineNo">783</span>  public int getCtPostOpen() {<a name="line.783"></a>
-<span class="sourceLineNo">784</span>    return ctPostOpen.get();<a name="line.784"></a>
-<span class="sourceLineNo">785</span>  }<a name="line.785"></a>
-<span class="sourceLineNo">786</span><a name="line.786"></a>
-<span class="sourceLineNo">787</span>  public int getCtPreClose() {<a name="line.787"></a>
-<span class="sourceLineNo">788</span>    return ctPreClose.get();<a name="line.788"></a>
-<span class="sourceLineNo">789</span>  }<a name="line.789"></a>
-<span class="sourceLineNo">790</span><a name="line.790"></a>
-<span class="sourceLineNo">791</span>  public int getCtPostClose() {<a name="line.791"></a>
-<span class="sourceLineNo">792</span>    return ctPostClose.get();<a name="line.792"></a>
-<span class="sourceLineNo">793</span>  }<a name="line.793"></a>
-<span class="sourceLineNo">794</span><a name="line.794"></a>
-<span class="sourceLineNo">795</span>  public int getCtPreFlush() {<a name="line.795"></a>
-<span class="sourceLineNo">796</span>    return ctPreFlush.get();<a name="line.796"></a>
-<span class="sourceLineNo">797</span>  }<a name="line.797"></a>
-<span class="sourceLineNo">798</span><a name="line.798"></a>
-<span class="sourceLineNo">799</span>  public int getCtPostFlush() {<a name="line.799"></a>
-<span class="sourceLineNo">800</span>    return ctPostFlush.get();<a name="line.800"></a>
-<span class="sourceLineNo">801</span>  }<a name="line.801"></a>
-<span class="sourceLineNo">802</span><a name="line.802"></a>
-<span class="sourceLineNo">803</span>  public int getCtPreCompactSelect() {<a name="line.803"></a>
-<span class="sourceLineNo">804</span>    return ctPreCompactSelect.get();<a name="line.804"></a>
-<span class="sourceLineNo">805</span>  }<a name="line.805"></a>
-<span class="sourceLineNo">806</span><a name="line.806"></a>
-<span class="sourceLineNo">807</span>  public int getCtPostCompactSelect() {<a name="line.807"></a>
-<span class="sourceLineNo">808</span>    return ctPostCompactSelect.get();<a name="line.808"></a>
-<span class="sourceLineNo">809</span>  }<a name="line.809"></a>
-<span class="sourceLineNo">810</span><a name="line.810"></a>
-<span class="sourceLineNo">811</span>  public int getCtPreCompact() {<a name="line.811"></a>
-<span class="sourceLineNo">812</span>    return ctPreCompact.get();<a name="line.812"></a>
-<span class="sourceLineNo">813</span>  }<a name="line.813"></a>
-<span class="sourceLineNo">814</span><a name="line.814"></a>
-<span class="sourceLineNo">815</span>  public int getCtPostCompact() {<a name="line.815"></a>
-<span class="sourceLineNo">816</span>    return ctPostCompact.get();<a name="line.816"></a>
-<span class="sourceLineNo">817</span>  }<a name="line.817"></a>
-<span class="sourceLineNo">818</span><a name="line.818"></a>
-<span class="sourceLineNo">819</span>  public int getCtPreGet() {<a name="line.819"></a>
-<span class="sourceLineNo">820</span>    return ctPreGet.get();<a name="line.820"></a>
-<span class="sourceLineNo">821</span>  }<a name="line.821"></a>
-<span class="sourceLineNo">822</span><a name="line.822"></a>
-<span class="sourceLineNo">823</span>  public int getCtPostGet() {<a name="line.823"></a>
-<span class="sourceLineNo">824</span>    return ctPostGet.get();<a name="line.824"></a>
-<span class="sourceLineNo">825</span>  }<a name="line.825"></a>
-<span class="sourceLineNo">826</span><a name="line.826"></a>
-<span class="sourceLineNo">827</span>  public int getCtPrePut() {<a name="line.827"></a>
-<span class="sourceLineNo">828</span>    return ctPrePut.get();<a name="line.828"></a>
-<span class="sourceLineNo">829</span>  }<a name="line.829"></a>
-<span class="sourceLineNo">830</span><a name="line.830"></a>
-<span class="sourceLineNo">831</span>  public int getCtPostPut() {<a name="line.831"></a>
-<span class="sourceLineNo">832</span>    return ctPostPut.get();<a name="line.832"></a>
-<span class="sourceLineNo">833</span>  }<a name="line.833"></a>
-<span class="sourceLineNo">834</span><a name="line.834"></a>
-<span class="sourceLineNo">835</span>  public int getCtPreDeleted() {<a name="line.835"></a>
-<span class="sourceLineNo">836</span>    return ctPreDeleted.get();<a name="line.836"></a>
-<span class="sourceLineNo">837</span>  }<a name="line.837"></a>
-<span class="sourceLineNo">838</span><a name="line.838"></a>
-<span class="sourceLineNo">839</span>  public int getCtPostDeleted() {<a name="line.839"></a>
-<span class="sourceLineNo">840</span>    return ctPostDeleted.get();<a name="line.840"></a>
-<span class="sourceLineNo">841</span>  }<a name="line.841"></a>
-<span class="sourceLineNo">842</span><a name="line.842"></a>
-<span class="sourceLineNo">843</span>  public int getCtPreIncrement() {<a name="line.843"></a>
-<span class="sourceLineNo">844</span>    return ctPreIncrement.get();<a name="line.844"></a>
-<span class="sourceLineNo">845</span>  }<a name="line.845"></a>
-<span class="sourceLineNo">846</span><a name="line.846"></a>
-<span class="sourceLineNo">847</span>  public int getCtPostIncrement() {<a name="line.847"></a>
-<span class="sourceLineNo">848</span>    return ctPostIncrement.get();<a name="line.848"></a>
-<span class="sourceLineNo">849</span>  }<a name="line.849"></a>
-<span class="sourceLineNo">850</span><a name="line.850"></a>
-<span class="sourceLineNo">851</span>  public int getCtPreReplayWALs() {<a name="line.851"></a>
-<span class="sourceLineNo">852</span>    return ctPreReplayWALs.get();<a name="line.852"></a>
-<span class="sourceLineNo">853</span>  }<a name="line.853"></a>
-<span class="sourceLineNo">854</span><a name="line.854"></a>
-<span class="sourceLineNo">855</span>  public int getCtPostReplayWALs() {<a name="line.855"></a>
-<span class="sourceLineNo">856</span>    return ctPostReplayWALs.get();<a name="line.856"></a>
-<span class="sourceLineNo">857</span>  }<a name="line.857"></a>
-<span class="sourceLineNo">858</span><a name="line.858"></a>
-<span class="sourceLineNo">859</span>  public int getCtPreWALRestore() {<a name="line.859"></a>
-<span class="sourceLineNo">860</span>    return ctPreWALRestore.get();<a name="line.860"></a>
-<span class="sourceLineNo">861</span>  }<a name="line.861"></a>
-<span class="sourceLineNo">862</span><a name="line.862"></a>
-<span class="sourceLineNo">863</span>  public int getCtPostWALRestore() {<a name="line.863"></a>
-<span class="sourceLineNo">864</span>    return ctPostWALRestore.get();<a name="line.864"></a>
-<span class="sourceLineNo">865</span>  }<a name="line.865"></a>
-<span class="sourceLineNo">866</span><a name="line.866"></a>
-<span class="sourceLineNo">867</span>  public boolean wasStoreFileReaderOpenCalled() {<a name="line.867"></a>
-<span class="sourceLineNo">868</span>    return ctPreStoreFileReaderOpen.get() &gt; 0 &amp;&amp; ctPostStoreFileReaderOpen.get() &gt; 0;<a name="line.868"></a>
-<span class="sourceLineNo">869</span>  }<a name="line.869"></a>
-<span class="sourceLineNo">870</span>}<a name="line.870"></a>
+<span class="sourceLineNo">773</span>  public boolean wasScannerOpenCalled() {<a name="line.773"></a>
+<span class="sourceLineNo">774</span>    return ctPreScannerOpen.get() &gt; 0 &amp;&amp; ctPostScannerOpen.get() &gt; 0;<a name="line.774"></a>
+<span class="sourceLineNo">775</span>  }<a name="line.775"></a>
+<span class="sourceLineNo">776</span>  public boolean hadDeleted() {<a name="line.776"></a>
+<span class="sourceLineNo">777</span>    return ctPreDeleted.get() &gt; 0 &amp;&amp; ctPostDeleted.get() &gt; 0;<a name="line.777"></a>
+<span class="sourceLineNo">778</span>  }<a name="line.778"></a>
+<span class="sourceLineNo">779</span><a name="line.779"></a>
+<span class="sourceLineNo">780</span>  public boolean hadPostBulkLoadHFile() {<a name="line.780"></a>
+<span class="sourceLineNo">781</span>    return ctPostBulkLoadHFile.get() &gt; 0;<a name="line.781"></a>
+<span class="sourceLineNo">782</span>  }<a name="line.782"></a>
+<span class="sourceLineNo">783</span><a name="line.783"></a>
+<span class="sourceLineNo">784</span>  public boolean hadPreBulkLoadHFile() {<a name="line.784"></a>
+<span class="sourceLineNo">785</span>    return ctPreBulkLoadHFile.get() &gt; 0;<a name="line.785"></a>
+<span class="sourceLineNo">786</span>  }<a name="line.786"></a>
+<span class="sourceLineNo">787</span><a name="line.787"></a>
+<span class="sourceLineNo">788</span><a name="line.788"></a>
+<span class="sourceLineNo">789</span>  public int getCtBeforeDelete() {<a name="line.789"></a>
+<span class="sourceLineNo">790</span>    return ctBeforeDelete.get();<a name="line.790"></a>
+<span class="sourceLineNo">791</span>  }<a name="line.791"></a>
+<span class="sourceLineNo">792</span><a name="line.792"></a>
+<span class="sourceLineNo">793</span>  public int getCtPreOpen() {<a name="line.793"></a>
+<span class="sourceLineNo">794</span>    return ctPreOpen.get();<a name="line.794"></a>
+<span class="sourceLineNo">795</span>  }<a name="line.795"></a>
+<span class="sourceLineNo">796</span><a name="line.796"></a>
+<span class="sourceLineNo">797</span>  public int getCtPostOpen() {<a name="line.797"></a>
+<span class="sourceLineNo">798</span>    return ctPostOpen.get();<a name="line.798"></a>
+<span class="sourceLineNo">799</span>  }<a name="line.799"></a>
+<span class="sourceLineNo">800</span><a name="line.800"></a>
+<span class="sourceLineNo">801</span>  public int getCtPreClose() {<a name="line.801"></a>
+<span class="sourceLineNo">802</span>    return ctPreClose.get();<a name="line.802"></a>
+<span class="sourceLineNo">803</span>  }<a name="line.803"></a>
+<span class="sourceLineNo">804</span><a name="line.804"></a>
+<span class="sourceLineNo">805</span>  public int getCtPostClose() {<a name="line.805"></a>
+<span class="sourceLineNo">806</span>    return ctPostClose.get();<a name="line.806"></a>
+<span class="sourceLineNo">807</span>  }<a name="line.807"></a>
+<span class="sourceLineNo">808</span><a name="line.808"></a>
+<span class="sourceLineNo">809</span>  public int getCtPreFlush() {<a name="line.809"></a>
+<span class="sourceLineNo">810</span>    return ctPreFlush.get();<a name="line.810"></a>
+<span class="sourceLineNo">811</span>  }<a name="line.811"></a>
+<span class="sourceLineNo">812</span><a name="line.812"></a>
+<span class="sourceLineNo">813</span>  public int getCtPostFlush() {<a name="line.813"></a>
+<span class="sourceLineNo">814</span>    return ctPostFlush.get();<a name="line.814"></a>
+<span class="sourceLineNo">815</span>  }<a name="line.815"></a>
+<span class="sourceLineNo">816</span><a name="line.816"></a>
+<span class="sourceLineNo">817</span>  public int getCtPreCompactSelect() {<a name="line.817"></a>
+<span class="sourceLineNo">818</span>    return ctPreCompactSelect.get();<a name="line.818"></a>
+<span class="sourceLineNo">819</span>  }<a name="line.819"></a>
+<span class="sourceLineNo">820</span><a name="line.820"></a>
+<span class="sourceLineNo">821</span>  public int getCtPostCompactSelect() {<a name="line.821"></a>
+<span class="sourceLineNo">822</span>    return ctPostCompactSelect.get();<a name="line.822"></a>
+<span class="sourceLineNo">823</span>  }<a name="line.823"></a>
+<span class="sourceLineNo">824</span><a name="line.824"></a>
+<span class="sourceLineNo">825</span>  public int getCtPreCompact() {<a name="line.825"></a>
+<span class="sourceLineNo">826</span>    return ctPreCompact.get();<a name="line.826"></a>
+<span class="sourceLineNo">827</span>  }<a name="line.827"></a>
+<span class="sourceLineNo">828</span><a name="line.828"></a>
+<span class="sourceLineNo">829</span>  public int getCtPostCompact() {<a name="line.829"></a>
+<span class="sourceLineNo">830</span>    return ctPostCompact.get();<a name="line.830"></a>
+<span class="sourceLineNo">831</span>  }<a name="line.831"></a>
+<span class="sourceLineNo">832</span><a name="line.832"></a>
+<span class="sourceLineNo">833</span>  public int getCtPreGet() {<a name="line.833"></a>
+<span class="sourceLineNo">834</span>    return ctPreGet.get();<a name="line.834"></a>
+<span class="sourceLineNo">835</span>  }<a name="line.835"></a>
+<span class="sourceLineNo">836</span><a name="line.836"></a>
+<span class="sourceLineNo">837</span>  public int getCtPostGet() {<a name="line.837"></a>
+<span class="sourceLineNo">838</span>    return ctPostGet.get();<a name="line.838"></a>
+<span class="sourceLineNo">839</span>  }<a name="line.839"></a>
+<span class="sourceLineNo">840</span><a name="line.840"></a>
+<span class="sourceLineNo">841</span>  public int getCtPrePut() {<a name="line.841"></a>
+<span class="sourceLineNo">842</span>    return ctPrePut.get();<a name="line.842"></a>
+<span class="sourceLineNo">843</span>  }<a name="line.843"></a>
+<span class="sourceLineNo">844</span><a name="line.844"></a>
+<span class="sourceLineNo">845</span>  public int getCtPostPut() {<a name="line.845"></a>
+<span class="sourceLineNo">846</span>    return ctPostPut.get();<a name="line.846"></a>
+<span class="sourceLineNo">847</span>  }<a name="line.847"></a>
+<span class="sourceLineNo">848</span><a name="line.848"></a>
+<span class="sourceLineNo">849</span>  public int getCtPreDeleted() {<a name="line.849"></a>
+<span class="sourceLineNo">850</span>    return ctPreDeleted.get();<a name="line.850"></a>
+<span class="sourceLineNo">851</span>  }<a name="line.851"></a>
+<span class="sourceLineNo">852</span><a name="line.852"></a>
+<span class="sourceLineNo">853</span>  public int getCtPostDeleted() {<a name="line.853"></a>
+<span class="sourceLineNo">854</span>    return ctPostDeleted.get();<a name="line.854"></a>
+<span class="sourceLineNo">855</span>  }<a name="line.855"></a>
+<span class="sourceLineNo">856</span><a name="line.856"></a>
+<span class="sourceLineNo">857</span>  public int getCtPreIncrement() {<a name="line.857"></a>
+<span class="sourceLineNo">858</span>    return ctPreIncrement.get();<a name="line.858"></a>
+<span class="sourceLineNo">859</span>  }<a name="line.859"></a>
+<span class="sourceLineNo">860</span><a name="line.860"></a>
+<span class="sourceLineNo">861</span>  public int getCtPostIncrement() {<a name="line.861"></a>
+<span class="sourceLineNo">862</span>    return ctPostIncrement.get();<a name="line.862"></a>
+<span class="sourceLineNo">863</span>  }<a name="line.863"></a>
+<span class="sourceLineNo">864</span><a name="line.864"></a>
+<span class="sourceLineNo">865</span>  public int getCtPreReplayWALs() {<a name="line.865"></a>
+<span class="sourceLineNo">866</span>    return ctPreReplayWALs.get();<a name="line.866"></a>
+<span class="sourceLineNo">867</span>  }<a name="line.867"></a>
+<span class="sourceLineNo">868</span><a name="line.868"></a>
+<span class="sourceLineNo">869</span>  public int getCtPostReplayWALs() {<a name="line.869"></a>
+<span class="sourceLineNo">870</span>    return ctPostReplayWALs.get();<a name="line.870"></a>
+<span class="sourceLineNo">871</span>  }<a name="line.871"></a>
+<span class="sourceLineNo">872</span><a name="line.872"></a>
+<span class="sourceLineNo">873</span>  public int getCtPreWALRestore() {<a name="line.873"></a>
+<span class="sourceLineNo">874</span>    return ctPreWALRestore.get();<a name="line.874"></a>
+<span class="sourceLineNo">875</span>  }<a name="line.875"></a>
+<span class="sourceLineNo">876</span><a name="line.876"></a>
+<span class="sourceLineNo">877</span>  public int getCtPostWALRestore() {<a name="line.877"></a>
+<span class="sourceLineNo">878</span>    return ctPostWALRestore.get();<a name="line.878"></a>
+<span class="sourceLineNo">879</span>  }<a name="line.879"></a>
+<span class="sourceLineNo">880</span><a name="line.880"></a>
+<span class="sourceLineNo">881</span>  public int getCtPreWALAppend() {<a name="line.881"></a>
+<span class="sourceLineNo">882</span>    return ctPreWALAppend.get();<a name="line.882"></a>
+<span class="sourceLineNo">883</span>  }<a name="line.883"></a>
+<span class="sourceLineNo">884</span><a name="line.884"></a>
+<span class="sourceLineNo">885</span>  public boolean wasStoreFileReaderOpenCalled() {<a name="line.885"></a>
+<span class="sourceLineNo">886</span>    return ctPreStoreFileReaderOpen.get() &gt; 0 &amp;&amp; ctPostStoreFileReaderOpen.get() &gt; 0;<a name="line.886"></a>
+<span class="sourceLineNo">887</span>  }<a name="line.887"></a>
+<span class="sourceLineNo">888</span>}<a name="line.888"></a>
 
 
 
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.EvenOnlyCompactor.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.EvenOnlyCompactor.html
index ade26ef..1378078 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.EvenOnlyCompactor.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.EvenOnlyCompactor.html
@@ -33,693 +33,814 @@
 <span class="sourceLineNo">025</span>import java.io.IOException;<a name="line.25"></a>
 <span class="sourceLineNo">026</span>import java.lang.reflect.Method;<a name="line.26"></a>
 <span class="sourceLineNo">027</span>import java.util.ArrayList;<a name="line.27"></a>
-<span class="sourceLineNo">028</span>import java.util.List;<a name="line.28"></a>
-<span class="sourceLineNo">029</span>import java.util.Optional;<a name="line.29"></a>
-<span class="sourceLineNo">030</span>import org.apache.hadoop.conf.Configuration;<a name="line.30"></a>
-<span class="sourceLineNo">031</span>import org.apache.hadoop.fs.FileSystem;<a name="line.31"></a>
-<span class="sourceLineNo">032</span>import org.apache.hadoop.fs.Path;<a name="line.32"></a>
-<span class="sourceLineNo">033</span>import org.apache.hadoop.hbase.Cell;<a name="line.33"></a>
-<span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.CellUtil;<a name="line.34"></a>
-<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.Coprocessor;<a name="line.35"></a>
-<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.HBaseTestingUtility;<a name="line.37"></a>
-<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.HColumnDescriptor;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.HTableDescriptor;<a name="line.39"></a>
-<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.KeyValue;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.MiniHBaseCluster;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.ServerName;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.TableName;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.client.Admin;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.client.Append;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.client.Get;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.client.Put;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.client.RegionLocator;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.client.Result;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.56"></a>
-<span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.client.Table;<a name="line.57"></a>
-<span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.io.hfile.CacheConfig;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.io.hfile.HFile;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.io.hfile.HFileContext;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.io.hfile.HFileContextBuilder;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.regionserver.HRegion;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.regionserver.InternalScanner;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.regionserver.RegionCoprocessorHost;<a name="line.66"></a>
-<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.regionserver.ScanType;<a name="line.67"></a>
-<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.regionserver.ScannerContext;<a name="line.68"></a>
-<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.regionserver.Store;<a name="line.69"></a>
-<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.regionserver.StoreFile;<a name="line.70"></a>
-<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.testclassification.CoprocessorTests;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.testclassification.MediumTests;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.tool.BulkLoadHFiles;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.util.JVMClusterUtil;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.junit.AfterClass;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>import org.junit.BeforeClass;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>import org.junit.ClassRule;<a name="line.82"></a>
-<span class="sourceLineNo">083</span>import org.junit.Rule;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>import org.junit.Test;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>import org.junit.experimental.categories.Category;<a name="line.85"></a>
-<span class="sourceLineNo">086</span>import org.junit.rules.TestName;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>import org.slf4j.Logger;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>import org.slf4j.LoggerFactory;<a name="line.88"></a>
-<span class="sourceLineNo">089</span><a name="line.89"></a>
-<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;<a name="line.90"></a>
-<span class="sourceLineNo">091</span><a name="line.91"></a>
-<span class="sourceLineNo">092</span>@Category({ CoprocessorTests.class, MediumTests.class })<a name="line.92"></a>
-<span class="sourceLineNo">093</span>public class TestRegionObserverInterface {<a name="line.93"></a>
-<span class="sourceLineNo">094</span><a name="line.94"></a>
-<span class="sourceLineNo">095</span>  @ClassRule<a name="line.95"></a>
-<span class="sourceLineNo">096</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.96"></a>
-<span class="sourceLineNo">097</span>      HBaseClassTestRule.forClass(TestRegionObserverInterface.class);<a name="line.97"></a>
-<span class="sourceLineNo">098</span><a name="line.98"></a>
-<span class="sourceLineNo">099</span>  private static final Logger LOG = LoggerFactory.getLogger(TestRegionObserverInterface.class);<a name="line.99"></a>
-<span class="sourceLineNo">100</span><a name="line.100"></a>
-<span class="sourceLineNo">101</span>  public static final TableName TEST_TABLE = TableName.valueOf("TestTable");<a name="line.101"></a>
-<span class="sourceLineNo">102</span>  public final static byte[] A = Bytes.toBytes("a");<a name="line.102"></a>
-<span class="sourceLineNo">103</span>  public final static byte[] B = Bytes.toBytes("b");<a name="line.103"></a>
-<span class="sourceLineNo">104</span>  public final static byte[] C = Bytes.toBytes("c");<a name="line.104"></a>
-<span class="sourceLineNo">105</span>  public final static byte[] ROW = Bytes.toBytes("testrow");<a name="line.105"></a>
-<span class="sourceLineNo">106</span><a name="line.106"></a>
-<span class="sourceLineNo">107</span>  private static HBaseTestingUtility util = new HBaseTestingUtility();<a name="line.107"></a>
-<span class="sourceLineNo">108</span>  private static MiniHBaseCluster cluster = null;<a name="line.108"></a>
-<span class="sourceLineNo">109</span><a name="line.109"></a>
-<span class="sourceLineNo">110</span>  @Rule<a name="line.110"></a>
-<span class="sourceLineNo">111</span>  public TestName name = new TestName();<a name="line.111"></a>
-<span class="sourceLineNo">112</span><a name="line.112"></a>
-<span class="sourceLineNo">113</span>  @BeforeClass<a name="line.113"></a>
-<span class="sourceLineNo">114</span>  public static void setupBeforeClass() throws Exception {<a name="line.114"></a>
-<span class="sourceLineNo">115</span>    // set configure to indicate which cp should be loaded<a name="line.115"></a>
-<span class="sourceLineNo">116</span>    Configuration conf = util.getConfiguration();<a name="line.116"></a>
-<span class="sourceLineNo">117</span>    conf.setBoolean("hbase.master.distributed.log.replay", true);<a name="line.117"></a>
-<span class="sourceLineNo">118</span>    conf.setStrings(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY,<a name="line.118"></a>
-<span class="sourceLineNo">119</span>      SimpleRegionObserver.class.getName());<a name="line.119"></a>
+<span class="sourceLineNo">028</span>import java.util.Arrays;<a name="line.28"></a>
+<span class="sourceLineNo">029</span>import java.util.List;<a name="line.29"></a>
+<span class="sourceLineNo">030</span>import java.util.Optional;<a name="line.30"></a>
+<span class="sourceLineNo">031</span>import org.apache.hadoop.conf.Configuration;<a name="line.31"></a>
+<span class="sourceLineNo">032</span>import org.apache.hadoop.fs.FileSystem;<a name="line.32"></a>
+<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.Cell;<a name="line.34"></a>
+<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.CellUtil;<a name="line.35"></a>
+<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.Coprocessor;<a name="line.36"></a>
+<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.HBaseTestingUtility;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.HColumnDescriptor;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.HTableDescriptor;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.KeyValue;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.MiniHBaseCluster;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.ServerName;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.TableName;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.client.Admin;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.client.Append;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.client.Get;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.client.Put;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.client.RegionLocator;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.client.Result;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.57"></a>
+<span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.58"></a>
+<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.Table;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.TableDescriptor;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.TableDescriptorBuilder;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.io.hfile.CacheConfig;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.io.hfile.HFile;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.io.hfile.HFileContext;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.io.hfile.HFileContextBuilder;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.regionserver.HRegion;<a name="line.68"></a>
+<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.regionserver.InternalScanner;<a name="line.69"></a>
+<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.regionserver.RegionCoprocessorHost;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.regionserver.ScanType;<a name="line.71"></a>
+<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.regionserver.ScannerContext;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.regionserver.Store;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.regionserver.StoreFile;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.regionserver.wal.WALActionsListener;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.testclassification.CoprocessorTests;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.testclassification.MediumTests;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.tool.BulkLoadHFiles;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.81"></a>
+<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.util.JVMClusterUtil;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.wal.WALEdit;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.wal.WALKey;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.wal.WALKeyImpl;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>import org.junit.AfterClass;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>import org.junit.Assert;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>import org.junit.BeforeClass;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>import org.junit.ClassRule;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>import org.junit.Rule;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>import org.junit.Test;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.junit.experimental.categories.Category;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.junit.rules.TestName;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.mockito.Mockito;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.slf4j.Logger;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.slf4j.LoggerFactory;<a name="line.98"></a>
+<span class="sourceLineNo">099</span><a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;<a name="line.100"></a>
+<span class="sourceLineNo">101</span><a name="line.101"></a>
+<span class="sourceLineNo">102</span>@Category({ CoprocessorTests.class, MediumTests.class })<a name="line.102"></a>
+<span class="sourceLineNo">103</span>public class TestRegionObserverInterface {<a name="line.103"></a>
+<span class="sourceLineNo">104</span><a name="line.104"></a>
+<span class="sourceLineNo">105</span>  @ClassRule<a name="line.105"></a>
+<span class="sourceLineNo">106</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.106"></a>
+<span class="sourceLineNo">107</span>      HBaseClassTestRule.forClass(TestRegionObserverInterface.class);<a name="line.107"></a>
+<span class="sourceLineNo">108</span><a name="line.108"></a>
+<span class="sourceLineNo">109</span>  private static final Logger LOG = LoggerFactory.getLogger(TestRegionObserverInterface.class);<a name="line.109"></a>
+<span class="sourceLineNo">110</span><a name="line.110"></a>
+<span class="sourceLineNo">111</span>  public static final TableName TEST_TABLE = TableName.valueOf("TestTable");<a name="line.111"></a>
+<span class="sourceLineNo">112</span>  public static final byte[] FAMILY = Bytes.toBytes("f");<a name="line.112"></a>
+<span class="sourceLineNo">113</span>  public final static byte[] A = Bytes.toBytes("a");<a name="line.113"></a>
+<span class="sourceLineNo">114</span>  public final static byte[] B = Bytes.toBytes("b");<a name="line.114"></a>
+<span class="sourceLineNo">115</span>  public final static byte[] C = Bytes.toBytes("c");<a name="line.115"></a>
+<span class="sourceLineNo">116</span>  public final static byte[] ROW = Bytes.toBytes("testrow");<a name="line.116"></a>
+<span class="sourceLineNo">117</span><a name="line.117"></a>
+<span class="sourceLineNo">118</span>  private static HBaseTestingUtility util = new HBaseTestingUtility();<a name="line.118"></a>
+<span class="sourceLineNo">119</span>  private static MiniHBaseCluster cluster = null;<a name="line.119"></a>
 <span class="sourceLineNo">120</span><a name="line.120"></a>
-<span class="sourceLineNo">121</span>    util.startMiniCluster();<a name="line.121"></a>
-<span class="sourceLineNo">122</span>    cluster = util.getMiniHBaseCluster();<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>  @AfterClass<a name="line.125"></a>
-<span class="sourceLineNo">126</span>  public static void tearDownAfterClass() throws Exception {<a name="line.126"></a>
-<span class="sourceLineNo">127</span>    util.shutdownMiniCluster();<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>  @Test<a name="line.130"></a>
-<span class="sourceLineNo">131</span>  public void testRegionObserver() throws IOException {<a name="line.131"></a>
-<span class="sourceLineNo">132</span>    final TableName tableName = TableName.valueOf(TEST_TABLE.getNameAsString() + "." + name.getMethodName());<a name="line.132"></a>
-<span class="sourceLineNo">133</span>    // recreate table every time in order to reset the status of the<a name="line.133"></a>
-<span class="sourceLineNo">134</span>    // coprocessor.<a name="line.134"></a>
-<span class="sourceLineNo">135</span>    Table table = util.createTable(tableName, new byte[][] { A, B, C });<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    try {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>      verifyMethodResult(SimpleRegionObserver.class,<a name="line.137"></a>
-<span class="sourceLineNo">138</span>        new String[] { "hadPreGet", "hadPostGet", "hadPrePut", "hadPostPut", "hadDelete",<a name="line.138"></a>
-<span class="sourceLineNo">139</span>            "hadPostStartRegionOperation", "hadPostCloseRegionOperation",<a name="line.139"></a>
-<span class="sourceLineNo">140</span>            "hadPostBatchMutateIndispensably" },<a name="line.140"></a>
-<span class="sourceLineNo">141</span>        tableName, new Boolean[] { false, false, false, false, false, false, false, false });<a name="line.141"></a>
-<span class="sourceLineNo">142</span><a name="line.142"></a>
-<span class="sourceLineNo">143</span>      Put put = new Put(ROW);<a name="line.143"></a>
-<span class="sourceLineNo">144</span>      put.addColumn(A, A, A);<a name="line.144"></a>
-<span class="sourceLineNo">145</span>      put.addColumn(B, B, B);<a name="line.145"></a>
-<span class="sourceLineNo">146</span>      put.addColumn(C, C, C);<a name="line.146"></a>
-<span class="sourceLineNo">147</span>      table.put(put);<a name="line.147"></a>
-<span class="sourceLineNo">148</span><a name="line.148"></a>
-<span class="sourceLineNo">149</span>      verifyMethodResult(SimpleRegionObserver.class,<a name="line.149"></a>
-<span class="sourceLineNo">150</span>        new String[] { "hadPreGet", "hadPostGet", "hadPrePut", "hadPostPut", "hadPreBatchMutate",<a name="line.150"></a>
-<span class="sourceLineNo">151</span>            "hadPostBatchMutate", "hadDelete", "hadPostStartRegionOperation",<a name="line.151"></a>
-<span class="sourceLineNo">152</span>            "hadPostCloseRegionOperation", "hadPostBatchMutateIndispensably" },<a name="line.152"></a>
-<span class="sourceLineNo">153</span>        TEST_TABLE,<a name="line.153"></a>
-<span class="sourceLineNo">154</span>        new Boolean[] { false, false, true, true, true, true, false, true, true, true });<a name="line.154"></a>
-<span class="sourceLineNo">155</span><a name="line.155"></a>
-<span class="sourceLineNo">156</span>      verifyMethodResult(SimpleRegionObserver.class,<a name="line.156"></a>
-<span class="sourceLineNo">157</span>        new String[] { "getCtPreOpen", "getCtPostOpen", "getCtPreClose", "getCtPostClose" },<a name="line.157"></a>
-<span class="sourceLineNo">158</span>        tableName, new Integer[] { 1, 1, 0, 0 });<a name="line.158"></a>
+<span class="sourceLineNo">121</span>  @Rule<a name="line.121"></a>
+<span class="sourceLineNo">122</span>  public TestName name = new TestName();<a name="line.122"></a>
+<span class="sourceLineNo">123</span><a name="line.123"></a>
+<span class="sourceLineNo">124</span>  @BeforeClass<a name="line.124"></a>
+<span class="sourceLineNo">125</span>  public static void setupBeforeClass() throws Exception {<a name="line.125"></a>
+<span class="sourceLineNo">126</span>    // set configure to indicate which cp should be loaded<a name="line.126"></a>
+<span class="sourceLineNo">127</span>    Configuration conf = util.getConfiguration();<a name="line.127"></a>
+<span class="sourceLineNo">128</span>    conf.setBoolean("hbase.master.distributed.log.replay", true);<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    conf.setStrings(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY,<a name="line.129"></a>
+<span class="sourceLineNo">130</span>      SimpleRegionObserver.class.getName());<a name="line.130"></a>
+<span class="sourceLineNo">131</span><a name="line.131"></a>
+<span class="sourceLineNo">132</span>    util.startMiniCluster();<a name="line.132"></a>
+<span class="sourceLineNo">133</span>    cluster = util.getMiniHBaseCluster();<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>  @AfterClass<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  public static void tearDownAfterClass() throws Exception {<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    util.shutdownMiniCluster();<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>  @Test<a name="line.141"></a>
+<span class="sourceLineNo">142</span>  public void testRegionObserver() throws IOException {<a name="line.142"></a>
+<span class="sourceLineNo">143</span>    final TableName tableName = TableName.valueOf(TEST_TABLE.getNameAsString() + "." + name.getMethodName());<a name="line.143"></a>
+<span class="sourceLineNo">144</span>    // recreate table every time in order to reset the status of the<a name="line.144"></a>
+<span class="sourceLineNo">145</span>    // coprocessor.<a name="line.145"></a>
+<span class="sourceLineNo">146</span>    Table table = util.createTable(tableName, new byte[][] { A, B, C });<a name="line.146"></a>
+<span class="sourceLineNo">147</span>    try {<a name="line.147"></a>
+<span class="sourceLineNo">148</span>      verifyMethodResult(SimpleRegionObserver.class,<a name="line.148"></a>
+<span class="sourceLineNo">149</span>        new String[] { "hadPreGet", "hadPostGet", "hadPrePut", "hadPostPut", "hadDelete",<a name="line.149"></a>
+<span class="sourceLineNo">150</span>            "hadPostStartRegionOperation", "hadPostCloseRegionOperation",<a name="line.150"></a>
+<span class="sourceLineNo">151</span>            "hadPostBatchMutateIndispensably" },<a name="line.151"></a>
+<span class="sourceLineNo">152</span>        tableName, new Boolean[] { false, false, false, false, false, false, false, false });<a name="line.152"></a>
+<span class="sourceLineNo">153</span><a name="line.153"></a>
+<span class="sourceLineNo">154</span>      Put put = new Put(ROW);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>      put.addColumn(A, A, A);<a name="line.155"></a>
+<span class="sourceLineNo">156</span>      put.addColumn(B, B, B);<a name="line.156"></a>
+<span class="sourceLineNo">157</span>      put.addColumn(C, C, C);<a name="line.157"></a>
+<span class="sourceLineNo">158</span>      table.put(put);<a name="line.158"></a>
 <span class="sourceLineNo">159</span><a name="line.159"></a>
-<span class="sourceLineNo">160</span>      Get get = new Get(ROW);<a name="line.160"></a>
-<span class="sourceLineNo">161</span>      get.addColumn(A, A);<a name="line.161"></a>
-<span class="sourceLineNo">162</span>      get.addColumn(B, B);<a name="line.162"></a>
-<span class="sourceLineNo">163</span>      get.addColumn(C, C);<a name="line.163"></a>
-<span class="sourceLineNo">164</span>      table.get(get);<a name="line.164"></a>
-<span class="sourceLineNo">165</span><a name="line.165"></a>
-<span class="sourceLineNo">166</span>      verifyMethodResult(SimpleRegionObserver.class,<a name="line.166"></a>
-<span class="sourceLineNo">167</span>        new String[] { "hadPreGet", "hadPostGet", "hadPrePut", "hadPostPut", "hadDelete",<a name="line.167"></a>
-<span class="sourceLineNo">168</span>            "hadPrePreparedDeleteTS" },<a name="line.168"></a>
-<span class="sourceLineNo">169</span>        tableName, new Boolean[] { true, true, true, true, false, false });<a name="line.169"></a>
+<span class="sourceLineNo">160</span>      verifyMethodResult(SimpleRegionObserver.class,<a name="line.160"></a>
+<span class="sourceLineNo">161</span>        new String[] { "hadPreGet", "hadPostGet", "hadPrePut", "hadPostPut", "hadPreBatchMutate",<a name="line.161"></a>
+<span class="sourceLineNo">162</span>            "hadPostBatchMutate", "hadDelete", "hadPostStartRegionOperation",<a name="line.162"></a>
+<span class="sourceLineNo">163</span>            "hadPostCloseRegionOperation", "hadPostBatchMutateIndispensably" },<a name="line.163"></a>
+<span class="sourceLineNo">164</span>        TEST_TABLE,<a name="line.164"></a>
+<span class="sourceLineNo">165</span>        new Boolean[] { false, false, true, true, true, true, false, true, true, true });<a name="line.165"></a>
+<span class="sourceLineNo">166</span><a name="line.166"></a>
+<span class="sourceLineNo">167</span>      verifyMethodResult(SimpleRegionObserver.class,<a name="line.167"></a>
+<span class="sourceLineNo">168</span>        new String[] { "getCtPreOpen", "getCtPostOpen", "getCtPreClose", "getCtPostClose" },<a name="line.168"></a>
+<span class="sourceLineNo">169</span>        tableName, new Integer[] { 1, 1, 0, 0 });<a name="line.169"></a>
 <span class="sourceLineNo">170</span><a name="line.170"></a>
-<span class="sourceLineNo">171</span>      Delete delete = new Delete(ROW);<a name="line.171"></a>
-<span class="sourceLineNo">172</span>      delete.addColumn(A, A);<a name="line.172"></a>
-<span class="sourceLineNo">173</span>      delete.addColumn(B, B);<a name="line.173"></a>
-<span class="sourceLineNo">174</span>      delete.addColumn(C, C);<a name="line.174"></a>
-<span class="sourceLineNo">175</span>      table.delete(delete);<a name="line.175"></a>
+<span class="sourceLineNo">171</span>      Get get = new Get(ROW);<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      get.addColumn(A, A);<a name="line.172"></a>
+<span class="sourceLineNo">173</span>      get.addColumn(B, B);<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      get.addColumn(C, C);<a name="line.174"></a>
+<span class="sourceLineNo">175</span>      table.get(get);<a name="line.175"></a>
 <span class="sourceLineNo">176</span><a name="line.176"></a>
 <span class="sourceLineNo">177</span>      verifyMethodResult(SimpleRegionObserver.class,<a name="line.177"></a>
-<span class="sourceLineNo">178</span>        new String[] { "hadPreGet", "hadPostGet", "hadPrePut", "hadPostPut", "hadPreBatchMutate",<a name="line.178"></a>
-<span class="sourceLineNo">179</span>            "hadPostBatchMutate", "hadDelete", "hadPrePreparedDeleteTS" },<a name="line.179"></a>
-<span class="sourceLineNo">180</span>        tableName, new Boolean[] { true, true, true, true, true, true, true, true });<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    } finally {<a name="line.181"></a>
-<span class="sourceLineNo">182</span>      util.deleteTable(tableName);<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      table.close();<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    }<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    verifyMethodResult(SimpleRegionObserver.class,<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      new String[] { "getCtPreOpen", "getCtPostOpen", "getCtPreClose", "getCtPostClose" },<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      tableName, new Integer[] { 1, 1, 1, 1 });<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>  @Test<a name="line.190"></a>
-<span class="sourceLineNo">191</span>  public void testRowMutation() throws IOException {<a name="line.191"></a>
-<span class="sourceLineNo">192</span>    final TableName tableName = TableName.valueOf(TEST_TABLE.getNameAsString() + "." + name.getMethodName());<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    Table table = util.createTable(tableName, new byte[][] { A, B, C });<a name="line.193"></a>
-<span class="sourceLineNo">194</span>    try {<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      verifyMethodResult(SimpleRegionObserver.class,<a name="line.195"></a>
-<span class="sourceLineNo">196</span>        new String[] { "hadPreGet", "hadPostGet", "hadPrePut", "hadPostPut", "hadDeleted" },<a name="line.196"></a>
-<span class="sourceLineNo">197</span>        tableName, new Boolean[] { false, false, false, false, false });<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      Put put = new Put(ROW);<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      put.addColumn(A, A, A);<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      put.addColumn(B, B, B);<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      put.addColumn(C, C, C);<a name="line.201"></a>
-<span class="sourceLineNo">202</span><a name="line.202"></a>
-<span class="sourceLineNo">203</span>      Delete delete = new Delete(ROW);<a name="line.203"></a>
-<span class="sourceLineNo">204</span>      delete.addColumn(A, A);<a name="line.204"></a>
-<span class="sourceLineNo">205</span>      delete.addColumn(B, B);<a name="line.205"></a>
-<span class="sourceLineNo">206</span>      delete.addColumn(C, C);<a name="line.206"></a>
-<span class="sourceLineNo">207</span><a name="line.207"></a>
-<span class="sourceLineNo">208</span>      RowMutations arm = new RowMutations(ROW);<a name="line.208"></a>
-<span class="sourceLineNo">209</span>      arm.add(put);<a name="line.209"></a>
-<span class="sourceLineNo">210</span>      arm.add(delete);<a name="line.210"></a>
-<span class="sourceLineNo">211</span>      table.mutateRow(arm);<a name="line.211"></a>
-<span class="sourceLineNo">212</span><a name="line.212"></a>
-<span class="sourceLineNo">213</span>      verifyMethodResult(SimpleRegionObserver.class,<a name="line.213"></a>
-<span class="sourceLineNo">214</span>        new String[] { "hadPreGet", "hadPostGet", "hadPrePut", "hadPostPut", "hadDeleted" },<a name="line.214"></a>
-<span class="sourceLineNo">215</span>        tableName, new Boolean[] { false, false, true, true, true });<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    } finally {<a name="line.216"></a>
-<span class="sourceLineNo">217</span>      util.deleteTable(tableName);<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      table.close();<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><a name="line.221"></a>
-<span class="sourceLineNo">222</span>  @Test<a name="line.222"></a>
-<span class="sourceLineNo">223</span>  public void testIncrementHook() throws IOException {<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    final TableName tableName = TableName.valueOf(TEST_TABLE.getNameAsString() + "." + name.getMethodName());<a name="line.224"></a>
-<span class="sourceLineNo">225</span>    Table table = util.createTable(tableName, new byte[][] { A, B, C });<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    try {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      Increment inc = new Increment(Bytes.toBytes(0));<a name="line.227"></a>
-<span class="sourceLineNo">228</span>      inc.addColumn(A, A, 1);<a name="line.228"></a>
-<span class="sourceLineNo">229</span><a name="line.229"></a>
-<span class="sourceLineNo">230</span>      verifyMethodResult(SimpleRegionObserver.class,<a name="line.230"></a>
-<span class="sourceLineNo">231</span>        new String[] { "hadPreIncrement", "hadPostIncrement", "hadPreIncrementAfterRowLock" },<a name="line.231"></a>
-<span class="sourceLineNo">232</span>        tableName, new Boolean[] { false, false, false });<a name="line.232"></a>
-<span class="sourceLineNo">233</span><a name="line.233"></a>
-<span class="sourceLineNo">234</span>      table.increment(inc);<a name="line.234"></a>
-<span class="sourceLineNo">235</span><a name="line.235"></a>
-<span class="sourceLineNo">236</span>      verifyMethodResult(SimpleRegionObserver.class,<a name="line.236"></a>
-<span class="sourceLineNo">237</span>        new String[] { "hadPreIncrement", "hadPostIncrement", "hadPreIncrementAfterRowLock" },<a name="line.237"></a>
-<span class="sourceLineNo">238</span>        tableName, new Boolean[] { true, true, true });<a name="line.238"></a>
-<span class="sourceLineNo">239</span>    } finally {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>      util.deleteTable(tableName);<a name="line.240"></a>
-<span class="sourceLineNo">241</span>      table.close();<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">178</span>        new String[] { "hadPreGet", "hadPostGet", "hadPrePut", "hadPostPut", "hadDelete",<a name="line.178"></a>
+<span class="sourceLineNo">179</span>            "hadPrePreparedDeleteTS" },<a name="line.179"></a>
+<span class="sourceLineNo">180</span>        tableName, new Boolean[] { true, true, true, true, false, false });<a name="line.180"></a>
+<span class="sourceLineNo">181</span><a name="line.181"></a>
+<span class="sourceLineNo">182</span>      Delete delete = new Delete(ROW);<a name="line.182"></a>
+<span class="sourceLineNo">183</span>      delete.addColumn(A, A);<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      delete.addColumn(B, B);<a name="line.184"></a>
+<span class="sourceLineNo">185</span>      delete.addColumn(C, C);<a name="line.185"></a>
+<span class="sourceLineNo">186</span>      table.delete(delete);<a name="line.186"></a>
+<span class="sourceLineNo">187</span><a name="line.187"></a>
+<span class="sourceLineNo">188</span>      verifyMethodResult(SimpleRegionObserver.class,<a name="line.188"></a>
+<span class="sourceLineNo">189</span>        new String[] { "hadPreGet", "hadPostGet", "hadPrePut", "hadPostPut", "hadPreBatchMutate",<a name="line.189"></a>
+<span class="sourceLineNo">190</span>            "hadPostBatchMutate", "hadDelete", "hadPrePreparedDeleteTS" },<a name="line.190"></a>
+<span class="sourceLineNo">191</span>        tableName, new Boolean[] { true, true, true, true, true, true, true, true });<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    } finally {<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      util.deleteTable(tableName);<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      table.close();<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    }<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    verifyMethodResult(SimpleRegionObserver.class,<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      new String[] { "getCtPreOpen", "getCtPostOpen", "getCtPreClose", "getCtPostClose" },<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      tableName, new Integer[] { 1, 1, 1, 1 });<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>  @Test<a name="line.201"></a>
+<span class="sourceLineNo">202</span>  public void testRowMutation() throws IOException {<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    final TableName tableName = TableName.valueOf(TEST_TABLE.getNameAsString() + "." + name.getMethodName());<a name="line.203"></a>
+<span class="sourceLineNo">204</span>    Table table = util.createTable(tableName, new byte[][] { A, B, C });<a name="line.204"></a>
+<span class="sourceLineNo">205</span>    try {<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      verifyMethodResult(SimpleRegionObserver.class,<a name="line.206"></a>
+<span class="sourceLineNo">207</span>        new String[] { "hadPreGet", "hadPostGet", "hadPrePut", "hadPostPut", "hadDeleted" },<a name="line.207"></a>
+<span class="sourceLineNo">208</span>        tableName, new Boolean[] { false, false, false, false, false });<a name="line.208"></a>
+<span class="sourceLineNo">209</span>      Put put = new Put(ROW);<a name="line.209"></a>
+<span class="sourceLineNo">210</span>      put.addColumn(A, A, A);<a name="line.210"></a>
+<span class="sourceLineNo">211</span>      put.addColumn(B, B, B);<a name="line.211"></a>
+<span class="sourceLineNo">212</span>      put.addColumn(C, C, C);<a name="line.212"></a>
+<span class="sourceLineNo">213</span><a name="line.213"></a>
+<span class="sourceLineNo">214</span>      Delete delete = new Delete(ROW);<a name="line.214"></a>
+<span class="sourceLineNo">215</span>      delete.addColumn(A, A);<a name="line.215"></a>
+<span class="sourceLineNo">216</span>      delete.addColumn(B, B);<a name="line.216"></a>
+<span class="sourceLineNo">217</span>      delete.addColumn(C, C);<a name="line.217"></a>
+<span class="sourceLineNo">218</span><a name="line.218"></a>
+<span class="sourceLineNo">219</span>      RowMutations arm = new RowMutations(ROW);<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      arm.add(put);<a name="line.220"></a>
+<span class="sourceLineNo">221</span>      arm.add(delete);<a name="line.221"></a>
+<span class="sourceLineNo">222</span>      table.mutateRow(arm);<a name="line.222"></a>
+<span class="sourceLineNo">223</span><a name="line.223"></a>
+<span class="sourceLineNo">224</span>      verifyMethodResult(SimpleRegionObserver.class,<a name="line.224"></a>
+<span class="sourceLineNo">225</span>        new String[] { "hadPreGet", "hadPostGet", "hadPrePut", "hadPostPut", "hadDeleted" },<a name="line.225"></a>
+<span class="sourceLineNo">226</span>        tableName, new Boolean[] { false, false, true, true, true });<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    } finally {<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      util.deleteTable(tableName);<a name="line.228"></a>
+<span class="sourceLineNo">229</span>      table.close();<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><a name="line.232"></a>
+<span class="sourceLineNo">233</span>  @Test<a name="line.233"></a>
+<span class="sourceLineNo">234</span>  public void testIncrementHook() throws IOException {<a name="line.234"></a>
+<span class="sourceLineNo">235</span>    final TableName tableName = TableName.valueOf(TEST_TABLE.getNameAsString() + "." + name.getMethodName());<a name="line.235"></a>
+<span class="sourceLineNo">236</span>    Table table = util.createTable(tableName, new byte[][] { A, B, C });<a name="line.236"></a>
+<span class="sourceLineNo">237</span>    try {<a name="line.237"></a>
+<span class="sourceLineNo">238</span>      Increment inc = new Increment(Bytes.toBytes(0));<a name="line.238"></a>
+<span class="sourceLineNo">239</span>      inc.addColumn(A, A, 1);<a name="line.239"></a>
+<span class="sourceLineNo">240</span><a name="line.240"></a>
+<span class="sourceLineNo">241</span>      verifyMethodResult(SimpleRegionObserver.class,<a name="line.241"></a>
+<span class="sourceLineNo">242</span>        new String[] { "hadPreIncrement", "hadPostIncrement", "hadPreIncrementAfterRowLock" },<a name="line.242"></a>
+<span class="sourceLineNo">243</span>        tableName, new Boolean[] { false, false, false });<a name="line.243"></a>
 <span class="sourceLineNo">244</span><a name="line.244"></a>
-<span class="sourceLineNo">245</span>  @Test<a name="line.245"></a>
-<span class="sourceLineNo">246</span>  public void testCheckAndPutHooks() throws IOException {<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    final TableName tableName = TableName.valueOf(TEST_TABLE.getNameAsString() + "." + name.getMethodName());<a name="line.247"></a>
-<span class="sourceLineNo">248</span>    try (Table table = util.createTable(tableName, new byte[][] { A, B, C })) {<a name="line.248"></a>
-<span class="sourceLineNo">249</span>      Put p = new Put(Bytes.toBytes(0));<a name="line.249"></a>
-<span class="sourceLineNo">250</span>      p.addColumn(A, A, A);<a name="line.250"></a>
-<span class="sourceLineNo">251</span>      table.put(p);<a name="line.251"></a>
-<span class="sourceLineNo">252</span>      p = new Put(Bytes.toBytes(0));<a name="line.252"></a>
-<span class="sourceLineNo">253</span>      p.addColumn(A, A, A);<a name="line.253"></a>
-<span class="sourceLineNo">254</span>      verifyMethodResult(SimpleRegionObserver.class,<a name="line.254"></a>
-<span class="sourceLineNo">255</span>        new String[] { "hadPreCheckAndPut", "hadPreCheckAndPutAfterRowLock", "hadPostCheckAndPut" },<a name="line.255"></a>
-<span class="sourceLineNo">256</span>        tableName, new Boolean[] { false, false, false });<a name="line.256"></a>
-<span class="sourceLineNo">257</span>      table.checkAndMutate(Bytes.toBytes(0), A).qualifier(A).ifEquals(A).thenPut(p);<a name="line.257"></a>
-<span class="sourceLineNo">258</span>      verifyMethodResult(SimpleRegionObserver.class,<a name="line.258"></a>
-<span class="sourceLineNo">259</span>        new String[] { "hadPreCheckAndPut", "hadPreCheckAndPutAfterRowLock", "hadPostCheckAndPut" },<a name="line.259"></a>
-<span class="sourceLineNo">260</span>        tableName, new Boolean[] { true, true, true });<a name="line.260"></a>
-<span class="sourceLineNo">261</span>    } finally {<a name="line.261"></a>
-<span class="sourceLineNo">262</span>      util.deleteTable(tableName);<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>  @Test<a name="line.266"></a>
-<span class="sourceLineNo">267</span>  public void testCheckAndDeleteHooks() throws IOException {<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    final TableName tableName = TableName.valueOf(TEST_TABLE.getNameAsString() + "." + name.getMethodName());<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    Table table = util.createTable(tableName, new byte[][] { A, B, C });<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    try {<a name="line.270"></a>
-<span class="sourceLineNo">271</span>      Put p = new Put(Bytes.toBytes(0));<a name="line.271"></a>
-<span class="sourceLineNo">272</span>      p.addColumn(A, A, A);<a name="line.272"></a>
-<span class="sourceLineNo">273</span>      table.put(p);<a name="line.273"></a>
-<span class="sourceLineNo">274</span>      Delete d = new Delete(Bytes.toBytes(0));<a name="line.274"></a>
-<span class="sourceLineNo">275</span>      table.delete(d);<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      verifyMethodResult(<a name="line.276"></a>
-<span class="sourceLineNo">277</span>        SimpleRegionObserver.class, new String[] { "hadPreCheckAndDelete",<a name="line.277"></a>
-<span class="sourceLineNo">278</span>            "hadPreCheckAndDeleteAfterRowLock", "hadPostCheckAndDelete" },<a name="line.278"></a>
-<span class="sourceLineNo">279</span>        tableName, new Boolean[] { false, false, false });<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      table.checkAndMutate(Bytes.toBytes(0), A).qualifier(A).ifEquals(A).thenDelete(d);<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      verifyMethodResult(<a name="line.281"></a>
-<span class="sourceLineNo">282</span>        SimpleRegionObserver.class, new String[] { "hadPreCheckAndDelete",<a name="line.282"></a>
-<span class="sourceLineNo">283</span>            "hadPreCheckAndDeleteAfterRowLock", "hadPostCheckAndDelete" },<a name="line.283"></a>
-<span class="sourceLineNo">284</span>        tableName, new Boolean[] { true, true, true });<a name="line.284"></a>
-<span class="sourceLineNo">285</span>    } finally {<a name="line.285"></a>
-<span class="sourceLineNo">286</span>      util.deleteTable(tableName);<a name="line.286"></a>
-<span class="sourceLineNo">287</span>      table.close();<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    }<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>  @Test<a name="line.291"></a>
-<span class="sourceLineNo">292</span>  public void testAppendHook() throws IOException {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>    final TableName tableName = TableName.valueOf(TEST_TABLE.getNameAsString() + "." + name.getMethodName());<a name="line.293"></a>
-<span class="sourceLineNo">294</span>    Table table = util.createTable(tableName, new byte[][] { A, B, C });<a name="line.294"></a>
-<span class="sourceLineNo">295</span>    try {<a name="line.295"></a>
-<span class="sourceLineNo">296</span>      Append app = new Append(Bytes.toBytes(0));<a name="line.296"></a>
-<span class="sourceLineNo">297</span>      app.addColumn(A, A, A);<a name="line.297"></a>
-<span class="sourceLineNo">298</span><a name="line.298"></a>
-<span class="sourceLineNo">299</span>      verifyMethodResult(SimpleRegionObserver.class,<a name="line.299"></a>
-<span class="sourceLineNo">300</span>        new String[] { "hadPreAppend", "hadPostAppend", "hadPreAppendAfterRowLock" }, tableName,<a name="line.300"></a>
-<span class="sourceLineNo">301</span>        new Boolean[] { false, false, false });<a name="line.301"></a>
-<span class="sourceLineNo">302</span><a name="line.302"></a>
-<span class="sourceLineNo">303</span>      table.append(app);<a name="line.303"></a>
-<span class="sourceLineNo">304</span><a name="line.304"></a>
-<span class="sourceLineNo">305</span>      verifyMethodResult(SimpleRegionObserver.class,<a name="line.305"></a>
-<span class="sourceLineNo">306</span>        new String[] { "hadPreAppend", "hadPostAppend", "hadPreAppendAfterRowLock" }, tableName,<a name="line.306"></a>
-<span class="sourceLineNo">307</span>        new Boolean[] { true, true, true });<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    } finally {<a name="line.308"></a>
-<span class="sourceLineNo">309</span>      util.deleteTable(tableName);<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      table.close();<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">245</span>      table.increment(inc);<a name="line.245"></a>
+<span class="sourceLineNo">246</span><a name="line.246"></a>
+<span class="sourceLineNo">247</span>      verifyMethodResult(SimpleRegionObserver.class,<a name="line.247"></a>
+<span class="sourceLineNo">248</span>        new String[] { "hadPreIncrement", "hadPostIncrement", "hadPreIncrementAfterRowLock" },<a name="line.248"></a>
+<span class="sourceLineNo">249</span>        tableName, new Boolean[] { true, true, true });<a name="line.249"></a>
+<span class="sourceLineNo">250</span>    } finally {<a name="line.250"></a>
+<span class="sourceLineNo">251</span>      util.deleteTable(tableName);<a name="line.251"></a>
+<span class="sourceLineNo">252</span>      table.close();<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>  @Test<a name="line.256"></a>
+<span class="sourceLineNo">257</span>  public void testCheckAndPutHooks() throws IOException {<a name="line.257"></a>
+<span class="sourceLineNo">258</span>    final TableName tableName = TableName.valueOf(TEST_TABLE.getNameAsString() + "." + name.getMethodName());<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    try (Table table = util.createTable(tableName, new byte[][] { A, B, C })) {<a name="line.259"></a>
+<span class="sourceLineNo">260</span>      Put p = new Put(Bytes.toBytes(0));<a name="line.260"></a>
+<span class="sourceLineNo">261</span>      p.addColumn(A, A, A);<a name="line.261"></a>
+<span class="sourceLineNo">262</span>      table.put(p);<a name="line.262"></a>
+<span class="sourceLineNo">263</span>      p = new Put(Bytes.toBytes(0));<a name="line.263"></a>
+<span class="sourceLineNo">264</span>      p.addColumn(A, A, A);<a name="line.264"></a>
+<span class="sourceLineNo">265</span>      verifyMethodResult(SimpleRegionObserver.class,<a name="line.265"></a>
+<span class="sourceLineNo">266</span>        new String[] { "hadPreCheckAndPut", "hadPreCheckAndPutAfterRowLock", "hadPostCheckAndPut" },<a name="line.266"></a>
+<span class="sourceLineNo">267</span>        tableName, new Boolean[] { false, false, false });<a name="line.267"></a>
+<span class="sourceLineNo">268</span>      table.checkAndMutate(Bytes.toBytes(0), A).qualifier(A).ifEquals(A).thenPut(p);<a name="line.268"></a>
+<span class="sourceLineNo">269</span>      verifyMethodResult(SimpleRegionObserver.class,<a name="line.269"></a>
+<span class="sourceLineNo">270</span>        new String[] { "hadPreCheckAndPut", "hadPreCheckAndPutAfterRowLock", "hadPostCheckAndPut" },<a name="line.270"></a>
+<span class="sourceLineNo">271</span>        tableName, new Boolean[] { true, true, true });<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    } finally {<a name="line.272"></a>
+<span class="sourceLineNo">273</span>      util.deleteTable(tableName);<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    }<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>  @Test<a name="line.277"></a>
+<span class="sourceLineNo">278</span>  public void testCheckAndDeleteHooks() throws IOException {<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    final TableName tableName = TableName.valueOf(TEST_TABLE.getNameAsString() + "." + name.getMethodName());<a name="line.279"></a>
+<span class="sourceLineNo">280</span>    Table table = util.createTable(tableName, new byte[][] { A, B, C });<a name="line.280"></a>
+<span class="sourceLineNo">281</span>    try {<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      Put p = new Put(Bytes.toBytes(0));<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      p.addColumn(A, A, A);<a name="line.283"></a>
+<span class="sourceLineNo">284</span>      table.put(p);<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      Delete d = new Delete(Bytes.toBytes(0));<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      table.delete(d);<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      verifyMethodResult(<a name="line.287"></a>
+<span class="sourceLineNo">288</span>        SimpleRegionObserver.class, new String[] { "hadPreCheckAndDelete",<a name="line.288"></a>
+<span class="sourceLineNo">289</span>            "hadPreCheckAndDeleteAfterRowLock", "hadPostCheckAndDelete" },<a name="line.289"></a>
+<span class="sourceLineNo">290</span>        tableName, new Boolean[] { false, false, false });<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      table.checkAndMutate(Bytes.toBytes(0), A).qualifier(A).ifEquals(A).thenDelete(d);<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      verifyMethodResult(<a name="line.292"></a>
+<span class="sourceLineNo">293</span>        SimpleRegionObserver.class, new String[] { "hadPreCheckAndDelete",<a name="line.293"></a>
+<span class="sourceLineNo">294</span>            "hadPreCheckAndDeleteAfterRowLock", "hadPostCheckAndDelete" },<a name="line.294"></a>
+<span class="sourceLineNo">295</span>        tableName, new Boolean[] { true, true, true });<a name="line.295"></a>
+<span class="sourceLineNo">296</span>    } finally {<a name="line.296"></a>
+<span class="sourceLineNo">297</span>      util.deleteTable(tableName);<a name="line.297"></a>
+<span class="sourceLineNo">298</span>      table.close();<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><a name="line.301"></a>
+<span class="sourceLineNo">302</span>  @Test<a name="line.302"></a>
+<span class="sourceLineNo">303</span>  public void testAppendHook() throws IOException {<a name="line.303"></a>
+<span class="sourceLineNo">304</span>    final TableName tableName = TableName.valueOf(TEST_TABLE.getNameAsString() + "." + name.getMethodName());<a name="line.304"></a>
+<span class="sourceLineNo">305</span>    Table table = util.createTable(tableName, new byte[][] { A, B, C });<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    try {<a name="line.306"></a>
+<span class="sourceLineNo">307</span>      Append app = new Append(Bytes.toBytes(0));<a name="line.307"></a>
+<span class="sourceLineNo">308</span>      app.addColumn(A, A, A);<a name="line.308"></a>
+<span class="sourceLineNo">309</span><a name="line.309"></a>
+<span class="sourceLineNo">310</span>      verifyMethodResult(SimpleRegionObserver.class,<a name="line.310"></a>
+<span class="sourceLineNo">311</span>        new String[] { "hadPreAppend", "hadPostAppend", "hadPreAppendAfterRowLock" }, tableName,<a name="line.311"></a>
+<span class="sourceLineNo">312</span>        new Boolean[] { false, false, false });<a name="line.312"></a>
 <span class="sourceLineNo">313</span><a name="line.313"></a>
-<span class="sourceLineNo">314</span>  @Test<a name="line.314"></a>
-<span class="sourceLineNo">315</span>  // HBase-3583<a name="line.315"></a>
-<span class="sourceLineNo">316</span>  public void testHBase3583() throws IOException {<a name="line.316"></a>
-<span class="sourceLineNo">317</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.317"></a>
-<span class="sourceLineNo">318</span>    util.createTable(tableName, new byte[][] { A, B, C });<a name="line.318"></a>
-<span class="sourceLineNo">319</span>    util.waitUntilAllRegionsAssigned(tableName);<a name="line.319"></a>
-<span class="sourceLineNo">320</span><a name="line.320"></a>
-<span class="sourceLineNo">321</span>    verifyMethodResult(SimpleRegionObserver.class,<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      new String[] { "hadPreGet", "hadPostGet", "wasScannerNextCalled", "wasScannerCloseCalled" },<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      tableName, new Boolean[] { false, false, false, false });<a name="line.323"></a>
+<span class="sourceLineNo">314</span>      table.append(app);<a name="line.314"></a>
+<span class="sourceLineNo">315</span><a name="line.315"></a>
+<span class="sourceLineNo">316</span>      verifyMethodResult(SimpleRegionObserver.class,<a name="line.316"></a>
+<span class="sourceLineNo">317</span>        new String[] { "hadPreAppend", "hadPostAppend", "hadPreAppendAfterRowLock" }, tableName,<a name="line.317"></a>
+<span class="sourceLineNo">318</span>        new Boolean[] { true, true, true });<a name="line.318"></a>
+<span class="sourceLineNo">319</span>    } finally {<a name="line.319"></a>
+<span class="sourceLineNo">320</span>      util.deleteTable(tableName);<a name="line.320"></a>
+<span class="sourceLineNo">321</span>      table.close();<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><a name="line.324"></a>
-<span class="sourceLineNo">325</span>    Table table = util.getConnection().getTable(tableName);<a name="line.325"></a>
-<span class="sourceLineNo">326</span>    Put put = new Put(ROW);<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    put.addColumn(A, A, A);<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    table.put(put);<a name="line.328"></a>
-<span class="sourceLineNo">329</span><a name="line.329"></a>
-<span class="sourceLineNo">330</span>    Get get = new Get(ROW);<a name="line.330"></a>
-<span class="sourceLineNo">331</span>    get.addColumn(A, A);<a name="line.331"></a>
-<span class="sourceLineNo">332</span>    table.get(get);<a name="line.332"></a>
-<span class="sourceLineNo">333</span><a name="line.333"></a>
-<span class="sourceLineNo">334</span>    // verify that scannerNext and scannerClose upcalls won't be invoked<a name="line.334"></a>
-<span class="sourceLineNo">335</span>    // when we perform get().<a name="line.335"></a>
-<span class="sourceLineNo">336</span>    verifyMethodResult(SimpleRegionObserver.class,<a name="line.336"></a>
-<span class="sourceLineNo">337</span>      new String[] { "hadPreGet", "hadPostGet", "wasScannerNextCalled", "wasScannerCloseCalled" },<a name="line.337"></a>
-<span class="sourceLineNo">338</span>      tableName, new Boolean[] { true, true, false, false });<a name="line.338"></a>
-<span class="sourceLineNo">339</span><a name="line.339"></a>
-<span class="sourceLineNo">340</span>    Scan s = new Scan();<a name="line.340"></a>
-<span class="sourceLineNo">341</span>    ResultScanner scanner = table.getScanner(s);<a name="line.341"></a>
-<span class="sourceLineNo">342</span>    try {<a name="line.342"></a>
-<span class="sourceLineNo">343</span>      for (Result rr = scanner.next(); rr != null; rr = scanner.next()) {<a name="line.343"></a>
-<span class="sourceLineNo">344</span>      }<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    } finally {<a name="line.345"></a>
-<span class="sourceLineNo">346</span>      scanner.close();<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>    // now scanner hooks should be invoked.<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    verifyMethodResult(SimpleRegionObserver.class,<a name="line.350"></a>
-<span class="sourceLineNo">351</span>      new String[] { "wasScannerNextCalled", "wasScannerCloseCalled" }, tableName,<a name="line.351"></a>
-<span class="sourceLineNo">352</span>      new Boolean[] { true, true });<a name="line.352"></a>
-<span class="sourceLineNo">353</span>    util.deleteTable(tableName);<a name="line.353"></a>
-<span class="sourceLineNo">354</span>    table.close();<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>  @Test<a name="line.357"></a>
-<span class="sourceLineNo">358</span>  public void testHBASE14489() throws IOException {<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.359"></a>
-<span class="sourceLineNo">360</span>    Table table = util.createTable(tableName, new byte[][] { A });<a name="line.360"></a>
-<span class="sourceLineNo">361</span>    Put put = new Put(ROW);<a name="line.361"></a>
-<span class="sourceLineNo">362</span>    put.addColumn(A, A, A);<a name="line.362"></a>
-<span class="sourceLineNo">363</span>    table.put(put);<a name="line.363"></a>
-<span class="sourceLineNo">364</span><a name="line.364"></a>
-<span class="sourceLineNo">365</span>    Scan s = new Scan();<a name="line.365"></a>
-<span class="sourceLineNo">366</span>    s.setFilter(new FilterAllFilter());<a name="line.366"></a>
-<span class="sourceLineNo">367</span>    ResultScanner scanner = table.getScanner(s);<a name="line.367"></a>
-<span class="sourceLineNo">368</span>    try {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>      for (Result rr = scanner.next(); rr != null; rr = scanner.next()) {<a name="line.369"></a>
-<span class="sourceLineNo">370</span>      }<a name="line.370"></a>
-<span class="sourceLineNo">371</span>    } finally {<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      scanner.close();<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    }<a name="line.373"></a>
-<span class="sourceLineNo">374</span>    verifyMethodResult(SimpleRegionObserver.class, new String[] { "wasScannerFilterRowCalled" },<a name="line.374"></a>
-<span class="sourceLineNo">375</span>      tableName, new Boolean[] { true });<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    util.deleteTable(tableName);<a name="line.376"></a>
-<span class="sourceLineNo">377</span>    table.close();<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>  @Test<a name="line.381"></a>
-<span class="sourceLineNo">382</span>  // HBase-3758<a name="line.382"></a>
-<span class="sourceLineNo">383</span>  public void testHBase3758() throws IOException {<a name="line.383"></a>
-<span class="sourceLineNo">384</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.384"></a>
-<span class="sourceLineNo">385</span>    util.createTable(tableName, new byte[][] { A, B, C });<a name="line.385"></a>
-<span class="sourceLineNo">386</span><a name="line.386"></a>
-<span class="sourceLineNo">387</span>    verifyMethodResult(SimpleRegionObserver.class,<a name="line.387"></a>
-<span class="sourceLineNo">388</span>      new String[] { "hadDeleted", "wasScannerOpenCalled" }, tableName,<a name="line.388"></a>
-<span class="sourceLineNo">389</span>      new Boolean[] { false, false });<a name="line.389"></a>
-<span class="sourceLineNo">390</span><a name="line.390"></a>
-<span class="sourceLineNo">391</span>    Table table = util.getConnection().getTable(tableName);<a name="line.391"></a>
-<span class="sourceLineNo">392</span>    Put put = new Put(ROW);<a name="line.392"></a>
-<span class="sourceLineNo">393</span>    put.addColumn(A, A, A);<a name="line.393"></a>
-<span class="sourceLineNo">394</span>    table.put(put);<a name="line.394"></a>
-<span class="sourceLineNo">395</span><a name="line.395"></a>
-<span class="sourceLineNo">396</span>    Delete delete = new Delete(ROW);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    table.delete(delete);<a name="line.397"></a>
-<span class="sourceLineNo">398</span><a name="line.398"></a>
-<span class="sourceLineNo">399</span>    verifyMethodResult(SimpleRegionObserver.class,<a name="line.399"></a>
-<span class="sourceLineNo">400</span>      new String[] { "hadDeleted", "wasScannerOpenCalled" }, tableName,<a name="line.400"></a>
-<span class="sourceLineNo">401</span>      new Boolean[] { true, false });<a name="line.401"></a>
-<span class="sourceLineNo">402</span><a name="line.402"></a>
-<span class="sourceLineNo">403</span>    Scan s = new Scan();<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    ResultScanner scanner = table.getScanner(s);<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    try {<a name="line.405"></a>
-<span class="sourceLineNo">406</span>      for (Result rr = scanner.next(); rr != null; rr = scanner.next()) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>      }<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    } finally {<a name="line.408"></a>
-<span class="sourceLineNo">409</span>      scanner.close();<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>    // now scanner hooks should be invoked.<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    verifyMethodResult(SimpleRegionObserver.class, new String[] { "wasScannerOpenCalled" },<a name="line.413"></a>
-<span class="sourceLineNo">414</span>      tableName, new Boolean[] { true });<a name="line.414"></a>
-<span class="sourceLineNo">415</span>    util.deleteTable(tableName);<a name="line.415"></a>
-<span class="sourceLineNo">416</span>    table.close();<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>  /* Overrides compaction to only output rows with keys that are even numbers */<a name="line.419"></a>
-<span class="sourceLineNo">420</span>  public static class EvenOnlyCompactor implements RegionCoprocessor, RegionObserver {<a name="line.420"></a>
-<span class="sourceLineNo">421</span>    long lastCompaction;<a name="line.421"></a>
-<span class="sourceLineNo">422</span>    long lastFlush;<a name="line.422"></a>
-<span class="sourceLineNo">423</span><a name="line.423"></a>
-<span class="sourceLineNo">424</span>    @Override<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    public Optional&lt;RegionObserver&gt; getRegionObserver() {<a name="line.425"></a>
-<span class="sourceLineNo">426</span>      return Optional.of(this);<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>    @Override<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    public InternalScanner preCompact(ObserverContext&lt;RegionCoprocessorEnvironment&gt; e, Store store,<a name="line.430"></a>
-<span class="sourceLineNo">431</span>        InternalScanner scanner, ScanType scanType, CompactionLifeCycleTracker tracker,<a name="line.431"></a>
-<span class="sourceLineNo">432</span>        CompactionRequest request) {<a name="line.432"></a>
-<span class="sourceLineNo">433</span>      return new InternalScanner() {<a name="line.433"></a>
+<span class="sourceLineNo">325</span>  @Test<a name="line.325"></a>
+<span class="sourceLineNo">326</span>  // HBase-3583<a name="line.326"></a>
+<span class="sourceLineNo">327</span>  public void testHBase3583() throws IOException {<a name="line.327"></a>
+<span class="sourceLineNo">328</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    util.createTable(tableName, new byte[][] { A, B, C });<a name="line.329"></a>
+<span class="sourceLineNo">330</span>    util.waitUntilAllRegionsAssigned(tableName);<a name="line.330"></a>
+<span class="sourceLineNo">331</span><a name="line.331"></a>
+<span class="sourceLineNo">332</span>    verifyMethodResult(SimpleRegionObserver.class,<a name="line.332"></a>
+<span class="sourceLineNo">333</span>      new String[] { "hadPreGet", "hadPostGet", "wasScannerNextCalled", "wasScannerCloseCalled" },<a name="line.333"></a>
+<span class="sourceLineNo">334</span>      tableName, new Boolean[] { false, false, false, false });<a name="line.334"></a>
+<span class="sourceLineNo">335</span><a name="line.335"></a>
+<span class="sourceLineNo">336</span>    Table table = util.getConnection().getTable(tableName);<a name="line.336"></a>
+<span class="sourceLineNo">337</span>    Put put = new Put(ROW);<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    put.addColumn(A, A, A);<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    table.put(put);<a name="line.339"></a>
+<span class="sourceLineNo">340</span><a name="line.340"></a>
+<span class="sourceLineNo">341</span>    Get get = new Get(ROW);<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    get.addColumn(A, A);<a name="line.342"></a>
+<span class="sourceLineNo">343</span>    table.get(get);<a name="line.343"></a>
+<span class="sourceLineNo">344</span><a name="line.344"></a>
+<span class="sourceLineNo">345</span>    // verify that scannerNext and scannerClose upcalls won't be invoked<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    // when we perform get().<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    verifyMethodResult(SimpleRegionObserver.class,<a name="line.347"></a>
+<span class="sourceLineNo">348</span>      new String[] { "hadPreGet", "hadPostGet", "wasScannerNextCalled", "wasScannerCloseCalled" },<a name="line.348"></a>
+<span class="sourceLineNo">349</span>      tableName, new Boolean[] { true, true, false, false });<a name="line.349"></a>
+<span class="sourceLineNo">350</span><a name="line.350"></a>
+<span class="sourceLineNo">351</span>    Scan s = new Scan();<a name="line.351"></a>
+<span class="sourceLineNo">352</span>    ResultScanner scanner = table.getScanner(s);<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    try {<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      for (Result rr = scanner.next(); rr != null; rr = scanner.next()) {<a name="line.354"></a>
+<span class="sourceLineNo">355</span>      }<a name="line.355"></a>
+<span class="sourceLineNo">356</span>    } finally {<a name="line.356"></a>
+<span class="sourceLineNo">357</span>      scanner.close();<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>    // now scanner hooks should be invoked.<a name="line.360"></a>
+<span class="sourceLineNo">361</span>    verifyMethodResult(SimpleRegionObserver.class,<a name="line.361"></a>
+<span class="sourceLineNo">362</span>      new String[] { "wasScannerNextCalled", "wasScannerCloseCalled" }, tableName,<a name="line.362"></a>
+<span class="sourceLineNo">363</span>      new Boolean[] { true, true });<a name="line.363"></a>
+<span class="sourceLineNo">364</span>    util.deleteTable(tableName);<a name="line.364"></a>
+<span class="sourceLineNo">365</span>    table.close();<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>  @Test<a name="line.368"></a>
+<span class="sourceLineNo">369</span>  public void testHBASE14489() throws IOException {<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.370"></a>
+<span class="sourceLineNo">371</span>    Table table = util.createTable(tableName, new byte[][] { A });<a name="line.371"></a>
+<span class="sourceLineNo">372</span>    Put put = new Put(ROW);<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    put.addColumn(A, A, A);<a name="line.373"></a>
+<span class="sourceLineNo">374</span>    table.put(put);<a name="line.374"></a>
+<span class="sourceLineNo">375</span><a name="line.375"></a>
+<span class="sourceLineNo">376</span>    Scan s = new Scan();<a name="line.376"></a>
+<span class="sourceLineNo">377</span>    s.setFilter(new FilterAllFilter());<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    ResultScanner scanner = table.getScanner(s);<a name="line.378"></a>
+<span class="sourceLineNo">379</span>    try {<a name="line.379"></a>
+<span class="sourceLineNo">380</span>      for (Result rr = scanner.next(); rr != null; rr = scanner.next()) {<a name="line.380"></a>
+<span class="sourceLineNo">381</span>      }<a name="line.381"></a>
+<span class="sourceLineNo">382</span>    } finally {<a name="line.382"></a>
+<span class="sourceLineNo">383</span>      scanner.close();<a name="line.383"></a>
+<span class="sourceLineNo">384</span>    }<a name="line.384"></a>
+<span class="sourceLineNo">385</span>    verifyMethodResult(SimpleRegionObserver.class, new String[] { "wasScannerFilterRowCalled" },<a name="line.385"></a>
+<span class="sourceLineNo">386</span>      tableName, new Boolean[] { true });<a name="line.386"></a>
+<span class="sourceLineNo">387</span>    util.deleteTable(tableName);<a name="line.387"></a>
+<span class="sourceLineNo">388</span>    table.close();<a name="line.388"></a>
+<span class="sourceLineNo">389</span><a name="line.389"></a>
+<span class="sourceLineNo">390</span>  }<a name="line.390"></a>
+<span class="sourceLineNo">391</span><a name="line.391"></a>
+<span class="sourceLineNo">392</span>  @Test<a name="line.392"></a>
+<span class="sourceLineNo">393</span>  // HBase-3758<a name="line.393"></a>
+<span class="sourceLineNo">394</span>  public void testHBase3758() throws IOException {<a name="line.394"></a>
+<span class="sourceLineNo">395</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.395"></a>
+<span class="sourceLineNo">396</span>    util.createTable(tableName, new byte[][] { A, B, C });<a name="line.396"></a>
+<span class="sourceLineNo">397</span><a name="line.397"></a>
+<span class="sourceLineNo">398</span>    verifyMethodResult(SimpleRegionObserver.class,<a name="line.398"></a>
+<span class="sourceLineNo">399</span>      new String[] { "hadDeleted", "wasScannerOpenCalled" }, tableName,<a name="line.399"></a>
+<span class="sourceLineNo">400</span>      new Boolean[] { false, false });<a name="line.400"></a>
+<span class="sourceLineNo">401</span><a name="line.401"></a>
+<span class="sourceLineNo">402</span>    Table table = util.getConnection().getTable(tableName);<a name="line.402"></a>
+<span class="sourceLineNo">403</span>    Put put = new Put(ROW);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>    put.addColumn(A, A, A);<a name="line.404"></a>
+<span class="sourceLineNo">405</span>    table.put(put);<a name="line.405"></a>
+<span class="sourceLineNo">406</span><a name="line.406"></a>
+<span class="sourceLineNo">407</span>    Delete delete = new Delete(ROW);<a name="line.407"></a>
+<span class="sourceLineNo">408</span>    table.delete(delete);<a name="line.408"></a>
+<span class="sourceLineNo">409</span><a name="line.409"></a>
+<span class="sourceLineNo">410</span>    verifyMethodResult(SimpleRegionObserver.class,<a name="line.410"></a>
+<span class="sourceLineNo">411</span>      new String[] { "hadDeleted", "wasScannerOpenCalled" }, tableName,<a name="line.411"></a>
+<span class="sourceLineNo">412</span>      new Boolean[] { true, false });<a name="line.412"></a>
+<span class="sourceLineNo">413</span><a name="line.413"></a>
+<span class="sourceLineNo">414</span>    Scan s = new Scan();<a name="line.414"></a>
+<span class="sourceLineNo">415</span>    ResultScanner scanner = table.getScanner(s);<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    try {<a name="line.416"></a>
+<span class="sourceLineNo">417</span>      for (Result rr = scanner.next(); rr != null; rr = scanner.next()) {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>      }<a name="line.418"></a>
+<span class="sourceLineNo">419</span>    } finally {<a name="line.419"></a>
+<span class="sourceLineNo">420</span>      scanner.close();<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>    // now scanner hooks should be invoked.<a name="line.423"></a>
+<span class="sourceLineNo">424</span>    verifyMethodResult(SimpleRegionObserver.class, new String[] { "wasScannerOpenCalled" },<a name="line.424"></a>
+<span class="sourceLineNo">425</span>      tableName, new Boolean[] { true });<a name="line.425"></a>
+<span class="sourceLineNo">426</span>    util.deleteTable(tableName);<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    table.close();<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>  /* Overrides compaction to only output rows with keys that are even numbers */<a name="line.430"></a>
+<span class="sourceLineNo">431</span>  public static class EvenOnlyCompactor implements RegionCoprocessor, RegionObserver {<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    long lastCompaction;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>    long lastFlush;<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 boolean next(List&lt;Cell&gt; results, ScannerContext scannerContext) throws IOException {<a name="line.436"></a>
-<span class="sourceLineNo">437</span>          List&lt;Cell&gt; internalResults = new ArrayList&lt;&gt;();<a name="line.437"></a>
-<span class="sourceLineNo">438</span>          boolean hasMore;<a name="line.438"></a>
-<span class="sourceLineNo">439</span>          do {<a name="line.439"></a>
-<span class="sourceLineNo">440</span>            hasMore = scanner.next(internalResults, scannerContext);<a name="line.440"></a>
-<span class="sourceLineNo">441</span>            if (!internalResults.isEmpty()) {<a name="line.441"></a>
-<span class="sourceLineNo">442</span>              long row = Bytes.toLong(CellUtil.cloneValue(internalResults.get(0)));<a name="line.442"></a>
-<span class="sourceLineNo">443</span>              if (row % 2 == 0) {<a name="line.443"></a>
-<span class="sourceLineNo">444</span>                // return this row<a name="line.444"></a>
-<span class="sourceLineNo">445</span>                break;<a name="line.445"></a>
-<span class="sourceLineNo">446</span>              }<a name="line.446"></a>
-<span class="sourceLineNo">447</span>              // clear and continue<a name="line.447"></a>
-<span class="sourceLineNo">448</span>              internalResults.clear();<a name="line.448"></a>
-<span class="sourceLineNo">449</span>            }<a name="line.449"></a>
-<span class="sourceLineNo">450</span>          } while (hasMore);<a name="line.450"></a>
-<span class="sourceLineNo">451</span><a name="line.451"></a>
-<span class="sourceLineNo">452</span>          if (!internalResults.isEmpty()) {<a name="line.452"></a>
-<span class="sourceLineNo">453</span>            results.addAll(internalResults);<a name="line.453"></a>
-<span class="sourceLineNo">454</span>          }<a name="line.454"></a>
-<span class="sourceLineNo">455</span>          return hasMore;<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 close() throws IOException {<a name="line.459"></a>
-<span class="sourceLineNo">460</span>          scanner.close();<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><a name="line.464"></a>
-<span class="sourceLineNo">465</span>    @Override<a name="line.465"></a>
-<span class="sourceLineNo">466</span>    public void postCompact(ObserverContext&lt;RegionCoprocessorEnvironment&gt; e, Store store,<a name="line.466"></a>
-<span class="sourceLineNo">467</span>        StoreFile resultFile, CompactionLifeCycleTracker tracker, CompactionRequest request) {<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      lastCompaction = EnvironmentEdgeManager.currentTime();<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>    @Override<a name="line.471"></a>
-<span class="sourceLineNo">472</span>    public void postFlush(ObserverContext&lt;RegionCoprocessorEnvironment&gt; e,<a name="line.472"></a>
-<span class="sourceLineNo">473</span>        FlushLifeCycleTracker tracker) {<a name="line.473"></a>
-<span class="sourceLineNo">474</span>      lastFlush = EnvironmentEdgeManager.currentTime();<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>  /**<a name="line.478"></a>
-<span class="sourceLineNo">479</span>   * Tests overriding compaction handling via coprocessor hooks<a name="line.479"></a>
-<span class="sourceLineNo">480</span>   * @throws Exception<a name="line.480"></a>
-<span class="sourceLineNo">481</span>   */<a name="line.481"></a>
-<span class="sourceLineNo">482</span>  @Test<a name="line.482"></a>
-<span class="sourceLineNo">483</span>  public void testCompactionOverride() throws Exception {<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    final TableName compactTable = TableName.valueOf(name.getMethodName());<a name="line.484"></a>
-<span class="sourceLineNo">485</span>    Admin admin = util.getAdmin();<a name="line.485"></a>
-<span class="sourceLineNo">486</span>    if (admin.tableExists(compactTable)) {<a name="line.486"></a>
-<span class="sourceLineNo">487</span>      admin.disableTable(compactTable);<a name="line.487"></a>
-<span class="sourceLineNo">488</span>      admin.deleteTable(compactTable);<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>    HTableDescriptor htd = new HTableDescriptor(compactTable);<a name="line.491"></a>
-<span class="sourceLineNo">492</span>    htd.addFamily(new HColumnDescriptor(A));<a name="line.492"></a>
-<span class="sourceLineNo">493</span>    htd.addCoprocessor(EvenOnlyCompactor.class.getName());<a name="line.493"></a>
-<span class="sourceLineNo">494</span>    admin.createTable(htd);<a name="line.494"></a>
-<span class="sourceLineNo">495</span><a name="line.495"></a>
-<span class="sourceLineNo">496</span>    Table table = util.getConnection().getTable(compactTable);<a name="line.496"></a>
-<span class="sourceLineNo">497</span>    for (long i = 1; i &lt;= 10; i++) {<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      byte[] iBytes = Bytes.toBytes(i);<a name="line.498"></a>
-<span class="sourceLineNo">499</span>      Put put = new Put(iBytes);<a name="line.499"></a>
-<span class="sourceLineNo">500</span>      put.setDurability(Durability.SKIP_WAL);<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      put.addColumn(A, A, iBytes);<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      table.put(put);<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>    HRegion firstRegion = cluster.getRegions(compactTable).get(0);<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    Coprocessor cp = firstRegion.getCoprocessorHost().findCoprocessor(EvenOnlyCompactor.class);<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    assertNotNull("EvenOnlyCompactor coprocessor should be loaded", cp);<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    EvenOnlyCompactor compactor = (EvenOnlyCompactor) cp;<a name="line.508"></a>
-<span class="sourceLineNo">509</span><a name="line.509"></a>
-<span class="sourceLineNo">510</span>    // force a compaction<a name="line.510"></a>
-<span class="sourceLineNo">511</span>    long ts = System.currentTimeMillis();<a name="line.511"></a>
-<span class="sourceLineNo">512</span>    admin.flush(compactTable);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    // wait for flush<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.514"></a>
-<span class="sourceLineNo">515</span>      if (compactor.lastFlush &gt;= ts) {<a name="line.515"></a>
-<span class="sourceLineNo">516</span>        break;<a name="line.516"></a>
-<span class="sourceLineNo">517</span>      }<a name="line.517"></a>
-<span class="sourceLineNo">518</span>      Thread.sleep(1000);<a name="line.518"></a>
-<span class="sourceLineNo">519</span>    }<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    assertTrue("Flush didn't complete", compactor.lastFlush &gt;= ts);<a name="line.520"></a>
-<span class="sourceLineNo">521</span>    LOG.debug("Flush complete");<a name="line.521"></a>
-<span class="sourceLineNo">522</span><a name="line.522"></a>
-<span class="sourceLineNo">523</span>    ts = compactor.lastFlush;<a name="line.523"></a>
-<span class="sourceLineNo">524</span>    admin.majorCompact(compactTable);<a name="line.524"></a>
-<span class="sourceLineNo">525</span>    // wait for compaction<a name="line.525"></a>
-<span class="sourceLineNo">526</span>    for (int i = 0; i &lt; 30; i++) {<a name="line.526"></a>
-<span class="sourceLineNo">527</span>      if (compactor.lastCompaction &gt;= ts) {<a name="line.527"></a>
-<span class="sourceLineNo">528</span>        break;<a name="line.528"></a>
-<span class="sourceLineNo">529</span>      }<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      Thread.sleep(1000);<a name="line.530"></a>
-<span class="sourceLineNo">531</span>    }<a name="line.531"></a>
-<span class="sourceLineNo">532</span>    LOG.debug("Last compaction was at " + compactor.lastCompaction);<a name="line.532"></a>
-<span class="sourceLineNo">533</span>    assertTrue("Compaction didn't complete", compactor.lastCompaction &gt;= ts);<a name="line.533"></a>
-<span class="sourceLineNo">534</span><a name="line.534"></a>
-<span class="sourceLineNo">535</span>    // only even rows should remain<a name="line.535"></a>
-<span class="sourceLineNo">536</span>    ResultScanner scanner = table.getScanner(new Scan());<a name="line.536"></a>
-<span class="sourceLineNo">537</span>    try {<a name="line.537"></a>
-<span class="sourceLineNo">538</span>      for (long i = 2; i &lt;= 10; i += 2) {<a name="line.538"></a>
-<span class="sourceLineNo">539</span>        Result r = scanner.next();<a name="line.539"></a>
-<span class="sourceLineNo">540</span>        assertNotNull(r);<a name="line.540"></a>
-<span class="sourceLineNo">541</span>        assertFalse(r.isEmpty());<a name="line.541"></a>
-<span class="sourceLineNo">542</span>        byte[] iBytes = Bytes.toBytes(i);<a name="line.542"></a>
-<span class="sourceLineNo">543</span>        assertArrayEquals("Row should be " + i, r.getRow(), iBytes);<a name="line.543"></a>
-<span class="sourceLineNo">544</span>        assertArrayEquals("Value should be " + i, r.getValue(A, A), iBytes);<a name="line.544"></a>
-<span class="sourceLineNo">545</span>      }<a name="line.545"></a>
-<span class="sourceLineNo">546</span>    } finally {<a name="line.546"></a>
-<span class="sourceLineNo">547</span>      scanner.close();<a name="line.547"></a>
-<span class="sourceLineNo">548</span>    }<a name="line.548"></a>
-<span class="sourceLineNo">549</span>    table.close();<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>  @Test<a name="line.552"></a>
-<span class="sourceLineNo">553</span>  public void bulkLoadHFileTest() throws Exception {<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    final String testName = TestRegionObserverInterface.class.getName() + "." + name.getMethodName();<a name="line.554"></a>
-<span class="sourceLineNo">555</span>    final TableName tableName = TableName.valueOf(TEST_TABLE.getNameAsString() + "." + name.getMethodName());<a name="line.555"></a>
-<span class="sourceLineNo">556</span>    Configuration conf = util.getConfiguration();<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    Table table = util.createTable(tableName, new byte[][] { A, B, C });<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    try (RegionLocator locator = util.getConnection().getRegionLocator(tableName)) {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>      verifyMethodResult(SimpleRegionObserver.class,<a name="line.559"></a>
-<span class="sourceLineNo">560</span>        new String[] { "hadPreBulkLoadHFile", "hadPostBulkLoadHFile" }, tableName,<a name="line.560"></a>
-<span class="sourceLineNo">561</span>        new Boolean[] { false, false });<a name="line.561"></a>
+<span class="sourceLineNo">435</span>    @Override<a name="line.435"></a>
+<span class="sourceLineNo">436</span>    public Optional&lt;RegionObserver&gt; getRegionObserver() {<a name="line.436"></a>
+<span class="sourceLineNo">437</span>      return Optional.of(this);<a name="line.437"></a>
+<span class="sourceLineNo">438</span>    }<a name="line.438"></a>
+<span class="sourceLineNo">439</span><a name="line.439"></a>
+<span class="sourceLineNo">440</span>    @Override<a name="line.440"></a>
+<span class="sourceLineNo">441</span>    public InternalScanner preCompact(ObserverContext&lt;RegionCoprocessorEnvironment&gt; e, Store store,<a name="line.441"></a>
+<span class="sourceLineNo">442</span>        InternalScanner scanner, ScanType scanType, CompactionLifeCycleTracker tracker,<a name="line.442"></a>
+<span class="sourceLineNo">443</span>        CompactionRequest request) {<a name="line.443"></a>
+<span class="sourceLineNo">444</span>      return new InternalScanner() {<a name="line.444"></a>
+<span class="sourceLineNo">445</span><a name="line.445"></a>
+<span class="sourceLineNo">446</span>        @Override<a name="line.446"></a>
+<span class="sourceLineNo">447</span>        public boolean next(List&lt;Cell&gt; results, ScannerContext scannerContext) throws IOException {<a name="line.447"></a>
+<span class="sourceLineNo">448</span>          List&lt;Cell&gt; internalResults = new ArrayList&lt;&gt;();<a name="line.448"></a>
+<span class="sourceLineNo">449</span>          boolean hasMore;<a name="line.449"></a>
+<span class="sourceLineNo">450</span>          do {<a name="line.450"></a>
+<span class="sourceLineNo">451</span>            hasMore = scanner.next(internalResults, scannerContext);<a name="line.451"></a>
+<span class="sourceLineNo">452</span>            if (!internalResults.isEmpty()) {<a name="line.452"></a>
+<span class="sourceLineNo">453</span>              long row = Bytes.toLong(CellUtil.cloneValue(internalResults.get(0)));<a name="line.453"></a>
+<span class="sourceLineNo">454</span>              if (row % 2 == 0) {<a name="line.454"></a>
+<span class="sourceLineNo">455</span>                // return this row<a name="line.455"></a>
+<span class="sourceLineNo">456</span>                break;<a name="line.456"></a>
+<span class="sourceLineNo">457</span>              }<a name="line.457"></a>
+<span class="sourceLineNo">458</span>              // clear and continue<a name="line.458"></a>
+<span class="sourceLineNo">459</span>              internalResults.clear();<a name="line.459"></a>
+<span class="sourceLineNo">460</span>            }<a name="line.460"></a>
+<span class="sourceLineNo">461</span>          } while (hasMore);<a name="line.461"></a>
+<span class="sourceLineNo">462</span><a name="line.462"></a>
+<span class="sourceLineNo">463</span>          if (!internalResults.isEmpty()) {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>            results.addAll(internalResults);<a name="line.464"></a>
+<span class="sourceLineNo">465</span>          }<a name="line.465"></a>
+<span class="sourceLineNo">466</span>          return hasMore;<a name="line.466"></a>
+<span class="sourceLineNo">467</span>        }<a name="line.467"></a>
+<span class="sourceLineNo">468</span><a name="line.468"></a>
+<span class="sourceLineNo">469</span>        @Override<a name="line.469"></a>
+<span class="sourceLineNo">470</span>        public void close() throws IOException {<a name="line.470"></a>
+<span class="sourceLineNo">471</span>          scanner.close();<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>    }<a name="line.474"></a>
+<span class="sourceLineNo">475</span><a name="line.475"></a>
+<span class="sourceLineNo">476</span>    @Override<a name="line.476"></a>
+<span class="sourceLineNo">477</span>    public void postCompact(ObserverContext&lt;RegionCoprocessorEnvironment&gt; e, Store store,<a name="line.477"></a>
+<span class="sourceLineNo">478</span>        StoreFile resultFile, CompactionLifeCycleTracker tracker, CompactionRequest request) {<a name="line.478"></a>
+<span class="sourceLineNo">479</span>      lastCompaction = EnvironmentEdgeManager.currentTime();<a name="line.479"></a>
+<span class="sourceLineNo">480</span>    }<a name="line.480"></a>
+<span class="sourceLineNo">481</span><a name="line.481"></a>
+<span class="sourceLineNo">482</span>    @Override<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    public void postFlush(ObserverContext&lt;RegionCoprocessorEnvironment&gt; e,<a name="line.483"></a>
+<span class="sourceLineNo">484</span>        FlushLifeCycleTracker tracker) {<a name="line.484"></a>
+<span class="sourceLineNo">485</span>      lastFlush = EnvironmentEdgeManager.currentTime();<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>  /**<a name="line.489"></a>
+<span class="sourceLineNo">490</span>   * Tests overriding compaction handling via coprocessor hooks<a name="line.490"></a>
+<span class="sourceLineNo">491</span>   * @throws Exception<a name="line.491"></a>
+<span class="sourceLineNo">492</span>   */<a name="line.492"></a>
+<span class="sourceLineNo">493</span>  @Test<a name="line.493"></a>
+<span class="sourceLineNo">494</span>  public void testCompactionOverride() throws Exception {<a name="line.494"></a>
+<span class="sourceLineNo">495</span>    final TableName compactTable = TableName.valueOf(name.getMethodName());<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    Admin admin = util.getAdmin();<a name="line.496"></a>
+<span class="sourceLineNo">497</span>    if (admin.tableExists(compactTable)) {<a name="line.497"></a>
+<span class="sourceLineNo">498</span>      admin.disableTable(compactTable);<a name="line.498"></a>
+<span class="sourceLineNo">499</span>      admin.deleteTable(compactTable);<a name="line.499"></a>
+<span class="sourceLineNo">500</span>    }<a name="line.500"></a>
+<span class="sourceLineNo">501</span><a name="line.501"></a>
+<span class="sourceLineNo">502</span>    HTableDescriptor htd = new HTableDescriptor(compactTable);<a name="line.502"></a>
+<span class="sourceLineNo">503</span>    htd.addFamily(new HColumnDescriptor(A));<a name="line.503"></a>
+<span class="sourceLineNo">504</span>    htd.addCoprocessor(EvenOnlyCompactor.class.getName());<a name="line.504"></a>
+<span class="sourceLineNo">505</span>    admin.createTable(htd);<a name="line.505"></a>
+<span class="sourceLineNo">506</span><a name="line.506"></a>
+<span class="sourceLineNo">507</span>    Table table = util.getConnection().getTable(compactTable);<a name="line.507"></a>
+<span class="sourceLineNo">508</span>    for (long i = 1; i &lt;= 10; i++) {<a name="line.508"></a>
+<span class="sourceLineNo">509</span>      byte[] iBytes = Bytes.toBytes(i);<a name="line.509"></a>
+<span class="sourceLineNo">510</span>      Put put = new Put(iBytes);<a name="line.510"></a>
+<span class="sourceLineNo">511</span>      put.setDurability(Durability.SKIP_WAL);<a name="line.511"></a>
+<span class="sourceLineNo">512</span>      put.addColumn(A, A, iBytes);<a name="line.512"></a>
+<span class="sourceLineNo">513</span>      table.put(put);<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>    HRegion firstRegion = cluster.getRegions(compactTable).get(0);<a name="line.516"></a>
+<span class="sourceLineNo">517</span>    Coprocessor cp = firstRegion.getCoprocessorHost().findCoprocessor(EvenOnlyCompactor.class);<a name="line.517"></a>
+<span class="sourceLineNo">518</span>    assertNotNull("EvenOnlyCompactor coprocessor should be loaded", cp);<a name="line.518"></a>
+<span class="sourceLineNo">519</span>    EvenOnlyCompactor compactor = (EvenOnlyCompactor) cp;<a name="line.519"></a>
+<span class="sourceLineNo">520</span><a name="line.520"></a>
+<span class="sourceLineNo">521</span>    // force a compaction<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    long ts = System.currentTimeMillis();<a name="line.522"></a>
+<span class="sourceLineNo">523</span>    admin.flush(compactTable);<a name="line.523"></a>
+<span class="sourceLineNo">524</span>    // wait for flush<a name="line.524"></a>
+<span class="sourceLineNo">525</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.525"></a>
+<span class="sourceLineNo">526</span>      if (compactor.lastFlush &gt;= ts) {<a name="line.526"></a>
+<span class="sourceLineNo">527</span>        break;<a name="line.527"></a>
+<span class="sourceLineNo">528</span>      }<a name="line.528"></a>
+<span class="sourceLineNo">529</span>      Thread.sleep(1000);<a name="line.529"></a>
+<span class="sourceLineNo">530</span>    }<a name="line.530"></a>
+<span class="sourceLineNo">531</span>    assertTrue("Flush didn't complete", compactor.lastFlush &gt;= ts);<a name="line.531"></a>
+<span class="sourceLineNo">532</span>    LOG.debug("Flush complete");<a name="line.532"></a>
+<span class="sourceLineNo">533</span><a name="line.533"></a>
+<span class="sourceLineNo">534</span>    ts = compactor.lastFlush;<a name="line.534"></a>
+<span class="sourceLineNo">535</span>    admin.majorCompact(compactTable);<a name="line.535"></a>
+<span class="sourceLineNo">536</span>    // wait for compaction<a name="line.536"></a>
+<span class="sourceLineNo">537</span>    for (int i = 0; i &lt; 30; i++) {<a name="line.537"></a>
+<span class="sourceLineNo">538</span>      if (compactor.lastCompaction &gt;= ts) {<a name="line.538"></a>
+<span class="sourceLineNo">539</span>        break;<a name="line.539"></a>
+<span class="sourceLineNo">540</span>      }<a name="line.540"></a>
+<span class="sourceLineNo">541</span>      Thread.sleep(1000);<a name="line.541"></a>
+<span class="sourceLineNo">542</span>    }<a name="line.542"></a>
+<span class="sourceLineNo">543</span>    LOG.debug("Last compaction was at " + compactor.lastCompaction);<a name="line.543"></a>
+<span class="sourceLineNo">544</span>    assertTrue("Compaction didn't complete", compactor.lastCompaction &gt;= ts);<a name="line.544"></a>
+<span class="sourceLineNo">545</span><a name="line.545"></a>
+<span class="sourceLineNo">546</span>    // only even rows should remain<a name="line.546"></a>
+<span class="sourceLineNo">547</span>    ResultScanner scanner = table.getScanner(new Scan());<a name="line.547"></a>
+<span class="sourceLineNo">548</span>    try {<a name="line.548"></a>
+<span class="sourceLineNo">549</span>      for (long i = 2; i &lt;= 10; i += 2) {<a name="line.549"></a>
+<span class="sourceLineNo">550</span>        Result r = scanner.next();<a name="line.550"></a>
+<span class="sourceLineNo">551</span>        assertNotNull(r);<a name="line.551"></a>
+<span class="sourceLineNo">552</span>        assertFalse(r.isEmpty());<a name="line.552"></a>
+<span class="sourceLineNo">553</span>        byte[] iBytes = Bytes.toBytes(i);<a name="line.553"></a>
+<span class="sourceLineNo">554</span>        assertArrayEquals("Row should be " + i, r.getRow(), iBytes);<a name="line.554"></a>
+<span class="sourceLineNo">555</span>        assertArrayEquals("Value should be " + i, r.getValue(A, A), iBytes);<a name="line.555"></a>
+<span class="sourceLineNo">556</span>      }<a name="line.556"></a>
+<span class="sourceLineNo">557</span>    } finally {<a name="line.557"></a>
+<span class="sourceLineNo">558</span>      scanner.close();<a name="line.558"></a>
+<span class="sourceLineNo">559</span>    }<a name="line.559"></a>
+<span class="sourceLineNo">560</span>    table.close();<a name="line.560"></a>
+<span class="sourceLineNo">561</span>  }<a name="line.561"></a>
 <span class="sourceLineNo">562</span><a name="line.562"></a>
-<span class="sourceLineNo">563</span>      FileSystem fs = util.getTestFileSystem();<a name="line.563"></a>
-<span class="sourceLineNo">564</span>      final Path dir = util.getDataTestDirOnTestFS(testName).makeQualified(fs);<a name="line.564"></a>
-<span class="sourceLineNo">565</span>      Path familyDir = new Path(dir, Bytes.toString(A));<a name="line.565"></a>
-<span class="sourceLineNo">566</span><a name="line.566"></a>
-<span class="sourceLineNo">567</span>      createHFile(util.getConfiguration(), fs, new Path(familyDir, Bytes.toString(A)), A, A);<a name="line.567"></a>
-<span class="sourceLineNo">568</span><a name="line.568"></a>
-<span class="sourceLineNo">569</span>      // Bulk load<a name="line.569"></a>
-<span class="sourceLineNo">570</span>      BulkLoadHFiles.create(conf).bulkLoad(tableName, dir);<a name="line.570"></a>
-<span class="sourceLineNo">571</span><a name="line.571"></a>
-<span class="sourceLineNo">572</span>      verifyMethodResult(SimpleRegionObserver.class,<a name="line.572"></a>
-<span class="sourceLineNo">573</span>        new String[] { "hadPreBulkLoadHFile", "hadPostBulkLoadHFile" }, tableName,<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        new Boolean[] { true, true });<a name="line.574"></a>
-<span class="sourceLineNo">575</span>    } finally {<a name="line.575"></a>
-<span class="sourceLineNo">576</span>      util.deleteTable(tableName);<a name="line.576"></a>
-<span class="sourceLineNo">577</span>      table.close();<a name="line.577"></a>
-<span class="sourceLineNo">578</span>    }<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>  @Test<a name="line.581"></a>
-<span class="sourceLineNo">582</span>  public void testRecovery() throws Exception {<a name="line.582"></a>
-<span class="sourceLineNo">583</span>    LOG.info(TestRegionObserverInterface.class.getName() + "." + name.getMethodName());<a name="line.583"></a>
-<span class="sourceLineNo">584</span>    final TableName tableName = TableName.valueOf(TEST_TABLE.getNameAsString() + "." + name.getMethodName());<a name="line.584"></a>
-<span class="sourceLineNo">585</span>    Table table = util.createTable(tableName, new byte[][] { A, B, C });<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    try (RegionLocator locator = util.getConnection().getRegionLocator(tableName)) {<a name="line.586"></a>
-<span class="sourceLineNo">587</span><a name="line.587"></a>
-<span class="sourceLineNo">588</span>      JVMClusterUtil.RegionServerThread rs1 = cluster.startRegionServer();<a name="line.588"></a>
-<span class="sourceLineNo">589</span>      ServerName sn2 = rs1.getRegionServer().getServerName();<a name="line.589"></a>
-<span class="sourceLineNo">590</span>      String regEN = locator.getAllRegionLocations().get(0).getRegion().getEncodedName();<a name="line.590"></a>
+<span class="sourceLineNo">563</span>  @Test<a name="line.563"></a>
+<span class="sourceLineNo">564</span>  public void bulkLoadHFileTest() throws Exception {<a name="line.564"></a>
+<span class="sourceLineNo">565</span>    final String testName = TestRegionObserverInterface.class.getName() + "." + name.getMethodName();<a name="line.565"></a>
+<span class="sourceLineNo">566</span>    final TableName tableName = TableName.valueOf(TEST_TABLE.getNameAsString() + "." + name.getMethodName());<a name="line.566"></a>
+<span class="sourceLineNo">567</span>    Configuration conf = util.getConfiguration();<a name="line.567"></a>
+<span class="sourceLineNo">568</span>    Table table = util.createTable(tableName, new byte[][] { A, B, C });<a name="line.568"></a>
+<span class="sourceLineNo">569</span>    try (RegionLocator locator = util.getConnection().getRegionLocator(tableName)) {<a name="line.569"></a>
+<span class="sourceLineNo">570</span>      verifyMethodResult(SimpleRegionObserver.class,<a name="line.570"></a>
+<span class="sourceLineNo">571</span>        new String[] { "hadPreBulkLoadHFile", "hadPostBulkLoadHFile" }, tableName,<a name="line.571"></a>
+<span class="sourceLineNo">572</span>        new Boolean[] { false, false });<a name="line.572"></a>
+<span class="sourceLineNo">573</span><a name="line.573"></a>
+<span class="sourceLineNo">574</span>      FileSystem fs = util.getTestFileSystem();<a name="line.574"></a>
+<span class="sourceLineNo">575</span>      final Path dir = util.getDataTestDirOnTestFS(testName).makeQualified(fs);<a name="line.575"></a>
+<span class="sourceLineNo">576</span>      Path familyDir = new Path(dir, Bytes.toString(A));<a name="line.576"></a>
+<span class="sourceLineNo">577</span><a name="line.577"></a>
+<span class="sourceLineNo">578</span>      createHFile(util.getConfiguration(), fs, new Path(familyDir, Bytes.toString(A)), A, A);<a name="line.578"></a>
+<span class="sourceLineNo">579</span><a name="line.579"></a>
+<span class="sourceLineNo">580</span>      // Bulk load<a name="line.580"></a>
+<span class="sourceLineNo">581</span>      BulkLoadHFiles.create(conf).bulkLoad(tableName, dir);<a name="line.581"></a>
+<span class="sourceLineNo">582</span><a name="line.582"></a>
+<span class="sourceLineNo">583</span>      verifyMethodResult(SimpleRegionObserver.class,<a name="line.583"></a>
+<span class="sourceLineNo">584</span>        new String[] { "hadPreBulkLoadHFile", "hadPostBulkLoadHFile" }, tableName,<a name="line.584"></a>
+<span class="sourceLineNo">585</span>        new Boolean[] { true, true });<a name="line.585"></a>
+<span class="sourceLineNo">586</span>    } finally {<a name="line.586"></a>
+<span class="sourceLineNo">587</span>      util.deleteTable(tableName);<a name="line.587"></a>
+<span class="sourceLineNo">588</span>      table.close();<a name="line.588"></a>
+<span class="sourceLineNo">589</span>    }<a name="line.589"></a>
+<span class="sourceLineNo">590</span>  }<a name="line.590"></a>
 <span class="sourceLineNo">591</span><a name="line.591"></a>
-<span class="sourceLineNo">592</span>      util.getAdmin().move(Bytes.toBytes(regEN), sn2);<a name="line.592"></a>
-<span class="sourceLineNo">593</span>      while (!sn2.equals(locator.getAllRegionLocations().get(0).getServerName())) {<a name="line.593"></a>
-<span class="sourceLineNo">594</span>        Thread.sleep(100);<a name="line.594"></a>
-<span class="sourceLineNo">595</span>      }<a name="line.595"></a>
-<span class="sourceLineNo">596</span><a name="line.596"></a>
-<span class="sourceLineNo">597</span>      Put put = new Put(ROW);<a name="line.597"></a>
-<span class="sourceLineNo">598</span>      put.addColumn(A, A, A);<a name="line.598"></a>
-<span class="sourceLineNo">599</span>      put.addColumn(B, B, B);<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      put.addColumn(C, C, C);<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      table.put(put);<a name="line.601"></a>
+<span class="sourceLineNo">592</span>  @Test<a name="line.592"></a>
+<span class="sourceLineNo">593</span>  public void testRecovery() throws Exception {<a name="line.593"></a>
+<span class="sourceLineNo">594</span>    LOG.info(TestRegionObserverInterface.class.getName() + "." + name.getMethodName());<a name="line.594"></a>
+<span class="sourceLineNo">595</span>    final TableName tableName = TableName.valueOf(TEST_TABLE.getNameAsString() + "." + name.getMethodName());<a name="line.595"></a>
+<span class="sourceLineNo">596</span>    Table table = util.createTable(tableName, new byte[][] { A, B, C });<a name="line.596"></a>
+<span class="sourceLineNo">597</span>    try (RegionLocator locator = util.getConnection().getRegionLocator(tableName)) {<a name="line.597"></a>
+<span class="sourceLineNo">598</span><a name="line.598"></a>
+<span class="sourceLineNo">599</span>      JVMClusterUtil.RegionServerThread rs1 = cluster.startRegionServer();<a name="line.599"></a>
+<span class="sourceLineNo">600</span>      ServerName sn2 = rs1.getRegionServer().getServerName();<a name="line.600"></a>
+<span class="sourceLineNo">601</span>      String regEN = locator.getAllRegionLocations().get(0).getRegion().getEncodedName();<a name="line.601"></a>
 <span class="sourceLineNo">602</span><a name="line.602"></a>
-<span class="sourceLineNo">603</span>      // put two times<a name="line.603"></a>
-<span class="sourceLineNo">604</span>      table.put(put);<a name="line.604"></a>
-<span class="sourceLineNo">605</span><a name="line.605"></a>
-<span class="sourceLineNo">606</span>      verifyMethodResult(SimpleRegionObserver.class,<a name="line.606"></a>
-<span class="sourceLineNo">607</span>        new String[] { "hadPreGet", "hadPostGet", "hadPrePut", "hadPostPut", "hadPreBatchMutate",<a name="line.607"></a>
-<span class="sourceLineNo">608</span>            "hadPostBatchMutate", "hadDelete" },<a name="line.608"></a>
-<span class="sourceLineNo">609</span>        tableName, new Boolean[] { false, false, true, true, true, true, false });<a name="line.609"></a>
-<span class="sourceLineNo">610</span><a name="line.610"></a>
-<span class="sourceLineNo">611</span>      verifyMethodResult(SimpleRegionObserver.class,<a name="line.611"></a>
-<span class="sourceLineNo">612</span>        new String[] { "getCtPreReplayWALs", "getCtPostReplayWALs", "getCtPreWALRestore",<a name="line.612"></a>
-<span class="sourceLineNo">613</span>            "getCtPostWALRestore", "getCtPrePut", "getCtPostPut" },<a name="line.613"></a>
-<span class="sourceLineNo">614</span>        tableName, new Integer[] { 0, 0, 0, 0, 2, 2 });<a name="line.614"></a>
-<span class="sourceLineNo">615</span><a name="line.615"></a>
-<span class="sourceLineNo">616</span>      cluster.killRegionServer(rs1.getRegionServer().getServerName());<a name="line.616"></a>
-<span class="sourceLineNo">617</span>      Threads.sleep(1000); // Let the kill soak in.<a name="line.617"></a>
-<span class="sourceLineNo">618</span>      util.waitUntilAllRegionsAssigned(tableName);<a name="line.618"></a>
-<span class="sourceLineNo">619</span>      LOG.info("All regions assigned");<a name="line.619"></a>
-<span class="sourceLineNo">620</span><a name="line.620"></a>
-<span class="sourceLineNo">621</span>      verifyMethodResult(SimpleRegionObserver.class,<a name="line.621"></a>
-<span class="sourceLineNo">622</span>        new String[] { "getCtPreReplayWALs", "getCtPostReplayWALs", "getCtPreWALRestore",<a name="line.622"></a>
-<span class="sourceLineNo">623</span>            "getCtPostWALRestore", "getCtPrePut", "getCtPostPut" },<a name="line.623"></a>
-<span class="sourceLineNo">624</span>        tableName, new Integer[] { 1, 1, 2, 2, 0, 0 });<a name="line.624"></a>
-<span class="sourceLineNo">625</span>    } finally {<a name="line.625"></a>
-<span class="sourceLineNo">626</span>      util.deleteTable(tableName);<a name="line.626"></a>
-<span class="sourceLineNo">627</span>      table.close();<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><a name="line.630"></a>
-<span class="sourceLineNo">631</span>  @Test<a name="line.631"></a>
-<span class="sourceLineNo">632</span>  public void testPreWALRestoreSkip() throws Exception {<a name="line.632"></a>
-<span class="sourceLineNo">633</span>    LOG.info(TestRegionObserverInterface.class.getName() + "." + name.getMethodName());<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    TableName tableName = TableName.valueOf(SimpleRegionObserver.TABLE_SKIPPED);<a name="line.634"></a>
-<span class="sourceLineNo">635</span>    Table table = util.createTable(tableName, new byte[][] { A, B, C });<a name="line.635"></a>
-<span class="sourceLineNo">636</span><a name="line.636"></a>
-<span class="sourceLineNo">637</span>    try (RegionLocator locator = util.getConnection().getRegionLocator(tableName)) {<a name="line.637"></a>
-<span class="sourceLineNo">638</span>      JVMClusterUtil.RegionServerThread rs1 = cluster.startRegionServer();<a name="line.638"></a>
-<span class="sourceLineNo">639</span>      ServerName sn2 = rs1.getRegionServer().getServerName();<a name="line.639"></a>
-<span class="sourceLineNo">640</span>      String regEN = locator.getAllRegionLocations().get(0).getRegion().getEncodedName();<a name="line.640"></a>
+<span class="sourceLineNo">603</span>      util.getAdmin().move(Bytes.toBytes(regEN), sn2);<a name="line.603"></a>
+<span class="sourceLineNo">604</span>      while (!sn2.equals(locator.getAllRegionLocations().get(0).getServerName())) {<a name="line.604"></a>
+<span class="sourceLineNo">605</span>        Thread.sleep(100);<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>      Put put = new Put(ROW);<a name="line.608"></a>
+<span class="sourceLineNo">609</span>      put.addColumn(A, A, A);<a name="line.609"></a>
+<span class="sourceLineNo">610</span>      put.addColumn(B, B, B);<a name="line.610"></a>
+<span class="sourceLineNo">611</span>      put.addColumn(C, C, C);<a name="line.611"></a>
+<span class="sourceLineNo">612</span>      table.put(put);<a name="line.612"></a>
+<span class="sourceLineNo">613</span><a name="line.613"></a>
+<span class="sourceLineNo">614</span>      // put two times<a name="line.614"></a>
+<span class="sourceLineNo">615</span>      table.put(put);<a name="line.615"></a>
+<span class="sourceLineNo">616</span><a name="line.616"></a>
+<span class="sourceLineNo">617</span>      verifyMethodResult(SimpleRegionObserver.class,<a name="line.617"></a>
+<span class="sourceLineNo">618</span>        new String[] { "hadPreGet", "hadPostGet", "hadPrePut", "hadPostPut", "hadPreBatchMutate",<a name="line.618"></a>
+<span class="sourceLineNo">619</span>            "hadPostBatchMutate", "hadDelete" },<a name="line.619"></a>
+<span class="sourceLineNo">620</span>        tableName, new Boolean[] { false, false, true, true, true, true, false });<a name="line.620"></a>
+<span class="sourceLineNo">621</span><a name="line.621"></a>
+<span class="sourceLineNo">622</span>      verifyMethodResult(SimpleRegionObserver.class,<a name="line.622"></a>
+<span class="sourceLineNo">623</span>        new String[] { "getCtPreReplayWALs", "getCtPostReplayWALs", "getCtPreWALRestore",<a name="line.623"></a>
+<span class="sourceLineNo">624</span>            "getCtPostWALRestore", "getCtPrePut", "getCtPostPut" },<a name="line.624"></a>
+<span class="sourceLineNo">625</span>        tableName, new Integer[] { 0, 0, 0, 0, 2, 2 });<a name="line.625"></a>
+<span class="sourceLineNo">626</span><a name="line.626"></a>
+<span class="sourceLineNo">627</span>      cluster.killRegionServer(rs1.getRegionServer().getServerName());<a name="line.627"></a>
+<span class="sourceLineNo">628</span>      Threads.sleep(1000); // Let the kill soak in.<a name="line.628"></a>
+<span class="sourceLineNo">629</span>      util.waitUntilAllRegionsAssigned(tableName);<a name="line.629"></a>
+<span class="sourceLineNo">630</span>      LOG.info("All regions assigned");<a name="line.630"></a>
+<span class="sourceLineNo">631</span><a name="line.631"></a>
+<span class="sourceLineNo">632</span>      verifyMethodResult(SimpleRegionObserver.class,<a name="line.632"></a>
+<span class="sourceLineNo">633</span>        new String[] { "getCtPreReplayWALs", "getCtPostReplayWALs", "getCtPreWALRestore",<a name="line.633"></a>
+<span class="sourceLineNo">634</span>            "getCtPostWALRestore", "getCtPrePut", "getCtPostPut" },<a name="line.634"></a>
+<span class="sourceLineNo">635</span>        tableName, new Integer[] { 1, 1, 2, 2, 0, 0 });<a name="line.635"></a>
+<span class="sourceLineNo">636</span>    } finally {<a name="line.636"></a>
+<span class="sourceLineNo">637</span>      util.deleteTable(tableName);<a name="line.637"></a>
+<span class="sourceLineNo">638</span>      table.close();<a name="line.638"></a>
+<span class="sourceLineNo">639</span>    }<a name="line.639"></a>
+<span class="sourceLineNo">640</span>  }<a name="line.640"></a>
 <span class="sourceLineNo">641</span><a name="line.641"></a>
-<span class="sourceLineNo">642</span>      util.getAdmin().move(Bytes.toBytes(regEN), sn2);<a name="line.642"></a>
-<span class="sourceLineNo">643</span>      while (!sn2.equals(locator.getAllRegionLocations().get(0).getServerName())) {<a name="line.643"></a>
-<span class="sourceLineNo">644</span>        Thread.sleep(100);<a name="line.644"></a>
-<span class="sourceLineNo">645</span>      }<a name="line.645"></a>
-<span class="sourceLineNo">646</span><a name="line.646"></a>
-<span class="sourceLineNo">647</span>      Put put = new Put(ROW);<a name="line.647"></a>
-<span class="sourceLineNo">648</span>      put.addColumn(A, A, A);<a name="line.648"></a>
-<span class="sourceLineNo">649</span>      put.addColumn(B, B, B);<a name="line.649"></a>
-<span class="sourceLineNo">650</span>      put.addColumn(C, C, C);<a name="line.650"></a>
-<span class="sourceLineNo">651</span>      table.put(put);<a name="line.651"></a>
+<span class="sourceLineNo">642</span>  @Test<a name="line.642"></a>
+<span class="sourceLineNo">643</span>  public void testPreWALRestoreSkip() throws Exception {<a name="line.643"></a>
+<span class="sourceLineNo">644</span>    LOG.info(TestRegionObserverInterface.class.getName() + "." + name.getMethodName());<a name="line.644"></a>
+<span class="sourceLineNo">645</span>    TableName tableName = TableName.valueOf(SimpleRegionObserver.TABLE_SKIPPED);<a name="line.645"></a>
+<span class="sourceLineNo">646</span>    Table table = util.createTable(tableName, new byte[][] { A, B, C });<a name="line.646"></a>
+<span class="sourceLineNo">647</span><a name="line.647"></a>
+<span class="sourceLineNo">648</span>    try (RegionLocator locator = util.getConnection().getRegionLocator(tableName)) {<a name="line.648"></a>
+<span class="sourceLineNo">649</span>      JVMClusterUtil.RegionServerThread rs1 = cluster.startRegionServer();<a name="line.649"></a>
+<span class="sourceLineNo">650</span>      ServerName sn2 = rs1.getRegionServer().getServerName();<a name="line.650"></a>
+<span class="sourceLineNo">651</span>      String regEN = locator.getAllRegionLocations().get(0).getRegion().getEncodedName();<a name="line.651"></a>
 <span class="sourceLineNo">652</span><a name="line.652"></a>
-<span class="sourceLineNo">653</span>      cluster.killRegionServer(rs1.getRegionServer().getServerName());<a name="line.653"></a>
-<span class="sourceLineNo">654</span>      Threads.sleep(20000); // just to be sure that the kill has fully started.<a name="line.654"></a>
-<span class="sourceLineNo">655</span>      util.waitUntilAllRegionsAssigned(tableName);<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    }<a name="line.656"></a>
+<span class="sourceLineNo">653</span>      util.getAdmin().move(Bytes.toBytes(regEN), sn2);<a name="line.653"></a>
+<span class="sourceLineNo">654</span>      while (!sn2.equals(locator.getAllRegionLocations().get(0).getServerName())) {<a name="line.654"></a>
+<span class="sourceLineNo">655</span>        Thread.sleep(100);<a name="line.655"></a>
+<span class="sourceLineNo">656</span>      }<a name="line.656"></a>
 <span class="sourceLineNo">657</span><a name="line.657"></a>
-<span class="sourceLineNo">658</span>    verifyMethodResult(SimpleRegionObserver.class,<a name="line.658"></a>
-<span class="sourceLineNo">659</span>      new String[] { "getCtPreWALRestore", "getCtPostWALRestore", }, tableName,<a name="line.659"></a>
-<span class="sourceLineNo">660</span>      new Integer[] { 0, 0 });<a name="line.660"></a>
-<span class="sourceLineNo">661</span><a name="line.661"></a>
-<span class="sourceLineNo">662</span>    util.deleteTable(tableName);<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    table.close();<a name="line.663"></a>
-<span class="sourceLineNo">664</span>  }<a name="line.664"></a>
-<span class="sourceLineNo">665</span><a name="line.665"></a>
-<span class="sourceLineNo">666</span>  // check each region whether the coprocessor upcalls are called or not.<a name="line.666"></a>
-<span class="sourceLineNo">667</span>  private void verifyMethodResult(Class&lt;?&gt; coprocessor, String methodName[], TableName tableName,<a name="line.667"></a>
-<span class="sourceLineNo">668</span>      Object value[]) throws IOException {<a name="line.668"></a>
-<span class="sourceLineNo">669</span>    try {<a name="line.669"></a>
-<span class="sourceLineNo">670</span>      for (JVMClusterUtil.RegionServerThread t : cluster.getRegionServerThreads()) {<a name="line.670"></a>
-<span class="sourceLineNo">671</span>        if (!t.isAlive() || t.getRegionServer().isAborted() || t.getRegionServer().isStopping()) {<a name="line.671"></a>
-<span class="sourceLineNo">672</span>          continue;<a name="line.672"></a>
-<span class="sourceLineNo">673</span>        }<a name="line.673"></a>
-<span class="sourceLineNo">674</span>        for (RegionInfo r : ProtobufUtil<a name="line.674"></a>
-<span class="sourceLineNo">675</span>            .getOnlineRegions(t.getRegionServer().getRSRpcServices())) {<a name="line.675"></a>
-<span class="sourceLineNo">676</span>          if (!r.getTable().equals(tableName)) {<a name="line.676"></a>
-<span class="sourceLineNo">677</span>            continue;<a name="line.677"></a>
-<span class="sourceLineNo">678</span>          }<a name="line.678"></a>
-<span class="sourceLineNo">679</span>          RegionCoprocessorHost cph =<a name="line.679"></a>
-<span class="sourceLineNo">680</span>              t.getRegionServer().getOnlineRegion(r.getRegionName()).getCoprocessorHost();<a name="line.680"></a>
-<span class="sourceLineNo">681</span><a name="line.681"></a>
-<span class="sourceLineNo">682</span>          Coprocessor cp = cph.findCoprocessor(coprocessor.getName());<a name="line.682"></a>
-<span class="sourceLineNo">683</span>          assertNotNull(cp);<a name="line.683"></a>
-<span class="sourceLineNo">684</span>          for (int i = 0; i &lt; methodName.length; ++i) {<a name="line.684"></a>
-<span class="sourceLineNo">685</span>            Method m = coprocessor.getMethod(methodName[i]);<a name="line.685"></a>
-<span class="sourceLineNo">686</span>            Object o = m.invoke(cp);<a name="line.686"></a>
-<span class="sourceLineNo">687</span>            assertTrue("Result of " + coprocessor.getName() + "." + methodName[i]<a name="line.687"></a>
-<span class="sourceLineNo">688</span>                    + " is expected to be " + value[i].toString() + ", while we get "<a name="line.688"></a>
-<span class="sourceLineNo">689</span>                    + o.toString(), o.equals(value[i]));<a name="line.689"></a>
-<span class="sourceLineNo">690</span>          }<a name="line.690"></a>
-<span class="sourceLineNo">691</span>        }<a name="line.691"></a>
-<span class="sourceLineNo">692</span>      }<a name="line.692"></a>
-<span class="sourceLineNo">693</span>    } catch (Exception e) {<a name="line.693"></a>
-<span class="sourceLineNo">694</span>      throw new IOException(e.toString());<a name="line.694"></a>
-<span class="sourceLineNo">695</span>    }<a name="line.695"></a>
-<span class="sourceLineNo">696</span>  }<a name="line.696"></a>
-<span class="sourceLineNo">697</span><a name="line.697"></a>
-<span class="sourceLineNo">698</span>  private static void createHFile(Configuration conf, FileSystem fs, Path path, byte[] family,<a name="line.698"></a>
-<span class="sourceLineNo">699</span>      byte[] qualifier) throws IOException {<a name="line.699"></a>
-<span class="sourceLineNo">700</span>    HFileContext context = new HFileContextBuilder().build();<a name="line.700"></a>
-<span class="sourceLineNo">701</span>    HFile.Writer writer = HFile.getWriterFactory(conf, new CacheConfig(conf)).withPath(fs, path)<a name="line.701"></a>
-<span class="sourceLineNo">702</span>        .withFileContext(context).create();<a name="line.702"></a>
-<span class="sourceLineNo">703</span>    long now = System.currentTimeMillis();<a name="line.703"></a>
-<span class="sourceLineNo">704</span>    try {<a name="line.704"></a>
-<span class="sourceLineNo">705</span>      for (int i = 1; i &lt;= 9; i++) {<a name="line.705"></a>
-<span class="sourceLineNo">706</span>        KeyValue kv =<a name="line.706"></a>
-<span class="sourceLineNo">707</span>            new KeyValue(Bytes.toBytes(i + ""), family, qualifier, now, Bytes.toBytes(i + ""));<a name="line.707"></a>
-<span class="sourceLineNo">708</span>        writer.append(kv);<a name="line.708"></a>
-<span class="sourceLineNo">709</span>      }<a name="line.709"></a>
-<span class="sourceLineNo">710</span>    } finally {<a name="line.710"></a>
-<span class="sourceLineNo">711</span>      writer.close();<a name="line.711"></a>
-<span class="sourceLineNo">712</span>    }<a name="line.712"></a>
-<span class="sourceLineNo">713</span>  }<a name="line.713"></a>
-<span class="sourceLineNo">714</span>}<a name="line.714"></a>
+<span class="sourceLineNo">658</span>      Put put = new Put(ROW);<a name="line.658"></a>
+<span class="sourceLineNo">659</span>      put.addColumn(A, A, A);<a name="line.659"></a>
+<span class="sourceLineNo">660</span>      put.addColumn(B, B, B);<a name="line.660"></a>
+<span class="sourceLineNo">661</span>      put.addColumn(C, C, C);<a name="line.661"></a>
+<span class="sourceLineNo">662</span>      table.put(put);<a name="line.662"></a>
+<span class="sourceLineNo">663</span><a name="line.663"></a>
+<span class="sourceLineNo">664</span>      cluster.killRegionServer(rs1.getRegionServer().getServerName());<a name="line.664"></a>
+<span class="sourceLineNo">665</span>      Threads.sleep(20000); // just to be sure that the kill has fully started.<a name="line.665"></a>
+<span class="sourceLineNo">666</span>      util.waitUntilAllRegionsAssigned(tableName);<a name="line.666"></a>
+<span class="sourceLineNo">667</span>    }<a name="line.667"></a>
+<span class="sourceLineNo">668</span><a name="line.668"></a>
+<span class="sourceLineNo">669</span>    verifyMethodResult(SimpleRegionObserver.class,<a name="line.669"></a>
+<span class="sourceLineNo">670</span>      new String[] { "getCtPreWALRestore", "getCtPostWALRestore", }, tableName,<a name="line.670"></a>
+<span class="sourceLineNo">671</span>      new Integer[] { 0, 0 });<a name="line.671"></a>
+<span class="sourceLineNo">672</span><a name="line.672"></a>
+<span class="sourceLineNo">673</span>    util.deleteTable(tableName);<a name="line.673"></a>
+<span class="sourceLineNo">674</span>    table.close();<a name="line.674"></a>
+<span class="sourceLineNo">675</span>  }<a name="line.675"></a>
+<span class="sourceLineNo">676</span><a name="line.676"></a>
+<span class="sourceLineNo">677</span>  //called from testPreWALAppendIsWrittenToWAL<a name="line.677"></a>
+<span class="sourceLineNo">678</span>  private void testPreWALAppendHook(Table table, TableName tableName) throws IOException {<a name="line.678"></a>
+<span class="sourceLineNo">679</span>    int expectedCalls = 0;<a name="line.679"></a>
+<span class="sourceLineNo">680</span>    String [] methodArray = new String[1];<a name="line.680"></a>
+<span class="sourceLineNo">681</span>    methodArray[0] = "getCtPreWALAppend";<a name="line.681"></a>
+<span class="sourceLineNo">682</span>    Object[] resultArray = new Object[1];<a name="line.682"></a>
+<span class="sourceLineNo">683</span><a name="line.683"></a>
+<span class="sourceLineNo">684</span>    Put p = new Put(ROW);<a name="line.684"></a>
+<span class="sourceLineNo">685</span>    p.addColumn(A, A, A);<a name="line.685"></a>
+<span class="sourceLineNo">686</span>    table.put(p);<a name="line.686"></a>
+<span class="sourceLineNo">687</span>    resultArray[0] = ++expectedCalls;<a name="line.687"></a>
+<span class="sourceLineNo">688</span>    verifyMethodResult(SimpleRegionObserver.class, methodArray, tableName, resultArray);<a name="line.688"></a>
+<span class="sourceLineNo">689</span><a name="line.689"></a>
+<span class="sourceLineNo">690</span>    Append a = new Append(ROW);<a name="line.690"></a>
+<span class="sourceLineNo">691</span>    a.addColumn(B, B, B);<a name="line.691"></a>
+<span class="sourceLineNo">692</span>    table.append(a);<a name="line.692"></a>
+<span class="sourceLineNo">693</span>    resultArray[0] = ++expectedCalls;<a name="line.693"></a>
+<span class="sourceLineNo">694</span>    verifyMethodResult(SimpleRegionObserver.class, methodArray, tableName, resultArray);<a name="line.694"></a>
+<span class="sourceLineNo">695</span><a name="line.695"></a>
+<span class="sourceLineNo">696</span>    Increment i = new Increment(ROW);<a name="line.696"></a>
+<span class="sourceLineNo">697</span>    i.addColumn(C, C, 1);<a name="line.697"></a>
+<span class="sourceLineNo">698</span>    table.increment(i);<a name="line.698"></a>
+<span class="sourceLineNo">699</span>    resultArray[0] = ++expectedCalls;<a name="line.699"></a>
+<span class="sourceLineNo">700</span>    verifyMethodResult(SimpleRegionObserver.class, methodArray, tableName, resultArray);<a name="line.700"></a>
+<span class="sourceLineNo">701</span><a name="line.701"></a>
+<span class="sourceLineNo">702</span>    Delete d = new Delete(ROW);<a name="line.702"></a>
+<span class="sourceLineNo">703</span>    table.delete(d);<a name="line.703"></a>
+<span class="sourceLineNo">704</span>    resultArray[0] = ++expectedCalls;<a name="line.704"></a>
+<span class="sourceLineNo">705</span>    verifyMethodResult(SimpleRegionObserver.class, methodArray, tableName, resultArray);<a name="line.705"></a>
+<span class="sourceLineNo">706</span>  }<a name="line.706"></a>
+<span class="sourceLineNo">707</span><a name="line.707"></a>
+<span class="sourceLineNo">708</span>  @Test<a name="line.708"></a>
+<span class="sourceLineNo">709</span>  public void testPreWALAppend() throws Exception {<a name="line.709"></a>
+<span class="sourceLineNo">710</span>    SimpleRegionObserver sro = new SimpleRegionObserver();<a name="line.710"></a>
+<span class="sourceLineNo">711</span>    ObserverContext ctx = Mockito.mock(ObserverContext.class);<a name="line.711"></a>
+<span class="sourceLineNo">712</span>    WALKey key = new WALKeyImpl(Bytes.toBytes("region"), TEST_TABLE,<a name="line.712"></a>
+<span class="sourceLineNo">713</span>        EnvironmentEdgeManager.currentTime());<a name="line.713"></a>
+<span class="sourceLineNo">714</span>    WALEdit edit = new WALEdit();<a name="line.714"></a>
+<span class="sourceLineNo">715</span>    sro.preWALAppend(ctx, key, edit);<a name="line.715"></a>
+<span class="sourceLineNo">716</span>    Assert.assertEquals(1, key.getExtendedAttributes().size());<a name="line.716"></a>
+<span class="sourceLineNo">717</span>    Assert.assertArrayEquals(SimpleRegionObserver.WAL_EXTENDED_ATTRIBUTE_BYTES,<a name="line.717"></a>
+<span class="sourceLineNo">718</span>        key.getExtendedAttribute(Integer.toString(sro.getCtPreWALAppend())));<a name="line.718"></a>
+<span class="sourceLineNo">719</span>  }<a name="line.719"></a>
+<span class="sourceLineNo">720</span><a name="line.720"></a>
+<span class="sourceLineNo">721</span>  @Test<a name="line.721"></a>
+<span class="sourceLineNo">722</span>  public void testPreWALAppendIsWrittenToWAL() throws Exception {<a name="line.722"></a>
+<span class="sourceLineNo">723</span>    final TableName tableName = TableName.valueOf(TEST_TABLE.getNameAsString() +<a name="line.723"></a>
+<span class="sourceLineNo">724</span>        "." + name.getMethodName());<a name="line.724"></a>
+<span class="sourceLineNo">725</span>    Table table = util.createTable(tableName, new byte[][] { A, B, C });<a name="line.725"></a>
+<span class="sourceLineNo">726</span><a name="line.726"></a>
+<span class="sourceLineNo">727</span>    PreWALAppendWALActionsListener listener = new PreWALAppendWALActionsListener();<a name="line.727"></a>
+<span class="sourceLineNo">728</span>    List&lt;HRegion&gt; regions = util.getHBaseCluster().getRegions(tableName);<a name="line.728"></a>
+<span class="sourceLineNo">729</span>    //should be only one region<a name="line.729"></a>
+<span class="sourceLineNo">730</span>    HRegion region = regions.get(0);<a name="line.730"></a>
+<span class="sourceLineNo">731</span>    region.getWAL().registerWALActionsListener(listener);<a name="line.731"></a>
+<span class="sourceLineNo">732</span>    testPreWALAppendHook(table, tableName);<a name="line.732"></a>
+<span class="sourceLineNo">733</span>    boolean[] expectedResults = {true, true, true, true};<a name="line.733"></a>
+<span class="sourceLineNo">734</span>    Assert.assertArrayEquals(expectedResults, listener.getWalKeysCorrectArray());<a name="line.734"></a>
+<span class="sourceLineNo">735</span><a name="line.735"></a>
+<span class="sourceLineNo">736</span>  }<a name="line.736"></a>
+<span class="sourceLineNo">737</span><a name="line.737"></a>
+<span class="sourceLineNo">738</span>  @Test<a name="line.738"></a>
+<span class="sourceLineNo">739</span>  public void testPreWALAppendNotCalledOnMetaEdit() throws Exception {<a name="line.739"></a>
+<span class="sourceLineNo">740</span>    final TableName tableName = TableName.valueOf(TEST_TABLE.getNameAsString() +<a name="line.740"></a>
+<span class="sourceLineNo">741</span>        "." + name.getMethodName());<a name="line.741"></a>
+<span class="sourceLineNo">742</span>    TableDescriptorBuilder tdBuilder = TableDescriptorBuilder.newBuilder(tableName);<a name="line.742"></a>
+<span class="sourceLineNo">743</span>    ColumnFamilyDescriptorBuilder cfBuilder = ColumnFamilyDescriptorBuilder.newBuilder(FAMILY);<a name="line.743"></a>
+<span class="sourceLineNo">744</span>    tdBuilder.setColumnFamily(cfBuilder.build());<a name="line.744"></a>
+<span class="sourceLineNo">745</span>    tdBuilder.setCoprocessor(SimpleRegionObserver.class.getName());<a name="line.745"></a>
+<span class="sourceLineNo">746</span>    TableDescriptor td = tdBuilder.build();<a name="line.746"></a>
+<span class="sourceLineNo">747</span>    Table table = util.createTable(td, new byte[][] { A, B, C });<a name="line.747"></a>
+<span class="sourceLineNo">748</span><a name="line.748"></a>
+<span class="sourceLineNo">749</span>    PreWALAppendWALActionsListener listener = new PreWALAppendWALActionsListener();<a name="line.749"></a>
+<span class="sourceLineNo">750</span>    List&lt;HRegion&gt; regions = util.getHBaseCluster().getRegions(tableName);<a name="line.750"></a>
+<span class="sourceLineNo">751</span>    //should be only one region<a name="line.751"></a>
+<span class="sourceLineNo">752</span>    HRegion region = regions.get(0);<a name="line.752"></a>
+<span class="sourceLineNo">753</span><a name="line.753"></a>
+<span class="sourceLineNo">754</span>    region.getWAL().registerWALActionsListener(listener);<a name="line.754"></a>
+<span class="sourceLineNo">755</span>    //flushing should write to the WAL<a name="line.755"></a>
+<span class="sourceLineNo">756</span>    region.flush(true);<a name="line.756"></a>
+<span class="sourceLineNo">757</span>    //so should compaction<a name="line.757"></a>
+<span class="sourceLineNo">758</span>    region.compact(false);<a name="line.758"></a>
+<span class="sourceLineNo">759</span>    //and so should closing the region<a name="line.759"></a>
+<span class="sourceLineNo">760</span>    region.close();<a name="line.760"></a>
+<span class="sourceLineNo">761</span><a name="line.761"></a>
+<span class="sourceLineNo">762</span>    //but we still shouldn't have triggered preWALAppend because no user data was written<a name="line.762"></a>
+<span class="sourceLineNo">763</span>    String[] methods = new String[] {"getCtPreWALAppend"};<a name="line.763"></a>
+<span class="sourceLineNo">764</span>    Object[] expectedResult = new Integer[]{0};<a name="line.764"></a>
+<span class="sourceLineNo">765</span>    verifyMethodResult(SimpleRegionObserver.class, methods, tableName, expectedResult);<a name="line.765"></a>
+<span class="sourceLineNo">766</span>  }<a name="line.766"></a>
+<span class="sourceLineNo">767</span><a name="line.767"></a>
+<span class="sourceLineNo">768</span>  // check each region whether the coprocessor upcalls are called or not.<a name="line.768"></a>
+<span class="sourceLineNo">769</span>  private void verifyMethodResult(Class&lt;?&gt; coprocessor, String methodName[], TableName tableName,<a name="line.769"></a>
+<span class="sourceLineNo">770</span>      Object value[]) throws IOException {<a name="line.770"></a>
+<span class="sourceLineNo">771</span>    try {<a name="line.771"></a>
+<span class="sourceLineNo">772</span>      for (JVMClusterUtil.RegionServerThread t : cluster.getRegionServerThreads()) {<a name="line.772"></a>
+<span class="sourceLineNo">773</span>        if (!t.isAlive() || t.getRegionServer().isAborted() || t.getRegionServer().isStopping()) {<a name="line.773"></a>
+<span class="sourceLineNo">774</span>          continue;<a name="line.774"></a>
+<span class="sourceLineNo">775</span>        }<a name="line.775"></a>
+<span class="sourceLineNo">776</span>        for (RegionInfo r : ProtobufUtil<a name="line.776"></a>
+<span class="sourceLineNo">777</span>            .getOnlineRegions(t.getRegionServer().getRSRpcServices())) {<a name="line.777"></a>
+<span class="sourceLineNo">778</span>          if (!r.getTable().equals(tableName)) {<a name="line.778"></a>
+<span class="sourceLineNo">779</span>            continue;<a name="line.779"></a>
+<span class="sourceLineNo">780</span>          }<a name="line.780"></a>
+<span class="sourceLineNo">781</span>          RegionCoprocessorHost cph =<a name="line.781"></a>
+<span class="sourceLineNo">782</span>              t.getRegionServer().getOnlineRegion(r.getRegionName()).getCoprocessorHost();<a name="line.782"></a>
+<span class="sourceLineNo">783</span><a name="line.783"></a>
+<span class="sourceLineNo">784</span>          Coprocessor cp = cph.findCoprocessor(coprocessor.getName());<a name="line.784"></a>
+<span class="sourceLineNo">785</span>          assertNotNull(cp);<a name="line.785"></a>
+<span class="sourceLineNo">786</span>          for (int i = 0; i &lt; methodName.length; ++i) {<a name="line.786"></a>
+<span class="sourceLineNo">787</span>            Method m = coprocessor.getMethod(methodName[i]);<a name="line.787"></a>
+<span class="sourceLineNo">788</span>            Object o = m.invoke(cp);<a name="line.788"></a>
+<span class="sourceLineNo">789</span>            assertTrue("Result of " + coprocessor.getName() + "." + methodName[i]<a name="line.789"></a>
+<span class="sourceLineNo">790</span>                    + " is expected to be " + value[i].toString() + ", while we get "<a name="line.790"></a>
+<span class="sourceLineNo">791</span>                    + o.toString(), o.equals(value[i]));<a name="line.791"></a>
+<span class="sourceLineNo">792</span>          }<a name="line.792"></a>
+<span class="sourceLineNo">793</span>        }<a name="line.793"></a>
+<span class="sourceLineNo">794</span>      }<a name="line.794"></a>
+<span class="sourceLineNo">795</span>    } catch (Exception e) {<a name="line.795"></a>
+<span class="sourceLineNo">796</span>      throw new IOException(e.toString());<a name="line.796"></a>
+<span class="sourceLineNo">797</span>    }<a name="line.797"></a>
+<span class="sourceLineNo">798</span>  }<a name="line.798"></a>
+<span class="sourceLineNo">799</span><a name="line.799"></a>
+<span class="sourceLineNo">800</span>  private static void createHFile(Configuration conf, FileSystem fs, Path path, byte[] family,<a name="line.800"></a>
+<span class="sourceLineNo">801</span>      byte[] qualifier) throws IOException {<a name="line.801"></a>
+<span class="sourceLineNo">802</span>    HFileContext context = new HFileContextBuilder().build();<a name="line.802"></a>
+<span class="sourceLineNo">803</span>    HFile.Writer writer = HFile.getWriterFactory(conf, new CacheConfig(conf)).withPath(fs, path)<a name="line.803"></a>
+<span class="sourceLineNo">804</span>        .withFileContext(context).create();<a name="line.804"></a>
+<span class="sourceLineNo">805</span>    long now = System.currentTimeMillis();<a name="line.805"></a>
+<span class="sourceLineNo">806</span>    try {<a name="line.806"></a>
+<span class="sourceLineNo">807</span>      for (int i = 1; i &lt;= 9; i++) {<a name="line.807"></a>
+<span class="sourceLineNo">808</span>        KeyValue kv =<a name="line.808"></a>
+<span class="sourceLineNo">809</span>            new KeyValue(Bytes.toBytes(i + ""), family, qualifier, now, Bytes.toBytes(i + ""));<a name="line.809"></a>
+<span class="sourceLineNo">810</span>        writer.append(kv);<a name="line.810"></a>
+<span class="sourceLineNo">811</span>      }<a name="line.811"></a>
+<span class="sourceLineNo">812</span>    } finally {<a name="line.812"></a>
+<span class="sourceLineNo">813</span>      writer.close();<a name="line.813"></a>
+<span class="sourceLineNo">814</span>    }<a name="line.814"></a>
+<span class="sourceLineNo">815</span>  }<a name="line.815"></a>
+<span class="sourceLineNo">816</span><a name="line.816"></a>
+<span class="sourceLineNo">817</span>  private static class PreWALAppendWALActionsListener implements WALActionsListener {<a name="line.817"></a>
+<span class="sourceLineNo">818</span>    boolean[] walKeysCorrect = {false, false, false, false};<a name="line.818"></a>
+<span class="sourceLineNo">819</span><a name="line.819"></a>
+<span class="sourceLineNo">820</span>    @Override<a name="line.820"></a>
+<span class="sourceLineNo">821</span>    public void postAppend(long entryLen, long elapsedTimeMillis,<a name="line.821"></a>
+<span class="sourceLineNo">822</span>                           WALKey logKey, WALEdit logEdit) throws IOException {<a name="line.822"></a>
+<span class="sourceLineNo">823</span>      for (int k = 0; k &lt; 4; k++) {<a name="line.823"></a>
+<span class="sourceLineNo">824</span>        if (!walKeysCorrect[k]) {<a name="line.824"></a>
+<span class="sourceLineNo">825</span>          walKeysCorrect[k] = Arrays.equals(SimpleRegionObserver.WAL_EXTENDED_ATTRIBUTE_BYTES,<a name="line.825"></a>
+<span class="sourceLineNo">826</span>              logKey.getExtendedAttribute(Integer.toString(k + 1)));<a name="line.826"></a>
+<span class="sourceLineNo">827</span>        }<a name="line.827"></a>
+<span class="sourceLineNo">828</span>      }<a name="line.828"></a>
+<span class="sourceLineNo">829</span>    }<a name="line.829"></a>
+<span class="sourceLineNo">830</span><a name="line.830"></a>
+<span class="sourceLineNo">831</span>    boolean[] getWalKeysCorrectArray() {<a name="line.831"></a>
+<span class="sourceLineNo">832</span>      return walKeysCorrect;<a name="line.832"></a>
+<span class="sourceLineNo">833</span>    }<a name="line.833"></a>
+<span class="sourceLineNo">834</span>  }<a name="line.834"></a>
+<span class="sourceLineNo">835</span>}<a name="line.835"></a>
 
 
 
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.PreWALAppendWALActionsListener.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.PreWALAppendWALActionsListener.html
new file mode 100644
index 0000000..1378078
--- /dev/null
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.PreWALAppendWALActionsListener.html
@@ -0,0 +1,907 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html lang="en">
+<head>
+<title>Source code</title>
+<link rel="stylesheet" type="text/css" href="../../../../../../stylesheet.css" title="Style">
+</head>
+<body>
+<div class="sourceContainer">
+<pre><span class="sourceLineNo">001</span>/**<a name="line.1"></a>
+<span class="sourceLineNo">002</span> * Licensed to the Apache Software Foundation (ASF) under one<a name="line.2"></a>
+<span class="sourceLineNo">003</span> * or more contributor license agreements.  See the NOTICE file<a name="line.3"></a>
+<span class="sourceLineNo">004</span> * distributed with this work for additional information<a name="line.4"></a>
+<span class="sourceLineNo">005</span> * regarding copyright ownership.  The ASF licenses this file<a name="line.5"></a>
+<span class="sourceLineNo">006</span> * to you under the Apache License, Version 2.0 (the<a name="line.6"></a>
+<span class="sourceLineNo">007</span> * "License"); you may not use this file except in compliance<a name="line.7"></a>
+<span class="sourceLineNo">008</span> * with the License.  You may obtain a copy of the License at<a name="line.8"></a>
+<span class="sourceLineNo">009</span> *<a name="line.9"></a>
+<span class="sourceLineNo">010</span> *     http://www.apache.org/licenses/LICENSE-2.0<a name="line.10"></a>
+<span class="sourceLineNo">011</span> *<a name="line.11"></a>
+<span class="sourceLineNo">012</span> * Unless required by applicable law or agreed to in writing, software<a name="line.12"></a>
+<span class="sourceLineNo">013</span> * distributed under the License is distributed on an "AS IS" BASIS,<a name="line.13"></a>
+<span class="sourceLineNo">014</span> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.<a name="line.14"></a>
+<span class="sourceLineNo">015</span> * See the License for the specific language governing permissions and<a name="line.15"></a>
+<span class="sourceLineNo">016</span> * limitations under the License.<a name="line.16"></a>
+<span class="sourceLineNo">017</span> */<a name="line.17"></a>
+<span class="sourceLineNo">018</span>package org.apache.hadoop.hbase.coprocessor;<a name="line.18"></a>
+<span class="sourceLineNo">019</span><a name="line.19"></a>
+<span class="sourceLineNo">020</span>import static org.junit.Assert.assertArrayEquals;<a name="line.20"></a>
+<span class="sourceLineNo">021</span>import static org.junit.Assert.assertFalse;<a name="line.21"></a>
+<span class="sourceLineNo">022</span>import static org.junit.Assert.assertNotNull;<a name="line.22"></a>
+<span class="sourceLineNo">023</span>import static org.junit.Assert.assertTrue;<a name="line.23"></a>
+<span class="sourceLineNo">024</span><a name="line.24"></a>
+<span class="sourceLineNo">025</span>import java.io.IOException;<a name="line.25"></a>
+<span class="sourceLineNo">026</span>import java.lang.reflect.Method;<a name="line.26"></a>
+<span class="sourceLineNo">027</span>import java.util.ArrayList;<a name="line.27"></a>
+<span class="sourceLineNo">028</span>import java.util.Arrays;<a name="line.28"></a>
+<span class="sourceLineNo">029</span>import java.util.List;<a name="line.29"></a>
+<span class="sourceLineNo">030</span>import java.util.Optional;<a name="line.30"></a>
+<span class="sourceLineNo">031</span>import org.apache.hadoop.conf.Configuration;<a name="line.31"></a>
+<span class="sourceLineNo">032</span>import org.apache.hadoop.fs.FileSystem;<a name="line.32"></a>
+<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.Cell;<a name="line.34"></a>
+<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.CellUtil;<a name="line.35"></a>
+<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.Coprocessor;<a name="line.36"></a>
+<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.HBaseTestingUtility;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.HColumnDescriptor;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.HTableDescriptor;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.KeyValue;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.MiniHBaseCluster;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.ServerName;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.TableName;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.client.Admin;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.client.Append;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.client.Get;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.client.Put;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.client.RegionLocator;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.client.Result;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.57"></a>
+<span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.58"></a>
+<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.Table;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.TableDescriptor;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.TableDescriptorBuilder;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.io.hfile.CacheConfig;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.io.hfile.HFile;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.io.hfile.HFileContext;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.io.hfile.HFileContextBuilder;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.regionserver.HRegion;<a name="line.68"></a>
+<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.regionserver.InternalScanner;<a name="line.69"></a>
+<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.regionserver.RegionCoprocessorHost;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.regionserver.ScanType;<a name="line.71"></a>
+<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.regionserver.ScannerContext;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.regionserver.Store;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.regionserver.StoreFile;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.regionserver.wal.WALActionsListener;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.testclassification.CoprocessorTests;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.testclassification.MediumTests;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.tool.BulkLoadHFiles;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.81"></a>
+<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.util.JVMClusterUtil;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.wal.WALEdit;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.wal.WALKey;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.wal.WALKeyImpl;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>import org.junit.AfterClass;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>import org.junit.Assert;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>import org.junit.BeforeClass;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>import org.junit.ClassRule;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>import org.junit.Rule;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>import org.junit.Test;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.junit.experimental.categories.Category;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.junit.rules.TestName;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.mockito.Mockito;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.slf4j.Logger;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.slf4j.LoggerFactory;<a name="line.98"></a>
+<span class="sourceLineNo">099</span><a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;<a name="line.100"></a>
+<span class="sourceLineNo">101</span><a name="line.101"></a>
+<span class="sourceLineNo">102</span>@Category({ CoprocessorTests.class, MediumTests.class })<a name="line.102"></a>
+<span class="sourceLineNo">103</span>public class TestRegionObserverInterface {<a name="line.103"></a>
+<span class="sourceLineNo">104</span><a name="line.104"></a>
+<span class="sourceLineNo">105</span>  @ClassRule<a name="line.105"></a>
+<span class="sourceLineNo">106</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.106"></a>
+<span class="sourceLineNo">107</span>      HBaseClassTestRule.forClass(TestRegionObserverInterface.class);<a name="line.107"></a>
+<span class="sourceLineNo">108</span><a name="line.108"></a>
+<span class="sourceLineNo">109</span>  private static final Logger LOG = LoggerFactory.getLogger(TestRegionObserverInterface.class);<a name="line.109"></a>
+<span class="sourceLineNo">110</span><a name="line.110"></a>
+<span class="sourceLineNo">111</span>  public static final TableName TEST_TABLE = TableName.valueOf("TestTable");<a name="line.111"></a>
+<span class="sourceLineNo">112</span>  public static final byte[] FAMILY = Bytes.toBytes("f");<a name="line.112"></a>
+<span class="sourceLineNo">113</span>  public final static byte[] A = Bytes.toBytes("a");<a name="line.113"></a>
+<span class="sourceLineNo">114</span>  public final static byte[] B = Bytes.toBytes("b");<a name="line.114"></a>
+<span class="sourceLineNo">115</span>  public final static byte[] C = Bytes.toBytes("c");<a name="line.115"></a>
+<span class="sourceLineNo">116</span>  public final static byte[] ROW = Bytes.toBytes("testrow");<a name="line.116"></a>
+<span class="sourceLineNo">117</span><a name="line.117"></a>
+<span class="sourceLineNo">118</span>  private static HBaseTestingUtility util = new HBaseTestingUtility();<a name="line.118"></a>
+<span class="sourceLineNo">119</span>  private static MiniHBaseCluster cluster = null;<a name="line.119"></a>
+<span class="sourceLineNo">120</span><a name="line.120"></a>
+<span class="sourceLineNo">121</span>  @Rule<a name="line.121"></a>
+<span class="sourceLineNo">122</span>  public TestName name = new TestName();<a name="line.122"></a>
+<span class="sourceLineNo">123</span><a name="line.123"></a>
+<span class="sourceLineNo">124</span>  @BeforeClass<a name="line.124"></a>
+<span class="sourceLineNo">125</span>  public static void setupBeforeClass() throws Exception {<a name="line.125"></a>
+<span class="sourceLineNo">126</span>    // set configure to indicate which cp should be loaded<a name="line.126"></a>
+<span class="sourceLineNo">127</span>    Configuration conf = util.getConfiguration();<a name="line.127"></a>
+<span class="sourceLineNo">128</span>    conf.setBoolean("hbase.master.distributed.log.replay", true);<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    conf.setStrings(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY,<a name="line.129"></a>
+<span class="sourceLineNo">130</span>      SimpleRegionObserver.class.getName());<a name="line.130"></a>
+<span class="sourceLineNo">131</span><a name="line.131"></a>
+<span class="sourceLineNo">132</span>    util.startMiniCluster();<a name="line.132"></a>
+<span class="sourceLineNo">133</span>    cluster = util.getMiniHBaseCluster();<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>  @AfterClass<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  public static void tearDownAfterClass() throws Exception {<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    util.shutdownMiniCluster();<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>  @Test<a name="line.141"></a>
+<span class="sourceLineNo">142</span>  public void testRegionObserver() throws IOException {<a name="line.142"></a>
+<span class="sourceLineNo">143</span>    final TableName tableName = TableName.valueOf(TEST_TABLE.getNameAsString() + "." + name.getMethodName());<a name="line.143"></a>
+<span class="sourceLineNo">144</span>    // recreate table every time in order to reset the status of the<a name="line.144"></a>
+<span class="sourceLineNo">145</span>    // coprocessor.<a name="line.145"></a>
+<span class="sourceLineNo">146</span>    Table table = util.createTable(tableName, new byte[][] { A, B, C });<a name="line.146"></a>
+<span class="sourceLineNo">147</span>    try {<a name="line.147"></a>
+<span class="sourceLineNo">148</span>      verifyMethodResult(SimpleRegionObserver.class,<a name="line.148"></a>
+<span class="sourceLineNo">149</span>        new String[] { "hadPreGet", "hadPostGet", "hadPrePut", "hadPostPut", "hadDelete",<a name="line.149"></a>
+<span class="sourceLineNo">150</span>            "hadPostStartRegionOperation", "hadPostCloseRegionOperation",<a name="line.150"></a>
+<span class="sourceLineNo">151</span>            "hadPostBatchMutateIndispensably" },<a name="line.151"></a>
+<span class="sourceLineNo">152</span>        tableName, new Boolean[] { false, false, false, false, false, false, false, false });<a name="line.152"></a>
+<span class="sourceLineNo">153</span><a name="line.153"></a>
+<span class="sourceLineNo">154</span>      Put put = new Put(ROW);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>      put.addColumn(A, A, A);<a name="line.155"></a>
+<span class="sourceLineNo">156</span>      put.addColumn(B, B, B);<a name="line.156"></a>
+<span class="sourceLineNo">157</span>      put.addColumn(C, C, C);<a name="line.157"></a>
+<span class="sourceLineNo">158</span>      table.put(put);<a name="line.158"></a>
+<span class="sourceLineNo">159</span><a name="line.159"></a>
+<span class="sourceLineNo">160</span>      verifyMethodResult(SimpleRegionObserver.class,<a name="line.160"></a>
+<span class="sourceLineNo">161</span>        new String[] { "hadPreGet", "hadPostGet", "hadPrePut", "hadPostPut", "hadPreBatchMutate",<a name="line.161"></a>
+<span class="sourceLineNo">162</span>            "hadPostBatchMutate", "hadDelete", "hadPostStartRegionOperation",<a name="line.162"></a>
+<span class="sourceLineNo">163</span>            "hadPostCloseRegionOperation", "hadPostBatchMutateIndispensably" },<a name="line.163"></a>
+<span class="sourceLineNo">164</span>        TEST_TABLE,<a name="line.164"></a>
+<span class="sourceLineNo">165</span>        new Boolean[] { false, false, true, true, true, true, false, true, true, true });<a name="line.165"></a>
+<span class="sourceLineNo">166</span><a name="line.166"></a>
+<span class="sourceLineNo">167</span>      verifyMethodResult(SimpleRegionObserver.class,<a name="line.167"></a>
+<span class="sourceLineNo">168</span>        new String[] { "getCtPreOpen", "getCtPostOpen", "getCtPreClose", "getCtPostClose" },<a name="line.168"></a>
+<span class="sourceLineNo">169</span>        tableName, new Integer[] { 1, 1, 0, 0 });<a name="line.169"></a>
+<span class="sourceLineNo">170</span><a name="line.170"></a>
+<span class="sourceLineNo">171</span>      Get get = new Get(ROW);<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      get.addColumn(A, A);<a name="line.172"></a>
+<span class="sourceLineNo">173</span>      get.addColumn(B, B);<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      get.addColumn(C, C);<a name="line.174"></a>
+<span class="sourceLineNo">175</span>      table.get(get);<a name="line.175"></a>
+<span class="sourceLineNo">176</span><a name="line.176"></a>
+<span class="sourceLineNo">177</span>      verifyMethodResult(SimpleRegionObserver.class,<a name="line.177"></a>
+<span class="sourceLineNo">178</span>        new String[] { "hadPreGet", "hadPostGet", "hadPrePut", "hadPostPut", "hadDelete",<a name="line.178"></a>
+<span class="sourceLineNo">179</span>            "hadPrePreparedDeleteTS" },<a name="line.179"></a>
+<span class="sourceLineNo">180</span>        tableName, new Boolean[] { true, true, true, true, false, false });<a name="line.180"></a>
+<span class="sourceLineNo">181</span><a name="line.181"></a>
+<span class="sourceLineNo">182</span>      Delete delete = new Delete(ROW);<a name="line.182"></a>
+<span class="sourceLineNo">183</span>      delete.addColumn(A, A);<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      delete.addColumn(B, B);<a name="line.184"></a>
+<span class="sourceLineNo">185</span>      delete.addColumn(C, C);<a name="line.185"></a>
+<span class="sourceLineNo">186</span>      table.delete(delete);<a name="line.186"></a>
+<span class="sourceLineNo">187</span><a name="line.187"></a>
+<span class="sourceLineNo">188</span>      verifyMethodResult(SimpleRegionObserver.class,<a name="line.188"></a>
+<span class="sourceLineNo">189</span>        new String[] { "hadPreGet", "hadPostGet", "hadPrePut", "hadPostPut", "hadPreBatchMutate",<a name="line.189"></a>
+<span class="sourceLineNo">190</span>            "hadPostBatchMutate", "hadDelete", "hadPrePreparedDeleteTS" },<a name="line.190"></a>
+<span class="sourceLineNo">191</span>        tableName, new Boolean[] { true, true, true, true, true, true, true, true });<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    } finally {<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      util.deleteTable(tableName);<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      table.close();<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    }<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    verifyMethodResult(SimpleRegionObserver.class,<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      new String[] { "getCtPreOpen", "getCtPostOpen", "getCtPreClose", "getCtPostClose" },<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      tableName, new Integer[] { 1, 1, 1, 1 });<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>  @Test<a name="line.201"></a>
+<span class="sourceLineNo">202</span>  public void testRowMutation() throws IOException {<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    final TableName tableName = TableName.valueOf(TEST_TABLE.getNameAsString() + "." + name.getMethodName());<a name="line.203"></a>
+<span class="sourceLineNo">204</span>    Table table = util.createTable(tableName, new byte[][] { A, B, C });<a name="line.204"></a>
+<span class="sourceLineNo">205</span>    try {<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      verifyMethodResult(SimpleRegionObserver.class,<a name="line.206"></a>
+<span class="sourceLineNo">207</span>        new String[] { "hadPreGet", "hadPostGet", "hadPrePut", "hadPostPut", "hadDeleted" },<a name="line.207"></a>
+<span class="sourceLineNo">208</span>        tableName, new Boolean[] { false, false, false, false, false });<a name="line.208"></a>
+<span class="sourceLineNo">209</span>      Put put = new Put(ROW);<a name="line.209"></a>
+<span class="sourceLineNo">210</span>      put.addColumn(A, A, A);<a name="line.210"></a>
+<span class="sourceLineNo">211</span>      put.addColumn(B, B, B);<a name="line.211"></a>
+<span class="sourceLineNo">212</span>      put.addColumn(C, C, C);<a name="line.212"></a>
+<span class="sourceLineNo">213</span><a name="line.213"></a>
+<span class="sourceLineNo">214</span>      Delete delete = new Delete(ROW);<a name="line.214"></a>
+<span class="sourceLineNo">215</span>      delete.addColumn(A, A);<a name="line.215"></a>
+<span class="sourceLineNo">216</span>      delete.addColumn(B, B);<a name="line.216"></a>
+<span class="sourceLineNo">217</span>      delete.addColumn(C, C);<a name="line.217"></a>
+<span class="sourceLineNo">218</span><a name="line.218"></a>
+<span class="sourceLineNo">219</span>      RowMutations arm = new RowMutations(ROW);<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      arm.add(put);<a name="line.220"></a>
+<span class="sourceLineNo">221</span>      arm.add(delete);<a name="line.221"></a>
+<span class="sourceLineNo">222</span>      table.mutateRow(arm);<a name="line.222"></a>
+<span class="sourceLineNo">223</span><a name="line.223"></a>
+<span class="sourceLineNo">224</span>      verifyMethodResult(SimpleRegionObserver.class,<a name="line.224"></a>
+<span class="sourceLineNo">225</span>        new String[] { "hadPreGet", "hadPostGet", "hadPrePut", "hadPostPut", "hadDeleted" },<a name="line.225"></a>
+<span class="sourceLineNo">226</span>        tableName, new Boolean[] { false, false, true, true, true });<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    } finally {<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      util.deleteTable(tableName);<a name="line.228"></a>
+<span class="sourceLineNo">229</span>      table.close();<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><a name="line.232"></a>
+<span class="sourceLineNo">233</span>  @Test<a name="line.233"></a>
+<span class="sourceLineNo">234</span>  public void testIncrementHook() throws IOException {<a name="line.234"></a>
+<span class="sourceLineNo">235</span>    final TableName tableName = TableName.valueOf(TEST_TABLE.getNameAsString() + "." + name.getMethodName());<a name="line.235"></a>
+<span class="sourceLineNo">236</span>    Table table = util.createTable(tableName, new byte[][] { A, B, C });<a name="line.236"></a>
+<span class="sourceLineNo">237</span>    try {<a name="line.237"></a>
+<span class="sourceLineNo">238</span>      Increment inc = new Increment(Bytes.toBytes(0));<a name="line.238"></a>
+<span class="sourceLineNo">239</span>      inc.addColumn(A, A, 1);<a name="line.239"></a>
+<span class="sourceLineNo">240</span><a name="line.240"></a>
+<span class="sourceLineNo">241</span>      verifyMethodResult(SimpleRegionObserver.class,<a name="line.241"></a>
+<span class="sourceLineNo">242</span>        new String[] { "hadPreIncrement", "hadPostIncrement", "hadPreIncrementAfterRowLock" },<a name="line.242"></a>
+<span class="sourceLineNo">243</span>        tableName, new Boolean[] { false, false, false });<a name="line.243"></a>
+<span class="sourceLineNo">244</span><a name="line.244"></a>
+<span class="sourceLineNo">245</span>      table.increment(inc);<a name="line.245"></a>
+<span class="sourceLineNo">246</span><a name="line.246"></a>
+<span class="sourceLineNo">247</span>      verifyMethodResult(SimpleRegionObserver.class,<a name="line.247"></a>
+<span class="sourceLineNo">248</span>        new String[] { "hadPreIncrement", "hadPostIncrement", "hadPreIncrementAfterRowLock" },<a name="line.248"></a>
+<span class="sourceLineNo">249</span>        tableName, new Boolean[] { true, true, true });<a name="line.249"></a>
+<span class="sourceLineNo">250</span>    } finally {<a name="line.250"></a>
+<span class="sourceLineNo">251</span>      util.deleteTable(tableName);<a name="line.251"></a>
+<span class="sourceLineNo">252</span>      table.close();<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>  @Test<a name="line.256"></a>
+<span class="sourceLineNo">257</span>  public void testCheckAndPutHooks() throws IOException {<a name="line.257"></a>
+<span class="sourceLineNo">258</span>    final TableName tableName = TableName.valueOf(TEST_TABLE.getNameAsString() + "." + name.getMethodName());<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    try (Table table = util.createTable(tableName, new byte[][] { A, B, C })) {<a name="line.259"></a>
+<span class="sourceLineNo">260</span>      Put p = new Put(Bytes.toBytes(0));<a name="line.260"></a>
+<span class="sourceLineNo">261</span>      p.addColumn(A, A, A);<a name="line.261"></a>
+<span class="sourceLineNo">262</span>      table.put(p);<a name="line.262"></a>
+<span class="sourceLineNo">263</span>      p = new Put(Bytes.toBytes(0));<a name="line.263"></a>
+<span class="sourceLineNo">264</span>      p.addColumn(A, A, A);<a name="line.264"></a>
+<span class="sourceLineNo">265</span>      verifyMethodResult(SimpleRegionObserver.class,<a name="line.265"></a>
+<span class="sourceLineNo">266</span>        new String[] { "hadPreCheckAndPut", "hadPreCheckAndPutAfterRowLock", "hadPostCheckAndPut" },<a name="line.266"></a>
+<span class="sourceLineNo">267</span>        tableName, new Boolean[] { false, false, false });<a name="line.267"></a>
+<span class="sourceLineNo">268</span>      table.checkAndMutate(Bytes.toBytes(0), A).qualifier(A).ifEquals(A).thenPut(p);<a name="line.268"></a>
+<span class="sourceLineNo">269</span>      verifyMethodResult(SimpleRegionObserver.class,<a name="line.269"></a>
+<span class="sourceLineNo">270</span>        new String[] { "hadPreCheckAndPut", "hadPreCheckAndPutAfterRowLock", "hadPostCheckAndPut" },<a name="line.270"></a>
+<span class="sourceLineNo">271</span>        tableName, new Boolean[] { true, true, true });<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    } finally {<a name="line.272"></a>
+<span class="sourceLineNo">273</span>      util.deleteTable(tableName);<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    }<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>  @Test<a name="line.277"></a>
+<span class="sourceLineNo">278</span>  public void testCheckAndDeleteHooks() throws IOException {<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    final TableName tableName = TableName.valueOf(TEST_TABLE.getNameAsString() + "." + name.getMethodName());<a name="line.279"></a>
+<span class="sourceLineNo">280</span>    Table table = util.createTable(tableName, new byte[][] { A, B, C });<a name="line.280"></a>
+<span class="sourceLineNo">281</span>    try {<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      Put p = new Put(Bytes.toBytes(0));<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      p.addColumn(A, A, A);<a name="line.283"></a>
+<span class="sourceLineNo">284</span>      table.put(p);<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      Delete d = new Delete(Bytes.toBytes(0));<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      table.delete(d);<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      verifyMethodResult(<a name="line.287"></a>
+<span class="sourceLineNo">288</span>        SimpleRegionObserver.class, new String[] { "hadPreCheckAndDelete",<a name="line.288"></a>
+<span class="sourceLineNo">289</span>            "hadPreCheckAndDeleteAfterRowLock", "hadPostCheckAndDelete" },<a name="line.289"></a>
+<span class="sourceLineNo">290</span>        tableName, new Boolean[] { false, false, false });<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      table.checkAndMutate(Bytes.toBytes(0), A).qualifier(A).ifEquals(A).thenDelete(d);<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      verifyMethodResult(<a name="line.292"></a>
+<span class="sourceLineNo">293</span>        SimpleRegionObserver.class, new String[] { "hadPreCheckAndDelete",<a name="line.293"></a>
+<span class="sourceLineNo">294</span>            "hadPreCheckAndDeleteAfterRowLock", "hadPostCheckAndDelete" },<a name="line.294"></a>
+<span class="sourceLineNo">295</span>        tableName, new Boolean[] { true, true, true });<a name="line.295"></a>
+<span class="sourceLineNo">296</span>    } finally {<a name="line.296"></a>
+<span class="sourceLineNo">297</span>      util.deleteTable(tableName);<a name="line.297"></a>
+<span class="sourceLineNo">298</span>      table.close();<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><a name="line.301"></a>
+<span class="sourceLineNo">302</span>  @Test<a name="line.302"></a>
+<span class="sourceLineNo">303</span>  public void testAppendHook() throws IOException {<a name="line.303"></a>
+<span class="sourceLineNo">304</span>    final TableName tableName = TableName.valueOf(TEST_TABLE.getNameAsString() + "." + name.getMethodName());<a name="line.304"></a>
+<span class="sourceLineNo">305</span>    Table table = util.createTable(tableName, new byte[][] { A, B, C });<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    try {<a name="line.306"></a>
+<span class="sourceLineNo">307</span>      Append app = new Append(Bytes.toBytes(0));<a name="line.307"></a>
+<span class="sourceLineNo">308</span>      app.addColumn(A, A, A);<a name="line.308"></a>
+<span class="sourceLineNo">309</span><a name="line.309"></a>
+<span class="sourceLineNo">310</span>      verifyMethodResult(SimpleRegionObserver.class,<a name="line.310"></a>
+<span class="sourceLineNo">311</span>        new String[] { "hadPreAppend", "hadPostAppend", "hadPreAppendAfterRowLock" }, tableName,<a name="line.311"></a>
+<span class="sourceLineNo">312</span>        new Boolean[] { false, false, false });<a name="line.312"></a>
+<span class="sourceLineNo">313</span><a name="line.313"></a>
+<span class="sourceLineNo">314</span>      table.append(app);<a name="line.314"></a>
+<span class="sourceLineNo">315</span><a name="line.315"></a>
+<span class="sourceLineNo">316</span>      verifyMethodResult(SimpleRegionObserver.class,<a name="line.316"></a>
+<span class="sourceLineNo">317</span>        new String[] { "hadPreAppend", "hadPostAppend", "hadPreAppendAfterRowLock" }, tableName,<a name="line.317"></a>
+<span class="sourceLineNo">318</span>        new Boolean[] { true, true, true });<a name="line.318"></a>
+<span class="sourceLineNo">319</span>    } finally {<a name="line.319"></a>
+<span class="sourceLineNo">320</span>      util.deleteTable(tableName);<a name="line.320"></a>
+<span class="sourceLineNo">321</span>      table.close();<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><a name="line.324"></a>
+<span class="sourceLineNo">325</span>  @Test<a name="line.325"></a>
+<span class="sourceLineNo">326</span>  // HBase-3583<a name="line.326"></a>
+<span class="sourceLineNo">327</span>  public void testHBase3583() throws IOException {<a name="line.327"></a>
+<span class="sourceLineNo">328</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    util.createTable(tableName, new byte[][] { A, B, C });<a name="line.329"></a>
+<span class="sourceLineNo">330</span>    util.waitUntilAllRegionsAssigned(tableName);<a name="line.330"></a>
+<span class="sourceLineNo">331</span><a name="line.331"></a>
+<span class="sourceLineNo">332</span>    verifyMethodResult(SimpleRegionObserver.class,<a name="line.332"></a>
+<span class="sourceLineNo">333</span>      new String[] { "hadPreGet", "hadPostGet", "wasScannerNextCalled", "wasScannerCloseCalled" },<a name="line.333"></a>
+<span class="sourceLineNo">334</span>      tableName, new Boolean[] { false, false, false, false });<a name="line.334"></a>
+<span class="sourceLineNo">335</span><a name="line.335"></a>
+<span class="sourceLineNo">336</span>    Table table = util.getConnection().getTable(tableName);<a name="line.336"></a>
+<span class="sourceLineNo">337</span>    Put put = new Put(ROW);<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    put.addColumn(A, A, A);<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    table.put(put);<a name="line.339"></a>
+<span class="sourceLineNo">340</span><a name="line.340"></a>
+<span class="sourceLineNo">341</span>    Get get = new Get(ROW);<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    get.addColumn(A, A);<a name="line.342"></a>
+<span class="sourceLineNo">343</span>    table.get(get);<a name="line.343"></a>
+<span class="sourceLineNo">344</span><a name="line.344"></a>
+<span class="sourceLineNo">345</span>    // verify that scannerNext and scannerClose upcalls won't be invoked<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    // when we perform get().<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    verifyMethodResult(SimpleRegionObserver.class,<a name="line.347"></a>
+<span class="sourceLineNo">348</span>      new String[] { "hadPreGet", "hadPostGet", "wasScannerNextCalled", "wasScannerCloseCalled" },<a name="line.348"></a>
+<span class="sourceLineNo">349</span>      tableName, new Boolean[] { true, true, false, false });<a name="line.349"></a>
+<span class="sourceLineNo">350</span><a name="line.350"></a>
+<span class="sourceLineNo">351</span>    Scan s = new Scan();<a name="line.351"></a>
+<span class="sourceLineNo">352</span>    ResultScanner scanner = table.getScanner(s);<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    try {<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      for (Result rr = scanner.next(); rr != null; rr = scanner.next()) {<a name="line.354"></a>
+<span class="sourceLineNo">355</span>      }<a name="line.355"></a>
+<span class="sourceLineNo">356</span>    } finally {<a name="line.356"></a>
+<span class="sourceLineNo">357</span>      scanner.close();<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>    // now scanner hooks should be invoked.<a name="line.360"></a>
+<span class="sourceLineNo">361</span>    verifyMethodResult(SimpleRegionObserver.class,<a name="line.361"></a>
+<span class="sourceLineNo">362</span>      new String[] { "wasScannerNextCalled", "wasScannerCloseCalled" }, tableName,<a name="line.362"></a>
+<span class="sourceLineNo">363</span>      new Boolean[] { true, true });<a name="line.363"></a>
+<span class="sourceLineNo">364</span>    util.deleteTable(tableName);<a name="line.364"></a>
+<span class="sourceLineNo">365</span>    table.close();<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>  @Test<a name="line.368"></a>
+<span class="sourceLineNo">369</span>  public void testHBASE14489() throws IOException {<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.370"></a>
+<span class="sourceLineNo">371</span>    Table table = util.createTable(tableName, new byte[][] { A });<a name="line.371"></a>
+<span class="sourceLineNo">372</span>    Put put = new Put(ROW);<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    put.addColumn(A, A, A);<a name="line.373"></a>
+<span class="sourceLineNo">374</span>    table.put(put);<a name="line.374"></a>
+<span class="sourceLineNo">375</span><a name="line.375"></a>
+<span class="sourceLineNo">376</span>    Scan s = new Scan();<a name="line.376"></a>
+<span class="sourceLineNo">377</span>    s.setFilter(new FilterAllFilter());<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    ResultScanner scanner = table.getScanner(s);<a name="line.378"></a>
+<span class="sourceLineNo">379</span>    try {<a name="line.379"></a>
+<span class="sourceLineNo">380</span>      for (Result rr = scanner.next(); rr != null; rr = scanner.next()) {<a name="line.380"></a>
+<span class="sourceLineNo">381</span>      }<a name="line.381"></a>
+<span class="sourceLineNo">382</span>    } finally {<a name="line.382"></a>
+<span class="sourceLineNo">383</span>      scanner.close();<a name="line.383"></a>
+<span class="sourceLineNo">384</span>    }<a name="line.384"></a>
+<span class="sourceLineNo">385</span>    verifyMethodResult(SimpleRegionObserver.class, new String[] { "wasScannerFilterRowCalled" },<a name="line.385"></a>
+<span class="sourceLineNo">386</span>      tableName, new Boolean[] { true });<a name="line.386"></a>
+<span class="sourceLineNo">387</span>    util.deleteTable(tableName);<a name="line.387"></a>
+<span class="sourceLineNo">388</span>    table.close();<a name="line.388"></a>
+<span class="sourceLineNo">389</span><a name="line.389"></a>
+<span class="sourceLineNo">390</span>  }<a name="line.390"></a>
+<span class="sourceLineNo">391</span><a name="line.391"></a>
+<span class="sourceLineNo">392</span>  @Test<a name="line.392"></a>
+<span class="sourceLineNo">393</span>  // HBase-3758<a name="line.393"></a>
+<span class="sourceLineNo">394</span>  public void testHBase3758() throws IOException {<a name="line.394"></a>
+<span class="sourceLineNo">395</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.395"></a>
+<span class="sourceLineNo">396</span>    util.createTable(tableName, new byte[][] { A, B, C });<a name="line.396"></a>
+<span class="sourceLineNo">397</span><a name="line.397"></a>
+<span class="sourceLineNo">398</span>    verifyMethodResult(SimpleRegionObserver.class,<a name="line.398"></a>
+<span class="sourceLineNo">399</span>      new String[] { "hadDeleted", "wasScannerOpenCalled" }, tableName,<a name="line.399"></a>
+<span class="sourceLineNo">400</span>      new Boolean[] { false, false });<a name="line.400"></a>
+<span class="sourceLineNo">401</span><a name="line.401"></a>
+<span class="sourceLineNo">402</span>    Table table = util.getConnection().getTable(tableName);<a name="line.402"></a>
+<span class="sourceLineNo">403</span>    Put put = new Put(ROW);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>    put.addColumn(A, A, A);<a name="line.404"></a>
+<span class="sourceLineNo">405</span>    table.put(put);<a name="line.405"></a>
+<span class="sourceLineNo">406</span><a name="line.406"></a>
+<span class="sourceLineNo">407</span>    Delete delete = new Delete(ROW);<a name="line.407"></a>
+<span class="sourceLineNo">408</span>    table.delete(delete);<a name="line.408"></a>
+<span class="sourceLineNo">409</span><a name="line.409"></a>
+<span class="sourceLineNo">410</span>    verifyMethodResult(SimpleRegionObserver.class,<a name="line.410"></a>
+<span class="sourceLineNo">411</span>      new String[] { "hadDeleted", "wasScannerOpenCalled" }, tableName,<a name="line.411"></a>
+<span class="sourceLineNo">412</span>      new Boolean[] { true, false });<a name="line.412"></a>
+<span class="sourceLineNo">413</span><a name="line.413"></a>
+<span class="sourceLineNo">414</span>    Scan s = new Scan();<a name="line.414"></a>
+<span class="sourceLineNo">415</span>    ResultScanner scanner = table.getScanner(s);<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    try {<a name="line.416"></a>
+<span class="sourceLineNo">417</span>      for (Result rr = scanner.next(); rr != null; rr = scanner.next()) {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>      }<a name="line.418"></a>
+<span class="sourceLineNo">419</span>    } finally {<a name="line.419"></a>
+<span class="sourceLineNo">420</span>      scanner.close();<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>    // now scanner hooks should be invoked.<a name="line.423"></a>
+<span class="sourceLineNo">424</span>    verifyMethodResult(SimpleRegionObserver.class, new String[] { "wasScannerOpenCalled" },<a name="line.424"></a>
+<span class="sourceLineNo">425</span>      tableName, new Boolean[] { true });<a name="line.425"></a>
+<span class="sourceLineNo">426</span>    util.deleteTable(tableName);<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    table.close();<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>  /* Overrides compaction to only output rows with keys that are even numbers */<a name="line.430"></a>
+<span class="sourceLineNo">431</span>  public static class EvenOnlyCompactor implements RegionCoprocessor, RegionObserver {<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    long lastCompaction;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>    long lastFlush;<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 Optional&lt;RegionObserver&gt; getRegionObserver() {<a name="line.436"></a>
+<span class="sourceLineNo">437</span>      return Optional.of(this);<a name="line.437"></a>
+<span class="sourceLineNo">438</span>    }<a name="line.438"></a>
+<span class="sourceLineNo">439</span><a name="line.439"></a>
+<span class="sourceLineNo">440</span>    @Override<a name="line.440"></a>
+<span class="sourceLineNo">441</span>    public InternalScanner preCompact(ObserverContext&lt;RegionCoprocessorEnvironment&gt; e, Store store,<a name="line.441"></a>
+<span class="sourceLineNo">442</span>        InternalScanner scanner, ScanType scanType, CompactionLifeCycleTracker tracker,<a name="line.442"></a>
+<span class="sourceLineNo">443</span>        CompactionRequest request) {<a name="line.443"></a>
+<span class="sourceLineNo">444</span>      return new InternalScanner() {<a name="line.444"></a>
+<span class="sourceLineNo">445</span><a name="line.445"></a>
+<span class="sourceLineNo">446</span>        @Override<a name="line.446"></a>
+<span class="sourceLineNo">447</span>        public boolean next(List&lt;Cell&gt; results, ScannerContext scannerContext) throws IOException {<a name="line.447"></a>
+<span class="sourceLineNo">448</span>          List&lt;Cell&gt; internalResults = new ArrayList&lt;&gt;();<a name="line.448"></a>
+<span class="sourceLineNo">449</span>          boolean hasMore;<a name="line.449"></a>
+<span class="sourceLineNo">450</span>          do {<a name="line.450"></a>
+<span class="sourceLineNo">451</span>            hasMore = scanner.next(internalResults, scannerContext);<a name="line.451"></a>
+<span class="sourceLineNo">452</span>            if (!internalResults.isEmpty()) {<a name="line.452"></a>
+<span class="sourceLineNo">453</span>              long row = Bytes.toLong(CellUtil.cloneValue(internalResults.get(0)));<a name="line.453"></a>
+<span class="sourceLineNo">454</span>              if (row % 2 == 0) {<a name="line.454"></a>
+<span class="sourceLineNo">455</span>                // return this row<a name="line.455"></a>
+<span class="sourceLineNo">456</span>                break;<a name="line.456"></a>
+<span class="sourceLineNo">457</span>              }<a name="line.457"></a>
+<span class="sourceLineNo">458</span>              // clear and continue<a name="line.458"></a>
+<span class="sourceLineNo">459</span>              internalResults.clear();<a name="line.459"></a>
+<span class="sourceLineNo">460</span>            }<a name="line.460"></a>
+<span class="sourceLineNo">461</span>          } while (hasMore);<a name="line.461"></a>
+<span class="sourceLineNo">462</span><a name="line.462"></a>
+<span class="sourceLineNo">463</span>          if (!internalResults.isEmpty()) {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>            results.addAll(internalResults);<a name="line.464"></a>
+<span class="sourceLineNo">465</span>          }<a name="line.465"></a>
+<span class="sourceLineNo">466</span>          return hasMore;<a name="line.466"></a>
+<span class="sourceLineNo">467</span>        }<a name="line.467"></a>
+<span class="sourceLineNo">468</span><a name="line.468"></a>
+<span class="sourceLineNo">469</span>        @Override<a name="line.469"></a>
+<span class="sourceLineNo">470</span>        public void close() throws IOException {<a name="line.470"></a>
+<span class="sourceLineNo">471</span>          scanner.close();<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>    }<a name="line.474"></a>
+<span class="sourceLineNo">475</span><a name="line.475"></a>
+<span class="sourceLineNo">476</span>    @Override<a name="line.476"></a>
+<span class="sourceLineNo">477</span>    public void postCompact(ObserverContext&lt;RegionCoprocessorEnvironment&gt; e, Store store,<a name="line.477"></a>
+<span class="sourceLineNo">478</span>        StoreFile resultFile, CompactionLifeCycleTracker tracker, CompactionRequest request) {<a name="line.478"></a>
+<span class="sourceLineNo">479</span>      lastCompaction = EnvironmentEdgeManager.currentTime();<a name="line.479"></a>
+<span class="sourceLineNo">480</span>    }<a name="line.480"></a>
+<span class="sourceLineNo">481</span><a name="line.481"></a>
+<span class="sourceLineNo">482</span>    @Override<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    public void postFlush(ObserverContext&lt;RegionCoprocessorEnvironment&gt; e,<a name="line.483"></a>
+<span class="sourceLineNo">484</span>        FlushLifeCycleTracker tracker) {<a name="line.484"></a>
+<span class="sourceLineNo">485</span>      lastFlush = EnvironmentEdgeManager.currentTime();<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>  /**<a name="line.489"></a>
+<span class="sourceLineNo">490</span>   * Tests overriding compaction handling via coprocessor hooks<a name="line.490"></a>
+<span class="sourceLineNo">491</span>   * @throws Exception<a name="line.491"></a>
+<span class="sourceLineNo">492</span>   */<a name="line.492"></a>
+<span class="sourceLineNo">493</span>  @Test<a name="line.493"></a>
+<span class="sourceLineNo">494</span>  public void testCompactionOverride() throws Exception {<a name="line.494"></a>
+<span class="sourceLineNo">495</span>    final TableName compactTable = TableName.valueOf(name.getMethodName());<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    Admin admin = util.getAdmin();<a name="line.496"></a>
+<span class="sourceLineNo">497</span>    if (admin.tableExists(compactTable)) {<a name="line.497"></a>
+<span class="sourceLineNo">498</span>      admin.disableTable(compactTable);<a name="line.498"></a>
+<span class="sourceLineNo">499</span>      admin.deleteTable(compactTable);<a name="line.499"></a>
+<span class="sourceLineNo">500</span>    }<a name="line.500"></a>
+<span class="sourceLineNo">501</span><a name="line.501"></a>
+<span class="sourceLineNo">502</span>    HTableDescriptor htd = new HTableDescriptor(compactTable);<a name="line.502"></a>
+<span class="sourceLineNo">503</span>    htd.addFamily(new HColumnDescriptor(A));<a name="line.503"></a>
+<span class="sourceLineNo">504</span>    htd.addCoprocessor(EvenOnlyCompactor.class.getName());<a name="line.504"></a>
+<span class="sourceLineNo">505</span>    admin.createTable(htd);<a name="line.505"></a>
+<span class="sourceLineNo">506</span><a name="line.506"></a>
+<span class="sourceLineNo">507</span>    Table table = util.getConnection().getTable(compactTable);<a name="line.507"></a>
+<span class="sourceLineNo">508</span>    for (long i = 1; i &lt;= 10; i++) {<a name="line.508"></a>
+<span class="sourceLineNo">509</span>      byte[] iBytes = Bytes.toBytes(i);<a name="line.509"></a>
+<span class="sourceLineNo">510</span>      Put put = new Put(iBytes);<a name="line.510"></a>
+<span class="sourceLineNo">511</span>      put.setDurability(Durability.SKIP_WAL);<a name="line.511"></a>
+<span class="sourceLineNo">512</span>      put.addColumn(A, A, iBytes);<a name="line.512"></a>
+<span class="sourceLineNo">513</span>      table.put(put);<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>    HRegion firstRegion = cluster.getRegions(compactTable).get(0);<a name="line.516"></a>
+<span class="sourceLineNo">517</span>    Coprocessor cp = firstRegion.getCoprocessorHost().findCoprocessor(EvenOnlyCompactor.class);<a name="line.517"></a>
+<span class="sourceLineNo">518</span>    assertNotNull("EvenOnlyCompactor coprocessor should be loaded", cp);<a name="line.518"></a>
+<span class="sourceLineNo">519</span>    EvenOnlyCompactor compactor = (EvenOnlyCompactor) cp;<a name="line.519"></a>
+<span class="sourceLineNo">520</span><a name="line.520"></a>
+<span class="sourceLineNo">521</span>    // force a compaction<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    long ts = System.currentTimeMillis();<a name="line.522"></a>
+<span class="sourceLineNo">523</span>    admin.flush(compactTable);<a name="line.523"></a>
+<span class="sourceLineNo">524</span>    // wait for flush<a name="line.524"></a>
+<span class="sourceLineNo">525</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.525"></a>
+<span class="sourceLineNo">526</span>      if (compactor.lastFlush &gt;= ts) {<a name="line.526"></a>
+<span class="sourceLineNo">527</span>        break;<a name="line.527"></a>
+<span class="sourceLineNo">528</span>      }<a name="line.528"></a>
+<span class="sourceLineNo">529</span>      Thread.sleep(1000);<a name="line.529"></a>
+<span class="sourceLineNo">530</span>    }<a name="line.530"></a>
+<span class="sourceLineNo">531</span>    assertTrue("Flush didn't complete", compactor.lastFlush &gt;= ts);<a name="line.531"></a>
+<span class="sourceLineNo">532</span>    LOG.debug("Flush complete");<a name="line.532"></a>
+<span class="sourceLineNo">533</span><a name="line.533"></a>
+<span class="sourceLineNo">534</span>    ts = compactor.lastFlush;<a name="line.534"></a>
+<span class="sourceLineNo">535</span>    admin.majorCompact(compactTable);<a name="line.535"></a>
+<span class="sourceLineNo">536</span>    // wait for compaction<a name="line.536"></a>
+<span class="sourceLineNo">537</span>    for (int i = 0; i &lt; 30; i++) {<a name="line.537"></a>
+<span class="sourceLineNo">538</span>      if (compactor.lastCompaction &gt;= ts) {<a name="line.538"></a>
+<span class="sourceLineNo">539</span>        break;<a name="line.539"></a>
+<span class="sourceLineNo">540</span>      }<a name="line.540"></a>
+<span class="sourceLineNo">541</span>      Thread.sleep(1000);<a name="line.541"></a>
+<span class="sourceLineNo">542</span>    }<a name="line.542"></a>
+<span class="sourceLineNo">543</span>    LOG.debug("Last compaction was at " + compactor.lastCompaction);<a name="line.543"></a>
+<span class="sourceLineNo">544</span>    assertTrue("Compaction didn't complete", compactor.lastCompaction &gt;= ts);<a name="line.544"></a>
+<span class="sourceLineNo">545</span><a name="line.545"></a>
+<span class="sourceLineNo">546</span>    // only even rows should remain<a name="line.546"></a>
+<span class="sourceLineNo">547</span>    ResultScanner scanner = table.getScanner(new Scan());<a name="line.547"></a>
+<span class="sourceLineNo">548</span>    try {<a name="line.548"></a>
+<span class="sourceLineNo">549</span>      for (long i = 2; i &lt;= 10; i += 2) {<a name="line.549"></a>
+<span class="sourceLineNo">550</span>        Result r = scanner.next();<a name="line.550"></a>
+<span class="sourceLineNo">551</span>        assertNotNull(r);<a name="line.551"></a>
+<span class="sourceLineNo">552</span>        assertFalse(r.isEmpty());<a name="line.552"></a>
+<span class="sourceLineNo">553</span>        byte[] iBytes = Bytes.toBytes(i);<a name="line.553"></a>
+<span class="sourceLineNo">554</span>        assertArrayEquals("Row should be " + i, r.getRow(), iBytes);<a name="line.554"></a>
+<span class="sourceLineNo">555</span>        assertArrayEquals("Value should be " + i, r.getValue(A, A), iBytes);<a name="line.555"></a>
+<span class="sourceLineNo">556</span>      }<a name="line.556"></a>
+<span class="sourceLineNo">557</span>    } finally {<a name="line.557"></a>
+<span class="sourceLineNo">558</span>      scanner.close();<a name="line.558"></a>
+<span class="sourceLineNo">559</span>    }<a name="line.559"></a>
+<span class="sourceLineNo">560</span>    table.close();<a name="line.560"></a>
+<span class="sourceLineNo">561</span>  }<a name="line.561"></a>
+<span class="sourceLineNo">562</span><a name="line.562"></a>
+<span class="sourceLineNo">563</span>  @Test<a name="line.563"></a>
+<span class="sourceLineNo">564</span>  public void bulkLoadHFileTest() throws Exception {<a name="line.564"></a>
+<span class="sourceLineNo">565</span>    final String testName = TestRegionObserverInterface.class.getName() + "." + name.getMethodName();<a name="line.565"></a>
+<span class="sourceLineNo">566</span>    final TableName tableName = TableName.valueOf(TEST_TABLE.getNameAsString() + "." + name.getMethodName());<a name="line.566"></a>
+<span class="sourceLineNo">567</span>    Configuration conf = util.getConfiguration();<a name="line.567"></a>
+<span class="sourceLineNo">568</span>    Table table = util.createTable(tableName, new byte[][] { A, B, C });<a name="line.568"></a>
+<span class="sourceLineNo">569</span>    try (RegionLocator locator = util.getConnection().getRegionLocator(tableName)) {<a name="line.569"></a>
+<span class="sourceLineNo">570</span>      verifyMethodResult(SimpleRegionObserver.class,<a name="line.570"></a>
+<span class="sourceLineNo">571</span>        new String[] { "hadPreBulkLoadHFile", "hadPostBulkLoadHFile" }, tableName,<a name="line.571"></a>
+<span class="sourceLineNo">572</span>        new Boolean[] { false, false });<a name="line.572"></a>
+<span class="sourceLineNo">573</span><a name="line.573"></a>
+<span class="sourceLineNo">574</span>      FileSystem fs = util.getTestFileSystem();<a name="line.574"></a>
+<span class="sourceLineNo">575</span>      final Path dir = util.getDataTestDirOnTestFS(testName).makeQualified(fs);<a name="line.575"></a>
+<span class="sourceLineNo">576</span>      Path familyDir = new Path(dir, Bytes.toString(A));<a name="line.576"></a>
+<span class="sourceLineNo">577</span><a name="line.577"></a>
+<span class="sourceLineNo">578</span>      createHFile(util.getConfiguration(), fs, new Path(familyDir, Bytes.toString(A)), A, A);<a name="line.578"></a>
+<span class="sourceLineNo">579</span><a name="line.579"></a>
+<span class="sourceLineNo">580</span>      // Bulk load<a name="line.580"></a>
+<span class="sourceLineNo">581</span>      BulkLoadHFiles.create(conf).bulkLoad(tableName, dir);<a name="line.581"></a>
+<span class="sourceLineNo">582</span><a name="line.582"></a>
+<span class="sourceLineNo">583</span>      verifyMethodResult(SimpleRegionObserver.class,<a name="line.583"></a>
+<span class="sourceLineNo">584</span>        new String[] { "hadPreBulkLoadHFile", "hadPostBulkLoadHFile" }, tableName,<a name="line.584"></a>
+<span class="sourceLineNo">585</span>        new Boolean[] { true, true });<a name="line.585"></a>
+<span class="sourceLineNo">586</span>    } finally {<a name="line.586"></a>
+<span class="sourceLineNo">587</span>      util.deleteTable(tableName);<a name="line.587"></a>
+<span class="sourceLineNo">588</span>      table.close();<a name="line.588"></a>
+<span class="sourceLineNo">589</span>    }<a name="line.589"></a>
+<span class="sourceLineNo">590</span>  }<a name="line.590"></a>
+<span class="sourceLineNo">591</span><a name="line.591"></a>
+<span class="sourceLineNo">592</span>  @Test<a name="line.592"></a>
+<span class="sourceLineNo">593</span>  public void testRecovery() throws Exception {<a name="line.593"></a>
+<span class="sourceLineNo">594</span>    LOG.info(TestRegionObserverInterface.class.getName() + "." + name.getMethodName());<a name="line.594"></a>
+<span class="sourceLineNo">595</span>    final TableName tableName = TableName.valueOf(TEST_TABLE.getNameAsString() + "." + name.getMethodName());<a name="line.595"></a>
+<span class="sourceLineNo">596</span>    Table table = util.createTable(tableName, new byte[][] { A, B, C });<a name="line.596"></a>
+<span class="sourceLineNo">597</span>    try (RegionLocator locator = util.getConnection().getRegionLocator(tableName)) {<a name="line.597"></a>
+<span class="sourceLineNo">598</span><a name="line.598"></a>
+<span class="sourceLineNo">599</span>      JVMClusterUtil.RegionServerThread rs1 = cluster.startRegionServer();<a name="line.599"></a>
+<span class="sourceLineNo">600</span>      ServerName sn2 = rs1.getRegionServer().getServerName();<a name="line.600"></a>
+<span class="sourceLineNo">601</span>      String regEN = locator.getAllRegionLocations().get(0).getRegion().getEncodedName();<a name="line.601"></a>
+<span class="sourceLineNo">602</span><a name="line.602"></a>
+<span class="sourceLineNo">603</span>      util.getAdmin().move(Bytes.toBytes(regEN), sn2);<a name="line.603"></a>
+<span class="sourceLineNo">604</span>      while (!sn2.equals(locator.getAllRegionLocations().get(0).getServerName())) {<a name="line.604"></a>
+<span class="sourceLineNo">605</span>        Thread.sleep(100);<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>      Put put = new Put(ROW);<a name="line.608"></a>
+<span class="sourceLineNo">609</span>      put.addColumn(A, A, A);<a name="line.609"></a>
+<span class="sourceLineNo">610</span>      put.addColumn(B, B, B);<a name="line.610"></a>
+<span class="sourceLineNo">611</span>      put.addColumn(C, C, C);<a name="line.611"></a>
+<span class="sourceLineNo">612</span>      table.put(put);<a name="line.612"></a>
+<span class="sourceLineNo">613</span><a name="line.613"></a>
+<span class="sourceLineNo">614</span>      // put two times<a name="line.614"></a>
+<span class="sourceLineNo">615</span>      table.put(put);<a name="line.615"></a>
+<span class="sourceLineNo">616</span><a name="line.616"></a>
+<span class="sourceLineNo">617</span>      verifyMethodResult(SimpleRegionObserver.class,<a name="line.617"></a>
+<span class="sourceLineNo">618</span>        new String[] { "hadPreGet", "hadPostGet", "hadPrePut", "hadPostPut", "hadPreBatchMutate",<a name="line.618"></a>
+<span class="sourceLineNo">619</span>            "hadPostBatchMutate", "hadDelete" },<a name="line.619"></a>
+<span class="sourceLineNo">620</span>        tableName, new Boolean[] { false, false, true, true, true, true, false });<a name="line.620"></a>
+<span class="sourceLineNo">621</span><a name="line.621"></a>
+<span class="sourceLineNo">622</span>      verifyMethodResult(SimpleRegionObserver.class,<a name="line.622"></a>
+<span class="sourceLineNo">623</span>        new String[] { "getCtPreReplayWALs", "getCtPostReplayWALs", "getCtPreWALRestore",<a name="line.623"></a>
+<span class="sourceLineNo">624</span>            "getCtPostWALRestore", "getCtPrePut", "getCtPostPut" },<a name="line.624"></a>
+<span class="sourceLineNo">625</span>        tableName, new Integer[] { 0, 0, 0, 0, 2, 2 });<a name="line.625"></a>
+<span class="sourceLineNo">626</span><a name="line.626"></a>
+<span class="sourceLineNo">627</span>      cluster.killRegionServer(rs1.getRegionServer().getServerName());<a name="line.627"></a>
+<span class="sourceLineNo">628</span>      Threads.sleep(1000); // Let the kill soak in.<a name="line.628"></a>
+<span class="sourceLineNo">629</span>      util.waitUntilAllRegionsAssigned(tableName);<a name="line.629"></a>
+<span class="sourceLineNo">630</span>      LOG.info("All regions assigned");<a name="line.630"></a>
+<span class="sourceLineNo">631</span><a name="line.631"></a>
+<span class="sourceLineNo">632</span>      verifyMethodResult(SimpleRegionObserver.class,<a name="line.632"></a>
+<span class="sourceLineNo">633</span>        new String[] { "getCtPreReplayWALs", "getCtPostReplayWALs", "getCtPreWALRestore",<a name="line.633"></a>
+<span class="sourceLineNo">634</span>            "getCtPostWALRestore", "getCtPrePut", "getCtPostPut" },<a name="line.634"></a>
+<span class="sourceLineNo">635</span>        tableName, new Integer[] { 1, 1, 2, 2, 0, 0 });<a name="line.635"></a>
+<span class="sourceLineNo">636</span>    } finally {<a name="line.636"></a>
+<span class="sourceLineNo">637</span>      util.deleteTable(tableName);<a name="line.637"></a>
+<span class="sourceLineNo">638</span>      table.close();<a name="line.638"></a>
+<span class="sourceLineNo">639</span>    }<a name="line.639"></a>
+<span class="sourceLineNo">640</span>  }<a name="line.640"></a>
+<span class="sourceLineNo">641</span><a name="line.641"></a>
+<span class="sourceLineNo">642</span>  @Test<a name="line.642"></a>
+<span class="sourceLineNo">643</span>  public void testPreWALRestoreSkip() throws Exception {<a name="line.643"></a>
+<span class="sourceLineNo">644</span>    LOG.info(TestRegionObserverInterface.class.getName() + "." + name.getMethodName());<a name="line.644"></a>
+<span class="sourceLineNo">645</span>    TableName tableName = TableName.valueOf(SimpleRegionObserver.TABLE_SKIPPED);<a name="line.645"></a>
+<span class="sourceLineNo">646</span>    Table table = util.createTable(tableName, new byte[][] { A, B, C });<a name="line.646"></a>
+<span class="sourceLineNo">647</span><a name="line.647"></a>
+<span class="sourceLineNo">648</span>    try (RegionLocator locator = util.getConnection().getRegionLocator(tableName)) {<a name="line.648"></a>
+<span class="sourceLineNo">649</span>      JVMClusterUtil.RegionServerThread rs1 = cluster.startRegionServer();<a name="line.649"></a>
+<span class="sourceLineNo">650</span>      ServerName sn2 = rs1.getRegionServer().getServerName();<a name="line.650"></a>
+<span class="sourceLineNo">651</span>      String regEN = locator.getAllRegionLocations().get(0).getRegion().getEncodedName();<a name="line.651"></a>
+<span class="sourceLineNo">652</span><a name="line.652"></a>
+<span class="sourceLineNo">653</span>      util.getAdmin().move(Bytes.toBytes(regEN), sn2);<a name="line.653"></a>
+<span class="sourceLineNo">654</span>      while (!sn2.equals(locator.getAllRegionLocations().get(0).getServerName())) {<a name="line.654"></a>
+<span class="sourceLineNo">655</span>        Thread.sleep(100);<a name="line.655"></a>
+<span class="sourceLineNo">656</span>      }<a name="line.656"></a>
+<span class="sourceLineNo">657</span><a name="line.657"></a>
+<span class="sourceLineNo">658</span>      Put put = new Put(ROW);<a name="line.658"></a>
+<span class="sourceLineNo">659</span>      put.addColumn(A, A, A);<a name="line.659"></a>
+<span class="sourceLineNo">660</span>      put.addColumn(B, B, B);<a name="line.660"></a>
+<span class="sourceLineNo">661</span>      put.addColumn(C, C, C);<a name="line.661"></a>
+<span class="sourceLineNo">662</span>      table.put(put);<a name="line.662"></a>
+<span class="sourceLineNo">663</span><a name="line.663"></a>
+<span class="sourceLineNo">664</span>      cluster.killRegionServer(rs1.getRegionServer().getServerName());<a name="line.664"></a>
+<span class="sourceLineNo">665</span>      Threads.sleep(20000); // just to be sure that the kill has fully started.<a name="line.665"></a>
+<span class="sourceLineNo">666</span>      util.waitUntilAllRegionsAssigned(tableName);<a name="line.666"></a>
+<span class="sourceLineNo">667</span>    }<a name="line.667"></a>
+<span class="sourceLineNo">668</span><a name="line.668"></a>
+<span class="sourceLineNo">669</span>    verifyMethodResult(SimpleRegionObserver.class,<a name="line.669"></a>
+<span class="sourceLineNo">670</span>      new String[] { "getCtPreWALRestore", "getCtPostWALRestore", }, tableName,<a name="line.670"></a>
+<span class="sourceLineNo">671</span>      new Integer[] { 0, 0 });<a name="line.671"></a>
+<span class="sourceLineNo">672</span><a name="line.672"></a>
+<span class="sourceLineNo">673</span>    util.deleteTable(tableName);<a name="line.673"></a>
+<span class="sourceLineNo">674</span>    table.close();<a name="line.674"></a>
+<span class="sourceLineNo">675</span>  }<a name="line.675"></a>
+<span class="sourceLineNo">676</span><a name="line.676"></a>
+<span class="sourceLineNo">677</span>  //called from testPreWALAppendIsWrittenToWAL<a name="line.677"></a>
+<span class="sourceLineNo">678</span>  private void testPreWALAppendHook(Table table, TableName tableName) throws IOException {<a name="line.678"></a>
+<span class="sourceLineNo">679</span>    int expectedCalls = 0;<a name="line.679"></a>
+<span class="sourceLineNo">680</span>    String [] methodArray = new String[1];<a name="line.680"></a>
+<span class="sourceLineNo">681</span>    methodArray[0] = "getCtPreWALAppend";<a name="line.681"></a>
+<span class="sourceLineNo">682</span>    Object[] resultArray = new Object[1];<a name="line.682"></a>
+<span class="sourceLineNo">683</span><a name="line.683"></a>
+<span class="sourceLineNo">684</span>    Put p = new Put(ROW);<a name="line.684"></a>
+<span class="sourceLineNo">685</span>    p.addColumn(A, A, A);<a name="line.685"></a>
+<span class="sourceLineNo">686</span>    table.put(p);<a name="line.686"></a>
+<span class="sourceLineNo">687</span>    resultArray[0] = ++expectedCalls;<a name="line.687"></a>
+<span class="sourceLineNo">688</span>    verifyMethodResult(SimpleRegionObserver.class, methodArray, tableName, resultArray);<a name="line.688"></a>
+<span class="sourceLineNo">689</span><a name="line.689"></a>
+<span class="sourceLineNo">690</span>    Append a = new Append(ROW);<a name="line.690"></a>
+<span class="sourceLineNo">691</span>    a.addColumn(B, B, B);<a name="line.691"></a>
+<span class="sourceLineNo">692</span>    table.append(a);<a name="line.692"></a>
+<span class="sourceLineNo">693</span>    resultArray[0] = ++expectedCalls;<a name="line.693"></a>
+<span class="sourceLineNo">694</span>    verifyMethodResult(SimpleRegionObserver.class, methodArray, tableName, resultArray);<a name="line.694"></a>
+<span class="sourceLineNo">695</span><a name="line.695"></a>
+<span class="sourceLineNo">696</span>    Increment i = new Increment(ROW);<a name="line.696"></a>
+<span class="sourceLineNo">697</span>    i.addColumn(C, C, 1);<a name="line.697"></a>
+<span class="sourceLineNo">698</span>    table.increment(i);<a name="line.698"></a>
+<span class="sourceLineNo">699</span>    resultArray[0] = ++expectedCalls;<a name="line.699"></a>
+<span class="sourceLineNo">700</span>    verifyMethodResult(SimpleRegionObserver.class, methodArray, tableName, resultArray);<a name="line.700"></a>
+<span class="sourceLineNo">701</span><a name="line.701"></a>
+<span class="sourceLineNo">702</span>    Delete d = new Delete(ROW);<a name="line.702"></a>
+<span class="sourceLineNo">703</span>    table.delete(d);<a name="line.703"></a>
+<span class="sourceLineNo">704</span>    resultArray[0] = ++expectedCalls;<a name="line.704"></a>
+<span class="sourceLineNo">705</span>    verifyMethodResult(SimpleRegionObserver.class, methodArray, tableName, resultArray);<a name="line.705"></a>
+<span class="sourceLineNo">706</span>  }<a name="line.706"></a>
+<span class="sourceLineNo">707</span><a name="line.707"></a>
+<span class="sourceLineNo">708</span>  @Test<a name="line.708"></a>
+<span class="sourceLineNo">709</span>  public void testPreWALAppend() throws Exception {<a name="line.709"></a>
+<span class="sourceLineNo">710</span>    SimpleRegionObserver sro = new SimpleRegionObserver();<a name="line.710"></a>
+<span class="sourceLineNo">711</span>    ObserverContext ctx = Mockito.mock(ObserverContext.class);<a name="line.711"></a>
+<span class="sourceLineNo">712</span>    WALKey key = new WALKeyImpl(Bytes.toBytes("region"), TEST_TABLE,<a name="line.712"></a>
+<span class="sourceLineNo">713</span>        EnvironmentEdgeManager.currentTime());<a name="line.713"></a>
+<span class="sourceLineNo">714</span>    WALEdit edit = new WALEdit();<a name="line.714"></a>
+<span class="sourceLineNo">715</span>    sro.preWALAppend(ctx, key, edit);<a name="line.715"></a>
+<span class="sourceLineNo">716</span>    Assert.assertEquals(1, key.getExtendedAttributes().size());<a name="line.716"></a>
+<span class="sourceLineNo">717</span>    Assert.assertArrayEquals(SimpleRegionObserver.WAL_EXTENDED_ATTRIBUTE_BYTES,<a name="line.717"></a>
+<span class="sourceLineNo">718</span>        key.getExtendedAttribute(Integer.toString(sro.getCtPreWALAppend())));<a name="line.718"></a>
+<span class="sourceLineNo">719</span>  }<a name="line.719"></a>
+<span class="sourceLineNo">720</span><a name="line.720"></a>
+<span class="sourceLineNo">721</span>  @Test<a name="line.721"></a>
+<span class="sourceLineNo">722</span>  public void testPreWALAppendIsWrittenToWAL() throws Exception {<a name="line.722"></a>
+<span class="sourceLineNo">723</span>    final TableName tableName = TableName.valueOf(TEST_TABLE.getNameAsString() +<a name="line.723"></a>
+<span class="sourceLineNo">724</span>        "." + name.getMethodName());<a name="line.724"></a>
+<span class="sourceLineNo">725</span>    Table table = util.createTable(tableName, new byte[][] { A, B, C });<a name="line.725"></a>
+<span class="sourceLineNo">726</span><a name="line.726"></a>
+<span class="sourceLineNo">727</span>    PreWALAppendWALActionsListener listener = new PreWALAppendWALActionsListener();<a name="line.727"></a>
+<span class="sourceLineNo">728</span>    List&lt;HRegion&gt; regions = util.getHBaseCluster().getRegions(tableName);<a name="line.728"></a>
+<span class="sourceLineNo">729</span>    //should be only one region<a name="line.729"></a>
+<span class="sourceLineNo">730</span>    HRegion region = regions.get(0);<a name="line.730"></a>
+<span class="sourceLineNo">731</span>    region.getWAL().registerWALActionsListener(listener);<a name="line.731"></a>
+<span class="sourceLineNo">732</span>    testPreWALAppendHook(table, tableName);<a name="line.732"></a>
+<span class="sourceLineNo">733</span>    boolean[] expectedResults = {true, true, true, true};<a name="line.733"></a>
+<span class="sourceLineNo">734</span>    Assert.assertArrayEquals(expectedResults, listener.getWalKeysCorrectArray());<a name="line.734"></a>
+<span class="sourceLineNo">735</span><a name="line.735"></a>
+<span class="sourceLineNo">736</span>  }<a name="line.736"></a>
+<span class="sourceLineNo">737</span><a name="line.737"></a>
+<span class="sourceLineNo">738</span>  @Test<a name="line.738"></a>
+<span class="sourceLineNo">739</span>  public void testPreWALAppendNotCalledOnMetaEdit() throws Exception {<a name="line.739"></a>
+<span class="sourceLineNo">740</span>    final TableName tableName = TableName.valueOf(TEST_TABLE.getNameAsString() +<a name="line.740"></a>
+<span class="sourceLineNo">741</span>        "." + name.getMethodName());<a name="line.741"></a>
+<span class="sourceLineNo">742</span>    TableDescriptorBuilder tdBuilder = TableDescriptorBuilder.newBuilder(tableName);<a name="line.742"></a>
+<span class="sourceLineNo">743</span>    ColumnFamilyDescriptorBuilder cfBuilder = ColumnFamilyDescriptorBuilder.newBuilder(FAMILY);<a name="line.743"></a>
+<span class="sourceLineNo">744</span>    tdBuilder.setColumnFamily(cfBuilder.build());<a name="line.744"></a>
+<span class="sourceLineNo">745</span>    tdBuilder.setCoprocessor(SimpleRegionObserver.class.getName());<a name="line.745"></a>
+<span class="sourceLineNo">746</span>    TableDescriptor td = tdBuilder.build();<a name="line.746"></a>
+<span class="sourceLineNo">747</span>    Table table = util.createTable(td, new byte[][] { A, B, C });<a name="line.747"></a>
+<span class="sourceLineNo">748</span><a name="line.748"></a>
+<span class="sourceLineNo">749</span>    PreWALAppendWALActionsListener listener = new PreWALAppendWALActionsListener();<a name="line.749"></a>
+<span class="sourceLineNo">750</span>    List&lt;HRegion&gt; regions = util.getHBaseCluster().getRegions(tableName);<a name="line.750"></a>
+<span class="sourceLineNo">751</span>    //should be only one region<a name="line.751"></a>
+<span class="sourceLineNo">752</span>    HRegion region = regions.get(0);<a name="line.752"></a>
+<span class="sourceLineNo">753</span><a name="line.753"></a>
+<span class="sourceLineNo">754</span>    region.getWAL().registerWALActionsListener(listener);<a name="line.754"></a>
+<span class="sourceLineNo">755</span>    //flushing should write to the WAL<a name="line.755"></a>
+<span class="sourceLineNo">756</span>    region.flush(true);<a name="line.756"></a>
+<span class="sourceLineNo">757</span>    //so should compaction<a name="line.757"></a>
+<span class="sourceLineNo">758</span>    region.compact(false);<a name="line.758"></a>
+<span class="sourceLineNo">759</span>    //and so should closing the region<a name="line.759"></a>
+<span class="sourceLineNo">760</span>    region.close();<a name="line.760"></a>
+<span class="sourceLineNo">761</span><a name="line.761"></a>
+<span class="sourceLineNo">762</span>    //but we still shouldn't have triggered preWALAppend because no user data was written<a name="line.762"></a>
+<span class="sourceLineNo">763</span>    String[] methods = new String[] {"getCtPreWALAppend"};<a name="line.763"></a>
+<span class="sourceLineNo">764</span>    Object[] expectedResult = new Integer[]{0};<a name="line.764"></a>
+<span class="sourceLineNo">765</span>    verifyMethodResult(SimpleRegionObserver.class, methods, tableName, expectedResult);<a name="line.765"></a>
+<span class="sourceLineNo">766</span>  }<a name="line.766"></a>
+<span class="sourceLineNo">767</span><a name="line.767"></a>
+<span class="sourceLineNo">768</span>  // check each region whether the coprocessor upcalls are called or not.<a name="line.768"></a>
+<span class="sourceLineNo">769</span>  private void verifyMethodResult(Class&lt;?&gt; coprocessor, String methodName[], TableName tableName,<a name="line.769"></a>
+<span class="sourceLineNo">770</span>      Object value[]) throws IOException {<a name="line.770"></a>
+<span class="sourceLineNo">771</span>    try {<a name="line.771"></a>
+<span class="sourceLineNo">772</span>      for (JVMClusterUtil.RegionServerThread t : cluster.getRegionServerThreads()) {<a name="line.772"></a>
+<span class="sourceLineNo">773</span>        if (!t.isAlive() || t.getRegionServer().isAborted() || t.getRegionServer().isStopping()) {<a name="line.773"></a>
+<span class="sourceLineNo">774</span>          continue;<a name="line.774"></a>
+<span class="sourceLineNo">775</span>        }<a name="line.775"></a>
+<span class="sourceLineNo">776</span>        for (RegionInfo r : ProtobufUtil<a name="line.776"></a>
+<span class="sourceLineNo">777</span>            .getOnlineRegions(t.getRegionServer().getRSRpcServices())) {<a name="line.777"></a>
+<span class="sourceLineNo">778</span>          if (!r.getTable().equals(tableName)) {<a name="line.778"></a>
+<span class="sourceLineNo">779</span>            continue;<a name="line.779"></a>
+<span class="sourceLineNo">780</span>          }<a name="line.780"></a>
+<span class="sourceLineNo">781</span>          RegionCoprocessorHost cph =<a name="line.781"></a>
+<span class="sourceLineNo">782</span>              t.getRegionServer().getOnlineRegion(r.getRegionName()).getCoprocessorHost();<a name="line.782"></a>
+<span class="sourceLineNo">783</span><a name="line.783"></a>
+<span class="sourceLineNo">784</span>          Coprocessor cp = cph.findCoprocessor(coprocessor.getName());<a name="line.784"></a>
+<span class="sourceLineNo">785</span>          assertNotNull(cp);<a name="line.785"></a>
+<span class="sourceLineNo">786</span>          for (int i = 0; i &lt; methodName.length; ++i) {<a name="line.786"></a>
+<span class="sourceLineNo">787</span>            Method m = coprocessor.getMethod(methodName[i]);<a name="line.787"></a>
+<span class="sourceLineNo">788</span>            Object o = m.invoke(cp);<a name="line.788"></a>
+<span class="sourceLineNo">789</span>            assertTrue("Result of " + coprocessor.getName() + "." + methodName[i]<a name="line.789"></a>
+<span class="sourceLineNo">790</span>                    + " is expected to be " + value[i].toString() + ", while we get "<a name="line.790"></a>
+<span class="sourceLineNo">791</span>                    + o.toString(), o.equals(value[i]));<a name="line.791"></a>
+<span class="sourceLineNo">792</span>          }<a name="line.792"></a>
+<span class="sourceLineNo">793</span>        }<a name="line.793"></a>
+<span class="sourceLineNo">794</span>      }<a name="line.794"></a>
+<span class="sourceLineNo">795</span>    } catch (Exception e) {<a name="line.795"></a>
+<span class="sourceLineNo">796</span>      throw new IOException(e.toString());<a name="line.796"></a>
+<span class="sourceLineNo">797</span>    }<a name="line.797"></a>
+<span class="sourceLineNo">798</span>  }<a name="line.798"></a>
+<span class="sourceLineNo">799</span><a name="line.799"></a>
+<span class="sourceLineNo">800</span>  private static void createHFile(Configuration conf, FileSystem fs, Path path, byte[] family,<a name="line.800"></a>
+<span class="sourceLineNo">801</span>      byte[] qualifier) throws IOException {<a name="line.801"></a>
+<span class="sourceLineNo">802</span>    HFileContext context = new HFileContextBuilder().build();<a name="line.802"></a>
+<span class="sourceLineNo">803</span>    HFile.Writer writer = HFile.getWriterFactory(conf, new CacheConfig(conf)).withPath(fs, path)<a name="line.803"></a>
+<span class="sourceLineNo">804</span>        .withFileContext(context).create();<a name="line.804"></a>
+<span class="sourceLineNo">805</span>    long now = System.currentTimeMillis();<a name="line.805"></a>
+<span class="sourceLineNo">806</span>    try {<a name="line.806"></a>
+<span class="sourceLineNo">807</span>      for (int i = 1; i &lt;= 9; i++) {<a name="line.807"></a>
+<span class="sourceLineNo">808</span>        KeyValue kv =<a name="line.808"></a>
+<span class="sourceLineNo">809</span>            new KeyValue(Bytes.toBytes(i + ""), family, qualifier, now, Bytes.toBytes(i + ""));<a name="line.809"></a>
+<span class="sourceLineNo">810</span>        writer.append(kv);<a name="line.810"></a>
+<span class="sourceLineNo">811</span>      }<a name="line.811"></a>
+<span class="sourceLineNo">812</span>    } finally {<a name="line.812"></a>
+<span class="sourceLineNo">813</span>      writer.close();<a name="line.813"></a>
+<span class="sourceLineNo">814</span>    }<a name="line.814"></a>
+<span class="sourceLineNo">815</span>  }<a name="line.815"></a>
+<span class="sourceLineNo">816</span><a name="line.816"></a>
+<span class="sourceLineNo">817</span>  private static class PreWALAppendWALActionsListener implements WALActionsListener {<a name="line.817"></a>
+<span class="sourceLineNo">818</span>    boolean[] walKeysCorrect = {false, false, false, false};<a name="line.818"></a>
+<span class="sourceLineNo">819</span><a name="line.819"></a>
+<span class="sourceLineNo">820</span>    @Override<a name="line.820"></a>
+<span class="sourceLineNo">821</span>    public void postAppend(long entryLen, long elapsedTimeMillis,<a name="line.821"></a>
+<span class="sourceLineNo">822</span>                           WALKey logKey, WALEdit logEdit) throws IOException {<a name="line.822"></a>
+<span class="sourceLineNo">823</span>      for (int k = 0; k &lt; 4; k++) {<a name="line.823"></a>
+<span class="sourceLineNo">824</span>        if (!walKeysCorrect[k]) {<a name="line.824"></a>
+<span class="sourceLineNo">825</span>          walKeysCorrect[k] = Arrays.equals(SimpleRegionObserver.WAL_EXTENDED_ATTRIBUTE_BYTES,<a name="line.825"></a>
+<span class="sourceLineNo">826</span>              logKey.getExtendedAttribute(Integer.toString(k + 1)));<a name="line.826"></a>
+<span class="sourceLineNo">827</span>        }<a name="line.827"></a>
+<span class="sourceLineNo">828</span>      }<a name="line.828"></a>
+<span class="sourceLineNo">829</span>    }<a name="line.829"></a>
+<span class="sourceLineNo">830</span><a name="line.830"></a>
+<span class="sourceLineNo">831</span>    boolean[] getWalKeysCorrectArray() {<a name="line.831"></a>
+<span class="sourceLineNo">832</span>      return walKeysCorrect;<a name="line.832"></a>
+<span class="sourceLineNo">833</span>    }<a name="line.833"></a>
+<span class="sourceLineNo">834</span>  }<a name="line.834"></a>
+<span class="sourceLineNo">835</span>}<a name="line.835"></a>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+</pre>
+</div>
+</body>
+</html>
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html
index ade26ef..1378078 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/coprocessor/TestRegionObserverInterface.html
@@ -33,693 +33,814 @@
 <span class="sourceLineNo">025</span>import java.io.IOException;<a name="line.25"></a>
 <span class="sourceLineNo">026</span>import java.lang.reflect.Method;<a name="line.26"></a>
 <span class="sourceLineNo">027</span>import java.util.ArrayList;<a name="line.27"></a>
-<span class="sourceLineNo">028</span>import java.util.List;<a name="line.28"></a>
-<span class="sourceLineNo">029</span>import java.util.Optional;<a name="line.29"></a>
-<span class="sourceLineNo">030</span>import org.apache.hadoop.conf.Configuration;<a name="line.30"></a>
-<span class="sourceLineNo">031</span>import org.apache.hadoop.fs.FileSystem;<a name="line.31"></a>
-<span class="sourceLineNo">032</span>import org.apache.hadoop.fs.Path;<a name="line.32"></a>
-<span class="sourceLineNo">033</span>import org.apache.hadoop.hbase.Cell;<a name="line.33"></a>
-<span class="sourceLineNo">034</span>import org.apache.hadoop.hbase.CellUtil;<a name="line.34"></a>
-<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.Coprocessor;<a name="line.35"></a>
-<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.36"></a>
-<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.HBaseTestingUtility;<a name="line.37"></a>
-<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.HColumnDescriptor;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.HTableDescriptor;<a name="line.39"></a>
-<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.KeyValue;<a name="line.40"></a>
-<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.MiniHBaseCluster;<a name="line.41"></a>
-<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.ServerName;<a name="line.42"></a>
-<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.TableName;<a name="line.43"></a>
-<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.client.Admin;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.client.Append;<a name="line.45"></a>
-<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.46"></a>
-<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.47"></a>
-<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.client.Get;<a name="line.48"></a>
-<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.49"></a>
-<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.client.Put;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.client.RegionLocator;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.client.Result;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.56"></a>
-<span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.client.Table;<a name="line.57"></a>
-<span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.io.hfile.CacheConfig;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.io.hfile.HFile;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.io.hfile.HFileContext;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.io.hfile.HFileContextBuilder;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.regionserver.HRegion;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.regionserver.InternalScanner;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.regionserver.RegionCoprocessorHost;<a name="line.66"></a>
-<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.regionserver.ScanType;<a name="line.67"></a>
-<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.regionserver.ScannerContext;<a name="line.68"></a>
-<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.regionserver.Store;<a name="line.69"></a>
-<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.regionserver.StoreFile;<a name="line.70"></a>
-<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.testclassification.CoprocessorTests;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.testclassification.MediumTests;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.tool.BulkLoadHFiles;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.util.JVMClusterUtil;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.junit.AfterClass;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>import org.junit.BeforeClass;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>import org.junit.ClassRule;<a name="line.82"></a>
-<span class="sourceLineNo">083</span>import org.junit.Rule;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>import org.junit.Test;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>import org.junit.experimental.categories.Category;<a name="line.85"></a>
-<span class="sourceLineNo">086</span>import org.junit.rules.TestName;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>import org.slf4j.Logger;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>import org.slf4j.LoggerFactory;<a name="line.88"></a>
-<span class="sourceLineNo">089</span><a name="line.89"></a>
-<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;<a name="line.90"></a>
-<span class="sourceLineNo">091</span><a name="line.91"></a>
-<span class="sourceLineNo">092</span>@Category({ CoprocessorTests.class, MediumTests.class })<a name="line.92"></a>
-<span class="sourceLineNo">093</span>public class TestRegionObserverInterface {<a name="line.93"></a>
-<span class="sourceLineNo">094</span><a name="line.94"></a>
-<span class="sourceLineNo">095</span>  @ClassRule<a name="line.95"></a>
-<span class="sourceLineNo">096</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.96"></a>
-<span class="sourceLineNo">097</span>      HBaseClassTestRule.forClass(TestRegionObserverInterface.class);<a name="line.97"></a>
-<span class="sourceLineNo">098</span><a name="line.98"></a>
-<span class="sourceLineNo">099</span>  private static final Logger LOG = LoggerFactory.getLogger(TestRegionObserverInterface.class);<a name="line.99"></a>
-<span class="sourceLineNo">100</span><a name="line.100"></a>
-<span class="sourceLineNo">101</span>  public static final TableName TEST_TABLE = TableName.valueOf("TestTable");<a name="line.101"></a>
-<span class="sourceLineNo">102</span>  public final static byte[] A = Bytes.toBytes("a");<a name="line.102"></a>
-<span class="sourceLineNo">103</span>  public final static byte[] B = Bytes.toBytes("b");<a name="line.103"></a>
-<span class="sourceLineNo">104</span>  public final static byte[] C = Bytes.toBytes("c");<a name="line.104"></a>
-<span class="sourceLineNo">105</span>  public final static byte[] ROW = Bytes.toBytes("testrow");<a name="line.105"></a>
-<span class="sourceLineNo">106</span><a name="line.106"></a>
-<span class="sourceLineNo">107</span>  private static HBaseTestingUtility util = new HBaseTestingUtility();<a name="line.107"></a>
-<span class="sourceLineNo">108</span>  private static MiniHBaseCluster cluster = null;<a name="line.108"></a>
-<span class="sourceLineNo">109</span><a name="line.109"></a>
-<span class="sourceLineNo">110</span>  @Rule<a name="line.110"></a>
-<span class="sourceLineNo">111</span>  public TestName name = new TestName();<a name="line.111"></a>
-<span class="sourceLineNo">112</span><a name="line.112"></a>
-<span class="sourceLineNo">113</span>  @BeforeClass<a name="line.113"></a>
-<span class="sourceLineNo">114</span>  public static void setupBeforeClass() throws Exception {<a name="line.114"></a>
-<span class="sourceLineNo">115</span>    // set configure to indicate which cp should be loaded<a name="line.115"></a>
-<span class="sourceLineNo">116</span>    Configuration conf = util.getConfiguration();<a name="line.116"></a>
-<span class="sourceLineNo">117</span>    conf.setBoolean("hbase.master.distributed.log.replay", true);<a name="line.117"></a>
-<span class="sourceLineNo">118</span>    conf.setStrings(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY,<a name="line.118"></a>
-<span class="sourceLineNo">119</span>      SimpleRegionObserver.class.getName());<a name="line.119"></a>
+<span class="sourceLineNo">028</span>import java.util.Arrays;<a name="line.28"></a>
+<span class="sourceLineNo">029</span>import java.util.List;<a name="line.29"></a>
+<span class="sourceLineNo">030</span>import java.util.Optional;<a name="line.30"></a>
+<span class="sourceLineNo">031</span>import org.apache.hadoop.conf.Configuration;<a name="line.31"></a>
+<span class="sourceLineNo">032</span>import org.apache.hadoop.fs.FileSystem;<a name="line.32"></a>
+<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.Cell;<a name="line.34"></a>
+<span class="sourceLineNo">035</span>import org.apache.hadoop.hbase.CellUtil;<a name="line.35"></a>
+<span class="sourceLineNo">036</span>import org.apache.hadoop.hbase.Coprocessor;<a name="line.36"></a>
+<span class="sourceLineNo">037</span>import org.apache.hadoop.hbase.HBaseClassTestRule;<a name="line.37"></a>
+<span class="sourceLineNo">038</span>import org.apache.hadoop.hbase.HBaseTestingUtility;<a name="line.38"></a>
+<span class="sourceLineNo">039</span>import org.apache.hadoop.hbase.HColumnDescriptor;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>import org.apache.hadoop.hbase.HTableDescriptor;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>import org.apache.hadoop.hbase.KeyValue;<a name="line.41"></a>
+<span class="sourceLineNo">042</span>import org.apache.hadoop.hbase.MiniHBaseCluster;<a name="line.42"></a>
+<span class="sourceLineNo">043</span>import org.apache.hadoop.hbase.ServerName;<a name="line.43"></a>
+<span class="sourceLineNo">044</span>import org.apache.hadoop.hbase.TableName;<a name="line.44"></a>
+<span class="sourceLineNo">045</span>import org.apache.hadoop.hbase.client.Admin;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>import org.apache.hadoop.hbase.client.Append;<a name="line.46"></a>
+<span class="sourceLineNo">047</span>import org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder;<a name="line.47"></a>
+<span class="sourceLineNo">048</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.48"></a>
+<span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.49"></a>
+<span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.client.Get;<a name="line.50"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.client.Put;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.client.RegionLocator;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.client.Result;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.client.ResultScanner;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.57"></a>
+<span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.58"></a>
+<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.client.Table;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.client.TableDescriptor;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.client.TableDescriptorBuilder;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.filter.FilterAllFilter;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.io.hfile.CacheConfig;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.io.hfile.HFile;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.io.hfile.HFileContext;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.io.hfile.HFileContextBuilder;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.regionserver.FlushLifeCycleTracker;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.regionserver.HRegion;<a name="line.68"></a>
+<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.regionserver.InternalScanner;<a name="line.69"></a>
+<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.regionserver.RegionCoprocessorHost;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.regionserver.ScanType;<a name="line.71"></a>
+<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.regionserver.ScannerContext;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.regionserver.Store;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.regionserver.StoreFile;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.regionserver.compactions.CompactionLifeCycleTracker;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.regionserver.compactions.CompactionRequest;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.regionserver.wal.WALActionsListener;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.testclassification.CoprocessorTests;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.testclassification.MediumTests;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.tool.BulkLoadHFiles;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.81"></a>
+<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.util.JVMClusterUtil;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.wal.WALEdit;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.wal.WALKey;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.wal.WALKeyImpl;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>import org.junit.AfterClass;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>import org.junit.Assert;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>import org.junit.BeforeClass;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>import org.junit.ClassRule;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>import org.junit.Rule;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>import org.junit.Test;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.junit.experimental.categories.Category;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.junit.rules.TestName;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.mockito.Mockito;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.slf4j.Logger;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.slf4j.LoggerFactory;<a name="line.98"></a>
+<span class="sourceLineNo">099</span><a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;<a name="line.100"></a>
+<span class="sourceLineNo">101</span><a name="line.101"></a>
+<span class="sourceLineNo">102</span>@Category({ CoprocessorTests.class, MediumTests.class })<a name="line.102"></a>
+<span class="sourceLineNo">103</span>public class TestRegionObserverInterface {<a name="line.103"></a>
+<span class="sourceLineNo">104</span><a name="line.104"></a>
+<span class="sourceLineNo">105</span>  @ClassRule<a name="line.105"></a>
+<span class="sourceLineNo">106</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.106"></a>
+<span class="sourceLineNo">107</span>      HBaseClassTestRule.forClass(TestRegionObserverInterface.class);<a name="line.107"></a>
+<span class="sourceLineNo">108</span><a name="line.108"></a>
+<span class="sourceLineNo">109</span>  private static final Logger LOG = LoggerFactory.getLogger(TestRegionObserverInterface.class);<a name="line.109"></a>
+<span class="sourceLineNo">110</span><a name="line.110"></a>
+<span class="sourceLineNo">111</span>  public static final TableName TEST_TABLE = TableName.valueOf("TestTable");<a name="line.111"></a>
+<span class="sourceLineNo">112</span>  public static final byte[] FAMILY = Bytes.toBytes("f");<a name="line.112"></a>
+<span class="sourceLineNo">113</span>  public final static byte[] A = Bytes.toBytes("a");<a name="line.113"></a>
+<span class="sourceLineNo">114</span>  public final static byte[] B = Bytes.toBytes("b");<a name="line.114"></a>
+<span class="sourceLineNo">115</span>  public final static byte[] C = Bytes.toBytes("c");<a name="line.115"></a>
+<span class="sourceLineNo">116</span>  public final static byte[] ROW = Bytes.toBytes("testrow");<a name="line.116"></a>
+<span class="sourceLineNo">117</span><a name="line.117"></a>
+<span class="sourceLineNo">118</span>  private static HBaseTestingUtility util = new HBaseTestingUtility();<a name="line.118"></a>
+<span class="sourceLineNo">119</span>  private static MiniHBaseCluster cluster = null;<a name="line.119"></a>
 <span class="sourceLineNo">120</span><a name="line.120"></a>
-<span class="sourceLineNo">121</span>    util.startMiniCluster();<a name="line.121"></a>
-<span class="sourceLineNo">122</span>    cluster = util.getMiniHBaseCluster();<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>  @AfterClass<a name="line.125"></a>
-<span class="sourceLineNo">126</span>  public static void tearDownAfterClass() throws Exception {<a name="line.126"></a>
-<span class="sourceLineNo">127</span>    util.shutdownMiniCluster();<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>  @Test<a name="line.130"></a>
-<span class="sourceLineNo">131</span>  public void testRegionObserver() throws IOException {<a name="line.131"></a>
-<span class="sourceLineNo">132</span>    final TableName tableName = TableName.valueOf(TEST_TABLE.getNameAsString() + "." + name.getMethodName());<a name="line.132"></a>
-<span class="sourceLineNo">133</span>    // recreate table every time in order to reset the status of the<a name="line.133"></a>
-<span class="sourceLineNo">134</span>    // coprocessor.<a name="line.134"></a>
-<span class="sourceLineNo">135</span>    Table table = util.createTable(tableName, new byte[][] { A, B, C });<a name="line.135"></a>
-<span class="sourceLineNo">136</span>    try {<a name="line.136"></a>
-<span class="sourceLineNo">137</span>      verifyMethodResult(SimpleRegionObserver.class,<a name="line.137"></a>
-<span class="sourceLineNo">138</span>        new String[] { "hadPreGet", "hadPostGet", "hadPrePut", "hadPostPut", "hadDelete",<a name="line.138"></a>
-<span class="sourceLineNo">139</span>            "hadPostStartRegionOperation", "hadPostCloseRegionOperation",<a name="line.139"></a>
-<span class="sourceLineNo">140</span>            "hadPostBatchMutateIndispensably" },<a name="line.140"></a>
-<span class="sourceLineNo">141</span>        tableName, new Boolean[] { false, false, false, false, false, false, false, false });<a name="line.141"></a>
-<span class="sourceLineNo">142</span><a name="line.142"></a>
-<span class="sourceLineNo">143</span>      Put put = new Put(ROW);<a name="line.143"></a>
-<span class="sourceLineNo">144</span>      put.addColumn(A, A, A);<a name="line.144"></a>
-<span class="sourceLineNo">145</span>      put.addColumn(B, B, B);<a name="line.145"></a>
-<span class="sourceLineNo">146</span>      put.addColumn(C, C, C);<a name="line.146"></a>
-<span class="sourceLineNo">147</span>      table.put(put);<a name="line.147"></a>
-<span class="sourceLineNo">148</span><a name="line.148"></a>
-<span class="sourceLineNo">149</span>      verifyMethodResult(SimpleRegionObserver.class,<a name="line.149"></a>
-<span class="sourceLineNo">150</span>        new String[] { "hadPreGet", "hadPostGet", "hadPrePut", "hadPostPut", "hadPreBatchMutate",<a name="line.150"></a>
-<span class="sourceLineNo">151</span>            "hadPostBatchMutate", "hadDelete", "hadPostStartRegionOperation",<a name="line.151"></a>
-<span class="sourceLineNo">152</span>            "hadPostCloseRegionOperation", "hadPostBatchMutateIndispensably" },<a name="line.152"></a>
-<span class="sourceLineNo">153</span>        TEST_TABLE,<a name="line.153"></a>
-<span class="sourceLineNo">154</span>        new Boolean[] { false, false, true, true, true, true, false, true, true, true });<a name="line.154"></a>
-<span class="sourceLineNo">155</span><a name="line.155"></a>
-<span class="sourceLineNo">156</span>      verifyMethodResult(SimpleRegionObserver.class,<a name="line.156"></a>
-<span class="sourceLineNo">157</span>        new String[] { "getCtPreOpen", "getCtPostOpen", "getCtPreClose", "getCtPostClose" },<a name="line.157"></a>
-<span class="sourceLineNo">158</span>        tableName, new Integer[] { 1, 1, 0, 0 });<a name="line.158"></a>
+<span class="sourceLineNo">121</span>  @Rule<a name="line.121"></a>
+<span class="sourceLineNo">122</span>  public TestName name = new TestName();<a name="line.122"></a>
+<span class="sourceLineNo">123</span><a name="line.123"></a>
+<span class="sourceLineNo">124</span>  @BeforeClass<a name="line.124"></a>
+<span class="sourceLineNo">125</span>  public static void setupBeforeClass() throws Exception {<a name="line.125"></a>
+<span class="sourceLineNo">126</span>    // set configure to indicate which cp should be loaded<a name="line.126"></a>
+<span class="sourceLineNo">127</span>    Configuration conf = util.getConfiguration();<a name="line.127"></a>
+<span class="sourceLineNo">128</span>    conf.setBoolean("hbase.master.distributed.log.replay", true);<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    conf.setStrings(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY,<a name="line.129"></a>
+<span class="sourceLineNo">130</span>      SimpleRegionObserver.class.getName());<a name="line.130"></a>
+<span class="sourceLineNo">131</span><a name="line.131"></a>
+<span class="sourceLineNo">132</span>    util.startMiniCluster();<a name="line.132"></a>
+<span class="sourceLineNo">133</span>    cluster = util.getMiniHBaseCluster();<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>  @AfterClass<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  public static void tearDownAfterClass() throws Exception {<a name="line.137"></a>
+<span class="sourceLineNo">138</span>    util.shutdownMiniCluster();<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>  @Test<a name="line.141"></a>
+<span class="sourceLineNo">142</span>  public void testRegionObserver() throws IOException {<a name="line.142"></a>
+<span class="sourceLineNo">143</span>    final TableName tableName = TableName.valueOf(TEST_TABLE.getNameAsString() + "." + name.getMethodName());<a name="line.143"></a>
+<span class="sourceLineNo">144</span>    // recreate table every time in order to reset the status of the<a name="line.144"></a>
+<span class="sourceLineNo">145</span>    // coprocessor.<a name="line.145"></a>
+<span class="sourceLineNo">146</span>    Table table = util.createTable(tableName, new byte[][] { A, B, C });<a name="line.146"></a>
+<span class="sourceLineNo">147</span>    try {<a name="line.147"></a>
+<span class="sourceLineNo">148</span>      verifyMethodResult(SimpleRegionObserver.class,<a name="line.148"></a>
+<span class="sourceLineNo">149</span>        new String[] { "hadPreGet", "hadPostGet", "hadPrePut", "hadPostPut", "hadDelete",<a name="line.149"></a>
+<span class="sourceLineNo">150</span>            "hadPostStartRegionOperation", "hadPostCloseRegionOperation",<a name="line.150"></a>
+<span class="sourceLineNo">151</span>            "hadPostBatchMutateIndispensably" },<a name="line.151"></a>
+<span class="sourceLineNo">152</span>        tableName, new Boolean[] { false, false, false, false, false, false, false, false });<a name="line.152"></a>
+<span class="sourceLineNo">153</span><a name="line.153"></a>
+<span class="sourceLineNo">154</span>      Put put = new Put(ROW);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>      put.addColumn(A, A, A);<a name="line.155"></a>
+<span class="sourceLineNo">156</span>      put.addColumn(B, B, B);<a name="line.156"></a>
+<span class="sourceLineNo">157</span>      put.addColumn(C, C, C);<a name="line.157"></a>
+<span class="sourceLineNo">158</span>      table.put(put);<a name="line.158"></a>
 <span class="sourceLineNo">159</span><a name="line.159"></a>
-<span class="sourceLineNo">160</span>      Get get = new Get(ROW);<a name="line.160"></a>
-<span class="sourceLineNo">161</span>      get.addColumn(A, A);<a name="line.161"></a>
-<span class="sourceLineNo">162</span>      get.addColumn(B, B);<a name="line.162"></a>
-<span class="sourceLineNo">163</span>      get.addColumn(C, C);<a name="line.163"></a>
-<span class="sourceLineNo">164</span>      table.get(get);<a name="line.164"></a>
-<span class="sourceLineNo">165</span><a name="line.165"></a>
-<span class="sourceLineNo">166</span>      verifyMethodResult(SimpleRegionObserver.class,<a name="line.166"></a>
-<span class="sourceLineNo">167</span>        new String[] { "hadPreGet", "hadPostGet", "hadPrePut", "hadPostPut", "hadDelete",<a name="line.167"></a>
-<span class="sourceLineNo">168</span>            "hadPrePreparedDeleteTS" },<a name="line.168"></a>
-<span class="sourceLineNo">169</span>        tableName, new Boolean[] { true, true, true, true, false, false });<a name="line.169"></a>
+<span class="sourceLineNo">160</span>      verifyMethodResult(SimpleRegionObserver.class,<a name="line.160"></a>
+<span class="sourceLineNo">161</span>        new String[] { "hadPreGet", "hadPostGet", "hadPrePut", "hadPostPut", "hadPreBatchMutate",<a name="line.161"></a>
+<span class="sourceLineNo">162</span>            "hadPostBatchMutate", "hadDelete", "hadPostStartRegionOperation",<a name="line.162"></a>
+<span class="sourceLineNo">163</span>            "hadPostCloseRegionOperation", "hadPostBatchMutateIndispensably" },<a name="line.163"></a>
+<span class="sourceLineNo">164</span>        TEST_TABLE,<a name="line.164"></a>
+<span class="sourceLineNo">165</span>        new Boolean[] { false, false, true, true, true, true, false, true, true, true });<a name="line.165"></a>
+<span class="sourceLineNo">166</span><a name="line.166"></a>
+<span class="sourceLineNo">167</span>      verifyMethodResult(SimpleRegionObserver.class,<a name="line.167"></a>
+<span class="sourceLineNo">168</span>        new String[] { "getCtPreOpen", "getCtPostOpen", "getCtPreClose", "getCtPostClose" },<a name="line.168"></a>
+<span class="sourceLineNo">169</span>        tableName, new Integer[] { 1, 1, 0, 0 });<a name="line.169"></a>
 <span class="sourceLineNo">170</span><a name="line.170"></a>
-<span class="sourceLineNo">171</span>      Delete delete = new Delete(ROW);<a name="line.171"></a>
-<span class="sourceLineNo">172</span>      delete.addColumn(A, A);<a name="line.172"></a>
-<span class="sourceLineNo">173</span>      delete.addColumn(B, B);<a name="line.173"></a>
-<span class="sourceLineNo">174</span>      delete.addColumn(C, C);<a name="line.174"></a>
-<span class="sourceLineNo">175</span>      table.delete(delete);<a name="line.175"></a>
+<span class="sourceLineNo">171</span>      Get get = new Get(ROW);<a name="line.171"></a>
+<span class="sourceLineNo">172</span>      get.addColumn(A, A);<a name="line.172"></a>
+<span class="sourceLineNo">173</span>      get.addColumn(B, B);<a name="line.173"></a>
+<span class="sourceLineNo">174</span>      get.addColumn(C, C);<a name="line.174"></a>
+<span class="sourceLineNo">175</span>      table.get(get);<a name="line.175"></a>
 <span class="sourceLineNo">176</span><a name="line.176"></a>
 <span class="sourceLineNo">177</span>      verifyMethodResult(SimpleRegionObserver.class,<a name="line.177"></a>
-<span class="sourceLineNo">178</span>        new String[] { "hadPreGet", "hadPostGet", "hadPrePut", "hadPostPut", "hadPreBatchMutate",<a name="line.178"></a>
-<span class="sourceLineNo">179</span>            "hadPostBatchMutate", "hadDelete", "hadPrePreparedDeleteTS" },<a name="line.179"></a>
-<span class="sourceLineNo">180</span>        tableName, new Boolean[] { true, true, true, true, true, true, true, true });<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    } finally {<a name="line.181"></a>
-<span class="sourceLineNo">182</span>      util.deleteTable(tableName);<a name="line.182"></a>
-<span class="sourceLineNo">183</span>      table.close();<a name="line.183"></a>
-<span class="sourceLineNo">184</span>    }<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    verifyMethodResult(SimpleRegionObserver.class,<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      new String[] { "getCtPreOpen", "getCtPostOpen", "getCtPreClose", "getCtPostClose" },<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      tableName, new Integer[] { 1, 1, 1, 1 });<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>  @Test<a name="line.190"></a>
-<span class="sourceLineNo">191</span>  public void testRowMutation() throws IOException {<a name="line.191"></a>
-<span class="sourceLineNo">192</span>    final TableName tableName = TableName.valueOf(TEST_TABLE.getNameAsString() + "." + name.getMethodName());<a name="line.192"></a>
-<span class="sourceLineNo">193</span>    Table table = util.createTable(tableName, new byte[][] { A, B, C });<a name="line.193"></a>
-<span class="sourceLineNo">194</span>    try {<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      verifyMethodResult(SimpleRegionObserver.class,<a name="line.195"></a>
-<span class="sourceLineNo">196</span>        new String[] { "hadPreGet", "hadPostGet", "hadPrePut", "hadPostPut", "hadDeleted" },<a name="line.196"></a>
-<span class="sourceLineNo">197</span>        tableName, new Boolean[] { false, false, false, false, false });<a name="line.197"></a>
-<span class="sourceLineNo">198</span>      Put put = new Put(ROW);<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      put.addColumn(A, A, A);<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      put.addColumn(B, B, B);<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      put.addColumn(C, C, C);<a name="line.201"></a>
-<span class="sourceLineNo">202</span><a name="line.202"></a>
-<span class="sourceLineNo">203</span>      Delete delete = new Delete(ROW);<a name="line.203"></a>
-<span class="sourceLineNo">204</span>      delete.addColumn(A, A);<a name="line.204"></a>
-<span class="sourceLineNo">205</span>      delete.addColumn(B, B);<a name="line.205"></a>
-<span class="sourceLineNo">206</span>      delete.addColumn(C, C);<a name="line.206"></a>
-<span class="sourceLineNo">207</span><a name="line.207"></a>
-<span class="sourceLineNo">208</span>      RowMutations arm = new RowMutations(ROW);<a name="line.208"></a>
-<span class="sourceLineNo">209</span>      arm.add(put);<a name="line.209"></a>
-<span class="sourceLineNo">210</span>      arm.add(delete);<a name="line.210"></a>
-<span class="sourceLineNo">211</span>      table.mutateRow(arm);<a name="line.211"></a>
-<span class="sourceLineNo">212</span><a name="line.212"></a>
-<span class="sourceLineNo">213</span>      verifyMethodResult(SimpleRegionObserver.class,<a name="line.213"></a>
-<span class="sourceLineNo">214</span>        new String[] { "hadPreGet", "hadPostGet", "hadPrePut", "hadPostPut", "hadDeleted" },<a name="line.214"></a>
-<span class="sourceLineNo">215</span>        tableName, new Boolean[] { false, false, true, true, true });<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    } finally {<a name="line.216"></a>
-<span class="sourceLineNo">217</span>      util.deleteTable(tableName);<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      table.close();<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><a name="line.221"></a>
-<span class="sourceLineNo">222</span>  @Test<a name="line.222"></a>
-<span class="sourceLineNo">223</span>  public void testIncrementHook() throws IOException {<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    final TableName tableName = TableName.valueOf(TEST_TABLE.getNameAsString() + "." + name.getMethodName());<a name="line.224"></a>
-<span class="sourceLineNo">225</span>    Table table = util.createTable(tableName, new byte[][] { A, B, C });<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    try {<a name="line.226"></a>
-<span class="sourceLineNo">227</span>      Increment inc = new Increment(Bytes.toBytes(0));<a name="line.227"></a>
-<span class="sourceLineNo">228</span>      inc.addColumn(A, A, 1);<a name="line.228"></a>
-<span class="sourceLineNo">229</span><a name="line.229"></a>
-<span class="sourceLineNo">230</span>      verifyMethodResult(SimpleRegionObserver.class,<a name="line.230"></a>
-<span class="sourceLineNo">231</span>        new String[] { "hadPreIncrement", "hadPostIncrement", "hadPreIncrementAfterRowLock" },<a name="line.231"></a>
-<span class="sourceLineNo">232</span>        tableName, new Boolean[] { false, false, false });<a name="line.232"></a>
-<span class="sourceLineNo">233</span><a name="line.233"></a>
-<span class="sourceLineNo">234</span>      table.increment(inc);<a name="line.234"></a>
-<span class="sourceLineNo">235</span><a name="line.235"></a>
-<span class="sourceLineNo">236</span>      verifyMethodResult(SimpleRegionObserver.class,<a name="line.236"></a>
-<span class="sourceLineNo">237</span>        new String[] { "hadPreIncrement", "hadPostIncrement", "hadPreIncrementAfterRowLock" },<a name="line.237"></a>
-<span class="sourceLineNo">238</span>        tableName, new Boolean[] { true, true, true });<a name="line.238"></a>
-<span class="sourceLineNo">239</span>    } finally {<a name="line.239"></a>
-<span class="sourceLineNo">240</span>      util.deleteTable(tableName);<a name="line.240"></a>
-<span class="sourceLineNo">241</span>      table.close();<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">178</span>        new String[] { "hadPreGet", "hadPostGet", "hadPrePut", "hadPostPut", "hadDelete",<a name="line.178"></a>
+<span class="sourceLineNo">179</span>            "hadPrePreparedDeleteTS" },<a name="line.179"></a>
+<span class="sourceLineNo">180</span>        tableName, new Boolean[] { true, true, true, true, false, false });<a name="line.180"></a>
+<span class="sourceLineNo">181</span><a name="line.181"></a>
+<span class="sourceLineNo">182</span>      Delete delete = new Delete(ROW);<a name="line.182"></a>
+<span class="sourceLineNo">183</span>      delete.addColumn(A, A);<a name="line.183"></a>
+<span class="sourceLineNo">184</span>      delete.addColumn(B, B);<a name="line.184"></a>
+<span class="sourceLineNo">185</span>      delete.addColumn(C, C);<a name="line.185"></a>
+<span class="sourceLineNo">186</span>      table.delete(delete);<a name="line.186"></a>
+<span class="sourceLineNo">187</span><a name="line.187"></a>
+<span class="sourceLineNo">188</span>      verifyMethodResult(SimpleRegionObserver.class,<a name="line.188"></a>
+<span class="sourceLineNo">189</span>        new String[] { "hadPreGet", "hadPostGet", "hadPrePut", "hadPostPut", "hadPreBatchMutate",<a name="line.189"></a>
+<span class="sourceLineNo">190</span>            "hadPostBatchMutate", "hadDelete", "hadPrePreparedDeleteTS" },<a name="line.190"></a>
+<span class="sourceLineNo">191</span>        tableName, new Boolean[] { true, true, true, true, true, true, true, true });<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    } finally {<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      util.deleteTable(tableName);<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      table.close();<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    }<a name="line.195"></a>
+<span class="sourceLineNo">196</span>    verifyMethodResult(SimpleRegionObserver.class,<a name="line.196"></a>
+<span class="sourceLineNo">197</span>      new String[] { "getCtPreOpen", "getCtPostOpen", "getCtPreClose", "getCtPostClose" },<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      tableName, new Integer[] { 1, 1, 1, 1 });<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>  @Test<a name="line.201"></a>
+<span class="sourceLineNo">202</span>  public void testRowMutation() throws IOException {<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    final TableName tableName = TableName.valueOf(TEST_TABLE.getNameAsString() + "." + name.getMethodName());<a name="line.203"></a>
+<span class="sourceLineNo">204</span>    Table table = util.createTable(tableName, new byte[][] { A, B, C });<a name="line.204"></a>
+<span class="sourceLineNo">205</span>    try {<a name="line.205"></a>
+<span class="sourceLineNo">206</span>      verifyMethodResult(SimpleRegionObserver.class,<a name="line.206"></a>
+<span class="sourceLineNo">207</span>        new String[] { "hadPreGet", "hadPostGet", "hadPrePut", "hadPostPut", "hadDeleted" },<a name="line.207"></a>
+<span class="sourceLineNo">208</span>        tableName, new Boolean[] { false, false, false, false, false });<a name="line.208"></a>
+<span class="sourceLineNo">209</span>      Put put = new Put(ROW);<a name="line.209"></a>
+<span class="sourceLineNo">210</span>      put.addColumn(A, A, A);<a name="line.210"></a>
+<span class="sourceLineNo">211</span>      put.addColumn(B, B, B);<a name="line.211"></a>
+<span class="sourceLineNo">212</span>      put.addColumn(C, C, C);<a name="line.212"></a>
+<span class="sourceLineNo">213</span><a name="line.213"></a>
+<span class="sourceLineNo">214</span>      Delete delete = new Delete(ROW);<a name="line.214"></a>
+<span class="sourceLineNo">215</span>      delete.addColumn(A, A);<a name="line.215"></a>
+<span class="sourceLineNo">216</span>      delete.addColumn(B, B);<a name="line.216"></a>
+<span class="sourceLineNo">217</span>      delete.addColumn(C, C);<a name="line.217"></a>
+<span class="sourceLineNo">218</span><a name="line.218"></a>
+<span class="sourceLineNo">219</span>      RowMutations arm = new RowMutations(ROW);<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      arm.add(put);<a name="line.220"></a>
+<span class="sourceLineNo">221</span>      arm.add(delete);<a name="line.221"></a>
+<span class="sourceLineNo">222</span>      table.mutateRow(arm);<a name="line.222"></a>
+<span class="sourceLineNo">223</span><a name="line.223"></a>
+<span class="sourceLineNo">224</span>      verifyMethodResult(SimpleRegionObserver.class,<a name="line.224"></a>
+<span class="sourceLineNo">225</span>        new String[] { "hadPreGet", "hadPostGet", "hadPrePut", "hadPostPut", "hadDeleted" },<a name="line.225"></a>
+<span class="sourceLineNo">226</span>        tableName, new Boolean[] { false, false, true, true, true });<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    } finally {<a name="line.227"></a>
+<span class="sourceLineNo">228</span>      util.deleteTable(tableName);<a name="line.228"></a>
+<span class="sourceLineNo">229</span>      table.close();<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><a name="line.232"></a>
+<span class="sourceLineNo">233</span>  @Test<a name="line.233"></a>
+<span class="sourceLineNo">234</span>  public void testIncrementHook() throws IOException {<a name="line.234"></a>
+<span class="sourceLineNo">235</span>    final TableName tableName = TableName.valueOf(TEST_TABLE.getNameAsString() + "." + name.getMethodName());<a name="line.235"></a>
+<span class="sourceLineNo">236</span>    Table table = util.createTable(tableName, new byte[][] { A, B, C });<a name="line.236"></a>
+<span class="sourceLineNo">237</span>    try {<a name="line.237"></a>
+<span class="sourceLineNo">238</span>      Increment inc = new Increment(Bytes.toBytes(0));<a name="line.238"></a>
+<span class="sourceLineNo">239</span>      inc.addColumn(A, A, 1);<a name="line.239"></a>
+<span class="sourceLineNo">240</span><a name="line.240"></a>
+<span class="sourceLineNo">241</span>      verifyMethodResult(SimpleRegionObserver.class,<a name="line.241"></a>
+<span class="sourceLineNo">242</span>        new String[] { "hadPreIncrement", "hadPostIncrement", "hadPreIncrementAfterRowLock" },<a name="line.242"></a>
+<span class="sourceLineNo">243</span>        tableName, new Boolean[] { false, false, false });<a name="line.243"></a>
 <span class="sourceLineNo">244</span><a name="line.244"></a>
-<span class="sourceLineNo">245</span>  @Test<a name="line.245"></a>
-<span class="sourceLineNo">246</span>  public void testCheckAndPutHooks() throws IOException {<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    final TableName tableName = TableName.valueOf(TEST_TABLE.getNameAsString() + "." + name.getMethodName());<a name="line.247"></a>
-<span class="sourceLineNo">248</span>    try (Table table = util.createTable(tableName, new byte[][] { A, B, C })) {<a name="line.248"></a>
-<span class="sourceLineNo">249</span>      Put p = new Put(Bytes.toBytes(0));<a name="line.249"></a>
-<span class="sourceLineNo">250</span>      p.addColumn(A, A, A);<a name="line.250"></a>
-<span class="sourceLineNo">251</span>      table.put(p);<a name="line.251"></a>
-<span class="sourceLineNo">252</span>      p = new Put(Bytes.toBytes(0));<a name="line.252"></a>
-<span class="sourceLineNo">253</span>      p.addColumn(A, A, A);<a name="line.253"></a>
-<span class="sourceLineNo">254</span>      verifyMethodResult(SimpleRegionObserver.class,<a name="line.254"></a>
-<span class="sourceLineNo">255</span>        new String[] { "hadPreCheckAndPut", "hadPreCheckAndPutAfterRowLock", "hadPostCheckAndPut" },<a name="line.255"></a>
-<span class="sourceLineNo">256</span>        tableName, new Boolean[] { false, false, false });<a name="line.256"></a>
-<span class="sourceLineNo">257</span>      table.checkAndMutate(Bytes.toBytes(0), A).qualifier(A).ifEquals(A).thenPut(p);<a name="line.257"></a>
-<span class="sourceLineNo">258</span>      verifyMethodResult(SimpleRegionObserver.class,<a name="line.258"></a>
-<span class="sourceLineNo">259</span>        new String[] { "hadPreCheckAndPut", "hadPreCheckAndPutAfterRowLock", "hadPostCheckAndPut" },<a name="line.259"></a>
-<span class="sourceLineNo">260</span>        tableName, new Boolean[] { true, true, true });<a name="line.260"></a>
-<span class="sourceLineNo">261</span>    } finally {<a name="line.261"></a>
-<span class="sourceLineNo">262</span>      util.deleteTable(tableName);<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>  @Test<a name="line.266"></a>
-<span class="sourceLineNo">267</span>  public void testCheckAndDeleteHooks() throws IOException {<a name="line.267"></a>
-<span class="sourceLineNo">268</span>    final TableName tableName = TableName.valueOf(TEST_TABLE.getNameAsString() + "." + name.getMethodName());<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    Table table = util.createTable(tableName, new byte[][] { A, B, C });<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    try {<a name="line.270"></a>
-<span class="sourceLineNo">271</span>      Put p = new Put(Bytes.toBytes(0));<a name="line.271"></a>
-<span class="sourceLineNo">272</span>      p.addColumn(A, A, A);<a name="line.272"></a>
-<span class="sourceLineNo">273</span>      table.put(p);<a name="line.273"></a>
-<span class="sourceLineNo">274</span>      Delete d = new Delete(Bytes.toBytes(0));<a name="line.274"></a>
-<span class="sourceLineNo">275</span>      table.delete(d);<a name="line.275"></a>
-<span class="sourceLineNo">276</span>      verifyMethodResult(<a name="line.276"></a>
-<span class="sourceLineNo">277</span>        SimpleRegionObserver.class, new String[] { "hadPreCheckAndDelete",<a name="line.277"></a>
-<span class="sourceLineNo">278</span>            "hadPreCheckAndDeleteAfterRowLock", "hadPostCheckAndDelete" },<a name="line.278"></a>
-<span class="sourceLineNo">279</span>        tableName, new Boolean[] { false, false, false });<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      table.checkAndMutate(Bytes.toBytes(0), A).qualifier(A).ifEquals(A).thenDelete(d);<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      verifyMethodResult(<a name="line.281"></a>
-<span class="sourceLineNo">282</span>        SimpleRegionObserver.class, new String[] { "hadPreCheckAndDelete",<a name="line.282"></a>
-<span class="sourceLineNo">283</span>            "hadPreCheckAndDeleteAfterRowLock", "hadPostCheckAndDelete" },<a name="line.283"></a>
-<span class="sourceLineNo">284</span>        tableName, new Boolean[] { true, true, true });<a name="line.284"></a>
-<span class="sourceLineNo">285</span>    } finally {<a name="line.285"></a>
-<span class="sourceLineNo">286</span>      util.deleteTable(tableName);<a name="line.286"></a>
-<span class="sourceLineNo">287</span>      table.close();<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    }<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>  @Test<a name="line.291"></a>
-<span class="sourceLineNo">292</span>  public void testAppendHook() throws IOException {<a name="line.292"></a>
-<span class="sourceLineNo">293</span>    final TableName tableName = TableName.valueOf(TEST_TABLE.getNameAsString() + "." + name.getMethodName());<a name="line.293"></a>
-<span class="sourceLineNo">294</span>    Table table = util.createTable(tableName, new byte[][] { A, B, C });<a name="line.294"></a>
-<span class="sourceLineNo">295</span>    try {<a name="line.295"></a>
-<span class="sourceLineNo">296</span>      Append app = new Append(Bytes.toBytes(0));<a name="line.296"></a>
-<span class="sourceLineNo">297</span>      app.addColumn(A, A, A);<a name="line.297"></a>
-<span class="sourceLineNo">298</span><a name="line.298"></a>
-<span class="sourceLineNo">299</span>      verifyMethodResult(SimpleRegionObserver.class,<a name="line.299"></a>
-<span class="sourceLineNo">300</span>        new String[] { "hadPreAppend", "hadPostAppend", "hadPreAppendAfterRowLock" }, tableName,<a name="line.300"></a>
-<span class="sourceLineNo">301</span>        new Boolean[] { false, false, false });<a name="line.301"></a>
-<span class="sourceLineNo">302</span><a name="line.302"></a>
-<span class="sourceLineNo">303</span>      table.append(app);<a name="line.303"></a>
-<span class="sourceLineNo">304</span><a name="line.304"></a>
-<span class="sourceLineNo">305</span>      verifyMethodResult(SimpleRegionObserver.class,<a name="line.305"></a>
-<span class="sourceLineNo">306</span>        new String[] { "hadPreAppend", "hadPostAppend", "hadPreAppendAfterRowLock" }, tableName,<a name="line.306"></a>
-<span class="sourceLineNo">307</span>        new Boolean[] { true, true, true });<a name="line.307"></a>
-<span class="sourceLineNo">308</span>    } finally {<a name="line.308"></a>
-<span class="sourceLineNo">309</span>      util.deleteTable(tableName);<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      table.close();<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">245</span>      table.increment(inc);<a name="line.245"></a>
+<span class="sourceLineNo">246</span><a name="line.246"></a>
+<span class="sourceLineNo">247</span>      verifyMethodResult(SimpleRegionObserver.class,<a name="line.247"></a>
+<span class="sourceLineNo">248</span>        new String[] { "hadPreIncrement", "hadPostIncrement", "hadPreIncrementAfterRowLock" },<a name="line.248"></a>
+<span class="sourceLineNo">249</span>        tableName, new Boolean[] { true, true, true });<a name="line.249"></a>
+<span class="sourceLineNo">250</span>    } finally {<a name="line.250"></a>
+<span class="sourceLineNo">251</span>      util.deleteTable(tableName);<a name="line.251"></a>
+<span class="sourceLineNo">252</span>      table.close();<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>  @Test<a name="line.256"></a>
+<span class="sourceLineNo">257</span>  public void testCheckAndPutHooks() throws IOException {<a name="line.257"></a>
+<span class="sourceLineNo">258</span>    final TableName tableName = TableName.valueOf(TEST_TABLE.getNameAsString() + "." + name.getMethodName());<a name="line.258"></a>
+<span class="sourceLineNo">259</span>    try (Table table = util.createTable(tableName, new byte[][] { A, B, C })) {<a name="line.259"></a>
+<span class="sourceLineNo">260</span>      Put p = new Put(Bytes.toBytes(0));<a name="line.260"></a>
+<span class="sourceLineNo">261</span>      p.addColumn(A, A, A);<a name="line.261"></a>
+<span class="sourceLineNo">262</span>      table.put(p);<a name="line.262"></a>
+<span class="sourceLineNo">263</span>      p = new Put(Bytes.toBytes(0));<a name="line.263"></a>
+<span class="sourceLineNo">264</span>      p.addColumn(A, A, A);<a name="line.264"></a>
+<span class="sourceLineNo">265</span>      verifyMethodResult(SimpleRegionObserver.class,<a name="line.265"></a>
+<span class="sourceLineNo">266</span>        new String[] { "hadPreCheckAndPut", "hadPreCheckAndPutAfterRowLock", "hadPostCheckAndPut" },<a name="line.266"></a>
+<span class="sourceLineNo">267</span>        tableName, new Boolean[] { false, false, false });<a name="line.267"></a>
+<span class="sourceLineNo">268</span>      table.checkAndMutate(Bytes.toBytes(0), A).qualifier(A).ifEquals(A).thenPut(p);<a name="line.268"></a>
+<span class="sourceLineNo">269</span>      verifyMethodResult(SimpleRegionObserver.class,<a name="line.269"></a>
+<span class="sourceLineNo">270</span>        new String[] { "hadPreCheckAndPut", "hadPreCheckAndPutAfterRowLock", "hadPostCheckAndPut" },<a name="line.270"></a>
+<span class="sourceLineNo">271</span>        tableName, new Boolean[] { true, true, true });<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    } finally {<a name="line.272"></a>
+<span class="sourceLineNo">273</span>      util.deleteTable(tableName);<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    }<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>  @Test<a name="line.277"></a>
+<span class="sourceLineNo">278</span>  public void testCheckAndDeleteHooks() throws IOException {<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    final TableName tableName = TableName.valueOf(TEST_TABLE.getNameAsString() + "." + name.getMethodName());<a name="line.279"></a>
+<span class="sourceLineNo">280</span>    Table table = util.createTable(tableName, new byte[][] { A, B, C });<a name="line.280"></a>
+<span class="sourceLineNo">281</span>    try {<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      Put p = new Put(Bytes.toBytes(0));<a name="line.282"></a>
+<span class="sourceLineNo">283</span>      p.addColumn(A, A, A);<a name="line.283"></a>
+<span class="sourceLineNo">284</span>      table.put(p);<a name="line.284"></a>
+<span class="sourceLineNo">285</span>      Delete d = new Delete(Bytes.toBytes(0));<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      table.delete(d);<a name="line.286"></a>
+<span class="sourceLineNo">287</span>      verifyMethodResult(<a name="line.287"></a>
+<span class="sourceLineNo">288</span>        SimpleRegionObserver.class, new String[] { "hadPreCheckAndDelete",<a name="line.288"></a>
+<span class="sourceLineNo">289</span>            "hadPreCheckAndDeleteAfterRowLock", "hadPostCheckAndDelete" },<a name="line.289"></a>
+<span class="sourceLineNo">290</span>        tableName, new Boolean[] { false, false, false });<a name="line.290"></a>
+<span class="sourceLineNo">291</span>      table.checkAndMutate(Bytes.toBytes(0), A).qualifier(A).ifEquals(A).thenDelete(d);<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      verifyMethodResult(<a name="line.292"></a>
+<span class="sourceLineNo">293</span>        SimpleRegionObserver.class, new String[] { "hadPreCheckAndDelete",<a name="line.293"></a>
+<span class="sourceLineNo">294</span>            "hadPreCheckAndDeleteAfterRowLock", "hadPostCheckAndDelete" },<a name="line.294"></a>
+<span class="sourceLineNo">295</span>        tableName, new Boolean[] { true, true, true });<a name="line.295"></a>
+<span class="sourceLineNo">296</span>    } finally {<a name="line.296"></a>
+<span class="sourceLineNo">297</span>      util.deleteTable(tableName);<a name="line.297"></a>
+<span class="sourceLineNo">298</span>      table.close();<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><a name="line.301"></a>
+<span class="sourceLineNo">302</span>  @Test<a name="line.302"></a>
+<span class="sourceLineNo">303</span>  public void testAppendHook() throws IOException {<a name="line.303"></a>
+<span class="sourceLineNo">304</span>    final TableName tableName = TableName.valueOf(TEST_TABLE.getNameAsString() + "." + name.getMethodName());<a name="line.304"></a>
+<span class="sourceLineNo">305</span>    Table table = util.createTable(tableName, new byte[][] { A, B, C });<a name="line.305"></a>
+<span class="sourceLineNo">306</span>    try {<a name="line.306"></a>
+<span class="sourceLineNo">307</span>      Append app = new Append(Bytes.toBytes(0));<a name="line.307"></a>
+<span class="sourceLineNo">308</span>      app.addColumn(A, A, A);<a name="line.308"></a>
+<span class="sourceLineNo">309</span><a name="line.309"></a>
+<span class="sourceLineNo">310</span>      verifyMethodResult(SimpleRegionObserver.class,<a name="line.310"></a>
+<span class="sourceLineNo">311</span>        new String[] { "hadPreAppend", "hadPostAppend", "hadPreAppendAfterRowLock" }, tableName,<a name="line.311"></a>
+<span class="sourceLineNo">312</span>        new Boolean[] { false, false, false });<a name="line.312"></a>
 <span class="sourceLineNo">313</span><a name="line.313"></a>
-<span class="sourceLineNo">314</span>  @Test<a name="line.314"></a>
-<span class="sourceLineNo">315</span>  // HBase-3583<a name="line.315"></a>
-<span class="sourceLineNo">316</span>  public void testHBase3583() throws IOException {<a name="line.316"></a>
-<span class="sourceLineNo">317</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.317"></a>
-<span class="sourceLineNo">318</span>    util.createTable(tableName, new byte[][] { A, B, C });<a name="line.318"></a>
-<span class="sourceLineNo">319</span>    util.waitUntilAllRegionsAssigned(tableName);<a name="line.319"></a>
-<span class="sourceLineNo">320</span><a name="line.320"></a>
-<span class="sourceLineNo">321</span>    verifyMethodResult(SimpleRegionObserver.class,<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      new String[] { "hadPreGet", "hadPostGet", "wasScannerNextCalled", "wasScannerCloseCalled" },<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      tableName, new Boolean[] { false, false, false, false });<a name="line.323"></a>
+<span class="sourceLineNo">314</span>      table.append(app);<a name="line.314"></a>
+<span class="sourceLineNo">315</span><a name="line.315"></a>
+<span class="sourceLineNo">316</span>      verifyMethodResult(SimpleRegionObserver.class,<a name="line.316"></a>
+<span class="sourceLineNo">317</span>        new String[] { "hadPreAppend", "hadPostAppend", "hadPreAppendAfterRowLock" }, tableName,<a name="line.317"></a>
+<span class="sourceLineNo">318</span>        new Boolean[] { true, true, true });<a name="line.318"></a>
+<span class="sourceLineNo">319</span>    } finally {<a name="line.319"></a>
+<span class="sourceLineNo">320</span>      util.deleteTable(tableName);<a name="line.320"></a>
+<span class="sourceLineNo">321</span>      table.close();<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><a name="line.324"></a>
-<span class="sourceLineNo">325</span>    Table table = util.getConnection().getTable(tableName);<a name="line.325"></a>
-<span class="sourceLineNo">326</span>    Put put = new Put(ROW);<a name="line.326"></a>
-<span class="sourceLineNo">327</span>    put.addColumn(A, A, A);<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    table.put(put);<a name="line.328"></a>
-<span class="sourceLineNo">329</span><a name="line.329"></a>
-<span class="sourceLineNo">330</span>    Get get = new Get(ROW);<a name="line.330"></a>
-<span class="sourceLineNo">331</span>    get.addColumn(A, A);<a name="line.331"></a>
-<span class="sourceLineNo">332</span>    table.get(get);<a name="line.332"></a>
-<span class="sourceLineNo">333</span><a name="line.333"></a>
-<span class="sourceLineNo">334</span>    // verify that scannerNext and scannerClose upcalls won't be invoked<a name="line.334"></a>
-<span class="sourceLineNo">335</span>    // when we perform get().<a name="line.335"></a>
-<span class="sourceLineNo">336</span>    verifyMethodResult(SimpleRegionObserver.class,<a name="line.336"></a>
-<span class="sourceLineNo">337</span>      new String[] { "hadPreGet", "hadPostGet", "wasScannerNextCalled", "wasScannerCloseCalled" },<a name="line.337"></a>
-<span class="sourceLineNo">338</span>      tableName, new Boolean[] { true, true, false, false });<a name="line.338"></a>
-<span class="sourceLineNo">339</span><a name="line.339"></a>
-<span class="sourceLineNo">340</span>    Scan s = new Scan();<a name="line.340"></a>
-<span class="sourceLineNo">341</span>    ResultScanner scanner = table.getScanner(s);<a name="line.341"></a>
-<span class="sourceLineNo">342</span>    try {<a name="line.342"></a>
-<span class="sourceLineNo">343</span>      for (Result rr = scanner.next(); rr != null; rr = scanner.next()) {<a name="line.343"></a>
-<span class="sourceLineNo">344</span>      }<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    } finally {<a name="line.345"></a>
-<span class="sourceLineNo">346</span>      scanner.close();<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>    // now scanner hooks should be invoked.<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    verifyMethodResult(SimpleRegionObserver.class,<a name="line.350"></a>
-<span class="sourceLineNo">351</span>      new String[] { "wasScannerNextCalled", "wasScannerCloseCalled" }, tableName,<a name="line.351"></a>
-<span class="sourceLineNo">352</span>      new Boolean[] { true, true });<a name="line.352"></a>
-<span class="sourceLineNo">353</span>    util.deleteTable(tableName);<a name="line.353"></a>
-<span class="sourceLineNo">354</span>    table.close();<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>  @Test<a name="line.357"></a>
-<span class="sourceLineNo">358</span>  public void testHBASE14489() throws IOException {<a name="line.358"></a>
-<span class="sourceLineNo">359</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.359"></a>
-<span class="sourceLineNo">360</span>    Table table = util.createTable(tableName, new byte[][] { A });<a name="line.360"></a>
-<span class="sourceLineNo">361</span>    Put put = new Put(ROW);<a name="line.361"></a>
-<span class="sourceLineNo">362</span>    put.addColumn(A, A, A);<a name="line.362"></a>
-<span class="sourceLineNo">363</span>    table.put(put);<a name="line.363"></a>
-<span class="sourceLineNo">364</span><a name="line.364"></a>
-<span class="sourceLineNo">365</span>    Scan s = new Scan();<a name="line.365"></a>
-<span class="sourceLineNo">366</span>    s.setFilter(new FilterAllFilter());<a name="line.366"></a>
-<span class="sourceLineNo">367</span>    ResultScanner scanner = table.getScanner(s);<a name="line.367"></a>
-<span class="sourceLineNo">368</span>    try {<a name="line.368"></a>
-<span class="sourceLineNo">369</span>      for (Result rr = scanner.next(); rr != null; rr = scanner.next()) {<a name="line.369"></a>
-<span class="sourceLineNo">370</span>      }<a name="line.370"></a>
-<span class="sourceLineNo">371</span>    } finally {<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      scanner.close();<a name="line.372"></a>
-<span class="sourceLineNo">373</span>    }<a name="line.373"></a>
-<span class="sourceLineNo">374</span>    verifyMethodResult(SimpleRegionObserver.class, new String[] { "wasScannerFilterRowCalled" },<a name="line.374"></a>
-<span class="sourceLineNo">375</span>      tableName, new Boolean[] { true });<a name="line.375"></a>
-<span class="sourceLineNo">376</span>    util.deleteTable(tableName);<a name="line.376"></a>
-<span class="sourceLineNo">377</span>    table.close();<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>  @Test<a name="line.381"></a>
-<span class="sourceLineNo">382</span>  // HBase-3758<a name="line.382"></a>
-<span class="sourceLineNo">383</span>  public void testHBase3758() throws IOException {<a name="line.383"></a>
-<span class="sourceLineNo">384</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.384"></a>
-<span class="sourceLineNo">385</span>    util.createTable(tableName, new byte[][] { A, B, C });<a name="line.385"></a>
-<span class="sourceLineNo">386</span><a name="line.386"></a>
-<span class="sourceLineNo">387</span>    verifyMethodResult(SimpleRegionObserver.class,<a name="line.387"></a>
-<span class="sourceLineNo">388</span>      new String[] { "hadDeleted", "wasScannerOpenCalled" }, tableName,<a name="line.388"></a>
-<span class="sourceLineNo">389</span>      new Boolean[] { false, false });<a name="line.389"></a>
-<span class="sourceLineNo">390</span><a name="line.390"></a>
-<span class="sourceLineNo">391</span>    Table table = util.getConnection().getTable(tableName);<a name="line.391"></a>
-<span class="sourceLineNo">392</span>    Put put = new Put(ROW);<a name="line.392"></a>
-<span class="sourceLineNo">393</span>    put.addColumn(A, A, A);<a name="line.393"></a>
-<span class="sourceLineNo">394</span>    table.put(put);<a name="line.394"></a>
-<span class="sourceLineNo">395</span><a name="line.395"></a>
-<span class="sourceLineNo">396</span>    Delete delete = new Delete(ROW);<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    table.delete(delete);<a name="line.397"></a>
-<span class="sourceLineNo">398</span><a name="line.398"></a>
-<span class="sourceLineNo">399</span>    verifyMethodResult(SimpleRegionObserver.class,<a name="line.399"></a>
-<span class="sourceLineNo">400</span>      new String[] { "hadDeleted", "wasScannerOpenCalled" }, tableName,<a name="line.400"></a>
-<span class="sourceLineNo">401</span>      new Boolean[] { true, false });<a name="line.401"></a>
-<span class="sourceLineNo">402</span><a name="line.402"></a>
-<span class="sourceLineNo">403</span>    Scan s = new Scan();<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    ResultScanner scanner = table.getScanner(s);<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    try {<a name="line.405"></a>
-<span class="sourceLineNo">406</span>      for (Result rr = scanner.next(); rr != null; rr = scanner.next()) {<a name="line.406"></a>
-<span class="sourceLineNo">407</span>      }<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    } finally {<a name="line.408"></a>
-<span class="sourceLineNo">409</span>      scanner.close();<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>    // now scanner hooks should be invoked.<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    verifyMethodResult(SimpleRegionObserver.class, new String[] { "wasScannerOpenCalled" },<a name="line.413"></a>
-<span class="sourceLineNo">414</span>      tableName, new Boolean[] { true });<a name="line.414"></a>
-<span class="sourceLineNo">415</span>    util.deleteTable(tableName);<a name="line.415"></a>
-<span class="sourceLineNo">416</span>    table.close();<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>  /* Overrides compaction to only output rows with keys that are even numbers */<a name="line.419"></a>
-<span class="sourceLineNo">420</span>  public static class EvenOnlyCompactor implements RegionCoprocessor, RegionObserver {<a name="line.420"></a>
-<span class="sourceLineNo">421</span>    long lastCompaction;<a name="line.421"></a>
-<span class="sourceLineNo">422</span>    long lastFlush;<a name="line.422"></a>
-<span class="sourceLineNo">423</span><a name="line.423"></a>
-<span class="sourceLineNo">424</span>    @Override<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    public Optional&lt;RegionObserver&gt; getRegionObserver() {<a name="line.425"></a>
-<span class="sourceLineNo">426</span>      return Optional.of(this);<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>    @Override<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    public InternalScanner preCompact(ObserverContext&lt;RegionCoprocessorEnvironment&gt; e, Store store,<a name="line.430"></a>
-<span class="sourceLineNo">431</span>        InternalScanner scanner, ScanType scanType, CompactionLifeCycleTracker tracker,<a name="line.431"></a>
-<span class="sourceLineNo">432</span>        CompactionRequest request) {<a name="line.432"></a>
-<span class="sourceLineNo">433</span>      return new InternalScanner() {<a name="line.433"></a>
+<span class="sourceLineNo">325</span>  @Test<a name="line.325"></a>
+<span class="sourceLineNo">326</span>  // HBase-3583<a name="line.326"></a>
+<span class="sourceLineNo">327</span>  public void testHBase3583() throws IOException {<a name="line.327"></a>
+<span class="sourceLineNo">328</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    util.createTable(tableName, new byte[][] { A, B, C });<a name="line.329"></a>
+<span class="sourceLineNo">330</span>    util.waitUntilAllRegionsAssigned(tableName);<a name="line.330"></a>
+<span class="sourceLineNo">331</span><a name="line.331"></a>
+<span class="sourceLineNo">332</span>    verifyMethodResult(SimpleRegionObserver.class,<a name="line.332"></a>
+<span class="sourceLineNo">333</span>      new String[] { "hadPreGet", "hadPostGet", "wasScannerNextCalled", "wasScannerCloseCalled" },<a name="line.333"></a>
+<span class="sourceLineNo">334</span>      tableName, new Boolean[] { false, false, false, false });<a name="line.334"></a>
+<span class="sourceLineNo">335</span><a name="line.335"></a>
+<span class="sourceLineNo">336</span>    Table table = util.getConnection().getTable(tableName);<a name="line.336"></a>
+<span class="sourceLineNo">337</span>    Put put = new Put(ROW);<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    put.addColumn(A, A, A);<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    table.put(put);<a name="line.339"></a>
+<span class="sourceLineNo">340</span><a name="line.340"></a>
+<span class="sourceLineNo">341</span>    Get get = new Get(ROW);<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    get.addColumn(A, A);<a name="line.342"></a>
+<span class="sourceLineNo">343</span>    table.get(get);<a name="line.343"></a>
+<span class="sourceLineNo">344</span><a name="line.344"></a>
+<span class="sourceLineNo">345</span>    // verify that scannerNext and scannerClose upcalls won't be invoked<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    // when we perform get().<a name="line.346"></a>
+<span class="sourceLineNo">347</span>    verifyMethodResult(SimpleRegionObserver.class,<a name="line.347"></a>
+<span class="sourceLineNo">348</span>      new String[] { "hadPreGet", "hadPostGet", "wasScannerNextCalled", "wasScannerCloseCalled" },<a name="line.348"></a>
+<span class="sourceLineNo">349</span>      tableName, new Boolean[] { true, true, false, false });<a name="line.349"></a>
+<span class="sourceLineNo">350</span><a name="line.350"></a>
+<span class="sourceLineNo">351</span>    Scan s = new Scan();<a name="line.351"></a>
+<span class="sourceLineNo">352</span>    ResultScanner scanner = table.getScanner(s);<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    try {<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      for (Result rr = scanner.next(); rr != null; rr = scanner.next()) {<a name="line.354"></a>
+<span class="sourceLineNo">355</span>      }<a name="line.355"></a>
+<span class="sourceLineNo">356</span>    } finally {<a name="line.356"></a>
+<span class="sourceLineNo">357</span>      scanner.close();<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>    // now scanner hooks should be invoked.<a name="line.360"></a>
+<span class="sourceLineNo">361</span>    verifyMethodResult(SimpleRegionObserver.class,<a name="line.361"></a>
+<span class="sourceLineNo">362</span>      new String[] { "wasScannerNextCalled", "wasScannerCloseCalled" }, tableName,<a name="line.362"></a>
+<span class="sourceLineNo">363</span>      new Boolean[] { true, true });<a name="line.363"></a>
+<span class="sourceLineNo">364</span>    util.deleteTable(tableName);<a name="line.364"></a>
+<span class="sourceLineNo">365</span>    table.close();<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>  @Test<a name="line.368"></a>
+<span class="sourceLineNo">369</span>  public void testHBASE14489() throws IOException {<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.370"></a>
+<span class="sourceLineNo">371</span>    Table table = util.createTable(tableName, new byte[][] { A });<a name="line.371"></a>
+<span class="sourceLineNo">372</span>    Put put = new Put(ROW);<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    put.addColumn(A, A, A);<a name="line.373"></a>
+<span class="sourceLineNo">374</span>    table.put(put);<a name="line.374"></a>
+<span class="sourceLineNo">375</span><a name="line.375"></a>
+<span class="sourceLineNo">376</span>    Scan s = new Scan();<a name="line.376"></a>
+<span class="sourceLineNo">377</span>    s.setFilter(new FilterAllFilter());<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    ResultScanner scanner = table.getScanner(s);<a name="line.378"></a>
+<span class="sourceLineNo">379</span>    try {<a name="line.379"></a>
+<span class="sourceLineNo">380</span>      for (Result rr = scanner.next(); rr != null; rr = scanner.next()) {<a name="line.380"></a>
+<span class="sourceLineNo">381</span>      }<a name="line.381"></a>
+<span class="sourceLineNo">382</span>    } finally {<a name="line.382"></a>
+<span class="sourceLineNo">383</span>      scanner.close();<a name="line.383"></a>
+<span class="sourceLineNo">384</span>    }<a name="line.384"></a>
+<span class="sourceLineNo">385</span>    verifyMethodResult(SimpleRegionObserver.class, new String[] { "wasScannerFilterRowCalled" },<a name="line.385"></a>
+<span class="sourceLineNo">386</span>      tableName, new Boolean[] { true });<a name="line.386"></a>
+<span class="sourceLineNo">387</span>    util.deleteTable(tableName);<a name="line.387"></a>
+<span class="sourceLineNo">388</span>    table.close();<a name="line.388"></a>
+<span class="sourceLineNo">389</span><a name="line.389"></a>
+<span class="sourceLineNo">390</span>  }<a name="line.390"></a>
+<span class="sourceLineNo">391</span><a name="line.391"></a>
+<span class="sourceLineNo">392</span>  @Test<a name="line.392"></a>
+<span class="sourceLineNo">393</span>  // HBase-3758<a name="line.393"></a>
+<span class="sourceLineNo">394</span>  public void testHBase3758() throws IOException {<a name="line.394"></a>
+<span class="sourceLineNo">395</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.395"></a>
+<span class="sourceLineNo">396</span>    util.createTable(tableName, new byte[][] { A, B, C });<a name="line.396"></a>
+<span class="sourceLineNo">397</span><a name="line.397"></a>
+<span class="sourceLineNo">398</span>    verifyMethodResult(SimpleRegionObserver.class,<a name="line.398"></a>
+<span class="sourceLineNo">399</span>      new String[] { "hadDeleted", "wasScannerOpenCalled" }, tableName,<a name="line.399"></a>
+<span class="sourceLineNo">400</span>      new Boolean[] { false, false });<a name="line.400"></a>
+<span class="sourceLineNo">401</span><a name="line.401"></a>
+<span class="sourceLineNo">402</span>    Table table = util.getConnection().getTable(tableName);<a name="line.402"></a>
+<span class="sourceLineNo">403</span>    Put put = new Put(ROW);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>    put.addColumn(A, A, A);<a name="line.404"></a>
+<span class="sourceLineNo">405</span>    table.put(put);<a name="line.405"></a>
+<span class="sourceLineNo">406</span><a name="line.406"></a>
+<span class="sourceLineNo">407</span>    Delete delete = new Delete(ROW);<a name="line.407"></a>
+<span class="sourceLineNo">408</span>    table.delete(delete);<a name="line.408"></a>
+<span class="sourceLineNo">409</span><a name="line.409"></a>
+<span class="sourceLineNo">410</span>    verifyMethodResult(SimpleRegionObserver.class,<a name="line.410"></a>
+<span class="sourceLineNo">411</span>      new String[] { "hadDeleted", "wasScannerOpenCalled" }, tableName,<a name="line.411"></a>
+<span class="sourceLineNo">412</span>      new Boolean[] { true, false });<a name="line.412"></a>
+<span class="sourceLineNo">413</span><a name="line.413"></a>
+<span class="sourceLineNo">414</span>    Scan s = new Scan();<a name="line.414"></a>
+<span class="sourceLineNo">415</span>    ResultScanner scanner = table.getScanner(s);<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    try {<a name="line.416"></a>
+<span class="sourceLineNo">417</span>      for (Result rr = scanner.next(); rr != null; rr = scanner.next()) {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>      }<a name="line.418"></a>
+<span class="sourceLineNo">419</span>    } finally {<a name="line.419"></a>
+<span class="sourceLineNo">420</span>      scanner.close();<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>    // now scanner hooks should be invoked.<a name="line.423"></a>
+<span class="sourceLineNo">424</span>    verifyMethodResult(SimpleRegionObserver.class, new String[] { "wasScannerOpenCalled" },<a name="line.424"></a>
+<span class="sourceLineNo">425</span>      tableName, new Boolean[] { true });<a name="line.425"></a>
+<span class="sourceLineNo">426</span>    util.deleteTable(tableName);<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    table.close();<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>  /* Overrides compaction to only output rows with keys that are even numbers */<a name="line.430"></a>
+<span class="sourceLineNo">431</span>  public static class EvenOnlyCompactor implements RegionCoprocessor, RegionObserver {<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    long lastCompaction;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>    long lastFlush;<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 boolean next(List&lt;Cell&gt; results, ScannerContext scannerContext) throws IOException {<a name="line.436"></a>
-<span class="sourceLineNo">437</span>          List&lt;Cell&gt; internalResults = new ArrayList&lt;&gt;();<a name="line.437"></a>
-<span class="sourceLineNo">438</span>          boolean hasMore;<a name="line.438"></a>
-<span class="sourceLineNo">439</span>          do {<a name="line.439"></a>
-<span class="sourceLineNo">440</span>            hasMore = scanner.next(internalResults, scannerContext);<a name="line.440"></a>
-<span class="sourceLineNo">441</span>            if (!internalResults.isEmpty()) {<a name="line.441"></a>
-<span class="sourceLineNo">442</span>              long row = Bytes.toLong(CellUtil.cloneValue(internalResults.get(0)));<a name="line.442"></a>
-<span class="sourceLineNo">443</span>              if (row % 2 == 0) {<a name="line.443"></a>
-<span class="sourceLineNo">444</span>                // return this row<a name="line.444"></a>
-<span class="sourceLineNo">445</span>                break;<a name="line.445"></a>
-<span class="sourceLineNo">446</span>              }<a name="line.446"></a>
-<span class="sourceLineNo">447</span>              // clear and continue<a name="line.447"></a>
-<span class="sourceLineNo">448</span>              internalResults.clear();<a name="line.448"></a>
-<span class="sourceLineNo">449</span>            }<a name="line.449"></a>
-<span class="sourceLineNo">450</span>          } while (hasMore);<a name="line.450"></a>
-<span class="sourceLineNo">451</span><a name="line.451"></a>
-<span class="sourceLineNo">452</span>          if (!internalResults.isEmpty()) {<a name="line.452"></a>
-<span class="sourceLineNo">453</span>            results.addAll(internalResults);<a name="line.453"></a>
-<span class="sourceLineNo">454</span>          }<a name="line.454"></a>
-<span class="sourceLineNo">455</span>          return hasMore;<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 close() throws IOException {<a name="line.459"></a>
-<span class="sourceLineNo">460</span>          scanner.close();<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><a name="line.464"></a>
-<span class="sourceLineNo">465</span>    @Override<a name="line.465"></a>
-<span class="sourceLineNo">466</span>    public void postCompact(ObserverContext&lt;RegionCoprocessorEnvironment&gt; e, Store store,<a name="line.466"></a>
-<span class="sourceLineNo">467</span>        StoreFile resultFile, CompactionLifeCycleTracker tracker, CompactionRequest request) {<a name="line.467"></a>
-<span class="sourceLineNo">468</span>      lastCompaction = EnvironmentEdgeManager.currentTime();<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>    @Override<a name="line.471"></a>
-<span class="sourceLineNo">472</span>    public void postFlush(ObserverContext&lt;RegionCoprocessorEnvironment&gt; e,<a name="line.472"></a>
-<span class="sourceLineNo">473</span>        FlushLifeCycleTracker tracker) {<a name="line.473"></a>
-<span class="sourceLineNo">474</span>      lastFlush = EnvironmentEdgeManager.currentTime();<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>  /**<a name="line.478"></a>
-<span class="sourceLineNo">479</span>   * Tests overriding compaction handling via coprocessor hooks<a name="line.479"></a>
-<span class="sourceLineNo">480</span>   * @throws Exception<a name="line.480"></a>
-<span class="sourceLineNo">481</span>   */<a name="line.481"></a>
-<span class="sourceLineNo">482</span>  @Test<a name="line.482"></a>
-<span class="sourceLineNo">483</span>  public void testCompactionOverride() throws Exception {<a name="line.483"></a>
-<span class="sourceLineNo">484</span>    final TableName compactTable = TableName.valueOf(name.getMethodName());<a name="line.484"></a>
-<span class="sourceLineNo">485</span>    Admin admin = util.getAdmin();<a name="line.485"></a>
-<span class="sourceLineNo">486</span>    if (admin.tableExists(compactTable)) {<a name="line.486"></a>
-<span class="sourceLineNo">487</span>      admin.disableTable(compactTable);<a name="line.487"></a>
-<span class="sourceLineNo">488</span>      admin.deleteTable(compactTable);<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>    HTableDescriptor htd = new HTableDescriptor(compactTable);<a name="line.491"></a>
-<span class="sourceLineNo">492</span>    htd.addFamily(new HColumnDescriptor(A));<a name="line.492"></a>
-<span class="sourceLineNo">493</span>    htd.addCoprocessor(EvenOnlyCompactor.class.getName());<a name="line.493"></a>
-<span class="sourceLineNo">494</span>    admin.createTable(htd);<a name="line.494"></a>
-<span class="sourceLineNo">495</span><a name="line.495"></a>
-<span class="sourceLineNo">496</span>    Table table = util.getConnection().getTable(compactTable);<a name="line.496"></a>
-<span class="sourceLineNo">497</span>    for (long i = 1; i &lt;= 10; i++) {<a name="line.497"></a>
-<span class="sourceLineNo">498</span>      byte[] iBytes = Bytes.toBytes(i);<a name="line.498"></a>
-<span class="sourceLineNo">499</span>      Put put = new Put(iBytes);<a name="line.499"></a>
-<span class="sourceLineNo">500</span>      put.setDurability(Durability.SKIP_WAL);<a name="line.500"></a>
-<span class="sourceLineNo">501</span>      put.addColumn(A, A, iBytes);<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      table.put(put);<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>    HRegion firstRegion = cluster.getRegions(compactTable).get(0);<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    Coprocessor cp = firstRegion.getCoprocessorHost().findCoprocessor(EvenOnlyCompactor.class);<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    assertNotNull("EvenOnlyCompactor coprocessor should be loaded", cp);<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    EvenOnlyCompactor compactor = (EvenOnlyCompactor) cp;<a name="line.508"></a>
-<span class="sourceLineNo">509</span><a name="line.509"></a>
-<span class="sourceLineNo">510</span>    // force a compaction<a name="line.510"></a>
-<span class="sourceLineNo">511</span>    long ts = System.currentTimeMillis();<a name="line.511"></a>
-<span class="sourceLineNo">512</span>    admin.flush(compactTable);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    // wait for flush<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.514"></a>
-<span class="sourceLineNo">515</span>      if (compactor.lastFlush &gt;= ts) {<a name="line.515"></a>
-<span class="sourceLineNo">516</span>        break;<a name="line.516"></a>
-<span class="sourceLineNo">517</span>      }<a name="line.517"></a>
-<span class="sourceLineNo">518</span>      Thread.sleep(1000);<a name="line.518"></a>
-<span class="sourceLineNo">519</span>    }<a name="line.519"></a>
-<span class="sourceLineNo">520</span>    assertTrue("Flush didn't complete", compactor.lastFlush &gt;= ts);<a name="line.520"></a>
-<span class="sourceLineNo">521</span>    LOG.debug("Flush complete");<a name="line.521"></a>
-<span class="sourceLineNo">522</span><a name="line.522"></a>
-<span class="sourceLineNo">523</span>    ts = compactor.lastFlush;<a name="line.523"></a>
-<span class="sourceLineNo">524</span>    admin.majorCompact(compactTable);<a name="line.524"></a>
-<span class="sourceLineNo">525</span>    // wait for compaction<a name="line.525"></a>
-<span class="sourceLineNo">526</span>    for (int i = 0; i &lt; 30; i++) {<a name="line.526"></a>
-<span class="sourceLineNo">527</span>      if (compactor.lastCompaction &gt;= ts) {<a name="line.527"></a>
-<span class="sourceLineNo">528</span>        break;<a name="line.528"></a>
-<span class="sourceLineNo">529</span>      }<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      Thread.sleep(1000);<a name="line.530"></a>
-<span class="sourceLineNo">531</span>    }<a name="line.531"></a>
-<span class="sourceLineNo">532</span>    LOG.debug("Last compaction was at " + compactor.lastCompaction);<a name="line.532"></a>
-<span class="sourceLineNo">533</span>    assertTrue("Compaction didn't complete", compactor.lastCompaction &gt;= ts);<a name="line.533"></a>
-<span class="sourceLineNo">534</span><a name="line.534"></a>
-<span class="sourceLineNo">535</span>    // only even rows should remain<a name="line.535"></a>
-<span class="sourceLineNo">536</span>    ResultScanner scanner = table.getScanner(new Scan());<a name="line.536"></a>
-<span class="sourceLineNo">537</span>    try {<a name="line.537"></a>
-<span class="sourceLineNo">538</span>      for (long i = 2; i &lt;= 10; i += 2) {<a name="line.538"></a>
-<span class="sourceLineNo">539</span>        Result r = scanner.next();<a name="line.539"></a>
-<span class="sourceLineNo">540</span>        assertNotNull(r);<a name="line.540"></a>
-<span class="sourceLineNo">541</span>        assertFalse(r.isEmpty());<a name="line.541"></a>
-<span class="sourceLineNo">542</span>        byte[] iBytes = Bytes.toBytes(i);<a name="line.542"></a>
-<span class="sourceLineNo">543</span>        assertArrayEquals("Row should be " + i, r.getRow(), iBytes);<a name="line.543"></a>
-<span class="sourceLineNo">544</span>        assertArrayEquals("Value should be " + i, r.getValue(A, A), iBytes);<a name="line.544"></a>
-<span class="sourceLineNo">545</span>      }<a name="line.545"></a>
-<span class="sourceLineNo">546</span>    } finally {<a name="line.546"></a>
-<span class="sourceLineNo">547</span>      scanner.close();<a name="line.547"></a>
-<span class="sourceLineNo">548</span>    }<a name="line.548"></a>
-<span class="sourceLineNo">549</span>    table.close();<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>  @Test<a name="line.552"></a>
-<span class="sourceLineNo">553</span>  public void bulkLoadHFileTest() throws Exception {<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    final String testName = TestRegionObserverInterface.class.getName() + "." + name.getMethodName();<a name="line.554"></a>
-<span class="sourceLineNo">555</span>    final TableName tableName = TableName.valueOf(TEST_TABLE.getNameAsString() + "." + name.getMethodName());<a name="line.555"></a>
-<span class="sourceLineNo">556</span>    Configuration conf = util.getConfiguration();<a name="line.556"></a>
-<span class="sourceLineNo">557</span>    Table table = util.createTable(tableName, new byte[][] { A, B, C });<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    try (RegionLocator locator = util.getConnection().getRegionLocator(tableName)) {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>      verifyMethodResult(SimpleRegionObserver.class,<a name="line.559"></a>
-<span class="sourceLineNo">560</span>        new String[] { "hadPreBulkLoadHFile", "hadPostBulkLoadHFile" }, tableName,<a name="line.560"></a>
-<span class="sourceLineNo">561</span>        new Boolean[] { false, false });<a name="line.561"></a>
+<span class="sourceLineNo">435</span>    @Override<a name="line.435"></a>
+<span class="sourceLineNo">436</span>    public Optional&lt;RegionObserver&gt; getRegionObserver() {<a name="line.436"></a>
+<span class="sourceLineNo">437</span>      return Optional.of(this);<a name="line.437"></a>
+<span class="sourceLineNo">438</span>    }<a name="line.438"></a>
+<span class="sourceLineNo">439</span><a name="line.439"></a>
+<span class="sourceLineNo">440</span>    @Override<a name="line.440"></a>
+<span class="sourceLineNo">441</span>    public InternalScanner preCompact(ObserverContext&lt;RegionCoprocessorEnvironment&gt; e, Store store,<a name="line.441"></a>
+<span class="sourceLineNo">442</span>        InternalScanner scanner, ScanType scanType, CompactionLifeCycleTracker tracker,<a name="line.442"></a>
+<span class="sourceLineNo">443</span>        CompactionRequest request) {<a name="line.443"></a>
+<span class="sourceLineNo">444</span>      return new InternalScanner() {<a name="line.444"></a>
+<span class="sourceLineNo">445</span><a name="line.445"></a>
+<span class="sourceLineNo">446</span>        @Override<a name="line.446"></a>
+<span class="sourceLineNo">447</span>        public boolean next(List&lt;Cell&gt; results, ScannerContext scannerContext) throws IOException {<a name="line.447"></a>
+<span class="sourceLineNo">448</span>          List&lt;Cell&gt; internalResults = new ArrayList&lt;&gt;();<a name="line.448"></a>
+<span class="sourceLineNo">449</span>          boolean hasMore;<a name="line.449"></a>
+<span class="sourceLineNo">450</span>          do {<a name="line.450"></a>
+<span class="sourceLineNo">451</span>            hasMore = scanner.next(internalResults, scannerContext);<a name="line.451"></a>
+<span class="sourceLineNo">452</span>            if (!internalResults.isEmpty()) {<a name="line.452"></a>
+<span class="sourceLineNo">453</span>              long row = Bytes.toLong(CellUtil.cloneValue(internalResults.get(0)));<a name="line.453"></a>
+<span class="sourceLineNo">454</span>              if (row % 2 == 0) {<a name="line.454"></a>
+<span class="sourceLineNo">455</span>                // return this row<a name="line.455"></a>
+<span class="sourceLineNo">456</span>                break;<a name="line.456"></a>
+<span class="sourceLineNo">457</span>              }<a name="line.457"></a>
+<span class="sourceLineNo">458</span>              // clear and continue<a name="line.458"></a>
+<span class="sourceLineNo">459</span>              internalResults.clear();<a name="line.459"></a>
+<span class="sourceLineNo">460</span>            }<a name="line.460"></a>
+<span class="sourceLineNo">461</span>          } while (hasMore);<a name="line.461"></a>
+<span class="sourceLineNo">462</span><a name="line.462"></a>
+<span class="sourceLineNo">463</span>          if (!internalResults.isEmpty()) {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>            results.addAll(internalResults);<a name="line.464"></a>
+<span class="sourceLineNo">465</span>          }<a name="line.465"></a>
+<span class="sourceLineNo">466</span>          return hasMore;<a name="line.466"></a>
+<span class="sourceLineNo">467</span>        }<a name="line.467"></a>
+<span class="sourceLineNo">468</span><a name="line.468"></a>
+<span class="sourceLineNo">469</span>        @Override<a name="line.469"></a>
+<span class="sourceLineNo">470</span>        public void close() throws IOException {<a name="line.470"></a>
+<span class="sourceLineNo">471</span>          scanner.close();<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>    }<a name="line.474"></a>
+<span class="sourceLineNo">475</span><a name="line.475"></a>
+<span class="sourceLineNo">476</span>    @Override<a name="line.476"></a>
+<span class="sourceLineNo">477</span>    public void postCompact(ObserverContext&lt;RegionCoprocessorEnvironment&gt; e, Store store,<a name="line.477"></a>
+<span class="sourceLineNo">478</span>        StoreFile resultFile, CompactionLifeCycleTracker tracker, CompactionRequest request) {<a name="line.478"></a>
+<span class="sourceLineNo">479</span>      lastCompaction = EnvironmentEdgeManager.currentTime();<a name="line.479"></a>
+<span class="sourceLineNo">480</span>    }<a name="line.480"></a>
+<span class="sourceLineNo">481</span><a name="line.481"></a>
+<span class="sourceLineNo">482</span>    @Override<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    public void postFlush(ObserverContext&lt;RegionCoprocessorEnvironment&gt; e,<a name="line.483"></a>
+<span class="sourceLineNo">484</span>        FlushLifeCycleTracker tracker) {<a name="line.484"></a>
+<span class="sourceLineNo">485</span>      lastFlush = EnvironmentEdgeManager.currentTime();<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>  /**<a name="line.489"></a>
+<span class="sourceLineNo">490</span>   * Tests overriding compaction handling via coprocessor hooks<a name="line.490"></a>
+<span class="sourceLineNo">491</span>   * @throws Exception<a name="line.491"></a>
+<span class="sourceLineNo">492</span>   */<a name="line.492"></a>
+<span class="sourceLineNo">493</span>  @Test<a name="line.493"></a>
+<span class="sourceLineNo">494</span>  public void testCompactionOverride() throws Exception {<a name="line.494"></a>
+<span class="sourceLineNo">495</span>    final TableName compactTable = TableName.valueOf(name.getMethodName());<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    Admin admin = util.getAdmin();<a name="line.496"></a>
+<span class="sourceLineNo">497</span>    if (admin.tableExists(compactTable)) {<a name="line.497"></a>
+<span class="sourceLineNo">498</span>      admin.disableTable(compactTable);<a name="line.498"></a>
+<span class="sourceLineNo">499</span>      admin.deleteTable(compactTable);<a name="line.499"></a>
+<span class="sourceLineNo">500</span>    }<a name="line.500"></a>
+<span class="sourceLineNo">501</span><a name="line.501"></a>
+<span class="sourceLineNo">502</span>    HTableDescriptor htd = new HTableDescriptor(compactTable);<a name="line.502"></a>
+<span class="sourceLineNo">503</span>    htd.addFamily(new HColumnDescriptor(A));<a name="line.503"></a>
+<span class="sourceLineNo">504</span>    htd.addCoprocessor(EvenOnlyCompactor.class.getName());<a name="line.504"></a>
+<span class="sourceLineNo">505</span>    admin.createTable(htd);<a name="line.505"></a>
+<span class="sourceLineNo">506</span><a name="line.506"></a>
+<span class="sourceLineNo">507</span>    Table table = util.getConnection().getTable(compactTable);<a name="line.507"></a>
+<span class="sourceLineNo">508</span>    for (long i = 1; i &lt;= 10; i++) {<a name="line.508"></a>
+<span class="sourceLineNo">509</span>      byte[] iBytes = Bytes.toBytes(i);<a name="line.509"></a>
+<span class="sourceLineNo">510</span>      Put put = new Put(iBytes);<a name="line.510"></a>
+<span class="sourceLineNo">511</span>      put.setDurability(Durability.SKIP_WAL);<a name="line.511"></a>
+<span class="sourceLineNo">512</span>      put.addColumn(A, A, iBytes);<a name="line.512"></a>
+<span class="sourceLineNo">513</span>      table.put(put);<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>    HRegion firstRegion = cluster.getRegions(compactTable).get(0);<a name="line.516"></a>
+<span class="sourceLineNo">517</span>    Coprocessor cp = firstRegion.getCoprocessorHost().findCoprocessor(EvenOnlyCompactor.class);<a name="line.517"></a>
+<span class="sourceLineNo">518</span>    assertNotNull("EvenOnlyCompactor coprocessor should be loaded", cp);<a name="line.518"></a>
+<span class="sourceLineNo">519</span>    EvenOnlyCompactor compactor = (EvenOnlyCompactor) cp;<a name="line.519"></a>
+<span class="sourceLineNo">520</span><a name="line.520"></a>
+<span class="sourceLineNo">521</span>    // force a compaction<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    long ts = System.currentTimeMillis();<a name="line.522"></a>
+<span class="sourceLineNo">523</span>    admin.flush(compactTable);<a name="line.523"></a>
+<span class="sourceLineNo">524</span>    // wait for flush<a name="line.524"></a>
+<span class="sourceLineNo">525</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.525"></a>
+<span class="sourceLineNo">526</span>      if (compactor.lastFlush &gt;= ts) {<a name="line.526"></a>
+<span class="sourceLineNo">527</span>        break;<a name="line.527"></a>
+<span class="sourceLineNo">528</span>      }<a name="line.528"></a>
+<span class="sourceLineNo">529</span>      Thread.sleep(1000);<a name="line.529"></a>
+<span class="sourceLineNo">530</span>    }<a name="line.530"></a>
+<span class="sourceLineNo">531</span>    assertTrue("Flush didn't complete", compactor.lastFlush &gt;= ts);<a name="line.531"></a>
+<span class="sourceLineNo">532</span>    LOG.debug("Flush complete");<a name="line.532"></a>
+<span class="sourceLineNo">533</span><a name="line.533"></a>
+<span class="sourceLineNo">534</span>    ts = compactor.lastFlush;<a name="line.534"></a>
+<span class="sourceLineNo">535</span>    admin.majorCompact(compactTable);<a name="line.535"></a>
+<span class="sourceLineNo">536</span>    // wait for compaction<a name="line.536"></a>
+<span class="sourceLineNo">537</span>    for (int i = 0; i &lt; 30; i++) {<a name="line.537"></a>
+<span class="sourceLineNo">538</span>      if (compactor.lastCompaction &gt;= ts) {<a name="line.538"></a>
+<span class="sourceLineNo">539</span>        break;<a name="line.539"></a>
+<span class="sourceLineNo">540</span>      }<a name="line.540"></a>
+<span class="sourceLineNo">541</span>      Thread.sleep(1000);<a name="line.541"></a>
+<span class="sourceLineNo">542</span>    }<a name="line.542"></a>
+<span class="sourceLineNo">543</span>    LOG.debug("Last compaction was at " + compactor.lastCompaction);<a name="line.543"></a>
+<span class="sourceLineNo">544</span>    assertTrue("Compaction didn't complete", compactor.lastCompaction &gt;= ts);<a name="line.544"></a>
+<span class="sourceLineNo">545</span><a name="line.545"></a>
+<span class="sourceLineNo">546</span>    // only even rows should remain<a name="line.546"></a>
+<span class="sourceLineNo">547</span>    ResultScanner scanner = table.getScanner(new Scan());<a name="line.547"></a>
+<span class="sourceLineNo">548</span>    try {<a name="line.548"></a>
+<span class="sourceLineNo">549</span>      for (long i = 2; i &lt;= 10; i += 2) {<a name="line.549"></a>
+<span class="sourceLineNo">550</span>        Result r = scanner.next();<a name="line.550"></a>
+<span class="sourceLineNo">551</span>        assertNotNull(r);<a name="line.551"></a>
+<span class="sourceLineNo">552</span>        assertFalse(r.isEmpty());<a name="line.552"></a>
+<span class="sourceLineNo">553</span>        byte[] iBytes = Bytes.toBytes(i);<a name="line.553"></a>
+<span class="sourceLineNo">554</span>        assertArrayEquals("Row should be " + i, r.getRow(), iBytes);<a name="line.554"></a>
+<span class="sourceLineNo">555</span>        assertArrayEquals("Value should be " + i, r.getValue(A, A), iBytes);<a name="line.555"></a>
+<span class="sourceLineNo">556</span>      }<a name="line.556"></a>
+<span class="sourceLineNo">557</span>    } finally {<a name="line.557"></a>
+<span class="sourceLineNo">558</span>      scanner.close();<a name="line.558"></a>
+<span class="sourceLineNo">559</span>    }<a name="line.559"></a>
+<span class="sourceLineNo">560</span>    table.close();<a name="line.560"></a>
+<span class="sourceLineNo">561</span>  }<a name="line.561"></a>
 <span class="sourceLineNo">562</span><a name="line.562"></a>
-<span class="sourceLineNo">563</span>      FileSystem fs = util.getTestFileSystem();<a name="line.563"></a>
-<span class="sourceLineNo">564</span>      final Path dir = util.getDataTestDirOnTestFS(testName).makeQualified(fs);<a name="line.564"></a>
-<span class="sourceLineNo">565</span>      Path familyDir = new Path(dir, Bytes.toString(A));<a name="line.565"></a>
-<span class="sourceLineNo">566</span><a name="line.566"></a>
-<span class="sourceLineNo">567</span>      createHFile(util.getConfiguration(), fs, new Path(familyDir, Bytes.toString(A)), A, A);<a name="line.567"></a>
-<span class="sourceLineNo">568</span><a name="line.568"></a>
-<span class="sourceLineNo">569</span>      // Bulk load<a name="line.569"></a>
-<span class="sourceLineNo">570</span>      BulkLoadHFiles.create(conf).bulkLoad(tableName, dir);<a name="line.570"></a>
-<span class="sourceLineNo">571</span><a name="line.571"></a>
-<span class="sourceLineNo">572</span>      verifyMethodResult(SimpleRegionObserver.class,<a name="line.572"></a>
-<span class="sourceLineNo">573</span>        new String[] { "hadPreBulkLoadHFile", "hadPostBulkLoadHFile" }, tableName,<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        new Boolean[] { true, true });<a name="line.574"></a>
-<span class="sourceLineNo">575</span>    } finally {<a name="line.575"></a>
-<span class="sourceLineNo">576</span>      util.deleteTable(tableName);<a name="line.576"></a>
-<span class="sourceLineNo">577</span>      table.close();<a name="line.577"></a>
-<span class="sourceLineNo">578</span>    }<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>  @Test<a name="line.581"></a>
-<span class="sourceLineNo">582</span>  public void testRecovery() throws Exception {<a name="line.582"></a>
-<span class="sourceLineNo">583</span>    LOG.info(TestRegionObserverInterface.class.getName() + "." + name.getMethodName());<a name="line.583"></a>
-<span class="sourceLineNo">584</span>    final TableName tableName = TableName.valueOf(TEST_TABLE.getNameAsString() + "." + name.getMethodName());<a name="line.584"></a>
-<span class="sourceLineNo">585</span>    Table table = util.createTable(tableName, new byte[][] { A, B, C });<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    try (RegionLocator locator = util.getConnection().getRegionLocator(tableName)) {<a name="line.586"></a>
-<span class="sourceLineNo">587</span><a name="line.587"></a>
-<span class="sourceLineNo">588</span>      JVMClusterUtil.RegionServerThread rs1 = cluster.startRegionServer();<a name="line.588"></a>
-<span class="sourceLineNo">589</span>      ServerName sn2 = rs1.getRegionServer().getServerName();<a name="line.589"></a>
-<span class="sourceLineNo">590</span>      String regEN = locator.getAllRegionLocations().get(0).getRegion().getEncodedName();<a name="line.590"></a>
+<span class="sourceLineNo">563</span>  @Test<a name="line.563"></a>
+<span class="sourceLineNo">564</span>  public void bulkLoadHFileTest() throws Exception {<a name="line.564"></a>
+<span class="sourceLineNo">565</span>    final String testName = TestRegionObserverInterface.class.getName() + "." + name.getMethodName();<a name="line.565"></a>
+<span class="sourceLineNo">566</span>    final TableName tableName = TableName.valueOf(TEST_TABLE.getNameAsString() + "." + name.getMethodName());<a name="line.566"></a>
+<span class="sourceLineNo">567</span>    Configuration conf = util.getConfiguration();<a name="line.567"></a>
+<span class="sourceLineNo">568</span>    Table table = util.createTable(tableName, new byte[][] { A, B, C });<a name="line.568"></a>
+<span class="sourceLineNo">569</span>    try (RegionLocator locator = util.getConnection().getRegionLocator(tableName)) {<a name="line.569"></a>
+<span class="sourceLineNo">570</span>      verifyMethodResult(SimpleRegionObserver.class,<a name="line.570"></a>
+<span class="sourceLineNo">571</span>        new String[] { "hadPreBulkLoadHFile", "hadPostBulkLoadHFile" }, tableName,<a name="line.571"></a>
+<span class="sourceLineNo">572</span>        new Boolean[] { false, false });<a name="line.572"></a>
+<span class="sourceLineNo">573</span><a name="line.573"></a>
+<span class="sourceLineNo">574</span>      FileSystem fs = util.getTestFileSystem();<a name="line.574"></a>
+<span class="sourceLineNo">575</span>      final Path dir = util.getDataTestDirOnTestFS(testName).makeQualified(fs);<a name="line.575"></a>
+<span class="sourceLineNo">576</span>      Path familyDir = new Path(dir, Bytes.toString(A));<a name="line.576"></a>
+<span class="sourceLineNo">577</span><a name="line.577"></a>
+<span class="sourceLineNo">578</span>      createHFile(util.getConfiguration(), fs, new Path(familyDir, Bytes.toString(A)), A, A);<a name="line.578"></a>
+<span class="sourceLineNo">579</span><a name="line.579"></a>
+<span class="sourceLineNo">580</span>      // Bulk load<a name="line.580"></a>
+<span class="sourceLineNo">581</span>      BulkLoadHFiles.create(conf).bulkLoad(tableName, dir);<a name="line.581"></a>
+<span class="sourceLineNo">582</span><a name="line.582"></a>
+<span class="sourceLineNo">583</span>      verifyMethodResult(SimpleRegionObserver.class,<a name="line.583"></a>
+<span class="sourceLineNo">584</span>        new String[] { "hadPreBulkLoadHFile", "hadPostBulkLoadHFile" }, tableName,<a name="line.584"></a>
+<span class="sourceLineNo">585</span>        new Boolean[] { true, true });<a name="line.585"></a>
+<span class="sourceLineNo">586</span>    } finally {<a name="line.586"></a>
+<span class="sourceLineNo">587</span>      util.deleteTable(tableName);<a name="line.587"></a>
+<span class="sourceLineNo">588</span>      table.close();<a name="line.588"></a>
+<span class="sourceLineNo">589</span>    }<a name="line.589"></a>
+<span class="sourceLineNo">590</span>  }<a name="line.590"></a>
 <span class="sourceLineNo">591</span><a name="line.591"></a>
-<span class="sourceLineNo">592</span>      util.getAdmin().move(Bytes.toBytes(regEN), sn2);<a name="line.592"></a>
-<span class="sourceLineNo">593</span>      while (!sn2.equals(locator.getAllRegionLocations().get(0).getServerName())) {<a name="line.593"></a>
-<span class="sourceLineNo">594</span>        Thread.sleep(100);<a name="line.594"></a>
-<span class="sourceLineNo">595</span>      }<a name="line.595"></a>
-<span class="sourceLineNo">596</span><a name="line.596"></a>
-<span class="sourceLineNo">597</span>      Put put = new Put(ROW);<a name="line.597"></a>
-<span class="sourceLineNo">598</span>      put.addColumn(A, A, A);<a name="line.598"></a>
-<span class="sourceLineNo">599</span>      put.addColumn(B, B, B);<a name="line.599"></a>
-<span class="sourceLineNo">600</span>      put.addColumn(C, C, C);<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      table.put(put);<a name="line.601"></a>
+<span class="sourceLineNo">592</span>  @Test<a name="line.592"></a>
+<span class="sourceLineNo">593</span>  public void testRecovery() throws Exception {<a name="line.593"></a>
+<span class="sourceLineNo">594</span>    LOG.info(TestRegionObserverInterface.class.getName() + "." + name.getMethodName());<a name="line.594"></a>
+<span class="sourceLineNo">595</span>    final TableName tableName = TableName.valueOf(TEST_TABLE.getNameAsString() + "." + name.getMethodName());<a name="line.595"></a>
+<span class="sourceLineNo">596</span>    Table table = util.createTable(tableName, new byte[][] { A, B, C });<a name="line.596"></a>
+<span class="sourceLineNo">597</span>    try (RegionLocator locator = util.getConnection().getRegionLocator(tableName)) {<a name="line.597"></a>
+<span class="sourceLineNo">598</span><a name="line.598"></a>
+<span class="sourceLineNo">599</span>      JVMClusterUtil.RegionServerThread rs1 = cluster.startRegionServer();<a name="line.599"></a>
+<span class="sourceLineNo">600</span>      ServerName sn2 = rs1.getRegionServer().getServerName();<a name="line.600"></a>
+<span class="sourceLineNo">601</span>      String regEN = locator.getAllRegionLocations().get(0).getRegion().getEncodedName();<a name="line.601"></a>
 <span class="sourceLineNo">602</span><a name="line.602"></a>
-<span class="sourceLineNo">603</span>      // put two times<a name="line.603"></a>
-<span class="sourceLineNo">604</span>      table.put(put);<a name="line.604"></a>
-<span class="sourceLineNo">605</span><a name="line.605"></a>
-<span class="sourceLineNo">606</span>      verifyMethodResult(SimpleRegionObserver.class,<a name="line.606"></a>
-<span class="sourceLineNo">607</span>        new String[] { "hadPreGet", "hadPostGet", "hadPrePut", "hadPostPut", "hadPreBatchMutate",<a name="line.607"></a>
-<span class="sourceLineNo">608</span>            "hadPostBatchMutate", "hadDelete" },<a name="line.608"></a>
-<span class="sourceLineNo">609</span>        tableName, new Boolean[] { false, false, true, true, true, true, false });<a name="line.609"></a>
-<span class="sourceLineNo">610</span><a name="line.610"></a>
-<span class="sourceLineNo">611</span>      verifyMethodResult(SimpleRegionObserver.class,<a name="line.611"></a>
-<span class="sourceLineNo">612</span>        new String[] { "getCtPreReplayWALs", "getCtPostReplayWALs", "getCtPreWALRestore",<a name="line.612"></a>
-<span class="sourceLineNo">613</span>            "getCtPostWALRestore", "getCtPrePut", "getCtPostPut" },<a name="line.613"></a>
-<span class="sourceLineNo">614</span>        tableName, new Integer[] { 0, 0, 0, 0, 2, 2 });<a name="line.614"></a>
-<span class="sourceLineNo">615</span><a name="line.615"></a>
-<span class="sourceLineNo">616</span>      cluster.killRegionServer(rs1.getRegionServer().getServerName());<a name="line.616"></a>
-<span class="sourceLineNo">617</span>      Threads.sleep(1000); // Let the kill soak in.<a name="line.617"></a>
-<span class="sourceLineNo">618</span>      util.waitUntilAllRegionsAssigned(tableName);<a name="line.618"></a>
-<span class="sourceLineNo">619</span>      LOG.info("All regions assigned");<a name="line.619"></a>
-<span class="sourceLineNo">620</span><a name="line.620"></a>
-<span class="sourceLineNo">621</span>      verifyMethodResult(SimpleRegionObserver.class,<a name="line.621"></a>
-<span class="sourceLineNo">622</span>        new String[] { "getCtPreReplayWALs", "getCtPostReplayWALs", "getCtPreWALRestore",<a name="line.622"></a>
-<span class="sourceLineNo">623</span>            "getCtPostWALRestore", "getCtPrePut", "getCtPostPut" },<a name="line.623"></a>
-<span class="sourceLineNo">624</span>        tableName, new Integer[] { 1, 1, 2, 2, 0, 0 });<a name="line.624"></a>
-<span class="sourceLineNo">625</span>    } finally {<a name="line.625"></a>
-<span class="sourceLineNo">626</span>      util.deleteTable(tableName);<a name="line.626"></a>
-<span class="sourceLineNo">627</span>      table.close();<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><a name="line.630"></a>
-<span class="sourceLineNo">631</span>  @Test<a name="line.631"></a>
-<span class="sourceLineNo">632</span>  public void testPreWALRestoreSkip() throws Exception {<a name="line.632"></a>
-<span class="sourceLineNo">633</span>    LOG.info(TestRegionObserverInterface.class.getName() + "." + name.getMethodName());<a name="line.633"></a>
-<span class="sourceLineNo">634</span>    TableName tableName = TableName.valueOf(SimpleRegionObserver.TABLE_SKIPPED);<a name="line.634"></a>
-<span class="sourceLineNo">635</span>    Table table = util.createTable(tableName, new byte[][] { A, B, C });<a name="line.635"></a>
-<span class="sourceLineNo">636</span><a name="line.636"></a>
-<span class="sourceLineNo">637</span>    try (RegionLocator locator = util.getConnection().getRegionLocator(tableName)) {<a name="line.637"></a>
-<span class="sourceLineNo">638</span>      JVMClusterUtil.RegionServerThread rs1 = cluster.startRegionServer();<a name="line.638"></a>
-<span class="sourceLineNo">639</span>      ServerName sn2 = rs1.getRegionServer().getServerName();<a name="line.639"></a>
-<span class="sourceLineNo">640</span>      String regEN = locator.getAllRegionLocations().get(0).getRegion().getEncodedName();<a name="line.640"></a>
+<span class="sourceLineNo">603</span>      util.getAdmin().move(Bytes.toBytes(regEN), sn2);<a name="line.603"></a>
+<span class="sourceLineNo">604</span>      while (!sn2.equals(locator.getAllRegionLocations().get(0).getServerName())) {<a name="line.604"></a>
+<span class="sourceLineNo">605</span>        Thread.sleep(100);<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>      Put put = new Put(ROW);<a name="line.608"></a>
+<span class="sourceLineNo">609</span>      put.addColumn(A, A, A);<a name="line.609"></a>
+<span class="sourceLineNo">610</span>      put.addColumn(B, B, B);<a name="line.610"></a>
+<span class="sourceLineNo">611</span>      put.addColumn(C, C, C);<a name="line.611"></a>
+<span class="sourceLineNo">612</span>      table.put(put);<a name="line.612"></a>
+<span class="sourceLineNo">613</span><a name="line.613"></a>
+<span class="sourceLineNo">614</span>      // put two times<a name="line.614"></a>
+<span class="sourceLineNo">615</span>      table.put(put);<a name="line.615"></a>
+<span class="sourceLineNo">616</span><a name="line.616"></a>
+<span class="sourceLineNo">617</span>      verifyMethodResult(SimpleRegionObserver.class,<a name="line.617"></a>
+<span class="sourceLineNo">618</span>        new String[] { "hadPreGet", "hadPostGet", "hadPrePut", "hadPostPut", "hadPreBatchMutate",<a name="line.618"></a>
+<span class="sourceLineNo">619</span>            "hadPostBatchMutate", "hadDelete" },<a name="line.619"></a>
+<span class="sourceLineNo">620</span>        tableName, new Boolean[] { false, false, true, true, true, true, false });<a name="line.620"></a>
+<span class="sourceLineNo">621</span><a name="line.621"></a>
+<span class="sourceLineNo">622</span>      verifyMethodResult(SimpleRegionObserver.class,<a name="line.622"></a>
+<span class="sourceLineNo">623</span>        new String[] { "getCtPreReplayWALs", "getCtPostReplayWALs", "getCtPreWALRestore",<a name="line.623"></a>
+<span class="sourceLineNo">624</span>            "getCtPostWALRestore", "getCtPrePut", "getCtPostPut" },<a name="line.624"></a>
+<span class="sourceLineNo">625</span>        tableName, new Integer[] { 0, 0, 0, 0, 2, 2 });<a name="line.625"></a>
+<span class="sourceLineNo">626</span><a name="line.626"></a>
+<span class="sourceLineNo">627</span>      cluster.killRegionServer(rs1.getRegionServer().getServerName());<a name="line.627"></a>
+<span class="sourceLineNo">628</span>      Threads.sleep(1000); // Let the kill soak in.<a name="line.628"></a>
+<span class="sourceLineNo">629</span>      util.waitUntilAllRegionsAssigned(tableName);<a name="line.629"></a>
+<span class="sourceLineNo">630</span>      LOG.info("All regions assigned");<a name="line.630"></a>
+<span class="sourceLineNo">631</span><a name="line.631"></a>
+<span class="sourceLineNo">632</span>      verifyMethodResult(SimpleRegionObserver.class,<a name="line.632"></a>
+<span class="sourceLineNo">633</span>        new String[] { "getCtPreReplayWALs", "getCtPostReplayWALs", "getCtPreWALRestore",<a name="line.633"></a>
+<span class="sourceLineNo">634</span>            "getCtPostWALRestore", "getCtPrePut", "getCtPostPut" },<a name="line.634"></a>
+<span class="sourceLineNo">635</span>        tableName, new Integer[] { 1, 1, 2, 2, 0, 0 });<a name="line.635"></a>
+<span class="sourceLineNo">636</span>    } finally {<a name="line.636"></a>
+<span class="sourceLineNo">637</span>      util.deleteTable(tableName);<a name="line.637"></a>
+<span class="sourceLineNo">638</span>      table.close();<a name="line.638"></a>
+<span class="sourceLineNo">639</span>    }<a name="line.639"></a>
+<span class="sourceLineNo">640</span>  }<a name="line.640"></a>
 <span class="sourceLineNo">641</span><a name="line.641"></a>
-<span class="sourceLineNo">642</span>      util.getAdmin().move(Bytes.toBytes(regEN), sn2);<a name="line.642"></a>
-<span class="sourceLineNo">643</span>      while (!sn2.equals(locator.getAllRegionLocations().get(0).getServerName())) {<a name="line.643"></a>
-<span class="sourceLineNo">644</span>        Thread.sleep(100);<a name="line.644"></a>
-<span class="sourceLineNo">645</span>      }<a name="line.645"></a>
-<span class="sourceLineNo">646</span><a name="line.646"></a>
-<span class="sourceLineNo">647</span>      Put put = new Put(ROW);<a name="line.647"></a>
-<span class="sourceLineNo">648</span>      put.addColumn(A, A, A);<a name="line.648"></a>
-<span class="sourceLineNo">649</span>      put.addColumn(B, B, B);<a name="line.649"></a>
-<span class="sourceLineNo">650</span>      put.addColumn(C, C, C);<a name="line.650"></a>
-<span class="sourceLineNo">651</span>      table.put(put);<a name="line.651"></a>
+<span class="sourceLineNo">642</span>  @Test<a name="line.642"></a>
+<span class="sourceLineNo">643</span>  public void testPreWALRestoreSkip() throws Exception {<a name="line.643"></a>
+<span class="sourceLineNo">644</span>    LOG.info(TestRegionObserverInterface.class.getName() + "." + name.getMethodName());<a name="line.644"></a>
+<span class="sourceLineNo">645</span>    TableName tableName = TableName.valueOf(SimpleRegionObserver.TABLE_SKIPPED);<a name="line.645"></a>
+<span class="sourceLineNo">646</span>    Table table = util.createTable(tableName, new byte[][] { A, B, C });<a name="line.646"></a>
+<span class="sourceLineNo">647</span><a name="line.647"></a>
+<span class="sourceLineNo">648</span>    try (RegionLocator locator = util.getConnection().getRegionLocator(tableName)) {<a name="line.648"></a>
+<span class="sourceLineNo">649</span>      JVMClusterUtil.RegionServerThread rs1 = cluster.startRegionServer();<a name="line.649"></a>
+<span class="sourceLineNo">650</span>      ServerName sn2 = rs1.getRegionServer().getServerName();<a name="line.650"></a>
+<span class="sourceLineNo">651</span>      String regEN = locator.getAllRegionLocations().get(0).getRegion().getEncodedName();<a name="line.651"></a>
 <span class="sourceLineNo">652</span><a name="line.652"></a>
-<span class="sourceLineNo">653</span>      cluster.killRegionServer(rs1.getRegionServer().getServerName());<a name="line.653"></a>
-<span class="sourceLineNo">654</span>      Threads.sleep(20000); // just to be sure that the kill has fully started.<a name="line.654"></a>
-<span class="sourceLineNo">655</span>      util.waitUntilAllRegionsAssigned(tableName);<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    }<a name="line.656"></a>
+<span class="sourceLineNo">653</span>      util.getAdmin().move(Bytes.toBytes(regEN), sn2);<a name="line.653"></a>
+<span class="sourceLineNo">654</span>      while (!sn2.equals(locator.getAllRegionLocations().get(0).getServerName())) {<a name="line.654"></a>
+<span class="sourceLineNo">655</span>        Thread.sleep(100);<a name="line.655"></a>
+<span class="sourceLineNo">656</span>      }<a name="line.656"></a>
 <span class="sourceLineNo">657</span><a name="line.657"></a>
-<span class="sourceLineNo">658</span>    verifyMethodResult(SimpleRegionObserver.class,<a name="line.658"></a>
-<span class="sourceLineNo">659</span>      new String[] { "getCtPreWALRestore", "getCtPostWALRestore", }, tableName,<a name="line.659"></a>
-<span class="sourceLineNo">660</span>      new Integer[] { 0, 0 });<a name="line.660"></a>
-<span class="sourceLineNo">661</span><a name="line.661"></a>
-<span class="sourceLineNo">662</span>    util.deleteTable(tableName);<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    table.close();<a name="line.663"></a>
-<span class="sourceLineNo">664</span>  }<a name="line.664"></a>
-<span class="sourceLineNo">665</span><a name="line.665"></a>
-<span class="sourceLineNo">666</span>  // check each region whether the coprocessor upcalls are called or not.<a name="line.666"></a>
-<span class="sourceLineNo">667</span>  private void verifyMethodResult(Class&lt;?&gt; coprocessor, String methodName[], TableName tableName,<a name="line.667"></a>
-<span class="sourceLineNo">668</span>      Object value[]) throws IOException {<a name="line.668"></a>
-<span class="sourceLineNo">669</span>    try {<a name="line.669"></a>
-<span class="sourceLineNo">670</span>      for (JVMClusterUtil.RegionServerThread t : cluster.getRegionServerThreads()) {<a name="line.670"></a>
-<span class="sourceLineNo">671</span>        if (!t.isAlive() || t.getRegionServer().isAborted() || t.getRegionServer().isStopping()) {<a name="line.671"></a>
-<span class="sourceLineNo">672</span>          continue;<a name="line.672"></a>
-<span class="sourceLineNo">673</span>        }<a name="line.673"></a>
-<span class="sourceLineNo">674</span>        for (RegionInfo r : ProtobufUtil<a name="line.674"></a>
-<span class="sourceLineNo">675</span>            .getOnlineRegions(t.getRegionServer().getRSRpcServices())) {<a name="line.675"></a>
-<span class="sourceLineNo">676</span>          if (!r.getTable().equals(tableName)) {<a name="line.676"></a>
-<span class="sourceLineNo">677</span>            continue;<a name="line.677"></a>
-<span class="sourceLineNo">678</span>          }<a name="line.678"></a>
-<span class="sourceLineNo">679</span>          RegionCoprocessorHost cph =<a name="line.679"></a>
-<span class="sourceLineNo">680</span>              t.getRegionServer().getOnlineRegion(r.getRegionName()).getCoprocessorHost();<a name="line.680"></a>
-<span class="sourceLineNo">681</span><a name="line.681"></a>
-<span class="sourceLineNo">682</span>          Coprocessor cp = cph.findCoprocessor(coprocessor.getName());<a name="line.682"></a>
-<span class="sourceLineNo">683</span>          assertNotNull(cp);<a name="line.683"></a>
-<span class="sourceLineNo">684</span>          for (int i = 0; i &lt; methodName.length; ++i) {<a name="line.684"></a>
-<span class="sourceLineNo">685</span>            Method m = coprocessor.getMethod(methodName[i]);<a name="line.685"></a>
-<span class="sourceLineNo">686</span>            Object o = m.invoke(cp);<a name="line.686"></a>
-<span class="sourceLineNo">687</span>            assertTrue("Result of " + coprocessor.getName() + "." + methodName[i]<a name="line.687"></a>
-<span class="sourceLineNo">688</span>                    + " is expected to be " + value[i].toString() + ", while we get "<a name="line.688"></a>
-<span class="sourceLineNo">689</span>                    + o.toString(), o.equals(value[i]));<a name="line.689"></a>
-<span class="sourceLineNo">690</span>          }<a name="line.690"></a>
-<span class="sourceLineNo">691</span>        }<a name="line.691"></a>
-<span class="sourceLineNo">692</span>      }<a name="line.692"></a>
-<span class="sourceLineNo">693</span>    } catch (Exception e) {<a name="line.693"></a>
-<span class="sourceLineNo">694</span>      throw new IOException(e.toString());<a name="line.694"></a>
-<span class="sourceLineNo">695</span>    }<a name="line.695"></a>
-<span class="sourceLineNo">696</span>  }<a name="line.696"></a>
-<span class="sourceLineNo">697</span><a name="line.697"></a>
-<span class="sourceLineNo">698</span>  private static void createHFile(Configuration conf, FileSystem fs, Path path, byte[] family,<a name="line.698"></a>
-<span class="sourceLineNo">699</span>      byte[] qualifier) throws IOException {<a name="line.699"></a>
-<span class="sourceLineNo">700</span>    HFileContext context = new HFileContextBuilder().build();<a name="line.700"></a>
-<span class="sourceLineNo">701</span>    HFile.Writer writer = HFile.getWriterFactory(conf, new CacheConfig(conf)).withPath(fs, path)<a name="line.701"></a>
-<span class="sourceLineNo">702</span>        .withFileContext(context).create();<a name="line.702"></a>
-<span class="sourceLineNo">703</span>    long now = System.currentTimeMillis();<a name="line.703"></a>
-<span class="sourceLineNo">704</span>    try {<a name="line.704"></a>
-<span class="sourceLineNo">705</span>      for (int i = 1; i &lt;= 9; i++) {<a name="line.705"></a>
-<span class="sourceLineNo">706</span>        KeyValue kv =<a name="line.706"></a>
-<span class="sourceLineNo">707</span>            new KeyValue(Bytes.toBytes(i + ""), family, qualifier, now, Bytes.toBytes(i + ""));<a name="line.707"></a>
-<span class="sourceLineNo">708</span>        writer.append(kv);<a name="line.708"></a>
-<span class="sourceLineNo">709</span>      }<a name="line.709"></a>
-<span class="sourceLineNo">710</span>    } finally {<a name="line.710"></a>
-<span class="sourceLineNo">711</span>      writer.close();<a name="line.711"></a>
-<span class="sourceLineNo">712</span>    }<a name="line.712"></a>
-<span class="sourceLineNo">713</span>  }<a name="line.713"></a>
-<span class="sourceLineNo">714</span>}<a name="line.714"></a>
+<span class="sourceLineNo">658</span>      Put put = new Put(ROW);<a name="line.658"></a>
+<span class="sourceLineNo">659</span>      put.addColumn(A, A, A);<a name="line.659"></a>
+<span class="sourceLineNo">660</span>      put.addColumn(B, B, B);<a name="line.660"></a>
+<span class="sourceLineNo">661</span>      put.addColumn(C, C, C);<a name="line.661"></a>
+<span class="sourceLineNo">662</span>      table.put(put);<a name="line.662"></a>
+<span class="sourceLineNo">663</span><a name="line.663"></a>
+<span class="sourceLineNo">664</span>      cluster.killRegionServer(rs1.getRegionServer().getServerName());<a name="line.664"></a>
+<span class="sourceLineNo">665</span>      Threads.sleep(20000); // just to be sure that the kill has fully started.<a name="line.665"></a>
+<span class="sourceLineNo">666</span>      util.waitUntilAllRegionsAssigned(tableName);<a name="line.666"></a>
+<span class="sourceLineNo">667</span>    }<a name="line.667"></a>
+<span class="sourceLineNo">668</span><a name="line.668"></a>
+<span class="sourceLineNo">669</span>    verifyMethodResult(SimpleRegionObserver.class,<a name="line.669"></a>
+<span class="sourceLineNo">670</span>      new String[] { "getCtPreWALRestore", "getCtPostWALRestore", }, tableName,<a name="line.670"></a>
+<span class="sourceLineNo">671</span>      new Integer[] { 0, 0 });<a name="line.671"></a>
+<span class="sourceLineNo">672</span><a name="line.672"></a>
+<span class="sourceLineNo">673</span>    util.deleteTable(tableName);<a name="line.673"></a>
+<span class="sourceLineNo">674</span>    table.close();<a name="line.674"></a>
+<span class="sourceLineNo">675</span>  }<a name="line.675"></a>
+<span class="sourceLineNo">676</span><a name="line.676"></a>
+<span class="sourceLineNo">677</span>  //called from testPreWALAppendIsWrittenToWAL<a name="line.677"></a>
+<span class="sourceLineNo">678</span>  private void testPreWALAppendHook(Table table, TableName tableName) throws IOException {<a name="line.678"></a>
+<span class="sourceLineNo">679</span>    int expectedCalls = 0;<a name="line.679"></a>
+<span class="sourceLineNo">680</span>    String [] methodArray = new String[1];<a name="line.680"></a>
+<span class="sourceLineNo">681</span>    methodArray[0] = "getCtPreWALAppend";<a name="line.681"></a>
+<span class="sourceLineNo">682</span>    Object[] resultArray = new Object[1];<a name="line.682"></a>
+<span class="sourceLineNo">683</span><a name="line.683"></a>
+<span class="sourceLineNo">684</span>    Put p = new Put(ROW);<a name="line.684"></a>
+<span class="sourceLineNo">685</span>    p.addColumn(A, A, A);<a name="line.685"></a>
+<span class="sourceLineNo">686</span>    table.put(p);<a name="line.686"></a>
+<span class="sourceLineNo">687</span>    resultArray[0] = ++expectedCalls;<a name="line.687"></a>
+<span class="sourceLineNo">688</span>    verifyMethodResult(SimpleRegionObserver.class, methodArray, tableName, resultArray);<a name="line.688"></a>
+<span class="sourceLineNo">689</span><a name="line.689"></a>
+<span class="sourceLineNo">690</span>    Append a = new Append(ROW);<a name="line.690"></a>
+<span class="sourceLineNo">691</span>    a.addColumn(B, B, B);<a name="line.691"></a>
+<span class="sourceLineNo">692</span>    table.append(a);<a name="line.692"></a>
+<span class="sourceLineNo">693</span>    resultArray[0] = ++expectedCalls;<a name="line.693"></a>
+<span class="sourceLineNo">694</span>    verifyMethodResult(SimpleRegionObserver.class, methodArray, tableName, resultArray);<a name="line.694"></a>
+<span class="sourceLineNo">695</span><a name="line.695"></a>
+<span class="sourceLineNo">696</span>    Increment i = new Increment(ROW);<a name="line.696"></a>
+<span class="sourceLineNo">697</span>    i.addColumn(C, C, 1);<a name="line.697"></a>
+<span class="sourceLineNo">698</span>    table.increment(i);<a name="line.698"></a>
+<span class="sourceLineNo">699</span>    resultArray[0] = ++expectedCalls;<a name="line.699"></a>
+<span class="sourceLineNo">700</span>    verifyMethodResult(SimpleRegionObserver.class, methodArray, tableName, resultArray);<a name="line.700"></a>
+<span class="sourceLineNo">701</span><a name="line.701"></a>
+<span class="sourceLineNo">702</span>    Delete d = new Delete(ROW);<a name="line.702"></a>
+<span class="sourceLineNo">703</span>    table.delete(d);<a name="line.703"></a>
+<span class="sourceLineNo">704</span>    resultArray[0] = ++expectedCalls;<a name="line.704"></a>
+<span class="sourceLineNo">705</span>    verifyMethodResult(SimpleRegionObserver.class, methodArray, tableName, resultArray);<a name="line.705"></a>
+<span class="sourceLineNo">706</span>  }<a name="line.706"></a>
+<span class="sourceLineNo">707</span><a name="line.707"></a>
+<span class="sourceLineNo">708</span>  @Test<a name="line.708"></a>
+<span class="sourceLineNo">709</span>  public void testPreWALAppend() throws Exception {<a name="line.709"></a>
+<span class="sourceLineNo">710</span>    SimpleRegionObserver sro = new SimpleRegionObserver();<a name="line.710"></a>
+<span class="sourceLineNo">711</span>    ObserverContext ctx = Mockito.mock(ObserverContext.class);<a name="line.711"></a>
+<span class="sourceLineNo">712</span>    WALKey key = new WALKeyImpl(Bytes.toBytes("region"), TEST_TABLE,<a name="line.712"></a>
+<span class="sourceLineNo">713</span>        EnvironmentEdgeManager.currentTime());<a name="line.713"></a>
+<span class="sourceLineNo">714</span>    WALEdit edit = new WALEdit();<a name="line.714"></a>
+<span class="sourceLineNo">715</span>    sro.preWALAppend(ctx, key, edit);<a name="line.715"></a>
+<span class="sourceLineNo">716</span>    Assert.assertEquals(1, key.getExtendedAttributes().size());<a name="line.716"></a>
+<span class="sourceLineNo">717</span>    Assert.assertArrayEquals(SimpleRegionObserver.WAL_EXTENDED_ATTRIBUTE_BYTES,<a name="line.717"></a>
+<span class="sourceLineNo">718</span>        key.getExtendedAttribute(Integer.toString(sro.getCtPreWALAppend())));<a name="line.718"></a>
+<span class="sourceLineNo">719</span>  }<a name="line.719"></a>
+<span class="sourceLineNo">720</span><a name="line.720"></a>
+<span class="sourceLineNo">721</span>  @Test<a name="line.721"></a>
+<span class="sourceLineNo">722</span>  public void testPreWALAppendIsWrittenToWAL() throws Exception {<a name="line.722"></a>
+<span class="sourceLineNo">723</span>    final TableName tableName = TableName.valueOf(TEST_TABLE.getNameAsString() +<a name="line.723"></a>
+<span class="sourceLineNo">724</span>        "." + name.getMethodName());<a name="line.724"></a>
+<span class="sourceLineNo">725</span>    Table table = util.createTable(tableName, new byte[][] { A, B, C });<a name="line.725"></a>
+<span class="sourceLineNo">726</span><a name="line.726"></a>
+<span class="sourceLineNo">727</span>    PreWALAppendWALActionsListener listener = new PreWALAppendWALActionsListener();<a name="line.727"></a>
+<span class="sourceLineNo">728</span>    List&lt;HRegion&gt; regions = util.getHBaseCluster().getRegions(tableName);<a name="line.728"></a>
+<span class="sourceLineNo">729</span>    //should be only one region<a name="line.729"></a>
+<span class="sourceLineNo">730</span>    HRegion region = regions.get(0);<a name="line.730"></a>
+<span class="sourceLineNo">731</span>    region.getWAL().registerWALActionsListener(listener);<a name="line.731"></a>
+<span class="sourceLineNo">732</span>    testPreWALAppendHook(table, tableName);<a name="line.732"></a>
+<span class="sourceLineNo">733</span>    boolean[] expectedResults = {true, true, true, true};<a name="line.733"></a>
+<span class="sourceLineNo">734</span>    Assert.assertArrayEquals(expectedResults, listener.getWalKeysCorrectArray());<a name="line.734"></a>
+<span class="sourceLineNo">735</span><a name="line.735"></a>
+<span class="sourceLineNo">736</span>  }<a name="line.736"></a>
+<span class="sourceLineNo">737</span><a name="line.737"></a>
+<span class="sourceLineNo">738</span>  @Test<a name="line.738"></a>
+<span class="sourceLineNo">739</span>  public void testPreWALAppendNotCalledOnMetaEdit() throws Exception {<a name="line.739"></a>
+<span class="sourceLineNo">740</span>    final TableName tableName = TableName.valueOf(TEST_TABLE.getNameAsString() +<a name="line.740"></a>
+<span class="sourceLineNo">741</span>        "." + name.getMethodName());<a name="line.741"></a>
+<span class="sourceLineNo">742</span>    TableDescriptorBuilder tdBuilder = TableDescriptorBuilder.newBuilder(tableName);<a name="line.742"></a>
+<span class="sourceLineNo">743</span>    ColumnFamilyDescriptorBuilder cfBuilder = ColumnFamilyDescriptorBuilder.newBuilder(FAMILY);<a name="line.743"></a>
+<span class="sourceLineNo">744</span>    tdBuilder.setColumnFamily(cfBuilder.build());<a name="line.744"></a>
+<span class="sourceLineNo">745</span>    tdBuilder.setCoprocessor(SimpleRegionObserver.class.getName());<a name="line.745"></a>
+<span class="sourceLineNo">746</span>    TableDescriptor td = tdBuilder.build();<a name="line.746"></a>
+<span class="sourceLineNo">747</span>    Table table = util.createTable(td, new byte[][] { A, B, C });<a name="line.747"></a>
+<span class="sourceLineNo">748</span><a name="line.748"></a>
+<span class="sourceLineNo">749</span>    PreWALAppendWALActionsListener listener = new PreWALAppendWALActionsListener();<a name="line.749"></a>
+<span class="sourceLineNo">750</span>    List&lt;HRegion&gt; regions = util.getHBaseCluster().getRegions(tableName);<a name="line.750"></a>
+<span class="sourceLineNo">751</span>    //should be only one region<a name="line.751"></a>
+<span class="sourceLineNo">752</span>    HRegion region = regions.get(0);<a name="line.752"></a>
+<span class="sourceLineNo">753</span><a name="line.753"></a>
+<span class="sourceLineNo">754</span>    region.getWAL().registerWALActionsListener(listener);<a name="line.754"></a>
+<span class="sourceLineNo">755</span>    //flushing should write to the WAL<a name="line.755"></a>
+<span class="sourceLineNo">756</span>    region.flush(true);<a name="line.756"></a>
+<span class="sourceLineNo">757</span>    //so should compaction<a name="line.757"></a>
+<span class="sourceLineNo">758</span>    region.compact(false);<a name="line.758"></a>
+<span class="sourceLineNo">759</span>    //and so should closing the region<a name="line.759"></a>
+<span class="sourceLineNo">760</span>    region.close();<a name="line.760"></a>
+<span class="sourceLineNo">761</span><a name="line.761"></a>
+<span class="sourceLineNo">762</span>    //but we still shouldn't have triggered preWALAppend because no user data was written<a name="line.762"></a>
+<span class="sourceLineNo">763</span>    String[] methods = new String[] {"getCtPreWALAppend"};<a name="line.763"></a>
+<span class="sourceLineNo">764</span>    Object[] expectedResult = new Integer[]{0};<a name="line.764"></a>
+<span class="sourceLineNo">765</span>    verifyMethodResult(SimpleRegionObserver.class, methods, tableName, expectedResult);<a name="line.765"></a>
+<span class="sourceLineNo">766</span>  }<a name="line.766"></a>
+<span class="sourceLineNo">767</span><a name="line.767"></a>
+<span class="sourceLineNo">768</span>  // check each region whether the coprocessor upcalls are called or not.<a name="line.768"></a>
+<span class="sourceLineNo">769</span>  private void verifyMethodResult(Class&lt;?&gt; coprocessor, String methodName[], TableName tableName,<a name="line.769"></a>
+<span class="sourceLineNo">770</span>      Object value[]) throws IOException {<a name="line.770"></a>
+<span class="sourceLineNo">771</span>    try {<a name="line.771"></a>
+<span class="sourceLineNo">772</span>      for (JVMClusterUtil.RegionServerThread t : cluster.getRegionServerThreads()) {<a name="line.772"></a>
+<span class="sourceLineNo">773</span>        if (!t.isAlive() || t.getRegionServer().isAborted() || t.getRegionServer().isStopping()) {<a name="line.773"></a>
+<span class="sourceLineNo">774</span>          continue;<a name="line.774"></a>
+<span class="sourceLineNo">775</span>        }<a name="line.775"></a>
+<span class="sourceLineNo">776</span>        for (RegionInfo r : ProtobufUtil<a name="line.776"></a>
+<span class="sourceLineNo">777</span>            .getOnlineRegions(t.getRegionServer().getRSRpcServices())) {<a name="line.777"></a>
+<span class="sourceLineNo">778</span>          if (!r.getTable().equals(tableName)) {<a name="line.778"></a>
+<span class="sourceLineNo">779</span>            continue;<a name="line.779"></a>
+<span class="sourceLineNo">780</span>          }<a name="line.780"></a>
+<span class="sourceLineNo">781</span>          RegionCoprocessorHost cph =<a name="line.781"></a>
+<span class="sourceLineNo">782</span>              t.getRegionServer().getOnlineRegion(r.getRegionName()).getCoprocessorHost();<a name="line.782"></a>
+<span class="sourceLineNo">783</span><a name="line.783"></a>
+<span class="sourceLineNo">784</span>          Coprocessor cp = cph.findCoprocessor(coprocessor.getName());<a name="line.784"></a>
+<span class="sourceLineNo">785</span>          assertNotNull(cp);<a name="line.785"></a>
+<span class="sourceLineNo">786</span>          for (int i = 0; i &lt; methodName.length; ++i) {<a name="line.786"></a>
+<span class="sourceLineNo">787</span>            Method m = coprocessor.getMethod(methodName[i]);<a name="line.787"></a>
+<span class="sourceLineNo">788</span>            Object o = m.invoke(cp);<a name="line.788"></a>
+<span class="sourceLineNo">789</span>            assertTrue("Result of " + coprocessor.getName() + "." + methodName[i]<a name="line.789"></a>
+<span class="sourceLineNo">790</span>                    + " is expected to be " + value[i].toString() + ", while we get "<a name="line.790"></a>
+<span class="sourceLineNo">791</span>                    + o.toString(), o.equals(value[i]));<a name="line.791"></a>
+<span class="sourceLineNo">792</span>          }<a name="line.792"></a>
+<span class="sourceLineNo">793</span>        }<a name="line.793"></a>
+<span class="sourceLineNo">794</span>      }<a name="line.794"></a>
+<span class="sourceLineNo">795</span>    } catch (Exception e) {<a name="line.795"></a>
+<span class="sourceLineNo">796</span>      throw new IOException(e.toString());<a name="line.796"></a>
+<span class="sourceLineNo">797</span>    }<a name="line.797"></a>
+<span class="sourceLineNo">798</span>  }<a name="line.798"></a>
+<span class="sourceLineNo">799</span><a name="line.799"></a>
+<span class="sourceLineNo">800</span>  private static void createHFile(Configuration conf, FileSystem fs, Path path, byte[] family,<a name="line.800"></a>
+<span class="sourceLineNo">801</span>      byte[] qualifier) throws IOException {<a name="line.801"></a>
+<span class="sourceLineNo">802</span>    HFileContext context = new HFileContextBuilder().build();<a name="line.802"></a>
+<span class="sourceLineNo">803</span>    HFile.Writer writer = HFile.getWriterFactory(conf, new CacheConfig(conf)).withPath(fs, path)<a name="line.803"></a>
+<span class="sourceLineNo">804</span>        .withFileContext(context).create();<a name="line.804"></a>
+<span class="sourceLineNo">805</span>    long now = System.currentTimeMillis();<a name="line.805"></a>
+<span class="sourceLineNo">806</span>    try {<a name="line.806"></a>
+<span class="sourceLineNo">807</span>      for (int i = 1; i &lt;= 9; i++) {<a name="line.807"></a>
+<span class="sourceLineNo">808</span>        KeyValue kv =<a name="line.808"></a>
+<span class="sourceLineNo">809</span>            new KeyValue(Bytes.toBytes(i + ""), family, qualifier, now, Bytes.toBytes(i + ""));<a name="line.809"></a>
+<span class="sourceLineNo">810</span>        writer.append(kv);<a name="line.810"></a>
+<span class="sourceLineNo">811</span>      }<a name="line.811"></a>
+<span class="sourceLineNo">812</span>    } finally {<a name="line.812"></a>
+<span class="sourceLineNo">813</span>      writer.close();<a name="line.813"></a>
+<span class="sourceLineNo">814</span>    }<a name="line.814"></a>
+<span class="sourceLineNo">815</span>  }<a name="line.815"></a>
+<span class="sourceLineNo">816</span><a name="line.816"></a>
+<span class="sourceLineNo">817</span>  private static class PreWALAppendWALActionsListener implements WALActionsListener {<a name="line.817"></a>
+<span class="sourceLineNo">818</span>    boolean[] walKeysCorrect = {false, false, false, false};<a name="line.818"></a>
+<span class="sourceLineNo">819</span><a name="line.819"></a>
+<span class="sourceLineNo">820</span>    @Override<a name="line.820"></a>
+<span class="sourceLineNo">821</span>    public void postAppend(long entryLen, long elapsedTimeMillis,<a name="line.821"></a>
+<span class="sourceLineNo">822</span>                           WALKey logKey, WALEdit logEdit) throws IOException {<a name="line.822"></a>
+<span class="sourceLineNo">823</span>      for (int k = 0; k &lt; 4; k++) {<a name="line.823"></a>
+<span class="sourceLineNo">824</span>        if (!walKeysCorrect[k]) {<a name="line.824"></a>
+<span class="sourceLineNo">825</span>          walKeysCorrect[k] = Arrays.equals(SimpleRegionObserver.WAL_EXTENDED_ATTRIBUTE_BYTES,<a name="line.825"></a>
+<span class="sourceLineNo">826</span>              logKey.getExtendedAttribute(Integer.toString(k + 1)));<a name="line.826"></a>
+<span class="sourceLineNo">827</span>        }<a name="line.827"></a>
+<span class="sourceLineNo">828</span>      }<a name="line.828"></a>
+<span class="sourceLineNo">829</span>    }<a name="line.829"></a>
+<span class="sourceLineNo">830</span><a name="line.830"></a>
+<span class="sourceLineNo">831</span>    boolean[] getWalKeysCorrectArray() {<a name="line.831"></a>
+<span class="sourceLineNo">832</span>      return walKeysCorrect;<a name="line.832"></a>
+<span class="sourceLineNo">833</span>    }<a name="line.833"></a>
+<span class="sourceLineNo">834</span>  }<a name="line.834"></a>
+<span class="sourceLineNo">835</span>}<a name="line.835"></a>
 
 
 
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Appender.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Appender.html
index ddde350..77be719 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Appender.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Appender.html
@@ -112,68 +112,68 @@
 <span class="sourceLineNo">104</span>import org.apache.hadoop.hbase.Waiter;<a name="line.104"></a>
 <span class="sourceLineNo">105</span>import org.apache.hadoop.hbase.client.Append;<a name="line.105"></a>
 <span class="sourceLineNo">106</span>import org.apache.hadoop.hbase.client.ColumnFamilyDescriptor;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.apache.hadoop.hbase.client.Get;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.110"></a>
-<span class="sourceLineNo">111</span>import org.apache.hadoop.hbase.client.Mutation;<a name="line.111"></a>
-<span class="sourceLineNo">112</span>import org.apache.hadoop.hbase.client.Put;<a name="line.112"></a>
-<span class="sourceLineNo">113</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.113"></a>
-<span class="sourceLineNo">114</span>import org.apache.hadoop.hbase.client.RegionInfoBuilder;<a name="line.114"></a>
-<span class="sourceLineNo">115</span>import org.apache.hadoop.hbase.client.Result;<a name="line.115"></a>
-<span class="sourceLineNo">116</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.116"></a>
-<span class="sourceLineNo">117</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.117"></a>
-<span class="sourceLineNo">118</span>import org.apache.hadoop.hbase.client.Table;<a name="line.118"></a>
-<span class="sourceLineNo">119</span>import org.apache.hadoop.hbase.client.TableDescriptor;<a name="line.119"></a>
-<span class="sourceLineNo">120</span>import org.apache.hadoop.hbase.coprocessor.CoprocessorHost;<a name="line.120"></a>
-<span class="sourceLineNo">121</span>import org.apache.hadoop.hbase.exceptions.FailedSanityCheckException;<a name="line.121"></a>
-<span class="sourceLineNo">122</span>import org.apache.hadoop.hbase.filter.BigDecimalComparator;<a name="line.122"></a>
-<span class="sourceLineNo">123</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.123"></a>
-<span class="sourceLineNo">124</span>import org.apache.hadoop.hbase.filter.ColumnCountGetFilter;<a name="line.124"></a>
-<span class="sourceLineNo">125</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.125"></a>
-<span class="sourceLineNo">126</span>import org.apache.hadoop.hbase.filter.FilterBase;<a name="line.126"></a>
-<span class="sourceLineNo">127</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.127"></a>
-<span class="sourceLineNo">128</span>import org.apache.hadoop.hbase.filter.NullComparator;<a name="line.128"></a>
-<span class="sourceLineNo">129</span>import org.apache.hadoop.hbase.filter.PrefixFilter;<a name="line.129"></a>
-<span class="sourceLineNo">130</span>import org.apache.hadoop.hbase.filter.SingleColumnValueExcludeFilter;<a name="line.130"></a>
-<span class="sourceLineNo">131</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.131"></a>
-<span class="sourceLineNo">132</span>import org.apache.hadoop.hbase.filter.SubstringComparator;<a name="line.132"></a>
-<span class="sourceLineNo">133</span>import org.apache.hadoop.hbase.filter.ValueFilter;<a name="line.133"></a>
-<span class="sourceLineNo">134</span>import org.apache.hadoop.hbase.io.hfile.HFile;<a name="line.134"></a>
-<span class="sourceLineNo">135</span>import org.apache.hadoop.hbase.monitoring.MonitoredRPCHandler;<a name="line.135"></a>
-<span class="sourceLineNo">136</span>import org.apache.hadoop.hbase.monitoring.MonitoredTask;<a name="line.136"></a>
-<span class="sourceLineNo">137</span>import org.apache.hadoop.hbase.monitoring.TaskMonitor;<a name="line.137"></a>
-<span class="sourceLineNo">138</span>import org.apache.hadoop.hbase.regionserver.HRegion.MutationBatchOperation;<a name="line.138"></a>
-<span class="sourceLineNo">139</span>import org.apache.hadoop.hbase.regionserver.HRegion.RegionScannerImpl;<a name="line.139"></a>
-<span class="sourceLineNo">140</span>import org.apache.hadoop.hbase.regionserver.Region.RowLock;<a name="line.140"></a>
-<span class="sourceLineNo">141</span>import org.apache.hadoop.hbase.regionserver.TestHStore.FaultyFileSystem;<a name="line.141"></a>
-<span class="sourceLineNo">142</span>import org.apache.hadoop.hbase.regionserver.compactions.CompactionRequestImpl;<a name="line.142"></a>
-<span class="sourceLineNo">143</span>import org.apache.hadoop.hbase.regionserver.wal.FSHLog;<a name="line.143"></a>
-<span class="sourceLineNo">144</span>import org.apache.hadoop.hbase.regionserver.wal.MetricsWALSource;<a name="line.144"></a>
-<span class="sourceLineNo">145</span>import org.apache.hadoop.hbase.regionserver.wal.WALUtil;<a name="line.145"></a>
-<span class="sourceLineNo">146</span>import org.apache.hadoop.hbase.replication.regionserver.ReplicationObserver;<a name="line.146"></a>
-<span class="sourceLineNo">147</span>import org.apache.hadoop.hbase.security.User;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>import org.apache.hadoop.hbase.test.MetricsAssertHelper;<a name="line.148"></a>
-<span class="sourceLineNo">149</span>import org.apache.hadoop.hbase.testclassification.LargeTests;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>import org.apache.hadoop.hbase.testclassification.VerySlowRegionServerTests;<a name="line.150"></a>
-<span class="sourceLineNo">151</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.151"></a>
-<span class="sourceLineNo">152</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.152"></a>
-<span class="sourceLineNo">153</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManagerTestHelper;<a name="line.153"></a>
-<span class="sourceLineNo">154</span>import org.apache.hadoop.hbase.util.FSUtils;<a name="line.154"></a>
-<span class="sourceLineNo">155</span>import org.apache.hadoop.hbase.util.IncrementingEnvironmentEdge;<a name="line.155"></a>
-<span class="sourceLineNo">156</span>import org.apache.hadoop.hbase.util.ManualEnvironmentEdge;<a name="line.156"></a>
-<span class="sourceLineNo">157</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.157"></a>
-<span class="sourceLineNo">158</span>import org.apache.hadoop.hbase.wal.AbstractFSWALProvider;<a name="line.158"></a>
-<span class="sourceLineNo">159</span>import org.apache.hadoop.hbase.wal.FaultyFSLog;<a name="line.159"></a>
-<span class="sourceLineNo">160</span>import org.apache.hadoop.hbase.wal.NettyAsyncFSWALConfigHelper;<a name="line.160"></a>
-<span class="sourceLineNo">161</span>import org.apache.hadoop.hbase.wal.WAL;<a name="line.161"></a>
-<span class="sourceLineNo">162</span>import org.apache.hadoop.hbase.wal.WALEdit;<a name="line.162"></a>
-<span class="sourceLineNo">163</span>import org.apache.hadoop.hbase.wal.WALFactory;<a name="line.163"></a>
-<span class="sourceLineNo">164</span>import org.apache.hadoop.hbase.wal.WALKeyImpl;<a name="line.164"></a>
-<span class="sourceLineNo">165</span>import org.apache.hadoop.hbase.wal.WALProvider;<a name="line.165"></a>
-<span class="sourceLineNo">166</span>import org.apache.hadoop.hbase.wal.WALProvider.Writer;<a name="line.166"></a>
-<span class="sourceLineNo">167</span>import org.apache.hadoop.hbase.wal.WALSplitUtil;<a name="line.167"></a>
-<span class="sourceLineNo">168</span>import org.apache.hadoop.hbase.wal.WALSplitter;<a name="line.168"></a>
+<span class="sourceLineNo">107</span>import org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>import org.apache.hadoop.hbase.client.Get;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.111"></a>
+<span class="sourceLineNo">112</span>import org.apache.hadoop.hbase.client.Mutation;<a name="line.112"></a>
+<span class="sourceLineNo">113</span>import org.apache.hadoop.hbase.client.Put;<a name="line.113"></a>
+<span class="sourceLineNo">114</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.114"></a>
+<span class="sourceLineNo">115</span>import org.apache.hadoop.hbase.client.RegionInfoBuilder;<a name="line.115"></a>
+<span class="sourceLineNo">116</span>import org.apache.hadoop.hbase.client.Result;<a name="line.116"></a>
+<span class="sourceLineNo">117</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.117"></a>
+<span class="sourceLineNo">118</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.118"></a>
+<span class="sourceLineNo">119</span>import org.apache.hadoop.hbase.client.Table;<a name="line.119"></a>
+<span class="sourceLineNo">120</span>import org.apache.hadoop.hbase.client.TableDescriptor;<a name="line.120"></a>
+<span class="sourceLineNo">121</span>import org.apache.hadoop.hbase.coprocessor.CoprocessorHost;<a name="line.121"></a>
+<span class="sourceLineNo">122</span>import org.apache.hadoop.hbase.exceptions.FailedSanityCheckException;<a name="line.122"></a>
+<span class="sourceLineNo">123</span>import org.apache.hadoop.hbase.filter.BigDecimalComparator;<a name="line.123"></a>
+<span class="sourceLineNo">124</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.124"></a>
+<span class="sourceLineNo">125</span>import org.apache.hadoop.hbase.filter.ColumnCountGetFilter;<a name="line.125"></a>
+<span class="sourceLineNo">126</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.126"></a>
+<span class="sourceLineNo">127</span>import org.apache.hadoop.hbase.filter.FilterBase;<a name="line.127"></a>
+<span class="sourceLineNo">128</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.128"></a>
+<span class="sourceLineNo">129</span>import org.apache.hadoop.hbase.filter.NullComparator;<a name="line.129"></a>
+<span class="sourceLineNo">130</span>import org.apache.hadoop.hbase.filter.PrefixFilter;<a name="line.130"></a>
+<span class="sourceLineNo">131</span>import org.apache.hadoop.hbase.filter.SingleColumnValueExcludeFilter;<a name="line.131"></a>
+<span class="sourceLineNo">132</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.132"></a>
+<span class="sourceLineNo">133</span>import org.apache.hadoop.hbase.filter.SubstringComparator;<a name="line.133"></a>
+<span class="sourceLineNo">134</span>import org.apache.hadoop.hbase.filter.ValueFilter;<a name="line.134"></a>
+<span class="sourceLineNo">135</span>import org.apache.hadoop.hbase.io.hfile.HFile;<a name="line.135"></a>
+<span class="sourceLineNo">136</span>import org.apache.hadoop.hbase.monitoring.MonitoredRPCHandler;<a name="line.136"></a>
+<span class="sourceLineNo">137</span>import org.apache.hadoop.hbase.monitoring.MonitoredTask;<a name="line.137"></a>
+<span class="sourceLineNo">138</span>import org.apache.hadoop.hbase.monitoring.TaskMonitor;<a name="line.138"></a>
+<span class="sourceLineNo">139</span>import org.apache.hadoop.hbase.regionserver.HRegion.MutationBatchOperation;<a name="line.139"></a>
+<span class="sourceLineNo">140</span>import org.apache.hadoop.hbase.regionserver.HRegion.RegionScannerImpl;<a name="line.140"></a>
+<span class="sourceLineNo">141</span>import org.apache.hadoop.hbase.regionserver.Region.RowLock;<a name="line.141"></a>
+<span class="sourceLineNo">142</span>import org.apache.hadoop.hbase.regionserver.TestHStore.FaultyFileSystem;<a name="line.142"></a>
+<span class="sourceLineNo">143</span>import org.apache.hadoop.hbase.regionserver.compactions.CompactionRequestImpl;<a name="line.143"></a>
+<span class="sourceLineNo">144</span>import org.apache.hadoop.hbase.regionserver.wal.FSHLog;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>import org.apache.hadoop.hbase.regionserver.wal.MetricsWALSource;<a name="line.145"></a>
+<span class="sourceLineNo">146</span>import org.apache.hadoop.hbase.regionserver.wal.WALUtil;<a name="line.146"></a>
+<span class="sourceLineNo">147</span>import org.apache.hadoop.hbase.replication.regionserver.ReplicationObserver;<a name="line.147"></a>
+<span class="sourceLineNo">148</span>import org.apache.hadoop.hbase.security.User;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>import org.apache.hadoop.hbase.test.MetricsAssertHelper;<a name="line.149"></a>
+<span class="sourceLineNo">150</span>import org.apache.hadoop.hbase.testclassification.LargeTests;<a name="line.150"></a>
+<span class="sourceLineNo">151</span>import org.apache.hadoop.hbase.testclassification.VerySlowRegionServerTests;<a name="line.151"></a>
+<span class="sourceLineNo">152</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.152"></a>
+<span class="sourceLineNo">153</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.153"></a>
+<span class="sourceLineNo">154</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManagerTestHelper;<a name="line.154"></a>
+<span class="sourceLineNo">155</span>import org.apache.hadoop.hbase.util.FSUtils;<a name="line.155"></a>
+<span class="sourceLineNo">156</span>import org.apache.hadoop.hbase.util.IncrementingEnvironmentEdge;<a name="line.156"></a>
+<span class="sourceLineNo">157</span>import org.apache.hadoop.hbase.util.ManualEnvironmentEdge;<a name="line.157"></a>
+<span class="sourceLineNo">158</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.158"></a>
+<span class="sourceLineNo">159</span>import org.apache.hadoop.hbase.wal.AbstractFSWALProvider;<a name="line.159"></a>
+<span class="sourceLineNo">160</span>import org.apache.hadoop.hbase.wal.FaultyFSLog;<a name="line.160"></a>
+<span class="sourceLineNo">161</span>import org.apache.hadoop.hbase.wal.NettyAsyncFSWALConfigHelper;<a name="line.161"></a>
+<span class="sourceLineNo">162</span>import org.apache.hadoop.hbase.wal.WAL;<a name="line.162"></a>
+<span class="sourceLineNo">163</span>import org.apache.hadoop.hbase.wal.WALEdit;<a name="line.163"></a>
+<span class="sourceLineNo">164</span>import org.apache.hadoop.hbase.wal.WALFactory;<a name="line.164"></a>
+<span class="sourceLineNo">165</span>import org.apache.hadoop.hbase.wal.WALKeyImpl;<a name="line.165"></a>
+<span class="sourceLineNo">166</span>import org.apache.hadoop.hbase.wal.WALProvider;<a name="line.166"></a>
+<span class="sourceLineNo">167</span>import org.apache.hadoop.hbase.wal.WALProvider.Writer;<a name="line.167"></a>
+<span class="sourceLineNo">168</span>import org.apache.hadoop.hbase.wal.WALSplitUtil;<a name="line.168"></a>
 <span class="sourceLineNo">169</span>import org.apache.hadoop.metrics2.MetricsExecutor;<a name="line.169"></a>
 <span class="sourceLineNo">170</span>import org.junit.After;<a name="line.170"></a>
 <span class="sourceLineNo">171</span>import org.junit.Assert;<a name="line.171"></a>
@@ -409,6007 +409,6017 @@
 <span class="sourceLineNo">401</span>    String testName = "testMemstoreSizeAccountingWithFailedPostBatchMutate";<a name="line.401"></a>
 <span class="sourceLineNo">402</span>    FileSystem fs = FileSystem.get(CONF);<a name="line.402"></a>
 <span class="sourceLineNo">403</span>    Path rootDir = new Path(dir + testName);<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    FSHLog hLog = new FSHLog(fs, rootDir, testName, CONF);<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    hLog.init();<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, hLog,<a name="line.406"></a>
-<span class="sourceLineNo">407</span>        COLUMN_FAMILY_BYTES);<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    assertEquals(0, region.getMemStoreDataSize());<a name="line.409"></a>
-<span class="sourceLineNo">410</span><a name="line.410"></a>
-<span class="sourceLineNo">411</span>    // Put one value<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    byte [] value = Bytes.toBytes(method);<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    Put put = new Put(value);<a name="line.413"></a>
-<span class="sourceLineNo">414</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.414"></a>
-<span class="sourceLineNo">415</span>    region.put(put);<a name="line.415"></a>
-<span class="sourceLineNo">416</span>    long onePutSize = region.getMemStoreDataSize();<a name="line.416"></a>
-<span class="sourceLineNo">417</span>    assertTrue(onePutSize &gt; 0);<a name="line.417"></a>
-<span class="sourceLineNo">418</span><a name="line.418"></a>
-<span class="sourceLineNo">419</span>    RegionCoprocessorHost mockedCPHost = Mockito.mock(RegionCoprocessorHost.class);<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    doThrow(new IOException())<a name="line.420"></a>
-<span class="sourceLineNo">421</span>       .when(mockedCPHost).postBatchMutate(Mockito.&lt;MiniBatchOperationInProgress&lt;Mutation&gt;&gt;any());<a name="line.421"></a>
-<span class="sourceLineNo">422</span>    region.setCoprocessorHost(mockedCPHost);<a name="line.422"></a>
-<span class="sourceLineNo">423</span><a name="line.423"></a>
-<span class="sourceLineNo">424</span>    put = new Put(value);<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("dfg"), value);<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    try {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      region.put(put);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>      fail("Should have failed with IOException");<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    } catch (IOException expected) {<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    }<a name="line.430"></a>
-<span class="sourceLineNo">431</span>    long expectedSize = onePutSize * 2;<a name="line.431"></a>
-<span class="sourceLineNo">432</span>    assertEquals("memstoreSize should be incremented",<a name="line.432"></a>
-<span class="sourceLineNo">433</span>        expectedSize, region.getMemStoreDataSize());<a name="line.433"></a>
-<span class="sourceLineNo">434</span>    assertEquals("flushable size should be incremented",<a name="line.434"></a>
-<span class="sourceLineNo">435</span>        expectedSize, store.getFlushableSize().getDataSize());<a name="line.435"></a>
-<span class="sourceLineNo">436</span><a name="line.436"></a>
-<span class="sourceLineNo">437</span>    region.setCoprocessorHost(null);<a name="line.437"></a>
-<span class="sourceLineNo">438</span>  }<a name="line.438"></a>
-<span class="sourceLineNo">439</span><a name="line.439"></a>
-<span class="sourceLineNo">440</span>  /**<a name="line.440"></a>
-<span class="sourceLineNo">441</span>   * A test case of HBASE-21041<a name="line.441"></a>
-<span class="sourceLineNo">442</span>   * @throws Exception Exception<a name="line.442"></a>
-<span class="sourceLineNo">443</span>   */<a name="line.443"></a>
-<span class="sourceLineNo">444</span>  @Test<a name="line.444"></a>
-<span class="sourceLineNo">445</span>  public void testFlushAndMemstoreSizeCounting() throws Exception {<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    byte[] family = Bytes.toBytes("family");<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.447"></a>
-<span class="sourceLineNo">448</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.448"></a>
-<span class="sourceLineNo">449</span>    try {<a name="line.449"></a>
-<span class="sourceLineNo">450</span>      for (byte[] row : HBaseTestingUtility.ROWS) {<a name="line.450"></a>
-<span class="sourceLineNo">451</span>        Put put = new Put(row);<a name="line.451"></a>
-<span class="sourceLineNo">452</span>        put.addColumn(family, family, row);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>        region.put(put);<a name="line.453"></a>
-<span class="sourceLineNo">454</span>      }<a name="line.454"></a>
-<span class="sourceLineNo">455</span>      region.flush(true);<a name="line.455"></a>
-<span class="sourceLineNo">456</span>      // After flush, data size should be zero<a name="line.456"></a>
-<span class="sourceLineNo">457</span>      assertEquals(0, region.getMemStoreDataSize());<a name="line.457"></a>
-<span class="sourceLineNo">458</span>      // After flush, a new active mutable segment is created, so the heap size<a name="line.458"></a>
-<span class="sourceLineNo">459</span>      // should equal to MutableSegment.DEEP_OVERHEAD<a name="line.459"></a>
-<span class="sourceLineNo">460</span>      assertEquals(MutableSegment.DEEP_OVERHEAD, region.getMemStoreHeapSize());<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      // After flush, offheap should be zero<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      assertEquals(0, region.getMemStoreOffHeapSize());<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    } finally {<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.464"></a>
-<span class="sourceLineNo">465</span>      this.region = null;<a name="line.465"></a>
-<span class="sourceLineNo">466</span>      wals.close();<a name="line.466"></a>
-<span class="sourceLineNo">467</span>    }<a name="line.467"></a>
-<span class="sourceLineNo">468</span>  }<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>   * Test we do not lose data if we fail a flush and then close.<a name="line.471"></a>
-<span class="sourceLineNo">472</span>   * Part of HBase-10466.  Tests the following from the issue description:<a name="line.472"></a>
-<span class="sourceLineNo">473</span>   * "Bug 1: Wrong calculation of HRegion.memstoreSize: When a flush fails, data to be flushed is<a name="line.473"></a>
-<span class="sourceLineNo">474</span>   * kept in each MemStore's snapshot and wait for next flush attempt to continue on it. But when<a name="line.474"></a>
-<span class="sourceLineNo">475</span>   * the next flush succeeds, the counter of total memstore size in HRegion is always deduced by<a name="line.475"></a>
-<span class="sourceLineNo">476</span>   * the sum of current memstore sizes instead of snapshots left from previous failed flush. This<a name="line.476"></a>
-<span class="sourceLineNo">477</span>   * calculation is problematic that almost every time there is failed flush, HRegion.memstoreSize<a name="line.477"></a>
-<span class="sourceLineNo">478</span>   * gets reduced by a wrong value. If region flush could not proceed for a couple cycles, the size<a name="line.478"></a>
-<span class="sourceLineNo">479</span>   * in current memstore could be much larger than the snapshot. It's likely to drift memstoreSize<a name="line.479"></a>
-<span class="sourceLineNo">480</span>   * much smaller than expected. In extreme case, if the error accumulates to even bigger than<a name="line.480"></a>
-<span class="sourceLineNo">481</span>   * HRegion's memstore size limit, any further flush is skipped because flush does not do anything<a name="line.481"></a>
-<span class="sourceLineNo">482</span>   * if memstoreSize is not larger than 0."<a name="line.482"></a>
-<span class="sourceLineNo">483</span>   * @throws Exception<a name="line.483"></a>
-<span class="sourceLineNo">484</span>   */<a name="line.484"></a>
-<span class="sourceLineNo">485</span>  @Test<a name="line.485"></a>
-<span class="sourceLineNo">486</span>  public void testFlushSizeAccounting() throws Exception {<a name="line.486"></a>
-<span class="sourceLineNo">487</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    // Only retry once.<a name="line.489"></a>
-<span class="sourceLineNo">490</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.490"></a>
-<span class="sourceLineNo">491</span>    final User user =<a name="line.491"></a>
-<span class="sourceLineNo">492</span>      User.createUserForTesting(conf, method, new String[]{"foo"});<a name="line.492"></a>
-<span class="sourceLineNo">493</span>    // Inject our faulty LocalFileSystem<a name="line.493"></a>
-<span class="sourceLineNo">494</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.494"></a>
-<span class="sourceLineNo">495</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.495"></a>
-<span class="sourceLineNo">496</span>      @Override<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      public Object run() throws Exception {<a name="line.497"></a>
-<span class="sourceLineNo">498</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.498"></a>
-<span class="sourceLineNo">499</span>        FileSystem fs = FileSystem.get(conf);<a name="line.499"></a>
-<span class="sourceLineNo">500</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.500"></a>
-<span class="sourceLineNo">501</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.501"></a>
-<span class="sourceLineNo">502</span>        HRegion region = null;<a name="line.502"></a>
-<span class="sourceLineNo">503</span>        try {<a name="line.503"></a>
-<span class="sourceLineNo">504</span>          // Initialize region<a name="line.504"></a>
-<span class="sourceLineNo">505</span>          region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, wal,<a name="line.505"></a>
-<span class="sourceLineNo">506</span>              COLUMN_FAMILY_BYTES);<a name="line.506"></a>
-<span class="sourceLineNo">507</span>          long size = region.getMemStoreDataSize();<a name="line.507"></a>
-<span class="sourceLineNo">508</span>          Assert.assertEquals(0, size);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.509"></a>
-<span class="sourceLineNo">510</span>          Put p1 = new Put(row);<a name="line.510"></a>
-<span class="sourceLineNo">511</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[]) null));<a name="line.511"></a>
-<span class="sourceLineNo">512</span>          region.put(p1);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>          final long sizeOfOnePut = region.getMemStoreDataSize();<a name="line.513"></a>
-<span class="sourceLineNo">514</span>          // Fail a flush which means the current memstore will hang out as memstore 'snapshot'.<a name="line.514"></a>
-<span class="sourceLineNo">515</span>          try {<a name="line.515"></a>
-<span class="sourceLineNo">516</span>            LOG.info("Flushing");<a name="line.516"></a>
-<span class="sourceLineNo">517</span>            region.flush(true);<a name="line.517"></a>
-<span class="sourceLineNo">518</span>            Assert.fail("Didn't bubble up IOE!");<a name="line.518"></a>
-<span class="sourceLineNo">519</span>          } catch (DroppedSnapshotException dse) {<a name="line.519"></a>
-<span class="sourceLineNo">520</span>            // What we are expecting<a name="line.520"></a>
-<span class="sourceLineNo">521</span>            region.closing.set(false); // this is needed for the rest of the test to work<a name="line.521"></a>
-<span class="sourceLineNo">522</span>          }<a name="line.522"></a>
-<span class="sourceLineNo">523</span>          // Make it so all writes succeed from here on out<a name="line.523"></a>
-<span class="sourceLineNo">524</span>          ffs.fault.set(false);<a name="line.524"></a>
-<span class="sourceLineNo">525</span>          // Check sizes.  Should still be the one entry.<a name="line.525"></a>
-<span class="sourceLineNo">526</span>          Assert.assertEquals(sizeOfOnePut, region.getMemStoreDataSize());<a name="line.526"></a>
-<span class="sourceLineNo">527</span>          // Now add two entries so that on this next flush that fails, we can see if we<a name="line.527"></a>
-<span class="sourceLineNo">528</span>          // subtract the right amount, the snapshot size only.<a name="line.528"></a>
-<span class="sourceLineNo">529</span>          Put p2 = new Put(row);<a name="line.529"></a>
-<span class="sourceLineNo">530</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.530"></a>
-<span class="sourceLineNo">531</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.531"></a>
-<span class="sourceLineNo">532</span>          region.put(p2);<a name="line.532"></a>
-<span class="sourceLineNo">533</span>          long expectedSize = sizeOfOnePut * 3;<a name="line.533"></a>
-<span class="sourceLineNo">534</span>          Assert.assertEquals(expectedSize, region.getMemStoreDataSize());<a name="line.534"></a>
-<span class="sourceLineNo">535</span>          // Do a successful flush.  It will clear the snapshot only.  Thats how flushes work.<a name="line.535"></a>
-<span class="sourceLineNo">536</span>          // If already a snapshot, we clear it else we move the memstore to be snapshot and flush<a name="line.536"></a>
-<span class="sourceLineNo">537</span>          // it<a name="line.537"></a>
-<span class="sourceLineNo">538</span>          region.flush(true);<a name="line.538"></a>
-<span class="sourceLineNo">539</span>          // Make sure our memory accounting is right.<a name="line.539"></a>
-<span class="sourceLineNo">540</span>          Assert.assertEquals(sizeOfOnePut * 2, region.getMemStoreDataSize());<a name="line.540"></a>
-<span class="sourceLineNo">541</span>        } finally {<a name="line.541"></a>
-<span class="sourceLineNo">542</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.542"></a>
-<span class="sourceLineNo">543</span>        }<a name="line.543"></a>
-<span class="sourceLineNo">544</span>        return null;<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>    FileSystem.closeAllForUGI(user.getUGI());<a name="line.547"></a>
-<span class="sourceLineNo">548</span>  }<a name="line.548"></a>
-<span class="sourceLineNo">549</span><a name="line.549"></a>
-<span class="sourceLineNo">550</span>  @Test<a name="line.550"></a>
-<span class="sourceLineNo">551</span>  public void testCloseWithFailingFlush() throws Exception {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    // Only retry once.<a name="line.554"></a>
-<span class="sourceLineNo">555</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.555"></a>
-<span class="sourceLineNo">556</span>    final User user =<a name="line.556"></a>
-<span class="sourceLineNo">557</span>      User.createUserForTesting(conf, this.method, new String[]{"foo"});<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    // Inject our faulty LocalFileSystem<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      @Override<a name="line.561"></a>
-<span class="sourceLineNo">562</span>      public Object run() throws Exception {<a name="line.562"></a>
-<span class="sourceLineNo">563</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.563"></a>
-<span class="sourceLineNo">564</span>        FileSystem fs = FileSystem.get(conf);<a name="line.564"></a>
-<span class="sourceLineNo">565</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.565"></a>
-<span class="sourceLineNo">566</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.566"></a>
-<span class="sourceLineNo">567</span>        HRegion region = null;<a name="line.567"></a>
-<span class="sourceLineNo">568</span>        try {<a name="line.568"></a>
-<span class="sourceLineNo">569</span>          // Initialize region<a name="line.569"></a>
-<span class="sourceLineNo">570</span>          region = initHRegion(tableName, null, null, false,<a name="line.570"></a>
-<span class="sourceLineNo">571</span>              Durability.SYNC_WAL, wal, COLUMN_FAMILY_BYTES);<a name="line.571"></a>
-<span class="sourceLineNo">572</span>          long size = region.getMemStoreDataSize();<a name="line.572"></a>
-<span class="sourceLineNo">573</span>          Assert.assertEquals(0, size);<a name="line.573"></a>
-<span class="sourceLineNo">574</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.574"></a>
-<span class="sourceLineNo">575</span>          Put p1 = new Put(row);<a name="line.575"></a>
-<span class="sourceLineNo">576</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[])null));<a name="line.576"></a>
-<span class="sourceLineNo">577</span>          region.put(p1);<a name="line.577"></a>
-<span class="sourceLineNo">578</span>          // Manufacture an outstanding snapshot -- fake a failed flush by doing prepare step only.<a name="line.578"></a>
-<span class="sourceLineNo">579</span>          HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>          StoreFlushContext storeFlushCtx =<a name="line.580"></a>
-<span class="sourceLineNo">581</span>              store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY);<a name="line.581"></a>
-<span class="sourceLineNo">582</span>          storeFlushCtx.prepare();<a name="line.582"></a>
-<span class="sourceLineNo">583</span>          // Now add two entries to the foreground memstore.<a name="line.583"></a>
-<span class="sourceLineNo">584</span>          Put p2 = new Put(row);<a name="line.584"></a>
-<span class="sourceLineNo">585</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.585"></a>
-<span class="sourceLineNo">586</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.586"></a>
-<span class="sourceLineNo">587</span>          region.put(p2);<a name="line.587"></a>
-<span class="sourceLineNo">588</span>          // Now try close on top of a failing flush.<a name="line.588"></a>
-<span class="sourceLineNo">589</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.589"></a>
-<span class="sourceLineNo">590</span>          region = null;<a name="line.590"></a>
-<span class="sourceLineNo">591</span>          fail();<a name="line.591"></a>
-<span class="sourceLineNo">592</span>        } catch (DroppedSnapshotException dse) {<a name="line.592"></a>
-<span class="sourceLineNo">593</span>          // Expected<a name="line.593"></a>
-<span class="sourceLineNo">594</span>          LOG.info("Expected DroppedSnapshotException");<a name="line.594"></a>
-<span class="sourceLineNo">595</span>        } finally {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>          // Make it so all writes succeed from here on out so can close clean<a name="line.596"></a>
-<span class="sourceLineNo">597</span>          ffs.fault.set(false);<a name="line.597"></a>
-<span class="sourceLineNo">598</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.598"></a>
-<span class="sourceLineNo">599</span>        }<a name="line.599"></a>
-<span class="sourceLineNo">600</span>        return null;<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      }<a name="line.601"></a>
-<span class="sourceLineNo">602</span>    });<a name="line.602"></a>
-<span class="sourceLineNo">603</span>    FileSystem.closeAllForUGI(user.getUGI());<a name="line.603"></a>
-<span class="sourceLineNo">604</span>  }<a name="line.604"></a>
-<span class="sourceLineNo">605</span><a name="line.605"></a>
-<span class="sourceLineNo">606</span>  @Test<a name="line.606"></a>
-<span class="sourceLineNo">607</span>  public void testCompactionAffectedByScanners() throws Exception {<a name="line.607"></a>
-<span class="sourceLineNo">608</span>    byte[] family = Bytes.toBytes("family");<a name="line.608"></a>
-<span class="sourceLineNo">609</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.609"></a>
-<span class="sourceLineNo">610</span><a name="line.610"></a>
-<span class="sourceLineNo">611</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.612"></a>
-<span class="sourceLineNo">613</span>    region.put(put);<a name="line.613"></a>
-<span class="sourceLineNo">614</span>    region.flush(true);<a name="line.614"></a>
-<span class="sourceLineNo">615</span><a name="line.615"></a>
-<span class="sourceLineNo">616</span>    Scan scan = new Scan();<a name="line.616"></a>
-<span class="sourceLineNo">617</span>    scan.setMaxVersions(3);<a name="line.617"></a>
-<span class="sourceLineNo">618</span>    // open the first scanner<a name="line.618"></a>
-<span class="sourceLineNo">619</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.619"></a>
-<span class="sourceLineNo">620</span><a name="line.620"></a>
-<span class="sourceLineNo">621</span>    Delete delete = new Delete(Bytes.toBytes("r1"));<a name="line.621"></a>
-<span class="sourceLineNo">622</span>    region.delete(delete);<a name="line.622"></a>
-<span class="sourceLineNo">623</span>    region.flush(true);<a name="line.623"></a>
-<span class="sourceLineNo">624</span><a name="line.624"></a>
-<span class="sourceLineNo">625</span>    // open the second scanner<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    RegionScanner scanner2 = region.getScanner(scan);<a name="line.626"></a>
-<span class="sourceLineNo">627</span><a name="line.627"></a>
-<span class="sourceLineNo">628</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.628"></a>
-<span class="sourceLineNo">629</span><a name="line.629"></a>
-<span class="sourceLineNo">630</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.630"></a>
-<span class="sourceLineNo">631</span><a name="line.631"></a>
-<span class="sourceLineNo">632</span>    // make a major compaction<a name="line.632"></a>
-<span class="sourceLineNo">633</span>    region.compact(true);<a name="line.633"></a>
-<span class="sourceLineNo">634</span><a name="line.634"></a>
-<span class="sourceLineNo">635</span>    // open the third scanner<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    RegionScanner scanner3 = region.getScanner(scan);<a name="line.636"></a>
-<span class="sourceLineNo">637</span><a name="line.637"></a>
-<span class="sourceLineNo">638</span>    // get data from scanner 1, 2, 3 after major compaction<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    scanner1.next(results);<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    System.out.println(results);<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    assertEquals(1, results.size());<a name="line.641"></a>
-<span class="sourceLineNo">642</span><a name="line.642"></a>
-<span class="sourceLineNo">643</span>    results.clear();<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    scanner2.next(results);<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    System.out.println(results);<a name="line.645"></a>
-<span class="sourceLineNo">646</span>    assertEquals(0, results.size());<a name="line.646"></a>
-<span class="sourceLineNo">647</span><a name="line.647"></a>
-<span class="sourceLineNo">648</span>    results.clear();<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    scanner3.next(results);<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    System.out.println(results);<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    assertEquals(0, results.size());<a name="line.651"></a>
-<span class="sourceLineNo">652</span>  }<a name="line.652"></a>
-<span class="sourceLineNo">653</span><a name="line.653"></a>
-<span class="sourceLineNo">654</span>  @Test<a name="line.654"></a>
-<span class="sourceLineNo">655</span>  public void testToShowNPEOnRegionScannerReseek() throws Exception {<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    byte[] family = Bytes.toBytes("family");<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.657"></a>
-<span class="sourceLineNo">658</span><a name="line.658"></a>
-<span class="sourceLineNo">659</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.659"></a>
-<span class="sourceLineNo">660</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.660"></a>
-<span class="sourceLineNo">661</span>    region.put(put);<a name="line.661"></a>
-<span class="sourceLineNo">662</span>    put = new Put(Bytes.toBytes("r2"));<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.663"></a>
-<span class="sourceLineNo">664</span>    region.put(put);<a name="line.664"></a>
-<span class="sourceLineNo">665</span>    region.flush(true);<a name="line.665"></a>
-<span class="sourceLineNo">666</span><a name="line.666"></a>
-<span class="sourceLineNo">667</span>    Scan scan = new Scan();<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    scan.setMaxVersions(3);<a name="line.668"></a>
-<span class="sourceLineNo">669</span>    // open the first scanner<a name="line.669"></a>
-<span class="sourceLineNo">670</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.670"></a>
-<span class="sourceLineNo">671</span><a name="line.671"></a>
-<span class="sourceLineNo">672</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.672"></a>
-<span class="sourceLineNo">673</span><a name="line.673"></a>
-<span class="sourceLineNo">674</span>    region.compact(true);<a name="line.674"></a>
-<span class="sourceLineNo">675</span><a name="line.675"></a>
-<span class="sourceLineNo">676</span>    scanner1.reseek(Bytes.toBytes("r2"));<a name="line.676"></a>
-<span class="sourceLineNo">677</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.677"></a>
-<span class="sourceLineNo">678</span>    scanner1.next(results);<a name="line.678"></a>
-<span class="sourceLineNo">679</span>    Cell keyValue = results.get(0);<a name="line.679"></a>
-<span class="sourceLineNo">680</span>    Assert.assertTrue(Bytes.compareTo(CellUtil.cloneRow(keyValue), Bytes.toBytes("r2")) == 0);<a name="line.680"></a>
-<span class="sourceLineNo">681</span>    scanner1.close();<a name="line.681"></a>
-<span class="sourceLineNo">682</span>  }<a name="line.682"></a>
-<span class="sourceLineNo">683</span><a name="line.683"></a>
-<span class="sourceLineNo">684</span>  @Test<a name="line.684"></a>
-<span class="sourceLineNo">685</span>  public void testSkipRecoveredEditsReplay() throws Exception {<a name="line.685"></a>
-<span class="sourceLineNo">686</span>    byte[] family = Bytes.toBytes("family");<a name="line.686"></a>
-<span class="sourceLineNo">687</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.687"></a>
-<span class="sourceLineNo">688</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.688"></a>
-<span class="sourceLineNo">689</span>    try {<a name="line.689"></a>
-<span class="sourceLineNo">690</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.690"></a>
-<span class="sourceLineNo">691</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.691"></a>
-<span class="sourceLineNo">692</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.692"></a>
-<span class="sourceLineNo">693</span><a name="line.693"></a>
-<span class="sourceLineNo">694</span>      Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.694"></a>
-<span class="sourceLineNo">695</span><a name="line.695"></a>
-<span class="sourceLineNo">696</span>      long maxSeqId = 1050;<a name="line.696"></a>
-<span class="sourceLineNo">697</span>      long minSeqId = 1000;<a name="line.697"></a>
-<span class="sourceLineNo">698</span><a name="line.698"></a>
-<span class="sourceLineNo">699</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.699"></a>
-<span class="sourceLineNo">700</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.700"></a>
-<span class="sourceLineNo">701</span>        fs.create(recoveredEdits);<a name="line.701"></a>
-<span class="sourceLineNo">702</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.702"></a>
-<span class="sourceLineNo">703</span><a name="line.703"></a>
-<span class="sourceLineNo">704</span>        long time = System.nanoTime();<a name="line.704"></a>
-<span class="sourceLineNo">705</span>        WALEdit edit = new WALEdit();<a name="line.705"></a>
-<span class="sourceLineNo">706</span>        edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.706"></a>
-<span class="sourceLineNo">707</span>            .toBytes(i)));<a name="line.707"></a>
-<span class="sourceLineNo">708</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.708"></a>
-<span class="sourceLineNo">709</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.709"></a>
-<span class="sourceLineNo">710</span><a name="line.710"></a>
-<span class="sourceLineNo">711</span>        writer.close();<a name="line.711"></a>
-<span class="sourceLineNo">712</span>      }<a name="line.712"></a>
-<span class="sourceLineNo">713</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.713"></a>
-<span class="sourceLineNo">714</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.714"></a>
-<span class="sourceLineNo">715</span>      for (HStore store : region.getStores()) {<a name="line.715"></a>
-<span class="sourceLineNo">716</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), minSeqId - 1);<a name="line.716"></a>
-<span class="sourceLineNo">717</span>      }<a name="line.717"></a>
-<span class="sourceLineNo">718</span>      long seqId = region.replayRecoveredEditsIfAny(maxSeqIdInStores, null, status);<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      assertEquals(maxSeqId, seqId);<a name="line.719"></a>
-<span class="sourceLineNo">720</span>      region.getMVCC().advanceTo(seqId);<a name="line.720"></a>
-<span class="sourceLineNo">721</span>      Get get = new Get(row);<a name="line.721"></a>
-<span class="sourceLineNo">722</span>      Result result = region.get(get);<a name="line.722"></a>
-<span class="sourceLineNo">723</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.723"></a>
-<span class="sourceLineNo">724</span>        List&lt;Cell&gt; kvs = result.getColumnCells(family, Bytes.toBytes(i));<a name="line.724"></a>
-<span class="sourceLineNo">725</span>        assertEquals(1, kvs.size());<a name="line.725"></a>
-<span class="sourceLineNo">726</span>        assertArrayEquals(Bytes.toBytes(i), CellUtil.cloneValue(kvs.get(0)));<a name="line.726"></a>
-<span class="sourceLineNo">727</span>      }<a name="line.727"></a>
-<span class="sourceLineNo">728</span>    } finally {<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      this.region = null;<a name="line.730"></a>
-<span class="sourceLineNo">731</span>      wals.close();<a name="line.731"></a>
-<span class="sourceLineNo">732</span>    }<a name="line.732"></a>
-<span class="sourceLineNo">733</span>  }<a name="line.733"></a>
-<span class="sourceLineNo">734</span><a name="line.734"></a>
-<span class="sourceLineNo">735</span>  @Test<a name="line.735"></a>
-<span class="sourceLineNo">736</span>  public void testSkipRecoveredEditsReplaySomeIgnored() throws Exception {<a name="line.736"></a>
-<span class="sourceLineNo">737</span>    byte[] family = Bytes.toBytes("family");<a name="line.737"></a>
-<span class="sourceLineNo">738</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.738"></a>
-<span class="sourceLineNo">739</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.739"></a>
-<span class="sourceLineNo">740</span>    try {<a name="line.740"></a>
-<span class="sourceLineNo">741</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.741"></a>
-<span class="sourceLineNo">742</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.742"></a>
-<span class="sourceLineNo">743</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.743"></a>
-<span class="sourceLineNo">744</span><a name="line.744"></a>
-<span class="sourceLineNo">745</span>      Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.745"></a>
-<span class="sourceLineNo">746</span><a name="line.746"></a>
-<span class="sourceLineNo">747</span>      long maxSeqId = 1050;<a name="line.747"></a>
-<span class="sourceLineNo">748</span>      long minSeqId = 1000;<a name="line.748"></a>
-<span class="sourceLineNo">749</span><a name="line.749"></a>
-<span class="sourceLineNo">750</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.750"></a>
-<span class="sourceLineNo">751</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.751"></a>
-<span class="sourceLineNo">752</span>        fs.create(recoveredEdits);<a name="line.752"></a>
-<span class="sourceLineNo">753</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.753"></a>
-<span class="sourceLineNo">754</span><a name="line.754"></a>
-<span class="sourceLineNo">755</span>        long time = System.nanoTime();<a name="line.755"></a>
-<span class="sourceLineNo">756</span>        WALEdit edit = new WALEdit();<a name="line.756"></a>
-<span class="sourceLineNo">757</span>        edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.757"></a>
-<span class="sourceLineNo">758</span>            .toBytes(i)));<a name="line.758"></a>
-<span class="sourceLineNo">759</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.759"></a>
-<span class="sourceLineNo">760</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.760"></a>
-<span class="sourceLineNo">761</span><a name="line.761"></a>
-<span class="sourceLineNo">762</span>        writer.close();<a name="line.762"></a>
-<span class="sourceLineNo">763</span>      }<a name="line.763"></a>
-<span class="sourceLineNo">764</span>      long recoverSeqId = 1030;<a name="line.764"></a>
-<span class="sourceLineNo">765</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.766"></a>
-<span class="sourceLineNo">767</span>      for (HStore store : region.getStores()) {<a name="line.767"></a>
-<span class="sourceLineNo">768</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), recoverSeqId - 1);<a name="line.768"></a>
-<span class="sourceLineNo">769</span>      }<a name="line.769"></a>
-<span class="sourceLineNo">770</span>      long seqId = region.replayRecoveredEditsIfAny(maxSeqIdInStores, null, status);<a name="line.770"></a>
-<span class="sourceLineNo">771</span>      assertEquals(maxSeqId, seqId);<a name="line.771"></a>
-<span class="sourceLineNo">772</span>      region.getMVCC().advanceTo(seqId);<a name="line.772"></a>
-<span class="sourceLineNo">773</span>      Get get = new Get(row);<a name="line.773"></a>
-<span class="sourceLineNo">774</span>      Result result = region.get(get);<a name="line.774"></a>
-<span class="sourceLineNo">775</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.775"></a>
-<span class="sourceLineNo">776</span>        List&lt;Cell&gt; kvs = result.getColumnCells(family, Bytes.toBytes(i));<a name="line.776"></a>
-<span class="sourceLineNo">777</span>        if (i &lt; recoverSeqId) {<a name="line.777"></a>
-<span class="sourceLineNo">778</span>          assertEquals(0, kvs.size());<a name="line.778"></a>
-<span class="sourceLineNo">779</span>        } else {<a name="line.779"></a>
-<span class="sourceLineNo">780</span>          assertEquals(1, kvs.size());<a name="line.780"></a>
-<span class="sourceLineNo">781</span>          assertArrayEquals(Bytes.toBytes(i), CellUtil.cloneValue(kvs.get(0)));<a name="line.781"></a>
-<span class="sourceLineNo">782</span>        }<a name="line.782"></a>
-<span class="sourceLineNo">783</span>      }<a name="line.783"></a>
-<span class="sourceLineNo">784</span>    } finally {<a name="line.784"></a>
-<span class="sourceLineNo">785</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.785"></a>
-<span class="sourceLineNo">786</span>      this.region = null;<a name="line.786"></a>
-<span class="sourceLineNo">787</span>      wals.close();<a name="line.787"></a>
-<span class="sourceLineNo">788</span>    }<a name="line.788"></a>
-<span class="sourceLineNo">789</span>  }<a name="line.789"></a>
-<span class="sourceLineNo">790</span><a name="line.790"></a>
-<span class="sourceLineNo">791</span>  @Test<a name="line.791"></a>
-<span class="sourceLineNo">792</span>  public void testSkipRecoveredEditsReplayAllIgnored() throws Exception {<a name="line.792"></a>
-<span class="sourceLineNo">793</span>    byte[] family = Bytes.toBytes("family");<a name="line.793"></a>
-<span class="sourceLineNo">794</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.794"></a>
-<span class="sourceLineNo">795</span>    Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.795"></a>
-<span class="sourceLineNo">796</span>    FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.796"></a>
-<span class="sourceLineNo">797</span><a name="line.797"></a>
-<span class="sourceLineNo">798</span>    Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.798"></a>
-<span class="sourceLineNo">799</span>    for (int i = 1000; i &lt; 1050; i += 10) {<a name="line.799"></a>
-<span class="sourceLineNo">800</span>      Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.800"></a>
-<span class="sourceLineNo">801</span>      FSDataOutputStream dos = fs.create(recoveredEdits);<a name="line.801"></a>
-<span class="sourceLineNo">802</span>      dos.writeInt(i);<a name="line.802"></a>
-<span class="sourceLineNo">803</span>      dos.close();<a name="line.803"></a>
-<span class="sourceLineNo">804</span>    }<a name="line.804"></a>
-<span class="sourceLineNo">805</span>    long minSeqId = 2000;<a name="line.805"></a>
-<span class="sourceLineNo">806</span>    Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", minSeqId - 1));<a name="line.806"></a>
-<span class="sourceLineNo">807</span>    FSDataOutputStream dos = fs.create(recoveredEdits);<a name="line.807"></a>
-<span class="sourceLineNo">808</span>    dos.close();<a name="line.808"></a>
-<span class="sourceLineNo">809</span><a name="line.809"></a>
-<span class="sourceLineNo">810</span>    Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.810"></a>
-<span class="sourceLineNo">811</span>    for (HStore store : region.getStores()) {<a name="line.811"></a>
-<span class="sourceLineNo">812</span>      maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), minSeqId);<a name="line.812"></a>
-<span class="sourceLineNo">813</span>    }<a name="line.813"></a>
-<span class="sourceLineNo">814</span>    long seqId = region.replayRecoveredEditsIfAny(maxSeqIdInStores, null, null);<a name="line.814"></a>
-<span class="sourceLineNo">815</span>    assertEquals(minSeqId, seqId);<a name="line.815"></a>
-<span class="sourceLineNo">816</span>  }<a name="line.816"></a>
-<span class="sourceLineNo">817</span><a name="line.817"></a>
-<span class="sourceLineNo">818</span>  @Test<a name="line.818"></a>
-<span class="sourceLineNo">819</span>  public void testSkipRecoveredEditsReplayTheLastFileIgnored() throws Exception {<a name="line.819"></a>
-<span class="sourceLineNo">820</span>    byte[] family = Bytes.toBytes("family");<a name="line.820"></a>
-<span class="sourceLineNo">821</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.821"></a>
-<span class="sourceLineNo">822</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.822"></a>
-<span class="sourceLineNo">823</span>    try {<a name="line.823"></a>
-<span class="sourceLineNo">824</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.824"></a>
-<span class="sourceLineNo">825</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.825"></a>
-<span class="sourceLineNo">826</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.826"></a>
-<span class="sourceLineNo">827</span>      byte[][] columns = region.getTableDescriptor().getColumnFamilyNames().toArray(new byte[0][]);<a name="line.827"></a>
-<span class="sourceLineNo">828</span><a name="line.828"></a>
-<span class="sourceLineNo">829</span>      assertEquals(0, region.getStoreFileList(columns).size());<a name="line.829"></a>
-<span class="sourceLineNo">830</span><a name="line.830"></a>
-<span class="sourceLineNo">831</span>      Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.831"></a>
-<span class="sourceLineNo">832</span><a name="line.832"></a>
-<span class="sourceLineNo">833</span>      long maxSeqId = 1050;<a name="line.833"></a>
-<span class="sourceLineNo">834</span>      long minSeqId = 1000;<a name="line.834"></a>
-<span class="sourceLineNo">835</span><a name="line.835"></a>
-<span class="sourceLineNo">836</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.836"></a>
-<span class="sourceLineNo">837</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.837"></a>
-<span class="sourceLineNo">838</span>        fs.create(recoveredEdits);<a name="line.838"></a>
-<span class="sourceLineNo">839</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.839"></a>
-<span class="sourceLineNo">840</span><a name="line.840"></a>
-<span class="sourceLineNo">841</span>        long time = System.nanoTime();<a name="line.841"></a>
-<span class="sourceLineNo">842</span>        WALEdit edit = null;<a name="line.842"></a>
-<span class="sourceLineNo">843</span>        if (i == maxSeqId) {<a name="line.843"></a>
-<span class="sourceLineNo">844</span>          edit = WALEdit.createCompaction(region.getRegionInfo(),<a name="line.844"></a>
-<span class="sourceLineNo">845</span>          CompactionDescriptor.newBuilder()<a name="line.845"></a>
-<span class="sourceLineNo">846</span>          .setTableName(ByteString.copyFrom(tableName.getName()))<a name="line.846"></a>
-<span class="sourceLineNo">847</span>          .setFamilyName(ByteString.copyFrom(regionName))<a name="line.847"></a>
-<span class="sourceLineNo">848</span>          .setEncodedRegionName(ByteString.copyFrom(regionName))<a name="line.848"></a>
-<span class="sourceLineNo">849</span>          .setStoreHomeDirBytes(ByteString.copyFrom(Bytes.toBytes(regiondir.toString())))<a name="line.849"></a>
-<span class="sourceLineNo">850</span>          .setRegionName(ByteString.copyFrom(region.getRegionInfo().getRegionName()))<a name="line.850"></a>
-<span class="sourceLineNo">851</span>          .build());<a name="line.851"></a>
-<span class="sourceLineNo">852</span>        } else {<a name="line.852"></a>
-<span class="sourceLineNo">853</span>          edit = new WALEdit();<a name="line.853"></a>
-<span class="sourceLineNo">854</span>          edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.854"></a>
-<span class="sourceLineNo">855</span>            .toBytes(i)));<a name="line.855"></a>
-<span class="sourceLineNo">856</span>        }<a name="line.856"></a>
-<span class="sourceLineNo">857</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.857"></a>
-<span class="sourceLineNo">858</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.858"></a>
-<span class="sourceLineNo">859</span>        writer.close();<a name="line.859"></a>
-<span class="sourceLineNo">860</span>      }<a name="line.860"></a>
-<span class="sourceLineNo">861</span><a name="line.861"></a>
-<span class="sourceLineNo">862</span>      long recoverSeqId = 1030;<a name="line.862"></a>
-<span class="sourceLineNo">863</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.863"></a>
-<span class="sourceLineNo">864</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.864"></a>
-<span class="sourceLineNo">865</span>      for (HStore store : region.getStores()) {<a name="line.865"></a>
-<span class="sourceLineNo">866</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), recoverSeqId - 1);<a name="line.866"></a>
-<span class="sourceLineNo">867</span>      }<a name="line.867"></a>
-<span class="sourceLineNo">868</span>      long seqId = region.replayRecoveredEditsIfAny(maxSeqIdInStores, null, status);<a name="line.868"></a>
-<span class="sourceLineNo">869</span>      assertEquals(maxSeqId, seqId);<a name="line.869"></a>
-<span class="sourceLineNo">870</span><a name="line.870"></a>
-<span class="sourceLineNo">871</span>      // assert that the files are flushed<a name="line.871"></a>
-<span class="sourceLineNo">872</span>      assertEquals(1, region.getStoreFileList(columns).size());<a name="line.872"></a>
-<span class="sourceLineNo">873</span><a name="line.873"></a>
-<span class="sourceLineNo">874</span>    } finally {<a name="line.874"></a>
-<span class="sourceLineNo">875</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.875"></a>
-<span class="sourceLineNo">876</span>      this.region = null;<a name="line.876"></a>
-<span class="sourceLineNo">877</span>      wals.close();<a name="line.877"></a>
-<span class="sourceLineNo">878</span>    }<a name="line.878"></a>
-<span class="sourceLineNo">879</span>  }<a name="line.879"></a>
-<span class="sourceLineNo">880</span><a name="line.880"></a>
-<span class="sourceLineNo">881</span>  @Test<a name="line.881"></a>
-<span class="sourceLineNo">882</span>  public void testRecoveredEditsReplayCompaction() throws Exception {<a name="line.882"></a>
-<span class="sourceLineNo">883</span>    testRecoveredEditsReplayCompaction(false);<a name="line.883"></a>
-<span class="sourceLineNo">884</span>    testRecoveredEditsReplayCompaction(true);<a name="line.884"></a>
-<span class="sourceLineNo">885</span>  }<a name="line.885"></a>
-<span class="sourceLineNo">886</span><a name="line.886"></a>
-<span class="sourceLineNo">887</span>  public void testRecoveredEditsReplayCompaction(boolean mismatchedRegionName) throws Exception {<a name="line.887"></a>
-<span class="sourceLineNo">888</span>    CONF.setClass(HConstants.REGION_IMPL, HRegionForTesting.class, Region.class);<a name="line.888"></a>
-<span class="sourceLineNo">889</span>    byte[] family = Bytes.toBytes("family");<a name="line.889"></a>
-<span class="sourceLineNo">890</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.890"></a>
-<span class="sourceLineNo">891</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.891"></a>
-<span class="sourceLineNo">892</span>    try {<a name="line.892"></a>
-<span class="sourceLineNo">893</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.893"></a>
-<span class="sourceLineNo">894</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.894"></a>
-<span class="sourceLineNo">895</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.895"></a>
-<span class="sourceLineNo">896</span><a name="line.896"></a>
-<span class="sourceLineNo">897</span>      long maxSeqId = 3;<a name="line.897"></a>
-<span class="sourceLineNo">898</span>      long minSeqId = 0;<a name="line.898"></a>
-<span class="sourceLineNo">899</span><a name="line.899"></a>
-<span class="sourceLineNo">900</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.900"></a>
-<span class="sourceLineNo">901</span>        Put put = new Put(Bytes.toBytes(i));<a name="line.901"></a>
-<span class="sourceLineNo">902</span>        put.addColumn(family, Bytes.toBytes(i), Bytes.toBytes(i));<a name="line.902"></a>
-<span class="sourceLineNo">903</span>        region.put(put);<a name="line.903"></a>
-<span class="sourceLineNo">904</span>        region.flush(true);<a name="line.904"></a>
-<span class="sourceLineNo">905</span>      }<a name="line.905"></a>
-<span class="sourceLineNo">906</span><a name="line.906"></a>
-<span class="sourceLineNo">907</span>      // this will create a region with 3 files<a name="line.907"></a>
-<span class="sourceLineNo">908</span>      assertEquals(3, region.getStore(family).getStorefilesCount());<a name="line.908"></a>
-<span class="sourceLineNo">909</span>      List&lt;Path&gt; storeFiles = new ArrayList&lt;&gt;(3);<a name="line.909"></a>
-<span class="sourceLineNo">910</span>      for (HStoreFile sf : region.getStore(family).getStorefiles()) {<a name="line.910"></a>
-<span class="sourceLineNo">911</span>        storeFiles.add(sf.getPath());<a name="line.911"></a>
-<span class="sourceLineNo">912</span>      }<a name="line.912"></a>
-<span class="sourceLineNo">913</span><a name="line.913"></a>
-<span class="sourceLineNo">914</span>      // disable compaction completion<a name="line.914"></a>
-<span class="sourceLineNo">915</span>      CONF.setBoolean("hbase.hstore.compaction.complete", false);<a name="line.915"></a>
-<span class="sourceLineNo">916</span>      region.compactStores();<a name="line.916"></a>
-<span class="sourceLineNo">917</span><a name="line.917"></a>
-<span class="sourceLineNo">918</span>      // ensure that nothing changed<a name="line.918"></a>
-<span class="sourceLineNo">919</span>      assertEquals(3, region.getStore(family).getStorefilesCount());<a name="line.919"></a>
-<span class="sourceLineNo">920</span><a name="line.920"></a>
-<span class="sourceLineNo">921</span>      // now find the compacted file, and manually add it to the recovered edits<a name="line.921"></a>
-<span class="sourceLineNo">922</span>      Path tmpDir = new Path(region.getRegionFileSystem().getTempDir(), Bytes.toString(family));<a name="line.922"></a>
-<span class="sourceLineNo">923</span>      FileStatus[] files = FSUtils.listStatus(fs, tmpDir);<a name="line.923"></a>
-<span class="sourceLineNo">924</span>      String errorMsg = "Expected to find 1 file in the region temp directory "<a name="line.924"></a>
-<span class="sourceLineNo">925</span>          + "from the compaction, could not find any";<a name="line.925"></a>
-<span class="sourceLineNo">926</span>      assertNotNull(errorMsg, files);<a name="line.926"></a>
-<span class="sourceLineNo">927</span>      assertEquals(errorMsg, 1, files.length);<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      // move the file inside region dir<a name="line.928"></a>
-<span class="sourceLineNo">929</span>      Path newFile = region.getRegionFileSystem().commitStoreFile(Bytes.toString(family),<a name="line.929"></a>
-<span class="sourceLineNo">930</span>          files[0].getPath());<a name="line.930"></a>
-<span class="sourceLineNo">931</span><a name="line.931"></a>
-<span class="sourceLineNo">932</span>      byte[] encodedNameAsBytes = this.region.getRegionInfo().getEncodedNameAsBytes();<a name="line.932"></a>
-<span class="sourceLineNo">933</span>      byte[] fakeEncodedNameAsBytes = new byte [encodedNameAsBytes.length];<a name="line.933"></a>
-<span class="sourceLineNo">934</span>      for (int i=0; i &lt; encodedNameAsBytes.length; i++) {<a name="line.934"></a>
-<span class="sourceLineNo">935</span>        // Mix the byte array to have a new encodedName<a name="line.935"></a>
-<span class="sourceLineNo">936</span>        fakeEncodedNameAsBytes[i] = (byte) (encodedNameAsBytes[i] + 1);<a name="line.936"></a>
-<span class="sourceLineNo">937</span>      }<a name="line.937"></a>
-<span class="sourceLineNo">938</span><a name="line.938"></a>
-<span class="sourceLineNo">939</span>      CompactionDescriptor compactionDescriptor = ProtobufUtil.toCompactionDescriptor(this.region<a name="line.939"></a>
-<span class="sourceLineNo">940</span>        .getRegionInfo(), mismatchedRegionName ? fakeEncodedNameAsBytes : null, family,<a name="line.940"></a>
-<span class="sourceLineNo">941</span>            storeFiles, Lists.newArrayList(newFile),<a name="line.941"></a>
-<span class="sourceLineNo">942</span>            region.getRegionFileSystem().getStoreDir(Bytes.toString(family)));<a name="line.942"></a>
-<span class="sourceLineNo">943</span><a name="line.943"></a>
-<span class="sourceLineNo">944</span>      WALUtil.writeCompactionMarker(region.getWAL(), this.region.getReplicationScope(),<a name="line.944"></a>
-<span class="sourceLineNo">945</span>          this.region.getRegionInfo(), compactionDescriptor, region.getMVCC());<a name="line.945"></a>
-<span class="sourceLineNo">946</span><a name="line.946"></a>
-<span class="sourceLineNo">947</span>      Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.947"></a>
-<span class="sourceLineNo">948</span><a name="line.948"></a>
-<span class="sourceLineNo">949</span>      Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", 1000));<a name="line.949"></a>
-<span class="sourceLineNo">950</span>      fs.create(recoveredEdits);<a name="line.950"></a>
-<span class="sourceLineNo">951</span>      WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.951"></a>
-<span class="sourceLineNo">952</span><a name="line.952"></a>
-<span class="sourceLineNo">953</span>      long time = System.nanoTime();<a name="line.953"></a>
-<span class="sourceLineNo">954</span><a name="line.954"></a>
-<span class="sourceLineNo">955</span>      writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, 10, time,<a name="line.955"></a>
-<span class="sourceLineNo">956</span>          HConstants.DEFAULT_CLUSTER_ID), WALEdit.createCompaction(region.getRegionInfo(),<a name="line.956"></a>
-<span class="sourceLineNo">957</span>          compactionDescriptor)));<a name="line.957"></a>
-<span class="sourceLineNo">958</span>      writer.close();<a name="line.958"></a>
-<span class="sourceLineNo">959</span><a name="line.959"></a>
-<span class="sourceLineNo">960</span>      // close the region now, and reopen again<a name="line.960"></a>
-<span class="sourceLineNo">961</span>      region.getTableDescriptor();<a name="line.961"></a>
-<span class="sourceLineNo">962</span>      region.getRegionInfo();<a name="line.962"></a>
-<span class="sourceLineNo">963</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.963"></a>
-<span class="sourceLineNo">964</span>      try {<a name="line.964"></a>
-<span class="sourceLineNo">965</span>        region = HRegion.openHRegion(region, null);<a name="line.965"></a>
-<span class="sourceLineNo">966</span>      } catch (WrongRegionException wre) {<a name="line.966"></a>
-<span class="sourceLineNo">967</span>        fail("Matching encoded region name should not have produced WrongRegionException");<a name="line.967"></a>
-<span class="sourceLineNo">968</span>      }<a name="line.968"></a>
-<span class="sourceLineNo">969</span><a name="line.969"></a>
-<span class="sourceLineNo">970</span>      // now check whether we have only one store file, the compacted one<a name="line.970"></a>
-<span class="sourceLineNo">971</span>      Collection&lt;HStoreFile&gt; sfs = region.getStore(family).getStorefiles();<a name="line.971"></a>
-<span class="sourceLineNo">972</span>      for (HStoreFile sf : sfs) {<a name="line.972"></a>
-<span class="sourceLineNo">973</span>        LOG.info(Objects.toString(sf.getPath()));<a name="line.973"></a>
-<span class="sourceLineNo">974</span>      }<a name="line.974"></a>
-<span class="sourceLineNo">975</span>      if (!mismatchedRegionName) {<a name="line.975"></a>
-<span class="sourceLineNo">976</span>        assertEquals(1, region.getStore(family).getStorefilesCount());<a name="line.976"></a>
-<span class="sourceLineNo">977</span>      }<a name="line.977"></a>
-<span class="sourceLineNo">978</span>      files = FSUtils.listStatus(fs, tmpDir);<a name="line.978"></a>
-<span class="sourceLineNo">979</span>      assertTrue("Expected to find 0 files inside " + tmpDir, files == null || files.length == 0);<a name="line.979"></a>
-<span class="sourceLineNo">980</span><a name="line.980"></a>
-<span class="sourceLineNo">981</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.981"></a>
-<span class="sourceLineNo">982</span>        Get get = new Get(Bytes.toBytes(i));<a name="line.982"></a>
-<span class="sourceLineNo">983</span>        Result result = region.get(get);<a name="line.983"></a>
-<span class="sourceLineNo">984</span>        byte[] value = result.getValue(family, Bytes.toBytes(i));<a name="line.984"></a>
-<span class="sourceLineNo">985</span>        assertArrayEquals(Bytes.toBytes(i), value);<a name="line.985"></a>
-<span class="sourceLineNo">986</span>      }<a name="line.986"></a>
-<span class="sourceLineNo">987</span>    } finally {<a name="line.987"></a>
-<span class="sourceLineNo">988</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.988"></a>
-<span class="sourceLineNo">989</span>      this.region = null;<a name="line.989"></a>
-<span class="sourceLineNo">990</span>      wals.close();<a name="line.990"></a>
-<span class="sourceLineNo">991</span>      CONF.setClass(HConstants.REGION_IMPL, HRegion.class, Region.class);<a name="line.991"></a>
-<span class="sourceLineNo">992</span>    }<a name="line.992"></a>
-<span class="sourceLineNo">993</span>  }<a name="line.993"></a>
-<span class="sourceLineNo">994</span><a name="line.994"></a>
-<span class="sourceLineNo">995</span>  @Test<a name="line.995"></a>
-<span class="sourceLineNo">996</span>  public void testFlushMarkers() throws Exception {<a name="line.996"></a>
-<span class="sourceLineNo">997</span>    // tests that flush markers are written to WAL and handled at recovered edits<a name="line.997"></a>
-<span class="sourceLineNo">998</span>    byte[] family = Bytes.toBytes("family");<a name="line.998"></a>
-<span class="sourceLineNo">999</span>    Path logDir = TEST_UTIL.getDataTestDirOnTestFS(method + ".log");<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>    final Configuration walConf = new Configuration(TEST_UTIL.getConfiguration());<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>    final WALFactory wals = new WALFactory(walConf, method);<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>    final WAL wal = wals.getWAL(RegionInfoBuilder.newBuilder(tableName).build());<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span><a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>    this.region = initHRegion(tableName, HConstants.EMPTY_START_ROW,<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>      HConstants.EMPTY_END_ROW, false, Durability.USE_DEFAULT, wal, family);<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>    try {<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span><a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>      long maxSeqId = 3;<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>      long minSeqId = 0;<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span><a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>        Put put = new Put(Bytes.toBytes(i));<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>        put.addColumn(family, Bytes.toBytes(i), Bytes.toBytes(i));<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>        region.put(put);<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>        region.flush(true);<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>      }<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span><a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>      // this will create a region with 3 files from flush<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>      assertEquals(3, region.getStore(family).getStorefilesCount());<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>      List&lt;String&gt; storeFiles = new ArrayList&lt;&gt;(3);<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>      for (HStoreFile sf : region.getStore(family).getStorefiles()) {<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>        storeFiles.add(sf.getPath().getName());<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>      }<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span><a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>      // now verify that the flush markers are written<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>      wal.shutdown();<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>      WAL.Reader reader = WALFactory.createReader(fs, AbstractFSWALProvider.getCurrentFileName(wal),<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>        TEST_UTIL.getConfiguration());<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>      try {<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>        List&lt;WAL.Entry&gt; flushDescriptors = new ArrayList&lt;&gt;();<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>        long lastFlushSeqId = -1;<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>        while (true) {<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>          WAL.Entry entry = reader.next();<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>          if (entry == null) {<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>            break;<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>          }<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>          Cell cell = entry.getEdit().getCells().get(0);<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>          if (WALEdit.isMetaEditFamily(cell)) {<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>            FlushDescriptor flushDesc = WALEdit.getFlushDescriptor(cell);<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>            assertNotNull(flushDesc);<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>            assertArrayEquals(tableName.getName(), flushDesc.getTableName().toByteArray());<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>            if (flushDesc.getAction() == FlushAction.START_FLUSH) {<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>              assertTrue(flushDesc.getFlushSequenceNumber() &gt; lastFlushSeqId);<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>            } else if (flushDesc.getAction() == FlushAction.COMMIT_FLUSH) {<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>              assertTrue(flushDesc.getFlushSequenceNumber() == lastFlushSeqId);<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>            }<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>            lastFlushSeqId = flushDesc.getFlushSequenceNumber();<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>            assertArrayEquals(regionName, flushDesc.getEncodedRegionName().toByteArray());<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>            assertEquals(1, flushDesc.getStoreFlushesCount()); //only one store<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>            StoreFlushDescriptor storeFlushDesc = flushDesc.getStoreFlushes(0);<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>            assertArrayEquals(family, storeFlushDesc.getFamilyName().toByteArray());<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>            assertEquals("family", storeFlushDesc.getStoreHomeDir());<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>            if (flushDesc.getAction() == FlushAction.START_FLUSH) {<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>              assertEquals(0, storeFlushDesc.getFlushOutputCount());<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>            } else {<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>              assertEquals(1, storeFlushDesc.getFlushOutputCount()); //only one file from flush<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>              assertTrue(storeFiles.contains(storeFlushDesc.getFlushOutput(0)));<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>            }<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span><a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>            flushDescriptors.add(entry);<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>          }<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>        }<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span><a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>        assertEquals(3 * 2, flushDescriptors.size()); // START_FLUSH and COMMIT_FLUSH per flush<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span><a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>        // now write those markers to the recovered edits again.<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span><a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>        Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span><a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", 1000));<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>        fs.create(recoveredEdits);<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span><a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>        for (WAL.Entry entry : flushDescriptors) {<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>          writer.append(entry);<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>        }<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>        writer.close();<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      } finally {<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>        if (null != reader) {<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>          try {<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>            reader.close();<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>          } catch (IOException exception) {<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>            LOG.warn("Problem closing wal: " + exception.getMessage());<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>            LOG.debug("exception details", exception);<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>          }<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>        }<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>      }<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span><a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>      // close the region now, and reopen again<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>      region = HRegion.openHRegion(region, null);<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span><a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>      // now check whether we have can read back the data from region<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>        Get get = new Get(Bytes.toBytes(i));<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>        Result result = region.get(get);<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>        byte[] value = result.getValue(family, Bytes.toBytes(i));<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>        assertArrayEquals(Bytes.toBytes(i), value);<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>      }<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>    } finally {<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>      this.region = null;<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>      wals.close();<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>    }<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>  }<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span><a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>  static class IsFlushWALMarker implements ArgumentMatcher&lt;WALEdit&gt; {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>    volatile FlushAction[] actions;<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>    public IsFlushWALMarker(FlushAction... actions) {<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>      this.actions = actions;<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>    }<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>    @Override<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>    public boolean matches(WALEdit edit) {<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>      List&lt;Cell&gt; cells = edit.getCells();<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>      if (cells.isEmpty()) {<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>        return false;<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>      }<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>      if (WALEdit.isMetaEditFamily(cells.get(0))) {<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>        FlushDescriptor desc;<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>        try {<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>          desc = WALEdit.getFlushDescriptor(cells.get(0));<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>        } catch (IOException e) {<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>          LOG.warn(e.toString(), e);<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>          return false;<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>        }<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>        if (desc != null) {<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>          for (FlushAction action : actions) {<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>            if (desc.getAction() == action) {<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>              return true;<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>            }<a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>          }<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>        }<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>      }<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>      return false;<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>    }<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>    public IsFlushWALMarker set(FlushAction... actions) {<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>      this.actions = actions;<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>      return this;<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>    }<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>  }<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span><a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>  @Test<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>  public void testFlushMarkersWALFail() throws Exception {<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>    // test the cases where the WAL append for flush markers fail.<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>    byte[] family = Bytes.toBytes("family");<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span><a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>    // spy an actual WAL implementation to throw exception (was not able to mock)<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>    Path logDir = TEST_UTIL.getDataTestDirOnTestFS(method + "log");<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span><a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>    final Configuration walConf = new Configuration(TEST_UTIL.getConfiguration());<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>    // Make up a WAL that we can manipulate at append time.<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    class FailAppendFlushMarkerWAL extends FSHLog {<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>      volatile FlushAction [] flushActions = null;<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span><a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>      public FailAppendFlushMarkerWAL(FileSystem fs, Path root, String logDir, Configuration conf)<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>      throws IOException {<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>        super(fs, root, logDir, conf);<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>      }<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span><a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>      @Override<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>      protected Writer createWriterInstance(Path path) throws IOException {<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>        final Writer w = super.createWriterInstance(path);<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>        return new Writer() {<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>          @Override<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>          public void close() throws IOException {<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>            w.close();<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>          }<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span><a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>          @Override<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>          public void sync(boolean forceSync) throws IOException {<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>            w.sync(forceSync);<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>          }<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span><a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>          @Override<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>          public void append(Entry entry) throws IOException {<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>            List&lt;Cell&gt; cells = entry.getEdit().getCells();<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>            if (WALEdit.isMetaEditFamily(cells.get(0))) {<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>              FlushDescriptor desc = WALEdit.getFlushDescriptor(cells.get(0));<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>              if (desc != null) {<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>                for (FlushAction flushAction: flushActions) {<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>                  if (desc.getAction().equals(flushAction)) {<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>                    throw new IOException("Failed to append flush marker! " + flushAction);<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>                  }<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>                }<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>              }<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>            }<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>            w.append(entry);<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>          }<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span><a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>          @Override<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>          public long getLength() {<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>            return w.getLength();<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>          }<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>        };<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>      }<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>    }<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>    FailAppendFlushMarkerWAL wal =<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>      new FailAppendFlushMarkerWAL(FileSystem.get(walConf), FSUtils.getRootDir(walConf),<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>        method, walConf);<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>    wal.init();<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>    this.region = initHRegion(tableName, HConstants.EMPTY_START_ROW,<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>      HConstants.EMPTY_END_ROW, false, Durability.USE_DEFAULT, wal, family);<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>    int i = 0;<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>    Put put = new Put(Bytes.toBytes(i));<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>    put.setDurability(Durability.SKIP_WAL); // have to skip mocked wal<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>    put.addColumn(family, Bytes.toBytes(i), Bytes.toBytes(i));<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>    region.put(put);<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span><a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>    // 1. Test case where START_FLUSH throws exception<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>    wal.flushActions = new FlushAction [] {FlushAction.START_FLUSH};<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span><a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>    // start cache flush will throw exception<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>    try {<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>      region.flush(true);<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>      fail("This should have thrown exception");<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>    } catch (DroppedSnapshotException unexpected) {<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>      // this should not be a dropped snapshot exception. Meaning that RS will not abort<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>      throw unexpected;<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>    } catch (IOException expected) {<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>      // expected<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>    }<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>    // The WAL is hosed now. It has two edits appended. We cannot roll the log without it<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>    // throwing a DroppedSnapshotException to force an abort. Just clean up the mess.<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>    region.close(true);<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>    wal.close();<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span><a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>    // 2. Test case where START_FLUSH succeeds but COMMIT_FLUSH will throw exception<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>    wal.flushActions = new FlushAction [] {FlushAction.COMMIT_FLUSH};<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>    wal = new FailAppendFlushMarkerWAL(FileSystem.get(walConf), FSUtils.getRootDir(walConf),<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>          method, walConf);<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>    wal.init();<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>    this.region = initHRegion(tableName, HConstants.EMPTY_START_ROW,<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>      HConstants.EMPTY_END_ROW, false, Durability.USE_DEFAULT, wal, family);<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    region.put(put);<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span><a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>    // 3. Test case where ABORT_FLUSH will throw exception.<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>    // Even if ABORT_FLUSH throws exception, we should not fail with IOE, but continue with<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>    // DroppedSnapshotException. Below COMMMIT_FLUSH will cause flush to abort<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>    wal.flushActions = new FlushAction [] {FlushAction.COMMIT_FLUSH, FlushAction.ABORT_FLUSH};<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span><a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>    try {<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>      region.flush(true);<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>      fail("This should have thrown exception");<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>    } catch (DroppedSnapshotException expected) {<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>      // we expect this exception, since we were able to write the snapshot, but failed to<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span>      // write the flush marker to WAL<a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>    } catch (IOException unexpected) {<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>      throw unexpected;<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>    }<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>  }<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span><a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>  @Test<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>  public void testGetWhileRegionClose() throws IOException {<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>    Configuration hc = initSplit();<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>    int numRows = 100;<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>    byte[][] families = { fam1, fam2, fam3 };<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span><a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>    // Setting up region<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>    this.region = initHRegion(tableName, method, hc, families);<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>    // Put data in region<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>    final int startRow = 100;<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>    putData(startRow, numRows, qual1, families);<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>    putData(startRow, numRows, qual2, families);<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>    putData(startRow, numRows, qual3, families);<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    final AtomicBoolean done = new AtomicBoolean(false);<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>    final AtomicInteger gets = new AtomicInteger(0);<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>    GetTillDoneOrException[] threads = new GetTillDoneOrException[10];<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>    try {<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>      // Set ten threads running concurrently getting from the region.<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>      for (int i = 0; i &lt; threads.length / 2; i++) {<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>        threads[i] = new GetTillDoneOrException(i, Bytes.toBytes("" + startRow), done, gets);<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>        threads[i].setDaemon(true);<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>        threads[i].start();<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span>      }<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>      // Artificially make the condition by setting closing flag explicitly.<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>      // I can't make the issue happen with a call to region.close().<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>      this.region.closing.set(true);<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>      for (int i = threads.length / 2; i &lt; threads.length; i++) {<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>        threads[i] = new GetTillDoneOrException(i, Bytes.toBytes("" + startRow), done, gets);<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>        threads[i].setDaemon(true);<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>        threads[i].start();<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>      }<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>    } finally {<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>      if (this.region != null) {<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>        HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>        this.region = null;<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>      }<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>    }<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>    done.set(true);<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>    for (GetTillDoneOrException t : threads) {<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>      try {<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>        t.join();<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>      } catch (InterruptedException e) {<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>        e.printStackTrace();<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>      }<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>      if (t.e != null) {<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>        LOG.info("Exception=" + t.e);<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>        assertFalse("Found a NPE in " + t.getName(), t.e instanceof NullPointerException);<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>      }<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>    }<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>  }<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span><a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>  /*<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>   * Thread that does get on single row until 'done' flag is flipped. If an<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>   * exception causes us to fail, it records it.<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>   */<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>  class GetTillDoneOrException extends Thread {<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>    private final Get g;<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>    private final AtomicBoolean done;<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>    private final AtomicInteger count;<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>    private Exception e;<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span><a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>    GetTillDoneOrException(final int i, final byte[] r, final AtomicBoolean d,<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>        final AtomicInteger c) {<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>      super("getter." + i);<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>      this.g = new Get(r);<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>      this.done = d;<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>      this.count = c;<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>    }<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span><a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    @Override<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span>    public void run() {<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>      while (!this.done.get()) {<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>        try {<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>          assertTrue(region.get(g).size() &gt; 0);<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>          this.count.incrementAndGet();<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>        } catch (Exception e) {<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>          this.e = e;<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>          break;<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>        }<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>      }<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>    }<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>  }<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span><a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>  /*<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>   * An involved filter test. Has multiple column families and deletes in mix.<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>   */<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>  @Test<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>  public void testWeirdCacheBehaviour() throws Exception {<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>    byte[][] FAMILIES = new byte[][] { Bytes.toBytes("trans-blob"), Bytes.toBytes("trans-type"),<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>        Bytes.toBytes("trans-date"), Bytes.toBytes("trans-tags"), Bytes.toBytes("trans-group") };<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>    this.region = initHRegion(tableName, method, CONF, FAMILIES);<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>    String value = "this is the value";<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>    String value2 = "this is some other value";<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>    String keyPrefix1 = "prefix1";<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>    String keyPrefix2 = "prefix2";<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>    String keyPrefix3 = "prefix3";<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>    putRows(this.region, 3, value, keyPrefix1);<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>    putRows(this.region, 3, value, keyPrefix2);<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>    putRows(this.region, 3, value, keyPrefix3);<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>    putRows(this.region, 3, value2, keyPrefix1);<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>    putRows(this.region, 3, value2, keyPrefix2);<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>    putRows(this.region, 3, value2, keyPrefix3);<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>    System.out.println("Checking values for key: " + keyPrefix1);<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>    assertEquals("Got back incorrect number of rows from scan", 3,<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>        getNumberOfRows(keyPrefix1, value2, this.region));<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>    System.out.println("Checking values for key: " + keyPrefix2);<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>    assertEquals("Got back incorrect number of rows from scan", 3,<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>        getNumberOfRows(keyPrefix2, value2, this.region));<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>    System.out.println("Checking values for key: " + keyPrefix3);<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>    assertEquals("Got back incorrect number of rows from scan", 3,<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>        getNumberOfRows(keyPrefix3, value2, this.region));<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>    deleteColumns(this.region, value2, keyPrefix1);<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>    deleteColumns(this.region, value2, keyPrefix2);<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>    deleteColumns(this.region, value2, keyPrefix3);<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>    System.out.println("Starting important checks.....");<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>    assertEquals("Got back incorrect number of rows from scan: " + keyPrefix1, 0,<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>        getNumberOfRows(keyPrefix1, value2, this.region));<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>    assertEquals("Got back incorrect number of rows from scan: " + keyPrefix2, 0,<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>        getNumberOfRows(keyPrefix2, value2, this.region));<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>    assertEquals("Got back incorrect number of rows from scan: " + keyPrefix3, 0,<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>        getNumberOfRows(keyPrefix3, value2, this.region));<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>  }<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span><a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>  @Test<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>  public void testAppendWithReadOnlyTable() throws Exception {<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>    this.region = initHRegion(tableName, method, CONF, true, Bytes.toBytes("somefamily"));<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span>    boolean exceptionCaught = false;<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>    Append append = new Append(Bytes.toBytes("somerow"));<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>    append.setDurability(Durability.SKIP_WAL);<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>    append.addColumn(Bytes.toBytes("somefamily"), Bytes.toBytes("somequalifier"),<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>        Bytes.toBytes("somevalue"));<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>    try {<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>      region.append(append);<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>    } catch (IOException e) {<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>      exceptionCaught = true;<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>    }<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>    assertTrue(exceptionCaught == true);<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>  }<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span><a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>  @Test<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>  public void testIncrWithReadOnlyTable() throws Exception {<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>    this.region = initHRegion(tableName, method, CONF, true, Bytes.toBytes("somefamily"));<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>    boolean exceptionCaught = false;<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>    Increment inc = new Increment(Bytes.toBytes("somerow"));<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>    inc.setDurability(Durability.SKIP_WAL);<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>    inc.addColumn(Bytes.toBytes("somefamily"), Bytes.toBytes("somequalifier"), 1L);<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>    try {<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>      region.increment(inc);<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>    } catch (IOException e) {<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>      exceptionCaught = true;<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>    }<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>    assertTrue(exceptionCaught == true);<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>  }<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span><a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>  private void deleteColumns(HRegion r, String value, String keyPrefix) throws IOException {<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>    InternalScanner scanner = buildScanner(keyPrefix, value, r);<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>    int count = 0;<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>    boolean more = false;<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>    do {<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>      more = scanner.next(results);<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>      if (results != null &amp;&amp; !results.isEmpty())<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>        count++;<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>      else<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>        break;<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>      Delete delete = new Delete(CellUtil.cloneRow(results.get(0)));<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>      delete.addColumn(Bytes.toBytes("trans-tags"), Bytes.toBytes("qual2"));<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>      r.delete(delete);<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>      results.clear();<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>    } while (more);<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>    assertEquals("Did not perform correct number of deletes", 3, count);<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>  }<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span><a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>  private int getNumberOfRows(String keyPrefix, String value, HRegion r) throws Exception {<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>    InternalScanner resultScanner = buildScanner(keyPrefix, value, r);<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>    int numberOfResults = 0;<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>    boolean more = false;<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>    do {<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>      more = resultScanner.next(results);<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>      if (results != null &amp;&amp; !results.isEmpty())<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>        numberOfResults++;<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>      else<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>        break;<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>      for (Cell kv : results) {<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>        System.out.println("kv=" + kv.toString() + ", " + Bytes.toString(CellUtil.cloneValue(kv)));<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>      }<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>      results.clear();<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>    } while (more);<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>    return numberOfResults;<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>  }<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span><a name="line.1451"></a>
-<span class="sourceLineNo">1452</span>  private InternalScanner buildScanner(String keyPrefix, String value, HRegion r)<a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>      throws IOException {<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>    // Defaults FilterList.Operator.MUST_PASS_ALL.<a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>    FilterList allFilters = new FilterList();<a name="line.1455"></a>
-<span class="sourceLineNo">1456</span>    allFilters.addFilter(new PrefixFilter(Bytes.toBytes(keyPrefix)));<a name="line.1456"></a>
-<span class="sourceLineNo">1457</span>    // Only return rows where this column value exists in the row.<a name="line.1457"></a>
-<span class="sourceLineNo">1458</span>    SingleColumnValueFilter filter = new SingleColumnValueFilter(Bytes.toBytes("trans-tags"),<a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>        Bytes.toBytes("qual2"), CompareOperator.EQUAL, Bytes.toBytes(value));<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>    filter.setFilterIfMissing(true);<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>    allFilters.addFilter(filter);<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span>    Scan scan = new Scan();<a name="line.1462"></a>
-<span class="sourceLineNo">1463</span>    scan.addFamily(Bytes.toBytes("trans-blob"));<a name="line.1463"></a>
-<span class="sourceLineNo">1464</span>    scan.addFamily(Bytes.toBytes("trans-type"));<a name="line.1464"></a>
-<span class="sourceLineNo">1465</span>    scan.addFamily(Bytes.toBytes("trans-date"));<a name="line.1465"></a>
-<span class="sourceLineNo">1466</span>    scan.addFamily(Bytes.toBytes("trans-tags"));<a name="line.1466"></a>
-<span class="sourceLineNo">1467</span>    scan.addFamily(Bytes.toBytes("trans-group"));<a name="line.1467"></a>
-<span class="sourceLineNo">1468</span>    scan.setFilter(allFilters);<a name="line.1468"></a>
-<span class="sourceLineNo">1469</span>    return r.getScanner(scan);<a name="line.1469"></a>
-<span class="sourceLineNo">1470</span>  }<a name="line.1470"></a>
-<span class="sourceLineNo">1471</span><a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>  private void putRows(HRegion r, int numRows, String value, String key) throws IOException {<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span>    for (int i = 0; i &lt; numRows; i++) {<a name="line.1473"></a>
-<span class="sourceLineNo">1474</span>      String row = key + "_" + i/* UUID.randomUUID().toString() */;<a name="line.1474"></a>
-<span class="sourceLineNo">1475</span>      System.out.println(String.format("Saving row: %s, with value %s", row, value));<a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>      Put put = new Put(Bytes.toBytes(row));<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>      put.setDurability(Durability.SKIP_WAL);<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span>      put.addColumn(Bytes.toBytes("trans-blob"), null, Bytes.toBytes("value for blob"));<a name="line.1478"></a>
-<span class="sourceLineNo">1479</span>      put.addColumn(Bytes.toBytes("trans-type"), null, Bytes.toBytes("statement"));<a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>      put.addColumn(Bytes.toBytes("trans-date"), null, Bytes.toBytes("20090921010101999"));<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>      put.addColumn(Bytes.toBytes("trans-tags"), Bytes.toBytes("qual2"), Bytes.toBytes(value));<a name="line.1481"></a>
-<span class="sourceLineNo">1482</span>      put.addColumn(Bytes.toBytes("trans-group"), null, Bytes.toBytes("adhocTransactionGroupId"));<a name="line.1482"></a>
-<span class="sourceLineNo">1483</span>      r.put(put);<a name="line.1483"></a>
-<span class="sourceLineNo">1484</span>    }<a name="line.1484"></a>
-<span class="sourceLineNo">1485</span>  }<a name="line.1485"></a>
-<span class="sourceLineNo">1486</span><a name="line.1486"></a>
-<span class="sourceLineNo">1487</span>  @Test<a name="line.1487"></a>
-<span class="sourceLineNo">1488</span>  public void testFamilyWithAndWithoutColon() throws Exception {<a name="line.1488"></a>
-<span class="sourceLineNo">1489</span>    byte[] cf = Bytes.toBytes(COLUMN_FAMILY);<a name="line.1489"></a>
-<span class="sourceLineNo">1490</span>    this.region = initHRegion(tableName, method, CONF, cf);<a name="line.1490"></a>
-<span class="sourceLineNo">1491</span>    Put p = new Put(tableName.toBytes());<a name="line.1491"></a>
-<span class="sourceLineNo">1492</span>    byte[] cfwithcolon = Bytes.toBytes(COLUMN_FAMILY + ":");<a name="line.1492"></a>
-<span class="sourceLineNo">1493</span>    p.addColumn(cfwithcolon, cfwithcolon, cfwithcolon);<a name="line.1493"></a>
-<span class="sourceLineNo">1494</span>    boolean exception = false;<a name="line.1494"></a>
-<span class="sourceLineNo">1495</span>    try {<a name="line.1495"></a>
-<span class="sourceLineNo">1496</span>      this.region.put(p);<a name="line.1496"></a>
-<span class="sourceLineNo">1497</span>    } catch (NoSuchColumnFamilyException e) {<a name="line.1497"></a>
-<span class="sourceLineNo">1498</span>      exception = true;<a name="line.1498"></a>
-<span class="sourceLineNo">1499</span>    }<a name="line.1499"></a>
-<span class="sourceLineNo">1500</span>    assertTrue(exception);<a name="line.1500"></a>
-<span class="sourceLineNo">1501</span>  }<a name="line.1501"></a>
-<span class="sourceLineNo">1502</span><a name="line.1502"></a>
-<span class="sourceLineNo">1503</span>  @Test<a name="line.1503"></a>
-<span class="sourceLineNo">1504</span>  public void testBatchPut_whileNoRowLocksHeld() throws IOException {<a name="line.1504"></a>
-<span class="sourceLineNo">1505</span>    final Put[] puts = new Put[10];<a name="line.1505"></a>
-<span class="sourceLineNo">1506</span>    MetricsWALSource source = CompatibilitySingletonFactory.getInstance(MetricsWALSource.class);<a name="line.1506"></a>
-<span class="sourceLineNo">1507</span>    long syncs = prepareRegionForBachPut(puts, source, false);<a name="line.1507"></a>
-<span class="sourceLineNo">1508</span><a name="line.1508"></a>
-<span class="sourceLineNo">1509</span>    OperationStatus[] codes = this.region.batchMutate(puts);<a name="line.1509"></a>
-<span class="sourceLineNo">1510</span>    assertEquals(10, codes.length);<a name="line.1510"></a>
-<span class="sourceLineNo">1511</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.1511"></a>
-<span class="sourceLineNo">1512</span>      assertEquals(OperationStatusCode.SUCCESS, codes[i].getOperationStatusCode());<a name="line.1512"></a>
-<span class="sourceLineNo">1513</span>    }<a name="line.1513"></a>
-<span class="sourceLineNo">1514</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs + 1, source);<a name="line.1514"></a>
-<span class="sourceLineNo">1515</span><a name="line.1515"></a>
-<span class="sourceLineNo">1516</span>    LOG.info("Next a batch put with one invalid family");<a name="line.1516"></a>
-<span class="sourceLineNo">1517</span>    puts[5].addColumn(Bytes.toBytes("BAD_CF"), qual, value);<a name="line.1517"></a>
-<span class="sourceLineNo">1518</span>    codes = this.region.batchMutate(puts);<a name="line.1518"></a>
-<span class="sourceLineNo">1519</span>    assertEquals(10, codes.length);<a name="line.1519"></a>
-<span class="sourceLineNo">1520</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.1520"></a>
-<span class="sourceLineNo">1521</span>      assertEquals((i == 5) ? OperationStatusCode.BAD_FAMILY : OperationStatusCode.SUCCESS,<a name="line.1521"></a>
-<span class="sourceLineNo">1522</span>          codes[i].getOperationStatusCode());<a name="line.1522"></a>
-<span class="sourceLineNo">1523</span>    }<a name="line.1523"></a>
-<span class="sourceLineNo">1524</span><a name="line.1524"></a>
-<span class="sourceLineNo">1525</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs + 2, source);<a name="line.1525"></a>
-<span class="sourceLineNo">1526</span>  }<a name="line.1526"></a>
-<span class="sourceLineNo">1527</span><a name="line.1527"></a>
-<span class="sourceLineNo">1528</span>  @Test<a name="line.1528"></a>
-<span class="sourceLineNo">1529</span>  public void testBatchPut_whileMultipleRowLocksHeld() throws Exception {<a name="line.1529"></a>
-<span class="sourceLineNo">1530</span>    final Put[] puts = new Put[10];<a name="line.1530"></a>
-<span class="sourceLineNo">1531</span>    MetricsWALSource source = CompatibilitySingletonFactory.getInstance(MetricsWALSource.class);<a name="line.1531"></a>
-<span class="sourceLineNo">1532</span>    long syncs = prepareRegionForBachPut(puts, source, false);<a name="line.1532"></a>
-<span class="sourceLineNo">1533</span><a name="line.1533"></a>
-<span class="sourceLineNo">1534</span>    puts[5].addColumn(Bytes.toBytes("BAD_CF"), qual, value);<a name="line.1534"></a>
-<span class="sourceLineNo">1535</span><a name="line.1535"></a>
-<span class="sourceLineNo">1536</span>    LOG.info("batchPut will have to break into four batches to avoid row locks");<a name="line.1536"></a>
-<span class="sourceLineNo">1537</span>    RowLock rowLock1 = region.getRowLock(Bytes.toBytes("row_2"));<a name="line.1537"></a>
-<span class="sourceLineNo">1538</span>    RowLock rowLock2 = region.getRowLock(Bytes.toBytes("row_1"));<a name="line.1538"></a>
-<span class="sourceLineNo">1539</span>    RowLock rowLock3 = region.getRowLock(Bytes.toBytes("row_3"));<a name="line.1539"></a>
-<span class="sourceLineNo">1540</span>    RowLock rowLock4 = region.getRowLock(Bytes.toBytes("row_3"), true);<a name="line.1540"></a>
-<span class="sourceLineNo">1541</span><a name="line.1541"></a>
-<span class="sourceLineNo">1542</span>    MultithreadedTestUtil.TestContext ctx = new MultithreadedTestUtil.TestContext(CONF);<a name="line.1542"></a>
-<span class="sourceLineNo">1543</span>    final AtomicReference&lt;OperationStatus[]&gt; retFromThread = new AtomicReference&lt;&gt;();<a name="line.1543"></a>
-<span class="sourceLineNo">1544</span>    final CountDownLatch startingPuts = new CountDownLatch(1);<a name="line.1544"></a>
-<span class="sourceLineNo">1545</span>    final CountDownLatch startingClose = new CountDownLatch(1);<a name="line.1545"></a>
-<span class="sourceLineNo">1546</span>    TestThread putter = new TestThread(ctx) {<a name="line.1546"></a>
-<span class="sourceLineNo">1547</span>      @Override<a name="line.1547"></a>
-<span class="sourceLineNo">1548</span>      public void doWork() throws IOException {<a name="line.1548"></a>
-<span class="sourceLineNo">1549</span>        startingPuts.countDown();<a name="line.1549"></a>
-<span class="sourceLineNo">1550</span>        retFromThread.set(region.batchMutate(puts));<a name="line.1550"></a>
-<span class="sourceLineNo">1551</span>      }<a name="line.1551"></a>
-<span class="sourceLineNo">1552</span>    };<a name="line.1552"></a>
-<span class="sourceLineNo">1553</span>    LOG.info("...starting put thread while holding locks");<a name="line.1553"></a>
-<span class="sourceLineNo">1554</span>    ctx.addThread(putter);<a name="line.1554"></a>
-<span class="sourceLineNo">1555</span>    ctx.startThreads();<a name="line.1555"></a>
-<span class="sourceLineNo">1556</span><a name="line.1556"></a>
-<span class="sourceLineNo">1557</span>    // Now attempt to close the region from another thread.  Prior to HBASE-12565<a name="line.1557"></a>
-<span class="sourceLineNo">1558</span>    // this would cause the in-progress batchMutate operation to to fail with<a name="line.1558"></a>
-<span class="sourceLineNo">1559</span>    // exception because it use to release and re-acquire the close-guard lock<a name="line.1559"></a>
-<span class="sourceLineNo">1560</span>    // between batches.  Caller then didn't get status indicating which writes succeeded.<a name="line.1560"></a>
-<span class="sourceLineNo">1561</span>    // We now expect this thread to block until the batchMutate call finishes.<a name="line.1561"></a>
-<span class="sourceLineNo">1562</span>    Thread regionCloseThread = new TestThread(ctx) {<a name="line.1562"></a>
-<span class="sourceLineNo">1563</span>      @Override<a name="line.1563"></a>
-<span class="sourceLineNo">1564</span>      public void doWork() {<a name="line.1564"></a>
-<span class="sourceLineNo">1565</span>        try {<a name="line.1565"></a>
-<span class="sourceLineNo">1566</span>          startingPuts.await();<a name="line.1566"></a>
-<span class="sourceLineNo">1567</span>          // Give some time for the batch mutate to get in.<a name="line.1567"></a>
-<span class="sourceLineNo">1568</span>          // We don't want to race with the mutate<a name="line.1568"></a>
-<span class="sourceLineNo">1569</span>          Thread.sleep(10);<a name="line.1569"></a>
-<span class="sourceLineNo">1570</span>          startingClose.countDown();<a name="line.1570"></a>
-<span class="sourceLineNo">1571</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.1571"></a>
-<span class="sourceLineNo">1572</span>          region = null;<a name="line.1572"></a>
-<span class="sourceLineNo">1573</span>        } catch (IOException e) {<a name="line.1573"></a>
-<span class="sourceLineNo">1574</span>          throw new RuntimeException(e);<a name="line.1574"></a>
-<span class="sourceLineNo">1575</span>        } catch (InterruptedException e) {<a name="line.1575"></a>
-<span class="sourceLineNo">1576</span>          throw new RuntimeException(e);<a name="line.1576"></a>
-<span class="sourceLineNo">1577</span>        }<a name="line.1577"></a>
-<span class="sourceLineNo">1578</span>      }<a name="line.1578"></a>
-<span class="sourceLineNo">1579</span>    };<a name="line.1579"></a>
-<span class="sourceLineNo">1580</span>    regionCloseThread.start();<a name="line.1580"></a>
-<span class="sourceLineNo">1581</span><a name="line.1581"></a>
-<span class="sourceLineNo">1582</span>    startingClose.await();<a name="line.1582"></a>
-<span class="sourceLineNo">1583</span>    startingPuts.await();<a name="line.1583"></a>
-<span class="sourceLineNo">1584</span>    Thread.sleep(100);<a name="line.1584"></a>
-<span class="sourceLineNo">1585</span>    LOG.info("...releasing row lock 1, which should let put thread continue");<a name="line.1585"></a>
-<span class="sourceLineNo">1586</span>    rowLock1.release();<a name="line.1586"></a>
-<span class="sourceLineNo">1587</span>    rowLock2.release();<a name="line.1587"></a>
-<span class="sourceLineNo">1588</span>    rowLock3.release();<a name="line.1588"></a>
-<span class="sourceLineNo">1589</span>    waitForCounter(source, "syncTimeNumOps", syncs + 1);<a name="line.1589"></a>
-<span class="sourceLineNo">1590</span><a name="line.1590"></a>
-<span class="sourceLineNo">1591</span>    LOG.info("...joining on put thread");<a name="line.1591"></a>
-<span class="sourceLineNo">1592</span>    ctx.stop();<a name="line.1592"></a>
-<span class="sourceLineNo">1593</span>    regionCloseThread.join();<a name="line.1593"></a>
-<span class="sourceLineNo">1594</span><a name="line.1594"></a>
-<span class="sourceLineNo">1595</span>    OperationStatus[] codes = retFromThread.get();<a name="line.1595"></a>
-<span class="sourceLineNo">1596</span>    for (int i = 0; i &lt; codes.length; i++) {<a name="line.1596"></a>
-<span class="sourceLineNo">1597</span>      assertEquals((i == 5) ? OperationStatusCode.BAD_FAMILY : OperationStatusCode.SUCCESS,<a name="line.1597"></a>
-<span class="sourceLineNo">1598</span>          codes[i].getOperationStatusCode());<a name="line.1598"></a>
-<span class="sourceLineNo">1599</span>    }<a name="line.1599"></a>
-<span class="sourceLineNo">1600</span>    rowLock4.release();<a name="line.1600"></a>
-<span class="sourceLineNo">1601</span>  }<a name="line.1601"></a>
-<span class="sourceLineNo">1602</span><a name="line.1602"></a>
-<span class="sourceLineNo">1603</span>  private void waitForCounter(MetricsWALSource source, String metricName, long expectedCount)<a name="line.1603"></a>
-<span class="sourceLineNo">1604</span>      throws InterruptedException {<a name="line.1604"></a>
-<span class="sourceLineNo">1605</span>    long startWait = System.currentTimeMillis();<a name="line.1605"></a>
-<span class="sourceLineNo">1606</span>    long currentCount;<a name="line.1606"></a>
-<span class="sourceLineNo">1607</span>    while ((currentCount = metricsAssertHelper.getCounter(metricName, source)) &lt; expectedCount) {<a name="line.1607"></a>
-<span class="sourceLineNo">1608</span>      Thread.sleep(100);<a name="line.1608"></a>
-<span class="sourceLineNo">1609</span>      if (System.currentTimeMillis() - startWait &gt; 10000) {<a name="line.1609"></a>
-<span class="sourceLineNo">1610</span>        fail(String.format("Timed out waiting for '%s' &gt;= '%s', currentCount=%s", metricName,<a name="line.1610"></a>
-<span class="sourceLineNo">1611</span>            expectedCount, currentCount));<a name="line.1611"></a>
-<span class="sourceLineNo">1612</span>      }<a name="line.1612"></a>
-<span class="sourceLineNo">1613</span>    }<a name="line.1613"></a>
-<span class="sourceLineNo">1614</span>  }<a name="line.1614"></a>
-<span class="sourceLineNo">1615</span><a name="line.1615"></a>
-<span class="sourceLineNo">1616</span>  @Test<a name="line.1616"></a>
-<span class="sourceLineNo">1617</span>  public void testAtomicBatchPut() throws IOException {<a name="line.1617"></a>
-<span class="sourceLineNo">1618</span>    final Put[] puts = new Put[10];<a name="line.1618"></a>
-<span class="sourceLineNo">1619</span>    MetricsWALSource source = CompatibilitySingletonFactory.getInstance(MetricsWALSource.class);<a name="line.1619"></a>
-<span class="sourceLineNo">1620</span>    long syncs = prepareRegionForBachPut(puts, source, false);<a name="line.1620"></a>
-<span class="sourceLineNo">1621</span><a name="line.1621"></a>
-<span class="sourceLineNo">1622</span>    // 1. Straight forward case, should succeed<a name="line.1622"></a>
-<span class="sourceLineNo">1623</span>    MutationBatchOperation batchOp = new MutationBatchOperation(region, puts, true,<a name="line.1623"></a>
-<span class="sourceLineNo">1624</span>        HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.1624"></a>
-<span class="sourceLineNo">1625</span>    OperationStatus[] codes = this.region.batchMutate(batchOp);<a name="line.1625"></a>
-<span class="sourceLineNo">1626</span>    assertEquals(10, codes.length);<a name="line.1626"></a>
-<span class="sourceLineNo">1627</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.1627"></a>
-<span class="sourceLineNo">1628</span>      assertEquals(OperationStatusCode.SUCCESS, codes[i].getOperationStatusCode());<a name="line.1628"></a>
-<span class="sourceLineNo">1629</span>    }<a name="line.1629"></a>
-<span class="sourceLineNo">1630</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs + 1, source);<a name="line.1630"></a>
-<span class="sourceLineNo">1631</span><a name="line.1631"></a>
-<span class="sourceLineNo">1632</span>    // 2. Failed to get lock<a name="line.1632"></a>
-<span class="sourceLineNo">1633</span>    RowLock lock = region.getRowLock(Bytes.toBytes("row_" + 3));<a name="line.1633"></a>
-<span class="sourceLineNo">1634</span>    // Method {@link HRegion#getRowLock(byte[])} is reentrant. As 'row_3' is locked in this<a name="line.1634"></a>
-<span class="sourceLineNo">1635</span>    // thread, need to run {@link HRegion#batchMutate(HRegion.BatchOperation)} in different thread<a name="line.1635"></a>
-<span class="sourceLineNo">1636</span>    MultithreadedTestUtil.TestContext ctx = new MultithreadedTestUtil.TestContext(CONF);<a name="line.1636"></a>
-<span class="sourceLineNo">1637</span>    final AtomicReference&lt;IOException&gt; retFromThread = new AtomicReference&lt;&gt;();<a name="line.1637"></a>
-<span class="sourceLineNo">1638</span>    final CountDownLatch finishedPuts = new CountDownLatch(1);<a name="line.1638"></a>
-<span class="sourceLineNo">1639</span>    final MutationBatchOperation finalBatchOp = new MutationBatchOperation(region, puts, true,<a name="line.1639"></a>
-<span class="sourceLineNo">1640</span>        HConstants<a name="line.1640"></a>
-<span class="sourceLineNo">1641</span>        .NO_NONCE,<a name="line.1641"></a>
-<span class="sourceLineNo">1642</span>        HConstants.NO_NONCE);<a name="line.1642"></a>
-<span class="sourceLineNo">1643</span>    TestThread putter = new TestThread(ctx) {<a name="line.1643"></a>
-<span class="sourceLineNo">1644</span>      @Override<a name="line.1644"></a>
-<span class="sourceLineNo">1645</span>      public void doWork() throws IOException {<a name="line.1645"></a>
-<span class="sourceLineNo">1646</span>        try {<a name="line.1646"></a>
-<span class="sourceLineNo">1647</span>          region.batchMutate(finalBatchOp);<a name="line.1647"></a>
-<span class="sourceLineNo">1648</span>        } catch (IOException ioe) {<a name="line.1648"></a>
-<span class="sourceLineNo">1649</span>          LOG.error("test failed!", ioe);<a name="line.1649"></a>
-<span class="sourceLineNo">1650</span>          retFromThread.set(ioe);<a name="line.1650"></a>
-<span class="sourceLineNo">1651</span>        }<a name="line.1651"></a>
-<span class="sourceLineNo">1652</span>        finishedPuts.countDown();<a name="line.1652"></a>
-<span class="sourceLineNo">1653</span>      }<a name="line.1653"></a>
-<span class="sourceLineNo">1654</span>    };<a name="line.1654"></a>
-<span class="sourceLineNo">1655</span>    LOG.info("...starting put thread while holding locks");<a name="line.1655"></a>
-<span class="sourceLineNo">1656</span>    ctx.addThread(putter);<a name="line.1656"></a>
-<span class="sourceLineNo">1657</span>    ctx.startThreads();<a name="line.1657"></a>
-<span class="sourceLineNo">1658</span>    LOG.info("...waiting for batch puts while holding locks");<a name="line.1658"></a>
-<span class="sourceLineNo">1659</span>    try {<a name="line.1659"></a>
-<span class="sourceLineNo">1660</span>      finishedPuts.await();<a name="line.1660"></a>
-<span class="sourceLineNo">1661</span>    } catch (InterruptedException e) {<a name="line.1661"></a>
-<span class="sourceLineNo">1662</span>      LOG.error("Interrupted!", e);<a name="line.1662"></a>
-<span class="sourceLineNo">1663</span>    } finally {<a name="line.1663"></a>
-<span class="sourceLineNo">1664</span>      if (lock != null) {<a name="line.1664"></a>
-<span class="sourceLineNo">1665</span>        lock.release();<a name="line.1665"></a>
-<span class="sourceLineNo">1666</span>      }<a name="line.1666"></a>
-<span class="sourceLineNo">1667</span>    }<a name="line.1667"></a>
-<span class="sourceLineNo">1668</span>    assertNotNull(retFromThread.get());<a name="line.1668"></a>
-<span class="sourceLineNo">1669</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs + 1, source);<a name="line.1669"></a>
-<span class="sourceLineNo">1670</span><a name="line.1670"></a>
-<span class="sourceLineNo">1671</span>    // 3. Exception thrown in validation<a name="line.1671"></a>
-<span class="sourceLineNo">1672</span>    LOG.info("Next a batch put with one invalid family");<a name="line.1672"></a>
-<span class="sourceLineNo">1673</span>    puts[5].addColumn(Bytes.toBytes("BAD_CF"), qual, value);<a name="line.1673"></a>
-<span class="sourceLineNo">1674</span>    batchOp = new MutationBatchOperation(region, puts, true, HConstants.NO_NONCE,<a name="line.1674"></a>
-<span class="sourceLineNo">1675</span>        HConstants.NO_NONCE);<a name="line.1675"></a>
-<span class="sourceLineNo">1676</span>    thrown.expect(NoSuchColumnFamilyException.class);<a name="line.1676"></a>
-<span class="sourceLineNo">1677</span>    this.region.batchMutate(batchOp);<a name="line.1677"></a>
-<span class="sourceLineNo">1678</span>  }<a name="line.1678"></a>
-<span class="sourceLineNo">1679</span><a name="line.1679"></a>
-<span class="sourceLineNo">1680</span>  @Test<a name="line.1680"></a>
-<span class="sourceLineNo">1681</span>  public void testBatchPutWithTsSlop() throws Exception {<a name="line.1681"></a>
-<span class="sourceLineNo">1682</span>    // add data with a timestamp that is too recent for range. Ensure assert<a name="line.1682"></a>
-<span class="sourceLineNo">1683</span>    CONF.setInt("hbase.hregion.keyvalue.timestamp.slop.millisecs", 1000);<a name="line.1683"></a>
-<span class="sourceLineNo">1684</span>    final Put[] puts = new Put[10];<a name="line.1684"></a>
-<span class="sourceLineNo">1685</span>    MetricsWALSource source = CompatibilitySingletonFactory.getInstance(MetricsWALSource.class);<a name="line.1685"></a>
-<span class="sourceLineNo">1686</span><a name="line.1686"></a>
-<span class="sourceLineNo">1687</span>    long syncs = prepareRegionForBachPut(puts, source, true);<a name="line.1687"></a>
-<span class="sourceLineNo">1688</span><a name="line.1688"></a>
-<span class="sourceLineNo">1689</span>    OperationStatus[] codes = this.region.batchMutate(puts);<a name="line.1689"></a>
-<span class="sourceLineNo">1690</span>    assertEquals(10, codes.length);<a name="line.1690"></a>
-<span class="sourceLineNo">1691</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.1691"></a>
-<span class="sourceLineNo">1692</span>      assertEquals(OperationStatusCode.SANITY_CHECK_FAILURE, codes[i].getOperationStatusCode());<a name="line.1692"></a>
-<span class="sourceLineNo">1693</span>    }<a name="line.1693"></a>
-<span class="sourceLineNo">1694</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs, source);<a name="line.1694"></a>
-<span class="sourceLineNo">1695</span>  }<a name="line.1695"></a>
-<span class="sourceLineNo">1696</span><a name="line.1696"></a>
-<span class="sourceLineNo">1697</span>  /**<a name="line.1697"></a>
-<span class="sourceLineNo">1698</span>   * @return syncs initial syncTimeNumOps<a name="line.1698"></a>
-<span class="sourceLineNo">1699</span>   */<a name="line.1699"></a>
-<span class="sourceLineNo">1700</span>  private long prepareRegionForBachPut(final Put[] puts, final MetricsWALSource source,<a name="line.1700"></a>
-<span class="sourceLineNo">1701</span>      boolean slop) throws IOException {<a name="line.1701"></a>
-<span class="sourceLineNo">1702</span>    this.region = initHRegion(tableName, method, CONF, COLUMN_FAMILY_BYTES);<a name="line.1702"></a>
-<span class="sourceLineNo">1703</span><a name="line.1703"></a>
-<span class="sourceLineNo">1704</span>    LOG.info("First a batch put with all valid puts");<a name="line.1704"></a>
-<span class="sourceLineNo">1705</span>    for (int i = 0; i &lt; puts.length; i++) {<a name="line.1705"></a>
-<span class="sourceLineNo">1706</span>      puts[i] = slop ? new Put(Bytes.toBytes("row_" + i), Long.MAX_VALUE - 100) :<a name="line.1706"></a>
-<span class="sourceLineNo">1707</span>          new Put(Bytes.toBytes("row_" + i));<a name="line.1707"></a>
-<span class="sourceLineNo">1708</span>      puts[i].addColumn(COLUMN_FAMILY_BYTES, qual, value);<a name="line.1708"></a>
-<span class="sourceLineNo">1709</span>    }<a name="line.1709"></a>
-<span class="sourceLineNo">1710</span><a name="line.1710"></a>
-<span class="sourceLineNo">1711</span>    long syncs = metricsAssertHelper.getCounter("syncTimeNumOps", source);<a name="line.1711"></a>
-<span class="sourceLineNo">1712</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs, source);<a name="line.1712"></a>
-<span class="sourceLineNo">1713</span>    return syncs;<a name="line.1713"></a>
-<span class="sourceLineNo">1714</span>  }<a name="line.1714"></a>
-<span class="sourceLineNo">1715</span><a name="line.1715"></a>
-<span class="sourceLineNo">1716</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.1716"></a>
-<span class="sourceLineNo">1717</span>  // checkAndMutate tests<a name="line.1717"></a>
-<span class="sourceLineNo">1718</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.1718"></a>
-<span class="sourceLineNo">1719</span>  @Test<a name="line.1719"></a>
-<span class="sourceLineNo">1720</span>  public void testCheckAndMutate_WithEmptyRowValue() throws IOException {<a name="line.1720"></a>
-<span class="sourceLineNo">1721</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1721"></a>
-<span class="sourceLineNo">1722</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1722"></a>
-<span class="sourceLineNo">1723</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1723"></a>
-<span class="sourceLineNo">1724</span>    byte[] emptyVal = new byte[] {};<a name="line.1724"></a>
-<span class="sourceLineNo">1725</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1725"></a>
-<span class="sourceLineNo">1726</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.1726"></a>
-<span class="sourceLineNo">1727</span><a name="line.1727"></a>
-<span class="sourceLineNo">1728</span>    // Setting up region<a name="line.1728"></a>
-<span class="sourceLineNo">1729</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.1729"></a>
-<span class="sourceLineNo">1730</span>    // Putting empty data in key<a name="line.1730"></a>
-<span class="sourceLineNo">1731</span>    Put put = new Put(row1);<a name="line.1731"></a>
-<span class="sourceLineNo">1732</span>    put.addColumn(fam1, qf1, emptyVal);<a name="line.1732"></a>
-<span class="sourceLineNo">1733</span><a name="line.1733"></a>
-<span class="sourceLineNo">1734</span>    // checkAndPut with empty value<a name="line.1734"></a>
-<span class="sourceLineNo">1735</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1735"></a>
-<span class="sourceLineNo">1736</span>        new BinaryComparator(emptyVal), put);<a name="line.1736"></a>
-<span class="sourceLineNo">1737</span>    assertTrue(res);<a name="line.1737"></a>
-<span class="sourceLineNo">1738</span><a name="line.1738"></a>
-<span class="sourceLineNo">1739</span>    // Putting data in key<a name="line.1739"></a>
-<span class="sourceLineNo">1740</span>    put = new Put(row1);<a name="line.1740"></a>
-<span class="sourceLineNo">1741</span>    put.addColumn(fam1, qf1, val1);<a name="line.1741"></a>
-<span class="sourceLineNo">1742</span><a name="line.1742"></a>
-<span class="sourceLineNo">1743</span>    // checkAndPut with correct value<a name="line.1743"></a>
-<span class="sourceLineNo">1744</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1744"></a>
-<span class="sourceLineNo">1745</span>        new BinaryComparator(emptyVal), put);<a name="line.1745"></a>
-<span class="sourceLineNo">1746</span>    assertTrue(res);<a name="line.1746"></a>
-<span class="sourceLineNo">1747</span><a name="line.1747"></a>
-<span class="sourceLineNo">1748</span>    // not empty anymore<a name="line.1748"></a>
-<span class="sourceLineNo">1749</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1749"></a>
-<span class="sourceLineNo">1750</span>        new BinaryComparator(emptyVal), put);<a name="line.1750"></a>
-<span class="sourceLineNo">1751</span>    assertFalse(res);<a name="line.1751"></a>
-<span class="sourceLineNo">1752</span><a name="line.1752"></a>
-<span class="sourceLineNo">1753</span>    Delete delete = new Delete(row1);<a name="line.1753"></a>
-<span class="sourceLineNo">1754</span>    delete.addColumn(fam1, qf1);<a name="line.1754"></a>
-<span class="sourceLineNo">1755</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1755"></a>
-<span class="sourceLineNo">1756</span>        new BinaryComparator(emptyVal), delete);<a name="line.1756"></a>
-<span class="sourceLineNo">1757</span>    assertFalse(res);<a name="line.1757"></a>
-<span class="sourceLineNo">1758</span><a name="line.1758"></a>
-<span class="sourceLineNo">1759</span>    put = new Put(row1);<a name="line.1759"></a>
-<span class="sourceLineNo">1760</span>    put.addColumn(fam1, qf1, val2);<a name="line.1760"></a>
-<span class="sourceLineNo">1761</span>    // checkAndPut with correct value<a name="line.1761"></a>
-<span class="sourceLineNo">1762</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1762"></a>
-<span class="sourceLineNo">1763</span>        new BinaryComparator(val1), put);<a name="line.1763"></a>
-<span class="sourceLineNo">1764</span>    assertTrue(res);<a name="line.1764"></a>
-<span class="sourceLineNo">1765</span><a name="line.1765"></a>
-<span class="sourceLineNo">1766</span>    // checkAndDelete with correct value<a name="line.1766"></a>
-<span class="sourceLineNo">1767</span>    delete = new Delete(row1);<a name="line.1767"></a>
-<span class="sourceLineNo">1768</span>    delete.addColumn(fam1, qf1);<a name="line.1768"></a>
+<span class="sourceLineNo">404</span>    ChunkCreator.initialize(MemStoreLABImpl.CHUNK_SIZE_DEFAULT, false, 0, 0, 0, null);<a name="line.404"></a>
+<span class="sourceLineNo">405</span>    FSHLog hLog = new FSHLog(fs, rootDir, testName, CONF);<a name="line.405"></a>
+<span class="sourceLineNo">406</span>    hLog.init();<a name="line.406"></a>
+<span class="sourceLineNo">407</span>    region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, hLog,<a name="line.407"></a>
+<span class="sourceLineNo">408</span>        COLUMN_FAMILY_BYTES);<a name="line.408"></a>
+<span class="sourceLineNo">409</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.409"></a>
+<span class="sourceLineNo">410</span>    assertEquals(0, region.getMemStoreDataSize());<a name="line.410"></a>
+<span class="sourceLineNo">411</span><a name="line.411"></a>
+<span class="sourceLineNo">412</span>    // Put one value<a name="line.412"></a>
+<span class="sourceLineNo">413</span>    byte [] value = Bytes.toBytes(method);<a name="line.413"></a>
+<span class="sourceLineNo">414</span>    Put put = new Put(value);<a name="line.414"></a>
+<span class="sourceLineNo">415</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    region.put(put);<a name="line.416"></a>
+<span class="sourceLineNo">417</span>    long onePutSize = region.getMemStoreDataSize();<a name="line.417"></a>
+<span class="sourceLineNo">418</span>    assertTrue(onePutSize &gt; 0);<a name="line.418"></a>
+<span class="sourceLineNo">419</span><a name="line.419"></a>
+<span class="sourceLineNo">420</span>    RegionCoprocessorHost mockedCPHost = Mockito.mock(RegionCoprocessorHost.class);<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    doThrow(new IOException())<a name="line.421"></a>
+<span class="sourceLineNo">422</span>       .when(mockedCPHost).postBatchMutate(Mockito.&lt;MiniBatchOperationInProgress&lt;Mutation&gt;&gt;any());<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    region.setCoprocessorHost(mockedCPHost);<a name="line.423"></a>
+<span class="sourceLineNo">424</span><a name="line.424"></a>
+<span class="sourceLineNo">425</span>    put = new Put(value);<a name="line.425"></a>
+<span class="sourceLineNo">426</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("dfg"), value);<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    try {<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      region.put(put);<a name="line.428"></a>
+<span class="sourceLineNo">429</span>      fail("Should have failed with IOException");<a name="line.429"></a>
+<span class="sourceLineNo">430</span>    } catch (IOException expected) {<a name="line.430"></a>
+<span class="sourceLineNo">431</span>    }<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    long expectedSize = onePutSize * 2;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>    assertEquals("memstoreSize should be incremented",<a name="line.433"></a>
+<span class="sourceLineNo">434</span>        expectedSize, region.getMemStoreDataSize());<a name="line.434"></a>
+<span class="sourceLineNo">435</span>    assertEquals("flushable size should be incremented",<a name="line.435"></a>
+<span class="sourceLineNo">436</span>        expectedSize, store.getFlushableSize().getDataSize());<a name="line.436"></a>
+<span class="sourceLineNo">437</span><a name="line.437"></a>
+<span class="sourceLineNo">438</span>    region.setCoprocessorHost(null);<a name="line.438"></a>
+<span class="sourceLineNo">439</span>  }<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>   * A test case of HBASE-21041<a name="line.442"></a>
+<span class="sourceLineNo">443</span>   * @throws Exception Exception<a name="line.443"></a>
+<span class="sourceLineNo">444</span>   */<a name="line.444"></a>
+<span class="sourceLineNo">445</span>  @Test<a name="line.445"></a>
+<span class="sourceLineNo">446</span>  public void testFlushAndMemstoreSizeCounting() throws Exception {<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    byte[] family = Bytes.toBytes("family");<a name="line.447"></a>
+<span class="sourceLineNo">448</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.448"></a>
+<span class="sourceLineNo">449</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.449"></a>
+<span class="sourceLineNo">450</span>    try {<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      for (byte[] row : HBaseTestingUtility.ROWS) {<a name="line.451"></a>
+<span class="sourceLineNo">452</span>        Put put = new Put(row);<a name="line.452"></a>
+<span class="sourceLineNo">453</span>        put.addColumn(family, family, row);<a name="line.453"></a>
+<span class="sourceLineNo">454</span>        region.put(put);<a name="line.454"></a>
+<span class="sourceLineNo">455</span>      }<a name="line.455"></a>
+<span class="sourceLineNo">456</span>      region.flush(true);<a name="line.456"></a>
+<span class="sourceLineNo">457</span>      // After flush, data size should be zero<a name="line.457"></a>
+<span class="sourceLineNo">458</span>      assertEquals(0, region.getMemStoreDataSize());<a name="line.458"></a>
+<span class="sourceLineNo">459</span>      // After flush, a new active mutable segment is created, so the heap size<a name="line.459"></a>
+<span class="sourceLineNo">460</span>      // should equal to MutableSegment.DEEP_OVERHEAD<a name="line.460"></a>
+<span class="sourceLineNo">461</span>      assertEquals(MutableSegment.DEEP_OVERHEAD, region.getMemStoreHeapSize());<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      // After flush, offheap should be zero<a name="line.462"></a>
+<span class="sourceLineNo">463</span>      assertEquals(0, region.getMemStoreOffHeapSize());<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    } finally {<a name="line.464"></a>
+<span class="sourceLineNo">465</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.465"></a>
+<span class="sourceLineNo">466</span>      this.region = null;<a name="line.466"></a>
+<span class="sourceLineNo">467</span>      wals.close();<a name="line.467"></a>
+<span class="sourceLineNo">468</span>    }<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>  /**<a name="line.471"></a>
+<span class="sourceLineNo">472</span>   * Test we do not lose data if we fail a flush and then close.<a name="line.472"></a>
+<span class="sourceLineNo">473</span>   * Part of HBase-10466.  Tests the following from the issue description:<a name="line.473"></a>
+<span class="sourceLineNo">474</span>   * "Bug 1: Wrong calculation of HRegion.memstoreSize: When a flush fails, data to be flushed is<a name="line.474"></a>
+<span class="sourceLineNo">475</span>   * kept in each MemStore's snapshot and wait for next flush attempt to continue on it. But when<a name="line.475"></a>
+<span class="sourceLineNo">476</span>   * the next flush succeeds, the counter of total memstore size in HRegion is always deduced by<a name="line.476"></a>
+<span class="sourceLineNo">477</span>   * the sum of current memstore sizes instead of snapshots left from previous failed flush. This<a name="line.477"></a>
+<span class="sourceLineNo">478</span>   * calculation is problematic that almost every time there is failed flush, HRegion.memstoreSize<a name="line.478"></a>
+<span class="sourceLineNo">479</span>   * gets reduced by a wrong value. If region flush could not proceed for a couple cycles, the size<a name="line.479"></a>
+<span class="sourceLineNo">480</span>   * in current memstore could be much larger than the snapshot. It's likely to drift memstoreSize<a name="line.480"></a>
+<span class="sourceLineNo">481</span>   * much smaller than expected. In extreme case, if the error accumulates to even bigger than<a name="line.481"></a>
+<span class="sourceLineNo">482</span>   * HRegion's memstore size limit, any further flush is skipped because flush does not do anything<a name="line.482"></a>
+<span class="sourceLineNo">483</span>   * if memstoreSize is not larger than 0."<a name="line.483"></a>
+<span class="sourceLineNo">484</span>   * @throws Exception<a name="line.484"></a>
+<span class="sourceLineNo">485</span>   */<a name="line.485"></a>
+<span class="sourceLineNo">486</span>  @Test<a name="line.486"></a>
+<span class="sourceLineNo">487</span>  public void testFlushSizeAccounting() throws Exception {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.488"></a>
+<span class="sourceLineNo">489</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.489"></a>
+<span class="sourceLineNo">490</span>    // Only retry once.<a name="line.490"></a>
+<span class="sourceLineNo">491</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.491"></a>
+<span class="sourceLineNo">492</span>    final User user =<a name="line.492"></a>
+<span class="sourceLineNo">493</span>      User.createUserForTesting(conf, method, new String[]{"foo"});<a name="line.493"></a>
+<span class="sourceLineNo">494</span>    // Inject our faulty LocalFileSystem<a name="line.494"></a>
+<span class="sourceLineNo">495</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.496"></a>
+<span class="sourceLineNo">497</span>      @Override<a name="line.497"></a>
+<span class="sourceLineNo">498</span>      public Object run() throws Exception {<a name="line.498"></a>
+<span class="sourceLineNo">499</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.499"></a>
+<span class="sourceLineNo">500</span>        FileSystem fs = FileSystem.get(conf);<a name="line.500"></a>
+<span class="sourceLineNo">501</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.501"></a>
+<span class="sourceLineNo">502</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.502"></a>
+<span class="sourceLineNo">503</span>        HRegion region = null;<a name="line.503"></a>
+<span class="sourceLineNo">504</span>        try {<a name="line.504"></a>
+<span class="sourceLineNo">505</span>          // Initialize region<a name="line.505"></a>
+<span class="sourceLineNo">506</span>          region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, wal,<a name="line.506"></a>
+<span class="sourceLineNo">507</span>              COLUMN_FAMILY_BYTES);<a name="line.507"></a>
+<span class="sourceLineNo">508</span>          long size = region.getMemStoreDataSize();<a name="line.508"></a>
+<span class="sourceLineNo">509</span>          Assert.assertEquals(0, size);<a name="line.509"></a>
+<span class="sourceLineNo">510</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.510"></a>
+<span class="sourceLineNo">511</span>          Put p1 = new Put(row);<a name="line.511"></a>
+<span class="sourceLineNo">512</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[]) null));<a name="line.512"></a>
+<span class="sourceLineNo">513</span>          region.put(p1);<a name="line.513"></a>
+<span class="sourceLineNo">514</span>          final long sizeOfOnePut = region.getMemStoreDataSize();<a name="line.514"></a>
+<span class="sourceLineNo">515</span>          // Fail a flush which means the current memstore will hang out as memstore 'snapshot'.<a name="line.515"></a>
+<span class="sourceLineNo">516</span>          try {<a name="line.516"></a>
+<span class="sourceLineNo">517</span>            LOG.info("Flushing");<a name="line.517"></a>
+<span class="sourceLineNo">518</span>            region.flush(true);<a name="line.518"></a>
+<span class="sourceLineNo">519</span>            Assert.fail("Didn't bubble up IOE!");<a name="line.519"></a>
+<span class="sourceLineNo">520</span>          } catch (DroppedSnapshotException dse) {<a name="line.520"></a>
+<span class="sourceLineNo">521</span>            // What we are expecting<a name="line.521"></a>
+<span class="sourceLineNo">522</span>            region.closing.set(false); // this is needed for the rest of the test to work<a name="line.522"></a>
+<span class="sourceLineNo">523</span>          }<a name="line.523"></a>
+<span class="sourceLineNo">524</span>          // Make it so all writes succeed from here on out<a name="line.524"></a>
+<span class="sourceLineNo">525</span>          ffs.fault.set(false);<a name="line.525"></a>
+<span class="sourceLineNo">526</span>          // Check sizes.  Should still be the one entry.<a name="line.526"></a>
+<span class="sourceLineNo">527</span>          Assert.assertEquals(sizeOfOnePut, region.getMemStoreDataSize());<a name="line.527"></a>
+<span class="sourceLineNo">528</span>          // Now add two entries so that on this next flush that fails, we can see if we<a name="line.528"></a>
+<span class="sourceLineNo">529</span>          // subtract the right amount, the snapshot size only.<a name="line.529"></a>
+<span class="sourceLineNo">530</span>          Put p2 = new Put(row);<a name="line.530"></a>
+<span class="sourceLineNo">531</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.531"></a>
+<span class="sourceLineNo">532</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.532"></a>
+<span class="sourceLineNo">533</span>          region.put(p2);<a name="line.533"></a>
+<span class="sourceLineNo">534</span>          long expectedSize = sizeOfOnePut * 3;<a name="line.534"></a>
+<span class="sourceLineNo">535</span>          Assert.assertEquals(expectedSize, region.getMemStoreDataSize());<a name="line.535"></a>
+<span class="sourceLineNo">536</span>          // Do a successful flush.  It will clear the snapshot only.  Thats how flushes work.<a name="line.536"></a>
+<span class="sourceLineNo">537</span>          // If already a snapshot, we clear it else we move the memstore to be snapshot and flush<a name="line.537"></a>
+<span class="sourceLineNo">538</span>          // it<a name="line.538"></a>
+<span class="sourceLineNo">539</span>          region.flush(true);<a name="line.539"></a>
+<span class="sourceLineNo">540</span>          // Make sure our memory accounting is right.<a name="line.540"></a>
+<span class="sourceLineNo">541</span>          Assert.assertEquals(sizeOfOnePut * 2, region.getMemStoreDataSize());<a name="line.541"></a>
+<span class="sourceLineNo">542</span>        } finally {<a name="line.542"></a>
+<span class="sourceLineNo">543</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.543"></a>
+<span class="sourceLineNo">544</span>        }<a name="line.544"></a>
+<span class="sourceLineNo">545</span>        return null;<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>    FileSystem.closeAllForUGI(user.getUGI());<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>  @Test<a name="line.551"></a>
+<span class="sourceLineNo">552</span>  public void testCloseWithFailingFlush() throws Exception {<a name="line.552"></a>
+<span class="sourceLineNo">553</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.553"></a>
+<span class="sourceLineNo">554</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.554"></a>
+<span class="sourceLineNo">555</span>    // Only retry once.<a name="line.555"></a>
+<span class="sourceLineNo">556</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.556"></a>
+<span class="sourceLineNo">557</span>    final User user =<a name="line.557"></a>
+<span class="sourceLineNo">558</span>      User.createUserForTesting(conf, this.method, new String[]{"foo"});<a name="line.558"></a>
+<span class="sourceLineNo">559</span>    // Inject our faulty LocalFileSystem<a name="line.559"></a>
+<span class="sourceLineNo">560</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.560"></a>
+<span class="sourceLineNo">561</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.561"></a>
+<span class="sourceLineNo">562</span>      @Override<a name="line.562"></a>
+<span class="sourceLineNo">563</span>      public Object run() throws Exception {<a name="line.563"></a>
+<span class="sourceLineNo">564</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.564"></a>
+<span class="sourceLineNo">565</span>        FileSystem fs = FileSystem.get(conf);<a name="line.565"></a>
+<span class="sourceLineNo">566</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.566"></a>
+<span class="sourceLineNo">567</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.567"></a>
+<span class="sourceLineNo">568</span>        HRegion region = null;<a name="line.568"></a>
+<span class="sourceLineNo">569</span>        try {<a name="line.569"></a>
+<span class="sourceLineNo">570</span>          // Initialize region<a name="line.570"></a>
+<span class="sourceLineNo">571</span>          region = initHRegion(tableName, null, null, false,<a name="line.571"></a>
+<span class="sourceLineNo">572</span>              Durability.SYNC_WAL, wal, COLUMN_FAMILY_BYTES);<a name="line.572"></a>
+<span class="sourceLineNo">573</span>          long size = region.getMemStoreDataSize();<a name="line.573"></a>
+<span class="sourceLineNo">574</span>          Assert.assertEquals(0, size);<a name="line.574"></a>
+<span class="sourceLineNo">575</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.575"></a>
+<span class="sourceLineNo">576</span>          Put p1 = new Put(row);<a name="line.576"></a>
+<span class="sourceLineNo">577</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[])null));<a name="line.577"></a>
+<span class="sourceLineNo">578</span>          region.put(p1);<a name="line.578"></a>
+<span class="sourceLineNo">579</span>          // Manufacture an outstanding snapshot -- fake a failed flush by doing prepare step only.<a name="line.579"></a>
+<span class="sourceLineNo">580</span>          HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.580"></a>
+<span class="sourceLineNo">581</span>          StoreFlushContext storeFlushCtx =<a name="line.581"></a>
+<span class="sourceLineNo">582</span>              store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY);<a name="line.582"></a>
+<span class="sourceLineNo">583</span>          storeFlushCtx.prepare();<a name="line.583"></a>
+<span class="sourceLineNo">584</span>          // Now add two entries to the foreground memstore.<a name="line.584"></a>
+<span class="sourceLineNo">585</span>          Put p2 = new Put(row);<a name="line.585"></a>
+<span class="sourceLineNo">586</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.586"></a>
+<span class="sourceLineNo">587</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.587"></a>
+<span class="sourceLineNo">588</span>          region.put(p2);<a name="line.588"></a>
+<span class="sourceLineNo">589</span>          // Now try close on top of a failing flush.<a name="line.589"></a>
+<span class="sourceLineNo">590</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.590"></a>
+<span class="sourceLineNo">591</span>          region = null;<a name="line.591"></a>
+<span class="sourceLineNo">592</span>          fail();<a name="line.592"></a>
+<span class="sourceLineNo">593</span>        } catch (DroppedSnapshotException dse) {<a name="line.593"></a>
+<span class="sourceLineNo">594</span>          // Expected<a name="line.594"></a>
+<span class="sourceLineNo">595</span>          LOG.info("Expected DroppedSnapshotException");<a name="line.595"></a>
+<span class="sourceLineNo">596</span>        } finally {<a name="line.596"></a>
+<span class="sourceLineNo">597</span>          // Make it so all writes succeed from here on out so can close clean<a name="line.597"></a>
+<span class="sourceLineNo">598</span>          ffs.fault.set(false);<a name="line.598"></a>
+<span class="sourceLineNo">599</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.599"></a>
+<span class="sourceLineNo">600</span>        }<a name="line.600"></a>
+<span class="sourceLineNo">601</span>        return null;<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>    FileSystem.closeAllForUGI(user.getUGI());<a name="line.604"></a>
+<span class="sourceLineNo">605</span>  }<a name="line.605"></a>
+<span class="sourceLineNo">606</span><a name="line.606"></a>
+<span class="sourceLineNo">607</span>  @Test<a name="line.607"></a>
+<span class="sourceLineNo">608</span>  public void testCompactionAffectedByScanners() throws Exception {<a name="line.608"></a>
+<span class="sourceLineNo">609</span>    byte[] family = Bytes.toBytes("family");<a name="line.609"></a>
+<span class="sourceLineNo">610</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.610"></a>
+<span class="sourceLineNo">611</span><a name="line.611"></a>
+<span class="sourceLineNo">612</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.612"></a>
+<span class="sourceLineNo">613</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.613"></a>
+<span class="sourceLineNo">614</span>    region.put(put);<a name="line.614"></a>
+<span class="sourceLineNo">615</span>    region.flush(true);<a name="line.615"></a>
+<span class="sourceLineNo">616</span><a name="line.616"></a>
+<span class="sourceLineNo">617</span>    Scan scan = new Scan();<a name="line.617"></a>
+<span class="sourceLineNo">618</span>    scan.setMaxVersions(3);<a name="line.618"></a>
+<span class="sourceLineNo">619</span>    // open the first scanner<a name="line.619"></a>
+<span class="sourceLineNo">620</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.620"></a>
+<span class="sourceLineNo">621</span><a name="line.621"></a>
+<span class="sourceLineNo">622</span>    Delete delete = new Delete(Bytes.toBytes("r1"));<a name="line.622"></a>
+<span class="sourceLineNo">623</span>    region.delete(delete);<a name="line.623"></a>
+<span class="sourceLineNo">624</span>    region.flush(true);<a name="line.624"></a>
+<span class="sourceLineNo">625</span><a name="line.625"></a>
+<span class="sourceLineNo">626</span>    // open the second scanner<a name="line.626"></a>
+<span class="sourceLineNo">627</span>    RegionScanner scanner2 = region.getScanner(scan);<a name="line.627"></a>
+<span class="sourceLineNo">628</span><a name="line.628"></a>
+<span class="sourceLineNo">629</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.629"></a>
+<span class="sourceLineNo">630</span><a name="line.630"></a>
+<span class="sourceLineNo">631</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.631"></a>
+<span class="sourceLineNo">632</span><a name="line.632"></a>
+<span class="sourceLineNo">633</span>    // make a major compaction<a name="line.633"></a>
+<span class="sourceLineNo">634</span>    region.compact(true);<a name="line.634"></a>
+<span class="sourceLineNo">635</span><a name="line.635"></a>
+<span class="sourceLineNo">636</span>    // open the third scanner<a name="line.636"></a>
+<span class="sourceLineNo">637</span>    RegionScanner scanner3 = region.getScanner(scan);<a name="line.637"></a>
+<span class="sourceLineNo">638</span><a name="line.638"></a>
+<span class="sourceLineNo">639</span>    // get data from scanner 1, 2, 3 after major compaction<a name="line.639"></a>
+<span class="sourceLineNo">640</span>    scanner1.next(results);<a name="line.640"></a>
+<span class="sourceLineNo">641</span>    System.out.println(results);<a name="line.641"></a>
+<span class="sourceLineNo">642</span>    assertEquals(1, results.size());<a name="line.642"></a>
+<span class="sourceLineNo">643</span><a name="line.643"></a>
+<span class="sourceLineNo">644</span>    results.clear();<a name="line.644"></a>
+<span class="sourceLineNo">645</span>    scanner2.next(results);<a name="line.645"></a>
+<span class="sourceLineNo">646</span>    System.out.println(results);<a name="line.646"></a>
+<span class="sourceLineNo">647</span>    assertEquals(0, results.size());<a name="line.647"></a>
+<span class="sourceLineNo">648</span><a name="line.648"></a>
+<span class="sourceLineNo">649</span>    results.clear();<a name="line.649"></a>
+<span class="sourceLineNo">650</span>    scanner3.next(results);<a name="line.650"></a>
+<span class="sourceLineNo">651</span>    System.out.println(results);<a name="line.651"></a>
+<span class="sourceLineNo">652</span>    assertEquals(0, results.size());<a name="line.652"></a>
+<span class="sourceLineNo">653</span>  }<a name="line.653"></a>
+<span class="sourceLineNo">654</span><a name="line.654"></a>
+<span class="sourceLineNo">655</span>  @Test<a name="line.655"></a>
+<span class="sourceLineNo">656</span>  public void testToShowNPEOnRegionScannerReseek() throws Exception {<a name="line.656"></a>
+<span class="sourceLineNo">657</span>    byte[] family = Bytes.toBytes("family");<a name="line.657"></a>
+<span class="sourceLineNo">658</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.658"></a>
+<span class="sourceLineNo">659</span><a name="line.659"></a>
+<span class="sourceLineNo">660</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.660"></a>
+<span class="sourceLineNo">661</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.661"></a>
+<span class="sourceLineNo">662</span>    region.put(put);<a name="line.662"></a>
+<span class="sourceLineNo">663</span>    put = new Put(Bytes.toBytes("r2"));<a name="line.663"></a>
+<span class="sourceLineNo">664</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.664"></a>
+<span class="sourceLineNo">665</span>    region.put(put);<a name="line.665"></a>
+<span class="sourceLineNo">666</span>    region.flush(true);<a name="line.666"></a>
+<span class="sourceLineNo">667</span><a name="line.667"></a>
+<span class="sourceLineNo">668</span>    Scan scan = new Scan();<a name="line.668"></a>
+<span class="sourceLineNo">669</span>    scan.setMaxVersions(3);<a name="line.669"></a>
+<span class="sourceLineNo">670</span>    // open the first scanner<a name="line.670"></a>
+<span class="sourceLineNo">671</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.671"></a>
+<span class="sourceLineNo">672</span><a name="line.672"></a>
+<span class="sourceLineNo">673</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.673"></a>
+<span class="sourceLineNo">674</span><a name="line.674"></a>
+<span class="sourceLineNo">675</span>    region.compact(true);<a name="line.675"></a>
+<span class="sourceLineNo">676</span><a name="line.676"></a>
+<span class="sourceLineNo">677</span>    scanner1.reseek(Bytes.toBytes("r2"));<a name="line.677"></a>
+<span class="sourceLineNo">678</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.678"></a>
+<span class="sourceLineNo">679</span>    scanner1.next(results);<a name="line.679"></a>
+<span class="sourceLineNo">680</span>    Cell keyValue = results.get(0);<a name="line.680"></a>
+<span class="sourceLineNo">681</span>    Assert.assertTrue(Bytes.compareTo(CellUtil.cloneRow(keyValue), Bytes.toBytes("r2")) == 0);<a name="line.681"></a>
+<span class="sourceLineNo">682</span>    scanner1.close();<a name="line.682"></a>
+<span class="sourceLineNo">683</span>  }<a name="line.683"></a>
+<span class="sourceLineNo">684</span><a name="line.684"></a>
+<span class="sourceLineNo">685</span>  @Test<a name="line.685"></a>
+<span class="sourceLineNo">686</span>  public void testSkipRecoveredEditsReplay() throws Exception {<a name="line.686"></a>
+<span class="sourceLineNo">687</span>    byte[] family = Bytes.toBytes("family");<a name="line.687"></a>
+<span class="sourceLineNo">688</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.688"></a>
+<span class="sourceLineNo">689</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.689"></a>
+<span class="sourceLineNo">690</span>    try {<a name="line.690"></a>
+<span class="sourceLineNo">691</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.691"></a>
+<span class="sourceLineNo">692</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.692"></a>
+<span class="sourceLineNo">693</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.693"></a>
+<span class="sourceLineNo">694</span><a name="line.694"></a>
+<span class="sourceLineNo">695</span>      Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.695"></a>
+<span class="sourceLineNo">696</span><a name="line.696"></a>
+<span class="sourceLineNo">697</span>      long maxSeqId = 1050;<a name="line.697"></a>
+<span class="sourceLineNo">698</span>      long minSeqId = 1000;<a name="line.698"></a>
+<span class="sourceLineNo">699</span><a name="line.699"></a>
+<span class="sourceLineNo">700</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.700"></a>
+<span class="sourceLineNo">701</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.701"></a>
+<span class="sourceLineNo">702</span>        fs.create(recoveredEdits);<a name="line.702"></a>
+<span class="sourceLineNo">703</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.703"></a>
+<span class="sourceLineNo">704</span><a name="line.704"></a>
+<span class="sourceLineNo">705</span>        long time = System.nanoTime();<a name="line.705"></a>
+<span class="sourceLineNo">706</span>        WALEdit edit = new WALEdit();<a name="line.706"></a>
+<span class="sourceLineNo">707</span>        edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.707"></a>
+<span class="sourceLineNo">708</span>            .toBytes(i)));<a name="line.708"></a>
+<span class="sourceLineNo">709</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.709"></a>
+<span class="sourceLineNo">710</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.710"></a>
+<span class="sourceLineNo">711</span><a name="line.711"></a>
+<span class="sourceLineNo">712</span>        writer.close();<a name="line.712"></a>
+<span class="sourceLineNo">713</span>      }<a name="line.713"></a>
+<span class="sourceLineNo">714</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.714"></a>
+<span class="sourceLineNo">715</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.715"></a>
+<span class="sourceLineNo">716</span>      for (HStore store : region.getStores()) {<a name="line.716"></a>
+<span class="sourceLineNo">717</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), minSeqId - 1);<a name="line.717"></a>
+<span class="sourceLineNo">718</span>      }<a name="line.718"></a>
+<span class="sourceLineNo">719</span>      long seqId = region.replayRecoveredEditsIfAny(maxSeqIdInStores, null, status);<a name="line.719"></a>
+<span class="sourceLineNo">720</span>      assertEquals(maxSeqId, seqId);<a name="line.720"></a>
+<span class="sourceLineNo">721</span>      region.getMVCC().advanceTo(seqId);<a name="line.721"></a>
+<span class="sourceLineNo">722</span>      Get get = new Get(row);<a name="line.722"></a>
+<span class="sourceLineNo">723</span>      Result result = region.get(get);<a name="line.723"></a>
+<span class="sourceLineNo">724</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.724"></a>
+<span class="sourceLineNo">725</span>        List&lt;Cell&gt; kvs = result.getColumnCells(family, Bytes.toBytes(i));<a name="line.725"></a>
+<span class="sourceLineNo">726</span>        assertEquals(1, kvs.size());<a name="line.726"></a>
+<span class="sourceLineNo">727</span>        assertArrayEquals(Bytes.toBytes(i), CellUtil.cloneValue(kvs.get(0)));<a name="line.727"></a>
+<span class="sourceLineNo">728</span>      }<a name="line.728"></a>
+<span class="sourceLineNo">729</span>    } finally {<a name="line.729"></a>
+<span class="sourceLineNo">730</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.730"></a>
+<span class="sourceLineNo">731</span>      this.region = null;<a name="line.731"></a>
+<span class="sourceLineNo">732</span>      wals.close();<a name="line.732"></a>
+<span class="sourceLineNo">733</span>    }<a name="line.733"></a>
+<span class="sourceLineNo">734</span>  }<a name="line.734"></a>
+<span class="sourceLineNo">735</span><a name="line.735"></a>
+<span class="sourceLineNo">736</span>  @Test<a name="line.736"></a>
+<span class="sourceLineNo">737</span>  public void testSkipRecoveredEditsReplaySomeIgnored() throws Exception {<a name="line.737"></a>
+<span class="sourceLineNo">738</span>    byte[] family = Bytes.toBytes("family");<a name="line.738"></a>
+<span class="sourceLineNo">739</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.739"></a>
+<span class="sourceLineNo">740</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.740"></a>
+<span class="sourceLineNo">741</span>    try {<a name="line.741"></a>
+<span class="sourceLineNo">742</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.742"></a>
+<span class="sourceLineNo">743</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.743"></a>
+<span class="sourceLineNo">744</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.744"></a>
+<span class="sourceLineNo">745</span><a name="line.745"></a>
+<span class="sourceLineNo">746</span>      Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.746"></a>
+<span class="sourceLineNo">747</span><a name="line.747"></a>
+<span class="sourceLineNo">748</span>      long maxSeqId = 1050;<a name="line.748"></a>
+<span class="sourceLineNo">749</span>      long minSeqId = 1000;<a name="line.749"></a>
+<span class="sourceLineNo">750</span><a name="line.750"></a>
+<span class="sourceLineNo">751</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.751"></a>
+<span class="sourceLineNo">752</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.752"></a>
+<span class="sourceLineNo">753</span>        fs.create(recoveredEdits);<a name="line.753"></a>
+<span class="sourceLineNo">754</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.754"></a>
+<span class="sourceLineNo">755</span><a name="line.755"></a>
+<span class="sourceLineNo">756</span>        long time = System.nanoTime();<a name="line.756"></a>
+<span class="sourceLineNo">757</span>        WALEdit edit = new WALEdit();<a name="line.757"></a>
+<span class="sourceLineNo">758</span>        edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.758"></a>
+<span class="sourceLineNo">759</span>            .toBytes(i)));<a name="line.759"></a>
+<span class="sourceLineNo">760</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.760"></a>
+<span class="sourceLineNo">761</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.761"></a>
+<span class="sourceLineNo">762</span><a name="line.762"></a>
+<span class="sourceLineNo">763</span>        writer.close();<a name="line.763"></a>
+<span class="sourceLineNo">764</span>      }<a name="line.764"></a>
+<span class="sourceLineNo">765</span>      long recoverSeqId = 1030;<a name="line.765"></a>
+<span class="sourceLineNo">766</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.766"></a>
+<span class="sourceLineNo">767</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.767"></a>
+<span class="sourceLineNo">768</span>      for (HStore store : region.getStores()) {<a name="line.768"></a>
+<span class="sourceLineNo">769</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), recoverSeqId - 1);<a name="line.769"></a>
+<span class="sourceLineNo">770</span>      }<a name="line.770"></a>
+<span class="sourceLineNo">771</span>      long seqId = region.replayRecoveredEditsIfAny(maxSeqIdInStores, null, status);<a name="line.771"></a>
+<span class="sourceLineNo">772</span>      assertEquals(maxSeqId, seqId);<a name="line.772"></a>
+<span class="sourceLineNo">773</span>      region.getMVCC().advanceTo(seqId);<a name="line.773"></a>
+<span class="sourceLineNo">774</span>      Get get = new Get(row);<a name="line.774"></a>
+<span class="sourceLineNo">775</span>      Result result = region.get(get);<a name="line.775"></a>
+<span class="sourceLineNo">776</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.776"></a>
+<span class="sourceLineNo">777</span>        List&lt;Cell&gt; kvs = result.getColumnCells(family, Bytes.toBytes(i));<a name="line.777"></a>
+<span class="sourceLineNo">778</span>        if (i &lt; recoverSeqId) {<a name="line.778"></a>
+<span class="sourceLineNo">779</span>          assertEquals(0, kvs.size());<a name="line.779"></a>
+<span class="sourceLineNo">780</span>        } else {<a name="line.780"></a>
+<span class="sourceLineNo">781</span>          assertEquals(1, kvs.size());<a name="line.781"></a>
+<span class="sourceLineNo">782</span>          assertArrayEquals(Bytes.toBytes(i), CellUtil.cloneValue(kvs.get(0)));<a name="line.782"></a>
+<span class="sourceLineNo">783</span>        }<a name="line.783"></a>
+<span class="sourceLineNo">784</span>      }<a name="line.784"></a>
+<span class="sourceLineNo">785</span>    } finally {<a name="line.785"></a>
+<span class="sourceLineNo">786</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.786"></a>
+<span class="sourceLineNo">787</span>      this.region = null;<a name="line.787"></a>
+<span class="sourceLineNo">788</span>      wals.close();<a name="line.788"></a>
+<span class="sourceLineNo">789</span>    }<a name="line.789"></a>
+<span class="sourceLineNo">790</span>  }<a name="line.790"></a>
+<span class="sourceLineNo">791</span><a name="line.791"></a>
+<span class="sourceLineNo">792</span>  @Test<a name="line.792"></a>
+<span class="sourceLineNo">793</span>  public void testSkipRecoveredEditsReplayAllIgnored() throws Exception {<a name="line.793"></a>
+<span class="sourceLineNo">794</span>    byte[] family = Bytes.toBytes("family");<a name="line.794"></a>
+<span class="sourceLineNo">795</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.795"></a>
+<span class="sourceLineNo">796</span>    Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.796"></a>
+<span class="sourceLineNo">797</span>    FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.797"></a>
+<span class="sourceLineNo">798</span><a name="line.798"></a>
+<span class="sourceLineNo">799</span>    Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.799"></a>
+<span class="sourceLineNo">800</span>    for (int i = 1000; i &lt; 1050; i += 10) {<a name="line.800"></a>
+<span class="sourceLineNo">801</span>      Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.801"></a>
+<span class="sourceLineNo">802</span>      FSDataOutputStream dos = fs.create(recoveredEdits);<a name="line.802"></a>
+<span class="sourceLineNo">803</span>      dos.writeInt(i);<a name="line.803"></a>
+<span class="sourceLineNo">804</span>      dos.close();<a name="line.804"></a>
+<span class="sourceLineNo">805</span>    }<a name="line.805"></a>
+<span class="sourceLineNo">806</span>    long minSeqId = 2000;<a name="line.806"></a>
+<span class="sourceLineNo">807</span>    Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", minSeqId - 1));<a name="line.807"></a>
+<span class="sourceLineNo">808</span>    FSDataOutputStream dos = fs.create(recoveredEdits);<a name="line.808"></a>
+<span class="sourceLineNo">809</span>    dos.close();<a name="line.809"></a>
+<span class="sourceLineNo">810</span><a name="line.810"></a>
+<span class="sourceLineNo">811</span>    Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.811"></a>
+<span class="sourceLineNo">812</span>    for (HStore store : region.getStores()) {<a name="line.812"></a>
+<span class="sourceLineNo">813</span>      maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), minSeqId);<a name="line.813"></a>
+<span class="sourceLineNo">814</span>    }<a name="line.814"></a>
+<span class="sourceLineNo">815</span>    long seqId = region.replayRecoveredEditsIfAny(maxSeqIdInStores, null, null);<a name="line.815"></a>
+<span class="sourceLineNo">816</span>    assertEquals(minSeqId, seqId);<a name="line.816"></a>
+<span class="sourceLineNo">817</span>  }<a name="line.817"></a>
+<span class="sourceLineNo">818</span><a name="line.818"></a>
+<span class="sourceLineNo">819</span>  @Test<a name="line.819"></a>
+<span class="sourceLineNo">820</span>  public void testSkipRecoveredEditsReplayTheLastFileIgnored() throws Exception {<a name="line.820"></a>
+<span class="sourceLineNo">821</span>    byte[] family = Bytes.toBytes("family");<a name="line.821"></a>
+<span class="sourceLineNo">822</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.822"></a>
+<span class="sourceLineNo">823</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.823"></a>
+<span class="sourceLineNo">824</span>    try {<a name="line.824"></a>
+<span class="sourceLineNo">825</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.825"></a>
+<span class="sourceLineNo">826</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.826"></a>
+<span class="sourceLineNo">827</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.827"></a>
+<span class="sourceLineNo">828</span>      byte[][] columns = region.getTableDescriptor().getColumnFamilyNames().toArray(new byte[0][]);<a name="line.828"></a>
+<span class="sourceLineNo">829</span><a name="line.829"></a>
+<span class="sourceLineNo">830</span>      assertEquals(0, region.getStoreFileList(columns).size());<a name="line.830"></a>
+<span class="sourceLineNo">831</span><a name="line.831"></a>
+<span class="sourceLineNo">832</span>      Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.832"></a>
+<span class="sourceLineNo">833</span><a name="line.833"></a>
+<span class="sourceLineNo">834</span>      long maxSeqId = 1050;<a name="line.834"></a>
+<span class="sourceLineNo">835</span>      long minSeqId = 1000;<a name="line.835"></a>
+<span class="sourceLineNo">836</span><a name="line.836"></a>
+<span class="sourceLineNo">837</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.837"></a>
+<span class="sourceLineNo">838</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.838"></a>
+<span class="sourceLineNo">839</span>        fs.create(recoveredEdits);<a name="line.839"></a>
+<span class="sourceLineNo">840</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.840"></a>
+<span class="sourceLineNo">841</span><a name="line.841"></a>
+<span class="sourceLineNo">842</span>        long time = System.nanoTime();<a name="line.842"></a>
+<span class="sourceLineNo">843</span>        WALEdit edit = null;<a name="line.843"></a>
+<span class="sourceLineNo">844</span>        if (i == maxSeqId) {<a name="line.844"></a>
+<span class="sourceLineNo">845</span>          edit = WALEdit.createCompaction(region.getRegionInfo(),<a name="line.845"></a>
+<span class="sourceLineNo">846</span>          CompactionDescriptor.newBuilder()<a name="line.846"></a>
+<span class="sourceLineNo">847</span>          .setTableName(ByteString.copyFrom(tableName.getName()))<a name="line.847"></a>
+<span class="sourceLineNo">848</span>          .setFamilyName(ByteString.copyFrom(regionName))<a name="line.848"></a>
+<span class="sourceLineNo">849</span>          .setEncodedRegionName(ByteString.copyFrom(regionName))<a name="line.849"></a>
+<span class="sourceLineNo">850</span>          .setStoreHomeDirBytes(ByteString.copyFrom(Bytes.toBytes(regiondir.toString())))<a name="line.850"></a>
+<span class="sourceLineNo">851</span>          .setRegionName(ByteString.copyFrom(region.getRegionInfo().getRegionName()))<a name="line.851"></a>
+<span class="sourceLineNo">852</span>          .build());<a name="line.852"></a>
+<span class="sourceLineNo">853</span>        } else {<a name="line.853"></a>
+<span class="sourceLineNo">854</span>          edit = new WALEdit();<a name="line.854"></a>
+<span class="sourceLineNo">855</span>          edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.855"></a>
+<span class="sourceLineNo">856</span>            .toBytes(i)));<a name="line.856"></a>
+<span class="sourceLineNo">857</span>        }<a name="line.857"></a>
+<span class="sourceLineNo">858</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.858"></a>
+<span class="sourceLineNo">859</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.859"></a>
+<span class="sourceLineNo">860</span>        writer.close();<a name="line.860"></a>
+<span class="sourceLineNo">861</span>      }<a name="line.861"></a>
+<span class="sourceLineNo">862</span><a name="line.862"></a>
+<span class="sourceLineNo">863</span>      long recoverSeqId = 1030;<a name="line.863"></a>
+<span class="sourceLineNo">864</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.864"></a>
+<span class="sourceLineNo">865</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.865"></a>
+<span class="sourceLineNo">866</span>      for (HStore store : region.getStores()) {<a name="line.866"></a>
+<span class="sourceLineNo">867</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), recoverSeqId - 1);<a name="line.867"></a>
+<span class="sourceLineNo">868</span>      }<a name="line.868"></a>
+<span class="sourceLineNo">869</span>      long seqId = region.replayRecoveredEditsIfAny(maxSeqIdInStores, null, status);<a name="line.869"></a>
+<span class="sourceLineNo">870</span>      assertEquals(maxSeqId, seqId);<a name="line.870"></a>
+<span class="sourceLineNo">871</span><a name="line.871"></a>
+<span class="sourceLineNo">872</span>      // assert that the files are flushed<a name="line.872"></a>
+<span class="sourceLineNo">873</span>      assertEquals(1, region.getStoreFileList(columns).size());<a name="line.873"></a>
+<span class="sourceLineNo">874</span><a name="line.874"></a>
+<span class="sourceLineNo">875</span>    } finally {<a name="line.875"></a>
+<span class="sourceLineNo">876</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.876"></a>
+<span class="sourceLineNo">877</span>      this.region = null;<a name="line.877"></a>
+<span class="sourceLineNo">878</span>      wals.close();<a name="line.878"></a>
+<span class="sourceLineNo">879</span>    }<a name="line.879"></a>
+<span class="sourceLineNo">880</span>  }<a name="line.880"></a>
+<span class="sourceLineNo">881</span><a name="line.881"></a>
+<span class="sourceLineNo">882</span>  @Test<a name="line.882"></a>
+<span class="sourceLineNo">883</span>  public void testRecoveredEditsReplayCompaction() throws Exception {<a name="line.883"></a>
+<span class="sourceLineNo">884</span>    testRecoveredEditsReplayCompaction(false);<a name="line.884"></a>
+<span class="sourceLineNo">885</span>    testRecoveredEditsReplayCompaction(true);<a name="line.885"></a>
+<span class="sourceLineNo">886</span>  }<a name="line.886"></a>
+<span class="sourceLineNo">887</span><a name="line.887"></a>
+<span class="sourceLineNo">888</span>  public void testRecoveredEditsReplayCompaction(boolean mismatchedRegionName) throws Exception {<a name="line.888"></a>
+<span class="sourceLineNo">889</span>    CONF.setClass(HConstants.REGION_IMPL, HRegionForTesting.class, Region.class);<a name="line.889"></a>
+<span class="sourceLineNo">890</span>    byte[] family = Bytes.toBytes("family");<a name="line.890"></a>
+<span class="sourceLineNo">891</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.891"></a>
+<span class="sourceLineNo">892</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.892"></a>
+<span class="sourceLineNo">893</span>    try {<a name="line.893"></a>
+<span class="sourceLineNo">894</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.894"></a>
+<span class="sourceLineNo">895</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.895"></a>
+<span class="sourceLineNo">896</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.896"></a>
+<span class="sourceLineNo">897</span><a name="line.897"></a>
+<span class="sourceLineNo">898</span>      long maxSeqId = 3;<a name="line.898"></a>
+<span class="sourceLineNo">899</span>      long minSeqId = 0;<a name="line.899"></a>
+<span class="sourceLineNo">900</span><a name="line.900"></a>
+<span class="sourceLineNo">901</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.901"></a>
+<span class="sourceLineNo">902</span>        Put put = new Put(Bytes.toBytes(i));<a name="line.902"></a>
+<span class="sourceLineNo">903</span>        put.addColumn(family, Bytes.toBytes(i), Bytes.toBytes(i));<a name="line.903"></a>
+<span class="sourceLineNo">904</span>        region.put(put);<a name="line.904"></a>
+<span class="sourceLineNo">905</span>        region.flush(true);<a name="line.905"></a>
+<span class="sourceLineNo">906</span>      }<a name="line.906"></a>
+<span class="sourceLineNo">907</span><a name="line.907"></a>
+<span class="sourceLineNo">908</span>      // this will create a region with 3 files<a name="line.908"></a>
+<span class="sourceLineNo">909</span>      assertEquals(3, region.getStore(family).getStorefilesCount());<a name="line.909"></a>
+<span class="sourceLineNo">910</span>      List&lt;Path&gt; storeFiles = new ArrayList&lt;&gt;(3);<a name="line.910"></a>
+<span class="sourceLineNo">911</span>      for (HStoreFile sf : region.getStore(family).getStorefiles()) {<a name="line.911"></a>
+<span class="sourceLineNo">912</span>        storeFiles.add(sf.getPath());<a name="line.912"></a>
+<span class="sourceLineNo">913</span>      }<a name="line.913"></a>
+<span class="sourceLineNo">914</span><a name="line.914"></a>
+<span class="sourceLineNo">915</span>      // disable compaction completion<a name="line.915"></a>
+<span class="sourceLineNo">916</span>      CONF.setBoolean("hbase.hstore.compaction.complete", false);<a name="line.916"></a>
+<span class="sourceLineNo">917</span>      region.compactStores();<a name="line.917"></a>
+<span class="sourceLineNo">918</span><a name="line.918"></a>
+<span class="sourceLineNo">919</span>      // ensure that nothing changed<a name="line.919"></a>
+<span class="sourceLineNo">920</span>      assertEquals(3, region.getStore(family).getStorefilesCount());<a name="line.920"></a>
+<span class="sourceLineNo">921</span><a name="line.921"></a>
+<span class="sourceLineNo">922</span>      // now find the compacted file, and manually add it to the recovered edits<a name="line.922"></a>
+<span class="sourceLineNo">923</span>      Path tmpDir = new Path(region.getRegionFileSystem().getTempDir(), Bytes.toString(family));<a name="line.923"></a>
+<span class="sourceLineNo">924</span>      FileStatus[] files = FSUtils.listStatus(fs, tmpDir);<a name="line.924"></a>
+<span class="sourceLineNo">925</span>      String errorMsg = "Expected to find 1 file in the region temp directory "<a name="line.925"></a>
+<span class="sourceLineNo">926</span>          + "from the compaction, could not find any";<a name="line.926"></a>
+<span class="sourceLineNo">927</span>      assertNotNull(errorMsg, files);<a name="line.927"></a>
+<span class="sourceLineNo">928</span>      assertEquals(errorMsg, 1, files.length);<a name="line.928"></a>
+<span class="sourceLineNo">929</span>      // move the file inside region dir<a name="line.929"></a>
+<span class="sourceLineNo">930</span>      Path newFile = region.getRegionFileSystem().commitStoreFile(Bytes.toString(family),<a name="line.930"></a>
+<span class="sourceLineNo">931</span>          files[0].getPath());<a name="line.931"></a>
+<span class="sourceLineNo">932</span><a name="line.932"></a>
+<span class="sourceLineNo">933</span>      byte[] encodedNameAsBytes = this.region.getRegionInfo().getEncodedNameAsBytes();<a name="line.933"></a>
+<span class="sourceLineNo">934</span>      byte[] fakeEncodedNameAsBytes = new byte [encodedNameAsBytes.length];<a name="line.934"></a>
+<span class="sourceLineNo">935</span>      for (int i=0; i &lt; encodedNameAsBytes.length; i++) {<a name="line.935"></a>
+<span class="sourceLineNo">936</span>        // Mix the byte array to have a new encodedName<a name="line.936"></a>
+<span class="sourceLineNo">937</span>        fakeEncodedNameAsBytes[i] = (byte) (encodedNameAsBytes[i] + 1);<a name="line.937"></a>
+<span class="sourceLineNo">938</span>      }<a name="line.938"></a>
+<span class="sourceLineNo">939</span><a name="line.939"></a>
+<span class="sourceLineNo">940</span>      CompactionDescriptor compactionDescriptor = ProtobufUtil.toCompactionDescriptor(this.region<a name="line.940"></a>
+<span class="sourceLineNo">941</span>        .getRegionInfo(), mismatchedRegionName ? fakeEncodedNameAsBytes : null, family,<a name="line.941"></a>
+<span class="sourceLineNo">942</span>            storeFiles, Lists.newArrayList(newFile),<a name="line.942"></a>
+<span class="sourceLineNo">943</span>            region.getRegionFileSystem().getStoreDir(Bytes.toString(family)));<a name="line.943"></a>
+<span class="sourceLineNo">944</span><a name="line.944"></a>
+<span class="sourceLineNo">945</span>      WALUtil.writeCompactionMarker(region.getWAL(), this.region.getReplicationScope(),<a name="line.945"></a>
+<span class="sourceLineNo">946</span>          this.region.getRegionInfo(), compactionDescriptor, region.getMVCC());<a name="line.946"></a>
+<span class="sourceLineNo">947</span><a name="line.947"></a>
+<span class="sourceLineNo">948</span>      Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.948"></a>
+<span class="sourceLineNo">949</span><a name="line.949"></a>
+<span class="sourceLineNo">950</span>      Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", 1000));<a name="line.950"></a>
+<span class="sourceLineNo">951</span>      fs.create(recoveredEdits);<a name="line.951"></a>
+<span class="sourceLineNo">952</span>      WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.952"></a>
+<span class="sourceLineNo">953</span><a name="line.953"></a>
+<span class="sourceLineNo">954</span>      long time = System.nanoTime();<a name="line.954"></a>
+<span class="sourceLineNo">955</span><a name="line.955"></a>
+<span class="sourceLineNo">956</span>      writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, 10, time,<a name="line.956"></a>
+<span class="sourceLineNo">957</span>          HConstants.DEFAULT_CLUSTER_ID), WALEdit.createCompaction(region.getRegionInfo(),<a name="line.957"></a>
+<span class="sourceLineNo">958</span>          compactionDescriptor)));<a name="line.958"></a>
+<span class="sourceLineNo">959</span>      writer.close();<a name="line.959"></a>
+<span class="sourceLineNo">960</span><a name="line.960"></a>
+<span class="sourceLineNo">961</span>      // close the region now, and reopen again<a name="line.961"></a>
+<span class="sourceLineNo">962</span>      region.getTableDescriptor();<a name="line.962"></a>
+<span class="sourceLineNo">963</span>      region.getRegionInfo();<a name="line.963"></a>
+<span class="sourceLineNo">964</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.964"></a>
+<span class="sourceLineNo">965</span>      try {<a name="line.965"></a>
+<span class="sourceLineNo">966</span>        region = HRegion.openHRegion(region, null);<a name="line.966"></a>
+<span class="sourceLineNo">967</span>      } catch (WrongRegionException wre) {<a name="line.967"></a>
+<span class="sourceLineNo">968</span>        fail("Matching encoded region name should not have produced WrongRegionException");<a name="line.968"></a>
+<span class="sourceLineNo">969</span>      }<a name="line.969"></a>
+<span class="sourceLineNo">970</span><a name="line.970"></a>
+<span class="sourceLineNo">971</span>      // now check whether we have only one store file, the compacted one<a name="line.971"></a>
+<span class="sourceLineNo">972</span>      Collection&lt;HStoreFile&gt; sfs = region.getStore(family).getStorefiles();<a name="line.972"></a>
+<span class="sourceLineNo">973</span>      for (HStoreFile sf : sfs) {<a name="line.973"></a>
+<span class="sourceLineNo">974</span>        LOG.info(Objects.toString(sf.getPath()));<a name="line.974"></a>
+<span class="sourceLineNo">975</span>      }<a name="line.975"></a>
+<span class="sourceLineNo">976</span>      if (!mismatchedRegionName) {<a name="line.976"></a>
+<span class="sourceLineNo">977</span>        assertEquals(1, region.getStore(family).getStorefilesCount());<a name="line.977"></a>
+<span class="sourceLineNo">978</span>      }<a name="line.978"></a>
+<span class="sourceLineNo">979</span>      files = FSUtils.listStatus(fs, tmpDir);<a name="line.979"></a>
+<span class="sourceLineNo">980</span>      assertTrue("Expected to find 0 files inside " + tmpDir, files == null || files.length == 0);<a name="line.980"></a>
+<span class="sourceLineNo">981</span><a name="line.981"></a>
+<span class="sourceLineNo">982</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.982"></a>
+<span class="sourceLineNo">983</span>        Get get = new Get(Bytes.toBytes(i));<a name="line.983"></a>
+<span class="sourceLineNo">984</span>        Result result = region.get(get);<a name="line.984"></a>
+<span class="sourceLineNo">985</span>        byte[] value = result.getValue(family, Bytes.toBytes(i));<a name="line.985"></a>
+<span class="sourceLineNo">986</span>        assertArrayEquals(Bytes.toBytes(i), value);<a name="line.986"></a>
+<span class="sourceLineNo">987</span>      }<a name="line.987"></a>
+<span class="sourceLineNo">988</span>    } finally {<a name="line.988"></a>
+<span class="sourceLineNo">989</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.989"></a>
+<span class="sourceLineNo">990</span>      this.region = null;<a name="line.990"></a>
+<span class="sourceLineNo">991</span>      wals.close();<a name="line.991"></a>
+<span class="sourceLineNo">992</span>      CONF.setClass(HConstants.REGION_IMPL, HRegion.class, Region.class);<a name="line.992"></a>
+<span class="sourceLineNo">993</span>    }<a name="line.993"></a>
+<span class="sourceLineNo">994</span>  }<a name="line.994"></a>
+<span class="sourceLineNo">995</span><a name="line.995"></a>
+<span class="sourceLineNo">996</span>  @Test<a name="line.996"></a>
+<span class="sourceLineNo">997</span>  public void testFlushMarkers() throws Exception {<a name="line.997"></a>
+<span class="sourceLineNo">998</span>    // tests that flush markers are written to WAL and handled at recovered edits<a name="line.998"></a>
+<span class="sourceLineNo">999</span>    byte[] family = Bytes.toBytes("family");<a name="line.999"></a>
+<span class="sourceLineNo">1000</span>    Path logDir = TEST_UTIL.getDataTestDirOnTestFS(method + ".log");<a name="line.1000"></a>
+<span class="sourceLineNo">1001</span>    final Configuration walConf = new Configuration(TEST_UTIL.getConfiguration());<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.1002"></a>
+<span class="sourceLineNo">1003</span>    final WALFactory wals = new WALFactory(walConf, method);<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span>    final WAL wal = wals.getWAL(RegionInfoBuilder.newBuilder(tableName).build());<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span><a name="line.1005"></a>
+<span class="sourceLineNo">1006</span>    this.region = initHRegion(tableName, HConstants.EMPTY_START_ROW,<a name="line.1006"></a>
+<span class="sourceLineNo">1007</span>      HConstants.EMPTY_END_ROW, false, Durability.USE_DEFAULT, wal, family);<a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>    try {<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span><a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>      long maxSeqId = 3;<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span>      long minSeqId = 0;<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span><a name="line.1015"></a>
+<span class="sourceLineNo">1016</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>        Put put = new Put(Bytes.toBytes(i));<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span>        put.addColumn(family, Bytes.toBytes(i), Bytes.toBytes(i));<a name="line.1018"></a>
+<span class="sourceLineNo">1019</span>        region.put(put);<a name="line.1019"></a>
+<span class="sourceLineNo">1020</span>        region.flush(true);<a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>      }<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span><a name="line.1022"></a>
+<span class="sourceLineNo">1023</span>      // this will create a region with 3 files from flush<a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>      assertEquals(3, region.getStore(family).getStorefilesCount());<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span>      List&lt;String&gt; storeFiles = new ArrayList&lt;&gt;(3);<a name="line.1025"></a>
+<span class="sourceLineNo">1026</span>      for (HStoreFile sf : region.getStore(family).getStorefiles()) {<a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>        storeFiles.add(sf.getPath().getName());<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span>      }<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span><a name="line.1029"></a>
+<span class="sourceLineNo">1030</span>      // now verify that the flush markers are written<a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>      wal.shutdown();<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>      WAL.Reader reader = WALFactory.createReader(fs, AbstractFSWALProvider.getCurrentFileName(wal),<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>        TEST_UTIL.getConfiguration());<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>      try {<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span>        List&lt;WAL.Entry&gt; flushDescriptors = new ArrayList&lt;&gt;();<a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>        long lastFlushSeqId = -1;<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>        while (true) {<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>          WAL.Entry entry = reader.next();<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>          if (entry == null) {<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>            break;<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span>          }<a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>          Cell cell = entry.getEdit().getCells().get(0);<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>          if (WALEdit.isMetaEditFamily(cell)) {<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>            FlushDescriptor flushDesc = WALEdit.getFlushDescriptor(cell);<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span>            assertNotNull(flushDesc);<a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>            assertArrayEquals(tableName.getName(), flushDesc.getTableName().toByteArray());<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>            if (flushDesc.getAction() == FlushAction.START_FLUSH) {<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span>              assertTrue(flushDesc.getFlushSequenceNumber() &gt; lastFlushSeqId);<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span>            } else if (flushDesc.getAction() == FlushAction.COMMIT_FLUSH) {<a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>              assertTrue(flushDesc.getFlushSequenceNumber() == lastFlushSeqId);<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>            }<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>            lastFlushSeqId = flushDesc.getFlushSequenceNumber();<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>            assertArrayEquals(regionName, flushDesc.getEncodedRegionName().toByteArray());<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>            assertEquals(1, flushDesc.getStoreFlushesCount()); //only one store<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>            StoreFlushDescriptor storeFlushDesc = flushDesc.getStoreFlushes(0);<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>            assertArrayEquals(family, storeFlushDesc.getFamilyName().toByteArray());<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span>            assertEquals("family", storeFlushDesc.getStoreHomeDir());<a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>            if (flushDesc.getAction() == FlushAction.START_FLUSH) {<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>              assertEquals(0, storeFlushDesc.getFlushOutputCount());<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>            } else {<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>              assertEquals(1, storeFlushDesc.getFlushOutputCount()); //only one file from flush<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>              assertTrue(storeFiles.contains(storeFlushDesc.getFlushOutput(0)));<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>            }<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span><a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>            flushDescriptors.add(entry);<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>          }<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>        }<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span><a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>        assertEquals(3 * 2, flushDescriptors.size()); // START_FLUSH and COMMIT_FLUSH per flush<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span><a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>        // now write those markers to the recovered edits again.<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span><a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>        Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span><a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", 1000));<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>        fs.create(recoveredEdits);<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span><a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>        for (WAL.Entry entry : flushDescriptors) {<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>          writer.append(entry);<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>        }<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>        writer.close();<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>      } finally {<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>        if (null != reader) {<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>          try {<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>            reader.close();<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>          } catch (IOException exception) {<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>            LOG.warn("Problem closing wal: " + exception.getMessage());<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>            LOG.debug("exception details", exception);<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>          }<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>        }<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>      }<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span><a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>      // close the region now, and reopen again<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>      region = HRegion.openHRegion(region, null);<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span><a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>      // now check whether we have can read back the data from region<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>        Get get = new Get(Bytes.toBytes(i));<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>        Result result = region.get(get);<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>        byte[] value = result.getValue(family, Bytes.toBytes(i));<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>        assertArrayEquals(Bytes.toBytes(i), value);<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>      }<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>    } finally {<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>      this.region = null;<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>      wals.close();<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>    }<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>  }<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span><a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>  static class IsFlushWALMarker implements ArgumentMatcher&lt;WALEdit&gt; {<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>    volatile FlushAction[] actions;<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>    public IsFlushWALMarker(FlushAction... actions) {<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>      this.actions = actions;<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>    }<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span>    @Override<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>    public boolean matches(WALEdit edit) {<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>      List&lt;Cell&gt; cells = edit.getCells();<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>      if (cells.isEmpty()) {<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span>        return false;<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>      }<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>      if (WALEdit.isMetaEditFamily(cells.get(0))) {<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>        FlushDescriptor desc;<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>        try {<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>          desc = WALEdit.getFlushDescriptor(cells.get(0));<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>        } catch (IOException e) {<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>          LOG.warn(e.toString(), e);<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>          return false;<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>        }<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>        if (desc != null) {<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>          for (FlushAction action : actions) {<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>            if (desc.getAction() == action) {<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>              return true;<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>            }<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>          }<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>        }<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>      }<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span>      return false;<a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>    }<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>    public IsFlushWALMarker set(FlushAction... actions) {<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>      this.actions = actions;<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>      return this;<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>    }<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>  }<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span><a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>  @Test<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span>  public void testFlushMarkersWALFail() throws Exception {<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>    // test the cases where the WAL append for flush markers fail.<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>    byte[] family = Bytes.toBytes("family");<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span><a name="line.1151"></a>
+<span class="sourceLineNo">1152</span>    // spy an actual WAL implementation to throw exception (was not able to mock)<a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>    Path logDir = TEST_UTIL.getDataTestDirOnTestFS(method + "log");<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span><a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>    final Configuration walConf = new Configuration(TEST_UTIL.getConfiguration());<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>    // Make up a WAL that we can manipulate at append time.<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>    class FailAppendFlushMarkerWAL extends FSHLog {<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>      volatile FlushAction [] flushActions = null;<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span><a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>      public FailAppendFlushMarkerWAL(FileSystem fs, Path root, String logDir, Configuration conf)<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>      throws IOException {<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>        super(fs, root, logDir, conf);<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>      }<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span><a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>      @Override<a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>      protected Writer createWriterInstance(Path path) throws IOException {<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>        final Writer w = super.createWriterInstance(path);<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>        return new Writer() {<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>          @Override<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>          public void close() throws IOException {<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>            w.close();<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>          }<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span><a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>          @Override<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>          public void sync(boolean forceSync) throws IOException {<a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>            w.sync(forceSync);<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span>          }<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span><a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>          @Override<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>          public void append(Entry entry) throws IOException {<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>            List&lt;Cell&gt; cells = entry.getEdit().getCells();<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>            if (WALEdit.isMetaEditFamily(cells.get(0))) {<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>              FlushDescriptor desc = WALEdit.getFlushDescriptor(cells.get(0));<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>              if (desc != null) {<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>                for (FlushAction flushAction: flushActions) {<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>                  if (desc.getAction().equals(flushAction)) {<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>                    throw new IOException("Failed to append flush marker! " + flushAction);<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>                  }<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>                }<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>              }<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>            }<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>            w.append(entry);<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>          }<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span><a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>          @Override<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>          public long getLength() {<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>            return w.getLength();<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>          }<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>        };<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>      }<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>    }<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>    FailAppendFlushMarkerWAL wal =<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>      new FailAppendFlushMarkerWAL(FileSystem.get(walConf), FSUtils.getRootDir(walConf),<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>        method, walConf);<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>    wal.init();<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>    this.region = initHRegion(tableName, HConstants.EMPTY_START_ROW,<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>      HConstants.EMPTY_END_ROW, false, Durability.USE_DEFAULT, wal, family);<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>    int i = 0;<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>    Put put = new Put(Bytes.toBytes(i));<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>    put.setDurability(Durability.SKIP_WAL); // have to skip mocked wal<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>    put.addColumn(family, Bytes.toBytes(i), Bytes.toBytes(i));<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>    region.put(put);<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span><a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>    // 1. Test case where START_FLUSH throws exception<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>    wal.flushActions = new FlushAction [] {FlushAction.START_FLUSH};<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span><a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>    // start cache flush will throw exception<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>    try {<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>      region.flush(true);<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>      fail("This should have thrown exception");<a name="line.1221"></a>
+<span class="sourceLineNo">1222</span>    } catch (DroppedSnapshotException unexpected) {<a name="line.1222"></a>
+<span class="sourceLineNo">1223</span>      // this should not be a dropped snapshot exception. Meaning that RS will not abort<a name="line.1223"></a>
+<span class="sourceLineNo">1224</span>      throw unexpected;<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span>    } catch (IOException expected) {<a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>      // expected<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span>    }<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>    // The WAL is hosed now. It has two edits appended. We cannot roll the log without it<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>    // throwing a DroppedSnapshotException to force an abort. Just clean up the mess.<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>    region.close(true);<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>    wal.close();<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span><a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>    // 2. Test case where START_FLUSH succeeds but COMMIT_FLUSH will throw exception<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>    wal.flushActions = new FlushAction [] {FlushAction.COMMIT_FLUSH};<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>    wal = new FailAppendFlushMarkerWAL(FileSystem.get(walConf), FSUtils.getRootDir(walConf),<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>          method, walConf);<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>    wal.init();<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span>    this.region = initHRegion(tableName, HConstants.EMPTY_START_ROW,<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>      HConstants.EMPTY_END_ROW, false, Durability.USE_DEFAULT, wal, family);<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>    region.put(put);<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span><a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>    // 3. Test case where ABORT_FLUSH will throw exception.<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span>    // Even if ABORT_FLUSH throws exception, we should not fail with IOE, but continue with<a name="line.1243"></a>
+<span class="sourceLineNo">1244</span>    // DroppedSnapshotException. Below COMMMIT_FLUSH will cause flush to abort<a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>    wal.flushActions = new FlushAction [] {FlushAction.COMMIT_FLUSH, FlushAction.ABORT_FLUSH};<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span><a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>    try {<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span>      region.flush(true);<a name="line.1248"></a>
+<span class="sourceLineNo">1249</span>      fail("This should have thrown exception");<a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>    } catch (DroppedSnapshotException expected) {<a name="line.1250"></a>
+<span class="sourceLineNo">1251</span>      // we expect this exception, since we were able to write the snapshot, but failed to<a name="line.1251"></a>
+<span class="sourceLineNo">1252</span>      // write the flush marker to WAL<a name="line.1252"></a>
+<span class="sourceLineNo">1253</span>    } catch (IOException unexpected) {<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span>      throw unexpected;<a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>    }<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>  }<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span><a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>  @Test<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>  public void testGetWhileRegionClose() throws IOException {<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span>    Configuration hc = initSplit();<a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>    int numRows = 100;<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>    byte[][] families = { fam1, fam2, fam3 };<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span><a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>    // Setting up region<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span>    this.region = initHRegion(tableName, method, hc, families);<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>    // Put data in region<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span>    final int startRow = 100;<a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>    putData(startRow, numRows, qual1, families);<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>    putData(startRow, numRows, qual2, families);<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>    putData(startRow, numRows, qual3, families);<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span>    final AtomicBoolean done = new AtomicBoolean(false);<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>    final AtomicInteger gets = new AtomicInteger(0);<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>    GetTillDoneOrException[] threads = new GetTillDoneOrException[10];<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>    try {<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>      // Set ten threads running concurrently getting from the region.<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span>      for (int i = 0; i &lt; threads.length / 2; i++) {<a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>        threads[i] = new GetTillDoneOrException(i, Bytes.toBytes("" + startRow), done, gets);<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>        threads[i].setDaemon(true);<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>        threads[i].start();<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>      }<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>      // Artificially make the condition by setting closing flag explicitly.<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span>      // I can't make the issue happen with a call to region.close().<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span>      this.region.closing.set(true);<a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>      for (int i = threads.length / 2; i &lt; threads.length; i++) {<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>        threads[i] = new GetTillDoneOrException(i, Bytes.toBytes("" + startRow), done, gets);<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>        threads[i].setDaemon(true);<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>        threads[i].start();<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span>      }<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>    } finally {<a name="line.1289"></a>
+<span class="sourceLineNo">1290</span>      if (this.region != null) {<a name="line.1290"></a>
+<span class="sourceLineNo">1291</span>        HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>        this.region = null;<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>      }<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>    }<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>    done.set(true);<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>    for (GetTillDoneOrException t : threads) {<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span>      try {<a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>        t.join();<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>      } catch (InterruptedException e) {<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>        e.printStackTrace();<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>      }<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>      if (t.e != null) {<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span>        LOG.info("Exception=" + t.e);<a name="line.1303"></a>
+<span class="sourceLineNo">1304</span>        assertFalse("Found a NPE in " + t.getName(), t.e instanceof NullPointerException);<a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>      }<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>    }<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span>  }<a name="line.1307"></a>
+<span class="sourceLineNo">1308</span><a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>  /*<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>   * Thread that does get on single row until 'done' flag is flipped. If an<a name="line.1310"></a>
+<span class="sourceLineNo">1311</span>   * exception causes us to fail, it records it.<a name="line.1311"></a>
+<span class="sourceLineNo">1312</span>   */<a name="line.1312"></a>
+<span class="sourceLineNo">1313</span>  class GetTillDoneOrException extends Thread {<a name="line.1313"></a>
+<span class="sourceLineNo">1314</span>    private final Get g;<a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>    private final AtomicBoolean done;<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>    private final AtomicInteger count;<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>    private Exception e;<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span><a name="line.1318"></a>
+<span class="sourceLineNo">1319</span>    GetTillDoneOrException(final int i, final byte[] r, final AtomicBoolean d,<a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>        final AtomicInteger c) {<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>      super("getter." + i);<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>      this.g = new Get(r);<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>      this.done = d;<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span>      this.count = c;<a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>    }<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span><a name="line.1326"></a>
+<span class="sourceLineNo">1327</span>    @Override<a name="line.1327"></a>
+<span class="sourceLineNo">1328</span>    public void run() {<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>      while (!this.done.get()) {<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span>        try {<a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>          assertTrue(region.get(g).size() &gt; 0);<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>          this.count.incrementAndGet();<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>        } catch (Exception e) {<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>          this.e = e;<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span>          break;<a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>        }<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>      }<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>    }<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>  }<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span><a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>  /*<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>   * An involved filter test. Has multiple column families and deletes in mix.<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>   */<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>  @Test<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>  public void testWeirdCacheBehaviour() throws Exception {<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.1346"></a>
+<span class="sourceLineNo">1347</span>    byte[][] FAMILIES = new byte[][] { Bytes.toBytes("trans-blob"), Bytes.toBytes("trans-type"),<a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>        Bytes.toBytes("trans-date"), Bytes.toBytes("trans-tags"), Bytes.toBytes("trans-group") };<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span>    this.region = initHRegion(tableName, method, CONF, FAMILIES);<a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>    String value = "this is the value";<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>    String value2 = "this is some other value";<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>    String keyPrefix1 = "prefix1";<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>    String keyPrefix2 = "prefix2";<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span>    String keyPrefix3 = "prefix3";<a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>    putRows(this.region, 3, value, keyPrefix1);<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>    putRows(this.region, 3, value, keyPrefix2);<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span>    putRows(this.region, 3, value, keyPrefix3);<a name="line.1357"></a>
+<span class="sourceLineNo">1358</span>    putRows(this.region, 3, value2, keyPrefix1);<a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>    putRows(this.region, 3, value2, keyPrefix2);<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>    putRows(this.region, 3, value2, keyPrefix3);<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span>    System.out.println("Checking values for key: " + keyPrefix1);<a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>    assertEquals("Got back incorrect number of rows from scan", 3,<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>        getNumberOfRows(keyPrefix1, value2, this.region));<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span>    System.out.println("Checking values for key: " + keyPrefix2);<a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>    assertEquals("Got back incorrect number of rows from scan", 3,<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span>        getNumberOfRows(keyPrefix2, value2, this.region));<a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>    System.out.println("Checking values for key: " + keyPrefix3);<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>    assertEquals("Got back incorrect number of rows from scan", 3,<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>        getNumberOfRows(keyPrefix3, value2, this.region));<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>    deleteColumns(this.region, value2, keyPrefix1);<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>    deleteColumns(this.region, value2, keyPrefix2);<a name="line.1371"></a>
+<span class="sourceLineNo">1372</span>    deleteColumns(this.region, value2, keyPrefix3);<a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>    System.out.println("Starting important checks.....");<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>    assertEquals("Got back incorrect number of rows from scan: " + keyPrefix1, 0,<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span>        getNumberOfRows(keyPrefix1, value2, this.region));<a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>    assertEquals("Got back incorrect number of rows from scan: " + keyPrefix2, 0,<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>        getNumberOfRows(keyPrefix2, value2, this.region));<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>    assertEquals("Got back incorrect number of rows from scan: " + keyPrefix3, 0,<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span>        getNumberOfRows(keyPrefix3, value2, this.region));<a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>  }<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span><a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>  @Test<a name="line.1382"></a>
+<span class="sourceLineNo">1383</span>  public void testAppendWithReadOnlyTable() throws Exception {<a name="line.1383"></a>
+<span class="sourceLineNo">1384</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.1384"></a>
+<span class="sourceLineNo">1385</span>    this.region = initHRegion(tableName, method, CONF, true, Bytes.toBytes("somefamily"));<a name="line.1385"></a>
+<span class="sourceLineNo">1386</span>    boolean exceptionCaught = false;<a name="line.1386"></a>
+<span class="sourceLineNo">1387</span>    Append append = new Append(Bytes.toBytes("somerow"));<a name="line.1387"></a>
+<span class="sourceLineNo">1388</span>    append.setDurability(Durability.SKIP_WAL);<a name="line.1388"></a>
+<span class="sourceLineNo">1389</span>    append.addColumn(Bytes.toBytes("somefamily"), Bytes.toBytes("somequalifier"),<a name="line.1389"></a>
+<span class="sourceLineNo">1390</span>        Bytes.toBytes("somevalue"));<a name="line.1390"></a>
+<span class="sourceLineNo">1391</span>    try {<a name="line.1391"></a>
+<span class="sourceLineNo">1392</span>      region.append(append);<a name="line.1392"></a>
+<span class="sourceLineNo">1393</span>    } catch (IOException e) {<a name="line.1393"></a>
+<span class="sourceLineNo">1394</span>      exceptionCaught = true;<a name="line.1394"></a>
+<span class="sourceLineNo">1395</span>    }<a name="line.1395"></a>
+<span class="sourceLineNo">1396</span>    assertTrue(exceptionCaught == true);<a name="line.1396"></a>
+<span class="sourceLineNo">1397</span>  }<a name="line.1397"></a>
+<span class="sourceLineNo">1398</span><a name="line.1398"></a>
+<span class="sourceLineNo">1399</span>  @Test<a name="line.1399"></a>
+<span class="sourceLineNo">1400</span>  public void testIncrWithReadOnlyTable() throws Exception {<a name="line.1400"></a>
+<span class="sourceLineNo">1401</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.1401"></a>
+<span class="sourceLineNo">1402</span>    this.region = initHRegion(tableName, method, CONF, true, Bytes.toBytes("somefamily"));<a name="line.1402"></a>
+<span class="sourceLineNo">1403</span>    boolean exceptionCaught = false;<a name="line.1403"></a>
+<span class="sourceLineNo">1404</span>    Increment inc = new Increment(Bytes.toBytes("somerow"));<a name="line.1404"></a>
+<span class="sourceLineNo">1405</span>    inc.setDurability(Durability.SKIP_WAL);<a name="line.1405"></a>
+<span class="sourceLineNo">1406</span>    inc.addColumn(Bytes.toBytes("somefamily"), Bytes.toBytes("somequalifier"), 1L);<a name="line.1406"></a>
+<span class="sourceLineNo">1407</span>    try {<a name="line.1407"></a>
+<span class="sourceLineNo">1408</span>      region.increment(inc);<a name="line.1408"></a>
+<span class="sourceLineNo">1409</span>    } catch (IOException e) {<a name="line.1409"></a>
+<span class="sourceLineNo">1410</span>      exceptionCaught = true;<a name="line.1410"></a>
+<span class="sourceLineNo">1411</span>    }<a name="line.1411"></a>
+<span class="sourceLineNo">1412</span>    assertTrue(exceptionCaught == true);<a name="line.1412"></a>
+<span class="sourceLineNo">1413</span>  }<a name="line.1413"></a>
+<span class="sourceLineNo">1414</span><a name="line.1414"></a>
+<span class="sourceLineNo">1415</span>  private void deleteColumns(HRegion r, String value, String keyPrefix) throws IOException {<a name="line.1415"></a>
+<span class="sourceLineNo">1416</span>    InternalScanner scanner = buildScanner(keyPrefix, value, r);<a name="line.1416"></a>
+<span class="sourceLineNo">1417</span>    int count = 0;<a name="line.1417"></a>
+<span class="sourceLineNo">1418</span>    boolean more = false;<a name="line.1418"></a>
+<span class="sourceLineNo">1419</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.1419"></a>
+<span class="sourceLineNo">1420</span>    do {<a name="line.1420"></a>
+<span class="sourceLineNo">1421</span>      more = scanner.next(results);<a name="line.1421"></a>
+<span class="sourceLineNo">1422</span>      if (results != null &amp;&amp; !results.isEmpty())<a name="line.1422"></a>
+<span class="sourceLineNo">1423</span>        count++;<a name="line.1423"></a>
+<span class="sourceLineNo">1424</span>      else<a name="line.1424"></a>
+<span class="sourceLineNo">1425</span>        break;<a name="line.1425"></a>
+<span class="sourceLineNo">1426</span>      Delete delete = new Delete(CellUtil.cloneRow(results.get(0)));<a name="line.1426"></a>
+<span class="sourceLineNo">1427</span>      delete.addColumn(Bytes.toBytes("trans-tags"), Bytes.toBytes("qual2"));<a name="line.1427"></a>
+<span class="sourceLineNo">1428</span>      r.delete(delete);<a name="line.1428"></a>
+<span class="sourceLineNo">1429</span>      results.clear();<a name="line.1429"></a>
+<span class="sourceLineNo">1430</span>    } while (more);<a name="line.1430"></a>
+<span class="sourceLineNo">1431</span>    assertEquals("Did not perform correct number of deletes", 3, count);<a name="line.1431"></a>
+<span class="sourceLineNo">1432</span>  }<a name="line.1432"></a>
+<span class="sourceLineNo">1433</span><a name="line.1433"></a>
+<span class="sourceLineNo">1434</span>  private int getNumberOfRows(String keyPrefix, String value, HRegion r) throws Exception {<a name="line.1434"></a>
+<span class="sourceLineNo">1435</span>    InternalScanner resultScanner = buildScanner(keyPrefix, value, r);<a name="line.1435"></a>
+<span class="sourceLineNo">1436</span>    int numberOfResults = 0;<a name="line.1436"></a>
+<span class="sourceLineNo">1437</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.1437"></a>
+<span class="sourceLineNo">1438</span>    boolean more = false;<a name="line.1438"></a>
+<span class="sourceLineNo">1439</span>    do {<a name="line.1439"></a>
+<span class="sourceLineNo">1440</span>      more = resultScanner.next(results);<a name="line.1440"></a>
+<span class="sourceLineNo">1441</span>      if (results != null &amp;&amp; !results.isEmpty())<a name="line.1441"></a>
+<span class="sourceLineNo">1442</span>        numberOfResults++;<a name="line.1442"></a>
+<span class="sourceLineNo">1443</span>      else<a name="line.1443"></a>
+<span class="sourceLineNo">1444</span>        break;<a name="line.1444"></a>
+<span class="sourceLineNo">1445</span>      for (Cell kv : results) {<a name="line.1445"></a>
+<span class="sourceLineNo">1446</span>        System.out.println("kv=" + kv.toString() + ", " + Bytes.toString(CellUtil.cloneValue(kv)));<a name="line.1446"></a>
+<span class="sourceLineNo">1447</span>      }<a name="line.1447"></a>
+<span class="sourceLineNo">1448</span>      results.clear();<a name="line.1448"></a>
+<span class="sourceLineNo">1449</span>    } while (more);<a name="line.1449"></a>
+<span class="sourceLineNo">1450</span>    return numberOfResults;<a name="line.1450"></a>
+<span class="sourceLineNo">1451</span>  }<a name="line.1451"></a>
+<span class="sourceLineNo">1452</span><a name="line.1452"></a>
+<span class="sourceLineNo">1453</span>  private InternalScanner buildScanner(String keyPrefix, String value, HRegion r)<a name="line.1453"></a>
+<span class="sourceLineNo">1454</span>      throws IOException {<a name="line.1454"></a>
+<span class="sourceLineNo">1455</span>    // Defaults FilterList.Operator.MUST_PASS_ALL.<a name="line.1455"></a>
+<span class="sourceLineNo">1456</span>    FilterList allFilters = new FilterList();<a name="line.1456"></a>
+<span class="sourceLineNo">1457</span>    allFilters.addFilter(new PrefixFilter(Bytes.toBytes(keyPrefix)));<a name="line.1457"></a>
+<span class="sourceLineNo">1458</span>    // Only return rows where this column value exists in the row.<a name="line.1458"></a>
+<span class="sourceLineNo">1459</span>    SingleColumnValueFilter filter = new SingleColumnValueFilter(Bytes.toBytes("trans-tags"),<a name="line.1459"></a>
+<span class="sourceLineNo">1460</span>        Bytes.toBytes("qual2"), CompareOperator.EQUAL, Bytes.toBytes(value));<a name="line.1460"></a>
+<span class="sourceLineNo">1461</span>    filter.setFilterIfMissing(true);<a name="line.1461"></a>
+<span class="sourceLineNo">1462</span>    allFilters.addFilter(filter);<a name="line.1462"></a>
+<span class="sourceLineNo">1463</span>    Scan scan = new Scan();<a name="line.1463"></a>
+<span class="sourceLineNo">1464</span>    scan.addFamily(Bytes.toBytes("trans-blob"));<a name="line.1464"></a>
+<span class="sourceLineNo">1465</span>    scan.addFamily(Bytes.toBytes("trans-type"));<a name="line.1465"></a>
+<span class="sourceLineNo">1466</span>    scan.addFamily(Bytes.toBytes("trans-date"));<a name="line.1466"></a>
+<span class="sourceLineNo">1467</span>    scan.addFamily(Bytes.toBytes("trans-tags"));<a name="line.1467"></a>
+<span class="sourceLineNo">1468</span>    scan.addFamily(Bytes.toBytes("trans-group"));<a name="line.1468"></a>
+<span class="sourceLineNo">1469</span>    scan.setFilter(allFilters);<a name="line.1469"></a>
+<span class="sourceLineNo">1470</span>    return r.getScanner(scan);<a name="line.1470"></a>
+<span class="sourceLineNo">1471</span>  }<a name="line.1471"></a>
+<span class="sourceLineNo">1472</span><a name="line.1472"></a>
+<span class="sourceLineNo">1473</span>  private void putRows(HRegion r, int numRows, String value, String key) throws IOException {<a name="line.1473"></a>
+<span class="sourceLineNo">1474</span>    for (int i = 0; i &lt; numRows; i++) {<a name="line.1474"></a>
+<span class="sourceLineNo">1475</span>      String row = key + "_" + i/* UUID.randomUUID().toString() */;<a name="line.1475"></a>
+<span class="sourceLineNo">1476</span>      System.out.println(String.format("Saving row: %s, with value %s", row, value));<a name="line.1476"></a>
+<span class="sourceLineNo">1477</span>      Put put = new Put(Bytes.toBytes(row));<a name="line.1477"></a>
+<span class="sourceLineNo">1478</span>      put.setDurability(Durability.SKIP_WAL);<a name="line.1478"></a>
+<span class="sourceLineNo">1479</span>      put.addColumn(Bytes.toBytes("trans-blob"), null, Bytes.toBytes("value for blob"));<a name="line.1479"></a>
+<span class="sourceLineNo">1480</span>      put.addColumn(Bytes.toBytes("trans-type"), null, Bytes.toBytes("statement"));<a name="line.1480"></a>
+<span class="sourceLineNo">1481</span>      put.addColumn(Bytes.toBytes("trans-date"), null, Bytes.toBytes("20090921010101999"));<a name="line.1481"></a>
+<span class="sourceLineNo">1482</span>      put.addColumn(Bytes.toBytes("trans-tags"), Bytes.toBytes("qual2"), Bytes.toBytes(value));<a name="line.1482"></a>
+<span class="sourceLineNo">1483</span>      put.addColumn(Bytes.toBytes("trans-group"), null, Bytes.toBytes("adhocTransactionGroupId"));<a name="line.1483"></a>
+<span class="sourceLineNo">1484</span>      r.put(put);<a name="line.1484"></a>
+<span class="sourceLineNo">1485</span>    }<a name="line.1485"></a>
+<span class="sourceLineNo">1486</span>  }<a name="line.1486"></a>
+<span class="sourceLineNo">1487</span><a name="line.1487"></a>
+<span class="sourceLineNo">1488</span>  @Test<a name="line.1488"></a>
+<span class="sourceLineNo">1489</span>  public void testFamilyWithAndWithoutColon() throws Exception {<a name="line.1489"></a>
+<span class="sourceLineNo">1490</span>    byte[] cf = Bytes.toBytes(COLUMN_FAMILY);<a name="line.1490"></a>
+<span class="sourceLineNo">1491</span>    this.region = initHRegion(tableName, method, CONF, cf);<a name="line.1491"></a>
+<span class="sourceLineNo">1492</span>    Put p = new Put(tableName.toBytes());<a name="line.1492"></a>
+<span class="sourceLineNo">1493</span>    byte[] cfwithcolon = Bytes.toBytes(COLUMN_FAMILY + ":");<a name="line.1493"></a>
+<span class="sourceLineNo">1494</span>    p.addColumn(cfwithcolon, cfwithcolon, cfwithcolon);<a name="line.1494"></a>
+<span class="sourceLineNo">1495</span>    boolean exception = false;<a name="line.1495"></a>
+<span class="sourceLineNo">1496</span>    try {<a name="line.1496"></a>
+<span class="sourceLineNo">1497</span>      this.region.put(p);<a name="line.1497"></a>
+<span class="sourceLineNo">1498</span>    } catch (NoSuchColumnFamilyException e) {<a name="line.1498"></a>
+<span class="sourceLineNo">1499</span>      exception = true;<a name="line.1499"></a>
+<span class="sourceLineNo">1500</span>    }<a name="line.1500"></a>
+<span class="sourceLineNo">1501</span>    assertTrue(exception);<a name="line.1501"></a>
+<span class="sourceLineNo">1502</span>  }<a name="line.1502"></a>
+<span class="sourceLineNo">1503</span><a name="line.1503"></a>
+<span class="sourceLineNo">1504</span>  @Test<a name="line.1504"></a>
+<span class="sourceLineNo">1505</span>  public void testBatchPut_whileNoRowLocksHeld() throws IOException {<a name="line.1505"></a>
+<span class="sourceLineNo">1506</span>    final Put[] puts = new Put[10];<a name="line.1506"></a>
+<span class="sourceLineNo">1507</span>    MetricsWALSource source = CompatibilitySingletonFactory.getInstance(MetricsWALSource.class);<a name="line.1507"></a>
+<span class="sourceLineNo">1508</span>    long syncs = prepareRegionForBachPut(puts, source, false);<a name="line.1508"></a>
+<span class="sourceLineNo">1509</span><a name="line.1509"></a>
+<span class="sourceLineNo">1510</span>    OperationStatus[] codes = this.region.batchMutate(puts);<a name="line.1510"></a>
+<span class="sourceLineNo">1511</span>    assertEquals(10, codes.length);<a name="line.1511"></a>
+<span class="sourceLineNo">1512</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.1512"></a>
+<span class="sourceLineNo">1513</span>      assertEquals(OperationStatusCode.SUCCESS, codes[i].getOperationStatusCode());<a name="line.1513"></a>
+<span class="sourceLineNo">1514</span>    }<a name="line.1514"></a>
+<span class="sourceLineNo">1515</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs + 1, source);<a name="line.1515"></a>
+<span class="sourceLineNo">1516</span><a name="line.1516"></a>
+<span class="sourceLineNo">1517</span>    LOG.info("Next a batch put with one invalid family");<a name="line.1517"></a>
+<span class="sourceLineNo">1518</span>    puts[5].addColumn(Bytes.toBytes("BAD_CF"), qual, value);<a name="line.1518"></a>
+<span class="sourceLineNo">1519</span>    codes = this.region.batchMutate(puts);<a name="line.1519"></a>
+<span class="sourceLineNo">1520</span>    assertEquals(10, codes.length);<a name="line.1520"></a>
+<span class="sourceLineNo">1521</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.1521"></a>
+<span class="sourceLineNo">1522</span>      assertEquals((i == 5) ? OperationStatusCode.BAD_FAMILY : OperationStatusCode.SUCCESS,<a name="line.1522"></a>
+<span class="sourceLineNo">1523</span>          codes[i].getOperationStatusCode());<a name="line.1523"></a>
+<span class="sourceLineNo">1524</span>    }<a name="line.1524"></a>
+<span class="sourceLineNo">1525</span><a name="line.1525"></a>
+<span class="sourceLineNo">1526</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs + 2, source);<a name="line.1526"></a>
+<span class="sourceLineNo">1527</span>  }<a name="line.1527"></a>
+<span class="sourceLineNo">1528</span><a name="line.1528"></a>
+<span class="sourceLineNo">1529</span>  @Test<a name="line.1529"></a>
+<span class="sourceLineNo">1530</span>  public void testBatchPut_whileMultipleRowLocksHeld() throws Exception {<a name="line.1530"></a>
+<span class="sourceLineNo">1531</span>    final Put[] puts = new Put[10];<a name="line.1531"></a>
+<span class="sourceLineNo">1532</span>    MetricsWALSource source = CompatibilitySingletonFactory.getInstance(MetricsWALSource.class);<a name="line.1532"></a>
+<span class="sourceLineNo">1533</span>    long syncs = prepareRegionForBachPut(puts, source, false);<a name="line.1533"></a>
+<span class="sourceLineNo">1534</span><a name="line.1534"></a>
+<span class="sourceLineNo">1535</span>    puts[5].addColumn(Bytes.toBytes("BAD_CF"), qual, value);<a name="line.1535"></a>
+<span class="sourceLineNo">1536</span><a name="line.1536"></a>
+<span class="sourceLineNo">1537</span>    LOG.info("batchPut will have to break into four batches to avoid row locks");<a name="line.1537"></a>
+<span class="sourceLineNo">1538</span>    RowLock rowLock1 = region.getRowLock(Bytes.toBytes("row_2"));<a name="line.1538"></a>
+<span class="sourceLineNo">1539</span>    RowLock rowLock2 = region.getRowLock(Bytes.toBytes("row_1"));<a name="line.1539"></a>
+<span class="sourceLineNo">1540</span>    RowLock rowLock3 = region.getRowLock(Bytes.toBytes("row_3"));<a name="line.1540"></a>
+<span class="sourceLineNo">1541</span>    RowLock rowLock4 = region.getRowLock(Bytes.toBytes("row_3"), true);<a name="line.1541"></a>
+<span class="sourceLineNo">1542</span><a name="line.1542"></a>
+<span class="sourceLineNo">1543</span>    MultithreadedTestUtil.TestContext ctx = new MultithreadedTestUtil.TestContext(CONF);<a name="line.1543"></a>
+<span class="sourceLineNo">1544</span>    final AtomicReference&lt;OperationStatus[]&gt; retFromThread = new AtomicReference&lt;&gt;();<a name="line.1544"></a>
+<span class="sourceLineNo">1545</span>    final CountDownLatch startingPuts = new CountDownLatch(1);<a name="line.1545"></a>
+<span class="sourceLineNo">1546</span>    final CountDownLatch startingClose = new CountDownLatch(1);<a name="line.1546"></a>
+<span class="sourceLineNo">1547</span>    TestThread putter = new TestThread(ctx) {<a name="line.1547"></a>
+<span class="sourceLineNo">1548</span>      @Override<a name="line.1548"></a>
+<span class="sourceLineNo">1549</span>      public void doWork() throws IOException {<a name="line.1549"></a>
+<span class="sourceLineNo">1550</span>        startingPuts.countDown();<a name="line.1550"></a>
+<span class="sourceLineNo">1551</span>        retFromThread.set(region.batchMutate(puts));<a name="line.1551"></a>
+<span class="sourceLineNo">1552</span>      }<a name="line.1552"></a>
+<span class="sourceLineNo">1553</span>    };<a name="line.1553"></a>
+<span class="sourceLineNo">1554</span>    LOG.info("...starting put thread while holding locks");<a name="line.1554"></a>
+<span class="sourceLineNo">1555</span>    ctx.addThread(putter);<a name="line.1555"></a>
+<span class="sourceLineNo">1556</span>    ctx.startThreads();<a name="line.1556"></a>
+<span class="sourceLineNo">1557</span><a name="line.1557"></a>
+<span class="sourceLineNo">1558</span>    // Now attempt to close the region from another thread.  Prior to HBASE-12565<a name="line.1558"></a>
+<span class="sourceLineNo">1559</span>    // this would cause the in-progress batchMutate operation to to fail with<a name="line.1559"></a>
+<span class="sourceLineNo">1560</span>    // exception because it use to release and re-acquire the close-guard lock<a name="line.1560"></a>
+<span class="sourceLineNo">1561</span>    // between batches.  Caller then didn't get status indicating which writes succeeded.<a name="line.1561"></a>
+<span class="sourceLineNo">1562</span>    // We now expect this thread to block until the batchMutate call finishes.<a name="line.1562"></a>
+<span class="sourceLineNo">1563</span>    Thread regionCloseThread = new TestThread(ctx) {<a name="line.1563"></a>
+<span class="sourceLineNo">1564</span>      @Override<a name="line.1564"></a>
+<span class="sourceLineNo">1565</span>      public void doWork() {<a name="line.1565"></a>
+<span class="sourceLineNo">1566</span>        try {<a name="line.1566"></a>
+<span class="sourceLineNo">1567</span>          startingPuts.await();<a name="line.1567"></a>
+<span class="sourceLineNo">1568</span>          // Give some time for the batch mutate to get in.<a name="line.1568"></a>
+<span class="sourceLineNo">1569</span>          // We don't want to race with the mutate<a name="line.1569"></a>
+<span class="sourceLineNo">1570</span>          Thread.sleep(10);<a name="line.1570"></a>
+<span class="sourceLineNo">1571</span>          startingClose.countDown();<a name="line.1571"></a>
+<span class="sourceLineNo">1572</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.1572"></a>
+<span class="sourceLineNo">1573</span>          region = null;<a name="line.1573"></a>
+<span class="sourceLineNo">1574</span>        } catch (IOException e) {<a name="line.1574"></a>
+<span class="sourceLineNo">1575</span>          throw new RuntimeException(e);<a name="line.1575"></a>
+<span class="sourceLineNo">1576</span>        } catch (InterruptedException e) {<a name="line.1576"></a>
+<span class="sourceLineNo">1577</span>          throw new RuntimeException(e);<a name="line.1577"></a>
+<span class="sourceLineNo">1578</span>        }<a name="line.1578"></a>
+<span class="sourceLineNo">1579</span>      }<a name="line.1579"></a>
+<span class="sourceLineNo">1580</span>    };<a name="line.1580"></a>
+<span class="sourceLineNo">1581</span>    regionCloseThread.start();<a name="line.1581"></a>
+<span class="sourceLineNo">1582</span><a name="line.1582"></a>
+<span class="sourceLineNo">1583</span>    startingClose.await();<a name="line.1583"></a>
+<span class="sourceLineNo">1584</span>    startingPuts.await();<a name="line.1584"></a>
+<span class="sourceLineNo">1585</span>    Thread.sleep(100);<a name="line.1585"></a>
+<span class="sourceLineNo">1586</span>    LOG.info("...releasing row lock 1, which should let put thread continue");<a name="line.1586"></a>
+<span class="sourceLineNo">1587</span>    rowLock1.release();<a name="line.1587"></a>
+<span class="sourceLineNo">1588</span>    rowLock2.release();<a name="line.1588"></a>
+<span class="sourceLineNo">1589</span>    rowLock3.release();<a name="line.1589"></a>
+<span class="sourceLineNo">1590</span>    waitForCounter(source, "syncTimeNumOps", syncs + 1);<a name="line.1590"></a>
+<span class="sourceLineNo">1591</span><a name="line.1591"></a>
+<span class="sourceLineNo">1592</span>    LOG.info("...joining on put thread");<a name="line.1592"></a>
+<span class="sourceLineNo">1593</span>    ctx.stop();<a name="line.1593"></a>
+<span class="sourceLineNo">1594</span>    regionCloseThread.join();<a name="line.1594"></a>
+<span class="sourceLineNo">1595</span><a name="line.1595"></a>
+<span class="sourceLineNo">1596</span>    OperationStatus[] codes = retFromThread.get();<a name="line.1596"></a>
+<span class="sourceLineNo">1597</span>    for (int i = 0; i &lt; codes.length; i++) {<a name="line.1597"></a>
+<span class="sourceLineNo">1598</span>      assertEquals((i == 5) ? OperationStatusCode.BAD_FAMILY : OperationStatusCode.SUCCESS,<a name="line.1598"></a>
+<span class="sourceLineNo">1599</span>          codes[i].getOperationStatusCode());<a name="line.1599"></a>
+<span class="sourceLineNo">1600</span>    }<a name="line.1600"></a>
+<span class="sourceLineNo">1601</span>    rowLock4.release();<a name="line.1601"></a>
+<span class="sourceLineNo">1602</span>  }<a name="line.1602"></a>
+<span class="sourceLineNo">1603</span><a name="line.1603"></a>
+<span class="sourceLineNo">1604</span>  private void waitForCounter(MetricsWALSource source, String metricName, long expectedCount)<a name="line.1604"></a>
+<span class="sourceLineNo">1605</span>      throws InterruptedException {<a name="line.1605"></a>
+<span class="sourceLineNo">1606</span>    long startWait = System.currentTimeMillis();<a name="line.1606"></a>
+<span class="sourceLineNo">1607</span>    long currentCount;<a name="line.1607"></a>
+<span class="sourceLineNo">1608</span>    while ((currentCount = metricsAssertHelper.getCounter(metricName, source)) &lt; expectedCount) {<a name="line.1608"></a>
+<span class="sourceLineNo">1609</span>      Thread.sleep(100);<a name="line.1609"></a>
+<span class="sourceLineNo">1610</span>      if (System.currentTimeMillis() - startWait &gt; 10000) {<a name="line.1610"></a>
+<span class="sourceLineNo">1611</span>        fail(String.format("Timed out waiting for '%s' &gt;= '%s', currentCount=%s", metricName,<a name="line.1611"></a>
+<span class="sourceLineNo">1612</span>            expectedCount, currentCount));<a name="line.1612"></a>
+<span class="sourceLineNo">1613</span>      }<a name="line.1613"></a>
+<span class="sourceLineNo">1614</span>    }<a name="line.1614"></a>
+<span class="sourceLineNo">1615</span>  }<a name="line.1615"></a>
+<span class="sourceLineNo">1616</span><a name="line.1616"></a>
+<span class="sourceLineNo">1617</span>  @Test<a name="line.1617"></a>
+<span class="sourceLineNo">1618</span>  public void testAtomicBatchPut() throws IOException {<a name="line.1618"></a>
+<span class="sourceLineNo">1619</span>    final Put[] puts = new Put[10];<a name="line.1619"></a>
+<span class="sourceLineNo">1620</span>    MetricsWALSource source = CompatibilitySingletonFactory.getInstance(MetricsWALSource.class);<a name="line.1620"></a>
+<span class="sourceLineNo">1621</span>    long syncs = prepareRegionForBachPut(puts, source, false);<a name="line.1621"></a>
+<span class="sourceLineNo">1622</span><a name="line.1622"></a>
+<span class="sourceLineNo">1623</span>    // 1. Straight forward case, should succeed<a name="line.1623"></a>
+<span class="sourceLineNo">1624</span>    MutationBatchOperation batchOp = new MutationBatchOperation(region, puts, true,<a name="line.1624"></a>
+<span class="sourceLineNo">1625</span>        HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.1625"></a>
+<span class="sourceLineNo">1626</span>    OperationStatus[] codes = this.region.batchMutate(batchOp);<a name="line.1626"></a>
+<span class="sourceLineNo">1627</span>    assertEquals(10, codes.length);<a name="line.1627"></a>
+<span class="sourceLineNo">1628</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.1628"></a>
+<span class="sourceLineNo">1629</span>      assertEquals(OperationStatusCode.SUCCESS, codes[i].getOperationStatusCode());<a name="line.1629"></a>
+<span class="sourceLineNo">1630</span>    }<a name="line.1630"></a>
+<span class="sourceLineNo">1631</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs + 1, source);<a name="line.1631"></a>
+<span class="sourceLineNo">1632</span><a name="line.1632"></a>
+<span class="sourceLineNo">1633</span>    // 2. Failed to get lock<a name="line.1633"></a>
+<span class="sourceLineNo">1634</span>    RowLock lock = region.getRowLock(Bytes.toBytes("row_" + 3));<a name="line.1634"></a>
+<span class="sourceLineNo">1635</span>    // Method {@link HRegion#getRowLock(byte[])} is reentrant. As 'row_3' is locked in this<a name="line.1635"></a>
+<span class="sourceLineNo">1636</span>    // thread, need to run {@link HRegion#batchMutate(HRegion.BatchOperation)} in different thread<a name="line.1636"></a>
+<span class="sourceLineNo">1637</span>    MultithreadedTestUtil.TestContext ctx = new MultithreadedTestUtil.TestContext(CONF);<a name="line.1637"></a>
+<span class="sourceLineNo">1638</span>    final AtomicReference&lt;IOException&gt; retFromThread = new AtomicReference&lt;&gt;();<a name="line.1638"></a>
+<span class="sourceLineNo">1639</span>    final CountDownLatch finishedPuts = new CountDownLatch(1);<a name="line.1639"></a>
+<span class="sourceLineNo">1640</span>    final MutationBatchOperation finalBatchOp = new MutationBatchOperation(region, puts, true,<a name="line.1640"></a>
+<span class="sourceLineNo">1641</span>        HConstants<a name="line.1641"></a>
+<span class="sourceLineNo">1642</span>        .NO_NONCE,<a name="line.1642"></a>
+<span class="sourceLineNo">1643</span>        HConstants.NO_NONCE);<a name="line.1643"></a>
+<span class="sourceLineNo">1644</span>    TestThread putter = new TestThread(ctx) {<a name="line.1644"></a>
+<span class="sourceLineNo">1645</span>      @Override<a name="line.1645"></a>
+<span class="sourceLineNo">1646</span>      public void doWork() throws IOException {<a name="line.1646"></a>
+<span class="sourceLineNo">1647</span>        try {<a name="line.1647"></a>
+<span class="sourceLineNo">1648</span>          region.batchMutate(finalBatchOp);<a name="line.1648"></a>
+<span class="sourceLineNo">1649</span>        } catch (IOException ioe) {<a name="line.1649"></a>
+<span class="sourceLineNo">1650</span>          LOG.error("test failed!", ioe);<a name="line.1650"></a>
+<span class="sourceLineNo">1651</span>          retFromThread.set(ioe);<a name="line.1651"></a>
+<span class="sourceLineNo">1652</span>        }<a name="line.1652"></a>
+<span class="sourceLineNo">1653</span>        finishedPuts.countDown();<a name="line.1653"></a>
+<span class="sourceLineNo">1654</span>      }<a name="line.1654"></a>
+<span class="sourceLineNo">1655</span>    };<a name="line.1655"></a>
+<span class="sourceLineNo">1656</span>    LOG.info("...starting put thread while holding locks");<a name="line.1656"></a>
+<span class="sourceLineNo">1657</span>    ctx.addThread(putter);<a name="line.1657"></a>
+<span class="sourceLineNo">1658</span>    ctx.startThreads();<a name="line.1658"></a>
+<span class="sourceLineNo">1659</span>    LOG.info("...waiting for batch puts while holding locks");<a name="line.1659"></a>
+<span class="sourceLineNo">1660</span>    try {<a name="line.1660"></a>
+<span class="sourceLineNo">1661</span>      finishedPuts.await();<a name="line.1661"></a>
+<span class="sourceLineNo">1662</span>    } catch (InterruptedException e) {<a name="line.1662"></a>
+<span class="sourceLineNo">1663</span>      LOG.error("Interrupted!", e);<a name="line.1663"></a>
+<span class="sourceLineNo">1664</span>    } finally {<a name="line.1664"></a>
+<span class="sourceLineNo">1665</span>      if (lock != null) {<a name="line.1665"></a>
+<span class="sourceLineNo">1666</span>        lock.release();<a name="line.1666"></a>
+<span class="sourceLineNo">1667</span>      }<a name="line.1667"></a>
+<span class="sourceLineNo">1668</span>    }<a name="line.1668"></a>
+<span class="sourceLineNo">1669</span>    assertNotNull(retFromThread.get());<a name="line.1669"></a>
+<span class="sourceLineNo">1670</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs + 1, source);<a name="line.1670"></a>
+<span class="sourceLineNo">1671</span><a name="line.1671"></a>
+<span class="sourceLineNo">1672</span>    // 3. Exception thrown in validation<a name="line.1672"></a>
+<span class="sourceLineNo">1673</span>    LOG.info("Next a batch put with one invalid family");<a name="line.1673"></a>
+<span class="sourceLineNo">1674</span>    puts[5].addColumn(Bytes.toBytes("BAD_CF"), qual, value);<a name="line.1674"></a>
+<span class="sourceLineNo">1675</span>    batchOp = new MutationBatchOperation(region, puts, true, HConstants.NO_NONCE,<a name="line.1675"></a>
+<span class="sourceLineNo">1676</span>        HConstants.NO_NONCE);<a name="line.1676"></a>
+<span class="sourceLineNo">1677</span>    thrown.expect(NoSuchColumnFamilyException.class);<a name="line.1677"></a>
+<span class="sourceLineNo">1678</span>    this.region.batchMutate(batchOp);<a name="line.1678"></a>
+<span class="sourceLineNo">1679</span>  }<a name="line.1679"></a>
+<span class="sourceLineNo">1680</span><a name="line.1680"></a>
+<span class="sourceLineNo">1681</span>  @Test<a name="line.1681"></a>
+<span class="sourceLineNo">1682</span>  public void testBatchPutWithTsSlop() throws Exception {<a name="line.1682"></a>
+<span class="sourceLineNo">1683</span>    // add data with a timestamp that is too recent for range. Ensure assert<a name="line.1683"></a>
+<span class="sourceLineNo">1684</span>    CONF.setInt("hbase.hregion.keyvalue.timestamp.slop.millisecs", 1000);<a name="line.1684"></a>
+<span class="sourceLineNo">1685</span>    final Put[] puts = new Put[10];<a name="line.1685"></a>
+<span class="sourceLineNo">1686</span>    MetricsWALSource source = CompatibilitySingletonFactory.getInstance(MetricsWALSource.class);<a name="line.1686"></a>
+<span class="sourceLineNo">1687</span><a name="line.1687"></a>
+<span class="sourceLineNo">1688</span>    long syncs = prepareRegionForBachPut(puts, source, true);<a name="line.1688"></a>
+<span class="sourceLineNo">1689</span><a name="line.1689"></a>
+<span class="sourceLineNo">1690</span>    OperationStatus[] codes = this.region.batchMutate(puts);<a name="line.1690"></a>
+<span class="sourceLineNo">1691</span>    assertEquals(10, codes.length);<a name="line.1691"></a>
+<span class="sourceLineNo">1692</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.1692"></a>
+<span class="sourceLineNo">1693</span>      assertEquals(OperationStatusCode.SANITY_CHECK_FAILURE, codes[i].getOperationStatusCode());<a name="line.1693"></a>
+<span class="sourceLineNo">1694</span>    }<a name="line.1694"></a>
+<span class="sourceLineNo">1695</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs, source);<a name="line.1695"></a>
+<span class="sourceLineNo">1696</span>  }<a name="line.1696"></a>
+<span class="sourceLineNo">1697</span><a name="line.1697"></a>
+<span class="sourceLineNo">1698</span>  /**<a name="line.1698"></a>
+<span class="sourceLineNo">1699</span>   * @return syncs initial syncTimeNumOps<a name="line.1699"></a>
+<span class="sourceLineNo">1700</span>   */<a name="line.1700"></a>
+<span class="sourceLineNo">1701</span>  private long prepareRegionForBachPut(final Put[] puts, final MetricsWALSource source,<a name="line.1701"></a>
+<span class="sourceLineNo">1702</span>      boolean slop) throws IOException {<a name="line.1702"></a>
+<span class="sourceLineNo">1703</span>    this.region = initHRegion(tableName, method, CONF, COLUMN_FAMILY_BYTES);<a name="line.1703"></a>
+<span class="sourceLineNo">1704</span><a name="line.1704"></a>
+<span class="sourceLineNo">1705</span>    LOG.info("First a batch put with all valid puts");<a name="line.1705"></a>
+<span class="sourceLineNo">1706</span>    for (int i = 0; i &lt; puts.length; i++) {<a name="line.1706"></a>
+<span class="sourceLineNo">1707</span>      puts[i] = slop ? new Put(Bytes.toBytes("row_" + i), Long.MAX_VALUE - 100) :<a name="line.1707"></a>
+<span class="sourceLineNo">1708</span>          new Put(Bytes.toBytes("row_" + i));<a name="line.1708"></a>
+<span class="sourceLineNo">1709</span>      puts[i].addColumn(COLUMN_FAMILY_BYTES, qual, value);<a name="line.1709"></a>
+<span class="sourceLineNo">1710</span>    }<a name="line.1710"></a>
+<span class="sourceLineNo">1711</span><a name="line.1711"></a>
+<span class="sourceLineNo">1712</span>    long syncs = metricsAssertHelper.getCounter("syncTimeNumOps", source);<a name="line.1712"></a>
+<span class="sourceLineNo">1713</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs, source);<a name="line.1713"></a>
+<span class="sourceLineNo">1714</span>    return syncs;<a name="line.1714"></a>
+<span class="sourceLineNo">1715</span>  }<a name="line.1715"></a>
+<span class="sourceLineNo">1716</span><a name="line.1716"></a>
+<span class="sourceLineNo">1717</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.1717"></a>
+<span class="sourceLineNo">1718</span>  // checkAndMutate tests<a name="line.1718"></a>
+<span class="sourceLineNo">1719</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.1719"></a>
+<span class="sourceLineNo">1720</span>  @Test<a name="line.1720"></a>
+<span class="sourceLineNo">1721</span>  public void testCheckAndMutate_WithEmptyRowValue() throws IOException {<a name="line.1721"></a>
+<span class="sourceLineNo">1722</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1722"></a>
+<span class="sourceLineNo">1723</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1723"></a>
+<span class="sourceLineNo">1724</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1724"></a>
+<span class="sourceLineNo">1725</span>    byte[] emptyVal = new byte[] {};<a name="line.1725"></a>
+<span class="sourceLineNo">1726</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1726"></a>
+<span class="sourceLineNo">1727</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.1727"></a>
+<span class="sourceLineNo">1728</span><a name="line.1728"></a>
+<span class="sourceLineNo">1729</span>    // Setting up region<a name="line.1729"></a>
+<span class="sourceLineNo">1730</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.1730"></a>
+<span class="sourceLineNo">1731</span>    // Putting empty data in key<a name="line.1731"></a>
+<span class="sourceLineNo">1732</span>    Put put = new Put(row1);<a name="line.1732"></a>
+<span class="sourceLineNo">1733</span>    put.addColumn(fam1, qf1, emptyVal);<a name="line.1733"></a>
+<span class="sourceLineNo">1734</span><a name="line.1734"></a>
+<span class="sourceLineNo">1735</span>    // checkAndPut with empty value<a name="line.1735"></a>
+<span class="sourceLineNo">1736</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1736"></a>
+<span class="sourceLineNo">1737</span>        new BinaryComparator(emptyVal), put);<a name="line.1737"></a>
+<span class="sourceLineNo">1738</span>    assertTrue(res);<a name="line.1738"></a>
+<span class="sourceLineNo">1739</span><a name="line.1739"></a>
+<span class="sourceLineNo">1740</span>    // Putting data in key<a name="line.1740"></a>
+<span class="sourceLineNo">1741</span>    put = new Put(row1);<a name="line.1741"></a>
+<span class="sourceLineNo">1742</span>    put.addColumn(fam1, qf1, val1);<a name="line.1742"></a>
+<span class="sourceLineNo">1743</span><a name="line.1743"></a>
+<span class="sourceLineNo">1744</span>    // checkAndPut with correct value<a name="line.1744"></a>
+<span class="sourceLineNo">1745</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1745"></a>
+<span class="sourceLineNo">1746</span>        new BinaryComparator(emptyVal), put);<a name="line.1746"></a>
+<span class="sourceLineNo">1747</span>    assertTrue(res);<a name="line.1747"></a>
+<span class="sourceLineNo">1748</span><a name="line.1748"></a>
+<span class="sourceLineNo">1749</span>    // not empty anymore<a name="line.1749"></a>
+<span class="sourceLineNo">1750</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1750"></a>
+<span class="sourceLineNo">1751</span>        new BinaryComparator(emptyVal), put);<a name="line.1751"></a>
+<span class="sourceLineNo">1752</span>    assertFalse(res);<a name="line.1752"></a>
+<span class="sourceLineNo">1753</span><a name="line.1753"></a>
+<span class="sourceLineNo">1754</span>    Delete delete = new Delete(row1);<a name="line.1754"></a>
+<span class="sourceLineNo">1755</span>    delete.addColumn(fam1, qf1);<a name="line.1755"></a>
+<span class="sourceLineNo">1756</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1756"></a>
+<span class="sourceLineNo">1757</span>        new BinaryComparator(emptyVal), delete);<a name="line.1757"></a>
+<span class="sourceLineNo">1758</span>    assertFalse(res);<a name="line.1758"></a>
+<span class="sourceLineNo">1759</span><a name="line.1759"></a>
+<span class="sourceLineNo">1760</span>    put = new Put(row1);<a name="line.1760"></a>
+<span class="sourceLineNo">1761</span>    put.addColumn(fam1, qf1, val2);<a name="line.1761"></a>
+<span class="sourceLineNo">1762</span>    // checkAndPut with correct value<a name="line.1762"></a>
+<span class="sourceLineNo">1763</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1763"></a>
+<span class="sourceLineNo">1764</span>        new BinaryComparator(val1), put);<a name="line.1764"></a>
+<span class="sourceLineNo">1765</span>    assertTrue(res);<a name="line.1765"></a>
+<span class="sourceLineNo">1766</span><a name="line.1766"></a>
+<span class="sourceLineNo">1767</span>    // checkAndDelete with correct value<a name="line.1767"></a>
+<span class="sourceLineNo">1768</span>    delete = new Delete(row1);<a name="line.1768"></a>
 <span class="sourceLineNo">1769</span>    delete.addColumn(fam1, qf1);<a name="line.1769"></a>
-<span class="sourceLineNo">1770</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1770"></a>
-<span class="sourceLineNo">1771</span>        new BinaryComparator(val2), delete);<a name="line.1771"></a>
-<span class="sourceLineNo">1772</span>    assertTrue(res);<a name="line.1772"></a>
-<span class="sourceLineNo">1773</span><a name="line.1773"></a>
-<span class="sourceLineNo">1774</span>    delete = new Delete(row1);<a name="line.1774"></a>
-<span class="sourceLineNo">1775</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1775"></a>
-<span class="sourceLineNo">1776</span>        new BinaryComparator(emptyVal), delete);<a name="line.1776"></a>
-<span class="sourceLineNo">1777</span>    assertTrue(res);<a name="line.1777"></a>
-<span class="sourceLineNo">1778</span><a name="line.1778"></a>
-<span class="sourceLineNo">1779</span>    // checkAndPut looking for a null value<a name="line.1779"></a>
-<span class="sourceLineNo">1780</span>    put = new Put(row1);<a name="line.1780"></a>
-<span class="sourceLineNo">1781</span>    put.addColumn(fam1, qf1, val1);<a name="line.1781"></a>
-<span class="sourceLineNo">1782</span><a name="line.1782"></a>
-<span class="sourceLineNo">1783</span>    res = region<a name="line.1783"></a>
-<span class="sourceLineNo">1784</span>        .checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new NullComparator(), put);<a name="line.1784"></a>
-<span class="sourceLineNo">1785</span>    assertTrue(res);<a name="line.1785"></a>
-<span class="sourceLineNo">1786</span>  }<a name="line.1786"></a>
-<span class="sourceLineNo">1787</span><a name="line.1787"></a>
-<span class="sourceLineNo">1788</span>  @Test<a name="line.1788"></a>
-<span class="sourceLineNo">1789</span>  public void testCheckAndMutate_WithWrongValue() throws IOException {<a name="line.1789"></a>
-<span class="sourceLineNo">1790</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1790"></a>
-<span class="sourceLineNo">1791</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1791"></a>
-<span class="sourceLineNo">1792</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1792"></a>
-<span class="sourceLineNo">1793</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1793"></a>
-<span class="sourceLineNo">1794</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.1794"></a>
-<span class="sourceLineNo">1795</span>    BigDecimal bd1 = new BigDecimal(Double.MAX_VALUE);<a name="line.1795"></a>
-<span class="sourceLineNo">1796</span>    BigDecimal bd2 = new BigDecimal(Double.MIN_VALUE);<a name="line.1796"></a>
-<span class="sourceLineNo">1797</span><a name="line.1797"></a>
-<span class="sourceLineNo">1798</span>    // Setting up region<a name="line.1798"></a>
-<span class="sourceLineNo">1799</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.1799"></a>
-<span class="sourceLineNo">1800</span>    // Putting data in key<a name="line.1800"></a>
-<span class="sourceLineNo">1801</span>    Put put = new Put(row1);<a name="line.1801"></a>
-<span class="sourceLineNo">1802</span>    put.addColumn(fam1, qf1, val1);<a name="line.1802"></a>
-<span class="sourceLineNo">1803</span>    region.put(put);<a name="line.1803"></a>
-<span class="sourceLineNo">1804</span><a name="line.1804"></a>
-<span class="sourceLineNo">1805</span>    // checkAndPut with wrong value<a name="line.1805"></a>
-<span class="sourceLineNo">1806</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1806"></a>
-<span class="sourceLineNo">1807</span>        new BinaryComparator(val2), put);<a name="line.1807"></a>
-<span class="sourceLineNo">1808</span>    assertEquals(false, res);<a name="line.1808"></a>
-<span class="sourceLineNo">1809</span><a name="line.1809"></a>
-<span class="sourceLineNo">1810</span>    // checkAndDelete with wrong value<a name="line.1810"></a>
-<span class="sourceLineNo">1811</span>    Delete delete = new Delete(row1);<a name="line.1811"></a>
-<span class="sourceLineNo">1812</span>    delete.addFamily(fam1);<a name="line.1812"></a>
-<span class="sourceLineNo">1813</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1813"></a>
-<span class="sourceLineNo">1814</span>        new BinaryComparator(val2), put);<a name="line.1814"></a>
-<span class="sourceLineNo">1815</span>    assertEquals(false, res);<a name="line.1815"></a>
-<span class="sourceLineNo">1816</span><a name="line.1816"></a>
-<span class="sourceLineNo">1817</span>    // Putting data in key<a name="line.1817"></a>
-<span class="sourceLineNo">1818</span>    put = new Put(row1);<a name="line.1818"></a>
-<span class="sourceLineNo">1819</span>    put.addColumn(fam1, qf1, Bytes.toBytes(bd1));<a name="line.1819"></a>
-<span class="sourceLineNo">1820</span>    region.put(put);<a name="line.1820"></a>
-<span class="sourceLineNo">1821</span><a name="line.1821"></a>
-<span class="sourceLineNo">1822</span>    // checkAndPut with wrong value<a name="line.1822"></a>
-<span class="sourceLineNo">1823</span>    res =<a name="line.1823"></a>
-<span class="sourceLineNo">1824</span>        region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1824"></a>
-<span class="sourceLineNo">1825</span>            new BigDecimalComparator(bd2), put);<a name="line.1825"></a>
-<span class="sourceLineNo">1826</span>    assertEquals(false, res);<a name="line.1826"></a>
-<span class="sourceLineNo">1827</span><a name="line.1827"></a>
-<span class="sourceLineNo">1828</span>    // checkAndDelete with wrong value<a name="line.1828"></a>
-<span class="sourceLineNo">1829</span>    delete = new Delete(row1);<a name="line.1829"></a>
-<span class="sourceLineNo">1830</span>    delete.addFamily(fam1);<a name="line.1830"></a>
-<span class="sourceLineNo">1831</span>    res =<a name="line.1831"></a>
-<span class="sourceLineNo">1832</span>        region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1832"></a>
-<span class="sourceLineNo">1833</span>            new BigDecimalComparator(bd2), put);<a name="line.1833"></a>
-<span class="sourceLineNo">1834</span>    assertEquals(false, res);<a name="line.1834"></a>
-<span class="sourceLineNo">1835</span>  }<a name="line.1835"></a>
-<span class="sourceLineNo">1836</span><a name="line.1836"></a>
-<span class="sourceLineNo">1837</span>  @Test<a name="line.1837"></a>
-<span class="sourceLineNo">1838</span>  public void testCheckAndMutate_WithCorrectValue() throws IOException {<a name="line.1838"></a>
-<span class="sourceLineNo">1839</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1839"></a>
-<span class="sourceLineNo">1840</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1840"></a>
-<span class="sourceLineNo">1841</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1841"></a>
-<span class="sourceLineNo">1842</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1842"></a>
-<span class="sourceLineNo">1843</span>    BigDecimal bd1 = new BigDecimal(Double.MIN_VALUE);<a name="line.1843"></a>
-<span class="sourceLineNo">1844</span><a name="line.1844"></a>
-<span class="sourceLineNo">1845</span>    // Setting up region<a name="line.1845"></a>
-<span class="sourceLineNo">1846</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.1846"></a>
-<span class="sourceLineNo">1847</span>    // Putting data in key<a name="line.1847"></a>
-<span class="sourceLineNo">1848</span>    Put put = new Put(row1);<a name="line.1848"></a>
-<span class="sourceLineNo">1849</span>    put.addColumn(fam1, qf1, val1);<a name="line.1849"></a>
-<span class="sourceLineNo">1850</span>    region.put(put);<a name="line.1850"></a>
-<span class="sourceLineNo">1851</span><a name="line.1851"></a>
-<span class="sourceLineNo">1852</span>    // checkAndPut with correct value<a name="line.1852"></a>
-<span class="sourceLineNo">1853</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1853"></a>
-<span class="sourceLineNo">1854</span>        new BinaryComparator(val1), put);<a name="line.1854"></a>
-<span class="sourceLineNo">1855</span>    assertEquals(true, res);<a name="line.1855"></a>
-<span class="sourceLineNo">1856</span><a name="line.1856"></a>
-<span class="sourceLineNo">1857</span>    // checkAndDelete with correct value<a name="line.1857"></a>
-<span class="sourceLineNo">1858</span>    Delete delete = new Delete(row1);<a name="line.1858"></a>
-<span class="sourceLineNo">1859</span>    delete.addColumn(fam1, qf1);<a name="line.1859"></a>
-<span class="sourceLineNo">1860</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new BinaryComparator(val1),<a name="line.1860"></a>
-<span class="sourceLineNo">1861</span>        delete);<a name="line.1861"></a>
-<span class="sourceLineNo">1862</span>    assertEquals(true, res);<a name="line.1862"></a>
-<span class="sourceLineNo">1863</span><a name="line.1863"></a>
-<span class="sourceLineNo">1864</span>    // Putting data in key<a name="line.1864"></a>
-<span class="sourceLineNo">1865</span>    put = new Put(row1);<a name="line.1865"></a>
-<span class="sourceLineNo">1866</span>    put.addColumn(fam1, qf1, Bytes.toBytes(bd1));<a name="line.1866"></a>
-<span class="sourceLineNo">1867</span>    region.put(put);<a name="line.1867"></a>
-<span class="sourceLineNo">1868</span><a name="line.1868"></a>
-<span class="sourceLineNo">1869</span>    // checkAndPut with correct value<a name="line.1869"></a>
-<span class="sourceLineNo">1870</span>    res =<a name="line.1870"></a>
-<span class="sourceLineNo">1871</span>        region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new BigDecimalComparator(<a name="line.1871"></a>
-<span class="sourceLineNo">1872</span>            bd1), put);<a name="line.1872"></a>
-<span class="sourceLineNo">1873</span>    assertEquals(true, res);<a name="line.1873"></a>
-<span class="sourceLineNo">1874</span><a name="line.1874"></a>
-<span class="sourceLineNo">1875</span>    // checkAndDelete with correct value<a name="line.1875"></a>
-<span class="sourceLineNo">1876</span>    delete = new Delete(row1);<a name="line.1876"></a>
-<span class="sourceLineNo">1877</span>    delete.addColumn(fam1, qf1);<a name="line.1877"></a>
-<span class="sourceLineNo">1878</span>    res =<a name="line.1878"></a>
-<span class="sourceLineNo">1879</span>        region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new BigDecimalComparator(<a name="line.1879"></a>
-<span class="sourceLineNo">1880</span>            bd1), delete);<a name="line.1880"></a>
-<span class="sourceLineNo">1881</span>    assertEquals(true, res);<a name="line.1881"></a>
-<span class="sourceLineNo">1882</span>  }<a name="line.1882"></a>
-<span class="sourceLineNo">1883</span><a name="line.1883"></a>
-<span class="sourceLineNo">1884</span>  @Test<a name="line.1884"></a>
-<span class="sourceLineNo">1885</span>  public void testCheckAndMutate_WithNonEqualCompareOp() throws IOException {<a name="line.1885"></a>
-<span class="sourceLineNo">1886</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1886"></a>
-<span class="sourceLineNo">1887</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1887"></a>
-<span class="sourceLineNo">1888</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1888"></a>
-<span class="sourceLineNo">1889</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1889"></a>
-<span class="sourceLineNo">1890</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.1890"></a>
-<span class="sourceLineNo">1891</span>    byte[] val3 = Bytes.toBytes("value3");<a name="line.1891"></a>
-<span class="sourceLineNo">1892</span>    byte[] val4 = Bytes.toBytes("value4");<a name="line.1892"></a>
-<span class="sourceLineNo">1893</span><a name="line.1893"></a>
-<span class="sourceLineNo">1894</span>    // Setting up region<a name="line.1894"></a>
-<span class="sourceLineNo">1895</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.1895"></a>
-<span class="sourceLineNo">1896</span>    // Putting val3 in key<a name="line.1896"></a>
-<span class="sourceLineNo">1897</span>    Put put = new Put(row1);<a name="line.1897"></a>
-<span class="sourceLineNo">1898</span>    put.addColumn(fam1, qf1, val3);<a name="line.1898"></a>
-<span class="sourceLineNo">1899</span>    region.put(put);<a name="line.1899"></a>
-<span class="sourceLineNo">1900</span><a name="line.1900"></a>
-<span class="sourceLineNo">1901</span>    // Test CompareOp.LESS: original = val3, compare with val3, fail<a name="line.1901"></a>
-<span class="sourceLineNo">1902</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS,<a name="line.1902"></a>
-<span class="sourceLineNo">1903</span>        new BinaryComparator(val3), put);<a name="line.1903"></a>
-<span class="sourceLineNo">1904</span>    assertEquals(false, res);<a name="line.1904"></a>
-<span class="sourceLineNo">1905</span><a name="line.1905"></a>
-<span class="sourceLineNo">1906</span>    // Test CompareOp.LESS: original = val3, compare with val4, fail<a name="line.1906"></a>
-<span class="sourceLineNo">1907</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS,<a name="line.1907"></a>
-<span class="sourceLineNo">1908</span>        new BinaryComparator(val4), put);<a name="line.1908"></a>
-<span class="sourceLineNo">1909</span>    assertEquals(false, res);<a name="line.1909"></a>
-<span class="sourceLineNo">1910</span><a name="line.1910"></a>
-<span class="sourceLineNo">1911</span>    // Test CompareOp.LESS: original = val3, compare with val2,<a name="line.1911"></a>
-<span class="sourceLineNo">1912</span>    // succeed (now value = val2)<a name="line.1912"></a>
-<span class="sourceLineNo">1913</span>    put = new Put(row1);<a name="line.1913"></a>
-<span class="sourceLineNo">1914</span>    put.addColumn(fam1, qf1, val2);<a name="line.1914"></a>
-<span class="sourceLineNo">1915</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS,<a name="line.1915"></a>
-<span class="sourceLineNo">1916</span>        new BinaryComparator(val2), put);<a name="line.1916"></a>
-<span class="sourceLineNo">1917</span>    assertEquals(true, res);<a name="line.1917"></a>
-<span class="sourceLineNo">1918</span><a name="line.1918"></a>
-<span class="sourceLineNo">1919</span>    // Test CompareOp.LESS_OR_EQUAL: original = val2, compare with val3, fail<a name="line.1919"></a>
-<span class="sourceLineNo">1920</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS_OR_EQUAL,<a name="line.1920"></a>
-<span class="sourceLineNo">1921</span>        new BinaryComparator(val3), put);<a name="line.1921"></a>
-<span class="sourceLineNo">1922</span>    assertEquals(false, res);<a name="line.1922"></a>
-<span class="sourceLineNo">1923</span><a name="line.1923"></a>
-<span class="sourceLineNo">1924</span>    // Test CompareOp.LESS_OR_EQUAL: original = val2, compare with val2,<a name="line.1924"></a>
-<span class="sourceLineNo">1925</span>    // succeed (value still = val2)<a name="line.1925"></a>
-<span class="sourceLineNo">1926</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS_OR_EQUAL,<a name="line.1926"></a>
-<span class="sourceLineNo">1927</span>        new BinaryComparator(val2), put);<a name="line.1927"></a>
-<span class="sourceLineNo">1928</span>    assertEquals(true, res);<a name="line.1928"></a>
-<span class="sourceLineNo">1929</span><a name="line.1929"></a>
-<span class="sourceLineNo">1930</span>    // Test CompareOp.LESS_OR_EQUAL: original = val2, compare with val1,<a name="line.1930"></a>
-<span class="sourceLineNo">1931</span>    // succeed (now value = val3)<a name="line.1931"></a>
-<span class="sourceLineNo">1932</span>    put = new Put(row1);<a name="line.1932"></a>
-<span class="sourceLineNo">1933</span>    put.addColumn(fam1, qf1, val3);<a name="line.1933"></a>
-<span class="sourceLineNo">1934</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS_OR_EQUAL,<a name="line.1934"></a>
-<span class="sourceLineNo">1935</span>        new BinaryComparator(val1), put);<a name="line.1935"></a>
-<span class="sourceLineNo">1936</span>    assertEquals(true, res);<a name="line.1936"></a>
-<span class="sourceLineNo">1937</span><a name="line.1937"></a>
-<span class="sourceLineNo">1938</span>    // Test CompareOp.GREATER: original = val3, compare with val3, fail<a name="line.1938"></a>
-<span class="sourceLineNo">1939</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER,<a name="line.1939"></a>
-<span class="sourceLineNo">1940</span>        new BinaryComparator(val3), put);<a name="line.1940"></a>
-<span class="sourceLineNo">1941</span>    assertEquals(false, res);<a name="line.1941"></a>
-<span class="sourceLineNo">1942</span><a name="line.1942"></a>
-<span class="sourceLineNo">1943</span>    // Test CompareOp.GREATER: original = val3, compare with val2, fail<a name="line.1943"></a>
-<span class="sourceLineNo">1944</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER,<a name="line.1944"></a>
-<span class="sourceLineNo">1945</span>        new BinaryComparator(val2), put);<a name="line.1945"></a>
-<span class="sourceLineNo">1946</span>    assertEquals(false, res);<a name="line.1946"></a>
-<span class="sourceLineNo">1947</span><a name="line.1947"></a>
-<span class="sourceLineNo">1948</span>    // Test CompareOp.GREATER: original = val3, compare with val4,<a name="line.1948"></a>
-<span class="sourceLineNo">1949</span>    // succeed (now value = val2)<a name="line.1949"></a>
-<span class="sourceLineNo">1950</span>    put = new Put(row1);<a name="line.1950"></a>
-<span class="sourceLineNo">1951</span>    put.addColumn(fam1, qf1, val2);<a name="line.1951"></a>
-<span class="sourceLineNo">1952</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER,<a name="line.1952"></a>
-<span class="sourceLineNo">1953</span>        new BinaryComparator(val4), put);<a name="line.1953"></a>
-<span class="sourceLineNo">1954</span>    assertEquals(true, res);<a name="line.1954"></a>
-<span class="sourceLineNo">1955</span><a name="line.1955"></a>
-<span class="sourceLineNo">1956</span>    // Test CompareOp.GREATER_OR_EQUAL: original = val2, compare with val1, fail<a name="line.1956"></a>
-<span class="sourceLineNo">1957</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER_OR_EQUAL,<a name="line.1957"></a>
-<span class="sourceLineNo">1958</span>        new BinaryComparator(val1), put);<a name="line.1958"></a>
-<span class="sourceLineNo">1959</span>    assertEquals(false, res);<a name="line.1959"></a>
-<span class="sourceLineNo">1960</span><a name="line.1960"></a>
-<span class="sourceLineNo">1961</span>    // Test CompareOp.GREATER_OR_EQUAL: original = val2, compare with val2,<a name="line.1961"></a>
-<span class="sourceLineNo">1962</span>    // succeed (value still = val2)<a name="line.1962"></a>
-<span class="sourceLineNo">1963</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER_OR_EQUAL,<a name="line.1963"></a>
-<span class="sourceLineNo">1964</span>        new BinaryComparator(val2), put);<a name="line.1964"></a>
-<span class="sourceLineNo">1965</span>    assertEquals(true, res);<a name="line.1965"></a>
-<span class="sourceLineNo">1966</span><a name="line.1966"></a>
-<span class="sourceLineNo">1967</span>    // Test CompareOp.GREATER_OR_EQUAL: original = val2, compare with val3, succeed<a name="line.1967"></a>
-<span class="sourceLineNo">1968</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER_OR_EQUAL,<a name="line.1968"></a>
-<span class="sourceLineNo">1969</span>        new BinaryComparator(val3), put);<a name="line.1969"></a>
-<span class="sourceLineNo">1970</span>    assertEquals(true, res);<a name="line.1970"></a>
-<span class="sourceLineNo">1971</span>  }<a name="line.1971"></a>
-<span class="sourceLineNo">1972</span><a name="line.1972"></a>
-<span class="sourceLineNo">1973</span>  @Test<a name="line.1973"></a>
-<span class="sourceLineNo">1974</span>  public void testCheckAndPut_ThatPutWasWritten() throws IOException {<a name="line.1974"></a>
-<span class="sourceLineNo">1975</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1975"></a>
-<span class="sourceLineNo">1976</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1976"></a>
-<span class="sourceLineNo">1977</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.1977"></a>
-<span class="sourceLineNo">1978</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1978"></a>
-<span class="sourceLineNo">1979</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1979"></a>
-<span class="sourceLineNo">1980</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.1980"></a>
-<span class="sourceLineNo">1981</span><a name="line.1981"></a>
-<span class="sourceLineNo">1982</span>    byte[][] families = { fam1, fam2 };<a name="line.1982"></a>
-<span class="sourceLineNo">1983</span><a name="line.1983"></a>
-<span class="sourceLineNo">1984</span>    // Setting up region<a name="line.1984"></a>
-<span class="sourceLineNo">1985</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.1985"></a>
-<span class="sourceLineNo">1986</span>    // Putting data in the key to check<a name="line.1986"></a>
-<span class="sourceLineNo">1987</span>    Put put = new Put(row1);<a name="line.1987"></a>
-<span class="sourceLineNo">1988</span>    put.addColumn(fam1, qf1, val1);<a name="line.1988"></a>
-<span class="sourceLineNo">1989</span>    region.put(put);<a name="line.1989"></a>
-<span class="sourceLineNo">1990</span><a name="line.1990"></a>
-<span class="sourceLineNo">1991</span>    // Creating put to add<a name="line.1991"></a>
-<span class="sourceLineNo">1992</span>    long ts = System.currentTimeMillis();<a name="line.1992"></a>
-<span class="sourceLineNo">1993</span>    KeyValue kv = new KeyValue(row1, fam2, qf1, ts, KeyValue.Type.Put, val2);<a name="line.1993"></a>
-<span class="sourceLineNo">1994</span>    put = new Put(row1);<a name="line.1994"></a>
-<span class="sourceLineNo">1995</span>    put.add(kv);<a name="line.1995"></a>
-<span class="sourceLineNo">1996</span><a name="line.1996"></a>
-<span class="sourceLineNo">1997</span>    // checkAndPut with wrong value<a name="line.1997"></a>
-<span class="sourceLineNo">1998</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1998"></a>
-<span class="sourceLineNo">1999</span>        new BinaryComparator(val1), put);<a name="line.1999"></a>
-<span class="sourceLineNo">2000</span>    assertEquals(true, res);<a name="line.2000"></a>
-<span class="sourceLineNo">2001</span><a name="line.2001"></a>
-<span class="sourceLineNo">2002</span>    Get get = new Get(row1);<a name="line.2002"></a>
-<span class="sourceLineNo">2003</span>    get.addColumn(fam2, qf1);<a name="line.2003"></a>
-<span class="sourceLineNo">2004</span>    Cell[] actual = region.get(get).rawCells();<a name="line.2004"></a>
-<span class="sourceLineNo">2005</span><a name="line.2005"></a>
-<span class="sourceLineNo">2006</span>    Cell[] expected = { kv };<a name="line.2006"></a>
-<span class="sourceLineNo">2007</span><a name="line.2007"></a>
-<span class="sourceLineNo">2008</span>    assertEquals(expected.length, actual.length);<a name="line.2008"></a>
-<span class="sourceLineNo">2009</span>    for (int i = 0; i &lt; actual.length; i++) {<a name="line.2009"></a>
-<span class="sourceLineNo">2010</span>      assertEquals(expected[i], actual[i]);<a name="line.2010"></a>
-<span class="sourceLineNo">2011</span>    }<a name="line.2011"></a>
-<span class="sourceLineNo">2012</span>  }<a name="line.2012"></a>
-<span class="sourceLineNo">2013</span><a name="line.2013"></a>
-<span class="sourceLineNo">2014</span>  @Test<a name="line.2014"></a>
-<span class="sourceLineNo">2015</span>  public void testCheckAndPut_wrongRowInPut() throws IOException {<a name="line.2015"></a>
-<span class="sourceLineNo">2016</span>    this.region = initHRegion(tableName, method, CONF, COLUMNS);<a name="line.2016"></a>
-<span class="sourceLineNo">2017</span>    Put put = new Put(row2);<a name="line.2017"></a>
-<span class="sourceLineNo">2018</span>    put.addColumn(fam1, qual1, value1);<a name="line.2018"></a>
-<span class="sourceLineNo">2019</span>    try {<a name="line.2019"></a>
-<span class="sourceLineNo">2020</span>      region.checkAndMutate(row, fam1, qual1, CompareOperator.EQUAL,<a name="line.2020"></a>
-<span class="sourceLineNo">2021</span>          new BinaryComparator(value2), put);<a name="line.2021"></a>
-<span class="sourceLineNo">2022</span>      fail();<a name="line.2022"></a>
-<span class="sourceLineNo">2023</span>    } catch (org.apache.hadoop.hbase.DoNotRetryIOException expected) {<a name="line.2023"></a>
-<span class="sourceLineNo">2024</span>      // expected exception.<a name="line.2024"></a>
-<span class="sourceLineNo">2025</span>    }<a name="line.2025"></a>
-<span class="sourceLineNo">2026</span>  }<a name="line.2026"></a>
-<span class="sourceLineNo">2027</span><a name="line.2027"></a>
-<span class="sourceLineNo">2028</span>  @Test<a name="line.2028"></a>
-<span class="sourceLineNo">2029</span>  public void testCheckAndDelete_ThatDeleteWasWritten() throws IOException {<a name="line.2029"></a>
-<span class="sourceLineNo">2030</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2030"></a>
-<span class="sourceLineNo">2031</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2031"></a>
-<span class="sourceLineNo">2032</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2032"></a>
-<span class="sourceLineNo">2033</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.2033"></a>
-<span class="sourceLineNo">2034</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.2034"></a>
-<span class="sourceLineNo">2035</span>    byte[] qf3 = Bytes.toBytes("qualifier3");<a name="line.2035"></a>
-<span class="sourceLineNo">2036</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.2036"></a>
-<span class="sourceLineNo">2037</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.2037"></a>
-<span class="sourceLineNo">2038</span>    byte[] val3 = Bytes.toBytes("value3");<a name="line.2038"></a>
-<span class="sourceLineNo">2039</span>    byte[] emptyVal = new byte[] {};<a name="line.2039"></a>
-<span class="sourceLineNo">2040</span><a name="line.2040"></a>
-<span class="sourceLineNo">2041</span>    byte[][] families = { fam1, fam2 };<a name="line.2041"></a>
-<span class="sourceLineNo">2042</span><a name="line.2042"></a>
-<span class="sourceLineNo">2043</span>    // Setting up region<a name="line.2043"></a>
-<span class="sourceLineNo">2044</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2044"></a>
-<span class="sourceLineNo">2045</span>    // Put content<a name="line.2045"></a>
-<span class="sourceLineNo">2046</span>    Put put = new Put(row1);<a name="line.2046"></a>
-<span class="sourceLineNo">2047</span>    put.addColumn(fam1, qf1, val1);<a name="line.2047"></a>
-<span class="sourceLineNo">2048</span>    region.put(put);<a name="line.2048"></a>
-<span class="sourceLineNo">2049</span>    Threads.sleep(2);<a name="line.2049"></a>
-<span class="sourceLineNo">2050</span><a name="line.2050"></a>
-<span class="sourceLineNo">2051</span>    put = new Put(row1);<a name="line.2051"></a>
-<span class="sourceLineNo">2052</span>    put.addColumn(fam1, qf1, val2);<a name="line.2052"></a>
-<span class="sourceLineNo">2053</span>    put.addColumn(fam2, qf1, val3);<a name="line.2053"></a>
-<span class="sourceLineNo">2054</span>    put.addColumn(fam2, qf2, val2);<a name="line.2054"></a>
-<span class="sourceLineNo">2055</span>    put.addColumn(fam2, qf3, val1);<a name="line.2055"></a>
-<span class="sourceLineNo">2056</span>    put.addColumn(fam1, qf3, val1);<a name="line.2056"></a>
-<span class="sourceLineNo">2057</span>    region.put(put);<a name="line.2057"></a>
-<span class="sourceLineNo">2058</span><a name="line.2058"></a>
-<span class="sourceLineNo">2059</span>    // Multi-column delete<a name="line.2059"></a>
-<span class="sourceLineNo">2060</span>    Delete delete = new Delete(row1);<a name="line.2060"></a>
-<span class="sourceLineNo">2061</span>    delete.addColumn(fam1, qf1);<a name="line.2061"></a>
-<span class="sourceLineNo">2062</span>    delete.addColumn(fam2, qf1);<a name="line.2062"></a>
-<span class="sourceLineNo">2063</span>    delete.addColumn(fam1, qf3);<a name="line.2063"></a>
-<span class="sourceLineNo">2064</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.2064"></a>
-<span class="sourceLineNo">2065</span>        new BinaryComparator(val2), delete);<a name="line.2065"></a>
-<span class="sourceLineNo">2066</span>    assertEquals(true, res);<a name="line.2066"></a>
-<span class="sourceLineNo">2067</span><a name="line.2067"></a>
-<span class="sourceLineNo">2068</span>    Get get = new Get(row1);<a name="line.2068"></a>
-<span class="sourceLineNo">2069</span>    get.addColumn(fam1, qf1);<a name="line.2069"></a>
-<span class="sourceLineNo">2070</span>    get.addColumn(fam1, qf3);<a name="line.2070"></a>
-<span class="sourceLineNo">2071</span>    get.addColumn(fam2, qf2);<a name="line.2071"></a>
-<span class="sourceLineNo">2072</span>    Result r = region.get(get);<a name="line.2072"></a>
-<span class="sourceLineNo">2073</span>    assertEquals(2, r.size());<a name="line.2073"></a>
-<span class="sourceLineNo">2074</span>    assertArrayEquals(val1, r.getValue(fam1, qf1));<a name="line.2074"></a>
-<span class="sourceLineNo">2075</span>    assertArrayEquals(val2, r.getValue(fam2, qf2));<a name="line.2075"></a>
-<span class="sourceLineNo">2076</span><a name="line.2076"></a>
-<span class="sourceLineNo">2077</span>    // Family delete<a name="line.2077"></a>
-<span class="sourceLineNo">2078</span>    delete = new Delete(row1);<a name="line.2078"></a>
-<span class="sourceLineNo">2079</span>    delete.addFamily(fam2);<a name="line.2079"></a>
-<span class="sourceLineNo">2080</span>    res = region.checkAndMutate(row1, fam2, qf1, CompareOperator.EQUAL,<a name="line.2080"></a>
-<span class="sourceLineNo">2081</span>        new BinaryComparator(emptyVal), delete);<a name="line.2081"></a>
-<span class="sourceLineNo">2082</span>    assertEquals(true, res);<a name="line.2082"></a>
-<span class="sourceLineNo">2083</span><a name="line.2083"></a>
-<span class="sourceLineNo">2084</span>    get = new Get(row1);<a name="line.2084"></a>
-<span class="sourceLineNo">2085</span>    r = region.get(get);<a name="line.2085"></a>
-<span class="sourceLineNo">2086</span>    assertEquals(1, r.size());<a name="line.2086"></a>
-<span class="sourceLineNo">2087</span>    assertArrayEquals(val1, r.getValue(fam1, qf1));<a name="line.2087"></a>
-<span class="sourceLineNo">2088</span><a name="line.2088"></a>
-<span class="sourceLineNo">2089</span>    // Row delete<a name="line.2089"></a>
-<span class="sourceLineNo">2090</span>    delete = new Delete(row1);<a name="line.2090"></a>
-<span class="sourceLineNo">2091</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new BinaryComparator(val1),<a name="line.2091"></a>
-<span class="sourceLineNo">2092</span>        delete);<a name="line.2092"></a>
-<span class="sourceLineNo">2093</span>    assertEquals(true, res);<a name="line.2093"></a>
-<span class="sourceLineNo">2094</span>    get = new Get(row1);<a name="line.2094"></a>
-<span class="sourceLineNo">2095</span>    r = region.get(get);<a name="line.2095"></a>
-<span class="sourceLineNo">2096</span>    assertEquals(0, r.size());<a name="line.2096"></a>
-<span class="sourceLineNo">2097</span>  }<a name="line.2097"></a>
-<span class="sourceLineNo">2098</span><a name="line.2098"></a>
-<span class="sourceLineNo">2099</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2099"></a>
-<span class="sourceLineNo">2100</span>  // Delete tests<a name="line.2100"></a>
-<span class="sourceLineNo">2101</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2101"></a>
-<span class="sourceLineNo">2102</span>  @Test<a name="line.2102"></a>
-<span class="sourceLineNo">2103</span>  public void testDelete_multiDeleteColumn() throws IOException {<a name="line.2103"></a>
-<span class="sourceLineNo">2104</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2104"></a>
-<span class="sourceLineNo">2105</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2105"></a>
-<span class="sourceLineNo">2106</span>    byte[] qual = Bytes.toBytes("qualifier");<a name="line.2106"></a>
-<span class="sourceLineNo">2107</span>    byte[] value = Bytes.toBytes("value");<a name="line.2107"></a>
-<span class="sourceLineNo">2108</span><a name="line.2108"></a>
-<span class="sourceLineNo">2109</span>    Put put = new Put(row1);<a name="line.2109"></a>
-<span class="sourceLineNo">2110</span>    put.addColumn(fam1, qual, 1, value);<a name="line.2110"></a>
-<span class="sourceLineNo">2111</span>    put.addColumn(fam1, qual, 2, value);<a name="line.2111"></a>
-<span class="sourceLineNo">2112</span><a name="line.2112"></a>
-<span class="sourceLineNo">2113</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2113"></a>
-<span class="sourceLineNo">2114</span>    region.put(put);<a name="line.2114"></a>
-<span class="sourceLineNo">2115</span><a name="line.2115"></a>
-<span class="sourceLineNo">2116</span>    // We do support deleting more than 1 'latest' version<a name="line.2116"></a>
-<span class="sourceLineNo">2117</span>    Delete delete = new Delete(row1);<a name="line.2117"></a>
-<span class="sourceLineNo">2118</span>    delete.addColumn(fam1, qual);<a name="line.2118"></a>
+<span class="sourceLineNo">1770</span>    delete.addColumn(fam1, qf1);<a name="line.1770"></a>
+<span class="sourceLineNo">1771</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1771"></a>
+<span class="sourceLineNo">1772</span>        new BinaryComparator(val2), delete);<a name="line.1772"></a>
+<span class="sourceLineNo">1773</span>    assertTrue(res);<a name="line.1773"></a>
+<span class="sourceLineNo">1774</span><a name="line.1774"></a>
+<span class="sourceLineNo">1775</span>    delete = new Delete(row1);<a name="line.1775"></a>
+<span class="sourceLineNo">1776</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1776"></a>
+<span class="sourceLineNo">1777</span>        new BinaryComparator(emptyVal), delete);<a name="line.1777"></a>
+<span class="sourceLineNo">1778</span>    assertTrue(res);<a name="line.1778"></a>
+<span class="sourceLineNo">1779</span><a name="line.1779"></a>
+<span class="sourceLineNo">1780</span>    // checkAndPut looking for a null value<a name="line.1780"></a>
+<span class="sourceLineNo">1781</span>    put = new Put(row1);<a name="line.1781"></a>
+<span class="sourceLineNo">1782</span>    put.addColumn(fam1, qf1, val1);<a name="line.1782"></a>
+<span class="sourceLineNo">1783</span><a name="line.1783"></a>
+<span class="sourceLineNo">1784</span>    res = region<a name="line.1784"></a>
+<span class="sourceLineNo">1785</span>        .checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new NullComparator(), put);<a name="line.1785"></a>
+<span class="sourceLineNo">1786</span>    assertTrue(res);<a name="line.1786"></a>
+<span class="sourceLineNo">1787</span>  }<a name="line.1787"></a>
+<span class="sourceLineNo">1788</span><a name="line.1788"></a>
+<span class="sourceLineNo">1789</span>  @Test<a name="line.1789"></a>
+<span class="sourceLineNo">1790</span>  public void testCheckAndMutate_WithWrongValue() throws IOException {<a name="line.1790"></a>
+<span class="sourceLineNo">1791</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1791"></a>
+<span class="sourceLineNo">1792</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1792"></a>
+<span class="sourceLineNo">1793</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1793"></a>
+<span class="sourceLineNo">1794</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1794"></a>
+<span class="sourceLineNo">1795</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.1795"></a>
+<span class="sourceLineNo">1796</span>    BigDecimal bd1 = new BigDecimal(Double.MAX_VALUE);<a name="line.1796"></a>
+<span class="sourceLineNo">1797</span>    BigDecimal bd2 = new BigDecimal(Double.MIN_VALUE);<a name="line.1797"></a>
+<span class="sourceLineNo">1798</span><a name="line.1798"></a>
+<span class="sourceLineNo">1799</span>    // Setting up region<a name="line.1799"></a>
+<span class="sourceLineNo">1800</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.1800"></a>
+<span class="sourceLineNo">1801</span>    // Putting data in key<a name="line.1801"></a>
+<span class="sourceLineNo">1802</span>    Put put = new Put(row1);<a name="line.1802"></a>
+<span class="sourceLineNo">1803</span>    put.addColumn(fam1, qf1, val1);<a name="line.1803"></a>
+<span class="sourceLineNo">1804</span>    region.put(put);<a name="line.1804"></a>
+<span class="sourceLineNo">1805</span><a name="line.1805"></a>
+<span class="sourceLineNo">1806</span>    // checkAndPut with wrong value<a name="line.1806"></a>
+<span class="sourceLineNo">1807</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1807"></a>
+<span class="sourceLineNo">1808</span>        new BinaryComparator(val2), put);<a name="line.1808"></a>
+<span class="sourceLineNo">1809</span>    assertEquals(false, res);<a name="line.1809"></a>
+<span class="sourceLineNo">1810</span><a name="line.1810"></a>
+<span class="sourceLineNo">1811</span>    // checkAndDelete with wrong value<a name="line.1811"></a>
+<span class="sourceLineNo">1812</span>    Delete delete = new Delete(row1);<a name="line.1812"></a>
+<span class="sourceLineNo">1813</span>    delete.addFamily(fam1);<a name="line.1813"></a>
+<span class="sourceLineNo">1814</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1814"></a>
+<span class="sourceLineNo">1815</span>        new BinaryComparator(val2), put);<a name="line.1815"></a>
+<span class="sourceLineNo">1816</span>    assertEquals(false, res);<a name="line.1816"></a>
+<span class="sourceLineNo">1817</span><a name="line.1817"></a>
+<span class="sourceLineNo">1818</span>    // Putting data in key<a name="line.1818"></a>
+<span class="sourceLineNo">1819</span>    put = new Put(row1);<a name="line.1819"></a>
+<span class="sourceLineNo">1820</span>    put.addColumn(fam1, qf1, Bytes.toBytes(bd1));<a name="line.1820"></a>
+<span class="sourceLineNo">1821</span>    region.put(put);<a name="line.1821"></a>
+<span class="sourceLineNo">1822</span><a name="line.1822"></a>
+<span class="sourceLineNo">1823</span>    // checkAndPut with wrong value<a name="line.1823"></a>
+<span class="sourceLineNo">1824</span>    res =<a name="line.1824"></a>
+<span class="sourceLineNo">1825</span>        region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1825"></a>
+<span class="sourceLineNo">1826</span>            new BigDecimalComparator(bd2), put);<a name="line.1826"></a>
+<span class="sourceLineNo">1827</span>    assertEquals(false, res);<a name="line.1827"></a>
+<span class="sourceLineNo">1828</span><a name="line.1828"></a>
+<span class="sourceLineNo">1829</span>    // checkAndDelete with wrong value<a name="line.1829"></a>
+<span class="sourceLineNo">1830</span>    delete = new Delete(row1);<a name="line.1830"></a>
+<span class="sourceLineNo">1831</span>    delete.addFamily(fam1);<a name="line.1831"></a>
+<span class="sourceLineNo">1832</span>    res =<a name="line.1832"></a>
+<span class="sourceLineNo">1833</span>        region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1833"></a>
+<span class="sourceLineNo">1834</span>            new BigDecimalComparator(bd2), put);<a name="line.1834"></a>
+<span class="sourceLineNo">1835</span>    assertEquals(false, res);<a name="line.1835"></a>
+<span class="sourceLineNo">1836</span>  }<a name="line.1836"></a>
+<span class="sourceLineNo">1837</span><a name="line.1837"></a>
+<span class="sourceLineNo">1838</span>  @Test<a name="line.1838"></a>
+<span class="sourceLineNo">1839</span>  public void testCheckAndMutate_WithCorrectValue() throws IOException {<a name="line.1839"></a>
+<span class="sourceLineNo">1840</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1840"></a>
+<span class="sourceLineNo">1841</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1841"></a>
+<span class="sourceLineNo">1842</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1842"></a>
+<span class="sourceLineNo">1843</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1843"></a>
+<span class="sourceLineNo">1844</span>    BigDecimal bd1 = new BigDecimal(Double.MIN_VALUE);<a name="line.1844"></a>
+<span class="sourceLineNo">1845</span><a name="line.1845"></a>
+<span class="sourceLineNo">1846</span>    // Setting up region<a name="line.1846"></a>
+<span class="sourceLineNo">1847</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.1847"></a>
+<span class="sourceLineNo">1848</span>    // Putting data in key<a name="line.1848"></a>
+<span class="sourceLineNo">1849</span>    Put put = new Put(row1);<a name="line.1849"></a>
+<span class="sourceLineNo">1850</span>    put.addColumn(fam1, qf1, val1);<a name="line.1850"></a>
+<span class="sourceLineNo">1851</span>    region.put(put);<a name="line.1851"></a>
+<span class="sourceLineNo">1852</span><a name="line.1852"></a>
+<span class="sourceLineNo">1853</span>    // checkAndPut with correct value<a name="line.1853"></a>
+<span class="sourceLineNo">1854</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1854"></a>
+<span class="sourceLineNo">1855</span>        new BinaryComparator(val1), put);<a name="line.1855"></a>
+<span class="sourceLineNo">1856</span>    assertEquals(true, res);<a name="line.1856"></a>
+<span class="sourceLineNo">1857</span><a name="line.1857"></a>
+<span class="sourceLineNo">1858</span>    // checkAndDelete with correct value<a name="line.1858"></a>
+<span class="sourceLineNo">1859</span>    Delete delete = new Delete(row1);<a name="line.1859"></a>
+<span class="sourceLineNo">1860</span>    delete.addColumn(fam1, qf1);<a name="line.1860"></a>
+<span class="sourceLineNo">1861</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new BinaryComparator(val1),<a name="line.1861"></a>
+<span class="sourceLineNo">1862</span>        delete);<a name="line.1862"></a>
+<span class="sourceLineNo">1863</span>    assertEquals(true, res);<a name="line.1863"></a>
+<span class="sourceLineNo">1864</span><a name="line.1864"></a>
+<span class="sourceLineNo">1865</span>    // Putting data in key<a name="line.1865"></a>
+<span class="sourceLineNo">1866</span>    put = new Put(row1);<a name="line.1866"></a>
+<span class="sourceLineNo">1867</span>    put.addColumn(fam1, qf1, Bytes.toBytes(bd1));<a name="line.1867"></a>
+<span class="sourceLineNo">1868</span>    region.put(put);<a name="line.1868"></a>
+<span class="sourceLineNo">1869</span><a name="line.1869"></a>
+<span class="sourceLineNo">1870</span>    // checkAndPut with correct value<a name="line.1870"></a>
+<span class="sourceLineNo">1871</span>    res =<a name="line.1871"></a>
+<span class="sourceLineNo">1872</span>        region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new BigDecimalComparator(<a name="line.1872"></a>
+<span class="sourceLineNo">1873</span>            bd1), put);<a name="line.1873"></a>
+<span class="sourceLineNo">1874</span>    assertEquals(true, res);<a name="line.1874"></a>
+<span class="sourceLineNo">1875</span><a name="line.1875"></a>
+<span class="sourceLineNo">1876</span>    // checkAndDelete with correct value<a name="line.1876"></a>
+<span class="sourceLineNo">1877</span>    delete = new Delete(row1);<a name="line.1877"></a>
+<span class="sourceLineNo">1878</span>    delete.addColumn(fam1, qf1);<a name="line.1878"></a>
+<span class="sourceLineNo">1879</span>    res =<a name="line.1879"></a>
+<span class="sourceLineNo">1880</span>        region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new BigDecimalComparator(<a name="line.1880"></a>
+<span class="sourceLineNo">1881</span>            bd1), delete);<a name="line.1881"></a>
+<span class="sourceLineNo">1882</span>    assertEquals(true, res);<a name="line.1882"></a>
+<span class="sourceLineNo">1883</span>  }<a name="line.1883"></a>
+<span class="sourceLineNo">1884</span><a name="line.1884"></a>
+<span class="sourceLineNo">1885</span>  @Test<a name="line.1885"></a>
+<span class="sourceLineNo">1886</span>  public void testCheckAndMutate_WithNonEqualCompareOp() throws IOException {<a name="line.1886"></a>
+<span class="sourceLineNo">1887</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1887"></a>
+<span class="sourceLineNo">1888</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1888"></a>
+<span class="sourceLineNo">1889</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1889"></a>
+<span class="sourceLineNo">1890</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1890"></a>
+<span class="sourceLineNo">1891</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.1891"></a>
+<span class="sourceLineNo">1892</span>    byte[] val3 = Bytes.toBytes("value3");<a name="line.1892"></a>
+<span class="sourceLineNo">1893</span>    byte[] val4 = Bytes.toBytes("value4");<a name="line.1893"></a>
+<span class="sourceLineNo">1894</span><a name="line.1894"></a>
+<span class="sourceLineNo">1895</span>    // Setting up region<a name="line.1895"></a>
+<span class="sourceLineNo">1896</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.1896"></a>
+<span class="sourceLineNo">1897</span>    // Putting val3 in key<a name="line.1897"></a>
+<span class="sourceLineNo">1898</span>    Put put = new Put(row1);<a name="line.1898"></a>
+<span class="sourceLineNo">1899</span>    put.addColumn(fam1, qf1, val3);<a name="line.1899"></a>
+<span class="sourceLineNo">1900</span>    region.put(put);<a name="line.1900"></a>
+<span class="sourceLineNo">1901</span><a name="line.1901"></a>
+<span class="sourceLineNo">1902</span>    // Test CompareOp.LESS: original = val3, compare with val3, fail<a name="line.1902"></a>
+<span class="sourceLineNo">1903</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS,<a name="line.1903"></a>
+<span class="sourceLineNo">1904</span>        new BinaryComparator(val3), put);<a name="line.1904"></a>
+<span class="sourceLineNo">1905</span>    assertEquals(false, res);<a name="line.1905"></a>
+<span class="sourceLineNo">1906</span><a name="line.1906"></a>
+<span class="sourceLineNo">1907</span>    // Test CompareOp.LESS: original = val3, compare with val4, fail<a name="line.1907"></a>
+<span class="sourceLineNo">1908</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS,<a name="line.1908"></a>
+<span class="sourceLineNo">1909</span>        new BinaryComparator(val4), put);<a name="line.1909"></a>
+<span class="sourceLineNo">1910</span>    assertEquals(false, res);<a name="line.1910"></a>
+<span class="sourceLineNo">1911</span><a name="line.1911"></a>
+<span class="sourceLineNo">1912</span>    // Test CompareOp.LESS: original = val3, compare with val2,<a name="line.1912"></a>
+<span class="sourceLineNo">1913</span>    // succeed (now value = val2)<a name="line.1913"></a>
+<span class="sourceLineNo">1914</span>    put = new Put(row1);<a name="line.1914"></a>
+<span class="sourceLineNo">1915</span>    put.addColumn(fam1, qf1, val2);<a name="line.1915"></a>
+<span class="sourceLineNo">1916</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS,<a name="line.1916"></a>
+<span class="sourceLineNo">1917</span>        new BinaryComparator(val2), put);<a name="line.1917"></a>
+<span class="sourceLineNo">1918</span>    assertEquals(true, res);<a name="line.1918"></a>
+<span class="sourceLineNo">1919</span><a name="line.1919"></a>
+<span class="sourceLineNo">1920</span>    // Test CompareOp.LESS_OR_EQUAL: original = val2, compare with val3, fail<a name="line.1920"></a>
+<span class="sourceLineNo">1921</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS_OR_EQUAL,<a name="line.1921"></a>
+<span class="sourceLineNo">1922</span>        new BinaryComparator(val3), put);<a name="line.1922"></a>
+<span class="sourceLineNo">1923</span>    assertEquals(false, res);<a name="line.1923"></a>
+<span class="sourceLineNo">1924</span><a name="line.1924"></a>
+<span class="sourceLineNo">1925</span>    // Test CompareOp.LESS_OR_EQUAL: original = val2, compare with val2,<a name="line.1925"></a>
+<span class="sourceLineNo">1926</span>    // succeed (value still = val2)<a name="line.1926"></a>
+<span class="sourceLineNo">1927</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS_OR_EQUAL,<a name="line.1927"></a>
+<span class="sourceLineNo">1928</span>        new BinaryComparator(val2), put);<a name="line.1928"></a>
+<span class="sourceLineNo">1929</span>    assertEquals(true, res);<a name="line.1929"></a>
+<span class="sourceLineNo">1930</span><a name="line.1930"></a>
+<span class="sourceLineNo">1931</span>    // Test CompareOp.LESS_OR_EQUAL: original = val2, compare with val1,<a name="line.1931"></a>
+<span class="sourceLineNo">1932</span>    // succeed (now value = val3)<a name="line.1932"></a>
+<span class="sourceLineNo">1933</span>    put = new Put(row1);<a name="line.1933"></a>
+<span class="sourceLineNo">1934</span>    put.addColumn(fam1, qf1, val3);<a name="line.1934"></a>
+<span class="sourceLineNo">1935</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS_OR_EQUAL,<a name="line.1935"></a>
+<span class="sourceLineNo">1936</span>        new BinaryComparator(val1), put);<a name="line.1936"></a>
+<span class="sourceLineNo">1937</span>    assertEquals(true, res);<a name="line.1937"></a>
+<span class="sourceLineNo">1938</span><a name="line.1938"></a>
+<span class="sourceLineNo">1939</span>    // Test CompareOp.GREATER: original = val3, compare with val3, fail<a name="line.1939"></a>
+<span class="sourceLineNo">1940</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER,<a name="line.1940"></a>
+<span class="sourceLineNo">1941</span>        new BinaryComparator(val3), put);<a name="line.1941"></a>
+<span class="sourceLineNo">1942</span>    assertEquals(false, res);<a name="line.1942"></a>
+<span class="sourceLineNo">1943</span><a name="line.1943"></a>
+<span class="sourceLineNo">1944</span>    // Test CompareOp.GREATER: original = val3, compare with val2, fail<a name="line.1944"></a>
+<span class="sourceLineNo">1945</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER,<a name="line.1945"></a>
+<span class="sourceLineNo">1946</span>        new BinaryComparator(val2), put);<a name="line.1946"></a>
+<span class="sourceLineNo">1947</span>    assertEquals(false, res);<a name="line.1947"></a>
+<span class="sourceLineNo">1948</span><a name="line.1948"></a>
+<span class="sourceLineNo">1949</span>    // Test CompareOp.GREATER: original = val3, compare with val4,<a name="line.1949"></a>
+<span class="sourceLineNo">1950</span>    // succeed (now value = val2)<a name="line.1950"></a>
+<span class="sourceLineNo">1951</span>    put = new Put(row1);<a name="line.1951"></a>
+<span class="sourceLineNo">1952</span>    put.addColumn(fam1, qf1, val2);<a name="line.1952"></a>
+<span class="sourceLineNo">1953</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER,<a name="line.1953"></a>
+<span class="sourceLineNo">1954</span>        new BinaryComparator(val4), put);<a name="line.1954"></a>
+<span class="sourceLineNo">1955</span>    assertEquals(true, res);<a name="line.1955"></a>
+<span class="sourceLineNo">1956</span><a name="line.1956"></a>
+<span class="sourceLineNo">1957</span>    // Test CompareOp.GREATER_OR_EQUAL: original = val2, compare with val1, fail<a name="line.1957"></a>
+<span class="sourceLineNo">1958</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER_OR_EQUAL,<a name="line.1958"></a>
+<span class="sourceLineNo">1959</span>        new BinaryComparator(val1), put);<a name="line.1959"></a>
+<span class="sourceLineNo">1960</span>    assertEquals(false, res);<a name="line.1960"></a>
+<span class="sourceLineNo">1961</span><a name="line.1961"></a>
+<span class="sourceLineNo">1962</span>    // Test CompareOp.GREATER_OR_EQUAL: original = val2, compare with val2,<a name="line.1962"></a>
+<span class="sourceLineNo">1963</span>    // succeed (value still = val2)<a name="line.1963"></a>
+<span class="sourceLineNo">1964</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER_OR_EQUAL,<a name="line.1964"></a>
+<span class="sourceLineNo">1965</span>        new BinaryComparator(val2), put);<a name="line.1965"></a>
+<span class="sourceLineNo">1966</span>    assertEquals(true, res);<a name="line.1966"></a>
+<span class="sourceLineNo">1967</span><a name="line.1967"></a>
+<span class="sourceLineNo">1968</span>    // Test CompareOp.GREATER_OR_EQUAL: original = val2, compare with val3, succeed<a name="line.1968"></a>
+<span class="sourceLineNo">1969</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER_OR_EQUAL,<a name="line.1969"></a>
+<span class="sourceLineNo">1970</span>        new BinaryComparator(val3), put);<a name="line.1970"></a>
+<span class="sourceLineNo">1971</span>    assertEquals(true, res);<a name="line.1971"></a>
+<span class="sourceLineNo">1972</span>  }<a name="line.1972"></a>
+<span class="sourceLineNo">1973</span><a name="line.1973"></a>
+<span class="sourceLineNo">1974</span>  @Test<a name="line.1974"></a>
+<span class="sourceLineNo">1975</span>  public void testCheckAndPut_ThatPutWasWritten() throws IOException {<a name="line.1975"></a>
+<span class="sourceLineNo">1976</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1976"></a>
+<span class="sourceLineNo">1977</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1977"></a>
+<span class="sourceLineNo">1978</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.1978"></a>
+<span class="sourceLineNo">1979</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1979"></a>
+<span class="sourceLineNo">1980</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1980"></a>
+<span class="sourceLineNo">1981</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.1981"></a>
+<span class="sourceLineNo">1982</span><a name="line.1982"></a>
+<span class="sourceLineNo">1983</span>    byte[][] families = { fam1, fam2 };<a name="line.1983"></a>
+<span class="sourceLineNo">1984</span><a name="line.1984"></a>
+<span class="sourceLineNo">1985</span>    // Setting up region<a name="line.1985"></a>
+<span class="sourceLineNo">1986</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.1986"></a>
+<span class="sourceLineNo">1987</span>    // Putting data in the key to check<a name="line.1987"></a>
+<span class="sourceLineNo">1988</span>    Put put = new Put(row1);<a name="line.1988"></a>
+<span class="sourceLineNo">1989</span>    put.addColumn(fam1, qf1, val1);<a name="line.1989"></a>
+<span class="sourceLineNo">1990</span>    region.put(put);<a name="line.1990"></a>
+<span class="sourceLineNo">1991</span><a name="line.1991"></a>
+<span class="sourceLineNo">1992</span>    // Creating put to add<a name="line.1992"></a>
+<span class="sourceLineNo">1993</span>    long ts = System.currentTimeMillis();<a name="line.1993"></a>
+<span class="sourceLineNo">1994</span>    KeyValue kv = new KeyValue(row1, fam2, qf1, ts, KeyValue.Type.Put, val2);<a name="line.1994"></a>
+<span class="sourceLineNo">1995</span>    put = new Put(row1);<a name="line.1995"></a>
+<span class="sourceLineNo">1996</span>    put.add(kv);<a name="line.1996"></a>
+<span class="sourceLineNo">1997</span><a name="line.1997"></a>
+<span class="sourceLineNo">1998</span>    // checkAndPut with wrong value<a name="line.1998"></a>
+<span class="sourceLineNo">1999</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1999"></a>
+<span class="sourceLineNo">2000</span>        new BinaryComparator(val1), put);<a name="line.2000"></a>
+<span class="sourceLineNo">2001</span>    assertEquals(true, res);<a name="line.2001"></a>
+<span class="sourceLineNo">2002</span><a name="line.2002"></a>
+<span class="sourceLineNo">2003</span>    Get get = new Get(row1);<a name="line.2003"></a>
+<span class="sourceLineNo">2004</span>    get.addColumn(fam2, qf1);<a name="line.2004"></a>
+<span class="sourceLineNo">2005</span>    Cell[] actual = region.get(get).rawCells();<a name="line.2005"></a>
+<span class="sourceLineNo">2006</span><a name="line.2006"></a>
+<span class="sourceLineNo">2007</span>    Cell[] expected = { kv };<a name="line.2007"></a>
+<span class="sourceLineNo">2008</span><a name="line.2008"></a>
+<span class="sourceLineNo">2009</span>    assertEquals(expected.length, actual.length);<a name="line.2009"></a>
+<span class="sourceLineNo">2010</span>    for (int i = 0; i &lt; actual.length; i++) {<a name="line.2010"></a>
+<span class="sourceLineNo">2011</span>      assertEquals(expected[i], actual[i]);<a name="line.2011"></a>
+<span class="sourceLineNo">2012</span>    }<a name="line.2012"></a>
+<span class="sourceLineNo">2013</span>  }<a name="line.2013"></a>
+<span class="sourceLineNo">2014</span><a name="line.2014"></a>
+<span class="sourceLineNo">2015</span>  @Test<a name="line.2015"></a>
+<span class="sourceLineNo">2016</span>  public void testCheckAndPut_wrongRowInPut() throws IOException {<a name="line.2016"></a>
+<span class="sourceLineNo">2017</span>    this.region = initHRegion(tableName, method, CONF, COLUMNS);<a name="line.2017"></a>
+<span class="sourceLineNo">2018</span>    Put put = new Put(row2);<a name="line.2018"></a>
+<span class="sourceLineNo">2019</span>    put.addColumn(fam1, qual1, value1);<a name="line.2019"></a>
+<span class="sourceLineNo">2020</span>    try {<a name="line.2020"></a>
+<span class="sourceLineNo">2021</span>      region.checkAndMutate(row, fam1, qual1, CompareOperator.EQUAL,<a name="line.2021"></a>
+<span class="sourceLineNo">2022</span>          new BinaryComparator(value2), put);<a name="line.2022"></a>
+<span class="sourceLineNo">2023</span>      fail();<a name="line.2023"></a>
+<span class="sourceLineNo">2024</span>    } catch (org.apache.hadoop.hbase.DoNotRetryIOException expected) {<a name="line.2024"></a>
+<span class="sourceLineNo">2025</span>      // expected exception.<a name="line.2025"></a>
+<span class="sourceLineNo">2026</span>    }<a name="line.2026"></a>
+<span class="sourceLineNo">2027</span>  }<a name="line.2027"></a>
+<span class="sourceLineNo">2028</span><a name="line.2028"></a>
+<span class="sourceLineNo">2029</span>  @Test<a name="line.2029"></a>
+<span class="sourceLineNo">2030</span>  public void testCheckAndDelete_ThatDeleteWasWritten() throws IOException {<a name="line.2030"></a>
+<span class="sourceLineNo">2031</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2031"></a>
+<span class="sourceLineNo">2032</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2032"></a>
+<span class="sourceLineNo">2033</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2033"></a>
+<span class="sourceLineNo">2034</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.2034"></a>
+<span class="sourceLineNo">2035</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.2035"></a>
+<span class="sourceLineNo">2036</span>    byte[] qf3 = Bytes.toBytes("qualifier3");<a name="line.2036"></a>
+<span class="sourceLineNo">2037</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.2037"></a>
+<span class="sourceLineNo">2038</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.2038"></a>
+<span class="sourceLineNo">2039</span>    byte[] val3 = Bytes.toBytes("value3");<a name="line.2039"></a>
+<span class="sourceLineNo">2040</span>    byte[] emptyVal = new byte[] {};<a name="line.2040"></a>
+<span class="sourceLineNo">2041</span><a name="line.2041"></a>
+<span class="sourceLineNo">2042</span>    byte[][] families = { fam1, fam2 };<a name="line.2042"></a>
+<span class="sourceLineNo">2043</span><a name="line.2043"></a>
+<span class="sourceLineNo">2044</span>    // Setting up region<a name="line.2044"></a>
+<span class="sourceLineNo">2045</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2045"></a>
+<span class="sourceLineNo">2046</span>    // Put content<a name="line.2046"></a>
+<span class="sourceLineNo">2047</span>    Put put = new Put(row1);<a name="line.2047"></a>
+<span class="sourceLineNo">2048</span>    put.addColumn(fam1, qf1, val1);<a name="line.2048"></a>
+<span class="sourceLineNo">2049</span>    region.put(put);<a name="line.2049"></a>
+<span class="sourceLineNo">2050</span>    Threads.sleep(2);<a name="line.2050"></a>
+<span class="sourceLineNo">2051</span><a name="line.2051"></a>
+<span class="sourceLineNo">2052</span>    put = new Put(row1);<a name="line.2052"></a>
+<span class="sourceLineNo">2053</span>    put.addColumn(fam1, qf1, val2);<a name="line.2053"></a>
+<span class="sourceLineNo">2054</span>    put.addColumn(fam2, qf1, val3);<a name="line.2054"></a>
+<span class="sourceLineNo">2055</span>    put.addColumn(fam2, qf2, val2);<a name="line.2055"></a>
+<span class="sourceLineNo">2056</span>    put.addColumn(fam2, qf3, val1);<a name="line.2056"></a>
+<span class="sourceLineNo">2057</span>    put.addColumn(fam1, qf3, val1);<a name="line.2057"></a>
+<span class="sourceLineNo">2058</span>    region.put(put);<a name="line.2058"></a>
+<span class="sourceLineNo">2059</span><a name="line.2059"></a>
+<span class="sourceLineNo">2060</span>    // Multi-column delete<a name="line.2060"></a>
+<span class="sourceLineNo">2061</span>    Delete delete = new Delete(row1);<a name="line.2061"></a>
+<span class="sourceLineNo">2062</span>    delete.addColumn(fam1, qf1);<a name="line.2062"></a>
+<span class="sourceLineNo">2063</span>    delete.addColumn(fam2, qf1);<a name="line.2063"></a>
+<span class="sourceLineNo">2064</span>    delete.addColumn(fam1, qf3);<a name="line.2064"></a>
+<span class="sourceLineNo">2065</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.2065"></a>
+<span class="sourceLineNo">2066</span>        new BinaryComparator(val2), delete);<a name="line.2066"></a>
+<span class="sourceLineNo">2067</span>    assertEquals(true, res);<a name="line.2067"></a>
+<span class="sourceLineNo">2068</span><a name="line.2068"></a>
+<span class="sourceLineNo">2069</span>    Get get = new Get(row1);<a name="line.2069"></a>
+<span class="sourceLineNo">2070</span>    get.addColumn(fam1, qf1);<a name="line.2070"></a>
+<span class="sourceLineNo">2071</span>    get.addColumn(fam1, qf3);<a name="line.2071"></a>
+<span class="sourceLineNo">2072</span>    get.addColumn(fam2, qf2);<a name="line.2072"></a>
+<span class="sourceLineNo">2073</span>    Result r = region.get(get);<a name="line.2073"></a>
+<span class="sourceLineNo">2074</span>    assertEquals(2, r.size());<a name="line.2074"></a>
+<span class="sourceLineNo">2075</span>    assertArrayEquals(val1, r.getValue(fam1, qf1));<a name="line.2075"></a>
+<span class="sourceLineNo">2076</span>    assertArrayEquals(val2, r.getValue(fam2, qf2));<a name="line.2076"></a>
+<span class="sourceLineNo">2077</span><a name="line.2077"></a>
+<span class="sourceLineNo">2078</span>    // Family delete<a name="line.2078"></a>
+<span class="sourceLineNo">2079</span>    delete = new Delete(row1);<a name="line.2079"></a>
+<span class="sourceLineNo">2080</span>    delete.addFamily(fam2);<a name="line.2080"></a>
+<span class="sourceLineNo">2081</span>    res = region.checkAndMutate(row1, fam2, qf1, CompareOperator.EQUAL,<a name="line.2081"></a>
+<span class="sourceLineNo">2082</span>        new BinaryComparator(emptyVal), delete);<a name="line.2082"></a>
+<span class="sourceLineNo">2083</span>    assertEquals(true, res);<a name="line.2083"></a>
+<span class="sourceLineNo">2084</span><a name="line.2084"></a>
+<span class="sourceLineNo">2085</span>    get = new Get(row1);<a name="line.2085"></a>
+<span class="sourceLineNo">2086</span>    r = region.get(get);<a name="line.2086"></a>
+<span class="sourceLineNo">2087</span>    assertEquals(1, r.size());<a name="line.2087"></a>
+<span class="sourceLineNo">2088</span>    assertArrayEquals(val1, r.getValue(fam1, qf1));<a name="line.2088"></a>
+<span class="sourceLineNo">2089</span><a name="line.2089"></a>
+<span class="sourceLineNo">2090</span>    // Row delete<a name="line.2090"></a>
+<span class="sourceLineNo">2091</span>    delete = new Delete(row1);<a name="line.2091"></a>
+<span class="sourceLineNo">2092</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new BinaryComparator(val1),<a name="line.2092"></a>
+<span class="sourceLineNo">2093</span>        delete);<a name="line.2093"></a>
+<span class="sourceLineNo">2094</span>    assertEquals(true, res);<a name="line.2094"></a>
+<span class="sourceLineNo">2095</span>    get = new Get(row1);<a name="line.2095"></a>
+<span class="sourceLineNo">2096</span>    r = region.get(get);<a name="line.2096"></a>
+<span class="sourceLineNo">2097</span>    assertEquals(0, r.size());<a name="line.2097"></a>
+<span class="sourceLineNo">2098</span>  }<a name="line.2098"></a>
+<span class="sourceLineNo">2099</span><a name="line.2099"></a>
+<span class="sourceLineNo">2100</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2100"></a>
+<span class="sourceLineNo">2101</span>  // Delete tests<a name="line.2101"></a>
+<span class="sourceLineNo">2102</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2102"></a>
+<span class="sourceLineNo">2103</span>  @Test<a name="line.2103"></a>
+<span class="sourceLineNo">2104</span>  public void testDelete_multiDeleteColumn() throws IOException {<a name="line.2104"></a>
+<span class="sourceLineNo">2105</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2105"></a>
+<span class="sourceLineNo">2106</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2106"></a>
+<span class="sourceLineNo">2107</span>    byte[] qual = Bytes.toBytes("qualifier");<a name="line.2107"></a>
+<span class="sourceLineNo">2108</span>    byte[] value = Bytes.toBytes("value");<a name="line.2108"></a>
+<span class="sourceLineNo">2109</span><a name="line.2109"></a>
+<span class="sourceLineNo">2110</span>    Put put = new Put(row1);<a name="line.2110"></a>
+<span class="sourceLineNo">2111</span>    put.addColumn(fam1, qual, 1, value);<a name="line.2111"></a>
+<span class="sourceLineNo">2112</span>    put.addColumn(fam1, qual, 2, value);<a name="line.2112"></a>
+<span class="sourceLineNo">2113</span><a name="line.2113"></a>
+<span class="sourceLineNo">2114</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2114"></a>
+<span class="sourceLineNo">2115</span>    region.put(put);<a name="line.2115"></a>
+<span class="sourceLineNo">2116</span><a name="line.2116"></a>
+<span class="sourceLineNo">2117</span>    // We do support deleting more than 1 'latest' version<a name="line.2117"></a>
+<span class="sourceLineNo">2118</span>    Delete delete = new Delete(row1);<a name="line.2118"></a>
 <span class="sourceLineNo">2119</span>    delete.addColumn(fam1, qual);<a name="line.2119"></a>
-<span class="sourceLineNo">2120</span>    region.delete(delete);<a name="line.2120"></a>
-<span class="sourceLineNo">2121</span><a name="line.2121"></a>
-<span class="sourceLineNo">2122</span>    Get get = new Get(row1);<a name="line.2122"></a>
-<span class="sourceLineNo">2123</span>    get.addFamily(fam1);<a name="line.2123"></a>
-<span class="sourceLineNo">2124</span>    Result r = region.get(get);<a name="line.2124"></a>
-<span class="sourceLineNo">2125</span>    assertEquals(0, r.size());<a name="line.2125"></a>
-<span class="sourceLineNo">2126</span>  }<a name="line.2126"></a>
-<span class="sourceLineNo">2127</span><a name="line.2127"></a>
-<span class="sourceLineNo">2128</span>  @Test<a name="line.2128"></a>
-<span class="sourceLineNo">2129</span>  public void testDelete_CheckFamily() throws IOException {<a name="line.2129"></a>
-<span class="sourceLineNo">2130</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2130"></a>
-<span class="sourceLineNo">2131</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2131"></a>
-<span class="sourceLineNo">2132</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2132"></a>
-<span class="sourceLineNo">2133</span>    byte[] fam3 = Bytes.toBytes("fam3");<a name="line.2133"></a>
-<span class="sourceLineNo">2134</span>    byte[] fam4 = Bytes.toBytes("fam4");<a name="line.2134"></a>
-<span class="sourceLineNo">2135</span><a name="line.2135"></a>
-<span class="sourceLineNo">2136</span>    // Setting up region<a name="line.2136"></a>
-<span class="sourceLineNo">2137</span>    this.region = initHRegion(tableName, method, CONF, fam1, fam2, fam3);<a name="line.2137"></a>
-<span class="sourceLineNo">2138</span>    List&lt;Cell&gt; kvs = new ArrayList&lt;&gt;();<a name="line.2138"></a>
-<span class="sourceLineNo">2139</span>    kvs.add(new KeyValue(row1, fam4, null, null));<a name="line.2139"></a>
-<span class="sourceLineNo">2140</span><a name="line.2140"></a>
-<span class="sourceLineNo">2141</span>    // testing existing family<a name="line.2141"></a>
-<span class="sourceLineNo">2142</span>    byte[] family = fam2;<a name="line.2142"></a>
-<span class="sourceLineNo">2143</span>    NavigableMap&lt;byte[], List&lt;Cell&gt;&gt; deleteMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2143"></a>
-<span class="sourceLineNo">2144</span>    deleteMap.put(family, kvs);<a name="line.2144"></a>
-<span class="sourceLineNo">2145</span>    region.delete(deleteMap, Durability.SYNC_WAL);<a name="line.2145"></a>
-<span class="sourceLineNo">2146</span><a name="line.2146"></a>
-<span class="sourceLineNo">2147</span>    // testing non existing family<a name="line.2147"></a>
-<span class="sourceLineNo">2148</span>    boolean ok = false;<a name="line.2148"></a>
-<span class="sourceLineNo">2149</span>    family = fam4;<a name="line.2149"></a>
-<span class="sourceLineNo">2150</span>    try {<a name="line.2150"></a>
-<span class="sourceLineNo">2151</span>      deleteMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2151"></a>
-<span class="sourceLineNo">2152</span>      deleteMap.put(family, kvs);<a name="line.2152"></a>
-<span class="sourceLineNo">2153</span>      region.delete(deleteMap, Durability.SYNC_WAL);<a name="line.2153"></a>
-<span class="sourceLineNo">2154</span>    } catch (Exception e) {<a name="line.2154"></a>
-<span class="sourceLineNo">2155</span>      ok = true;<a name="line.2155"></a>
-<span class="sourceLineNo">2156</span>    }<a name="line.2156"></a>
-<span class="sourceLineNo">2157</span>    assertTrue("Family " + new String(family, StandardCharsets.UTF_8) + " does exist", ok);<a name="line.2157"></a>
-<span class="sourceLineNo">2158</span>  }<a name="line.2158"></a>
-<span class="sourceLineNo">2159</span><a name="line.2159"></a>
-<span class="sourceLineNo">2160</span>  @Test<a name="line.2160"></a>
-<span class="sourceLineNo">2161</span>  public void testDelete_mixed() throws IOException, InterruptedException {<a name="line.2161"></a>
-<span class="sourceLineNo">2162</span>    byte[] fam = Bytes.toBytes("info");<a name="line.2162"></a>
-<span class="sourceLineNo">2163</span>    byte[][] families = { fam };<a name="line.2163"></a>
-<span class="sourceLineNo">2164</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2164"></a>
-<span class="sourceLineNo">2165</span>    EnvironmentEdgeManagerTestHelper.injectEdge(new IncrementingEnvironmentEdge());<a name="line.2165"></a>
-<span class="sourceLineNo">2166</span><a name="line.2166"></a>
-<span class="sourceLineNo">2167</span>    byte[] row = Bytes.toBytes("table_name");<a name="line.2167"></a>
-<span class="sourceLineNo">2168</span>    // column names<a name="line.2168"></a>
-<span class="sourceLineNo">2169</span>    byte[] serverinfo = Bytes.toBytes("serverinfo");<a name="line.2169"></a>
-<span class="sourceLineNo">2170</span>    byte[] splitA = Bytes.toBytes("splitA");<a name="line.2170"></a>
-<span class="sourceLineNo">2171</span>    byte[] splitB = Bytes.toBytes("splitB");<a name="line.2171"></a>
-<span class="sourceLineNo">2172</span><a name="line.2172"></a>
-<span class="sourceLineNo">2173</span>    // add some data:<a name="line.2173"></a>
-<span class="sourceLineNo">2174</span>    Put put = new Put(row);<a name="line.2174"></a>
-<span class="sourceLineNo">2175</span>    put.addColumn(fam, splitA, Bytes.toBytes("reference_A"));<a name="line.2175"></a>
-<span class="sourceLineNo">2176</span>    region.put(put);<a name="line.2176"></a>
-<span class="sourceLineNo">2177</span><a name="line.2177"></a>
-<span class="sourceLineNo">2178</span>    put = new Put(row);<a name="line.2178"></a>
-<span class="sourceLineNo">2179</span>    put.addColumn(fam, splitB, Bytes.toBytes("reference_B"));<a name="line.2179"></a>
-<span class="sourceLineNo">2180</span>    region.put(put);<a name="line.2180"></a>
-<span class="sourceLineNo">2181</span><a name="line.2181"></a>
-<span class="sourceLineNo">2182</span>    put = new Put(row);<a name="line.2182"></a>
-<span class="sourceLineNo">2183</span>    put.addColumn(fam, serverinfo, Bytes.toBytes("ip_address"));<a name="line.2183"></a>
-<span class="sourceLineNo">2184</span>    region.put(put);<a name="line.2184"></a>
-<span class="sourceLineNo">2185</span><a name="line.2185"></a>
-<span class="sourceLineNo">2186</span>    // ok now delete a split:<a name="line.2186"></a>
-<span class="sourceLineNo">2187</span>    Delete delete = new Delete(row);<a name="line.2187"></a>
-<span class="sourceLineNo">2188</span>    delete.addColumns(fam, splitA);<a name="line.2188"></a>
-<span class="sourceLineNo">2189</span>    region.delete(delete);<a name="line.2189"></a>
-<span class="sourceLineNo">2190</span><a name="line.2190"></a>
-<span class="sourceLineNo">2191</span>    // assert some things:<a name="line.2191"></a>
-<span class="sourceLineNo">2192</span>    Get get = new Get(row).addColumn(fam, serverinfo);<a name="line.2192"></a>
-<span class="sourceLineNo">2193</span>    Result result = region.get(get);<a name="line.2193"></a>
-<span class="sourceLineNo">2194</span>    assertEquals(1, result.size());<a name="line.2194"></a>
-<span class="sourceLineNo">2195</span><a name="line.2195"></a>
-<span class="sourceLineNo">2196</span>    get = new Get(row).addColumn(fam, splitA);<a name="line.2196"></a>
-<span class="sourceLineNo">2197</span>    result = region.get(get);<a name="line.2197"></a>
-<span class="sourceLineNo">2198</span>    assertEquals(0, result.size());<a name="line.2198"></a>
-<span class="sourceLineNo">2199</span><a name="line.2199"></a>
-<span class="sourceLineNo">2200</span>    get = new Get(row).addColumn(fam, splitB);<a name="line.2200"></a>
-<span class="sourceLineNo">2201</span>    result = region.get(get);<a name="line.2201"></a>
-<span class="sourceLineNo">2202</span>    assertEquals(1, result.size());<a name="line.2202"></a>
-<span class="sourceLineNo">2203</span><a name="line.2203"></a>
-<span class="sourceLineNo">2204</span>    // Assert that after a delete, I can put.<a name="line.2204"></a>
-<span class="sourceLineNo">2205</span>    put = new Put(row);<a name="line.2205"></a>
-<span class="sourceLineNo">2206</span>    put.addColumn(fam, splitA, Bytes.toBytes("reference_A"));<a name="line.2206"></a>
-<span class="sourceLineNo">2207</span>    region.put(put);<a name="line.2207"></a>
-<span class="sourceLineNo">2208</span>    get = new Get(row);<a name="line.2208"></a>
-<span class="sourceLineNo">2209</span>    result = region.get(get);<a name="line.2209"></a>
-<span class="sourceLineNo">2210</span>    assertEquals(3, result.size());<a name="line.2210"></a>
-<span class="sourceLineNo">2211</span><a name="line.2211"></a>
-<span class="sourceLineNo">2212</span>    // Now delete all... then test I can add stuff back<a name="line.2212"></a>
-<span class="sourceLineNo">2213</span>    delete = new Delete(row);<a name="line.2213"></a>
-<span class="sourceLineNo">2214</span>    region.delete(delete);<a name="line.2214"></a>
-<span class="sourceLineNo">2215</span>    assertEquals(0, region.get(get).size());<a name="line.2215"></a>
-<span class="sourceLineNo">2216</span><a name="line.2216"></a>
-<span class="sourceLineNo">2217</span>    region.put(new Put(row).addColumn(fam, splitA, Bytes.toBytes("reference_A")));<a name="line.2217"></a>
-<span class="sourceLineNo">2218</span>    result = region.get(get);<a name="line.2218"></a>
-<span class="sourceLineNo">2219</span>    assertEquals(1, result.size());<a name="line.2219"></a>
-<span class="sourceLineNo">2220</span>  }<a name="line.2220"></a>
-<span class="sourceLineNo">2221</span><a name="line.2221"></a>
-<span class="sourceLineNo">2222</span>  @Test<a name="line.2222"></a>
-<span class="sourceLineNo">2223</span>  public void testDeleteRowWithFutureTs() throws IOException {<a name="line.2223"></a>
-<span class="sourceLineNo">2224</span>    byte[] fam = Bytes.toBytes("info");<a name="line.2224"></a>
-<span class="sourceLineNo">2225</span>    byte[][] families = { fam };<a name="line.2225"></a>
-<span class="sourceLineNo">2226</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2226"></a>
-<span class="sourceLineNo">2227</span>    byte[] row = Bytes.toBytes("table_name");<a name="line.2227"></a>
-<span class="sourceLineNo">2228</span>    // column names<a name="line.2228"></a>
-<span class="sourceLineNo">2229</span>    byte[] serverinfo = Bytes.toBytes("serverinfo");<a name="line.2229"></a>
-<span class="sourceLineNo">2230</span><a name="line.2230"></a>
-<span class="sourceLineNo">2231</span>    // add data in the far future<a name="line.2231"></a>
-<span class="sourceLineNo">2232</span>    Put put = new Put(row);<a name="line.2232"></a>
-<span class="sourceLineNo">2233</span>    put.addColumn(fam, serverinfo, HConstants.LATEST_TIMESTAMP - 5, Bytes.toBytes("value"));<a name="line.2233"></a>
-<span class="sourceLineNo">2234</span>    region.put(put);<a name="line.2234"></a>
-<span class="sourceLineNo">2235</span><a name="line.2235"></a>
-<span class="sourceLineNo">2236</span>    // now delete something in the present<a name="line.2236"></a>
-<span class="sourceLineNo">2237</span>    Delete delete = new Delete(row);<a name="line.2237"></a>
-<span class="sourceLineNo">2238</span>    region.delete(delete);<a name="line.2238"></a>
-<span class="sourceLineNo">2239</span><a name="line.2239"></a>
-<span class="sourceLineNo">2240</span>    // make sure we still see our data<a name="line.2240"></a>
-<span class="sourceLineNo">2241</span>    Get get = new Get(row).addColumn(fam, serverinfo);<a name="line.2241"></a>
-<span class="sourceLineNo">2242</span>    Result result = region.get(get);<a name="line.2242"></a>
-<span class="sourceLineNo">2243</span>    assertEquals(1, result.size());<a name="line.2243"></a>
-<span class="sourceLineNo">2244</span><a name="line.2244"></a>
-<span class="sourceLineNo">2245</span>    // delete the future row<a name="line.2245"></a>
-<span class="sourceLineNo">2246</span>    delete = new Delete(row, HConstants.LATEST_TIMESTAMP - 3);<a name="line.2246"></a>
-<span class="sourceLineNo">2247</span>    region.delete(delete);<a name="line.2247"></a>
-<span class="sourceLineNo">2248</span><a name="line.2248"></a>
-<span class="sourceLineNo">2249</span>    // make sure it is gone<a name="line.2249"></a>
-<span class="sourceLineNo">2250</span>    get = new Get(row).addColumn(fam, serverinfo);<a name="line.2250"></a>
-<span class="sourceLineNo">2251</span>    result = region.get(get);<a name="line.2251"></a>
-<span class="sourceLineNo">2252</span>    assertEquals(0, result.size());<a name="line.2252"></a>
-<span class="sourceLineNo">2253</span>  }<a name="line.2253"></a>
-<span class="sourceLineNo">2254</span><a name="line.2254"></a>
-<span class="sourceLineNo">2255</span>  /**<a name="line.2255"></a>
-<span class="sourceLineNo">2256</span>   * Tests that the special LATEST_TIMESTAMP option for puts gets replaced by<a name="line.2256"></a>
-<span class="sourceLineNo">2257</span>   * the actual timestamp<a name="line.2257"></a>
-<span class="sourceLineNo">2258</span>   */<a name="line.2258"></a>
-<span class="sourceLineNo">2259</span>  @Test<a name="line.2259"></a>
-<span class="sourceLineNo">2260</span>  public void testPutWithLatestTS() throws IOException {<a name="line.2260"></a>
-<span class="sourceLineNo">2261</span>    byte[] fam = Bytes.toBytes("info");<a name="line.2261"></a>
-<span class="sourceLineNo">2262</span>    byte[][] families = { fam };<a name="line.2262"></a>
-<span class="sourceLineNo">2263</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2263"></a>
-<span class="sourceLineNo">2264</span>    byte[] row = Bytes.toBytes("row1");<a name="line.2264"></a>
-<span class="sourceLineNo">2265</span>    // column names<a name="line.2265"></a>
-<span class="sourceLineNo">2266</span>    byte[] qual = Bytes.toBytes("qual");<a name="line.2266"></a>
-<span class="sourceLineNo">2267</span><a name="line.2267"></a>
-<span class="sourceLineNo">2268</span>    // add data with LATEST_TIMESTAMP, put without WAL<a name="line.2268"></a>
-<span class="sourceLineNo">2269</span>    Put put = new Put(row);<a name="line.2269"></a>
-<span class="sourceLineNo">2270</span>    put.addColumn(fam, qual, HConstants.LATEST_TIMESTAMP, Bytes.toBytes("value"));<a name="line.2270"></a>
-<span class="sourceLineNo">2271</span>    region.put(put);<a name="line.2271"></a>
-<span class="sourceLineNo">2272</span><a name="line.2272"></a>
-<span class="sourceLineNo">2273</span>    // Make sure it shows up with an actual timestamp<a name="line.2273"></a>
-<span class="sourceLineNo">2274</span>    Get get = new Get(row).addColumn(fam, qual);<a name="line.2274"></a>
-<span class="sourceLineNo">2275</span>    Result result = region.get(get);<a name="line.2275"></a>
-<span class="sourceLineNo">2276</span>    assertEquals(1, result.size());<a name="line.2276"></a>
-<span class="sourceLineNo">2277</span>    Cell kv = result.rawCells()[0];<a name="line.2277"></a>
-<span class="sourceLineNo">2278</span>    LOG.info("Got: " + kv);<a name="line.2278"></a>
-<span class="sourceLineNo">2279</span>    assertTrue("LATEST_TIMESTAMP was not replaced with real timestamp",<a name="line.2279"></a>
-<span class="sourceLineNo">2280</span>        kv.getTimestamp() != HConstants.LATEST_TIMESTAMP);<a name="line.2280"></a>
-<span class="sourceLineNo">2281</span><a name="line.2281"></a>
-<span class="sourceLineNo">2282</span>    // Check same with WAL enabled (historically these took different<a name="line.2282"></a>
-<span class="sourceLineNo">2283</span>    // code paths, so check both)<a name="line.2283"></a>
-<span class="sourceLineNo">2284</span>    row = Bytes.toBytes("row2");<a name="line.2284"></a>
-<span class="sourceLineNo">2285</span>    put = new Put(row);<a name="line.2285"></a>
-<span class="sourceLineNo">2286</span>    put.addColumn(fam, qual, HConstants.LATEST_TIMESTAMP, Bytes.toBytes("value"));<a name="line.2286"></a>
-<span class="sourceLineNo">2287</span>    region.put(put);<a name="line.2287"></a>
-<span class="sourceLineNo">2288</span><a name="line.2288"></a>
-<span class="sourceLineNo">2289</span>    // Make sure it shows up with an actual timestamp<a name="line.2289"></a>
-<span class="sourceLineNo">2290</span>    get = new Get(row).addColumn(fam, qual);<a name="line.2290"></a>
-<span class="sourceLineNo">2291</span>    result = region.get(get);<a name="line.2291"></a>
-<span class="sourceLineNo">2292</span>    assertEquals(1, result.size());<a name="line.2292"></a>
-<span class="sourceLineNo">2293</span>    kv = result.rawCells()[0];<a name="line.2293"></a>
-<span class="sourceLineNo">2294</span>    LOG.info("Got: " + kv);<a name="line.2294"></a>
-<span class="sourceLineNo">2295</span>    assertTrue("LATEST_TIMESTAMP was not replaced with real timestamp",<a name="line.2295"></a>
-<span class="sourceLineNo">2296</span>        kv.getTimestamp() != HConstants.LATEST_TIMESTAMP);<a name="line.2296"></a>
-<span class="sourceLineNo">2297</span>  }<a name="line.2297"></a>
-<span class="sourceLineNo">2298</span><a name="line.2298"></a>
-<span class="sourceLineNo">2299</span>  /**<a name="line.2299"></a>
-<span class="sourceLineNo">2300</span>   * Tests that there is server-side filtering for invalid timestamp upper<a name="line.2300"></a>
-<span class="sourceLineNo">2301</span>   * bound. Note that the timestamp lower bound is automatically handled for us<a name="line.2301"></a>
-<span class="sourceLineNo">2302</span>   * by the TTL field.<a name="line.2302"></a>
-<span class="sourceLineNo">2303</span>   */<a name="line.2303"></a>
-<span class="sourceLineNo">2304</span>  @Test<a name="line.2304"></a>
-<span class="sourceLineNo">2305</span>  public void testPutWithTsSlop() throws IOException {<a name="line.2305"></a>
-<span class="sourceLineNo">2306</span>    byte[] fam = Bytes.toBytes("info");<a name="line.2306"></a>
-<span class="sourceLineNo">2307</span>    byte[][] families = { fam };<a name="line.2307"></a>
-<span class="sourceLineNo">2308</span><a name="line.2308"></a>
-<span class="sourceLineNo">2309</span>    // add data with a timestamp that is too recent for range. Ensure assert<a name="line.2309"></a>
-<span class="sourceLineNo">2310</span>    CONF.setInt("hbase.hregion.keyvalue.timestamp.slop.millisecs", 1000);<a name="line.2310"></a>
-<span class="sourceLineNo">2311</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2311"></a>
-<span class="sourceLineNo">2312</span>    boolean caughtExcep = false;<a name="line.2312"></a>
-<span class="sourceLineNo">2313</span>    try {<a name="line.2313"></a>
-<span class="sourceLineNo">2314</span>      // no TS specified == use latest. should not error<a name="line.2314"></a>
-<span class="sourceLineNo">2315</span>      region.put(new Put(row).addColumn(fam, Bytes.toBytes("qual"), Bytes.toBytes("value")));<a name="line.2315"></a>
-<span class="sourceLineNo">2316</span>      // TS out of range. should error<a name="line.2316"></a>
-<span class="sourceLineNo">2317</span>      region.put(new Put(row).addColumn(fam, Bytes.toBytes("qual"),<a name="line.2317"></a>
-<span class="sourceLineNo">2318</span>          System.currentTimeMillis() + 2000, Bytes.toBytes("value")));<a name="line.2318"></a>
-<span class="sourceLineNo">2319</span>      fail("Expected IOE for TS out of configured timerange");<a name="line.2319"></a>
-<span class="sourceLineNo">2320</span>    } catch (FailedSanityCheckException ioe) {<a name="line.2320"></a>
-<span class="sourceLineNo">2321</span>      LOG.debug("Received expected exception", ioe);<a name="line.2321"></a>
-<span class="sourceLineNo">2322</span>      caughtExcep = true;<a name="line.2322"></a>
-<span class="sourceLineNo">2323</span>    }<a name="line.2323"></a>
-<span class="sourceLineNo">2324</span>    assertTrue("Should catch FailedSanityCheckException", caughtExcep);<a name="line.2324"></a>
-<span class="sourceLineNo">2325</span>  }<a name="line.2325"></a>
-<span class="sourceLineNo">2326</span><a name="line.2326"></a>
-<span class="sourceLineNo">2327</span>  @Test<a name="line.2327"></a>
-<span class="sourceLineNo">2328</span>  public void testScanner_DeleteOneFamilyNotAnother() throws IOException {<a name="line.2328"></a>
-<span class="sourceLineNo">2329</span>    byte[] fam1 = Bytes.toBytes("columnA");<a name="line.2329"></a>
-<span class="sourceLineNo">2330</span>    byte[] fam2 = Bytes.toBytes("columnB");<a name="line.2330"></a>
-<span class="sourceLineNo">2331</span>    this.region = initHRegion(tableName, method, CONF, fam1, fam2);<a name="line.2331"></a>
-<span class="sourceLineNo">2332</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.2332"></a>
-<span class="sourceLineNo">2333</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.2333"></a>
-<span class="sourceLineNo">2334</span><a name="line.2334"></a>
-<span class="sourceLineNo">2335</span>    byte[] value = Bytes.toBytes("value");<a name="line.2335"></a>
-<span class="sourceLineNo">2336</span><a name="line.2336"></a>
-<span class="sourceLineNo">2337</span>    Delete delete = new Delete(rowA);<a name="line.2337"></a>
-<span class="sourceLineNo">2338</span>    delete.addFamily(fam1);<a name="line.2338"></a>
-<span class="sourceLineNo">2339</span><a name="line.2339"></a>
-<span class="sourceLineNo">2340</span>    region.delete(delete);<a name="line.2340"></a>
-<span class="sourceLineNo">2341</span><a name="line.2341"></a>
-<span class="sourceLineNo">2342</span>    // now create data.<a name="line.2342"></a>
-<span class="sourceLineNo">2343</span>    Put put = new Put(rowA);<a name="line.2343"></a>
-<span class="sourceLineNo">2344</span>    put.addColumn(fam2, null, value);<a name="line.2344"></a>
-<span class="sourceLineNo">2345</span>    region.put(put);<a name="line.2345"></a>
-<span class="sourceLineNo">2346</span><a name="line.2346"></a>
-<span class="sourceLineNo">2347</span>    put = new Put(rowB);<a name="line.2347"></a>
-<span class="sourceLineNo">2348</span>    put.addColumn(fam1, null, value);<a name="line.2348"></a>
-<span class="sourceLineNo">2349</span>    put.addColumn(fam2, null, value);<a name="line.2349"></a>
-<span class="sourceLineNo">2350</span>    region.put(put);<a name="line.2350"></a>
-<span class="sourceLineNo">2351</span><a name="line.2351"></a>
-<span class="sourceLineNo">2352</span>    Scan scan = new Scan();<a name="line.2352"></a>
-<span class="sourceLineNo">2353</span>    scan.addFamily(fam1).addFamily(fam2);<a name="line.2353"></a>
-<span class="sourceLineNo">2354</span>    InternalScanner s = region.getScanner(scan);<a name="line.2354"></a>
-<span class="sourceLineNo">2355</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.2355"></a>
-<span class="sourceLineNo">2356</span>    s.next(results);<a name="line.2356"></a>
-<span class="sourceLineNo">2357</span>    assertTrue(CellUtil.matchingRows(results.get(0), rowA));<a name="line.2357"></a>
-<span class="sourceLineNo">2358</span><a name="line.2358"></a>
-<span class="sourceLineNo">2359</span>    results.clear();<a name="line.2359"></a>
-<span class="sourceLineNo">2360</span>    s.next(results);<a name="line.2360"></a>
-<span class="sourceLineNo">2361</span>    assertTrue(CellUtil.matchingRows(results.get(0), rowB));<a name="line.2361"></a>
-<span class="sourceLineNo">2362</span>  }<a name="line.2362"></a>
-<span class="sourceLineNo">2363</span><a name="line.2363"></a>
-<span class="sourceLineNo">2364</span>  @Test<a name="line.2364"></a>
-<span class="sourceLineNo">2365</span>  public void testDataInMemoryWithoutWAL() throws IOException {<a name="line.2365"></a>
-<span class="sourceLineNo">2366</span>    FileSystem fs = FileSystem.get(CONF);<a name="line.2366"></a>
-<span class="sourceLineNo">2367</span>    Path rootDir = new Path(dir + "testDataInMemoryWithoutWAL");<a name="line.2367"></a>
-<span class="sourceLineNo">2368</span>    FSHLog hLog = new FSHLog(fs, rootDir, "testDataInMemoryWithoutWAL", CONF);<a name="line.2368"></a>
-<span class="sourceLineNo">2369</span>    hLog.init();<a name="line.2369"></a>
-<span class="sourceLineNo">2370</span>    // This chunk creation is done throughout the code base. Do we want to move it into core?<a name="line.2370"></a>
-<span class="sourceLineNo">2371</span>    // It is missing from this test. W/o it we NPE.<a name="line.2371"></a>
-<span class="sourceLineNo">2372</span>    ChunkCreator.initialize(MemStoreLABImpl.CHUNK_SIZE_DEFAULT, false, 0, 0, 0, null);<a name="line.2372"></a>
-<span class="sourceLineNo">2373</span>    region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, hLog,<a name="line.2373"></a>
-<span class="sourceLineNo">2374</span>        COLUMN_FAMILY_BYTES);<a name="line.2374"></a>
-<span class="sourceLineNo">2375</span><a name="line.2375"></a>
-<span class="sourceLineNo">2376</span>    Cell originalCell = CellUtil.createCell(row, COLUMN_FAMILY_BYTES, qual1,<a name="line.2376"></a>
-<span class="sourceLineNo">2377</span>      System.currentTimeMillis(), KeyValue.Type.Put.getCode(), value1);<a name="line.2377"></a>
-<span class="sourceLineNo">2378</span>    final long originalSize = originalCell.getSerializedSize();<a name="line.2378"></a>
-<span class="sourceLineNo">2379</span><a name="line.2379"></a>
-<span class="sourceLineNo">2380</span>    Cell addCell = CellUtil.createCell(row, COLUMN_FAMILY_BYTES, qual1,<a name="line.2380"></a>
-<span class="sourceLineNo">2381</span>      System.currentTimeMillis(), KeyValue.Type.Put.getCode(), Bytes.toBytes("xxxxxxxxxx"));<a name="line.2381"></a>
-<span class="sourceLineNo">2382</span>    final long addSize = addCell.getSerializedSize();<a name="line.2382"></a>
-<span class="sourceLineNo">2383</span><a name="line.2383"></a>
-<span class="sourceLineNo">2384</span>    LOG.info("originalSize:" + originalSize<a name="line.2384"></a>
-<span class="sourceLineNo">2385</span>      + ", addSize:" + addSize);<a name="line.2385"></a>
-<span class="sourceLineNo">2386</span>    // start test. We expect that the addPut's durability will be replaced<a name="line.2386"></a>
-<span class="sourceLineNo">2387</span>    // by originalPut's durability.<a name="line.2387"></a>
-<span class="sourceLineNo">2388</span><a name="line.2388"></a>
-<span class="sourceLineNo">2389</span>    // case 1:<a name="line.2389"></a>
-<span class="sourceLineNo">2390</span>    testDataInMemoryWithoutWAL(region,<a name="line.2390"></a>
-<span class="sourceLineNo">2391</span>            new Put(row).add(originalCell).setDurability(Durability.SKIP_WAL),<a name="line.2391"></a>
-<span class="sourceLineNo">2392</span>            new Put(row).add(addCell).setDurability(Durability.SKIP_WAL),<a name="line.2392"></a>
-<span class="sourceLineNo">2393</span>            originalSize + addSize);<a name="line.2393"></a>
-<span class="sourceLineNo">2394</span><a name="line.2394"></a>
-<span class="sourceLineNo">2395</span>    // case 2:<a name="line.2395"></a>
-<span class="sourceLineNo">2396</span>    testDataInMemoryWithoutWAL(region,<a name="line.2396"></a>
-<span class="sourceLineNo">2397</span>            new Put(row).add(originalCell).setDurability(Durability.SKIP_WAL),<a name="line.2397"></a>
-<span class="sourceLineNo">2398</span>            new Put(row).add(addCell).setDurability(Durability.SYNC_WAL),<a name="line.2398"></a>
-<span class="sourceLineNo">2399</span>            originalSize + addSize);<a name="line.2399"></a>
-<span class="sourceLineNo">2400</span><a name="line.2400"></a>
-<span class="sourceLineNo">2401</span>    // case 3:<a name="line.2401"></a>
-<span class="sourceLineNo">2402</span>    testDataInMemoryWithoutWAL(region,<a name="line.2402"></a>
-<span class="sourceLineNo">2403</span>            new Put(row).add(originalCell).setDurability(Durability.SYNC_WAL),<a name="line.2403"></a>
-<span class="sourceLineNo">2404</span>            new Put(row).add(addCell).setDurability(Durability.SKIP_WAL),<a name="line.2404"></a>
-<span class="sourceLineNo">2405</span>            0);<a name="line.2405"></a>
-<span class="sourceLineNo">2406</span><a name="line.2406"></a>
-<span class="sourceLineNo">2407</span>    // case 4:<a name="line.2407"></a>
-<span class="sourceLineNo">2408</span>    testDataInMemoryWithoutWAL(region,<a name="line.2408"></a>
-<span class="sourceLineNo">2409</span>            new Put(row).add(originalCell).setDurability(Durability.SYNC_WAL),<a name="line.2409"></a>
-<span class="sourceLineNo">2410</span>            new Put(row).add(addCell).setDurability(Durability.SYNC_WAL),<a name="line.2410"></a>
-<span class="sourceLineNo">2411</span>            0);<a name="line.2411"></a>
-<span class="sourceLineNo">2412</span>  }<a name="line.2412"></a>
-<span class="sourceLineNo">2413</span><a name="line.2413"></a>
-<span class="sourceLineNo">2414</span>  private static void testDataInMemoryWithoutWAL(HRegion region, Put originalPut,<a name="line.2414"></a>
-<span class="sourceLineNo">2415</span>          final Put addPut, long delta) throws IOException {<a name="line.2415"></a>
-<span class="sourceLineNo">2416</span>    final long initSize = region.getDataInMemoryWithoutWAL();<a name="line.2416"></a>
-<span class="sourceLineNo">2417</span>    // save normalCPHost and replaced by mockedCPHost<a name="line.2417"></a>
-<span class="sourceLineNo">2418</span>    RegionCoprocessorHost normalCPHost = region.getCoprocessorHost();<a name="line.2418"></a>
-<span class="sourceLineNo">2419</span>    RegionCoprocessorHost mockedCPHost = Mockito.mock(RegionCoprocessorHost.class);<a name="line.2419"></a>
-<span class="sourceLineNo">2420</span>    // Because the preBatchMutate returns void, we can't do usual Mockito when...then form. Must<a name="line.2420"></a>
-<span class="sourceLineNo">2421</span>    // do below format (from Mockito doc).<a name="line.2421"></a>
-<span class="sourceLineNo">2422</span>    Mockito.doAnswer(new Answer&lt;Void&gt;() {<a name="line.2422"></a>
-<span class="sourceLineNo">2423</span>      @Override<a name="line.2423"></a>
-<span class="sourceLineNo">2424</span>      public Void answer(InvocationOnMock invocation) throws Throwable {<a name="line.2424"></a>
-<span class="sourceLineNo">2425</span>        MiniBatchOperationInProgress&lt;Mutation&gt; mb = invocation.getArgument(0);<a name="line.2425"></a>
-<span class="sourceLineNo">2426</span>        mb.addOperationsFromCP(0, new Mutation[]{addPut});<a name="line.2426"></a>
-<span class="sourceLineNo">2427</span>        return null;<a name="line.2427"></a>
-<span class="sourceLineNo">2428</span>      }<a name="line.2428"></a>
-<span class="sourceLineNo">2429</span>    }).when(mockedCPHost).preBatchMutate(Mockito.isA(MiniBatchOperationInProgress.class));<a name="line.2429"></a>
-<span class="sourceLineNo">2430</span>    region.setCoprocessorHost(mockedCPHost);<a name="line.2430"></a>
-<span class="sourceLineNo">2431</span>    region.put(originalPut);<a name="line.2431"></a>
-<span class="sourceLineNo">2432</span>    region.setCoprocessorHost(normalCPHost);<a name="line.2432"></a>
-<span class="sourceLineNo">2433</span>    final long finalSize = region.getDataInMemoryWithoutWAL();<a name="line.2433"></a>
-<span class="sourceLineNo">2434</span>    assertEquals("finalSize:" + finalSize + ", initSize:"<a name="line.2434"></a>
-<span class="sourceLineNo">2435</span>      + initSize + ", delta:" + delta,finalSize, initSize + delta);<a name="line.2435"></a>
-<span class="sourceLineNo">2436</span>  }<a name="line.2436"></a>
-<span class="sourceLineNo">2437</span><a name="line.2437"></a>
-<span class="sourceLineNo">2438</span>  @Test<a name="line.2438"></a>
-<span class="sourceLineNo">2439</span>  public void testDeleteColumns_PostInsert() throws IOException, InterruptedException {<a name="line.2439"></a>
-<span class="sourceLineNo">2440</span>    Delete delete = new Delete(row);<a name="line.2440"></a>
-<span class="sourceLineNo">2441</span>    delete.addColumns(fam1, qual1);<a name="line.2441"></a>
-<span class="sourceLineNo">2442</span>    doTestDelete_AndPostInsert(delete);<a name="line.2442"></a>
-<span class="sourceLineNo">2443</span>  }<a name="line.2443"></a>
-<span class="sourceLineNo">2444</span><a name="line.2444"></a>
-<span class="sourceLineNo">2445</span>  @Test<a name="line.2445"></a>
-<span class="sourceLineNo">2446</span>  public void testaddFamily_PostInsert() throws IOException, InterruptedException {<a name="line.2446"></a>
-<span class="sourceLineNo">2447</span>    Delete delete = new Delete(row);<a name="line.2447"></a>
-<span class="sourceLineNo">2448</span>    delete.addFamily(fam1);<a name="line.2448"></a>
-<span class="sourceLineNo">2449</span>    doTestDelete_AndPostInsert(delete);<a name="line.2449"></a>
-<span class="sourceLineNo">2450</span>  }<a name="line.2450"></a>
-<span class="sourceLineNo">2451</span><a name="line.2451"></a>
-<span class="sourceLineNo">2452</span>  public void doTestDelete_AndPostInsert(Delete delete) throws IOException, InterruptedException {<a name="line.2452"></a>
-<span class="sourceLineNo">2453</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2453"></a>
-<span class="sourceLineNo">2454</span>    EnvironmentEdgeManagerTestHelper.injectEdge(new IncrementingEnvironmentEdge());<a name="line.2454"></a>
-<span class="sourceLineNo">2455</span>    Put put = new Put(row);<a name="line.2455"></a>
-<span class="sourceLineNo">2456</span>    put.addColumn(fam1, qual1, value1);<a name="line.2456"></a>
-<span class="sourceLineNo">2457</span>    region.put(put);<a name="line.2457"></a>
-<span class="sourceLineNo">2458</span><a name="line.2458"></a>
-<span class="sourceLineNo">2459</span>    // now delete the value:<a name="line.2459"></a>
-<span class="sourceLineNo">2460</span>    region.delete(delete);<a name="line.2460"></a>
+<span class="sourceLineNo">2120</span>    delete.addColumn(fam1, qual);<a name="line.2120"></a>
+<span class="sourceLineNo">2121</span>    region.delete(delete);<a name="line.2121"></a>
+<span class="sourceLineNo">2122</span><a name="line.2122"></a>
+<span class="sourceLineNo">2123</span>    Get get = new Get(row1);<a name="line.2123"></a>
+<span class="sourceLineNo">2124</span>    get.addFamily(fam1);<a name="line.2124"></a>
+<span class="sourceLineNo">2125</span>    Result r = region.get(get);<a name="line.2125"></a>
+<span class="sourceLineNo">2126</span>    assertEquals(0, r.size());<a name="line.2126"></a>
+<span class="sourceLineNo">2127</span>  }<a name="line.2127"></a>
+<span class="sourceLineNo">2128</span><a name="line.2128"></a>
+<span class="sourceLineNo">2129</span>  @Test<a name="line.2129"></a>
+<span class="sourceLineNo">2130</span>  public void testDelete_CheckFamily() throws IOException {<a name="line.2130"></a>
+<span class="sourceLineNo">2131</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2131"></a>
+<span class="sourceLineNo">2132</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2132"></a>
+<span class="sourceLineNo">2133</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2133"></a>
+<span class="sourceLineNo">2134</span>    byte[] fam3 = Bytes.toBytes("fam3");<a name="line.2134"></a>
+<span class="sourceLineNo">2135</span>    byte[] fam4 = Bytes.toBytes("fam4");<a name="line.2135"></a>
+<span class="sourceLineNo">2136</span><a name="line.2136"></a>
+<span class="sourceLineNo">2137</span>    // Setting up region<a name="line.2137"></a>
+<span class="sourceLineNo">2138</span>    this.region = initHRegion(tableName, method, CONF, fam1, fam2, fam3);<a name="line.2138"></a>
+<span class="sourceLineNo">2139</span>    List&lt;Cell&gt; kvs = new ArrayList&lt;&gt;();<a name="line.2139"></a>
+<span class="sourceLineNo">2140</span>    kvs.add(new KeyValue(row1, fam4, null, null));<a name="line.2140"></a>
+<span class="sourceLineNo">2141</span><a name="line.2141"></a>
+<span class="sourceLineNo">2142</span>    // testing existing family<a name="line.2142"></a>
+<span class="sourceLineNo">2143</span>    byte[] family = fam2;<a name="line.2143"></a>
+<span class="sourceLineNo">2144</span>    NavigableMap&lt;byte[], List&lt;Cell&gt;&gt; deleteMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2144"></a>
+<span class="sourceLineNo">2145</span>    deleteMap.put(family, kvs);<a name="line.2145"></a>
+<span class="sourceLineNo">2146</span>    region.delete(deleteMap, Durability.SYNC_WAL);<a name="line.2146"></a>
+<span class="sourceLineNo">2147</span><a name="line.2147"></a>
+<span class="sourceLineNo">2148</span>    // testing non existing family<a name="line.2148"></a>
+<span class="sourceLineNo">2149</span>    boolean ok = false;<a name="line.2149"></a>
+<span class="sourceLineNo">2150</span>    family = fam4;<a name="line.2150"></a>
+<span class="sourceLineNo">2151</span>    try {<a name="line.2151"></a>
+<span class="sourceLineNo">2152</span>      deleteMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2152"></a>
+<span class="sourceLineNo">2153</span>      deleteMap.put(family, kvs);<a name="line.2153"></a>
+<span class="sourceLineNo">2154</span>      region.delete(deleteMap, Durability.SYNC_WAL);<a name="line.2154"></a>
+<span class="sourceLineNo">2155</span>    } catch (Exception e) {<a name="line.2155"></a>
+<span class="sourceLineNo">2156</span>      ok = true;<a name="line.2156"></a>
+<span class="sourceLineNo">2157</span>    }<a name="line.2157"></a>
+<span class="sourceLineNo">2158</span>    assertTrue("Family " + new String(family, StandardCharsets.UTF_8) + " does exist", ok);<a name="line.2158"></a>
+<span class="sourceLineNo">2159</span>  }<a name="line.2159"></a>
+<span class="sourceLineNo">2160</span><a name="line.2160"></a>
+<span class="sourceLineNo">2161</span>  @Test<a name="line.2161"></a>
+<span class="sourceLineNo">2162</span>  public void testDelete_mixed() throws IOException, InterruptedException {<a name="line.2162"></a>
+<span class="sourceLineNo">2163</span>    byte[] fam = Bytes.toBytes("info");<a name="line.2163"></a>
+<span class="sourceLineNo">2164</span>    byte[][] families = { fam };<a name="line.2164"></a>
+<span class="sourceLineNo">2165</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2165"></a>
+<span class="sourceLineNo">2166</span>    EnvironmentEdgeManagerTestHelper.injectEdge(new IncrementingEnvironmentEdge());<a name="line.2166"></a>
+<span class="sourceLineNo">2167</span><a name="line.2167"></a>
+<span class="sourceLineNo">2168</span>    byte[] row = Bytes.toBytes("table_name");<a name="line.2168"></a>
+<span class="sourceLineNo">2169</span>    // column names<a name="line.2169"></a>
+<span class="sourceLineNo">2170</span>    byte[] serverinfo = Bytes.toBytes("serverinfo");<a name="line.2170"></a>
+<span class="sourceLineNo">2171</span>    byte[] splitA = Bytes.toBytes("splitA");<a name="line.2171"></a>
+<span class="sourceLineNo">2172</span>    byte[] splitB = Bytes.toBytes("splitB");<a name="line.2172"></a>
+<span class="sourceLineNo">2173</span><a name="line.2173"></a>
+<span class="sourceLineNo">2174</span>    // add some data:<a name="line.2174"></a>
+<span class="sourceLineNo">2175</span>    Put put = new Put(row);<a name="line.2175"></a>
+<span class="sourceLineNo">2176</span>    put.addColumn(fam, splitA, Bytes.toBytes("reference_A"));<a name="line.2176"></a>
+<span class="sourceLineNo">2177</span>    region.put(put);<a name="line.2177"></a>
+<span class="sourceLineNo">2178</span><a name="line.2178"></a>
+<span class="sourceLineNo">2179</span>    put = new Put(row);<a name="line.2179"></a>
+<span class="sourceLineNo">2180</span>    put.addColumn(fam, splitB, Bytes.toBytes("reference_B"));<a name="line.2180"></a>
+<span class="sourceLineNo">2181</span>    region.put(put);<a name="line.2181"></a>
+<span class="sourceLineNo">2182</span><a name="line.2182"></a>
+<span class="sourceLineNo">2183</span>    put = new Put(row);<a name="line.2183"></a>
+<span class="sourceLineNo">2184</span>    put.addColumn(fam, serverinfo, Bytes.toBytes("ip_address"));<a name="line.2184"></a>
+<span class="sourceLineNo">2185</span>    region.put(put);<a name="line.2185"></a>
+<span class="sourceLineNo">2186</span><a name="line.2186"></a>
+<span class="sourceLineNo">2187</span>    // ok now delete a split:<a name="line.2187"></a>
+<span class="sourceLineNo">2188</span>    Delete delete = new Delete(row);<a name="line.2188"></a>
+<span class="sourceLineNo">2189</span>    delete.addColumns(fam, splitA);<a name="line.2189"></a>
+<span class="sourceLineNo">2190</span>    region.delete(delete);<a name="line.2190"></a>
+<span class="sourceLineNo">2191</span><a name="line.2191"></a>
+<span class="sourceLineNo">2192</span>    // assert some things:<a name="line.2192"></a>
+<span class="sourceLineNo">2193</span>    Get get = new Get(row).addColumn(fam, serverinfo);<a name="line.2193"></a>
+<span class="sourceLineNo">2194</span>    Result result = region.get(get);<a name="line.2194"></a>
+<span class="sourceLineNo">2195</span>    assertEquals(1, result.size());<a name="line.2195"></a>
+<span class="sourceLineNo">2196</span><a name="line.2196"></a>
+<span class="sourceLineNo">2197</span>    get = new Get(row).addColumn(fam, splitA);<a name="line.2197"></a>
+<span class="sourceLineNo">2198</span>    result = region.get(get);<a name="line.2198"></a>
+<span class="sourceLineNo">2199</span>    assertEquals(0, result.size());<a name="line.2199"></a>
+<span class="sourceLineNo">2200</span><a name="line.2200"></a>
+<span class="sourceLineNo">2201</span>    get = new Get(row).addColumn(fam, splitB);<a name="line.2201"></a>
+<span class="sourceLineNo">2202</span>    result = region.get(get);<a name="line.2202"></a>
+<span class="sourceLineNo">2203</span>    assertEquals(1, result.size());<a name="line.2203"></a>
+<span class="sourceLineNo">2204</span><a name="line.2204"></a>
+<span class="sourceLineNo">2205</span>    // Assert that after a delete, I can put.<a name="line.2205"></a>
+<span class="sourceLineNo">2206</span>    put = new Put(row);<a name="line.2206"></a>
+<span class="sourceLineNo">2207</span>    put.addColumn(fam, splitA, Bytes.toBytes("reference_A"));<a name="line.2207"></a>
+<span class="sourceLineNo">2208</span>    region.put(put);<a name="line.2208"></a>
+<span class="sourceLineNo">2209</span>    get = new Get(row);<a name="line.2209"></a>
+<span class="sourceLineNo">2210</span>    result = region.get(get);<a name="line.2210"></a>
+<span class="sourceLineNo">2211</span>    assertEquals(3, result.size());<a name="line.2211"></a>
+<span class="sourceLineNo">2212</span><a name="line.2212"></a>
+<span class="sourceLineNo">2213</span>    // Now delete all... then test I can add stuff back<a name="line.2213"></a>
+<span class="sourceLineNo">2214</span>    delete = new Delete(row);<a name="line.2214"></a>
+<span class="sourceLineNo">2215</span>    region.delete(delete);<a name="line.2215"></a>
+<span class="sourceLineNo">2216</span>    assertEquals(0, region.get(get).size());<a name="line.2216"></a>
+<span class="sourceLineNo">2217</span><a name="line.2217"></a>
+<span class="sourceLineNo">2218</span>    region.put(new Put(row).addColumn(fam, splitA, Bytes.toBytes("reference_A")));<a name="line.2218"></a>
+<span class="sourceLineNo">2219</span>    result = region.get(get);<a name="line.2219"></a>
+<span class="sourceLineNo">2220</span>    assertEquals(1, result.size());<a name="line.2220"></a>
+<span class="sourceLineNo">2221</span>  }<a name="line.2221"></a>
+<span class="sourceLineNo">2222</span><a name="line.2222"></a>
+<span class="sourceLineNo">2223</span>  @Test<a name="line.2223"></a>
+<span class="sourceLineNo">2224</span>  public void testDeleteRowWithFutureTs() throws IOException {<a name="line.2224"></a>
+<span class="sourceLineNo">2225</span>    byte[] fam = Bytes.toBytes("info");<a name="line.2225"></a>
+<span class="sourceLineNo">2226</span>    byte[][] families = { fam };<a name="line.2226"></a>
+<span class="sourceLineNo">2227</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2227"></a>
+<span class="sourceLineNo">2228</span>    byte[] row = Bytes.toBytes("table_name");<a name="line.2228"></a>
+<span class="sourceLineNo">2229</span>    // column names<a name="line.2229"></a>
+<span class="sourceLineNo">2230</span>    byte[] serverinfo = Bytes.toBytes("serverinfo");<a name="line.2230"></a>
+<span class="sourceLineNo">2231</span><a name="line.2231"></a>
+<span class="sourceLineNo">2232</span>    // add data in the far future<a name="line.2232"></a>
+<span class="sourceLineNo">2233</span>    Put put = new Put(row);<a name="line.2233"></a>
+<span class="sourceLineNo">2234</span>    put.addColumn(fam, serverinfo, HConstants.LATEST_TIMESTAMP - 5, Bytes.toBytes("value"));<a name="line.2234"></a>
+<span class="sourceLineNo">2235</span>    region.put(put);<a name="line.2235"></a>
+<span class="sourceLineNo">2236</span><a name="line.2236"></a>
+<span class="sourceLineNo">2237</span>    // now delete something in the present<a name="line.2237"></a>
+<span class="sourceLineNo">2238</span>    Delete delete = new Delete(row);<a name="line.2238"></a>
+<span class="sourceLineNo">2239</span>    region.delete(delete);<a name="line.2239"></a>
+<span class="sourceLineNo">2240</span><a name="line.2240"></a>
+<span class="sourceLineNo">2241</span>    // make sure we still see our data<a name="line.2241"></a>
+<span class="sourceLineNo">2242</span>    Get get = new Get(row).addColumn(fam, serverinfo);<a name="line.2242"></a>
+<span class="sourceLineNo">2243</span>    Result result = region.get(get);<a name="line.2243"></a>
+<span class="sourceLineNo">2244</span>    assertEquals(1, result.size());<a name="line.2244"></a>
+<span class="sourceLineNo">2245</span><a name="line.2245"></a>
+<span class="sourceLineNo">2246</span>    // delete the future row<a name="line.2246"></a>
+<span class="sourceLineNo">2247</span>    delete = new Delete(row, HConstants.LATEST_TIMESTAMP - 3);<a name="line.2247"></a>
+<span class="sourceLineNo">2248</span>    region.delete(delete);<a name="line.2248"></a>
+<span class="sourceLineNo">2249</span><a name="line.2249"></a>
+<span class="sourceLineNo">2250</span>    // make sure it is gone<a name="line.2250"></a>
+<span class="sourceLineNo">2251</span>    get = new Get(row).addColumn(fam, serverinfo);<a name="line.2251"></a>
+<span class="sourceLineNo">2252</span>    result = region.get(get);<a name="line.2252"></a>
+<span class="sourceLineNo">2253</span>    assertEquals(0, result.size());<a name="line.2253"></a>
+<span class="sourceLineNo">2254</span>  }<a name="line.2254"></a>
+<span class="sourceLineNo">2255</span><a name="line.2255"></a>
+<span class="sourceLineNo">2256</span>  /**<a name="line.2256"></a>
+<span class="sourceLineNo">2257</span>   * Tests that the special LATEST_TIMESTAMP option for puts gets replaced by<a name="line.2257"></a>
+<span class="sourceLineNo">2258</span>   * the actual timestamp<a name="line.2258"></a>
+<span class="sourceLineNo">2259</span>   */<a name="line.2259"></a>
+<span class="sourceLineNo">2260</span>  @Test<a name="line.2260"></a>
+<span class="sourceLineNo">2261</span>  public void testPutWithLatestTS() throws IOException {<a name="line.2261"></a>
+<span class="sourceLineNo">2262</span>    byte[] fam = Bytes.toBytes("info");<a name="line.2262"></a>
+<span class="sourceLineNo">2263</span>    byte[][] families = { fam };<a name="line.2263"></a>
+<span class="sourceLineNo">2264</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2264"></a>
+<span class="sourceLineNo">2265</span>    byte[] row = Bytes.toBytes("row1");<a name="line.2265"></a>
+<span class="sourceLineNo">2266</span>    // column names<a name="line.2266"></a>
+<span class="sourceLineNo">2267</span>    byte[] qual = Bytes.toBytes("qual");<a name="line.2267"></a>
+<span class="sourceLineNo">2268</span><a name="line.2268"></a>
+<span class="sourceLineNo">2269</span>    // add data with LATEST_TIMESTAMP, put without WAL<a name="line.2269"></a>
+<span class="sourceLineNo">2270</span>    Put put = new Put(row);<a name="line.2270"></a>
+<span class="sourceLineNo">2271</span>    put.addColumn(fam, qual, HConstants.LATEST_TIMESTAMP, Bytes.toBytes("value"));<a name="line.2271"></a>
+<span class="sourceLineNo">2272</span>    region.put(put);<a name="line.2272"></a>
+<span class="sourceLineNo">2273</span><a name="line.2273"></a>
+<span class="sourceLineNo">2274</span>    // Make sure it shows up with an actual timestamp<a name="line.2274"></a>
+<span class="sourceLineNo">2275</span>    Get get = new Get(row).addColumn(fam, qual);<a name="line.2275"></a>
+<span class="sourceLineNo">2276</span>    Result result = region.get(get);<a name="line.2276"></a>
+<span class="sourceLineNo">2277</span>    assertEquals(1, result.size());<a name="line.2277"></a>
+<span class="sourceLineNo">2278</span>    Cell kv = result.rawCells()[0];<a name="line.2278"></a>
+<span class="sourceLineNo">2279</span>    LOG.info("Got: " + kv);<a name="line.2279"></a>
+<span class="sourceLineNo">2280</span>    assertTrue("LATEST_TIMESTAMP was not replaced with real timestamp",<a name="line.2280"></a>
+<span class="sourceLineNo">2281</span>        kv.getTimestamp() != HConstants.LATEST_TIMESTAMP);<a name="line.2281"></a>
+<span class="sourceLineNo">2282</span><a name="line.2282"></a>
+<span class="sourceLineNo">2283</span>    // Check same with WAL enabled (historically these took different<a name="line.2283"></a>
+<span class="sourceLineNo">2284</span>    // code paths, so check both)<a name="line.2284"></a>
+<span class="sourceLineNo">2285</span>    row = Bytes.toBytes("row2");<a name="line.2285"></a>
+<span class="sourceLineNo">2286</span>    put = new Put(row);<a name="line.2286"></a>
+<span class="sourceLineNo">2287</span>    put.addColumn(fam, qual, HConstants.LATEST_TIMESTAMP, Bytes.toBytes("value"));<a name="line.2287"></a>
+<span class="sourceLineNo">2288</span>    region.put(put);<a name="line.2288"></a>
+<span class="sourceLineNo">2289</span><a name="line.2289"></a>
+<span class="sourceLineNo">2290</span>    // Make sure it shows up with an actual timestamp<a name="line.2290"></a>
+<span class="sourceLineNo">2291</span>    get = new Get(row).addColumn(fam, qual);<a name="line.2291"></a>
+<span class="sourceLineNo">2292</span>    result = region.get(get);<a name="line.2292"></a>
+<span class="sourceLineNo">2293</span>    assertEquals(1, result.size());<a name="line.2293"></a>
+<span class="sourceLineNo">2294</span>    kv = result.rawCells()[0];<a name="line.2294"></a>
+<span class="sourceLineNo">2295</span>    LOG.info("Got: " + kv);<a name="line.2295"></a>
+<span class="sourceLineNo">2296</span>    assertTrue("LATEST_TIMESTAMP was not replaced with real timestamp",<a name="line.2296"></a>
+<span class="sourceLineNo">2297</span>        kv.getTimestamp() != HConstants.LATEST_TIMESTAMP);<a name="line.2297"></a>
+<span class="sourceLineNo">2298</span>  }<a name="line.2298"></a>
+<span class="sourceLineNo">2299</span><a name="line.2299"></a>
+<span class="sourceLineNo">2300</span>  /**<a name="line.2300"></a>
+<span class="sourceLineNo">2301</span>   * Tests that there is server-side filtering for invalid timestamp upper<a name="line.2301"></a>
+<span class="sourceLineNo">2302</span>   * bound. Note that the timestamp lower bound is automatically handled for us<a name="line.2302"></a>
+<span class="sourceLineNo">2303</span>   * by the TTL field.<a name="line.2303"></a>
+<span class="sourceLineNo">2304</span>   */<a name="line.2304"></a>
+<span class="sourceLineNo">2305</span>  @Test<a name="line.2305"></a>
+<span class="sourceLineNo">2306</span>  public void testPutWithTsSlop() throws IOException {<a name="line.2306"></a>
+<span class="sourceLineNo">2307</span>    byte[] fam = Bytes.toBytes("info");<a name="line.2307"></a>
+<span class="sourceLineNo">2308</span>    byte[][] families = { fam };<a name="line.2308"></a>
+<span class="sourceLineNo">2309</span><a name="line.2309"></a>
+<span class="sourceLineNo">2310</span>    // add data with a timestamp that is too recent for range. Ensure assert<a name="line.2310"></a>
+<span class="sourceLineNo">2311</span>    CONF.setInt("hbase.hregion.keyvalue.timestamp.slop.millisecs", 1000);<a name="line.2311"></a>
+<span class="sourceLineNo">2312</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2312"></a>
+<span class="sourceLineNo">2313</span>    boolean caughtExcep = false;<a name="line.2313"></a>
+<span class="sourceLineNo">2314</span>    try {<a name="line.2314"></a>
+<span class="sourceLineNo">2315</span>      // no TS specified == use latest. should not error<a name="line.2315"></a>
+<span class="sourceLineNo">2316</span>      region.put(new Put(row).addColumn(fam, Bytes.toBytes("qual"), Bytes.toBytes("value")));<a name="line.2316"></a>
+<span class="sourceLineNo">2317</span>      // TS out of range. should error<a name="line.2317"></a>
+<span class="sourceLineNo">2318</span>      region.put(new Put(row).addColumn(fam, Bytes.toBytes("qual"),<a name="line.2318"></a>
+<span class="sourceLineNo">2319</span>          System.currentTimeMillis() + 2000, Bytes.toBytes("value")));<a name="line.2319"></a>
+<span class="sourceLineNo">2320</span>      fail("Expected IOE for TS out of configured timerange");<a name="line.2320"></a>
+<span class="sourceLineNo">2321</span>    } catch (FailedSanityCheckException ioe) {<a name="line.2321"></a>
+<span class="sourceLineNo">2322</span>      LOG.debug("Received expected exception", ioe);<a name="line.2322"></a>
+<span class="sourceLineNo">2323</span>      caughtExcep = true;<a name="line.2323"></a>
+<span class="sourceLineNo">2324</span>    }<a name="line.2324"></a>
+<span class="sourceLineNo">2325</span>    assertTrue("Should catch FailedSanityCheckException", caughtExcep);<a name="line.2325"></a>
+<span class="sourceLineNo">2326</span>  }<a name="line.2326"></a>
+<span class="sourceLineNo">2327</span><a name="line.2327"></a>
+<span class="sourceLineNo">2328</span>  @Test<a name="line.2328"></a>
+<span class="sourceLineNo">2329</span>  public void testScanner_DeleteOneFamilyNotAnother() throws IOException {<a name="line.2329"></a>
+<span class="sourceLineNo">2330</span>    byte[] fam1 = Bytes.toBytes("columnA");<a name="line.2330"></a>
+<span class="sourceLineNo">2331</span>    byte[] fam2 = Bytes.toBytes("columnB");<a name="line.2331"></a>
+<span class="sourceLineNo">2332</span>    this.region = initHRegion(tableName, method, CONF, fam1, fam2);<a name="line.2332"></a>
+<span class="sourceLineNo">2333</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.2333"></a>
+<span class="sourceLineNo">2334</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.2334"></a>
+<span class="sourceLineNo">2335</span><a name="line.2335"></a>
+<span class="sourceLineNo">2336</span>    byte[] value = Bytes.toBytes("value");<a name="line.2336"></a>
+<span class="sourceLineNo">2337</span><a name="line.2337"></a>
+<span class="sourceLineNo">2338</span>    Delete delete = new Delete(rowA);<a name="line.2338"></a>
+<span class="sourceLineNo">2339</span>    delete.addFamily(fam1);<a name="line.2339"></a>
+<span class="sourceLineNo">2340</span><a name="line.2340"></a>
+<span class="sourceLineNo">2341</span>    region.delete(delete);<a name="line.2341"></a>
+<span class="sourceLineNo">2342</span><a name="line.2342"></a>
+<span class="sourceLineNo">2343</span>    // now create data.<a name="line.2343"></a>
+<span class="sourceLineNo">2344</span>    Put put = new Put(rowA);<a name="line.2344"></a>
+<span class="sourceLineNo">2345</span>    put.addColumn(fam2, null, value);<a name="line.2345"></a>
+<span class="sourceLineNo">2346</span>    region.put(put);<a name="line.2346"></a>
+<span class="sourceLineNo">2347</span><a name="line.2347"></a>
+<span class="sourceLineNo">2348</span>    put = new Put(rowB);<a name="line.2348"></a>
+<span class="sourceLineNo">2349</span>    put.addColumn(fam1, null, value);<a name="line.2349"></a>
+<span class="sourceLineNo">2350</span>    put.addColumn(fam2, null, value);<a name="line.2350"></a>
+<span class="sourceLineNo">2351</span>    region.put(put);<a name="line.2351"></a>
+<span class="sourceLineNo">2352</span><a name="line.2352"></a>
+<span class="sourceLineNo">2353</span>    Scan scan = new Scan();<a name="line.2353"></a>
+<span class="sourceLineNo">2354</span>    scan.addFamily(fam1).addFamily(fam2);<a name="line.2354"></a>
+<span class="sourceLineNo">2355</span>    InternalScanner s = region.getScanner(scan);<a name="line.2355"></a>
+<span class="sourceLineNo">2356</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.2356"></a>
+<span class="sourceLineNo">2357</span>    s.next(results);<a name="line.2357"></a>
+<span class="sourceLineNo">2358</span>    assertTrue(CellUtil.matchingRows(results.get(0), rowA));<a name="line.2358"></a>
+<span class="sourceLineNo">2359</span><a name="line.2359"></a>
+<span class="sourceLineNo">2360</span>    results.clear();<a name="line.2360"></a>
+<span class="sourceLineNo">2361</span>    s.next(results);<a name="line.2361"></a>
+<span class="sourceLineNo">2362</span>    assertTrue(CellUtil.matchingRows(results.get(0), rowB));<a name="line.2362"></a>
+<span class="sourceLineNo">2363</span>  }<a name="line.2363"></a>
+<span class="sourceLineNo">2364</span><a name="line.2364"></a>
+<span class="sourceLineNo">2365</span>  @Test<a name="line.2365"></a>
+<span class="sourceLineNo">2366</span>  public void testDataInMemoryWithoutWAL() throws IOException {<a name="line.2366"></a>
+<span class="sourceLineNo">2367</span>    FileSystem fs = FileSystem.get(CONF);<a name="line.2367"></a>
+<span class="sourceLineNo">2368</span>    Path rootDir = new Path(dir + "testDataInMemoryWithoutWAL");<a name="line.2368"></a>
+<span class="sourceLineNo">2369</span>    FSHLog hLog = new FSHLog(fs, rootDir, "testDataInMemoryWithoutWAL", CONF);<a name="line.2369"></a>
+<span class="sourceLineNo">2370</span>    hLog.init();<a name="line.2370"></a>
+<span class="sourceLineNo">2371</span>    // This chunk creation is done throughout the code base. Do we want to move it into core?<a name="line.2371"></a>
+<span class="sourceLineNo">2372</span>    // It is missing from this test. W/o it we NPE.<a name="line.2372"></a>
+<span class="sourceLineNo">2373</span>    ChunkCreator.initialize(MemStoreLABImpl.CHUNK_SIZE_DEFAULT, false, 0, 0, 0, null);<a name="line.2373"></a>
+<span class="sourceLineNo">2374</span>    region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, hLog,<a name="line.2374"></a>
+<span class="sourceLineNo">2375</span>        COLUMN_FAMILY_BYTES);<a name="line.2375"></a>
+<span class="sourceLineNo">2376</span><a name="line.2376"></a>
+<span class="sourceLineNo">2377</span>    Cell originalCell = CellUtil.createCell(row, COLUMN_FAMILY_BYTES, qual1,<a name="line.2377"></a>
+<span class="sourceLineNo">2378</span>      System.currentTimeMillis(), KeyValue.Type.Put.getCode(), value1);<a name="line.2378"></a>
+<span class="sourceLineNo">2379</span>    final long originalSize = originalCell.getSerializedSize();<a name="line.2379"></a>
+<span class="sourceLineNo">2380</span><a name="line.2380"></a>
+<span class="sourceLineNo">2381</span>    Cell addCell = CellUtil.createCell(row, COLUMN_FAMILY_BYTES, qual1,<a name="line.2381"></a>
+<span class="sourceLineNo">2382</span>      System.currentTimeMillis(), KeyValue.Type.Put.getCode(), Bytes.toBytes("xxxxxxxxxx"));<a name="line.2382"></a>
+<span class="sourceLineNo">2383</span>    final long addSize = addCell.getSerializedSize();<a name="line.2383"></a>
+<span class="sourceLineNo">2384</span><a name="line.2384"></a>
+<span class="sourceLineNo">2385</span>    LOG.info("originalSize:" + originalSize<a name="line.2385"></a>
+<span class="sourceLineNo">2386</span>      + ", addSize:" + addSize);<a name="line.2386"></a>
+<span class="sourceLineNo">2387</span>    // start test. We expect that the addPut's durability will be replaced<a name="line.2387"></a>
+<span class="sourceLineNo">2388</span>    // by originalPut's durability.<a name="line.2388"></a>
+<span class="sourceLineNo">2389</span><a name="line.2389"></a>
+<span class="sourceLineNo">2390</span>    // case 1:<a name="line.2390"></a>
+<span class="sourceLineNo">2391</span>    testDataInMemoryWithoutWAL(region,<a name="line.2391"></a>
+<span class="sourceLineNo">2392</span>            new Put(row).add(originalCell).setDurability(Durability.SKIP_WAL),<a name="line.2392"></a>
+<span class="sourceLineNo">2393</span>            new Put(row).add(addCell).setDurability(Durability.SKIP_WAL),<a name="line.2393"></a>
+<span class="sourceLineNo">2394</span>            originalSize + addSize);<a name="line.2394"></a>
+<span class="sourceLineNo">2395</span><a name="line.2395"></a>
+<span class="sourceLineNo">2396</span>    // case 2:<a name="line.2396"></a>
+<span class="sourceLineNo">2397</span>    testDataInMemoryWithoutWAL(region,<a name="line.2397"></a>
+<span class="sourceLineNo">2398</span>            new Put(row).add(originalCell).setDurability(Durability.SKIP_WAL),<a name="line.2398"></a>
+<span class="sourceLineNo">2399</span>            new Put(row).add(addCell).setDurability(Durability.SYNC_WAL),<a name="line.2399"></a>
+<span class="sourceLineNo">2400</span>            originalSize + addSize);<a name="line.2400"></a>
+<span class="sourceLineNo">2401</span><a name="line.2401"></a>
+<span class="sourceLineNo">2402</span>    // case 3:<a name="line.2402"></a>
+<span class="sourceLineNo">2403</span>    testDataInMemoryWithoutWAL(region,<a name="line.2403"></a>
+<span class="sourceLineNo">2404</span>            new Put(row).add(originalCell).setDurability(Durability.SYNC_WAL),<a name="line.2404"></a>
+<span class="sourceLineNo">2405</span>            new Put(row).add(addCell).setDurability(Durability.SKIP_WAL),<a name="line.2405"></a>
+<span class="sourceLineNo">2406</span>            0);<a name="line.2406"></a>
+<span class="sourceLineNo">2407</span><a name="line.2407"></a>
+<span class="sourceLineNo">2408</span>    // case 4:<a name="line.2408"></a>
+<span class="sourceLineNo">2409</span>    testDataInMemoryWithoutWAL(region,<a name="line.2409"></a>
+<span class="sourceLineNo">2410</span>            new Put(row).add(originalCell).setDurability(Durability.SYNC_WAL),<a name="line.2410"></a>
+<span class="sourceLineNo">2411</span>            new Put(row).add(addCell).setDurability(Durability.SYNC_WAL),<a name="line.2411"></a>
+<span class="sourceLineNo">2412</span>            0);<a name="line.2412"></a>
+<span class="sourceLineNo">2413</span>  }<a name="line.2413"></a>
+<span class="sourceLineNo">2414</span><a name="line.2414"></a>
+<span class="sourceLineNo">2415</span>  private static void testDataInMemoryWithoutWAL(HRegion region, Put originalPut,<a name="line.2415"></a>
+<span class="sourceLineNo">2416</span>          final Put addPut, long delta) throws IOException {<a name="line.2416"></a>
+<span class="sourceLineNo">2417</span>    final long initSize = region.getDataInMemoryWithoutWAL();<a name="line.2417"></a>
+<span class="sourceLineNo">2418</span>    // save normalCPHost and replaced by mockedCPHost<a name="line.2418"></a>
+<span class="sourceLineNo">2419</span>    RegionCoprocessorHost normalCPHost = region.getCoprocessorHost();<a name="line.2419"></a>
+<span class="sourceLineNo">2420</span>    RegionCoprocessorHost mockedCPHost = Mockito.mock(RegionCoprocessorHost.class);<a name="line.2420"></a>
+<span class="sourceLineNo">2421</span>    // Because the preBatchMutate returns void, we can't do usual Mockito when...then form. Must<a name="line.2421"></a>
+<span class="sourceLineNo">2422</span>    // do below format (from Mockito doc).<a name="line.2422"></a>
+<span class="sourceLineNo">2423</span>    Mockito.doAnswer(new Answer&lt;Void&gt;() {<a name="line.2423"></a>
+<span class="sourceLineNo">2424</span>      @Override<a name="line.2424"></a>
+<span class="sourceLineNo">2425</span>      public Void answer(InvocationOnMock invocation) throws Throwable {<a name="line.2425"></a>
+<span class="sourceLineNo">2426</span>        MiniBatchOperationInProgress&lt;Mutation&gt; mb = invocation.getArgument(0);<a name="line.2426"></a>
+<span class="sourceLineNo">2427</span>        mb.addOperationsFromCP(0, new Mutation[]{addPut});<a name="line.2427"></a>
+<span class="sourceLineNo">2428</span>        return null;<a name="line.2428"></a>
+<span class="sourceLineNo">2429</span>      }<a name="line.2429"></a>
+<span class="sourceLineNo">2430</span>    }).when(mockedCPHost).preBatchMutate(Mockito.isA(MiniBatchOperationInProgress.class));<a name="line.2430"></a>
+<span class="sourceLineNo">2431</span>    ColumnFamilyDescriptorBuilder builder = ColumnFamilyDescriptorBuilder.<a name="line.2431"></a>
+<span class="sourceLineNo">2432</span>        newBuilder(COLUMN_FAMILY_BYTES);<a name="line.2432"></a>
+<span class="sourceLineNo">2433</span>    ScanInfo info = new ScanInfo(CONF, builder.build(), Long.MAX_VALUE,<a name="line.2433"></a>
+<span class="sourceLineNo">2434</span>        Long.MAX_VALUE, region.getCellComparator());<a name="line.2434"></a>
+<span class="sourceLineNo">2435</span>    Mockito.when(mockedCPHost.preFlushScannerOpen(Mockito.any(HStore.class),<a name="line.2435"></a>
+<span class="sourceLineNo">2436</span>        Mockito.any())).thenReturn(info);<a name="line.2436"></a>
+<span class="sourceLineNo">2437</span>    Mockito.when(mockedCPHost.preFlush(Mockito.any(), Mockito.any(StoreScanner.class),<a name="line.2437"></a>
+<span class="sourceLineNo">2438</span>        Mockito.any())).thenAnswer(i -&gt; i.getArgument(1));<a name="line.2438"></a>
+<span class="sourceLineNo">2439</span>    region.setCoprocessorHost(mockedCPHost);<a name="line.2439"></a>
+<span class="sourceLineNo">2440</span><a name="line.2440"></a>
+<span class="sourceLineNo">2441</span>    region.put(originalPut);<a name="line.2441"></a>
+<span class="sourceLineNo">2442</span>    region.setCoprocessorHost(normalCPHost);<a name="line.2442"></a>
+<span class="sourceLineNo">2443</span>    final long finalSize = region.getDataInMemoryWithoutWAL();<a name="line.2443"></a>
+<span class="sourceLineNo">2444</span>    assertEquals("finalSize:" + finalSize + ", initSize:"<a name="line.2444"></a>
+<span class="sourceLineNo">2445</span>      + initSize + ", delta:" + delta,finalSize, initSize + delta);<a name="line.2445"></a>
+<span class="sourceLineNo">2446</span>  }<a name="line.2446"></a>
+<span class="sourceLineNo">2447</span><a name="line.2447"></a>
+<span class="sourceLineNo">2448</span>  @Test<a name="line.2448"></a>
+<span class="sourceLineNo">2449</span>  public void testDeleteColumns_PostInsert() throws IOException, InterruptedException {<a name="line.2449"></a>
+<span class="sourceLineNo">2450</span>    Delete delete = new Delete(row);<a name="line.2450"></a>
+<span class="sourceLineNo">2451</span>    delete.addColumns(fam1, qual1);<a name="line.2451"></a>
+<span class="sourceLineNo">2452</span>    doTestDelete_AndPostInsert(delete);<a name="line.2452"></a>
+<span class="sourceLineNo">2453</span>  }<a name="line.2453"></a>
+<span class="sourceLineNo">2454</span><a name="line.2454"></a>
+<span class="sourceLineNo">2455</span>  @Test<a name="line.2455"></a>
+<span class="sourceLineNo">2456</span>  public void testaddFamily_PostInsert() throws IOException, InterruptedException {<a name="line.2456"></a>
+<span class="sourceLineNo">2457</span>    Delete delete = new Delete(row);<a name="line.2457"></a>
+<span class="sourceLineNo">2458</span>    delete.addFamily(fam1);<a name="line.2458"></a>
+<span class="sourceLineNo">2459</span>    doTestDelete_AndPostInsert(delete);<a name="line.2459"></a>
+<span class="sourceLineNo">2460</span>  }<a name="line.2460"></a>
 <span class="sourceLineNo">2461</span><a name="line.2461"></a>
-<span class="sourceLineNo">2462</span>    // ok put data:<a name="line.2462"></a>
-<span class="sourceLineNo">2463</span>    put = new Put(row);<a name="line.2463"></a>
-<span class="sourceLineNo">2464</span>    put.addColumn(fam1, qual1, value2);<a name="line.2464"></a>
-<span class="sourceLineNo">2465</span>    region.put(put);<a name="line.2465"></a>
-<span class="sourceLineNo">2466</span><a name="line.2466"></a>
-<span class="sourceLineNo">2467</span>    // ok get:<a name="line.2467"></a>
-<span class="sourceLineNo">2468</span>    Get get = new Get(row);<a name="line.2468"></a>
-<span class="sourceLineNo">2469</span>    get.addColumn(fam1, qual1);<a name="line.2469"></a>
-<span class="sourceLineNo">2470</span><a name="line.2470"></a>
-<span class="sourceLineNo">2471</span>    Result r = region.get(get);<a name="line.2471"></a>
-<span class="sourceLineNo">2472</span>    assertEquals(1, r.size());<a name="line.2472"></a>
-<span class="sourceLineNo">2473</span>    assertArrayEquals(value2, r.getValue(fam1, qual1));<a name="line.2473"></a>
-<span class="sourceLineNo">2474</span><a name="line.2474"></a>
-<span class="sourceLineNo">2475</span>    // next:<a name="line.2475"></a>
-<span class="sourceLineNo">2476</span>    Scan scan = new Scan(row);<a name="line.2476"></a>
-<span class="sourceLineNo">2477</span>    scan.addColumn(fam1, qual1);<a name="line.2477"></a>
-<span class="sourceLineNo">2478</span>    InternalScanner s = region.getScanner(scan);<a name="line.2478"></a>
-<span class="sourceLineNo">2479</span><a name="line.2479"></a>
-<span class="sourceLineNo">2480</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.2480"></a>
-<span class="sourceLineNo">2481</span>    assertEquals(false, s.next(results));<a name="line.2481"></a>
-<span class="sourceLineNo">2482</span>    assertEquals(1, results.size());<a name="line.2482"></a>
-<span class="sourceLineNo">2483</span>    Cell kv = results.get(0);<a name="line.2483"></a>
+<span class="sourceLineNo">2462</span>  public void doTestDelete_AndPostInsert(Delete delete) throws IOException, InterruptedException {<a name="line.2462"></a>
+<span class="sourceLineNo">2463</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2463"></a>
+<span class="sourceLineNo">2464</span>    EnvironmentEdgeManagerTestHelper.injectEdge(new IncrementingEnvironmentEdge());<a name="line.2464"></a>
+<span class="sourceLineNo">2465</span>    Put put = new Put(row);<a name="line.2465"></a>
+<span class="sourceLineNo">2466</span>    put.addColumn(fam1, qual1, value1);<a name="line.2466"></a>
+<span class="sourceLineNo">2467</span>    region.put(put);<a name="line.2467"></a>
+<span class="sourceLineNo">2468</span><a name="line.2468"></a>
+<span class="sourceLineNo">2469</span>    // now delete the value:<a name="line.2469"></a>
+<span class="sourceLineNo">2470</span>    region.delete(delete);<a name="line.2470"></a>
+<span class="sourceLineNo">2471</span><a name="line.2471"></a>
+<span class="sourceLineNo">2472</span>    // ok put data:<a name="line.2472"></a>
+<span class="sourceLineNo">2473</span>    put = new Put(row);<a name="line.2473"></a>
+<span class="sourceLineNo">2474</span>    put.addColumn(fam1, qual1, value2);<a name="line.2474"></a>
+<span class="sourceLineNo">2475</span>    region.put(put);<a name="line.2475"></a>
+<span class="sourceLineNo">2476</span><a name="line.2476"></a>
+<span class="sourceLineNo">2477</span>    // ok get:<a name="line.2477"></a>
+<span class="sourceLineNo">2478</span>    Get get = new Get(row);<a name="line.2478"></a>
+<span class="sourceLineNo">2479</span>    get.addColumn(fam1, qual1);<a name="line.2479"></a>
+<span class="sourceLineNo">2480</span><a name="line.2480"></a>
+<span class="sourceLineNo">2481</span>    Result r = region.get(get);<a name="line.2481"></a>
+<span class="sourceLineNo">2482</span>    assertEquals(1, r.size());<a name="line.2482"></a>
+<span class="sourceLineNo">2483</span>    assertArrayEquals(value2, r.getValue(fam1, qual1));<a name="line.2483"></a>
 <span class="sourceLineNo">2484</span><a name="line.2484"></a>
-<span class="sourceLineNo">2485</span>    assertArrayEquals(value2, CellUtil.cloneValue(kv));<a name="line.2485"></a>
-<span class="sourceLineNo">2486</span>    assertArrayEquals(fam1, CellUtil.cloneFamily(kv));<a name="line.2486"></a>
-<span class="sourceLineNo">2487</span>    assertArrayEquals(qual1, CellUtil.cloneQualifier(kv));<a name="line.2487"></a>
-<span class="sourceLineNo">2488</span>    assertArrayEquals(row, CellUtil.cloneRow(kv));<a name="line.2488"></a>
-<span class="sourceLineNo">2489</span>  }<a name="line.2489"></a>
-<span class="sourceLineNo">2490</span><a name="line.2490"></a>
-<span class="sourceLineNo">2491</span>  @Test<a name="line.2491"></a>
-<span class="sourceLineNo">2492</span>  public void testDelete_CheckTimestampUpdated() throws IOException {<a name="line.2492"></a>
-<span class="sourceLineNo">2493</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2493"></a>
-<span class="sourceLineNo">2494</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.2494"></a>
-<span class="sourceLineNo">2495</span>    byte[] col2 = Bytes.toBytes("col2");<a name="line.2495"></a>
-<span class="sourceLineNo">2496</span>    byte[] col3 = Bytes.toBytes("col3");<a name="line.2496"></a>
-<span class="sourceLineNo">2497</span><a name="line.2497"></a>
-<span class="sourceLineNo">2498</span>    // Setting up region<a name="line.2498"></a>
-<span class="sourceLineNo">2499</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2499"></a>
-<span class="sourceLineNo">2500</span>    // Building checkerList<a name="line.2500"></a>
-<span class="sourceLineNo">2501</span>    List&lt;Cell&gt; kvs = new ArrayList&lt;&gt;();<a name="line.2501"></a>
-<span class="sourceLineNo">2502</span>    kvs.add(new KeyValue(row1, fam1, col1, null));<a name="line.2502"></a>
-<span class="sourceLineNo">2503</span>    kvs.add(new KeyValue(row1, fam1, col2, null));<a name="line.2503"></a>
-<span class="sourceLineNo">2504</span>    kvs.add(new KeyValue(row1, fam1, col3, null));<a name="line.2504"></a>
-<span class="sourceLineNo">2505</span><a name="line.2505"></a>
-<span class="sourceLineNo">2506</span>    NavigableMap&lt;byte[], List&lt;Cell&gt;&gt; deleteMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2506"></a>
-<span class="sourceLineNo">2507</span>    deleteMap.put(fam1, kvs);<a name="line.2507"></a>
-<span class="sourceLineNo">2508</span>    region.delete(deleteMap, Durability.SYNC_WAL);<a name="line.2508"></a>
-<span class="sourceLineNo">2509</span><a name="line.2509"></a>
-<span class="sourceLineNo">2510</span>    // extract the key values out the memstore:<a name="line.2510"></a>
-<span class="sourceLineNo">2511</span>    // This is kinda hacky, but better than nothing...<a name="line.2511"></a>
-<span class="sourceLineNo">2512</span>    long now = System.currentTimeMillis();<a name="line.2512"></a>
-<span class="sourceLineNo">2513</span>    AbstractMemStore memstore = (AbstractMemStore)region.getStore(fam1).memstore;<a name="line.2513"></a>
-<span class="sourceLineNo">2514</span>    Cell firstCell = memstore.getActive().first();<a name="line.2514"></a>
-<span class="sourceLineNo">2515</span>    assertTrue(firstCell.getTimestamp() &lt;= now);<a name="line.2515"></a>
-<span class="sourceLineNo">2516</span>    now = firstCell.getTimestamp();<a name="line.2516"></a>
-<span class="sourceLineNo">2517</span>    for (Cell cell : memstore.getActive().getCellSet()) {<a name="line.2517"></a>
-<span class="sourceLineNo">2518</span>      assertTrue(cell.getTimestamp() &lt;= now);<a name="line.2518"></a>
-<span class="sourceLineNo">2519</span>      now = cell.getTimestamp();<a name="line.2519"></a>
-<span class="sourceLineNo">2520</span>    }<a name="line.2520"></a>
-<span class="sourceLineNo">2521</span>  }<a name="line.2521"></a>
-<span class="sourceLineNo">2522</span><a name="line.2522"></a>
-<span class="sourceLineNo">2523</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2523"></a>
-<span class="sourceLineNo">2524</span>  // Get tests<a name="line.2524"></a>
-<span class="sourceLineNo">2525</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2525"></a>
-<span class="sourceLineNo">2526</span>  @Test<a name="line.2526"></a>
-<span class="sourceLineNo">2527</span>  public void testGet_FamilyChecker() throws IOException {<a name="line.2527"></a>
-<span class="sourceLineNo">2528</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2528"></a>
-<span class="sourceLineNo">2529</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2529"></a>
-<span class="sourceLineNo">2530</span>    byte[] fam2 = Bytes.toBytes("False");<a name="line.2530"></a>
-<span class="sourceLineNo">2531</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.2531"></a>
+<span class="sourceLineNo">2485</span>    // next:<a name="line.2485"></a>
+<span class="sourceLineNo">2486</span>    Scan scan = new Scan(row);<a name="line.2486"></a>
+<span class="sourceLineNo">2487</span>    scan.addColumn(fam1, qual1);<a name="line.2487"></a>
+<span class="sourceLineNo">2488</span>    InternalScanner s = region.getScanner(scan);<a name="line.2488"></a>
+<span class="sourceLineNo">2489</span><a name="line.2489"></a>
+<span class="sourceLineNo">2490</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.2490"></a>
+<span class="sourceLineNo">2491</span>    assertEquals(false, s.next(results));<a name="line.2491"></a>
+<span class="sourceLineNo">2492</span>    assertEquals(1, results.size());<a name="line.2492"></a>
+<span class="sourceLineNo">2493</span>    Cell kv = results.get(0);<a name="line.2493"></a>
+<span class="sourceLineNo">2494</span><a name="line.2494"></a>
+<span class="sourceLineNo">2495</span>    assertArrayEquals(value2, CellUtil.cloneValue(kv));<a name="line.2495"></a>
+<span class="sourceLineNo">2496</span>    assertArrayEquals(fam1, CellUtil.cloneFamily(kv));<a name="line.2496"></a>
+<span class="sourceLineNo">2497</span>    assertArrayEquals(qual1, CellUtil.cloneQualifier(kv));<a name="line.2497"></a>
+<span class="sourceLineNo">2498</span>    assertArrayEquals(row, CellUtil.cloneRow(kv));<a name="line.2498"></a>
+<span class="sourceLineNo">2499</span>  }<a name="line.2499"></a>
+<span class="sourceLineNo">2500</span><a name="line.2500"></a>
+<span class="sourceLineNo">2501</span>  @Test<a name="line.2501"></a>
+<span class="sourceLineNo">2502</span>  public void testDelete_CheckTimestampUpdated() throws IOException {<a name="line.2502"></a>
+<span class="sourceLineNo">2503</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2503"></a>
+<span class="sourceLineNo">2504</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.2504"></a>
+<span class="sourceLineNo">2505</span>    byte[] col2 = Bytes.toBytes("col2");<a name="line.2505"></a>
+<span class="sourceLineNo">2506</span>    byte[] col3 = Bytes.toBytes("col3");<a name="line.2506"></a>
+<span class="sourceLineNo">2507</span><a name="line.2507"></a>
+<span class="sourceLineNo">2508</span>    // Setting up region<a name="line.2508"></a>
+<span class="sourceLineNo">2509</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2509"></a>
+<span class="sourceLineNo">2510</span>    // Building checkerList<a name="line.2510"></a>
+<span class="sourceLineNo">2511</span>    List&lt;Cell&gt; kvs = new ArrayList&lt;&gt;();<a name="line.2511"></a>
+<span class="sourceLineNo">2512</span>    kvs.add(new KeyValue(row1, fam1, col1, null));<a name="line.2512"></a>
+<span class="sourceLineNo">2513</span>    kvs.add(new KeyValue(row1, fam1, col2, null));<a name="line.2513"></a>
+<span class="sourceLineNo">2514</span>    kvs.add(new KeyValue(row1, fam1, col3, null));<a name="line.2514"></a>
+<span class="sourceLineNo">2515</span><a name="line.2515"></a>
+<span class="sourceLineNo">2516</span>    NavigableMap&lt;byte[], List&lt;Cell&gt;&gt; deleteMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2516"></a>
+<span class="sourceLineNo">2517</span>    deleteMap.put(fam1, kvs);<a name="line.2517"></a>
+<span class="sourceLineNo">2518</span>    region.delete(deleteMap, Durability.SYNC_WAL);<a name="line.2518"></a>
+<span class="sourceLineNo">2519</span><a name="line.2519"></a>
+<span class="sourceLineNo">2520</span>    // extract the key values out the memstore:<a name="line.2520"></a>
+<span class="sourceLineNo">2521</span>    // This is kinda hacky, but better than nothing...<a name="line.2521"></a>
+<span class="sourceLineNo">2522</span>    long now = System.currentTimeMillis();<a name="line.2522"></a>
+<span class="sourceLineNo">2523</span>    AbstractMemStore memstore = (AbstractMemStore)region.getStore(fam1).memstore;<a name="line.2523"></a>
+<span class="sourceLineNo">2524</span>    Cell firstCell = memstore.getActive().first();<a name="line.2524"></a>
+<span class="sourceLineNo">2525</span>    assertTrue(firstCell.getTimestamp() &lt;= now);<a name="line.2525"></a>
+<span class="sourceLineNo">2526</span>    now = firstCell.getTimestamp();<a name="line.2526"></a>
+<span class="sourceLineNo">2527</span>    for (Cell cell : memstore.getActive().getCellSet()) {<a name="line.2527"></a>
+<span class="sourceLineNo">2528</span>      assertTrue(cell.getTimestamp() &lt;= now);<a name="line.2528"></a>
+<span class="sourceLineNo">2529</span>      now = cell.getTimestamp();<a name="line.2529"></a>
+<span class="sourceLineNo">2530</span>    }<a name="line.2530"></a>
+<span class="sourceLineNo">2531</span>  }<a name="line.2531"></a>
 <span class="sourceLineNo">2532</span><a name="line.2532"></a>
-<span class="sourceLineNo">2533</span>    // Setting up region<a name="line.2533"></a>
-<span class="sourceLineNo">2534</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2534"></a>
-<span class="sourceLineNo">2535</span>    Get get = new Get(row1);<a name="line.2535"></a>
-<span class="sourceLineNo">2536</span>    get.addColumn(fam2, col1);<a name="line.2536"></a>
-<span class="sourceLineNo">2537</span><a name="line.2537"></a>
-<span class="sourceLineNo">2538</span>    // Test<a name="line.2538"></a>
-<span class="sourceLineNo">2539</span>    try {<a name="line.2539"></a>
-<span class="sourceLineNo">2540</span>      region.get(get);<a name="line.2540"></a>
-<span class="sourceLineNo">2541</span>      fail("Expecting DoNotRetryIOException in get but did not get any");<a name="line.2541"></a>
-<span class="sourceLineNo">2542</span>    } catch (org.apache.hadoop.hbase.DoNotRetryIOException e) {<a name="line.2542"></a>
-<span class="sourceLineNo">2543</span>      LOG.info("Got expected DoNotRetryIOException successfully");<a name="line.2543"></a>
-<span class="sourceLineNo">2544</span>    }<a name="line.2544"></a>
-<span class="sourceLineNo">2545</span>  }<a name="line.2545"></a>
-<span class="sourceLineNo">2546</span><a name="line.2546"></a>
-<span class="sourceLineNo">2547</span>  @Test<a name="line.2547"></a>
-<span class="sourceLineNo">2548</span>  public void testGet_Basic() throws IOException {<a name="line.2548"></a>
-<span class="sourceLineNo">2549</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2549"></a>
-<span class="sourceLineNo">2550</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2550"></a>
-<span class="sourceLineNo">2551</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.2551"></a>
-<span class="sourceLineNo">2552</span>    byte[] col2 = Bytes.toBytes("col2");<a name="line.2552"></a>
-<span class="sourceLineNo">2553</span>    byte[] col3 = Bytes.toBytes("col3");<a name="line.2553"></a>
-<span class="sourceLineNo">2554</span>    byte[] col4 = Bytes.toBytes("col4");<a name="line.2554"></a>
-<span class="sourceLineNo">2555</span>    byte[] col5 = Bytes.toBytes("col5");<a name="line.2555"></a>
+<span class="sourceLineNo">2533</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2533"></a>
+<span class="sourceLineNo">2534</span>  // Get tests<a name="line.2534"></a>
+<span class="sourceLineNo">2535</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2535"></a>
+<span class="sourceLineNo">2536</span>  @Test<a name="line.2536"></a>
+<span class="sourceLineNo">2537</span>  public void testGet_FamilyChecker() throws IOException {<a name="line.2537"></a>
+<span class="sourceLineNo">2538</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2538"></a>
+<span class="sourceLineNo">2539</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2539"></a>
+<span class="sourceLineNo">2540</span>    byte[] fam2 = Bytes.toBytes("False");<a name="line.2540"></a>
+<span class="sourceLineNo">2541</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.2541"></a>
+<span class="sourceLineNo">2542</span><a name="line.2542"></a>
+<span class="sourceLineNo">2543</span>    // Setting up region<a name="line.2543"></a>
+<span class="sourceLineNo">2544</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2544"></a>
+<span class="sourceLineNo">2545</span>    Get get = new Get(row1);<a name="line.2545"></a>
+<span class="sourceLineNo">2546</span>    get.addColumn(fam2, col1);<a name="line.2546"></a>
+<span class="sourceLineNo">2547</span><a name="line.2547"></a>
+<span class="sourceLineNo">2548</span>    // Test<a name="line.2548"></a>
+<span class="sourceLineNo">2549</span>    try {<a name="line.2549"></a>
+<span class="sourceLineNo">2550</span>      region.get(get);<a name="line.2550"></a>
+<span class="sourceLineNo">2551</span>      fail("Expecting DoNotRetryIOException in get but did not get any");<a name="line.2551"></a>
+<span class="sourceLineNo">2552</span>    } catch (org.apache.hadoop.hbase.DoNotRetryIOException e) {<a name="line.2552"></a>
+<span class="sourceLineNo">2553</span>      LOG.info("Got expected DoNotRetryIOException successfully");<a name="line.2553"></a>
+<span class="sourceLineNo">2554</span>    }<a name="line.2554"></a>
+<span class="sourceLineNo">2555</span>  }<a name="line.2555"></a>
 <span class="sourceLineNo">2556</span><a name="line.2556"></a>
-<span class="sourceLineNo">2557</span>    // Setting up region<a name="line.2557"></a>
-<span class="sourceLineNo">2558</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2558"></a>
-<span class="sourceLineNo">2559</span>    // Add to memstore<a name="line.2559"></a>
-<span class="sourceLineNo">2560</span>    Put put = new Put(row1);<a name="line.2560"></a>
-<span class="sourceLineNo">2561</span>    put.addColumn(fam1, col1, null);<a name="line.2561"></a>
-<span class="sourceLineNo">2562</span>    put.addColumn(fam1, col2, null);<a name="line.2562"></a>
-<span class="sourceLineNo">2563</span>    put.addColumn(fam1, col3, null);<a name="line.2563"></a>
-<span class="sourceLineNo">2564</span>    put.addColumn(fam1, col4, null);<a name="line.2564"></a>
-<span class="sourceLineNo">2565</span>    put.addColumn(fam1, col5, null);<a name="line.2565"></a>
-<span class="sourceLineNo">2566</span>    region.put(put);<a name="line.2566"></a>
-<span class="sourceLineNo">2567</span><a name="line.2567"></a>
-<span class="sourceLineNo">2568</span>    Get get = new Get(row1);<a name="line.2568"></a>
-<span class="sourceLineNo">2569</span>    get.addColumn(fam1, col2);<a name="line.2569"></a>
-<span class="sourceLineNo">2570</span>    get.addColumn(fam1, col4);<a name="line.2570"></a>
-<span class="sourceLineNo">2571</span>    // Expected result<a name="line.2571"></a>
-<span class="sourceLineNo">2572</span>    KeyValue kv1 = new KeyValue(row1, fam1, col2);<a name="line.2572"></a>
-<span class="sourceLineNo">2573</span>    KeyValue kv2 = new KeyValue(row1, fam1, col4);<a name="line.2573"></a>
-<span class="sourceLineNo">2574</span>    KeyValue[] expected = { kv1, kv2 };<a name="line.2574"></a>
-<span class="sourceLineNo">2575</span><a name="line.2575"></a>
-<span class="sourceLineNo">2576</span>    // Test<a name="line.2576"></a>
-<span class="sourceLineNo">2577</span>    Result res = region.get(get);<a name="line.2577"></a>
-<span class="sourceLineNo">2578</span>    assertEquals(expected.length, res.size());<a name="line.2578"></a>
-<span class="sourceLineNo">2579</span>    for (int i = 0; i &lt; res.size(); i++) {<a name="line.2579"></a>
-<span class="sourceLineNo">2580</span>      assertTrue(CellUtil.matchingRows(expected[i], res.rawCells()[i]));<a name="line.2580"></a>
-<span class="sourceLineNo">2581</span>      assertTrue(CellUtil.matchingFamily(expected[i], res.rawCells()[i]));<a name="line.2581"></a>
-<span class="sourceLineNo">2582</span>      assertTrue(CellUtil.matchingQualifier(expected[i], res.rawCells()[i]));<a name="line.2582"></a>
-<span class="sourceLineNo">2583</span>    }<a name="line.2583"></a>
-<span class="sourceLineNo">2584</span><a name="line.2584"></a>
-<span class="sourceLineNo">2585</span>    // Test using a filter on a Get<a name="line.2585"></a>
-<span class="sourceLineNo">2586</span>    Get g = new Get(row1);<a name="line.2586"></a>
-<span class="sourceLineNo">2587</span>    final int count = 2;<a name="line.2587"></a>
-<span class="sourceLineNo">2588</span>    g.setFilter(new ColumnCountGetFilter(count));<a name="line.2588"></a>
-<span class="sourceLineNo">2589</span>    res = region.get(g);<a name="line.2589"></a>
-<span class="sourceLineNo">2590</span>    assertEquals(count, res.size());<a name="line.2590"></a>
-<span class="sourceLineNo">2591</span>  }<a name="line.2591"></a>
-<span class="sourceLineNo">2592</span><a name="line.2592"></a>
-<span class="sourceLineNo">2593</span>  @Test<a name="line.2593"></a>
-<span class="sourceLineNo">2594</span>  public void testGet_Empty() throws IOException {<a name="line.2594"></a>
-<span class="sourceLineNo">2595</span>    byte[] row = Bytes.toBytes("row");<a name="line.2595"></a>
-<span class="sourceLineNo">2596</span>    byte[] fam = Bytes.toBytes("fam");<a name="line.2596"></a>
-<span class="sourceLineNo">2597</span><a name="line.2597"></a>
-<span class="sourceLineNo">2598</span>    this.region = initHRegion(tableName, method, CONF, fam);<a name="line.2598"></a>
-<span class="sourceLineNo">2599</span>    Get get = new Get(row);<a name="line.2599"></a>
-<span class="sourceLineNo">2600</span>    get.addFamily(fam);<a name="line.2600"></a>
-<span class="sourceLineNo">2601</span>    Result r = region.get(get);<a name="line.2601"></a>
+<span class="sourceLineNo">2557</span>  @Test<a name="line.2557"></a>
+<span class="sourceLineNo">2558</span>  public void testGet_Basic() throws IOException {<a name="line.2558"></a>
+<span class="sourceLineNo">2559</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2559"></a>
+<span class="sourceLineNo">2560</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2560"></a>
+<span class="sourceLineNo">2561</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.2561"></a>
+<span class="sourceLineNo">2562</span>    byte[] col2 = Bytes.toBytes("col2");<a name="line.2562"></a>
+<span class="sourceLineNo">2563</span>    byte[] col3 = Bytes.toBytes("col3");<a name="line.2563"></a>
+<span class="sourceLineNo">2564</span>    byte[] col4 = Bytes.toBytes("col4");<a name="line.2564"></a>
+<span class="sourceLineNo">2565</span>    byte[] col5 = Bytes.toBytes("col5");<a name="line.2565"></a>
+<span class="sourceLineNo">2566</span><a name="line.2566"></a>
+<span class="sourceLineNo">2567</span>    // Setting up region<a name="line.2567"></a>
+<span class="sourceLineNo">2568</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2568"></a>
+<span class="sourceLineNo">2569</span>    // Add to memstore<a name="line.2569"></a>
+<span class="sourceLineNo">2570</span>    Put put = new Put(row1);<a name="line.2570"></a>
+<span class="sourceLineNo">2571</span>    put.addColumn(fam1, col1, null);<a name="line.2571"></a>
+<span class="sourceLineNo">2572</span>    put.addColumn(fam1, col2, null);<a name="line.2572"></a>
+<span class="sourceLineNo">2573</span>    put.addColumn(fam1, col3, null);<a name="line.2573"></a>
+<span class="sourceLineNo">2574</span>    put.addColumn(fam1, col4, null);<a name="line.2574"></a>
+<span class="sourceLineNo">2575</span>    put.addColumn(fam1, col5, null);<a name="line.2575"></a>
+<span class="sourceLineNo">2576</span>    region.put(put);<a name="line.2576"></a>
+<span class="sourceLineNo">2577</span><a name="line.2577"></a>
+<span class="sourceLineNo">2578</span>    Get get = new Get(row1);<a name="line.2578"></a>
+<span class="sourceLineNo">2579</span>    get.addColumn(fam1, col2);<a name="line.2579"></a>
+<span class="sourceLineNo">2580</span>    get.addColumn(fam1, col4);<a name="line.2580"></a>
+<span class="sourceLineNo">2581</span>    // Expected result<a name="line.2581"></a>
+<span class="sourceLineNo">2582</span>    KeyValue kv1 = new KeyValue(row1, fam1, col2);<a name="line.2582"></a>
+<span class="sourceLineNo">2583</span>    KeyValue kv2 = new KeyValue(row1, fam1, col4);<a name="line.2583"></a>
+<span class="sourceLineNo">2584</span>    KeyValue[] expected = { kv1, kv2 };<a name="line.2584"></a>
+<span class="sourceLineNo">2585</span><a name="line.2585"></a>
+<span class="sourceLineNo">2586</span>    // Test<a name="line.2586"></a>
+<span class="sourceLineNo">2587</span>    Result res = region.get(get);<a name="line.2587"></a>
+<span class="sourceLineNo">2588</span>    assertEquals(expected.length, res.size());<a name="line.2588"></a>
+<span class="sourceLineNo">2589</span>    for (int i = 0; i &lt; res.size(); i++) {<a name="line.2589"></a>
+<span class="sourceLineNo">2590</span>      assertTrue(CellUtil.matchingRows(expected[i], res.rawCells()[i]));<a name="line.2590"></a>
+<span class="sourceLineNo">2591</span>      assertTrue(CellUtil.matchingFamily(expected[i], res.rawCells()[i]));<a name="line.2591"></a>
+<span class="sourceLineNo">2592</span>      assertTrue(CellUtil.matchingQualifier(expected[i], res.rawCells()[i]));<a name="line.2592"></a>
+<span class="sourceLineNo">2593</span>    }<a name="line.2593"></a>
+<span class="sourceLineNo">2594</span><a name="line.2594"></a>
+<span class="sourceLineNo">2595</span>    // Test using a filter on a Get<a name="line.2595"></a>
+<span class="sourceLineNo">2596</span>    Get g = new Get(row1);<a name="line.2596"></a>
+<span class="sourceLineNo">2597</span>    final int count = 2;<a name="line.2597"></a>
+<span class="sourceLineNo">2598</span>    g.setFilter(new ColumnCountGetFilter(count));<a name="line.2598"></a>
+<span class="sourceLineNo">2599</span>    res = region.get(g);<a name="line.2599"></a>
+<span class="sourceLineNo">2600</span>    assertEquals(count, res.size());<a name="line.2600"></a>
+<span class="sourceLineNo">2601</span>  }<a name="line.2601"></a>
 <span class="sourceLineNo">2602</span><a name="line.2602"></a>
-<span class="sourceLineNo">2603</span>    assertTrue(r.isEmpty());<a name="line.2603"></a>
-<span class="sourceLineNo">2604</span>  }<a name="line.2604"></a>
-<span class="sourceLineNo">2605</span><a name="line.2605"></a>
-<span class="sourceLineNo">2606</span>  @Test<a name="line.2606"></a>
-<span class="sourceLineNo">2607</span>  public void testGetWithFilter() throws IOException, InterruptedException {<a name="line.2607"></a>
-<span class="sourceLineNo">2608</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2608"></a>
-<span class="sourceLineNo">2609</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2609"></a>
-<span class="sourceLineNo">2610</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.2610"></a>
-<span class="sourceLineNo">2611</span>    byte[] value1 = Bytes.toBytes("value1");<a name="line.2611"></a>
-<span class="sourceLineNo">2612</span>    byte[] value2 = Bytes.toBytes("value2");<a name="line.2612"></a>
-<span class="sourceLineNo">2613</span><a name="line.2613"></a>
-<span class="sourceLineNo">2614</span>    final int maxVersions = 3;<a name="line.2614"></a>
-<span class="sourceLineNo">2615</span>    HColumnDescriptor hcd = new HColumnDescriptor(fam1);<a name="line.2615"></a>
-<span class="sourceLineNo">2616</span>    hcd.setMaxVersions(maxVersions);<a name="line.2616"></a>
-<span class="sourceLineNo">2617</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf("testFilterAndColumnTracker"));<a name="line.2617"></a>
-<span class="sourceLineNo">2618</span>    htd.addFamily(hcd);<a name="line.2618"></a>
-<span class="sourceLineNo">2619</span>    ChunkCreator.initialize(MemStoreLABImpl.CHUNK_SIZE_DEFAULT, false, 0, 0, 0, null);<a name="line.2619"></a>
-<span class="sourceLineNo">2620</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.2620"></a>
-<span class="sourceLineNo">2621</span>    Path logDir = TEST_UTIL.getDataTestDirOnTestFS(method + ".log");<a name="line.2621"></a>
-<span class="sourceLineNo">2622</span>    final WAL wal = HBaseTestingUtility.createWal(TEST_UTIL.getConfiguration(), logDir, info);<a name="line.2622"></a>
-<span class="sourceLineNo">2623</span>    this.region = TEST_UTIL.createLocalHRegion(info, htd, wal);<a name="line.2623"></a>
-<span class="sourceLineNo">2624</span><a name="line.2624"></a>
-<span class="sourceLineNo">2625</span>    // Put 4 version to memstore<a name="line.2625"></a>
-<span class="sourceLineNo">2626</span>    long ts = 0;<a name="line.2626"></a>
-<span class="sourceLineNo">2627</span>    Put put = new Put(row1, ts);<a name="line.2627"></a>
-<span class="sourceLineNo">2628</span>    put.addColumn(fam1, col1, value1);<a name="line.2628"></a>
-<span class="sourceLineNo">2629</span>    region.put(put);<a name="line.2629"></a>
-<span class="sourceLineNo">2630</span>    put = new Put(row1, ts + 1);<a name="line.2630"></a>
-<span class="sourceLineNo">2631</span>    put.addColumn(fam1, col1, Bytes.toBytes("filter1"));<a name="line.2631"></a>
-<span class="sourceLineNo">2632</span>    region.put(put);<a name="line.2632"></a>
-<span class="sourceLineNo">2633</span>    put = new Put(row1, ts + 2);<a name="line.2633"></a>
-<span class="sourceLineNo">2634</span>    put.addColumn(fam1, col1, Bytes.toBytes("filter2"));<a name="line.2634"></a>
-<span class="sourceLineNo">2635</span>    region.put(put);<a name="line.2635"></a>
-<span class="sourceLineNo">2636</span>    put = new Put(row1, ts + 3);<a name="line.2636"></a>
-<span class="sourceLineNo">2637</span>    put.addColumn(fam1, col1, value2);<a name="line.2637"></a>
-<span class="sourceLineNo">2638</span>    region.put(put);<a name="line.2638"></a>
-<span class="sourceLineNo">2639</span><a name="line.2639"></a>
-<span class="sourceLineNo">2640</span>    Get get = new Get(row1);<a name="line.2640"></a>
-<span class="sourceLineNo">2641</span>    get.readAllVersions();<a name="line.2641"></a>
-<span class="sourceLineNo">2642</span>    Result res = region.get(get);<a name="line.2642"></a>
-<span class="sourceLineNo">2643</span>    // Get 3 versions, the oldest version has gone from user view<a name="line.2643"></a>
-<span class="sourceLineNo">2644</span>    assertEquals(maxVersions, res.size());<a name="line.2644"></a>
-<span class="sourceLineNo">2645</span><a name="line.2645"></a>
-<span class="sourceLineNo">2646</span>    get.setFilter(new ValueFilter(CompareOperator.EQUAL, new SubstringComparator("value")));<a name="line.2646"></a>
-<span class="sourceLineNo">2647</span>    res = region.get(get);<a name="line.2647"></a>
-<span class="sourceLineNo">2648</span>    // When use value filter, the oldest version should still gone from user view and it<a name="line.2648"></a>
-<span class="sourceLineNo">2649</span>    // should only return one key vaule<a name="line.2649"></a>
-<span class="sourceLineNo">2650</span>    assertEquals(1, res.size());<a name="line.2650"></a>
-<span class="sourceLineNo">2651</span>    assertTrue(CellUtil.matchingValue(new KeyValue(row1, fam1, col1, value2), res.rawCells()[0]));<a name="line.2651"></a>
-<span class="sourceLineNo">2652</span>    assertEquals(ts + 3, res.rawCells()[0].getTimestamp());<a name="line.2652"></a>
-<span class="sourceLineNo">2653</span><a name="line.2653"></a>
-<span class="sourceLineNo">2654</span>    region.flush(true);<a name="line.2654"></a>
-<span class="sourceLineNo">2655</span>    region.compact(true);<a name="line.2655"></a>
-<span class="sourceLineNo">2656</span>    Thread.sleep(1000);<a name="line.2656"></a>
+<span class="sourceLineNo">2603</span>  @Test<a name="line.2603"></a>
+<span class="sourceLineNo">2604</span>  public void testGet_Empty() throws IOException {<a name="line.2604"></a>
+<span class="sourceLineNo">2605</span>    byte[] row = Bytes.toBytes("row");<a name="line.2605"></a>
+<span class="sourceLineNo">2606</span>    byte[] fam = Bytes.toBytes("fam");<a name="line.2606"></a>
+<span class="sourceLineNo">2607</span><a name="line.2607"></a>
+<span class="sourceLineNo">2608</span>    this.region = initHRegion(tableName, method, CONF, fam);<a name="line.2608"></a>
+<span class="sourceLineNo">2609</span>    Get get = new Get(row);<a name="line.2609"></a>
+<span class="sourceLineNo">2610</span>    get.addFamily(fam);<a name="line.2610"></a>
+<span class="sourceLineNo">2611</span>    Result r = region.get(get);<a name="line.2611"></a>
+<span class="sourceLineNo">2612</span><a name="line.2612"></a>
+<span class="sourceLineNo">2613</span>    assertTrue(r.isEmpty());<a name="line.2613"></a>
+<span class="sourceLineNo">2614</span>  }<a name="line.2614"></a>
+<span class="sourceLineNo">2615</span><a name="line.2615"></a>
+<span class="sourceLineNo">2616</span>  @Test<a name="line.2616"></a>
+<span class="sourceLineNo">2617</span>  public void testGetWithFilter() throws IOException, InterruptedException {<a name="line.2617"></a>
+<span class="sourceLineNo">2618</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2618"></a>
+<span class="sourceLineNo">2619</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2619"></a>
+<span class="sourceLineNo">2620</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.2620"></a>
+<span class="sourceLineNo">2621</span>    byte[] value1 = Bytes.toBytes("value1");<a name="line.2621"></a>
+<span class="sourceLineNo">2622</span>    byte[] value2 = Bytes.toBytes("value2");<a name="line.2622"></a>
+<span class="sourceLineNo">2623</span><a name="line.2623"></a>
+<span class="sourceLineNo">2624</span>    final int maxVersions = 3;<a name="line.2624"></a>
+<span class="sourceLineNo">2625</span>    HColumnDescriptor hcd = new HColumnDescriptor(fam1);<a name="line.2625"></a>
+<span class="sourceLineNo">2626</span>    hcd.setMaxVersions(maxVersions);<a name="line.2626"></a>
+<span class="sourceLineNo">2627</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf("testFilterAndColumnTracker"));<a name="line.2627"></a>
+<span class="sourceLineNo">2628</span>    htd.addFamily(hcd);<a name="line.2628"></a>
+<span class="sourceLineNo">2629</span>    ChunkCreator.initialize(MemStoreLABImpl.CHUNK_SIZE_DEFAULT, false, 0, 0, 0, null);<a name="line.2629"></a>
+<span class="sourceLineNo">2630</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.2630"></a>
+<span class="sourceLineNo">2631</span>    Path logDir = TEST_UTIL.getDataTestDirOnTestFS(method + ".log");<a name="line.2631"></a>
+<span class="sourceLineNo">2632</span>    final WAL wal = HBaseTestingUtility.createWal(TEST_UTIL.getConfiguration(), logDir, info);<a name="line.2632"></a>
+<span class="sourceLineNo">2633</span>    this.region = TEST_UTIL.createLocalHRegion(info, htd, wal);<a name="line.2633"></a>
+<span class="sourceLineNo">2634</span><a name="line.2634"></a>
+<span class="sourceLineNo">2635</span>    // Put 4 version to memstore<a name="line.2635"></a>
+<span class="sourceLineNo">2636</span>    long ts = 0;<a name="line.2636"></a>
+<span class="sourceLineNo">2637</span>    Put put = new Put(row1, ts);<a name="line.2637"></a>
+<span class="sourceLineNo">2638</span>    put.addColumn(fam1, col1, value1);<a name="line.2638"></a>
+<span class="sourceLineNo">2639</span>    region.put(put);<a name="line.2639"></a>
+<span class="sourceLineNo">2640</span>    put = new Put(row1, ts + 1);<a name="line.2640"></a>
+<span class="sourceLineNo">2641</span>    put.addColumn(fam1, col1, Bytes.toBytes("filter1"));<a name="line.2641"></a>
+<span class="sourceLineNo">2642</span>    region.put(put);<a name="line.2642"></a>
+<span class="sourceLineNo">2643</span>    put = new Put(row1, ts + 2);<a name="line.2643"></a>
+<span class="sourceLineNo">2644</span>    put.addColumn(fam1, col1, Bytes.toBytes("filter2"));<a name="line.2644"></a>
+<span class="sourceLineNo">2645</span>    region.put(put);<a name="line.2645"></a>
+<span class="sourceLineNo">2646</span>    put = new Put(row1, ts + 3);<a name="line.2646"></a>
+<span class="sourceLineNo">2647</span>    put.addColumn(fam1, col1, value2);<a name="line.2647"></a>
+<span class="sourceLineNo">2648</span>    region.put(put);<a name="line.2648"></a>
+<span class="sourceLineNo">2649</span><a name="line.2649"></a>
+<span class="sourceLineNo">2650</span>    Get get = new Get(row1);<a name="line.2650"></a>
+<span class="sourceLineNo">2651</span>    get.readAllVersions();<a name="line.2651"></a>
+<span class="sourceLineNo">2652</span>    Result res = region.get(get);<a name="line.2652"></a>
+<span class="sourceLineNo">2653</span>    // Get 3 versions, the oldest version has gone from user view<a name="line.2653"></a>
+<span class="sourceLineNo">2654</span>    assertEquals(maxVersions, res.size());<a name="line.2654"></a>
+<span class="sourceLineNo">2655</span><a name="line.2655"></a>
+<span class="sourceLineNo">2656</span>    get.setFilter(new ValueFilter(CompareOperator.EQUAL, new SubstringComparator("value")));<a name="line.2656"></a>
 <span class="sourceLineNo">2657</span>    res = region.get(get);<a name="line.2657"></a>
-<span class="sourceLineNo">2658</span>    // After flush and compact, the result should be consistent with previous result<a name="line.2658"></a>
-<span class="sourceLineNo">2659</span>    assertEquals(1, res.size());<a name="line.2659"></a>
-<span class="sourceLineNo">2660</span>    assertTrue(CellUtil.matchingValue(new KeyValue(row1, fam1, col1, value2), res.rawCells()[0]));<a name="line.2660"></a>
-<span class="sourceLineNo">2661</span>  }<a name="line.2661"></a>
-<span class="sourceLineNo">2662</span><a name="line.2662"></a>
-<span class="sourceLineNo">2663</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2663"></a>
-<span class="sourceLineNo">2664</span>  // Scanner tests<a name="line.2664"></a>
-<span class="sourceLineNo">2665</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2665"></a>
-<span class="sourceLineNo">2666</span>  @Test<a name="line.2666"></a>
-<span class="sourceLineNo">2667</span>  public void testGetScanner_WithOkFamilies() throws IOException {<a name="line.2667"></a>
-<span class="sourceLineNo">2668</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2668"></a>
-<span class="sourceLineNo">2669</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2669"></a>
-<span class="sourceLineNo">2670</span><a name="line.2670"></a>
-<span class="sourceLineNo">2671</span>    byte[][] families = { fam1, fam2 };<a name="line.2671"></a>
+<span class="sourceLineNo">2658</span>    // When use value filter, the oldest version should still gone from user view and it<a name="line.2658"></a>
+<span class="sourceLineNo">2659</span>    // should only return one key vaule<a name="line.2659"></a>
+<span class="sourceLineNo">2660</span>    assertEquals(1, res.size());<a name="line.2660"></a>
+<span class="sourceLineNo">2661</span>    assertTrue(CellUtil.matchingValue(new KeyValue(row1, fam1, col1, value2), res.rawCells()[0]));<a name="line.2661"></a>
+<span class="sourceLineNo">2662</span>    assertEquals(ts + 3, res.rawCells()[0].getTimestamp());<a name="line.2662"></a>
+<span class="sourceLineNo">2663</span><a name="line.2663"></a>
+<span class="sourceLineNo">2664</span>    region.flush(true);<a name="line.2664"></a>
+<span class="sourceLineNo">2665</span>    region.compact(true);<a name="line.2665"></a>
+<span class="sourceLineNo">2666</span>    Thread.sleep(1000);<a name="line.2666"></a>
+<span class="sourceLineNo">2667</span>    res = region.get(get);<a name="line.2667"></a>
+<span class="sourceLineNo">2668</span>    // After flush and compact, the result should be consistent with previous result<a name="line.2668"></a>
+<span class="sourceLineNo">2669</span>    assertEquals(1, res.size());<a name="line.2669"></a>
+<span class="sourceLineNo">2670</span>    assertTrue(CellUtil.matchingValue(new KeyValue(row1, fam1, col1, value2), res.rawCells()[0]));<a name="line.2670"></a>
+<span class="sourceLineNo">2671</span>  }<a name="line.2671"></a>
 <span class="sourceLineNo">2672</span><a name="line.2672"></a>
-<span class="sourceLineNo">2673</span>    // Setting up region<a name="line.2673"></a>
-<span class="sourceLineNo">2674</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2674"></a>
-<span class="sourceLineNo">2675</span>    Scan scan = new Scan();<a name="line.2675"></a>
-<span class="sourceLineNo">2676</span>    scan.addFamily(fam1);<a name="line.2676"></a>
-<span class="sourceLineNo">2677</span>    scan.addFamily(fam2);<a name="line.2677"></a>
-<span class="sourceLineNo">2678</span>    try {<a name="line.2678"></a>
-<span class="sourceLineNo">2679</span>      region.getScanner(scan);<a name="line.2679"></a>
-<span class="sourceLineNo">2680</span>    } catch (Exception e) {<a name="line.2680"></a>
-<span class="sourceLineNo">2681</span>      assertTrue("Families could not be found in Region", false);<a name="line.2681"></a>
-<span class="sourceLineNo">2682</span>    }<a name="line.2682"></a>
-<span class="sourceLineNo">2683</span>  }<a name="line.2683"></a>
-<span class="sourceLineNo">2684</span><a name="line.2684"></a>
-<span class="sourceLineNo">2685</span>  @Test<a name="line.2685"></a>
-<span class="sourceLineNo">2686</span>  public void testGetScanner_WithNotOkFamilies() throws IOException {<a name="line.2686"></a>
-<span class="sourceLineNo">2687</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2687"></a>
-<span class="sourceLineNo">2688</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2688"></a>
-<span class="sourceLineNo">2689</span><a name="line.2689"></a>
-<span class="sourceLineNo">2690</span>    byte[][] families = { fam1 };<a name="line.2690"></a>
-<span class="sourceLineNo">2691</span><a name="line.2691"></a>
-<span class="sourceLineNo">2692</span>    // Setting up region<a name="line.2692"></a>
-<span class="sourceLineNo">2693</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2693"></a>
-<span class="sourceLineNo">2694</span>    Scan scan = new Scan();<a name="line.2694"></a>
-<span class="sourceLineNo">2695</span>    scan.addFamily(fam2);<a name="line.2695"></a>
-<span class="sourceLineNo">2696</span>    boolean ok = false;<a name="line.2696"></a>
-<span class="sourceLineNo">2697</span>    try {<a name="line.2697"></a>
-<span class="sourceLineNo">2698</span>      region.getScanner(scan);<a name="line.2698"></a>
-<span class="sourceLineNo">2699</span>    } catch (Exception e) {<a name="line.2699"></a>
-<span class="sourceLineNo">2700</span>      ok = true;<a name="line.2700"></a>
-<span class="sourceLineNo">2701</span>    }<a name="line.2701"></a>
-<span class="sourceLineNo">2702</span>    assertTrue("Families could not be found in Region", ok);<a name="line.2702"></a>
-<span class="sourceLineNo">2703</span>  }<a name="line.2703"></a>
-<span class="sourceLineNo">2704</span><a name="line.2704"></a>
-<span class="sourceLineNo">2705</span>  @Test<a name="line.2705"></a>
-<span class="sourceLineNo">2706</span>  public void testGetScanner_WithNoFamilies() throws IOException {<a name="line.2706"></a>
-<span class="sourceLineNo">2707</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2707"></a>
-<span class="sourceLineNo">2708</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2708"></a>
-<span class="sourceLineNo">2709</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2709"></a>
-<span class="sourceLineNo">2710</span>    byte[] fam3 = Bytes.toBytes("fam3");<a name="line.2710"></a>
-<span class="sourceLineNo">2711</span>    byte[] fam4 = Bytes.toBytes("fam4");<a name="line.2711"></a>
-<span class="sourceLineNo">2712</span><a name="line.2712"></a>
-<span class="sourceLineNo">2713</span>    byte[][] families = { fam1, fam2, fam3, fam4 };<a name="line.2713"></a>
+<span class="sourceLineNo">2673</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2673"></a>
+<span class="sourceLineNo">2674</span>  // Scanner tests<a name="line.2674"></a>
+<span class="sourceLineNo">2675</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2675"></a>
+<span class="sourceLineNo">2676</span>  @Test<a name="line.2676"></a>
+<span class="sourceLineNo">2677</span>  public void testGetScanner_WithOkFamilies() throws IOException {<a name="line.2677"></a>
+<span class="sourceLineNo">2678</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2678"></a>
+<span class="sourceLineNo">2679</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2679"></a>
+<span class="sourceLineNo">2680</span><a name="line.2680"></a>
+<span class="sourceLineNo">2681</span>    byte[][] families = { fam1, fam2 };<a name="line.2681"></a>
+<span class="sourceLineNo">2682</span><a name="line.2682"></a>
+<span class="sourceLineNo">2683</span>    // Setting up region<a name="line.2683"></a>
+<span class="sourceLineNo">2684</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2684"></a>
+<span class="sourceLineNo">2685</span>    Scan scan = new Scan();<a name="line.2685"></a>
+<span class="sourceLineNo">2686</span>    scan.addFamily(fam1);<a name="line.2686"></a>
+<span class="sourceLineNo">2687</span>    scan.addFamily(fam2);<a name="line.2687"></a>
+<span class="sourceLineNo">2688</span>    try {<a name="line.2688"></a>
+<span class="sourceLineNo">2689</span>      region.getScanner(scan);<a name="line.2689"></a>
+<span class="sourceLineNo">2690</span>    } catch (Exception e) {<a name="line.2690"></a>
+<span class="sourceLineNo">2691</span>      assertTrue("Families could not be found in Region", false);<a name="line.2691"></a>
+<span class="sourceLineNo">2692</span>    }<a name="line.2692"></a>
+<span class="sourceLineNo">2693</span>  }<a name="line.2693"></a>
+<span class="sourceLineNo">2694</span><a name="line.2694"></a>
+<span class="sourceLineNo">2695</span>  @Test<a name="line.2695"></a>
+<span class="sourceLineNo">2696</span>  public void testGetScanner_WithNotOkFamilies() throws IOException {<a name="line.2696"></a>
+<span class="sourceLineNo">2697</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2697"></a>
+<span class="sourceLineNo">2698</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2698"></a>
+<span class="sourceLineNo">2699</span><a name="line.2699"></a>
+<span class="sourceLineNo">2700</span>    byte[][] families = { fam1 };<a name="line.2700"></a>
+<span class="sourceLineNo">2701</span><a name="line.2701"></a>
+<span class="sourceLineNo">2702</span>    // Setting up region<a name="line.2702"></a>
+<span class="sourceLineNo">2703</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2703"></a>
+<span class="sourceLineNo">2704</span>    Scan scan = new Scan();<a name="line.2704"></a>
+<span class="sourceLineNo">2705</span>    scan.addFamily(fam2);<a name="line.2705"></a>
+<span class="sourceLineNo">2706</span>    boolean ok = false;<a name="line.2706"></a>
+<span class="sourceLineNo">2707</span>    try {<a name="line.2707"></a>
+<span class="sourceLineNo">2708</span>      region.getScanner(scan);<a name="line.2708"></a>
+<span class="sourceLineNo">2709</span>    } catch (Exception e) {<a name="line.2709"></a>
+<span class="sourceLineNo">2710</span>      ok = true;<a name="line.2710"></a>
+<span class="sourceLineNo">2711</span>    }<a name="line.2711"></a>
+<span class="sourceLineNo">2712</span>    assertTrue("Families could not be found in Region", ok);<a name="line.2712"></a>
+<span class="sourceLineNo">2713</span>  }<a name="line.2713"></a>
 <span class="sourceLineNo">2714</span><a name="line.2714"></a>
-<span class="sourceLineNo">2715</span>    // Setting up region<a name="line.2715"></a>
-<span class="sourceLineNo">2716</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2716"></a>
-<span class="sourceLineNo">2717</span>    // Putting data in Region<a name="line.2717"></a>
-<span class="sourceLineNo">2718</span>    Put put = new Put(row1);<a name="line.2718"></a>
-<span class="sourceLineNo">2719</span>    put.addColumn(fam1, null, null);<a name="line.2719"></a>
-<span class="sourceLineNo">2720</span>    put.addColumn(fam2, null, null);<a name="line.2720"></a>
-<span class="sourceLineNo">2721</span>    put.addColumn(fam3, null, null);<a name="line.2721"></a>
-<span class="sourceLineNo">2722</span>    put.addColumn(fam4, null, null);<a name="line.2722"></a>
-<span class="sourceLineNo">2723</span>    region.put(put);<a name="line.2723"></a>
+<span class="sourceLineNo">2715</span>  @Test<a name="line.2715"></a>
+<span class="sourceLineNo">2716</span>  public void testGetScanner_WithNoFamilies() throws IOException {<a name="line.2716"></a>
+<span class="sourceLineNo">2717</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2717"></a>
+<span class="sourceLineNo">2718</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2718"></a>
+<span class="sourceLineNo">2719</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2719"></a>
+<span class="sourceLineNo">2720</span>    byte[] fam3 = Bytes.toBytes("fam3");<a name="line.2720"></a>
+<span class="sourceLineNo">2721</span>    byte[] fam4 = Bytes.toBytes("fam4");<a name="line.2721"></a>
+<span class="sourceLineNo">2722</span><a name="line.2722"></a>
+<span class="sourceLineNo">2723</span>    byte[][] families = { fam1, fam2, fam3, fam4 };<a name="line.2723"></a>
 <span class="sourceLineNo">2724</span><a name="line.2724"></a>
-<span class="sourceLineNo">2725</span>    Scan scan = null;<a name="line.2725"></a>
-<span class="sourceLineNo">2726</span>    HRegion.RegionScannerImpl is = null;<a name="line.2726"></a>
-<span class="sourceLineNo">2727</span><a name="line.2727"></a>
-<span class="sourceLineNo">2728</span>    // Testing to see how many scanners that is produced by getScanner,<a name="line.2728"></a>
-<span class="sourceLineNo">2729</span>    // starting<a name="line.2729"></a>
-<span class="sourceLineNo">2730</span>    // with known number, 2 - current = 1<a name="line.2730"></a>
-<span class="sourceLineNo">2731</span>    scan = new Scan();<a name="line.2731"></a>
-<span class="sourceLineNo">2732</span>    scan.addFamily(fam2);<a name="line.2732"></a>
-<span class="sourceLineNo">2733</span>    scan.addFamily(fam4);<a name="line.2733"></a>
-<span class="sourceLineNo">2734</span>    is = region.getScanner(scan);<a name="line.2734"></a>
-<span class="sourceLineNo">2735</span>    assertEquals(1, is.storeHeap.getHeap().size());<a name="line.2735"></a>
-<span class="sourceLineNo">2736</span><a name="line.2736"></a>
-<span class="sourceLineNo">2737</span>    scan = new Scan();<a name="line.2737"></a>
-<span class="sourceLineNo">2738</span>    is = region.getScanner(scan);<a name="line.2738"></a>
-<span class="sourceLineNo">2739</span>    assertEquals(families.length - 1, is.storeHeap.getHeap().size());<a name="line.2739"></a>
-<span class="sourceLineNo">2740</span>  }<a name="line.2740"></a>
-<span class="sourceLineNo">2741</span><a name="line.2741"></a>
-<span class="sourceLineNo">2742</span>  /**<a name="line.2742"></a>
-<span class="sourceLineNo">2743</span>   * This method tests https://issues.apache.org/jira/browse/HBASE-2516.<a name="line.2743"></a>
-<span class="sourceLineNo">2744</span>   *<a name="line.2744"></a>
-<span class="sourceLineNo">2745</span>   * @throws IOException<a name="line.2745"></a>
-<span class="sourceLineNo">2746</span>   */<a name="line.2746"></a>
-<span class="sourceLineNo">2747</span>  @Test<a name="line.2747"></a>
-<span class="sourceLineNo">2748</span>  public void testGetScanner_WithRegionClosed() throws IOException {<a name="line.2748"></a>
-<span class="sourceLineNo">2749</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2749"></a>
-<span class="sourceLineNo">2750</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2750"></a>
+<span class="sourceLineNo">2725</span>    // Setting up region<a name="line.2725"></a>
+<span class="sourceLineNo">2726</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2726"></a>
+<span class="sourceLineNo">2727</span>    // Putting data in Region<a name="line.2727"></a>
+<span class="sourceLineNo">2728</span>    Put put = new Put(row1);<a name="line.2728"></a>
+<span class="sourceLineNo">2729</span>    put.addColumn(fam1, null, null);<a name="line.2729"></a>
+<span class="sourceLineNo">2730</span>    put.addColumn(fam2, null, null);<a name="line.2730"></a>
+<span class="sourceLineNo">2731</span>    put.addColumn(fam3, null, null);<a name="line.2731"></a>
+<span class="sourceLineNo">2732</span>    put.addColumn(fam4, null, null);<a name="line.2732"></a>
+<span class="sourceLineNo">2733</span>    region.put(put);<a name="line.2733"></a>
+<span class="sourceLineNo">2734</span><a name="line.2734"></a>
+<span class="sourceLineNo">2735</span>    Scan scan = null;<a name="line.2735"></a>
+<span class="sourceLineNo">2736</span>    HRegion.RegionScannerImpl is = null;<a name="line.2736"></a>
+<span class="sourceLineNo">2737</span><a name="line.2737"></a>
+<span class="sourceLineNo">2738</span>    // Testing to see how many scanners that is produced by getScanner,<a name="line.2738"></a>
+<span class="sourceLineNo">2739</span>    // starting<a name="line.2739"></a>
+<span class="sourceLineNo">2740</span>    // with known number, 2 - current = 1<a name="line.2740"></a>
+<span class="sourceLineNo">2741</span>    scan = new Scan();<a name="line.2741"></a>
+<span class="sourceLineNo">2742</span>    scan.addFamily(fam2);<a name="line.2742"></a>
+<span class="sourceLineNo">2743</span>    scan.addFamily(fam4);<a name="line.2743"></a>
+<span class="sourceLineNo">2744</span>    is = region.getScanner(scan);<a name="line.2744"></a>
+<span class="sourceLineNo">2745</span>    assertEquals(1, is.storeHeap.getHeap().size());<a name="line.2745"></a>
+<span class="sourceLineNo">2746</span><a name="line.2746"></a>
+<span class="sourceLineNo">2747</span>    scan = new Scan();<a name="line.2747"></a>
+<span class="sourceLineNo">2748</span>    is = region.getScanner(scan);<a name="line.2748"></a>
+<span class="sourceLineNo">2749</span>    assertEquals(families.length - 1, is.storeHeap.getHeap().size());<a name="line.2749"></a>
+<span class="sourceLineNo">2750</span>  }<a name="line.2750"></a>
 <span class="sourceLineNo">2751</span><a name="line.2751"></a>
-<span class="sourceLineNo">2752</span>    byte[][] families = { fam1, fam2 };<a name="line.2752"></a>
-<span class="sourceLineNo">2753</span><a name="line.2753"></a>
-<span class="sourceLineNo">2754</span>    // Setting up region<a name="line.2754"></a>
-<span class="sourceLineNo">2755</span>    try {<a name="line.2755"></a>
-<span class="sourceLineNo">2756</span>      this.region = initHRegion(tableName, method, CONF, families);<a name="line.2756"></a>
-<span class="sourceLineNo">2757</span>    } catch (IOException e) {<a name="line.2757"></a>
-<span class="sourceLineNo">2758</span>      e.printStackTrace();<a name="line.2758"></a>
-<span class="sourceLineNo">2759</span>      fail("Got IOException during initHRegion, " + e.getMessage());<a name="line.2759"></a>
-<span class="sourceLineNo">2760</span>    }<a name="line.2760"></a>
-<span class="sourceLineNo">2761</span>    region.closed.set(true);<a name="line.2761"></a>
-<span class="sourceLineNo">2762</span>    try {<a name="line.2762"></a>
-<span class="sourceLineNo">2763</span>      region.getScanner(null);<a name="line.2763"></a>
-<span class="sourceLineNo">2764</span>      fail("Expected to get an exception during getScanner on a region that is closed");<a name="line.2764"></a>
-<span class="sourceLineNo">2765</span>    } catch (NotServingRegionException e) {<a name="line.2765"></a>
-<span class="sourceLineNo">2766</span>      // this is the correct exception that is expected<a name="line.2766"></a>
+<span class="sourceLineNo">2752</span>  /**<a name="line.2752"></a>
+<span class="sourceLineNo">2753</span>   * This method tests https://issues.apache.org/jira/browse/HBASE-2516.<a name="line.2753"></a>
+<span class="sourceLineNo">2754</span>   *<a name="line.2754"></a>
+<span class="sourceLineNo">2755</span>   * @throws IOException<a name="line.2755"></a>
+<span class="sourceLineNo">2756</span>   */<a name="line.2756"></a>
+<span class="sourceLineNo">2757</span>  @Test<a name="line.2757"></a>
+<span class="sourceLineNo">2758</span>  public void testGetScanner_WithRegionClosed() throws IOException {<a name="line.2758"></a>
+<span class="sourceLineNo">2759</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2759"></a>
+<span class="sourceLineNo">2760</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2760"></a>
+<span class="sourceLineNo">2761</span><a name="line.2761"></a>
+<span class="sourceLineNo">2762</span>    byte[][] families = { fam1, fam2 };<a name="line.2762"></a>
+<span class="sourceLineNo">2763</span><a name="line.2763"></a>
+<span class="sourceLineNo">2764</span>    // Setting up region<a name="line.2764"></a>
+<span class="sourceLineNo">2765</span>    try {<a name="line.2765"></a>
+<span class="sourceLineNo">2766</span>      this.region = initHRegion(tableName, method, CONF, families);<a name="line.2766"></a>
 <span class="sourceLineNo">2767</span>    } catch (IOException e) {<a name="line.2767"></a>
-<span class="sourceLineNo">2768</span>      fail("Got wrong type of exception - should be a NotServingRegionException, " +<a name="line.2768"></a>
-<span class="sourceLineNo">2769</span>          "but was an IOException: "<a name="line.2769"></a>
-<span class="sourceLineNo">2770</span>          + e.getMessage());<a name="line.2770"></a>
-<span class="sourceLineNo">2771</span>    }<a name="line.2771"></a>
-<span class="sourceLineNo">2772</span>  }<a name="line.2772"></a>
-<span class="sourceLineNo">2773</span><a name="line.2773"></a>
-<span class="sourceLineNo">2774</span>  @Test<a name="line.2774"></a>
-<span class="sourceLineNo">2775</span>  public void testRegionScanner_Next() throws IOException {<a name="line.2775"></a>
-<span class="sourceLineNo">2776</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2776"></a>
-<span class="sourceLineNo">2777</span>    byte[] row2 = Bytes.toBytes("row2");<a name="line.2777"></a>
-<span class="sourceLineNo">2778</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2778"></a>
-<span class="sourceLineNo">2779</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2779"></a>
-<span class="sourceLineNo">2780</span>    byte[] fam3 = Bytes.toBytes("fam3");<a name="line.2780"></a>
-<span class="sourceLineNo">2781</span>    byte[] fam4 = Bytes.toBytes("fam4");<a name="line.2781"></a>
-<span class="sourceLineNo">2782</span><a name="line.2782"></a>
-<span class="sourceLineNo">2783</span>    byte[][] families = { fam1, fam2, fam3, fam4 };<a name="line.2783"></a>
-<span class="sourceLineNo">2784</span>    long ts = System.currentTimeMillis();<a name="line.2784"></a>
-<span class="sourceLineNo">2785</span><a name="line.2785"></a>
-<span class="sourceLineNo">2786</span>    // Setting up region<a name="line.2786"></a>
-<span class="sourceLineNo">2787</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2787"></a>
-<span class="sourceLineNo">2788</span>    // Putting data in Region<a name="line.2788"></a>
-<span class="sourceLineNo">2789</span>    Put put = null;<a name="line.2789"></a>
-<span class="sourceLineNo">2790</span>    put = new Put(row1);<a name="line.2790"></a>
-<span class="sourceLineNo">2791</span>    put.addColumn(fam1, (byte[]) null, ts, null);<a name="line.2791"></a>
-<span class="sourceLineNo">2792</span>    put.addColumn(fam2, (byte[]) null, ts, null);<a name="line.2792"></a>
-<span class="sourceLineNo">2793</span>    put.addColumn(fam3, (byte[]) null, ts, null);<a name="line.2793"></a>
-<span class="sourceLineNo">2794</span>    put.addColumn(fam4, (byte[]) null, ts, null);<a name="line.2794"></a>
-<span class="sourceLineNo">2795</span>    region.put(put);<a name="line.2795"></a>
-<span class="sourceLineNo">2796</span><a name="line.2796"></a>
-<span class="sourceLineNo">2797</span>    put = new Put(row2);<a name="line.2797"></a>
-<span class="sourceLineNo">2798</span>    put.addColumn(fam1, (byte[]) null, ts, null);<a name="line.2798"></a>
-<span class="sourceLineNo">2799</span>    put.addColumn(fam2, (byte[]) null, ts, null);<a name="line.2799"></a>
-<span class="sourceLineNo">2800</span>    put.addColumn(fam3, (byte[]) null, ts, null);<a name="line.2800"></a>
-<span class="sourceLineNo">2801</span>    put.addColumn(fam4, (byte[]) null, ts, null);<a name="line.2801"></a>
-<span class="sourceLineNo">2802</span>    region.put(put);<a name="line.2802"></a>
-<span class="sourceLineNo">2803</span><a name="line.2803"></a>
-<span class="sourceLineNo">2804</span>    Scan scan = new Scan();<a name="line.2804"></a>
-<span class="sourceLineNo">2805</span>    scan.addFamily(fam2);<a name="line.2805"></a>
-<span class="sourceLineNo">2806</span>    scan.addFamily(fam4);<a name="line.2806"></a>
-<span class="sourceLineNo">2807</span>    InternalScanner is = region.getScanner(scan);<a name="line.2807"></a>
-<span class="sourceLineNo">2808</span><a name="line.2808"></a>
-<span class="sourceLineNo">2809</span>    List&lt;Cell&gt; res = null;<a name="line.2809"></a>
-<span class="sourceLineNo">2810</span><a name="line.2810"></a>
-<span class="sourceLineNo">2811</span>    // Result 1<a name="line.2811"></a>
-<span class="sourceLineNo">2812</span>    List&lt;Cell&gt; expected1 = new ArrayList&lt;&gt;();<a name="line.2812"></a>
-<span class="sourceLineNo">2813</span>    expected1.add(new KeyValue(row1, fam2, null, ts, KeyValue.Type.Put, null));<a name="line.2813"></a>
-<span class="sourceLineNo">2814</span>    expected1.add(new KeyValue(row1, fam4, null, ts, KeyValue.Type.Put, null));<a name="line.2814"></a>
-<span class="sourceLineNo">2815</span><a name="line.2815"></a>
-<span class="sourceLineNo">2816</span>    res = new ArrayList&lt;&gt;();<a name="line.2816"></a>
-<span class="sourceLineNo">2817</span>    is.next(res);<a name="line.2817"></a>
-<span class="sourceLineNo">2818</span>    for (int i = 0; i &lt; res.size(); i++) {<a name="line.2818"></a>
-<span class="sourceLineNo">2819</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected1.get(i), res.get(i)));<a name="line.2819"></a>
-<span class="sourceLineNo">2820</span>    }<a name="line.2820"></a>
-<span class="sourceLineNo">2821</span><a name="line.2821"></a>
-<span class="sourceLineNo">2822</span>    // Result 2<a name="line.2822"></a>
-<span class="sourceLineNo">2823</span>    List&lt;Cell&gt; expected2 = new ArrayList&lt;&gt;();<a name="line.2823"></a>
-<span class="sourceLineNo">2824</span>    expected2.add(new KeyValue(row2, fam2, null, ts, KeyValue.Type.Put, null));<a name="line.2824"></a>
-<span class="sourceLineNo">2825</span>    expected2.add(new KeyValue(row2, fam4, null, ts, KeyValue.Type.Put, null));<a name="line.2825"></a>
-<span class="sourceLineNo">2826</span><a name="line.2826"></a>
-<span class="sourceLineNo">2827</span>    res = new ArrayList&lt;&gt;();<a name="line.2827"></a>
-<span class="sourceLineNo">2828</span>    is.next(res);<a name="line.2828"></a>
-<span class="sourceLineNo">2829</span>    for (int i = 0; i &lt; res.size(); i++) {<a name="line.2829"></a>
-<span class="sourceLineNo">2830</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected2.get(i), res.get(i)));<a name="line.2830"></a>
-<span class="sourceLineNo">2831</span>    }<a name="line.2831"></a>
-<span class="sourceLineNo">2832</span>  }<a name="line.2832"></a>
-<span class="sourceLineNo">2833</span><a name="line.2833"></a>
-<span class="sourceLineNo">2834</span>  @Test<a name="line.2834"></a>
-<span class="sourceLineNo">2835</span>  public void testScanner_ExplicitColumns_FromMemStore_EnforceVersions() throws IOException {<a name="line.2835"></a>
-<span class="sourceLineNo">2836</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2836"></a>
-<span class="sourceLineNo">2837</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.2837"></a>
-<span class="sourceLineNo">2838</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.2838"></a>
-<span class="sourceLineNo">2839</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2839"></a>
-<span class="sourceLineNo">2840</span>    byte[][] families = { fam1 };<a name="line.2840"></a>
-<span class="sourceLineNo">2841</span><a name="line.2841"></a>
-<span class="sourceLineNo">2842</span>    long ts1 = System.currentTimeMillis();<a name="line.2842"></a>
-<span class="sourceLineNo">2843</span>    long ts2 = ts1 + 1;<a name="line.2843"></a>
-<span class="sourceLineNo">2844</span>    long ts3 = ts1 + 2;<a name="line.2844"></a>
-<span class="sourceLineNo">2845</span><a name="line.2845"></a>
-<span class="sourceLineNo">2846</span>    // Setting up region<a name="line.2846"></a>
-<span class="sourceLineNo">2847</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2847"></a>
-<span class="sourceLineNo">2848</span>    // Putting data in Region<a name="line.2848"></a>
-<span class="sourceLineNo">2849</span>    Put put = null;<a name="line.2849"></a>
-<span class="sourceLineNo">2850</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.2850"></a>
-<span class="sourceLineNo">2851</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.2851"></a>
-<span class="sourceLineNo">2852</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.2852"></a>
-<span class="sourceLineNo">2853</span><a name="line.2853"></a>
-<span class="sourceLineNo">2854</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.2854"></a>
-<span class="sourceLineNo">2855</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.2855"></a>
-<span class="sourceLineNo">2856</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.2856"></a>
-<span class="sourceLineNo">2857</span><a name="line.2857"></a>
-<span class="sourceLineNo">2858</span>    put = new Put(row1);<a name="line.2858"></a>
-<span class="sourceLineNo">2859</span>    put.add(kv13);<a name="line.2859"></a>
-<span class="sourceLineNo">2860</span>    put.add(kv12);<a name="line.2860"></a>
-<span class="sourceLineNo">2861</span>    put.add(kv11);<a name="line.2861"></a>
-<span class="sourceLineNo">2862</span>    put.add(kv23);<a name="line.2862"></a>
-<span class="sourceLineNo">2863</span>    put.add(kv22);<a name="line.2863"></a>
-<span class="sourceLineNo">2864</span>    put.add(kv21);<a name="line.2864"></a>
-<span class="sourceLineNo">2865</span>    region.put(put);<a name="line.2865"></a>
-<span class="sourceLineNo">2866</span><a name="line.2866"></a>
-<span class="sourceLineNo">2867</span>    // Expected<a name="line.2867"></a>
-<span class="sourceLineNo">2868</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.2868"></a>
-<span class="sourceLineNo">2869</span>    expected.add(kv13);<a name="line.2869"></a>
-<span class="sourceLineNo">2870</span>    expected.add(kv12);<a name="line.2870"></a>
-<span class="sourceLineNo">2871</span><a name="line.2871"></a>
-<span class="sourceLineNo">2872</span>    Scan scan = new Scan(row1);<a name="line.2872"></a>
-<span class="sourceLineNo">2873</span>    scan.addColumn(fam1, qf1);<a name="line.2873"></a>
-<span class="sourceLineNo">2874</span>    scan.setMaxVersions(MAX_VERSIONS);<a name="line.2874"></a>
-<span class="sourceLineNo">2875</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.2875"></a>
-<span class="sourceLineNo">2876</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.2876"></a>
-<span class="sourceLineNo">2877</span><a name="line.2877"></a>
-<span class="sourceLineNo">2878</span>    boolean hasNext = scanner.next(actual);<a name="line.2878"></a>
-<span class="sourceLineNo">2879</span>    assertEquals(false, hasNext);<a name="line.2879"></a>
-<span class="sourceLineNo">2880</span><a name="line.2880"></a>
-<span class="sourceLineNo">2881</span>    // Verify result<a name="line.2881"></a>
-<span class="sourceLineNo">2882</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.2882"></a>
-<span class="sourceLineNo">2883</span>      assertEquals(expected.get(i), actual.get(i));<a name="line.2883"></a>
-<span class="sourceLineNo">2884</span>    }<a name="line.2884"></a>
-<span class="sourceLineNo">2885</span>  }<a name="line.2885"></a>
-<span class="sourceLineNo">2886</span><a name="line.2886"></a>
-<span class="sourceLineNo">2887</span>  @Test<a name="line.2887"></a>
-<span class="sourceLineNo">2888</span>  public void testScanner_ExplicitColumns_FromFilesOnly_EnforceVersions() throws IOException {<a name="line.2888"></a>
-<span class="sourceLineNo">2889</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2889"></a>
-<span class="sourceLineNo">2890</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.2890"></a>
-<span class="sourceLineNo">2891</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.2891"></a>
-<span class="sourceLineNo">2892</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2892"></a>
-<span class="sourceLineNo">2893</span>    byte[][] families = { fam1 };<a name="line.2893"></a>
-<span class="sourceLineNo">2894</span><a name="line.2894"></a>
-<span class="sourceLineNo">2895</span>    long ts1 = 1; // System.currentTimeMillis();<a name="line.2895"></a>
-<span class="sourceLineNo">2896</span>    long ts2 = ts1 + 1;<a name="line.2896"></a>
-<span class="sourceLineNo">2897</span>    long ts3 = ts1 + 2;<a name="line.2897"></a>
-<span class="sourceLineNo">2898</span><a name="line.2898"></a>
-<span class="sourceLineNo">2899</span>    // Setting up region<a name="line.2899"></a>
-<span class="sourceLineNo">2900</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2900"></a>
-<span class="sourceLineNo">2901</span>    // Putting data in Region<a name="line.2901"></a>
-<span class="sourceLineNo">2902</span>    Put put = null;<a name="line.2902"></a>
-<span class="sourceLineNo">2903</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.2903"></a>
-<span class="sourceLineNo">2904</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.2904"></a>
-<span class="sourceLineNo">2905</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.2905"></a>
-<span class="sourceLineNo">2906</span><a name="line.2906"></a>
-<span class="sourceLineNo">2907</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.2907"></a>
-<span class="sourceLineNo">2908</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.2908"></a>
-<span class="sourceLineNo">2909</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.2909"></a>
-<span class="sourceLineNo">2910</span><a name="line.2910"></a>
-<span class="sourceLineNo">2911</span>    put = new Put(row1);<a name="line.2911"></a>
-<span class="sourceLineNo">2912</span>    put.add(kv13);<a name="line.2912"></a>
-<span class="sourceLineNo">2913</span>    put.add(kv12);<a name="line.2913"></a>
-<span class="sourceLineNo">2914</span>    put.add(kv11);<a name="line.2914"></a>
-<span class="sourceLineNo">2915</span>    put.add(kv23);<a name="line.2915"></a>
-<span class="sourceLineNo">2916</span>    put.add(kv22);<a name="line.2916"></a>
-<span class="sourceLineNo">2917</span>    put.add(kv21);<a name="line.2917"></a>
-<span class="sourceLineNo">2918</span>    region.put(put);<a name="line.2918"></a>
-<span class="sourceLineNo">2919</span>    region.flush(true);<a name="line.2919"></a>
+<span class="sourceLineNo">2768</span>      e.printStackTrace();<a name="line.2768"></a>
+<span class="sourceLineNo">2769</span>      fail("Got IOException during initHRegion, " + e.getMessage());<a name="line.2769"></a>
+<span class="sourceLineNo">2770</span>    }<a name="line.2770"></a>
+<span class="sourceLineNo">2771</span>    region.closed.set(true);<a name="line.2771"></a>
+<span class="sourceLineNo">2772</span>    try {<a name="line.2772"></a>
+<span class="sourceLineNo">2773</span>      region.getScanner(null);<a name="line.2773"></a>
+<span class="sourceLineNo">2774</span>      fail("Expected to get an exception during getScanner on a region that is closed");<a name="line.2774"></a>
+<span class="sourceLineNo">2775</span>    } catch (NotServingRegionException e) {<a name="line.2775"></a>
+<span class="sourceLineNo">2776</span>      // this is the correct exception that is expected<a name="line.2776"></a>
+<span class="sourceLineNo">2777</span>    } catch (IOException e) {<a name="line.2777"></a>
+<span class="sourceLineNo">2778</span>      fail("Got wrong type of exception - should be a NotServingRegionException, " +<a name="line.2778"></a>
+<span class="sourceLineNo">2779</span>          "but was an IOException: "<a name="line.2779"></a>
+<span class="sourceLineNo">2780</span>          + e.getMessage());<a name="line.2780"></a>
+<span class="sourceLineNo">2781</span>    }<a name="line.2781"></a>
+<span class="sourceLineNo">2782</span>  }<a name="line.2782"></a>
+<span class="sourceLineNo">2783</span><a name="line.2783"></a>
+<span class="sourceLineNo">2784</span>  @Test<a name="line.2784"></a>
+<span class="sourceLineNo">2785</span>  public void testRegionScanner_Next() throws IOException {<a name="line.2785"></a>
+<span class="sourceLineNo">2786</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2786"></a>
+<span class="sourceLineNo">2787</span>    byte[] row2 = Bytes.toBytes("row2");<a name="line.2787"></a>
+<span class="sourceLineNo">2788</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2788"></a>
+<span class="sourceLineNo">2789</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2789"></a>
+<span class="sourceLineNo">2790</span>    byte[] fam3 = Bytes.toBytes("fam3");<a name="line.2790"></a>
+<span class="sourceLineNo">2791</span>    byte[] fam4 = Bytes.toBytes("fam4");<a name="line.2791"></a>
+<span class="sourceLineNo">2792</span><a name="line.2792"></a>
+<span class="sourceLineNo">2793</span>    byte[][] families = { fam1, fam2, fam3, fam4 };<a name="line.2793"></a>
+<span class="sourceLineNo">2794</span>    long ts = System.currentTimeMillis();<a name="line.2794"></a>
+<span class="sourceLineNo">2795</span><a name="line.2795"></a>
+<span class="sourceLineNo">2796</span>    // Setting up region<a name="line.2796"></a>
+<span class="sourceLineNo">2797</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2797"></a>
+<span class="sourceLineNo">2798</span>    // Putting data in Region<a name="line.2798"></a>
+<span class="sourceLineNo">2799</span>    Put put = null;<a name="line.2799"></a>
+<span class="sourceLineNo">2800</span>    put = new Put(row1);<a name="line.2800"></a>
+<span class="sourceLineNo">2801</span>    put.addColumn(fam1, (byte[]) null, ts, null);<a name="line.2801"></a>
+<span class="sourceLineNo">2802</span>    put.addColumn(fam2, (byte[]) null, ts, null);<a name="line.2802"></a>
+<span class="sourceLineNo">2803</span>    put.addColumn(fam3, (byte[]) null, ts, null);<a name="line.2803"></a>
+<span class="sourceLineNo">2804</span>    put.addColumn(fam4, (byte[]) null, ts, null);<a name="line.2804"></a>
+<span class="sourceLineNo">2805</span>    region.put(put);<a name="line.2805"></a>
+<span class="sourceLineNo">2806</span><a name="line.2806"></a>
+<span class="sourceLineNo">2807</span>    put = new Put(row2);<a name="line.2807"></a>
+<span class="sourceLineNo">2808</span>    put.addColumn(fam1, (byte[]) null, ts, null);<a name="line.2808"></a>
+<span class="sourceLineNo">2809</span>    put.addColumn(fam2, (byte[]) null, ts, null);<a name="line.2809"></a>
+<span class="sourceLineNo">2810</span>    put.addColumn(fam3, (byte[]) null, ts, null);<a name="line.2810"></a>
+<span class="sourceLineNo">2811</span>    put.addColumn(fam4, (byte[]) null, ts, null);<a name="line.2811"></a>
+<span class="sourceLineNo">2812</span>    region.put(put);<a name="line.2812"></a>
+<span class="sourceLineNo">2813</span><a name="line.2813"></a>
+<span class="sourceLineNo">2814</span>    Scan scan = new Scan();<a name="line.2814"></a>
+<span class="sourceLineNo">2815</span>    scan.addFamily(fam2);<a name="line.2815"></a>
+<span class="sourceLineNo">2816</span>    scan.addFamily(fam4);<a name="line.2816"></a>
+<span class="sourceLineNo">2817</span>    InternalScanner is = region.getScanner(scan);<a name="line.2817"></a>
+<span class="sourceLineNo">2818</span><a name="line.2818"></a>
+<span class="sourceLineNo">2819</span>    List&lt;Cell&gt; res = null;<a name="line.2819"></a>
+<span class="sourceLineNo">2820</span><a name="line.2820"></a>
+<span class="sourceLineNo">2821</span>    // Result 1<a name="line.2821"></a>
+<span class="sourceLineNo">2822</span>    List&lt;Cell&gt; expected1 = new ArrayList&lt;&gt;();<a name="line.2822"></a>
+<span class="sourceLineNo">2823</span>    expected1.add(new KeyValue(row1, fam2, null, ts, KeyValue.Type.Put, null));<a name="line.2823"></a>
+<span class="sourceLineNo">2824</span>    expected1.add(new KeyValue(row1, fam4, null, ts, KeyValue.Type.Put, null));<a name="line.2824"></a>
+<span class="sourceLineNo">2825</span><a name="line.2825"></a>
+<span class="sourceLineNo">2826</span>    res = new ArrayList&lt;&gt;();<a name="line.2826"></a>
+<span class="sourceLineNo">2827</span>    is.next(res);<a name="line.2827"></a>
+<span class="sourceLineNo">2828</span>    for (int i = 0; i &lt; res.size(); i++) {<a name="line.2828"></a>
+<span class="sourceLineNo">2829</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected1.get(i), res.get(i)));<a name="line.2829"></a>
+<span class="sourceLineNo">2830</span>    }<a name="line.2830"></a>
+<span class="sourceLineNo">2831</span><a name="line.2831"></a>
+<span class="sourceLineNo">2832</span>    // Result 2<a name="line.2832"></a>
+<span class="sourceLineNo">2833</span>    List&lt;Cell&gt; expected2 = new ArrayList&lt;&gt;();<a name="line.2833"></a>
+<span class="sourceLineNo">2834</span>    expected2.add(new KeyValue(row2, fam2, null, ts, KeyValue.Type.Put, null));<a name="line.2834"></a>
+<span class="sourceLineNo">2835</span>    expected2.add(new KeyValue(row2, fam4, null, ts, KeyValue.Type.Put, null));<a name="line.2835"></a>
+<span class="sourceLineNo">2836</span><a name="line.2836"></a>
+<span class="sourceLineNo">2837</span>    res = new ArrayList&lt;&gt;();<a name="line.2837"></a>
+<span class="sourceLineNo">2838</span>    is.next(res);<a name="line.2838"></a>
+<span class="sourceLineNo">2839</span>    for (int i = 0; i &lt; res.size(); i++) {<a name="line.2839"></a>
+<span class="sourceLineNo">2840</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected2.get(i), res.get(i)));<a name="line.2840"></a>
+<span class="sourceLineNo">2841</span>    }<a name="line.2841"></a>
+<span class="sourceLineNo">2842</span>  }<a name="line.2842"></a>
+<span class="sourceLineNo">2843</span><a name="line.2843"></a>
+<span class="sourceLineNo">2844</span>  @Test<a name="line.2844"></a>
+<span class="sourceLineNo">2845</span>  public void testScanner_ExplicitColumns_FromMemStore_EnforceVersions() throws IOException {<a name="line.2845"></a>
+<span class="sourceLineNo">2846</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2846"></a>
+<span class="sourceLineNo">2847</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.2847"></a>
+<span class="sourceLineNo">2848</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.2848"></a>
+<span class="sourceLineNo">2849</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2849"></a>
+<span class="sourceLineNo">2850</span>    byte[][] families = { fam1 };<a name="line.2850"></a>
+<span class="sourceLineNo">2851</span><a name="line.2851"></a>
+<span class="sourceLineNo">2852</span>    long ts1 = System.currentTimeMillis();<a name="line.2852"></a>
+<span class="sourceLineNo">2853</span>    long ts2 = ts1 + 1;<a name="line.2853"></a>
+<span class="sourceLineNo">2854</span>    long ts3 = ts1 + 2;<a name="line.2854"></a>
+<span class="sourceLineNo">2855</span><a name="line.2855"></a>
+<span class="sourceLineNo">2856</span>    // Setting up region<a name="line.2856"></a>
+<span class="sourceLineNo">2857</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2857"></a>
+<span class="sourceLineNo">2858</span>    // Putting data in Region<a name="line.2858"></a>
+<span class="sourceLineNo">2859</span>    Put put = null;<a name="line.2859"></a>
+<span class="sourceLineNo">2860</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.2860"></a>
+<span class="sourceLineNo">2861</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.2861"></a>
+<span class="sourceLineNo">2862</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.2862"></a>
+<span class="sourceLineNo">2863</span><a name="line.2863"></a>
+<span class="sourceLineNo">2864</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.2864"></a>
+<span class="sourceLineNo">2865</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.2865"></a>
+<span class="sourceLineNo">2866</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.2866"></a>
+<span class="sourceLineNo">2867</span><a name="line.2867"></a>
+<span class="sourceLineNo">2868</span>    put = new Put(row1);<a name="line.2868"></a>
+<span class="sourceLineNo">2869</span>    put.add(kv13);<a name="line.2869"></a>
+<span class="sourceLineNo">2870</span>    put.add(kv12);<a name="line.2870"></a>
+<span class="sourceLineNo">2871</span>    put.add(kv11);<a name="line.2871"></a>
+<span class="sourceLineNo">2872</span>    put.add(kv23);<a name="line.2872"></a>
+<span class="sourceLineNo">2873</span>    put.add(kv22);<a name="line.2873"></a>
+<span class="sourceLineNo">2874</span>    put.add(kv21);<a name="line.2874"></a>
+<span class="sourceLineNo">2875</span>    region.put(put);<a name="line.2875"></a>
+<span class="sourceLineNo">2876</span><a name="line.2876"></a>
+<span class="sourceLineNo">2877</span>    // Expected<a name="line.2877"></a>
+<span class="sourceLineNo">2878</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.2878"></a>
+<span class="sourceLineNo">2879</span>    expected.add(kv13);<a name="line.2879"></a>
+<span class="sourceLineNo">2880</span>    expected.add(kv12);<a name="line.2880"></a>
+<span class="sourceLineNo">2881</span><a name="line.2881"></a>
+<span class="sourceLineNo">2882</span>    Scan scan = new Scan(row1);<a name="line.2882"></a>
+<span class="sourceLineNo">2883</span>    scan.addColumn(fam1, qf1);<a name="line.2883"></a>
+<span class="sourceLineNo">2884</span>    scan.setMaxVersions(MAX_VERSIONS);<a name="line.2884"></a>
+<span class="sourceLineNo">2885</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.2885"></a>
+<span class="sourceLineNo">2886</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.2886"></a>
+<span class="sourceLineNo">2887</span><a name="line.2887"></a>
+<span class="sourceLineNo">2888</span>    boolean hasNext = scanner.next(actual);<a name="line.2888"></a>
+<span class="sourceLineNo">2889</span>    assertEquals(false, hasNext);<a name="line.2889"></a>
+<span class="sourceLineNo">2890</span><a name="line.2890"></a>
+<span class="sourceLineNo">2891</span>    // Verify result<a name="line.2891"></a>
+<span class="sourceLineNo">2892</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.2892"></a>
+<span class="sourceLineNo">2893</span>      assertEquals(expected.get(i), actual.get(i));<a name="line.2893"></a>
+<span class="sourceLineNo">2894</span>    }<a name="line.2894"></a>
+<span class="sourceLineNo">2895</span>  }<a name="line.2895"></a>
+<span class="sourceLineNo">2896</span><a name="line.2896"></a>
+<span class="sourceLineNo">2897</span>  @Test<a name="line.2897"></a>
+<span class="sourceLineNo">2898</span>  public void testScanner_ExplicitColumns_FromFilesOnly_EnforceVersions() throws IOException {<a name="line.2898"></a>
+<span class="sourceLineNo">2899</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2899"></a>
+<span class="sourceLineNo">2900</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.2900"></a>
+<span class="sourceLineNo">2901</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.2901"></a>
+<span class="sourceLineNo">2902</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2902"></a>
+<span class="sourceLineNo">2903</span>    byte[][] families = { fam1 };<a name="line.2903"></a>
+<span class="sourceLineNo">2904</span><a name="line.2904"></a>
+<span class="sourceLineNo">2905</span>    long ts1 = 1; // System.currentTimeMillis();<a name="line.2905"></a>
+<span class="sourceLineNo">2906</span>    long ts2 = ts1 + 1;<a name="line.2906"></a>
+<span class="sourceLineNo">2907</span>    long ts3 = ts1 + 2;<a name="line.2907"></a>
+<span class="sourceLineNo">2908</span><a name="line.2908"></a>
+<span class="sourceLineNo">2909</span>    // Setting up region<a name="line.2909"></a>
+<span class="sourceLineNo">2910</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2910"></a>
+<span class="sourceLineNo">2911</span>    // Putting data in Region<a name="line.2911"></a>
+<span class="sourceLineNo">2912</span>    Put put = null;<a name="line.2912"></a>
+<span class="sourceLineNo">2913</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.2913"></a>
+<span class="sourceLineNo">2914</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.2914"></a>
+<span class="sourceLineNo">2915</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.2915"></a>
+<span class="sourceLineNo">2916</span><a name="line.2916"></a>
+<span class="sourceLineNo">2917</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.2917"></a>
+<span class="sourceLineNo">2918</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.2918"></a>
+<span class="sourceLineNo">2919</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.2919"></a>
 <span class="sourceLineNo">2920</span><a name="line.2920"></a>
-<span class="sourceLineNo">2921</span>    // Expected<a name="line.2921"></a>
-<span class="sourceLineNo">2922</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.2922"></a>
-<span class="sourceLineNo">2923</span>    expected.add(kv13);<a name="line.2923"></a>
-<span class="sourceLineNo">2924</span>    expected.add(kv12);<a name="line.2924"></a>
-<span class="sourceLineNo">2925</span>    expected.add(kv23);<a name="line.2925"></a>
-<span class="sourceLineNo">2926</span>    expected.add(kv22);<a name="line.2926"></a>
-<span class="sourceLineNo">2927</span><a name="line.2927"></a>
-<span class="sourceLineNo">2928</span>    Scan scan = new Scan(row1);<a name="line.2928"></a>
-<span class="sourceLineNo">2929</span>    scan.addColumn(fam1, qf1);<a name="line.2929"></a>
-<span class="sourceLineNo">2930</span>    scan.addColumn(fam1, qf2);<a name="line.2930"></a>
-<span class="sourceLineNo">2931</span>    scan.setMaxVersions(MAX_VERSIONS);<a name="line.2931"></a>
-<span class="sourceLineNo">2932</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.2932"></a>
-<span class="sourceLineNo">2933</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.2933"></a>
-<span class="sourceLineNo">2934</span><a name="line.2934"></a>
-<span class="sourceLineNo">2935</span>    boolean hasNext = scanner.next(actual);<a name="line.2935"></a>
-<span class="sourceLineNo">2936</span>    assertEquals(false, hasNext);<a name="line.2936"></a>
+<span class="sourceLineNo">2921</span>    put = new Put(row1);<a name="line.2921"></a>
+<span class="sourceLineNo">2922</span>    put.add(kv13);<a name="line.2922"></a>
+<span class="sourceLineNo">2923</span>    put.add(kv12);<a name="line.2923"></a>
+<span class="sourceLineNo">2924</span>    put.add(kv11);<a name="line.2924"></a>
+<span class="sourceLineNo">2925</span>    put.add(kv23);<a name="line.2925"></a>
+<span class="sourceLineNo">2926</span>    put.add(kv22);<a name="line.2926"></a>
+<span class="sourceLineNo">2927</span>    put.add(kv21);<a name="line.2927"></a>
+<span class="sourceLineNo">2928</span>    region.put(put);<a name="line.2928"></a>
+<span class="sourceLineNo">2929</span>    region.flush(true);<a name="line.2929"></a>
+<span class="sourceLineNo">2930</span><a name="line.2930"></a>
+<span class="sourceLineNo">2931</span>    // Expected<a name="line.2931"></a>
+<span class="sourceLineNo">2932</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.2932"></a>
+<span class="sourceLineNo">2933</span>    expected.add(kv13);<a name="line.2933"></a>
+<span class="sourceLineNo">2934</span>    expected.add(kv12);<a name="line.2934"></a>
+<span class="sourceLineNo">2935</span>    expected.add(kv23);<a name="line.2935"></a>
+<span class="sourceLineNo">2936</span>    expected.add(kv22);<a name="line.2936"></a>
 <span class="sourceLineNo">2937</span><a name="line.2937"></a>
-<span class="sourceLineNo">2938</span>    // Verify result<a name="line.2938"></a>
-<span class="sourceLineNo">2939</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.2939"></a>
-<span class="sourceLineNo">2940</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected.get(i), actual.get(i)));<a name="line.2940"></a>
-<span class="sourceLineNo">2941</span>    }<a name="line.2941"></a>
-<span class="sourceLineNo">2942</span>  }<a name="line.2942"></a>
-<span class="sourceLineNo">2943</span><a name="line.2943"></a>
-<span class="sourceLineNo">2944</span>  @Test<a name="line.2944"></a>
-<span class="sourceLineNo">2945</span>  public void testScanner_ExplicitColumns_FromMemStoreAndFiles_EnforceVersions() throws<a name="line.2945"></a>
-<span class="sourceLineNo">2946</span>      IOException {<a name="line.2946"></a>
-<span class="sourceLineNo">2947</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2947"></a>
-<span class="sourceLineNo">2948</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2948"></a>
-<span class="sourceLineNo">2949</span>    byte[][] families = { fam1 };<a name="line.2949"></a>
-<span class="sourceLineNo">2950</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.2950"></a>
-<span class="sourceLineNo">2951</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.2951"></a>
-<span class="sourceLineNo">2952</span><a name="line.2952"></a>
-<span class="sourceLineNo">2953</span>    long ts1 = 1;<a name="line.2953"></a>
-<span class="sourceLineNo">2954</span>    long ts2 = ts1 + 1;<a name="line.2954"></a>
-<span class="sourceLineNo">2955</span>    long ts3 = ts1 + 2;<a name="line.2955"></a>
-<span class="sourceLineNo">2956</span>    long ts4 = ts1 + 3;<a name="line.2956"></a>
-<span class="sourceLineNo">2957</span><a name="line.2957"></a>
-<span class="sourceLineNo">2958</span>    // Setting up region<a name="line.2958"></a>
-<span class="sourceLineNo">2959</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2959"></a>
-<span class="sourceLineNo">2960</span>    // Putting data in Region<a name="line.2960"></a>
-<span class="sourceLineNo">2961</span>    KeyValue kv14 = new KeyValue(row1, fam1, qf1, ts4, KeyValue.Type.Put, null);<a name="line.2961"></a>
-<span class="sourceLineNo">2962</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.2962"></a>
-<span class="sourceLineNo">2963</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.2963"></a>
-<span class="sourceLineNo">2964</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.2964"></a>
-<span class="sourceLineNo">2965</span><a name="line.2965"></a>
-<span class="sourceLineNo">2966</span>    KeyValue kv24 = new KeyValue(row1, fam1, qf2, ts4, KeyValue.Type.Put, null);<a name="line.2966"></a>
-<span class="sourceLineNo">2967</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.2967"></a>
-<span class="sourceLineNo">2968</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.2968"></a>
-<span class="sourceLineNo">2969</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.2969"></a>
-<span class="sourceLineNo">2970</span><a name="line.2970"></a>
-<span class="sourceLineNo">2971</span>    Put put = null;<a name="line.2971"></a>
-<span class="sourceLineNo">2972</span>    put = new Put(row1);<a name="line.2972"></a>
-<span class="sourceLineNo">2973</span>    put.add(kv14);<a name="line.2973"></a>
-<span class="sourceLineNo">2974</span>    put.add(kv24);<a name="line.2974"></a>
-<span class="sourceLineNo">2975</span>    region.put(put);<a name="line.2975"></a>
-<span class="sourceLineNo">2976</span>    region.flush(true);<a name="line.2976"></a>
-<span class="sourceLineNo">2977</span><a name="line.2977"></a>
-<span class="sourceLineNo">2978</span>    put = new Put(row1);<a name="line.2978"></a>
-<span class="sourceLineNo">2979</span>    put.add(kv23);<a name="line.2979"></a>
-<span class="sourceLineNo">2980</span>    put.add(kv13);<a name="line.2980"></a>
-<span class="sourceLineNo">2981</span>    region.put(put);<a name="line.2981"></a>
-<span class="sourceLineNo">2982</span>    region.flush(true);<a name="line.2982"></a>
-<span class="sourceLineNo">2983</span><a name="line.2983"></a>
-<span class="sourceLineNo">2984</span>    put = new Put(row1);<a name="line.2984"></a>
-<span class="sourceLineNo">2985</span>    put.add(kv22);<a name="line.2985"></a>
-<span class="sourceLineNo">2986</span>    put.add(kv12);<a name="line.2986"></a>
-<span class="sourceLineNo">2987</span>    region.put(put);<a name="line.2987"></a>
-<span class="sourceLineNo">2988</span>    region.flush(true);<a name="line.2988"></a>
-<span class="sourceLineNo">2989</span><a name="line.2989"></a>
-<span class="sourceLineNo">2990</span>    put = new Put(row1);<a name="line.2990"></a>
-<span class="sourceLineNo">2991</span>    put.add(kv21);<a name="line.2991"></a>
-<span class="sourceLineNo">2992</span>    put.add(kv11);<a name="line.2992"></a>
-<span class="sourceLineNo">2993</span>    region.put(put);<a name="line.2993"></a>
-<span class="sourceLineNo">2994</span><a name="line.2994"></a>
-<span class="sourceLineNo">2995</span>    // Expected<a name="line.2995"></a>
-<span class="sourceLineNo">2996</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.2996"></a>
-<span class="sourceLineNo">2997</span>    expected.add(kv14);<a name="line.2997"></a>
-<span class="sourceLineNo">2998</span>    expected.add(kv13);<a name="line.2998"></a>
-<span class="sourceLineNo">2999</span>    expected.add(kv12);<a name="line.2999"></a>
-<span class="sourceLineNo">3000</span>    expected.add(kv24);<a name="line.3000"></a>
-<span class="sourceLineNo">3001</span>    expected.add(kv23);<a name="line.3001"></a>
-<span class="sourceLineNo">3002</span>    expected.add(kv22);<a name="line.3002"></a>
-<span class="sourceLineNo">3003</span><a name="line.3003"></a>
-<span class="sourceLineNo">3004</span>    Scan scan = new Scan(row1);<a name="line.3004"></a>
-<span class="sourceLineNo">3005</span>    scan.addColumn(fam1, qf1);<a name="line.3005"></a>
-<span class="sourceLineNo">3006</span>    scan.addColumn(fam1, qf2);<a name="line.3006"></a>
-<span class="sourceLineNo">3007</span>    int versions = 3;<a name="line.3007"></a>
-<span class="sourceLineNo">3008</span>    scan.setMaxVersions(versions);<a name="line.3008"></a>
-<span class="sourceLineNo">3009</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.3009"></a>
-<span class="sourceLineNo">3010</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.3010"></a>
-<span class="sourceLineNo">3011</span><a name="line.3011"></a>
-<span class="sourceLineNo">3012</span>    boolean hasNext = scanner.next(actual);<a name="line.3012"></a>
-<span class="sourceLineNo">3013</span>    assertEquals(false, hasNext);<a name="line.3013"></a>
-<span class="sourceLineNo">3014</span><a name="line.3014"></a>
-<span class="sourceLineNo">3015</span>    // Verify result<a name="line.3015"></a>
-<span class="sourceLineNo">3016</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.3016"></a>
-<span class="sourceLineNo">3017</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected.get(i), actual.get(i)));<a name="line.3017"></a>
-<span class="sourceLineNo">3018</span>    }<a name="line.3018"></a>
-<span class="sourceLineNo">3019</span>  }<a name="line.3019"></a>
-<span class="sourceLineNo">3020</span><a name="line.3020"></a>
-<span class="sourceLineNo">3021</span>  @Test<a name="line.3021"></a>
-<span class="sourceLineNo">3022</span>  public void testScanner_Wildcard_FromMemStore_EnforceVersions() throws IOException {<a name="line.3022"></a>
-<span class="sourceLineNo">3023</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.3023"></a>
-<span class="sourceLineNo">3024</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.3024"></a>
-<span class="sourceLineNo">3025</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.3025"></a>
-<span class="sourceLineNo">3026</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.3026"></a>
-<span class="sourceLineNo">3027</span>    byte[][] families = { fam1 };<a name="line.3027"></a>
-<span class="sourceLineNo">3028</span><a name="line.3028"></a>
-<span class="sourceLineNo">3029</span>    long ts1 = System.currentTimeMillis();<a name="line.3029"></a>
-<span class="sourceLineNo">3030</span>    long ts2 = ts1 + 1;<a name="line.3030"></a>
-<span class="sourceLineNo">3031</span>    long ts3 = ts1 + 2;<a name="line.3031"></a>
-<span class="sourceLineNo">3032</span><a name="line.3032"></a>
-<span class="sourceLineNo">3033</span>    // Setting up region<a name="line.3033"></a>
-<span class="sourceLineNo">3034</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.3034"></a>
-<span class="sourceLineNo">3035</span>    // Putting data in Region<a name="line.3035"></a>
-<span class="sourceLineNo">3036</span>    Put put = null;<a name="line.3036"></a>
-<span class="sourceLineNo">3037</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.3037"></a>
-<span class="sourceLineNo">3038</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.3038"></a>
-<span class="sourceLineNo">3039</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.3039"></a>
-<span class="sourceLineNo">3040</span><a name="line.3040"></a>
-<span class="sourceLineNo">3041</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.3041"></a>
-<span class="sourceLineNo">3042</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.3042"></a>
-<span class="sourceLineNo">3043</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.3043"></a>
-<span class="sourceLineNo">3044</span><a name="line.3044"></a>
-<span class="sourceLineNo">3045</span>    put = new Put(row1);<a name="line.3045"></a>
-<span class="sourceLineNo">3046</span>    put.add(kv13);<a name="line.3046"></a>
-<span class="sourceLineNo">3047</span>    put.add(kv12);<a name="line.3047"></a>
-<span class="sourceLineNo">3048</span>    put.add(kv11);<a name="line.3048"></a>
-<span class="sourceLineNo">3049</span>    put.add(kv23);<a name="line.3049"></a>
-<span class="sourceLineNo">3050</span>    put.add(kv22);<a name="line.3050"></a>
-<span class="sourceLineNo">3051</span>    put.add(kv21);<a name="line.3051"></a>
-<span class="sourceLineNo">3052</span>    region.put(put);<a name="line.3052"></a>
-<span class="sourceLineNo">3053</span><a name="line.3053"></a>
-<span class="sourceLineNo">3054</span>    // Expected<a name="line.3054"></a>
-<span class="sourceLineNo">3055</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.3055"></a>
-<span class="sourceLineNo">3056</span>    expected.add(kv13);<a name="line.3056"></a>
-<span class="sourceLineNo">3057</span>    expected.add(kv12);<a name="line.3057"></a>
-<span class="sourceLineNo">3058</span>    expected.add(kv23);<a name="line.3058"></a>
-<span class="sourceLineNo">3059</span>    expected.add(kv22);<a name="line.3059"></a>
-<span class="sourceLineNo">3060</span><a name="line.3060"></a>
-<span class="sourceLineNo">3061</span>    Scan scan = new Scan(row1);<a name="line.3061"></a>
-<span class="sourceLineNo">3062</span>    scan.addFamily(fam1);<a name="line.3062"></a>
-<span class="sourceLineNo">3063</span>    scan.setMaxVersions(MAX_VERSIONS);<a name="line.3063"></a>
-<span class="sourceLineNo">3064</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.3064"></a>
-<span class="sourceLineNo">3065</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.3065"></a>
-<span class="sourceLineNo">3066</span><a name="line.3066"></a>
-<span class="sourceLineNo">3067</span>    boolean hasNext = scanner.next(actual);<a name="line.3067"></a>
-<span class="sourceLineNo">3068</span>    assertEquals(false, hasNext);<a name="line.3068"></a>
-<span class="sourceLineNo">3069</span><a name="line.3069"></a>
-<span class="sourceLineNo">3070</span>    // Verify result<a name="line.3070"></a>
-<span class="sourceLineNo">3071</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.3071"></a>
-<span class="sourceLineNo">3072</span>      assertEquals(expected.get(i), actual.get(i));<a name="line.3072"></a>
-<span class="sourceLineNo">3073</span>    }<a name="line.3073"></a>
-<span class="sourceLineNo">3074</span>  }<a name="line.3074"></a>
-<span class="sourceLineNo">3075</span><a name="line.3075"></a>
-<span class="sourceLineNo">3076</span>  @Test<a name="line.3076"></a>
-<span class="sourceLineNo">3077</span>  public void testScanner_Wildcard_FromFilesOnly_EnforceVersions() throws IOException {<a name="line.3077"></a>
-<span class="sourceLineNo">3078</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.3078"></a>
-<span class="sourceLineNo">3079</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.3079"></a>
-<span class="sourceLineNo">3080</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.3080"></a>
-<span class="sourceLineNo">3081</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.3081"></a>
-<span class="sourceLineNo">3082</span><a name="line.3082"></a>
-<span class="sourceLineNo">3083</span>    long ts1 = 1; // System.currentTimeMillis();<a name="line.3083"></a>
-<span class="sourceLineNo">3084</span>    long ts2 = ts1 + 1;<a name="line.3084"></a>
-<span class="sourceLineNo">3085</span>    long ts3 = ts1 + 2;<a name="line.3085"></a>
-<span class="sourceLineNo">3086</span><a name="line.3086"></a>
-<span class="sourceLineNo">3087</span>    // Setting up region<a name="line.3087"></a>
-<span class="sourceLineNo">3088</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.3088"></a>
-<span class="sourceLineNo">3089</span>    // Putting data in Region<a name="line.3089"></a>
-<span class="sourceLineNo">3090</span>    Put put = null;<a name="line.3090"></a>
-<span class="sourceLineNo">3091</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.3091"></a>
-<span class="sourceLineNo">3092</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.3092"></a>
-<span class="sourceLineNo">3093</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.3093"></a>
-<span class="sourceLineNo">3094</span><a name="line.3094"></a>
-<span class="sourceLineNo">3095</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.3095"></a>
-<span class="sourceLineNo">3096</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.3096"></a>
-<span class="sourceLineNo">3097</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.3097"></a>
-<span class="sourceLineNo">3098</span><a name="line.3098"></a>
-<span class="sourceLineNo">3099</span>    put = new Put(row1);<a name="line.3099"></a>
-<span class="sourceLineNo">3100</span>    put.add(kv13);<a name="line.3100"></a>
-<span class="sourceLineNo">3101</span>    put.add(kv12);<a name="line.3101"></a>
-<span class="sourceLineNo">3102</span>    put.add(kv11);<a name="line.3102"></a>
-<span class="sourceLineNo">3103</span>    put.add(kv23);<a name="line.3103"></a>
-<span class="sourceLineNo">3104</span>    put.add(kv22);<a name="line.3104"></a>
-<span class="sourceLineNo">3105</span>    put.add(kv21);<a name="line.3105"></a>
-<span class="sourceLineNo">3106</span>    region.put(put);<a name="line.3106"></a>
-<span class="sourceLineNo">3107</span>    region.flush(true);<a name="line.3107"></a>
+<span class="sourceLineNo">2938</span>    Scan scan = new Scan(row1);<a name="line.2938"></a>
+<span class="sourceLineNo">2939</span>    scan.addColumn(fam1, qf1);<a name="line.2939"></a>
+<span class="sourceLineNo">2940</span>    scan.addColumn(fam1, qf2);<a name="line.2940"></a>
+<span class="sourceLineNo">2941</span>    scan.setMaxVersions(MAX_VERSIONS);<a name="line.2941"></a>
+<span class="sourceLineNo">2942</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.2942"></a>
+<span class="sourceLineNo">2943</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.2943"></a>
+<span class="sourceLineNo">2944</span><a name="line.2944"></a>
+<span class="sourceLineNo">2945</span>    boolean hasNext = scanner.next(actual);<a name="line.2945"></a>
+<span class="sourceLineNo">2946</span>    assertEquals(false, hasNext);<a name="line.2946"></a>
+<span class="sourceLineNo">2947</span><a name="line.2947"></a>
+<span class="sourceLineNo">2948</span>    // Verify result<a name="line.2948"></a>
+<span class="sourceLineNo">2949</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.2949"></a>
+<span class="sourceLineNo">2950</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected.get(i), actual.get(i)));<a name="line.2950"></a>
+<span class="sourceLineNo">2951</span>    }<a name="line.2951"></a>
+<span class="sourceLineNo">2952</span>  }<a name="line.2952"></a>
+<span class="sourceLineNo">2953</span><a name="line.2953"></a>
+<span class="sourceLineNo">2954</span>  @Test<a name="line.2954"></a>
+<span class="sourceLineNo">2955</span>  public void testScanner_ExplicitColumns_FromMemStoreAndFiles_EnforceVersions() throws<a name="line.2955"></a>
+<span class="sourceLineNo">2956</span>      IOException {<a name="line.2956"></a>
+<span class="sourceLineNo">2957</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2957"></a>
+<span class="sourceLineNo">2958</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2958"></a>
+<span class="sourceLineNo">2959</span>    byte[][] families = { fam1 };<a name="line.2959"></a>
+<span class="sourceLineNo">2960</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.2960"></a>
+<span class="sourceLineNo">2961</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.2961"></a>
+<span class="sourceLineNo">2962</span><a name="line.2962"></a>
+<span class="sourceLineNo">2963</span>    long ts1 = 1;<a name="line.2963"></a>
+<span class="sourceLineNo">2964</span>    long ts2 = ts1 + 1;<a name="line.2964"></a>
+<span class="sourceLineNo">2965</span>    long ts3 = ts1 + 2;<a name="line.2965"></a>
+<span class="sourceLineNo">2966</span>    long ts4 = ts1 + 3;<a name="line.2966"></a>
+<span class="sourceLineNo">2967</span><a name="line.2967"></a>
+<span class="sourceLineNo">2968</span>    // Setting up region<a name="line.2968"></a>
+<span class="sourceLineNo">2969</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2969"></a>
+<span class="sourceLineNo">2970</span>    // Putting data in Region<a name="line.2970"></a>
+<span class="sourceLineNo">2971</span>    KeyValue kv14 = new KeyValue(row1, fam1, qf1, ts4, KeyValue.Type.Put, null);<a name="line.2971"></a>
+<span class="sourceLineNo">2972</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.2972"></a>
+<span class="sourceLineNo">2973</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.2973"></a>
+<span class="sourceLineNo">2974</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.2974"></a>
+<span class="sourceLineNo">2975</span><a name="line.2975"></a>
+<span class="sourceLineNo">2976</span>    KeyValue kv24 = new KeyValue(row1, fam1, qf2, ts4, KeyValue.Type.Put, null);<a name="line.2976"></a>
+<span class="sourceLineNo">2977</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.2977"></a>
+<span class="sourceLineNo">2978</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.2978"></a>
+<span class="sourceLineNo">2979</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.2979"></a>
+<span class="sourceLineNo">2980</span><a name="line.2980"></a>
+<span class="sourceLineNo">2981</span>    Put put = null;<a name="line.2981"></a>
+<span class="sourceLineNo">2982</span>    put = new Put(row1);<a name="line.2982"></a>
+<span class="sourceLineNo">2983</span>    put.add(kv14);<a name="line.2983"></a>
+<span class="sourceLineNo">2984</span>    put.add(kv24);<a name="line.2984"></a>
+<span class="sourceLineNo">2985</span>    region.put(put);<a name="line.2985"></a>
+<span class="sourceLineNo">2986</span>    region.flush(true);<a name="line.2986"></a>
+<span class="sourceLineNo">2987</span><a name="line.2987"></a>
+<span class="sourceLineNo">2988</span>    put = new Put(row1);<a name="line.2988"></a>
+<span class="sourceLineNo">2989</span>    put.add(kv23);<a name="line.2989"></a>
+<span class="sourceLineNo">2990</span>    put.add(kv13);<a name="line.2990"></a>
+<span class="sourceLineNo">2991</span>    region.put(put);<a name="line.2991"></a>
+<span class="sourceLineNo">2992</span>    region.flush(true);<a name="line.2992"></a>
+<span class="sourceLineNo">2993</span><a name="line.2993"></a>
+<span class="sourceLineNo">2994</span>    put = new Put(row1);<a name="line.2994"></a>
+<span class="sourceLineNo">2995</span>    put.add(kv22);<a name="line.2995"></a>
+<span class="sourceLineNo">2996</span>    put.add(kv12);<a name="line.2996"></a>
+<span class="sourceLineNo">2997</span>    region.put(put);<a name="line.2997"></a>
+<span class="sourceLineNo">2998</span>    region.flush(true);<a name="line.2998"></a>
+<span class="sourceLineNo">2999</span><a name="line.2999"></a>
+<span class="sourceLineNo">3000</span>    put = new Put(row1);<a name="line.3000"></a>
+<span class="sourceLineNo">3001</span>    put.add(kv21);<a name="line.3001"></a>
+<span class="sourceLineNo">3002</span>    put.add(kv11);<a name="line.3002"></a>
+<span class="sourceLineNo">3003</span>    region.put(put);<a name="line.3003"></a>
+<span class="sourceLineNo">3004</span><a name="line.3004"></a>
+<span class="sourceLineNo">3005</span>    // Expected<a name="line.3005"></a>
+<span class="sourceLineNo">3006</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.3006"></a>
+<span class="sourceLineNo">3007</span>    expected.add(kv14);<a name="line.3007"></a>
+<span class="sourceLineNo">3008</span>    expected.add(kv13);<a name="line.3008"></a>
+<span class="sourceLineNo">3009</span>    expected.add(kv12);<a name="line.3009"></a>
+<span class="sourceLineNo">3010</span>    expected.add(kv24);<a name="line.3010"></a>
+<span class="sourceLineNo">3011</span>    expected.add(kv23);<a name="line.3011"></a>
+<span class="sourceLineNo">3012</span>    expected.add(kv22);<a name="line.3012"></a>
+<span class="sourceLineNo">3013</span><a name="line.3013"></a>
+<span class="sourceLineNo">3014</span>    Scan scan = new Scan(row1);<a name="line.3014"></a>
+<span class="sourceLineNo">3015</span>    scan.addColumn(fam1, qf1);<a name="line.3015"></a>
+<span class="sourceLineNo">3016</span>    scan.addColumn(fam1, qf2);<a name="line.3016"></a>
+<span class="sourceLineNo">3017</span>    int versions = 3;<a name="line.3017"></a>
+<span class="sourceLineNo">3018</span>    scan.setMaxVersions(versions);<a name="line.3018"></a>
+<span class="sourceLineNo">3019</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.3019"></a>
+<span class="sourceLineNo">3020</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.3020"></a>
+<span class="sourceLineNo">3021</span><a name="line.3021"></a>
+<span class="sourceLineNo">3022</span>    boolean hasNext = scanner.next(actual);<a name="line.3022"></a>
+<span class="sourceLineNo">3023</span>    assertEquals(false, hasNext);<a name="line.3023"></a>
+<span class="sourceLineNo">3024</span><a name="line.3024"></a>
+<span class="sourceLineNo">3025</span>    // Verify result<a name="line.3025"></a>
+<span class="sourceLineNo">3026</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.3026"></a>
+<span class="sourceLineNo">3027</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected.get(i), actual.get(i)));<a name="line.3027"></a>
+<span class="sourceLineNo">3028</span>    }<a name="line.3028"></a>
+<span class="sourceLineNo">3029</span>  }<a name="line.3029"></a>
+<span class="sourceLineNo">3030</span><a name="line.3030"></a>
+<span class="sourceLineNo">3031</span>  @Test<a name="line.3031"></a>
+<span class="sourceLineNo">3032</span>  public void testScanner_Wildcard_FromMemStore_EnforceVersions() throws IOException {<a name="line.3032"></a>
+<span class="sourceLineNo">3033</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.3033"></a>
+<span class="sourceLineNo">3034</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.3034"></a>
+<span class="sourceLineNo">3035</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.3035"></a>
+<span class="sourceLineNo">3036</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.3036"></a>
+<span class="sourceLineNo">3037</span>    byte[][] families = { fam1 };<a name="line.3037"></a>
+<span class="sourceLineNo">3038</span><a name="line.3038"></a>
+<span class="sourceLineNo">3039</span>    long ts1 = System.currentTimeMillis();<a name="line.3039"></a>
+<span class="sourceLineNo">3040</span>    long ts2 = ts1 + 1;<a name="line.3040"></a>
+<span class="sourceLineNo">3041</span>    long ts3 = ts1 + 2;<a name="line.3041"></a>
+<span class="sourceLineNo">3042</span><a name="line.3042"></a>
+<span class="sourceLineNo">3043</span>    // Setting up region<a name="line.3043"></a>
+<span class="sourceLineNo">3044</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.3044"></a>
+<span class="sourceLineNo">3045</span>    // Putting data in Region<a name="line.3045"></a>
+<span class="sourceLineNo">3046</span>    Put put = null;<a name="line.3046"></a>
+<span class="sourceLineNo">3047</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.3047"></a>
+<span class="sourceLineNo">3048</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.3048"></a>
+<span class="sourceLineNo">3049</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.3049"></a>
+<span class="sourceLineNo">3050</span><a name="line.3050"></a>
+<span class="sourceLineNo">3051</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.3051"></a>
+<span class="sourceLineNo">3052</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.3052"></a>
+<span class="sourceLineNo">3053</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.3053"></a>
+<span class="sourceLineNo">3054</span><a name="line.3054"></a>
+<span class="sourceLineNo">3055</span>    put = new Put(row1);<a name="line.3055"></a>
+<span class="sourceLineNo">3056</span>    put.add(kv13);<a name="line.3056"></a>
+<span class="sourceLineNo">3057</span>    put.add(kv12);<a name="line.3057"></a>
+<span class="sourceLineNo">3058</span>    put.add(kv11);<a name="line.3058"></a>
+<span class="sourceLineNo">3059</span>    put.add(kv23);<a name="line.3059"></a>
+<span class="sourceLineNo">3060</span>    put.add(kv22);<a name="line.3060"></a>
+<span class="sourceLineNo">3061</span>    put.add(kv21);<a name="line.3061"></a>
+<span class="sourceLineNo">3062</span>    region.put(put);<a name="line.3062"></a>
+<span class="sourceLineNo">3063</span><a name="line.3063"></a>
+<span class="sourceLineNo">3064</span>    // Expected<a name="line.3064"></a>
+<span class="sourceLineNo">3065</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.3065"></a>
+<span class="sourceLineNo">3066</span>    expected.add(kv13);<a name="line.3066"></a>
+<span class="sourceLineNo">3067</span>    expected.add(kv12);<a name="line.3067"></a>
+<span class="sourceLineNo">3068</span>    expected.add(kv23);<a name="line.3068"></a>
+<span class="sourceLineNo">3069</span>    expected.add(kv22);<a name="line.3069"></a>
+<span class="sourceLineNo">3070</span><a name="line.3070"></a>
+<span class="sourceLineNo">3071</span>    Scan scan = new Scan(row1);<a name="line.3071"></a>
+<span class="sourceLineNo">3072</span>    scan.addFamily(fam1);<a name="line.3072"></a>
+<span class="sourceLineNo">3073</span>    scan.setMaxVersions(MAX_VERSIONS);<a name="line.3073"></a>
+<span class="sourceLineNo">3074</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.3074"></a>
+<span class="sourceLineNo">3075</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.3075"></a>
+<span class="sourceLineNo">3076</span><a name="line.3076"></a>
+<span class="sourceLineNo">3077</span>    boolean hasNext = scanner.next(actual);<a name="line.3077"></a>
+<span class="sourceLineNo">3078</span>    assertEquals(false, hasNext);<a name="line.3078"></a>
+<span class="sourceLineNo">3079</span><a name="line.3079"></a>
+<span class="sourceLineNo">3080</span>    // Verify result<a name="line.3080"></a>
+<span class="sourceLineNo">3081</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.3081"></a>
+<span class="sourceLineNo">3082</span>      assertEquals(expected.get(i), actual.get(i));<a name="line.3082"></a>
+<span class="sourceLineNo">3083</span>    }<a name="line.3083"></a>
+<span class="sourceLineNo">3084</span>  }<a name="line.3084"></a>
+<span class="sourceLineNo">3085</span><a name="line.3085"></a>
+<span class="sourceLineNo">3086</span>  @Test<a name="line.3086"></a>
+<span class="sourceLineNo">3087</span>  public void testScanner_Wildcard_FromFilesOnly_EnforceVersions() throws IOException {<a name="line.3087"></a>
+<span class="sourceLineNo">3088</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.3088"></a>
+<span class="sourceLineNo">3089</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.3089"></a>
+<span class="sourceLineNo">3090</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.3090"></a>
+<span class="sourceLineNo">3091</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.3091"></a>
+<span class="sourceLineNo">3092</span><a name="line.3092"></a>
+<span class="sourceLineNo">3093</span>    long ts1 = 1; // System.currentTimeMillis();<a name="line.3093"></a>
+<span class="sourceLineNo">3094</span>    long ts2 = ts1 + 1;<a name="line.3094"></a>
+<span class="sourceLineNo">3095</span>    long ts3 = ts1 + 2;<a name="line.3095"></a>
+<span class="sourceLineNo">3096</span><a name="line.3096"></a>
+<span class="sourceLineNo">3097</span>    // Setting up region<a name="line.3097"></a>
+<span class="sourceLineNo">3098</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.3098"></a>
+<span class="sourceLineNo">3099</span>    // Putting data in Region<a name="line.3099"></a>
+<span class="sourceLineNo">3100</span>    Put put = null;<a name="line.3100"></a>
+<span class="sourceLineNo">3101</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.3101"></a>
+<span class="sourceLineNo">3102</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.3102"></a>
+<span class="sourceLineNo">3103</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.3103"></a>
+<span class="sourceLineNo">3104</span><a name="line.3104"></a>
+<span class="sourceLineNo">3105</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.3105"></a>
+<span class="sourceLineNo">3106</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.3106"></a>
+<span class="sourceLineNo">3107</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.3107"></a>
 <span class="sourceLineNo">3108</span><a name="line.3108"></a>
-<span class="sourceLineNo">3109</span>    // Expected<a name="line.3109"></a>
-<span class="sourceLineNo">3110</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.3110"></a>
-<span class="sourceLineNo">3111</span>    expected.add(kv13);<a name="line.3111"></a>
-<span class="sourceLineNo">3112</span>    expected.add(kv12);<a name="line.3112"></a>
-<span class="sourceLineNo">3113</span>    expected.add(kv23);<a name="line.3113"></a>
-<span class="sourceLineNo">3114</span>    expected.add(kv22);<a name="line.3114"></a>
-<span class="sourceLineNo">3115</span><a name="line.3115"></a>
-<span class="sourceLineNo">3116</span>    Scan scan = new Scan(row1);<a name="line.3116"></a>
-<span class="sourceLineNo">3117</span>    scan.addFamily(fam1);<a name="line.3117"></a>
-<span class="sourceLineNo">3118</span>    scan.setMaxVersions(MAX_VERSIONS);<a name="line.3118"></a>
-<span class="sourceLineNo">3119</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.3119"></a>
-<span class="sourceLineNo">3120</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.3120"></a>
-<span class="sourceLineNo">3121</span><a name="line.3121"></a>
-<span class="sourceLineNo">3122</span>    boolean hasNext = scanner.next(actual);<a name="line.3122"></a>
-<span class="sourceLineNo">3123</span>    assertEquals(false, hasNext);<a name="line.3123"></a>
-<span class="sourceLineNo">3124</span><a name="line.3124"></a>
-<span class="sourceLineNo">3125</span>    // Verify result<a name="line.3125"></a>
-<span class="sourceLineNo">3126</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.3126"></a>
-<span class="sourceLineNo">3127</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected.get(i), actual.get(i)));<a name="line.3127"></a>
-<span class="sourceLineNo">3128</span>    }<a name="line.3128"></a>
-<span class="sourceLineNo">3129</span>  }<a name="line.3129"></a>
-<span class="sourceLineNo">3130</span><a name="line.3130"></a>
-<span class="sourceLineNo">3131</span>  @Test<a name="line.3131"></a>
-<span class="sourceLineNo">3132</span>  public void testScanner_StopRow1542() throws IOException {<a name="line.3132"></a>
-<span class="sourceLineNo">3133</span>    byte[] family = Bytes.toBytes("testFamily");<a name="line.3133"></a>
-<span class="sourceLineNo">3134</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.3134"></a>
-<span class="sourceLineNo">3135</span>    byte[] row1 = Bytes.toBytes("row111");<a name="line.3135"></a>
-<span class="sourceLineNo">3136</span>    byte[] row2 = Bytes.toBytes("row222");<a name="line.3136"></a>
-<span class="sourceLineNo">3137</span>    byte[] row3 = Bytes.toBytes("row333");<a name="line.3137"></a>
-<span class="sourceLineNo">3138</span>    byte[] row4 = Bytes.toBytes("row444");<a name="line.3138"></a>
-<span class="sourceLineNo">3139</span>    byte[] row5 = Bytes.toBytes("row555");<a name="line.3139"></a>
+<span class="sourceLineNo">3109</span>    put = new Put(row1);<a name="line.3109"></a>
+<span class="sourceLineNo">3110</span>    put.add(kv13);<a name="line.3110"></a>
+<span class="sourceLineNo">3111</span>    put.add(kv12);<a name="line.3111"></a>
+<span class="sourceLineNo">3112</span>    put.add(kv11);<a name="line.3112"></a>
+<span class="sourceLineNo">3113</span>    put.add(kv23);<a name="line.3113"></a>
+<span class="sourceLineNo">3114</span>    put.add(kv22);<a name="line.3114"></a>
+<span class="sourceLineNo">3115</span>    put.add(kv21);<a name="line.3115"></a>
+<span class="sourceLineNo">3116</span>    region.put(put);<a name="line.3116"></a>
+<span class="sourceLineNo">3117</span>    region.flush(true);<a name="line.3117"></a>
+<span class="sourceLineNo">3118</span><a name="line.3118"></a>
+<span class="sourceLineNo">3119</span>    // Expected<a name="line.3119"></a>
+<span class="sourceLineNo">3120</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.3120"></a>
+<span class="sourceLineNo">3121</span>    expected.add(kv13);<a name="line.3121"></a>
+<span class="sourceLineNo">3122</span>    expected.add(kv12);<a name="line.3122"></a>
+<span class="sourceLineNo">3123</span>    expected.add(kv23);<a name="line.3123"></a>
+<span class="sourceLineNo">3124</span>    expected.add(kv22);<a name="line.3124"></a>
+<span class="sourceLineNo">3125</span><a name="line.3125"></a>
+<span class="sourceLineNo">3126</span>    Scan scan = new Scan(row1);<a name="line.3126"></a>
+<span class="sourceLineNo">3127</span>    scan.addFamily(fam1);<a name="line.3127"></a>
+<span class="sourceLineNo">3128</span>    scan.setMaxVersions(MAX_VERSIONS);<a name="line.3128"></a>
+<span class="sourceLineNo">3129</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.3129"></a>
+<span class="sourceLineNo">3130</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.3130"></a>
+<span class="sourceLineNo">3131</span><a name="line.3131"></a>
+<span class="sourceLineNo">3132</span>    boolean hasNext = scanner.next(actual);<a name="line.3132"></a>
+<span class="sourceLineNo">3133</span>    assertEquals(false, hasNext);<a name="line.3133"></a>
+<span class="sourceLineNo">3134</span><a name="line.3134"></a>
+<span class="sourceLineNo">3135</span>    // Verify result<a name="line.3135"></a>
+<span class="sourceLineNo">3136</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.3136"></a>
+<span class="sourceLineNo">3137</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected.get(i), actual.get(i)));<a name="line.3137"></a>
+<span class="sourceLineNo">3138</span>    }<a name="line.3138"></a>
+<span class="sourceLineNo">3139</span>  }<a name="line.3139"></a>
 <span class="sourceLineNo">3140</span><a name="line.3140"></a>
-<span class="sourceLineNo">3141</span>    byte[] col1 = Bytes.toBytes("Pub111");<a name="line.3141"></a>
-<span class="sourceLineNo">3142</span>    byte[] col2 = Bytes.toBytes("Pub222");<a name="line.3142"></a>
-<span class="sourceLineNo">3143</span><a name="line.3143"></a>
-<span class="sourceLineNo">3144</span>    Put put = new Put(row1);<a name="line.3144"></a>
-<span class="sourceLineNo">3145</span>    put.addColumn(family, col1, Bytes.toBytes(10L));<a name="line.3145"></a>
-<span class="sourceLineNo">3146</span>    region.put(put);<a name="line.3146"></a>
-<span class="sourceLineNo">3147</span><a name="line.3147"></a>
-<span class="sourceLineNo">3148</span>    put = new Put(row2);<a name="line.3148"></a>
-<span class="sourceLineNo">3149</span>    put.addColumn(family, col1, Bytes.toBytes(15L));<a name="line.3149"></a>
-<span class="sourceLineNo">3150</span>    region.put(put);<a name="line.3150"></a>
-<span class="sourceLineNo">3151</span><a name="line.3151"></a>
-<span class="sourceLineNo">3152</span>    put = new Put(row3);<a name="line.3152"></a>
-<span class="sourceLineNo">3153</span>    put.addColumn(family, col2, Bytes.toBytes(20L));<a name="line.3153"></a>
-<span class="sourceLineNo">3154</span>    region.put(put);<a name="line.3154"></a>
-<span class="sourceLineNo">3155</span><a name="line.3155"></a>
-<span class="sourceLineNo">3156</span>    put = new Put(row4);<a name="line.3156"></a>
-<span class="sourceLineNo">3157</span>    put.addColumn(family, col2, Bytes.toBytes(30L));<a name="line.3157"></a>
-<span class="sourceLineNo">3158</span>    region.put(put);<a name="line.3158"></a>
-<span class="sourceLineNo">3159</span><a name="line.3159"></a>
-<span class="sourceLineNo">3160</span>    put = new Put(row5);<a name="line.3160"></a>
-<span class="sourceLineNo">3161</span>    put.addColumn(family, col1, Bytes.toBytes(40L));<a name="line.3161"></a>
-<span class="sourceLineNo">3162</span>    region.put(put);<a name="line.3162"></a>
-<span class="sourceLineNo">3163</span><a name="line.3163"></a>
-<span class="sourceLineNo">3164</span>    Scan scan = new Scan(row3, row4);<a name="line.3164"></a>
-<span class="sourceLineNo">3165</span>    scan.setMaxVersions();<a name="line.3165"></a>
-<span class="sourceLineNo">3166</span>    scan.addColumn(family, col1);<a name="line.3166"></a>
-<span class="sourceLineNo">3167</span>    InternalScanner s = region.getScanner(scan);<a name="line.3167"></a>
-<span class="sourceLineNo">3168</span><a name="line.3168"></a>
-<span class="sourceLineNo">3169</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.3169"></a>
-<span class="sourceLineNo">3170</span>    assertEquals(false, s.next(results));<a name="line.3170"></a>
-<span class="sourceLineNo">3171</span>    assertEquals(0, results.size());<a name="line.3171"></a>
-<span class="sourceLineNo">3172</span>  }<a name="line.3172"></a>
+<span class="sourceLineNo">3141</span>  @Test<a name="line.3141"></a>
+<span class="sourceLineNo">3142</span>  public void testScanner_StopRow1542() throws IOException {<a name="line.3142"></a>
+<span class="sourceLineNo">3143</span>    byte[] family = Bytes.toBytes("testFamily");<a name="line.3143"></a>
+<span class="sourceLineNo">3144</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.3144"></a>
+<span class="sourceLineNo">3145</span>    byte[] row1 = Bytes.toBytes("row111");<a name="line.3145"></a>
+<span class="sourceLineNo">3146</span>    byte[] row2 = Bytes.toBytes("row222");<a name="line.3146"></a>
+<span class="sourceLineNo">3147</span>    byte[] row3 = Bytes.toBytes("row333");<a name="line.3147"></a>
+<span class="sourceLineNo">3148</span>    byte[] row4 = Bytes.toBytes("row444");<a name="line.3148"></a>
+<span class="sourceLineNo">3149</span>    byte[] row5 = Bytes.toBytes("row555");<a name="line.3149"></a>
+<span class="sourceLineNo">3150</span><a name="line.3150"></a>
+<span class="sourceLineNo">3151</span>    byte[] col1 = Bytes.toBytes("Pub111");<a name="line.3151"></a>
+<span class="sourceLineNo">3152</span>    byte[] col2 = Bytes.toBytes("Pub222");<a name="line.3152"></a>
+<span class="sourceLineNo">3153</span><a name="line.3153"></a>
+<span class="sourceLineNo">3154</span>    Put put = new Put(row1);<a name="line.3154"></a>
+<span class="sourceLineNo">3155</span>    put.addColumn(family, col1, Bytes.toBytes(10L));<a name="line.3155"></a>
+<span class="sourceLineNo">3156</span>    region.put(put);<a name="line.3156"></a>
+<span class="sourceLineNo">3157</span><a name="line.3157"></a>
+<span class="sourceLineNo">3158</span>    put = new Put(row2);<a name="line.3158"></a>
+<span class="sourceLineNo">3159</span>    put.addColumn(family, col1, Bytes.toBytes(15L));<a name="line.3159"></a>
+<span class="sourceLineNo">3160</span>    region.put(put);<a name="line.3160"></a>
+<span class="sourceLineNo">3161</span><a name="line.3161"></a>
+<span class="sourceLineNo">3162</span>    put = new Put(row3);<a name="line.3162"></a>
+<span class="sourceLineNo">3163</span>    put.addColumn(family, col2, Bytes.toBytes(20L));<a name="line.3163"></a>
+<span class="sourceLineNo">3164</span>    region.put(put);<a name="line.3164"></a>
+<span class="sourceLineNo">3165</span><a name="line.3165"></a>
+<span class="sourceLineNo">3166</span>    put = new Put(row4);<a name="line.3166"></a>
+<span class="sourceLineNo">3167</span>    put.addColumn(family, col2, Bytes.toBytes(30L));<a name="line.3167"></a>
+<span class="sourceLineNo">3168</span>    region.put(put);<a name="line.3168"></a>
+<span class="sourceLineNo">3169</span><a name="line.3169"></a>
+<span class="sourceLineNo">3170</span>    put = new Put(row5);<a name="line.3170"></a>
+<span class="sourceLineNo">3171</span>    put.addColumn(family, col1, Bytes.toBytes(40L));<a name="line.3171"></a>
+<span class="sourceLineNo">3172</span>    region.put(put);<a name="line.3172"></a>
 <span class="sourceLineNo">3173</span><a name="line.3173"></a>
-<span class="sourceLineNo">3174</span>  @Test<a name="line.3174"></a>
-<span class="sourceLineNo">3175</span>  public void testScanner_Wildcard_FromMemStoreAndFiles_EnforceVersions() throws IOException {<a name="line.3175"></a>
-<span class="sourceLineNo">3176</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.3176"></a>
-<span class="sourceLineNo">3177</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.3177"></a>
-<span class="sourceLineNo">3178</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.3178"></a>
-<span class="sourceLineNo">3179</span>    byte[] qf2 = Bytes.toBytes("quateslifier2");<a name="line.3179"></a>
-<span class="sourceLineNo">3180</span><a name="line.3180"></a>
-<span class="sourceLineNo">3181</span>    long ts1 = 1;<a name="line.3181"></a>
-<span class="sourceLineNo">3182</span>    long ts2 = ts1 + 1;<a name="line.3182"></a>
-<span class="sourceLineNo">3183</span>    long ts3 = ts1 + 2;<a name="line.3183"></a>
-<span class="sourceLineNo">3184</span>    long ts4 = ts1 + 3;<a name="line.3184"></a>
-<span class="sourceLineNo">3185</span><a name="line.3185"></a>
-<span class="sourceLineNo">3186</span>    // Setting up region<a name="line.3186"></a>
-<span class="sourceLineNo">3187</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.3187"></a>
-<span class="sourceLineNo">3188</span>    // Putting data in Region<a name="line.3188"></a>
-<span class="sourceLineNo">3189</span>    KeyValue kv14 = new KeyValue(row1, fam1, qf1, ts4, KeyValue.Type.Put, null);<a name="line.3189"></a>
-<span class="sourceLineNo">3190</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.3190"></a>
-<span class="sourceLineNo">3191</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.3191"></a>
-<span class="sourceLineNo">3192</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.3192"></a>
-<span class="sourceLineNo">3193</span><a name="line.3193"></a>
-<span class="sourceLineNo">3194</span>    KeyValue kv24 = new KeyValue(row1, fam1, qf2, ts4, KeyValue.Type.Put, null);<a name="line.3194"></a>
-<span class="sourceLineNo">3195</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.3195"></a>
-<span class="sourceLineNo">3196</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.3196"></a>
-<span class="sourceLineNo">3197</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.3197"></a>
-<span class="sourceLineNo">3198</span><a name="line.3198"></a>
-<span class="sourceLineNo">3199</span>    Put put = null;<a name="line.3199"></a>
-<span class="sourceLineNo">3200</span>    put = new Put(row1);<a name="line.3200"></a>
-<span class="sourceLineNo">3201</span>    put.add(kv14);<a name="line.3201"></a>
-<span class="sourceLineNo">3202</span>    put.add(kv24);<a name="line.3202"></a>
-<span class="sourceLineNo">3203</span>    region.put(put);<a name="line.3203"></a>
-<span class="sourceLineNo">3204</span>    region.flush(true);<a name="line.3204"></a>
-<span class="sourceLineNo">3205</span><a name="line.3205"></a>
-<span class="sourceLineNo">3206</span>    put = new Put(row1);<a name="line.3206"></a>
-<span class="sourceLineNo">3207</span>    put.add(kv23);<a name="line.3207"></a>
-<span class="sourceLineNo">3208</span>    put.add(kv13);<a name="line.3208"></a>
-<span class="sourceLineNo">3209</span>    region.put(put);<a name="line.3209"></a>
-<span class="sourceLineNo">3210</span>    region.flush(true);<a name="line.3210"></a>
-<span class="sourceLineNo">3211</span><a name="line.3211"></a>
-<span class="sourceLineNo">3212</span>    put = new Put(row1);<a name="line.3212"></a>
-<span class="sourceLineNo">3213</span>    put.add(kv22);<a name="line.3213"></a>
-<span class="sourceLineNo">3214</span>    put.add(kv12);<a name="line.3214"></a>
-<span class="sourceLineNo">3215</span>    region.put(put);<a name="line.3215"></a>
-<span class="sourceLineNo">3216</span>    region.flush(true);<a name="line.3216"></a>
-<span class="sourceLineNo">3217</span><a name="line.3217"></a>
-<span class="sourceLineNo">3218</span>    put = new Put(row1);<a name="line.3218"></a>
-<span class="sourceLineNo">3219</span>    put.add(kv21);<a name="line.3219"></a>
-<span class="sourceLineNo">3220</span>    put.add(kv11);<a name="line.3220"></a>
-<span class="sourceLineNo">3221</span>    region.put(put);<a name="line.3221"></a>
-<span class="sourceLineNo">3222</span><a name="line.3222"></a>
-<span class="sourceLineNo">3223</span>    // Expected<a name="line.3223"></a>
-<span class="sourceLineNo">3224</span>    List&lt;KeyValue&gt; expected = new ArrayList&lt;&gt;();<a name="line.3224"></a>
-<span class="sourceLineNo">3225</span>    expected.add(kv14);<a name="line.3225"></a>
-<span class="sourceLineNo">3226</span>    expected.add(kv13);<a name="line.3226"></a>
-<span class="sourceLineNo">3227</span>    expected.add(kv12);<a name="line.3227"></a>
-<span class="sourceLineNo">3228</span>    expected.add(kv24);<a name="line.3228"></a>
-<span class="sourceLineNo">3229</span>    expected.add(kv23);<a name="line.3229"></a>
-<span class="sourceLineNo">3230</span>    expected.add(kv22);<a name="line.3230"></a>
-<span class="sourceLineNo">3231</span><a name="line.3231"></a>
-<span class="sourceLineNo">3232</span>    Scan scan = new Scan(row1);<a name="line.3232"></a>
-<span class="sourceLineNo">3233</span>    int versions = 3;<a name="line.3233"></a>
-<span class="sourceLineNo">3234</span>    scan.setMaxVersions(versions);<a name="line.3234"></a>
-<span class="sourceLineNo">3235</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.3235"></a>
-<span class="sourceLineNo">3236</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.3236"></a>
-<span class="sourceLineNo">3237</span><a name="line.3237"></a>
-<span class="sourceLineNo">3238</span>    boolean hasNext = scanner.next(actual);<a name="line.3238"></a>
-<span class="sourceLineNo">3239</span>    assertEquals(false, hasNext);<a name="line.3239"></a>
-<span class="sourceLineNo">3240</span><a name="line.3240"></a>
-<span class="sourceLineNo">3241</span>    // Verify result<a name="line.3241"></a>
-<span class="sourceLineNo">3242</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.3242"></a>
-<span class="sourceLineNo">3243</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected.get(i), actual.get(i)));<a name="line.3243"></a>
-<span class="sourceLineNo">3244</span>    }<a name="line.3244"></a>
-<span class="sourceLineNo">3245</span>  }<a name="line.3245"></a>
-<span class="sourceLineNo">3246</span><a name="line.3246"></a>
-<span class="sourceLineNo">3247</span>  /**<a name="line.3247"></a>
-<span class="sourceLineNo">3248</span>   * Added for HBASE-5416<a name="line.3248"></a>
-<span class="sourceLineNo">3249</span>   *<a name="line.3249"></a>
-<span class="sourceLineNo">3250</span>   * Here we test scan optimization when only subset of CFs are used in filter<a name="line.3250"></a>
-<span class="sourceLineNo">3251</span>   * conditions.<a name="line.3251"></a>
-<span class="sourceLineNo">3252</span>   */<a name="line.3252"></a>
-<span class="sourceLineNo">3253</span>  @Test<a name="line.3253"></a>
-<span class="sourceLineNo">3254</span>  public void testScanner_JoinedScanners() throws IOException {<a name="line.3254"></a>
-<span class="sourceLineNo">3255</span>    byte[] cf_essential = Bytes.toBytes("essential");<a name="line.3255"></a>
-<span class="sourceLineNo">3256</span>    byte[] cf_joined = Bytes.toBytes("joined");<a name="line.3256"></a>
-<span class="sourceLineNo">3257</span>    byte[] cf_alpha = Bytes.toBytes("alpha");<a name="line.3257"></a>
-<span class="sourceLineNo">3258</span>    this.region = initHRegion(tableName, method, CONF, cf_essential, cf_joined, cf_alpha);<a name="line.3258"></a>
-<span class="sourceLineNo">3259</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.3259"></a>
-<span class="sourceLineNo">3260</span>    byte[] row2 = Bytes.toBytes("row2");<a name="line.3260"></a>
-<span class="sourceLineNo">3261</span>    byte[] row3 = Bytes.toBytes("row3");<a name="line.3261"></a>
-<span class="sourceLineNo">3262</span><a name="line.3262"></a>
-<span class="sourceLineNo">3263</span>    byte[] col_normal = Bytes.toBytes("d");<a name="line.3263"></a>
-<span class="sourceLineNo">3264</span>    byte[] col_alpha = Bytes.toBytes("a");<a name="line.3264"></a>
-<span class="sourceLineNo">3265</span><a name="line.3265"></a>
-<span class="sourceLineNo">3266</span>    byte[] filtered_val = Bytes.toBytes(3);<a name="line.3266"></a>
-<span class="sourceLineNo">3267</span><a name="line.3267"></a>
-<span class="sourceLineNo">3268</span>    Put put = new Put(row1);<a name="line.3268"></a>
-<span class="sourceLineNo">3269</span>    put.addColumn(cf_essential, col_normal, Bytes.toBytes(1));<a name="line.3269"></a>
-<span class="sourceLineNo">3270</span>    put.addColumn(cf_joined, col_alpha, Bytes.toBytes(1));<a name="line.3270"></a>
-<span class="sourceLineNo">3271</span>    region.put(put);<a name="line.3271"></a>
+<span class="sourceLineNo">3174</span>    Scan scan = new Scan(row3, row4);<a name="line.3174"></a>
+<span class="sourceLineNo">3175</span>    scan.setMaxVersions();<a name="line.3175"></a>
+<span class="sourceLineNo">3176</span>    scan.addColumn(family, col1);<a name="line.3176"></a>
+<span class="sourceLineNo">3177</span>    InternalScanner s = region.getScanner(scan);<a name="line.3177"></a>
+<span class="sourceLineNo">3178</span><a name="line.3178"></a>
+<span class="sourceLineNo">3179</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.3179"></a>
+<span class="sourceLineNo">3180</span>    assertEquals(false, s.next(results));<a name="line.3180"></a>
+<span class="sourceLineNo">3181</span>    assertEquals(0, results.size());<a name="line.3181"></a>
+<span class="sourceLineNo">3182</span>  }<a name="line.3182"></a>
+<span class="sourceLineNo">3183</span><a name="line.3183"></a>
+<span class="sourceLineNo">3184</span>  @Test<a name="line.3184"></a>
+<span class="sourceLineNo">3185</span>  public void testScanner_Wildcard_FromMemStoreAndFiles_EnforceVersions() throws IOException {<a name="line.3185"></a>
+<span class="sourceLineNo">3186</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.3186"></a>
+<span class="sourceLineNo">3187</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.3187"></a>
+<span class="sourceLineNo">3188</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.3188"></a>
+<span class="sourceLineNo">3189</span>    byte[] qf2 = Bytes.toBytes("quateslifier2");<a name="line.3189"></a>
+<span class="sourceLineNo">3190</span><a name="line.3190"></a>
+<span class="sourceLineNo">3191</span>    long ts1 = 1;<a name="line.3191"></a>
+<span class="sourceLineNo">3192</span>    long ts2 = ts1 + 1;<a name="line.3192"></a>
+<span class="sourceLineNo">3193</span>    long ts3 = ts1 + 2;<a name="line.3193"></a>
+<span class="sourceLineNo">3194</span>    long ts4 = ts1 + 3;<a name="line.3194"></a>
+<span class="sourceLineNo">3195</span><a name="line.3195"></a>
+<span class="sourceLineNo">3196</span>    // Setting up region<a name="line.3196"></a>
+<span class="sourceLineNo">3197</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.3197"></a>
+<span class="sourceLineNo">3198</span>    // Putting data in Region<a name="line.3198"></a>
+<span class="sourceLineNo">3199</span>    KeyValue kv14 = new KeyValue(row1, fam1, qf1, ts4, KeyValue.Type.Put, null);<a name="line.3199"></a>
+<span class="sourceLineNo">3200</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.3200"></a>
+<span class="sourceLineNo">3201</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.3201"></a>
+<span class="sourceLineNo">3202</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.3202"></a>
+<span class="sourceLineNo">3203</span><a name="line.3203"></a>
+<span class="sourceLineNo">3204</span>    KeyValue kv24 = new KeyValue(row1, fam1, qf2, ts4, KeyValue.Type.Put, null);<a name="line.3204"></a>
+<span class="sourceLineNo">3205</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.3205"></a>
+<span class="sourceLineNo">3206</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.3206"></a>
+<span class="sourceLineNo">3207</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.3207"></a>
+<span class="sourceLineNo">3208</span><a name="line.3208"></a>
+<span class="sourceLineNo">3209</span>    Put put = null;<a name="line.3209"></a>
+<span class="sourceLineNo">3210</span>    put = new Put(row1);<a name="line.3210"></a>
+<span class="sourceLineNo">3211</span>    put.add(kv14);<a name="line.3211"></a>
+<span class="sourceLineNo">3212</span>    put.add(kv24);<a name="line.3212"></a>
+<span class="sourceLineNo">3213</span>    region.put(put);<a name="line.3213"></a>
+<span class="sourceLineNo">3214</span>    region.flush(true);<a name="line.3214"></a>
+<span class="sourceLineNo">3215</span><a name="line.3215"></a>
+<span class="sourceLineNo">3216</span>    put = new Put(row1);<a name="line.3216"></a>
+<span class="sourceLineNo">3217</span>    put.add(kv23);<a name="line.3217"></a>
+<span class="sourceLineNo">3218</span>    put.add(kv13);<a name="line.3218"></a>
+<span class="sourceLineNo">3219</span>    region.put(put);<a name="line.3219"></a>
+<span class="sourceLineNo">3220</span>    region.flush(true);<a name="line.3220"></a>
+<span class="sourceLineNo">3221</span><a name="line.3221"></a>
+<span class="sourceLineNo">3222</span>    put = new Put(row1);<a name="line.3222"></a>
+<span class="sourceLineNo">3223</span>    put.add(kv22);<a name="line.3223"></a>
+<span class="sourceLineNo">3224</span>    put.add(kv12);<a name="line.3224"></a>
+<span class="sourceLineNo">3225</span>    region.put(put);<a name="line.3225"></a>
+<span class="sourceLineNo">3226</span>    region.flush(true);<a name="line.3226"></a>
+<span class="sourceLineNo">3227</span><a name="line.3227"></a>
+<span class="sourceLineNo">3228</span>    put = new Put(row1);<a name="line.3228"></a>
+<span class="sourceLineNo">3229</span>    put.add(kv21);<a name="line.3229"></a>
+<span class="sourceLineNo">3230</span>    put.add(kv11);<a name="line.3230"></a>
+<span class="sourceLineNo">3231</span>    region.put(put);<a name="line.3231"></a>
+<span class="sourceLineNo">3232</span><a name="line.3232"></a>
+<span class="sourceLineNo">3233</span>    // Expected<a name="line.3233"></a>
+<span class="sourceLineNo">3234</span>    List&lt;KeyValue&gt; expected = new ArrayList&lt;&gt;();<a name="line.3234"></a>
+<span class="sourceLineNo">3235</span>    expected.add(kv14);<a name="line.3235"></a>
+<span class="sourceLineNo">3236</span>    expected.add(kv13);<a name="line.3236"></a>
+<span class="sourceLineNo">3237</span>    expected.add(kv12);<a name="line.3237"></a>
+<span class="sourceLineNo">3238</span>    expected.add(kv24);<a name="line.3238"></a>
+<span class="sourceLineNo">3239</span>    expected.add(kv23);<a name="line.3239"></a>
+<span class="sourceLineNo">3240</span>    expected.add(kv22);<a name="line.3240"></a>
+<span class="sourceLineNo">3241</span><a name="line.3241"></a>
+<span class="sourceLineNo">3242</span>    Scan scan = new Scan(row1);<a name="line.3242"></a>
+<span class="sourceLineNo">3243</span>    int versions = 3;<a name="line.3243"></a>
+<span class="sourceLineNo">3244</span>    scan.setMaxVersions(versions);<a name="line.3244"></a>
+<span class="sourceLineNo">3245</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.3245"></a>
+<span class="sourceLineNo">3246</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.3246"></a>
+<span class="sourceLineNo">3247</span><a name="line.3247"></a>
+<span class="sourceLineNo">3248</span>    boolean hasNext = scanner.next(actual);<a name="line.3248"></a>
+<span class="sourceLineNo">3249</span>    assertEquals(false, hasNext);<a name="line.3249"></a>
+<span class="sourceLineNo">3250</span><a name="line.3250"></a>
+<span class="sourceLineNo">3251</span>    // Verify result<a name="line.3251"></a>
+<span class="sourceLineNo">3252</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.3252"></a>
+<span class="sourceLineNo">3253</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected.get(i), actual.get(i)));<a name="line.3253"></a>
+<span class="sourceLineNo">3254</span>    }<a name="line.3254"></a>
+<span class="sourceLineNo">3255</span>  }<a name="line.3255"></a>
+<span class="sourceLineNo">3256</span><a name="line.3256"></a>
+<span class="sourceLineNo">3257</span>  /**<a name="line.3257"></a>
+<span class="sourceLineNo">3258</span>   * Added for HBASE-5416<a name="line.3258"></a>
+<span class="sourceLineNo">3259</span>   *<a name="line.3259"></a>
+<span class="sourceLineNo">3260</span>   * Here we test scan optimization when only subset of CFs are used in filter<a name="line.3260"></a>
+<span class="sourceLineNo">3261</span>   * conditions.<a name="line.3261"></a>
+<span class="sourceLineNo">3262</span>   */<a name="line.3262"></a>
+<span class="sourceLineNo">3263</span>  @Test<a name="line.3263"></a>
+<span class="sourceLineNo">3264</span>  public void testScanner_JoinedScanners() throws IOException {<a name="line.3264"></a>
+<span class="sourceLineNo">3265</span>    byte[] cf_essential = Bytes.toBytes("essential");<a name="line.3265"></a>
+<span class="sourceLineNo">3266</span>    byte[] cf_joined = Bytes.toBytes("joined");<a name="line.3266"></a>
+<span class="sourceLineNo">3267</span>    byte[] cf_alpha = Bytes.toBytes("alpha");<a name="line.3267"></a>
+<span class="sourceLineNo">3268</span>    this.region = initHRegion(tableName, method, CONF, cf_essential, cf_joined, cf_alpha);<a name="line.3268"></a>
+<span class="sourceLineNo">3269</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.3269"></a>
+<span class="sourceLineNo">3270</span>    byte[] row2 = Bytes.toBytes("row2");<a name="line.3270"></a>
+<span class="sourceLineNo">3271</span>    byte[] row3 = Bytes.toBytes("row3");<a name="line.3271"></a>
 <span class="sourceLineNo">3272</span><a name="line.3272"></a>
-<span class="sourceLineNo">3273</span>    put = new Put(row2);<a name="line.3273"></a>
-<span class="sourceLineNo">3274</span>    put.addColumn(cf_essential, col_alpha, Bytes.toBytes(2));<a name="line.3274"></a>
-<span class="sourceLineNo">3275</span>    put.addColumn(cf_joined, col_normal, Bytes.toBytes(2));<a name="line.3275"></a>
-<span class="sourceLineNo">3276</span>    put.addColumn(cf_alpha, col_alpha, Bytes.toBytes(2));<a name="line.3276"></a>
-<span class="sourceLineNo">3277</span>    region.put(put);<a name="line.3277"></a>
-<span class="sourceLineNo">3278</span><a name="line.3278"></a>
-<span class="sourceLineNo">3279</span>    put = new Put(row3);<a name="line.3279"></a>
-<span class="sourceLineNo">3280</span>    put.addColumn(cf_essential, col_normal, filtered_val);<a name="line.3280"></a>
-<span class="sourceLineNo">3281</span>    put.addColumn(cf_joined, col_normal, filtered_val);<a name="line.3281"></a>
-<span class="sourceLineNo">3282</span>    region.put(put);<a name="line.3282"></a>
-<span class="sourceLineNo">3283</span><a name="line.3283"></a>
-<span class="sourceLineNo">3284</span>    // Check two things:<a name="line.3284"></a>
-<span class="sourceLineNo">3285</span>    // 1. result list contains expected values<a name="line.3285"></a>
-<span class="sourceLineNo">3286</span>    // 2. result list is sorted properly<a name="line.3286"></a>
-<span class="sourceLineNo">3287</span><a name="line.3287"></a>
-<span class="sourceLineNo">3288</span>    Scan scan = new Scan();<a name="line.3288"></a>
-<span class="sourceLineNo">3289</span>    Filter filter = new SingleColumnValueExcludeFilter(cf_essential, col_normal,<a name="line.3289"></a>
-<span class="sourceLineNo">3290</span>            CompareOperator.NOT_EQUAL, filtered_val);<a name="line.3290"></a>
-<span class="sourceLineNo">3291</span>    scan.setFilter(filter);<a name="line.3291"></a>
-<span class="sourceLineNo">3292</span>    scan.setLoadColumnFamiliesOnDemand(true);<a name="line.3292"></a>
-<span class="sourceLineNo">3293</span>    InternalScanner s = region.getScanner(scan);<a name="line.3293"></a>
-<span class="sourceLineNo">3294</span><a name="line.3294"></a>
-<span class="sourceLineNo">3295</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.3295"></a>
-<span class="sourceLineNo">3296</span>    assertTrue(s.next(results));<a name="line.3296"></a>
-<span class="sourceLineNo">3297</span>    assertEquals(1, results.size());<a name="line.3297"></a>
-<span class="sourceLineNo">3298</span>    results.clear();<a name="line.3298"></a>
-<span class="sourceLineNo">3299</span><a name="line.3299"></a>
-<span class="sourceLineNo">3300</span>    assertTrue(s.next(results));<a name="line.3300"></a>
-<span class="sourceLineNo">3301</span>    assertEquals(3, results.size());<a name="line.3301"></a>
-<span class="sourceLineNo">3302</span>    assertTrue("orderCheck", CellUtil.matchingFamily(results.get(0), cf_alpha));<a name="line.3302"></a>
-<span class="sourceLineNo">3303</span>    assertTrue("orderCheck", CellUtil.matchingFamily(results.get(1), cf_essential));<a name="line.3303"></a>
-<span class="sourceLineNo">3304</span>    assertTrue("orderCheck", CellUtil.matchingFamily(results.get(2), cf_joined));<a name="line.3304"></a>
-<span class="sourceLineNo">3305</span>    results.clear();<a name="line.3305"></a>
-<span class="sourceLineNo">3306</span><a name="line.3306"></a>
-<span class="sourceLineNo">3307</span>    assertFalse(s.next(results));<a name="line.3307"></a>
-<span class="sourceLineNo">3308</span>    assertEquals(0, results.size());<a name="line.3308"></a>
-<span class="sourceLineNo">3309</span>  }<a name="line.3309"></a>
-<span class="sourceLineNo">3310</span><a name="line.3310"></a>
-<span class="sourceLineNo">3311</span>  /**<a name="line.3311"></a>
-<span class="sourceLineNo">3312</span>   * HBASE-5416<a name="line.3312"></a>
-<span class="sourceLineNo">3313</span>   *<a name="line.3313"></a>
-<span class="sourceLineNo">3314</span>   * Test case when scan limits amount of KVs returned on each next() call.<a name="line.3314"></a>
-<span class="sourceLineNo">3315</span>   */<a name="line.3315"></a>
-<span class="sourceLineNo">3316</span>  @Test<a name="line.3316"></a>
-<span class="sourceLineNo">3317</span>  public void testScanner_JoinedScannersWithLimits() throws IOException {<a name="line.3317"></a>
-<span class="sourceLineNo">3318</span>    final byte[] cf_first = Bytes.toBytes("first");<a name="line.3318"></a>
-<span class="sourceLineNo">3319</span>    final byte[] cf_second = Bytes.toBytes("second");<a name="line.3319"></a>
+<span class="sourceLineNo">3273</span>    byte[] col_normal = Bytes.toBytes("d");<a name="line.3273"></a>
+<span class="sourceLineNo">3274</span>    byte[] col_alpha = Bytes.toBytes("a");<a name="line.3274"></a>
+<span class="sourceLineNo">3275</span><a name="line.3275"></a>
+<span class="sourceLineNo">3276</span>    byte[] filtered_val = Bytes.toBytes(3);<a name="line.3276"></a>
+<span class="sourceLineNo">3277</span><a name="line.3277"></a>
+<span class="sourceLineNo">3278</span>    Put put = new Put(row1);<a name="line.3278"></a>
+<span class="sourceLineNo">3279</span>    put.addColumn(cf_essential, col_normal, Bytes.toBytes(1));<a name="line.3279"></a>
+<span class="sourceLineNo">3280</span>    put.addColumn(cf_joined, col_alpha, Bytes.toBytes(1));<a name="line.3280"></a>
+<span class="sourceLineNo">3281</span>    region.put(put);<a name="line.3281"></a>
+<span class="sourceLineNo">3282</span><a name="line.3282"></a>
+<span class="sourceLineNo">3283</span>    put = new Put(row2);<a name="line.3283"></a>
+<span class="sourceLineNo">3284</span>    put.addColumn(cf_essential, col_alpha, Bytes.toBytes(2));<a name="line.3284"></a>
+<span class="sourceLineNo">3285</span>    put.addColumn(cf_joined, col_normal, Bytes.toBytes(2));<a name="line.3285"></a>
+<span class="sourceLineNo">3286</span>    put.addColumn(cf_alpha, col_alpha, Bytes.toBytes(2));<a name="line.3286"></a>
+<span class="sourceLineNo">3287</span>    region.put(put);<a name="line.3287"></a>
+<span class="sourceLineNo">3288</span><a name="line.3288"></a>
+<span class="sourceLineNo">3289</span>    put = new Put(row3);<a name="line.3289"></a>
+<span class="sourceLineNo">3290</span>    put.addColumn(cf_essential, col_normal, filtered_val);<a name="line.3290"></a>
+<span class="sourceLineNo">3291</span>    put.addColumn(cf_joined, col_normal, filtered_val);<a name="line.3291"></a>
+<span class="sourceLineNo">3292</span>    region.put(put);<a name="line.3292"></a>
+<span class="sourceLineNo">3293</span><a name="line.3293"></a>
+<span class="sourceLineNo">3294</span>    // Check two things:<a name="line.3294"></a>
+<span class="sourceLineNo">3295</span>    // 1. result list contains expected values<a name="line.3295"></a>
+<span class="sourceLineNo">3296</span>    // 2. result list is sorted properly<a name="line.3296"></a>
+<span class="sourceLineNo">3297</span><a name="line.3297"></a>
+<span class="sourceLineNo">3298</span>    Scan scan = new Scan();<a name="line.3298"></a>
+<span class="sourceLineNo">3299</span>    Filter filter = new SingleColumnValueExcludeFilter(cf_essential, col_normal,<a name="line.3299"></a>
+<span class="sourceLineNo">3300</span>            CompareOperator.NOT_EQUAL, filtered_val);<a name="line.3300"></a>
+<span class="sourceLineNo">3301</span>    scan.setFilter(filter);<a name="line.3301"></a>
+<span class="sourceLineNo">3302</span>    scan.setLoadColumnFamiliesOnDemand(true);<a name="line.3302"></a>
+<span class="sourceLineNo">3303</span>    InternalScanner s = region.getScanner(scan);<a name="line.3303"></a>
+<span class="sourceLineNo">3304</span><a name="line.3304"></a>
+<span class="sourceLineNo">3305</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.3305"></a>
+<span class="sourceLineNo">3306</span>    assertTrue(s.next(results));<a name="line.3306"></a>
+<span class="sourceLineNo">3307</span>    assertEquals(1, results.size());<a name="line.3307"></a>
+<span class="sourceLineNo">3308</span>    results.clear();<a name="line.3308"></a>
+<span class="sourceLineNo">3309</span><a name="line.3309"></a>
+<span class="sourceLineNo">3310</span>    assertTrue(s.next(results));<a name="line.3310"></a>
+<span class="sourceLineNo">3311</span>    assertEquals(3, results.size());<a name="line.3311"></a>
+<span class="sourceLineNo">3312</span>    assertTrue("orderCheck", CellUtil.matchingFamily(results.get(0), cf_alpha));<a name="line.3312"></a>
+<span class="sourceLineNo">3313</span>    assertTrue("orderCheck", CellUtil.matchingFamily(results.get(1), cf_essential));<a name="line.3313"></a>
+<span class="sourceLineNo">3314</span>    assertTrue("orderCheck", CellUtil.matchingFamily(results.get(2), cf_joined));<a name="line.3314"></a>
+<span class="sourceLineNo">3315</span>    results.clear();<a name="line.3315"></a>
+<span class="sourceLineNo">3316</span><a name="line.3316"></a>
+<span class="sourceLineNo">3317</span>    assertFalse(s.next(results));<a name="line.3317"></a>
+<span class="sourceLineNo">3318</span>    assertEquals(0, results.size());<a name="line.3318"></a>
+<span class="sourceLineNo">3319</span>  }<a name="line.3319"></a>
 <span class="sourceLineNo">3320</span><a name="line.3320"></a>
-<span class="sourceLineNo">3321</span>    this.region = initHRegion(tableName, method, CONF, cf_first, cf_second);<a name="line.3321"></a>
-<span class="sourceLineNo">3322</span>    final byte[] col_a = Bytes.toBytes("a");<a name="line.3322"></a>
-<span class="sourceLineNo">3323</span>    final byte[] col_b = Bytes.toBytes("b");<a name="line.3323"></a>
-<span class="sourceLineNo">3324</span><a name="line.3324"></a>
-<span class="sourceLineNo">3325</span>    Put put;<a name="line.3325"></a>
-<span class="sourceLineNo">3326</span><a name="line.3326"></a>
-<span class="sourceLineNo">3327</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.3327"></a>
-<span class="sourceLineNo">3328</span>      put = new Put(Bytes.toBytes("r" + Integer.toString(i)));<a name="line.3328"></a>
-<span class="sourceLineNo">3329</span>      put.addColumn(cf_first, col_a, Bytes.toBytes(i));<a name="line.3329"></a>
-<span class="sourceLineNo">3330</span>      if (i &lt; 5) {<a name="line.3330"></a>
-<span class="sourceLineNo">3331</span>        put.addColumn(cf_first, col_b, Bytes.toBytes(i));<a name="line.3331"></a>
-<span class="sourceLineNo">3332</span>        put.addColumn(cf_second, col_a, Bytes.toBytes(i));<a name="line.3332"></a>
-<span class="sourceLineNo">3333</span>        put.addColumn(cf_second, col_b, Bytes.toBytes(i));<a name="line.3333"></a>
-<span class="sourceLineNo">3334</span>      }<a name="line.3334"></a>
-<span class="sourceLineNo">3335</span>      region.put(put);<a name="line.3335"></a>
-<span class="sourceLineNo">3336</span>    }<a name="line.3336"></a>
-<span class="sourceLineNo">3337</span><a name="line.3337"></a>
-<span class="sourceLineNo">3338</span>    Scan scan = new Scan();<a name="line.3338"></a>
-<span class="sourceLineNo">3339</span>    scan.setLoadColumnFamiliesOnDemand(true);<a name="line.3339"></a>
-<span class="sourceLineNo">3340</span>    Filter bogusFilter = new FilterBase() {<a name="line.3340"></a>
-<span class="sourceLineNo">3341</span>      @Override<a name="line.3341"></a>
-<span class="sourceLineNo">3342</span>      public ReturnCode filterCell(final Cell ignored) throws IOException {<a name="line.3342"></a>
-<span class="sourceLineNo">3343</span>        return ReturnCode.INCLUDE;<a name="line.3343"></a>
+<span class="sourceLineNo">3321</span>  /**<a name="line.3321"></a>
+<span class="sourceLineNo">3322</span>   * HBASE-5416<a name="line.3322"></a>
+<span class="sourceLineNo">3323</span>   *<a name="line.3323"></a>
+<span class="sourceLineNo">3324</span>   * Test case when scan limits amount of KVs returned on each next() call.<a name="line.3324"></a>
+<span class="sourceLineNo">3325</span>   */<a name="line.3325"></a>
+<span class="sourceLineNo">3326</span>  @Test<a name="line.3326"></a>
+<span class="sourceLineNo">3327</span>  public void testScanner_JoinedScannersWithLimits() throws IOException {<a name="line.3327"></a>
+<span class="sourceLineNo">3328</span>    final byte[] cf_first = Bytes.toBytes("first");<a name="line.3328"></a>
+<span class="sourceLineNo">3329</span>    final byte[] cf_second = Bytes.toBytes("second");<a name="line.3329"></a>
+<span class="sourceLineNo">3330</span><a name="line.3330"></a>
+<span class="sourceLineNo">3331</span>    this.region = initHRegion(tableName, method, CONF, cf_first, cf_second);<a name="line.3331"></a>
+<span class="sourceLineNo">3332</span>    final byte[] col_a = Bytes.toBytes("a");<a name="line.3332"></a>
+<span class="sourceLineNo">3333</span>    final byte[] col_b = Bytes.toBytes("b");<a name="line.3333"></a>
+<span class="sourceLineNo">3334</span><a name="line.3334"></a>
+<span class="sourceLineNo">3335</span>    Put put;<a name="line.3335"></a>
+<span class="sourceLineNo">3336</span><a name="line.3336"></a>
+<span class="sourceLineNo">3337</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.3337"></a>
+<span class="sourceLineNo">3338</span>      put = new Put(Bytes.toBytes("r" + Integer.toString(i)));<a name="line.3338"></a>
+<span class="sourceLineNo">3339</span>      put.addColumn(cf_first, col_a, Bytes.toBytes(i));<a name="line.3339"></a>
+<span class="sourceLineNo">3340</span>      if (i &lt; 5) {<a name="line.3340"></a>
+<span class="sourceLineNo">3341</span>        put.addColumn(cf_first, col_b, Bytes.toBytes(i));<a name="line.3341"></a>
+<span class="sourceLineNo">3342</span>        put.addColumn(cf_second, col_a, Bytes.toBytes(i));<a name="line.3342"></a>
+<span class="sourceLineNo">3343</span>        put.addColumn(cf_second, col_b, Bytes.toBytes(i));<a name="line.3343"></a>
 <span class="sourceLineNo">3344</span>      }<a name="line.3344"></a>
-<span class="sourceLineNo">3345</span>      @Override<a name="line.3345"></a>
-<span class="sourceLineNo">3346</span>      public boolean isFamilyEssential(byte[] name) {<a name="line.3346"></a>
-<span class="sourceLineNo">3347</span>        return Bytes.equals(name, cf_first);<a name="line.3347"></a>
-<span class="sourceLineNo">3348</span>      }<a name="line.3348"></a>
-<span class="sourceLineNo">3349</span>    };<a name="line.3349"></a>
-<span class="sourceLineNo">3350</span><a name="line.3350"></a>
-<span class="sourceLineNo">3351</span>    scan.setFilter(bogusFilter);<a name="line.3351"></a>
-<span class="sourceLineNo">3352</span>    InternalScanner s = region.getScanner(scan);<a name="line.3352"></a>
-<span class="sourceLineNo">3353</span><a name="line.3353"></a>
-<span class="sourceLineNo">3354</span>    // Our data looks like this:<a name="line.3354"></a>
-<span class="sourceLineNo">3355</span>    // r0: first:a, first:b, second:a, second:b<a name="line.3355"></a>
-<span class="sourceLineNo">3356</span>    // r1: first:a, first:b, second:a, second:b<a name="line.3356"></a>
-<span class="sourceLineNo">3357</span>    // r2: first:a, first:b, second:a, second:b<a name="line.3357"></a>
-<span class="sourceLineNo">3358</span>    // r3: first:a, first:b, second:a, second:b<a name="line.3358"></a>
-<span class="sourceLineNo">3359</span>    // r4: first:a, first:b, second:a, second:b<a name="line.3359"></a>
-<span class="sourceLineNo">3360</span>    // r5: first:a<a name="line.3360"></a>
-<span class="sourceLineNo">3361</span>    // r6: first:a<a name="line.3361"></a>
-<span class="sourceLineNo">3362</span>    // r7: first:a<a name="line.3362"></a>
-<span class="sourceLineNo">3363</span>    // r8: first:a<a name="line.3363"></a>
-<span class="sourceLineNo">3364</span>    // r9: first:a<a name="line.3364"></a>
-<span class="sourceLineNo">3365</span><a name="line.3365"></a>
-<span class="sourceLineNo">3366</span>    // But due to next's limit set to 3, we should get this:<a name="line.3366"></a>
-<span class="sourceLineNo">3367</span>    // r0: first:a, first:b, second:a<a name="line.3367"></a>
-<span class="sourceLineNo">3368</span>    // r0: second:b<a name="line.3368"></a>
-<span class="sourceLineNo">3369</span>    // r1: first:a, first:b, second:a<a name="line.3369"></a>
-<span class="sourceLineNo">3370</span>    // r1: second:b<a name="line.3370"></a>
-<span class="sourceLineNo">3371</span>    // r2: first:a, first:b, second:a<a name="line.3371"></a>
-<span class="sourceLineNo">3372</span>    // r2: second:b<a name="line.3372"></a>
-<span class="sourceLineNo">3373</span>    // r3: first:a, first:b, second:a<a name="line.3373"></a>
-<span class="sourceLineNo">3374</span>    // r3: second:b<a name="line.3374"></a>
-<span class="sourceLineNo">3375</span>    // r4: first:a, first:b, second:a<a name="line.3375"></a>
-<span class="sourceLineNo">3376</span>    // r4: second:b<a name="line.3376"></a>
-<span class="sourceLineNo">3377</span>    // r5: first:a<a name="line.3377"></a>
-<span class="sourceLineNo">3378</span>    // r6: first:a<a name="line.3378"></a>
-<span class="sourceLineNo">3379</span>    // r7: first:a<a name="line.3379"></a>
-<span class="sourceLineNo">3380</span>    // r8: first:a<a name="line.3380"></a>
-<span class="sourceLineNo">3381</span>    // r9: first:a<a name="line.3381"></a>
-<span class="sourceLineNo">3382</span><a name="line.3382"></a>
-<span class="sourceLineNo">3383</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.3383"></a>
-<span class="sourceLineNo">3384</span>    int index = 0;<a name="line.3384"></a>
-<span class="sourceLineNo">3385</span>    ScannerContext scannerContext = ScannerContext.newBuilder().setBatchLimit(3).build();<a name="line.3385"></a>
-<span class="sourceLineNo">3386</span>    while (true) {<a name="line.3386"></a>
-<span class="sourceLineNo">3387</span>      boolean more = s.next(results, scannerContext);<a name="line.3387"></a>
-<span class="sourceLineNo">3388</span>      if ((index &gt;&gt; 1) &lt; 5) {<a name="line.3388"></a>
-<span class="sourceLineNo">3389</span>        if (index % 2 == 0) {<a name="line.3389"></a>
-<span class="sourceLineNo">3390</span>          assertEquals(3, results.size());<a name="line.3390"></a>
-<span class="sourceLineNo">3391</span>        } else {<a name="line.3391"></a>
-<span class="sourceLineNo">3392</span>          assertEquals(1, results.size());<a name="line.3392"></a>
-<span class="sourceLineNo">3393</span>        }<a name="line.3393"></a>
-<span class="sourceLineNo">3394</span>      } else {<a name="line.3394"></a>
-<span class="sourceLineNo">3395</span>        assertEquals(1, results.size());<a name="line.3395"></a>
-<span class="sourceLineNo">3396</span>      }<a name="line.3396"></a>
-<span class="sourceLineNo">3397</span>      results.clear();<a name="line.3397"></a>
-<span class="sourceLineNo">3398</span>      index++;<a name="line.3398"></a>
-<span class="sourceLineNo">3399</span>      if (!more) {<a name="line.3399"></a>
-<span class="sourceLineNo">3400</span>        break;<a name="line.3400"></a>
-<span class="sourceLineNo">3401</span>      }<a name="line.3401"></a>
-<span class="sourceLineNo">3402</span>    }<a name="line.3402"></a>
-<span class="sourceLineNo">3403</span>  }<a name="line.3403"></a>
-<span class="sourceLineNo">3404</span><a name="line.3404"></a>
-<span class="sourceLineNo">3405</span>  /**<a name="line.3405"></a>
-<span class="sourceLineNo">3406</span>   * Write an HFile block full with Cells whose qualifier that are identical between<a name="line.3406"></a>
-<span class="sourceLineNo">3407</span>   * 0 and Short.MAX_VALUE. See HBASE-13329.<a name="line.3407"></a>
-<span class="sourceLineNo">3408</span>   * @throws Exception<a name="line.3408"></a>
-<span class="sourceLineNo">3409</span>   */<a name="line.3409"></a>
-<span class="sourceLineNo">3410</span>  @Test<a name="line.3410"></a>
-<span class="sourceLineNo">3411</span>  public void testLongQualifier() throws Exception {<a name="line.3411"></a>
-<span class="sourceLineNo">3412</span>    byte[] family = Bytes.toBytes("family");<a name="line.3412"></a>
-<span class="sourceLineNo">3413</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.3413"></a>
-<span class="sourceLineNo">3414</span>    byte[] q = new byte[Short.MAX_VALUE+2];<a name="line.3414"></a>
-<span class="sourceLineNo">3415</span>    Arrays.fill(q, 0, q.length-1, (byte)42);<a name="line.3415"></a>
-<span class="sourceLineNo">3416</span>    for (byte i=0; i&lt;10; i++) {<a name="line.3416"></a>
-<span class="sourceLineNo">3417</span>      Put p = new Put(Bytes.toBytes("row"));<a name="line.3417"></a>
-<span class="sourceLineNo">3418</span>      // qualifiers that differ past Short.MAX_VALUE<a name="line.3418"></a>
-<span class="sourceLineNo">3419</span>      q[q.length-1]=i;<a name="line.3419"></a>
-<span class="sourceLineNo">3420</span>      p.addColumn(family, q, q);<a name="line.3420"></a>
-<span class="sourceLineNo">3421</span>      region.put(p);<a name="line.3421"></a>
-<span class="sourceLineNo">3422</span>    }<a name="line.3422"></a>
-<span class="sourceLineNo">3423</span>    region.flush(false);<a name="line.3423"></a>
-<span class="sourceLineNo">3424</span>  }<a name="line.3424"></a>
-<span class="sourceLineNo">3425</span><a name="line.3425"></a>
-<span class="sourceLineNo">3426</span>  /**<a name="line.3426"></a>
-<span class="sourceLineNo">3427</span>   * Flushes the cache in a thread while scanning. The tests verify that the<a name="line.3427"></a>
-<span class="sourceLineNo">3428</span>   * scan is coherent - e.g. the returned results are always of the same or<a name="line.3428"></a>
-<span class="sourceLineNo">3429</span>   * later update as the previous results.<a name="line.3429"></a>
-<span class="sourceLineNo">3430</span>   *<a name="line.3430"></a>
-<span class="sourceLineNo">3431</span>   * @throws IOException<a name="line.3431"></a>
-<span class="sourceLineNo">3432</span>   *           scan / compact<a name="line.3432"></a>
-<span class="sourceLineNo">3433</span>   * @throws InterruptedException<a name="line.3433"></a>
-<span class="sourceLineNo">3434</span>   *           thread join<a name="line.3434"></a>
-<span class="sourceLineNo">3435</span>   */<a name="line.3435"></a>
-<span class="sourceLineNo">3436</span>  @Test<a name="line.3436"></a>
-<span class="sourceLineNo">3437</span>  public void testFlushCacheWhileScanning() throws IOException, InterruptedException {<a name="line.3437"></a>
-<span class="sourceLineNo">3438</span>    byte[] family = Bytes.toBytes("family");<a name="line.3438"></a>
-<span class="sourceLineNo">3439</span>    int numRows = 1000;<a name="line.3439"></a>
-<span class="sourceLineNo">3440</span>    int flushAndScanInterval = 10;<a name="line.3440"></a>
-<span class="sourceLineNo">3441</span>    int compactInterval = 10 * flushAndScanInterval;<a name="line.3441"></a>
-<span class="sourceLineNo">3442</span><a name="line.3442"></a>
-<span class="sourceLineNo">3443</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.3443"></a>
-<span class="sourceLineNo">3444</span>    FlushThread flushThread = new FlushThread();<a name="line.3444"></a>
-<span class="sourceLineNo">3445</span>    try {<a name="line.3445"></a>
-<span class="sourceLineNo">3446</span>      flushThread.start();<a name="line.3446"></a>
-<span class="sourceLineNo">3447</span><a name="line.3447"></a>
-<span class="sourceLineNo">3448</span>      Scan scan = new Scan();<a name="line.3448"></a>
-<span class="sourceLineNo">3449</span>      scan.addFamily(family);<a name="line.3449"></a>
-<span class="sourceLineNo">3450</span>      scan.setFilter(new SingleColumnValueFilter(family, qual1, CompareOperator.EQUAL,<a name="line.3450"></a>
-<span class="sourceLineNo">3451</span>          new BinaryComparator(Bytes.toBytes(5L))));<a name="line.3451"></a>
+<span class="sourceLineNo">3345</span>      region.put(put);<a name="line.3345"></a>
+<span class="sourceLineNo">3346</span>    }<a name="line.3346"></a>
+<span class="sourceLineNo">3347</span><a name="line.3347"></a>
+<span class="sourceLineNo">3348</span>    Scan scan = new Scan();<a name="line.3348"></a>
+<span class="sourceLineNo">3349</span>    scan.setLoadColumnFamiliesOnDemand(true);<a name="line.3349"></a>
+<span class="sourceLineNo">3350</span>    Filter bogusFilter = new FilterBase() {<a name="line.3350"></a>
+<span class="sourceLineNo">3351</span>      @Override<a name="line.3351"></a>
+<span class="sourceLineNo">3352</span>      public ReturnCode filterCell(final Cell ignored) throws IOException {<a name="line.3352"></a>
+<span class="sourceLineNo">3353</span>        return ReturnCode.INCLUDE;<a name="line.3353"></a>
+<span class="sourceLineNo">3354</span>      }<a name="line.3354"></a>
+<span class="sourceLineNo">3355</span>      @Override<a name="line.3355"></a>
+<span class="sourceLineNo">3356</span>      public boolean isFamilyEssential(byte[] name) {<a name="line.3356"></a>
+<span class="sourceLineNo">3357</span>        return Bytes.equals(name, cf_first);<a name="line.3357"></a>
+<span class="sourceLineNo">3358</span>      }<a name="line.3358"></a>
+<span class="sourceLineNo">3359</span>    };<a name="line.3359"></a>
+<span class="sourceLineNo">3360</span><a name="line.3360"></a>
+<span class="sourceLineNo">3361</span>    scan.setFilter(bogusFilter);<a name="line.3361"></a>
+<span class="sourceLineNo">3362</span>    InternalScanner s = region.getScanner(scan);<a name="line.3362"></a>
+<span class="sourceLineNo">3363</span><a name="line.3363"></a>
+<span class="sourceLineNo">3364</span>    // Our data looks like this:<a name="line.3364"></a>
+<span class="sourceLineNo">3365</span>    // r0: first:a, first:b, second:a, second:b<a name="line.3365"></a>
+<span class="sourceLineNo">3366</span>    // r1: first:a, first:b, second:a, second:b<a name="line.3366"></a>
+<span class="sourceLineNo">3367</span>    // r2: first:a, first:b, second:a, second:b<a name="line.3367"></a>
+<span class="sourceLineNo">3368</span>    // r3: first:a, first:b, second:a, second:b<a name="line.3368"></a>
+<span class="sourceLineNo">3369</span>    // r4: first:a, first:b, second:a, second:b<a name="line.3369"></a>
+<span class="sourceLineNo">3370</span>    // r5: first:a<a name="line.3370"></a>
+<span class="sourceLineNo">3371</span>    // r6: first:a<a name="line.3371"></a>
+<span class="sourceLineNo">3372</span>    // r7: first:a<a name="line.3372"></a>
+<span class="sourceLineNo">3373</span>    // r8: first:a<a name="line.3373"></a>
+<span class="sourceLineNo">3374</span>    // r9: first:a<a name="line.3374"></a>
+<span class="sourceLineNo">3375</span><a name="line.3375"></a>
+<span class="sourceLineNo">3376</span>    // But due to next's limit set to 3, we should get this:<a name="line.3376"></a>
+<span class="sourceLineNo">3377</span>    // r0: first:a, first:b, second:a<a name="line.3377"></a>
+<span class="sourceLineNo">3378</span>    // r0: second:b<a name="line.3378"></a>
+<span class="sourceLineNo">3379</span>    // r1: first:a, first:b, second:a<a name="line.3379"></a>
+<span class="sourceLineNo">3380</span>    // r1: second:b<a name="line.3380"></a>
+<span class="sourceLineNo">3381</span>    // r2: first:a, first:b, second:a<a name="line.3381"></a>
+<span class="sourceLineNo">3382</span>    // r2: second:b<a name="line.3382"></a>
+<span class="sourceLineNo">3383</span>    // r3: first:a, first:b, second:a<a name="line.3383"></a>
+<span class="sourceLineNo">3384</span>    // r3: second:b<a name="line.3384"></a>
+<span class="sourceLineNo">3385</span>    // r4: first:a, first:b, second:a<a name="line.3385"></a>
+<span class="sourceLineNo">3386</span>    // r4: second:b<a name="line.3386"></a>
+<span class="sourceLineNo">3387</span>    // r5: first:a<a name="line.3387"></a>
+<span class="sourceLineNo">3388</span>    // r6: first:a<a name="line.3388"></a>
+<span class="sourceLineNo">3389</span>    // r7: first:a<a name="line.3389"></a>
+<span class="sourceLineNo">3390</span>    // r8: first:a<a name="line.3390"></a>
+<span class="sourceLineNo">3391</span>    // r9: first:a<a name="line.3391"></a>
+<span class="sourceLineNo">3392</span><a name="line.3392"></a>
+<span class="sourceLineNo">3393</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.3393"></a>
+<span class="sourceLineNo">3394</span>    int index = 0;<a name="line.3394"></a>
+<span class="sourceLineNo">3395</span>    ScannerContext scannerContext = ScannerContext.newBuilder().setBatchLimit(3).build();<a name="line.3395"></a>
+<span class="sourceLineNo">3396</span>    while (true) {<a name="line.3396"></a>
+<span class="sourceLineNo">3397</span>      boolean more = s.next(results, scannerContext);<a name="line.3397"></a>
+<span class="sourceLineNo">3398</span>      if ((index &gt;&gt; 1) &lt; 5) {<a name="line.3398"></a>
+<span class="sourceLineNo">3399</span>        if (index % 2 == 0) {<a name="line.3399"></a>
+<span class="sourceLineNo">3400</span>          assertEquals(3, results.size());<a name="line.3400"></a>
+<span class="sourceLineNo">3401</span>        } else {<a name="line.3401"></a>
+<span class="sourceLineNo">3402</span>          assertEquals(1, results.size());<a name="line.3402"></a>
+<span class="sourceLineNo">3403</span>        }<a name="line.3403"></a>
+<span class="sourceLineNo">3404</span>      } else {<a name="line.3404"></a>
+<span class="sourceLineNo">3405</span>        assertEquals(1, results.size());<a name="line.3405"></a>
+<span class="sourceLineNo">3406</span>      }<a name="line.3406"></a>
+<span class="sourceLineNo">3407</span>      results.clear();<a name="line.3407"></a>
+<span class="sourceLineNo">3408</span>      index++;<a name="line.3408"></a>
+<span class="sourceLineNo">3409</span>      if (!more) {<a name="line.3409"></a>
+<span class="sourceLineNo">3410</span>        break;<a name="line.3410"></a>
+<span class="sourceLineNo">3411</span>      }<a name="line.3411"></a>
+<span class="sourceLineNo">3412</span>    }<a name="line.3412"></a>
+<span class="sourceLineNo">3413</span>  }<a name="line.3413"></a>
+<span class="sourceLineNo">3414</span><a name="line.3414"></a>
+<span class="sourceLineNo">3415</span>  /**<a name="line.3415"></a>
+<span class="sourceLineNo">3416</span>   * Write an HFile block full with Cells whose qualifier that are identical between<a name="line.3416"></a>
+<span class="sourceLineNo">3417</span>   * 0 and Short.MAX_VALUE. See HBASE-13329.<a name="line.3417"></a>
+<span class="sourceLineNo">3418</span>   * @throws Exception<a name="line.3418"></a>
+<span class="sourceLineNo">3419</span>   */<a name="line.3419"></a>
+<span class="sourceLineNo">3420</span>  @Test<a name="line.3420"></a>
+<span class="sourceLineNo">3421</span>  public void testLongQualifier() throws Exception {<a name="line.3421"></a>
+<span class="sourceLineNo">3422</span>    byte[] family = Bytes.toBytes("family");<a name="line.3422"></a>
+<span class="sourceLineNo">3423</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.3423"></a>
+<span class="sourceLineNo">3424</span>    byte[] q = new byte[Short.MAX_VALUE+2];<a name="line.3424"></a>
+<span class="sourceLineNo">3425</span>    Arrays.fill(q, 0, q.length-1, (byte)42);<a name="line.3425"></a>
+<span class="sourceLineNo">3426</span>    for (byte i=0; i&lt;10; i++) {<a name="line.3426"></a>
+<span class="sourceLineNo">3427</span>      Put p = new Put(Bytes.toBytes("row"));<a name="line.3427"></a>
+<span class="sourceLineNo">3428</span>      // qualifiers that differ past Short.MAX_VALUE<a name="line.3428"></a>
+<span class="sourceLineNo">3429</span>      q[q.length-1]=i;<a name="line.3429"></a>
+<span class="sourceLineNo">3430</span>      p.addColumn(family, q, q);<a name="line.3430"></a>
+<span class="sourceLineNo">3431</span>      region.put(p);<a name="line.3431"></a>
+<span class="sourceLineNo">3432</span>    }<a name="line.3432"></a>
+<span class="sourceLineNo">3433</span>    region.flush(false);<a name="line.3433"></a>
+<span class="sourceLineNo">3434</span>  }<a name="line.3434"></a>
+<span class="sourceLineNo">3435</span><a name="line.3435"></a>
+<span class="sourceLineNo">3436</span>  /**<a name="line.3436"></a>
+<span class="sourceLineNo">3437</span>   * Flushes the cache in a thread while scanning. The tests verify that the<a name="line.3437"></a>
+<span class="sourceLineNo">3438</span>   * scan is coherent - e.g. the returned results are always of the same or<a name="line.3438"></a>
+<span class="sourceLineNo">3439</span>   * later update as the previous results.<a name="line.3439"></a>
+<span class="sourceLineNo">3440</span>   *<a name="line.3440"></a>
+<span class="sourceLineNo">3441</span>   * @throws IOException<a name="line.3441"></a>
+<span class="sourceLineNo">3442</span>   *           scan / compact<a name="line.3442"></a>
+<span class="sourceLineNo">3443</span>   * @throws InterruptedException<a name="line.3443"></a>
+<span class="sourceLineNo">3444</span>   *           thread join<a name="line.3444"></a>
+<span class="sourceLineNo">3445</span>   */<a name="line.3445"></a>
+<span class="sourceLineNo">3446</span>  @Test<a name="line.3446"></a>
+<span class="sourceLineNo">3447</span>  public void testFlushCacheWhileScanning() throws IOException, InterruptedException {<a name="line.3447"></a>
+<span class="sourceLineNo">3448</span>    byte[] family = Bytes.toBytes("family");<a name="line.3448"></a>
+<span class="sourceLineNo">3449</span>    int numRows = 1000;<a name="line.3449"></a>
+<span class="sourceLineNo">3450</span>    int flushAndScanInterval = 10;<a name="line.3450"></a>
+<span class="sourceLineNo">3451</span>    int compactInterval = 10 * flushAndScanInterval;<a name="line.3451"></a>
 <span class="sourceLineNo">3452</span><a name="line.3452"></a>
-<span class="sourceLineNo">3453</span>      int expectedCount = 0;<a name="line.3453"></a>
-<span class="sourceLineNo">3454</span>      List&lt;Cell&gt; res = new ArrayList&lt;&gt;();<a name="line.3454"></a>
-<span class="sourceLineNo">3455</span><a name="line.3455"></a>
-<span class="sourceLineNo">3456</span>      boolean toggle = true;<a name="line.3456"></a>
-<span class="sourceLineNo">3457</span>      for (long i = 0; i &lt; numRows; i++) {<a name="line.3457"></a>
-<span class="sourceLineNo">3458</span>        Put put = new Put(Bytes.toBytes(i));<a name="line.3458"></a>
-<span class="sourceLineNo">3459</span>        put.setDurability(Durability.SKIP_WAL);<a name="line.3459"></a>
-<span class="sourceLineNo">3460</span>        put.addColumn(family, qual1, Bytes.toBytes(i % 10));<a name="line.3460"></a>
-<span class="sourceLineNo">3461</span>        region.put(put);<a name="line.3461"></a>
+<span class="sourceLineNo">3453</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.3453"></a>
+<span class="sourceLineNo">3454</span>    FlushThread flushThread = new FlushThread();<a name="line.3454"></a>
+<span class="sourceLineNo">3455</span>    try {<a name="line.3455"></a>
+<span class="sourceLineNo">3456</span>      flushThread.start();<a name="line.3456"></a>
+<span class="sourceLineNo">3457</span><a name="line.3457"></a>
+<span class="sourceLineNo">3458</span>      Scan scan = new Scan();<a name="line.3458"></a>
+<span class="sourceLineNo">3459</span>      scan.addFamily(family);<a name="line.3459"></a>
+<span class="sourceLineNo">3460</span>      scan.setFilter(new SingleColumnValueFilter(family, qual1, CompareOperator.EQUAL,<a name="line.3460"></a>
+<span class="sourceLineNo">3461</span>          new BinaryComparator(Bytes.toBytes(5L))));<a name="line.3461"></a>
 <span class="sourceLineNo">3462</span><a name="line.3462"></a>
-<span class="sourceLineNo">3463</span>        if (i != 0 &amp;&amp; i % compactInterval == 0) {<a name="line.3463"></a>
-<span class="sourceLineNo">3464</span>          LOG.debug("iteration = " + i+ " ts="+System.currentTimeMillis());<a name="line.3464"></a>
-<span class="sourceLineNo">3465</span>          region.compact(true);<a name="line.3465"></a>
-<span class="sourceLineNo">3466</span>        }<a name="line.3466"></a>
-<span class="sourceLineNo">3467</span><a name="line.3467"></a>
-<span class="sourceLineNo">3468</span>        if (i % 10 == 5L) {<a name="line.3468"></a>
-<span class="sourceLineNo">3469</span>          expectedCount++;<a name="line.3469"></a>
-<span class="sourceLineNo">3470</span>        }<a name="line.3470"></a>
-<span class="sourceLineNo">3471</span><a name="line.3471"></a>
-<span class="sourceLineNo">3472</span>        if (i != 0 &amp;&amp; i % flushAndScanInterval == 0) {<a name="line.3472"></a>
-<span class="sourceLineNo">3473</span>          res.clear();<a name="line.3473"></a>
-<span class="sourceLineNo">3474</span>          InternalScanner scanner = region.getScanner(scan);<a name="line.3474"></a>
-<span class="sourceLineNo">3475</span>          if (toggle) {<a name="line.3475"></a>
-<span class="sourceLineNo">3476</span>            flushThread.flush();<a name="line.3476"></a>
-<span class="sourceLineNo">3477</span>          }<a name="line.3477"></a>
-<span class="sourceLineNo">3478</span>          while (scanner.next(res))<a name="line.3478"></a>
-<span class="sourceLineNo">3479</span>            ;<a name="line.3479"></a>
-<span class="sourceLineNo">3480</span>          if (!toggle) {<a name="line.3480"></a>
-<span class="sourceLineNo">3481</span>            flushThread.flush();<a name="line.3481"></a>
-<span class="sourceLineNo">3482</span>          }<a name="line.3482"></a>
-<span class="sourceLineNo">3483</span>          assertEquals("toggle="+toggle+"i=" + i + " ts="+System.currentTimeMillis(),<a name="line.3483"></a>
-<span class="sourceLineNo">3484</span>              expectedCount, res.size());<a name="line.3484"></a>
-<span class="sourceLineNo">3485</span>          toggle = !toggle;<a name="line.3485"></a>
-<span class="sourceLineNo">3486</span>        }<a name="line.3486"></a>
-<span class="sourceLineNo">3487</span>      }<a name="line.3487"></a>
-<span class="sourceLineNo">3488</span><a name="line.3488"></a>
-<span class="sourceLineNo">3489</span>    } finally {<a name="line.3489"></a>
-<span class="sourceLineNo">3490</span>      try {<a name="line.3490"></a>
-<span class="sourceLineNo">3491</span>        flushThread.done();<a name="line.3491"></a>
-<span class="sourceLineNo">3492</span>        flushThread.join();<a name="line.3492"></a>
-<span class="sourceLineNo">3493</span>        flushThread.checkNoError();<a name="line.3493"></a>
-<span class="sourceLineNo">3494</span>      } catch (InterruptedException ie) {<a name="line.3494"></a>
-<span class="sourceLineNo">3495</span>        LOG.warn("Caught exception when joining with flushThread", ie);<a name="line.3495"></a>
-<span class="sourceLineNo">3496</span>      }<a name="line.3496"></a>
-<span class="sourceLineNo">3497</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.3497"></a>
-<span class="sourceLineNo">3498</span>      this.region = null;<a name="line.3498"></a>
-<span class="sourceLineNo">3499</span>    }<a name="line.3499"></a>
-<span class="sourceLineNo">3500</span>  }<a name="line.3500"></a>
-<span class="sourceLineNo">3501</span><a name="line.3501"></a>
-<span class="sourceLineNo">3502</span>  protected class FlushThread extends Thread {<a name="line.3502"></a>
-<span class="sourceLineNo">3503</span>    private volatile boolean done;<a name="line.3503"></a>
-<span class="sourceLineNo">3504</span>    private Throwable error = null;<a name="line.3504"></a>
-<span class="sourceLineNo">3505</span><a name="line.3505"></a>
-<span class="sourceLineNo">3506</span>    FlushThread() {<a name="line.3506"></a>
-<span class="sourceLineNo">3507</span>      super("FlushThread");<a name="line.3507"></a>
-<span class="sourceLineNo">3508</span>    }<a name="line.3508"></a>
-<span class="sourceLineNo">3509</span><a name="line.3509"></a>
-<span class="sourceLineNo">3510</span>    public void done() {<a name="line.3510"></a>
-<span class="sourceLineNo">3511</span>      done = true;<a name="line.3511"></a>
-<span class="sourceLineNo">3512</span>      synchronized (this) {<a name="line.3512"></a>
-<span class="sourceLineNo">3513</span>        interrupt();<a name="line.3513"></a>
-<span class="sourceLineNo">3514</span>      }<a name="line.3514"></a>
-<span class="sourceLineNo">3515</span>    }<a name="line.3515"></a>
-<span class="sourceLineNo">3516</span><a name="line.3516"></a>
-<span class="sourceLineNo">3517</span>    public void checkNoError() {<a name="line.3517"></a>
-<span class="sourceLineNo">3518</span>      if (error != null) {<a name="line.3518"></a>
-<span class="sourceLineNo">3519</span>        assertNull(error);<a name="line.3519"></a>
-<span class="sourceLineNo">3520</span>      }<a name="line.3520"></a>
-<span class="sourceLineNo">3521</span>    }<a name="line.3521"></a>
-<span class="sourceLineNo">3522</span><a name="line.3522"></a>
-<span class="sourceLineNo">3523</span>    @Override<a name="line.3523"></a>
-<span class="sourceLineNo">3524</span>    public void run() {<a name="line.3524"></a>
-<span class="sourceLineNo">3525</span>      done = false;<a name="line.3525"></a>
-<span class="sourceLineNo">3526</span>      while (!done) {<a name="line.3526"></a>
-<span class="sourceLineNo">3527</span>        synchronized (this) {<a name="line.3527"></a>
-<span class="sourceLineNo">3528</span>          try {<a name="line.3528"></a>
-<span class="sourceLineNo">3529</span>            wait();<a name="line.3529"></a>
-<span class="sourceLineNo">3530</span>          } catch (InterruptedException ignored) {<a name="line.3530"></a>
-<span class="sourceLineNo">3531</span>            if (done) {<a name="line.3531"></a>
-<span class="sourceLineNo">3532</span>              break;<a name="line.3532"></a>
-<span class="sourceLineNo">3533</span>            }<a name="line.3533"></a>
-<span class="sourceLineNo">3534</span>          }<a name="line.3534"></a>
-<span class="sourceLineNo">3535</span>        }<a name="line.3535"></a>
-<span class="sourceLineNo">3536</span>        try {<a name="line.3536"></a>
-<span class="sourceLineNo">3537</span>          region.flush(true);<a name="line.3537"></a>
-<span class="sourceLineNo">3538</span>        } catch (IOException e) {<a name="line.3538"></a>
-<span class="sourceLineNo">3539</span>          if (!done) {<a name="line.3539"></a>
-<span class="sourceLineNo">3540</span>            LOG.error("Error while flushing cache", e);<a name="line.3540"></a>
-<span class="sourceLineNo">3541</span>            error = e;<a name="line.3541"></a>
-<span class="sourceLineNo">3542</span>          }<a name="line.3542"></a>
-<span class="sourceLineNo">3543</span>          break;<a name="line.3543"></a>
-<span class="sourceLineNo">3544</span>        } catch (Throwable t) {<a name="line.3544"></a>
-<span class="sourceLineNo">3545</span>          LOG.error("Uncaught exception", t);<a name="line.3545"></a>
-<span class="sourceLineNo">3546</span>          throw t;<a name="line.3546"></a>
-<span class="sourceLineNo">3547</span>        }<a name="line.3547"></a>
-<span class="sourceLineNo">3548</span>      }<a name="line.3548"></a>
-<span class="sourceLineNo">3549</span>    }<a name="line.3549"></a>
-<span class="sourceLineNo">3550</span><a name="line.3550"></a>
-<span class="sourceLineNo">3551</span>    public void flush() {<a name="line.3551"></a>
-<span class="sourceLineNo">3552</span>      synchronized (this) {<a name="line.3552"></a>
-<span class="sourceLineNo">3553</span>        notify();<a name="line.3553"></a>
-<span class="sourceLineNo">3554</span>      }<a name="line.3554"></a>
-<span class="sourceLineNo">3555</span>    }<a name="line.3555"></a>
-<span class="sourceLineNo">3556</span>  }<a name="line.3556"></a>
-<span class="sourceLineNo">3557</span><a name="line.3557"></a>
-<span class="sourceLineNo">3558</span>  /**<a name="line.3558"></a>
-<span class="sourceLineNo">3559</span>   * Writes very wide records and scans for the latest every time.. Flushes and<a name="line.3559"></a>
-<span class="sourceLineNo">3560</span>   * compacts the region every now and then to keep things realistic.<a name="line.3560"></a>
-<span class="sourceLineNo">3561</span>   *<a name="line.3561"></a>
-<span class="sourceLineNo">3562</span>   * @throws IOException<a name="line.3562"></a>
-<span class="sourceLineNo">3563</span>   *           by flush / scan / compaction<a name="line.3563"></a>
-<span class="sourceLineNo">3564</span>   * @throws InterruptedException<a name="line.3564"></a>
-<span class="sourceLineNo">3565</span>   *           when joining threads<a name="line.3565"></a>
-<span class="sourceLineNo">3566</span>   */<a name="line.3566"></a>
-<span class="sourceLineNo">3567</span>  @Test<a name="line.3567"></a>
-<span class="sourceLineNo">3568</span>  public void testWritesWhileScanning() throws IOException, InterruptedException {<a name="line.3568"></a>
-<span class="sourceLineNo">3569</span>    int testCount = 100;<a name="line.3569"></a>
-<span class="sourceLineNo">3570</span>    int numRows = 1;<a name="line.3570"></a>
-<span class="sourceLineNo">3571</span>    int numFamilies = 10;<a name="line.3571"></a>
-<span class="sourceLineNo">3572</span>    int numQualifiers = 100;<a name="line.3572"></a>
-<span class="sourceLineNo">3573</span>    int flushInterval = 7;<a name="line.3573"></a>
-<span class="sourceLineNo">3574</span>    int compactInterval = 5 * flushInterval;<a name="line.3574"></a>
-<span class="sourceLineNo">3575</span>    byte[][] families = new byte[numFamilies][];<a name="line.3575"></a>
-<span class="sourceLineNo">3576</span>    for (int i = 0; i &lt; numFamilies; i++) {<a name="line.3576"></a>
-<span class="sourceLineNo">3577</span>      families[i] = Bytes.toBytes("family" + i);<a name="line.3577"></a>
-<span class="sourceLineNo">3578</span>    }<a name="line.3578"></a>
-<span class="sourceLineNo">3579</span>    byte[][] qualifiers = new byte[numQualifiers][];<a name="line.3579"></a>
-<span class="sourceLineNo">3580</span>    for (int i = 0; i &lt; numQualifiers; i++) {<a name="line.3580"></a>
-<span class="sourceLineNo">3581</span>      qualifiers[i] = Bytes.toBytes("qual" + i);<a name="line.3581"></a>
-<span class="sourceLineNo">3582</span>    }<a name="line.3582"></a>
-<span class="sourceLineNo">3583</span><a name="line.3583"></a>
-<span class="sourceLineNo">3584</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.3584"></a>
-<span class="sourceLineNo">3585</span>    FlushThread flushThread = new FlushThread();<a name="line.3585"></a>
-<span class="sourceLineNo">3586</span>    PutThread putThread = new PutThread(numRows, families, qualifiers);<a name="line.3586"></a>
-<span class="sourceLineNo">3587</span>    try {<a name="line.3587"></a>
-<span class="sourceLineNo">3588</span>      putThread.start();<a name="line.3588"></a>
-<span class="sourceLineNo">3589</span>      putThread.waitForFirstPut();<a name="line.3589"></a>
-<span class="sourceLineNo">3590</span><a name="line.3590"></a>
-<span class="sourceLineNo">3591</span>      flushThread.start();<a name="line.3591"></a>
-<span class="sourceLineNo">3592</span><a name="line.3592"></a>
-<span class="sourceLineNo">3593</span>      Scan scan = new Scan(Bytes.toBytes("row0"), Bytes.toBytes("row1"));<a name="line.3593"></a>
-<span class="sourceLineNo">3594</span><a name="line.3594"></a>
-<span class="sourceLineNo">3595</span>      int expectedCount = numFamilies * numQualifiers;<a name="line.3595"></a>
-<span class="sourceLineNo">3596</span>      List&lt;Cell&gt; res = new ArrayList&lt;&gt;();<a name="line.3596"></a>
-<span class="sourceLineNo">3597</span><a name="line.3597"></a>
-<span class="sourceLineNo">3598</span>      long prevTimestamp = 0L;<a name="line.3598"></a>
-<span class="sourceLineNo">3599</span>      for (int i = 0; i &lt; testCount; i++) {<a name="line.3599"></a>
+<span class="sourceLineNo">3463</span>      int expectedCount = 0;<a name="line.3463"></a>
+<span class="sourceLineNo">3464</span>      List&lt;Cell&gt; res = new ArrayList&lt;&gt;();<a name="line.3464"></a>
+<span class="sourceLineNo">3465</span><a name="line.3465"></a>
+<span class="sourceLineNo">3466</span>      boolean toggle = true;<a name="line.3466"></a>
+<span class="sourceLineNo">3467</span>      for (long i = 0; i &lt; numRows; i++) {<a name="line.3467"></a>
+<span class="sourceLineNo">3468</span>        Put put = new Put(Bytes.toBytes(i));<a name="line.3468"></a>
+<span class="sourceLineNo">3469</span>        put.setDurability(Durability.SKIP_WAL);<a name="line.3469"></a>
+<span class="sourceLineNo">3470</span>        put.addColumn(family, qual1, Bytes.toBytes(i % 10));<a name="line.3470"></a>
+<span class="sourceLineNo">3471</span>        region.put(put);<a name="line.3471"></a>
+<span class="sourceLineNo">3472</span><a name="line.3472"></a>
+<span class="sourceLineNo">3473</span>        if (i != 0 &amp;&amp; i % compactInterval == 0) {<a name="line.3473"></a>
+<span class="sourceLineNo">3474</span>          LOG.debug("iteration = " + i+ " ts="+System.currentTimeMillis());<a name="line.3474"></a>
+<span class="sourceLineNo">3475</span>          region.compact(true);<a name="line.3475"></a>
+<span class="sourceLineNo">3476</span>        }<a name="line.3476"></a>
+<span class="sourceLineNo">3477</span><a name="line.3477"></a>
+<span class="sourceLineNo">3478</span>        if (i % 10 == 5L) {<a name="line.3478"></a>
+<span class="sourceLineNo">3479</span>          expectedCount++;<a name="line.3479"></a>
+<span class="sourceLineNo">3480</span>        }<a name="line.3480"></a>
+<span class="sourceLineNo">3481</span><a name="line.3481"></a>
+<span class="sourceLineNo">3482</span>        if (i != 0 &amp;&amp; i % flushAndScanInterval == 0) {<a name="line.3482"></a>
+<span class="sourceLineNo">3483</span>          res.clear();<a name="line.3483"></a>
+<span class="sourceLineNo">3484</span>          InternalScanner scanner = region.getScanner(scan);<a name="line.3484"></a>
+<span class="sourceLineNo">3485</span>          if (toggle) {<a name="line.3485"></a>
+<span class="sourceLineNo">3486</span>            flushThread.flush();<a name="line.3486"></a>
+<span class="sourceLineNo">3487</span>          }<a name="line.3487"></a>
+<span class="sourceLineNo">3488</span>          while (scanner.next(res))<a name="line.3488"></a>
+<span class="sourceLineNo">3489</span>            ;<a name="line.3489"></a>
+<span class="sourceLineNo">3490</span>          if (!toggle) {<a name="line.3490"></a>
+<span class="sourceLineNo">3491</span>            flushThread.flush();<a name="line.3491"></a>
+<span class="sourceLineNo">3492</span>          }<a name="line.3492"></a>
+<span class="sourceLineNo">3493</span>          assertEquals("toggle="+toggle+"i=" + i + " ts="+System.currentTimeMillis(),<a name="line.3493"></a>
+<span class="sourceLineNo">3494</span>              expectedCount, res.size());<a name="line.3494"></a>
+<span class="sourceLineNo">3495</span>          toggle = !toggle;<a name="line.3495"></a>
+<span class="sourceLineNo">3496</span>        }<a name="line.3496"></a>
+<span class="sourceLineNo">3497</span>      }<a name="line.3497"></a>
+<span class="sourceLineNo">3498</span><a name="line.3498"></a>
+<span class="sourceLineNo">3499</span>    } finally {<a name="line.3499"></a>
+<span class="sourceLineNo">3500</span>      try {<a name="line.3500"></a>
+<span class="sourceLineNo">3501</span>        flushThread.done();<a name="line.3501"></a>
+<span class="sourceLineNo">3502</span>        flushThread.join();<a name="line.3502"></a>
+<span class="sourceLineNo">3503</span>        flushThread.checkNoError();<a name="line.3503"></a>
+<span class="sourceLineNo">3504</span>      } catch (InterruptedException ie) {<a name="line.3504"></a>
+<span class="sourceLineNo">3505</span>        LOG.warn("Caught exception when joining with flushThread", ie);<a name="line.3505"></a>
+<span class="sourceLineNo">3506</span>      }<a name="line.3506"></a>
+<span class="sourceLineNo">3507</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.3507"></a>
+<span class="sourceLineNo">3508</span>      this.region = null;<a name="line.3508"></a>
+<span class="sourceLineNo">3509</span>    }<a name="line.3509"></a>
+<span class="sourceLineNo">3510</span>  }<a name="line.3510"></a>
+<span class="sourceLineNo">3511</span><a name="line.3511"></a>
+<span class="sourceLineNo">3512</span>  protected class FlushThread extends Thread {<a name="line.3512"></a>
+<span class="sourceLineNo">3513</span>    private volatile boolean done;<a name="line.3513"></a>
+<span class="sourceLineNo">3514</span>    private Throwable error = null;<a name="line.3514"></a>
+<span class="sourceLineNo">3515</span><a name="line.3515"></a>
+<span class="sourceLineNo">3516</span>    FlushThread() {<a name="line.3516"></a>
+<span class="sourceLineNo">3517</span>      super("FlushThread");<a name="line.3517"></a>
+<span class="sourceLineNo">3518</span>    }<a name="line.3518"></a>
+<span class="sourceLineNo">3519</span><a name="line.3519"></a>
+<span class="sourceLineNo">3520</span>    public void done() {<a name="line.3520"></a>
+<span class="sourceLineNo">3521</span>      done = true;<a name="line.3521"></a>
+<span class="sourceLineNo">3522</span>      synchronized (this) {<a name="line.3522"></a>
+<span class="sourceLineNo">3523</span>        interrupt();<a name="line.3523"></a>
+<span class="sourceLineNo">3524</span>      }<a name="line.3524"></a>
+<span class="sourceLineNo">3525</span>    }<a name="line.3525"></a>
+<span class="sourceLineNo">3526</span><a name="line.3526"></a>
+<span class="sourceLineNo">3527</span>    public void checkNoError() {<a name="line.3527"></a>
+<span class="sourceLineNo">3528</span>      if (error != null) {<a name="line.3528"></a>
+<span class="sourceLineNo">3529</span>        assertNull(error);<a name="line.3529"></a>
+<span class="sourceLineNo">3530</span>      }<a name="line.3530"></a>
+<span class="sourceLineNo">3531</span>    }<a name="line.3531"></a>
+<span class="sourceLineNo">3532</span><a name="line.3532"></a>
+<span class="sourceLineNo">3533</span>    @Override<a name="line.3533"></a>
+<span class="sourceLineNo">3534</span>    public void run() {<a name="line.3534"></a>
+<span class="sourceLineNo">3535</span>      done = false;<a name="line.3535"></a>
+<span class="sourceLineNo">3536</span>      while (!done) {<a name="line.3536"></a>
+<span class="sourceLineNo">3537</span>        synchronized (this) {<a name="line.3537"></a>
+<span class="sourceLineNo">3538</span>          try {<a name="line.3538"></a>
+<span class="sourceLineNo">3539</span>            wait();<a name="line.3539"></a>
+<span class="sourceLineNo">3540</span>          } catch (InterruptedException ignored) {<a name="line.3540"></a>
+<span class="sourceLineNo">3541</span>            if (done) {<a name="line.3541"></a>
+<span class="sourceLineNo">3542</span>              break;<a name="line.3542"></a>
+<span class="sourceLineNo">3543</span>            }<a name="line.3543"></a>
+<span class="sourceLineNo">3544</span>          }<a name="line.3544"></a>
+<span class="sourceLineNo">3545</span>        }<a name="line.3545"></a>
+<span class="sourceLineNo">3546</span>        try {<a name="line.3546"></a>
+<span class="sourceLineNo">3547</span>          region.flush(true);<a name="line.3547"></a>
+<span class="sourceLineNo">3548</span>        } catch (IOException e) {<a name="line.3548"></a>
+<span class="sourceLineNo">3549</span>          if (!done) {<a name="line.3549"></a>
+<span class="sourceLineNo">3550</span>            LOG.error("Error while flushing cache", e);<a name="line.3550"></a>
+<span class="sourceLineNo">3551</span>            error = e;<a name="line.3551"></a>
+<span class="sourceLineNo">3552</span>          }<a name="line.3552"></a>
+<span class="sourceLineNo">3553</span>          break;<a name="line.3553"></a>
+<span class="sourceLineNo">3554</span>        } catch (Throwable t) {<a name="line.3554"></a>
+<span class="sourceLineNo">3555</span>          LOG.error("Uncaught exception", t);<a name="line.3555"></a>
+<span class="sourceLineNo">3556</span>          throw t;<a name="line.3556"></a>
+<span class="sourceLineNo">3557</span>        }<a name="line.3557"></a>
+<span class="sourceLineNo">3558</span>      }<a name="line.3558"></a>
+<span class="sourceLineNo">3559</span>    }<a name="line.3559"></a>
+<span class="sourceLineNo">3560</span><a name="line.3560"></a>
+<span class="sourceLineNo">3561</span>    public void flush() {<a name="line.3561"></a>
+<span class="sourceLineNo">3562</span>      synchronized (this) {<a name="line.3562"></a>
+<span class="sourceLineNo">3563</span>        notify();<a name="line.3563"></a>
+<span class="sourceLineNo">3564</span>      }<a name="line.3564"></a>
+<span class="sourceLineNo">3565</span>    }<a name="line.3565"></a>
+<span class="sourceLineNo">3566</span>  }<a name="line.3566"></a>
+<span class="sourceLineNo">3567</span><a name="line.3567"></a>
+<span class="sourceLineNo">3568</span>  /**<a name="line.3568"></a>
+<span class="sourceLineNo">3569</span>   * Writes very wide records and scans for the latest every time.. Flushes and<a name="line.3569"></a>
+<span class="sourceLineNo">3570</span>   * compacts the region every now and then to keep things realistic.<a name="line.3570"></a>
+<span class="sourceLineNo">3571</span>   *<a name="line.3571"></a>
+<span class="sourceLineNo">3572</span>   * @throws IOException<a name="line.3572"></a>
+<span class="sourceLineNo">3573</span>   *           by flush / scan / compaction<a name="line.3573"></a>
+<span class="sourceLineNo">3574</span>   * @throws InterruptedException<a name="line.3574"></a>
+<span class="sourceLineNo">3575</span>   *           when joining threads<a name="line.3575"></a>
+<span class="sourceLineNo">3576</span>   */<a name="line.3576"></a>
+<span class="sourceLineNo">3577</span>  @Test<a name="line.3577"></a>
+<span class="sourceLineNo">3578</span>  public void testWritesWhileScanning() throws IOException, InterruptedException {<a name="line.3578"></a>
+<span class="sourceLineNo">3579</span>    int testCount = 100;<a name="line.3579"></a>
+<span class="sourceLineNo">3580</span>    int numRows = 1;<a name="line.3580"></a>
+<span class="sourceLineNo">3581</span>    int numFamilies = 10;<a name="line.3581"></a>
+<span class="sourceLineNo">3582</span>    int numQualifiers = 100;<a name="line.3582"></a>
+<span class="sourceLineNo">3583</span>    int flushInterval = 7;<a name="line.3583"></a>
+<span class="sourceLineNo">3584</span>    int compactInterval = 5 * flushInterval;<a name="line.3584"></a>
+<span class="sourceLineNo">3585</span>    byte[][] families = new byte[numFamilies][];<a name="line.3585"></a>
+<span class="sourceLineNo">3586</span>    for (int i = 0; i &lt; numFamilies; i++) {<a name="line.3586"></a>
+<span class="sourceLineNo">3587</span>      families[i] = Bytes.toBytes("family" + i);<a name="line.3587"></a>
+<span class="sourceLineNo">3588</span>    }<a name="line.3588"></a>
+<span class="sourceLineNo">3589</span>    byte[][] qualifiers = new byte[numQualifiers][];<a name="line.3589"></a>
+<span class="sourceLineNo">3590</span>    for (int i = 0; i &lt; numQualifiers; i++) {<a name="line.3590"></a>
+<span class="sourceLineNo">3591</span>      qualifiers[i] = Bytes.toBytes("qual" + i);<a name="line.3591"></a>
+<span class="sourceLineNo">3592</span>    }<a name="line.3592"></a>
+<span class="sourceLineNo">3593</span><a name="line.3593"></a>
+<span class="sourceLineNo">3594</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.3594"></a>
+<span class="sourceLineNo">3595</span>    FlushThread flushThread = new FlushThread();<a name="line.3595"></a>
+<span class="sourceLineNo">3596</span>    PutThread putThread = new PutThread(numRows, families, qualifiers);<a name="line.3596"></a>
+<span class="sourceLineNo">3597</span>    try {<a name="line.3597"></a>
+<span class="sourceLineNo">3598</span>      putThread.start();<a name="line.3598"></a>
+<span class="sourceLineNo">3599</span>      putThread.waitForFirstPut();<a name="line.3599"></a>
 <span class="sourceLineNo">3600</span><a name="line.3600"></a>
-<span class="sourceLineNo">3601</span>        if (i != 0 &amp;&amp; i % compactInterval == 0) {<a name="line.3601"></a>
-<span class="sourceLineNo">3602</span>          region.compact(true);<a name="line.3602"></a>
-<span class="sourceLineNo">3603</span>          for (HStore store : region.getStores()) {<a name="line.3603"></a>
-<span class="sourceLineNo">3604</span>            store.closeAndArchiveCompactedFiles();<a name="line.3604"></a>
-<span class="sourceLineNo">3605</span>          }<a name="line.3605"></a>
-<span class="sourceLineNo">3606</span>        }<a name="line.3606"></a>
+<span class="sourceLineNo">3601</span>      flushThread.start();<a name="line.3601"></a>
+<span class="sourceLineNo">3602</span><a name="line.3602"></a>
+<span class="sourceLineNo">3603</span>      Scan scan = new Scan(Bytes.toBytes("row0"), Bytes.toBytes("row1"));<a name="line.3603"></a>
+<span class="sourceLineNo">3604</span><a name="line.3604"></a>
+<span class="sourceLineNo">3605</span>      int expectedCount = numFamilies * numQualifiers;<a name="line.3605"></a>
+<span class="sourceLineNo">3606</span>      List&lt;Cell&gt; res = new ArrayList&lt;&gt;();<a name="line.3606"></a>
 <span class="sourceLineNo">3607</span><a name="line.3607"></a>
-<span class="sourceLineNo">3608</span>        if (i != 0 &amp;&amp; i % flushInterval == 0) {<a name="line.3608"></a>
-<span class="sourceLineNo">3609</span>          flushThread.flush();<a name="line.3609"></a>
-<span class="sourceLineNo">3610</span>        }<a name="line.3610"></a>
-<span class="sourceLineNo">3611</span><a name="line.3611"></a>
-<span class="sourceLineNo">3612</span>        boolean previousEmpty = res.isEmpty();<a name="line.3612"></a>
-<span class="sourceLineNo">3613</span>        res.clear();<a name="line.3613"></a>
-<span class="sourceLineNo">3614</span>        try (InternalScanner scanner = region.getScanner(scan)) {<a name="line.3614"></a>
-<span class="sourceLineNo">3615</span>          boolean moreRows;<a name="line.3615"></a>
-<span class="sourceLineNo">3616</span>          do {<a name="line.3616"></a>
-<span class="sourceLineNo">3617</span>            moreRows = scanner.next(res);<a name="line.3617"></a>
-<span class="sourceLineNo">3618</span>          } while (moreRows);<a name="line.3618"></a>
-<span class="sourceLineNo">3619</span>        }<a name="line.3619"></a>
-<span class="sourceLineNo">3620</span>        if (!res.isEmpty() || !previousEmpty || i &gt; compactInterval) {<a name="line.3620"></a>
-<span class="sourceLineNo">3621</span>          assertEquals("i=" + i, expectedCount, res.size());<a name="line.3621"></a>
-<span class="sourceLineNo">3622</span>          long timestamp = res.get(0).getTimestamp();<a name="line.3622"></a>
-<span class="sourceLineNo">3623</span>          assertTrue("Timestamps were broke: " + timestamp + " prev: " + prevTimestamp,<a name="line.3623"></a>
-<span class="sourceLineNo">3624</span>              timestamp &gt;= prevTimestamp);<a name="line.3624"></a>
-<span class="sourceLineNo">3625</span>          prevTimestamp = timestamp;<a name="line.3625"></a>
-<span class="sourceLineNo">3626</span>        }<a name="line.3626"></a>
-<span class="sourceLineNo">3627</span>      }<a name="line.3627"></a>
-<span class="sourceLineNo">3628</span><a name="line.3628"></a>
-<span class="sourceLineNo">3629</span>      putThread.done();<a name="line.3629"></a>
-<span class="sourceLineNo">3630</span><a name="line.3630"></a>
-<span class="sourceLineNo">3631</span>      region.flush(true);<a name="line.3631"></a>
-<span class="sourceLineNo">3632</span><a name="line.3632"></a>
-<span class="sourceLineNo">3633</span>    } finally {<a name="line.3633"></a>
-<span class="sourceLineNo">3634</span>      try {<a name="line.3634"></a>
-<span class="sourceLineNo">3635</span>        flushThread.done();<a name="line.3635"></a>
-<span class="sourceLineNo">3636</span>        flushThread.join();<a name="line.3636"></a>
-<span class="sourceLineNo">3637</span>        flushThread.checkNoError();<a name="line.3637"></a>
+<span class="sourceLineNo">3608</span>      long prevTimestamp = 0L;<a name="line.3608"></a>
+<span class="sourceLineNo">3609</span>      for (int i = 0; i &lt; testCount; i++) {<a name="line.3609"></a>
+<span class="sourceLineNo">3610</span><a name="line.3610"></a>
+<span class="sourceLineNo">3611</span>        if (i != 0 &amp;&amp; i % compactInterval == 0) {<a name="line.3611"></a>
+<span class="sourceLineNo">3612</span>          region.compact(true);<a name="line.3612"></a>
+<span class="sourceLineNo">3613</span>          for (HStore store : region.getStores()) {<a name="line.3613"></a>
+<span class="sourceLineNo">3614</span>            store.closeAndArchiveCompactedFiles();<a name="line.3614"></a>
+<span class="sourceLineNo">3615</span>          }<a name="line.3615"></a>
+<span class="sourceLineNo">3616</span>        }<a name="line.3616"></a>
+<span class="sourceLineNo">3617</span><a name="line.3617"></a>
+<span class="sourceLineNo">3618</span>        if (i != 0 &amp;&amp; i % flushInterval == 0) {<a name="line.3618"></a>
+<span class="sourceLineNo">3619</span>          flushThread.flush();<a name="line.3619"></a>
+<span class="sourceLineNo">3620</span>        }<a name="line.3620"></a>
+<span class="sourceLineNo">3621</span><a name="line.3621"></a>
+<span class="sourceLineNo">3622</span>        boolean previousEmpty = res.isEmpty();<a name="line.3622"></a>
+<span class="sourceLineNo">3623</span>        res.clear();<a name="line.3623"></a>
+<span class="sourceLineNo">3624</span>        try (InternalScanner scanner = region.getScanner(scan)) {<a name="line.3624"></a>
+<span class="sourceLineNo">3625</span>          boolean moreRows;<a name="line.3625"></a>
+<span class="sourceLineNo">3626</span>          do {<a name="line.3626"></a>
+<span class="sourceLineNo">3627</span>            moreRows = scanner.next(res);<a name="line.3627"></a>
+<span class="sourceLineNo">3628</span>          } while (moreRows);<a name="line.3628"></a>
+<span class="sourceLineNo">3629</span>        }<a name="line.3629"></a>
+<span class="sourceLineNo">3630</span>        if (!res.isEmpty() || !previousEmpty || i &gt; compactInterval) {<a name="line.3630"></a>
+<span class="sourceLineNo">3631</span>          assertEquals("i=" + i, expectedCount, res.size());<a name="line.3631"></a>
+<span class="sourceLineNo">3632</span>          long timestamp = res.get(0).getTimestamp();<a name="line.3632"></a>
+<span class="sourceLineNo">3633</span>          assertTrue("Timestamps were broke: " + timestamp + " prev: " + prevTimestamp,<a name="line.3633"></a>
+<span class="sourceLineNo">3634</span>              timestamp &gt;= prevTimestamp);<a name="line.3634"></a>
+<span class="sourceLineNo">3635</span>          prevTimestamp = timestamp;<a name="line.3635"></a>
+<span class="sourceLineNo">3636</span>        }<a name="line.3636"></a>
+<span class="sourceLineNo">3637</span>      }<a name="line.3637"></a>
 <span class="sourceLineNo">3638</span><a name="line.3638"></a>
-<span class="sourceLineNo">3639</span>        putThread.join();<a name="line.3639"></a>
-<span class="sourceLineNo">3640</span>        putThread.checkNoError();<a name="line.3640"></a>
-<span class="sourceLineNo">3641</span>      } catch (InterruptedException ie) {<a name="line.3641"></a>
-<span class="sourceLineNo">3642</span>        LOG.warn("Caught exception when joining with flushThread", ie);<a name="line.3642"></a>
-<span class="sourceLineNo">3643</span>      }<a name="line.3643"></a>
-<span class="sourceLineNo">3644</span><a name="line.3644"></a>
-<span class="sourceLineNo">3645</span>      try {<a name="line.3645"></a>
-<span class="sourceLineNo">3646</span>          HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.3646"></a>
-<span class="sourceLineNo">3647</span>      } catch (DroppedSnapshotException dse) {<a name="line.3647"></a>
-<span class="sourceLineNo">3648</span>        // We could get this on way out because we interrupt the background flusher and it could<a name="line.3648"></a>
-<span class="sourceLineNo">3649</span>        // fail anywhere causing a DSE over in the background flusher... only it is not properly<a name="line.3649"></a>
-<span class="sourceLineNo">3650</span>        // dealt with so could still be memory hanging out when we get to here -- memory we can't<a name="line.3650"></a>
-<span class="sourceLineNo">3651</span>        // flush because the accounting is 'off' since original DSE.<a name="line.3651"></a>
-<span class="sourceLineNo">3652</span>      }<a name="line.3652"></a>
-<span class="sourceLineNo">3653</span>      this.region = null;<a name="line.3653"></a>
-<span class="sourceLineNo">3654</span>    }<a name="line.3654"></a>
-<span class="sourceLineNo">3655</span>  }<a name="line.3655"></a>
-<span class="sourceLineNo">3656</span><a name="line.3656"></a>
-<span class="sourceLineNo">3657</span>  protected class PutThread extends Thread {<a name="line.3657"></a>
-<span class="sourceLineNo">3658</span>    private volatile boolean done;<a name="line.3658"></a>
-<span class="sourceLineNo">3659</span>    private volatile int numPutsFinished = 0;<a name="line.3659"></a>
-<span class="sourceLineNo">3660</span><a name="line.3660"></a>
-<span class="sourceLineNo">3661</span>    private Throwable error = null;<a name="line.3661"></a>
-<span class="sourceLineNo">3662</span>    private int numRows;<a name="line.3662"></a>
-<span class="sourceLineNo">3663</span>    private byte[][] families;<a name="line.3663"></a>
-<span class="sourceLineNo">3664</span>    private byte[][] qualifiers;<a name="line.3664"></a>
-<span class="sourceLineNo">3665</span><a name="line.3665"></a>
-<span class="sourceLineNo">3666</span>    private PutThread(int numRows, byte[][] families, byte[][] qualifiers) {<a name="line.3666"></a>
-<span class="sourceLineNo">3667</span>      super("PutThread");<a name="line.3667"></a>
-<span class="sourceLineNo">3668</span>      this.numRows = numRows;<a name="line.3668"></a>
-<span class="sourceLineNo">3669</span>      this.families = families;<a name="line.3669"></a>
-<span class="sourceLineNo">3670</span>      this.qualifiers = qualifiers;<a name="line.3670"></a>
-<span class="sourceLineNo">3671</span>    }<a name="line.3671"></a>
-<span class="sourceLineNo">3672</span><a name="line.3672"></a>
-<span class="sourceLineNo">3673</span>    /**<a name="line.3673"></a>
-<span class="sourceLineNo">3674</span>     * Block calling thread until this instance of PutThread has put at least one row.<a name="line.3674"></a>
-<span class="sourceLineNo">3675</span>     */<a name="line.3675"></a>
-<span class="sourceLineNo">3676</span>    public void waitForFirstPut() throws InterruptedException {<a name="line.3676"></a>
-<span class="sourceLineNo">3677</span>      // wait until put thread actually puts some data<a name="line.3677"></a>
-<span class="sourceLineNo">3678</span>      while (isAlive() &amp;&amp; numPutsFinished == 0) {<a name="line.3678"></a>
-<span class="sourceLineNo">3679</span>        checkNoError();<a name="line.3679"></a>
-<span class="sourceLineNo">3680</span>        Thread.sleep(50);<a name="line.3680"></a>
-<span class="sourceLineNo">3681</span>      }<a name="line.3681"></a>
-<span class="sourceLineNo">3682</span>    }<a name="line.3682"></a>
-<span class="sourceLineNo">3683</span><a name="line.3683"></a>
-<span class="sourceLineNo">3684</span>    public void done() {<a name="line.3684"></a>
-<span class="sourceLineNo">3685</span>      done = true;<a name="line.3685"></a>
-<span class="sourceLineNo">3686</span>      synchronized (this) {<a name="line.3686"></a>
-<span class="sourceLineNo">3687</span>        interrupt();<a name="line.3687"></a>
-<span class="sourceLineNo">3688</span>      }<a name="line.3688"></a>
-<span class="sourceLineNo">3689</span>    }<a name="line.3689"></a>
-<span class="sourceLineNo">3690</span><a name="line.3690"></a>
-<span class="sourceLineNo">3691</span>    public void checkNoError() {<a name="line.3691"></a>
-<span class="sourceLineNo">3692</span>      if (error != null) {<a name="line.3692"></a>
-<span class="sourceLineNo">3693</span>        assertNull(error);<a name="line.3693"></a>
-<span class="sourceLineNo">3694</span>      }<a name="line.3694"></a>
-<span class="sourceLineNo">3695</span>    }<a name="line.3695"></a>
-<span class="sourceLineNo">3696</span><a name="line.3696"></a>
-<span class="sourceLineNo">3697</span>    @Override<a name="line.3697"></a>
-<span class="sourceLineNo">3698</span>    public void run() {<a name="line.3698"></a>
-<span class="sourceLineNo">3699</span>      done = false;<a name="line.3699"></a>
-<span class="sourceLineNo">3700</span>      while (!done) {<a name="line.3700"></a>
-<span class="sourceLineNo">3701</span>        try {<a name="line.3701"></a>
-<span class="sourceLineNo">3702</span>          for (int r = 0; r &lt; numRows; r++) {<a name="line.3702"></a>
-<span class="sourceLineNo">3703</span>            byte[] row = Bytes.toBytes("row" + r);<a name="line.3703"></a>
-<span class="sourceLineNo">3704</span>            Put put = new Put(row);<a name="line.3704"></a>
-<span class="sourceLineNo">3705</span>            put.setDurability(Durability.SKIP_WAL);<a name="line.3705"></a>
-<span class="sourceLineNo">3706</span>            byte[] value = Bytes.toBytes(String.valueOf(numPutsFinished));<a name="line.3706"></a>
-<span class="sourceLineNo">3707</span>            for (byte[] family : families) {<a name="line.3707"></a>
-<span class="sourceLineNo">3708</span>              for (byte[] qualifier : qualifiers) {<a name="line.3708"></a>
-<span class="sourceLineNo">3709</span>                put.addColumn(family, qualifier, numPutsFinished, value);<a name="line.3709"></a>
-<span class="sourceLineNo">3710</span>              }<a name="line.3710"></a>
-<span class="sourceLineNo">3711</span>            }<a name="line.3711"></a>
-<span class="sourceLineNo">3712</span>            region.put(put);<a name="line.3712"></a>
-<span class="sourceLineNo">3713</span>            numPutsFinished++;<a name="line.3713"></a>
-<span class="sourceLineNo">3714</span>            if (numPutsFinished &gt; 0 &amp;&amp; numPutsFinished % 47 == 0) {<a name="line.3714"></a>
-<span class="sourceLineNo">3715</span>              LOG.debug("put iteration = {}", numPutsFinished);<a name="line.3715"></a>
-<span class="sourceLineNo">3716</span>              Delete delete = new Delete(row, (long) numPutsFinished - 30);<a name="line.3716"></a>
-<span class="sourceLineNo">3717</span>              region.delete(delete);<a name="line.3717"></a>
-<span class="sourceLineNo">3718</span>            }<a name="line.3718"></a>
-<span class="sourceLineNo">3719</span>            numPutsFinished++;<a name="line.3719"></a>
-<span class="sourceLineNo">3720</span>          }<a name="line.3720"></a>
-<span class="sourceLineNo">3721</span>        } catch (InterruptedIOException e) {<a name="line.3721"></a>
-<span class="sourceLineNo">3722</span>          // This is fine. It means we are done, or didn't get the lock on time<a name="line.3722"></a>
-<span class="sourceLineNo">3723</span>          LOG.info("Interrupted", e);<a name="line.3723"></a>
-<span class="sourceLineNo">3724</span>        } catch (IOException e) {<a name="line.3724"></a>
-<span class="sourceLineNo">3725</span>          LOG.error("Error while putting records", e);<a name="line.3725"></a>
-<span class="sourceLineNo">3726</span>          error = e;<a name="line.3726"></a>
-<span class="sourceLineNo">3727</span>          break;<a name="line.3727"></a>
-<span class="sourceLineNo">3728</span>        }<a name="line.3728"></a>
-<span class="sourceLineNo">3729</span>      }<a name="line.3729"></a>
-<span class="sourceLineNo">3730</span><a name="line.3730"></a>
-<span class="sourceLineNo">3731</span>    }<a name="line.3731"></a>
-<span class="sourceLineNo">3732</span><a name="line.3732"></a>
-<span class="sourceLineNo">3733</span>  }<a name="line.3733"></a>
-<span class="sourceLineNo">3734</span><a name="line.3734"></a>
-<span class="sourceLineNo">3735</span>  /**<a name="line.3735"></a>
-<span class="sourceLineNo">3736</span>   * Writes very wide records and gets the latest row every time.. Flushes and<a name="line.3736"></a>
-<span class="sourceLineNo">3737</span>   * compacts the region aggressivly to catch issues.<a name="line.3737"></a>
-<span class="sourceLineNo">3738</span>   *<a name="line.3738"></a>
-<span class="sourceLineNo">3739</span>   * @throws IOException<a name="line.3739"></a>
-<span class="sourceLineNo">3740</span>   *           by flush / scan / compaction<a name="line.3740"></a>
-<span class="sourceLineNo">3741</span>   * @throws InterruptedException<a name="line.3741"></a>
-<span class="sourceLineNo">3742</span>   *           when joining threads<a name="line.3742"></a>
-<span class="sourceLineNo">3743</span>   */<a name="line.3743"></a>
-<span class="sourceLineNo">3744</span>  @Test<a name="line.3744"></a>
-<span class="sourceLineNo">3745</span>  public void testWritesWhileGetting() throws Exception {<a name="line.3745"></a>
-<span class="sourceLineNo">3746</span>    int testCount = 50;<a name="line.3746"></a>
-<span class="sourceLineNo">3747</span>    int numRows = 1;<a name="line.3747"></a>
-<span class="sourceLineNo">3748</span>    int numFamilies = 10;<a name="line.3748"></a>
-<span class="sourceLineNo">3749</span>    int numQualifiers = 100;<a name="line.3749"></a>
-<span class="sourceLineNo">3750</span>    int compactInterval = 100;<a name="line.3750"></a>
-<span class="sourceLineNo">3751</span>    byte[][] families = new byte[numFamilies][];<a name="line.3751"></a>
-<span class="sourceLineNo">3752</span>    for (int i = 0; i &lt; numFamilies; i++) {<a name="line.3752"></a>
-<span class="sourceLineNo">3753</span>      families[i] = Bytes.toBytes("family" + i);<a name="line.3753"></a>
-<span class="sourceLineNo">3754</span>    }<a name="line.3754"></a>
-<span class="sourceLineNo">3755</span>    byte[][] qualifiers = new byte[numQualifiers][];<a name="line.3755"></a>
-<span class="sourceLineNo">3756</span>    for (int i = 0; i &lt; numQualifiers; i++) {<a name="line.3756"></a>
-<span class="sourceLineNo">3757</span>      qualifiers[i] = Bytes.toBytes("qual" + i);<a name="line.3757"></a>
-<span class="sourceLineNo">3758</span>    }<a name="line.3758"></a>
-<span class="sourceLineNo">3759</span><a name="line.3759"></a>
-<span class="sourceLineNo">3760</span><a name="line.3760"></a>
-<span class="sourceLineNo">3761</span>    // This test flushes constantly and can cause many files to be created,<a name="line.3761"></a>
-<span class="sourceLineNo">3762</span>    // possibly<a name="line.3762"></a>
-<span class="sourceLineNo">3763</span>    // extending over the ulimit. Make sure compactions are aggressive in<a name="line.3763"></a>
-<span class="sourceLineNo">3764</span>    // reducing<a name="line.3764"></a>
-<span class="sourceLineNo">3765</span>    // the number of HFiles created.<a name="line.3765"></a>
-<span class="sourceLineNo">3766</span>    Configuration conf = HBaseConfiguration.create(CONF);<a name="line.3766"></a>
-<span class="sourceLineNo">3767</span>    conf.setInt("hbase.hstore.compaction.min", 1);<a name="line.3767"></a>
-<span class="sourceLineNo">3768</span>    conf.setInt("hbase.hstore.compaction.max", 1000);<a name="line.3768"></a>
-<span class="sourceLineNo">3769</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.3769"></a>
-<span class="sourceLineNo">3770</span>    PutThread putThread = null;<a name="line.3770"></a>
-<span class="sourceLineNo">3771</span>    MultithreadedTestUtil.TestContext ctx = new MultithreadedTestUtil.TestContext(conf);<a name="line.3771"></a>
-<span class="sourceLineNo">3772</span>    try {<a name="line.3772"></a>
-<span class="sourceLineNo">3773</span>      putThread = new PutThread(numRows, families, qualifiers);<a name="line.3773"></a>
-<span class="sourceLineNo">3774</span>      putThread.start();<a name="line.3774"></a>
-<span class="sourceLineNo">3775</span>      putThread.waitForFirstPut();<a name="line.3775"></a>
-<span class="sourceLineNo">3776</span><a name="line.3776"></a>
-<span class="sourceLineNo">3777</span>      // Add a thread that flushes as fast as possible<a name="line.3777"></a>
-<span class="sourceLineNo">3778</span>      ctx.addThread(new RepeatingTestThread(ctx) {<a name="line.3778"></a>
-<span class="sourceLineNo">3779</span><a name="line.3779"></a>
-<span class="sourceLineNo">3780</span>        @Override<a name="line.3780"></a>
-<span class="sourceLineNo">3781</span>        public void doAnAction() throws Exception {<a name="line.3781"></a>
-<span class="sourceLineNo">3782</span>          region.flush(true);<a name="line.3782"></a>
-<span class="sourceLineNo">3783</span>          // Compact regularly to avoid creating too many files and exceeding<a name="line.3783"></a>
-<span class="sourceLineNo">3784</span>          // the ulimit.<a name="line.3784"></a>
-<span class="sourceLineNo">3785</span>          region.compact(false);<a name="line.3785"></a>
-<span class="sourceLineNo">3786</span>          for (HStore store : region.getStores()) {<a name="line.3786"></a>
-<span class="sourceLineNo">3787</span>            store.closeAndArchiveCompactedFiles();<a name="line.3787"></a>
-<span class="sourceLineNo">3788</span>          }<a name="line.3788"></a>
-<span class="sourceLineNo">3789</span>        }<a name="line.3789"></a>
-<span class="sourceLineNo">3790</span>      });<a name="line.3790"></a>
-<span class="sourceLineNo">3791</span>      ctx.startThreads();<a name="line.3791"></a>
-<span class="sourceLineNo">3792</span><a name="line.3792"></a>
-<span class="sourceLineNo">3793</span>      Get get = new Get(Bytes.toBytes("row0"));<a name="line.3793"></a>
-<span class="sourceLineNo">3794</span>      Result result = null;<a name="line.3794"></a>
-<span class="sourceLineNo">3795</span><a name="line.3795"></a>
-<span class="sourceLineNo">3796</span>      int expectedCount = numFamilies * numQualifiers;<a name="line.3796"></a>
-<span class="sourceLineNo">3797</span><a name="line.3797"></a>
-<span class="sourceLineNo">3798</span>      long prevTimestamp = 0L;<a name="line.3798"></a>
-<span class="sourceLineNo">3799</span>      for (int i = 0; i &lt; testCount; i++) {<a name="line.3799"></a>
-<span class="sourceLineNo">3800</span>        LOG.info("testWritesWhileGetting verify turn " + i);<a name="line.3800"></a>
-<span class="sourceLineNo">3801</span>        boolean previousEmpty = result == null || result.isEmpty();<a name="line.3801"></a>
-<span class="sourceLineNo">3802</span>        result = region.get(get);<a name="line.3802"></a>
-<span class="sourceLineNo">3803</span>        if (!result.isEmpty() || !previousEmpty || i &gt; compactInterval) {<a name="line.3803"></a>
-<span class="sourceLineNo">3804</span>          assertEquals("i=" + i, expectedCount, result.size());<a name="line.3804"></a>
-<span class="sourceLineNo">3805</span>          // TODO this was removed, now what dangit?!<a name="line.3805"></a>
-<span class="sourceLineNo">3806</span>          // search looking for the qualifier in question?<a name="line.3806"></a>
-<span class="sourceLineNo">3807</span>          long timestamp = 0;<a name="line.3807"></a>
-<span class="sourceLineNo">3808</span>          for (Cell kv : result.rawCells()) {<a name="line.3808"></a>
-<span class="sourceLineNo">3809</span>            if (CellUtil.matchingFamily(kv, families[0])<a name="line.3809"></a>
-<span class="sourceLineNo">3810</span>                &amp;&amp; CellUtil.matchingQualifier(kv, qualifiers[0])) {<a name="line.3810"></a>
-<span class="sourceLineNo">3811</span>              timestamp = kv.getTimestamp();<a name="line.3811"></a>
-<span class="sourceLineNo">3812</span>            }<a name="line.3812"></a>
-<span class="sourceLineNo">3813</span>          }<a name="line.3813"></a>
-<span class="sourceLineNo">3814</span>          assertTrue(timestamp &gt;= prevTimestamp);<a name="line.3814"></a>
-<span class="sourceLineNo">3815</span>          prevTimestamp = timestamp;<a name="line.3815"></a>
-<span class="sourceLineNo">3816</span>          Cell previousKV = null;<a name="line.3816"></a>
-<span class="sourceLineNo">3817</span><a name="line.3817"></a>
+<span class="sourceLineNo">3639</span>      putThread.done();<a name="line.3639"></a>
+<span class="sourceLineNo">3640</span><a name="line.3640"></a>
+<span class="sourceLineNo">3641</span>      region.flush(true);<a name="line.3641"></a>
+<span class="sourceLineNo">3642</span><a name="line.3642"></a>
+<span class="sourceLineNo">3643</span>    } finally {<a name="line.3643"></a>
+<span class="sourceLineNo">3644</span>      try {<a name="line.3644"></a>
+<span class="sourceLineNo">3645</span>        flushThread.done();<a name="line.3645"></a>
+<span class="sourceLineNo">3646</span>        flushThread.join();<a name="line.3646"></a>
+<span class="sourceLineNo">3647</span>        flushThread.checkNoError();<a name="line.3647"></a>
+<span class="sourceLineNo">3648</span><a name="line.3648"></a>
+<span class="sourceLineNo">3649</span>        putThread.join();<a name="line.3649"></a>
+<span class="sourceLineNo">3650</span>        putThread.checkNoError();<a name="line.3650"></a>
+<span class="sourceLineNo">3651</span>      } catch (InterruptedException ie) {<a name="line.3651"></a>
+<span class="sourceLineNo">3652</span>        LOG.warn("Caught exception when joining with flushThread", ie);<a name="line.3652"></a>
+<span class="sourceLineNo">3653</span>      }<a name="line.3653"></a>
+<span class="sourceLineNo">3654</span><a name="line.3654"></a>
+<span class="sourceLineNo">3655</span>      try {<a name="line.3655"></a>
+<span class="sourceLineNo">3656</span>          HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.3656"></a>
+<span class="sourceLineNo">3657</span>      } catch (DroppedSnapshotException dse) {<a name="line.3657"></a>
+<span class="sourceLineNo">3658</span>        // We could get this on way out because we interrupt the background flusher and it could<a name="line.3658"></a>
+<span class="sourceLineNo">3659</span>        // fail anywhere causing a DSE over in the background flusher... only it is not properly<a name="line.3659"></a>
+<span class="sourceLineNo">3660</span>        // dealt with so could still be memory hanging out when we get to here -- memory we can't<a name="line.3660"></a>
+<span class="sourceLineNo">3661</span>        // flush because the accounting is 'off' since original DSE.<a name="line.3661"></a>
+<span class="sourceLineNo">3662</span>      }<a name="line.3662"></a>
+<span class="sourceLineNo">3663</span>      this.region = null;<a name="line.3663"></a>
+<span class="sourceLineNo">3664</span>    }<a name="line.3664"></a>
+<span class="sourceLineNo">3665</span>  }<a name="line.3665"></a>
+<span class="sourceLineNo">3666</span><a name="line.3666"></a>
+<span class="sourceLineNo">3667</span>  protected class PutThread extends Thread {<a name="line.3667"></a>
+<span class="sourceLineNo">3668</span>    private volatile boolean done;<a name="line.3668"></a>
+<span class="sourceLineNo">3669</span>    private volatile int numPutsFinished = 0;<a name="line.3669"></a>
+<span class="sourceLineNo">3670</span><a name="line.3670"></a>
+<span class="sourceLineNo">3671</span>    private Throwable error = null;<a name="line.3671"></a>
+<span class="sourceLineNo">3672</span>    private int numRows;<a name="line.3672"></a>
+<span class="sourceLineNo">3673</span>    private byte[][] families;<a name="line.3673"></a>
+<span class="sourceLineNo">3674</span>    private byte[][] qualifiers;<a name="line.3674"></a>
+<span class="sourceLineNo">3675</span><a name="line.3675"></a>
+<span class="sourceLineNo">3676</span>    private PutThread(int numRows, byte[][] families, byte[][] qualifiers) {<a name="line.3676"></a>
+<span class="sourceLineNo">3677</span>      super("PutThread");<a name="line.3677"></a>
+<span class="sourceLineNo">3678</span>      this.numRows = numRows;<a name="line.3678"></a>
+<span class="sourceLineNo">3679</span>      this.families = families;<a name="line.3679"></a>
+<span class="sourceLineNo">3680</span>      this.qualifiers = qualifiers;<a name="line.3680"></a>
+<span class="sourceLineNo">3681</span>    }<a name="line.3681"></a>
+<span class="sourceLineNo">3682</span><a name="line.3682"></a>
+<span class="sourceLineNo">3683</span>    /**<a name="line.3683"></a>
+<span class="sourceLineNo">3684</span>     * Block calling thread until this instance of PutThread has put at least one row.<a name="line.3684"></a>
+<span class="sourceLineNo">3685</span>     */<a name="line.3685"></a>
+<span class="sourceLineNo">3686</span>    public void waitForFirstPut() throws InterruptedException {<a name="line.3686"></a>
+<span class="sourceLineNo">3687</span>      // wait until put thread actually puts some data<a name="line.3687"></a>
+<span class="sourceLineNo">3688</span>      while (isAlive() &amp;&amp; numPutsFinished == 0) {<a name="line.3688"></a>
+<span class="sourceLineNo">3689</span>        checkNoError();<a name="line.3689"></a>
+<span class="sourceLineNo">3690</span>        Thread.sleep(50);<a name="line.3690"></a>
+<span class="sourceLineNo">3691</span>      }<a name="line.3691"></a>
+<span class="sourceLineNo">3692</span>    }<a name="line.3692"></a>
+<span class="sourceLineNo">3693</span><a name="line.3693"></a>
+<span class="sourceLineNo">3694</span>    public void done() {<a name="line.3694"></a>
+<span class="sourceLineNo">3695</span>      done = true;<a name="line.3695"></a>
+<span class="sourceLineNo">3696</span>      synchronized (this) {<a name="line.3696"></a>
+<span class="sourceLineNo">3697</span>        interrupt();<a name="line.3697"></a>
+<span class="sourceLineNo">3698</span>      }<a name="line.3698"></a>
+<span class="sourceLineNo">3699</span>    }<a name="line.3699"></a>
+<span class="sourceLineNo">3700</span><a name="line.3700"></a>
+<span class="sourceLineNo">3701</span>    public void checkNoError() {<a name="line.3701"></a>
+<span class="sourceLineNo">3702</span>      if (error != null) {<a name="line.3702"></a>
+<span class="sourceLineNo">3703</span>        assertNull(error);<a name="line.3703"></a>
+<span class="sourceLineNo">3704</span>      }<a name="line.3704"></a>
+<span class="sourceLineNo">3705</span>    }<a name="line.3705"></a>
+<span class="sourceLineNo">3706</span><a name="line.3706"></a>
+<span class="sourceLineNo">3707</span>    @Override<a name="line.3707"></a>
+<span class="sourceLineNo">3708</span>    public void run() {<a name="line.3708"></a>
+<span class="sourceLineNo">3709</span>      done = false;<a name="line.3709"></a>
+<span class="sourceLineNo">3710</span>      while (!done) {<a name="line.3710"></a>
+<span class="sourceLineNo">3711</span>        try {<a name="line.3711"></a>
+<span class="sourceLineNo">3712</span>          for (int r = 0; r &lt; numRows; r++) {<a name="line.3712"></a>
+<span class="sourceLineNo">3713</span>            byte[] row = Bytes.toBytes("row" + r);<a name="line.3713"></a>
+<span class="sourceLineNo">3714</span>            Put put = new Put(row);<a name="line.3714"></a>
+<span class="sourceLineNo">3715</span>            put.setDurability(Durability.SKIP_WAL);<a name="line.3715"></a>
+<span class="sourceLineNo">3716</span>            byte[] value = Bytes.toBytes(String.valueOf(numPutsFinished));<a name="line.3716"></a>
+<span class="sourceLineNo">3717</span>            for (byte[] family : families) {<a name="line.3717"></a>
+<span class="sourceLineNo">3718</span>              for (byte[] qualifier : qualifiers) {<a name="line.3718"></a>
+<span class="sourceLineNo">3719</span>                put.addColumn(family, qualifier, numPutsFinished, value);<a name="line.3719"></a>
+<span class="sourceLineNo">3720</span>              }<a name="line.3720"></a>
+<span class="sourceLineNo">3721</span>            }<a name="line.3721"></a>
+<span class="sourceLineNo">3722</span>            region.put(put);<a name="line.3722"></a>
+<span class="sourceLineNo">3723</span>            numPutsFinished++;<a name="line.3723"></a>
+<span class="sourceLineNo">3724</span>            if (numPutsFinished &gt; 0 &amp;&amp; numPutsFinished % 47 == 0) {<a name="line.3724"></a>
+<span class="sourceLineNo">3725</span>              LOG.debug("put iteration = {}", numPutsFinished);<a name="line.3725"></a>
+<span class="sourceLineNo">3726</span>              Delete delete = new Delete(row, (long) numPutsFinished - 30);<a name="line.3726"></a>
+<span class="sourceLineNo">3727</span>              region.delete(delete);<a name="line.3727"></a>
+<span class="sourceLineNo">3728</span>            }<a name="line.3728"></a>
+<span class="sourceLineNo">3729</span>            numPutsFinished++;<a name="line.3729"></a>
+<span class="sourceLineNo">3730</span>          }<a name="line.3730"></a>
+<span class="sourceLineNo">3731</span>        } catch (InterruptedIOException e) {<a name="line.3731"></a>
+<span class="sourceLineNo">3732</span>          // This is fine. It means we are done, or didn't get the lock on time<a name="line.3732"></a>
+<span class="sourceLineNo">3733</span>          LOG.info("Interrupted", e);<a name="line.3733"></a>
+<span class="sourceLineNo">3734</span>        } catch (IOException e) {<a name="line.3734"></a>
+<span class="sourceLineNo">3735</span>          LOG.error("Error while putting records", e);<a name="line.3735"></a>
+<span class="sourceLineNo">3736</span>          error = e;<a name="line.3736"></a>
+<span class="sourceLineNo">3737</span>          break;<a name="line.3737"></a>
+<span class="sourceLineNo">3738</span>        }<a name="line.3738"></a>
+<span class="sourceLineNo">3739</span>      }<a name="line.3739"></a>
+<span class="sourceLineNo">3740</span><a name="line.3740"></a>
+<span class="sourceLineNo">3741</span>    }<a name="line.3741"></a>
+<span class="sourceLineNo">3742</span><a name="line.3742"></a>
+<span class="sourceLineNo">3743</span>  }<a name="line.3743"></a>
+<span class="sourceLineNo">3744</span><a name="line.3744"></a>
+<span class="sourceLineNo">3745</span>  /**<a name="line.3745"></a>
+<span class="sourceLineNo">3746</span>   * Writes very wide records and gets the latest row every time.. Flushes and<a name="line.3746"></a>
+<span class="sourceLineNo">3747</span>   * compacts the region aggressivly to catch issues.<a name="line.3747"></a>
+<span class="sourceLineNo">3748</span>   *<a name="line.3748"></a>
+<span class="sourceLineNo">3749</span>   * @throws IOException<a name="line.3749"></a>
+<span class="sourceLineNo">3750</span>   *           by flush / scan / compaction<a name="line.3750"></a>
+<span class="sourceLineNo">3751</span>   * @throws InterruptedException<a name="line.3751"></a>
+<span class="sourceLineNo">3752</span>   *           when joining threads<a name="line.3752"></a>
+<span class="sourceLineNo">3753</span>   */<a name="line.3753"></a>
+<span class="sourceLineNo">3754</span>  @Test<a name="line.3754"></a>
+<span class="sourceLineNo">3755</span>  public void testWritesWhileGetting() throws Exception {<a name="line.3755"></a>
+<span class="sourceLineNo">3756</span>    int testCount = 50;<a name="line.3756"></a>
+<span class="sourceLineNo">3757</span>    int numRows = 1;<a name="line.3757"></a>
+<span class="sourceLineNo">3758</span>    int numFamilies = 10;<a name="line.3758"></a>
+<span class="sourceLineNo">3759</span>    int numQualifiers = 100;<a name="line.3759"></a>
+<span class="sourceLineNo">3760</span>    int compactInterval = 100;<a name="line.3760"></a>
+<span class="sourceLineNo">3761</span>    byte[][] families = new byte[numFamilies][];<a name="line.3761"></a>
+<span class="sourceLineNo">3762</span>    for (int i = 0; i &lt; numFamilies; i++) {<a name="line.3762"></a>
+<span class="sourceLineNo">3763</span>      families[i] = Bytes.toBytes("family" + i);<a name="line.3763"></a>
+<span class="sourceLineNo">3764</span>    }<a name="line.3764"></a>
+<span class="sourceLineNo">3765</span>    byte[][] qualifiers = new byte[numQualifiers][];<a name="line.3765"></a>
+<span class="sourceLineNo">3766</span>    for (int i = 0; i &lt; numQualifiers; i++) {<a name="line.3766"></a>
+<span class="sourceLineNo">3767</span>      qualifiers[i] = Bytes.toBytes("qual" + i);<a name="line.3767"></a>
+<span class="sourceLineNo">3768</span>    }<a name="line.3768"></a>
+<span class="sourceLineNo">3769</span><a name="line.3769"></a>
+<span class="sourceLineNo">3770</span><a name="line.3770"></a>
+<span class="sourceLineNo">3771</span>    // This test flushes constantly and can cause many files to be created,<a name="line.3771"></a>
+<span class="sourceLineNo">3772</span>    // possibly<a name="line.3772"></a>
+<span class="sourceLineNo">3773</span>    // extending over the ulimit. Make sure compactions are aggressive in<a name="line.3773"></a>
+<span class="sourceLineNo">3774</span>    // reducing<a name="line.3774"></a>
+<span class="sourceLineNo">3775</span>    // the number of HFiles created.<a name="line.3775"></a>
+<span class="sourceLineNo">3776</span>    Configuration conf = HBaseConfiguration.create(CONF);<a name="line.3776"></a>
+<span class="sourceLineNo">3777</span>    conf.setInt("hbase.hstore.compaction.min", 1);<a name="line.3777"></a>
+<span class="sourceLineNo">3778</span>    conf.setInt("hbase.hstore.compaction.max", 1000);<a name="line.3778"></a>
+<span class="sourceLineNo">3779</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.3779"></a>
+<span class="sourceLineNo">3780</span>    PutThread putThread = null;<a name="line.3780"></a>
+<span class="sourceLineNo">3781</span>    MultithreadedTestUtil.TestContext ctx = new MultithreadedTestUtil.TestContext(conf);<a name="line.3781"></a>
+<span class="sourceLineNo">3782</span>    try {<a name="line.3782"></a>
+<span class="sourceLineNo">3783</span>      putThread = new PutThread(numRows, families, qualifiers);<a name="line.3783"></a>
+<span class="sourceLineNo">3784</span>      putThread.start();<a name="line.3784"></a>
+<span class="sourceLineNo">3785</span>      putThread.waitForFirstPut();<a name="line.3785"></a>
+<span class="sourceLineNo">3786</span><a name="line.3786"></a>
+<span class="sourceLineNo">3787</span>      // Add a thread that flushes as fast as possible<a name="line.3787"></a>
+<span class="sourceLineNo">3788</span>      ctx.addThread(new RepeatingTestThread(ctx) {<a name="line.3788"></a>
+<span class="sourceLineNo">3789</span><a name="line.3789"></a>
+<span class="sourceLineNo">3790</span>        @Override<a name="line.3790"></a>
+<span class="sourceLineNo">3791</span>        public void doAnAction() throws Exception {<a name="line.3791"></a>
+<span class="sourceLineNo">3792</span>          region.flush(true);<a name="line.3792"></a>
+<span class="sourceLineNo">3793</span>          // Compact regularly to avoid creating too many files and exceeding<a name="line.3793"></a>
+<span class="sourceLineNo">3794</span>          // the ulimit.<a name="line.3794"></a>
+<span class="sourceLineNo">3795</span>          region.compact(false);<a name="line.3795"></a>
+<span class="sourceLineNo">3796</span>          for (HStore store : region.getStores()) {<a name="line.3796"></a>
+<span class="sourceLineNo">3797</span>            store.closeAndArchiveCompactedFiles();<a name="line.3797"></a>
+<span class="sourceLineNo">3798</span>          }<a name="line.3798"></a>
+<span class="sourceLineNo">3799</span>        }<a name="line.3799"></a>
+<span class="sourceLineNo">3800</span>      });<a name="line.3800"></a>
+<span class="sourceLineNo">3801</span>      ctx.startThreads();<a name="line.3801"></a>
+<span class="sourceLineNo">3802</span><a name="line.3802"></a>
+<span class="sourceLineNo">3803</span>      Get get = new Get(Bytes.toBytes("row0"));<a name="line.3803"></a>
+<span class="sourceLineNo">3804</span>      Result result = null;<a name="line.3804"></a>
+<span class="sourceLineNo">3805</span><a name="line.3805"></a>
+<span class="sourceLineNo">3806</span>      int expectedCount = numFamilies * numQualifiers;<a name="line.3806"></a>
+<span class="sourceLineNo">3807</span><a name="line.3807"></a>
+<span class="sourceLineNo">3808</span>      long prevTimestamp = 0L;<a name="line.3808"></a>
+<span class="sourceLineNo">3809</span>      for (int i = 0; i &lt; testCount; i++) {<a name="line.3809"></a>
+<span class="sourceLineNo">3810</span>        LOG.info("testWritesWhileGetting verify turn " + i);<a name="line.3810"></a>
+<span class="sourceLineNo">3811</span>        boolean previousEmpty = result == null || result.isEmpty();<a name="line.3811"></a>
+<span class="sourceLineNo">3812</span>        result = region.get(get);<a name="line.3812"></a>
+<span class="sourceLineNo">3813</span>        if (!result.isEmpty() || !previousEmpty || i &gt; compactInterval) {<a name="line.3813"></a>
+<span class="sourceLineNo">3814</span>          assertEquals("i=" + i, expectedCount, result.size());<a name="line.3814"></a>
+<span class="sourceLineNo">3815</span>          // TODO this was removed, now what dangit?!<a name="line.3815"></a>
+<span class="sourceLineNo">3816</span>          // search looking for the qualifier in question?<a name="line.3816"></a>
+<span class="sourceLineNo">3817</span>          long timestamp = 0;<a name="line.3817"></a>
 <span class="sourceLineNo">3818</span>          for (Cell kv : result.rawCells()) {<a name="line.3818"></a>
-<span class="sourceLineNo">3819</span>            byte[] thisValue = CellUtil.cloneValue(kv);<a name="line.3819"></a>
-<span class="sourceLineNo">3820</span>            if (previousKV != null) {<a name="line.3820"></a>
-<span class="sourceLineNo">3821</span>              if (Bytes.compareTo(CellUtil.cloneValue(previousKV), thisValue) != 0) {<a name="line.3821"></a>
-<span class="sourceLineNo">3822</span>                LOG.warn("These two KV should have the same value." + " Previous KV:" + previousKV<a name="line.3822"></a>
-<span class="sourceLineNo">3823</span>                    + "(memStoreTS:" + previousKV.getSequenceId() + ")" + ", New KV: " + kv<a name="line.3823"></a>
-<span class="sourceLineNo">3824</span>                    + "(memStoreTS:" + kv.getSequenceId() + ")");<a name="line.3824"></a>
-<span class="sourceLineNo">3825</span>                assertEquals(0, Bytes.compareTo(CellUtil.cloneValue(previousKV), thisValue));<a name="line.3825"></a>
-<span class="sourceLineNo">3826</span>              }<a name="line.3826"></a>
-<span class="sourceLineNo">3827</span>            }<a name="line.3827"></a>
-<span class="sourceLineNo">3828</span>            previousKV = kv;<a name="line.3828"></a>
-<span class="sourceLineNo">3829</span>          }<a name="line.3829"></a>
-<span class="sourceLineNo">3830</span>        }<a name="line.3830"></a>
-<span class="sourceLineNo">3831</span>      }<a name="line.3831"></a>
-<span class="sourceLineNo">3832</span>    } finally {<a name="line.3832"></a>
-<span class="sourceLineNo">3833</span>      if (putThread != null)<a name="line.3833"></a>
-<span class="sourceLineNo">3834</span>        putThread.done();<a name="line.3834"></a>
-<span class="sourceLineNo">3835</span><a name="line.3835"></a>
-<span class="sourceLineNo">3836</span>      region.flush(true);<a name="line.3836"></a>
-<span class="sourceLineNo">3837</span><a name="line.3837"></a>
-<span class="sourceLineNo">3838</span>      if (putThread != null) {<a name="line.3838"></a>
-<span class="sourceLineNo">3839</span>        putThread.join();<a name="line.3839"></a>
-<span class="sourceLineNo">3840</span>        putThread.checkNoError();<a name="line.3840"></a>
+<span class="sourceLineNo">3819</span>            if (CellUtil.matchingFamily(kv, families[0])<a name="line.3819"></a>
+<span class="sourceLineNo">3820</span>                &amp;&amp; CellUtil.matchingQualifier(kv, qualifiers[0])) {<a name="line.3820"></a>
+<span class="sourceLineNo">3821</span>              timestamp = kv.getTimestamp();<a name="line.3821"></a>
+<span class="sourceLineNo">3822</span>            }<a name="line.3822"></a>
+<span class="sourceLineNo">3823</span>          }<a name="line.3823"></a>
+<span class="sourceLineNo">3824</span>          assertTrue(timestamp &gt;= prevTimestamp);<a name="line.3824"></a>
+<span class="sourceLineNo">3825</span>          prevTimestamp = timestamp;<a name="line.3825"></a>
+<span class="sourceLineNo">3826</span>          Cell previousKV = null;<a name="line.3826"></a>
+<span class="sourceLineNo">3827</span><a name="line.3827"></a>
+<span class="sourceLineNo">3828</span>          for (Cell kv : result.rawCells()) {<a name="line.3828"></a>
+<span class="sourceLineNo">3829</span>            byte[] thisValue = CellUtil.cloneValue(kv);<a name="line.3829"></a>
+<span class="sourceLineNo">3830</span>            if (previousKV != null) {<a name="line.3830"></a>
+<span class="sourceLineNo">3831</span>              if (Bytes.compareTo(CellUtil.cloneValue(previousKV), thisValue) != 0) {<a name="line.3831"></a>
+<span class="sourceLineNo">3832</span>                LOG.warn("These two KV should have the same value." + " Previous KV:" + previousKV<a name="line.3832"></a>
+<span class="sourceLineNo">3833</span>                    + "(memStoreTS:" + previousKV.getSequenceId() + ")" + ", New KV: " + kv<a name="line.3833"></a>
+<span class="sourceLineNo">3834</span>                    + "(memStoreTS:" + kv.getSequenceId() + ")");<a name="line.3834"></a>
+<span class="sourceLineNo">3835</span>                assertEquals(0, Bytes.compareTo(CellUtil.cloneValue(previousKV), thisValue));<a name="line.3835"></a>
+<span class="sourceLineNo">3836</span>              }<a name="line.3836"></a>
+<span class="sourceLineNo">3837</span>            }<a name="line.3837"></a>
+<span class="sourceLineNo">3838</span>            previousKV = kv;<a name="line.3838"></a>
+<span class="sourceLineNo">3839</span>          }<a name="line.3839"></a>
+<span class="sourceLineNo">3840</span>        }<a name="line.3840"></a>
 <span class="sourceLineNo">3841</span>      }<a name="line.3841"></a>
-<span class="sourceLineNo">3842</span><a name="line.3842"></a>
-<span class="sourceLineNo">3843</span>      ctx.stop();<a name="line.3843"></a>
-<span class="sourceLineNo">3844</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.3844"></a>
-<span class="sourceLineNo">3845</span>      this.region = null;<a name="line.3845"></a>
-<span class="sourceLineNo">3846</span>    }<a name="line.3846"></a>
-<span class="sourceLineNo">3847</span>  }<a name="line.3847"></a>
-<span class="sourceLineNo">3848</span><a name="line.3848"></a>
-<span class="sourceLineNo">3849</span>  @Test<a name="line.3849"></a>
-<span class="sourceLineNo">3850</span>  public void testHolesInMeta() throws Exception {<a name="line.3850"></a>
-<span class="sourceLineNo">3851</span>    byte[] family = Bytes.toBytes("family");<a name="line.3851"></a>
-<span class="sourceLineNo">3852</span>    this.region = initHRegion(tableName, Bytes.toBytes("x"), Bytes.toBytes("z"), method, CONF,<a name="line.3852"></a>
-<span class="sourceLineNo">3853</span>        false, family);<a name="line.3853"></a>
-<span class="sourceLineNo">3854</span>    byte[] rowNotServed = Bytes.toBytes("a");<a name="line.3854"></a>
-<span class="sourceLineNo">3855</span>    Get g = new Get(rowNotServed);<a name="line.3855"></a>
-<span class="sourceLineNo">3856</span>    try {<a name="line.3856"></a>
-<span class="sourceLineNo">3857</span>      region.get(g);<a name="line.3857"></a>
-<span class="sourceLineNo">3858</span>      fail();<a name="line.3858"></a>
-<span class="sourceLineNo">3859</span>    } catch (WrongRegionException x) {<a name="line.3859"></a>
-<span class="sourceLineNo">3860</span>      // OK<a name="line.3860"></a>
-<span class="sourceLineNo">3861</span>    }<a name="line.3861"></a>
-<span class="sourceLineNo">3862</span>    byte[] row = Bytes.toBytes("y");<a name="line.3862"></a>
-<span class="sourceLineNo">3863</span>    g = new Get(row);<a name="line.3863"></a>
-<span class="sourceLineNo">3864</span>    region.get(g);<a name="line.3864"></a>
-<span class="sourceLineNo">3865</span>  }<a name="line.3865"></a>
-<span class="sourceLineNo">3866</span><a name="line.3866"></a>
-<span class="sourceLineNo">3867</span>  @Test<a name="line.3867"></a>
-<span class="sourceLineNo">3868</span>  public void testIndexesScanWithOneDeletedRow() throws IOException {<a name="line.3868"></a>
-<span class="sourceLineNo">3869</span>    byte[] family = Bytes.toBytes("family");<a name="line.3869"></a>
-<span class="sourceLineNo">3870</span><a name="line.3870"></a>
-<span class="sourceLineNo">3871</span>    // Setting up region<a name="line.3871"></a>
-<span class="sourceLineNo">3872</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.3872"></a>
-<span class="sourceLineNo">3873</span>    Put put = new Put(Bytes.toBytes(1L));<a name="line.3873"></a>
-<span class="sourceLineNo">3874</span>    put.addColumn(family, qual1, 1L, Bytes.toBytes(1L));<a name="line.3874"></a>
-<span class="sourceLineNo">3875</span>    region.put(put);<a name="line.3875"></a>
+<span class="sourceLineNo">3842</span>    } finally {<a name="line.3842"></a>
+<span class="sourceLineNo">3843</span>      if (putThread != null)<a name="line.3843"></a>
+<span class="sourceLineNo">3844</span>        putThread.done();<a name="line.3844"></a>
+<span class="sourceLineNo">3845</span><a name="line.3845"></a>
+<span class="sourceLineNo">3846</span>      region.flush(true);<a name="line.3846"></a>
+<span class="sourceLineNo">3847</span><a name="line.3847"></a>
+<span class="sourceLineNo">3848</span>      if (putThread != null) {<a name="line.3848"></a>
+<span class="sourceLineNo">3849</span>        putThread.join();<a name="line.3849"></a>
+<span class="sourceLineNo">3850</span>        putThread.checkNoError();<a name="line.3850"></a>
+<span class="sourceLineNo">3851</span>      }<a name="line.3851"></a>
+<span class="sourceLineNo">3852</span><a name="line.3852"></a>
+<span class="sourceLineNo">3853</span>      ctx.stop();<a name="line.3853"></a>
+<span class="sourceLineNo">3854</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.3854"></a>
+<span class="sourceLineNo">3855</span>      this.region = null;<a name="line.3855"></a>
+<span class="sourceLineNo">3856</span>    }<a name="line.3856"></a>
+<span class="sourceLineNo">3857</span>  }<a name="line.3857"></a>
+<span class="sourceLineNo">3858</span><a name="line.3858"></a>
+<span class="sourceLineNo">3859</span>  @Test<a name="line.3859"></a>
+<span class="sourceLineNo">3860</span>  public void testHolesInMeta() throws Exception {<a name="line.3860"></a>
+<span class="sourceLineNo">3861</span>    byte[] family = Bytes.toBytes("family");<a name="line.3861"></a>
+<span class="sourceLineNo">3862</span>    this.region = initHRegion(tableName, Bytes.toBytes("x"), Bytes.toBytes("z"), method, CONF,<a name="line.3862"></a>
+<span class="sourceLineNo">3863</span>        false, family);<a name="line.3863"></a>
+<span class="sourceLineNo">3864</span>    byte[] rowNotServed = Bytes.toBytes("a");<a name="line.3864"></a>
+<span class="sourceLineNo">3865</span>    Get g = new Get(rowNotServed);<a name="line.3865"></a>
+<span class="sourceLineNo">3866</span>    try {<a name="line.3866"></a>
+<span class="sourceLineNo">3867</span>      region.get(g);<a name="line.3867"></a>
+<span class="sourceLineNo">3868</span>      fail();<a name="line.3868"></a>
+<span class="sourceLineNo">3869</span>    } catch (WrongRegionException x) {<a name="line.3869"></a>
+<span class="sourceLineNo">3870</span>      // OK<a name="line.3870"></a>
+<span class="sourceLineNo">3871</span>    }<a name="line.3871"></a>
+<span class="sourceLineNo">3872</span>    byte[] row = Bytes.toBytes("y");<a name="line.3872"></a>
+<span class="sourceLineNo">3873</span>    g = new Get(row);<a name="line.3873"></a>
+<span class="sourceLineNo">3874</span>    region.get(g);<a name="line.3874"></a>
+<span class="sourceLineNo">3875</span>  }<a name="line.3875"></a>
 <span class="sourceLineNo">3876</span><a name="line.3876"></a>
-<span class="sourceLineNo">3877</span>    region.flush(true);<a name="line.3877"></a>
-<span class="sourceLineNo">3878</span><a name="line.3878"></a>
-<span class="sourceLineNo">3879</span>    Delete delete = new Delete(Bytes.toBytes(1L), 1L);<a name="line.3879"></a>
-<span class="sourceLineNo">3880</span>    region.delete(delete);<a name="line.3880"></a>
-<span class="sourceLineNo">3881</span><a name="line.3881"></a>
-<span class="sourceLineNo">3882</span>    put = new Put(Bytes.toBytes(2L));<a name="line.3882"></a>
-<span class="sourceLineNo">3883</span>    put.addColumn(family, qual1, 2L, Bytes.toBytes(2L));<a name="line.3883"></a>
-<span class="sourceLineNo">3884</span>    region.put(put);<a name="line.3884"></a>
-<span class="sourceLineNo">3885</span><a name="line.3885"></a>
-<span class="sourceLineNo">3886</span>    Scan idxScan = new Scan();<a name="line.3886"></a>
-<span class="sourceLineNo">3887</span>    idxScan.addFamily(family);<a name="line.3887"></a>
-<span class="sourceLineNo">3888</span>    idxScan.setFilter(new FilterList(FilterList.Operator.MUST_PASS_ALL, Arrays.&lt;Filter&gt; asList(<a name="line.3888"></a>
-<span class="sourceLineNo">3889</span>        new SingleColumnValueFilter(family, qual1, CompareOperator.GREATER_OR_EQUAL,<a name="line.3889"></a>
-<span class="sourceLineNo">3890</span>            new BinaryComparator(Bytes.toBytes(0L))), new SingleColumnValueFilter(family, qual1,<a name="line.3890"></a>
-<span class="sourceLineNo">3891</span>                    CompareOperator.LESS_OR_EQUAL, new BinaryComparator(Bytes.toBytes(3L))))));<a name="line.3891"></a>
-<span class="sourceLineNo">3892</span>    InternalScanner scanner = region.getScanner(idxScan);<a name="line.3892"></a>
-<span class="sourceLineNo">3893</span>    List&lt;Cell&gt; res = new ArrayList&lt;&gt;();<a name="line.3893"></a>
-<span class="sourceLineNo">3894</span><a name="line.3894"></a>
-<span class="sourceLineNo">3895</span>    while (scanner.next(res)) {<a name="line.3895"></a>
-<span class="sourceLineNo">3896</span>      // Ignore res value.<a name="line.3896"></a>
-<span class="sourceLineNo">3897</span>    }<a name="line.3897"></a>
-<span class="sourceLineNo">3898</span>    assertEquals(1L, res.size());<a name="line.3898"></a>
-<span class="sourceLineNo">3899</span>  }<a name="line.3899"></a>
-<span class="sourceLineNo">3900</span><a name="line.3900"></a>
-<span class="sourceLineNo">3901</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.3901"></a>
-<span class="sourceLineNo">3902</span>  // Bloom filter test<a name="line.3902"></a>
-<span class="sourceLineNo">3903</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.3903"></a>
-<span class="sourceLineNo">3904</span>  @Test<a name="line.3904"></a>
-<span class="sourceLineNo">3905</span>  public void testBloomFilterSize() throws IOException {<a name="line.3905"></a>
-<span class="sourceLineNo">3906</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.3906"></a>
-<span class="sourceLineNo">3907</span>    byte[] qf1 = Bytes.toBytes("col");<a name="line.3907"></a>
-<span class="sourceLineNo">3908</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.3908"></a>
-<span class="sourceLineNo">3909</span>    // Create Table<a name="line.3909"></a>
-<span class="sourceLineNo">3910</span>    HColumnDescriptor hcd = new HColumnDescriptor(fam1).setMaxVersions(Integer.MAX_VALUE)<a name="line.3910"></a>
-<span class="sourceLineNo">3911</span>        .setBloomFilterType(BloomType.ROWCOL);<a name="line.3911"></a>
-<span class="sourceLineNo">3912</span><a name="line.3912"></a>
-<span class="sourceLineNo">3913</span>    HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.3913"></a>
-<span class="sourceLineNo">3914</span>    htd.addFamily(hcd);<a name="line.3914"></a>
-<span class="sourceLineNo">3915</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.3915"></a>
-<span class="sourceLineNo">3916</span>    this.region = TEST_UTIL.createLocalHRegion(info, htd);<a name="line.3916"></a>
-<span class="sourceLineNo">3917</span>    int num_unique_rows = 10;<a name="line.3917"></a>
-<span class="sourceLineNo">3918</span>    int duplicate_multiplier = 2;<a name="line.3918"></a>
-<span class="sourceLineNo">3919</span>    int num_storefiles = 4;<a name="line.3919"></a>
-<span class="sourceLineNo">3920</span><a name="line.3920"></a>
-<span class="sourceLineNo">3921</span>    int version = 0;<a name="line.3921"></a>
-<span class="sourceLineNo">3922</span>    for (int f = 0; f &lt; num_storefiles; f++) {<a name="line.3922"></a>
-<span class="sourceLineNo">3923</span>      for (int i = 0; i &lt; duplicate_multiplier; i++) {<a name="line.3923"></a>
-<span class="sourceLineNo">3924</span>        for (int j = 0; j &lt; num_unique_rows; j++) {<a name="line.3924"></a>
-<span class="sourceLineNo">3925</span>          Put put = new Put(Bytes.toBytes("row" + j));<a name="line.3925"></a>
-<span class="sourceLineNo">3926</span>          put.setDurability(Durability.SKIP_WAL);<a name="line.3926"></a>
-<span class="sourceLineNo">3927</span>          long ts = version++;<a name="line.3927"></a>
-<span class="sourceLineNo">3928</span>          put.addColumn(fam1, qf1, ts, val1);<a name="line.3928"></a>
-<span class="sourceLineNo">3929</span>          region.put(put);<a name="line.3929"></a>
-<span class="sourceLineNo">3930</span>        }<a name="line.3930"></a>
-<span class="sourceLineNo">3931</span>      }<a name="line.3931"></a>
-<span class="sourceLineNo">3932</span>      region.flush(true);<a name="line.3932"></a>
-<span class="sourceLineNo">3933</span>    }<a name="line.3933"></a>
-<span class="sourceLineNo">3934</span>    // before compaction<a name="line.3934"></a>
-<span class="sourceLineNo">3935</span>    HStore store = region.getStore(fam1);<a name="line.3935"></a>
-<span class="sourceLineNo">3936</span>    Collection&lt;HStoreFile&gt; storeFiles = store.getStorefiles();<a name="line.3936"></a>
-<span class="sourceLineNo">3937</span>    for (HStoreFile storefile : storeFiles) {<a name="line.3937"></a>
-<span class="sourceLineNo">3938</span>      StoreFileReader reader = storefile.getReader();<a name="line.3938"></a>
-<span class="sourceLineNo">3939</span>      reader.loadFileInfo();<a name="line.3939"></a>
-<span class="sourceLineNo">3940</span>      reader.loadBloomfilter();<a name="line.3940"></a>
-<span class="sourceLineNo">3941</span>      assertEquals(num_unique_rows * duplicate_multiplier, reader.getEntries());<a name="line.3941"></a>
-<span class="sourceLineNo">3942</span>      assertEquals(num_unique_rows, reader.getFilterEntries());<a name="line.3942"></a>
+<span class="sourceLineNo">3877</span>  @Test<a name="line.3877"></a>
+<span class="sourceLineNo">3878</span>  public void testIndexesScanWithOneDeletedRow() throws IOException {<a name="line.3878"></a>
+<span class="sourceLineNo">3879</span>    byte[] family = Bytes.toBytes("family");<a name="line.3879"></a>
+<span class="sourceLineNo">3880</span><a name="line.3880"></a>
+<span class="sourceLineNo">3881</span>    // Setting up region<a name="line.3881"></a>
+<span class="sourceLineNo">3882</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.3882"></a>
+<span class="sourceLineNo">3883</span>    Put put = new Put(Bytes.toBytes(1L));<a name="line.3883"></a>
+<span class="sourceLineNo">3884</span>    put.addColumn(family, qual1, 1L, Bytes.toBytes(1L));<a name="line.3884"></a>
+<span class="sourceLineNo">3885</span>    region.put(put);<a name="line.3885"></a>
+<span class="sourceLineNo">3886</span><a name="line.3886"></a>
+<span class="sourceLineNo">3887</span>    region.flush(true);<a name="line.3887"></a>
+<span class="sourceLineNo">3888</span><a name="line.3888"></a>
+<span class="sourceLineNo">3889</span>    Delete delete = new Delete(Bytes.toBytes(1L), 1L);<a name="line.3889"></a>
+<span class="sourceLineNo">3890</span>    region.delete(delete);<a name="line.3890"></a>
+<span class="sourceLineNo">3891</span><a name="line.3891"></a>
+<span class="sourceLineNo">3892</span>    put = new Put(Bytes.toBytes(2L));<a name="line.3892"></a>
+<span class="sourceLineNo">3893</span>    put.addColumn(family, qual1, 2L, Bytes.toBytes(2L));<a name="line.3893"></a>
+<span class="sourceLineNo">3894</span>    region.put(put);<a name="line.3894"></a>
+<span class="sourceLineNo">3895</span><a name="line.3895"></a>
+<span class="sourceLineNo">3896</span>    Scan idxScan = new Scan();<a name="line.3896"></a>
+<span class="sourceLineNo">3897</span>    idxScan.addFamily(family);<a name="line.3897"></a>
+<span class="sourceLineNo">3898</span>    idxScan.setFilter(new FilterList(FilterList.Operator.MUST_PASS_ALL, Arrays.&lt;Filter&gt; asList(<a name="line.3898"></a>
+<span class="sourceLineNo">3899</span>        new SingleColumnValueFilter(family, qual1, CompareOperator.GREATER_OR_EQUAL,<a name="line.3899"></a>
+<span class="sourceLineNo">3900</span>            new BinaryComparator(Bytes.toBytes(0L))), new SingleColumnValueFilter(family, qual1,<a name="line.3900"></a>
+<span class="sourceLineNo">3901</span>                    CompareOperator.LESS_OR_EQUAL, new BinaryComparator(Bytes.toBytes(3L))))));<a name="line.3901"></a>
+<span class="sourceLineNo">3902</span>    InternalScanner scanner = region.getScanner(idxScan);<a name="line.3902"></a>
+<span class="sourceLineNo">3903</span>    List&lt;Cell&gt; res = new ArrayList&lt;&gt;();<a name="line.3903"></a>
+<span class="sourceLineNo">3904</span><a name="line.3904"></a>
+<span class="sourceLineNo">3905</span>    while (scanner.next(res)) {<a name="line.3905"></a>
+<span class="sourceLineNo">3906</span>      // Ignore res value.<a name="line.3906"></a>
+<span class="sourceLineNo">3907</span>    }<a name="line.3907"></a>
+<span class="sourceLineNo">3908</span>    assertEquals(1L, res.size());<a name="line.3908"></a>
+<span class="sourceLineNo">3909</span>  }<a name="line.3909"></a>
+<span class="sourceLineNo">3910</span><a name="line.3910"></a>
+<span class="sourceLineNo">3911</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.3911"></a>
+<span class="sourceLineNo">3912</span>  // Bloom filter test<a name="line.3912"></a>
+<span class="sourceLineNo">3913</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.3913"></a>
+<span class="sourceLineNo">3914</span>  @Test<a name="line.3914"></a>
+<span class="sourceLineNo">3915</span>  public void testBloomFilterSize() throws IOException {<a name="line.3915"></a>
+<span class="sourceLineNo">3916</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.3916"></a>
+<span class="sourceLineNo">3917</span>    byte[] qf1 = Bytes.toBytes("col");<a name="line.3917"></a>
+<span class="sourceLineNo">3918</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.3918"></a>
+<span class="sourceLineNo">3919</span>    // Create Table<a name="line.3919"></a>
+<span class="sourceLineNo">3920</span>    HColumnDescriptor hcd = new HColumnDescriptor(fam1).setMaxVersions(Integer.MAX_VALUE)<a name="line.3920"></a>
+<span class="sourceLineNo">3921</span>        .setBloomFilterType(BloomType.ROWCOL);<a name="line.3921"></a>
+<span class="sourceLineNo">3922</span><a name="line.3922"></a>
+<span class="sourceLineNo">3923</span>    HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.3923"></a>
+<span class="sourceLineNo">3924</span>    htd.addFamily(hcd);<a name="line.3924"></a>
+<span class="sourceLineNo">3925</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.3925"></a>
+<span class="sourceLineNo">3926</span>    this.region = TEST_UTIL.createLocalHRegion(info, htd);<a name="line.3926"></a>
+<span class="sourceLineNo">3927</span>    int num_unique_rows = 10;<a name="line.3927"></a>
+<span class="sourceLineNo">3928</span>    int duplicate_multiplier = 2;<a name="line.3928"></a>
+<span class="sourceLineNo">3929</span>    int num_storefiles = 4;<a name="line.3929"></a>
+<span class="sourceLineNo">3930</span><a name="line.3930"></a>
+<span class="sourceLineNo">3931</span>    int version = 0;<a name="line.3931"></a>
+<span class="sourceLineNo">3932</span>    for (int f = 0; f &lt; num_storefiles; f++) {<a name="line.3932"></a>
+<span class="sourceLineNo">3933</span>      for (int i = 0; i &lt; duplicate_multiplier; i++) {<a name="line.3933"></a>
+<span class="sourceLineNo">3934</span>        for (int j = 0; j &lt; num_unique_rows; j++) {<a name="line.3934"></a>
+<span class="sourceLineNo">3935</span>          Put put = new Put(Bytes.toBytes("row" + j));<a name="line.3935"></a>
+<span class="sourceLineNo">3936</span>          put.setDurability(Durability.SKIP_WAL);<a name="line.3936"></a>
+<span class="sourceLineNo">3937</span>          long ts = version++;<a name="line.3937"></a>
+<span class="sourceLineNo">3938</span>          put.addColumn(fam1, qf1, ts, val1);<a name="line.3938"></a>
+<span class="sourceLineNo">3939</span>          region.put(put);<a name="line.3939"></a>
+<span class="sourceLineNo">3940</span>        }<a name="line.3940"></a>
+<span class="sourceLineNo">3941</span>      }<a name="line.3941"></a>
+<span class="sourceLineNo">3942</span>      region.flush(true);<a name="line.3942"></a>
 <span class="sourceLineNo">3943</span>    }<a name="line.3943"></a>
-<span class="sourceLineNo">3944</span><a name="line.3944"></a>
-<span class="sourceLineNo">3945</span>    region.compact(true);<a name="line.3945"></a>
-<span class="sourceLineNo">3946</span><a name="line.3946"></a>
-<span class="sourceLineNo">3947</span>    // after compaction<a name="line.3947"></a>
-<span class="sourceLineNo">3948</span>    storeFiles = store.getStorefiles();<a name="line.3948"></a>
-<span class="sourceLineNo">3949</span>    for (HStoreFile storefile : storeFiles) {<a name="line.3949"></a>
-<span class="sourceLineNo">3950</span>      StoreFileReader reader = storefile.getReader();<a name="line.3950"></a>
-<span class="sourceLineNo">3951</span>      reader.loadFileInfo();<a name="line.3951"></a>
-<span class="sourceLineNo">3952</span>      reader.loadBloomfilter();<a name="line.3952"></a>
-<span class="sourceLineNo">3953</span>      assertEquals(num_unique_rows * duplicate_multiplier * num_storefiles, reader.getEntries());<a name="line.3953"></a>
-<span class="sourceLineNo">3954</span>      assertEquals(num_unique_rows, reader.getFilterEntries());<a name="line.3954"></a>
-<span class="sourceLineNo">3955</span>    }<a name="line.3955"></a>
-<span class="sourceLineNo">3956</span>  }<a name="line.3956"></a>
-<span class="sourceLineNo">3957</span><a name="line.3957"></a>
-<span class="sourceLineNo">3958</span>  @Test<a name="line.3958"></a>
-<span class="sourceLineNo">3959</span>  public void testAllColumnsWithBloomFilter() throws IOException {<a name="line.3959"></a>
-<span class="sourceLineNo">3960</span>    byte[] TABLE = Bytes.toBytes(name.getMethodName());<a name="line.3960"></a>
-<span class="sourceLineNo">3961</span>    byte[] FAMILY = Bytes.toBytes("family");<a name="line.3961"></a>
-<span class="sourceLineNo">3962</span><a name="line.3962"></a>
-<span class="sourceLineNo">3963</span>    // Create table<a name="line.3963"></a>
-<span class="sourceLineNo">3964</span>    HColumnDescriptor hcd = new HColumnDescriptor(FAMILY).setMaxVersions(Integer.MAX_VALUE)<a name="line.3964"></a>
-<span class="sourceLineNo">3965</span>        .setBloomFilterType(BloomType.ROWCOL);<a name="line.3965"></a>
-<span class="sourceLineNo">3966</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(TABLE));<a name="line.3966"></a>
-<span class="sourceLineNo">3967</span>    htd.addFamily(hcd);<a name="line.3967"></a>
-<span class="sourceLineNo">3968</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.3968"></a>
-<span class="sourceLineNo">3969</span>    this.region = TEST_UTIL.createLocalHRegion(info, htd);<a name="line.3969"></a>
-<span class="sourceLineNo">3970</span>    // For row:0, col:0: insert versions 1 through 5.<a name="line.3970"></a>
-<span class="sourceLineNo">3971</span>    byte[] row = Bytes.toBytes("row:" + 0);<a name="line.3971"></a>
-<span class="sourceLineNo">3972</span>    byte[] column = Bytes.toBytes("column:" + 0);<a name="line.3972"></a>
-<span class="sourceLineNo">3973</span>    Put put = new Put(row);<a name="line.3973"></a>
-<span class="sourceLineNo">3974</span>    put.setDurability(Durability.SKIP_WAL);<a name="line.3974"></a>
-<span class="sourceLineNo">3975</span>    for (long idx = 1; idx &lt;= 4; idx++) {<a name="line.3975"></a>
-<span class="sourceLineNo">3976</span>      put.addColumn(FAMILY, column, idx, Bytes.toBytes("value-version-" + idx));<a name="line.3976"></a>
-<span class="sourceLineNo">3977</span>    }<a name="line.3977"></a>
-<span class="sourceLineNo">3978</span>    region.put(put);<a name="line.3978"></a>
-<span class="sourceLineNo">3979</span><a name="line.3979"></a>
-<span class="sourceLineNo">3980</span>    // Flush<a name="line.3980"></a>
-<span class="sourceLineNo">3981</span>    region.flush(true);<a name="line.3981"></a>
-<span class="sourceLineNo">3982</span><a name="line.3982"></a>
-<span class="sourceLineNo">3983</span>    // Get rows<a name="line.3983"></a>
-<span class="sourceLineNo">3984</span>    Get get = new Get(row);<a name="line.3984"></a>
-<span class="sourceLineNo">3985</span>    get.readAllVersions();<a name="line.3985"></a>
-<span class="sourceLineNo">3986</span>    Cell[] kvs = region.get(get).rawCells();<a name="line.3986"></a>
-<span class="sourceLineNo">3987</span><a name="line.3987"></a>
-<span class="sourceLineNo">3988</span>    // Check if rows are correct<a name="line.3988"></a>
-<span class="sourceLineNo">3989</span>    assertEquals(4, kvs.length);<a name="line.3989"></a>
-<span class="sourceLineNo">3990</span>    checkOneCell(kvs[0], FAMILY, 0, 0, 4);<a name="line.3990"></a>
-<span class="sourceLineNo">3991</span>    checkOneCell(kvs[1], FAMILY, 0, 0, 3);<a name="line.3991"></a>
-<span class="sourceLineNo">3992</span>    checkOneCell(kvs[2], FAMILY, 0, 0, 2);<a name="line.3992"></a>
-<span class="sourceLineNo">3993</span>    checkOneCell(kvs[3], FAMILY, 0, 0, 1);<a name="line.3993"></a>
-<span class="sourceLineNo">3994</span>  }<a name="line.3994"></a>
-<span class="sourceLineNo">3995</span><a name="line.3995"></a>
-<span class="sourceLineNo">3996</span>  /**<a name="line.3996"></a>
-<span class="sourceLineNo">3997</span>   * Testcase to cover bug-fix for HBASE-2823 Ensures correct delete when<a name="line.3997"></a>
-<span class="sourceLineNo">3998</span>   * issuing delete row on columns with bloom filter set to row+col<a name="line.3998"></a>
-<span class="sourceLineNo">3999</span>   * (BloomType.ROWCOL)<a name="line.3999"></a>
-<span class="sourceLineNo">4000</span>   */<a name="line.4000"></a>
-<span class="sourceLineNo">4001</span>  @Test<a name="line.4001"></a>
-<span class="sourceLineNo">4002</span>  public void testDeleteRowWithBloomFilter() throws IOException {<a name="line.4002"></a>
-<span class="sourceLineNo">4003</span>    byte[] familyName = Bytes.toBytes("familyName");<a name="line.4003"></a>
-<span class="sourceLineNo">4004</span><a name="line.4004"></a>
-<span class="sourceLineNo">4005</span>    // Create Table<a name="line.4005"></a>
-<span class="sourceLineNo">4006</span>    HColumnDescriptor hcd = new HColumnDescriptor(familyName).setMaxVersions(Integer.MAX_VALUE)<a name="line.4006"></a>
-<span class="sourceLineNo">4007</span>        .setBloomFilterType(BloomType.ROWCOL);<a name="line.4007"></a>
-<span class="sourceLineNo">4008</span><a name="line.4008"></a>
-<span class="sourceLineNo">4009</span>    HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.4009"></a>
-<span class="sourceLineNo">4010</span>    htd.addFamily(hcd);<a name="line.4010"></a>
-<span class="sourceLineNo">4011</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.4011"></a>
-<span class="sourceLineNo">4012</span>    this.region = TEST_UTIL.createLocalHRegion(info, htd);<a name="line.4012"></a>
-<span class="sourceLineNo">4013</span>    // Insert some data<a name="line.4013"></a>
-<span class="sourceLineNo">4014</span>    byte[] row = Bytes.toBytes("row1");<a name="line.4014"></a>
-<span class="sourceLineNo">4015</span>    byte[] col = Bytes.toBytes("col1");<a name="line.4015"></a>
-<span class="sourceLineNo">4016</span><a name="line.4016"></a>
-<span class="sourceLineNo">4017</span>    Put put = new Put(row);<a name="line.4017"></a>
-<span class="sourceLineNo">4018</span>    put.addColumn(familyName, col, 1, Bytes.toBytes("SomeRandomValue"));<a name="line.4018"></a>
-<span class="sourceLineNo">4019</span>    region.put(put);<a name="line.4019"></a>
-<span class="sourceLineNo">4020</span>    region.flush(true);<a name="line.4020"></a>
-<span class="sourceLineNo">4021</span><a name="line.4021"></a>
-<span class="sourceLineNo">4022</span>    Delete del = new Delete(row);<a name="line.4022"></a>
-<span class="sourceLineNo">4023</span>    region.delete(del);<a name="line.4023"></a>
-<span class="sourceLineNo">4024</span>    region.flush(true);<a name="line.4024"></a>
-<span class="sourceLineNo">4025</span><a name="line.4025"></a>
-<span class="sourceLineNo">4026</span>    // Get remaining rows (should have none)<a name="line.4026"></a>
-<span class="sourceLineNo">4027</span>    Get get = new Get(row);<a name="line.4027"></a>
-<span class="sourceLineNo">4028</span>    get.addColumn(familyName, col);<a name="line.4028"></a>
-<span class="sourceLineNo">4029</span><a name="line.4029"></a>
-<span class="sourceLineNo">4030</span>    Cell[] keyValues = region.get(get).rawCells();<a name="line.4030"></a>
-<span class="sourceLineNo">4031</span>    assertEquals(0, keyValues.length);<a name="line.4031"></a>
-<span class="sourceLineNo">4032</span>  }<a name="line.4032"></a>
-<span class="sourceLineNo">4033</span><a name="line.4033"></a>
-<span class="sourceLineNo">4034</span>  @Test<a name="line.4034"></a>
-<span class="sourceLineNo">4035</span>  public void testgetHDFSBlocksDistribution() throws Exception {<a name="line.4035"></a>
-<span class="sourceLineNo">4036</span>    HBaseTestingUtility htu = new HBaseTestingUtility();<a name="line.4036"></a>
-<span class="sourceLineNo">4037</span>    // Why do we set the block size in this test?  If we set it smaller than the kvs, then we'll<a name="line.4037"></a>
-<span class="sourceLineNo">4038</span>    // break up the file in to more pieces that can be distributed across the three nodes and we<a name="line.4038"></a>
-<span class="sourceLineNo">4039</span>    // won't be able to have the condition this test asserts; that at least one node has<a name="line.4039"></a>
-<span class="sourceLineNo">4040</span>    // a copy of all replicas -- if small block size, then blocks are spread evenly across the<a name="line.4040"></a>
-<span class="sourceLineNo">4041</span>    // the three nodes.  hfilev3 with tags seems to put us over the block size.  St.Ack.<a name="line.4041"></a>
-<span class="sourceLineNo">4042</span>    // final int DEFAULT_BLOCK_SIZE = 1024;<a name="line.4042"></a>
-<span class="sourceLineNo">4043</span>    // htu.getConfiguration().setLong("dfs.blocksize", DEFAULT_BLOCK_SIZE);<a name="line.4043"></a>
-<span class="sourceLineNo">4044</span>    htu.getConfiguration().setInt("dfs.replication", 2);<a name="line.4044"></a>
-<span class="sourceLineNo">4045</span><a name="line.4045"></a>
-<span class="sourceLineNo">4046</span>    // set up a cluster with 3 nodes<a name="line.4046"></a>
-<span class="sourceLineNo">4047</span>    MiniHBaseCluster cluster = null;<a name="line.4047"></a>
-<span class="sourceLineNo">4048</span>    String dataNodeHosts[] = new String[] { "host1", "host2", "host3" };<a name="line.4048"></a>
-<span class="sourceLineNo">4049</span>    int regionServersCount = 3;<a name="line.4049"></a>
-<span class="sourceLineNo">4050</span><a name="line.4050"></a>
-<span class="sourceLineNo">4051</span>    try {<a name="line.4051"></a>
-<span class="sourceLineNo">4052</span>      StartMiniClusterOption option = StartMiniClusterOption.builder()<a name="line.4052"></a>
-<span class="sourceLineNo">4053</span>          .numRegionServers(regionServersCount).dataNodeHosts(dataNodeHosts).build();<a name="line.4053"></a>
-<span class="sourceLineNo">4054</span>      cluster = htu.startMiniCluster(option);<a name="line.4054"></a>
-<span class="sourceLineNo">4055</span>      byte[][] families = { fam1, fam2 };<a name="line.4055"></a>
-<span class="sourceLineNo">4056</span>      Table ht = htu.createTable(tableName, families);<a name="line.4056"></a>
-<span class="sourceLineNo">4057</span><a name="line.4057"></a>
-<span class="sourceLineNo">4058</span>      // Setting up region<a name="line.4058"></a>
-<span class="sourceLineNo">4059</span>      byte row[] = Bytes.toBytes("row1");<a name="line.4059"></a>
-<span class="sourceLineNo">4060</span>      byte col[] = Bytes.toBytes("col1");<a name="line.4060"></a>
-<span class="sourceLineNo">4061</span><a name="line.4061"></a>
-<span class="sourceLineNo">4062</span>      Put put = new Put(row);<a name="line.4062"></a>
-<span class="sourceLineNo">4063</span>      put.addColumn(fam1, col, 1, Bytes.toBytes("test1"));<a name="line.4063"></a>
-<span class="sourceLineNo">4064</span>      put.addColumn(fam2, col, 1, Bytes.toBytes("test2"));<a name="line.4064"></a>
-<span class="sourceLineNo">4065</span>      ht.put(put);<a name="line.4065"></a>
-<span class="sourceLineNo">4066</span><a name="line.4066"></a>
-<span class="sourceLineNo">4067</span>      HRegion firstRegion = htu.getHBaseCluster().getRegions(tableName).get(0);<a name="line.4067"></a>
-<span class="sourceLineNo">4068</span>      firstRegion.flush(true);<a name="line.4068"></a>
-<span class="sourceLineNo">4069</span>      HDFSBlocksDistribution blocksDistribution1 = firstRegion.getHDFSBlocksDistribution();<a name="line.4069"></a>
-<span class="sourceLineNo">4070</span><a name="line.4070"></a>
-<span class="sourceLineNo">4071</span>      // Given the default replication factor is 2 and we have 2 HFiles,<a name="line.4071"></a>
-<span class="sourceLineNo">4072</span>      // we will have total of 4 replica of blocks on 3 datanodes; thus there<a name="line.4072"></a>
-<span class="sourceLineNo">4073</span>      // must be at least one host that have replica for 2 HFiles. That host's<a name="line.4073"></a>
-<span class="sourceLineNo">4074</span>      // weight will be equal to the unique block weight.<a name="line.4074"></a>
-<span class="sourceLineNo">4075</span>      long uniqueBlocksWeight1 = blocksDistribution1.getUniqueBlocksTotalWeight();<a name="line.4075"></a>
-<span class="sourceLineNo">4076</span>      StringBuilder sb = new StringBuilder();<a name="line.4076"></a>
-<span class="sourceLineNo">4077</span>      for (String host: blocksDistribution1.getTopHosts()) {<a name="line.4077"></a>
-<span class="sourceLineNo">4078</span>        if (sb.length() &gt; 0) sb.append(", ");<a name="line.4078"></a>
-<span class="sourceLineNo">4079</span>        sb.append(host);<a name="line.4079"></a>
-<span class="sourceLineNo">4080</span>        sb.append("=");<a name="line.4080"></a>
-<span class="sourceLineNo">4081</span>        sb.append(blocksDistribution1.getWeight(host));<a name="line.4081"></a>
-<span class="sourceLineNo">4082</span>      }<a name="line.4082"></a>
-<span class="sourceLineNo">4083</span><a name="line.4083"></a>
-<span class="sourceLineNo">4084</span>      String topHost = blocksDistribution1.getTopHosts().get(0);<a name="line.4084"></a>
-<span class="sourceLineNo">4085</span>      long topHostWeight = blocksDistribution1.getWeight(topHost);<a name="line.4085"></a>
-<span class="sourceLineNo">4086</span>      String msg = "uniqueBlocksWeight=" + uniqueBlocksWeight1 + ", topHostWeight=" +<a name="line.4086"></a>
-<span class="sourceLineNo">4087</span>        topHostWeight + ", topHost=" + topHost + "; " + sb.toString();<a name="line.4087"></a>
-<span class="sourceLineNo">4088</span>      LOG.info(msg);<a name="line.4088"></a>
-<span class="sourceLineNo">4089</span>      assertTrue(msg, uniqueBlocksWeight1 == topHostWeight);<a name="line.4089"></a>
-<span class="sourceLineNo">4090</span><a name="line.4090"></a>
-<span class="sourceLineNo">4091</span>      // use the static method to compute the value, it should be the same.<a name="line.4091"></a>
-<span class="sourceLineNo">4092</span>      // static method is used by load balancer or other components<a name="line.4092"></a>
-<span class="sourceLineNo">4093</span>      HDFSBlocksDistribution blocksDistribution2 = HRegion.computeHDFSBlocksDistribution(<a name="line.4093"></a>
-<span class="sourceLineNo">4094</span>          htu.getConfiguration(), firstRegion.getTableDescriptor(), firstRegion.getRegionInfo());<a name="line.4094"></a>
-<span class="sourceLineNo">4095</span>      long uniqueBlocksWeight2 = blocksDistribution2.getUniqueBlocksTotalWeight();<a name="line.4095"></a>
-<span class="sourceLineNo">4096</span><a name="line.4096"></a>
-<span class="sourceLineNo">4097</span>      assertTrue(uniqueBlocksWeight1 == uniqueBlocksWeight2);<a name="line.4097"></a>
-<span class="sourceLineNo">4098</span><a name="line.4098"></a>
-<span class="sourceLineNo">4099</span>      ht.close();<a name="line.4099"></a>
-<span class="sourceLineNo">4100</span>    } finally {<a name="line.4100"></a>
-<span class="sourceLineNo">4101</span>      if (cluster != null) {<a name="line.4101"></a>
-<span class="sourceLineNo">4102</span>        htu.shutdownMiniCluster();<a name="line.4102"></a>
-<span class="sourceLineNo">4103</span>      }<a name="line.4103"></a>
-<span class="sourceLineNo">4104</span>    }<a name="line.4104"></a>
-<span class="sourceLineNo">4105</span>  }<a name="line.4105"></a>
+<span class="sourceLineNo">3944</span>    // before compaction<a name="line.3944"></a>
+<span class="sourceLineNo">3945</span>    HStore store = region.getStore(fam1);<a name="line.3945"></a>
+<span class="sourceLineNo">3946</span>    Collection&lt;HStoreFile&gt; storeFiles = store.getStorefiles();<a name="line.3946"></a>
+<span class="sourceLineNo">3947</span>    for (HStoreFile storefile : storeFiles) {<a name="line.3947"></a>
+<span class="sourceLineNo">3948</span>      StoreFileReader reader = storefile.getReader();<a name="line.3948"></a>
+<span class="sourceLineNo">3949</span>      reader.loadFileInfo();<a name="line.3949"></a>
+<span class="sourceLineNo">3950</span>      reader.loadBloomfilter();<a name="line.3950"></a>
+<span class="sourceLineNo">3951</span>      assertEquals(num_unique_rows * duplicate_multiplier, reader.getEntries());<a name="line.3951"></a>
+<span class="sourceLineNo">3952</span>      assertEquals(num_unique_rows, reader.getFilterEntries());<a name="line.3952"></a>
+<span class="sourceLineNo">3953</span>    }<a name="line.3953"></a>
+<span class="sourceLineNo">3954</span><a name="line.3954"></a>
+<span class="sourceLineNo">3955</span>    region.compact(true);<a name="line.3955"></a>
+<span class="sourceLineNo">3956</span><a name="line.3956"></a>
+<span class="sourceLineNo">3957</span>    // after compaction<a name="line.3957"></a>
+<span class="sourceLineNo">3958</span>    storeFiles = store.getStorefiles();<a name="line.3958"></a>
+<span class="sourceLineNo">3959</span>    for (HStoreFile storefile : storeFiles) {<a name="line.3959"></a>
+<span class="sourceLineNo">3960</span>      StoreFileReader reader = storefile.getReader();<a name="line.3960"></a>
+<span class="sourceLineNo">3961</span>      reader.loadFileInfo();<a name="line.3961"></a>
+<span class="sourceLineNo">3962</span>      reader.loadBloomfilter();<a name="line.3962"></a>
+<span class="sourceLineNo">3963</span>      assertEquals(num_unique_rows * duplicate_multiplier * num_storefiles, reader.getEntries());<a name="line.3963"></a>
+<span class="sourceLineNo">3964</span>      assertEquals(num_unique_rows, reader.getFilterEntries());<a name="line.3964"></a>
+<span class="sourceLineNo">3965</span>    }<a name="line.3965"></a>
+<span class="sourceLineNo">3966</span>  }<a name="line.3966"></a>
+<span class="sourceLineNo">3967</span><a name="line.3967"></a>
+<span class="sourceLineNo">3968</span>  @Test<a name="line.3968"></a>
+<span class="sourceLineNo">3969</span>  public void testAllColumnsWithBloomFilter() throws IOException {<a name="line.3969"></a>
+<span class="sourceLineNo">3970</span>    byte[] TABLE = Bytes.toBytes(name.getMethodName());<a name="line.3970"></a>
+<span class="sourceLineNo">3971</span>    byte[] FAMILY = Bytes.toBytes("family");<a name="line.3971"></a>
+<span class="sourceLineNo">3972</span><a name="line.3972"></a>
+<span class="sourceLineNo">3973</span>    // Create table<a name="line.3973"></a>
+<span class="sourceLineNo">3974</span>    HColumnDescriptor hcd = new HColumnDescriptor(FAMILY).setMaxVersions(Integer.MAX_VALUE)<a name="line.3974"></a>
+<span class="sourceLineNo">3975</span>        .setBloomFilterType(BloomType.ROWCOL);<a name="line.3975"></a>
+<span class="sourceLineNo">3976</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(TABLE));<a name="line.3976"></a>
+<span class="sourceLineNo">3977</span>    htd.addFamily(hcd);<a name="line.3977"></a>
+<span class="sourceLineNo">3978</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.3978"></a>
+<span class="sourceLineNo">3979</span>    this.region = TEST_UTIL.createLocalHRegion(info, htd);<a name="line.3979"></a>
+<span class="sourceLineNo">3980</span>    // For row:0, col:0: insert versions 1 through 5.<a name="line.3980"></a>
+<span class="sourceLineNo">3981</span>    byte[] row = Bytes.toBytes("row:" + 0);<a name="line.3981"></a>
+<span class="sourceLineNo">3982</span>    byte[] column = Bytes.toBytes("column:" + 0);<a name="line.3982"></a>
+<span class="sourceLineNo">3983</span>    Put put = new Put(row);<a name="line.3983"></a>
+<span class="sourceLineNo">3984</span>    put.setDurability(Durability.SKIP_WAL);<a name="line.3984"></a>
+<span class="sourceLineNo">3985</span>    for (long idx = 1; idx &lt;= 4; idx++) {<a name="line.3985"></a>
+<span class="sourceLineNo">3986</span>      put.addColumn(FAMILY, column, idx, Bytes.toBytes("value-version-" + idx));<a name="line.3986"></a>
+<span class="sourceLineNo">3987</span>    }<a name="line.3987"></a>
+<span class="sourceLineNo">3988</span>    region.put(put);<a name="line.3988"></a>
+<span class="sourceLineNo">3989</span><a name="line.3989"></a>
+<span class="sourceLineNo">3990</span>    // Flush<a name="line.3990"></a>
+<span class="sourceLineNo">3991</span>    region.flush(true);<a name="line.3991"></a>
+<span class="sourceLineNo">3992</span><a name="line.3992"></a>
+<span class="sourceLineNo">3993</span>    // Get rows<a name="line.3993"></a>
+<span class="sourceLineNo">3994</span>    Get get = new Get(row);<a name="line.3994"></a>
+<span class="sourceLineNo">3995</span>    get.readAllVersions();<a name="line.3995"></a>
+<span class="sourceLineNo">3996</span>    Cell[] kvs = region.get(get).rawCells();<a name="line.3996"></a>
+<span class="sourceLineNo">3997</span><a name="line.3997"></a>
+<span class="sourceLineNo">3998</span>    // Check if rows are correct<a name="line.3998"></a>
+<span class="sourceLineNo">3999</span>    assertEquals(4, kvs.length);<a name="line.3999"></a>
+<span class="sourceLineNo">4000</span>    checkOneCell(kvs[0], FAMILY, 0, 0, 4);<a name="line.4000"></a>
+<span class="sourceLineNo">4001</span>    checkOneCell(kvs[1], FAMILY, 0, 0, 3);<a name="line.4001"></a>
+<span class="sourceLineNo">4002</span>    checkOneCell(kvs[2], FAMILY, 0, 0, 2);<a name="line.4002"></a>
+<span class="sourceLineNo">4003</span>    checkOneCell(kvs[3], FAMILY, 0, 0, 1);<a name="line.4003"></a>
+<span class="sourceLineNo">4004</span>  }<a name="line.4004"></a>
+<span class="sourceLineNo">4005</span><a name="line.4005"></a>
+<span class="sourceLineNo">4006</span>  /**<a name="line.4006"></a>
+<span class="sourceLineNo">4007</span>   * Testcase to cover bug-fix for HBASE-2823 Ensures correct delete when<a name="line.4007"></a>
+<span class="sourceLineNo">4008</span>   * issuing delete row on columns with bloom filter set to row+col<a name="line.4008"></a>
+<span class="sourceLineNo">4009</span>   * (BloomType.ROWCOL)<a name="line.4009"></a>
+<span class="sourceLineNo">4010</span>   */<a name="line.4010"></a>
+<span class="sourceLineNo">4011</span>  @Test<a name="line.4011"></a>
+<span class="sourceLineNo">4012</span>  public void testDeleteRowWithBloomFilter() throws IOException {<a name="line.4012"></a>
+<span class="sourceLineNo">4013</span>    byte[] familyName = Bytes.toBytes("familyName");<a name="line.4013"></a>
+<span class="sourceLineNo">4014</span><a name="line.4014"></a>
+<span class="sourceLineNo">4015</span>    // Create Table<a name="line.4015"></a>
+<span class="sourceLineNo">4016</span>    HColumnDescriptor hcd = new HColumnDescriptor(familyName).setMaxVersions(Integer.MAX_VALUE)<a name="line.4016"></a>
+<span class="sourceLineNo">4017</span>        .setBloomFilterType(BloomType.ROWCOL);<a name="line.4017"></a>
+<span class="sourceLineNo">4018</span><a name="line.4018"></a>
+<span class="sourceLineNo">4019</span>    HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.4019"></a>
+<span class="sourceLineNo">4020</span>    htd.addFamily(hcd);<a name="line.4020"></a>
+<span class="sourceLineNo">4021</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.4021"></a>
+<span class="sourceLineNo">4022</span>    this.region = TEST_UTIL.createLocalHRegion(info, htd);<a name="line.4022"></a>
+<span class="sourceLineNo">4023</span>    // Insert some data<a name="line.4023"></a>
+<span class="sourceLineNo">4024</span>    byte[] row = Bytes.toBytes("row1");<a name="line.4024"></a>
+<span class="sourceLineNo">4025</span>    byte[] col = Bytes.toBytes("col1");<a name="line.4025"></a>
+<span class="sourceLineNo">4026</span><a name="line.4026"></a>
+<span class="sourceLineNo">4027</span>    Put put = new Put(row);<a name="line.4027"></a>
+<span class="sourceLineNo">4028</span>    put.addColumn(familyName, col, 1, Bytes.toBytes("SomeRandomValue"));<a name="line.4028"></a>
+<span class="sourceLineNo">4029</span>    region.put(put);<a name="line.4029"></a>
+<span class="sourceLineNo">4030</span>    region.flush(true);<a name="line.4030"></a>
+<span class="sourceLineNo">4031</span><a name="line.4031"></a>
+<span class="sourceLineNo">4032</span>    Delete del = new Delete(row);<a name="line.4032"></a>
+<span class="sourceLineNo">4033</span>    region.delete(del);<a name="line.4033"></a>
+<span class="sourceLineNo">4034</span>    region.flush(true);<a name="line.4034"></a>
+<span class="sourceLineNo">4035</span><a name="line.4035"></a>
+<span class="sourceLineNo">4036</span>    // Get remaining rows (should have none)<a name="line.4036"></a>
+<span class="sourceLineNo">4037</span>    Get get = new Get(row);<a name="line.4037"></a>
+<span class="sourceLineNo">4038</span>    get.addColumn(familyName, col);<a name="line.4038"></a>
+<span class="sourceLineNo">4039</span><a name="line.4039"></a>
+<span class="sourceLineNo">4040</span>    Cell[] keyValues = region.get(get).rawCells();<a name="line.4040"></a>
+<span class="sourceLineNo">4041</span>    assertEquals(0, keyValues.length);<a name="line.4041"></a>
+<span class="sourceLineNo">4042</span>  }<a name="line.4042"></a>
+<span class="sourceLineNo">4043</span><a name="line.4043"></a>
+<span class="sourceLineNo">4044</span>  @Test<a name="line.4044"></a>
+<span class="sourceLineNo">4045</span>  public void testgetHDFSBlocksDistribution() throws Exception {<a name="line.4045"></a>
+<span class="sourceLineNo">4046</span>    HBaseTestingUtility htu = new HBaseTestingUtility();<a name="line.4046"></a>
+<span class="sourceLineNo">4047</span>    // Why do we set the block size in this test?  If we set it smaller than the kvs, then we'll<a name="line.4047"></a>
+<span class="sourceLineNo">4048</span>    // break up the file in to more pieces that can be distributed across the three nodes and we<a name="line.4048"></a>
+<span class="sourceLineNo">4049</span>    // won't be able to have the condition this test asserts; that at least one node has<a name="line.4049"></a>
+<span class="sourceLineNo">4050</span>    // a copy of all replicas -- if small block size, then blocks are spread evenly across the<a name="line.4050"></a>
+<span class="sourceLineNo">4051</span>    // the three nodes.  hfilev3 with tags seems to put us over the block size.  St.Ack.<a name="line.4051"></a>
+<span class="sourceLineNo">4052</span>    // final int DEFAULT_BLOCK_SIZE = 1024;<a name="line.4052"></a>
+<span class="sourceLineNo">4053</span>    // htu.getConfiguration().setLong("dfs.blocksize", DEFAULT_BLOCK_SIZE);<a name="line.4053"></a>
+<span class="sourceLineNo">4054</span>    htu.getConfiguration().setInt("dfs.replication", 2);<a name="line.4054"></a>
+<span class="sourceLineNo">4055</span><a name="line.4055"></a>
+<span class="sourceLineNo">4056</span>    // set up a cluster with 3 nodes<a name="line.4056"></a>
+<span class="sourceLineNo">4057</span>    MiniHBaseCluster cluster = null;<a name="line.4057"></a>
+<span class="sourceLineNo">4058</span>    String dataNodeHosts[] = new String[] { "host1", "host2", "host3" };<a name="line.4058"></a>
+<span class="sourceLineNo">4059</span>    int regionServersCount = 3;<a name="line.4059"></a>
+<span class="sourceLineNo">4060</span><a name="line.4060"></a>
+<span class="sourceLineNo">4061</span>    try {<a name="line.4061"></a>
+<span class="sourceLineNo">4062</span>      StartMiniClusterOption option = StartMiniClusterOption.builder()<a name="line.4062"></a>
+<span class="sourceLineNo">4063</span>          .numRegionServers(regionServersCount).dataNodeHosts(dataNodeHosts).build();<a name="line.4063"></a>
+<span class="sourceLineNo">4064</span>      cluster = htu.startMiniCluster(option);<a name="line.4064"></a>
+<span class="sourceLineNo">4065</span>      byte[][] families = { fam1, fam2 };<a name="line.4065"></a>
+<span class="sourceLineNo">4066</span>      Table ht = htu.createTable(tableName, families);<a name="line.4066"></a>
+<span class="sourceLineNo">4067</span><a name="line.4067"></a>
+<span class="sourceLineNo">4068</span>      // Setting up region<a name="line.4068"></a>
+<span class="sourceLineNo">4069</span>      byte row[] = Bytes.toBytes("row1");<a name="line.4069"></a>
+<span class="sourceLineNo">4070</span>      byte col[] = Bytes.toBytes("col1");<a name="line.4070"></a>
+<span class="sourceLineNo">4071</span><a name="line.4071"></a>
+<span class="sourceLineNo">4072</span>      Put put = new Put(row);<a name="line.4072"></a>
+<span class="sourceLineNo">4073</span>      put.addColumn(fam1, col, 1, Bytes.toBytes("test1"));<a name="line.4073"></a>
+<span class="sourceLineNo">4074</span>      put.addColumn(fam2, col, 1, Bytes.toBytes("test2"));<a name="line.4074"></a>
+<span class="sourceLineNo">4075</span>      ht.put(put);<a name="line.4075"></a>
+<span class="sourceLineNo">4076</span><a name="line.4076"></a>
+<span class="sourceLineNo">4077</span>      HRegion firstRegion = htu.getHBaseCluster().getRegions(tableName).get(0);<a name="line.4077"></a>
+<span class="sourceLineNo">4078</span>      firstRegion.flush(true);<a name="line.4078"></a>
+<span class="sourceLineNo">4079</span>      HDFSBlocksDistribution blocksDistribution1 = firstRegion.getHDFSBlocksDistribution();<a name="line.4079"></a>
+<span class="sourceLineNo">4080</span><a name="line.4080"></a>
+<span class="sourceLineNo">4081</span>      // Given the default replication factor is 2 and we have 2 HFiles,<a name="line.4081"></a>
+<span class="sourceLineNo">4082</span>      // we will have total of 4 replica of blocks on 3 datanodes; thus there<a name="line.4082"></a>
+<span class="sourceLineNo">4083</span>      // must be at least one host that have replica for 2 HFiles. That host's<a name="line.4083"></a>
+<span class="sourceLineNo">4084</span>      // weight will be equal to the unique block weight.<a name="line.4084"></a>
+<span class="sourceLineNo">4085</span>      long uniqueBlocksWeight1 = blocksDistribution1.getUniqueBlocksTotalWeight();<a name="line.4085"></a>
+<span class="sourceLineNo">4086</span>      StringBuilder sb = new StringBuilder();<a name="line.4086"></a>
+<span class="sourceLineNo">4087</span>      for (String host: blocksDistribution1.getTopHosts()) {<a name="line.4087"></a>
+<span class="sourceLineNo">4088</span>        if (sb.length() &gt; 0) sb.append(", ");<a name="line.4088"></a>
+<span class="sourceLineNo">4089</span>        sb.append(host);<a name="line.4089"></a>
+<span class="sourceLineNo">4090</span>        sb.append("=");<a name="line.4090"></a>
+<span class="sourceLineNo">4091</span>        sb.append(blocksDistribution1.getWeight(host));<a name="line.4091"></a>
+<span class="sourceLineNo">4092</span>      }<a name="line.4092"></a>
+<span class="sourceLineNo">4093</span><a name="line.4093"></a>
+<span class="sourceLineNo">4094</span>      String topHost = blocksDistribution1.getTopHosts().get(0);<a name="line.4094"></a>
+<span class="sourceLineNo">4095</span>      long topHostWeight = blocksDistribution1.getWeight(topHost);<a name="line.4095"></a>
+<span class="sourceLineNo">4096</span>      String msg = "uniqueBlocksWeight=" + uniqueBlocksWeight1 + ", topHostWeight=" +<a name="line.4096"></a>
+<span class="sourceLineNo">4097</span>        topHostWeight + ", topHost=" + topHost + "; " + sb.toString();<a name="line.4097"></a>
+<span class="sourceLineNo">4098</span>      LOG.info(msg);<a name="line.4098"></a>
+<span class="sourceLineNo">4099</span>      assertTrue(msg, uniqueBlocksWeight1 == topHostWeight);<a name="line.4099"></a>
+<span class="sourceLineNo">4100</span><a name="line.4100"></a>
+<span class="sourceLineNo">4101</span>      // use the static method to compute the value, it should be the same.<a name="line.4101"></a>
+<span class="sourceLineNo">4102</span>      // static method is used by load balancer or other components<a name="line.4102"></a>
+<span class="sourceLineNo">4103</span>      HDFSBlocksDistribution blocksDistribution2 = HRegion.computeHDFSBlocksDistribution(<a name="line.4103"></a>
+<span class="sourceLineNo">4104</span>          htu.getConfiguration(), firstRegion.getTableDescriptor(), firstRegion.getRegionInfo());<a name="line.4104"></a>
+<span class="sourceLineNo">4105</span>      long uniqueBlocksWeight2 = blocksDistribution2.getUniqueBlocksTotalWeight();<a name="line.4105"></a>
 <span class="sourceLineNo">4106</span><a name="line.4106"></a>
-<span class="sourceLineNo">4107</span>  /**<a name="line.4107"></a>
-<span class="sourceLineNo">4108</span>   * Testcase to check state of region initialization task set to ABORTED or not<a name="line.4108"></a>
-<span class="sourceLineNo">4109</span>   * if any exceptions during initialization<a name="line.4109"></a>
-<span class="sourceLineNo">4110</span>   *<a name="line.4110"></a>
-<span class="sourceLineNo">4111</span>   * @throws Exception<a name="line.4111"></a>
-<span class="sourceLineNo">4112</span>   */<a name="line.4112"></a>
-<span class="sourceLineNo">4113</span>  @Test<a name="line.4113"></a>
-<span class="sourceLineNo">4114</span>  public void testStatusSettingToAbortIfAnyExceptionDuringRegionInitilization() throws Exception {<a name="line.4114"></a>
-<span class="sourceLineNo">4115</span>    HRegionInfo info;<a name="line.4115"></a>
-<span class="sourceLineNo">4116</span>    try {<a name="line.4116"></a>
-<span class="sourceLineNo">4117</span>      FileSystem fs = Mockito.mock(FileSystem.class);<a name="line.4117"></a>
-<span class="sourceLineNo">4118</span>      Mockito.when(fs.exists((Path) Mockito.anyObject())).thenThrow(new IOException());<a name="line.4118"></a>
-<span class="sourceLineNo">4119</span>      HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.4119"></a>
-<span class="sourceLineNo">4120</span>      htd.addFamily(new HColumnDescriptor("cf"));<a name="line.4120"></a>
-<span class="sourceLineNo">4121</span>      info = new HRegionInfo(htd.getTableName(), HConstants.EMPTY_BYTE_ARRAY,<a name="line.4121"></a>
-<span class="sourceLineNo">4122</span>          HConstants.EMPTY_BYTE_ARRAY, false);<a name="line.4122"></a>
-<span class="sourceLineNo">4123</span>      Path path = new Path(dir + "testStatusSettingToAbortIfAnyExceptionDuringRegionInitilization");<a name="line.4123"></a>
-<span class="sourceLineNo">4124</span>      region = HRegion.newHRegion(path, null, fs, CONF, info, htd, null);<a name="line.4124"></a>
-<span class="sourceLineNo">4125</span>      // region initialization throws IOException and set task state to ABORTED.<a name="line.4125"></a>
-<span class="sourceLineNo">4126</span>      region.initialize();<a name="line.4126"></a>
-<span class="sourceLineNo">4127</span>      fail("Region initialization should fail due to IOException");<a name="line.4127"></a>
-<span class="sourceLineNo">4128</span>    } catch (IOException io) {<a name="line.4128"></a>
-<span class="sourceLineNo">4129</span>      List&lt;MonitoredTask&gt; tasks = TaskMonitor.get().getTasks();<a name="line.4129"></a>
-<span class="sourceLineNo">4130</span>      for (MonitoredTask monitoredTask : tasks) {<a name="line.4130"></a>
-<span class="sourceLineNo">4131</span>        if (!(monitoredTask instanceof MonitoredRPCHandler)<a name="line.4131"></a>
-<span class="sourceLineNo">4132</span>            &amp;&amp; monitoredTask.getDescription().contains(region.toString())) {<a name="line.4132"></a>
-<span class="sourceLineNo">4133</span>          assertTrue("Region state should be ABORTED.",<a name="line.4133"></a>
-<span class="sourceLineNo">4134</span>              monitoredTask.getState().equals(MonitoredTask.State.ABORTED));<a name="line.4134"></a>
-<span class="sourceLineNo">4135</span>          break;<a name="line.4135"></a>
-<span class="sourceLineNo">4136</span>        }<a name="line.4136"></a>
-<span class="sourceLineNo">4137</span>      }<a name="line.4137"></a>
-<span class="sourceLineNo">4138</span>    }<a name="line.4138"></a>
-<span class="sourceLineNo">4139</span>  }<a name="line.4139"></a>
-<span class="sourceLineNo">4140</span><a name="line.4140"></a>
-<span class="sourceLineNo">4141</span>  /**<a name="line.4141"></a>
-<span class="sourceLineNo">4142</span>   * Verifies that the .regioninfo file is written on region creation and that<a name="line.4142"></a>
-<span class="sourceLineNo">4143</span>   * is recreated if missing during region opening.<a name="line.4143"></a>
-<span class="sourceLineNo">4144</span>   */<a name="line.4144"></a>
-<span class="sourceLineNo">4145</span>  @Test<a name="line.4145"></a>
-<span class="sourceLineNo">4146</span>  public void testRegionInfoFileCreation() throws IOException {<a name="line.4146"></a>
-<span class="sourceLineNo">4147</span>    Path rootDir = new Path(dir + "testRegionInfoFileCreation");<a name="line.4147"></a>
-<span class="sourceLineNo">4148</span><a name="line.4148"></a>
-<span class="sourceLineNo">4149</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.4149"></a>
-<span class="sourceLineNo">4150</span>    htd.addFamily(new HColumnDescriptor("cf"));<a name="line.4150"></a>
-<span class="sourceLineNo">4151</span><a name="line.4151"></a>
-<span class="sourceLineNo">4152</span>    HRegionInfo hri = new HRegionInfo(htd.getTableName());<a name="line.4152"></a>
-<span class="sourceLineNo">4153</span><a name="line.4153"></a>
-<span class="sourceLineNo">4154</span>    // Create a region and skip the initialization (like CreateTableHandler)<a name="line.4154"></a>
-<span class="sourceLineNo">4155</span>    region = HBaseTestingUtility.createRegionAndWAL(hri, rootDir, CONF, htd, false);<a name="line.4155"></a>
-<span class="sourceLineNo">4156</span>    Path regionDir = region.getRegionFileSystem().getRegionDir();<a name="line.4156"></a>
-<span class="sourceLineNo">4157</span>    FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.4157"></a>
-<span class="sourceLineNo">4158</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.4158"></a>
-<span class="sourceLineNo">4159</span><a name="line.4159"></a>
-<span class="sourceLineNo">4160</span>    Path regionInfoFile = new Path(regionDir, HRegionFileSystem.REGION_INFO_FILE);<a name="line.4160"></a>
+<span class="sourceLineNo">4107</span>      assertTrue(uniqueBlocksWeight1 == uniqueBlocksWeight2);<a name="line.4107"></a>
+<span class="sourceLineNo">4108</span><a name="line.4108"></a>
+<span class="sourceLineNo">4109</span>      ht.close();<a name="line.4109"></a>
+<span class="sourceLineNo">4110</span>    } finally {<a name="line.4110"></a>
+<span class="sourceLineNo">4111</span>      if (cluster != null) {<a name="line.4111"></a>
+<span class="sourceLineNo">4112</span>        htu.shutdownMiniCluster();<a name="line.4112"></a>
+<span class="sourceLineNo">4113</span>      }<a name="line.4113"></a>
+<span class="sourceLineNo">4114</span>    }<a name="line.4114"></a>
+<span class="sourceLineNo">4115</span>  }<a name="line.4115"></a>
+<span class="sourceLineNo">4116</span><a name="line.4116"></a>
+<span class="sourceLineNo">4117</span>  /**<a name="line.4117"></a>
+<span class="sourceLineNo">4118</span>   * Testcase to check state of region initialization task set to ABORTED or not<a name="line.4118"></a>
+<span class="sourceLineNo">4119</span>   * if any exceptions during initialization<a name="line.4119"></a>
+<span class="sourceLineNo">4120</span>   *<a name="line.4120"></a>
+<span class="sourceLineNo">4121</span>   * @throws Exception<a name="line.4121"></a>
+<span class="sourceLineNo">4122</span>   */<a name="line.4122"></a>
+<span class="sourceLineNo">4123</span>  @Test<a name="line.4123"></a>
+<span class="sourceLineNo">4124</span>  public void testStatusSettingToAbortIfAnyExceptionDuringRegionInitilization() throws Exception {<a name="line.4124"></a>
+<span class="sourceLineNo">4125</span>    HRegionInfo info;<a name="line.4125"></a>
+<span class="sourceLineNo">4126</span>    try {<a name="line.4126"></a>
+<span class="sourceLineNo">4127</span>      FileSystem fs = Mockito.mock(FileSystem.class);<a name="line.4127"></a>
+<span class="sourceLineNo">4128</span>      Mockito.when(fs.exists((Path) Mockito.anyObject())).thenThrow(new IOException());<a name="line.4128"></a>
+<span class="sourceLineNo">4129</span>      HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.4129"></a>
+<span class="sourceLineNo">4130</span>      htd.addFamily(new HColumnDescriptor("cf"));<a name="line.4130"></a>
+<span class="sourceLineNo">4131</span>      info = new HRegionInfo(htd.getTableName(), HConstants.EMPTY_BYTE_ARRAY,<a name="line.4131"></a>
+<span class="sourceLineNo">4132</span>          HConstants.EMPTY_BYTE_ARRAY, false);<a name="line.4132"></a>
+<span class="sourceLineNo">4133</span>      Path path = new Path(dir + "testStatusSettingToAbortIfAnyExceptionDuringRegionInitilization");<a name="line.4133"></a>
+<span class="sourceLineNo">4134</span>      region = HRegion.newHRegion(path, null, fs, CONF, info, htd, null);<a name="line.4134"></a>
+<span class="sourceLineNo">4135</span>      // region initialization throws IOException and set task state to ABORTED.<a name="line.4135"></a>
+<span class="sourceLineNo">4136</span>      region.initialize();<a name="line.4136"></a>
+<span class="sourceLineNo">4137</span>      fail("Region initialization should fail due to IOException");<a name="line.4137"></a>
+<span class="sourceLineNo">4138</span>    } catch (IOException io) {<a name="line.4138"></a>
+<span class="sourceLineNo">4139</span>      List&lt;MonitoredTask&gt; tasks = TaskMonitor.get().getTasks();<a name="line.4139"></a>
+<span class="sourceLineNo">4140</span>      for (MonitoredTask monitoredTask : tasks) {<a name="line.4140"></a>
+<span class="sourceLineNo">4141</span>        if (!(monitoredTask instanceof MonitoredRPCHandler)<a name="line.4141"></a>
+<span class="sourceLineNo">4142</span>            &amp;&amp; monitoredTask.getDescription().contains(region.toString())) {<a name="line.4142"></a>
+<span class="sourceLineNo">4143</span>          assertTrue("Region state should be ABORTED.",<a name="line.4143"></a>
+<span class="sourceLineNo">4144</span>              monitoredTask.getState().equals(MonitoredTask.State.ABORTED));<a name="line.4144"></a>
+<span class="sourceLineNo">4145</span>          break;<a name="line.4145"></a>
+<span class="sourceLineNo">4146</span>        }<a name="line.4146"></a>
+<span class="sourceLineNo">4147</span>      }<a name="line.4147"></a>
+<span class="sourceLineNo">4148</span>    }<a name="line.4148"></a>
+<span class="sourceLineNo">4149</span>  }<a name="line.4149"></a>
+<span class="sourceLineNo">4150</span><a name="line.4150"></a>
+<span class="sourceLineNo">4151</span>  /**<a name="line.4151"></a>
+<span class="sourceLineNo">4152</span>   * Verifies that the .regioninfo file is written on region creation and that<a name="line.4152"></a>
+<span class="sourceLineNo">4153</span>   * is recreated if missing during region opening.<a name="line.4153"></a>
+<span class="sourceLineNo">4154</span>   */<a name="line.4154"></a>
+<span class="sourceLineNo">4155</span>  @Test<a name="line.4155"></a>
+<span class="sourceLineNo">4156</span>  public void testRegionInfoFileCreation() throws IOException {<a name="line.4156"></a>
+<span class="sourceLineNo">4157</span>    Path rootDir = new Path(dir + "testRegionInfoFileCreation");<a name="line.4157"></a>
+<span class="sourceLineNo">4158</span><a name="line.4158"></a>
+<span class="sourceLineNo">4159</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.4159"></a>
+<span class="sourceLineNo">4160</span>    htd.addFamily(new HColumnDescriptor("cf"));<a name="line.4160"></a>
 <span class="sourceLineNo">4161</span><a name="line.4161"></a>
-<span class="sourceLineNo">4162</span>    // Verify that the .regioninfo file is present<a name="line.4162"></a>
-<span class="sourceLineNo">4163</span>    assertTrue(HRegionFileSystem.REGION_INFO_FILE + " should be present in the region dir",<a name="line.4163"></a>
-<span class="sourceLineNo">4164</span>        fs.exists(regionInfoFile));<a name="line.4164"></a>
-<span class="sourceLineNo">4165</span><a name="line.4165"></a>
-<span class="sourceLineNo">4166</span>    // Try to open the region<a name="line.4166"></a>
-<span class="sourceLineNo">4167</span>    region = HRegion.openHRegion(rootDir, hri, htd, null, CONF);<a name="line.4167"></a>
-<span class="sourceLineNo">4168</span>    assertEquals(regionDir, region.getRegionFileSystem().getRegionDir());<a name="line.4168"></a>
-<span class="sourceLineNo">4169</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.4169"></a>
-<span class="sourceLineNo">4170</span><a name="line.4170"></a>
-<span class="sourceLineNo">4171</span>    // Verify that the .regioninfo file is still there<a name="line.4171"></a>
-<span class="sourceLineNo">4172</span>    assertTrue(HRegionFileSystem.REGION_INFO_FILE + " should be present in the region dir",<a name="line.4172"></a>
-<span class="sourceLineNo">4173</span>        fs.exists(regionInfoFile));<a name="line.4173"></a>
-<span class="sourceLineNo">4174</span><a name="line.4174"></a>
-<span class="sourceLineNo">4175</span>    // Remove the .regioninfo file and verify is recreated on region open<a name="line.4175"></a>
-<span class="sourceLineNo">4176</span>    fs.delete(regionInfoFile, true);<a name="line.4176"></a>
-<span class="sourceLineNo">4177</span>    assertFalse(HRegionFileSystem.REGION_INFO_FILE + " should be removed from the region dir",<a name="line.4177"></a>
-<span class="sourceLineNo">4178</span>        fs.exists(regionInfoFile));<a name="line.4178"></a>
-<span class="sourceLineNo">4179</span><a name="line.4179"></a>
-<span class="sourceLineNo">4180</span>    region = HRegion.openHRegion(rootDir, hri, htd, null, CONF);<a name="line.4180"></a>
-<span class="sourceLineNo">4181</span>//    region = TEST_UTIL.openHRegion(hri, htd);<a name="line.4181"></a>
-<span class="sourceLineNo">4182</span>    assertEquals(regionDir, region.getRegionFileSystem().getRegionDir());<a name="line.4182"></a>
-<span class="sourceLineNo">4183</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.4183"></a>
+<span class="sourceLineNo">4162</span>    HRegionInfo hri = new HRegionInfo(htd.getTableName());<a name="line.4162"></a>
+<span class="sourceLineNo">4163</span><a name="line.4163"></a>
+<span class="sourceLineNo">4164</span>    // Create a region and skip the initialization (like CreateTableHandler)<a name="line.4164"></a>
+<span class="sourceLineNo">4165</span>    region = HBaseTestingUtility.createRegionAndWAL(hri, rootDir, CONF, htd, false);<a name="line.4165"></a>
+<span class="sourceLineNo">4166</span>    Path regionDir = region.getRegionFileSystem().getRegionDir();<a name="line.4166"></a>
+<span class="sourceLineNo">4167</span>    FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.4167"></a>
+<span class="sourceLineNo">4168</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.4168"></a>
+<span class="sourceLineNo">4169</span><a name="line.4169"></a>
+<span class="sourceLineNo">4170</span>    Path regionInfoFile = new Path(regionDir, HRegionFileSystem.REGION_INFO_FILE);<a name="line.4170"></a>
+<span class="sourceLineNo">4171</span><a name="line.4171"></a>
+<span class="sourceLineNo">4172</span>    // Verify that the .regioninfo file is present<a name="line.4172"></a>
+<span class="sourceLineNo">4173</span>    assertTrue(HRegionFileSystem.REGION_INFO_FILE + " should be present in the region dir",<a name="line.4173"></a>
+<span class="sourceLineNo">4174</span>        fs.exists(regionInfoFile));<a name="line.4174"></a>
+<span class="sourceLineNo">4175</span><a name="line.4175"></a>
+<span class="sourceLineNo">4176</span>    // Try to open the region<a name="line.4176"></a>
+<span class="sourceLineNo">4177</span>    region = HRegion.openHRegion(rootDir, hri, htd, null, CONF);<a name="line.4177"></a>
+<span class="sourceLineNo">4178</span>    assertEquals(regionDir, region.getRegionFileSystem().getRegionDir());<a name="line.4178"></a>
+<span class="sourceLineNo">4179</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.4179"></a>
+<span class="sourceLineNo">4180</span><a name="line.4180"></a>
+<span class="sourceLineNo">4181</span>    // Verify that the .regioninfo file is still there<a name="line.4181"></a>
+<span class="sourceLineNo">4182</span>    assertTrue(HRegionFileSystem.REGION_INFO_FILE + " should be present in the region dir",<a name="line.4182"></a>
+<span class="sourceLineNo">4183</span>        fs.exists(regionInfoFile));<a name="line.4183"></a>
 <span class="sourceLineNo">4184</span><a name="line.4184"></a>
-<span class="sourceLineNo">4185</span>    // Verify that the .regioninfo file is still there<a name="line.4185"></a>
-<span class="sourceLineNo">4186</span>    assertTrue(HRegionFileSystem.REGION_INFO_FILE + " should be present in the region dir",<a name="line.4186"></a>
-<span class="sourceLineNo">4187</span>        fs.exists(new Path(regionDir, HRegionFileSystem.REGION_INFO_FILE)));<a name="line.4187"></a>
-<span class="sourceLineNo">4188</span><a name="line.4188"></a>
-<span class="sourceLineNo">4189</span>    region = null;<a name="line.4189"></a>
-<span class="sourceLineNo">4190</span>  }<a name="line.4190"></a>
-<span class="sourceLineNo">4191</span><a name="line.4191"></a>
-<span class="sourceLineNo">4192</span>  /**<a name="line.4192"></a>
-<span class="sourceLineNo">4193</span>   * TestCase for increment<a name="line.4193"></a>
-<span class="sourceLineNo">4194</span>   */<a name="line.4194"></a>
-<span class="sourceLineNo">4195</span>  private static class Incrementer implements Runnable {<a name="line.4195"></a>
-<span class="sourceLineNo">4196</span>    private HRegion region;<a name="line.4196"></a>
-<span class="sourceLineNo">4197</span>    private final static byte[] incRow = Bytes.toBytes("incRow");<a name="line.4197"></a>
-<span class="sourceLineNo">4198</span>    private final static byte[] family = Bytes.toBytes("family");<a name="line.4198"></a>
-<span class="sourceLineNo">4199</span>    private final static byte[] qualifier = Bytes.toBytes("qualifier");<a name="line.4199"></a>
-<span class="sourceLineNo">4200</span>    private final static long ONE = 1L;<a name="line.4200"></a>
-<span class="sourceLineNo">4201</span>    private int incCounter;<a name="line.4201"></a>
-<span class="sourceLineNo">4202</span><a name="line.4202"></a>
-<span class="sourceLineNo">4203</span>    public Incrementer(HRegion region, int incCounter) {<a name="line.4203"></a>
-<span class="sourceLineNo">4204</span>      this.region = region;<a name="line.4204"></a>
-<span class="sourceLineNo">4205</span>      this.incCounter = incCounter;<a name="line.4205"></a>
-<span class="sourceLineNo">4206</span>    }<a name="line.4206"></a>
-<span class="sourceLineNo">4207</span><a name="line.4207"></a>
-<span class="sourceLineNo">4208</span>    @Override<a name="line.4208"></a>
-<span class="sourceLineNo">4209</span>    public void run() {<a name="line.4209"></a>
-<span class="sourceLineNo">4210</span>      int count = 0;<a name="line.4210"></a>
-<span class="sourceLineNo">4211</span>      while (count &lt; incCounter) {<a name="line.4211"></a>
-<span class="sourceLineNo">4212</span>        Increment inc = new Increment(incRow);<a name="line.4212"></a>
-<span class="sourceLineNo">4213</span>        inc.addColumn(family, qualifier, ONE);<a name="line.4213"></a>
-<span class="sourceLineNo">4214</span>        count++;<a name="line.4214"></a>
-<span class="sourceLineNo">4215</span>        try {<a name="line.4215"></a>
-<span class="sourceLineNo">4216</span>          region.increment(inc);<a name="line.4216"></a>
-<span class="sourceLineNo">4217</span>        } catch (IOException e) {<a name="line.4217"></a>
-<span class="sourceLineNo">4218</span>          LOG.info("Count=" + count + ", " + e);<a name="line.4218"></a>
-<span class="sourceLineNo">4219</span>          break;<a name="line.4219"></a>
-<span class="sourceLineNo">4220</span>        }<a name="line.4220"></a>
-<span class="sourceLineNo">4221</span>      }<a name="line.4221"></a>
-<span class="sourceLineNo">4222</span>    }<a name="line.4222"></a>
-<span class="sourceLineNo">4223</span>  }<a name="line.4223"></a>
-<span class="sourceLineNo">4224</span><a name="line.4224"></a>
-<span class="sourceLineNo">4225</span>  /**<a name="line.4225"></a>
-<span class="sourceLineNo">4226</span>   * Test case to check increment function with memstore flushing<a name="line.4226"></a>
-<span class="sourceLineNo">4227</span>   * @throws Exception<a name="line.4227"></a>
-<span class="sourceLineNo">4228</span>   */<a name="line.4228"></a>
-<span class="sourceLineNo">4229</span>  @Test<a name="line.4229"></a>
-<span class="sourceLineNo">4230</span>  public void testParallelIncrementWithMemStoreFlush() throws Exception {<a name="line.4230"></a>
-<span class="sourceLineNo">4231</span>    byte[] family = Incrementer.family;<a name="line.4231"></a>
-<span class="sourceLineNo">4232</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.4232"></a>
-<span class="sourceLineNo">4233</span>    final HRegion region = this.region;<a name="line.4233"></a>
-<span class="sourceLineNo">4234</span>    final AtomicBoolean incrementDone = new AtomicBoolean(false);<a name="line.4234"></a>
-<span class="sourceLineNo">4235</span>    Runnable flusher = new Runnable() {<a name="line.4235"></a>
-<span class="sourceLineNo">4236</span>      @Override<a name="line.4236"></a>
-<span class="sourceLineNo">4237</span>      public void run() {<a name="line.4237"></a>
-<span class="sourceLineNo">4238</span>        while (!incrementDone.get()) {<a name="line.4238"></a>
-<span class="sourceLineNo">4239</span>          try {<a name="line.4239"></a>
-<span class="sourceLineNo">4240</span>            region.flush(true);<a name="line.4240"></a>
-<span class="sourceLineNo">4241</span>          } catch (Exception e) {<a name="line.4241"></a>
-<span class="sourceLineNo">4242</span>            e.printStackTrace();<a name="line.4242"></a>
-<span class="sourceLineNo">4243</span>          }<a name="line.4243"></a>
-<span class="sourceLineNo">4244</span>        }<a name="line.4244"></a>
-<span class="sourceLineNo">4245</span>      }<a name="line.4245"></a>
-<span class="sourceLineNo">4246</span>    };<a name="line.4246"></a>
-<span class="sourceLineNo">4247</span><a name="line.4247"></a>
-<span class="sourceLineNo">4248</span>    // after all increment finished, the row will increment to 20*100 = 2000<a name="line.4248"></a>
-<span class="sourceLineNo">4249</span>    int threadNum = 20;<a name="line.4249"></a>
-<span class="sourceLineNo">4250</span>    int incCounter = 100;<a name="line.4250"></a>
-<span class="sourceLineNo">4251</span>    long expected = (long) threadNum * incCounter;<a name="line.4251"></a>
-<span class="sourceLineNo">4252</span>    Thread[] incrementers = new Thread[threadNum];<a name="line.4252"></a>
-<span class="sourceLineNo">4253</span>    Thread flushThread = new Thread(flusher);<a name="line.4253"></a>
-<span class="sourceLineNo">4254</span>    for (int i = 0; i &lt; threadNum; i++) {<a name="line.4254"></a>
-<span class="sourceLineNo">4255</span>      incrementers[i] = new Thread(new Incrementer(this.region, incCounter));<a name="line.4255"></a>
-<span class="sourceLineNo">4256</span>      incrementers[i].start();<a name="line.4256"></a>
-<span class="sourceLineNo">4257</span>    }<a name="line.4257"></a>
-<span class="sourceLineNo">4258</span>    flushThread.start();<a name="line.4258"></a>
-<span class="sourceLineNo">4259</span>    for (int i = 0; i &lt; threadNum; i++) {<a name="line.4259"></a>
-<span class="sourceLineNo">4260</span>      incrementers[i].join();<a name="line.4260"></a>
-<span class="sourceLineNo">4261</span>    }<a name="line.4261"></a>
-<span class="sourceLineNo">4262</span><a name="line.4262"></a>
-<span class="sourceLineNo">4263</span>    incrementDone.set(true);<a name="line.4263"></a>
-<span class="sourceLineNo">4264</span>    flushThread.join();<a name="line.4264"></a>
-<span class="sourceLineNo">4265</span><a name="line.4265"></a>
-<span class="sourceLineNo">4266</span>    Get get = new Get(Incrementer.incRow);<a name="line.4266"></a>
-<span class="sourceLineNo">4267</span>    get.addColumn(Incrementer.family, Incrementer.qualifier);<a name="line.4267"></a>
-<span class="sourceLineNo">4268</span>    get.readVersions(1);<a name="line.4268"></a>
-<span class="sourceLineNo">4269</span>    Result res = this.region.get(get);<a name="line.4269"></a>
-<span class="sourceLineNo">4270</span>    List&lt;Cell&gt; kvs = res.getColumnCells(Incrementer.family, Incrementer.qualifier);<a name="line.4270"></a>
-<span class="sourceLineNo">4271</span><a name="line.4271"></a>
-<span class="sourceLineNo">4272</span>    // we just got the latest version<a name="line.4272"></a>
-<span class="sourceLineNo">4273</span>    assertEquals(1, kvs.size());<a name="line.4273"></a>
-<span class="sourceLineNo">4274</span>    Cell kv = kvs.get(0);<a name="line.4274"></a>
-<span class="sourceLineNo">4275</span>    assertEquals(expected, Bytes.toLong(kv.getValueArray(), kv.getValueOffset()));<a name="line.4275"></a>
-<span class="sourceLineNo">4276</span>  }<a name="line.4276"></a>
-<span class="sourceLineNo">4277</span><a name="line.4277"></a>
-<span class="sourceLineNo">4278</span>  /**<a name="line.4278"></a>
-<span class="sourceLineNo">4279</span>   * TestCase for append<a name="line.4279"></a>
-<span class="sourceLineNo">4280</span>   */<a name="line.4280"></a>
-<span class="sourceLineNo">4281</span>  private static class Appender implements Runnable {<a name="line.4281"></a>
-<span class="sourceLineNo">4282</span>    private HRegion region;<a name="line.4282"></a>
-<span class="sourceLineNo">4283</span>    private final static byte[] appendRow = Bytes.toBytes("appendRow");<a name="line.4283"></a>
-<span class="sourceLineNo">4284</span>    private final static byte[] family = Bytes.toBytes("family");<a name="line.4284"></a>
-<span class="sourceLineNo">4285</span>    private final static byte[] qualifier = Bytes.toBytes("qualifier");<a name="line.4285"></a>
-<span class="sourceLineNo">4286</span>    private final static byte[] CHAR = Bytes.toBytes("a");<a name="line.4286"></a>
-<span class="sourceLineNo">4287</span>    private int appendCounter;<a name="line.4287"></a>
-<span class="sourceLineNo">4288</span><a name="line.4288"></a>
-<span class="sourceLineNo">4289</span>    public Appender(HRegion region, int appendCounter) {<a name="line.4289"></a>
-<span class="sourceLineNo">4290</span>      this.region = region;<a name="line.4290"></a>
-<span class="sourceLineNo">4291</span>      this.appendCounter = appendCounter;<a name="line.4291"></a>
-<span class="sourceLineNo">4292</span>    }<a name="line.4292"></a>
-<span class="sourceLineNo">4293</span><a name="line.4293"></a>
-<span class="sourceLineNo">4294</span>    @Override<a name="line.4294"></a>
-<span class="sourceLineNo">4295</span>    public void run() {<a name="line.4295"></a>
-<span class="sourceLineNo">4296</span>      int count = 0;<a name="line.4296"></a>
-<span class="sourceLineNo">4297</span>      while (count &lt; appendCounter) {<a name="line.4297"></a>
-<span class="sourceLineNo">4298</span>        Append app = new Append(appendRow);<a name="line.4298"></a>
-<span class="sourceLineNo">4299</span>        app.addColumn(family, qualifier, CHAR);<a name="line.4299"></a>
-<span class="sourceLineNo">4300</span>        count++;<a name="line.4300"></a>
-<span class="sourceLineNo">4301</span>        try {<a name="line.4301"></a>
-<span class="sourceLineNo">4302</span>          region.append(app);<a name="line.4302"></a>
-<span class="sourceLineNo">4303</span>        } catch (IOException e) {<a name="line.4303"></a>
-<span class="sourceLineNo">4304</span>          LOG.info("Count=" + count + ", max=" + appendCounter + ", " + e);<a name="line.4304"></a>
-<span class="sourceLineNo">4305</span>          break;<a name="line.4305"></a>
-<span class="sourceLineNo">4306</span>        }<a name="line.4306"></a>
-<span class="sourceLineNo">4307</span>      }<a name="line.4307"></a>
-<span class="sourceLineNo">4308</span>    }<a name="line.4308"></a>
-<span class="sourceLineNo">4309</span>  }<a name="line.4309"></a>
-<span class="sourceLineNo">4310</span><a name="line.4310"></a>
-<span class="sourceLineNo">4311</span>  /**<a name="line.4311"></a>
-<span class="sourceLineNo">4312</span>   * Test case to check append function with memstore flushing<a name="line.4312"></a>
-<span class="sourceLineNo">4313</span>   * @throws Exception<a name="line.4313"></a>
-<span class="sourceLineNo">4314</span>   */<a name="line.4314"></a>
-<span class="sourceLineNo">4315</span>  @Test<a name="line.4315"></a>
-<span class="sourceLineNo">4316</span>  public void testParallelAppendWithMemStoreFlush() throws Exception {<a name="line.4316"></a>
-<span class="sourceLineNo">4317</span>    byte[] family = Appender.family;<a name="line.4317"></a>
-<span class="sourceLineNo">4318</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.4318"></a>
-<span class="sourceLineNo">4319</span>    final HRegion region = this.region;<a name="line.4319"></a>
-<span class="sourceLineNo">4320</span>    final AtomicBoolean appendDone = new AtomicBoolean(false);<a name="line.4320"></a>
-<span class="sourceLineNo">4321</span>    Runnable flusher = new Runnable() {<a name="line.4321"></a>
-<span class="sourceLineNo">4322</span>      @Override<a name="line.4322"></a>
-<span class="sourceLineNo">4323</span>      public void run() {<a name="line.4323"></a>
-<span class="sourceLineNo">4324</span>        while (!appendDone.get()) {<a name="line.4324"></a>
-<span class="sourceLineNo">4325</span>          try {<a name="line.4325"></a>
-<span class="sourceLineNo">4326</span>            region.flush(true);<a name="line.4326"></a>
-<span class="sourceLineNo">4327</span>          } catch (Exception e) {<a name="line.4327"></a>
-<span class="sourceLineNo">4328</span>            e.printStackTrace();<a name="line.4328"></a>
-<span class="sourceLineNo">4329</span>          }<a name="line.4329"></a>
-<span class="sourceLineNo">4330</span>        }<a name="line.4330"></a>
-<span class="sourceLineNo">4331</span>      }<a name="line.4331"></a>
-<span class="sourceLineNo">4332</span>    };<a name="line.4332"></a>
-<span class="sourceLineNo">4333</span><a name="line.4333"></a>
-<span class="sourceLineNo">4334</span>    // After all append finished, the value will append to threadNum *<a name="line.4334"></a>
-<span class="sourceLineNo">4335</span>    // appendCounter Appender.CHAR<a name="line.4335"></a>
-<span class="sourceLineNo">4336</span>    int threadNum = 20;<a name="line.4336"></a>
-<span class="sourceLineNo">4337</span>    int appendCounter = 100;<a name="line.4337"></a>
-<span class="sourceLineNo">4338</span>    byte[] expected = new byte[threadNum * appendCounter];<a name="line.4338"></a>
-<span class="sourceLineNo">4339</span>    for (int i = 0; i &lt; threadNum * appendCounter; i++) {<a name="line.4339"></a>
-<span class="sourceLineNo">4340</span>      System.arraycopy(Appender.CHAR, 0, expected, i, 1);<a name="line.4340"></a>
-<span class="sourceLineNo">4341</span>    }<a name="line.4341"></a>
-<span class="sourceLineNo">4342</span>    Thread[] appenders = new Thread[threadNum];<a name="line.4342"></a>
-<span class="sourceLineNo">4343</span>    Thread flushThread = new Thread(flusher);<a name="line.4343"></a>
-<span class="sourceLineNo">4344</span>    for (int i = 0; i &lt; threadNum; i++) {<a name="line.4344"></a>
-<span class="sourceLineNo">4345</span>      appenders[i] = new Thread(new Appender(this.region, appendCounter));<a name="line.4345"></a>
-<span class="sourceLineNo">4346</span>      appenders[i].start();<a name="line.4346"></a>
-<span class="sourceLineNo">4347</span>    }<a name="line.4347"></a>
-<span class="sourceLineNo">4348</span>    flushThread.start();<a name="line.4348"></a>
-<span class="sourceLineNo">4349</span>    for (int i = 0; i &lt; threadNum; i++) {<a name="line.4349"></a>
-<span class="sourceLineNo">4350</span>      appenders[i].join();<a name="line.4350"></a>
+<span class="sourceLineNo">4185</span>    // Remove the .regioninfo file and verify is recreated on region open<a name="line.4185"></a>
+<span class="sourceLineNo">4186</span>    fs.delete(regionInfoFile, true);<a name="line.4186"></a>
+<span class="sourceLineNo">4187</span>    assertFalse(HRegionFileSystem.REGION_INFO_FILE + " should be removed from the region dir",<a name="line.4187"></a>
+<span class="sourceLineNo">4188</span>        fs.exists(regionInfoFile));<a name="line.4188"></a>
+<span class="sourceLineNo">4189</span><a name="line.4189"></a>
+<span class="sourceLineNo">4190</span>    region = HRegion.openHRegion(rootDir, hri, htd, null, CONF);<a name="line.4190"></a>
+<span class="sourceLineNo">4191</span>//    region = TEST_UTIL.openHRegion(hri, htd);<a name="line.4191"></a>
+<span class="sourceLineNo">4192</span>    assertEquals(regionDir, region.getRegionFileSystem().getRegionDir());<a name="line.4192"></a>
+<span class="sourceLineNo">4193</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.4193"></a>
+<span class="sourceLineNo">4194</span><a name="line.4194"></a>
+<span class="sourceLineNo">4195</span>    // Verify that the .regioninfo file is still there<a name="line.4195"></a>
+<span class="sourceLineNo">4196</span>    assertTrue(HRegionFileSystem.REGION_INFO_FILE + " should be present in the region dir",<a name="line.4196"></a>
+<span class="sourceLineNo">4197</span>        fs.exists(new Path(regionDir, HRegionFileSystem.REGION_INFO_FILE)));<a name="line.4197"></a>
+<span class="sourceLineNo">4198</span><a name="line.4198"></a>
+<span class="sourceLineNo">4199</span>    region = null;<a name="line.4199"></a>
+<span class="sourceLineNo">4200</span>  }<a name="line.4200"></a>
+<span class="sourceLineNo">4201</span><a name="line.4201"></a>
+<span class="sourceLineNo">4202</span>  /**<a name="line.4202"></a>
+<span class="sourceLineNo">4203</span>   * TestCase for increment<a name="line.4203"></a>
+<span class="sourceLineNo">4204</span>   */<a name="line.4204"></a>
+<span class="sourceLineNo">4205</span>  private static class Incrementer implements Runnable {<a name="line.4205"></a>
+<span class="sourceLineNo">4206</span>    private HRegion region;<a name="line.4206"></a>
+<span class="sourceLineNo">4207</span>    private final static byte[] incRow = Bytes.toBytes("incRow");<a name="line.4207"></a>
+<span class="sourceLineNo">4208</span>    private final static byte[] family = Bytes.toBytes("family");<a name="line.4208"></a>
+<span class="sourceLineNo">4209</span>    private final static byte[] qualifier = Bytes.toBytes("qualifier");<a name="line.4209"></a>
+<span class="sourceLineNo">4210</span>    private final static long ONE = 1L;<a name="line.4210"></a>
+<span class="sourceLineNo">4211</span>    private int incCounter;<a name="line.4211"></a>
+<span class="sourceLineNo">4212</span><a name="line.4212"></a>
+<span class="sourceLineNo">4213</span>    public Incrementer(HRegion region, int incCounter) {<a name="line.4213"></a>
+<span class="sourceLineNo">4214</span>      this.region = region;<a name="line.4214"></a>
+<span class="sourceLineNo">4215</span>      this.incCounter = incCounter;<a name="line.4215"></a>
+<span class="sourceLineNo">4216</span>    }<a name="line.4216"></a>
+<span class="sourceLineNo">4217</span><a name="line.4217"></a>
+<span class="sourceLineNo">4218</span>    @Override<a name="line.4218"></a>
+<span class="sourceLineNo">4219</span>    public void run() {<a name="line.4219"></a>
+<span class="sourceLineNo">4220</span>      int count = 0;<a name="line.4220"></a>
+<span class="sourceLineNo">4221</span>      while (count &lt; incCounter) {<a name="line.4221"></a>
+<span class="sourceLineNo">4222</span>        Increment inc = new Increment(incRow);<a name="line.4222"></a>
+<span class="sourceLineNo">4223</span>        inc.addColumn(family, qualifier, ONE);<a name="line.4223"></a>
+<span class="sourceLineNo">4224</span>        count++;<a name="line.4224"></a>
+<span class="sourceLineNo">4225</span>        try {<a name="line.4225"></a>
+<span class="sourceLineNo">4226</span>          region.increment(inc);<a name="line.4226"></a>
+<span class="sourceLineNo">4227</span>        } catch (IOException e) {<a name="line.4227"></a>
+<span class="sourceLineNo">4228</span>          LOG.info("Count=" + count + ", " + e);<a name="line.4228"></a>
+<span class="sourceLineNo">4229</span>          break;<a name="line.4229"></a>
+<span class="sourceLineNo">4230</span>        }<a name="line.4230"></a>
+<span class="sourceLineNo">4231</span>      }<a name="line.4231"></a>
+<span class="sourceLineNo">4232</span>    }<a name="line.4232"></a>
+<span class="sourceLineNo">4233</span>  }<a name="line.4233"></a>
+<span class="sourceLineNo">4234</span><a name="line.4234"></a>
+<span class="sourceLineNo">4235</span>  /**<a name="line.4235"></a>
+<span class="sourceLineNo">4236</span>   * Test case to check increment function with memstore flushing<a name="line.4236"></a>
+<span class="sourceLineNo">4237</span>   * @throws Exception<a name="line.4237"></a>
+<span class="sourceLineNo">4238</span>   */<a name="line.4238"></a>
+<span class="sourceLineNo">4239</span>  @Test<a name="line.4239"></a>
+<span class="sourceLineNo">4240</span>  public void testParallelIncrementWithMemStoreFlush() throws Exception {<a name="line.4240"></a>
+<span class="sourceLineNo">4241</span>    byte[] family = Incrementer.family;<a name="line.4241"></a>
+<span class="sourceLineNo">4242</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.4242"></a>
+<span class="sourceLineNo">4243</span>    final HRegion region = this.region;<a name="line.4243"></a>
+<span class="sourceLineNo">4244</span>    final AtomicBoolean incrementDone = new AtomicBoolean(false);<a name="line.4244"></a>
+<span class="sourceLineNo">4245</span>    Runnable flusher = new Runnable() {<a name="line.4245"></a>
+<span class="sourceLineNo">4246</span>      @Override<a name="line.4246"></a>
+<span class="sourceLineNo">4247</span>      public void run() {<a name="line.4247"></a>
+<span class="sourceLineNo">4248</span>        while (!incrementDone.get()) {<a name="line.4248"></a>
+<span class="sourceLineNo">4249</span>          try {<a name="line.4249"></a>
+<span class="sourceLineNo">4250</span>            region.flush(true);<a name="line.4250"></a>
+<span class="sourceLineNo">4251</span>          } catch (Exception e) {<a name="line.4251"></a>
+<span class="sourceLineNo">4252</span>            e.printStackTrace();<a name="line.4252"></a>
+<span class="sourceLineNo">4253</span>          }<a name="line.4253"></a>
+<span class="sourceLineNo">4254</span>        }<a name="line.4254"></a>
+<span class="sourceLineNo">4255</span>      }<a name="line.4255"></a>
+<span class="sourceLineNo">4256</span>    };<a name="line.4256"></a>
+<span class="sourceLineNo">4257</span><a name="line.4257"></a>
+<span class="sourceLineNo">4258</span>    // after all increment finished, the row will increment to 20*100 = 2000<a name="line.4258"></a>
+<span class="sourceLineNo">4259</span>    int threadNum = 20;<a name="line.4259"></a>
+<span class="sourceLineNo">4260</span>    int incCounter = 100;<a name="line.4260"></a>
+<span class="sourceLineNo">4261</span>    long expected = (long) threadNum * incCounter;<a name="line.4261"></a>
+<span class="sourceLineNo">4262</span>    Thread[] incrementers = new Thread[threadNum];<a name="line.4262"></a>
+<span class="sourceLineNo">4263</span>    Thread flushThread = new Thread(flusher);<a name="line.4263"></a>
+<span class="sourceLineNo">4264</span>    for (int i = 0; i &lt; threadNum; i++) {<a name="line.4264"></a>
+<span class="sourceLineNo">4265</span>      incrementers[i] = new Thread(new Incrementer(this.region, incCounter));<a name="line.4265"></a>
+<span class="sourceLineNo">4266</span>      incrementers[i].start();<a name="line.4266"></a>
+<span class="sourceLineNo">4267</span>    }<a name="line.4267"></a>
+<span class="sourceLineNo">4268</span>    flushThread.start();<a name="line.4268"></a>
+<span class="sourceLineNo">4269</span>    for (int i = 0; i &lt; threadNum; i++) {<a name="line.4269"></a>
+<span class="sourceLineNo">4270</span>      incrementers[i].join();<a name="line.4270"></a>
+<span class="sourceLineNo">4271</span>    }<a name="line.4271"></a>
+<span class="sourceLineNo">4272</span><a name="line.4272"></a>
+<span class="sourceLineNo">4273</span>    incrementDone.set(true);<a name="line.4273"></a>
+<span class="sourceLineNo">4274</span>    flushThread.join();<a name="line.4274"></a>
+<span class="sourceLineNo">4275</span><a name="line.4275"></a>
+<span class="sourceLineNo">4276</span>    Get get = new Get(Incrementer.incRow);<a name="line.4276"></a>
+<span class="sourceLineNo">4277</span>    get.addColumn(Incrementer.family, Incrementer.qualifier);<a name="line.4277"></a>
+<span class="sourceLineNo">4278</span>    get.readVersions(1);<a name="line.4278"></a>
+<span class="sourceLineNo">4279</span>    Result res = this.region.get(get);<a name="line.4279"></a>
+<span class="sourceLineNo">4280</span>    List&lt;Cell&gt; kvs = res.getColumnCells(Incrementer.family, Incrementer.qualifier);<a name="line.4280"></a>
+<span class="sourceLineNo">4281</span><a name="line.4281"></a>
+<span class="sourceLineNo">4282</span>    // we just got the latest version<a name="line.4282"></a>
+<span class="sourceLineNo">4283</span>    assertEquals(1, kvs.size());<a name="line.4283"></a>
+<span class="sourceLineNo">4284</span>    Cell kv = kvs.get(0);<a name="line.4284"></a>
+<span class="sourceLineNo">4285</span>    assertEquals(expected, Bytes.toLong(kv.getValueArray(), kv.getValueOffset()));<a name="line.4285"></a>
+<span class="sourceLineNo">4286</span>  }<a name="line.4286"></a>
+<span class="sourceLineNo">4287</span><a name="line.4287"></a>
+<span class="sourceLineNo">4288</span>  /**<a name="line.4288"></a>
+<span class="sourceLineNo">4289</span>   * TestCase for append<a name="line.4289"></a>
+<span class="sourceLineNo">4290</span>   */<a name="line.4290"></a>
+<span class="sourceLineNo">4291</span>  private static class Appender implements Runnable {<a name="line.4291"></a>
+<span class="sourceLineNo">4292</span>    private HRegion region;<a name="line.4292"></a>
+<span class="sourceLineNo">4293</span>    private final static byte[] appendRow = Bytes.toBytes("appendRow");<a name="line.4293"></a>
+<span class="sourceLineNo">4294</span>    private final static byte[] family = Bytes.toBytes("family");<a name="line.4294"></a>
+<span class="sourceLineNo">4295</span>    private final static byte[] qualifier = Bytes.toBytes("qualifier");<a name="line.4295"></a>
+<span class="sourceLineNo">4296</span>    private final static byte[] CHAR = Bytes.toBytes("a");<a name="line.4296"></a>
+<span class="sourceLineNo">4297</span>    private int appendCounter;<a name="line.4297"></a>
+<span class="sourceLineNo">4298</span><a name="line.4298"></a>
+<span class="sourceLineNo">4299</span>    public Appender(HRegion region, int appendCounter) {<a name="line.4299"></a>
+<span class="sourceLineNo">4300</span>      this.region = region;<a name="line.4300"></a>
+<span class="sourceLineNo">4301</span>      this.appendCounter = appendCounter;<a name="line.4301"></a>
+<span class="sourceLineNo">4302</span>    }<a name="line.4302"></a>
+<span class="sourceLineNo">4303</span><a name="line.4303"></a>
+<span class="sourceLineNo">4304</span>    @Override<a name="line.4304"></a>
+<span class="sourceLineNo">4305</span>    public void run() {<a name="line.4305"></a>
+<span class="sourceLineNo">4306</span>      int count = 0;<a name="line.4306"></a>
+<span class="sourceLineNo">4307</span>      while (count &lt; appendCounter) {<a name="line.4307"></a>
+<span class="sourceLineNo">4308</span>        Append app = new Append(appendRow);<a name="line.4308"></a>
+<span class="sourceLineNo">4309</span>        app.addColumn(family, qualifier, CHAR);<a name="line.4309"></a>
+<span class="sourceLineNo">4310</span>        count++;<a name="line.4310"></a>
+<span class="sourceLineNo">4311</span>        try {<a name="line.4311"></a>
+<span class="sourceLineNo">4312</span>          region.append(app);<a name="line.4312"></a>
+<span class="sourceLineNo">4313</span>        } catch (IOException e) {<a name="line.4313"></a>
+<span class="sourceLineNo">4314</span>          LOG.info("Count=" + count + ", max=" + appendCounter + ", " + e);<a name="line.4314"></a>
+<span class="sourceLineNo">4315</span>          break;<a name="line.4315"></a>
+<span class="sourceLineNo">4316</span>        }<a name="line.4316"></a>
+<span class="sourceLineNo">4317</span>      }<a name="line.4317"></a>
+<span class="sourceLineNo">4318</span>    }<a name="line.4318"></a>
+<span class="sourceLineNo">4319</span>  }<a name="line.4319"></a>
+<span class="sourceLineNo">4320</span><a name="line.4320"></a>
+<span class="sourceLineNo">4321</span>  /**<a name="line.4321"></a>
+<span class="sourceLineNo">4322</span>   * Test case to check append function with memstore flushing<a name="line.4322"></a>
+<span class="sourceLineNo">4323</span>   * @throws Exception<a name="line.4323"></a>
+<span class="sourceLineNo">4324</span>   */<a name="line.4324"></a>
+<span class="sourceLineNo">4325</span>  @Test<a name="line.4325"></a>
+<span class="sourceLineNo">4326</span>  public void testParallelAppendWithMemStoreFlush() throws Exception {<a name="line.4326"></a>
+<span class="sourceLineNo">4327</span>    byte[] family = Appender.family;<a name="line.4327"></a>
+<span class="sourceLineNo">4328</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.4328"></a>
+<span class="sourceLineNo">4329</span>    final HRegion region = this.region;<a name="line.4329"></a>
+<span class="sourceLineNo">4330</span>    final AtomicBoolean appendDone = new AtomicBoolean(false);<a name="line.4330"></a>
+<span class="sourceLineNo">4331</span>    Runnable flusher = new Runnable() {<a name="line.4331"></a>
+<span class="sourceLineNo">4332</span>      @Override<a name="line.4332"></a>
+<span class="sourceLineNo">4333</span>      public void run() {<a name="line.4333"></a>
+<span class="sourceLineNo">4334</span>        while (!appendDone.get()) {<a name="line.4334"></a>
+<span class="sourceLineNo">4335</span>          try {<a name="line.4335"></a>
+<span class="sourceLineNo">4336</span>            region.flush(true);<a name="line.4336"></a>
+<span class="sourceLineNo">4337</span>          } catch (Exception e) {<a name="line.4337"></a>
+<span class="sourceLineNo">4338</span>            e.printStackTrace();<a name="line.4338"></a>
+<span class="sourceLineNo">4339</span>          }<a name="line.4339"></a>
+<span class="sourceLineNo">4340</span>        }<a name="line.4340"></a>
+<span class="sourceLineNo">4341</span>      }<a name="line.4341"></a>
+<span class="sourceLineNo">4342</span>    };<a name="line.4342"></a>
+<span class="sourceLineNo">4343</span><a name="line.4343"></a>
+<span class="sourceLineNo">4344</span>    // After all append finished, the value will append to threadNum *<a name="line.4344"></a>
+<span class="sourceLineNo">4345</span>    // appendCounter Appender.CHAR<a name="line.4345"></a>
+<span class="sourceLineNo">4346</span>    int threadNum = 20;<a name="line.4346"></a>
+<span class="sourceLineNo">4347</span>    int appendCounter = 100;<a name="line.4347"></a>
+<span class="sourceLineNo">4348</span>    byte[] expected = new byte[threadNum * appendCounter];<a name="line.4348"></a>
+<span class="sourceLineNo">4349</span>    for (int i = 0; i &lt; threadNum * appendCounter; i++) {<a name="line.4349"></a>
+<span class="sourceLineNo">4350</span>      System.arraycopy(Appender.CHAR, 0, expected, i, 1);<a name="line.4350"></a>
 <span class="sourceLineNo">4351</span>    }<a name="line.4351"></a>
-<span class="sourceLineNo">4352</span><a name="line.4352"></a>
-<span class="sourceLineNo">4353</span>    appendDone.set(true);<a name="line.4353"></a>
-<span class="sourceLineNo">4354</span>    flushThread.join();<a name="line.4354"></a>
-<span class="sourceLineNo">4355</span><a name="line.4355"></a>
-<span class="sourceLineNo">4356</span>    Get get = new Get(Appender.appendRow);<a name="line.4356"></a>
-<span class="sourceLineNo">4357</span>    get.addColumn(Appender.family, Appender.qualifier);<a name="line.4357"></a>
-<span class="sourceLineNo">4358</span>    get.readVersions(1);<a name="line.4358"></a>
-<span class="sourceLineNo">4359</span>    Result res = this.region.get(get);<a name="line.4359"></a>
-<span class="sourceLineNo">4360</span>    List&lt;Cell&gt; kvs = res.getColumnCells(Appender.family, Appender.qualifier);<a name="line.4360"></a>
-<span class="sourceLineNo">4361</span><a name="line.4361"></a>
-<span class="sourceLineNo">4362</span>    // we just got the latest version<a name="line.4362"></a>
-<span class="sourceLineNo">4363</span>    assertEquals(1, kvs.size());<a name="line.4363"></a>
-<span class="sourceLineNo">4364</span>    Cell kv = kvs.get(0);<a name="line.4364"></a>
-<span class="sourceLineNo">4365</span>    byte[] appendResult = new byte[kv.getValueLength()];<a name="line.4365"></a>
-<span class="sourceLineNo">4366</span>    System.arraycopy(kv.getValueArray(), kv.getValueOffset(), appendResult, 0, kv.getValueLength());<a name="line.4366"></a>
-<span class="sourceLineNo">4367</span>    assertArrayEquals(expected, appendResult);<a name="line.4367"></a>
-<span class="sourceLineNo">4368</span>  }<a name="line.4368"></a>
-<span class="sourceLineNo">4369</span><a name="line.4369"></a>
-<span class="sourceLineNo">4370</span>  /**<a name="line.4370"></a>
-<span class="sourceLineNo">4371</span>   * Test case to check put function with memstore flushing for same row, same ts<a name="line.4371"></a>
-<span class="sourceLineNo">4372</span>   * @throws Exception<a name="line.4372"></a>
-<span class="sourceLineNo">4373</span>   */<a name="line.4373"></a>
-<span class="sourceLineNo">4374</span>  @Test<a name="line.4374"></a>
-<span class="sourceLineNo">4375</span>  public void testPutWithMemStoreFlush() throws Exception {<a name="line.4375"></a>
-<span class="sourceLineNo">4376</span>    byte[] family = Bytes.toBytes("family");<a name="line.4376"></a>
-<span class="sourceLineNo">4377</span>    byte[] qualifier = Bytes.toBytes("qualifier");<a name="line.4377"></a>
-<span class="sourceLineNo">4378</span>    byte[] row = Bytes.toBytes("putRow");<a name="line.4378"></a>
-<span class="sourceLineNo">4379</span>    byte[] value = null;<a name="line.4379"></a>
-<span class="sourceLineNo">4380</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.4380"></a>
-<span class="sourceLineNo">4381</span>    Put put = null;<a name="line.4381"></a>
-<span class="sourceLineNo">4382</span>    Get get = null;<a name="line.4382"></a>
-<span class="sourceLineNo">4383</span>    List&lt;Cell&gt; kvs = null;<a name="line.4383"></a>
-<span class="sourceLineNo">4384</span>    Result res = null;<a name="line.4384"></a>
-<span class="sourceLineNo">4385</span><a name="line.4385"></a>
-<span class="sourceLineNo">4386</span>    put = new Put(row);<a name="line.4386"></a>
-<span class="sourceLineNo">4387</span>    value = Bytes.toBytes("value0");<a name="line.4387"></a>
-<span class="sourceLineNo">4388</span>    put.addColumn(family, qualifier, 1234567L, value);<a name="line.4388"></a>
-<span class="sourceLineNo">4389</span>    region.put(put);<a name="line.4389"></a>
-<span class="sourceLineNo">4390</span>    get = new Get(row);<a name="line.4390"></a>
-<span class="sourceLineNo">4391</span>    get.addColumn(family, qualifier);<a name="line.4391"></a>
-<span class="sourceLineNo">4392</span>    get.readAllVersions();<a name="line.4392"></a>
-<span class="sourceLineNo">4393</span>    res = this.region.get(get);<a name="line.4393"></a>
-<span class="sourceLineNo">4394</span>    kvs = res.getColumnCells(family, qualifier);<a name="line.4394"></a>
-<span class="sourceLineNo">4395</span>    assertEquals(1, kvs.size());<a name="line.4395"></a>
-<span class="sourceLineNo">4396</span>    assertArrayEquals(Bytes.toBytes("value0"), CellUtil.cloneValue(kvs.get(0)));<a name="line.4396"></a>
-<span class="sourceLineNo">4397</span><a name="line.4397"></a>
-<span class="sourceLineNo">4398</span>    region.flush(true);<a name="line.4398"></a>
-<span class="sourceLineNo">4399</span>    get = new Get(row);<a name="line.4399"></a>
-<span class="sourceLineNo">4400</span>    get.addColumn(family, qualifier);<a name="line.4400"></a>
-<span class="sourceLineNo">4401</span>    get.readAllVersions();<a name="line.4401"></a>
-<span class="sourceLineNo">4402</span>    res = this.region.get(get);<a name="line.4402"></a>
-<span class="sourceLineNo">4403</span>    kvs = res.getColumnCells(family, qualifier);<a name="line.4403"></a>
-<span class="sourceLineNo">4404</span>    assertEquals(1, kvs.size());<a name="line.4404"></a>
-<span class="sourceLineNo">4405</span>    assertArrayEquals(Bytes.toBytes("value0"), CellUtil.cloneValue(kvs.get(0)));<a name="line.4405"></a>
-<span class="sourceLineNo">4406</span><a name="line.4406"></a>
-<span class="sourceLineNo">4407</span>    put = new Put(row);<a name="line.4407"></a>
-<span class="sourceLineNo">4408</span>    value = Bytes.toBytes("value1");<a name="line.4408"></a>
-<span class="sourceLineNo">4409</span>    put.addColumn(family, qualifier, 1234567L, value);<a name="line.4409"></a>
-<span class="sourceLineNo">4410</span>    region.put(put);<a name="line.4410"></a>
-<span class="sourceLineNo">4411</span>    get = new Get(row);<a name="line.4411"></a>
-<span class="sourceLineNo">4412</span>    get.addColumn(family, qualifier);<a name="line.4412"></a>
-<span class="sourceLineNo">4413</span>    get.readAllVersions();<a name="line.4413"></a>
-<span class="sourceLineNo">4414</span>    res = this.region.get(get);<a name="line.4414"></a>
-<span class="sourceLineNo">4415</span>    kvs = res.getColumnCells(family, qualifier);<a name="line.4415"></a>
-<span class="sourceLineNo">4416</span>    assertEquals(1, kvs.size());<a name="line.4416"></a>
-<span class="sourceLineNo">4417</span>    assertArrayEquals(Bytes.toBytes("value1"), CellUtil.cloneValue(kvs.get(0)));<a name="line.4417"></a>
-<span class="sourceLineNo">4418</span><a name="line.4418"></a>
-<span class="sourceLineNo">4419</span>    region.flush(true);<a name="line.4419"></a>
-<span class="sourceLineNo">4420</span>    get = new Get(row);<a name="line.4420"></a>
-<span class="sourceLineNo">4421</span>    get.addColumn(family, qualifier);<a name="line.4421"></a>
-<span class="sourceLineNo">4422</span>    get.readAllVersions();<a name="line.4422"></a>
-<span class="sourceLineNo">4423</span>    res = this.region.get(get);<a name="line.4423"></a>
-<span class="sourceLineNo">4424</span>    kvs = res.getColumnCells(family, qualifier);<a name="line.4424"></a>
-<span class="sourceLineNo">4425</span>    assertEquals(1, kvs.size());<a name="line.4425"></a>
-<span class="sourceLineNo">4426</span>    assertArrayEquals(Bytes.toBytes("value1"), CellUtil.cloneValue(kvs.get(0)));<a name="line.4426"></a>
-<span class="sourceLineNo">4427</span>  }<a name="line.4427"></a>
+<span class="sourceLineNo">4352</span>    Thread[] appenders = new Thread[threadNum];<a name="line.4352"></a>
+<span class="sourceLineNo">4353</span>    Thread flushThread = new Thread(flusher);<a name="line.4353"></a>
+<span class="sourceLineNo">4354</span>    for (int i = 0; i &lt; threadNum; i++) {<a name="line.4354"></a>
+<span class="sourceLineNo">4355</span>      appenders[i] = new Thread(new Appender(this.region, appendCounter));<a name="line.4355"></a>
+<span class="sourceLineNo">4356</span>      appenders[i].start();<a name="line.4356"></a>
+<span class="sourceLineNo">4357</span>    }<a name="line.4357"></a>
+<span class="sourceLineNo">4358</span>    flushThread.start();<a name="line.4358"></a>
+<span class="sourceLineNo">4359</span>    for (int i = 0; i &lt; threadNum; i++) {<a name="line.4359"></a>
+<span class="sourceLineNo">4360</span>      appenders[i].join();<a name="line.4360"></a>
+<span class="sourceLineNo">4361</span>    }<a name="line.4361"></a>
+<span class="sourceLineNo">4362</span><a name="line.4362"></a>
+<span class="sourceLineNo">4363</span>    appendDone.set(true);<a name="line.4363"></a>
+<span class="sourceLineNo">4364</span>    flushThread.join();<a name="line.4364"></a>
+<span class="sourceLineNo">4365</span><a name="line.4365"></a>
+<span class="sourceLineNo">4366</span>    Get get = new Get(Appender.appendRow);<a name="line.4366"></a>
+<span class="sourceLineNo">4367</span>    get.addColumn(Appender.family, Appender.qualifier);<a name="line.4367"></a>
+<span class="sourceLineNo">4368</span>    get.readVersions(1);<a name="line.4368"></a>
+<span class="sourceLineNo">4369</span>    Result res = this.region.get(get);<a name="line.4369"></a>
+<span class="sourceLineNo">4370</span>    List&lt;Cell&gt; kvs = res.getColumnCells(Appender.family, Appender.qualifier);<a name="line.4370"></a>
+<span class="sourceLineNo">4371</span><a name="line.4371"></a>
+<span class="sourceLineNo">4372</span>    // we just got the latest version<a name="line.4372"></a>
+<span class="sourceLineNo">4373</span>    assertEquals(1, kvs.size());<a name="line.4373"></a>
+<span class="sourceLineNo">4374</span>    Cell kv = kvs.get(0);<a name="line.4374"></a>
+<span class="sourceLineNo">4375</span>    byte[] appendResult = new byte[kv.getValueLength()];<a name="line.4375"></a>
+<span class="sourceLineNo">4376</span>    System.arraycopy(kv.getValueArray(), kv.getValueOffset(), appendResult, 0, kv.getValueLength());<a name="line.4376"></a>
+<span class="sourceLineNo">4377</span>    assertArrayEquals(expected, appendResult);<a name="line.4377"></a>
+<span class="sourceLineNo">4378</span>  }<a name="line.4378"></a>
+<span class="sourceLineNo">4379</span><a name="line.4379"></a>
+<span class="sourceLineNo">4380</span>  /**<a name="line.4380"></a>
+<span class="sourceLineNo">4381</span>   * Test case to check put function with memstore flushing for same row, same ts<a name="line.4381"></a>
+<span class="sourceLineNo">4382</span>   * @throws Exception<a name="line.4382"></a>
+<span class="sourceLineNo">4383</span>   */<a name="line.4383"></a>
+<span class="sourceLineNo">4384</span>  @Test<a name="line.4384"></a>
+<span class="sourceLineNo">4385</span>  public void testPutWithMemStoreFlush() throws Exception {<a name="line.4385"></a>
+<span class="sourceLineNo">4386</span>    byte[] family = Bytes.toBytes("family");<a name="line.4386"></a>
+<span class="sourceLineNo">4387</span>    byte[] qualifier = Bytes.toBytes("qualifier");<a name="line.4387"></a>
+<span class="sourceLineNo">4388</span>    byte[] row = Bytes.toBytes("putRow");<a name="line.4388"></a>
+<span class="sourceLineNo">4389</span>    byte[] value = null;<a name="line.4389"></a>
+<span class="sourceLineNo">4390</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.4390"></a>
+<span class="sourceLineNo">4391</span>    Put put = null;<a name="line.4391"></a>
+<span class="sourceLineNo">4392</span>    Get get = null;<a name="line.4392"></a>
+<span class="sourceLineNo">4393</span>    List&lt;Cell&gt; kvs = null;<a name="line.4393"></a>
+<span class="sourceLineNo">4394</span>    Result res = null;<a name="line.4394"></a>
+<span class="sourceLineNo">4395</span><a name="line.4395"></a>
+<span class="sourceLineNo">4396</span>    put = new Put(row);<a name="line.4396"></a>
+<span class="sourceLineNo">4397</span>    value = Bytes.toBytes("value0");<a name="line.4397"></a>
+<span class="sourceLineNo">4398</span>    put.addColumn(family, qualifier, 1234567L, value);<a name="line.4398"></a>
+<span class="sourceLineNo">4399</span>    region.put(put);<a name="line.4399"></a>
+<span class="sourceLineNo">4400</span>    get = new Get(row);<a name="line.4400"></a>
+<span class="sourceLineNo">4401</span>    get.addColumn(family, qualifier);<a name="line.4401"></a>
+<span class="sourceLineNo">4402</span>    get.readAllVersions();<a name="line.4402"></a>
+<span class="sourceLineNo">4403</span>    res = this.region.get(get);<a name="line.4403"></a>
+<span class="sourceLineNo">4404</span>    kvs = res.getColumnCells(family, qualifier);<a name="line.4404"></a>
+<span class="sourceLineNo">4405</span>    assertEquals(1, kvs.size());<a name="line.4405"></a>
+<span class="sourceLineNo">4406</span>    assertArrayEquals(Bytes.toBytes("value0"), CellUtil.cloneValue(kvs.get(0)));<a name="line.4406"></a>
+<span class="sourceLineNo">4407</span><a name="line.4407"></a>
+<span class="sourceLineNo">4408</span>    region.flush(true);<a name="line.4408"></a>
+<span class="sourceLineNo">4409</span>    get = new Get(row);<a name="line.4409"></a>
+<span class="sourceLineNo">4410</span>    get.addColumn(family, qualifier);<a name="line.4410"></a>
+<span class="sourceLineNo">4411</span>    get.readAllVersions();<a name="line.4411"></a>
+<span class="sourceLineNo">4412</span>    res = this.region.get(get);<a name="line.4412"></a>
+<span class="sourceLineNo">4413</span>    kvs = res.getColumnCells(family, qualifier);<a name="line.4413"></a>
+<span class="sourceLineNo">4414</span>    assertEquals(1, kvs.size());<a name="line.4414"></a>
+<span class="sourceLineNo">4415</span>    assertArrayEquals(Bytes.toBytes("value0"), CellUtil.cloneValue(kvs.get(0)));<a name="line.4415"></a>
+<span class="sourceLineNo">4416</span><a name="line.4416"></a>
+<span class="sourceLineNo">4417</span>    put = new Put(row);<a name="line.4417"></a>
+<span class="sourceLineNo">4418</span>    value = Bytes.toBytes("value1");<a name="line.4418"></a>
+<span class="sourceLineNo">4419</span>    put.addColumn(family, qualifier, 1234567L, value);<a name="line.4419"></a>
+<span class="sourceLineNo">4420</span>    region.put(put);<a name="line.4420"></a>
+<span class="sourceLineNo">4421</span>    get = new Get(row);<a name="line.4421"></a>
+<span class="sourceLineNo">4422</span>    get.addColumn(family, qualifier);<a name="line.4422"></a>
+<span class="sourceLineNo">4423</span>    get.readAllVersions();<a name="line.4423"></a>
+<span class="sourceLineNo">4424</span>    res = this.region.get(get);<a name="line.4424"></a>
+<span class="sourceLineNo">4425</span>    kvs = res.getColumnCells(family, qualifier);<a name="line.4425"></a>
+<span class="sourceLineNo">4426</span>    assertEquals(1, kvs.size());<a name="line.4426"></a>
+<span class="sourceLineNo">4427</span>    assertArrayEquals(Bytes.toBytes("value1"), CellUtil.cloneValue(kvs.get(0)));<a name="line.4427"></a>
 <span class="sourceLineNo">4428</span><a name="line.4428"></a>
-<span class="sourceLineNo">4429</span>  @Test<a name="line.4429"></a>
-<span class="sourceLineNo">4430</span>  public void testDurability() throws Exception {<a name="line.4430"></a>
-<span class="sourceLineNo">4431</span>    // there are 5 x 5 cases:<a name="line.4431"></a>
-<span class="sourceLineNo">4432</span>    // table durability(SYNC,FSYNC,ASYC,SKIP,USE_DEFAULT) x mutation<a name="line.4432"></a>
-<span class="sourceLineNo">4433</span>    // durability(SYNC,FSYNC,ASYC,SKIP,USE_DEFAULT)<a name="line.4433"></a>
-<span class="sourceLineNo">4434</span><a name="line.4434"></a>
-<span class="sourceLineNo">4435</span>    // expected cases for append and sync wal<a name="line.4435"></a>
-<span class="sourceLineNo">4436</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4436"></a>
-<span class="sourceLineNo">4437</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4437"></a>
-<span class="sourceLineNo">4438</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.USE_DEFAULT, 0, true, true, false);<a name="line.4438"></a>
-<span class="sourceLineNo">4439</span><a name="line.4439"></a>
-<span class="sourceLineNo">4440</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4440"></a>
-<span class="sourceLineNo">4441</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4441"></a>
-<span class="sourceLineNo">4442</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.USE_DEFAULT, 0, true, true, false);<a name="line.4442"></a>
-<span class="sourceLineNo">4443</span><a name="line.4443"></a>
-<span class="sourceLineNo">4444</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4444"></a>
-<span class="sourceLineNo">4445</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4445"></a>
-<span class="sourceLineNo">4446</span><a name="line.4446"></a>
-<span class="sourceLineNo">4447</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4447"></a>
-<span class="sourceLineNo">4448</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4448"></a>
+<span class="sourceLineNo">4429</span>    region.flush(true);<a name="line.4429"></a>
+<span class="sourceLineNo">4430</span>    get = new Get(row);<a name="line.4430"></a>
+<span class="sourceLineNo">4431</span>    get.addColumn(family, qualifier);<a name="line.4431"></a>
+<span class="sourceLineNo">4432</span>    get.readAllVersions();<a name="line.4432"></a>
+<span class="sourceLineNo">4433</span>    res = this.region.get(get);<a name="line.4433"></a>
+<span class="sourceLineNo">4434</span>    kvs = res.getColumnCells(family, qualifier);<a name="line.4434"></a>
+<span class="sourceLineNo">4435</span>    assertEquals(1, kvs.size());<a name="line.4435"></a>
+<span class="sourceLineNo">4436</span>    assertArrayEquals(Bytes.toBytes("value1"), CellUtil.cloneValue(kvs.get(0)));<a name="line.4436"></a>
+<span class="sourceLineNo">4437</span>  }<a name="line.4437"></a>
+<span class="sourceLineNo">4438</span><a name="line.4438"></a>
+<span class="sourceLineNo">4439</span>  @Test<a name="line.4439"></a>
+<span class="sourceLineNo">4440</span>  public void testDurability() throws Exception {<a name="line.4440"></a>
+<span class="sourceLineNo">4441</span>    // there are 5 x 5 cases:<a name="line.4441"></a>
+<span class="sourceLineNo">4442</span>    // table durability(SYNC,FSYNC,ASYC,SKIP,USE_DEFAULT) x mutation<a name="line.4442"></a>
+<span class="sourceLineNo">4443</span>    // durability(SYNC,FSYNC,ASYC,SKIP,USE_DEFAULT)<a name="line.4443"></a>
+<span class="sourceLineNo">4444</span><a name="line.4444"></a>
+<span class="sourceLineNo">4445</span>    // expected cases for append and sync wal<a name="line.4445"></a>
+<span class="sourceLineNo">4446</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4446"></a>
+<span class="sourceLineNo">4447</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4447"></a>
+<span class="sourceLineNo">4448</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.USE_DEFAULT, 0, true, true, false);<a name="line.4448"></a>
 <span class="sourceLineNo">4449</span><a name="line.4449"></a>
-<span class="sourceLineNo">4450</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4450"></a>
-<span class="sourceLineNo">4451</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4451"></a>
-<span class="sourceLineNo">4452</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.USE_DEFAULT, 0, true, true, false);<a name="line.4452"></a>
+<span class="sourceLineNo">4450</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4450"></a>
+<span class="sourceLineNo">4451</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4451"></a>
+<span class="sourceLineNo">4452</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.USE_DEFAULT, 0, true, true, false);<a name="line.4452"></a>
 <span class="sourceLineNo">4453</span><a name="line.4453"></a>
-<span class="sourceLineNo">4454</span>    // expected cases for async wal<a name="line.4454"></a>
-<span class="sourceLineNo">4455</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4455"></a>
-<span class="sourceLineNo">4456</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4456"></a>
-<span class="sourceLineNo">4457</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4457"></a>
-<span class="sourceLineNo">4458</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4458"></a>
-<span class="sourceLineNo">4459</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4459"></a>
-<span class="sourceLineNo">4460</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.USE_DEFAULT, 0, true, false, false);<a name="line.4460"></a>
-<span class="sourceLineNo">4461</span><a name="line.4461"></a>
-<span class="sourceLineNo">4462</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4462"></a>
-<span class="sourceLineNo">4463</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4463"></a>
-<span class="sourceLineNo">4464</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4464"></a>
-<span class="sourceLineNo">4465</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4465"></a>
-<span class="sourceLineNo">4466</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4466"></a>
-<span class="sourceLineNo">4467</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.USE_DEFAULT, 5000, true, false, true);<a name="line.4467"></a>
-<span class="sourceLineNo">4468</span><a name="line.4468"></a>
-<span class="sourceLineNo">4469</span>    // expect skip wal cases<a name="line.4469"></a>
-<span class="sourceLineNo">4470</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4470"></a>
-<span class="sourceLineNo">4471</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4471"></a>
-<span class="sourceLineNo">4472</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4472"></a>
-<span class="sourceLineNo">4473</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4473"></a>
-<span class="sourceLineNo">4474</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4474"></a>
-<span class="sourceLineNo">4475</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.USE_DEFAULT, 0, false, false, false);<a name="line.4475"></a>
-<span class="sourceLineNo">4476</span><a name="line.4476"></a>
-<span class="sourceLineNo">4477</span>  }<a name="line.4477"></a>
+<span class="sourceLineNo">4454</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4454"></a>
+<span class="sourceLineNo">4455</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4455"></a>
+<span class="sourceLineNo">4456</span><a name="line.4456"></a>
+<span class="sourceLineNo">4457</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4457"></a>
+<span class="sourceLineNo">4458</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4458"></a>
+<span class="sourceLineNo">4459</span><a name="line.4459"></a>
+<span class="sourceLineNo">4460</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4460"></a>
+<span class="sourceLineNo">4461</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4461"></a>
+<span class="sourceLineNo">4462</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.USE_DEFAULT, 0, true, true, false);<a name="line.4462"></a>
+<span class="sourceLineNo">4463</span><a name="line.4463"></a>
+<span class="sourceLineNo">4464</span>    // expected cases for async wal<a name="line.4464"></a>
+<span class="sourceLineNo">4465</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4465"></a>
+<span class="sourceLineNo">4466</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4466"></a>
+<span class="sourceLineNo">4467</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4467"></a>
+<span class="sourceLineNo">4468</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4468"></a>
+<span class="sourceLineNo">4469</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4469"></a>
+<span class="sourceLineNo">4470</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.USE_DEFAULT, 0, true, false, false);<a name="line.4470"></a>
+<span class="sourceLineNo">4471</span><a name="line.4471"></a>
+<span class="sourceLineNo">4472</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4472"></a>
+<span class="sourceLineNo">4473</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4473"></a>
+<span class="sourceLineNo">4474</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4474"></a>
+<span class="sourceLineNo">4475</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4475"></a>
+<span class="sourceLineNo">4476</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4476"></a>
+<span class="sourceLineNo">4477</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.USE_DEFAULT, 5000, true, false, true);<a name="line.4477"></a>
 <span class="sourceLineNo">4478</span><a name="line.4478"></a>
-<span class="sourceLineNo">4479</span>  private void durabilityTest(String method, Durability tableDurability,<a name="line.4479"></a>
-<span class="sourceLineNo">4480</span>      Durability mutationDurability, long timeout, boolean expectAppend, final boolean expectSync,<a name="line.4480"></a>
-<span class="sourceLineNo">4481</span>      final boolean expectSyncFromLogSyncer) throws Exception {<a name="line.4481"></a>
-<span class="sourceLineNo">4482</span>    Configuration conf = HBaseConfiguration.create(CONF);<a name="line.4482"></a>
-<span class="sourceLineNo">4483</span>    method = method + "_" + tableDurability.name() + "_" + mutationDurability.name();<a name="line.4483"></a>
-<span class="sourceLineNo">4484</span>    byte[] family = Bytes.toBytes("family");<a name="line.4484"></a>
-<span class="sourceLineNo">4485</span>    Path logDir = new Path(new Path(dir + method), "log");<a name="line.4485"></a>
-<span class="sourceLineNo">4486</span>    final Configuration walConf = new Configuration(conf);<a name="line.4486"></a>
-<span class="sourceLineNo">4487</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.4487"></a>
-<span class="sourceLineNo">4488</span>    // XXX: The spied AsyncFSWAL can not work properly because of a Mockito defect that can not<a name="line.4488"></a>
-<span class="sourceLineNo">4489</span>    // deal with classes which have a field of an inner class. See discussions in HBASE-15536.<a name="line.4489"></a>
-<span class="sourceLineNo">4490</span>    walConf.set(WALFactory.WAL_PROVIDER, "filesystem");<a name="line.4490"></a>
-<span class="sourceLineNo">4491</span>    final WALFactory wals = new WALFactory(walConf, TEST_UTIL.getRandomUUID().toString());<a name="line.4491"></a>
-<span class="sourceLineNo">4492</span>    final WAL wal = spy(wals.getWAL(RegionInfoBuilder.newBuilder(tableName).build()));<a name="line.4492"></a>
-<span class="sourceLineNo">4493</span>    this.region = initHRegion(tableName, HConstants.EMPTY_START_ROW,<a name="line.4493"></a>
-<span class="sourceLineNo">4494</span>        HConstants.EMPTY_END_ROW, false, tableDurability, wal,<a name="line.4494"></a>
-<span class="sourceLineNo">4495</span>        new byte[][] { family });<a name="line.4495"></a>
-<span class="sourceLineNo">4496</span><a name="line.4496"></a>
-<span class="sourceLineNo">4497</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.4497"></a>
-<span class="sourceLineNo">4498</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.4498"></a>
-<span class="sourceLineNo">4499</span>    put.setDurability(mutationDurability);<a name="line.4499"></a>
-<span class="sourceLineNo">4500</span>    region.put(put);<a name="line.4500"></a>
-<span class="sourceLineNo">4501</span><a name="line.4501"></a>
-<span class="sourceLineNo">4502</span>    //verify append called or not<a name="line.4502"></a>
-<span class="sourceLineNo">4503</span>    verify(wal, expectAppend ? times(1) : never())<a name="line.4503"></a>
-<span class="sourceLineNo">4504</span>      .append((HRegionInfo)any(), (WALKeyImpl)any(),<a name="line.4504"></a>
-<span class="sourceLineNo">4505</span>          (WALEdit)any(), Mockito.anyBoolean());<a name="line.4505"></a>
+<span class="sourceLineNo">4479</span>    // expect skip wal cases<a name="line.4479"></a>
+<span class="sourceLineNo">4480</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4480"></a>
+<span class="sourceLineNo">4481</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4481"></a>
+<span class="sourceLineNo">4482</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4482"></a>
+<span class="sourceLineNo">4483</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4483"></a>
+<span class="sourceLineNo">4484</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4484"></a>
+<span class="sourceLineNo">4485</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.USE_DEFAULT, 0, false, false, false);<a name="line.4485"></a>
+<span class="sourceLineNo">4486</span><a name="line.4486"></a>
+<span class="sourceLineNo">4487</span>  }<a name="line.4487"></a>
+<span class="sourceLineNo">4488</span><a name="line.4488"></a>
+<span class="sourceLineNo">4489</span>  private void durabilityTest(String method, Durability tableDurability,<a name="line.4489"></a>
+<span class="sourceLineNo">4490</span>      Durability mutationDurability, long timeout, boolean expectAppend, final boolean expectSync,<a name="line.4490"></a>
+<span class="sourceLineNo">4491</span>      final boolean expectSyncFromLogSyncer) throws Exception {<a name="line.4491"></a>
+<span class="sourceLineNo">4492</span>    Configuration conf = HBaseConfiguration.create(CONF);<a name="line.4492"></a>
+<span class="sourceLineNo">4493</span>    method = method + "_" + tableDurability.name() + "_" + mutationDurability.name();<a name="line.4493"></a>
+<span class="sourceLineNo">4494</span>    byte[] family = Bytes.toBytes("family");<a name="line.4494"></a>
+<span class="sourceLineNo">4495</span>    Path logDir = new Path(new Path(dir + method), "log");<a name="line.4495"></a>
+<span class="sourceLineNo">4496</span>    final Configuration walConf = new Configuration(conf);<a name="line.4496"></a>
+<span class="sourceLineNo">4497</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.4497"></a>
+<span class="sourceLineNo">4498</span>    // XXX: The spied AsyncFSWAL can not work properly because of a Mockito defect that can not<a name="line.4498"></a>
+<span class="sourceLineNo">4499</span>    // deal with classes which have a field of an inner class. See discussions in HBASE-15536.<a name="line.4499"></a>
+<span class="sourceLineNo">4500</span>    walConf.set(WALFactory.WAL_PROVIDER, "filesystem");<a name="line.4500"></a>
+<span class="sourceLineNo">4501</span>    final WALFactory wals = new WALFactory(walConf, TEST_UTIL.getRandomUUID().toString());<a name="line.4501"></a>
+<span class="sourceLineNo">4502</span>    final WAL wal = spy(wals.getWAL(RegionInfoBuilder.newBuilder(tableName).build()));<a name="line.4502"></a>
+<span class="sourceLineNo">4503</span>    this.region = initHRegion(tableName, HConstants.EMPTY_START_ROW,<a name="line.4503"></a>
+<span class="sourceLineNo">4504</span>        HConstants.EMPTY_END_ROW, false, tableDurability, wal,<a name="line.4504"></a>
+<span class="sourceLineNo">4505</span>        new byte[][] { family });<a name="line.4505"></a>
 <span class="sourceLineNo">4506</span><a name="line.4506"></a>
-<span class="sourceLineNo">4507</span>    // verify sync called or not<a name="line.4507"></a>
-<span class="sourceLineNo">4508</span>    if (expectSync || expectSyncFromLogSyncer) {<a name="line.4508"></a>
-<span class="sourceLineNo">4509</span>      TEST_UTIL.waitFor(timeout, new Waiter.Predicate&lt;Exception&gt;() {<a name="line.4509"></a>
-<span class="sourceLineNo">4510</span>        @Override<a name="line.4510"></a>
-<span class="sourceLineNo">4511</span>        public boolean evaluate() throws Exception {<a name="line.4511"></a>
-<span class="sourceLineNo">4512</span>          try {<a name="line.4512"></a>
-<span class="sourceLineNo">4513</span>            if (expectSync) {<a name="line.4513"></a>
-<span class="sourceLineNo">4514</span>              verify(wal, times(1)).sync(anyLong()); // Hregion calls this one<a name="line.4514"></a>
-<span class="sourceLineNo">4515</span>            } else if (expectSyncFromLogSyncer) {<a name="line.4515"></a>
-<span class="sourceLineNo">4516</span>              verify(wal, times(1)).sync(); // wal syncer calls this one<a name="line.4516"></a>
-<span class="sourceLineNo">4517</span>            }<a name="line.4517"></a>
-<span class="sourceLineNo">4518</span>          } catch (Throwable ignore) {<a name="line.4518"></a>
-<span class="sourceLineNo">4519</span>          }<a name="line.4519"></a>
-<span class="sourceLineNo">4520</span>          return true;<a name="line.4520"></a>
-<span class="sourceLineNo">4521</span>        }<a name="line.4521"></a>
-<span class="sourceLineNo">4522</span>      });<a name="line.4522"></a>
-<span class="sourceLineNo">4523</span>    } else {<a name="line.4523"></a>
-<span class="sourceLineNo">4524</span>      //verify(wal, never()).sync(anyLong());<a name="line.4524"></a>
-<span class="sourceLineNo">4525</span>      verify(wal, never()).sync();<a name="line.4525"></a>
-<span class="sourceLineNo">4526</span>    }<a name="line.4526"></a>
-<span class="sourceLineNo">4527</span><a name="line.4527"></a>
-<span class="sourceLineNo">4528</span>    HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.4528"></a>
-<span class="sourceLineNo">4529</span>    wals.close();<a name="line.4529"></a>
-<span class="sourceLineNo">4530</span>    this.region = null;<a name="line.4530"></a>
-<span class="sourceLineNo">4531</span>  }<a name="line.4531"></a>
-<span class="sourceLineNo">4532</span><a name="line.4532"></a>
-<span class="sourceLineNo">4533</span>  @Test<a name="line.4533"></a>
-<span class="sourceLineNo">4534</span>  public void testRegionReplicaSecondary() throws IOException {<a name="line.4534"></a>
-<span class="sourceLineNo">4535</span>    // create a primary region, load some data and flush<a name="line.4535"></a>
-<span class="sourceLineNo">4536</span>    // create a secondary region, and do a get against that<a name="line.4536"></a>
-<span class="sourceLineNo">4537</span>    Path rootDir = new Path(dir + name.getMethodName());<a name="line.4537"></a>
-<span class="sourceLineNo">4538</span>    FSUtils.setRootDir(TEST_UTIL.getConfiguration(), rootDir);<a name="line.4538"></a>
-<span class="sourceLineNo">4539</span><a name="line.4539"></a>
-<span class="sourceLineNo">4540</span>    byte[][] families = new byte[][] {<a name="line.4540"></a>
-<span class="sourceLineNo">4541</span>        Bytes.toBytes("cf1"), Bytes.toBytes("cf2"), Bytes.toBytes("cf3")<a name="line.4541"></a>
-<span class="sourceLineNo">4542</span>    };<a name="line.4542"></a>
-<span class="sourceLineNo">4543</span>    byte[] cq = Bytes.toBytes("cq");<a name="line.4543"></a>
-<span class="sourceLineNo">4544</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.4544"></a>
-<span class="sourceLineNo">4545</span>    for (byte[] family : families) {<a name="line.4545"></a>
-<span class="sourceLineNo">4546</span>      htd.addFamily(new HColumnDescriptor(family));<a name="line.4546"></a>
-<span class="sourceLineNo">4547</span>    }<a name="line.4547"></a>
-<span class="sourceLineNo">4548</span><a name="line.4548"></a>
-<span class="sourceLineNo">4549</span>    long time = System.currentTimeMillis();<a name="line.4549"></a>
-<span class="sourceLineNo">4550</span>    HRegionInfo primaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4550"></a>
-<span class="sourceLineNo">4551</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4551"></a>
-<span class="sourceLineNo">4552</span>      false, time, 0);<a name="line.4552"></a>
-<span class="sourceLineNo">4553</span>    HRegionInfo secondaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4553"></a>
-<span class="sourceLineNo">4554</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4554"></a>
-<span class="sourceLineNo">4555</span>      false, time, 1);<a name="line.4555"></a>
-<span class="sourceLineNo">4556</span><a name="line.4556"></a>
-<span class="sourceLineNo">4557</span>    HRegion primaryRegion = null, secondaryRegion = null;<a name="line.4557"></a>
+<span class="sourceLineNo">4507</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.4507"></a>
+<span class="sourceLineNo">4508</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.4508"></a>
+<span class="sourceLineNo">4509</span>    put.setDurability(mutationDurability);<a name="line.4509"></a>
+<span class="sourceLineNo">4510</span>    region.put(put);<a name="line.4510"></a>
+<span class="sourceLineNo">4511</span><a name="line.4511"></a>
+<span class="sourceLineNo">4512</span>    //verify append called or not<a name="line.4512"></a>
+<span class="sourceLineNo">4513</span>    verify(wal, expectAppend ? times(1) : never())<a name="line.4513"></a>
+<span class="sourceLineNo">4514</span>      .append((HRegionInfo)any(), (WALKeyImpl)any(),<a name="line.4514"></a>
+<span class="sourceLineNo">4515</span>          (WALEdit)any(), Mockito.anyBoolean());<a name="line.4515"></a>
+<span class="sourceLineNo">4516</span><a name="line.4516"></a>
+<span class="sourceLineNo">4517</span>    // verify sync called or not<a name="line.4517"></a>
+<span class="sourceLineNo">4518</span>    if (expectSync || expectSyncFromLogSyncer) {<a name="line.4518"></a>
+<span class="sourceLineNo">4519</span>      TEST_UTIL.waitFor(timeout, new Waiter.Predicate&lt;Exception&gt;() {<a name="line.4519"></a>
+<span class="sourceLineNo">4520</span>        @Override<a name="line.4520"></a>
+<span class="sourceLineNo">4521</span>        public boolean evaluate() throws Exception {<a name="line.4521"></a>
+<span class="sourceLineNo">4522</span>          try {<a name="line.4522"></a>
+<span class="sourceLineNo">4523</span>            if (expectSync) {<a name="line.4523"></a>
+<span class="sourceLineNo">4524</span>              verify(wal, times(1)).sync(anyLong()); // Hregion calls this one<a name="line.4524"></a>
+<span class="sourceLineNo">4525</span>            } else if (expectSyncFromLogSyncer) {<a name="line.4525"></a>
+<span class="sourceLineNo">4526</span>              verify(wal, times(1)).sync(); // wal syncer calls this one<a name="line.4526"></a>
+<span class="sourceLineNo">4527</span>            }<a name="line.4527"></a>
+<span class="sourceLineNo">4528</span>          } catch (Throwable ignore) {<a name="line.4528"></a>
+<span class="sourceLineNo">4529</span>          }<a name="line.4529"></a>
+<span class="sourceLineNo">4530</span>          return true;<a name="line.4530"></a>
+<span class="sourceLineNo">4531</span>        }<a name="line.4531"></a>
+<span class="sourceLineNo">4532</span>      });<a name="line.4532"></a>
+<span class="sourceLineNo">4533</span>    } else {<a name="line.4533"></a>
+<span class="sourceLineNo">4534</span>      //verify(wal, never()).sync(anyLong());<a name="line.4534"></a>
+<span class="sourceLineNo">4535</span>      verify(wal, never()).sync();<a name="line.4535"></a>
+<span class="sourceLineNo">4536</span>    }<a name="line.4536"></a>
+<span class="sourceLineNo">4537</span><a name="line.4537"></a>
+<span class="sourceLineNo">4538</span>    HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.4538"></a>
+<span class="sourceLineNo">4539</span>    wals.close();<a name="line.4539"></a>
+<span class="sourceLineNo">4540</span>    this.region = null;<a name="line.4540"></a>
+<span class="sourceLineNo">4541</span>  }<a name="line.4541"></a>
+<span class="sourceLineNo">4542</span><a name="line.4542"></a>
+<span class="sourceLineNo">4543</span>  @Test<a name="line.4543"></a>
+<span class="sourceLineNo">4544</span>  public void testRegionReplicaSecondary() throws IOException {<a name="line.4544"></a>
+<span class="sourceLineNo">4545</span>    // create a primary region, load some data and flush<a name="line.4545"></a>
+<span class="sourceLineNo">4546</span>    // create a secondary region, and do a get against that<a name="line.4546"></a>
+<span class="sourceLineNo">4547</span>    Path rootDir = new Path(dir + name.getMethodName());<a name="line.4547"></a>
+<span class="sourceLineNo">4548</span>    FSUtils.setRootDir(TEST_UTIL.getConfiguration(), rootDir);<a name="line.4548"></a>
+<span class="sourceLineNo">4549</span><a name="line.4549"></a>
+<span class="sourceLineNo">4550</span>    byte[][] families = new byte[][] {<a name="line.4550"></a>
+<span class="sourceLineNo">4551</span>        Bytes.toBytes("cf1"), Bytes.toBytes("cf2"), Bytes.toBytes("cf3")<a name="line.4551"></a>
+<span class="sourceLineNo">4552</span>    };<a name="line.4552"></a>
+<span class="sourceLineNo">4553</span>    byte[] cq = Bytes.toBytes("cq");<a name="line.4553"></a>
+<span class="sourceLineNo">4554</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.4554"></a>
+<span class="sourceLineNo">4555</span>    for (byte[] family : families) {<a name="line.4555"></a>
+<span class="sourceLineNo">4556</span>      htd.addFamily(new HColumnDescriptor(family));<a name="line.4556"></a>
+<span class="sourceLineNo">4557</span>    }<a name="line.4557"></a>
 <span class="sourceLineNo">4558</span><a name="line.4558"></a>
-<span class="sourceLineNo">4559</span>    try {<a name="line.4559"></a>
-<span class="sourceLineNo">4560</span>      primaryRegion = HBaseTestingUtility.createRegionAndWAL(primaryHri,<a name="line.4560"></a>
-<span class="sourceLineNo">4561</span>          rootDir, TEST_UTIL.getConfiguration(), htd);<a name="line.4561"></a>
-<span class="sourceLineNo">4562</span><a name="line.4562"></a>
-<span class="sourceLineNo">4563</span>      // load some data<a name="line.4563"></a>
-<span class="sourceLineNo">4564</span>      putData(primaryRegion, 0, 1000, cq, families);<a name="line.4564"></a>
-<span class="sourceLineNo">4565</span><a name="line.4565"></a>
-<span class="sourceLineNo">4566</span>      // flush region<a name="line.4566"></a>
-<span class="sourceLineNo">4567</span>      primaryRegion.flush(true);<a name="line.4567"></a>
+<span class="sourceLineNo">4559</span>    long time = System.currentTimeMillis();<a name="line.4559"></a>
+<span class="sourceLineNo">4560</span>    HRegionInfo primaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4560"></a>
+<span class="sourceLineNo">4561</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4561"></a>
+<span class="sourceLineNo">4562</span>      false, time, 0);<a name="line.4562"></a>
+<span class="sourceLineNo">4563</span>    HRegionInfo secondaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4563"></a>
+<span class="sourceLineNo">4564</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4564"></a>
+<span class="sourceLineNo">4565</span>      false, time, 1);<a name="line.4565"></a>
+<span class="sourceLineNo">4566</span><a name="line.4566"></a>
+<span class="sourceLineNo">4567</span>    HRegion primaryRegion = null, secondaryRegion = null;<a name="line.4567"></a>
 <span class="sourceLineNo">4568</span><a name="line.4568"></a>
-<span class="sourceLineNo">4569</span>      // open secondary region<a name="line.4569"></a>
-<span class="sourceLineNo">4570</span>      secondaryRegion = HRegion.openHRegion(rootDir, secondaryHri, htd, null, CONF);<a name="line.4570"></a>
-<span class="sourceLineNo">4571</span><a name="line.4571"></a>
-<span class="sourceLineNo">4572</span>      verifyData(secondaryRegion, 0, 1000, cq, families);<a name="line.4572"></a>
-<span class="sourceLineNo">4573</span>    } finally {<a name="line.4573"></a>
-<span class="sourceLineNo">4574</span>      if (primaryRegion != null) {<a name="line.4574"></a>
-<span class="sourceLineNo">4575</span>        HBaseTestingUtility.closeRegionAndWAL(primaryRegion);<a name="line.4575"></a>
-<span class="sourceLineNo">4576</span>      }<a name="line.4576"></a>
-<span class="sourceLineNo">4577</span>      if (secondaryRegion != null) {<a name="line.4577"></a>
-<span class="sourceLineNo">4578</span>        HBaseTestingUtility.closeRegionAndWAL(secondaryRegion);<a name="line.4578"></a>
-<span class="sourceLineNo">4579</span>      }<a name="line.4579"></a>
-<span class="sourceLineNo">4580</span>    }<a name="line.4580"></a>
-<span class="sourceLineNo">4581</span>  }<a name="line.4581"></a>
-<span class="sourceLineNo">4582</span><a name="line.4582"></a>
-<span class="sourceLineNo">4583</span>  @Test<a name="line.4583"></a>
-<span class="sourceLineNo">4584</span>  public void testRegionReplicaSecondaryIsReadOnly() throws IOException {<a name="line.4584"></a>
-<span class="sourceLineNo">4585</span>    // create a primary region, load some data and flush<a name="line.4585"></a>
-<span class="sourceLineNo">4586</span>    // create a secondary region, and do a put against that<a name="line.4586"></a>
-<span class="sourceLineNo">4587</span>    Path rootDir = new Path(dir + name.getMethodName());<a name="line.4587"></a>
-<span class="sourceLineNo">4588</span>    FSUtils.setRootDir(TEST_UTIL.getConfiguration(), rootDir);<a name="line.4588"></a>
-<span class="sourceLineNo">4589</span><a name="line.4589"></a>
-<span class="sourceLineNo">4590</span>    byte[][] families = new byte[][] {<a name="line.4590"></a>
-<span class="sourceLineNo">4591</span>        Bytes.toBytes("cf1"), Bytes.toBytes("cf2"), Bytes.toBytes("cf3")<a name="line.4591"></a>
-<span class="sourceLineNo">4592</span>    };<a name="line.4592"></a>
-<span class="sourceLineNo">4593</span>    byte[] cq = Bytes.toBytes("cq");<a name="line.4593"></a>
-<span class="sourceLineNo">4594</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.4594"></a>
-<span class="sourceLineNo">4595</span>    for (byte[] family : families) {<a name="line.4595"></a>
-<span class="sourceLineNo">4596</span>      htd.addFamily(new HColumnDescriptor(family));<a name="line.4596"></a>
-<span class="sourceLineNo">4597</span>    }<a name="line.4597"></a>
-<span class="sourceLineNo">4598</span><a name="line.4598"></a>
-<span class="sourceLineNo">4599</span>    long time = System.currentTimeMillis();<a name="line.4599"></a>
-<span class="sourceLineNo">4600</span>    HRegionInfo primaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4600"></a>
-<span class="sourceLineNo">4601</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4601"></a>
-<span class="sourceLineNo">4602</span>      false, time, 0);<a name="line.4602"></a>
-<span class="sourceLineNo">4603</span>    HRegionInfo secondaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4603"></a>
-<span class="sourceLineNo">4604</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4604"></a>
-<span class="sourceLineNo">4605</span>      false, time, 1);<a name="line.4605"></a>
-<span class="sourceLineNo">4606</span><a name="line.4606"></a>
-<span class="sourceLineNo">4607</span>    HRegion primaryRegion = null, secondaryRegion = null;<a name="line.4607"></a>
+<span class="sourceLineNo">4569</span>    try {<a name="line.4569"></a>
+<span class="sourceLineNo">4570</span>      primaryRegion = HBaseTestingUtility.createRegionAndWAL(primaryHri,<a name="line.4570"></a>
+<span class="sourceLineNo">4571</span>          rootDir, TEST_UTIL.getConfiguration(), htd);<a name="line.4571"></a>
+<span class="sourceLineNo">4572</span><a name="line.4572"></a>
+<span class="sourceLineNo">4573</span>      // load some data<a name="line.4573"></a>
+<span class="sourceLineNo">4574</span>      putData(primaryRegion, 0, 1000, cq, families);<a name="line.4574"></a>
+<span class="sourceLineNo">4575</span><a name="line.4575"></a>
+<span class="sourceLineNo">4576</span>      // flush region<a name="line.4576"></a>
+<span class="sourceLineNo">4577</span>      primaryRegion.flush(true);<a name="line.4577"></a>
+<span class="sourceLineNo">4578</span><a name="line.4578"></a>
+<span class="sourceLineNo">4579</span>      // open secondary region<a name="line.4579"></a>
+<span class="sourceLineNo">4580</span>      secondaryRegion = HRegion.openHRegion(rootDir, secondaryHri, htd, null, CONF);<a name="line.4580"></a>
+<span class="sourceLineNo">4581</span><a name="line.4581"></a>
+<span class="sourceLineNo">4582</span>      verifyData(secondaryRegion, 0, 1000, cq, families);<a name="line.4582"></a>
+<span class="sourceLineNo">4583</span>    } finally {<a name="line.4583"></a>
+<span class="sourceLineNo">4584</span>      if (primaryRegion != null) {<a name="line.4584"></a>
+<span class="sourceLineNo">4585</span>        HBaseTestingUtility.closeRegionAndWAL(primaryRegion);<a name="line.4585"></a>
+<span class="sourceLineNo">4586</span>      }<a name="line.4586"></a>
+<span class="sourceLineNo">4587</span>      if (secondaryRegion != null) {<a name="line.4587"></a>
+<span class="sourceLineNo">4588</span>        HBaseTestingUtility.closeRegionAndWAL(secondaryRegion);<a name="line.4588"></a>
+<span class="sourceLineNo">4589</span>      }<a name="line.4589"></a>
+<span class="sourceLineNo">4590</span>    }<a name="line.4590"></a>
+<span class="sourceLineNo">4591</span>  }<a name="line.4591"></a>
+<span class="sourceLineNo">4592</span><a name="line.4592"></a>
+<span class="sourceLineNo">4593</span>  @Test<a name="line.4593"></a>
+<span class="sourceLineNo">4594</span>  public void testRegionReplicaSecondaryIsReadOnly() throws IOException {<a name="line.4594"></a>
+<span class="sourceLineNo">4595</span>    // create a primary region, load some data and flush<a name="line.4595"></a>
+<span class="sourceLineNo">4596</span>    // create a secondary region, and do a put against that<a name="line.4596"></a>
+<span class="sourceLineNo">4597</span>    Path rootDir = new Path(dir + name.getMethodName());<a name="line.4597"></a>
+<span class="sourceLineNo">4598</span>    FSUtils.setRootDir(TEST_UTIL.getConfiguration(), rootDir);<a name="line.4598"></a>
+<span class="sourceLineNo">4599</span><a name="line.4599"></a>
+<span class="sourceLineNo">4600</span>    byte[][] families = new byte[][] {<a name="line.4600"></a>
+<span class="sourceLineNo">4601</span>        Bytes.toBytes("cf1"), Bytes.toBytes("cf2"), Bytes.toBytes("cf3")<a name="line.4601"></a>
+<span class="sourceLineNo">4602</span>    };<a name="line.4602"></a>
+<span class="sourceLineNo">4603</span>    byte[] cq = Bytes.toBytes("cq");<a name="line.4603"></a>
+<span class="sourceLineNo">4604</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.4604"></a>
+<span class="sourceLineNo">4605</span>    for (byte[] family : families) {<a name="line.4605"></a>
+<span class="sourceLineNo">4606</span>      htd.addFamily(new HColumnDescriptor(family));<a name="line.4606"></a>
+<span class="sourceLineNo">4607</span>    }<a name="line.4607"></a>
 <span class="sourceLineNo">4608</span><a name="line.4608"></a>
-<span class="sourceLineNo">4609</span>    try {<a name="line.4609"></a>
-<span class="sourceLineNo">4610</span>      primaryRegion = HBaseTestingUtility.createRegionAndWAL(primaryHri,<a name="line.4610"></a>
-<span class="sourceLineNo">4611</span>          rootDir, TEST_UTIL.getConfiguration(), htd);<a name="line.4611"></a>
-<span class="sourceLineNo">4612</span><a name="line.4612"></a>
-<span class="sourceLineNo">4613</span>      // load some data<a name="line.4613"></a>
-<span class="sourceLineNo">4614</span>      putData(primaryRegion, 0, 1000, cq, families);<a name="line.4614"></a>
-<span class="sourceLineNo">4615</span><a name="line.4615"></a>
-<span class="sourceLineNo">4616</span>      // flush region<a name="line.4616"></a>
-<span class="sourceLineNo">4617</span>      primaryRegion.flush(true);<a name="line.4617"></a>
+<span class="sourceLineNo">4609</span>    long time = System.currentTimeMillis();<a name="line.4609"></a>
+<span class="sourceLineNo">4610</span>    HRegionInfo primaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4610"></a>
+<span class="sourceLineNo">4611</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4611"></a>
+<span class="sourceLineNo">4612</span>      false, time, 0);<a name="line.4612"></a>
+<span class="sourceLineNo">4613</span>    HRegionInfo secondaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4613"></a>
+<span class="sourceLineNo">4614</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4614"></a>
+<span class="sourceLineNo">4615</span>      false, time, 1);<a name="line.4615"></a>
+<span class="sourceLineNo">4616</span><a name="line.4616"></a>
+<span class="sourceLineNo">4617</span>    HRegion primaryRegion = null, secondaryRegion = null;<a name="line.4617"></a>
 <span class="sourceLineNo">4618</span><a name="line.4618"></a>
-<span class="sourceLineNo">4619</span>      // open secondary region<a name="line.4619"></a>
-<span class="sourceLineNo">4620</span>      secondaryRegion = HRegion.openHRegion(rootDir, secondaryHri, htd, null, CONF);<a name="line.4620"></a>
-<span class="sourceLineNo">4621</span><a name="line.4621"></a>
-<span class="sourceLineNo">4622</span>      try {<a name="line.4622"></a>
-<span class="sourceLineNo">4623</span>        putData(secondaryRegion, 0, 1000, cq, families);<a name="line.4623"></a>
-<span class="sourceLineNo">4624</span>        fail("Should have thrown exception");<a name="line.4624"></a>
-<span class="sourceLineNo">4625</span>      } catch (IOException ex) {<a name="line.4625"></a>
-<span class="sourceLineNo">4626</span>        // expected<a name="line.4626"></a>
-<span class="sourceLineNo">4627</span>      }<a name="line.4627"></a>
-<span class="sourceLineNo">4628</span>    } finally {<a name="line.4628"></a>
-<span class="sourceLineNo">4629</span>      if (primaryRegion != null) {<a name="line.4629"></a>
-<span class="sourceLineNo">4630</span>        HBaseTestingUtility.closeRegionAndWAL(primaryRegion);<a name="line.4630"></a>
-<span class="sourceLineNo">4631</span>      }<a name="line.4631"></a>
-<span class="sourceLineNo">4632</span>      if (secondaryRegion != null) {<a name="line.4632"></a>
-<span class="sourceLineNo">4633</span>        HBaseTestingUtility.closeRegionAndWAL(secondaryRegion);<a name="line.4633"></a>
-<span class="sourceLineNo">4634</span>      }<a name="line.4634"></a>
-<span class="sourceLineNo">4635</span>    }<a name="line.4635"></a>
-<span class="sourceLineNo">4636</span>  }<a name="line.4636"></a>
-<span class="sourceLineNo">4637</span><a name="line.4637"></a>
-<span class="sourceLineNo">4638</span>  static WALFactory createWALFactory(Configuration conf, Path rootDir) throws IOException {<a name="line.4638"></a>
-<span class="sourceLineNo">4639</span>    Configuration confForWAL = new Configuration(conf);<a name="line.4639"></a>
-<span class="sourceLineNo">4640</span>    confForWAL.set(HConstants.HBASE_DIR, rootDir.toString());<a name="line.4640"></a>
-<span class="sourceLineNo">4641</span>    return new WALFactory(confForWAL, "hregion-" + RandomStringUtils.randomNumeric(8));<a name="line.4641"></a>
-<span class="sourceLineNo">4642</span>  }<a name="line.4642"></a>
-<span class="sourceLineNo">4643</span><a name="line.4643"></a>
-<span class="sourceLineNo">4644</span>  @Test<a name="line.4644"></a>
-<span class="sourceLineNo">4645</span>  public void testCompactionFromPrimary() throws IOException {<a name="line.4645"></a>
-<span class="sourceLineNo">4646</span>    Path rootDir = new Path(dir + name.getMethodName());<a name="line.4646"></a>
-<span class="sourceLineNo">4647</span>    FSUtils.setRootDir(TEST_UTIL.getConfiguration(), rootDir);<a name="line.4647"></a>
-<span class="sourceLineNo">4648</span><a name="line.4648"></a>
-<span class="sourceLineNo">4649</span>    byte[][] families = new byte[][] {<a name="line.4649"></a>
-<span class="sourceLineNo">4650</span>        Bytes.toBytes("cf1"), Bytes.toBytes("cf2"), Bytes.toBytes("cf3")<a name="line.4650"></a>
-<span class="sourceLineNo">4651</span>    };<a name="line.4651"></a>
-<span class="sourceLineNo">4652</span>    byte[] cq = Bytes.toBytes("cq");<a name="line.4652"></a>
-<span class="sourceLineNo">4653</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.4653"></a>
-<span class="sourceLineNo">4654</span>    for (byte[] family : families) {<a name="line.4654"></a>
-<span class="sourceLineNo">4655</span>      htd.addFamily(new HColumnDescriptor(family));<a name="line.4655"></a>
-<span class="sourceLineNo">4656</span>    }<a name="line.4656"></a>
-<span class="sourceLineNo">4657</span><a name="line.4657"></a>
-<span class="sourceLineNo">4658</span>    long time = System.currentTimeMillis();<a name="line.4658"></a>
-<span class="sourceLineNo">4659</span>    HRegionInfo primaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4659"></a>
-<span class="sourceLineNo">4660</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4660"></a>
-<span class="sourceLineNo">4661</span>      false, time, 0);<a name="line.4661"></a>
-<span class="sourceLineNo">4662</span>    HRegionInfo secondaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4662"></a>
-<span class="sourceLineNo">4663</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4663"></a>
-<span class="sourceLineNo">4664</span>      false, time, 1);<a name="line.4664"></a>
-<span class="sourceLineNo">4665</span><a name="line.4665"></a>
-<span class="sourceLineNo">4666</span>    HRegion primaryRegion = null, secondaryRegion = null;<a name="line.4666"></a>
+<span class="sourceLineNo">4619</span>    try {<a name="line.4619"></a>
+<span class="sourceLineNo">4620</span>      primaryRegion = HBaseTestingUtility.createRegionAndWAL(primaryHri,<a name="line.4620"></a>
+<span class="sourceLineNo">4621</span>          rootDir, TEST_UTIL.getConfiguration(), htd);<a name="line.4621"></a>
+<span class="sourceLineNo">4622</span><a name="line.4622"></a>
+<span class="sourceLineNo">4623</span>      // load some data<a name="line.4623"></a>
+<span class="sourceLineNo">4624</span>      putData(primaryRegion, 0, 1000, cq, families);<a name="line.4624"></a>
+<span class="sourceLineNo">4625</span><a name="line.4625"></a>
+<span class="sourceLineNo">4626</span>      // flush region<a name="line.4626"></a>
+<span class="sourceLineNo">4627</span>      primaryRegion.flush(true);<a name="line.4627"></a>
+<span class="sourceLineNo">4628</span><a name="line.4628"></a>
+<span class="sourceLineNo">4629</span>      // open secondary region<a name="line.4629"></a>
+<span class="sourceLineNo">4630</span>      secondaryRegion = HRegion.openHRegion(rootDir, secondaryHri, htd, null, CONF);<a name="line.4630"></a>
+<span class="sourceLineNo">4631</span><a name="line.4631"></a>
+<span class="sourceLineNo">4632</span>      try {<a name="line.4632"></a>
+<span class="sourceLineNo">4633</span>        putData(secondaryRegion, 0, 1000, cq, families);<a name="line.4633"></a>
+<span class="sourceLineNo">4634</span>        fail("Should have thrown exception");<a name="line.4634"></a>
+<span class="sourceLineNo">4635</span>      } catch (IOException ex) {<a name="line.4635"></a>
+<span class="sourceLineNo">4636</span>        // expected<a name="line.4636"></a>
+<span class="sourceLineNo">4637</span>      }<a name="line.4637"></a>
+<span class="sourceLineNo">4638</span>    } finally {<a name="line.4638"></a>
+<span class="sourceLineNo">4639</span>      if (primaryRegion != null) {<a name="line.4639"></a>
+<span class="sourceLineNo">4640</span>        HBaseTestingUtility.closeRegionAndWAL(primaryRegion);<a name="line.4640"></a>
+<span class="sourceLineNo">4641</span>      }<a name="line.4641"></a>
+<span class="sourceLineNo">4642</span>      if (secondaryRegion != null) {<a name="line.4642"></a>
+<span class="sourceLineNo">4643</span>        HBaseTestingUtility.closeRegionAndWAL(secondaryRegion);<a name="line.4643"></a>
+<span class="sourceLineNo">4644</span>      }<a name="line.4644"></a>
+<span class="sourceLineNo">4645</span>    }<a name="line.4645"></a>
+<span class="sourceLineNo">4646</span>  }<a name="line.4646"></a>
+<span class="sourceLineNo">4647</span><a name="line.4647"></a>
+<span class="sourceLineNo">4648</span>  static WALFactory createWALFactory(Configuration conf, Path rootDir) throws IOException {<a name="line.4648"></a>
+<span class="sourceLineNo">4649</span>    Configuration confForWAL = new Configuration(conf);<a name="line.4649"></a>
+<span class="sourceLineNo">4650</span>    confForWAL.set(HConstants.HBASE_DIR, rootDir.toString());<a name="line.4650"></a>
+<span class="sourceLineNo">4651</span>    return new WALFactory(confForWAL, "hregion-" + RandomStringUtils.randomNumeric(8));<a name="line.4651"></a>
+<span class="sourceLineNo">4652</span>  }<a name="line.4652"></a>
+<span class="sourceLineNo">4653</span><a name="line.4653"></a>
+<span class="sourceLineNo">4654</span>  @Test<a name="line.4654"></a>
+<span class="sourceLineNo">4655</span>  public void testCompactionFromPrimary() throws IOException {<a name="line.4655"></a>
+<span class="sourceLineNo">4656</span>    Path rootDir = new Path(dir + name.getMethodName());<a name="line.4656"></a>
+<span class="sourceLineNo">4657</span>    FSUtils.setRootDir(TEST_UTIL.getConfiguration(), rootDir);<a name="line.4657"></a>
+<span class="sourceLineNo">4658</span><a name="line.4658"></a>
+<span class="sourceLineNo">4659</span>    byte[][] families = new byte[][] {<a name="line.4659"></a>
+<span class="sourceLineNo">4660</span>        Bytes.toBytes("cf1"), Bytes.toBytes("cf2"), Bytes.toBytes("cf3")<a name="line.4660"></a>
+<span class="sourceLineNo">4661</span>    };<a name="line.4661"></a>
+<span class="sourceLineNo">4662</span>    byte[] cq = Bytes.toBytes("cq");<a name="line.4662"></a>
+<span class="sourceLineNo">4663</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.4663"></a>
+<span class="sourceLineNo">4664</span>    for (byte[] family : families) {<a name="line.4664"></a>
+<span class="sourceLineNo">4665</span>      htd.addFamily(new HColumnDescriptor(family));<a name="line.4665"></a>
+<span class="sourceLineNo">4666</span>    }<a name="line.4666"></a>
 <span class="sourceLineNo">4667</span><a name="line.4667"></a>
-<span class="sourceLineNo">4668</span>    try {<a name="line.4668"></a>
-<span class="sourceLineNo">4669</span>      primaryRegion = HBaseTestingUtility.createRegionAndWAL(primaryHri,<a name="line.4669"></a>
-<span class="sourceLineNo">4670</span>          rootDir, TEST_UTIL.getConfiguration(), htd);<a name="line.4670"></a>
-<span class="sourceLineNo">4671</span><a name="line.4671"></a>
-<span class="sourceLineNo">4672</span>      // load some data<a name="line.4672"></a>
-<span class="sourceLineNo">4673</span>      putData(primaryRegion, 0, 1000, cq, families);<a name="line.4673"></a>
-<span class="sourceLineNo">4674</span><a name="line.4674"></a>
-<span class="sourceLineNo">4675</span>      // flush region<a name="line.4675"></a>
-<span class="sourceLineNo">4676</span>      primaryRegion.flush(true);<a name="line.4676"></a>
+<span class="sourceLineNo">4668</span>    long time = System.currentTimeMillis();<a name="line.4668"></a>
+<span class="sourceLineNo">4669</span>    HRegionInfo primaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4669"></a>
+<span class="sourceLineNo">4670</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4670"></a>
+<span class="sourceLineNo">4671</span>      false, time, 0);<a name="line.4671"></a>
+<span class="sourceLineNo">4672</span>    HRegionInfo secondaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4672"></a>
+<span class="sourceLineNo">4673</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4673"></a>
+<span class="sourceLineNo">4674</span>      false, time, 1);<a name="line.4674"></a>
+<span class="sourceLineNo">4675</span><a name="line.4675"></a>
+<span class="sourceLineNo">4676</span>    HRegion primaryRegion = null, secondaryRegion = null;<a name="line.4676"></a>
 <span class="sourceLineNo">4677</span><a name="line.4677"></a>
-<span class="sourceLineNo">4678</span>      // open secondary region<a name="line.4678"></a>
-<span class="sourceLineNo">4679</span>      secondaryRegion = HRegion.openHRegion(rootDir, secondaryHri, htd, null, CONF);<a name="line.4679"></a>
-<span class="sourceLineNo">4680</span><a name="line.4680"></a>
-<span class="sourceLineNo">4681</span>      // move the file of the primary region to the archive, simulating a compaction<a name="line.4681"></a>
-<span class="sourceLineNo">4682</span>      Collection&lt;HStoreFile&gt; storeFiles = primaryRegion.getStore(families[0]).getStorefiles();<a name="line.4682"></a>
-<span class="sourceLineNo">4683</span>      primaryRegion.getRegionFileSystem().removeStoreFiles(Bytes.toString(families[0]), storeFiles);<a name="line.4683"></a>
-<span class="sourceLineNo">4684</span>      Collection&lt;StoreFileInfo&gt; storeFileInfos = primaryRegion.getRegionFileSystem()<a name="line.4684"></a>
-<span class="sourceLineNo">4685</span>          .getStoreFiles(families[0]);<a name="line.4685"></a>
-<span class="sourceLineNo">4686</span>      Assert.assertTrue(storeFileInfos == null || storeFileInfos.isEmpty());<a name="line.4686"></a>
+<span class="sourceLineNo">4678</span>    try {<a name="line.4678"></a>
+<span class="sourceLineNo">4679</span>      primaryRegion = HBaseTestingUtility.createRegionAndWAL(primaryHri,<a name="line.4679"></a>
+<span class="sourceLineNo">4680</span>          rootDir, TEST_UTIL.getConfiguration(), htd);<a name="line.4680"></a>
+<span class="sourceLineNo">4681</span><a name="line.4681"></a>
+<span class="sourceLineNo">4682</span>      // load some data<a name="line.4682"></a>
+<span class="sourceLineNo">4683</span>      putData(primaryRegion, 0, 1000, cq, families);<a name="line.4683"></a>
+<span class="sourceLineNo">4684</span><a name="line.4684"></a>
+<span class="sourceLineNo">4685</span>      // flush region<a name="line.4685"></a>
+<span class="sourceLineNo">4686</span>      primaryRegion.flush(true);<a name="line.4686"></a>
 <span class="sourceLineNo">4687</span><a name="line.4687"></a>
-<span class="sourceLineNo">4688</span>      verifyData(secondaryRegion, 0, 1000, cq, families);<a name="line.4688"></a>
-<span class="sourceLineNo">4689</span>    } finally {<a name="line.4689"></a>
-<span class="sourceLineNo">4690</span>      if (primaryRegion != null) {<a name="line.4690"></a>
-<span class="sourceLineNo">4691</span>        HBaseTestingUtility.closeRegionAndWAL(primaryRegion);<a name="line.4691"></a>
-<span class="sourceLineNo">4692</span>      }<a name="line.4692"></a>
-<span class="sourceLineNo">4693</span>      if (secondaryRegion != null) {<a name="line.4693"></a>
-<span class="sourceLineNo">4694</span>        HBaseTestingUtility.closeRegionAndWAL(secondaryRegion);<a name="line.4694"></a>
-<span class="sourceLineNo">4695</span>      }<a name="line.4695"></a>
-<span class="sourceLineNo">4696</span>    }<a name="line.4696"></a>
-<span class="sourceLineNo">4697</span>  }<a name="line.4697"></a>
-<span class="sourceLineNo">4698</span><a name="line.4698"></a>
-<span class="sourceLineNo">4699</span>  private void putData(int startRow, int numRows, byte[] qf, byte[]... families) throws<a name="line.4699"></a>
-<span class="sourceLineNo">4700</span>      IOException {<a name="line.4700"></a>
-<span class="sourceLineNo">4701</span>    putData(this.region, startRow, numRows, qf, families);<a name="line.4701"></a>
-<span class="sourceLineNo">4702</span>  }<a name="line.4702"></a>
-<span class="sourceLineNo">4703</span><a name="line.4703"></a>
-<span class="sourceLineNo">4704</span>  private void putData(HRegion region,<a name="line.4704"></a>
-<span class="sourceLineNo">4705</span>      int startRow, int numRows, byte[] qf, byte[]... families) throws IOException {<a name="line.4705"></a>
-<span class="sourceLineNo">4706</span>    putData(region, Durability.SKIP_WAL, startRow, numRows, qf, families);<a name="line.4706"></a>
+<span class="sourceLineNo">4688</span>      // open secondary region<a name="line.4688"></a>
+<span class="sourceLineNo">4689</span>      secondaryRegion = HRegion.openHRegion(rootDir, secondaryHri, htd, null, CONF);<a name="line.4689"></a>
+<span class="sourceLineNo">4690</span><a name="line.4690"></a>
+<span class="sourceLineNo">4691</span>      // move the file of the primary region to the archive, simulating a compaction<a name="line.4691"></a>
+<span class="sourceLineNo">4692</span>      Collection&lt;HStoreFile&gt; storeFiles = primaryRegion.getStore(families[0]).getStorefiles();<a name="line.4692"></a>
+<span class="sourceLineNo">4693</span>      primaryRegion.getRegionFileSystem().removeStoreFiles(Bytes.toString(families[0]), storeFiles);<a name="line.4693"></a>
+<span class="sourceLineNo">4694</span>      Collection&lt;StoreFileInfo&gt; storeFileInfos = primaryRegion.getRegionFileSystem()<a name="line.4694"></a>
+<span class="sourceLineNo">4695</span>          .getStoreFiles(families[0]);<a name="line.4695"></a>
+<span class="sourceLineNo">4696</span>      Assert.assertTrue(storeFileInfos == null || storeFileInfos.isEmpty());<a name="line.4696"></a>
+<span class="sourceLineNo">4697</span><a name="line.4697"></a>
+<span class="sourceLineNo">4698</span>      verifyData(secondaryRegion, 0, 1000, cq, families);<a name="line.4698"></a>
+<span class="sourceLineNo">4699</span>    } finally {<a name="line.4699"></a>
+<span class="sourceLineNo">4700</span>      if (primaryRegion != null) {<a name="line.4700"></a>
+<span class="sourceLineNo">4701</span>        HBaseTestingUtility.closeRegionAndWAL(primaryRegion);<a name="line.4701"></a>
+<span class="sourceLineNo">4702</span>      }<a name="line.4702"></a>
+<span class="sourceLineNo">4703</span>      if (secondaryRegion != null) {<a name="line.4703"></a>
+<span class="sourceLineNo">4704</span>        HBaseTestingUtility.closeRegionAndWAL(secondaryRegion);<a name="line.4704"></a>
+<span class="sourceLineNo">4705</span>      }<a name="line.4705"></a>
+<span class="sourceLineNo">4706</span>    }<a name="line.4706"></a>
 <span class="sourceLineNo">4707</span>  }<a name="line.4707"></a>
 <span class="sourceLineNo">4708</span><a name="line.4708"></a>
-<span class="sourceLineNo">4709</span>  static void putData(HRegion region, Durability durability,<a name="line.4709"></a>
-<span class="sourceLineNo">4710</span>      int startRow, int numRows, byte[] qf, byte[]... families) throws IOException {<a name="line.4710"></a>
-<span class="sourceLineNo">4711</span>    for (int i = startRow; i &lt; startRow + numRows; i++) {<a name="line.4711"></a>
-<span class="sourceLineNo">4712</span>      Put put = new Put(Bytes.toBytes("" + i));<a name="line.4712"></a>
-<span class="sourceLineNo">4713</span>      put.setDurability(durability);<a name="line.4713"></a>
-<span class="sourceLineNo">4714</span>      for (byte[] family : families) {<a name="line.4714"></a>
-<span class="sourceLineNo">4715</span>        put.addColumn(family, qf, null);<a name="line.4715"></a>
-<span class="sourceLineNo">4716</span>      }<a name="line.4716"></a>
-<span class="sourceLineNo">4717</span>      region.put(put);<a name="line.4717"></a>
-<span class="sourceLineNo">4718</span>      LOG.info(put.toString());<a name="line.4718"></a>
-<span class="sourceLineNo">4719</span>    }<a name="line.4719"></a>
-<span class="sourceLineNo">4720</span>  }<a name="line.4720"></a>
-<span class="sourceLineNo">4721</span><a name="line.4721"></a>
-<span class="sourceLineNo">4722</span>  static void verifyData(HRegion newReg, int startRow, int numRows, byte[] qf, byte[]... families)<a name="line.4722"></a>
-<span class="sourceLineNo">4723</span>      throws IOException {<a name="line.4723"></a>
-<span class="sourceLineNo">4724</span>    for (int i = startRow; i &lt; startRow + numRows; i++) {<a name="line.4724"></a>
-<span class="sourceLineNo">4725</span>      byte[] row = Bytes.toBytes("" + i);<a name="line.4725"></a>
-<span class="sourceLineNo">4726</span>      Get get = new Get(row);<a name="line.4726"></a>
-<span class="sourceLineNo">4727</span>      for (byte[] family : families) {<a name="line.4727"></a>
-<span class="sourceLineNo">4728</span>        get.addColumn(family, qf);<a name="line.4728"></a>
-<span class="sourceLineNo">4729</span>      }<a name="line.4729"></a>
-<span class="sourceLineNo">4730</span>      Result result = newReg.get(get);<a name="line.4730"></a>
-<span class="sourceLineNo">4731</span>      Cell[] raw = result.rawCells();<a name="line.4731"></a>
-<span class="sourceLineNo">4732</span>      assertEquals(families.length, result.size());<a name="line.4732"></a>
-<span class="sourceLineNo">4733</span>      for (int j = 0; j &lt; families.length; j++) {<a name="line.4733"></a>
-<span class="sourceLineNo">4734</span>        assertTrue(CellUtil.matchingRows(raw[j], row));<a name="line.4734"></a>
-<span class="sourceLineNo">4735</span>        assertTrue(CellUtil.matchingFamily(raw[j], families[j]));<a name="line.4735"></a>
-<span class="sourceLineNo">4736</span>        assertTrue(CellUtil.matchingQualifier(raw[j], qf));<a name="line.4736"></a>
-<span class="sourceLineNo">4737</span>      }<a name="line.4737"></a>
-<span class="sourceLineNo">4738</span>    }<a name="line.4738"></a>
-<span class="sourceLineNo">4739</span>  }<a name="line.4739"></a>
-<span class="sourceLineNo">4740</span><a name="line.4740"></a>
-<span class="sourceLineNo">4741</span>  static void assertGet(final HRegion r, final byte[] family, final byte[] k) throws IOException {<a name="line.4741"></a>
-<span class="sourceLineNo">4742</span>    // Now I have k, get values out and assert they are as expected.<a name="line.4742"></a>
-<span class="sourceLineNo">4743</span>    Get get = new Get(k).addFamily(family).readAllVersions();<a name="line.4743"></a>
-<span class="sourceLineNo">4744</span>    Cell[] results = r.get(get).rawCells();<a name="line.4744"></a>
-<span class="sourceLineNo">4745</span>    for (int j = 0; j &lt; results.length; j++) {<a name="line.4745"></a>
-<span class="sourceLineNo">4746</span>      byte[] tmp = CellUtil.cloneValue(results[j]);<a name="line.4746"></a>
-<span class="sourceLineNo">4747</span>      // Row should be equal to value every time.<a name="line.4747"></a>
-<span class="sourceLineNo">4748</span>      assertTrue(Bytes.equals(k, tmp));<a name="line.4748"></a>
-<span class="sourceLineNo">4749</span>    }<a name="line.4749"></a>
-<span class="sourceLineNo">4750</span>  }<a name="line.4750"></a>
-<span class="sourceLineNo">4751</span><a name="line.4751"></a>
-<span class="sourceLineNo">4752</span>  /*<a name="line.4752"></a>
-<span class="sourceLineNo">4753</span>   * Assert first value in the passed region is &lt;code&gt;firstValue&lt;/code&gt;.<a name="line.4753"></a>
-<span class="sourceLineNo">4754</span>   *<a name="line.4754"></a>
-<span class="sourceLineNo">4755</span>   * @param r<a name="line.4755"></a>
-<span class="sourceLineNo">4756</span>   *<a name="line.4756"></a>
-<span class="sourceLineNo">4757</span>   * @param fs<a name="line.4757"></a>
-<span class="sourceLineNo">4758</span>   *<a name="line.4758"></a>
-<span class="sourceLineNo">4759</span>   * @param firstValue<a name="line.4759"></a>
-<span class="sourceLineNo">4760</span>   *<a name="line.4760"></a>
-<span class="sourceLineNo">4761</span>   * @throws IOException<a name="line.4761"></a>
-<span class="sourceLineNo">4762</span>   */<a name="line.4762"></a>
-<span class="sourceLineNo">4763</span>  protected void assertScan(final HRegion r, final byte[] fs, final byte[] firstValue)<a name="line.4763"></a>
-<span class="sourceLineNo">4764</span>      throws IOException {<a name="line.4764"></a>
-<span class="sourceLineNo">4765</span>    byte[][] families = { fs };<a name="line.4765"></a>
-<span class="sourceLineNo">4766</span>    Scan scan = new Scan();<a name="line.4766"></a>
-<span class="sourceLineNo">4767</span>    for (int i = 0; i &lt; families.length; i++)<a name="line.4767"></a>
-<span class="sourceLineNo">4768</span>      scan.addFamily(families[i]);<a name="line.4768"></a>
-<span class="sourceLineNo">4769</span>    InternalScanner s = r.getScanner(scan);<a name="line.4769"></a>
-<span class="sourceLineNo">4770</span>    try {<a name="line.4770"></a>
-<span class="sourceLineNo">4771</span>      List&lt;Cell&gt; curVals = new ArrayList&lt;&gt;();<a name="line.4771"></a>
-<span class="sourceLineNo">4772</span>      boolean first = true;<a name="line.4772"></a>
-<span class="sourceLineNo">4773</span>      OUTER_LOOP: while (s.next(curVals)) {<a name="line.4773"></a>
-<span class="sourceLineNo">4774</span>        for (Cell kv : curVals) {<a name="line.4774"></a>
-<span class="sourceLineNo">4775</span>          byte[] val = CellUtil.cloneValue(kv);<a name="line.4775"></a>
-<span class="sourceLineNo">4776</span>          byte[] curval = val;<a name="line.4776"></a>
-<span class="sourceLineNo">4777</span>          if (first) {<a name="line.4777"></a>
-<span class="sourceLineNo">4778</span>            first = false;<a name="line.4778"></a>
-<span class="sourceLineNo">4779</span>            assertTrue(Bytes.compareTo(curval, firstValue) == 0);<a name="line.4779"></a>
-<span class="sourceLineNo">4780</span>          } else {<a name="line.4780"></a>
-<span class="sourceLineNo">4781</span>            // Not asserting anything. Might as well break.<a name="line.4781"></a>
-<span class="sourceLineNo">4782</span>            break OUTER_LOOP;<a name="line.4782"></a>
-<span class="sourceLineNo">4783</span>          }<a name="line.4783"></a>
-<span class="sourceLineNo">4784</span>        }<a name="line.4784"></a>
-<span class="sourceLineNo">4785</span>      }<a name="line.4785"></a>
-<span class="sourceLineNo">4786</span>    } finally {<a name="line.4786"></a>
-<span class="sourceLineNo">4787</span>      s.close();<a name="line.4787"></a>
-<span class="sourceLineNo">4788</span>    }<a name="line.4788"></a>
-<span class="sourceLineNo">4789</span>  }<a name="line.4789"></a>
-<span class="sourceLineNo">4790</span><a name="line.4790"></a>
-<span class="sourceLineNo">4791</span>  /**<a name="line.4791"></a>
-<span class="sourceLineNo">4792</span>   * Test that we get the expected flush results back<a name="line.4792"></a>
-<span class="sourceLineNo">4793</span>   */<a name="line.4793"></a>
-<span class="sourceLineNo">4794</span>  @Test<a name="line.4794"></a>
-<span class="sourceLineNo">4795</span>  public void testFlushResult() throws IOException {<a name="line.4795"></a>
-<span class="sourceLineNo">4796</span>    byte[] family = Bytes.toBytes("family");<a name="line.4796"></a>
-<span class="sourceLineNo">4797</span><a name="line.4797"></a>
-<span class="sourceLineNo">4798</span>    this.region = initHRegion(tableName, method, family);<a name="line.4798"></a>
-<span class="sourceLineNo">4799</span><a name="line.4799"></a>
-<span class="sourceLineNo">4800</span>    // empty memstore, flush doesn't run<a name="line.4800"></a>
-<span class="sourceLineNo">4801</span>    HRegion.FlushResult fr = region.flush(true);<a name="line.4801"></a>
-<span class="sourceLineNo">4802</span>    assertFalse(fr.isFlushSucceeded());<a name="line.4802"></a>
-<span class="sourceLineNo">4803</span>    assertFalse(fr.isCompactionNeeded());<a name="line.4803"></a>
-<span class="sourceLineNo">4804</span><a name="line.4804"></a>
-<span class="sourceLineNo">4805</span>    // Flush enough files to get up to the threshold, doesn't need compactions<a name="line.4805"></a>
-<span class="sourceLineNo">4806</span>    for (int i = 0; i &lt; 2; i++) {<a name="line.4806"></a>
-<span class="sourceLineNo">4807</span>      Put put = new Put(tableName.toBytes()).addColumn(family, family, tableName.toBytes());<a name="line.4807"></a>
-<span class="sourceLineNo">4808</span>      region.put(put);<a name="line.4808"></a>
-<span class="sourceLineNo">4809</span>      fr = region.flush(true);<a name="line.4809"></a>
-<span class="sourceLineNo">4810</span>      assertTrue(fr.isFlushSucceeded());<a name="line.4810"></a>
-<span class="sourceLineNo">4811</span>      assertFalse(fr.isCompactionNeeded());<a name="line.4811"></a>
-<span class="sourceLineNo">4812</span>    }<a name="line.4812"></a>
-<span class="sourceLineNo">4813</span><a name="line.4813"></a>
-<span class="sourceLineNo">4814</span>    // Two flushes after the threshold, compactions are needed<a name="line.4814"></a>
-<span class="sourceLineNo">4815</span>    for (int i = 0; i &lt; 2; i++) {<a name="line.4815"></a>
-<span class="sourceLineNo">4816</span>      Put put = new Put(tableName.toBytes()).addColumn(family, family, tableName.toBytes());<a name="line.4816"></a>
-<span class="sourceLineNo">4817</span>      region.put(put);<a name="line.4817"></a>
-<span class="sourceLineNo">4818</span>      fr = region.flush(true);<a name="line.4818"></a>
-<span class="sourceLineNo">4819</span>      assertTrue(fr.isFlushSucceeded());<a name="line.4819"></a>
-<span class="sourceLineNo">4820</span>      assertTrue(fr.isCompactionNeeded());<a name="line.4820"></a>
-<span class="sourceLineNo">4821</span>    }<a name="line.4821"></a>
-<span class="sourceLineNo">4822</span>  }<a name="line.4822"></a>
+<span class="sourceLineNo">4709</span>  private void putData(int startRow, int numRows, byte[] qf, byte[]... families) throws<a name="line.4709"></a>
+<span class="sourceLineNo">4710</span>      IOException {<a name="line.4710"></a>
+<span class="sourceLineNo">4711</span>    putData(this.region, startRow, numRows, qf, families);<a name="line.4711"></a>
+<span class="sourceLineNo">4712</span>  }<a name="line.4712"></a>
+<span class="sourceLineNo">4713</span><a name="line.4713"></a>
+<span class="sourceLineNo">4714</span>  private void putData(HRegion region,<a name="line.4714"></a>
+<span class="sourceLineNo">4715</span>      int startRow, int numRows, byte[] qf, byte[]... families) throws IOException {<a name="line.4715"></a>
+<span class="sourceLineNo">4716</span>    putData(region, Durability.SKIP_WAL, startRow, numRows, qf, families);<a name="line.4716"></a>
+<span class="sourceLineNo">4717</span>  }<a name="line.4717"></a>
+<span class="sourceLineNo">4718</span><a name="line.4718"></a>
+<span class="sourceLineNo">4719</span>  static void putData(HRegion region, Durability durability,<a name="line.4719"></a>
+<span class="sourceLineNo">4720</span>      int startRow, int numRows, byte[] qf, byte[]... families) throws IOException {<a name="line.4720"></a>
+<span class="sourceLineNo">4721</span>    for (int i = startRow; i &lt; startRow + numRows; i++) {<a name="line.4721"></a>
+<span class="sourceLineNo">4722</span>      Put put = new Put(Bytes.toBytes("" + i));<a name="line.4722"></a>
+<span class="sourceLineNo">4723</span>      put.setDurability(durability);<a name="line.4723"></a>
+<span class="sourceLineNo">4724</span>      for (byte[] family : families) {<a name="line.4724"></a>
+<span class="sourceLineNo">4725</span>        put.addColumn(family, qf, null);<a name="line.4725"></a>
+<span class="sourceLineNo">4726</span>      }<a name="line.4726"></a>
+<span class="sourceLineNo">4727</span>      region.put(put);<a name="line.4727"></a>
+<span class="sourceLineNo">4728</span>      LOG.info(put.toString());<a name="line.4728"></a>
+<span class="sourceLineNo">4729</span>    }<a name="line.4729"></a>
+<span class="sourceLineNo">4730</span>  }<a name="line.4730"></a>
+<span class="sourceLineNo">4731</span><a name="line.4731"></a>
+<span class="sourceLineNo">4732</span>  static void verifyData(HRegion newReg, int startRow, int numRows, byte[] qf, byte[]... families)<a name="line.4732"></a>
+<span class="sourceLineNo">4733</span>      throws IOException {<a name="line.4733"></a>
+<span class="sourceLineNo">4734</span>    for (int i = startRow; i &lt; startRow + numRows; i++) {<a name="line.4734"></a>
+<span class="sourceLineNo">4735</span>      byte[] row = Bytes.toBytes("" + i);<a name="line.4735"></a>
+<span class="sourceLineNo">4736</span>      Get get = new Get(row);<a name="line.4736"></a>
+<span class="sourceLineNo">4737</span>      for (byte[] family : families) {<a name="line.4737"></a>
+<span class="sourceLineNo">4738</span>        get.addColumn(family, qf);<a name="line.4738"></a>
+<span class="sourceLineNo">4739</span>      }<a name="line.4739"></a>
+<span class="sourceLineNo">4740</span>      Result result = newReg.get(get);<a name="line.4740"></a>
+<span class="sourceLineNo">4741</span>      Cell[] raw = result.rawCells();<a name="line.4741"></a>
+<span class="sourceLineNo">4742</span>      assertEquals(families.length, result.size());<a name="line.4742"></a>
+<span class="sourceLineNo">4743</span>      for (int j = 0; j &lt; families.length; j++) {<a name="line.4743"></a>
+<span class="sourceLineNo">4744</span>        assertTrue(CellUtil.matchingRows(raw[j], row));<a name="line.4744"></a>
+<span class="sourceLineNo">4745</span>        assertTrue(CellUtil.matchingFamily(raw[j], families[j]));<a name="line.4745"></a>
+<span class="sourceLineNo">4746</span>        assertTrue(CellUtil.matchingQualifier(raw[j], qf));<a name="line.4746"></a>
+<span class="sourceLineNo">4747</span>      }<a name="line.4747"></a>
+<span class="sourceLineNo">4748</span>    }<a name="line.4748"></a>
+<span class="sourceLineNo">4749</span>  }<a name="line.4749"></a>
+<span class="sourceLineNo">4750</span><a name="line.4750"></a>
+<span class="sourceLineNo">4751</span>  static void assertGet(final HRegion r, final byte[] family, final byte[] k) throws IOException {<a name="line.4751"></a>
+<span class="sourceLineNo">4752</span>    // Now I have k, get values out and assert they are as expected.<a name="line.4752"></a>
+<span class="sourceLineNo">4753</span>    Get get = new Get(k).addFamily(family).readAllVersions();<a name="line.4753"></a>
+<span class="sourceLineNo">4754</span>    Cell[] results = r.get(get).rawCells();<a name="line.4754"></a>
+<span class="sourceLineNo">4755</span>    for (int j = 0; j &lt; results.length; j++) {<a name="line.4755"></a>
+<span class="sourceLineNo">4756</span>      byte[] tmp = CellUtil.cloneValue(results[j]);<a name="line.4756"></a>
+<span class="sourceLineNo">4757</span>      // Row should be equal to value every time.<a name="line.4757"></a>
+<span class="sourceLineNo">4758</span>      assertTrue(Bytes.equals(k, tmp));<a name="line.4758"></a>
+<span class="sourceLineNo">4759</span>    }<a name="line.4759"></a>
+<span class="sourceLineNo">4760</span>  }<a name="line.4760"></a>
+<span class="sourceLineNo">4761</span><a name="line.4761"></a>
+<span class="sourceLineNo">4762</span>  /*<a name="line.4762"></a>
+<span class="sourceLineNo">4763</span>   * Assert first value in the passed region is &lt;code&gt;firstValue&lt;/code&gt;.<a name="line.4763"></a>
+<span class="sourceLineNo">4764</span>   *<a name="line.4764"></a>
+<span class="sourceLineNo">4765</span>   * @param r<a name="line.4765"></a>
+<span class="sourceLineNo">4766</span>   *<a name="line.4766"></a>
+<span class="sourceLineNo">4767</span>   * @param fs<a name="line.4767"></a>
+<span class="sourceLineNo">4768</span>   *<a name="line.4768"></a>
+<span class="sourceLineNo">4769</span>   * @param firstValue<a name="line.4769"></a>
+<span class="sourceLineNo">4770</span>   *<a name="line.4770"></a>
+<span class="sourceLineNo">4771</span>   * @throws IOException<a name="line.4771"></a>
+<span class="sourceLineNo">4772</span>   */<a name="line.4772"></a>
+<span class="sourceLineNo">4773</span>  protected void assertScan(final HRegion r, final byte[] fs, final byte[] firstValue)<a name="line.4773"></a>
+<span class="sourceLineNo">4774</span>      throws IOException {<a name="line.4774"></a>
+<span class="sourceLineNo">4775</span>    byte[][] families = { fs };<a name="line.4775"></a>
+<span class="sourceLineNo">4776</span>    Scan scan = new Scan();<a name="line.4776"></a>
+<span class="sourceLineNo">4777</span>    for (int i = 0; i &lt; families.length; i++)<a name="line.4777"></a>
+<span class="sourceLineNo">4778</span>      scan.addFamily(families[i]);<a name="line.4778"></a>
+<span class="sourceLineNo">4779</span>    InternalScanner s = r.getScanner(scan);<a name="line.4779"></a>
+<span class="sourceLineNo">4780</span>    try {<a name="line.4780"></a>
+<span class="sourceLineNo">4781</span>      List&lt;Cell&gt; curVals = new ArrayList&lt;&gt;();<a name="line.4781"></a>
+<span class="sourceLineNo">4782</span>      boolean first = true;<a name="line.4782"></a>
+<span class="sourceLineNo">4783</span>      OUTER_LOOP: while (s.next(curVals)) {<a name="line.4783"></a>
+<span class="sourceLineNo">4784</span>        for (Cell kv : curVals) {<a name="line.4784"></a>
+<span class="sourceLineNo">4785</span>          byte[] val = CellUtil.cloneValue(kv);<a name="line.4785"></a>
+<span class="sourceLineNo">4786</span>          byte[] curval = val;<a name="line.4786"></a>
+<span class="sourceLineNo">4787</span>          if (first) {<a name="line.4787"></a>
+<span class="sourceLineNo">4788</span>            first = false;<a name="line.4788"></a>
+<span class="sourceLineNo">4789</span>            assertTrue(Bytes.compareTo(curval, firstValue) == 0);<a name="line.4789"></a>
+<span class="sourceLineNo">4790</span>          } else {<a name="line.4790"></a>
+<span class="sourceLineNo">4791</span>            // Not asserting anything. Might as well break.<a name="line.4791"></a>
+<span class="sourceLineNo">4792</span>            break OUTER_LOOP;<a name="line.4792"></a>
+<span class="sourceLineNo">4793</span>          }<a name="line.4793"></a>
+<span class="sourceLineNo">4794</span>        }<a name="line.4794"></a>
+<span class="sourceLineNo">4795</span>      }<a name="line.4795"></a>
+<span class="sourceLineNo">4796</span>    } finally {<a name="line.4796"></a>
+<span class="sourceLineNo">4797</span>      s.close();<a name="line.4797"></a>
+<span class="sourceLineNo">4798</span>    }<a name="line.4798"></a>
+<span class="sourceLineNo">4799</span>  }<a name="line.4799"></a>
+<span class="sourceLineNo">4800</span><a name="line.4800"></a>
+<span class="sourceLineNo">4801</span>  /**<a name="line.4801"></a>
+<span class="sourceLineNo">4802</span>   * Test that we get the expected flush results back<a name="line.4802"></a>
+<span class="sourceLineNo">4803</span>   */<a name="line.4803"></a>
+<span class="sourceLineNo">4804</span>  @Test<a name="line.4804"></a>
+<span class="sourceLineNo">4805</span>  public void testFlushResult() throws IOException {<a name="line.4805"></a>
+<span class="sourceLineNo">4806</span>    byte[] family = Bytes.toBytes("family");<a name="line.4806"></a>
+<span class="sourceLineNo">4807</span><a name="line.4807"></a>
+<span class="sourceLineNo">4808</span>    this.region = initHRegion(tableName, method, family);<a name="line.4808"></a>
+<span class="sourceLineNo">4809</span><a name="line.4809"></a>
+<span class="sourceLineNo">4810</span>    // empty memstore, flush doesn't run<a name="line.4810"></a>
+<span class="sourceLineNo">4811</span>    HRegion.FlushResult fr = region.flush(true);<a name="line.4811"></a>
+<span class="sourceLineNo">4812</span>    assertFalse(fr.isFlushSucceeded());<a name="line.4812"></a>
+<span class="sourceLineNo">4813</span>    assertFalse(fr.isCompactionNeeded());<a name="line.4813"></a>
+<span class="sourceLineNo">4814</span><a name="line.4814"></a>
+<span class="sourceLineNo">4815</span>    // Flush enough files to get up to the threshold, doesn't need compactions<a name="line.4815"></a>
+<span class="sourceLineNo">4816</span>    for (int i = 0; i &lt; 2; i++) {<a name="line.4816"></a>
+<span class="sourceLineNo">4817</span>      Put put = new Put(tableName.toBytes()).addColumn(family, family, tableName.toBytes());<a name="line.4817"></a>
+<span class="sourceLineNo">4818</span>      region.put(put);<a name="line.4818"></a>
+<span class="sourceLineNo">4819</span>      fr = region.flush(true);<a name="line.4819"></a>
+<span class="sourceLineNo">4820</span>      assertTrue(fr.isFlushSucceeded());<a name="line.4820"></a>
+<span class="sourceLineNo">4821</span>      assertFalse(fr.isCompactionNeeded());<a name="line.4821"></a>
+<span class="sourceLineNo">4822</span>    }<a name="line.4822"></a>
 <span class="sourceLineNo">4823</span><a name="line.4823"></a>
-<span class="sourceLineNo">4824</span>  protected Configuration initSplit() {<a name="line.4824"></a>
-<span class="sourceLineNo">4825</span>    // Always compact if there is more than one store file.<a name="line.4825"></a>
-<span class="sourceLineNo">4826</span>    CONF.setInt("hbase.hstore.compactionThreshold", 2);<a name="line.4826"></a>
-<span class="sourceLineNo">4827</span><a name="line.4827"></a>
-<span class="sourceLineNo">4828</span>    CONF.setInt(HConstants.HBASE_CLIENT_SCANNER_TIMEOUT_PERIOD, 10 * 1000);<a name="line.4828"></a>
-<span class="sourceLineNo">4829</span><a name="line.4829"></a>
-<span class="sourceLineNo">4830</span>    // Increase the amount of time between client retries<a name="line.4830"></a>
-<span class="sourceLineNo">4831</span>    CONF.setLong("hbase.client.pause", 15 * 1000);<a name="line.4831"></a>
-<span class="sourceLineNo">4832</span><a name="line.4832"></a>
-<span class="sourceLineNo">4833</span>    // This size should make it so we always split using the addContent<a name="line.4833"></a>
-<span class="sourceLineNo">4834</span>    // below. After adding all data, the first region is 1.3M<a name="line.4834"></a>
-<span class="sourceLineNo">4835</span>    CONF.setLong(HConstants.HREGION_MAX_FILESIZE, 1024 * 128);<a name="line.4835"></a>
-<span class="sourceLineNo">4836</span>    return CONF;<a name="line.4836"></a>
-<span class="sourceLineNo">4837</span>  }<a name="line.4837"></a>
-<span class="sourceLineNo">4838</span><a name="line.4838"></a>
-<span class="sourceLineNo">4839</span>  /**<a name="line.4839"></a>
-<span class="sourceLineNo">4840</span>   * @return A region on which you must call<a name="line.4840"></a>
-<span class="sourceLineNo">4841</span>   *         {@link HBaseTestingUtility#closeRegionAndWAL(HRegion)} when done.<a name="line.4841"></a>
-<span class="sourceLineNo">4842</span>   */<a name="line.4842"></a>
-<span class="sourceLineNo">4843</span>  protected HRegion initHRegion(TableName tableName, String callingMethod, Configuration conf,<a name="line.4843"></a>
-<span class="sourceLineNo">4844</span>      byte[]... families) throws IOException {<a name="line.4844"></a>
-<span class="sourceLineNo">4845</span>    return initHRegion(tableName, callingMethod, conf, false, families);<a name="line.4845"></a>
-<span class="sourceLineNo">4846</span>  }<a name="line.4846"></a>
-<span class="sourceLineNo">4847</span><a name="line.4847"></a>
-<span class="sourceLineNo">4848</span>  /**<a name="line.4848"></a>
-<span class="sourceLineNo">4849</span>   * @return A region on which you must call<a name="line.4849"></a>
-<span class="sourceLineNo">4850</span>   *         {@link HBaseTestingUtility#closeRegionAndWAL(HRegion)} when done.<a name="line.4850"></a>
-<span class="sourceLineNo">4851</span>   */<a name="line.4851"></a>
-<span class="sourceLineNo">4852</span>  protected HRegion initHRegion(TableName tableName, String callingMethod, Configuration conf,<a name="line.4852"></a>
-<span class="sourceLineNo">4853</span>      boolean isReadOnly, byte[]... families) throws IOException {<a name="line.4853"></a>
-<span class="sourceLineNo">4854</span>    return initHRegion(tableName, null, null, callingMethod, conf, isReadOnly, families);<a name="line.4854"></a>
-<span class="sourceLineNo">4855</span>  }<a name="line.4855"></a>
-<span class="sourceLineNo">4856</span><a name="line.4856"></a>
-<span class="sourceLineNo">4857</span>  protected HRegion initHRegion(TableName tableName, byte[] startKey, byte[] stopKey,<a name="line.4857"></a>
-<span class="sourceLineNo">4858</span>      String callingMethod, Configuration conf, boolean isReadOnly, byte[]... families)<a name="line.4858"></a>
-<span class="sourceLineNo">4859</span>      throws IOException {<a name="line.4859"></a>
-<span class="sourceLineNo">4860</span>    Path logDir = TEST_UTIL.getDataTestDirOnTestFS(callingMethod + ".log");<a name="line.4860"></a>
-<span class="sourceLineNo">4861</span>    ChunkCreator.initialize(MemStoreLABImpl.CHUNK_SIZE_DEFAULT, false, 0, 0, 0, null);<a name="line.4861"></a>
-<span class="sourceLineNo">4862</span>    HRegionInfo hri = new HRegionInfo(tableName, startKey, stopKey);<a name="line.4862"></a>
-<span class="sourceLineNo">4863</span>    final WAL wal = HBaseTestingUtility.createWal(conf, logDir, hri);<a name="line.4863"></a>
-<span class="sourceLineNo">4864</span>    return initHRegion(tableName, startKey, stopKey, isReadOnly,<a name="line.4864"></a>
-<span class="sourceLineNo">4865</span>        Durability.SYNC_WAL, wal, families);<a name="line.4865"></a>
-<span class="sourceLineNo">4866</span>  }<a name="line.4866"></a>
-<span class="sourceLineNo">4867</span><a name="line.4867"></a>
-<span class="sourceLineNo">4868</span>  /**<a name="line.4868"></a>
-<span class="sourceLineNo">4869</span>   * @return A region on which you must call<a name="line.4869"></a>
-<span class="sourceLineNo">4870</span>   *         {@link HBaseTestingUtility#closeRegionAndWAL(HRegion)} when done.<a name="line.4870"></a>
-<span class="sourceLineNo">4871</span>   */<a name="line.4871"></a>
-<span class="sourceLineNo">4872</span>  public HRegion initHRegion(TableName tableName, byte[] startKey, byte[] stopKey,<a name="line.4872"></a>
-<span class="sourceLineNo">4873</span>      boolean isReadOnly, Durability durability, WAL wal, byte[]... families) throws IOException {<a name="line.4873"></a>
-<span class="sourceLineNo">4874</span>    return TEST_UTIL.createLocalHRegion(tableName, startKey, stopKey,<a name="line.4874"></a>
-<span class="sourceLineNo">4875</span>        isReadOnly, durability, wal, families);<a name="line.4875"></a>
+<span class="sourceLineNo">4824</span>    // Two flushes after the threshold, compactions are needed<a name="line.4824"></a>
+<span class="sourceLineNo">4825</span>    for (int i = 0; i &lt; 2; i++) {<a name="line.4825"></a>
+<span class="sourceLineNo">4826</span>      Put put = new Put(tableName.toBytes()).addColumn(family, family, tableName.toBytes());<a name="line.4826"></a>
+<span class="sourceLineNo">4827</span>      region.put(put);<a name="line.4827"></a>
+<span class="sourceLineNo">4828</span>      fr = region.flush(true);<a name="line.4828"></a>
+<span class="sourceLineNo">4829</span>      assertTrue(fr.isFlushSucceeded());<a name="line.4829"></a>
+<span class="sourceLineNo">4830</span>      assertTrue(fr.isCompactionNeeded());<a name="line.4830"></a>
+<span class="sourceLineNo">4831</span>    }<a name="line.4831"></a>
+<span class="sourceLineNo">4832</span>  }<a name="line.4832"></a>
+<span class="sourceLineNo">4833</span><a name="line.4833"></a>
+<span class="sourceLineNo">4834</span>  protected Configuration initSplit() {<a name="line.4834"></a>
+<span class="sourceLineNo">4835</span>    // Always compact if there is more than one store file.<a name="line.4835"></a>
+<span class="sourceLineNo">4836</span>    CONF.setInt("hbase.hstore.compactionThreshold", 2);<a name="line.4836"></a>
+<span class="sourceLineNo">4837</span><a name="line.4837"></a>
+<span class="sourceLineNo">4838</span>    CONF.setInt(HConstants.HBASE_CLIENT_SCANNER_TIMEOUT_PERIOD, 10 * 1000);<a name="line.4838"></a>
+<span class="sourceLineNo">4839</span><a name="line.4839"></a>
+<span class="sourceLineNo">4840</span>    // Increase the amount of time between client retries<a name="line.4840"></a>
+<span class="sourceLineNo">4841</span>    CONF.setLong("hbase.client.pause", 15 * 1000);<a name="line.4841"></a>
+<span class="sourceLineNo">4842</span><a name="line.4842"></a>
+<span class="sourceLineNo">4843</span>    // This size should make it so we always split using the addContent<a name="line.4843"></a>
+<span class="sourceLineNo">4844</span>    // below. After adding all data, the first region is 1.3M<a name="line.4844"></a>
+<span class="sourceLineNo">4845</span>    CONF.setLong(HConstants.HREGION_MAX_FILESIZE, 1024 * 128);<a name="line.4845"></a>
+<span class="sourceLineNo">4846</span>    return CONF;<a name="line.4846"></a>
+<span class="sourceLineNo">4847</span>  }<a name="line.4847"></a>
+<span class="sourceLineNo">4848</span><a name="line.4848"></a>
+<span class="sourceLineNo">4849</span>  /**<a name="line.4849"></a>
+<span class="sourceLineNo">4850</span>   * @return A region on which you must call<a name="line.4850"></a>
+<span class="sourceLineNo">4851</span>   *         {@link HBaseTestingUtility#closeRegionAndWAL(HRegion)} when done.<a name="line.4851"></a>
+<span class="sourceLineNo">4852</span>   */<a name="line.4852"></a>
+<span class="sourceLineNo">4853</span>  protected HRegion initHRegion(TableName tableName, String callingMethod, Configuration conf,<a name="line.4853"></a>
+<span class="sourceLineNo">4854</span>      byte[]... families) throws IOException {<a name="line.4854"></a>
+<span class="sourceLineNo">4855</span>    return initHRegion(tableName, callingMethod, conf, false, families);<a name="line.4855"></a>
+<span class="sourceLineNo">4856</span>  }<a name="line.4856"></a>
+<span class="sourceLineNo">4857</span><a name="line.4857"></a>
+<span class="sourceLineNo">4858</span>  /**<a name="line.4858"></a>
+<span class="sourceLineNo">4859</span>   * @return A region on which you must call<a name="line.4859"></a>
+<span class="sourceLineNo">4860</span>   *         {@link HBaseTestingUtility#closeRegionAndWAL(HRegion)} when done.<a name="line.4860"></a>
+<span class="sourceLineNo">4861</span>   */<a name="line.4861"></a>
+<span class="sourceLineNo">4862</span>  protected HRegion initHRegion(TableName tableName, String callingMethod, Configuration conf,<a name="line.4862"></a>
+<span class="sourceLineNo">4863</span>      boolean isReadOnly, byte[]... families) throws IOException {<a name="line.4863"></a>
+<span class="sourceLineNo">4864</span>    return initHRegion(tableName, null, null, callingMethod, conf, isReadOnly, families);<a name="line.4864"></a>
+<span class="sourceLineNo">4865</span>  }<a name="line.4865"></a>
+<span class="sourceLineNo">4866</span><a name="line.4866"></a>
+<span class="sourceLineNo">4867</span>  protected HRegion initHRegion(TableName tableName, byte[] startKey, byte[] stopKey,<a name="line.4867"></a>
+<span class="sourceLineNo">4868</span>      String callingMethod, Configuration conf, boolean isReadOnly, byte[]... families)<a name="line.4868"></a>
+<span class="sourceLineNo">4869</span>      throws IOException {<a name="line.4869"></a>
+<span class="sourceLineNo">4870</span>    Path logDir = TEST_UTIL.getDataTestDirOnTestFS(callingMethod + ".log");<a name="line.4870"></a>
+<span class="sourceLineNo">4871</span>    ChunkCreator.initialize(MemStoreLABImpl.CHUNK_SIZE_DEFAULT, false, 0, 0, 0, null);<a name="line.4871"></a>
+<span class="sourceLineNo">4872</span>    HRegionInfo hri = new HRegionInfo(tableName, startKey, stopKey);<a name="line.4872"></a>
+<span class="sourceLineNo">4873</span>    final WAL wal = HBaseTestingUtility.createWal(conf, logDir, hri);<a name="line.4873"></a>
+<span class="sourceLineNo">4874</span>    return initHRegion(tableName, startKey, stopKey, isReadOnly,<a name="line.4874"></a>
+<span class="sourceLineNo">4875</span>        Durability.SYNC_WAL, wal, families);<a name="line.4875"></a>
 <span class="sourceLineNo">4876</span>  }<a name="line.4876"></a>
 <span class="sourceLineNo">4877</span><a name="line.4877"></a>
 <span class="sourceLineNo">4878</span>  /**<a name="line.4878"></a>
-<span class="sourceLineNo">4879</span>   * Assert that the passed in Cell has expected contents for the specified row,<a name="line.4879"></a>
-<span class="sourceLineNo">4880</span>   * column &amp; timestamp.<a name="line.4880"></a>
+<span class="sourceLineNo">4879</span>   * @return A region on which you must call<a name="line.4879"></a>
+<span class="sourceLineNo">4880</span>   *         {@link HBaseTestingUtility#closeRegionAndWAL(HRegion)} when done.<a name="line.4880"></a>
 <span class="sourceLineNo">4881</span>   */<a name="line.4881"></a>
-<span class="sourceLineNo">4882</span>  private void checkOneCell(Cell kv, byte[] cf, int rowIdx, int colIdx, long ts) {<a name="line.4882"></a>
-<span class="sourceLineNo">4883</span>    String ctx = "rowIdx=" + rowIdx + "; colIdx=" + colIdx + "; ts=" + ts;<a name="line.4883"></a>
-<span class="sourceLineNo">4884</span>    assertEquals("Row mismatch which checking: " + ctx, "row:" + rowIdx,<a name="line.4884"></a>
-<span class="sourceLineNo">4885</span>        Bytes.toString(CellUtil.cloneRow(kv)));<a name="line.4885"></a>
-<span class="sourceLineNo">4886</span>    assertEquals("ColumnFamily mismatch while checking: " + ctx, Bytes.toString(cf),<a name="line.4886"></a>
-<span class="sourceLineNo">4887</span>        Bytes.toString(CellUtil.cloneFamily(kv)));<a name="line.4887"></a>
-<span class="sourceLineNo">4888</span>    assertEquals("Column qualifier mismatch while checking: " + ctx, "column:" + colIdx,<a name="line.4888"></a>
-<span class="sourceLineNo">4889</span>        Bytes.toString(CellUtil.cloneQualifier(kv)));<a name="line.4889"></a>
-<span class="sourceLineNo">4890</span>    assertEquals("Timestamp mismatch while checking: " + ctx, ts, kv.getTimestamp());<a name="line.4890"></a>
-<span class="sourceLineNo">4891</span>    assertEquals("Value mismatch while checking: " + ctx, "value-version-" + ts,<a name="line.4891"></a>
-<span class="sourceLineNo">4892</span>        Bytes.toString(CellUtil.cloneValue(kv)));<a name="line.4892"></a>
-<span class="sourceLineNo">4893</span>  }<a name="line.4893"></a>
-<span class="sourceLineNo">4894</span><a name="line.4894"></a>
-<span class="sourceLineNo">4895</span>  @Test<a name="line.4895"></a>
-<span class="sourceLineNo">4896</span>  public void testReverseScanner_FromMemStore_SingleCF_Normal()<a name="line.4896"></a>
-<span class="sourceLineNo">4897</span>      throws IOException {<a name="line.4897"></a>
-<span class="sourceLineNo">4898</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.4898"></a>
-<span class="sourceLineNo">4899</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.4899"></a>
-<span class="sourceLineNo">4900</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.4900"></a>
-<span class="sourceLineNo">4901</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.4901"></a>
-<span class="sourceLineNo">4902</span>    byte[][] families = { cf };<a name="line.4902"></a>
-<span class="sourceLineNo">4903</span>    byte[] col = Bytes.toBytes("C");<a name="line.4903"></a>
-<span class="sourceLineNo">4904</span>    long ts = 1;<a name="line.4904"></a>
-<span class="sourceLineNo">4905</span>    this.region = initHRegion(tableName, method, families);<a name="line.4905"></a>
-<span class="sourceLineNo">4906</span>    KeyValue kv1 = new KeyValue(rowC, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4906"></a>
-<span class="sourceLineNo">4907</span>    KeyValue kv11 = new KeyValue(rowC, cf, col, ts + 1, KeyValue.Type.Put,<a name="line.4907"></a>
-<span class="sourceLineNo">4908</span>        null);<a name="line.4908"></a>
-<span class="sourceLineNo">4909</span>    KeyValue kv2 = new KeyValue(rowA, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4909"></a>
-<span class="sourceLineNo">4910</span>    KeyValue kv3 = new KeyValue(rowB, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4910"></a>
-<span class="sourceLineNo">4911</span>    Put put = null;<a name="line.4911"></a>
-<span class="sourceLineNo">4912</span>    put = new Put(rowC);<a name="line.4912"></a>
-<span class="sourceLineNo">4913</span>    put.add(kv1);<a name="line.4913"></a>
-<span class="sourceLineNo">4914</span>    put.add(kv11);<a name="line.4914"></a>
-<span class="sourceLineNo">4915</span>    region.put(put);<a name="line.4915"></a>
-<span class="sourceLineNo">4916</span>    put = new Put(rowA);<a name="line.4916"></a>
-<span class="sourceLineNo">4917</span>    put.add(kv2);<a name="line.4917"></a>
-<span class="sourceLineNo">4918</span>    region.put(put);<a name="line.4918"></a>
-<span class="sourceLineNo">4919</span>    put = new Put(rowB);<a name="line.4919"></a>
-<span class="sourceLineNo">4920</span>    put.add(kv3);<a name="line.4920"></a>
-<span class="sourceLineNo">4921</span>    region.put(put);<a name="line.4921"></a>
-<span class="sourceLineNo">4922</span><a name="line.4922"></a>
-<span class="sourceLineNo">4923</span>    Scan scan = new Scan(rowC);<a name="line.4923"></a>
-<span class="sourceLineNo">4924</span>    scan.setMaxVersions(5);<a name="line.4924"></a>
-<span class="sourceLineNo">4925</span>    scan.setReversed(true);<a name="line.4925"></a>
-<span class="sourceLineNo">4926</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.4926"></a>
-<span class="sourceLineNo">4927</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.4927"></a>
-<span class="sourceLineNo">4928</span>    boolean hasNext = scanner.next(currRow);<a name="line.4928"></a>
-<span class="sourceLineNo">4929</span>    assertEquals(2, currRow.size());<a name="line.4929"></a>
-<span class="sourceLineNo">4930</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4930"></a>
-<span class="sourceLineNo">4931</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.4931"></a>
-<span class="sourceLineNo">4932</span>    assertTrue(hasNext);<a name="line.4932"></a>
-<span class="sourceLineNo">4933</span>    currRow.clear();<a name="line.4933"></a>
-<span class="sourceLineNo">4934</span>    hasNext = scanner.next(currRow);<a name="line.4934"></a>
-<span class="sourceLineNo">4935</span>    assertEquals(1, currRow.size());<a name="line.4935"></a>
-<span class="sourceLineNo">4936</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4936"></a>
-<span class="sourceLineNo">4937</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.4937"></a>
-<span class="sourceLineNo">4938</span>    assertTrue(hasNext);<a name="line.4938"></a>
-<span class="sourceLineNo">4939</span>    currRow.clear();<a name="line.4939"></a>
-<span class="sourceLineNo">4940</span>    hasNext = scanner.next(currRow);<a name="line.4940"></a>
-<span class="sourceLineNo">4941</span>    assertEquals(1, currRow.size());<a name="line.4941"></a>
-<span class="sourceLineNo">4942</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4942"></a>
-<span class="sourceLineNo">4943</span>        .get(0).getRowLength(), rowA, 0, rowA.length));<a name="line.4943"></a>
-<span class="sourceLineNo">4944</span>    assertFalse(hasNext);<a name="line.4944"></a>
-<span class="sourceLineNo">4945</span>    scanner.close();<a name="line.4945"></a>
-<span class="sourceLineNo">4946</span>  }<a name="line.4946"></a>
-<span class="sourceLineNo">4947</span><a name="line.4947"></a>
-<span class="sourceLineNo">4948</span>  @Test<a name="line.4948"></a>
-<span class="sourceLineNo">4949</span>  public void testReverseScanner_FromMemStore_SingleCF_LargerKey()<a name="line.4949"></a>
-<span class="sourceLineNo">4950</span>      throws IOException {<a name="line.4950"></a>
-<span class="sourceLineNo">4951</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.4951"></a>
-<span class="sourceLineNo">4952</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.4952"></a>
-<span class="sourceLineNo">4953</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.4953"></a>
-<span class="sourceLineNo">4954</span>    byte[] rowD = Bytes.toBytes("rowD");<a name="line.4954"></a>
-<span class="sourceLineNo">4955</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.4955"></a>
-<span class="sourceLineNo">4956</span>    byte[][] families = { cf };<a name="line.4956"></a>
-<span class="sourceLineNo">4957</span>    byte[] col = Bytes.toBytes("C");<a name="line.4957"></a>
-<span class="sourceLineNo">4958</span>    long ts = 1;<a name="line.4958"></a>
-<span class="sourceLineNo">4959</span>    this.region = initHRegion(tableName, method, families);<a name="line.4959"></a>
-<span class="sourceLineNo">4960</span>    KeyValue kv1 = new KeyValue(rowC, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4960"></a>
-<span class="sourceLineNo">4961</span>    KeyValue kv11 = new KeyValue(rowC, cf, col, ts + 1, KeyValue.Type.Put,<a name="line.4961"></a>
-<span class="sourceLineNo">4962</span>        null);<a name="line.4962"></a>
-<span class="sourceLineNo">4963</span>    KeyValue kv2 = new KeyValue(rowA, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4963"></a>
-<span class="sourceLineNo">4964</span>    KeyValue kv3 = new KeyValue(rowB, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4964"></a>
-<span class="sourceLineNo">4965</span>    Put put = null;<a name="line.4965"></a>
-<span class="sourceLineNo">4966</span>    put = new Put(rowC);<a name="line.4966"></a>
-<span class="sourceLineNo">4967</span>    put.add(kv1);<a name="line.4967"></a>
-<span class="sourceLineNo">4968</span>    put.add(kv11);<a name="line.4968"></a>
-<span class="sourceLineNo">4969</span>    region.put(put);<a name="line.4969"></a>
-<span class="sourceLineNo">4970</span>    put = new Put(rowA);<a name="line.4970"></a>
-<span class="sourceLineNo">4971</span>    put.add(kv2);<a name="line.4971"></a>
-<span class="sourceLineNo">4972</span>    region.put(put);<a name="line.4972"></a>
-<span class="sourceLineNo">4973</span>    put = new Put(rowB);<a name="line.4973"></a>
-<span class="sourceLineNo">4974</span>    put.add(kv3);<a name="line.4974"></a>
-<span class="sourceLineNo">4975</span>    region.put(put);<a name="line.4975"></a>
-<span class="sourceLineNo">4976</span><a name="line.4976"></a>
-<span class="sourceLineNo">4977</span>    Scan scan = new Scan(rowD);<a name="line.4977"></a>
-<span class="sourceLineNo">4978</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.4978"></a>
-<span class="sourceLineNo">4979</span>    scan.setReversed(true);<a name="line.4979"></a>
-<span class="sourceLineNo">4980</span>    scan.setMaxVersions(5);<a name="line.4980"></a>
-<span class="sourceLineNo">4981</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.4981"></a>
-<span class="sourceLineNo">4982</span>    boolean hasNext = scanner.next(currRow);<a name="line.4982"></a>
-<span class="sourceLineNo">4983</span>    assertEquals(2, currRow.size());<a name="line.4983"></a>
-<span class="sourceLineNo">4984</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4984"></a>
-<span class="sourceLineNo">4985</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.4985"></a>
-<span class="sourceLineNo">4986</span>    assertTrue(hasNext);<a name="line.4986"></a>
-<span class="sourceLineNo">4987</span>    currRow.clear();<a name="line.4987"></a>
-<span class="sourceLineNo">4988</span>    hasNext = scanner.next(currRow);<a name="line.4988"></a>
-<span class="sourceLineNo">4989</span>    assertEquals(1, currRow.size());<a name="line.4989"></a>
-<span class="sourceLineNo">4990</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4990"></a>
-<span class="sourceLineNo">4991</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.4991"></a>
-<span class="sourceLineNo">4992</span>    assertTrue(hasNext);<a name="line.4992"></a>
-<span class="sourceLineNo">4993</span>    currRow.clear();<a name="line.4993"></a>
-<span class="sourceLineNo">4994</span>    hasNext = scanner.next(currRow);<a name="line.4994"></a>
-<span class="sourceLineNo">4995</span>    assertEquals(1, currRow.size());<a name="line.4995"></a>
-<span class="sourceLineNo">4996</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4996"></a>
-<span class="sourceLineNo">4997</span>        .get(0).getRowLength(), rowA, 0, rowA.length));<a name="line.4997"></a>
-<span class="sourceLineNo">4998</span>    assertFalse(hasNext);<a name="line.4998"></a>
-<span class="sourceLineNo">4999</span>    scanner.close();<a name="line.4999"></a>
-<span class="sourceLineNo">5000</span>  }<a name="line.5000"></a>
-<span class="sourceLineNo">5001</span><a name="line.5001"></a>
-<span class="sourceLineNo">5002</span>  @Test<a name="line.5002"></a>
-<span class="sourceLineNo">5003</span>  public void testReverseScanner_FromMemStore_SingleCF_FullScan()<a name="line.5003"></a>
-<span class="sourceLineNo">5004</span>      throws IOException {<a name="line.5004"></a>
-<span class="sourceLineNo">5005</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.5005"></a>
-<span class="sourceLineNo">5006</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.5006"></a>
-<span class="sourceLineNo">5007</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.5007"></a>
-<span class="sourceLineNo">5008</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.5008"></a>
-<span class="sourceLineNo">5009</span>    byte[][] families = { cf };<a name="line.5009"></a>
-<span class="sourceLineNo">5010</span>    byte[] col = Bytes.toBytes("C");<a name="line.5010"></a>
-<span class="sourceLineNo">5011</span>    long ts = 1;<a name="line.5011"></a>
-<span class="sourceLineNo">5012</span>    this.region = initHRegion(tableName, method, families);<a name="line.5012"></a>
-<span class="sourceLineNo">5013</span>    KeyValue kv1 = new KeyValue(rowC, cf, col, ts, KeyValue.Type.Put, null);<a name="line.5013"></a>
-<span class="sourceLineNo">5014</span>    KeyValue kv11 = new KeyValue(rowC, cf, col, ts + 1, KeyValue.Type.Put,<a name="line.5014"></a>
-<span class="sourceLineNo">5015</span>        null);<a name="line.5015"></a>
-<span class="sourceLineNo">5016</span>    KeyValue kv2 = new KeyValue(rowA, cf, col, ts, KeyValue.Type.Put, null);<a name="line.5016"></a>
-<span class="sourceLineNo">5017</span>    KeyValue kv3 = new KeyValue(rowB, cf, col, ts, KeyValue.Type.Put, null);<a name="line.5017"></a>
-<span class="sourceLineNo">5018</span>    Put put = null;<a name="line.5018"></a>
-<span class="sourceLineNo">5019</span>    put = new Put(rowC);<a name="line.5019"></a>
-<span class="sourceLineNo">5020</span>    put.add(kv1);<a name="line.5020"></a>
-<span class="sourceLineNo">5021</span>    put.add(kv11);<a name="line.5021"></a>
-<span class="sourceLineNo">5022</span>    region.put(put);<a name="line.5022"></a>
-<span class="sourceLineNo">5023</span>    put = new Put(rowA);<a name="line.5023"></a>
-<span class="sourceLineNo">5024</span>    put.add(kv2);<a name="line.5024"></a>
-<span class="sourceLineNo">5025</span>    region.put(put);<a name="line.5025"></a>
-<span class="sourceLineNo">5026</span>    put = new Put(rowB);<a name="line.5026"></a>
-<span class="sourceLineNo">5027</span>    put.add(kv3);<a name="line.5027"></a>
-<span class="sourceLineNo">5028</span>    region.put(put);<a name="line.5028"></a>
-<span class="sourceLineNo">5029</span>    Scan scan = new Scan();<a name="line.5029"></a>
-<span class="sourceLineNo">5030</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5030"></a>
-<span class="sourceLineNo">5031</span>    scan.setReversed(true);<a name="line.5031"></a>
-<span class="sourceLineNo">5032</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5032"></a>
-<span class="sourceLineNo">5033</span>    boolean hasNext = scanner.next(currRow);<a name="line.5033"></a>
-<span class="sourceLineNo">5034</span>    assertEquals(1, currRow.size());<a name="line.5034"></a>
-<span class="sourceLineNo">5035</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5035"></a>
-<span class="sourceLineNo">5036</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.5036"></a>
-<span class="sourceLineNo">5037</span>    assertTrue(hasNext);<a name="line.5037"></a>
-<span class="sourceLineNo">5038</span>    currRow.clear();<a name="line.5038"></a>
-<span class="sourceLineNo">5039</span>    hasNext = scanner.next(currRow);<a name="line.5039"></a>
-<span class="sourceLineNo">5040</span>    assertEquals(1, currRow.size());<a name="line.5040"></a>
-<span class="sourceLineNo">5041</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5041"></a>
-<span class="sourceLineNo">5042</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.5042"></a>
-<span class="sourceLineNo">5043</span>    assertTrue(hasNext);<a name="line.5043"></a>
-<span class="sourceLineNo">5044</span>    currRow.clear();<a name="line.5044"></a>
-<span class="sourceLineNo">5045</span>    hasNext = scanner.next(currRow);<a name="line.5045"></a>
-<span class="sourceLineNo">5046</span>    assertEquals(1, currRow.size());<a name="line.5046"></a>
-<span class="sourceLineNo">5047</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5047"></a>
-<span class="sourceLineNo">5048</span>        .get(0).getRowLength(), rowA, 0, rowA.length));<a name="line.5048"></a>
-<span class="sourceLineNo">5049</span>    assertFalse(hasNext);<a name="line.5049"></a>
-<span class="sourceLineNo">5050</span>    scanner.close();<a name="line.5050"></a>
-<span class="sourceLineNo">5051</span>  }<a name="line.5051"></a>
-<span class="sourceLineNo">5052</span><a name="line.5052"></a>
-<span class="sourceLineNo">5053</span>  @Test<a name="line.5053"></a>
-<span class="sourceLineNo">5054</span>  public void testReverseScanner_moreRowsMayExistAfter() throws IOException {<a name="line.5054"></a>
-<span class="sourceLineNo">5055</span>    // case for "INCLUDE_AND_SEEK_NEXT_ROW &amp; SEEK_NEXT_ROW" endless loop<a name="line.5055"></a>
-<span class="sourceLineNo">5056</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.5056"></a>
-<span class="sourceLineNo">5057</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.5057"></a>
-<span class="sourceLineNo">5058</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.5058"></a>
-<span class="sourceLineNo">5059</span>    byte[] rowD = Bytes.toBytes("rowD");<a name="line.5059"></a>
-<span class="sourceLineNo">5060</span>    byte[] rowE = Bytes.toBytes("rowE");<a name="line.5060"></a>
-<span class="sourceLineNo">5061</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.5061"></a>
-<span class="sourceLineNo">5062</span>    byte[][] families = { cf };<a name="line.5062"></a>
-<span class="sourceLineNo">5063</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.5063"></a>
-<span class="sourceLineNo">5064</span>    byte[] col2 = Bytes.toBytes("col2");<a name="line.5064"></a>
-<span class="sourceLineNo">5065</span>    long ts = 1;<a name="line.5065"></a>
-<span class="sourceLineNo">5066</span>    this.region = initHRegion(tableName, method, families);<a name="line.5066"></a>
-<span class="sourceLineNo">5067</span>    KeyValue kv1 = new KeyValue(rowA, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5067"></a>
-<span class="sourceLineNo">5068</span>    KeyValue kv2 = new KeyValue(rowB, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5068"></a>
-<span class="sourceLineNo">5069</span>    KeyValue kv3 = new KeyValue(rowC, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5069"></a>
-<span class="sourceLineNo">5070</span>    KeyValue kv4_1 = new KeyValue(rowD, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5070"></a>
-<span class="sourceLineNo">5071</span>    KeyValue kv4_2 = new KeyValue(rowD, cf, col2, ts, KeyValue.Type.Put, null);<a name="line.5071"></a>
-<span class="sourceLineNo">5072</span>    KeyValue kv5 = new KeyValue(rowE, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5072"></a>
-<span class="sourceLineNo">5073</span>    Put put = null;<a name="line.5073"></a>
-<span class="sourceLineNo">5074</span>    put = new Put(rowA);<a name="line.5074"></a>
-<span class="sourceLineNo">5075</span>    put.add(kv1);<a name="line.5075"></a>
-<span class="sourceLineNo">5076</span>    region.put(put);<a name="line.5076"></a>
-<span class="sourceLineNo">5077</span>    put = new Put(rowB);<a name="line.5077"></a>
-<span class="sourceLineNo">5078</span>    put.add(kv2);<a name="line.5078"></a>
-<span class="sourceLineNo">5079</span>    region.put(put);<a name="line.5079"></a>
-<span class="sourceLineNo">5080</span>    put = new Put(rowC);<a name="line.5080"></a>
-<span class="sourceLineNo">5081</span>    put.add(kv3);<a name="line.5081"></a>
-<span class="sourceLineNo">5082</span>    region.put(put);<a name="line.5082"></a>
-<span class="sourceLineNo">5083</span>    put = new Put(rowD);<a name="line.5083"></a>
-<span class="sourceLineNo">5084</span>    put.add(kv4_1);<a name="line.5084"></a>
-<span class="sourceLineNo">5085</span>    region.put(put);<a name="line.5085"></a>
-<span class="sourceLineNo">5086</span>    put = new Put(rowD);<a name="line.5086"></a>
-<span class="sourceLineNo">5087</span>    put.add(kv4_2);<a name="line.5087"></a>
-<span class="sourceLineNo">5088</span>    region.put(put);<a name="line.5088"></a>
-<span class="sourceLineNo">5089</span>    put = new Put(rowE);<a name="line.5089"></a>
-<span class="sourceLineNo">5090</span>    put.add(kv5);<a name="line.5090"></a>
-<span class="sourceLineNo">5091</span>    region.put(put);<a name="line.5091"></a>
-<span class="sourceLineNo">5092</span>    region.flush(true);<a name="line.5092"></a>
-<span class="sourceLineNo">5093</span>    Scan scan = new Scan(rowD, rowA);<a name="line.5093"></a>
-<span class="sourceLineNo">5094</span>    scan.addColumn(families[0], col1);<a name="line.5094"></a>
-<span class="sourceLineNo">5095</span>    scan.setReversed(true);<a name="line.5095"></a>
-<span class="sourceLineNo">5096</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5096"></a>
-<span class="sourceLineNo">5097</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5097"></a>
-<span class="sourceLineNo">5098</span>    boolean hasNext = scanner.next(currRow);<a name="line.5098"></a>
-<span class="sourceLineNo">5099</span>    assertEquals(1, currRow.size());<a name="line.5099"></a>
-<span class="sourceLineNo">5100</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5100"></a>
-<span class="sourceLineNo">5101</span>        .get(0).getRowLength(), rowD, 0, rowD.length));<a name="line.5101"></a>
-<span class="sourceLineNo">5102</span>    assertTrue(hasNext);<a name="line.5102"></a>
-<span class="sourceLineNo">5103</span>    currRow.clear();<a name="line.5103"></a>
-<span class="sourceLineNo">5104</span>    hasNext = scanner.next(currRow);<a name="line.5104"></a>
-<span class="sourceLineNo">5105</span>    assertEquals(1, currRow.size());<a name="line.5105"></a>
-<span class="sourceLineNo">5106</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5106"></a>
-<span class="sourceLineNo">5107</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.5107"></a>
-<span class="sourceLineNo">5108</span>    assertTrue(hasNext);<a name="line.5108"></a>
-<span class="sourceLineNo">5109</span>    currRow.clear();<a name="line.5109"></a>
-<span class="sourceLineNo">5110</span>    hasNext = scanner.next(currRow);<a name="line.5110"></a>
-<span class="sourceLineNo">5111</span>    assertEquals(1, currRow.size());<a name="line.5111"></a>
-<span class="sourceLineNo">5112</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5112"></a>
-<span class="sourceLineNo">5113</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.5113"></a>
-<span class="sourceLineNo">5114</span>    assertFalse(hasNext);<a name="line.5114"></a>
-<span class="sourceLineNo">5115</span>    scanner.close();<a name="line.5115"></a>
-<span class="sourceLineNo">5116</span><a name="line.5116"></a>
-<span class="sourceLineNo">5117</span>    scan = new Scan(rowD, rowA);<a name="line.5117"></a>
-<span class="sourceLineNo">5118</span>    scan.addColumn(families[0], col2);<a name="line.5118"></a>
-<span class="sourceLineNo">5119</span>    scan.setReversed(true);<a name="line.5119"></a>
-<span class="sourceLineNo">5120</span>    currRow.clear();<a name="line.5120"></a>
-<span class="sourceLineNo">5121</span>    scanner = region.getScanner(scan);<a name="line.5121"></a>
-<span class="sourceLineNo">5122</span>    hasNext = scanner.next(currRow);<a name="line.5122"></a>
-<span class="sourceLineNo">5123</span>    assertEquals(1, currRow.size());<a name="line.5123"></a>
-<span class="sourceLineNo">5124</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5124"></a>
-<span class="sourceLineNo">5125</span>        .get(0).getRowLength(), rowD, 0, rowD.length));<a name="line.5125"></a>
-<span class="sourceLineNo">5126</span>    scanner.close();<a name="line.5126"></a>
-<span class="sourceLineNo">5127</span>  }<a name="line.5127"></a>
-<span class="sourceLineNo">5128</span><a name="line.5128"></a>
-<span class="sourceLineNo">5129</span>  @Test<a name="line.5129"></a>
-<span class="sourceLineNo">5130</span>  public void testReverseScanner_smaller_blocksize() throws IOException {<a name="line.5130"></a>
-<span class="sourceLineNo">5131</span>    // case to ensure no conflict with HFile index optimization<a name="line.5131"></a>
-<span class="sourceLineNo">5132</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.5132"></a>
-<span class="sourceLineNo">5133</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.5133"></a>
-<span class="sourceLineNo">5134</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.5134"></a>
-<span class="sourceLineNo">5135</span>    byte[] rowD = Bytes.toBytes("rowD");<a name="line.5135"></a>
-<span class="sourceLineNo">5136</span>    byte[] rowE = Bytes.toBytes("rowE");<a name="line.5136"></a>
-<span class="sourceLineNo">5137</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.5137"></a>
-<span class="sourceLineNo">5138</span>    byte[][] families = { cf };<a name="line.5138"></a>
-<span class="sourceLineNo">5139</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.5139"></a>
-<span class="sourceLineNo">5140</span>    byte[] col2 = Bytes.toBytes("col2");<a name="line.5140"></a>
-<span class="sourceLineNo">5141</span>    long ts = 1;<a name="line.5141"></a>
-<span class="sourceLineNo">5142</span>    HBaseConfiguration config = new HBaseConfiguration();<a name="line.5142"></a>
-<span class="sourceLineNo">5143</span>    config.setInt("test.block.size", 1);<a name="line.5143"></a>
-<span class="sourceLineNo">5144</span>    this.region = initHRegion(tableName, method, config, families);<a name="line.5144"></a>
-<span class="sourceLineNo">5145</span>    KeyValue kv1 = new KeyValue(rowA, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5145"></a>
-<span class="sourceLineNo">5146</span>    KeyValue kv2 = new KeyValue(rowB, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5146"></a>
-<span class="sourceLineNo">5147</span>    KeyValue kv3 = new KeyValue(rowC, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5147"></a>
-<span class="sourceLineNo">5148</span>    KeyValue kv4_1 = new KeyValue(rowD, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5148"></a>
-<span class="sourceLineNo">5149</span>    KeyValue kv4_2 = new KeyValue(rowD, cf, col2, ts, KeyValue.Type.Put, null);<a name="line.5149"></a>
-<span class="sourceLineNo">5150</span>    KeyValue kv5 = new KeyValue(rowE, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5150"></a>
-<span class="sourceLineNo">5151</span>    Put put = null;<a name="line.5151"></a>
-<span class="sourceLineNo">5152</span>    put = new Put(rowA);<a name="line.5152"></a>
-<span class="sourceLineNo">5153</span>    put.add(kv1);<a name="line.5153"></a>
-<span class="sourceLineNo">5154</span>    region.put(put);<a name="line.5154"></a>
-<span class="sourceLineNo">5155</span>    put = new Put(rowB);<a name="line.5155"></a>
-<span class="sourceLineNo">5156</span>    put.add(kv2);<a name="line.5156"></a>
-<span class="sourceLineNo">5157</span>    region.put(put);<a name="line.5157"></a>
-<span class="sourceLineNo">5158</span>    put = new Put(rowC);<a name="line.5158"></a>
-<span class="sourceLineNo">5159</span>    put.add(kv3);<a name="line.5159"></a>
-<span class="sourceLineNo">5160</span>    region.put(put);<a name="line.5160"></a>
-<span class="sourceLineNo">5161</span>    put = new Put(rowD);<a name="line.5161"></a>
-<span class="sourceLineNo">5162</span>    put.add(kv4_1);<a name="line.5162"></a>
-<span class="sourceLineNo">5163</span>    region.put(put);<a name="line.5163"></a>
-<span class="sourceLineNo">5164</span>    put = new Put(rowD);<a name="line.5164"></a>
-<span class="sourceLineNo">5165</span>    put.add(kv4_2);<a name="line.5165"></a>
-<span class="sourceLineNo">5166</span>    region.put(put);<a name="line.5166"></a>
-<span class="sourceLineNo">5167</span>    put = new Put(rowE);<a name="line.5167"></a>
-<span class="sourceLineNo">5168</span>    put.add(kv5);<a name="line.5168"></a>
-<span class="sourceLineNo">5169</span>    region.put(put);<a name="line.5169"></a>
-<span class="sourceLineNo">5170</span>    region.flush(true);<a name="line.5170"></a>
-<span class="sourceLineNo">5171</span>    Scan scan = new Scan(rowD, rowA);<a name="line.5171"></a>
-<span class="sourceLineNo">5172</span>    scan.addColumn(families[0], col1);<a name="line.5172"></a>
-<span class="sourceLineNo">5173</span>    scan.setReversed(true);<a name="line.5173"></a>
-<span class="sourceLineNo">5174</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5174"></a>
-<span class="sourceLineNo">5175</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5175"></a>
-<span class="sourceLineNo">5176</span>    boolean hasNext = scanner.next(currRow);<a name="line.5176"></a>
-<span class="sourceLineNo">5177</span>    assertEquals(1, currRow.size());<a name="line.5177"></a>
-<span class="sourceLineNo">5178</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5178"></a>
-<span class="sourceLineNo">5179</span>        .get(0).getRowLength(), rowD, 0, rowD.length));<a name="line.5179"></a>
-<span class="sourceLineNo">5180</span>    assertTrue(hasNext);<a name="line.5180"></a>
-<span class="sourceLineNo">5181</span>    currRow.clear();<a name="line.5181"></a>
-<span class="sourceLineNo">5182</span>    hasNext = scanner.next(currRow);<a name="line.5182"></a>
-<span class="sourceLineNo">5183</span>    assertEquals(1, currRow.size());<a name="line.5183"></a>
-<span class="sourceLineNo">5184</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5184"></a>
-<span class="sourceLineNo">5185</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.5185"></a>
-<span class="sourceLineNo">5186</span>    assertTrue(hasNext);<a name="line.5186"></a>
-<span class="sourceLineNo">5187</span>    currRow.clear();<a name="line.5187"></a>
-<span class="sourceLineNo">5188</span>    hasNext = scanner.next(currRow);<a name="line.5188"></a>
-<span class="sourceLineNo">5189</span>    assertEquals(1, currRow.size());<a name="line.5189"></a>
-<span class="sourceLineNo">5190</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5190"></a>
-<span class="sourceLineNo">5191</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.5191"></a>
-<span class="sourceLineNo">5192</span>    assertFalse(hasNext);<a name="line.5192"></a>
-<span class="sourceLineNo">5193</span>    scanner.close();<a name="line.5193"></a>
-<span class="sourceLineNo">5194</span><a name="line.5194"></a>
-<span class="sourceLineNo">5195</span>    scan = new Scan(rowD, rowA);<a name="line.5195"></a>
-<span class="sourceLineNo">5196</span>    scan.addColumn(families[0], col2);<a name="line.5196"></a>
-<span class="sourceLineNo">5197</span>    scan.setReversed(true);<a name="line.5197"></a>
-<span class="sourceLineNo">5198</span>    currRow.clear();<a name="line.5198"></a>
-<span class="sourceLineNo">5199</span>    scanner = region.getScanner(scan);<a name="line.5199"></a>
-<span class="sourceLineNo">5200</span>    hasNext = scanner.next(currRow);<a name="line.5200"></a>
-<span class="sourceLineNo">5201</span>    assertEquals(1, currRow.size());<a name="line.5201"></a>
-<span class="sourceLineNo">5202</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5202"></a>
-<span class="sourceLineNo">5203</span>        .get(0).getRowLength(), rowD, 0, rowD.length));<a name="line.5203"></a>
-<span class="sourceLineNo">5204</span>    scanner.close();<a name="line.5204"></a>
-<span class="sourceLineNo">5205</span>  }<a name="line.5205"></a>
-<span class="sourceLineNo">5206</span><a name="line.5206"></a>
-<span class="sourceLineNo">5207</span>  @Test<a name="line.5207"></a>
-<span class="sourceLineNo">5208</span>  public void testReverseScanner_FromMemStoreAndHFiles_MultiCFs1()<a name="line.5208"></a>
-<span class="sourceLineNo">5209</span>      throws IOException {<a name="line.5209"></a>
-<span class="sourceLineNo">5210</span>    byte[] row0 = Bytes.toBytes("row0"); // 1 kv<a name="line.5210"></a>
-<span class="sourceLineNo">5211</span>    byte[] row1 = Bytes.toBytes("row1"); // 2 kv<a name="line.5211"></a>
-<span class="sourceLineNo">5212</span>    byte[] row2 = Bytes.toBytes("row2"); // 4 kv<a name="line.5212"></a>
-<span class="sourceLineNo">5213</span>    byte[] row3 = Bytes.toBytes("row3"); // 2 kv<a name="line.5213"></a>
-<span class="sourceLineNo">5214</span>    byte[] row4 = Bytes.toBytes("row4"); // 5 kv<a name="line.5214"></a>
-<span class="sourceLineNo">5215</span>    byte[] row5 = Bytes.toBytes("row5"); // 2 kv<a name="line.5215"></a>
-<span class="sourceLineNo">5216</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5216"></a>
-<span class="sourceLineNo">5217</span>    byte[] cf2 = Bytes.toBytes("CF2");<a name="line.5217"></a>
-<span class="sourceLineNo">5218</span>    byte[] cf3 = Bytes.toBytes("CF3");<a name="line.5218"></a>
-<span class="sourceLineNo">5219</span>    byte[][] families = { cf1, cf2, cf3 };<a name="line.5219"></a>
-<span class="sourceLineNo">5220</span>    byte[] col = Bytes.toBytes("C");<a name="line.5220"></a>
-<span class="sourceLineNo">5221</span>    long ts = 1;<a name="line.5221"></a>
-<span class="sourceLineNo">5222</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5222"></a>
-<span class="sourceLineNo">5223</span>    // disable compactions in this test.<a name="line.5223"></a>
-<span class="sourceLineNo">5224</span>    conf.setInt("hbase.hstore.compactionThreshold", 10000);<a name="line.5224"></a>
-<span class="sourceLineNo">5225</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5225"></a>
-<span class="sourceLineNo">5226</span>    // kv naming style: kv(row number) totalKvCountInThisRow seq no<a name="line.5226"></a>
-<span class="sourceLineNo">5227</span>    KeyValue kv0_1_1 = new KeyValue(row0, cf1, col, ts, KeyValue.Type.Put,<a name="line.5227"></a>
-<span class="sourceLineNo">5228</span>        null);<a name="line.5228"></a>
-<span class="sourceLineNo">5229</span>    KeyValue kv1_2_1 = new KeyValue(row1, cf2, col, ts, KeyValue.Type.Put,<a name="line.5229"></a>
-<span class="sourceLineNo">5230</span>        null);<a name="line.5230"></a>
-<span class="sourceLineNo">5231</span>    KeyValue kv1_2_2 = new KeyValue(row1, cf1, col, ts + 1,<a name="line.5231"></a>
-<span class="sourceLineNo">5232</span>        KeyValue.Type.Put, null);<a name="line.5232"></a>
-<span class="sourceLineNo">5233</span>    KeyValue kv2_4_1 = new KeyValue(row2, cf2, col, ts, KeyValue.Type.Put,<a name="line.5233"></a>
-<span class="sourceLineNo">5234</span>        null);<a name="line.5234"></a>
-<span class="sourceLineNo">5235</span>    KeyValue kv2_4_2 = new KeyValue(row2, cf1, col, ts, KeyValue.Type.Put,<a name="line.5235"></a>
-<span class="sourceLineNo">5236</span>        null);<a name="line.5236"></a>
-<span class="sourceLineNo">5237</span>    KeyValue kv2_4_3 = new KeyValue(row2, cf3, col, ts, KeyValue.Type.Put,<a name="line.5237"></a>
+<span class="sourceLineNo">4882</span>  public HRegion initHRegion(TableName tableName, byte[] startKey, byte[] stopKey,<a name="line.4882"></a>
+<span class="sourceLineNo">4883</span>      boolean isReadOnly, Durability durability, WAL wal, byte[]... families) throws IOException {<a name="line.4883"></a>
+<span class="sourceLineNo">4884</span>    return TEST_UTIL.createLocalHRegion(tableName, startKey, stopKey,<a name="line.4884"></a>
+<span class="sourceLineNo">4885</span>        isReadOnly, durability, wal, families);<a name="line.4885"></a>
+<span class="sourceLineNo">4886</span>  }<a name="line.4886"></a>
+<span class="sourceLineNo">4887</span><a name="line.4887"></a>
+<span class="sourceLineNo">4888</span>  /**<a name="line.4888"></a>
+<span class="sourceLineNo">4889</span>   * Assert that the passed in Cell has expected contents for the specified row,<a name="line.4889"></a>
+<span class="sourceLineNo">4890</span>   * column &amp; timestamp.<a name="line.4890"></a>
+<span class="sourceLineNo">4891</span>   */<a name="line.4891"></a>
+<span class="sourceLineNo">4892</span>  private void checkOneCell(Cell kv, byte[] cf, int rowIdx, int colIdx, long ts) {<a name="line.4892"></a>
+<span class="sourceLineNo">4893</span>    String ctx = "rowIdx=" + rowIdx + "; colIdx=" + colIdx + "; ts=" + ts;<a name="line.4893"></a>
+<span class="sourceLineNo">4894</span>    assertEquals("Row mismatch which checking: " + ctx, "row:" + rowIdx,<a name="line.4894"></a>
+<span class="sourceLineNo">4895</span>        Bytes.toString(CellUtil.cloneRow(kv)));<a name="line.4895"></a>
+<span class="sourceLineNo">4896</span>    assertEquals("ColumnFamily mismatch while checking: " + ctx, Bytes.toString(cf),<a name="line.4896"></a>
+<span class="sourceLineNo">4897</span>        Bytes.toString(CellUtil.cloneFamily(kv)));<a name="line.4897"></a>
+<span class="sourceLineNo">4898</span>    assertEquals("Column qualifier mismatch while checking: " + ctx, "column:" + colIdx,<a name="line.4898"></a>
+<span class="sourceLineNo">4899</span>        Bytes.toString(CellUtil.cloneQualifier(kv)));<a name="line.4899"></a>
+<span class="sourceLineNo">4900</span>    assertEquals("Timestamp mismatch while checking: " + ctx, ts, kv.getTimestamp());<a name="line.4900"></a>
+<span class="sourceLineNo">4901</span>    assertEquals("Value mismatch while checking: " + ctx, "value-version-" + ts,<a name="line.4901"></a>
+<span class="sourceLineNo">4902</span>        Bytes.toString(CellUtil.cloneValue(kv)));<a name="line.4902"></a>
+<span class="sourceLineNo">4903</span>  }<a name="line.4903"></a>
+<span class="sourceLineNo">4904</span><a name="line.4904"></a>
+<span class="sourceLineNo">4905</span>  @Test<a name="line.4905"></a>
+<span class="sourceLineNo">4906</span>  public void testReverseScanner_FromMemStore_SingleCF_Normal()<a name="line.4906"></a>
+<span class="sourceLineNo">4907</span>      throws IOException {<a name="line.4907"></a>
+<span class="sourceLineNo">4908</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.4908"></a>
+<span class="sourceLineNo">4909</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.4909"></a>
+<span class="sourceLineNo">4910</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.4910"></a>
+<span class="sourceLineNo">4911</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.4911"></a>
+<span class="sourceLineNo">4912</span>    byte[][] families = { cf };<a name="line.4912"></a>
+<span class="sourceLineNo">4913</span>    byte[] col = Bytes.toBytes("C");<a name="line.4913"></a>
+<span class="sourceLineNo">4914</span>    long ts = 1;<a name="line.4914"></a>
+<span class="sourceLineNo">4915</span>    this.region = initHRegion(tableName, method, families);<a name="line.4915"></a>
+<span class="sourceLineNo">4916</span>    KeyValue kv1 = new KeyValue(rowC, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4916"></a>
+<span class="sourceLineNo">4917</span>    KeyValue kv11 = new KeyValue(rowC, cf, col, ts + 1, KeyValue.Type.Put,<a name="line.4917"></a>
+<span class="sourceLineNo">4918</span>        null);<a name="line.4918"></a>
+<span class="sourceLineNo">4919</span>    KeyValue kv2 = new KeyValue(rowA, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4919"></a>
+<span class="sourceLineNo">4920</span>    KeyValue kv3 = new KeyValue(rowB, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4920"></a>
+<span class="sourceLineNo">4921</span>    Put put = null;<a name="line.4921"></a>
+<span class="sourceLineNo">4922</span>    put = new Put(rowC);<a name="line.4922"></a>
+<span class="sourceLineNo">4923</span>    put.add(kv1);<a name="line.4923"></a>
+<span class="sourceLineNo">4924</span>    put.add(kv11);<a name="line.4924"></a>
+<span class="sourceLineNo">4925</span>    region.put(put);<a name="line.4925"></a>
+<span class="sourceLineNo">4926</span>    put = new Put(rowA);<a name="line.4926"></a>
+<span class="sourceLineNo">4927</span>    put.add(kv2);<a name="line.4927"></a>
+<span class="sourceLineNo">4928</span>    region.put(put);<a name="line.4928"></a>
+<span class="sourceLineNo">4929</span>    put = new Put(rowB);<a name="line.4929"></a>
+<span class="sourceLineNo">4930</span>    put.add(kv3);<a name="line.4930"></a>
+<span class="sourceLineNo">4931</span>    region.put(put);<a name="line.4931"></a>
+<span class="sourceLineNo">4932</span><a name="line.4932"></a>
+<span class="sourceLineNo">4933</span>    Scan scan = new Scan(rowC);<a name="line.4933"></a>
+<span class="sourceLineNo">4934</span>    scan.setMaxVersions(5);<a name="line.4934"></a>
+<span class="sourceLineNo">4935</span>    scan.setReversed(true);<a name="line.4935"></a>
+<span class="sourceLineNo">4936</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.4936"></a>
+<span class="sourceLineNo">4937</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.4937"></a>
+<span class="sourceLineNo">4938</span>    boolean hasNext = scanner.next(currRow);<a name="line.4938"></a>
+<span class="sourceLineNo">4939</span>    assertEquals(2, currRow.size());<a name="line.4939"></a>
+<span class="sourceLineNo">4940</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4940"></a>
+<span class="sourceLineNo">4941</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.4941"></a>
+<span class="sourceLineNo">4942</span>    assertTrue(hasNext);<a name="line.4942"></a>
+<span class="sourceLineNo">4943</span>    currRow.clear();<a name="line.4943"></a>
+<span class="sourceLineNo">4944</span>    hasNext = scanner.next(currRow);<a name="line.4944"></a>
+<span class="sourceLineNo">4945</span>    assertEquals(1, currRow.size());<a name="line.4945"></a>
+<span class="sourceLineNo">4946</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4946"></a>
+<span class="sourceLineNo">4947</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.4947"></a>
+<span class="sourceLineNo">4948</span>    assertTrue(hasNext);<a name="line.4948"></a>
+<span class="sourceLineNo">4949</span>    currRow.clear();<a name="line.4949"></a>
+<span class="sourceLineNo">4950</span>    hasNext = scanner.next(currRow);<a name="line.4950"></a>
+<span class="sourceLineNo">4951</span>    assertEquals(1, currRow.size());<a name="line.4951"></a>
+<span class="sourceLineNo">4952</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4952"></a>
+<span class="sourceLineNo">4953</span>        .get(0).getRowLength(), rowA, 0, rowA.length));<a name="line.4953"></a>
+<span class="sourceLineNo">4954</span>    assertFalse(hasNext);<a name="line.4954"></a>
+<span class="sourceLineNo">4955</span>    scanner.close();<a name="line.4955"></a>
+<span class="sourceLineNo">4956</span>  }<a name="line.4956"></a>
+<span class="sourceLineNo">4957</span><a name="line.4957"></a>
+<span class="sourceLineNo">4958</span>  @Test<a name="line.4958"></a>
+<span class="sourceLineNo">4959</span>  public void testReverseScanner_FromMemStore_SingleCF_LargerKey()<a name="line.4959"></a>
+<span class="sourceLineNo">4960</span>      throws IOException {<a name="line.4960"></a>
+<span class="sourceLineNo">4961</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.4961"></a>
+<span class="sourceLineNo">4962</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.4962"></a>
+<span class="sourceLineNo">4963</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.4963"></a>
+<span class="sourceLineNo">4964</span>    byte[] rowD = Bytes.toBytes("rowD");<a name="line.4964"></a>
+<span class="sourceLineNo">4965</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.4965"></a>
+<span class="sourceLineNo">4966</span>    byte[][] families = { cf };<a name="line.4966"></a>
+<span class="sourceLineNo">4967</span>    byte[] col = Bytes.toBytes("C");<a name="line.4967"></a>
+<span class="sourceLineNo">4968</span>    long ts = 1;<a name="line.4968"></a>
+<span class="sourceLineNo">4969</span>    this.region = initHRegion(tableName, method, families);<a name="line.4969"></a>
+<span class="sourceLineNo">4970</span>    KeyValue kv1 = new KeyValue(rowC, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4970"></a>
+<span class="sourceLineNo">4971</span>    KeyValue kv11 = new KeyValue(rowC, cf, col, ts + 1, KeyValue.Type.Put,<a name="line.4971"></a>
+<span class="sourceLineNo">4972</span>        null);<a name="line.4972"></a>
+<span class="sourceLineNo">4973</span>    KeyValue kv2 = new KeyValue(rowA, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4973"></a>
+<span class="sourceLineNo">4974</span>    KeyValue kv3 = new KeyValue(rowB, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4974"></a>
+<span class="sourceLineNo">4975</span>    Put put = null;<a name="line.4975"></a>
+<span class="sourceLineNo">4976</span>    put = new Put(rowC);<a name="line.4976"></a>
+<span class="sourceLineNo">4977</span>    put.add(kv1);<a name="line.4977"></a>
+<span class="sourceLineNo">4978</span>    put.add(kv11);<a name="line.4978"></a>
+<span class="sourceLineNo">4979</span>    region.put(put);<a name="line.4979"></a>
+<span class="sourceLineNo">4980</span>    put = new Put(rowA);<a name="line.4980"></a>
+<span class="sourceLineNo">4981</span>    put.add(kv2);<a name="line.4981"></a>
+<span class="sourceLineNo">4982</span>    region.put(put);<a name="line.4982"></a>
+<span class="sourceLineNo">4983</span>    put = new Put(rowB);<a name="line.4983"></a>
+<span class="sourceLineNo">4984</span>    put.add(kv3);<a name="line.4984"></a>
+<span class="sourceLineNo">4985</span>    region.put(put);<a name="line.4985"></a>
+<span class="sourceLineNo">4986</span><a name="line.4986"></a>
+<span class="sourceLineNo">4987</span>    Scan scan = new Scan(rowD);<a name="line.4987"></a>
+<span class="sourceLineNo">4988</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.4988"></a>
+<span class="sourceLineNo">4989</span>    scan.setReversed(true);<a name="line.4989"></a>
+<span class="sourceLineNo">4990</span>    scan.setMaxVersions(5);<a name="line.4990"></a>
+<span class="sourceLineNo">4991</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.4991"></a>
+<span class="sourceLineNo">4992</span>    boolean hasNext = scanner.next(currRow);<a name="line.4992"></a>
+<span class="sourceLineNo">4993</span>    assertEquals(2, currRow.size());<a name="line.4993"></a>
+<span class="sourceLineNo">4994</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4994"></a>
+<span class="sourceLineNo">4995</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.4995"></a>
+<span class="sourceLineNo">4996</span>    assertTrue(hasNext);<a name="line.4996"></a>
+<span class="sourceLineNo">4997</span>    currRow.clear();<a name="line.4997"></a>
+<span class="sourceLineNo">4998</span>    hasNext = scanner.next(currRow);<a name="line.4998"></a>
+<span class="sourceLineNo">4999</span>    assertEquals(1, currRow.size());<a name="line.4999"></a>
+<span class="sourceLineNo">5000</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5000"></a>
+<span class="sourceLineNo">5001</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.5001"></a>
+<span class="sourceLineNo">5002</span>    assertTrue(hasNext);<a name="line.5002"></a>
+<span class="sourceLineNo">5003</span>    currRow.clear();<a name="line.5003"></a>
+<span class="sourceLineNo">5004</span>    hasNext = scanner.next(currRow);<a name="line.5004"></a>
+<span class="sourceLineNo">5005</span>    assertEquals(1, currRow.size());<a name="line.5005"></a>
+<span class="sourceLineNo">5006</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5006"></a>
+<span class="sourceLineNo">5007</span>        .get(0).getRowLength(), rowA, 0, rowA.length));<a name="line.5007"></a>
+<span class="sourceLineNo">5008</span>    assertFalse(hasNext);<a name="line.5008"></a>
+<span class="sourceLineNo">5009</span>    scanner.close();<a name="line.5009"></a>
+<span class="sourceLineNo">5010</span>  }<a name="line.5010"></a>
+<span class="sourceLineNo">5011</span><a name="line.5011"></a>
+<span class="sourceLineNo">5012</span>  @Test<a name="line.5012"></a>
+<span class="sourceLineNo">5013</span>  public void testReverseScanner_FromMemStore_SingleCF_FullScan()<a name="line.5013"></a>
+<span class="sourceLineNo">5014</span>      throws IOException {<a name="line.5014"></a>
+<span class="sourceLineNo">5015</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.5015"></a>
+<span class="sourceLineNo">5016</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.5016"></a>
+<span class="sourceLineNo">5017</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.5017"></a>
+<span class="sourceLineNo">5018</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.5018"></a>
+<span class="sourceLineNo">5019</span>    byte[][] families = { cf };<a name="line.5019"></a>
+<span class="sourceLineNo">5020</span>    byte[] col = Bytes.toBytes("C");<a name="line.5020"></a>
+<span class="sourceLineNo">5021</span>    long ts = 1;<a name="line.5021"></a>
+<span class="sourceLineNo">5022</span>    this.region = initHRegion(tableName, method, families);<a name="line.5022"></a>
+<span class="sourceLineNo">5023</span>    KeyValue kv1 = new KeyValue(rowC, cf, col, ts, KeyValue.Type.Put, null);<a name="line.5023"></a>
+<span class="sourceLineNo">5024</span>    KeyValue kv11 = new KeyValue(rowC, cf, col, ts + 1, KeyValue.Type.Put,<a name="line.5024"></a>
+<span class="sourceLineNo">5025</span>        null);<a name="line.5025"></a>
+<span class="sourceLineNo">5026</span>    KeyValue kv2 = new KeyValue(rowA, cf, col, ts, KeyValue.Type.Put, null);<a name="line.5026"></a>
+<span class="sourceLineNo">5027</span>    KeyValue kv3 = new KeyValue(rowB, cf, col, ts, KeyValue.Type.Put, null);<a name="line.5027"></a>
+<span class="sourceLineNo">5028</span>    Put put = null;<a name="line.5028"></a>
+<span class="sourceLineNo">5029</span>    put = new Put(rowC);<a name="line.5029"></a>
+<span class="sourceLineNo">5030</span>    put.add(kv1);<a name="line.5030"></a>
+<span class="sourceLineNo">5031</span>    put.add(kv11);<a name="line.5031"></a>
+<span class="sourceLineNo">5032</span>    region.put(put);<a name="line.5032"></a>
+<span class="sourceLineNo">5033</span>    put = new Put(rowA);<a name="line.5033"></a>
+<span class="sourceLineNo">5034</span>    put.add(kv2);<a name="line.5034"></a>
+<span class="sourceLineNo">5035</span>    region.put(put);<a name="line.5035"></a>
+<span class="sourceLineNo">5036</span>    put = new Put(rowB);<a name="line.5036"></a>
+<span class="sourceLineNo">5037</span>    put.add(kv3);<a name="line.5037"></a>
+<span class="sourceLineNo">5038</span>    region.put(put);<a name="line.5038"></a>
+<span class="sourceLineNo">5039</span>    Scan scan = new Scan();<a name="line.5039"></a>
+<span class="sourceLineNo">5040</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5040"></a>
+<span class="sourceLineNo">5041</span>    scan.setReversed(true);<a name="line.5041"></a>
+<span class="sourceLineNo">5042</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5042"></a>
+<span class="sourceLineNo">5043</span>    boolean hasNext = scanner.next(currRow);<a name="line.5043"></a>
+<span class="sourceLineNo">5044</span>    assertEquals(1, currRow.size());<a name="line.5044"></a>
+<span class="sourceLineNo">5045</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5045"></a>
+<span class="sourceLineNo">5046</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.5046"></a>
+<span class="sourceLineNo">5047</span>    assertTrue(hasNext);<a name="line.5047"></a>
+<span class="sourceLineNo">5048</span>    currRow.clear();<a name="line.5048"></a>
+<span class="sourceLineNo">5049</span>    hasNext = scanner.next(currRow);<a name="line.5049"></a>
+<span class="sourceLineNo">5050</span>    assertEquals(1, currRow.size());<a name="line.5050"></a>
+<span class="sourceLineNo">5051</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5051"></a>
+<span class="sourceLineNo">5052</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.5052"></a>
+<span class="sourceLineNo">5053</span>    assertTrue(hasNext);<a name="line.5053"></a>
+<span class="sourceLineNo">5054</span>    currRow.clear();<a name="line.5054"></a>
+<span class="sourceLineNo">5055</span>    hasNext = scanner.next(currRow);<a name="line.5055"></a>
+<span class="sourceLineNo">5056</span>    assertEquals(1, currRow.size());<a name="line.5056"></a>
+<span class="sourceLineNo">5057</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5057"></a>
+<span class="sourceLineNo">5058</span>        .get(0).getRowLength(), rowA, 0, rowA.length));<a name="line.5058"></a>
+<span class="sourceLineNo">5059</span>    assertFalse(hasNext);<a name="line.5059"></a>
+<span class="sourceLineNo">5060</span>    scanner.close();<a name="line.5060"></a>
+<span class="sourceLineNo">5061</span>  }<a name="line.5061"></a>
+<span class="sourceLineNo">5062</span><a name="line.5062"></a>
+<span class="sourceLineNo">5063</span>  @Test<a name="line.5063"></a>
+<span class="sourceLineNo">5064</span>  public void testReverseScanner_moreRowsMayExistAfter() throws IOException {<a name="line.5064"></a>
+<span class="sourceLineNo">5065</span>    // case for "INCLUDE_AND_SEEK_NEXT_ROW &amp; SEEK_NEXT_ROW" endless loop<a name="line.5065"></a>
+<span class="sourceLineNo">5066</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.5066"></a>
+<span class="sourceLineNo">5067</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.5067"></a>
+<span class="sourceLineNo">5068</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.5068"></a>
+<span class="sourceLineNo">5069</span>    byte[] rowD = Bytes.toBytes("rowD");<a name="line.5069"></a>
+<span class="sourceLineNo">5070</span>    byte[] rowE = Bytes.toBytes("rowE");<a name="line.5070"></a>
+<span class="sourceLineNo">5071</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.5071"></a>
+<span class="sourceLineNo">5072</span>    byte[][] families = { cf };<a name="line.5072"></a>
+<span class="sourceLineNo">5073</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.5073"></a>
+<span class="sourceLineNo">5074</span>    byte[] col2 = Bytes.toBytes("col2");<a name="line.5074"></a>
+<span class="sourceLineNo">5075</span>    long ts = 1;<a name="line.5075"></a>
+<span class="sourceLineNo">5076</span>    this.region = initHRegion(tableName, method, families);<a name="line.5076"></a>
+<span class="sourceLineNo">5077</span>    KeyValue kv1 = new KeyValue(rowA, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5077"></a>
+<span class="sourceLineNo">5078</span>    KeyValue kv2 = new KeyValue(rowB, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5078"></a>
+<span class="sourceLineNo">5079</span>    KeyValue kv3 = new KeyValue(rowC, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5079"></a>
+<span class="sourceLineNo">5080</span>    KeyValue kv4_1 = new KeyValue(rowD, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5080"></a>
+<span class="sourceLineNo">5081</span>    KeyValue kv4_2 = new KeyValue(rowD, cf, col2, ts, KeyValue.Type.Put, null);<a name="line.5081"></a>
+<span class="sourceLineNo">5082</span>    KeyValue kv5 = new KeyValue(rowE, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5082"></a>
+<span class="sourceLineNo">5083</span>    Put put = null;<a name="line.5083"></a>
+<span class="sourceLineNo">5084</span>    put = new Put(rowA);<a name="line.5084"></a>
+<span class="sourceLineNo">5085</span>    put.add(kv1);<a name="line.5085"></a>
+<span class="sourceLineNo">5086</span>    region.put(put);<a name="line.5086"></a>
+<span class="sourceLineNo">5087</span>    put = new Put(rowB);<a name="line.5087"></a>
+<span class="sourceLineNo">5088</span>    put.add(kv2);<a name="line.5088"></a>
+<span class="sourceLineNo">5089</span>    region.put(put);<a name="line.5089"></a>
+<span class="sourceLineNo">5090</span>    put = new Put(rowC);<a name="line.5090"></a>
+<span class="sourceLineNo">5091</span>    put.add(kv3);<a name="line.5091"></a>
+<span class="sourceLineNo">5092</span>    region.put(put);<a name="line.5092"></a>
+<span class="sourceLineNo">5093</span>    put = new Put(rowD);<a name="line.5093"></a>
+<span class="sourceLineNo">5094</span>    put.add(kv4_1);<a name="line.5094"></a>
+<span class="sourceLineNo">5095</span>    region.put(put);<a name="line.5095"></a>
+<span class="sourceLineNo">5096</span>    put = new Put(rowD);<a name="line.5096"></a>
+<span class="sourceLineNo">5097</span>    put.add(kv4_2);<a name="line.5097"></a>
+<span class="sourceLineNo">5098</span>    region.put(put);<a name="line.5098"></a>
+<span class="sourceLineNo">5099</span>    put = new Put(rowE);<a name="line.5099"></a>
+<span class="sourceLineNo">5100</span>    put.add(kv5);<a name="line.5100"></a>
+<span class="sourceLineNo">5101</span>    region.put(put);<a name="line.5101"></a>
+<span class="sourceLineNo">5102</span>    region.flush(true);<a name="line.5102"></a>
+<span class="sourceLineNo">5103</span>    Scan scan = new Scan(rowD, rowA);<a name="line.5103"></a>
+<span class="sourceLineNo">5104</span>    scan.addColumn(families[0], col1);<a name="line.5104"></a>
+<span class="sourceLineNo">5105</span>    scan.setReversed(true);<a name="line.5105"></a>
+<span class="sourceLineNo">5106</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5106"></a>
+<span class="sourceLineNo">5107</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5107"></a>
+<span class="sourceLineNo">5108</span>    boolean hasNext = scanner.next(currRow);<a name="line.5108"></a>
+<span class="sourceLineNo">5109</span>    assertEquals(1, currRow.size());<a name="line.5109"></a>
+<span class="sourceLineNo">5110</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5110"></a>
+<span class="sourceLineNo">5111</span>        .get(0).getRowLength(), rowD, 0, rowD.length));<a name="line.5111"></a>
+<span class="sourceLineNo">5112</span>    assertTrue(hasNext);<a name="line.5112"></a>
+<span class="sourceLineNo">5113</span>    currRow.clear();<a name="line.5113"></a>
+<span class="sourceLineNo">5114</span>    hasNext = scanner.next(currRow);<a name="line.5114"></a>
+<span class="sourceLineNo">5115</span>    assertEquals(1, currRow.size());<a name="line.5115"></a>
+<span class="sourceLineNo">5116</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5116"></a>
+<span class="sourceLineNo">5117</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.5117"></a>
+<span class="sourceLineNo">5118</span>    assertTrue(hasNext);<a name="line.5118"></a>
+<span class="sourceLineNo">5119</span>    currRow.clear();<a name="line.5119"></a>
+<span class="sourceLineNo">5120</span>    hasNext = scanner.next(currRow);<a name="line.5120"></a>
+<span class="sourceLineNo">5121</span>    assertEquals(1, currRow.size());<a name="line.5121"></a>
+<span class="sourceLineNo">5122</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5122"></a>
+<span class="sourceLineNo">5123</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.5123"></a>
+<span class="sourceLineNo">5124</span>    assertFalse(hasNext);<a name="line.5124"></a>
+<span class="sourceLineNo">5125</span>    scanner.close();<a name="line.5125"></a>
+<span class="sourceLineNo">5126</span><a name="line.5126"></a>
+<span class="sourceLineNo">5127</span>    scan = new Scan(rowD, rowA);<a name="line.5127"></a>
+<span class="sourceLineNo">5128</span>    scan.addColumn(families[0], col2);<a name="line.5128"></a>
+<span class="sourceLineNo">5129</span>    scan.setReversed(true);<a name="line.5129"></a>
+<span class="sourceLineNo">5130</span>    currRow.clear();<a name="line.5130"></a>
+<span class="sourceLineNo">5131</span>    scanner = region.getScanner(scan);<a name="line.5131"></a>
+<span class="sourceLineNo">5132</span>    hasNext = scanner.next(currRow);<a name="line.5132"></a>
+<span class="sourceLineNo">5133</span>    assertEquals(1, currRow.size());<a name="line.5133"></a>
+<span class="sourceLineNo">5134</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5134"></a>
+<span class="sourceLineNo">5135</span>        .get(0).getRowLength(), rowD, 0, rowD.length));<a name="line.5135"></a>
+<span class="sourceLineNo">5136</span>    scanner.close();<a name="line.5136"></a>
+<span class="sourceLineNo">5137</span>  }<a name="line.5137"></a>
+<span class="sourceLineNo">5138</span><a name="line.5138"></a>
+<span class="sourceLineNo">5139</span>  @Test<a name="line.5139"></a>
+<span class="sourceLineNo">5140</span>  public void testReverseScanner_smaller_blocksize() throws IOException {<a name="line.5140"></a>
+<span class="sourceLineNo">5141</span>    // case to ensure no conflict with HFile index optimization<a name="line.5141"></a>
+<span class="sourceLineNo">5142</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.5142"></a>
+<span class="sourceLineNo">5143</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.5143"></a>
+<span class="sourceLineNo">5144</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.5144"></a>
+<span class="sourceLineNo">5145</span>    byte[] rowD = Bytes.toBytes("rowD");<a name="line.5145"></a>
+<span class="sourceLineNo">5146</span>    byte[] rowE = Bytes.toBytes("rowE");<a name="line.5146"></a>
+<span class="sourceLineNo">5147</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.5147"></a>
+<span class="sourceLineNo">5148</span>    byte[][] families = { cf };<a name="line.5148"></a>
+<span class="sourceLineNo">5149</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.5149"></a>
+<span class="sourceLineNo">5150</span>    byte[] col2 = Bytes.toBytes("col2");<a name="line.5150"></a>
+<span class="sourceLineNo">5151</span>    long ts = 1;<a name="line.5151"></a>
+<span class="sourceLineNo">5152</span>    HBaseConfiguration config = new HBaseConfiguration();<a name="line.5152"></a>
+<span class="sourceLineNo">5153</span>    config.setInt("test.block.size", 1);<a name="line.5153"></a>
+<span class="sourceLineNo">5154</span>    this.region = initHRegion(tableName, method, config, families);<a name="line.5154"></a>
+<span class="sourceLineNo">5155</span>    KeyValue kv1 = new KeyValue(rowA, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5155"></a>
+<span class="sourceLineNo">5156</span>    KeyValue kv2 = new KeyValue(rowB, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5156"></a>
+<span class="sourceLineNo">5157</span>    KeyValue kv3 = new KeyValue(rowC, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5157"></a>
+<span class="sourceLineNo">5158</span>    KeyValue kv4_1 = new KeyValue(rowD, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5158"></a>
+<span class="sourceLineNo">5159</span>    KeyValue kv4_2 = new KeyValue(rowD, cf, col2, ts, KeyValue.Type.Put, null);<a name="line.5159"></a>
+<span class="sourceLineNo">5160</span>    KeyValue kv5 = new KeyValue(rowE, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5160"></a>
+<span class="sourceLineNo">5161</span>    Put put = null;<a name="line.5161"></a>
+<span class="sourceLineNo">5162</span>    put = new Put(rowA);<a name="line.5162"></a>
+<span class="sourceLineNo">5163</span>    put.add(kv1);<a name="line.5163"></a>
+<span class="sourceLineNo">5164</span>    region.put(put);<a name="line.5164"></a>
+<span class="sourceLineNo">5165</span>    put = new Put(rowB);<a name="line.5165"></a>
+<span class="sourceLineNo">5166</span>    put.add(kv2);<a name="line.5166"></a>
+<span class="sourceLineNo">5167</span>    region.put(put);<a name="line.5167"></a>
+<span class="sourceLineNo">5168</span>    put = new Put(rowC);<a name="line.5168"></a>
+<span class="sourceLineNo">5169</span>    put.add(kv3);<a name="line.5169"></a>
+<span class="sourceLineNo">5170</span>    region.put(put);<a name="line.5170"></a>
+<span class="sourceLineNo">5171</span>    put = new Put(rowD);<a name="line.5171"></a>
+<span class="sourceLineNo">5172</span>    put.add(kv4_1);<a name="line.5172"></a>
+<span class="sourceLineNo">5173</span>    region.put(put);<a name="line.5173"></a>
+<span class="sourceLineNo">5174</span>    put = new Put(rowD);<a name="line.5174"></a>
+<span class="sourceLineNo">5175</span>    put.add(kv4_2);<a name="line.5175"></a>
+<span class="sourceLineNo">5176</span>    region.put(put);<a name="line.5176"></a>
+<span class="sourceLineNo">5177</span>    put = new Put(rowE);<a name="line.5177"></a>
+<span class="sourceLineNo">5178</span>    put.add(kv5);<a name="line.5178"></a>
+<span class="sourceLineNo">5179</span>    region.put(put);<a name="line.5179"></a>
+<span class="sourceLineNo">5180</span>    region.flush(true);<a name="line.5180"></a>
+<span class="sourceLineNo">5181</span>    Scan scan = new Scan(rowD, rowA);<a name="line.5181"></a>
+<span class="sourceLineNo">5182</span>    scan.addColumn(families[0], col1);<a name="line.5182"></a>
+<span class="sourceLineNo">5183</span>    scan.setReversed(true);<a name="line.5183"></a>
+<span class="sourceLineNo">5184</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5184"></a>
+<span class="sourceLineNo">5185</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5185"></a>
+<span class="sourceLineNo">5186</span>    boolean hasNext = scanner.next(currRow);<a name="line.5186"></a>
+<span class="sourceLineNo">5187</span>    assertEquals(1, currRow.size());<a name="line.5187"></a>
+<span class="sourceLineNo">5188</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5188"></a>
+<span class="sourceLineNo">5189</span>        .get(0).getRowLength(), rowD, 0, rowD.length));<a name="line.5189"></a>
+<span class="sourceLineNo">5190</span>    assertTrue(hasNext);<a name="line.5190"></a>
+<span class="sourceLineNo">5191</span>    currRow.clear();<a name="line.5191"></a>
+<span class="sourceLineNo">5192</span>    hasNext = scanner.next(currRow);<a name="line.5192"></a>
+<span class="sourceLineNo">5193</span>    assertEquals(1, currRow.size());<a name="line.5193"></a>
+<span class="sourceLineNo">5194</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5194"></a>
+<span class="sourceLineNo">5195</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.5195"></a>
+<span class="sourceLineNo">5196</span>    assertTrue(hasNext);<a name="line.5196"></a>
+<span class="sourceLineNo">5197</span>    currRow.clear();<a name="line.5197"></a>
+<span class="sourceLineNo">5198</span>    hasNext = scanner.next(currRow);<a name="line.5198"></a>
+<span class="sourceLineNo">5199</span>    assertEquals(1, currRow.size());<a name="line.5199"></a>
+<span class="sourceLineNo">5200</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5200"></a>
+<span class="sourceLineNo">5201</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.5201"></a>
+<span class="sourceLineNo">5202</span>    assertFalse(hasNext);<a name="line.5202"></a>
+<span class="sourceLineNo">5203</span>    scanner.close();<a name="line.5203"></a>
+<span class="sourceLineNo">5204</span><a name="line.5204"></a>
+<span class="sourceLineNo">5205</span>    scan = new Scan(rowD, rowA);<a name="line.5205"></a>
+<span class="sourceLineNo">5206</span>    scan.addColumn(families[0], col2);<a name="line.5206"></a>
+<span class="sourceLineNo">5207</span>    scan.setReversed(true);<a name="line.5207"></a>
+<span class="sourceLineNo">5208</span>    currRow.clear();<a name="line.5208"></a>
+<span class="sourceLineNo">5209</span>    scanner = region.getScanner(scan);<a name="line.5209"></a>
+<span class="sourceLineNo">5210</span>    hasNext = scanner.next(currRow);<a name="line.5210"></a>
+<span class="sourceLineNo">5211</span>    assertEquals(1, currRow.size());<a name="line.5211"></a>
+<span class="sourceLineNo">5212</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5212"></a>
+<span class="sourceLineNo">5213</span>        .get(0).getRowLength(), rowD, 0, rowD.length));<a name="line.5213"></a>
+<span class="sourceLineNo">5214</span>    scanner.close();<a name="line.5214"></a>
+<span class="sourceLineNo">5215</span>  }<a name="line.5215"></a>
+<span class="sourceLineNo">5216</span><a name="line.5216"></a>
+<span class="sourceLineNo">5217</span>  @Test<a name="line.5217"></a>
+<span class="sourceLineNo">5218</span>  public void testReverseScanner_FromMemStoreAndHFiles_MultiCFs1()<a name="line.5218"></a>
+<span class="sourceLineNo">5219</span>      throws IOException {<a name="line.5219"></a>
+<span class="sourceLineNo">5220</span>    byte[] row0 = Bytes.toBytes("row0"); // 1 kv<a name="line.5220"></a>
+<span class="sourceLineNo">5221</span>    byte[] row1 = Bytes.toBytes("row1"); // 2 kv<a name="line.5221"></a>
+<span class="sourceLineNo">5222</span>    byte[] row2 = Bytes.toBytes("row2"); // 4 kv<a name="line.5222"></a>
+<span class="sourceLineNo">5223</span>    byte[] row3 = Bytes.toBytes("row3"); // 2 kv<a name="line.5223"></a>
+<span class="sourceLineNo">5224</span>    byte[] row4 = Bytes.toBytes("row4"); // 5 kv<a name="line.5224"></a>
+<span class="sourceLineNo">5225</span>    byte[] row5 = Bytes.toBytes("row5"); // 2 kv<a name="line.5225"></a>
+<span class="sourceLineNo">5226</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5226"></a>
+<span class="sourceLineNo">5227</span>    byte[] cf2 = Bytes.toBytes("CF2");<a name="line.5227"></a>
+<span class="sourceLineNo">5228</span>    byte[] cf3 = Bytes.toBytes("CF3");<a name="line.5228"></a>
+<span class="sourceLineNo">5229</span>    byte[][] families = { cf1, cf2, cf3 };<a name="line.5229"></a>
+<span class="sourceLineNo">5230</span>    byte[] col = Bytes.toBytes("C");<a name="line.5230"></a>
+<span class="sourceLineNo">5231</span>    long ts = 1;<a name="line.5231"></a>
+<span class="sourceLineNo">5232</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5232"></a>
+<span class="sourceLineNo">5233</span>    // disable compactions in this test.<a name="line.5233"></a>
+<span class="sourceLineNo">5234</span>    conf.setInt("hbase.hstore.compactionThreshold", 10000);<a name="line.5234"></a>
+<span class="sourceLineNo">5235</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5235"></a>
+<span class="sourceLineNo">5236</span>    // kv naming style: kv(row number) totalKvCountInThisRow seq no<a name="line.5236"></a>
+<span class="sourceLineNo">5237</span>    KeyValue kv0_1_1 = new KeyValue(row0, cf1, col, ts, KeyValue.Type.Put,<a name="line.5237"></a>
 <span class="sourceLineNo">5238</span>        null);<a name="line.5238"></a>
-<span class="sourceLineNo">5239</span>    KeyValue kv2_4_4 = new KeyValue(row2, cf1, col, ts + 4,<a name="line.5239"></a>
-<span class="sourceLineNo">5240</span>        KeyValue.Type.Put, null);<a name="line.5240"></a>
-<span class="sourceLineNo">5241</span>    KeyValue kv3_2_1 = new KeyValue(row3, cf2, col, ts, KeyValue.Type.Put,<a name="line.5241"></a>
-<span class="sourceLineNo">5242</span>        null);<a name="line.5242"></a>
-<span class="sourceLineNo">5243</span>    KeyValue kv3_2_2 = new KeyValue(row3, cf1, col, ts + 4,<a name="line.5243"></a>
-<span class="sourceLineNo">5244</span>        KeyValue.Type.Put, null);<a name="line.5244"></a>
-<span class="sourceLineNo">5245</span>    KeyValue kv4_5_1 = new KeyValue(row4, cf1, col, ts, KeyValue.Type.Put,<a name="line.5245"></a>
+<span class="sourceLineNo">5239</span>    KeyValue kv1_2_1 = new KeyValue(row1, cf2, col, ts, KeyValue.Type.Put,<a name="line.5239"></a>
+<span class="sourceLineNo">5240</span>        null);<a name="line.5240"></a>
+<span class="sourceLineNo">5241</span>    KeyValue kv1_2_2 = new KeyValue(row1, cf1, col, ts + 1,<a name="line.5241"></a>
+<span class="sourceLineNo">5242</span>        KeyValue.Type.Put, null);<a name="line.5242"></a>
+<span class="sourceLineNo">5243</span>    KeyValue kv2_4_1 = new KeyValue(row2, cf2, col, ts, KeyValue.Type.Put,<a name="line.5243"></a>
+<span class="sourceLineNo">5244</span>        null);<a name="line.5244"></a>
+<span class="sourceLineNo">5245</span>    KeyValue kv2_4_2 = new KeyValue(row2, cf1, col, ts, KeyValue.Type.Put,<a name="line.5245"></a>
 <span class="sourceLineNo">5246</span>        null);<a name="line.5246"></a>
-<span class="sourceLineNo">5247</span>    KeyValue kv4_5_2 = new KeyValue(row4, cf3, col, ts, KeyValue.Type.Put,<a name="line.5247"></a>
+<span class="sourceLineNo">5247</span>    KeyValue kv2_4_3 = new KeyValue(row2, cf3, col, ts, KeyValue.Type.Put,<a name="line.5247"></a>
 <span class="sourceLineNo">5248</span>        null);<a name="line.5248"></a>
-<span class="sourceLineNo">5249</span>    KeyValue kv4_5_3 = new KeyValue(row4, cf3, col, ts + 5,<a name="line.5249"></a>
+<span class="sourceLineNo">5249</span>    KeyValue kv2_4_4 = new KeyValue(row2, cf1, col, ts + 4,<a name="line.5249"></a>
 <span class="sourceLineNo">5250</span>        KeyValue.Type.Put, null);<a name="line.5250"></a>
-<span class="sourceLineNo">5251</span>    KeyValue kv4_5_4 = new KeyValue(row4, cf2, col, ts, KeyValue.Type.Put,<a name="line.5251"></a>
+<span class="sourceLineNo">5251</span>    KeyValue kv3_2_1 = new KeyValue(row3, cf2, col, ts, KeyValue.Type.Put,<a name="line.5251"></a>
 <span class="sourceLineNo">5252</span>        null);<a name="line.5252"></a>
-<span class="sourceLineNo">5253</span>    KeyValue kv4_5_5 = new KeyValue(row4, cf1, col, ts + 3,<a name="line.5253"></a>
+<span class="sourceLineNo">5253</span>    KeyValue kv3_2_2 = new KeyValue(row3, cf1, col, ts + 4,<a name="line.5253"></a>
 <span class="sourceLineNo">5254</span>        KeyValue.Type.Put, null);<a name="line.5254"></a>
-<span class="sourceLineNo">5255</span>    KeyValue kv5_2_1 = new KeyValue(row5, cf2, col, ts, KeyValue.Type.Put,<a name="line.5255"></a>
+<span class="sourceLineNo">5255</span>    KeyValue kv4_5_1 = new KeyValue(row4, cf1, col, ts, KeyValue.Type.Put,<a name="line.5255"></a>
 <span class="sourceLineNo">5256</span>        null);<a name="line.5256"></a>
-<span class="sourceLineNo">5257</span>    KeyValue kv5_2_2 = new KeyValue(row5, cf3, col, ts, KeyValue.Type.Put,<a name="line.5257"></a>
+<span class="sourceLineNo">5257</span>    KeyValue kv4_5_2 = new KeyValue(row4, cf3, col, ts, KeyValue.Type.Put,<a name="line.5257"></a>
 <span class="sourceLineNo">5258</span>        null);<a name="line.5258"></a>
-<span class="sourceLineNo">5259</span>    // hfiles(cf1/cf2) :"row1"(1 kv) / "row2"(1 kv) / "row4"(2 kv)<a name="line.5259"></a>
-<span class="sourceLineNo">5260</span>    Put put = null;<a name="line.5260"></a>
-<span class="sourceLineNo">5261</span>    put = new Put(row1);<a name="line.5261"></a>
-<span class="sourceLineNo">5262</span>    put.add(kv1_2_1);<a name="line.5262"></a>
-<span class="sourceLineNo">5263</span>    region.put(put);<a name="line.5263"></a>
-<span class="sourceLineNo">5264</span>    put = new Put(row2);<a name="line.5264"></a>
-<span class="sourceLineNo">5265</span>    put.add(kv2_4_1);<a name="line.5265"></a>
-<span class="sourceLineNo">5266</span>    region.put(put);<a name="line.5266"></a>
-<span class="sourceLineNo">5267</span>    put = new Put(row4);<a name="line.5267"></a>
-<span class="sourceLineNo">5268</span>    put.add(kv4_5_4);<a name="line.5268"></a>
-<span class="sourceLineNo">5269</span>    put.add(kv4_5_5);<a name="line.5269"></a>
-<span class="sourceLineNo">5270</span>    region.put(put);<a name="line.5270"></a>
-<span class="sourceLineNo">5271</span>    region.flush(true);<a name="line.5271"></a>
-<span class="sourceLineNo">5272</span>    // hfiles(cf1/cf3) : "row1" (1 kvs) / "row2" (1 kv) / "row4" (2 kv)<a name="line.5272"></a>
-<span class="sourceLineNo">5273</span>    put = new Put(row4);<a name="line.5273"></a>
-<span class="sourceLineNo">5274</span>    put.add(kv4_5_1);<a name="line.5274"></a>
-<span class="sourceLineNo">5275</span>    put.add(kv4_5_3);<a name="line.5275"></a>
+<span class="sourceLineNo">5259</span>    KeyValue kv4_5_3 = new KeyValue(row4, cf3, col, ts + 5,<a name="line.5259"></a>
+<span class="sourceLineNo">5260</span>        KeyValue.Type.Put, null);<a name="line.5260"></a>
+<span class="sourceLineNo">5261</span>    KeyValue kv4_5_4 = new KeyValue(row4, cf2, col, ts, KeyValue.Type.Put,<a name="line.5261"></a>
+<span class="sourceLineNo">5262</span>        null);<a name="line.5262"></a>
+<span class="sourceLineNo">5263</span>    KeyValue kv4_5_5 = new KeyValue(row4, cf1, col, ts + 3,<a name="line.5263"></a>
+<span class="sourceLineNo">5264</span>        KeyValue.Type.Put, null);<a name="line.5264"></a>
+<span class="sourceLineNo">5265</span>    KeyValue kv5_2_1 = new KeyValue(row5, cf2, col, ts, KeyValue.Type.Put,<a name="line.5265"></a>
+<span class="sourceLineNo">5266</span>        null);<a name="line.5266"></a>
+<span class="sourceLineNo">5267</span>    KeyValue kv5_2_2 = new KeyValue(row5, cf3, col, ts, KeyValue.Type.Put,<a name="line.5267"></a>
+<span class="sourceLineNo">5268</span>        null);<a name="line.5268"></a>
+<span class="sourceLineNo">5269</span>    // hfiles(cf1/cf2) :"row1"(1 kv) / "row2"(1 kv) / "row4"(2 kv)<a name="line.5269"></a>
+<span class="sourceLineNo">5270</span>    Put put = null;<a name="line.5270"></a>
+<span class="sourceLineNo">5271</span>    put = new Put(row1);<a name="line.5271"></a>
+<span class="sourceLineNo">5272</span>    put.add(kv1_2_1);<a name="line.5272"></a>
+<span class="sourceLineNo">5273</span>    region.put(put);<a name="line.5273"></a>
+<span class="sourceLineNo">5274</span>    put = new Put(row2);<a name="line.5274"></a>
+<span class="sourceLineNo">5275</span>    put.add(kv2_4_1);<a name="line.5275"></a>
 <span class="sourceLineNo">5276</span>    region.put(put);<a name="line.5276"></a>
-<span class="sourceLineNo">5277</span>    put = new Put(row1);<a name="line.5277"></a>
-<span class="sourceLineNo">5278</span>    put.add(kv1_2_2);<a name="line.5278"></a>
-<span class="sourceLineNo">5279</span>    region.put(put);<a name="line.5279"></a>
-<span class="sourceLineNo">5280</span>    put = new Put(row2);<a name="line.5280"></a>
-<span class="sourceLineNo">5281</span>    put.add(kv2_4_4);<a name="line.5281"></a>
-<span class="sourceLineNo">5282</span>    region.put(put);<a name="line.5282"></a>
-<span class="sourceLineNo">5283</span>    region.flush(true);<a name="line.5283"></a>
-<span class="sourceLineNo">5284</span>    // hfiles(cf1/cf3) : "row2"(2 kv) / "row3"(1 kvs) / "row4" (1 kv)<a name="line.5284"></a>
-<span class="sourceLineNo">5285</span>    put = new Put(row4);<a name="line.5285"></a>
-<span class="sourceLineNo">5286</span>    put.add(kv4_5_2);<a name="line.5286"></a>
-<span class="sourceLineNo">5287</span>    region.put(put);<a name="line.5287"></a>
-<span class="sourceLineNo">5288</span>    put = new Put(row2);<a name="line.5288"></a>
-<span class="sourceLineNo">5289</span>    put.add(kv2_4_2);<a name="line.5289"></a>
-<span class="sourceLineNo">5290</span>    put.add(kv2_4_3);<a name="line.5290"></a>
-<span class="sourceLineNo">5291</span>    region.put(put);<a name="line.5291"></a>
-<span class="sourceLineNo">5292</span>    put = new Put(row3);<a name="line.5292"></a>
-<span class="sourceLineNo">5293</span>    put.add(kv3_2_2);<a name="line.5293"></a>
-<span class="sourceLineNo">5294</span>    region.put(put);<a name="line.5294"></a>
-<span class="sourceLineNo">5295</span>    region.flush(true);<a name="line.5295"></a>
-<span class="sourceLineNo">5296</span>    // memstore(cf1/cf2/cf3) : "row0" (1 kvs) / "row3" ( 1 kv) / "row5" (max)<a name="line.5296"></a>
-<span class="sourceLineNo">5297</span>    // ( 2 kv)<a name="line.5297"></a>
-<span class="sourceLineNo">5298</span>    put = new Put(row0);<a name="line.5298"></a>
-<span class="sourceLineNo">5299</span>    put.add(kv0_1_1);<a name="line.5299"></a>
-<span class="sourceLineNo">5300</span>    region.put(put);<a name="line.5300"></a>
-<span class="sourceLineNo">5301</span>    put = new Put(row3);<a name="line.5301"></a>
-<span class="sourceLineNo">5302</span>    put.add(kv3_2_1);<a name="line.5302"></a>
-<span class="sourceLineNo">5303</span>    region.put(put);<a name="line.5303"></a>
-<span class="sourceLineNo">5304</span>    put = new Put(row5);<a name="line.5304"></a>
-<span class="sourceLineNo">5305</span>    put.add(kv5_2_1);<a name="line.5305"></a>
-<span class="sourceLineNo">5306</span>    put.add(kv5_2_2);<a name="line.5306"></a>
-<span class="sourceLineNo">5307</span>    region.put(put);<a name="line.5307"></a>
-<span class="sourceLineNo">5308</span>    // scan range = ["row4", min), skip the max "row5"<a name="line.5308"></a>
-<span class="sourceLineNo">5309</span>    Scan scan = new Scan(row4);<a name="line.5309"></a>
-<span class="sourceLineNo">5310</span>    scan.setMaxVersions(5);<a name="line.5310"></a>
-<span class="sourceLineNo">5311</span>    scan.setBatch(3);<a name="line.5311"></a>
-<span class="sourceLineNo">5312</span>    scan.setReversed(true);<a name="line.5312"></a>
-<span class="sourceLineNo">5313</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5313"></a>
-<span class="sourceLineNo">5314</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5314"></a>
-<span class="sourceLineNo">5315</span>    boolean hasNext = false;<a name="line.5315"></a>
-<span class="sourceLineNo">5316</span>    // 1. scan out "row4" (5 kvs), "row5" can't be scanned out since not<a name="line.5316"></a>
-<span class="sourceLineNo">5317</span>    // included in scan range<a name="line.5317"></a>
-<span class="sourceLineNo">5318</span>    // "row4" takes 2 next() calls since batch=3<a name="line.5318"></a>
-<span class="sourceLineNo">5319</span>    hasNext = scanner.next(currRow);<a name="line.5319"></a>
-<span class="sourceLineNo">5320</span>    assertEquals(3, currRow.size());<a name="line.5320"></a>
-<span class="sourceLineNo">5321</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5321"></a>
-<span class="sourceLineNo">5322</span>        .get(0).getRowLength(), row4, 0, row4.length));<a name="line.5322"></a>
-<span class="sourceLineNo">5323</span>    assertTrue(hasNext);<a name="line.5323"></a>
-<span class="sourceLineNo">5324</span>    currRow.clear();<a name="line.5324"></a>
-<span class="sourceLineNo">5325</span>    hasNext = scanner.next(currRow);<a name="line.5325"></a>
-<span class="sourceLineNo">5326</span>    assertEquals(2, currRow.size());<a name="line.5326"></a>
-<span class="sourceLineNo">5327</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(),<a name="line.5327"></a>
-<span class="sourceLineNo">5328</span>        currRow.get(0).getRowLength(), row4, 0,<a name="line.5328"></a>
-<span class="sourceLineNo">5329</span>      row4.length));<a name="line.5329"></a>
-<span class="sourceLineNo">5330</span>    assertTrue(hasNext);<a name="line.5330"></a>
-<span class="sourceLineNo">5331</span>    // 2. scan out "row3" (2 kv)<a name="line.5331"></a>
-<span class="sourceLineNo">5332</span>    currRow.clear();<a name="line.5332"></a>
-<span class="sourceLineNo">5333</span>    hasNext = scanner.next(currRow);<a name="line.5333"></a>
-<span class="sourceLineNo">5334</span>    assertEquals(2, currRow.size());<a name="line.5334"></a>
-<span class="sourceLineNo">5335</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5335"></a>
-<span class="sourceLineNo">5336</span>        .get(0).getRowLength(), row3, 0, row3.length));<a name="line.5336"></a>
-<span class="sourceLineNo">5337</span>    assertTrue(hasNext);<a name="line.5337"></a>
-<span class="sourceLineNo">5338</span>    // 3. scan out "row2" (4 kvs)<a name="line.5338"></a>
-<span class="sourceLineNo">5339</span>    // "row2" takes 2 next() calls since batch=3<a name="line.5339"></a>
-<span class="sourceLineNo">5340</span>    currRow.clear();<a name="line.5340"></a>
-<span class="sourceLineNo">5341</span>    hasNext = scanner.next(currRow);<a name="line.5341"></a>
-<span class="sourceLineNo">5342</span>    assertEquals(3, currRow.size());<a name="line.5342"></a>
-<span class="sourceLineNo">5343</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5343"></a>
-<span class="sourceLineNo">5344</span>        .get(0).getRowLength(), row2, 0, row2.length));<a name="line.5344"></a>
-<span class="sourceLineNo">5345</span>    assertTrue(hasNext);<a name="line.5345"></a>
-<span class="sourceLineNo">5346</span>    currRow.clear();<a name="line.5346"></a>
-<span class="sourceLineNo">5347</span>    hasNext = scanner.next(currRow);<a name="line.5347"></a>
-<span class="sourceLineNo">5348</span>    assertEquals(1, currRow.size());<a name="line.5348"></a>
-<span class="sourceLineNo">5349</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5349"></a>
-<span class="sourceLineNo">5350</span>        .get(0).getRowLength(), row2, 0, row2.length));<a name="line.5350"></a>
-<span class="sourceLineNo">5351</span>    assertTrue(hasNext);<a name="line.5351"></a>
-<span class="sourceLineNo">5352</span>    // 4. scan out "row1" (2 kv)<a name="line.5352"></a>
-<span class="sourceLineNo">5353</span>    currRow.clear();<a name="line.5353"></a>
-<span class="sourceLineNo">5354</span>    hasNext = scanner.next(currRow);<a name="line.5354"></a>
-<span class="sourceLineNo">5355</span>    assertEquals(2, currRow.size());<a name="line.5355"></a>
-<span class="sourceLineNo">5356</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5356"></a>
-<span class="sourceLineNo">5357</span>        .get(0).getRowLength(), row1, 0, row1.length));<a name="line.5357"></a>
-<span class="sourceLineNo">5358</span>    assertTrue(hasNext);<a name="line.5358"></a>
-<span class="sourceLineNo">5359</span>    // 5. scan out "row0" (1 kv)<a name="line.5359"></a>
-<span class="sourceLineNo">5360</span>    currRow.clear();<a name="line.5360"></a>
-<span class="sourceLineNo">5361</span>    hasNext = scanner.next(currRow);<a name="line.5361"></a>
-<span class="sourceLineNo">5362</span>    assertEquals(1, currRow.size());<a name="line.5362"></a>
-<span class="sourceLineNo">5363</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5363"></a>
-<span class="sourceLineNo">5364</span>        .get(0).getRowLength(), row0, 0, row0.length));<a name="line.5364"></a>
-<span class="sourceLineNo">5365</span>    assertFalse(hasNext);<a name="line.5365"></a>
-<span class="sourceLineNo">5366</span><a name="line.5366"></a>
-<span class="sourceLineNo">5367</span>    scanner.close();<a name="line.5367"></a>
-<span class="sourceLineNo">5368</span>  }<a name="line.5368"></a>
-<span class="sourceLineNo">5369</span><a name="line.5369"></a>
-<span class="sourceLineNo">5370</span>  @Test<a name="line.5370"></a>
-<span class="sourceLineNo">5371</span>  public void testReverseScanner_FromMemStoreAndHFiles_MultiCFs2()<a name="line.5371"></a>
-<span class="sourceLineNo">5372</span>      throws IOException {<a name="line.5372"></a>
-<span class="sourceLineNo">5373</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.5373"></a>
-<span class="sourceLineNo">5374</span>    byte[] row2 = Bytes.toBytes("row2");<a name="line.5374"></a>
-<span class="sourceLineNo">5375</span>    byte[] row3 = Bytes.toBytes("row3");<a name="line.5375"></a>
-<span class="sourceLineNo">5376</span>    byte[] row4 = Bytes.toBytes("row4");<a name="line.5376"></a>
-<span class="sourceLineNo">5377</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5377"></a>
-<span class="sourceLineNo">5378</span>    byte[] cf2 = Bytes.toBytes("CF2");<a name="line.5378"></a>
-<span class="sourceLineNo">5379</span>    byte[] cf3 = Bytes.toBytes("CF3");<a name="line.5379"></a>
-<span class="sourceLineNo">5380</span>    byte[] cf4 = Bytes.toBytes("CF4");<a name="line.5380"></a>
-<span class="sourceLineNo">5381</span>    byte[][] families = { cf1, cf2, cf3, cf4 };<a name="line.5381"></a>
-<span class="sourceLineNo">5382</span>    byte[] col = Bytes.toBytes("C");<a name="line.5382"></a>
-<span class="sourceLineNo">5383</span>    long ts = 1;<a name="line.5383"></a>
-<span class="sourceLineNo">5384</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5384"></a>
-<span class="sourceLineNo">5385</span>    // disable compactions in this test.<a name="line.5385"></a>
-<span class="sourceLineNo">5386</span>    conf.setInt("hbase.hstore.compactionThreshold", 10000);<a name="line.5386"></a>
-<span class="sourceLineNo">5387</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5387"></a>
-<span class="sourceLineNo">5388</span>    KeyValue kv1 = new KeyValue(row1, cf1, col, ts, KeyValue.Type.Put, null);<a name="line.5388"></a>
-<span class="sourceLineNo">5389</span>    KeyValue kv2 = new KeyValue(row2, cf2, col, ts, KeyValue.Type.Put, null);<a name="line.5389"></a>
-<span class="sourceLineNo">5390</span>    KeyValue kv3 = new KeyValue(row3, cf3, col, ts, KeyValue.Type.Put, null);<a name="line.5390"></a>
-<span class="sourceLineNo">5391</span>    KeyValue kv4 = new KeyValue(row4, cf4, col, ts, KeyValue.Type.Put, null);<a name="line.5391"></a>
-<span class="sourceLineNo">5392</span>    // storefile1<a name="line.5392"></a>
-<span class="sourceLineNo">5393</span>    Put put = new Put(row1);<a name="line.5393"></a>
-<span class="sourceLineNo">5394</span>    put.add(kv1);<a name="line.5394"></a>
-<span class="sourceLineNo">5395</span>    region.put(put);<a name="line.5395"></a>
-<span class="sourceLineNo">5396</span>    region.flush(true);<a name="line.5396"></a>
-<span class="sourceLineNo">5397</span>    // storefile2<a name="line.5397"></a>
-<span class="sourceLineNo">5398</span>    put = new Put(row2);<a name="line.5398"></a>
-<span class="sourceLineNo">5399</span>    put.add(kv2);<a name="line.5399"></a>
-<span class="sourceLineNo">5400</span>    region.put(put);<a name="line.5400"></a>
-<span class="sourceLineNo">5401</span>    region.flush(true);<a name="line.5401"></a>
-<span class="sourceLineNo">5402</span>    // storefile3<a name="line.5402"></a>
-<span class="sourceLineNo">5403</span>    put = new Put(row3);<a name="line.5403"></a>
-<span class="sourceLineNo">5404</span>    put.add(kv3);<a name="line.5404"></a>
+<span class="sourceLineNo">5277</span>    put = new Put(row4);<a name="line.5277"></a>
+<span class="sourceLineNo">5278</span>    put.add(kv4_5_4);<a name="line.5278"></a>
+<span class="sourceLineNo">5279</span>    put.add(kv4_5_5);<a name="line.5279"></a>
+<span class="sourceLineNo">5280</span>    region.put(put);<a name="line.5280"></a>
+<span class="sourceLineNo">5281</span>    region.flush(true);<a name="line.5281"></a>
+<span class="sourceLineNo">5282</span>    // hfiles(cf1/cf3) : "row1" (1 kvs) / "row2" (1 kv) / "row4" (2 kv)<a name="line.5282"></a>
+<span class="sourceLineNo">5283</span>    put = new Put(row4);<a name="line.5283"></a>
+<span class="sourceLineNo">5284</span>    put.add(kv4_5_1);<a name="line.5284"></a>
+<span class="sourceLineNo">5285</span>    put.add(kv4_5_3);<a name="line.5285"></a>
+<span class="sourceLineNo">5286</span>    region.put(put);<a name="line.5286"></a>
+<span class="sourceLineNo">5287</span>    put = new Put(row1);<a name="line.5287"></a>
+<span class="sourceLineNo">5288</span>    put.add(kv1_2_2);<a name="line.5288"></a>
+<span class="sourceLineNo">5289</span>    region.put(put);<a name="line.5289"></a>
+<span class="sourceLineNo">5290</span>    put = new Put(row2);<a name="line.5290"></a>
+<span class="sourceLineNo">5291</span>    put.add(kv2_4_4);<a name="line.5291"></a>
+<span class="sourceLineNo">5292</span>    region.put(put);<a name="line.5292"></a>
+<span class="sourceLineNo">5293</span>    region.flush(true);<a name="line.5293"></a>
+<span class="sourceLineNo">5294</span>    // hfiles(cf1/cf3) : "row2"(2 kv) / "row3"(1 kvs) / "row4" (1 kv)<a name="line.5294"></a>
+<span class="sourceLineNo">5295</span>    put = new Put(row4);<a name="line.5295"></a>
+<span class="sourceLineNo">5296</span>    put.add(kv4_5_2);<a name="line.5296"></a>
+<span class="sourceLineNo">5297</span>    region.put(put);<a name="line.5297"></a>
+<span class="sourceLineNo">5298</span>    put = new Put(row2);<a name="line.5298"></a>
+<span class="sourceLineNo">5299</span>    put.add(kv2_4_2);<a name="line.5299"></a>
+<span class="sourceLineNo">5300</span>    put.add(kv2_4_3);<a name="line.5300"></a>
+<span class="sourceLineNo">5301</span>    region.put(put);<a name="line.5301"></a>
+<span class="sourceLineNo">5302</span>    put = new Put(row3);<a name="line.5302"></a>
+<span class="sourceLineNo">5303</span>    put.add(kv3_2_2);<a name="line.5303"></a>
+<span class="sourceLineNo">5304</span>    region.put(put);<a name="line.5304"></a>
+<span class="sourceLineNo">5305</span>    region.flush(true);<a name="line.5305"></a>
+<span class="sourceLineNo">5306</span>    // memstore(cf1/cf2/cf3) : "row0" (1 kvs) / "row3" ( 1 kv) / "row5" (max)<a name="line.5306"></a>
+<span class="sourceLineNo">5307</span>    // ( 2 kv)<a name="line.5307"></a>
+<span class="sourceLineNo">5308</span>    put = new Put(row0);<a name="line.5308"></a>
+<span class="sourceLineNo">5309</span>    put.add(kv0_1_1);<a name="line.5309"></a>
+<span class="sourceLineNo">5310</span>    region.put(put);<a name="line.5310"></a>
+<span class="sourceLineNo">5311</span>    put = new Put(row3);<a name="line.5311"></a>
+<span class="sourceLineNo">5312</span>    put.add(kv3_2_1);<a name="line.5312"></a>
+<span class="sourceLineNo">5313</span>    region.put(put);<a name="line.5313"></a>
+<span class="sourceLineNo">5314</span>    put = new Put(row5);<a name="line.5314"></a>
+<span class="sourceLineNo">5315</span>    put.add(kv5_2_1);<a name="line.5315"></a>
+<span class="sourceLineNo">5316</span>    put.add(kv5_2_2);<a name="line.5316"></a>
+<span class="sourceLineNo">5317</span>    region.put(put);<a name="line.5317"></a>
+<span class="sourceLineNo">5318</span>    // scan range = ["row4", min), skip the max "row5"<a name="line.5318"></a>
+<span class="sourceLineNo">5319</span>    Scan scan = new Scan(row4);<a name="line.5319"></a>
+<span class="sourceLineNo">5320</span>    scan.setMaxVersions(5);<a name="line.5320"></a>
+<span class="sourceLineNo">5321</span>    scan.setBatch(3);<a name="line.5321"></a>
+<span class="sourceLineNo">5322</span>    scan.setReversed(true);<a name="line.5322"></a>
+<span class="sourceLineNo">5323</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5323"></a>
+<span class="sourceLineNo">5324</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5324"></a>
+<span class="sourceLineNo">5325</span>    boolean hasNext = false;<a name="line.5325"></a>
+<span class="sourceLineNo">5326</span>    // 1. scan out "row4" (5 kvs), "row5" can't be scanned out since not<a name="line.5326"></a>
+<span class="sourceLineNo">5327</span>    // included in scan range<a name="line.5327"></a>
+<span class="sourceLineNo">5328</span>    // "row4" takes 2 next() calls since batch=3<a name="line.5328"></a>
+<span class="sourceLineNo">5329</span>    hasNext = scanner.next(currRow);<a name="line.5329"></a>
+<span class="sourceLineNo">5330</span>    assertEquals(3, currRow.size());<a name="line.5330"></a>
+<span class="sourceLineNo">5331</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5331"></a>
+<span class="sourceLineNo">5332</span>        .get(0).getRowLength(), row4, 0, row4.length));<a name="line.5332"></a>
+<span class="sourceLineNo">5333</span>    assertTrue(hasNext);<a name="line.5333"></a>
+<span class="sourceLineNo">5334</span>    currRow.clear();<a name="line.5334"></a>
+<span class="sourceLineNo">5335</span>    hasNext = scanner.next(currRow);<a name="line.5335"></a>
+<span class="sourceLineNo">5336</span>    assertEquals(2, currRow.size());<a name="line.5336"></a>
+<span class="sourceLineNo">5337</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(),<a name="line.5337"></a>
+<span class="sourceLineNo">5338</span>        currRow.get(0).getRowLength(), row4, 0,<a name="line.5338"></a>
+<span class="sourceLineNo">5339</span>      row4.length));<a name="line.5339"></a>
+<span class="sourceLineNo">5340</span>    assertTrue(hasNext);<a name="line.5340"></a>
+<span class="sourceLineNo">5341</span>    // 2. scan out "row3" (2 kv)<a name="line.5341"></a>
+<span class="sourceLineNo">5342</span>    currRow.clear();<a name="line.5342"></a>
+<span class="sourceLineNo">5343</span>    hasNext = scanner.next(currRow);<a name="line.5343"></a>
+<span class="sourceLineNo">5344</span>    assertEquals(2, currRow.size());<a name="line.5344"></a>
+<span class="sourceLineNo">5345</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5345"></a>
+<span class="sourceLineNo">5346</span>        .get(0).getRowLength(), row3, 0, row3.length));<a name="line.5346"></a>
+<span class="sourceLineNo">5347</span>    assertTrue(hasNext);<a name="line.5347"></a>
+<span class="sourceLineNo">5348</span>    // 3. scan out "row2" (4 kvs)<a name="line.5348"></a>
+<span class="sourceLineNo">5349</span>    // "row2" takes 2 next() calls since batch=3<a name="line.5349"></a>
+<span class="sourceLineNo">5350</span>    currRow.clear();<a name="line.5350"></a>
+<span class="sourceLineNo">5351</span>    hasNext = scanner.next(currRow);<a name="line.5351"></a>
+<span class="sourceLineNo">5352</span>    assertEquals(3, currRow.size());<a name="line.5352"></a>
+<span class="sourceLineNo">5353</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5353"></a>
+<span class="sourceLineNo">5354</span>        .get(0).getRowLength(), row2, 0, row2.length));<a name="line.5354"></a>
+<span class="sourceLineNo">5355</span>    assertTrue(hasNext);<a name="line.5355"></a>
+<span class="sourceLineNo">5356</span>    currRow.clear();<a name="line.5356"></a>
+<span class="sourceLineNo">5357</span>    hasNext = scanner.next(currRow);<a name="line.5357"></a>
+<span class="sourceLineNo">5358</span>    assertEquals(1, currRow.size());<a name="line.5358"></a>
+<span class="sourceLineNo">5359</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5359"></a>
+<span class="sourceLineNo">5360</span>        .get(0).getRowLength(), row2, 0, row2.length));<a name="line.5360"></a>
+<span class="sourceLineNo">5361</span>    assertTrue(hasNext);<a name="line.5361"></a>
+<span class="sourceLineNo">5362</span>    // 4. scan out "row1" (2 kv)<a name="line.5362"></a>
+<span class="sourceLineNo">5363</span>    currRow.clear();<a name="line.5363"></a>
+<span class="sourceLineNo">5364</span>    hasNext = scanner.next(currRow);<a name="line.5364"></a>
+<span class="sourceLineNo">5365</span>    assertEquals(2, currRow.size());<a name="line.5365"></a>
+<span class="sourceLineNo">5366</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5366"></a>
+<span class="sourceLineNo">5367</span>        .get(0).getRowLength(), row1, 0, row1.length));<a name="line.5367"></a>
+<span class="sourceLineNo">5368</span>    assertTrue(hasNext);<a name="line.5368"></a>
+<span class="sourceLineNo">5369</span>    // 5. scan out "row0" (1 kv)<a name="line.5369"></a>
+<span class="sourceLineNo">5370</span>    currRow.clear();<a name="line.5370"></a>
+<span class="sourceLineNo">5371</span>    hasNext = scanner.next(currRow);<a name="line.5371"></a>
+<span class="sourceLineNo">5372</span>    assertEquals(1, currRow.size());<a name="line.5372"></a>
+<span class="sourceLineNo">5373</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5373"></a>
+<span class="sourceLineNo">5374</span>        .get(0).getRowLength(), row0, 0, row0.length));<a name="line.5374"></a>
+<span class="sourceLineNo">5375</span>    assertFalse(hasNext);<a name="line.5375"></a>
+<span class="sourceLineNo">5376</span><a name="line.5376"></a>
+<span class="sourceLineNo">5377</span>    scanner.close();<a name="line.5377"></a>
+<span class="sourceLineNo">5378</span>  }<a name="line.5378"></a>
+<span class="sourceLineNo">5379</span><a name="line.5379"></a>
+<span class="sourceLineNo">5380</span>  @Test<a name="line.5380"></a>
+<span class="sourceLineNo">5381</span>  public void testReverseScanner_FromMemStoreAndHFiles_MultiCFs2()<a name="line.5381"></a>
+<span class="sourceLineNo">5382</span>      throws IOException {<a name="line.5382"></a>
+<span class="sourceLineNo">5383</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.5383"></a>
+<span class="sourceLineNo">5384</span>    byte[] row2 = Bytes.toBytes("row2");<a name="line.5384"></a>
+<span class="sourceLineNo">5385</span>    byte[] row3 = Bytes.toBytes("row3");<a name="line.5385"></a>
+<span class="sourceLineNo">5386</span>    byte[] row4 = Bytes.toBytes("row4");<a name="line.5386"></a>
+<span class="sourceLineNo">5387</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5387"></a>
+<span class="sourceLineNo">5388</span>    byte[] cf2 = Bytes.toBytes("CF2");<a name="line.5388"></a>
+<span class="sourceLineNo">5389</span>    byte[] cf3 = Bytes.toBytes("CF3");<a name="line.5389"></a>
+<span class="sourceLineNo">5390</span>    byte[] cf4 = Bytes.toBytes("CF4");<a name="line.5390"></a>
+<span class="sourceLineNo">5391</span>    byte[][] families = { cf1, cf2, cf3, cf4 };<a name="line.5391"></a>
+<span class="sourceLineNo">5392</span>    byte[] col = Bytes.toBytes("C");<a name="line.5392"></a>
+<span class="sourceLineNo">5393</span>    long ts = 1;<a name="line.5393"></a>
+<span class="sourceLineNo">5394</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5394"></a>
+<span class="sourceLineNo">5395</span>    // disable compactions in this test.<a name="line.5395"></a>
+<span class="sourceLineNo">5396</span>    conf.setInt("hbase.hstore.compactionThreshold", 10000);<a name="line.5396"></a>
+<span class="sourceLineNo">5397</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5397"></a>
+<span class="sourceLineNo">5398</span>    KeyValue kv1 = new KeyValue(row1, cf1, col, ts, KeyValue.Type.Put, null);<a name="line.5398"></a>
+<span class="sourceLineNo">5399</span>    KeyValue kv2 = new KeyValue(row2, cf2, col, ts, KeyValue.Type.Put, null);<a name="line.5399"></a>
+<span class="sourceLineNo">5400</span>    KeyValue kv3 = new KeyValue(row3, cf3, col, ts, KeyValue.Type.Put, null);<a name="line.5400"></a>
+<span class="sourceLineNo">5401</span>    KeyValue kv4 = new KeyValue(row4, cf4, col, ts, KeyValue.Type.Put, null);<a name="line.5401"></a>
+<span class="sourceLineNo">5402</span>    // storefile1<a name="line.5402"></a>
+<span class="sourceLineNo">5403</span>    Put put = new Put(row1);<a name="line.5403"></a>
+<span class="sourceLineNo">5404</span>    put.add(kv1);<a name="line.5404"></a>
 <span class="sourceLineNo">5405</span>    region.put(put);<a name="line.5405"></a>
 <span class="sourceLineNo">5406</span>    region.flush(true);<a name="line.5406"></a>
-<span class="sourceLineNo">5407</span>    // memstore<a name="line.5407"></a>
-<span class="sourceLineNo">5408</span>    put = new Put(row4);<a name="line.5408"></a>
-<span class="sourceLineNo">5409</span>    put.add(kv4);<a name="line.5409"></a>
+<span class="sourceLineNo">5407</span>    // storefile2<a name="line.5407"></a>
+<span class="sourceLineNo">5408</span>    put = new Put(row2);<a name="line.5408"></a>
+<span class="sourceLineNo">5409</span>    put.add(kv2);<a name="line.5409"></a>
 <span class="sourceLineNo">5410</span>    region.put(put);<a name="line.5410"></a>
-<span class="sourceLineNo">5411</span>    // scan range = ["row4", min)<a name="line.5411"></a>
-<span class="sourceLineNo">5412</span>    Scan scan = new Scan(row4);<a name="line.5412"></a>
-<span class="sourceLineNo">5413</span>    scan.setReversed(true);<a name="line.5413"></a>
-<span class="sourceLineNo">5414</span>    scan.setBatch(10);<a name="line.5414"></a>
-<span class="sourceLineNo">5415</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5415"></a>
-<span class="sourceLineNo">5416</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5416"></a>
-<span class="sourceLineNo">5417</span>    boolean hasNext = scanner.next(currRow);<a name="line.5417"></a>
-<span class="sourceLineNo">5418</span>    assertEquals(1, currRow.size());<a name="line.5418"></a>
-<span class="sourceLineNo">5419</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5419"></a>
-<span class="sourceLineNo">5420</span>        .get(0).getRowLength(), row4, 0, row4.length));<a name="line.5420"></a>
-<span class="sourceLineNo">5421</span>    assertTrue(hasNext);<a name="line.5421"></a>
-<span class="sourceLineNo">5422</span>    currRow.clear();<a name="line.5422"></a>
-<span class="sourceLineNo">5423</span>    hasNext = scanner.next(currRow);<a name="line.5423"></a>
-<span class="sourceLineNo">5424</span>    assertEquals(1, currRow.size());<a name="line.5424"></a>
-<span class="sourceLineNo">5425</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5425"></a>
-<span class="sourceLineNo">5426</span>        .get(0).getRowLength(), row3, 0, row3.length));<a name="line.5426"></a>
-<span class="sourceLineNo">5427</span>    assertTrue(hasNext);<a name="line.5427"></a>
-<span class="sourceLineNo">5428</span>    currRow.clear();<a name="line.5428"></a>
-<span class="sourceLineNo">5429</span>    hasNext = scanner.next(currRow);<a name="line.5429"></a>
-<span class="sourceLineNo">5430</span>    assertEquals(1, currRow.size());<a name="line.5430"></a>
-<span class="sourceLineNo">5431</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5431"></a>
-<span class="sourceLineNo">5432</span>        .get(0).getRowLength(), row2, 0, row2.length));<a name="line.5432"></a>
-<span class="sourceLineNo">5433</span>    assertTrue(hasNext);<a name="line.5433"></a>
-<span class="sourceLineNo">5434</span>    currRow.clear();<a name="line.5434"></a>
-<span class="sourceLineNo">5435</span>    hasNext = scanner.next(currRow);<a name="line.5435"></a>
-<span class="sourceLineNo">5436</span>    assertEquals(1, currRow.size());<a name="line.5436"></a>
-<span class="sourceLineNo">5437</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5437"></a>
-<span class="sourceLineNo">5438</span>        .get(0).getRowLength(), row1, 0, row1.length));<a name="line.5438"></a>
-<span class="sourceLineNo">5439</span>    assertFalse(hasNext);<a name="line.5439"></a>
-<span class="sourceLineNo">5440</span>  }<a name="line.5440"></a>
-<span class="sourceLineNo">5441</span><a name="line.5441"></a>
-<span class="sourceLineNo">5442</span>  /**<a name="line.5442"></a>
-<span class="sourceLineNo">5443</span>   * Test for HBASE-14497: Reverse Scan threw StackOverflow caused by readPt checking<a name="line.5443"></a>
-<span class="sourceLineNo">5444</span>   */<a name="line.5444"></a>
-<span class="sourceLineNo">5445</span>  @Test<a name="line.5445"></a>
-<span class="sourceLineNo">5446</span>  public void testReverseScanner_StackOverflow() throws IOException {<a name="line.5446"></a>
-<span class="sourceLineNo">5447</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5447"></a>
-<span class="sourceLineNo">5448</span>    byte[][] families = {cf1};<a name="line.5448"></a>
-<span class="sourceLineNo">5449</span>    byte[] col = Bytes.toBytes("C");<a name="line.5449"></a>
-<span class="sourceLineNo">5450</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5450"></a>
-<span class="sourceLineNo">5451</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5451"></a>
-<span class="sourceLineNo">5452</span>    // setup with one storefile and one memstore, to create scanner and get an earlier readPt<a name="line.5452"></a>
-<span class="sourceLineNo">5453</span>    Put put = new Put(Bytes.toBytes("19998"));<a name="line.5453"></a>
-<span class="sourceLineNo">5454</span>    put.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5454"></a>
-<span class="sourceLineNo">5455</span>    region.put(put);<a name="line.5455"></a>
-<span class="sourceLineNo">5456</span>    region.flushcache(true, true, FlushLifeCycleTracker.DUMMY);<a name="line.5456"></a>
-<span class="sourceLineNo">5457</span>    Put put2 = new Put(Bytes.toBytes("19997"));<a name="line.5457"></a>
-<span class="sourceLineNo">5458</span>    put2.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5458"></a>
-<span class="sourceLineNo">5459</span>    region.put(put2);<a name="line.5459"></a>
-<span class="sourceLineNo">5460</span><a name="line.5460"></a>
-<span class="sourceLineNo">5461</span>    Scan scan = new Scan(Bytes.toBytes("19998"));<a name="line.5461"></a>
-<span class="sourceLineNo">5462</span>    scan.setReversed(true);<a name="line.5462"></a>
-<span class="sourceLineNo">5463</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5463"></a>
-<span class="sourceLineNo">5464</span><a name="line.5464"></a>
-<span class="sourceLineNo">5465</span>    // create one storefile contains many rows will be skipped<a name="line.5465"></a>
-<span class="sourceLineNo">5466</span>    // to check StoreFileScanner.seekToPreviousRow<a name="line.5466"></a>
-<span class="sourceLineNo">5467</span>    for (int i = 10000; i &lt; 20000; i++) {<a name="line.5467"></a>
-<span class="sourceLineNo">5468</span>      Put p = new Put(Bytes.toBytes(""+i));<a name="line.5468"></a>
-<span class="sourceLineNo">5469</span>      p.addColumn(cf1, col, Bytes.toBytes("" + i));<a name="line.5469"></a>
-<span class="sourceLineNo">5470</span>      region.put(p);<a name="line.5470"></a>
-<span class="sourceLineNo">5471</span>    }<a name="line.5471"></a>
-<span class="sourceLineNo">5472</span>    region.flushcache(true, true, FlushLifeCycleTracker.DUMMY);<a name="line.5472"></a>
-<span class="sourceLineNo">5473</span><a name="line.5473"></a>
-<span class="sourceLineNo">5474</span>    // create one memstore contains many rows will be skipped<a name="line.5474"></a>
-<span class="sourceLineNo">5475</span>    // to check MemStoreScanner.seekToPreviousRow<a name="line.5475"></a>
-<span class="sourceLineNo">5476</span>    for (int i = 10000; i &lt; 20000; i++) {<a name="line.5476"></a>
-<span class="sourceLineNo">5477</span>      Put p = new Put(Bytes.toBytes(""+i));<a name="line.5477"></a>
-<span class="sourceLineNo">5478</span>      p.addColumn(cf1, col, Bytes.toBytes("" + i));<a name="line.5478"></a>
-<span class="sourceLineNo">5479</span>      region.put(p);<a name="line.5479"></a>
-<span class="sourceLineNo">5480</span>    }<a name="line.5480"></a>
-<span class="sourceLineNo">5481</span><a name="line.5481"></a>
-<span class="sourceLineNo">5482</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5482"></a>
-<span class="sourceLineNo">5483</span>    boolean hasNext;<a name="line.5483"></a>
-<span class="sourceLineNo">5484</span>    do {<a name="line.5484"></a>
-<span class="sourceLineNo">5485</span>      hasNext = scanner.next(currRow);<a name="line.5485"></a>
-<span class="sourceLineNo">5486</span>    } while (hasNext);<a name="line.5486"></a>
-<span class="sourceLineNo">5487</span>    assertEquals(2, currRow.size());<a name="line.5487"></a>
-<span class="sourceLineNo">5488</span>    assertEquals("19998", Bytes.toString(currRow.get(0).getRowArray(),<a name="line.5488"></a>
-<span class="sourceLineNo">5489</span>      currRow.get(0).getRowOffset(), currRow.get(0).getRowLength()));<a name="line.5489"></a>
-<span class="sourceLineNo">5490</span>    assertEquals("19997", Bytes.toString(currRow.get(1).getRowArray(),<a name="line.5490"></a>
-<span class="sourceLineNo">5491</span>      currRow.get(1).getRowOffset(), currRow.get(1).getRowLength()));<a name="line.5491"></a>
-<span class="sourceLineNo">5492</span>  }<a name="line.5492"></a>
-<span class="sourceLineNo">5493</span><a name="line.5493"></a>
-<span class="sourceLineNo">5494</span>  @Test<a name="line.5494"></a>
-<span class="sourceLineNo">5495</span>  public void testReverseScanShouldNotScanMemstoreIfReadPtLesser() throws Exception {<a name="line.5495"></a>
-<span class="sourceLineNo">5496</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5496"></a>
-<span class="sourceLineNo">5497</span>    byte[][] families = { cf1 };<a name="line.5497"></a>
-<span class="sourceLineNo">5498</span>    byte[] col = Bytes.toBytes("C");<a name="line.5498"></a>
-<span class="sourceLineNo">5499</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5499"></a>
-<span class="sourceLineNo">5500</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5500"></a>
-<span class="sourceLineNo">5501</span>    // setup with one storefile and one memstore, to create scanner and get an earlier readPt<a name="line.5501"></a>
-<span class="sourceLineNo">5502</span>    Put put = new Put(Bytes.toBytes("19996"));<a name="line.5502"></a>
-<span class="sourceLineNo">5503</span>    put.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5503"></a>
-<span class="sourceLineNo">5504</span>    region.put(put);<a name="line.5504"></a>
-<span class="sourceLineNo">5505</span>    Put put2 = new Put(Bytes.toBytes("19995"));<a name="line.5505"></a>
-<span class="sourceLineNo">5506</span>    put2.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5506"></a>
-<span class="sourceLineNo">5507</span>    region.put(put2);<a name="line.5507"></a>
-<span class="sourceLineNo">5508</span>    // create a reverse scan<a name="line.5508"></a>
-<span class="sourceLineNo">5509</span>    Scan scan = new Scan(Bytes.toBytes("19996"));<a name="line.5509"></a>
-<span class="sourceLineNo">5510</span>    scan.setReversed(true);<a name="line.5510"></a>
-<span class="sourceLineNo">5511</span>    RegionScannerImpl scanner = region.getScanner(scan);<a name="line.5511"></a>
-<span class="sourceLineNo">5512</span><a name="line.5512"></a>
-<span class="sourceLineNo">5513</span>    // flush the cache. This will reset the store scanner<a name="line.5513"></a>
-<span class="sourceLineNo">5514</span>    region.flushcache(true, true, FlushLifeCycleTracker.DUMMY);<a name="line.5514"></a>
-<span class="sourceLineNo">5515</span><a name="line.5515"></a>
-<span class="sourceLineNo">5516</span>    // create one memstore contains many rows will be skipped<a name="line.5516"></a>
-<span class="sourceLineNo">5517</span>    // to check MemStoreScanner.seekToPreviousRow<a name="line.5517"></a>
-<span class="sourceLineNo">5518</span>    for (int i = 10000; i &lt; 20000; i++) {<a name="line.5518"></a>
-<span class="sourceLineNo">5519</span>      Put p = new Put(Bytes.toBytes("" + i));<a name="line.5519"></a>
-<span class="sourceLineNo">5520</span>      p.addColumn(cf1, col, Bytes.toBytes("" + i));<a name="line.5520"></a>
-<span class="sourceLineNo">5521</span>      region.put(p);<a name="line.5521"></a>
-<span class="sourceLineNo">5522</span>    }<a name="line.5522"></a>
-<span class="sourceLineNo">5523</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5523"></a>
-<span class="sourceLineNo">5524</span>    boolean hasNext;<a name="line.5524"></a>
-<span class="sourceLineNo">5525</span>    boolean assertDone = false;<a name="line.5525"></a>
-<span class="sourceLineNo">5526</span>    do {<a name="line.5526"></a>
-<span class="sourceLineNo">5527</span>      hasNext = scanner.next(currRow);<a name="line.5527"></a>
-<span class="sourceLineNo">5528</span>      // With HBASE-15871, after the scanner is reset the memstore scanner should not be<a name="line.5528"></a>
-<span class="sourceLineNo">5529</span>      // added here<a name="line.5529"></a>
-<span class="sourceLineNo">5530</span>      if (!assertDone) {<a name="line.5530"></a>
-<span class="sourceLineNo">5531</span>        StoreScanner current =<a name="line.5531"></a>
-<span class="sourceLineNo">5532</span>            (StoreScanner) (scanner.storeHeap).getCurrentForTesting();<a name="line.5532"></a>
-<span class="sourceLineNo">5533</span>        List&lt;KeyValueScanner&gt; scanners = current.getAllScannersForTesting();<a name="line.5533"></a>
-<span class="sourceLineNo">5534</span>        assertEquals("There should be only one scanner the store file scanner", 1,<a name="line.5534"></a>
-<span class="sourceLineNo">5535</span>          scanners.size());<a name="line.5535"></a>
-<span class="sourceLineNo">5536</span>        assertDone = true;<a name="line.5536"></a>
-<span class="sourceLineNo">5537</span>      }<a name="line.5537"></a>
-<span class="sourceLineNo">5538</span>    } while (hasNext);<a name="line.5538"></a>
-<span class="sourceLineNo">5539</span>    assertEquals(2, currRow.size());<a name="line.5539"></a>
-<span class="sourceLineNo">5540</span>    assertEquals("19996", Bytes.toString(currRow.get(0).getRowArray(),<a name="line.5540"></a>
-<span class="sourceLineNo">5541</span>      currRow.get(0).getRowOffset(), currRow.get(0).getRowLength()));<a name="line.5541"></a>
-<span class="sourceLineNo">5542</span>    assertEquals("19995", Bytes.toString(currRow.get(1).getRowArray(),<a name="line.5542"></a>
-<span class="sourceLineNo">5543</span>      currRow.get(1).getRowOffset(), currRow.get(1).getRowLength()));<a name="line.5543"></a>
-<span class="sourceLineNo">5544</span>  }<a name="line.5544"></a>
-<span class="sourceLineNo">5545</span><a name="line.5545"></a>
-<span class="sourceLineNo">5546</span>  @Test<a name="line.5546"></a>
-<span class="sourceLineNo">5547</span>  public void testReverseScanWhenPutCellsAfterOpenReverseScan() throws Exception {<a name="line.5547"></a>
-<span class="sourceLineNo">5548</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5548"></a>
-<span class="sourceLineNo">5549</span>    byte[][] families = { cf1 };<a name="line.5549"></a>
-<span class="sourceLineNo">5550</span>    byte[] col = Bytes.toBytes("C");<a name="line.5550"></a>
-<span class="sourceLineNo">5551</span><a name="line.5551"></a>
-<span class="sourceLineNo">5552</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5552"></a>
-<span class="sourceLineNo">5553</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5553"></a>
-<span class="sourceLineNo">5554</span><a name="line.5554"></a>
-<span class="sourceLineNo">5555</span>    Put put = new Put(Bytes.toBytes("199996"));<a name="line.5555"></a>
-<span class="sourceLineNo">5556</span>    put.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5556"></a>
-<span class="sourceLineNo">5557</span>    region.put(put);<a name="line.5557"></a>
-<span class="sourceLineNo">5558</span>    Put put2 = new Put(Bytes.toBytes("199995"));<a name="line.5558"></a>
-<span class="sourceLineNo">5559</span>    put2.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5559"></a>
-<span class="sourceLineNo">5560</span>    region.put(put2);<a name="line.5560"></a>
+<span class="sourceLineNo">5411</span>    region.flush(true);<a name="line.5411"></a>
+<span class="sourceLineNo">5412</span>    // storefile3<a name="line.5412"></a>
+<span class="sourceLineNo">5413</span>    put = new Put(row3);<a name="line.5413"></a>
+<span class="sourceLineNo">5414</span>    put.add(kv3);<a name="line.5414"></a>
+<span class="sourceLineNo">5415</span>    region.put(put);<a name="line.5415"></a>
+<span class="sourceLineNo">5416</span>    region.flush(true);<a name="line.5416"></a>
+<span class="sourceLineNo">5417</span>    // memstore<a name="line.5417"></a>
+<span class="sourceLineNo">5418</span>    put = new Put(row4);<a name="line.5418"></a>
+<span class="sourceLineNo">5419</span>    put.add(kv4);<a name="line.5419"></a>
+<span class="sourceLineNo">5420</span>    region.put(put);<a name="line.5420"></a>
+<span class="sourceLineNo">5421</span>    // scan range = ["row4", min)<a name="line.5421"></a>
+<span class="sourceLineNo">5422</span>    Scan scan = new Scan(row4);<a name="line.5422"></a>
+<span class="sourceLineNo">5423</span>    scan.setReversed(true);<a name="line.5423"></a>
+<span class="sourceLineNo">5424</span>    scan.setBatch(10);<a name="line.5424"></a>
+<span class="sourceLineNo">5425</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5425"></a>
+<span class="sourceLineNo">5426</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5426"></a>
+<span class="sourceLineNo">5427</span>    boolean hasNext = scanner.next(currRow);<a name="line.5427"></a>
+<span class="sourceLineNo">5428</span>    assertEquals(1, currRow.size());<a name="line.5428"></a>
+<span class="sourceLineNo">5429</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5429"></a>
+<span class="sourceLineNo">5430</span>        .get(0).getRowLength(), row4, 0, row4.length));<a name="line.5430"></a>
+<span class="sourceLineNo">5431</span>    assertTrue(hasNext);<a name="line.5431"></a>
+<span class="sourceLineNo">5432</span>    currRow.clear();<a name="line.5432"></a>
+<span class="sourceLineNo">5433</span>    hasNext = scanner.next(currRow);<a name="line.5433"></a>
+<span class="sourceLineNo">5434</span>    assertEquals(1, currRow.size());<a name="line.5434"></a>
+<span class="sourceLineNo">5435</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5435"></a>
+<span class="sourceLineNo">5436</span>        .get(0).getRowLength(), row3, 0, row3.length));<a name="line.5436"></a>
+<span class="sourceLineNo">5437</span>    assertTrue(hasNext);<a name="line.5437"></a>
+<span class="sourceLineNo">5438</span>    currRow.clear();<a name="line.5438"></a>
+<span class="sourceLineNo">5439</span>    hasNext = scanner.next(currRow);<a name="line.5439"></a>
+<span class="sourceLineNo">5440</span>    assertEquals(1, currRow.size());<a name="line.5440"></a>
+<span class="sourceLineNo">5441</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5441"></a>
+<span class="sourceLineNo">5442</span>        .get(0).getRowLength(), row2, 0, row2.length));<a name="line.5442"></a>
+<span class="sourceLineNo">5443</span>    assertTrue(hasNext);<a name="line.5443"></a>
+<span class="sourceLineNo">5444</span>    currRow.clear();<a name="line.5444"></a>
+<span class="sourceLineNo">5445</span>    hasNext = scanner.next(currRow);<a name="line.5445"></a>
+<span class="sourceLineNo">5446</span>    assertEquals(1, currRow.size());<a name="line.5446"></a>
+<span class="sourceLineNo">5447</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5447"></a>
+<span class="sourceLineNo">5448</span>        .get(0).getRowLength(), row1, 0, row1.length));<a name="line.5448"></a>
+<span class="sourceLineNo">5449</span>    assertFalse(hasNext);<a name="line.5449"></a>
+<span class="sourceLineNo">5450</span>  }<a name="line.5450"></a>
+<span class="sourceLineNo">5451</span><a name="line.5451"></a>
+<span class="sourceLineNo">5452</span>  /**<a name="line.5452"></a>
+<span class="sourceLineNo">5453</span>   * Test for HBASE-14497: Reverse Scan threw StackOverflow caused by readPt checking<a name="line.5453"></a>
+<span class="sourceLineNo">5454</span>   */<a name="line.5454"></a>
+<span class="sourceLineNo">5455</span>  @Test<a name="line.5455"></a>
+<span class="sourceLineNo">5456</span>  public void testReverseScanner_StackOverflow() throws IOException {<a name="line.5456"></a>
+<span class="sourceLineNo">5457</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5457"></a>
+<span class="sourceLineNo">5458</span>    byte[][] families = {cf1};<a name="line.5458"></a>
+<span class="sourceLineNo">5459</span>    byte[] col = Bytes.toBytes("C");<a name="line.5459"></a>
+<span class="sourceLineNo">5460</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5460"></a>
+<span class="sourceLineNo">5461</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5461"></a>
+<span class="sourceLineNo">5462</span>    // setup with one storefile and one memstore, to create scanner and get an earlier readPt<a name="line.5462"></a>
+<span class="sourceLineNo">5463</span>    Put put = new Put(Bytes.toBytes("19998"));<a name="line.5463"></a>
+<span class="sourceLineNo">5464</span>    put.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5464"></a>
+<span class="sourceLineNo">5465</span>    region.put(put);<a name="line.5465"></a>
+<span class="sourceLineNo">5466</span>    region.flushcache(true, true, FlushLifeCycleTracker.DUMMY);<a name="line.5466"></a>
+<span class="sourceLineNo">5467</span>    Put put2 = new Put(Bytes.toBytes("19997"));<a name="line.5467"></a>
+<span class="sourceLineNo">5468</span>    put2.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5468"></a>
+<span class="sourceLineNo">5469</span>    region.put(put2);<a name="line.5469"></a>
+<span class="sourceLineNo">5470</span><a name="line.5470"></a>
+<span class="sourceLineNo">5471</span>    Scan scan = new Scan(Bytes.toBytes("19998"));<a name="line.5471"></a>
+<span class="sourceLineNo">5472</span>    scan.setReversed(true);<a name="line.5472"></a>
+<span class="sourceLineNo">5473</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5473"></a>
+<span class="sourceLineNo">5474</span><a name="line.5474"></a>
+<span class="sourceLineNo">5475</span>    // create one storefile contains many rows will be skipped<a name="line.5475"></a>
+<span class="sourceLineNo">5476</span>    // to check StoreFileScanner.seekToPreviousRow<a name="line.5476"></a>
+<span class="sourceLineNo">5477</span>    for (int i = 10000; i &lt; 20000; i++) {<a name="line.5477"></a>
+<span class="sourceLineNo">5478</span>      Put p = new Put(Bytes.toBytes(""+i));<a name="line.5478"></a>
+<span class="sourceLineNo">5479</span>      p.addColumn(cf1, col, Bytes.toBytes("" + i));<a name="line.5479"></a>
+<span class="sourceLineNo">5480</span>      region.put(p);<a name="line.5480"></a>
+<span class="sourceLineNo">5481</span>    }<a name="line.5481"></a>
+<span class="sourceLineNo">5482</span>    region.flushcache(true, true, FlushLifeCycleTracker.DUMMY);<a name="line.5482"></a>
+<span class="sourceLineNo">5483</span><a name="line.5483"></a>
+<span class="sourceLineNo">5484</span>    // create one memstore contains many rows will be skipped<a name="line.5484"></a>
+<span class="sourceLineNo">5485</span>    // to check MemStoreScanner.seekToPreviousRow<a name="line.5485"></a>
+<span class="sourceLineNo">5486</span>    for (int i = 10000; i &lt; 20000; i++) {<a name="line.5486"></a>
+<span class="sourceLineNo">5487</span>      Put p = new Put(Bytes.toBytes(""+i));<a name="line.5487"></a>
+<span class="sourceLineNo">5488</span>      p.addColumn(cf1, col, Bytes.toBytes("" + i));<a name="line.5488"></a>
+<span class="sourceLineNo">5489</span>      region.put(p);<a name="line.5489"></a>
+<span class="sourceLineNo">5490</span>    }<a name="line.5490"></a>
+<span class="sourceLineNo">5491</span><a name="line.5491"></a>
+<span class="sourceLineNo">5492</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5492"></a>
+<span class="sourceLineNo">5493</span>    boolean hasNext;<a name="line.5493"></a>
+<span class="sourceLineNo">5494</span>    do {<a name="line.5494"></a>
+<span class="sourceLineNo">5495</span>      hasNext = scanner.next(currRow);<a name="line.5495"></a>
+<span class="sourceLineNo">5496</span>    } while (hasNext);<a name="line.5496"></a>
+<span class="sourceLineNo">5497</span>    assertEquals(2, currRow.size());<a name="line.5497"></a>
+<span class="sourceLineNo">5498</span>    assertEquals("19998", Bytes.toString(currRow.get(0).getRowArray(),<a name="line.5498"></a>
+<span class="sourceLineNo">5499</span>      currRow.get(0).getRowOffset(), currRow.get(0).getRowLength()));<a name="line.5499"></a>
+<span class="sourceLineNo">5500</span>    assertEquals("19997", Bytes.toString(currRow.get(1).getRowArray(),<a name="line.5500"></a>
+<span class="sourceLineNo">5501</span>      currRow.get(1).getRowOffset(), currRow.get(1).getRowLength()));<a name="line.5501"></a>
+<span class="sourceLineNo">5502</span>  }<a name="line.5502"></a>
+<span class="sourceLineNo">5503</span><a name="line.5503"></a>
+<span class="sourceLineNo">5504</span>  @Test<a name="line.5504"></a>
+<span class="sourceLineNo">5505</span>  public void testReverseScanShouldNotScanMemstoreIfReadPtLesser() throws Exception {<a name="line.5505"></a>
+<span class="sourceLineNo">5506</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5506"></a>
+<span class="sourceLineNo">5507</span>    byte[][] families = { cf1 };<a name="line.5507"></a>
+<span class="sourceLineNo">5508</span>    byte[] col = Bytes.toBytes("C");<a name="line.5508"></a>
+<span class="sourceLineNo">5509</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5509"></a>
+<span class="sourceLineNo">5510</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5510"></a>
+<span class="sourceLineNo">5511</span>    // setup with one storefile and one memstore, to create scanner and get an earlier readPt<a name="line.5511"></a>
+<span class="sourceLineNo">5512</span>    Put put = new Put(Bytes.toBytes("19996"));<a name="line.5512"></a>
+<span class="sourceLineNo">5513</span>    put.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5513"></a>
+<span class="sourceLineNo">5514</span>    region.put(put);<a name="line.5514"></a>
+<span class="sourceLineNo">5515</span>    Put put2 = new Put(Bytes.toBytes("19995"));<a name="line.5515"></a>
+<span class="sourceLineNo">5516</span>    put2.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5516"></a>
+<span class="sourceLineNo">5517</span>    region.put(put2);<a name="line.5517"></a>
+<span class="sourceLineNo">5518</span>    // create a reverse scan<a name="line.5518"></a>
+<span class="sourceLineNo">5519</span>    Scan scan = new Scan(Bytes.toBytes("19996"));<a name="line.5519"></a>
+<span class="sourceLineNo">5520</span>    scan.setReversed(true);<a name="line.5520"></a>
+<span class="sourceLineNo">5521</span>    RegionScannerImpl scanner = region.getScanner(scan);<a name="line.5521"></a>
+<span class="sourceLineNo">5522</span><a name="line.5522"></a>
+<span class="sourceLineNo">5523</span>    // flush the cache. This will reset the store scanner<a name="line.5523"></a>
+<span class="sourceLineNo">5524</span>    region.flushcache(true, true, FlushLifeCycleTracker.DUMMY);<a name="line.5524"></a>
+<span class="sourceLineNo">5525</span><a name="line.5525"></a>
+<span class="sourceLineNo">5526</span>    // create one memstore contains many rows will be skipped<a name="line.5526"></a>
+<span class="sourceLineNo">5527</span>    // to check MemStoreScanner.seekToPreviousRow<a name="line.5527"></a>
+<span class="sourceLineNo">5528</span>    for (int i = 10000; i &lt; 20000; i++) {<a name="line.5528"></a>
+<span class="sourceLineNo">5529</span>      Put p = new Put(Bytes.toBytes("" + i));<a name="line.5529"></a>
+<span class="sourceLineNo">5530</span>      p.addColumn(cf1, col, Bytes.toBytes("" + i));<a name="line.5530"></a>
+<span class="sourceLineNo">5531</span>      region.put(p);<a name="line.5531"></a>
+<span class="sourceLineNo">5532</span>    }<a name="line.5532"></a>
+<span class="sourceLineNo">5533</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5533"></a>
+<span class="sourceLineNo">5534</span>    boolean hasNext;<a name="line.5534"></a>
+<span class="sourceLineNo">5535</span>    boolean assertDone = false;<a name="line.5535"></a>
+<span class="sourceLineNo">5536</span>    do {<a name="line.5536"></a>
+<span class="sourceLineNo">5537</span>      hasNext = scanner.next(currRow);<a name="line.5537"></a>
+<span class="sourceLineNo">5538</span>      // With HBASE-15871, after the scanner is reset the memstore scanner should not be<a name="line.5538"></a>
+<span class="sourceLineNo">5539</span>      // added here<a name="line.5539"></a>
+<span class="sourceLineNo">5540</span>      if (!assertDone) {<a name="line.5540"></a>
+<span class="sourceLineNo">5541</span>        StoreScanner current =<a name="line.5541"></a>
+<span class="sourceLineNo">5542</span>            (StoreScanner) (scanner.storeHeap).getCurrentForTesting();<a name="line.5542"></a>
+<span class="sourceLineNo">5543</span>        List&lt;KeyValueScanner&gt; scanners = current.getAllScannersForTesting();<a name="line.5543"></a>
+<span class="sourceLineNo">5544</span>        assertEquals("There should be only one scanner the store file scanner", 1,<a name="line.5544"></a>
+<span class="sourceLineNo">5545</span>          scanners.size());<a name="line.5545"></a>
+<span class="sourceLineNo">5546</span>        assertDone = true;<a name="line.5546"></a>
+<span class="sourceLineNo">5547</span>      }<a name="line.5547"></a>
+<span class="sourceLineNo">5548</span>    } while (hasNext);<a name="line.5548"></a>
+<span class="sourceLineNo">5549</span>    assertEquals(2, currRow.size());<a name="line.5549"></a>
+<span class="sourceLineNo">5550</span>    assertEquals("19996", Bytes.toString(currRow.get(0).getRowArray(),<a name="line.5550"></a>
+<span class="sourceLineNo">5551</span>      currRow.get(0).getRowOffset(), currRow.get(0).getRowLength()));<a name="line.5551"></a>
+<span class="sourceLineNo">5552</span>    assertEquals("19995", Bytes.toString(currRow.get(1).getRowArray(),<a name="line.5552"></a>
+<span class="sourceLineNo">5553</span>      currRow.get(1).getRowOffset(), currRow.get(1).getRowLength()));<a name="line.5553"></a>
+<span class="sourceLineNo">5554</span>  }<a name="line.5554"></a>
+<span class="sourceLineNo">5555</span><a name="line.5555"></a>
+<span class="sourceLineNo">5556</span>  @Test<a name="line.5556"></a>
+<span class="sourceLineNo">5557</span>  public void testReverseScanWhenPutCellsAfterOpenReverseScan() throws Exception {<a name="line.5557"></a>
+<span class="sourceLineNo">5558</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5558"></a>
+<span class="sourceLineNo">5559</span>    byte[][] families = { cf1 };<a name="line.5559"></a>
+<span class="sourceLineNo">5560</span>    byte[] col = Bytes.toBytes("C");<a name="line.5560"></a>
 <span class="sourceLineNo">5561</span><a name="line.5561"></a>
-<span class="sourceLineNo">5562</span>    // Create a reverse scan<a name="line.5562"></a>
-<span class="sourceLineNo">5563</span>    Scan scan = new Scan(Bytes.toBytes("199996"));<a name="line.5563"></a>
-<span class="sourceLineNo">5564</span>    scan.setReversed(true);<a name="line.5564"></a>
-<span class="sourceLineNo">5565</span>    RegionScannerImpl scanner = region.getScanner(scan);<a name="line.5565"></a>
-<span class="sourceLineNo">5566</span><a name="line.5566"></a>
-<span class="sourceLineNo">5567</span>    // Put a lot of cells that have sequenceIDs grater than the readPt of the reverse scan<a name="line.5567"></a>
-<span class="sourceLineNo">5568</span>    for (int i = 100000; i &lt; 200000; i++) {<a name="line.5568"></a>
-<span class="sourceLineNo">5569</span>      Put p = new Put(Bytes.toBytes("" + i));<a name="line.5569"></a>
-<span class="sourceLineNo">5570</span>      p.addColumn(cf1, col, Bytes.toBytes("" + i));<a name="line.5570"></a>
-<span class="sourceLineNo">5571</span>      region.put(p);<a name="line.5571"></a>
-<span class="sourceLineNo">5572</span>    }<a name="line.5572"></a>
-<span class="sourceLineNo">5573</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5573"></a>
-<span class="sourceLineNo">5574</span>    boolean hasNext;<a name="line.5574"></a>
-<span class="sourceLineNo">5575</span>    do {<a name="line.5575"></a>
-<span class="sourceLineNo">5576</span>      hasNext = scanner.next(currRow);<a name="line.5576"></a>
-<span class="sourceLineNo">5577</span>    } while (hasNext);<a name="line.5577"></a>
-<span class="sourceLineNo">5578</span><a name="line.5578"></a>
-<span class="sourceLineNo">5579</span>    assertEquals(2, currRow.size());<a name="line.5579"></a>
-<span class="sourceLineNo">5580</span>    assertEquals("199996", Bytes.toString(currRow.get(0).getRowArray(),<a name="line.5580"></a>
-<span class="sourceLineNo">5581</span>      currRow.get(0).getRowOffset(), currRow.get(0).getRowLength()));<a name="line.5581"></a>
-<span class="sourceLineNo">5582</span>    assertEquals("199995", Bytes.toString(currRow.get(1).getRowArray(),<a name="line.5582"></a>
-<span class="sourceLineNo">5583</span>      currRow.get(1).getRowOffset(), currRow.get(1).getRowLength()));<a name="line.5583"></a>
-<span class="sourceLineNo">5584</span>  }<a name="line.5584"></a>
-<span class="sourceLineNo">5585</span><a name="line.5585"></a>
-<span class="sourceLineNo">5586</span>  @Test<a name="line.5586"></a>
-<span class="sourceLineNo">5587</span>  public void testWriteRequestsCounter() throws IOException {<a name="line.5587"></a>
-<span class="sourceLineNo">5588</span>    byte[] fam = Bytes.toBytes("info");<a name="line.5588"></a>
-<span class="sourceLineNo">5589</span>    byte[][] families = { fam };<a name="line.5589"></a>
-<span class="sourceLineNo">5590</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.5590"></a>
-<span class="sourceLineNo">5591</span><a name="line.5591"></a>
-<span class="sourceLineNo">5592</span>    Assert.assertEquals(0L, region.getWriteRequestsCount());<a name="line.5592"></a>
-<span class="sourceLineNo">5593</span><a name="line.5593"></a>
-<span class="sourceLineNo">5594</span>    Put put = new Put(row);<a name="line.5594"></a>
-<span class="sourceLineNo">5595</span>    put.addColumn(fam, fam, fam);<a name="line.5595"></a>
-<span class="sourceLineNo">5596</span><a name="line.5596"></a>
-<span class="sourceLineNo">5597</span>    Assert.assertEquals(0L, region.getWriteRequestsCount());<a name="line.5597"></a>
-<span class="sourceLineNo">5598</span>    region.put(put);<a name="line.5598"></a>
-<span class="sourceLineNo">5599</span>    Assert.assertEquals(1L, region.getWriteRequestsCount());<a name="line.5599"></a>
-<span class="sourceLineNo">5600</span>    region.put(put);<a name="line.5600"></a>
-<span class="sourceLineNo">5601</span>    Assert.assertEquals(2L, region.getWriteRequestsCount());<a name="line.5601"></a>
-<span class="sourceLineNo">5602</span>    region.put(put);<a name="line.5602"></a>
-<span class="sourceLineNo">5603</span>    Assert.assertEquals(3L, region.getWriteRequestsCount());<a name="line.5603"></a>
-<span class="sourceLineNo">5604</span><a name="line.5604"></a>
-<span class="sourceLineNo">5605</span>    region.delete(new Delete(row));<a name="line.5605"></a>
-<span class="sourceLineNo">5606</span>    Assert.assertEquals(4L, region.getWriteRequestsCount());<a name="line.5606"></a>
-<span class="sourceLineNo">5607</span>  }<a name="line.5607"></a>
-<span class="sourceLineNo">5608</span><a name="line.5608"></a>
-<span class="sourceLineNo">5609</span>  @Test<a name="line.5609"></a>
-<span class="sourceLineNo">5610</span>  public void testOpenRegionWrittenToWAL() throws Exception {<a name="line.5610"></a>
-<span class="sourceLineNo">5611</span>    final ServerName serverName = ServerName.valueOf(name.getMethodName(), 100, 42);<a name="line.5611"></a>
-<span class="sourceLineNo">5612</span>    final RegionServerServices rss = spy(TEST_UTIL.createMockRegionServerService(serverName));<a name="line.5612"></a>
-<span class="sourceLineNo">5613</span><a name="line.5613"></a>
-<span class="sourceLineNo">5614</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.5614"></a>
-<span class="sourceLineNo">5615</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.5615"></a>
-<span class="sourceLineNo">5616</span>    htd.addFamily(new HColumnDescriptor(fam2));<a name="line.5616"></a>
-<span class="sourceLineNo">5617</span><a name="line.5617"></a>
-<span class="sourceLineNo">5618</span>    HRegionInfo hri = new HRegionInfo(htd.getTableName(),<a name="line.5618"></a>
-<span class="sourceLineNo">5619</span>      HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY);<a name="line.5619"></a>
-<span class="sourceLineNo">5620</span><a name="line.5620"></a>
-<span class="sourceLineNo">5621</span>    // open the region w/o rss and wal and flush some files<a name="line.5621"></a>
-<span class="sourceLineNo">5622</span>    region =<a name="line.5622"></a>
-<span class="sourceLineNo">5623</span>         HBaseTestingUtility.createRegionAndWAL(hri, TEST_UTIL.getDataTestDir(), TEST_UTIL<a name="line.5623"></a>
-<span class="sourceLineNo">5624</span>             .getConfiguration(), htd);<a name="line.5624"></a>
-<span class="sourceLineNo">5625</span>    assertNotNull(region);<a name="line.5625"></a>
-<span class="sourceLineNo">5626</span><a name="line.5626"></a>
-<span class="sourceLineNo">5627</span>    // create a file in fam1 for the region before opening in OpenRegionHandler<a name="line.5627"></a>
-<span class="sourceLineNo">5628</span>    region.put(new Put(Bytes.toBytes("a")).addColumn(fam1, fam1, fam1));<a name="line.5628"></a>
-<span class="sourceLineNo">5629</span>    region.flush(true);<a name="line.5629"></a>
-<span class="sourceLineNo">5630</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.5630"></a>
-<span class="sourceLineNo">5631</span><a name="line.5631"></a>
-<span class="sourceLineNo">5632</span>    ArgumentCaptor&lt;WALEdit&gt; editCaptor = ArgumentCaptor.forClass(WALEdit.class);<a name="line.5632"></a>
-<span class="sourceLineNo">5633</span><a name="line.5633"></a>
-<span class="sourceLineNo">5634</span>    // capture append() calls<a name="line.5634"></a>
-<span class="sourceLineNo">5635</span>    WAL wal = mockWAL();<a name="line.5635"></a>
-<span class="sourceLineNo">5636</span>    when(rss.getWAL((HRegionInfo) any())).thenReturn(wal);<a name="line.5636"></a>
-<span class="sourceLineNo">5637</span><a name="line.5637"></a>
-<span class="sourceLineNo">5638</span>    region = HRegion.openHRegion(hri, htd, rss.getWAL(hri),<a name="line.5638"></a>
-<span class="sourceLineNo">5639</span>      TEST_UTIL.getConfiguration(), rss, null);<a name="line.5639"></a>
-<span class="sourceLineNo">5640</span><a name="line.5640"></a>
-<span class="sourceLineNo">5641</span>    verify(wal, times(1)).append((HRegionInfo)any(), (WALKeyImpl)any()<a name="line.5641"></a>
-<span class="sourceLineNo">5642</span>      , editCaptor.capture(), anyBoolean());<a name="line.5642"></a>
+<span class="sourceLineNo">5562</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5562"></a>
+<span class="sourceLineNo">5563</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5563"></a>
+<span class="sourceLineNo">5564</span><a name="line.5564"></a>
+<span class="sourceLineNo">5565</span>    Put put = new Put(Bytes.toBytes("199996"));<a name="line.5565"></a>
+<span class="sourceLineNo">5566</span>    put.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5566"></a>
+<span class="sourceLineNo">5567</span>    region.put(put);<a name="line.5567"></a>
+<span class="sourceLineNo">5568</span>    Put put2 = new Put(Bytes.toBytes("199995"));<a name="line.5568"></a>
+<span class="sourceLineNo">5569</span>    put2.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5569"></a>
+<span class="sourceLineNo">5570</span>    region.put(put2);<a name="line.5570"></a>
+<span class="sourceLineNo">5571</span><a name="line.5571"></a>
+<span class="sourceLineNo">5572</span>    // Create a reverse scan<a name="line.5572"></a>
+<span class="sourceLineNo">5573</span>    Scan scan = new Scan(Bytes.toBytes("199996"));<a name="line.5573"></a>
+<span class="sourceLineNo">5574</span>    scan.setReversed(true);<a name="line.5574"></a>
+<span class="sourceLineNo">5575</span>    RegionScannerImpl scanner = region.getScanner(scan);<a name="line.5575"></a>
+<span class="sourceLineNo">5576</span><a name="line.5576"></a>
+<span class="sourceLineNo">5577</span>    // Put a lot of cells that have sequenceIDs grater than the readPt of the reverse scan<a name="line.5577"></a>
+<span class="sourceLineNo">5578</span>    for (int i = 100000; i &lt; 200000; i++) {<a name="line.5578"></a>
+<span class="sourceLineNo">5579</span>      Put p = new Put(Bytes.toBytes("" + i));<a name="line.5579"></a>
+<span class="sourceLineNo">5580</span>      p.addColumn(cf1, col, Bytes.toBytes("" + i));<a name="line.5580"></a>
+<span class="sourceLineNo">5581</span>      region.put(p);<a name="line.5581"></a>
+<span class="sourceLineNo">5582</span>    }<a name="line.5582"></a>
+<span class="sourceLineNo">5583</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5583"></a>
+<span class="sourceLineNo">5584</span>    boolean hasNext;<a name="line.5584"></a>
+<span class="sourceLineNo">5585</span>    do {<a name="line.5585"></a>
+<span class="sourceLineNo">5586</span>      hasNext = scanner.next(currRow);<a name="line.5586"></a>
+<span class="sourceLineNo">5587</span>    } while (hasNext);<a name="line.5587"></a>
+<span class="sourceLineNo">5588</span><a name="line.5588"></a>
+<span class="sourceLineNo">5589</span>    assertEquals(2, currRow.size());<a name="line.5589"></a>
+<span class="sourceLineNo">5590</span>    assertEquals("199996", Bytes.toString(currRow.get(0).getRowArray(),<a name="line.5590"></a>
+<span class="sourceLineNo">5591</span>      currRow.get(0).getRowOffset(), currRow.get(0).getRowLength()));<a name="line.5591"></a>
+<span class="sourceLineNo">5592</span>    assertEquals("199995", Bytes.toString(currRow.get(1).getRowArray(),<a name="line.5592"></a>
+<span class="sourceLineNo">5593</span>      currRow.get(1).getRowOffset(), currRow.get(1).getRowLength()));<a name="line.5593"></a>
+<span class="sourceLineNo">5594</span>  }<a name="line.5594"></a>
+<span class="sourceLineNo">5595</span><a name="line.5595"></a>
+<span class="sourceLineNo">5596</span>  @Test<a name="line.5596"></a>
+<span class="sourceLineNo">5597</span>  public void testWriteRequestsCounter() throws IOException {<a name="line.5597"></a>
+<span class="sourceLineNo">5598</span>    byte[] fam = Bytes.toBytes("info");<a name="line.5598"></a>
+<span class="sourceLineNo">5599</span>    byte[][] families = { fam };<a name="line.5599"></a>
+<span class="sourceLineNo">5600</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.5600"></a>
+<span class="sourceLineNo">5601</span><a name="line.5601"></a>
+<span class="sourceLineNo">5602</span>    Assert.assertEquals(0L, region.getWriteRequestsCount());<a name="line.5602"></a>
+<span class="sourceLineNo">5603</span><a name="line.5603"></a>
+<span class="sourceLineNo">5604</span>    Put put = new Put(row);<a name="line.5604"></a>
+<span class="sourceLineNo">5605</span>    put.addColumn(fam, fam, fam);<a name="line.5605"></a>
+<span class="sourceLineNo">5606</span><a name="line.5606"></a>
+<span class="sourceLineNo">5607</span>    Assert.assertEquals(0L, region.getWriteRequestsCount());<a name="line.5607"></a>
+<span class="sourceLineNo">5608</span>    region.put(put);<a name="line.5608"></a>
+<span class="sourceLineNo">5609</span>    Assert.assertEquals(1L, region.getWriteRequestsCount());<a name="line.5609"></a>
+<span class="sourceLineNo">5610</span>    region.put(put);<a name="line.5610"></a>
+<span class="sourceLineNo">5611</span>    Assert.assertEquals(2L, region.getWriteRequestsCount());<a name="line.5611"></a>
+<span class="sourceLineNo">5612</span>    region.put(put);<a name="line.5612"></a>
+<span class="sourceLineNo">5613</span>    Assert.assertEquals(3L, region.getWriteRequestsCount());<a name="line.5613"></a>
+<span class="sourceLineNo">5614</span><a name="line.5614"></a>
+<span class="sourceLineNo">5615</span>    region.delete(new Delete(row));<a name="line.5615"></a>
+<span class="sourceLineNo">5616</span>    Assert.assertEquals(4L, region.getWriteRequestsCount());<a name="line.5616"></a>
+<span class="sourceLineNo">5617</span>  }<a name="line.5617"></a>
+<span class="sourceLineNo">5618</span><a name="line.5618"></a>
+<span class="sourceLineNo">5619</span>  @Test<a name="line.5619"></a>
+<span class="sourceLineNo">5620</span>  public void testOpenRegionWrittenToWAL() throws Exception {<a name="line.5620"></a>
+<span class="sourceLineNo">5621</span>    final ServerName serverName = ServerName.valueOf(name.getMethodName(), 100, 42);<a name="line.5621"></a>
+<span class="sourceLineNo">5622</span>    final RegionServerServices rss = spy(TEST_UTIL.createMockRegionServerService(serverName));<a name="line.5622"></a>
+<span class="sourceLineNo">5623</span><a name="line.5623"></a>
+<span class="sourceLineNo">5624</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.5624"></a>
+<span class="sourceLineNo">5625</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.5625"></a>
+<span class="sourceLineNo">5626</span>    htd.addFamily(new HColumnDescriptor(fam2));<a name="line.5626"></a>
+<span class="sourceLineNo">5627</span><a name="line.5627"></a>
+<span class="sourceLineNo">5628</span>    HRegionInfo hri = new HRegionInfo(htd.getTableName(),<a name="line.5628"></a>
+<span class="sourceLineNo">5629</span>      HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY);<a name="line.5629"></a>
+<span class="sourceLineNo">5630</span><a name="line.5630"></a>
+<span class="sourceLineNo">5631</span>    // open the region w/o rss and wal and flush some files<a name="line.5631"></a>
+<span class="sourceLineNo">5632</span>    region =<a name="line.5632"></a>
+<span class="sourceLineNo">5633</span>         HBaseTestingUtility.createRegionAndWAL(hri, TEST_UTIL.getDataTestDir(), TEST_UTIL<a name="line.5633"></a>
+<span class="sourceLineNo">5634</span>             .getConfiguration(), htd);<a name="line.5634"></a>
+<span class="sourceLineNo">5635</span>    assertNotNull(region);<a name="line.5635"></a>
+<span class="sourceLineNo">5636</span><a name="line.5636"></a>
+<span class="sourceLineNo">5637</span>    // create a file in fam1 for the region before opening in OpenRegionHandler<a name="line.5637"></a>
+<span class="sourceLineNo">5638</span>    region.put(new Put(Bytes.toBytes("a")).addColumn(fam1, fam1, fam1));<a name="line.5638"></a>
+<span class="sourceLineNo">5639</span>    region.flush(true);<a name="line.5639"></a>
+<span class="sourceLineNo">5640</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.5640"></a>
+<span class="sourceLineNo">5641</span><a name="line.5641"></a>
+<span class="sourceLineNo">5642</span>    ArgumentCaptor&lt;WALEdit&gt; editCaptor = ArgumentCaptor.forClass(WALEdit.class);<a name="line.5642"></a>
 <span class="sourceLineNo">5643</span><a name="line.5643"></a>
-<span class="sourceLineNo">5644</span>    WALEdit edit = editCaptor.getValue();<a name="line.5644"></a>
-<span class="sourceLineNo">5645</span>    assertNotNull(edit);<a name="line.5645"></a>
-<span class="sourceLineNo">5646</span>    assertNotNull(edit.getCells());<a name="line.5646"></a>
-<span class="sourceLineNo">5647</span>    assertEquals(1, edit.getCells().size());<a name="line.5647"></a>
-<span class="sourceLineNo">5648</span>    RegionEventDescriptor desc = WALEdit.getRegionEventDescriptor(edit.getCells().get(0));<a name="line.5648"></a>
-<span class="sourceLineNo">5649</span>    assertNotNull(desc);<a name="line.5649"></a>
+<span class="sourceLineNo">5644</span>    // capture append() calls<a name="line.5644"></a>
+<span class="sourceLineNo">5645</span>    WAL wal = mockWAL();<a name="line.5645"></a>
+<span class="sourceLineNo">5646</span>    when(rss.getWAL((HRegionInfo) any())).thenReturn(wal);<a name="line.5646"></a>
+<span class="sourceLineNo">5647</span><a name="line.5647"></a>
+<span class="sourceLineNo">5648</span>    region = HRegion.openHRegion(hri, htd, rss.getWAL(hri),<a name="line.5648"></a>
+<span class="sourceLineNo">5649</span>      TEST_UTIL.getConfiguration(), rss, null);<a name="line.5649"></a>
 <span class="sourceLineNo">5650</span><a name="line.5650"></a>
-<span class="sourceLineNo">5651</span>    LOG.info("RegionEventDescriptor from WAL: " + desc);<a name="line.5651"></a>
-<span class="sourceLineNo">5652</span><a name="line.5652"></a>
-<span class="sourceLineNo">5653</span>    assertEquals(RegionEventDescriptor.EventType.REGION_OPEN, desc.getEventType());<a name="line.5653"></a>
-<span class="sourceLineNo">5654</span>    assertTrue(Bytes.equals(desc.getTableName().toByteArray(), htd.getTableName().toBytes()));<a name="line.5654"></a>
-<span class="sourceLineNo">5655</span>    assertTrue(Bytes.equals(desc.getEncodedRegionName().toByteArray(),<a name="line.5655"></a>
-<span class="sourceLineNo">5656</span>      hri.getEncodedNameAsBytes()));<a name="line.5656"></a>
-<span class="sourceLineNo">5657</span>    assertTrue(desc.getLogSequenceNumber() &gt; 0);<a name="line.5657"></a>
-<span class="sourceLineNo">5658</span>    assertEquals(serverName, ProtobufUtil.toServerName(desc.getServer()));<a name="line.5658"></a>
-<span class="sourceLineNo">5659</span>    assertEquals(2, desc.getStoresCount());<a name="line.5659"></a>
+<span class="sourceLineNo">5651</span>    verify(wal, times(1)).append((HRegionInfo)any(), (WALKeyImpl)any()<a name="line.5651"></a>
+<span class="sourceLineNo">5652</span>      , editCaptor.capture(), anyBoolean());<a name="line.5652"></a>
+<span class="sourceLineNo">5653</span><a name="line.5653"></a>
+<span class="sourceLineNo">5654</span>    WALEdit edit = editCaptor.getValue();<a name="line.5654"></a>
+<span class="sourceLineNo">5655</span>    assertNotNull(edit);<a name="line.5655"></a>
+<span class="sourceLineNo">5656</span>    assertNotNull(edit.getCells());<a name="line.5656"></a>
+<span class="sourceLineNo">5657</span>    assertEquals(1, edit.getCells().size());<a name="line.5657"></a>
+<span class="sourceLineNo">5658</span>    RegionEventDescriptor desc = WALEdit.getRegionEventDescriptor(edit.getCells().get(0));<a name="line.5658"></a>
+<span class="sourceLineNo">5659</span>    assertNotNull(desc);<a name="line.5659"></a>
 <span class="sourceLineNo">5660</span><a name="line.5660"></a>
-<span class="sourceLineNo">5661</span>    StoreDescriptor store = desc.getStores(0);<a name="line.5661"></a>
-<span class="sourceLineNo">5662</span>    assertTrue(Bytes.equals(store.getFamilyName().toByteArray(), fam1));<a name="line.5662"></a>
-<span class="sourceLineNo">5663</span>    assertEquals(store.getStoreHomeDir(), Bytes.toString(fam1));<a name="line.5663"></a>
-<span class="sourceLineNo">5664</span>    assertEquals(1, store.getStoreFileCount()); // 1store file<a name="line.5664"></a>
-<span class="sourceLineNo">5665</span>    assertFalse(store.getStoreFile(0).contains("/")); // ensure path is relative<a name="line.5665"></a>
-<span class="sourceLineNo">5666</span><a name="line.5666"></a>
-<span class="sourceLineNo">5667</span>    store = desc.getStores(1);<a name="line.5667"></a>
-<span class="sourceLineNo">5668</span>    assertTrue(Bytes.equals(store.getFamilyName().toByteArray(), fam2));<a name="line.5668"></a>
-<span class="sourceLineNo">5669</span>    assertEquals(store.getStoreHomeDir(), Bytes.toString(fam2));<a name="line.5669"></a>
-<span class="sourceLineNo">5670</span>    assertEquals(0, store.getStoreFileCount()); // no store files<a name="line.5670"></a>
-<span class="sourceLineNo">5671</span>  }<a name="line.5671"></a>
-<span class="sourceLineNo">5672</span><a name="line.5672"></a>
-<span class="sourceLineNo">5673</span>  // Helper for test testOpenRegionWrittenToWALForLogReplay<a name="line.5673"></a>
-<span class="sourceLineNo">5674</span>  static class HRegionWithSeqId extends HRegion {<a name="line.5674"></a>
-<span class="sourceLineNo">5675</span>    public HRegionWithSeqId(final Path tableDir, final WAL wal, final FileSystem fs,<a name="line.5675"></a>
-<span class="sourceLineNo">5676</span>        final Configuration confParam, final RegionInfo regionInfo,<a name="line.5676"></a>
-<span class="sourceLineNo">5677</span>        final TableDescriptor htd, final RegionServerServices rsServices) {<a name="line.5677"></a>
-<span class="sourceLineNo">5678</span>      super(tableDir, wal, fs, confParam, regionInfo, htd, rsServices);<a name="line.5678"></a>
-<span class="sourceLineNo">5679</span>    }<a name="line.5679"></a>
-<span class="sourceLineNo">5680</span>    @Override<a name="line.5680"></a>
-<span class="sourceLineNo">5681</span>    protected long getNextSequenceId(WAL wal) throws IOException {<a name="line.5681"></a>
-<span class="sourceLineNo">5682</span>      return 42;<a name="line.5682"></a>
-<span class="sourceLineNo">5683</span>    }<a name="line.5683"></a>
-<span class="sourceLineNo">5684</span>  }<a name="line.5684"></a>
-<span class="sourceLineNo">5685</span><a name="line.5685"></a>
-<span class="sourceLineNo">5686</span>  @Test<a name="line.5686"></a>
-<span class="sourceLineNo">5687</span>  public void testFlushedFileWithNoTags() throws Exception {<a name="line.5687"></a>
-<span class="sourceLineNo">5688</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.5688"></a>
-<span class="sourceLineNo">5689</span>    HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.5689"></a>
-<span class="sourceLineNo">5690</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.5690"></a>
-<span class="sourceLineNo">5691</span>    HRegionInfo info = new HRegionInfo(tableName, null, null, false);<a name="line.5691"></a>
-<span class="sourceLineNo">5692</span>    Path path = TEST_UTIL.getDataTestDir(getClass().getSimpleName());<a name="line.5692"></a>
-<span class="sourceLineNo">5693</span>    region = HBaseTestingUtility.createRegionAndWAL(info, path, TEST_UTIL.getConfiguration(), htd);<a name="line.5693"></a>
-<span class="sourceLineNo">5694</span>    Put put = new Put(Bytes.toBytes("a-b-0-0"));<a name="line.5694"></a>
-<span class="sourceLineNo">5695</span>    put.addColumn(fam1, qual1, Bytes.toBytes("c1-value"));<a name="line.5695"></a>
-<span class="sourceLineNo">5696</span>    region.put(put);<a name="line.5696"></a>
-<span class="sourceLineNo">5697</span>    region.flush(true);<a name="line.5697"></a>
-<span class="sourceLineNo">5698</span>    HStore store = region.getStore(fam1);<a name="line.5698"></a>
-<span class="sourceLineNo">5699</span>    Collection&lt;HStoreFile&gt; storefiles = store.getStorefiles();<a name="line.5699"></a>
-<span class="sourceLineNo">5700</span>    for (HStoreFile sf : storefiles) {<a name="line.5700"></a>
-<span class="sourceLineNo">5701</span>      assertFalse("Tags should not be present "<a name="line.5701"></a>
-<span class="sourceLineNo">5702</span>          ,sf.getReader().getHFileReader().getFileContext().isIncludesTags());<a name="line.5702"></a>
-<span class="sourceLineNo">5703</span>    }<a name="line.5703"></a>
-<span class="sourceLineNo">5704</span>  }<a name="line.5704"></a>
-<span class="sourceLineNo">5705</span><a name="line.5705"></a>
-<span class="sourceLineNo">5706</span>  /**<a name="line.5706"></a>
-<span class="sourceLineNo">5707</span>   * Utility method to setup a WAL mock.<a name="line.5707"></a>
-<span class="sourceLineNo">5708</span>   * Needs to do the bit where we close latch on the WALKeyImpl on append else test hangs.<a name="line.5708"></a>
-<span class="sourceLineNo">5709</span>   * @return a mock WAL<a name="line.5709"></a>
-<span class="sourceLineNo">5710</span>   * @throws IOException<a name="line.5710"></a>
-<span class="sourceLineNo">5711</span>   */<a name="line.5711"></a>
-<span class="sourceLineNo">5712</span>  private WAL mockWAL() throws IOException {<a name="line.5712"></a>
-<span class="sourceLineNo">5713</span>    WAL wal = mock(WAL.class);<a name="line.5713"></a>
-<span class="sourceLineNo">5714</span>    Mockito.when(wal.append((HRegionInfo)Mockito.any(),<a name="line.5714"></a>
-<span class="sourceLineNo">5715</span>        (WALKeyImpl)Mockito.any(), (WALEdit)Mockito.any(), Mockito.anyBoolean())).<a name="line.5715"></a>
-<span class="sourceLineNo">5716</span>      thenAnswer(new Answer&lt;Long&gt;() {<a name="line.5716"></a>
-<span class="sourceLineNo">5717</span>        @Override<a name="line.5717"></a>
-<span class="sourceLineNo">5718</span>        public Long answer(InvocationOnMock invocation) throws Throwable {<a name="line.5718"></a>
-<span class="sourceLineNo">5719</span>          WALKeyImpl key = invocation.getArgument(1);<a name="line.5719"></a>
-<span class="sourceLineNo">5720</span>          MultiVersionConcurrencyControl.WriteEntry we = key.getMvcc().begin();<a name="line.5720"></a>
-<span class="sourceLineNo">5721</span>          key.setWriteEntry(we);<a name="line.5721"></a>
-<span class="sourceLineNo">5722</span>          return 1L;<a name="line.5722"></a>
-<span class="sourceLineNo">5723</span>        }<a name="line.5723"></a>
-<span class="sourceLineNo">5724</span><a name="line.5724"></a>
-<span class="sourceLineNo">5725</span>    });<a name="line.5725"></a>
-<span class="sourceLineNo">5726</span>    return wal;<a name="line.5726"></a>
-<span class="sourceLineNo">5727</span>  }<a name="line.5727"></a>
-<span class="sourceLineNo">5728</span><a name="line.5728"></a>
-<span class="sourceLineNo">5729</span>  @Test<a name="line.5729"></a>
-<span class="sourceLineNo">5730</span>  public void testCloseRegionWrittenToWAL() throws Exception {<a name="line.5730"></a>
-<span class="sourceLineNo">5731</span><a name="line.5731"></a>
-<span class="sourceLineNo">5732</span>    Path rootDir = new Path(dir + name.getMethodName());<a name="line.5732"></a>
-<span class="sourceLineNo">5733</span>    FSUtils.setRootDir(TEST_UTIL.getConfiguration(), rootDir);<a name="line.5733"></a>
+<span class="sourceLineNo">5661</span>    LOG.info("RegionEventDescriptor from WAL: " + desc);<a name="line.5661"></a>
+<span class="sourceLineNo">5662</span><a name="line.5662"></a>
+<span class="sourceLineNo">5663</span>    assertEquals(RegionEventDescriptor.EventType.REGION_OPEN, desc.getEventType());<a name="line.5663"></a>
+<span class="sourceLineNo">5664</span>    assertTrue(Bytes.equals(desc.getTableName().toByteArray(), htd.getTableName().toBytes()));<a name="line.5664"></a>
+<span class="sourceLineNo">5665</span>    assertTrue(Bytes.equals(desc.getEncodedRegionName().toByteArray(),<a name="line.5665"></a>
+<span class="sourceLineNo">5666</span>      hri.getEncodedNameAsBytes()));<a name="line.5666"></a>
+<span class="sourceLineNo">5667</span>    assertTrue(desc.getLogSequenceNumber() &gt; 0);<a name="line.5667"></a>
+<span class="sourceLineNo">5668</span>    assertEquals(serverName, ProtobufUtil.toServerName(desc.getServer()));<a name="line.5668"></a>
+<span class="sourceLineNo">5669</span>    assertEquals(2, desc.getStoresCount());<a name="line.5669"></a>
+<span class="sourceLineNo">5670</span><a name="line.5670"></a>
+<span class="sourceLineNo">5671</span>    StoreDescriptor store = desc.getStores(0);<a name="line.5671"></a>
+<span class="sourceLineNo">5672</span>    assertTrue(Bytes.equals(store.getFamilyName().toByteArray(), fam1));<a name="line.5672"></a>
+<span class="sourceLineNo">5673</span>    assertEquals(store.getStoreHomeDir(), Bytes.toString(fam1));<a name="line.5673"></a>
+<span class="sourceLineNo">5674</span>    assertEquals(1, store.getStoreFileCount()); // 1store file<a name="line.5674"></a>
+<span class="sourceLineNo">5675</span>    assertFalse(store.getStoreFile(0).contains("/")); // ensure path is relative<a name="line.5675"></a>
+<span class="sourceLineNo">5676</span><a name="line.5676"></a>
+<span class="sourceLineNo">5677</span>    store = desc.getStores(1);<a name="line.5677"></a>
+<span class="sourceLineNo">5678</span>    assertTrue(Bytes.equals(store.getFamilyName().toByteArray(), fam2));<a name="line.5678"></a>
+<span class="sourceLineNo">5679</span>    assertEquals(store.getStoreHomeDir(), Bytes.toString(fam2));<a name="line.5679"></a>
+<span class="sourceLineNo">5680</span>    assertEquals(0, store.getStoreFileCount()); // no store files<a name="line.5680"></a>
+<span class="sourceLineNo">5681</span>  }<a name="line.5681"></a>
+<span class="sourceLineNo">5682</span><a name="line.5682"></a>
+<span class="sourceLineNo">5683</span>  // Helper for test testOpenRegionWrittenToWALForLogReplay<a name="line.5683"></a>
+<span class="sourceLineNo">5684</span>  static class HRegionWithSeqId extends HRegion {<a name="line.5684"></a>
+<span class="sourceLineNo">5685</span>    public HRegionWithSeqId(final Path tableDir, final WAL wal, final FileSystem fs,<a name="line.5685"></a>
+<span class="sourceLineNo">5686</span>        final Configuration confParam, final RegionInfo regionInfo,<a name="line.5686"></a>
+<span class="sourceLineNo">5687</span>        final TableDescriptor htd, final RegionServerServices rsServices) {<a name="line.5687"></a>
+<span class="sourceLineNo">5688</span>      super(tableDir, wal, fs, confParam, regionInfo, htd, rsServices);<a name="line.5688"></a>
+<span class="sourceLineNo">5689</span>    }<a name="line.5689"></a>
+<span class="sourceLineNo">5690</span>    @Override<a name="line.5690"></a>
+<span class="sourceLineNo">5691</span>    protected long getNextSequenceId(WAL wal) throws IOException {<a name="line.5691"></a>
+<span class="sourceLineNo">5692</span>      return 42;<a name="line.5692"></a>
+<span class="sourceLineNo">5693</span>    }<a name="line.5693"></a>
+<span class="sourceLineNo">5694</span>  }<a name="line.5694"></a>
+<span class="sourceLineNo">5695</span><a name="line.5695"></a>
+<span class="sourceLineNo">5696</span>  @Test<a name="line.5696"></a>
+<span class="sourceLineNo">5697</span>  public void testFlushedFileWithNoTags() throws Exception {<a name="line.5697"></a>
+<span class="sourceLineNo">5698</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.5698"></a>
+<span class="sourceLineNo">5699</span>    HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.5699"></a>
+<span class="sourceLineNo">5700</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.5700"></a>
+<span class="sourceLineNo">5701</span>    HRegionInfo info = new HRegionInfo(tableName, null, null, false);<a name="line.5701"></a>
+<span class="sourceLineNo">5702</span>    Path path = TEST_UTIL.getDataTestDir(getClass().getSimpleName());<a name="line.5702"></a>
+<span class="sourceLineNo">5703</span>    region = HBaseTestingUtility.createRegionAndWAL(info, path, TEST_UTIL.getConfiguration(), htd);<a name="line.5703"></a>
+<span class="sourceLineNo">5704</span>    Put put = new Put(Bytes.toBytes("a-b-0-0"));<a name="line.5704"></a>
+<span class="sourceLineNo">5705</span>    put.addColumn(fam1, qual1, Bytes.toBytes("c1-value"));<a name="line.5705"></a>
+<span class="sourceLineNo">5706</span>    region.put(put);<a name="line.5706"></a>
+<span class="sourceLineNo">5707</span>    region.flush(true);<a name="line.5707"></a>
+<span class="sourceLineNo">5708</span>    HStore store = region.getStore(fam1);<a name="line.5708"></a>
+<span class="sourceLineNo">5709</span>    Collection&lt;HStoreFile&gt; storefiles = store.getStorefiles();<a name="line.5709"></a>
+<span class="sourceLineNo">5710</span>    for (HStoreFile sf : storefiles) {<a name="line.5710"></a>
+<span class="sourceLineNo">5711</span>      assertFalse("Tags should not be present "<a name="line.5711"></a>
+<span class="sourceLineNo">5712</span>          ,sf.getReader().getHFileReader().getFileContext().isIncludesTags());<a name="line.5712"></a>
+<span class="sourceLineNo">5713</span>    }<a name="line.5713"></a>
+<span class="sourceLineNo">5714</span>  }<a name="line.5714"></a>
+<span class="sourceLineNo">5715</span><a name="line.5715"></a>
+<span class="sourceLineNo">5716</span>  /**<a name="line.5716"></a>
+<span class="sourceLineNo">5717</span>   * Utility method to setup a WAL mock.<a name="line.5717"></a>
+<span class="sourceLineNo">5718</span>   * Needs to do the bit where we close latch on the WALKeyImpl on append else test hangs.<a name="line.5718"></a>
+<span class="sourceLineNo">5719</span>   * @return a mock WAL<a name="line.5719"></a>
+<span class="sourceLineNo">5720</span>   * @throws IOException<a name="line.5720"></a>
+<span class="sourceLineNo">5721</span>   */<a name="line.5721"></a>
+<span class="sourceLineNo">5722</span>  private WAL mockWAL() throws IOException {<a name="line.5722"></a>
+<span class="sourceLineNo">5723</span>    WAL wal = mock(WAL.class);<a name="line.5723"></a>
+<span class="sourceLineNo">5724</span>    Mockito.when(wal.append((HRegionInfo)Mockito.any(),<a name="line.5724"></a>
+<span class="sourceLineNo">5725</span>        (WALKeyImpl)Mockito.any(), (WALEdit)Mockito.any(), Mockito.anyBoolean())).<a name="line.5725"></a>
+<span class="sourceLineNo">5726</span>      thenAnswer(new Answer&lt;Long&gt;() {<a name="line.5726"></a>
+<span class="sourceLineNo">5727</span>        @Override<a name="line.5727"></a>
+<span class="sourceLineNo">5728</span>        public Long answer(InvocationOnMock invocation) throws Throwable {<a name="line.5728"></a>
+<span class="sourceLineNo">5729</span>          WALKeyImpl key = invocation.getArgument(1);<a name="line.5729"></a>
+<span class="sourceLineNo">5730</span>          MultiVersionConcurrencyControl.WriteEntry we = key.getMvcc().begin();<a name="line.5730"></a>
+<span class="sourceLineNo">5731</span>          key.setWriteEntry(we);<a name="line.5731"></a>
+<span class="sourceLineNo">5732</span>          return 1L;<a name="line.5732"></a>
+<span class="sourceLineNo">5733</span>        }<a name="line.5733"></a>
 <span class="sourceLineNo">5734</span><a name="line.5734"></a>
-<span class="sourceLineNo">5735</span>    final ServerName serverName = ServerName.valueOf("testCloseRegionWrittenToWAL", 100, 42);<a name="line.5735"></a>
-<span class="sourceLineNo">5736</span>    final RegionServerServices rss = spy(TEST_UTIL.createMockRegionServerService(serverName));<a name="line.5736"></a>
-<span class="sourceLineNo">5737</span><a name="line.5737"></a>
-<span class="sourceLineNo">5738</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.5738"></a>
-<span class="sourceLineNo">5739</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.5739"></a>
-<span class="sourceLineNo">5740</span>    htd.addFamily(new HColumnDescriptor(fam2));<a name="line.5740"></a>
+<span class="sourceLineNo">5735</span>    });<a name="line.5735"></a>
+<span class="sourceLineNo">5736</span>    return wal;<a name="line.5736"></a>
+<span class="sourceLineNo">5737</span>  }<a name="line.5737"></a>
+<span class="sourceLineNo">5738</span><a name="line.5738"></a>
+<span class="sourceLineNo">5739</span>  @Test<a name="line.5739"></a>
+<span class="sourceLineNo">5740</span>  public void testCloseRegionWrittenToWAL() throws Exception {<a name="line.5740"></a>
 <span class="sourceLineNo">5741</span><a name="line.5741"></a>
-<span class="sourceLineNo">5742</span>    final HRegionInfo hri = new HRegionInfo(htd.getTableName(),<a name="line.5742"></a>
-<span class="sourceLineNo">5743</span>      HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY);<a name="line.5743"></a>
+<span class="sourceLineNo">5742</span>    Path rootDir = new Path(dir + name.getMethodName());<a name="line.5742"></a>
+<span class="sourceLineNo">5743</span>    FSUtils.setRootDir(TEST_UTIL.getConfiguration(), rootDir);<a name="line.5743"></a>
 <span class="sourceLineNo">5744</span><a name="line.5744"></a>
-<span class="sourceLineNo">5745</span>    ArgumentCaptor&lt;WALEdit&gt; editCaptor = ArgumentCaptor.forClass(WALEdit.class);<a name="line.5745"></a>
-<span class="sourceLineNo">5746</span><a name="line.5746"></a>
-<span class="sourceLineNo">5747</span>    // capture append() calls<a name="line.5747"></a>
-<span class="sourceLineNo">5748</span>    WAL wal = mockWAL();<a name="line.5748"></a>
-<span class="sourceLineNo">5749</span>    when(rss.getWAL((HRegionInfo) any())).thenReturn(wal);<a name="line.5749"></a>
-<span class="sourceLineNo">5750</span><a name="line.5750"></a>
+<span class="sourceLineNo">5745</span>    final ServerName serverName = ServerName.valueOf("testCloseRegionWrittenToWAL", 100, 42);<a name="line.5745"></a>
+<span class="sourceLineNo">5746</span>    final RegionServerServices rss = spy(TEST_UTIL.createMockRegionServerService(serverName));<a name="line.5746"></a>
+<span class="sourceLineNo">5747</span><a name="line.5747"></a>
+<span class="sourceLineNo">5748</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.5748"></a>
+<span class="sourceLineNo">5749</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.5749"></a>
+<span class="sourceLineNo">5750</span>    htd.addFamily(new HColumnDescriptor(fam2));<a name="line.5750"></a>
 <span class="sourceLineNo">5751</span><a name="line.5751"></a>
-<span class="sourceLineNo">5752</span>    // create and then open a region first so that it can be closed later<a name="line.5752"></a>
-<span class="sourceLineNo">5753</span>    region = HRegion.createHRegion(hri, rootDir, TEST_UTIL.getConfiguration(), htd, rss.getWAL(hri));<a name="line.5753"></a>
-<span class="sourceLineNo">5754</span>    region = HRegion.openHRegion(hri, htd, rss.getWAL(hri),<a name="line.5754"></a>
-<span class="sourceLineNo">5755</span>      TEST_UTIL.getConfiguration(), rss, null);<a name="line.5755"></a>
+<span class="sourceLineNo">5752</span>    final HRegionInfo hri = new HRegionInfo(htd.getTableName(),<a name="line.5752"></a>
+<span class="sourceLineNo">5753</span>      HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY);<a name="line.5753"></a>
+<span class="sourceLineNo">5754</span><a name="line.5754"></a>
+<span class="sourceLineNo">5755</span>    ArgumentCaptor&lt;WALEdit&gt; editCaptor = ArgumentCaptor.forClass(WALEdit.class);<a name="line.5755"></a>
 <span class="sourceLineNo">5756</span><a name="line.5756"></a>
-<span class="sourceLineNo">5757</span>    // close the region<a name="line.5757"></a>
-<span class="sourceLineNo">5758</span>    region.close(false);<a name="line.5758"></a>
-<span class="sourceLineNo">5759</span><a name="line.5759"></a>
-<span class="sourceLineNo">5760</span>    // 2 times, one for region open, the other close region<a name="line.5760"></a>
-<span class="sourceLineNo">5761</span>    verify(wal, times(2)).append((HRegionInfo)any(), (WALKeyImpl)any(),<a name="line.5761"></a>
-<span class="sourceLineNo">5762</span>      editCaptor.capture(), anyBoolean());<a name="line.5762"></a>
-<span class="sourceLineNo">5763</span><a name="line.5763"></a>
-<span class="sourceLineNo">5764</span>    WALEdit edit = editCaptor.getAllValues().get(1);<a name="line.5764"></a>
-<span class="sourceLineNo">5765</span>    assertNotNull(edit);<a name="line.5765"></a>
-<span class="sourceLineNo">5766</span>    assertNotNull(edit.getCells());<a name="line.5766"></a>
-<span class="sourceLineNo">5767</span>    assertEquals(1, edit.getCells().size());<a name="line.5767"></a>
-<span class="sourceLineNo">5768</span>    RegionEventDescriptor desc = WALEdit.getRegionEventDescriptor(edit.getCells().get(0));<a name="line.5768"></a>
-<span class="sourceLineNo">5769</span>    assertNotNull(desc);<a name="line.5769"></a>
-<span class="sourceLineNo">5770</span><a name="line.5770"></a>
-<span class="sourceLineNo">5771</span>    LOG.info("RegionEventDescriptor from WAL: " + desc);<a name="line.5771"></a>
-<span class="sourceLineNo">5772</span><a name="line.5772"></a>
-<span class="sourceLineNo">5773</span>    assertEquals(RegionEventDescriptor.EventType.REGION_CLOSE, desc.getEventType());<a name="line.5773"></a>
-<span class="sourceLineNo">5774</span>    assertTrue(Bytes.equals(desc.getTableName().toByteArray(), htd.getTableName().toBytes()));<a name="line.5774"></a>
-<span class="sourceLineNo">5775</span>    assertTrue(Bytes.equals(desc.getEncodedRegionName().toByteArray(),<a name="line.5775"></a>
-<span class="sourceLineNo">5776</span>      hri.getEncodedNameAsBytes()));<a name="line.5776"></a>
-<span class="sourceLineNo">5777</span>    assertTrue(desc.getLogSequenceNumber() &gt; 0);<a name="line.5777"></a>
-<span class="sourceLineNo">5778</span>    assertEquals(serverName, ProtobufUtil.toServerName(desc.getServer()));<a name="line.5778"></a>
-<span class="sourceLineNo">5779</span>    assertEquals(2, desc.getStoresCount());<a name="line.5779"></a>
+<span class="sourceLineNo">5757</span>    // capture append() calls<a name="line.5757"></a>
+<span class="sourceLineNo">5758</span>    WAL wal = mockWAL();<a name="line.5758"></a>
+<span class="sourceLineNo">5759</span>    when(rss.getWAL((HRegionInfo) any())).thenReturn(wal);<a name="line.5759"></a>
+<span class="sourceLineNo">5760</span><a name="line.5760"></a>
+<span class="sourceLineNo">5761</span><a name="line.5761"></a>
+<span class="sourceLineNo">5762</span>    // create and then open a region first so that it can be closed later<a name="line.5762"></a>
+<span class="sourceLineNo">5763</span>    region = HRegion.createHRegion(hri, rootDir, TEST_UTIL.getConfiguration(), htd, rss.getWAL(hri));<a name="line.5763"></a>
+<span class="sourceLineNo">5764</span>    region = HRegion.openHRegion(hri, htd, rss.getWAL(hri),<a name="line.5764"></a>
+<span class="sourceLineNo">5765</span>      TEST_UTIL.getConfiguration(), rss, null);<a name="line.5765"></a>
+<span class="sourceLineNo">5766</span><a name="line.5766"></a>
+<span class="sourceLineNo">5767</span>    // close the region<a name="line.5767"></a>
+<span class="sourceLineNo">5768</span>    region.close(false);<a name="line.5768"></a>
+<span class="sourceLineNo">5769</span><a name="line.5769"></a>
+<span class="sourceLineNo">5770</span>    // 2 times, one for region open, the other close region<a name="line.5770"></a>
+<span class="sourceLineNo">5771</span>    verify(wal, times(2)).append((HRegionInfo)any(), (WALKeyImpl)any(),<a name="line.5771"></a>
+<span class="sourceLineNo">5772</span>      editCaptor.capture(), anyBoolean());<a name="line.5772"></a>
+<span class="sourceLineNo">5773</span><a name="line.5773"></a>
+<span class="sourceLineNo">5774</span>    WALEdit edit = editCaptor.getAllValues().get(1);<a name="line.5774"></a>
+<span class="sourceLineNo">5775</span>    assertNotNull(edit);<a name="line.5775"></a>
+<span class="sourceLineNo">5776</span>    assertNotNull(edit.getCells());<a name="line.5776"></a>
+<span class="sourceLineNo">5777</span>    assertEquals(1, edit.getCells().size());<a name="line.5777"></a>
+<span class="sourceLineNo">5778</span>    RegionEventDescriptor desc = WALEdit.getRegionEventDescriptor(edit.getCells().get(0));<a name="line.5778"></a>
+<span class="sourceLineNo">5779</span>    assertNotNull(desc);<a name="line.5779"></a>
 <span class="sourceLineNo">5780</span><a name="line.5780"></a>
-<span class="sourceLineNo">5781</span>    StoreDescriptor store = desc.getStores(0);<a name="line.5781"></a>
-<span class="sourceLineNo">5782</span>    assertTrue(Bytes.equals(store.getFamilyName().toByteArray(), fam1));<a name="line.5782"></a>
-<span class="sourceLineNo">5783</span>    assertEquals(store.getStoreHomeDir(), Bytes.toString(fam1));<a name="line.5783"></a>
-<span class="sourceLineNo">5784</span>    assertEquals(0, store.getStoreFileCount()); // no store files<a name="line.5784"></a>
-<span class="sourceLineNo">5785</span><a name="line.5785"></a>
-<span class="sourceLineNo">5786</span>    store = desc.getStores(1);<a name="line.5786"></a>
-<span class="sourceLineNo">5787</span>    assertTrue(Bytes.equals(store.getFamilyName().toByteArray(), fam2));<a name="line.5787"></a>
-<span class="sourceLineNo">5788</span>    assertEquals(store.getStoreHomeDir(), Bytes.toString(fam2));<a name="line.5788"></a>
-<span class="sourceLineNo">5789</span>    assertEquals(0, store.getStoreFileCount()); // no store files<a name="line.5789"></a>
-<span class="sourceLineNo">5790</span>  }<a name="line.5790"></a>
-<span class="sourceLineNo">5791</span><a name="line.5791"></a>
-<span class="sourceLineNo">5792</span>  /**<a name="line.5792"></a>
-<span class="sourceLineNo">5793</span>   * Test RegionTooBusyException thrown when region is busy<a name="line.5793"></a>
-<span class="sourceLineNo">5794</span>   */<a name="line.5794"></a>
-<span class="sourceLineNo">5795</span>  @Test<a name="line.5795"></a>
-<span class="sourceLineNo">5796</span>  public void testRegionTooBusy() throws IOException {<a name="line.5796"></a>
-<span class="sourceLineNo">5797</span>    byte[] family = Bytes.toBytes("family");<a name="line.5797"></a>
-<span class="sourceLineNo">5798</span>    long defaultBusyWaitDuration = CONF.getLong("hbase.busy.wait.duration",<a name="line.5798"></a>
-<span class="sourceLineNo">5799</span>      HRegion.DEFAULT_BUSY_WAIT_DURATION);<a name="line.5799"></a>
-<span class="sourceLineNo">5800</span>    CONF.setLong("hbase.busy.wait.duration", 1000);<a name="line.5800"></a>
-<span class="sourceLineNo">5801</span>    region = initHRegion(tableName, method, CONF, family);<a name="line.5801"></a>
-<span class="sourceLineNo">5802</span>    final AtomicBoolean stopped = new AtomicBoolean(true);<a name="line.5802"></a>
-<span class="sourceLineNo">5803</span>    Thread t = new Thread(new Runnable() {<a name="line.5803"></a>
-<span class="sourceLineNo">5804</span>      @Override<a name="line.5804"></a>
-<span class="sourceLineNo">5805</span>      public void run() {<a name="line.5805"></a>
-<span class="sourceLineNo">5806</span>        try {<a name="line.5806"></a>
-<span class="sourceLineNo">5807</span>          region.lock.writeLock().lock();<a name="line.5807"></a>
-<span class="sourceLineNo">5808</span>          stopped.set(false);<a name="line.5808"></a>
-<span class="sourceLineNo">5809</span>          while (!stopped.get()) {<a name="line.5809"></a>
-<span class="sourceLineNo">5810</span>            Thread.sleep(100);<a name="line.5810"></a>
-<span class="sourceLineNo">5811</span>          }<a name="line.5811"></a>
-<span class="sourceLineNo">5812</span>        } catch (InterruptedException ie) {<a name="line.5812"></a>
-<span class="sourceLineNo">5813</span>        } finally {<a name="line.5813"></a>
-<span class="sourceLineNo">5814</span>          region.lock.writeLock().unlock();<a name="line.5814"></a>
-<span class="sourceLineNo">5815</span>        }<a name="line.5815"></a>
-<span class="sourceLineNo">5816</span>      }<a name="line.5816"></a>
-<span class="sourceLineNo">5817</span>    });<a name="line.5817"></a>
-<span class="sourceLineNo">5818</span>    t.start();<a name="line.5818"></a>
-<span class="sourceLineNo">5819</span>    Get get = new Get(row);<a name="line.5819"></a>
-<span class="sourceLineNo">5820</span>    try {<a name="line.5820"></a>
-<span class="sourceLineNo">5821</span>      while (stopped.get()) {<a name="line.5821"></a>
-<span class="sourceLineNo">5822</span>        Thread.sleep(100);<a name="line.5822"></a>
-<span class="sourceLineNo">5823</span>      }<a name="line.5823"></a>
-<span class="sourceLineNo">5824</span>      region.get(get);<a name="line.5824"></a>
-<span class="sourceLineNo">5825</span>      fail("Should throw RegionTooBusyException");<a name="line.5825"></a>
-<span class="sourceLineNo">5826</span>    } catch (InterruptedException ie) {<a name="line.5826"></a>
-<span class="sourceLineNo">5827</span>      fail("test interrupted");<a name="line.5827"></a>
-<span class="sourceLineNo">5828</span>    } catch (RegionTooBusyException e) {<a name="line.5828"></a>
-<span class="sourceLineNo">5829</span>      // Good, expected<a name="line.5829"></a>
-<span class="sourceLineNo">5830</span>    } finally {<a name="line.5830"></a>
-<span class="sourceLineNo">5831</span>      stopped.set(true);<a name="line.5831"></a>
-<span class="sourceLineNo">5832</span>      try {<a name="line.5832"></a>
-<span class="sourceLineNo">5833</span>        t.join();<a name="line.5833"></a>
-<span class="sourceLineNo">5834</span>      } catch (Throwable e) {<a name="line.5834"></a>
-<span class="sourceLineNo">5835</span>      }<a name="line.5835"></a>
-<span class="sourceLineNo">5836</span><a name="line.5836"></a>
-<span class="sourceLineNo">5837</span>      HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.5837"></a>
-<span class="sourceLineNo">5838</span>      region = null;<a name="line.5838"></a>
-<span class="sourceLineNo">5839</span>      CONF.setLong("hbase.busy.wait.duration", defaultBusyWaitDuration);<a name="line.5839"></a>
-<span class="sourceLineNo">5840</span>    }<a name="line.5840"></a>
-<span class="sourceLineNo">5841</span>  }<a name="line.5841"></a>
-<span class="sourceLineNo">5842</span><a name="line.5842"></a>
-<span class="sourceLineNo">5843</span>  @Test<a name="line.5843"></a>
-<span class="sourceLineNo">5844</span>  public void testCellTTLs() throws IOException {<a name="line.5844"></a>
-<span class="sourceLineNo">5845</span>    IncrementingEnvironmentEdge edge = new IncrementingEnvironmentEdge();<a name="line.5845"></a>
-<span class="sourceLineNo">5846</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.5846"></a>
-<span class="sourceLineNo">5847</span><a name="line.5847"></a>
-<span class="sourceLineNo">5848</span>    final byte[] row = Bytes.toBytes("testRow");<a name="line.5848"></a>
-<span class="sourceLineNo">5849</span>    final byte[] q1 = Bytes.toBytes("q1");<a name="line.5849"></a>
-<span class="sourceLineNo">5850</span>    final byte[] q2 = Bytes.toBytes("q2");<a name="line.5850"></a>
-<span class="sourceLineNo">5851</span>    final byte[] q3 = Bytes.toBytes("q3");<a name="line.5851"></a>
-<span class="sourceLineNo">5852</span>    final byte[] q4 = Bytes.toBytes("q4");<a name="line.5852"></a>
-<span class="sourceLineNo">5853</span><a name="line.5853"></a>
-<span class="sourceLineNo">5854</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.5854"></a>
-<span class="sourceLineNo">5855</span>    HColumnDescriptor hcd = new HColumnDescriptor(fam1);<a name="line.5855"></a>
-<span class="sourceLineNo">5856</span>    hcd.setTimeToLive(10); // 10 seconds<a name="line.5856"></a>
-<span class="sourceLineNo">5857</span>    htd.addFamily(hcd);<a name="line.5857"></a>
-<span class="sourceLineNo">5858</span><a name="line.5858"></a>
-<span class="sourceLineNo">5859</span>    Configuration conf = new Configuration(TEST_UTIL.getConfiguration());<a name="line.5859"></a>
-<span class="sourceLineNo">5860</span>    conf.setInt(HFile.FORMAT_VERSION_KEY, HFile.MIN_FORMAT_VERSION_WITH_TAGS);<a name="line.5860"></a>
-<span class="sourceLineNo">5861</span><a name="line.5861"></a>
-<span class="sourceLineNo">5862</span>    region = HBaseTestingUtility.createRegionAndWAL(new HRegionInfo(htd.getTableName(),<a name="line.5862"></a>
-<span class="sourceLineNo">5863</span>            HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY),<a name="line.5863"></a>
-<span class="sourceLineNo">5864</span>        TEST_UTIL.getDataTestDir(), conf, htd);<a name="line.5864"></a>
-<span class="sourceLineNo">5865</span>    assertNotNull(region);<a name="line.5865"></a>
-<span class="sourceLineNo">5866</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.5866"></a>
-<span class="sourceLineNo">5867</span>    // Add a cell that will expire in 5 seconds via cell TTL<a name="line.5867"></a>
-<span class="sourceLineNo">5868</span>    region.put(new Put(row).add(new KeyValue(row, fam1, q1, now,<a name="line.5868"></a>
-<span class="sourceLineNo">5869</span>      HConstants.EMPTY_BYTE_ARRAY, new ArrayBackedTag[] {<a name="line.5869"></a>
-<span class="sourceLineNo">5870</span>        // TTL tags specify ts in milliseconds<a name="line.5870"></a>
-<span class="sourceLineNo">5871</span>        new ArrayBackedTag(TagType.TTL_TAG_TYPE, Bytes.toBytes(5000L)) })));<a name="line.5871"></a>
-<span class="sourceLineNo">5872</span>    // Add a cell that will expire after 10 seconds via family setting<a name="line.5872"></a>
-<span class="sourceLineNo">5873</span>    region.put(new Put(row).addColumn(fam1, q2, now, HConstants.EMPTY_BYTE_ARRAY));<a name="line.5873"></a>
-<span class="sourceLineNo">5874</span>    // Add a cell that will expire in 15 seconds via cell TTL<a name="line.5874"></a>
-<span class="sourceLineNo">5875</span>    region.put(new Put(row).add(new KeyValue(row, fam1, q3, now + 10000 - 1,<a name="line.5875"></a>
-<span class="sourceLineNo">5876</span>      HConstants.EMPTY_BYTE_ARRAY, new ArrayBackedTag[] {<a name="line.5876"></a>
-<span class="sourceLineNo">5877</span>        // TTL tags specify ts in milliseconds<a name="line.5877"></a>
-<span class="sourceLineNo">5878</span>        new ArrayBackedTag(TagType.TTL_TAG_TYPE, Bytes.toBytes(5000L)) })));<a name="line.5878"></a>
-<span class="sourceLineNo">5879</span>    // Add a cell that will expire in 20 seconds via family setting<a name="line.5879"></a>
-<span class="sourceLineNo">5880</span>    region.put(new Put(row).addColumn(fam1, q4, now + 10000 - 1, HConstants.EMPTY_BYTE_ARRAY));<a name="line.5880"></a>
-<span class="sourceLineNo">5881</span><a name="line.5881"></a>
-<span class="sourceLineNo">5882</span>    // Flush so we are sure store scanning gets this right<a name="line.5882"></a>
-<span class="sourceLineNo">5883</span>    region.flush(true);<a name="line.5883"></a>
-<span class="sourceLineNo">5884</span><a name="line.5884"></a>
-<span class="sourceLineNo">5885</span>    // A query at time T+0 should return all cells<a name="line.5885"></a>
-<span class="sourceLineNo">5886</span>    Result r = region.get(new Get(row));<a name="line.5886"></a>
-<span class="sourceLineNo">5887</span>    assertNotNull(r.getValue(fam1, q1));<a name="line.5887"></a>
-<span class="sourceLineNo">5888</span>    assertNotNull(r.getValue(fam1, q2));<a name="line.5888"></a>
-<span class="sourceLineNo">5889</span>    assertNotNull(r.getValue(fam1, q3));<a name="line.5889"></a>
-<span class="sourceLineNo">5890</span>    assertNotNull(r.getValue(fam1, q4));<a name="line.5890"></a>
+<span class="sourceLineNo">5781</span>    LOG.info("RegionEventDescriptor from WAL: " + desc);<a name="line.5781"></a>
+<span class="sourceLineNo">5782</span><a name="line.5782"></a>
+<span class="sourceLineNo">5783</span>    assertEquals(RegionEventDescriptor.EventType.REGION_CLOSE, desc.getEventType());<a name="line.5783"></a>
+<span class="sourceLineNo">5784</span>    assertTrue(Bytes.equals(desc.getTableName().toByteArray(), htd.getTableName().toBytes()));<a name="line.5784"></a>
+<span class="sourceLineNo">5785</span>    assertTrue(Bytes.equals(desc.getEncodedRegionName().toByteArray(),<a name="line.5785"></a>
+<span class="sourceLineNo">5786</span>      hri.getEncodedNameAsBytes()));<a name="line.5786"></a>
+<span class="sourceLineNo">5787</span>    assertTrue(desc.getLogSequenceNumber() &gt; 0);<a name="line.5787"></a>
+<span class="sourceLineNo">5788</span>    assertEquals(serverName, ProtobufUtil.toServerName(desc.getServer()));<a name="line.5788"></a>
+<span class="sourceLineNo">5789</span>    assertEquals(2, desc.getStoresCount());<a name="line.5789"></a>
+<span class="sourceLineNo">5790</span><a name="line.5790"></a>
+<span class="sourceLineNo">5791</span>    StoreDescriptor store = desc.getStores(0);<a name="line.5791"></a>
+<span class="sourceLineNo">5792</span>    assertTrue(Bytes.equals(store.getFamilyName().toByteArray(), fam1));<a name="line.5792"></a>
+<span class="sourceLineNo">5793</span>    assertEquals(store.getStoreHomeDir(), Bytes.toString(fam1));<a name="line.5793"></a>
+<span class="sourceLineNo">5794</span>    assertEquals(0, store.getStoreFileCount()); // no store files<a name="line.5794"></a>
+<span class="sourceLineNo">5795</span><a name="line.5795"></a>
+<span class="sourceLineNo">5796</span>    store = desc.getStores(1);<a name="line.5796"></a>
+<span class="sourceLineNo">5797</span>    assertTrue(Bytes.equals(store.getFamilyName().toByteArray(), fam2));<a name="line.5797"></a>
+<span class="sourceLineNo">5798</span>    assertEquals(store.getStoreHomeDir(), Bytes.toString(fam2));<a name="line.5798"></a>
+<span class="sourceLineNo">5799</span>    assertEquals(0, store.getStoreFileCount()); // no store files<a name="line.5799"></a>
+<span class="sourceLineNo">5800</span>  }<a name="line.5800"></a>
+<span class="sourceLineNo">5801</span><a name="line.5801"></a>
+<span class="sourceLineNo">5802</span>  /**<a name="line.5802"></a>
+<span class="sourceLineNo">5803</span>   * Test RegionTooBusyException thrown when region is busy<a name="line.5803"></a>
+<span class="sourceLineNo">5804</span>   */<a name="line.5804"></a>
+<span class="sourceLineNo">5805</span>  @Test<a name="line.5805"></a>
+<span class="sourceLineNo">5806</span>  public void testRegionTooBusy() throws IOException {<a name="line.5806"></a>
+<span class="sourceLineNo">5807</span>    byte[] family = Bytes.toBytes("family");<a name="line.5807"></a>
+<span class="sourceLineNo">5808</span>    long defaultBusyWaitDuration = CONF.getLong("hbase.busy.wait.duration",<a name="line.5808"></a>
+<span class="sourceLineNo">5809</span>      HRegion.DEFAULT_BUSY_WAIT_DURATION);<a name="line.5809"></a>
+<span class="sourceLineNo">5810</span>    CONF.setLong("hbase.busy.wait.duration", 1000);<a name="line.5810"></a>
+<span class="sourceLineNo">5811</span>    region = initHRegion(tableName, method, CONF, family);<a name="line.5811"></a>
+<span class="sourceLineNo">5812</span>    final AtomicBoolean stopped = new AtomicBoolean(true);<a name="line.5812"></a>
+<span class="sourceLineNo">5813</span>    Thread t = new Thread(new Runnable() {<a name="line.5813"></a>
+<span class="sourceLineNo">5814</span>      @Override<a name="line.5814"></a>
+<span class="sourceLineNo">5815</span>      public void run() {<a name="line.5815"></a>
+<span class="sourceLineNo">5816</span>        try {<a name="line.5816"></a>
+<span class="sourceLineNo">5817</span>          region.lock.writeLock().lock();<a name="line.5817"></a>
+<span class="sourceLineNo">5818</span>          stopped.set(false);<a name="line.5818"></a>
+<span class="sourceLineNo">5819</span>          while (!stopped.get()) {<a name="line.5819"></a>
+<span class="sourceLineNo">5820</span>            Thread.sleep(100);<a name="line.5820"></a>
+<span class="sourceLineNo">5821</span>          }<a name="line.5821"></a>
+<span class="sourceLineNo">5822</span>        } catch (InterruptedException ie) {<a name="line.5822"></a>
+<span class="sourceLineNo">5823</span>        } finally {<a name="line.5823"></a>
+<span class="sourceLineNo">5824</span>          region.lock.writeLock().unlock();<a name="line.5824"></a>
+<span class="sourceLineNo">5825</span>        }<a name="line.5825"></a>
+<span class="sourceLineNo">5826</span>      }<a name="line.5826"></a>
+<span class="sourceLineNo">5827</span>    });<a name="line.5827"></a>
+<span class="sourceLineNo">5828</span>    t.start();<a name="line.5828"></a>
+<span class="sourceLineNo">5829</span>    Get get = new Get(row);<a name="line.5829"></a>
+<span class="sourceLineNo">5830</span>    try {<a name="line.5830"></a>
+<span class="sourceLineNo">5831</span>      while (stopped.get()) {<a name="line.5831"></a>
+<span class="sourceLineNo">5832</span>        Thread.sleep(100);<a name="line.5832"></a>
+<span class="sourceLineNo">5833</span>      }<a name="line.5833"></a>
+<span class="sourceLineNo">5834</span>      region.get(get);<a name="line.5834"></a>
+<span class="sourceLineNo">5835</span>      fail("Should throw RegionTooBusyException");<a name="line.5835"></a>
+<span class="sourceLineNo">5836</span>    } catch (InterruptedException ie) {<a name="line.5836"></a>
+<span class="sourceLineNo">5837</span>      fail("test interrupted");<a name="line.5837"></a>
+<span class="sourceLineNo">5838</span>    } catch (RegionTooBusyException e) {<a name="line.5838"></a>
+<span class="sourceLineNo">5839</span>      // Good, expected<a name="line.5839"></a>
+<span class="sourceLineNo">5840</span>    } finally {<a name="line.5840"></a>
+<span class="sourceLineNo">5841</span>      stopped.set(true);<a name="line.5841"></a>
+<span class="sourceLineNo">5842</span>      try {<a name="line.5842"></a>
+<span class="sourceLineNo">5843</span>        t.join();<a name="line.5843"></a>
+<span class="sourceLineNo">5844</span>      } catch (Throwable e) {<a name="line.5844"></a>
+<span class="sourceLineNo">5845</span>      }<a name="line.5845"></a>
+<span class="sourceLineNo">5846</span><a name="line.5846"></a>
+<span class="sourceLineNo">5847</span>      HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.5847"></a>
+<span class="sourceLineNo">5848</span>      region = null;<a name="line.5848"></a>
+<span class="sourceLineNo">5849</span>      CONF.setLong("hbase.busy.wait.duration", defaultBusyWaitDuration);<a name="line.5849"></a>
+<span class="sourceLineNo">5850</span>    }<a name="line.5850"></a>
+<span class="sourceLineNo">5851</span>  }<a name="line.5851"></a>
+<span class="sourceLineNo">5852</span><a name="line.5852"></a>
+<span class="sourceLineNo">5853</span>  @Test<a name="line.5853"></a>
+<span class="sourceLineNo">5854</span>  public void testCellTTLs() throws IOException {<a name="line.5854"></a>
+<span class="sourceLineNo">5855</span>    IncrementingEnvironmentEdge edge = new IncrementingEnvironmentEdge();<a name="line.5855"></a>
+<span class="sourceLineNo">5856</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.5856"></a>
+<span class="sourceLineNo">5857</span><a name="line.5857"></a>
+<span class="sourceLineNo">5858</span>    final byte[] row = Bytes.toBytes("testRow");<a name="line.5858"></a>
+<span class="sourceLineNo">5859</span>    final byte[] q1 = Bytes.toBytes("q1");<a name="line.5859"></a>
+<span class="sourceLineNo">5860</span>    final byte[] q2 = Bytes.toBytes("q2");<a name="line.5860"></a>
+<span class="sourceLineNo">5861</span>    final byte[] q3 = Bytes.toBytes("q3");<a name="line.5861"></a>
+<span class="sourceLineNo">5862</span>    final byte[] q4 = Bytes.toBytes("q4");<a name="line.5862"></a>
+<span class="sourceLineNo">5863</span><a name="line.5863"></a>
+<span class="sourceLineNo">5864</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.5864"></a>
+<span class="sourceLineNo">5865</span>    HColumnDescriptor hcd = new HColumnDescriptor(fam1);<a name="line.5865"></a>
+<span class="sourceLineNo">5866</span>    hcd.setTimeToLive(10); // 10 seconds<a name="line.5866"></a>
+<span class="sourceLineNo">5867</span>    htd.addFamily(hcd);<a name="line.5867"></a>
+<span class="sourceLineNo">5868</span><a name="line.5868"></a>
+<span class="sourceLineNo">5869</span>    Configuration conf = new Configuration(TEST_UTIL.getConfiguration());<a name="line.5869"></a>
+<span class="sourceLineNo">5870</span>    conf.setInt(HFile.FORMAT_VERSION_KEY, HFile.MIN_FORMAT_VERSION_WITH_TAGS);<a name="line.5870"></a>
+<span class="sourceLineNo">5871</span><a name="line.5871"></a>
+<span class="sourceLineNo">5872</span>    region = HBaseTestingUtility.createRegionAndWAL(new HRegionInfo(htd.getTableName(),<a name="line.5872"></a>
+<span class="sourceLineNo">5873</span>            HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY),<a name="line.5873"></a>
+<span class="sourceLineNo">5874</span>        TEST_UTIL.getDataTestDir(), conf, htd);<a name="line.5874"></a>
+<span class="sourceLineNo">5875</span>    assertNotNull(region);<a name="line.5875"></a>
+<span class="sourceLineNo">5876</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.5876"></a>
+<span class="sourceLineNo">5877</span>    // Add a cell that will expire in 5 seconds via cell TTL<a name="line.5877"></a>
+<span class="sourceLineNo">5878</span>    region.put(new Put(row).add(new KeyValue(row, fam1, q1, now,<a name="line.5878"></a>
+<span class="sourceLineNo">5879</span>      HConstants.EMPTY_BYTE_ARRAY, new ArrayBackedTag[] {<a name="line.5879"></a>
+<span class="sourceLineNo">5880</span>        // TTL tags specify ts in milliseconds<a name="line.5880"></a>
+<span class="sourceLineNo">5881</span>        new ArrayBackedTag(TagType.TTL_TAG_TYPE, Bytes.toBytes(5000L)) })));<a name="line.5881"></a>
+<span class="sourceLineNo">5882</span>    // Add a cell that will expire after 10 seconds via family setting<a name="line.5882"></a>
+<span class="sourceLineNo">5883</span>    region.put(new Put(row).addColumn(fam1, q2, now, HConstants.EMPTY_BYTE_ARRAY));<a name="line.5883"></a>
+<span class="sourceLineNo">5884</span>    // Add a cell that will expire in 15 seconds via cell TTL<a name="line.5884"></a>
+<span class="sourceLineNo">5885</span>    region.put(new Put(row).add(new KeyValue(row, fam1, q3, now + 10000 - 1,<a name="line.5885"></a>
+<span class="sourceLineNo">5886</span>      HConstants.EMPTY_BYTE_ARRAY, new ArrayBackedTag[] {<a name="line.5886"></a>
+<span class="sourceLineNo">5887</span>        // TTL tags specify ts in milliseconds<a name="line.5887"></a>
+<span class="sourceLineNo">5888</span>        new ArrayBackedTag(TagType.TTL_TAG_TYPE, Bytes.toBytes(5000L)) })));<a name="line.5888"></a>
+<span class="sourceLineNo">5889</span>    // Add a cell that will expire in 20 seconds via family setting<a name="line.5889"></a>
+<span class="sourceLineNo">5890</span>    region.put(new Put(row).addColumn(fam1, q4, now + 10000 - 1, HConstants.EMPTY_BYTE_ARRAY));<a name="line.5890"></a>
 <span class="sourceLineNo">5891</span><a name="line.5891"></a>
-<span class="sourceLineNo">5892</span>    // Increment time to T+5 seconds<a name="line.5892"></a>
-<span class="sourceLineNo">5893</span>    edge.incrementTime(5000);<a name="line.5893"></a>
+<span class="sourceLineNo">5892</span>    // Flush so we are sure store scanning gets this right<a name="line.5892"></a>
+<span class="sourceLineNo">5893</span>    region.flush(true);<a name="line.5893"></a>
 <span class="sourceLineNo">5894</span><a name="line.5894"></a>
-<span class="sourceLineNo">5895</span>    r = region.get(new Get(row));<a name="line.5895"></a>
-<span class="sourceLineNo">5896</span>    assertNull(r.getValue(fam1, q1));<a name="line.5896"></a>
-<span class="sourceLineNo">5897</span>    assertNotNull(r.getValue(fam1, q2));<a name="line.5897"></a>
-<span class="sourceLineNo">5898</span>    assertNotNull(r.getValue(fam1, q3));<a name="line.5898"></a>
-<span class="sourceLineNo">5899</span>    assertNotNull(r.getValue(fam1, q4));<a name="line.5899"></a>
-<span class="sourceLineNo">5900</span><a name="line.5900"></a>
-<span class="sourceLineNo">5901</span>    // Increment time to T+10 seconds<a name="line.5901"></a>
-<span class="sourceLineNo">5902</span>    edge.incrementTime(5000);<a name="line.5902"></a>
-<span class="sourceLineNo">5903</span><a name="line.5903"></a>
-<span class="sourceLineNo">5904</span>    r = region.get(new Get(row));<a name="line.5904"></a>
-<span class="sourceLineNo">5905</span>    assertNull(r.getValue(fam1, q1));<a name="line.5905"></a>
-<span class="sourceLineNo">5906</span>    assertNull(r.getValue(fam1, q2));<a name="line.5906"></a>
-<span class="sourceLineNo">5907</span>    assertNotNull(r.getValue(fam1, q3));<a name="line.5907"></a>
-<span class="sourceLineNo">5908</span>    assertNotNull(r.getValue(fam1, q4));<a name="line.5908"></a>
-<span class="sourceLineNo">5909</span><a name="line.5909"></a>
-<span class="sourceLineNo">5910</span>    // Increment time to T+15 seconds<a name="line.5910"></a>
-<span class="sourceLineNo">5911</span>    edge.incrementTime(5000);<a name="line.5911"></a>
-<span class="sourceLineNo">5912</span><a name="line.5912"></a>
-<span class="sourceLineNo">5913</span>    r = region.get(new Get(row));<a name="line.5913"></a>
-<span class="sourceLineNo">5914</span>    assertNull(r.getValue(fam1, q1));<a name="line.5914"></a>
-<span class="sourceLineNo">5915</span>    assertNull(r.getValue(fam1, q2));<a name="line.5915"></a>
-<span class="sourceLineNo">5916</span>    assertNull(r.getValue(fam1, q3));<a name="line.5916"></a>
-<span class="sourceLineNo">5917</span>    assertNotNull(r.getValue(fam1, q4));<a name="line.5917"></a>
-<span class="sourceLineNo">5918</span><a name="line.5918"></a>
-<span class="sourceLineNo">5919</span>    // Increment time to T+20 seconds<a name="line.5919"></a>
-<span class="sourceLineNo">5920</span>    edge.incrementTime(10000);<a name="line.5920"></a>
-<span class="sourceLineNo">5921</span><a name="line.5921"></a>
-<span class="sourceLineNo">5922</span>    r = region.get(new Get(row));<a name="line.5922"></a>
-<span class="sourceLineNo">5923</span>    assertNull(r.getValue(fam1, q1));<a name="line.5923"></a>
-<span class="sourceLineNo">5924</span>    assertNull(r.getValue(fam1, q2));<a name="line.5924"></a>
-<span class="sourceLineNo">5925</span>    assertNull(r.getValue(fam1, q3));<a name="line.5925"></a>
-<span class="sourceLineNo">5926</span>    assertNull(r.getValue(fam1, q4));<a name="line.5926"></a>
-<span class="sourceLineNo">5927</span><a name="line.5927"></a>
-<span class="sourceLineNo">5928</span>    // Fun with disappearing increments<a name="line.5928"></a>
-<span class="sourceLineNo">5929</span><a name="line.5929"></a>
-<span class="sourceLineNo">5930</span>    // Start at 1<a name="line.5930"></a>
-<span class="sourceLineNo">5931</span>    region.put(new Put(row).addColumn(fam1, q1, Bytes.toBytes(1L)));<a name="line.5931"></a>
+<span class="sourceLineNo">5895</span>    // A query at time T+0 should return all cells<a name="line.5895"></a>
+<span class="sourceLineNo">5896</span>    Result r = region.get(new Get(row));<a name="line.5896"></a>
+<span class="sourceLineNo">5897</span>    assertNotNull(r.getValue(fam1, q1));<a name="line.5897"></a>
+<span class="sourceLineNo">5898</span>    assertNotNull(r.getValue(fam1, q2));<a name="line.5898"></a>
+<span class="sourceLineNo">5899</span>    assertNotNull(r.getValue(fam1, q3));<a name="line.5899"></a>
+<span class="sourceLineNo">5900</span>    assertNotNull(r.getValue(fam1, q4));<a name="line.5900"></a>
+<span class="sourceLineNo">5901</span><a name="line.5901"></a>
+<span class="sourceLineNo">5902</span>    // Increment time to T+5 seconds<a name="line.5902"></a>
+<span class="sourceLineNo">5903</span>    edge.incrementTime(5000);<a name="line.5903"></a>
+<span class="sourceLineNo">5904</span><a name="line.5904"></a>
+<span class="sourceLineNo">5905</span>    r = region.get(new Get(row));<a name="line.5905"></a>
+<span class="sourceLineNo">5906</span>    assertNull(r.getValue(fam1, q1));<a name="line.5906"></a>
+<span class="sourceLineNo">5907</span>    assertNotNull(r.getValue(fam1, q2));<a name="line.5907"></a>
+<span class="sourceLineNo">5908</span>    assertNotNull(r.getValue(fam1, q3));<a name="line.5908"></a>
+<span class="sourceLineNo">5909</span>    assertNotNull(r.getValue(fam1, q4));<a name="line.5909"></a>
+<span class="sourceLineNo">5910</span><a name="line.5910"></a>
+<span class="sourceLineNo">5911</span>    // Increment time to T+10 seconds<a name="line.5911"></a>
+<span class="sourceLineNo">5912</span>    edge.incrementTime(5000);<a name="line.5912"></a>
+<span class="sourceLineNo">5913</span><a name="line.5913"></a>
+<span class="sourceLineNo">5914</span>    r = region.get(new Get(row));<a name="line.5914"></a>
+<span class="sourceLineNo">5915</span>    assertNull(r.getValue(fam1, q1));<a name="line.5915"></a>
+<span class="sourceLineNo">5916</span>    assertNull(r.getValue(fam1, q2));<a name="line.5916"></a>
+<span class="sourceLineNo">5917</span>    assertNotNull(r.getValue(fam1, q3));<a name="line.5917"></a>
+<span class="sourceLineNo">5918</span>    assertNotNull(r.getValue(fam1, q4));<a name="line.5918"></a>
+<span class="sourceLineNo">5919</span><a name="line.5919"></a>
+<span class="sourceLineNo">5920</span>    // Increment time to T+15 seconds<a name="line.5920"></a>
+<span class="sourceLineNo">5921</span>    edge.incrementTime(5000);<a name="line.5921"></a>
+<span class="sourceLineNo">5922</span><a name="line.5922"></a>
+<span class="sourceLineNo">5923</span>    r = region.get(new Get(row));<a name="line.5923"></a>
+<span class="sourceLineNo">5924</span>    assertNull(r.getValue(fam1, q1));<a name="line.5924"></a>
+<span class="sourceLineNo">5925</span>    assertNull(r.getValue(fam1, q2));<a name="line.5925"></a>
+<span class="sourceLineNo">5926</span>    assertNull(r.getValue(fam1, q3));<a name="line.5926"></a>
+<span class="sourceLineNo">5927</span>    assertNotNull(r.getValue(fam1, q4));<a name="line.5927"></a>
+<span class="sourceLineNo">5928</span><a name="line.5928"></a>
+<span class="sourceLineNo">5929</span>    // Increment time to T+20 seconds<a name="line.5929"></a>
+<span class="sourceLineNo">5930</span>    edge.incrementTime(10000);<a name="line.5930"></a>
+<span class="sourceLineNo">5931</span><a name="line.5931"></a>
 <span class="sourceLineNo">5932</span>    r = region.get(new Get(row));<a name="line.5932"></a>
-<span class="sourceLineNo">5933</span>    byte[] val = r.getValue(fam1, q1);<a name="line.5933"></a>
-<span class="sourceLineNo">5934</span>    assertNotNull(val);<a name="line.5934"></a>
-<span class="sourceLineNo">5935</span>    assertEquals(1L, Bytes.toLong(val));<a name="line.5935"></a>
-<span class="sourceLineNo">5936</span><a name="line.5936"></a>
-<span class="sourceLineNo">5937</span>    // Increment with a TTL of 5 seconds<a name="line.5937"></a>
-<span class="sourceLineNo">5938</span>    Increment incr = new Increment(row).addColumn(fam1, q1, 1L);<a name="line.5938"></a>
-<span class="sourceLineNo">5939</span>    incr.setTTL(5000);<a name="line.5939"></a>
-<span class="sourceLineNo">5940</span>    region.increment(incr); // 2<a name="line.5940"></a>
-<span class="sourceLineNo">5941</span><a name="line.5941"></a>
-<span class="sourceLineNo">5942</span>    // New value should be 2<a name="line.5942"></a>
-<span class="sourceLineNo">5943</span>    r = region.get(new Get(row));<a name="line.5943"></a>
-<span class="sourceLineNo">5944</span>    val = r.getValue(fam1, q1);<a name="line.5944"></a>
-<span class="sourceLineNo">5945</span>    assertNotNull(val);<a name="line.5945"></a>
-<span class="sourceLineNo">5946</span>    assertEquals(2L, Bytes.toLong(val));<a name="line.5946"></a>
-<span class="sourceLineNo">5947</span><a name="line.5947"></a>
-<span class="sourceLineNo">5948</span>    // Increment time to T+25 seconds<a name="line.5948"></a>
-<span class="sourceLineNo">5949</span>    edge.incrementTime(5000);<a name="line.5949"></a>
-<span class="sourceLineNo">5950</span><a name="line.5950"></a>
-<span class="sourceLineNo">5951</span>    // Value should be back to 1<a name="line.5951"></a>
-<span class="sourceLineNo">5952</span>    r = region.get(new Get(row));<a name="line.5952"></a>
-<span class="sourceLineNo">5953</span>    val = r.getValue(fam1, q1);<a name="line.5953"></a>
-<span class="sourceLineNo">5954</span>    assertNotNull(val);<a name="line.5954"></a>
-<span class="sourceLineNo">5955</span>    assertEquals(1L, Bytes.toLong(val));<a name="line.5955"></a>
-<span class="sourceLineNo">5956</span><a name="line.5956"></a>
-<span class="sourceLineNo">5957</span>    // Increment time to T+30 seconds<a name="line.5957"></a>
-<span class="sourceLineNo">5958</span>    edge.incrementTime(5000);<a name="line.5958"></a>
-<span class="sourceLineNo">5959</span><a name="line.5959"></a>
-<span class="sourceLineNo">5960</span>    // Original value written at T+20 should be gone now via family TTL<a name="line.5960"></a>
-<span class="sourceLineNo">5961</span>    r = region.get(new Get(row));<a name="line.5961"></a>
-<span class="sourceLineNo">5962</span>    assertNull(r.getValue(fam1, q1));<a name="line.5962"></a>
-<span class="sourceLineNo">5963</span>  }<a name="line.5963"></a>
-<span class="sourceLineNo">5964</span><a name="line.5964"></a>
-<span class="sourceLineNo">5965</span>  @Test<a name="line.5965"></a>
-<span class="sourceLineNo">5966</span>  public void testIncrementTimestampsAreMonotonic() throws IOException {<a name="line.5966"></a>
-<span class="sourceLineNo">5967</span>    region = initHRegion(tableName, method, CONF, fam1);<a name="line.5967"></a>
-<span class="sourceLineNo">5968</span>    ManualEnvironmentEdge edge = new ManualEnvironmentEdge();<a name="line.5968"></a>
-<span class="sourceLineNo">5969</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.5969"></a>
-<span class="sourceLineNo">5970</span><a name="line.5970"></a>
-<span class="sourceLineNo">5971</span>    edge.setValue(10);<a name="line.5971"></a>
-<span class="sourceLineNo">5972</span>    Increment inc = new Increment(row);<a name="line.5972"></a>
-<span class="sourceLineNo">5973</span>    inc.setDurability(Durability.SKIP_WAL);<a name="line.5973"></a>
-<span class="sourceLineNo">5974</span>    inc.addColumn(fam1, qual1, 1L);<a name="line.5974"></a>
-<span class="sourceLineNo">5975</span>    region.increment(inc);<a name="line.5975"></a>
-<span class="sourceLineNo">5976</span><a name="line.5976"></a>
-<span class="sourceLineNo">5977</span>    Result result = region.get(new Get(row));<a name="line.5977"></a>
-<span class="sourceLineNo">5978</span>    Cell c = result.getColumnLatestCell(fam1, qual1);<a name="line.5978"></a>
-<span class="sourceLineNo">5979</span>    assertNotNull(c);<a name="line.5979"></a>
-<span class="sourceLineNo">5980</span>    assertEquals(10L, c.getTimestamp());<a name="line.5980"></a>
-<span class="sourceLineNo">5981</span><a name="line.5981"></a>
-<span class="sourceLineNo">5982</span>    edge.setValue(1); // clock goes back<a name="line.5982"></a>
-<span class="sourceLineNo">5983</span>    region.increment(inc);<a name="line.5983"></a>
-<span class="sourceLineNo">5984</span>    result = region.get(new Get(row));<a name="line.5984"></a>
-<span class="sourceLineNo">5985</span>    c = result.getColumnLatestCell(fam1, qual1);<a name="line.5985"></a>
-<span class="sourceLineNo">5986</span>    assertEquals(11L, c.getTimestamp());<a name="line.5986"></a>
-<span class="sourceLineNo">5987</span>    assertEquals(2L, Bytes.toLong(c.getValueArray(), c.getValueOffset(), c.getValueLength()));<a name="line.5987"></a>
-<span class="sourceLineNo">5988</span>  }<a name="line.5988"></a>
-<span class="sourceLineNo">5989</span><a name="line.5989"></a>
-<span class="sourceLineNo">5990</span>  @Test<a name="line.5990"></a>
-<span class="sourceLineNo">5991</span>  public void testAppendTimestampsAreMonotonic() throws IOException {<a name="line.5991"></a>
-<span class="sourceLineNo">5992</span>    region = initHRegion(tableName, method, CONF, fam1);<a name="line.5992"></a>
-<span class="sourceLineNo">5993</span>    ManualEnvironmentEdge edge = new ManualEnvironmentEdge();<a name="line.5993"></a>
-<span class="sourceLineNo">5994</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.5994"></a>
-<span class="sourceLineNo">5995</span><a name="line.5995"></a>
-<span class="sourceLineNo">5996</span>    edge.setValue(10);<a name="line.5996"></a>
-<span class="sourceLineNo">5997</span>    Append a = new Append(row);<a name="line.5997"></a>
-<span class="sourceLineNo">5998</span>    a.setDurability(Durability.SKIP_WAL);<a name="line.5998"></a>
-<span class="sourceLineNo">5999</span>    a.addColumn(fam1, qual1, qual1);<a name="line.5999"></a>
-<span class="sourceLineNo">6000</span>    region.append(a);<a name="line.6000"></a>
-<span class="sourceLineNo">6001</span><a name="line.6001"></a>
-<span class="sourceLineNo">6002</span>    Result result = region.get(new Get(row));<a name="line.6002"></a>
-<span class="sourceLineNo">6003</span>    Cell c = result.getColumnLatestCell(fam1, qual1);<a name="line.6003"></a>
-<span class="sourceLineNo">6004</span>    assertNotNull(c);<a name="line.6004"></a>
-<span class="sourceLineNo">6005</span>    assertEquals(10L, c.getTimestamp());<a name="line.6005"></a>
-<span class="sourceLineNo">6006</span><a name="line.6006"></a>
-<span class="sourceLineNo">6007</span>    edge.setValue(1); // clock goes back<a name="line.6007"></a>
-<span class="sourceLineNo">6008</span>    region.append(a);<a name="line.6008"></a>
-<span class="sourceLineNo">6009</span>    result = region.get(new Get(row));<a name="line.6009"></a>
-<span class="sourceLineNo">6010</span>    c = result.getColumnLatestCell(fam1, qual1);<a name="line.6010"></a>
-<span class="sourceLineNo">6011</span>    assertEquals(11L, c.getTimestamp());<a name="line.6011"></a>
-<span class="sourceLineNo">6012</span><a name="line.6012"></a>
-<span class="sourceLineNo">6013</span>    byte[] expected = new byte[qual1.length*2];<a name="line.6013"></a>
-<span class="sourceLineNo">6014</span>    System.arraycopy(qual1, 0, expected, 0, qual1.length);<a name="line.6014"></a>
-<span class="sourceLineNo">6015</span>    System.arraycopy(qual1, 0, expected, qual1.length, qual1.length);<a name="line.6015"></a>
+<span class="sourceLineNo">5933</span>    assertNull(r.getValue(fam1, q1));<a name="line.5933"></a>
+<span class="sourceLineNo">5934</span>    assertNull(r.getValue(fam1, q2));<a name="line.5934"></a>
+<span class="sourceLineNo">5935</span>    assertNull(r.getValue(fam1, q3));<a name="line.5935"></a>
+<span class="sourceLineNo">5936</span>    assertNull(r.getValue(fam1, q4));<a name="line.5936"></a>
+<span class="sourceLineNo">5937</span><a name="line.5937"></a>
+<span class="sourceLineNo">5938</span>    // Fun with disappearing increments<a name="line.5938"></a>
+<span class="sourceLineNo">5939</span><a name="line.5939"></a>
+<span class="sourceLineNo">5940</span>    // Start at 1<a name="line.5940"></a>
+<span class="sourceLineNo">5941</span>    region.put(new Put(row).addColumn(fam1, q1, Bytes.toBytes(1L)));<a name="line.5941"></a>
+<span class="sourceLineNo">5942</span>    r = region.get(new Get(row));<a name="line.5942"></a>
+<span class="sourceLineNo">5943</span>    byte[] val = r.getValue(fam1, q1);<a name="line.5943"></a>
+<span class="sourceLineNo">5944</span>    assertNotNull(val);<a name="line.5944"></a>
+<span class="sourceLineNo">5945</span>    assertEquals(1L, Bytes.toLong(val));<a name="line.5945"></a>
+<span class="sourceLineNo">5946</span><a name="line.5946"></a>
+<span class="sourceLineNo">5947</span>    // Increment with a TTL of 5 seconds<a name="line.5947"></a>
+<span class="sourceLineNo">5948</span>    Increment incr = new Increment(row).addColumn(fam1, q1, 1L);<a name="line.5948"></a>
+<span class="sourceLineNo">5949</span>    incr.setTTL(5000);<a name="line.5949"></a>
+<span class="sourceLineNo">5950</span>    region.increment(incr); // 2<a name="line.5950"></a>
+<span class="sourceLineNo">5951</span><a name="line.5951"></a>
+<span class="sourceLineNo">5952</span>    // New value should be 2<a name="line.5952"></a>
+<span class="sourceLineNo">5953</span>    r = region.get(new Get(row));<a name="line.5953"></a>
+<span class="sourceLineNo">5954</span>    val = r.getValue(fam1, q1);<a name="line.5954"></a>
+<span class="sourceLineNo">5955</span>    assertNotNull(val);<a name="line.5955"></a>
+<span class="sourceLineNo">5956</span>    assertEquals(2L, Bytes.toLong(val));<a name="line.5956"></a>
+<span class="sourceLineNo">5957</span><a name="line.5957"></a>
+<span class="sourceLineNo">5958</span>    // Increment time to T+25 seconds<a name="line.5958"></a>
+<span class="sourceLineNo">5959</span>    edge.incrementTime(5000);<a name="line.5959"></a>
+<span class="sourceLineNo">5960</span><a name="line.5960"></a>
+<span class="sourceLineNo">5961</span>    // Value should be back to 1<a name="line.5961"></a>
+<span class="sourceLineNo">5962</span>    r = region.get(new Get(row));<a name="line.5962"></a>
+<span class="sourceLineNo">5963</span>    val = r.getValue(fam1, q1);<a name="line.5963"></a>
+<span class="sourceLineNo">5964</span>    assertNotNull(val);<a name="line.5964"></a>
+<span class="sourceLineNo">5965</span>    assertEquals(1L, Bytes.toLong(val));<a name="line.5965"></a>
+<span class="sourceLineNo">5966</span><a name="line.5966"></a>
+<span class="sourceLineNo">5967</span>    // Increment time to T+30 seconds<a name="line.5967"></a>
+<span class="sourceLineNo">5968</span>    edge.incrementTime(5000);<a name="line.5968"></a>
+<span class="sourceLineNo">5969</span><a name="line.5969"></a>
+<span class="sourceLineNo">5970</span>    // Original value written at T+20 should be gone now via family TTL<a name="line.5970"></a>
+<span class="sourceLineNo">5971</span>    r = region.get(new Get(row));<a name="line.5971"></a>
+<span class="sourceLineNo">5972</span>    assertNull(r.getValue(fam1, q1));<a name="line.5972"></a>
+<span class="sourceLineNo">5973</span>  }<a name="line.5973"></a>
+<span class="sourceLineNo">5974</span><a name="line.5974"></a>
+<span class="sourceLineNo">5975</span>  @Test<a name="line.5975"></a>
+<span class="sourceLineNo">5976</span>  public void testIncrementTimestampsAreMonotonic() throws IOException {<a name="line.5976"></a>
+<span class="sourceLineNo">5977</span>    region = initHRegion(tableName, method, CONF, fam1);<a name="line.5977"></a>
+<span class="sourceLineNo">5978</span>    ManualEnvironmentEdge edge = new ManualEnvironmentEdge();<a name="line.5978"></a>
+<span class="sourceLineNo">5979</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.5979"></a>
+<span class="sourceLineNo">5980</span><a name="line.5980"></a>
+<span class="sourceLineNo">5981</span>    edge.setValue(10);<a name="line.5981"></a>
+<span class="sourceLineNo">5982</span>    Increment inc = new Increment(row);<a name="line.5982"></a>
+<span class="sourceLineNo">5983</span>    inc.setDurability(Durability.SKIP_WAL);<a name="line.5983"></a>
+<span class="sourceLineNo">5984</span>    inc.addColumn(fam1, qual1, 1L);<a name="line.5984"></a>
+<span class="sourceLineNo">5985</span>    region.increment(inc);<a name="line.5985"></a>
+<span class="sourceLineNo">5986</span><a name="line.5986"></a>
+<span class="sourceLineNo">5987</span>    Result result = region.get(new Get(row));<a name="line.5987"></a>
+<span class="sourceLineNo">5988</span>    Cell c = result.getColumnLatestCell(fam1, qual1);<a name="line.5988"></a>
+<span class="sourceLineNo">5989</span>    assertNotNull(c);<a name="line.5989"></a>
+<span class="sourceLineNo">5990</span>    assertEquals(10L, c.getTimestamp());<a name="line.5990"></a>
+<span class="sourceLineNo">5991</span><a name="line.5991"></a>
+<span class="sourceLineNo">5992</span>    edge.setValue(1); // clock goes back<a name="line.5992"></a>
+<span class="sourceLineNo">5993</span>    region.increment(inc);<a name="line.5993"></a>
+<span class="sourceLineNo">5994</span>    result = region.get(new Get(row));<a name="line.5994"></a>
+<span class="sourceLineNo">5995</span>    c = result.getColumnLatestCell(fam1, qual1);<a name="line.5995"></a>
+<span class="sourceLineNo">5996</span>    assertEquals(11L, c.getTimestamp());<a name="line.5996"></a>
+<span class="sourceLineNo">5997</span>    assertEquals(2L, Bytes.toLong(c.getValueArray(), c.getValueOffset(), c.getValueLength()));<a name="line.5997"></a>
+<span class="sourceLineNo">5998</span>  }<a name="line.5998"></a>
+<span class="sourceLineNo">5999</span><a name="line.5999"></a>
+<span class="sourceLineNo">6000</span>  @Test<a name="line.6000"></a>
+<span class="sourceLineNo">6001</span>  public void testAppendTimestampsAreMonotonic() throws IOException {<a name="line.6001"></a>
+<span class="sourceLineNo">6002</span>    region = initHRegion(tableName, method, CONF, fam1);<a name="line.6002"></a>
+<span class="sourceLineNo">6003</span>    ManualEnvironmentEdge edge = new ManualEnvironmentEdge();<a name="line.6003"></a>
+<span class="sourceLineNo">6004</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.6004"></a>
+<span class="sourceLineNo">6005</span><a name="line.6005"></a>
+<span class="sourceLineNo">6006</span>    edge.setValue(10);<a name="line.6006"></a>
+<span class="sourceLineNo">6007</span>    Append a = new Append(row);<a name="line.6007"></a>
+<span class="sourceLineNo">6008</span>    a.setDurability(Durability.SKIP_WAL);<a name="line.6008"></a>
+<span class="sourceLineNo">6009</span>    a.addColumn(fam1, qual1, qual1);<a name="line.6009"></a>
+<span class="sourceLineNo">6010</span>    region.append(a);<a name="line.6010"></a>
+<span class="sourceLineNo">6011</span><a name="line.6011"></a>
+<span class="sourceLineNo">6012</span>    Result result = region.get(new Get(row));<a name="line.6012"></a>
+<span class="sourceLineNo">6013</span>    Cell c = result.getColumnLatestCell(fam1, qual1);<a name="line.6013"></a>
+<span class="sourceLineNo">6014</span>    assertNotNull(c);<a name="line.6014"></a>
+<span class="sourceLineNo">6015</span>    assertEquals(10L, c.getTimestamp());<a name="line.6015"></a>
 <span class="sourceLineNo">6016</span><a name="line.6016"></a>
-<span class="sourceLineNo">6017</span>    assertTrue(Bytes.equals(c.getValueArray(), c.getValueOffset(), c.getValueLength(),<a name="line.6017"></a>
-<span class="sourceLineNo">6018</span>      expected, 0, expected.length));<a name="line.6018"></a>
-<span class="sourceLineNo">6019</span>  }<a name="line.6019"></a>
-<span class="sourceLineNo">6020</span><a name="line.6020"></a>
-<span class="sourceLineNo">6021</span>  @Test<a name="line.6021"></a>
-<span class="sourceLineNo">6022</span>  public void testCheckAndMutateTimestampsAreMonotonic() throws IOException {<a name="line.6022"></a>
-<span class="sourceLineNo">6023</span>    region = initHRegion(tableName, method, CONF, fam1);<a name="line.6023"></a>
-<span class="sourceLineNo">6024</span>    ManualEnvironmentEdge edge = new ManualEnvironmentEdge();<a name="line.6024"></a>
-<span class="sourceLineNo">6025</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.6025"></a>
+<span class="sourceLineNo">6017</span>    edge.setValue(1); // clock goes back<a name="line.6017"></a>
+<span class="sourceLineNo">6018</span>    region.append(a);<a name="line.6018"></a>
+<span class="sourceLineNo">6019</span>    result = region.get(new Get(row));<a name="line.6019"></a>
+<span class="sourceLineNo">6020</span>    c = result.getColumnLatestCell(fam1, qual1);<a name="line.6020"></a>
+<span class="sourceLineNo">6021</span>    assertEquals(11L, c.getTimestamp());<a name="line.6021"></a>
+<span class="sourceLineNo">6022</span><a name="line.6022"></a>
+<span class="sourceLineNo">6023</span>    byte[] expected = new byte[qual1.length*2];<a name="line.6023"></a>
+<span class="sourceLineNo">6024</span>    System.arraycopy(qual1, 0, expected, 0, qual1.length);<a name="line.6024"></a>
+<span class="sourceLineNo">6025</span>    System.arraycopy(qual1, 0, expected, qual1.length, qual1.length);<a name="line.6025"></a>
 <span class="sourceLineNo">6026</span><a name="line.6026"></a>
-<span class="sourceLineNo">6027</span>    edge.setValue(10);<a name="line.6027"></a>
-<span class="sourceLineNo">6028</span>    Put p = new Put(row);<a name="line.6028"></a>
-<span class="sourceLineNo">6029</span>    p.setDurability(Durability.SKIP_WAL);<a name="line.6029"></a>
-<span class="sourceLineNo">6030</span>    p.addColumn(fam1, qual1, qual1);<a name="line.6030"></a>
-<span class="sourceLineNo">6031</span>    region.put(p);<a name="line.6031"></a>
-<span class="sourceLineNo">6032</span><a name="line.6032"></a>
-<span class="sourceLineNo">6033</span>    Result result = region.get(new Get(row));<a name="line.6033"></a>
-<span class="sourceLineNo">6034</span>    Cell c = result.getColumnLatestCell(fam1, qual1);<a name="line.6034"></a>
-<span class="sourceLineNo">6035</span>    assertNotNull(c);<a name="line.6035"></a>
-<span class="sourceLineNo">6036</span>    assertEquals(10L, c.getTimestamp());<a name="line.6036"></a>
-<span class="sourceLineNo">6037</span><a name="line.6037"></a>
-<span class="sourceLineNo">6038</span>    edge.setValue(1); // clock goes back<a name="line.6038"></a>
-<span class="sourceLineNo">6039</span>    p = new Put(row);<a name="line.6039"></a>
-<span class="sourceLineNo">6040</span>    p.setDurability(Durability.SKIP_WAL);<a name="line.6040"></a>
-<span class="sourceLineNo">6041</span>    p.addColumn(fam1, qual1, qual2);<a name="line.6041"></a>
-<span class="sourceLineNo">6042</span>    region.checkAndMutate(row, fam1, qual1, CompareOperator.EQUAL, new BinaryComparator(qual1), p);<a name="line.6042"></a>
-<span class="sourceLineNo">6043</span>    result = region.get(new Get(row));<a name="line.6043"></a>
-<span class="sourceLineNo">6044</span>    c = result.getColumnLatestCell(fam1, qual1);<a name="line.6044"></a>
-<span class="sourceLineNo">6045</span>    assertEquals(10L, c.getTimestamp());<a name="line.6045"></a>
-<span class="sourceLineNo">6046</span><a name="line.6046"></a>
-<span class="sourceLineNo">6047</span>    assertTrue(Bytes.equals(c.getValueArray(), c.getValueOffset(), c.getValueLength(),<a name="line.6047"></a>
-<span class="sourceLineNo">6048</span>      qual2, 0, qual2.length));<a name="line.6048"></a>
-<span class="sourceLineNo">6049</span>  }<a name="line.6049"></a>
-<span class="sourceLineNo">6050</span><a name="line.6050"></a>
-<span class="sourceLineNo">6051</span>  @Test<a name="line.6051"></a>
-<span class="sourceLineNo">6052</span>  public void testBatchMutateWithWrongRegionException() throws Exception {<a name="line.6052"></a>
-<span class="sourceLineNo">6053</span>    final byte[] a = Bytes.toBytes("a");<a name="line.6053"></a>
-<span class="sourceLineNo">6054</span>    final byte[] b = Bytes.toBytes("b");<a name="line.6054"></a>
-<span class="sourceLineNo">6055</span>    final byte[] c = Bytes.toBytes("c"); // exclusive<a name="line.6055"></a>
+<span class="sourceLineNo">6027</span>    assertTrue(Bytes.equals(c.getValueArray(), c.getValueOffset(), c.getValueLength(),<a name="line.6027"></a>
+<span class="sourceLineNo">6028</span>      expected, 0, expected.length));<a name="line.6028"></a>
+<span class="sourceLineNo">6029</span>  }<a name="line.6029"></a>
+<span class="sourceLineNo">6030</span><a name="line.6030"></a>
+<span class="sourceLineNo">6031</span>  @Test<a name="line.6031"></a>
+<span class="sourceLineNo">6032</span>  public void testCheckAndMutateTimestampsAreMonotonic() throws IOException {<a name="line.6032"></a>
+<span class="sourceLineNo">6033</span>    region = initHRegion(tableName, method, CONF, fam1);<a name="line.6033"></a>
+<span class="sourceLineNo">6034</span>    ManualEnvironmentEdge edge = new ManualEnvironmentEdge();<a name="line.6034"></a>
+<span class="sourceLineNo">6035</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.6035"></a>
+<span class="sourceLineNo">6036</span><a name="line.6036"></a>
+<span class="sourceLineNo">6037</span>    edge.setValue(10);<a name="line.6037"></a>
+<span class="sourceLineNo">6038</span>    Put p = new Put(row);<a name="line.6038"></a>
+<span class="sourceLineNo">6039</span>    p.setDurability(Durability.SKIP_WAL);<a name="line.6039"></a>
+<span class="sourceLineNo">6040</span>    p.addColumn(fam1, qual1, qual1);<a name="line.6040"></a>
+<span class="sourceLineNo">6041</span>    region.put(p);<a name="line.6041"></a>
+<span class="sourceLineNo">6042</span><a name="line.6042"></a>
+<span class="sourceLineNo">6043</span>    Result result = region.get(new Get(row));<a name="line.6043"></a>
+<span class="sourceLineNo">6044</span>    Cell c = result.getColumnLatestCell(fam1, qual1);<a name="line.6044"></a>
+<span class="sourceLineNo">6045</span>    assertNotNull(c);<a name="line.6045"></a>
+<span class="sourceLineNo">6046</span>    assertEquals(10L, c.getTimestamp());<a name="line.6046"></a>
+<span class="sourceLineNo">6047</span><a name="line.6047"></a>
+<span class="sourceLineNo">6048</span>    edge.setValue(1); // clock goes back<a name="line.6048"></a>
+<span class="sourceLineNo">6049</span>    p = new Put(row);<a name="line.6049"></a>
+<span class="sourceLineNo">6050</span>    p.setDurability(Durability.SKIP_WAL);<a name="line.6050"></a>
+<span class="sourceLineNo">6051</span>    p.addColumn(fam1, qual1, qual2);<a name="line.6051"></a>
+<span class="sourceLineNo">6052</span>    region.checkAndMutate(row, fam1, qual1, CompareOperator.EQUAL, new BinaryComparator(qual1), p);<a name="line.6052"></a>
+<span class="sourceLineNo">6053</span>    result = region.get(new Get(row));<a name="line.6053"></a>
+<span class="sourceLineNo">6054</span>    c = result.getColumnLatestCell(fam1, qual1);<a name="line.6054"></a>
+<span class="sourceLineNo">6055</span>    assertEquals(10L, c.getTimestamp());<a name="line.6055"></a>
 <span class="sourceLineNo">6056</span><a name="line.6056"></a>
-<span class="sourceLineNo">6057</span>    int prevLockTimeout = CONF.getInt("hbase.rowlock.wait.duration", 30000);<a name="line.6057"></a>
-<span class="sourceLineNo">6058</span>    CONF.setInt("hbase.rowlock.wait.duration", 1000);<a name="line.6058"></a>
-<span class="sourceLineNo">6059</span>    region = initHRegion(tableName, a, c, method, CONF, false, fam1);<a name="line.6059"></a>
+<span class="sourceLineNo">6057</span>    assertTrue(Bytes.equals(c.getValueArray(), c.getValueOffset(), c.getValueLength(),<a name="line.6057"></a>
+<span class="sourceLineNo">6058</span>      qual2, 0, qual2.length));<a name="line.6058"></a>
+<span class="sourceLineNo">6059</span>  }<a name="line.6059"></a>
 <span class="sourceLineNo">6060</span><a name="line.6060"></a>
-<span class="sourceLineNo">6061</span>    Mutation[] mutations = new Mutation[] {<a name="line.6061"></a>
-<span class="sourceLineNo">6062</span>        new Put(a)<a name="line.6062"></a>
-<span class="sourceLineNo">6063</span>            .add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6063"></a>
-<span class="sourceLineNo">6064</span>              .setRow(a)<a name="line.6064"></a>
-<span class="sourceLineNo">6065</span>              .setFamily(fam1)<a name="line.6065"></a>
-<span class="sourceLineNo">6066</span>              .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6066"></a>
-<span class="sourceLineNo">6067</span>              .setType(Cell.Type.Put)<a name="line.6067"></a>
-<span class="sourceLineNo">6068</span>              .build()),<a name="line.6068"></a>
-<span class="sourceLineNo">6069</span>        // this is outside the region boundary<a name="line.6069"></a>
-<span class="sourceLineNo">6070</span>        new Put(c).add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6070"></a>
-<span class="sourceLineNo">6071</span>              .setRow(c)<a name="line.6071"></a>
-<span class="sourceLineNo">6072</span>              .setFamily(fam1)<a name="line.6072"></a>
-<span class="sourceLineNo">6073</span>              .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6073"></a>
-<span class="sourceLineNo">6074</span>              .setType(Type.Put)<a name="line.6074"></a>
-<span class="sourceLineNo">6075</span>              .build()),<a name="line.6075"></a>
-<span class="sourceLineNo">6076</span>        new Put(b).add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6076"></a>
-<span class="sourceLineNo">6077</span>              .setRow(b)<a name="line.6077"></a>
-<span class="sourceLineNo">6078</span>              .setFamily(fam1)<a name="line.6078"></a>
-<span class="sourceLineNo">6079</span>              .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6079"></a>
-<span class="sourceLineNo">6080</span>              .setType(Cell.Type.Put)<a name="line.6080"></a>
-<span class="sourceLineNo">6081</span>              .build())<a name="line.6081"></a>
-<span class="sourceLineNo">6082</span>    };<a name="line.6082"></a>
-<span class="sourceLineNo">6083</span><a name="line.6083"></a>
-<span class="sourceLineNo">6084</span>    OperationStatus[] status = region.batchMutate(mutations);<a name="line.6084"></a>
-<span class="sourceLineNo">6085</span>    assertEquals(OperationStatusCode.SUCCESS, status[0].getOperationStatusCode());<a name="line.6085"></a>
-<span class="sourceLineNo">6086</span>    assertEquals(OperationStatusCode.SANITY_CHECK_FAILURE, status[1].getOperationStatusCode());<a name="line.6086"></a>
-<span class="sourceLineNo">6087</span>    assertEquals(OperationStatusCode.SUCCESS, status[2].getOperationStatusCode());<a name="line.6087"></a>
-<span class="sourceLineNo">6088</span><a name="line.6088"></a>
-<span class="sourceLineNo">6089</span><a name="line.6089"></a>
-<span class="sourceLineNo">6090</span>    // test with a row lock held for a long time<a name="line.6090"></a>
-<span class="sourceLineNo">6091</span>    final CountDownLatch obtainedRowLock = new CountDownLatch(1);<a name="line.6091"></a>
-<span class="sourceLineNo">6092</span>    ExecutorService exec = Executors.newFixedThreadPool(2);<a name="line.6092"></a>
-<span class="sourceLineNo">6093</span>    Future&lt;Void&gt; f1 = exec.submit(new Callable&lt;Void&gt;() {<a name="line.6093"></a>
-<span class="sourceLineNo">6094</span>      @Override<a name="line.6094"></a>
-<span class="sourceLineNo">6095</span>      public Void call() throws Exception {<a name="line.6095"></a>
-<span class="sourceLineNo">6096</span>        LOG.info("Acquiring row lock");<a name="line.6096"></a>
-<span class="sourceLineNo">6097</span>        RowLock rl = region.getRowLock(b);<a name="line.6097"></a>
-<span class="sourceLineNo">6098</span>        obtainedRowLock.countDown();<a name="line.6098"></a>
-<span class="sourceLineNo">6099</span>        LOG.info("Waiting for 5 seconds before releasing lock");<a name="line.6099"></a>
-<span class="sourceLineNo">6100</span>        Threads.sleep(5000);<a name="line.6100"></a>
-<span class="sourceLineNo">6101</span>        LOG.info("Releasing row lock");<a name="line.6101"></a>
-<span class="sourceLineNo">6102</span>        rl.release();<a name="line.6102"></a>
-<span class="sourceLineNo">6103</span>        return null;<a name="line.6103"></a>
-<span class="sourceLineNo">6104</span>      }<a name="line.6104"></a>
-<span class="sourceLineNo">6105</span>    });<a name="line.6105"></a>
-<span class="sourceLineNo">6106</span>    obtainedRowLock.await(30, TimeUnit.SECONDS);<a name="line.6106"></a>
-<span class="sourceLineNo">6107</span><a name="line.6107"></a>
-<span class="sourceLineNo">6108</span>    Future&lt;Void&gt; f2 = exec.submit(new Callable&lt;Void&gt;() {<a name="line.6108"></a>
-<span class="sourceLineNo">6109</span>      @Override<a name="line.6109"></a>
-<span class="sourceLineNo">6110</span>      public Void call() throws Exception {<a name="line.6110"></a>
-<span class="sourceLineNo">6111</span>        Mutation[] mutations = new Mutation[] {<a name="line.6111"></a>
-<span class="sourceLineNo">6112</span>            new Put(a).add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6112"></a>
-<span class="sourceLineNo">6113</span>                .setRow(a)<a name="line.6113"></a>
-<span class="sourceLineNo">6114</span>                .setFamily(fam1)<a name="line.6114"></a>
-<span class="sourceLineNo">6115</span>                .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6115"></a>
-<span class="sourceLineNo">6116</span>                .setType(Cell.Type.Put)<a name="line.6116"></a>
-<span class="sourceLineNo">6117</span>                .build()),<a name="line.6117"></a>
-<span class="sourceLineNo">6118</span>            new Put(b).add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6118"></a>
-<span class="sourceLineNo">6119</span>                .setRow(b)<a name="line.6119"></a>
-<span class="sourceLineNo">6120</span>                .setFamily(fam1)<a name="line.6120"></a>
-<span class="sourceLineNo">6121</span>                .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6121"></a>
-<span class="sourceLineNo">6122</span>                .setType(Cell.Type.Put)<a name="line.6122"></a>
-<span class="sourceLineNo">6123</span>                .build()),<a name="line.6123"></a>
-<span class="sourceLineNo">6124</span>        };<a name="line.6124"></a>
-<span class="sourceLineNo">6125</span><a name="line.6125"></a>
-<span class="sourceLineNo">6126</span>        // this will wait for the row lock, and it will eventually succeed<a name="line.6126"></a>
-<span class="sourceLineNo">6127</span>        OperationStatus[] status = region.batchMutate(mutations);<a name="line.6127"></a>
-<span class="sourceLineNo">6128</span>        assertEquals(OperationStatusCode.SUCCESS, status[0].getOperationStatusCode());<a name="line.6128"></a>
-<span class="sourceLineNo">6129</span>        assertEquals(OperationStatusCode.SUCCESS, status[1].getOperationStatusCode());<a name="line.6129"></a>
-<span class="sourceLineNo">6130</span>        return null;<a name="line.6130"></a>
-<span class="sourceLineNo">6131</span>      }<a name="line.6131"></a>
-<span class="sourceLineNo">6132</span>    });<a name="line.6132"></a>
-<span class="sourceLineNo">6133</span><a name="line.6133"></a>
-<span class="sourceLineNo">6134</span>    f1.get();<a name="line.6134"></a>
-<span class="sourceLineNo">6135</span>    f2.get();<a name="line.6135"></a>
-<span class="sourceLineNo">6136</span><a name="line.6136"></a>
-<span class="sourceLineNo">6137</span>    CONF.setInt("hbase.rowlock.wait.duration", prevLockTimeout);<a name="line.6137"></a>
-<span class="sourceLineNo">6138</span>  }<a name="line.6138"></a>
-<span class="sourceLineNo">6139</span><a name="line.6139"></a>
-<span class="sourceLineNo">6140</span>  @Test<a name="line.6140"></a>
-<span class="sourceLineNo">6141</span>  public void testCheckAndRowMutateTimestampsAreMonotonic() throws IOException {<a name="line.6141"></a>
-<span class="sourceLineNo">6142</span>    region = initHRegion(tableName, method, CONF, fam1);<a name="line.6142"></a>
-<span class="sourceLineNo">6143</span>    ManualEnvironmentEdge edge = new ManualEnvironmentEdge();<a name="line.6143"></a>
-<span class="sourceLineNo">6144</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.6144"></a>
-<span class="sourceLineNo">6145</span><a name="line.6145"></a>
-<span class="sourceLineNo">6146</span>    edge.setValue(10);<a name="line.6146"></a>
-<span class="sourceLineNo">6147</span>    Put p = new Put(row);<a name="line.6147"></a>
-<span class="sourceLineNo">6148</span>    p.setDurability(Durability.SKIP_WAL);<a name="line.6148"></a>
-<span class="sourceLineNo">6149</span>    p.addColumn(fam1, qual1, qual1);<a name="line.6149"></a>
-<span class="sourceLineNo">6150</span>    region.put(p);<a name="line.6150"></a>
-<span class="sourceLineNo">6151</span><a name="line.6151"></a>
-<span class="sourceLineNo">6152</span>    Result result = region.get(new Get(row));<a name="line.6152"></a>
-<span class="sourceLineNo">6153</span>    Cell c = result.getColumnLatestCell(fam1, qual1);<a name="line.6153"></a>
-<span class="sourceLineNo">6154</span>    assertNotNull(c);<a name="line.6154"></a>
-<span class="sourceLineNo">6155</span>    assertEquals(10L, c.getTimestamp());<a name="line.6155"></a>
-<span class="sourceLineNo">6156</span><a name="line.6156"></a>
-<span class="sourceLineNo">6157</span>    edge.setValue(1); // clock goes back<a name="line.6157"></a>
-<span class="sourceLineNo">6158</span>    p = new Put(row);<a name="line.6158"></a>
-<span class="sourceLineNo">6159</span>    p.setDurability(Durability.SKIP_WAL);<a name="line.6159"></a>
-<span class="sourceLineNo">6160</span>    p.addColumn(fam1, qual1, qual2);<a name="line.6160"></a>
-<span class="sourceLineNo">6161</span>    RowMutations rm = new RowMutations(row);<a name="line.6161"></a>
-<span class="sourceLineNo">6162</span>    rm.add(p);<a name="line.6162"></a>
-<span class="sourceLineNo">6163</span>    assertTrue(region.checkAndRowMutate(row, fam1, qual1, CompareOperator.EQUAL,<a name="line.6163"></a>
-<span class="sourceLineNo">6164</span>        new BinaryComparator(qual1), rm));<a name="line.6164"></a>
-<span class="sourceLineNo">6165</span>    result = region.get(new Get(row));<a name="line.6165"></a>
-<span class="sourceLineNo">6166</span>    c = result.getColumnLatestCell(fam1, qual1);<a name="line.6166"></a>
-<span class="sourceLineNo">6167</span>    assertEquals(10L, c.getTimestamp());<a name="line.6167"></a>
-<span class="sourceLineNo">6168</span>    LOG.info("c value " +<a name="line.6168"></a>
-<span class="sourceLineNo">6169</span>      Bytes.toStringBinary(c.getValueArray(), c.getValueOffset(), c.getValueLength()));<a name="line.6169"></a>
-<span class="sourceLineNo">6170</span><a name="line.6170"></a>
-<span class="sourceLineNo">6171</span>    assertTrue(Bytes.equals(c.getValueArray(), c.getValueOffset(), c.getValueLength(),<a name="line.6171"></a>
-<span class="sourceLineNo">6172</span>      qual2, 0, qual2.length));<a name="line.6172"></a>
-<span class="sourceLineNo">6173</span>  }<a name="line.6173"></a>
-<span class="sourceLineNo">6174</span><a name="line.6174"></a>
-<span class="sourceLineNo">6175</span>  HRegion initHRegion(TableName tableName, String callingMethod,<a name="line.6175"></a>
-<span class="sourceLineNo">6176</span>      byte[]... families) throws IOException {<a name="line.6176"></a>
-<span class="sourceLineNo">6177</span>    return initHRegion(tableName, callingMethod, HBaseConfiguration.create(),<a name="line.6177"></a>
-<span class="sourceLineNo">6178</span>        families);<a name="line.6178"></a>
-<span class="sourceLineNo">6179</span>  }<a name="line.6179"></a>
+<span class="sourceLineNo">6061</span>  @Test<a name="line.6061"></a>
+<span class="sourceLineNo">6062</span>  public void testBatchMutateWithWrongRegionException() throws Exception {<a name="line.6062"></a>
+<span class="sourceLineNo">6063</span>    final byte[] a = Bytes.toBytes("a");<a name="line.6063"></a>
+<span class="sourceLineNo">6064</span>    final byte[] b = Bytes.toBytes("b");<a name="line.6064"></a>
+<span class="sourceLineNo">6065</span>    final byte[] c = Bytes.toBytes("c"); // exclusive<a name="line.6065"></a>
+<span class="sourceLineNo">6066</span><a name="line.6066"></a>
+<span class="sourceLineNo">6067</span>    int prevLockTimeout = CONF.getInt("hbase.rowlock.wait.duration", 30000);<a name="line.6067"></a>
+<span class="sourceLineNo">6068</span>    CONF.setInt("hbase.rowlock.wait.duration", 1000);<a name="line.6068"></a>
+<span class="sourceLineNo">6069</span>    region = initHRegion(tableName, a, c, method, CONF, false, fam1);<a name="line.6069"></a>
+<span class="sourceLineNo">6070</span><a name="line.6070"></a>
+<span class="sourceLineNo">6071</span>    Mutation[] mutations = new Mutation[] {<a name="line.6071"></a>
+<span class="sourceLineNo">6072</span>        new Put(a)<a name="line.6072"></a>
+<span class="sourceLineNo">6073</span>            .add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6073"></a>
+<span class="sourceLineNo">6074</span>              .setRow(a)<a name="line.6074"></a>
+<span class="sourceLineNo">6075</span>              .setFamily(fam1)<a name="line.6075"></a>
+<span class="sourceLineNo">6076</span>              .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6076"></a>
+<span class="sourceLineNo">6077</span>              .setType(Cell.Type.Put)<a name="line.6077"></a>
+<span class="sourceLineNo">6078</span>              .build()),<a name="line.6078"></a>
+<span class="sourceLineNo">6079</span>        // this is outside the region boundary<a name="line.6079"></a>
+<span class="sourceLineNo">6080</span>        new Put(c).add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6080"></a>
+<span class="sourceLineNo">6081</span>              .setRow(c)<a name="line.6081"></a>
+<span class="sourceLineNo">6082</span>              .setFamily(fam1)<a name="line.6082"></a>
+<span class="sourceLineNo">6083</span>              .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6083"></a>
+<span class="sourceLineNo">6084</span>              .setType(Type.Put)<a name="line.6084"></a>
+<span class="sourceLineNo">6085</span>              .build()),<a name="line.6085"></a>
+<span class="sourceLineNo">6086</span>        new Put(b).add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6086"></a>
+<span class="sourceLineNo">6087</span>              .setRow(b)<a name="line.6087"></a>
+<span class="sourceLineNo">6088</span>              .setFamily(fam1)<a name="line.6088"></a>
+<span class="sourceLineNo">6089</span>              .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6089"></a>
+<span class="sourceLineNo">6090</span>              .setType(Cell.Type.Put)<a name="line.6090"></a>
+<span class="sourceLineNo">6091</span>              .build())<a name="line.6091"></a>
+<span class="sourceLineNo">6092</span>    };<a name="line.6092"></a>
+<span class="sourceLineNo">6093</span><a name="line.6093"></a>
+<span class="sourceLineNo">6094</span>    OperationStatus[] status = region.batchMutate(mutations);<a name="line.6094"></a>
+<span class="sourceLineNo">6095</span>    assertEquals(OperationStatusCode.SUCCESS, status[0].getOperationStatusCode());<a name="line.6095"></a>
+<span class="sourceLineNo">6096</span>    assertEquals(OperationStatusCode.SANITY_CHECK_FAILURE, status[1].getOperationStatusCode());<a name="line.6096"></a>
+<span class="sourceLineNo">6097</span>    assertEquals(OperationStatusCode.SUCCESS, status[2].getOperationStatusCode());<a name="line.6097"></a>
+<span class="sourceLineNo">6098</span><a name="line.6098"></a>
+<span class="sourceLineNo">6099</span><a name="line.6099"></a>
+<span class="sourceLineNo">6100</span>    // test with a row lock held for a long time<a name="line.6100"></a>
+<span class="sourceLineNo">6101</span>    final CountDownLatch obtainedRowLock = new CountDownLatch(1);<a name="line.6101"></a>
+<span class="sourceLineNo">6102</span>    ExecutorService exec = Executors.newFixedThreadPool(2);<a name="line.6102"></a>
+<span class="sourceLineNo">6103</span>    Future&lt;Void&gt; f1 = exec.submit(new Callable&lt;Void&gt;() {<a name="line.6103"></a>
+<span class="sourceLineNo">6104</span>      @Override<a name="line.6104"></a>
+<span class="sourceLineNo">6105</span>      public Void call() throws Exception {<a name="line.6105"></a>
+<span class="sourceLineNo">6106</span>        LOG.info("Acquiring row lock");<a name="line.6106"></a>
+<span class="sourceLineNo">6107</span>        RowLock rl = region.getRowLock(b);<a name="line.6107"></a>
+<span class="sourceLineNo">6108</span>        obtainedRowLock.countDown();<a name="line.6108"></a>
+<span class="sourceLineNo">6109</span>        LOG.info("Waiting for 5 seconds before releasing lock");<a name="line.6109"></a>
+<span class="sourceLineNo">6110</span>        Threads.sleep(5000);<a name="line.6110"></a>
+<span class="sourceLineNo">6111</span>        LOG.info("Releasing row lock");<a name="line.6111"></a>
+<span class="sourceLineNo">6112</span>        rl.release();<a name="line.6112"></a>
+<span class="sourceLineNo">6113</span>        return null;<a name="line.6113"></a>
+<span class="sourceLineNo">6114</span>      }<a name="line.6114"></a>
+<span class="sourceLineNo">6115</span>    });<a name="line.6115"></a>
+<span class="sourceLineNo">6116</span>    obtainedRowLock.await(30, TimeUnit.SECONDS);<a name="line.6116"></a>
+<span class="sourceLineNo">6117</span><a name="line.6117"></a>
+<span class="sourceLineNo">6118</span>    Future&lt;Void&gt; f2 = exec.submit(new Callable&lt;Void&gt;() {<a name="line.6118"></a>
+<span class="sourceLineNo">6119</span>      @Override<a name="line.6119"></a>
+<span class="sourceLineNo">6120</span>      public Void call() throws Exception {<a name="line.6120"></a>
+<span class="sourceLineNo">6121</span>        Mutation[] mutations = new Mutation[] {<a name="line.6121"></a>
+<span class="sourceLineNo">6122</span>            new Put(a).add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6122"></a>
+<span class="sourceLineNo">6123</span>                .setRow(a)<a name="line.6123"></a>
+<span class="sourceLineNo">6124</span>                .setFamily(fam1)<a name="line.6124"></a>
+<span class="sourceLineNo">6125</span>                .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6125"></a>
+<span class="sourceLineNo">6126</span>                .setType(Cell.Type.Put)<a name="line.6126"></a>
+<span class="sourceLineNo">6127</span>                .build()),<a name="line.6127"></a>
+<span class="sourceLineNo">6128</span>            new Put(b).add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6128"></a>
+<span class="sourceLineNo">6129</span>                .setRow(b)<a name="line.6129"></a>
+<span class="sourceLineNo">6130</span>                .setFamily(fam1)<a name="line.6130"></a>
+<span class="sourceLineNo">6131</span>                .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6131"></a>
+<span class="sourceLineNo">6132</span>                .setType(Cell.Type.Put)<a name="line.6132"></a>
+<span class="sourceLineNo">6133</span>                .build()),<a name="line.6133"></a>
+<span class="sourceLineNo">6134</span>        };<a name="line.6134"></a>
+<span class="sourceLineNo">6135</span><a name="line.6135"></a>
+<span class="sourceLineNo">6136</span>        // this will wait for the row lock, and it will eventually succeed<a name="line.6136"></a>
+<span class="sourceLineNo">6137</span>        OperationStatus[] status = region.batchMutate(mutations);<a name="line.6137"></a>
+<span class="sourceLineNo">6138</span>        assertEquals(OperationStatusCode.SUCCESS, status[0].getOperationStatusCode());<a name="line.6138"></a>
+<span class="sourceLineNo">6139</span>        assertEquals(OperationStatusCode.SUCCESS, status[1].getOperationStatusCode());<a name="line.6139"></a>
+<span class="sourceLineNo">6140</span>        return null;<a name="line.6140"></a>
+<span class="sourceLineNo">6141</span>      }<a name="line.6141"></a>
+<span class="sourceLineNo">6142</span>    });<a name="line.6142"></a>
+<span class="sourceLineNo">6143</span><a name="line.6143"></a>
+<span class="sourceLineNo">6144</span>    f1.get();<a name="line.6144"></a>
+<span class="sourceLineNo">6145</span>    f2.get();<a name="line.6145"></a>
+<span class="sourceLineNo">6146</span><a name="line.6146"></a>
+<span class="sourceLineNo">6147</span>    CONF.setInt("hbase.rowlock.wait.duration", prevLockTimeout);<a name="line.6147"></a>
+<span class="sourceLineNo">6148</span>  }<a name="line.6148"></a>
+<span class="sourceLineNo">6149</span><a name="line.6149"></a>
+<span class="sourceLineNo">6150</span>  @Test<a name="line.6150"></a>
+<span class="sourceLineNo">6151</span>  public void testCheckAndRowMutateTimestampsAreMonotonic() throws IOException {<a name="line.6151"></a>
+<span class="sourceLineNo">6152</span>    region = initHRegion(tableName, method, CONF, fam1);<a name="line.6152"></a>
+<span class="sourceLineNo">6153</span>    ManualEnvironmentEdge edge = new ManualEnvironmentEdge();<a name="line.6153"></a>
+<span class="sourceLineNo">6154</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.6154"></a>
+<span class="sourceLineNo">6155</span><a name="line.6155"></a>
+<span class="sourceLineNo">6156</span>    edge.setValue(10);<a name="line.6156"></a>
+<span class="sourceLineNo">6157</span>    Put p = new Put(row);<a name="line.6157"></a>
+<span class="sourceLineNo">6158</span>    p.setDurability(Durability.SKIP_WAL);<a name="line.6158"></a>
+<span class="sourceLineNo">6159</span>    p.addColumn(fam1, qual1, qual1);<a name="line.6159"></a>
+<span class="sourceLineNo">6160</span>    region.put(p);<a name="line.6160"></a>
+<span class="sourceLineNo">6161</span><a name="line.6161"></a>
+<span class="sourceLineNo">6162</span>    Result result = region.get(new Get(row));<a name="line.6162"></a>
+<span class="sourceLineNo">6163</span>    Cell c = result.getColumnLatestCell(fam1, qual1);<a name="line.6163"></a>
+<span class="sourceLineNo">6164</span>    assertNotNull(c);<a name="line.6164"></a>
+<span class="sourceLineNo">6165</span>    assertEquals(10L, c.getTimestamp());<a name="line.6165"></a>
+<span class="sourceLineNo">6166</span><a name="line.6166"></a>
+<span class="sourceLineNo">6167</span>    edge.setValue(1); // clock goes back<a name="line.6167"></a>
+<span class="sourceLineNo">6168</span>    p = new Put(row);<a name="line.6168"></a>
+<span class="sourceLineNo">6169</span>    p.setDurability(Durability.SKIP_WAL);<a name="line.6169"></a>
+<span class="sourceLineNo">6170</span>    p.addColumn(fam1, qual1, qual2);<a name="line.6170"></a>
+<span class="sourceLineNo">6171</span>    RowMutations rm = new RowMutations(row);<a name="line.6171"></a>
+<span class="sourceLineNo">6172</span>    rm.add(p);<a name="line.6172"></a>
+<span class="sourceLineNo">6173</span>    assertTrue(region.checkAndRowMutate(row, fam1, qual1, CompareOperator.EQUAL,<a name="line.6173"></a>
+<span class="sourceLineNo">6174</span>        new BinaryComparator(qual1), rm));<a name="line.6174"></a>
+<span class="sourceLineNo">6175</span>    result = region.get(new Get(row));<a name="line.6175"></a>
+<span class="sourceLineNo">6176</span>    c = result.getColumnLatestCell(fam1, qual1);<a name="line.6176"></a>
+<span class="sourceLineNo">6177</span>    assertEquals(10L, c.getTimestamp());<a name="line.6177"></a>
+<span class="sourceLineNo">6178</span>    LOG.info("c value " +<a name="line.6178"></a>
+<span class="sourceLineNo">6179</span>      Bytes.toStringBinary(c.getValueArray(), c.getValueOffset(), c.getValueLength()));<a name="line.6179"></a>
 <span class="sourceLineNo">6180</span><a name="line.6180"></a>
-<span class="sourceLineNo">6181</span>  /**<a name="line.6181"></a>
-<span class="sourceLineNo">6182</span>   * HBASE-16429 Make sure no stuck if roll writer when ring buffer is filled with appends<a name="line.6182"></a>
-<span class="sourceLineNo">6183</span>   * @throws IOException if IO error occurred during test<a name="line.6183"></a>
-<span class="sourceLineNo">6184</span>   */<a name="line.6184"></a>
-<span class="sourceLineNo">6185</span>  @Test<a name="line.6185"></a>
-<span class="sourceLineNo">6186</span>  public void testWritesWhileRollWriter() throws IOException {<a name="line.6186"></a>
-<span class="sourceLineNo">6187</span>    int testCount = 10;<a name="line.6187"></a>
-<span class="sourceLineNo">6188</span>    int numRows = 1024;<a name="line.6188"></a>
-<span class="sourceLineNo">6189</span>    int numFamilies = 2;<a name="line.6189"></a>
-<span class="sourceLineNo">6190</span>    int numQualifiers = 2;<a name="line.6190"></a>
-<span class="sourceLineNo">6191</span>    final byte[][] families = new byte[numFamilies][];<a name="line.6191"></a>
-<span class="sourceLineNo">6192</span>    for (int i = 0; i &lt; numFamilies; i++) {<a name="line.6192"></a>
-<span class="sourceLineNo">6193</span>      families[i] = Bytes.toBytes("family" + i);<a name="line.6193"></a>
-<span class="sourceLineNo">6194</span>    }<a name="line.6194"></a>
-<span class="sourceLineNo">6195</span>    final byte[][] qualifiers = new byte[numQualifiers][];<a name="line.6195"></a>
-<span class="sourceLineNo">6196</span>    for (int i = 0; i &lt; numQualifiers; i++) {<a name="line.6196"></a>
-<span class="sourceLineNo">6197</span>      qualifiers[i] = Bytes.toBytes("qual" + i);<a name="line.6197"></a>
-<span class="sourceLineNo">6198</span>    }<a name="line.6198"></a>
-<span class="sourceLineNo">6199</span><a name="line.6199"></a>
-<span class="sourceLineNo">6200</span>    CONF.setInt("hbase.regionserver.wal.disruptor.event.count", 2);<a name="line.6200"></a>
-<span class="sourceLineNo">6201</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.6201"></a>
-<span class="sourceLineNo">6202</span>    try {<a name="line.6202"></a>
-<span class="sourceLineNo">6203</span>      List&lt;Thread&gt; threads = new ArrayList&lt;&gt;();<a name="line.6203"></a>
-<span class="sourceLineNo">6204</span>      for (int i = 0; i &lt; numRows; i++) {<a name="line.6204"></a>
-<span class="sourceLineNo">6205</span>        final int count = i;<a name="line.6205"></a>
-<span class="sourceLineNo">6206</span>        Thread t = new Thread(new Runnable() {<a name="line.6206"></a>
-<span class="sourceLineNo">6207</span><a name="line.6207"></a>
-<span class="sourceLineNo">6208</span>          @Override<a name="line.6208"></a>
-<span class="sourceLineNo">6209</span>          public void run() {<a name="line.6209"></a>
-<span class="sourceLineNo">6210</span>            byte[] row = Bytes.toBytes("row" + count);<a name="line.6210"></a>
-<span class="sourceLineNo">6211</span>            Put put = new Put(row);<a name="line.6211"></a>
-<span class="sourceLineNo">6212</span>            put.setDurability(Durability.SYNC_WAL);<a name="line.6212"></a>
-<span class="sourceLineNo">6213</span>            byte[] value = Bytes.toBytes(String.valueOf(count));<a name="line.6213"></a>
-<span class="sourceLineNo">6214</span>            for (byte[] family : families) {<a name="line.6214"></a>
-<span class="sourceLineNo">6215</span>              for (byte[] qualifier : qualifiers) {<a name="line.6215"></a>
-<span class="sourceLineNo">6216</span>                put.addColumn(family, qualifier, count, value);<a name="line.6216"></a>
-<span class="sourceLineNo">6217</span>              }<a name="line.6217"></a>
-<span class="sourceLineNo">6218</span>            }<a name="line.6218"></a>
-<span class="sourceLineNo">6219</span>            try {<a name="line.6219"></a>
-<span class="sourceLineNo">6220</span>              region.put(put);<a name="line.6220"></a>
-<span class="sourceLineNo">6221</span>            } catch (IOException e) {<a name="line.6221"></a>
-<span class="sourceLineNo">6222</span>              throw new RuntimeException(e);<a name="line.6222"></a>
-<span class="sourceLineNo">6223</span>            }<a name="line.6223"></a>
-<span class="sourceLineNo">6224</span>          }<a name="line.6224"></a>
-<span class="sourceLineNo">6225</span>        });<a name="line.6225"></a>
-<span class="sourceLineNo">6226</span>        threads.add(t);<a name="line.6226"></a>
-<span class="sourceLineNo">6227</span>      }<a name="line.6227"></a>
-<span class="sourceLineNo">6228</span>      for (Thread t : threads) {<a name="line.6228"></a>
-<span class="sourceLineNo">6229</span>        t.start();<a name="line.6229"></a>
-<span class="sourceLineNo">6230</span>      }<a name="line.6230"></a>
-<span class="sourceLineNo">6231</span><a name="line.6231"></a>
-<span class="sourceLineNo">6232</span>      for (int i = 0; i &lt; testCount; i++) {<a name="line.6232"></a>
-<span class="sourceLineNo">6233</span>        region.getWAL().rollWriter();<a name="line.6233"></a>
-<span class="sourceLineNo">6234</span>        Thread.yield();<a name="line.6234"></a>
-<span class="sourceLineNo">6235</span>      }<a name="line.6235"></a>
-<span class="sourceLineNo">6236</span>    } finally {<a name="line.6236"></a>
-<span class="sourceLineNo">6237</span>      try {<a name="line.6237"></a>
-<span class="sourceLineNo">6238</span>        HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.6238"></a>
-<span class="sourceLineNo">6239</span>        CONF.setInt("hbase.regionserver.wal.disruptor.event.count", 16 * 1024);<a name="line.6239"></a>
-<span class="sourceLineNo">6240</span>      } catch (DroppedSnapshotException dse) {<a name="line.6240"></a>
-<span class="sourceLineNo">6241</span>        // We could get this on way out because we interrupt the background flusher and it could<a name="line.6241"></a>
-<span class="sourceLineNo">6242</span>        // fail anywhere causing a DSE over in the background flusher... only it is not properly<a name="line.6242"></a>
-<span class="sourceLineNo">6243</span>        // dealt with so could still be memory hanging out when we get to here -- memory we can't<a name="line.6243"></a>
-<span class="sourceLineNo">6244</span>        // flush because the accounting is 'off' since original DSE.<a name="line.6244"></a>
+<span class="sourceLineNo">6181</span>    assertTrue(Bytes.equals(c.getValueArray(), c.getValueOffset(), c.getValueLength(),<a name="line.6181"></a>
+<span class="sourceLineNo">6182</span>      qual2, 0, qual2.length));<a name="line.6182"></a>
+<span class="sourceLineNo">6183</span>  }<a name="line.6183"></a>
+<span class="sourceLineNo">6184</span><a name="line.6184"></a>
+<span class="sourceLineNo">6185</span>  HRegion initHRegion(TableName tableName, String callingMethod,<a name="line.6185"></a>
+<span class="sourceLineNo">6186</span>      byte[]... families) throws IOException {<a name="line.6186"></a>
+<span class="sourceLineNo">6187</span>    return initHRegion(tableName, callingMethod, HBaseConfiguration.create(),<a name="line.6187"></a>
+<span class="sourceLineNo">6188</span>        families);<a name="line.6188"></a>
+<span class="sourceLineNo">6189</span>  }<a name="line.6189"></a>
+<span class="sourceLineNo">6190</span><a name="line.6190"></a>
+<span class="sourceLineNo">6191</span>  /**<a name="line.6191"></a>
+<span class="sourceLineNo">6192</span>   * HBASE-16429 Make sure no stuck if roll writer when ring buffer is filled with appends<a name="line.6192"></a>
+<span class="sourceLineNo">6193</span>   * @throws IOException if IO error occurred during test<a name="line.6193"></a>
+<span class="sourceLineNo">6194</span>   */<a name="line.6194"></a>
+<span class="sourceLineNo">6195</span>  @Test<a name="line.6195"></a>
+<span class="sourceLineNo">6196</span>  public void testWritesWhileRollWriter() throws IOException {<a name="line.6196"></a>
+<span class="sourceLineNo">6197</span>    int testCount = 10;<a name="line.6197"></a>
+<span class="sourceLineNo">6198</span>    int numRows = 1024;<a name="line.6198"></a>
+<span class="sourceLineNo">6199</span>    int numFamilies = 2;<a name="line.6199"></a>
+<span class="sourceLineNo">6200</span>    int numQualifiers = 2;<a name="line.6200"></a>
+<span class="sourceLineNo">6201</span>    final byte[][] families = new byte[numFamilies][];<a name="line.6201"></a>
+<span class="sourceLineNo">6202</span>    for (int i = 0; i &lt; numFamilies; i++) {<a name="line.6202"></a>
+<span class="sourceLineNo">6203</span>      families[i] = Bytes.toBytes("family" + i);<a name="line.6203"></a>
+<span class="sourceLineNo">6204</span>    }<a name="line.6204"></a>
+<span class="sourceLineNo">6205</span>    final byte[][] qualifiers = new byte[numQualifiers][];<a name="line.6205"></a>
+<span class="sourceLineNo">6206</span>    for (int i = 0; i &lt; numQualifiers; i++) {<a name="line.6206"></a>
+<span class="sourceLineNo">6207</span>      qualifiers[i] = Bytes.toBytes("qual" + i);<a name="line.6207"></a>
+<span class="sourceLineNo">6208</span>    }<a name="line.6208"></a>
+<span class="sourceLineNo">6209</span><a name="line.6209"></a>
+<span class="sourceLineNo">6210</span>    CONF.setInt("hbase.regionserver.wal.disruptor.event.count", 2);<a name="line.6210"></a>
+<span class="sourceLineNo">6211</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.6211"></a>
+<span class="sourceLineNo">6212</span>    try {<a name="line.6212"></a>
+<span class="sourceLineNo">6213</span>      List&lt;Thread&gt; threads = new ArrayList&lt;&gt;();<a name="line.6213"></a>
+<span class="sourceLineNo">6214</span>      for (int i = 0; i &lt; numRows; i++) {<a name="line.6214"></a>
+<span class="sourceLineNo">6215</span>        final int count = i;<a name="line.6215"></a>
+<span class="sourceLineNo">6216</span>        Thread t = new Thread(new Runnable() {<a name="line.6216"></a>
+<span class="sourceLineNo">6217</span><a name="line.6217"></a>
+<span class="sourceLineNo">6218</span>          @Override<a name="line.6218"></a>
+<span class="sourceLineNo">6219</span>          public void run() {<a name="line.6219"></a>
+<span class="sourceLineNo">6220</span>            byte[] row = Bytes.toBytes("row" + count);<a name="line.6220"></a>
+<span class="sourceLineNo">6221</span>            Put put = new Put(row);<a name="line.6221"></a>
+<span class="sourceLineNo">6222</span>            put.setDurability(Durability.SYNC_WAL);<a name="line.6222"></a>
+<span class="sourceLineNo">6223</span>            byte[] value = Bytes.toBytes(String.valueOf(count));<a name="line.6223"></a>
+<span class="sourceLineNo">6224</span>            for (byte[] family : families) {<a name="line.6224"></a>
+<span class="sourceLineNo">6225</span>              for (byte[] qualifier : qualifiers) {<a name="line.6225"></a>
+<span class="sourceLineNo">6226</span>                put.addColumn(family, qualifier, count, value);<a name="line.6226"></a>
+<span class="sourceLineNo">6227</span>              }<a name="line.6227"></a>
+<span class="sourceLineNo">6228</span>            }<a name="line.6228"></a>
+<span class="sourceLineNo">6229</span>            try {<a name="line.6229"></a>
+<span class="sourceLineNo">6230</span>              region.put(put);<a name="line.6230"></a>
+<span class="sourceLineNo">6231</span>            } catch (IOException e) {<a name="line.6231"></a>
+<span class="sourceLineNo">6232</span>              throw new RuntimeException(e);<a name="line.6232"></a>
+<span class="sourceLineNo">6233</span>            }<a name="line.6233"></a>
+<span class="sourceLineNo">6234</span>          }<a name="line.6234"></a>
+<span class="sourceLineNo">6235</span>        });<a name="line.6235"></a>
+<span class="sourceLineNo">6236</span>        threads.add(t);<a name="line.6236"></a>
+<span class="sourceLineNo">6237</span>      }<a name="line.6237"></a>
+<span class="sourceLineNo">6238</span>      for (Thread t : threads) {<a name="line.6238"></a>
+<span class="sourceLineNo">6239</span>        t.start();<a name="line.6239"></a>
+<span class="sourceLineNo">6240</span>      }<a name="line.6240"></a>
+<span class="sourceLineNo">6241</span><a name="line.6241"></a>
+<span class="sourceLineNo">6242</span>      for (int i = 0; i &lt; testCount; i++) {<a name="line.6242"></a>
+<span class="sourceLineNo">6243</span>        region.getWAL().rollWriter();<a name="line.6243"></a>
+<span class="sourceLineNo">6244</span>        Thread.yield();<a name="line.6244"></a>
 <span class="sourceLineNo">6245</span>      }<a name="line.6245"></a>
-<span class="sourceLineNo">6246</span>      this.region = null;<a name="line.6246"></a>
-<span class="sourceLineNo">6247</span>    }<a name="line.6247"></a>
-<span class="sourceLineNo">6248</span>  }<a name="line.6248"></a>
-<span class="sourceLineNo">6249</span><a name="line.6249"></a>
-<span class="sourceLineNo">6250</span>  @Test<a name="line.6250"></a>
-<span class="sourceLineNo">6251</span>  public void testMutateRow_WriteRequestCount() throws Exception {<a name="line.6251"></a>
-<span class="sourceLineNo">6252</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.6252"></a>
-<span class="sourceLineNo">6253</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.6253"></a>
-<span class="sourceLineNo">6254</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.6254"></a>
-<span class="sourceLineNo">6255</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.6255"></a>
-<span class="sourceLineNo">6256</span><a name="line.6256"></a>
-<span class="sourceLineNo">6257</span>    RowMutations rm = new RowMutations(row1);<a name="line.6257"></a>
-<span class="sourceLineNo">6258</span>    Put put = new Put(row1);<a name="line.6258"></a>
-<span class="sourceLineNo">6259</span>    put.addColumn(fam1, qf1, val1);<a name="line.6259"></a>
-<span class="sourceLineNo">6260</span>    rm.add(put);<a name="line.6260"></a>
-<span class="sourceLineNo">6261</span><a name="line.6261"></a>
-<span class="sourceLineNo">6262</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.6262"></a>
-<span class="sourceLineNo">6263</span>    long wrcBeforeMutate = this.region.writeRequestsCount.longValue();<a name="line.6263"></a>
-<span class="sourceLineNo">6264</span>    this.region.mutateRow(rm);<a name="line.6264"></a>
-<span class="sourceLineNo">6265</span>    long wrcAfterMutate = this.region.writeRequestsCount.longValue();<a name="line.6265"></a>
-<span class="sourceLineNo">6266</span>    Assert.assertEquals(wrcBeforeMutate + rm.getMutations().size(), wrcAfterMutate);<a name="line.6266"></a>
-<span class="sourceLineNo">6267</span>  }<a name="line.6267"></a>
-<span class="sourceLineNo">6268</span><a name="line.6268"></a>
-<span class="sourceLineNo">6269</span>  @Test<a name="line.6269"></a>
-<span class="sourceLineNo">6270</span>  public void testBulkLoadReplicationEnabled() throws IOException {<a name="line.6270"></a>
-<span class="sourceLineNo">6271</span>    TEST_UTIL.getConfiguration().setBoolean(HConstants.REPLICATION_BULKLOAD_ENABLE_KEY, true);<a name="line.6271"></a>
-<span class="sourceLineNo">6272</span>    final ServerName serverName = ServerName.valueOf(name.getMethodName(), 100, 42);<a name="line.6272"></a>
-<span class="sourceLineNo">6273</span>    final RegionServerServices rss = spy(TEST_UTIL.createMockRegionServerService(serverName));<a name="line.6273"></a>
-<span class="sourceLineNo">6274</span><a name="line.6274"></a>
-<span class="sourceLineNo">6275</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.6275"></a>
-<span class="sourceLineNo">6276</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.6276"></a>
-<span class="sourceLineNo">6277</span>    HRegionInfo hri = new HRegionInfo(htd.getTableName(),<a name="line.6277"></a>
-<span class="sourceLineNo">6278</span>        HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY);<a name="line.6278"></a>
-<span class="sourceLineNo">6279</span>    region = HRegion.openHRegion(hri, htd, rss.getWAL(hri), TEST_UTIL.getConfiguration(),<a name="line.6279"></a>
-<span class="sourceLineNo">6280</span>        rss, null);<a name="line.6280"></a>
-<span class="sourceLineNo">6281</span><a name="line.6281"></a>
-<span class="sourceLineNo">6282</span>    assertTrue(region.conf.getBoolean(HConstants.REPLICATION_BULKLOAD_ENABLE_KEY, false));<a name="line.6282"></a>
-<span class="sourceLineNo">6283</span>    String plugins = region.conf.get(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY, "");<a name="line.6283"></a>
-<span class="sourceLineNo">6284</span>    String replicationCoprocessorClass = ReplicationObserver.class.getCanonicalName();<a name="line.6284"></a>
-<span class="sourceLineNo">6285</span>    assertTrue(plugins.contains(replicationCoprocessorClass));<a name="line.6285"></a>
-<span class="sourceLineNo">6286</span>    assertTrue(region.getCoprocessorHost().<a name="line.6286"></a>
-<span class="sourceLineNo">6287</span>        getCoprocessors().contains(ReplicationObserver.class.getSimpleName()));<a name="line.6287"></a>
-<span class="sourceLineNo">6288</span>  }<a name="line.6288"></a>
-<span class="sourceLineNo">6289</span><a name="line.6289"></a>
-<span class="sourceLineNo">6290</span>  // make sure region is success close when coprocessor wrong region open failed<a name="line.6290"></a>
-<span class="sourceLineNo">6291</span>  @Test<a name="line.6291"></a>
-<span class="sourceLineNo">6292</span>  public void testOpenRegionFailedMemoryLeak() throws Exception {<a name="line.6292"></a>
-<span class="sourceLineNo">6293</span>    final ServerName serverName = ServerName.valueOf("testOpenRegionFailed", 100, 42);<a name="line.6293"></a>
-<span class="sourceLineNo">6294</span>    final RegionServerServices rss = spy(TEST_UTIL.createMockRegionServerService(serverName));<a name="line.6294"></a>
-<span class="sourceLineNo">6295</span><a name="line.6295"></a>
-<span class="sourceLineNo">6296</span>    HTableDescriptor htd<a name="line.6296"></a>
-<span class="sourceLineNo">6297</span>      = new HTableDescriptor(TableName.valueOf("testOpenRegionFailed"));<a name="line.6297"></a>
-<span class="sourceLineNo">6298</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.6298"></a>
-<span class="sourceLineNo">6299</span>    htd.setValue("COPROCESSOR$1", "hdfs://test/test.jar|test||");<a name="line.6299"></a>
-<span class="sourceLineNo">6300</span><a name="line.6300"></a>
-<span class="sourceLineNo">6301</span>    HRegionInfo hri = new HRegionInfo(htd.getTableName(),<a name="line.6301"></a>
-<span class="sourceLineNo">6302</span>      HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY);<a name="line.6302"></a>
-<span class="sourceLineNo">6303</span>    ScheduledExecutorService executor = CompatibilitySingletonFactory.<a name="line.6303"></a>
-<span class="sourceLineNo">6304</span>      getInstance(MetricsExecutor.class).getExecutor();<a name="line.6304"></a>
-<span class="sourceLineNo">6305</span>    for (int i = 0; i &lt; 20 ; i++) {<a name="line.6305"></a>
-<span class="sourceLineNo">6306</span>      try {<a name="line.6306"></a>
-<span class="sourceLineNo">6307</span>        HRegion.openHRegion(hri, htd, rss.getWAL(hri),<a name="line.6307"></a>
-<span class="sourceLineNo">6308</span>          TEST_UTIL.getConfiguration(), rss, null);<a name="line.6308"></a>
-<span class="sourceLineNo">6309</span>      }catch(Throwable t){<a name="line.6309"></a>
-<span class="sourceLineNo">6310</span>        LOG.info("Expected exception, continue");<a name="line.6310"></a>
-<span class="sourceLineNo">6311</span>      }<a name="line.6311"></a>
-<span class="sourceLineNo">6312</span>    }<a name="line.6312"></a>
-<span class="sourceLineNo">6313</span>    TimeUnit.SECONDS.sleep(MetricsRegionWrapperImpl.PERIOD);<a name="line.6313"></a>
-<span class="sourceLineNo">6314</span>    Field[] fields = ThreadPoolExecutor.class.getDeclaredFields();<a name="line.6314"></a>
-<span class="sourceLineNo">6315</span>    boolean found = false;<a name="line.6315"></a>
-<span class="sourceLineNo">6316</span>    for(Field field : fields){<a name="line.6316"></a>
-<span class="sourceLineNo">6317</span>      if(field.getName().equals("workQueue")){<a name="line.6317"></a>
-<span class="sourceLineNo">6318</span>        field.setAccessible(true);<a name="line.6318"></a>
-<span class="sourceLineNo">6319</span>        BlockingQueue&lt;Runnable&gt; workQueue = (BlockingQueue&lt;Runnable&gt;)field.get(executor);<a name="line.6319"></a>
-<span class="sourceLineNo">6320</span>        //there are still two task not cancel, can not cause to memory lack<a name="line.6320"></a>
-<span class="sourceLineNo">6321</span>        Assert.assertTrue("ScheduledExecutor#workQueue should equals 2, now is " +<a name="line.6321"></a>
-<span class="sourceLineNo">6322</span>          workQueue.size() + ", please check region is close", 2 == workQueue.size());<a name="line.6322"></a>
-<span class="sourceLineNo">6323</span>        found = true;<a name="line.6323"></a>
-<span class="sourceLineNo">6324</span>      }<a name="line.6324"></a>
-<span class="sourceLineNo">6325</span>    }<a name="line.6325"></a>
-<span class="sourceLineNo">6326</span>    Assert.assertTrue("can not find workQueue, test failed", found);<a name="line.6326"></a>
-<span class="sourceLineNo">6327</span>  }<a name="line.6327"></a>
-<span class="sourceLineNo">6328</span><a name="line.6328"></a>
-<span class="sourceLineNo">6329</span>  /**<a name="line.6329"></a>
-<span class="sourceLineNo">6330</span>   * The same as HRegion class, the only difference is that instantiateHStore will<a name="line.6330"></a>
-<span class="sourceLineNo">6331</span>   * create a different HStore - HStoreForTesting. [HBASE-8518]<a name="line.6331"></a>
-<span class="sourceLineNo">6332</span>   */<a name="line.6332"></a>
-<span class="sourceLineNo">6333</span>  public static class HRegionForTesting extends HRegion {<a name="line.6333"></a>
-<span class="sourceLineNo">6334</span><a name="line.6334"></a>
-<span class="sourceLineNo">6335</span>    public HRegionForTesting(final Path tableDir, final WAL wal, final FileSystem fs,<a name="line.6335"></a>
-<span class="sourceLineNo">6336</span>                             final Configuration confParam, final RegionInfo regionInfo,<a name="line.6336"></a>
-<span class="sourceLineNo">6337</span>                             final TableDescriptor htd, final RegionServerServices rsServices) {<a name="line.6337"></a>
-<span class="sourceLineNo">6338</span>      this(new HRegionFileSystem(confParam, fs, tableDir, regionInfo),<a name="line.6338"></a>
-<span class="sourceLineNo">6339</span>          wal, confParam, htd, rsServices);<a name="line.6339"></a>
-<span class="sourceLineNo">6340</span>    }<a name="line.6340"></a>
-<span class="sourceLineNo">6341</span><a name="line.6341"></a>
-<span class="sourceLineNo">6342</span>    public HRegionForTesting(HRegionFileSystem fs, WAL wal,<a name="line.6342"></a>
-<span class="sourceLineNo">6343</span>                             Configuration confParam, TableDescriptor htd,<a name="line.6343"></a>
-<span class="sourceLineNo">6344</span>                             RegionServerServices rsServices) {<a name="line.6344"></a>
-<span class="sourceLineNo">6345</span>      super(fs, wal, confParam, htd, rsServices);<a name="line.6345"></a>
-<span class="sourceLineNo">6346</span>    }<a name="line.6346"></a>
-<span class="sourceLineNo">6347</span><a name="line.6347"></a>
-<span class="sourceLineNo">6348</span>    /**<a name="line.6348"></a>
-<span class="sourceLineNo">6349</span>     * Create HStore instance.<a name="line.6349"></a>
-<span class="sourceLineNo">6350</span>     * @return If Mob is enabled, return HMobStore, otherwise return HStoreForTesting.<a name="line.6350"></a>
-<span class="sourceLineNo">6351</span>     */<a name="line.6351"></a>
-<span class="sourceLineNo">6352</span>    @Override<a name="line.6352"></a>
-<span class="sourceLineNo">6353</span>    protected HStore instantiateHStore(final ColumnFamilyDescriptor family, boolean warmup)<a name="line.6353"></a>
-<span class="sourceLineNo">6354</span>        throws IOException {<a name="line.6354"></a>
-<span class="sourceLineNo">6355</span>      if (family.isMobEnabled()) {<a name="line.6355"></a>
-<span class="sourceLineNo">6356</span>        if (HFile.getFormatVersion(this.conf) &lt; HFile.MIN_FORMAT_VERSION_WITH_TAGS) {<a name="line.6356"></a>
-<span class="sourceLineNo">6357</span>          throw new IOException("A minimum HFile version of " + HFile.MIN_FORMAT_VERSION_WITH_TAGS +<a name="line.6357"></a>
-<span class="sourceLineNo">6358</span>              " is required for MOB feature. Consider setting " + HFile.FORMAT_VERSION_KEY +<a name="line.6358"></a>
-<span class="sourceLineNo">6359</span>              " accordingly.");<a name="line.6359"></a>
-<span class="sourceLineNo">6360</span>        }<a name="line.6360"></a>
-<span class="sourceLineNo">6361</span>        return new HMobStore(this, family, this.conf, warmup);<a name="line.6361"></a>
-<span class="sourceLineNo">6362</span>      }<a name="line.6362"></a>
-<span class="sourceLineNo">6363</span>      return new HStoreForTesting(this, family, this.conf, warmup);<a name="line.6363"></a>
-<span class="sourceLineNo">6364</span>    }<a name="line.6364"></a>
-<span class="sourceLineNo">6365</span>  }<a name="line.6365"></a>
-<span class="sourceLineNo">6366</span><a name="line.6366"></a>
-<span class="sourceLineNo">6367</span>  /**<a name="line.6367"></a>
-<span class="sourceLineNo">6368</span>   * HStoreForTesting is merely the same as HStore, the difference is in the doCompaction method<a name="line.6368"></a>
-<span class="sourceLineNo">6369</span>   * of HStoreForTesting there is a checkpoint "hbase.hstore.compaction.complete" which<a name="line.6369"></a>
-<span class="sourceLineNo">6370</span>   * doesn't let hstore compaction complete. In the former edition, this config is set in<a name="line.6370"></a>
-<span class="sourceLineNo">6371</span>   * HStore class inside compact method, though this is just for testing, otherwise it<a name="line.6371"></a>
-<span class="sourceLineNo">6372</span>   * doesn't do any help. In HBASE-8518, we try to get rid of all "hbase.hstore.compaction.complete"<a name="line.6372"></a>
-<span class="sourceLineNo">6373</span>   * config (except for testing code).<a name="line.6373"></a>
-<span class="sourceLineNo">6374</span>   */<a name="line.6374"></a>
-<span class="sourceLineNo">6375</span>  public static class HStoreForTesting extends HStore {<a name="line.6375"></a>
+<span class="sourceLineNo">6246</span>    } finally {<a name="line.6246"></a>
+<span class="sourceLineNo">6247</span>      try {<a name="line.6247"></a>
+<span class="sourceLineNo">6248</span>        HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.6248"></a>
+<span class="sourceLineNo">6249</span>        CONF.setInt("hbase.regionserver.wal.disruptor.event.count", 16 * 1024);<a name="line.6249"></a>
+<span class="sourceLineNo">6250</span>      } catch (DroppedSnapshotException dse) {<a name="line.6250"></a>
+<span class="sourceLineNo">6251</span>        // We could get this on way out because we interrupt the background flusher and it could<a name="line.6251"></a>
+<span class="sourceLineNo">6252</span>        // fail anywhere causing a DSE over in the background flusher... only it is not properly<a name="line.6252"></a>
+<span class="sourceLineNo">6253</span>        // dealt with so could still be memory hanging out when we get to here -- memory we can't<a name="line.6253"></a>
+<span class="sourceLineNo">6254</span>        // flush because the accounting is 'off' since original DSE.<a name="line.6254"></a>
+<span class="sourceLineNo">6255</span>      }<a name="line.6255"></a>
+<span class="sourceLineNo">6256</span>      this.region = null;<a name="line.6256"></a>
+<span class="sourceLineNo">6257</span>    }<a name="line.6257"></a>
+<span class="sourceLineNo">6258</span>  }<a name="line.6258"></a>
+<span class="sourceLineNo">6259</span><a name="line.6259"></a>
+<span class="sourceLineNo">6260</span>  @Test<a name="line.6260"></a>
+<span class="sourceLineNo">6261</span>  public void testMutateRow_WriteRequestCount() throws Exception {<a name="line.6261"></a>
+<span class="sourceLineNo">6262</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.6262"></a>
+<span class="sourceLineNo">6263</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.6263"></a>
+<span class="sourceLineNo">6264</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.6264"></a>
+<span class="sourceLineNo">6265</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.6265"></a>
+<span class="sourceLineNo">6266</span><a name="line.6266"></a>
+<span class="sourceLineNo">6267</span>    RowMutations rm = new RowMutations(row1);<a name="line.6267"></a>
+<span class="sourceLineNo">6268</span>    Put put = new Put(row1);<a name="line.6268"></a>
+<span class="sourceLineNo">6269</span>    put.addColumn(fam1, qf1, val1);<a name="line.6269"></a>
+<span class="sourceLineNo">6270</span>    rm.add(put);<a name="line.6270"></a>
+<span class="sourceLineNo">6271</span><a name="line.6271"></a>
+<span class="sourceLineNo">6272</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.6272"></a>
+<span class="sourceLineNo">6273</span>    long wrcBeforeMutate = this.region.writeRequestsCount.longValue();<a name="line.6273"></a>
+<span class="sourceLineNo">6274</span>    this.region.mutateRow(rm);<a name="line.6274"></a>
+<span class="sourceLineNo">6275</span>    long wrcAfterMutate = this.region.writeRequestsCount.longValue();<a name="line.6275"></a>
+<span class="sourceLineNo">6276</span>    Assert.assertEquals(wrcBeforeMutate + rm.getMutations().size(), wrcAfterMutate);<a name="line.6276"></a>
+<span class="sourceLineNo">6277</span>  }<a name="line.6277"></a>
+<span class="sourceLineNo">6278</span><a name="line.6278"></a>
+<span class="sourceLineNo">6279</span>  @Test<a name="line.6279"></a>
+<span class="sourceLineNo">6280</span>  public void testBulkLoadReplicationEnabled() throws IOException {<a name="line.6280"></a>
+<span class="sourceLineNo">6281</span>    TEST_UTIL.getConfiguration().setBoolean(HConstants.REPLICATION_BULKLOAD_ENABLE_KEY, true);<a name="line.6281"></a>
+<span class="sourceLineNo">6282</span>    final ServerName serverName = ServerName.valueOf(name.getMethodName(), 100, 42);<a name="line.6282"></a>
+<span class="sourceLineNo">6283</span>    final RegionServerServices rss = spy(TEST_UTIL.createMockRegionServerService(serverName));<a name="line.6283"></a>
+<span class="sourceLineNo">6284</span><a name="line.6284"></a>
+<span class="sourceLineNo">6285</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.6285"></a>
+<span class="sourceLineNo">6286</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.6286"></a>
+<span class="sourceLineNo">6287</span>    HRegionInfo hri = new HRegionInfo(htd.getTableName(),<a name="line.6287"></a>
+<span class="sourceLineNo">6288</span>        HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY);<a name="line.6288"></a>
+<span class="sourceLineNo">6289</span>    region = HRegion.openHRegion(hri, htd, rss.getWAL(hri), TEST_UTIL.getConfiguration(),<a name="line.6289"></a>
+<span class="sourceLineNo">6290</span>        rss, null);<a name="line.6290"></a>
+<span class="sourceLineNo">6291</span><a name="line.6291"></a>
+<span class="sourceLineNo">6292</span>    assertTrue(region.conf.getBoolean(HConstants.REPLICATION_BULKLOAD_ENABLE_KEY, false));<a name="line.6292"></a>
+<span class="sourceLineNo">6293</span>    String plugins = region.conf.get(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY, "");<a name="line.6293"></a>
+<span class="sourceLineNo">6294</span>    String replicationCoprocessorClass = ReplicationObserver.class.getCanonicalName();<a name="line.6294"></a>
+<span class="sourceLineNo">6295</span>    assertTrue(plugins.contains(replicationCoprocessorClass));<a name="line.6295"></a>
+<span class="sourceLineNo">6296</span>    assertTrue(region.getCoprocessorHost().<a name="line.6296"></a>
+<span class="sourceLineNo">6297</span>        getCoprocessors().contains(ReplicationObserver.class.getSimpleName()));<a name="line.6297"></a>
+<span class="sourceLineNo">6298</span>  }<a name="line.6298"></a>
+<span class="sourceLineNo">6299</span><a name="line.6299"></a>
+<span class="sourceLineNo">6300</span>  // make sure region is success close when coprocessor wrong region open failed<a name="line.6300"></a>
+<span class="sourceLineNo">6301</span>  @Test<a name="line.6301"></a>
+<span class="sourceLineNo">6302</span>  public void testOpenRegionFailedMemoryLeak() throws Exception {<a name="line.6302"></a>
+<span class="sourceLineNo">6303</span>    final ServerName serverName = ServerName.valueOf("testOpenRegionFailed", 100, 42);<a name="line.6303"></a>
+<span class="sourceLineNo">6304</span>    final RegionServerServices rss = spy(TEST_UTIL.createMockRegionServerService(serverName));<a name="line.6304"></a>
+<span class="sourceLineNo">6305</span><a name="line.6305"></a>
+<span class="sourceLineNo">6306</span>    HTableDescriptor htd<a name="line.6306"></a>
+<span class="sourceLineNo">6307</span>      = new HTableDescriptor(TableName.valueOf("testOpenRegionFailed"));<a name="line.6307"></a>
+<span class="sourceLineNo">6308</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.6308"></a>
+<span class="sourceLineNo">6309</span>    htd.setValue("COPROCESSOR$1", "hdfs://test/test.jar|test||");<a name="line.6309"></a>
+<span class="sourceLineNo">6310</span><a name="line.6310"></a>
+<span class="sourceLineNo">6311</span>    HRegionInfo hri = new HRegionInfo(htd.getTableName(),<a name="line.6311"></a>
+<span class="sourceLineNo">6312</span>      HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY);<a name="line.6312"></a>
+<span class="sourceLineNo">6313</span>    ScheduledExecutorService executor = CompatibilitySingletonFactory.<a name="line.6313"></a>
+<span class="sourceLineNo">6314</span>      getInstance(MetricsExecutor.class).getExecutor();<a name="line.6314"></a>
+<span class="sourceLineNo">6315</span>    for (int i = 0; i &lt; 20 ; i++) {<a name="line.6315"></a>
+<span class="sourceLineNo">6316</span>      try {<a name="line.6316"></a>
+<span class="sourceLineNo">6317</span>        HRegion.openHRegion(hri, htd, rss.getWAL(hri),<a name="line.6317"></a>
+<span class="sourceLineNo">6318</span>          TEST_UTIL.getConfiguration(), rss, null);<a name="line.6318"></a>
+<span class="sourceLineNo">6319</span>      }catch(Throwable t){<a name="line.6319"></a>
+<span class="sourceLineNo">6320</span>        LOG.info("Expected exception, continue");<a name="line.6320"></a>
+<span class="sourceLineNo">6321</span>      }<a name="line.6321"></a>
+<span class="sourceLineNo">6322</span>    }<a name="line.6322"></a>
+<span class="sourceLineNo">6323</span>    TimeUnit.SECONDS.sleep(MetricsRegionWrapperImpl.PERIOD);<a name="line.6323"></a>
+<span class="sourceLineNo">6324</span>    Field[] fields = ThreadPoolExecutor.class.getDeclaredFields();<a name="line.6324"></a>
+<span class="sourceLineNo">6325</span>    boolean found = false;<a name="line.6325"></a>
+<span class="sourceLineNo">6326</span>    for(Field field : fields){<a name="line.6326"></a>
+<span class="sourceLineNo">6327</span>      if(field.getName().equals("workQueue")){<a name="line.6327"></a>
+<span class="sourceLineNo">6328</span>        field.setAccessible(true);<a name="line.6328"></a>
+<span class="sourceLineNo">6329</span>        BlockingQueue&lt;Runnable&gt; workQueue = (BlockingQueue&lt;Runnable&gt;)field.get(executor);<a name="line.6329"></a>
+<span class="sourceLineNo">6330</span>        //there are still two task not cancel, can not cause to memory lack<a name="line.6330"></a>
+<span class="sourceLineNo">6331</span>        Assert.assertTrue("ScheduledExecutor#workQueue should equals 2, now is " +<a name="line.6331"></a>
+<span class="sourceLineNo">6332</span>          workQueue.size() + ", please check region is close", 2 == workQueue.size());<a name="line.6332"></a>
+<span class="sourceLineNo">6333</span>        found = true;<a name="line.6333"></a>
+<span class="sourceLineNo">6334</span>      }<a name="line.6334"></a>
+<span class="sourceLineNo">6335</span>    }<a name="line.6335"></a>
+<span class="sourceLineNo">6336</span>    Assert.assertTrue("can not find workQueue, test failed", found);<a name="line.6336"></a>
+<span class="sourceLineNo">6337</span>  }<a name="line.6337"></a>
+<span class="sourceLineNo">6338</span><a name="line.6338"></a>
+<span class="sourceLineNo">6339</span>  /**<a name="line.6339"></a>
+<span class="sourceLineNo">6340</span>   * The same as HRegion class, the only difference is that instantiateHStore will<a name="line.6340"></a>
+<span class="sourceLineNo">6341</span>   * create a different HStore - HStoreForTesting. [HBASE-8518]<a name="line.6341"></a>
+<span class="sourceLineNo">6342</span>   */<a name="line.6342"></a>
+<span class="sourceLineNo">6343</span>  public static class HRegionForTesting extends HRegion {<a name="line.6343"></a>
+<span class="sourceLineNo">6344</span><a name="line.6344"></a>
+<span class="sourceLineNo">6345</span>    public HRegionForTesting(final Path tableDir, final WAL wal, final FileSystem fs,<a name="line.6345"></a>
+<span class="sourceLineNo">6346</span>                             final Configuration confParam, final RegionInfo regionInfo,<a name="line.6346"></a>
+<span class="sourceLineNo">6347</span>                             final TableDescriptor htd, final RegionServerServices rsServices) {<a name="line.6347"></a>
+<span class="sourceLineNo">6348</span>      this(new HRegionFileSystem(confParam, fs, tableDir, regionInfo),<a name="line.6348"></a>
+<span class="sourceLineNo">6349</span>          wal, confParam, htd, rsServices);<a name="line.6349"></a>
+<span class="sourceLineNo">6350</span>    }<a name="line.6350"></a>
+<span class="sourceLineNo">6351</span><a name="line.6351"></a>
+<span class="sourceLineNo">6352</span>    public HRegionForTesting(HRegionFileSystem fs, WAL wal,<a name="line.6352"></a>
+<span class="sourceLineNo">6353</span>                             Configuration confParam, TableDescriptor htd,<a name="line.6353"></a>
+<span class="sourceLineNo">6354</span>                             RegionServerServices rsServices) {<a name="line.6354"></a>
+<span class="sourceLineNo">6355</span>      super(fs, wal, confParam, htd, rsServices);<a name="line.6355"></a>
+<span class="sourceLineNo">6356</span>    }<a name="line.6356"></a>
+<span class="sourceLineNo">6357</span><a name="line.6357"></a>
+<span class="sourceLineNo">6358</span>    /**<a name="line.6358"></a>
+<span class="sourceLineNo">6359</span>     * Create HStore instance.<a name="line.6359"></a>
+<span class="sourceLineNo">6360</span>     * @return If Mob is enabled, return HMobStore, otherwise return HStoreForTesting.<a name="line.6360"></a>
+<span class="sourceLineNo">6361</span>     */<a name="line.6361"></a>
+<span class="sourceLineNo">6362</span>    @Override<a name="line.6362"></a>
+<span class="sourceLineNo">6363</span>    protected HStore instantiateHStore(final ColumnFamilyDescriptor family, boolean warmup)<a name="line.6363"></a>
+<span class="sourceLineNo">6364</span>        throws IOException {<a name="line.6364"></a>
+<span class="sourceLineNo">6365</span>      if (family.isMobEnabled()) {<a name="line.6365"></a>
+<span class="sourceLineNo">6366</span>        if (HFile.getFormatVersion(this.conf) &lt; HFile.MIN_FORMAT_VERSION_WITH_TAGS) {<a name="line.6366"></a>
+<span class="sourceLineNo">6367</span>          throw new IOException("A minimum HFile version of " + HFile.MIN_FORMAT_VERSION_WITH_TAGS +<a name="line.6367"></a>
+<span class="sourceLineNo">6368</span>              " is required for MOB feature. Consider setting " + HFile.FORMAT_VERSION_KEY +<a name="line.6368"></a>
+<span class="sourceLineNo">6369</span>              " accordingly.");<a name="line.6369"></a>
+<span class="sourceLineNo">6370</span>        }<a name="line.6370"></a>
+<span class="sourceLineNo">6371</span>        return new HMobStore(this, family, this.conf, warmup);<a name="line.6371"></a>
+<span class="sourceLineNo">6372</span>      }<a name="line.6372"></a>
+<span class="sourceLineNo">6373</span>      return new HStoreForTesting(this, family, this.conf, warmup);<a name="line.6373"></a>
+<span class="sourceLineNo">6374</span>    }<a name="line.6374"></a>
+<span class="sourceLineNo">6375</span>  }<a name="line.6375"></a>
 <span class="sourceLineNo">6376</span><a name="line.6376"></a>
-<span class="sourceLineNo">6377</span>    protected HStoreForTesting(final HRegion region,<a name="line.6377"></a>
-<span class="sourceLineNo">6378</span>        final ColumnFamilyDescriptor family,<a name="line.6378"></a>
-<span class="sourceLineNo">6379</span>        final Configuration confParam, boolean warmup) throws IOException {<a name="line.6379"></a>
-<span class="sourceLineNo">6380</span>      super(region, family, confParam, warmup);<a name="line.6380"></a>
-<span class="sourceLineNo">6381</span>    }<a name="line.6381"></a>
-<span class="sourceLineNo">6382</span><a name="line.6382"></a>
-<span class="sourceLineNo">6383</span>    @Override<a name="line.6383"></a>
-<span class="sourceLineNo">6384</span>    protected List&lt;HStoreFile&gt; doCompaction(CompactionRequestImpl cr,<a name="line.6384"></a>
-<span class="sourceLineNo">6385</span>        Collection&lt;HStoreFile&gt; filesToCompact, User user, long compactionStartTime,<a name="line.6385"></a>
-<span class="sourceLineNo">6386</span>        List&lt;Path&gt; newFiles) throws IOException {<a name="line.6386"></a>
-<span class="sourceLineNo">6387</span>      // let compaction incomplete.<a name="line.6387"></a>
-<span class="sourceLineNo">6388</span>      if (!this.conf.getBoolean("hbase.hstore.compaction.complete", true)) {<a name="line.6388"></a>
-<span class="sourceLineNo">6389</span>        LOG.warn("hbase.hstore.compaction.complete is set to false");<a name="line.6389"></a>
-<span class="sourceLineNo">6390</span>        List&lt;HStoreFile&gt; sfs = new ArrayList&lt;&gt;(newFiles.size());<a name="line.6390"></a>
-<span class="sourceLineNo">6391</span>        final boolean evictOnClose =<a name="line.6391"></a>
-<span class="sourceLineNo">6392</span>            cacheConf != null? cacheConf.shouldEvictOnClose(): true;<a name="line.6392"></a>
-<span class="sourceLineNo">6393</span>        for (Path newFile : newFiles) {<a name="line.6393"></a>
-<span class="sourceLineNo">6394</span>          // Create storefile around what we wrote with a reader on it.<a name="line.6394"></a>
-<span class="sourceLineNo">6395</span>          HStoreFile sf = createStoreFileAndReader(newFile);<a name="line.6395"></a>
-<span class="sourceLineNo">6396</span>          sf.closeStoreFile(evictOnClose);<a name="line.6396"></a>
-<span class="sourceLineNo">6397</span>          sfs.add(sf);<a name="line.6397"></a>
-<span class="sourceLineNo">6398</span>        }<a name="line.6398"></a>
-<span class="sourceLineNo">6399</span>        return sfs;<a name="line.6399"></a>
-<span class="sourceLineNo">6400</span>      }<a name="line.6400"></a>
-<span class="sourceLineNo">6401</span>      return super.doCompaction(cr, filesToCompact, user, compactionStartTime, newFiles);<a name="line.6401"></a>
-<span class="sourceLineNo">6402</span>    }<a name="line.6402"></a>
-<span class="sourceLineNo">6403</span>  }<a name="line.6403"></a>
-<span class="sourceLineNo">6404</span>}<a name="line.6404"></a>
+<span class="sourceLineNo">6377</span>  /**<a name="line.6377"></a>
+<span class="sourceLineNo">6378</span>   * HStoreForTesting is merely the same as HStore, the difference is in the doCompaction method<a name="line.6378"></a>
+<span class="sourceLineNo">6379</span>   * of HStoreForTesting there is a checkpoint "hbase.hstore.compaction.complete" which<a name="line.6379"></a>
+<span class="sourceLineNo">6380</span>   * doesn't let hstore compaction complete. In the former edition, this config is set in<a name="line.6380"></a>
+<span class="sourceLineNo">6381</span>   * HStore class inside compact method, though this is just for testing, otherwise it<a name="line.6381"></a>
+<span class="sourceLineNo">6382</span>   * doesn't do any help. In HBASE-8518, we try to get rid of all "hbase.hstore.compaction.complete"<a name="line.6382"></a>
+<span class="sourceLineNo">6383</span>   * config (except for testing code).<a name="line.6383"></a>
+<span class="sourceLineNo">6384</span>   */<a name="line.6384"></a>
+<span class="sourceLineNo">6385</span>  public static class HStoreForTesting extends HStore {<a name="line.6385"></a>
+<span class="sourceLineNo">6386</span><a name="line.6386"></a>
+<span class="sourceLineNo">6387</span>    protected HStoreForTesting(final HRegion region,<a name="line.6387"></a>
+<span class="sourceLineNo">6388</span>        final ColumnFamilyDescriptor family,<a name="line.6388"></a>
+<span class="sourceLineNo">6389</span>        final Configuration confParam, boolean warmup) throws IOException {<a name="line.6389"></a>
+<span class="sourceLineNo">6390</span>      super(region, family, confParam, warmup);<a name="line.6390"></a>
+<span class="sourceLineNo">6391</span>    }<a name="line.6391"></a>
+<span class="sourceLineNo">6392</span><a name="line.6392"></a>
+<span class="sourceLineNo">6393</span>    @Override<a name="line.6393"></a>
+<span class="sourceLineNo">6394</span>    protected List&lt;HStoreFile&gt; doCompaction(CompactionRequestImpl cr,<a name="line.6394"></a>
+<span class="sourceLineNo">6395</span>        Collection&lt;HStoreFile&gt; filesToCompact, User user, long compactionStartTime,<a name="line.6395"></a>
+<span class="sourceLineNo">6396</span>        List&lt;Path&gt; newFiles) throws IOException {<a name="line.6396"></a>
+<span class="sourceLineNo">6397</span>      // let compaction incomplete.<a name="line.6397"></a>
+<span class="sourceLineNo">6398</span>      if (!this.conf.getBoolean("hbase.hstore.compaction.complete", true)) {<a name="line.6398"></a>
+<span class="sourceLineNo">6399</span>        LOG.warn("hbase.hstore.compaction.complete is set to false");<a name="line.6399"></a>
+<span class="sourceLineNo">6400</span>        List&lt;HStoreFile&gt; sfs = new ArrayList&lt;&gt;(newFiles.size());<a name="line.6400"></a>
+<span class="sourceLineNo">6401</span>        final boolean evictOnClose =<a name="line.6401"></a>
+<span class="sourceLineNo">6402</span>            cacheConf != null? cacheConf.shouldEvictOnClose(): true;<a name="line.6402"></a>
+<span class="sourceLineNo">6403</span>        for (Path newFile : newFiles) {<a name="line.6403"></a>
+<span class="sourceLineNo">6404</span>          // Create storefile around what we wrote with a reader on it.<a name="line.6404"></a>
+<span class="sourceLineNo">6405</span>          HStoreFile sf = createStoreFileAndReader(newFile);<a name="line.6405"></a>
+<span class="sourceLineNo">6406</span>          sf.closeStoreFile(evictOnClose);<a name="line.6406"></a>
+<span class="sourceLineNo">6407</span>          sfs.add(sf);<a name="line.6407"></a>
+<span class="sourceLineNo">6408</span>        }<a name="line.6408"></a>
+<span class="sourceLineNo">6409</span>        return sfs;<a name="line.6409"></a>
+<span class="sourceLineNo">6410</span>      }<a name="line.6410"></a>
+<span class="sourceLineNo">6411</span>      return super.doCompaction(cr, filesToCompact, user, compactionStartTime, newFiles);<a name="line.6411"></a>
+<span class="sourceLineNo">6412</span>    }<a name="line.6412"></a>
+<span class="sourceLineNo">6413</span>  }<a name="line.6413"></a>
+<span class="sourceLineNo">6414</span>}<a name="line.6414"></a>
 
 
 
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.FlushThread.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.FlushThread.html
index ddde350..77be719 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.FlushThread.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.FlushThread.html
@@ -112,68 +112,68 @@
 <span class="sourceLineNo">104</span>import org.apache.hadoop.hbase.Waiter;<a name="line.104"></a>
 <span class="sourceLineNo">105</span>import org.apache.hadoop.hbase.client.Append;<a name="line.105"></a>
 <span class="sourceLineNo">106</span>import org.apache.hadoop.hbase.client.ColumnFamilyDescriptor;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.apache.hadoop.hbase.client.Get;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.110"></a>
-<span class="sourceLineNo">111</span>import org.apache.hadoop.hbase.client.Mutation;<a name="line.111"></a>
-<span class="sourceLineNo">112</span>import org.apache.hadoop.hbase.client.Put;<a name="line.112"></a>
-<span class="sourceLineNo">113</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.113"></a>
-<span class="sourceLineNo">114</span>import org.apache.hadoop.hbase.client.RegionInfoBuilder;<a name="line.114"></a>
-<span class="sourceLineNo">115</span>import org.apache.hadoop.hbase.client.Result;<a name="line.115"></a>
-<span class="sourceLineNo">116</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.116"></a>
-<span class="sourceLineNo">117</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.117"></a>
-<span class="sourceLineNo">118</span>import org.apache.hadoop.hbase.client.Table;<a name="line.118"></a>
-<span class="sourceLineNo">119</span>import org.apache.hadoop.hbase.client.TableDescriptor;<a name="line.119"></a>
-<span class="sourceLineNo">120</span>import org.apache.hadoop.hbase.coprocessor.CoprocessorHost;<a name="line.120"></a>
-<span class="sourceLineNo">121</span>import org.apache.hadoop.hbase.exceptions.FailedSanityCheckException;<a name="line.121"></a>
-<span class="sourceLineNo">122</span>import org.apache.hadoop.hbase.filter.BigDecimalComparator;<a name="line.122"></a>
-<span class="sourceLineNo">123</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.123"></a>
-<span class="sourceLineNo">124</span>import org.apache.hadoop.hbase.filter.ColumnCountGetFilter;<a name="line.124"></a>
-<span class="sourceLineNo">125</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.125"></a>
-<span class="sourceLineNo">126</span>import org.apache.hadoop.hbase.filter.FilterBase;<a name="line.126"></a>
-<span class="sourceLineNo">127</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.127"></a>
-<span class="sourceLineNo">128</span>import org.apache.hadoop.hbase.filter.NullComparator;<a name="line.128"></a>
-<span class="sourceLineNo">129</span>import org.apache.hadoop.hbase.filter.PrefixFilter;<a name="line.129"></a>
-<span class="sourceLineNo">130</span>import org.apache.hadoop.hbase.filter.SingleColumnValueExcludeFilter;<a name="line.130"></a>
-<span class="sourceLineNo">131</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.131"></a>
-<span class="sourceLineNo">132</span>import org.apache.hadoop.hbase.filter.SubstringComparator;<a name="line.132"></a>
-<span class="sourceLineNo">133</span>import org.apache.hadoop.hbase.filter.ValueFilter;<a name="line.133"></a>
-<span class="sourceLineNo">134</span>import org.apache.hadoop.hbase.io.hfile.HFile;<a name="line.134"></a>
-<span class="sourceLineNo">135</span>import org.apache.hadoop.hbase.monitoring.MonitoredRPCHandler;<a name="line.135"></a>
-<span class="sourceLineNo">136</span>import org.apache.hadoop.hbase.monitoring.MonitoredTask;<a name="line.136"></a>
-<span class="sourceLineNo">137</span>import org.apache.hadoop.hbase.monitoring.TaskMonitor;<a name="line.137"></a>
-<span class="sourceLineNo">138</span>import org.apache.hadoop.hbase.regionserver.HRegion.MutationBatchOperation;<a name="line.138"></a>
-<span class="sourceLineNo">139</span>import org.apache.hadoop.hbase.regionserver.HRegion.RegionScannerImpl;<a name="line.139"></a>
-<span class="sourceLineNo">140</span>import org.apache.hadoop.hbase.regionserver.Region.RowLock;<a name="line.140"></a>
-<span class="sourceLineNo">141</span>import org.apache.hadoop.hbase.regionserver.TestHStore.FaultyFileSystem;<a name="line.141"></a>
-<span class="sourceLineNo">142</span>import org.apache.hadoop.hbase.regionserver.compactions.CompactionRequestImpl;<a name="line.142"></a>
-<span class="sourceLineNo">143</span>import org.apache.hadoop.hbase.regionserver.wal.FSHLog;<a name="line.143"></a>
-<span class="sourceLineNo">144</span>import org.apache.hadoop.hbase.regionserver.wal.MetricsWALSource;<a name="line.144"></a>
-<span class="sourceLineNo">145</span>import org.apache.hadoop.hbase.regionserver.wal.WALUtil;<a name="line.145"></a>
-<span class="sourceLineNo">146</span>import org.apache.hadoop.hbase.replication.regionserver.ReplicationObserver;<a name="line.146"></a>
-<span class="sourceLineNo">147</span>import org.apache.hadoop.hbase.security.User;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>import org.apache.hadoop.hbase.test.MetricsAssertHelper;<a name="line.148"></a>
-<span class="sourceLineNo">149</span>import org.apache.hadoop.hbase.testclassification.LargeTests;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>import org.apache.hadoop.hbase.testclassification.VerySlowRegionServerTests;<a name="line.150"></a>
-<span class="sourceLineNo">151</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.151"></a>
-<span class="sourceLineNo">152</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.152"></a>
-<span class="sourceLineNo">153</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManagerTestHelper;<a name="line.153"></a>
-<span class="sourceLineNo">154</span>import org.apache.hadoop.hbase.util.FSUtils;<a name="line.154"></a>
-<span class="sourceLineNo">155</span>import org.apache.hadoop.hbase.util.IncrementingEnvironmentEdge;<a name="line.155"></a>
-<span class="sourceLineNo">156</span>import org.apache.hadoop.hbase.util.ManualEnvironmentEdge;<a name="line.156"></a>
-<span class="sourceLineNo">157</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.157"></a>
-<span class="sourceLineNo">158</span>import org.apache.hadoop.hbase.wal.AbstractFSWALProvider;<a name="line.158"></a>
-<span class="sourceLineNo">159</span>import org.apache.hadoop.hbase.wal.FaultyFSLog;<a name="line.159"></a>
-<span class="sourceLineNo">160</span>import org.apache.hadoop.hbase.wal.NettyAsyncFSWALConfigHelper;<a name="line.160"></a>
-<span class="sourceLineNo">161</span>import org.apache.hadoop.hbase.wal.WAL;<a name="line.161"></a>
-<span class="sourceLineNo">162</span>import org.apache.hadoop.hbase.wal.WALEdit;<a name="line.162"></a>
-<span class="sourceLineNo">163</span>import org.apache.hadoop.hbase.wal.WALFactory;<a name="line.163"></a>
-<span class="sourceLineNo">164</span>import org.apache.hadoop.hbase.wal.WALKeyImpl;<a name="line.164"></a>
-<span class="sourceLineNo">165</span>import org.apache.hadoop.hbase.wal.WALProvider;<a name="line.165"></a>
-<span class="sourceLineNo">166</span>import org.apache.hadoop.hbase.wal.WALProvider.Writer;<a name="line.166"></a>
-<span class="sourceLineNo">167</span>import org.apache.hadoop.hbase.wal.WALSplitUtil;<a name="line.167"></a>
-<span class="sourceLineNo">168</span>import org.apache.hadoop.hbase.wal.WALSplitter;<a name="line.168"></a>
+<span class="sourceLineNo">107</span>import org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>import org.apache.hadoop.hbase.client.Get;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.111"></a>
+<span class="sourceLineNo">112</span>import org.apache.hadoop.hbase.client.Mutation;<a name="line.112"></a>
+<span class="sourceLineNo">113</span>import org.apache.hadoop.hbase.client.Put;<a name="line.113"></a>
+<span class="sourceLineNo">114</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.114"></a>
+<span class="sourceLineNo">115</span>import org.apache.hadoop.hbase.client.RegionInfoBuilder;<a name="line.115"></a>
+<span class="sourceLineNo">116</span>import org.apache.hadoop.hbase.client.Result;<a name="line.116"></a>
+<span class="sourceLineNo">117</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.117"></a>
+<span class="sourceLineNo">118</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.118"></a>
+<span class="sourceLineNo">119</span>import org.apache.hadoop.hbase.client.Table;<a name="line.119"></a>
+<span class="sourceLineNo">120</span>import org.apache.hadoop.hbase.client.TableDescriptor;<a name="line.120"></a>
+<span class="sourceLineNo">121</span>import org.apache.hadoop.hbase.coprocessor.CoprocessorHost;<a name="line.121"></a>
+<span class="sourceLineNo">122</span>import org.apache.hadoop.hbase.exceptions.FailedSanityCheckException;<a name="line.122"></a>
+<span class="sourceLineNo">123</span>import org.apache.hadoop.hbase.filter.BigDecimalComparator;<a name="line.123"></a>
+<span class="sourceLineNo">124</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.124"></a>
+<span class="sourceLineNo">125</span>import org.apache.hadoop.hbase.filter.ColumnCountGetFilter;<a name="line.125"></a>
+<span class="sourceLineNo">126</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.126"></a>
+<span class="sourceLineNo">127</span>import org.apache.hadoop.hbase.filter.FilterBase;<a name="line.127"></a>
+<span class="sourceLineNo">128</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.128"></a>
+<span class="sourceLineNo">129</span>import org.apache.hadoop.hbase.filter.NullComparator;<a name="line.129"></a>
+<span class="sourceLineNo">130</span>import org.apache.hadoop.hbase.filter.PrefixFilter;<a name="line.130"></a>
+<span class="sourceLineNo">131</span>import org.apache.hadoop.hbase.filter.SingleColumnValueExcludeFilter;<a name="line.131"></a>
+<span class="sourceLineNo">132</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.132"></a>
+<span class="sourceLineNo">133</span>import org.apache.hadoop.hbase.filter.SubstringComparator;<a name="line.133"></a>
+<span class="sourceLineNo">134</span>import org.apache.hadoop.hbase.filter.ValueFilter;<a name="line.134"></a>
+<span class="sourceLineNo">135</span>import org.apache.hadoop.hbase.io.hfile.HFile;<a name="line.135"></a>
+<span class="sourceLineNo">136</span>import org.apache.hadoop.hbase.monitoring.MonitoredRPCHandler;<a name="line.136"></a>
+<span class="sourceLineNo">137</span>import org.apache.hadoop.hbase.monitoring.MonitoredTask;<a name="line.137"></a>
+<span class="sourceLineNo">138</span>import org.apache.hadoop.hbase.monitoring.TaskMonitor;<a name="line.138"></a>
+<span class="sourceLineNo">139</span>import org.apache.hadoop.hbase.regionserver.HRegion.MutationBatchOperation;<a name="line.139"></a>
+<span class="sourceLineNo">140</span>import org.apache.hadoop.hbase.regionserver.HRegion.RegionScannerImpl;<a name="line.140"></a>
+<span class="sourceLineNo">141</span>import org.apache.hadoop.hbase.regionserver.Region.RowLock;<a name="line.141"></a>
+<span class="sourceLineNo">142</span>import org.apache.hadoop.hbase.regionserver.TestHStore.FaultyFileSystem;<a name="line.142"></a>
+<span class="sourceLineNo">143</span>import org.apache.hadoop.hbase.regionserver.compactions.CompactionRequestImpl;<a name="line.143"></a>
+<span class="sourceLineNo">144</span>import org.apache.hadoop.hbase.regionserver.wal.FSHLog;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>import org.apache.hadoop.hbase.regionserver.wal.MetricsWALSource;<a name="line.145"></a>
+<span class="sourceLineNo">146</span>import org.apache.hadoop.hbase.regionserver.wal.WALUtil;<a name="line.146"></a>
+<span class="sourceLineNo">147</span>import org.apache.hadoop.hbase.replication.regionserver.ReplicationObserver;<a name="line.147"></a>
+<span class="sourceLineNo">148</span>import org.apache.hadoop.hbase.security.User;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>import org.apache.hadoop.hbase.test.MetricsAssertHelper;<a name="line.149"></a>
+<span class="sourceLineNo">150</span>import org.apache.hadoop.hbase.testclassification.LargeTests;<a name="line.150"></a>
+<span class="sourceLineNo">151</span>import org.apache.hadoop.hbase.testclassification.VerySlowRegionServerTests;<a name="line.151"></a>
+<span class="sourceLineNo">152</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.152"></a>
+<span class="sourceLineNo">153</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.153"></a>
+<span class="sourceLineNo">154</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManagerTestHelper;<a name="line.154"></a>
+<span class="sourceLineNo">155</span>import org.apache.hadoop.hbase.util.FSUtils;<a name="line.155"></a>
+<span class="sourceLineNo">156</span>import org.apache.hadoop.hbase.util.IncrementingEnvironmentEdge;<a name="line.156"></a>
+<span class="sourceLineNo">157</span>import org.apache.hadoop.hbase.util.ManualEnvironmentEdge;<a name="line.157"></a>
+<span class="sourceLineNo">158</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.158"></a>
+<span class="sourceLineNo">159</span>import org.apache.hadoop.hbase.wal.AbstractFSWALProvider;<a name="line.159"></a>
+<span class="sourceLineNo">160</span>import org.apache.hadoop.hbase.wal.FaultyFSLog;<a name="line.160"></a>
+<span class="sourceLineNo">161</span>import org.apache.hadoop.hbase.wal.NettyAsyncFSWALConfigHelper;<a name="line.161"></a>
+<span class="sourceLineNo">162</span>import org.apache.hadoop.hbase.wal.WAL;<a name="line.162"></a>
+<span class="sourceLineNo">163</span>import org.apache.hadoop.hbase.wal.WALEdit;<a name="line.163"></a>
+<span class="sourceLineNo">164</span>import org.apache.hadoop.hbase.wal.WALFactory;<a name="line.164"></a>
+<span class="sourceLineNo">165</span>import org.apache.hadoop.hbase.wal.WALKeyImpl;<a name="line.165"></a>
+<span class="sourceLineNo">166</span>import org.apache.hadoop.hbase.wal.WALProvider;<a name="line.166"></a>
+<span class="sourceLineNo">167</span>import org.apache.hadoop.hbase.wal.WALProvider.Writer;<a name="line.167"></a>
+<span class="sourceLineNo">168</span>import org.apache.hadoop.hbase.wal.WALSplitUtil;<a name="line.168"></a>
 <span class="sourceLineNo">169</span>import org.apache.hadoop.metrics2.MetricsExecutor;<a name="line.169"></a>
 <span class="sourceLineNo">170</span>import org.junit.After;<a name="line.170"></a>
 <span class="sourceLineNo">171</span>import org.junit.Assert;<a name="line.171"></a>
@@ -409,6007 +409,6017 @@
 <span class="sourceLineNo">401</span>    String testName = "testMemstoreSizeAccountingWithFailedPostBatchMutate";<a name="line.401"></a>
 <span class="sourceLineNo">402</span>    FileSystem fs = FileSystem.get(CONF);<a name="line.402"></a>
 <span class="sourceLineNo">403</span>    Path rootDir = new Path(dir + testName);<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    FSHLog hLog = new FSHLog(fs, rootDir, testName, CONF);<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    hLog.init();<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, hLog,<a name="line.406"></a>
-<span class="sourceLineNo">407</span>        COLUMN_FAMILY_BYTES);<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    assertEquals(0, region.getMemStoreDataSize());<a name="line.409"></a>
-<span class="sourceLineNo">410</span><a name="line.410"></a>
-<span class="sourceLineNo">411</span>    // Put one value<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    byte [] value = Bytes.toBytes(method);<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    Put put = new Put(value);<a name="line.413"></a>
-<span class="sourceLineNo">414</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.414"></a>
-<span class="sourceLineNo">415</span>    region.put(put);<a name="line.415"></a>
-<span class="sourceLineNo">416</span>    long onePutSize = region.getMemStoreDataSize();<a name="line.416"></a>
-<span class="sourceLineNo">417</span>    assertTrue(onePutSize &gt; 0);<a name="line.417"></a>
-<span class="sourceLineNo">418</span><a name="line.418"></a>
-<span class="sourceLineNo">419</span>    RegionCoprocessorHost mockedCPHost = Mockito.mock(RegionCoprocessorHost.class);<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    doThrow(new IOException())<a name="line.420"></a>
-<span class="sourceLineNo">421</span>       .when(mockedCPHost).postBatchMutate(Mockito.&lt;MiniBatchOperationInProgress&lt;Mutation&gt;&gt;any());<a name="line.421"></a>
-<span class="sourceLineNo">422</span>    region.setCoprocessorHost(mockedCPHost);<a name="line.422"></a>
-<span class="sourceLineNo">423</span><a name="line.423"></a>
-<span class="sourceLineNo">424</span>    put = new Put(value);<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("dfg"), value);<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    try {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      region.put(put);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>      fail("Should have failed with IOException");<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    } catch (IOException expected) {<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    }<a name="line.430"></a>
-<span class="sourceLineNo">431</span>    long expectedSize = onePutSize * 2;<a name="line.431"></a>
-<span class="sourceLineNo">432</span>    assertEquals("memstoreSize should be incremented",<a name="line.432"></a>
-<span class="sourceLineNo">433</span>        expectedSize, region.getMemStoreDataSize());<a name="line.433"></a>
-<span class="sourceLineNo">434</span>    assertEquals("flushable size should be incremented",<a name="line.434"></a>
-<span class="sourceLineNo">435</span>        expectedSize, store.getFlushableSize().getDataSize());<a name="line.435"></a>
-<span class="sourceLineNo">436</span><a name="line.436"></a>
-<span class="sourceLineNo">437</span>    region.setCoprocessorHost(null);<a name="line.437"></a>
-<span class="sourceLineNo">438</span>  }<a name="line.438"></a>
-<span class="sourceLineNo">439</span><a name="line.439"></a>
-<span class="sourceLineNo">440</span>  /**<a name="line.440"></a>
-<span class="sourceLineNo">441</span>   * A test case of HBASE-21041<a name="line.441"></a>
-<span class="sourceLineNo">442</span>   * @throws Exception Exception<a name="line.442"></a>
-<span class="sourceLineNo">443</span>   */<a name="line.443"></a>
-<span class="sourceLineNo">444</span>  @Test<a name="line.444"></a>
-<span class="sourceLineNo">445</span>  public void testFlushAndMemstoreSizeCounting() throws Exception {<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    byte[] family = Bytes.toBytes("family");<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.447"></a>
-<span class="sourceLineNo">448</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.448"></a>
-<span class="sourceLineNo">449</span>    try {<a name="line.449"></a>
-<span class="sourceLineNo">450</span>      for (byte[] row : HBaseTestingUtility.ROWS) {<a name="line.450"></a>
-<span class="sourceLineNo">451</span>        Put put = new Put(row);<a name="line.451"></a>
-<span class="sourceLineNo">452</span>        put.addColumn(family, family, row);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>        region.put(put);<a name="line.453"></a>
-<span class="sourceLineNo">454</span>      }<a name="line.454"></a>
-<span class="sourceLineNo">455</span>      region.flush(true);<a name="line.455"></a>
-<span class="sourceLineNo">456</span>      // After flush, data size should be zero<a name="line.456"></a>
-<span class="sourceLineNo">457</span>      assertEquals(0, region.getMemStoreDataSize());<a name="line.457"></a>
-<span class="sourceLineNo">458</span>      // After flush, a new active mutable segment is created, so the heap size<a name="line.458"></a>
-<span class="sourceLineNo">459</span>      // should equal to MutableSegment.DEEP_OVERHEAD<a name="line.459"></a>
-<span class="sourceLineNo">460</span>      assertEquals(MutableSegment.DEEP_OVERHEAD, region.getMemStoreHeapSize());<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      // After flush, offheap should be zero<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      assertEquals(0, region.getMemStoreOffHeapSize());<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    } finally {<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.464"></a>
-<span class="sourceLineNo">465</span>      this.region = null;<a name="line.465"></a>
-<span class="sourceLineNo">466</span>      wals.close();<a name="line.466"></a>
-<span class="sourceLineNo">467</span>    }<a name="line.467"></a>
-<span class="sourceLineNo">468</span>  }<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>   * Test we do not lose data if we fail a flush and then close.<a name="line.471"></a>
-<span class="sourceLineNo">472</span>   * Part of HBase-10466.  Tests the following from the issue description:<a name="line.472"></a>
-<span class="sourceLineNo">473</span>   * "Bug 1: Wrong calculation of HRegion.memstoreSize: When a flush fails, data to be flushed is<a name="line.473"></a>
-<span class="sourceLineNo">474</span>   * kept in each MemStore's snapshot and wait for next flush attempt to continue on it. But when<a name="line.474"></a>
-<span class="sourceLineNo">475</span>   * the next flush succeeds, the counter of total memstore size in HRegion is always deduced by<a name="line.475"></a>
-<span class="sourceLineNo">476</span>   * the sum of current memstore sizes instead of snapshots left from previous failed flush. This<a name="line.476"></a>
-<span class="sourceLineNo">477</span>   * calculation is problematic that almost every time there is failed flush, HRegion.memstoreSize<a name="line.477"></a>
-<span class="sourceLineNo">478</span>   * gets reduced by a wrong value. If region flush could not proceed for a couple cycles, the size<a name="line.478"></a>
-<span class="sourceLineNo">479</span>   * in current memstore could be much larger than the snapshot. It's likely to drift memstoreSize<a name="line.479"></a>
-<span class="sourceLineNo">480</span>   * much smaller than expected. In extreme case, if the error accumulates to even bigger than<a name="line.480"></a>
-<span class="sourceLineNo">481</span>   * HRegion's memstore size limit, any further flush is skipped because flush does not do anything<a name="line.481"></a>
-<span class="sourceLineNo">482</span>   * if memstoreSize is not larger than 0."<a name="line.482"></a>
-<span class="sourceLineNo">483</span>   * @throws Exception<a name="line.483"></a>
-<span class="sourceLineNo">484</span>   */<a name="line.484"></a>
-<span class="sourceLineNo">485</span>  @Test<a name="line.485"></a>
-<span class="sourceLineNo">486</span>  public void testFlushSizeAccounting() throws Exception {<a name="line.486"></a>
-<span class="sourceLineNo">487</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    // Only retry once.<a name="line.489"></a>
-<span class="sourceLineNo">490</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.490"></a>
-<span class="sourceLineNo">491</span>    final User user =<a name="line.491"></a>
-<span class="sourceLineNo">492</span>      User.createUserForTesting(conf, method, new String[]{"foo"});<a name="line.492"></a>
-<span class="sourceLineNo">493</span>    // Inject our faulty LocalFileSystem<a name="line.493"></a>
-<span class="sourceLineNo">494</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.494"></a>
-<span class="sourceLineNo">495</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.495"></a>
-<span class="sourceLineNo">496</span>      @Override<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      public Object run() throws Exception {<a name="line.497"></a>
-<span class="sourceLineNo">498</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.498"></a>
-<span class="sourceLineNo">499</span>        FileSystem fs = FileSystem.get(conf);<a name="line.499"></a>
-<span class="sourceLineNo">500</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.500"></a>
-<span class="sourceLineNo">501</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.501"></a>
-<span class="sourceLineNo">502</span>        HRegion region = null;<a name="line.502"></a>
-<span class="sourceLineNo">503</span>        try {<a name="line.503"></a>
-<span class="sourceLineNo">504</span>          // Initialize region<a name="line.504"></a>
-<span class="sourceLineNo">505</span>          region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, wal,<a name="line.505"></a>
-<span class="sourceLineNo">506</span>              COLUMN_FAMILY_BYTES);<a name="line.506"></a>
-<span class="sourceLineNo">507</span>          long size = region.getMemStoreDataSize();<a name="line.507"></a>
-<span class="sourceLineNo">508</span>          Assert.assertEquals(0, size);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.509"></a>
-<span class="sourceLineNo">510</span>          Put p1 = new Put(row);<a name="line.510"></a>
-<span class="sourceLineNo">511</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[]) null));<a name="line.511"></a>
-<span class="sourceLineNo">512</span>          region.put(p1);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>          final long sizeOfOnePut = region.getMemStoreDataSize();<a name="line.513"></a>
-<span class="sourceLineNo">514</span>          // Fail a flush which means the current memstore will hang out as memstore 'snapshot'.<a name="line.514"></a>
-<span class="sourceLineNo">515</span>          try {<a name="line.515"></a>
-<span class="sourceLineNo">516</span>            LOG.info("Flushing");<a name="line.516"></a>
-<span class="sourceLineNo">517</span>            region.flush(true);<a name="line.517"></a>
-<span class="sourceLineNo">518</span>            Assert.fail("Didn't bubble up IOE!");<a name="line.518"></a>
-<span class="sourceLineNo">519</span>          } catch (DroppedSnapshotException dse) {<a name="line.519"></a>
-<span class="sourceLineNo">520</span>            // What we are expecting<a name="line.520"></a>
-<span class="sourceLineNo">521</span>            region.closing.set(false); // this is needed for the rest of the test to work<a name="line.521"></a>
-<span class="sourceLineNo">522</span>          }<a name="line.522"></a>
-<span class="sourceLineNo">523</span>          // Make it so all writes succeed from here on out<a name="line.523"></a>
-<span class="sourceLineNo">524</span>          ffs.fault.set(false);<a name="line.524"></a>
-<span class="sourceLineNo">525</span>          // Check sizes.  Should still be the one entry.<a name="line.525"></a>
-<span class="sourceLineNo">526</span>          Assert.assertEquals(sizeOfOnePut, region.getMemStoreDataSize());<a name="line.526"></a>
-<span class="sourceLineNo">527</span>          // Now add two entries so that on this next flush that fails, we can see if we<a name="line.527"></a>
-<span class="sourceLineNo">528</span>          // subtract the right amount, the snapshot size only.<a name="line.528"></a>
-<span class="sourceLineNo">529</span>          Put p2 = new Put(row);<a name="line.529"></a>
-<span class="sourceLineNo">530</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.530"></a>
-<span class="sourceLineNo">531</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.531"></a>
-<span class="sourceLineNo">532</span>          region.put(p2);<a name="line.532"></a>
-<span class="sourceLineNo">533</span>          long expectedSize = sizeOfOnePut * 3;<a name="line.533"></a>
-<span class="sourceLineNo">534</span>          Assert.assertEquals(expectedSize, region.getMemStoreDataSize());<a name="line.534"></a>
-<span class="sourceLineNo">535</span>          // Do a successful flush.  It will clear the snapshot only.  Thats how flushes work.<a name="line.535"></a>
-<span class="sourceLineNo">536</span>          // If already a snapshot, we clear it else we move the memstore to be snapshot and flush<a name="line.536"></a>
-<span class="sourceLineNo">537</span>          // it<a name="line.537"></a>
-<span class="sourceLineNo">538</span>          region.flush(true);<a name="line.538"></a>
-<span class="sourceLineNo">539</span>          // Make sure our memory accounting is right.<a name="line.539"></a>
-<span class="sourceLineNo">540</span>          Assert.assertEquals(sizeOfOnePut * 2, region.getMemStoreDataSize());<a name="line.540"></a>
-<span class="sourceLineNo">541</span>        } finally {<a name="line.541"></a>
-<span class="sourceLineNo">542</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.542"></a>
-<span class="sourceLineNo">543</span>        }<a name="line.543"></a>
-<span class="sourceLineNo">544</span>        return null;<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>    FileSystem.closeAllForUGI(user.getUGI());<a name="line.547"></a>
-<span class="sourceLineNo">548</span>  }<a name="line.548"></a>
-<span class="sourceLineNo">549</span><a name="line.549"></a>
-<span class="sourceLineNo">550</span>  @Test<a name="line.550"></a>
-<span class="sourceLineNo">551</span>  public void testCloseWithFailingFlush() throws Exception {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    // Only retry once.<a name="line.554"></a>
-<span class="sourceLineNo">555</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.555"></a>
-<span class="sourceLineNo">556</span>    final User user =<a name="line.556"></a>
-<span class="sourceLineNo">557</span>      User.createUserForTesting(conf, this.method, new String[]{"foo"});<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    // Inject our faulty LocalFileSystem<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      @Override<a name="line.561"></a>
-<span class="sourceLineNo">562</span>      public Object run() throws Exception {<a name="line.562"></a>
-<span class="sourceLineNo">563</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.563"></a>
-<span class="sourceLineNo">564</span>        FileSystem fs = FileSystem.get(conf);<a name="line.564"></a>
-<span class="sourceLineNo">565</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.565"></a>
-<span class="sourceLineNo">566</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.566"></a>
-<span class="sourceLineNo">567</span>        HRegion region = null;<a name="line.567"></a>
-<span class="sourceLineNo">568</span>        try {<a name="line.568"></a>
-<span class="sourceLineNo">569</span>          // Initialize region<a name="line.569"></a>
-<span class="sourceLineNo">570</span>          region = initHRegion(tableName, null, null, false,<a name="line.570"></a>
-<span class="sourceLineNo">571</span>              Durability.SYNC_WAL, wal, COLUMN_FAMILY_BYTES);<a name="line.571"></a>
-<span class="sourceLineNo">572</span>          long size = region.getMemStoreDataSize();<a name="line.572"></a>
-<span class="sourceLineNo">573</span>          Assert.assertEquals(0, size);<a name="line.573"></a>
-<span class="sourceLineNo">574</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.574"></a>
-<span class="sourceLineNo">575</span>          Put p1 = new Put(row);<a name="line.575"></a>
-<span class="sourceLineNo">576</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[])null));<a name="line.576"></a>
-<span class="sourceLineNo">577</span>          region.put(p1);<a name="line.577"></a>
-<span class="sourceLineNo">578</span>          // Manufacture an outstanding snapshot -- fake a failed flush by doing prepare step only.<a name="line.578"></a>
-<span class="sourceLineNo">579</span>          HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>          StoreFlushContext storeFlushCtx =<a name="line.580"></a>
-<span class="sourceLineNo">581</span>              store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY);<a name="line.581"></a>
-<span class="sourceLineNo">582</span>          storeFlushCtx.prepare();<a name="line.582"></a>
-<span class="sourceLineNo">583</span>          // Now add two entries to the foreground memstore.<a name="line.583"></a>
-<span class="sourceLineNo">584</span>          Put p2 = new Put(row);<a name="line.584"></a>
-<span class="sourceLineNo">585</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.585"></a>
-<span class="sourceLineNo">586</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.586"></a>
-<span class="sourceLineNo">587</span>          region.put(p2);<a name="line.587"></a>
-<span class="sourceLineNo">588</span>          // Now try close on top of a failing flush.<a name="line.588"></a>
-<span class="sourceLineNo">589</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.589"></a>
-<span class="sourceLineNo">590</span>          region = null;<a name="line.590"></a>
-<span class="sourceLineNo">591</span>          fail();<a name="line.591"></a>
-<span class="sourceLineNo">592</span>        } catch (DroppedSnapshotException dse) {<a name="line.592"></a>
-<span class="sourceLineNo">593</span>          // Expected<a name="line.593"></a>
-<span class="sourceLineNo">594</span>          LOG.info("Expected DroppedSnapshotException");<a name="line.594"></a>
-<span class="sourceLineNo">595</span>        } finally {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>          // Make it so all writes succeed from here on out so can close clean<a name="line.596"></a>
-<span class="sourceLineNo">597</span>          ffs.fault.set(false);<a name="line.597"></a>
-<span class="sourceLineNo">598</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.598"></a>
-<span class="sourceLineNo">599</span>        }<a name="line.599"></a>
-<span class="sourceLineNo">600</span>        return null;<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      }<a name="line.601"></a>
-<span class="sourceLineNo">602</span>    });<a name="line.602"></a>
-<span class="sourceLineNo">603</span>    FileSystem.closeAllForUGI(user.getUGI());<a name="line.603"></a>
-<span class="sourceLineNo">604</span>  }<a name="line.604"></a>
-<span class="sourceLineNo">605</span><a name="line.605"></a>
-<span class="sourceLineNo">606</span>  @Test<a name="line.606"></a>
-<span class="sourceLineNo">607</span>  public void testCompactionAffectedByScanners() throws Exception {<a name="line.607"></a>
-<span class="sourceLineNo">608</span>    byte[] family = Bytes.toBytes("family");<a name="line.608"></a>
-<span class="sourceLineNo">609</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.609"></a>
-<span class="sourceLineNo">610</span><a name="line.610"></a>
-<span class="sourceLineNo">611</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.612"></a>
-<span class="sourceLineNo">613</span>    region.put(put);<a name="line.613"></a>
-<span class="sourceLineNo">614</span>    region.flush(true);<a name="line.614"></a>
-<span class="sourceLineNo">615</span><a name="line.615"></a>
-<span class="sourceLineNo">616</span>    Scan scan = new Scan();<a name="line.616"></a>
-<span class="sourceLineNo">617</span>    scan.setMaxVersions(3);<a name="line.617"></a>
-<span class="sourceLineNo">618</span>    // open the first scanner<a name="line.618"></a>
-<span class="sourceLineNo">619</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.619"></a>
-<span class="sourceLineNo">620</span><a name="line.620"></a>
-<span class="sourceLineNo">621</span>    Delete delete = new Delete(Bytes.toBytes("r1"));<a name="line.621"></a>
-<span class="sourceLineNo">622</span>    region.delete(delete);<a name="line.622"></a>
-<span class="sourceLineNo">623</span>    region.flush(true);<a name="line.623"></a>
-<span class="sourceLineNo">624</span><a name="line.624"></a>
-<span class="sourceLineNo">625</span>    // open the second scanner<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    RegionScanner scanner2 = region.getScanner(scan);<a name="line.626"></a>
-<span class="sourceLineNo">627</span><a name="line.627"></a>
-<span class="sourceLineNo">628</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.628"></a>
-<span class="sourceLineNo">629</span><a name="line.629"></a>
-<span class="sourceLineNo">630</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.630"></a>
-<span class="sourceLineNo">631</span><a name="line.631"></a>
-<span class="sourceLineNo">632</span>    // make a major compaction<a name="line.632"></a>
-<span class="sourceLineNo">633</span>    region.compact(true);<a name="line.633"></a>
-<span class="sourceLineNo">634</span><a name="line.634"></a>
-<span class="sourceLineNo">635</span>    // open the third scanner<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    RegionScanner scanner3 = region.getScanner(scan);<a name="line.636"></a>
-<span class="sourceLineNo">637</span><a name="line.637"></a>
-<span class="sourceLineNo">638</span>    // get data from scanner 1, 2, 3 after major compaction<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    scanner1.next(results);<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    System.out.println(results);<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    assertEquals(1, results.size());<a name="line.641"></a>
-<span class="sourceLineNo">642</span><a name="line.642"></a>
-<span class="sourceLineNo">643</span>    results.clear();<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    scanner2.next(results);<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    System.out.println(results);<a name="line.645"></a>
-<span class="sourceLineNo">646</span>    assertEquals(0, results.size());<a name="line.646"></a>
-<span class="sourceLineNo">647</span><a name="line.647"></a>
-<span class="sourceLineNo">648</span>    results.clear();<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    scanner3.next(results);<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    System.out.println(results);<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    assertEquals(0, results.size());<a name="line.651"></a>
-<span class="sourceLineNo">652</span>  }<a name="line.652"></a>
-<span class="sourceLineNo">653</span><a name="line.653"></a>
-<span class="sourceLineNo">654</span>  @Test<a name="line.654"></a>
-<span class="sourceLineNo">655</span>  public void testToShowNPEOnRegionScannerReseek() throws Exception {<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    byte[] family = Bytes.toBytes("family");<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.657"></a>
-<span class="sourceLineNo">658</span><a name="line.658"></a>
-<span class="sourceLineNo">659</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.659"></a>
-<span class="sourceLineNo">660</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.660"></a>
-<span class="sourceLineNo">661</span>    region.put(put);<a name="line.661"></a>
-<span class="sourceLineNo">662</span>    put = new Put(Bytes.toBytes("r2"));<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.663"></a>
-<span class="sourceLineNo">664</span>    region.put(put);<a name="line.664"></a>
-<span class="sourceLineNo">665</span>    region.flush(true);<a name="line.665"></a>
-<span class="sourceLineNo">666</span><a name="line.666"></a>
-<span class="sourceLineNo">667</span>    Scan scan = new Scan();<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    scan.setMaxVersions(3);<a name="line.668"></a>
-<span class="sourceLineNo">669</span>    // open the first scanner<a name="line.669"></a>
-<span class="sourceLineNo">670</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.670"></a>
-<span class="sourceLineNo">671</span><a name="line.671"></a>
-<span class="sourceLineNo">672</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.672"></a>
-<span class="sourceLineNo">673</span><a name="line.673"></a>
-<span class="sourceLineNo">674</span>    region.compact(true);<a name="line.674"></a>
-<span class="sourceLineNo">675</span><a name="line.675"></a>
-<span class="sourceLineNo">676</span>    scanner1.reseek(Bytes.toBytes("r2"));<a name="line.676"></a>
-<span class="sourceLineNo">677</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.677"></a>
-<span class="sourceLineNo">678</span>    scanner1.next(results);<a name="line.678"></a>
-<span class="sourceLineNo">679</span>    Cell keyValue = results.get(0);<a name="line.679"></a>
-<span class="sourceLineNo">680</span>    Assert.assertTrue(Bytes.compareTo(CellUtil.cloneRow(keyValue), Bytes.toBytes("r2")) == 0);<a name="line.680"></a>
-<span class="sourceLineNo">681</span>    scanner1.close();<a name="line.681"></a>
-<span class="sourceLineNo">682</span>  }<a name="line.682"></a>
-<span class="sourceLineNo">683</span><a name="line.683"></a>
-<span class="sourceLineNo">684</span>  @Test<a name="line.684"></a>
-<span class="sourceLineNo">685</span>  public void testSkipRecoveredEditsReplay() throws Exception {<a name="line.685"></a>
-<span class="sourceLineNo">686</span>    byte[] family = Bytes.toBytes("family");<a name="line.686"></a>
-<span class="sourceLineNo">687</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.687"></a>
-<span class="sourceLineNo">688</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.688"></a>
-<span class="sourceLineNo">689</span>    try {<a name="line.689"></a>
-<span class="sourceLineNo">690</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.690"></a>
-<span class="sourceLineNo">691</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.691"></a>
-<span class="sourceLineNo">692</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.692"></a>
-<span class="sourceLineNo">693</span><a name="line.693"></a>
-<span class="sourceLineNo">694</span>      Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.694"></a>
-<span class="sourceLineNo">695</span><a name="line.695"></a>
-<span class="sourceLineNo">696</span>      long maxSeqId = 1050;<a name="line.696"></a>
-<span class="sourceLineNo">697</span>      long minSeqId = 1000;<a name="line.697"></a>
-<span class="sourceLineNo">698</span><a name="line.698"></a>
-<span class="sourceLineNo">699</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.699"></a>
-<span class="sourceLineNo">700</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.700"></a>
-<span class="sourceLineNo">701</span>        fs.create(recoveredEdits);<a name="line.701"></a>
-<span class="sourceLineNo">702</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.702"></a>
-<span class="sourceLineNo">703</span><a name="line.703"></a>
-<span class="sourceLineNo">704</span>        long time = System.nanoTime();<a name="line.704"></a>
-<span class="sourceLineNo">705</span>        WALEdit edit = new WALEdit();<a name="line.705"></a>
-<span class="sourceLineNo">706</span>        edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.706"></a>
-<span class="sourceLineNo">707</span>            .toBytes(i)));<a name="line.707"></a>
-<span class="sourceLineNo">708</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.708"></a>
-<span class="sourceLineNo">709</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.709"></a>
-<span class="sourceLineNo">710</span><a name="line.710"></a>
-<span class="sourceLineNo">711</span>        writer.close();<a name="line.711"></a>
-<span class="sourceLineNo">712</span>      }<a name="line.712"></a>
-<span class="sourceLineNo">713</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.713"></a>
-<span class="sourceLineNo">714</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.714"></a>
-<span class="sourceLineNo">715</span>      for (HStore store : region.getStores()) {<a name="line.715"></a>
-<span class="sourceLineNo">716</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), minSeqId - 1);<a name="line.716"></a>
-<span class="sourceLineNo">717</span>      }<a name="line.717"></a>
-<span class="sourceLineNo">718</span>      long seqId = region.replayRecoveredEditsIfAny(maxSeqIdInStores, null, status);<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      assertEquals(maxSeqId, seqId);<a name="line.719"></a>
-<span class="sourceLineNo">720</span>      region.getMVCC().advanceTo(seqId);<a name="line.720"></a>
-<span class="sourceLineNo">721</span>      Get get = new Get(row);<a name="line.721"></a>
-<span class="sourceLineNo">722</span>      Result result = region.get(get);<a name="line.722"></a>
-<span class="sourceLineNo">723</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.723"></a>
-<span class="sourceLineNo">724</span>        List&lt;Cell&gt; kvs = result.getColumnCells(family, Bytes.toBytes(i));<a name="line.724"></a>
-<span class="sourceLineNo">725</span>        assertEquals(1, kvs.size());<a name="line.725"></a>
-<span class="sourceLineNo">726</span>        assertArrayEquals(Bytes.toBytes(i), CellUtil.cloneValue(kvs.get(0)));<a name="line.726"></a>
-<span class="sourceLineNo">727</span>      }<a name="line.727"></a>
-<span class="sourceLineNo">728</span>    } finally {<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      this.region = null;<a name="line.730"></a>
-<span class="sourceLineNo">731</span>      wals.close();<a name="line.731"></a>
-<span class="sourceLineNo">732</span>    }<a name="line.732"></a>
-<span class="sourceLineNo">733</span>  }<a name="line.733"></a>
-<span class="sourceLineNo">734</span><a name="line.734"></a>
-<span class="sourceLineNo">735</span>  @Test<a name="line.735"></a>
-<span class="sourceLineNo">736</span>  public void testSkipRecoveredEditsReplaySomeIgnored() throws Exception {<a name="line.736"></a>
-<span class="sourceLineNo">737</span>    byte[] family = Bytes.toBytes("family");<a name="line.737"></a>
-<span class="sourceLineNo">738</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.738"></a>
-<span class="sourceLineNo">739</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.739"></a>
-<span class="sourceLineNo">740</span>    try {<a name="line.740"></a>
-<span class="sourceLineNo">741</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.741"></a>
-<span class="sourceLineNo">742</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.742"></a>
-<span class="sourceLineNo">743</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.743"></a>
-<span class="sourceLineNo">744</span><a name="line.744"></a>
-<span class="sourceLineNo">745</span>      Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.745"></a>
-<span class="sourceLineNo">746</span><a name="line.746"></a>
-<span class="sourceLineNo">747</span>      long maxSeqId = 1050;<a name="line.747"></a>
-<span class="sourceLineNo">748</span>      long minSeqId = 1000;<a name="line.748"></a>
-<span class="sourceLineNo">749</span><a name="line.749"></a>
-<span class="sourceLineNo">750</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.750"></a>
-<span class="sourceLineNo">751</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.751"></a>
-<span class="sourceLineNo">752</span>        fs.create(recoveredEdits);<a name="line.752"></a>
-<span class="sourceLineNo">753</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.753"></a>
-<span class="sourceLineNo">754</span><a name="line.754"></a>
-<span class="sourceLineNo">755</span>        long time = System.nanoTime();<a name="line.755"></a>
-<span class="sourceLineNo">756</span>        WALEdit edit = new WALEdit();<a name="line.756"></a>
-<span class="sourceLineNo">757</span>        edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.757"></a>
-<span class="sourceLineNo">758</span>            .toBytes(i)));<a name="line.758"></a>
-<span class="sourceLineNo">759</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.759"></a>
-<span class="sourceLineNo">760</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.760"></a>
-<span class="sourceLineNo">761</span><a name="line.761"></a>
-<span class="sourceLineNo">762</span>        writer.close();<a name="line.762"></a>
-<span class="sourceLineNo">763</span>      }<a name="line.763"></a>
-<span class="sourceLineNo">764</span>      long recoverSeqId = 1030;<a name="line.764"></a>
-<span class="sourceLineNo">765</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.766"></a>
-<span class="sourceLineNo">767</span>      for (HStore store : region.getStores()) {<a name="line.767"></a>
-<span class="sourceLineNo">768</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), recoverSeqId - 1);<a name="line.768"></a>
-<span class="sourceLineNo">769</span>      }<a name="line.769"></a>
-<span class="sourceLineNo">770</span>      long seqId = region.replayRecoveredEditsIfAny(maxSeqIdInStores, null, status);<a name="line.770"></a>
-<span class="sourceLineNo">771</span>      assertEquals(maxSeqId, seqId);<a name="line.771"></a>
-<span class="sourceLineNo">772</span>      region.getMVCC().advanceTo(seqId);<a name="line.772"></a>
-<span class="sourceLineNo">773</span>      Get get = new Get(row);<a name="line.773"></a>
-<span class="sourceLineNo">774</span>      Result result = region.get(get);<a name="line.774"></a>
-<span class="sourceLineNo">775</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.775"></a>
-<span class="sourceLineNo">776</span>        List&lt;Cell&gt; kvs = result.getColumnCells(family, Bytes.toBytes(i));<a name="line.776"></a>
-<span class="sourceLineNo">777</span>        if (i &lt; recoverSeqId) {<a name="line.777"></a>
-<span class="sourceLineNo">778</span>          assertEquals(0, kvs.size());<a name="line.778"></a>
-<span class="sourceLineNo">779</span>        } else {<a name="line.779"></a>
-<span class="sourceLineNo">780</span>          assertEquals(1, kvs.size());<a name="line.780"></a>
-<span class="sourceLineNo">781</span>          assertArrayEquals(Bytes.toBytes(i), CellUtil.cloneValue(kvs.get(0)));<a name="line.781"></a>
-<span class="sourceLineNo">782</span>        }<a name="line.782"></a>
-<span class="sourceLineNo">783</span>      }<a name="line.783"></a>
-<span class="sourceLineNo">784</span>    } finally {<a name="line.784"></a>
-<span class="sourceLineNo">785</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.785"></a>
-<span class="sourceLineNo">786</span>      this.region = null;<a name="line.786"></a>
-<span class="sourceLineNo">787</span>      wals.close();<a name="line.787"></a>
-<span class="sourceLineNo">788</span>    }<a name="line.788"></a>
-<span class="sourceLineNo">789</span>  }<a name="line.789"></a>
-<span class="sourceLineNo">790</span><a name="line.790"></a>
-<span class="sourceLineNo">791</span>  @Test<a name="line.791"></a>
-<span class="sourceLineNo">792</span>  public void testSkipRecoveredEditsReplayAllIgnored() throws Exception {<a name="line.792"></a>
-<span class="sourceLineNo">793</span>    byte[] family = Bytes.toBytes("family");<a name="line.793"></a>
-<span class="sourceLineNo">794</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.794"></a>
-<span class="sourceLineNo">795</span>    Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.795"></a>
-<span class="sourceLineNo">796</span>    FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.796"></a>
-<span class="sourceLineNo">797</span><a name="line.797"></a>
-<span class="sourceLineNo">798</span>    Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.798"></a>
-<span class="sourceLineNo">799</span>    for (int i = 1000; i &lt; 1050; i += 10) {<a name="line.799"></a>
-<span class="sourceLineNo">800</span>      Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.800"></a>
-<span class="sourceLineNo">801</span>      FSDataOutputStream dos = fs.create(recoveredEdits);<a name="line.801"></a>
-<span class="sourceLineNo">802</span>      dos.writeInt(i);<a name="line.802"></a>
-<span class="sourceLineNo">803</span>      dos.close();<a name="line.803"></a>
-<span class="sourceLineNo">804</span>    }<a name="line.804"></a>
-<span class="sourceLineNo">805</span>    long minSeqId = 2000;<a name="line.805"></a>
-<span class="sourceLineNo">806</span>    Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", minSeqId - 1));<a name="line.806"></a>
-<span class="sourceLineNo">807</span>    FSDataOutputStream dos = fs.create(recoveredEdits);<a name="line.807"></a>
-<span class="sourceLineNo">808</span>    dos.close();<a name="line.808"></a>
-<span class="sourceLineNo">809</span><a name="line.809"></a>
-<span class="sourceLineNo">810</span>    Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.810"></a>
-<span class="sourceLineNo">811</span>    for (HStore store : region.getStores()) {<a name="line.811"></a>
-<span class="sourceLineNo">812</span>      maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), minSeqId);<a name="line.812"></a>
-<span class="sourceLineNo">813</span>    }<a name="line.813"></a>
-<span class="sourceLineNo">814</span>    long seqId = region.replayRecoveredEditsIfAny(maxSeqIdInStores, null, null);<a name="line.814"></a>
-<span class="sourceLineNo">815</span>    assertEquals(minSeqId, seqId);<a name="line.815"></a>
-<span class="sourceLineNo">816</span>  }<a name="line.816"></a>
-<span class="sourceLineNo">817</span><a name="line.817"></a>
-<span class="sourceLineNo">818</span>  @Test<a name="line.818"></a>
-<span class="sourceLineNo">819</span>  public void testSkipRecoveredEditsReplayTheLastFileIgnored() throws Exception {<a name="line.819"></a>
-<span class="sourceLineNo">820</span>    byte[] family = Bytes.toBytes("family");<a name="line.820"></a>
-<span class="sourceLineNo">821</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.821"></a>
-<span class="sourceLineNo">822</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.822"></a>
-<span class="sourceLineNo">823</span>    try {<a name="line.823"></a>
-<span class="sourceLineNo">824</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.824"></a>
-<span class="sourceLineNo">825</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.825"></a>
-<span class="sourceLineNo">826</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.826"></a>
-<span class="sourceLineNo">827</span>      byte[][] columns = region.getTableDescriptor().getColumnFamilyNames().toArray(new byte[0][]);<a name="line.827"></a>
-<span class="sourceLineNo">828</span><a name="line.828"></a>
-<span class="sourceLineNo">829</span>      assertEquals(0, region.getStoreFileList(columns).size());<a name="line.829"></a>
-<span class="sourceLineNo">830</span><a name="line.830"></a>
-<span class="sourceLineNo">831</span>      Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.831"></a>
-<span class="sourceLineNo">832</span><a name="line.832"></a>
-<span class="sourceLineNo">833</span>      long maxSeqId = 1050;<a name="line.833"></a>
-<span class="sourceLineNo">834</span>      long minSeqId = 1000;<a name="line.834"></a>
-<span class="sourceLineNo">835</span><a name="line.835"></a>
-<span class="sourceLineNo">836</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.836"></a>
-<span class="sourceLineNo">837</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.837"></a>
-<span class="sourceLineNo">838</span>        fs.create(recoveredEdits);<a name="line.838"></a>
-<span class="sourceLineNo">839</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.839"></a>
-<span class="sourceLineNo">840</span><a name="line.840"></a>
-<span class="sourceLineNo">841</span>        long time = System.nanoTime();<a name="line.841"></a>
-<span class="sourceLineNo">842</span>        WALEdit edit = null;<a name="line.842"></a>
-<span class="sourceLineNo">843</span>        if (i == maxSeqId) {<a name="line.843"></a>
-<span class="sourceLineNo">844</span>          edit = WALEdit.createCompaction(region.getRegionInfo(),<a name="line.844"></a>
-<span class="sourceLineNo">845</span>          CompactionDescriptor.newBuilder()<a name="line.845"></a>
-<span class="sourceLineNo">846</span>          .setTableName(ByteString.copyFrom(tableName.getName()))<a name="line.846"></a>
-<span class="sourceLineNo">847</span>          .setFamilyName(ByteString.copyFrom(regionName))<a name="line.847"></a>
-<span class="sourceLineNo">848</span>          .setEncodedRegionName(ByteString.copyFrom(regionName))<a name="line.848"></a>
-<span class="sourceLineNo">849</span>          .setStoreHomeDirBytes(ByteString.copyFrom(Bytes.toBytes(regiondir.toString())))<a name="line.849"></a>
-<span class="sourceLineNo">850</span>          .setRegionName(ByteString.copyFrom(region.getRegionInfo().getRegionName()))<a name="line.850"></a>
-<span class="sourceLineNo">851</span>          .build());<a name="line.851"></a>
-<span class="sourceLineNo">852</span>        } else {<a name="line.852"></a>
-<span class="sourceLineNo">853</span>          edit = new WALEdit();<a name="line.853"></a>
-<span class="sourceLineNo">854</span>          edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.854"></a>
-<span class="sourceLineNo">855</span>            .toBytes(i)));<a name="line.855"></a>
-<span class="sourceLineNo">856</span>        }<a name="line.856"></a>
-<span class="sourceLineNo">857</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.857"></a>
-<span class="sourceLineNo">858</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.858"></a>
-<span class="sourceLineNo">859</span>        writer.close();<a name="line.859"></a>
-<span class="sourceLineNo">860</span>      }<a name="line.860"></a>
-<span class="sourceLineNo">861</span><a name="line.861"></a>
-<span class="sourceLineNo">862</span>      long recoverSeqId = 1030;<a name="line.862"></a>
-<span class="sourceLineNo">863</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.863"></a>
-<span class="sourceLineNo">864</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.864"></a>
-<span class="sourceLineNo">865</span>      for (HStore store : region.getStores()) {<a name="line.865"></a>
-<span class="sourceLineNo">866</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), recoverSeqId - 1);<a name="line.866"></a>
-<span class="sourceLineNo">867</span>      }<a name="line.867"></a>
-<span class="sourceLineNo">868</span>      long seqId = region.replayRecoveredEditsIfAny(maxSeqIdInStores, null, status);<a name="line.868"></a>
-<span class="sourceLineNo">869</span>      assertEquals(maxSeqId, seqId);<a name="line.869"></a>
-<span class="sourceLineNo">870</span><a name="line.870"></a>
-<span class="sourceLineNo">871</span>      // assert that the files are flushed<a name="line.871"></a>
-<span class="sourceLineNo">872</span>      assertEquals(1, region.getStoreFileList(columns).size());<a name="line.872"></a>
-<span class="sourceLineNo">873</span><a name="line.873"></a>
-<span class="sourceLineNo">874</span>    } finally {<a name="line.874"></a>
-<span class="sourceLineNo">875</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.875"></a>
-<span class="sourceLineNo">876</span>      this.region = null;<a name="line.876"></a>
-<span class="sourceLineNo">877</span>      wals.close();<a name="line.877"></a>
-<span class="sourceLineNo">878</span>    }<a name="line.878"></a>
-<span class="sourceLineNo">879</span>  }<a name="line.879"></a>
-<span class="sourceLineNo">880</span><a name="line.880"></a>
-<span class="sourceLineNo">881</span>  @Test<a name="line.881"></a>
-<span class="sourceLineNo">882</span>  public void testRecoveredEditsReplayCompaction() throws Exception {<a name="line.882"></a>
-<span class="sourceLineNo">883</span>    testRecoveredEditsReplayCompaction(false);<a name="line.883"></a>
-<span class="sourceLineNo">884</span>    testRecoveredEditsReplayCompaction(true);<a name="line.884"></a>
-<span class="sourceLineNo">885</span>  }<a name="line.885"></a>
-<span class="sourceLineNo">886</span><a name="line.886"></a>
-<span class="sourceLineNo">887</span>  public void testRecoveredEditsReplayCompaction(boolean mismatchedRegionName) throws Exception {<a name="line.887"></a>
-<span class="sourceLineNo">888</span>    CONF.setClass(HConstants.REGION_IMPL, HRegionForTesting.class, Region.class);<a name="line.888"></a>
-<span class="sourceLineNo">889</span>    byte[] family = Bytes.toBytes("family");<a name="line.889"></a>
-<span class="sourceLineNo">890</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.890"></a>
-<span class="sourceLineNo">891</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.891"></a>
-<span class="sourceLineNo">892</span>    try {<a name="line.892"></a>
-<span class="sourceLineNo">893</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.893"></a>
-<span class="sourceLineNo">894</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.894"></a>
-<span class="sourceLineNo">895</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.895"></a>
-<span class="sourceLineNo">896</span><a name="line.896"></a>
-<span class="sourceLineNo">897</span>      long maxSeqId = 3;<a name="line.897"></a>
-<span class="sourceLineNo">898</span>      long minSeqId = 0;<a name="line.898"></a>
-<span class="sourceLineNo">899</span><a name="line.899"></a>
-<span class="sourceLineNo">900</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.900"></a>
-<span class="sourceLineNo">901</span>        Put put = new Put(Bytes.toBytes(i));<a name="line.901"></a>
-<span class="sourceLineNo">902</span>        put.addColumn(family, Bytes.toBytes(i), Bytes.toBytes(i));<a name="line.902"></a>
-<span class="sourceLineNo">903</span>        region.put(put);<a name="line.903"></a>
-<span class="sourceLineNo">904</span>        region.flush(true);<a name="line.904"></a>
-<span class="sourceLineNo">905</span>      }<a name="line.905"></a>
-<span class="sourceLineNo">906</span><a name="line.906"></a>
-<span class="sourceLineNo">907</span>      // this will create a region with 3 files<a name="line.907"></a>
-<span class="sourceLineNo">908</span>      assertEquals(3, region.getStore(family).getStorefilesCount());<a name="line.908"></a>
-<span class="sourceLineNo">909</span>      List&lt;Path&gt; storeFiles = new ArrayList&lt;&gt;(3);<a name="line.909"></a>
-<span class="sourceLineNo">910</span>      for (HStoreFile sf : region.getStore(family).getStorefiles()) {<a name="line.910"></a>
-<span class="sourceLineNo">911</span>        storeFiles.add(sf.getPath());<a name="line.911"></a>
-<span class="sourceLineNo">912</span>      }<a name="line.912"></a>
-<span class="sourceLineNo">913</span><a name="line.913"></a>
-<span class="sourceLineNo">914</span>      // disable compaction completion<a name="line.914"></a>
-<span class="sourceLineNo">915</span>      CONF.setBoolean("hbase.hstore.compaction.complete", false);<a name="line.915"></a>
-<span class="sourceLineNo">916</span>      region.compactStores();<a name="line.916"></a>
-<span class="sourceLineNo">917</span><a name="line.917"></a>
-<span class="sourceLineNo">918</span>      // ensure that nothing changed<a name="line.918"></a>
-<span class="sourceLineNo">919</span>      assertEquals(3, region.getStore(family).getStorefilesCount());<a name="line.919"></a>
-<span class="sourceLineNo">920</span><a name="line.920"></a>
-<span class="sourceLineNo">921</span>      // now find the compacted file, and manually add it to the recovered edits<a name="line.921"></a>
-<span class="sourceLineNo">922</span>      Path tmpDir = new Path(region.getRegionFileSystem().getTempDir(), Bytes.toString(family));<a name="line.922"></a>
-<span class="sourceLineNo">923</span>      FileStatus[] files = FSUtils.listStatus(fs, tmpDir);<a name="line.923"></a>
-<span class="sourceLineNo">924</span>      String errorMsg = "Expected to find 1 file in the region temp directory "<a name="line.924"></a>
-<span class="sourceLineNo">925</span>          + "from the compaction, could not find any";<a name="line.925"></a>
-<span class="sourceLineNo">926</span>      assertNotNull(errorMsg, files);<a name="line.926"></a>
-<span class="sourceLineNo">927</span>      assertEquals(errorMsg, 1, files.length);<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      // move the file inside region dir<a name="line.928"></a>
-<span class="sourceLineNo">929</span>      Path newFile = region.getRegionFileSystem().commitStoreFile(Bytes.toString(family),<a name="line.929"></a>
-<span class="sourceLineNo">930</span>          files[0].getPath());<a name="line.930"></a>
-<span class="sourceLineNo">931</span><a name="line.931"></a>
-<span class="sourceLineNo">932</span>      byte[] encodedNameAsBytes = this.region.getRegionInfo().getEncodedNameAsBytes();<a name="line.932"></a>
-<span class="sourceLineNo">933</span>      byte[] fakeEncodedNameAsBytes = new byte [encodedNameAsBytes.length];<a name="line.933"></a>
-<span class="sourceLineNo">934</span>      for (int i=0; i &lt; encodedNameAsBytes.length; i++) {<a name="line.934"></a>
-<span class="sourceLineNo">935</span>        // Mix the byte array to have a new encodedName<a name="line.935"></a>
-<span class="sourceLineNo">936</span>        fakeEncodedNameAsBytes[i] = (byte) (encodedNameAsBytes[i] + 1);<a name="line.936"></a>
-<span class="sourceLineNo">937</span>      }<a name="line.937"></a>
-<span class="sourceLineNo">938</span><a name="line.938"></a>
-<span class="sourceLineNo">939</span>      CompactionDescriptor compactionDescriptor = ProtobufUtil.toCompactionDescriptor(this.region<a name="line.939"></a>
-<span class="sourceLineNo">940</span>        .getRegionInfo(), mismatchedRegionName ? fakeEncodedNameAsBytes : null, family,<a name="line.940"></a>
-<span class="sourceLineNo">941</span>            storeFiles, Lists.newArrayList(newFile),<a name="line.941"></a>
-<span class="sourceLineNo">942</span>            region.getRegionFileSystem().getStoreDir(Bytes.toString(family)));<a name="line.942"></a>
-<span class="sourceLineNo">943</span><a name="line.943"></a>
-<span class="sourceLineNo">944</span>      WALUtil.writeCompactionMarker(region.getWAL(), this.region.getReplicationScope(),<a name="line.944"></a>
-<span class="sourceLineNo">945</span>          this.region.getRegionInfo(), compactionDescriptor, region.getMVCC());<a name="line.945"></a>
-<span class="sourceLineNo">946</span><a name="line.946"></a>
-<span class="sourceLineNo">947</span>      Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.947"></a>
-<span class="sourceLineNo">948</span><a name="line.948"></a>
-<span class="sourceLineNo">949</span>      Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", 1000));<a name="line.949"></a>
-<span class="sourceLineNo">950</span>      fs.create(recoveredEdits);<a name="line.950"></a>
-<span class="sourceLineNo">951</span>      WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.951"></a>
-<span class="sourceLineNo">952</span><a name="line.952"></a>
-<span class="sourceLineNo">953</span>      long time = System.nanoTime();<a name="line.953"></a>
-<span class="sourceLineNo">954</span><a name="line.954"></a>
-<span class="sourceLineNo">955</span>      writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, 10, time,<a name="line.955"></a>
-<span class="sourceLineNo">956</span>          HConstants.DEFAULT_CLUSTER_ID), WALEdit.createCompaction(region.getRegionInfo(),<a name="line.956"></a>
-<span class="sourceLineNo">957</span>          compactionDescriptor)));<a name="line.957"></a>
-<span class="sourceLineNo">958</span>      writer.close();<a name="line.958"></a>
-<span class="sourceLineNo">959</span><a name="line.959"></a>
-<span class="sourceLineNo">960</span>      // close the region now, and reopen again<a name="line.960"></a>
-<span class="sourceLineNo">961</span>      region.getTableDescriptor();<a name="line.961"></a>
-<span class="sourceLineNo">962</span>      region.getRegionInfo();<a name="line.962"></a>
-<span class="sourceLineNo">963</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.963"></a>
-<span class="sourceLineNo">964</span>      try {<a name="line.964"></a>
-<span class="sourceLineNo">965</span>        region = HRegion.openHRegion(region, null);<a name="line.965"></a>
-<span class="sourceLineNo">966</span>      } catch (WrongRegionException wre) {<a name="line.966"></a>
-<span class="sourceLineNo">967</span>        fail("Matching encoded region name should not have produced WrongRegionException");<a name="line.967"></a>
-<span class="sourceLineNo">968</span>      }<a name="line.968"></a>
-<span class="sourceLineNo">969</span><a name="line.969"></a>
-<span class="sourceLineNo">970</span>      // now check whether we have only one store file, the compacted one<a name="line.970"></a>
-<span class="sourceLineNo">971</span>      Collection&lt;HStoreFile&gt; sfs = region.getStore(family).getStorefiles();<a name="line.971"></a>
-<span class="sourceLineNo">972</span>      for (HStoreFile sf : sfs) {<a name="line.972"></a>
-<span class="sourceLineNo">973</span>        LOG.info(Objects.toString(sf.getPath()));<a name="line.973"></a>
-<span class="sourceLineNo">974</span>      }<a name="line.974"></a>
-<span class="sourceLineNo">975</span>      if (!mismatchedRegionName) {<a name="line.975"></a>
-<span class="sourceLineNo">976</span>        assertEquals(1, region.getStore(family).getStorefilesCount());<a name="line.976"></a>
-<span class="sourceLineNo">977</span>      }<a name="line.977"></a>
-<span class="sourceLineNo">978</span>      files = FSUtils.listStatus(fs, tmpDir);<a name="line.978"></a>
-<span class="sourceLineNo">979</span>      assertTrue("Expected to find 0 files inside " + tmpDir, files == null || files.length == 0);<a name="line.979"></a>
-<span class="sourceLineNo">980</span><a name="line.980"></a>
-<span class="sourceLineNo">981</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.981"></a>
-<span class="sourceLineNo">982</span>        Get get = new Get(Bytes.toBytes(i));<a name="line.982"></a>
-<span class="sourceLineNo">983</span>        Result result = region.get(get);<a name="line.983"></a>
-<span class="sourceLineNo">984</span>        byte[] value = result.getValue(family, Bytes.toBytes(i));<a name="line.984"></a>
-<span class="sourceLineNo">985</span>        assertArrayEquals(Bytes.toBytes(i), value);<a name="line.985"></a>
-<span class="sourceLineNo">986</span>      }<a name="line.986"></a>
-<span class="sourceLineNo">987</span>    } finally {<a name="line.987"></a>
-<span class="sourceLineNo">988</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.988"></a>
-<span class="sourceLineNo">989</span>      this.region = null;<a name="line.989"></a>
-<span class="sourceLineNo">990</span>      wals.close();<a name="line.990"></a>
-<span class="sourceLineNo">991</span>      CONF.setClass(HConstants.REGION_IMPL, HRegion.class, Region.class);<a name="line.991"></a>
-<span class="sourceLineNo">992</span>    }<a name="line.992"></a>
-<span class="sourceLineNo">993</span>  }<a name="line.993"></a>
-<span class="sourceLineNo">994</span><a name="line.994"></a>
-<span class="sourceLineNo">995</span>  @Test<a name="line.995"></a>
-<span class="sourceLineNo">996</span>  public void testFlushMarkers() throws Exception {<a name="line.996"></a>
-<span class="sourceLineNo">997</span>    // tests that flush markers are written to WAL and handled at recovered edits<a name="line.997"></a>
-<span class="sourceLineNo">998</span>    byte[] family = Bytes.toBytes("family");<a name="line.998"></a>
-<span class="sourceLineNo">999</span>    Path logDir = TEST_UTIL.getDataTestDirOnTestFS(method + ".log");<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>    final Configuration walConf = new Configuration(TEST_UTIL.getConfiguration());<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>    final WALFactory wals = new WALFactory(walConf, method);<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>    final WAL wal = wals.getWAL(RegionInfoBuilder.newBuilder(tableName).build());<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span><a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>    this.region = initHRegion(tableName, HConstants.EMPTY_START_ROW,<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>      HConstants.EMPTY_END_ROW, false, Durability.USE_DEFAULT, wal, family);<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>    try {<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span><a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>      long maxSeqId = 3;<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>      long minSeqId = 0;<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span><a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>        Put put = new Put(Bytes.toBytes(i));<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>        put.addColumn(family, Bytes.toBytes(i), Bytes.toBytes(i));<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>        region.put(put);<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>        region.flush(true);<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>      }<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span><a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>      // this will create a region with 3 files from flush<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>      assertEquals(3, region.getStore(family).getStorefilesCount());<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>      List&lt;String&gt; storeFiles = new ArrayList&lt;&gt;(3);<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>      for (HStoreFile sf : region.getStore(family).getStorefiles()) {<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>        storeFiles.add(sf.getPath().getName());<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>      }<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span><a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>      // now verify that the flush markers are written<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>      wal.shutdown();<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>      WAL.Reader reader = WALFactory.createReader(fs, AbstractFSWALProvider.getCurrentFileName(wal),<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>        TEST_UTIL.getConfiguration());<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>      try {<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>        List&lt;WAL.Entry&gt; flushDescriptors = new ArrayList&lt;&gt;();<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>        long lastFlushSeqId = -1;<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>        while (true) {<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>          WAL.Entry entry = reader.next();<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>          if (entry == null) {<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>            break;<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>          }<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>          Cell cell = entry.getEdit().getCells().get(0);<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>          if (WALEdit.isMetaEditFamily(cell)) {<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>            FlushDescriptor flushDesc = WALEdit.getFlushDescriptor(cell);<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>            assertNotNull(flushDesc);<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>            assertArrayEquals(tableName.getName(), flushDesc.getTableName().toByteArray());<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>            if (flushDesc.getAction() == FlushAction.START_FLUSH) {<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>              assertTrue(flushDesc.getFlushSequenceNumber() &gt; lastFlushSeqId);<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>            } else if (flushDesc.getAction() == FlushAction.COMMIT_FLUSH) {<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>              assertTrue(flushDesc.getFlushSequenceNumber() == lastFlushSeqId);<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>            }<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>            lastFlushSeqId = flushDesc.getFlushSequenceNumber();<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>            assertArrayEquals(regionName, flushDesc.getEncodedRegionName().toByteArray());<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>            assertEquals(1, flushDesc.getStoreFlushesCount()); //only one store<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>            StoreFlushDescriptor storeFlushDesc = flushDesc.getStoreFlushes(0);<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>            assertArrayEquals(family, storeFlushDesc.getFamilyName().toByteArray());<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>            assertEquals("family", storeFlushDesc.getStoreHomeDir());<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>            if (flushDesc.getAction() == FlushAction.START_FLUSH) {<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>              assertEquals(0, storeFlushDesc.getFlushOutputCount());<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>            } else {<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>              assertEquals(1, storeFlushDesc.getFlushOutputCount()); //only one file from flush<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>              assertTrue(storeFiles.contains(storeFlushDesc.getFlushOutput(0)));<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>            }<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span><a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>            flushDescriptors.add(entry);<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>          }<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>        }<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span><a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>        assertEquals(3 * 2, flushDescriptors.size()); // START_FLUSH and COMMIT_FLUSH per flush<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span><a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>        // now write those markers to the recovered edits again.<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span><a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>        Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span><a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", 1000));<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>        fs.create(recoveredEdits);<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span><a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>        for (WAL.Entry entry : flushDescriptors) {<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>          writer.append(entry);<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>        }<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>        writer.close();<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      } finally {<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>        if (null != reader) {<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>          try {<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>            reader.close();<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>          } catch (IOException exception) {<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>            LOG.warn("Problem closing wal: " + exception.getMessage());<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>            LOG.debug("exception details", exception);<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>          }<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>        }<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>      }<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span><a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>      // close the region now, and reopen again<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>      region = HRegion.openHRegion(region, null);<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span><a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>      // now check whether we have can read back the data from region<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>        Get get = new Get(Bytes.toBytes(i));<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>        Result result = region.get(get);<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>        byte[] value = result.getValue(family, Bytes.toBytes(i));<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>        assertArrayEquals(Bytes.toBytes(i), value);<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>      }<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>    } finally {<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>      this.region = null;<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>      wals.close();<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>    }<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>  }<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span><a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>  static class IsFlushWALMarker implements ArgumentMatcher&lt;WALEdit&gt; {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>    volatile FlushAction[] actions;<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>    public IsFlushWALMarker(FlushAction... actions) {<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>      this.actions = actions;<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>    }<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>    @Override<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>    public boolean matches(WALEdit edit) {<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>      List&lt;Cell&gt; cells = edit.getCells();<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>      if (cells.isEmpty()) {<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>        return false;<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>      }<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>      if (WALEdit.isMetaEditFamily(cells.get(0))) {<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>        FlushDescriptor desc;<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>        try {<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>          desc = WALEdit.getFlushDescriptor(cells.get(0));<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>        } catch (IOException e) {<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>          LOG.warn(e.toString(), e);<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>          return false;<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>        }<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>        if (desc != null) {<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>          for (FlushAction action : actions) {<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>            if (desc.getAction() == action) {<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>              return true;<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>            }<a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>          }<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>        }<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>      }<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>      return false;<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>    }<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>    public IsFlushWALMarker set(FlushAction... actions) {<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>      this.actions = actions;<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>      return this;<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>    }<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>  }<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span><a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>  @Test<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>  public void testFlushMarkersWALFail() throws Exception {<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>    // test the cases where the WAL append for flush markers fail.<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>    byte[] family = Bytes.toBytes("family");<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span><a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>    // spy an actual WAL implementation to throw exception (was not able to mock)<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>    Path logDir = TEST_UTIL.getDataTestDirOnTestFS(method + "log");<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span><a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>    final Configuration walConf = new Configuration(TEST_UTIL.getConfiguration());<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>    // Make up a WAL that we can manipulate at append time.<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    class FailAppendFlushMarkerWAL extends FSHLog {<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>      volatile FlushAction [] flushActions = null;<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span><a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>      public FailAppendFlushMarkerWAL(FileSystem fs, Path root, String logDir, Configuration conf)<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>      throws IOException {<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>        super(fs, root, logDir, conf);<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>      }<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span><a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>      @Override<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>      protected Writer createWriterInstance(Path path) throws IOException {<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>        final Writer w = super.createWriterInstance(path);<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>        return new Writer() {<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>          @Override<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>          public void close() throws IOException {<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>            w.close();<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>          }<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span><a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>          @Override<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>          public void sync(boolean forceSync) throws IOException {<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>            w.sync(forceSync);<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>          }<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span><a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>          @Override<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>          public void append(Entry entry) throws IOException {<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>            List&lt;Cell&gt; cells = entry.getEdit().getCells();<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>            if (WALEdit.isMetaEditFamily(cells.get(0))) {<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>              FlushDescriptor desc = WALEdit.getFlushDescriptor(cells.get(0));<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>              if (desc != null) {<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>                for (FlushAction flushAction: flushActions) {<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>                  if (desc.getAction().equals(flushAction)) {<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>                    throw new IOException("Failed to append flush marker! " + flushAction);<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>                  }<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>                }<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>              }<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>            }<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>            w.append(entry);<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>          }<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span><a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>          @Override<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>          public long getLength() {<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>            return w.getLength();<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>          }<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>        };<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>      }<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>    }<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>    FailAppendFlushMarkerWAL wal =<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>      new FailAppendFlushMarkerWAL(FileSystem.get(walConf), FSUtils.getRootDir(walConf),<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>        method, walConf);<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>    wal.init();<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>    this.region = initHRegion(tableName, HConstants.EMPTY_START_ROW,<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>      HConstants.EMPTY_END_ROW, false, Durability.USE_DEFAULT, wal, family);<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>    int i = 0;<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>    Put put = new Put(Bytes.toBytes(i));<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>    put.setDurability(Durability.SKIP_WAL); // have to skip mocked wal<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>    put.addColumn(family, Bytes.toBytes(i), Bytes.toBytes(i));<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>    region.put(put);<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span><a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>    // 1. Test case where START_FLUSH throws exception<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>    wal.flushActions = new FlushAction [] {FlushAction.START_FLUSH};<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span><a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>    // start cache flush will throw exception<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>    try {<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>      region.flush(true);<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>      fail("This should have thrown exception");<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>    } catch (DroppedSnapshotException unexpected) {<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>      // this should not be a dropped snapshot exception. Meaning that RS will not abort<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>      throw unexpected;<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>    } catch (IOException expected) {<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>      // expected<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>    }<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>    // The WAL is hosed now. It has two edits appended. We cannot roll the log without it<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>    // throwing a DroppedSnapshotException to force an abort. Just clean up the mess.<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>    region.close(true);<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>    wal.close();<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span><a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>    // 2. Test case where START_FLUSH succeeds but COMMIT_FLUSH will throw exception<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>    wal.flushActions = new FlushAction [] {FlushAction.COMMIT_FLUSH};<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>    wal = new FailAppendFlushMarkerWAL(FileSystem.get(walConf), FSUtils.getRootDir(walConf),<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>          method, walConf);<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>    wal.init();<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>    this.region = initHRegion(tableName, HConstants.EMPTY_START_ROW,<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>      HConstants.EMPTY_END_ROW, false, Durability.USE_DEFAULT, wal, family);<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    region.put(put);<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span><a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>    // 3. Test case where ABORT_FLUSH will throw exception.<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>    // Even if ABORT_FLUSH throws exception, we should not fail with IOE, but continue with<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>    // DroppedSnapshotException. Below COMMMIT_FLUSH will cause flush to abort<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>    wal.flushActions = new FlushAction [] {FlushAction.COMMIT_FLUSH, FlushAction.ABORT_FLUSH};<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span><a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>    try {<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>      region.flush(true);<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>      fail("This should have thrown exception");<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>    } catch (DroppedSnapshotException expected) {<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>      // we expect this exception, since we were able to write the snapshot, but failed to<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span>      // write the flush marker to WAL<a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>    } catch (IOException unexpected) {<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>      throw unexpected;<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>    }<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>  }<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span><a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>  @Test<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>  public void testGetWhileRegionClose() throws IOException {<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>    Configuration hc = initSplit();<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>    int numRows = 100;<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>    byte[][] families = { fam1, fam2, fam3 };<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span><a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>    // Setting up region<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>    this.region = initHRegion(tableName, method, hc, families);<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>    // Put data in region<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>    final int startRow = 100;<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>    putData(startRow, numRows, qual1, families);<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>    putData(startRow, numRows, qual2, families);<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>    putData(startRow, numRows, qual3, families);<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    final AtomicBoolean done = new AtomicBoolean(false);<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>    final AtomicInteger gets = new AtomicInteger(0);<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>    GetTillDoneOrException[] threads = new GetTillDoneOrException[10];<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>    try {<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>      // Set ten threads running concurrently getting from the region.<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>      for (int i = 0; i &lt; threads.length / 2; i++) {<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>        threads[i] = new GetTillDoneOrException(i, Bytes.toBytes("" + startRow), done, gets);<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>        threads[i].setDaemon(true);<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>        threads[i].start();<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span>      }<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>      // Artificially make the condition by setting closing flag explicitly.<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>      // I can't make the issue happen with a call to region.close().<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>      this.region.closing.set(true);<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>      for (int i = threads.length / 2; i &lt; threads.length; i++) {<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>        threads[i] = new GetTillDoneOrException(i, Bytes.toBytes("" + startRow), done, gets);<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>        threads[i].setDaemon(true);<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>        threads[i].start();<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>      }<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>    } finally {<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>      if (this.region != null) {<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>        HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>        this.region = null;<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>      }<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>    }<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>    done.set(true);<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>    for (GetTillDoneOrException t : threads) {<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>      try {<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>        t.join();<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>      } catch (InterruptedException e) {<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>        e.printStackTrace();<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>      }<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>      if (t.e != null) {<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>        LOG.info("Exception=" + t.e);<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>        assertFalse("Found a NPE in " + t.getName(), t.e instanceof NullPointerException);<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>      }<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>    }<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>  }<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span><a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>  /*<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>   * Thread that does get on single row until 'done' flag is flipped. If an<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>   * exception causes us to fail, it records it.<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>   */<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>  class GetTillDoneOrException extends Thread {<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>    private final Get g;<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>    private final AtomicBoolean done;<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>    private final AtomicInteger count;<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>    private Exception e;<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span><a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>    GetTillDoneOrException(final int i, final byte[] r, final AtomicBoolean d,<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>        final AtomicInteger c) {<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>      super("getter." + i);<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>      this.g = new Get(r);<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>      this.done = d;<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>      this.count = c;<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>    }<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span><a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    @Override<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span>    public void run() {<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>      while (!this.done.get()) {<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>        try {<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>          assertTrue(region.get(g).size() &gt; 0);<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>          this.count.incrementAndGet();<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>        } catch (Exception e) {<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>          this.e = e;<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>          break;<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>        }<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>      }<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>    }<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>  }<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span><a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>  /*<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>   * An involved filter test. Has multiple column families and deletes in mix.<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>   */<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>  @Test<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>  public void testWeirdCacheBehaviour() throws Exception {<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>    byte[][] FAMILIES = new byte[][] { Bytes.toBytes("trans-blob"), Bytes.toBytes("trans-type"),<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>        Bytes.toBytes("trans-date"), Bytes.toBytes("trans-tags"), Bytes.toBytes("trans-group") };<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>    this.region = initHRegion(tableName, method, CONF, FAMILIES);<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>    String value = "this is the value";<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>    String value2 = "this is some other value";<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>    String keyPrefix1 = "prefix1";<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>    String keyPrefix2 = "prefix2";<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>    String keyPrefix3 = "prefix3";<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>    putRows(this.region, 3, value, keyPrefix1);<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>    putRows(this.region, 3, value, keyPrefix2);<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>    putRows(this.region, 3, value, keyPrefix3);<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>    putRows(this.region, 3, value2, keyPrefix1);<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>    putRows(this.region, 3, value2, keyPrefix2);<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>    putRows(this.region, 3, value2, keyPrefix3);<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>    System.out.println("Checking values for key: " + keyPrefix1);<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>    assertEquals("Got back incorrect number of rows from scan", 3,<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>        getNumberOfRows(keyPrefix1, value2, this.region));<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>    System.out.println("Checking values for key: " + keyPrefix2);<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>    assertEquals("Got back incorrect number of rows from scan", 3,<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>        getNumberOfRows(keyPrefix2, value2, this.region));<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>    System.out.println("Checking values for key: " + keyPrefix3);<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>    assertEquals("Got back incorrect number of rows from scan", 3,<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>        getNumberOfRows(keyPrefix3, value2, this.region));<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>    deleteColumns(this.region, value2, keyPrefix1);<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>    deleteColumns(this.region, value2, keyPrefix2);<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>    deleteColumns(this.region, value2, keyPrefix3);<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>    System.out.println("Starting important checks.....");<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>    assertEquals("Got back incorrect number of rows from scan: " + keyPrefix1, 0,<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>        getNumberOfRows(keyPrefix1, value2, this.region));<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>    assertEquals("Got back incorrect number of rows from scan: " + keyPrefix2, 0,<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>        getNumberOfRows(keyPrefix2, value2, this.region));<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>    assertEquals("Got back incorrect number of rows from scan: " + keyPrefix3, 0,<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>        getNumberOfRows(keyPrefix3, value2, this.region));<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>  }<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span><a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>  @Test<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>  public void testAppendWithReadOnlyTable() throws Exception {<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>    this.region = initHRegion(tableName, method, CONF, true, Bytes.toBytes("somefamily"));<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span>    boolean exceptionCaught = false;<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>    Append append = new Append(Bytes.toBytes("somerow"));<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>    append.setDurability(Durability.SKIP_WAL);<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>    append.addColumn(Bytes.toBytes("somefamily"), Bytes.toBytes("somequalifier"),<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>        Bytes.toBytes("somevalue"));<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>    try {<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>      region.append(append);<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>    } catch (IOException e) {<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>      exceptionCaught = true;<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>    }<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>    assertTrue(exceptionCaught == true);<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>  }<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span><a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>  @Test<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>  public void testIncrWithReadOnlyTable() throws Exception {<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>    this.region = initHRegion(tableName, method, CONF, true, Bytes.toBytes("somefamily"));<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>    boolean exceptionCaught = false;<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>    Increment inc = new Increment(Bytes.toBytes("somerow"));<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>    inc.setDurability(Durability.SKIP_WAL);<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>    inc.addColumn(Bytes.toBytes("somefamily"), Bytes.toBytes("somequalifier"), 1L);<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>    try {<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>      region.increment(inc);<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>    } catch (IOException e) {<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>      exceptionCaught = true;<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>    }<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>    assertTrue(exceptionCaught == true);<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>  }<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span><a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>  private void deleteColumns(HRegion r, String value, String keyPrefix) throws IOException {<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>    InternalScanner scanner = buildScanner(keyPrefix, value, r);<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>    int count = 0;<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>    boolean more = false;<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>    do {<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>      more = scanner.next(results);<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>      if (results != null &amp;&amp; !results.isEmpty())<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>        count++;<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>      else<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>        break;<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>      Delete delete = new Delete(CellUtil.cloneRow(results.get(0)));<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>      delete.addColumn(Bytes.toBytes("trans-tags"), Bytes.toBytes("qual2"));<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>      r.delete(delete);<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>      results.clear();<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>    } while (more);<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>    assertEquals("Did not perform correct number of deletes", 3, count);<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>  }<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span><a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>  private int getNumberOfRows(String keyPrefix, String value, HRegion r) throws Exception {<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>    InternalScanner resultScanner = buildScanner(keyPrefix, value, r);<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>    int numberOfResults = 0;<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>    boolean more = false;<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>    do {<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>      more = resultScanner.next(results);<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>      if (results != null &amp;&amp; !results.isEmpty())<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>        numberOfResults++;<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>      else<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>        break;<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>      for (Cell kv : results) {<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>        System.out.println("kv=" + kv.toString() + ", " + Bytes.toString(CellUtil.cloneValue(kv)));<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>      }<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>      results.clear();<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>    } while (more);<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>    return numberOfResults;<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>  }<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span><a name="line.1451"></a>
-<span class="sourceLineNo">1452</span>  private InternalScanner buildScanner(String keyPrefix, String value, HRegion r)<a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>      throws IOException {<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>    // Defaults FilterList.Operator.MUST_PASS_ALL.<a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>    FilterList allFilters = new FilterList();<a name="line.1455"></a>
-<span class="sourceLineNo">1456</span>    allFilters.addFilter(new PrefixFilter(Bytes.toBytes(keyPrefix)));<a name="line.1456"></a>
-<span class="sourceLineNo">1457</span>    // Only return rows where this column value exists in the row.<a name="line.1457"></a>
-<span class="sourceLineNo">1458</span>    SingleColumnValueFilter filter = new SingleColumnValueFilter(Bytes.toBytes("trans-tags"),<a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>        Bytes.toBytes("qual2"), CompareOperator.EQUAL, Bytes.toBytes(value));<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>    filter.setFilterIfMissing(true);<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>    allFilters.addFilter(filter);<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span>    Scan scan = new Scan();<a name="line.1462"></a>
-<span class="sourceLineNo">1463</span>    scan.addFamily(Bytes.toBytes("trans-blob"));<a name="line.1463"></a>
-<span class="sourceLineNo">1464</span>    scan.addFamily(Bytes.toBytes("trans-type"));<a name="line.1464"></a>
-<span class="sourceLineNo">1465</span>    scan.addFamily(Bytes.toBytes("trans-date"));<a name="line.1465"></a>
-<span class="sourceLineNo">1466</span>    scan.addFamily(Bytes.toBytes("trans-tags"));<a name="line.1466"></a>
-<span class="sourceLineNo">1467</span>    scan.addFamily(Bytes.toBytes("trans-group"));<a name="line.1467"></a>
-<span class="sourceLineNo">1468</span>    scan.setFilter(allFilters);<a name="line.1468"></a>
-<span class="sourceLineNo">1469</span>    return r.getScanner(scan);<a name="line.1469"></a>
-<span class="sourceLineNo">1470</span>  }<a name="line.1470"></a>
-<span class="sourceLineNo">1471</span><a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>  private void putRows(HRegion r, int numRows, String value, String key) throws IOException {<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span>    for (int i = 0; i &lt; numRows; i++) {<a name="line.1473"></a>
-<span class="sourceLineNo">1474</span>      String row = key + "_" + i/* UUID.randomUUID().toString() */;<a name="line.1474"></a>
-<span class="sourceLineNo">1475</span>      System.out.println(String.format("Saving row: %s, with value %s", row, value));<a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>      Put put = new Put(Bytes.toBytes(row));<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>      put.setDurability(Durability.SKIP_WAL);<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span>      put.addColumn(Bytes.toBytes("trans-blob"), null, Bytes.toBytes("value for blob"));<a name="line.1478"></a>
-<span class="sourceLineNo">1479</span>      put.addColumn(Bytes.toBytes("trans-type"), null, Bytes.toBytes("statement"));<a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>      put.addColumn(Bytes.toBytes("trans-date"), null, Bytes.toBytes("20090921010101999"));<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>      put.addColumn(Bytes.toBytes("trans-tags"), Bytes.toBytes("qual2"), Bytes.toBytes(value));<a name="line.1481"></a>
-<span class="sourceLineNo">1482</span>      put.addColumn(Bytes.toBytes("trans-group"), null, Bytes.toBytes("adhocTransactionGroupId"));<a name="line.1482"></a>
-<span class="sourceLineNo">1483</span>      r.put(put);<a name="line.1483"></a>
-<span class="sourceLineNo">1484</span>    }<a name="line.1484"></a>
-<span class="sourceLineNo">1485</span>  }<a name="line.1485"></a>
-<span class="sourceLineNo">1486</span><a name="line.1486"></a>
-<span class="sourceLineNo">1487</span>  @Test<a name="line.1487"></a>
-<span class="sourceLineNo">1488</span>  public void testFamilyWithAndWithoutColon() throws Exception {<a name="line.1488"></a>
-<span class="sourceLineNo">1489</span>    byte[] cf = Bytes.toBytes(COLUMN_FAMILY);<a name="line.1489"></a>
-<span class="sourceLineNo">1490</span>    this.region = initHRegion(tableName, method, CONF, cf);<a name="line.1490"></a>
-<span class="sourceLineNo">1491</span>    Put p = new Put(tableName.toBytes());<a name="line.1491"></a>
-<span class="sourceLineNo">1492</span>    byte[] cfwithcolon = Bytes.toBytes(COLUMN_FAMILY + ":");<a name="line.1492"></a>
-<span class="sourceLineNo">1493</span>    p.addColumn(cfwithcolon, cfwithcolon, cfwithcolon);<a name="line.1493"></a>
-<span class="sourceLineNo">1494</span>    boolean exception = false;<a name="line.1494"></a>
-<span class="sourceLineNo">1495</span>    try {<a name="line.1495"></a>
-<span class="sourceLineNo">1496</span>      this.region.put(p);<a name="line.1496"></a>
-<span class="sourceLineNo">1497</span>    } catch (NoSuchColumnFamilyException e) {<a name="line.1497"></a>
-<span class="sourceLineNo">1498</span>      exception = true;<a name="line.1498"></a>
-<span class="sourceLineNo">1499</span>    }<a name="line.1499"></a>
-<span class="sourceLineNo">1500</span>    assertTrue(exception);<a name="line.1500"></a>
-<span class="sourceLineNo">1501</span>  }<a name="line.1501"></a>
-<span class="sourceLineNo">1502</span><a name="line.1502"></a>
-<span class="sourceLineNo">1503</span>  @Test<a name="line.1503"></a>
-<span class="sourceLineNo">1504</span>  public void testBatchPut_whileNoRowLocksHeld() throws IOException {<a name="line.1504"></a>
-<span class="sourceLineNo">1505</span>    final Put[] puts = new Put[10];<a name="line.1505"></a>
-<span class="sourceLineNo">1506</span>    MetricsWALSource source = CompatibilitySingletonFactory.getInstance(MetricsWALSource.class);<a name="line.1506"></a>
-<span class="sourceLineNo">1507</span>    long syncs = prepareRegionForBachPut(puts, source, false);<a name="line.1507"></a>
-<span class="sourceLineNo">1508</span><a name="line.1508"></a>
-<span class="sourceLineNo">1509</span>    OperationStatus[] codes = this.region.batchMutate(puts);<a name="line.1509"></a>
-<span class="sourceLineNo">1510</span>    assertEquals(10, codes.length);<a name="line.1510"></a>
-<span class="sourceLineNo">1511</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.1511"></a>
-<span class="sourceLineNo">1512</span>      assertEquals(OperationStatusCode.SUCCESS, codes[i].getOperationStatusCode());<a name="line.1512"></a>
-<span class="sourceLineNo">1513</span>    }<a name="line.1513"></a>
-<span class="sourceLineNo">1514</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs + 1, source);<a name="line.1514"></a>
-<span class="sourceLineNo">1515</span><a name="line.1515"></a>
-<span class="sourceLineNo">1516</span>    LOG.info("Next a batch put with one invalid family");<a name="line.1516"></a>
-<span class="sourceLineNo">1517</span>    puts[5].addColumn(Bytes.toBytes("BAD_CF"), qual, value);<a name="line.1517"></a>
-<span class="sourceLineNo">1518</span>    codes = this.region.batchMutate(puts);<a name="line.1518"></a>
-<span class="sourceLineNo">1519</span>    assertEquals(10, codes.length);<a name="line.1519"></a>
-<span class="sourceLineNo">1520</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.1520"></a>
-<span class="sourceLineNo">1521</span>      assertEquals((i == 5) ? OperationStatusCode.BAD_FAMILY : OperationStatusCode.SUCCESS,<a name="line.1521"></a>
-<span class="sourceLineNo">1522</span>          codes[i].getOperationStatusCode());<a name="line.1522"></a>
-<span class="sourceLineNo">1523</span>    }<a name="line.1523"></a>
-<span class="sourceLineNo">1524</span><a name="line.1524"></a>
-<span class="sourceLineNo">1525</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs + 2, source);<a name="line.1525"></a>
-<span class="sourceLineNo">1526</span>  }<a name="line.1526"></a>
-<span class="sourceLineNo">1527</span><a name="line.1527"></a>
-<span class="sourceLineNo">1528</span>  @Test<a name="line.1528"></a>
-<span class="sourceLineNo">1529</span>  public void testBatchPut_whileMultipleRowLocksHeld() throws Exception {<a name="line.1529"></a>
-<span class="sourceLineNo">1530</span>    final Put[] puts = new Put[10];<a name="line.1530"></a>
-<span class="sourceLineNo">1531</span>    MetricsWALSource source = CompatibilitySingletonFactory.getInstance(MetricsWALSource.class);<a name="line.1531"></a>
-<span class="sourceLineNo">1532</span>    long syncs = prepareRegionForBachPut(puts, source, false);<a name="line.1532"></a>
-<span class="sourceLineNo">1533</span><a name="line.1533"></a>
-<span class="sourceLineNo">1534</span>    puts[5].addColumn(Bytes.toBytes("BAD_CF"), qual, value);<a name="line.1534"></a>
-<span class="sourceLineNo">1535</span><a name="line.1535"></a>
-<span class="sourceLineNo">1536</span>    LOG.info("batchPut will have to break into four batches to avoid row locks");<a name="line.1536"></a>
-<span class="sourceLineNo">1537</span>    RowLock rowLock1 = region.getRowLock(Bytes.toBytes("row_2"));<a name="line.1537"></a>
-<span class="sourceLineNo">1538</span>    RowLock rowLock2 = region.getRowLock(Bytes.toBytes("row_1"));<a name="line.1538"></a>
-<span class="sourceLineNo">1539</span>    RowLock rowLock3 = region.getRowLock(Bytes.toBytes("row_3"));<a name="line.1539"></a>
-<span class="sourceLineNo">1540</span>    RowLock rowLock4 = region.getRowLock(Bytes.toBytes("row_3"), true);<a name="line.1540"></a>
-<span class="sourceLineNo">1541</span><a name="line.1541"></a>
-<span class="sourceLineNo">1542</span>    MultithreadedTestUtil.TestContext ctx = new MultithreadedTestUtil.TestContext(CONF);<a name="line.1542"></a>
-<span class="sourceLineNo">1543</span>    final AtomicReference&lt;OperationStatus[]&gt; retFromThread = new AtomicReference&lt;&gt;();<a name="line.1543"></a>
-<span class="sourceLineNo">1544</span>    final CountDownLatch startingPuts = new CountDownLatch(1);<a name="line.1544"></a>
-<span class="sourceLineNo">1545</span>    final CountDownLatch startingClose = new CountDownLatch(1);<a name="line.1545"></a>
-<span class="sourceLineNo">1546</span>    TestThread putter = new TestThread(ctx) {<a name="line.1546"></a>
-<span class="sourceLineNo">1547</span>      @Override<a name="line.1547"></a>
-<span class="sourceLineNo">1548</span>      public void doWork() throws IOException {<a name="line.1548"></a>
-<span class="sourceLineNo">1549</span>        startingPuts.countDown();<a name="line.1549"></a>
-<span class="sourceLineNo">1550</span>        retFromThread.set(region.batchMutate(puts));<a name="line.1550"></a>
-<span class="sourceLineNo">1551</span>      }<a name="line.1551"></a>
-<span class="sourceLineNo">1552</span>    };<a name="line.1552"></a>
-<span class="sourceLineNo">1553</span>    LOG.info("...starting put thread while holding locks");<a name="line.1553"></a>
-<span class="sourceLineNo">1554</span>    ctx.addThread(putter);<a name="line.1554"></a>
-<span class="sourceLineNo">1555</span>    ctx.startThreads();<a name="line.1555"></a>
-<span class="sourceLineNo">1556</span><a name="line.1556"></a>
-<span class="sourceLineNo">1557</span>    // Now attempt to close the region from another thread.  Prior to HBASE-12565<a name="line.1557"></a>
-<span class="sourceLineNo">1558</span>    // this would cause the in-progress batchMutate operation to to fail with<a name="line.1558"></a>
-<span class="sourceLineNo">1559</span>    // exception because it use to release and re-acquire the close-guard lock<a name="line.1559"></a>
-<span class="sourceLineNo">1560</span>    // between batches.  Caller then didn't get status indicating which writes succeeded.<a name="line.1560"></a>
-<span class="sourceLineNo">1561</span>    // We now expect this thread to block until the batchMutate call finishes.<a name="line.1561"></a>
-<span class="sourceLineNo">1562</span>    Thread regionCloseThread = new TestThread(ctx) {<a name="line.1562"></a>
-<span class="sourceLineNo">1563</span>      @Override<a name="line.1563"></a>
-<span class="sourceLineNo">1564</span>      public void doWork() {<a name="line.1564"></a>
-<span class="sourceLineNo">1565</span>        try {<a name="line.1565"></a>
-<span class="sourceLineNo">1566</span>          startingPuts.await();<a name="line.1566"></a>
-<span class="sourceLineNo">1567</span>          // Give some time for the batch mutate to get in.<a name="line.1567"></a>
-<span class="sourceLineNo">1568</span>          // We don't want to race with the mutate<a name="line.1568"></a>
-<span class="sourceLineNo">1569</span>          Thread.sleep(10);<a name="line.1569"></a>
-<span class="sourceLineNo">1570</span>          startingClose.countDown();<a name="line.1570"></a>
-<span class="sourceLineNo">1571</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.1571"></a>
-<span class="sourceLineNo">1572</span>          region = null;<a name="line.1572"></a>
-<span class="sourceLineNo">1573</span>        } catch (IOException e) {<a name="line.1573"></a>
-<span class="sourceLineNo">1574</span>          throw new RuntimeException(e);<a name="line.1574"></a>
-<span class="sourceLineNo">1575</span>        } catch (InterruptedException e) {<a name="line.1575"></a>
-<span class="sourceLineNo">1576</span>          throw new RuntimeException(e);<a name="line.1576"></a>
-<span class="sourceLineNo">1577</span>        }<a name="line.1577"></a>
-<span class="sourceLineNo">1578</span>      }<a name="line.1578"></a>
-<span class="sourceLineNo">1579</span>    };<a name="line.1579"></a>
-<span class="sourceLineNo">1580</span>    regionCloseThread.start();<a name="line.1580"></a>
-<span class="sourceLineNo">1581</span><a name="line.1581"></a>
-<span class="sourceLineNo">1582</span>    startingClose.await();<a name="line.1582"></a>
-<span class="sourceLineNo">1583</span>    startingPuts.await();<a name="line.1583"></a>
-<span class="sourceLineNo">1584</span>    Thread.sleep(100);<a name="line.1584"></a>
-<span class="sourceLineNo">1585</span>    LOG.info("...releasing row lock 1, which should let put thread continue");<a name="line.1585"></a>
-<span class="sourceLineNo">1586</span>    rowLock1.release();<a name="line.1586"></a>
-<span class="sourceLineNo">1587</span>    rowLock2.release();<a name="line.1587"></a>
-<span class="sourceLineNo">1588</span>    rowLock3.release();<a name="line.1588"></a>
-<span class="sourceLineNo">1589</span>    waitForCounter(source, "syncTimeNumOps", syncs + 1);<a name="line.1589"></a>
-<span class="sourceLineNo">1590</span><a name="line.1590"></a>
-<span class="sourceLineNo">1591</span>    LOG.info("...joining on put thread");<a name="line.1591"></a>
-<span class="sourceLineNo">1592</span>    ctx.stop();<a name="line.1592"></a>
-<span class="sourceLineNo">1593</span>    regionCloseThread.join();<a name="line.1593"></a>
-<span class="sourceLineNo">1594</span><a name="line.1594"></a>
-<span class="sourceLineNo">1595</span>    OperationStatus[] codes = retFromThread.get();<a name="line.1595"></a>
-<span class="sourceLineNo">1596</span>    for (int i = 0; i &lt; codes.length; i++) {<a name="line.1596"></a>
-<span class="sourceLineNo">1597</span>      assertEquals((i == 5) ? OperationStatusCode.BAD_FAMILY : OperationStatusCode.SUCCESS,<a name="line.1597"></a>
-<span class="sourceLineNo">1598</span>          codes[i].getOperationStatusCode());<a name="line.1598"></a>
-<span class="sourceLineNo">1599</span>    }<a name="line.1599"></a>
-<span class="sourceLineNo">1600</span>    rowLock4.release();<a name="line.1600"></a>
-<span class="sourceLineNo">1601</span>  }<a name="line.1601"></a>
-<span class="sourceLineNo">1602</span><a name="line.1602"></a>
-<span class="sourceLineNo">1603</span>  private void waitForCounter(MetricsWALSource source, String metricName, long expectedCount)<a name="line.1603"></a>
-<span class="sourceLineNo">1604</span>      throws InterruptedException {<a name="line.1604"></a>
-<span class="sourceLineNo">1605</span>    long startWait = System.currentTimeMillis();<a name="line.1605"></a>
-<span class="sourceLineNo">1606</span>    long currentCount;<a name="line.1606"></a>
-<span class="sourceLineNo">1607</span>    while ((currentCount = metricsAssertHelper.getCounter(metricName, source)) &lt; expectedCount) {<a name="line.1607"></a>
-<span class="sourceLineNo">1608</span>      Thread.sleep(100);<a name="line.1608"></a>
-<span class="sourceLineNo">1609</span>      if (System.currentTimeMillis() - startWait &gt; 10000) {<a name="line.1609"></a>
-<span class="sourceLineNo">1610</span>        fail(String.format("Timed out waiting for '%s' &gt;= '%s', currentCount=%s", metricName,<a name="line.1610"></a>
-<span class="sourceLineNo">1611</span>            expectedCount, currentCount));<a name="line.1611"></a>
-<span class="sourceLineNo">1612</span>      }<a name="line.1612"></a>
-<span class="sourceLineNo">1613</span>    }<a name="line.1613"></a>
-<span class="sourceLineNo">1614</span>  }<a name="line.1614"></a>
-<span class="sourceLineNo">1615</span><a name="line.1615"></a>
-<span class="sourceLineNo">1616</span>  @Test<a name="line.1616"></a>
-<span class="sourceLineNo">1617</span>  public void testAtomicBatchPut() throws IOException {<a name="line.1617"></a>
-<span class="sourceLineNo">1618</span>    final Put[] puts = new Put[10];<a name="line.1618"></a>
-<span class="sourceLineNo">1619</span>    MetricsWALSource source = CompatibilitySingletonFactory.getInstance(MetricsWALSource.class);<a name="line.1619"></a>
-<span class="sourceLineNo">1620</span>    long syncs = prepareRegionForBachPut(puts, source, false);<a name="line.1620"></a>
-<span class="sourceLineNo">1621</span><a name="line.1621"></a>
-<span class="sourceLineNo">1622</span>    // 1. Straight forward case, should succeed<a name="line.1622"></a>
-<span class="sourceLineNo">1623</span>    MutationBatchOperation batchOp = new MutationBatchOperation(region, puts, true,<a name="line.1623"></a>
-<span class="sourceLineNo">1624</span>        HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.1624"></a>
-<span class="sourceLineNo">1625</span>    OperationStatus[] codes = this.region.batchMutate(batchOp);<a name="line.1625"></a>
-<span class="sourceLineNo">1626</span>    assertEquals(10, codes.length);<a name="line.1626"></a>
-<span class="sourceLineNo">1627</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.1627"></a>
-<span class="sourceLineNo">1628</span>      assertEquals(OperationStatusCode.SUCCESS, codes[i].getOperationStatusCode());<a name="line.1628"></a>
-<span class="sourceLineNo">1629</span>    }<a name="line.1629"></a>
-<span class="sourceLineNo">1630</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs + 1, source);<a name="line.1630"></a>
-<span class="sourceLineNo">1631</span><a name="line.1631"></a>
-<span class="sourceLineNo">1632</span>    // 2. Failed to get lock<a name="line.1632"></a>
-<span class="sourceLineNo">1633</span>    RowLock lock = region.getRowLock(Bytes.toBytes("row_" + 3));<a name="line.1633"></a>
-<span class="sourceLineNo">1634</span>    // Method {@link HRegion#getRowLock(byte[])} is reentrant. As 'row_3' is locked in this<a name="line.1634"></a>
-<span class="sourceLineNo">1635</span>    // thread, need to run {@link HRegion#batchMutate(HRegion.BatchOperation)} in different thread<a name="line.1635"></a>
-<span class="sourceLineNo">1636</span>    MultithreadedTestUtil.TestContext ctx = new MultithreadedTestUtil.TestContext(CONF);<a name="line.1636"></a>
-<span class="sourceLineNo">1637</span>    final AtomicReference&lt;IOException&gt; retFromThread = new AtomicReference&lt;&gt;();<a name="line.1637"></a>
-<span class="sourceLineNo">1638</span>    final CountDownLatch finishedPuts = new CountDownLatch(1);<a name="line.1638"></a>
-<span class="sourceLineNo">1639</span>    final MutationBatchOperation finalBatchOp = new MutationBatchOperation(region, puts, true,<a name="line.1639"></a>
-<span class="sourceLineNo">1640</span>        HConstants<a name="line.1640"></a>
-<span class="sourceLineNo">1641</span>        .NO_NONCE,<a name="line.1641"></a>
-<span class="sourceLineNo">1642</span>        HConstants.NO_NONCE);<a name="line.1642"></a>
-<span class="sourceLineNo">1643</span>    TestThread putter = new TestThread(ctx) {<a name="line.1643"></a>
-<span class="sourceLineNo">1644</span>      @Override<a name="line.1644"></a>
-<span class="sourceLineNo">1645</span>      public void doWork() throws IOException {<a name="line.1645"></a>
-<span class="sourceLineNo">1646</span>        try {<a name="line.1646"></a>
-<span class="sourceLineNo">1647</span>          region.batchMutate(finalBatchOp);<a name="line.1647"></a>
-<span class="sourceLineNo">1648</span>        } catch (IOException ioe) {<a name="line.1648"></a>
-<span class="sourceLineNo">1649</span>          LOG.error("test failed!", ioe);<a name="line.1649"></a>
-<span class="sourceLineNo">1650</span>          retFromThread.set(ioe);<a name="line.1650"></a>
-<span class="sourceLineNo">1651</span>        }<a name="line.1651"></a>
-<span class="sourceLineNo">1652</span>        finishedPuts.countDown();<a name="line.1652"></a>
-<span class="sourceLineNo">1653</span>      }<a name="line.1653"></a>
-<span class="sourceLineNo">1654</span>    };<a name="line.1654"></a>
-<span class="sourceLineNo">1655</span>    LOG.info("...starting put thread while holding locks");<a name="line.1655"></a>
-<span class="sourceLineNo">1656</span>    ctx.addThread(putter);<a name="line.1656"></a>
-<span class="sourceLineNo">1657</span>    ctx.startThreads();<a name="line.1657"></a>
-<span class="sourceLineNo">1658</span>    LOG.info("...waiting for batch puts while holding locks");<a name="line.1658"></a>
-<span class="sourceLineNo">1659</span>    try {<a name="line.1659"></a>
-<span class="sourceLineNo">1660</span>      finishedPuts.await();<a name="line.1660"></a>
-<span class="sourceLineNo">1661</span>    } catch (InterruptedException e) {<a name="line.1661"></a>
-<span class="sourceLineNo">1662</span>      LOG.error("Interrupted!", e);<a name="line.1662"></a>
-<span class="sourceLineNo">1663</span>    } finally {<a name="line.1663"></a>
-<span class="sourceLineNo">1664</span>      if (lock != null) {<a name="line.1664"></a>
-<span class="sourceLineNo">1665</span>        lock.release();<a name="line.1665"></a>
-<span class="sourceLineNo">1666</span>      }<a name="line.1666"></a>
-<span class="sourceLineNo">1667</span>    }<a name="line.1667"></a>
-<span class="sourceLineNo">1668</span>    assertNotNull(retFromThread.get());<a name="line.1668"></a>
-<span class="sourceLineNo">1669</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs + 1, source);<a name="line.1669"></a>
-<span class="sourceLineNo">1670</span><a name="line.1670"></a>
-<span class="sourceLineNo">1671</span>    // 3. Exception thrown in validation<a name="line.1671"></a>
-<span class="sourceLineNo">1672</span>    LOG.info("Next a batch put with one invalid family");<a name="line.1672"></a>
-<span class="sourceLineNo">1673</span>    puts[5].addColumn(Bytes.toBytes("BAD_CF"), qual, value);<a name="line.1673"></a>
-<span class="sourceLineNo">1674</span>    batchOp = new MutationBatchOperation(region, puts, true, HConstants.NO_NONCE,<a name="line.1674"></a>
-<span class="sourceLineNo">1675</span>        HConstants.NO_NONCE);<a name="line.1675"></a>
-<span class="sourceLineNo">1676</span>    thrown.expect(NoSuchColumnFamilyException.class);<a name="line.1676"></a>
-<span class="sourceLineNo">1677</span>    this.region.batchMutate(batchOp);<a name="line.1677"></a>
-<span class="sourceLineNo">1678</span>  }<a name="line.1678"></a>
-<span class="sourceLineNo">1679</span><a name="line.1679"></a>
-<span class="sourceLineNo">1680</span>  @Test<a name="line.1680"></a>
-<span class="sourceLineNo">1681</span>  public void testBatchPutWithTsSlop() throws Exception {<a name="line.1681"></a>
-<span class="sourceLineNo">1682</span>    // add data with a timestamp that is too recent for range. Ensure assert<a name="line.1682"></a>
-<span class="sourceLineNo">1683</span>    CONF.setInt("hbase.hregion.keyvalue.timestamp.slop.millisecs", 1000);<a name="line.1683"></a>
-<span class="sourceLineNo">1684</span>    final Put[] puts = new Put[10];<a name="line.1684"></a>
-<span class="sourceLineNo">1685</span>    MetricsWALSource source = CompatibilitySingletonFactory.getInstance(MetricsWALSource.class);<a name="line.1685"></a>
-<span class="sourceLineNo">1686</span><a name="line.1686"></a>
-<span class="sourceLineNo">1687</span>    long syncs = prepareRegionForBachPut(puts, source, true);<a name="line.1687"></a>
-<span class="sourceLineNo">1688</span><a name="line.1688"></a>
-<span class="sourceLineNo">1689</span>    OperationStatus[] codes = this.region.batchMutate(puts);<a name="line.1689"></a>
-<span class="sourceLineNo">1690</span>    assertEquals(10, codes.length);<a name="line.1690"></a>
-<span class="sourceLineNo">1691</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.1691"></a>
-<span class="sourceLineNo">1692</span>      assertEquals(OperationStatusCode.SANITY_CHECK_FAILURE, codes[i].getOperationStatusCode());<a name="line.1692"></a>
-<span class="sourceLineNo">1693</span>    }<a name="line.1693"></a>
-<span class="sourceLineNo">1694</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs, source);<a name="line.1694"></a>
-<span class="sourceLineNo">1695</span>  }<a name="line.1695"></a>
-<span class="sourceLineNo">1696</span><a name="line.1696"></a>
-<span class="sourceLineNo">1697</span>  /**<a name="line.1697"></a>
-<span class="sourceLineNo">1698</span>   * @return syncs initial syncTimeNumOps<a name="line.1698"></a>
-<span class="sourceLineNo">1699</span>   */<a name="line.1699"></a>
-<span class="sourceLineNo">1700</span>  private long prepareRegionForBachPut(final Put[] puts, final MetricsWALSource source,<a name="line.1700"></a>
-<span class="sourceLineNo">1701</span>      boolean slop) throws IOException {<a name="line.1701"></a>
-<span class="sourceLineNo">1702</span>    this.region = initHRegion(tableName, method, CONF, COLUMN_FAMILY_BYTES);<a name="line.1702"></a>
-<span class="sourceLineNo">1703</span><a name="line.1703"></a>
-<span class="sourceLineNo">1704</span>    LOG.info("First a batch put with all valid puts");<a name="line.1704"></a>
-<span class="sourceLineNo">1705</span>    for (int i = 0; i &lt; puts.length; i++) {<a name="line.1705"></a>
-<span class="sourceLineNo">1706</span>      puts[i] = slop ? new Put(Bytes.toBytes("row_" + i), Long.MAX_VALUE - 100) :<a name="line.1706"></a>
-<span class="sourceLineNo">1707</span>          new Put(Bytes.toBytes("row_" + i));<a name="line.1707"></a>
-<span class="sourceLineNo">1708</span>      puts[i].addColumn(COLUMN_FAMILY_BYTES, qual, value);<a name="line.1708"></a>
-<span class="sourceLineNo">1709</span>    }<a name="line.1709"></a>
-<span class="sourceLineNo">1710</span><a name="line.1710"></a>
-<span class="sourceLineNo">1711</span>    long syncs = metricsAssertHelper.getCounter("syncTimeNumOps", source);<a name="line.1711"></a>
-<span class="sourceLineNo">1712</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs, source);<a name="line.1712"></a>
-<span class="sourceLineNo">1713</span>    return syncs;<a name="line.1713"></a>
-<span class="sourceLineNo">1714</span>  }<a name="line.1714"></a>
-<span class="sourceLineNo">1715</span><a name="line.1715"></a>
-<span class="sourceLineNo">1716</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.1716"></a>
-<span class="sourceLineNo">1717</span>  // checkAndMutate tests<a name="line.1717"></a>
-<span class="sourceLineNo">1718</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.1718"></a>
-<span class="sourceLineNo">1719</span>  @Test<a name="line.1719"></a>
-<span class="sourceLineNo">1720</span>  public void testCheckAndMutate_WithEmptyRowValue() throws IOException {<a name="line.1720"></a>
-<span class="sourceLineNo">1721</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1721"></a>
-<span class="sourceLineNo">1722</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1722"></a>
-<span class="sourceLineNo">1723</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1723"></a>
-<span class="sourceLineNo">1724</span>    byte[] emptyVal = new byte[] {};<a name="line.1724"></a>
-<span class="sourceLineNo">1725</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1725"></a>
-<span class="sourceLineNo">1726</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.1726"></a>
-<span class="sourceLineNo">1727</span><a name="line.1727"></a>
-<span class="sourceLineNo">1728</span>    // Setting up region<a name="line.1728"></a>
-<span class="sourceLineNo">1729</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.1729"></a>
-<span class="sourceLineNo">1730</span>    // Putting empty data in key<a name="line.1730"></a>
-<span class="sourceLineNo">1731</span>    Put put = new Put(row1);<a name="line.1731"></a>
-<span class="sourceLineNo">1732</span>    put.addColumn(fam1, qf1, emptyVal);<a name="line.1732"></a>
-<span class="sourceLineNo">1733</span><a name="line.1733"></a>
-<span class="sourceLineNo">1734</span>    // checkAndPut with empty value<a name="line.1734"></a>
-<span class="sourceLineNo">1735</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1735"></a>
-<span class="sourceLineNo">1736</span>        new BinaryComparator(emptyVal), put);<a name="line.1736"></a>
-<span class="sourceLineNo">1737</span>    assertTrue(res);<a name="line.1737"></a>
-<span class="sourceLineNo">1738</span><a name="line.1738"></a>
-<span class="sourceLineNo">1739</span>    // Putting data in key<a name="line.1739"></a>
-<span class="sourceLineNo">1740</span>    put = new Put(row1);<a name="line.1740"></a>
-<span class="sourceLineNo">1741</span>    put.addColumn(fam1, qf1, val1);<a name="line.1741"></a>
-<span class="sourceLineNo">1742</span><a name="line.1742"></a>
-<span class="sourceLineNo">1743</span>    // checkAndPut with correct value<a name="line.1743"></a>
-<span class="sourceLineNo">1744</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1744"></a>
-<span class="sourceLineNo">1745</span>        new BinaryComparator(emptyVal), put);<a name="line.1745"></a>
-<span class="sourceLineNo">1746</span>    assertTrue(res);<a name="line.1746"></a>
-<span class="sourceLineNo">1747</span><a name="line.1747"></a>
-<span class="sourceLineNo">1748</span>    // not empty anymore<a name="line.1748"></a>
-<span class="sourceLineNo">1749</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1749"></a>
-<span class="sourceLineNo">1750</span>        new BinaryComparator(emptyVal), put);<a name="line.1750"></a>
-<span class="sourceLineNo">1751</span>    assertFalse(res);<a name="line.1751"></a>
-<span class="sourceLineNo">1752</span><a name="line.1752"></a>
-<span class="sourceLineNo">1753</span>    Delete delete = new Delete(row1);<a name="line.1753"></a>
-<span class="sourceLineNo">1754</span>    delete.addColumn(fam1, qf1);<a name="line.1754"></a>
-<span class="sourceLineNo">1755</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1755"></a>
-<span class="sourceLineNo">1756</span>        new BinaryComparator(emptyVal), delete);<a name="line.1756"></a>
-<span class="sourceLineNo">1757</span>    assertFalse(res);<a name="line.1757"></a>
-<span class="sourceLineNo">1758</span><a name="line.1758"></a>
-<span class="sourceLineNo">1759</span>    put = new Put(row1);<a name="line.1759"></a>
-<span class="sourceLineNo">1760</span>    put.addColumn(fam1, qf1, val2);<a name="line.1760"></a>
-<span class="sourceLineNo">1761</span>    // checkAndPut with correct value<a name="line.1761"></a>
-<span class="sourceLineNo">1762</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1762"></a>
-<span class="sourceLineNo">1763</span>        new BinaryComparator(val1), put);<a name="line.1763"></a>
-<span class="sourceLineNo">1764</span>    assertTrue(res);<a name="line.1764"></a>
-<span class="sourceLineNo">1765</span><a name="line.1765"></a>
-<span class="sourceLineNo">1766</span>    // checkAndDelete with correct value<a name="line.1766"></a>
-<span class="sourceLineNo">1767</span>    delete = new Delete(row1);<a name="line.1767"></a>
-<span class="sourceLineNo">1768</span>    delete.addColumn(fam1, qf1);<a name="line.1768"></a>
+<span class="sourceLineNo">404</span>    ChunkCreator.initialize(MemStoreLABImpl.CHUNK_SIZE_DEFAULT, false, 0, 0, 0, null);<a name="line.404"></a>
+<span class="sourceLineNo">405</span>    FSHLog hLog = new FSHLog(fs, rootDir, testName, CONF);<a name="line.405"></a>
+<span class="sourceLineNo">406</span>    hLog.init();<a name="line.406"></a>
+<span class="sourceLineNo">407</span>    region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, hLog,<a name="line.407"></a>
+<span class="sourceLineNo">408</span>        COLUMN_FAMILY_BYTES);<a name="line.408"></a>
+<span class="sourceLineNo">409</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.409"></a>
+<span class="sourceLineNo">410</span>    assertEquals(0, region.getMemStoreDataSize());<a name="line.410"></a>
+<span class="sourceLineNo">411</span><a name="line.411"></a>
+<span class="sourceLineNo">412</span>    // Put one value<a name="line.412"></a>
+<span class="sourceLineNo">413</span>    byte [] value = Bytes.toBytes(method);<a name="line.413"></a>
+<span class="sourceLineNo">414</span>    Put put = new Put(value);<a name="line.414"></a>
+<span class="sourceLineNo">415</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    region.put(put);<a name="line.416"></a>
+<span class="sourceLineNo">417</span>    long onePutSize = region.getMemStoreDataSize();<a name="line.417"></a>
+<span class="sourceLineNo">418</span>    assertTrue(onePutSize &gt; 0);<a name="line.418"></a>
+<span class="sourceLineNo">419</span><a name="line.419"></a>
+<span class="sourceLineNo">420</span>    RegionCoprocessorHost mockedCPHost = Mockito.mock(RegionCoprocessorHost.class);<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    doThrow(new IOException())<a name="line.421"></a>
+<span class="sourceLineNo">422</span>       .when(mockedCPHost).postBatchMutate(Mockito.&lt;MiniBatchOperationInProgress&lt;Mutation&gt;&gt;any());<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    region.setCoprocessorHost(mockedCPHost);<a name="line.423"></a>
+<span class="sourceLineNo">424</span><a name="line.424"></a>
+<span class="sourceLineNo">425</span>    put = new Put(value);<a name="line.425"></a>
+<span class="sourceLineNo">426</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("dfg"), value);<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    try {<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      region.put(put);<a name="line.428"></a>
+<span class="sourceLineNo">429</span>      fail("Should have failed with IOException");<a name="line.429"></a>
+<span class="sourceLineNo">430</span>    } catch (IOException expected) {<a name="line.430"></a>
+<span class="sourceLineNo">431</span>    }<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    long expectedSize = onePutSize * 2;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>    assertEquals("memstoreSize should be incremented",<a name="line.433"></a>
+<span class="sourceLineNo">434</span>        expectedSize, region.getMemStoreDataSize());<a name="line.434"></a>
+<span class="sourceLineNo">435</span>    assertEquals("flushable size should be incremented",<a name="line.435"></a>
+<span class="sourceLineNo">436</span>        expectedSize, store.getFlushableSize().getDataSize());<a name="line.436"></a>
+<span class="sourceLineNo">437</span><a name="line.437"></a>
+<span class="sourceLineNo">438</span>    region.setCoprocessorHost(null);<a name="line.438"></a>
+<span class="sourceLineNo">439</span>  }<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>   * A test case of HBASE-21041<a name="line.442"></a>
+<span class="sourceLineNo">443</span>   * @throws Exception Exception<a name="line.443"></a>
+<span class="sourceLineNo">444</span>   */<a name="line.444"></a>
+<span class="sourceLineNo">445</span>  @Test<a name="line.445"></a>
+<span class="sourceLineNo">446</span>  public void testFlushAndMemstoreSizeCounting() throws Exception {<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    byte[] family = Bytes.toBytes("family");<a name="line.447"></a>
+<span class="sourceLineNo">448</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.448"></a>
+<span class="sourceLineNo">449</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.449"></a>
+<span class="sourceLineNo">450</span>    try {<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      for (byte[] row : HBaseTestingUtility.ROWS) {<a name="line.451"></a>
+<span class="sourceLineNo">452</span>        Put put = new Put(row);<a name="line.452"></a>
+<span class="sourceLineNo">453</span>        put.addColumn(family, family, row);<a name="line.453"></a>
+<span class="sourceLineNo">454</span>        region.put(put);<a name="line.454"></a>
+<span class="sourceLineNo">455</span>      }<a name="line.455"></a>
+<span class="sourceLineNo">456</span>      region.flush(true);<a name="line.456"></a>
+<span class="sourceLineNo">457</span>      // After flush, data size should be zero<a name="line.457"></a>
+<span class="sourceLineNo">458</span>      assertEquals(0, region.getMemStoreDataSize());<a name="line.458"></a>
+<span class="sourceLineNo">459</span>      // After flush, a new active mutable segment is created, so the heap size<a name="line.459"></a>
+<span class="sourceLineNo">460</span>      // should equal to MutableSegment.DEEP_OVERHEAD<a name="line.460"></a>
+<span class="sourceLineNo">461</span>      assertEquals(MutableSegment.DEEP_OVERHEAD, region.getMemStoreHeapSize());<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      // After flush, offheap should be zero<a name="line.462"></a>
+<span class="sourceLineNo">463</span>      assertEquals(0, region.getMemStoreOffHeapSize());<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    } finally {<a name="line.464"></a>
+<span class="sourceLineNo">465</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.465"></a>
+<span class="sourceLineNo">466</span>      this.region = null;<a name="line.466"></a>
+<span class="sourceLineNo">467</span>      wals.close();<a name="line.467"></a>
+<span class="sourceLineNo">468</span>    }<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>  /**<a name="line.471"></a>
+<span class="sourceLineNo">472</span>   * Test we do not lose data if we fail a flush and then close.<a name="line.472"></a>
+<span class="sourceLineNo">473</span>   * Part of HBase-10466.  Tests the following from the issue description:<a name="line.473"></a>
+<span class="sourceLineNo">474</span>   * "Bug 1: Wrong calculation of HRegion.memstoreSize: When a flush fails, data to be flushed is<a name="line.474"></a>
+<span class="sourceLineNo">475</span>   * kept in each MemStore's snapshot and wait for next flush attempt to continue on it. But when<a name="line.475"></a>
+<span class="sourceLineNo">476</span>   * the next flush succeeds, the counter of total memstore size in HRegion is always deduced by<a name="line.476"></a>
+<span class="sourceLineNo">477</span>   * the sum of current memstore sizes instead of snapshots left from previous failed flush. This<a name="line.477"></a>
+<span class="sourceLineNo">478</span>   * calculation is problematic that almost every time there is failed flush, HRegion.memstoreSize<a name="line.478"></a>
+<span class="sourceLineNo">479</span>   * gets reduced by a wrong value. If region flush could not proceed for a couple cycles, the size<a name="line.479"></a>
+<span class="sourceLineNo">480</span>   * in current memstore could be much larger than the snapshot. It's likely to drift memstoreSize<a name="line.480"></a>
+<span class="sourceLineNo">481</span>   * much smaller than expected. In extreme case, if the error accumulates to even bigger than<a name="line.481"></a>
+<span class="sourceLineNo">482</span>   * HRegion's memstore size limit, any further flush is skipped because flush does not do anything<a name="line.482"></a>
+<span class="sourceLineNo">483</span>   * if memstoreSize is not larger than 0."<a name="line.483"></a>
+<span class="sourceLineNo">484</span>   * @throws Exception<a name="line.484"></a>
+<span class="sourceLineNo">485</span>   */<a name="line.485"></a>
+<span class="sourceLineNo">486</span>  @Test<a name="line.486"></a>
+<span class="sourceLineNo">487</span>  public void testFlushSizeAccounting() throws Exception {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.488"></a>
+<span class="sourceLineNo">489</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.489"></a>
+<span class="sourceLineNo">490</span>    // Only retry once.<a name="line.490"></a>
+<span class="sourceLineNo">491</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.491"></a>
+<span class="sourceLineNo">492</span>    final User user =<a name="line.492"></a>
+<span class="sourceLineNo">493</span>      User.createUserForTesting(conf, method, new String[]{"foo"});<a name="line.493"></a>
+<span class="sourceLineNo">494</span>    // Inject our faulty LocalFileSystem<a name="line.494"></a>
+<span class="sourceLineNo">495</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.496"></a>
+<span class="sourceLineNo">497</span>      @Override<a name="line.497"></a>
+<span class="sourceLineNo">498</span>      public Object run() throws Exception {<a name="line.498"></a>
+<span class="sourceLineNo">499</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.499"></a>
+<span class="sourceLineNo">500</span>        FileSystem fs = FileSystem.get(conf);<a name="line.500"></a>
+<span class="sourceLineNo">501</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.501"></a>
+<span class="sourceLineNo">502</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.502"></a>
+<span class="sourceLineNo">503</span>        HRegion region = null;<a name="line.503"></a>
+<span class="sourceLineNo">504</span>        try {<a name="line.504"></a>
+<span class="sourceLineNo">505</span>          // Initialize region<a name="line.505"></a>
+<span class="sourceLineNo">506</span>          region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, wal,<a name="line.506"></a>
+<span class="sourceLineNo">507</span>              COLUMN_FAMILY_BYTES);<a name="line.507"></a>
+<span class="sourceLineNo">508</span>          long size = region.getMemStoreDataSize();<a name="line.508"></a>
+<span class="sourceLineNo">509</span>          Assert.assertEquals(0, size);<a name="line.509"></a>
+<span class="sourceLineNo">510</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.510"></a>
+<span class="sourceLineNo">511</span>          Put p1 = new Put(row);<a name="line.511"></a>
+<span class="sourceLineNo">512</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[]) null));<a name="line.512"></a>
+<span class="sourceLineNo">513</span>          region.put(p1);<a name="line.513"></a>
+<span class="sourceLineNo">514</span>          final long sizeOfOnePut = region.getMemStoreDataSize();<a name="line.514"></a>
+<span class="sourceLineNo">515</span>          // Fail a flush which means the current memstore will hang out as memstore 'snapshot'.<a name="line.515"></a>
+<span class="sourceLineNo">516</span>          try {<a name="line.516"></a>
+<span class="sourceLineNo">517</span>            LOG.info("Flushing");<a name="line.517"></a>
+<span class="sourceLineNo">518</span>            region.flush(true);<a name="line.518"></a>
+<span class="sourceLineNo">519</span>            Assert.fail("Didn't bubble up IOE!");<a name="line.519"></a>
+<span class="sourceLineNo">520</span>          } catch (DroppedSnapshotException dse) {<a name="line.520"></a>
+<span class="sourceLineNo">521</span>            // What we are expecting<a name="line.521"></a>
+<span class="sourceLineNo">522</span>            region.closing.set(false); // this is needed for the rest of the test to work<a name="line.522"></a>
+<span class="sourceLineNo">523</span>          }<a name="line.523"></a>
+<span class="sourceLineNo">524</span>          // Make it so all writes succeed from here on out<a name="line.524"></a>
+<span class="sourceLineNo">525</span>          ffs.fault.set(false);<a name="line.525"></a>
+<span class="sourceLineNo">526</span>          // Check sizes.  Should still be the one entry.<a name="line.526"></a>
+<span class="sourceLineNo">527</span>          Assert.assertEquals(sizeOfOnePut, region.getMemStoreDataSize());<a name="line.527"></a>
+<span class="sourceLineNo">528</span>          // Now add two entries so that on this next flush that fails, we can see if we<a name="line.528"></a>
+<span class="sourceLineNo">529</span>          // subtract the right amount, the snapshot size only.<a name="line.529"></a>
+<span class="sourceLineNo">530</span>          Put p2 = new Put(row);<a name="line.530"></a>
+<span class="sourceLineNo">531</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.531"></a>
+<span class="sourceLineNo">532</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.532"></a>
+<span class="sourceLineNo">533</span>          region.put(p2);<a name="line.533"></a>
+<span class="sourceLineNo">534</span>          long expectedSize = sizeOfOnePut * 3;<a name="line.534"></a>
+<span class="sourceLineNo">535</span>          Assert.assertEquals(expectedSize, region.getMemStoreDataSize());<a name="line.535"></a>
+<span class="sourceLineNo">536</span>          // Do a successful flush.  It will clear the snapshot only.  Thats how flushes work.<a name="line.536"></a>
+<span class="sourceLineNo">537</span>          // If already a snapshot, we clear it else we move the memstore to be snapshot and flush<a name="line.537"></a>
+<span class="sourceLineNo">538</span>          // it<a name="line.538"></a>
+<span class="sourceLineNo">539</span>          region.flush(true);<a name="line.539"></a>
+<span class="sourceLineNo">540</span>          // Make sure our memory accounting is right.<a name="line.540"></a>
+<span class="sourceLineNo">541</span>          Assert.assertEquals(sizeOfOnePut * 2, region.getMemStoreDataSize());<a name="line.541"></a>
+<span class="sourceLineNo">542</span>        } finally {<a name="line.542"></a>
+<span class="sourceLineNo">543</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.543"></a>
+<span class="sourceLineNo">544</span>        }<a name="line.544"></a>
+<span class="sourceLineNo">545</span>        return null;<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>    FileSystem.closeAllForUGI(user.getUGI());<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>  @Test<a name="line.551"></a>
+<span class="sourceLineNo">552</span>  public void testCloseWithFailingFlush() throws Exception {<a name="line.552"></a>
+<span class="sourceLineNo">553</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.553"></a>
+<span class="sourceLineNo">554</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.554"></a>
+<span class="sourceLineNo">555</span>    // Only retry once.<a name="line.555"></a>
+<span class="sourceLineNo">556</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.556"></a>
+<span class="sourceLineNo">557</span>    final User user =<a name="line.557"></a>
+<span class="sourceLineNo">558</span>      User.createUserForTesting(conf, this.method, new String[]{"foo"});<a name="line.558"></a>
+<span class="sourceLineNo">559</span>    // Inject our faulty LocalFileSystem<a name="line.559"></a>
+<span class="sourceLineNo">560</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.560"></a>
+<span class="sourceLineNo">561</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.561"></a>
+<span class="sourceLineNo">562</span>      @Override<a name="line.562"></a>
+<span class="sourceLineNo">563</span>      public Object run() throws Exception {<a name="line.563"></a>
+<span class="sourceLineNo">564</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.564"></a>
+<span class="sourceLineNo">565</span>        FileSystem fs = FileSystem.get(conf);<a name="line.565"></a>
+<span class="sourceLineNo">566</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.566"></a>
+<span class="sourceLineNo">567</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.567"></a>
+<span class="sourceLineNo">568</span>        HRegion region = null;<a name="line.568"></a>
+<span class="sourceLineNo">569</span>        try {<a name="line.569"></a>
+<span class="sourceLineNo">570</span>          // Initialize region<a name="line.570"></a>
+<span class="sourceLineNo">571</span>          region = initHRegion(tableName, null, null, false,<a name="line.571"></a>
+<span class="sourceLineNo">572</span>              Durability.SYNC_WAL, wal, COLUMN_FAMILY_BYTES);<a name="line.572"></a>
+<span class="sourceLineNo">573</span>          long size = region.getMemStoreDataSize();<a name="line.573"></a>
+<span class="sourceLineNo">574</span>          Assert.assertEquals(0, size);<a name="line.574"></a>
+<span class="sourceLineNo">575</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.575"></a>
+<span class="sourceLineNo">576</span>          Put p1 = new Put(row);<a name="line.576"></a>
+<span class="sourceLineNo">577</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[])null));<a name="line.577"></a>
+<span class="sourceLineNo">578</span>          region.put(p1);<a name="line.578"></a>
+<span class="sourceLineNo">579</span>          // Manufacture an outstanding snapshot -- fake a failed flush by doing prepare step only.<a name="line.579"></a>
+<span class="sourceLineNo">580</span>          HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.580"></a>
+<span class="sourceLineNo">581</span>          StoreFlushContext storeFlushCtx =<a name="line.581"></a>
+<span class="sourceLineNo">582</span>              store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY);<a name="line.582"></a>
+<span class="sourceLineNo">583</span>          storeFlushCtx.prepare();<a name="line.583"></a>
+<span class="sourceLineNo">584</span>          // Now add two entries to the foreground memstore.<a name="line.584"></a>
+<span class="sourceLineNo">585</span>          Put p2 = new Put(row);<a name="line.585"></a>
+<span class="sourceLineNo">586</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.586"></a>
+<span class="sourceLineNo">587</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.587"></a>
+<span class="sourceLineNo">588</span>          region.put(p2);<a name="line.588"></a>
+<span class="sourceLineNo">589</span>          // Now try close on top of a failing flush.<a name="line.589"></a>
+<span class="sourceLineNo">590</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.590"></a>
+<span class="sourceLineNo">591</span>          region = null;<a name="line.591"></a>
+<span class="sourceLineNo">592</span>          fail();<a name="line.592"></a>
+<span class="sourceLineNo">593</span>        } catch (DroppedSnapshotException dse) {<a name="line.593"></a>
+<span class="sourceLineNo">594</span>          // Expected<a name="line.594"></a>
+<span class="sourceLineNo">595</span>          LOG.info("Expected DroppedSnapshotException");<a name="line.595"></a>
+<span class="sourceLineNo">596</span>        } finally {<a name="line.596"></a>
+<span class="sourceLineNo">597</span>          // Make it so all writes succeed from here on out so can close clean<a name="line.597"></a>
+<span class="sourceLineNo">598</span>          ffs.fault.set(false);<a name="line.598"></a>
+<span class="sourceLineNo">599</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.599"></a>
+<span class="sourceLineNo">600</span>        }<a name="line.600"></a>
+<span class="sourceLineNo">601</span>        return null;<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>    FileSystem.closeAllForUGI(user.getUGI());<a name="line.604"></a>
+<span class="sourceLineNo">605</span>  }<a name="line.605"></a>
+<span class="sourceLineNo">606</span><a name="line.606"></a>
+<span class="sourceLineNo">607</span>  @Test<a name="line.607"></a>
+<span class="sourceLineNo">608</span>  public void testCompactionAffectedByScanners() throws Exception {<a name="line.608"></a>
+<span class="sourceLineNo">609</span>    byte[] family = Bytes.toBytes("family");<a name="line.609"></a>
+<span class="sourceLineNo">610</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.610"></a>
+<span class="sourceLineNo">611</span><a name="line.611"></a>
+<span class="sourceLineNo">612</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.612"></a>
+<span class="sourceLineNo">613</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.613"></a>
+<span class="sourceLineNo">614</span>    region.put(put);<a name="line.614"></a>
+<span class="sourceLineNo">615</span>    region.flush(true);<a name="line.615"></a>
+<span class="sourceLineNo">616</span><a name="line.616"></a>
+<span class="sourceLineNo">617</span>    Scan scan = new Scan();<a name="line.617"></a>
+<span class="sourceLineNo">618</span>    scan.setMaxVersions(3);<a name="line.618"></a>
+<span class="sourceLineNo">619</span>    // open the first scanner<a name="line.619"></a>
+<span class="sourceLineNo">620</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.620"></a>
+<span class="sourceLineNo">621</span><a name="line.621"></a>
+<span class="sourceLineNo">622</span>    Delete delete = new Delete(Bytes.toBytes("r1"));<a name="line.622"></a>
+<span class="sourceLineNo">623</span>    region.delete(delete);<a name="line.623"></a>
+<span class="sourceLineNo">624</span>    region.flush(true);<a name="line.624"></a>
+<span class="sourceLineNo">625</span><a name="line.625"></a>
+<span class="sourceLineNo">626</span>    // open the second scanner<a name="line.626"></a>
+<span class="sourceLineNo">627</span>    RegionScanner scanner2 = region.getScanner(scan);<a name="line.627"></a>
+<span class="sourceLineNo">628</span><a name="line.628"></a>
+<span class="sourceLineNo">629</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.629"></a>
+<span class="sourceLineNo">630</span><a name="line.630"></a>
+<span class="sourceLineNo">631</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.631"></a>
+<span class="sourceLineNo">632</span><a name="line.632"></a>
+<span class="sourceLineNo">633</span>    // make a major compaction<a name="line.633"></a>
+<span class="sourceLineNo">634</span>    region.compact(true);<a name="line.634"></a>
+<span class="sourceLineNo">635</span><a name="line.635"></a>
+<span class="sourceLineNo">636</span>    // open the third scanner<a name="line.636"></a>
+<span class="sourceLineNo">637</span>    RegionScanner scanner3 = region.getScanner(scan);<a name="line.637"></a>
+<span class="sourceLineNo">638</span><a name="line.638"></a>
+<span class="sourceLineNo">639</span>    // get data from scanner 1, 2, 3 after major compaction<a name="line.639"></a>
+<span class="sourceLineNo">640</span>    scanner1.next(results);<a name="line.640"></a>
+<span class="sourceLineNo">641</span>    System.out.println(results);<a name="line.641"></a>
+<span class="sourceLineNo">642</span>    assertEquals(1, results.size());<a name="line.642"></a>
+<span class="sourceLineNo">643</span><a name="line.643"></a>
+<span class="sourceLineNo">644</span>    results.clear();<a name="line.644"></a>
+<span class="sourceLineNo">645</span>    scanner2.next(results);<a name="line.645"></a>
+<span class="sourceLineNo">646</span>    System.out.println(results);<a name="line.646"></a>
+<span class="sourceLineNo">647</span>    assertEquals(0, results.size());<a name="line.647"></a>
+<span class="sourceLineNo">648</span><a name="line.648"></a>
+<span class="sourceLineNo">649</span>    results.clear();<a name="line.649"></a>
+<span class="sourceLineNo">650</span>    scanner3.next(results);<a name="line.650"></a>
+<span class="sourceLineNo">651</span>    System.out.println(results);<a name="line.651"></a>
+<span class="sourceLineNo">652</span>    assertEquals(0, results.size());<a name="line.652"></a>
+<span class="sourceLineNo">653</span>  }<a name="line.653"></a>
+<span class="sourceLineNo">654</span><a name="line.654"></a>
+<span class="sourceLineNo">655</span>  @Test<a name="line.655"></a>
+<span class="sourceLineNo">656</span>  public void testToShowNPEOnRegionScannerReseek() throws Exception {<a name="line.656"></a>
+<span class="sourceLineNo">657</span>    byte[] family = Bytes.toBytes("family");<a name="line.657"></a>
+<span class="sourceLineNo">658</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.658"></a>
+<span class="sourceLineNo">659</span><a name="line.659"></a>
+<span class="sourceLineNo">660</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.660"></a>
+<span class="sourceLineNo">661</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.661"></a>
+<span class="sourceLineNo">662</span>    region.put(put);<a name="line.662"></a>
+<span class="sourceLineNo">663</span>    put = new Put(Bytes.toBytes("r2"));<a name="line.663"></a>
+<span class="sourceLineNo">664</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.664"></a>
+<span class="sourceLineNo">665</span>    region.put(put);<a name="line.665"></a>
+<span class="sourceLineNo">666</span>    region.flush(true);<a name="line.666"></a>
+<span class="sourceLineNo">667</span><a name="line.667"></a>
+<span class="sourceLineNo">668</span>    Scan scan = new Scan();<a name="line.668"></a>
+<span class="sourceLineNo">669</span>    scan.setMaxVersions(3);<a name="line.669"></a>
+<span class="sourceLineNo">670</span>    // open the first scanner<a name="line.670"></a>
+<span class="sourceLineNo">671</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.671"></a>
+<span class="sourceLineNo">672</span><a name="line.672"></a>
+<span class="sourceLineNo">673</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.673"></a>
+<span class="sourceLineNo">674</span><a name="line.674"></a>
+<span class="sourceLineNo">675</span>    region.compact(true);<a name="line.675"></a>
+<span class="sourceLineNo">676</span><a name="line.676"></a>
+<span class="sourceLineNo">677</span>    scanner1.reseek(Bytes.toBytes("r2"));<a name="line.677"></a>
+<span class="sourceLineNo">678</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.678"></a>
+<span class="sourceLineNo">679</span>    scanner1.next(results);<a name="line.679"></a>
+<span class="sourceLineNo">680</span>    Cell keyValue = results.get(0);<a name="line.680"></a>
+<span class="sourceLineNo">681</span>    Assert.assertTrue(Bytes.compareTo(CellUtil.cloneRow(keyValue), Bytes.toBytes("r2")) == 0);<a name="line.681"></a>
+<span class="sourceLineNo">682</span>    scanner1.close();<a name="line.682"></a>
+<span class="sourceLineNo">683</span>  }<a name="line.683"></a>
+<span class="sourceLineNo">684</span><a name="line.684"></a>
+<span class="sourceLineNo">685</span>  @Test<a name="line.685"></a>
+<span class="sourceLineNo">686</span>  public void testSkipRecoveredEditsReplay() throws Exception {<a name="line.686"></a>
+<span class="sourceLineNo">687</span>    byte[] family = Bytes.toBytes("family");<a name="line.687"></a>
+<span class="sourceLineNo">688</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.688"></a>
+<span class="sourceLineNo">689</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.689"></a>
+<span class="sourceLineNo">690</span>    try {<a name="line.690"></a>
+<span class="sourceLineNo">691</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.691"></a>
+<span class="sourceLineNo">692</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.692"></a>
+<span class="sourceLineNo">693</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.693"></a>
+<span class="sourceLineNo">694</span><a name="line.694"></a>
+<span class="sourceLineNo">695</span>      Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.695"></a>
+<span class="sourceLineNo">696</span><a name="line.696"></a>
+<span class="sourceLineNo">697</span>      long maxSeqId = 1050;<a name="line.697"></a>
+<span class="sourceLineNo">698</span>      long minSeqId = 1000;<a name="line.698"></a>
+<span class="sourceLineNo">699</span><a name="line.699"></a>
+<span class="sourceLineNo">700</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.700"></a>
+<span class="sourceLineNo">701</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.701"></a>
+<span class="sourceLineNo">702</span>        fs.create(recoveredEdits);<a name="line.702"></a>
+<span class="sourceLineNo">703</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.703"></a>
+<span class="sourceLineNo">704</span><a name="line.704"></a>
+<span class="sourceLineNo">705</span>        long time = System.nanoTime();<a name="line.705"></a>
+<span class="sourceLineNo">706</span>        WALEdit edit = new WALEdit();<a name="line.706"></a>
+<span class="sourceLineNo">707</span>        edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.707"></a>
+<span class="sourceLineNo">708</span>            .toBytes(i)));<a name="line.708"></a>
+<span class="sourceLineNo">709</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.709"></a>
+<span class="sourceLineNo">710</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.710"></a>
+<span class="sourceLineNo">711</span><a name="line.711"></a>
+<span class="sourceLineNo">712</span>        writer.close();<a name="line.712"></a>
+<span class="sourceLineNo">713</span>      }<a name="line.713"></a>
+<span class="sourceLineNo">714</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.714"></a>
+<span class="sourceLineNo">715</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.715"></a>
+<span class="sourceLineNo">716</span>      for (HStore store : region.getStores()) {<a name="line.716"></a>
+<span class="sourceLineNo">717</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), minSeqId - 1);<a name="line.717"></a>
+<span class="sourceLineNo">718</span>      }<a name="line.718"></a>
+<span class="sourceLineNo">719</span>      long seqId = region.replayRecoveredEditsIfAny(maxSeqIdInStores, null, status);<a name="line.719"></a>
+<span class="sourceLineNo">720</span>      assertEquals(maxSeqId, seqId);<a name="line.720"></a>
+<span class="sourceLineNo">721</span>      region.getMVCC().advanceTo(seqId);<a name="line.721"></a>
+<span class="sourceLineNo">722</span>      Get get = new Get(row);<a name="line.722"></a>
+<span class="sourceLineNo">723</span>      Result result = region.get(get);<a name="line.723"></a>
+<span class="sourceLineNo">724</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.724"></a>
+<span class="sourceLineNo">725</span>        List&lt;Cell&gt; kvs = result.getColumnCells(family, Bytes.toBytes(i));<a name="line.725"></a>
+<span class="sourceLineNo">726</span>        assertEquals(1, kvs.size());<a name="line.726"></a>
+<span class="sourceLineNo">727</span>        assertArrayEquals(Bytes.toBytes(i), CellUtil.cloneValue(kvs.get(0)));<a name="line.727"></a>
+<span class="sourceLineNo">728</span>      }<a name="line.728"></a>
+<span class="sourceLineNo">729</span>    } finally {<a name="line.729"></a>
+<span class="sourceLineNo">730</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.730"></a>
+<span class="sourceLineNo">731</span>      this.region = null;<a name="line.731"></a>
+<span class="sourceLineNo">732</span>      wals.close();<a name="line.732"></a>
+<span class="sourceLineNo">733</span>    }<a name="line.733"></a>
+<span class="sourceLineNo">734</span>  }<a name="line.734"></a>
+<span class="sourceLineNo">735</span><a name="line.735"></a>
+<span class="sourceLineNo">736</span>  @Test<a name="line.736"></a>
+<span class="sourceLineNo">737</span>  public void testSkipRecoveredEditsReplaySomeIgnored() throws Exception {<a name="line.737"></a>
+<span class="sourceLineNo">738</span>    byte[] family = Bytes.toBytes("family");<a name="line.738"></a>
+<span class="sourceLineNo">739</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.739"></a>
+<span class="sourceLineNo">740</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.740"></a>
+<span class="sourceLineNo">741</span>    try {<a name="line.741"></a>
+<span class="sourceLineNo">742</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.742"></a>
+<span class="sourceLineNo">743</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.743"></a>
+<span class="sourceLineNo">744</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.744"></a>
+<span class="sourceLineNo">745</span><a name="line.745"></a>
+<span class="sourceLineNo">746</span>      Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.746"></a>
+<span class="sourceLineNo">747</span><a name="line.747"></a>
+<span class="sourceLineNo">748</span>      long maxSeqId = 1050;<a name="line.748"></a>
+<span class="sourceLineNo">749</span>      long minSeqId = 1000;<a name="line.749"></a>
+<span class="sourceLineNo">750</span><a name="line.750"></a>
+<span class="sourceLineNo">751</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.751"></a>
+<span class="sourceLineNo">752</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.752"></a>
+<span class="sourceLineNo">753</span>        fs.create(recoveredEdits);<a name="line.753"></a>
+<span class="sourceLineNo">754</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.754"></a>
+<span class="sourceLineNo">755</span><a name="line.755"></a>
+<span class="sourceLineNo">756</span>        long time = System.nanoTime();<a name="line.756"></a>
+<span class="sourceLineNo">757</span>        WALEdit edit = new WALEdit();<a name="line.757"></a>
+<span class="sourceLineNo">758</span>        edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.758"></a>
+<span class="sourceLineNo">759</span>            .toBytes(i)));<a name="line.759"></a>
+<span class="sourceLineNo">760</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.760"></a>
+<span class="sourceLineNo">761</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.761"></a>
+<span class="sourceLineNo">762</span><a name="line.762"></a>
+<span class="sourceLineNo">763</span>        writer.close();<a name="line.763"></a>
+<span class="sourceLineNo">764</span>      }<a name="line.764"></a>
+<span class="sourceLineNo">765</span>      long recoverSeqId = 1030;<a name="line.765"></a>
+<span class="sourceLineNo">766</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.766"></a>
+<span class="sourceLineNo">767</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.767"></a>
+<span class="sourceLineNo">768</span>      for (HStore store : region.getStores()) {<a name="line.768"></a>
+<span class="sourceLineNo">769</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), recoverSeqId - 1);<a name="line.769"></a>
+<span class="sourceLineNo">770</span>      }<a name="line.770"></a>
+<span class="sourceLineNo">771</span>      long seqId = region.replayRecoveredEditsIfAny(maxSeqIdInStores, null, status);<a name="line.771"></a>
+<span class="sourceLineNo">772</span>      assertEquals(maxSeqId, seqId);<a name="line.772"></a>
+<span class="sourceLineNo">773</span>      region.getMVCC().advanceTo(seqId);<a name="line.773"></a>
+<span class="sourceLineNo">774</span>      Get get = new Get(row);<a name="line.774"></a>
+<span class="sourceLineNo">775</span>      Result result = region.get(get);<a name="line.775"></a>
+<span class="sourceLineNo">776</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.776"></a>
+<span class="sourceLineNo">777</span>        List&lt;Cell&gt; kvs = result.getColumnCells(family, Bytes.toBytes(i));<a name="line.777"></a>
+<span class="sourceLineNo">778</span>        if (i &lt; recoverSeqId) {<a name="line.778"></a>
+<span class="sourceLineNo">779</span>          assertEquals(0, kvs.size());<a name="line.779"></a>
+<span class="sourceLineNo">780</span>        } else {<a name="line.780"></a>
+<span class="sourceLineNo">781</span>          assertEquals(1, kvs.size());<a name="line.781"></a>
+<span class="sourceLineNo">782</span>          assertArrayEquals(Bytes.toBytes(i), CellUtil.cloneValue(kvs.get(0)));<a name="line.782"></a>
+<span class="sourceLineNo">783</span>        }<a name="line.783"></a>
+<span class="sourceLineNo">784</span>      }<a name="line.784"></a>
+<span class="sourceLineNo">785</span>    } finally {<a name="line.785"></a>
+<span class="sourceLineNo">786</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.786"></a>
+<span class="sourceLineNo">787</span>      this.region = null;<a name="line.787"></a>
+<span class="sourceLineNo">788</span>      wals.close();<a name="line.788"></a>
+<span class="sourceLineNo">789</span>    }<a name="line.789"></a>
+<span class="sourceLineNo">790</span>  }<a name="line.790"></a>
+<span class="sourceLineNo">791</span><a name="line.791"></a>
+<span class="sourceLineNo">792</span>  @Test<a name="line.792"></a>
+<span class="sourceLineNo">793</span>  public void testSkipRecoveredEditsReplayAllIgnored() throws Exception {<a name="line.793"></a>
+<span class="sourceLineNo">794</span>    byte[] family = Bytes.toBytes("family");<a name="line.794"></a>
+<span class="sourceLineNo">795</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.795"></a>
+<span class="sourceLineNo">796</span>    Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.796"></a>
+<span class="sourceLineNo">797</span>    FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.797"></a>
+<span class="sourceLineNo">798</span><a name="line.798"></a>
+<span class="sourceLineNo">799</span>    Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.799"></a>
+<span class="sourceLineNo">800</span>    for (int i = 1000; i &lt; 1050; i += 10) {<a name="line.800"></a>
+<span class="sourceLineNo">801</span>      Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.801"></a>
+<span class="sourceLineNo">802</span>      FSDataOutputStream dos = fs.create(recoveredEdits);<a name="line.802"></a>
+<span class="sourceLineNo">803</span>      dos.writeInt(i);<a name="line.803"></a>
+<span class="sourceLineNo">804</span>      dos.close();<a name="line.804"></a>
+<span class="sourceLineNo">805</span>    }<a name="line.805"></a>
+<span class="sourceLineNo">806</span>    long minSeqId = 2000;<a name="line.806"></a>
+<span class="sourceLineNo">807</span>    Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", minSeqId - 1));<a name="line.807"></a>
+<span class="sourceLineNo">808</span>    FSDataOutputStream dos = fs.create(recoveredEdits);<a name="line.808"></a>
+<span class="sourceLineNo">809</span>    dos.close();<a name="line.809"></a>
+<span class="sourceLineNo">810</span><a name="line.810"></a>
+<span class="sourceLineNo">811</span>    Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.811"></a>
+<span class="sourceLineNo">812</span>    for (HStore store : region.getStores()) {<a name="line.812"></a>
+<span class="sourceLineNo">813</span>      maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), minSeqId);<a name="line.813"></a>
+<span class="sourceLineNo">814</span>    }<a name="line.814"></a>
+<span class="sourceLineNo">815</span>    long seqId = region.replayRecoveredEditsIfAny(maxSeqIdInStores, null, null);<a name="line.815"></a>
+<span class="sourceLineNo">816</span>    assertEquals(minSeqId, seqId);<a name="line.816"></a>
+<span class="sourceLineNo">817</span>  }<a name="line.817"></a>
+<span class="sourceLineNo">818</span><a name="line.818"></a>
+<span class="sourceLineNo">819</span>  @Test<a name="line.819"></a>
+<span class="sourceLineNo">820</span>  public void testSkipRecoveredEditsReplayTheLastFileIgnored() throws Exception {<a name="line.820"></a>
+<span class="sourceLineNo">821</span>    byte[] family = Bytes.toBytes("family");<a name="line.821"></a>
+<span class="sourceLineNo">822</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.822"></a>
+<span class="sourceLineNo">823</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.823"></a>
+<span class="sourceLineNo">824</span>    try {<a name="line.824"></a>
+<span class="sourceLineNo">825</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.825"></a>
+<span class="sourceLineNo">826</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.826"></a>
+<span class="sourceLineNo">827</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.827"></a>
+<span class="sourceLineNo">828</span>      byte[][] columns = region.getTableDescriptor().getColumnFamilyNames().toArray(new byte[0][]);<a name="line.828"></a>
+<span class="sourceLineNo">829</span><a name="line.829"></a>
+<span class="sourceLineNo">830</span>      assertEquals(0, region.getStoreFileList(columns).size());<a name="line.830"></a>
+<span class="sourceLineNo">831</span><a name="line.831"></a>
+<span class="sourceLineNo">832</span>      Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.832"></a>
+<span class="sourceLineNo">833</span><a name="line.833"></a>
+<span class="sourceLineNo">834</span>      long maxSeqId = 1050;<a name="line.834"></a>
+<span class="sourceLineNo">835</span>      long minSeqId = 1000;<a name="line.835"></a>
+<span class="sourceLineNo">836</span><a name="line.836"></a>
+<span class="sourceLineNo">837</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.837"></a>
+<span class="sourceLineNo">838</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.838"></a>
+<span class="sourceLineNo">839</span>        fs.create(recoveredEdits);<a name="line.839"></a>
+<span class="sourceLineNo">840</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.840"></a>
+<span class="sourceLineNo">841</span><a name="line.841"></a>
+<span class="sourceLineNo">842</span>        long time = System.nanoTime();<a name="line.842"></a>
+<span class="sourceLineNo">843</span>        WALEdit edit = null;<a name="line.843"></a>
+<span class="sourceLineNo">844</span>        if (i == maxSeqId) {<a name="line.844"></a>
+<span class="sourceLineNo">845</span>          edit = WALEdit.createCompaction(region.getRegionInfo(),<a name="line.845"></a>
+<span class="sourceLineNo">846</span>          CompactionDescriptor.newBuilder()<a name="line.846"></a>
+<span class="sourceLineNo">847</span>          .setTableName(ByteString.copyFrom(tableName.getName()))<a name="line.847"></a>
+<span class="sourceLineNo">848</span>          .setFamilyName(ByteString.copyFrom(regionName))<a name="line.848"></a>
+<span class="sourceLineNo">849</span>          .setEncodedRegionName(ByteString.copyFrom(regionName))<a name="line.849"></a>
+<span class="sourceLineNo">850</span>          .setStoreHomeDirBytes(ByteString.copyFrom(Bytes.toBytes(regiondir.toString())))<a name="line.850"></a>
+<span class="sourceLineNo">851</span>          .setRegionName(ByteString.copyFrom(region.getRegionInfo().getRegionName()))<a name="line.851"></a>
+<span class="sourceLineNo">852</span>          .build());<a name="line.852"></a>
+<span class="sourceLineNo">853</span>        } else {<a name="line.853"></a>
+<span class="sourceLineNo">854</span>          edit = new WALEdit();<a name="line.854"></a>
+<span class="sourceLineNo">855</span>          edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.855"></a>
+<span class="sourceLineNo">856</span>            .toBytes(i)));<a name="line.856"></a>
+<span class="sourceLineNo">857</span>        }<a name="line.857"></a>
+<span class="sourceLineNo">858</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.858"></a>
+<span class="sourceLineNo">859</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.859"></a>
+<span class="sourceLineNo">860</span>        writer.close();<a name="line.860"></a>
+<span class="sourceLineNo">861</span>      }<a name="line.861"></a>
+<span class="sourceLineNo">862</span><a name="line.862"></a>
+<span class="sourceLineNo">863</span>      long recoverSeqId = 1030;<a name="line.863"></a>
+<span class="sourceLineNo">864</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.864"></a>
+<span class="sourceLineNo">865</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.865"></a>
+<span class="sourceLineNo">866</span>      for (HStore store : region.getStores()) {<a name="line.866"></a>
+<span class="sourceLineNo">867</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), recoverSeqId - 1);<a name="line.867"></a>
+<span class="sourceLineNo">868</span>      }<a name="line.868"></a>
+<span class="sourceLineNo">869</span>      long seqId = region.replayRecoveredEditsIfAny(maxSeqIdInStores, null, status);<a name="line.869"></a>
+<span class="sourceLineNo">870</span>      assertEquals(maxSeqId, seqId);<a name="line.870"></a>
+<span class="sourceLineNo">871</span><a name="line.871"></a>
+<span class="sourceLineNo">872</span>      // assert that the files are flushed<a name="line.872"></a>
+<span class="sourceLineNo">873</span>      assertEquals(1, region.getStoreFileList(columns).size());<a name="line.873"></a>
+<span class="sourceLineNo">874</span><a name="line.874"></a>
+<span class="sourceLineNo">875</span>    } finally {<a name="line.875"></a>
+<span class="sourceLineNo">876</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.876"></a>
+<span class="sourceLineNo">877</span>      this.region = null;<a name="line.877"></a>
+<span class="sourceLineNo">878</span>      wals.close();<a name="line.878"></a>
+<span class="sourceLineNo">879</span>    }<a name="line.879"></a>
+<span class="sourceLineNo">880</span>  }<a name="line.880"></a>
+<span class="sourceLineNo">881</span><a name="line.881"></a>
+<span class="sourceLineNo">882</span>  @Test<a name="line.882"></a>
+<span class="sourceLineNo">883</span>  public void testRecoveredEditsReplayCompaction() throws Exception {<a name="line.883"></a>
+<span class="sourceLineNo">884</span>    testRecoveredEditsReplayCompaction(false);<a name="line.884"></a>
+<span class="sourceLineNo">885</span>    testRecoveredEditsReplayCompaction(true);<a name="line.885"></a>
+<span class="sourceLineNo">886</span>  }<a name="line.886"></a>
+<span class="sourceLineNo">887</span><a name="line.887"></a>
+<span class="sourceLineNo">888</span>  public void testRecoveredEditsReplayCompaction(boolean mismatchedRegionName) throws Exception {<a name="line.888"></a>
+<span class="sourceLineNo">889</span>    CONF.setClass(HConstants.REGION_IMPL, HRegionForTesting.class, Region.class);<a name="line.889"></a>
+<span class="sourceLineNo">890</span>    byte[] family = Bytes.toBytes("family");<a name="line.890"></a>
+<span class="sourceLineNo">891</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.891"></a>
+<span class="sourceLineNo">892</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.892"></a>
+<span class="sourceLineNo">893</span>    try {<a name="line.893"></a>
+<span class="sourceLineNo">894</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.894"></a>
+<span class="sourceLineNo">895</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.895"></a>
+<span class="sourceLineNo">896</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.896"></a>
+<span class="sourceLineNo">897</span><a name="line.897"></a>
+<span class="sourceLineNo">898</span>      long maxSeqId = 3;<a name="line.898"></a>
+<span class="sourceLineNo">899</span>      long minSeqId = 0;<a name="line.899"></a>
+<span class="sourceLineNo">900</span><a name="line.900"></a>
+<span class="sourceLineNo">901</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.901"></a>
+<span class="sourceLineNo">902</span>        Put put = new Put(Bytes.toBytes(i));<a name="line.902"></a>
+<span class="sourceLineNo">903</span>        put.addColumn(family, Bytes.toBytes(i), Bytes.toBytes(i));<a name="line.903"></a>
+<span class="sourceLineNo">904</span>        region.put(put);<a name="line.904"></a>
+<span class="sourceLineNo">905</span>        region.flush(true);<a name="line.905"></a>
+<span class="sourceLineNo">906</span>      }<a name="line.906"></a>
+<span class="sourceLineNo">907</span><a name="line.907"></a>
+<span class="sourceLineNo">908</span>      // this will create a region with 3 files<a name="line.908"></a>
+<span class="sourceLineNo">909</span>      assertEquals(3, region.getStore(family).getStorefilesCount());<a name="line.909"></a>
+<span class="sourceLineNo">910</span>      List&lt;Path&gt; storeFiles = new ArrayList&lt;&gt;(3);<a name="line.910"></a>
+<span class="sourceLineNo">911</span>      for (HStoreFile sf : region.getStore(family).getStorefiles()) {<a name="line.911"></a>
+<span class="sourceLineNo">912</span>        storeFiles.add(sf.getPath());<a name="line.912"></a>
+<span class="sourceLineNo">913</span>      }<a name="line.913"></a>
+<span class="sourceLineNo">914</span><a name="line.914"></a>
+<span class="sourceLineNo">915</span>      // disable compaction completion<a name="line.915"></a>
+<span class="sourceLineNo">916</span>      CONF.setBoolean("hbase.hstore.compaction.complete", false);<a name="line.916"></a>
+<span class="sourceLineNo">917</span>      region.compactStores();<a name="line.917"></a>
+<span class="sourceLineNo">918</span><a name="line.918"></a>
+<span class="sourceLineNo">919</span>      // ensure that nothing changed<a name="line.919"></a>
+<span class="sourceLineNo">920</span>      assertEquals(3, region.getStore(family).getStorefilesCount());<a name="line.920"></a>
+<span class="sourceLineNo">921</span><a name="line.921"></a>
+<span class="sourceLineNo">922</span>      // now find the compacted file, and manually add it to the recovered edits<a name="line.922"></a>
+<span class="sourceLineNo">923</span>      Path tmpDir = new Path(region.getRegionFileSystem().getTempDir(), Bytes.toString(family));<a name="line.923"></a>
+<span class="sourceLineNo">924</span>      FileStatus[] files = FSUtils.listStatus(fs, tmpDir);<a name="line.924"></a>
+<span class="sourceLineNo">925</span>      String errorMsg = "Expected to find 1 file in the region temp directory "<a name="line.925"></a>
+<span class="sourceLineNo">926</span>          + "from the compaction, could not find any";<a name="line.926"></a>
+<span class="sourceLineNo">927</span>      assertNotNull(errorMsg, files);<a name="line.927"></a>
+<span class="sourceLineNo">928</span>      assertEquals(errorMsg, 1, files.length);<a name="line.928"></a>
+<span class="sourceLineNo">929</span>      // move the file inside region dir<a name="line.929"></a>
+<span class="sourceLineNo">930</span>      Path newFile = region.getRegionFileSystem().commitStoreFile(Bytes.toString(family),<a name="line.930"></a>
+<span class="sourceLineNo">931</span>          files[0].getPath());<a name="line.931"></a>
+<span class="sourceLineNo">932</span><a name="line.932"></a>
+<span class="sourceLineNo">933</span>      byte[] encodedNameAsBytes = this.region.getRegionInfo().getEncodedNameAsBytes();<a name="line.933"></a>
+<span class="sourceLineNo">934</span>      byte[] fakeEncodedNameAsBytes = new byte [encodedNameAsBytes.length];<a name="line.934"></a>
+<span class="sourceLineNo">935</span>      for (int i=0; i &lt; encodedNameAsBytes.length; i++) {<a name="line.935"></a>
+<span class="sourceLineNo">936</span>        // Mix the byte array to have a new encodedName<a name="line.936"></a>
+<span class="sourceLineNo">937</span>        fakeEncodedNameAsBytes[i] = (byte) (encodedNameAsBytes[i] + 1);<a name="line.937"></a>
+<span class="sourceLineNo">938</span>      }<a name="line.938"></a>
+<span class="sourceLineNo">939</span><a name="line.939"></a>
+<span class="sourceLineNo">940</span>      CompactionDescriptor compactionDescriptor = ProtobufUtil.toCompactionDescriptor(this.region<a name="line.940"></a>
+<span class="sourceLineNo">941</span>        .getRegionInfo(), mismatchedRegionName ? fakeEncodedNameAsBytes : null, family,<a name="line.941"></a>
+<span class="sourceLineNo">942</span>            storeFiles, Lists.newArrayList(newFile),<a name="line.942"></a>
+<span class="sourceLineNo">943</span>            region.getRegionFileSystem().getStoreDir(Bytes.toString(family)));<a name="line.943"></a>
+<span class="sourceLineNo">944</span><a name="line.944"></a>
+<span class="sourceLineNo">945</span>      WALUtil.writeCompactionMarker(region.getWAL(), this.region.getReplicationScope(),<a name="line.945"></a>
+<span class="sourceLineNo">946</span>          this.region.getRegionInfo(), compactionDescriptor, region.getMVCC());<a name="line.946"></a>
+<span class="sourceLineNo">947</span><a name="line.947"></a>
+<span class="sourceLineNo">948</span>      Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.948"></a>
+<span class="sourceLineNo">949</span><a name="line.949"></a>
+<span class="sourceLineNo">950</span>      Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", 1000));<a name="line.950"></a>
+<span class="sourceLineNo">951</span>      fs.create(recoveredEdits);<a name="line.951"></a>
+<span class="sourceLineNo">952</span>      WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.952"></a>
+<span class="sourceLineNo">953</span><a name="line.953"></a>
+<span class="sourceLineNo">954</span>      long time = System.nanoTime();<a name="line.954"></a>
+<span class="sourceLineNo">955</span><a name="line.955"></a>
+<span class="sourceLineNo">956</span>      writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, 10, time,<a name="line.956"></a>
+<span class="sourceLineNo">957</span>          HConstants.DEFAULT_CLUSTER_ID), WALEdit.createCompaction(region.getRegionInfo(),<a name="line.957"></a>
+<span class="sourceLineNo">958</span>          compactionDescriptor)));<a name="line.958"></a>
+<span class="sourceLineNo">959</span>      writer.close();<a name="line.959"></a>
+<span class="sourceLineNo">960</span><a name="line.960"></a>
+<span class="sourceLineNo">961</span>      // close the region now, and reopen again<a name="line.961"></a>
+<span class="sourceLineNo">962</span>      region.getTableDescriptor();<a name="line.962"></a>
+<span class="sourceLineNo">963</span>      region.getRegionInfo();<a name="line.963"></a>
+<span class="sourceLineNo">964</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.964"></a>
+<span class="sourceLineNo">965</span>      try {<a name="line.965"></a>
+<span class="sourceLineNo">966</span>        region = HRegion.openHRegion(region, null);<a name="line.966"></a>
+<span class="sourceLineNo">967</span>      } catch (WrongRegionException wre) {<a name="line.967"></a>
+<span class="sourceLineNo">968</span>        fail("Matching encoded region name should not have produced WrongRegionException");<a name="line.968"></a>
+<span class="sourceLineNo">969</span>      }<a name="line.969"></a>
+<span class="sourceLineNo">970</span><a name="line.970"></a>
+<span class="sourceLineNo">971</span>      // now check whether we have only one store file, the compacted one<a name="line.971"></a>
+<span class="sourceLineNo">972</span>      Collection&lt;HStoreFile&gt; sfs = region.getStore(family).getStorefiles();<a name="line.972"></a>
+<span class="sourceLineNo">973</span>      for (HStoreFile sf : sfs) {<a name="line.973"></a>
+<span class="sourceLineNo">974</span>        LOG.info(Objects.toString(sf.getPath()));<a name="line.974"></a>
+<span class="sourceLineNo">975</span>      }<a name="line.975"></a>
+<span class="sourceLineNo">976</span>      if (!mismatchedRegionName) {<a name="line.976"></a>
+<span class="sourceLineNo">977</span>        assertEquals(1, region.getStore(family).getStorefilesCount());<a name="line.977"></a>
+<span class="sourceLineNo">978</span>      }<a name="line.978"></a>
+<span class="sourceLineNo">979</span>      files = FSUtils.listStatus(fs, tmpDir);<a name="line.979"></a>
+<span class="sourceLineNo">980</span>      assertTrue("Expected to find 0 files inside " + tmpDir, files == null || files.length == 0);<a name="line.980"></a>
+<span class="sourceLineNo">981</span><a name="line.981"></a>
+<span class="sourceLineNo">982</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.982"></a>
+<span class="sourceLineNo">983</span>        Get get = new Get(Bytes.toBytes(i));<a name="line.983"></a>
+<span class="sourceLineNo">984</span>        Result result = region.get(get);<a name="line.984"></a>
+<span class="sourceLineNo">985</span>        byte[] value = result.getValue(family, Bytes.toBytes(i));<a name="line.985"></a>
+<span class="sourceLineNo">986</span>        assertArrayEquals(Bytes.toBytes(i), value);<a name="line.986"></a>
+<span class="sourceLineNo">987</span>      }<a name="line.987"></a>
+<span class="sourceLineNo">988</span>    } finally {<a name="line.988"></a>
+<span class="sourceLineNo">989</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.989"></a>
+<span class="sourceLineNo">990</span>      this.region = null;<a name="line.990"></a>
+<span class="sourceLineNo">991</span>      wals.close();<a name="line.991"></a>
+<span class="sourceLineNo">992</span>      CONF.setClass(HConstants.REGION_IMPL, HRegion.class, Region.class);<a name="line.992"></a>
+<span class="sourceLineNo">993</span>    }<a name="line.993"></a>
+<span class="sourceLineNo">994</span>  }<a name="line.994"></a>
+<span class="sourceLineNo">995</span><a name="line.995"></a>
+<span class="sourceLineNo">996</span>  @Test<a name="line.996"></a>
+<span class="sourceLineNo">997</span>  public void testFlushMarkers() throws Exception {<a name="line.997"></a>
+<span class="sourceLineNo">998</span>    // tests that flush markers are written to WAL and handled at recovered edits<a name="line.998"></a>
+<span class="sourceLineNo">999</span>    byte[] family = Bytes.toBytes("family");<a name="line.999"></a>
+<span class="sourceLineNo">1000</span>    Path logDir = TEST_UTIL.getDataTestDirOnTestFS(method + ".log");<a name="line.1000"></a>
+<span class="sourceLineNo">1001</span>    final Configuration walConf = new Configuration(TEST_UTIL.getConfiguration());<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.1002"></a>
+<span class="sourceLineNo">1003</span>    final WALFactory wals = new WALFactory(walConf, method);<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span>    final WAL wal = wals.getWAL(RegionInfoBuilder.newBuilder(tableName).build());<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span><a name="line.1005"></a>
+<span class="sourceLineNo">1006</span>    this.region = initHRegion(tableName, HConstants.EMPTY_START_ROW,<a name="line.1006"></a>
+<span class="sourceLineNo">1007</span>      HConstants.EMPTY_END_ROW, false, Durability.USE_DEFAULT, wal, family);<a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>    try {<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span><a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>      long maxSeqId = 3;<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span>      long minSeqId = 0;<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span><a name="line.1015"></a>
+<span class="sourceLineNo">1016</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>        Put put = new Put(Bytes.toBytes(i));<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span>        put.addColumn(family, Bytes.toBytes(i), Bytes.toBytes(i));<a name="line.1018"></a>
+<span class="sourceLineNo">1019</span>        region.put(put);<a name="line.1019"></a>
+<span class="sourceLineNo">1020</span>        region.flush(true);<a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>      }<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span><a name="line.1022"></a>
+<span class="sourceLineNo">1023</span>      // this will create a region with 3 files from flush<a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>      assertEquals(3, region.getStore(family).getStorefilesCount());<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span>      List&lt;String&gt; storeFiles = new ArrayList&lt;&gt;(3);<a name="line.1025"></a>
+<span class="sourceLineNo">1026</span>      for (HStoreFile sf : region.getStore(family).getStorefiles()) {<a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>        storeFiles.add(sf.getPath().getName());<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span>      }<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span><a name="line.1029"></a>
+<span class="sourceLineNo">1030</span>      // now verify that the flush markers are written<a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>      wal.shutdown();<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>      WAL.Reader reader = WALFactory.createReader(fs, AbstractFSWALProvider.getCurrentFileName(wal),<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>        TEST_UTIL.getConfiguration());<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>      try {<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span>        List&lt;WAL.Entry&gt; flushDescriptors = new ArrayList&lt;&gt;();<a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>        long lastFlushSeqId = -1;<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>        while (true) {<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>          WAL.Entry entry = reader.next();<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>          if (entry == null) {<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>            break;<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span>          }<a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>          Cell cell = entry.getEdit().getCells().get(0);<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>          if (WALEdit.isMetaEditFamily(cell)) {<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>            FlushDescriptor flushDesc = WALEdit.getFlushDescriptor(cell);<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span>            assertNotNull(flushDesc);<a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>            assertArrayEquals(tableName.getName(), flushDesc.getTableName().toByteArray());<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>            if (flushDesc.getAction() == FlushAction.START_FLUSH) {<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span>              assertTrue(flushDesc.getFlushSequenceNumber() &gt; lastFlushSeqId);<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span>            } else if (flushDesc.getAction() == FlushAction.COMMIT_FLUSH) {<a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>              assertTrue(flushDesc.getFlushSequenceNumber() == lastFlushSeqId);<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>            }<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>            lastFlushSeqId = flushDesc.getFlushSequenceNumber();<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>            assertArrayEquals(regionName, flushDesc.getEncodedRegionName().toByteArray());<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>            assertEquals(1, flushDesc.getStoreFlushesCount()); //only one store<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>            StoreFlushDescriptor storeFlushDesc = flushDesc.getStoreFlushes(0);<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>            assertArrayEquals(family, storeFlushDesc.getFamilyName().toByteArray());<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span>            assertEquals("family", storeFlushDesc.getStoreHomeDir());<a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>            if (flushDesc.getAction() == FlushAction.START_FLUSH) {<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>              assertEquals(0, storeFlushDesc.getFlushOutputCount());<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>            } else {<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>              assertEquals(1, storeFlushDesc.getFlushOutputCount()); //only one file from flush<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>              assertTrue(storeFiles.contains(storeFlushDesc.getFlushOutput(0)));<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>            }<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span><a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>            flushDescriptors.add(entry);<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>          }<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>        }<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span><a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>        assertEquals(3 * 2, flushDescriptors.size()); // START_FLUSH and COMMIT_FLUSH per flush<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span><a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>        // now write those markers to the recovered edits again.<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span><a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>        Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span><a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", 1000));<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>        fs.create(recoveredEdits);<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span><a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>        for (WAL.Entry entry : flushDescriptors) {<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>          writer.append(entry);<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>        }<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>        writer.close();<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>      } finally {<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>        if (null != reader) {<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>          try {<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>            reader.close();<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>          } catch (IOException exception) {<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>            LOG.warn("Problem closing wal: " + exception.getMessage());<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>            LOG.debug("exception details", exception);<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>          }<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>        }<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>      }<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span><a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>      // close the region now, and reopen again<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>      region = HRegion.openHRegion(region, null);<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span><a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>      // now check whether we have can read back the data from region<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>        Get get = new Get(Bytes.toBytes(i));<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>        Result result = region.get(get);<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>        byte[] value = result.getValue(family, Bytes.toBytes(i));<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>        assertArrayEquals(Bytes.toBytes(i), value);<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>      }<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>    } finally {<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>      this.region = null;<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>      wals.close();<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>    }<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>  }<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span><a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>  static class IsFlushWALMarker implements ArgumentMatcher&lt;WALEdit&gt; {<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>    volatile FlushAction[] actions;<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>    public IsFlushWALMarker(FlushAction... actions) {<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>      this.actions = actions;<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>    }<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span>    @Override<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>    public boolean matches(WALEdit edit) {<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>      List&lt;Cell&gt; cells = edit.getCells();<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>      if (cells.isEmpty()) {<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span>        return false;<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>      }<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>      if (WALEdit.isMetaEditFamily(cells.get(0))) {<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>        FlushDescriptor desc;<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>        try {<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>          desc = WALEdit.getFlushDescriptor(cells.get(0));<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>        } catch (IOException e) {<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>          LOG.warn(e.toString(), e);<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>          return false;<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>        }<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>        if (desc != null) {<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>          for (FlushAction action : actions) {<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>            if (desc.getAction() == action) {<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>              return true;<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>            }<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>          }<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>        }<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>      }<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span>      return false;<a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>    }<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>    public IsFlushWALMarker set(FlushAction... actions) {<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>      this.actions = actions;<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>      return this;<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>    }<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>  }<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span><a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>  @Test<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span>  public void testFlushMarkersWALFail() throws Exception {<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>    // test the cases where the WAL append for flush markers fail.<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>    byte[] family = Bytes.toBytes("family");<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span><a name="line.1151"></a>
+<span class="sourceLineNo">1152</span>    // spy an actual WAL implementation to throw exception (was not able to mock)<a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>    Path logDir = TEST_UTIL.getDataTestDirOnTestFS(method + "log");<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span><a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>    final Configuration walConf = new Configuration(TEST_UTIL.getConfiguration());<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>    // Make up a WAL that we can manipulate at append time.<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>    class FailAppendFlushMarkerWAL extends FSHLog {<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>      volatile FlushAction [] flushActions = null;<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span><a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>      public FailAppendFlushMarkerWAL(FileSystem fs, Path root, String logDir, Configuration conf)<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>      throws IOException {<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>        super(fs, root, logDir, conf);<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>      }<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span><a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>      @Override<a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>      protected Writer createWriterInstance(Path path) throws IOException {<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>        final Writer w = super.createWriterInstance(path);<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>        return new Writer() {<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>          @Override<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>          public void close() throws IOException {<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>            w.close();<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>          }<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span><a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>          @Override<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>          public void sync(boolean forceSync) throws IOException {<a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>            w.sync(forceSync);<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span>          }<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span><a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>          @Override<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>          public void append(Entry entry) throws IOException {<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>            List&lt;Cell&gt; cells = entry.getEdit().getCells();<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>            if (WALEdit.isMetaEditFamily(cells.get(0))) {<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>              FlushDescriptor desc = WALEdit.getFlushDescriptor(cells.get(0));<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>              if (desc != null) {<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>                for (FlushAction flushAction: flushActions) {<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>                  if (desc.getAction().equals(flushAction)) {<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>                    throw new IOException("Failed to append flush marker! " + flushAction);<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>                  }<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>                }<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>              }<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>            }<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>            w.append(entry);<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>          }<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span><a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>          @Override<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>          public long getLength() {<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>            return w.getLength();<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>          }<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>        };<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>      }<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>    }<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>    FailAppendFlushMarkerWAL wal =<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>      new FailAppendFlushMarkerWAL(FileSystem.get(walConf), FSUtils.getRootDir(walConf),<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>        method, walConf);<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>    wal.init();<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>    this.region = initHRegion(tableName, HConstants.EMPTY_START_ROW,<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>      HConstants.EMPTY_END_ROW, false, Durability.USE_DEFAULT, wal, family);<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>    int i = 0;<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>    Put put = new Put(Bytes.toBytes(i));<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>    put.setDurability(Durability.SKIP_WAL); // have to skip mocked wal<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>    put.addColumn(family, Bytes.toBytes(i), Bytes.toBytes(i));<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>    region.put(put);<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span><a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>    // 1. Test case where START_FLUSH throws exception<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>    wal.flushActions = new FlushAction [] {FlushAction.START_FLUSH};<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span><a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>    // start cache flush will throw exception<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>    try {<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>      region.flush(true);<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>      fail("This should have thrown exception");<a name="line.1221"></a>
+<span class="sourceLineNo">1222</span>    } catch (DroppedSnapshotException unexpected) {<a name="line.1222"></a>
+<span class="sourceLineNo">1223</span>      // this should not be a dropped snapshot exception. Meaning that RS will not abort<a name="line.1223"></a>
+<span class="sourceLineNo">1224</span>      throw unexpected;<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span>    } catch (IOException expected) {<a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>      // expected<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span>    }<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>    // The WAL is hosed now. It has two edits appended. We cannot roll the log without it<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>    // throwing a DroppedSnapshotException to force an abort. Just clean up the mess.<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>    region.close(true);<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>    wal.close();<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span><a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>    // 2. Test case where START_FLUSH succeeds but COMMIT_FLUSH will throw exception<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>    wal.flushActions = new FlushAction [] {FlushAction.COMMIT_FLUSH};<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>    wal = new FailAppendFlushMarkerWAL(FileSystem.get(walConf), FSUtils.getRootDir(walConf),<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>          method, walConf);<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>    wal.init();<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span>    this.region = initHRegion(tableName, HConstants.EMPTY_START_ROW,<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>      HConstants.EMPTY_END_ROW, false, Durability.USE_DEFAULT, wal, family);<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>    region.put(put);<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span><a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>    // 3. Test case where ABORT_FLUSH will throw exception.<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span>    // Even if ABORT_FLUSH throws exception, we should not fail with IOE, but continue with<a name="line.1243"></a>
+<span class="sourceLineNo">1244</span>    // DroppedSnapshotException. Below COMMMIT_FLUSH will cause flush to abort<a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>    wal.flushActions = new FlushAction [] {FlushAction.COMMIT_FLUSH, FlushAction.ABORT_FLUSH};<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span><a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>    try {<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span>      region.flush(true);<a name="line.1248"></a>
+<span class="sourceLineNo">1249</span>      fail("This should have thrown exception");<a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>    } catch (DroppedSnapshotException expected) {<a name="line.1250"></a>
+<span class="sourceLineNo">1251</span>      // we expect this exception, since we were able to write the snapshot, but failed to<a name="line.1251"></a>
+<span class="sourceLineNo">1252</span>      // write the flush marker to WAL<a name="line.1252"></a>
+<span class="sourceLineNo">1253</span>    } catch (IOException unexpected) {<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span>      throw unexpected;<a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>    }<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>  }<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span><a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>  @Test<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>  public void testGetWhileRegionClose() throws IOException {<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span>    Configuration hc = initSplit();<a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>    int numRows = 100;<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>    byte[][] families = { fam1, fam2, fam3 };<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span><a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>    // Setting up region<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span>    this.region = initHRegion(tableName, method, hc, families);<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>    // Put data in region<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span>    final int startRow = 100;<a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>    putData(startRow, numRows, qual1, families);<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>    putData(startRow, numRows, qual2, families);<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>    putData(startRow, numRows, qual3, families);<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span>    final AtomicBoolean done = new AtomicBoolean(false);<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>    final AtomicInteger gets = new AtomicInteger(0);<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>    GetTillDoneOrException[] threads = new GetTillDoneOrException[10];<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>    try {<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>      // Set ten threads running concurrently getting from the region.<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span>      for (int i = 0; i &lt; threads.length / 2; i++) {<a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>        threads[i] = new GetTillDoneOrException(i, Bytes.toBytes("" + startRow), done, gets);<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>        threads[i].setDaemon(true);<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>        threads[i].start();<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>      }<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>      // Artificially make the condition by setting closing flag explicitly.<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span>      // I can't make the issue happen with a call to region.close().<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span>      this.region.closing.set(true);<a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>      for (int i = threads.length / 2; i &lt; threads.length; i++) {<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>        threads[i] = new GetTillDoneOrException(i, Bytes.toBytes("" + startRow), done, gets);<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>        threads[i].setDaemon(true);<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>        threads[i].start();<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span>      }<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>    } finally {<a name="line.1289"></a>
+<span class="sourceLineNo">1290</span>      if (this.region != null) {<a name="line.1290"></a>
+<span class="sourceLineNo">1291</span>        HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>        this.region = null;<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>      }<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>    }<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>    done.set(true);<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>    for (GetTillDoneOrException t : threads) {<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span>      try {<a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>        t.join();<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>      } catch (InterruptedException e) {<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>        e.printStackTrace();<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>      }<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>      if (t.e != null) {<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span>        LOG.info("Exception=" + t.e);<a name="line.1303"></a>
+<span class="sourceLineNo">1304</span>        assertFalse("Found a NPE in " + t.getName(), t.e instanceof NullPointerException);<a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>      }<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>    }<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span>  }<a name="line.1307"></a>
+<span class="sourceLineNo">1308</span><a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>  /*<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>   * Thread that does get on single row until 'done' flag is flipped. If an<a name="line.1310"></a>
+<span class="sourceLineNo">1311</span>   * exception causes us to fail, it records it.<a name="line.1311"></a>
+<span class="sourceLineNo">1312</span>   */<a name="line.1312"></a>
+<span class="sourceLineNo">1313</span>  class GetTillDoneOrException extends Thread {<a name="line.1313"></a>
+<span class="sourceLineNo">1314</span>    private final Get g;<a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>    private final AtomicBoolean done;<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>    private final AtomicInteger count;<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>    private Exception e;<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span><a name="line.1318"></a>
+<span class="sourceLineNo">1319</span>    GetTillDoneOrException(final int i, final byte[] r, final AtomicBoolean d,<a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>        final AtomicInteger c) {<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>      super("getter." + i);<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>      this.g = new Get(r);<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>      this.done = d;<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span>      this.count = c;<a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>    }<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span><a name="line.1326"></a>
+<span class="sourceLineNo">1327</span>    @Override<a name="line.1327"></a>
+<span class="sourceLineNo">1328</span>    public void run() {<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>      while (!this.done.get()) {<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span>        try {<a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>          assertTrue(region.get(g).size() &gt; 0);<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>          this.count.incrementAndGet();<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>        } catch (Exception e) {<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>          this.e = e;<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span>          break;<a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>        }<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>      }<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>    }<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>  }<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span><a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>  /*<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>   * An involved filter test. Has multiple column families and deletes in mix.<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>   */<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>  @Test<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>  public void testWeirdCacheBehaviour() throws Exception {<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.1346"></a>
+<span class="sourceLineNo">1347</span>    byte[][] FAMILIES = new byte[][] { Bytes.toBytes("trans-blob"), Bytes.toBytes("trans-type"),<a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>        Bytes.toBytes("trans-date"), Bytes.toBytes("trans-tags"), Bytes.toBytes("trans-group") };<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span>    this.region = initHRegion(tableName, method, CONF, FAMILIES);<a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>    String value = "this is the value";<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>    String value2 = "this is some other value";<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>    String keyPrefix1 = "prefix1";<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>    String keyPrefix2 = "prefix2";<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span>    String keyPrefix3 = "prefix3";<a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>    putRows(this.region, 3, value, keyPrefix1);<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>    putRows(this.region, 3, value, keyPrefix2);<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span>    putRows(this.region, 3, value, keyPrefix3);<a name="line.1357"></a>
+<span class="sourceLineNo">1358</span>    putRows(this.region, 3, value2, keyPrefix1);<a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>    putRows(this.region, 3, value2, keyPrefix2);<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>    putRows(this.region, 3, value2, keyPrefix3);<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span>    System.out.println("Checking values for key: " + keyPrefix1);<a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>    assertEquals("Got back incorrect number of rows from scan", 3,<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>        getNumberOfRows(keyPrefix1, value2, this.region));<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span>    System.out.println("Checking values for key: " + keyPrefix2);<a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>    assertEquals("Got back incorrect number of rows from scan", 3,<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span>        getNumberOfRows(keyPrefix2, value2, this.region));<a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>    System.out.println("Checking values for key: " + keyPrefix3);<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>    assertEquals("Got back incorrect number of rows from scan", 3,<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>        getNumberOfRows(keyPrefix3, value2, this.region));<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>    deleteColumns(this.region, value2, keyPrefix1);<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>    deleteColumns(this.region, value2, keyPrefix2);<a name="line.1371"></a>
+<span class="sourceLineNo">1372</span>    deleteColumns(this.region, value2, keyPrefix3);<a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>    System.out.println("Starting important checks.....");<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>    assertEquals("Got back incorrect number of rows from scan: " + keyPrefix1, 0,<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span>        getNumberOfRows(keyPrefix1, value2, this.region));<a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>    assertEquals("Got back incorrect number of rows from scan: " + keyPrefix2, 0,<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>        getNumberOfRows(keyPrefix2, value2, this.region));<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>    assertEquals("Got back incorrect number of rows from scan: " + keyPrefix3, 0,<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span>        getNumberOfRows(keyPrefix3, value2, this.region));<a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>  }<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span><a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>  @Test<a name="line.1382"></a>
+<span class="sourceLineNo">1383</span>  public void testAppendWithReadOnlyTable() throws Exception {<a name="line.1383"></a>
+<span class="sourceLineNo">1384</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.1384"></a>
+<span class="sourceLineNo">1385</span>    this.region = initHRegion(tableName, method, CONF, true, Bytes.toBytes("somefamily"));<a name="line.1385"></a>
+<span class="sourceLineNo">1386</span>    boolean exceptionCaught = false;<a name="line.1386"></a>
+<span class="sourceLineNo">1387</span>    Append append = new Append(Bytes.toBytes("somerow"));<a name="line.1387"></a>
+<span class="sourceLineNo">1388</span>    append.setDurability(Durability.SKIP_WAL);<a name="line.1388"></a>
+<span class="sourceLineNo">1389</span>    append.addColumn(Bytes.toBytes("somefamily"), Bytes.toBytes("somequalifier"),<a name="line.1389"></a>
+<span class="sourceLineNo">1390</span>        Bytes.toBytes("somevalue"));<a name="line.1390"></a>
+<span class="sourceLineNo">1391</span>    try {<a name="line.1391"></a>
+<span class="sourceLineNo">1392</span>      region.append(append);<a name="line.1392"></a>
+<span class="sourceLineNo">1393</span>    } catch (IOException e) {<a name="line.1393"></a>
+<span class="sourceLineNo">1394</span>      exceptionCaught = true;<a name="line.1394"></a>
+<span class="sourceLineNo">1395</span>    }<a name="line.1395"></a>
+<span class="sourceLineNo">1396</span>    assertTrue(exceptionCaught == true);<a name="line.1396"></a>
+<span class="sourceLineNo">1397</span>  }<a name="line.1397"></a>
+<span class="sourceLineNo">1398</span><a name="line.1398"></a>
+<span class="sourceLineNo">1399</span>  @Test<a name="line.1399"></a>
+<span class="sourceLineNo">1400</span>  public void testIncrWithReadOnlyTable() throws Exception {<a name="line.1400"></a>
+<span class="sourceLineNo">1401</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.1401"></a>
+<span class="sourceLineNo">1402</span>    this.region = initHRegion(tableName, method, CONF, true, Bytes.toBytes("somefamily"));<a name="line.1402"></a>
+<span class="sourceLineNo">1403</span>    boolean exceptionCaught = false;<a name="line.1403"></a>
+<span class="sourceLineNo">1404</span>    Increment inc = new Increment(Bytes.toBytes("somerow"));<a name="line.1404"></a>
+<span class="sourceLineNo">1405</span>    inc.setDurability(Durability.SKIP_WAL);<a name="line.1405"></a>
+<span class="sourceLineNo">1406</span>    inc.addColumn(Bytes.toBytes("somefamily"), Bytes.toBytes("somequalifier"), 1L);<a name="line.1406"></a>
+<span class="sourceLineNo">1407</span>    try {<a name="line.1407"></a>
+<span class="sourceLineNo">1408</span>      region.increment(inc);<a name="line.1408"></a>
+<span class="sourceLineNo">1409</span>    } catch (IOException e) {<a name="line.1409"></a>
+<span class="sourceLineNo">1410</span>      exceptionCaught = true;<a name="line.1410"></a>
+<span class="sourceLineNo">1411</span>    }<a name="line.1411"></a>
+<span class="sourceLineNo">1412</span>    assertTrue(exceptionCaught == true);<a name="line.1412"></a>
+<span class="sourceLineNo">1413</span>  }<a name="line.1413"></a>
+<span class="sourceLineNo">1414</span><a name="line.1414"></a>
+<span class="sourceLineNo">1415</span>  private void deleteColumns(HRegion r, String value, String keyPrefix) throws IOException {<a name="line.1415"></a>
+<span class="sourceLineNo">1416</span>    InternalScanner scanner = buildScanner(keyPrefix, value, r);<a name="line.1416"></a>
+<span class="sourceLineNo">1417</span>    int count = 0;<a name="line.1417"></a>
+<span class="sourceLineNo">1418</span>    boolean more = false;<a name="line.1418"></a>
+<span class="sourceLineNo">1419</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.1419"></a>
+<span class="sourceLineNo">1420</span>    do {<a name="line.1420"></a>
+<span class="sourceLineNo">1421</span>      more = scanner.next(results);<a name="line.1421"></a>
+<span class="sourceLineNo">1422</span>      if (results != null &amp;&amp; !results.isEmpty())<a name="line.1422"></a>
+<span class="sourceLineNo">1423</span>        count++;<a name="line.1423"></a>
+<span class="sourceLineNo">1424</span>      else<a name="line.1424"></a>
+<span class="sourceLineNo">1425</span>        break;<a name="line.1425"></a>
+<span class="sourceLineNo">1426</span>      Delete delete = new Delete(CellUtil.cloneRow(results.get(0)));<a name="line.1426"></a>
+<span class="sourceLineNo">1427</span>      delete.addColumn(Bytes.toBytes("trans-tags"), Bytes.toBytes("qual2"));<a name="line.1427"></a>
+<span class="sourceLineNo">1428</span>      r.delete(delete);<a name="line.1428"></a>
+<span class="sourceLineNo">1429</span>      results.clear();<a name="line.1429"></a>
+<span class="sourceLineNo">1430</span>    } while (more);<a name="line.1430"></a>
+<span class="sourceLineNo">1431</span>    assertEquals("Did not perform correct number of deletes", 3, count);<a name="line.1431"></a>
+<span class="sourceLineNo">1432</span>  }<a name="line.1432"></a>
+<span class="sourceLineNo">1433</span><a name="line.1433"></a>
+<span class="sourceLineNo">1434</span>  private int getNumberOfRows(String keyPrefix, String value, HRegion r) throws Exception {<a name="line.1434"></a>
+<span class="sourceLineNo">1435</span>    InternalScanner resultScanner = buildScanner(keyPrefix, value, r);<a name="line.1435"></a>
+<span class="sourceLineNo">1436</span>    int numberOfResults = 0;<a name="line.1436"></a>
+<span class="sourceLineNo">1437</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.1437"></a>
+<span class="sourceLineNo">1438</span>    boolean more = false;<a name="line.1438"></a>
+<span class="sourceLineNo">1439</span>    do {<a name="line.1439"></a>
+<span class="sourceLineNo">1440</span>      more = resultScanner.next(results);<a name="line.1440"></a>
+<span class="sourceLineNo">1441</span>      if (results != null &amp;&amp; !results.isEmpty())<a name="line.1441"></a>
+<span class="sourceLineNo">1442</span>        numberOfResults++;<a name="line.1442"></a>
+<span class="sourceLineNo">1443</span>      else<a name="line.1443"></a>
+<span class="sourceLineNo">1444</span>        break;<a name="line.1444"></a>
+<span class="sourceLineNo">1445</span>      for (Cell kv : results) {<a name="line.1445"></a>
+<span class="sourceLineNo">1446</span>        System.out.println("kv=" + kv.toString() + ", " + Bytes.toString(CellUtil.cloneValue(kv)));<a name="line.1446"></a>
+<span class="sourceLineNo">1447</span>      }<a name="line.1447"></a>
+<span class="sourceLineNo">1448</span>      results.clear();<a name="line.1448"></a>
+<span class="sourceLineNo">1449</span>    } while (more);<a name="line.1449"></a>
+<span class="sourceLineNo">1450</span>    return numberOfResults;<a name="line.1450"></a>
+<span class="sourceLineNo">1451</span>  }<a name="line.1451"></a>
+<span class="sourceLineNo">1452</span><a name="line.1452"></a>
+<span class="sourceLineNo">1453</span>  private InternalScanner buildScanner(String keyPrefix, String value, HRegion r)<a name="line.1453"></a>
+<span class="sourceLineNo">1454</span>      throws IOException {<a name="line.1454"></a>
+<span class="sourceLineNo">1455</span>    // Defaults FilterList.Operator.MUST_PASS_ALL.<a name="line.1455"></a>
+<span class="sourceLineNo">1456</span>    FilterList allFilters = new FilterList();<a name="line.1456"></a>
+<span class="sourceLineNo">1457</span>    allFilters.addFilter(new PrefixFilter(Bytes.toBytes(keyPrefix)));<a name="line.1457"></a>
+<span class="sourceLineNo">1458</span>    // Only return rows where this column value exists in the row.<a name="line.1458"></a>
+<span class="sourceLineNo">1459</span>    SingleColumnValueFilter filter = new SingleColumnValueFilter(Bytes.toBytes("trans-tags"),<a name="line.1459"></a>
+<span class="sourceLineNo">1460</span>        Bytes.toBytes("qual2"), CompareOperator.EQUAL, Bytes.toBytes(value));<a name="line.1460"></a>
+<span class="sourceLineNo">1461</span>    filter.setFilterIfMissing(true);<a name="line.1461"></a>
+<span class="sourceLineNo">1462</span>    allFilters.addFilter(filter);<a name="line.1462"></a>
+<span class="sourceLineNo">1463</span>    Scan scan = new Scan();<a name="line.1463"></a>
+<span class="sourceLineNo">1464</span>    scan.addFamily(Bytes.toBytes("trans-blob"));<a name="line.1464"></a>
+<span class="sourceLineNo">1465</span>    scan.addFamily(Bytes.toBytes("trans-type"));<a name="line.1465"></a>
+<span class="sourceLineNo">1466</span>    scan.addFamily(Bytes.toBytes("trans-date"));<a name="line.1466"></a>
+<span class="sourceLineNo">1467</span>    scan.addFamily(Bytes.toBytes("trans-tags"));<a name="line.1467"></a>
+<span class="sourceLineNo">1468</span>    scan.addFamily(Bytes.toBytes("trans-group"));<a name="line.1468"></a>
+<span class="sourceLineNo">1469</span>    scan.setFilter(allFilters);<a name="line.1469"></a>
+<span class="sourceLineNo">1470</span>    return r.getScanner(scan);<a name="line.1470"></a>
+<span class="sourceLineNo">1471</span>  }<a name="line.1471"></a>
+<span class="sourceLineNo">1472</span><a name="line.1472"></a>
+<span class="sourceLineNo">1473</span>  private void putRows(HRegion r, int numRows, String value, String key) throws IOException {<a name="line.1473"></a>
+<span class="sourceLineNo">1474</span>    for (int i = 0; i &lt; numRows; i++) {<a name="line.1474"></a>
+<span class="sourceLineNo">1475</span>      String row = key + "_" + i/* UUID.randomUUID().toString() */;<a name="line.1475"></a>
+<span class="sourceLineNo">1476</span>      System.out.println(String.format("Saving row: %s, with value %s", row, value));<a name="line.1476"></a>
+<span class="sourceLineNo">1477</span>      Put put = new Put(Bytes.toBytes(row));<a name="line.1477"></a>
+<span class="sourceLineNo">1478</span>      put.setDurability(Durability.SKIP_WAL);<a name="line.1478"></a>
+<span class="sourceLineNo">1479</span>      put.addColumn(Bytes.toBytes("trans-blob"), null, Bytes.toBytes("value for blob"));<a name="line.1479"></a>
+<span class="sourceLineNo">1480</span>      put.addColumn(Bytes.toBytes("trans-type"), null, Bytes.toBytes("statement"));<a name="line.1480"></a>
+<span class="sourceLineNo">1481</span>      put.addColumn(Bytes.toBytes("trans-date"), null, Bytes.toBytes("20090921010101999"));<a name="line.1481"></a>
+<span class="sourceLineNo">1482</span>      put.addColumn(Bytes.toBytes("trans-tags"), Bytes.toBytes("qual2"), Bytes.toBytes(value));<a name="line.1482"></a>
+<span class="sourceLineNo">1483</span>      put.addColumn(Bytes.toBytes("trans-group"), null, Bytes.toBytes("adhocTransactionGroupId"));<a name="line.1483"></a>
+<span class="sourceLineNo">1484</span>      r.put(put);<a name="line.1484"></a>
+<span class="sourceLineNo">1485</span>    }<a name="line.1485"></a>
+<span class="sourceLineNo">1486</span>  }<a name="line.1486"></a>
+<span class="sourceLineNo">1487</span><a name="line.1487"></a>
+<span class="sourceLineNo">1488</span>  @Test<a name="line.1488"></a>
+<span class="sourceLineNo">1489</span>  public void testFamilyWithAndWithoutColon() throws Exception {<a name="line.1489"></a>
+<span class="sourceLineNo">1490</span>    byte[] cf = Bytes.toBytes(COLUMN_FAMILY);<a name="line.1490"></a>
+<span class="sourceLineNo">1491</span>    this.region = initHRegion(tableName, method, CONF, cf);<a name="line.1491"></a>
+<span class="sourceLineNo">1492</span>    Put p = new Put(tableName.toBytes());<a name="line.1492"></a>
+<span class="sourceLineNo">1493</span>    byte[] cfwithcolon = Bytes.toBytes(COLUMN_FAMILY + ":");<a name="line.1493"></a>
+<span class="sourceLineNo">1494</span>    p.addColumn(cfwithcolon, cfwithcolon, cfwithcolon);<a name="line.1494"></a>
+<span class="sourceLineNo">1495</span>    boolean exception = false;<a name="line.1495"></a>
+<span class="sourceLineNo">1496</span>    try {<a name="line.1496"></a>
+<span class="sourceLineNo">1497</span>      this.region.put(p);<a name="line.1497"></a>
+<span class="sourceLineNo">1498</span>    } catch (NoSuchColumnFamilyException e) {<a name="line.1498"></a>
+<span class="sourceLineNo">1499</span>      exception = true;<a name="line.1499"></a>
+<span class="sourceLineNo">1500</span>    }<a name="line.1500"></a>
+<span class="sourceLineNo">1501</span>    assertTrue(exception);<a name="line.1501"></a>
+<span class="sourceLineNo">1502</span>  }<a name="line.1502"></a>
+<span class="sourceLineNo">1503</span><a name="line.1503"></a>
+<span class="sourceLineNo">1504</span>  @Test<a name="line.1504"></a>
+<span class="sourceLineNo">1505</span>  public void testBatchPut_whileNoRowLocksHeld() throws IOException {<a name="line.1505"></a>
+<span class="sourceLineNo">1506</span>    final Put[] puts = new Put[10];<a name="line.1506"></a>
+<span class="sourceLineNo">1507</span>    MetricsWALSource source = CompatibilitySingletonFactory.getInstance(MetricsWALSource.class);<a name="line.1507"></a>
+<span class="sourceLineNo">1508</span>    long syncs = prepareRegionForBachPut(puts, source, false);<a name="line.1508"></a>
+<span class="sourceLineNo">1509</span><a name="line.1509"></a>
+<span class="sourceLineNo">1510</span>    OperationStatus[] codes = this.region.batchMutate(puts);<a name="line.1510"></a>
+<span class="sourceLineNo">1511</span>    assertEquals(10, codes.length);<a name="line.1511"></a>
+<span class="sourceLineNo">1512</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.1512"></a>
+<span class="sourceLineNo">1513</span>      assertEquals(OperationStatusCode.SUCCESS, codes[i].getOperationStatusCode());<a name="line.1513"></a>
+<span class="sourceLineNo">1514</span>    }<a name="line.1514"></a>
+<span class="sourceLineNo">1515</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs + 1, source);<a name="line.1515"></a>
+<span class="sourceLineNo">1516</span><a name="line.1516"></a>
+<span class="sourceLineNo">1517</span>    LOG.info("Next a batch put with one invalid family");<a name="line.1517"></a>
+<span class="sourceLineNo">1518</span>    puts[5].addColumn(Bytes.toBytes("BAD_CF"), qual, value);<a name="line.1518"></a>
+<span class="sourceLineNo">1519</span>    codes = this.region.batchMutate(puts);<a name="line.1519"></a>
+<span class="sourceLineNo">1520</span>    assertEquals(10, codes.length);<a name="line.1520"></a>
+<span class="sourceLineNo">1521</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.1521"></a>
+<span class="sourceLineNo">1522</span>      assertEquals((i == 5) ? OperationStatusCode.BAD_FAMILY : OperationStatusCode.SUCCESS,<a name="line.1522"></a>
+<span class="sourceLineNo">1523</span>          codes[i].getOperationStatusCode());<a name="line.1523"></a>
+<span class="sourceLineNo">1524</span>    }<a name="line.1524"></a>
+<span class="sourceLineNo">1525</span><a name="line.1525"></a>
+<span class="sourceLineNo">1526</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs + 2, source);<a name="line.1526"></a>
+<span class="sourceLineNo">1527</span>  }<a name="line.1527"></a>
+<span class="sourceLineNo">1528</span><a name="line.1528"></a>
+<span class="sourceLineNo">1529</span>  @Test<a name="line.1529"></a>
+<span class="sourceLineNo">1530</span>  public void testBatchPut_whileMultipleRowLocksHeld() throws Exception {<a name="line.1530"></a>
+<span class="sourceLineNo">1531</span>    final Put[] puts = new Put[10];<a name="line.1531"></a>
+<span class="sourceLineNo">1532</span>    MetricsWALSource source = CompatibilitySingletonFactory.getInstance(MetricsWALSource.class);<a name="line.1532"></a>
+<span class="sourceLineNo">1533</span>    long syncs = prepareRegionForBachPut(puts, source, false);<a name="line.1533"></a>
+<span class="sourceLineNo">1534</span><a name="line.1534"></a>
+<span class="sourceLineNo">1535</span>    puts[5].addColumn(Bytes.toBytes("BAD_CF"), qual, value);<a name="line.1535"></a>
+<span class="sourceLineNo">1536</span><a name="line.1536"></a>
+<span class="sourceLineNo">1537</span>    LOG.info("batchPut will have to break into four batches to avoid row locks");<a name="line.1537"></a>
+<span class="sourceLineNo">1538</span>    RowLock rowLock1 = region.getRowLock(Bytes.toBytes("row_2"));<a name="line.1538"></a>
+<span class="sourceLineNo">1539</span>    RowLock rowLock2 = region.getRowLock(Bytes.toBytes("row_1"));<a name="line.1539"></a>
+<span class="sourceLineNo">1540</span>    RowLock rowLock3 = region.getRowLock(Bytes.toBytes("row_3"));<a name="line.1540"></a>
+<span class="sourceLineNo">1541</span>    RowLock rowLock4 = region.getRowLock(Bytes.toBytes("row_3"), true);<a name="line.1541"></a>
+<span class="sourceLineNo">1542</span><a name="line.1542"></a>
+<span class="sourceLineNo">1543</span>    MultithreadedTestUtil.TestContext ctx = new MultithreadedTestUtil.TestContext(CONF);<a name="line.1543"></a>
+<span class="sourceLineNo">1544</span>    final AtomicReference&lt;OperationStatus[]&gt; retFromThread = new AtomicReference&lt;&gt;();<a name="line.1544"></a>
+<span class="sourceLineNo">1545</span>    final CountDownLatch startingPuts = new CountDownLatch(1);<a name="line.1545"></a>
+<span class="sourceLineNo">1546</span>    final CountDownLatch startingClose = new CountDownLatch(1);<a name="line.1546"></a>
+<span class="sourceLineNo">1547</span>    TestThread putter = new TestThread(ctx) {<a name="line.1547"></a>
+<span class="sourceLineNo">1548</span>      @Override<a name="line.1548"></a>
+<span class="sourceLineNo">1549</span>      public void doWork() throws IOException {<a name="line.1549"></a>
+<span class="sourceLineNo">1550</span>        startingPuts.countDown();<a name="line.1550"></a>
+<span class="sourceLineNo">1551</span>        retFromThread.set(region.batchMutate(puts));<a name="line.1551"></a>
+<span class="sourceLineNo">1552</span>      }<a name="line.1552"></a>
+<span class="sourceLineNo">1553</span>    };<a name="line.1553"></a>
+<span class="sourceLineNo">1554</span>    LOG.info("...starting put thread while holding locks");<a name="line.1554"></a>
+<span class="sourceLineNo">1555</span>    ctx.addThread(putter);<a name="line.1555"></a>
+<span class="sourceLineNo">1556</span>    ctx.startThreads();<a name="line.1556"></a>
+<span class="sourceLineNo">1557</span><a name="line.1557"></a>
+<span class="sourceLineNo">1558</span>    // Now attempt to close the region from another thread.  Prior to HBASE-12565<a name="line.1558"></a>
+<span class="sourceLineNo">1559</span>    // this would cause the in-progress batchMutate operation to to fail with<a name="line.1559"></a>
+<span class="sourceLineNo">1560</span>    // exception because it use to release and re-acquire the close-guard lock<a name="line.1560"></a>
+<span class="sourceLineNo">1561</span>    // between batches.  Caller then didn't get status indicating which writes succeeded.<a name="line.1561"></a>
+<span class="sourceLineNo">1562</span>    // We now expect this thread to block until the batchMutate call finishes.<a name="line.1562"></a>
+<span class="sourceLineNo">1563</span>    Thread regionCloseThread = new TestThread(ctx) {<a name="line.1563"></a>
+<span class="sourceLineNo">1564</span>      @Override<a name="line.1564"></a>
+<span class="sourceLineNo">1565</span>      public void doWork() {<a name="line.1565"></a>
+<span class="sourceLineNo">1566</span>        try {<a name="line.1566"></a>
+<span class="sourceLineNo">1567</span>          startingPuts.await();<a name="line.1567"></a>
+<span class="sourceLineNo">1568</span>          // Give some time for the batch mutate to get in.<a name="line.1568"></a>
+<span class="sourceLineNo">1569</span>          // We don't want to race with the mutate<a name="line.1569"></a>
+<span class="sourceLineNo">1570</span>          Thread.sleep(10);<a name="line.1570"></a>
+<span class="sourceLineNo">1571</span>          startingClose.countDown();<a name="line.1571"></a>
+<span class="sourceLineNo">1572</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.1572"></a>
+<span class="sourceLineNo">1573</span>          region = null;<a name="line.1573"></a>
+<span class="sourceLineNo">1574</span>        } catch (IOException e) {<a name="line.1574"></a>
+<span class="sourceLineNo">1575</span>          throw new RuntimeException(e);<a name="line.1575"></a>
+<span class="sourceLineNo">1576</span>        } catch (InterruptedException e) {<a name="line.1576"></a>
+<span class="sourceLineNo">1577</span>          throw new RuntimeException(e);<a name="line.1577"></a>
+<span class="sourceLineNo">1578</span>        }<a name="line.1578"></a>
+<span class="sourceLineNo">1579</span>      }<a name="line.1579"></a>
+<span class="sourceLineNo">1580</span>    };<a name="line.1580"></a>
+<span class="sourceLineNo">1581</span>    regionCloseThread.start();<a name="line.1581"></a>
+<span class="sourceLineNo">1582</span><a name="line.1582"></a>
+<span class="sourceLineNo">1583</span>    startingClose.await();<a name="line.1583"></a>
+<span class="sourceLineNo">1584</span>    startingPuts.await();<a name="line.1584"></a>
+<span class="sourceLineNo">1585</span>    Thread.sleep(100);<a name="line.1585"></a>
+<span class="sourceLineNo">1586</span>    LOG.info("...releasing row lock 1, which should let put thread continue");<a name="line.1586"></a>
+<span class="sourceLineNo">1587</span>    rowLock1.release();<a name="line.1587"></a>
+<span class="sourceLineNo">1588</span>    rowLock2.release();<a name="line.1588"></a>
+<span class="sourceLineNo">1589</span>    rowLock3.release();<a name="line.1589"></a>
+<span class="sourceLineNo">1590</span>    waitForCounter(source, "syncTimeNumOps", syncs + 1);<a name="line.1590"></a>
+<span class="sourceLineNo">1591</span><a name="line.1591"></a>
+<span class="sourceLineNo">1592</span>    LOG.info("...joining on put thread");<a name="line.1592"></a>
+<span class="sourceLineNo">1593</span>    ctx.stop();<a name="line.1593"></a>
+<span class="sourceLineNo">1594</span>    regionCloseThread.join();<a name="line.1594"></a>
+<span class="sourceLineNo">1595</span><a name="line.1595"></a>
+<span class="sourceLineNo">1596</span>    OperationStatus[] codes = retFromThread.get();<a name="line.1596"></a>
+<span class="sourceLineNo">1597</span>    for (int i = 0; i &lt; codes.length; i++) {<a name="line.1597"></a>
+<span class="sourceLineNo">1598</span>      assertEquals((i == 5) ? OperationStatusCode.BAD_FAMILY : OperationStatusCode.SUCCESS,<a name="line.1598"></a>
+<span class="sourceLineNo">1599</span>          codes[i].getOperationStatusCode());<a name="line.1599"></a>
+<span class="sourceLineNo">1600</span>    }<a name="line.1600"></a>
+<span class="sourceLineNo">1601</span>    rowLock4.release();<a name="line.1601"></a>
+<span class="sourceLineNo">1602</span>  }<a name="line.1602"></a>
+<span class="sourceLineNo">1603</span><a name="line.1603"></a>
+<span class="sourceLineNo">1604</span>  private void waitForCounter(MetricsWALSource source, String metricName, long expectedCount)<a name="line.1604"></a>
+<span class="sourceLineNo">1605</span>      throws InterruptedException {<a name="line.1605"></a>
+<span class="sourceLineNo">1606</span>    long startWait = System.currentTimeMillis();<a name="line.1606"></a>
+<span class="sourceLineNo">1607</span>    long currentCount;<a name="line.1607"></a>
+<span class="sourceLineNo">1608</span>    while ((currentCount = metricsAssertHelper.getCounter(metricName, source)) &lt; expectedCount) {<a name="line.1608"></a>
+<span class="sourceLineNo">1609</span>      Thread.sleep(100);<a name="line.1609"></a>
+<span class="sourceLineNo">1610</span>      if (System.currentTimeMillis() - startWait &gt; 10000) {<a name="line.1610"></a>
+<span class="sourceLineNo">1611</span>        fail(String.format("Timed out waiting for '%s' &gt;= '%s', currentCount=%s", metricName,<a name="line.1611"></a>
+<span class="sourceLineNo">1612</span>            expectedCount, currentCount));<a name="line.1612"></a>
+<span class="sourceLineNo">1613</span>      }<a name="line.1613"></a>
+<span class="sourceLineNo">1614</span>    }<a name="line.1614"></a>
+<span class="sourceLineNo">1615</span>  }<a name="line.1615"></a>
+<span class="sourceLineNo">1616</span><a name="line.1616"></a>
+<span class="sourceLineNo">1617</span>  @Test<a name="line.1617"></a>
+<span class="sourceLineNo">1618</span>  public void testAtomicBatchPut() throws IOException {<a name="line.1618"></a>
+<span class="sourceLineNo">1619</span>    final Put[] puts = new Put[10];<a name="line.1619"></a>
+<span class="sourceLineNo">1620</span>    MetricsWALSource source = CompatibilitySingletonFactory.getInstance(MetricsWALSource.class);<a name="line.1620"></a>
+<span class="sourceLineNo">1621</span>    long syncs = prepareRegionForBachPut(puts, source, false);<a name="line.1621"></a>
+<span class="sourceLineNo">1622</span><a name="line.1622"></a>
+<span class="sourceLineNo">1623</span>    // 1. Straight forward case, should succeed<a name="line.1623"></a>
+<span class="sourceLineNo">1624</span>    MutationBatchOperation batchOp = new MutationBatchOperation(region, puts, true,<a name="line.1624"></a>
+<span class="sourceLineNo">1625</span>        HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.1625"></a>
+<span class="sourceLineNo">1626</span>    OperationStatus[] codes = this.region.batchMutate(batchOp);<a name="line.1626"></a>
+<span class="sourceLineNo">1627</span>    assertEquals(10, codes.length);<a name="line.1627"></a>
+<span class="sourceLineNo">1628</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.1628"></a>
+<span class="sourceLineNo">1629</span>      assertEquals(OperationStatusCode.SUCCESS, codes[i].getOperationStatusCode());<a name="line.1629"></a>
+<span class="sourceLineNo">1630</span>    }<a name="line.1630"></a>
+<span class="sourceLineNo">1631</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs + 1, source);<a name="line.1631"></a>
+<span class="sourceLineNo">1632</span><a name="line.1632"></a>
+<span class="sourceLineNo">1633</span>    // 2. Failed to get lock<a name="line.1633"></a>
+<span class="sourceLineNo">1634</span>    RowLock lock = region.getRowLock(Bytes.toBytes("row_" + 3));<a name="line.1634"></a>
+<span class="sourceLineNo">1635</span>    // Method {@link HRegion#getRowLock(byte[])} is reentrant. As 'row_3' is locked in this<a name="line.1635"></a>
+<span class="sourceLineNo">1636</span>    // thread, need to run {@link HRegion#batchMutate(HRegion.BatchOperation)} in different thread<a name="line.1636"></a>
+<span class="sourceLineNo">1637</span>    MultithreadedTestUtil.TestContext ctx = new MultithreadedTestUtil.TestContext(CONF);<a name="line.1637"></a>
+<span class="sourceLineNo">1638</span>    final AtomicReference&lt;IOException&gt; retFromThread = new AtomicReference&lt;&gt;();<a name="line.1638"></a>
+<span class="sourceLineNo">1639</span>    final CountDownLatch finishedPuts = new CountDownLatch(1);<a name="line.1639"></a>
+<span class="sourceLineNo">1640</span>    final MutationBatchOperation finalBatchOp = new MutationBatchOperation(region, puts, true,<a name="line.1640"></a>
+<span class="sourceLineNo">1641</span>        HConstants<a name="line.1641"></a>
+<span class="sourceLineNo">1642</span>        .NO_NONCE,<a name="line.1642"></a>
+<span class="sourceLineNo">1643</span>        HConstants.NO_NONCE);<a name="line.1643"></a>
+<span class="sourceLineNo">1644</span>    TestThread putter = new TestThread(ctx) {<a name="line.1644"></a>
+<span class="sourceLineNo">1645</span>      @Override<a name="line.1645"></a>
+<span class="sourceLineNo">1646</span>      public void doWork() throws IOException {<a name="line.1646"></a>
+<span class="sourceLineNo">1647</span>        try {<a name="line.1647"></a>
+<span class="sourceLineNo">1648</span>          region.batchMutate(finalBatchOp);<a name="line.1648"></a>
+<span class="sourceLineNo">1649</span>        } catch (IOException ioe) {<a name="line.1649"></a>
+<span class="sourceLineNo">1650</span>          LOG.error("test failed!", ioe);<a name="line.1650"></a>
+<span class="sourceLineNo">1651</span>          retFromThread.set(ioe);<a name="line.1651"></a>
+<span class="sourceLineNo">1652</span>        }<a name="line.1652"></a>
+<span class="sourceLineNo">1653</span>        finishedPuts.countDown();<a name="line.1653"></a>
+<span class="sourceLineNo">1654</span>      }<a name="line.1654"></a>
+<span class="sourceLineNo">1655</span>    };<a name="line.1655"></a>
+<span class="sourceLineNo">1656</span>    LOG.info("...starting put thread while holding locks");<a name="line.1656"></a>
+<span class="sourceLineNo">1657</span>    ctx.addThread(putter);<a name="line.1657"></a>
+<span class="sourceLineNo">1658</span>    ctx.startThreads();<a name="line.1658"></a>
+<span class="sourceLineNo">1659</span>    LOG.info("...waiting for batch puts while holding locks");<a name="line.1659"></a>
+<span class="sourceLineNo">1660</span>    try {<a name="line.1660"></a>
+<span class="sourceLineNo">1661</span>      finishedPuts.await();<a name="line.1661"></a>
+<span class="sourceLineNo">1662</span>    } catch (InterruptedException e) {<a name="line.1662"></a>
+<span class="sourceLineNo">1663</span>      LOG.error("Interrupted!", e);<a name="line.1663"></a>
+<span class="sourceLineNo">1664</span>    } finally {<a name="line.1664"></a>
+<span class="sourceLineNo">1665</span>      if (lock != null) {<a name="line.1665"></a>
+<span class="sourceLineNo">1666</span>        lock.release();<a name="line.1666"></a>
+<span class="sourceLineNo">1667</span>      }<a name="line.1667"></a>
+<span class="sourceLineNo">1668</span>    }<a name="line.1668"></a>
+<span class="sourceLineNo">1669</span>    assertNotNull(retFromThread.get());<a name="line.1669"></a>
+<span class="sourceLineNo">1670</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs + 1, source);<a name="line.1670"></a>
+<span class="sourceLineNo">1671</span><a name="line.1671"></a>
+<span class="sourceLineNo">1672</span>    // 3. Exception thrown in validation<a name="line.1672"></a>
+<span class="sourceLineNo">1673</span>    LOG.info("Next a batch put with one invalid family");<a name="line.1673"></a>
+<span class="sourceLineNo">1674</span>    puts[5].addColumn(Bytes.toBytes("BAD_CF"), qual, value);<a name="line.1674"></a>
+<span class="sourceLineNo">1675</span>    batchOp = new MutationBatchOperation(region, puts, true, HConstants.NO_NONCE,<a name="line.1675"></a>
+<span class="sourceLineNo">1676</span>        HConstants.NO_NONCE);<a name="line.1676"></a>
+<span class="sourceLineNo">1677</span>    thrown.expect(NoSuchColumnFamilyException.class);<a name="line.1677"></a>
+<span class="sourceLineNo">1678</span>    this.region.batchMutate(batchOp);<a name="line.1678"></a>
+<span class="sourceLineNo">1679</span>  }<a name="line.1679"></a>
+<span class="sourceLineNo">1680</span><a name="line.1680"></a>
+<span class="sourceLineNo">1681</span>  @Test<a name="line.1681"></a>
+<span class="sourceLineNo">1682</span>  public void testBatchPutWithTsSlop() throws Exception {<a name="line.1682"></a>
+<span class="sourceLineNo">1683</span>    // add data with a timestamp that is too recent for range. Ensure assert<a name="line.1683"></a>
+<span class="sourceLineNo">1684</span>    CONF.setInt("hbase.hregion.keyvalue.timestamp.slop.millisecs", 1000);<a name="line.1684"></a>
+<span class="sourceLineNo">1685</span>    final Put[] puts = new Put[10];<a name="line.1685"></a>
+<span class="sourceLineNo">1686</span>    MetricsWALSource source = CompatibilitySingletonFactory.getInstance(MetricsWALSource.class);<a name="line.1686"></a>
+<span class="sourceLineNo">1687</span><a name="line.1687"></a>
+<span class="sourceLineNo">1688</span>    long syncs = prepareRegionForBachPut(puts, source, true);<a name="line.1688"></a>
+<span class="sourceLineNo">1689</span><a name="line.1689"></a>
+<span class="sourceLineNo">1690</span>    OperationStatus[] codes = this.region.batchMutate(puts);<a name="line.1690"></a>
+<span class="sourceLineNo">1691</span>    assertEquals(10, codes.length);<a name="line.1691"></a>
+<span class="sourceLineNo">1692</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.1692"></a>
+<span class="sourceLineNo">1693</span>      assertEquals(OperationStatusCode.SANITY_CHECK_FAILURE, codes[i].getOperationStatusCode());<a name="line.1693"></a>
+<span class="sourceLineNo">1694</span>    }<a name="line.1694"></a>
+<span class="sourceLineNo">1695</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs, source);<a name="line.1695"></a>
+<span class="sourceLineNo">1696</span>  }<a name="line.1696"></a>
+<span class="sourceLineNo">1697</span><a name="line.1697"></a>
+<span class="sourceLineNo">1698</span>  /**<a name="line.1698"></a>
+<span class="sourceLineNo">1699</span>   * @return syncs initial syncTimeNumOps<a name="line.1699"></a>
+<span class="sourceLineNo">1700</span>   */<a name="line.1700"></a>
+<span class="sourceLineNo">1701</span>  private long prepareRegionForBachPut(final Put[] puts, final MetricsWALSource source,<a name="line.1701"></a>
+<span class="sourceLineNo">1702</span>      boolean slop) throws IOException {<a name="line.1702"></a>
+<span class="sourceLineNo">1703</span>    this.region = initHRegion(tableName, method, CONF, COLUMN_FAMILY_BYTES);<a name="line.1703"></a>
+<span class="sourceLineNo">1704</span><a name="line.1704"></a>
+<span class="sourceLineNo">1705</span>    LOG.info("First a batch put with all valid puts");<a name="line.1705"></a>
+<span class="sourceLineNo">1706</span>    for (int i = 0; i &lt; puts.length; i++) {<a name="line.1706"></a>
+<span class="sourceLineNo">1707</span>      puts[i] = slop ? new Put(Bytes.toBytes("row_" + i), Long.MAX_VALUE - 100) :<a name="line.1707"></a>
+<span class="sourceLineNo">1708</span>          new Put(Bytes.toBytes("row_" + i));<a name="line.1708"></a>
+<span class="sourceLineNo">1709</span>      puts[i].addColumn(COLUMN_FAMILY_BYTES, qual, value);<a name="line.1709"></a>
+<span class="sourceLineNo">1710</span>    }<a name="line.1710"></a>
+<span class="sourceLineNo">1711</span><a name="line.1711"></a>
+<span class="sourceLineNo">1712</span>    long syncs = metricsAssertHelper.getCounter("syncTimeNumOps", source);<a name="line.1712"></a>
+<span class="sourceLineNo">1713</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs, source);<a name="line.1713"></a>
+<span class="sourceLineNo">1714</span>    return syncs;<a name="line.1714"></a>
+<span class="sourceLineNo">1715</span>  }<a name="line.1715"></a>
+<span class="sourceLineNo">1716</span><a name="line.1716"></a>
+<span class="sourceLineNo">1717</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.1717"></a>
+<span class="sourceLineNo">1718</span>  // checkAndMutate tests<a name="line.1718"></a>
+<span class="sourceLineNo">1719</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.1719"></a>
+<span class="sourceLineNo">1720</span>  @Test<a name="line.1720"></a>
+<span class="sourceLineNo">1721</span>  public void testCheckAndMutate_WithEmptyRowValue() throws IOException {<a name="line.1721"></a>
+<span class="sourceLineNo">1722</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1722"></a>
+<span class="sourceLineNo">1723</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1723"></a>
+<span class="sourceLineNo">1724</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1724"></a>
+<span class="sourceLineNo">1725</span>    byte[] emptyVal = new byte[] {};<a name="line.1725"></a>
+<span class="sourceLineNo">1726</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1726"></a>
+<span class="sourceLineNo">1727</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.1727"></a>
+<span class="sourceLineNo">1728</span><a name="line.1728"></a>
+<span class="sourceLineNo">1729</span>    // Setting up region<a name="line.1729"></a>
+<span class="sourceLineNo">1730</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.1730"></a>
+<span class="sourceLineNo">1731</span>    // Putting empty data in key<a name="line.1731"></a>
+<span class="sourceLineNo">1732</span>    Put put = new Put(row1);<a name="line.1732"></a>
+<span class="sourceLineNo">1733</span>    put.addColumn(fam1, qf1, emptyVal);<a name="line.1733"></a>
+<span class="sourceLineNo">1734</span><a name="line.1734"></a>
+<span class="sourceLineNo">1735</span>    // checkAndPut with empty value<a name="line.1735"></a>
+<span class="sourceLineNo">1736</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1736"></a>
+<span class="sourceLineNo">1737</span>        new BinaryComparator(emptyVal), put);<a name="line.1737"></a>
+<span class="sourceLineNo">1738</span>    assertTrue(res);<a name="line.1738"></a>
+<span class="sourceLineNo">1739</span><a name="line.1739"></a>
+<span class="sourceLineNo">1740</span>    // Putting data in key<a name="line.1740"></a>
+<span class="sourceLineNo">1741</span>    put = new Put(row1);<a name="line.1741"></a>
+<span class="sourceLineNo">1742</span>    put.addColumn(fam1, qf1, val1);<a name="line.1742"></a>
+<span class="sourceLineNo">1743</span><a name="line.1743"></a>
+<span class="sourceLineNo">1744</span>    // checkAndPut with correct value<a name="line.1744"></a>
+<span class="sourceLineNo">1745</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1745"></a>
+<span class="sourceLineNo">1746</span>        new BinaryComparator(emptyVal), put);<a name="line.1746"></a>
+<span class="sourceLineNo">1747</span>    assertTrue(res);<a name="line.1747"></a>
+<span class="sourceLineNo">1748</span><a name="line.1748"></a>
+<span class="sourceLineNo">1749</span>    // not empty anymore<a name="line.1749"></a>
+<span class="sourceLineNo">1750</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1750"></a>
+<span class="sourceLineNo">1751</span>        new BinaryComparator(emptyVal), put);<a name="line.1751"></a>
+<span class="sourceLineNo">1752</span>    assertFalse(res);<a name="line.1752"></a>
+<span class="sourceLineNo">1753</span><a name="line.1753"></a>
+<span class="sourceLineNo">1754</span>    Delete delete = new Delete(row1);<a name="line.1754"></a>
+<span class="sourceLineNo">1755</span>    delete.addColumn(fam1, qf1);<a name="line.1755"></a>
+<span class="sourceLineNo">1756</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1756"></a>
+<span class="sourceLineNo">1757</span>        new BinaryComparator(emptyVal), delete);<a name="line.1757"></a>
+<span class="sourceLineNo">1758</span>    assertFalse(res);<a name="line.1758"></a>
+<span class="sourceLineNo">1759</span><a name="line.1759"></a>
+<span class="sourceLineNo">1760</span>    put = new Put(row1);<a name="line.1760"></a>
+<span class="sourceLineNo">1761</span>    put.addColumn(fam1, qf1, val2);<a name="line.1761"></a>
+<span class="sourceLineNo">1762</span>    // checkAndPut with correct value<a name="line.1762"></a>
+<span class="sourceLineNo">1763</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1763"></a>
+<span class="sourceLineNo">1764</span>        new BinaryComparator(val1), put);<a name="line.1764"></a>
+<span class="sourceLineNo">1765</span>    assertTrue(res);<a name="line.1765"></a>
+<span class="sourceLineNo">1766</span><a name="line.1766"></a>
+<span class="sourceLineNo">1767</span>    // checkAndDelete with correct value<a name="line.1767"></a>
+<span class="sourceLineNo">1768</span>    delete = new Delete(row1);<a name="line.1768"></a>
 <span class="sourceLineNo">1769</span>    delete.addColumn(fam1, qf1);<a name="line.1769"></a>
-<span class="sourceLineNo">1770</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1770"></a>
-<span class="sourceLineNo">1771</span>        new BinaryComparator(val2), delete);<a name="line.1771"></a>
-<span class="sourceLineNo">1772</span>    assertTrue(res);<a name="line.1772"></a>
-<span class="sourceLineNo">1773</span><a name="line.1773"></a>
-<span class="sourceLineNo">1774</span>    delete = new Delete(row1);<a name="line.1774"></a>
-<span class="sourceLineNo">1775</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1775"></a>
-<span class="sourceLineNo">1776</span>        new BinaryComparator(emptyVal), delete);<a name="line.1776"></a>
-<span class="sourceLineNo">1777</span>    assertTrue(res);<a name="line.1777"></a>
-<span class="sourceLineNo">1778</span><a name="line.1778"></a>
-<span class="sourceLineNo">1779</span>    // checkAndPut looking for a null value<a name="line.1779"></a>
-<span class="sourceLineNo">1780</span>    put = new Put(row1);<a name="line.1780"></a>
-<span class="sourceLineNo">1781</span>    put.addColumn(fam1, qf1, val1);<a name="line.1781"></a>
-<span class="sourceLineNo">1782</span><a name="line.1782"></a>
-<span class="sourceLineNo">1783</span>    res = region<a name="line.1783"></a>
-<span class="sourceLineNo">1784</span>        .checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new NullComparator(), put);<a name="line.1784"></a>
-<span class="sourceLineNo">1785</span>    assertTrue(res);<a name="line.1785"></a>
-<span class="sourceLineNo">1786</span>  }<a name="line.1786"></a>
-<span class="sourceLineNo">1787</span><a name="line.1787"></a>
-<span class="sourceLineNo">1788</span>  @Test<a name="line.1788"></a>
-<span class="sourceLineNo">1789</span>  public void testCheckAndMutate_WithWrongValue() throws IOException {<a name="line.1789"></a>
-<span class="sourceLineNo">1790</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1790"></a>
-<span class="sourceLineNo">1791</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1791"></a>
-<span class="sourceLineNo">1792</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1792"></a>
-<span class="sourceLineNo">1793</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1793"></a>
-<span class="sourceLineNo">1794</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.1794"></a>
-<span class="sourceLineNo">1795</span>    BigDecimal bd1 = new BigDecimal(Double.MAX_VALUE);<a name="line.1795"></a>
-<span class="sourceLineNo">1796</span>    BigDecimal bd2 = new BigDecimal(Double.MIN_VALUE);<a name="line.1796"></a>
-<span class="sourceLineNo">1797</span><a name="line.1797"></a>
-<span class="sourceLineNo">1798</span>    // Setting up region<a name="line.1798"></a>
-<span class="sourceLineNo">1799</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.1799"></a>
-<span class="sourceLineNo">1800</span>    // Putting data in key<a name="line.1800"></a>
-<span class="sourceLineNo">1801</span>    Put put = new Put(row1);<a name="line.1801"></a>
-<span class="sourceLineNo">1802</span>    put.addColumn(fam1, qf1, val1);<a name="line.1802"></a>
-<span class="sourceLineNo">1803</span>    region.put(put);<a name="line.1803"></a>
-<span class="sourceLineNo">1804</span><a name="line.1804"></a>
-<span class="sourceLineNo">1805</span>    // checkAndPut with wrong value<a name="line.1805"></a>
-<span class="sourceLineNo">1806</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1806"></a>
-<span class="sourceLineNo">1807</span>        new BinaryComparator(val2), put);<a name="line.1807"></a>
-<span class="sourceLineNo">1808</span>    assertEquals(false, res);<a name="line.1808"></a>
-<span class="sourceLineNo">1809</span><a name="line.1809"></a>
-<span class="sourceLineNo">1810</span>    // checkAndDelete with wrong value<a name="line.1810"></a>
-<span class="sourceLineNo">1811</span>    Delete delete = new Delete(row1);<a name="line.1811"></a>
-<span class="sourceLineNo">1812</span>    delete.addFamily(fam1);<a name="line.1812"></a>
-<span class="sourceLineNo">1813</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1813"></a>
-<span class="sourceLineNo">1814</span>        new BinaryComparator(val2), put);<a name="line.1814"></a>
-<span class="sourceLineNo">1815</span>    assertEquals(false, res);<a name="line.1815"></a>
-<span class="sourceLineNo">1816</span><a name="line.1816"></a>
-<span class="sourceLineNo">1817</span>    // Putting data in key<a name="line.1817"></a>
-<span class="sourceLineNo">1818</span>    put = new Put(row1);<a name="line.1818"></a>
-<span class="sourceLineNo">1819</span>    put.addColumn(fam1, qf1, Bytes.toBytes(bd1));<a name="line.1819"></a>
-<span class="sourceLineNo">1820</span>    region.put(put);<a name="line.1820"></a>
-<span class="sourceLineNo">1821</span><a name="line.1821"></a>
-<span class="sourceLineNo">1822</span>    // checkAndPut with wrong value<a name="line.1822"></a>
-<span class="sourceLineNo">1823</span>    res =<a name="line.1823"></a>
-<span class="sourceLineNo">1824</span>        region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1824"></a>
-<span class="sourceLineNo">1825</span>            new BigDecimalComparator(bd2), put);<a name="line.1825"></a>
-<span class="sourceLineNo">1826</span>    assertEquals(false, res);<a name="line.1826"></a>
-<span class="sourceLineNo">1827</span><a name="line.1827"></a>
-<span class="sourceLineNo">1828</span>    // checkAndDelete with wrong value<a name="line.1828"></a>
-<span class="sourceLineNo">1829</span>    delete = new Delete(row1);<a name="line.1829"></a>
-<span class="sourceLineNo">1830</span>    delete.addFamily(fam1);<a name="line.1830"></a>
-<span class="sourceLineNo">1831</span>    res =<a name="line.1831"></a>
-<span class="sourceLineNo">1832</span>        region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1832"></a>
-<span class="sourceLineNo">1833</span>            new BigDecimalComparator(bd2), put);<a name="line.1833"></a>
-<span class="sourceLineNo">1834</span>    assertEquals(false, res);<a name="line.1834"></a>
-<span class="sourceLineNo">1835</span>  }<a name="line.1835"></a>
-<span class="sourceLineNo">1836</span><a name="line.1836"></a>
-<span class="sourceLineNo">1837</span>  @Test<a name="line.1837"></a>
-<span class="sourceLineNo">1838</span>  public void testCheckAndMutate_WithCorrectValue() throws IOException {<a name="line.1838"></a>
-<span class="sourceLineNo">1839</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1839"></a>
-<span class="sourceLineNo">1840</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1840"></a>
-<span class="sourceLineNo">1841</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1841"></a>
-<span class="sourceLineNo">1842</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1842"></a>
-<span class="sourceLineNo">1843</span>    BigDecimal bd1 = new BigDecimal(Double.MIN_VALUE);<a name="line.1843"></a>
-<span class="sourceLineNo">1844</span><a name="line.1844"></a>
-<span class="sourceLineNo">1845</span>    // Setting up region<a name="line.1845"></a>
-<span class="sourceLineNo">1846</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.1846"></a>
-<span class="sourceLineNo">1847</span>    // Putting data in key<a name="line.1847"></a>
-<span class="sourceLineNo">1848</span>    Put put = new Put(row1);<a name="line.1848"></a>
-<span class="sourceLineNo">1849</span>    put.addColumn(fam1, qf1, val1);<a name="line.1849"></a>
-<span class="sourceLineNo">1850</span>    region.put(put);<a name="line.1850"></a>
-<span class="sourceLineNo">1851</span><a name="line.1851"></a>
-<span class="sourceLineNo">1852</span>    // checkAndPut with correct value<a name="line.1852"></a>
-<span class="sourceLineNo">1853</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1853"></a>
-<span class="sourceLineNo">1854</span>        new BinaryComparator(val1), put);<a name="line.1854"></a>
-<span class="sourceLineNo">1855</span>    assertEquals(true, res);<a name="line.1855"></a>
-<span class="sourceLineNo">1856</span><a name="line.1856"></a>
-<span class="sourceLineNo">1857</span>    // checkAndDelete with correct value<a name="line.1857"></a>
-<span class="sourceLineNo">1858</span>    Delete delete = new Delete(row1);<a name="line.1858"></a>
-<span class="sourceLineNo">1859</span>    delete.addColumn(fam1, qf1);<a name="line.1859"></a>
-<span class="sourceLineNo">1860</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new BinaryComparator(val1),<a name="line.1860"></a>
-<span class="sourceLineNo">1861</span>        delete);<a name="line.1861"></a>
-<span class="sourceLineNo">1862</span>    assertEquals(true, res);<a name="line.1862"></a>
-<span class="sourceLineNo">1863</span><a name="line.1863"></a>
-<span class="sourceLineNo">1864</span>    // Putting data in key<a name="line.1864"></a>
-<span class="sourceLineNo">1865</span>    put = new Put(row1);<a name="line.1865"></a>
-<span class="sourceLineNo">1866</span>    put.addColumn(fam1, qf1, Bytes.toBytes(bd1));<a name="line.1866"></a>
-<span class="sourceLineNo">1867</span>    region.put(put);<a name="line.1867"></a>
-<span class="sourceLineNo">1868</span><a name="line.1868"></a>
-<span class="sourceLineNo">1869</span>    // checkAndPut with correct value<a name="line.1869"></a>
-<span class="sourceLineNo">1870</span>    res =<a name="line.1870"></a>
-<span class="sourceLineNo">1871</span>        region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new BigDecimalComparator(<a name="line.1871"></a>
-<span class="sourceLineNo">1872</span>            bd1), put);<a name="line.1872"></a>
-<span class="sourceLineNo">1873</span>    assertEquals(true, res);<a name="line.1873"></a>
-<span class="sourceLineNo">1874</span><a name="line.1874"></a>
-<span class="sourceLineNo">1875</span>    // checkAndDelete with correct value<a name="line.1875"></a>
-<span class="sourceLineNo">1876</span>    delete = new Delete(row1);<a name="line.1876"></a>
-<span class="sourceLineNo">1877</span>    delete.addColumn(fam1, qf1);<a name="line.1877"></a>
-<span class="sourceLineNo">1878</span>    res =<a name="line.1878"></a>
-<span class="sourceLineNo">1879</span>        region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new BigDecimalComparator(<a name="line.1879"></a>
-<span class="sourceLineNo">1880</span>            bd1), delete);<a name="line.1880"></a>
-<span class="sourceLineNo">1881</span>    assertEquals(true, res);<a name="line.1881"></a>
-<span class="sourceLineNo">1882</span>  }<a name="line.1882"></a>
-<span class="sourceLineNo">1883</span><a name="line.1883"></a>
-<span class="sourceLineNo">1884</span>  @Test<a name="line.1884"></a>
-<span class="sourceLineNo">1885</span>  public void testCheckAndMutate_WithNonEqualCompareOp() throws IOException {<a name="line.1885"></a>
-<span class="sourceLineNo">1886</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1886"></a>
-<span class="sourceLineNo">1887</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1887"></a>
-<span class="sourceLineNo">1888</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1888"></a>
-<span class="sourceLineNo">1889</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1889"></a>
-<span class="sourceLineNo">1890</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.1890"></a>
-<span class="sourceLineNo">1891</span>    byte[] val3 = Bytes.toBytes("value3");<a name="line.1891"></a>
-<span class="sourceLineNo">1892</span>    byte[] val4 = Bytes.toBytes("value4");<a name="line.1892"></a>
-<span class="sourceLineNo">1893</span><a name="line.1893"></a>
-<span class="sourceLineNo">1894</span>    // Setting up region<a name="line.1894"></a>
-<span class="sourceLineNo">1895</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.1895"></a>
-<span class="sourceLineNo">1896</span>    // Putting val3 in key<a name="line.1896"></a>
-<span class="sourceLineNo">1897</span>    Put put = new Put(row1);<a name="line.1897"></a>
-<span class="sourceLineNo">1898</span>    put.addColumn(fam1, qf1, val3);<a name="line.1898"></a>
-<span class="sourceLineNo">1899</span>    region.put(put);<a name="line.1899"></a>
-<span class="sourceLineNo">1900</span><a name="line.1900"></a>
-<span class="sourceLineNo">1901</span>    // Test CompareOp.LESS: original = val3, compare with val3, fail<a name="line.1901"></a>
-<span class="sourceLineNo">1902</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS,<a name="line.1902"></a>
-<span class="sourceLineNo">1903</span>        new BinaryComparator(val3), put);<a name="line.1903"></a>
-<span class="sourceLineNo">1904</span>    assertEquals(false, res);<a name="line.1904"></a>
-<span class="sourceLineNo">1905</span><a name="line.1905"></a>
-<span class="sourceLineNo">1906</span>    // Test CompareOp.LESS: original = val3, compare with val4, fail<a name="line.1906"></a>
-<span class="sourceLineNo">1907</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS,<a name="line.1907"></a>
-<span class="sourceLineNo">1908</span>        new BinaryComparator(val4), put);<a name="line.1908"></a>
-<span class="sourceLineNo">1909</span>    assertEquals(false, res);<a name="line.1909"></a>
-<span class="sourceLineNo">1910</span><a name="line.1910"></a>
-<span class="sourceLineNo">1911</span>    // Test CompareOp.LESS: original = val3, compare with val2,<a name="line.1911"></a>
-<span class="sourceLineNo">1912</span>    // succeed (now value = val2)<a name="line.1912"></a>
-<span class="sourceLineNo">1913</span>    put = new Put(row1);<a name="line.1913"></a>
-<span class="sourceLineNo">1914</span>    put.addColumn(fam1, qf1, val2);<a name="line.1914"></a>
-<span class="sourceLineNo">1915</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS,<a name="line.1915"></a>
-<span class="sourceLineNo">1916</span>        new BinaryComparator(val2), put);<a name="line.1916"></a>
-<span class="sourceLineNo">1917</span>    assertEquals(true, res);<a name="line.1917"></a>
-<span class="sourceLineNo">1918</span><a name="line.1918"></a>
-<span class="sourceLineNo">1919</span>    // Test CompareOp.LESS_OR_EQUAL: original = val2, compare with val3, fail<a name="line.1919"></a>
-<span class="sourceLineNo">1920</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS_OR_EQUAL,<a name="line.1920"></a>
-<span class="sourceLineNo">1921</span>        new BinaryComparator(val3), put);<a name="line.1921"></a>
-<span class="sourceLineNo">1922</span>    assertEquals(false, res);<a name="line.1922"></a>
-<span class="sourceLineNo">1923</span><a name="line.1923"></a>
-<span class="sourceLineNo">1924</span>    // Test CompareOp.LESS_OR_EQUAL: original = val2, compare with val2,<a name="line.1924"></a>
-<span class="sourceLineNo">1925</span>    // succeed (value still = val2)<a name="line.1925"></a>
-<span class="sourceLineNo">1926</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS_OR_EQUAL,<a name="line.1926"></a>
-<span class="sourceLineNo">1927</span>        new BinaryComparator(val2), put);<a name="line.1927"></a>
-<span class="sourceLineNo">1928</span>    assertEquals(true, res);<a name="line.1928"></a>
-<span class="sourceLineNo">1929</span><a name="line.1929"></a>
-<span class="sourceLineNo">1930</span>    // Test CompareOp.LESS_OR_EQUAL: original = val2, compare with val1,<a name="line.1930"></a>
-<span class="sourceLineNo">1931</span>    // succeed (now value = val3)<a name="line.1931"></a>
-<span class="sourceLineNo">1932</span>    put = new Put(row1);<a name="line.1932"></a>
-<span class="sourceLineNo">1933</span>    put.addColumn(fam1, qf1, val3);<a name="line.1933"></a>
-<span class="sourceLineNo">1934</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS_OR_EQUAL,<a name="line.1934"></a>
-<span class="sourceLineNo">1935</span>        new BinaryComparator(val1), put);<a name="line.1935"></a>
-<span class="sourceLineNo">1936</span>    assertEquals(true, res);<a name="line.1936"></a>
-<span class="sourceLineNo">1937</span><a name="line.1937"></a>
-<span class="sourceLineNo">1938</span>    // Test CompareOp.GREATER: original = val3, compare with val3, fail<a name="line.1938"></a>
-<span class="sourceLineNo">1939</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER,<a name="line.1939"></a>
-<span class="sourceLineNo">1940</span>        new BinaryComparator(val3), put);<a name="line.1940"></a>
-<span class="sourceLineNo">1941</span>    assertEquals(false, res);<a name="line.1941"></a>
-<span class="sourceLineNo">1942</span><a name="line.1942"></a>
-<span class="sourceLineNo">1943</span>    // Test CompareOp.GREATER: original = val3, compare with val2, fail<a name="line.1943"></a>
-<span class="sourceLineNo">1944</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER,<a name="line.1944"></a>
-<span class="sourceLineNo">1945</span>        new BinaryComparator(val2), put);<a name="line.1945"></a>
-<span class="sourceLineNo">1946</span>    assertEquals(false, res);<a name="line.1946"></a>
-<span class="sourceLineNo">1947</span><a name="line.1947"></a>
-<span class="sourceLineNo">1948</span>    // Test CompareOp.GREATER: original = val3, compare with val4,<a name="line.1948"></a>
-<span class="sourceLineNo">1949</span>    // succeed (now value = val2)<a name="line.1949"></a>
-<span class="sourceLineNo">1950</span>    put = new Put(row1);<a name="line.1950"></a>
-<span class="sourceLineNo">1951</span>    put.addColumn(fam1, qf1, val2);<a name="line.1951"></a>
-<span class="sourceLineNo">1952</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER,<a name="line.1952"></a>
-<span class="sourceLineNo">1953</span>        new BinaryComparator(val4), put);<a name="line.1953"></a>
-<span class="sourceLineNo">1954</span>    assertEquals(true, res);<a name="line.1954"></a>
-<span class="sourceLineNo">1955</span><a name="line.1955"></a>
-<span class="sourceLineNo">1956</span>    // Test CompareOp.GREATER_OR_EQUAL: original = val2, compare with val1, fail<a name="line.1956"></a>
-<span class="sourceLineNo">1957</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER_OR_EQUAL,<a name="line.1957"></a>
-<span class="sourceLineNo">1958</span>        new BinaryComparator(val1), put);<a name="line.1958"></a>
-<span class="sourceLineNo">1959</span>    assertEquals(false, res);<a name="line.1959"></a>
-<span class="sourceLineNo">1960</span><a name="line.1960"></a>
-<span class="sourceLineNo">1961</span>    // Test CompareOp.GREATER_OR_EQUAL: original = val2, compare with val2,<a name="line.1961"></a>
-<span class="sourceLineNo">1962</span>    // succeed (value still = val2)<a name="line.1962"></a>
-<span class="sourceLineNo">1963</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER_OR_EQUAL,<a name="line.1963"></a>
-<span class="sourceLineNo">1964</span>        new BinaryComparator(val2), put);<a name="line.1964"></a>
-<span class="sourceLineNo">1965</span>    assertEquals(true, res);<a name="line.1965"></a>
-<span class="sourceLineNo">1966</span><a name="line.1966"></a>
-<span class="sourceLineNo">1967</span>    // Test CompareOp.GREATER_OR_EQUAL: original = val2, compare with val3, succeed<a name="line.1967"></a>
-<span class="sourceLineNo">1968</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER_OR_EQUAL,<a name="line.1968"></a>
-<span class="sourceLineNo">1969</span>        new BinaryComparator(val3), put);<a name="line.1969"></a>
-<span class="sourceLineNo">1970</span>    assertEquals(true, res);<a name="line.1970"></a>
-<span class="sourceLineNo">1971</span>  }<a name="line.1971"></a>
-<span class="sourceLineNo">1972</span><a name="line.1972"></a>
-<span class="sourceLineNo">1973</span>  @Test<a name="line.1973"></a>
-<span class="sourceLineNo">1974</span>  public void testCheckAndPut_ThatPutWasWritten() throws IOException {<a name="line.1974"></a>
-<span class="sourceLineNo">1975</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1975"></a>
-<span class="sourceLineNo">1976</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1976"></a>
-<span class="sourceLineNo">1977</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.1977"></a>
-<span class="sourceLineNo">1978</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1978"></a>
-<span class="sourceLineNo">1979</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1979"></a>
-<span class="sourceLineNo">1980</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.1980"></a>
-<span class="sourceLineNo">1981</span><a name="line.1981"></a>
-<span class="sourceLineNo">1982</span>    byte[][] families = { fam1, fam2 };<a name="line.1982"></a>
-<span class="sourceLineNo">1983</span><a name="line.1983"></a>
-<span class="sourceLineNo">1984</span>    // Setting up region<a name="line.1984"></a>
-<span class="sourceLineNo">1985</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.1985"></a>
-<span class="sourceLineNo">1986</span>    // Putting data in the key to check<a name="line.1986"></a>
-<span class="sourceLineNo">1987</span>    Put put = new Put(row1);<a name="line.1987"></a>
-<span class="sourceLineNo">1988</span>    put.addColumn(fam1, qf1, val1);<a name="line.1988"></a>
-<span class="sourceLineNo">1989</span>    region.put(put);<a name="line.1989"></a>
-<span class="sourceLineNo">1990</span><a name="line.1990"></a>
-<span class="sourceLineNo">1991</span>    // Creating put to add<a name="line.1991"></a>
-<span class="sourceLineNo">1992</span>    long ts = System.currentTimeMillis();<a name="line.1992"></a>
-<span class="sourceLineNo">1993</span>    KeyValue kv = new KeyValue(row1, fam2, qf1, ts, KeyValue.Type.Put, val2);<a name="line.1993"></a>
-<span class="sourceLineNo">1994</span>    put = new Put(row1);<a name="line.1994"></a>
-<span class="sourceLineNo">1995</span>    put.add(kv);<a name="line.1995"></a>
-<span class="sourceLineNo">1996</span><a name="line.1996"></a>
-<span class="sourceLineNo">1997</span>    // checkAndPut with wrong value<a name="line.1997"></a>
-<span class="sourceLineNo">1998</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1998"></a>
-<span class="sourceLineNo">1999</span>        new BinaryComparator(val1), put);<a name="line.1999"></a>
-<span class="sourceLineNo">2000</span>    assertEquals(true, res);<a name="line.2000"></a>
-<span class="sourceLineNo">2001</span><a name="line.2001"></a>
-<span class="sourceLineNo">2002</span>    Get get = new Get(row1);<a name="line.2002"></a>
-<span class="sourceLineNo">2003</span>    get.addColumn(fam2, qf1);<a name="line.2003"></a>
-<span class="sourceLineNo">2004</span>    Cell[] actual = region.get(get).rawCells();<a name="line.2004"></a>
-<span class="sourceLineNo">2005</span><a name="line.2005"></a>
-<span class="sourceLineNo">2006</span>    Cell[] expected = { kv };<a name="line.2006"></a>
-<span class="sourceLineNo">2007</span><a name="line.2007"></a>
-<span class="sourceLineNo">2008</span>    assertEquals(expected.length, actual.length);<a name="line.2008"></a>
-<span class="sourceLineNo">2009</span>    for (int i = 0; i &lt; actual.length; i++) {<a name="line.2009"></a>
-<span class="sourceLineNo">2010</span>      assertEquals(expected[i], actual[i]);<a name="line.2010"></a>
-<span class="sourceLineNo">2011</span>    }<a name="line.2011"></a>
-<span class="sourceLineNo">2012</span>  }<a name="line.2012"></a>
-<span class="sourceLineNo">2013</span><a name="line.2013"></a>
-<span class="sourceLineNo">2014</span>  @Test<a name="line.2014"></a>
-<span class="sourceLineNo">2015</span>  public void testCheckAndPut_wrongRowInPut() throws IOException {<a name="line.2015"></a>
-<span class="sourceLineNo">2016</span>    this.region = initHRegion(tableName, method, CONF, COLUMNS);<a name="line.2016"></a>
-<span class="sourceLineNo">2017</span>    Put put = new Put(row2);<a name="line.2017"></a>
-<span class="sourceLineNo">2018</span>    put.addColumn(fam1, qual1, value1);<a name="line.2018"></a>
-<span class="sourceLineNo">2019</span>    try {<a name="line.2019"></a>
-<span class="sourceLineNo">2020</span>      region.checkAndMutate(row, fam1, qual1, CompareOperator.EQUAL,<a name="line.2020"></a>
-<span class="sourceLineNo">2021</span>          new BinaryComparator(value2), put);<a name="line.2021"></a>
-<span class="sourceLineNo">2022</span>      fail();<a name="line.2022"></a>
-<span class="sourceLineNo">2023</span>    } catch (org.apache.hadoop.hbase.DoNotRetryIOException expected) {<a name="line.2023"></a>
-<span class="sourceLineNo">2024</span>      // expected exception.<a name="line.2024"></a>
-<span class="sourceLineNo">2025</span>    }<a name="line.2025"></a>
-<span class="sourceLineNo">2026</span>  }<a name="line.2026"></a>
-<span class="sourceLineNo">2027</span><a name="line.2027"></a>
-<span class="sourceLineNo">2028</span>  @Test<a name="line.2028"></a>
-<span class="sourceLineNo">2029</span>  public void testCheckAndDelete_ThatDeleteWasWritten() throws IOException {<a name="line.2029"></a>
-<span class="sourceLineNo">2030</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2030"></a>
-<span class="sourceLineNo">2031</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2031"></a>
-<span class="sourceLineNo">2032</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2032"></a>
-<span class="sourceLineNo">2033</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.2033"></a>
-<span class="sourceLineNo">2034</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.2034"></a>
-<span class="sourceLineNo">2035</span>    byte[] qf3 = Bytes.toBytes("qualifier3");<a name="line.2035"></a>
-<span class="sourceLineNo">2036</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.2036"></a>
-<span class="sourceLineNo">2037</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.2037"></a>
-<span class="sourceLineNo">2038</span>    byte[] val3 = Bytes.toBytes("value3");<a name="line.2038"></a>
-<span class="sourceLineNo">2039</span>    byte[] emptyVal = new byte[] {};<a name="line.2039"></a>
-<span class="sourceLineNo">2040</span><a name="line.2040"></a>
-<span class="sourceLineNo">2041</span>    byte[][] families = { fam1, fam2 };<a name="line.2041"></a>
-<span class="sourceLineNo">2042</span><a name="line.2042"></a>
-<span class="sourceLineNo">2043</span>    // Setting up region<a name="line.2043"></a>
-<span class="sourceLineNo">2044</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2044"></a>
-<span class="sourceLineNo">2045</span>    // Put content<a name="line.2045"></a>
-<span class="sourceLineNo">2046</span>    Put put = new Put(row1);<a name="line.2046"></a>
-<span class="sourceLineNo">2047</span>    put.addColumn(fam1, qf1, val1);<a name="line.2047"></a>
-<span class="sourceLineNo">2048</span>    region.put(put);<a name="line.2048"></a>
-<span class="sourceLineNo">2049</span>    Threads.sleep(2);<a name="line.2049"></a>
-<span class="sourceLineNo">2050</span><a name="line.2050"></a>
-<span class="sourceLineNo">2051</span>    put = new Put(row1);<a name="line.2051"></a>
-<span class="sourceLineNo">2052</span>    put.addColumn(fam1, qf1, val2);<a name="line.2052"></a>
-<span class="sourceLineNo">2053</span>    put.addColumn(fam2, qf1, val3);<a name="line.2053"></a>
-<span class="sourceLineNo">2054</span>    put.addColumn(fam2, qf2, val2);<a name="line.2054"></a>
-<span class="sourceLineNo">2055</span>    put.addColumn(fam2, qf3, val1);<a name="line.2055"></a>
-<span class="sourceLineNo">2056</span>    put.addColumn(fam1, qf3, val1);<a name="line.2056"></a>
-<span class="sourceLineNo">2057</span>    region.put(put);<a name="line.2057"></a>
-<span class="sourceLineNo">2058</span><a name="line.2058"></a>
-<span class="sourceLineNo">2059</span>    // Multi-column delete<a name="line.2059"></a>
-<span class="sourceLineNo">2060</span>    Delete delete = new Delete(row1);<a name="line.2060"></a>
-<span class="sourceLineNo">2061</span>    delete.addColumn(fam1, qf1);<a name="line.2061"></a>
-<span class="sourceLineNo">2062</span>    delete.addColumn(fam2, qf1);<a name="line.2062"></a>
-<span class="sourceLineNo">2063</span>    delete.addColumn(fam1, qf3);<a name="line.2063"></a>
-<span class="sourceLineNo">2064</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.2064"></a>
-<span class="sourceLineNo">2065</span>        new BinaryComparator(val2), delete);<a name="line.2065"></a>
-<span class="sourceLineNo">2066</span>    assertEquals(true, res);<a name="line.2066"></a>
-<span class="sourceLineNo">2067</span><a name="line.2067"></a>
-<span class="sourceLineNo">2068</span>    Get get = new Get(row1);<a name="line.2068"></a>
-<span class="sourceLineNo">2069</span>    get.addColumn(fam1, qf1);<a name="line.2069"></a>
-<span class="sourceLineNo">2070</span>    get.addColumn(fam1, qf3);<a name="line.2070"></a>
-<span class="sourceLineNo">2071</span>    get.addColumn(fam2, qf2);<a name="line.2071"></a>
-<span class="sourceLineNo">2072</span>    Result r = region.get(get);<a name="line.2072"></a>
-<span class="sourceLineNo">2073</span>    assertEquals(2, r.size());<a name="line.2073"></a>
-<span class="sourceLineNo">2074</span>    assertArrayEquals(val1, r.getValue(fam1, qf1));<a name="line.2074"></a>
-<span class="sourceLineNo">2075</span>    assertArrayEquals(val2, r.getValue(fam2, qf2));<a name="line.2075"></a>
-<span class="sourceLineNo">2076</span><a name="line.2076"></a>
-<span class="sourceLineNo">2077</span>    // Family delete<a name="line.2077"></a>
-<span class="sourceLineNo">2078</span>    delete = new Delete(row1);<a name="line.2078"></a>
-<span class="sourceLineNo">2079</span>    delete.addFamily(fam2);<a name="line.2079"></a>
-<span class="sourceLineNo">2080</span>    res = region.checkAndMutate(row1, fam2, qf1, CompareOperator.EQUAL,<a name="line.2080"></a>
-<span class="sourceLineNo">2081</span>        new BinaryComparator(emptyVal), delete);<a name="line.2081"></a>
-<span class="sourceLineNo">2082</span>    assertEquals(true, res);<a name="line.2082"></a>
-<span class="sourceLineNo">2083</span><a name="line.2083"></a>
-<span class="sourceLineNo">2084</span>    get = new Get(row1);<a name="line.2084"></a>
-<span class="sourceLineNo">2085</span>    r = region.get(get);<a name="line.2085"></a>
-<span class="sourceLineNo">2086</span>    assertEquals(1, r.size());<a name="line.2086"></a>
-<span class="sourceLineNo">2087</span>    assertArrayEquals(val1, r.getValue(fam1, qf1));<a name="line.2087"></a>
-<span class="sourceLineNo">2088</span><a name="line.2088"></a>
-<span class="sourceLineNo">2089</span>    // Row delete<a name="line.2089"></a>
-<span class="sourceLineNo">2090</span>    delete = new Delete(row1);<a name="line.2090"></a>
-<span class="sourceLineNo">2091</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new BinaryComparator(val1),<a name="line.2091"></a>
-<span class="sourceLineNo">2092</span>        delete);<a name="line.2092"></a>
-<span class="sourceLineNo">2093</span>    assertEquals(true, res);<a name="line.2093"></a>
-<span class="sourceLineNo">2094</span>    get = new Get(row1);<a name="line.2094"></a>
-<span class="sourceLineNo">2095</span>    r = region.get(get);<a name="line.2095"></a>
-<span class="sourceLineNo">2096</span>    assertEquals(0, r.size());<a name="line.2096"></a>
-<span class="sourceLineNo">2097</span>  }<a name="line.2097"></a>
-<span class="sourceLineNo">2098</span><a name="line.2098"></a>
-<span class="sourceLineNo">2099</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2099"></a>
-<span class="sourceLineNo">2100</span>  // Delete tests<a name="line.2100"></a>
-<span class="sourceLineNo">2101</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2101"></a>
-<span class="sourceLineNo">2102</span>  @Test<a name="line.2102"></a>
-<span class="sourceLineNo">2103</span>  public void testDelete_multiDeleteColumn() throws IOException {<a name="line.2103"></a>
-<span class="sourceLineNo">2104</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2104"></a>
-<span class="sourceLineNo">2105</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2105"></a>
-<span class="sourceLineNo">2106</span>    byte[] qual = Bytes.toBytes("qualifier");<a name="line.2106"></a>
-<span class="sourceLineNo">2107</span>    byte[] value = Bytes.toBytes("value");<a name="line.2107"></a>
-<span class="sourceLineNo">2108</span><a name="line.2108"></a>
-<span class="sourceLineNo">2109</span>    Put put = new Put(row1);<a name="line.2109"></a>
-<span class="sourceLineNo">2110</span>    put.addColumn(fam1, qual, 1, value);<a name="line.2110"></a>
-<span class="sourceLineNo">2111</span>    put.addColumn(fam1, qual, 2, value);<a name="line.2111"></a>
-<span class="sourceLineNo">2112</span><a name="line.2112"></a>
-<span class="sourceLineNo">2113</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2113"></a>
-<span class="sourceLineNo">2114</span>    region.put(put);<a name="line.2114"></a>
-<span class="sourceLineNo">2115</span><a name="line.2115"></a>
-<span class="sourceLineNo">2116</span>    // We do support deleting more than 1 'latest' version<a name="line.2116"></a>
-<span class="sourceLineNo">2117</span>    Delete delete = new Delete(row1);<a name="line.2117"></a>
-<span class="sourceLineNo">2118</span>    delete.addColumn(fam1, qual);<a name="line.2118"></a>
+<span class="sourceLineNo">1770</span>    delete.addColumn(fam1, qf1);<a name="line.1770"></a>
+<span class="sourceLineNo">1771</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1771"></a>
+<span class="sourceLineNo">1772</span>        new BinaryComparator(val2), delete);<a name="line.1772"></a>
+<span class="sourceLineNo">1773</span>    assertTrue(res);<a name="line.1773"></a>
+<span class="sourceLineNo">1774</span><a name="line.1774"></a>
+<span class="sourceLineNo">1775</span>    delete = new Delete(row1);<a name="line.1775"></a>
+<span class="sourceLineNo">1776</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1776"></a>
+<span class="sourceLineNo">1777</span>        new BinaryComparator(emptyVal), delete);<a name="line.1777"></a>
+<span class="sourceLineNo">1778</span>    assertTrue(res);<a name="line.1778"></a>
+<span class="sourceLineNo">1779</span><a name="line.1779"></a>
+<span class="sourceLineNo">1780</span>    // checkAndPut looking for a null value<a name="line.1780"></a>
+<span class="sourceLineNo">1781</span>    put = new Put(row1);<a name="line.1781"></a>
+<span class="sourceLineNo">1782</span>    put.addColumn(fam1, qf1, val1);<a name="line.1782"></a>
+<span class="sourceLineNo">1783</span><a name="line.1783"></a>
+<span class="sourceLineNo">1784</span>    res = region<a name="line.1784"></a>
+<span class="sourceLineNo">1785</span>        .checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new NullComparator(), put);<a name="line.1785"></a>
+<span class="sourceLineNo">1786</span>    assertTrue(res);<a name="line.1786"></a>
+<span class="sourceLineNo">1787</span>  }<a name="line.1787"></a>
+<span class="sourceLineNo">1788</span><a name="line.1788"></a>
+<span class="sourceLineNo">1789</span>  @Test<a name="line.1789"></a>
+<span class="sourceLineNo">1790</span>  public void testCheckAndMutate_WithWrongValue() throws IOException {<a name="line.1790"></a>
+<span class="sourceLineNo">1791</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1791"></a>
+<span class="sourceLineNo">1792</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1792"></a>
+<span class="sourceLineNo">1793</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1793"></a>
+<span class="sourceLineNo">1794</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1794"></a>
+<span class="sourceLineNo">1795</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.1795"></a>
+<span class="sourceLineNo">1796</span>    BigDecimal bd1 = new BigDecimal(Double.MAX_VALUE);<a name="line.1796"></a>
+<span class="sourceLineNo">1797</span>    BigDecimal bd2 = new BigDecimal(Double.MIN_VALUE);<a name="line.1797"></a>
+<span class="sourceLineNo">1798</span><a name="line.1798"></a>
+<span class="sourceLineNo">1799</span>    // Setting up region<a name="line.1799"></a>
+<span class="sourceLineNo">1800</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.1800"></a>
+<span class="sourceLineNo">1801</span>    // Putting data in key<a name="line.1801"></a>
+<span class="sourceLineNo">1802</span>    Put put = new Put(row1);<a name="line.1802"></a>
+<span class="sourceLineNo">1803</span>    put.addColumn(fam1, qf1, val1);<a name="line.1803"></a>
+<span class="sourceLineNo">1804</span>    region.put(put);<a name="line.1804"></a>
+<span class="sourceLineNo">1805</span><a name="line.1805"></a>
+<span class="sourceLineNo">1806</span>    // checkAndPut with wrong value<a name="line.1806"></a>
+<span class="sourceLineNo">1807</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1807"></a>
+<span class="sourceLineNo">1808</span>        new BinaryComparator(val2), put);<a name="line.1808"></a>
+<span class="sourceLineNo">1809</span>    assertEquals(false, res);<a name="line.1809"></a>
+<span class="sourceLineNo">1810</span><a name="line.1810"></a>
+<span class="sourceLineNo">1811</span>    // checkAndDelete with wrong value<a name="line.1811"></a>
+<span class="sourceLineNo">1812</span>    Delete delete = new Delete(row1);<a name="line.1812"></a>
+<span class="sourceLineNo">1813</span>    delete.addFamily(fam1);<a name="line.1813"></a>
+<span class="sourceLineNo">1814</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1814"></a>
+<span class="sourceLineNo">1815</span>        new BinaryComparator(val2), put);<a name="line.1815"></a>
+<span class="sourceLineNo">1816</span>    assertEquals(false, res);<a name="line.1816"></a>
+<span class="sourceLineNo">1817</span><a name="line.1817"></a>
+<span class="sourceLineNo">1818</span>    // Putting data in key<a name="line.1818"></a>
+<span class="sourceLineNo">1819</span>    put = new Put(row1);<a name="line.1819"></a>
+<span class="sourceLineNo">1820</span>    put.addColumn(fam1, qf1, Bytes.toBytes(bd1));<a name="line.1820"></a>
+<span class="sourceLineNo">1821</span>    region.put(put);<a name="line.1821"></a>
+<span class="sourceLineNo">1822</span><a name="line.1822"></a>
+<span class="sourceLineNo">1823</span>    // checkAndPut with wrong value<a name="line.1823"></a>
+<span class="sourceLineNo">1824</span>    res =<a name="line.1824"></a>
+<span class="sourceLineNo">1825</span>        region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1825"></a>
+<span class="sourceLineNo">1826</span>            new BigDecimalComparator(bd2), put);<a name="line.1826"></a>
+<span class="sourceLineNo">1827</span>    assertEquals(false, res);<a name="line.1827"></a>
+<span class="sourceLineNo">1828</span><a name="line.1828"></a>
+<span class="sourceLineNo">1829</span>    // checkAndDelete with wrong value<a name="line.1829"></a>
+<span class="sourceLineNo">1830</span>    delete = new Delete(row1);<a name="line.1830"></a>
+<span class="sourceLineNo">1831</span>    delete.addFamily(fam1);<a name="line.1831"></a>
+<span class="sourceLineNo">1832</span>    res =<a name="line.1832"></a>
+<span class="sourceLineNo">1833</span>        region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1833"></a>
+<span class="sourceLineNo">1834</span>            new BigDecimalComparator(bd2), put);<a name="line.1834"></a>
+<span class="sourceLineNo">1835</span>    assertEquals(false, res);<a name="line.1835"></a>
+<span class="sourceLineNo">1836</span>  }<a name="line.1836"></a>
+<span class="sourceLineNo">1837</span><a name="line.1837"></a>
+<span class="sourceLineNo">1838</span>  @Test<a name="line.1838"></a>
+<span class="sourceLineNo">1839</span>  public void testCheckAndMutate_WithCorrectValue() throws IOException {<a name="line.1839"></a>
+<span class="sourceLineNo">1840</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1840"></a>
+<span class="sourceLineNo">1841</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1841"></a>
+<span class="sourceLineNo">1842</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1842"></a>
+<span class="sourceLineNo">1843</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1843"></a>
+<span class="sourceLineNo">1844</span>    BigDecimal bd1 = new BigDecimal(Double.MIN_VALUE);<a name="line.1844"></a>
+<span class="sourceLineNo">1845</span><a name="line.1845"></a>
+<span class="sourceLineNo">1846</span>    // Setting up region<a name="line.1846"></a>
+<span class="sourceLineNo">1847</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.1847"></a>
+<span class="sourceLineNo">1848</span>    // Putting data in key<a name="line.1848"></a>
+<span class="sourceLineNo">1849</span>    Put put = new Put(row1);<a name="line.1849"></a>
+<span class="sourceLineNo">1850</span>    put.addColumn(fam1, qf1, val1);<a name="line.1850"></a>
+<span class="sourceLineNo">1851</span>    region.put(put);<a name="line.1851"></a>
+<span class="sourceLineNo">1852</span><a name="line.1852"></a>
+<span class="sourceLineNo">1853</span>    // checkAndPut with correct value<a name="line.1853"></a>
+<span class="sourceLineNo">1854</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1854"></a>
+<span class="sourceLineNo">1855</span>        new BinaryComparator(val1), put);<a name="line.1855"></a>
+<span class="sourceLineNo">1856</span>    assertEquals(true, res);<a name="line.1856"></a>
+<span class="sourceLineNo">1857</span><a name="line.1857"></a>
+<span class="sourceLineNo">1858</span>    // checkAndDelete with correct value<a name="line.1858"></a>
+<span class="sourceLineNo">1859</span>    Delete delete = new Delete(row1);<a name="line.1859"></a>
+<span class="sourceLineNo">1860</span>    delete.addColumn(fam1, qf1);<a name="line.1860"></a>
+<span class="sourceLineNo">1861</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new BinaryComparator(val1),<a name="line.1861"></a>
+<span class="sourceLineNo">1862</span>        delete);<a name="line.1862"></a>
+<span class="sourceLineNo">1863</span>    assertEquals(true, res);<a name="line.1863"></a>
+<span class="sourceLineNo">1864</span><a name="line.1864"></a>
+<span class="sourceLineNo">1865</span>    // Putting data in key<a name="line.1865"></a>
+<span class="sourceLineNo">1866</span>    put = new Put(row1);<a name="line.1866"></a>
+<span class="sourceLineNo">1867</span>    put.addColumn(fam1, qf1, Bytes.toBytes(bd1));<a name="line.1867"></a>
+<span class="sourceLineNo">1868</span>    region.put(put);<a name="line.1868"></a>
+<span class="sourceLineNo">1869</span><a name="line.1869"></a>
+<span class="sourceLineNo">1870</span>    // checkAndPut with correct value<a name="line.1870"></a>
+<span class="sourceLineNo">1871</span>    res =<a name="line.1871"></a>
+<span class="sourceLineNo">1872</span>        region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new BigDecimalComparator(<a name="line.1872"></a>
+<span class="sourceLineNo">1873</span>            bd1), put);<a name="line.1873"></a>
+<span class="sourceLineNo">1874</span>    assertEquals(true, res);<a name="line.1874"></a>
+<span class="sourceLineNo">1875</span><a name="line.1875"></a>
+<span class="sourceLineNo">1876</span>    // checkAndDelete with correct value<a name="line.1876"></a>
+<span class="sourceLineNo">1877</span>    delete = new Delete(row1);<a name="line.1877"></a>
+<span class="sourceLineNo">1878</span>    delete.addColumn(fam1, qf1);<a name="line.1878"></a>
+<span class="sourceLineNo">1879</span>    res =<a name="line.1879"></a>
+<span class="sourceLineNo">1880</span>        region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new BigDecimalComparator(<a name="line.1880"></a>
+<span class="sourceLineNo">1881</span>            bd1), delete);<a name="line.1881"></a>
+<span class="sourceLineNo">1882</span>    assertEquals(true, res);<a name="line.1882"></a>
+<span class="sourceLineNo">1883</span>  }<a name="line.1883"></a>
+<span class="sourceLineNo">1884</span><a name="line.1884"></a>
+<span class="sourceLineNo">1885</span>  @Test<a name="line.1885"></a>
+<span class="sourceLineNo">1886</span>  public void testCheckAndMutate_WithNonEqualCompareOp() throws IOException {<a name="line.1886"></a>
+<span class="sourceLineNo">1887</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1887"></a>
+<span class="sourceLineNo">1888</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1888"></a>
+<span class="sourceLineNo">1889</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1889"></a>
+<span class="sourceLineNo">1890</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1890"></a>
+<span class="sourceLineNo">1891</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.1891"></a>
+<span class="sourceLineNo">1892</span>    byte[] val3 = Bytes.toBytes("value3");<a name="line.1892"></a>
+<span class="sourceLineNo">1893</span>    byte[] val4 = Bytes.toBytes("value4");<a name="line.1893"></a>
+<span class="sourceLineNo">1894</span><a name="line.1894"></a>
+<span class="sourceLineNo">1895</span>    // Setting up region<a name="line.1895"></a>
+<span class="sourceLineNo">1896</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.1896"></a>
+<span class="sourceLineNo">1897</span>    // Putting val3 in key<a name="line.1897"></a>
+<span class="sourceLineNo">1898</span>    Put put = new Put(row1);<a name="line.1898"></a>
+<span class="sourceLineNo">1899</span>    put.addColumn(fam1, qf1, val3);<a name="line.1899"></a>
+<span class="sourceLineNo">1900</span>    region.put(put);<a name="line.1900"></a>
+<span class="sourceLineNo">1901</span><a name="line.1901"></a>
+<span class="sourceLineNo">1902</span>    // Test CompareOp.LESS: original = val3, compare with val3, fail<a name="line.1902"></a>
+<span class="sourceLineNo">1903</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS,<a name="line.1903"></a>
+<span class="sourceLineNo">1904</span>        new BinaryComparator(val3), put);<a name="line.1904"></a>
+<span class="sourceLineNo">1905</span>    assertEquals(false, res);<a name="line.1905"></a>
+<span class="sourceLineNo">1906</span><a name="line.1906"></a>
+<span class="sourceLineNo">1907</span>    // Test CompareOp.LESS: original = val3, compare with val4, fail<a name="line.1907"></a>
+<span class="sourceLineNo">1908</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS,<a name="line.1908"></a>
+<span class="sourceLineNo">1909</span>        new BinaryComparator(val4), put);<a name="line.1909"></a>
+<span class="sourceLineNo">1910</span>    assertEquals(false, res);<a name="line.1910"></a>
+<span class="sourceLineNo">1911</span><a name="line.1911"></a>
+<span class="sourceLineNo">1912</span>    // Test CompareOp.LESS: original = val3, compare with val2,<a name="line.1912"></a>
+<span class="sourceLineNo">1913</span>    // succeed (now value = val2)<a name="line.1913"></a>
+<span class="sourceLineNo">1914</span>    put = new Put(row1);<a name="line.1914"></a>
+<span class="sourceLineNo">1915</span>    put.addColumn(fam1, qf1, val2);<a name="line.1915"></a>
+<span class="sourceLineNo">1916</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS,<a name="line.1916"></a>
+<span class="sourceLineNo">1917</span>        new BinaryComparator(val2), put);<a name="line.1917"></a>
+<span class="sourceLineNo">1918</span>    assertEquals(true, res);<a name="line.1918"></a>
+<span class="sourceLineNo">1919</span><a name="line.1919"></a>
+<span class="sourceLineNo">1920</span>    // Test CompareOp.LESS_OR_EQUAL: original = val2, compare with val3, fail<a name="line.1920"></a>
+<span class="sourceLineNo">1921</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS_OR_EQUAL,<a name="line.1921"></a>
+<span class="sourceLineNo">1922</span>        new BinaryComparator(val3), put);<a name="line.1922"></a>
+<span class="sourceLineNo">1923</span>    assertEquals(false, res);<a name="line.1923"></a>
+<span class="sourceLineNo">1924</span><a name="line.1924"></a>
+<span class="sourceLineNo">1925</span>    // Test CompareOp.LESS_OR_EQUAL: original = val2, compare with val2,<a name="line.1925"></a>
+<span class="sourceLineNo">1926</span>    // succeed (value still = val2)<a name="line.1926"></a>
+<span class="sourceLineNo">1927</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS_OR_EQUAL,<a name="line.1927"></a>
+<span class="sourceLineNo">1928</span>        new BinaryComparator(val2), put);<a name="line.1928"></a>
+<span class="sourceLineNo">1929</span>    assertEquals(true, res);<a name="line.1929"></a>
+<span class="sourceLineNo">1930</span><a name="line.1930"></a>
+<span class="sourceLineNo">1931</span>    // Test CompareOp.LESS_OR_EQUAL: original = val2, compare with val1,<a name="line.1931"></a>
+<span class="sourceLineNo">1932</span>    // succeed (now value = val3)<a name="line.1932"></a>
+<span class="sourceLineNo">1933</span>    put = new Put(row1);<a name="line.1933"></a>
+<span class="sourceLineNo">1934</span>    put.addColumn(fam1, qf1, val3);<a name="line.1934"></a>
+<span class="sourceLineNo">1935</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS_OR_EQUAL,<a name="line.1935"></a>
+<span class="sourceLineNo">1936</span>        new BinaryComparator(val1), put);<a name="line.1936"></a>
+<span class="sourceLineNo">1937</span>    assertEquals(true, res);<a name="line.1937"></a>
+<span class="sourceLineNo">1938</span><a name="line.1938"></a>
+<span class="sourceLineNo">1939</span>    // Test CompareOp.GREATER: original = val3, compare with val3, fail<a name="line.1939"></a>
+<span class="sourceLineNo">1940</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER,<a name="line.1940"></a>
+<span class="sourceLineNo">1941</span>        new BinaryComparator(val3), put);<a name="line.1941"></a>
+<span class="sourceLineNo">1942</span>    assertEquals(false, res);<a name="line.1942"></a>
+<span class="sourceLineNo">1943</span><a name="line.1943"></a>
+<span class="sourceLineNo">1944</span>    // Test CompareOp.GREATER: original = val3, compare with val2, fail<a name="line.1944"></a>
+<span class="sourceLineNo">1945</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER,<a name="line.1945"></a>
+<span class="sourceLineNo">1946</span>        new BinaryComparator(val2), put);<a name="line.1946"></a>
+<span class="sourceLineNo">1947</span>    assertEquals(false, res);<a name="line.1947"></a>
+<span class="sourceLineNo">1948</span><a name="line.1948"></a>
+<span class="sourceLineNo">1949</span>    // Test CompareOp.GREATER: original = val3, compare with val4,<a name="line.1949"></a>
+<span class="sourceLineNo">1950</span>    // succeed (now value = val2)<a name="line.1950"></a>
+<span class="sourceLineNo">1951</span>    put = new Put(row1);<a name="line.1951"></a>
+<span class="sourceLineNo">1952</span>    put.addColumn(fam1, qf1, val2);<a name="line.1952"></a>
+<span class="sourceLineNo">1953</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER,<a name="line.1953"></a>
+<span class="sourceLineNo">1954</span>        new BinaryComparator(val4), put);<a name="line.1954"></a>
+<span class="sourceLineNo">1955</span>    assertEquals(true, res);<a name="line.1955"></a>
+<span class="sourceLineNo">1956</span><a name="line.1956"></a>
+<span class="sourceLineNo">1957</span>    // Test CompareOp.GREATER_OR_EQUAL: original = val2, compare with val1, fail<a name="line.1957"></a>
+<span class="sourceLineNo">1958</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER_OR_EQUAL,<a name="line.1958"></a>
+<span class="sourceLineNo">1959</span>        new BinaryComparator(val1), put);<a name="line.1959"></a>
+<span class="sourceLineNo">1960</span>    assertEquals(false, res);<a name="line.1960"></a>
+<span class="sourceLineNo">1961</span><a name="line.1961"></a>
+<span class="sourceLineNo">1962</span>    // Test CompareOp.GREATER_OR_EQUAL: original = val2, compare with val2,<a name="line.1962"></a>
+<span class="sourceLineNo">1963</span>    // succeed (value still = val2)<a name="line.1963"></a>
+<span class="sourceLineNo">1964</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER_OR_EQUAL,<a name="line.1964"></a>
+<span class="sourceLineNo">1965</span>        new BinaryComparator(val2), put);<a name="line.1965"></a>
+<span class="sourceLineNo">1966</span>    assertEquals(true, res);<a name="line.1966"></a>
+<span class="sourceLineNo">1967</span><a name="line.1967"></a>
+<span class="sourceLineNo">1968</span>    // Test CompareOp.GREATER_OR_EQUAL: original = val2, compare with val3, succeed<a name="line.1968"></a>
+<span class="sourceLineNo">1969</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER_OR_EQUAL,<a name="line.1969"></a>
+<span class="sourceLineNo">1970</span>        new BinaryComparator(val3), put);<a name="line.1970"></a>
+<span class="sourceLineNo">1971</span>    assertEquals(true, res);<a name="line.1971"></a>
+<span class="sourceLineNo">1972</span>  }<a name="line.1972"></a>
+<span class="sourceLineNo">1973</span><a name="line.1973"></a>
+<span class="sourceLineNo">1974</span>  @Test<a name="line.1974"></a>
+<span class="sourceLineNo">1975</span>  public void testCheckAndPut_ThatPutWasWritten() throws IOException {<a name="line.1975"></a>
+<span class="sourceLineNo">1976</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1976"></a>
+<span class="sourceLineNo">1977</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1977"></a>
+<span class="sourceLineNo">1978</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.1978"></a>
+<span class="sourceLineNo">1979</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1979"></a>
+<span class="sourceLineNo">1980</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1980"></a>
+<span class="sourceLineNo">1981</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.1981"></a>
+<span class="sourceLineNo">1982</span><a name="line.1982"></a>
+<span class="sourceLineNo">1983</span>    byte[][] families = { fam1, fam2 };<a name="line.1983"></a>
+<span class="sourceLineNo">1984</span><a name="line.1984"></a>
+<span class="sourceLineNo">1985</span>    // Setting up region<a name="line.1985"></a>
+<span class="sourceLineNo">1986</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.1986"></a>
+<span class="sourceLineNo">1987</span>    // Putting data in the key to check<a name="line.1987"></a>
+<span class="sourceLineNo">1988</span>    Put put = new Put(row1);<a name="line.1988"></a>
+<span class="sourceLineNo">1989</span>    put.addColumn(fam1, qf1, val1);<a name="line.1989"></a>
+<span class="sourceLineNo">1990</span>    region.put(put);<a name="line.1990"></a>
+<span class="sourceLineNo">1991</span><a name="line.1991"></a>
+<span class="sourceLineNo">1992</span>    // Creating put to add<a name="line.1992"></a>
+<span class="sourceLineNo">1993</span>    long ts = System.currentTimeMillis();<a name="line.1993"></a>
+<span class="sourceLineNo">1994</span>    KeyValue kv = new KeyValue(row1, fam2, qf1, ts, KeyValue.Type.Put, val2);<a name="line.1994"></a>
+<span class="sourceLineNo">1995</span>    put = new Put(row1);<a name="line.1995"></a>
+<span class="sourceLineNo">1996</span>    put.add(kv);<a name="line.1996"></a>
+<span class="sourceLineNo">1997</span><a name="line.1997"></a>
+<span class="sourceLineNo">1998</span>    // checkAndPut with wrong value<a name="line.1998"></a>
+<span class="sourceLineNo">1999</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1999"></a>
+<span class="sourceLineNo">2000</span>        new BinaryComparator(val1), put);<a name="line.2000"></a>
+<span class="sourceLineNo">2001</span>    assertEquals(true, res);<a name="line.2001"></a>
+<span class="sourceLineNo">2002</span><a name="line.2002"></a>
+<span class="sourceLineNo">2003</span>    Get get = new Get(row1);<a name="line.2003"></a>
+<span class="sourceLineNo">2004</span>    get.addColumn(fam2, qf1);<a name="line.2004"></a>
+<span class="sourceLineNo">2005</span>    Cell[] actual = region.get(get).rawCells();<a name="line.2005"></a>
+<span class="sourceLineNo">2006</span><a name="line.2006"></a>
+<span class="sourceLineNo">2007</span>    Cell[] expected = { kv };<a name="line.2007"></a>
+<span class="sourceLineNo">2008</span><a name="line.2008"></a>
+<span class="sourceLineNo">2009</span>    assertEquals(expected.length, actual.length);<a name="line.2009"></a>
+<span class="sourceLineNo">2010</span>    for (int i = 0; i &lt; actual.length; i++) {<a name="line.2010"></a>
+<span class="sourceLineNo">2011</span>      assertEquals(expected[i], actual[i]);<a name="line.2011"></a>
+<span class="sourceLineNo">2012</span>    }<a name="line.2012"></a>
+<span class="sourceLineNo">2013</span>  }<a name="line.2013"></a>
+<span class="sourceLineNo">2014</span><a name="line.2014"></a>
+<span class="sourceLineNo">2015</span>  @Test<a name="line.2015"></a>
+<span class="sourceLineNo">2016</span>  public void testCheckAndPut_wrongRowInPut() throws IOException {<a name="line.2016"></a>
+<span class="sourceLineNo">2017</span>    this.region = initHRegion(tableName, method, CONF, COLUMNS);<a name="line.2017"></a>
+<span class="sourceLineNo">2018</span>    Put put = new Put(row2);<a name="line.2018"></a>
+<span class="sourceLineNo">2019</span>    put.addColumn(fam1, qual1, value1);<a name="line.2019"></a>
+<span class="sourceLineNo">2020</span>    try {<a name="line.2020"></a>
+<span class="sourceLineNo">2021</span>      region.checkAndMutate(row, fam1, qual1, CompareOperator.EQUAL,<a name="line.2021"></a>
+<span class="sourceLineNo">2022</span>          new BinaryComparator(value2), put);<a name="line.2022"></a>
+<span class="sourceLineNo">2023</span>      fail();<a name="line.2023"></a>
+<span class="sourceLineNo">2024</span>    } catch (org.apache.hadoop.hbase.DoNotRetryIOException expected) {<a name="line.2024"></a>
+<span class="sourceLineNo">2025</span>      // expected exception.<a name="line.2025"></a>
+<span class="sourceLineNo">2026</span>    }<a name="line.2026"></a>
+<span class="sourceLineNo">2027</span>  }<a name="line.2027"></a>
+<span class="sourceLineNo">2028</span><a name="line.2028"></a>
+<span class="sourceLineNo">2029</span>  @Test<a name="line.2029"></a>
+<span class="sourceLineNo">2030</span>  public void testCheckAndDelete_ThatDeleteWasWritten() throws IOException {<a name="line.2030"></a>
+<span class="sourceLineNo">2031</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2031"></a>
+<span class="sourceLineNo">2032</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2032"></a>
+<span class="sourceLineNo">2033</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2033"></a>
+<span class="sourceLineNo">2034</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.2034"></a>
+<span class="sourceLineNo">2035</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.2035"></a>
+<span class="sourceLineNo">2036</span>    byte[] qf3 = Bytes.toBytes("qualifier3");<a name="line.2036"></a>
+<span class="sourceLineNo">2037</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.2037"></a>
+<span class="sourceLineNo">2038</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.2038"></a>
+<span class="sourceLineNo">2039</span>    byte[] val3 = Bytes.toBytes("value3");<a name="line.2039"></a>
+<span class="sourceLineNo">2040</span>    byte[] emptyVal = new byte[] {};<a name="line.2040"></a>
+<span class="sourceLineNo">2041</span><a name="line.2041"></a>
+<span class="sourceLineNo">2042</span>    byte[][] families = { fam1, fam2 };<a name="line.2042"></a>
+<span class="sourceLineNo">2043</span><a name="line.2043"></a>
+<span class="sourceLineNo">2044</span>    // Setting up region<a name="line.2044"></a>
+<span class="sourceLineNo">2045</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2045"></a>
+<span class="sourceLineNo">2046</span>    // Put content<a name="line.2046"></a>
+<span class="sourceLineNo">2047</span>    Put put = new Put(row1);<a name="line.2047"></a>
+<span class="sourceLineNo">2048</span>    put.addColumn(fam1, qf1, val1);<a name="line.2048"></a>
+<span class="sourceLineNo">2049</span>    region.put(put);<a name="line.2049"></a>
+<span class="sourceLineNo">2050</span>    Threads.sleep(2);<a name="line.2050"></a>
+<span class="sourceLineNo">2051</span><a name="line.2051"></a>
+<span class="sourceLineNo">2052</span>    put = new Put(row1);<a name="line.2052"></a>
+<span class="sourceLineNo">2053</span>    put.addColumn(fam1, qf1, val2);<a name="line.2053"></a>
+<span class="sourceLineNo">2054</span>    put.addColumn(fam2, qf1, val3);<a name="line.2054"></a>
+<span class="sourceLineNo">2055</span>    put.addColumn(fam2, qf2, val2);<a name="line.2055"></a>
+<span class="sourceLineNo">2056</span>    put.addColumn(fam2, qf3, val1);<a name="line.2056"></a>
+<span class="sourceLineNo">2057</span>    put.addColumn(fam1, qf3, val1);<a name="line.2057"></a>
+<span class="sourceLineNo">2058</span>    region.put(put);<a name="line.2058"></a>
+<span class="sourceLineNo">2059</span><a name="line.2059"></a>
+<span class="sourceLineNo">2060</span>    // Multi-column delete<a name="line.2060"></a>
+<span class="sourceLineNo">2061</span>    Delete delete = new Delete(row1);<a name="line.2061"></a>
+<span class="sourceLineNo">2062</span>    delete.addColumn(fam1, qf1);<a name="line.2062"></a>
+<span class="sourceLineNo">2063</span>    delete.addColumn(fam2, qf1);<a name="line.2063"></a>
+<span class="sourceLineNo">2064</span>    delete.addColumn(fam1, qf3);<a name="line.2064"></a>
+<span class="sourceLineNo">2065</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.2065"></a>
+<span class="sourceLineNo">2066</span>        new BinaryComparator(val2), delete);<a name="line.2066"></a>
+<span class="sourceLineNo">2067</span>    assertEquals(true, res);<a name="line.2067"></a>
+<span class="sourceLineNo">2068</span><a name="line.2068"></a>
+<span class="sourceLineNo">2069</span>    Get get = new Get(row1);<a name="line.2069"></a>
+<span class="sourceLineNo">2070</span>    get.addColumn(fam1, qf1);<a name="line.2070"></a>
+<span class="sourceLineNo">2071</span>    get.addColumn(fam1, qf3);<a name="line.2071"></a>
+<span class="sourceLineNo">2072</span>    get.addColumn(fam2, qf2);<a name="line.2072"></a>
+<span class="sourceLineNo">2073</span>    Result r = region.get(get);<a name="line.2073"></a>
+<span class="sourceLineNo">2074</span>    assertEquals(2, r.size());<a name="line.2074"></a>
+<span class="sourceLineNo">2075</span>    assertArrayEquals(val1, r.getValue(fam1, qf1));<a name="line.2075"></a>
+<span class="sourceLineNo">2076</span>    assertArrayEquals(val2, r.getValue(fam2, qf2));<a name="line.2076"></a>
+<span class="sourceLineNo">2077</span><a name="line.2077"></a>
+<span class="sourceLineNo">2078</span>    // Family delete<a name="line.2078"></a>
+<span class="sourceLineNo">2079</span>    delete = new Delete(row1);<a name="line.2079"></a>
+<span class="sourceLineNo">2080</span>    delete.addFamily(fam2);<a name="line.2080"></a>
+<span class="sourceLineNo">2081</span>    res = region.checkAndMutate(row1, fam2, qf1, CompareOperator.EQUAL,<a name="line.2081"></a>
+<span class="sourceLineNo">2082</span>        new BinaryComparator(emptyVal), delete);<a name="line.2082"></a>
+<span class="sourceLineNo">2083</span>    assertEquals(true, res);<a name="line.2083"></a>
+<span class="sourceLineNo">2084</span><a name="line.2084"></a>
+<span class="sourceLineNo">2085</span>    get = new Get(row1);<a name="line.2085"></a>
+<span class="sourceLineNo">2086</span>    r = region.get(get);<a name="line.2086"></a>
+<span class="sourceLineNo">2087</span>    assertEquals(1, r.size());<a name="line.2087"></a>
+<span class="sourceLineNo">2088</span>    assertArrayEquals(val1, r.getValue(fam1, qf1));<a name="line.2088"></a>
+<span class="sourceLineNo">2089</span><a name="line.2089"></a>
+<span class="sourceLineNo">2090</span>    // Row delete<a name="line.2090"></a>
+<span class="sourceLineNo">2091</span>    delete = new Delete(row1);<a name="line.2091"></a>
+<span class="sourceLineNo">2092</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new BinaryComparator(val1),<a name="line.2092"></a>
+<span class="sourceLineNo">2093</span>        delete);<a name="line.2093"></a>
+<span class="sourceLineNo">2094</span>    assertEquals(true, res);<a name="line.2094"></a>
+<span class="sourceLineNo">2095</span>    get = new Get(row1);<a name="line.2095"></a>
+<span class="sourceLineNo">2096</span>    r = region.get(get);<a name="line.2096"></a>
+<span class="sourceLineNo">2097</span>    assertEquals(0, r.size());<a name="line.2097"></a>
+<span class="sourceLineNo">2098</span>  }<a name="line.2098"></a>
+<span class="sourceLineNo">2099</span><a name="line.2099"></a>
+<span class="sourceLineNo">2100</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2100"></a>
+<span class="sourceLineNo">2101</span>  // Delete tests<a name="line.2101"></a>
+<span class="sourceLineNo">2102</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2102"></a>
+<span class="sourceLineNo">2103</span>  @Test<a name="line.2103"></a>
+<span class="sourceLineNo">2104</span>  public void testDelete_multiDeleteColumn() throws IOException {<a name="line.2104"></a>
+<span class="sourceLineNo">2105</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2105"></a>
+<span class="sourceLineNo">2106</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2106"></a>
+<span class="sourceLineNo">2107</span>    byte[] qual = Bytes.toBytes("qualifier");<a name="line.2107"></a>
+<span class="sourceLineNo">2108</span>    byte[] value = Bytes.toBytes("value");<a name="line.2108"></a>
+<span class="sourceLineNo">2109</span><a name="line.2109"></a>
+<span class="sourceLineNo">2110</span>    Put put = new Put(row1);<a name="line.2110"></a>
+<span class="sourceLineNo">2111</span>    put.addColumn(fam1, qual, 1, value);<a name="line.2111"></a>
+<span class="sourceLineNo">2112</span>    put.addColumn(fam1, qual, 2, value);<a name="line.2112"></a>
+<span class="sourceLineNo">2113</span><a name="line.2113"></a>
+<span class="sourceLineNo">2114</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2114"></a>
+<span class="sourceLineNo">2115</span>    region.put(put);<a name="line.2115"></a>
+<span class="sourceLineNo">2116</span><a name="line.2116"></a>
+<span class="sourceLineNo">2117</span>    // We do support deleting more than 1 'latest' version<a name="line.2117"></a>
+<span class="sourceLineNo">2118</span>    Delete delete = new Delete(row1);<a name="line.2118"></a>
 <span class="sourceLineNo">2119</span>    delete.addColumn(fam1, qual);<a name="line.2119"></a>
-<span class="sourceLineNo">2120</span>    region.delete(delete);<a name="line.2120"></a>
-<span class="sourceLineNo">2121</span><a name="line.2121"></a>
-<span class="sourceLineNo">2122</span>    Get get = new Get(row1);<a name="line.2122"></a>
-<span class="sourceLineNo">2123</span>    get.addFamily(fam1);<a name="line.2123"></a>
-<span class="sourceLineNo">2124</span>    Result r = region.get(get);<a name="line.2124"></a>
-<span class="sourceLineNo">2125</span>    assertEquals(0, r.size());<a name="line.2125"></a>
-<span class="sourceLineNo">2126</span>  }<a name="line.2126"></a>
-<span class="sourceLineNo">2127</span><a name="line.2127"></a>
-<span class="sourceLineNo">2128</span>  @Test<a name="line.2128"></a>
-<span class="sourceLineNo">2129</span>  public void testDelete_CheckFamily() throws IOException {<a name="line.2129"></a>
-<span class="sourceLineNo">2130</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2130"></a>
-<span class="sourceLineNo">2131</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2131"></a>
-<span class="sourceLineNo">2132</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2132"></a>
-<span class="sourceLineNo">2133</span>    byte[] fam3 = Bytes.toBytes("fam3");<a name="line.2133"></a>
-<span class="sourceLineNo">2134</span>    byte[] fam4 = Bytes.toBytes("fam4");<a name="line.2134"></a>
-<span class="sourceLineNo">2135</span><a name="line.2135"></a>
-<span class="sourceLineNo">2136</span>    // Setting up region<a name="line.2136"></a>
-<span class="sourceLineNo">2137</span>    this.region = initHRegion(tableName, method, CONF, fam1, fam2, fam3);<a name="line.2137"></a>
-<span class="sourceLineNo">2138</span>    List&lt;Cell&gt; kvs = new ArrayList&lt;&gt;();<a name="line.2138"></a>
-<span class="sourceLineNo">2139</span>    kvs.add(new KeyValue(row1, fam4, null, null));<a name="line.2139"></a>
-<span class="sourceLineNo">2140</span><a name="line.2140"></a>
-<span class="sourceLineNo">2141</span>    // testing existing family<a name="line.2141"></a>
-<span class="sourceLineNo">2142</span>    byte[] family = fam2;<a name="line.2142"></a>
-<span class="sourceLineNo">2143</span>    NavigableMap&lt;byte[], List&lt;Cell&gt;&gt; deleteMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2143"></a>
-<span class="sourceLineNo">2144</span>    deleteMap.put(family, kvs);<a name="line.2144"></a>
-<span class="sourceLineNo">2145</span>    region.delete(deleteMap, Durability.SYNC_WAL);<a name="line.2145"></a>
-<span class="sourceLineNo">2146</span><a name="line.2146"></a>
-<span class="sourceLineNo">2147</span>    // testing non existing family<a name="line.2147"></a>
-<span class="sourceLineNo">2148</span>    boolean ok = false;<a name="line.2148"></a>
-<span class="sourceLineNo">2149</span>    family = fam4;<a name="line.2149"></a>
-<span class="sourceLineNo">2150</span>    try {<a name="line.2150"></a>
-<span class="sourceLineNo">2151</span>      deleteMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2151"></a>
-<span class="sourceLineNo">2152</span>      deleteMap.put(family, kvs);<a name="line.2152"></a>
-<span class="sourceLineNo">2153</span>      region.delete(deleteMap, Durability.SYNC_WAL);<a name="line.2153"></a>
-<span class="sourceLineNo">2154</span>    } catch (Exception e) {<a name="line.2154"></a>
-<span class="sourceLineNo">2155</span>      ok = true;<a name="line.2155"></a>
-<span class="sourceLineNo">2156</span>    }<a name="line.2156"></a>
-<span class="sourceLineNo">2157</span>    assertTrue("Family " + new String(family, StandardCharsets.UTF_8) + " does exist", ok);<a name="line.2157"></a>
-<span class="sourceLineNo">2158</span>  }<a name="line.2158"></a>
-<span class="sourceLineNo">2159</span><a name="line.2159"></a>
-<span class="sourceLineNo">2160</span>  @Test<a name="line.2160"></a>
-<span class="sourceLineNo">2161</span>  public void testDelete_mixed() throws IOException, InterruptedException {<a name="line.2161"></a>
-<span class="sourceLineNo">2162</span>    byte[] fam = Bytes.toBytes("info");<a name="line.2162"></a>
-<span class="sourceLineNo">2163</span>    byte[][] families = { fam };<a name="line.2163"></a>
-<span class="sourceLineNo">2164</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2164"></a>
-<span class="sourceLineNo">2165</span>    EnvironmentEdgeManagerTestHelper.injectEdge(new IncrementingEnvironmentEdge());<a name="line.2165"></a>
-<span class="sourceLineNo">2166</span><a name="line.2166"></a>
-<span class="sourceLineNo">2167</span>    byte[] row = Bytes.toBytes("table_name");<a name="line.2167"></a>
-<span class="sourceLineNo">2168</span>    // column names<a name="line.2168"></a>
-<span class="sourceLineNo">2169</span>    byte[] serverinfo = Bytes.toBytes("serverinfo");<a name="line.2169"></a>
-<span class="sourceLineNo">2170</span>    byte[] splitA = Bytes.toBytes("splitA");<a name="line.2170"></a>
-<span class="sourceLineNo">2171</span>    byte[] splitB = Bytes.toBytes("splitB");<a name="line.2171"></a>
-<span class="sourceLineNo">2172</span><a name="line.2172"></a>
-<span class="sourceLineNo">2173</span>    // add some data:<a name="line.2173"></a>
-<span class="sourceLineNo">2174</span>    Put put = new Put(row);<a name="line.2174"></a>
-<span class="sourceLineNo">2175</span>    put.addColumn(fam, splitA, Bytes.toBytes("reference_A"));<a name="line.2175"></a>
-<span class="sourceLineNo">2176</span>    region.put(put);<a name="line.2176"></a>
-<span class="sourceLineNo">2177</span><a name="line.2177"></a>
-<span class="sourceLineNo">2178</span>    put = new Put(row);<a name="line.2178"></a>
-<span class="sourceLineNo">2179</span>    put.addColumn(fam, splitB, Bytes.toBytes("reference_B"));<a name="line.2179"></a>
-<span class="sourceLineNo">2180</span>    region.put(put);<a name="line.2180"></a>
-<span class="sourceLineNo">2181</span><a name="line.2181"></a>
-<span class="sourceLineNo">2182</span>    put = new Put(row);<a name="line.2182"></a>
-<span class="sourceLineNo">2183</span>    put.addColumn(fam, serverinfo, Bytes.toBytes("ip_address"));<a name="line.2183"></a>
-<span class="sourceLineNo">2184</span>    region.put(put);<a name="line.2184"></a>
-<span class="sourceLineNo">2185</span><a name="line.2185"></a>
-<span class="sourceLineNo">2186</span>    // ok now delete a split:<a name="line.2186"></a>
-<span class="sourceLineNo">2187</span>    Delete delete = new Delete(row);<a name="line.2187"></a>
-<span class="sourceLineNo">2188</span>    delete.addColumns(fam, splitA);<a name="line.2188"></a>
-<span class="sourceLineNo">2189</span>    region.delete(delete);<a name="line.2189"></a>
-<span class="sourceLineNo">2190</span><a name="line.2190"></a>
-<span class="sourceLineNo">2191</span>    // assert some things:<a name="line.2191"></a>
-<span class="sourceLineNo">2192</span>    Get get = new Get(row).addColumn(fam, serverinfo);<a name="line.2192"></a>
-<span class="sourceLineNo">2193</span>    Result result = region.get(get);<a name="line.2193"></a>
-<span class="sourceLineNo">2194</span>    assertEquals(1, result.size());<a name="line.2194"></a>
-<span class="sourceLineNo">2195</span><a name="line.2195"></a>
-<span class="sourceLineNo">2196</span>    get = new Get(row).addColumn(fam, splitA);<a name="line.2196"></a>
-<span class="sourceLineNo">2197</span>    result = region.get(get);<a name="line.2197"></a>
-<span class="sourceLineNo">2198</span>    assertEquals(0, result.size());<a name="line.2198"></a>
-<span class="sourceLineNo">2199</span><a name="line.2199"></a>
-<span class="sourceLineNo">2200</span>    get = new Get(row).addColumn(fam, splitB);<a name="line.2200"></a>
-<span class="sourceLineNo">2201</span>    result = region.get(get);<a name="line.2201"></a>
-<span class="sourceLineNo">2202</span>    assertEquals(1, result.size());<a name="line.2202"></a>
-<span class="sourceLineNo">2203</span><a name="line.2203"></a>
-<span class="sourceLineNo">2204</span>    // Assert that after a delete, I can put.<a name="line.2204"></a>
-<span class="sourceLineNo">2205</span>    put = new Put(row);<a name="line.2205"></a>
-<span class="sourceLineNo">2206</span>    put.addColumn(fam, splitA, Bytes.toBytes("reference_A"));<a name="line.2206"></a>
-<span class="sourceLineNo">2207</span>    region.put(put);<a name="line.2207"></a>
-<span class="sourceLineNo">2208</span>    get = new Get(row);<a name="line.2208"></a>
-<span class="sourceLineNo">2209</span>    result = region.get(get);<a name="line.2209"></a>
-<span class="sourceLineNo">2210</span>    assertEquals(3, result.size());<a name="line.2210"></a>
-<span class="sourceLineNo">2211</span><a name="line.2211"></a>
-<span class="sourceLineNo">2212</span>    // Now delete all... then test I can add stuff back<a name="line.2212"></a>
-<span class="sourceLineNo">2213</span>    delete = new Delete(row);<a name="line.2213"></a>
-<span class="sourceLineNo">2214</span>    region.delete(delete);<a name="line.2214"></a>
-<span class="sourceLineNo">2215</span>    assertEquals(0, region.get(get).size());<a name="line.2215"></a>
-<span class="sourceLineNo">2216</span><a name="line.2216"></a>
-<span class="sourceLineNo">2217</span>    region.put(new Put(row).addColumn(fam, splitA, Bytes.toBytes("reference_A")));<a name="line.2217"></a>
-<span class="sourceLineNo">2218</span>    result = region.get(get);<a name="line.2218"></a>
-<span class="sourceLineNo">2219</span>    assertEquals(1, result.size());<a name="line.2219"></a>
-<span class="sourceLineNo">2220</span>  }<a name="line.2220"></a>
-<span class="sourceLineNo">2221</span><a name="line.2221"></a>
-<span class="sourceLineNo">2222</span>  @Test<a name="line.2222"></a>
-<span class="sourceLineNo">2223</span>  public void testDeleteRowWithFutureTs() throws IOException {<a name="line.2223"></a>
-<span class="sourceLineNo">2224</span>    byte[] fam = Bytes.toBytes("info");<a name="line.2224"></a>
-<span class="sourceLineNo">2225</span>    byte[][] families = { fam };<a name="line.2225"></a>
-<span class="sourceLineNo">2226</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2226"></a>
-<span class="sourceLineNo">2227</span>    byte[] row = Bytes.toBytes("table_name");<a name="line.2227"></a>
-<span class="sourceLineNo">2228</span>    // column names<a name="line.2228"></a>
-<span class="sourceLineNo">2229</span>    byte[] serverinfo = Bytes.toBytes("serverinfo");<a name="line.2229"></a>
-<span class="sourceLineNo">2230</span><a name="line.2230"></a>
-<span class="sourceLineNo">2231</span>    // add data in the far future<a name="line.2231"></a>
-<span class="sourceLineNo">2232</span>    Put put = new Put(row);<a name="line.2232"></a>
-<span class="sourceLineNo">2233</span>    put.addColumn(fam, serverinfo, HConstants.LATEST_TIMESTAMP - 5, Bytes.toBytes("value"));<a name="line.2233"></a>
-<span class="sourceLineNo">2234</span>    region.put(put);<a name="line.2234"></a>
-<span class="sourceLineNo">2235</span><a name="line.2235"></a>
-<span class="sourceLineNo">2236</span>    // now delete something in the present<a name="line.2236"></a>
-<span class="sourceLineNo">2237</span>    Delete delete = new Delete(row);<a name="line.2237"></a>
-<span class="sourceLineNo">2238</span>    region.delete(delete);<a name="line.2238"></a>
-<span class="sourceLineNo">2239</span><a name="line.2239"></a>
-<span class="sourceLineNo">2240</span>    // make sure we still see our data<a name="line.2240"></a>
-<span class="sourceLineNo">2241</span>    Get get = new Get(row).addColumn(fam, serverinfo);<a name="line.2241"></a>
-<span class="sourceLineNo">2242</span>    Result result = region.get(get);<a name="line.2242"></a>
-<span class="sourceLineNo">2243</span>    assertEquals(1, result.size());<a name="line.2243"></a>
-<span class="sourceLineNo">2244</span><a name="line.2244"></a>
-<span class="sourceLineNo">2245</span>    // delete the future row<a name="line.2245"></a>
-<span class="sourceLineNo">2246</span>    delete = new Delete(row, HConstants.LATEST_TIMESTAMP - 3);<a name="line.2246"></a>
-<span class="sourceLineNo">2247</span>    region.delete(delete);<a name="line.2247"></a>
-<span class="sourceLineNo">2248</span><a name="line.2248"></a>
-<span class="sourceLineNo">2249</span>    // make sure it is gone<a name="line.2249"></a>
-<span class="sourceLineNo">2250</span>    get = new Get(row).addColumn(fam, serverinfo);<a name="line.2250"></a>
-<span class="sourceLineNo">2251</span>    result = region.get(get);<a name="line.2251"></a>
-<span class="sourceLineNo">2252</span>    assertEquals(0, result.size());<a name="line.2252"></a>
-<span class="sourceLineNo">2253</span>  }<a name="line.2253"></a>
-<span class="sourceLineNo">2254</span><a name="line.2254"></a>
-<span class="sourceLineNo">2255</span>  /**<a name="line.2255"></a>
-<span class="sourceLineNo">2256</span>   * Tests that the special LATEST_TIMESTAMP option for puts gets replaced by<a name="line.2256"></a>
-<span class="sourceLineNo">2257</span>   * the actual timestamp<a name="line.2257"></a>
-<span class="sourceLineNo">2258</span>   */<a name="line.2258"></a>
-<span class="sourceLineNo">2259</span>  @Test<a name="line.2259"></a>
-<span class="sourceLineNo">2260</span>  public void testPutWithLatestTS() throws IOException {<a name="line.2260"></a>
-<span class="sourceLineNo">2261</span>    byte[] fam = Bytes.toBytes("info");<a name="line.2261"></a>
-<span class="sourceLineNo">2262</span>    byte[][] families = { fam };<a name="line.2262"></a>
-<span class="sourceLineNo">2263</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2263"></a>
-<span class="sourceLineNo">2264</span>    byte[] row = Bytes.toBytes("row1");<a name="line.2264"></a>
-<span class="sourceLineNo">2265</span>    // column names<a name="line.2265"></a>
-<span class="sourceLineNo">2266</span>    byte[] qual = Bytes.toBytes("qual");<a name="line.2266"></a>
-<span class="sourceLineNo">2267</span><a name="line.2267"></a>
-<span class="sourceLineNo">2268</span>    // add data with LATEST_TIMESTAMP, put without WAL<a name="line.2268"></a>
-<span class="sourceLineNo">2269</span>    Put put = new Put(row);<a name="line.2269"></a>
-<span class="sourceLineNo">2270</span>    put.addColumn(fam, qual, HConstants.LATEST_TIMESTAMP, Bytes.toBytes("value"));<a name="line.2270"></a>
-<span class="sourceLineNo">2271</span>    region.put(put);<a name="line.2271"></a>
-<span class="sourceLineNo">2272</span><a name="line.2272"></a>
-<span class="sourceLineNo">2273</span>    // Make sure it shows up with an actual timestamp<a name="line.2273"></a>
-<span class="sourceLineNo">2274</span>    Get get = new Get(row).addColumn(fam, qual);<a name="line.2274"></a>
-<span class="sourceLineNo">2275</span>    Result result = region.get(get);<a name="line.2275"></a>
-<span class="sourceLineNo">2276</span>    assertEquals(1, result.size());<a name="line.2276"></a>
-<span class="sourceLineNo">2277</span>    Cell kv = result.rawCells()[0];<a name="line.2277"></a>
-<span class="sourceLineNo">2278</span>    LOG.info("Got: " + kv);<a name="line.2278"></a>
-<span class="sourceLineNo">2279</span>    assertTrue("LATEST_TIMESTAMP was not replaced with real timestamp",<a name="line.2279"></a>
-<span class="sourceLineNo">2280</span>        kv.getTimestamp() != HConstants.LATEST_TIMESTAMP);<a name="line.2280"></a>
-<span class="sourceLineNo">2281</span><a name="line.2281"></a>
-<span class="sourceLineNo">2282</span>    // Check same with WAL enabled (historically these took different<a name="line.2282"></a>
-<span class="sourceLineNo">2283</span>    // code paths, so check both)<a name="line.2283"></a>
-<span class="sourceLineNo">2284</span>    row = Bytes.toBytes("row2");<a name="line.2284"></a>
-<span class="sourceLineNo">2285</span>    put = new Put(row);<a name="line.2285"></a>
-<span class="sourceLineNo">2286</span>    put.addColumn(fam, qual, HConstants.LATEST_TIMESTAMP, Bytes.toBytes("value"));<a name="line.2286"></a>
-<span class="sourceLineNo">2287</span>    region.put(put);<a name="line.2287"></a>
-<span class="sourceLineNo">2288</span><a name="line.2288"></a>
-<span class="sourceLineNo">2289</span>    // Make sure it shows up with an actual timestamp<a name="line.2289"></a>
-<span class="sourceLineNo">2290</span>    get = new Get(row).addColumn(fam, qual);<a name="line.2290"></a>
-<span class="sourceLineNo">2291</span>    result = region.get(get);<a name="line.2291"></a>
-<span class="sourceLineNo">2292</span>    assertEquals(1, result.size());<a name="line.2292"></a>
-<span class="sourceLineNo">2293</span>    kv = result.rawCells()[0];<a name="line.2293"></a>
-<span class="sourceLineNo">2294</span>    LOG.info("Got: " + kv);<a name="line.2294"></a>
-<span class="sourceLineNo">2295</span>    assertTrue("LATEST_TIMESTAMP was not replaced with real timestamp",<a name="line.2295"></a>
-<span class="sourceLineNo">2296</span>        kv.getTimestamp() != HConstants.LATEST_TIMESTAMP);<a name="line.2296"></a>
-<span class="sourceLineNo">2297</span>  }<a name="line.2297"></a>
-<span class="sourceLineNo">2298</span><a name="line.2298"></a>
-<span class="sourceLineNo">2299</span>  /**<a name="line.2299"></a>
-<span class="sourceLineNo">2300</span>   * Tests that there is server-side filtering for invalid timestamp upper<a name="line.2300"></a>
-<span class="sourceLineNo">2301</span>   * bound. Note that the timestamp lower bound is automatically handled for us<a name="line.2301"></a>
-<span class="sourceLineNo">2302</span>   * by the TTL field.<a name="line.2302"></a>
-<span class="sourceLineNo">2303</span>   */<a name="line.2303"></a>
-<span class="sourceLineNo">2304</span>  @Test<a name="line.2304"></a>
-<span class="sourceLineNo">2305</span>  public void testPutWithTsSlop() throws IOException {<a name="line.2305"></a>
-<span class="sourceLineNo">2306</span>    byte[] fam = Bytes.toBytes("info");<a name="line.2306"></a>
-<span class="sourceLineNo">2307</span>    byte[][] families = { fam };<a name="line.2307"></a>
-<span class="sourceLineNo">2308</span><a name="line.2308"></a>
-<span class="sourceLineNo">2309</span>    // add data with a timestamp that is too recent for range. Ensure assert<a name="line.2309"></a>
-<span class="sourceLineNo">2310</span>    CONF.setInt("hbase.hregion.keyvalue.timestamp.slop.millisecs", 1000);<a name="line.2310"></a>
-<span class="sourceLineNo">2311</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2311"></a>
-<span class="sourceLineNo">2312</span>    boolean caughtExcep = false;<a name="line.2312"></a>
-<span class="sourceLineNo">2313</span>    try {<a name="line.2313"></a>
-<span class="sourceLineNo">2314</span>      // no TS specified == use latest. should not error<a name="line.2314"></a>
-<span class="sourceLineNo">2315</span>      region.put(new Put(row).addColumn(fam, Bytes.toBytes("qual"), Bytes.toBytes("value")));<a name="line.2315"></a>
-<span class="sourceLineNo">2316</span>      // TS out of range. should error<a name="line.2316"></a>
-<span class="sourceLineNo">2317</span>      region.put(new Put(row).addColumn(fam, Bytes.toBytes("qual"),<a name="line.2317"></a>
-<span class="sourceLineNo">2318</span>          System.currentTimeMillis() + 2000, Bytes.toBytes("value")));<a name="line.2318"></a>
-<span class="sourceLineNo">2319</span>      fail("Expected IOE for TS out of configured timerange");<a name="line.2319"></a>
-<span class="sourceLineNo">2320</span>    } catch (FailedSanityCheckException ioe) {<a name="line.2320"></a>
-<span class="sourceLineNo">2321</span>      LOG.debug("Received expected exception", ioe);<a name="line.2321"></a>
-<span class="sourceLineNo">2322</span>      caughtExcep = true;<a name="line.2322"></a>
-<span class="sourceLineNo">2323</span>    }<a name="line.2323"></a>
-<span class="sourceLineNo">2324</span>    assertTrue("Should catch FailedSanityCheckException", caughtExcep);<a name="line.2324"></a>
-<span class="sourceLineNo">2325</span>  }<a name="line.2325"></a>
-<span class="sourceLineNo">2326</span><a name="line.2326"></a>
-<span class="sourceLineNo">2327</span>  @Test<a name="line.2327"></a>
-<span class="sourceLineNo">2328</span>  public void testScanner_DeleteOneFamilyNotAnother() throws IOException {<a name="line.2328"></a>
-<span class="sourceLineNo">2329</span>    byte[] fam1 = Bytes.toBytes("columnA");<a name="line.2329"></a>
-<span class="sourceLineNo">2330</span>    byte[] fam2 = Bytes.toBytes("columnB");<a name="line.2330"></a>
-<span class="sourceLineNo">2331</span>    this.region = initHRegion(tableName, method, CONF, fam1, fam2);<a name="line.2331"></a>
-<span class="sourceLineNo">2332</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.2332"></a>
-<span class="sourceLineNo">2333</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.2333"></a>
-<span class="sourceLineNo">2334</span><a name="line.2334"></a>
-<span class="sourceLineNo">2335</span>    byte[] value = Bytes.toBytes("value");<a name="line.2335"></a>
-<span class="sourceLineNo">2336</span><a name="line.2336"></a>
-<span class="sourceLineNo">2337</span>    Delete delete = new Delete(rowA);<a name="line.2337"></a>
-<span class="sourceLineNo">2338</span>    delete.addFamily(fam1);<a name="line.2338"></a>
-<span class="sourceLineNo">2339</span><a name="line.2339"></a>
-<span class="sourceLineNo">2340</span>    region.delete(delete);<a name="line.2340"></a>
-<span class="sourceLineNo">2341</span><a name="line.2341"></a>
-<span class="sourceLineNo">2342</span>    // now create data.<a name="line.2342"></a>
-<span class="sourceLineNo">2343</span>    Put put = new Put(rowA);<a name="line.2343"></a>
-<span class="sourceLineNo">2344</span>    put.addColumn(fam2, null, value);<a name="line.2344"></a>
-<span class="sourceLineNo">2345</span>    region.put(put);<a name="line.2345"></a>
-<span class="sourceLineNo">2346</span><a name="line.2346"></a>
-<span class="sourceLineNo">2347</span>    put = new Put(rowB);<a name="line.2347"></a>
-<span class="sourceLineNo">2348</span>    put.addColumn(fam1, null, value);<a name="line.2348"></a>
-<span class="sourceLineNo">2349</span>    put.addColumn(fam2, null, value);<a name="line.2349"></a>
-<span class="sourceLineNo">2350</span>    region.put(put);<a name="line.2350"></a>
-<span class="sourceLineNo">2351</span><a name="line.2351"></a>
-<span class="sourceLineNo">2352</span>    Scan scan = new Scan();<a name="line.2352"></a>
-<span class="sourceLineNo">2353</span>    scan.addFamily(fam1).addFamily(fam2);<a name="line.2353"></a>
-<span class="sourceLineNo">2354</span>    InternalScanner s = region.getScanner(scan);<a name="line.2354"></a>
-<span class="sourceLineNo">2355</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.2355"></a>
-<span class="sourceLineNo">2356</span>    s.next(results);<a name="line.2356"></a>
-<span class="sourceLineNo">2357</span>    assertTrue(CellUtil.matchingRows(results.get(0), rowA));<a name="line.2357"></a>
-<span class="sourceLineNo">2358</span><a name="line.2358"></a>
-<span class="sourceLineNo">2359</span>    results.clear();<a name="line.2359"></a>
-<span class="sourceLineNo">2360</span>    s.next(results);<a name="line.2360"></a>
-<span class="sourceLineNo">2361</span>    assertTrue(CellUtil.matchingRows(results.get(0), rowB));<a name="line.2361"></a>
-<span class="sourceLineNo">2362</span>  }<a name="line.2362"></a>
-<span class="sourceLineNo">2363</span><a name="line.2363"></a>
-<span class="sourceLineNo">2364</span>  @Test<a name="line.2364"></a>
-<span class="sourceLineNo">2365</span>  public void testDataInMemoryWithoutWAL() throws IOException {<a name="line.2365"></a>
-<span class="sourceLineNo">2366</span>    FileSystem fs = FileSystem.get(CONF);<a name="line.2366"></a>
-<span class="sourceLineNo">2367</span>    Path rootDir = new Path(dir + "testDataInMemoryWithoutWAL");<a name="line.2367"></a>
-<span class="sourceLineNo">2368</span>    FSHLog hLog = new FSHLog(fs, rootDir, "testDataInMemoryWithoutWAL", CONF);<a name="line.2368"></a>
-<span class="sourceLineNo">2369</span>    hLog.init();<a name="line.2369"></a>
-<span class="sourceLineNo">2370</span>    // This chunk creation is done throughout the code base. Do we want to move it into core?<a name="line.2370"></a>
-<span class="sourceLineNo">2371</span>    // It is missing from this test. W/o it we NPE.<a name="line.2371"></a>
-<span class="sourceLineNo">2372</span>    ChunkCreator.initialize(MemStoreLABImpl.CHUNK_SIZE_DEFAULT, false, 0, 0, 0, null);<a name="line.2372"></a>
-<span class="sourceLineNo">2373</span>    region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, hLog,<a name="line.2373"></a>
-<span class="sourceLineNo">2374</span>        COLUMN_FAMILY_BYTES);<a name="line.2374"></a>
-<span class="sourceLineNo">2375</span><a name="line.2375"></a>
-<span class="sourceLineNo">2376</span>    Cell originalCell = CellUtil.createCell(row, COLUMN_FAMILY_BYTES, qual1,<a name="line.2376"></a>
-<span class="sourceLineNo">2377</span>      System.currentTimeMillis(), KeyValue.Type.Put.getCode(), value1);<a name="line.2377"></a>
-<span class="sourceLineNo">2378</span>    final long originalSize = originalCell.getSerializedSize();<a name="line.2378"></a>
-<span class="sourceLineNo">2379</span><a name="line.2379"></a>
-<span class="sourceLineNo">2380</span>    Cell addCell = CellUtil.createCell(row, COLUMN_FAMILY_BYTES, qual1,<a name="line.2380"></a>
-<span class="sourceLineNo">2381</span>      System.currentTimeMillis(), KeyValue.Type.Put.getCode(), Bytes.toBytes("xxxxxxxxxx"));<a name="line.2381"></a>
-<span class="sourceLineNo">2382</span>    final long addSize = addCell.getSerializedSize();<a name="line.2382"></a>
-<span class="sourceLineNo">2383</span><a name="line.2383"></a>
-<span class="sourceLineNo">2384</span>    LOG.info("originalSize:" + originalSize<a name="line.2384"></a>
-<span class="sourceLineNo">2385</span>      + ", addSize:" + addSize);<a name="line.2385"></a>
-<span class="sourceLineNo">2386</span>    // start test. We expect that the addPut's durability will be replaced<a name="line.2386"></a>
-<span class="sourceLineNo">2387</span>    // by originalPut's durability.<a name="line.2387"></a>
-<span class="sourceLineNo">2388</span><a name="line.2388"></a>
-<span class="sourceLineNo">2389</span>    // case 1:<a name="line.2389"></a>
-<span class="sourceLineNo">2390</span>    testDataInMemoryWithoutWAL(region,<a name="line.2390"></a>
-<span class="sourceLineNo">2391</span>            new Put(row).add(originalCell).setDurability(Durability.SKIP_WAL),<a name="line.2391"></a>
-<span class="sourceLineNo">2392</span>            new Put(row).add(addCell).setDurability(Durability.SKIP_WAL),<a name="line.2392"></a>
-<span class="sourceLineNo">2393</span>            originalSize + addSize);<a name="line.2393"></a>
-<span class="sourceLineNo">2394</span><a name="line.2394"></a>
-<span class="sourceLineNo">2395</span>    // case 2:<a name="line.2395"></a>
-<span class="sourceLineNo">2396</span>    testDataInMemoryWithoutWAL(region,<a name="line.2396"></a>
-<span class="sourceLineNo">2397</span>            new Put(row).add(originalCell).setDurability(Durability.SKIP_WAL),<a name="line.2397"></a>
-<span class="sourceLineNo">2398</span>            new Put(row).add(addCell).setDurability(Durability.SYNC_WAL),<a name="line.2398"></a>
-<span class="sourceLineNo">2399</span>            originalSize + addSize);<a name="line.2399"></a>
-<span class="sourceLineNo">2400</span><a name="line.2400"></a>
-<span class="sourceLineNo">2401</span>    // case 3:<a name="line.2401"></a>
-<span class="sourceLineNo">2402</span>    testDataInMemoryWithoutWAL(region,<a name="line.2402"></a>
-<span class="sourceLineNo">2403</span>            new Put(row).add(originalCell).setDurability(Durability.SYNC_WAL),<a name="line.2403"></a>
-<span class="sourceLineNo">2404</span>            new Put(row).add(addCell).setDurability(Durability.SKIP_WAL),<a name="line.2404"></a>
-<span class="sourceLineNo">2405</span>            0);<a name="line.2405"></a>
-<span class="sourceLineNo">2406</span><a name="line.2406"></a>
-<span class="sourceLineNo">2407</span>    // case 4:<a name="line.2407"></a>
-<span class="sourceLineNo">2408</span>    testDataInMemoryWithoutWAL(region,<a name="line.2408"></a>
-<span class="sourceLineNo">2409</span>            new Put(row).add(originalCell).setDurability(Durability.SYNC_WAL),<a name="line.2409"></a>
-<span class="sourceLineNo">2410</span>            new Put(row).add(addCell).setDurability(Durability.SYNC_WAL),<a name="line.2410"></a>
-<span class="sourceLineNo">2411</span>            0);<a name="line.2411"></a>
-<span class="sourceLineNo">2412</span>  }<a name="line.2412"></a>
-<span class="sourceLineNo">2413</span><a name="line.2413"></a>
-<span class="sourceLineNo">2414</span>  private static void testDataInMemoryWithoutWAL(HRegion region, Put originalPut,<a name="line.2414"></a>
-<span class="sourceLineNo">2415</span>          final Put addPut, long delta) throws IOException {<a name="line.2415"></a>
-<span class="sourceLineNo">2416</span>    final long initSize = region.getDataInMemoryWithoutWAL();<a name="line.2416"></a>
-<span class="sourceLineNo">2417</span>    // save normalCPHost and replaced by mockedCPHost<a name="line.2417"></a>
-<span class="sourceLineNo">2418</span>    RegionCoprocessorHost normalCPHost = region.getCoprocessorHost();<a name="line.2418"></a>
-<span class="sourceLineNo">2419</span>    RegionCoprocessorHost mockedCPHost = Mockito.mock(RegionCoprocessorHost.class);<a name="line.2419"></a>
-<span class="sourceLineNo">2420</span>    // Because the preBatchMutate returns void, we can't do usual Mockito when...then form. Must<a name="line.2420"></a>
-<span class="sourceLineNo">2421</span>    // do below format (from Mockito doc).<a name="line.2421"></a>
-<span class="sourceLineNo">2422</span>    Mockito.doAnswer(new Answer&lt;Void&gt;() {<a name="line.2422"></a>
-<span class="sourceLineNo">2423</span>      @Override<a name="line.2423"></a>
-<span class="sourceLineNo">2424</span>      public Void answer(InvocationOnMock invocation) throws Throwable {<a name="line.2424"></a>
-<span class="sourceLineNo">2425</span>        MiniBatchOperationInProgress&lt;Mutation&gt; mb = invocation.getArgument(0);<a name="line.2425"></a>
-<span class="sourceLineNo">2426</span>        mb.addOperationsFromCP(0, new Mutation[]{addPut});<a name="line.2426"></a>
-<span class="sourceLineNo">2427</span>        return null;<a name="line.2427"></a>
-<span class="sourceLineNo">2428</span>      }<a name="line.2428"></a>
-<span class="sourceLineNo">2429</span>    }).when(mockedCPHost).preBatchMutate(Mockito.isA(MiniBatchOperationInProgress.class));<a name="line.2429"></a>
-<span class="sourceLineNo">2430</span>    region.setCoprocessorHost(mockedCPHost);<a name="line.2430"></a>
-<span class="sourceLineNo">2431</span>    region.put(originalPut);<a name="line.2431"></a>
-<span class="sourceLineNo">2432</span>    region.setCoprocessorHost(normalCPHost);<a name="line.2432"></a>
-<span class="sourceLineNo">2433</span>    final long finalSize = region.getDataInMemoryWithoutWAL();<a name="line.2433"></a>
-<span class="sourceLineNo">2434</span>    assertEquals("finalSize:" + finalSize + ", initSize:"<a name="line.2434"></a>
-<span class="sourceLineNo">2435</span>      + initSize + ", delta:" + delta,finalSize, initSize + delta);<a name="line.2435"></a>
-<span class="sourceLineNo">2436</span>  }<a name="line.2436"></a>
-<span class="sourceLineNo">2437</span><a name="line.2437"></a>
-<span class="sourceLineNo">2438</span>  @Test<a name="line.2438"></a>
-<span class="sourceLineNo">2439</span>  public void testDeleteColumns_PostInsert() throws IOException, InterruptedException {<a name="line.2439"></a>
-<span class="sourceLineNo">2440</span>    Delete delete = new Delete(row);<a name="line.2440"></a>
-<span class="sourceLineNo">2441</span>    delete.addColumns(fam1, qual1);<a name="line.2441"></a>
-<span class="sourceLineNo">2442</span>    doTestDelete_AndPostInsert(delete);<a name="line.2442"></a>
-<span class="sourceLineNo">2443</span>  }<a name="line.2443"></a>
-<span class="sourceLineNo">2444</span><a name="line.2444"></a>
-<span class="sourceLineNo">2445</span>  @Test<a name="line.2445"></a>
-<span class="sourceLineNo">2446</span>  public void testaddFamily_PostInsert() throws IOException, InterruptedException {<a name="line.2446"></a>
-<span class="sourceLineNo">2447</span>    Delete delete = new Delete(row);<a name="line.2447"></a>
-<span class="sourceLineNo">2448</span>    delete.addFamily(fam1);<a name="line.2448"></a>
-<span class="sourceLineNo">2449</span>    doTestDelete_AndPostInsert(delete);<a name="line.2449"></a>
-<span class="sourceLineNo">2450</span>  }<a name="line.2450"></a>
-<span class="sourceLineNo">2451</span><a name="line.2451"></a>
-<span class="sourceLineNo">2452</span>  public void doTestDelete_AndPostInsert(Delete delete) throws IOException, InterruptedException {<a name="line.2452"></a>
-<span class="sourceLineNo">2453</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2453"></a>
-<span class="sourceLineNo">2454</span>    EnvironmentEdgeManagerTestHelper.injectEdge(new IncrementingEnvironmentEdge());<a name="line.2454"></a>
-<span class="sourceLineNo">2455</span>    Put put = new Put(row);<a name="line.2455"></a>
-<span class="sourceLineNo">2456</span>    put.addColumn(fam1, qual1, value1);<a name="line.2456"></a>
-<span class="sourceLineNo">2457</span>    region.put(put);<a name="line.2457"></a>
-<span class="sourceLineNo">2458</span><a name="line.2458"></a>
-<span class="sourceLineNo">2459</span>    // now delete the value:<a name="line.2459"></a>
-<span class="sourceLineNo">2460</span>    region.delete(delete);<a name="line.2460"></a>
+<span class="sourceLineNo">2120</span>    delete.addColumn(fam1, qual);<a name="line.2120"></a>
+<span class="sourceLineNo">2121</span>    region.delete(delete);<a name="line.2121"></a>
+<span class="sourceLineNo">2122</span><a name="line.2122"></a>
+<span class="sourceLineNo">2123</span>    Get get = new Get(row1);<a name="line.2123"></a>
+<span class="sourceLineNo">2124</span>    get.addFamily(fam1);<a name="line.2124"></a>
+<span class="sourceLineNo">2125</span>    Result r = region.get(get);<a name="line.2125"></a>
+<span class="sourceLineNo">2126</span>    assertEquals(0, r.size());<a name="line.2126"></a>
+<span class="sourceLineNo">2127</span>  }<a name="line.2127"></a>
+<span class="sourceLineNo">2128</span><a name="line.2128"></a>
+<span class="sourceLineNo">2129</span>  @Test<a name="line.2129"></a>
+<span class="sourceLineNo">2130</span>  public void testDelete_CheckFamily() throws IOException {<a name="line.2130"></a>
+<span class="sourceLineNo">2131</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2131"></a>
+<span class="sourceLineNo">2132</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2132"></a>
+<span class="sourceLineNo">2133</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2133"></a>
+<span class="sourceLineNo">2134</span>    byte[] fam3 = Bytes.toBytes("fam3");<a name="line.2134"></a>
+<span class="sourceLineNo">2135</span>    byte[] fam4 = Bytes.toBytes("fam4");<a name="line.2135"></a>
+<span class="sourceLineNo">2136</span><a name="line.2136"></a>
+<span class="sourceLineNo">2137</span>    // Setting up region<a name="line.2137"></a>
+<span class="sourceLineNo">2138</span>    this.region = initHRegion(tableName, method, CONF, fam1, fam2, fam3);<a name="line.2138"></a>
+<span class="sourceLineNo">2139</span>    List&lt;Cell&gt; kvs = new ArrayList&lt;&gt;();<a name="line.2139"></a>
+<span class="sourceLineNo">2140</span>    kvs.add(new KeyValue(row1, fam4, null, null));<a name="line.2140"></a>
+<span class="sourceLineNo">2141</span><a name="line.2141"></a>
+<span class="sourceLineNo">2142</span>    // testing existing family<a name="line.2142"></a>
+<span class="sourceLineNo">2143</span>    byte[] family = fam2;<a name="line.2143"></a>
+<span class="sourceLineNo">2144</span>    NavigableMap&lt;byte[], List&lt;Cell&gt;&gt; deleteMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2144"></a>
+<span class="sourceLineNo">2145</span>    deleteMap.put(family, kvs);<a name="line.2145"></a>
+<span class="sourceLineNo">2146</span>    region.delete(deleteMap, Durability.SYNC_WAL);<a name="line.2146"></a>
+<span class="sourceLineNo">2147</span><a name="line.2147"></a>
+<span class="sourceLineNo">2148</span>    // testing non existing family<a name="line.2148"></a>
+<span class="sourceLineNo">2149</span>    boolean ok = false;<a name="line.2149"></a>
+<span class="sourceLineNo">2150</span>    family = fam4;<a name="line.2150"></a>
+<span class="sourceLineNo">2151</span>    try {<a name="line.2151"></a>
+<span class="sourceLineNo">2152</span>      deleteMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2152"></a>
+<span class="sourceLineNo">2153</span>      deleteMap.put(family, kvs);<a name="line.2153"></a>
+<span class="sourceLineNo">2154</span>      region.delete(deleteMap, Durability.SYNC_WAL);<a name="line.2154"></a>
+<span class="sourceLineNo">2155</span>    } catch (Exception e) {<a name="line.2155"></a>
+<span class="sourceLineNo">2156</span>      ok = true;<a name="line.2156"></a>
+<span class="sourceLineNo">2157</span>    }<a name="line.2157"></a>
+<span class="sourceLineNo">2158</span>    assertTrue("Family " + new String(family, StandardCharsets.UTF_8) + " does exist", ok);<a name="line.2158"></a>
+<span class="sourceLineNo">2159</span>  }<a name="line.2159"></a>
+<span class="sourceLineNo">2160</span><a name="line.2160"></a>
+<span class="sourceLineNo">2161</span>  @Test<a name="line.2161"></a>
+<span class="sourceLineNo">2162</span>  public void testDelete_mixed() throws IOException, InterruptedException {<a name="line.2162"></a>
+<span class="sourceLineNo">2163</span>    byte[] fam = Bytes.toBytes("info");<a name="line.2163"></a>
+<span class="sourceLineNo">2164</span>    byte[][] families = { fam };<a name="line.2164"></a>
+<span class="sourceLineNo">2165</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2165"></a>
+<span class="sourceLineNo">2166</span>    EnvironmentEdgeManagerTestHelper.injectEdge(new IncrementingEnvironmentEdge());<a name="line.2166"></a>
+<span class="sourceLineNo">2167</span><a name="line.2167"></a>
+<span class="sourceLineNo">2168</span>    byte[] row = Bytes.toBytes("table_name");<a name="line.2168"></a>
+<span class="sourceLineNo">2169</span>    // column names<a name="line.2169"></a>
+<span class="sourceLineNo">2170</span>    byte[] serverinfo = Bytes.toBytes("serverinfo");<a name="line.2170"></a>
+<span class="sourceLineNo">2171</span>    byte[] splitA = Bytes.toBytes("splitA");<a name="line.2171"></a>
+<span class="sourceLineNo">2172</span>    byte[] splitB = Bytes.toBytes("splitB");<a name="line.2172"></a>
+<span class="sourceLineNo">2173</span><a name="line.2173"></a>
+<span class="sourceLineNo">2174</span>    // add some data:<a name="line.2174"></a>
+<span class="sourceLineNo">2175</span>    Put put = new Put(row);<a name="line.2175"></a>
+<span class="sourceLineNo">2176</span>    put.addColumn(fam, splitA, Bytes.toBytes("reference_A"));<a name="line.2176"></a>
+<span class="sourceLineNo">2177</span>    region.put(put);<a name="line.2177"></a>
+<span class="sourceLineNo">2178</span><a name="line.2178"></a>
+<span class="sourceLineNo">2179</span>    put = new Put(row);<a name="line.2179"></a>
+<span class="sourceLineNo">2180</span>    put.addColumn(fam, splitB, Bytes.toBytes("reference_B"));<a name="line.2180"></a>
+<span class="sourceLineNo">2181</span>    region.put(put);<a name="line.2181"></a>
+<span class="sourceLineNo">2182</span><a name="line.2182"></a>
+<span class="sourceLineNo">2183</span>    put = new Put(row);<a name="line.2183"></a>
+<span class="sourceLineNo">2184</span>    put.addColumn(fam, serverinfo, Bytes.toBytes("ip_address"));<a name="line.2184"></a>
+<span class="sourceLineNo">2185</span>    region.put(put);<a name="line.2185"></a>
+<span class="sourceLineNo">2186</span><a name="line.2186"></a>
+<span class="sourceLineNo">2187</span>    // ok now delete a split:<a name="line.2187"></a>
+<span class="sourceLineNo">2188</span>    Delete delete = new Delete(row);<a name="line.2188"></a>
+<span class="sourceLineNo">2189</span>    delete.addColumns(fam, splitA);<a name="line.2189"></a>
+<span class="sourceLineNo">2190</span>    region.delete(delete);<a name="line.2190"></a>
+<span class="sourceLineNo">2191</span><a name="line.2191"></a>
+<span class="sourceLineNo">2192</span>    // assert some things:<a name="line.2192"></a>
+<span class="sourceLineNo">2193</span>    Get get = new Get(row).addColumn(fam, serverinfo);<a name="line.2193"></a>
+<span class="sourceLineNo">2194</span>    Result result = region.get(get);<a name="line.2194"></a>
+<span class="sourceLineNo">2195</span>    assertEquals(1, result.size());<a name="line.2195"></a>
+<span class="sourceLineNo">2196</span><a name="line.2196"></a>
+<span class="sourceLineNo">2197</span>    get = new Get(row).addColumn(fam, splitA);<a name="line.2197"></a>
+<span class="sourceLineNo">2198</span>    result = region.get(get);<a name="line.2198"></a>
+<span class="sourceLineNo">2199</span>    assertEquals(0, result.size());<a name="line.2199"></a>
+<span class="sourceLineNo">2200</span><a name="line.2200"></a>
+<span class="sourceLineNo">2201</span>    get = new Get(row).addColumn(fam, splitB);<a name="line.2201"></a>
+<span class="sourceLineNo">2202</span>    result = region.get(get);<a name="line.2202"></a>
+<span class="sourceLineNo">2203</span>    assertEquals(1, result.size());<a name="line.2203"></a>
+<span class="sourceLineNo">2204</span><a name="line.2204"></a>
+<span class="sourceLineNo">2205</span>    // Assert that after a delete, I can put.<a name="line.2205"></a>
+<span class="sourceLineNo">2206</span>    put = new Put(row);<a name="line.2206"></a>
+<span class="sourceLineNo">2207</span>    put.addColumn(fam, splitA, Bytes.toBytes("reference_A"));<a name="line.2207"></a>
+<span class="sourceLineNo">2208</span>    region.put(put);<a name="line.2208"></a>
+<span class="sourceLineNo">2209</span>    get = new Get(row);<a name="line.2209"></a>
+<span class="sourceLineNo">2210</span>    result = region.get(get);<a name="line.2210"></a>
+<span class="sourceLineNo">2211</span>    assertEquals(3, result.size());<a name="line.2211"></a>
+<span class="sourceLineNo">2212</span><a name="line.2212"></a>
+<span class="sourceLineNo">2213</span>    // Now delete all... then test I can add stuff back<a name="line.2213"></a>
+<span class="sourceLineNo">2214</span>    delete = new Delete(row);<a name="line.2214"></a>
+<span class="sourceLineNo">2215</span>    region.delete(delete);<a name="line.2215"></a>
+<span class="sourceLineNo">2216</span>    assertEquals(0, region.get(get).size());<a name="line.2216"></a>
+<span class="sourceLineNo">2217</span><a name="line.2217"></a>
+<span class="sourceLineNo">2218</span>    region.put(new Put(row).addColumn(fam, splitA, Bytes.toBytes("reference_A")));<a name="line.2218"></a>
+<span class="sourceLineNo">2219</span>    result = region.get(get);<a name="line.2219"></a>
+<span class="sourceLineNo">2220</span>    assertEquals(1, result.size());<a name="line.2220"></a>
+<span class="sourceLineNo">2221</span>  }<a name="line.2221"></a>
+<span class="sourceLineNo">2222</span><a name="line.2222"></a>
+<span class="sourceLineNo">2223</span>  @Test<a name="line.2223"></a>
+<span class="sourceLineNo">2224</span>  public void testDeleteRowWithFutureTs() throws IOException {<a name="line.2224"></a>
+<span class="sourceLineNo">2225</span>    byte[] fam = Bytes.toBytes("info");<a name="line.2225"></a>
+<span class="sourceLineNo">2226</span>    byte[][] families = { fam };<a name="line.2226"></a>
+<span class="sourceLineNo">2227</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2227"></a>
+<span class="sourceLineNo">2228</span>    byte[] row = Bytes.toBytes("table_name");<a name="line.2228"></a>
+<span class="sourceLineNo">2229</span>    // column names<a name="line.2229"></a>
+<span class="sourceLineNo">2230</span>    byte[] serverinfo = Bytes.toBytes("serverinfo");<a name="line.2230"></a>
+<span class="sourceLineNo">2231</span><a name="line.2231"></a>
+<span class="sourceLineNo">2232</span>    // add data in the far future<a name="line.2232"></a>
+<span class="sourceLineNo">2233</span>    Put put = new Put(row);<a name="line.2233"></a>
+<span class="sourceLineNo">2234</span>    put.addColumn(fam, serverinfo, HConstants.LATEST_TIMESTAMP - 5, Bytes.toBytes("value"));<a name="line.2234"></a>
+<span class="sourceLineNo">2235</span>    region.put(put);<a name="line.2235"></a>
+<span class="sourceLineNo">2236</span><a name="line.2236"></a>
+<span class="sourceLineNo">2237</span>    // now delete something in the present<a name="line.2237"></a>
+<span class="sourceLineNo">2238</span>    Delete delete = new Delete(row);<a name="line.2238"></a>
+<span class="sourceLineNo">2239</span>    region.delete(delete);<a name="line.2239"></a>
+<span class="sourceLineNo">2240</span><a name="line.2240"></a>
+<span class="sourceLineNo">2241</span>    // make sure we still see our data<a name="line.2241"></a>
+<span class="sourceLineNo">2242</span>    Get get = new Get(row).addColumn(fam, serverinfo);<a name="line.2242"></a>
+<span class="sourceLineNo">2243</span>    Result result = region.get(get);<a name="line.2243"></a>
+<span class="sourceLineNo">2244</span>    assertEquals(1, result.size());<a name="line.2244"></a>
+<span class="sourceLineNo">2245</span><a name="line.2245"></a>
+<span class="sourceLineNo">2246</span>    // delete the future row<a name="line.2246"></a>
+<span class="sourceLineNo">2247</span>    delete = new Delete(row, HConstants.LATEST_TIMESTAMP - 3);<a name="line.2247"></a>
+<span class="sourceLineNo">2248</span>    region.delete(delete);<a name="line.2248"></a>
+<span class="sourceLineNo">2249</span><a name="line.2249"></a>
+<span class="sourceLineNo">2250</span>    // make sure it is gone<a name="line.2250"></a>
+<span class="sourceLineNo">2251</span>    get = new Get(row).addColumn(fam, serverinfo);<a name="line.2251"></a>
+<span class="sourceLineNo">2252</span>    result = region.get(get);<a name="line.2252"></a>
+<span class="sourceLineNo">2253</span>    assertEquals(0, result.size());<a name="line.2253"></a>
+<span class="sourceLineNo">2254</span>  }<a name="line.2254"></a>
+<span class="sourceLineNo">2255</span><a name="line.2255"></a>
+<span class="sourceLineNo">2256</span>  /**<a name="line.2256"></a>
+<span class="sourceLineNo">2257</span>   * Tests that the special LATEST_TIMESTAMP option for puts gets replaced by<a name="line.2257"></a>
+<span class="sourceLineNo">2258</span>   * the actual timestamp<a name="line.2258"></a>
+<span class="sourceLineNo">2259</span>   */<a name="line.2259"></a>
+<span class="sourceLineNo">2260</span>  @Test<a name="line.2260"></a>
+<span class="sourceLineNo">2261</span>  public void testPutWithLatestTS() throws IOException {<a name="line.2261"></a>
+<span class="sourceLineNo">2262</span>    byte[] fam = Bytes.toBytes("info");<a name="line.2262"></a>
+<span class="sourceLineNo">2263</span>    byte[][] families = { fam };<a name="line.2263"></a>
+<span class="sourceLineNo">2264</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2264"></a>
+<span class="sourceLineNo">2265</span>    byte[] row = Bytes.toBytes("row1");<a name="line.2265"></a>
+<span class="sourceLineNo">2266</span>    // column names<a name="line.2266"></a>
+<span class="sourceLineNo">2267</span>    byte[] qual = Bytes.toBytes("qual");<a name="line.2267"></a>
+<span class="sourceLineNo">2268</span><a name="line.2268"></a>
+<span class="sourceLineNo">2269</span>    // add data with LATEST_TIMESTAMP, put without WAL<a name="line.2269"></a>
+<span class="sourceLineNo">2270</span>    Put put = new Put(row);<a name="line.2270"></a>
+<span class="sourceLineNo">2271</span>    put.addColumn(fam, qual, HConstants.LATEST_TIMESTAMP, Bytes.toBytes("value"));<a name="line.2271"></a>
+<span class="sourceLineNo">2272</span>    region.put(put);<a name="line.2272"></a>
+<span class="sourceLineNo">2273</span><a name="line.2273"></a>
+<span class="sourceLineNo">2274</span>    // Make sure it shows up with an actual timestamp<a name="line.2274"></a>
+<span class="sourceLineNo">2275</span>    Get get = new Get(row).addColumn(fam, qual);<a name="line.2275"></a>
+<span class="sourceLineNo">2276</span>    Result result = region.get(get);<a name="line.2276"></a>
+<span class="sourceLineNo">2277</span>    assertEquals(1, result.size());<a name="line.2277"></a>
+<span class="sourceLineNo">2278</span>    Cell kv = result.rawCells()[0];<a name="line.2278"></a>
+<span class="sourceLineNo">2279</span>    LOG.info("Got: " + kv);<a name="line.2279"></a>
+<span class="sourceLineNo">2280</span>    assertTrue("LATEST_TIMESTAMP was not replaced with real timestamp",<a name="line.2280"></a>
+<span class="sourceLineNo">2281</span>        kv.getTimestamp() != HConstants.LATEST_TIMESTAMP);<a name="line.2281"></a>
+<span class="sourceLineNo">2282</span><a name="line.2282"></a>
+<span class="sourceLineNo">2283</span>    // Check same with WAL enabled (historically these took different<a name="line.2283"></a>
+<span class="sourceLineNo">2284</span>    // code paths, so check both)<a name="line.2284"></a>
+<span class="sourceLineNo">2285</span>    row = Bytes.toBytes("row2");<a name="line.2285"></a>
+<span class="sourceLineNo">2286</span>    put = new Put(row);<a name="line.2286"></a>
+<span class="sourceLineNo">2287</span>    put.addColumn(fam, qual, HConstants.LATEST_TIMESTAMP, Bytes.toBytes("value"));<a name="line.2287"></a>
+<span class="sourceLineNo">2288</span>    region.put(put);<a name="line.2288"></a>
+<span class="sourceLineNo">2289</span><a name="line.2289"></a>
+<span class="sourceLineNo">2290</span>    // Make sure it shows up with an actual timestamp<a name="line.2290"></a>
+<span class="sourceLineNo">2291</span>    get = new Get(row).addColumn(fam, qual);<a name="line.2291"></a>
+<span class="sourceLineNo">2292</span>    result = region.get(get);<a name="line.2292"></a>
+<span class="sourceLineNo">2293</span>    assertEquals(1, result.size());<a name="line.2293"></a>
+<span class="sourceLineNo">2294</span>    kv = result.rawCells()[0];<a name="line.2294"></a>
+<span class="sourceLineNo">2295</span>    LOG.info("Got: " + kv);<a name="line.2295"></a>
+<span class="sourceLineNo">2296</span>    assertTrue("LATEST_TIMESTAMP was not replaced with real timestamp",<a name="line.2296"></a>
+<span class="sourceLineNo">2297</span>        kv.getTimestamp() != HConstants.LATEST_TIMESTAMP);<a name="line.2297"></a>
+<span class="sourceLineNo">2298</span>  }<a name="line.2298"></a>
+<span class="sourceLineNo">2299</span><a name="line.2299"></a>
+<span class="sourceLineNo">2300</span>  /**<a name="line.2300"></a>
+<span class="sourceLineNo">2301</span>   * Tests that there is server-side filtering for invalid timestamp upper<a name="line.2301"></a>
+<span class="sourceLineNo">2302</span>   * bound. Note that the timestamp lower bound is automatically handled for us<a name="line.2302"></a>
+<span class="sourceLineNo">2303</span>   * by the TTL field.<a name="line.2303"></a>
+<span class="sourceLineNo">2304</span>   */<a name="line.2304"></a>
+<span class="sourceLineNo">2305</span>  @Test<a name="line.2305"></a>
+<span class="sourceLineNo">2306</span>  public void testPutWithTsSlop() throws IOException {<a name="line.2306"></a>
+<span class="sourceLineNo">2307</span>    byte[] fam = Bytes.toBytes("info");<a name="line.2307"></a>
+<span class="sourceLineNo">2308</span>    byte[][] families = { fam };<a name="line.2308"></a>
+<span class="sourceLineNo">2309</span><a name="line.2309"></a>
+<span class="sourceLineNo">2310</span>    // add data with a timestamp that is too recent for range. Ensure assert<a name="line.2310"></a>
+<span class="sourceLineNo">2311</span>    CONF.setInt("hbase.hregion.keyvalue.timestamp.slop.millisecs", 1000);<a name="line.2311"></a>
+<span class="sourceLineNo">2312</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2312"></a>
+<span class="sourceLineNo">2313</span>    boolean caughtExcep = false;<a name="line.2313"></a>
+<span class="sourceLineNo">2314</span>    try {<a name="line.2314"></a>
+<span class="sourceLineNo">2315</span>      // no TS specified == use latest. should not error<a name="line.2315"></a>
+<span class="sourceLineNo">2316</span>      region.put(new Put(row).addColumn(fam, Bytes.toBytes("qual"), Bytes.toBytes("value")));<a name="line.2316"></a>
+<span class="sourceLineNo">2317</span>      // TS out of range. should error<a name="line.2317"></a>
+<span class="sourceLineNo">2318</span>      region.put(new Put(row).addColumn(fam, Bytes.toBytes("qual"),<a name="line.2318"></a>
+<span class="sourceLineNo">2319</span>          System.currentTimeMillis() + 2000, Bytes.toBytes("value")));<a name="line.2319"></a>
+<span class="sourceLineNo">2320</span>      fail("Expected IOE for TS out of configured timerange");<a name="line.2320"></a>
+<span class="sourceLineNo">2321</span>    } catch (FailedSanityCheckException ioe) {<a name="line.2321"></a>
+<span class="sourceLineNo">2322</span>      LOG.debug("Received expected exception", ioe);<a name="line.2322"></a>
+<span class="sourceLineNo">2323</span>      caughtExcep = true;<a name="line.2323"></a>
+<span class="sourceLineNo">2324</span>    }<a name="line.2324"></a>
+<span class="sourceLineNo">2325</span>    assertTrue("Should catch FailedSanityCheckException", caughtExcep);<a name="line.2325"></a>
+<span class="sourceLineNo">2326</span>  }<a name="line.2326"></a>
+<span class="sourceLineNo">2327</span><a name="line.2327"></a>
+<span class="sourceLineNo">2328</span>  @Test<a name="line.2328"></a>
+<span class="sourceLineNo">2329</span>  public void testScanner_DeleteOneFamilyNotAnother() throws IOException {<a name="line.2329"></a>
+<span class="sourceLineNo">2330</span>    byte[] fam1 = Bytes.toBytes("columnA");<a name="line.2330"></a>
+<span class="sourceLineNo">2331</span>    byte[] fam2 = Bytes.toBytes("columnB");<a name="line.2331"></a>
+<span class="sourceLineNo">2332</span>    this.region = initHRegion(tableName, method, CONF, fam1, fam2);<a name="line.2332"></a>
+<span class="sourceLineNo">2333</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.2333"></a>
+<span class="sourceLineNo">2334</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.2334"></a>
+<span class="sourceLineNo">2335</span><a name="line.2335"></a>
+<span class="sourceLineNo">2336</span>    byte[] value = Bytes.toBytes("value");<a name="line.2336"></a>
+<span class="sourceLineNo">2337</span><a name="line.2337"></a>
+<span class="sourceLineNo">2338</span>    Delete delete = new Delete(rowA);<a name="line.2338"></a>
+<span class="sourceLineNo">2339</span>    delete.addFamily(fam1);<a name="line.2339"></a>
+<span class="sourceLineNo">2340</span><a name="line.2340"></a>
+<span class="sourceLineNo">2341</span>    region.delete(delete);<a name="line.2341"></a>
+<span class="sourceLineNo">2342</span><a name="line.2342"></a>
+<span class="sourceLineNo">2343</span>    // now create data.<a name="line.2343"></a>
+<span class="sourceLineNo">2344</span>    Put put = new Put(rowA);<a name="line.2344"></a>
+<span class="sourceLineNo">2345</span>    put.addColumn(fam2, null, value);<a name="line.2345"></a>
+<span class="sourceLineNo">2346</span>    region.put(put);<a name="line.2346"></a>
+<span class="sourceLineNo">2347</span><a name="line.2347"></a>
+<span class="sourceLineNo">2348</span>    put = new Put(rowB);<a name="line.2348"></a>
+<span class="sourceLineNo">2349</span>    put.addColumn(fam1, null, value);<a name="line.2349"></a>
+<span class="sourceLineNo">2350</span>    put.addColumn(fam2, null, value);<a name="line.2350"></a>
+<span class="sourceLineNo">2351</span>    region.put(put);<a name="line.2351"></a>
+<span class="sourceLineNo">2352</span><a name="line.2352"></a>
+<span class="sourceLineNo">2353</span>    Scan scan = new Scan();<a name="line.2353"></a>
+<span class="sourceLineNo">2354</span>    scan.addFamily(fam1).addFamily(fam2);<a name="line.2354"></a>
+<span class="sourceLineNo">2355</span>    InternalScanner s = region.getScanner(scan);<a name="line.2355"></a>
+<span class="sourceLineNo">2356</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.2356"></a>
+<span class="sourceLineNo">2357</span>    s.next(results);<a name="line.2357"></a>
+<span class="sourceLineNo">2358</span>    assertTrue(CellUtil.matchingRows(results.get(0), rowA));<a name="line.2358"></a>
+<span class="sourceLineNo">2359</span><a name="line.2359"></a>
+<span class="sourceLineNo">2360</span>    results.clear();<a name="line.2360"></a>
+<span class="sourceLineNo">2361</span>    s.next(results);<a name="line.2361"></a>
+<span class="sourceLineNo">2362</span>    assertTrue(CellUtil.matchingRows(results.get(0), rowB));<a name="line.2362"></a>
+<span class="sourceLineNo">2363</span>  }<a name="line.2363"></a>
+<span class="sourceLineNo">2364</span><a name="line.2364"></a>
+<span class="sourceLineNo">2365</span>  @Test<a name="line.2365"></a>
+<span class="sourceLineNo">2366</span>  public void testDataInMemoryWithoutWAL() throws IOException {<a name="line.2366"></a>
+<span class="sourceLineNo">2367</span>    FileSystem fs = FileSystem.get(CONF);<a name="line.2367"></a>
+<span class="sourceLineNo">2368</span>    Path rootDir = new Path(dir + "testDataInMemoryWithoutWAL");<a name="line.2368"></a>
+<span class="sourceLineNo">2369</span>    FSHLog hLog = new FSHLog(fs, rootDir, "testDataInMemoryWithoutWAL", CONF);<a name="line.2369"></a>
+<span class="sourceLineNo">2370</span>    hLog.init();<a name="line.2370"></a>
+<span class="sourceLineNo">2371</span>    // This chunk creation is done throughout the code base. Do we want to move it into core?<a name="line.2371"></a>
+<span class="sourceLineNo">2372</span>    // It is missing from this test. W/o it we NPE.<a name="line.2372"></a>
+<span class="sourceLineNo">2373</span>    ChunkCreator.initialize(MemStoreLABImpl.CHUNK_SIZE_DEFAULT, false, 0, 0, 0, null);<a name="line.2373"></a>
+<span class="sourceLineNo">2374</span>    region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, hLog,<a name="line.2374"></a>
+<span class="sourceLineNo">2375</span>        COLUMN_FAMILY_BYTES);<a name="line.2375"></a>
+<span class="sourceLineNo">2376</span><a name="line.2376"></a>
+<span class="sourceLineNo">2377</span>    Cell originalCell = CellUtil.createCell(row, COLUMN_FAMILY_BYTES, qual1,<a name="line.2377"></a>
+<span class="sourceLineNo">2378</span>      System.currentTimeMillis(), KeyValue.Type.Put.getCode(), value1);<a name="line.2378"></a>
+<span class="sourceLineNo">2379</span>    final long originalSize = originalCell.getSerializedSize();<a name="line.2379"></a>
+<span class="sourceLineNo">2380</span><a name="line.2380"></a>
+<span class="sourceLineNo">2381</span>    Cell addCell = CellUtil.createCell(row, COLUMN_FAMILY_BYTES, qual1,<a name="line.2381"></a>
+<span class="sourceLineNo">2382</span>      System.currentTimeMillis(), KeyValue.Type.Put.getCode(), Bytes.toBytes("xxxxxxxxxx"));<a name="line.2382"></a>
+<span class="sourceLineNo">2383</span>    final long addSize = addCell.getSerializedSize();<a name="line.2383"></a>
+<span class="sourceLineNo">2384</span><a name="line.2384"></a>
+<span class="sourceLineNo">2385</span>    LOG.info("originalSize:" + originalSize<a name="line.2385"></a>
+<span class="sourceLineNo">2386</span>      + ", addSize:" + addSize);<a name="line.2386"></a>
+<span class="sourceLineNo">2387</span>    // start test. We expect that the addPut's durability will be replaced<a name="line.2387"></a>
+<span class="sourceLineNo">2388</span>    // by originalPut's durability.<a name="line.2388"></a>
+<span class="sourceLineNo">2389</span><a name="line.2389"></a>
+<span class="sourceLineNo">2390</span>    // case 1:<a name="line.2390"></a>
+<span class="sourceLineNo">2391</span>    testDataInMemoryWithoutWAL(region,<a name="line.2391"></a>
+<span class="sourceLineNo">2392</span>            new Put(row).add(originalCell).setDurability(Durability.SKIP_WAL),<a name="line.2392"></a>
+<span class="sourceLineNo">2393</span>            new Put(row).add(addCell).setDurability(Durability.SKIP_WAL),<a name="line.2393"></a>
+<span class="sourceLineNo">2394</span>            originalSize + addSize);<a name="line.2394"></a>
+<span class="sourceLineNo">2395</span><a name="line.2395"></a>
+<span class="sourceLineNo">2396</span>    // case 2:<a name="line.2396"></a>
+<span class="sourceLineNo">2397</span>    testDataInMemoryWithoutWAL(region,<a name="line.2397"></a>
+<span class="sourceLineNo">2398</span>            new Put(row).add(originalCell).setDurability(Durability.SKIP_WAL),<a name="line.2398"></a>
+<span class="sourceLineNo">2399</span>            new Put(row).add(addCell).setDurability(Durability.SYNC_WAL),<a name="line.2399"></a>
+<span class="sourceLineNo">2400</span>            originalSize + addSize);<a name="line.2400"></a>
+<span class="sourceLineNo">2401</span><a name="line.2401"></a>
+<span class="sourceLineNo">2402</span>    // case 3:<a name="line.2402"></a>
+<span class="sourceLineNo">2403</span>    testDataInMemoryWithoutWAL(region,<a name="line.2403"></a>
+<span class="sourceLineNo">2404</span>            new Put(row).add(originalCell).setDurability(Durability.SYNC_WAL),<a name="line.2404"></a>
+<span class="sourceLineNo">2405</span>            new Put(row).add(addCell).setDurability(Durability.SKIP_WAL),<a name="line.2405"></a>
+<span class="sourceLineNo">2406</span>            0);<a name="line.2406"></a>
+<span class="sourceLineNo">2407</span><a name="line.2407"></a>
+<span class="sourceLineNo">2408</span>    // case 4:<a name="line.2408"></a>
+<span class="sourceLineNo">2409</span>    testDataInMemoryWithoutWAL(region,<a name="line.2409"></a>
+<span class="sourceLineNo">2410</span>            new Put(row).add(originalCell).setDurability(Durability.SYNC_WAL),<a name="line.2410"></a>
+<span class="sourceLineNo">2411</span>            new Put(row).add(addCell).setDurability(Durability.SYNC_WAL),<a name="line.2411"></a>
+<span class="sourceLineNo">2412</span>            0);<a name="line.2412"></a>
+<span class="sourceLineNo">2413</span>  }<a name="line.2413"></a>
+<span class="sourceLineNo">2414</span><a name="line.2414"></a>
+<span class="sourceLineNo">2415</span>  private static void testDataInMemoryWithoutWAL(HRegion region, Put originalPut,<a name="line.2415"></a>
+<span class="sourceLineNo">2416</span>          final Put addPut, long delta) throws IOException {<a name="line.2416"></a>
+<span class="sourceLineNo">2417</span>    final long initSize = region.getDataInMemoryWithoutWAL();<a name="line.2417"></a>
+<span class="sourceLineNo">2418</span>    // save normalCPHost and replaced by mockedCPHost<a name="line.2418"></a>
+<span class="sourceLineNo">2419</span>    RegionCoprocessorHost normalCPHost = region.getCoprocessorHost();<a name="line.2419"></a>
+<span class="sourceLineNo">2420</span>    RegionCoprocessorHost mockedCPHost = Mockito.mock(RegionCoprocessorHost.class);<a name="line.2420"></a>
+<span class="sourceLineNo">2421</span>    // Because the preBatchMutate returns void, we can't do usual Mockito when...then form. Must<a name="line.2421"></a>
+<span class="sourceLineNo">2422</span>    // do below format (from Mockito doc).<a name="line.2422"></a>
+<span class="sourceLineNo">2423</span>    Mockito.doAnswer(new Answer&lt;Void&gt;() {<a name="line.2423"></a>
+<span class="sourceLineNo">2424</span>      @Override<a name="line.2424"></a>
+<span class="sourceLineNo">2425</span>      public Void answer(InvocationOnMock invocation) throws Throwable {<a name="line.2425"></a>
+<span class="sourceLineNo">2426</span>        MiniBatchOperationInProgress&lt;Mutation&gt; mb = invocation.getArgument(0);<a name="line.2426"></a>
+<span class="sourceLineNo">2427</span>        mb.addOperationsFromCP(0, new Mutation[]{addPut});<a name="line.2427"></a>
+<span class="sourceLineNo">2428</span>        return null;<a name="line.2428"></a>
+<span class="sourceLineNo">2429</span>      }<a name="line.2429"></a>
+<span class="sourceLineNo">2430</span>    }).when(mockedCPHost).preBatchMutate(Mockito.isA(MiniBatchOperationInProgress.class));<a name="line.2430"></a>
+<span class="sourceLineNo">2431</span>    ColumnFamilyDescriptorBuilder builder = ColumnFamilyDescriptorBuilder.<a name="line.2431"></a>
+<span class="sourceLineNo">2432</span>        newBuilder(COLUMN_FAMILY_BYTES);<a name="line.2432"></a>
+<span class="sourceLineNo">2433</span>    ScanInfo info = new ScanInfo(CONF, builder.build(), Long.MAX_VALUE,<a name="line.2433"></a>
+<span class="sourceLineNo">2434</span>        Long.MAX_VALUE, region.getCellComparator());<a name="line.2434"></a>
+<span class="sourceLineNo">2435</span>    Mockito.when(mockedCPHost.preFlushScannerOpen(Mockito.any(HStore.class),<a name="line.2435"></a>
+<span class="sourceLineNo">2436</span>        Mockito.any())).thenReturn(info);<a name="line.2436"></a>
+<span class="sourceLineNo">2437</span>    Mockito.when(mockedCPHost.preFlush(Mockito.any(), Mockito.any(StoreScanner.class),<a name="line.2437"></a>
+<span class="sourceLineNo">2438</span>        Mockito.any())).thenAnswer(i -&gt; i.getArgument(1));<a name="line.2438"></a>
+<span class="sourceLineNo">2439</span>    region.setCoprocessorHost(mockedCPHost);<a name="line.2439"></a>
+<span class="sourceLineNo">2440</span><a name="line.2440"></a>
+<span class="sourceLineNo">2441</span>    region.put(originalPut);<a name="line.2441"></a>
+<span class="sourceLineNo">2442</span>    region.setCoprocessorHost(normalCPHost);<a name="line.2442"></a>
+<span class="sourceLineNo">2443</span>    final long finalSize = region.getDataInMemoryWithoutWAL();<a name="line.2443"></a>
+<span class="sourceLineNo">2444</span>    assertEquals("finalSize:" + finalSize + ", initSize:"<a name="line.2444"></a>
+<span class="sourceLineNo">2445</span>      + initSize + ", delta:" + delta,finalSize, initSize + delta);<a name="line.2445"></a>
+<span class="sourceLineNo">2446</span>  }<a name="line.2446"></a>
+<span class="sourceLineNo">2447</span><a name="line.2447"></a>
+<span class="sourceLineNo">2448</span>  @Test<a name="line.2448"></a>
+<span class="sourceLineNo">2449</span>  public void testDeleteColumns_PostInsert() throws IOException, InterruptedException {<a name="line.2449"></a>
+<span class="sourceLineNo">2450</span>    Delete delete = new Delete(row);<a name="line.2450"></a>
+<span class="sourceLineNo">2451</span>    delete.addColumns(fam1, qual1);<a name="line.2451"></a>
+<span class="sourceLineNo">2452</span>    doTestDelete_AndPostInsert(delete);<a name="line.2452"></a>
+<span class="sourceLineNo">2453</span>  }<a name="line.2453"></a>
+<span class="sourceLineNo">2454</span><a name="line.2454"></a>
+<span class="sourceLineNo">2455</span>  @Test<a name="line.2455"></a>
+<span class="sourceLineNo">2456</span>  public void testaddFamily_PostInsert() throws IOException, InterruptedException {<a name="line.2456"></a>
+<span class="sourceLineNo">2457</span>    Delete delete = new Delete(row);<a name="line.2457"></a>
+<span class="sourceLineNo">2458</span>    delete.addFamily(fam1);<a name="line.2458"></a>
+<span class="sourceLineNo">2459</span>    doTestDelete_AndPostInsert(delete);<a name="line.2459"></a>
+<span class="sourceLineNo">2460</span>  }<a name="line.2460"></a>
 <span class="sourceLineNo">2461</span><a name="line.2461"></a>
-<span class="sourceLineNo">2462</span>    // ok put data:<a name="line.2462"></a>
-<span class="sourceLineNo">2463</span>    put = new Put(row);<a name="line.2463"></a>
-<span class="sourceLineNo">2464</span>    put.addColumn(fam1, qual1, value2);<a name="line.2464"></a>
-<span class="sourceLineNo">2465</span>    region.put(put);<a name="line.2465"></a>
-<span class="sourceLineNo">2466</span><a name="line.2466"></a>
-<span class="sourceLineNo">2467</span>    // ok get:<a name="line.2467"></a>
-<span class="sourceLineNo">2468</span>    Get get = new Get(row);<a name="line.2468"></a>
-<span class="sourceLineNo">2469</span>    get.addColumn(fam1, qual1);<a name="line.2469"></a>
-<span class="sourceLineNo">2470</span><a name="line.2470"></a>
-<span class="sourceLineNo">2471</span>    Result r = region.get(get);<a name="line.2471"></a>
-<span class="sourceLineNo">2472</span>    assertEquals(1, r.size());<a name="line.2472"></a>
-<span class="sourceLineNo">2473</span>    assertArrayEquals(value2, r.getValue(fam1, qual1));<a name="line.2473"></a>
-<span class="sourceLineNo">2474</span><a name="line.2474"></a>
-<span class="sourceLineNo">2475</span>    // next:<a name="line.2475"></a>
-<span class="sourceLineNo">2476</span>    Scan scan = new Scan(row);<a name="line.2476"></a>
-<span class="sourceLineNo">2477</span>    scan.addColumn(fam1, qual1);<a name="line.2477"></a>
-<span class="sourceLineNo">2478</span>    InternalScanner s = region.getScanner(scan);<a name="line.2478"></a>
-<span class="sourceLineNo">2479</span><a name="line.2479"></a>
-<span class="sourceLineNo">2480</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.2480"></a>
-<span class="sourceLineNo">2481</span>    assertEquals(false, s.next(results));<a name="line.2481"></a>
-<span class="sourceLineNo">2482</span>    assertEquals(1, results.size());<a name="line.2482"></a>
-<span class="sourceLineNo">2483</span>    Cell kv = results.get(0);<a name="line.2483"></a>
+<span class="sourceLineNo">2462</span>  public void doTestDelete_AndPostInsert(Delete delete) throws IOException, InterruptedException {<a name="line.2462"></a>
+<span class="sourceLineNo">2463</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2463"></a>
+<span class="sourceLineNo">2464</span>    EnvironmentEdgeManagerTestHelper.injectEdge(new IncrementingEnvironmentEdge());<a name="line.2464"></a>
+<span class="sourceLineNo">2465</span>    Put put = new Put(row);<a name="line.2465"></a>
+<span class="sourceLineNo">2466</span>    put.addColumn(fam1, qual1, value1);<a name="line.2466"></a>
+<span class="sourceLineNo">2467</span>    region.put(put);<a name="line.2467"></a>
+<span class="sourceLineNo">2468</span><a name="line.2468"></a>
+<span class="sourceLineNo">2469</span>    // now delete the value:<a name="line.2469"></a>
+<span class="sourceLineNo">2470</span>    region.delete(delete);<a name="line.2470"></a>
+<span class="sourceLineNo">2471</span><a name="line.2471"></a>
+<span class="sourceLineNo">2472</span>    // ok put data:<a name="line.2472"></a>
+<span class="sourceLineNo">2473</span>    put = new Put(row);<a name="line.2473"></a>
+<span class="sourceLineNo">2474</span>    put.addColumn(fam1, qual1, value2);<a name="line.2474"></a>
+<span class="sourceLineNo">2475</span>    region.put(put);<a name="line.2475"></a>
+<span class="sourceLineNo">2476</span><a name="line.2476"></a>
+<span class="sourceLineNo">2477</span>    // ok get:<a name="line.2477"></a>
+<span class="sourceLineNo">2478</span>    Get get = new Get(row);<a name="line.2478"></a>
+<span class="sourceLineNo">2479</span>    get.addColumn(fam1, qual1);<a name="line.2479"></a>
+<span class="sourceLineNo">2480</span><a name="line.2480"></a>
+<span class="sourceLineNo">2481</span>    Result r = region.get(get);<a name="line.2481"></a>
+<span class="sourceLineNo">2482</span>    assertEquals(1, r.size());<a name="line.2482"></a>
+<span class="sourceLineNo">2483</span>    assertArrayEquals(value2, r.getValue(fam1, qual1));<a name="line.2483"></a>
 <span class="sourceLineNo">2484</span><a name="line.2484"></a>
-<span class="sourceLineNo">2485</span>    assertArrayEquals(value2, CellUtil.cloneValue(kv));<a name="line.2485"></a>
-<span class="sourceLineNo">2486</span>    assertArrayEquals(fam1, CellUtil.cloneFamily(kv));<a name="line.2486"></a>
-<span class="sourceLineNo">2487</span>    assertArrayEquals(qual1, CellUtil.cloneQualifier(kv));<a name="line.2487"></a>
-<span class="sourceLineNo">2488</span>    assertArrayEquals(row, CellUtil.cloneRow(kv));<a name="line.2488"></a>
-<span class="sourceLineNo">2489</span>  }<a name="line.2489"></a>
-<span class="sourceLineNo">2490</span><a name="line.2490"></a>
-<span class="sourceLineNo">2491</span>  @Test<a name="line.2491"></a>
-<span class="sourceLineNo">2492</span>  public void testDelete_CheckTimestampUpdated() throws IOException {<a name="line.2492"></a>
-<span class="sourceLineNo">2493</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2493"></a>
-<span class="sourceLineNo">2494</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.2494"></a>
-<span class="sourceLineNo">2495</span>    byte[] col2 = Bytes.toBytes("col2");<a name="line.2495"></a>
-<span class="sourceLineNo">2496</span>    byte[] col3 = Bytes.toBytes("col3");<a name="line.2496"></a>
-<span class="sourceLineNo">2497</span><a name="line.2497"></a>
-<span class="sourceLineNo">2498</span>    // Setting up region<a name="line.2498"></a>
-<span class="sourceLineNo">2499</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2499"></a>
-<span class="sourceLineNo">2500</span>    // Building checkerList<a name="line.2500"></a>
-<span class="sourceLineNo">2501</span>    List&lt;Cell&gt; kvs = new ArrayList&lt;&gt;();<a name="line.2501"></a>
-<span class="sourceLineNo">2502</span>    kvs.add(new KeyValue(row1, fam1, col1, null));<a name="line.2502"></a>
-<span class="sourceLineNo">2503</span>    kvs.add(new KeyValue(row1, fam1, col2, null));<a name="line.2503"></a>
-<span class="sourceLineNo">2504</span>    kvs.add(new KeyValue(row1, fam1, col3, null));<a name="line.2504"></a>
-<span class="sourceLineNo">2505</span><a name="line.2505"></a>
-<span class="sourceLineNo">2506</span>    NavigableMap&lt;byte[], List&lt;Cell&gt;&gt; deleteMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2506"></a>
-<span class="sourceLineNo">2507</span>    deleteMap.put(fam1, kvs);<a name="line.2507"></a>
-<span class="sourceLineNo">2508</span>    region.delete(deleteMap, Durability.SYNC_WAL);<a name="line.2508"></a>
-<span class="sourceLineNo">2509</span><a name="line.2509"></a>
-<span class="sourceLineNo">2510</span>    // extract the key values out the memstore:<a name="line.2510"></a>
-<span class="sourceLineNo">2511</span>    // This is kinda hacky, but better than nothing...<a name="line.2511"></a>
-<span class="sourceLineNo">2512</span>    long now = System.currentTimeMillis();<a name="line.2512"></a>
-<span class="sourceLineNo">2513</span>    AbstractMemStore memstore = (AbstractMemStore)region.getStore(fam1).memstore;<a name="line.2513"></a>
-<span class="sourceLineNo">2514</span>    Cell firstCell = memstore.getActive().first();<a name="line.2514"></a>
-<span class="sourceLineNo">2515</span>    assertTrue(firstCell.getTimestamp() &lt;= now);<a name="line.2515"></a>
-<span class="sourceLineNo">2516</span>    now = firstCell.getTimestamp();<a name="line.2516"></a>
-<span class="sourceLineNo">2517</span>    for (Cell cell : memstore.getActive().getCellSet()) {<a name="line.2517"></a>
-<span class="sourceLineNo">2518</span>      assertTrue(cell.getTimestamp() &lt;= now);<a name="line.2518"></a>
-<span class="sourceLineNo">2519</span>      now = cell.getTimestamp();<a name="line.2519"></a>
-<span class="sourceLineNo">2520</span>    }<a name="line.2520"></a>
-<span class="sourceLineNo">2521</span>  }<a name="line.2521"></a>
-<span class="sourceLineNo">2522</span><a name="line.2522"></a>
-<span class="sourceLineNo">2523</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2523"></a>
-<span class="sourceLineNo">2524</span>  // Get tests<a name="line.2524"></a>
-<span class="sourceLineNo">2525</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2525"></a>
-<span class="sourceLineNo">2526</span>  @Test<a name="line.2526"></a>
-<span class="sourceLineNo">2527</span>  public void testGet_FamilyChecker() throws IOException {<a name="line.2527"></a>
-<span class="sourceLineNo">2528</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2528"></a>
-<span class="sourceLineNo">2529</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2529"></a>
-<span class="sourceLineNo">2530</span>    byte[] fam2 = Bytes.toBytes("False");<a name="line.2530"></a>
-<span class="sourceLineNo">2531</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.2531"></a>
+<span class="sourceLineNo">2485</span>    // next:<a name="line.2485"></a>
+<span class="sourceLineNo">2486</span>    Scan scan = new Scan(row);<a name="line.2486"></a>
+<span class="sourceLineNo">2487</span>    scan.addColumn(fam1, qual1);<a name="line.2487"></a>
+<span class="sourceLineNo">2488</span>    InternalScanner s = region.getScanner(scan);<a name="line.2488"></a>
+<span class="sourceLineNo">2489</span><a name="line.2489"></a>
+<span class="sourceLineNo">2490</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.2490"></a>
+<span class="sourceLineNo">2491</span>    assertEquals(false, s.next(results));<a name="line.2491"></a>
+<span class="sourceLineNo">2492</span>    assertEquals(1, results.size());<a name="line.2492"></a>
+<span class="sourceLineNo">2493</span>    Cell kv = results.get(0);<a name="line.2493"></a>
+<span class="sourceLineNo">2494</span><a name="line.2494"></a>
+<span class="sourceLineNo">2495</span>    assertArrayEquals(value2, CellUtil.cloneValue(kv));<a name="line.2495"></a>
+<span class="sourceLineNo">2496</span>    assertArrayEquals(fam1, CellUtil.cloneFamily(kv));<a name="line.2496"></a>
+<span class="sourceLineNo">2497</span>    assertArrayEquals(qual1, CellUtil.cloneQualifier(kv));<a name="line.2497"></a>
+<span class="sourceLineNo">2498</span>    assertArrayEquals(row, CellUtil.cloneRow(kv));<a name="line.2498"></a>
+<span class="sourceLineNo">2499</span>  }<a name="line.2499"></a>
+<span class="sourceLineNo">2500</span><a name="line.2500"></a>
+<span class="sourceLineNo">2501</span>  @Test<a name="line.2501"></a>
+<span class="sourceLineNo">2502</span>  public void testDelete_CheckTimestampUpdated() throws IOException {<a name="line.2502"></a>
+<span class="sourceLineNo">2503</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2503"></a>
+<span class="sourceLineNo">2504</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.2504"></a>
+<span class="sourceLineNo">2505</span>    byte[] col2 = Bytes.toBytes("col2");<a name="line.2505"></a>
+<span class="sourceLineNo">2506</span>    byte[] col3 = Bytes.toBytes("col3");<a name="line.2506"></a>
+<span class="sourceLineNo">2507</span><a name="line.2507"></a>
+<span class="sourceLineNo">2508</span>    // Setting up region<a name="line.2508"></a>
+<span class="sourceLineNo">2509</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2509"></a>
+<span class="sourceLineNo">2510</span>    // Building checkerList<a name="line.2510"></a>
+<span class="sourceLineNo">2511</span>    List&lt;Cell&gt; kvs = new ArrayList&lt;&gt;();<a name="line.2511"></a>
+<span class="sourceLineNo">2512</span>    kvs.add(new KeyValue(row1, fam1, col1, null));<a name="line.2512"></a>
+<span class="sourceLineNo">2513</span>    kvs.add(new KeyValue(row1, fam1, col2, null));<a name="line.2513"></a>
+<span class="sourceLineNo">2514</span>    kvs.add(new KeyValue(row1, fam1, col3, null));<a name="line.2514"></a>
+<span class="sourceLineNo">2515</span><a name="line.2515"></a>
+<span class="sourceLineNo">2516</span>    NavigableMap&lt;byte[], List&lt;Cell&gt;&gt; deleteMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2516"></a>
+<span class="sourceLineNo">2517</span>    deleteMap.put(fam1, kvs);<a name="line.2517"></a>
+<span class="sourceLineNo">2518</span>    region.delete(deleteMap, Durability.SYNC_WAL);<a name="line.2518"></a>
+<span class="sourceLineNo">2519</span><a name="line.2519"></a>
+<span class="sourceLineNo">2520</span>    // extract the key values out the memstore:<a name="line.2520"></a>
+<span class="sourceLineNo">2521</span>    // This is kinda hacky, but better than nothing...<a name="line.2521"></a>
+<span class="sourceLineNo">2522</span>    long now = System.currentTimeMillis();<a name="line.2522"></a>
+<span class="sourceLineNo">2523</span>    AbstractMemStore memstore = (AbstractMemStore)region.getStore(fam1).memstore;<a name="line.2523"></a>
+<span class="sourceLineNo">2524</span>    Cell firstCell = memstore.getActive().first();<a name="line.2524"></a>
+<span class="sourceLineNo">2525</span>    assertTrue(firstCell.getTimestamp() &lt;= now);<a name="line.2525"></a>
+<span class="sourceLineNo">2526</span>    now = firstCell.getTimestamp();<a name="line.2526"></a>
+<span class="sourceLineNo">2527</span>    for (Cell cell : memstore.getActive().getCellSet()) {<a name="line.2527"></a>
+<span class="sourceLineNo">2528</span>      assertTrue(cell.getTimestamp() &lt;= now);<a name="line.2528"></a>
+<span class="sourceLineNo">2529</span>      now = cell.getTimestamp();<a name="line.2529"></a>
+<span class="sourceLineNo">2530</span>    }<a name="line.2530"></a>
+<span class="sourceLineNo">2531</span>  }<a name="line.2531"></a>
 <span class="sourceLineNo">2532</span><a name="line.2532"></a>
-<span class="sourceLineNo">2533</span>    // Setting up region<a name="line.2533"></a>
-<span class="sourceLineNo">2534</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2534"></a>
-<span class="sourceLineNo">2535</span>    Get get = new Get(row1);<a name="line.2535"></a>
-<span class="sourceLineNo">2536</span>    get.addColumn(fam2, col1);<a name="line.2536"></a>
-<span class="sourceLineNo">2537</span><a name="line.2537"></a>
-<span class="sourceLineNo">2538</span>    // Test<a name="line.2538"></a>
-<span class="sourceLineNo">2539</span>    try {<a name="line.2539"></a>
-<span class="sourceLineNo">2540</span>      region.get(get);<a name="line.2540"></a>
-<span class="sourceLineNo">2541</span>      fail("Expecting DoNotRetryIOException in get but did not get any");<a name="line.2541"></a>
-<span class="sourceLineNo">2542</span>    } catch (org.apache.hadoop.hbase.DoNotRetryIOException e) {<a name="line.2542"></a>
-<span class="sourceLineNo">2543</span>      LOG.info("Got expected DoNotRetryIOException successfully");<a name="line.2543"></a>
-<span class="sourceLineNo">2544</span>    }<a name="line.2544"></a>
-<span class="sourceLineNo">2545</span>  }<a name="line.2545"></a>
-<span class="sourceLineNo">2546</span><a name="line.2546"></a>
-<span class="sourceLineNo">2547</span>  @Test<a name="line.2547"></a>
-<span class="sourceLineNo">2548</span>  public void testGet_Basic() throws IOException {<a name="line.2548"></a>
-<span class="sourceLineNo">2549</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2549"></a>
-<span class="sourceLineNo">2550</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2550"></a>
-<span class="sourceLineNo">2551</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.2551"></a>
-<span class="sourceLineNo">2552</span>    byte[] col2 = Bytes.toBytes("col2");<a name="line.2552"></a>
-<span class="sourceLineNo">2553</span>    byte[] col3 = Bytes.toBytes("col3");<a name="line.2553"></a>
-<span class="sourceLineNo">2554</span>    byte[] col4 = Bytes.toBytes("col4");<a name="line.2554"></a>
-<span class="sourceLineNo">2555</span>    byte[] col5 = Bytes.toBytes("col5");<a name="line.2555"></a>
+<span class="sourceLineNo">2533</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2533"></a>
+<span class="sourceLineNo">2534</span>  // Get tests<a name="line.2534"></a>
+<span class="sourceLineNo">2535</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2535"></a>
+<span class="sourceLineNo">2536</span>  @Test<a name="line.2536"></a>
+<span class="sourceLineNo">2537</span>  public void testGet_FamilyChecker() throws IOException {<a name="line.2537"></a>
+<span class="sourceLineNo">2538</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2538"></a>
+<span class="sourceLineNo">2539</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2539"></a>
+<span class="sourceLineNo">2540</span>    byte[] fam2 = Bytes.toBytes("False");<a name="line.2540"></a>
+<span class="sourceLineNo">2541</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.2541"></a>
+<span class="sourceLineNo">2542</span><a name="line.2542"></a>
+<span class="sourceLineNo">2543</span>    // Setting up region<a name="line.2543"></a>
+<span class="sourceLineNo">2544</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2544"></a>
+<span class="sourceLineNo">2545</span>    Get get = new Get(row1);<a name="line.2545"></a>
+<span class="sourceLineNo">2546</span>    get.addColumn(fam2, col1);<a name="line.2546"></a>
+<span class="sourceLineNo">2547</span><a name="line.2547"></a>
+<span class="sourceLineNo">2548</span>    // Test<a name="line.2548"></a>
+<span class="sourceLineNo">2549</span>    try {<a name="line.2549"></a>
+<span class="sourceLineNo">2550</span>      region.get(get);<a name="line.2550"></a>
+<span class="sourceLineNo">2551</span>      fail("Expecting DoNotRetryIOException in get but did not get any");<a name="line.2551"></a>
+<span class="sourceLineNo">2552</span>    } catch (org.apache.hadoop.hbase.DoNotRetryIOException e) {<a name="line.2552"></a>
+<span class="sourceLineNo">2553</span>      LOG.info("Got expected DoNotRetryIOException successfully");<a name="line.2553"></a>
+<span class="sourceLineNo">2554</span>    }<a name="line.2554"></a>
+<span class="sourceLineNo">2555</span>  }<a name="line.2555"></a>
 <span class="sourceLineNo">2556</span><a name="line.2556"></a>
-<span class="sourceLineNo">2557</span>    // Setting up region<a name="line.2557"></a>
-<span class="sourceLineNo">2558</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2558"></a>
-<span class="sourceLineNo">2559</span>    // Add to memstore<a name="line.2559"></a>
-<span class="sourceLineNo">2560</span>    Put put = new Put(row1);<a name="line.2560"></a>
-<span class="sourceLineNo">2561</span>    put.addColumn(fam1, col1, null);<a name="line.2561"></a>
-<span class="sourceLineNo">2562</span>    put.addColumn(fam1, col2, null);<a name="line.2562"></a>
-<span class="sourceLineNo">2563</span>    put.addColumn(fam1, col3, null);<a name="line.2563"></a>
-<span class="sourceLineNo">2564</span>    put.addColumn(fam1, col4, null);<a name="line.2564"></a>
-<span class="sourceLineNo">2565</span>    put.addColumn(fam1, col5, null);<a name="line.2565"></a>
-<span class="sourceLineNo">2566</span>    region.put(put);<a name="line.2566"></a>
-<span class="sourceLineNo">2567</span><a name="line.2567"></a>
-<span class="sourceLineNo">2568</span>    Get get = new Get(row1);<a name="line.2568"></a>
-<span class="sourceLineNo">2569</span>    get.addColumn(fam1, col2);<a name="line.2569"></a>
-<span class="sourceLineNo">2570</span>    get.addColumn(fam1, col4);<a name="line.2570"></a>
-<span class="sourceLineNo">2571</span>    // Expected result<a name="line.2571"></a>
-<span class="sourceLineNo">2572</span>    KeyValue kv1 = new KeyValue(row1, fam1, col2);<a name="line.2572"></a>
-<span class="sourceLineNo">2573</span>    KeyValue kv2 = new KeyValue(row1, fam1, col4);<a name="line.2573"></a>
-<span class="sourceLineNo">2574</span>    KeyValue[] expected = { kv1, kv2 };<a name="line.2574"></a>
-<span class="sourceLineNo">2575</span><a name="line.2575"></a>
-<span class="sourceLineNo">2576</span>    // Test<a name="line.2576"></a>
-<span class="sourceLineNo">2577</span>    Result res = region.get(get);<a name="line.2577"></a>
-<span class="sourceLineNo">2578</span>    assertEquals(expected.length, res.size());<a name="line.2578"></a>
-<span class="sourceLineNo">2579</span>    for (int i = 0; i &lt; res.size(); i++) {<a name="line.2579"></a>
-<span class="sourceLineNo">2580</span>      assertTrue(CellUtil.matchingRows(expected[i], res.rawCells()[i]));<a name="line.2580"></a>
-<span class="sourceLineNo">2581</span>      assertTrue(CellUtil.matchingFamily(expected[i], res.rawCells()[i]));<a name="line.2581"></a>
-<span class="sourceLineNo">2582</span>      assertTrue(CellUtil.matchingQualifier(expected[i], res.rawCells()[i]));<a name="line.2582"></a>
-<span class="sourceLineNo">2583</span>    }<a name="line.2583"></a>
-<span class="sourceLineNo">2584</span><a name="line.2584"></a>
-<span class="sourceLineNo">2585</span>    // Test using a filter on a Get<a name="line.2585"></a>
-<span class="sourceLineNo">2586</span>    Get g = new Get(row1);<a name="line.2586"></a>
-<span class="sourceLineNo">2587</span>    final int count = 2;<a name="line.2587"></a>
-<span class="sourceLineNo">2588</span>    g.setFilter(new ColumnCountGetFilter(count));<a name="line.2588"></a>
-<span class="sourceLineNo">2589</span>    res = region.get(g);<a name="line.2589"></a>
-<span class="sourceLineNo">2590</span>    assertEquals(count, res.size());<a name="line.2590"></a>
-<span class="sourceLineNo">2591</span>  }<a name="line.2591"></a>
-<span class="sourceLineNo">2592</span><a name="line.2592"></a>
-<span class="sourceLineNo">2593</span>  @Test<a name="line.2593"></a>
-<span class="sourceLineNo">2594</span>  public void testGet_Empty() throws IOException {<a name="line.2594"></a>
-<span class="sourceLineNo">2595</span>    byte[] row = Bytes.toBytes("row");<a name="line.2595"></a>
-<span class="sourceLineNo">2596</span>    byte[] fam = Bytes.toBytes("fam");<a name="line.2596"></a>
-<span class="sourceLineNo">2597</span><a name="line.2597"></a>
-<span class="sourceLineNo">2598</span>    this.region = initHRegion(tableName, method, CONF, fam);<a name="line.2598"></a>
-<span class="sourceLineNo">2599</span>    Get get = new Get(row);<a name="line.2599"></a>
-<span class="sourceLineNo">2600</span>    get.addFamily(fam);<a name="line.2600"></a>
-<span class="sourceLineNo">2601</span>    Result r = region.get(get);<a name="line.2601"></a>
+<span class="sourceLineNo">2557</span>  @Test<a name="line.2557"></a>
+<span class="sourceLineNo">2558</span>  public void testGet_Basic() throws IOException {<a name="line.2558"></a>
+<span class="sourceLineNo">2559</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2559"></a>
+<span class="sourceLineNo">2560</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2560"></a>
+<span class="sourceLineNo">2561</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.2561"></a>
+<span class="sourceLineNo">2562</span>    byte[] col2 = Bytes.toBytes("col2");<a name="line.2562"></a>
+<span class="sourceLineNo">2563</span>    byte[] col3 = Bytes.toBytes("col3");<a name="line.2563"></a>
+<span class="sourceLineNo">2564</span>    byte[] col4 = Bytes.toBytes("col4");<a name="line.2564"></a>
+<span class="sourceLineNo">2565</span>    byte[] col5 = Bytes.toBytes("col5");<a name="line.2565"></a>
+<span class="sourceLineNo">2566</span><a name="line.2566"></a>
+<span class="sourceLineNo">2567</span>    // Setting up region<a name="line.2567"></a>
+<span class="sourceLineNo">2568</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2568"></a>
+<span class="sourceLineNo">2569</span>    // Add to memstore<a name="line.2569"></a>
+<span class="sourceLineNo">2570</span>    Put put = new Put(row1);<a name="line.2570"></a>
+<span class="sourceLineNo">2571</span>    put.addColumn(fam1, col1, null);<a name="line.2571"></a>
+<span class="sourceLineNo">2572</span>    put.addColumn(fam1, col2, null);<a name="line.2572"></a>
+<span class="sourceLineNo">2573</span>    put.addColumn(fam1, col3, null);<a name="line.2573"></a>
+<span class="sourceLineNo">2574</span>    put.addColumn(fam1, col4, null);<a name="line.2574"></a>
+<span class="sourceLineNo">2575</span>    put.addColumn(fam1, col5, null);<a name="line.2575"></a>
+<span class="sourceLineNo">2576</span>    region.put(put);<a name="line.2576"></a>
+<span class="sourceLineNo">2577</span><a name="line.2577"></a>
+<span class="sourceLineNo">2578</span>    Get get = new Get(row1);<a name="line.2578"></a>
+<span class="sourceLineNo">2579</span>    get.addColumn(fam1, col2);<a name="line.2579"></a>
+<span class="sourceLineNo">2580</span>    get.addColumn(fam1, col4);<a name="line.2580"></a>
+<span class="sourceLineNo">2581</span>    // Expected result<a name="line.2581"></a>
+<span class="sourceLineNo">2582</span>    KeyValue kv1 = new KeyValue(row1, fam1, col2);<a name="line.2582"></a>
+<span class="sourceLineNo">2583</span>    KeyValue kv2 = new KeyValue(row1, fam1, col4);<a name="line.2583"></a>
+<span class="sourceLineNo">2584</span>    KeyValue[] expected = { kv1, kv2 };<a name="line.2584"></a>
+<span class="sourceLineNo">2585</span><a name="line.2585"></a>
+<span class="sourceLineNo">2586</span>    // Test<a name="line.2586"></a>
+<span class="sourceLineNo">2587</span>    Result res = region.get(get);<a name="line.2587"></a>
+<span class="sourceLineNo">2588</span>    assertEquals(expected.length, res.size());<a name="line.2588"></a>
+<span class="sourceLineNo">2589</span>    for (int i = 0; i &lt; res.size(); i++) {<a name="line.2589"></a>
+<span class="sourceLineNo">2590</span>      assertTrue(CellUtil.matchingRows(expected[i], res.rawCells()[i]));<a name="line.2590"></a>
+<span class="sourceLineNo">2591</span>      assertTrue(CellUtil.matchingFamily(expected[i], res.rawCells()[i]));<a name="line.2591"></a>
+<span class="sourceLineNo">2592</span>      assertTrue(CellUtil.matchingQualifier(expected[i], res.rawCells()[i]));<a name="line.2592"></a>
+<span class="sourceLineNo">2593</span>    }<a name="line.2593"></a>
+<span class="sourceLineNo">2594</span><a name="line.2594"></a>
+<span class="sourceLineNo">2595</span>    // Test using a filter on a Get<a name="line.2595"></a>
+<span class="sourceLineNo">2596</span>    Get g = new Get(row1);<a name="line.2596"></a>
+<span class="sourceLineNo">2597</span>    final int count = 2;<a name="line.2597"></a>
+<span class="sourceLineNo">2598</span>    g.setFilter(new ColumnCountGetFilter(count));<a name="line.2598"></a>
+<span class="sourceLineNo">2599</span>    res = region.get(g);<a name="line.2599"></a>
+<span class="sourceLineNo">2600</span>    assertEquals(count, res.size());<a name="line.2600"></a>
+<span class="sourceLineNo">2601</span>  }<a name="line.2601"></a>
 <span class="sourceLineNo">2602</span><a name="line.2602"></a>
-<span class="sourceLineNo">2603</span>    assertTrue(r.isEmpty());<a name="line.2603"></a>
-<span class="sourceLineNo">2604</span>  }<a name="line.2604"></a>
-<span class="sourceLineNo">2605</span><a name="line.2605"></a>
-<span class="sourceLineNo">2606</span>  @Test<a name="line.2606"></a>
-<span class="sourceLineNo">2607</span>  public void testGetWithFilter() throws IOException, InterruptedException {<a name="line.2607"></a>
-<span class="sourceLineNo">2608</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2608"></a>
-<span class="sourceLineNo">2609</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2609"></a>
-<span class="sourceLineNo">2610</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.2610"></a>
-<span class="sourceLineNo">2611</span>    byte[] value1 = Bytes.toBytes("value1");<a name="line.2611"></a>
-<span class="sourceLineNo">2612</span>    byte[] value2 = Bytes.toBytes("value2");<a name="line.2612"></a>
-<span class="sourceLineNo">2613</span><a name="line.2613"></a>
-<span class="sourceLineNo">2614</span>    final int maxVersions = 3;<a name="line.2614"></a>
-<span class="sourceLineNo">2615</span>    HColumnDescriptor hcd = new HColumnDescriptor(fam1);<a name="line.2615"></a>
-<span class="sourceLineNo">2616</span>    hcd.setMaxVersions(maxVersions);<a name="line.2616"></a>
-<span class="sourceLineNo">2617</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf("testFilterAndColumnTracker"));<a name="line.2617"></a>
-<span class="sourceLineNo">2618</span>    htd.addFamily(hcd);<a name="line.2618"></a>
-<span class="sourceLineNo">2619</span>    ChunkCreator.initialize(MemStoreLABImpl.CHUNK_SIZE_DEFAULT, false, 0, 0, 0, null);<a name="line.2619"></a>
-<span class="sourceLineNo">2620</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.2620"></a>
-<span class="sourceLineNo">2621</span>    Path logDir = TEST_UTIL.getDataTestDirOnTestFS(method + ".log");<a name="line.2621"></a>
-<span class="sourceLineNo">2622</span>    final WAL wal = HBaseTestingUtility.createWal(TEST_UTIL.getConfiguration(), logDir, info);<a name="line.2622"></a>
-<span class="sourceLineNo">2623</span>    this.region = TEST_UTIL.createLocalHRegion(info, htd, wal);<a name="line.2623"></a>
-<span class="sourceLineNo">2624</span><a name="line.2624"></a>
-<span class="sourceLineNo">2625</span>    // Put 4 version to memstore<a name="line.2625"></a>
-<span class="sourceLineNo">2626</span>    long ts = 0;<a name="line.2626"></a>
-<span class="sourceLineNo">2627</span>    Put put = new Put(row1, ts);<a name="line.2627"></a>
-<span class="sourceLineNo">2628</span>    put.addColumn(fam1, col1, value1);<a name="line.2628"></a>
-<span class="sourceLineNo">2629</span>    region.put(put);<a name="line.2629"></a>
-<span class="sourceLineNo">2630</span>    put = new Put(row1, ts + 1);<a name="line.2630"></a>
-<span class="sourceLineNo">2631</span>    put.addColumn(fam1, col1, Bytes.toBytes("filter1"));<a name="line.2631"></a>
-<span class="sourceLineNo">2632</span>    region.put(put);<a name="line.2632"></a>
-<span class="sourceLineNo">2633</span>    put = new Put(row1, ts + 2);<a name="line.2633"></a>
-<span class="sourceLineNo">2634</span>    put.addColumn(fam1, col1, Bytes.toBytes("filter2"));<a name="line.2634"></a>
-<span class="sourceLineNo">2635</span>    region.put(put);<a name="line.2635"></a>
-<span class="sourceLineNo">2636</span>    put = new Put(row1, ts + 3);<a name="line.2636"></a>
-<span class="sourceLineNo">2637</span>    put.addColumn(fam1, col1, value2);<a name="line.2637"></a>
-<span class="sourceLineNo">2638</span>    region.put(put);<a name="line.2638"></a>
-<span class="sourceLineNo">2639</span><a name="line.2639"></a>
-<span class="sourceLineNo">2640</span>    Get get = new Get(row1);<a name="line.2640"></a>
-<span class="sourceLineNo">2641</span>    get.readAllVersions();<a name="line.2641"></a>
-<span class="sourceLineNo">2642</span>    Result res = region.get(get);<a name="line.2642"></a>
-<span class="sourceLineNo">2643</span>    // Get 3 versions, the oldest version has gone from user view<a name="line.2643"></a>
-<span class="sourceLineNo">2644</span>    assertEquals(maxVersions, res.size());<a name="line.2644"></a>
-<span class="sourceLineNo">2645</span><a name="line.2645"></a>
-<span class="sourceLineNo">2646</span>    get.setFilter(new ValueFilter(CompareOperator.EQUAL, new SubstringComparator("value")));<a name="line.2646"></a>
-<span class="sourceLineNo">2647</span>    res = region.get(get);<a name="line.2647"></a>
-<span class="sourceLineNo">2648</span>    // When use value filter, the oldest version should still gone from user view and it<a name="line.2648"></a>
-<span class="sourceLineNo">2649</span>    // should only return one key vaule<a name="line.2649"></a>
-<span class="sourceLineNo">2650</span>    assertEquals(1, res.size());<a name="line.2650"></a>
-<span class="sourceLineNo">2651</span>    assertTrue(CellUtil.matchingValue(new KeyValue(row1, fam1, col1, value2), res.rawCells()[0]));<a name="line.2651"></a>
-<span class="sourceLineNo">2652</span>    assertEquals(ts + 3, res.rawCells()[0].getTimestamp());<a name="line.2652"></a>
-<span class="sourceLineNo">2653</span><a name="line.2653"></a>
-<span class="sourceLineNo">2654</span>    region.flush(true);<a name="line.2654"></a>
-<span class="sourceLineNo">2655</span>    region.compact(true);<a name="line.2655"></a>
-<span class="sourceLineNo">2656</span>    Thread.sleep(1000);<a name="line.2656"></a>
+<span class="sourceLineNo">2603</span>  @Test<a name="line.2603"></a>
+<span class="sourceLineNo">2604</span>  public void testGet_Empty() throws IOException {<a name="line.2604"></a>
+<span class="sourceLineNo">2605</span>    byte[] row = Bytes.toBytes("row");<a name="line.2605"></a>
+<span class="sourceLineNo">2606</span>    byte[] fam = Bytes.toBytes("fam");<a name="line.2606"></a>
+<span class="sourceLineNo">2607</span><a name="line.2607"></a>
+<span class="sourceLineNo">2608</span>    this.region = initHRegion(tableName, method, CONF, fam);<a name="line.2608"></a>
+<span class="sourceLineNo">2609</span>    Get get = new Get(row);<a name="line.2609"></a>
+<span class="sourceLineNo">2610</span>    get.addFamily(fam);<a name="line.2610"></a>
+<span class="sourceLineNo">2611</span>    Result r = region.get(get);<a name="line.2611"></a>
+<span class="sourceLineNo">2612</span><a name="line.2612"></a>
+<span class="sourceLineNo">2613</span>    assertTrue(r.isEmpty());<a name="line.2613"></a>
+<span class="sourceLineNo">2614</span>  }<a name="line.2614"></a>
+<span class="sourceLineNo">2615</span><a name="line.2615"></a>
+<span class="sourceLineNo">2616</span>  @Test<a name="line.2616"></a>
+<span class="sourceLineNo">2617</span>  public void testGetWithFilter() throws IOException, InterruptedException {<a name="line.2617"></a>
+<span class="sourceLineNo">2618</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2618"></a>
+<span class="sourceLineNo">2619</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2619"></a>
+<span class="sourceLineNo">2620</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.2620"></a>
+<span class="sourceLineNo">2621</span>    byte[] value1 = Bytes.toBytes("value1");<a name="line.2621"></a>
+<span class="sourceLineNo">2622</span>    byte[] value2 = Bytes.toBytes("value2");<a name="line.2622"></a>
+<span class="sourceLineNo">2623</span><a name="line.2623"></a>
+<span class="sourceLineNo">2624</span>    final int maxVersions = 3;<a name="line.2624"></a>
+<span class="sourceLineNo">2625</span>    HColumnDescriptor hcd = new HColumnDescriptor(fam1);<a name="line.2625"></a>
+<span class="sourceLineNo">2626</span>    hcd.setMaxVersions(maxVersions);<a name="line.2626"></a>
+<span class="sourceLineNo">2627</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf("testFilterAndColumnTracker"));<a name="line.2627"></a>
+<span class="sourceLineNo">2628</span>    htd.addFamily(hcd);<a name="line.2628"></a>
+<span class="sourceLineNo">2629</span>    ChunkCreator.initialize(MemStoreLABImpl.CHUNK_SIZE_DEFAULT, false, 0, 0, 0, null);<a name="line.2629"></a>
+<span class="sourceLineNo">2630</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.2630"></a>
+<span class="sourceLineNo">2631</span>    Path logDir = TEST_UTIL.getDataTestDirOnTestFS(method + ".log");<a name="line.2631"></a>
+<span class="sourceLineNo">2632</span>    final WAL wal = HBaseTestingUtility.createWal(TEST_UTIL.getConfiguration(), logDir, info);<a name="line.2632"></a>
+<span class="sourceLineNo">2633</span>    this.region = TEST_UTIL.createLocalHRegion(info, htd, wal);<a name="line.2633"></a>
+<span class="sourceLineNo">2634</span><a name="line.2634"></a>
+<span class="sourceLineNo">2635</span>    // Put 4 version to memstore<a name="line.2635"></a>
+<span class="sourceLineNo">2636</span>    long ts = 0;<a name="line.2636"></a>
+<span class="sourceLineNo">2637</span>    Put put = new Put(row1, ts);<a name="line.2637"></a>
+<span class="sourceLineNo">2638</span>    put.addColumn(fam1, col1, value1);<a name="line.2638"></a>
+<span class="sourceLineNo">2639</span>    region.put(put);<a name="line.2639"></a>
+<span class="sourceLineNo">2640</span>    put = new Put(row1, ts + 1);<a name="line.2640"></a>
+<span class="sourceLineNo">2641</span>    put.addColumn(fam1, col1, Bytes.toBytes("filter1"));<a name="line.2641"></a>
+<span class="sourceLineNo">2642</span>    region.put(put);<a name="line.2642"></a>
+<span class="sourceLineNo">2643</span>    put = new Put(row1, ts + 2);<a name="line.2643"></a>
+<span class="sourceLineNo">2644</span>    put.addColumn(fam1, col1, Bytes.toBytes("filter2"));<a name="line.2644"></a>
+<span class="sourceLineNo">2645</span>    region.put(put);<a name="line.2645"></a>
+<span class="sourceLineNo">2646</span>    put = new Put(row1, ts + 3);<a name="line.2646"></a>
+<span class="sourceLineNo">2647</span>    put.addColumn(fam1, col1, value2);<a name="line.2647"></a>
+<span class="sourceLineNo">2648</span>    region.put(put);<a name="line.2648"></a>
+<span class="sourceLineNo">2649</span><a name="line.2649"></a>
+<span class="sourceLineNo">2650</span>    Get get = new Get(row1);<a name="line.2650"></a>
+<span class="sourceLineNo">2651</span>    get.readAllVersions();<a name="line.2651"></a>
+<span class="sourceLineNo">2652</span>    Result res = region.get(get);<a name="line.2652"></a>
+<span class="sourceLineNo">2653</span>    // Get 3 versions, the oldest version has gone from user view<a name="line.2653"></a>
+<span class="sourceLineNo">2654</span>    assertEquals(maxVersions, res.size());<a name="line.2654"></a>
+<span class="sourceLineNo">2655</span><a name="line.2655"></a>
+<span class="sourceLineNo">2656</span>    get.setFilter(new ValueFilter(CompareOperator.EQUAL, new SubstringComparator("value")));<a name="line.2656"></a>
 <span class="sourceLineNo">2657</span>    res = region.get(get);<a name="line.2657"></a>
-<span class="sourceLineNo">2658</span>    // After flush and compact, the result should be consistent with previous result<a name="line.2658"></a>
-<span class="sourceLineNo">2659</span>    assertEquals(1, res.size());<a name="line.2659"></a>
-<span class="sourceLineNo">2660</span>    assertTrue(CellUtil.matchingValue(new KeyValue(row1, fam1, col1, value2), res.rawCells()[0]));<a name="line.2660"></a>
-<span class="sourceLineNo">2661</span>  }<a name="line.2661"></a>
-<span class="sourceLineNo">2662</span><a name="line.2662"></a>
-<span class="sourceLineNo">2663</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2663"></a>
-<span class="sourceLineNo">2664</span>  // Scanner tests<a name="line.2664"></a>
-<span class="sourceLineNo">2665</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2665"></a>
-<span class="sourceLineNo">2666</span>  @Test<a name="line.2666"></a>
-<span class="sourceLineNo">2667</span>  public void testGetScanner_WithOkFamilies() throws IOException {<a name="line.2667"></a>
-<span class="sourceLineNo">2668</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2668"></a>
-<span class="sourceLineNo">2669</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2669"></a>
-<span class="sourceLineNo">2670</span><a name="line.2670"></a>
-<span class="sourceLineNo">2671</span>    byte[][] families = { fam1, fam2 };<a name="line.2671"></a>
+<span class="sourceLineNo">2658</span>    // When use value filter, the oldest version should still gone from user view and it<a name="line.2658"></a>
+<span class="sourceLineNo">2659</span>    // should only return one key vaule<a name="line.2659"></a>
+<span class="sourceLineNo">2660</span>    assertEquals(1, res.size());<a name="line.2660"></a>
+<span class="sourceLineNo">2661</span>    assertTrue(CellUtil.matchingValue(new KeyValue(row1, fam1, col1, value2), res.rawCells()[0]));<a name="line.2661"></a>
+<span class="sourceLineNo">2662</span>    assertEquals(ts + 3, res.rawCells()[0].getTimestamp());<a name="line.2662"></a>
+<span class="sourceLineNo">2663</span><a name="line.2663"></a>
+<span class="sourceLineNo">2664</span>    region.flush(true);<a name="line.2664"></a>
+<span class="sourceLineNo">2665</span>    region.compact(true);<a name="line.2665"></a>
+<span class="sourceLineNo">2666</span>    Thread.sleep(1000);<a name="line.2666"></a>
+<span class="sourceLineNo">2667</span>    res = region.get(get);<a name="line.2667"></a>
+<span class="sourceLineNo">2668</span>    // After flush and compact, the result should be consistent with previous result<a name="line.2668"></a>
+<span class="sourceLineNo">2669</span>    assertEquals(1, res.size());<a name="line.2669"></a>
+<span class="sourceLineNo">2670</span>    assertTrue(CellUtil.matchingValue(new KeyValue(row1, fam1, col1, value2), res.rawCells()[0]));<a name="line.2670"></a>
+<span class="sourceLineNo">2671</span>  }<a name="line.2671"></a>
 <span class="sourceLineNo">2672</span><a name="line.2672"></a>
-<span class="sourceLineNo">2673</span>    // Setting up region<a name="line.2673"></a>
-<span class="sourceLineNo">2674</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2674"></a>
-<span class="sourceLineNo">2675</span>    Scan scan = new Scan();<a name="line.2675"></a>
-<span class="sourceLineNo">2676</span>    scan.addFamily(fam1);<a name="line.2676"></a>
-<span class="sourceLineNo">2677</span>    scan.addFamily(fam2);<a name="line.2677"></a>
-<span class="sourceLineNo">2678</span>    try {<a name="line.2678"></a>
-<span class="sourceLineNo">2679</span>      region.getScanner(scan);<a name="line.2679"></a>
-<span class="sourceLineNo">2680</span>    } catch (Exception e) {<a name="line.2680"></a>
-<span class="sourceLineNo">2681</span>      assertTrue("Families could not be found in Region", false);<a name="line.2681"></a>
-<span class="sourceLineNo">2682</span>    }<a name="line.2682"></a>
-<span class="sourceLineNo">2683</span>  }<a name="line.2683"></a>
-<span class="sourceLineNo">2684</span><a name="line.2684"></a>
-<span class="sourceLineNo">2685</span>  @Test<a name="line.2685"></a>
-<span class="sourceLineNo">2686</span>  public void testGetScanner_WithNotOkFamilies() throws IOException {<a name="line.2686"></a>
-<span class="sourceLineNo">2687</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2687"></a>
-<span class="sourceLineNo">2688</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2688"></a>
-<span class="sourceLineNo">2689</span><a name="line.2689"></a>
-<span class="sourceLineNo">2690</span>    byte[][] families = { fam1 };<a name="line.2690"></a>
-<span class="sourceLineNo">2691</span><a name="line.2691"></a>
-<span class="sourceLineNo">2692</span>    // Setting up region<a name="line.2692"></a>
-<span class="sourceLineNo">2693</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2693"></a>
-<span class="sourceLineNo">2694</span>    Scan scan = new Scan();<a name="line.2694"></a>
-<span class="sourceLineNo">2695</span>    scan.addFamily(fam2);<a name="line.2695"></a>
-<span class="sourceLineNo">2696</span>    boolean ok = false;<a name="line.2696"></a>
-<span class="sourceLineNo">2697</span>    try {<a name="line.2697"></a>
-<span class="sourceLineNo">2698</span>      region.getScanner(scan);<a name="line.2698"></a>
-<span class="sourceLineNo">2699</span>    } catch (Exception e) {<a name="line.2699"></a>
-<span class="sourceLineNo">2700</span>      ok = true;<a name="line.2700"></a>
-<span class="sourceLineNo">2701</span>    }<a name="line.2701"></a>
-<span class="sourceLineNo">2702</span>    assertTrue("Families could not be found in Region", ok);<a name="line.2702"></a>
-<span class="sourceLineNo">2703</span>  }<a name="line.2703"></a>
-<span class="sourceLineNo">2704</span><a name="line.2704"></a>
-<span class="sourceLineNo">2705</span>  @Test<a name="line.2705"></a>
-<span class="sourceLineNo">2706</span>  public void testGetScanner_WithNoFamilies() throws IOException {<a name="line.2706"></a>
-<span class="sourceLineNo">2707</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2707"></a>
-<span class="sourceLineNo">2708</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2708"></a>
-<span class="sourceLineNo">2709</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2709"></a>
-<span class="sourceLineNo">2710</span>    byte[] fam3 = Bytes.toBytes("fam3");<a name="line.2710"></a>
-<span class="sourceLineNo">2711</span>    byte[] fam4 = Bytes.toBytes("fam4");<a name="line.2711"></a>
-<span class="sourceLineNo">2712</span><a name="line.2712"></a>
-<span class="sourceLineNo">2713</span>    byte[][] families = { fam1, fam2, fam3, fam4 };<a name="line.2713"></a>
+<span class="sourceLineNo">2673</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2673"></a>
+<span class="sourceLineNo">2674</span>  // Scanner tests<a name="line.2674"></a>
+<span class="sourceLineNo">2675</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2675"></a>
+<span class="sourceLineNo">2676</span>  @Test<a name="line.2676"></a>
+<span class="sourceLineNo">2677</span>  public void testGetScanner_WithOkFamilies() throws IOException {<a name="line.2677"></a>
+<span class="sourceLineNo">2678</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2678"></a>
+<span class="sourceLineNo">2679</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2679"></a>
+<span class="sourceLineNo">2680</span><a name="line.2680"></a>
+<span class="sourceLineNo">2681</span>    byte[][] families = { fam1, fam2 };<a name="line.2681"></a>
+<span class="sourceLineNo">2682</span><a name="line.2682"></a>
+<span class="sourceLineNo">2683</span>    // Setting up region<a name="line.2683"></a>
+<span class="sourceLineNo">2684</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2684"></a>
+<span class="sourceLineNo">2685</span>    Scan scan = new Scan();<a name="line.2685"></a>
+<span class="sourceLineNo">2686</span>    scan.addFamily(fam1);<a name="line.2686"></a>
+<span class="sourceLineNo">2687</span>    scan.addFamily(fam2);<a name="line.2687"></a>
+<span class="sourceLineNo">2688</span>    try {<a name="line.2688"></a>
+<span class="sourceLineNo">2689</span>      region.getScanner(scan);<a name="line.2689"></a>
+<span class="sourceLineNo">2690</span>    } catch (Exception e) {<a name="line.2690"></a>
+<span class="sourceLineNo">2691</span>      assertTrue("Families could not be found in Region", false);<a name="line.2691"></a>
+<span class="sourceLineNo">2692</span>    }<a name="line.2692"></a>
+<span class="sourceLineNo">2693</span>  }<a name="line.2693"></a>
+<span class="sourceLineNo">2694</span><a name="line.2694"></a>
+<span class="sourceLineNo">2695</span>  @Test<a name="line.2695"></a>
+<span class="sourceLineNo">2696</span>  public void testGetScanner_WithNotOkFamilies() throws IOException {<a name="line.2696"></a>
+<span class="sourceLineNo">2697</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2697"></a>
+<span class="sourceLineNo">2698</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2698"></a>
+<span class="sourceLineNo">2699</span><a name="line.2699"></a>
+<span class="sourceLineNo">2700</span>    byte[][] families = { fam1 };<a name="line.2700"></a>
+<span class="sourceLineNo">2701</span><a name="line.2701"></a>
+<span class="sourceLineNo">2702</span>    // Setting up region<a name="line.2702"></a>
+<span class="sourceLineNo">2703</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2703"></a>
+<span class="sourceLineNo">2704</span>    Scan scan = new Scan();<a name="line.2704"></a>
+<span class="sourceLineNo">2705</span>    scan.addFamily(fam2);<a name="line.2705"></a>
+<span class="sourceLineNo">2706</span>    boolean ok = false;<a name="line.2706"></a>
+<span class="sourceLineNo">2707</span>    try {<a name="line.2707"></a>
+<span class="sourceLineNo">2708</span>      region.getScanner(scan);<a name="line.2708"></a>
+<span class="sourceLineNo">2709</span>    } catch (Exception e) {<a name="line.2709"></a>
+<span class="sourceLineNo">2710</span>      ok = true;<a name="line.2710"></a>
+<span class="sourceLineNo">2711</span>    }<a name="line.2711"></a>
+<span class="sourceLineNo">2712</span>    assertTrue("Families could not be found in Region", ok);<a name="line.2712"></a>
+<span class="sourceLineNo">2713</span>  }<a name="line.2713"></a>
 <span class="sourceLineNo">2714</span><a name="line.2714"></a>
-<span class="sourceLineNo">2715</span>    // Setting up region<a name="line.2715"></a>
-<span class="sourceLineNo">2716</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2716"></a>
-<span class="sourceLineNo">2717</span>    // Putting data in Region<a name="line.2717"></a>
-<span class="sourceLineNo">2718</span>    Put put = new Put(row1);<a name="line.2718"></a>
-<span class="sourceLineNo">2719</span>    put.addColumn(fam1, null, null);<a name="line.2719"></a>
-<span class="sourceLineNo">2720</span>    put.addColumn(fam2, null, null);<a name="line.2720"></a>
-<span class="sourceLineNo">2721</span>    put.addColumn(fam3, null, null);<a name="line.2721"></a>
-<span class="sourceLineNo">2722</span>    put.addColumn(fam4, null, null);<a name="line.2722"></a>
-<span class="sourceLineNo">2723</span>    region.put(put);<a name="line.2723"></a>
+<span class="sourceLineNo">2715</span>  @Test<a name="line.2715"></a>
+<span class="sourceLineNo">2716</span>  public void testGetScanner_WithNoFamilies() throws IOException {<a name="line.2716"></a>
+<span class="sourceLineNo">2717</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2717"></a>
+<span class="sourceLineNo">2718</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2718"></a>
+<span class="sourceLineNo">2719</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2719"></a>
+<span class="sourceLineNo">2720</span>    byte[] fam3 = Bytes.toBytes("fam3");<a name="line.2720"></a>
+<span class="sourceLineNo">2721</span>    byte[] fam4 = Bytes.toBytes("fam4");<a name="line.2721"></a>
+<span class="sourceLineNo">2722</span><a name="line.2722"></a>
+<span class="sourceLineNo">2723</span>    byte[][] families = { fam1, fam2, fam3, fam4 };<a name="line.2723"></a>
 <span class="sourceLineNo">2724</span><a name="line.2724"></a>
-<span class="sourceLineNo">2725</span>    Scan scan = null;<a name="line.2725"></a>
-<span class="sourceLineNo">2726</span>    HRegion.RegionScannerImpl is = null;<a name="line.2726"></a>
-<span class="sourceLineNo">2727</span><a name="line.2727"></a>
-<span class="sourceLineNo">2728</span>    // Testing to see how many scanners that is produced by getScanner,<a name="line.2728"></a>
-<span class="sourceLineNo">2729</span>    // starting<a name="line.2729"></a>
-<span class="sourceLineNo">2730</span>    // with known number, 2 - current = 1<a name="line.2730"></a>
-<span class="sourceLineNo">2731</span>    scan = new Scan();<a name="line.2731"></a>
-<span class="sourceLineNo">2732</span>    scan.addFamily(fam2);<a name="line.2732"></a>
-<span class="sourceLineNo">2733</span>    scan.addFamily(fam4);<a name="line.2733"></a>
-<span class="sourceLineNo">2734</span>    is = region.getScanner(scan);<a name="line.2734"></a>
-<span class="sourceLineNo">2735</span>    assertEquals(1, is.storeHeap.getHeap().size());<a name="line.2735"></a>
-<span class="sourceLineNo">2736</span><a name="line.2736"></a>
-<span class="sourceLineNo">2737</span>    scan = new Scan();<a name="line.2737"></a>
-<span class="sourceLineNo">2738</span>    is = region.getScanner(scan);<a name="line.2738"></a>
-<span class="sourceLineNo">2739</span>    assertEquals(families.length - 1, is.storeHeap.getHeap().size());<a name="line.2739"></a>
-<span class="sourceLineNo">2740</span>  }<a name="line.2740"></a>
-<span class="sourceLineNo">2741</span><a name="line.2741"></a>
-<span class="sourceLineNo">2742</span>  /**<a name="line.2742"></a>
-<span class="sourceLineNo">2743</span>   * This method tests https://issues.apache.org/jira/browse/HBASE-2516.<a name="line.2743"></a>
-<span class="sourceLineNo">2744</span>   *<a name="line.2744"></a>
-<span class="sourceLineNo">2745</span>   * @throws IOException<a name="line.2745"></a>
-<span class="sourceLineNo">2746</span>   */<a name="line.2746"></a>
-<span class="sourceLineNo">2747</span>  @Test<a name="line.2747"></a>
-<span class="sourceLineNo">2748</span>  public void testGetScanner_WithRegionClosed() throws IOException {<a name="line.2748"></a>
-<span class="sourceLineNo">2749</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2749"></a>
-<span class="sourceLineNo">2750</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2750"></a>
+<span class="sourceLineNo">2725</span>    // Setting up region<a name="line.2725"></a>
+<span class="sourceLineNo">2726</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2726"></a>
+<span class="sourceLineNo">2727</span>    // Putting data in Region<a name="line.2727"></a>
+<span class="sourceLineNo">2728</span>    Put put = new Put(row1);<a name="line.2728"></a>
+<span class="sourceLineNo">2729</span>    put.addColumn(fam1, null, null);<a name="line.2729"></a>
+<span class="sourceLineNo">2730</span>    put.addColumn(fam2, null, null);<a name="line.2730"></a>
+<span class="sourceLineNo">2731</span>    put.addColumn(fam3, null, null);<a name="line.2731"></a>
+<span class="sourceLineNo">2732</span>    put.addColumn(fam4, null, null);<a name="line.2732"></a>
+<span class="sourceLineNo">2733</span>    region.put(put);<a name="line.2733"></a>
+<span class="sourceLineNo">2734</span><a name="line.2734"></a>
+<span class="sourceLineNo">2735</span>    Scan scan = null;<a name="line.2735"></a>
+<span class="sourceLineNo">2736</span>    HRegion.RegionScannerImpl is = null;<a name="line.2736"></a>
+<span class="sourceLineNo">2737</span><a name="line.2737"></a>
+<span class="sourceLineNo">2738</span>    // Testing to see how many scanners that is produced by getScanner,<a name="line.2738"></a>
+<span class="sourceLineNo">2739</span>    // starting<a name="line.2739"></a>
+<span class="sourceLineNo">2740</span>    // with known number, 2 - current = 1<a name="line.2740"></a>
+<span class="sourceLineNo">2741</span>    scan = new Scan();<a name="line.2741"></a>
+<span class="sourceLineNo">2742</span>    scan.addFamily(fam2);<a name="line.2742"></a>
+<span class="sourceLineNo">2743</span>    scan.addFamily(fam4);<a name="line.2743"></a>
+<span class="sourceLineNo">2744</span>    is = region.getScanner(scan);<a name="line.2744"></a>
+<span class="sourceLineNo">2745</span>    assertEquals(1, is.storeHeap.getHeap().size());<a name="line.2745"></a>
+<span class="sourceLineNo">2746</span><a name="line.2746"></a>
+<span class="sourceLineNo">2747</span>    scan = new Scan();<a name="line.2747"></a>
+<span class="sourceLineNo">2748</span>    is = region.getScanner(scan);<a name="line.2748"></a>
+<span class="sourceLineNo">2749</span>    assertEquals(families.length - 1, is.storeHeap.getHeap().size());<a name="line.2749"></a>
+<span class="sourceLineNo">2750</span>  }<a name="line.2750"></a>
 <span class="sourceLineNo">2751</span><a name="line.2751"></a>
-<span class="sourceLineNo">2752</span>    byte[][] families = { fam1, fam2 };<a name="line.2752"></a>
-<span class="sourceLineNo">2753</span><a name="line.2753"></a>
-<span class="sourceLineNo">2754</span>    // Setting up region<a name="line.2754"></a>
-<span class="sourceLineNo">2755</span>    try {<a name="line.2755"></a>
-<span class="sourceLineNo">2756</span>      this.region = initHRegion(tableName, method, CONF, families);<a name="line.2756"></a>
-<span class="sourceLineNo">2757</span>    } catch (IOException e) {<a name="line.2757"></a>
-<span class="sourceLineNo">2758</span>      e.printStackTrace();<a name="line.2758"></a>
-<span class="sourceLineNo">2759</span>      fail("Got IOException during initHRegion, " + e.getMessage());<a name="line.2759"></a>
-<span class="sourceLineNo">2760</span>    }<a name="line.2760"></a>
-<span class="sourceLineNo">2761</span>    region.closed.set(true);<a name="line.2761"></a>
-<span class="sourceLineNo">2762</span>    try {<a name="line.2762"></a>
-<span class="sourceLineNo">2763</span>      region.getScanner(null);<a name="line.2763"></a>
-<span class="sourceLineNo">2764</span>      fail("Expected to get an exception during getScanner on a region that is closed");<a name="line.2764"></a>
-<span class="sourceLineNo">2765</span>    } catch (NotServingRegionException e) {<a name="line.2765"></a>
-<span class="sourceLineNo">2766</span>      // this is the correct exception that is expected<a name="line.2766"></a>
+<span class="sourceLineNo">2752</span>  /**<a name="line.2752"></a>
+<span class="sourceLineNo">2753</span>   * This method tests https://issues.apache.org/jira/browse/HBASE-2516.<a name="line.2753"></a>
+<span class="sourceLineNo">2754</span>   *<a name="line.2754"></a>
+<span class="sourceLineNo">2755</span>   * @throws IOException<a name="line.2755"></a>
+<span class="sourceLineNo">2756</span>   */<a name="line.2756"></a>
+<span class="sourceLineNo">2757</span>  @Test<a name="line.2757"></a>
+<span class="sourceLineNo">2758</span>  public void testGetScanner_WithRegionClosed() throws IOException {<a name="line.2758"></a>
+<span class="sourceLineNo">2759</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2759"></a>
+<span class="sourceLineNo">2760</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2760"></a>
+<span class="sourceLineNo">2761</span><a name="line.2761"></a>
+<span class="sourceLineNo">2762</span>    byte[][] families = { fam1, fam2 };<a name="line.2762"></a>
+<span class="sourceLineNo">2763</span><a name="line.2763"></a>
+<span class="sourceLineNo">2764</span>    // Setting up region<a name="line.2764"></a>
+<span class="sourceLineNo">2765</span>    try {<a name="line.2765"></a>
+<span class="sourceLineNo">2766</span>      this.region = initHRegion(tableName, method, CONF, families);<a name="line.2766"></a>
 <span class="sourceLineNo">2767</span>    } catch (IOException e) {<a name="line.2767"></a>
-<span class="sourceLineNo">2768</span>      fail("Got wrong type of exception - should be a NotServingRegionException, " +<a name="line.2768"></a>
-<span class="sourceLineNo">2769</span>          "but was an IOException: "<a name="line.2769"></a>
-<span class="sourceLineNo">2770</span>          + e.getMessage());<a name="line.2770"></a>
-<span class="sourceLineNo">2771</span>    }<a name="line.2771"></a>
-<span class="sourceLineNo">2772</span>  }<a name="line.2772"></a>
-<span class="sourceLineNo">2773</span><a name="line.2773"></a>
-<span class="sourceLineNo">2774</span>  @Test<a name="line.2774"></a>
-<span class="sourceLineNo">2775</span>  public void testRegionScanner_Next() throws IOException {<a name="line.2775"></a>
-<span class="sourceLineNo">2776</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2776"></a>
-<span class="sourceLineNo">2777</span>    byte[] row2 = Bytes.toBytes("row2");<a name="line.2777"></a>
-<span class="sourceLineNo">2778</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2778"></a>
-<span class="sourceLineNo">2779</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2779"></a>
-<span class="sourceLineNo">2780</span>    byte[] fam3 = Bytes.toBytes("fam3");<a name="line.2780"></a>
-<span class="sourceLineNo">2781</span>    byte[] fam4 = Bytes.toBytes("fam4");<a name="line.2781"></a>
-<span class="sourceLineNo">2782</span><a name="line.2782"></a>
-<span class="sourceLineNo">2783</span>    byte[][] families = { fam1, fam2, fam3, fam4 };<a name="line.2783"></a>
-<span class="sourceLineNo">2784</span>    long ts = System.currentTimeMillis();<a name="line.2784"></a>
-<span class="sourceLineNo">2785</span><a name="line.2785"></a>
-<span class="sourceLineNo">2786</span>    // Setting up region<a name="line.2786"></a>
-<span class="sourceLineNo">2787</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2787"></a>
-<span class="sourceLineNo">2788</span>    // Putting data in Region<a name="line.2788"></a>
-<span class="sourceLineNo">2789</span>    Put put = null;<a name="line.2789"></a>
-<span class="sourceLineNo">2790</span>    put = new Put(row1);<a name="line.2790"></a>
-<span class="sourceLineNo">2791</span>    put.addColumn(fam1, (byte[]) null, ts, null);<a name="line.2791"></a>
-<span class="sourceLineNo">2792</span>    put.addColumn(fam2, (byte[]) null, ts, null);<a name="line.2792"></a>
-<span class="sourceLineNo">2793</span>    put.addColumn(fam3, (byte[]) null, ts, null);<a name="line.2793"></a>
-<span class="sourceLineNo">2794</span>    put.addColumn(fam4, (byte[]) null, ts, null);<a name="line.2794"></a>
-<span class="sourceLineNo">2795</span>    region.put(put);<a name="line.2795"></a>
-<span class="sourceLineNo">2796</span><a name="line.2796"></a>
-<span class="sourceLineNo">2797</span>    put = new Put(row2);<a name="line.2797"></a>
-<span class="sourceLineNo">2798</span>    put.addColumn(fam1, (byte[]) null, ts, null);<a name="line.2798"></a>
-<span class="sourceLineNo">2799</span>    put.addColumn(fam2, (byte[]) null, ts, null);<a name="line.2799"></a>
-<span class="sourceLineNo">2800</span>    put.addColumn(fam3, (byte[]) null, ts, null);<a name="line.2800"></a>
-<span class="sourceLineNo">2801</span>    put.addColumn(fam4, (byte[]) null, ts, null);<a name="line.2801"></a>
-<span class="sourceLineNo">2802</span>    region.put(put);<a name="line.2802"></a>
-<span class="sourceLineNo">2803</span><a name="line.2803"></a>
-<span class="sourceLineNo">2804</span>    Scan scan = new Scan();<a name="line.2804"></a>
-<span class="sourceLineNo">2805</span>    scan.addFamily(fam2);<a name="line.2805"></a>
-<span class="sourceLineNo">2806</span>    scan.addFamily(fam4);<a name="line.2806"></a>
-<span class="sourceLineNo">2807</span>    InternalScanner is = region.getScanner(scan);<a name="line.2807"></a>
-<span class="sourceLineNo">2808</span><a name="line.2808"></a>
-<span class="sourceLineNo">2809</span>    List&lt;Cell&gt; res = null;<a name="line.2809"></a>
-<span class="sourceLineNo">2810</span><a name="line.2810"></a>
-<span class="sourceLineNo">2811</span>    // Result 1<a name="line.2811"></a>
-<span class="sourceLineNo">2812</span>    List&lt;Cell&gt; expected1 = new ArrayList&lt;&gt;();<a name="line.2812"></a>
-<span class="sourceLineNo">2813</span>    expected1.add(new KeyValue(row1, fam2, null, ts, KeyValue.Type.Put, null));<a name="line.2813"></a>
-<span class="sourceLineNo">2814</span>    expected1.add(new KeyValue(row1, fam4, null, ts, KeyValue.Type.Put, null));<a name="line.2814"></a>
-<span class="sourceLineNo">2815</span><a name="line.2815"></a>
-<span class="sourceLineNo">2816</span>    res = new ArrayList&lt;&gt;();<a name="line.2816"></a>
-<span class="sourceLineNo">2817</span>    is.next(res);<a name="line.2817"></a>
-<span class="sourceLineNo">2818</span>    for (int i = 0; i &lt; res.size(); i++) {<a name="line.2818"></a>
-<span class="sourceLineNo">2819</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected1.get(i), res.get(i)));<a name="line.2819"></a>
-<span class="sourceLineNo">2820</span>    }<a name="line.2820"></a>
-<span class="sourceLineNo">2821</span><a name="line.2821"></a>
-<span class="sourceLineNo">2822</span>    // Result 2<a name="line.2822"></a>
-<span class="sourceLineNo">2823</span>    List&lt;Cell&gt; expected2 = new ArrayList&lt;&gt;();<a name="line.2823"></a>
-<span class="sourceLineNo">2824</span>    expected2.add(new KeyValue(row2, fam2, null, ts, KeyValue.Type.Put, null));<a name="line.2824"></a>
-<span class="sourceLineNo">2825</span>    expected2.add(new KeyValue(row2, fam4, null, ts, KeyValue.Type.Put, null));<a name="line.2825"></a>
-<span class="sourceLineNo">2826</span><a name="line.2826"></a>
-<span class="sourceLineNo">2827</span>    res = new ArrayList&lt;&gt;();<a name="line.2827"></a>
-<span class="sourceLineNo">2828</span>    is.next(res);<a name="line.2828"></a>
-<span class="sourceLineNo">2829</span>    for (int i = 0; i &lt; res.size(); i++) {<a name="line.2829"></a>
-<span class="sourceLineNo">2830</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected2.get(i), res.get(i)));<a name="line.2830"></a>
-<span class="sourceLineNo">2831</span>    }<a name="line.2831"></a>
-<span class="sourceLineNo">2832</span>  }<a name="line.2832"></a>
-<span class="sourceLineNo">2833</span><a name="line.2833"></a>
-<span class="sourceLineNo">2834</span>  @Test<a name="line.2834"></a>
-<span class="sourceLineNo">2835</span>  public void testScanner_ExplicitColumns_FromMemStore_EnforceVersions() throws IOException {<a name="line.2835"></a>
-<span class="sourceLineNo">2836</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2836"></a>
-<span class="sourceLineNo">2837</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.2837"></a>
-<span class="sourceLineNo">2838</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.2838"></a>
-<span class="sourceLineNo">2839</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2839"></a>
-<span class="sourceLineNo">2840</span>    byte[][] families = { fam1 };<a name="line.2840"></a>
-<span class="sourceLineNo">2841</span><a name="line.2841"></a>
-<span class="sourceLineNo">2842</span>    long ts1 = System.currentTimeMillis();<a name="line.2842"></a>
-<span class="sourceLineNo">2843</span>    long ts2 = ts1 + 1;<a name="line.2843"></a>
-<span class="sourceLineNo">2844</span>    long ts3 = ts1 + 2;<a name="line.2844"></a>
-<span class="sourceLineNo">2845</span><a name="line.2845"></a>
-<span class="sourceLineNo">2846</span>    // Setting up region<a name="line.2846"></a>
-<span class="sourceLineNo">2847</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2847"></a>
-<span class="sourceLineNo">2848</span>    // Putting data in Region<a name="line.2848"></a>
-<span class="sourceLineNo">2849</span>    Put put = null;<a name="line.2849"></a>
-<span class="sourceLineNo">2850</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.2850"></a>
-<span class="sourceLineNo">2851</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.2851"></a>
-<span class="sourceLineNo">2852</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.2852"></a>
-<span class="sourceLineNo">2853</span><a name="line.2853"></a>
-<span class="sourceLineNo">2854</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.2854"></a>
-<span class="sourceLineNo">2855</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.2855"></a>
-<span class="sourceLineNo">2856</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.2856"></a>
-<span class="sourceLineNo">2857</span><a name="line.2857"></a>
-<span class="sourceLineNo">2858</span>    put = new Put(row1);<a name="line.2858"></a>
-<span class="sourceLineNo">2859</span>    put.add(kv13);<a name="line.2859"></a>
-<span class="sourceLineNo">2860</span>    put.add(kv12);<a name="line.2860"></a>
-<span class="sourceLineNo">2861</span>    put.add(kv11);<a name="line.2861"></a>
-<span class="sourceLineNo">2862</span>    put.add(kv23);<a name="line.2862"></a>
-<span class="sourceLineNo">2863</span>    put.add(kv22);<a name="line.2863"></a>
-<span class="sourceLineNo">2864</span>    put.add(kv21);<a name="line.2864"></a>
-<span class="sourceLineNo">2865</span>    region.put(put);<a name="line.2865"></a>
-<span class="sourceLineNo">2866</span><a name="line.2866"></a>
-<span class="sourceLineNo">2867</span>    // Expected<a name="line.2867"></a>
-<span class="sourceLineNo">2868</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.2868"></a>
-<span class="sourceLineNo">2869</span>    expected.add(kv13);<a name="line.2869"></a>
-<span class="sourceLineNo">2870</span>    expected.add(kv12);<a name="line.2870"></a>
-<span class="sourceLineNo">2871</span><a name="line.2871"></a>
-<span class="sourceLineNo">2872</span>    Scan scan = new Scan(row1);<a name="line.2872"></a>
-<span class="sourceLineNo">2873</span>    scan.addColumn(fam1, qf1);<a name="line.2873"></a>
-<span class="sourceLineNo">2874</span>    scan.setMaxVersions(MAX_VERSIONS);<a name="line.2874"></a>
-<span class="sourceLineNo">2875</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.2875"></a>
-<span class="sourceLineNo">2876</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.2876"></a>
-<span class="sourceLineNo">2877</span><a name="line.2877"></a>
-<span class="sourceLineNo">2878</span>    boolean hasNext = scanner.next(actual);<a name="line.2878"></a>
-<span class="sourceLineNo">2879</span>    assertEquals(false, hasNext);<a name="line.2879"></a>
-<span class="sourceLineNo">2880</span><a name="line.2880"></a>
-<span class="sourceLineNo">2881</span>    // Verify result<a name="line.2881"></a>
-<span class="sourceLineNo">2882</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.2882"></a>
-<span class="sourceLineNo">2883</span>      assertEquals(expected.get(i), actual.get(i));<a name="line.2883"></a>
-<span class="sourceLineNo">2884</span>    }<a name="line.2884"></a>
-<span class="sourceLineNo">2885</span>  }<a name="line.2885"></a>
-<span class="sourceLineNo">2886</span><a name="line.2886"></a>
-<span class="sourceLineNo">2887</span>  @Test<a name="line.2887"></a>
-<span class="sourceLineNo">2888</span>  public void testScanner_ExplicitColumns_FromFilesOnly_EnforceVersions() throws IOException {<a name="line.2888"></a>
-<span class="sourceLineNo">2889</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2889"></a>
-<span class="sourceLineNo">2890</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.2890"></a>
-<span class="sourceLineNo">2891</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.2891"></a>
-<span class="sourceLineNo">2892</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2892"></a>
-<span class="sourceLineNo">2893</span>    byte[][] families = { fam1 };<a name="line.2893"></a>
-<span class="sourceLineNo">2894</span><a name="line.2894"></a>
-<span class="sourceLineNo">2895</span>    long ts1 = 1; // System.currentTimeMillis();<a name="line.2895"></a>
-<span class="sourceLineNo">2896</span>    long ts2 = ts1 + 1;<a name="line.2896"></a>
-<span class="sourceLineNo">2897</span>    long ts3 = ts1 + 2;<a name="line.2897"></a>
-<span class="sourceLineNo">2898</span><a name="line.2898"></a>
-<span class="sourceLineNo">2899</span>    // Setting up region<a name="line.2899"></a>
-<span class="sourceLineNo">2900</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2900"></a>
-<span class="sourceLineNo">2901</span>    // Putting data in Region<a name="line.2901"></a>
-<span class="sourceLineNo">2902</span>    Put put = null;<a name="line.2902"></a>
-<span class="sourceLineNo">2903</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.2903"></a>
-<span class="sourceLineNo">2904</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.2904"></a>
-<span class="sourceLineNo">2905</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.2905"></a>
-<span class="sourceLineNo">2906</span><a name="line.2906"></a>
-<span class="sourceLineNo">2907</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.2907"></a>
-<span class="sourceLineNo">2908</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.2908"></a>
-<span class="sourceLineNo">2909</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.2909"></a>
-<span class="sourceLineNo">2910</span><a name="line.2910"></a>
-<span class="sourceLineNo">2911</span>    put = new Put(row1);<a name="line.2911"></a>
-<span class="sourceLineNo">2912</span>    put.add(kv13);<a name="line.2912"></a>
-<span class="sourceLineNo">2913</span>    put.add(kv12);<a name="line.2913"></a>
-<span class="sourceLineNo">2914</span>    put.add(kv11);<a name="line.2914"></a>
-<span class="sourceLineNo">2915</span>    put.add(kv23);<a name="line.2915"></a>
-<span class="sourceLineNo">2916</span>    put.add(kv22);<a name="line.2916"></a>
-<span class="sourceLineNo">2917</span>    put.add(kv21);<a name="line.2917"></a>
-<span class="sourceLineNo">2918</span>    region.put(put);<a name="line.2918"></a>
-<span class="sourceLineNo">2919</span>    region.flush(true);<a name="line.2919"></a>
+<span class="sourceLineNo">2768</span>      e.printStackTrace();<a name="line.2768"></a>
+<span class="sourceLineNo">2769</span>      fail("Got IOException during initHRegion, " + e.getMessage());<a name="line.2769"></a>
+<span class="sourceLineNo">2770</span>    }<a name="line.2770"></a>
+<span class="sourceLineNo">2771</span>    region.closed.set(true);<a name="line.2771"></a>
+<span class="sourceLineNo">2772</span>    try {<a name="line.2772"></a>
+<span class="sourceLineNo">2773</span>      region.getScanner(null);<a name="line.2773"></a>
+<span class="sourceLineNo">2774</span>      fail("Expected to get an exception during getScanner on a region that is closed");<a name="line.2774"></a>
+<span class="sourceLineNo">2775</span>    } catch (NotServingRegionException e) {<a name="line.2775"></a>
+<span class="sourceLineNo">2776</span>      // this is the correct exception that is expected<a name="line.2776"></a>
+<span class="sourceLineNo">2777</span>    } catch (IOException e) {<a name="line.2777"></a>
+<span class="sourceLineNo">2778</span>      fail("Got wrong type of exception - should be a NotServingRegionException, " +<a name="line.2778"></a>
+<span class="sourceLineNo">2779</span>          "but was an IOException: "<a name="line.2779"></a>
+<span class="sourceLineNo">2780</span>          + e.getMessage());<a name="line.2780"></a>
+<span class="sourceLineNo">2781</span>    }<a name="line.2781"></a>
+<span class="sourceLineNo">2782</span>  }<a name="line.2782"></a>
+<span class="sourceLineNo">2783</span><a name="line.2783"></a>
+<span class="sourceLineNo">2784</span>  @Test<a name="line.2784"></a>
+<span class="sourceLineNo">2785</span>  public void testRegionScanner_Next() throws IOException {<a name="line.2785"></a>
+<span class="sourceLineNo">2786</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2786"></a>
+<span class="sourceLineNo">2787</span>    byte[] row2 = Bytes.toBytes("row2");<a name="line.2787"></a>
+<span class="sourceLineNo">2788</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2788"></a>
+<span class="sourceLineNo">2789</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2789"></a>
+<span class="sourceLineNo">2790</span>    byte[] fam3 = Bytes.toBytes("fam3");<a name="line.2790"></a>
+<span class="sourceLineNo">2791</span>    byte[] fam4 = Bytes.toBytes("fam4");<a name="line.2791"></a>
+<span class="sourceLineNo">2792</span><a name="line.2792"></a>
+<span class="sourceLineNo">2793</span>    byte[][] families = { fam1, fam2, fam3, fam4 };<a name="line.2793"></a>
+<span class="sourceLineNo">2794</span>    long ts = System.currentTimeMillis();<a name="line.2794"></a>
+<span class="sourceLineNo">2795</span><a name="line.2795"></a>
+<span class="sourceLineNo">2796</span>    // Setting up region<a name="line.2796"></a>
+<span class="sourceLineNo">2797</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2797"></a>
+<span class="sourceLineNo">2798</span>    // Putting data in Region<a name="line.2798"></a>
+<span class="sourceLineNo">2799</span>    Put put = null;<a name="line.2799"></a>
+<span class="sourceLineNo">2800</span>    put = new Put(row1);<a name="line.2800"></a>
+<span class="sourceLineNo">2801</span>    put.addColumn(fam1, (byte[]) null, ts, null);<a name="line.2801"></a>
+<span class="sourceLineNo">2802</span>    put.addColumn(fam2, (byte[]) null, ts, null);<a name="line.2802"></a>
+<span class="sourceLineNo">2803</span>    put.addColumn(fam3, (byte[]) null, ts, null);<a name="line.2803"></a>
+<span class="sourceLineNo">2804</span>    put.addColumn(fam4, (byte[]) null, ts, null);<a name="line.2804"></a>
+<span class="sourceLineNo">2805</span>    region.put(put);<a name="line.2805"></a>
+<span class="sourceLineNo">2806</span><a name="line.2806"></a>
+<span class="sourceLineNo">2807</span>    put = new Put(row2);<a name="line.2807"></a>
+<span class="sourceLineNo">2808</span>    put.addColumn(fam1, (byte[]) null, ts, null);<a name="line.2808"></a>
+<span class="sourceLineNo">2809</span>    put.addColumn(fam2, (byte[]) null, ts, null);<a name="line.2809"></a>
+<span class="sourceLineNo">2810</span>    put.addColumn(fam3, (byte[]) null, ts, null);<a name="line.2810"></a>
+<span class="sourceLineNo">2811</span>    put.addColumn(fam4, (byte[]) null, ts, null);<a name="line.2811"></a>
+<span class="sourceLineNo">2812</span>    region.put(put);<a name="line.2812"></a>
+<span class="sourceLineNo">2813</span><a name="line.2813"></a>
+<span class="sourceLineNo">2814</span>    Scan scan = new Scan();<a name="line.2814"></a>
+<span class="sourceLineNo">2815</span>    scan.addFamily(fam2);<a name="line.2815"></a>
+<span class="sourceLineNo">2816</span>    scan.addFamily(fam4);<a name="line.2816"></a>
+<span class="sourceLineNo">2817</span>    InternalScanner is = region.getScanner(scan);<a name="line.2817"></a>
+<span class="sourceLineNo">2818</span><a name="line.2818"></a>
+<span class="sourceLineNo">2819</span>    List&lt;Cell&gt; res = null;<a name="line.2819"></a>
+<span class="sourceLineNo">2820</span><a name="line.2820"></a>
+<span class="sourceLineNo">2821</span>    // Result 1<a name="line.2821"></a>
+<span class="sourceLineNo">2822</span>    List&lt;Cell&gt; expected1 = new ArrayList&lt;&gt;();<a name="line.2822"></a>
+<span class="sourceLineNo">2823</span>    expected1.add(new KeyValue(row1, fam2, null, ts, KeyValue.Type.Put, null));<a name="line.2823"></a>
+<span class="sourceLineNo">2824</span>    expected1.add(new KeyValue(row1, fam4, null, ts, KeyValue.Type.Put, null));<a name="line.2824"></a>
+<span class="sourceLineNo">2825</span><a name="line.2825"></a>
+<span class="sourceLineNo">2826</span>    res = new ArrayList&lt;&gt;();<a name="line.2826"></a>
+<span class="sourceLineNo">2827</span>    is.next(res);<a name="line.2827"></a>
+<span class="sourceLineNo">2828</span>    for (int i = 0; i &lt; res.size(); i++) {<a name="line.2828"></a>
+<span class="sourceLineNo">2829</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected1.get(i), res.get(i)));<a name="line.2829"></a>
+<span class="sourceLineNo">2830</span>    }<a name="line.2830"></a>
+<span class="sourceLineNo">2831</span><a name="line.2831"></a>
+<span class="sourceLineNo">2832</span>    // Result 2<a name="line.2832"></a>
+<span class="sourceLineNo">2833</span>    List&lt;Cell&gt; expected2 = new ArrayList&lt;&gt;();<a name="line.2833"></a>
+<span class="sourceLineNo">2834</span>    expected2.add(new KeyValue(row2, fam2, null, ts, KeyValue.Type.Put, null));<a name="line.2834"></a>
+<span class="sourceLineNo">2835</span>    expected2.add(new KeyValue(row2, fam4, null, ts, KeyValue.Type.Put, null));<a name="line.2835"></a>
+<span class="sourceLineNo">2836</span><a name="line.2836"></a>
+<span class="sourceLineNo">2837</span>    res = new ArrayList&lt;&gt;();<a name="line.2837"></a>
+<span class="sourceLineNo">2838</span>    is.next(res);<a name="line.2838"></a>
+<span class="sourceLineNo">2839</span>    for (int i = 0; i &lt; res.size(); i++) {<a name="line.2839"></a>
+<span class="sourceLineNo">2840</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected2.get(i), res.get(i)));<a name="line.2840"></a>
+<span class="sourceLineNo">2841</span>    }<a name="line.2841"></a>
+<span class="sourceLineNo">2842</span>  }<a name="line.2842"></a>
+<span class="sourceLineNo">2843</span><a name="line.2843"></a>
+<span class="sourceLineNo">2844</span>  @Test<a name="line.2844"></a>
+<span class="sourceLineNo">2845</span>  public void testScanner_ExplicitColumns_FromMemStore_EnforceVersions() throws IOException {<a name="line.2845"></a>
+<span class="sourceLineNo">2846</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2846"></a>
+<span class="sourceLineNo">2847</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.2847"></a>
+<span class="sourceLineNo">2848</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.2848"></a>
+<span class="sourceLineNo">2849</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2849"></a>
+<span class="sourceLineNo">2850</span>    byte[][] families = { fam1 };<a name="line.2850"></a>
+<span class="sourceLineNo">2851</span><a name="line.2851"></a>
+<span class="sourceLineNo">2852</span>    long ts1 = System.currentTimeMillis();<a name="line.2852"></a>
+<span class="sourceLineNo">2853</span>    long ts2 = ts1 + 1;<a name="line.2853"></a>
+<span class="sourceLineNo">2854</span>    long ts3 = ts1 + 2;<a name="line.2854"></a>
+<span class="sourceLineNo">2855</span><a name="line.2855"></a>
+<span class="sourceLineNo">2856</span>    // Setting up region<a name="line.2856"></a>
+<span class="sourceLineNo">2857</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2857"></a>
+<span class="sourceLineNo">2858</span>    // Putting data in Region<a name="line.2858"></a>
+<span class="sourceLineNo">2859</span>    Put put = null;<a name="line.2859"></a>
+<span class="sourceLineNo">2860</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.2860"></a>
+<span class="sourceLineNo">2861</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.2861"></a>
+<span class="sourceLineNo">2862</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.2862"></a>
+<span class="sourceLineNo">2863</span><a name="line.2863"></a>
+<span class="sourceLineNo">2864</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.2864"></a>
+<span class="sourceLineNo">2865</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.2865"></a>
+<span class="sourceLineNo">2866</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.2866"></a>
+<span class="sourceLineNo">2867</span><a name="line.2867"></a>
+<span class="sourceLineNo">2868</span>    put = new Put(row1);<a name="line.2868"></a>
+<span class="sourceLineNo">2869</span>    put.add(kv13);<a name="line.2869"></a>
+<span class="sourceLineNo">2870</span>    put.add(kv12);<a name="line.2870"></a>
+<span class="sourceLineNo">2871</span>    put.add(kv11);<a name="line.2871"></a>
+<span class="sourceLineNo">2872</span>    put.add(kv23);<a name="line.2872"></a>
+<span class="sourceLineNo">2873</span>    put.add(kv22);<a name="line.2873"></a>
+<span class="sourceLineNo">2874</span>    put.add(kv21);<a name="line.2874"></a>
+<span class="sourceLineNo">2875</span>    region.put(put);<a name="line.2875"></a>
+<span class="sourceLineNo">2876</span><a name="line.2876"></a>
+<span class="sourceLineNo">2877</span>    // Expected<a name="line.2877"></a>
+<span class="sourceLineNo">2878</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.2878"></a>
+<span class="sourceLineNo">2879</span>    expected.add(kv13);<a name="line.2879"></a>
+<span class="sourceLineNo">2880</span>    expected.add(kv12);<a name="line.2880"></a>
+<span class="sourceLineNo">2881</span><a name="line.2881"></a>
+<span class="sourceLineNo">2882</span>    Scan scan = new Scan(row1);<a name="line.2882"></a>
+<span class="sourceLineNo">2883</span>    scan.addColumn(fam1, qf1);<a name="line.2883"></a>
+<span class="sourceLineNo">2884</span>    scan.setMaxVersions(MAX_VERSIONS);<a name="line.2884"></a>
+<span class="sourceLineNo">2885</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.2885"></a>
+<span class="sourceLineNo">2886</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.2886"></a>
+<span class="sourceLineNo">2887</span><a name="line.2887"></a>
+<span class="sourceLineNo">2888</span>    boolean hasNext = scanner.next(actual);<a name="line.2888"></a>
+<span class="sourceLineNo">2889</span>    assertEquals(false, hasNext);<a name="line.2889"></a>
+<span class="sourceLineNo">2890</span><a name="line.2890"></a>
+<span class="sourceLineNo">2891</span>    // Verify result<a name="line.2891"></a>
+<span class="sourceLineNo">2892</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.2892"></a>
+<span class="sourceLineNo">2893</span>      assertEquals(expected.get(i), actual.get(i));<a name="line.2893"></a>
+<span class="sourceLineNo">2894</span>    }<a name="line.2894"></a>
+<span class="sourceLineNo">2895</span>  }<a name="line.2895"></a>
+<span class="sourceLineNo">2896</span><a name="line.2896"></a>
+<span class="sourceLineNo">2897</span>  @Test<a name="line.2897"></a>
+<span class="sourceLineNo">2898</span>  public void testScanner_ExplicitColumns_FromFilesOnly_EnforceVersions() throws IOException {<a name="line.2898"></a>
+<span class="sourceLineNo">2899</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2899"></a>
+<span class="sourceLineNo">2900</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.2900"></a>
+<span class="sourceLineNo">2901</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.2901"></a>
+<span class="sourceLineNo">2902</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2902"></a>
+<span class="sourceLineNo">2903</span>    byte[][] families = { fam1 };<a name="line.2903"></a>
+<span class="sourceLineNo">2904</span><a name="line.2904"></a>
+<span class="sourceLineNo">2905</span>    long ts1 = 1; // System.currentTimeMillis();<a name="line.2905"></a>
+<span class="sourceLineNo">2906</span>    long ts2 = ts1 + 1;<a name="line.2906"></a>
+<span class="sourceLineNo">2907</span>    long ts3 = ts1 + 2;<a name="line.2907"></a>
+<span class="sourceLineNo">2908</span><a name="line.2908"></a>
+<span class="sourceLineNo">2909</span>    // Setting up region<a name="line.2909"></a>
+<span class="sourceLineNo">2910</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2910"></a>
+<span class="sourceLineNo">2911</span>    // Putting data in Region<a name="line.2911"></a>
+<span class="sourceLineNo">2912</span>    Put put = null;<a name="line.2912"></a>
+<span class="sourceLineNo">2913</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.2913"></a>
+<span class="sourceLineNo">2914</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.2914"></a>
+<span class="sourceLineNo">2915</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.2915"></a>
+<span class="sourceLineNo">2916</span><a name="line.2916"></a>
+<span class="sourceLineNo">2917</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.2917"></a>
+<span class="sourceLineNo">2918</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.2918"></a>
+<span class="sourceLineNo">2919</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.2919"></a>
 <span class="sourceLineNo">2920</span><a name="line.2920"></a>
-<span class="sourceLineNo">2921</span>    // Expected<a name="line.2921"></a>
-<span class="sourceLineNo">2922</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.2922"></a>
-<span class="sourceLineNo">2923</span>    expected.add(kv13);<a name="line.2923"></a>
-<span class="sourceLineNo">2924</span>    expected.add(kv12);<a name="line.2924"></a>
-<span class="sourceLineNo">2925</span>    expected.add(kv23);<a name="line.2925"></a>
-<span class="sourceLineNo">2926</span>    expected.add(kv22);<a name="line.2926"></a>
-<span class="sourceLineNo">2927</span><a name="line.2927"></a>
-<span class="sourceLineNo">2928</span>    Scan scan = new Scan(row1);<a name="line.2928"></a>
-<span class="sourceLineNo">2929</span>    scan.addColumn(fam1, qf1);<a name="line.2929"></a>
-<span class="sourceLineNo">2930</span>    scan.addColumn(fam1, qf2);<a name="line.2930"></a>
-<span class="sourceLineNo">2931</span>    scan.setMaxVersions(MAX_VERSIONS);<a name="line.2931"></a>
-<span class="sourceLineNo">2932</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.2932"></a>
-<span class="sourceLineNo">2933</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.2933"></a>
-<span class="sourceLineNo">2934</span><a name="line.2934"></a>
-<span class="sourceLineNo">2935</span>    boolean hasNext = scanner.next(actual);<a name="line.2935"></a>
-<span class="sourceLineNo">2936</span>    assertEquals(false, hasNext);<a name="line.2936"></a>
+<span class="sourceLineNo">2921</span>    put = new Put(row1);<a name="line.2921"></a>
+<span class="sourceLineNo">2922</span>    put.add(kv13);<a name="line.2922"></a>
+<span class="sourceLineNo">2923</span>    put.add(kv12);<a name="line.2923"></a>
+<span class="sourceLineNo">2924</span>    put.add(kv11);<a name="line.2924"></a>
+<span class="sourceLineNo">2925</span>    put.add(kv23);<a name="line.2925"></a>
+<span class="sourceLineNo">2926</span>    put.add(kv22);<a name="line.2926"></a>
+<span class="sourceLineNo">2927</span>    put.add(kv21);<a name="line.2927"></a>
+<span class="sourceLineNo">2928</span>    region.put(put);<a name="line.2928"></a>
+<span class="sourceLineNo">2929</span>    region.flush(true);<a name="line.2929"></a>
+<span class="sourceLineNo">2930</span><a name="line.2930"></a>
+<span class="sourceLineNo">2931</span>    // Expected<a name="line.2931"></a>
+<span class="sourceLineNo">2932</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.2932"></a>
+<span class="sourceLineNo">2933</span>    expected.add(kv13);<a name="line.2933"></a>
+<span class="sourceLineNo">2934</span>    expected.add(kv12);<a name="line.2934"></a>
+<span class="sourceLineNo">2935</span>    expected.add(kv23);<a name="line.2935"></a>
+<span class="sourceLineNo">2936</span>    expected.add(kv22);<a name="line.2936"></a>
 <span class="sourceLineNo">2937</span><a name="line.2937"></a>
-<span class="sourceLineNo">2938</span>    // Verify result<a name="line.2938"></a>
-<span class="sourceLineNo">2939</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.2939"></a>
-<span class="sourceLineNo">2940</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected.get(i), actual.get(i)));<a name="line.2940"></a>
-<span class="sourceLineNo">2941</span>    }<a name="line.2941"></a>
-<span class="sourceLineNo">2942</span>  }<a name="line.2942"></a>
-<span class="sourceLineNo">2943</span><a name="line.2943"></a>
-<span class="sourceLineNo">2944</span>  @Test<a name="line.2944"></a>
-<span class="sourceLineNo">2945</span>  public void testScanner_ExplicitColumns_FromMemStoreAndFiles_EnforceVersions() throws<a name="line.2945"></a>
-<span class="sourceLineNo">2946</span>      IOException {<a name="line.2946"></a>
-<span class="sourceLineNo">2947</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2947"></a>
-<span class="sourceLineNo">2948</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2948"></a>
-<span class="sourceLineNo">2949</span>    byte[][] families = { fam1 };<a name="line.2949"></a>
-<span class="sourceLineNo">2950</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.2950"></a>
-<span class="sourceLineNo">2951</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.2951"></a>
-<span class="sourceLineNo">2952</span><a name="line.2952"></a>
-<span class="sourceLineNo">2953</span>    long ts1 = 1;<a name="line.2953"></a>
-<span class="sourceLineNo">2954</span>    long ts2 = ts1 + 1;<a name="line.2954"></a>
-<span class="sourceLineNo">2955</span>    long ts3 = ts1 + 2;<a name="line.2955"></a>
-<span class="sourceLineNo">2956</span>    long ts4 = ts1 + 3;<a name="line.2956"></a>
-<span class="sourceLineNo">2957</span><a name="line.2957"></a>
-<span class="sourceLineNo">2958</span>    // Setting up region<a name="line.2958"></a>
-<span class="sourceLineNo">2959</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2959"></a>
-<span class="sourceLineNo">2960</span>    // Putting data in Region<a name="line.2960"></a>
-<span class="sourceLineNo">2961</span>    KeyValue kv14 = new KeyValue(row1, fam1, qf1, ts4, KeyValue.Type.Put, null);<a name="line.2961"></a>
-<span class="sourceLineNo">2962</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.2962"></a>
-<span class="sourceLineNo">2963</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.2963"></a>
-<span class="sourceLineNo">2964</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.2964"></a>
-<span class="sourceLineNo">2965</span><a name="line.2965"></a>
-<span class="sourceLineNo">2966</span>    KeyValue kv24 = new KeyValue(row1, fam1, qf2, ts4, KeyValue.Type.Put, null);<a name="line.2966"></a>
-<span class="sourceLineNo">2967</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.2967"></a>
-<span class="sourceLineNo">2968</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.2968"></a>
-<span class="sourceLineNo">2969</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.2969"></a>
-<span class="sourceLineNo">2970</span><a name="line.2970"></a>
-<span class="sourceLineNo">2971</span>    Put put = null;<a name="line.2971"></a>
-<span class="sourceLineNo">2972</span>    put = new Put(row1);<a name="line.2972"></a>
-<span class="sourceLineNo">2973</span>    put.add(kv14);<a name="line.2973"></a>
-<span class="sourceLineNo">2974</span>    put.add(kv24);<a name="line.2974"></a>
-<span class="sourceLineNo">2975</span>    region.put(put);<a name="line.2975"></a>
-<span class="sourceLineNo">2976</span>    region.flush(true);<a name="line.2976"></a>
-<span class="sourceLineNo">2977</span><a name="line.2977"></a>
-<span class="sourceLineNo">2978</span>    put = new Put(row1);<a name="line.2978"></a>
-<span class="sourceLineNo">2979</span>    put.add(kv23);<a name="line.2979"></a>
-<span class="sourceLineNo">2980</span>    put.add(kv13);<a name="line.2980"></a>
-<span class="sourceLineNo">2981</span>    region.put(put);<a name="line.2981"></a>
-<span class="sourceLineNo">2982</span>    region.flush(true);<a name="line.2982"></a>
-<span class="sourceLineNo">2983</span><a name="line.2983"></a>
-<span class="sourceLineNo">2984</span>    put = new Put(row1);<a name="line.2984"></a>
-<span class="sourceLineNo">2985</span>    put.add(kv22);<a name="line.2985"></a>
-<span class="sourceLineNo">2986</span>    put.add(kv12);<a name="line.2986"></a>
-<span class="sourceLineNo">2987</span>    region.put(put);<a name="line.2987"></a>
-<span class="sourceLineNo">2988</span>    region.flush(true);<a name="line.2988"></a>
-<span class="sourceLineNo">2989</span><a name="line.2989"></a>
-<span class="sourceLineNo">2990</span>    put = new Put(row1);<a name="line.2990"></a>
-<span class="sourceLineNo">2991</span>    put.add(kv21);<a name="line.2991"></a>
-<span class="sourceLineNo">2992</span>    put.add(kv11);<a name="line.2992"></a>
-<span class="sourceLineNo">2993</span>    region.put(put);<a name="line.2993"></a>
-<span class="sourceLineNo">2994</span><a name="line.2994"></a>
-<span class="sourceLineNo">2995</span>    // Expected<a name="line.2995"></a>
-<span class="sourceLineNo">2996</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.2996"></a>
-<span class="sourceLineNo">2997</span>    expected.add(kv14);<a name="line.2997"></a>
-<span class="sourceLineNo">2998</span>    expected.add(kv13);<a name="line.2998"></a>
-<span class="sourceLineNo">2999</span>    expected.add(kv12);<a name="line.2999"></a>
-<span class="sourceLineNo">3000</span>    expected.add(kv24);<a name="line.3000"></a>
-<span class="sourceLineNo">3001</span>    expected.add(kv23);<a name="line.3001"></a>
-<span class="sourceLineNo">3002</span>    expected.add(kv22);<a name="line.3002"></a>
-<span class="sourceLineNo">3003</span><a name="line.3003"></a>
-<span class="sourceLineNo">3004</span>    Scan scan = new Scan(row1);<a name="line.3004"></a>
-<span class="sourceLineNo">3005</span>    scan.addColumn(fam1, qf1);<a name="line.3005"></a>
-<span class="sourceLineNo">3006</span>    scan.addColumn(fam1, qf2);<a name="line.3006"></a>
-<span class="sourceLineNo">3007</span>    int versions = 3;<a name="line.3007"></a>
-<span class="sourceLineNo">3008</span>    scan.setMaxVersions(versions);<a name="line.3008"></a>
-<span class="sourceLineNo">3009</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.3009"></a>
-<span class="sourceLineNo">3010</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.3010"></a>
-<span class="sourceLineNo">3011</span><a name="line.3011"></a>
-<span class="sourceLineNo">3012</span>    boolean hasNext = scanner.next(actual);<a name="line.3012"></a>
-<span class="sourceLineNo">3013</span>    assertEquals(false, hasNext);<a name="line.3013"></a>
-<span class="sourceLineNo">3014</span><a name="line.3014"></a>
-<span class="sourceLineNo">3015</span>    // Verify result<a name="line.3015"></a>
-<span class="sourceLineNo">3016</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.3016"></a>
-<span class="sourceLineNo">3017</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected.get(i), actual.get(i)));<a name="line.3017"></a>
-<span class="sourceLineNo">3018</span>    }<a name="line.3018"></a>
-<span class="sourceLineNo">3019</span>  }<a name="line.3019"></a>
-<span class="sourceLineNo">3020</span><a name="line.3020"></a>
-<span class="sourceLineNo">3021</span>  @Test<a name="line.3021"></a>
-<span class="sourceLineNo">3022</span>  public void testScanner_Wildcard_FromMemStore_EnforceVersions() throws IOException {<a name="line.3022"></a>
-<span class="sourceLineNo">3023</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.3023"></a>
-<span class="sourceLineNo">3024</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.3024"></a>
-<span class="sourceLineNo">3025</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.3025"></a>
-<span class="sourceLineNo">3026</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.3026"></a>
-<span class="sourceLineNo">3027</span>    byte[][] families = { fam1 };<a name="line.3027"></a>
-<span class="sourceLineNo">3028</span><a name="line.3028"></a>
-<span class="sourceLineNo">3029</span>    long ts1 = System.currentTimeMillis();<a name="line.3029"></a>
-<span class="sourceLineNo">3030</span>    long ts2 = ts1 + 1;<a name="line.3030"></a>
-<span class="sourceLineNo">3031</span>    long ts3 = ts1 + 2;<a name="line.3031"></a>
-<span class="sourceLineNo">3032</span><a name="line.3032"></a>
-<span class="sourceLineNo">3033</span>    // Setting up region<a name="line.3033"></a>
-<span class="sourceLineNo">3034</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.3034"></a>
-<span class="sourceLineNo">3035</span>    // Putting data in Region<a name="line.3035"></a>
-<span class="sourceLineNo">3036</span>    Put put = null;<a name="line.3036"></a>
-<span class="sourceLineNo">3037</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.3037"></a>
-<span class="sourceLineNo">3038</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.3038"></a>
-<span class="sourceLineNo">3039</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.3039"></a>
-<span class="sourceLineNo">3040</span><a name="line.3040"></a>
-<span class="sourceLineNo">3041</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.3041"></a>
-<span class="sourceLineNo">3042</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.3042"></a>
-<span class="sourceLineNo">3043</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.3043"></a>
-<span class="sourceLineNo">3044</span><a name="line.3044"></a>
-<span class="sourceLineNo">3045</span>    put = new Put(row1);<a name="line.3045"></a>
-<span class="sourceLineNo">3046</span>    put.add(kv13);<a name="line.3046"></a>
-<span class="sourceLineNo">3047</span>    put.add(kv12);<a name="line.3047"></a>
-<span class="sourceLineNo">3048</span>    put.add(kv11);<a name="line.3048"></a>
-<span class="sourceLineNo">3049</span>    put.add(kv23);<a name="line.3049"></a>
-<span class="sourceLineNo">3050</span>    put.add(kv22);<a name="line.3050"></a>
-<span class="sourceLineNo">3051</span>    put.add(kv21);<a name="line.3051"></a>
-<span class="sourceLineNo">3052</span>    region.put(put);<a name="line.3052"></a>
-<span class="sourceLineNo">3053</span><a name="line.3053"></a>
-<span class="sourceLineNo">3054</span>    // Expected<a name="line.3054"></a>
-<span class="sourceLineNo">3055</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.3055"></a>
-<span class="sourceLineNo">3056</span>    expected.add(kv13);<a name="line.3056"></a>
-<span class="sourceLineNo">3057</span>    expected.add(kv12);<a name="line.3057"></a>
-<span class="sourceLineNo">3058</span>    expected.add(kv23);<a name="line.3058"></a>
-<span class="sourceLineNo">3059</span>    expected.add(kv22);<a name="line.3059"></a>
-<span class="sourceLineNo">3060</span><a name="line.3060"></a>
-<span class="sourceLineNo">3061</span>    Scan scan = new Scan(row1);<a name="line.3061"></a>
-<span class="sourceLineNo">3062</span>    scan.addFamily(fam1);<a name="line.3062"></a>
-<span class="sourceLineNo">3063</span>    scan.setMaxVersions(MAX_VERSIONS);<a name="line.3063"></a>
-<span class="sourceLineNo">3064</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.3064"></a>
-<span class="sourceLineNo">3065</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.3065"></a>
-<span class="sourceLineNo">3066</span><a name="line.3066"></a>
-<span class="sourceLineNo">3067</span>    boolean hasNext = scanner.next(actual);<a name="line.3067"></a>
-<span class="sourceLineNo">3068</span>    assertEquals(false, hasNext);<a name="line.3068"></a>
-<span class="sourceLineNo">3069</span><a name="line.3069"></a>
-<span class="sourceLineNo">3070</span>    // Verify result<a name="line.3070"></a>
-<span class="sourceLineNo">3071</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.3071"></a>
-<span class="sourceLineNo">3072</span>      assertEquals(expected.get(i), actual.get(i));<a name="line.3072"></a>
-<span class="sourceLineNo">3073</span>    }<a name="line.3073"></a>
-<span class="sourceLineNo">3074</span>  }<a name="line.3074"></a>
-<span class="sourceLineNo">3075</span><a name="line.3075"></a>
-<span class="sourceLineNo">3076</span>  @Test<a name="line.3076"></a>
-<span class="sourceLineNo">3077</span>  public void testScanner_Wildcard_FromFilesOnly_EnforceVersions() throws IOException {<a name="line.3077"></a>
-<span class="sourceLineNo">3078</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.3078"></a>
-<span class="sourceLineNo">3079</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.3079"></a>
-<span class="sourceLineNo">3080</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.3080"></a>
-<span class="sourceLineNo">3081</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.3081"></a>
-<span class="sourceLineNo">3082</span><a name="line.3082"></a>
-<span class="sourceLineNo">3083</span>    long ts1 = 1; // System.currentTimeMillis();<a name="line.3083"></a>
-<span class="sourceLineNo">3084</span>    long ts2 = ts1 + 1;<a name="line.3084"></a>
-<span class="sourceLineNo">3085</span>    long ts3 = ts1 + 2;<a name="line.3085"></a>
-<span class="sourceLineNo">3086</span><a name="line.3086"></a>
-<span class="sourceLineNo">3087</span>    // Setting up region<a name="line.3087"></a>
-<span class="sourceLineNo">3088</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.3088"></a>
-<span class="sourceLineNo">3089</span>    // Putting data in Region<a name="line.3089"></a>
-<span class="sourceLineNo">3090</span>    Put put = null;<a name="line.3090"></a>
-<span class="sourceLineNo">3091</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.3091"></a>
-<span class="sourceLineNo">3092</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.3092"></a>
-<span class="sourceLineNo">3093</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.3093"></a>
-<span class="sourceLineNo">3094</span><a name="line.3094"></a>
-<span class="sourceLineNo">3095</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.3095"></a>
-<span class="sourceLineNo">3096</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.3096"></a>
-<span class="sourceLineNo">3097</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.3097"></a>
-<span class="sourceLineNo">3098</span><a name="line.3098"></a>
-<span class="sourceLineNo">3099</span>    put = new Put(row1);<a name="line.3099"></a>
-<span class="sourceLineNo">3100</span>    put.add(kv13);<a name="line.3100"></a>
-<span class="sourceLineNo">3101</span>    put.add(kv12);<a name="line.3101"></a>
-<span class="sourceLineNo">3102</span>    put.add(kv11);<a name="line.3102"></a>
-<span class="sourceLineNo">3103</span>    put.add(kv23);<a name="line.3103"></a>
-<span class="sourceLineNo">3104</span>    put.add(kv22);<a name="line.3104"></a>
-<span class="sourceLineNo">3105</span>    put.add(kv21);<a name="line.3105"></a>
-<span class="sourceLineNo">3106</span>    region.put(put);<a name="line.3106"></a>
-<span class="sourceLineNo">3107</span>    region.flush(true);<a name="line.3107"></a>
+<span class="sourceLineNo">2938</span>    Scan scan = new Scan(row1);<a name="line.2938"></a>
+<span class="sourceLineNo">2939</span>    scan.addColumn(fam1, qf1);<a name="line.2939"></a>
+<span class="sourceLineNo">2940</span>    scan.addColumn(fam1, qf2);<a name="line.2940"></a>
+<span class="sourceLineNo">2941</span>    scan.setMaxVersions(MAX_VERSIONS);<a name="line.2941"></a>
+<span class="sourceLineNo">2942</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.2942"></a>
+<span class="sourceLineNo">2943</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.2943"></a>
+<span class="sourceLineNo">2944</span><a name="line.2944"></a>
+<span class="sourceLineNo">2945</span>    boolean hasNext = scanner.next(actual);<a name="line.2945"></a>
+<span class="sourceLineNo">2946</span>    assertEquals(false, hasNext);<a name="line.2946"></a>
+<span class="sourceLineNo">2947</span><a name="line.2947"></a>
+<span class="sourceLineNo">2948</span>    // Verify result<a name="line.2948"></a>
+<span class="sourceLineNo">2949</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.2949"></a>
+<span class="sourceLineNo">2950</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected.get(i), actual.get(i)));<a name="line.2950"></a>
+<span class="sourceLineNo">2951</span>    }<a name="line.2951"></a>
+<span class="sourceLineNo">2952</span>  }<a name="line.2952"></a>
+<span class="sourceLineNo">2953</span><a name="line.2953"></a>
+<span class="sourceLineNo">2954</span>  @Test<a name="line.2954"></a>
+<span class="sourceLineNo">2955</span>  public void testScanner_ExplicitColumns_FromMemStoreAndFiles_EnforceVersions() throws<a name="line.2955"></a>
+<span class="sourceLineNo">2956</span>      IOException {<a name="line.2956"></a>
+<span class="sourceLineNo">2957</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2957"></a>
+<span class="sourceLineNo">2958</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2958"></a>
+<span class="sourceLineNo">2959</span>    byte[][] families = { fam1 };<a name="line.2959"></a>
+<span class="sourceLineNo">2960</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.2960"></a>
+<span class="sourceLineNo">2961</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.2961"></a>
+<span class="sourceLineNo">2962</span><a name="line.2962"></a>
+<span class="sourceLineNo">2963</span>    long ts1 = 1;<a name="line.2963"></a>
+<span class="sourceLineNo">2964</span>    long ts2 = ts1 + 1;<a name="line.2964"></a>
+<span class="sourceLineNo">2965</span>    long ts3 = ts1 + 2;<a name="line.2965"></a>
+<span class="sourceLineNo">2966</span>    long ts4 = ts1 + 3;<a name="line.2966"></a>
+<span class="sourceLineNo">2967</span><a name="line.2967"></a>
+<span class="sourceLineNo">2968</span>    // Setting up region<a name="line.2968"></a>
+<span class="sourceLineNo">2969</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2969"></a>
+<span class="sourceLineNo">2970</span>    // Putting data in Region<a name="line.2970"></a>
+<span class="sourceLineNo">2971</span>    KeyValue kv14 = new KeyValue(row1, fam1, qf1, ts4, KeyValue.Type.Put, null);<a name="line.2971"></a>
+<span class="sourceLineNo">2972</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.2972"></a>
+<span class="sourceLineNo">2973</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.2973"></a>
+<span class="sourceLineNo">2974</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.2974"></a>
+<span class="sourceLineNo">2975</span><a name="line.2975"></a>
+<span class="sourceLineNo">2976</span>    KeyValue kv24 = new KeyValue(row1, fam1, qf2, ts4, KeyValue.Type.Put, null);<a name="line.2976"></a>
+<span class="sourceLineNo">2977</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.2977"></a>
+<span class="sourceLineNo">2978</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.2978"></a>
+<span class="sourceLineNo">2979</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.2979"></a>
+<span class="sourceLineNo">2980</span><a name="line.2980"></a>
+<span class="sourceLineNo">2981</span>    Put put = null;<a name="line.2981"></a>
+<span class="sourceLineNo">2982</span>    put = new Put(row1);<a name="line.2982"></a>
+<span class="sourceLineNo">2983</span>    put.add(kv14);<a name="line.2983"></a>
+<span class="sourceLineNo">2984</span>    put.add(kv24);<a name="line.2984"></a>
+<span class="sourceLineNo">2985</span>    region.put(put);<a name="line.2985"></a>
+<span class="sourceLineNo">2986</span>    region.flush(true);<a name="line.2986"></a>
+<span class="sourceLineNo">2987</span><a name="line.2987"></a>
+<span class="sourceLineNo">2988</span>    put = new Put(row1);<a name="line.2988"></a>
+<span class="sourceLineNo">2989</span>    put.add(kv23);<a name="line.2989"></a>
+<span class="sourceLineNo">2990</span>    put.add(kv13);<a name="line.2990"></a>
+<span class="sourceLineNo">2991</span>    region.put(put);<a name="line.2991"></a>
+<span class="sourceLineNo">2992</span>    region.flush(true);<a name="line.2992"></a>
+<span class="sourceLineNo">2993</span><a name="line.2993"></a>
+<span class="sourceLineNo">2994</span>    put = new Put(row1);<a name="line.2994"></a>
+<span class="sourceLineNo">2995</span>    put.add(kv22);<a name="line.2995"></a>
+<span class="sourceLineNo">2996</span>    put.add(kv12);<a name="line.2996"></a>
+<span class="sourceLineNo">2997</span>    region.put(put);<a name="line.2997"></a>
+<span class="sourceLineNo">2998</span>    region.flush(true);<a name="line.2998"></a>
+<span class="sourceLineNo">2999</span><a name="line.2999"></a>
+<span class="sourceLineNo">3000</span>    put = new Put(row1);<a name="line.3000"></a>
+<span class="sourceLineNo">3001</span>    put.add(kv21);<a name="line.3001"></a>
+<span class="sourceLineNo">3002</span>    put.add(kv11);<a name="line.3002"></a>
+<span class="sourceLineNo">3003</span>    region.put(put);<a name="line.3003"></a>
+<span class="sourceLineNo">3004</span><a name="line.3004"></a>
+<span class="sourceLineNo">3005</span>    // Expected<a name="line.3005"></a>
+<span class="sourceLineNo">3006</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.3006"></a>
+<span class="sourceLineNo">3007</span>    expected.add(kv14);<a name="line.3007"></a>
+<span class="sourceLineNo">3008</span>    expected.add(kv13);<a name="line.3008"></a>
+<span class="sourceLineNo">3009</span>    expected.add(kv12);<a name="line.3009"></a>
+<span class="sourceLineNo">3010</span>    expected.add(kv24);<a name="line.3010"></a>
+<span class="sourceLineNo">3011</span>    expected.add(kv23);<a name="line.3011"></a>
+<span class="sourceLineNo">3012</span>    expected.add(kv22);<a name="line.3012"></a>
+<span class="sourceLineNo">3013</span><a name="line.3013"></a>
+<span class="sourceLineNo">3014</span>    Scan scan = new Scan(row1);<a name="line.3014"></a>
+<span class="sourceLineNo">3015</span>    scan.addColumn(fam1, qf1);<a name="line.3015"></a>
+<span class="sourceLineNo">3016</span>    scan.addColumn(fam1, qf2);<a name="line.3016"></a>
+<span class="sourceLineNo">3017</span>    int versions = 3;<a name="line.3017"></a>
+<span class="sourceLineNo">3018</span>    scan.setMaxVersions(versions);<a name="line.3018"></a>
+<span class="sourceLineNo">3019</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.3019"></a>
+<span class="sourceLineNo">3020</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.3020"></a>
+<span class="sourceLineNo">3021</span><a name="line.3021"></a>
+<span class="sourceLineNo">3022</span>    boolean hasNext = scanner.next(actual);<a name="line.3022"></a>
+<span class="sourceLineNo">3023</span>    assertEquals(false, hasNext);<a name="line.3023"></a>
+<span class="sourceLineNo">3024</span><a name="line.3024"></a>
+<span class="sourceLineNo">3025</span>    // Verify result<a name="line.3025"></a>
+<span class="sourceLineNo">3026</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.3026"></a>
+<span class="sourceLineNo">3027</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected.get(i), actual.get(i)));<a name="line.3027"></a>
+<span class="sourceLineNo">3028</span>    }<a name="line.3028"></a>
+<span class="sourceLineNo">3029</span>  }<a name="line.3029"></a>
+<span class="sourceLineNo">3030</span><a name="line.3030"></a>
+<span class="sourceLineNo">3031</span>  @Test<a name="line.3031"></a>
+<span class="sourceLineNo">3032</span>  public void testScanner_Wildcard_FromMemStore_EnforceVersions() throws IOException {<a name="line.3032"></a>
+<span class="sourceLineNo">3033</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.3033"></a>
+<span class="sourceLineNo">3034</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.3034"></a>
+<span class="sourceLineNo">3035</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.3035"></a>
+<span class="sourceLineNo">3036</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.3036"></a>
+<span class="sourceLineNo">3037</span>    byte[][] families = { fam1 };<a name="line.3037"></a>
+<span class="sourceLineNo">3038</span><a name="line.3038"></a>
+<span class="sourceLineNo">3039</span>    long ts1 = System.currentTimeMillis();<a name="line.3039"></a>
+<span class="sourceLineNo">3040</span>    long ts2 = ts1 + 1;<a name="line.3040"></a>
+<span class="sourceLineNo">3041</span>    long ts3 = ts1 + 2;<a name="line.3041"></a>
+<span class="sourceLineNo">3042</span><a name="line.3042"></a>
+<span class="sourceLineNo">3043</span>    // Setting up region<a name="line.3043"></a>
+<span class="sourceLineNo">3044</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.3044"></a>
+<span class="sourceLineNo">3045</span>    // Putting data in Region<a name="line.3045"></a>
+<span class="sourceLineNo">3046</span>    Put put = null;<a name="line.3046"></a>
+<span class="sourceLineNo">3047</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.3047"></a>
+<span class="sourceLineNo">3048</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.3048"></a>
+<span class="sourceLineNo">3049</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.3049"></a>
+<span class="sourceLineNo">3050</span><a name="line.3050"></a>
+<span class="sourceLineNo">3051</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.3051"></a>
+<span class="sourceLineNo">3052</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.3052"></a>
+<span class="sourceLineNo">3053</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.3053"></a>
+<span class="sourceLineNo">3054</span><a name="line.3054"></a>
+<span class="sourceLineNo">3055</span>    put = new Put(row1);<a name="line.3055"></a>
+<span class="sourceLineNo">3056</span>    put.add(kv13);<a name="line.3056"></a>
+<span class="sourceLineNo">3057</span>    put.add(kv12);<a name="line.3057"></a>
+<span class="sourceLineNo">3058</span>    put.add(kv11);<a name="line.3058"></a>
+<span class="sourceLineNo">3059</span>    put.add(kv23);<a name="line.3059"></a>
+<span class="sourceLineNo">3060</span>    put.add(kv22);<a name="line.3060"></a>
+<span class="sourceLineNo">3061</span>    put.add(kv21);<a name="line.3061"></a>
+<span class="sourceLineNo">3062</span>    region.put(put);<a name="line.3062"></a>
+<span class="sourceLineNo">3063</span><a name="line.3063"></a>
+<span class="sourceLineNo">3064</span>    // Expected<a name="line.3064"></a>
+<span class="sourceLineNo">3065</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.3065"></a>
+<span class="sourceLineNo">3066</span>    expected.add(kv13);<a name="line.3066"></a>
+<span class="sourceLineNo">3067</span>    expected.add(kv12);<a name="line.3067"></a>
+<span class="sourceLineNo">3068</span>    expected.add(kv23);<a name="line.3068"></a>
+<span class="sourceLineNo">3069</span>    expected.add(kv22);<a name="line.3069"></a>
+<span class="sourceLineNo">3070</span><a name="line.3070"></a>
+<span class="sourceLineNo">3071</span>    Scan scan = new Scan(row1);<a name="line.3071"></a>
+<span class="sourceLineNo">3072</span>    scan.addFamily(fam1);<a name="line.3072"></a>
+<span class="sourceLineNo">3073</span>    scan.setMaxVersions(MAX_VERSIONS);<a name="line.3073"></a>
+<span class="sourceLineNo">3074</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.3074"></a>
+<span class="sourceLineNo">3075</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.3075"></a>
+<span class="sourceLineNo">3076</span><a name="line.3076"></a>
+<span class="sourceLineNo">3077</span>    boolean hasNext = scanner.next(actual);<a name="line.3077"></a>
+<span class="sourceLineNo">3078</span>    assertEquals(false, hasNext);<a name="line.3078"></a>
+<span class="sourceLineNo">3079</span><a name="line.3079"></a>
+<span class="sourceLineNo">3080</span>    // Verify result<a name="line.3080"></a>
+<span class="sourceLineNo">3081</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.3081"></a>
+<span class="sourceLineNo">3082</span>      assertEquals(expected.get(i), actual.get(i));<a name="line.3082"></a>
+<span class="sourceLineNo">3083</span>    }<a name="line.3083"></a>
+<span class="sourceLineNo">3084</span>  }<a name="line.3084"></a>
+<span class="sourceLineNo">3085</span><a name="line.3085"></a>
+<span class="sourceLineNo">3086</span>  @Test<a name="line.3086"></a>
+<span class="sourceLineNo">3087</span>  public void testScanner_Wildcard_FromFilesOnly_EnforceVersions() throws IOException {<a name="line.3087"></a>
+<span class="sourceLineNo">3088</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.3088"></a>
+<span class="sourceLineNo">3089</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.3089"></a>
+<span class="sourceLineNo">3090</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.3090"></a>
+<span class="sourceLineNo">3091</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.3091"></a>
+<span class="sourceLineNo">3092</span><a name="line.3092"></a>
+<span class="sourceLineNo">3093</span>    long ts1 = 1; // System.currentTimeMillis();<a name="line.3093"></a>
+<span class="sourceLineNo">3094</span>    long ts2 = ts1 + 1;<a name="line.3094"></a>
+<span class="sourceLineNo">3095</span>    long ts3 = ts1 + 2;<a name="line.3095"></a>
+<span class="sourceLineNo">3096</span><a name="line.3096"></a>
+<span class="sourceLineNo">3097</span>    // Setting up region<a name="line.3097"></a>
+<span class="sourceLineNo">3098</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.3098"></a>
+<span class="sourceLineNo">3099</span>    // Putting data in Region<a name="line.3099"></a>
+<span class="sourceLineNo">3100</span>    Put put = null;<a name="line.3100"></a>
+<span class="sourceLineNo">3101</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.3101"></a>
+<span class="sourceLineNo">3102</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.3102"></a>
+<span class="sourceLineNo">3103</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.3103"></a>
+<span class="sourceLineNo">3104</span><a name="line.3104"></a>
+<span class="sourceLineNo">3105</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.3105"></a>
+<span class="sourceLineNo">3106</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.3106"></a>
+<span class="sourceLineNo">3107</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.3107"></a>
 <span class="sourceLineNo">3108</span><a name="line.3108"></a>
-<span class="sourceLineNo">3109</span>    // Expected<a name="line.3109"></a>
-<span class="sourceLineNo">3110</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.3110"></a>
-<span class="sourceLineNo">3111</span>    expected.add(kv13);<a name="line.3111"></a>
-<span class="sourceLineNo">3112</span>    expected.add(kv12);<a name="line.3112"></a>
-<span class="sourceLineNo">3113</span>    expected.add(kv23);<a name="line.3113"></a>
-<span class="sourceLineNo">3114</span>    expected.add(kv22);<a name="line.3114"></a>
-<span class="sourceLineNo">3115</span><a name="line.3115"></a>
-<span class="sourceLineNo">3116</span>    Scan scan = new Scan(row1);<a name="line.3116"></a>
-<span class="sourceLineNo">3117</span>    scan.addFamily(fam1);<a name="line.3117"></a>
-<span class="sourceLineNo">3118</span>    scan.setMaxVersions(MAX_VERSIONS);<a name="line.3118"></a>
-<span class="sourceLineNo">3119</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.3119"></a>
-<span class="sourceLineNo">3120</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.3120"></a>
-<span class="sourceLineNo">3121</span><a name="line.3121"></a>
-<span class="sourceLineNo">3122</span>    boolean hasNext = scanner.next(actual);<a name="line.3122"></a>
-<span class="sourceLineNo">3123</span>    assertEquals(false, hasNext);<a name="line.3123"></a>
-<span class="sourceLineNo">3124</span><a name="line.3124"></a>
-<span class="sourceLineNo">3125</span>    // Verify result<a name="line.3125"></a>
-<span class="sourceLineNo">3126</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.3126"></a>
-<span class="sourceLineNo">3127</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected.get(i), actual.get(i)));<a name="line.3127"></a>
-<span class="sourceLineNo">3128</span>    }<a name="line.3128"></a>
-<span class="sourceLineNo">3129</span>  }<a name="line.3129"></a>
-<span class="sourceLineNo">3130</span><a name="line.3130"></a>
-<span class="sourceLineNo">3131</span>  @Test<a name="line.3131"></a>
-<span class="sourceLineNo">3132</span>  public void testScanner_StopRow1542() throws IOException {<a name="line.3132"></a>
-<span class="sourceLineNo">3133</span>    byte[] family = Bytes.toBytes("testFamily");<a name="line.3133"></a>
-<span class="sourceLineNo">3134</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.3134"></a>
-<span class="sourceLineNo">3135</span>    byte[] row1 = Bytes.toBytes("row111");<a name="line.3135"></a>
-<span class="sourceLineNo">3136</span>    byte[] row2 = Bytes.toBytes("row222");<a name="line.3136"></a>
-<span class="sourceLineNo">3137</span>    byte[] row3 = Bytes.toBytes("row333");<a name="line.3137"></a>
-<span class="sourceLineNo">3138</span>    byte[] row4 = Bytes.toBytes("row444");<a name="line.3138"></a>
-<span class="sourceLineNo">3139</span>    byte[] row5 = Bytes.toBytes("row555");<a name="line.3139"></a>
+<span class="sourceLineNo">3109</span>    put = new Put(row1);<a name="line.3109"></a>
+<span class="sourceLineNo">3110</span>    put.add(kv13);<a name="line.3110"></a>
+<span class="sourceLineNo">3111</span>    put.add(kv12);<a name="line.3111"></a>
+<span class="sourceLineNo">3112</span>    put.add(kv11);<a name="line.3112"></a>
+<span class="sourceLineNo">3113</span>    put.add(kv23);<a name="line.3113"></a>
+<span class="sourceLineNo">3114</span>    put.add(kv22);<a name="line.3114"></a>
+<span class="sourceLineNo">3115</span>    put.add(kv21);<a name="line.3115"></a>
+<span class="sourceLineNo">3116</span>    region.put(put);<a name="line.3116"></a>
+<span class="sourceLineNo">3117</span>    region.flush(true);<a name="line.3117"></a>
+<span class="sourceLineNo">3118</span><a name="line.3118"></a>
+<span class="sourceLineNo">3119</span>    // Expected<a name="line.3119"></a>
+<span class="sourceLineNo">3120</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.3120"></a>
+<span class="sourceLineNo">3121</span>    expected.add(kv13);<a name="line.3121"></a>
+<span class="sourceLineNo">3122</span>    expected.add(kv12);<a name="line.3122"></a>
+<span class="sourceLineNo">3123</span>    expected.add(kv23);<a name="line.3123"></a>
+<span class="sourceLineNo">3124</span>    expected.add(kv22);<a name="line.3124"></a>
+<span class="sourceLineNo">3125</span><a name="line.3125"></a>
+<span class="sourceLineNo">3126</span>    Scan scan = new Scan(row1);<a name="line.3126"></a>
+<span class="sourceLineNo">3127</span>    scan.addFamily(fam1);<a name="line.3127"></a>
+<span class="sourceLineNo">3128</span>    scan.setMaxVersions(MAX_VERSIONS);<a name="line.3128"></a>
+<span class="sourceLineNo">3129</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.3129"></a>
+<span class="sourceLineNo">3130</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.3130"></a>
+<span class="sourceLineNo">3131</span><a name="line.3131"></a>
+<span class="sourceLineNo">3132</span>    boolean hasNext = scanner.next(actual);<a name="line.3132"></a>
+<span class="sourceLineNo">3133</span>    assertEquals(false, hasNext);<a name="line.3133"></a>
+<span class="sourceLineNo">3134</span><a name="line.3134"></a>
+<span class="sourceLineNo">3135</span>    // Verify result<a name="line.3135"></a>
+<span class="sourceLineNo">3136</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.3136"></a>
+<span class="sourceLineNo">3137</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected.get(i), actual.get(i)));<a name="line.3137"></a>
+<span class="sourceLineNo">3138</span>    }<a name="line.3138"></a>
+<span class="sourceLineNo">3139</span>  }<a name="line.3139"></a>
 <span class="sourceLineNo">3140</span><a name="line.3140"></a>
-<span class="sourceLineNo">3141</span>    byte[] col1 = Bytes.toBytes("Pub111");<a name="line.3141"></a>
-<span class="sourceLineNo">3142</span>    byte[] col2 = Bytes.toBytes("Pub222");<a name="line.3142"></a>
-<span class="sourceLineNo">3143</span><a name="line.3143"></a>
-<span class="sourceLineNo">3144</span>    Put put = new Put(row1);<a name="line.3144"></a>
-<span class="sourceLineNo">3145</span>    put.addColumn(family, col1, Bytes.toBytes(10L));<a name="line.3145"></a>
-<span class="sourceLineNo">3146</span>    region.put(put);<a name="line.3146"></a>
-<span class="sourceLineNo">3147</span><a name="line.3147"></a>
-<span class="sourceLineNo">3148</span>    put = new Put(row2);<a name="line.3148"></a>
-<span class="sourceLineNo">3149</span>    put.addColumn(family, col1, Bytes.toBytes(15L));<a name="line.3149"></a>
-<span class="sourceLineNo">3150</span>    region.put(put);<a name="line.3150"></a>
-<span class="sourceLineNo">3151</span><a name="line.3151"></a>
-<span class="sourceLineNo">3152</span>    put = new Put(row3);<a name="line.3152"></a>
-<span class="sourceLineNo">3153</span>    put.addColumn(family, col2, Bytes.toBytes(20L));<a name="line.3153"></a>
-<span class="sourceLineNo">3154</span>    region.put(put);<a name="line.3154"></a>
-<span class="sourceLineNo">3155</span><a name="line.3155"></a>
-<span class="sourceLineNo">3156</span>    put = new Put(row4);<a name="line.3156"></a>
-<span class="sourceLineNo">3157</span>    put.addColumn(family, col2, Bytes.toBytes(30L));<a name="line.3157"></a>
-<span class="sourceLineNo">3158</span>    region.put(put);<a name="line.3158"></a>
-<span class="sourceLineNo">3159</span><a name="line.3159"></a>
-<span class="sourceLineNo">3160</span>    put = new Put(row5);<a name="line.3160"></a>
-<span class="sourceLineNo">3161</span>    put.addColumn(family, col1, Bytes.toBytes(40L));<a name="line.3161"></a>
-<span class="sourceLineNo">3162</span>    region.put(put);<a name="line.3162"></a>
-<span class="sourceLineNo">3163</span><a name="line.3163"></a>
-<span class="sourceLineNo">3164</span>    Scan scan = new Scan(row3, row4);<a name="line.3164"></a>
-<span class="sourceLineNo">3165</span>    scan.setMaxVersions();<a name="line.3165"></a>
-<span class="sourceLineNo">3166</span>    scan.addColumn(family, col1);<a name="line.3166"></a>
-<span class="sourceLineNo">3167</span>    InternalScanner s = region.getScanner(scan);<a name="line.3167"></a>
-<span class="sourceLineNo">3168</span><a name="line.3168"></a>
-<span class="sourceLineNo">3169</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.3169"></a>
-<span class="sourceLineNo">3170</span>    assertEquals(false, s.next(results));<a name="line.3170"></a>
-<span class="sourceLineNo">3171</span>    assertEquals(0, results.size());<a name="line.3171"></a>
-<span class="sourceLineNo">3172</span>  }<a name="line.3172"></a>
+<span class="sourceLineNo">3141</span>  @Test<a name="line.3141"></a>
+<span class="sourceLineNo">3142</span>  public void testScanner_StopRow1542() throws IOException {<a name="line.3142"></a>
+<span class="sourceLineNo">3143</span>    byte[] family = Bytes.toBytes("testFamily");<a name="line.3143"></a>
+<span class="sourceLineNo">3144</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.3144"></a>
+<span class="sourceLineNo">3145</span>    byte[] row1 = Bytes.toBytes("row111");<a name="line.3145"></a>
+<span class="sourceLineNo">3146</span>    byte[] row2 = Bytes.toBytes("row222");<a name="line.3146"></a>
+<span class="sourceLineNo">3147</span>    byte[] row3 = Bytes.toBytes("row333");<a name="line.3147"></a>
+<span class="sourceLineNo">3148</span>    byte[] row4 = Bytes.toBytes("row444");<a name="line.3148"></a>
+<span class="sourceLineNo">3149</span>    byte[] row5 = Bytes.toBytes("row555");<a name="line.3149"></a>
+<span class="sourceLineNo">3150</span><a name="line.3150"></a>
+<span class="sourceLineNo">3151</span>    byte[] col1 = Bytes.toBytes("Pub111");<a name="line.3151"></a>
+<span class="sourceLineNo">3152</span>    byte[] col2 = Bytes.toBytes("Pub222");<a name="line.3152"></a>
+<span class="sourceLineNo">3153</span><a name="line.3153"></a>
+<span class="sourceLineNo">3154</span>    Put put = new Put(row1);<a name="line.3154"></a>
+<span class="sourceLineNo">3155</span>    put.addColumn(family, col1, Bytes.toBytes(10L));<a name="line.3155"></a>
+<span class="sourceLineNo">3156</span>    region.put(put);<a name="line.3156"></a>
+<span class="sourceLineNo">3157</span><a name="line.3157"></a>
+<span class="sourceLineNo">3158</span>    put = new Put(row2);<a name="line.3158"></a>
+<span class="sourceLineNo">3159</span>    put.addColumn(family, col1, Bytes.toBytes(15L));<a name="line.3159"></a>
+<span class="sourceLineNo">3160</span>    region.put(put);<a name="line.3160"></a>
+<span class="sourceLineNo">3161</span><a name="line.3161"></a>
+<span class="sourceLineNo">3162</span>    put = new Put(row3);<a name="line.3162"></a>
+<span class="sourceLineNo">3163</span>    put.addColumn(family, col2, Bytes.toBytes(20L));<a name="line.3163"></a>
+<span class="sourceLineNo">3164</span>    region.put(put);<a name="line.3164"></a>
+<span class="sourceLineNo">3165</span><a name="line.3165"></a>
+<span class="sourceLineNo">3166</span>    put = new Put(row4);<a name="line.3166"></a>
+<span class="sourceLineNo">3167</span>    put.addColumn(family, col2, Bytes.toBytes(30L));<a name="line.3167"></a>
+<span class="sourceLineNo">3168</span>    region.put(put);<a name="line.3168"></a>
+<span class="sourceLineNo">3169</span><a name="line.3169"></a>
+<span class="sourceLineNo">3170</span>    put = new Put(row5);<a name="line.3170"></a>
+<span class="sourceLineNo">3171</span>    put.addColumn(family, col1, Bytes.toBytes(40L));<a name="line.3171"></a>
+<span class="sourceLineNo">3172</span>    region.put(put);<a name="line.3172"></a>
 <span class="sourceLineNo">3173</span><a name="line.3173"></a>
-<span class="sourceLineNo">3174</span>  @Test<a name="line.3174"></a>
-<span class="sourceLineNo">3175</span>  public void testScanner_Wildcard_FromMemStoreAndFiles_EnforceVersions() throws IOException {<a name="line.3175"></a>
-<span class="sourceLineNo">3176</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.3176"></a>
-<span class="sourceLineNo">3177</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.3177"></a>
-<span class="sourceLineNo">3178</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.3178"></a>
-<span class="sourceLineNo">3179</span>    byte[] qf2 = Bytes.toBytes("quateslifier2");<a name="line.3179"></a>
-<span class="sourceLineNo">3180</span><a name="line.3180"></a>
-<span class="sourceLineNo">3181</span>    long ts1 = 1;<a name="line.3181"></a>
-<span class="sourceLineNo">3182</span>    long ts2 = ts1 + 1;<a name="line.3182"></a>
-<span class="sourceLineNo">3183</span>    long ts3 = ts1 + 2;<a name="line.3183"></a>
-<span class="sourceLineNo">3184</span>    long ts4 = ts1 + 3;<a name="line.3184"></a>
-<span class="sourceLineNo">3185</span><a name="line.3185"></a>
-<span class="sourceLineNo">3186</span>    // Setting up region<a name="line.3186"></a>
-<span class="sourceLineNo">3187</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.3187"></a>
-<span class="sourceLineNo">3188</span>    // Putting data in Region<a name="line.3188"></a>
-<span class="sourceLineNo">3189</span>    KeyValue kv14 = new KeyValue(row1, fam1, qf1, ts4, KeyValue.Type.Put, null);<a name="line.3189"></a>
-<span class="sourceLineNo">3190</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.3190"></a>
-<span class="sourceLineNo">3191</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.3191"></a>
-<span class="sourceLineNo">3192</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.3192"></a>
-<span class="sourceLineNo">3193</span><a name="line.3193"></a>
-<span class="sourceLineNo">3194</span>    KeyValue kv24 = new KeyValue(row1, fam1, qf2, ts4, KeyValue.Type.Put, null);<a name="line.3194"></a>
-<span class="sourceLineNo">3195</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.3195"></a>
-<span class="sourceLineNo">3196</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.3196"></a>
-<span class="sourceLineNo">3197</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.3197"></a>
-<span class="sourceLineNo">3198</span><a name="line.3198"></a>
-<span class="sourceLineNo">3199</span>    Put put = null;<a name="line.3199"></a>
-<span class="sourceLineNo">3200</span>    put = new Put(row1);<a name="line.3200"></a>
-<span class="sourceLineNo">3201</span>    put.add(kv14);<a name="line.3201"></a>
-<span class="sourceLineNo">3202</span>    put.add(kv24);<a name="line.3202"></a>
-<span class="sourceLineNo">3203</span>    region.put(put);<a name="line.3203"></a>
-<span class="sourceLineNo">3204</span>    region.flush(true);<a name="line.3204"></a>
-<span class="sourceLineNo">3205</span><a name="line.3205"></a>
-<span class="sourceLineNo">3206</span>    put = new Put(row1);<a name="line.3206"></a>
-<span class="sourceLineNo">3207</span>    put.add(kv23);<a name="line.3207"></a>
-<span class="sourceLineNo">3208</span>    put.add(kv13);<a name="line.3208"></a>
-<span class="sourceLineNo">3209</span>    region.put(put);<a name="line.3209"></a>
-<span class="sourceLineNo">3210</span>    region.flush(true);<a name="line.3210"></a>
-<span class="sourceLineNo">3211</span><a name="line.3211"></a>
-<span class="sourceLineNo">3212</span>    put = new Put(row1);<a name="line.3212"></a>
-<span class="sourceLineNo">3213</span>    put.add(kv22);<a name="line.3213"></a>
-<span class="sourceLineNo">3214</span>    put.add(kv12);<a name="line.3214"></a>
-<span class="sourceLineNo">3215</span>    region.put(put);<a name="line.3215"></a>
-<span class="sourceLineNo">3216</span>    region.flush(true);<a name="line.3216"></a>
-<span class="sourceLineNo">3217</span><a name="line.3217"></a>
-<span class="sourceLineNo">3218</span>    put = new Put(row1);<a name="line.3218"></a>
-<span class="sourceLineNo">3219</span>    put.add(kv21);<a name="line.3219"></a>
-<span class="sourceLineNo">3220</span>    put.add(kv11);<a name="line.3220"></a>
-<span class="sourceLineNo">3221</span>    region.put(put);<a name="line.3221"></a>
-<span class="sourceLineNo">3222</span><a name="line.3222"></a>
-<span class="sourceLineNo">3223</span>    // Expected<a name="line.3223"></a>
-<span class="sourceLineNo">3224</span>    List&lt;KeyValue&gt; expected = new ArrayList&lt;&gt;();<a name="line.3224"></a>
-<span class="sourceLineNo">3225</span>    expected.add(kv14);<a name="line.3225"></a>
-<span class="sourceLineNo">3226</span>    expected.add(kv13);<a name="line.3226"></a>
-<span class="sourceLineNo">3227</span>    expected.add(kv12);<a name="line.3227"></a>
-<span class="sourceLineNo">3228</span>    expected.add(kv24);<a name="line.3228"></a>
-<span class="sourceLineNo">3229</span>    expected.add(kv23);<a name="line.3229"></a>
-<span class="sourceLineNo">3230</span>    expected.add(kv22);<a name="line.3230"></a>
-<span class="sourceLineNo">3231</span><a name="line.3231"></a>
-<span class="sourceLineNo">3232</span>    Scan scan = new Scan(row1);<a name="line.3232"></a>
-<span class="sourceLineNo">3233</span>    int versions = 3;<a name="line.3233"></a>
-<span class="sourceLineNo">3234</span>    scan.setMaxVersions(versions);<a name="line.3234"></a>
-<span class="sourceLineNo">3235</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.3235"></a>
-<span class="sourceLineNo">3236</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.3236"></a>
-<span class="sourceLineNo">3237</span><a name="line.3237"></a>
-<span class="sourceLineNo">3238</span>    boolean hasNext = scanner.next(actual);<a name="line.3238"></a>
-<span class="sourceLineNo">3239</span>    assertEquals(false, hasNext);<a name="line.3239"></a>
-<span class="sourceLineNo">3240</span><a name="line.3240"></a>
-<span class="sourceLineNo">3241</span>    // Verify result<a name="line.3241"></a>
-<span class="sourceLineNo">3242</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.3242"></a>
-<span class="sourceLineNo">3243</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected.get(i), actual.get(i)));<a name="line.3243"></a>
-<span class="sourceLineNo">3244</span>    }<a name="line.3244"></a>
-<span class="sourceLineNo">3245</span>  }<a name="line.3245"></a>
-<span class="sourceLineNo">3246</span><a name="line.3246"></a>
-<span class="sourceLineNo">3247</span>  /**<a name="line.3247"></a>
-<span class="sourceLineNo">3248</span>   * Added for HBASE-5416<a name="line.3248"></a>
-<span class="sourceLineNo">3249</span>   *<a name="line.3249"></a>
-<span class="sourceLineNo">3250</span>   * Here we test scan optimization when only subset of CFs are used in filter<a name="line.3250"></a>
-<span class="sourceLineNo">3251</span>   * conditions.<a name="line.3251"></a>
-<span class="sourceLineNo">3252</span>   */<a name="line.3252"></a>
-<span class="sourceLineNo">3253</span>  @Test<a name="line.3253"></a>
-<span class="sourceLineNo">3254</span>  public void testScanner_JoinedScanners() throws IOException {<a name="line.3254"></a>
-<span class="sourceLineNo">3255</span>    byte[] cf_essential = Bytes.toBytes("essential");<a name="line.3255"></a>
-<span class="sourceLineNo">3256</span>    byte[] cf_joined = Bytes.toBytes("joined");<a name="line.3256"></a>
-<span class="sourceLineNo">3257</span>    byte[] cf_alpha = Bytes.toBytes("alpha");<a name="line.3257"></a>
-<span class="sourceLineNo">3258</span>    this.region = initHRegion(tableName, method, CONF, cf_essential, cf_joined, cf_alpha);<a name="line.3258"></a>
-<span class="sourceLineNo">3259</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.3259"></a>
-<span class="sourceLineNo">3260</span>    byte[] row2 = Bytes.toBytes("row2");<a name="line.3260"></a>
-<span class="sourceLineNo">3261</span>    byte[] row3 = Bytes.toBytes("row3");<a name="line.3261"></a>
-<span class="sourceLineNo">3262</span><a name="line.3262"></a>
-<span class="sourceLineNo">3263</span>    byte[] col_normal = Bytes.toBytes("d");<a name="line.3263"></a>
-<span class="sourceLineNo">3264</span>    byte[] col_alpha = Bytes.toBytes("a");<a name="line.3264"></a>
-<span class="sourceLineNo">3265</span><a name="line.3265"></a>
-<span class="sourceLineNo">3266</span>    byte[] filtered_val = Bytes.toBytes(3);<a name="line.3266"></a>
-<span class="sourceLineNo">3267</span><a name="line.3267"></a>
-<span class="sourceLineNo">3268</span>    Put put = new Put(row1);<a name="line.3268"></a>
-<span class="sourceLineNo">3269</span>    put.addColumn(cf_essential, col_normal, Bytes.toBytes(1));<a name="line.3269"></a>
-<span class="sourceLineNo">3270</span>    put.addColumn(cf_joined, col_alpha, Bytes.toBytes(1));<a name="line.3270"></a>
-<span class="sourceLineNo">3271</span>    region.put(put);<a name="line.3271"></a>
+<span class="sourceLineNo">3174</span>    Scan scan = new Scan(row3, row4);<a name="line.3174"></a>
+<span class="sourceLineNo">3175</span>    scan.setMaxVersions();<a name="line.3175"></a>
+<span class="sourceLineNo">3176</span>    scan.addColumn(family, col1);<a name="line.3176"></a>
+<span class="sourceLineNo">3177</span>    InternalScanner s = region.getScanner(scan);<a name="line.3177"></a>
+<span class="sourceLineNo">3178</span><a name="line.3178"></a>
+<span class="sourceLineNo">3179</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.3179"></a>
+<span class="sourceLineNo">3180</span>    assertEquals(false, s.next(results));<a name="line.3180"></a>
+<span class="sourceLineNo">3181</span>    assertEquals(0, results.size());<a name="line.3181"></a>
+<span class="sourceLineNo">3182</span>  }<a name="line.3182"></a>
+<span class="sourceLineNo">3183</span><a name="line.3183"></a>
+<span class="sourceLineNo">3184</span>  @Test<a name="line.3184"></a>
+<span class="sourceLineNo">3185</span>  public void testScanner_Wildcard_FromMemStoreAndFiles_EnforceVersions() throws IOException {<a name="line.3185"></a>
+<span class="sourceLineNo">3186</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.3186"></a>
+<span class="sourceLineNo">3187</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.3187"></a>
+<span class="sourceLineNo">3188</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.3188"></a>
+<span class="sourceLineNo">3189</span>    byte[] qf2 = Bytes.toBytes("quateslifier2");<a name="line.3189"></a>
+<span class="sourceLineNo">3190</span><a name="line.3190"></a>
+<span class="sourceLineNo">3191</span>    long ts1 = 1;<a name="line.3191"></a>
+<span class="sourceLineNo">3192</span>    long ts2 = ts1 + 1;<a name="line.3192"></a>
+<span class="sourceLineNo">3193</span>    long ts3 = ts1 + 2;<a name="line.3193"></a>
+<span class="sourceLineNo">3194</span>    long ts4 = ts1 + 3;<a name="line.3194"></a>
+<span class="sourceLineNo">3195</span><a name="line.3195"></a>
+<span class="sourceLineNo">3196</span>    // Setting up region<a name="line.3196"></a>
+<span class="sourceLineNo">3197</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.3197"></a>
+<span class="sourceLineNo">3198</span>    // Putting data in Region<a name="line.3198"></a>
+<span class="sourceLineNo">3199</span>    KeyValue kv14 = new KeyValue(row1, fam1, qf1, ts4, KeyValue.Type.Put, null);<a name="line.3199"></a>
+<span class="sourceLineNo">3200</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.3200"></a>
+<span class="sourceLineNo">3201</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.3201"></a>
+<span class="sourceLineNo">3202</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.3202"></a>
+<span class="sourceLineNo">3203</span><a name="line.3203"></a>
+<span class="sourceLineNo">3204</span>    KeyValue kv24 = new KeyValue(row1, fam1, qf2, ts4, KeyValue.Type.Put, null);<a name="line.3204"></a>
+<span class="sourceLineNo">3205</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.3205"></a>
+<span class="sourceLineNo">3206</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.3206"></a>
+<span class="sourceLineNo">3207</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.3207"></a>
+<span class="sourceLineNo">3208</span><a name="line.3208"></a>
+<span class="sourceLineNo">3209</span>    Put put = null;<a name="line.3209"></a>
+<span class="sourceLineNo">3210</span>    put = new Put(row1);<a name="line.3210"></a>
+<span class="sourceLineNo">3211</span>    put.add(kv14);<a name="line.3211"></a>
+<span class="sourceLineNo">3212</span>    put.add(kv24);<a name="line.3212"></a>
+<span class="sourceLineNo">3213</span>    region.put(put);<a name="line.3213"></a>
+<span class="sourceLineNo">3214</span>    region.flush(true);<a name="line.3214"></a>
+<span class="sourceLineNo">3215</span><a name="line.3215"></a>
+<span class="sourceLineNo">3216</span>    put = new Put(row1);<a name="line.3216"></a>
+<span class="sourceLineNo">3217</span>    put.add(kv23);<a name="line.3217"></a>
+<span class="sourceLineNo">3218</span>    put.add(kv13);<a name="line.3218"></a>
+<span class="sourceLineNo">3219</span>    region.put(put);<a name="line.3219"></a>
+<span class="sourceLineNo">3220</span>    region.flush(true);<a name="line.3220"></a>
+<span class="sourceLineNo">3221</span><a name="line.3221"></a>
+<span class="sourceLineNo">3222</span>    put = new Put(row1);<a name="line.3222"></a>
+<span class="sourceLineNo">3223</span>    put.add(kv22);<a name="line.3223"></a>
+<span class="sourceLineNo">3224</span>    put.add(kv12);<a name="line.3224"></a>
+<span class="sourceLineNo">3225</span>    region.put(put);<a name="line.3225"></a>
+<span class="sourceLineNo">3226</span>    region.flush(true);<a name="line.3226"></a>
+<span class="sourceLineNo">3227</span><a name="line.3227"></a>
+<span class="sourceLineNo">3228</span>    put = new Put(row1);<a name="line.3228"></a>
+<span class="sourceLineNo">3229</span>    put.add(kv21);<a name="line.3229"></a>
+<span class="sourceLineNo">3230</span>    put.add(kv11);<a name="line.3230"></a>
+<span class="sourceLineNo">3231</span>    region.put(put);<a name="line.3231"></a>
+<span class="sourceLineNo">3232</span><a name="line.3232"></a>
+<span class="sourceLineNo">3233</span>    // Expected<a name="line.3233"></a>
+<span class="sourceLineNo">3234</span>    List&lt;KeyValue&gt; expected = new ArrayList&lt;&gt;();<a name="line.3234"></a>
+<span class="sourceLineNo">3235</span>    expected.add(kv14);<a name="line.3235"></a>
+<span class="sourceLineNo">3236</span>    expected.add(kv13);<a name="line.3236"></a>
+<span class="sourceLineNo">3237</span>    expected.add(kv12);<a name="line.3237"></a>
+<span class="sourceLineNo">3238</span>    expected.add(kv24);<a name="line.3238"></a>
+<span class="sourceLineNo">3239</span>    expected.add(kv23);<a name="line.3239"></a>
+<span class="sourceLineNo">3240</span>    expected.add(kv22);<a name="line.3240"></a>
+<span class="sourceLineNo">3241</span><a name="line.3241"></a>
+<span class="sourceLineNo">3242</span>    Scan scan = new Scan(row1);<a name="line.3242"></a>
+<span class="sourceLineNo">3243</span>    int versions = 3;<a name="line.3243"></a>
+<span class="sourceLineNo">3244</span>    scan.setMaxVersions(versions);<a name="line.3244"></a>
+<span class="sourceLineNo">3245</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.3245"></a>
+<span class="sourceLineNo">3246</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.3246"></a>
+<span class="sourceLineNo">3247</span><a name="line.3247"></a>
+<span class="sourceLineNo">3248</span>    boolean hasNext = scanner.next(actual);<a name="line.3248"></a>
+<span class="sourceLineNo">3249</span>    assertEquals(false, hasNext);<a name="line.3249"></a>
+<span class="sourceLineNo">3250</span><a name="line.3250"></a>
+<span class="sourceLineNo">3251</span>    // Verify result<a name="line.3251"></a>
+<span class="sourceLineNo">3252</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.3252"></a>
+<span class="sourceLineNo">3253</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected.get(i), actual.get(i)));<a name="line.3253"></a>
+<span class="sourceLineNo">3254</span>    }<a name="line.3254"></a>
+<span class="sourceLineNo">3255</span>  }<a name="line.3255"></a>
+<span class="sourceLineNo">3256</span><a name="line.3256"></a>
+<span class="sourceLineNo">3257</span>  /**<a name="line.3257"></a>
+<span class="sourceLineNo">3258</span>   * Added for HBASE-5416<a name="line.3258"></a>
+<span class="sourceLineNo">3259</span>   *<a name="line.3259"></a>
+<span class="sourceLineNo">3260</span>   * Here we test scan optimization when only subset of CFs are used in filter<a name="line.3260"></a>
+<span class="sourceLineNo">3261</span>   * conditions.<a name="line.3261"></a>
+<span class="sourceLineNo">3262</span>   */<a name="line.3262"></a>
+<span class="sourceLineNo">3263</span>  @Test<a name="line.3263"></a>
+<span class="sourceLineNo">3264</span>  public void testScanner_JoinedScanners() throws IOException {<a name="line.3264"></a>
+<span class="sourceLineNo">3265</span>    byte[] cf_essential = Bytes.toBytes("essential");<a name="line.3265"></a>
+<span class="sourceLineNo">3266</span>    byte[] cf_joined = Bytes.toBytes("joined");<a name="line.3266"></a>
+<span class="sourceLineNo">3267</span>    byte[] cf_alpha = Bytes.toBytes("alpha");<a name="line.3267"></a>
+<span class="sourceLineNo">3268</span>    this.region = initHRegion(tableName, method, CONF, cf_essential, cf_joined, cf_alpha);<a name="line.3268"></a>
+<span class="sourceLineNo">3269</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.3269"></a>
+<span class="sourceLineNo">3270</span>    byte[] row2 = Bytes.toBytes("row2");<a name="line.3270"></a>
+<span class="sourceLineNo">3271</span>    byte[] row3 = Bytes.toBytes("row3");<a name="line.3271"></a>
 <span class="sourceLineNo">3272</span><a name="line.3272"></a>
-<span class="sourceLineNo">3273</span>    put = new Put(row2);<a name="line.3273"></a>
-<span class="sourceLineNo">3274</span>    put.addColumn(cf_essential, col_alpha, Bytes.toBytes(2));<a name="line.3274"></a>
-<span class="sourceLineNo">3275</span>    put.addColumn(cf_joined, col_normal, Bytes.toBytes(2));<a name="line.3275"></a>
-<span class="sourceLineNo">3276</span>    put.addColumn(cf_alpha, col_alpha, Bytes.toBytes(2));<a name="line.3276"></a>
-<span class="sourceLineNo">3277</span>    region.put(put);<a name="line.3277"></a>
-<span class="sourceLineNo">3278</span><a name="line.3278"></a>
-<span class="sourceLineNo">3279</span>    put = new Put(row3);<a name="line.3279"></a>
-<span class="sourceLineNo">3280</span>    put.addColumn(cf_essential, col_normal, filtered_val);<a name="line.3280"></a>
-<span class="sourceLineNo">3281</span>    put.addColumn(cf_joined, col_normal, filtered_val);<a name="line.3281"></a>
-<span class="sourceLineNo">3282</span>    region.put(put);<a name="line.3282"></a>
-<span class="sourceLineNo">3283</span><a name="line.3283"></a>
-<span class="sourceLineNo">3284</span>    // Check two things:<a name="line.3284"></a>
-<span class="sourceLineNo">3285</span>    // 1. result list contains expected values<a name="line.3285"></a>
-<span class="sourceLineNo">3286</span>    // 2. result list is sorted properly<a name="line.3286"></a>
-<span class="sourceLineNo">3287</span><a name="line.3287"></a>
-<span class="sourceLineNo">3288</span>    Scan scan = new Scan();<a name="line.3288"></a>
-<span class="sourceLineNo">3289</span>    Filter filter = new SingleColumnValueExcludeFilter(cf_essential, col_normal,<a name="line.3289"></a>
-<span class="sourceLineNo">3290</span>            CompareOperator.NOT_EQUAL, filtered_val);<a name="line.3290"></a>
-<span class="sourceLineNo">3291</span>    scan.setFilter(filter);<a name="line.3291"></a>
-<span class="sourceLineNo">3292</span>    scan.setLoadColumnFamiliesOnDemand(true);<a name="line.3292"></a>
-<span class="sourceLineNo">3293</span>    InternalScanner s = region.getScanner(scan);<a name="line.3293"></a>
-<span class="sourceLineNo">3294</span><a name="line.3294"></a>
-<span class="sourceLineNo">3295</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.3295"></a>
-<span class="sourceLineNo">3296</span>    assertTrue(s.next(results));<a name="line.3296"></a>
-<span class="sourceLineNo">3297</span>    assertEquals(1, results.size());<a name="line.3297"></a>
-<span class="sourceLineNo">3298</span>    results.clear();<a name="line.3298"></a>
-<span class="sourceLineNo">3299</span><a name="line.3299"></a>
-<span class="sourceLineNo">3300</span>    assertTrue(s.next(results));<a name="line.3300"></a>
-<span class="sourceLineNo">3301</span>    assertEquals(3, results.size());<a name="line.3301"></a>
-<span class="sourceLineNo">3302</span>    assertTrue("orderCheck", CellUtil.matchingFamily(results.get(0), cf_alpha));<a name="line.3302"></a>
-<span class="sourceLineNo">3303</span>    assertTrue("orderCheck", CellUtil.matchingFamily(results.get(1), cf_essential));<a name="line.3303"></a>
-<span class="sourceLineNo">3304</span>    assertTrue("orderCheck", CellUtil.matchingFamily(results.get(2), cf_joined));<a name="line.3304"></a>
-<span class="sourceLineNo">3305</span>    results.clear();<a name="line.3305"></a>
-<span class="sourceLineNo">3306</span><a name="line.3306"></a>
-<span class="sourceLineNo">3307</span>    assertFalse(s.next(results));<a name="line.3307"></a>
-<span class="sourceLineNo">3308</span>    assertEquals(0, results.size());<a name="line.3308"></a>
-<span class="sourceLineNo">3309</span>  }<a name="line.3309"></a>
-<span class="sourceLineNo">3310</span><a name="line.3310"></a>
-<span class="sourceLineNo">3311</span>  /**<a name="line.3311"></a>
-<span class="sourceLineNo">3312</span>   * HBASE-5416<a name="line.3312"></a>
-<span class="sourceLineNo">3313</span>   *<a name="line.3313"></a>
-<span class="sourceLineNo">3314</span>   * Test case when scan limits amount of KVs returned on each next() call.<a name="line.3314"></a>
-<span class="sourceLineNo">3315</span>   */<a name="line.3315"></a>
-<span class="sourceLineNo">3316</span>  @Test<a name="line.3316"></a>
-<span class="sourceLineNo">3317</span>  public void testScanner_JoinedScannersWithLimits() throws IOException {<a name="line.3317"></a>
-<span class="sourceLineNo">3318</span>    final byte[] cf_first = Bytes.toBytes("first");<a name="line.3318"></a>
-<span class="sourceLineNo">3319</span>    final byte[] cf_second = Bytes.toBytes("second");<a name="line.3319"></a>
+<span class="sourceLineNo">3273</span>    byte[] col_normal = Bytes.toBytes("d");<a name="line.3273"></a>
+<span class="sourceLineNo">3274</span>    byte[] col_alpha = Bytes.toBytes("a");<a name="line.3274"></a>
+<span class="sourceLineNo">3275</span><a name="line.3275"></a>
+<span class="sourceLineNo">3276</span>    byte[] filtered_val = Bytes.toBytes(3);<a name="line.3276"></a>
+<span class="sourceLineNo">3277</span><a name="line.3277"></a>
+<span class="sourceLineNo">3278</span>    Put put = new Put(row1);<a name="line.3278"></a>
+<span class="sourceLineNo">3279</span>    put.addColumn(cf_essential, col_normal, Bytes.toBytes(1));<a name="line.3279"></a>
+<span class="sourceLineNo">3280</span>    put.addColumn(cf_joined, col_alpha, Bytes.toBytes(1));<a name="line.3280"></a>
+<span class="sourceLineNo">3281</span>    region.put(put);<a name="line.3281"></a>
+<span class="sourceLineNo">3282</span><a name="line.3282"></a>
+<span class="sourceLineNo">3283</span>    put = new Put(row2);<a name="line.3283"></a>
+<span class="sourceLineNo">3284</span>    put.addColumn(cf_essential, col_alpha, Bytes.toBytes(2));<a name="line.3284"></a>
+<span class="sourceLineNo">3285</span>    put.addColumn(cf_joined, col_normal, Bytes.toBytes(2));<a name="line.3285"></a>
+<span class="sourceLineNo">3286</span>    put.addColumn(cf_alpha, col_alpha, Bytes.toBytes(2));<a name="line.3286"></a>
+<span class="sourceLineNo">3287</span>    region.put(put);<a name="line.3287"></a>
+<span class="sourceLineNo">3288</span><a name="line.3288"></a>
+<span class="sourceLineNo">3289</span>    put = new Put(row3);<a name="line.3289"></a>
+<span class="sourceLineNo">3290</span>    put.addColumn(cf_essential, col_normal, filtered_val);<a name="line.3290"></a>
+<span class="sourceLineNo">3291</span>    put.addColumn(cf_joined, col_normal, filtered_val);<a name="line.3291"></a>
+<span class="sourceLineNo">3292</span>    region.put(put);<a name="line.3292"></a>
+<span class="sourceLineNo">3293</span><a name="line.3293"></a>
+<span class="sourceLineNo">3294</span>    // Check two things:<a name="line.3294"></a>
+<span class="sourceLineNo">3295</span>    // 1. result list contains expected values<a name="line.3295"></a>
+<span class="sourceLineNo">3296</span>    // 2. result list is sorted properly<a name="line.3296"></a>
+<span class="sourceLineNo">3297</span><a name="line.3297"></a>
+<span class="sourceLineNo">3298</span>    Scan scan = new Scan();<a name="line.3298"></a>
+<span class="sourceLineNo">3299</span>    Filter filter = new SingleColumnValueExcludeFilter(cf_essential, col_normal,<a name="line.3299"></a>
+<span class="sourceLineNo">3300</span>            CompareOperator.NOT_EQUAL, filtered_val);<a name="line.3300"></a>
+<span class="sourceLineNo">3301</span>    scan.setFilter(filter);<a name="line.3301"></a>
+<span class="sourceLineNo">3302</span>    scan.setLoadColumnFamiliesOnDemand(true);<a name="line.3302"></a>
+<span class="sourceLineNo">3303</span>    InternalScanner s = region.getScanner(scan);<a name="line.3303"></a>
+<span class="sourceLineNo">3304</span><a name="line.3304"></a>
+<span class="sourceLineNo">3305</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.3305"></a>
+<span class="sourceLineNo">3306</span>    assertTrue(s.next(results));<a name="line.3306"></a>
+<span class="sourceLineNo">3307</span>    assertEquals(1, results.size());<a name="line.3307"></a>
+<span class="sourceLineNo">3308</span>    results.clear();<a name="line.3308"></a>
+<span class="sourceLineNo">3309</span><a name="line.3309"></a>
+<span class="sourceLineNo">3310</span>    assertTrue(s.next(results));<a name="line.3310"></a>
+<span class="sourceLineNo">3311</span>    assertEquals(3, results.size());<a name="line.3311"></a>
+<span class="sourceLineNo">3312</span>    assertTrue("orderCheck", CellUtil.matchingFamily(results.get(0), cf_alpha));<a name="line.3312"></a>
+<span class="sourceLineNo">3313</span>    assertTrue("orderCheck", CellUtil.matchingFamily(results.get(1), cf_essential));<a name="line.3313"></a>
+<span class="sourceLineNo">3314</span>    assertTrue("orderCheck", CellUtil.matchingFamily(results.get(2), cf_joined));<a name="line.3314"></a>
+<span class="sourceLineNo">3315</span>    results.clear();<a name="line.3315"></a>
+<span class="sourceLineNo">3316</span><a name="line.3316"></a>
+<span class="sourceLineNo">3317</span>    assertFalse(s.next(results));<a name="line.3317"></a>
+<span class="sourceLineNo">3318</span>    assertEquals(0, results.size());<a name="line.3318"></a>
+<span class="sourceLineNo">3319</span>  }<a name="line.3319"></a>
 <span class="sourceLineNo">3320</span><a name="line.3320"></a>
-<span class="sourceLineNo">3321</span>    this.region = initHRegion(tableName, method, CONF, cf_first, cf_second);<a name="line.3321"></a>
-<span class="sourceLineNo">3322</span>    final byte[] col_a = Bytes.toBytes("a");<a name="line.3322"></a>
-<span class="sourceLineNo">3323</span>    final byte[] col_b = Bytes.toBytes("b");<a name="line.3323"></a>
-<span class="sourceLineNo">3324</span><a name="line.3324"></a>
-<span class="sourceLineNo">3325</span>    Put put;<a name="line.3325"></a>
-<span class="sourceLineNo">3326</span><a name="line.3326"></a>
-<span class="sourceLineNo">3327</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.3327"></a>
-<span class="sourceLineNo">3328</span>      put = new Put(Bytes.toBytes("r" + Integer.toString(i)));<a name="line.3328"></a>
-<span class="sourceLineNo">3329</span>      put.addColumn(cf_first, col_a, Bytes.toBytes(i));<a name="line.3329"></a>
-<span class="sourceLineNo">3330</span>      if (i &lt; 5) {<a name="line.3330"></a>
-<span class="sourceLineNo">3331</span>        put.addColumn(cf_first, col_b, Bytes.toBytes(i));<a name="line.3331"></a>
-<span class="sourceLineNo">3332</span>        put.addColumn(cf_second, col_a, Bytes.toBytes(i));<a name="line.3332"></a>
-<span class="sourceLineNo">3333</span>        put.addColumn(cf_second, col_b, Bytes.toBytes(i));<a name="line.3333"></a>
-<span class="sourceLineNo">3334</span>      }<a name="line.3334"></a>
-<span class="sourceLineNo">3335</span>      region.put(put);<a name="line.3335"></a>
-<span class="sourceLineNo">3336</span>    }<a name="line.3336"></a>
-<span class="sourceLineNo">3337</span><a name="line.3337"></a>
-<span class="sourceLineNo">3338</span>    Scan scan = new Scan();<a name="line.3338"></a>
-<span class="sourceLineNo">3339</span>    scan.setLoadColumnFamiliesOnDemand(true);<a name="line.3339"></a>
-<span class="sourceLineNo">3340</span>    Filter bogusFilter = new FilterBase() {<a name="line.3340"></a>
-<span class="sourceLineNo">3341</span>      @Override<a name="line.3341"></a>
-<span class="sourceLineNo">3342</span>      public ReturnCode filterCell(final Cell ignored) throws IOException {<a name="line.3342"></a>
-<span class="sourceLineNo">3343</span>        return ReturnCode.INCLUDE;<a name="line.3343"></a>
+<span class="sourceLineNo">3321</span>  /**<a name="line.3321"></a>
+<span class="sourceLineNo">3322</span>   * HBASE-5416<a name="line.3322"></a>
+<span class="sourceLineNo">3323</span>   *<a name="line.3323"></a>
+<span class="sourceLineNo">3324</span>   * Test case when scan limits amount of KVs returned on each next() call.<a name="line.3324"></a>
+<span class="sourceLineNo">3325</span>   */<a name="line.3325"></a>
+<span class="sourceLineNo">3326</span>  @Test<a name="line.3326"></a>
+<span class="sourceLineNo">3327</span>  public void testScanner_JoinedScannersWithLimits() throws IOException {<a name="line.3327"></a>
+<span class="sourceLineNo">3328</span>    final byte[] cf_first = Bytes.toBytes("first");<a name="line.3328"></a>
+<span class="sourceLineNo">3329</span>    final byte[] cf_second = Bytes.toBytes("second");<a name="line.3329"></a>
+<span class="sourceLineNo">3330</span><a name="line.3330"></a>
+<span class="sourceLineNo">3331</span>    this.region = initHRegion(tableName, method, CONF, cf_first, cf_second);<a name="line.3331"></a>
+<span class="sourceLineNo">3332</span>    final byte[] col_a = Bytes.toBytes("a");<a name="line.3332"></a>
+<span class="sourceLineNo">3333</span>    final byte[] col_b = Bytes.toBytes("b");<a name="line.3333"></a>
+<span class="sourceLineNo">3334</span><a name="line.3334"></a>
+<span class="sourceLineNo">3335</span>    Put put;<a name="line.3335"></a>
+<span class="sourceLineNo">3336</span><a name="line.3336"></a>
+<span class="sourceLineNo">3337</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.3337"></a>
+<span class="sourceLineNo">3338</span>      put = new Put(Bytes.toBytes("r" + Integer.toString(i)));<a name="line.3338"></a>
+<span class="sourceLineNo">3339</span>      put.addColumn(cf_first, col_a, Bytes.toBytes(i));<a name="line.3339"></a>
+<span class="sourceLineNo">3340</span>      if (i &lt; 5) {<a name="line.3340"></a>
+<span class="sourceLineNo">3341</span>        put.addColumn(cf_first, col_b, Bytes.toBytes(i));<a name="line.3341"></a>
+<span class="sourceLineNo">3342</span>        put.addColumn(cf_second, col_a, Bytes.toBytes(i));<a name="line.3342"></a>
+<span class="sourceLineNo">3343</span>        put.addColumn(cf_second, col_b, Bytes.toBytes(i));<a name="line.3343"></a>
 <span class="sourceLineNo">3344</span>      }<a name="line.3344"></a>
-<span class="sourceLineNo">3345</span>      @Override<a name="line.3345"></a>
-<span class="sourceLineNo">3346</span>      public boolean isFamilyEssential(byte[] name) {<a name="line.3346"></a>
-<span class="sourceLineNo">3347</span>        return Bytes.equals(name, cf_first);<a name="line.3347"></a>
-<span class="sourceLineNo">3348</span>      }<a name="line.3348"></a>
-<span class="sourceLineNo">3349</span>    };<a name="line.3349"></a>
-<span class="sourceLineNo">3350</span><a name="line.3350"></a>
-<span class="sourceLineNo">3351</span>    scan.setFilter(bogusFilter);<a name="line.3351"></a>
-<span class="sourceLineNo">3352</span>    InternalScanner s = region.getScanner(scan);<a name="line.3352"></a>
-<span class="sourceLineNo">3353</span><a name="line.3353"></a>
-<span class="sourceLineNo">3354</span>    // Our data looks like this:<a name="line.3354"></a>
-<span class="sourceLineNo">3355</span>    // r0: first:a, first:b, second:a, second:b<a name="line.3355"></a>
-<span class="sourceLineNo">3356</span>    // r1: first:a, first:b, second:a, second:b<a name="line.3356"></a>
-<span class="sourceLineNo">3357</span>    // r2: first:a, first:b, second:a, second:b<a name="line.3357"></a>
-<span class="sourceLineNo">3358</span>    // r3: first:a, first:b, second:a, second:b<a name="line.3358"></a>
-<span class="sourceLineNo">3359</span>    // r4: first:a, first:b, second:a, second:b<a name="line.3359"></a>
-<span class="sourceLineNo">3360</span>    // r5: first:a<a name="line.3360"></a>
-<span class="sourceLineNo">3361</span>    // r6: first:a<a name="line.3361"></a>
-<span class="sourceLineNo">3362</span>    // r7: first:a<a name="line.3362"></a>
-<span class="sourceLineNo">3363</span>    // r8: first:a<a name="line.3363"></a>
-<span class="sourceLineNo">3364</span>    // r9: first:a<a name="line.3364"></a>
-<span class="sourceLineNo">3365</span><a name="line.3365"></a>
-<span class="sourceLineNo">3366</span>    // But due to next's limit set to 3, we should get this:<a name="line.3366"></a>
-<span class="sourceLineNo">3367</span>    // r0: first:a, first:b, second:a<a name="line.3367"></a>
-<span class="sourceLineNo">3368</span>    // r0: second:b<a name="line.3368"></a>
-<span class="sourceLineNo">3369</span>    // r1: first:a, first:b, second:a<a name="line.3369"></a>
-<span class="sourceLineNo">3370</span>    // r1: second:b<a name="line.3370"></a>
-<span class="sourceLineNo">3371</span>    // r2: first:a, first:b, second:a<a name="line.3371"></a>
-<span class="sourceLineNo">3372</span>    // r2: second:b<a name="line.3372"></a>
-<span class="sourceLineNo">3373</span>    // r3: first:a, first:b, second:a<a name="line.3373"></a>
-<span class="sourceLineNo">3374</span>    // r3: second:b<a name="line.3374"></a>
-<span class="sourceLineNo">3375</span>    // r4: first:a, first:b, second:a<a name="line.3375"></a>
-<span class="sourceLineNo">3376</span>    // r4: second:b<a name="line.3376"></a>
-<span class="sourceLineNo">3377</span>    // r5: first:a<a name="line.3377"></a>
-<span class="sourceLineNo">3378</span>    // r6: first:a<a name="line.3378"></a>
-<span class="sourceLineNo">3379</span>    // r7: first:a<a name="line.3379"></a>
-<span class="sourceLineNo">3380</span>    // r8: first:a<a name="line.3380"></a>
-<span class="sourceLineNo">3381</span>    // r9: first:a<a name="line.3381"></a>
-<span class="sourceLineNo">3382</span><a name="line.3382"></a>
-<span class="sourceLineNo">3383</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.3383"></a>
-<span class="sourceLineNo">3384</span>    int index = 0;<a name="line.3384"></a>
-<span class="sourceLineNo">3385</span>    ScannerContext scannerContext = ScannerContext.newBuilder().setBatchLimit(3).build();<a name="line.3385"></a>
-<span class="sourceLineNo">3386</span>    while (true) {<a name="line.3386"></a>
-<span class="sourceLineNo">3387</span>      boolean more = s.next(results, scannerContext);<a name="line.3387"></a>
-<span class="sourceLineNo">3388</span>      if ((index &gt;&gt; 1) &lt; 5) {<a name="line.3388"></a>
-<span class="sourceLineNo">3389</span>        if (index % 2 == 0) {<a name="line.3389"></a>
-<span class="sourceLineNo">3390</span>          assertEquals(3, results.size());<a name="line.3390"></a>
-<span class="sourceLineNo">3391</span>        } else {<a name="line.3391"></a>
-<span class="sourceLineNo">3392</span>          assertEquals(1, results.size());<a name="line.3392"></a>
-<span class="sourceLineNo">3393</span>        }<a name="line.3393"></a>
-<span class="sourceLineNo">3394</span>      } else {<a name="line.3394"></a>
-<span class="sourceLineNo">3395</span>        assertEquals(1, results.size());<a name="line.3395"></a>
-<span class="sourceLineNo">3396</span>      }<a name="line.3396"></a>
-<span class="sourceLineNo">3397</span>      results.clear();<a name="line.3397"></a>
-<span class="sourceLineNo">3398</span>      index++;<a name="line.3398"></a>
-<span class="sourceLineNo">3399</span>      if (!more) {<a name="line.3399"></a>
-<span class="sourceLineNo">3400</span>        break;<a name="line.3400"></a>
-<span class="sourceLineNo">3401</span>      }<a name="line.3401"></a>
-<span class="sourceLineNo">3402</span>    }<a name="line.3402"></a>
-<span class="sourceLineNo">3403</span>  }<a name="line.3403"></a>
-<span class="sourceLineNo">3404</span><a name="line.3404"></a>
-<span class="sourceLineNo">3405</span>  /**<a name="line.3405"></a>
-<span class="sourceLineNo">3406</span>   * Write an HFile block full with Cells whose qualifier that are identical between<a name="line.3406"></a>
-<span class="sourceLineNo">3407</span>   * 0 and Short.MAX_VALUE. See HBASE-13329.<a name="line.3407"></a>
-<span class="sourceLineNo">3408</span>   * @throws Exception<a name="line.3408"></a>
-<span class="sourceLineNo">3409</span>   */<a name="line.3409"></a>
-<span class="sourceLineNo">3410</span>  @Test<a name="line.3410"></a>
-<span class="sourceLineNo">3411</span>  public void testLongQualifier() throws Exception {<a name="line.3411"></a>
-<span class="sourceLineNo">3412</span>    byte[] family = Bytes.toBytes("family");<a name="line.3412"></a>
-<span class="sourceLineNo">3413</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.3413"></a>
-<span class="sourceLineNo">3414</span>    byte[] q = new byte[Short.MAX_VALUE+2];<a name="line.3414"></a>
-<span class="sourceLineNo">3415</span>    Arrays.fill(q, 0, q.length-1, (byte)42);<a name="line.3415"></a>
-<span class="sourceLineNo">3416</span>    for (byte i=0; i&lt;10; i++) {<a name="line.3416"></a>
-<span class="sourceLineNo">3417</span>      Put p = new Put(Bytes.toBytes("row"));<a name="line.3417"></a>
-<span class="sourceLineNo">3418</span>      // qualifiers that differ past Short.MAX_VALUE<a name="line.3418"></a>
-<span class="sourceLineNo">3419</span>      q[q.length-1]=i;<a name="line.3419"></a>
-<span class="sourceLineNo">3420</span>      p.addColumn(family, q, q);<a name="line.3420"></a>
-<span class="sourceLineNo">3421</span>      region.put(p);<a name="line.3421"></a>
-<span class="sourceLineNo">3422</span>    }<a name="line.3422"></a>
-<span class="sourceLineNo">3423</span>    region.flush(false);<a name="line.3423"></a>
-<span class="sourceLineNo">3424</span>  }<a name="line.3424"></a>
-<span class="sourceLineNo">3425</span><a name="line.3425"></a>
-<span class="sourceLineNo">3426</span>  /**<a name="line.3426"></a>
-<span class="sourceLineNo">3427</span>   * Flushes the cache in a thread while scanning. The tests verify that the<a name="line.3427"></a>
-<span class="sourceLineNo">3428</span>   * scan is coherent - e.g. the returned results are always of the same or<a name="line.3428"></a>
-<span class="sourceLineNo">3429</span>   * later update as the previous results.<a name="line.3429"></a>
-<span class="sourceLineNo">3430</span>   *<a name="line.3430"></a>
-<span class="sourceLineNo">3431</span>   * @throws IOException<a name="line.3431"></a>
-<span class="sourceLineNo">3432</span>   *           scan / compact<a name="line.3432"></a>
-<span class="sourceLineNo">3433</span>   * @throws InterruptedException<a name="line.3433"></a>
-<span class="sourceLineNo">3434</span>   *           thread join<a name="line.3434"></a>
-<span class="sourceLineNo">3435</span>   */<a name="line.3435"></a>
-<span class="sourceLineNo">3436</span>  @Test<a name="line.3436"></a>
-<span class="sourceLineNo">3437</span>  public void testFlushCacheWhileScanning() throws IOException, InterruptedException {<a name="line.3437"></a>
-<span class="sourceLineNo">3438</span>    byte[] family = Bytes.toBytes("family");<a name="line.3438"></a>
-<span class="sourceLineNo">3439</span>    int numRows = 1000;<a name="line.3439"></a>
-<span class="sourceLineNo">3440</span>    int flushAndScanInterval = 10;<a name="line.3440"></a>
-<span class="sourceLineNo">3441</span>    int compactInterval = 10 * flushAndScanInterval;<a name="line.3441"></a>
-<span class="sourceLineNo">3442</span><a name="line.3442"></a>
-<span class="sourceLineNo">3443</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.3443"></a>
-<span class="sourceLineNo">3444</span>    FlushThread flushThread = new FlushThread();<a name="line.3444"></a>
-<span class="sourceLineNo">3445</span>    try {<a name="line.3445"></a>
-<span class="sourceLineNo">3446</span>      flushThread.start();<a name="line.3446"></a>
-<span class="sourceLineNo">3447</span><a name="line.3447"></a>
-<span class="sourceLineNo">3448</span>      Scan scan = new Scan();<a name="line.3448"></a>
-<span class="sourceLineNo">3449</span>      scan.addFamily(family);<a name="line.3449"></a>
-<span class="sourceLineNo">3450</span>      scan.setFilter(new SingleColumnValueFilter(family, qual1, CompareOperator.EQUAL,<a name="line.3450"></a>
-<span class="sourceLineNo">3451</span>          new BinaryComparator(Bytes.toBytes(5L))));<a name="line.3451"></a>
+<span class="sourceLineNo">3345</span>      region.put(put);<a name="line.3345"></a>
+<span class="sourceLineNo">3346</span>    }<a name="line.3346"></a>
+<span class="sourceLineNo">3347</span><a name="line.3347"></a>
+<span class="sourceLineNo">3348</span>    Scan scan = new Scan();<a name="line.3348"></a>
+<span class="sourceLineNo">3349</span>    scan.setLoadColumnFamiliesOnDemand(true);<a name="line.3349"></a>
+<span class="sourceLineNo">3350</span>    Filter bogusFilter = new FilterBase() {<a name="line.3350"></a>
+<span class="sourceLineNo">3351</span>      @Override<a name="line.3351"></a>
+<span class="sourceLineNo">3352</span>      public ReturnCode filterCell(final Cell ignored) throws IOException {<a name="line.3352"></a>
+<span class="sourceLineNo">3353</span>        return ReturnCode.INCLUDE;<a name="line.3353"></a>
+<span class="sourceLineNo">3354</span>      }<a name="line.3354"></a>
+<span class="sourceLineNo">3355</span>      @Override<a name="line.3355"></a>
+<span class="sourceLineNo">3356</span>      public boolean isFamilyEssential(byte[] name) {<a name="line.3356"></a>
+<span class="sourceLineNo">3357</span>        return Bytes.equals(name, cf_first);<a name="line.3357"></a>
+<span class="sourceLineNo">3358</span>      }<a name="line.3358"></a>
+<span class="sourceLineNo">3359</span>    };<a name="line.3359"></a>
+<span class="sourceLineNo">3360</span><a name="line.3360"></a>
+<span class="sourceLineNo">3361</span>    scan.setFilter(bogusFilter);<a name="line.3361"></a>
+<span class="sourceLineNo">3362</span>    InternalScanner s = region.getScanner(scan);<a name="line.3362"></a>
+<span class="sourceLineNo">3363</span><a name="line.3363"></a>
+<span class="sourceLineNo">3364</span>    // Our data looks like this:<a name="line.3364"></a>
+<span class="sourceLineNo">3365</span>    // r0: first:a, first:b, second:a, second:b<a name="line.3365"></a>
+<span class="sourceLineNo">3366</span>    // r1: first:a, first:b, second:a, second:b<a name="line.3366"></a>
+<span class="sourceLineNo">3367</span>    // r2: first:a, first:b, second:a, second:b<a name="line.3367"></a>
+<span class="sourceLineNo">3368</span>    // r3: first:a, first:b, second:a, second:b<a name="line.3368"></a>
+<span class="sourceLineNo">3369</span>    // r4: first:a, first:b, second:a, second:b<a name="line.3369"></a>
+<span class="sourceLineNo">3370</span>    // r5: first:a<a name="line.3370"></a>
+<span class="sourceLineNo">3371</span>    // r6: first:a<a name="line.3371"></a>
+<span class="sourceLineNo">3372</span>    // r7: first:a<a name="line.3372"></a>
+<span class="sourceLineNo">3373</span>    // r8: first:a<a name="line.3373"></a>
+<span class="sourceLineNo">3374</span>    // r9: first:a<a name="line.3374"></a>
+<span class="sourceLineNo">3375</span><a name="line.3375"></a>
+<span class="sourceLineNo">3376</span>    // But due to next's limit set to 3, we should get this:<a name="line.3376"></a>
+<span class="sourceLineNo">3377</span>    // r0: first:a, first:b, second:a<a name="line.3377"></a>
+<span class="sourceLineNo">3378</span>    // r0: second:b<a name="line.3378"></a>
+<span class="sourceLineNo">3379</span>    // r1: first:a, first:b, second:a<a name="line.3379"></a>
+<span class="sourceLineNo">3380</span>    // r1: second:b<a name="line.3380"></a>
+<span class="sourceLineNo">3381</span>    // r2: first:a, first:b, second:a<a name="line.3381"></a>
+<span class="sourceLineNo">3382</span>    // r2: second:b<a name="line.3382"></a>
+<span class="sourceLineNo">3383</span>    // r3: first:a, first:b, second:a<a name="line.3383"></a>
+<span class="sourceLineNo">3384</span>    // r3: second:b<a name="line.3384"></a>
+<span class="sourceLineNo">3385</span>    // r4: first:a, first:b, second:a<a name="line.3385"></a>
+<span class="sourceLineNo">3386</span>    // r4: second:b<a name="line.3386"></a>
+<span class="sourceLineNo">3387</span>    // r5: first:a<a name="line.3387"></a>
+<span class="sourceLineNo">3388</span>    // r6: first:a<a name="line.3388"></a>
+<span class="sourceLineNo">3389</span>    // r7: first:a<a name="line.3389"></a>
+<span class="sourceLineNo">3390</span>    // r8: first:a<a name="line.3390"></a>
+<span class="sourceLineNo">3391</span>    // r9: first:a<a name="line.3391"></a>
+<span class="sourceLineNo">3392</span><a name="line.3392"></a>
+<span class="sourceLineNo">3393</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.3393"></a>
+<span class="sourceLineNo">3394</span>    int index = 0;<a name="line.3394"></a>
+<span class="sourceLineNo">3395</span>    ScannerContext scannerContext = ScannerContext.newBuilder().setBatchLimit(3).build();<a name="line.3395"></a>
+<span class="sourceLineNo">3396</span>    while (true) {<a name="line.3396"></a>
+<span class="sourceLineNo">3397</span>      boolean more = s.next(results, scannerContext);<a name="line.3397"></a>
+<span class="sourceLineNo">3398</span>      if ((index &gt;&gt; 1) &lt; 5) {<a name="line.3398"></a>
+<span class="sourceLineNo">3399</span>        if (index % 2 == 0) {<a name="line.3399"></a>
+<span class="sourceLineNo">3400</span>          assertEquals(3, results.size());<a name="line.3400"></a>
+<span class="sourceLineNo">3401</span>        } else {<a name="line.3401"></a>
+<span class="sourceLineNo">3402</span>          assertEquals(1, results.size());<a name="line.3402"></a>
+<span class="sourceLineNo">3403</span>        }<a name="line.3403"></a>
+<span class="sourceLineNo">3404</span>      } else {<a name="line.3404"></a>
+<span class="sourceLineNo">3405</span>        assertEquals(1, results.size());<a name="line.3405"></a>
+<span class="sourceLineNo">3406</span>      }<a name="line.3406"></a>
+<span class="sourceLineNo">3407</span>      results.clear();<a name="line.3407"></a>
+<span class="sourceLineNo">3408</span>      index++;<a name="line.3408"></a>
+<span class="sourceLineNo">3409</span>      if (!more) {<a name="line.3409"></a>
+<span class="sourceLineNo">3410</span>        break;<a name="line.3410"></a>
+<span class="sourceLineNo">3411</span>      }<a name="line.3411"></a>
+<span class="sourceLineNo">3412</span>    }<a name="line.3412"></a>
+<span class="sourceLineNo">3413</span>  }<a name="line.3413"></a>
+<span class="sourceLineNo">3414</span><a name="line.3414"></a>
+<span class="sourceLineNo">3415</span>  /**<a name="line.3415"></a>
+<span class="sourceLineNo">3416</span>   * Write an HFile block full with Cells whose qualifier that are identical between<a name="line.3416"></a>
+<span class="sourceLineNo">3417</span>   * 0 and Short.MAX_VALUE. See HBASE-13329.<a name="line.3417"></a>
+<span class="sourceLineNo">3418</span>   * @throws Exception<a name="line.3418"></a>
+<span class="sourceLineNo">3419</span>   */<a name="line.3419"></a>
+<span class="sourceLineNo">3420</span>  @Test<a name="line.3420"></a>
+<span class="sourceLineNo">3421</span>  public void testLongQualifier() throws Exception {<a name="line.3421"></a>
+<span class="sourceLineNo">3422</span>    byte[] family = Bytes.toBytes("family");<a name="line.3422"></a>
+<span class="sourceLineNo">3423</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.3423"></a>
+<span class="sourceLineNo">3424</span>    byte[] q = new byte[Short.MAX_VALUE+2];<a name="line.3424"></a>
+<span class="sourceLineNo">3425</span>    Arrays.fill(q, 0, q.length-1, (byte)42);<a name="line.3425"></a>
+<span class="sourceLineNo">3426</span>    for (byte i=0; i&lt;10; i++) {<a name="line.3426"></a>
+<span class="sourceLineNo">3427</span>      Put p = new Put(Bytes.toBytes("row"));<a name="line.3427"></a>
+<span class="sourceLineNo">3428</span>      // qualifiers that differ past Short.MAX_VALUE<a name="line.3428"></a>
+<span class="sourceLineNo">3429</span>      q[q.length-1]=i;<a name="line.3429"></a>
+<span class="sourceLineNo">3430</span>      p.addColumn(family, q, q);<a name="line.3430"></a>
+<span class="sourceLineNo">3431</span>      region.put(p);<a name="line.3431"></a>
+<span class="sourceLineNo">3432</span>    }<a name="line.3432"></a>
+<span class="sourceLineNo">3433</span>    region.flush(false);<a name="line.3433"></a>
+<span class="sourceLineNo">3434</span>  }<a name="line.3434"></a>
+<span class="sourceLineNo">3435</span><a name="line.3435"></a>
+<span class="sourceLineNo">3436</span>  /**<a name="line.3436"></a>
+<span class="sourceLineNo">3437</span>   * Flushes the cache in a thread while scanning. The tests verify that the<a name="line.3437"></a>
+<span class="sourceLineNo">3438</span>   * scan is coherent - e.g. the returned results are always of the same or<a name="line.3438"></a>
+<span class="sourceLineNo">3439</span>   * later update as the previous results.<a name="line.3439"></a>
+<span class="sourceLineNo">3440</span>   *<a name="line.3440"></a>
+<span class="sourceLineNo">3441</span>   * @throws IOException<a name="line.3441"></a>
+<span class="sourceLineNo">3442</span>   *           scan / compact<a name="line.3442"></a>
+<span class="sourceLineNo">3443</span>   * @throws InterruptedException<a name="line.3443"></a>
+<span class="sourceLineNo">3444</span>   *           thread join<a name="line.3444"></a>
+<span class="sourceLineNo">3445</span>   */<a name="line.3445"></a>
+<span class="sourceLineNo">3446</span>  @Test<a name="line.3446"></a>
+<span class="sourceLineNo">3447</span>  public void testFlushCacheWhileScanning() throws IOException, InterruptedException {<a name="line.3447"></a>
+<span class="sourceLineNo">3448</span>    byte[] family = Bytes.toBytes("family");<a name="line.3448"></a>
+<span class="sourceLineNo">3449</span>    int numRows = 1000;<a name="line.3449"></a>
+<span class="sourceLineNo">3450</span>    int flushAndScanInterval = 10;<a name="line.3450"></a>
+<span class="sourceLineNo">3451</span>    int compactInterval = 10 * flushAndScanInterval;<a name="line.3451"></a>
 <span class="sourceLineNo">3452</span><a name="line.3452"></a>
-<span class="sourceLineNo">3453</span>      int expectedCount = 0;<a name="line.3453"></a>
-<span class="sourceLineNo">3454</span>      List&lt;Cell&gt; res = new ArrayList&lt;&gt;();<a name="line.3454"></a>
-<span class="sourceLineNo">3455</span><a name="line.3455"></a>
-<span class="sourceLineNo">3456</span>      boolean toggle = true;<a name="line.3456"></a>
-<span class="sourceLineNo">3457</span>      for (long i = 0; i &lt; numRows; i++) {<a name="line.3457"></a>
-<span class="sourceLineNo">3458</span>        Put put = new Put(Bytes.toBytes(i));<a name="line.3458"></a>
-<span class="sourceLineNo">3459</span>        put.setDurability(Durability.SKIP_WAL);<a name="line.3459"></a>
-<span class="sourceLineNo">3460</span>        put.addColumn(family, qual1, Bytes.toBytes(i % 10));<a name="line.3460"></a>
-<span class="sourceLineNo">3461</span>        region.put(put);<a name="line.3461"></a>
+<span class="sourceLineNo">3453</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.3453"></a>
+<span class="sourceLineNo">3454</span>    FlushThread flushThread = new FlushThread();<a name="line.3454"></a>
+<span class="sourceLineNo">3455</span>    try {<a name="line.3455"></a>
+<span class="sourceLineNo">3456</span>      flushThread.start();<a name="line.3456"></a>
+<span class="sourceLineNo">3457</span><a name="line.3457"></a>
+<span class="sourceLineNo">3458</span>      Scan scan = new Scan();<a name="line.3458"></a>
+<span class="sourceLineNo">3459</span>      scan.addFamily(family);<a name="line.3459"></a>
+<span class="sourceLineNo">3460</span>      scan.setFilter(new SingleColumnValueFilter(family, qual1, CompareOperator.EQUAL,<a name="line.3460"></a>
+<span class="sourceLineNo">3461</span>          new BinaryComparator(Bytes.toBytes(5L))));<a name="line.3461"></a>
 <span class="sourceLineNo">3462</span><a name="line.3462"></a>
-<span class="sourceLineNo">3463</span>        if (i != 0 &amp;&amp; i % compactInterval == 0) {<a name="line.3463"></a>
-<span class="sourceLineNo">3464</span>          LOG.debug("iteration = " + i+ " ts="+System.currentTimeMillis());<a name="line.3464"></a>
-<span class="sourceLineNo">3465</span>          region.compact(true);<a name="line.3465"></a>
-<span class="sourceLineNo">3466</span>        }<a name="line.3466"></a>
-<span class="sourceLineNo">3467</span><a name="line.3467"></a>
-<span class="sourceLineNo">3468</span>        if (i % 10 == 5L) {<a name="line.3468"></a>
-<span class="sourceLineNo">3469</span>          expectedCount++;<a name="line.3469"></a>
-<span class="sourceLineNo">3470</span>        }<a name="line.3470"></a>
-<span class="sourceLineNo">3471</span><a name="line.3471"></a>
-<span class="sourceLineNo">3472</span>        if (i != 0 &amp;&amp; i % flushAndScanInterval == 0) {<a name="line.3472"></a>
-<span class="sourceLineNo">3473</span>          res.clear();<a name="line.3473"></a>
-<span class="sourceLineNo">3474</span>          InternalScanner scanner = region.getScanner(scan);<a name="line.3474"></a>
-<span class="sourceLineNo">3475</span>          if (toggle) {<a name="line.3475"></a>
-<span class="sourceLineNo">3476</span>            flushThread.flush();<a name="line.3476"></a>
-<span class="sourceLineNo">3477</span>          }<a name="line.3477"></a>
-<span class="sourceLineNo">3478</span>          while (scanner.next(res))<a name="line.3478"></a>
-<span class="sourceLineNo">3479</span>            ;<a name="line.3479"></a>
-<span class="sourceLineNo">3480</span>          if (!toggle) {<a name="line.3480"></a>
-<span class="sourceLineNo">3481</span>            flushThread.flush();<a name="line.3481"></a>
-<span class="sourceLineNo">3482</span>          }<a name="line.3482"></a>
-<span class="sourceLineNo">3483</span>          assertEquals("toggle="+toggle+"i=" + i + " ts="+System.currentTimeMillis(),<a name="line.3483"></a>
-<span class="sourceLineNo">3484</span>              expectedCount, res.size());<a name="line.3484"></a>
-<span class="sourceLineNo">3485</span>          toggle = !toggle;<a name="line.3485"></a>
-<span class="sourceLineNo">3486</span>        }<a name="line.3486"></a>
-<span class="sourceLineNo">3487</span>      }<a name="line.3487"></a>
-<span class="sourceLineNo">3488</span><a name="line.3488"></a>
-<span class="sourceLineNo">3489</span>    } finally {<a name="line.3489"></a>
-<span class="sourceLineNo">3490</span>      try {<a name="line.3490"></a>
-<span class="sourceLineNo">3491</span>        flushThread.done();<a name="line.3491"></a>
-<span class="sourceLineNo">3492</span>        flushThread.join();<a name="line.3492"></a>
-<span class="sourceLineNo">3493</span>        flushThread.checkNoError();<a name="line.3493"></a>
-<span class="sourceLineNo">3494</span>      } catch (InterruptedException ie) {<a name="line.3494"></a>
-<span class="sourceLineNo">3495</span>        LOG.warn("Caught exception when joining with flushThread", ie);<a name="line.3495"></a>
-<span class="sourceLineNo">3496</span>      }<a name="line.3496"></a>
-<span class="sourceLineNo">3497</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.3497"></a>
-<span class="sourceLineNo">3498</span>      this.region = null;<a name="line.3498"></a>
-<span class="sourceLineNo">3499</span>    }<a name="line.3499"></a>
-<span class="sourceLineNo">3500</span>  }<a name="line.3500"></a>
-<span class="sourceLineNo">3501</span><a name="line.3501"></a>
-<span class="sourceLineNo">3502</span>  protected class FlushThread extends Thread {<a name="line.3502"></a>
-<span class="sourceLineNo">3503</span>    private volatile boolean done;<a name="line.3503"></a>
-<span class="sourceLineNo">3504</span>    private Throwable error = null;<a name="line.3504"></a>
-<span class="sourceLineNo">3505</span><a name="line.3505"></a>
-<span class="sourceLineNo">3506</span>    FlushThread() {<a name="line.3506"></a>
-<span class="sourceLineNo">3507</span>      super("FlushThread");<a name="line.3507"></a>
-<span class="sourceLineNo">3508</span>    }<a name="line.3508"></a>
-<span class="sourceLineNo">3509</span><a name="line.3509"></a>
-<span class="sourceLineNo">3510</span>    public void done() {<a name="line.3510"></a>
-<span class="sourceLineNo">3511</span>      done = true;<a name="line.3511"></a>
-<span class="sourceLineNo">3512</span>      synchronized (this) {<a name="line.3512"></a>
-<span class="sourceLineNo">3513</span>        interrupt();<a name="line.3513"></a>
-<span class="sourceLineNo">3514</span>      }<a name="line.3514"></a>
-<span class="sourceLineNo">3515</span>    }<a name="line.3515"></a>
-<span class="sourceLineNo">3516</span><a name="line.3516"></a>
-<span class="sourceLineNo">3517</span>    public void checkNoError() {<a name="line.3517"></a>
-<span class="sourceLineNo">3518</span>      if (error != null) {<a name="line.3518"></a>
-<span class="sourceLineNo">3519</span>        assertNull(error);<a name="line.3519"></a>
-<span class="sourceLineNo">3520</span>      }<a name="line.3520"></a>
-<span class="sourceLineNo">3521</span>    }<a name="line.3521"></a>
-<span class="sourceLineNo">3522</span><a name="line.3522"></a>
-<span class="sourceLineNo">3523</span>    @Override<a name="line.3523"></a>
-<span class="sourceLineNo">3524</span>    public void run() {<a name="line.3524"></a>
-<span class="sourceLineNo">3525</span>      done = false;<a name="line.3525"></a>
-<span class="sourceLineNo">3526</span>      while (!done) {<a name="line.3526"></a>
-<span class="sourceLineNo">3527</span>        synchronized (this) {<a name="line.3527"></a>
-<span class="sourceLineNo">3528</span>          try {<a name="line.3528"></a>
-<span class="sourceLineNo">3529</span>            wait();<a name="line.3529"></a>
-<span class="sourceLineNo">3530</span>          } catch (InterruptedException ignored) {<a name="line.3530"></a>
-<span class="sourceLineNo">3531</span>            if (done) {<a name="line.3531"></a>
-<span class="sourceLineNo">3532</span>              break;<a name="line.3532"></a>
-<span class="sourceLineNo">3533</span>            }<a name="line.3533"></a>
-<span class="sourceLineNo">3534</span>          }<a name="line.3534"></a>
-<span class="sourceLineNo">3535</span>        }<a name="line.3535"></a>
-<span class="sourceLineNo">3536</span>        try {<a name="line.3536"></a>
-<span class="sourceLineNo">3537</span>          region.flush(true);<a name="line.3537"></a>
-<span class="sourceLineNo">3538</span>        } catch (IOException e) {<a name="line.3538"></a>
-<span class="sourceLineNo">3539</span>          if (!done) {<a name="line.3539"></a>
-<span class="sourceLineNo">3540</span>            LOG.error("Error while flushing cache", e);<a name="line.3540"></a>
-<span class="sourceLineNo">3541</span>            error = e;<a name="line.3541"></a>
-<span class="sourceLineNo">3542</span>          }<a name="line.3542"></a>
-<span class="sourceLineNo">3543</span>          break;<a name="line.3543"></a>
-<span class="sourceLineNo">3544</span>        } catch (Throwable t) {<a name="line.3544"></a>
-<span class="sourceLineNo">3545</span>          LOG.error("Uncaught exception", t);<a name="line.3545"></a>
-<span class="sourceLineNo">3546</span>          throw t;<a name="line.3546"></a>
-<span class="sourceLineNo">3547</span>        }<a name="line.3547"></a>
-<span class="sourceLineNo">3548</span>      }<a name="line.3548"></a>
-<span class="sourceLineNo">3549</span>    }<a name="line.3549"></a>
-<span class="sourceLineNo">3550</span><a name="line.3550"></a>
-<span class="sourceLineNo">3551</span>    public void flush() {<a name="line.3551"></a>
-<span class="sourceLineNo">3552</span>      synchronized (this) {<a name="line.3552"></a>
-<span class="sourceLineNo">3553</span>        notify();<a name="line.3553"></a>
-<span class="sourceLineNo">3554</span>      }<a name="line.3554"></a>
-<span class="sourceLineNo">3555</span>    }<a name="line.3555"></a>
-<span class="sourceLineNo">3556</span>  }<a name="line.3556"></a>
-<span class="sourceLineNo">3557</span><a name="line.3557"></a>
-<span class="sourceLineNo">3558</span>  /**<a name="line.3558"></a>
-<span class="sourceLineNo">3559</span>   * Writes very wide records and scans for the latest every time.. Flushes and<a name="line.3559"></a>
-<span class="sourceLineNo">3560</span>   * compacts the region every now and then to keep things realistic.<a name="line.3560"></a>
-<span class="sourceLineNo">3561</span>   *<a name="line.3561"></a>
-<span class="sourceLineNo">3562</span>   * @throws IOException<a name="line.3562"></a>
-<span class="sourceLineNo">3563</span>   *           by flush / scan / compaction<a name="line.3563"></a>
-<span class="sourceLineNo">3564</span>   * @throws InterruptedException<a name="line.3564"></a>
-<span class="sourceLineNo">3565</span>   *           when joining threads<a name="line.3565"></a>
-<span class="sourceLineNo">3566</span>   */<a name="line.3566"></a>
-<span class="sourceLineNo">3567</span>  @Test<a name="line.3567"></a>
-<span class="sourceLineNo">3568</span>  public void testWritesWhileScanning() throws IOException, InterruptedException {<a name="line.3568"></a>
-<span class="sourceLineNo">3569</span>    int testCount = 100;<a name="line.3569"></a>
-<span class="sourceLineNo">3570</span>    int numRows = 1;<a name="line.3570"></a>
-<span class="sourceLineNo">3571</span>    int numFamilies = 10;<a name="line.3571"></a>
-<span class="sourceLineNo">3572</span>    int numQualifiers = 100;<a name="line.3572"></a>
-<span class="sourceLineNo">3573</span>    int flushInterval = 7;<a name="line.3573"></a>
-<span class="sourceLineNo">3574</span>    int compactInterval = 5 * flushInterval;<a name="line.3574"></a>
-<span class="sourceLineNo">3575</span>    byte[][] families = new byte[numFamilies][];<a name="line.3575"></a>
-<span class="sourceLineNo">3576</span>    for (int i = 0; i &lt; numFamilies; i++) {<a name="line.3576"></a>
-<span class="sourceLineNo">3577</span>      families[i] = Bytes.toBytes("family" + i);<a name="line.3577"></a>
-<span class="sourceLineNo">3578</span>    }<a name="line.3578"></a>
-<span class="sourceLineNo">3579</span>    byte[][] qualifiers = new byte[numQualifiers][];<a name="line.3579"></a>
-<span class="sourceLineNo">3580</span>    for (int i = 0; i &lt; numQualifiers; i++) {<a name="line.3580"></a>
-<span class="sourceLineNo">3581</span>      qualifiers[i] = Bytes.toBytes("qual" + i);<a name="line.3581"></a>
-<span class="sourceLineNo">3582</span>    }<a name="line.3582"></a>
-<span class="sourceLineNo">3583</span><a name="line.3583"></a>
-<span class="sourceLineNo">3584</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.3584"></a>
-<span class="sourceLineNo">3585</span>    FlushThread flushThread = new FlushThread();<a name="line.3585"></a>
-<span class="sourceLineNo">3586</span>    PutThread putThread = new PutThread(numRows, families, qualifiers);<a name="line.3586"></a>
-<span class="sourceLineNo">3587</span>    try {<a name="line.3587"></a>
-<span class="sourceLineNo">3588</span>      putThread.start();<a name="line.3588"></a>
-<span class="sourceLineNo">3589</span>      putThread.waitForFirstPut();<a name="line.3589"></a>
-<span class="sourceLineNo">3590</span><a name="line.3590"></a>
-<span class="sourceLineNo">3591</span>      flushThread.start();<a name="line.3591"></a>
-<span class="sourceLineNo">3592</span><a name="line.3592"></a>
-<span class="sourceLineNo">3593</span>      Scan scan = new Scan(Bytes.toBytes("row0"), Bytes.toBytes("row1"));<a name="line.3593"></a>
-<span class="sourceLineNo">3594</span><a name="line.3594"></a>
-<span class="sourceLineNo">3595</span>      int expectedCount = numFamilies * numQualifiers;<a name="line.3595"></a>
-<span class="sourceLineNo">3596</span>      List&lt;Cell&gt; res = new ArrayList&lt;&gt;();<a name="line.3596"></a>
-<span class="sourceLineNo">3597</span><a name="line.3597"></a>
-<span class="sourceLineNo">3598</span>      long prevTimestamp = 0L;<a name="line.3598"></a>
-<span class="sourceLineNo">3599</span>      for (int i = 0; i &lt; testCount; i++) {<a name="line.3599"></a>
+<span class="sourceLineNo">3463</span>      int expectedCount = 0;<a name="line.3463"></a>
+<span class="sourceLineNo">3464</span>      List&lt;Cell&gt; res = new ArrayList&lt;&gt;();<a name="line.3464"></a>
+<span class="sourceLineNo">3465</span><a name="line.3465"></a>
+<span class="sourceLineNo">3466</span>      boolean toggle = true;<a name="line.3466"></a>
+<span class="sourceLineNo">3467</span>      for (long i = 0; i &lt; numRows; i++) {<a name="line.3467"></a>
+<span class="sourceLineNo">3468</span>        Put put = new Put(Bytes.toBytes(i));<a name="line.3468"></a>
+<span class="sourceLineNo">3469</span>        put.setDurability(Durability.SKIP_WAL);<a name="line.3469"></a>
+<span class="sourceLineNo">3470</span>        put.addColumn(family, qual1, Bytes.toBytes(i % 10));<a name="line.3470"></a>
+<span class="sourceLineNo">3471</span>        region.put(put);<a name="line.3471"></a>
+<span class="sourceLineNo">3472</span><a name="line.3472"></a>
+<span class="sourceLineNo">3473</span>        if (i != 0 &amp;&amp; i % compactInterval == 0) {<a name="line.3473"></a>
+<span class="sourceLineNo">3474</span>          LOG.debug("iteration = " + i+ " ts="+System.currentTimeMillis());<a name="line.3474"></a>
+<span class="sourceLineNo">3475</span>          region.compact(true);<a name="line.3475"></a>
+<span class="sourceLineNo">3476</span>        }<a name="line.3476"></a>
+<span class="sourceLineNo">3477</span><a name="line.3477"></a>
+<span class="sourceLineNo">3478</span>        if (i % 10 == 5L) {<a name="line.3478"></a>
+<span class="sourceLineNo">3479</span>          expectedCount++;<a name="line.3479"></a>
+<span class="sourceLineNo">3480</span>        }<a name="line.3480"></a>
+<span class="sourceLineNo">3481</span><a name="line.3481"></a>
+<span class="sourceLineNo">3482</span>        if (i != 0 &amp;&amp; i % flushAndScanInterval == 0) {<a name="line.3482"></a>
+<span class="sourceLineNo">3483</span>          res.clear();<a name="line.3483"></a>
+<span class="sourceLineNo">3484</span>          InternalScanner scanner = region.getScanner(scan);<a name="line.3484"></a>
+<span class="sourceLineNo">3485</span>          if (toggle) {<a name="line.3485"></a>
+<span class="sourceLineNo">3486</span>            flushThread.flush();<a name="line.3486"></a>
+<span class="sourceLineNo">3487</span>          }<a name="line.3487"></a>
+<span class="sourceLineNo">3488</span>          while (scanner.next(res))<a name="line.3488"></a>
+<span class="sourceLineNo">3489</span>            ;<a name="line.3489"></a>
+<span class="sourceLineNo">3490</span>          if (!toggle) {<a name="line.3490"></a>
+<span class="sourceLineNo">3491</span>            flushThread.flush();<a name="line.3491"></a>
+<span class="sourceLineNo">3492</span>          }<a name="line.3492"></a>
+<span class="sourceLineNo">3493</span>          assertEquals("toggle="+toggle+"i=" + i + " ts="+System.currentTimeMillis(),<a name="line.3493"></a>
+<span class="sourceLineNo">3494</span>              expectedCount, res.size());<a name="line.3494"></a>
+<span class="sourceLineNo">3495</span>          toggle = !toggle;<a name="line.3495"></a>
+<span class="sourceLineNo">3496</span>        }<a name="line.3496"></a>
+<span class="sourceLineNo">3497</span>      }<a name="line.3497"></a>
+<span class="sourceLineNo">3498</span><a name="line.3498"></a>
+<span class="sourceLineNo">3499</span>    } finally {<a name="line.3499"></a>
+<span class="sourceLineNo">3500</span>      try {<a name="line.3500"></a>
+<span class="sourceLineNo">3501</span>        flushThread.done();<a name="line.3501"></a>
+<span class="sourceLineNo">3502</span>        flushThread.join();<a name="line.3502"></a>
+<span class="sourceLineNo">3503</span>        flushThread.checkNoError();<a name="line.3503"></a>
+<span class="sourceLineNo">3504</span>      } catch (InterruptedException ie) {<a name="line.3504"></a>
+<span class="sourceLineNo">3505</span>        LOG.warn("Caught exception when joining with flushThread", ie);<a name="line.3505"></a>
+<span class="sourceLineNo">3506</span>      }<a name="line.3506"></a>
+<span class="sourceLineNo">3507</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.3507"></a>
+<span class="sourceLineNo">3508</span>      this.region = null;<a name="line.3508"></a>
+<span class="sourceLineNo">3509</span>    }<a name="line.3509"></a>
+<span class="sourceLineNo">3510</span>  }<a name="line.3510"></a>
+<span class="sourceLineNo">3511</span><a name="line.3511"></a>
+<span class="sourceLineNo">3512</span>  protected class FlushThread extends Thread {<a name="line.3512"></a>
+<span class="sourceLineNo">3513</span>    private volatile boolean done;<a name="line.3513"></a>
+<span class="sourceLineNo">3514</span>    private Throwable error = null;<a name="line.3514"></a>
+<span class="sourceLineNo">3515</span><a name="line.3515"></a>
+<span class="sourceLineNo">3516</span>    FlushThread() {<a name="line.3516"></a>
+<span class="sourceLineNo">3517</span>      super("FlushThread");<a name="line.3517"></a>
+<span class="sourceLineNo">3518</span>    }<a name="line.3518"></a>
+<span class="sourceLineNo">3519</span><a name="line.3519"></a>
+<span class="sourceLineNo">3520</span>    public void done() {<a name="line.3520"></a>
+<span class="sourceLineNo">3521</span>      done = true;<a name="line.3521"></a>
+<span class="sourceLineNo">3522</span>      synchronized (this) {<a name="line.3522"></a>
+<span class="sourceLineNo">3523</span>        interrupt();<a name="line.3523"></a>
+<span class="sourceLineNo">3524</span>      }<a name="line.3524"></a>
+<span class="sourceLineNo">3525</span>    }<a name="line.3525"></a>
+<span class="sourceLineNo">3526</span><a name="line.3526"></a>
+<span class="sourceLineNo">3527</span>    public void checkNoError() {<a name="line.3527"></a>
+<span class="sourceLineNo">3528</span>      if (error != null) {<a name="line.3528"></a>
+<span class="sourceLineNo">3529</span>        assertNull(error);<a name="line.3529"></a>
+<span class="sourceLineNo">3530</span>      }<a name="line.3530"></a>
+<span class="sourceLineNo">3531</span>    }<a name="line.3531"></a>
+<span class="sourceLineNo">3532</span><a name="line.3532"></a>
+<span class="sourceLineNo">3533</span>    @Override<a name="line.3533"></a>
+<span class="sourceLineNo">3534</span>    public void run() {<a name="line.3534"></a>
+<span class="sourceLineNo">3535</span>      done = false;<a name="line.3535"></a>
+<span class="sourceLineNo">3536</span>      while (!done) {<a name="line.3536"></a>
+<span class="sourceLineNo">3537</span>        synchronized (this) {<a name="line.3537"></a>
+<span class="sourceLineNo">3538</span>          try {<a name="line.3538"></a>
+<span class="sourceLineNo">3539</span>            wait();<a name="line.3539"></a>
+<span class="sourceLineNo">3540</span>          } catch (InterruptedException ignored) {<a name="line.3540"></a>
+<span class="sourceLineNo">3541</span>            if (done) {<a name="line.3541"></a>
+<span class="sourceLineNo">3542</span>              break;<a name="line.3542"></a>
+<span class="sourceLineNo">3543</span>            }<a name="line.3543"></a>
+<span class="sourceLineNo">3544</span>          }<a name="line.3544"></a>
+<span class="sourceLineNo">3545</span>        }<a name="line.3545"></a>
+<span class="sourceLineNo">3546</span>        try {<a name="line.3546"></a>
+<span class="sourceLineNo">3547</span>          region.flush(true);<a name="line.3547"></a>
+<span class="sourceLineNo">3548</span>        } catch (IOException e) {<a name="line.3548"></a>
+<span class="sourceLineNo">3549</span>          if (!done) {<a name="line.3549"></a>
+<span class="sourceLineNo">3550</span>            LOG.error("Error while flushing cache", e);<a name="line.3550"></a>
+<span class="sourceLineNo">3551</span>            error = e;<a name="line.3551"></a>
+<span class="sourceLineNo">3552</span>          }<a name="line.3552"></a>
+<span class="sourceLineNo">3553</span>          break;<a name="line.3553"></a>
+<span class="sourceLineNo">3554</span>        } catch (Throwable t) {<a name="line.3554"></a>
+<span class="sourceLineNo">3555</span>          LOG.error("Uncaught exception", t);<a name="line.3555"></a>
+<span class="sourceLineNo">3556</span>          throw t;<a name="line.3556"></a>
+<span class="sourceLineNo">3557</span>        }<a name="line.3557"></a>
+<span class="sourceLineNo">3558</span>      }<a name="line.3558"></a>
+<span class="sourceLineNo">3559</span>    }<a name="line.3559"></a>
+<span class="sourceLineNo">3560</span><a name="line.3560"></a>
+<span class="sourceLineNo">3561</span>    public void flush() {<a name="line.3561"></a>
+<span class="sourceLineNo">3562</span>      synchronized (this) {<a name="line.3562"></a>
+<span class="sourceLineNo">3563</span>        notify();<a name="line.3563"></a>
+<span class="sourceLineNo">3564</span>      }<a name="line.3564"></a>
+<span class="sourceLineNo">3565</span>    }<a name="line.3565"></a>
+<span class="sourceLineNo">3566</span>  }<a name="line.3566"></a>
+<span class="sourceLineNo">3567</span><a name="line.3567"></a>
+<span class="sourceLineNo">3568</span>  /**<a name="line.3568"></a>
+<span class="sourceLineNo">3569</span>   * Writes very wide records and scans for the latest every time.. Flushes and<a name="line.3569"></a>
+<span class="sourceLineNo">3570</span>   * compacts the region every now and then to keep things realistic.<a name="line.3570"></a>
+<span class="sourceLineNo">3571</span>   *<a name="line.3571"></a>
+<span class="sourceLineNo">3572</span>   * @throws IOException<a name="line.3572"></a>
+<span class="sourceLineNo">3573</span>   *           by flush / scan / compaction<a name="line.3573"></a>
+<span class="sourceLineNo">3574</span>   * @throws InterruptedException<a name="line.3574"></a>
+<span class="sourceLineNo">3575</span>   *           when joining threads<a name="line.3575"></a>
+<span class="sourceLineNo">3576</span>   */<a name="line.3576"></a>
+<span class="sourceLineNo">3577</span>  @Test<a name="line.3577"></a>
+<span class="sourceLineNo">3578</span>  public void testWritesWhileScanning() throws IOException, InterruptedException {<a name="line.3578"></a>
+<span class="sourceLineNo">3579</span>    int testCount = 100;<a name="line.3579"></a>
+<span class="sourceLineNo">3580</span>    int numRows = 1;<a name="line.3580"></a>
+<span class="sourceLineNo">3581</span>    int numFamilies = 10;<a name="line.3581"></a>
+<span class="sourceLineNo">3582</span>    int numQualifiers = 100;<a name="line.3582"></a>
+<span class="sourceLineNo">3583</span>    int flushInterval = 7;<a name="line.3583"></a>
+<span class="sourceLineNo">3584</span>    int compactInterval = 5 * flushInterval;<a name="line.3584"></a>
+<span class="sourceLineNo">3585</span>    byte[][] families = new byte[numFamilies][];<a name="line.3585"></a>
+<span class="sourceLineNo">3586</span>    for (int i = 0; i &lt; numFamilies; i++) {<a name="line.3586"></a>
+<span class="sourceLineNo">3587</span>      families[i] = Bytes.toBytes("family" + i);<a name="line.3587"></a>
+<span class="sourceLineNo">3588</span>    }<a name="line.3588"></a>
+<span class="sourceLineNo">3589</span>    byte[][] qualifiers = new byte[numQualifiers][];<a name="line.3589"></a>
+<span class="sourceLineNo">3590</span>    for (int i = 0; i &lt; numQualifiers; i++) {<a name="line.3590"></a>
+<span class="sourceLineNo">3591</span>      qualifiers[i] = Bytes.toBytes("qual" + i);<a name="line.3591"></a>
+<span class="sourceLineNo">3592</span>    }<a name="line.3592"></a>
+<span class="sourceLineNo">3593</span><a name="line.3593"></a>
+<span class="sourceLineNo">3594</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.3594"></a>
+<span class="sourceLineNo">3595</span>    FlushThread flushThread = new FlushThread();<a name="line.3595"></a>
+<span class="sourceLineNo">3596</span>    PutThread putThread = new PutThread(numRows, families, qualifiers);<a name="line.3596"></a>
+<span class="sourceLineNo">3597</span>    try {<a name="line.3597"></a>
+<span class="sourceLineNo">3598</span>      putThread.start();<a name="line.3598"></a>
+<span class="sourceLineNo">3599</span>      putThread.waitForFirstPut();<a name="line.3599"></a>
 <span class="sourceLineNo">3600</span><a name="line.3600"></a>
-<span class="sourceLineNo">3601</span>        if (i != 0 &amp;&amp; i % compactInterval == 0) {<a name="line.3601"></a>
-<span class="sourceLineNo">3602</span>          region.compact(true);<a name="line.3602"></a>
-<span class="sourceLineNo">3603</span>          for (HStore store : region.getStores()) {<a name="line.3603"></a>
-<span class="sourceLineNo">3604</span>            store.closeAndArchiveCompactedFiles();<a name="line.3604"></a>
-<span class="sourceLineNo">3605</span>          }<a name="line.3605"></a>
-<span class="sourceLineNo">3606</span>        }<a name="line.3606"></a>
+<span class="sourceLineNo">3601</span>      flushThread.start();<a name="line.3601"></a>
+<span class="sourceLineNo">3602</span><a name="line.3602"></a>
+<span class="sourceLineNo">3603</span>      Scan scan = new Scan(Bytes.toBytes("row0"), Bytes.toBytes("row1"));<a name="line.3603"></a>
+<span class="sourceLineNo">3604</span><a name="line.3604"></a>
+<span class="sourceLineNo">3605</span>      int expectedCount = numFamilies * numQualifiers;<a name="line.3605"></a>
+<span class="sourceLineNo">3606</span>      List&lt;Cell&gt; res = new ArrayList&lt;&gt;();<a name="line.3606"></a>
 <span class="sourceLineNo">3607</span><a name="line.3607"></a>
-<span class="sourceLineNo">3608</span>        if (i != 0 &amp;&amp; i % flushInterval == 0) {<a name="line.3608"></a>
-<span class="sourceLineNo">3609</span>          flushThread.flush();<a name="line.3609"></a>
-<span class="sourceLineNo">3610</span>        }<a name="line.3610"></a>
-<span class="sourceLineNo">3611</span><a name="line.3611"></a>
-<span class="sourceLineNo">3612</span>        boolean previousEmpty = res.isEmpty();<a name="line.3612"></a>
-<span class="sourceLineNo">3613</span>        res.clear();<a name="line.3613"></a>
-<span class="sourceLineNo">3614</span>        try (InternalScanner scanner = region.getScanner(scan)) {<a name="line.3614"></a>
-<span class="sourceLineNo">3615</span>          boolean moreRows;<a name="line.3615"></a>
-<span class="sourceLineNo">3616</span>          do {<a name="line.3616"></a>
-<span class="sourceLineNo">3617</span>            moreRows = scanner.next(res);<a name="line.3617"></a>
-<span class="sourceLineNo">3618</span>          } while (moreRows);<a name="line.3618"></a>
-<span class="sourceLineNo">3619</span>        }<a name="line.3619"></a>
-<span class="sourceLineNo">3620</span>        if (!res.isEmpty() || !previousEmpty || i &gt; compactInterval) {<a name="line.3620"></a>
-<span class="sourceLineNo">3621</span>          assertEquals("i=" + i, expectedCount, res.size());<a name="line.3621"></a>
-<span class="sourceLineNo">3622</span>          long timestamp = res.get(0).getTimestamp();<a name="line.3622"></a>
-<span class="sourceLineNo">3623</span>          assertTrue("Timestamps were broke: " + timestamp + " prev: " + prevTimestamp,<a name="line.3623"></a>
-<span class="sourceLineNo">3624</span>              timestamp &gt;= prevTimestamp);<a name="line.3624"></a>
-<span class="sourceLineNo">3625</span>          prevTimestamp = timestamp;<a name="line.3625"></a>
-<span class="sourceLineNo">3626</span>        }<a name="line.3626"></a>
-<span class="sourceLineNo">3627</span>      }<a name="line.3627"></a>
-<span class="sourceLineNo">3628</span><a name="line.3628"></a>
-<span class="sourceLineNo">3629</span>      putThread.done();<a name="line.3629"></a>
-<span class="sourceLineNo">3630</span><a name="line.3630"></a>
-<span class="sourceLineNo">3631</span>      region.flush(true);<a name="line.3631"></a>
-<span class="sourceLineNo">3632</span><a name="line.3632"></a>
-<span class="sourceLineNo">3633</span>    } finally {<a name="line.3633"></a>
-<span class="sourceLineNo">3634</span>      try {<a name="line.3634"></a>
-<span class="sourceLineNo">3635</span>        flushThread.done();<a name="line.3635"></a>
-<span class="sourceLineNo">3636</span>        flushThread.join();<a name="line.3636"></a>
-<span class="sourceLineNo">3637</span>        flushThread.checkNoError();<a name="line.3637"></a>
+<span class="sourceLineNo">3608</span>      long prevTimestamp = 0L;<a name="line.3608"></a>
+<span class="sourceLineNo">3609</span>      for (int i = 0; i &lt; testCount; i++) {<a name="line.3609"></a>
+<span class="sourceLineNo">3610</span><a name="line.3610"></a>
+<span class="sourceLineNo">3611</span>        if (i != 0 &amp;&amp; i % compactInterval == 0) {<a name="line.3611"></a>
+<span class="sourceLineNo">3612</span>          region.compact(true);<a name="line.3612"></a>
+<span class="sourceLineNo">3613</span>          for (HStore store : region.getStores()) {<a name="line.3613"></a>
+<span class="sourceLineNo">3614</span>            store.closeAndArchiveCompactedFiles();<a name="line.3614"></a>
+<span class="sourceLineNo">3615</span>          }<a name="line.3615"></a>
+<span class="sourceLineNo">3616</span>        }<a name="line.3616"></a>
+<span class="sourceLineNo">3617</span><a name="line.3617"></a>
+<span class="sourceLineNo">3618</span>        if (i != 0 &amp;&amp; i % flushInterval == 0) {<a name="line.3618"></a>
+<span class="sourceLineNo">3619</span>          flushThread.flush();<a name="line.3619"></a>
+<span class="sourceLineNo">3620</span>        }<a name="line.3620"></a>
+<span class="sourceLineNo">3621</span><a name="line.3621"></a>
+<span class="sourceLineNo">3622</span>        boolean previousEmpty = res.isEmpty();<a name="line.3622"></a>
+<span class="sourceLineNo">3623</span>        res.clear();<a name="line.3623"></a>
+<span class="sourceLineNo">3624</span>        try (InternalScanner scanner = region.getScanner(scan)) {<a name="line.3624"></a>
+<span class="sourceLineNo">3625</span>          boolean moreRows;<a name="line.3625"></a>
+<span class="sourceLineNo">3626</span>          do {<a name="line.3626"></a>
+<span class="sourceLineNo">3627</span>            moreRows = scanner.next(res);<a name="line.3627"></a>
+<span class="sourceLineNo">3628</span>          } while (moreRows);<a name="line.3628"></a>
+<span class="sourceLineNo">3629</span>        }<a name="line.3629"></a>
+<span class="sourceLineNo">3630</span>        if (!res.isEmpty() || !previousEmpty || i &gt; compactInterval) {<a name="line.3630"></a>
+<span class="sourceLineNo">3631</span>          assertEquals("i=" + i, expectedCount, res.size());<a name="line.3631"></a>
+<span class="sourceLineNo">3632</span>          long timestamp = res.get(0).getTimestamp();<a name="line.3632"></a>
+<span class="sourceLineNo">3633</span>          assertTrue("Timestamps were broke: " + timestamp + " prev: " + prevTimestamp,<a name="line.3633"></a>
+<span class="sourceLineNo">3634</span>              timestamp &gt;= prevTimestamp);<a name="line.3634"></a>
+<span class="sourceLineNo">3635</span>          prevTimestamp = timestamp;<a name="line.3635"></a>
+<span class="sourceLineNo">3636</span>        }<a name="line.3636"></a>
+<span class="sourceLineNo">3637</span>      }<a name="line.3637"></a>
 <span class="sourceLineNo">3638</span><a name="line.3638"></a>
-<span class="sourceLineNo">3639</span>        putThread.join();<a name="line.3639"></a>
-<span class="sourceLineNo">3640</span>        putThread.checkNoError();<a name="line.3640"></a>
-<span class="sourceLineNo">3641</span>      } catch (InterruptedException ie) {<a name="line.3641"></a>
-<span class="sourceLineNo">3642</span>        LOG.warn("Caught exception when joining with flushThread", ie);<a name="line.3642"></a>
-<span class="sourceLineNo">3643</span>      }<a name="line.3643"></a>
-<span class="sourceLineNo">3644</span><a name="line.3644"></a>
-<span class="sourceLineNo">3645</span>      try {<a name="line.3645"></a>
-<span class="sourceLineNo">3646</span>          HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.3646"></a>
-<span class="sourceLineNo">3647</span>      } catch (DroppedSnapshotException dse) {<a name="line.3647"></a>
-<span class="sourceLineNo">3648</span>        // We could get this on way out because we interrupt the background flusher and it could<a name="line.3648"></a>
-<span class="sourceLineNo">3649</span>        // fail anywhere causing a DSE over in the background flusher... only it is not properly<a name="line.3649"></a>
-<span class="sourceLineNo">3650</span>        // dealt with so could still be memory hanging out when we get to here -- memory we can't<a name="line.3650"></a>
-<span class="sourceLineNo">3651</span>        // flush because the accounting is 'off' since original DSE.<a name="line.3651"></a>
-<span class="sourceLineNo">3652</span>      }<a name="line.3652"></a>
-<span class="sourceLineNo">3653</span>      this.region = null;<a name="line.3653"></a>
-<span class="sourceLineNo">3654</span>    }<a name="line.3654"></a>
-<span class="sourceLineNo">3655</span>  }<a name="line.3655"></a>
-<span class="sourceLineNo">3656</span><a name="line.3656"></a>
-<span class="sourceLineNo">3657</span>  protected class PutThread extends Thread {<a name="line.3657"></a>
-<span class="sourceLineNo">3658</span>    private volatile boolean done;<a name="line.3658"></a>
-<span class="sourceLineNo">3659</span>    private volatile int numPutsFinished = 0;<a name="line.3659"></a>
-<span class="sourceLineNo">3660</span><a name="line.3660"></a>
-<span class="sourceLineNo">3661</span>    private Throwable error = null;<a name="line.3661"></a>
-<span class="sourceLineNo">3662</span>    private int numRows;<a name="line.3662"></a>
-<span class="sourceLineNo">3663</span>    private byte[][] families;<a name="line.3663"></a>
-<span class="sourceLineNo">3664</span>    private byte[][] qualifiers;<a name="line.3664"></a>
-<span class="sourceLineNo">3665</span><a name="line.3665"></a>
-<span class="sourceLineNo">3666</span>    private PutThread(int numRows, byte[][] families, byte[][] qualifiers) {<a name="line.3666"></a>
-<span class="sourceLineNo">3667</span>      super("PutThread");<a name="line.3667"></a>
-<span class="sourceLineNo">3668</span>      this.numRows = numRows;<a name="line.3668"></a>
-<span class="sourceLineNo">3669</span>      this.families = families;<a name="line.3669"></a>
-<span class="sourceLineNo">3670</span>      this.qualifiers = qualifiers;<a name="line.3670"></a>
-<span class="sourceLineNo">3671</span>    }<a name="line.3671"></a>
-<span class="sourceLineNo">3672</span><a name="line.3672"></a>
-<span class="sourceLineNo">3673</span>    /**<a name="line.3673"></a>
-<span class="sourceLineNo">3674</span>     * Block calling thread until this instance of PutThread has put at least one row.<a name="line.3674"></a>
-<span class="sourceLineNo">3675</span>     */<a name="line.3675"></a>
-<span class="sourceLineNo">3676</span>    public void waitForFirstPut() throws InterruptedException {<a name="line.3676"></a>
-<span class="sourceLineNo">3677</span>      // wait until put thread actually puts some data<a name="line.3677"></a>
-<span class="sourceLineNo">3678</span>      while (isAlive() &amp;&amp; numPutsFinished == 0) {<a name="line.3678"></a>
-<span class="sourceLineNo">3679</span>        checkNoError();<a name="line.3679"></a>
-<span class="sourceLineNo">3680</span>        Thread.sleep(50);<a name="line.3680"></a>
-<span class="sourceLineNo">3681</span>      }<a name="line.3681"></a>
-<span class="sourceLineNo">3682</span>    }<a name="line.3682"></a>
-<span class="sourceLineNo">3683</span><a name="line.3683"></a>
-<span class="sourceLineNo">3684</span>    public void done() {<a name="line.3684"></a>
-<span class="sourceLineNo">3685</span>      done = true;<a name="line.3685"></a>
-<span class="sourceLineNo">3686</span>      synchronized (this) {<a name="line.3686"></a>
-<span class="sourceLineNo">3687</span>        interrupt();<a name="line.3687"></a>
-<span class="sourceLineNo">3688</span>      }<a name="line.3688"></a>
-<span class="sourceLineNo">3689</span>    }<a name="line.3689"></a>
-<span class="sourceLineNo">3690</span><a name="line.3690"></a>
-<span class="sourceLineNo">3691</span>    public void checkNoError() {<a name="line.3691"></a>
-<span class="sourceLineNo">3692</span>      if (error != null) {<a name="line.3692"></a>
-<span class="sourceLineNo">3693</span>        assertNull(error);<a name="line.3693"></a>
-<span class="sourceLineNo">3694</span>      }<a name="line.3694"></a>
-<span class="sourceLineNo">3695</span>    }<a name="line.3695"></a>
-<span class="sourceLineNo">3696</span><a name="line.3696"></a>
-<span class="sourceLineNo">3697</span>    @Override<a name="line.3697"></a>
-<span class="sourceLineNo">3698</span>    public void run() {<a name="line.3698"></a>
-<span class="sourceLineNo">3699</span>      done = false;<a name="line.3699"></a>
-<span class="sourceLineNo">3700</span>      while (!done) {<a name="line.3700"></a>
-<span class="sourceLineNo">3701</span>        try {<a name="line.3701"></a>
-<span class="sourceLineNo">3702</span>          for (int r = 0; r &lt; numRows; r++) {<a name="line.3702"></a>
-<span class="sourceLineNo">3703</span>            byte[] row = Bytes.toBytes("row" + r);<a name="line.3703"></a>
-<span class="sourceLineNo">3704</span>            Put put = new Put(row);<a name="line.3704"></a>
-<span class="sourceLineNo">3705</span>            put.setDurability(Durability.SKIP_WAL);<a name="line.3705"></a>
-<span class="sourceLineNo">3706</span>            byte[] value = Bytes.toBytes(String.valueOf(numPutsFinished));<a name="line.3706"></a>
-<span class="sourceLineNo">3707</span>            for (byte[] family : families) {<a name="line.3707"></a>
-<span class="sourceLineNo">3708</span>              for (byte[] qualifier : qualifiers) {<a name="line.3708"></a>
-<span class="sourceLineNo">3709</span>                put.addColumn(family, qualifier, numPutsFinished, value);<a name="line.3709"></a>
-<span class="sourceLineNo">3710</span>              }<a name="line.3710"></a>
-<span class="sourceLineNo">3711</span>            }<a name="line.3711"></a>
-<span class="sourceLineNo">3712</span>            region.put(put);<a name="line.3712"></a>
-<span class="sourceLineNo">3713</span>            numPutsFinished++;<a name="line.3713"></a>
-<span class="sourceLineNo">3714</span>            if (numPutsFinished &gt; 0 &amp;&amp; numPutsFinished % 47 == 0) {<a name="line.3714"></a>
-<span class="sourceLineNo">3715</span>              LOG.debug("put iteration = {}", numPutsFinished);<a name="line.3715"></a>
-<span class="sourceLineNo">3716</span>              Delete delete = new Delete(row, (long) numPutsFinished - 30);<a name="line.3716"></a>
-<span class="sourceLineNo">3717</span>              region.delete(delete);<a name="line.3717"></a>
-<span class="sourceLineNo">3718</span>            }<a name="line.3718"></a>
-<span class="sourceLineNo">3719</span>            numPutsFinished++;<a name="line.3719"></a>
-<span class="sourceLineNo">3720</span>          }<a name="line.3720"></a>
-<span class="sourceLineNo">3721</span>        } catch (InterruptedIOException e) {<a name="line.3721"></a>
-<span class="sourceLineNo">3722</span>          // This is fine. It means we are done, or didn't get the lock on time<a name="line.3722"></a>
-<span class="sourceLineNo">3723</span>          LOG.info("Interrupted", e);<a name="line.3723"></a>
-<span class="sourceLineNo">3724</span>        } catch (IOException e) {<a name="line.3724"></a>
-<span class="sourceLineNo">3725</span>          LOG.error("Error while putting records", e);<a name="line.3725"></a>
-<span class="sourceLineNo">3726</span>          error = e;<a name="line.3726"></a>
-<span class="sourceLineNo">3727</span>          break;<a name="line.3727"></a>
-<span class="sourceLineNo">3728</span>        }<a name="line.3728"></a>
-<span class="sourceLineNo">3729</span>      }<a name="line.3729"></a>
-<span class="sourceLineNo">3730</span><a name="line.3730"></a>
-<span class="sourceLineNo">3731</span>    }<a name="line.3731"></a>
-<span class="sourceLineNo">3732</span><a name="line.3732"></a>
-<span class="sourceLineNo">3733</span>  }<a name="line.3733"></a>
-<span class="sourceLineNo">3734</span><a name="line.3734"></a>
-<span class="sourceLineNo">3735</span>  /**<a name="line.3735"></a>
-<span class="sourceLineNo">3736</span>   * Writes very wide records and gets the latest row every time.. Flushes and<a name="line.3736"></a>
-<span class="sourceLineNo">3737</span>   * compacts the region aggressivly to catch issues.<a name="line.3737"></a>
-<span class="sourceLineNo">3738</span>   *<a name="line.3738"></a>
-<span class="sourceLineNo">3739</span>   * @throws IOException<a name="line.3739"></a>
-<span class="sourceLineNo">3740</span>   *           by flush / scan / compaction<a name="line.3740"></a>
-<span class="sourceLineNo">3741</span>   * @throws InterruptedException<a name="line.3741"></a>
-<span class="sourceLineNo">3742</span>   *           when joining threads<a name="line.3742"></a>
-<span class="sourceLineNo">3743</span>   */<a name="line.3743"></a>
-<span class="sourceLineNo">3744</span>  @Test<a name="line.3744"></a>
-<span class="sourceLineNo">3745</span>  public void testWritesWhileGetting() throws Exception {<a name="line.3745"></a>
-<span class="sourceLineNo">3746</span>    int testCount = 50;<a name="line.3746"></a>
-<span class="sourceLineNo">3747</span>    int numRows = 1;<a name="line.3747"></a>
-<span class="sourceLineNo">3748</span>    int numFamilies = 10;<a name="line.3748"></a>
-<span class="sourceLineNo">3749</span>    int numQualifiers = 100;<a name="line.3749"></a>
-<span class="sourceLineNo">3750</span>    int compactInterval = 100;<a name="line.3750"></a>
-<span class="sourceLineNo">3751</span>    byte[][] families = new byte[numFamilies][];<a name="line.3751"></a>
-<span class="sourceLineNo">3752</span>    for (int i = 0; i &lt; numFamilies; i++) {<a name="line.3752"></a>
-<span class="sourceLineNo">3753</span>      families[i] = Bytes.toBytes("family" + i);<a name="line.3753"></a>
-<span class="sourceLineNo">3754</span>    }<a name="line.3754"></a>
-<span class="sourceLineNo">3755</span>    byte[][] qualifiers = new byte[numQualifiers][];<a name="line.3755"></a>
-<span class="sourceLineNo">3756</span>    for (int i = 0; i &lt; numQualifiers; i++) {<a name="line.3756"></a>
-<span class="sourceLineNo">3757</span>      qualifiers[i] = Bytes.toBytes("qual" + i);<a name="line.3757"></a>
-<span class="sourceLineNo">3758</span>    }<a name="line.3758"></a>
-<span class="sourceLineNo">3759</span><a name="line.3759"></a>
-<span class="sourceLineNo">3760</span><a name="line.3760"></a>
-<span class="sourceLineNo">3761</span>    // This test flushes constantly and can cause many files to be created,<a name="line.3761"></a>
-<span class="sourceLineNo">3762</span>    // possibly<a name="line.3762"></a>
-<span class="sourceLineNo">3763</span>    // extending over the ulimit. Make sure compactions are aggressive in<a name="line.3763"></a>
-<span class="sourceLineNo">3764</span>    // reducing<a name="line.3764"></a>
-<span class="sourceLineNo">3765</span>    // the number of HFiles created.<a name="line.3765"></a>
-<span class="sourceLineNo">3766</span>    Configuration conf = HBaseConfiguration.create(CONF);<a name="line.3766"></a>
-<span class="sourceLineNo">3767</span>    conf.setInt("hbase.hstore.compaction.min", 1);<a name="line.3767"></a>
-<span class="sourceLineNo">3768</span>    conf.setInt("hbase.hstore.compaction.max", 1000);<a name="line.3768"></a>
-<span class="sourceLineNo">3769</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.3769"></a>
-<span class="sourceLineNo">3770</span>    PutThread putThread = null;<a name="line.3770"></a>
-<span class="sourceLineNo">3771</span>    MultithreadedTestUtil.TestContext ctx = new MultithreadedTestUtil.TestContext(conf);<a name="line.3771"></a>
-<span class="sourceLineNo">3772</span>    try {<a name="line.3772"></a>
-<span class="sourceLineNo">3773</span>      putThread = new PutThread(numRows, families, qualifiers);<a name="line.3773"></a>
-<span class="sourceLineNo">3774</span>      putThread.start();<a name="line.3774"></a>
-<span class="sourceLineNo">3775</span>      putThread.waitForFirstPut();<a name="line.3775"></a>
-<span class="sourceLineNo">3776</span><a name="line.3776"></a>
-<span class="sourceLineNo">3777</span>      // Add a thread that flushes as fast as possible<a name="line.3777"></a>
-<span class="sourceLineNo">3778</span>      ctx.addThread(new RepeatingTestThread(ctx) {<a name="line.3778"></a>
-<span class="sourceLineNo">3779</span><a name="line.3779"></a>
-<span class="sourceLineNo">3780</span>        @Override<a name="line.3780"></a>
-<span class="sourceLineNo">3781</span>        public void doAnAction() throws Exception {<a name="line.3781"></a>
-<span class="sourceLineNo">3782</span>          region.flush(true);<a name="line.3782"></a>
-<span class="sourceLineNo">3783</span>          // Compact regularly to avoid creating too many files and exceeding<a name="line.3783"></a>
-<span class="sourceLineNo">3784</span>          // the ulimit.<a name="line.3784"></a>
-<span class="sourceLineNo">3785</span>          region.compact(false);<a name="line.3785"></a>
-<span class="sourceLineNo">3786</span>          for (HStore store : region.getStores()) {<a name="line.3786"></a>
-<span class="sourceLineNo">3787</span>            store.closeAndArchiveCompactedFiles();<a name="line.3787"></a>
-<span class="sourceLineNo">3788</span>          }<a name="line.3788"></a>
-<span class="sourceLineNo">3789</span>        }<a name="line.3789"></a>
-<span class="sourceLineNo">3790</span>      });<a name="line.3790"></a>
-<span class="sourceLineNo">3791</span>      ctx.startThreads();<a name="line.3791"></a>
-<span class="sourceLineNo">3792</span><a name="line.3792"></a>
-<span class="sourceLineNo">3793</span>      Get get = new Get(Bytes.toBytes("row0"));<a name="line.3793"></a>
-<span class="sourceLineNo">3794</span>      Result result = null;<a name="line.3794"></a>
-<span class="sourceLineNo">3795</span><a name="line.3795"></a>
-<span class="sourceLineNo">3796</span>      int expectedCount = numFamilies * numQualifiers;<a name="line.3796"></a>
-<span class="sourceLineNo">3797</span><a name="line.3797"></a>
-<span class="sourceLineNo">3798</span>      long prevTimestamp = 0L;<a name="line.3798"></a>
-<span class="sourceLineNo">3799</span>      for (int i = 0; i &lt; testCount; i++) {<a name="line.3799"></a>
-<span class="sourceLineNo">3800</span>        LOG.info("testWritesWhileGetting verify turn " + i);<a name="line.3800"></a>
-<span class="sourceLineNo">3801</span>        boolean previousEmpty = result == null || result.isEmpty();<a name="line.3801"></a>
-<span class="sourceLineNo">3802</span>        result = region.get(get);<a name="line.3802"></a>
-<span class="sourceLineNo">3803</span>        if (!result.isEmpty() || !previousEmpty || i &gt; compactInterval) {<a name="line.3803"></a>
-<span class="sourceLineNo">3804</span>          assertEquals("i=" + i, expectedCount, result.size());<a name="line.3804"></a>
-<span class="sourceLineNo">3805</span>          // TODO this was removed, now what dangit?!<a name="line.3805"></a>
-<span class="sourceLineNo">3806</span>          // search looking for the qualifier in question?<a name="line.3806"></a>
-<span class="sourceLineNo">3807</span>          long timestamp = 0;<a name="line.3807"></a>
-<span class="sourceLineNo">3808</span>          for (Cell kv : result.rawCells()) {<a name="line.3808"></a>
-<span class="sourceLineNo">3809</span>            if (CellUtil.matchingFamily(kv, families[0])<a name="line.3809"></a>
-<span class="sourceLineNo">3810</span>                &amp;&amp; CellUtil.matchingQualifier(kv, qualifiers[0])) {<a name="line.3810"></a>
-<span class="sourceLineNo">3811</span>              timestamp = kv.getTimestamp();<a name="line.3811"></a>
-<span class="sourceLineNo">3812</span>            }<a name="line.3812"></a>
-<span class="sourceLineNo">3813</span>          }<a name="line.3813"></a>
-<span class="sourceLineNo">3814</span>          assertTrue(timestamp &gt;= prevTimestamp);<a name="line.3814"></a>
-<span class="sourceLineNo">3815</span>          prevTimestamp = timestamp;<a name="line.3815"></a>
-<span class="sourceLineNo">3816</span>          Cell previousKV = null;<a name="line.3816"></a>
-<span class="sourceLineNo">3817</span><a name="line.3817"></a>
+<span class="sourceLineNo">3639</span>      putThread.done();<a name="line.3639"></a>
+<span class="sourceLineNo">3640</span><a name="line.3640"></a>
+<span class="sourceLineNo">3641</span>      region.flush(true);<a name="line.3641"></a>
+<span class="sourceLineNo">3642</span><a name="line.3642"></a>
+<span class="sourceLineNo">3643</span>    } finally {<a name="line.3643"></a>
+<span class="sourceLineNo">3644</span>      try {<a name="line.3644"></a>
+<span class="sourceLineNo">3645</span>        flushThread.done();<a name="line.3645"></a>
+<span class="sourceLineNo">3646</span>        flushThread.join();<a name="line.3646"></a>
+<span class="sourceLineNo">3647</span>        flushThread.checkNoError();<a name="line.3647"></a>
+<span class="sourceLineNo">3648</span><a name="line.3648"></a>
+<span class="sourceLineNo">3649</span>        putThread.join();<a name="line.3649"></a>
+<span class="sourceLineNo">3650</span>        putThread.checkNoError();<a name="line.3650"></a>
+<span class="sourceLineNo">3651</span>      } catch (InterruptedException ie) {<a name="line.3651"></a>
+<span class="sourceLineNo">3652</span>        LOG.warn("Caught exception when joining with flushThread", ie);<a name="line.3652"></a>
+<span class="sourceLineNo">3653</span>      }<a name="line.3653"></a>
+<span class="sourceLineNo">3654</span><a name="line.3654"></a>
+<span class="sourceLineNo">3655</span>      try {<a name="line.3655"></a>
+<span class="sourceLineNo">3656</span>          HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.3656"></a>
+<span class="sourceLineNo">3657</span>      } catch (DroppedSnapshotException dse) {<a name="line.3657"></a>
+<span class="sourceLineNo">3658</span>        // We could get this on way out because we interrupt the background flusher and it could<a name="line.3658"></a>
+<span class="sourceLineNo">3659</span>        // fail anywhere causing a DSE over in the background flusher... only it is not properly<a name="line.3659"></a>
+<span class="sourceLineNo">3660</span>        // dealt with so could still be memory hanging out when we get to here -- memory we can't<a name="line.3660"></a>
+<span class="sourceLineNo">3661</span>        // flush because the accounting is 'off' since original DSE.<a name="line.3661"></a>
+<span class="sourceLineNo">3662</span>      }<a name="line.3662"></a>
+<span class="sourceLineNo">3663</span>      this.region = null;<a name="line.3663"></a>
+<span class="sourceLineNo">3664</span>    }<a name="line.3664"></a>
+<span class="sourceLineNo">3665</span>  }<a name="line.3665"></a>
+<span class="sourceLineNo">3666</span><a name="line.3666"></a>
+<span class="sourceLineNo">3667</span>  protected class PutThread extends Thread {<a name="line.3667"></a>
+<span class="sourceLineNo">3668</span>    private volatile boolean done;<a name="line.3668"></a>
+<span class="sourceLineNo">3669</span>    private volatile int numPutsFinished = 0;<a name="line.3669"></a>
+<span class="sourceLineNo">3670</span><a name="line.3670"></a>
+<span class="sourceLineNo">3671</span>    private Throwable error = null;<a name="line.3671"></a>
+<span class="sourceLineNo">3672</span>    private int numRows;<a name="line.3672"></a>
+<span class="sourceLineNo">3673</span>    private byte[][] families;<a name="line.3673"></a>
+<span class="sourceLineNo">3674</span>    private byte[][] qualifiers;<a name="line.3674"></a>
+<span class="sourceLineNo">3675</span><a name="line.3675"></a>
+<span class="sourceLineNo">3676</span>    private PutThread(int numRows, byte[][] families, byte[][] qualifiers) {<a name="line.3676"></a>
+<span class="sourceLineNo">3677</span>      super("PutThread");<a name="line.3677"></a>
+<span class="sourceLineNo">3678</span>      this.numRows = numRows;<a name="line.3678"></a>
+<span class="sourceLineNo">3679</span>      this.families = families;<a name="line.3679"></a>
+<span class="sourceLineNo">3680</span>      this.qualifiers = qualifiers;<a name="line.3680"></a>
+<span class="sourceLineNo">3681</span>    }<a name="line.3681"></a>
+<span class="sourceLineNo">3682</span><a name="line.3682"></a>
+<span class="sourceLineNo">3683</span>    /**<a name="line.3683"></a>
+<span class="sourceLineNo">3684</span>     * Block calling thread until this instance of PutThread has put at least one row.<a name="line.3684"></a>
+<span class="sourceLineNo">3685</span>     */<a name="line.3685"></a>
+<span class="sourceLineNo">3686</span>    public void waitForFirstPut() throws InterruptedException {<a name="line.3686"></a>
+<span class="sourceLineNo">3687</span>      // wait until put thread actually puts some data<a name="line.3687"></a>
+<span class="sourceLineNo">3688</span>      while (isAlive() &amp;&amp; numPutsFinished == 0) {<a name="line.3688"></a>
+<span class="sourceLineNo">3689</span>        checkNoError();<a name="line.3689"></a>
+<span class="sourceLineNo">3690</span>        Thread.sleep(50);<a name="line.3690"></a>
+<span class="sourceLineNo">3691</span>      }<a name="line.3691"></a>
+<span class="sourceLineNo">3692</span>    }<a name="line.3692"></a>
+<span class="sourceLineNo">3693</span><a name="line.3693"></a>
+<span class="sourceLineNo">3694</span>    public void done() {<a name="line.3694"></a>
+<span class="sourceLineNo">3695</span>      done = true;<a name="line.3695"></a>
+<span class="sourceLineNo">3696</span>      synchronized (this) {<a name="line.3696"></a>
+<span class="sourceLineNo">3697</span>        interrupt();<a name="line.3697"></a>
+<span class="sourceLineNo">3698</span>      }<a name="line.3698"></a>
+<span class="sourceLineNo">3699</span>    }<a name="line.3699"></a>
+<span class="sourceLineNo">3700</span><a name="line.3700"></a>
+<span class="sourceLineNo">3701</span>    public void checkNoError() {<a name="line.3701"></a>
+<span class="sourceLineNo">3702</span>      if (error != null) {<a name="line.3702"></a>
+<span class="sourceLineNo">3703</span>        assertNull(error);<a name="line.3703"></a>
+<span class="sourceLineNo">3704</span>      }<a name="line.3704"></a>
+<span class="sourceLineNo">3705</span>    }<a name="line.3705"></a>
+<span class="sourceLineNo">3706</span><a name="line.3706"></a>
+<span class="sourceLineNo">3707</span>    @Override<a name="line.3707"></a>
+<span class="sourceLineNo">3708</span>    public void run() {<a name="line.3708"></a>
+<span class="sourceLineNo">3709</span>      done = false;<a name="line.3709"></a>
+<span class="sourceLineNo">3710</span>      while (!done) {<a name="line.3710"></a>
+<span class="sourceLineNo">3711</span>        try {<a name="line.3711"></a>
+<span class="sourceLineNo">3712</span>          for (int r = 0; r &lt; numRows; r++) {<a name="line.3712"></a>
+<span class="sourceLineNo">3713</span>            byte[] row = Bytes.toBytes("row" + r);<a name="line.3713"></a>
+<span class="sourceLineNo">3714</span>            Put put = new Put(row);<a name="line.3714"></a>
+<span class="sourceLineNo">3715</span>            put.setDurability(Durability.SKIP_WAL);<a name="line.3715"></a>
+<span class="sourceLineNo">3716</span>            byte[] value = Bytes.toBytes(String.valueOf(numPutsFinished));<a name="line.3716"></a>
+<span class="sourceLineNo">3717</span>            for (byte[] family : families) {<a name="line.3717"></a>
+<span class="sourceLineNo">3718</span>              for (byte[] qualifier : qualifiers) {<a name="line.3718"></a>
+<span class="sourceLineNo">3719</span>                put.addColumn(family, qualifier, numPutsFinished, value);<a name="line.3719"></a>
+<span class="sourceLineNo">3720</span>              }<a name="line.3720"></a>
+<span class="sourceLineNo">3721</span>            }<a name="line.3721"></a>
+<span class="sourceLineNo">3722</span>            region.put(put);<a name="line.3722"></a>
+<span class="sourceLineNo">3723</span>            numPutsFinished++;<a name="line.3723"></a>
+<span class="sourceLineNo">3724</span>            if (numPutsFinished &gt; 0 &amp;&amp; numPutsFinished % 47 == 0) {<a name="line.3724"></a>
+<span class="sourceLineNo">3725</span>              LOG.debug("put iteration = {}", numPutsFinished);<a name="line.3725"></a>
+<span class="sourceLineNo">3726</span>              Delete delete = new Delete(row, (long) numPutsFinished - 30);<a name="line.3726"></a>
+<span class="sourceLineNo">3727</span>              region.delete(delete);<a name="line.3727"></a>
+<span class="sourceLineNo">3728</span>            }<a name="line.3728"></a>
+<span class="sourceLineNo">3729</span>            numPutsFinished++;<a name="line.3729"></a>
+<span class="sourceLineNo">3730</span>          }<a name="line.3730"></a>
+<span class="sourceLineNo">3731</span>        } catch (InterruptedIOException e) {<a name="line.3731"></a>
+<span class="sourceLineNo">3732</span>          // This is fine. It means we are done, or didn't get the lock on time<a name="line.3732"></a>
+<span class="sourceLineNo">3733</span>          LOG.info("Interrupted", e);<a name="line.3733"></a>
+<span class="sourceLineNo">3734</span>        } catch (IOException e) {<a name="line.3734"></a>
+<span class="sourceLineNo">3735</span>          LOG.error("Error while putting records", e);<a name="line.3735"></a>
+<span class="sourceLineNo">3736</span>          error = e;<a name="line.3736"></a>
+<span class="sourceLineNo">3737</span>          break;<a name="line.3737"></a>
+<span class="sourceLineNo">3738</span>        }<a name="line.3738"></a>
+<span class="sourceLineNo">3739</span>      }<a name="line.3739"></a>
+<span class="sourceLineNo">3740</span><a name="line.3740"></a>
+<span class="sourceLineNo">3741</span>    }<a name="line.3741"></a>
+<span class="sourceLineNo">3742</span><a name="line.3742"></a>
+<span class="sourceLineNo">3743</span>  }<a name="line.3743"></a>
+<span class="sourceLineNo">3744</span><a name="line.3744"></a>
+<span class="sourceLineNo">3745</span>  /**<a name="line.3745"></a>
+<span class="sourceLineNo">3746</span>   * Writes very wide records and gets the latest row every time.. Flushes and<a name="line.3746"></a>
+<span class="sourceLineNo">3747</span>   * compacts the region aggressivly to catch issues.<a name="line.3747"></a>
+<span class="sourceLineNo">3748</span>   *<a name="line.3748"></a>
+<span class="sourceLineNo">3749</span>   * @throws IOException<a name="line.3749"></a>
+<span class="sourceLineNo">3750</span>   *           by flush / scan / compaction<a name="line.3750"></a>
+<span class="sourceLineNo">3751</span>   * @throws InterruptedException<a name="line.3751"></a>
+<span class="sourceLineNo">3752</span>   *           when joining threads<a name="line.3752"></a>
+<span class="sourceLineNo">3753</span>   */<a name="line.3753"></a>
+<span class="sourceLineNo">3754</span>  @Test<a name="line.3754"></a>
+<span class="sourceLineNo">3755</span>  public void testWritesWhileGetting() throws Exception {<a name="line.3755"></a>
+<span class="sourceLineNo">3756</span>    int testCount = 50;<a name="line.3756"></a>
+<span class="sourceLineNo">3757</span>    int numRows = 1;<a name="line.3757"></a>
+<span class="sourceLineNo">3758</span>    int numFamilies = 10;<a name="line.3758"></a>
+<span class="sourceLineNo">3759</span>    int numQualifiers = 100;<a name="line.3759"></a>
+<span class="sourceLineNo">3760</span>    int compactInterval = 100;<a name="line.3760"></a>
+<span class="sourceLineNo">3761</span>    byte[][] families = new byte[numFamilies][];<a name="line.3761"></a>
+<span class="sourceLineNo">3762</span>    for (int i = 0; i &lt; numFamilies; i++) {<a name="line.3762"></a>
+<span class="sourceLineNo">3763</span>      families[i] = Bytes.toBytes("family" + i);<a name="line.3763"></a>
+<span class="sourceLineNo">3764</span>    }<a name="line.3764"></a>
+<span class="sourceLineNo">3765</span>    byte[][] qualifiers = new byte[numQualifiers][];<a name="line.3765"></a>
+<span class="sourceLineNo">3766</span>    for (int i = 0; i &lt; numQualifiers; i++) {<a name="line.3766"></a>
+<span class="sourceLineNo">3767</span>      qualifiers[i] = Bytes.toBytes("qual" + i);<a name="line.3767"></a>
+<span class="sourceLineNo">3768</span>    }<a name="line.3768"></a>
+<span class="sourceLineNo">3769</span><a name="line.3769"></a>
+<span class="sourceLineNo">3770</span><a name="line.3770"></a>
+<span class="sourceLineNo">3771</span>    // This test flushes constantly and can cause many files to be created,<a name="line.3771"></a>
+<span class="sourceLineNo">3772</span>    // possibly<a name="line.3772"></a>
+<span class="sourceLineNo">3773</span>    // extending over the ulimit. Make sure compactions are aggressive in<a name="line.3773"></a>
+<span class="sourceLineNo">3774</span>    // reducing<a name="line.3774"></a>
+<span class="sourceLineNo">3775</span>    // the number of HFiles created.<a name="line.3775"></a>
+<span class="sourceLineNo">3776</span>    Configuration conf = HBaseConfiguration.create(CONF);<a name="line.3776"></a>
+<span class="sourceLineNo">3777</span>    conf.setInt("hbase.hstore.compaction.min", 1);<a name="line.3777"></a>
+<span class="sourceLineNo">3778</span>    conf.setInt("hbase.hstore.compaction.max", 1000);<a name="line.3778"></a>
+<span class="sourceLineNo">3779</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.3779"></a>
+<span class="sourceLineNo">3780</span>    PutThread putThread = null;<a name="line.3780"></a>
+<span class="sourceLineNo">3781</span>    MultithreadedTestUtil.TestContext ctx = new MultithreadedTestUtil.TestContext(conf);<a name="line.3781"></a>
+<span class="sourceLineNo">3782</span>    try {<a name="line.3782"></a>
+<span class="sourceLineNo">3783</span>      putThread = new PutThread(numRows, families, qualifiers);<a name="line.3783"></a>
+<span class="sourceLineNo">3784</span>      putThread.start();<a name="line.3784"></a>
+<span class="sourceLineNo">3785</span>      putThread.waitForFirstPut();<a name="line.3785"></a>
+<span class="sourceLineNo">3786</span><a name="line.3786"></a>
+<span class="sourceLineNo">3787</span>      // Add a thread that flushes as fast as possible<a name="line.3787"></a>
+<span class="sourceLineNo">3788</span>      ctx.addThread(new RepeatingTestThread(ctx) {<a name="line.3788"></a>
+<span class="sourceLineNo">3789</span><a name="line.3789"></a>
+<span class="sourceLineNo">3790</span>        @Override<a name="line.3790"></a>
+<span class="sourceLineNo">3791</span>        public void doAnAction() throws Exception {<a name="line.3791"></a>
+<span class="sourceLineNo">3792</span>          region.flush(true);<a name="line.3792"></a>
+<span class="sourceLineNo">3793</span>          // Compact regularly to avoid creating too many files and exceeding<a name="line.3793"></a>
+<span class="sourceLineNo">3794</span>          // the ulimit.<a name="line.3794"></a>
+<span class="sourceLineNo">3795</span>          region.compact(false);<a name="line.3795"></a>
+<span class="sourceLineNo">3796</span>          for (HStore store : region.getStores()) {<a name="line.3796"></a>
+<span class="sourceLineNo">3797</span>            store.closeAndArchiveCompactedFiles();<a name="line.3797"></a>
+<span class="sourceLineNo">3798</span>          }<a name="line.3798"></a>
+<span class="sourceLineNo">3799</span>        }<a name="line.3799"></a>
+<span class="sourceLineNo">3800</span>      });<a name="line.3800"></a>
+<span class="sourceLineNo">3801</span>      ctx.startThreads();<a name="line.3801"></a>
+<span class="sourceLineNo">3802</span><a name="line.3802"></a>
+<span class="sourceLineNo">3803</span>      Get get = new Get(Bytes.toBytes("row0"));<a name="line.3803"></a>
+<span class="sourceLineNo">3804</span>      Result result = null;<a name="line.3804"></a>
+<span class="sourceLineNo">3805</span><a name="line.3805"></a>
+<span class="sourceLineNo">3806</span>      int expectedCount = numFamilies * numQualifiers;<a name="line.3806"></a>
+<span class="sourceLineNo">3807</span><a name="line.3807"></a>
+<span class="sourceLineNo">3808</span>      long prevTimestamp = 0L;<a name="line.3808"></a>
+<span class="sourceLineNo">3809</span>      for (int i = 0; i &lt; testCount; i++) {<a name="line.3809"></a>
+<span class="sourceLineNo">3810</span>        LOG.info("testWritesWhileGetting verify turn " + i);<a name="line.3810"></a>
+<span class="sourceLineNo">3811</span>        boolean previousEmpty = result == null || result.isEmpty();<a name="line.3811"></a>
+<span class="sourceLineNo">3812</span>        result = region.get(get);<a name="line.3812"></a>
+<span class="sourceLineNo">3813</span>        if (!result.isEmpty() || !previousEmpty || i &gt; compactInterval) {<a name="line.3813"></a>
+<span class="sourceLineNo">3814</span>          assertEquals("i=" + i, expectedCount, result.size());<a name="line.3814"></a>
+<span class="sourceLineNo">3815</span>          // TODO this was removed, now what dangit?!<a name="line.3815"></a>
+<span class="sourceLineNo">3816</span>          // search looking for the qualifier in question?<a name="line.3816"></a>
+<span class="sourceLineNo">3817</span>          long timestamp = 0;<a name="line.3817"></a>
 <span class="sourceLineNo">3818</span>          for (Cell kv : result.rawCells()) {<a name="line.3818"></a>
-<span class="sourceLineNo">3819</span>            byte[] thisValue = CellUtil.cloneValue(kv);<a name="line.3819"></a>
-<span class="sourceLineNo">3820</span>            if (previousKV != null) {<a name="line.3820"></a>
-<span class="sourceLineNo">3821</span>              if (Bytes.compareTo(CellUtil.cloneValue(previousKV), thisValue) != 0) {<a name="line.3821"></a>
-<span class="sourceLineNo">3822</span>                LOG.warn("These two KV should have the same value." + " Previous KV:" + previousKV<a name="line.3822"></a>
-<span class="sourceLineNo">3823</span>                    + "(memStoreTS:" + previousKV.getSequenceId() + ")" + ", New KV: " + kv<a name="line.3823"></a>
-<span class="sourceLineNo">3824</span>                    + "(memStoreTS:" + kv.getSequenceId() + ")");<a name="line.3824"></a>
-<span class="sourceLineNo">3825</span>                assertEquals(0, Bytes.compareTo(CellUtil.cloneValue(previousKV), thisValue));<a name="line.3825"></a>
-<span class="sourceLineNo">3826</span>              }<a name="line.3826"></a>
-<span class="sourceLineNo">3827</span>            }<a name="line.3827"></a>
-<span class="sourceLineNo">3828</span>            previousKV = kv;<a name="line.3828"></a>
-<span class="sourceLineNo">3829</span>          }<a name="line.3829"></a>
-<span class="sourceLineNo">3830</span>        }<a name="line.3830"></a>
-<span class="sourceLineNo">3831</span>      }<a name="line.3831"></a>
-<span class="sourceLineNo">3832</span>    } finally {<a name="line.3832"></a>
-<span class="sourceLineNo">3833</span>      if (putThread != null)<a name="line.3833"></a>
-<span class="sourceLineNo">3834</span>        putThread.done();<a name="line.3834"></a>
-<span class="sourceLineNo">3835</span><a name="line.3835"></a>
-<span class="sourceLineNo">3836</span>      region.flush(true);<a name="line.3836"></a>
-<span class="sourceLineNo">3837</span><a name="line.3837"></a>
-<span class="sourceLineNo">3838</span>      if (putThread != null) {<a name="line.3838"></a>
-<span class="sourceLineNo">3839</span>        putThread.join();<a name="line.3839"></a>
-<span class="sourceLineNo">3840</span>        putThread.checkNoError();<a name="line.3840"></a>
+<span class="sourceLineNo">3819</span>            if (CellUtil.matchingFamily(kv, families[0])<a name="line.3819"></a>
+<span class="sourceLineNo">3820</span>                &amp;&amp; CellUtil.matchingQualifier(kv, qualifiers[0])) {<a name="line.3820"></a>
+<span class="sourceLineNo">3821</span>              timestamp = kv.getTimestamp();<a name="line.3821"></a>
+<span class="sourceLineNo">3822</span>            }<a name="line.3822"></a>
+<span class="sourceLineNo">3823</span>          }<a name="line.3823"></a>
+<span class="sourceLineNo">3824</span>          assertTrue(timestamp &gt;= prevTimestamp);<a name="line.3824"></a>
+<span class="sourceLineNo">3825</span>          prevTimestamp = timestamp;<a name="line.3825"></a>
+<span class="sourceLineNo">3826</span>          Cell previousKV = null;<a name="line.3826"></a>
+<span class="sourceLineNo">3827</span><a name="line.3827"></a>
+<span class="sourceLineNo">3828</span>          for (Cell kv : result.rawCells()) {<a name="line.3828"></a>
+<span class="sourceLineNo">3829</span>            byte[] thisValue = CellUtil.cloneValue(kv);<a name="line.3829"></a>
+<span class="sourceLineNo">3830</span>            if (previousKV != null) {<a name="line.3830"></a>
+<span class="sourceLineNo">3831</span>              if (Bytes.compareTo(CellUtil.cloneValue(previousKV), thisValue) != 0) {<a name="line.3831"></a>
+<span class="sourceLineNo">3832</span>                LOG.warn("These two KV should have the same value." + " Previous KV:" + previousKV<a name="line.3832"></a>
+<span class="sourceLineNo">3833</span>                    + "(memStoreTS:" + previousKV.getSequenceId() + ")" + ", New KV: " + kv<a name="line.3833"></a>
+<span class="sourceLineNo">3834</span>                    + "(memStoreTS:" + kv.getSequenceId() + ")");<a name="line.3834"></a>
+<span class="sourceLineNo">3835</span>                assertEquals(0, Bytes.compareTo(CellUtil.cloneValue(previousKV), thisValue));<a name="line.3835"></a>
+<span class="sourceLineNo">3836</span>              }<a name="line.3836"></a>
+<span class="sourceLineNo">3837</span>            }<a name="line.3837"></a>
+<span class="sourceLineNo">3838</span>            previousKV = kv;<a name="line.3838"></a>
+<span class="sourceLineNo">3839</span>          }<a name="line.3839"></a>
+<span class="sourceLineNo">3840</span>        }<a name="line.3840"></a>
 <span class="sourceLineNo">3841</span>      }<a name="line.3841"></a>
-<span class="sourceLineNo">3842</span><a name="line.3842"></a>
-<span class="sourceLineNo">3843</span>      ctx.stop();<a name="line.3843"></a>
-<span class="sourceLineNo">3844</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.3844"></a>
-<span class="sourceLineNo">3845</span>      this.region = null;<a name="line.3845"></a>
-<span class="sourceLineNo">3846</span>    }<a name="line.3846"></a>
-<span class="sourceLineNo">3847</span>  }<a name="line.3847"></a>
-<span class="sourceLineNo">3848</span><a name="line.3848"></a>
-<span class="sourceLineNo">3849</span>  @Test<a name="line.3849"></a>
-<span class="sourceLineNo">3850</span>  public void testHolesInMeta() throws Exception {<a name="line.3850"></a>
-<span class="sourceLineNo">3851</span>    byte[] family = Bytes.toBytes("family");<a name="line.3851"></a>
-<span class="sourceLineNo">3852</span>    this.region = initHRegion(tableName, Bytes.toBytes("x"), Bytes.toBytes("z"), method, CONF,<a name="line.3852"></a>
-<span class="sourceLineNo">3853</span>        false, family);<a name="line.3853"></a>
-<span class="sourceLineNo">3854</span>    byte[] rowNotServed = Bytes.toBytes("a");<a name="line.3854"></a>
-<span class="sourceLineNo">3855</span>    Get g = new Get(rowNotServed);<a name="line.3855"></a>
-<span class="sourceLineNo">3856</span>    try {<a name="line.3856"></a>
-<span class="sourceLineNo">3857</span>      region.get(g);<a name="line.3857"></a>
-<span class="sourceLineNo">3858</span>      fail();<a name="line.3858"></a>
-<span class="sourceLineNo">3859</span>    } catch (WrongRegionException x) {<a name="line.3859"></a>
-<span class="sourceLineNo">3860</span>      // OK<a name="line.3860"></a>
-<span class="sourceLineNo">3861</span>    }<a name="line.3861"></a>
-<span class="sourceLineNo">3862</span>    byte[] row = Bytes.toBytes("y");<a name="line.3862"></a>
-<span class="sourceLineNo">3863</span>    g = new Get(row);<a name="line.3863"></a>
-<span class="sourceLineNo">3864</span>    region.get(g);<a name="line.3864"></a>
-<span class="sourceLineNo">3865</span>  }<a name="line.3865"></a>
-<span class="sourceLineNo">3866</span><a name="line.3866"></a>
-<span class="sourceLineNo">3867</span>  @Test<a name="line.3867"></a>
-<span class="sourceLineNo">3868</span>  public void testIndexesScanWithOneDeletedRow() throws IOException {<a name="line.3868"></a>
-<span class="sourceLineNo">3869</span>    byte[] family = Bytes.toBytes("family");<a name="line.3869"></a>
-<span class="sourceLineNo">3870</span><a name="line.3870"></a>
-<span class="sourceLineNo">3871</span>    // Setting up region<a name="line.3871"></a>
-<span class="sourceLineNo">3872</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.3872"></a>
-<span class="sourceLineNo">3873</span>    Put put = new Put(Bytes.toBytes(1L));<a name="line.3873"></a>
-<span class="sourceLineNo">3874</span>    put.addColumn(family, qual1, 1L, Bytes.toBytes(1L));<a name="line.3874"></a>
-<span class="sourceLineNo">3875</span>    region.put(put);<a name="line.3875"></a>
+<span class="sourceLineNo">3842</span>    } finally {<a name="line.3842"></a>
+<span class="sourceLineNo">3843</span>      if (putThread != null)<a name="line.3843"></a>
+<span class="sourceLineNo">3844</span>        putThread.done();<a name="line.3844"></a>
+<span class="sourceLineNo">3845</span><a name="line.3845"></a>
+<span class="sourceLineNo">3846</span>      region.flush(true);<a name="line.3846"></a>
+<span class="sourceLineNo">3847</span><a name="line.3847"></a>
+<span class="sourceLineNo">3848</span>      if (putThread != null) {<a name="line.3848"></a>
+<span class="sourceLineNo">3849</span>        putThread.join();<a name="line.3849"></a>
+<span class="sourceLineNo">3850</span>        putThread.checkNoError();<a name="line.3850"></a>
+<span class="sourceLineNo">3851</span>      }<a name="line.3851"></a>
+<span class="sourceLineNo">3852</span><a name="line.3852"></a>
+<span class="sourceLineNo">3853</span>      ctx.stop();<a name="line.3853"></a>
+<span class="sourceLineNo">3854</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.3854"></a>
+<span class="sourceLineNo">3855</span>      this.region = null;<a name="line.3855"></a>
+<span class="sourceLineNo">3856</span>    }<a name="line.3856"></a>
+<span class="sourceLineNo">3857</span>  }<a name="line.3857"></a>
+<span class="sourceLineNo">3858</span><a name="line.3858"></a>
+<span class="sourceLineNo">3859</span>  @Test<a name="line.3859"></a>
+<span class="sourceLineNo">3860</span>  public void testHolesInMeta() throws Exception {<a name="line.3860"></a>
+<span class="sourceLineNo">3861</span>    byte[] family = Bytes.toBytes("family");<a name="line.3861"></a>
+<span class="sourceLineNo">3862</span>    this.region = initHRegion(tableName, Bytes.toBytes("x"), Bytes.toBytes("z"), method, CONF,<a name="line.3862"></a>
+<span class="sourceLineNo">3863</span>        false, family);<a name="line.3863"></a>
+<span class="sourceLineNo">3864</span>    byte[] rowNotServed = Bytes.toBytes("a");<a name="line.3864"></a>
+<span class="sourceLineNo">3865</span>    Get g = new Get(rowNotServed);<a name="line.3865"></a>
+<span class="sourceLineNo">3866</span>    try {<a name="line.3866"></a>
+<span class="sourceLineNo">3867</span>      region.get(g);<a name="line.3867"></a>
+<span class="sourceLineNo">3868</span>      fail();<a name="line.3868"></a>
+<span class="sourceLineNo">3869</span>    } catch (WrongRegionException x) {<a name="line.3869"></a>
+<span class="sourceLineNo">3870</span>      // OK<a name="line.3870"></a>
+<span class="sourceLineNo">3871</span>    }<a name="line.3871"></a>
+<span class="sourceLineNo">3872</span>    byte[] row = Bytes.toBytes("y");<a name="line.3872"></a>
+<span class="sourceLineNo">3873</span>    g = new Get(row);<a name="line.3873"></a>
+<span class="sourceLineNo">3874</span>    region.get(g);<a name="line.3874"></a>
+<span class="sourceLineNo">3875</span>  }<a name="line.3875"></a>
 <span class="sourceLineNo">3876</span><a name="line.3876"></a>
-<span class="sourceLineNo">3877</span>    region.flush(true);<a name="line.3877"></a>
-<span class="sourceLineNo">3878</span><a name="line.3878"></a>
-<span class="sourceLineNo">3879</span>    Delete delete = new Delete(Bytes.toBytes(1L), 1L);<a name="line.3879"></a>
-<span class="sourceLineNo">3880</span>    region.delete(delete);<a name="line.3880"></a>
-<span class="sourceLineNo">3881</span><a name="line.3881"></a>
-<span class="sourceLineNo">3882</span>    put = new Put(Bytes.toBytes(2L));<a name="line.3882"></a>
-<span class="sourceLineNo">3883</span>    put.addColumn(family, qual1, 2L, Bytes.toBytes(2L));<a name="line.3883"></a>
-<span class="sourceLineNo">3884</span>    region.put(put);<a name="line.3884"></a>
-<span class="sourceLineNo">3885</span><a name="line.3885"></a>
-<span class="sourceLineNo">3886</span>    Scan idxScan = new Scan();<a name="line.3886"></a>
-<span class="sourceLineNo">3887</span>    idxScan.addFamily(family);<a name="line.3887"></a>
-<span class="sourceLineNo">3888</span>    idxScan.setFilter(new FilterList(FilterList.Operator.MUST_PASS_ALL, Arrays.&lt;Filter&gt; asList(<a name="line.3888"></a>
-<span class="sourceLineNo">3889</span>        new SingleColumnValueFilter(family, qual1, CompareOperator.GREATER_OR_EQUAL,<a name="line.3889"></a>
-<span class="sourceLineNo">3890</span>            new BinaryComparator(Bytes.toBytes(0L))), new SingleColumnValueFilter(family, qual1,<a name="line.3890"></a>
-<span class="sourceLineNo">3891</span>                    CompareOperator.LESS_OR_EQUAL, new BinaryComparator(Bytes.toBytes(3L))))));<a name="line.3891"></a>
-<span class="sourceLineNo">3892</span>    InternalScanner scanner = region.getScanner(idxScan);<a name="line.3892"></a>
-<span class="sourceLineNo">3893</span>    List&lt;Cell&gt; res = new ArrayList&lt;&gt;();<a name="line.3893"></a>
-<span class="sourceLineNo">3894</span><a name="line.3894"></a>
-<span class="sourceLineNo">3895</span>    while (scanner.next(res)) {<a name="line.3895"></a>
-<span class="sourceLineNo">3896</span>      // Ignore res value.<a name="line.3896"></a>
-<span class="sourceLineNo">3897</span>    }<a name="line.3897"></a>
-<span class="sourceLineNo">3898</span>    assertEquals(1L, res.size());<a name="line.3898"></a>
-<span class="sourceLineNo">3899</span>  }<a name="line.3899"></a>
-<span class="sourceLineNo">3900</span><a name="line.3900"></a>
-<span class="sourceLineNo">3901</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.3901"></a>
-<span class="sourceLineNo">3902</span>  // Bloom filter test<a name="line.3902"></a>
-<span class="sourceLineNo">3903</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.3903"></a>
-<span class="sourceLineNo">3904</span>  @Test<a name="line.3904"></a>
-<span class="sourceLineNo">3905</span>  public void testBloomFilterSize() throws IOException {<a name="line.3905"></a>
-<span class="sourceLineNo">3906</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.3906"></a>
-<span class="sourceLineNo">3907</span>    byte[] qf1 = Bytes.toBytes("col");<a name="line.3907"></a>
-<span class="sourceLineNo">3908</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.3908"></a>
-<span class="sourceLineNo">3909</span>    // Create Table<a name="line.3909"></a>
-<span class="sourceLineNo">3910</span>    HColumnDescriptor hcd = new HColumnDescriptor(fam1).setMaxVersions(Integer.MAX_VALUE)<a name="line.3910"></a>
-<span class="sourceLineNo">3911</span>        .setBloomFilterType(BloomType.ROWCOL);<a name="line.3911"></a>
-<span class="sourceLineNo">3912</span><a name="line.3912"></a>
-<span class="sourceLineNo">3913</span>    HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.3913"></a>
-<span class="sourceLineNo">3914</span>    htd.addFamily(hcd);<a name="line.3914"></a>
-<span class="sourceLineNo">3915</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.3915"></a>
-<span class="sourceLineNo">3916</span>    this.region = TEST_UTIL.createLocalHRegion(info, htd);<a name="line.3916"></a>
-<span class="sourceLineNo">3917</span>    int num_unique_rows = 10;<a name="line.3917"></a>
-<span class="sourceLineNo">3918</span>    int duplicate_multiplier = 2;<a name="line.3918"></a>
-<span class="sourceLineNo">3919</span>    int num_storefiles = 4;<a name="line.3919"></a>
-<span class="sourceLineNo">3920</span><a name="line.3920"></a>
-<span class="sourceLineNo">3921</span>    int version = 0;<a name="line.3921"></a>
-<span class="sourceLineNo">3922</span>    for (int f = 0; f &lt; num_storefiles; f++) {<a name="line.3922"></a>
-<span class="sourceLineNo">3923</span>      for (int i = 0; i &lt; duplicate_multiplier; i++) {<a name="line.3923"></a>
-<span class="sourceLineNo">3924</span>        for (int j = 0; j &lt; num_unique_rows; j++) {<a name="line.3924"></a>
-<span class="sourceLineNo">3925</span>          Put put = new Put(Bytes.toBytes("row" + j));<a name="line.3925"></a>
-<span class="sourceLineNo">3926</span>          put.setDurability(Durability.SKIP_WAL);<a name="line.3926"></a>
-<span class="sourceLineNo">3927</span>          long ts = version++;<a name="line.3927"></a>
-<span class="sourceLineNo">3928</span>          put.addColumn(fam1, qf1, ts, val1);<a name="line.3928"></a>
-<span class="sourceLineNo">3929</span>          region.put(put);<a name="line.3929"></a>
-<span class="sourceLineNo">3930</span>        }<a name="line.3930"></a>
-<span class="sourceLineNo">3931</span>      }<a name="line.3931"></a>
-<span class="sourceLineNo">3932</span>      region.flush(true);<a name="line.3932"></a>
-<span class="sourceLineNo">3933</span>    }<a name="line.3933"></a>
-<span class="sourceLineNo">3934</span>    // before compaction<a name="line.3934"></a>
-<span class="sourceLineNo">3935</span>    HStore store = region.getStore(fam1);<a name="line.3935"></a>
-<span class="sourceLineNo">3936</span>    Collection&lt;HStoreFile&gt; storeFiles = store.getStorefiles();<a name="line.3936"></a>
-<span class="sourceLineNo">3937</span>    for (HStoreFile storefile : storeFiles) {<a name="line.3937"></a>
-<span class="sourceLineNo">3938</span>      StoreFileReader reader = storefile.getReader();<a name="line.3938"></a>
-<span class="sourceLineNo">3939</span>      reader.loadFileInfo();<a name="line.3939"></a>
-<span class="sourceLineNo">3940</span>      reader.loadBloomfilter();<a name="line.3940"></a>
-<span class="sourceLineNo">3941</span>      assertEquals(num_unique_rows * duplicate_multiplier, reader.getEntries());<a name="line.3941"></a>
-<span class="sourceLineNo">3942</span>      assertEquals(num_unique_rows, reader.getFilterEntries());<a name="line.3942"></a>
+<span class="sourceLineNo">3877</span>  @Test<a name="line.3877"></a>
+<span class="sourceLineNo">3878</span>  public void testIndexesScanWithOneDeletedRow() throws IOException {<a name="line.3878"></a>
+<span class="sourceLineNo">3879</span>    byte[] family = Bytes.toBytes("family");<a name="line.3879"></a>
+<span class="sourceLineNo">3880</span><a name="line.3880"></a>
+<span class="sourceLineNo">3881</span>    // Setting up region<a name="line.3881"></a>
+<span class="sourceLineNo">3882</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.3882"></a>
+<span class="sourceLineNo">3883</span>    Put put = new Put(Bytes.toBytes(1L));<a name="line.3883"></a>
+<span class="sourceLineNo">3884</span>    put.addColumn(family, qual1, 1L, Bytes.toBytes(1L));<a name="line.3884"></a>
+<span class="sourceLineNo">3885</span>    region.put(put);<a name="line.3885"></a>
+<span class="sourceLineNo">3886</span><a name="line.3886"></a>
+<span class="sourceLineNo">3887</span>    region.flush(true);<a name="line.3887"></a>
+<span class="sourceLineNo">3888</span><a name="line.3888"></a>
+<span class="sourceLineNo">3889</span>    Delete delete = new Delete(Bytes.toBytes(1L), 1L);<a name="line.3889"></a>
+<span class="sourceLineNo">3890</span>    region.delete(delete);<a name="line.3890"></a>
+<span class="sourceLineNo">3891</span><a name="line.3891"></a>
+<span class="sourceLineNo">3892</span>    put = new Put(Bytes.toBytes(2L));<a name="line.3892"></a>
+<span class="sourceLineNo">3893</span>    put.addColumn(family, qual1, 2L, Bytes.toBytes(2L));<a name="line.3893"></a>
+<span class="sourceLineNo">3894</span>    region.put(put);<a name="line.3894"></a>
+<span class="sourceLineNo">3895</span><a name="line.3895"></a>
+<span class="sourceLineNo">3896</span>    Scan idxScan = new Scan();<a name="line.3896"></a>
+<span class="sourceLineNo">3897</span>    idxScan.addFamily(family);<a name="line.3897"></a>
+<span class="sourceLineNo">3898</span>    idxScan.setFilter(new FilterList(FilterList.Operator.MUST_PASS_ALL, Arrays.&lt;Filter&gt; asList(<a name="line.3898"></a>
+<span class="sourceLineNo">3899</span>        new SingleColumnValueFilter(family, qual1, CompareOperator.GREATER_OR_EQUAL,<a name="line.3899"></a>
+<span class="sourceLineNo">3900</span>            new BinaryComparator(Bytes.toBytes(0L))), new SingleColumnValueFilter(family, qual1,<a name="line.3900"></a>
+<span class="sourceLineNo">3901</span>                    CompareOperator.LESS_OR_EQUAL, new BinaryComparator(Bytes.toBytes(3L))))));<a name="line.3901"></a>
+<span class="sourceLineNo">3902</span>    InternalScanner scanner = region.getScanner(idxScan);<a name="line.3902"></a>
+<span class="sourceLineNo">3903</span>    List&lt;Cell&gt; res = new ArrayList&lt;&gt;();<a name="line.3903"></a>
+<span class="sourceLineNo">3904</span><a name="line.3904"></a>
+<span class="sourceLineNo">3905</span>    while (scanner.next(res)) {<a name="line.3905"></a>
+<span class="sourceLineNo">3906</span>      // Ignore res value.<a name="line.3906"></a>
+<span class="sourceLineNo">3907</span>    }<a name="line.3907"></a>
+<span class="sourceLineNo">3908</span>    assertEquals(1L, res.size());<a name="line.3908"></a>
+<span class="sourceLineNo">3909</span>  }<a name="line.3909"></a>
+<span class="sourceLineNo">3910</span><a name="line.3910"></a>
+<span class="sourceLineNo">3911</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.3911"></a>
+<span class="sourceLineNo">3912</span>  // Bloom filter test<a name="line.3912"></a>
+<span class="sourceLineNo">3913</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.3913"></a>
+<span class="sourceLineNo">3914</span>  @Test<a name="line.3914"></a>
+<span class="sourceLineNo">3915</span>  public void testBloomFilterSize() throws IOException {<a name="line.3915"></a>
+<span class="sourceLineNo">3916</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.3916"></a>
+<span class="sourceLineNo">3917</span>    byte[] qf1 = Bytes.toBytes("col");<a name="line.3917"></a>
+<span class="sourceLineNo">3918</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.3918"></a>
+<span class="sourceLineNo">3919</span>    // Create Table<a name="line.3919"></a>
+<span class="sourceLineNo">3920</span>    HColumnDescriptor hcd = new HColumnDescriptor(fam1).setMaxVersions(Integer.MAX_VALUE)<a name="line.3920"></a>
+<span class="sourceLineNo">3921</span>        .setBloomFilterType(BloomType.ROWCOL);<a name="line.3921"></a>
+<span class="sourceLineNo">3922</span><a name="line.3922"></a>
+<span class="sourceLineNo">3923</span>    HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.3923"></a>
+<span class="sourceLineNo">3924</span>    htd.addFamily(hcd);<a name="line.3924"></a>
+<span class="sourceLineNo">3925</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.3925"></a>
+<span class="sourceLineNo">3926</span>    this.region = TEST_UTIL.createLocalHRegion(info, htd);<a name="line.3926"></a>
+<span class="sourceLineNo">3927</span>    int num_unique_rows = 10;<a name="line.3927"></a>
+<span class="sourceLineNo">3928</span>    int duplicate_multiplier = 2;<a name="line.3928"></a>
+<span class="sourceLineNo">3929</span>    int num_storefiles = 4;<a name="line.3929"></a>
+<span class="sourceLineNo">3930</span><a name="line.3930"></a>
+<span class="sourceLineNo">3931</span>    int version = 0;<a name="line.3931"></a>
+<span class="sourceLineNo">3932</span>    for (int f = 0; f &lt; num_storefiles; f++) {<a name="line.3932"></a>
+<span class="sourceLineNo">3933</span>      for (int i = 0; i &lt; duplicate_multiplier; i++) {<a name="line.3933"></a>
+<span class="sourceLineNo">3934</span>        for (int j = 0; j &lt; num_unique_rows; j++) {<a name="line.3934"></a>
+<span class="sourceLineNo">3935</span>          Put put = new Put(Bytes.toBytes("row" + j));<a name="line.3935"></a>
+<span class="sourceLineNo">3936</span>          put.setDurability(Durability.SKIP_WAL);<a name="line.3936"></a>
+<span class="sourceLineNo">3937</span>          long ts = version++;<a name="line.3937"></a>
+<span class="sourceLineNo">3938</span>          put.addColumn(fam1, qf1, ts, val1);<a name="line.3938"></a>
+<span class="sourceLineNo">3939</span>          region.put(put);<a name="line.3939"></a>
+<span class="sourceLineNo">3940</span>        }<a name="line.3940"></a>
+<span class="sourceLineNo">3941</span>      }<a name="line.3941"></a>
+<span class="sourceLineNo">3942</span>      region.flush(true);<a name="line.3942"></a>
 <span class="sourceLineNo">3943</span>    }<a name="line.3943"></a>
-<span class="sourceLineNo">3944</span><a name="line.3944"></a>
-<span class="sourceLineNo">3945</span>    region.compact(true);<a name="line.3945"></a>
-<span class="sourceLineNo">3946</span><a name="line.3946"></a>
-<span class="sourceLineNo">3947</span>    // after compaction<a name="line.3947"></a>
-<span class="sourceLineNo">3948</span>    storeFiles = store.getStorefiles();<a name="line.3948"></a>
-<span class="sourceLineNo">3949</span>    for (HStoreFile storefile : storeFiles) {<a name="line.3949"></a>
-<span class="sourceLineNo">3950</span>      StoreFileReader reader = storefile.getReader();<a name="line.3950"></a>
-<span class="sourceLineNo">3951</span>      reader.loadFileInfo();<a name="line.3951"></a>
-<span class="sourceLineNo">3952</span>      reader.loadBloomfilter();<a name="line.3952"></a>
-<span class="sourceLineNo">3953</span>      assertEquals(num_unique_rows * duplicate_multiplier * num_storefiles, reader.getEntries());<a name="line.3953"></a>
-<span class="sourceLineNo">3954</span>      assertEquals(num_unique_rows, reader.getFilterEntries());<a name="line.3954"></a>
-<span class="sourceLineNo">3955</span>    }<a name="line.3955"></a>
-<span class="sourceLineNo">3956</span>  }<a name="line.3956"></a>
-<span class="sourceLineNo">3957</span><a name="line.3957"></a>
-<span class="sourceLineNo">3958</span>  @Test<a name="line.3958"></a>
-<span class="sourceLineNo">3959</span>  public void testAllColumnsWithBloomFilter() throws IOException {<a name="line.3959"></a>
-<span class="sourceLineNo">3960</span>    byte[] TABLE = Bytes.toBytes(name.getMethodName());<a name="line.3960"></a>
-<span class="sourceLineNo">3961</span>    byte[] FAMILY = Bytes.toBytes("family");<a name="line.3961"></a>
-<span class="sourceLineNo">3962</span><a name="line.3962"></a>
-<span class="sourceLineNo">3963</span>    // Create table<a name="line.3963"></a>
-<span class="sourceLineNo">3964</span>    HColumnDescriptor hcd = new HColumnDescriptor(FAMILY).setMaxVersions(Integer.MAX_VALUE)<a name="line.3964"></a>
-<span class="sourceLineNo">3965</span>        .setBloomFilterType(BloomType.ROWCOL);<a name="line.3965"></a>
-<span class="sourceLineNo">3966</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(TABLE));<a name="line.3966"></a>
-<span class="sourceLineNo">3967</span>    htd.addFamily(hcd);<a name="line.3967"></a>
-<span class="sourceLineNo">3968</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.3968"></a>
-<span class="sourceLineNo">3969</span>    this.region = TEST_UTIL.createLocalHRegion(info, htd);<a name="line.3969"></a>
-<span class="sourceLineNo">3970</span>    // For row:0, col:0: insert versions 1 through 5.<a name="line.3970"></a>
-<span class="sourceLineNo">3971</span>    byte[] row = Bytes.toBytes("row:" + 0);<a name="line.3971"></a>
-<span class="sourceLineNo">3972</span>    byte[] column = Bytes.toBytes("column:" + 0);<a name="line.3972"></a>
-<span class="sourceLineNo">3973</span>    Put put = new Put(row);<a name="line.3973"></a>
-<span class="sourceLineNo">3974</span>    put.setDurability(Durability.SKIP_WAL);<a name="line.3974"></a>
-<span class="sourceLineNo">3975</span>    for (long idx = 1; idx &lt;= 4; idx++) {<a name="line.3975"></a>
-<span class="sourceLineNo">3976</span>      put.addColumn(FAMILY, column, idx, Bytes.toBytes("value-version-" + idx));<a name="line.3976"></a>
-<span class="sourceLineNo">3977</span>    }<a name="line.3977"></a>
-<span class="sourceLineNo">3978</span>    region.put(put);<a name="line.3978"></a>
-<span class="sourceLineNo">3979</span><a name="line.3979"></a>
-<span class="sourceLineNo">3980</span>    // Flush<a name="line.3980"></a>
-<span class="sourceLineNo">3981</span>    region.flush(true);<a name="line.3981"></a>
-<span class="sourceLineNo">3982</span><a name="line.3982"></a>
-<span class="sourceLineNo">3983</span>    // Get rows<a name="line.3983"></a>
-<span class="sourceLineNo">3984</span>    Get get = new Get(row);<a name="line.3984"></a>
-<span class="sourceLineNo">3985</span>    get.readAllVersions();<a name="line.3985"></a>
-<span class="sourceLineNo">3986</span>    Cell[] kvs = region.get(get).rawCells();<a name="line.3986"></a>
-<span class="sourceLineNo">3987</span><a name="line.3987"></a>
-<span class="sourceLineNo">3988</span>    // Check if rows are correct<a name="line.3988"></a>
-<span class="sourceLineNo">3989</span>    assertEquals(4, kvs.length);<a name="line.3989"></a>
-<span class="sourceLineNo">3990</span>    checkOneCell(kvs[0], FAMILY, 0, 0, 4);<a name="line.3990"></a>
-<span class="sourceLineNo">3991</span>    checkOneCell(kvs[1], FAMILY, 0, 0, 3);<a name="line.3991"></a>
-<span class="sourceLineNo">3992</span>    checkOneCell(kvs[2], FAMILY, 0, 0, 2);<a name="line.3992"></a>
-<span class="sourceLineNo">3993</span>    checkOneCell(kvs[3], FAMILY, 0, 0, 1);<a name="line.3993"></a>
-<span class="sourceLineNo">3994</span>  }<a name="line.3994"></a>
-<span class="sourceLineNo">3995</span><a name="line.3995"></a>
-<span class="sourceLineNo">3996</span>  /**<a name="line.3996"></a>
-<span class="sourceLineNo">3997</span>   * Testcase to cover bug-fix for HBASE-2823 Ensures correct delete when<a name="line.3997"></a>
-<span class="sourceLineNo">3998</span>   * issuing delete row on columns with bloom filter set to row+col<a name="line.3998"></a>
-<span class="sourceLineNo">3999</span>   * (BloomType.ROWCOL)<a name="line.3999"></a>
-<span class="sourceLineNo">4000</span>   */<a name="line.4000"></a>
-<span class="sourceLineNo">4001</span>  @Test<a name="line.4001"></a>
-<span class="sourceLineNo">4002</span>  public void testDeleteRowWithBloomFilter() throws IOException {<a name="line.4002"></a>
-<span class="sourceLineNo">4003</span>    byte[] familyName = Bytes.toBytes("familyName");<a name="line.4003"></a>
-<span class="sourceLineNo">4004</span><a name="line.4004"></a>
-<span class="sourceLineNo">4005</span>    // Create Table<a name="line.4005"></a>
-<span class="sourceLineNo">4006</span>    HColumnDescriptor hcd = new HColumnDescriptor(familyName).setMaxVersions(Integer.MAX_VALUE)<a name="line.4006"></a>
-<span class="sourceLineNo">4007</span>        .setBloomFilterType(BloomType.ROWCOL);<a name="line.4007"></a>
-<span class="sourceLineNo">4008</span><a name="line.4008"></a>
-<span class="sourceLineNo">4009</span>    HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.4009"></a>
-<span class="sourceLineNo">4010</span>    htd.addFamily(hcd);<a name="line.4010"></a>
-<span class="sourceLineNo">4011</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.4011"></a>
-<span class="sourceLineNo">4012</span>    this.region = TEST_UTIL.createLocalHRegion(info, htd);<a name="line.4012"></a>
-<span class="sourceLineNo">4013</span>    // Insert some data<a name="line.4013"></a>
-<span class="sourceLineNo">4014</span>    byte[] row = Bytes.toBytes("row1");<a name="line.4014"></a>
-<span class="sourceLineNo">4015</span>    byte[] col = Bytes.toBytes("col1");<a name="line.4015"></a>
-<span class="sourceLineNo">4016</span><a name="line.4016"></a>
-<span class="sourceLineNo">4017</span>    Put put = new Put(row);<a name="line.4017"></a>
-<span class="sourceLineNo">4018</span>    put.addColumn(familyName, col, 1, Bytes.toBytes("SomeRandomValue"));<a name="line.4018"></a>
-<span class="sourceLineNo">4019</span>    region.put(put);<a name="line.4019"></a>
-<span class="sourceLineNo">4020</span>    region.flush(true);<a name="line.4020"></a>
-<span class="sourceLineNo">4021</span><a name="line.4021"></a>
-<span class="sourceLineNo">4022</span>    Delete del = new Delete(row);<a name="line.4022"></a>
-<span class="sourceLineNo">4023</span>    region.delete(del);<a name="line.4023"></a>
-<span class="sourceLineNo">4024</span>    region.flush(true);<a name="line.4024"></a>
-<span class="sourceLineNo">4025</span><a name="line.4025"></a>
-<span class="sourceLineNo">4026</span>    // Get remaining rows (should have none)<a name="line.4026"></a>
-<span class="sourceLineNo">4027</span>    Get get = new Get(row);<a name="line.4027"></a>
-<span class="sourceLineNo">4028</span>    get.addColumn(familyName, col);<a name="line.4028"></a>
-<span class="sourceLineNo">4029</span><a name="line.4029"></a>
-<span class="sourceLineNo">4030</span>    Cell[] keyValues = region.get(get).rawCells();<a name="line.4030"></a>
-<span class="sourceLineNo">4031</span>    assertEquals(0, keyValues.length);<a name="line.4031"></a>
-<span class="sourceLineNo">4032</span>  }<a name="line.4032"></a>
-<span class="sourceLineNo">4033</span><a name="line.4033"></a>
-<span class="sourceLineNo">4034</span>  @Test<a name="line.4034"></a>
-<span class="sourceLineNo">4035</span>  public void testgetHDFSBlocksDistribution() throws Exception {<a name="line.4035"></a>
-<span class="sourceLineNo">4036</span>    HBaseTestingUtility htu = new HBaseTestingUtility();<a name="line.4036"></a>
-<span class="sourceLineNo">4037</span>    // Why do we set the block size in this test?  If we set it smaller than the kvs, then we'll<a name="line.4037"></a>
-<span class="sourceLineNo">4038</span>    // break up the file in to more pieces that can be distributed across the three nodes and we<a name="line.4038"></a>
-<span class="sourceLineNo">4039</span>    // won't be able to have the condition this test asserts; that at least one node has<a name="line.4039"></a>
-<span class="sourceLineNo">4040</span>    // a copy of all replicas -- if small block size, then blocks are spread evenly across the<a name="line.4040"></a>
-<span class="sourceLineNo">4041</span>    // the three nodes.  hfilev3 with tags seems to put us over the block size.  St.Ack.<a name="line.4041"></a>
-<span class="sourceLineNo">4042</span>    // final int DEFAULT_BLOCK_SIZE = 1024;<a name="line.4042"></a>
-<span class="sourceLineNo">4043</span>    // htu.getConfiguration().setLong("dfs.blocksize", DEFAULT_BLOCK_SIZE);<a name="line.4043"></a>
-<span class="sourceLineNo">4044</span>    htu.getConfiguration().setInt("dfs.replication", 2);<a name="line.4044"></a>
-<span class="sourceLineNo">4045</span><a name="line.4045"></a>
-<span class="sourceLineNo">4046</span>    // set up a cluster with 3 nodes<a name="line.4046"></a>
-<span class="sourceLineNo">4047</span>    MiniHBaseCluster cluster = null;<a name="line.4047"></a>
-<span class="sourceLineNo">4048</span>    String dataNodeHosts[] = new String[] { "host1", "host2", "host3" };<a name="line.4048"></a>
-<span class="sourceLineNo">4049</span>    int regionServersCount = 3;<a name="line.4049"></a>
-<span class="sourceLineNo">4050</span><a name="line.4050"></a>
-<span class="sourceLineNo">4051</span>    try {<a name="line.4051"></a>
-<span class="sourceLineNo">4052</span>      StartMiniClusterOption option = StartMiniClusterOption.builder()<a name="line.4052"></a>
-<span class="sourceLineNo">4053</span>          .numRegionServers(regionServersCount).dataNodeHosts(dataNodeHosts).build();<a name="line.4053"></a>
-<span class="sourceLineNo">4054</span>      cluster = htu.startMiniCluster(option);<a name="line.4054"></a>
-<span class="sourceLineNo">4055</span>      byte[][] families = { fam1, fam2 };<a name="line.4055"></a>
-<span class="sourceLineNo">4056</span>      Table ht = htu.createTable(tableName, families);<a name="line.4056"></a>
-<span class="sourceLineNo">4057</span><a name="line.4057"></a>
-<span class="sourceLineNo">4058</span>      // Setting up region<a name="line.4058"></a>
-<span class="sourceLineNo">4059</span>      byte row[] = Bytes.toBytes("row1");<a name="line.4059"></a>
-<span class="sourceLineNo">4060</span>      byte col[] = Bytes.toBytes("col1");<a name="line.4060"></a>
-<span class="sourceLineNo">4061</span><a name="line.4061"></a>
-<span class="sourceLineNo">4062</span>      Put put = new Put(row);<a name="line.4062"></a>
-<span class="sourceLineNo">4063</span>      put.addColumn(fam1, col, 1, Bytes.toBytes("test1"));<a name="line.4063"></a>
-<span class="sourceLineNo">4064</span>      put.addColumn(fam2, col, 1, Bytes.toBytes("test2"));<a name="line.4064"></a>
-<span class="sourceLineNo">4065</span>      ht.put(put);<a name="line.4065"></a>
-<span class="sourceLineNo">4066</span><a name="line.4066"></a>
-<span class="sourceLineNo">4067</span>      HRegion firstRegion = htu.getHBaseCluster().getRegions(tableName).get(0);<a name="line.4067"></a>
-<span class="sourceLineNo">4068</span>      firstRegion.flush(true);<a name="line.4068"></a>
-<span class="sourceLineNo">4069</span>      HDFSBlocksDistribution blocksDistribution1 = firstRegion.getHDFSBlocksDistribution();<a name="line.4069"></a>
-<span class="sourceLineNo">4070</span><a name="line.4070"></a>
-<span class="sourceLineNo">4071</span>      // Given the default replication factor is 2 and we have 2 HFiles,<a name="line.4071"></a>
-<span class="sourceLineNo">4072</span>      // we will have total of 4 replica of blocks on 3 datanodes; thus there<a name="line.4072"></a>
-<span class="sourceLineNo">4073</span>      // must be at least one host that have replica for 2 HFiles. That host's<a name="line.4073"></a>
-<span class="sourceLineNo">4074</span>      // weight will be equal to the unique block weight.<a name="line.4074"></a>
-<span class="sourceLineNo">4075</span>      long uniqueBlocksWeight1 = blocksDistribution1.getUniqueBlocksTotalWeight();<a name="line.4075"></a>
-<span class="sourceLineNo">4076</span>      StringBuilder sb = new StringBuilder();<a name="line.4076"></a>
-<span class="sourceLineNo">4077</span>      for (String host: blocksDistribution1.getTopHosts()) {<a name="line.4077"></a>
-<span class="sourceLineNo">4078</span>        if (sb.length() &gt; 0) sb.append(", ");<a name="line.4078"></a>
-<span class="sourceLineNo">4079</span>        sb.append(host);<a name="line.4079"></a>
-<span class="sourceLineNo">4080</span>        sb.append("=");<a name="line.4080"></a>
-<span class="sourceLineNo">4081</span>        sb.append(blocksDistribution1.getWeight(host));<a name="line.4081"></a>
-<span class="sourceLineNo">4082</span>      }<a name="line.4082"></a>
-<span class="sourceLineNo">4083</span><a name="line.4083"></a>
-<span class="sourceLineNo">4084</span>      String topHost = blocksDistribution1.getTopHosts().get(0);<a name="line.4084"></a>
-<span class="sourceLineNo">4085</span>      long topHostWeight = blocksDistribution1.getWeight(topHost);<a name="line.4085"></a>
-<span class="sourceLineNo">4086</span>      String msg = "uniqueBlocksWeight=" + uniqueBlocksWeight1 + ", topHostWeight=" +<a name="line.4086"></a>
-<span class="sourceLineNo">4087</span>        topHostWeight + ", topHost=" + topHost + "; " + sb.toString();<a name="line.4087"></a>
-<span class="sourceLineNo">4088</span>      LOG.info(msg);<a name="line.4088"></a>
-<span class="sourceLineNo">4089</span>      assertTrue(msg, uniqueBlocksWeight1 == topHostWeight);<a name="line.4089"></a>
-<span class="sourceLineNo">4090</span><a name="line.4090"></a>
-<span class="sourceLineNo">4091</span>      // use the static method to compute the value, it should be the same.<a name="line.4091"></a>
-<span class="sourceLineNo">4092</span>      // static method is used by load balancer or other components<a name="line.4092"></a>
-<span class="sourceLineNo">4093</span>      HDFSBlocksDistribution blocksDistribution2 = HRegion.computeHDFSBlocksDistribution(<a name="line.4093"></a>
-<span class="sourceLineNo">4094</span>          htu.getConfiguration(), firstRegion.getTableDescriptor(), firstRegion.getRegionInfo());<a name="line.4094"></a>
-<span class="sourceLineNo">4095</span>      long uniqueBlocksWeight2 = blocksDistribution2.getUniqueBlocksTotalWeight();<a name="line.4095"></a>
-<span class="sourceLineNo">4096</span><a name="line.4096"></a>
-<span class="sourceLineNo">4097</span>      assertTrue(uniqueBlocksWeight1 == uniqueBlocksWeight2);<a name="line.4097"></a>
-<span class="sourceLineNo">4098</span><a name="line.4098"></a>
-<span class="sourceLineNo">4099</span>      ht.close();<a name="line.4099"></a>
-<span class="sourceLineNo">4100</span>    } finally {<a name="line.4100"></a>
-<span class="sourceLineNo">4101</span>      if (cluster != null) {<a name="line.4101"></a>
-<span class="sourceLineNo">4102</span>        htu.shutdownMiniCluster();<a name="line.4102"></a>
-<span class="sourceLineNo">4103</span>      }<a name="line.4103"></a>
-<span class="sourceLineNo">4104</span>    }<a name="line.4104"></a>
-<span class="sourceLineNo">4105</span>  }<a name="line.4105"></a>
+<span class="sourceLineNo">3944</span>    // before compaction<a name="line.3944"></a>
+<span class="sourceLineNo">3945</span>    HStore store = region.getStore(fam1);<a name="line.3945"></a>
+<span class="sourceLineNo">3946</span>    Collection&lt;HStoreFile&gt; storeFiles = store.getStorefiles();<a name="line.3946"></a>
+<span class="sourceLineNo">3947</span>    for (HStoreFile storefile : storeFiles) {<a name="line.3947"></a>
+<span class="sourceLineNo">3948</span>      StoreFileReader reader = storefile.getReader();<a name="line.3948"></a>
+<span class="sourceLineNo">3949</span>      reader.loadFileInfo();<a name="line.3949"></a>
+<span class="sourceLineNo">3950</span>      reader.loadBloomfilter();<a name="line.3950"></a>
+<span class="sourceLineNo">3951</span>      assertEquals(num_unique_rows * duplicate_multiplier, reader.getEntries());<a name="line.3951"></a>
+<span class="sourceLineNo">3952</span>      assertEquals(num_unique_rows, reader.getFilterEntries());<a name="line.3952"></a>
+<span class="sourceLineNo">3953</span>    }<a name="line.3953"></a>
+<span class="sourceLineNo">3954</span><a name="line.3954"></a>
+<span class="sourceLineNo">3955</span>    region.compact(true);<a name="line.3955"></a>
+<span class="sourceLineNo">3956</span><a name="line.3956"></a>
+<span class="sourceLineNo">3957</span>    // after compaction<a name="line.3957"></a>
+<span class="sourceLineNo">3958</span>    storeFiles = store.getStorefiles();<a name="line.3958"></a>
+<span class="sourceLineNo">3959</span>    for (HStoreFile storefile : storeFiles) {<a name="line.3959"></a>
+<span class="sourceLineNo">3960</span>      StoreFileReader reader = storefile.getReader();<a name="line.3960"></a>
+<span class="sourceLineNo">3961</span>      reader.loadFileInfo();<a name="line.3961"></a>
+<span class="sourceLineNo">3962</span>      reader.loadBloomfilter();<a name="line.3962"></a>
+<span class="sourceLineNo">3963</span>      assertEquals(num_unique_rows * duplicate_multiplier * num_storefiles, reader.getEntries());<a name="line.3963"></a>
+<span class="sourceLineNo">3964</span>      assertEquals(num_unique_rows, reader.getFilterEntries());<a name="line.3964"></a>
+<span class="sourceLineNo">3965</span>    }<a name="line.3965"></a>
+<span class="sourceLineNo">3966</span>  }<a name="line.3966"></a>
+<span class="sourceLineNo">3967</span><a name="line.3967"></a>
+<span class="sourceLineNo">3968</span>  @Test<a name="line.3968"></a>
+<span class="sourceLineNo">3969</span>  public void testAllColumnsWithBloomFilter() throws IOException {<a name="line.3969"></a>
+<span class="sourceLineNo">3970</span>    byte[] TABLE = Bytes.toBytes(name.getMethodName());<a name="line.3970"></a>
+<span class="sourceLineNo">3971</span>    byte[] FAMILY = Bytes.toBytes("family");<a name="line.3971"></a>
+<span class="sourceLineNo">3972</span><a name="line.3972"></a>
+<span class="sourceLineNo">3973</span>    // Create table<a name="line.3973"></a>
+<span class="sourceLineNo">3974</span>    HColumnDescriptor hcd = new HColumnDescriptor(FAMILY).setMaxVersions(Integer.MAX_VALUE)<a name="line.3974"></a>
+<span class="sourceLineNo">3975</span>        .setBloomFilterType(BloomType.ROWCOL);<a name="line.3975"></a>
+<span class="sourceLineNo">3976</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(TABLE));<a name="line.3976"></a>
+<span class="sourceLineNo">3977</span>    htd.addFamily(hcd);<a name="line.3977"></a>
+<span class="sourceLineNo">3978</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.3978"></a>
+<span class="sourceLineNo">3979</span>    this.region = TEST_UTIL.createLocalHRegion(info, htd);<a name="line.3979"></a>
+<span class="sourceLineNo">3980</span>    // For row:0, col:0: insert versions 1 through 5.<a name="line.3980"></a>
+<span class="sourceLineNo">3981</span>    byte[] row = Bytes.toBytes("row:" + 0);<a name="line.3981"></a>
+<span class="sourceLineNo">3982</span>    byte[] column = Bytes.toBytes("column:" + 0);<a name="line.3982"></a>
+<span class="sourceLineNo">3983</span>    Put put = new Put(row);<a name="line.3983"></a>
+<span class="sourceLineNo">3984</span>    put.setDurability(Durability.SKIP_WAL);<a name="line.3984"></a>
+<span class="sourceLineNo">3985</span>    for (long idx = 1; idx &lt;= 4; idx++) {<a name="line.3985"></a>
+<span class="sourceLineNo">3986</span>      put.addColumn(FAMILY, column, idx, Bytes.toBytes("value-version-" + idx));<a name="line.3986"></a>
+<span class="sourceLineNo">3987</span>    }<a name="line.3987"></a>
+<span class="sourceLineNo">3988</span>    region.put(put);<a name="line.3988"></a>
+<span class="sourceLineNo">3989</span><a name="line.3989"></a>
+<span class="sourceLineNo">3990</span>    // Flush<a name="line.3990"></a>
+<span class="sourceLineNo">3991</span>    region.flush(true);<a name="line.3991"></a>
+<span class="sourceLineNo">3992</span><a name="line.3992"></a>
+<span class="sourceLineNo">3993</span>    // Get rows<a name="line.3993"></a>
+<span class="sourceLineNo">3994</span>    Get get = new Get(row);<a name="line.3994"></a>
+<span class="sourceLineNo">3995</span>    get.readAllVersions();<a name="line.3995"></a>
+<span class="sourceLineNo">3996</span>    Cell[] kvs = region.get(get).rawCells();<a name="line.3996"></a>
+<span class="sourceLineNo">3997</span><a name="line.3997"></a>
+<span class="sourceLineNo">3998</span>    // Check if rows are correct<a name="line.3998"></a>
+<span class="sourceLineNo">3999</span>    assertEquals(4, kvs.length);<a name="line.3999"></a>
+<span class="sourceLineNo">4000</span>    checkOneCell(kvs[0], FAMILY, 0, 0, 4);<a name="line.4000"></a>
+<span class="sourceLineNo">4001</span>    checkOneCell(kvs[1], FAMILY, 0, 0, 3);<a name="line.4001"></a>
+<span class="sourceLineNo">4002</span>    checkOneCell(kvs[2], FAMILY, 0, 0, 2);<a name="line.4002"></a>
+<span class="sourceLineNo">4003</span>    checkOneCell(kvs[3], FAMILY, 0, 0, 1);<a name="line.4003"></a>
+<span class="sourceLineNo">4004</span>  }<a name="line.4004"></a>
+<span class="sourceLineNo">4005</span><a name="line.4005"></a>
+<span class="sourceLineNo">4006</span>  /**<a name="line.4006"></a>
+<span class="sourceLineNo">4007</span>   * Testcase to cover bug-fix for HBASE-2823 Ensures correct delete when<a name="line.4007"></a>
+<span class="sourceLineNo">4008</span>   * issuing delete row on columns with bloom filter set to row+col<a name="line.4008"></a>
+<span class="sourceLineNo">4009</span>   * (BloomType.ROWCOL)<a name="line.4009"></a>
+<span class="sourceLineNo">4010</span>   */<a name="line.4010"></a>
+<span class="sourceLineNo">4011</span>  @Test<a name="line.4011"></a>
+<span class="sourceLineNo">4012</span>  public void testDeleteRowWithBloomFilter() throws IOException {<a name="line.4012"></a>
+<span class="sourceLineNo">4013</span>    byte[] familyName = Bytes.toBytes("familyName");<a name="line.4013"></a>
+<span class="sourceLineNo">4014</span><a name="line.4014"></a>
+<span class="sourceLineNo">4015</span>    // Create Table<a name="line.4015"></a>
+<span class="sourceLineNo">4016</span>    HColumnDescriptor hcd = new HColumnDescriptor(familyName).setMaxVersions(Integer.MAX_VALUE)<a name="line.4016"></a>
+<span class="sourceLineNo">4017</span>        .setBloomFilterType(BloomType.ROWCOL);<a name="line.4017"></a>
+<span class="sourceLineNo">4018</span><a name="line.4018"></a>
+<span class="sourceLineNo">4019</span>    HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.4019"></a>
+<span class="sourceLineNo">4020</span>    htd.addFamily(hcd);<a name="line.4020"></a>
+<span class="sourceLineNo">4021</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.4021"></a>
+<span class="sourceLineNo">4022</span>    this.region = TEST_UTIL.createLocalHRegion(info, htd);<a name="line.4022"></a>
+<span class="sourceLineNo">4023</span>    // Insert some data<a name="line.4023"></a>
+<span class="sourceLineNo">4024</span>    byte[] row = Bytes.toBytes("row1");<a name="line.4024"></a>
+<span class="sourceLineNo">4025</span>    byte[] col = Bytes.toBytes("col1");<a name="line.4025"></a>
+<span class="sourceLineNo">4026</span><a name="line.4026"></a>
+<span class="sourceLineNo">4027</span>    Put put = new Put(row);<a name="line.4027"></a>
+<span class="sourceLineNo">4028</span>    put.addColumn(familyName, col, 1, Bytes.toBytes("SomeRandomValue"));<a name="line.4028"></a>
+<span class="sourceLineNo">4029</span>    region.put(put);<a name="line.4029"></a>
+<span class="sourceLineNo">4030</span>    region.flush(true);<a name="line.4030"></a>
+<span class="sourceLineNo">4031</span><a name="line.4031"></a>
+<span class="sourceLineNo">4032</span>    Delete del = new Delete(row);<a name="line.4032"></a>
+<span class="sourceLineNo">4033</span>    region.delete(del);<a name="line.4033"></a>
+<span class="sourceLineNo">4034</span>    region.flush(true);<a name="line.4034"></a>
+<span class="sourceLineNo">4035</span><a name="line.4035"></a>
+<span class="sourceLineNo">4036</span>    // Get remaining rows (should have none)<a name="line.4036"></a>
+<span class="sourceLineNo">4037</span>    Get get = new Get(row);<a name="line.4037"></a>
+<span class="sourceLineNo">4038</span>    get.addColumn(familyName, col);<a name="line.4038"></a>
+<span class="sourceLineNo">4039</span><a name="line.4039"></a>
+<span class="sourceLineNo">4040</span>    Cell[] keyValues = region.get(get).rawCells();<a name="line.4040"></a>
+<span class="sourceLineNo">4041</span>    assertEquals(0, keyValues.length);<a name="line.4041"></a>
+<span class="sourceLineNo">4042</span>  }<a name="line.4042"></a>
+<span class="sourceLineNo">4043</span><a name="line.4043"></a>
+<span class="sourceLineNo">4044</span>  @Test<a name="line.4044"></a>
+<span class="sourceLineNo">4045</span>  public void testgetHDFSBlocksDistribution() throws Exception {<a name="line.4045"></a>
+<span class="sourceLineNo">4046</span>    HBaseTestingUtility htu = new HBaseTestingUtility();<a name="line.4046"></a>
+<span class="sourceLineNo">4047</span>    // Why do we set the block size in this test?  If we set it smaller than the kvs, then we'll<a name="line.4047"></a>
+<span class="sourceLineNo">4048</span>    // break up the file in to more pieces that can be distributed across the three nodes and we<a name="line.4048"></a>
+<span class="sourceLineNo">4049</span>    // won't be able to have the condition this test asserts; that at least one node has<a name="line.4049"></a>
+<span class="sourceLineNo">4050</span>    // a copy of all replicas -- if small block size, then blocks are spread evenly across the<a name="line.4050"></a>
+<span class="sourceLineNo">4051</span>    // the three nodes.  hfilev3 with tags seems to put us over the block size.  St.Ack.<a name="line.4051"></a>
+<span class="sourceLineNo">4052</span>    // final int DEFAULT_BLOCK_SIZE = 1024;<a name="line.4052"></a>
+<span class="sourceLineNo">4053</span>    // htu.getConfiguration().setLong("dfs.blocksize", DEFAULT_BLOCK_SIZE);<a name="line.4053"></a>
+<span class="sourceLineNo">4054</span>    htu.getConfiguration().setInt("dfs.replication", 2);<a name="line.4054"></a>
+<span class="sourceLineNo">4055</span><a name="line.4055"></a>
+<span class="sourceLineNo">4056</span>    // set up a cluster with 3 nodes<a name="line.4056"></a>
+<span class="sourceLineNo">4057</span>    MiniHBaseCluster cluster = null;<a name="line.4057"></a>
+<span class="sourceLineNo">4058</span>    String dataNodeHosts[] = new String[] { "host1", "host2", "host3" };<a name="line.4058"></a>
+<span class="sourceLineNo">4059</span>    int regionServersCount = 3;<a name="line.4059"></a>
+<span class="sourceLineNo">4060</span><a name="line.4060"></a>
+<span class="sourceLineNo">4061</span>    try {<a name="line.4061"></a>
+<span class="sourceLineNo">4062</span>      StartMiniClusterOption option = StartMiniClusterOption.builder()<a name="line.4062"></a>
+<span class="sourceLineNo">4063</span>          .numRegionServers(regionServersCount).dataNodeHosts(dataNodeHosts).build();<a name="line.4063"></a>
+<span class="sourceLineNo">4064</span>      cluster = htu.startMiniCluster(option);<a name="line.4064"></a>
+<span class="sourceLineNo">4065</span>      byte[][] families = { fam1, fam2 };<a name="line.4065"></a>
+<span class="sourceLineNo">4066</span>      Table ht = htu.createTable(tableName, families);<a name="line.4066"></a>
+<span class="sourceLineNo">4067</span><a name="line.4067"></a>
+<span class="sourceLineNo">4068</span>      // Setting up region<a name="line.4068"></a>
+<span class="sourceLineNo">4069</span>      byte row[] = Bytes.toBytes("row1");<a name="line.4069"></a>
+<span class="sourceLineNo">4070</span>      byte col[] = Bytes.toBytes("col1");<a name="line.4070"></a>
+<span class="sourceLineNo">4071</span><a name="line.4071"></a>
+<span class="sourceLineNo">4072</span>      Put put = new Put(row);<a name="line.4072"></a>
+<span class="sourceLineNo">4073</span>      put.addColumn(fam1, col, 1, Bytes.toBytes("test1"));<a name="line.4073"></a>
+<span class="sourceLineNo">4074</span>      put.addColumn(fam2, col, 1, Bytes.toBytes("test2"));<a name="line.4074"></a>
+<span class="sourceLineNo">4075</span>      ht.put(put);<a name="line.4075"></a>
+<span class="sourceLineNo">4076</span><a name="line.4076"></a>
+<span class="sourceLineNo">4077</span>      HRegion firstRegion = htu.getHBaseCluster().getRegions(tableName).get(0);<a name="line.4077"></a>
+<span class="sourceLineNo">4078</span>      firstRegion.flush(true);<a name="line.4078"></a>
+<span class="sourceLineNo">4079</span>      HDFSBlocksDistribution blocksDistribution1 = firstRegion.getHDFSBlocksDistribution();<a name="line.4079"></a>
+<span class="sourceLineNo">4080</span><a name="line.4080"></a>
+<span class="sourceLineNo">4081</span>      // Given the default replication factor is 2 and we have 2 HFiles,<a name="line.4081"></a>
+<span class="sourceLineNo">4082</span>      // we will have total of 4 replica of blocks on 3 datanodes; thus there<a name="line.4082"></a>
+<span class="sourceLineNo">4083</span>      // must be at least one host that have replica for 2 HFiles. That host's<a name="line.4083"></a>
+<span class="sourceLineNo">4084</span>      // weight will be equal to the unique block weight.<a name="line.4084"></a>
+<span class="sourceLineNo">4085</span>      long uniqueBlocksWeight1 = blocksDistribution1.getUniqueBlocksTotalWeight();<a name="line.4085"></a>
+<span class="sourceLineNo">4086</span>      StringBuilder sb = new StringBuilder();<a name="line.4086"></a>
+<span class="sourceLineNo">4087</span>      for (String host: blocksDistribution1.getTopHosts()) {<a name="line.4087"></a>
+<span class="sourceLineNo">4088</span>        if (sb.length() &gt; 0) sb.append(", ");<a name="line.4088"></a>
+<span class="sourceLineNo">4089</span>        sb.append(host);<a name="line.4089"></a>
+<span class="sourceLineNo">4090</span>        sb.append("=");<a name="line.4090"></a>
+<span class="sourceLineNo">4091</span>        sb.append(blocksDistribution1.getWeight(host));<a name="line.4091"></a>
+<span class="sourceLineNo">4092</span>      }<a name="line.4092"></a>
+<span class="sourceLineNo">4093</span><a name="line.4093"></a>
+<span class="sourceLineNo">4094</span>      String topHost = blocksDistribution1.getTopHosts().get(0);<a name="line.4094"></a>
+<span class="sourceLineNo">4095</span>      long topHostWeight = blocksDistribution1.getWeight(topHost);<a name="line.4095"></a>
+<span class="sourceLineNo">4096</span>      String msg = "uniqueBlocksWeight=" + uniqueBlocksWeight1 + ", topHostWeight=" +<a name="line.4096"></a>
+<span class="sourceLineNo">4097</span>        topHostWeight + ", topHost=" + topHost + "; " + sb.toString();<a name="line.4097"></a>
+<span class="sourceLineNo">4098</span>      LOG.info(msg);<a name="line.4098"></a>
+<span class="sourceLineNo">4099</span>      assertTrue(msg, uniqueBlocksWeight1 == topHostWeight);<a name="line.4099"></a>
+<span class="sourceLineNo">4100</span><a name="line.4100"></a>
+<span class="sourceLineNo">4101</span>      // use the static method to compute the value, it should be the same.<a name="line.4101"></a>
+<span class="sourceLineNo">4102</span>      // static method is used by load balancer or other components<a name="line.4102"></a>
+<span class="sourceLineNo">4103</span>      HDFSBlocksDistribution blocksDistribution2 = HRegion.computeHDFSBlocksDistribution(<a name="line.4103"></a>
+<span class="sourceLineNo">4104</span>          htu.getConfiguration(), firstRegion.getTableDescriptor(), firstRegion.getRegionInfo());<a name="line.4104"></a>
+<span class="sourceLineNo">4105</span>      long uniqueBlocksWeight2 = blocksDistribution2.getUniqueBlocksTotalWeight();<a name="line.4105"></a>
 <span class="sourceLineNo">4106</span><a name="line.4106"></a>
-<span class="sourceLineNo">4107</span>  /**<a name="line.4107"></a>
-<span class="sourceLineNo">4108</span>   * Testcase to check state of region initialization task set to ABORTED or not<a name="line.4108"></a>
-<span class="sourceLineNo">4109</span>   * if any exceptions during initialization<a name="line.4109"></a>
-<span class="sourceLineNo">4110</span>   *<a name="line.4110"></a>
-<span class="sourceLineNo">4111</span>   * @throws Exception<a name="line.4111"></a>
-<span class="sourceLineNo">4112</span>   */<a name="line.4112"></a>
-<span class="sourceLineNo">4113</span>  @Test<a name="line.4113"></a>
-<span class="sourceLineNo">4114</span>  public void testStatusSettingToAbortIfAnyExceptionDuringRegionInitilization() throws Exception {<a name="line.4114"></a>
-<span class="sourceLineNo">4115</span>    HRegionInfo info;<a name="line.4115"></a>
-<span class="sourceLineNo">4116</span>    try {<a name="line.4116"></a>
-<span class="sourceLineNo">4117</span>      FileSystem fs = Mockito.mock(FileSystem.class);<a name="line.4117"></a>
-<span class="sourceLineNo">4118</span>      Mockito.when(fs.exists((Path) Mockito.anyObject())).thenThrow(new IOException());<a name="line.4118"></a>
-<span class="sourceLineNo">4119</span>      HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.4119"></a>
-<span class="sourceLineNo">4120</span>      htd.addFamily(new HColumnDescriptor("cf"));<a name="line.4120"></a>
-<span class="sourceLineNo">4121</span>      info = new HRegionInfo(htd.getTableName(), HConstants.EMPTY_BYTE_ARRAY,<a name="line.4121"></a>
-<span class="sourceLineNo">4122</span>          HConstants.EMPTY_BYTE_ARRAY, false);<a name="line.4122"></a>
-<span class="sourceLineNo">4123</span>      Path path = new Path(dir + "testStatusSettingToAbortIfAnyExceptionDuringRegionInitilization");<a name="line.4123"></a>
-<span class="sourceLineNo">4124</span>      region = HRegion.newHRegion(path, null, fs, CONF, info, htd, null);<a name="line.4124"></a>
-<span class="sourceLineNo">4125</span>      // region initialization throws IOException and set task state to ABORTED.<a name="line.4125"></a>
-<span class="sourceLineNo">4126</span>      region.initialize();<a name="line.4126"></a>
-<span class="sourceLineNo">4127</span>      fail("Region initialization should fail due to IOException");<a name="line.4127"></a>
-<span class="sourceLineNo">4128</span>    } catch (IOException io) {<a name="line.4128"></a>
-<span class="sourceLineNo">4129</span>      List&lt;MonitoredTask&gt; tasks = TaskMonitor.get().getTasks();<a name="line.4129"></a>
-<span class="sourceLineNo">4130</span>      for (MonitoredTask monitoredTask : tasks) {<a name="line.4130"></a>
-<span class="sourceLineNo">4131</span>        if (!(monitoredTask instanceof MonitoredRPCHandler)<a name="line.4131"></a>
-<span class="sourceLineNo">4132</span>            &amp;&amp; monitoredTask.getDescription().contains(region.toString())) {<a name="line.4132"></a>
-<span class="sourceLineNo">4133</span>          assertTrue("Region state should be ABORTED.",<a name="line.4133"></a>
-<span class="sourceLineNo">4134</span>              monitoredTask.getState().equals(MonitoredTask.State.ABORTED));<a name="line.4134"></a>
-<span class="sourceLineNo">4135</span>          break;<a name="line.4135"></a>
-<span class="sourceLineNo">4136</span>        }<a name="line.4136"></a>
-<span class="sourceLineNo">4137</span>      }<a name="line.4137"></a>
-<span class="sourceLineNo">4138</span>    }<a name="line.4138"></a>
-<span class="sourceLineNo">4139</span>  }<a name="line.4139"></a>
-<span class="sourceLineNo">4140</span><a name="line.4140"></a>
-<span class="sourceLineNo">4141</span>  /**<a name="line.4141"></a>
-<span class="sourceLineNo">4142</span>   * Verifies that the .regioninfo file is written on region creation and that<a name="line.4142"></a>
-<span class="sourceLineNo">4143</span>   * is recreated if missing during region opening.<a name="line.4143"></a>
-<span class="sourceLineNo">4144</span>   */<a name="line.4144"></a>
-<span class="sourceLineNo">4145</span>  @Test<a name="line.4145"></a>
-<span class="sourceLineNo">4146</span>  public void testRegionInfoFileCreation() throws IOException {<a name="line.4146"></a>
-<span class="sourceLineNo">4147</span>    Path rootDir = new Path(dir + "testRegionInfoFileCreation");<a name="line.4147"></a>
-<span class="sourceLineNo">4148</span><a name="line.4148"></a>
-<span class="sourceLineNo">4149</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.4149"></a>
-<span class="sourceLineNo">4150</span>    htd.addFamily(new HColumnDescriptor("cf"));<a name="line.4150"></a>
-<span class="sourceLineNo">4151</span><a name="line.4151"></a>
-<span class="sourceLineNo">4152</span>    HRegionInfo hri = new HRegionInfo(htd.getTableName());<a name="line.4152"></a>
-<span class="sourceLineNo">4153</span><a name="line.4153"></a>
-<span class="sourceLineNo">4154</span>    // Create a region and skip the initialization (like CreateTableHandler)<a name="line.4154"></a>
-<span class="sourceLineNo">4155</span>    region = HBaseTestingUtility.createRegionAndWAL(hri, rootDir, CONF, htd, false);<a name="line.4155"></a>
-<span class="sourceLineNo">4156</span>    Path regionDir = region.getRegionFileSystem().getRegionDir();<a name="line.4156"></a>
-<span class="sourceLineNo">4157</span>    FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.4157"></a>
-<span class="sourceLineNo">4158</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.4158"></a>
-<span class="sourceLineNo">4159</span><a name="line.4159"></a>
-<span class="sourceLineNo">4160</span>    Path regionInfoFile = new Path(regionDir, HRegionFileSystem.REGION_INFO_FILE);<a name="line.4160"></a>
+<span class="sourceLineNo">4107</span>      assertTrue(uniqueBlocksWeight1 == uniqueBlocksWeight2);<a name="line.4107"></a>
+<span class="sourceLineNo">4108</span><a name="line.4108"></a>
+<span class="sourceLineNo">4109</span>      ht.close();<a name="line.4109"></a>
+<span class="sourceLineNo">4110</span>    } finally {<a name="line.4110"></a>
+<span class="sourceLineNo">4111</span>      if (cluster != null) {<a name="line.4111"></a>
+<span class="sourceLineNo">4112</span>        htu.shutdownMiniCluster();<a name="line.4112"></a>
+<span class="sourceLineNo">4113</span>      }<a name="line.4113"></a>
+<span class="sourceLineNo">4114</span>    }<a name="line.4114"></a>
+<span class="sourceLineNo">4115</span>  }<a name="line.4115"></a>
+<span class="sourceLineNo">4116</span><a name="line.4116"></a>
+<span class="sourceLineNo">4117</span>  /**<a name="line.4117"></a>
+<span class="sourceLineNo">4118</span>   * Testcase to check state of region initialization task set to ABORTED or not<a name="line.4118"></a>
+<span class="sourceLineNo">4119</span>   * if any exceptions during initialization<a name="line.4119"></a>
+<span class="sourceLineNo">4120</span>   *<a name="line.4120"></a>
+<span class="sourceLineNo">4121</span>   * @throws Exception<a name="line.4121"></a>
+<span class="sourceLineNo">4122</span>   */<a name="line.4122"></a>
+<span class="sourceLineNo">4123</span>  @Test<a name="line.4123"></a>
+<span class="sourceLineNo">4124</span>  public void testStatusSettingToAbortIfAnyExceptionDuringRegionInitilization() throws Exception {<a name="line.4124"></a>
+<span class="sourceLineNo">4125</span>    HRegionInfo info;<a name="line.4125"></a>
+<span class="sourceLineNo">4126</span>    try {<a name="line.4126"></a>
+<span class="sourceLineNo">4127</span>      FileSystem fs = Mockito.mock(FileSystem.class);<a name="line.4127"></a>
+<span class="sourceLineNo">4128</span>      Mockito.when(fs.exists((Path) Mockito.anyObject())).thenThrow(new IOException());<a name="line.4128"></a>
+<span class="sourceLineNo">4129</span>      HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.4129"></a>
+<span class="sourceLineNo">4130</span>      htd.addFamily(new HColumnDescriptor("cf"));<a name="line.4130"></a>
+<span class="sourceLineNo">4131</span>      info = new HRegionInfo(htd.getTableName(), HConstants.EMPTY_BYTE_ARRAY,<a name="line.4131"></a>
+<span class="sourceLineNo">4132</span>          HConstants.EMPTY_BYTE_ARRAY, false);<a name="line.4132"></a>
+<span class="sourceLineNo">4133</span>      Path path = new Path(dir + "testStatusSettingToAbortIfAnyExceptionDuringRegionInitilization");<a name="line.4133"></a>
+<span class="sourceLineNo">4134</span>      region = HRegion.newHRegion(path, null, fs, CONF, info, htd, null);<a name="line.4134"></a>
+<span class="sourceLineNo">4135</span>      // region initialization throws IOException and set task state to ABORTED.<a name="line.4135"></a>
+<span class="sourceLineNo">4136</span>      region.initialize();<a name="line.4136"></a>
+<span class="sourceLineNo">4137</span>      fail("Region initialization should fail due to IOException");<a name="line.4137"></a>
+<span class="sourceLineNo">4138</span>    } catch (IOException io) {<a name="line.4138"></a>
+<span class="sourceLineNo">4139</span>      List&lt;MonitoredTask&gt; tasks = TaskMonitor.get().getTasks();<a name="line.4139"></a>
+<span class="sourceLineNo">4140</span>      for (MonitoredTask monitoredTask : tasks) {<a name="line.4140"></a>
+<span class="sourceLineNo">4141</span>        if (!(monitoredTask instanceof MonitoredRPCHandler)<a name="line.4141"></a>
+<span class="sourceLineNo">4142</span>            &amp;&amp; monitoredTask.getDescription().contains(region.toString())) {<a name="line.4142"></a>
+<span class="sourceLineNo">4143</span>          assertTrue("Region state should be ABORTED.",<a name="line.4143"></a>
+<span class="sourceLineNo">4144</span>              monitoredTask.getState().equals(MonitoredTask.State.ABORTED));<a name="line.4144"></a>
+<span class="sourceLineNo">4145</span>          break;<a name="line.4145"></a>
+<span class="sourceLineNo">4146</span>        }<a name="line.4146"></a>
+<span class="sourceLineNo">4147</span>      }<a name="line.4147"></a>
+<span class="sourceLineNo">4148</span>    }<a name="line.4148"></a>
+<span class="sourceLineNo">4149</span>  }<a name="line.4149"></a>
+<span class="sourceLineNo">4150</span><a name="line.4150"></a>
+<span class="sourceLineNo">4151</span>  /**<a name="line.4151"></a>
+<span class="sourceLineNo">4152</span>   * Verifies that the .regioninfo file is written on region creation and that<a name="line.4152"></a>
+<span class="sourceLineNo">4153</span>   * is recreated if missing during region opening.<a name="line.4153"></a>
+<span class="sourceLineNo">4154</span>   */<a name="line.4154"></a>
+<span class="sourceLineNo">4155</span>  @Test<a name="line.4155"></a>
+<span class="sourceLineNo">4156</span>  public void testRegionInfoFileCreation() throws IOException {<a name="line.4156"></a>
+<span class="sourceLineNo">4157</span>    Path rootDir = new Path(dir + "testRegionInfoFileCreation");<a name="line.4157"></a>
+<span class="sourceLineNo">4158</span><a name="line.4158"></a>
+<span class="sourceLineNo">4159</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.4159"></a>
+<span class="sourceLineNo">4160</span>    htd.addFamily(new HColumnDescriptor("cf"));<a name="line.4160"></a>
 <span class="sourceLineNo">4161</span><a name="line.4161"></a>
-<span class="sourceLineNo">4162</span>    // Verify that the .regioninfo file is present<a name="line.4162"></a>
-<span class="sourceLineNo">4163</span>    assertTrue(HRegionFileSystem.REGION_INFO_FILE + " should be present in the region dir",<a name="line.4163"></a>
-<span class="sourceLineNo">4164</span>        fs.exists(regionInfoFile));<a name="line.4164"></a>
-<span class="sourceLineNo">4165</span><a name="line.4165"></a>
-<span class="sourceLineNo">4166</span>    // Try to open the region<a name="line.4166"></a>
-<span class="sourceLineNo">4167</span>    region = HRegion.openHRegion(rootDir, hri, htd, null, CONF);<a name="line.4167"></a>
-<span class="sourceLineNo">4168</span>    assertEquals(regionDir, region.getRegionFileSystem().getRegionDir());<a name="line.4168"></a>
-<span class="sourceLineNo">4169</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.4169"></a>
-<span class="sourceLineNo">4170</span><a name="line.4170"></a>
-<span class="sourceLineNo">4171</span>    // Verify that the .regioninfo file is still there<a name="line.4171"></a>
-<span class="sourceLineNo">4172</span>    assertTrue(HRegionFileSystem.REGION_INFO_FILE + " should be present in the region dir",<a name="line.4172"></a>
-<span class="sourceLineNo">4173</span>        fs.exists(regionInfoFile));<a name="line.4173"></a>
-<span class="sourceLineNo">4174</span><a name="line.4174"></a>
-<span class="sourceLineNo">4175</span>    // Remove the .regioninfo file and verify is recreated on region open<a name="line.4175"></a>
-<span class="sourceLineNo">4176</span>    fs.delete(regionInfoFile, true);<a name="line.4176"></a>
-<span class="sourceLineNo">4177</span>    assertFalse(HRegionFileSystem.REGION_INFO_FILE + " should be removed from the region dir",<a name="line.4177"></a>
-<span class="sourceLineNo">4178</span>        fs.exists(regionInfoFile));<a name="line.4178"></a>
-<span class="sourceLineNo">4179</span><a name="line.4179"></a>
-<span class="sourceLineNo">4180</span>    region = HRegion.openHRegion(rootDir, hri, htd, null, CONF);<a name="line.4180"></a>
-<span class="sourceLineNo">4181</span>//    region = TEST_UTIL.openHRegion(hri, htd);<a name="line.4181"></a>
-<span class="sourceLineNo">4182</span>    assertEquals(regionDir, region.getRegionFileSystem().getRegionDir());<a name="line.4182"></a>
-<span class="sourceLineNo">4183</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.4183"></a>
+<span class="sourceLineNo">4162</span>    HRegionInfo hri = new HRegionInfo(htd.getTableName());<a name="line.4162"></a>
+<span class="sourceLineNo">4163</span><a name="line.4163"></a>
+<span class="sourceLineNo">4164</span>    // Create a region and skip the initialization (like CreateTableHandler)<a name="line.4164"></a>
+<span class="sourceLineNo">4165</span>    region = HBaseTestingUtility.createRegionAndWAL(hri, rootDir, CONF, htd, false);<a name="line.4165"></a>
+<span class="sourceLineNo">4166</span>    Path regionDir = region.getRegionFileSystem().getRegionDir();<a name="line.4166"></a>
+<span class="sourceLineNo">4167</span>    FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.4167"></a>
+<span class="sourceLineNo">4168</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.4168"></a>
+<span class="sourceLineNo">4169</span><a name="line.4169"></a>
+<span class="sourceLineNo">4170</span>    Path regionInfoFile = new Path(regionDir, HRegionFileSystem.REGION_INFO_FILE);<a name="line.4170"></a>
+<span class="sourceLineNo">4171</span><a name="line.4171"></a>
+<span class="sourceLineNo">4172</span>    // Verify that the .regioninfo file is present<a name="line.4172"></a>
+<span class="sourceLineNo">4173</span>    assertTrue(HRegionFileSystem.REGION_INFO_FILE + " should be present in the region dir",<a name="line.4173"></a>
+<span class="sourceLineNo">4174</span>        fs.exists(regionInfoFile));<a name="line.4174"></a>
+<span class="sourceLineNo">4175</span><a name="line.4175"></a>
+<span class="sourceLineNo">4176</span>    // Try to open the region<a name="line.4176"></a>
+<span class="sourceLineNo">4177</span>    region = HRegion.openHRegion(rootDir, hri, htd, null, CONF);<a name="line.4177"></a>
+<span class="sourceLineNo">4178</span>    assertEquals(regionDir, region.getRegionFileSystem().getRegionDir());<a name="line.4178"></a>
+<span class="sourceLineNo">4179</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.4179"></a>
+<span class="sourceLineNo">4180</span><a name="line.4180"></a>
+<span class="sourceLineNo">4181</span>    // Verify that the .regioninfo file is still there<a name="line.4181"></a>
+<span class="sourceLineNo">4182</span>    assertTrue(HRegionFileSystem.REGION_INFO_FILE + " should be present in the region dir",<a name="line.4182"></a>
+<span class="sourceLineNo">4183</span>        fs.exists(regionInfoFile));<a name="line.4183"></a>
 <span class="sourceLineNo">4184</span><a name="line.4184"></a>
-<span class="sourceLineNo">4185</span>    // Verify that the .regioninfo file is still there<a name="line.4185"></a>
-<span class="sourceLineNo">4186</span>    assertTrue(HRegionFileSystem.REGION_INFO_FILE + " should be present in the region dir",<a name="line.4186"></a>
-<span class="sourceLineNo">4187</span>        fs.exists(new Path(regionDir, HRegionFileSystem.REGION_INFO_FILE)));<a name="line.4187"></a>
-<span class="sourceLineNo">4188</span><a name="line.4188"></a>
-<span class="sourceLineNo">4189</span>    region = null;<a name="line.4189"></a>
-<span class="sourceLineNo">4190</span>  }<a name="line.4190"></a>
-<span class="sourceLineNo">4191</span><a name="line.4191"></a>
-<span class="sourceLineNo">4192</span>  /**<a name="line.4192"></a>
-<span class="sourceLineNo">4193</span>   * TestCase for increment<a name="line.4193"></a>
-<span class="sourceLineNo">4194</span>   */<a name="line.4194"></a>
-<span class="sourceLineNo">4195</span>  private static class Incrementer implements Runnable {<a name="line.4195"></a>
-<span class="sourceLineNo">4196</span>    private HRegion region;<a name="line.4196"></a>
-<span class="sourceLineNo">4197</span>    private final static byte[] incRow = Bytes.toBytes("incRow");<a name="line.4197"></a>
-<span class="sourceLineNo">4198</span>    private final static byte[] family = Bytes.toBytes("family");<a name="line.4198"></a>
-<span class="sourceLineNo">4199</span>    private final static byte[] qualifier = Bytes.toBytes("qualifier");<a name="line.4199"></a>
-<span class="sourceLineNo">4200</span>    private final static long ONE = 1L;<a name="line.4200"></a>
-<span class="sourceLineNo">4201</span>    private int incCounter;<a name="line.4201"></a>
-<span class="sourceLineNo">4202</span><a name="line.4202"></a>
-<span class="sourceLineNo">4203</span>    public Incrementer(HRegion region, int incCounter) {<a name="line.4203"></a>
-<span class="sourceLineNo">4204</span>      this.region = region;<a name="line.4204"></a>
-<span class="sourceLineNo">4205</span>      this.incCounter = incCounter;<a name="line.4205"></a>
-<span class="sourceLineNo">4206</span>    }<a name="line.4206"></a>
-<span class="sourceLineNo">4207</span><a name="line.4207"></a>
-<span class="sourceLineNo">4208</span>    @Override<a name="line.4208"></a>
-<span class="sourceLineNo">4209</span>    public void run() {<a name="line.4209"></a>
-<span class="sourceLineNo">4210</span>      int count = 0;<a name="line.4210"></a>
-<span class="sourceLineNo">4211</span>      while (count &lt; incCounter) {<a name="line.4211"></a>
-<span class="sourceLineNo">4212</span>        Increment inc = new Increment(incRow);<a name="line.4212"></a>
-<span class="sourceLineNo">4213</span>        inc.addColumn(family, qualifier, ONE);<a name="line.4213"></a>
-<span class="sourceLineNo">4214</span>        count++;<a name="line.4214"></a>
-<span class="sourceLineNo">4215</span>        try {<a name="line.4215"></a>
-<span class="sourceLineNo">4216</span>          region.increment(inc);<a name="line.4216"></a>
-<span class="sourceLineNo">4217</span>        } catch (IOException e) {<a name="line.4217"></a>
-<span class="sourceLineNo">4218</span>          LOG.info("Count=" + count + ", " + e);<a name="line.4218"></a>
-<span class="sourceLineNo">4219</span>          break;<a name="line.4219"></a>
-<span class="sourceLineNo">4220</span>        }<a name="line.4220"></a>
-<span class="sourceLineNo">4221</span>      }<a name="line.4221"></a>
-<span class="sourceLineNo">4222</span>    }<a name="line.4222"></a>
-<span class="sourceLineNo">4223</span>  }<a name="line.4223"></a>
-<span class="sourceLineNo">4224</span><a name="line.4224"></a>
-<span class="sourceLineNo">4225</span>  /**<a name="line.4225"></a>
-<span class="sourceLineNo">4226</span>   * Test case to check increment function with memstore flushing<a name="line.4226"></a>
-<span class="sourceLineNo">4227</span>   * @throws Exception<a name="line.4227"></a>
-<span class="sourceLineNo">4228</span>   */<a name="line.4228"></a>
-<span class="sourceLineNo">4229</span>  @Test<a name="line.4229"></a>
-<span class="sourceLineNo">4230</span>  public void testParallelIncrementWithMemStoreFlush() throws Exception {<a name="line.4230"></a>
-<span class="sourceLineNo">4231</span>    byte[] family = Incrementer.family;<a name="line.4231"></a>
-<span class="sourceLineNo">4232</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.4232"></a>
-<span class="sourceLineNo">4233</span>    final HRegion region = this.region;<a name="line.4233"></a>
-<span class="sourceLineNo">4234</span>    final AtomicBoolean incrementDone = new AtomicBoolean(false);<a name="line.4234"></a>
-<span class="sourceLineNo">4235</span>    Runnable flusher = new Runnable() {<a name="line.4235"></a>
-<span class="sourceLineNo">4236</span>      @Override<a name="line.4236"></a>
-<span class="sourceLineNo">4237</span>      public void run() {<a name="line.4237"></a>
-<span class="sourceLineNo">4238</span>        while (!incrementDone.get()) {<a name="line.4238"></a>
-<span class="sourceLineNo">4239</span>          try {<a name="line.4239"></a>
-<span class="sourceLineNo">4240</span>            region.flush(true);<a name="line.4240"></a>
-<span class="sourceLineNo">4241</span>          } catch (Exception e) {<a name="line.4241"></a>
-<span class="sourceLineNo">4242</span>            e.printStackTrace();<a name="line.4242"></a>
-<span class="sourceLineNo">4243</span>          }<a name="line.4243"></a>
-<span class="sourceLineNo">4244</span>        }<a name="line.4244"></a>
-<span class="sourceLineNo">4245</span>      }<a name="line.4245"></a>
-<span class="sourceLineNo">4246</span>    };<a name="line.4246"></a>
-<span class="sourceLineNo">4247</span><a name="line.4247"></a>
-<span class="sourceLineNo">4248</span>    // after all increment finished, the row will increment to 20*100 = 2000<a name="line.4248"></a>
-<span class="sourceLineNo">4249</span>    int threadNum = 20;<a name="line.4249"></a>
-<span class="sourceLineNo">4250</span>    int incCounter = 100;<a name="line.4250"></a>
-<span class="sourceLineNo">4251</span>    long expected = (long) threadNum * incCounter;<a name="line.4251"></a>
-<span class="sourceLineNo">4252</span>    Thread[] incrementers = new Thread[threadNum];<a name="line.4252"></a>
-<span class="sourceLineNo">4253</span>    Thread flushThread = new Thread(flusher);<a name="line.4253"></a>
-<span class="sourceLineNo">4254</span>    for (int i = 0; i &lt; threadNum; i++) {<a name="line.4254"></a>
-<span class="sourceLineNo">4255</span>      incrementers[i] = new Thread(new Incrementer(this.region, incCounter));<a name="line.4255"></a>
-<span class="sourceLineNo">4256</span>      incrementers[i].start();<a name="line.4256"></a>
-<span class="sourceLineNo">4257</span>    }<a name="line.4257"></a>
-<span class="sourceLineNo">4258</span>    flushThread.start();<a name="line.4258"></a>
-<span class="sourceLineNo">4259</span>    for (int i = 0; i &lt; threadNum; i++) {<a name="line.4259"></a>
-<span class="sourceLineNo">4260</span>      incrementers[i].join();<a name="line.4260"></a>
-<span class="sourceLineNo">4261</span>    }<a name="line.4261"></a>
-<span class="sourceLineNo">4262</span><a name="line.4262"></a>
-<span class="sourceLineNo">4263</span>    incrementDone.set(true);<a name="line.4263"></a>
-<span class="sourceLineNo">4264</span>    flushThread.join();<a name="line.4264"></a>
-<span class="sourceLineNo">4265</span><a name="line.4265"></a>
-<span class="sourceLineNo">4266</span>    Get get = new Get(Incrementer.incRow);<a name="line.4266"></a>
-<span class="sourceLineNo">4267</span>    get.addColumn(Incrementer.family, Incrementer.qualifier);<a name="line.4267"></a>
-<span class="sourceLineNo">4268</span>    get.readVersions(1);<a name="line.4268"></a>
-<span class="sourceLineNo">4269</span>    Result res = this.region.get(get);<a name="line.4269"></a>
-<span class="sourceLineNo">4270</span>    List&lt;Cell&gt; kvs = res.getColumnCells(Incrementer.family, Incrementer.qualifier);<a name="line.4270"></a>
-<span class="sourceLineNo">4271</span><a name="line.4271"></a>
-<span class="sourceLineNo">4272</span>    // we just got the latest version<a name="line.4272"></a>
-<span class="sourceLineNo">4273</span>    assertEquals(1, kvs.size());<a name="line.4273"></a>
-<span class="sourceLineNo">4274</span>    Cell kv = kvs.get(0);<a name="line.4274"></a>
-<span class="sourceLineNo">4275</span>    assertEquals(expected, Bytes.toLong(kv.getValueArray(), kv.getValueOffset()));<a name="line.4275"></a>
-<span class="sourceLineNo">4276</span>  }<a name="line.4276"></a>
-<span class="sourceLineNo">4277</span><a name="line.4277"></a>
-<span class="sourceLineNo">4278</span>  /**<a name="line.4278"></a>
-<span class="sourceLineNo">4279</span>   * TestCase for append<a name="line.4279"></a>
-<span class="sourceLineNo">4280</span>   */<a name="line.4280"></a>
-<span class="sourceLineNo">4281</span>  private static class Appender implements Runnable {<a name="line.4281"></a>
-<span class="sourceLineNo">4282</span>    private HRegion region;<a name="line.4282"></a>
-<span class="sourceLineNo">4283</span>    private final static byte[] appendRow = Bytes.toBytes("appendRow");<a name="line.4283"></a>
-<span class="sourceLineNo">4284</span>    private final static byte[] family = Bytes.toBytes("family");<a name="line.4284"></a>
-<span class="sourceLineNo">4285</span>    private final static byte[] qualifier = Bytes.toBytes("qualifier");<a name="line.4285"></a>
-<span class="sourceLineNo">4286</span>    private final static byte[] CHAR = Bytes.toBytes("a");<a name="line.4286"></a>
-<span class="sourceLineNo">4287</span>    private int appendCounter;<a name="line.4287"></a>
-<span class="sourceLineNo">4288</span><a name="line.4288"></a>
-<span class="sourceLineNo">4289</span>    public Appender(HRegion region, int appendCounter) {<a name="line.4289"></a>
-<span class="sourceLineNo">4290</span>      this.region = region;<a name="line.4290"></a>
-<span class="sourceLineNo">4291</span>      this.appendCounter = appendCounter;<a name="line.4291"></a>
-<span class="sourceLineNo">4292</span>    }<a name="line.4292"></a>
-<span class="sourceLineNo">4293</span><a name="line.4293"></a>
-<span class="sourceLineNo">4294</span>    @Override<a name="line.4294"></a>
-<span class="sourceLineNo">4295</span>    public void run() {<a name="line.4295"></a>
-<span class="sourceLineNo">4296</span>      int count = 0;<a name="line.4296"></a>
-<span class="sourceLineNo">4297</span>      while (count &lt; appendCounter) {<a name="line.4297"></a>
-<span class="sourceLineNo">4298</span>        Append app = new Append(appendRow);<a name="line.4298"></a>
-<span class="sourceLineNo">4299</span>        app.addColumn(family, qualifier, CHAR);<a name="line.4299"></a>
-<span class="sourceLineNo">4300</span>        count++;<a name="line.4300"></a>
-<span class="sourceLineNo">4301</span>        try {<a name="line.4301"></a>
-<span class="sourceLineNo">4302</span>          region.append(app);<a name="line.4302"></a>
-<span class="sourceLineNo">4303</span>        } catch (IOException e) {<a name="line.4303"></a>
-<span class="sourceLineNo">4304</span>          LOG.info("Count=" + count + ", max=" + appendCounter + ", " + e);<a name="line.4304"></a>
-<span class="sourceLineNo">4305</span>          break;<a name="line.4305"></a>
-<span class="sourceLineNo">4306</span>        }<a name="line.4306"></a>
-<span class="sourceLineNo">4307</span>      }<a name="line.4307"></a>
-<span class="sourceLineNo">4308</span>    }<a name="line.4308"></a>
-<span class="sourceLineNo">4309</span>  }<a name="line.4309"></a>
-<span class="sourceLineNo">4310</span><a name="line.4310"></a>
-<span class="sourceLineNo">4311</span>  /**<a name="line.4311"></a>
-<span class="sourceLineNo">4312</span>   * Test case to check append function with memstore flushing<a name="line.4312"></a>
-<span class="sourceLineNo">4313</span>   * @throws Exception<a name="line.4313"></a>
-<span class="sourceLineNo">4314</span>   */<a name="line.4314"></a>
-<span class="sourceLineNo">4315</span>  @Test<a name="line.4315"></a>
-<span class="sourceLineNo">4316</span>  public void testParallelAppendWithMemStoreFlush() throws Exception {<a name="line.4316"></a>
-<span class="sourceLineNo">4317</span>    byte[] family = Appender.family;<a name="line.4317"></a>
-<span class="sourceLineNo">4318</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.4318"></a>
-<span class="sourceLineNo">4319</span>    final HRegion region = this.region;<a name="line.4319"></a>
-<span class="sourceLineNo">4320</span>    final AtomicBoolean appendDone = new AtomicBoolean(false);<a name="line.4320"></a>
-<span class="sourceLineNo">4321</span>    Runnable flusher = new Runnable() {<a name="line.4321"></a>
-<span class="sourceLineNo">4322</span>      @Override<a name="line.4322"></a>
-<span class="sourceLineNo">4323</span>      public void run() {<a name="line.4323"></a>
-<span class="sourceLineNo">4324</span>        while (!appendDone.get()) {<a name="line.4324"></a>
-<span class="sourceLineNo">4325</span>          try {<a name="line.4325"></a>
-<span class="sourceLineNo">4326</span>            region.flush(true);<a name="line.4326"></a>
-<span class="sourceLineNo">4327</span>          } catch (Exception e) {<a name="line.4327"></a>
-<span class="sourceLineNo">4328</span>            e.printStackTrace();<a name="line.4328"></a>
-<span class="sourceLineNo">4329</span>          }<a name="line.4329"></a>
-<span class="sourceLineNo">4330</span>        }<a name="line.4330"></a>
-<span class="sourceLineNo">4331</span>      }<a name="line.4331"></a>
-<span class="sourceLineNo">4332</span>    };<a name="line.4332"></a>
-<span class="sourceLineNo">4333</span><a name="line.4333"></a>
-<span class="sourceLineNo">4334</span>    // After all append finished, the value will append to threadNum *<a name="line.4334"></a>
-<span class="sourceLineNo">4335</span>    // appendCounter Appender.CHAR<a name="line.4335"></a>
-<span class="sourceLineNo">4336</span>    int threadNum = 20;<a name="line.4336"></a>
-<span class="sourceLineNo">4337</span>    int appendCounter = 100;<a name="line.4337"></a>
-<span class="sourceLineNo">4338</span>    byte[] expected = new byte[threadNum * appendCounter];<a name="line.4338"></a>
-<span class="sourceLineNo">4339</span>    for (int i = 0; i &lt; threadNum * appendCounter; i++) {<a name="line.4339"></a>
-<span class="sourceLineNo">4340</span>      System.arraycopy(Appender.CHAR, 0, expected, i, 1);<a name="line.4340"></a>
-<span class="sourceLineNo">4341</span>    }<a name="line.4341"></a>
-<span class="sourceLineNo">4342</span>    Thread[] appenders = new Thread[threadNum];<a name="line.4342"></a>
-<span class="sourceLineNo">4343</span>    Thread flushThread = new Thread(flusher);<a name="line.4343"></a>
-<span class="sourceLineNo">4344</span>    for (int i = 0; i &lt; threadNum; i++) {<a name="line.4344"></a>
-<span class="sourceLineNo">4345</span>      appenders[i] = new Thread(new Appender(this.region, appendCounter));<a name="line.4345"></a>
-<span class="sourceLineNo">4346</span>      appenders[i].start();<a name="line.4346"></a>
-<span class="sourceLineNo">4347</span>    }<a name="line.4347"></a>
-<span class="sourceLineNo">4348</span>    flushThread.start();<a name="line.4348"></a>
-<span class="sourceLineNo">4349</span>    for (int i = 0; i &lt; threadNum; i++) {<a name="line.4349"></a>
-<span class="sourceLineNo">4350</span>      appenders[i].join();<a name="line.4350"></a>
+<span class="sourceLineNo">4185</span>    // Remove the .regioninfo file and verify is recreated on region open<a name="line.4185"></a>
+<span class="sourceLineNo">4186</span>    fs.delete(regionInfoFile, true);<a name="line.4186"></a>
+<span class="sourceLineNo">4187</span>    assertFalse(HRegionFileSystem.REGION_INFO_FILE + " should be removed from the region dir",<a name="line.4187"></a>
+<span class="sourceLineNo">4188</span>        fs.exists(regionInfoFile));<a name="line.4188"></a>
+<span class="sourceLineNo">4189</span><a name="line.4189"></a>
+<span class="sourceLineNo">4190</span>    region = HRegion.openHRegion(rootDir, hri, htd, null, CONF);<a name="line.4190"></a>
+<span class="sourceLineNo">4191</span>//    region = TEST_UTIL.openHRegion(hri, htd);<a name="line.4191"></a>
+<span class="sourceLineNo">4192</span>    assertEquals(regionDir, region.getRegionFileSystem().getRegionDir());<a name="line.4192"></a>
+<span class="sourceLineNo">4193</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.4193"></a>
+<span class="sourceLineNo">4194</span><a name="line.4194"></a>
+<span class="sourceLineNo">4195</span>    // Verify that the .regioninfo file is still there<a name="line.4195"></a>
+<span class="sourceLineNo">4196</span>    assertTrue(HRegionFileSystem.REGION_INFO_FILE + " should be present in the region dir",<a name="line.4196"></a>
+<span class="sourceLineNo">4197</span>        fs.exists(new Path(regionDir, HRegionFileSystem.REGION_INFO_FILE)));<a name="line.4197"></a>
+<span class="sourceLineNo">4198</span><a name="line.4198"></a>
+<span class="sourceLineNo">4199</span>    region = null;<a name="line.4199"></a>
+<span class="sourceLineNo">4200</span>  }<a name="line.4200"></a>
+<span class="sourceLineNo">4201</span><a name="line.4201"></a>
+<span class="sourceLineNo">4202</span>  /**<a name="line.4202"></a>
+<span class="sourceLineNo">4203</span>   * TestCase for increment<a name="line.4203"></a>
+<span class="sourceLineNo">4204</span>   */<a name="line.4204"></a>
+<span class="sourceLineNo">4205</span>  private static class Incrementer implements Runnable {<a name="line.4205"></a>
+<span class="sourceLineNo">4206</span>    private HRegion region;<a name="line.4206"></a>
+<span class="sourceLineNo">4207</span>    private final static byte[] incRow = Bytes.toBytes("incRow");<a name="line.4207"></a>
+<span class="sourceLineNo">4208</span>    private final static byte[] family = Bytes.toBytes("family");<a name="line.4208"></a>
+<span class="sourceLineNo">4209</span>    private final static byte[] qualifier = Bytes.toBytes("qualifier");<a name="line.4209"></a>
+<span class="sourceLineNo">4210</span>    private final static long ONE = 1L;<a name="line.4210"></a>
+<span class="sourceLineNo">4211</span>    private int incCounter;<a name="line.4211"></a>
+<span class="sourceLineNo">4212</span><a name="line.4212"></a>
+<span class="sourceLineNo">4213</span>    public Incrementer(HRegion region, int incCounter) {<a name="line.4213"></a>
+<span class="sourceLineNo">4214</span>      this.region = region;<a name="line.4214"></a>
+<span class="sourceLineNo">4215</span>      this.incCounter = incCounter;<a name="line.4215"></a>
+<span class="sourceLineNo">4216</span>    }<a name="line.4216"></a>
+<span class="sourceLineNo">4217</span><a name="line.4217"></a>
+<span class="sourceLineNo">4218</span>    @Override<a name="line.4218"></a>
+<span class="sourceLineNo">4219</span>    public void run() {<a name="line.4219"></a>
+<span class="sourceLineNo">4220</span>      int count = 0;<a name="line.4220"></a>
+<span class="sourceLineNo">4221</span>      while (count &lt; incCounter) {<a name="line.4221"></a>
+<span class="sourceLineNo">4222</span>        Increment inc = new Increment(incRow);<a name="line.4222"></a>
+<span class="sourceLineNo">4223</span>        inc.addColumn(family, qualifier, ONE);<a name="line.4223"></a>
+<span class="sourceLineNo">4224</span>        count++;<a name="line.4224"></a>
+<span class="sourceLineNo">4225</span>        try {<a name="line.4225"></a>
+<span class="sourceLineNo">4226</span>          region.increment(inc);<a name="line.4226"></a>
+<span class="sourceLineNo">4227</span>        } catch (IOException e) {<a name="line.4227"></a>
+<span class="sourceLineNo">4228</span>          LOG.info("Count=" + count + ", " + e);<a name="line.4228"></a>
+<span class="sourceLineNo">4229</span>          break;<a name="line.4229"></a>
+<span class="sourceLineNo">4230</span>        }<a name="line.4230"></a>
+<span class="sourceLineNo">4231</span>      }<a name="line.4231"></a>
+<span class="sourceLineNo">4232</span>    }<a name="line.4232"></a>
+<span class="sourceLineNo">4233</span>  }<a name="line.4233"></a>
+<span class="sourceLineNo">4234</span><a name="line.4234"></a>
+<span class="sourceLineNo">4235</span>  /**<a name="line.4235"></a>
+<span class="sourceLineNo">4236</span>   * Test case to check increment function with memstore flushing<a name="line.4236"></a>
+<span class="sourceLineNo">4237</span>   * @throws Exception<a name="line.4237"></a>
+<span class="sourceLineNo">4238</span>   */<a name="line.4238"></a>
+<span class="sourceLineNo">4239</span>  @Test<a name="line.4239"></a>
+<span class="sourceLineNo">4240</span>  public void testParallelIncrementWithMemStoreFlush() throws Exception {<a name="line.4240"></a>
+<span class="sourceLineNo">4241</span>    byte[] family = Incrementer.family;<a name="line.4241"></a>
+<span class="sourceLineNo">4242</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.4242"></a>
+<span class="sourceLineNo">4243</span>    final HRegion region = this.region;<a name="line.4243"></a>
+<span class="sourceLineNo">4244</span>    final AtomicBoolean incrementDone = new AtomicBoolean(false);<a name="line.4244"></a>
+<span class="sourceLineNo">4245</span>    Runnable flusher = new Runnable() {<a name="line.4245"></a>
+<span class="sourceLineNo">4246</span>      @Override<a name="line.4246"></a>
+<span class="sourceLineNo">4247</span>      public void run() {<a name="line.4247"></a>
+<span class="sourceLineNo">4248</span>        while (!incrementDone.get()) {<a name="line.4248"></a>
+<span class="sourceLineNo">4249</span>          try {<a name="line.4249"></a>
+<span class="sourceLineNo">4250</span>            region.flush(true);<a name="line.4250"></a>
+<span class="sourceLineNo">4251</span>          } catch (Exception e) {<a name="line.4251"></a>
+<span class="sourceLineNo">4252</span>            e.printStackTrace();<a name="line.4252"></a>
+<span class="sourceLineNo">4253</span>          }<a name="line.4253"></a>
+<span class="sourceLineNo">4254</span>        }<a name="line.4254"></a>
+<span class="sourceLineNo">4255</span>      }<a name="line.4255"></a>
+<span class="sourceLineNo">4256</span>    };<a name="line.4256"></a>
+<span class="sourceLineNo">4257</span><a name="line.4257"></a>
+<span class="sourceLineNo">4258</span>    // after all increment finished, the row will increment to 20*100 = 2000<a name="line.4258"></a>
+<span class="sourceLineNo">4259</span>    int threadNum = 20;<a name="line.4259"></a>
+<span class="sourceLineNo">4260</span>    int incCounter = 100;<a name="line.4260"></a>
+<span class="sourceLineNo">4261</span>    long expected = (long) threadNum * incCounter;<a name="line.4261"></a>
+<span class="sourceLineNo">4262</span>    Thread[] incrementers = new Thread[threadNum];<a name="line.4262"></a>
+<span class="sourceLineNo">4263</span>    Thread flushThread = new Thread(flusher);<a name="line.4263"></a>
+<span class="sourceLineNo">4264</span>    for (int i = 0; i &lt; threadNum; i++) {<a name="line.4264"></a>
+<span class="sourceLineNo">4265</span>      incrementers[i] = new Thread(new Incrementer(this.region, incCounter));<a name="line.4265"></a>
+<span class="sourceLineNo">4266</span>      incrementers[i].start();<a name="line.4266"></a>
+<span class="sourceLineNo">4267</span>    }<a name="line.4267"></a>
+<span class="sourceLineNo">4268</span>    flushThread.start();<a name="line.4268"></a>
+<span class="sourceLineNo">4269</span>    for (int i = 0; i &lt; threadNum; i++) {<a name="line.4269"></a>
+<span class="sourceLineNo">4270</span>      incrementers[i].join();<a name="line.4270"></a>
+<span class="sourceLineNo">4271</span>    }<a name="line.4271"></a>
+<span class="sourceLineNo">4272</span><a name="line.4272"></a>
+<span class="sourceLineNo">4273</span>    incrementDone.set(true);<a name="line.4273"></a>
+<span class="sourceLineNo">4274</span>    flushThread.join();<a name="line.4274"></a>
+<span class="sourceLineNo">4275</span><a name="line.4275"></a>
+<span class="sourceLineNo">4276</span>    Get get = new Get(Incrementer.incRow);<a name="line.4276"></a>
+<span class="sourceLineNo">4277</span>    get.addColumn(Incrementer.family, Incrementer.qualifier);<a name="line.4277"></a>
+<span class="sourceLineNo">4278</span>    get.readVersions(1);<a name="line.4278"></a>
+<span class="sourceLineNo">4279</span>    Result res = this.region.get(get);<a name="line.4279"></a>
+<span class="sourceLineNo">4280</span>    List&lt;Cell&gt; kvs = res.getColumnCells(Incrementer.family, Incrementer.qualifier);<a name="line.4280"></a>
+<span class="sourceLineNo">4281</span><a name="line.4281"></a>
+<span class="sourceLineNo">4282</span>    // we just got the latest version<a name="line.4282"></a>
+<span class="sourceLineNo">4283</span>    assertEquals(1, kvs.size());<a name="line.4283"></a>
+<span class="sourceLineNo">4284</span>    Cell kv = kvs.get(0);<a name="line.4284"></a>
+<span class="sourceLineNo">4285</span>    assertEquals(expected, Bytes.toLong(kv.getValueArray(), kv.getValueOffset()));<a name="line.4285"></a>
+<span class="sourceLineNo">4286</span>  }<a name="line.4286"></a>
+<span class="sourceLineNo">4287</span><a name="line.4287"></a>
+<span class="sourceLineNo">4288</span>  /**<a name="line.4288"></a>
+<span class="sourceLineNo">4289</span>   * TestCase for append<a name="line.4289"></a>
+<span class="sourceLineNo">4290</span>   */<a name="line.4290"></a>
+<span class="sourceLineNo">4291</span>  private static class Appender implements Runnable {<a name="line.4291"></a>
+<span class="sourceLineNo">4292</span>    private HRegion region;<a name="line.4292"></a>
+<span class="sourceLineNo">4293</span>    private final static byte[] appendRow = Bytes.toBytes("appendRow");<a name="line.4293"></a>
+<span class="sourceLineNo">4294</span>    private final static byte[] family = Bytes.toBytes("family");<a name="line.4294"></a>
+<span class="sourceLineNo">4295</span>    private final static byte[] qualifier = Bytes.toBytes("qualifier");<a name="line.4295"></a>
+<span class="sourceLineNo">4296</span>    private final static byte[] CHAR = Bytes.toBytes("a");<a name="line.4296"></a>
+<span class="sourceLineNo">4297</span>    private int appendCounter;<a name="line.4297"></a>
+<span class="sourceLineNo">4298</span><a name="line.4298"></a>
+<span class="sourceLineNo">4299</span>    public Appender(HRegion region, int appendCounter) {<a name="line.4299"></a>
+<span class="sourceLineNo">4300</span>      this.region = region;<a name="line.4300"></a>
+<span class="sourceLineNo">4301</span>      this.appendCounter = appendCounter;<a name="line.4301"></a>
+<span class="sourceLineNo">4302</span>    }<a name="line.4302"></a>
+<span class="sourceLineNo">4303</span><a name="line.4303"></a>
+<span class="sourceLineNo">4304</span>    @Override<a name="line.4304"></a>
+<span class="sourceLineNo">4305</span>    public void run() {<a name="line.4305"></a>
+<span class="sourceLineNo">4306</span>      int count = 0;<a name="line.4306"></a>
+<span class="sourceLineNo">4307</span>      while (count &lt; appendCounter) {<a name="line.4307"></a>
+<span class="sourceLineNo">4308</span>        Append app = new Append(appendRow);<a name="line.4308"></a>
+<span class="sourceLineNo">4309</span>        app.addColumn(family, qualifier, CHAR);<a name="line.4309"></a>
+<span class="sourceLineNo">4310</span>        count++;<a name="line.4310"></a>
+<span class="sourceLineNo">4311</span>        try {<a name="line.4311"></a>
+<span class="sourceLineNo">4312</span>          region.append(app);<a name="line.4312"></a>
+<span class="sourceLineNo">4313</span>        } catch (IOException e) {<a name="line.4313"></a>
+<span class="sourceLineNo">4314</span>          LOG.info("Count=" + count + ", max=" + appendCounter + ", " + e);<a name="line.4314"></a>
+<span class="sourceLineNo">4315</span>          break;<a name="line.4315"></a>
+<span class="sourceLineNo">4316</span>        }<a name="line.4316"></a>
+<span class="sourceLineNo">4317</span>      }<a name="line.4317"></a>
+<span class="sourceLineNo">4318</span>    }<a name="line.4318"></a>
+<span class="sourceLineNo">4319</span>  }<a name="line.4319"></a>
+<span class="sourceLineNo">4320</span><a name="line.4320"></a>
+<span class="sourceLineNo">4321</span>  /**<a name="line.4321"></a>
+<span class="sourceLineNo">4322</span>   * Test case to check append function with memstore flushing<a name="line.4322"></a>
+<span class="sourceLineNo">4323</span>   * @throws Exception<a name="line.4323"></a>
+<span class="sourceLineNo">4324</span>   */<a name="line.4324"></a>
+<span class="sourceLineNo">4325</span>  @Test<a name="line.4325"></a>
+<span class="sourceLineNo">4326</span>  public void testParallelAppendWithMemStoreFlush() throws Exception {<a name="line.4326"></a>
+<span class="sourceLineNo">4327</span>    byte[] family = Appender.family;<a name="line.4327"></a>
+<span class="sourceLineNo">4328</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.4328"></a>
+<span class="sourceLineNo">4329</span>    final HRegion region = this.region;<a name="line.4329"></a>
+<span class="sourceLineNo">4330</span>    final AtomicBoolean appendDone = new AtomicBoolean(false);<a name="line.4330"></a>
+<span class="sourceLineNo">4331</span>    Runnable flusher = new Runnable() {<a name="line.4331"></a>
+<span class="sourceLineNo">4332</span>      @Override<a name="line.4332"></a>
+<span class="sourceLineNo">4333</span>      public void run() {<a name="line.4333"></a>
+<span class="sourceLineNo">4334</span>        while (!appendDone.get()) {<a name="line.4334"></a>
+<span class="sourceLineNo">4335</span>          try {<a name="line.4335"></a>
+<span class="sourceLineNo">4336</span>            region.flush(true);<a name="line.4336"></a>
+<span class="sourceLineNo">4337</span>          } catch (Exception e) {<a name="line.4337"></a>
+<span class="sourceLineNo">4338</span>            e.printStackTrace();<a name="line.4338"></a>
+<span class="sourceLineNo">4339</span>          }<a name="line.4339"></a>
+<span class="sourceLineNo">4340</span>        }<a name="line.4340"></a>
+<span class="sourceLineNo">4341</span>      }<a name="line.4341"></a>
+<span class="sourceLineNo">4342</span>    };<a name="line.4342"></a>
+<span class="sourceLineNo">4343</span><a name="line.4343"></a>
+<span class="sourceLineNo">4344</span>    // After all append finished, the value will append to threadNum *<a name="line.4344"></a>
+<span class="sourceLineNo">4345</span>    // appendCounter Appender.CHAR<a name="line.4345"></a>
+<span class="sourceLineNo">4346</span>    int threadNum = 20;<a name="line.4346"></a>
+<span class="sourceLineNo">4347</span>    int appendCounter = 100;<a name="line.4347"></a>
+<span class="sourceLineNo">4348</span>    byte[] expected = new byte[threadNum * appendCounter];<a name="line.4348"></a>
+<span class="sourceLineNo">4349</span>    for (int i = 0; i &lt; threadNum * appendCounter; i++) {<a name="line.4349"></a>
+<span class="sourceLineNo">4350</span>      System.arraycopy(Appender.CHAR, 0, expected, i, 1);<a name="line.4350"></a>
 <span class="sourceLineNo">4351</span>    }<a name="line.4351"></a>
-<span class="sourceLineNo">4352</span><a name="line.4352"></a>
-<span class="sourceLineNo">4353</span>    appendDone.set(true);<a name="line.4353"></a>
-<span class="sourceLineNo">4354</span>    flushThread.join();<a name="line.4354"></a>
-<span class="sourceLineNo">4355</span><a name="line.4355"></a>
-<span class="sourceLineNo">4356</span>    Get get = new Get(Appender.appendRow);<a name="line.4356"></a>
-<span class="sourceLineNo">4357</span>    get.addColumn(Appender.family, Appender.qualifier);<a name="line.4357"></a>
-<span class="sourceLineNo">4358</span>    get.readVersions(1);<a name="line.4358"></a>
-<span class="sourceLineNo">4359</span>    Result res = this.region.get(get);<a name="line.4359"></a>
-<span class="sourceLineNo">4360</span>    List&lt;Cell&gt; kvs = res.getColumnCells(Appender.family, Appender.qualifier);<a name="line.4360"></a>
-<span class="sourceLineNo">4361</span><a name="line.4361"></a>
-<span class="sourceLineNo">4362</span>    // we just got the latest version<a name="line.4362"></a>
-<span class="sourceLineNo">4363</span>    assertEquals(1, kvs.size());<a name="line.4363"></a>
-<span class="sourceLineNo">4364</span>    Cell kv = kvs.get(0);<a name="line.4364"></a>
-<span class="sourceLineNo">4365</span>    byte[] appendResult = new byte[kv.getValueLength()];<a name="line.4365"></a>
-<span class="sourceLineNo">4366</span>    System.arraycopy(kv.getValueArray(), kv.getValueOffset(), appendResult, 0, kv.getValueLength());<a name="line.4366"></a>
-<span class="sourceLineNo">4367</span>    assertArrayEquals(expected, appendResult);<a name="line.4367"></a>
-<span class="sourceLineNo">4368</span>  }<a name="line.4368"></a>
-<span class="sourceLineNo">4369</span><a name="line.4369"></a>
-<span class="sourceLineNo">4370</span>  /**<a name="line.4370"></a>
-<span class="sourceLineNo">4371</span>   * Test case to check put function with memstore flushing for same row, same ts<a name="line.4371"></a>
-<span class="sourceLineNo">4372</span>   * @throws Exception<a name="line.4372"></a>
-<span class="sourceLineNo">4373</span>   */<a name="line.4373"></a>
-<span class="sourceLineNo">4374</span>  @Test<a name="line.4374"></a>
-<span class="sourceLineNo">4375</span>  public void testPutWithMemStoreFlush() throws Exception {<a name="line.4375"></a>
-<span class="sourceLineNo">4376</span>    byte[] family = Bytes.toBytes("family");<a name="line.4376"></a>
-<span class="sourceLineNo">4377</span>    byte[] qualifier = Bytes.toBytes("qualifier");<a name="line.4377"></a>
-<span class="sourceLineNo">4378</span>    byte[] row = Bytes.toBytes("putRow");<a name="line.4378"></a>
-<span class="sourceLineNo">4379</span>    byte[] value = null;<a name="line.4379"></a>
-<span class="sourceLineNo">4380</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.4380"></a>
-<span class="sourceLineNo">4381</span>    Put put = null;<a name="line.4381"></a>
-<span class="sourceLineNo">4382</span>    Get get = null;<a name="line.4382"></a>
-<span class="sourceLineNo">4383</span>    List&lt;Cell&gt; kvs = null;<a name="line.4383"></a>
-<span class="sourceLineNo">4384</span>    Result res = null;<a name="line.4384"></a>
-<span class="sourceLineNo">4385</span><a name="line.4385"></a>
-<span class="sourceLineNo">4386</span>    put = new Put(row);<a name="line.4386"></a>
-<span class="sourceLineNo">4387</span>    value = Bytes.toBytes("value0");<a name="line.4387"></a>
-<span class="sourceLineNo">4388</span>    put.addColumn(family, qualifier, 1234567L, value);<a name="line.4388"></a>
-<span class="sourceLineNo">4389</span>    region.put(put);<a name="line.4389"></a>
-<span class="sourceLineNo">4390</span>    get = new Get(row);<a name="line.4390"></a>
-<span class="sourceLineNo">4391</span>    get.addColumn(family, qualifier);<a name="line.4391"></a>
-<span class="sourceLineNo">4392</span>    get.readAllVersions();<a name="line.4392"></a>
-<span class="sourceLineNo">4393</span>    res = this.region.get(get);<a name="line.4393"></a>
-<span class="sourceLineNo">4394</span>    kvs = res.getColumnCells(family, qualifier);<a name="line.4394"></a>
-<span class="sourceLineNo">4395</span>    assertEquals(1, kvs.size());<a name="line.4395"></a>
-<span class="sourceLineNo">4396</span>    assertArrayEquals(Bytes.toBytes("value0"), CellUtil.cloneValue(kvs.get(0)));<a name="line.4396"></a>
-<span class="sourceLineNo">4397</span><a name="line.4397"></a>
-<span class="sourceLineNo">4398</span>    region.flush(true);<a name="line.4398"></a>
-<span class="sourceLineNo">4399</span>    get = new Get(row);<a name="line.4399"></a>
-<span class="sourceLineNo">4400</span>    get.addColumn(family, qualifier);<a name="line.4400"></a>
-<span class="sourceLineNo">4401</span>    get.readAllVersions();<a name="line.4401"></a>
-<span class="sourceLineNo">4402</span>    res = this.region.get(get);<a name="line.4402"></a>
-<span class="sourceLineNo">4403</span>    kvs = res.getColumnCells(family, qualifier);<a name="line.4403"></a>
-<span class="sourceLineNo">4404</span>    assertEquals(1, kvs.size());<a name="line.4404"></a>
-<span class="sourceLineNo">4405</span>    assertArrayEquals(Bytes.toBytes("value0"), CellUtil.cloneValue(kvs.get(0)));<a name="line.4405"></a>
-<span class="sourceLineNo">4406</span><a name="line.4406"></a>
-<span class="sourceLineNo">4407</span>    put = new Put(row);<a name="line.4407"></a>
-<span class="sourceLineNo">4408</span>    value = Bytes.toBytes("value1");<a name="line.4408"></a>
-<span class="sourceLineNo">4409</span>    put.addColumn(family, qualifier, 1234567L, value);<a name="line.4409"></a>
-<span class="sourceLineNo">4410</span>    region.put(put);<a name="line.4410"></a>
-<span class="sourceLineNo">4411</span>    get = new Get(row);<a name="line.4411"></a>
-<span class="sourceLineNo">4412</span>    get.addColumn(family, qualifier);<a name="line.4412"></a>
-<span class="sourceLineNo">4413</span>    get.readAllVersions();<a name="line.4413"></a>
-<span class="sourceLineNo">4414</span>    res = this.region.get(get);<a name="line.4414"></a>
-<span class="sourceLineNo">4415</span>    kvs = res.getColumnCells(family, qualifier);<a name="line.4415"></a>
-<span class="sourceLineNo">4416</span>    assertEquals(1, kvs.size());<a name="line.4416"></a>
-<span class="sourceLineNo">4417</span>    assertArrayEquals(Bytes.toBytes("value1"), CellUtil.cloneValue(kvs.get(0)));<a name="line.4417"></a>
-<span class="sourceLineNo">4418</span><a name="line.4418"></a>
-<span class="sourceLineNo">4419</span>    region.flush(true);<a name="line.4419"></a>
-<span class="sourceLineNo">4420</span>    get = new Get(row);<a name="line.4420"></a>
-<span class="sourceLineNo">4421</span>    get.addColumn(family, qualifier);<a name="line.4421"></a>
-<span class="sourceLineNo">4422</span>    get.readAllVersions();<a name="line.4422"></a>
-<span class="sourceLineNo">4423</span>    res = this.region.get(get);<a name="line.4423"></a>
-<span class="sourceLineNo">4424</span>    kvs = res.getColumnCells(family, qualifier);<a name="line.4424"></a>
-<span class="sourceLineNo">4425</span>    assertEquals(1, kvs.size());<a name="line.4425"></a>
-<span class="sourceLineNo">4426</span>    assertArrayEquals(Bytes.toBytes("value1"), CellUtil.cloneValue(kvs.get(0)));<a name="line.4426"></a>
-<span class="sourceLineNo">4427</span>  }<a name="line.4427"></a>
+<span class="sourceLineNo">4352</span>    Thread[] appenders = new Thread[threadNum];<a name="line.4352"></a>
+<span class="sourceLineNo">4353</span>    Thread flushThread = new Thread(flusher);<a name="line.4353"></a>
+<span class="sourceLineNo">4354</span>    for (int i = 0; i &lt; threadNum; i++) {<a name="line.4354"></a>
+<span class="sourceLineNo">4355</span>      appenders[i] = new Thread(new Appender(this.region, appendCounter));<a name="line.4355"></a>
+<span class="sourceLineNo">4356</span>      appenders[i].start();<a name="line.4356"></a>
+<span class="sourceLineNo">4357</span>    }<a name="line.4357"></a>
+<span class="sourceLineNo">4358</span>    flushThread.start();<a name="line.4358"></a>
+<span class="sourceLineNo">4359</span>    for (int i = 0; i &lt; threadNum; i++) {<a name="line.4359"></a>
+<span class="sourceLineNo">4360</span>      appenders[i].join();<a name="line.4360"></a>
+<span class="sourceLineNo">4361</span>    }<a name="line.4361"></a>
+<span class="sourceLineNo">4362</span><a name="line.4362"></a>
+<span class="sourceLineNo">4363</span>    appendDone.set(true);<a name="line.4363"></a>
+<span class="sourceLineNo">4364</span>    flushThread.join();<a name="line.4364"></a>
+<span class="sourceLineNo">4365</span><a name="line.4365"></a>
+<span class="sourceLineNo">4366</span>    Get get = new Get(Appender.appendRow);<a name="line.4366"></a>
+<span class="sourceLineNo">4367</span>    get.addColumn(Appender.family, Appender.qualifier);<a name="line.4367"></a>
+<span class="sourceLineNo">4368</span>    get.readVersions(1);<a name="line.4368"></a>
+<span class="sourceLineNo">4369</span>    Result res = this.region.get(get);<a name="line.4369"></a>
+<span class="sourceLineNo">4370</span>    List&lt;Cell&gt; kvs = res.getColumnCells(Appender.family, Appender.qualifier);<a name="line.4370"></a>
+<span class="sourceLineNo">4371</span><a name="line.4371"></a>
+<span class="sourceLineNo">4372</span>    // we just got the latest version<a name="line.4372"></a>
+<span class="sourceLineNo">4373</span>    assertEquals(1, kvs.size());<a name="line.4373"></a>
+<span class="sourceLineNo">4374</span>    Cell kv = kvs.get(0);<a name="line.4374"></a>
+<span class="sourceLineNo">4375</span>    byte[] appendResult = new byte[kv.getValueLength()];<a name="line.4375"></a>
+<span class="sourceLineNo">4376</span>    System.arraycopy(kv.getValueArray(), kv.getValueOffset(), appendResult, 0, kv.getValueLength());<a name="line.4376"></a>
+<span class="sourceLineNo">4377</span>    assertArrayEquals(expected, appendResult);<a name="line.4377"></a>
+<span class="sourceLineNo">4378</span>  }<a name="line.4378"></a>
+<span class="sourceLineNo">4379</span><a name="line.4379"></a>
+<span class="sourceLineNo">4380</span>  /**<a name="line.4380"></a>
+<span class="sourceLineNo">4381</span>   * Test case to check put function with memstore flushing for same row, same ts<a name="line.4381"></a>
+<span class="sourceLineNo">4382</span>   * @throws Exception<a name="line.4382"></a>
+<span class="sourceLineNo">4383</span>   */<a name="line.4383"></a>
+<span class="sourceLineNo">4384</span>  @Test<a name="line.4384"></a>
+<span class="sourceLineNo">4385</span>  public void testPutWithMemStoreFlush() throws Exception {<a name="line.4385"></a>
+<span class="sourceLineNo">4386</span>    byte[] family = Bytes.toBytes("family");<a name="line.4386"></a>
+<span class="sourceLineNo">4387</span>    byte[] qualifier = Bytes.toBytes("qualifier");<a name="line.4387"></a>
+<span class="sourceLineNo">4388</span>    byte[] row = Bytes.toBytes("putRow");<a name="line.4388"></a>
+<span class="sourceLineNo">4389</span>    byte[] value = null;<a name="line.4389"></a>
+<span class="sourceLineNo">4390</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.4390"></a>
+<span class="sourceLineNo">4391</span>    Put put = null;<a name="line.4391"></a>
+<span class="sourceLineNo">4392</span>    Get get = null;<a name="line.4392"></a>
+<span class="sourceLineNo">4393</span>    List&lt;Cell&gt; kvs = null;<a name="line.4393"></a>
+<span class="sourceLineNo">4394</span>    Result res = null;<a name="line.4394"></a>
+<span class="sourceLineNo">4395</span><a name="line.4395"></a>
+<span class="sourceLineNo">4396</span>    put = new Put(row);<a name="line.4396"></a>
+<span class="sourceLineNo">4397</span>    value = Bytes.toBytes("value0");<a name="line.4397"></a>
+<span class="sourceLineNo">4398</span>    put.addColumn(family, qualifier, 1234567L, value);<a name="line.4398"></a>
+<span class="sourceLineNo">4399</span>    region.put(put);<a name="line.4399"></a>
+<span class="sourceLineNo">4400</span>    get = new Get(row);<a name="line.4400"></a>
+<span class="sourceLineNo">4401</span>    get.addColumn(family, qualifier);<a name="line.4401"></a>
+<span class="sourceLineNo">4402</span>    get.readAllVersions();<a name="line.4402"></a>
+<span class="sourceLineNo">4403</span>    res = this.region.get(get);<a name="line.4403"></a>
+<span class="sourceLineNo">4404</span>    kvs = res.getColumnCells(family, qualifier);<a name="line.4404"></a>
+<span class="sourceLineNo">4405</span>    assertEquals(1, kvs.size());<a name="line.4405"></a>
+<span class="sourceLineNo">4406</span>    assertArrayEquals(Bytes.toBytes("value0"), CellUtil.cloneValue(kvs.get(0)));<a name="line.4406"></a>
+<span class="sourceLineNo">4407</span><a name="line.4407"></a>
+<span class="sourceLineNo">4408</span>    region.flush(true);<a name="line.4408"></a>
+<span class="sourceLineNo">4409</span>    get = new Get(row);<a name="line.4409"></a>
+<span class="sourceLineNo">4410</span>    get.addColumn(family, qualifier);<a name="line.4410"></a>
+<span class="sourceLineNo">4411</span>    get.readAllVersions();<a name="line.4411"></a>
+<span class="sourceLineNo">4412</span>    res = this.region.get(get);<a name="line.4412"></a>
+<span class="sourceLineNo">4413</span>    kvs = res.getColumnCells(family, qualifier);<a name="line.4413"></a>
+<span class="sourceLineNo">4414</span>    assertEquals(1, kvs.size());<a name="line.4414"></a>
+<span class="sourceLineNo">4415</span>    assertArrayEquals(Bytes.toBytes("value0"), CellUtil.cloneValue(kvs.get(0)));<a name="line.4415"></a>
+<span class="sourceLineNo">4416</span><a name="line.4416"></a>
+<span class="sourceLineNo">4417</span>    put = new Put(row);<a name="line.4417"></a>
+<span class="sourceLineNo">4418</span>    value = Bytes.toBytes("value1");<a name="line.4418"></a>
+<span class="sourceLineNo">4419</span>    put.addColumn(family, qualifier, 1234567L, value);<a name="line.4419"></a>
+<span class="sourceLineNo">4420</span>    region.put(put);<a name="line.4420"></a>
+<span class="sourceLineNo">4421</span>    get = new Get(row);<a name="line.4421"></a>
+<span class="sourceLineNo">4422</span>    get.addColumn(family, qualifier);<a name="line.4422"></a>
+<span class="sourceLineNo">4423</span>    get.readAllVersions();<a name="line.4423"></a>
+<span class="sourceLineNo">4424</span>    res = this.region.get(get);<a name="line.4424"></a>
+<span class="sourceLineNo">4425</span>    kvs = res.getColumnCells(family, qualifier);<a name="line.4425"></a>
+<span class="sourceLineNo">4426</span>    assertEquals(1, kvs.size());<a name="line.4426"></a>
+<span class="sourceLineNo">4427</span>    assertArrayEquals(Bytes.toBytes("value1"), CellUtil.cloneValue(kvs.get(0)));<a name="line.4427"></a>
 <span class="sourceLineNo">4428</span><a name="line.4428"></a>
-<span class="sourceLineNo">4429</span>  @Test<a name="line.4429"></a>
-<span class="sourceLineNo">4430</span>  public void testDurability() throws Exception {<a name="line.4430"></a>
-<span class="sourceLineNo">4431</span>    // there are 5 x 5 cases:<a name="line.4431"></a>
-<span class="sourceLineNo">4432</span>    // table durability(SYNC,FSYNC,ASYC,SKIP,USE_DEFAULT) x mutation<a name="line.4432"></a>
-<span class="sourceLineNo">4433</span>    // durability(SYNC,FSYNC,ASYC,SKIP,USE_DEFAULT)<a name="line.4433"></a>
-<span class="sourceLineNo">4434</span><a name="line.4434"></a>
-<span class="sourceLineNo">4435</span>    // expected cases for append and sync wal<a name="line.4435"></a>
-<span class="sourceLineNo">4436</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4436"></a>
-<span class="sourceLineNo">4437</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4437"></a>
-<span class="sourceLineNo">4438</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.USE_DEFAULT, 0, true, true, false);<a name="line.4438"></a>
-<span class="sourceLineNo">4439</span><a name="line.4439"></a>
-<span class="sourceLineNo">4440</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4440"></a>
-<span class="sourceLineNo">4441</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4441"></a>
-<span class="sourceLineNo">4442</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.USE_DEFAULT, 0, true, true, false);<a name="line.4442"></a>
-<span class="sourceLineNo">4443</span><a name="line.4443"></a>
-<span class="sourceLineNo">4444</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4444"></a>
-<span class="sourceLineNo">4445</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4445"></a>
-<span class="sourceLineNo">4446</span><a name="line.4446"></a>
-<span class="sourceLineNo">4447</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4447"></a>
-<span class="sourceLineNo">4448</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4448"></a>
+<span class="sourceLineNo">4429</span>    region.flush(true);<a name="line.4429"></a>
+<span class="sourceLineNo">4430</span>    get = new Get(row);<a name="line.4430"></a>
+<span class="sourceLineNo">4431</span>    get.addColumn(family, qualifier);<a name="line.4431"></a>
+<span class="sourceLineNo">4432</span>    get.readAllVersions();<a name="line.4432"></a>
+<span class="sourceLineNo">4433</span>    res = this.region.get(get);<a name="line.4433"></a>
+<span class="sourceLineNo">4434</span>    kvs = res.getColumnCells(family, qualifier);<a name="line.4434"></a>
+<span class="sourceLineNo">4435</span>    assertEquals(1, kvs.size());<a name="line.4435"></a>
+<span class="sourceLineNo">4436</span>    assertArrayEquals(Bytes.toBytes("value1"), CellUtil.cloneValue(kvs.get(0)));<a name="line.4436"></a>
+<span class="sourceLineNo">4437</span>  }<a name="line.4437"></a>
+<span class="sourceLineNo">4438</span><a name="line.4438"></a>
+<span class="sourceLineNo">4439</span>  @Test<a name="line.4439"></a>
+<span class="sourceLineNo">4440</span>  public void testDurability() throws Exception {<a name="line.4440"></a>
+<span class="sourceLineNo">4441</span>    // there are 5 x 5 cases:<a name="line.4441"></a>
+<span class="sourceLineNo">4442</span>    // table durability(SYNC,FSYNC,ASYC,SKIP,USE_DEFAULT) x mutation<a name="line.4442"></a>
+<span class="sourceLineNo">4443</span>    // durability(SYNC,FSYNC,ASYC,SKIP,USE_DEFAULT)<a name="line.4443"></a>
+<span class="sourceLineNo">4444</span><a name="line.4444"></a>
+<span class="sourceLineNo">4445</span>    // expected cases for append and sync wal<a name="line.4445"></a>
+<span class="sourceLineNo">4446</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4446"></a>
+<span class="sourceLineNo">4447</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4447"></a>
+<span class="sourceLineNo">4448</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.USE_DEFAULT, 0, true, true, false);<a name="line.4448"></a>
 <span class="sourceLineNo">4449</span><a name="line.4449"></a>
-<span class="sourceLineNo">4450</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4450"></a>
-<span class="sourceLineNo">4451</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4451"></a>
-<span class="sourceLineNo">4452</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.USE_DEFAULT, 0, true, true, false);<a name="line.4452"></a>
+<span class="sourceLineNo">4450</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4450"></a>
+<span class="sourceLineNo">4451</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4451"></a>
+<span class="sourceLineNo">4452</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.USE_DEFAULT, 0, true, true, false);<a name="line.4452"></a>
 <span class="sourceLineNo">4453</span><a name="line.4453"></a>
-<span class="sourceLineNo">4454</span>    // expected cases for async wal<a name="line.4454"></a>
-<span class="sourceLineNo">4455</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4455"></a>
-<span class="sourceLineNo">4456</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4456"></a>
-<span class="sourceLineNo">4457</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4457"></a>
-<span class="sourceLineNo">4458</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4458"></a>
-<span class="sourceLineNo">4459</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4459"></a>
-<span class="sourceLineNo">4460</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.USE_DEFAULT, 0, true, false, false);<a name="line.4460"></a>
-<span class="sourceLineNo">4461</span><a name="line.4461"></a>
-<span class="sourceLineNo">4462</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4462"></a>
-<span class="sourceLineNo">4463</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4463"></a>
-<span class="sourceLineNo">4464</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4464"></a>
-<span class="sourceLineNo">4465</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4465"></a>
-<span class="sourceLineNo">4466</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4466"></a>
-<span class="sourceLineNo">4467</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.USE_DEFAULT, 5000, true, false, true);<a name="line.4467"></a>
-<span class="sourceLineNo">4468</span><a name="line.4468"></a>
-<span class="sourceLineNo">4469</span>    // expect skip wal cases<a name="line.4469"></a>
-<span class="sourceLineNo">4470</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4470"></a>
-<span class="sourceLineNo">4471</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4471"></a>
-<span class="sourceLineNo">4472</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4472"></a>
-<span class="sourceLineNo">4473</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4473"></a>
-<span class="sourceLineNo">4474</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4474"></a>
-<span class="sourceLineNo">4475</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.USE_DEFAULT, 0, false, false, false);<a name="line.4475"></a>
-<span class="sourceLineNo">4476</span><a name="line.4476"></a>
-<span class="sourceLineNo">4477</span>  }<a name="line.4477"></a>
+<span class="sourceLineNo">4454</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4454"></a>
+<span class="sourceLineNo">4455</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4455"></a>
+<span class="sourceLineNo">4456</span><a name="line.4456"></a>
+<span class="sourceLineNo">4457</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4457"></a>
+<span class="sourceLineNo">4458</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4458"></a>
+<span class="sourceLineNo">4459</span><a name="line.4459"></a>
+<span class="sourceLineNo">4460</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4460"></a>
+<span class="sourceLineNo">4461</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4461"></a>
+<span class="sourceLineNo">4462</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.USE_DEFAULT, 0, true, true, false);<a name="line.4462"></a>
+<span class="sourceLineNo">4463</span><a name="line.4463"></a>
+<span class="sourceLineNo">4464</span>    // expected cases for async wal<a name="line.4464"></a>
+<span class="sourceLineNo">4465</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4465"></a>
+<span class="sourceLineNo">4466</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4466"></a>
+<span class="sourceLineNo">4467</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4467"></a>
+<span class="sourceLineNo">4468</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4468"></a>
+<span class="sourceLineNo">4469</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4469"></a>
+<span class="sourceLineNo">4470</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.USE_DEFAULT, 0, true, false, false);<a name="line.4470"></a>
+<span class="sourceLineNo">4471</span><a name="line.4471"></a>
+<span class="sourceLineNo">4472</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4472"></a>
+<span class="sourceLineNo">4473</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4473"></a>
+<span class="sourceLineNo">4474</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4474"></a>
+<span class="sourceLineNo">4475</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4475"></a>
+<span class="sourceLineNo">4476</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4476"></a>
+<span class="sourceLineNo">4477</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.USE_DEFAULT, 5000, true, false, true);<a name="line.4477"></a>
 <span class="sourceLineNo">4478</span><a name="line.4478"></a>
-<span class="sourceLineNo">4479</span>  private void durabilityTest(String method, Durability tableDurability,<a name="line.4479"></a>
-<span class="sourceLineNo">4480</span>      Durability mutationDurability, long timeout, boolean expectAppend, final boolean expectSync,<a name="line.4480"></a>
-<span class="sourceLineNo">4481</span>      final boolean expectSyncFromLogSyncer) throws Exception {<a name="line.4481"></a>
-<span class="sourceLineNo">4482</span>    Configuration conf = HBaseConfiguration.create(CONF);<a name="line.4482"></a>
-<span class="sourceLineNo">4483</span>    method = method + "_" + tableDurability.name() + "_" + mutationDurability.name();<a name="line.4483"></a>
-<span class="sourceLineNo">4484</span>    byte[] family = Bytes.toBytes("family");<a name="line.4484"></a>
-<span class="sourceLineNo">4485</span>    Path logDir = new Path(new Path(dir + method), "log");<a name="line.4485"></a>
-<span class="sourceLineNo">4486</span>    final Configuration walConf = new Configuration(conf);<a name="line.4486"></a>
-<span class="sourceLineNo">4487</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.4487"></a>
-<span class="sourceLineNo">4488</span>    // XXX: The spied AsyncFSWAL can not work properly because of a Mockito defect that can not<a name="line.4488"></a>
-<span class="sourceLineNo">4489</span>    // deal with classes which have a field of an inner class. See discussions in HBASE-15536.<a name="line.4489"></a>
-<span class="sourceLineNo">4490</span>    walConf.set(WALFactory.WAL_PROVIDER, "filesystem");<a name="line.4490"></a>
-<span class="sourceLineNo">4491</span>    final WALFactory wals = new WALFactory(walConf, TEST_UTIL.getRandomUUID().toString());<a name="line.4491"></a>
-<span class="sourceLineNo">4492</span>    final WAL wal = spy(wals.getWAL(RegionInfoBuilder.newBuilder(tableName).build()));<a name="line.4492"></a>
-<span class="sourceLineNo">4493</span>    this.region = initHRegion(tableName, HConstants.EMPTY_START_ROW,<a name="line.4493"></a>
-<span class="sourceLineNo">4494</span>        HConstants.EMPTY_END_ROW, false, tableDurability, wal,<a name="line.4494"></a>
-<span class="sourceLineNo">4495</span>        new byte[][] { family });<a name="line.4495"></a>
-<span class="sourceLineNo">4496</span><a name="line.4496"></a>
-<span class="sourceLineNo">4497</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.4497"></a>
-<span class="sourceLineNo">4498</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.4498"></a>
-<span class="sourceLineNo">4499</span>    put.setDurability(mutationDurability);<a name="line.4499"></a>
-<span class="sourceLineNo">4500</span>    region.put(put);<a name="line.4500"></a>
-<span class="sourceLineNo">4501</span><a name="line.4501"></a>
-<span class="sourceLineNo">4502</span>    //verify append called or not<a name="line.4502"></a>
-<span class="sourceLineNo">4503</span>    verify(wal, expectAppend ? times(1) : never())<a name="line.4503"></a>
-<span class="sourceLineNo">4504</span>      .append((HRegionInfo)any(), (WALKeyImpl)any(),<a name="line.4504"></a>
-<span class="sourceLineNo">4505</span>          (WALEdit)any(), Mockito.anyBoolean());<a name="line.4505"></a>
+<span class="sourceLineNo">4479</span>    // expect skip wal cases<a name="line.4479"></a>
+<span class="sourceLineNo">4480</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4480"></a>
+<span class="sourceLineNo">4481</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4481"></a>
+<span class="sourceLineNo">4482</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4482"></a>
+<span class="sourceLineNo">4483</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4483"></a>
+<span class="sourceLineNo">4484</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4484"></a>
+<span class="sourceLineNo">4485</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.USE_DEFAULT, 0, false, false, false);<a name="line.4485"></a>
+<span class="sourceLineNo">4486</span><a name="line.4486"></a>
+<span class="sourceLineNo">4487</span>  }<a name="line.4487"></a>
+<span class="sourceLineNo">4488</span><a name="line.4488"></a>
+<span class="sourceLineNo">4489</span>  private void durabilityTest(String method, Durability tableDurability,<a name="line.4489"></a>
+<span class="sourceLineNo">4490</span>      Durability mutationDurability, long timeout, boolean expectAppend, final boolean expectSync,<a name="line.4490"></a>
+<span class="sourceLineNo">4491</span>      final boolean expectSyncFromLogSyncer) throws Exception {<a name="line.4491"></a>
+<span class="sourceLineNo">4492</span>    Configuration conf = HBaseConfiguration.create(CONF);<a name="line.4492"></a>
+<span class="sourceLineNo">4493</span>    method = method + "_" + tableDurability.name() + "_" + mutationDurability.name();<a name="line.4493"></a>
+<span class="sourceLineNo">4494</span>    byte[] family = Bytes.toBytes("family");<a name="line.4494"></a>
+<span class="sourceLineNo">4495</span>    Path logDir = new Path(new Path(dir + method), "log");<a name="line.4495"></a>
+<span class="sourceLineNo">4496</span>    final Configuration walConf = new Configuration(conf);<a name="line.4496"></a>
+<span class="sourceLineNo">4497</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.4497"></a>
+<span class="sourceLineNo">4498</span>    // XXX: The spied AsyncFSWAL can not work properly because of a Mockito defect that can not<a name="line.4498"></a>
+<span class="sourceLineNo">4499</span>    // deal with classes which have a field of an inner class. See discussions in HBASE-15536.<a name="line.4499"></a>
+<span class="sourceLineNo">4500</span>    walConf.set(WALFactory.WAL_PROVIDER, "filesystem");<a name="line.4500"></a>
+<span class="sourceLineNo">4501</span>    final WALFactory wals = new WALFactory(walConf, TEST_UTIL.getRandomUUID().toString());<a name="line.4501"></a>
+<span class="sourceLineNo">4502</span>    final WAL wal = spy(wals.getWAL(RegionInfoBuilder.newBuilder(tableName).build()));<a name="line.4502"></a>
+<span class="sourceLineNo">4503</span>    this.region = initHRegion(tableName, HConstants.EMPTY_START_ROW,<a name="line.4503"></a>
+<span class="sourceLineNo">4504</span>        HConstants.EMPTY_END_ROW, false, tableDurability, wal,<a name="line.4504"></a>
+<span class="sourceLineNo">4505</span>        new byte[][] { family });<a name="line.4505"></a>
 <span class="sourceLineNo">4506</span><a name="line.4506"></a>
-<span class="sourceLineNo">4507</span>    // verify sync called or not<a name="line.4507"></a>
-<span class="sourceLineNo">4508</span>    if (expectSync || expectSyncFromLogSyncer) {<a name="line.4508"></a>
-<span class="sourceLineNo">4509</span>      TEST_UTIL.waitFor(timeout, new Waiter.Predicate&lt;Exception&gt;() {<a name="line.4509"></a>
-<span class="sourceLineNo">4510</span>        @Override<a name="line.4510"></a>
-<span class="sourceLineNo">4511</span>        public boolean evaluate() throws Exception {<a name="line.4511"></a>
-<span class="sourceLineNo">4512</span>          try {<a name="line.4512"></a>
-<span class="sourceLineNo">4513</span>            if (expectSync) {<a name="line.4513"></a>
-<span class="sourceLineNo">4514</span>              verify(wal, times(1)).sync(anyLong()); // Hregion calls this one<a name="line.4514"></a>
-<span class="sourceLineNo">4515</span>            } else if (expectSyncFromLogSyncer) {<a name="line.4515"></a>
-<span class="sourceLineNo">4516</span>              verify(wal, times(1)).sync(); // wal syncer calls this one<a name="line.4516"></a>
-<span class="sourceLineNo">4517</span>            }<a name="line.4517"></a>
-<span class="sourceLineNo">4518</span>          } catch (Throwable ignore) {<a name="line.4518"></a>
-<span class="sourceLineNo">4519</span>          }<a name="line.4519"></a>
-<span class="sourceLineNo">4520</span>          return true;<a name="line.4520"></a>
-<span class="sourceLineNo">4521</span>        }<a name="line.4521"></a>
-<span class="sourceLineNo">4522</span>      });<a name="line.4522"></a>
-<span class="sourceLineNo">4523</span>    } else {<a name="line.4523"></a>
-<span class="sourceLineNo">4524</span>      //verify(wal, never()).sync(anyLong());<a name="line.4524"></a>
-<span class="sourceLineNo">4525</span>      verify(wal, never()).sync();<a name="line.4525"></a>
-<span class="sourceLineNo">4526</span>    }<a name="line.4526"></a>
-<span class="sourceLineNo">4527</span><a name="line.4527"></a>
-<span class="sourceLineNo">4528</span>    HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.4528"></a>
-<span class="sourceLineNo">4529</span>    wals.close();<a name="line.4529"></a>
-<span class="sourceLineNo">4530</span>    this.region = null;<a name="line.4530"></a>
-<span class="sourceLineNo">4531</span>  }<a name="line.4531"></a>
-<span class="sourceLineNo">4532</span><a name="line.4532"></a>
-<span class="sourceLineNo">4533</span>  @Test<a name="line.4533"></a>
-<span class="sourceLineNo">4534</span>  public void testRegionReplicaSecondary() throws IOException {<a name="line.4534"></a>
-<span class="sourceLineNo">4535</span>    // create a primary region, load some data and flush<a name="line.4535"></a>
-<span class="sourceLineNo">4536</span>    // create a secondary region, and do a get against that<a name="line.4536"></a>
-<span class="sourceLineNo">4537</span>    Path rootDir = new Path(dir + name.getMethodName());<a name="line.4537"></a>
-<span class="sourceLineNo">4538</span>    FSUtils.setRootDir(TEST_UTIL.getConfiguration(), rootDir);<a name="line.4538"></a>
-<span class="sourceLineNo">4539</span><a name="line.4539"></a>
-<span class="sourceLineNo">4540</span>    byte[][] families = new byte[][] {<a name="line.4540"></a>
-<span class="sourceLineNo">4541</span>        Bytes.toBytes("cf1"), Bytes.toBytes("cf2"), Bytes.toBytes("cf3")<a name="line.4541"></a>
-<span class="sourceLineNo">4542</span>    };<a name="line.4542"></a>
-<span class="sourceLineNo">4543</span>    byte[] cq = Bytes.toBytes("cq");<a name="line.4543"></a>
-<span class="sourceLineNo">4544</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.4544"></a>
-<span class="sourceLineNo">4545</span>    for (byte[] family : families) {<a name="line.4545"></a>
-<span class="sourceLineNo">4546</span>      htd.addFamily(new HColumnDescriptor(family));<a name="line.4546"></a>
-<span class="sourceLineNo">4547</span>    }<a name="line.4547"></a>
-<span class="sourceLineNo">4548</span><a name="line.4548"></a>
-<span class="sourceLineNo">4549</span>    long time = System.currentTimeMillis();<a name="line.4549"></a>
-<span class="sourceLineNo">4550</span>    HRegionInfo primaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4550"></a>
-<span class="sourceLineNo">4551</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4551"></a>
-<span class="sourceLineNo">4552</span>      false, time, 0);<a name="line.4552"></a>
-<span class="sourceLineNo">4553</span>    HRegionInfo secondaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4553"></a>
-<span class="sourceLineNo">4554</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4554"></a>
-<span class="sourceLineNo">4555</span>      false, time, 1);<a name="line.4555"></a>
-<span class="sourceLineNo">4556</span><a name="line.4556"></a>
-<span class="sourceLineNo">4557</span>    HRegion primaryRegion = null, secondaryRegion = null;<a name="line.4557"></a>
+<span class="sourceLineNo">4507</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.4507"></a>
+<span class="sourceLineNo">4508</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.4508"></a>
+<span class="sourceLineNo">4509</span>    put.setDurability(mutationDurability);<a name="line.4509"></a>
+<span class="sourceLineNo">4510</span>    region.put(put);<a name="line.4510"></a>
+<span class="sourceLineNo">4511</span><a name="line.4511"></a>
+<span class="sourceLineNo">4512</span>    //verify append called or not<a name="line.4512"></a>
+<span class="sourceLineNo">4513</span>    verify(wal, expectAppend ? times(1) : never())<a name="line.4513"></a>
+<span class="sourceLineNo">4514</span>      .append((HRegionInfo)any(), (WALKeyImpl)any(),<a name="line.4514"></a>
+<span class="sourceLineNo">4515</span>          (WALEdit)any(), Mockito.anyBoolean());<a name="line.4515"></a>
+<span class="sourceLineNo">4516</span><a name="line.4516"></a>
+<span class="sourceLineNo">4517</span>    // verify sync called or not<a name="line.4517"></a>
+<span class="sourceLineNo">4518</span>    if (expectSync || expectSyncFromLogSyncer) {<a name="line.4518"></a>
+<span class="sourceLineNo">4519</span>      TEST_UTIL.waitFor(timeout, new Waiter.Predicate&lt;Exception&gt;() {<a name="line.4519"></a>
+<span class="sourceLineNo">4520</span>        @Override<a name="line.4520"></a>
+<span class="sourceLineNo">4521</span>        public boolean evaluate() throws Exception {<a name="line.4521"></a>
+<span class="sourceLineNo">4522</span>          try {<a name="line.4522"></a>
+<span class="sourceLineNo">4523</span>            if (expectSync) {<a name="line.4523"></a>
+<span class="sourceLineNo">4524</span>              verify(wal, times(1)).sync(anyLong()); // Hregion calls this one<a name="line.4524"></a>
+<span class="sourceLineNo">4525</span>            } else if (expectSyncFromLogSyncer) {<a name="line.4525"></a>
+<span class="sourceLineNo">4526</span>              verify(wal, times(1)).sync(); // wal syncer calls this one<a name="line.4526"></a>
+<span class="sourceLineNo">4527</span>            }<a name="line.4527"></a>
+<span class="sourceLineNo">4528</span>          } catch (Throwable ignore) {<a name="line.4528"></a>
+<span class="sourceLineNo">4529</span>          }<a name="line.4529"></a>
+<span class="sourceLineNo">4530</span>          return true;<a name="line.4530"></a>
+<span class="sourceLineNo">4531</span>        }<a name="line.4531"></a>
+<span class="sourceLineNo">4532</span>      });<a name="line.4532"></a>
+<span class="sourceLineNo">4533</span>    } else {<a name="line.4533"></a>
+<span class="sourceLineNo">4534</span>      //verify(wal, never()).sync(anyLong());<a name="line.4534"></a>
+<span class="sourceLineNo">4535</span>      verify(wal, never()).sync();<a name="line.4535"></a>
+<span class="sourceLineNo">4536</span>    }<a name="line.4536"></a>
+<span class="sourceLineNo">4537</span><a name="line.4537"></a>
+<span class="sourceLineNo">4538</span>    HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.4538"></a>
+<span class="sourceLineNo">4539</span>    wals.close();<a name="line.4539"></a>
+<span class="sourceLineNo">4540</span>    this.region = null;<a name="line.4540"></a>
+<span class="sourceLineNo">4541</span>  }<a name="line.4541"></a>
+<span class="sourceLineNo">4542</span><a name="line.4542"></a>
+<span class="sourceLineNo">4543</span>  @Test<a name="line.4543"></a>
+<span class="sourceLineNo">4544</span>  public void testRegionReplicaSecondary() throws IOException {<a name="line.4544"></a>
+<span class="sourceLineNo">4545</span>    // create a primary region, load some data and flush<a name="line.4545"></a>
+<span class="sourceLineNo">4546</span>    // create a secondary region, and do a get against that<a name="line.4546"></a>
+<span class="sourceLineNo">4547</span>    Path rootDir = new Path(dir + name.getMethodName());<a name="line.4547"></a>
+<span class="sourceLineNo">4548</span>    FSUtils.setRootDir(TEST_UTIL.getConfiguration(), rootDir);<a name="line.4548"></a>
+<span class="sourceLineNo">4549</span><a name="line.4549"></a>
+<span class="sourceLineNo">4550</span>    byte[][] families = new byte[][] {<a name="line.4550"></a>
+<span class="sourceLineNo">4551</span>        Bytes.toBytes("cf1"), Bytes.toBytes("cf2"), Bytes.toBytes("cf3")<a name="line.4551"></a>
+<span class="sourceLineNo">4552</span>    };<a name="line.4552"></a>
+<span class="sourceLineNo">4553</span>    byte[] cq = Bytes.toBytes("cq");<a name="line.4553"></a>
+<span class="sourceLineNo">4554</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.4554"></a>
+<span class="sourceLineNo">4555</span>    for (byte[] family : families) {<a name="line.4555"></a>
+<span class="sourceLineNo">4556</span>      htd.addFamily(new HColumnDescriptor(family));<a name="line.4556"></a>
+<span class="sourceLineNo">4557</span>    }<a name="line.4557"></a>
 <span class="sourceLineNo">4558</span><a name="line.4558"></a>
-<span class="sourceLineNo">4559</span>    try {<a name="line.4559"></a>
-<span class="sourceLineNo">4560</span>      primaryRegion = HBaseTestingUtility.createRegionAndWAL(primaryHri,<a name="line.4560"></a>
-<span class="sourceLineNo">4561</span>          rootDir, TEST_UTIL.getConfiguration(), htd);<a name="line.4561"></a>
-<span class="sourceLineNo">4562</span><a name="line.4562"></a>
-<span class="sourceLineNo">4563</span>      // load some data<a name="line.4563"></a>
-<span class="sourceLineNo">4564</span>      putData(primaryRegion, 0, 1000, cq, families);<a name="line.4564"></a>
-<span class="sourceLineNo">4565</span><a name="line.4565"></a>
-<span class="sourceLineNo">4566</span>      // flush region<a name="line.4566"></a>
-<span class="sourceLineNo">4567</span>      primaryRegion.flush(true);<a name="line.4567"></a>
+<span class="sourceLineNo">4559</span>    long time = System.currentTimeMillis();<a name="line.4559"></a>
+<span class="sourceLineNo">4560</span>    HRegionInfo primaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4560"></a>
+<span class="sourceLineNo">4561</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4561"></a>
+<span class="sourceLineNo">4562</span>      false, time, 0);<a name="line.4562"></a>
+<span class="sourceLineNo">4563</span>    HRegionInfo secondaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4563"></a>
+<span class="sourceLineNo">4564</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4564"></a>
+<span class="sourceLineNo">4565</span>      false, time, 1);<a name="line.4565"></a>
+<span class="sourceLineNo">4566</span><a name="line.4566"></a>
+<span class="sourceLineNo">4567</span>    HRegion primaryRegion = null, secondaryRegion = null;<a name="line.4567"></a>
 <span class="sourceLineNo">4568</span><a name="line.4568"></a>
-<span class="sourceLineNo">4569</span>      // open secondary region<a name="line.4569"></a>
-<span class="sourceLineNo">4570</span>      secondaryRegion = HRegion.openHRegion(rootDir, secondaryHri, htd, null, CONF);<a name="line.4570"></a>
-<span class="sourceLineNo">4571</span><a name="line.4571"></a>
-<span class="sourceLineNo">4572</span>      verifyData(secondaryRegion, 0, 1000, cq, families);<a name="line.4572"></a>
-<span class="sourceLineNo">4573</span>    } finally {<a name="line.4573"></a>
-<span class="sourceLineNo">4574</span>      if (primaryRegion != null) {<a name="line.4574"></a>
-<span class="sourceLineNo">4575</span>        HBaseTestingUtility.closeRegionAndWAL(primaryRegion);<a name="line.4575"></a>
-<span class="sourceLineNo">4576</span>      }<a name="line.4576"></a>
-<span class="sourceLineNo">4577</span>      if (secondaryRegion != null) {<a name="line.4577"></a>
-<span class="sourceLineNo">4578</span>        HBaseTestingUtility.closeRegionAndWAL(secondaryRegion);<a name="line.4578"></a>
-<span class="sourceLineNo">4579</span>      }<a name="line.4579"></a>
-<span class="sourceLineNo">4580</span>    }<a name="line.4580"></a>
-<span class="sourceLineNo">4581</span>  }<a name="line.4581"></a>
-<span class="sourceLineNo">4582</span><a name="line.4582"></a>
-<span class="sourceLineNo">4583</span>  @Test<a name="line.4583"></a>
-<span class="sourceLineNo">4584</span>  public void testRegionReplicaSecondaryIsReadOnly() throws IOException {<a name="line.4584"></a>
-<span class="sourceLineNo">4585</span>    // create a primary region, load some data and flush<a name="line.4585"></a>
-<span class="sourceLineNo">4586</span>    // create a secondary region, and do a put against that<a name="line.4586"></a>
-<span class="sourceLineNo">4587</span>    Path rootDir = new Path(dir + name.getMethodName());<a name="line.4587"></a>
-<span class="sourceLineNo">4588</span>    FSUtils.setRootDir(TEST_UTIL.getConfiguration(), rootDir);<a name="line.4588"></a>
-<span class="sourceLineNo">4589</span><a name="line.4589"></a>
-<span class="sourceLineNo">4590</span>    byte[][] families = new byte[][] {<a name="line.4590"></a>
-<span class="sourceLineNo">4591</span>        Bytes.toBytes("cf1"), Bytes.toBytes("cf2"), Bytes.toBytes("cf3")<a name="line.4591"></a>
-<span class="sourceLineNo">4592</span>    };<a name="line.4592"></a>
-<span class="sourceLineNo">4593</span>    byte[] cq = Bytes.toBytes("cq");<a name="line.4593"></a>
-<span class="sourceLineNo">4594</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.4594"></a>
-<span class="sourceLineNo">4595</span>    for (byte[] family : families) {<a name="line.4595"></a>
-<span class="sourceLineNo">4596</span>      htd.addFamily(new HColumnDescriptor(family));<a name="line.4596"></a>
-<span class="sourceLineNo">4597</span>    }<a name="line.4597"></a>
-<span class="sourceLineNo">4598</span><a name="line.4598"></a>
-<span class="sourceLineNo">4599</span>    long time = System.currentTimeMillis();<a name="line.4599"></a>
-<span class="sourceLineNo">4600</span>    HRegionInfo primaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4600"></a>
-<span class="sourceLineNo">4601</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4601"></a>
-<span class="sourceLineNo">4602</span>      false, time, 0);<a name="line.4602"></a>
-<span class="sourceLineNo">4603</span>    HRegionInfo secondaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4603"></a>
-<span class="sourceLineNo">4604</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4604"></a>
-<span class="sourceLineNo">4605</span>      false, time, 1);<a name="line.4605"></a>
-<span class="sourceLineNo">4606</span><a name="line.4606"></a>
-<span class="sourceLineNo">4607</span>    HRegion primaryRegion = null, secondaryRegion = null;<a name="line.4607"></a>
+<span class="sourceLineNo">4569</span>    try {<a name="line.4569"></a>
+<span class="sourceLineNo">4570</span>      primaryRegion = HBaseTestingUtility.createRegionAndWAL(primaryHri,<a name="line.4570"></a>
+<span class="sourceLineNo">4571</span>          rootDir, TEST_UTIL.getConfiguration(), htd);<a name="line.4571"></a>
+<span class="sourceLineNo">4572</span><a name="line.4572"></a>
+<span class="sourceLineNo">4573</span>      // load some data<a name="line.4573"></a>
+<span class="sourceLineNo">4574</span>      putData(primaryRegion, 0, 1000, cq, families);<a name="line.4574"></a>
+<span class="sourceLineNo">4575</span><a name="line.4575"></a>
+<span class="sourceLineNo">4576</span>      // flush region<a name="line.4576"></a>
+<span class="sourceLineNo">4577</span>      primaryRegion.flush(true);<a name="line.4577"></a>
+<span class="sourceLineNo">4578</span><a name="line.4578"></a>
+<span class="sourceLineNo">4579</span>      // open secondary region<a name="line.4579"></a>
+<span class="sourceLineNo">4580</span>      secondaryRegion = HRegion.openHRegion(rootDir, secondaryHri, htd, null, CONF);<a name="line.4580"></a>
+<span class="sourceLineNo">4581</span><a name="line.4581"></a>
+<span class="sourceLineNo">4582</span>      verifyData(secondaryRegion, 0, 1000, cq, families);<a name="line.4582"></a>
+<span class="sourceLineNo">4583</span>    } finally {<a name="line.4583"></a>
+<span class="sourceLineNo">4584</span>      if (primaryRegion != null) {<a name="line.4584"></a>
+<span class="sourceLineNo">4585</span>        HBaseTestingUtility.closeRegionAndWAL(primaryRegion);<a name="line.4585"></a>
+<span class="sourceLineNo">4586</span>      }<a name="line.4586"></a>
+<span class="sourceLineNo">4587</span>      if (secondaryRegion != null) {<a name="line.4587"></a>
+<span class="sourceLineNo">4588</span>        HBaseTestingUtility.closeRegionAndWAL(secondaryRegion);<a name="line.4588"></a>
+<span class="sourceLineNo">4589</span>      }<a name="line.4589"></a>
+<span class="sourceLineNo">4590</span>    }<a name="line.4590"></a>
+<span class="sourceLineNo">4591</span>  }<a name="line.4591"></a>
+<span class="sourceLineNo">4592</span><a name="line.4592"></a>
+<span class="sourceLineNo">4593</span>  @Test<a name="line.4593"></a>
+<span class="sourceLineNo">4594</span>  public void testRegionReplicaSecondaryIsReadOnly() throws IOException {<a name="line.4594"></a>
+<span class="sourceLineNo">4595</span>    // create a primary region, load some data and flush<a name="line.4595"></a>
+<span class="sourceLineNo">4596</span>    // create a secondary region, and do a put against that<a name="line.4596"></a>
+<span class="sourceLineNo">4597</span>    Path rootDir = new Path(dir + name.getMethodName());<a name="line.4597"></a>
+<span class="sourceLineNo">4598</span>    FSUtils.setRootDir(TEST_UTIL.getConfiguration(), rootDir);<a name="line.4598"></a>
+<span class="sourceLineNo">4599</span><a name="line.4599"></a>
+<span class="sourceLineNo">4600</span>    byte[][] families = new byte[][] {<a name="line.4600"></a>
+<span class="sourceLineNo">4601</span>        Bytes.toBytes("cf1"), Bytes.toBytes("cf2"), Bytes.toBytes("cf3")<a name="line.4601"></a>
+<span class="sourceLineNo">4602</span>    };<a name="line.4602"></a>
+<span class="sourceLineNo">4603</span>    byte[] cq = Bytes.toBytes("cq");<a name="line.4603"></a>
+<span class="sourceLineNo">4604</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.4604"></a>
+<span class="sourceLineNo">4605</span>    for (byte[] family : families) {<a name="line.4605"></a>
+<span class="sourceLineNo">4606</span>      htd.addFamily(new HColumnDescriptor(family));<a name="line.4606"></a>
+<span class="sourceLineNo">4607</span>    }<a name="line.4607"></a>
 <span class="sourceLineNo">4608</span><a name="line.4608"></a>
-<span class="sourceLineNo">4609</span>    try {<a name="line.4609"></a>
-<span class="sourceLineNo">4610</span>      primaryRegion = HBaseTestingUtility.createRegionAndWAL(primaryHri,<a name="line.4610"></a>
-<span class="sourceLineNo">4611</span>          rootDir, TEST_UTIL.getConfiguration(), htd);<a name="line.4611"></a>
-<span class="sourceLineNo">4612</span><a name="line.4612"></a>
-<span class="sourceLineNo">4613</span>      // load some data<a name="line.4613"></a>
-<span class="sourceLineNo">4614</span>      putData(primaryRegion, 0, 1000, cq, families);<a name="line.4614"></a>
-<span class="sourceLineNo">4615</span><a name="line.4615"></a>
-<span class="sourceLineNo">4616</span>      // flush region<a name="line.4616"></a>
-<span class="sourceLineNo">4617</span>      primaryRegion.flush(true);<a name="line.4617"></a>
+<span class="sourceLineNo">4609</span>    long time = System.currentTimeMillis();<a name="line.4609"></a>
+<span class="sourceLineNo">4610</span>    HRegionInfo primaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4610"></a>
+<span class="sourceLineNo">4611</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4611"></a>
+<span class="sourceLineNo">4612</span>      false, time, 0);<a name="line.4612"></a>
+<span class="sourceLineNo">4613</span>    HRegionInfo secondaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4613"></a>
+<span class="sourceLineNo">4614</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4614"></a>
+<span class="sourceLineNo">4615</span>      false, time, 1);<a name="line.4615"></a>
+<span class="sourceLineNo">4616</span><a name="line.4616"></a>
+<span class="sourceLineNo">4617</span>    HRegion primaryRegion = null, secondaryRegion = null;<a name="line.4617"></a>
 <span class="sourceLineNo">4618</span><a name="line.4618"></a>
-<span class="sourceLineNo">4619</span>      // open secondary region<a name="line.4619"></a>
-<span class="sourceLineNo">4620</span>      secondaryRegion = HRegion.openHRegion(rootDir, secondaryHri, htd, null, CONF);<a name="line.4620"></a>
-<span class="sourceLineNo">4621</span><a name="line.4621"></a>
-<span class="sourceLineNo">4622</span>      try {<a name="line.4622"></a>
-<span class="sourceLineNo">4623</span>        putData(secondaryRegion, 0, 1000, cq, families);<a name="line.4623"></a>
-<span class="sourceLineNo">4624</span>        fail("Should have thrown exception");<a name="line.4624"></a>
-<span class="sourceLineNo">4625</span>      } catch (IOException ex) {<a name="line.4625"></a>
-<span class="sourceLineNo">4626</span>        // expected<a name="line.4626"></a>
-<span class="sourceLineNo">4627</span>      }<a name="line.4627"></a>
-<span class="sourceLineNo">4628</span>    } finally {<a name="line.4628"></a>
-<span class="sourceLineNo">4629</span>      if (primaryRegion != null) {<a name="line.4629"></a>
-<span class="sourceLineNo">4630</span>        HBaseTestingUtility.closeRegionAndWAL(primaryRegion);<a name="line.4630"></a>
-<span class="sourceLineNo">4631</span>      }<a name="line.4631"></a>
-<span class="sourceLineNo">4632</span>      if (secondaryRegion != null) {<a name="line.4632"></a>
-<span class="sourceLineNo">4633</span>        HBaseTestingUtility.closeRegionAndWAL(secondaryRegion);<a name="line.4633"></a>
-<span class="sourceLineNo">4634</span>      }<a name="line.4634"></a>
-<span class="sourceLineNo">4635</span>    }<a name="line.4635"></a>
-<span class="sourceLineNo">4636</span>  }<a name="line.4636"></a>
-<span class="sourceLineNo">4637</span><a name="line.4637"></a>
-<span class="sourceLineNo">4638</span>  static WALFactory createWALFactory(Configuration conf, Path rootDir) throws IOException {<a name="line.4638"></a>
-<span class="sourceLineNo">4639</span>    Configuration confForWAL = new Configuration(conf);<a name="line.4639"></a>
-<span class="sourceLineNo">4640</span>    confForWAL.set(HConstants.HBASE_DIR, rootDir.toString());<a name="line.4640"></a>
-<span class="sourceLineNo">4641</span>    return new WALFactory(confForWAL, "hregion-" + RandomStringUtils.randomNumeric(8));<a name="line.4641"></a>
-<span class="sourceLineNo">4642</span>  }<a name="line.4642"></a>
-<span class="sourceLineNo">4643</span><a name="line.4643"></a>
-<span class="sourceLineNo">4644</span>  @Test<a name="line.4644"></a>
-<span class="sourceLineNo">4645</span>  public void testCompactionFromPrimary() throws IOException {<a name="line.4645"></a>
-<span class="sourceLineNo">4646</span>    Path rootDir = new Path(dir + name.getMethodName());<a name="line.4646"></a>
-<span class="sourceLineNo">4647</span>    FSUtils.setRootDir(TEST_UTIL.getConfiguration(), rootDir);<a name="line.4647"></a>
-<span class="sourceLineNo">4648</span><a name="line.4648"></a>
-<span class="sourceLineNo">4649</span>    byte[][] families = new byte[][] {<a name="line.4649"></a>
-<span class="sourceLineNo">4650</span>        Bytes.toBytes("cf1"), Bytes.toBytes("cf2"), Bytes.toBytes("cf3")<a name="line.4650"></a>
-<span class="sourceLineNo">4651</span>    };<a name="line.4651"></a>
-<span class="sourceLineNo">4652</span>    byte[] cq = Bytes.toBytes("cq");<a name="line.4652"></a>
-<span class="sourceLineNo">4653</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.4653"></a>
-<span class="sourceLineNo">4654</span>    for (byte[] family : families) {<a name="line.4654"></a>
-<span class="sourceLineNo">4655</span>      htd.addFamily(new HColumnDescriptor(family));<a name="line.4655"></a>
-<span class="sourceLineNo">4656</span>    }<a name="line.4656"></a>
-<span class="sourceLineNo">4657</span><a name="line.4657"></a>
-<span class="sourceLineNo">4658</span>    long time = System.currentTimeMillis();<a name="line.4658"></a>
-<span class="sourceLineNo">4659</span>    HRegionInfo primaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4659"></a>
-<span class="sourceLineNo">4660</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4660"></a>
-<span class="sourceLineNo">4661</span>      false, time, 0);<a name="line.4661"></a>
-<span class="sourceLineNo">4662</span>    HRegionInfo secondaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4662"></a>
-<span class="sourceLineNo">4663</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4663"></a>
-<span class="sourceLineNo">4664</span>      false, time, 1);<a name="line.4664"></a>
-<span class="sourceLineNo">4665</span><a name="line.4665"></a>
-<span class="sourceLineNo">4666</span>    HRegion primaryRegion = null, secondaryRegion = null;<a name="line.4666"></a>
+<span class="sourceLineNo">4619</span>    try {<a name="line.4619"></a>
+<span class="sourceLineNo">4620</span>      primaryRegion = HBaseTestingUtility.createRegionAndWAL(primaryHri,<a name="line.4620"></a>
+<span class="sourceLineNo">4621</span>          rootDir, TEST_UTIL.getConfiguration(), htd);<a name="line.4621"></a>
+<span class="sourceLineNo">4622</span><a name="line.4622"></a>
+<span class="sourceLineNo">4623</span>      // load some data<a name="line.4623"></a>
+<span class="sourceLineNo">4624</span>      putData(primaryRegion, 0, 1000, cq, families);<a name="line.4624"></a>
+<span class="sourceLineNo">4625</span><a name="line.4625"></a>
+<span class="sourceLineNo">4626</span>      // flush region<a name="line.4626"></a>
+<span class="sourceLineNo">4627</span>      primaryRegion.flush(true);<a name="line.4627"></a>
+<span class="sourceLineNo">4628</span><a name="line.4628"></a>
+<span class="sourceLineNo">4629</span>      // open secondary region<a name="line.4629"></a>
+<span class="sourceLineNo">4630</span>      secondaryRegion = HRegion.openHRegion(rootDir, secondaryHri, htd, null, CONF);<a name="line.4630"></a>
+<span class="sourceLineNo">4631</span><a name="line.4631"></a>
+<span class="sourceLineNo">4632</span>      try {<a name="line.4632"></a>
+<span class="sourceLineNo">4633</span>        putData(secondaryRegion, 0, 1000, cq, families);<a name="line.4633"></a>
+<span class="sourceLineNo">4634</span>        fail("Should have thrown exception");<a name="line.4634"></a>
+<span class="sourceLineNo">4635</span>      } catch (IOException ex) {<a name="line.4635"></a>
+<span class="sourceLineNo">4636</span>        // expected<a name="line.4636"></a>
+<span class="sourceLineNo">4637</span>      }<a name="line.4637"></a>
+<span class="sourceLineNo">4638</span>    } finally {<a name="line.4638"></a>
+<span class="sourceLineNo">4639</span>      if (primaryRegion != null) {<a name="line.4639"></a>
+<span class="sourceLineNo">4640</span>        HBaseTestingUtility.closeRegionAndWAL(primaryRegion);<a name="line.4640"></a>
+<span class="sourceLineNo">4641</span>      }<a name="line.4641"></a>
+<span class="sourceLineNo">4642</span>      if (secondaryRegion != null) {<a name="line.4642"></a>
+<span class="sourceLineNo">4643</span>        HBaseTestingUtility.closeRegionAndWAL(secondaryRegion);<a name="line.4643"></a>
+<span class="sourceLineNo">4644</span>      }<a name="line.4644"></a>
+<span class="sourceLineNo">4645</span>    }<a name="line.4645"></a>
+<span class="sourceLineNo">4646</span>  }<a name="line.4646"></a>
+<span class="sourceLineNo">4647</span><a name="line.4647"></a>
+<span class="sourceLineNo">4648</span>  static WALFactory createWALFactory(Configuration conf, Path rootDir) throws IOException {<a name="line.4648"></a>
+<span class="sourceLineNo">4649</span>    Configuration confForWAL = new Configuration(conf);<a name="line.4649"></a>
+<span class="sourceLineNo">4650</span>    confForWAL.set(HConstants.HBASE_DIR, rootDir.toString());<a name="line.4650"></a>
+<span class="sourceLineNo">4651</span>    return new WALFactory(confForWAL, "hregion-" + RandomStringUtils.randomNumeric(8));<a name="line.4651"></a>
+<span class="sourceLineNo">4652</span>  }<a name="line.4652"></a>
+<span class="sourceLineNo">4653</span><a name="line.4653"></a>
+<span class="sourceLineNo">4654</span>  @Test<a name="line.4654"></a>
+<span class="sourceLineNo">4655</span>  public void testCompactionFromPrimary() throws IOException {<a name="line.4655"></a>
+<span class="sourceLineNo">4656</span>    Path rootDir = new Path(dir + name.getMethodName());<a name="line.4656"></a>
+<span class="sourceLineNo">4657</span>    FSUtils.setRootDir(TEST_UTIL.getConfiguration(), rootDir);<a name="line.4657"></a>
+<span class="sourceLineNo">4658</span><a name="line.4658"></a>
+<span class="sourceLineNo">4659</span>    byte[][] families = new byte[][] {<a name="line.4659"></a>
+<span class="sourceLineNo">4660</span>        Bytes.toBytes("cf1"), Bytes.toBytes("cf2"), Bytes.toBytes("cf3")<a name="line.4660"></a>
+<span class="sourceLineNo">4661</span>    };<a name="line.4661"></a>
+<span class="sourceLineNo">4662</span>    byte[] cq = Bytes.toBytes("cq");<a name="line.4662"></a>
+<span class="sourceLineNo">4663</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.4663"></a>
+<span class="sourceLineNo">4664</span>    for (byte[] family : families) {<a name="line.4664"></a>
+<span class="sourceLineNo">4665</span>      htd.addFamily(new HColumnDescriptor(family));<a name="line.4665"></a>
+<span class="sourceLineNo">4666</span>    }<a name="line.4666"></a>
 <span class="sourceLineNo">4667</span><a name="line.4667"></a>
-<span class="sourceLineNo">4668</span>    try {<a name="line.4668"></a>
-<span class="sourceLineNo">4669</span>      primaryRegion = HBaseTestingUtility.createRegionAndWAL(primaryHri,<a name="line.4669"></a>
-<span class="sourceLineNo">4670</span>          rootDir, TEST_UTIL.getConfiguration(), htd);<a name="line.4670"></a>
-<span class="sourceLineNo">4671</span><a name="line.4671"></a>
-<span class="sourceLineNo">4672</span>      // load some data<a name="line.4672"></a>
-<span class="sourceLineNo">4673</span>      putData(primaryRegion, 0, 1000, cq, families);<a name="line.4673"></a>
-<span class="sourceLineNo">4674</span><a name="line.4674"></a>
-<span class="sourceLineNo">4675</span>      // flush region<a name="line.4675"></a>
-<span class="sourceLineNo">4676</span>      primaryRegion.flush(true);<a name="line.4676"></a>
+<span class="sourceLineNo">4668</span>    long time = System.currentTimeMillis();<a name="line.4668"></a>
+<span class="sourceLineNo">4669</span>    HRegionInfo primaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4669"></a>
+<span class="sourceLineNo">4670</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4670"></a>
+<span class="sourceLineNo">4671</span>      false, time, 0);<a name="line.4671"></a>
+<span class="sourceLineNo">4672</span>    HRegionInfo secondaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4672"></a>
+<span class="sourceLineNo">4673</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4673"></a>
+<span class="sourceLineNo">4674</span>      false, time, 1);<a name="line.4674"></a>
+<span class="sourceLineNo">4675</span><a name="line.4675"></a>
+<span class="sourceLineNo">4676</span>    HRegion primaryRegion = null, secondaryRegion = null;<a name="line.4676"></a>
 <span class="sourceLineNo">4677</span><a name="line.4677"></a>
-<span class="sourceLineNo">4678</span>      // open secondary region<a name="line.4678"></a>
-<span class="sourceLineNo">4679</span>      secondaryRegion = HRegion.openHRegion(rootDir, secondaryHri, htd, null, CONF);<a name="line.4679"></a>
-<span class="sourceLineNo">4680</span><a name="line.4680"></a>
-<span class="sourceLineNo">4681</span>      // move the file of the primary region to the archive, simulating a compaction<a name="line.4681"></a>
-<span class="sourceLineNo">4682</span>      Collection&lt;HStoreFile&gt; storeFiles = primaryRegion.getStore(families[0]).getStorefiles();<a name="line.4682"></a>
-<span class="sourceLineNo">4683</span>      primaryRegion.getRegionFileSystem().removeStoreFiles(Bytes.toString(families[0]), storeFiles);<a name="line.4683"></a>
-<span class="sourceLineNo">4684</span>      Collection&lt;StoreFileInfo&gt; storeFileInfos = primaryRegion.getRegionFileSystem()<a name="line.4684"></a>
-<span class="sourceLineNo">4685</span>          .getStoreFiles(families[0]);<a name="line.4685"></a>
-<span class="sourceLineNo">4686</span>      Assert.assertTrue(storeFileInfos == null || storeFileInfos.isEmpty());<a name="line.4686"></a>
+<span class="sourceLineNo">4678</span>    try {<a name="line.4678"></a>
+<span class="sourceLineNo">4679</span>      primaryRegion = HBaseTestingUtility.createRegionAndWAL(primaryHri,<a name="line.4679"></a>
+<span class="sourceLineNo">4680</span>          rootDir, TEST_UTIL.getConfiguration(), htd);<a name="line.4680"></a>
+<span class="sourceLineNo">4681</span><a name="line.4681"></a>
+<span class="sourceLineNo">4682</span>      // load some data<a name="line.4682"></a>
+<span class="sourceLineNo">4683</span>      putData(primaryRegion, 0, 1000, cq, families);<a name="line.4683"></a>
+<span class="sourceLineNo">4684</span><a name="line.4684"></a>
+<span class="sourceLineNo">4685</span>      // flush region<a name="line.4685"></a>
+<span class="sourceLineNo">4686</span>      primaryRegion.flush(true);<a name="line.4686"></a>
 <span class="sourceLineNo">4687</span><a name="line.4687"></a>
-<span class="sourceLineNo">4688</span>      verifyData(secondaryRegion, 0, 1000, cq, families);<a name="line.4688"></a>
-<span class="sourceLineNo">4689</span>    } finally {<a name="line.4689"></a>
-<span class="sourceLineNo">4690</span>      if (primaryRegion != null) {<a name="line.4690"></a>
-<span class="sourceLineNo">4691</span>        HBaseTestingUtility.closeRegionAndWAL(primaryRegion);<a name="line.4691"></a>
-<span class="sourceLineNo">4692</span>      }<a name="line.4692"></a>
-<span class="sourceLineNo">4693</span>      if (secondaryRegion != null) {<a name="line.4693"></a>
-<span class="sourceLineNo">4694</span>        HBaseTestingUtility.closeRegionAndWAL(secondaryRegion);<a name="line.4694"></a>
-<span class="sourceLineNo">4695</span>      }<a name="line.4695"></a>
-<span class="sourceLineNo">4696</span>    }<a name="line.4696"></a>
-<span class="sourceLineNo">4697</span>  }<a name="line.4697"></a>
-<span class="sourceLineNo">4698</span><a name="line.4698"></a>
-<span class="sourceLineNo">4699</span>  private void putData(int startRow, int numRows, byte[] qf, byte[]... families) throws<a name="line.4699"></a>
-<span class="sourceLineNo">4700</span>      IOException {<a name="line.4700"></a>
-<span class="sourceLineNo">4701</span>    putData(this.region, startRow, numRows, qf, families);<a name="line.4701"></a>
-<span class="sourceLineNo">4702</span>  }<a name="line.4702"></a>
-<span class="sourceLineNo">4703</span><a name="line.4703"></a>
-<span class="sourceLineNo">4704</span>  private void putData(HRegion region,<a name="line.4704"></a>
-<span class="sourceLineNo">4705</span>      int startRow, int numRows, byte[] qf, byte[]... families) throws IOException {<a name="line.4705"></a>
-<span class="sourceLineNo">4706</span>    putData(region, Durability.SKIP_WAL, startRow, numRows, qf, families);<a name="line.4706"></a>
+<span class="sourceLineNo">4688</span>      // open secondary region<a name="line.4688"></a>
+<span class="sourceLineNo">4689</span>      secondaryRegion = HRegion.openHRegion(rootDir, secondaryHri, htd, null, CONF);<a name="line.4689"></a>
+<span class="sourceLineNo">4690</span><a name="line.4690"></a>
+<span class="sourceLineNo">4691</span>      // move the file of the primary region to the archive, simulating a compaction<a name="line.4691"></a>
+<span class="sourceLineNo">4692</span>      Collection&lt;HStoreFile&gt; storeFiles = primaryRegion.getStore(families[0]).getStorefiles();<a name="line.4692"></a>
+<span class="sourceLineNo">4693</span>      primaryRegion.getRegionFileSystem().removeStoreFiles(Bytes.toString(families[0]), storeFiles);<a name="line.4693"></a>
+<span class="sourceLineNo">4694</span>      Collection&lt;StoreFileInfo&gt; storeFileInfos = primaryRegion.getRegionFileSystem()<a name="line.4694"></a>
+<span class="sourceLineNo">4695</span>          .getStoreFiles(families[0]);<a name="line.4695"></a>
+<span class="sourceLineNo">4696</span>      Assert.assertTrue(storeFileInfos == null || storeFileInfos.isEmpty());<a name="line.4696"></a>
+<span class="sourceLineNo">4697</span><a name="line.4697"></a>
+<span class="sourceLineNo">4698</span>      verifyData(secondaryRegion, 0, 1000, cq, families);<a name="line.4698"></a>
+<span class="sourceLineNo">4699</span>    } finally {<a name="line.4699"></a>
+<span class="sourceLineNo">4700</span>      if (primaryRegion != null) {<a name="line.4700"></a>
+<span class="sourceLineNo">4701</span>        HBaseTestingUtility.closeRegionAndWAL(primaryRegion);<a name="line.4701"></a>
+<span class="sourceLineNo">4702</span>      }<a name="line.4702"></a>
+<span class="sourceLineNo">4703</span>      if (secondaryRegion != null) {<a name="line.4703"></a>
+<span class="sourceLineNo">4704</span>        HBaseTestingUtility.closeRegionAndWAL(secondaryRegion);<a name="line.4704"></a>
+<span class="sourceLineNo">4705</span>      }<a name="line.4705"></a>
+<span class="sourceLineNo">4706</span>    }<a name="line.4706"></a>
 <span class="sourceLineNo">4707</span>  }<a name="line.4707"></a>
 <span class="sourceLineNo">4708</span><a name="line.4708"></a>
-<span class="sourceLineNo">4709</span>  static void putData(HRegion region, Durability durability,<a name="line.4709"></a>
-<span class="sourceLineNo">4710</span>      int startRow, int numRows, byte[] qf, byte[]... families) throws IOException {<a name="line.4710"></a>
-<span class="sourceLineNo">4711</span>    for (int i = startRow; i &lt; startRow + numRows; i++) {<a name="line.4711"></a>
-<span class="sourceLineNo">4712</span>      Put put = new Put(Bytes.toBytes("" + i));<a name="line.4712"></a>
-<span class="sourceLineNo">4713</span>      put.setDurability(durability);<a name="line.4713"></a>
-<span class="sourceLineNo">4714</span>      for (byte[] family : families) {<a name="line.4714"></a>
-<span class="sourceLineNo">4715</span>        put.addColumn(family, qf, null);<a name="line.4715"></a>
-<span class="sourceLineNo">4716</span>      }<a name="line.4716"></a>
-<span class="sourceLineNo">4717</span>      region.put(put);<a name="line.4717"></a>
-<span class="sourceLineNo">4718</span>      LOG.info(put.toString());<a name="line.4718"></a>
-<span class="sourceLineNo">4719</span>    }<a name="line.4719"></a>
-<span class="sourceLineNo">4720</span>  }<a name="line.4720"></a>
-<span class="sourceLineNo">4721</span><a name="line.4721"></a>
-<span class="sourceLineNo">4722</span>  static void verifyData(HRegion newReg, int startRow, int numRows, byte[] qf, byte[]... families)<a name="line.4722"></a>
-<span class="sourceLineNo">4723</span>      throws IOException {<a name="line.4723"></a>
-<span class="sourceLineNo">4724</span>    for (int i = startRow; i &lt; startRow + numRows; i++) {<a name="line.4724"></a>
-<span class="sourceLineNo">4725</span>      byte[] row = Bytes.toBytes("" + i);<a name="line.4725"></a>
-<span class="sourceLineNo">4726</span>      Get get = new Get(row);<a name="line.4726"></a>
-<span class="sourceLineNo">4727</span>      for (byte[] family : families) {<a name="line.4727"></a>
-<span class="sourceLineNo">4728</span>        get.addColumn(family, qf);<a name="line.4728"></a>
-<span class="sourceLineNo">4729</span>      }<a name="line.4729"></a>
-<span class="sourceLineNo">4730</span>      Result result = newReg.get(get);<a name="line.4730"></a>
-<span class="sourceLineNo">4731</span>      Cell[] raw = result.rawCells();<a name="line.4731"></a>
-<span class="sourceLineNo">4732</span>      assertEquals(families.length, result.size());<a name="line.4732"></a>
-<span class="sourceLineNo">4733</span>      for (int j = 0; j &lt; families.length; j++) {<a name="line.4733"></a>
-<span class="sourceLineNo">4734</span>        assertTrue(CellUtil.matchingRows(raw[j], row));<a name="line.4734"></a>
-<span class="sourceLineNo">4735</span>        assertTrue(CellUtil.matchingFamily(raw[j], families[j]));<a name="line.4735"></a>
-<span class="sourceLineNo">4736</span>        assertTrue(CellUtil.matchingQualifier(raw[j], qf));<a name="line.4736"></a>
-<span class="sourceLineNo">4737</span>      }<a name="line.4737"></a>
-<span class="sourceLineNo">4738</span>    }<a name="line.4738"></a>
-<span class="sourceLineNo">4739</span>  }<a name="line.4739"></a>
-<span class="sourceLineNo">4740</span><a name="line.4740"></a>
-<span class="sourceLineNo">4741</span>  static void assertGet(final HRegion r, final byte[] family, final byte[] k) throws IOException {<a name="line.4741"></a>
-<span class="sourceLineNo">4742</span>    // Now I have k, get values out and assert they are as expected.<a name="line.4742"></a>
-<span class="sourceLineNo">4743</span>    Get get = new Get(k).addFamily(family).readAllVersions();<a name="line.4743"></a>
-<span class="sourceLineNo">4744</span>    Cell[] results = r.get(get).rawCells();<a name="line.4744"></a>
-<span class="sourceLineNo">4745</span>    for (int j = 0; j &lt; results.length; j++) {<a name="line.4745"></a>
-<span class="sourceLineNo">4746</span>      byte[] tmp = CellUtil.cloneValue(results[j]);<a name="line.4746"></a>
-<span class="sourceLineNo">4747</span>      // Row should be equal to value every time.<a name="line.4747"></a>
-<span class="sourceLineNo">4748</span>      assertTrue(Bytes.equals(k, tmp));<a name="line.4748"></a>
-<span class="sourceLineNo">4749</span>    }<a name="line.4749"></a>
-<span class="sourceLineNo">4750</span>  }<a name="line.4750"></a>
-<span class="sourceLineNo">4751</span><a name="line.4751"></a>
-<span class="sourceLineNo">4752</span>  /*<a name="line.4752"></a>
-<span class="sourceLineNo">4753</span>   * Assert first value in the passed region is &lt;code&gt;firstValue&lt;/code&gt;.<a name="line.4753"></a>
-<span class="sourceLineNo">4754</span>   *<a name="line.4754"></a>
-<span class="sourceLineNo">4755</span>   * @param r<a name="line.4755"></a>
-<span class="sourceLineNo">4756</span>   *<a name="line.4756"></a>
-<span class="sourceLineNo">4757</span>   * @param fs<a name="line.4757"></a>
-<span class="sourceLineNo">4758</span>   *<a name="line.4758"></a>
-<span class="sourceLineNo">4759</span>   * @param firstValue<a name="line.4759"></a>
-<span class="sourceLineNo">4760</span>   *<a name="line.4760"></a>
-<span class="sourceLineNo">4761</span>   * @throws IOException<a name="line.4761"></a>
-<span class="sourceLineNo">4762</span>   */<a name="line.4762"></a>
-<span class="sourceLineNo">4763</span>  protected void assertScan(final HRegion r, final byte[] fs, final byte[] firstValue)<a name="line.4763"></a>
-<span class="sourceLineNo">4764</span>      throws IOException {<a name="line.4764"></a>
-<span class="sourceLineNo">4765</span>    byte[][] families = { fs };<a name="line.4765"></a>
-<span class="sourceLineNo">4766</span>    Scan scan = new Scan();<a name="line.4766"></a>
-<span class="sourceLineNo">4767</span>    for (int i = 0; i &lt; families.length; i++)<a name="line.4767"></a>
-<span class="sourceLineNo">4768</span>      scan.addFamily(families[i]);<a name="line.4768"></a>
-<span class="sourceLineNo">4769</span>    InternalScanner s = r.getScanner(scan);<a name="line.4769"></a>
-<span class="sourceLineNo">4770</span>    try {<a name="line.4770"></a>
-<span class="sourceLineNo">4771</span>      List&lt;Cell&gt; curVals = new ArrayList&lt;&gt;();<a name="line.4771"></a>
-<span class="sourceLineNo">4772</span>      boolean first = true;<a name="line.4772"></a>
-<span class="sourceLineNo">4773</span>      OUTER_LOOP: while (s.next(curVals)) {<a name="line.4773"></a>
-<span class="sourceLineNo">4774</span>        for (Cell kv : curVals) {<a name="line.4774"></a>
-<span class="sourceLineNo">4775</span>          byte[] val = CellUtil.cloneValue(kv);<a name="line.4775"></a>
-<span class="sourceLineNo">4776</span>          byte[] curval = val;<a name="line.4776"></a>
-<span class="sourceLineNo">4777</span>          if (first) {<a name="line.4777"></a>
-<span class="sourceLineNo">4778</span>            first = false;<a name="line.4778"></a>
-<span class="sourceLineNo">4779</span>            assertTrue(Bytes.compareTo(curval, firstValue) == 0);<a name="line.4779"></a>
-<span class="sourceLineNo">4780</span>          } else {<a name="line.4780"></a>
-<span class="sourceLineNo">4781</span>            // Not asserting anything. Might as well break.<a name="line.4781"></a>
-<span class="sourceLineNo">4782</span>            break OUTER_LOOP;<a name="line.4782"></a>
-<span class="sourceLineNo">4783</span>          }<a name="line.4783"></a>
-<span class="sourceLineNo">4784</span>        }<a name="line.4784"></a>
-<span class="sourceLineNo">4785</span>      }<a name="line.4785"></a>
-<span class="sourceLineNo">4786</span>    } finally {<a name="line.4786"></a>
-<span class="sourceLineNo">4787</span>      s.close();<a name="line.4787"></a>
-<span class="sourceLineNo">4788</span>    }<a name="line.4788"></a>
-<span class="sourceLineNo">4789</span>  }<a name="line.4789"></a>
-<span class="sourceLineNo">4790</span><a name="line.4790"></a>
-<span class="sourceLineNo">4791</span>  /**<a name="line.4791"></a>
-<span class="sourceLineNo">4792</span>   * Test that we get the expected flush results back<a name="line.4792"></a>
-<span class="sourceLineNo">4793</span>   */<a name="line.4793"></a>
-<span class="sourceLineNo">4794</span>  @Test<a name="line.4794"></a>
-<span class="sourceLineNo">4795</span>  public void testFlushResult() throws IOException {<a name="line.4795"></a>
-<span class="sourceLineNo">4796</span>    byte[] family = Bytes.toBytes("family");<a name="line.4796"></a>
-<span class="sourceLineNo">4797</span><a name="line.4797"></a>
-<span class="sourceLineNo">4798</span>    this.region = initHRegion(tableName, method, family);<a name="line.4798"></a>
-<span class="sourceLineNo">4799</span><a name="line.4799"></a>
-<span class="sourceLineNo">4800</span>    // empty memstore, flush doesn't run<a name="line.4800"></a>
-<span class="sourceLineNo">4801</span>    HRegion.FlushResult fr = region.flush(true);<a name="line.4801"></a>
-<span class="sourceLineNo">4802</span>    assertFalse(fr.isFlushSucceeded());<a name="line.4802"></a>
-<span class="sourceLineNo">4803</span>    assertFalse(fr.isCompactionNeeded());<a name="line.4803"></a>
-<span class="sourceLineNo">4804</span><a name="line.4804"></a>
-<span class="sourceLineNo">4805</span>    // Flush enough files to get up to the threshold, doesn't need compactions<a name="line.4805"></a>
-<span class="sourceLineNo">4806</span>    for (int i = 0; i &lt; 2; i++) {<a name="line.4806"></a>
-<span class="sourceLineNo">4807</span>      Put put = new Put(tableName.toBytes()).addColumn(family, family, tableName.toBytes());<a name="line.4807"></a>
-<span class="sourceLineNo">4808</span>      region.put(put);<a name="line.4808"></a>
-<span class="sourceLineNo">4809</span>      fr = region.flush(true);<a name="line.4809"></a>
-<span class="sourceLineNo">4810</span>      assertTrue(fr.isFlushSucceeded());<a name="line.4810"></a>
-<span class="sourceLineNo">4811</span>      assertFalse(fr.isCompactionNeeded());<a name="line.4811"></a>
-<span class="sourceLineNo">4812</span>    }<a name="line.4812"></a>
-<span class="sourceLineNo">4813</span><a name="line.4813"></a>
-<span class="sourceLineNo">4814</span>    // Two flushes after the threshold, compactions are needed<a name="line.4814"></a>
-<span class="sourceLineNo">4815</span>    for (int i = 0; i &lt; 2; i++) {<a name="line.4815"></a>
-<span class="sourceLineNo">4816</span>      Put put = new Put(tableName.toBytes()).addColumn(family, family, tableName.toBytes());<a name="line.4816"></a>
-<span class="sourceLineNo">4817</span>      region.put(put);<a name="line.4817"></a>
-<span class="sourceLineNo">4818</span>      fr = region.flush(true);<a name="line.4818"></a>
-<span class="sourceLineNo">4819</span>      assertTrue(fr.isFlushSucceeded());<a name="line.4819"></a>
-<span class="sourceLineNo">4820</span>      assertTrue(fr.isCompactionNeeded());<a name="line.4820"></a>
-<span class="sourceLineNo">4821</span>    }<a name="line.4821"></a>
-<span class="sourceLineNo">4822</span>  }<a name="line.4822"></a>
+<span class="sourceLineNo">4709</span>  private void putData(int startRow, int numRows, byte[] qf, byte[]... families) throws<a name="line.4709"></a>
+<span class="sourceLineNo">4710</span>      IOException {<a name="line.4710"></a>
+<span class="sourceLineNo">4711</span>    putData(this.region, startRow, numRows, qf, families);<a name="line.4711"></a>
+<span class="sourceLineNo">4712</span>  }<a name="line.4712"></a>
+<span class="sourceLineNo">4713</span><a name="line.4713"></a>
+<span class="sourceLineNo">4714</span>  private void putData(HRegion region,<a name="line.4714"></a>
+<span class="sourceLineNo">4715</span>      int startRow, int numRows, byte[] qf, byte[]... families) throws IOException {<a name="line.4715"></a>
+<span class="sourceLineNo">4716</span>    putData(region, Durability.SKIP_WAL, startRow, numRows, qf, families);<a name="line.4716"></a>
+<span class="sourceLineNo">4717</span>  }<a name="line.4717"></a>
+<span class="sourceLineNo">4718</span><a name="line.4718"></a>
+<span class="sourceLineNo">4719</span>  static void putData(HRegion region, Durability durability,<a name="line.4719"></a>
+<span class="sourceLineNo">4720</span>      int startRow, int numRows, byte[] qf, byte[]... families) throws IOException {<a name="line.4720"></a>
+<span class="sourceLineNo">4721</span>    for (int i = startRow; i &lt; startRow + numRows; i++) {<a name="line.4721"></a>
+<span class="sourceLineNo">4722</span>      Put put = new Put(Bytes.toBytes("" + i));<a name="line.4722"></a>
+<span class="sourceLineNo">4723</span>      put.setDurability(durability);<a name="line.4723"></a>
+<span class="sourceLineNo">4724</span>      for (byte[] family : families) {<a name="line.4724"></a>
+<span class="sourceLineNo">4725</span>        put.addColumn(family, qf, null);<a name="line.4725"></a>
+<span class="sourceLineNo">4726</span>      }<a name="line.4726"></a>
+<span class="sourceLineNo">4727</span>      region.put(put);<a name="line.4727"></a>
+<span class="sourceLineNo">4728</span>      LOG.info(put.toString());<a name="line.4728"></a>
+<span class="sourceLineNo">4729</span>    }<a name="line.4729"></a>
+<span class="sourceLineNo">4730</span>  }<a name="line.4730"></a>
+<span class="sourceLineNo">4731</span><a name="line.4731"></a>
+<span class="sourceLineNo">4732</span>  static void verifyData(HRegion newReg, int startRow, int numRows, byte[] qf, byte[]... families)<a name="line.4732"></a>
+<span class="sourceLineNo">4733</span>      throws IOException {<a name="line.4733"></a>
+<span class="sourceLineNo">4734</span>    for (int i = startRow; i &lt; startRow + numRows; i++) {<a name="line.4734"></a>
+<span class="sourceLineNo">4735</span>      byte[] row = Bytes.toBytes("" + i);<a name="line.4735"></a>
+<span class="sourceLineNo">4736</span>      Get get = new Get(row);<a name="line.4736"></a>
+<span class="sourceLineNo">4737</span>      for (byte[] family : families) {<a name="line.4737"></a>
+<span class="sourceLineNo">4738</span>        get.addColumn(family, qf);<a name="line.4738"></a>
+<span class="sourceLineNo">4739</span>      }<a name="line.4739"></a>
+<span class="sourceLineNo">4740</span>      Result result = newReg.get(get);<a name="line.4740"></a>
+<span class="sourceLineNo">4741</span>      Cell[] raw = result.rawCells();<a name="line.4741"></a>
+<span class="sourceLineNo">4742</span>      assertEquals(families.length, result.size());<a name="line.4742"></a>
+<span class="sourceLineNo">4743</span>      for (int j = 0; j &lt; families.length; j++) {<a name="line.4743"></a>
+<span class="sourceLineNo">4744</span>        assertTrue(CellUtil.matchingRows(raw[j], row));<a name="line.4744"></a>
+<span class="sourceLineNo">4745</span>        assertTrue(CellUtil.matchingFamily(raw[j], families[j]));<a name="line.4745"></a>
+<span class="sourceLineNo">4746</span>        assertTrue(CellUtil.matchingQualifier(raw[j], qf));<a name="line.4746"></a>
+<span class="sourceLineNo">4747</span>      }<a name="line.4747"></a>
+<span class="sourceLineNo">4748</span>    }<a name="line.4748"></a>
+<span class="sourceLineNo">4749</span>  }<a name="line.4749"></a>
+<span class="sourceLineNo">4750</span><a name="line.4750"></a>
+<span class="sourceLineNo">4751</span>  static void assertGet(final HRegion r, final byte[] family, final byte[] k) throws IOException {<a name="line.4751"></a>
+<span class="sourceLineNo">4752</span>    // Now I have k, get values out and assert they are as expected.<a name="line.4752"></a>
+<span class="sourceLineNo">4753</span>    Get get = new Get(k).addFamily(family).readAllVersions();<a name="line.4753"></a>
+<span class="sourceLineNo">4754</span>    Cell[] results = r.get(get).rawCells();<a name="line.4754"></a>
+<span class="sourceLineNo">4755</span>    for (int j = 0; j &lt; results.length; j++) {<a name="line.4755"></a>
+<span class="sourceLineNo">4756</span>      byte[] tmp = CellUtil.cloneValue(results[j]);<a name="line.4756"></a>
+<span class="sourceLineNo">4757</span>      // Row should be equal to value every time.<a name="line.4757"></a>
+<span class="sourceLineNo">4758</span>      assertTrue(Bytes.equals(k, tmp));<a name="line.4758"></a>
+<span class="sourceLineNo">4759</span>    }<a name="line.4759"></a>
+<span class="sourceLineNo">4760</span>  }<a name="line.4760"></a>
+<span class="sourceLineNo">4761</span><a name="line.4761"></a>
+<span class="sourceLineNo">4762</span>  /*<a name="line.4762"></a>
+<span class="sourceLineNo">4763</span>   * Assert first value in the passed region is &lt;code&gt;firstValue&lt;/code&gt;.<a name="line.4763"></a>
+<span class="sourceLineNo">4764</span>   *<a name="line.4764"></a>
+<span class="sourceLineNo">4765</span>   * @param r<a name="line.4765"></a>
+<span class="sourceLineNo">4766</span>   *<a name="line.4766"></a>
+<span class="sourceLineNo">4767</span>   * @param fs<a name="line.4767"></a>
+<span class="sourceLineNo">4768</span>   *<a name="line.4768"></a>
+<span class="sourceLineNo">4769</span>   * @param firstValue<a name="line.4769"></a>
+<span class="sourceLineNo">4770</span>   *<a name="line.4770"></a>
+<span class="sourceLineNo">4771</span>   * @throws IOException<a name="line.4771"></a>
+<span class="sourceLineNo">4772</span>   */<a name="line.4772"></a>
+<span class="sourceLineNo">4773</span>  protected void assertScan(final HRegion r, final byte[] fs, final byte[] firstValue)<a name="line.4773"></a>
+<span class="sourceLineNo">4774</span>      throws IOException {<a name="line.4774"></a>
+<span class="sourceLineNo">4775</span>    byte[][] families = { fs };<a name="line.4775"></a>
+<span class="sourceLineNo">4776</span>    Scan scan = new Scan();<a name="line.4776"></a>
+<span class="sourceLineNo">4777</span>    for (int i = 0; i &lt; families.length; i++)<a name="line.4777"></a>
+<span class="sourceLineNo">4778</span>      scan.addFamily(families[i]);<a name="line.4778"></a>
+<span class="sourceLineNo">4779</span>    InternalScanner s = r.getScanner(scan);<a name="line.4779"></a>
+<span class="sourceLineNo">4780</span>    try {<a name="line.4780"></a>
+<span class="sourceLineNo">4781</span>      List&lt;Cell&gt; curVals = new ArrayList&lt;&gt;();<a name="line.4781"></a>
+<span class="sourceLineNo">4782</span>      boolean first = true;<a name="line.4782"></a>
+<span class="sourceLineNo">4783</span>      OUTER_LOOP: while (s.next(curVals)) {<a name="line.4783"></a>
+<span class="sourceLineNo">4784</span>        for (Cell kv : curVals) {<a name="line.4784"></a>
+<span class="sourceLineNo">4785</span>          byte[] val = CellUtil.cloneValue(kv);<a name="line.4785"></a>
+<span class="sourceLineNo">4786</span>          byte[] curval = val;<a name="line.4786"></a>
+<span class="sourceLineNo">4787</span>          if (first) {<a name="line.4787"></a>
+<span class="sourceLineNo">4788</span>            first = false;<a name="line.4788"></a>
+<span class="sourceLineNo">4789</span>            assertTrue(Bytes.compareTo(curval, firstValue) == 0);<a name="line.4789"></a>
+<span class="sourceLineNo">4790</span>          } else {<a name="line.4790"></a>
+<span class="sourceLineNo">4791</span>            // Not asserting anything. Might as well break.<a name="line.4791"></a>
+<span class="sourceLineNo">4792</span>            break OUTER_LOOP;<a name="line.4792"></a>
+<span class="sourceLineNo">4793</span>          }<a name="line.4793"></a>
+<span class="sourceLineNo">4794</span>        }<a name="line.4794"></a>
+<span class="sourceLineNo">4795</span>      }<a name="line.4795"></a>
+<span class="sourceLineNo">4796</span>    } finally {<a name="line.4796"></a>
+<span class="sourceLineNo">4797</span>      s.close();<a name="line.4797"></a>
+<span class="sourceLineNo">4798</span>    }<a name="line.4798"></a>
+<span class="sourceLineNo">4799</span>  }<a name="line.4799"></a>
+<span class="sourceLineNo">4800</span><a name="line.4800"></a>
+<span class="sourceLineNo">4801</span>  /**<a name="line.4801"></a>
+<span class="sourceLineNo">4802</span>   * Test that we get the expected flush results back<a name="line.4802"></a>
+<span class="sourceLineNo">4803</span>   */<a name="line.4803"></a>
+<span class="sourceLineNo">4804</span>  @Test<a name="line.4804"></a>
+<span class="sourceLineNo">4805</span>  public void testFlushResult() throws IOException {<a name="line.4805"></a>
+<span class="sourceLineNo">4806</span>    byte[] family = Bytes.toBytes("family");<a name="line.4806"></a>
+<span class="sourceLineNo">4807</span><a name="line.4807"></a>
+<span class="sourceLineNo">4808</span>    this.region = initHRegion(tableName, method, family);<a name="line.4808"></a>
+<span class="sourceLineNo">4809</span><a name="line.4809"></a>
+<span class="sourceLineNo">4810</span>    // empty memstore, flush doesn't run<a name="line.4810"></a>
+<span class="sourceLineNo">4811</span>    HRegion.FlushResult fr = region.flush(true);<a name="line.4811"></a>
+<span class="sourceLineNo">4812</span>    assertFalse(fr.isFlushSucceeded());<a name="line.4812"></a>
+<span class="sourceLineNo">4813</span>    assertFalse(fr.isCompactionNeeded());<a name="line.4813"></a>
+<span class="sourceLineNo">4814</span><a name="line.4814"></a>
+<span class="sourceLineNo">4815</span>    // Flush enough files to get up to the threshold, doesn't need compactions<a name="line.4815"></a>
+<span class="sourceLineNo">4816</span>    for (int i = 0; i &lt; 2; i++) {<a name="line.4816"></a>
+<span class="sourceLineNo">4817</span>      Put put = new Put(tableName.toBytes()).addColumn(family, family, tableName.toBytes());<a name="line.4817"></a>
+<span class="sourceLineNo">4818</span>      region.put(put);<a name="line.4818"></a>
+<span class="sourceLineNo">4819</span>      fr = region.flush(true);<a name="line.4819"></a>
+<span class="sourceLineNo">4820</span>      assertTrue(fr.isFlushSucceeded());<a name="line.4820"></a>
+<span class="sourceLineNo">4821</span>      assertFalse(fr.isCompactionNeeded());<a name="line.4821"></a>
+<span class="sourceLineNo">4822</span>    }<a name="line.4822"></a>
 <span class="sourceLineNo">4823</span><a name="line.4823"></a>
-<span class="sourceLineNo">4824</span>  protected Configuration initSplit() {<a name="line.4824"></a>
-<span class="sourceLineNo">4825</span>    // Always compact if there is more than one store file.<a name="line.4825"></a>
-<span class="sourceLineNo">4826</span>    CONF.setInt("hbase.hstore.compactionThreshold", 2);<a name="line.4826"></a>
-<span class="sourceLineNo">4827</span><a name="line.4827"></a>
-<span class="sourceLineNo">4828</span>    CONF.setInt(HConstants.HBASE_CLIENT_SCANNER_TIMEOUT_PERIOD, 10 * 1000);<a name="line.4828"></a>
-<span class="sourceLineNo">4829</span><a name="line.4829"></a>
-<span class="sourceLineNo">4830</span>    // Increase the amount of time between client retries<a name="line.4830"></a>
-<span class="sourceLineNo">4831</span>    CONF.setLong("hbase.client.pause", 15 * 1000);<a name="line.4831"></a>
-<span class="sourceLineNo">4832</span><a name="line.4832"></a>
-<span class="sourceLineNo">4833</span>    // This size should make it so we always split using the addContent<a name="line.4833"></a>
-<span class="sourceLineNo">4834</span>    // below. After adding all data, the first region is 1.3M<a name="line.4834"></a>
-<span class="sourceLineNo">4835</span>    CONF.setLong(HConstants.HREGION_MAX_FILESIZE, 1024 * 128);<a name="line.4835"></a>
-<span class="sourceLineNo">4836</span>    return CONF;<a name="line.4836"></a>
-<span class="sourceLineNo">4837</span>  }<a name="line.4837"></a>
-<span class="sourceLineNo">4838</span><a name="line.4838"></a>
-<span class="sourceLineNo">4839</span>  /**<a name="line.4839"></a>
-<span class="sourceLineNo">4840</span>   * @return A region on which you must call<a name="line.4840"></a>
-<span class="sourceLineNo">4841</span>   *         {@link HBaseTestingUtility#closeRegionAndWAL(HRegion)} when done.<a name="line.4841"></a>
-<span class="sourceLineNo">4842</span>   */<a name="line.4842"></a>
-<span class="sourceLineNo">4843</span>  protected HRegion initHRegion(TableName tableName, String callingMethod, Configuration conf,<a name="line.4843"></a>
-<span class="sourceLineNo">4844</span>      byte[]... families) throws IOException {<a name="line.4844"></a>
-<span class="sourceLineNo">4845</span>    return initHRegion(tableName, callingMethod, conf, false, families);<a name="line.4845"></a>
-<span class="sourceLineNo">4846</span>  }<a name="line.4846"></a>
-<span class="sourceLineNo">4847</span><a name="line.4847"></a>
-<span class="sourceLineNo">4848</span>  /**<a name="line.4848"></a>
-<span class="sourceLineNo">4849</span>   * @return A region on which you must call<a name="line.4849"></a>
-<span class="sourceLineNo">4850</span>   *         {@link HBaseTestingUtility#closeRegionAndWAL(HRegion)} when done.<a name="line.4850"></a>
-<span class="sourceLineNo">4851</span>   */<a name="line.4851"></a>
-<span class="sourceLineNo">4852</span>  protected HRegion initHRegion(TableName tableName, String callingMethod, Configuration conf,<a name="line.4852"></a>
-<span class="sourceLineNo">4853</span>      boolean isReadOnly, byte[]... families) throws IOException {<a name="line.4853"></a>
-<span class="sourceLineNo">4854</span>    return initHRegion(tableName, null, null, callingMethod, conf, isReadOnly, families);<a name="line.4854"></a>
-<span class="sourceLineNo">4855</span>  }<a name="line.4855"></a>
-<span class="sourceLineNo">4856</span><a name="line.4856"></a>
-<span class="sourceLineNo">4857</span>  protected HRegion initHRegion(TableName tableName, byte[] startKey, byte[] stopKey,<a name="line.4857"></a>
-<span class="sourceLineNo">4858</span>      String callingMethod, Configuration conf, boolean isReadOnly, byte[]... families)<a name="line.4858"></a>
-<span class="sourceLineNo">4859</span>      throws IOException {<a name="line.4859"></a>
-<span class="sourceLineNo">4860</span>    Path logDir = TEST_UTIL.getDataTestDirOnTestFS(callingMethod + ".log");<a name="line.4860"></a>
-<span class="sourceLineNo">4861</span>    ChunkCreator.initialize(MemStoreLABImpl.CHUNK_SIZE_DEFAULT, false, 0, 0, 0, null);<a name="line.4861"></a>
-<span class="sourceLineNo">4862</span>    HRegionInfo hri = new HRegionInfo(tableName, startKey, stopKey);<a name="line.4862"></a>
-<span class="sourceLineNo">4863</span>    final WAL wal = HBaseTestingUtility.createWal(conf, logDir, hri);<a name="line.4863"></a>
-<span class="sourceLineNo">4864</span>    return initHRegion(tableName, startKey, stopKey, isReadOnly,<a name="line.4864"></a>
-<span class="sourceLineNo">4865</span>        Durability.SYNC_WAL, wal, families);<a name="line.4865"></a>
-<span class="sourceLineNo">4866</span>  }<a name="line.4866"></a>
-<span class="sourceLineNo">4867</span><a name="line.4867"></a>
-<span class="sourceLineNo">4868</span>  /**<a name="line.4868"></a>
-<span class="sourceLineNo">4869</span>   * @return A region on which you must call<a name="line.4869"></a>
-<span class="sourceLineNo">4870</span>   *         {@link HBaseTestingUtility#closeRegionAndWAL(HRegion)} when done.<a name="line.4870"></a>
-<span class="sourceLineNo">4871</span>   */<a name="line.4871"></a>
-<span class="sourceLineNo">4872</span>  public HRegion initHRegion(TableName tableName, byte[] startKey, byte[] stopKey,<a name="line.4872"></a>
-<span class="sourceLineNo">4873</span>      boolean isReadOnly, Durability durability, WAL wal, byte[]... families) throws IOException {<a name="line.4873"></a>
-<span class="sourceLineNo">4874</span>    return TEST_UTIL.createLocalHRegion(tableName, startKey, stopKey,<a name="line.4874"></a>
-<span class="sourceLineNo">4875</span>        isReadOnly, durability, wal, families);<a name="line.4875"></a>
+<span class="sourceLineNo">4824</span>    // Two flushes after the threshold, compactions are needed<a name="line.4824"></a>
+<span class="sourceLineNo">4825</span>    for (int i = 0; i &lt; 2; i++) {<a name="line.4825"></a>
+<span class="sourceLineNo">4826</span>      Put put = new Put(tableName.toBytes()).addColumn(family, family, tableName.toBytes());<a name="line.4826"></a>
+<span class="sourceLineNo">4827</span>      region.put(put);<a name="line.4827"></a>
+<span class="sourceLineNo">4828</span>      fr = region.flush(true);<a name="line.4828"></a>
+<span class="sourceLineNo">4829</span>      assertTrue(fr.isFlushSucceeded());<a name="line.4829"></a>
+<span class="sourceLineNo">4830</span>      assertTrue(fr.isCompactionNeeded());<a name="line.4830"></a>
+<span class="sourceLineNo">4831</span>    }<a name="line.4831"></a>
+<span class="sourceLineNo">4832</span>  }<a name="line.4832"></a>
+<span class="sourceLineNo">4833</span><a name="line.4833"></a>
+<span class="sourceLineNo">4834</span>  protected Configuration initSplit() {<a name="line.4834"></a>
+<span class="sourceLineNo">4835</span>    // Always compact if there is more than one store file.<a name="line.4835"></a>
+<span class="sourceLineNo">4836</span>    CONF.setInt("hbase.hstore.compactionThreshold", 2);<a name="line.4836"></a>
+<span class="sourceLineNo">4837</span><a name="line.4837"></a>
+<span class="sourceLineNo">4838</span>    CONF.setInt(HConstants.HBASE_CLIENT_SCANNER_TIMEOUT_PERIOD, 10 * 1000);<a name="line.4838"></a>
+<span class="sourceLineNo">4839</span><a name="line.4839"></a>
+<span class="sourceLineNo">4840</span>    // Increase the amount of time between client retries<a name="line.4840"></a>
+<span class="sourceLineNo">4841</span>    CONF.setLong("hbase.client.pause", 15 * 1000);<a name="line.4841"></a>
+<span class="sourceLineNo">4842</span><a name="line.4842"></a>
+<span class="sourceLineNo">4843</span>    // This size should make it so we always split using the addContent<a name="line.4843"></a>
+<span class="sourceLineNo">4844</span>    // below. After adding all data, the first region is 1.3M<a name="line.4844"></a>
+<span class="sourceLineNo">4845</span>    CONF.setLong(HConstants.HREGION_MAX_FILESIZE, 1024 * 128);<a name="line.4845"></a>
+<span class="sourceLineNo">4846</span>    return CONF;<a name="line.4846"></a>
+<span class="sourceLineNo">4847</span>  }<a name="line.4847"></a>
+<span class="sourceLineNo">4848</span><a name="line.4848"></a>
+<span class="sourceLineNo">4849</span>  /**<a name="line.4849"></a>
+<span class="sourceLineNo">4850</span>   * @return A region on which you must call<a name="line.4850"></a>
+<span class="sourceLineNo">4851</span>   *         {@link HBaseTestingUtility#closeRegionAndWAL(HRegion)} when done.<a name="line.4851"></a>
+<span class="sourceLineNo">4852</span>   */<a name="line.4852"></a>
+<span class="sourceLineNo">4853</span>  protected HRegion initHRegion(TableName tableName, String callingMethod, Configuration conf,<a name="line.4853"></a>
+<span class="sourceLineNo">4854</span>      byte[]... families) throws IOException {<a name="line.4854"></a>
+<span class="sourceLineNo">4855</span>    return initHRegion(tableName, callingMethod, conf, false, families);<a name="line.4855"></a>
+<span class="sourceLineNo">4856</span>  }<a name="line.4856"></a>
+<span class="sourceLineNo">4857</span><a name="line.4857"></a>
+<span class="sourceLineNo">4858</span>  /**<a name="line.4858"></a>
+<span class="sourceLineNo">4859</span>   * @return A region on which you must call<a name="line.4859"></a>
+<span class="sourceLineNo">4860</span>   *         {@link HBaseTestingUtility#closeRegionAndWAL(HRegion)} when done.<a name="line.4860"></a>
+<span class="sourceLineNo">4861</span>   */<a name="line.4861"></a>
+<span class="sourceLineNo">4862</span>  protected HRegion initHRegion(TableName tableName, String callingMethod, Configuration conf,<a name="line.4862"></a>
+<span class="sourceLineNo">4863</span>      boolean isReadOnly, byte[]... families) throws IOException {<a name="line.4863"></a>
+<span class="sourceLineNo">4864</span>    return initHRegion(tableName, null, null, callingMethod, conf, isReadOnly, families);<a name="line.4864"></a>
+<span class="sourceLineNo">4865</span>  }<a name="line.4865"></a>
+<span class="sourceLineNo">4866</span><a name="line.4866"></a>
+<span class="sourceLineNo">4867</span>  protected HRegion initHRegion(TableName tableName, byte[] startKey, byte[] stopKey,<a name="line.4867"></a>
+<span class="sourceLineNo">4868</span>      String callingMethod, Configuration conf, boolean isReadOnly, byte[]... families)<a name="line.4868"></a>
+<span class="sourceLineNo">4869</span>      throws IOException {<a name="line.4869"></a>
+<span class="sourceLineNo">4870</span>    Path logDir = TEST_UTIL.getDataTestDirOnTestFS(callingMethod + ".log");<a name="line.4870"></a>
+<span class="sourceLineNo">4871</span>    ChunkCreator.initialize(MemStoreLABImpl.CHUNK_SIZE_DEFAULT, false, 0, 0, 0, null);<a name="line.4871"></a>
+<span class="sourceLineNo">4872</span>    HRegionInfo hri = new HRegionInfo(tableName, startKey, stopKey);<a name="line.4872"></a>
+<span class="sourceLineNo">4873</span>    final WAL wal = HBaseTestingUtility.createWal(conf, logDir, hri);<a name="line.4873"></a>
+<span class="sourceLineNo">4874</span>    return initHRegion(tableName, startKey, stopKey, isReadOnly,<a name="line.4874"></a>
+<span class="sourceLineNo">4875</span>        Durability.SYNC_WAL, wal, families);<a name="line.4875"></a>
 <span class="sourceLineNo">4876</span>  }<a name="line.4876"></a>
 <span class="sourceLineNo">4877</span><a name="line.4877"></a>
 <span class="sourceLineNo">4878</span>  /**<a name="line.4878"></a>
-<span class="sourceLineNo">4879</span>   * Assert that the passed in Cell has expected contents for the specified row,<a name="line.4879"></a>
-<span class="sourceLineNo">4880</span>   * column &amp; timestamp.<a name="line.4880"></a>
+<span class="sourceLineNo">4879</span>   * @return A region on which you must call<a name="line.4879"></a>
+<span class="sourceLineNo">4880</span>   *         {@link HBaseTestingUtility#closeRegionAndWAL(HRegion)} when done.<a name="line.4880"></a>
 <span class="sourceLineNo">4881</span>   */<a name="line.4881"></a>
-<span class="sourceLineNo">4882</span>  private void checkOneCell(Cell kv, byte[] cf, int rowIdx, int colIdx, long ts) {<a name="line.4882"></a>
-<span class="sourceLineNo">4883</span>    String ctx = "rowIdx=" + rowIdx + "; colIdx=" + colIdx + "; ts=" + ts;<a name="line.4883"></a>
-<span class="sourceLineNo">4884</span>    assertEquals("Row mismatch which checking: " + ctx, "row:" + rowIdx,<a name="line.4884"></a>
-<span class="sourceLineNo">4885</span>        Bytes.toString(CellUtil.cloneRow(kv)));<a name="line.4885"></a>
-<span class="sourceLineNo">4886</span>    assertEquals("ColumnFamily mismatch while checking: " + ctx, Bytes.toString(cf),<a name="line.4886"></a>
-<span class="sourceLineNo">4887</span>        Bytes.toString(CellUtil.cloneFamily(kv)));<a name="line.4887"></a>
-<span class="sourceLineNo">4888</span>    assertEquals("Column qualifier mismatch while checking: " + ctx, "column:" + colIdx,<a name="line.4888"></a>
-<span class="sourceLineNo">4889</span>        Bytes.toString(CellUtil.cloneQualifier(kv)));<a name="line.4889"></a>
-<span class="sourceLineNo">4890</span>    assertEquals("Timestamp mismatch while checking: " + ctx, ts, kv.getTimestamp());<a name="line.4890"></a>
-<span class="sourceLineNo">4891</span>    assertEquals("Value mismatch while checking: " + ctx, "value-version-" + ts,<a name="line.4891"></a>
-<span class="sourceLineNo">4892</span>        Bytes.toString(CellUtil.cloneValue(kv)));<a name="line.4892"></a>
-<span class="sourceLineNo">4893</span>  }<a name="line.4893"></a>
-<span class="sourceLineNo">4894</span><a name="line.4894"></a>
-<span class="sourceLineNo">4895</span>  @Test<a name="line.4895"></a>
-<span class="sourceLineNo">4896</span>  public void testReverseScanner_FromMemStore_SingleCF_Normal()<a name="line.4896"></a>
-<span class="sourceLineNo">4897</span>      throws IOException {<a name="line.4897"></a>
-<span class="sourceLineNo">4898</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.4898"></a>
-<span class="sourceLineNo">4899</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.4899"></a>
-<span class="sourceLineNo">4900</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.4900"></a>
-<span class="sourceLineNo">4901</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.4901"></a>
-<span class="sourceLineNo">4902</span>    byte[][] families = { cf };<a name="line.4902"></a>
-<span class="sourceLineNo">4903</span>    byte[] col = Bytes.toBytes("C");<a name="line.4903"></a>
-<span class="sourceLineNo">4904</span>    long ts = 1;<a name="line.4904"></a>
-<span class="sourceLineNo">4905</span>    this.region = initHRegion(tableName, method, families);<a name="line.4905"></a>
-<span class="sourceLineNo">4906</span>    KeyValue kv1 = new KeyValue(rowC, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4906"></a>
-<span class="sourceLineNo">4907</span>    KeyValue kv11 = new KeyValue(rowC, cf, col, ts + 1, KeyValue.Type.Put,<a name="line.4907"></a>
-<span class="sourceLineNo">4908</span>        null);<a name="line.4908"></a>
-<span class="sourceLineNo">4909</span>    KeyValue kv2 = new KeyValue(rowA, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4909"></a>
-<span class="sourceLineNo">4910</span>    KeyValue kv3 = new KeyValue(rowB, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4910"></a>
-<span class="sourceLineNo">4911</span>    Put put = null;<a name="line.4911"></a>
-<span class="sourceLineNo">4912</span>    put = new Put(rowC);<a name="line.4912"></a>
-<span class="sourceLineNo">4913</span>    put.add(kv1);<a name="line.4913"></a>
-<span class="sourceLineNo">4914</span>    put.add(kv11);<a name="line.4914"></a>
-<span class="sourceLineNo">4915</span>    region.put(put);<a name="line.4915"></a>
-<span class="sourceLineNo">4916</span>    put = new Put(rowA);<a name="line.4916"></a>
-<span class="sourceLineNo">4917</span>    put.add(kv2);<a name="line.4917"></a>
-<span class="sourceLineNo">4918</span>    region.put(put);<a name="line.4918"></a>
-<span class="sourceLineNo">4919</span>    put = new Put(rowB);<a name="line.4919"></a>
-<span class="sourceLineNo">4920</span>    put.add(kv3);<a name="line.4920"></a>
-<span class="sourceLineNo">4921</span>    region.put(put);<a name="line.4921"></a>
-<span class="sourceLineNo">4922</span><a name="line.4922"></a>
-<span class="sourceLineNo">4923</span>    Scan scan = new Scan(rowC);<a name="line.4923"></a>
-<span class="sourceLineNo">4924</span>    scan.setMaxVersions(5);<a name="line.4924"></a>
-<span class="sourceLineNo">4925</span>    scan.setReversed(true);<a name="line.4925"></a>
-<span class="sourceLineNo">4926</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.4926"></a>
-<span class="sourceLineNo">4927</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.4927"></a>
-<span class="sourceLineNo">4928</span>    boolean hasNext = scanner.next(currRow);<a name="line.4928"></a>
-<span class="sourceLineNo">4929</span>    assertEquals(2, currRow.size());<a name="line.4929"></a>
-<span class="sourceLineNo">4930</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4930"></a>
-<span class="sourceLineNo">4931</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.4931"></a>
-<span class="sourceLineNo">4932</span>    assertTrue(hasNext);<a name="line.4932"></a>
-<span class="sourceLineNo">4933</span>    currRow.clear();<a name="line.4933"></a>
-<span class="sourceLineNo">4934</span>    hasNext = scanner.next(currRow);<a name="line.4934"></a>
-<span class="sourceLineNo">4935</span>    assertEquals(1, currRow.size());<a name="line.4935"></a>
-<span class="sourceLineNo">4936</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4936"></a>
-<span class="sourceLineNo">4937</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.4937"></a>
-<span class="sourceLineNo">4938</span>    assertTrue(hasNext);<a name="line.4938"></a>
-<span class="sourceLineNo">4939</span>    currRow.clear();<a name="line.4939"></a>
-<span class="sourceLineNo">4940</span>    hasNext = scanner.next(currRow);<a name="line.4940"></a>
-<span class="sourceLineNo">4941</span>    assertEquals(1, currRow.size());<a name="line.4941"></a>
-<span class="sourceLineNo">4942</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4942"></a>
-<span class="sourceLineNo">4943</span>        .get(0).getRowLength(), rowA, 0, rowA.length));<a name="line.4943"></a>
-<span class="sourceLineNo">4944</span>    assertFalse(hasNext);<a name="line.4944"></a>
-<span class="sourceLineNo">4945</span>    scanner.close();<a name="line.4945"></a>
-<span class="sourceLineNo">4946</span>  }<a name="line.4946"></a>
-<span class="sourceLineNo">4947</span><a name="line.4947"></a>
-<span class="sourceLineNo">4948</span>  @Test<a name="line.4948"></a>
-<span class="sourceLineNo">4949</span>  public void testReverseScanner_FromMemStore_SingleCF_LargerKey()<a name="line.4949"></a>
-<span class="sourceLineNo">4950</span>      throws IOException {<a name="line.4950"></a>
-<span class="sourceLineNo">4951</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.4951"></a>
-<span class="sourceLineNo">4952</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.4952"></a>
-<span class="sourceLineNo">4953</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.4953"></a>
-<span class="sourceLineNo">4954</span>    byte[] rowD = Bytes.toBytes("rowD");<a name="line.4954"></a>
-<span class="sourceLineNo">4955</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.4955"></a>
-<span class="sourceLineNo">4956</span>    byte[][] families = { cf };<a name="line.4956"></a>
-<span class="sourceLineNo">4957</span>    byte[] col = Bytes.toBytes("C");<a name="line.4957"></a>
-<span class="sourceLineNo">4958</span>    long ts = 1;<a name="line.4958"></a>
-<span class="sourceLineNo">4959</span>    this.region = initHRegion(tableName, method, families);<a name="line.4959"></a>
-<span class="sourceLineNo">4960</span>    KeyValue kv1 = new KeyValue(rowC, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4960"></a>
-<span class="sourceLineNo">4961</span>    KeyValue kv11 = new KeyValue(rowC, cf, col, ts + 1, KeyValue.Type.Put,<a name="line.4961"></a>
-<span class="sourceLineNo">4962</span>        null);<a name="line.4962"></a>
-<span class="sourceLineNo">4963</span>    KeyValue kv2 = new KeyValue(rowA, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4963"></a>
-<span class="sourceLineNo">4964</span>    KeyValue kv3 = new KeyValue(rowB, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4964"></a>
-<span class="sourceLineNo">4965</span>    Put put = null;<a name="line.4965"></a>
-<span class="sourceLineNo">4966</span>    put = new Put(rowC);<a name="line.4966"></a>
-<span class="sourceLineNo">4967</span>    put.add(kv1);<a name="line.4967"></a>
-<span class="sourceLineNo">4968</span>    put.add(kv11);<a name="line.4968"></a>
-<span class="sourceLineNo">4969</span>    region.put(put);<a name="line.4969"></a>
-<span class="sourceLineNo">4970</span>    put = new Put(rowA);<a name="line.4970"></a>
-<span class="sourceLineNo">4971</span>    put.add(kv2);<a name="line.4971"></a>
-<span class="sourceLineNo">4972</span>    region.put(put);<a name="line.4972"></a>
-<span class="sourceLineNo">4973</span>    put = new Put(rowB);<a name="line.4973"></a>
-<span class="sourceLineNo">4974</span>    put.add(kv3);<a name="line.4974"></a>
-<span class="sourceLineNo">4975</span>    region.put(put);<a name="line.4975"></a>
-<span class="sourceLineNo">4976</span><a name="line.4976"></a>
-<span class="sourceLineNo">4977</span>    Scan scan = new Scan(rowD);<a name="line.4977"></a>
-<span class="sourceLineNo">4978</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.4978"></a>
-<span class="sourceLineNo">4979</span>    scan.setReversed(true);<a name="line.4979"></a>
-<span class="sourceLineNo">4980</span>    scan.setMaxVersions(5);<a name="line.4980"></a>
-<span class="sourceLineNo">4981</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.4981"></a>
-<span class="sourceLineNo">4982</span>    boolean hasNext = scanner.next(currRow);<a name="line.4982"></a>
-<span class="sourceLineNo">4983</span>    assertEquals(2, currRow.size());<a name="line.4983"></a>
-<span class="sourceLineNo">4984</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4984"></a>
-<span class="sourceLineNo">4985</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.4985"></a>
-<span class="sourceLineNo">4986</span>    assertTrue(hasNext);<a name="line.4986"></a>
-<span class="sourceLineNo">4987</span>    currRow.clear();<a name="line.4987"></a>
-<span class="sourceLineNo">4988</span>    hasNext = scanner.next(currRow);<a name="line.4988"></a>
-<span class="sourceLineNo">4989</span>    assertEquals(1, currRow.size());<a name="line.4989"></a>
-<span class="sourceLineNo">4990</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4990"></a>
-<span class="sourceLineNo">4991</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.4991"></a>
-<span class="sourceLineNo">4992</span>    assertTrue(hasNext);<a name="line.4992"></a>
-<span class="sourceLineNo">4993</span>    currRow.clear();<a name="line.4993"></a>
-<span class="sourceLineNo">4994</span>    hasNext = scanner.next(currRow);<a name="line.4994"></a>
-<span class="sourceLineNo">4995</span>    assertEquals(1, currRow.size());<a name="line.4995"></a>
-<span class="sourceLineNo">4996</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4996"></a>
-<span class="sourceLineNo">4997</span>        .get(0).getRowLength(), rowA, 0, rowA.length));<a name="line.4997"></a>
-<span class="sourceLineNo">4998</span>    assertFalse(hasNext);<a name="line.4998"></a>
-<span class="sourceLineNo">4999</span>    scanner.close();<a name="line.4999"></a>
-<span class="sourceLineNo">5000</span>  }<a name="line.5000"></a>
-<span class="sourceLineNo">5001</span><a name="line.5001"></a>
-<span class="sourceLineNo">5002</span>  @Test<a name="line.5002"></a>
-<span class="sourceLineNo">5003</span>  public void testReverseScanner_FromMemStore_SingleCF_FullScan()<a name="line.5003"></a>
-<span class="sourceLineNo">5004</span>      throws IOException {<a name="line.5004"></a>
-<span class="sourceLineNo">5005</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.5005"></a>
-<span class="sourceLineNo">5006</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.5006"></a>
-<span class="sourceLineNo">5007</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.5007"></a>
-<span class="sourceLineNo">5008</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.5008"></a>
-<span class="sourceLineNo">5009</span>    byte[][] families = { cf };<a name="line.5009"></a>
-<span class="sourceLineNo">5010</span>    byte[] col = Bytes.toBytes("C");<a name="line.5010"></a>
-<span class="sourceLineNo">5011</span>    long ts = 1;<a name="line.5011"></a>
-<span class="sourceLineNo">5012</span>    this.region = initHRegion(tableName, method, families);<a name="line.5012"></a>
-<span class="sourceLineNo">5013</span>    KeyValue kv1 = new KeyValue(rowC, cf, col, ts, KeyValue.Type.Put, null);<a name="line.5013"></a>
-<span class="sourceLineNo">5014</span>    KeyValue kv11 = new KeyValue(rowC, cf, col, ts + 1, KeyValue.Type.Put,<a name="line.5014"></a>
-<span class="sourceLineNo">5015</span>        null);<a name="line.5015"></a>
-<span class="sourceLineNo">5016</span>    KeyValue kv2 = new KeyValue(rowA, cf, col, ts, KeyValue.Type.Put, null);<a name="line.5016"></a>
-<span class="sourceLineNo">5017</span>    KeyValue kv3 = new KeyValue(rowB, cf, col, ts, KeyValue.Type.Put, null);<a name="line.5017"></a>
-<span class="sourceLineNo">5018</span>    Put put = null;<a name="line.5018"></a>
-<span class="sourceLineNo">5019</span>    put = new Put(rowC);<a name="line.5019"></a>
-<span class="sourceLineNo">5020</span>    put.add(kv1);<a name="line.5020"></a>
-<span class="sourceLineNo">5021</span>    put.add(kv11);<a name="line.5021"></a>
-<span class="sourceLineNo">5022</span>    region.put(put);<a name="line.5022"></a>
-<span class="sourceLineNo">5023</span>    put = new Put(rowA);<a name="line.5023"></a>
-<span class="sourceLineNo">5024</span>    put.add(kv2);<a name="line.5024"></a>
-<span class="sourceLineNo">5025</span>    region.put(put);<a name="line.5025"></a>
-<span class="sourceLineNo">5026</span>    put = new Put(rowB);<a name="line.5026"></a>
-<span class="sourceLineNo">5027</span>    put.add(kv3);<a name="line.5027"></a>
-<span class="sourceLineNo">5028</span>    region.put(put);<a name="line.5028"></a>
-<span class="sourceLineNo">5029</span>    Scan scan = new Scan();<a name="line.5029"></a>
-<span class="sourceLineNo">5030</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5030"></a>
-<span class="sourceLineNo">5031</span>    scan.setReversed(true);<a name="line.5031"></a>
-<span class="sourceLineNo">5032</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5032"></a>
-<span class="sourceLineNo">5033</span>    boolean hasNext = scanner.next(currRow);<a name="line.5033"></a>
-<span class="sourceLineNo">5034</span>    assertEquals(1, currRow.size());<a name="line.5034"></a>
-<span class="sourceLineNo">5035</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5035"></a>
-<span class="sourceLineNo">5036</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.5036"></a>
-<span class="sourceLineNo">5037</span>    assertTrue(hasNext);<a name="line.5037"></a>
-<span class="sourceLineNo">5038</span>    currRow.clear();<a name="line.5038"></a>
-<span class="sourceLineNo">5039</span>    hasNext = scanner.next(currRow);<a name="line.5039"></a>
-<span class="sourceLineNo">5040</span>    assertEquals(1, currRow.size());<a name="line.5040"></a>
-<span class="sourceLineNo">5041</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5041"></a>
-<span class="sourceLineNo">5042</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.5042"></a>
-<span class="sourceLineNo">5043</span>    assertTrue(hasNext);<a name="line.5043"></a>
-<span class="sourceLineNo">5044</span>    currRow.clear();<a name="line.5044"></a>
-<span class="sourceLineNo">5045</span>    hasNext = scanner.next(currRow);<a name="line.5045"></a>
-<span class="sourceLineNo">5046</span>    assertEquals(1, currRow.size());<a name="line.5046"></a>
-<span class="sourceLineNo">5047</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5047"></a>
-<span class="sourceLineNo">5048</span>        .get(0).getRowLength(), rowA, 0, rowA.length));<a name="line.5048"></a>
-<span class="sourceLineNo">5049</span>    assertFalse(hasNext);<a name="line.5049"></a>
-<span class="sourceLineNo">5050</span>    scanner.close();<a name="line.5050"></a>
-<span class="sourceLineNo">5051</span>  }<a name="line.5051"></a>
-<span class="sourceLineNo">5052</span><a name="line.5052"></a>
-<span class="sourceLineNo">5053</span>  @Test<a name="line.5053"></a>
-<span class="sourceLineNo">5054</span>  public void testReverseScanner_moreRowsMayExistAfter() throws IOException {<a name="line.5054"></a>
-<span class="sourceLineNo">5055</span>    // case for "INCLUDE_AND_SEEK_NEXT_ROW &amp; SEEK_NEXT_ROW" endless loop<a name="line.5055"></a>
-<span class="sourceLineNo">5056</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.5056"></a>
-<span class="sourceLineNo">5057</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.5057"></a>
-<span class="sourceLineNo">5058</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.5058"></a>
-<span class="sourceLineNo">5059</span>    byte[] rowD = Bytes.toBytes("rowD");<a name="line.5059"></a>
-<span class="sourceLineNo">5060</span>    byte[] rowE = Bytes.toBytes("rowE");<a name="line.5060"></a>
-<span class="sourceLineNo">5061</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.5061"></a>
-<span class="sourceLineNo">5062</span>    byte[][] families = { cf };<a name="line.5062"></a>
-<span class="sourceLineNo">5063</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.5063"></a>
-<span class="sourceLineNo">5064</span>    byte[] col2 = Bytes.toBytes("col2");<a name="line.5064"></a>
-<span class="sourceLineNo">5065</span>    long ts = 1;<a name="line.5065"></a>
-<span class="sourceLineNo">5066</span>    this.region = initHRegion(tableName, method, families);<a name="line.5066"></a>
-<span class="sourceLineNo">5067</span>    KeyValue kv1 = new KeyValue(rowA, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5067"></a>
-<span class="sourceLineNo">5068</span>    KeyValue kv2 = new KeyValue(rowB, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5068"></a>
-<span class="sourceLineNo">5069</span>    KeyValue kv3 = new KeyValue(rowC, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5069"></a>
-<span class="sourceLineNo">5070</span>    KeyValue kv4_1 = new KeyValue(rowD, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5070"></a>
-<span class="sourceLineNo">5071</span>    KeyValue kv4_2 = new KeyValue(rowD, cf, col2, ts, KeyValue.Type.Put, null);<a name="line.5071"></a>
-<span class="sourceLineNo">5072</span>    KeyValue kv5 = new KeyValue(rowE, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5072"></a>
-<span class="sourceLineNo">5073</span>    Put put = null;<a name="line.5073"></a>
-<span class="sourceLineNo">5074</span>    put = new Put(rowA);<a name="line.5074"></a>
-<span class="sourceLineNo">5075</span>    put.add(kv1);<a name="line.5075"></a>
-<span class="sourceLineNo">5076</span>    region.put(put);<a name="line.5076"></a>
-<span class="sourceLineNo">5077</span>    put = new Put(rowB);<a name="line.5077"></a>
-<span class="sourceLineNo">5078</span>    put.add(kv2);<a name="line.5078"></a>
-<span class="sourceLineNo">5079</span>    region.put(put);<a name="line.5079"></a>
-<span class="sourceLineNo">5080</span>    put = new Put(rowC);<a name="line.5080"></a>
-<span class="sourceLineNo">5081</span>    put.add(kv3);<a name="line.5081"></a>
-<span class="sourceLineNo">5082</span>    region.put(put);<a name="line.5082"></a>
-<span class="sourceLineNo">5083</span>    put = new Put(rowD);<a name="line.5083"></a>
-<span class="sourceLineNo">5084</span>    put.add(kv4_1);<a name="line.5084"></a>
-<span class="sourceLineNo">5085</span>    region.put(put);<a name="line.5085"></a>
-<span class="sourceLineNo">5086</span>    put = new Put(rowD);<a name="line.5086"></a>
-<span class="sourceLineNo">5087</span>    put.add(kv4_2);<a name="line.5087"></a>
-<span class="sourceLineNo">5088</span>    region.put(put);<a name="line.5088"></a>
-<span class="sourceLineNo">5089</span>    put = new Put(rowE);<a name="line.5089"></a>
-<span class="sourceLineNo">5090</span>    put.add(kv5);<a name="line.5090"></a>
-<span class="sourceLineNo">5091</span>    region.put(put);<a name="line.5091"></a>
-<span class="sourceLineNo">5092</span>    region.flush(true);<a name="line.5092"></a>
-<span class="sourceLineNo">5093</span>    Scan scan = new Scan(rowD, rowA);<a name="line.5093"></a>
-<span class="sourceLineNo">5094</span>    scan.addColumn(families[0], col1);<a name="line.5094"></a>
-<span class="sourceLineNo">5095</span>    scan.setReversed(true);<a name="line.5095"></a>
-<span class="sourceLineNo">5096</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5096"></a>
-<span class="sourceLineNo">5097</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5097"></a>
-<span class="sourceLineNo">5098</span>    boolean hasNext = scanner.next(currRow);<a name="line.5098"></a>
-<span class="sourceLineNo">5099</span>    assertEquals(1, currRow.size());<a name="line.5099"></a>
-<span class="sourceLineNo">5100</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5100"></a>
-<span class="sourceLineNo">5101</span>        .get(0).getRowLength(), rowD, 0, rowD.length));<a name="line.5101"></a>
-<span class="sourceLineNo">5102</span>    assertTrue(hasNext);<a name="line.5102"></a>
-<span class="sourceLineNo">5103</span>    currRow.clear();<a name="line.5103"></a>
-<span class="sourceLineNo">5104</span>    hasNext = scanner.next(currRow);<a name="line.5104"></a>
-<span class="sourceLineNo">5105</span>    assertEquals(1, currRow.size());<a name="line.5105"></a>
-<span class="sourceLineNo">5106</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5106"></a>
-<span class="sourceLineNo">5107</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.5107"></a>
-<span class="sourceLineNo">5108</span>    assertTrue(hasNext);<a name="line.5108"></a>
-<span class="sourceLineNo">5109</span>    currRow.clear();<a name="line.5109"></a>
-<span class="sourceLineNo">5110</span>    hasNext = scanner.next(currRow);<a name="line.5110"></a>
-<span class="sourceLineNo">5111</span>    assertEquals(1, currRow.size());<a name="line.5111"></a>
-<span class="sourceLineNo">5112</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5112"></a>
-<span class="sourceLineNo">5113</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.5113"></a>
-<span class="sourceLineNo">5114</span>    assertFalse(hasNext);<a name="line.5114"></a>
-<span class="sourceLineNo">5115</span>    scanner.close();<a name="line.5115"></a>
-<span class="sourceLineNo">5116</span><a name="line.5116"></a>
-<span class="sourceLineNo">5117</span>    scan = new Scan(rowD, rowA);<a name="line.5117"></a>
-<span class="sourceLineNo">5118</span>    scan.addColumn(families[0], col2);<a name="line.5118"></a>
-<span class="sourceLineNo">5119</span>    scan.setReversed(true);<a name="line.5119"></a>
-<span class="sourceLineNo">5120</span>    currRow.clear();<a name="line.5120"></a>
-<span class="sourceLineNo">5121</span>    scanner = region.getScanner(scan);<a name="line.5121"></a>
-<span class="sourceLineNo">5122</span>    hasNext = scanner.next(currRow);<a name="line.5122"></a>
-<span class="sourceLineNo">5123</span>    assertEquals(1, currRow.size());<a name="line.5123"></a>
-<span class="sourceLineNo">5124</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5124"></a>
-<span class="sourceLineNo">5125</span>        .get(0).getRowLength(), rowD, 0, rowD.length));<a name="line.5125"></a>
-<span class="sourceLineNo">5126</span>    scanner.close();<a name="line.5126"></a>
-<span class="sourceLineNo">5127</span>  }<a name="line.5127"></a>
-<span class="sourceLineNo">5128</span><a name="line.5128"></a>
-<span class="sourceLineNo">5129</span>  @Test<a name="line.5129"></a>
-<span class="sourceLineNo">5130</span>  public void testReverseScanner_smaller_blocksize() throws IOException {<a name="line.5130"></a>
-<span class="sourceLineNo">5131</span>    // case to ensure no conflict with HFile index optimization<a name="line.5131"></a>
-<span class="sourceLineNo">5132</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.5132"></a>
-<span class="sourceLineNo">5133</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.5133"></a>
-<span class="sourceLineNo">5134</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.5134"></a>
-<span class="sourceLineNo">5135</span>    byte[] rowD = Bytes.toBytes("rowD");<a name="line.5135"></a>
-<span class="sourceLineNo">5136</span>    byte[] rowE = Bytes.toBytes("rowE");<a name="line.5136"></a>
-<span class="sourceLineNo">5137</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.5137"></a>
-<span class="sourceLineNo">5138</span>    byte[][] families = { cf };<a name="line.5138"></a>
-<span class="sourceLineNo">5139</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.5139"></a>
-<span class="sourceLineNo">5140</span>    byte[] col2 = Bytes.toBytes("col2");<a name="line.5140"></a>
-<span class="sourceLineNo">5141</span>    long ts = 1;<a name="line.5141"></a>
-<span class="sourceLineNo">5142</span>    HBaseConfiguration config = new HBaseConfiguration();<a name="line.5142"></a>
-<span class="sourceLineNo">5143</span>    config.setInt("test.block.size", 1);<a name="line.5143"></a>
-<span class="sourceLineNo">5144</span>    this.region = initHRegion(tableName, method, config, families);<a name="line.5144"></a>
-<span class="sourceLineNo">5145</span>    KeyValue kv1 = new KeyValue(rowA, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5145"></a>
-<span class="sourceLineNo">5146</span>    KeyValue kv2 = new KeyValue(rowB, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5146"></a>
-<span class="sourceLineNo">5147</span>    KeyValue kv3 = new KeyValue(rowC, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5147"></a>
-<span class="sourceLineNo">5148</span>    KeyValue kv4_1 = new KeyValue(rowD, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5148"></a>
-<span class="sourceLineNo">5149</span>    KeyValue kv4_2 = new KeyValue(rowD, cf, col2, ts, KeyValue.Type.Put, null);<a name="line.5149"></a>
-<span class="sourceLineNo">5150</span>    KeyValue kv5 = new KeyValue(rowE, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5150"></a>
-<span class="sourceLineNo">5151</span>    Put put = null;<a name="line.5151"></a>
-<span class="sourceLineNo">5152</span>    put = new Put(rowA);<a name="line.5152"></a>
-<span class="sourceLineNo">5153</span>    put.add(kv1);<a name="line.5153"></a>
-<span class="sourceLineNo">5154</span>    region.put(put);<a name="line.5154"></a>
-<span class="sourceLineNo">5155</span>    put = new Put(rowB);<a name="line.5155"></a>
-<span class="sourceLineNo">5156</span>    put.add(kv2);<a name="line.5156"></a>
-<span class="sourceLineNo">5157</span>    region.put(put);<a name="line.5157"></a>
-<span class="sourceLineNo">5158</span>    put = new Put(rowC);<a name="line.5158"></a>
-<span class="sourceLineNo">5159</span>    put.add(kv3);<a name="line.5159"></a>
-<span class="sourceLineNo">5160</span>    region.put(put);<a name="line.5160"></a>
-<span class="sourceLineNo">5161</span>    put = new Put(rowD);<a name="line.5161"></a>
-<span class="sourceLineNo">5162</span>    put.add(kv4_1);<a name="line.5162"></a>
-<span class="sourceLineNo">5163</span>    region.put(put);<a name="line.5163"></a>
-<span class="sourceLineNo">5164</span>    put = new Put(rowD);<a name="line.5164"></a>
-<span class="sourceLineNo">5165</span>    put.add(kv4_2);<a name="line.5165"></a>
-<span class="sourceLineNo">5166</span>    region.put(put);<a name="line.5166"></a>
-<span class="sourceLineNo">5167</span>    put = new Put(rowE);<a name="line.5167"></a>
-<span class="sourceLineNo">5168</span>    put.add(kv5);<a name="line.5168"></a>
-<span class="sourceLineNo">5169</span>    region.put(put);<a name="line.5169"></a>
-<span class="sourceLineNo">5170</span>    region.flush(true);<a name="line.5170"></a>
-<span class="sourceLineNo">5171</span>    Scan scan = new Scan(rowD, rowA);<a name="line.5171"></a>
-<span class="sourceLineNo">5172</span>    scan.addColumn(families[0], col1);<a name="line.5172"></a>
-<span class="sourceLineNo">5173</span>    scan.setReversed(true);<a name="line.5173"></a>
-<span class="sourceLineNo">5174</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5174"></a>
-<span class="sourceLineNo">5175</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5175"></a>
-<span class="sourceLineNo">5176</span>    boolean hasNext = scanner.next(currRow);<a name="line.5176"></a>
-<span class="sourceLineNo">5177</span>    assertEquals(1, currRow.size());<a name="line.5177"></a>
-<span class="sourceLineNo">5178</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5178"></a>
-<span class="sourceLineNo">5179</span>        .get(0).getRowLength(), rowD, 0, rowD.length));<a name="line.5179"></a>
-<span class="sourceLineNo">5180</span>    assertTrue(hasNext);<a name="line.5180"></a>
-<span class="sourceLineNo">5181</span>    currRow.clear();<a name="line.5181"></a>
-<span class="sourceLineNo">5182</span>    hasNext = scanner.next(currRow);<a name="line.5182"></a>
-<span class="sourceLineNo">5183</span>    assertEquals(1, currRow.size());<a name="line.5183"></a>
-<span class="sourceLineNo">5184</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5184"></a>
-<span class="sourceLineNo">5185</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.5185"></a>
-<span class="sourceLineNo">5186</span>    assertTrue(hasNext);<a name="line.5186"></a>
-<span class="sourceLineNo">5187</span>    currRow.clear();<a name="line.5187"></a>
-<span class="sourceLineNo">5188</span>    hasNext = scanner.next(currRow);<a name="line.5188"></a>
-<span class="sourceLineNo">5189</span>    assertEquals(1, currRow.size());<a name="line.5189"></a>
-<span class="sourceLineNo">5190</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5190"></a>
-<span class="sourceLineNo">5191</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.5191"></a>
-<span class="sourceLineNo">5192</span>    assertFalse(hasNext);<a name="line.5192"></a>
-<span class="sourceLineNo">5193</span>    scanner.close();<a name="line.5193"></a>
-<span class="sourceLineNo">5194</span><a name="line.5194"></a>
-<span class="sourceLineNo">5195</span>    scan = new Scan(rowD, rowA);<a name="line.5195"></a>
-<span class="sourceLineNo">5196</span>    scan.addColumn(families[0], col2);<a name="line.5196"></a>
-<span class="sourceLineNo">5197</span>    scan.setReversed(true);<a name="line.5197"></a>
-<span class="sourceLineNo">5198</span>    currRow.clear();<a name="line.5198"></a>
-<span class="sourceLineNo">5199</span>    scanner = region.getScanner(scan);<a name="line.5199"></a>
-<span class="sourceLineNo">5200</span>    hasNext = scanner.next(currRow);<a name="line.5200"></a>
-<span class="sourceLineNo">5201</span>    assertEquals(1, currRow.size());<a name="line.5201"></a>
-<span class="sourceLineNo">5202</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5202"></a>
-<span class="sourceLineNo">5203</span>        .get(0).getRowLength(), rowD, 0, rowD.length));<a name="line.5203"></a>
-<span class="sourceLineNo">5204</span>    scanner.close();<a name="line.5204"></a>
-<span class="sourceLineNo">5205</span>  }<a name="line.5205"></a>
-<span class="sourceLineNo">5206</span><a name="line.5206"></a>
-<span class="sourceLineNo">5207</span>  @Test<a name="line.5207"></a>
-<span class="sourceLineNo">5208</span>  public void testReverseScanner_FromMemStoreAndHFiles_MultiCFs1()<a name="line.5208"></a>
-<span class="sourceLineNo">5209</span>      throws IOException {<a name="line.5209"></a>
-<span class="sourceLineNo">5210</span>    byte[] row0 = Bytes.toBytes("row0"); // 1 kv<a name="line.5210"></a>
-<span class="sourceLineNo">5211</span>    byte[] row1 = Bytes.toBytes("row1"); // 2 kv<a name="line.5211"></a>
-<span class="sourceLineNo">5212</span>    byte[] row2 = Bytes.toBytes("row2"); // 4 kv<a name="line.5212"></a>
-<span class="sourceLineNo">5213</span>    byte[] row3 = Bytes.toBytes("row3"); // 2 kv<a name="line.5213"></a>
-<span class="sourceLineNo">5214</span>    byte[] row4 = Bytes.toBytes("row4"); // 5 kv<a name="line.5214"></a>
-<span class="sourceLineNo">5215</span>    byte[] row5 = Bytes.toBytes("row5"); // 2 kv<a name="line.5215"></a>
-<span class="sourceLineNo">5216</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5216"></a>
-<span class="sourceLineNo">5217</span>    byte[] cf2 = Bytes.toBytes("CF2");<a name="line.5217"></a>
-<span class="sourceLineNo">5218</span>    byte[] cf3 = Bytes.toBytes("CF3");<a name="line.5218"></a>
-<span class="sourceLineNo">5219</span>    byte[][] families = { cf1, cf2, cf3 };<a name="line.5219"></a>
-<span class="sourceLineNo">5220</span>    byte[] col = Bytes.toBytes("C");<a name="line.5220"></a>
-<span class="sourceLineNo">5221</span>    long ts = 1;<a name="line.5221"></a>
-<span class="sourceLineNo">5222</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5222"></a>
-<span class="sourceLineNo">5223</span>    // disable compactions in this test.<a name="line.5223"></a>
-<span class="sourceLineNo">5224</span>    conf.setInt("hbase.hstore.compactionThreshold", 10000);<a name="line.5224"></a>
-<span class="sourceLineNo">5225</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5225"></a>
-<span class="sourceLineNo">5226</span>    // kv naming style: kv(row number) totalKvCountInThisRow seq no<a name="line.5226"></a>
-<span class="sourceLineNo">5227</span>    KeyValue kv0_1_1 = new KeyValue(row0, cf1, col, ts, KeyValue.Type.Put,<a name="line.5227"></a>
-<span class="sourceLineNo">5228</span>        null);<a name="line.5228"></a>
-<span class="sourceLineNo">5229</span>    KeyValue kv1_2_1 = new KeyValue(row1, cf2, col, ts, KeyValue.Type.Put,<a name="line.5229"></a>
-<span class="sourceLineNo">5230</span>        null);<a name="line.5230"></a>
-<span class="sourceLineNo">5231</span>    KeyValue kv1_2_2 = new KeyValue(row1, cf1, col, ts + 1,<a name="line.5231"></a>
-<span class="sourceLineNo">5232</span>        KeyValue.Type.Put, null);<a name="line.5232"></a>
-<span class="sourceLineNo">5233</span>    KeyValue kv2_4_1 = new KeyValue(row2, cf2, col, ts, KeyValue.Type.Put,<a name="line.5233"></a>
-<span class="sourceLineNo">5234</span>        null);<a name="line.5234"></a>
-<span class="sourceLineNo">5235</span>    KeyValue kv2_4_2 = new KeyValue(row2, cf1, col, ts, KeyValue.Type.Put,<a name="line.5235"></a>
-<span class="sourceLineNo">5236</span>        null);<a name="line.5236"></a>
-<span class="sourceLineNo">5237</span>    KeyValue kv2_4_3 = new KeyValue(row2, cf3, col, ts, KeyValue.Type.Put,<a name="line.5237"></a>
+<span class="sourceLineNo">4882</span>  public HRegion initHRegion(TableName tableName, byte[] startKey, byte[] stopKey,<a name="line.4882"></a>
+<span class="sourceLineNo">4883</span>      boolean isReadOnly, Durability durability, WAL wal, byte[]... families) throws IOException {<a name="line.4883"></a>
+<span class="sourceLineNo">4884</span>    return TEST_UTIL.createLocalHRegion(tableName, startKey, stopKey,<a name="line.4884"></a>
+<span class="sourceLineNo">4885</span>        isReadOnly, durability, wal, families);<a name="line.4885"></a>
+<span class="sourceLineNo">4886</span>  }<a name="line.4886"></a>
+<span class="sourceLineNo">4887</span><a name="line.4887"></a>
+<span class="sourceLineNo">4888</span>  /**<a name="line.4888"></a>
+<span class="sourceLineNo">4889</span>   * Assert that the passed in Cell has expected contents for the specified row,<a name="line.4889"></a>
+<span class="sourceLineNo">4890</span>   * column &amp; timestamp.<a name="line.4890"></a>
+<span class="sourceLineNo">4891</span>   */<a name="line.4891"></a>
+<span class="sourceLineNo">4892</span>  private void checkOneCell(Cell kv, byte[] cf, int rowIdx, int colIdx, long ts) {<a name="line.4892"></a>
+<span class="sourceLineNo">4893</span>    String ctx = "rowIdx=" + rowIdx + "; colIdx=" + colIdx + "; ts=" + ts;<a name="line.4893"></a>
+<span class="sourceLineNo">4894</span>    assertEquals("Row mismatch which checking: " + ctx, "row:" + rowIdx,<a name="line.4894"></a>
+<span class="sourceLineNo">4895</span>        Bytes.toString(CellUtil.cloneRow(kv)));<a name="line.4895"></a>
+<span class="sourceLineNo">4896</span>    assertEquals("ColumnFamily mismatch while checking: " + ctx, Bytes.toString(cf),<a name="line.4896"></a>
+<span class="sourceLineNo">4897</span>        Bytes.toString(CellUtil.cloneFamily(kv)));<a name="line.4897"></a>
+<span class="sourceLineNo">4898</span>    assertEquals("Column qualifier mismatch while checking: " + ctx, "column:" + colIdx,<a name="line.4898"></a>
+<span class="sourceLineNo">4899</span>        Bytes.toString(CellUtil.cloneQualifier(kv)));<a name="line.4899"></a>
+<span class="sourceLineNo">4900</span>    assertEquals("Timestamp mismatch while checking: " + ctx, ts, kv.getTimestamp());<a name="line.4900"></a>
+<span class="sourceLineNo">4901</span>    assertEquals("Value mismatch while checking: " + ctx, "value-version-" + ts,<a name="line.4901"></a>
+<span class="sourceLineNo">4902</span>        Bytes.toString(CellUtil.cloneValue(kv)));<a name="line.4902"></a>
+<span class="sourceLineNo">4903</span>  }<a name="line.4903"></a>
+<span class="sourceLineNo">4904</span><a name="line.4904"></a>
+<span class="sourceLineNo">4905</span>  @Test<a name="line.4905"></a>
+<span class="sourceLineNo">4906</span>  public void testReverseScanner_FromMemStore_SingleCF_Normal()<a name="line.4906"></a>
+<span class="sourceLineNo">4907</span>      throws IOException {<a name="line.4907"></a>
+<span class="sourceLineNo">4908</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.4908"></a>
+<span class="sourceLineNo">4909</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.4909"></a>
+<span class="sourceLineNo">4910</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.4910"></a>
+<span class="sourceLineNo">4911</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.4911"></a>
+<span class="sourceLineNo">4912</span>    byte[][] families = { cf };<a name="line.4912"></a>
+<span class="sourceLineNo">4913</span>    byte[] col = Bytes.toBytes("C");<a name="line.4913"></a>
+<span class="sourceLineNo">4914</span>    long ts = 1;<a name="line.4914"></a>
+<span class="sourceLineNo">4915</span>    this.region = initHRegion(tableName, method, families);<a name="line.4915"></a>
+<span class="sourceLineNo">4916</span>    KeyValue kv1 = new KeyValue(rowC, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4916"></a>
+<span class="sourceLineNo">4917</span>    KeyValue kv11 = new KeyValue(rowC, cf, col, ts + 1, KeyValue.Type.Put,<a name="line.4917"></a>
+<span class="sourceLineNo">4918</span>        null);<a name="line.4918"></a>
+<span class="sourceLineNo">4919</span>    KeyValue kv2 = new KeyValue(rowA, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4919"></a>
+<span class="sourceLineNo">4920</span>    KeyValue kv3 = new KeyValue(rowB, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4920"></a>
+<span class="sourceLineNo">4921</span>    Put put = null;<a name="line.4921"></a>
+<span class="sourceLineNo">4922</span>    put = new Put(rowC);<a name="line.4922"></a>
+<span class="sourceLineNo">4923</span>    put.add(kv1);<a name="line.4923"></a>
+<span class="sourceLineNo">4924</span>    put.add(kv11);<a name="line.4924"></a>
+<span class="sourceLineNo">4925</span>    region.put(put);<a name="line.4925"></a>
+<span class="sourceLineNo">4926</span>    put = new Put(rowA);<a name="line.4926"></a>
+<span class="sourceLineNo">4927</span>    put.add(kv2);<a name="line.4927"></a>
+<span class="sourceLineNo">4928</span>    region.put(put);<a name="line.4928"></a>
+<span class="sourceLineNo">4929</span>    put = new Put(rowB);<a name="line.4929"></a>
+<span class="sourceLineNo">4930</span>    put.add(kv3);<a name="line.4930"></a>
+<span class="sourceLineNo">4931</span>    region.put(put);<a name="line.4931"></a>
+<span class="sourceLineNo">4932</span><a name="line.4932"></a>
+<span class="sourceLineNo">4933</span>    Scan scan = new Scan(rowC);<a name="line.4933"></a>
+<span class="sourceLineNo">4934</span>    scan.setMaxVersions(5);<a name="line.4934"></a>
+<span class="sourceLineNo">4935</span>    scan.setReversed(true);<a name="line.4935"></a>
+<span class="sourceLineNo">4936</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.4936"></a>
+<span class="sourceLineNo">4937</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.4937"></a>
+<span class="sourceLineNo">4938</span>    boolean hasNext = scanner.next(currRow);<a name="line.4938"></a>
+<span class="sourceLineNo">4939</span>    assertEquals(2, currRow.size());<a name="line.4939"></a>
+<span class="sourceLineNo">4940</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4940"></a>
+<span class="sourceLineNo">4941</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.4941"></a>
+<span class="sourceLineNo">4942</span>    assertTrue(hasNext);<a name="line.4942"></a>
+<span class="sourceLineNo">4943</span>    currRow.clear();<a name="line.4943"></a>
+<span class="sourceLineNo">4944</span>    hasNext = scanner.next(currRow);<a name="line.4944"></a>
+<span class="sourceLineNo">4945</span>    assertEquals(1, currRow.size());<a name="line.4945"></a>
+<span class="sourceLineNo">4946</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4946"></a>
+<span class="sourceLineNo">4947</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.4947"></a>
+<span class="sourceLineNo">4948</span>    assertTrue(hasNext);<a name="line.4948"></a>
+<span class="sourceLineNo">4949</span>    currRow.clear();<a name="line.4949"></a>
+<span class="sourceLineNo">4950</span>    hasNext = scanner.next(currRow);<a name="line.4950"></a>
+<span class="sourceLineNo">4951</span>    assertEquals(1, currRow.size());<a name="line.4951"></a>
+<span class="sourceLineNo">4952</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4952"></a>
+<span class="sourceLineNo">4953</span>        .get(0).getRowLength(), rowA, 0, rowA.length));<a name="line.4953"></a>
+<span class="sourceLineNo">4954</span>    assertFalse(hasNext);<a name="line.4954"></a>
+<span class="sourceLineNo">4955</span>    scanner.close();<a name="line.4955"></a>
+<span class="sourceLineNo">4956</span>  }<a name="line.4956"></a>
+<span class="sourceLineNo">4957</span><a name="line.4957"></a>
+<span class="sourceLineNo">4958</span>  @Test<a name="line.4958"></a>
+<span class="sourceLineNo">4959</span>  public void testReverseScanner_FromMemStore_SingleCF_LargerKey()<a name="line.4959"></a>
+<span class="sourceLineNo">4960</span>      throws IOException {<a name="line.4960"></a>
+<span class="sourceLineNo">4961</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.4961"></a>
+<span class="sourceLineNo">4962</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.4962"></a>
+<span class="sourceLineNo">4963</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.4963"></a>
+<span class="sourceLineNo">4964</span>    byte[] rowD = Bytes.toBytes("rowD");<a name="line.4964"></a>
+<span class="sourceLineNo">4965</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.4965"></a>
+<span class="sourceLineNo">4966</span>    byte[][] families = { cf };<a name="line.4966"></a>
+<span class="sourceLineNo">4967</span>    byte[] col = Bytes.toBytes("C");<a name="line.4967"></a>
+<span class="sourceLineNo">4968</span>    long ts = 1;<a name="line.4968"></a>
+<span class="sourceLineNo">4969</span>    this.region = initHRegion(tableName, method, families);<a name="line.4969"></a>
+<span class="sourceLineNo">4970</span>    KeyValue kv1 = new KeyValue(rowC, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4970"></a>
+<span class="sourceLineNo">4971</span>    KeyValue kv11 = new KeyValue(rowC, cf, col, ts + 1, KeyValue.Type.Put,<a name="line.4971"></a>
+<span class="sourceLineNo">4972</span>        null);<a name="line.4972"></a>
+<span class="sourceLineNo">4973</span>    KeyValue kv2 = new KeyValue(rowA, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4973"></a>
+<span class="sourceLineNo">4974</span>    KeyValue kv3 = new KeyValue(rowB, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4974"></a>
+<span class="sourceLineNo">4975</span>    Put put = null;<a name="line.4975"></a>
+<span class="sourceLineNo">4976</span>    put = new Put(rowC);<a name="line.4976"></a>
+<span class="sourceLineNo">4977</span>    put.add(kv1);<a name="line.4977"></a>
+<span class="sourceLineNo">4978</span>    put.add(kv11);<a name="line.4978"></a>
+<span class="sourceLineNo">4979</span>    region.put(put);<a name="line.4979"></a>
+<span class="sourceLineNo">4980</span>    put = new Put(rowA);<a name="line.4980"></a>
+<span class="sourceLineNo">4981</span>    put.add(kv2);<a name="line.4981"></a>
+<span class="sourceLineNo">4982</span>    region.put(put);<a name="line.4982"></a>
+<span class="sourceLineNo">4983</span>    put = new Put(rowB);<a name="line.4983"></a>
+<span class="sourceLineNo">4984</span>    put.add(kv3);<a name="line.4984"></a>
+<span class="sourceLineNo">4985</span>    region.put(put);<a name="line.4985"></a>
+<span class="sourceLineNo">4986</span><a name="line.4986"></a>
+<span class="sourceLineNo">4987</span>    Scan scan = new Scan(rowD);<a name="line.4987"></a>
+<span class="sourceLineNo">4988</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.4988"></a>
+<span class="sourceLineNo">4989</span>    scan.setReversed(true);<a name="line.4989"></a>
+<span class="sourceLineNo">4990</span>    scan.setMaxVersions(5);<a name="line.4990"></a>
+<span class="sourceLineNo">4991</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.4991"></a>
+<span class="sourceLineNo">4992</span>    boolean hasNext = scanner.next(currRow);<a name="line.4992"></a>
+<span class="sourceLineNo">4993</span>    assertEquals(2, currRow.size());<a name="line.4993"></a>
+<span class="sourceLineNo">4994</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4994"></a>
+<span class="sourceLineNo">4995</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.4995"></a>
+<span class="sourceLineNo">4996</span>    assertTrue(hasNext);<a name="line.4996"></a>
+<span class="sourceLineNo">4997</span>    currRow.clear();<a name="line.4997"></a>
+<span class="sourceLineNo">4998</span>    hasNext = scanner.next(currRow);<a name="line.4998"></a>
+<span class="sourceLineNo">4999</span>    assertEquals(1, currRow.size());<a name="line.4999"></a>
+<span class="sourceLineNo">5000</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5000"></a>
+<span class="sourceLineNo">5001</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.5001"></a>
+<span class="sourceLineNo">5002</span>    assertTrue(hasNext);<a name="line.5002"></a>
+<span class="sourceLineNo">5003</span>    currRow.clear();<a name="line.5003"></a>
+<span class="sourceLineNo">5004</span>    hasNext = scanner.next(currRow);<a name="line.5004"></a>
+<span class="sourceLineNo">5005</span>    assertEquals(1, currRow.size());<a name="line.5005"></a>
+<span class="sourceLineNo">5006</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5006"></a>
+<span class="sourceLineNo">5007</span>        .get(0).getRowLength(), rowA, 0, rowA.length));<a name="line.5007"></a>
+<span class="sourceLineNo">5008</span>    assertFalse(hasNext);<a name="line.5008"></a>
+<span class="sourceLineNo">5009</span>    scanner.close();<a name="line.5009"></a>
+<span class="sourceLineNo">5010</span>  }<a name="line.5010"></a>
+<span class="sourceLineNo">5011</span><a name="line.5011"></a>
+<span class="sourceLineNo">5012</span>  @Test<a name="line.5012"></a>
+<span class="sourceLineNo">5013</span>  public void testReverseScanner_FromMemStore_SingleCF_FullScan()<a name="line.5013"></a>
+<span class="sourceLineNo">5014</span>      throws IOException {<a name="line.5014"></a>
+<span class="sourceLineNo">5015</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.5015"></a>
+<span class="sourceLineNo">5016</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.5016"></a>
+<span class="sourceLineNo">5017</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.5017"></a>
+<span class="sourceLineNo">5018</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.5018"></a>
+<span class="sourceLineNo">5019</span>    byte[][] families = { cf };<a name="line.5019"></a>
+<span class="sourceLineNo">5020</span>    byte[] col = Bytes.toBytes("C");<a name="line.5020"></a>
+<span class="sourceLineNo">5021</span>    long ts = 1;<a name="line.5021"></a>
+<span class="sourceLineNo">5022</span>    this.region = initHRegion(tableName, method, families);<a name="line.5022"></a>
+<span class="sourceLineNo">5023</span>    KeyValue kv1 = new KeyValue(rowC, cf, col, ts, KeyValue.Type.Put, null);<a name="line.5023"></a>
+<span class="sourceLineNo">5024</span>    KeyValue kv11 = new KeyValue(rowC, cf, col, ts + 1, KeyValue.Type.Put,<a name="line.5024"></a>
+<span class="sourceLineNo">5025</span>        null);<a name="line.5025"></a>
+<span class="sourceLineNo">5026</span>    KeyValue kv2 = new KeyValue(rowA, cf, col, ts, KeyValue.Type.Put, null);<a name="line.5026"></a>
+<span class="sourceLineNo">5027</span>    KeyValue kv3 = new KeyValue(rowB, cf, col, ts, KeyValue.Type.Put, null);<a name="line.5027"></a>
+<span class="sourceLineNo">5028</span>    Put put = null;<a name="line.5028"></a>
+<span class="sourceLineNo">5029</span>    put = new Put(rowC);<a name="line.5029"></a>
+<span class="sourceLineNo">5030</span>    put.add(kv1);<a name="line.5030"></a>
+<span class="sourceLineNo">5031</span>    put.add(kv11);<a name="line.5031"></a>
+<span class="sourceLineNo">5032</span>    region.put(put);<a name="line.5032"></a>
+<span class="sourceLineNo">5033</span>    put = new Put(rowA);<a name="line.5033"></a>
+<span class="sourceLineNo">5034</span>    put.add(kv2);<a name="line.5034"></a>
+<span class="sourceLineNo">5035</span>    region.put(put);<a name="line.5035"></a>
+<span class="sourceLineNo">5036</span>    put = new Put(rowB);<a name="line.5036"></a>
+<span class="sourceLineNo">5037</span>    put.add(kv3);<a name="line.5037"></a>
+<span class="sourceLineNo">5038</span>    region.put(put);<a name="line.5038"></a>
+<span class="sourceLineNo">5039</span>    Scan scan = new Scan();<a name="line.5039"></a>
+<span class="sourceLineNo">5040</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5040"></a>
+<span class="sourceLineNo">5041</span>    scan.setReversed(true);<a name="line.5041"></a>
+<span class="sourceLineNo">5042</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5042"></a>
+<span class="sourceLineNo">5043</span>    boolean hasNext = scanner.next(currRow);<a name="line.5043"></a>
+<span class="sourceLineNo">5044</span>    assertEquals(1, currRow.size());<a name="line.5044"></a>
+<span class="sourceLineNo">5045</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5045"></a>
+<span class="sourceLineNo">5046</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.5046"></a>
+<span class="sourceLineNo">5047</span>    assertTrue(hasNext);<a name="line.5047"></a>
+<span class="sourceLineNo">5048</span>    currRow.clear();<a name="line.5048"></a>
+<span class="sourceLineNo">5049</span>    hasNext = scanner.next(currRow);<a name="line.5049"></a>
+<span class="sourceLineNo">5050</span>    assertEquals(1, currRow.size());<a name="line.5050"></a>
+<span class="sourceLineNo">5051</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5051"></a>
+<span class="sourceLineNo">5052</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.5052"></a>
+<span class="sourceLineNo">5053</span>    assertTrue(hasNext);<a name="line.5053"></a>
+<span class="sourceLineNo">5054</span>    currRow.clear();<a name="line.5054"></a>
+<span class="sourceLineNo">5055</span>    hasNext = scanner.next(currRow);<a name="line.5055"></a>
+<span class="sourceLineNo">5056</span>    assertEquals(1, currRow.size());<a name="line.5056"></a>
+<span class="sourceLineNo">5057</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5057"></a>
+<span class="sourceLineNo">5058</span>        .get(0).getRowLength(), rowA, 0, rowA.length));<a name="line.5058"></a>
+<span class="sourceLineNo">5059</span>    assertFalse(hasNext);<a name="line.5059"></a>
+<span class="sourceLineNo">5060</span>    scanner.close();<a name="line.5060"></a>
+<span class="sourceLineNo">5061</span>  }<a name="line.5061"></a>
+<span class="sourceLineNo">5062</span><a name="line.5062"></a>
+<span class="sourceLineNo">5063</span>  @Test<a name="line.5063"></a>
+<span class="sourceLineNo">5064</span>  public void testReverseScanner_moreRowsMayExistAfter() throws IOException {<a name="line.5064"></a>
+<span class="sourceLineNo">5065</span>    // case for "INCLUDE_AND_SEEK_NEXT_ROW &amp; SEEK_NEXT_ROW" endless loop<a name="line.5065"></a>
+<span class="sourceLineNo">5066</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.5066"></a>
+<span class="sourceLineNo">5067</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.5067"></a>
+<span class="sourceLineNo">5068</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.5068"></a>
+<span class="sourceLineNo">5069</span>    byte[] rowD = Bytes.toBytes("rowD");<a name="line.5069"></a>
+<span class="sourceLineNo">5070</span>    byte[] rowE = Bytes.toBytes("rowE");<a name="line.5070"></a>
+<span class="sourceLineNo">5071</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.5071"></a>
+<span class="sourceLineNo">5072</span>    byte[][] families = { cf };<a name="line.5072"></a>
+<span class="sourceLineNo">5073</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.5073"></a>
+<span class="sourceLineNo">5074</span>    byte[] col2 = Bytes.toBytes("col2");<a name="line.5074"></a>
+<span class="sourceLineNo">5075</span>    long ts = 1;<a name="line.5075"></a>
+<span class="sourceLineNo">5076</span>    this.region = initHRegion(tableName, method, families);<a name="line.5076"></a>
+<span class="sourceLineNo">5077</span>    KeyValue kv1 = new KeyValue(rowA, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5077"></a>
+<span class="sourceLineNo">5078</span>    KeyValue kv2 = new KeyValue(rowB, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5078"></a>
+<span class="sourceLineNo">5079</span>    KeyValue kv3 = new KeyValue(rowC, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5079"></a>
+<span class="sourceLineNo">5080</span>    KeyValue kv4_1 = new KeyValue(rowD, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5080"></a>
+<span class="sourceLineNo">5081</span>    KeyValue kv4_2 = new KeyValue(rowD, cf, col2, ts, KeyValue.Type.Put, null);<a name="line.5081"></a>
+<span class="sourceLineNo">5082</span>    KeyValue kv5 = new KeyValue(rowE, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5082"></a>
+<span class="sourceLineNo">5083</span>    Put put = null;<a name="line.5083"></a>
+<span class="sourceLineNo">5084</span>    put = new Put(rowA);<a name="line.5084"></a>
+<span class="sourceLineNo">5085</span>    put.add(kv1);<a name="line.5085"></a>
+<span class="sourceLineNo">5086</span>    region.put(put);<a name="line.5086"></a>
+<span class="sourceLineNo">5087</span>    put = new Put(rowB);<a name="line.5087"></a>
+<span class="sourceLineNo">5088</span>    put.add(kv2);<a name="line.5088"></a>
+<span class="sourceLineNo">5089</span>    region.put(put);<a name="line.5089"></a>
+<span class="sourceLineNo">5090</span>    put = new Put(rowC);<a name="line.5090"></a>
+<span class="sourceLineNo">5091</span>    put.add(kv3);<a name="line.5091"></a>
+<span class="sourceLineNo">5092</span>    region.put(put);<a name="line.5092"></a>
+<span class="sourceLineNo">5093</span>    put = new Put(rowD);<a name="line.5093"></a>
+<span class="sourceLineNo">5094</span>    put.add(kv4_1);<a name="line.5094"></a>
+<span class="sourceLineNo">5095</span>    region.put(put);<a name="line.5095"></a>
+<span class="sourceLineNo">5096</span>    put = new Put(rowD);<a name="line.5096"></a>
+<span class="sourceLineNo">5097</span>    put.add(kv4_2);<a name="line.5097"></a>
+<span class="sourceLineNo">5098</span>    region.put(put);<a name="line.5098"></a>
+<span class="sourceLineNo">5099</span>    put = new Put(rowE);<a name="line.5099"></a>
+<span class="sourceLineNo">5100</span>    put.add(kv5);<a name="line.5100"></a>
+<span class="sourceLineNo">5101</span>    region.put(put);<a name="line.5101"></a>
+<span class="sourceLineNo">5102</span>    region.flush(true);<a name="line.5102"></a>
+<span class="sourceLineNo">5103</span>    Scan scan = new Scan(rowD, rowA);<a name="line.5103"></a>
+<span class="sourceLineNo">5104</span>    scan.addColumn(families[0], col1);<a name="line.5104"></a>
+<span class="sourceLineNo">5105</span>    scan.setReversed(true);<a name="line.5105"></a>
+<span class="sourceLineNo">5106</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5106"></a>
+<span class="sourceLineNo">5107</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5107"></a>
+<span class="sourceLineNo">5108</span>    boolean hasNext = scanner.next(currRow);<a name="line.5108"></a>
+<span class="sourceLineNo">5109</span>    assertEquals(1, currRow.size());<a name="line.5109"></a>
+<span class="sourceLineNo">5110</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5110"></a>
+<span class="sourceLineNo">5111</span>        .get(0).getRowLength(), rowD, 0, rowD.length));<a name="line.5111"></a>
+<span class="sourceLineNo">5112</span>    assertTrue(hasNext);<a name="line.5112"></a>
+<span class="sourceLineNo">5113</span>    currRow.clear();<a name="line.5113"></a>
+<span class="sourceLineNo">5114</span>    hasNext = scanner.next(currRow);<a name="line.5114"></a>
+<span class="sourceLineNo">5115</span>    assertEquals(1, currRow.size());<a name="line.5115"></a>
+<span class="sourceLineNo">5116</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5116"></a>
+<span class="sourceLineNo">5117</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.5117"></a>
+<span class="sourceLineNo">5118</span>    assertTrue(hasNext);<a name="line.5118"></a>
+<span class="sourceLineNo">5119</span>    currRow.clear();<a name="line.5119"></a>
+<span class="sourceLineNo">5120</span>    hasNext = scanner.next(currRow);<a name="line.5120"></a>
+<span class="sourceLineNo">5121</span>    assertEquals(1, currRow.size());<a name="line.5121"></a>
+<span class="sourceLineNo">5122</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5122"></a>
+<span class="sourceLineNo">5123</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.5123"></a>
+<span class="sourceLineNo">5124</span>    assertFalse(hasNext);<a name="line.5124"></a>
+<span class="sourceLineNo">5125</span>    scanner.close();<a name="line.5125"></a>
+<span class="sourceLineNo">5126</span><a name="line.5126"></a>
+<span class="sourceLineNo">5127</span>    scan = new Scan(rowD, rowA);<a name="line.5127"></a>
+<span class="sourceLineNo">5128</span>    scan.addColumn(families[0], col2);<a name="line.5128"></a>
+<span class="sourceLineNo">5129</span>    scan.setReversed(true);<a name="line.5129"></a>
+<span class="sourceLineNo">5130</span>    currRow.clear();<a name="line.5130"></a>
+<span class="sourceLineNo">5131</span>    scanner = region.getScanner(scan);<a name="line.5131"></a>
+<span class="sourceLineNo">5132</span>    hasNext = scanner.next(currRow);<a name="line.5132"></a>
+<span class="sourceLineNo">5133</span>    assertEquals(1, currRow.size());<a name="line.5133"></a>
+<span class="sourceLineNo">5134</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5134"></a>
+<span class="sourceLineNo">5135</span>        .get(0).getRowLength(), rowD, 0, rowD.length));<a name="line.5135"></a>
+<span class="sourceLineNo">5136</span>    scanner.close();<a name="line.5136"></a>
+<span class="sourceLineNo">5137</span>  }<a name="line.5137"></a>
+<span class="sourceLineNo">5138</span><a name="line.5138"></a>
+<span class="sourceLineNo">5139</span>  @Test<a name="line.5139"></a>
+<span class="sourceLineNo">5140</span>  public void testReverseScanner_smaller_blocksize() throws IOException {<a name="line.5140"></a>
+<span class="sourceLineNo">5141</span>    // case to ensure no conflict with HFile index optimization<a name="line.5141"></a>
+<span class="sourceLineNo">5142</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.5142"></a>
+<span class="sourceLineNo">5143</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.5143"></a>
+<span class="sourceLineNo">5144</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.5144"></a>
+<span class="sourceLineNo">5145</span>    byte[] rowD = Bytes.toBytes("rowD");<a name="line.5145"></a>
+<span class="sourceLineNo">5146</span>    byte[] rowE = Bytes.toBytes("rowE");<a name="line.5146"></a>
+<span class="sourceLineNo">5147</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.5147"></a>
+<span class="sourceLineNo">5148</span>    byte[][] families = { cf };<a name="line.5148"></a>
+<span class="sourceLineNo">5149</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.5149"></a>
+<span class="sourceLineNo">5150</span>    byte[] col2 = Bytes.toBytes("col2");<a name="line.5150"></a>
+<span class="sourceLineNo">5151</span>    long ts = 1;<a name="line.5151"></a>
+<span class="sourceLineNo">5152</span>    HBaseConfiguration config = new HBaseConfiguration();<a name="line.5152"></a>
+<span class="sourceLineNo">5153</span>    config.setInt("test.block.size", 1);<a name="line.5153"></a>
+<span class="sourceLineNo">5154</span>    this.region = initHRegion(tableName, method, config, families);<a name="line.5154"></a>
+<span class="sourceLineNo">5155</span>    KeyValue kv1 = new KeyValue(rowA, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5155"></a>
+<span class="sourceLineNo">5156</span>    KeyValue kv2 = new KeyValue(rowB, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5156"></a>
+<span class="sourceLineNo">5157</span>    KeyValue kv3 = new KeyValue(rowC, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5157"></a>
+<span class="sourceLineNo">5158</span>    KeyValue kv4_1 = new KeyValue(rowD, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5158"></a>
+<span class="sourceLineNo">5159</span>    KeyValue kv4_2 = new KeyValue(rowD, cf, col2, ts, KeyValue.Type.Put, null);<a name="line.5159"></a>
+<span class="sourceLineNo">5160</span>    KeyValue kv5 = new KeyValue(rowE, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5160"></a>
+<span class="sourceLineNo">5161</span>    Put put = null;<a name="line.5161"></a>
+<span class="sourceLineNo">5162</span>    put = new Put(rowA);<a name="line.5162"></a>
+<span class="sourceLineNo">5163</span>    put.add(kv1);<a name="line.5163"></a>
+<span class="sourceLineNo">5164</span>    region.put(put);<a name="line.5164"></a>
+<span class="sourceLineNo">5165</span>    put = new Put(rowB);<a name="line.5165"></a>
+<span class="sourceLineNo">5166</span>    put.add(kv2);<a name="line.5166"></a>
+<span class="sourceLineNo">5167</span>    region.put(put);<a name="line.5167"></a>
+<span class="sourceLineNo">5168</span>    put = new Put(rowC);<a name="line.5168"></a>
+<span class="sourceLineNo">5169</span>    put.add(kv3);<a name="line.5169"></a>
+<span class="sourceLineNo">5170</span>    region.put(put);<a name="line.5170"></a>
+<span class="sourceLineNo">5171</span>    put = new Put(rowD);<a name="line.5171"></a>
+<span class="sourceLineNo">5172</span>    put.add(kv4_1);<a name="line.5172"></a>
+<span class="sourceLineNo">5173</span>    region.put(put);<a name="line.5173"></a>
+<span class="sourceLineNo">5174</span>    put = new Put(rowD);<a name="line.5174"></a>
+<span class="sourceLineNo">5175</span>    put.add(kv4_2);<a name="line.5175"></a>
+<span class="sourceLineNo">5176</span>    region.put(put);<a name="line.5176"></a>
+<span class="sourceLineNo">5177</span>    put = new Put(rowE);<a name="line.5177"></a>
+<span class="sourceLineNo">5178</span>    put.add(kv5);<a name="line.5178"></a>
+<span class="sourceLineNo">5179</span>    region.put(put);<a name="line.5179"></a>
+<span class="sourceLineNo">5180</span>    region.flush(true);<a name="line.5180"></a>
+<span class="sourceLineNo">5181</span>    Scan scan = new Scan(rowD, rowA);<a name="line.5181"></a>
+<span class="sourceLineNo">5182</span>    scan.addColumn(families[0], col1);<a name="line.5182"></a>
+<span class="sourceLineNo">5183</span>    scan.setReversed(true);<a name="line.5183"></a>
+<span class="sourceLineNo">5184</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5184"></a>
+<span class="sourceLineNo">5185</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5185"></a>
+<span class="sourceLineNo">5186</span>    boolean hasNext = scanner.next(currRow);<a name="line.5186"></a>
+<span class="sourceLineNo">5187</span>    assertEquals(1, currRow.size());<a name="line.5187"></a>
+<span class="sourceLineNo">5188</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5188"></a>
+<span class="sourceLineNo">5189</span>        .get(0).getRowLength(), rowD, 0, rowD.length));<a name="line.5189"></a>
+<span class="sourceLineNo">5190</span>    assertTrue(hasNext);<a name="line.5190"></a>
+<span class="sourceLineNo">5191</span>    currRow.clear();<a name="line.5191"></a>
+<span class="sourceLineNo">5192</span>    hasNext = scanner.next(currRow);<a name="line.5192"></a>
+<span class="sourceLineNo">5193</span>    assertEquals(1, currRow.size());<a name="line.5193"></a>
+<span class="sourceLineNo">5194</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5194"></a>
+<span class="sourceLineNo">5195</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.5195"></a>
+<span class="sourceLineNo">5196</span>    assertTrue(hasNext);<a name="line.5196"></a>
+<span class="sourceLineNo">5197</span>    currRow.clear();<a name="line.5197"></a>
+<span class="sourceLineNo">5198</span>    hasNext = scanner.next(currRow);<a name="line.5198"></a>
+<span class="sourceLineNo">5199</span>    assertEquals(1, currRow.size());<a name="line.5199"></a>
+<span class="sourceLineNo">5200</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5200"></a>
+<span class="sourceLineNo">5201</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.5201"></a>
+<span class="sourceLineNo">5202</span>    assertFalse(hasNext);<a name="line.5202"></a>
+<span class="sourceLineNo">5203</span>    scanner.close();<a name="line.5203"></a>
+<span class="sourceLineNo">5204</span><a name="line.5204"></a>
+<span class="sourceLineNo">5205</span>    scan = new Scan(rowD, rowA);<a name="line.5205"></a>
+<span class="sourceLineNo">5206</span>    scan.addColumn(families[0], col2);<a name="line.5206"></a>
+<span class="sourceLineNo">5207</span>    scan.setReversed(true);<a name="line.5207"></a>
+<span class="sourceLineNo">5208</span>    currRow.clear();<a name="line.5208"></a>
+<span class="sourceLineNo">5209</span>    scanner = region.getScanner(scan);<a name="line.5209"></a>
+<span class="sourceLineNo">5210</span>    hasNext = scanner.next(currRow);<a name="line.5210"></a>
+<span class="sourceLineNo">5211</span>    assertEquals(1, currRow.size());<a name="line.5211"></a>
+<span class="sourceLineNo">5212</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5212"></a>
+<span class="sourceLineNo">5213</span>        .get(0).getRowLength(), rowD, 0, rowD.length));<a name="line.5213"></a>
+<span class="sourceLineNo">5214</span>    scanner.close();<a name="line.5214"></a>
+<span class="sourceLineNo">5215</span>  }<a name="line.5215"></a>
+<span class="sourceLineNo">5216</span><a name="line.5216"></a>
+<span class="sourceLineNo">5217</span>  @Test<a name="line.5217"></a>
+<span class="sourceLineNo">5218</span>  public void testReverseScanner_FromMemStoreAndHFiles_MultiCFs1()<a name="line.5218"></a>
+<span class="sourceLineNo">5219</span>      throws IOException {<a name="line.5219"></a>
+<span class="sourceLineNo">5220</span>    byte[] row0 = Bytes.toBytes("row0"); // 1 kv<a name="line.5220"></a>
+<span class="sourceLineNo">5221</span>    byte[] row1 = Bytes.toBytes("row1"); // 2 kv<a name="line.5221"></a>
+<span class="sourceLineNo">5222</span>    byte[] row2 = Bytes.toBytes("row2"); // 4 kv<a name="line.5222"></a>
+<span class="sourceLineNo">5223</span>    byte[] row3 = Bytes.toBytes("row3"); // 2 kv<a name="line.5223"></a>
+<span class="sourceLineNo">5224</span>    byte[] row4 = Bytes.toBytes("row4"); // 5 kv<a name="line.5224"></a>
+<span class="sourceLineNo">5225</span>    byte[] row5 = Bytes.toBytes("row5"); // 2 kv<a name="line.5225"></a>
+<span class="sourceLineNo">5226</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5226"></a>
+<span class="sourceLineNo">5227</span>    byte[] cf2 = Bytes.toBytes("CF2");<a name="line.5227"></a>
+<span class="sourceLineNo">5228</span>    byte[] cf3 = Bytes.toBytes("CF3");<a name="line.5228"></a>
+<span class="sourceLineNo">5229</span>    byte[][] families = { cf1, cf2, cf3 };<a name="line.5229"></a>
+<span class="sourceLineNo">5230</span>    byte[] col = Bytes.toBytes("C");<a name="line.5230"></a>
+<span class="sourceLineNo">5231</span>    long ts = 1;<a name="line.5231"></a>
+<span class="sourceLineNo">5232</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5232"></a>
+<span class="sourceLineNo">5233</span>    // disable compactions in this test.<a name="line.5233"></a>
+<span class="sourceLineNo">5234</span>    conf.setInt("hbase.hstore.compactionThreshold", 10000);<a name="line.5234"></a>
+<span class="sourceLineNo">5235</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5235"></a>
+<span class="sourceLineNo">5236</span>    // kv naming style: kv(row number) totalKvCountInThisRow seq no<a name="line.5236"></a>
+<span class="sourceLineNo">5237</span>    KeyValue kv0_1_1 = new KeyValue(row0, cf1, col, ts, KeyValue.Type.Put,<a name="line.5237"></a>
 <span class="sourceLineNo">5238</span>        null);<a name="line.5238"></a>
-<span class="sourceLineNo">5239</span>    KeyValue kv2_4_4 = new KeyValue(row2, cf1, col, ts + 4,<a name="line.5239"></a>
-<span class="sourceLineNo">5240</span>        KeyValue.Type.Put, null);<a name="line.5240"></a>
-<span class="sourceLineNo">5241</span>    KeyValue kv3_2_1 = new KeyValue(row3, cf2, col, ts, KeyValue.Type.Put,<a name="line.5241"></a>
-<span class="sourceLineNo">5242</span>        null);<a name="line.5242"></a>
-<span class="sourceLineNo">5243</span>    KeyValue kv3_2_2 = new KeyValue(row3, cf1, col, ts + 4,<a name="line.5243"></a>
-<span class="sourceLineNo">5244</span>        KeyValue.Type.Put, null);<a name="line.5244"></a>
-<span class="sourceLineNo">5245</span>    KeyValue kv4_5_1 = new KeyValue(row4, cf1, col, ts, KeyValue.Type.Put,<a name="line.5245"></a>
+<span class="sourceLineNo">5239</span>    KeyValue kv1_2_1 = new KeyValue(row1, cf2, col, ts, KeyValue.Type.Put,<a name="line.5239"></a>
+<span class="sourceLineNo">5240</span>        null);<a name="line.5240"></a>
+<span class="sourceLineNo">5241</span>    KeyValue kv1_2_2 = new KeyValue(row1, cf1, col, ts + 1,<a name="line.5241"></a>
+<span class="sourceLineNo">5242</span>        KeyValue.Type.Put, null);<a name="line.5242"></a>
+<span class="sourceLineNo">5243</span>    KeyValue kv2_4_1 = new KeyValue(row2, cf2, col, ts, KeyValue.Type.Put,<a name="line.5243"></a>
+<span class="sourceLineNo">5244</span>        null);<a name="line.5244"></a>
+<span class="sourceLineNo">5245</span>    KeyValue kv2_4_2 = new KeyValue(row2, cf1, col, ts, KeyValue.Type.Put,<a name="line.5245"></a>
 <span class="sourceLineNo">5246</span>        null);<a name="line.5246"></a>
-<span class="sourceLineNo">5247</span>    KeyValue kv4_5_2 = new KeyValue(row4, cf3, col, ts, KeyValue.Type.Put,<a name="line.5247"></a>
+<span class="sourceLineNo">5247</span>    KeyValue kv2_4_3 = new KeyValue(row2, cf3, col, ts, KeyValue.Type.Put,<a name="line.5247"></a>
 <span class="sourceLineNo">5248</span>        null);<a name="line.5248"></a>
-<span class="sourceLineNo">5249</span>    KeyValue kv4_5_3 = new KeyValue(row4, cf3, col, ts + 5,<a name="line.5249"></a>
+<span class="sourceLineNo">5249</span>    KeyValue kv2_4_4 = new KeyValue(row2, cf1, col, ts + 4,<a name="line.5249"></a>
 <span class="sourceLineNo">5250</span>        KeyValue.Type.Put, null);<a name="line.5250"></a>
-<span class="sourceLineNo">5251</span>    KeyValue kv4_5_4 = new KeyValue(row4, cf2, col, ts, KeyValue.Type.Put,<a name="line.5251"></a>
+<span class="sourceLineNo">5251</span>    KeyValue kv3_2_1 = new KeyValue(row3, cf2, col, ts, KeyValue.Type.Put,<a name="line.5251"></a>
 <span class="sourceLineNo">5252</span>        null);<a name="line.5252"></a>
-<span class="sourceLineNo">5253</span>    KeyValue kv4_5_5 = new KeyValue(row4, cf1, col, ts + 3,<a name="line.5253"></a>
+<span class="sourceLineNo">5253</span>    KeyValue kv3_2_2 = new KeyValue(row3, cf1, col, ts + 4,<a name="line.5253"></a>
 <span class="sourceLineNo">5254</span>        KeyValue.Type.Put, null);<a name="line.5254"></a>
-<span class="sourceLineNo">5255</span>    KeyValue kv5_2_1 = new KeyValue(row5, cf2, col, ts, KeyValue.Type.Put,<a name="line.5255"></a>
+<span class="sourceLineNo">5255</span>    KeyValue kv4_5_1 = new KeyValue(row4, cf1, col, ts, KeyValue.Type.Put,<a name="line.5255"></a>
 <span class="sourceLineNo">5256</span>        null);<a name="line.5256"></a>
-<span class="sourceLineNo">5257</span>    KeyValue kv5_2_2 = new KeyValue(row5, cf3, col, ts, KeyValue.Type.Put,<a name="line.5257"></a>
+<span class="sourceLineNo">5257</span>    KeyValue kv4_5_2 = new KeyValue(row4, cf3, col, ts, KeyValue.Type.Put,<a name="line.5257"></a>
 <span class="sourceLineNo">5258</span>        null);<a name="line.5258"></a>
-<span class="sourceLineNo">5259</span>    // hfiles(cf1/cf2) :"row1"(1 kv) / "row2"(1 kv) / "row4"(2 kv)<a name="line.5259"></a>
-<span class="sourceLineNo">5260</span>    Put put = null;<a name="line.5260"></a>
-<span class="sourceLineNo">5261</span>    put = new Put(row1);<a name="line.5261"></a>
-<span class="sourceLineNo">5262</span>    put.add(kv1_2_1);<a name="line.5262"></a>
-<span class="sourceLineNo">5263</span>    region.put(put);<a name="line.5263"></a>
-<span class="sourceLineNo">5264</span>    put = new Put(row2);<a name="line.5264"></a>
-<span class="sourceLineNo">5265</span>    put.add(kv2_4_1);<a name="line.5265"></a>
-<span class="sourceLineNo">5266</span>    region.put(put);<a name="line.5266"></a>
-<span class="sourceLineNo">5267</span>    put = new Put(row4);<a name="line.5267"></a>
-<span class="sourceLineNo">5268</span>    put.add(kv4_5_4);<a name="line.5268"></a>
-<span class="sourceLineNo">5269</span>    put.add(kv4_5_5);<a name="line.5269"></a>
-<span class="sourceLineNo">5270</span>    region.put(put);<a name="line.5270"></a>
-<span class="sourceLineNo">5271</span>    region.flush(true);<a name="line.5271"></a>
-<span class="sourceLineNo">5272</span>    // hfiles(cf1/cf3) : "row1" (1 kvs) / "row2" (1 kv) / "row4" (2 kv)<a name="line.5272"></a>
-<span class="sourceLineNo">5273</span>    put = new Put(row4);<a name="line.5273"></a>
-<span class="sourceLineNo">5274</span>    put.add(kv4_5_1);<a name="line.5274"></a>
-<span class="sourceLineNo">5275</span>    put.add(kv4_5_3);<a name="line.5275"></a>
+<span class="sourceLineNo">5259</span>    KeyValue kv4_5_3 = new KeyValue(row4, cf3, col, ts + 5,<a name="line.5259"></a>
+<span class="sourceLineNo">5260</span>        KeyValue.Type.Put, null);<a name="line.5260"></a>
+<span class="sourceLineNo">5261</span>    KeyValue kv4_5_4 = new KeyValue(row4, cf2, col, ts, KeyValue.Type.Put,<a name="line.5261"></a>
+<span class="sourceLineNo">5262</span>        null);<a name="line.5262"></a>
+<span class="sourceLineNo">5263</span>    KeyValue kv4_5_5 = new KeyValue(row4, cf1, col, ts + 3,<a name="line.5263"></a>
+<span class="sourceLineNo">5264</span>        KeyValue.Type.Put, null);<a name="line.5264"></a>
+<span class="sourceLineNo">5265</span>    KeyValue kv5_2_1 = new KeyValue(row5, cf2, col, ts, KeyValue.Type.Put,<a name="line.5265"></a>
+<span class="sourceLineNo">5266</span>        null);<a name="line.5266"></a>
+<span class="sourceLineNo">5267</span>    KeyValue kv5_2_2 = new KeyValue(row5, cf3, col, ts, KeyValue.Type.Put,<a name="line.5267"></a>
+<span class="sourceLineNo">5268</span>        null);<a name="line.5268"></a>
+<span class="sourceLineNo">5269</span>    // hfiles(cf1/cf2) :"row1"(1 kv) / "row2"(1 kv) / "row4"(2 kv)<a name="line.5269"></a>
+<span class="sourceLineNo">5270</span>    Put put = null;<a name="line.5270"></a>
+<span class="sourceLineNo">5271</span>    put = new Put(row1);<a name="line.5271"></a>
+<span class="sourceLineNo">5272</span>    put.add(kv1_2_1);<a name="line.5272"></a>
+<span class="sourceLineNo">5273</span>    region.put(put);<a name="line.5273"></a>
+<span class="sourceLineNo">5274</span>    put = new Put(row2);<a name="line.5274"></a>
+<span class="sourceLineNo">5275</span>    put.add(kv2_4_1);<a name="line.5275"></a>
 <span class="sourceLineNo">5276</span>    region.put(put);<a name="line.5276"></a>
-<span class="sourceLineNo">5277</span>    put = new Put(row1);<a name="line.5277"></a>
-<span class="sourceLineNo">5278</span>    put.add(kv1_2_2);<a name="line.5278"></a>
-<span class="sourceLineNo">5279</span>    region.put(put);<a name="line.5279"></a>
-<span class="sourceLineNo">5280</span>    put = new Put(row2);<a name="line.5280"></a>
-<span class="sourceLineNo">5281</span>    put.add(kv2_4_4);<a name="line.5281"></a>
-<span class="sourceLineNo">5282</span>    region.put(put);<a name="line.5282"></a>
-<span class="sourceLineNo">5283</span>    region.flush(true);<a name="line.5283"></a>
-<span class="sourceLineNo">5284</span>    // hfiles(cf1/cf3) : "row2"(2 kv) / "row3"(1 kvs) / "row4" (1 kv)<a name="line.5284"></a>
-<span class="sourceLineNo">5285</span>    put = new Put(row4);<a name="line.5285"></a>
-<span class="sourceLineNo">5286</span>    put.add(kv4_5_2);<a name="line.5286"></a>
-<span class="sourceLineNo">5287</span>    region.put(put);<a name="line.5287"></a>
-<span class="sourceLineNo">5288</span>    put = new Put(row2);<a name="line.5288"></a>
-<span class="sourceLineNo">5289</span>    put.add(kv2_4_2);<a name="line.5289"></a>
-<span class="sourceLineNo">5290</span>    put.add(kv2_4_3);<a name="line.5290"></a>
-<span class="sourceLineNo">5291</span>    region.put(put);<a name="line.5291"></a>
-<span class="sourceLineNo">5292</span>    put = new Put(row3);<a name="line.5292"></a>
-<span class="sourceLineNo">5293</span>    put.add(kv3_2_2);<a name="line.5293"></a>
-<span class="sourceLineNo">5294</span>    region.put(put);<a name="line.5294"></a>
-<span class="sourceLineNo">5295</span>    region.flush(true);<a name="line.5295"></a>
-<span class="sourceLineNo">5296</span>    // memstore(cf1/cf2/cf3) : "row0" (1 kvs) / "row3" ( 1 kv) / "row5" (max)<a name="line.5296"></a>
-<span class="sourceLineNo">5297</span>    // ( 2 kv)<a name="line.5297"></a>
-<span class="sourceLineNo">5298</span>    put = new Put(row0);<a name="line.5298"></a>
-<span class="sourceLineNo">5299</span>    put.add(kv0_1_1);<a name="line.5299"></a>
-<span class="sourceLineNo">5300</span>    region.put(put);<a name="line.5300"></a>
-<span class="sourceLineNo">5301</span>    put = new Put(row3);<a name="line.5301"></a>
-<span class="sourceLineNo">5302</span>    put.add(kv3_2_1);<a name="line.5302"></a>
-<span class="sourceLineNo">5303</span>    region.put(put);<a name="line.5303"></a>
-<span class="sourceLineNo">5304</span>    put = new Put(row5);<a name="line.5304"></a>
-<span class="sourceLineNo">5305</span>    put.add(kv5_2_1);<a name="line.5305"></a>
-<span class="sourceLineNo">5306</span>    put.add(kv5_2_2);<a name="line.5306"></a>
-<span class="sourceLineNo">5307</span>    region.put(put);<a name="line.5307"></a>
-<span class="sourceLineNo">5308</span>    // scan range = ["row4", min), skip the max "row5"<a name="line.5308"></a>
-<span class="sourceLineNo">5309</span>    Scan scan = new Scan(row4);<a name="line.5309"></a>
-<span class="sourceLineNo">5310</span>    scan.setMaxVersions(5);<a name="line.5310"></a>
-<span class="sourceLineNo">5311</span>    scan.setBatch(3);<a name="line.5311"></a>
-<span class="sourceLineNo">5312</span>    scan.setReversed(true);<a name="line.5312"></a>
-<span class="sourceLineNo">5313</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5313"></a>
-<span class="sourceLineNo">5314</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5314"></a>
-<span class="sourceLineNo">5315</span>    boolean hasNext = false;<a name="line.5315"></a>
-<span class="sourceLineNo">5316</span>    // 1. scan out "row4" (5 kvs), "row5" can't be scanned out since not<a name="line.5316"></a>
-<span class="sourceLineNo">5317</span>    // included in scan range<a name="line.5317"></a>
-<span class="sourceLineNo">5318</span>    // "row4" takes 2 next() calls since batch=3<a name="line.5318"></a>
-<span class="sourceLineNo">5319</span>    hasNext = scanner.next(currRow);<a name="line.5319"></a>
-<span class="sourceLineNo">5320</span>    assertEquals(3, currRow.size());<a name="line.5320"></a>
-<span class="sourceLineNo">5321</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5321"></a>
-<span class="sourceLineNo">5322</span>        .get(0).getRowLength(), row4, 0, row4.length));<a name="line.5322"></a>
-<span class="sourceLineNo">5323</span>    assertTrue(hasNext);<a name="line.5323"></a>
-<span class="sourceLineNo">5324</span>    currRow.clear();<a name="line.5324"></a>
-<span class="sourceLineNo">5325</span>    hasNext = scanner.next(currRow);<a name="line.5325"></a>
-<span class="sourceLineNo">5326</span>    assertEquals(2, currRow.size());<a name="line.5326"></a>
-<span class="sourceLineNo">5327</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(),<a name="line.5327"></a>
-<span class="sourceLineNo">5328</span>        currRow.get(0).getRowLength(), row4, 0,<a name="line.5328"></a>
-<span class="sourceLineNo">5329</span>      row4.length));<a name="line.5329"></a>
-<span class="sourceLineNo">5330</span>    assertTrue(hasNext);<a name="line.5330"></a>
-<span class="sourceLineNo">5331</span>    // 2. scan out "row3" (2 kv)<a name="line.5331"></a>
-<span class="sourceLineNo">5332</span>    currRow.clear();<a name="line.5332"></a>
-<span class="sourceLineNo">5333</span>    hasNext = scanner.next(currRow);<a name="line.5333"></a>
-<span class="sourceLineNo">5334</span>    assertEquals(2, currRow.size());<a name="line.5334"></a>
-<span class="sourceLineNo">5335</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5335"></a>
-<span class="sourceLineNo">5336</span>        .get(0).getRowLength(), row3, 0, row3.length));<a name="line.5336"></a>
-<span class="sourceLineNo">5337</span>    assertTrue(hasNext);<a name="line.5337"></a>
-<span class="sourceLineNo">5338</span>    // 3. scan out "row2" (4 kvs)<a name="line.5338"></a>
-<span class="sourceLineNo">5339</span>    // "row2" takes 2 next() calls since batch=3<a name="line.5339"></a>
-<span class="sourceLineNo">5340</span>    currRow.clear();<a name="line.5340"></a>
-<span class="sourceLineNo">5341</span>    hasNext = scanner.next(currRow);<a name="line.5341"></a>
-<span class="sourceLineNo">5342</span>    assertEquals(3, currRow.size());<a name="line.5342"></a>
-<span class="sourceLineNo">5343</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5343"></a>
-<span class="sourceLineNo">5344</span>        .get(0).getRowLength(), row2, 0, row2.length));<a name="line.5344"></a>
-<span class="sourceLineNo">5345</span>    assertTrue(hasNext);<a name="line.5345"></a>
-<span class="sourceLineNo">5346</span>    currRow.clear();<a name="line.5346"></a>
-<span class="sourceLineNo">5347</span>    hasNext = scanner.next(currRow);<a name="line.5347"></a>
-<span class="sourceLineNo">5348</span>    assertEquals(1, currRow.size());<a name="line.5348"></a>
-<span class="sourceLineNo">5349</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5349"></a>
-<span class="sourceLineNo">5350</span>        .get(0).getRowLength(), row2, 0, row2.length));<a name="line.5350"></a>
-<span class="sourceLineNo">5351</span>    assertTrue(hasNext);<a name="line.5351"></a>
-<span class="sourceLineNo">5352</span>    // 4. scan out "row1" (2 kv)<a name="line.5352"></a>
-<span class="sourceLineNo">5353</span>    currRow.clear();<a name="line.5353"></a>
-<span class="sourceLineNo">5354</span>    hasNext = scanner.next(currRow);<a name="line.5354"></a>
-<span class="sourceLineNo">5355</span>    assertEquals(2, currRow.size());<a name="line.5355"></a>
-<span class="sourceLineNo">5356</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5356"></a>
-<span class="sourceLineNo">5357</span>        .get(0).getRowLength(), row1, 0, row1.length));<a name="line.5357"></a>
-<span class="sourceLineNo">5358</span>    assertTrue(hasNext);<a name="line.5358"></a>
-<span class="sourceLineNo">5359</span>    // 5. scan out "row0" (1 kv)<a name="line.5359"></a>
-<span class="sourceLineNo">5360</span>    currRow.clear();<a name="line.5360"></a>
-<span class="sourceLineNo">5361</span>    hasNext = scanner.next(currRow);<a name="line.5361"></a>
-<span class="sourceLineNo">5362</span>    assertEquals(1, currRow.size());<a name="line.5362"></a>
-<span class="sourceLineNo">5363</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5363"></a>
-<span class="sourceLineNo">5364</span>        .get(0).getRowLength(), row0, 0, row0.length));<a name="line.5364"></a>
-<span class="sourceLineNo">5365</span>    assertFalse(hasNext);<a name="line.5365"></a>
-<span class="sourceLineNo">5366</span><a name="line.5366"></a>
-<span class="sourceLineNo">5367</span>    scanner.close();<a name="line.5367"></a>
-<span class="sourceLineNo">5368</span>  }<a name="line.5368"></a>
-<span class="sourceLineNo">5369</span><a name="line.5369"></a>
-<span class="sourceLineNo">5370</span>  @Test<a name="line.5370"></a>
-<span class="sourceLineNo">5371</span>  public void testReverseScanner_FromMemStoreAndHFiles_MultiCFs2()<a name="line.5371"></a>
-<span class="sourceLineNo">5372</span>      throws IOException {<a name="line.5372"></a>
-<span class="sourceLineNo">5373</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.5373"></a>
-<span class="sourceLineNo">5374</span>    byte[] row2 = Bytes.toBytes("row2");<a name="line.5374"></a>
-<span class="sourceLineNo">5375</span>    byte[] row3 = Bytes.toBytes("row3");<a name="line.5375"></a>
-<span class="sourceLineNo">5376</span>    byte[] row4 = Bytes.toBytes("row4");<a name="line.5376"></a>
-<span class="sourceLineNo">5377</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5377"></a>
-<span class="sourceLineNo">5378</span>    byte[] cf2 = Bytes.toBytes("CF2");<a name="line.5378"></a>
-<span class="sourceLineNo">5379</span>    byte[] cf3 = Bytes.toBytes("CF3");<a name="line.5379"></a>
-<span class="sourceLineNo">5380</span>    byte[] cf4 = Bytes.toBytes("CF4");<a name="line.5380"></a>
-<span class="sourceLineNo">5381</span>    byte[][] families = { cf1, cf2, cf3, cf4 };<a name="line.5381"></a>
-<span class="sourceLineNo">5382</span>    byte[] col = Bytes.toBytes("C");<a name="line.5382"></a>
-<span class="sourceLineNo">5383</span>    long ts = 1;<a name="line.5383"></a>
-<span class="sourceLineNo">5384</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5384"></a>
-<span class="sourceLineNo">5385</span>    // disable compactions in this test.<a name="line.5385"></a>
-<span class="sourceLineNo">5386</span>    conf.setInt("hbase.hstore.compactionThreshold", 10000);<a name="line.5386"></a>
-<span class="sourceLineNo">5387</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5387"></a>
-<span class="sourceLineNo">5388</span>    KeyValue kv1 = new KeyValue(row1, cf1, col, ts, KeyValue.Type.Put, null);<a name="line.5388"></a>
-<span class="sourceLineNo">5389</span>    KeyValue kv2 = new KeyValue(row2, cf2, col, ts, KeyValue.Type.Put, null);<a name="line.5389"></a>
-<span class="sourceLineNo">5390</span>    KeyValue kv3 = new KeyValue(row3, cf3, col, ts, KeyValue.Type.Put, null);<a name="line.5390"></a>
-<span class="sourceLineNo">5391</span>    KeyValue kv4 = new KeyValue(row4, cf4, col, ts, KeyValue.Type.Put, null);<a name="line.5391"></a>
-<span class="sourceLineNo">5392</span>    // storefile1<a name="line.5392"></a>
-<span class="sourceLineNo">5393</span>    Put put = new Put(row1);<a name="line.5393"></a>
-<span class="sourceLineNo">5394</span>    put.add(kv1);<a name="line.5394"></a>
-<span class="sourceLineNo">5395</span>    region.put(put);<a name="line.5395"></a>
-<span class="sourceLineNo">5396</span>    region.flush(true);<a name="line.5396"></a>
-<span class="sourceLineNo">5397</span>    // storefile2<a name="line.5397"></a>
-<span class="sourceLineNo">5398</span>    put = new Put(row2);<a name="line.5398"></a>
-<span class="sourceLineNo">5399</span>    put.add(kv2);<a name="line.5399"></a>
-<span class="sourceLineNo">5400</span>    region.put(put);<a name="line.5400"></a>
-<span class="sourceLineNo">5401</span>    region.flush(true);<a name="line.5401"></a>
-<span class="sourceLineNo">5402</span>    // storefile3<a name="line.5402"></a>
-<span class="sourceLineNo">5403</span>    put = new Put(row3);<a name="line.5403"></a>
-<span class="sourceLineNo">5404</span>    put.add(kv3);<a name="line.5404"></a>
+<span class="sourceLineNo">5277</span>    put = new Put(row4);<a name="line.5277"></a>
+<span class="sourceLineNo">5278</span>    put.add(kv4_5_4);<a name="line.5278"></a>
+<span class="sourceLineNo">5279</span>    put.add(kv4_5_5);<a name="line.5279"></a>
+<span class="sourceLineNo">5280</span>    region.put(put);<a name="line.5280"></a>
+<span class="sourceLineNo">5281</span>    region.flush(true);<a name="line.5281"></a>
+<span class="sourceLineNo">5282</span>    // hfiles(cf1/cf3) : "row1" (1 kvs) / "row2" (1 kv) / "row4" (2 kv)<a name="line.5282"></a>
+<span class="sourceLineNo">5283</span>    put = new Put(row4);<a name="line.5283"></a>
+<span class="sourceLineNo">5284</span>    put.add(kv4_5_1);<a name="line.5284"></a>
+<span class="sourceLineNo">5285</span>    put.add(kv4_5_3);<a name="line.5285"></a>
+<span class="sourceLineNo">5286</span>    region.put(put);<a name="line.5286"></a>
+<span class="sourceLineNo">5287</span>    put = new Put(row1);<a name="line.5287"></a>
+<span class="sourceLineNo">5288</span>    put.add(kv1_2_2);<a name="line.5288"></a>
+<span class="sourceLineNo">5289</span>    region.put(put);<a name="line.5289"></a>
+<span class="sourceLineNo">5290</span>    put = new Put(row2);<a name="line.5290"></a>
+<span class="sourceLineNo">5291</span>    put.add(kv2_4_4);<a name="line.5291"></a>
+<span class="sourceLineNo">5292</span>    region.put(put);<a name="line.5292"></a>
+<span class="sourceLineNo">5293</span>    region.flush(true);<a name="line.5293"></a>
+<span class="sourceLineNo">5294</span>    // hfiles(cf1/cf3) : "row2"(2 kv) / "row3"(1 kvs) / "row4" (1 kv)<a name="line.5294"></a>
+<span class="sourceLineNo">5295</span>    put = new Put(row4);<a name="line.5295"></a>
+<span class="sourceLineNo">5296</span>    put.add(kv4_5_2);<a name="line.5296"></a>
+<span class="sourceLineNo">5297</span>    region.put(put);<a name="line.5297"></a>
+<span class="sourceLineNo">5298</span>    put = new Put(row2);<a name="line.5298"></a>
+<span class="sourceLineNo">5299</span>    put.add(kv2_4_2);<a name="line.5299"></a>
+<span class="sourceLineNo">5300</span>    put.add(kv2_4_3);<a name="line.5300"></a>
+<span class="sourceLineNo">5301</span>    region.put(put);<a name="line.5301"></a>
+<span class="sourceLineNo">5302</span>    put = new Put(row3);<a name="line.5302"></a>
+<span class="sourceLineNo">5303</span>    put.add(kv3_2_2);<a name="line.5303"></a>
+<span class="sourceLineNo">5304</span>    region.put(put);<a name="line.5304"></a>
+<span class="sourceLineNo">5305</span>    region.flush(true);<a name="line.5305"></a>
+<span class="sourceLineNo">5306</span>    // memstore(cf1/cf2/cf3) : "row0" (1 kvs) / "row3" ( 1 kv) / "row5" (max)<a name="line.5306"></a>
+<span class="sourceLineNo">5307</span>    // ( 2 kv)<a name="line.5307"></a>
+<span class="sourceLineNo">5308</span>    put = new Put(row0);<a name="line.5308"></a>
+<span class="sourceLineNo">5309</span>    put.add(kv0_1_1);<a name="line.5309"></a>
+<span class="sourceLineNo">5310</span>    region.put(put);<a name="line.5310"></a>
+<span class="sourceLineNo">5311</span>    put = new Put(row3);<a name="line.5311"></a>
+<span class="sourceLineNo">5312</span>    put.add(kv3_2_1);<a name="line.5312"></a>
+<span class="sourceLineNo">5313</span>    region.put(put);<a name="line.5313"></a>
+<span class="sourceLineNo">5314</span>    put = new Put(row5);<a name="line.5314"></a>
+<span class="sourceLineNo">5315</span>    put.add(kv5_2_1);<a name="line.5315"></a>
+<span class="sourceLineNo">5316</span>    put.add(kv5_2_2);<a name="line.5316"></a>
+<span class="sourceLineNo">5317</span>    region.put(put);<a name="line.5317"></a>
+<span class="sourceLineNo">5318</span>    // scan range = ["row4", min), skip the max "row5"<a name="line.5318"></a>
+<span class="sourceLineNo">5319</span>    Scan scan = new Scan(row4);<a name="line.5319"></a>
+<span class="sourceLineNo">5320</span>    scan.setMaxVersions(5);<a name="line.5320"></a>
+<span class="sourceLineNo">5321</span>    scan.setBatch(3);<a name="line.5321"></a>
+<span class="sourceLineNo">5322</span>    scan.setReversed(true);<a name="line.5322"></a>
+<span class="sourceLineNo">5323</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5323"></a>
+<span class="sourceLineNo">5324</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5324"></a>
+<span class="sourceLineNo">5325</span>    boolean hasNext = false;<a name="line.5325"></a>
+<span class="sourceLineNo">5326</span>    // 1. scan out "row4" (5 kvs), "row5" can't be scanned out since not<a name="line.5326"></a>
+<span class="sourceLineNo">5327</span>    // included in scan range<a name="line.5327"></a>
+<span class="sourceLineNo">5328</span>    // "row4" takes 2 next() calls since batch=3<a name="line.5328"></a>
+<span class="sourceLineNo">5329</span>    hasNext = scanner.next(currRow);<a name="line.5329"></a>
+<span class="sourceLineNo">5330</span>    assertEquals(3, currRow.size());<a name="line.5330"></a>
+<span class="sourceLineNo">5331</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5331"></a>
+<span class="sourceLineNo">5332</span>        .get(0).getRowLength(), row4, 0, row4.length));<a name="line.5332"></a>
+<span class="sourceLineNo">5333</span>    assertTrue(hasNext);<a name="line.5333"></a>
+<span class="sourceLineNo">5334</span>    currRow.clear();<a name="line.5334"></a>
+<span class="sourceLineNo">5335</span>    hasNext = scanner.next(currRow);<a name="line.5335"></a>
+<span class="sourceLineNo">5336</span>    assertEquals(2, currRow.size());<a name="line.5336"></a>
+<span class="sourceLineNo">5337</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(),<a name="line.5337"></a>
+<span class="sourceLineNo">5338</span>        currRow.get(0).getRowLength(), row4, 0,<a name="line.5338"></a>
+<span class="sourceLineNo">5339</span>      row4.length));<a name="line.5339"></a>
+<span class="sourceLineNo">5340</span>    assertTrue(hasNext);<a name="line.5340"></a>
+<span class="sourceLineNo">5341</span>    // 2. scan out "row3" (2 kv)<a name="line.5341"></a>
+<span class="sourceLineNo">5342</span>    currRow.clear();<a name="line.5342"></a>
+<span class="sourceLineNo">5343</span>    hasNext = scanner.next(currRow);<a name="line.5343"></a>
+<span class="sourceLineNo">5344</span>    assertEquals(2, currRow.size());<a name="line.5344"></a>
+<span class="sourceLineNo">5345</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5345"></a>
+<span class="sourceLineNo">5346</span>        .get(0).getRowLength(), row3, 0, row3.length));<a name="line.5346"></a>
+<span class="sourceLineNo">5347</span>    assertTrue(hasNext);<a name="line.5347"></a>
+<span class="sourceLineNo">5348</span>    // 3. scan out "row2" (4 kvs)<a name="line.5348"></a>
+<span class="sourceLineNo">5349</span>    // "row2" takes 2 next() calls since batch=3<a name="line.5349"></a>
+<span class="sourceLineNo">5350</span>    currRow.clear();<a name="line.5350"></a>
+<span class="sourceLineNo">5351</span>    hasNext = scanner.next(currRow);<a name="line.5351"></a>
+<span class="sourceLineNo">5352</span>    assertEquals(3, currRow.size());<a name="line.5352"></a>
+<span class="sourceLineNo">5353</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5353"></a>
+<span class="sourceLineNo">5354</span>        .get(0).getRowLength(), row2, 0, row2.length));<a name="line.5354"></a>
+<span class="sourceLineNo">5355</span>    assertTrue(hasNext);<a name="line.5355"></a>
+<span class="sourceLineNo">5356</span>    currRow.clear();<a name="line.5356"></a>
+<span class="sourceLineNo">5357</span>    hasNext = scanner.next(currRow);<a name="line.5357"></a>
+<span class="sourceLineNo">5358</span>    assertEquals(1, currRow.size());<a name="line.5358"></a>
+<span class="sourceLineNo">5359</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5359"></a>
+<span class="sourceLineNo">5360</span>        .get(0).getRowLength(), row2, 0, row2.length));<a name="line.5360"></a>
+<span class="sourceLineNo">5361</span>    assertTrue(hasNext);<a name="line.5361"></a>
+<span class="sourceLineNo">5362</span>    // 4. scan out "row1" (2 kv)<a name="line.5362"></a>
+<span class="sourceLineNo">5363</span>    currRow.clear();<a name="line.5363"></a>
+<span class="sourceLineNo">5364</span>    hasNext = scanner.next(currRow);<a name="line.5364"></a>
+<span class="sourceLineNo">5365</span>    assertEquals(2, currRow.size());<a name="line.5365"></a>
+<span class="sourceLineNo">5366</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5366"></a>
+<span class="sourceLineNo">5367</span>        .get(0).getRowLength(), row1, 0, row1.length));<a name="line.5367"></a>
+<span class="sourceLineNo">5368</span>    assertTrue(hasNext);<a name="line.5368"></a>
+<span class="sourceLineNo">5369</span>    // 5. scan out "row0" (1 kv)<a name="line.5369"></a>
+<span class="sourceLineNo">5370</span>    currRow.clear();<a name="line.5370"></a>
+<span class="sourceLineNo">5371</span>    hasNext = scanner.next(currRow);<a name="line.5371"></a>
+<span class="sourceLineNo">5372</span>    assertEquals(1, currRow.size());<a name="line.5372"></a>
+<span class="sourceLineNo">5373</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5373"></a>
+<span class="sourceLineNo">5374</span>        .get(0).getRowLength(), row0, 0, row0.length));<a name="line.5374"></a>
+<span class="sourceLineNo">5375</span>    assertFalse(hasNext);<a name="line.5375"></a>
+<span class="sourceLineNo">5376</span><a name="line.5376"></a>
+<span class="sourceLineNo">5377</span>    scanner.close();<a name="line.5377"></a>
+<span class="sourceLineNo">5378</span>  }<a name="line.5378"></a>
+<span class="sourceLineNo">5379</span><a name="line.5379"></a>
+<span class="sourceLineNo">5380</span>  @Test<a name="line.5380"></a>
+<span class="sourceLineNo">5381</span>  public void testReverseScanner_FromMemStoreAndHFiles_MultiCFs2()<a name="line.5381"></a>
+<span class="sourceLineNo">5382</span>      throws IOException {<a name="line.5382"></a>
+<span class="sourceLineNo">5383</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.5383"></a>
+<span class="sourceLineNo">5384</span>    byte[] row2 = Bytes.toBytes("row2");<a name="line.5384"></a>
+<span class="sourceLineNo">5385</span>    byte[] row3 = Bytes.toBytes("row3");<a name="line.5385"></a>
+<span class="sourceLineNo">5386</span>    byte[] row4 = Bytes.toBytes("row4");<a name="line.5386"></a>
+<span class="sourceLineNo">5387</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5387"></a>
+<span class="sourceLineNo">5388</span>    byte[] cf2 = Bytes.toBytes("CF2");<a name="line.5388"></a>
+<span class="sourceLineNo">5389</span>    byte[] cf3 = Bytes.toBytes("CF3");<a name="line.5389"></a>
+<span class="sourceLineNo">5390</span>    byte[] cf4 = Bytes.toBytes("CF4");<a name="line.5390"></a>
+<span class="sourceLineNo">5391</span>    byte[][] families = { cf1, cf2, cf3, cf4 };<a name="line.5391"></a>
+<span class="sourceLineNo">5392</span>    byte[] col = Bytes.toBytes("C");<a name="line.5392"></a>
+<span class="sourceLineNo">5393</span>    long ts = 1;<a name="line.5393"></a>
+<span class="sourceLineNo">5394</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5394"></a>
+<span class="sourceLineNo">5395</span>    // disable compactions in this test.<a name="line.5395"></a>
+<span class="sourceLineNo">5396</span>    conf.setInt("hbase.hstore.compactionThreshold", 10000);<a name="line.5396"></a>
+<span class="sourceLineNo">5397</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5397"></a>
+<span class="sourceLineNo">5398</span>    KeyValue kv1 = new KeyValue(row1, cf1, col, ts, KeyValue.Type.Put, null);<a name="line.5398"></a>
+<span class="sourceLineNo">5399</span>    KeyValue kv2 = new KeyValue(row2, cf2, col, ts, KeyValue.Type.Put, null);<a name="line.5399"></a>
+<span class="sourceLineNo">5400</span>    KeyValue kv3 = new KeyValue(row3, cf3, col, ts, KeyValue.Type.Put, null);<a name="line.5400"></a>
+<span class="sourceLineNo">5401</span>    KeyValue kv4 = new KeyValue(row4, cf4, col, ts, KeyValue.Type.Put, null);<a name="line.5401"></a>
+<span class="sourceLineNo">5402</span>    // storefile1<a name="line.5402"></a>
+<span class="sourceLineNo">5403</span>    Put put = new Put(row1);<a name="line.5403"></a>
+<span class="sourceLineNo">5404</span>    put.add(kv1);<a name="line.5404"></a>
 <span class="sourceLineNo">5405</span>    region.put(put);<a name="line.5405"></a>
 <span class="sourceLineNo">5406</span>    region.flush(true);<a name="line.5406"></a>
-<span class="sourceLineNo">5407</span>    // memstore<a name="line.5407"></a>
-<span class="sourceLineNo">5408</span>    put = new Put(row4);<a name="line.5408"></a>
-<span class="sourceLineNo">5409</span>    put.add(kv4);<a name="line.5409"></a>
+<span class="sourceLineNo">5407</span>    // storefile2<a name="line.5407"></a>
+<span class="sourceLineNo">5408</span>    put = new Put(row2);<a name="line.5408"></a>
+<span class="sourceLineNo">5409</span>    put.add(kv2);<a name="line.5409"></a>
 <span class="sourceLineNo">5410</span>    region.put(put);<a name="line.5410"></a>
-<span class="sourceLineNo">5411</span>    // scan range = ["row4", min)<a name="line.5411"></a>
-<span class="sourceLineNo">5412</span>    Scan scan = new Scan(row4);<a name="line.5412"></a>
-<span class="sourceLineNo">5413</span>    scan.setReversed(true);<a name="line.5413"></a>
-<span class="sourceLineNo">5414</span>    scan.setBatch(10);<a name="line.5414"></a>
-<span class="sourceLineNo">5415</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5415"></a>
-<span class="sourceLineNo">5416</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5416"></a>
-<span class="sourceLineNo">5417</span>    boolean hasNext = scanner.next(currRow);<a name="line.5417"></a>
-<span class="sourceLineNo">5418</span>    assertEquals(1, currRow.size());<a name="line.5418"></a>
-<span class="sourceLineNo">5419</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5419"></a>
-<span class="sourceLineNo">5420</span>        .get(0).getRowLength(), row4, 0, row4.length));<a name="line.5420"></a>
-<span class="sourceLineNo">5421</span>    assertTrue(hasNext);<a name="line.5421"></a>
-<span class="sourceLineNo">5422</span>    currRow.clear();<a name="line.5422"></a>
-<span class="sourceLineNo">5423</span>    hasNext = scanner.next(currRow);<a name="line.5423"></a>
-<span class="sourceLineNo">5424</span>    assertEquals(1, currRow.size());<a name="line.5424"></a>
-<span class="sourceLineNo">5425</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5425"></a>
-<span class="sourceLineNo">5426</span>        .get(0).getRowLength(), row3, 0, row3.length));<a name="line.5426"></a>
-<span class="sourceLineNo">5427</span>    assertTrue(hasNext);<a name="line.5427"></a>
-<span class="sourceLineNo">5428</span>    currRow.clear();<a name="line.5428"></a>
-<span class="sourceLineNo">5429</span>    hasNext = scanner.next(currRow);<a name="line.5429"></a>
-<span class="sourceLineNo">5430</span>    assertEquals(1, currRow.size());<a name="line.5430"></a>
-<span class="sourceLineNo">5431</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5431"></a>
-<span class="sourceLineNo">5432</span>        .get(0).getRowLength(), row2, 0, row2.length));<a name="line.5432"></a>
-<span class="sourceLineNo">5433</span>    assertTrue(hasNext);<a name="line.5433"></a>
-<span class="sourceLineNo">5434</span>    currRow.clear();<a name="line.5434"></a>
-<span class="sourceLineNo">5435</span>    hasNext = scanner.next(currRow);<a name="line.5435"></a>
-<span class="sourceLineNo">5436</span>    assertEquals(1, currRow.size());<a name="line.5436"></a>
-<span class="sourceLineNo">5437</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5437"></a>
-<span class="sourceLineNo">5438</span>        .get(0).getRowLength(), row1, 0, row1.length));<a name="line.5438"></a>
-<span class="sourceLineNo">5439</span>    assertFalse(hasNext);<a name="line.5439"></a>
-<span class="sourceLineNo">5440</span>  }<a name="line.5440"></a>
-<span class="sourceLineNo">5441</span><a name="line.5441"></a>
-<span class="sourceLineNo">5442</span>  /**<a name="line.5442"></a>
-<span class="sourceLineNo">5443</span>   * Test for HBASE-14497: Reverse Scan threw StackOverflow caused by readPt checking<a name="line.5443"></a>
-<span class="sourceLineNo">5444</span>   */<a name="line.5444"></a>
-<span class="sourceLineNo">5445</span>  @Test<a name="line.5445"></a>
-<span class="sourceLineNo">5446</span>  public void testReverseScanner_StackOverflow() throws IOException {<a name="line.5446"></a>
-<span class="sourceLineNo">5447</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5447"></a>
-<span class="sourceLineNo">5448</span>    byte[][] families = {cf1};<a name="line.5448"></a>
-<span class="sourceLineNo">5449</span>    byte[] col = Bytes.toBytes("C");<a name="line.5449"></a>
-<span class="sourceLineNo">5450</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5450"></a>
-<span class="sourceLineNo">5451</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5451"></a>
-<span class="sourceLineNo">5452</span>    // setup with one storefile and one memstore, to create scanner and get an earlier readPt<a name="line.5452"></a>
-<span class="sourceLineNo">5453</span>    Put put = new Put(Bytes.toBytes("19998"));<a name="line.5453"></a>
-<span class="sourceLineNo">5454</span>    put.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5454"></a>
-<span class="sourceLineNo">5455</span>    region.put(put);<a name="line.5455"></a>
-<span class="sourceLineNo">5456</span>    region.flushcache(true, true, FlushLifeCycleTracker.DUMMY);<a name="line.5456"></a>
-<span class="sourceLineNo">5457</span>    Put put2 = new Put(Bytes.toBytes("19997"));<a name="line.5457"></a>
-<span class="sourceLineNo">5458</span>    put2.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5458"></a>
-<span class="sourceLineNo">5459</span>    region.put(put2);<a name="line.5459"></a>
-<span class="sourceLineNo">5460</span><a name="line.5460"></a>
-<span class="sourceLineNo">5461</span>    Scan scan = new Scan(Bytes.toBytes("19998"));<a name="line.5461"></a>
-<span class="sourceLineNo">5462</span>    scan.setReversed(true);<a name="line.5462"></a>
-<span class="sourceLineNo">5463</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5463"></a>
-<span class="sourceLineNo">5464</span><a name="line.5464"></a>
-<span class="sourceLineNo">5465</span>    // create one storefile contains many rows will be skipped<a name="line.5465"></a>
-<span class="sourceLineNo">5466</span>    // to check StoreFileScanner.seekToPreviousRow<a name="line.5466"></a>
-<span class="sourceLineNo">5467</span>    for (int i = 10000; i &lt; 20000; i++) {<a name="line.5467"></a>
-<span class="sourceLineNo">5468</span>      Put p = new Put(Bytes.toBytes(""+i));<a name="line.5468"></a>
-<span class="sourceLineNo">5469</span>      p.addColumn(cf1, col, Bytes.toBytes("" + i));<a name="line.5469"></a>
-<span class="sourceLineNo">5470</span>      region.put(p);<a name="line.5470"></a>
-<span class="sourceLineNo">5471</span>    }<a name="line.5471"></a>
-<span class="sourceLineNo">5472</span>    region.flushcache(true, true, FlushLifeCycleTracker.DUMMY);<a name="line.5472"></a>
-<span class="sourceLineNo">5473</span><a name="line.5473"></a>
-<span class="sourceLineNo">5474</span>    // create one memstore contains many rows will be skipped<a name="line.5474"></a>
-<span class="sourceLineNo">5475</span>    // to check MemStoreScanner.seekToPreviousRow<a name="line.5475"></a>
-<span class="sourceLineNo">5476</span>    for (int i = 10000; i &lt; 20000; i++) {<a name="line.5476"></a>
-<span class="sourceLineNo">5477</span>      Put p = new Put(Bytes.toBytes(""+i));<a name="line.5477"></a>
-<span class="sourceLineNo">5478</span>      p.addColumn(cf1, col, Bytes.toBytes("" + i));<a name="line.5478"></a>
-<span class="sourceLineNo">5479</span>      region.put(p);<a name="line.5479"></a>
-<span class="sourceLineNo">5480</span>    }<a name="line.5480"></a>
-<span class="sourceLineNo">5481</span><a name="line.5481"></a>
-<span class="sourceLineNo">5482</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5482"></a>
-<span class="sourceLineNo">5483</span>    boolean hasNext;<a name="line.5483"></a>
-<span class="sourceLineNo">5484</span>    do {<a name="line.5484"></a>
-<span class="sourceLineNo">5485</span>      hasNext = scanner.next(currRow);<a name="line.5485"></a>
-<span class="sourceLineNo">5486</span>    } while (hasNext);<a name="line.5486"></a>
-<span class="sourceLineNo">5487</span>    assertEquals(2, currRow.size());<a name="line.5487"></a>
-<span class="sourceLineNo">5488</span>    assertEquals("19998", Bytes.toString(currRow.get(0).getRowArray(),<a name="line.5488"></a>
-<span class="sourceLineNo">5489</span>      currRow.get(0).getRowOffset(), currRow.get(0).getRowLength()));<a name="line.5489"></a>
-<span class="sourceLineNo">5490</span>    assertEquals("19997", Bytes.toString(currRow.get(1).getRowArray(),<a name="line.5490"></a>
-<span class="sourceLineNo">5491</span>      currRow.get(1).getRowOffset(), currRow.get(1).getRowLength()));<a name="line.5491"></a>
-<span class="sourceLineNo">5492</span>  }<a name="line.5492"></a>
-<span class="sourceLineNo">5493</span><a name="line.5493"></a>
-<span class="sourceLineNo">5494</span>  @Test<a name="line.5494"></a>
-<span class="sourceLineNo">5495</span>  public void testReverseScanShouldNotScanMemstoreIfReadPtLesser() throws Exception {<a name="line.5495"></a>
-<span class="sourceLineNo">5496</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5496"></a>
-<span class="sourceLineNo">5497</span>    byte[][] families = { cf1 };<a name="line.5497"></a>
-<span class="sourceLineNo">5498</span>    byte[] col = Bytes.toBytes("C");<a name="line.5498"></a>
-<span class="sourceLineNo">5499</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5499"></a>
-<span class="sourceLineNo">5500</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5500"></a>
-<span class="sourceLineNo">5501</span>    // setup with one storefile and one memstore, to create scanner and get an earlier readPt<a name="line.5501"></a>
-<span class="sourceLineNo">5502</span>    Put put = new Put(Bytes.toBytes("19996"));<a name="line.5502"></a>
-<span class="sourceLineNo">5503</span>    put.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5503"></a>
-<span class="sourceLineNo">5504</span>    region.put(put);<a name="line.5504"></a>
-<span class="sourceLineNo">5505</span>    Put put2 = new Put(Bytes.toBytes("19995"));<a name="line.5505"></a>
-<span class="sourceLineNo">5506</span>    put2.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5506"></a>
-<span class="sourceLineNo">5507</span>    region.put(put2);<a name="line.5507"></a>
-<span class="sourceLineNo">5508</span>    // create a reverse scan<a name="line.5508"></a>
-<span class="sourceLineNo">5509</span>    Scan scan = new Scan(Bytes.toBytes("19996"));<a name="line.5509"></a>
-<span class="sourceLineNo">5510</span>    scan.setReversed(true);<a name="line.5510"></a>
-<span class="sourceLineNo">5511</span>    RegionScannerImpl scanner = region.getScanner(scan);<a name="line.5511"></a>
-<span class="sourceLineNo">5512</span><a name="line.5512"></a>
-<span class="sourceLineNo">5513</span>    // flush the cache. This will reset the store scanner<a name="line.5513"></a>
-<span class="sourceLineNo">5514</span>    region.flushcache(true, true, FlushLifeCycleTracker.DUMMY);<a name="line.5514"></a>
-<span class="sourceLineNo">5515</span><a name="line.5515"></a>
-<span class="sourceLineNo">5516</span>    // create one memstore contains many rows will be skipped<a name="line.5516"></a>
-<span class="sourceLineNo">5517</span>    // to check MemStoreScanner.seekToPreviousRow<a name="line.5517"></a>
-<span class="sourceLineNo">5518</span>    for (int i = 10000; i &lt; 20000; i++) {<a name="line.5518"></a>
-<span class="sourceLineNo">5519</span>      Put p = new Put(Bytes.toBytes("" + i));<a name="line.5519"></a>
-<span class="sourceLineNo">5520</span>      p.addColumn(cf1, col, Bytes.toBytes("" + i));<a name="line.5520"></a>
-<span class="sourceLineNo">5521</span>      region.put(p);<a name="line.5521"></a>
-<span class="sourceLineNo">5522</span>    }<a name="line.5522"></a>
-<span class="sourceLineNo">5523</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5523"></a>
-<span class="sourceLineNo">5524</span>    boolean hasNext;<a name="line.5524"></a>
-<span class="sourceLineNo">5525</span>    boolean assertDone = false;<a name="line.5525"></a>
-<span class="sourceLineNo">5526</span>    do {<a name="line.5526"></a>
-<span class="sourceLineNo">5527</span>      hasNext = scanner.next(currRow);<a name="line.5527"></a>
-<span class="sourceLineNo">5528</span>      // With HBASE-15871, after the scanner is reset the memstore scanner should not be<a name="line.5528"></a>
-<span class="sourceLineNo">5529</span>      // added here<a name="line.5529"></a>
-<span class="sourceLineNo">5530</span>      if (!assertDone) {<a name="line.5530"></a>
-<span class="sourceLineNo">5531</span>        StoreScanner current =<a name="line.5531"></a>
-<span class="sourceLineNo">5532</span>            (StoreScanner) (scanner.storeHeap).getCurrentForTesting();<a name="line.5532"></a>
-<span class="sourceLineNo">5533</span>        List&lt;KeyValueScanner&gt; scanners = current.getAllScannersForTesting();<a name="line.5533"></a>
-<span class="sourceLineNo">5534</span>        assertEquals("There should be only one scanner the store file scanner", 1,<a name="line.5534"></a>
-<span class="sourceLineNo">5535</span>          scanners.size());<a name="line.5535"></a>
-<span class="sourceLineNo">5536</span>        assertDone = true;<a name="line.5536"></a>
-<span class="sourceLineNo">5537</span>      }<a name="line.5537"></a>
-<span class="sourceLineNo">5538</span>    } while (hasNext);<a name="line.5538"></a>
-<span class="sourceLineNo">5539</span>    assertEquals(2, currRow.size());<a name="line.5539"></a>
-<span class="sourceLineNo">5540</span>    assertEquals("19996", Bytes.toString(currRow.get(0).getRowArray(),<a name="line.5540"></a>
-<span class="sourceLineNo">5541</span>      currRow.get(0).getRowOffset(), currRow.get(0).getRowLength()));<a name="line.5541"></a>
-<span class="sourceLineNo">5542</span>    assertEquals("19995", Bytes.toString(currRow.get(1).getRowArray(),<a name="line.5542"></a>
-<span class="sourceLineNo">5543</span>      currRow.get(1).getRowOffset(), currRow.get(1).getRowLength()));<a name="line.5543"></a>
-<span class="sourceLineNo">5544</span>  }<a name="line.5544"></a>
-<span class="sourceLineNo">5545</span><a name="line.5545"></a>
-<span class="sourceLineNo">5546</span>  @Test<a name="line.5546"></a>
-<span class="sourceLineNo">5547</span>  public void testReverseScanWhenPutCellsAfterOpenReverseScan() throws Exception {<a name="line.5547"></a>
-<span class="sourceLineNo">5548</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5548"></a>
-<span class="sourceLineNo">5549</span>    byte[][] families = { cf1 };<a name="line.5549"></a>
-<span class="sourceLineNo">5550</span>    byte[] col = Bytes.toBytes("C");<a name="line.5550"></a>
-<span class="sourceLineNo">5551</span><a name="line.5551"></a>
-<span class="sourceLineNo">5552</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5552"></a>
-<span class="sourceLineNo">5553</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5553"></a>
-<span class="sourceLineNo">5554</span><a name="line.5554"></a>
-<span class="sourceLineNo">5555</span>    Put put = new Put(Bytes.toBytes("199996"));<a name="line.5555"></a>
-<span class="sourceLineNo">5556</span>    put.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5556"></a>
-<span class="sourceLineNo">5557</span>    region.put(put);<a name="line.5557"></a>
-<span class="sourceLineNo">5558</span>    Put put2 = new Put(Bytes.toBytes("199995"));<a name="line.5558"></a>
-<span class="sourceLineNo">5559</span>    put2.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5559"></a>
-<span class="sourceLineNo">5560</span>    region.put(put2);<a name="line.5560"></a>
+<span class="sourceLineNo">5411</span>    region.flush(true);<a name="line.5411"></a>
+<span class="sourceLineNo">5412</span>    // storefile3<a name="line.5412"></a>
+<span class="sourceLineNo">5413</span>    put = new Put(row3);<a name="line.5413"></a>
+<span class="sourceLineNo">5414</span>    put.add(kv3);<a name="line.5414"></a>
+<span class="sourceLineNo">5415</span>    region.put(put);<a name="line.5415"></a>
+<span class="sourceLineNo">5416</span>    region.flush(true);<a name="line.5416"></a>
+<span class="sourceLineNo">5417</span>    // memstore<a name="line.5417"></a>
+<span class="sourceLineNo">5418</span>    put = new Put(row4);<a name="line.5418"></a>
+<span class="sourceLineNo">5419</span>    put.add(kv4);<a name="line.5419"></a>
+<span class="sourceLineNo">5420</span>    region.put(put);<a name="line.5420"></a>
+<span class="sourceLineNo">5421</span>    // scan range = ["row4", min)<a name="line.5421"></a>
+<span class="sourceLineNo">5422</span>    Scan scan = new Scan(row4);<a name="line.5422"></a>
+<span class="sourceLineNo">5423</span>    scan.setReversed(true);<a name="line.5423"></a>
+<span class="sourceLineNo">5424</span>    scan.setBatch(10);<a name="line.5424"></a>
+<span class="sourceLineNo">5425</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5425"></a>
+<span class="sourceLineNo">5426</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5426"></a>
+<span class="sourceLineNo">5427</span>    boolean hasNext = scanner.next(currRow);<a name="line.5427"></a>
+<span class="sourceLineNo">5428</span>    assertEquals(1, currRow.size());<a name="line.5428"></a>
+<span class="sourceLineNo">5429</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5429"></a>
+<span class="sourceLineNo">5430</span>        .get(0).getRowLength(), row4, 0, row4.length));<a name="line.5430"></a>
+<span class="sourceLineNo">5431</span>    assertTrue(hasNext);<a name="line.5431"></a>
+<span class="sourceLineNo">5432</span>    currRow.clear();<a name="line.5432"></a>
+<span class="sourceLineNo">5433</span>    hasNext = scanner.next(currRow);<a name="line.5433"></a>
+<span class="sourceLineNo">5434</span>    assertEquals(1, currRow.size());<a name="line.5434"></a>
+<span class="sourceLineNo">5435</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5435"></a>
+<span class="sourceLineNo">5436</span>        .get(0).getRowLength(), row3, 0, row3.length));<a name="line.5436"></a>
+<span class="sourceLineNo">5437</span>    assertTrue(hasNext);<a name="line.5437"></a>
+<span class="sourceLineNo">5438</span>    currRow.clear();<a name="line.5438"></a>
+<span class="sourceLineNo">5439</span>    hasNext = scanner.next(currRow);<a name="line.5439"></a>
+<span class="sourceLineNo">5440</span>    assertEquals(1, currRow.size());<a name="line.5440"></a>
+<span class="sourceLineNo">5441</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5441"></a>
+<span class="sourceLineNo">5442</span>        .get(0).getRowLength(), row2, 0, row2.length));<a name="line.5442"></a>
+<span class="sourceLineNo">5443</span>    assertTrue(hasNext);<a name="line.5443"></a>
+<span class="sourceLineNo">5444</span>    currRow.clear();<a name="line.5444"></a>
+<span class="sourceLineNo">5445</span>    hasNext = scanner.next(currRow);<a name="line.5445"></a>
+<span class="sourceLineNo">5446</span>    assertEquals(1, currRow.size());<a name="line.5446"></a>
+<span class="sourceLineNo">5447</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5447"></a>
+<span class="sourceLineNo">5448</span>        .get(0).getRowLength(), row1, 0, row1.length));<a name="line.5448"></a>
+<span class="sourceLineNo">5449</span>    assertFalse(hasNext);<a name="line.5449"></a>
+<span class="sourceLineNo">5450</span>  }<a name="line.5450"></a>
+<span class="sourceLineNo">5451</span><a name="line.5451"></a>
+<span class="sourceLineNo">5452</span>  /**<a name="line.5452"></a>
+<span class="sourceLineNo">5453</span>   * Test for HBASE-14497: Reverse Scan threw StackOverflow caused by readPt checking<a name="line.5453"></a>
+<span class="sourceLineNo">5454</span>   */<a name="line.5454"></a>
+<span class="sourceLineNo">5455</span>  @Test<a name="line.5455"></a>
+<span class="sourceLineNo">5456</span>  public void testReverseScanner_StackOverflow() throws IOException {<a name="line.5456"></a>
+<span class="sourceLineNo">5457</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5457"></a>
+<span class="sourceLineNo">5458</span>    byte[][] families = {cf1};<a name="line.5458"></a>
+<span class="sourceLineNo">5459</span>    byte[] col = Bytes.toBytes("C");<a name="line.5459"></a>
+<span class="sourceLineNo">5460</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5460"></a>
+<span class="sourceLineNo">5461</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5461"></a>
+<span class="sourceLineNo">5462</span>    // setup with one storefile and one memstore, to create scanner and get an earlier readPt<a name="line.5462"></a>
+<span class="sourceLineNo">5463</span>    Put put = new Put(Bytes.toBytes("19998"));<a name="line.5463"></a>
+<span class="sourceLineNo">5464</span>    put.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5464"></a>
+<span class="sourceLineNo">5465</span>    region.put(put);<a name="line.5465"></a>
+<span class="sourceLineNo">5466</span>    region.flushcache(true, true, FlushLifeCycleTracker.DUMMY);<a name="line.5466"></a>
+<span class="sourceLineNo">5467</span>    Put put2 = new Put(Bytes.toBytes("19997"));<a name="line.5467"></a>
+<span class="sourceLineNo">5468</span>    put2.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5468"></a>
+<span class="sourceLineNo">5469</span>    region.put(put2);<a name="line.5469"></a>
+<span class="sourceLineNo">5470</span><a name="line.5470"></a>
+<span class="sourceLineNo">5471</span>    Scan scan = new Scan(Bytes.toBytes("19998"));<a name="line.5471"></a>
+<span class="sourceLineNo">5472</span>    scan.setReversed(true);<a name="line.5472"></a>
+<span class="sourceLineNo">5473</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5473"></a>
+<span class="sourceLineNo">5474</span><a name="line.5474"></a>
+<span class="sourceLineNo">5475</span>    // create one storefile contains many rows will be skipped<a name="line.5475"></a>
+<span class="sourceLineNo">5476</span>    // to check StoreFileScanner.seekToPreviousRow<a name="line.5476"></a>
+<span class="sourceLineNo">5477</span>    for (int i = 10000; i &lt; 20000; i++) {<a name="line.5477"></a>
+<span class="sourceLineNo">5478</span>      Put p = new Put(Bytes.toBytes(""+i));<a name="line.5478"></a>
+<span class="sourceLineNo">5479</span>      p.addColumn(cf1, col, Bytes.toBytes("" + i));<a name="line.5479"></a>
+<span class="sourceLineNo">5480</span>      region.put(p);<a name="line.5480"></a>
+<span class="sourceLineNo">5481</span>    }<a name="line.5481"></a>
+<span class="sourceLineNo">5482</span>    region.flushcache(true, true, FlushLifeCycleTracker.DUMMY);<a name="line.5482"></a>
+<span class="sourceLineNo">5483</span><a name="line.5483"></a>
+<span class="sourceLineNo">5484</span>    // create one memstore contains many rows will be skipped<a name="line.5484"></a>
+<span class="sourceLineNo">5485</span>    // to check MemStoreScanner.seekToPreviousRow<a name="line.5485"></a>
+<span class="sourceLineNo">5486</span>    for (int i = 10000; i &lt; 20000; i++) {<a name="line.5486"></a>
+<span class="sourceLineNo">5487</span>      Put p = new Put(Bytes.toBytes(""+i));<a name="line.5487"></a>
+<span class="sourceLineNo">5488</span>      p.addColumn(cf1, col, Bytes.toBytes("" + i));<a name="line.5488"></a>
+<span class="sourceLineNo">5489</span>      region.put(p);<a name="line.5489"></a>
+<span class="sourceLineNo">5490</span>    }<a name="line.5490"></a>
+<span class="sourceLineNo">5491</span><a name="line.5491"></a>
+<span class="sourceLineNo">5492</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5492"></a>
+<span class="sourceLineNo">5493</span>    boolean hasNext;<a name="line.5493"></a>
+<span class="sourceLineNo">5494</span>    do {<a name="line.5494"></a>
+<span class="sourceLineNo">5495</span>      hasNext = scanner.next(currRow);<a name="line.5495"></a>
+<span class="sourceLineNo">5496</span>    } while (hasNext);<a name="line.5496"></a>
+<span class="sourceLineNo">5497</span>    assertEquals(2, currRow.size());<a name="line.5497"></a>
+<span class="sourceLineNo">5498</span>    assertEquals("19998", Bytes.toString(currRow.get(0).getRowArray(),<a name="line.5498"></a>
+<span class="sourceLineNo">5499</span>      currRow.get(0).getRowOffset(), currRow.get(0).getRowLength()));<a name="line.5499"></a>
+<span class="sourceLineNo">5500</span>    assertEquals("19997", Bytes.toString(currRow.get(1).getRowArray(),<a name="line.5500"></a>
+<span class="sourceLineNo">5501</span>      currRow.get(1).getRowOffset(), currRow.get(1).getRowLength()));<a name="line.5501"></a>
+<span class="sourceLineNo">5502</span>  }<a name="line.5502"></a>
+<span class="sourceLineNo">5503</span><a name="line.5503"></a>
+<span class="sourceLineNo">5504</span>  @Test<a name="line.5504"></a>
+<span class="sourceLineNo">5505</span>  public void testReverseScanShouldNotScanMemstoreIfReadPtLesser() throws Exception {<a name="line.5505"></a>
+<span class="sourceLineNo">5506</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5506"></a>
+<span class="sourceLineNo">5507</span>    byte[][] families = { cf1 };<a name="line.5507"></a>
+<span class="sourceLineNo">5508</span>    byte[] col = Bytes.toBytes("C");<a name="line.5508"></a>
+<span class="sourceLineNo">5509</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5509"></a>
+<span class="sourceLineNo">5510</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5510"></a>
+<span class="sourceLineNo">5511</span>    // setup with one storefile and one memstore, to create scanner and get an earlier readPt<a name="line.5511"></a>
+<span class="sourceLineNo">5512</span>    Put put = new Put(Bytes.toBytes("19996"));<a name="line.5512"></a>
+<span class="sourceLineNo">5513</span>    put.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5513"></a>
+<span class="sourceLineNo">5514</span>    region.put(put);<a name="line.5514"></a>
+<span class="sourceLineNo">5515</span>    Put put2 = new Put(Bytes.toBytes("19995"));<a name="line.5515"></a>
+<span class="sourceLineNo">5516</span>    put2.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5516"></a>
+<span class="sourceLineNo">5517</span>    region.put(put2);<a name="line.5517"></a>
+<span class="sourceLineNo">5518</span>    // create a reverse scan<a name="line.5518"></a>
+<span class="sourceLineNo">5519</span>    Scan scan = new Scan(Bytes.toBytes("19996"));<a name="line.5519"></a>
+<span class="sourceLineNo">5520</span>    scan.setReversed(true);<a name="line.5520"></a>
+<span class="sourceLineNo">5521</span>    RegionScannerImpl scanner = region.getScanner(scan);<a name="line.5521"></a>
+<span class="sourceLineNo">5522</span><a name="line.5522"></a>
+<span class="sourceLineNo">5523</span>    // flush the cache. This will reset the store scanner<a name="line.5523"></a>
+<span class="sourceLineNo">5524</span>    region.flushcache(true, true, FlushLifeCycleTracker.DUMMY);<a name="line.5524"></a>
+<span class="sourceLineNo">5525</span><a name="line.5525"></a>
+<span class="sourceLineNo">5526</span>    // create one memstore contains many rows will be skipped<a name="line.5526"></a>
+<span class="sourceLineNo">5527</span>    // to check MemStoreScanner.seekToPreviousRow<a name="line.5527"></a>
+<span class="sourceLineNo">5528</span>    for (int i = 10000; i &lt; 20000; i++) {<a name="line.5528"></a>
+<span class="sourceLineNo">5529</span>      Put p = new Put(Bytes.toBytes("" + i));<a name="line.5529"></a>
+<span class="sourceLineNo">5530</span>      p.addColumn(cf1, col, Bytes.toBytes("" + i));<a name="line.5530"></a>
+<span class="sourceLineNo">5531</span>      region.put(p);<a name="line.5531"></a>
+<span class="sourceLineNo">5532</span>    }<a name="line.5532"></a>
+<span class="sourceLineNo">5533</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5533"></a>
+<span class="sourceLineNo">5534</span>    boolean hasNext;<a name="line.5534"></a>
+<span class="sourceLineNo">5535</span>    boolean assertDone = false;<a name="line.5535"></a>
+<span class="sourceLineNo">5536</span>    do {<a name="line.5536"></a>
+<span class="sourceLineNo">5537</span>      hasNext = scanner.next(currRow);<a name="line.5537"></a>
+<span class="sourceLineNo">5538</span>      // With HBASE-15871, after the scanner is reset the memstore scanner should not be<a name="line.5538"></a>
+<span class="sourceLineNo">5539</span>      // added here<a name="line.5539"></a>
+<span class="sourceLineNo">5540</span>      if (!assertDone) {<a name="line.5540"></a>
+<span class="sourceLineNo">5541</span>        StoreScanner current =<a name="line.5541"></a>
+<span class="sourceLineNo">5542</span>            (StoreScanner) (scanner.storeHeap).getCurrentForTesting();<a name="line.5542"></a>
+<span class="sourceLineNo">5543</span>        List&lt;KeyValueScanner&gt; scanners = current.getAllScannersForTesting();<a name="line.5543"></a>
+<span class="sourceLineNo">5544</span>        assertEquals("There should be only one scanner the store file scanner", 1,<a name="line.5544"></a>
+<span class="sourceLineNo">5545</span>          scanners.size());<a name="line.5545"></a>
+<span class="sourceLineNo">5546</span>        assertDone = true;<a name="line.5546"></a>
+<span class="sourceLineNo">5547</span>      }<a name="line.5547"></a>
+<span class="sourceLineNo">5548</span>    } while (hasNext);<a name="line.5548"></a>
+<span class="sourceLineNo">5549</span>    assertEquals(2, currRow.size());<a name="line.5549"></a>
+<span class="sourceLineNo">5550</span>    assertEquals("19996", Bytes.toString(currRow.get(0).getRowArray(),<a name="line.5550"></a>
+<span class="sourceLineNo">5551</span>      currRow.get(0).getRowOffset(), currRow.get(0).getRowLength()));<a name="line.5551"></a>
+<span class="sourceLineNo">5552</span>    assertEquals("19995", Bytes.toString(currRow.get(1).getRowArray(),<a name="line.5552"></a>
+<span class="sourceLineNo">5553</span>      currRow.get(1).getRowOffset(), currRow.get(1).getRowLength()));<a name="line.5553"></a>
+<span class="sourceLineNo">5554</span>  }<a name="line.5554"></a>
+<span class="sourceLineNo">5555</span><a name="line.5555"></a>
+<span class="sourceLineNo">5556</span>  @Test<a name="line.5556"></a>
+<span class="sourceLineNo">5557</span>  public void testReverseScanWhenPutCellsAfterOpenReverseScan() throws Exception {<a name="line.5557"></a>
+<span class="sourceLineNo">5558</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5558"></a>
+<span class="sourceLineNo">5559</span>    byte[][] families = { cf1 };<a name="line.5559"></a>
+<span class="sourceLineNo">5560</span>    byte[] col = Bytes.toBytes("C");<a name="line.5560"></a>
 <span class="sourceLineNo">5561</span><a name="line.5561"></a>
-<span class="sourceLineNo">5562</span>    // Create a reverse scan<a name="line.5562"></a>
-<span class="sourceLineNo">5563</span>    Scan scan = new Scan(Bytes.toBytes("199996"));<a name="line.5563"></a>
-<span class="sourceLineNo">5564</span>    scan.setReversed(true);<a name="line.5564"></a>
-<span class="sourceLineNo">5565</span>    RegionScannerImpl scanner = region.getScanner(scan);<a name="line.5565"></a>
-<span class="sourceLineNo">5566</span><a name="line.5566"></a>
-<span class="sourceLineNo">5567</span>    // Put a lot of cells that have sequenceIDs grater than the readPt of the reverse scan<a name="line.5567"></a>
-<span class="sourceLineNo">5568</span>    for (int i = 100000; i &lt; 200000; i++) {<a name="line.5568"></a>
-<span class="sourceLineNo">5569</span>      Put p = new Put(Bytes.toBytes("" + i));<a name="line.5569"></a>
-<span class="sourceLineNo">5570</span>      p.addColumn(cf1, col, Bytes.toBytes("" + i));<a name="line.5570"></a>
-<span class="sourceLineNo">5571</span>      region.put(p);<a name="line.5571"></a>
-<span class="sourceLineNo">5572</span>    }<a name="line.5572"></a>
-<span class="sourceLineNo">5573</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5573"></a>
-<span class="sourceLineNo">5574</span>    boolean hasNext;<a name="line.5574"></a>
-<span class="sourceLineNo">5575</span>    do {<a name="line.5575"></a>
-<span class="sourceLineNo">5576</span>      hasNext = scanner.next(currRow);<a name="line.5576"></a>
-<span class="sourceLineNo">5577</span>    } while (hasNext);<a name="line.5577"></a>
-<span class="sourceLineNo">5578</span><a name="line.5578"></a>
-<span class="sourceLineNo">5579</span>    assertEquals(2, currRow.size());<a name="line.5579"></a>
-<span class="sourceLineNo">5580</span>    assertEquals("199996", Bytes.toString(currRow.get(0).getRowArray(),<a name="line.5580"></a>
-<span class="sourceLineNo">5581</span>      currRow.get(0).getRowOffset(), currRow.get(0).getRowLength()));<a name="line.5581"></a>
-<span class="sourceLineNo">5582</span>    assertEquals("199995", Bytes.toString(currRow.get(1).getRowArray(),<a name="line.5582"></a>
-<span class="sourceLineNo">5583</span>      currRow.get(1).getRowOffset(), currRow.get(1).getRowLength()));<a name="line.5583"></a>
-<span class="sourceLineNo">5584</span>  }<a name="line.5584"></a>
-<span class="sourceLineNo">5585</span><a name="line.5585"></a>
-<span class="sourceLineNo">5586</span>  @Test<a name="line.5586"></a>
-<span class="sourceLineNo">5587</span>  public void testWriteRequestsCounter() throws IOException {<a name="line.5587"></a>
-<span class="sourceLineNo">5588</span>    byte[] fam = Bytes.toBytes("info");<a name="line.5588"></a>
-<span class="sourceLineNo">5589</span>    byte[][] families = { fam };<a name="line.5589"></a>
-<span class="sourceLineNo">5590</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.5590"></a>
-<span class="sourceLineNo">5591</span><a name="line.5591"></a>
-<span class="sourceLineNo">5592</span>    Assert.assertEquals(0L, region.getWriteRequestsCount());<a name="line.5592"></a>
-<span class="sourceLineNo">5593</span><a name="line.5593"></a>
-<span class="sourceLineNo">5594</span>    Put put = new Put(row);<a name="line.5594"></a>
-<span class="sourceLineNo">5595</span>    put.addColumn(fam, fam, fam);<a name="line.5595"></a>
-<span class="sourceLineNo">5596</span><a name="line.5596"></a>
-<span class="sourceLineNo">5597</span>    Assert.assertEquals(0L, region.getWriteRequestsCount());<a name="line.5597"></a>
-<span class="sourceLineNo">5598</span>    region.put(put);<a name="line.5598"></a>
-<span class="sourceLineNo">5599</span>    Assert.assertEquals(1L, region.getWriteRequestsCount());<a name="line.5599"></a>
-<span class="sourceLineNo">5600</span>    region.put(put);<a name="line.5600"></a>
-<span class="sourceLineNo">5601</span>    Assert.assertEquals(2L, region.getWriteRequestsCount());<a name="line.5601"></a>
-<span class="sourceLineNo">5602</span>    region.put(put);<a name="line.5602"></a>
-<span class="sourceLineNo">5603</span>    Assert.assertEquals(3L, region.getWriteRequestsCount());<a name="line.5603"></a>
-<span class="sourceLineNo">5604</span><a name="line.5604"></a>
-<span class="sourceLineNo">5605</span>    region.delete(new Delete(row));<a name="line.5605"></a>
-<span class="sourceLineNo">5606</span>    Assert.assertEquals(4L, region.getWriteRequestsCount());<a name="line.5606"></a>
-<span class="sourceLineNo">5607</span>  }<a name="line.5607"></a>
-<span class="sourceLineNo">5608</span><a name="line.5608"></a>
-<span class="sourceLineNo">5609</span>  @Test<a name="line.5609"></a>
-<span class="sourceLineNo">5610</span>  public void testOpenRegionWrittenToWAL() throws Exception {<a name="line.5610"></a>
-<span class="sourceLineNo">5611</span>    final ServerName serverName = ServerName.valueOf(name.getMethodName(), 100, 42);<a name="line.5611"></a>
-<span class="sourceLineNo">5612</span>    final RegionServerServices rss = spy(TEST_UTIL.createMockRegionServerService(serverName));<a name="line.5612"></a>
-<span class="sourceLineNo">5613</span><a name="line.5613"></a>
-<span class="sourceLineNo">5614</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.5614"></a>
-<span class="sourceLineNo">5615</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.5615"></a>
-<span class="sourceLineNo">5616</span>    htd.addFamily(new HColumnDescriptor(fam2));<a name="line.5616"></a>
-<span class="sourceLineNo">5617</span><a name="line.5617"></a>
-<span class="sourceLineNo">5618</span>    HRegionInfo hri = new HRegionInfo(htd.getTableName(),<a name="line.5618"></a>
-<span class="sourceLineNo">5619</span>      HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY);<a name="line.5619"></a>
-<span class="sourceLineNo">5620</span><a name="line.5620"></a>
-<span class="sourceLineNo">5621</span>    // open the region w/o rss and wal and flush some files<a name="line.5621"></a>
-<span class="sourceLineNo">5622</span>    region =<a name="line.5622"></a>
-<span class="sourceLineNo">5623</span>         HBaseTestingUtility.createRegionAndWAL(hri, TEST_UTIL.getDataTestDir(), TEST_UTIL<a name="line.5623"></a>
-<span class="sourceLineNo">5624</span>             .getConfiguration(), htd);<a name="line.5624"></a>
-<span class="sourceLineNo">5625</span>    assertNotNull(region);<a name="line.5625"></a>
-<span class="sourceLineNo">5626</span><a name="line.5626"></a>
-<span class="sourceLineNo">5627</span>    // create a file in fam1 for the region before opening in OpenRegionHandler<a name="line.5627"></a>
-<span class="sourceLineNo">5628</span>    region.put(new Put(Bytes.toBytes("a")).addColumn(fam1, fam1, fam1));<a name="line.5628"></a>
-<span class="sourceLineNo">5629</span>    region.flush(true);<a name="line.5629"></a>
-<span class="sourceLineNo">5630</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.5630"></a>
-<span class="sourceLineNo">5631</span><a name="line.5631"></a>
-<span class="sourceLineNo">5632</span>    ArgumentCaptor&lt;WALEdit&gt; editCaptor = ArgumentCaptor.forClass(WALEdit.class);<a name="line.5632"></a>
-<span class="sourceLineNo">5633</span><a name="line.5633"></a>
-<span class="sourceLineNo">5634</span>    // capture append() calls<a name="line.5634"></a>
-<span class="sourceLineNo">5635</span>    WAL wal = mockWAL();<a name="line.5635"></a>
-<span class="sourceLineNo">5636</span>    when(rss.getWAL((HRegionInfo) any())).thenReturn(wal);<a name="line.5636"></a>
-<span class="sourceLineNo">5637</span><a name="line.5637"></a>
-<span class="sourceLineNo">5638</span>    region = HRegion.openHRegion(hri, htd, rss.getWAL(hri),<a name="line.5638"></a>
-<span class="sourceLineNo">5639</span>      TEST_UTIL.getConfiguration(), rss, null);<a name="line.5639"></a>
-<span class="sourceLineNo">5640</span><a name="line.5640"></a>
-<span class="sourceLineNo">5641</span>    verify(wal, times(1)).append((HRegionInfo)any(), (WALKeyImpl)any()<a name="line.5641"></a>
-<span class="sourceLineNo">5642</span>      , editCaptor.capture(), anyBoolean());<a name="line.5642"></a>
+<span class="sourceLineNo">5562</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5562"></a>
+<span class="sourceLineNo">5563</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5563"></a>
+<span class="sourceLineNo">5564</span><a name="line.5564"></a>
+<span class="sourceLineNo">5565</span>    Put put = new Put(Bytes.toBytes("199996"));<a name="line.5565"></a>
+<span class="sourceLineNo">5566</span>    put.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5566"></a>
+<span class="sourceLineNo">5567</span>    region.put(put);<a name="line.5567"></a>
+<span class="sourceLineNo">5568</span>    Put put2 = new Put(Bytes.toBytes("199995"));<a name="line.5568"></a>
+<span class="sourceLineNo">5569</span>    put2.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5569"></a>
+<span class="sourceLineNo">5570</span>    region.put(put2);<a name="line.5570"></a>
+<span class="sourceLineNo">5571</span><a name="line.5571"></a>
+<span class="sourceLineNo">5572</span>    // Create a reverse scan<a name="line.5572"></a>
+<span class="sourceLineNo">5573</span>    Scan scan = new Scan(Bytes.toBytes("199996"));<a name="line.5573"></a>
+<span class="sourceLineNo">5574</span>    scan.setReversed(true);<a name="line.5574"></a>
+<span class="sourceLineNo">5575</span>    RegionScannerImpl scanner = region.getScanner(scan);<a name="line.5575"></a>
+<span class="sourceLineNo">5576</span><a name="line.5576"></a>
+<span class="sourceLineNo">5577</span>    // Put a lot of cells that have sequenceIDs grater than the readPt of the reverse scan<a name="line.5577"></a>
+<span class="sourceLineNo">5578</span>    for (int i = 100000; i &lt; 200000; i++) {<a name="line.5578"></a>
+<span class="sourceLineNo">5579</span>      Put p = new Put(Bytes.toBytes("" + i));<a name="line.5579"></a>
+<span class="sourceLineNo">5580</span>      p.addColumn(cf1, col, Bytes.toBytes("" + i));<a name="line.5580"></a>
+<span class="sourceLineNo">5581</span>      region.put(p);<a name="line.5581"></a>
+<span class="sourceLineNo">5582</span>    }<a name="line.5582"></a>
+<span class="sourceLineNo">5583</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5583"></a>
+<span class="sourceLineNo">5584</span>    boolean hasNext;<a name="line.5584"></a>
+<span class="sourceLineNo">5585</span>    do {<a name="line.5585"></a>
+<span class="sourceLineNo">5586</span>      hasNext = scanner.next(currRow);<a name="line.5586"></a>
+<span class="sourceLineNo">5587</span>    } while (hasNext);<a name="line.5587"></a>
+<span class="sourceLineNo">5588</span><a name="line.5588"></a>
+<span class="sourceLineNo">5589</span>    assertEquals(2, currRow.size());<a name="line.5589"></a>
+<span class="sourceLineNo">5590</span>    assertEquals("199996", Bytes.toString(currRow.get(0).getRowArray(),<a name="line.5590"></a>
+<span class="sourceLineNo">5591</span>      currRow.get(0).getRowOffset(), currRow.get(0).getRowLength()));<a name="line.5591"></a>
+<span class="sourceLineNo">5592</span>    assertEquals("199995", Bytes.toString(currRow.get(1).getRowArray(),<a name="line.5592"></a>
+<span class="sourceLineNo">5593</span>      currRow.get(1).getRowOffset(), currRow.get(1).getRowLength()));<a name="line.5593"></a>
+<span class="sourceLineNo">5594</span>  }<a name="line.5594"></a>
+<span class="sourceLineNo">5595</span><a name="line.5595"></a>
+<span class="sourceLineNo">5596</span>  @Test<a name="line.5596"></a>
+<span class="sourceLineNo">5597</span>  public void testWriteRequestsCounter() throws IOException {<a name="line.5597"></a>
+<span class="sourceLineNo">5598</span>    byte[] fam = Bytes.toBytes("info");<a name="line.5598"></a>
+<span class="sourceLineNo">5599</span>    byte[][] families = { fam };<a name="line.5599"></a>
+<span class="sourceLineNo">5600</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.5600"></a>
+<span class="sourceLineNo">5601</span><a name="line.5601"></a>
+<span class="sourceLineNo">5602</span>    Assert.assertEquals(0L, region.getWriteRequestsCount());<a name="line.5602"></a>
+<span class="sourceLineNo">5603</span><a name="line.5603"></a>
+<span class="sourceLineNo">5604</span>    Put put = new Put(row);<a name="line.5604"></a>
+<span class="sourceLineNo">5605</span>    put.addColumn(fam, fam, fam);<a name="line.5605"></a>
+<span class="sourceLineNo">5606</span><a name="line.5606"></a>
+<span class="sourceLineNo">5607</span>    Assert.assertEquals(0L, region.getWriteRequestsCount());<a name="line.5607"></a>
+<span class="sourceLineNo">5608</span>    region.put(put);<a name="line.5608"></a>
+<span class="sourceLineNo">5609</span>    Assert.assertEquals(1L, region.getWriteRequestsCount());<a name="line.5609"></a>
+<span class="sourceLineNo">5610</span>    region.put(put);<a name="line.5610"></a>
+<span class="sourceLineNo">5611</span>    Assert.assertEquals(2L, region.getWriteRequestsCount());<a name="line.5611"></a>
+<span class="sourceLineNo">5612</span>    region.put(put);<a name="line.5612"></a>
+<span class="sourceLineNo">5613</span>    Assert.assertEquals(3L, region.getWriteRequestsCount());<a name="line.5613"></a>
+<span class="sourceLineNo">5614</span><a name="line.5614"></a>
+<span class="sourceLineNo">5615</span>    region.delete(new Delete(row));<a name="line.5615"></a>
+<span class="sourceLineNo">5616</span>    Assert.assertEquals(4L, region.getWriteRequestsCount());<a name="line.5616"></a>
+<span class="sourceLineNo">5617</span>  }<a name="line.5617"></a>
+<span class="sourceLineNo">5618</span><a name="line.5618"></a>
+<span class="sourceLineNo">5619</span>  @Test<a name="line.5619"></a>
+<span class="sourceLineNo">5620</span>  public void testOpenRegionWrittenToWAL() throws Exception {<a name="line.5620"></a>
+<span class="sourceLineNo">5621</span>    final ServerName serverName = ServerName.valueOf(name.getMethodName(), 100, 42);<a name="line.5621"></a>
+<span class="sourceLineNo">5622</span>    final RegionServerServices rss = spy(TEST_UTIL.createMockRegionServerService(serverName));<a name="line.5622"></a>
+<span class="sourceLineNo">5623</span><a name="line.5623"></a>
+<span class="sourceLineNo">5624</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.5624"></a>
+<span class="sourceLineNo">5625</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.5625"></a>
+<span class="sourceLineNo">5626</span>    htd.addFamily(new HColumnDescriptor(fam2));<a name="line.5626"></a>
+<span class="sourceLineNo">5627</span><a name="line.5627"></a>
+<span class="sourceLineNo">5628</span>    HRegionInfo hri = new HRegionInfo(htd.getTableName(),<a name="line.5628"></a>
+<span class="sourceLineNo">5629</span>      HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY);<a name="line.5629"></a>
+<span class="sourceLineNo">5630</span><a name="line.5630"></a>
+<span class="sourceLineNo">5631</span>    // open the region w/o rss and wal and flush some files<a name="line.5631"></a>
+<span class="sourceLineNo">5632</span>    region =<a name="line.5632"></a>
+<span class="sourceLineNo">5633</span>         HBaseTestingUtility.createRegionAndWAL(hri, TEST_UTIL.getDataTestDir(), TEST_UTIL<a name="line.5633"></a>
+<span class="sourceLineNo">5634</span>             .getConfiguration(), htd);<a name="line.5634"></a>
+<span class="sourceLineNo">5635</span>    assertNotNull(region);<a name="line.5635"></a>
+<span class="sourceLineNo">5636</span><a name="line.5636"></a>
+<span class="sourceLineNo">5637</span>    // create a file in fam1 for the region before opening in OpenRegionHandler<a name="line.5637"></a>
+<span class="sourceLineNo">5638</span>    region.put(new Put(Bytes.toBytes("a")).addColumn(fam1, fam1, fam1));<a name="line.5638"></a>
+<span class="sourceLineNo">5639</span>    region.flush(true);<a name="line.5639"></a>
+<span class="sourceLineNo">5640</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.5640"></a>
+<span class="sourceLineNo">5641</span><a name="line.5641"></a>
+<span class="sourceLineNo">5642</span>    ArgumentCaptor&lt;WALEdit&gt; editCaptor = ArgumentCaptor.forClass(WALEdit.class);<a name="line.5642"></a>
 <span class="sourceLineNo">5643</span><a name="line.5643"></a>
-<span class="sourceLineNo">5644</span>    WALEdit edit = editCaptor.getValue();<a name="line.5644"></a>
-<span class="sourceLineNo">5645</span>    assertNotNull(edit);<a name="line.5645"></a>
-<span class="sourceLineNo">5646</span>    assertNotNull(edit.getCells());<a name="line.5646"></a>
-<span class="sourceLineNo">5647</span>    assertEquals(1, edit.getCells().size());<a name="line.5647"></a>
-<span class="sourceLineNo">5648</span>    RegionEventDescriptor desc = WALEdit.getRegionEventDescriptor(edit.getCells().get(0));<a name="line.5648"></a>
-<span class="sourceLineNo">5649</span>    assertNotNull(desc);<a name="line.5649"></a>
+<span class="sourceLineNo">5644</span>    // capture append() calls<a name="line.5644"></a>
+<span class="sourceLineNo">5645</span>    WAL wal = mockWAL();<a name="line.5645"></a>
+<span class="sourceLineNo">5646</span>    when(rss.getWAL((HRegionInfo) any())).thenReturn(wal);<a name="line.5646"></a>
+<span class="sourceLineNo">5647</span><a name="line.5647"></a>
+<span class="sourceLineNo">5648</span>    region = HRegion.openHRegion(hri, htd, rss.getWAL(hri),<a name="line.5648"></a>
+<span class="sourceLineNo">5649</span>      TEST_UTIL.getConfiguration(), rss, null);<a name="line.5649"></a>
 <span class="sourceLineNo">5650</span><a name="line.5650"></a>
-<span class="sourceLineNo">5651</span>    LOG.info("RegionEventDescriptor from WAL: " + desc);<a name="line.5651"></a>
-<span class="sourceLineNo">5652</span><a name="line.5652"></a>
-<span class="sourceLineNo">5653</span>    assertEquals(RegionEventDescriptor.EventType.REGION_OPEN, desc.getEventType());<a name="line.5653"></a>
-<span class="sourceLineNo">5654</span>    assertTrue(Bytes.equals(desc.getTableName().toByteArray(), htd.getTableName().toBytes()));<a name="line.5654"></a>
-<span class="sourceLineNo">5655</span>    assertTrue(Bytes.equals(desc.getEncodedRegionName().toByteArray(),<a name="line.5655"></a>
-<span class="sourceLineNo">5656</span>      hri.getEncodedNameAsBytes()));<a name="line.5656"></a>
-<span class="sourceLineNo">5657</span>    assertTrue(desc.getLogSequenceNumber() &gt; 0);<a name="line.5657"></a>
-<span class="sourceLineNo">5658</span>    assertEquals(serverName, ProtobufUtil.toServerName(desc.getServer()));<a name="line.5658"></a>
-<span class="sourceLineNo">5659</span>    assertEquals(2, desc.getStoresCount());<a name="line.5659"></a>
+<span class="sourceLineNo">5651</span>    verify(wal, times(1)).append((HRegionInfo)any(), (WALKeyImpl)any()<a name="line.5651"></a>
+<span class="sourceLineNo">5652</span>      , editCaptor.capture(), anyBoolean());<a name="line.5652"></a>
+<span class="sourceLineNo">5653</span><a name="line.5653"></a>
+<span class="sourceLineNo">5654</span>    WALEdit edit = editCaptor.getValue();<a name="line.5654"></a>
+<span class="sourceLineNo">5655</span>    assertNotNull(edit);<a name="line.5655"></a>
+<span class="sourceLineNo">5656</span>    assertNotNull(edit.getCells());<a name="line.5656"></a>
+<span class="sourceLineNo">5657</span>    assertEquals(1, edit.getCells().size());<a name="line.5657"></a>
+<span class="sourceLineNo">5658</span>    RegionEventDescriptor desc = WALEdit.getRegionEventDescriptor(edit.getCells().get(0));<a name="line.5658"></a>
+<span class="sourceLineNo">5659</span>    assertNotNull(desc);<a name="line.5659"></a>
 <span class="sourceLineNo">5660</span><a name="line.5660"></a>
-<span class="sourceLineNo">5661</span>    StoreDescriptor store = desc.getStores(0);<a name="line.5661"></a>
-<span class="sourceLineNo">5662</span>    assertTrue(Bytes.equals(store.getFamilyName().toByteArray(), fam1));<a name="line.5662"></a>
-<span class="sourceLineNo">5663</span>    assertEquals(store.getStoreHomeDir(), Bytes.toString(fam1));<a name="line.5663"></a>
-<span class="sourceLineNo">5664</span>    assertEquals(1, store.getStoreFileCount()); // 1store file<a name="line.5664"></a>
-<span class="sourceLineNo">5665</span>    assertFalse(store.getStoreFile(0).contains("/")); // ensure path is relative<a name="line.5665"></a>
-<span class="sourceLineNo">5666</span><a name="line.5666"></a>
-<span class="sourceLineNo">5667</span>    store = desc.getStores(1);<a name="line.5667"></a>
-<span class="sourceLineNo">5668</span>    assertTrue(Bytes.equals(store.getFamilyName().toByteArray(), fam2));<a name="line.5668"></a>
-<span class="sourceLineNo">5669</span>    assertEquals(store.getStoreHomeDir(), Bytes.toString(fam2));<a name="line.5669"></a>
-<span class="sourceLineNo">5670</span>    assertEquals(0, store.getStoreFileCount()); // no store files<a name="line.5670"></a>
-<span class="sourceLineNo">5671</span>  }<a name="line.5671"></a>
-<span class="sourceLineNo">5672</span><a name="line.5672"></a>
-<span class="sourceLineNo">5673</span>  // Helper for test testOpenRegionWrittenToWALForLogReplay<a name="line.5673"></a>
-<span class="sourceLineNo">5674</span>  static class HRegionWithSeqId extends HRegion {<a name="line.5674"></a>
-<span class="sourceLineNo">5675</span>    public HRegionWithSeqId(final Path tableDir, final WAL wal, final FileSystem fs,<a name="line.5675"></a>
-<span class="sourceLineNo">5676</span>        final Configuration confParam, final RegionInfo regionInfo,<a name="line.5676"></a>
-<span class="sourceLineNo">5677</span>        final TableDescriptor htd, final RegionServerServices rsServices) {<a name="line.5677"></a>
-<span class="sourceLineNo">5678</span>      super(tableDir, wal, fs, confParam, regionInfo, htd, rsServices);<a name="line.5678"></a>
-<span class="sourceLineNo">5679</span>    }<a name="line.5679"></a>
-<span class="sourceLineNo">5680</span>    @Override<a name="line.5680"></a>
-<span class="sourceLineNo">5681</span>    protected long getNextSequenceId(WAL wal) throws IOException {<a name="line.5681"></a>
-<span class="sourceLineNo">5682</span>      return 42;<a name="line.5682"></a>
-<span class="sourceLineNo">5683</span>    }<a name="line.5683"></a>
-<span class="sourceLineNo">5684</span>  }<a name="line.5684"></a>
-<span class="sourceLineNo">5685</span><a name="line.5685"></a>
-<span class="sourceLineNo">5686</span>  @Test<a name="line.5686"></a>
-<span class="sourceLineNo">5687</span>  public void testFlushedFileWithNoTags() throws Exception {<a name="line.5687"></a>
-<span class="sourceLineNo">5688</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.5688"></a>
-<span class="sourceLineNo">5689</span>    HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.5689"></a>
-<span class="sourceLineNo">5690</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.5690"></a>
-<span class="sourceLineNo">5691</span>    HRegionInfo info = new HRegionInfo(tableName, null, null, false);<a name="line.5691"></a>
-<span class="sourceLineNo">5692</span>    Path path = TEST_UTIL.getDataTestDir(getClass().getSimpleName());<a name="line.5692"></a>
-<span class="sourceLineNo">5693</span>    region = HBaseTestingUtility.createRegionAndWAL(info, path, TEST_UTIL.getConfiguration(), htd);<a name="line.5693"></a>
-<span class="sourceLineNo">5694</span>    Put put = new Put(Bytes.toBytes("a-b-0-0"));<a name="line.5694"></a>
-<span class="sourceLineNo">5695</span>    put.addColumn(fam1, qual1, Bytes.toBytes("c1-value"));<a name="line.5695"></a>
-<span class="sourceLineNo">5696</span>    region.put(put);<a name="line.5696"></a>
-<span class="sourceLineNo">5697</span>    region.flush(true);<a name="line.5697"></a>
-<span class="sourceLineNo">5698</span>    HStore store = region.getStore(fam1);<a name="line.5698"></a>
-<span class="sourceLineNo">5699</span>    Collection&lt;HStoreFile&gt; storefiles = store.getStorefiles();<a name="line.5699"></a>
-<span class="sourceLineNo">5700</span>    for (HStoreFile sf : storefiles) {<a name="line.5700"></a>
-<span class="sourceLineNo">5701</span>      assertFalse("Tags should not be present "<a name="line.5701"></a>
-<span class="sourceLineNo">5702</span>          ,sf.getReader().getHFileReader().getFileContext().isIncludesTags());<a name="line.5702"></a>
-<span class="sourceLineNo">5703</span>    }<a name="line.5703"></a>
-<span class="sourceLineNo">5704</span>  }<a name="line.5704"></a>
-<span class="sourceLineNo">5705</span><a name="line.5705"></a>
-<span class="sourceLineNo">5706</span>  /**<a name="line.5706"></a>
-<span class="sourceLineNo">5707</span>   * Utility method to setup a WAL mock.<a name="line.5707"></a>
-<span class="sourceLineNo">5708</span>   * Needs to do the bit where we close latch on the WALKeyImpl on append else test hangs.<a name="line.5708"></a>
-<span class="sourceLineNo">5709</span>   * @return a mock WAL<a name="line.5709"></a>
-<span class="sourceLineNo">5710</span>   * @throws IOException<a name="line.5710"></a>
-<span class="sourceLineNo">5711</span>   */<a name="line.5711"></a>
-<span class="sourceLineNo">5712</span>  private WAL mockWAL() throws IOException {<a name="line.5712"></a>
-<span class="sourceLineNo">5713</span>    WAL wal = mock(WAL.class);<a name="line.5713"></a>
-<span class="sourceLineNo">5714</span>    Mockito.when(wal.append((HRegionInfo)Mockito.any(),<a name="line.5714"></a>
-<span class="sourceLineNo">5715</span>        (WALKeyImpl)Mockito.any(), (WALEdit)Mockito.any(), Mockito.anyBoolean())).<a name="line.5715"></a>
-<span class="sourceLineNo">5716</span>      thenAnswer(new Answer&lt;Long&gt;() {<a name="line.5716"></a>
-<span class="sourceLineNo">5717</span>        @Override<a name="line.5717"></a>
-<span class="sourceLineNo">5718</span>        public Long answer(InvocationOnMock invocation) throws Throwable {<a name="line.5718"></a>
-<span class="sourceLineNo">5719</span>          WALKeyImpl key = invocation.getArgument(1);<a name="line.5719"></a>
-<span class="sourceLineNo">5720</span>          MultiVersionConcurrencyControl.WriteEntry we = key.getMvcc().begin();<a name="line.5720"></a>
-<span class="sourceLineNo">5721</span>          key.setWriteEntry(we);<a name="line.5721"></a>
-<span class="sourceLineNo">5722</span>          return 1L;<a name="line.5722"></a>
-<span class="sourceLineNo">5723</span>        }<a name="line.5723"></a>
-<span class="sourceLineNo">5724</span><a name="line.5724"></a>
-<span class="sourceLineNo">5725</span>    });<a name="line.5725"></a>
-<span class="sourceLineNo">5726</span>    return wal;<a name="line.5726"></a>
-<span class="sourceLineNo">5727</span>  }<a name="line.5727"></a>
-<span class="sourceLineNo">5728</span><a name="line.5728"></a>
-<span class="sourceLineNo">5729</span>  @Test<a name="line.5729"></a>
-<span class="sourceLineNo">5730</span>  public void testCloseRegionWrittenToWAL() throws Exception {<a name="line.5730"></a>
-<span class="sourceLineNo">5731</span><a name="line.5731"></a>
-<span class="sourceLineNo">5732</span>    Path rootDir = new Path(dir + name.getMethodName());<a name="line.5732"></a>
-<span class="sourceLineNo">5733</span>    FSUtils.setRootDir(TEST_UTIL.getConfiguration(), rootDir);<a name="line.5733"></a>
+<span class="sourceLineNo">5661</span>    LOG.info("RegionEventDescriptor from WAL: " + desc);<a name="line.5661"></a>
+<span class="sourceLineNo">5662</span><a name="line.5662"></a>
+<span class="sourceLineNo">5663</span>    assertEquals(RegionEventDescriptor.EventType.REGION_OPEN, desc.getEventType());<a name="line.5663"></a>
+<span class="sourceLineNo">5664</span>    assertTrue(Bytes.equals(desc.getTableName().toByteArray(), htd.getTableName().toBytes()));<a name="line.5664"></a>
+<span class="sourceLineNo">5665</span>    assertTrue(Bytes.equals(desc.getEncodedRegionName().toByteArray(),<a name="line.5665"></a>
+<span class="sourceLineNo">5666</span>      hri.getEncodedNameAsBytes()));<a name="line.5666"></a>
+<span class="sourceLineNo">5667</span>    assertTrue(desc.getLogSequenceNumber() &gt; 0);<a name="line.5667"></a>
+<span class="sourceLineNo">5668</span>    assertEquals(serverName, ProtobufUtil.toServerName(desc.getServer()));<a name="line.5668"></a>
+<span class="sourceLineNo">5669</span>    assertEquals(2, desc.getStoresCount());<a name="line.5669"></a>
+<span class="sourceLineNo">5670</span><a name="line.5670"></a>
+<span class="sourceLineNo">5671</span>    StoreDescriptor store = desc.getStores(0);<a name="line.5671"></a>
+<span class="sourceLineNo">5672</span>    assertTrue(Bytes.equals(store.getFamilyName().toByteArray(), fam1));<a name="line.5672"></a>
+<span class="sourceLineNo">5673</span>    assertEquals(store.getStoreHomeDir(), Bytes.toString(fam1));<a name="line.5673"></a>
+<span class="sourceLineNo">5674</span>    assertEquals(1, store.getStoreFileCount()); // 1store file<a name="line.5674"></a>
+<span class="sourceLineNo">5675</span>    assertFalse(store.getStoreFile(0).contains("/")); // ensure path is relative<a name="line.5675"></a>
+<span class="sourceLineNo">5676</span><a name="line.5676"></a>
+<span class="sourceLineNo">5677</span>    store = desc.getStores(1);<a name="line.5677"></a>
+<span class="sourceLineNo">5678</span>    assertTrue(Bytes.equals(store.getFamilyName().toByteArray(), fam2));<a name="line.5678"></a>
+<span class="sourceLineNo">5679</span>    assertEquals(store.getStoreHomeDir(), Bytes.toString(fam2));<a name="line.5679"></a>
+<span class="sourceLineNo">5680</span>    assertEquals(0, store.getStoreFileCount()); // no store files<a name="line.5680"></a>
+<span class="sourceLineNo">5681</span>  }<a name="line.5681"></a>
+<span class="sourceLineNo">5682</span><a name="line.5682"></a>
+<span class="sourceLineNo">5683</span>  // Helper for test testOpenRegionWrittenToWALForLogReplay<a name="line.5683"></a>
+<span class="sourceLineNo">5684</span>  static class HRegionWithSeqId extends HRegion {<a name="line.5684"></a>
+<span class="sourceLineNo">5685</span>    public HRegionWithSeqId(final Path tableDir, final WAL wal, final FileSystem fs,<a name="line.5685"></a>
+<span class="sourceLineNo">5686</span>        final Configuration confParam, final RegionInfo regionInfo,<a name="line.5686"></a>
+<span class="sourceLineNo">5687</span>        final TableDescriptor htd, final RegionServerServices rsServices) {<a name="line.5687"></a>
+<span class="sourceLineNo">5688</span>      super(tableDir, wal, fs, confParam, regionInfo, htd, rsServices);<a name="line.5688"></a>
+<span class="sourceLineNo">5689</span>    }<a name="line.5689"></a>
+<span class="sourceLineNo">5690</span>    @Override<a name="line.5690"></a>
+<span class="sourceLineNo">5691</span>    protected long getNextSequenceId(WAL wal) throws IOException {<a name="line.5691"></a>
+<span class="sourceLineNo">5692</span>      return 42;<a name="line.5692"></a>
+<span class="sourceLineNo">5693</span>    }<a name="line.5693"></a>
+<span class="sourceLineNo">5694</span>  }<a name="line.5694"></a>
+<span class="sourceLineNo">5695</span><a name="line.5695"></a>
+<span class="sourceLineNo">5696</span>  @Test<a name="line.5696"></a>
+<span class="sourceLineNo">5697</span>  public void testFlushedFileWithNoTags() throws Exception {<a name="line.5697"></a>
+<span class="sourceLineNo">5698</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.5698"></a>
+<span class="sourceLineNo">5699</span>    HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.5699"></a>
+<span class="sourceLineNo">5700</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.5700"></a>
+<span class="sourceLineNo">5701</span>    HRegionInfo info = new HRegionInfo(tableName, null, null, false);<a name="line.5701"></a>
+<span class="sourceLineNo">5702</span>    Path path = TEST_UTIL.getDataTestDir(getClass().getSimpleName());<a name="line.5702"></a>
+<span class="sourceLineNo">5703</span>    region = HBaseTestingUtility.createRegionAndWAL(info, path, TEST_UTIL.getConfiguration(), htd);<a name="line.5703"></a>
+<span class="sourceLineNo">5704</span>    Put put = new Put(Bytes.toBytes("a-b-0-0"));<a name="line.5704"></a>
+<span class="sourceLineNo">5705</span>    put.addColumn(fam1, qual1, Bytes.toBytes("c1-value"));<a name="line.5705"></a>
+<span class="sourceLineNo">5706</span>    region.put(put);<a name="line.5706"></a>
+<span class="sourceLineNo">5707</span>    region.flush(true);<a name="line.5707"></a>
+<span class="sourceLineNo">5708</span>    HStore store = region.getStore(fam1);<a name="line.5708"></a>
+<span class="sourceLineNo">5709</span>    Collection&lt;HStoreFile&gt; storefiles = store.getStorefiles();<a name="line.5709"></a>
+<span class="sourceLineNo">5710</span>    for (HStoreFile sf : storefiles) {<a name="line.5710"></a>
+<span class="sourceLineNo">5711</span>      assertFalse("Tags should not be present "<a name="line.5711"></a>
+<span class="sourceLineNo">5712</span>          ,sf.getReader().getHFileReader().getFileContext().isIncludesTags());<a name="line.5712"></a>
+<span class="sourceLineNo">5713</span>    }<a name="line.5713"></a>
+<span class="sourceLineNo">5714</span>  }<a name="line.5714"></a>
+<span class="sourceLineNo">5715</span><a name="line.5715"></a>
+<span class="sourceLineNo">5716</span>  /**<a name="line.5716"></a>
+<span class="sourceLineNo">5717</span>   * Utility method to setup a WAL mock.<a name="line.5717"></a>
+<span class="sourceLineNo">5718</span>   * Needs to do the bit where we close latch on the WALKeyImpl on append else test hangs.<a name="line.5718"></a>
+<span class="sourceLineNo">5719</span>   * @return a mock WAL<a name="line.5719"></a>
+<span class="sourceLineNo">5720</span>   * @throws IOException<a name="line.5720"></a>
+<span class="sourceLineNo">5721</span>   */<a name="line.5721"></a>
+<span class="sourceLineNo">5722</span>  private WAL mockWAL() throws IOException {<a name="line.5722"></a>
+<span class="sourceLineNo">5723</span>    WAL wal = mock(WAL.class);<a name="line.5723"></a>
+<span class="sourceLineNo">5724</span>    Mockito.when(wal.append((HRegionInfo)Mockito.any(),<a name="line.5724"></a>
+<span class="sourceLineNo">5725</span>        (WALKeyImpl)Mockito.any(), (WALEdit)Mockito.any(), Mockito.anyBoolean())).<a name="line.5725"></a>
+<span class="sourceLineNo">5726</span>      thenAnswer(new Answer&lt;Long&gt;() {<a name="line.5726"></a>
+<span class="sourceLineNo">5727</span>        @Override<a name="line.5727"></a>
+<span class="sourceLineNo">5728</span>        public Long answer(InvocationOnMock invocation) throws Throwable {<a name="line.5728"></a>
+<span class="sourceLineNo">5729</span>          WALKeyImpl key = invocation.getArgument(1);<a name="line.5729"></a>
+<span class="sourceLineNo">5730</span>          MultiVersionConcurrencyControl.WriteEntry we = key.getMvcc().begin();<a name="line.5730"></a>
+<span class="sourceLineNo">5731</span>          key.setWriteEntry(we);<a name="line.5731"></a>
+<span class="sourceLineNo">5732</span>          return 1L;<a name="line.5732"></a>
+<span class="sourceLineNo">5733</span>        }<a name="line.5733"></a>
 <span class="sourceLineNo">5734</span><a name="line.5734"></a>
-<span class="sourceLineNo">5735</span>    final ServerName serverName = ServerName.valueOf("testCloseRegionWrittenToWAL", 100, 42);<a name="line.5735"></a>
-<span class="sourceLineNo">5736</span>    final RegionServerServices rss = spy(TEST_UTIL.createMockRegionServerService(serverName));<a name="line.5736"></a>
-<span class="sourceLineNo">5737</span><a name="line.5737"></a>
-<span class="sourceLineNo">5738</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.5738"></a>
-<span class="sourceLineNo">5739</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.5739"></a>
-<span class="sourceLineNo">5740</span>    htd.addFamily(new HColumnDescriptor(fam2));<a name="line.5740"></a>
+<span class="sourceLineNo">5735</span>    });<a name="line.5735"></a>
+<span class="sourceLineNo">5736</span>    return wal;<a name="line.5736"></a>
+<span class="sourceLineNo">5737</span>  }<a name="line.5737"></a>
+<span class="sourceLineNo">5738</span><a name="line.5738"></a>
+<span class="sourceLineNo">5739</span>  @Test<a name="line.5739"></a>
+<span class="sourceLineNo">5740</span>  public void testCloseRegionWrittenToWAL() throws Exception {<a name="line.5740"></a>
 <span class="sourceLineNo">5741</span><a name="line.5741"></a>
-<span class="sourceLineNo">5742</span>    final HRegionInfo hri = new HRegionInfo(htd.getTableName(),<a name="line.5742"></a>
-<span class="sourceLineNo">5743</span>      HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY);<a name="line.5743"></a>
+<span class="sourceLineNo">5742</span>    Path rootDir = new Path(dir + name.getMethodName());<a name="line.5742"></a>
+<span class="sourceLineNo">5743</span>    FSUtils.setRootDir(TEST_UTIL.getConfiguration(), rootDir);<a name="line.5743"></a>
 <span class="sourceLineNo">5744</span><a name="line.5744"></a>
-<span class="sourceLineNo">5745</span>    ArgumentCaptor&lt;WALEdit&gt; editCaptor = ArgumentCaptor.forClass(WALEdit.class);<a name="line.5745"></a>
-<span class="sourceLineNo">5746</span><a name="line.5746"></a>
-<span class="sourceLineNo">5747</span>    // capture append() calls<a name="line.5747"></a>
-<span class="sourceLineNo">5748</span>    WAL wal = mockWAL();<a name="line.5748"></a>
-<span class="sourceLineNo">5749</span>    when(rss.getWAL((HRegionInfo) any())).thenReturn(wal);<a name="line.5749"></a>
-<span class="sourceLineNo">5750</span><a name="line.5750"></a>
+<span class="sourceLineNo">5745</span>    final ServerName serverName = ServerName.valueOf("testCloseRegionWrittenToWAL", 100, 42);<a name="line.5745"></a>
+<span class="sourceLineNo">5746</span>    final RegionServerServices rss = spy(TEST_UTIL.createMockRegionServerService(serverName));<a name="line.5746"></a>
+<span class="sourceLineNo">5747</span><a name="line.5747"></a>
+<span class="sourceLineNo">5748</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.5748"></a>
+<span class="sourceLineNo">5749</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.5749"></a>
+<span class="sourceLineNo">5750</span>    htd.addFamily(new HColumnDescriptor(fam2));<a name="line.5750"></a>
 <span class="sourceLineNo">5751</span><a name="line.5751"></a>
-<span class="sourceLineNo">5752</span>    // create and then open a region first so that it can be closed later<a name="line.5752"></a>
-<span class="sourceLineNo">5753</span>    region = HRegion.createHRegion(hri, rootDir, TEST_UTIL.getConfiguration(), htd, rss.getWAL(hri));<a name="line.5753"></a>
-<span class="sourceLineNo">5754</span>    region = HRegion.openHRegion(hri, htd, rss.getWAL(hri),<a name="line.5754"></a>
-<span class="sourceLineNo">5755</span>      TEST_UTIL.getConfiguration(), rss, null);<a name="line.5755"></a>
+<span class="sourceLineNo">5752</span>    final HRegionInfo hri = new HRegionInfo(htd.getTableName(),<a name="line.5752"></a>
+<span class="sourceLineNo">5753</span>      HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY);<a name="line.5753"></a>
+<span class="sourceLineNo">5754</span><a name="line.5754"></a>
+<span class="sourceLineNo">5755</span>    ArgumentCaptor&lt;WALEdit&gt; editCaptor = ArgumentCaptor.forClass(WALEdit.class);<a name="line.5755"></a>
 <span class="sourceLineNo">5756</span><a name="line.5756"></a>
-<span class="sourceLineNo">5757</span>    // close the region<a name="line.5757"></a>
-<span class="sourceLineNo">5758</span>    region.close(false);<a name="line.5758"></a>
-<span class="sourceLineNo">5759</span><a name="line.5759"></a>
-<span class="sourceLineNo">5760</span>    // 2 times, one for region open, the other close region<a name="line.5760"></a>
-<span class="sourceLineNo">5761</span>    verify(wal, times(2)).append((HRegionInfo)any(), (WALKeyImpl)any(),<a name="line.5761"></a>
-<span class="sourceLineNo">5762</span>      editCaptor.capture(), anyBoolean());<a name="line.5762"></a>
-<span class="sourceLineNo">5763</span><a name="line.5763"></a>
-<span class="sourceLineNo">5764</span>    WALEdit edit = editCaptor.getAllValues().get(1);<a name="line.5764"></a>
-<span class="sourceLineNo">5765</span>    assertNotNull(edit);<a name="line.5765"></a>
-<span class="sourceLineNo">5766</span>    assertNotNull(edit.getCells());<a name="line.5766"></a>
-<span class="sourceLineNo">5767</span>    assertEquals(1, edit.getCells().size());<a name="line.5767"></a>
-<span class="sourceLineNo">5768</span>    RegionEventDescriptor desc = WALEdit.getRegionEventDescriptor(edit.getCells().get(0));<a name="line.5768"></a>
-<span class="sourceLineNo">5769</span>    assertNotNull(desc);<a name="line.5769"></a>
-<span class="sourceLineNo">5770</span><a name="line.5770"></a>
-<span class="sourceLineNo">5771</span>    LOG.info("RegionEventDescriptor from WAL: " + desc);<a name="line.5771"></a>
-<span class="sourceLineNo">5772</span><a name="line.5772"></a>
-<span class="sourceLineNo">5773</span>    assertEquals(RegionEventDescriptor.EventType.REGION_CLOSE, desc.getEventType());<a name="line.5773"></a>
-<span class="sourceLineNo">5774</span>    assertTrue(Bytes.equals(desc.getTableName().toByteArray(), htd.getTableName().toBytes()));<a name="line.5774"></a>
-<span class="sourceLineNo">5775</span>    assertTrue(Bytes.equals(desc.getEncodedRegionName().toByteArray(),<a name="line.5775"></a>
-<span class="sourceLineNo">5776</span>      hri.getEncodedNameAsBytes()));<a name="line.5776"></a>
-<span class="sourceLineNo">5777</span>    assertTrue(desc.getLogSequenceNumber() &gt; 0);<a name="line.5777"></a>
-<span class="sourceLineNo">5778</span>    assertEquals(serverName, ProtobufUtil.toServerName(desc.getServer()));<a name="line.5778"></a>
-<span class="sourceLineNo">5779</span>    assertEquals(2, desc.getStoresCount());<a name="line.5779"></a>
+<span class="sourceLineNo">5757</span>    // capture append() calls<a name="line.5757"></a>
+<span class="sourceLineNo">5758</span>    WAL wal = mockWAL();<a name="line.5758"></a>
+<span class="sourceLineNo">5759</span>    when(rss.getWAL((HRegionInfo) any())).thenReturn(wal);<a name="line.5759"></a>
+<span class="sourceLineNo">5760</span><a name="line.5760"></a>
+<span class="sourceLineNo">5761</span><a name="line.5761"></a>
+<span class="sourceLineNo">5762</span>    // create and then open a region first so that it can be closed later<a name="line.5762"></a>
+<span class="sourceLineNo">5763</span>    region = HRegion.createHRegion(hri, rootDir, TEST_UTIL.getConfiguration(), htd, rss.getWAL(hri));<a name="line.5763"></a>
+<span class="sourceLineNo">5764</span>    region = HRegion.openHRegion(hri, htd, rss.getWAL(hri),<a name="line.5764"></a>
+<span class="sourceLineNo">5765</span>      TEST_UTIL.getConfiguration(), rss, null);<a name="line.5765"></a>
+<span class="sourceLineNo">5766</span><a name="line.5766"></a>
+<span class="sourceLineNo">5767</span>    // close the region<a name="line.5767"></a>
+<span class="sourceLineNo">5768</span>    region.close(false);<a name="line.5768"></a>
+<span class="sourceLineNo">5769</span><a name="line.5769"></a>
+<span class="sourceLineNo">5770</span>    // 2 times, one for region open, the other close region<a name="line.5770"></a>
+<span class="sourceLineNo">5771</span>    verify(wal, times(2)).append((HRegionInfo)any(), (WALKeyImpl)any(),<a name="line.5771"></a>
+<span class="sourceLineNo">5772</span>      editCaptor.capture(), anyBoolean());<a name="line.5772"></a>
+<span class="sourceLineNo">5773</span><a name="line.5773"></a>
+<span class="sourceLineNo">5774</span>    WALEdit edit = editCaptor.getAllValues().get(1);<a name="line.5774"></a>
+<span class="sourceLineNo">5775</span>    assertNotNull(edit);<a name="line.5775"></a>
+<span class="sourceLineNo">5776</span>    assertNotNull(edit.getCells());<a name="line.5776"></a>
+<span class="sourceLineNo">5777</span>    assertEquals(1, edit.getCells().size());<a name="line.5777"></a>
+<span class="sourceLineNo">5778</span>    RegionEventDescriptor desc = WALEdit.getRegionEventDescriptor(edit.getCells().get(0));<a name="line.5778"></a>
+<span class="sourceLineNo">5779</span>    assertNotNull(desc);<a name="line.5779"></a>
 <span class="sourceLineNo">5780</span><a name="line.5780"></a>
-<span class="sourceLineNo">5781</span>    StoreDescriptor store = desc.getStores(0);<a name="line.5781"></a>
-<span class="sourceLineNo">5782</span>    assertTrue(Bytes.equals(store.getFamilyName().toByteArray(), fam1));<a name="line.5782"></a>
-<span class="sourceLineNo">5783</span>    assertEquals(store.getStoreHomeDir(), Bytes.toString(fam1));<a name="line.5783"></a>
-<span class="sourceLineNo">5784</span>    assertEquals(0, store.getStoreFileCount()); // no store files<a name="line.5784"></a>
-<span class="sourceLineNo">5785</span><a name="line.5785"></a>
-<span class="sourceLineNo">5786</span>    store = desc.getStores(1);<a name="line.5786"></a>
-<span class="sourceLineNo">5787</span>    assertTrue(Bytes.equals(store.getFamilyName().toByteArray(), fam2));<a name="line.5787"></a>
-<span class="sourceLineNo">5788</span>    assertEquals(store.getStoreHomeDir(), Bytes.toString(fam2));<a name="line.5788"></a>
-<span class="sourceLineNo">5789</span>    assertEquals(0, store.getStoreFileCount()); // no store files<a name="line.5789"></a>
-<span class="sourceLineNo">5790</span>  }<a name="line.5790"></a>
-<span class="sourceLineNo">5791</span><a name="line.5791"></a>
-<span class="sourceLineNo">5792</span>  /**<a name="line.5792"></a>
-<span class="sourceLineNo">5793</span>   * Test RegionTooBusyException thrown when region is busy<a name="line.5793"></a>
-<span class="sourceLineNo">5794</span>   */<a name="line.5794"></a>
-<span class="sourceLineNo">5795</span>  @Test<a name="line.5795"></a>
-<span class="sourceLineNo">5796</span>  public void testRegionTooBusy() throws IOException {<a name="line.5796"></a>
-<span class="sourceLineNo">5797</span>    byte[] family = Bytes.toBytes("family");<a name="line.5797"></a>
-<span class="sourceLineNo">5798</span>    long defaultBusyWaitDuration = CONF.getLong("hbase.busy.wait.duration",<a name="line.5798"></a>
-<span class="sourceLineNo">5799</span>      HRegion.DEFAULT_BUSY_WAIT_DURATION);<a name="line.5799"></a>
-<span class="sourceLineNo">5800</span>    CONF.setLong("hbase.busy.wait.duration", 1000);<a name="line.5800"></a>
-<span class="sourceLineNo">5801</span>    region = initHRegion(tableName, method, CONF, family);<a name="line.5801"></a>
-<span class="sourceLineNo">5802</span>    final AtomicBoolean stopped = new AtomicBoolean(true);<a name="line.5802"></a>
-<span class="sourceLineNo">5803</span>    Thread t = new Thread(new Runnable() {<a name="line.5803"></a>
-<span class="sourceLineNo">5804</span>      @Override<a name="line.5804"></a>
-<span class="sourceLineNo">5805</span>      public void run() {<a name="line.5805"></a>
-<span class="sourceLineNo">5806</span>        try {<a name="line.5806"></a>
-<span class="sourceLineNo">5807</span>          region.lock.writeLock().lock();<a name="line.5807"></a>
-<span class="sourceLineNo">5808</span>          stopped.set(false);<a name="line.5808"></a>
-<span class="sourceLineNo">5809</span>          while (!stopped.get()) {<a name="line.5809"></a>
-<span class="sourceLineNo">5810</span>            Thread.sleep(100);<a name="line.5810"></a>
-<span class="sourceLineNo">5811</span>          }<a name="line.5811"></a>
-<span class="sourceLineNo">5812</span>        } catch (InterruptedException ie) {<a name="line.5812"></a>
-<span class="sourceLineNo">5813</span>        } finally {<a name="line.5813"></a>
-<span class="sourceLineNo">5814</span>          region.lock.writeLock().unlock();<a name="line.5814"></a>
-<span class="sourceLineNo">5815</span>        }<a name="line.5815"></a>
-<span class="sourceLineNo">5816</span>      }<a name="line.5816"></a>
-<span class="sourceLineNo">5817</span>    });<a name="line.5817"></a>
-<span class="sourceLineNo">5818</span>    t.start();<a name="line.5818"></a>
-<span class="sourceLineNo">5819</span>    Get get = new Get(row);<a name="line.5819"></a>
-<span class="sourceLineNo">5820</span>    try {<a name="line.5820"></a>
-<span class="sourceLineNo">5821</span>      while (stopped.get()) {<a name="line.5821"></a>
-<span class="sourceLineNo">5822</span>        Thread.sleep(100);<a name="line.5822"></a>
-<span class="sourceLineNo">5823</span>      }<a name="line.5823"></a>
-<span class="sourceLineNo">5824</span>      region.get(get);<a name="line.5824"></a>
-<span class="sourceLineNo">5825</span>      fail("Should throw RegionTooBusyException");<a name="line.5825"></a>
-<span class="sourceLineNo">5826</span>    } catch (InterruptedException ie) {<a name="line.5826"></a>
-<span class="sourceLineNo">5827</span>      fail("test interrupted");<a name="line.5827"></a>
-<span class="sourceLineNo">5828</span>    } catch (RegionTooBusyException e) {<a name="line.5828"></a>
-<span class="sourceLineNo">5829</span>      // Good, expected<a name="line.5829"></a>
-<span class="sourceLineNo">5830</span>    } finally {<a name="line.5830"></a>
-<span class="sourceLineNo">5831</span>      stopped.set(true);<a name="line.5831"></a>
-<span class="sourceLineNo">5832</span>      try {<a name="line.5832"></a>
-<span class="sourceLineNo">5833</span>        t.join();<a name="line.5833"></a>
-<span class="sourceLineNo">5834</span>      } catch (Throwable e) {<a name="line.5834"></a>
-<span class="sourceLineNo">5835</span>      }<a name="line.5835"></a>
-<span class="sourceLineNo">5836</span><a name="line.5836"></a>
-<span class="sourceLineNo">5837</span>      HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.5837"></a>
-<span class="sourceLineNo">5838</span>      region = null;<a name="line.5838"></a>
-<span class="sourceLineNo">5839</span>      CONF.setLong("hbase.busy.wait.duration", defaultBusyWaitDuration);<a name="line.5839"></a>
-<span class="sourceLineNo">5840</span>    }<a name="line.5840"></a>
-<span class="sourceLineNo">5841</span>  }<a name="line.5841"></a>
-<span class="sourceLineNo">5842</span><a name="line.5842"></a>
-<span class="sourceLineNo">5843</span>  @Test<a name="line.5843"></a>
-<span class="sourceLineNo">5844</span>  public void testCellTTLs() throws IOException {<a name="line.5844"></a>
-<span class="sourceLineNo">5845</span>    IncrementingEnvironmentEdge edge = new IncrementingEnvironmentEdge();<a name="line.5845"></a>
-<span class="sourceLineNo">5846</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.5846"></a>
-<span class="sourceLineNo">5847</span><a name="line.5847"></a>
-<span class="sourceLineNo">5848</span>    final byte[] row = Bytes.toBytes("testRow");<a name="line.5848"></a>
-<span class="sourceLineNo">5849</span>    final byte[] q1 = Bytes.toBytes("q1");<a name="line.5849"></a>
-<span class="sourceLineNo">5850</span>    final byte[] q2 = Bytes.toBytes("q2");<a name="line.5850"></a>
-<span class="sourceLineNo">5851</span>    final byte[] q3 = Bytes.toBytes("q3");<a name="line.5851"></a>
-<span class="sourceLineNo">5852</span>    final byte[] q4 = Bytes.toBytes("q4");<a name="line.5852"></a>
-<span class="sourceLineNo">5853</span><a name="line.5853"></a>
-<span class="sourceLineNo">5854</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.5854"></a>
-<span class="sourceLineNo">5855</span>    HColumnDescriptor hcd = new HColumnDescriptor(fam1);<a name="line.5855"></a>
-<span class="sourceLineNo">5856</span>    hcd.setTimeToLive(10); // 10 seconds<a name="line.5856"></a>
-<span class="sourceLineNo">5857</span>    htd.addFamily(hcd);<a name="line.5857"></a>
-<span class="sourceLineNo">5858</span><a name="line.5858"></a>
-<span class="sourceLineNo">5859</span>    Configuration conf = new Configuration(TEST_UTIL.getConfiguration());<a name="line.5859"></a>
-<span class="sourceLineNo">5860</span>    conf.setInt(HFile.FORMAT_VERSION_KEY, HFile.MIN_FORMAT_VERSION_WITH_TAGS);<a name="line.5860"></a>
-<span class="sourceLineNo">5861</span><a name="line.5861"></a>
-<span class="sourceLineNo">5862</span>    region = HBaseTestingUtility.createRegionAndWAL(new HRegionInfo(htd.getTableName(),<a name="line.5862"></a>
-<span class="sourceLineNo">5863</span>            HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY),<a name="line.5863"></a>
-<span class="sourceLineNo">5864</span>        TEST_UTIL.getDataTestDir(), conf, htd);<a name="line.5864"></a>
-<span class="sourceLineNo">5865</span>    assertNotNull(region);<a name="line.5865"></a>
-<span class="sourceLineNo">5866</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.5866"></a>
-<span class="sourceLineNo">5867</span>    // Add a cell that will expire in 5 seconds via cell TTL<a name="line.5867"></a>
-<span class="sourceLineNo">5868</span>    region.put(new Put(row).add(new KeyValue(row, fam1, q1, now,<a name="line.5868"></a>
-<span class="sourceLineNo">5869</span>      HConstants.EMPTY_BYTE_ARRAY, new ArrayBackedTag[] {<a name="line.5869"></a>
-<span class="sourceLineNo">5870</span>        // TTL tags specify ts in milliseconds<a name="line.5870"></a>
-<span class="sourceLineNo">5871</span>        new ArrayBackedTag(TagType.TTL_TAG_TYPE, Bytes.toBytes(5000L)) })));<a name="line.5871"></a>
-<span class="sourceLineNo">5872</span>    // Add a cell that will expire after 10 seconds via family setting<a name="line.5872"></a>
-<span class="sourceLineNo">5873</span>    region.put(new Put(row).addColumn(fam1, q2, now, HConstants.EMPTY_BYTE_ARRAY));<a name="line.5873"></a>
-<span class="sourceLineNo">5874</span>    // Add a cell that will expire in 15 seconds via cell TTL<a name="line.5874"></a>
-<span class="sourceLineNo">5875</span>    region.put(new Put(row).add(new KeyValue(row, fam1, q3, now + 10000 - 1,<a name="line.5875"></a>
-<span class="sourceLineNo">5876</span>      HConstants.EMPTY_BYTE_ARRAY, new ArrayBackedTag[] {<a name="line.5876"></a>
-<span class="sourceLineNo">5877</span>        // TTL tags specify ts in milliseconds<a name="line.5877"></a>
-<span class="sourceLineNo">5878</span>        new ArrayBackedTag(TagType.TTL_TAG_TYPE, Bytes.toBytes(5000L)) })));<a name="line.5878"></a>
-<span class="sourceLineNo">5879</span>    // Add a cell that will expire in 20 seconds via family setting<a name="line.5879"></a>
-<span class="sourceLineNo">5880</span>    region.put(new Put(row).addColumn(fam1, q4, now + 10000 - 1, HConstants.EMPTY_BYTE_ARRAY));<a name="line.5880"></a>
-<span class="sourceLineNo">5881</span><a name="line.5881"></a>
-<span class="sourceLineNo">5882</span>    // Flush so we are sure store scanning gets this right<a name="line.5882"></a>
-<span class="sourceLineNo">5883</span>    region.flush(true);<a name="line.5883"></a>
-<span class="sourceLineNo">5884</span><a name="line.5884"></a>
-<span class="sourceLineNo">5885</span>    // A query at time T+0 should return all cells<a name="line.5885"></a>
-<span class="sourceLineNo">5886</span>    Result r = region.get(new Get(row));<a name="line.5886"></a>
-<span class="sourceLineNo">5887</span>    assertNotNull(r.getValue(fam1, q1));<a name="line.5887"></a>
-<span class="sourceLineNo">5888</span>    assertNotNull(r.getValue(fam1, q2));<a name="line.5888"></a>
-<span class="sourceLineNo">5889</span>    assertNotNull(r.getValue(fam1, q3));<a name="line.5889"></a>
-<span class="sourceLineNo">5890</span>    assertNotNull(r.getValue(fam1, q4));<a name="line.5890"></a>
+<span class="sourceLineNo">5781</span>    LOG.info("RegionEventDescriptor from WAL: " + desc);<a name="line.5781"></a>
+<span class="sourceLineNo">5782</span><a name="line.5782"></a>
+<span class="sourceLineNo">5783</span>    assertEquals(RegionEventDescriptor.EventType.REGION_CLOSE, desc.getEventType());<a name="line.5783"></a>
+<span class="sourceLineNo">5784</span>    assertTrue(Bytes.equals(desc.getTableName().toByteArray(), htd.getTableName().toBytes()));<a name="line.5784"></a>
+<span class="sourceLineNo">5785</span>    assertTrue(Bytes.equals(desc.getEncodedRegionName().toByteArray(),<a name="line.5785"></a>
+<span class="sourceLineNo">5786</span>      hri.getEncodedNameAsBytes()));<a name="line.5786"></a>
+<span class="sourceLineNo">5787</span>    assertTrue(desc.getLogSequenceNumber() &gt; 0);<a name="line.5787"></a>
+<span class="sourceLineNo">5788</span>    assertEquals(serverName, ProtobufUtil.toServerName(desc.getServer()));<a name="line.5788"></a>
+<span class="sourceLineNo">5789</span>    assertEquals(2, desc.getStoresCount());<a name="line.5789"></a>
+<span class="sourceLineNo">5790</span><a name="line.5790"></a>
+<span class="sourceLineNo">5791</span>    StoreDescriptor store = desc.getStores(0);<a name="line.5791"></a>
+<span class="sourceLineNo">5792</span>    assertTrue(Bytes.equals(store.getFamilyName().toByteArray(), fam1));<a name="line.5792"></a>
+<span class="sourceLineNo">5793</span>    assertEquals(store.getStoreHomeDir(), Bytes.toString(fam1));<a name="line.5793"></a>
+<span class="sourceLineNo">5794</span>    assertEquals(0, store.getStoreFileCount()); // no store files<a name="line.5794"></a>
+<span class="sourceLineNo">5795</span><a name="line.5795"></a>
+<span class="sourceLineNo">5796</span>    store = desc.getStores(1);<a name="line.5796"></a>
+<span class="sourceLineNo">5797</span>    assertTrue(Bytes.equals(store.getFamilyName().toByteArray(), fam2));<a name="line.5797"></a>
+<span class="sourceLineNo">5798</span>    assertEquals(store.getStoreHomeDir(), Bytes.toString(fam2));<a name="line.5798"></a>
+<span class="sourceLineNo">5799</span>    assertEquals(0, store.getStoreFileCount()); // no store files<a name="line.5799"></a>
+<span class="sourceLineNo">5800</span>  }<a name="line.5800"></a>
+<span class="sourceLineNo">5801</span><a name="line.5801"></a>
+<span class="sourceLineNo">5802</span>  /**<a name="line.5802"></a>
+<span class="sourceLineNo">5803</span>   * Test RegionTooBusyException thrown when region is busy<a name="line.5803"></a>
+<span class="sourceLineNo">5804</span>   */<a name="line.5804"></a>
+<span class="sourceLineNo">5805</span>  @Test<a name="line.5805"></a>
+<span class="sourceLineNo">5806</span>  public void testRegionTooBusy() throws IOException {<a name="line.5806"></a>
+<span class="sourceLineNo">5807</span>    byte[] family = Bytes.toBytes("family");<a name="line.5807"></a>
+<span class="sourceLineNo">5808</span>    long defaultBusyWaitDuration = CONF.getLong("hbase.busy.wait.duration",<a name="line.5808"></a>
+<span class="sourceLineNo">5809</span>      HRegion.DEFAULT_BUSY_WAIT_DURATION);<a name="line.5809"></a>
+<span class="sourceLineNo">5810</span>    CONF.setLong("hbase.busy.wait.duration", 1000);<a name="line.5810"></a>
+<span class="sourceLineNo">5811</span>    region = initHRegion(tableName, method, CONF, family);<a name="line.5811"></a>
+<span class="sourceLineNo">5812</span>    final AtomicBoolean stopped = new AtomicBoolean(true);<a name="line.5812"></a>
+<span class="sourceLineNo">5813</span>    Thread t = new Thread(new Runnable() {<a name="line.5813"></a>
+<span class="sourceLineNo">5814</span>      @Override<a name="line.5814"></a>
+<span class="sourceLineNo">5815</span>      public void run() {<a name="line.5815"></a>
+<span class="sourceLineNo">5816</span>        try {<a name="line.5816"></a>
+<span class="sourceLineNo">5817</span>          region.lock.writeLock().lock();<a name="line.5817"></a>
+<span class="sourceLineNo">5818</span>          stopped.set(false);<a name="line.5818"></a>
+<span class="sourceLineNo">5819</span>          while (!stopped.get()) {<a name="line.5819"></a>
+<span class="sourceLineNo">5820</span>            Thread.sleep(100);<a name="line.5820"></a>
+<span class="sourceLineNo">5821</span>          }<a name="line.5821"></a>
+<span class="sourceLineNo">5822</span>        } catch (InterruptedException ie) {<a name="line.5822"></a>
+<span class="sourceLineNo">5823</span>        } finally {<a name="line.5823"></a>
+<span class="sourceLineNo">5824</span>          region.lock.writeLock().unlock();<a name="line.5824"></a>
+<span class="sourceLineNo">5825</span>        }<a name="line.5825"></a>
+<span class="sourceLineNo">5826</span>      }<a name="line.5826"></a>
+<span class="sourceLineNo">5827</span>    });<a name="line.5827"></a>
+<span class="sourceLineNo">5828</span>    t.start();<a name="line.5828"></a>
+<span class="sourceLineNo">5829</span>    Get get = new Get(row);<a name="line.5829"></a>
+<span class="sourceLineNo">5830</span>    try {<a name="line.5830"></a>
+<span class="sourceLineNo">5831</span>      while (stopped.get()) {<a name="line.5831"></a>
+<span class="sourceLineNo">5832</span>        Thread.sleep(100);<a name="line.5832"></a>
+<span class="sourceLineNo">5833</span>      }<a name="line.5833"></a>
+<span class="sourceLineNo">5834</span>      region.get(get);<a name="line.5834"></a>
+<span class="sourceLineNo">5835</span>      fail("Should throw RegionTooBusyException");<a name="line.5835"></a>
+<span class="sourceLineNo">5836</span>    } catch (InterruptedException ie) {<a name="line.5836"></a>
+<span class="sourceLineNo">5837</span>      fail("test interrupted");<a name="line.5837"></a>
+<span class="sourceLineNo">5838</span>    } catch (RegionTooBusyException e) {<a name="line.5838"></a>
+<span class="sourceLineNo">5839</span>      // Good, expected<a name="line.5839"></a>
+<span class="sourceLineNo">5840</span>    } finally {<a name="line.5840"></a>
+<span class="sourceLineNo">5841</span>      stopped.set(true);<a name="line.5841"></a>
+<span class="sourceLineNo">5842</span>      try {<a name="line.5842"></a>
+<span class="sourceLineNo">5843</span>        t.join();<a name="line.5843"></a>
+<span class="sourceLineNo">5844</span>      } catch (Throwable e) {<a name="line.5844"></a>
+<span class="sourceLineNo">5845</span>      }<a name="line.5845"></a>
+<span class="sourceLineNo">5846</span><a name="line.5846"></a>
+<span class="sourceLineNo">5847</span>      HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.5847"></a>
+<span class="sourceLineNo">5848</span>      region = null;<a name="line.5848"></a>
+<span class="sourceLineNo">5849</span>      CONF.setLong("hbase.busy.wait.duration", defaultBusyWaitDuration);<a name="line.5849"></a>
+<span class="sourceLineNo">5850</span>    }<a name="line.5850"></a>
+<span class="sourceLineNo">5851</span>  }<a name="line.5851"></a>
+<span class="sourceLineNo">5852</span><a name="line.5852"></a>
+<span class="sourceLineNo">5853</span>  @Test<a name="line.5853"></a>
+<span class="sourceLineNo">5854</span>  public void testCellTTLs() throws IOException {<a name="line.5854"></a>
+<span class="sourceLineNo">5855</span>    IncrementingEnvironmentEdge edge = new IncrementingEnvironmentEdge();<a name="line.5855"></a>
+<span class="sourceLineNo">5856</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.5856"></a>
+<span class="sourceLineNo">5857</span><a name="line.5857"></a>
+<span class="sourceLineNo">5858</span>    final byte[] row = Bytes.toBytes("testRow");<a name="line.5858"></a>
+<span class="sourceLineNo">5859</span>    final byte[] q1 = Bytes.toBytes("q1");<a name="line.5859"></a>
+<span class="sourceLineNo">5860</span>    final byte[] q2 = Bytes.toBytes("q2");<a name="line.5860"></a>
+<span class="sourceLineNo">5861</span>    final byte[] q3 = Bytes.toBytes("q3");<a name="line.5861"></a>
+<span class="sourceLineNo">5862</span>    final byte[] q4 = Bytes.toBytes("q4");<a name="line.5862"></a>
+<span class="sourceLineNo">5863</span><a name="line.5863"></a>
+<span class="sourceLineNo">5864</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.5864"></a>
+<span class="sourceLineNo">5865</span>    HColumnDescriptor hcd = new HColumnDescriptor(fam1);<a name="line.5865"></a>
+<span class="sourceLineNo">5866</span>    hcd.setTimeToLive(10); // 10 seconds<a name="line.5866"></a>
+<span class="sourceLineNo">5867</span>    htd.addFamily(hcd);<a name="line.5867"></a>
+<span class="sourceLineNo">5868</span><a name="line.5868"></a>
+<span class="sourceLineNo">5869</span>    Configuration conf = new Configuration(TEST_UTIL.getConfiguration());<a name="line.5869"></a>
+<span class="sourceLineNo">5870</span>    conf.setInt(HFile.FORMAT_VERSION_KEY, HFile.MIN_FORMAT_VERSION_WITH_TAGS);<a name="line.5870"></a>
+<span class="sourceLineNo">5871</span><a name="line.5871"></a>
+<span class="sourceLineNo">5872</span>    region = HBaseTestingUtility.createRegionAndWAL(new HRegionInfo(htd.getTableName(),<a name="line.5872"></a>
+<span class="sourceLineNo">5873</span>            HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY),<a name="line.5873"></a>
+<span class="sourceLineNo">5874</span>        TEST_UTIL.getDataTestDir(), conf, htd);<a name="line.5874"></a>
+<span class="sourceLineNo">5875</span>    assertNotNull(region);<a name="line.5875"></a>
+<span class="sourceLineNo">5876</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.5876"></a>
+<span class="sourceLineNo">5877</span>    // Add a cell that will expire in 5 seconds via cell TTL<a name="line.5877"></a>
+<span class="sourceLineNo">5878</span>    region.put(new Put(row).add(new KeyValue(row, fam1, q1, now,<a name="line.5878"></a>
+<span class="sourceLineNo">5879</span>      HConstants.EMPTY_BYTE_ARRAY, new ArrayBackedTag[] {<a name="line.5879"></a>
+<span class="sourceLineNo">5880</span>        // TTL tags specify ts in milliseconds<a name="line.5880"></a>
+<span class="sourceLineNo">5881</span>        new ArrayBackedTag(TagType.TTL_TAG_TYPE, Bytes.toBytes(5000L)) })));<a name="line.5881"></a>
+<span class="sourceLineNo">5882</span>    // Add a cell that will expire after 10 seconds via family setting<a name="line.5882"></a>
+<span class="sourceLineNo">5883</span>    region.put(new Put(row).addColumn(fam1, q2, now, HConstants.EMPTY_BYTE_ARRAY));<a name="line.5883"></a>
+<span class="sourceLineNo">5884</span>    // Add a cell that will expire in 15 seconds via cell TTL<a name="line.5884"></a>
+<span class="sourceLineNo">5885</span>    region.put(new Put(row).add(new KeyValue(row, fam1, q3, now + 10000 - 1,<a name="line.5885"></a>
+<span class="sourceLineNo">5886</span>      HConstants.EMPTY_BYTE_ARRAY, new ArrayBackedTag[] {<a name="line.5886"></a>
+<span class="sourceLineNo">5887</span>        // TTL tags specify ts in milliseconds<a name="line.5887"></a>
+<span class="sourceLineNo">5888</span>        new ArrayBackedTag(TagType.TTL_TAG_TYPE, Bytes.toBytes(5000L)) })));<a name="line.5888"></a>
+<span class="sourceLineNo">5889</span>    // Add a cell that will expire in 20 seconds via family setting<a name="line.5889"></a>
+<span class="sourceLineNo">5890</span>    region.put(new Put(row).addColumn(fam1, q4, now + 10000 - 1, HConstants.EMPTY_BYTE_ARRAY));<a name="line.5890"></a>
 <span class="sourceLineNo">5891</span><a name="line.5891"></a>
-<span class="sourceLineNo">5892</span>    // Increment time to T+5 seconds<a name="line.5892"></a>
-<span class="sourceLineNo">5893</span>    edge.incrementTime(5000);<a name="line.5893"></a>
+<span class="sourceLineNo">5892</span>    // Flush so we are sure store scanning gets this right<a name="line.5892"></a>
+<span class="sourceLineNo">5893</span>    region.flush(true);<a name="line.5893"></a>
 <span class="sourceLineNo">5894</span><a name="line.5894"></a>
-<span class="sourceLineNo">5895</span>    r = region.get(new Get(row));<a name="line.5895"></a>
-<span class="sourceLineNo">5896</span>    assertNull(r.getValue(fam1, q1));<a name="line.5896"></a>
-<span class="sourceLineNo">5897</span>    assertNotNull(r.getValue(fam1, q2));<a name="line.5897"></a>
-<span class="sourceLineNo">5898</span>    assertNotNull(r.getValue(fam1, q3));<a name="line.5898"></a>
-<span class="sourceLineNo">5899</span>    assertNotNull(r.getValue(fam1, q4));<a name="line.5899"></a>
-<span class="sourceLineNo">5900</span><a name="line.5900"></a>
-<span class="sourceLineNo">5901</span>    // Increment time to T+10 seconds<a name="line.5901"></a>
-<span class="sourceLineNo">5902</span>    edge.incrementTime(5000);<a name="line.5902"></a>
-<span class="sourceLineNo">5903</span><a name="line.5903"></a>
-<span class="sourceLineNo">5904</span>    r = region.get(new Get(row));<a name="line.5904"></a>
-<span class="sourceLineNo">5905</span>    assertNull(r.getValue(fam1, q1));<a name="line.5905"></a>
-<span class="sourceLineNo">5906</span>    assertNull(r.getValue(fam1, q2));<a name="line.5906"></a>
-<span class="sourceLineNo">5907</span>    assertNotNull(r.getValue(fam1, q3));<a name="line.5907"></a>
-<span class="sourceLineNo">5908</span>    assertNotNull(r.getValue(fam1, q4));<a name="line.5908"></a>
-<span class="sourceLineNo">5909</span><a name="line.5909"></a>
-<span class="sourceLineNo">5910</span>    // Increment time to T+15 seconds<a name="line.5910"></a>
-<span class="sourceLineNo">5911</span>    edge.incrementTime(5000);<a name="line.5911"></a>
-<span class="sourceLineNo">5912</span><a name="line.5912"></a>
-<span class="sourceLineNo">5913</span>    r = region.get(new Get(row));<a name="line.5913"></a>
-<span class="sourceLineNo">5914</span>    assertNull(r.getValue(fam1, q1));<a name="line.5914"></a>
-<span class="sourceLineNo">5915</span>    assertNull(r.getValue(fam1, q2));<a name="line.5915"></a>
-<span class="sourceLineNo">5916</span>    assertNull(r.getValue(fam1, q3));<a name="line.5916"></a>
-<span class="sourceLineNo">5917</span>    assertNotNull(r.getValue(fam1, q4));<a name="line.5917"></a>
-<span class="sourceLineNo">5918</span><a name="line.5918"></a>
-<span class="sourceLineNo">5919</span>    // Increment time to T+20 seconds<a name="line.5919"></a>
-<span class="sourceLineNo">5920</span>    edge.incrementTime(10000);<a name="line.5920"></a>
-<span class="sourceLineNo">5921</span><a name="line.5921"></a>
-<span class="sourceLineNo">5922</span>    r = region.get(new Get(row));<a name="line.5922"></a>
-<span class="sourceLineNo">5923</span>    assertNull(r.getValue(fam1, q1));<a name="line.5923"></a>
-<span class="sourceLineNo">5924</span>    assertNull(r.getValue(fam1, q2));<a name="line.5924"></a>
-<span class="sourceLineNo">5925</span>    assertNull(r.getValue(fam1, q3));<a name="line.5925"></a>
-<span class="sourceLineNo">5926</span>    assertNull(r.getValue(fam1, q4));<a name="line.5926"></a>
-<span class="sourceLineNo">5927</span><a name="line.5927"></a>
-<span class="sourceLineNo">5928</span>    // Fun with disappearing increments<a name="line.5928"></a>
-<span class="sourceLineNo">5929</span><a name="line.5929"></a>
-<span class="sourceLineNo">5930</span>    // Start at 1<a name="line.5930"></a>
-<span class="sourceLineNo">5931</span>    region.put(new Put(row).addColumn(fam1, q1, Bytes.toBytes(1L)));<a name="line.5931"></a>
+<span class="sourceLineNo">5895</span>    // A query at time T+0 should return all cells<a name="line.5895"></a>
+<span class="sourceLineNo">5896</span>    Result r = region.get(new Get(row));<a name="line.5896"></a>
+<span class="sourceLineNo">5897</span>    assertNotNull(r.getValue(fam1, q1));<a name="line.5897"></a>
+<span class="sourceLineNo">5898</span>    assertNotNull(r.getValue(fam1, q2));<a name="line.5898"></a>
+<span class="sourceLineNo">5899</span>    assertNotNull(r.getValue(fam1, q3));<a name="line.5899"></a>
+<span class="sourceLineNo">5900</span>    assertNotNull(r.getValue(fam1, q4));<a name="line.5900"></a>
+<span class="sourceLineNo">5901</span><a name="line.5901"></a>
+<span class="sourceLineNo">5902</span>    // Increment time to T+5 seconds<a name="line.5902"></a>
+<span class="sourceLineNo">5903</span>    edge.incrementTime(5000);<a name="line.5903"></a>
+<span class="sourceLineNo">5904</span><a name="line.5904"></a>
+<span class="sourceLineNo">5905</span>    r = region.get(new Get(row));<a name="line.5905"></a>
+<span class="sourceLineNo">5906</span>    assertNull(r.getValue(fam1, q1));<a name="line.5906"></a>
+<span class="sourceLineNo">5907</span>    assertNotNull(r.getValue(fam1, q2));<a name="line.5907"></a>
+<span class="sourceLineNo">5908</span>    assertNotNull(r.getValue(fam1, q3));<a name="line.5908"></a>
+<span class="sourceLineNo">5909</span>    assertNotNull(r.getValue(fam1, q4));<a name="line.5909"></a>
+<span class="sourceLineNo">5910</span><a name="line.5910"></a>
+<span class="sourceLineNo">5911</span>    // Increment time to T+10 seconds<a name="line.5911"></a>
+<span class="sourceLineNo">5912</span>    edge.incrementTime(5000);<a name="line.5912"></a>
+<span class="sourceLineNo">5913</span><a name="line.5913"></a>
+<span class="sourceLineNo">5914</span>    r = region.get(new Get(row));<a name="line.5914"></a>
+<span class="sourceLineNo">5915</span>    assertNull(r.getValue(fam1, q1));<a name="line.5915"></a>
+<span class="sourceLineNo">5916</span>    assertNull(r.getValue(fam1, q2));<a name="line.5916"></a>
+<span class="sourceLineNo">5917</span>    assertNotNull(r.getValue(fam1, q3));<a name="line.5917"></a>
+<span class="sourceLineNo">5918</span>    assertNotNull(r.getValue(fam1, q4));<a name="line.5918"></a>
+<span class="sourceLineNo">5919</span><a name="line.5919"></a>
+<span class="sourceLineNo">5920</span>    // Increment time to T+15 seconds<a name="line.5920"></a>
+<span class="sourceLineNo">5921</span>    edge.incrementTime(5000);<a name="line.5921"></a>
+<span class="sourceLineNo">5922</span><a name="line.5922"></a>
+<span class="sourceLineNo">5923</span>    r = region.get(new Get(row));<a name="line.5923"></a>
+<span class="sourceLineNo">5924</span>    assertNull(r.getValue(fam1, q1));<a name="line.5924"></a>
+<span class="sourceLineNo">5925</span>    assertNull(r.getValue(fam1, q2));<a name="line.5925"></a>
+<span class="sourceLineNo">5926</span>    assertNull(r.getValue(fam1, q3));<a name="line.5926"></a>
+<span class="sourceLineNo">5927</span>    assertNotNull(r.getValue(fam1, q4));<a name="line.5927"></a>
+<span class="sourceLineNo">5928</span><a name="line.5928"></a>
+<span class="sourceLineNo">5929</span>    // Increment time to T+20 seconds<a name="line.5929"></a>
+<span class="sourceLineNo">5930</span>    edge.incrementTime(10000);<a name="line.5930"></a>
+<span class="sourceLineNo">5931</span><a name="line.5931"></a>
 <span class="sourceLineNo">5932</span>    r = region.get(new Get(row));<a name="line.5932"></a>
-<span class="sourceLineNo">5933</span>    byte[] val = r.getValue(fam1, q1);<a name="line.5933"></a>
-<span class="sourceLineNo">5934</span>    assertNotNull(val);<a name="line.5934"></a>
-<span class="sourceLineNo">5935</span>    assertEquals(1L, Bytes.toLong(val));<a name="line.5935"></a>
-<span class="sourceLineNo">5936</span><a name="line.5936"></a>
-<span class="sourceLineNo">5937</span>    // Increment with a TTL of 5 seconds<a name="line.5937"></a>
-<span class="sourceLineNo">5938</span>    Increment incr = new Increment(row).addColumn(fam1, q1, 1L);<a name="line.5938"></a>
-<span class="sourceLineNo">5939</span>    incr.setTTL(5000);<a name="line.5939"></a>
-<span class="sourceLineNo">5940</span>    region.increment(incr); // 2<a name="line.5940"></a>
-<span class="sourceLineNo">5941</span><a name="line.5941"></a>
-<span class="sourceLineNo">5942</span>    // New value should be 2<a name="line.5942"></a>
-<span class="sourceLineNo">5943</span>    r = region.get(new Get(row));<a name="line.5943"></a>
-<span class="sourceLineNo">5944</span>    val = r.getValue(fam1, q1);<a name="line.5944"></a>
-<span class="sourceLineNo">5945</span>    assertNotNull(val);<a name="line.5945"></a>
-<span class="sourceLineNo">5946</span>    assertEquals(2L, Bytes.toLong(val));<a name="line.5946"></a>
-<span class="sourceLineNo">5947</span><a name="line.5947"></a>
-<span class="sourceLineNo">5948</span>    // Increment time to T+25 seconds<a name="line.5948"></a>
-<span class="sourceLineNo">5949</span>    edge.incrementTime(5000);<a name="line.5949"></a>
-<span class="sourceLineNo">5950</span><a name="line.5950"></a>
-<span class="sourceLineNo">5951</span>    // Value should be back to 1<a name="line.5951"></a>
-<span class="sourceLineNo">5952</span>    r = region.get(new Get(row));<a name="line.5952"></a>
-<span class="sourceLineNo">5953</span>    val = r.getValue(fam1, q1);<a name="line.5953"></a>
-<span class="sourceLineNo">5954</span>    assertNotNull(val);<a name="line.5954"></a>
-<span class="sourceLineNo">5955</span>    assertEquals(1L, Bytes.toLong(val));<a name="line.5955"></a>
-<span class="sourceLineNo">5956</span><a name="line.5956"></a>
-<span class="sourceLineNo">5957</span>    // Increment time to T+30 seconds<a name="line.5957"></a>
-<span class="sourceLineNo">5958</span>    edge.incrementTime(5000);<a name="line.5958"></a>
-<span class="sourceLineNo">5959</span><a name="line.5959"></a>
-<span class="sourceLineNo">5960</span>    // Original value written at T+20 should be gone now via family TTL<a name="line.5960"></a>
-<span class="sourceLineNo">5961</span>    r = region.get(new Get(row));<a name="line.5961"></a>
-<span class="sourceLineNo">5962</span>    assertNull(r.getValue(fam1, q1));<a name="line.5962"></a>
-<span class="sourceLineNo">5963</span>  }<a name="line.5963"></a>
-<span class="sourceLineNo">5964</span><a name="line.5964"></a>
-<span class="sourceLineNo">5965</span>  @Test<a name="line.5965"></a>
-<span class="sourceLineNo">5966</span>  public void testIncrementTimestampsAreMonotonic() throws IOException {<a name="line.5966"></a>
-<span class="sourceLineNo">5967</span>    region = initHRegion(tableName, method, CONF, fam1);<a name="line.5967"></a>
-<span class="sourceLineNo">5968</span>    ManualEnvironmentEdge edge = new ManualEnvironmentEdge();<a name="line.5968"></a>
-<span class="sourceLineNo">5969</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.5969"></a>
-<span class="sourceLineNo">5970</span><a name="line.5970"></a>
-<span class="sourceLineNo">5971</span>    edge.setValue(10);<a name="line.5971"></a>
-<span class="sourceLineNo">5972</span>    Increment inc = new Increment(row);<a name="line.5972"></a>
-<span class="sourceLineNo">5973</span>    inc.setDurability(Durability.SKIP_WAL);<a name="line.5973"></a>
-<span class="sourceLineNo">5974</span>    inc.addColumn(fam1, qual1, 1L);<a name="line.5974"></a>
-<span class="sourceLineNo">5975</span>    region.increment(inc);<a name="line.5975"></a>
-<span class="sourceLineNo">5976</span><a name="line.5976"></a>
-<span class="sourceLineNo">5977</span>    Result result = region.get(new Get(row));<a name="line.5977"></a>
-<span class="sourceLineNo">5978</span>    Cell c = result.getColumnLatestCell(fam1, qual1);<a name="line.5978"></a>
-<span class="sourceLineNo">5979</span>    assertNotNull(c);<a name="line.5979"></a>
-<span class="sourceLineNo">5980</span>    assertEquals(10L, c.getTimestamp());<a name="line.5980"></a>
-<span class="sourceLineNo">5981</span><a name="line.5981"></a>
-<span class="sourceLineNo">5982</span>    edge.setValue(1); // clock goes back<a name="line.5982"></a>
-<span class="sourceLineNo">5983</span>    region.increment(inc);<a name="line.5983"></a>
-<span class="sourceLineNo">5984</span>    result = region.get(new Get(row));<a name="line.5984"></a>
-<span class="sourceLineNo">5985</span>    c = result.getColumnLatestCell(fam1, qual1);<a name="line.5985"></a>
-<span class="sourceLineNo">5986</span>    assertEquals(11L, c.getTimestamp());<a name="line.5986"></a>
-<span class="sourceLineNo">5987</span>    assertEquals(2L, Bytes.toLong(c.getValueArray(), c.getValueOffset(), c.getValueLength()));<a name="line.5987"></a>
-<span class="sourceLineNo">5988</span>  }<a name="line.5988"></a>
-<span class="sourceLineNo">5989</span><a name="line.5989"></a>
-<span class="sourceLineNo">5990</span>  @Test<a name="line.5990"></a>
-<span class="sourceLineNo">5991</span>  public void testAppendTimestampsAreMonotonic() throws IOException {<a name="line.5991"></a>
-<span class="sourceLineNo">5992</span>    region = initHRegion(tableName, method, CONF, fam1);<a name="line.5992"></a>
-<span class="sourceLineNo">5993</span>    ManualEnvironmentEdge edge = new ManualEnvironmentEdge();<a name="line.5993"></a>
-<span class="sourceLineNo">5994</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.5994"></a>
-<span class="sourceLineNo">5995</span><a name="line.5995"></a>
-<span class="sourceLineNo">5996</span>    edge.setValue(10);<a name="line.5996"></a>
-<span class="sourceLineNo">5997</span>    Append a = new Append(row);<a name="line.5997"></a>
-<span class="sourceLineNo">5998</span>    a.setDurability(Durability.SKIP_WAL);<a name="line.5998"></a>
-<span class="sourceLineNo">5999</span>    a.addColumn(fam1, qual1, qual1);<a name="line.5999"></a>
-<span class="sourceLineNo">6000</span>    region.append(a);<a name="line.6000"></a>
-<span class="sourceLineNo">6001</span><a name="line.6001"></a>
-<span class="sourceLineNo">6002</span>    Result result = region.get(new Get(row));<a name="line.6002"></a>
-<span class="sourceLineNo">6003</span>    Cell c = result.getColumnLatestCell(fam1, qual1);<a name="line.6003"></a>
-<span class="sourceLineNo">6004</span>    assertNotNull(c);<a name="line.6004"></a>
-<span class="sourceLineNo">6005</span>    assertEquals(10L, c.getTimestamp());<a name="line.6005"></a>
-<span class="sourceLineNo">6006</span><a name="line.6006"></a>
-<span class="sourceLineNo">6007</span>    edge.setValue(1); // clock goes back<a name="line.6007"></a>
-<span class="sourceLineNo">6008</span>    region.append(a);<a name="line.6008"></a>
-<span class="sourceLineNo">6009</span>    result = region.get(new Get(row));<a name="line.6009"></a>
-<span class="sourceLineNo">6010</span>    c = result.getColumnLatestCell(fam1, qual1);<a name="line.6010"></a>
-<span class="sourceLineNo">6011</span>    assertEquals(11L, c.getTimestamp());<a name="line.6011"></a>
-<span class="sourceLineNo">6012</span><a name="line.6012"></a>
-<span class="sourceLineNo">6013</span>    byte[] expected = new byte[qual1.length*2];<a name="line.6013"></a>
-<span class="sourceLineNo">6014</span>    System.arraycopy(qual1, 0, expected, 0, qual1.length);<a name="line.6014"></a>
-<span class="sourceLineNo">6015</span>    System.arraycopy(qual1, 0, expected, qual1.length, qual1.length);<a name="line.6015"></a>
+<span class="sourceLineNo">5933</span>    assertNull(r.getValue(fam1, q1));<a name="line.5933"></a>
+<span class="sourceLineNo">5934</span>    assertNull(r.getValue(fam1, q2));<a name="line.5934"></a>
+<span class="sourceLineNo">5935</span>    assertNull(r.getValue(fam1, q3));<a name="line.5935"></a>
+<span class="sourceLineNo">5936</span>    assertNull(r.getValue(fam1, q4));<a name="line.5936"></a>
+<span class="sourceLineNo">5937</span><a name="line.5937"></a>
+<span class="sourceLineNo">5938</span>    // Fun with disappearing increments<a name="line.5938"></a>
+<span class="sourceLineNo">5939</span><a name="line.5939"></a>
+<span class="sourceLineNo">5940</span>    // Start at 1<a name="line.5940"></a>
+<span class="sourceLineNo">5941</span>    region.put(new Put(row).addColumn(fam1, q1, Bytes.toBytes(1L)));<a name="line.5941"></a>
+<span class="sourceLineNo">5942</span>    r = region.get(new Get(row));<a name="line.5942"></a>
+<span class="sourceLineNo">5943</span>    byte[] val = r.getValue(fam1, q1);<a name="line.5943"></a>
+<span class="sourceLineNo">5944</span>    assertNotNull(val);<a name="line.5944"></a>
+<span class="sourceLineNo">5945</span>    assertEquals(1L, Bytes.toLong(val));<a name="line.5945"></a>
+<span class="sourceLineNo">5946</span><a name="line.5946"></a>
+<span class="sourceLineNo">5947</span>    // Increment with a TTL of 5 seconds<a name="line.5947"></a>
+<span class="sourceLineNo">5948</span>    Increment incr = new Increment(row).addColumn(fam1, q1, 1L);<a name="line.5948"></a>
+<span class="sourceLineNo">5949</span>    incr.setTTL(5000);<a name="line.5949"></a>
+<span class="sourceLineNo">5950</span>    region.increment(incr); // 2<a name="line.5950"></a>
+<span class="sourceLineNo">5951</span><a name="line.5951"></a>
+<span class="sourceLineNo">5952</span>    // New value should be 2<a name="line.5952"></a>
+<span class="sourceLineNo">5953</span>    r = region.get(new Get(row));<a name="line.5953"></a>
+<span class="sourceLineNo">5954</span>    val = r.getValue(fam1, q1);<a name="line.5954"></a>
+<span class="sourceLineNo">5955</span>    assertNotNull(val);<a name="line.5955"></a>
+<span class="sourceLineNo">5956</span>    assertEquals(2L, Bytes.toLong(val));<a name="line.5956"></a>
+<span class="sourceLineNo">5957</span><a name="line.5957"></a>
+<span class="sourceLineNo">5958</span>    // Increment time to T+25 seconds<a name="line.5958"></a>
+<span class="sourceLineNo">5959</span>    edge.incrementTime(5000);<a name="line.5959"></a>
+<span class="sourceLineNo">5960</span><a name="line.5960"></a>
+<span class="sourceLineNo">5961</span>    // Value should be back to 1<a name="line.5961"></a>
+<span class="sourceLineNo">5962</span>    r = region.get(new Get(row));<a name="line.5962"></a>
+<span class="sourceLineNo">5963</span>    val = r.getValue(fam1, q1);<a name="line.5963"></a>
+<span class="sourceLineNo">5964</span>    assertNotNull(val);<a name="line.5964"></a>
+<span class="sourceLineNo">5965</span>    assertEquals(1L, Bytes.toLong(val));<a name="line.5965"></a>
+<span class="sourceLineNo">5966</span><a name="line.5966"></a>
+<span class="sourceLineNo">5967</span>    // Increment time to T+30 seconds<a name="line.5967"></a>
+<span class="sourceLineNo">5968</span>    edge.incrementTime(5000);<a name="line.5968"></a>
+<span class="sourceLineNo">5969</span><a name="line.5969"></a>
+<span class="sourceLineNo">5970</span>    // Original value written at T+20 should be gone now via family TTL<a name="line.5970"></a>
+<span class="sourceLineNo">5971</span>    r = region.get(new Get(row));<a name="line.5971"></a>
+<span class="sourceLineNo">5972</span>    assertNull(r.getValue(fam1, q1));<a name="line.5972"></a>
+<span class="sourceLineNo">5973</span>  }<a name="line.5973"></a>
+<span class="sourceLineNo">5974</span><a name="line.5974"></a>
+<span class="sourceLineNo">5975</span>  @Test<a name="line.5975"></a>
+<span class="sourceLineNo">5976</span>  public void testIncrementTimestampsAreMonotonic() throws IOException {<a name="line.5976"></a>
+<span class="sourceLineNo">5977</span>    region = initHRegion(tableName, method, CONF, fam1);<a name="line.5977"></a>
+<span class="sourceLineNo">5978</span>    ManualEnvironmentEdge edge = new ManualEnvironmentEdge();<a name="line.5978"></a>
+<span class="sourceLineNo">5979</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.5979"></a>
+<span class="sourceLineNo">5980</span><a name="line.5980"></a>
+<span class="sourceLineNo">5981</span>    edge.setValue(10);<a name="line.5981"></a>
+<span class="sourceLineNo">5982</span>    Increment inc = new Increment(row);<a name="line.5982"></a>
+<span class="sourceLineNo">5983</span>    inc.setDurability(Durability.SKIP_WAL);<a name="line.5983"></a>
+<span class="sourceLineNo">5984</span>    inc.addColumn(fam1, qual1, 1L);<a name="line.5984"></a>
+<span class="sourceLineNo">5985</span>    region.increment(inc);<a name="line.5985"></a>
+<span class="sourceLineNo">5986</span><a name="line.5986"></a>
+<span class="sourceLineNo">5987</span>    Result result = region.get(new Get(row));<a name="line.5987"></a>
+<span class="sourceLineNo">5988</span>    Cell c = result.getColumnLatestCell(fam1, qual1);<a name="line.5988"></a>
+<span class="sourceLineNo">5989</span>    assertNotNull(c);<a name="line.5989"></a>
+<span class="sourceLineNo">5990</span>    assertEquals(10L, c.getTimestamp());<a name="line.5990"></a>
+<span class="sourceLineNo">5991</span><a name="line.5991"></a>
+<span class="sourceLineNo">5992</span>    edge.setValue(1); // clock goes back<a name="line.5992"></a>
+<span class="sourceLineNo">5993</span>    region.increment(inc);<a name="line.5993"></a>
+<span class="sourceLineNo">5994</span>    result = region.get(new Get(row));<a name="line.5994"></a>
+<span class="sourceLineNo">5995</span>    c = result.getColumnLatestCell(fam1, qual1);<a name="line.5995"></a>
+<span class="sourceLineNo">5996</span>    assertEquals(11L, c.getTimestamp());<a name="line.5996"></a>
+<span class="sourceLineNo">5997</span>    assertEquals(2L, Bytes.toLong(c.getValueArray(), c.getValueOffset(), c.getValueLength()));<a name="line.5997"></a>
+<span class="sourceLineNo">5998</span>  }<a name="line.5998"></a>
+<span class="sourceLineNo">5999</span><a name="line.5999"></a>
+<span class="sourceLineNo">6000</span>  @Test<a name="line.6000"></a>
+<span class="sourceLineNo">6001</span>  public void testAppendTimestampsAreMonotonic() throws IOException {<a name="line.6001"></a>
+<span class="sourceLineNo">6002</span>    region = initHRegion(tableName, method, CONF, fam1);<a name="line.6002"></a>
+<span class="sourceLineNo">6003</span>    ManualEnvironmentEdge edge = new ManualEnvironmentEdge();<a name="line.6003"></a>
+<span class="sourceLineNo">6004</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.6004"></a>
+<span class="sourceLineNo">6005</span><a name="line.6005"></a>
+<span class="sourceLineNo">6006</span>    edge.setValue(10);<a name="line.6006"></a>
+<span class="sourceLineNo">6007</span>    Append a = new Append(row);<a name="line.6007"></a>
+<span class="sourceLineNo">6008</span>    a.setDurability(Durability.SKIP_WAL);<a name="line.6008"></a>
+<span class="sourceLineNo">6009</span>    a.addColumn(fam1, qual1, qual1);<a name="line.6009"></a>
+<span class="sourceLineNo">6010</span>    region.append(a);<a name="line.6010"></a>
+<span class="sourceLineNo">6011</span><a name="line.6011"></a>
+<span class="sourceLineNo">6012</span>    Result result = region.get(new Get(row));<a name="line.6012"></a>
+<span class="sourceLineNo">6013</span>    Cell c = result.getColumnLatestCell(fam1, qual1);<a name="line.6013"></a>
+<span class="sourceLineNo">6014</span>    assertNotNull(c);<a name="line.6014"></a>
+<span class="sourceLineNo">6015</span>    assertEquals(10L, c.getTimestamp());<a name="line.6015"></a>
 <span class="sourceLineNo">6016</span><a name="line.6016"></a>
-<span class="sourceLineNo">6017</span>    assertTrue(Bytes.equals(c.getValueArray(), c.getValueOffset(), c.getValueLength(),<a name="line.6017"></a>
-<span class="sourceLineNo">6018</span>      expected, 0, expected.length));<a name="line.6018"></a>
-<span class="sourceLineNo">6019</span>  }<a name="line.6019"></a>
-<span class="sourceLineNo">6020</span><a name="line.6020"></a>
-<span class="sourceLineNo">6021</span>  @Test<a name="line.6021"></a>
-<span class="sourceLineNo">6022</span>  public void testCheckAndMutateTimestampsAreMonotonic() throws IOException {<a name="line.6022"></a>
-<span class="sourceLineNo">6023</span>    region = initHRegion(tableName, method, CONF, fam1);<a name="line.6023"></a>
-<span class="sourceLineNo">6024</span>    ManualEnvironmentEdge edge = new ManualEnvironmentEdge();<a name="line.6024"></a>
-<span class="sourceLineNo">6025</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.6025"></a>
+<span class="sourceLineNo">6017</span>    edge.setValue(1); // clock goes back<a name="line.6017"></a>
+<span class="sourceLineNo">6018</span>    region.append(a);<a name="line.6018"></a>
+<span class="sourceLineNo">6019</span>    result = region.get(new Get(row));<a name="line.6019"></a>
+<span class="sourceLineNo">6020</span>    c = result.getColumnLatestCell(fam1, qual1);<a name="line.6020"></a>
+<span class="sourceLineNo">6021</span>    assertEquals(11L, c.getTimestamp());<a name="line.6021"></a>
+<span class="sourceLineNo">6022</span><a name="line.6022"></a>
+<span class="sourceLineNo">6023</span>    byte[] expected = new byte[qual1.length*2];<a name="line.6023"></a>
+<span class="sourceLineNo">6024</span>    System.arraycopy(qual1, 0, expected, 0, qual1.length);<a name="line.6024"></a>
+<span class="sourceLineNo">6025</span>    System.arraycopy(qual1, 0, expected, qual1.length, qual1.length);<a name="line.6025"></a>
 <span class="sourceLineNo">6026</span><a name="line.6026"></a>
-<span class="sourceLineNo">6027</span>    edge.setValue(10);<a name="line.6027"></a>
-<span class="sourceLineNo">6028</span>    Put p = new Put(row);<a name="line.6028"></a>
-<span class="sourceLineNo">6029</span>    p.setDurability(Durability.SKIP_WAL);<a name="line.6029"></a>
-<span class="sourceLineNo">6030</span>    p.addColumn(fam1, qual1, qual1);<a name="line.6030"></a>
-<span class="sourceLineNo">6031</span>    region.put(p);<a name="line.6031"></a>
-<span class="sourceLineNo">6032</span><a name="line.6032"></a>
-<span class="sourceLineNo">6033</span>    Result result = region.get(new Get(row));<a name="line.6033"></a>
-<span class="sourceLineNo">6034</span>    Cell c = result.getColumnLatestCell(fam1, qual1);<a name="line.6034"></a>
-<span class="sourceLineNo">6035</span>    assertNotNull(c);<a name="line.6035"></a>
-<span class="sourceLineNo">6036</span>    assertEquals(10L, c.getTimestamp());<a name="line.6036"></a>
-<span class="sourceLineNo">6037</span><a name="line.6037"></a>
-<span class="sourceLineNo">6038</span>    edge.setValue(1); // clock goes back<a name="line.6038"></a>
-<span class="sourceLineNo">6039</span>    p = new Put(row);<a name="line.6039"></a>
-<span class="sourceLineNo">6040</span>    p.setDurability(Durability.SKIP_WAL);<a name="line.6040"></a>
-<span class="sourceLineNo">6041</span>    p.addColumn(fam1, qual1, qual2);<a name="line.6041"></a>
-<span class="sourceLineNo">6042</span>    region.checkAndMutate(row, fam1, qual1, CompareOperator.EQUAL, new BinaryComparator(qual1), p);<a name="line.6042"></a>
-<span class="sourceLineNo">6043</span>    result = region.get(new Get(row));<a name="line.6043"></a>
-<span class="sourceLineNo">6044</span>    c = result.getColumnLatestCell(fam1, qual1);<a name="line.6044"></a>
-<span class="sourceLineNo">6045</span>    assertEquals(10L, c.getTimestamp());<a name="line.6045"></a>
-<span class="sourceLineNo">6046</span><a name="line.6046"></a>
-<span class="sourceLineNo">6047</span>    assertTrue(Bytes.equals(c.getValueArray(), c.getValueOffset(), c.getValueLength(),<a name="line.6047"></a>
-<span class="sourceLineNo">6048</span>      qual2, 0, qual2.length));<a name="line.6048"></a>
-<span class="sourceLineNo">6049</span>  }<a name="line.6049"></a>
-<span class="sourceLineNo">6050</span><a name="line.6050"></a>
-<span class="sourceLineNo">6051</span>  @Test<a name="line.6051"></a>
-<span class="sourceLineNo">6052</span>  public void testBatchMutateWithWrongRegionException() throws Exception {<a name="line.6052"></a>
-<span class="sourceLineNo">6053</span>    final byte[] a = Bytes.toBytes("a");<a name="line.6053"></a>
-<span class="sourceLineNo">6054</span>    final byte[] b = Bytes.toBytes("b");<a name="line.6054"></a>
-<span class="sourceLineNo">6055</span>    final byte[] c = Bytes.toBytes("c"); // exclusive<a name="line.6055"></a>
+<span class="sourceLineNo">6027</span>    assertTrue(Bytes.equals(c.getValueArray(), c.getValueOffset(), c.getValueLength(),<a name="line.6027"></a>
+<span class="sourceLineNo">6028</span>      expected, 0, expected.length));<a name="line.6028"></a>
+<span class="sourceLineNo">6029</span>  }<a name="line.6029"></a>
+<span class="sourceLineNo">6030</span><a name="line.6030"></a>
+<span class="sourceLineNo">6031</span>  @Test<a name="line.6031"></a>
+<span class="sourceLineNo">6032</span>  public void testCheckAndMutateTimestampsAreMonotonic() throws IOException {<a name="line.6032"></a>
+<span class="sourceLineNo">6033</span>    region = initHRegion(tableName, method, CONF, fam1);<a name="line.6033"></a>
+<span class="sourceLineNo">6034</span>    ManualEnvironmentEdge edge = new ManualEnvironmentEdge();<a name="line.6034"></a>
+<span class="sourceLineNo">6035</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.6035"></a>
+<span class="sourceLineNo">6036</span><a name="line.6036"></a>
+<span class="sourceLineNo">6037</span>    edge.setValue(10);<a name="line.6037"></a>
+<span class="sourceLineNo">6038</span>    Put p = new Put(row);<a name="line.6038"></a>
+<span class="sourceLineNo">6039</span>    p.setDurability(Durability.SKIP_WAL);<a name="line.6039"></a>
+<span class="sourceLineNo">6040</span>    p.addColumn(fam1, qual1, qual1);<a name="line.6040"></a>
+<span class="sourceLineNo">6041</span>    region.put(p);<a name="line.6041"></a>
+<span class="sourceLineNo">6042</span><a name="line.6042"></a>
+<span class="sourceLineNo">6043</span>    Result result = region.get(new Get(row));<a name="line.6043"></a>
+<span class="sourceLineNo">6044</span>    Cell c = result.getColumnLatestCell(fam1, qual1);<a name="line.6044"></a>
+<span class="sourceLineNo">6045</span>    assertNotNull(c);<a name="line.6045"></a>
+<span class="sourceLineNo">6046</span>    assertEquals(10L, c.getTimestamp());<a name="line.6046"></a>
+<span class="sourceLineNo">6047</span><a name="line.6047"></a>
+<span class="sourceLineNo">6048</span>    edge.setValue(1); // clock goes back<a name="line.6048"></a>
+<span class="sourceLineNo">6049</span>    p = new Put(row);<a name="line.6049"></a>
+<span class="sourceLineNo">6050</span>    p.setDurability(Durability.SKIP_WAL);<a name="line.6050"></a>
+<span class="sourceLineNo">6051</span>    p.addColumn(fam1, qual1, qual2);<a name="line.6051"></a>
+<span class="sourceLineNo">6052</span>    region.checkAndMutate(row, fam1, qual1, CompareOperator.EQUAL, new BinaryComparator(qual1), p);<a name="line.6052"></a>
+<span class="sourceLineNo">6053</span>    result = region.get(new Get(row));<a name="line.6053"></a>
+<span class="sourceLineNo">6054</span>    c = result.getColumnLatestCell(fam1, qual1);<a name="line.6054"></a>
+<span class="sourceLineNo">6055</span>    assertEquals(10L, c.getTimestamp());<a name="line.6055"></a>
 <span class="sourceLineNo">6056</span><a name="line.6056"></a>
-<span class="sourceLineNo">6057</span>    int prevLockTimeout = CONF.getInt("hbase.rowlock.wait.duration", 30000);<a name="line.6057"></a>
-<span class="sourceLineNo">6058</span>    CONF.setInt("hbase.rowlock.wait.duration", 1000);<a name="line.6058"></a>
-<span class="sourceLineNo">6059</span>    region = initHRegion(tableName, a, c, method, CONF, false, fam1);<a name="line.6059"></a>
+<span class="sourceLineNo">6057</span>    assertTrue(Bytes.equals(c.getValueArray(), c.getValueOffset(), c.getValueLength(),<a name="line.6057"></a>
+<span class="sourceLineNo">6058</span>      qual2, 0, qual2.length));<a name="line.6058"></a>
+<span class="sourceLineNo">6059</span>  }<a name="line.6059"></a>
 <span class="sourceLineNo">6060</span><a name="line.6060"></a>
-<span class="sourceLineNo">6061</span>    Mutation[] mutations = new Mutation[] {<a name="line.6061"></a>
-<span class="sourceLineNo">6062</span>        new Put(a)<a name="line.6062"></a>
-<span class="sourceLineNo">6063</span>            .add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6063"></a>
-<span class="sourceLineNo">6064</span>              .setRow(a)<a name="line.6064"></a>
-<span class="sourceLineNo">6065</span>              .setFamily(fam1)<a name="line.6065"></a>
-<span class="sourceLineNo">6066</span>              .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6066"></a>
-<span class="sourceLineNo">6067</span>              .setType(Cell.Type.Put)<a name="line.6067"></a>
-<span class="sourceLineNo">6068</span>              .build()),<a name="line.6068"></a>
-<span class="sourceLineNo">6069</span>        // this is outside the region boundary<a name="line.6069"></a>
-<span class="sourceLineNo">6070</span>        new Put(c).add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6070"></a>
-<span class="sourceLineNo">6071</span>              .setRow(c)<a name="line.6071"></a>
-<span class="sourceLineNo">6072</span>              .setFamily(fam1)<a name="line.6072"></a>
-<span class="sourceLineNo">6073</span>              .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6073"></a>
-<span class="sourceLineNo">6074</span>              .setType(Type.Put)<a name="line.6074"></a>
-<span class="sourceLineNo">6075</span>              .build()),<a name="line.6075"></a>
-<span class="sourceLineNo">6076</span>        new Put(b).add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6076"></a>
-<span class="sourceLineNo">6077</span>              .setRow(b)<a name="line.6077"></a>
-<span class="sourceLineNo">6078</span>              .setFamily(fam1)<a name="line.6078"></a>
-<span class="sourceLineNo">6079</span>              .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6079"></a>
-<span class="sourceLineNo">6080</span>              .setType(Cell.Type.Put)<a name="line.6080"></a>
-<span class="sourceLineNo">6081</span>              .build())<a name="line.6081"></a>
-<span class="sourceLineNo">6082</span>    };<a name="line.6082"></a>
-<span class="sourceLineNo">6083</span><a name="line.6083"></a>
-<span class="sourceLineNo">6084</span>    OperationStatus[] status = region.batchMutate(mutations);<a name="line.6084"></a>
-<span class="sourceLineNo">6085</span>    assertEquals(OperationStatusCode.SUCCESS, status[0].getOperationStatusCode());<a name="line.6085"></a>
-<span class="sourceLineNo">6086</span>    assertEquals(OperationStatusCode.SANITY_CHECK_FAILURE, status[1].getOperationStatusCode());<a name="line.6086"></a>
-<span class="sourceLineNo">6087</span>    assertEquals(OperationStatusCode.SUCCESS, status[2].getOperationStatusCode());<a name="line.6087"></a>
-<span class="sourceLineNo">6088</span><a name="line.6088"></a>
-<span class="sourceLineNo">6089</span><a name="line.6089"></a>
-<span class="sourceLineNo">6090</span>    // test with a row lock held for a long time<a name="line.6090"></a>
-<span class="sourceLineNo">6091</span>    final CountDownLatch obtainedRowLock = new CountDownLatch(1);<a name="line.6091"></a>
-<span class="sourceLineNo">6092</span>    ExecutorService exec = Executors.newFixedThreadPool(2);<a name="line.6092"></a>
-<span class="sourceLineNo">6093</span>    Future&lt;Void&gt; f1 = exec.submit(new Callable&lt;Void&gt;() {<a name="line.6093"></a>
-<span class="sourceLineNo">6094</span>      @Override<a name="line.6094"></a>
-<span class="sourceLineNo">6095</span>      public Void call() throws Exception {<a name="line.6095"></a>
-<span class="sourceLineNo">6096</span>        LOG.info("Acquiring row lock");<a name="line.6096"></a>
-<span class="sourceLineNo">6097</span>        RowLock rl = region.getRowLock(b);<a name="line.6097"></a>
-<span class="sourceLineNo">6098</span>        obtainedRowLock.countDown();<a name="line.6098"></a>
-<span class="sourceLineNo">6099</span>        LOG.info("Waiting for 5 seconds before releasing lock");<a name="line.6099"></a>
-<span class="sourceLineNo">6100</span>        Threads.sleep(5000);<a name="line.6100"></a>
-<span class="sourceLineNo">6101</span>        LOG.info("Releasing row lock");<a name="line.6101"></a>
-<span class="sourceLineNo">6102</span>        rl.release();<a name="line.6102"></a>
-<span class="sourceLineNo">6103</span>        return null;<a name="line.6103"></a>
-<span class="sourceLineNo">6104</span>      }<a name="line.6104"></a>
-<span class="sourceLineNo">6105</span>    });<a name="line.6105"></a>
-<span class="sourceLineNo">6106</span>    obtainedRowLock.await(30, TimeUnit.SECONDS);<a name="line.6106"></a>
-<span class="sourceLineNo">6107</span><a name="line.6107"></a>
-<span class="sourceLineNo">6108</span>    Future&lt;Void&gt; f2 = exec.submit(new Callable&lt;Void&gt;() {<a name="line.6108"></a>
-<span class="sourceLineNo">6109</span>      @Override<a name="line.6109"></a>
-<span class="sourceLineNo">6110</span>      public Void call() throws Exception {<a name="line.6110"></a>
-<span class="sourceLineNo">6111</span>        Mutation[] mutations = new Mutation[] {<a name="line.6111"></a>
-<span class="sourceLineNo">6112</span>            new Put(a).add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6112"></a>
-<span class="sourceLineNo">6113</span>                .setRow(a)<a name="line.6113"></a>
-<span class="sourceLineNo">6114</span>                .setFamily(fam1)<a name="line.6114"></a>
-<span class="sourceLineNo">6115</span>                .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6115"></a>
-<span class="sourceLineNo">6116</span>                .setType(Cell.Type.Put)<a name="line.6116"></a>
-<span class="sourceLineNo">6117</span>                .build()),<a name="line.6117"></a>
-<span class="sourceLineNo">6118</span>            new Put(b).add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6118"></a>
-<span class="sourceLineNo">6119</span>                .setRow(b)<a name="line.6119"></a>
-<span class="sourceLineNo">6120</span>                .setFamily(fam1)<a name="line.6120"></a>
-<span class="sourceLineNo">6121</span>                .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6121"></a>
-<span class="sourceLineNo">6122</span>                .setType(Cell.Type.Put)<a name="line.6122"></a>
-<span class="sourceLineNo">6123</span>                .build()),<a name="line.6123"></a>
-<span class="sourceLineNo">6124</span>        };<a name="line.6124"></a>
-<span class="sourceLineNo">6125</span><a name="line.6125"></a>
-<span class="sourceLineNo">6126</span>        // this will wait for the row lock, and it will eventually succeed<a name="line.6126"></a>
-<span class="sourceLineNo">6127</span>        OperationStatus[] status = region.batchMutate(mutations);<a name="line.6127"></a>
-<span class="sourceLineNo">6128</span>        assertEquals(OperationStatusCode.SUCCESS, status[0].getOperationStatusCode());<a name="line.6128"></a>
-<span class="sourceLineNo">6129</span>        assertEquals(OperationStatusCode.SUCCESS, status[1].getOperationStatusCode());<a name="line.6129"></a>
-<span class="sourceLineNo">6130</span>        return null;<a name="line.6130"></a>
-<span class="sourceLineNo">6131</span>      }<a name="line.6131"></a>
-<span class="sourceLineNo">6132</span>    });<a name="line.6132"></a>
-<span class="sourceLineNo">6133</span><a name="line.6133"></a>
-<span class="sourceLineNo">6134</span>    f1.get();<a name="line.6134"></a>
-<span class="sourceLineNo">6135</span>    f2.get();<a name="line.6135"></a>
-<span class="sourceLineNo">6136</span><a name="line.6136"></a>
-<span class="sourceLineNo">6137</span>    CONF.setInt("hbase.rowlock.wait.duration", prevLockTimeout);<a name="line.6137"></a>
-<span class="sourceLineNo">6138</span>  }<a name="line.6138"></a>
-<span class="sourceLineNo">6139</span><a name="line.6139"></a>
-<span class="sourceLineNo">6140</span>  @Test<a name="line.6140"></a>
-<span class="sourceLineNo">6141</span>  public void testCheckAndRowMutateTimestampsAreMonotonic() throws IOException {<a name="line.6141"></a>
-<span class="sourceLineNo">6142</span>    region = initHRegion(tableName, method, CONF, fam1);<a name="line.6142"></a>
-<span class="sourceLineNo">6143</span>    ManualEnvironmentEdge edge = new ManualEnvironmentEdge();<a name="line.6143"></a>
-<span class="sourceLineNo">6144</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.6144"></a>
-<span class="sourceLineNo">6145</span><a name="line.6145"></a>
-<span class="sourceLineNo">6146</span>    edge.setValue(10);<a name="line.6146"></a>
-<span class="sourceLineNo">6147</span>    Put p = new Put(row);<a name="line.6147"></a>
-<span class="sourceLineNo">6148</span>    p.setDurability(Durability.SKIP_WAL);<a name="line.6148"></a>
-<span class="sourceLineNo">6149</span>    p.addColumn(fam1, qual1, qual1);<a name="line.6149"></a>
-<span class="sourceLineNo">6150</span>    region.put(p);<a name="line.6150"></a>
-<span class="sourceLineNo">6151</span><a name="line.6151"></a>
-<span class="sourceLineNo">6152</span>    Result result = region.get(new Get(row));<a name="line.6152"></a>
-<span class="sourceLineNo">6153</span>    Cell c = result.getColumnLatestCell(fam1, qual1);<a name="line.6153"></a>
-<span class="sourceLineNo">6154</span>    assertNotNull(c);<a name="line.6154"></a>
-<span class="sourceLineNo">6155</span>    assertEquals(10L, c.getTimestamp());<a name="line.6155"></a>
-<span class="sourceLineNo">6156</span><a name="line.6156"></a>
-<span class="sourceLineNo">6157</span>    edge.setValue(1); // clock goes back<a name="line.6157"></a>
-<span class="sourceLineNo">6158</span>    p = new Put(row);<a name="line.6158"></a>
-<span class="sourceLineNo">6159</span>    p.setDurability(Durability.SKIP_WAL);<a name="line.6159"></a>
-<span class="sourceLineNo">6160</span>    p.addColumn(fam1, qual1, qual2);<a name="line.6160"></a>
-<span class="sourceLineNo">6161</span>    RowMutations rm = new RowMutations(row);<a name="line.6161"></a>
-<span class="sourceLineNo">6162</span>    rm.add(p);<a name="line.6162"></a>
-<span class="sourceLineNo">6163</span>    assertTrue(region.checkAndRowMutate(row, fam1, qual1, CompareOperator.EQUAL,<a name="line.6163"></a>
-<span class="sourceLineNo">6164</span>        new BinaryComparator(qual1), rm));<a name="line.6164"></a>
-<span class="sourceLineNo">6165</span>    result = region.get(new Get(row));<a name="line.6165"></a>
-<span class="sourceLineNo">6166</span>    c = result.getColumnLatestCell(fam1, qual1);<a name="line.6166"></a>
-<span class="sourceLineNo">6167</span>    assertEquals(10L, c.getTimestamp());<a name="line.6167"></a>
-<span class="sourceLineNo">6168</span>    LOG.info("c value " +<a name="line.6168"></a>
-<span class="sourceLineNo">6169</span>      Bytes.toStringBinary(c.getValueArray(), c.getValueOffset(), c.getValueLength()));<a name="line.6169"></a>
-<span class="sourceLineNo">6170</span><a name="line.6170"></a>
-<span class="sourceLineNo">6171</span>    assertTrue(Bytes.equals(c.getValueArray(), c.getValueOffset(), c.getValueLength(),<a name="line.6171"></a>
-<span class="sourceLineNo">6172</span>      qual2, 0, qual2.length));<a name="line.6172"></a>
-<span class="sourceLineNo">6173</span>  }<a name="line.6173"></a>
-<span class="sourceLineNo">6174</span><a name="line.6174"></a>
-<span class="sourceLineNo">6175</span>  HRegion initHRegion(TableName tableName, String callingMethod,<a name="line.6175"></a>
-<span class="sourceLineNo">6176</span>      byte[]... families) throws IOException {<a name="line.6176"></a>
-<span class="sourceLineNo">6177</span>    return initHRegion(tableName, callingMethod, HBaseConfiguration.create(),<a name="line.6177"></a>
-<span class="sourceLineNo">6178</span>        families);<a name="line.6178"></a>
-<span class="sourceLineNo">6179</span>  }<a name="line.6179"></a>
+<span class="sourceLineNo">6061</span>  @Test<a name="line.6061"></a>
+<span class="sourceLineNo">6062</span>  public void testBatchMutateWithWrongRegionException() throws Exception {<a name="line.6062"></a>
+<span class="sourceLineNo">6063</span>    final byte[] a = Bytes.toBytes("a");<a name="line.6063"></a>
+<span class="sourceLineNo">6064</span>    final byte[] b = Bytes.toBytes("b");<a name="line.6064"></a>
+<span class="sourceLineNo">6065</span>    final byte[] c = Bytes.toBytes("c"); // exclusive<a name="line.6065"></a>
+<span class="sourceLineNo">6066</span><a name="line.6066"></a>
+<span class="sourceLineNo">6067</span>    int prevLockTimeout = CONF.getInt("hbase.rowlock.wait.duration", 30000);<a name="line.6067"></a>
+<span class="sourceLineNo">6068</span>    CONF.setInt("hbase.rowlock.wait.duration", 1000);<a name="line.6068"></a>
+<span class="sourceLineNo">6069</span>    region = initHRegion(tableName, a, c, method, CONF, false, fam1);<a name="line.6069"></a>
+<span class="sourceLineNo">6070</span><a name="line.6070"></a>
+<span class="sourceLineNo">6071</span>    Mutation[] mutations = new Mutation[] {<a name="line.6071"></a>
+<span class="sourceLineNo">6072</span>        new Put(a)<a name="line.6072"></a>
+<span class="sourceLineNo">6073</span>            .add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6073"></a>
+<span class="sourceLineNo">6074</span>              .setRow(a)<a name="line.6074"></a>
+<span class="sourceLineNo">6075</span>              .setFamily(fam1)<a name="line.6075"></a>
+<span class="sourceLineNo">6076</span>              .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6076"></a>
+<span class="sourceLineNo">6077</span>              .setType(Cell.Type.Put)<a name="line.6077"></a>
+<span class="sourceLineNo">6078</span>              .build()),<a name="line.6078"></a>
+<span class="sourceLineNo">6079</span>        // this is outside the region boundary<a name="line.6079"></a>
+<span class="sourceLineNo">6080</span>        new Put(c).add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6080"></a>
+<span class="sourceLineNo">6081</span>              .setRow(c)<a name="line.6081"></a>
+<span class="sourceLineNo">6082</span>              .setFamily(fam1)<a name="line.6082"></a>
+<span class="sourceLineNo">6083</span>              .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6083"></a>
+<span class="sourceLineNo">6084</span>              .setType(Type.Put)<a name="line.6084"></a>
+<span class="sourceLineNo">6085</span>              .build()),<a name="line.6085"></a>
+<span class="sourceLineNo">6086</span>        new Put(b).add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6086"></a>
+<span class="sourceLineNo">6087</span>              .setRow(b)<a name="line.6087"></a>
+<span class="sourceLineNo">6088</span>              .setFamily(fam1)<a name="line.6088"></a>
+<span class="sourceLineNo">6089</span>              .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6089"></a>
+<span class="sourceLineNo">6090</span>              .setType(Cell.Type.Put)<a name="line.6090"></a>
+<span class="sourceLineNo">6091</span>              .build())<a name="line.6091"></a>
+<span class="sourceLineNo">6092</span>    };<a name="line.6092"></a>
+<span class="sourceLineNo">6093</span><a name="line.6093"></a>
+<span class="sourceLineNo">6094</span>    OperationStatus[] status = region.batchMutate(mutations);<a name="line.6094"></a>
+<span class="sourceLineNo">6095</span>    assertEquals(OperationStatusCode.SUCCESS, status[0].getOperationStatusCode());<a name="line.6095"></a>
+<span class="sourceLineNo">6096</span>    assertEquals(OperationStatusCode.SANITY_CHECK_FAILURE, status[1].getOperationStatusCode());<a name="line.6096"></a>
+<span class="sourceLineNo">6097</span>    assertEquals(OperationStatusCode.SUCCESS, status[2].getOperationStatusCode());<a name="line.6097"></a>
+<span class="sourceLineNo">6098</span><a name="line.6098"></a>
+<span class="sourceLineNo">6099</span><a name="line.6099"></a>
+<span class="sourceLineNo">6100</span>    // test with a row lock held for a long time<a name="line.6100"></a>
+<span class="sourceLineNo">6101</span>    final CountDownLatch obtainedRowLock = new CountDownLatch(1);<a name="line.6101"></a>
+<span class="sourceLineNo">6102</span>    ExecutorService exec = Executors.newFixedThreadPool(2);<a name="line.6102"></a>
+<span class="sourceLineNo">6103</span>    Future&lt;Void&gt; f1 = exec.submit(new Callable&lt;Void&gt;() {<a name="line.6103"></a>
+<span class="sourceLineNo">6104</span>      @Override<a name="line.6104"></a>
+<span class="sourceLineNo">6105</span>      public Void call() throws Exception {<a name="line.6105"></a>
+<span class="sourceLineNo">6106</span>        LOG.info("Acquiring row lock");<a name="line.6106"></a>
+<span class="sourceLineNo">6107</span>        RowLock rl = region.getRowLock(b);<a name="line.6107"></a>
+<span class="sourceLineNo">6108</span>        obtainedRowLock.countDown();<a name="line.6108"></a>
+<span class="sourceLineNo">6109</span>        LOG.info("Waiting for 5 seconds before releasing lock");<a name="line.6109"></a>
+<span class="sourceLineNo">6110</span>        Threads.sleep(5000);<a name="line.6110"></a>
+<span class="sourceLineNo">6111</span>        LOG.info("Releasing row lock");<a name="line.6111"></a>
+<span class="sourceLineNo">6112</span>        rl.release();<a name="line.6112"></a>
+<span class="sourceLineNo">6113</span>        return null;<a name="line.6113"></a>
+<span class="sourceLineNo">6114</span>      }<a name="line.6114"></a>
+<span class="sourceLineNo">6115</span>    });<a name="line.6115"></a>
+<span class="sourceLineNo">6116</span>    obtainedRowLock.await(30, TimeUnit.SECONDS);<a name="line.6116"></a>
+<span class="sourceLineNo">6117</span><a name="line.6117"></a>
+<span class="sourceLineNo">6118</span>    Future&lt;Void&gt; f2 = exec.submit(new Callable&lt;Void&gt;() {<a name="line.6118"></a>
+<span class="sourceLineNo">6119</span>      @Override<a name="line.6119"></a>
+<span class="sourceLineNo">6120</span>      public Void call() throws Exception {<a name="line.6120"></a>
+<span class="sourceLineNo">6121</span>        Mutation[] mutations = new Mutation[] {<a name="line.6121"></a>
+<span class="sourceLineNo">6122</span>            new Put(a).add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6122"></a>
+<span class="sourceLineNo">6123</span>                .setRow(a)<a name="line.6123"></a>
+<span class="sourceLineNo">6124</span>                .setFamily(fam1)<a name="line.6124"></a>
+<span class="sourceLineNo">6125</span>                .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6125"></a>
+<span class="sourceLineNo">6126</span>                .setType(Cell.Type.Put)<a name="line.6126"></a>
+<span class="sourceLineNo">6127</span>                .build()),<a name="line.6127"></a>
+<span class="sourceLineNo">6128</span>            new Put(b).add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6128"></a>
+<span class="sourceLineNo">6129</span>                .setRow(b)<a name="line.6129"></a>
+<span class="sourceLineNo">6130</span>                .setFamily(fam1)<a name="line.6130"></a>
+<span class="sourceLineNo">6131</span>                .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6131"></a>
+<span class="sourceLineNo">6132</span>                .setType(Cell.Type.Put)<a name="line.6132"></a>
+<span class="sourceLineNo">6133</span>                .build()),<a name="line.6133"></a>
+<span class="sourceLineNo">6134</span>        };<a name="line.6134"></a>
+<span class="sourceLineNo">6135</span><a name="line.6135"></a>
+<span class="sourceLineNo">6136</span>        // this will wait for the row lock, and it will eventually succeed<a name="line.6136"></a>
+<span class="sourceLineNo">6137</span>        OperationStatus[] status = region.batchMutate(mutations);<a name="line.6137"></a>
+<span class="sourceLineNo">6138</span>        assertEquals(OperationStatusCode.SUCCESS, status[0].getOperationStatusCode());<a name="line.6138"></a>
+<span class="sourceLineNo">6139</span>        assertEquals(OperationStatusCode.SUCCESS, status[1].getOperationStatusCode());<a name="line.6139"></a>
+<span class="sourceLineNo">6140</span>        return null;<a name="line.6140"></a>
+<span class="sourceLineNo">6141</span>      }<a name="line.6141"></a>
+<span class="sourceLineNo">6142</span>    });<a name="line.6142"></a>
+<span class="sourceLineNo">6143</span><a name="line.6143"></a>
+<span class="sourceLineNo">6144</span>    f1.get();<a name="line.6144"></a>
+<span class="sourceLineNo">6145</span>    f2.get();<a name="line.6145"></a>
+<span class="sourceLineNo">6146</span><a name="line.6146"></a>
+<span class="sourceLineNo">6147</span>    CONF.setInt("hbase.rowlock.wait.duration", prevLockTimeout);<a name="line.6147"></a>
+<span class="sourceLineNo">6148</span>  }<a name="line.6148"></a>
+<span class="sourceLineNo">6149</span><a name="line.6149"></a>
+<span class="sourceLineNo">6150</span>  @Test<a name="line.6150"></a>
+<span class="sourceLineNo">6151</span>  public void testCheckAndRowMutateTimestampsAreMonotonic() throws IOException {<a name="line.6151"></a>
+<span class="sourceLineNo">6152</span>    region = initHRegion(tableName, method, CONF, fam1);<a name="line.6152"></a>
+<span class="sourceLineNo">6153</span>    ManualEnvironmentEdge edge = new ManualEnvironmentEdge();<a name="line.6153"></a>
+<span class="sourceLineNo">6154</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.6154"></a>
+<span class="sourceLineNo">6155</span><a name="line.6155"></a>
+<span class="sourceLineNo">6156</span>    edge.setValue(10);<a name="line.6156"></a>
+<span class="sourceLineNo">6157</span>    Put p = new Put(row);<a name="line.6157"></a>
+<span class="sourceLineNo">6158</span>    p.setDurability(Durability.SKIP_WAL);<a name="line.6158"></a>
+<span class="sourceLineNo">6159</span>    p.addColumn(fam1, qual1, qual1);<a name="line.6159"></a>
+<span class="sourceLineNo">6160</span>    region.put(p);<a name="line.6160"></a>
+<span class="sourceLineNo">6161</span><a name="line.6161"></a>
+<span class="sourceLineNo">6162</span>    Result result = region.get(new Get(row));<a name="line.6162"></a>
+<span class="sourceLineNo">6163</span>    Cell c = result.getColumnLatestCell(fam1, qual1);<a name="line.6163"></a>
+<span class="sourceLineNo">6164</span>    assertNotNull(c);<a name="line.6164"></a>
+<span class="sourceLineNo">6165</span>    assertEquals(10L, c.getTimestamp());<a name="line.6165"></a>
+<span class="sourceLineNo">6166</span><a name="line.6166"></a>
+<span class="sourceLineNo">6167</span>    edge.setValue(1); // clock goes back<a name="line.6167"></a>
+<span class="sourceLineNo">6168</span>    p = new Put(row);<a name="line.6168"></a>
+<span class="sourceLineNo">6169</span>    p.setDurability(Durability.SKIP_WAL);<a name="line.6169"></a>
+<span class="sourceLineNo">6170</span>    p.addColumn(fam1, qual1, qual2);<a name="line.6170"></a>
+<span class="sourceLineNo">6171</span>    RowMutations rm = new RowMutations(row);<a name="line.6171"></a>
+<span class="sourceLineNo">6172</span>    rm.add(p);<a name="line.6172"></a>
+<span class="sourceLineNo">6173</span>    assertTrue(region.checkAndRowMutate(row, fam1, qual1, CompareOperator.EQUAL,<a name="line.6173"></a>
+<span class="sourceLineNo">6174</span>        new BinaryComparator(qual1), rm));<a name="line.6174"></a>
+<span class="sourceLineNo">6175</span>    result = region.get(new Get(row));<a name="line.6175"></a>
+<span class="sourceLineNo">6176</span>    c = result.getColumnLatestCell(fam1, qual1);<a name="line.6176"></a>
+<span class="sourceLineNo">6177</span>    assertEquals(10L, c.getTimestamp());<a name="line.6177"></a>
+<span class="sourceLineNo">6178</span>    LOG.info("c value " +<a name="line.6178"></a>
+<span class="sourceLineNo">6179</span>      Bytes.toStringBinary(c.getValueArray(), c.getValueOffset(), c.getValueLength()));<a name="line.6179"></a>
 <span class="sourceLineNo">6180</span><a name="line.6180"></a>
-<span class="sourceLineNo">6181</span>  /**<a name="line.6181"></a>
-<span class="sourceLineNo">6182</span>   * HBASE-16429 Make sure no stuck if roll writer when ring buffer is filled with appends<a name="line.6182"></a>
-<span class="sourceLineNo">6183</span>   * @throws IOException if IO error occurred during test<a name="line.6183"></a>
-<span class="sourceLineNo">6184</span>   */<a name="line.6184"></a>
-<span class="sourceLineNo">6185</span>  @Test<a name="line.6185"></a>
-<span class="sourceLineNo">6186</span>  public void testWritesWhileRollWriter() throws IOException {<a name="line.6186"></a>
-<span class="sourceLineNo">6187</span>    int testCount = 10;<a name="line.6187"></a>
-<span class="sourceLineNo">6188</span>    int numRows = 1024;<a name="line.6188"></a>
-<span class="sourceLineNo">6189</span>    int numFamilies = 2;<a name="line.6189"></a>
-<span class="sourceLineNo">6190</span>    int numQualifiers = 2;<a name="line.6190"></a>
-<span class="sourceLineNo">6191</span>    final byte[][] families = new byte[numFamilies][];<a name="line.6191"></a>
-<span class="sourceLineNo">6192</span>    for (int i = 0; i &lt; numFamilies; i++) {<a name="line.6192"></a>
-<span class="sourceLineNo">6193</span>      families[i] = Bytes.toBytes("family" + i);<a name="line.6193"></a>
-<span class="sourceLineNo">6194</span>    }<a name="line.6194"></a>
-<span class="sourceLineNo">6195</span>    final byte[][] qualifiers = new byte[numQualifiers][];<a name="line.6195"></a>
-<span class="sourceLineNo">6196</span>    for (int i = 0; i &lt; numQualifiers; i++) {<a name="line.6196"></a>
-<span class="sourceLineNo">6197</span>      qualifiers[i] = Bytes.toBytes("qual" + i);<a name="line.6197"></a>
-<span class="sourceLineNo">6198</span>    }<a name="line.6198"></a>
-<span class="sourceLineNo">6199</span><a name="line.6199"></a>
-<span class="sourceLineNo">6200</span>    CONF.setInt("hbase.regionserver.wal.disruptor.event.count", 2);<a name="line.6200"></a>
-<span class="sourceLineNo">6201</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.6201"></a>
-<span class="sourceLineNo">6202</span>    try {<a name="line.6202"></a>
-<span class="sourceLineNo">6203</span>      List&lt;Thread&gt; threads = new ArrayList&lt;&gt;();<a name="line.6203"></a>
-<span class="sourceLineNo">6204</span>      for (int i = 0; i &lt; numRows; i++) {<a name="line.6204"></a>
-<span class="sourceLineNo">6205</span>        final int count = i;<a name="line.6205"></a>
-<span class="sourceLineNo">6206</span>        Thread t = new Thread(new Runnable() {<a name="line.6206"></a>
-<span class="sourceLineNo">6207</span><a name="line.6207"></a>
-<span class="sourceLineNo">6208</span>          @Override<a name="line.6208"></a>
-<span class="sourceLineNo">6209</span>          public void run() {<a name="line.6209"></a>
-<span class="sourceLineNo">6210</span>            byte[] row = Bytes.toBytes("row" + count);<a name="line.6210"></a>
-<span class="sourceLineNo">6211</span>            Put put = new Put(row);<a name="line.6211"></a>
-<span class="sourceLineNo">6212</span>            put.setDurability(Durability.SYNC_WAL);<a name="line.6212"></a>
-<span class="sourceLineNo">6213</span>            byte[] value = Bytes.toBytes(String.valueOf(count));<a name="line.6213"></a>
-<span class="sourceLineNo">6214</span>            for (byte[] family : families) {<a name="line.6214"></a>
-<span class="sourceLineNo">6215</span>              for (byte[] qualifier : qualifiers) {<a name="line.6215"></a>
-<span class="sourceLineNo">6216</span>                put.addColumn(family, qualifier, count, value);<a name="line.6216"></a>
-<span class="sourceLineNo">6217</span>              }<a name="line.6217"></a>
-<span class="sourceLineNo">6218</span>            }<a name="line.6218"></a>
-<span class="sourceLineNo">6219</span>            try {<a name="line.6219"></a>
-<span class="sourceLineNo">6220</span>              region.put(put);<a name="line.6220"></a>
-<span class="sourceLineNo">6221</span>            } catch (IOException e) {<a name="line.6221"></a>
-<span class="sourceLineNo">6222</span>              throw new RuntimeException(e);<a name="line.6222"></a>
-<span class="sourceLineNo">6223</span>            }<a name="line.6223"></a>
-<span class="sourceLineNo">6224</span>          }<a name="line.6224"></a>
-<span class="sourceLineNo">6225</span>        });<a name="line.6225"></a>
-<span class="sourceLineNo">6226</span>        threads.add(t);<a name="line.6226"></a>
-<span class="sourceLineNo">6227</span>      }<a name="line.6227"></a>
-<span class="sourceLineNo">6228</span>      for (Thread t : threads) {<a name="line.6228"></a>
-<span class="sourceLineNo">6229</span>        t.start();<a name="line.6229"></a>
-<span class="sourceLineNo">6230</span>      }<a name="line.6230"></a>
-<span class="sourceLineNo">6231</span><a name="line.6231"></a>
-<span class="sourceLineNo">6232</span>      for (int i = 0; i &lt; testCount; i++) {<a name="line.6232"></a>
-<span class="sourceLineNo">6233</span>        region.getWAL().rollWriter();<a name="line.6233"></a>
-<span class="sourceLineNo">6234</span>        Thread.yield();<a name="line.6234"></a>
-<span class="sourceLineNo">6235</span>      }<a name="line.6235"></a>
-<span class="sourceLineNo">6236</span>    } finally {<a name="line.6236"></a>
-<span class="sourceLineNo">6237</span>      try {<a name="line.6237"></a>
-<span class="sourceLineNo">6238</span>        HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.6238"></a>
-<span class="sourceLineNo">6239</span>        CONF.setInt("hbase.regionserver.wal.disruptor.event.count", 16 * 1024);<a name="line.6239"></a>
-<span class="sourceLineNo">6240</span>      } catch (DroppedSnapshotException dse) {<a name="line.6240"></a>
-<span class="sourceLineNo">6241</span>        // We could get this on way out because we interrupt the background flusher and it could<a name="line.6241"></a>
-<span class="sourceLineNo">6242</span>        // fail anywhere causing a DSE over in the background flusher... only it is not properly<a name="line.6242"></a>
-<span class="sourceLineNo">6243</span>        // dealt with so could still be memory hanging out when we get to here -- memory we can't<a name="line.6243"></a>
-<span class="sourceLineNo">6244</span>        // flush because the accounting is 'off' since original DSE.<a name="line.6244"></a>
+<span class="sourceLineNo">6181</span>    assertTrue(Bytes.equals(c.getValueArray(), c.getValueOffset(), c.getValueLength(),<a name="line.6181"></a>
+<span class="sourceLineNo">6182</span>      qual2, 0, qual2.length));<a name="line.6182"></a>
+<span class="sourceLineNo">6183</span>  }<a name="line.6183"></a>
+<span class="sourceLineNo">6184</span><a name="line.6184"></a>
+<span class="sourceLineNo">6185</span>  HRegion initHRegion(TableName tableName, String callingMethod,<a name="line.6185"></a>
+<span class="sourceLineNo">6186</span>      byte[]... families) throws IOException {<a name="line.6186"></a>
+<span class="sourceLineNo">6187</span>    return initHRegion(tableName, callingMethod, HBaseConfiguration.create(),<a name="line.6187"></a>
+<span class="sourceLineNo">6188</span>        families);<a name="line.6188"></a>
+<span class="sourceLineNo">6189</span>  }<a name="line.6189"></a>
+<span class="sourceLineNo">6190</span><a name="line.6190"></a>
+<span class="sourceLineNo">6191</span>  /**<a name="line.6191"></a>
+<span class="sourceLineNo">6192</span>   * HBASE-16429 Make sure no stuck if roll writer when ring buffer is filled with appends<a name="line.6192"></a>
+<span class="sourceLineNo">6193</span>   * @throws IOException if IO error occurred during test<a name="line.6193"></a>
+<span class="sourceLineNo">6194</span>   */<a name="line.6194"></a>
+<span class="sourceLineNo">6195</span>  @Test<a name="line.6195"></a>
+<span class="sourceLineNo">6196</span>  public void testWritesWhileRollWriter() throws IOException {<a name="line.6196"></a>
+<span class="sourceLineNo">6197</span>    int testCount = 10;<a name="line.6197"></a>
+<span class="sourceLineNo">6198</span>    int numRows = 1024;<a name="line.6198"></a>
+<span class="sourceLineNo">6199</span>    int numFamilies = 2;<a name="line.6199"></a>
+<span class="sourceLineNo">6200</span>    int numQualifiers = 2;<a name="line.6200"></a>
+<span class="sourceLineNo">6201</span>    final byte[][] families = new byte[numFamilies][];<a name="line.6201"></a>
+<span class="sourceLineNo">6202</span>    for (int i = 0; i &lt; numFamilies; i++) {<a name="line.6202"></a>
+<span class="sourceLineNo">6203</span>      families[i] = Bytes.toBytes("family" + i);<a name="line.6203"></a>
+<span class="sourceLineNo">6204</span>    }<a name="line.6204"></a>
+<span class="sourceLineNo">6205</span>    final byte[][] qualifiers = new byte[numQualifiers][];<a name="line.6205"></a>
+<span class="sourceLineNo">6206</span>    for (int i = 0; i &lt; numQualifiers; i++) {<a name="line.6206"></a>
+<span class="sourceLineNo">6207</span>      qualifiers[i] = Bytes.toBytes("qual" + i);<a name="line.6207"></a>
+<span class="sourceLineNo">6208</span>    }<a name="line.6208"></a>
+<span class="sourceLineNo">6209</span><a name="line.6209"></a>
+<span class="sourceLineNo">6210</span>    CONF.setInt("hbase.regionserver.wal.disruptor.event.count", 2);<a name="line.6210"></a>
+<span class="sourceLineNo">6211</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.6211"></a>
+<span class="sourceLineNo">6212</span>    try {<a name="line.6212"></a>
+<span class="sourceLineNo">6213</span>      List&lt;Thread&gt; threads = new ArrayList&lt;&gt;();<a name="line.6213"></a>
+<span class="sourceLineNo">6214</span>      for (int i = 0; i &lt; numRows; i++) {<a name="line.6214"></a>
+<span class="sourceLineNo">6215</span>        final int count = i;<a name="line.6215"></a>
+<span class="sourceLineNo">6216</span>        Thread t = new Thread(new Runnable() {<a name="line.6216"></a>
+<span class="sourceLineNo">6217</span><a name="line.6217"></a>
+<span class="sourceLineNo">6218</span>          @Override<a name="line.6218"></a>
+<span class="sourceLineNo">6219</span>          public void run() {<a name="line.6219"></a>
+<span class="sourceLineNo">6220</span>            byte[] row = Bytes.toBytes("row" + count);<a name="line.6220"></a>
+<span class="sourceLineNo">6221</span>            Put put = new Put(row);<a name="line.6221"></a>
+<span class="sourceLineNo">6222</span>            put.setDurability(Durability.SYNC_WAL);<a name="line.6222"></a>
+<span class="sourceLineNo">6223</span>            byte[] value = Bytes.toBytes(String.valueOf(count));<a name="line.6223"></a>
+<span class="sourceLineNo">6224</span>            for (byte[] family : families) {<a name="line.6224"></a>
+<span class="sourceLineNo">6225</span>              for (byte[] qualifier : qualifiers) {<a name="line.6225"></a>
+<span class="sourceLineNo">6226</span>                put.addColumn(family, qualifier, count, value);<a name="line.6226"></a>
+<span class="sourceLineNo">6227</span>              }<a name="line.6227"></a>
+<span class="sourceLineNo">6228</span>            }<a name="line.6228"></a>
+<span class="sourceLineNo">6229</span>            try {<a name="line.6229"></a>
+<span class="sourceLineNo">6230</span>              region.put(put);<a name="line.6230"></a>
+<span class="sourceLineNo">6231</span>            } catch (IOException e) {<a name="line.6231"></a>
+<span class="sourceLineNo">6232</span>              throw new RuntimeException(e);<a name="line.6232"></a>
+<span class="sourceLineNo">6233</span>            }<a name="line.6233"></a>
+<span class="sourceLineNo">6234</span>          }<a name="line.6234"></a>
+<span class="sourceLineNo">6235</span>        });<a name="line.6235"></a>
+<span class="sourceLineNo">6236</span>        threads.add(t);<a name="line.6236"></a>
+<span class="sourceLineNo">6237</span>      }<a name="line.6237"></a>
+<span class="sourceLineNo">6238</span>      for (Thread t : threads) {<a name="line.6238"></a>
+<span class="sourceLineNo">6239</span>        t.start();<a name="line.6239"></a>
+<span class="sourceLineNo">6240</span>      }<a name="line.6240"></a>
+<span class="sourceLineNo">6241</span><a name="line.6241"></a>
+<span class="sourceLineNo">6242</span>      for (int i = 0; i &lt; testCount; i++) {<a name="line.6242"></a>
+<span class="sourceLineNo">6243</span>        region.getWAL().rollWriter();<a name="line.6243"></a>
+<span class="sourceLineNo">6244</span>        Thread.yield();<a name="line.6244"></a>
 <span class="sourceLineNo">6245</span>      }<a name="line.6245"></a>
-<span class="sourceLineNo">6246</span>      this.region = null;<a name="line.6246"></a>
-<span class="sourceLineNo">6247</span>    }<a name="line.6247"></a>
-<span class="sourceLineNo">6248</span>  }<a name="line.6248"></a>
-<span class="sourceLineNo">6249</span><a name="line.6249"></a>
-<span class="sourceLineNo">6250</span>  @Test<a name="line.6250"></a>
-<span class="sourceLineNo">6251</span>  public void testMutateRow_WriteRequestCount() throws Exception {<a name="line.6251"></a>
-<span class="sourceLineNo">6252</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.6252"></a>
-<span class="sourceLineNo">6253</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.6253"></a>
-<span class="sourceLineNo">6254</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.6254"></a>
-<span class="sourceLineNo">6255</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.6255"></a>
-<span class="sourceLineNo">6256</span><a name="line.6256"></a>
-<span class="sourceLineNo">6257</span>    RowMutations rm = new RowMutations(row1);<a name="line.6257"></a>
-<span class="sourceLineNo">6258</span>    Put put = new Put(row1);<a name="line.6258"></a>
-<span class="sourceLineNo">6259</span>    put.addColumn(fam1, qf1, val1);<a name="line.6259"></a>
-<span class="sourceLineNo">6260</span>    rm.add(put);<a name="line.6260"></a>
-<span class="sourceLineNo">6261</span><a name="line.6261"></a>
-<span class="sourceLineNo">6262</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.6262"></a>
-<span class="sourceLineNo">6263</span>    long wrcBeforeMutate = this.region.writeRequestsCount.longValue();<a name="line.6263"></a>
-<span class="sourceLineNo">6264</span>    this.region.mutateRow(rm);<a name="line.6264"></a>
-<span class="sourceLineNo">6265</span>    long wrcAfterMutate = this.region.writeRequestsCount.longValue();<a name="line.6265"></a>
-<span class="sourceLineNo">6266</span>    Assert.assertEquals(wrcBeforeMutate + rm.getMutations().size(), wrcAfterMutate);<a name="line.6266"></a>
-<span class="sourceLineNo">6267</span>  }<a name="line.6267"></a>
-<span class="sourceLineNo">6268</span><a name="line.6268"></a>
-<span class="sourceLineNo">6269</span>  @Test<a name="line.6269"></a>
-<span class="sourceLineNo">6270</span>  public void testBulkLoadReplicationEnabled() throws IOException {<a name="line.6270"></a>
-<span class="sourceLineNo">6271</span>    TEST_UTIL.getConfiguration().setBoolean(HConstants.REPLICATION_BULKLOAD_ENABLE_KEY, true);<a name="line.6271"></a>
-<span class="sourceLineNo">6272</span>    final ServerName serverName = ServerName.valueOf(name.getMethodName(), 100, 42);<a name="line.6272"></a>
-<span class="sourceLineNo">6273</span>    final RegionServerServices rss = spy(TEST_UTIL.createMockRegionServerService(serverName));<a name="line.6273"></a>
-<span class="sourceLineNo">6274</span><a name="line.6274"></a>
-<span class="sourceLineNo">6275</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.6275"></a>
-<span class="sourceLineNo">6276</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.6276"></a>
-<span class="sourceLineNo">6277</span>    HRegionInfo hri = new HRegionInfo(htd.getTableName(),<a name="line.6277"></a>
-<span class="sourceLineNo">6278</span>        HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY);<a name="line.6278"></a>
-<span class="sourceLineNo">6279</span>    region = HRegion.openHRegion(hri, htd, rss.getWAL(hri), TEST_UTIL.getConfiguration(),<a name="line.6279"></a>
-<span class="sourceLineNo">6280</span>        rss, null);<a name="line.6280"></a>
-<span class="sourceLineNo">6281</span><a name="line.6281"></a>
-<span class="sourceLineNo">6282</span>    assertTrue(region.conf.getBoolean(HConstants.REPLICATION_BULKLOAD_ENABLE_KEY, false));<a name="line.6282"></a>
-<span class="sourceLineNo">6283</span>    String plugins = region.conf.get(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY, "");<a name="line.6283"></a>
-<span class="sourceLineNo">6284</span>    String replicationCoprocessorClass = ReplicationObserver.class.getCanonicalName();<a name="line.6284"></a>
-<span class="sourceLineNo">6285</span>    assertTrue(plugins.contains(replicationCoprocessorClass));<a name="line.6285"></a>
-<span class="sourceLineNo">6286</span>    assertTrue(region.getCoprocessorHost().<a name="line.6286"></a>
-<span class="sourceLineNo">6287</span>        getCoprocessors().contains(ReplicationObserver.class.getSimpleName()));<a name="line.6287"></a>
-<span class="sourceLineNo">6288</span>  }<a name="line.6288"></a>
-<span class="sourceLineNo">6289</span><a name="line.6289"></a>
-<span class="sourceLineNo">6290</span>  // make sure region is success close when coprocessor wrong region open failed<a name="line.6290"></a>
-<span class="sourceLineNo">6291</span>  @Test<a name="line.6291"></a>
-<span class="sourceLineNo">6292</span>  public void testOpenRegionFailedMemoryLeak() throws Exception {<a name="line.6292"></a>
-<span class="sourceLineNo">6293</span>    final ServerName serverName = ServerName.valueOf("testOpenRegionFailed", 100, 42);<a name="line.6293"></a>
-<span class="sourceLineNo">6294</span>    final RegionServerServices rss = spy(TEST_UTIL.createMockRegionServerService(serverName));<a name="line.6294"></a>
-<span class="sourceLineNo">6295</span><a name="line.6295"></a>
-<span class="sourceLineNo">6296</span>    HTableDescriptor htd<a name="line.6296"></a>
-<span class="sourceLineNo">6297</span>      = new HTableDescriptor(TableName.valueOf("testOpenRegionFailed"));<a name="line.6297"></a>
-<span class="sourceLineNo">6298</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.6298"></a>
-<span class="sourceLineNo">6299</span>    htd.setValue("COPROCESSOR$1", "hdfs://test/test.jar|test||");<a name="line.6299"></a>
-<span class="sourceLineNo">6300</span><a name="line.6300"></a>
-<span class="sourceLineNo">6301</span>    HRegionInfo hri = new HRegionInfo(htd.getTableName(),<a name="line.6301"></a>
-<span class="sourceLineNo">6302</span>      HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY);<a name="line.6302"></a>
-<span class="sourceLineNo">6303</span>    ScheduledExecutorService executor = CompatibilitySingletonFactory.<a name="line.6303"></a>
-<span class="sourceLineNo">6304</span>      getInstance(MetricsExecutor.class).getExecutor();<a name="line.6304"></a>
-<span class="sourceLineNo">6305</span>    for (int i = 0; i &lt; 20 ; i++) {<a name="line.6305"></a>
-<span class="sourceLineNo">6306</span>      try {<a name="line.6306"></a>
-<span class="sourceLineNo">6307</span>        HRegion.openHRegion(hri, htd, rss.getWAL(hri),<a name="line.6307"></a>
-<span class="sourceLineNo">6308</span>          TEST_UTIL.getConfiguration(), rss, null);<a name="line.6308"></a>
-<span class="sourceLineNo">6309</span>      }catch(Throwable t){<a name="line.6309"></a>
-<span class="sourceLineNo">6310</span>        LOG.info("Expected exception, continue");<a name="line.6310"></a>
-<span class="sourceLineNo">6311</span>      }<a name="line.6311"></a>
-<span class="sourceLineNo">6312</span>    }<a name="line.6312"></a>
-<span class="sourceLineNo">6313</span>    TimeUnit.SECONDS.sleep(MetricsRegionWrapperImpl.PERIOD);<a name="line.6313"></a>
-<span class="sourceLineNo">6314</span>    Field[] fields = ThreadPoolExecutor.class.getDeclaredFields();<a name="line.6314"></a>
-<span class="sourceLineNo">6315</span>    boolean found = false;<a name="line.6315"></a>
-<span class="sourceLineNo">6316</span>    for(Field field : fields){<a name="line.6316"></a>
-<span class="sourceLineNo">6317</span>      if(field.getName().equals("workQueue")){<a name="line.6317"></a>
-<span class="sourceLineNo">6318</span>        field.setAccessible(true);<a name="line.6318"></a>
-<span class="sourceLineNo">6319</span>        BlockingQueue&lt;Runnable&gt; workQueue = (BlockingQueue&lt;Runnable&gt;)field.get(executor);<a name="line.6319"></a>
-<span class="sourceLineNo">6320</span>        //there are still two task not cancel, can not cause to memory lack<a name="line.6320"></a>
-<span class="sourceLineNo">6321</span>        Assert.assertTrue("ScheduledExecutor#workQueue should equals 2, now is " +<a name="line.6321"></a>
-<span class="sourceLineNo">6322</span>          workQueue.size() + ", please check region is close", 2 == workQueue.size());<a name="line.6322"></a>
-<span class="sourceLineNo">6323</span>        found = true;<a name="line.6323"></a>
-<span class="sourceLineNo">6324</span>      }<a name="line.6324"></a>
-<span class="sourceLineNo">6325</span>    }<a name="line.6325"></a>
-<span class="sourceLineNo">6326</span>    Assert.assertTrue("can not find workQueue, test failed", found);<a name="line.6326"></a>
-<span class="sourceLineNo">6327</span>  }<a name="line.6327"></a>
-<span class="sourceLineNo">6328</span><a name="line.6328"></a>
-<span class="sourceLineNo">6329</span>  /**<a name="line.6329"></a>
-<span class="sourceLineNo">6330</span>   * The same as HRegion class, the only difference is that instantiateHStore will<a name="line.6330"></a>
-<span class="sourceLineNo">6331</span>   * create a different HStore - HStoreForTesting. [HBASE-8518]<a name="line.6331"></a>
-<span class="sourceLineNo">6332</span>   */<a name="line.6332"></a>
-<span class="sourceLineNo">6333</span>  public static class HRegionForTesting extends HRegion {<a name="line.6333"></a>
-<span class="sourceLineNo">6334</span><a name="line.6334"></a>
-<span class="sourceLineNo">6335</span>    public HRegionForTesting(final Path tableDir, final WAL wal, final FileSystem fs,<a name="line.6335"></a>
-<span class="sourceLineNo">6336</span>                             final Configuration confParam, final RegionInfo regionInfo,<a name="line.6336"></a>
-<span class="sourceLineNo">6337</span>                             final TableDescriptor htd, final RegionServerServices rsServices) {<a name="line.6337"></a>
-<span class="sourceLineNo">6338</span>      this(new HRegionFileSystem(confParam, fs, tableDir, regionInfo),<a name="line.6338"></a>
-<span class="sourceLineNo">6339</span>          wal, confParam, htd, rsServices);<a name="line.6339"></a>
-<span class="sourceLineNo">6340</span>    }<a name="line.6340"></a>
-<span class="sourceLineNo">6341</span><a name="line.6341"></a>
-<span class="sourceLineNo">6342</span>    public HRegionForTesting(HRegionFileSystem fs, WAL wal,<a name="line.6342"></a>
-<span class="sourceLineNo">6343</span>                             Configuration confParam, TableDescriptor htd,<a name="line.6343"></a>
-<span class="sourceLineNo">6344</span>                             RegionServerServices rsServices) {<a name="line.6344"></a>
-<span class="sourceLineNo">6345</span>      super(fs, wal, confParam, htd, rsServices);<a name="line.6345"></a>
-<span class="sourceLineNo">6346</span>    }<a name="line.6346"></a>
-<span class="sourceLineNo">6347</span><a name="line.6347"></a>
-<span class="sourceLineNo">6348</span>    /**<a name="line.6348"></a>
-<span class="sourceLineNo">6349</span>     * Create HStore instance.<a name="line.6349"></a>
-<span class="sourceLineNo">6350</span>     * @return If Mob is enabled, return HMobStore, otherwise return HStoreForTesting.<a name="line.6350"></a>
-<span class="sourceLineNo">6351</span>     */<a name="line.6351"></a>
-<span class="sourceLineNo">6352</span>    @Override<a name="line.6352"></a>
-<span class="sourceLineNo">6353</span>    protected HStore instantiateHStore(final ColumnFamilyDescriptor family, boolean warmup)<a name="line.6353"></a>
-<span class="sourceLineNo">6354</span>        throws IOException {<a name="line.6354"></a>
-<span class="sourceLineNo">6355</span>      if (family.isMobEnabled()) {<a name="line.6355"></a>
-<span class="sourceLineNo">6356</span>        if (HFile.getFormatVersion(this.conf) &lt; HFile.MIN_FORMAT_VERSION_WITH_TAGS) {<a name="line.6356"></a>
-<span class="sourceLineNo">6357</span>          throw new IOException("A minimum HFile version of " + HFile.MIN_FORMAT_VERSION_WITH_TAGS +<a name="line.6357"></a>
-<span class="sourceLineNo">6358</span>              " is required for MOB feature. Consider setting " + HFile.FORMAT_VERSION_KEY +<a name="line.6358"></a>
-<span class="sourceLineNo">6359</span>              " accordingly.");<a name="line.6359"></a>
-<span class="sourceLineNo">6360</span>        }<a name="line.6360"></a>
-<span class="sourceLineNo">6361</span>        return new HMobStore(this, family, this.conf, warmup);<a name="line.6361"></a>
-<span class="sourceLineNo">6362</span>      }<a name="line.6362"></a>
-<span class="sourceLineNo">6363</span>      return new HStoreForTesting(this, family, this.conf, warmup);<a name="line.6363"></a>
-<span class="sourceLineNo">6364</span>    }<a name="line.6364"></a>
-<span class="sourceLineNo">6365</span>  }<a name="line.6365"></a>
-<span class="sourceLineNo">6366</span><a name="line.6366"></a>
-<span class="sourceLineNo">6367</span>  /**<a name="line.6367"></a>
-<span class="sourceLineNo">6368</span>   * HStoreForTesting is merely the same as HStore, the difference is in the doCompaction method<a name="line.6368"></a>
-<span class="sourceLineNo">6369</span>   * of HStoreForTesting there is a checkpoint "hbase.hstore.compaction.complete" which<a name="line.6369"></a>
-<span class="sourceLineNo">6370</span>   * doesn't let hstore compaction complete. In the former edition, this config is set in<a name="line.6370"></a>
-<span class="sourceLineNo">6371</span>   * HStore class inside compact method, though this is just for testing, otherwise it<a name="line.6371"></a>
-<span class="sourceLineNo">6372</span>   * doesn't do any help. In HBASE-8518, we try to get rid of all "hbase.hstore.compaction.complete"<a name="line.6372"></a>
-<span class="sourceLineNo">6373</span>   * config (except for testing code).<a name="line.6373"></a>
-<span class="sourceLineNo">6374</span>   */<a name="line.6374"></a>
-<span class="sourceLineNo">6375</span>  public static class HStoreForTesting extends HStore {<a name="line.6375"></a>
+<span class="sourceLineNo">6246</span>    } finally {<a name="line.6246"></a>
+<span class="sourceLineNo">6247</span>      try {<a name="line.6247"></a>
+<span class="sourceLineNo">6248</span>        HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.6248"></a>
+<span class="sourceLineNo">6249</span>        CONF.setInt("hbase.regionserver.wal.disruptor.event.count", 16 * 1024);<a name="line.6249"></a>
+<span class="sourceLineNo">6250</span>      } catch (DroppedSnapshotException dse) {<a name="line.6250"></a>
+<span class="sourceLineNo">6251</span>        // We could get this on way out because we interrupt the background flusher and it could<a name="line.6251"></a>
+<span class="sourceLineNo">6252</span>        // fail anywhere causing a DSE over in the background flusher... only it is not properly<a name="line.6252"></a>
+<span class="sourceLineNo">6253</span>        // dealt with so could still be memory hanging out when we get to here -- memory we can't<a name="line.6253"></a>
+<span class="sourceLineNo">6254</span>        // flush because the accounting is 'off' since original DSE.<a name="line.6254"></a>
+<span class="sourceLineNo">6255</span>      }<a name="line.6255"></a>
+<span class="sourceLineNo">6256</span>      this.region = null;<a name="line.6256"></a>
+<span class="sourceLineNo">6257</span>    }<a name="line.6257"></a>
+<span class="sourceLineNo">6258</span>  }<a name="line.6258"></a>
+<span class="sourceLineNo">6259</span><a name="line.6259"></a>
+<span class="sourceLineNo">6260</span>  @Test<a name="line.6260"></a>
+<span class="sourceLineNo">6261</span>  public void testMutateRow_WriteRequestCount() throws Exception {<a name="line.6261"></a>
+<span class="sourceLineNo">6262</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.6262"></a>
+<span class="sourceLineNo">6263</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.6263"></a>
+<span class="sourceLineNo">6264</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.6264"></a>
+<span class="sourceLineNo">6265</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.6265"></a>
+<span class="sourceLineNo">6266</span><a name="line.6266"></a>
+<span class="sourceLineNo">6267</span>    RowMutations rm = new RowMutations(row1);<a name="line.6267"></a>
+<span class="sourceLineNo">6268</span>    Put put = new Put(row1);<a name="line.6268"></a>
+<span class="sourceLineNo">6269</span>    put.addColumn(fam1, qf1, val1);<a name="line.6269"></a>
+<span class="sourceLineNo">6270</span>    rm.add(put);<a name="line.6270"></a>
+<span class="sourceLineNo">6271</span><a name="line.6271"></a>
+<span class="sourceLineNo">6272</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.6272"></a>
+<span class="sourceLineNo">6273</span>    long wrcBeforeMutate = this.region.writeRequestsCount.longValue();<a name="line.6273"></a>
+<span class="sourceLineNo">6274</span>    this.region.mutateRow(rm);<a name="line.6274"></a>
+<span class="sourceLineNo">6275</span>    long wrcAfterMutate = this.region.writeRequestsCount.longValue();<a name="line.6275"></a>
+<span class="sourceLineNo">6276</span>    Assert.assertEquals(wrcBeforeMutate + rm.getMutations().size(), wrcAfterMutate);<a name="line.6276"></a>
+<span class="sourceLineNo">6277</span>  }<a name="line.6277"></a>
+<span class="sourceLineNo">6278</span><a name="line.6278"></a>
+<span class="sourceLineNo">6279</span>  @Test<a name="line.6279"></a>
+<span class="sourceLineNo">6280</span>  public void testBulkLoadReplicationEnabled() throws IOException {<a name="line.6280"></a>
+<span class="sourceLineNo">6281</span>    TEST_UTIL.getConfiguration().setBoolean(HConstants.REPLICATION_BULKLOAD_ENABLE_KEY, true);<a name="line.6281"></a>
+<span class="sourceLineNo">6282</span>    final ServerName serverName = ServerName.valueOf(name.getMethodName(), 100, 42);<a name="line.6282"></a>
+<span class="sourceLineNo">6283</span>    final RegionServerServices rss = spy(TEST_UTIL.createMockRegionServerService(serverName));<a name="line.6283"></a>
+<span class="sourceLineNo">6284</span><a name="line.6284"></a>
+<span class="sourceLineNo">6285</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.6285"></a>
+<span class="sourceLineNo">6286</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.6286"></a>
+<span class="sourceLineNo">6287</span>    HRegionInfo hri = new HRegionInfo(htd.getTableName(),<a name="line.6287"></a>
+<span class="sourceLineNo">6288</span>        HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY);<a name="line.6288"></a>
+<span class="sourceLineNo">6289</span>    region = HRegion.openHRegion(hri, htd, rss.getWAL(hri), TEST_UTIL.getConfiguration(),<a name="line.6289"></a>
+<span class="sourceLineNo">6290</span>        rss, null);<a name="line.6290"></a>
+<span class="sourceLineNo">6291</span><a name="line.6291"></a>
+<span class="sourceLineNo">6292</span>    assertTrue(region.conf.getBoolean(HConstants.REPLICATION_BULKLOAD_ENABLE_KEY, false));<a name="line.6292"></a>
+<span class="sourceLineNo">6293</span>    String plugins = region.conf.get(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY, "");<a name="line.6293"></a>
+<span class="sourceLineNo">6294</span>    String replicationCoprocessorClass = ReplicationObserver.class.getCanonicalName();<a name="line.6294"></a>
+<span class="sourceLineNo">6295</span>    assertTrue(plugins.contains(replicationCoprocessorClass));<a name="line.6295"></a>
+<span class="sourceLineNo">6296</span>    assertTrue(region.getCoprocessorHost().<a name="line.6296"></a>
+<span class="sourceLineNo">6297</span>        getCoprocessors().contains(ReplicationObserver.class.getSimpleName()));<a name="line.6297"></a>
+<span class="sourceLineNo">6298</span>  }<a name="line.6298"></a>
+<span class="sourceLineNo">6299</span><a name="line.6299"></a>
+<span class="sourceLineNo">6300</span>  // make sure region is success close when coprocessor wrong region open failed<a name="line.6300"></a>
+<span class="sourceLineNo">6301</span>  @Test<a name="line.6301"></a>
+<span class="sourceLineNo">6302</span>  public void testOpenRegionFailedMemoryLeak() throws Exception {<a name="line.6302"></a>
+<span class="sourceLineNo">6303</span>    final ServerName serverName = ServerName.valueOf("testOpenRegionFailed", 100, 42);<a name="line.6303"></a>
+<span class="sourceLineNo">6304</span>    final RegionServerServices rss = spy(TEST_UTIL.createMockRegionServerService(serverName));<a name="line.6304"></a>
+<span class="sourceLineNo">6305</span><a name="line.6305"></a>
+<span class="sourceLineNo">6306</span>    HTableDescriptor htd<a name="line.6306"></a>
+<span class="sourceLineNo">6307</span>      = new HTableDescriptor(TableName.valueOf("testOpenRegionFailed"));<a name="line.6307"></a>
+<span class="sourceLineNo">6308</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.6308"></a>
+<span class="sourceLineNo">6309</span>    htd.setValue("COPROCESSOR$1", "hdfs://test/test.jar|test||");<a name="line.6309"></a>
+<span class="sourceLineNo">6310</span><a name="line.6310"></a>
+<span class="sourceLineNo">6311</span>    HRegionInfo hri = new HRegionInfo(htd.getTableName(),<a name="line.6311"></a>
+<span class="sourceLineNo">6312</span>      HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY);<a name="line.6312"></a>
+<span class="sourceLineNo">6313</span>    ScheduledExecutorService executor = CompatibilitySingletonFactory.<a name="line.6313"></a>
+<span class="sourceLineNo">6314</span>      getInstance(MetricsExecutor.class).getExecutor();<a name="line.6314"></a>
+<span class="sourceLineNo">6315</span>    for (int i = 0; i &lt; 20 ; i++) {<a name="line.6315"></a>
+<span class="sourceLineNo">6316</span>      try {<a name="line.6316"></a>
+<span class="sourceLineNo">6317</span>        HRegion.openHRegion(hri, htd, rss.getWAL(hri),<a name="line.6317"></a>
+<span class="sourceLineNo">6318</span>          TEST_UTIL.getConfiguration(), rss, null);<a name="line.6318"></a>
+<span class="sourceLineNo">6319</span>      }catch(Throwable t){<a name="line.6319"></a>
+<span class="sourceLineNo">6320</span>        LOG.info("Expected exception, continue");<a name="line.6320"></a>
+<span class="sourceLineNo">6321</span>      }<a name="line.6321"></a>
+<span class="sourceLineNo">6322</span>    }<a name="line.6322"></a>
+<span class="sourceLineNo">6323</span>    TimeUnit.SECONDS.sleep(MetricsRegionWrapperImpl.PERIOD);<a name="line.6323"></a>
+<span class="sourceLineNo">6324</span>    Field[] fields = ThreadPoolExecutor.class.getDeclaredFields();<a name="line.6324"></a>
+<span class="sourceLineNo">6325</span>    boolean found = false;<a name="line.6325"></a>
+<span class="sourceLineNo">6326</span>    for(Field field : fields){<a name="line.6326"></a>
+<span class="sourceLineNo">6327</span>      if(field.getName().equals("workQueue")){<a name="line.6327"></a>
+<span class="sourceLineNo">6328</span>        field.setAccessible(true);<a name="line.6328"></a>
+<span class="sourceLineNo">6329</span>        BlockingQueue&lt;Runnable&gt; workQueue = (BlockingQueue&lt;Runnable&gt;)field.get(executor);<a name="line.6329"></a>
+<span class="sourceLineNo">6330</span>        //there are still two task not cancel, can not cause to memory lack<a name="line.6330"></a>
+<span class="sourceLineNo">6331</span>        Assert.assertTrue("ScheduledExecutor#workQueue should equals 2, now is " +<a name="line.6331"></a>
+<span class="sourceLineNo">6332</span>          workQueue.size() + ", please check region is close", 2 == workQueue.size());<a name="line.6332"></a>
+<span class="sourceLineNo">6333</span>        found = true;<a name="line.6333"></a>
+<span class="sourceLineNo">6334</span>      }<a name="line.6334"></a>
+<span class="sourceLineNo">6335</span>    }<a name="line.6335"></a>
+<span class="sourceLineNo">6336</span>    Assert.assertTrue("can not find workQueue, test failed", found);<a name="line.6336"></a>
+<span class="sourceLineNo">6337</span>  }<a name="line.6337"></a>
+<span class="sourceLineNo">6338</span><a name="line.6338"></a>
+<span class="sourceLineNo">6339</span>  /**<a name="line.6339"></a>
+<span class="sourceLineNo">6340</span>   * The same as HRegion class, the only difference is that instantiateHStore will<a name="line.6340"></a>
+<span class="sourceLineNo">6341</span>   * create a different HStore - HStoreForTesting. [HBASE-8518]<a name="line.6341"></a>
+<span class="sourceLineNo">6342</span>   */<a name="line.6342"></a>
+<span class="sourceLineNo">6343</span>  public static class HRegionForTesting extends HRegion {<a name="line.6343"></a>
+<span class="sourceLineNo">6344</span><a name="line.6344"></a>
+<span class="sourceLineNo">6345</span>    public HRegionForTesting(final Path tableDir, final WAL wal, final FileSystem fs,<a name="line.6345"></a>
+<span class="sourceLineNo">6346</span>                             final Configuration confParam, final RegionInfo regionInfo,<a name="line.6346"></a>
+<span class="sourceLineNo">6347</span>                             final TableDescriptor htd, final RegionServerServices rsServices) {<a name="line.6347"></a>
+<span class="sourceLineNo">6348</span>      this(new HRegionFileSystem(confParam, fs, tableDir, regionInfo),<a name="line.6348"></a>
+<span class="sourceLineNo">6349</span>          wal, confParam, htd, rsServices);<a name="line.6349"></a>
+<span class="sourceLineNo">6350</span>    }<a name="line.6350"></a>
+<span class="sourceLineNo">6351</span><a name="line.6351"></a>
+<span class="sourceLineNo">6352</span>    public HRegionForTesting(HRegionFileSystem fs, WAL wal,<a name="line.6352"></a>
+<span class="sourceLineNo">6353</span>                             Configuration confParam, TableDescriptor htd,<a name="line.6353"></a>
+<span class="sourceLineNo">6354</span>                             RegionServerServices rsServices) {<a name="line.6354"></a>
+<span class="sourceLineNo">6355</span>      super(fs, wal, confParam, htd, rsServices);<a name="line.6355"></a>
+<span class="sourceLineNo">6356</span>    }<a name="line.6356"></a>
+<span class="sourceLineNo">6357</span><a name="line.6357"></a>
+<span class="sourceLineNo">6358</span>    /**<a name="line.6358"></a>
+<span class="sourceLineNo">6359</span>     * Create HStore instance.<a name="line.6359"></a>
+<span class="sourceLineNo">6360</span>     * @return If Mob is enabled, return HMobStore, otherwise return HStoreForTesting.<a name="line.6360"></a>
+<span class="sourceLineNo">6361</span>     */<a name="line.6361"></a>
+<span class="sourceLineNo">6362</span>    @Override<a name="line.6362"></a>
+<span class="sourceLineNo">6363</span>    protected HStore instantiateHStore(final ColumnFamilyDescriptor family, boolean warmup)<a name="line.6363"></a>
+<span class="sourceLineNo">6364</span>        throws IOException {<a name="line.6364"></a>
+<span class="sourceLineNo">6365</span>      if (family.isMobEnabled()) {<a name="line.6365"></a>
+<span class="sourceLineNo">6366</span>        if (HFile.getFormatVersion(this.conf) &lt; HFile.MIN_FORMAT_VERSION_WITH_TAGS) {<a name="line.6366"></a>
+<span class="sourceLineNo">6367</span>          throw new IOException("A minimum HFile version of " + HFile.MIN_FORMAT_VERSION_WITH_TAGS +<a name="line.6367"></a>
+<span class="sourceLineNo">6368</span>              " is required for MOB feature. Consider setting " + HFile.FORMAT_VERSION_KEY +<a name="line.6368"></a>
+<span class="sourceLineNo">6369</span>              " accordingly.");<a name="line.6369"></a>
+<span class="sourceLineNo">6370</span>        }<a name="line.6370"></a>
+<span class="sourceLineNo">6371</span>        return new HMobStore(this, family, this.conf, warmup);<a name="line.6371"></a>
+<span class="sourceLineNo">6372</span>      }<a name="line.6372"></a>
+<span class="sourceLineNo">6373</span>      return new HStoreForTesting(this, family, this.conf, warmup);<a name="line.6373"></a>
+<span class="sourceLineNo">6374</span>    }<a name="line.6374"></a>
+<span class="sourceLineNo">6375</span>  }<a name="line.6375"></a>
 <span class="sourceLineNo">6376</span><a name="line.6376"></a>
-<span class="sourceLineNo">6377</span>    protected HStoreForTesting(final HRegion region,<a name="line.6377"></a>
-<span class="sourceLineNo">6378</span>        final ColumnFamilyDescriptor family,<a name="line.6378"></a>
-<span class="sourceLineNo">6379</span>        final Configuration confParam, boolean warmup) throws IOException {<a name="line.6379"></a>
-<span class="sourceLineNo">6380</span>      super(region, family, confParam, warmup);<a name="line.6380"></a>
-<span class="sourceLineNo">6381</span>    }<a name="line.6381"></a>
-<span class="sourceLineNo">6382</span><a name="line.6382"></a>
-<span class="sourceLineNo">6383</span>    @Override<a name="line.6383"></a>
-<span class="sourceLineNo">6384</span>    protected List&lt;HStoreFile&gt; doCompaction(CompactionRequestImpl cr,<a name="line.6384"></a>
-<span class="sourceLineNo">6385</span>        Collection&lt;HStoreFile&gt; filesToCompact, User user, long compactionStartTime,<a name="line.6385"></a>
-<span class="sourceLineNo">6386</span>        List&lt;Path&gt; newFiles) throws IOException {<a name="line.6386"></a>
-<span class="sourceLineNo">6387</span>      // let compaction incomplete.<a name="line.6387"></a>
-<span class="sourceLineNo">6388</span>      if (!this.conf.getBoolean("hbase.hstore.compaction.complete", true)) {<a name="line.6388"></a>
-<span class="sourceLineNo">6389</span>        LOG.warn("hbase.hstore.compaction.complete is set to false");<a name="line.6389"></a>
-<span class="sourceLineNo">6390</span>        List&lt;HStoreFile&gt; sfs = new ArrayList&lt;&gt;(newFiles.size());<a name="line.6390"></a>
-<span class="sourceLineNo">6391</span>        final boolean evictOnClose =<a name="line.6391"></a>
-<span class="sourceLineNo">6392</span>            cacheConf != null? cacheConf.shouldEvictOnClose(): true;<a name="line.6392"></a>
-<span class="sourceLineNo">6393</span>        for (Path newFile : newFiles) {<a name="line.6393"></a>
-<span class="sourceLineNo">6394</span>          // Create storefile around what we wrote with a reader on it.<a name="line.6394"></a>
-<span class="sourceLineNo">6395</span>          HStoreFile sf = createStoreFileAndReader(newFile);<a name="line.6395"></a>
-<span class="sourceLineNo">6396</span>          sf.closeStoreFile(evictOnClose);<a name="line.6396"></a>
-<span class="sourceLineNo">6397</span>          sfs.add(sf);<a name="line.6397"></a>
-<span class="sourceLineNo">6398</span>        }<a name="line.6398"></a>
-<span class="sourceLineNo">6399</span>        return sfs;<a name="line.6399"></a>
-<span class="sourceLineNo">6400</span>      }<a name="line.6400"></a>
-<span class="sourceLineNo">6401</span>      return super.doCompaction(cr, filesToCompact, user, compactionStartTime, newFiles);<a name="line.6401"></a>
-<span class="sourceLineNo">6402</span>    }<a name="line.6402"></a>
-<span class="sourceLineNo">6403</span>  }<a name="line.6403"></a>
-<span class="sourceLineNo">6404</span>}<a name="line.6404"></a>
+<span class="sourceLineNo">6377</span>  /**<a name="line.6377"></a>
+<span class="sourceLineNo">6378</span>   * HStoreForTesting is merely the same as HStore, the difference is in the doCompaction method<a name="line.6378"></a>
+<span class="sourceLineNo">6379</span>   * of HStoreForTesting there is a checkpoint "hbase.hstore.compaction.complete" which<a name="line.6379"></a>
+<span class="sourceLineNo">6380</span>   * doesn't let hstore compaction complete. In the former edition, this config is set in<a name="line.6380"></a>
+<span class="sourceLineNo">6381</span>   * HStore class inside compact method, though this is just for testing, otherwise it<a name="line.6381"></a>
+<span class="sourceLineNo">6382</span>   * doesn't do any help. In HBASE-8518, we try to get rid of all "hbase.hstore.compaction.complete"<a name="line.6382"></a>
+<span class="sourceLineNo">6383</span>   * config (except for testing code).<a name="line.6383"></a>
+<span class="sourceLineNo">6384</span>   */<a name="line.6384"></a>
+<span class="sourceLineNo">6385</span>  public static class HStoreForTesting extends HStore {<a name="line.6385"></a>
+<span class="sourceLineNo">6386</span><a name="line.6386"></a>
+<span class="sourceLineNo">6387</span>    protected HStoreForTesting(final HRegion region,<a name="line.6387"></a>
+<span class="sourceLineNo">6388</span>        final ColumnFamilyDescriptor family,<a name="line.6388"></a>
+<span class="sourceLineNo">6389</span>        final Configuration confParam, boolean warmup) throws IOException {<a name="line.6389"></a>
+<span class="sourceLineNo">6390</span>      super(region, family, confParam, warmup);<a name="line.6390"></a>
+<span class="sourceLineNo">6391</span>    }<a name="line.6391"></a>
+<span class="sourceLineNo">6392</span><a name="line.6392"></a>
+<span class="sourceLineNo">6393</span>    @Override<a name="line.6393"></a>
+<span class="sourceLineNo">6394</span>    protected List&lt;HStoreFile&gt; doCompaction(CompactionRequestImpl cr,<a name="line.6394"></a>
+<span class="sourceLineNo">6395</span>        Collection&lt;HStoreFile&gt; filesToCompact, User user, long compactionStartTime,<a name="line.6395"></a>
+<span class="sourceLineNo">6396</span>        List&lt;Path&gt; newFiles) throws IOException {<a name="line.6396"></a>
+<span class="sourceLineNo">6397</span>      // let compaction incomplete.<a name="line.6397"></a>
+<span class="sourceLineNo">6398</span>      if (!this.conf.getBoolean("hbase.hstore.compaction.complete", true)) {<a name="line.6398"></a>
+<span class="sourceLineNo">6399</span>        LOG.warn("hbase.hstore.compaction.complete is set to false");<a name="line.6399"></a>
+<span class="sourceLineNo">6400</span>        List&lt;HStoreFile&gt; sfs = new ArrayList&lt;&gt;(newFiles.size());<a name="line.6400"></a>
+<span class="sourceLineNo">6401</span>        final boolean evictOnClose =<a name="line.6401"></a>
+<span class="sourceLineNo">6402</span>            cacheConf != null? cacheConf.shouldEvictOnClose(): true;<a name="line.6402"></a>
+<span class="sourceLineNo">6403</span>        for (Path newFile : newFiles) {<a name="line.6403"></a>
+<span class="sourceLineNo">6404</span>          // Create storefile around what we wrote with a reader on it.<a name="line.6404"></a>
+<span class="sourceLineNo">6405</span>          HStoreFile sf = createStoreFileAndReader(newFile);<a name="line.6405"></a>
+<span class="sourceLineNo">6406</span>          sf.closeStoreFile(evictOnClose);<a name="line.6406"></a>
+<span class="sourceLineNo">6407</span>          sfs.add(sf);<a name="line.6407"></a>
+<span class="sourceLineNo">6408</span>        }<a name="line.6408"></a>
+<span class="sourceLineNo">6409</span>        return sfs;<a name="line.6409"></a>
+<span class="sourceLineNo">6410</span>      }<a name="line.6410"></a>
+<span class="sourceLineNo">6411</span>      return super.doCompaction(cr, filesToCompact, user, compactionStartTime, newFiles);<a name="line.6411"></a>
+<span class="sourceLineNo">6412</span>    }<a name="line.6412"></a>
+<span class="sourceLineNo">6413</span>  }<a name="line.6413"></a>
+<span class="sourceLineNo">6414</span>}<a name="line.6414"></a>
 
 
 
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.GetTillDoneOrException.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.GetTillDoneOrException.html
index ddde350..77be719 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.GetTillDoneOrException.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.GetTillDoneOrException.html
@@ -112,68 +112,68 @@
 <span class="sourceLineNo">104</span>import org.apache.hadoop.hbase.Waiter;<a name="line.104"></a>
 <span class="sourceLineNo">105</span>import org.apache.hadoop.hbase.client.Append;<a name="line.105"></a>
 <span class="sourceLineNo">106</span>import org.apache.hadoop.hbase.client.ColumnFamilyDescriptor;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.apache.hadoop.hbase.client.Get;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.110"></a>
-<span class="sourceLineNo">111</span>import org.apache.hadoop.hbase.client.Mutation;<a name="line.111"></a>
-<span class="sourceLineNo">112</span>import org.apache.hadoop.hbase.client.Put;<a name="line.112"></a>
-<span class="sourceLineNo">113</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.113"></a>
-<span class="sourceLineNo">114</span>import org.apache.hadoop.hbase.client.RegionInfoBuilder;<a name="line.114"></a>
-<span class="sourceLineNo">115</span>import org.apache.hadoop.hbase.client.Result;<a name="line.115"></a>
-<span class="sourceLineNo">116</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.116"></a>
-<span class="sourceLineNo">117</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.117"></a>
-<span class="sourceLineNo">118</span>import org.apache.hadoop.hbase.client.Table;<a name="line.118"></a>
-<span class="sourceLineNo">119</span>import org.apache.hadoop.hbase.client.TableDescriptor;<a name="line.119"></a>
-<span class="sourceLineNo">120</span>import org.apache.hadoop.hbase.coprocessor.CoprocessorHost;<a name="line.120"></a>
-<span class="sourceLineNo">121</span>import org.apache.hadoop.hbase.exceptions.FailedSanityCheckException;<a name="line.121"></a>
-<span class="sourceLineNo">122</span>import org.apache.hadoop.hbase.filter.BigDecimalComparator;<a name="line.122"></a>
-<span class="sourceLineNo">123</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.123"></a>
-<span class="sourceLineNo">124</span>import org.apache.hadoop.hbase.filter.ColumnCountGetFilter;<a name="line.124"></a>
-<span class="sourceLineNo">125</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.125"></a>
-<span class="sourceLineNo">126</span>import org.apache.hadoop.hbase.filter.FilterBase;<a name="line.126"></a>
-<span class="sourceLineNo">127</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.127"></a>
-<span class="sourceLineNo">128</span>import org.apache.hadoop.hbase.filter.NullComparator;<a name="line.128"></a>
-<span class="sourceLineNo">129</span>import org.apache.hadoop.hbase.filter.PrefixFilter;<a name="line.129"></a>
-<span class="sourceLineNo">130</span>import org.apache.hadoop.hbase.filter.SingleColumnValueExcludeFilter;<a name="line.130"></a>
-<span class="sourceLineNo">131</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.131"></a>
-<span class="sourceLineNo">132</span>import org.apache.hadoop.hbase.filter.SubstringComparator;<a name="line.132"></a>
-<span class="sourceLineNo">133</span>import org.apache.hadoop.hbase.filter.ValueFilter;<a name="line.133"></a>
-<span class="sourceLineNo">134</span>import org.apache.hadoop.hbase.io.hfile.HFile;<a name="line.134"></a>
-<span class="sourceLineNo">135</span>import org.apache.hadoop.hbase.monitoring.MonitoredRPCHandler;<a name="line.135"></a>
-<span class="sourceLineNo">136</span>import org.apache.hadoop.hbase.monitoring.MonitoredTask;<a name="line.136"></a>
-<span class="sourceLineNo">137</span>import org.apache.hadoop.hbase.monitoring.TaskMonitor;<a name="line.137"></a>
-<span class="sourceLineNo">138</span>import org.apache.hadoop.hbase.regionserver.HRegion.MutationBatchOperation;<a name="line.138"></a>
-<span class="sourceLineNo">139</span>import org.apache.hadoop.hbase.regionserver.HRegion.RegionScannerImpl;<a name="line.139"></a>
-<span class="sourceLineNo">140</span>import org.apache.hadoop.hbase.regionserver.Region.RowLock;<a name="line.140"></a>
-<span class="sourceLineNo">141</span>import org.apache.hadoop.hbase.regionserver.TestHStore.FaultyFileSystem;<a name="line.141"></a>
-<span class="sourceLineNo">142</span>import org.apache.hadoop.hbase.regionserver.compactions.CompactionRequestImpl;<a name="line.142"></a>
-<span class="sourceLineNo">143</span>import org.apache.hadoop.hbase.regionserver.wal.FSHLog;<a name="line.143"></a>
-<span class="sourceLineNo">144</span>import org.apache.hadoop.hbase.regionserver.wal.MetricsWALSource;<a name="line.144"></a>
-<span class="sourceLineNo">145</span>import org.apache.hadoop.hbase.regionserver.wal.WALUtil;<a name="line.145"></a>
-<span class="sourceLineNo">146</span>import org.apache.hadoop.hbase.replication.regionserver.ReplicationObserver;<a name="line.146"></a>
-<span class="sourceLineNo">147</span>import org.apache.hadoop.hbase.security.User;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>import org.apache.hadoop.hbase.test.MetricsAssertHelper;<a name="line.148"></a>
-<span class="sourceLineNo">149</span>import org.apache.hadoop.hbase.testclassification.LargeTests;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>import org.apache.hadoop.hbase.testclassification.VerySlowRegionServerTests;<a name="line.150"></a>
-<span class="sourceLineNo">151</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.151"></a>
-<span class="sourceLineNo">152</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.152"></a>
-<span class="sourceLineNo">153</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManagerTestHelper;<a name="line.153"></a>
-<span class="sourceLineNo">154</span>import org.apache.hadoop.hbase.util.FSUtils;<a name="line.154"></a>
-<span class="sourceLineNo">155</span>import org.apache.hadoop.hbase.util.IncrementingEnvironmentEdge;<a name="line.155"></a>
-<span class="sourceLineNo">156</span>import org.apache.hadoop.hbase.util.ManualEnvironmentEdge;<a name="line.156"></a>
-<span class="sourceLineNo">157</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.157"></a>
-<span class="sourceLineNo">158</span>import org.apache.hadoop.hbase.wal.AbstractFSWALProvider;<a name="line.158"></a>
-<span class="sourceLineNo">159</span>import org.apache.hadoop.hbase.wal.FaultyFSLog;<a name="line.159"></a>
-<span class="sourceLineNo">160</span>import org.apache.hadoop.hbase.wal.NettyAsyncFSWALConfigHelper;<a name="line.160"></a>
-<span class="sourceLineNo">161</span>import org.apache.hadoop.hbase.wal.WAL;<a name="line.161"></a>
-<span class="sourceLineNo">162</span>import org.apache.hadoop.hbase.wal.WALEdit;<a name="line.162"></a>
-<span class="sourceLineNo">163</span>import org.apache.hadoop.hbase.wal.WALFactory;<a name="line.163"></a>
-<span class="sourceLineNo">164</span>import org.apache.hadoop.hbase.wal.WALKeyImpl;<a name="line.164"></a>
-<span class="sourceLineNo">165</span>import org.apache.hadoop.hbase.wal.WALProvider;<a name="line.165"></a>
-<span class="sourceLineNo">166</span>import org.apache.hadoop.hbase.wal.WALProvider.Writer;<a name="line.166"></a>
-<span class="sourceLineNo">167</span>import org.apache.hadoop.hbase.wal.WALSplitUtil;<a name="line.167"></a>
-<span class="sourceLineNo">168</span>import org.apache.hadoop.hbase.wal.WALSplitter;<a name="line.168"></a>
+<span class="sourceLineNo">107</span>import org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>import org.apache.hadoop.hbase.client.Get;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.111"></a>
+<span class="sourceLineNo">112</span>import org.apache.hadoop.hbase.client.Mutation;<a name="line.112"></a>
+<span class="sourceLineNo">113</span>import org.apache.hadoop.hbase.client.Put;<a name="line.113"></a>
+<span class="sourceLineNo">114</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.114"></a>
+<span class="sourceLineNo">115</span>import org.apache.hadoop.hbase.client.RegionInfoBuilder;<a name="line.115"></a>
+<span class="sourceLineNo">116</span>import org.apache.hadoop.hbase.client.Result;<a name="line.116"></a>
+<span class="sourceLineNo">117</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.117"></a>
+<span class="sourceLineNo">118</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.118"></a>
+<span class="sourceLineNo">119</span>import org.apache.hadoop.hbase.client.Table;<a name="line.119"></a>
+<span class="sourceLineNo">120</span>import org.apache.hadoop.hbase.client.TableDescriptor;<a name="line.120"></a>
+<span class="sourceLineNo">121</span>import org.apache.hadoop.hbase.coprocessor.CoprocessorHost;<a name="line.121"></a>
+<span class="sourceLineNo">122</span>import org.apache.hadoop.hbase.exceptions.FailedSanityCheckException;<a name="line.122"></a>
+<span class="sourceLineNo">123</span>import org.apache.hadoop.hbase.filter.BigDecimalComparator;<a name="line.123"></a>
+<span class="sourceLineNo">124</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.124"></a>
+<span class="sourceLineNo">125</span>import org.apache.hadoop.hbase.filter.ColumnCountGetFilter;<a name="line.125"></a>
+<span class="sourceLineNo">126</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.126"></a>
+<span class="sourceLineNo">127</span>import org.apache.hadoop.hbase.filter.FilterBase;<a name="line.127"></a>
+<span class="sourceLineNo">128</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.128"></a>
+<span class="sourceLineNo">129</span>import org.apache.hadoop.hbase.filter.NullComparator;<a name="line.129"></a>
+<span class="sourceLineNo">130</span>import org.apache.hadoop.hbase.filter.PrefixFilter;<a name="line.130"></a>
+<span class="sourceLineNo">131</span>import org.apache.hadoop.hbase.filter.SingleColumnValueExcludeFilter;<a name="line.131"></a>
+<span class="sourceLineNo">132</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.132"></a>
+<span class="sourceLineNo">133</span>import org.apache.hadoop.hbase.filter.SubstringComparator;<a name="line.133"></a>
+<span class="sourceLineNo">134</span>import org.apache.hadoop.hbase.filter.ValueFilter;<a name="line.134"></a>
+<span class="sourceLineNo">135</span>import org.apache.hadoop.hbase.io.hfile.HFile;<a name="line.135"></a>
+<span class="sourceLineNo">136</span>import org.apache.hadoop.hbase.monitoring.MonitoredRPCHandler;<a name="line.136"></a>
+<span class="sourceLineNo">137</span>import org.apache.hadoop.hbase.monitoring.MonitoredTask;<a name="line.137"></a>
+<span class="sourceLineNo">138</span>import org.apache.hadoop.hbase.monitoring.TaskMonitor;<a name="line.138"></a>
+<span class="sourceLineNo">139</span>import org.apache.hadoop.hbase.regionserver.HRegion.MutationBatchOperation;<a name="line.139"></a>
+<span class="sourceLineNo">140</span>import org.apache.hadoop.hbase.regionserver.HRegion.RegionScannerImpl;<a name="line.140"></a>
+<span class="sourceLineNo">141</span>import org.apache.hadoop.hbase.regionserver.Region.RowLock;<a name="line.141"></a>
+<span class="sourceLineNo">142</span>import org.apache.hadoop.hbase.regionserver.TestHStore.FaultyFileSystem;<a name="line.142"></a>
+<span class="sourceLineNo">143</span>import org.apache.hadoop.hbase.regionserver.compactions.CompactionRequestImpl;<a name="line.143"></a>
+<span class="sourceLineNo">144</span>import org.apache.hadoop.hbase.regionserver.wal.FSHLog;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>import org.apache.hadoop.hbase.regionserver.wal.MetricsWALSource;<a name="line.145"></a>
+<span class="sourceLineNo">146</span>import org.apache.hadoop.hbase.regionserver.wal.WALUtil;<a name="line.146"></a>
+<span class="sourceLineNo">147</span>import org.apache.hadoop.hbase.replication.regionserver.ReplicationObserver;<a name="line.147"></a>
+<span class="sourceLineNo">148</span>import org.apache.hadoop.hbase.security.User;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>import org.apache.hadoop.hbase.test.MetricsAssertHelper;<a name="line.149"></a>
+<span class="sourceLineNo">150</span>import org.apache.hadoop.hbase.testclassification.LargeTests;<a name="line.150"></a>
+<span class="sourceLineNo">151</span>import org.apache.hadoop.hbase.testclassification.VerySlowRegionServerTests;<a name="line.151"></a>
+<span class="sourceLineNo">152</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.152"></a>
+<span class="sourceLineNo">153</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.153"></a>
+<span class="sourceLineNo">154</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManagerTestHelper;<a name="line.154"></a>
+<span class="sourceLineNo">155</span>import org.apache.hadoop.hbase.util.FSUtils;<a name="line.155"></a>
+<span class="sourceLineNo">156</span>import org.apache.hadoop.hbase.util.IncrementingEnvironmentEdge;<a name="line.156"></a>
+<span class="sourceLineNo">157</span>import org.apache.hadoop.hbase.util.ManualEnvironmentEdge;<a name="line.157"></a>
+<span class="sourceLineNo">158</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.158"></a>
+<span class="sourceLineNo">159</span>import org.apache.hadoop.hbase.wal.AbstractFSWALProvider;<a name="line.159"></a>
+<span class="sourceLineNo">160</span>import org.apache.hadoop.hbase.wal.FaultyFSLog;<a name="line.160"></a>
+<span class="sourceLineNo">161</span>import org.apache.hadoop.hbase.wal.NettyAsyncFSWALConfigHelper;<a name="line.161"></a>
+<span class="sourceLineNo">162</span>import org.apache.hadoop.hbase.wal.WAL;<a name="line.162"></a>
+<span class="sourceLineNo">163</span>import org.apache.hadoop.hbase.wal.WALEdit;<a name="line.163"></a>
+<span class="sourceLineNo">164</span>import org.apache.hadoop.hbase.wal.WALFactory;<a name="line.164"></a>
+<span class="sourceLineNo">165</span>import org.apache.hadoop.hbase.wal.WALKeyImpl;<a name="line.165"></a>
+<span class="sourceLineNo">166</span>import org.apache.hadoop.hbase.wal.WALProvider;<a name="line.166"></a>
+<span class="sourceLineNo">167</span>import org.apache.hadoop.hbase.wal.WALProvider.Writer;<a name="line.167"></a>
+<span class="sourceLineNo">168</span>import org.apache.hadoop.hbase.wal.WALSplitUtil;<a name="line.168"></a>
 <span class="sourceLineNo">169</span>import org.apache.hadoop.metrics2.MetricsExecutor;<a name="line.169"></a>
 <span class="sourceLineNo">170</span>import org.junit.After;<a name="line.170"></a>
 <span class="sourceLineNo">171</span>import org.junit.Assert;<a name="line.171"></a>
@@ -409,6007 +409,6017 @@
 <span class="sourceLineNo">401</span>    String testName = "testMemstoreSizeAccountingWithFailedPostBatchMutate";<a name="line.401"></a>
 <span class="sourceLineNo">402</span>    FileSystem fs = FileSystem.get(CONF);<a name="line.402"></a>
 <span class="sourceLineNo">403</span>    Path rootDir = new Path(dir + testName);<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    FSHLog hLog = new FSHLog(fs, rootDir, testName, CONF);<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    hLog.init();<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, hLog,<a name="line.406"></a>
-<span class="sourceLineNo">407</span>        COLUMN_FAMILY_BYTES);<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    assertEquals(0, region.getMemStoreDataSize());<a name="line.409"></a>
-<span class="sourceLineNo">410</span><a name="line.410"></a>
-<span class="sourceLineNo">411</span>    // Put one value<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    byte [] value = Bytes.toBytes(method);<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    Put put = new Put(value);<a name="line.413"></a>
-<span class="sourceLineNo">414</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.414"></a>
-<span class="sourceLineNo">415</span>    region.put(put);<a name="line.415"></a>
-<span class="sourceLineNo">416</span>    long onePutSize = region.getMemStoreDataSize();<a name="line.416"></a>
-<span class="sourceLineNo">417</span>    assertTrue(onePutSize &gt; 0);<a name="line.417"></a>
-<span class="sourceLineNo">418</span><a name="line.418"></a>
-<span class="sourceLineNo">419</span>    RegionCoprocessorHost mockedCPHost = Mockito.mock(RegionCoprocessorHost.class);<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    doThrow(new IOException())<a name="line.420"></a>
-<span class="sourceLineNo">421</span>       .when(mockedCPHost).postBatchMutate(Mockito.&lt;MiniBatchOperationInProgress&lt;Mutation&gt;&gt;any());<a name="line.421"></a>
-<span class="sourceLineNo">422</span>    region.setCoprocessorHost(mockedCPHost);<a name="line.422"></a>
-<span class="sourceLineNo">423</span><a name="line.423"></a>
-<span class="sourceLineNo">424</span>    put = new Put(value);<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("dfg"), value);<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    try {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      region.put(put);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>      fail("Should have failed with IOException");<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    } catch (IOException expected) {<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    }<a name="line.430"></a>
-<span class="sourceLineNo">431</span>    long expectedSize = onePutSize * 2;<a name="line.431"></a>
-<span class="sourceLineNo">432</span>    assertEquals("memstoreSize should be incremented",<a name="line.432"></a>
-<span class="sourceLineNo">433</span>        expectedSize, region.getMemStoreDataSize());<a name="line.433"></a>
-<span class="sourceLineNo">434</span>    assertEquals("flushable size should be incremented",<a name="line.434"></a>
-<span class="sourceLineNo">435</span>        expectedSize, store.getFlushableSize().getDataSize());<a name="line.435"></a>
-<span class="sourceLineNo">436</span><a name="line.436"></a>
-<span class="sourceLineNo">437</span>    region.setCoprocessorHost(null);<a name="line.437"></a>
-<span class="sourceLineNo">438</span>  }<a name="line.438"></a>
-<span class="sourceLineNo">439</span><a name="line.439"></a>
-<span class="sourceLineNo">440</span>  /**<a name="line.440"></a>
-<span class="sourceLineNo">441</span>   * A test case of HBASE-21041<a name="line.441"></a>
-<span class="sourceLineNo">442</span>   * @throws Exception Exception<a name="line.442"></a>
-<span class="sourceLineNo">443</span>   */<a name="line.443"></a>
-<span class="sourceLineNo">444</span>  @Test<a name="line.444"></a>
-<span class="sourceLineNo">445</span>  public void testFlushAndMemstoreSizeCounting() throws Exception {<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    byte[] family = Bytes.toBytes("family");<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.447"></a>
-<span class="sourceLineNo">448</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.448"></a>
-<span class="sourceLineNo">449</span>    try {<a name="line.449"></a>
-<span class="sourceLineNo">450</span>      for (byte[] row : HBaseTestingUtility.ROWS) {<a name="line.450"></a>
-<span class="sourceLineNo">451</span>        Put put = new Put(row);<a name="line.451"></a>
-<span class="sourceLineNo">452</span>        put.addColumn(family, family, row);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>        region.put(put);<a name="line.453"></a>
-<span class="sourceLineNo">454</span>      }<a name="line.454"></a>
-<span class="sourceLineNo">455</span>      region.flush(true);<a name="line.455"></a>
-<span class="sourceLineNo">456</span>      // After flush, data size should be zero<a name="line.456"></a>
-<span class="sourceLineNo">457</span>      assertEquals(0, region.getMemStoreDataSize());<a name="line.457"></a>
-<span class="sourceLineNo">458</span>      // After flush, a new active mutable segment is created, so the heap size<a name="line.458"></a>
-<span class="sourceLineNo">459</span>      // should equal to MutableSegment.DEEP_OVERHEAD<a name="line.459"></a>
-<span class="sourceLineNo">460</span>      assertEquals(MutableSegment.DEEP_OVERHEAD, region.getMemStoreHeapSize());<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      // After flush, offheap should be zero<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      assertEquals(0, region.getMemStoreOffHeapSize());<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    } finally {<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.464"></a>
-<span class="sourceLineNo">465</span>      this.region = null;<a name="line.465"></a>
-<span class="sourceLineNo">466</span>      wals.close();<a name="line.466"></a>
-<span class="sourceLineNo">467</span>    }<a name="line.467"></a>
-<span class="sourceLineNo">468</span>  }<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>   * Test we do not lose data if we fail a flush and then close.<a name="line.471"></a>
-<span class="sourceLineNo">472</span>   * Part of HBase-10466.  Tests the following from the issue description:<a name="line.472"></a>
-<span class="sourceLineNo">473</span>   * "Bug 1: Wrong calculation of HRegion.memstoreSize: When a flush fails, data to be flushed is<a name="line.473"></a>
-<span class="sourceLineNo">474</span>   * kept in each MemStore's snapshot and wait for next flush attempt to continue on it. But when<a name="line.474"></a>
-<span class="sourceLineNo">475</span>   * the next flush succeeds, the counter of total memstore size in HRegion is always deduced by<a name="line.475"></a>
-<span class="sourceLineNo">476</span>   * the sum of current memstore sizes instead of snapshots left from previous failed flush. This<a name="line.476"></a>
-<span class="sourceLineNo">477</span>   * calculation is problematic that almost every time there is failed flush, HRegion.memstoreSize<a name="line.477"></a>
-<span class="sourceLineNo">478</span>   * gets reduced by a wrong value. If region flush could not proceed for a couple cycles, the size<a name="line.478"></a>
-<span class="sourceLineNo">479</span>   * in current memstore could be much larger than the snapshot. It's likely to drift memstoreSize<a name="line.479"></a>
-<span class="sourceLineNo">480</span>   * much smaller than expected. In extreme case, if the error accumulates to even bigger than<a name="line.480"></a>
-<span class="sourceLineNo">481</span>   * HRegion's memstore size limit, any further flush is skipped because flush does not do anything<a name="line.481"></a>
-<span class="sourceLineNo">482</span>   * if memstoreSize is not larger than 0."<a name="line.482"></a>
-<span class="sourceLineNo">483</span>   * @throws Exception<a name="line.483"></a>
-<span class="sourceLineNo">484</span>   */<a name="line.484"></a>
-<span class="sourceLineNo">485</span>  @Test<a name="line.485"></a>
-<span class="sourceLineNo">486</span>  public void testFlushSizeAccounting() throws Exception {<a name="line.486"></a>
-<span class="sourceLineNo">487</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    // Only retry once.<a name="line.489"></a>
-<span class="sourceLineNo">490</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.490"></a>
-<span class="sourceLineNo">491</span>    final User user =<a name="line.491"></a>
-<span class="sourceLineNo">492</span>      User.createUserForTesting(conf, method, new String[]{"foo"});<a name="line.492"></a>
-<span class="sourceLineNo">493</span>    // Inject our faulty LocalFileSystem<a name="line.493"></a>
-<span class="sourceLineNo">494</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.494"></a>
-<span class="sourceLineNo">495</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.495"></a>
-<span class="sourceLineNo">496</span>      @Override<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      public Object run() throws Exception {<a name="line.497"></a>
-<span class="sourceLineNo">498</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.498"></a>
-<span class="sourceLineNo">499</span>        FileSystem fs = FileSystem.get(conf);<a name="line.499"></a>
-<span class="sourceLineNo">500</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.500"></a>
-<span class="sourceLineNo">501</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.501"></a>
-<span class="sourceLineNo">502</span>        HRegion region = null;<a name="line.502"></a>
-<span class="sourceLineNo">503</span>        try {<a name="line.503"></a>
-<span class="sourceLineNo">504</span>          // Initialize region<a name="line.504"></a>
-<span class="sourceLineNo">505</span>          region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, wal,<a name="line.505"></a>
-<span class="sourceLineNo">506</span>              COLUMN_FAMILY_BYTES);<a name="line.506"></a>
-<span class="sourceLineNo">507</span>          long size = region.getMemStoreDataSize();<a name="line.507"></a>
-<span class="sourceLineNo">508</span>          Assert.assertEquals(0, size);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.509"></a>
-<span class="sourceLineNo">510</span>          Put p1 = new Put(row);<a name="line.510"></a>
-<span class="sourceLineNo">511</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[]) null));<a name="line.511"></a>
-<span class="sourceLineNo">512</span>          region.put(p1);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>          final long sizeOfOnePut = region.getMemStoreDataSize();<a name="line.513"></a>
-<span class="sourceLineNo">514</span>          // Fail a flush which means the current memstore will hang out as memstore 'snapshot'.<a name="line.514"></a>
-<span class="sourceLineNo">515</span>          try {<a name="line.515"></a>
-<span class="sourceLineNo">516</span>            LOG.info("Flushing");<a name="line.516"></a>
-<span class="sourceLineNo">517</span>            region.flush(true);<a name="line.517"></a>
-<span class="sourceLineNo">518</span>            Assert.fail("Didn't bubble up IOE!");<a name="line.518"></a>
-<span class="sourceLineNo">519</span>          } catch (DroppedSnapshotException dse) {<a name="line.519"></a>
-<span class="sourceLineNo">520</span>            // What we are expecting<a name="line.520"></a>
-<span class="sourceLineNo">521</span>            region.closing.set(false); // this is needed for the rest of the test to work<a name="line.521"></a>
-<span class="sourceLineNo">522</span>          }<a name="line.522"></a>
-<span class="sourceLineNo">523</span>          // Make it so all writes succeed from here on out<a name="line.523"></a>
-<span class="sourceLineNo">524</span>          ffs.fault.set(false);<a name="line.524"></a>
-<span class="sourceLineNo">525</span>          // Check sizes.  Should still be the one entry.<a name="line.525"></a>
-<span class="sourceLineNo">526</span>          Assert.assertEquals(sizeOfOnePut, region.getMemStoreDataSize());<a name="line.526"></a>
-<span class="sourceLineNo">527</span>          // Now add two entries so that on this next flush that fails, we can see if we<a name="line.527"></a>
-<span class="sourceLineNo">528</span>          // subtract the right amount, the snapshot size only.<a name="line.528"></a>
-<span class="sourceLineNo">529</span>          Put p2 = new Put(row);<a name="line.529"></a>
-<span class="sourceLineNo">530</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.530"></a>
-<span class="sourceLineNo">531</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.531"></a>
-<span class="sourceLineNo">532</span>          region.put(p2);<a name="line.532"></a>
-<span class="sourceLineNo">533</span>          long expectedSize = sizeOfOnePut * 3;<a name="line.533"></a>
-<span class="sourceLineNo">534</span>          Assert.assertEquals(expectedSize, region.getMemStoreDataSize());<a name="line.534"></a>
-<span class="sourceLineNo">535</span>          // Do a successful flush.  It will clear the snapshot only.  Thats how flushes work.<a name="line.535"></a>
-<span class="sourceLineNo">536</span>          // If already a snapshot, we clear it else we move the memstore to be snapshot and flush<a name="line.536"></a>
-<span class="sourceLineNo">537</span>          // it<a name="line.537"></a>
-<span class="sourceLineNo">538</span>          region.flush(true);<a name="line.538"></a>
-<span class="sourceLineNo">539</span>          // Make sure our memory accounting is right.<a name="line.539"></a>
-<span class="sourceLineNo">540</span>          Assert.assertEquals(sizeOfOnePut * 2, region.getMemStoreDataSize());<a name="line.540"></a>
-<span class="sourceLineNo">541</span>        } finally {<a name="line.541"></a>
-<span class="sourceLineNo">542</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.542"></a>
-<span class="sourceLineNo">543</span>        }<a name="line.543"></a>
-<span class="sourceLineNo">544</span>        return null;<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>    FileSystem.closeAllForUGI(user.getUGI());<a name="line.547"></a>
-<span class="sourceLineNo">548</span>  }<a name="line.548"></a>
-<span class="sourceLineNo">549</span><a name="line.549"></a>
-<span class="sourceLineNo">550</span>  @Test<a name="line.550"></a>
-<span class="sourceLineNo">551</span>  public void testCloseWithFailingFlush() throws Exception {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    // Only retry once.<a name="line.554"></a>
-<span class="sourceLineNo">555</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.555"></a>
-<span class="sourceLineNo">556</span>    final User user =<a name="line.556"></a>
-<span class="sourceLineNo">557</span>      User.createUserForTesting(conf, this.method, new String[]{"foo"});<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    // Inject our faulty LocalFileSystem<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      @Override<a name="line.561"></a>
-<span class="sourceLineNo">562</span>      public Object run() throws Exception {<a name="line.562"></a>
-<span class="sourceLineNo">563</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.563"></a>
-<span class="sourceLineNo">564</span>        FileSystem fs = FileSystem.get(conf);<a name="line.564"></a>
-<span class="sourceLineNo">565</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.565"></a>
-<span class="sourceLineNo">566</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.566"></a>
-<span class="sourceLineNo">567</span>        HRegion region = null;<a name="line.567"></a>
-<span class="sourceLineNo">568</span>        try {<a name="line.568"></a>
-<span class="sourceLineNo">569</span>          // Initialize region<a name="line.569"></a>
-<span class="sourceLineNo">570</span>          region = initHRegion(tableName, null, null, false,<a name="line.570"></a>
-<span class="sourceLineNo">571</span>              Durability.SYNC_WAL, wal, COLUMN_FAMILY_BYTES);<a name="line.571"></a>
-<span class="sourceLineNo">572</span>          long size = region.getMemStoreDataSize();<a name="line.572"></a>
-<span class="sourceLineNo">573</span>          Assert.assertEquals(0, size);<a name="line.573"></a>
-<span class="sourceLineNo">574</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.574"></a>
-<span class="sourceLineNo">575</span>          Put p1 = new Put(row);<a name="line.575"></a>
-<span class="sourceLineNo">576</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[])null));<a name="line.576"></a>
-<span class="sourceLineNo">577</span>          region.put(p1);<a name="line.577"></a>
-<span class="sourceLineNo">578</span>          // Manufacture an outstanding snapshot -- fake a failed flush by doing prepare step only.<a name="line.578"></a>
-<span class="sourceLineNo">579</span>          HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>          StoreFlushContext storeFlushCtx =<a name="line.580"></a>
-<span class="sourceLineNo">581</span>              store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY);<a name="line.581"></a>
-<span class="sourceLineNo">582</span>          storeFlushCtx.prepare();<a name="line.582"></a>
-<span class="sourceLineNo">583</span>          // Now add two entries to the foreground memstore.<a name="line.583"></a>
-<span class="sourceLineNo">584</span>          Put p2 = new Put(row);<a name="line.584"></a>
-<span class="sourceLineNo">585</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.585"></a>
-<span class="sourceLineNo">586</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.586"></a>
-<span class="sourceLineNo">587</span>          region.put(p2);<a name="line.587"></a>
-<span class="sourceLineNo">588</span>          // Now try close on top of a failing flush.<a name="line.588"></a>
-<span class="sourceLineNo">589</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.589"></a>
-<span class="sourceLineNo">590</span>          region = null;<a name="line.590"></a>
-<span class="sourceLineNo">591</span>          fail();<a name="line.591"></a>
-<span class="sourceLineNo">592</span>        } catch (DroppedSnapshotException dse) {<a name="line.592"></a>
-<span class="sourceLineNo">593</span>          // Expected<a name="line.593"></a>
-<span class="sourceLineNo">594</span>          LOG.info("Expected DroppedSnapshotException");<a name="line.594"></a>
-<span class="sourceLineNo">595</span>        } finally {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>          // Make it so all writes succeed from here on out so can close clean<a name="line.596"></a>
-<span class="sourceLineNo">597</span>          ffs.fault.set(false);<a name="line.597"></a>
-<span class="sourceLineNo">598</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.598"></a>
-<span class="sourceLineNo">599</span>        }<a name="line.599"></a>
-<span class="sourceLineNo">600</span>        return null;<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      }<a name="line.601"></a>
-<span class="sourceLineNo">602</span>    });<a name="line.602"></a>
-<span class="sourceLineNo">603</span>    FileSystem.closeAllForUGI(user.getUGI());<a name="line.603"></a>
-<span class="sourceLineNo">604</span>  }<a name="line.604"></a>
-<span class="sourceLineNo">605</span><a name="line.605"></a>
-<span class="sourceLineNo">606</span>  @Test<a name="line.606"></a>
-<span class="sourceLineNo">607</span>  public void testCompactionAffectedByScanners() throws Exception {<a name="line.607"></a>
-<span class="sourceLineNo">608</span>    byte[] family = Bytes.toBytes("family");<a name="line.608"></a>
-<span class="sourceLineNo">609</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.609"></a>
-<span class="sourceLineNo">610</span><a name="line.610"></a>
-<span class="sourceLineNo">611</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.612"></a>
-<span class="sourceLineNo">613</span>    region.put(put);<a name="line.613"></a>
-<span class="sourceLineNo">614</span>    region.flush(true);<a name="line.614"></a>
-<span class="sourceLineNo">615</span><a name="line.615"></a>
-<span class="sourceLineNo">616</span>    Scan scan = new Scan();<a name="line.616"></a>
-<span class="sourceLineNo">617</span>    scan.setMaxVersions(3);<a name="line.617"></a>
-<span class="sourceLineNo">618</span>    // open the first scanner<a name="line.618"></a>
-<span class="sourceLineNo">619</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.619"></a>
-<span class="sourceLineNo">620</span><a name="line.620"></a>
-<span class="sourceLineNo">621</span>    Delete delete = new Delete(Bytes.toBytes("r1"));<a name="line.621"></a>
-<span class="sourceLineNo">622</span>    region.delete(delete);<a name="line.622"></a>
-<span class="sourceLineNo">623</span>    region.flush(true);<a name="line.623"></a>
-<span class="sourceLineNo">624</span><a name="line.624"></a>
-<span class="sourceLineNo">625</span>    // open the second scanner<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    RegionScanner scanner2 = region.getScanner(scan);<a name="line.626"></a>
-<span class="sourceLineNo">627</span><a name="line.627"></a>
-<span class="sourceLineNo">628</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.628"></a>
-<span class="sourceLineNo">629</span><a name="line.629"></a>
-<span class="sourceLineNo">630</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.630"></a>
-<span class="sourceLineNo">631</span><a name="line.631"></a>
-<span class="sourceLineNo">632</span>    // make a major compaction<a name="line.632"></a>
-<span class="sourceLineNo">633</span>    region.compact(true);<a name="line.633"></a>
-<span class="sourceLineNo">634</span><a name="line.634"></a>
-<span class="sourceLineNo">635</span>    // open the third scanner<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    RegionScanner scanner3 = region.getScanner(scan);<a name="line.636"></a>
-<span class="sourceLineNo">637</span><a name="line.637"></a>
-<span class="sourceLineNo">638</span>    // get data from scanner 1, 2, 3 after major compaction<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    scanner1.next(results);<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    System.out.println(results);<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    assertEquals(1, results.size());<a name="line.641"></a>
-<span class="sourceLineNo">642</span><a name="line.642"></a>
-<span class="sourceLineNo">643</span>    results.clear();<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    scanner2.next(results);<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    System.out.println(results);<a name="line.645"></a>
-<span class="sourceLineNo">646</span>    assertEquals(0, results.size());<a name="line.646"></a>
-<span class="sourceLineNo">647</span><a name="line.647"></a>
-<span class="sourceLineNo">648</span>    results.clear();<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    scanner3.next(results);<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    System.out.println(results);<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    assertEquals(0, results.size());<a name="line.651"></a>
-<span class="sourceLineNo">652</span>  }<a name="line.652"></a>
-<span class="sourceLineNo">653</span><a name="line.653"></a>
-<span class="sourceLineNo">654</span>  @Test<a name="line.654"></a>
-<span class="sourceLineNo">655</span>  public void testToShowNPEOnRegionScannerReseek() throws Exception {<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    byte[] family = Bytes.toBytes("family");<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.657"></a>
-<span class="sourceLineNo">658</span><a name="line.658"></a>
-<span class="sourceLineNo">659</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.659"></a>
-<span class="sourceLineNo">660</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.660"></a>
-<span class="sourceLineNo">661</span>    region.put(put);<a name="line.661"></a>
-<span class="sourceLineNo">662</span>    put = new Put(Bytes.toBytes("r2"));<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.663"></a>
-<span class="sourceLineNo">664</span>    region.put(put);<a name="line.664"></a>
-<span class="sourceLineNo">665</span>    region.flush(true);<a name="line.665"></a>
-<span class="sourceLineNo">666</span><a name="line.666"></a>
-<span class="sourceLineNo">667</span>    Scan scan = new Scan();<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    scan.setMaxVersions(3);<a name="line.668"></a>
-<span class="sourceLineNo">669</span>    // open the first scanner<a name="line.669"></a>
-<span class="sourceLineNo">670</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.670"></a>
-<span class="sourceLineNo">671</span><a name="line.671"></a>
-<span class="sourceLineNo">672</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.672"></a>
-<span class="sourceLineNo">673</span><a name="line.673"></a>
-<span class="sourceLineNo">674</span>    region.compact(true);<a name="line.674"></a>
-<span class="sourceLineNo">675</span><a name="line.675"></a>
-<span class="sourceLineNo">676</span>    scanner1.reseek(Bytes.toBytes("r2"));<a name="line.676"></a>
-<span class="sourceLineNo">677</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.677"></a>
-<span class="sourceLineNo">678</span>    scanner1.next(results);<a name="line.678"></a>
-<span class="sourceLineNo">679</span>    Cell keyValue = results.get(0);<a name="line.679"></a>
-<span class="sourceLineNo">680</span>    Assert.assertTrue(Bytes.compareTo(CellUtil.cloneRow(keyValue), Bytes.toBytes("r2")) == 0);<a name="line.680"></a>
-<span class="sourceLineNo">681</span>    scanner1.close();<a name="line.681"></a>
-<span class="sourceLineNo">682</span>  }<a name="line.682"></a>
-<span class="sourceLineNo">683</span><a name="line.683"></a>
-<span class="sourceLineNo">684</span>  @Test<a name="line.684"></a>
-<span class="sourceLineNo">685</span>  public void testSkipRecoveredEditsReplay() throws Exception {<a name="line.685"></a>
-<span class="sourceLineNo">686</span>    byte[] family = Bytes.toBytes("family");<a name="line.686"></a>
-<span class="sourceLineNo">687</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.687"></a>
-<span class="sourceLineNo">688</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.688"></a>
-<span class="sourceLineNo">689</span>    try {<a name="line.689"></a>
-<span class="sourceLineNo">690</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.690"></a>
-<span class="sourceLineNo">691</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.691"></a>
-<span class="sourceLineNo">692</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.692"></a>
-<span class="sourceLineNo">693</span><a name="line.693"></a>
-<span class="sourceLineNo">694</span>      Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.694"></a>
-<span class="sourceLineNo">695</span><a name="line.695"></a>
-<span class="sourceLineNo">696</span>      long maxSeqId = 1050;<a name="line.696"></a>
-<span class="sourceLineNo">697</span>      long minSeqId = 1000;<a name="line.697"></a>
-<span class="sourceLineNo">698</span><a name="line.698"></a>
-<span class="sourceLineNo">699</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.699"></a>
-<span class="sourceLineNo">700</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.700"></a>
-<span class="sourceLineNo">701</span>        fs.create(recoveredEdits);<a name="line.701"></a>
-<span class="sourceLineNo">702</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.702"></a>
-<span class="sourceLineNo">703</span><a name="line.703"></a>
-<span class="sourceLineNo">704</span>        long time = System.nanoTime();<a name="line.704"></a>
-<span class="sourceLineNo">705</span>        WALEdit edit = new WALEdit();<a name="line.705"></a>
-<span class="sourceLineNo">706</span>        edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.706"></a>
-<span class="sourceLineNo">707</span>            .toBytes(i)));<a name="line.707"></a>
-<span class="sourceLineNo">708</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.708"></a>
-<span class="sourceLineNo">709</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.709"></a>
-<span class="sourceLineNo">710</span><a name="line.710"></a>
-<span class="sourceLineNo">711</span>        writer.close();<a name="line.711"></a>
-<span class="sourceLineNo">712</span>      }<a name="line.712"></a>
-<span class="sourceLineNo">713</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.713"></a>
-<span class="sourceLineNo">714</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.714"></a>
-<span class="sourceLineNo">715</span>      for (HStore store : region.getStores()) {<a name="line.715"></a>
-<span class="sourceLineNo">716</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), minSeqId - 1);<a name="line.716"></a>
-<span class="sourceLineNo">717</span>      }<a name="line.717"></a>
-<span class="sourceLineNo">718</span>      long seqId = region.replayRecoveredEditsIfAny(maxSeqIdInStores, null, status);<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      assertEquals(maxSeqId, seqId);<a name="line.719"></a>
-<span class="sourceLineNo">720</span>      region.getMVCC().advanceTo(seqId);<a name="line.720"></a>
-<span class="sourceLineNo">721</span>      Get get = new Get(row);<a name="line.721"></a>
-<span class="sourceLineNo">722</span>      Result result = region.get(get);<a name="line.722"></a>
-<span class="sourceLineNo">723</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.723"></a>
-<span class="sourceLineNo">724</span>        List&lt;Cell&gt; kvs = result.getColumnCells(family, Bytes.toBytes(i));<a name="line.724"></a>
-<span class="sourceLineNo">725</span>        assertEquals(1, kvs.size());<a name="line.725"></a>
-<span class="sourceLineNo">726</span>        assertArrayEquals(Bytes.toBytes(i), CellUtil.cloneValue(kvs.get(0)));<a name="line.726"></a>
-<span class="sourceLineNo">727</span>      }<a name="line.727"></a>
-<span class="sourceLineNo">728</span>    } finally {<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      this.region = null;<a name="line.730"></a>
-<span class="sourceLineNo">731</span>      wals.close();<a name="line.731"></a>
-<span class="sourceLineNo">732</span>    }<a name="line.732"></a>
-<span class="sourceLineNo">733</span>  }<a name="line.733"></a>
-<span class="sourceLineNo">734</span><a name="line.734"></a>
-<span class="sourceLineNo">735</span>  @Test<a name="line.735"></a>
-<span class="sourceLineNo">736</span>  public void testSkipRecoveredEditsReplaySomeIgnored() throws Exception {<a name="line.736"></a>
-<span class="sourceLineNo">737</span>    byte[] family = Bytes.toBytes("family");<a name="line.737"></a>
-<span class="sourceLineNo">738</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.738"></a>
-<span class="sourceLineNo">739</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.739"></a>
-<span class="sourceLineNo">740</span>    try {<a name="line.740"></a>
-<span class="sourceLineNo">741</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.741"></a>
-<span class="sourceLineNo">742</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.742"></a>
-<span class="sourceLineNo">743</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.743"></a>
-<span class="sourceLineNo">744</span><a name="line.744"></a>
-<span class="sourceLineNo">745</span>      Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.745"></a>
-<span class="sourceLineNo">746</span><a name="line.746"></a>
-<span class="sourceLineNo">747</span>      long maxSeqId = 1050;<a name="line.747"></a>
-<span class="sourceLineNo">748</span>      long minSeqId = 1000;<a name="line.748"></a>
-<span class="sourceLineNo">749</span><a name="line.749"></a>
-<span class="sourceLineNo">750</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.750"></a>
-<span class="sourceLineNo">751</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.751"></a>
-<span class="sourceLineNo">752</span>        fs.create(recoveredEdits);<a name="line.752"></a>
-<span class="sourceLineNo">753</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.753"></a>
-<span class="sourceLineNo">754</span><a name="line.754"></a>
-<span class="sourceLineNo">755</span>        long time = System.nanoTime();<a name="line.755"></a>
-<span class="sourceLineNo">756</span>        WALEdit edit = new WALEdit();<a name="line.756"></a>
-<span class="sourceLineNo">757</span>        edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.757"></a>
-<span class="sourceLineNo">758</span>            .toBytes(i)));<a name="line.758"></a>
-<span class="sourceLineNo">759</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.759"></a>
-<span class="sourceLineNo">760</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.760"></a>
-<span class="sourceLineNo">761</span><a name="line.761"></a>
-<span class="sourceLineNo">762</span>        writer.close();<a name="line.762"></a>
-<span class="sourceLineNo">763</span>      }<a name="line.763"></a>
-<span class="sourceLineNo">764</span>      long recoverSeqId = 1030;<a name="line.764"></a>
-<span class="sourceLineNo">765</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.766"></a>
-<span class="sourceLineNo">767</span>      for (HStore store : region.getStores()) {<a name="line.767"></a>
-<span class="sourceLineNo">768</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), recoverSeqId - 1);<a name="line.768"></a>
-<span class="sourceLineNo">769</span>      }<a name="line.769"></a>
-<span class="sourceLineNo">770</span>      long seqId = region.replayRecoveredEditsIfAny(maxSeqIdInStores, null, status);<a name="line.770"></a>
-<span class="sourceLineNo">771</span>      assertEquals(maxSeqId, seqId);<a name="line.771"></a>
-<span class="sourceLineNo">772</span>      region.getMVCC().advanceTo(seqId);<a name="line.772"></a>
-<span class="sourceLineNo">773</span>      Get get = new Get(row);<a name="line.773"></a>
-<span class="sourceLineNo">774</span>      Result result = region.get(get);<a name="line.774"></a>
-<span class="sourceLineNo">775</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.775"></a>
-<span class="sourceLineNo">776</span>        List&lt;Cell&gt; kvs = result.getColumnCells(family, Bytes.toBytes(i));<a name="line.776"></a>
-<span class="sourceLineNo">777</span>        if (i &lt; recoverSeqId) {<a name="line.777"></a>
-<span class="sourceLineNo">778</span>          assertEquals(0, kvs.size());<a name="line.778"></a>
-<span class="sourceLineNo">779</span>        } else {<a name="line.779"></a>
-<span class="sourceLineNo">780</span>          assertEquals(1, kvs.size());<a name="line.780"></a>
-<span class="sourceLineNo">781</span>          assertArrayEquals(Bytes.toBytes(i), CellUtil.cloneValue(kvs.get(0)));<a name="line.781"></a>
-<span class="sourceLineNo">782</span>        }<a name="line.782"></a>
-<span class="sourceLineNo">783</span>      }<a name="line.783"></a>
-<span class="sourceLineNo">784</span>    } finally {<a name="line.784"></a>
-<span class="sourceLineNo">785</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.785"></a>
-<span class="sourceLineNo">786</span>      this.region = null;<a name="line.786"></a>
-<span class="sourceLineNo">787</span>      wals.close();<a name="line.787"></a>
-<span class="sourceLineNo">788</span>    }<a name="line.788"></a>
-<span class="sourceLineNo">789</span>  }<a name="line.789"></a>
-<span class="sourceLineNo">790</span><a name="line.790"></a>
-<span class="sourceLineNo">791</span>  @Test<a name="line.791"></a>
-<span class="sourceLineNo">792</span>  public void testSkipRecoveredEditsReplayAllIgnored() throws Exception {<a name="line.792"></a>
-<span class="sourceLineNo">793</span>    byte[] family = Bytes.toBytes("family");<a name="line.793"></a>
-<span class="sourceLineNo">794</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.794"></a>
-<span class="sourceLineNo">795</span>    Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.795"></a>
-<span class="sourceLineNo">796</span>    FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.796"></a>
-<span class="sourceLineNo">797</span><a name="line.797"></a>
-<span class="sourceLineNo">798</span>    Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.798"></a>
-<span class="sourceLineNo">799</span>    for (int i = 1000; i &lt; 1050; i += 10) {<a name="line.799"></a>
-<span class="sourceLineNo">800</span>      Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.800"></a>
-<span class="sourceLineNo">801</span>      FSDataOutputStream dos = fs.create(recoveredEdits);<a name="line.801"></a>
-<span class="sourceLineNo">802</span>      dos.writeInt(i);<a name="line.802"></a>
-<span class="sourceLineNo">803</span>      dos.close();<a name="line.803"></a>
-<span class="sourceLineNo">804</span>    }<a name="line.804"></a>
-<span class="sourceLineNo">805</span>    long minSeqId = 2000;<a name="line.805"></a>
-<span class="sourceLineNo">806</span>    Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", minSeqId - 1));<a name="line.806"></a>
-<span class="sourceLineNo">807</span>    FSDataOutputStream dos = fs.create(recoveredEdits);<a name="line.807"></a>
-<span class="sourceLineNo">808</span>    dos.close();<a name="line.808"></a>
-<span class="sourceLineNo">809</span><a name="line.809"></a>
-<span class="sourceLineNo">810</span>    Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.810"></a>
-<span class="sourceLineNo">811</span>    for (HStore store : region.getStores()) {<a name="line.811"></a>
-<span class="sourceLineNo">812</span>      maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), minSeqId);<a name="line.812"></a>
-<span class="sourceLineNo">813</span>    }<a name="line.813"></a>
-<span class="sourceLineNo">814</span>    long seqId = region.replayRecoveredEditsIfAny(maxSeqIdInStores, null, null);<a name="line.814"></a>
-<span class="sourceLineNo">815</span>    assertEquals(minSeqId, seqId);<a name="line.815"></a>
-<span class="sourceLineNo">816</span>  }<a name="line.816"></a>
-<span class="sourceLineNo">817</span><a name="line.817"></a>
-<span class="sourceLineNo">818</span>  @Test<a name="line.818"></a>
-<span class="sourceLineNo">819</span>  public void testSkipRecoveredEditsReplayTheLastFileIgnored() throws Exception {<a name="line.819"></a>
-<span class="sourceLineNo">820</span>    byte[] family = Bytes.toBytes("family");<a name="line.820"></a>
-<span class="sourceLineNo">821</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.821"></a>
-<span class="sourceLineNo">822</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.822"></a>
-<span class="sourceLineNo">823</span>    try {<a name="line.823"></a>
-<span class="sourceLineNo">824</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.824"></a>
-<span class="sourceLineNo">825</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.825"></a>
-<span class="sourceLineNo">826</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.826"></a>
-<span class="sourceLineNo">827</span>      byte[][] columns = region.getTableDescriptor().getColumnFamilyNames().toArray(new byte[0][]);<a name="line.827"></a>
-<span class="sourceLineNo">828</span><a name="line.828"></a>
-<span class="sourceLineNo">829</span>      assertEquals(0, region.getStoreFileList(columns).size());<a name="line.829"></a>
-<span class="sourceLineNo">830</span><a name="line.830"></a>
-<span class="sourceLineNo">831</span>      Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.831"></a>
-<span class="sourceLineNo">832</span><a name="line.832"></a>
-<span class="sourceLineNo">833</span>      long maxSeqId = 1050;<a name="line.833"></a>
-<span class="sourceLineNo">834</span>      long minSeqId = 1000;<a name="line.834"></a>
-<span class="sourceLineNo">835</span><a name="line.835"></a>
-<span class="sourceLineNo">836</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.836"></a>
-<span class="sourceLineNo">837</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.837"></a>
-<span class="sourceLineNo">838</span>        fs.create(recoveredEdits);<a name="line.838"></a>
-<span class="sourceLineNo">839</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.839"></a>
-<span class="sourceLineNo">840</span><a name="line.840"></a>
-<span class="sourceLineNo">841</span>        long time = System.nanoTime();<a name="line.841"></a>
-<span class="sourceLineNo">842</span>        WALEdit edit = null;<a name="line.842"></a>
-<span class="sourceLineNo">843</span>        if (i == maxSeqId) {<a name="line.843"></a>
-<span class="sourceLineNo">844</span>          edit = WALEdit.createCompaction(region.getRegionInfo(),<a name="line.844"></a>
-<span class="sourceLineNo">845</span>          CompactionDescriptor.newBuilder()<a name="line.845"></a>
-<span class="sourceLineNo">846</span>          .setTableName(ByteString.copyFrom(tableName.getName()))<a name="line.846"></a>
-<span class="sourceLineNo">847</span>          .setFamilyName(ByteString.copyFrom(regionName))<a name="line.847"></a>
-<span class="sourceLineNo">848</span>          .setEncodedRegionName(ByteString.copyFrom(regionName))<a name="line.848"></a>
-<span class="sourceLineNo">849</span>          .setStoreHomeDirBytes(ByteString.copyFrom(Bytes.toBytes(regiondir.toString())))<a name="line.849"></a>
-<span class="sourceLineNo">850</span>          .setRegionName(ByteString.copyFrom(region.getRegionInfo().getRegionName()))<a name="line.850"></a>
-<span class="sourceLineNo">851</span>          .build());<a name="line.851"></a>
-<span class="sourceLineNo">852</span>        } else {<a name="line.852"></a>
-<span class="sourceLineNo">853</span>          edit = new WALEdit();<a name="line.853"></a>
-<span class="sourceLineNo">854</span>          edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.854"></a>
-<span class="sourceLineNo">855</span>            .toBytes(i)));<a name="line.855"></a>
-<span class="sourceLineNo">856</span>        }<a name="line.856"></a>
-<span class="sourceLineNo">857</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.857"></a>
-<span class="sourceLineNo">858</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.858"></a>
-<span class="sourceLineNo">859</span>        writer.close();<a name="line.859"></a>
-<span class="sourceLineNo">860</span>      }<a name="line.860"></a>
-<span class="sourceLineNo">861</span><a name="line.861"></a>
-<span class="sourceLineNo">862</span>      long recoverSeqId = 1030;<a name="line.862"></a>
-<span class="sourceLineNo">863</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.863"></a>
-<span class="sourceLineNo">864</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.864"></a>
-<span class="sourceLineNo">865</span>      for (HStore store : region.getStores()) {<a name="line.865"></a>
-<span class="sourceLineNo">866</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), recoverSeqId - 1);<a name="line.866"></a>
-<span class="sourceLineNo">867</span>      }<a name="line.867"></a>
-<span class="sourceLineNo">868</span>      long seqId = region.replayRecoveredEditsIfAny(maxSeqIdInStores, null, status);<a name="line.868"></a>
-<span class="sourceLineNo">869</span>      assertEquals(maxSeqId, seqId);<a name="line.869"></a>
-<span class="sourceLineNo">870</span><a name="line.870"></a>
-<span class="sourceLineNo">871</span>      // assert that the files are flushed<a name="line.871"></a>
-<span class="sourceLineNo">872</span>      assertEquals(1, region.getStoreFileList(columns).size());<a name="line.872"></a>
-<span class="sourceLineNo">873</span><a name="line.873"></a>
-<span class="sourceLineNo">874</span>    } finally {<a name="line.874"></a>
-<span class="sourceLineNo">875</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.875"></a>
-<span class="sourceLineNo">876</span>      this.region = null;<a name="line.876"></a>
-<span class="sourceLineNo">877</span>      wals.close();<a name="line.877"></a>
-<span class="sourceLineNo">878</span>    }<a name="line.878"></a>
-<span class="sourceLineNo">879</span>  }<a name="line.879"></a>
-<span class="sourceLineNo">880</span><a name="line.880"></a>
-<span class="sourceLineNo">881</span>  @Test<a name="line.881"></a>
-<span class="sourceLineNo">882</span>  public void testRecoveredEditsReplayCompaction() throws Exception {<a name="line.882"></a>
-<span class="sourceLineNo">883</span>    testRecoveredEditsReplayCompaction(false);<a name="line.883"></a>
-<span class="sourceLineNo">884</span>    testRecoveredEditsReplayCompaction(true);<a name="line.884"></a>
-<span class="sourceLineNo">885</span>  }<a name="line.885"></a>
-<span class="sourceLineNo">886</span><a name="line.886"></a>
-<span class="sourceLineNo">887</span>  public void testRecoveredEditsReplayCompaction(boolean mismatchedRegionName) throws Exception {<a name="line.887"></a>
-<span class="sourceLineNo">888</span>    CONF.setClass(HConstants.REGION_IMPL, HRegionForTesting.class, Region.class);<a name="line.888"></a>
-<span class="sourceLineNo">889</span>    byte[] family = Bytes.toBytes("family");<a name="line.889"></a>
-<span class="sourceLineNo">890</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.890"></a>
-<span class="sourceLineNo">891</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.891"></a>
-<span class="sourceLineNo">892</span>    try {<a name="line.892"></a>
-<span class="sourceLineNo">893</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.893"></a>
-<span class="sourceLineNo">894</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.894"></a>
-<span class="sourceLineNo">895</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.895"></a>
-<span class="sourceLineNo">896</span><a name="line.896"></a>
-<span class="sourceLineNo">897</span>      long maxSeqId = 3;<a name="line.897"></a>
-<span class="sourceLineNo">898</span>      long minSeqId = 0;<a name="line.898"></a>
-<span class="sourceLineNo">899</span><a name="line.899"></a>
-<span class="sourceLineNo">900</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.900"></a>
-<span class="sourceLineNo">901</span>        Put put = new Put(Bytes.toBytes(i));<a name="line.901"></a>
-<span class="sourceLineNo">902</span>        put.addColumn(family, Bytes.toBytes(i), Bytes.toBytes(i));<a name="line.902"></a>
-<span class="sourceLineNo">903</span>        region.put(put);<a name="line.903"></a>
-<span class="sourceLineNo">904</span>        region.flush(true);<a name="line.904"></a>
-<span class="sourceLineNo">905</span>      }<a name="line.905"></a>
-<span class="sourceLineNo">906</span><a name="line.906"></a>
-<span class="sourceLineNo">907</span>      // this will create a region with 3 files<a name="line.907"></a>
-<span class="sourceLineNo">908</span>      assertEquals(3, region.getStore(family).getStorefilesCount());<a name="line.908"></a>
-<span class="sourceLineNo">909</span>      List&lt;Path&gt; storeFiles = new ArrayList&lt;&gt;(3);<a name="line.909"></a>
-<span class="sourceLineNo">910</span>      for (HStoreFile sf : region.getStore(family).getStorefiles()) {<a name="line.910"></a>
-<span class="sourceLineNo">911</span>        storeFiles.add(sf.getPath());<a name="line.911"></a>
-<span class="sourceLineNo">912</span>      }<a name="line.912"></a>
-<span class="sourceLineNo">913</span><a name="line.913"></a>
-<span class="sourceLineNo">914</span>      // disable compaction completion<a name="line.914"></a>
-<span class="sourceLineNo">915</span>      CONF.setBoolean("hbase.hstore.compaction.complete", false);<a name="line.915"></a>
-<span class="sourceLineNo">916</span>      region.compactStores();<a name="line.916"></a>
-<span class="sourceLineNo">917</span><a name="line.917"></a>
-<span class="sourceLineNo">918</span>      // ensure that nothing changed<a name="line.918"></a>
-<span class="sourceLineNo">919</span>      assertEquals(3, region.getStore(family).getStorefilesCount());<a name="line.919"></a>
-<span class="sourceLineNo">920</span><a name="line.920"></a>
-<span class="sourceLineNo">921</span>      // now find the compacted file, and manually add it to the recovered edits<a name="line.921"></a>
-<span class="sourceLineNo">922</span>      Path tmpDir = new Path(region.getRegionFileSystem().getTempDir(), Bytes.toString(family));<a name="line.922"></a>
-<span class="sourceLineNo">923</span>      FileStatus[] files = FSUtils.listStatus(fs, tmpDir);<a name="line.923"></a>
-<span class="sourceLineNo">924</span>      String errorMsg = "Expected to find 1 file in the region temp directory "<a name="line.924"></a>
-<span class="sourceLineNo">925</span>          + "from the compaction, could not find any";<a name="line.925"></a>
-<span class="sourceLineNo">926</span>      assertNotNull(errorMsg, files);<a name="line.926"></a>
-<span class="sourceLineNo">927</span>      assertEquals(errorMsg, 1, files.length);<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      // move the file inside region dir<a name="line.928"></a>
-<span class="sourceLineNo">929</span>      Path newFile = region.getRegionFileSystem().commitStoreFile(Bytes.toString(family),<a name="line.929"></a>
-<span class="sourceLineNo">930</span>          files[0].getPath());<a name="line.930"></a>
-<span class="sourceLineNo">931</span><a name="line.931"></a>
-<span class="sourceLineNo">932</span>      byte[] encodedNameAsBytes = this.region.getRegionInfo().getEncodedNameAsBytes();<a name="line.932"></a>
-<span class="sourceLineNo">933</span>      byte[] fakeEncodedNameAsBytes = new byte [encodedNameAsBytes.length];<a name="line.933"></a>
-<span class="sourceLineNo">934</span>      for (int i=0; i &lt; encodedNameAsBytes.length; i++) {<a name="line.934"></a>
-<span class="sourceLineNo">935</span>        // Mix the byte array to have a new encodedName<a name="line.935"></a>
-<span class="sourceLineNo">936</span>        fakeEncodedNameAsBytes[i] = (byte) (encodedNameAsBytes[i] + 1);<a name="line.936"></a>
-<span class="sourceLineNo">937</span>      }<a name="line.937"></a>
-<span class="sourceLineNo">938</span><a name="line.938"></a>
-<span class="sourceLineNo">939</span>      CompactionDescriptor compactionDescriptor = ProtobufUtil.toCompactionDescriptor(this.region<a name="line.939"></a>
-<span class="sourceLineNo">940</span>        .getRegionInfo(), mismatchedRegionName ? fakeEncodedNameAsBytes : null, family,<a name="line.940"></a>
-<span class="sourceLineNo">941</span>            storeFiles, Lists.newArrayList(newFile),<a name="line.941"></a>
-<span class="sourceLineNo">942</span>            region.getRegionFileSystem().getStoreDir(Bytes.toString(family)));<a name="line.942"></a>
-<span class="sourceLineNo">943</span><a name="line.943"></a>
-<span class="sourceLineNo">944</span>      WALUtil.writeCompactionMarker(region.getWAL(), this.region.getReplicationScope(),<a name="line.944"></a>
-<span class="sourceLineNo">945</span>          this.region.getRegionInfo(), compactionDescriptor, region.getMVCC());<a name="line.945"></a>
-<span class="sourceLineNo">946</span><a name="line.946"></a>
-<span class="sourceLineNo">947</span>      Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.947"></a>
-<span class="sourceLineNo">948</span><a name="line.948"></a>
-<span class="sourceLineNo">949</span>      Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", 1000));<a name="line.949"></a>
-<span class="sourceLineNo">950</span>      fs.create(recoveredEdits);<a name="line.950"></a>
-<span class="sourceLineNo">951</span>      WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.951"></a>
-<span class="sourceLineNo">952</span><a name="line.952"></a>
-<span class="sourceLineNo">953</span>      long time = System.nanoTime();<a name="line.953"></a>
-<span class="sourceLineNo">954</span><a name="line.954"></a>
-<span class="sourceLineNo">955</span>      writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, 10, time,<a name="line.955"></a>
-<span class="sourceLineNo">956</span>          HConstants.DEFAULT_CLUSTER_ID), WALEdit.createCompaction(region.getRegionInfo(),<a name="line.956"></a>
-<span class="sourceLineNo">957</span>          compactionDescriptor)));<a name="line.957"></a>
-<span class="sourceLineNo">958</span>      writer.close();<a name="line.958"></a>
-<span class="sourceLineNo">959</span><a name="line.959"></a>
-<span class="sourceLineNo">960</span>      // close the region now, and reopen again<a name="line.960"></a>
-<span class="sourceLineNo">961</span>      region.getTableDescriptor();<a name="line.961"></a>
-<span class="sourceLineNo">962</span>      region.getRegionInfo();<a name="line.962"></a>
-<span class="sourceLineNo">963</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.963"></a>
-<span class="sourceLineNo">964</span>      try {<a name="line.964"></a>
-<span class="sourceLineNo">965</span>        region = HRegion.openHRegion(region, null);<a name="line.965"></a>
-<span class="sourceLineNo">966</span>      } catch (WrongRegionException wre) {<a name="line.966"></a>
-<span class="sourceLineNo">967</span>        fail("Matching encoded region name should not have produced WrongRegionException");<a name="line.967"></a>
-<span class="sourceLineNo">968</span>      }<a name="line.968"></a>
-<span class="sourceLineNo">969</span><a name="line.969"></a>
-<span class="sourceLineNo">970</span>      // now check whether we have only one store file, the compacted one<a name="line.970"></a>
-<span class="sourceLineNo">971</span>      Collection&lt;HStoreFile&gt; sfs = region.getStore(family).getStorefiles();<a name="line.971"></a>
-<span class="sourceLineNo">972</span>      for (HStoreFile sf : sfs) {<a name="line.972"></a>
-<span class="sourceLineNo">973</span>        LOG.info(Objects.toString(sf.getPath()));<a name="line.973"></a>
-<span class="sourceLineNo">974</span>      }<a name="line.974"></a>
-<span class="sourceLineNo">975</span>      if (!mismatchedRegionName) {<a name="line.975"></a>
-<span class="sourceLineNo">976</span>        assertEquals(1, region.getStore(family).getStorefilesCount());<a name="line.976"></a>
-<span class="sourceLineNo">977</span>      }<a name="line.977"></a>
-<span class="sourceLineNo">978</span>      files = FSUtils.listStatus(fs, tmpDir);<a name="line.978"></a>
-<span class="sourceLineNo">979</span>      assertTrue("Expected to find 0 files inside " + tmpDir, files == null || files.length == 0);<a name="line.979"></a>
-<span class="sourceLineNo">980</span><a name="line.980"></a>
-<span class="sourceLineNo">981</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.981"></a>
-<span class="sourceLineNo">982</span>        Get get = new Get(Bytes.toBytes(i));<a name="line.982"></a>
-<span class="sourceLineNo">983</span>        Result result = region.get(get);<a name="line.983"></a>
-<span class="sourceLineNo">984</span>        byte[] value = result.getValue(family, Bytes.toBytes(i));<a name="line.984"></a>
-<span class="sourceLineNo">985</span>        assertArrayEquals(Bytes.toBytes(i), value);<a name="line.985"></a>
-<span class="sourceLineNo">986</span>      }<a name="line.986"></a>
-<span class="sourceLineNo">987</span>    } finally {<a name="line.987"></a>
-<span class="sourceLineNo">988</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.988"></a>
-<span class="sourceLineNo">989</span>      this.region = null;<a name="line.989"></a>
-<span class="sourceLineNo">990</span>      wals.close();<a name="line.990"></a>
-<span class="sourceLineNo">991</span>      CONF.setClass(HConstants.REGION_IMPL, HRegion.class, Region.class);<a name="line.991"></a>
-<span class="sourceLineNo">992</span>    }<a name="line.992"></a>
-<span class="sourceLineNo">993</span>  }<a name="line.993"></a>
-<span class="sourceLineNo">994</span><a name="line.994"></a>
-<span class="sourceLineNo">995</span>  @Test<a name="line.995"></a>
-<span class="sourceLineNo">996</span>  public void testFlushMarkers() throws Exception {<a name="line.996"></a>
-<span class="sourceLineNo">997</span>    // tests that flush markers are written to WAL and handled at recovered edits<a name="line.997"></a>
-<span class="sourceLineNo">998</span>    byte[] family = Bytes.toBytes("family");<a name="line.998"></a>
-<span class="sourceLineNo">999</span>    Path logDir = TEST_UTIL.getDataTestDirOnTestFS(method + ".log");<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>    final Configuration walConf = new Configuration(TEST_UTIL.getConfiguration());<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>    final WALFactory wals = new WALFactory(walConf, method);<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>    final WAL wal = wals.getWAL(RegionInfoBuilder.newBuilder(tableName).build());<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span><a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>    this.region = initHRegion(tableName, HConstants.EMPTY_START_ROW,<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>      HConstants.EMPTY_END_ROW, false, Durability.USE_DEFAULT, wal, family);<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>    try {<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span><a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>      long maxSeqId = 3;<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>      long minSeqId = 0;<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span><a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>        Put put = new Put(Bytes.toBytes(i));<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>        put.addColumn(family, Bytes.toBytes(i), Bytes.toBytes(i));<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>        region.put(put);<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>        region.flush(true);<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>      }<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span><a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>      // this will create a region with 3 files from flush<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>      assertEquals(3, region.getStore(family).getStorefilesCount());<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>      List&lt;String&gt; storeFiles = new ArrayList&lt;&gt;(3);<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>      for (HStoreFile sf : region.getStore(family).getStorefiles()) {<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>        storeFiles.add(sf.getPath().getName());<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>      }<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span><a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>      // now verify that the flush markers are written<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>      wal.shutdown();<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>      WAL.Reader reader = WALFactory.createReader(fs, AbstractFSWALProvider.getCurrentFileName(wal),<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>        TEST_UTIL.getConfiguration());<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>      try {<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>        List&lt;WAL.Entry&gt; flushDescriptors = new ArrayList&lt;&gt;();<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>        long lastFlushSeqId = -1;<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>        while (true) {<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>          WAL.Entry entry = reader.next();<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>          if (entry == null) {<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>            break;<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>          }<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>          Cell cell = entry.getEdit().getCells().get(0);<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>          if (WALEdit.isMetaEditFamily(cell)) {<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>            FlushDescriptor flushDesc = WALEdit.getFlushDescriptor(cell);<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>            assertNotNull(flushDesc);<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>            assertArrayEquals(tableName.getName(), flushDesc.getTableName().toByteArray());<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>            if (flushDesc.getAction() == FlushAction.START_FLUSH) {<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>              assertTrue(flushDesc.getFlushSequenceNumber() &gt; lastFlushSeqId);<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>            } else if (flushDesc.getAction() == FlushAction.COMMIT_FLUSH) {<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>              assertTrue(flushDesc.getFlushSequenceNumber() == lastFlushSeqId);<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>            }<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>            lastFlushSeqId = flushDesc.getFlushSequenceNumber();<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>            assertArrayEquals(regionName, flushDesc.getEncodedRegionName().toByteArray());<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>            assertEquals(1, flushDesc.getStoreFlushesCount()); //only one store<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>            StoreFlushDescriptor storeFlushDesc = flushDesc.getStoreFlushes(0);<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>            assertArrayEquals(family, storeFlushDesc.getFamilyName().toByteArray());<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>            assertEquals("family", storeFlushDesc.getStoreHomeDir());<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>            if (flushDesc.getAction() == FlushAction.START_FLUSH) {<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>              assertEquals(0, storeFlushDesc.getFlushOutputCount());<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>            } else {<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>              assertEquals(1, storeFlushDesc.getFlushOutputCount()); //only one file from flush<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>              assertTrue(storeFiles.contains(storeFlushDesc.getFlushOutput(0)));<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>            }<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span><a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>            flushDescriptors.add(entry);<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>          }<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>        }<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span><a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>        assertEquals(3 * 2, flushDescriptors.size()); // START_FLUSH and COMMIT_FLUSH per flush<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span><a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>        // now write those markers to the recovered edits again.<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span><a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>        Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span><a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", 1000));<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>        fs.create(recoveredEdits);<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span><a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>        for (WAL.Entry entry : flushDescriptors) {<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>          writer.append(entry);<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>        }<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>        writer.close();<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      } finally {<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>        if (null != reader) {<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>          try {<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>            reader.close();<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>          } catch (IOException exception) {<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>            LOG.warn("Problem closing wal: " + exception.getMessage());<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>            LOG.debug("exception details", exception);<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>          }<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>        }<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>      }<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span><a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>      // close the region now, and reopen again<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>      region = HRegion.openHRegion(region, null);<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span><a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>      // now check whether we have can read back the data from region<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>        Get get = new Get(Bytes.toBytes(i));<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>        Result result = region.get(get);<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>        byte[] value = result.getValue(family, Bytes.toBytes(i));<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>        assertArrayEquals(Bytes.toBytes(i), value);<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>      }<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>    } finally {<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>      this.region = null;<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>      wals.close();<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>    }<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>  }<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span><a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>  static class IsFlushWALMarker implements ArgumentMatcher&lt;WALEdit&gt; {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>    volatile FlushAction[] actions;<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>    public IsFlushWALMarker(FlushAction... actions) {<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>      this.actions = actions;<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>    }<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>    @Override<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>    public boolean matches(WALEdit edit) {<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>      List&lt;Cell&gt; cells = edit.getCells();<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>      if (cells.isEmpty()) {<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>        return false;<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>      }<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>      if (WALEdit.isMetaEditFamily(cells.get(0))) {<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>        FlushDescriptor desc;<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>        try {<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>          desc = WALEdit.getFlushDescriptor(cells.get(0));<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>        } catch (IOException e) {<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>          LOG.warn(e.toString(), e);<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>          return false;<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>        }<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>        if (desc != null) {<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>          for (FlushAction action : actions) {<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>            if (desc.getAction() == action) {<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>              return true;<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>            }<a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>          }<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>        }<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>      }<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>      return false;<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>    }<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>    public IsFlushWALMarker set(FlushAction... actions) {<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>      this.actions = actions;<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>      return this;<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>    }<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>  }<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span><a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>  @Test<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>  public void testFlushMarkersWALFail() throws Exception {<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>    // test the cases where the WAL append for flush markers fail.<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>    byte[] family = Bytes.toBytes("family");<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span><a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>    // spy an actual WAL implementation to throw exception (was not able to mock)<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>    Path logDir = TEST_UTIL.getDataTestDirOnTestFS(method + "log");<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span><a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>    final Configuration walConf = new Configuration(TEST_UTIL.getConfiguration());<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>    // Make up a WAL that we can manipulate at append time.<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    class FailAppendFlushMarkerWAL extends FSHLog {<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>      volatile FlushAction [] flushActions = null;<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span><a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>      public FailAppendFlushMarkerWAL(FileSystem fs, Path root, String logDir, Configuration conf)<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>      throws IOException {<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>        super(fs, root, logDir, conf);<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>      }<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span><a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>      @Override<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>      protected Writer createWriterInstance(Path path) throws IOException {<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>        final Writer w = super.createWriterInstance(path);<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>        return new Writer() {<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>          @Override<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>          public void close() throws IOException {<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>            w.close();<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>          }<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span><a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>          @Override<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>          public void sync(boolean forceSync) throws IOException {<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>            w.sync(forceSync);<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>          }<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span><a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>          @Override<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>          public void append(Entry entry) throws IOException {<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>            List&lt;Cell&gt; cells = entry.getEdit().getCells();<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>            if (WALEdit.isMetaEditFamily(cells.get(0))) {<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>              FlushDescriptor desc = WALEdit.getFlushDescriptor(cells.get(0));<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>              if (desc != null) {<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>                for (FlushAction flushAction: flushActions) {<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>                  if (desc.getAction().equals(flushAction)) {<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>                    throw new IOException("Failed to append flush marker! " + flushAction);<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>                  }<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>                }<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>              }<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>            }<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>            w.append(entry);<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>          }<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span><a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>          @Override<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>          public long getLength() {<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>            return w.getLength();<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>          }<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>        };<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>      }<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>    }<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>    FailAppendFlushMarkerWAL wal =<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>      new FailAppendFlushMarkerWAL(FileSystem.get(walConf), FSUtils.getRootDir(walConf),<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>        method, walConf);<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>    wal.init();<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>    this.region = initHRegion(tableName, HConstants.EMPTY_START_ROW,<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>      HConstants.EMPTY_END_ROW, false, Durability.USE_DEFAULT, wal, family);<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>    int i = 0;<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>    Put put = new Put(Bytes.toBytes(i));<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>    put.setDurability(Durability.SKIP_WAL); // have to skip mocked wal<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>    put.addColumn(family, Bytes.toBytes(i), Bytes.toBytes(i));<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>    region.put(put);<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span><a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>    // 1. Test case where START_FLUSH throws exception<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>    wal.flushActions = new FlushAction [] {FlushAction.START_FLUSH};<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span><a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>    // start cache flush will throw exception<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>    try {<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>      region.flush(true);<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>      fail("This should have thrown exception");<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>    } catch (DroppedSnapshotException unexpected) {<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>      // this should not be a dropped snapshot exception. Meaning that RS will not abort<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>      throw unexpected;<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>    } catch (IOException expected) {<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>      // expected<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>    }<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>    // The WAL is hosed now. It has two edits appended. We cannot roll the log without it<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>    // throwing a DroppedSnapshotException to force an abort. Just clean up the mess.<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>    region.close(true);<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>    wal.close();<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span><a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>    // 2. Test case where START_FLUSH succeeds but COMMIT_FLUSH will throw exception<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>    wal.flushActions = new FlushAction [] {FlushAction.COMMIT_FLUSH};<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>    wal = new FailAppendFlushMarkerWAL(FileSystem.get(walConf), FSUtils.getRootDir(walConf),<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>          method, walConf);<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>    wal.init();<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>    this.region = initHRegion(tableName, HConstants.EMPTY_START_ROW,<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>      HConstants.EMPTY_END_ROW, false, Durability.USE_DEFAULT, wal, family);<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    region.put(put);<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span><a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>    // 3. Test case where ABORT_FLUSH will throw exception.<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>    // Even if ABORT_FLUSH throws exception, we should not fail with IOE, but continue with<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>    // DroppedSnapshotException. Below COMMMIT_FLUSH will cause flush to abort<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>    wal.flushActions = new FlushAction [] {FlushAction.COMMIT_FLUSH, FlushAction.ABORT_FLUSH};<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span><a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>    try {<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>      region.flush(true);<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>      fail("This should have thrown exception");<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>    } catch (DroppedSnapshotException expected) {<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>      // we expect this exception, since we were able to write the snapshot, but failed to<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span>      // write the flush marker to WAL<a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>    } catch (IOException unexpected) {<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>      throw unexpected;<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>    }<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>  }<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span><a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>  @Test<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>  public void testGetWhileRegionClose() throws IOException {<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>    Configuration hc = initSplit();<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>    int numRows = 100;<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>    byte[][] families = { fam1, fam2, fam3 };<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span><a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>    // Setting up region<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>    this.region = initHRegion(tableName, method, hc, families);<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>    // Put data in region<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>    final int startRow = 100;<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>    putData(startRow, numRows, qual1, families);<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>    putData(startRow, numRows, qual2, families);<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>    putData(startRow, numRows, qual3, families);<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    final AtomicBoolean done = new AtomicBoolean(false);<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>    final AtomicInteger gets = new AtomicInteger(0);<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>    GetTillDoneOrException[] threads = new GetTillDoneOrException[10];<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>    try {<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>      // Set ten threads running concurrently getting from the region.<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>      for (int i = 0; i &lt; threads.length / 2; i++) {<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>        threads[i] = new GetTillDoneOrException(i, Bytes.toBytes("" + startRow), done, gets);<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>        threads[i].setDaemon(true);<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>        threads[i].start();<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span>      }<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>      // Artificially make the condition by setting closing flag explicitly.<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>      // I can't make the issue happen with a call to region.close().<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>      this.region.closing.set(true);<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>      for (int i = threads.length / 2; i &lt; threads.length; i++) {<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>        threads[i] = new GetTillDoneOrException(i, Bytes.toBytes("" + startRow), done, gets);<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>        threads[i].setDaemon(true);<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>        threads[i].start();<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>      }<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>    } finally {<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>      if (this.region != null) {<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>        HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>        this.region = null;<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>      }<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>    }<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>    done.set(true);<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>    for (GetTillDoneOrException t : threads) {<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>      try {<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>        t.join();<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>      } catch (InterruptedException e) {<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>        e.printStackTrace();<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>      }<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>      if (t.e != null) {<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>        LOG.info("Exception=" + t.e);<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>        assertFalse("Found a NPE in " + t.getName(), t.e instanceof NullPointerException);<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>      }<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>    }<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>  }<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span><a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>  /*<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>   * Thread that does get on single row until 'done' flag is flipped. If an<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>   * exception causes us to fail, it records it.<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>   */<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>  class GetTillDoneOrException extends Thread {<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>    private final Get g;<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>    private final AtomicBoolean done;<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>    private final AtomicInteger count;<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>    private Exception e;<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span><a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>    GetTillDoneOrException(final int i, final byte[] r, final AtomicBoolean d,<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>        final AtomicInteger c) {<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>      super("getter." + i);<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>      this.g = new Get(r);<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>      this.done = d;<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>      this.count = c;<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>    }<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span><a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    @Override<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span>    public void run() {<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>      while (!this.done.get()) {<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>        try {<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>          assertTrue(region.get(g).size() &gt; 0);<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>          this.count.incrementAndGet();<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>        } catch (Exception e) {<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>          this.e = e;<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>          break;<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>        }<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>      }<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>    }<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>  }<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span><a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>  /*<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>   * An involved filter test. Has multiple column families and deletes in mix.<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>   */<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>  @Test<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>  public void testWeirdCacheBehaviour() throws Exception {<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>    byte[][] FAMILIES = new byte[][] { Bytes.toBytes("trans-blob"), Bytes.toBytes("trans-type"),<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>        Bytes.toBytes("trans-date"), Bytes.toBytes("trans-tags"), Bytes.toBytes("trans-group") };<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>    this.region = initHRegion(tableName, method, CONF, FAMILIES);<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>    String value = "this is the value";<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>    String value2 = "this is some other value";<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>    String keyPrefix1 = "prefix1";<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>    String keyPrefix2 = "prefix2";<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>    String keyPrefix3 = "prefix3";<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>    putRows(this.region, 3, value, keyPrefix1);<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>    putRows(this.region, 3, value, keyPrefix2);<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>    putRows(this.region, 3, value, keyPrefix3);<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>    putRows(this.region, 3, value2, keyPrefix1);<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>    putRows(this.region, 3, value2, keyPrefix2);<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>    putRows(this.region, 3, value2, keyPrefix3);<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>    System.out.println("Checking values for key: " + keyPrefix1);<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>    assertEquals("Got back incorrect number of rows from scan", 3,<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>        getNumberOfRows(keyPrefix1, value2, this.region));<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>    System.out.println("Checking values for key: " + keyPrefix2);<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>    assertEquals("Got back incorrect number of rows from scan", 3,<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>        getNumberOfRows(keyPrefix2, value2, this.region));<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>    System.out.println("Checking values for key: " + keyPrefix3);<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>    assertEquals("Got back incorrect number of rows from scan", 3,<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>        getNumberOfRows(keyPrefix3, value2, this.region));<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>    deleteColumns(this.region, value2, keyPrefix1);<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>    deleteColumns(this.region, value2, keyPrefix2);<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>    deleteColumns(this.region, value2, keyPrefix3);<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>    System.out.println("Starting important checks.....");<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>    assertEquals("Got back incorrect number of rows from scan: " + keyPrefix1, 0,<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>        getNumberOfRows(keyPrefix1, value2, this.region));<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>    assertEquals("Got back incorrect number of rows from scan: " + keyPrefix2, 0,<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>        getNumberOfRows(keyPrefix2, value2, this.region));<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>    assertEquals("Got back incorrect number of rows from scan: " + keyPrefix3, 0,<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>        getNumberOfRows(keyPrefix3, value2, this.region));<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>  }<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span><a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>  @Test<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>  public void testAppendWithReadOnlyTable() throws Exception {<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>    this.region = initHRegion(tableName, method, CONF, true, Bytes.toBytes("somefamily"));<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span>    boolean exceptionCaught = false;<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>    Append append = new Append(Bytes.toBytes("somerow"));<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>    append.setDurability(Durability.SKIP_WAL);<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>    append.addColumn(Bytes.toBytes("somefamily"), Bytes.toBytes("somequalifier"),<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>        Bytes.toBytes("somevalue"));<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>    try {<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>      region.append(append);<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>    } catch (IOException e) {<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>      exceptionCaught = true;<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>    }<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>    assertTrue(exceptionCaught == true);<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>  }<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span><a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>  @Test<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>  public void testIncrWithReadOnlyTable() throws Exception {<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>    this.region = initHRegion(tableName, method, CONF, true, Bytes.toBytes("somefamily"));<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>    boolean exceptionCaught = false;<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>    Increment inc = new Increment(Bytes.toBytes("somerow"));<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>    inc.setDurability(Durability.SKIP_WAL);<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>    inc.addColumn(Bytes.toBytes("somefamily"), Bytes.toBytes("somequalifier"), 1L);<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>    try {<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>      region.increment(inc);<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>    } catch (IOException e) {<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>      exceptionCaught = true;<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>    }<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>    assertTrue(exceptionCaught == true);<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>  }<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span><a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>  private void deleteColumns(HRegion r, String value, String keyPrefix) throws IOException {<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>    InternalScanner scanner = buildScanner(keyPrefix, value, r);<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>    int count = 0;<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>    boolean more = false;<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>    do {<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>      more = scanner.next(results);<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>      if (results != null &amp;&amp; !results.isEmpty())<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>        count++;<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>      else<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>        break;<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>      Delete delete = new Delete(CellUtil.cloneRow(results.get(0)));<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>      delete.addColumn(Bytes.toBytes("trans-tags"), Bytes.toBytes("qual2"));<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>      r.delete(delete);<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>      results.clear();<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>    } while (more);<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>    assertEquals("Did not perform correct number of deletes", 3, count);<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>  }<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span><a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>  private int getNumberOfRows(String keyPrefix, String value, HRegion r) throws Exception {<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>    InternalScanner resultScanner = buildScanner(keyPrefix, value, r);<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>    int numberOfResults = 0;<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>    boolean more = false;<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>    do {<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>      more = resultScanner.next(results);<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>      if (results != null &amp;&amp; !results.isEmpty())<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>        numberOfResults++;<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>      else<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>        break;<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>      for (Cell kv : results) {<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>        System.out.println("kv=" + kv.toString() + ", " + Bytes.toString(CellUtil.cloneValue(kv)));<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>      }<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>      results.clear();<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>    } while (more);<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>    return numberOfResults;<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>  }<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span><a name="line.1451"></a>
-<span class="sourceLineNo">1452</span>  private InternalScanner buildScanner(String keyPrefix, String value, HRegion r)<a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>      throws IOException {<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>    // Defaults FilterList.Operator.MUST_PASS_ALL.<a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>    FilterList allFilters = new FilterList();<a name="line.1455"></a>
-<span class="sourceLineNo">1456</span>    allFilters.addFilter(new PrefixFilter(Bytes.toBytes(keyPrefix)));<a name="line.1456"></a>
-<span class="sourceLineNo">1457</span>    // Only return rows where this column value exists in the row.<a name="line.1457"></a>
-<span class="sourceLineNo">1458</span>    SingleColumnValueFilter filter = new SingleColumnValueFilter(Bytes.toBytes("trans-tags"),<a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>        Bytes.toBytes("qual2"), CompareOperator.EQUAL, Bytes.toBytes(value));<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>    filter.setFilterIfMissing(true);<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>    allFilters.addFilter(filter);<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span>    Scan scan = new Scan();<a name="line.1462"></a>
-<span class="sourceLineNo">1463</span>    scan.addFamily(Bytes.toBytes("trans-blob"));<a name="line.1463"></a>
-<span class="sourceLineNo">1464</span>    scan.addFamily(Bytes.toBytes("trans-type"));<a name="line.1464"></a>
-<span class="sourceLineNo">1465</span>    scan.addFamily(Bytes.toBytes("trans-date"));<a name="line.1465"></a>
-<span class="sourceLineNo">1466</span>    scan.addFamily(Bytes.toBytes("trans-tags"));<a name="line.1466"></a>
-<span class="sourceLineNo">1467</span>    scan.addFamily(Bytes.toBytes("trans-group"));<a name="line.1467"></a>
-<span class="sourceLineNo">1468</span>    scan.setFilter(allFilters);<a name="line.1468"></a>
-<span class="sourceLineNo">1469</span>    return r.getScanner(scan);<a name="line.1469"></a>
-<span class="sourceLineNo">1470</span>  }<a name="line.1470"></a>
-<span class="sourceLineNo">1471</span><a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>  private void putRows(HRegion r, int numRows, String value, String key) throws IOException {<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span>    for (int i = 0; i &lt; numRows; i++) {<a name="line.1473"></a>
-<span class="sourceLineNo">1474</span>      String row = key + "_" + i/* UUID.randomUUID().toString() */;<a name="line.1474"></a>
-<span class="sourceLineNo">1475</span>      System.out.println(String.format("Saving row: %s, with value %s", row, value));<a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>      Put put = new Put(Bytes.toBytes(row));<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>      put.setDurability(Durability.SKIP_WAL);<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span>      put.addColumn(Bytes.toBytes("trans-blob"), null, Bytes.toBytes("value for blob"));<a name="line.1478"></a>
-<span class="sourceLineNo">1479</span>      put.addColumn(Bytes.toBytes("trans-type"), null, Bytes.toBytes("statement"));<a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>      put.addColumn(Bytes.toBytes("trans-date"), null, Bytes.toBytes("20090921010101999"));<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>      put.addColumn(Bytes.toBytes("trans-tags"), Bytes.toBytes("qual2"), Bytes.toBytes(value));<a name="line.1481"></a>
-<span class="sourceLineNo">1482</span>      put.addColumn(Bytes.toBytes("trans-group"), null, Bytes.toBytes("adhocTransactionGroupId"));<a name="line.1482"></a>
-<span class="sourceLineNo">1483</span>      r.put(put);<a name="line.1483"></a>
-<span class="sourceLineNo">1484</span>    }<a name="line.1484"></a>
-<span class="sourceLineNo">1485</span>  }<a name="line.1485"></a>
-<span class="sourceLineNo">1486</span><a name="line.1486"></a>
-<span class="sourceLineNo">1487</span>  @Test<a name="line.1487"></a>
-<span class="sourceLineNo">1488</span>  public void testFamilyWithAndWithoutColon() throws Exception {<a name="line.1488"></a>
-<span class="sourceLineNo">1489</span>    byte[] cf = Bytes.toBytes(COLUMN_FAMILY);<a name="line.1489"></a>
-<span class="sourceLineNo">1490</span>    this.region = initHRegion(tableName, method, CONF, cf);<a name="line.1490"></a>
-<span class="sourceLineNo">1491</span>    Put p = new Put(tableName.toBytes());<a name="line.1491"></a>
-<span class="sourceLineNo">1492</span>    byte[] cfwithcolon = Bytes.toBytes(COLUMN_FAMILY + ":");<a name="line.1492"></a>
-<span class="sourceLineNo">1493</span>    p.addColumn(cfwithcolon, cfwithcolon, cfwithcolon);<a name="line.1493"></a>
-<span class="sourceLineNo">1494</span>    boolean exception = false;<a name="line.1494"></a>
-<span class="sourceLineNo">1495</span>    try {<a name="line.1495"></a>
-<span class="sourceLineNo">1496</span>      this.region.put(p);<a name="line.1496"></a>
-<span class="sourceLineNo">1497</span>    } catch (NoSuchColumnFamilyException e) {<a name="line.1497"></a>
-<span class="sourceLineNo">1498</span>      exception = true;<a name="line.1498"></a>
-<span class="sourceLineNo">1499</span>    }<a name="line.1499"></a>
-<span class="sourceLineNo">1500</span>    assertTrue(exception);<a name="line.1500"></a>
-<span class="sourceLineNo">1501</span>  }<a name="line.1501"></a>
-<span class="sourceLineNo">1502</span><a name="line.1502"></a>
-<span class="sourceLineNo">1503</span>  @Test<a name="line.1503"></a>
-<span class="sourceLineNo">1504</span>  public void testBatchPut_whileNoRowLocksHeld() throws IOException {<a name="line.1504"></a>
-<span class="sourceLineNo">1505</span>    final Put[] puts = new Put[10];<a name="line.1505"></a>
-<span class="sourceLineNo">1506</span>    MetricsWALSource source = CompatibilitySingletonFactory.getInstance(MetricsWALSource.class);<a name="line.1506"></a>
-<span class="sourceLineNo">1507</span>    long syncs = prepareRegionForBachPut(puts, source, false);<a name="line.1507"></a>
-<span class="sourceLineNo">1508</span><a name="line.1508"></a>
-<span class="sourceLineNo">1509</span>    OperationStatus[] codes = this.region.batchMutate(puts);<a name="line.1509"></a>
-<span class="sourceLineNo">1510</span>    assertEquals(10, codes.length);<a name="line.1510"></a>
-<span class="sourceLineNo">1511</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.1511"></a>
-<span class="sourceLineNo">1512</span>      assertEquals(OperationStatusCode.SUCCESS, codes[i].getOperationStatusCode());<a name="line.1512"></a>
-<span class="sourceLineNo">1513</span>    }<a name="line.1513"></a>
-<span class="sourceLineNo">1514</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs + 1, source);<a name="line.1514"></a>
-<span class="sourceLineNo">1515</span><a name="line.1515"></a>
-<span class="sourceLineNo">1516</span>    LOG.info("Next a batch put with one invalid family");<a name="line.1516"></a>
-<span class="sourceLineNo">1517</span>    puts[5].addColumn(Bytes.toBytes("BAD_CF"), qual, value);<a name="line.1517"></a>
-<span class="sourceLineNo">1518</span>    codes = this.region.batchMutate(puts);<a name="line.1518"></a>
-<span class="sourceLineNo">1519</span>    assertEquals(10, codes.length);<a name="line.1519"></a>
-<span class="sourceLineNo">1520</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.1520"></a>
-<span class="sourceLineNo">1521</span>      assertEquals((i == 5) ? OperationStatusCode.BAD_FAMILY : OperationStatusCode.SUCCESS,<a name="line.1521"></a>
-<span class="sourceLineNo">1522</span>          codes[i].getOperationStatusCode());<a name="line.1522"></a>
-<span class="sourceLineNo">1523</span>    }<a name="line.1523"></a>
-<span class="sourceLineNo">1524</span><a name="line.1524"></a>
-<span class="sourceLineNo">1525</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs + 2, source);<a name="line.1525"></a>
-<span class="sourceLineNo">1526</span>  }<a name="line.1526"></a>
-<span class="sourceLineNo">1527</span><a name="line.1527"></a>
-<span class="sourceLineNo">1528</span>  @Test<a name="line.1528"></a>
-<span class="sourceLineNo">1529</span>  public void testBatchPut_whileMultipleRowLocksHeld() throws Exception {<a name="line.1529"></a>
-<span class="sourceLineNo">1530</span>    final Put[] puts = new Put[10];<a name="line.1530"></a>
-<span class="sourceLineNo">1531</span>    MetricsWALSource source = CompatibilitySingletonFactory.getInstance(MetricsWALSource.class);<a name="line.1531"></a>
-<span class="sourceLineNo">1532</span>    long syncs = prepareRegionForBachPut(puts, source, false);<a name="line.1532"></a>
-<span class="sourceLineNo">1533</span><a name="line.1533"></a>
-<span class="sourceLineNo">1534</span>    puts[5].addColumn(Bytes.toBytes("BAD_CF"), qual, value);<a name="line.1534"></a>
-<span class="sourceLineNo">1535</span><a name="line.1535"></a>
-<span class="sourceLineNo">1536</span>    LOG.info("batchPut will have to break into four batches to avoid row locks");<a name="line.1536"></a>
-<span class="sourceLineNo">1537</span>    RowLock rowLock1 = region.getRowLock(Bytes.toBytes("row_2"));<a name="line.1537"></a>
-<span class="sourceLineNo">1538</span>    RowLock rowLock2 = region.getRowLock(Bytes.toBytes("row_1"));<a name="line.1538"></a>
-<span class="sourceLineNo">1539</span>    RowLock rowLock3 = region.getRowLock(Bytes.toBytes("row_3"));<a name="line.1539"></a>
-<span class="sourceLineNo">1540</span>    RowLock rowLock4 = region.getRowLock(Bytes.toBytes("row_3"), true);<a name="line.1540"></a>
-<span class="sourceLineNo">1541</span><a name="line.1541"></a>
-<span class="sourceLineNo">1542</span>    MultithreadedTestUtil.TestContext ctx = new MultithreadedTestUtil.TestContext(CONF);<a name="line.1542"></a>
-<span class="sourceLineNo">1543</span>    final AtomicReference&lt;OperationStatus[]&gt; retFromThread = new AtomicReference&lt;&gt;();<a name="line.1543"></a>
-<span class="sourceLineNo">1544</span>    final CountDownLatch startingPuts = new CountDownLatch(1);<a name="line.1544"></a>
-<span class="sourceLineNo">1545</span>    final CountDownLatch startingClose = new CountDownLatch(1);<a name="line.1545"></a>
-<span class="sourceLineNo">1546</span>    TestThread putter = new TestThread(ctx) {<a name="line.1546"></a>
-<span class="sourceLineNo">1547</span>      @Override<a name="line.1547"></a>
-<span class="sourceLineNo">1548</span>      public void doWork() throws IOException {<a name="line.1548"></a>
-<span class="sourceLineNo">1549</span>        startingPuts.countDown();<a name="line.1549"></a>
-<span class="sourceLineNo">1550</span>        retFromThread.set(region.batchMutate(puts));<a name="line.1550"></a>
-<span class="sourceLineNo">1551</span>      }<a name="line.1551"></a>
-<span class="sourceLineNo">1552</span>    };<a name="line.1552"></a>
-<span class="sourceLineNo">1553</span>    LOG.info("...starting put thread while holding locks");<a name="line.1553"></a>
-<span class="sourceLineNo">1554</span>    ctx.addThread(putter);<a name="line.1554"></a>
-<span class="sourceLineNo">1555</span>    ctx.startThreads();<a name="line.1555"></a>
-<span class="sourceLineNo">1556</span><a name="line.1556"></a>
-<span class="sourceLineNo">1557</span>    // Now attempt to close the region from another thread.  Prior to HBASE-12565<a name="line.1557"></a>
-<span class="sourceLineNo">1558</span>    // this would cause the in-progress batchMutate operation to to fail with<a name="line.1558"></a>
-<span class="sourceLineNo">1559</span>    // exception because it use to release and re-acquire the close-guard lock<a name="line.1559"></a>
-<span class="sourceLineNo">1560</span>    // between batches.  Caller then didn't get status indicating which writes succeeded.<a name="line.1560"></a>
-<span class="sourceLineNo">1561</span>    // We now expect this thread to block until the batchMutate call finishes.<a name="line.1561"></a>
-<span class="sourceLineNo">1562</span>    Thread regionCloseThread = new TestThread(ctx) {<a name="line.1562"></a>
-<span class="sourceLineNo">1563</span>      @Override<a name="line.1563"></a>
-<span class="sourceLineNo">1564</span>      public void doWork() {<a name="line.1564"></a>
-<span class="sourceLineNo">1565</span>        try {<a name="line.1565"></a>
-<span class="sourceLineNo">1566</span>          startingPuts.await();<a name="line.1566"></a>
-<span class="sourceLineNo">1567</span>          // Give some time for the batch mutate to get in.<a name="line.1567"></a>
-<span class="sourceLineNo">1568</span>          // We don't want to race with the mutate<a name="line.1568"></a>
-<span class="sourceLineNo">1569</span>          Thread.sleep(10);<a name="line.1569"></a>
-<span class="sourceLineNo">1570</span>          startingClose.countDown();<a name="line.1570"></a>
-<span class="sourceLineNo">1571</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.1571"></a>
-<span class="sourceLineNo">1572</span>          region = null;<a name="line.1572"></a>
-<span class="sourceLineNo">1573</span>        } catch (IOException e) {<a name="line.1573"></a>
-<span class="sourceLineNo">1574</span>          throw new RuntimeException(e);<a name="line.1574"></a>
-<span class="sourceLineNo">1575</span>        } catch (InterruptedException e) {<a name="line.1575"></a>
-<span class="sourceLineNo">1576</span>          throw new RuntimeException(e);<a name="line.1576"></a>
-<span class="sourceLineNo">1577</span>        }<a name="line.1577"></a>
-<span class="sourceLineNo">1578</span>      }<a name="line.1578"></a>
-<span class="sourceLineNo">1579</span>    };<a name="line.1579"></a>
-<span class="sourceLineNo">1580</span>    regionCloseThread.start();<a name="line.1580"></a>
-<span class="sourceLineNo">1581</span><a name="line.1581"></a>
-<span class="sourceLineNo">1582</span>    startingClose.await();<a name="line.1582"></a>
-<span class="sourceLineNo">1583</span>    startingPuts.await();<a name="line.1583"></a>
-<span class="sourceLineNo">1584</span>    Thread.sleep(100);<a name="line.1584"></a>
-<span class="sourceLineNo">1585</span>    LOG.info("...releasing row lock 1, which should let put thread continue");<a name="line.1585"></a>
-<span class="sourceLineNo">1586</span>    rowLock1.release();<a name="line.1586"></a>
-<span class="sourceLineNo">1587</span>    rowLock2.release();<a name="line.1587"></a>
-<span class="sourceLineNo">1588</span>    rowLock3.release();<a name="line.1588"></a>
-<span class="sourceLineNo">1589</span>    waitForCounter(source, "syncTimeNumOps", syncs + 1);<a name="line.1589"></a>
-<span class="sourceLineNo">1590</span><a name="line.1590"></a>
-<span class="sourceLineNo">1591</span>    LOG.info("...joining on put thread");<a name="line.1591"></a>
-<span class="sourceLineNo">1592</span>    ctx.stop();<a name="line.1592"></a>
-<span class="sourceLineNo">1593</span>    regionCloseThread.join();<a name="line.1593"></a>
-<span class="sourceLineNo">1594</span><a name="line.1594"></a>
-<span class="sourceLineNo">1595</span>    OperationStatus[] codes = retFromThread.get();<a name="line.1595"></a>
-<span class="sourceLineNo">1596</span>    for (int i = 0; i &lt; codes.length; i++) {<a name="line.1596"></a>
-<span class="sourceLineNo">1597</span>      assertEquals((i == 5) ? OperationStatusCode.BAD_FAMILY : OperationStatusCode.SUCCESS,<a name="line.1597"></a>
-<span class="sourceLineNo">1598</span>          codes[i].getOperationStatusCode());<a name="line.1598"></a>
-<span class="sourceLineNo">1599</span>    }<a name="line.1599"></a>
-<span class="sourceLineNo">1600</span>    rowLock4.release();<a name="line.1600"></a>
-<span class="sourceLineNo">1601</span>  }<a name="line.1601"></a>
-<span class="sourceLineNo">1602</span><a name="line.1602"></a>
-<span class="sourceLineNo">1603</span>  private void waitForCounter(MetricsWALSource source, String metricName, long expectedCount)<a name="line.1603"></a>
-<span class="sourceLineNo">1604</span>      throws InterruptedException {<a name="line.1604"></a>
-<span class="sourceLineNo">1605</span>    long startWait = System.currentTimeMillis();<a name="line.1605"></a>
-<span class="sourceLineNo">1606</span>    long currentCount;<a name="line.1606"></a>
-<span class="sourceLineNo">1607</span>    while ((currentCount = metricsAssertHelper.getCounter(metricName, source)) &lt; expectedCount) {<a name="line.1607"></a>
-<span class="sourceLineNo">1608</span>      Thread.sleep(100);<a name="line.1608"></a>
-<span class="sourceLineNo">1609</span>      if (System.currentTimeMillis() - startWait &gt; 10000) {<a name="line.1609"></a>
-<span class="sourceLineNo">1610</span>        fail(String.format("Timed out waiting for '%s' &gt;= '%s', currentCount=%s", metricName,<a name="line.1610"></a>
-<span class="sourceLineNo">1611</span>            expectedCount, currentCount));<a name="line.1611"></a>
-<span class="sourceLineNo">1612</span>      }<a name="line.1612"></a>
-<span class="sourceLineNo">1613</span>    }<a name="line.1613"></a>
-<span class="sourceLineNo">1614</span>  }<a name="line.1614"></a>
-<span class="sourceLineNo">1615</span><a name="line.1615"></a>
-<span class="sourceLineNo">1616</span>  @Test<a name="line.1616"></a>
-<span class="sourceLineNo">1617</span>  public void testAtomicBatchPut() throws IOException {<a name="line.1617"></a>
-<span class="sourceLineNo">1618</span>    final Put[] puts = new Put[10];<a name="line.1618"></a>
-<span class="sourceLineNo">1619</span>    MetricsWALSource source = CompatibilitySingletonFactory.getInstance(MetricsWALSource.class);<a name="line.1619"></a>
-<span class="sourceLineNo">1620</span>    long syncs = prepareRegionForBachPut(puts, source, false);<a name="line.1620"></a>
-<span class="sourceLineNo">1621</span><a name="line.1621"></a>
-<span class="sourceLineNo">1622</span>    // 1. Straight forward case, should succeed<a name="line.1622"></a>
-<span class="sourceLineNo">1623</span>    MutationBatchOperation batchOp = new MutationBatchOperation(region, puts, true,<a name="line.1623"></a>
-<span class="sourceLineNo">1624</span>        HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.1624"></a>
-<span class="sourceLineNo">1625</span>    OperationStatus[] codes = this.region.batchMutate(batchOp);<a name="line.1625"></a>
-<span class="sourceLineNo">1626</span>    assertEquals(10, codes.length);<a name="line.1626"></a>
-<span class="sourceLineNo">1627</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.1627"></a>
-<span class="sourceLineNo">1628</span>      assertEquals(OperationStatusCode.SUCCESS, codes[i].getOperationStatusCode());<a name="line.1628"></a>
-<span class="sourceLineNo">1629</span>    }<a name="line.1629"></a>
-<span class="sourceLineNo">1630</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs + 1, source);<a name="line.1630"></a>
-<span class="sourceLineNo">1631</span><a name="line.1631"></a>
-<span class="sourceLineNo">1632</span>    // 2. Failed to get lock<a name="line.1632"></a>
-<span class="sourceLineNo">1633</span>    RowLock lock = region.getRowLock(Bytes.toBytes("row_" + 3));<a name="line.1633"></a>
-<span class="sourceLineNo">1634</span>    // Method {@link HRegion#getRowLock(byte[])} is reentrant. As 'row_3' is locked in this<a name="line.1634"></a>
-<span class="sourceLineNo">1635</span>    // thread, need to run {@link HRegion#batchMutate(HRegion.BatchOperation)} in different thread<a name="line.1635"></a>
-<span class="sourceLineNo">1636</span>    MultithreadedTestUtil.TestContext ctx = new MultithreadedTestUtil.TestContext(CONF);<a name="line.1636"></a>
-<span class="sourceLineNo">1637</span>    final AtomicReference&lt;IOException&gt; retFromThread = new AtomicReference&lt;&gt;();<a name="line.1637"></a>
-<span class="sourceLineNo">1638</span>    final CountDownLatch finishedPuts = new CountDownLatch(1);<a name="line.1638"></a>
-<span class="sourceLineNo">1639</span>    final MutationBatchOperation finalBatchOp = new MutationBatchOperation(region, puts, true,<a name="line.1639"></a>
-<span class="sourceLineNo">1640</span>        HConstants<a name="line.1640"></a>
-<span class="sourceLineNo">1641</span>        .NO_NONCE,<a name="line.1641"></a>
-<span class="sourceLineNo">1642</span>        HConstants.NO_NONCE);<a name="line.1642"></a>
-<span class="sourceLineNo">1643</span>    TestThread putter = new TestThread(ctx) {<a name="line.1643"></a>
-<span class="sourceLineNo">1644</span>      @Override<a name="line.1644"></a>
-<span class="sourceLineNo">1645</span>      public void doWork() throws IOException {<a name="line.1645"></a>
-<span class="sourceLineNo">1646</span>        try {<a name="line.1646"></a>
-<span class="sourceLineNo">1647</span>          region.batchMutate(finalBatchOp);<a name="line.1647"></a>
-<span class="sourceLineNo">1648</span>        } catch (IOException ioe) {<a name="line.1648"></a>
-<span class="sourceLineNo">1649</span>          LOG.error("test failed!", ioe);<a name="line.1649"></a>
-<span class="sourceLineNo">1650</span>          retFromThread.set(ioe);<a name="line.1650"></a>
-<span class="sourceLineNo">1651</span>        }<a name="line.1651"></a>
-<span class="sourceLineNo">1652</span>        finishedPuts.countDown();<a name="line.1652"></a>
-<span class="sourceLineNo">1653</span>      }<a name="line.1653"></a>
-<span class="sourceLineNo">1654</span>    };<a name="line.1654"></a>
-<span class="sourceLineNo">1655</span>    LOG.info("...starting put thread while holding locks");<a name="line.1655"></a>
-<span class="sourceLineNo">1656</span>    ctx.addThread(putter);<a name="line.1656"></a>
-<span class="sourceLineNo">1657</span>    ctx.startThreads();<a name="line.1657"></a>
-<span class="sourceLineNo">1658</span>    LOG.info("...waiting for batch puts while holding locks");<a name="line.1658"></a>
-<span class="sourceLineNo">1659</span>    try {<a name="line.1659"></a>
-<span class="sourceLineNo">1660</span>      finishedPuts.await();<a name="line.1660"></a>
-<span class="sourceLineNo">1661</span>    } catch (InterruptedException e) {<a name="line.1661"></a>
-<span class="sourceLineNo">1662</span>      LOG.error("Interrupted!", e);<a name="line.1662"></a>
-<span class="sourceLineNo">1663</span>    } finally {<a name="line.1663"></a>
-<span class="sourceLineNo">1664</span>      if (lock != null) {<a name="line.1664"></a>
-<span class="sourceLineNo">1665</span>        lock.release();<a name="line.1665"></a>
-<span class="sourceLineNo">1666</span>      }<a name="line.1666"></a>
-<span class="sourceLineNo">1667</span>    }<a name="line.1667"></a>
-<span class="sourceLineNo">1668</span>    assertNotNull(retFromThread.get());<a name="line.1668"></a>
-<span class="sourceLineNo">1669</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs + 1, source);<a name="line.1669"></a>
-<span class="sourceLineNo">1670</span><a name="line.1670"></a>
-<span class="sourceLineNo">1671</span>    // 3. Exception thrown in validation<a name="line.1671"></a>
-<span class="sourceLineNo">1672</span>    LOG.info("Next a batch put with one invalid family");<a name="line.1672"></a>
-<span class="sourceLineNo">1673</span>    puts[5].addColumn(Bytes.toBytes("BAD_CF"), qual, value);<a name="line.1673"></a>
-<span class="sourceLineNo">1674</span>    batchOp = new MutationBatchOperation(region, puts, true, HConstants.NO_NONCE,<a name="line.1674"></a>
-<span class="sourceLineNo">1675</span>        HConstants.NO_NONCE);<a name="line.1675"></a>
-<span class="sourceLineNo">1676</span>    thrown.expect(NoSuchColumnFamilyException.class);<a name="line.1676"></a>
-<span class="sourceLineNo">1677</span>    this.region.batchMutate(batchOp);<a name="line.1677"></a>
-<span class="sourceLineNo">1678</span>  }<a name="line.1678"></a>
-<span class="sourceLineNo">1679</span><a name="line.1679"></a>
-<span class="sourceLineNo">1680</span>  @Test<a name="line.1680"></a>
-<span class="sourceLineNo">1681</span>  public void testBatchPutWithTsSlop() throws Exception {<a name="line.1681"></a>
-<span class="sourceLineNo">1682</span>    // add data with a timestamp that is too recent for range. Ensure assert<a name="line.1682"></a>
-<span class="sourceLineNo">1683</span>    CONF.setInt("hbase.hregion.keyvalue.timestamp.slop.millisecs", 1000);<a name="line.1683"></a>
-<span class="sourceLineNo">1684</span>    final Put[] puts = new Put[10];<a name="line.1684"></a>
-<span class="sourceLineNo">1685</span>    MetricsWALSource source = CompatibilitySingletonFactory.getInstance(MetricsWALSource.class);<a name="line.1685"></a>
-<span class="sourceLineNo">1686</span><a name="line.1686"></a>
-<span class="sourceLineNo">1687</span>    long syncs = prepareRegionForBachPut(puts, source, true);<a name="line.1687"></a>
-<span class="sourceLineNo">1688</span><a name="line.1688"></a>
-<span class="sourceLineNo">1689</span>    OperationStatus[] codes = this.region.batchMutate(puts);<a name="line.1689"></a>
-<span class="sourceLineNo">1690</span>    assertEquals(10, codes.length);<a name="line.1690"></a>
-<span class="sourceLineNo">1691</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.1691"></a>
-<span class="sourceLineNo">1692</span>      assertEquals(OperationStatusCode.SANITY_CHECK_FAILURE, codes[i].getOperationStatusCode());<a name="line.1692"></a>
-<span class="sourceLineNo">1693</span>    }<a name="line.1693"></a>
-<span class="sourceLineNo">1694</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs, source);<a name="line.1694"></a>
-<span class="sourceLineNo">1695</span>  }<a name="line.1695"></a>
-<span class="sourceLineNo">1696</span><a name="line.1696"></a>
-<span class="sourceLineNo">1697</span>  /**<a name="line.1697"></a>
-<span class="sourceLineNo">1698</span>   * @return syncs initial syncTimeNumOps<a name="line.1698"></a>
-<span class="sourceLineNo">1699</span>   */<a name="line.1699"></a>
-<span class="sourceLineNo">1700</span>  private long prepareRegionForBachPut(final Put[] puts, final MetricsWALSource source,<a name="line.1700"></a>
-<span class="sourceLineNo">1701</span>      boolean slop) throws IOException {<a name="line.1701"></a>
-<span class="sourceLineNo">1702</span>    this.region = initHRegion(tableName, method, CONF, COLUMN_FAMILY_BYTES);<a name="line.1702"></a>
-<span class="sourceLineNo">1703</span><a name="line.1703"></a>
-<span class="sourceLineNo">1704</span>    LOG.info("First a batch put with all valid puts");<a name="line.1704"></a>
-<span class="sourceLineNo">1705</span>    for (int i = 0; i &lt; puts.length; i++) {<a name="line.1705"></a>
-<span class="sourceLineNo">1706</span>      puts[i] = slop ? new Put(Bytes.toBytes("row_" + i), Long.MAX_VALUE - 100) :<a name="line.1706"></a>
-<span class="sourceLineNo">1707</span>          new Put(Bytes.toBytes("row_" + i));<a name="line.1707"></a>
-<span class="sourceLineNo">1708</span>      puts[i].addColumn(COLUMN_FAMILY_BYTES, qual, value);<a name="line.1708"></a>
-<span class="sourceLineNo">1709</span>    }<a name="line.1709"></a>
-<span class="sourceLineNo">1710</span><a name="line.1710"></a>
-<span class="sourceLineNo">1711</span>    long syncs = metricsAssertHelper.getCounter("syncTimeNumOps", source);<a name="line.1711"></a>
-<span class="sourceLineNo">1712</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs, source);<a name="line.1712"></a>
-<span class="sourceLineNo">1713</span>    return syncs;<a name="line.1713"></a>
-<span class="sourceLineNo">1714</span>  }<a name="line.1714"></a>
-<span class="sourceLineNo">1715</span><a name="line.1715"></a>
-<span class="sourceLineNo">1716</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.1716"></a>
-<span class="sourceLineNo">1717</span>  // checkAndMutate tests<a name="line.1717"></a>
-<span class="sourceLineNo">1718</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.1718"></a>
-<span class="sourceLineNo">1719</span>  @Test<a name="line.1719"></a>
-<span class="sourceLineNo">1720</span>  public void testCheckAndMutate_WithEmptyRowValue() throws IOException {<a name="line.1720"></a>
-<span class="sourceLineNo">1721</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1721"></a>
-<span class="sourceLineNo">1722</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1722"></a>
-<span class="sourceLineNo">1723</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1723"></a>
-<span class="sourceLineNo">1724</span>    byte[] emptyVal = new byte[] {};<a name="line.1724"></a>
-<span class="sourceLineNo">1725</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1725"></a>
-<span class="sourceLineNo">1726</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.1726"></a>
-<span class="sourceLineNo">1727</span><a name="line.1727"></a>
-<span class="sourceLineNo">1728</span>    // Setting up region<a name="line.1728"></a>
-<span class="sourceLineNo">1729</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.1729"></a>
-<span class="sourceLineNo">1730</span>    // Putting empty data in key<a name="line.1730"></a>
-<span class="sourceLineNo">1731</span>    Put put = new Put(row1);<a name="line.1731"></a>
-<span class="sourceLineNo">1732</span>    put.addColumn(fam1, qf1, emptyVal);<a name="line.1732"></a>
-<span class="sourceLineNo">1733</span><a name="line.1733"></a>
-<span class="sourceLineNo">1734</span>    // checkAndPut with empty value<a name="line.1734"></a>
-<span class="sourceLineNo">1735</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1735"></a>
-<span class="sourceLineNo">1736</span>        new BinaryComparator(emptyVal), put);<a name="line.1736"></a>
-<span class="sourceLineNo">1737</span>    assertTrue(res);<a name="line.1737"></a>
-<span class="sourceLineNo">1738</span><a name="line.1738"></a>
-<span class="sourceLineNo">1739</span>    // Putting data in key<a name="line.1739"></a>
-<span class="sourceLineNo">1740</span>    put = new Put(row1);<a name="line.1740"></a>
-<span class="sourceLineNo">1741</span>    put.addColumn(fam1, qf1, val1);<a name="line.1741"></a>
-<span class="sourceLineNo">1742</span><a name="line.1742"></a>
-<span class="sourceLineNo">1743</span>    // checkAndPut with correct value<a name="line.1743"></a>
-<span class="sourceLineNo">1744</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1744"></a>
-<span class="sourceLineNo">1745</span>        new BinaryComparator(emptyVal), put);<a name="line.1745"></a>
-<span class="sourceLineNo">1746</span>    assertTrue(res);<a name="line.1746"></a>
-<span class="sourceLineNo">1747</span><a name="line.1747"></a>
-<span class="sourceLineNo">1748</span>    // not empty anymore<a name="line.1748"></a>
-<span class="sourceLineNo">1749</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1749"></a>
-<span class="sourceLineNo">1750</span>        new BinaryComparator(emptyVal), put);<a name="line.1750"></a>
-<span class="sourceLineNo">1751</span>    assertFalse(res);<a name="line.1751"></a>
-<span class="sourceLineNo">1752</span><a name="line.1752"></a>
-<span class="sourceLineNo">1753</span>    Delete delete = new Delete(row1);<a name="line.1753"></a>
-<span class="sourceLineNo">1754</span>    delete.addColumn(fam1, qf1);<a name="line.1754"></a>
-<span class="sourceLineNo">1755</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1755"></a>
-<span class="sourceLineNo">1756</span>        new BinaryComparator(emptyVal), delete);<a name="line.1756"></a>
-<span class="sourceLineNo">1757</span>    assertFalse(res);<a name="line.1757"></a>
-<span class="sourceLineNo">1758</span><a name="line.1758"></a>
-<span class="sourceLineNo">1759</span>    put = new Put(row1);<a name="line.1759"></a>
-<span class="sourceLineNo">1760</span>    put.addColumn(fam1, qf1, val2);<a name="line.1760"></a>
-<span class="sourceLineNo">1761</span>    // checkAndPut with correct value<a name="line.1761"></a>
-<span class="sourceLineNo">1762</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1762"></a>
-<span class="sourceLineNo">1763</span>        new BinaryComparator(val1), put);<a name="line.1763"></a>
-<span class="sourceLineNo">1764</span>    assertTrue(res);<a name="line.1764"></a>
-<span class="sourceLineNo">1765</span><a name="line.1765"></a>
-<span class="sourceLineNo">1766</span>    // checkAndDelete with correct value<a name="line.1766"></a>
-<span class="sourceLineNo">1767</span>    delete = new Delete(row1);<a name="line.1767"></a>
-<span class="sourceLineNo">1768</span>    delete.addColumn(fam1, qf1);<a name="line.1768"></a>
+<span class="sourceLineNo">404</span>    ChunkCreator.initialize(MemStoreLABImpl.CHUNK_SIZE_DEFAULT, false, 0, 0, 0, null);<a name="line.404"></a>
+<span class="sourceLineNo">405</span>    FSHLog hLog = new FSHLog(fs, rootDir, testName, CONF);<a name="line.405"></a>
+<span class="sourceLineNo">406</span>    hLog.init();<a name="line.406"></a>
+<span class="sourceLineNo">407</span>    region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, hLog,<a name="line.407"></a>
+<span class="sourceLineNo">408</span>        COLUMN_FAMILY_BYTES);<a name="line.408"></a>
+<span class="sourceLineNo">409</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.409"></a>
+<span class="sourceLineNo">410</span>    assertEquals(0, region.getMemStoreDataSize());<a name="line.410"></a>
+<span class="sourceLineNo">411</span><a name="line.411"></a>
+<span class="sourceLineNo">412</span>    // Put one value<a name="line.412"></a>
+<span class="sourceLineNo">413</span>    byte [] value = Bytes.toBytes(method);<a name="line.413"></a>
+<span class="sourceLineNo">414</span>    Put put = new Put(value);<a name="line.414"></a>
+<span class="sourceLineNo">415</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    region.put(put);<a name="line.416"></a>
+<span class="sourceLineNo">417</span>    long onePutSize = region.getMemStoreDataSize();<a name="line.417"></a>
+<span class="sourceLineNo">418</span>    assertTrue(onePutSize &gt; 0);<a name="line.418"></a>
+<span class="sourceLineNo">419</span><a name="line.419"></a>
+<span class="sourceLineNo">420</span>    RegionCoprocessorHost mockedCPHost = Mockito.mock(RegionCoprocessorHost.class);<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    doThrow(new IOException())<a name="line.421"></a>
+<span class="sourceLineNo">422</span>       .when(mockedCPHost).postBatchMutate(Mockito.&lt;MiniBatchOperationInProgress&lt;Mutation&gt;&gt;any());<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    region.setCoprocessorHost(mockedCPHost);<a name="line.423"></a>
+<span class="sourceLineNo">424</span><a name="line.424"></a>
+<span class="sourceLineNo">425</span>    put = new Put(value);<a name="line.425"></a>
+<span class="sourceLineNo">426</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("dfg"), value);<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    try {<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      region.put(put);<a name="line.428"></a>
+<span class="sourceLineNo">429</span>      fail("Should have failed with IOException");<a name="line.429"></a>
+<span class="sourceLineNo">430</span>    } catch (IOException expected) {<a name="line.430"></a>
+<span class="sourceLineNo">431</span>    }<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    long expectedSize = onePutSize * 2;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>    assertEquals("memstoreSize should be incremented",<a name="line.433"></a>
+<span class="sourceLineNo">434</span>        expectedSize, region.getMemStoreDataSize());<a name="line.434"></a>
+<span class="sourceLineNo">435</span>    assertEquals("flushable size should be incremented",<a name="line.435"></a>
+<span class="sourceLineNo">436</span>        expectedSize, store.getFlushableSize().getDataSize());<a name="line.436"></a>
+<span class="sourceLineNo">437</span><a name="line.437"></a>
+<span class="sourceLineNo">438</span>    region.setCoprocessorHost(null);<a name="line.438"></a>
+<span class="sourceLineNo">439</span>  }<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>   * A test case of HBASE-21041<a name="line.442"></a>
+<span class="sourceLineNo">443</span>   * @throws Exception Exception<a name="line.443"></a>
+<span class="sourceLineNo">444</span>   */<a name="line.444"></a>
+<span class="sourceLineNo">445</span>  @Test<a name="line.445"></a>
+<span class="sourceLineNo">446</span>  public void testFlushAndMemstoreSizeCounting() throws Exception {<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    byte[] family = Bytes.toBytes("family");<a name="line.447"></a>
+<span class="sourceLineNo">448</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.448"></a>
+<span class="sourceLineNo">449</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.449"></a>
+<span class="sourceLineNo">450</span>    try {<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      for (byte[] row : HBaseTestingUtility.ROWS) {<a name="line.451"></a>
+<span class="sourceLineNo">452</span>        Put put = new Put(row);<a name="line.452"></a>
+<span class="sourceLineNo">453</span>        put.addColumn(family, family, row);<a name="line.453"></a>
+<span class="sourceLineNo">454</span>        region.put(put);<a name="line.454"></a>
+<span class="sourceLineNo">455</span>      }<a name="line.455"></a>
+<span class="sourceLineNo">456</span>      region.flush(true);<a name="line.456"></a>
+<span class="sourceLineNo">457</span>      // After flush, data size should be zero<a name="line.457"></a>
+<span class="sourceLineNo">458</span>      assertEquals(0, region.getMemStoreDataSize());<a name="line.458"></a>
+<span class="sourceLineNo">459</span>      // After flush, a new active mutable segment is created, so the heap size<a name="line.459"></a>
+<span class="sourceLineNo">460</span>      // should equal to MutableSegment.DEEP_OVERHEAD<a name="line.460"></a>
+<span class="sourceLineNo">461</span>      assertEquals(MutableSegment.DEEP_OVERHEAD, region.getMemStoreHeapSize());<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      // After flush, offheap should be zero<a name="line.462"></a>
+<span class="sourceLineNo">463</span>      assertEquals(0, region.getMemStoreOffHeapSize());<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    } finally {<a name="line.464"></a>
+<span class="sourceLineNo">465</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.465"></a>
+<span class="sourceLineNo">466</span>      this.region = null;<a name="line.466"></a>
+<span class="sourceLineNo">467</span>      wals.close();<a name="line.467"></a>
+<span class="sourceLineNo">468</span>    }<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>  /**<a name="line.471"></a>
+<span class="sourceLineNo">472</span>   * Test we do not lose data if we fail a flush and then close.<a name="line.472"></a>
+<span class="sourceLineNo">473</span>   * Part of HBase-10466.  Tests the following from the issue description:<a name="line.473"></a>
+<span class="sourceLineNo">474</span>   * "Bug 1: Wrong calculation of HRegion.memstoreSize: When a flush fails, data to be flushed is<a name="line.474"></a>
+<span class="sourceLineNo">475</span>   * kept in each MemStore's snapshot and wait for next flush attempt to continue on it. But when<a name="line.475"></a>
+<span class="sourceLineNo">476</span>   * the next flush succeeds, the counter of total memstore size in HRegion is always deduced by<a name="line.476"></a>
+<span class="sourceLineNo">477</span>   * the sum of current memstore sizes instead of snapshots left from previous failed flush. This<a name="line.477"></a>
+<span class="sourceLineNo">478</span>   * calculation is problematic that almost every time there is failed flush, HRegion.memstoreSize<a name="line.478"></a>
+<span class="sourceLineNo">479</span>   * gets reduced by a wrong value. If region flush could not proceed for a couple cycles, the size<a name="line.479"></a>
+<span class="sourceLineNo">480</span>   * in current memstore could be much larger than the snapshot. It's likely to drift memstoreSize<a name="line.480"></a>
+<span class="sourceLineNo">481</span>   * much smaller than expected. In extreme case, if the error accumulates to even bigger than<a name="line.481"></a>
+<span class="sourceLineNo">482</span>   * HRegion's memstore size limit, any further flush is skipped because flush does not do anything<a name="line.482"></a>
+<span class="sourceLineNo">483</span>   * if memstoreSize is not larger than 0."<a name="line.483"></a>
+<span class="sourceLineNo">484</span>   * @throws Exception<a name="line.484"></a>
+<span class="sourceLineNo">485</span>   */<a name="line.485"></a>
+<span class="sourceLineNo">486</span>  @Test<a name="line.486"></a>
+<span class="sourceLineNo">487</span>  public void testFlushSizeAccounting() throws Exception {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.488"></a>
+<span class="sourceLineNo">489</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.489"></a>
+<span class="sourceLineNo">490</span>    // Only retry once.<a name="line.490"></a>
+<span class="sourceLineNo">491</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.491"></a>
+<span class="sourceLineNo">492</span>    final User user =<a name="line.492"></a>
+<span class="sourceLineNo">493</span>      User.createUserForTesting(conf, method, new String[]{"foo"});<a name="line.493"></a>
+<span class="sourceLineNo">494</span>    // Inject our faulty LocalFileSystem<a name="line.494"></a>
+<span class="sourceLineNo">495</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.496"></a>
+<span class="sourceLineNo">497</span>      @Override<a name="line.497"></a>
+<span class="sourceLineNo">498</span>      public Object run() throws Exception {<a name="line.498"></a>
+<span class="sourceLineNo">499</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.499"></a>
+<span class="sourceLineNo">500</span>        FileSystem fs = FileSystem.get(conf);<a name="line.500"></a>
+<span class="sourceLineNo">501</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.501"></a>
+<span class="sourceLineNo">502</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.502"></a>
+<span class="sourceLineNo">503</span>        HRegion region = null;<a name="line.503"></a>
+<span class="sourceLineNo">504</span>        try {<a name="line.504"></a>
+<span class="sourceLineNo">505</span>          // Initialize region<a name="line.505"></a>
+<span class="sourceLineNo">506</span>          region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, wal,<a name="line.506"></a>
+<span class="sourceLineNo">507</span>              COLUMN_FAMILY_BYTES);<a name="line.507"></a>
+<span class="sourceLineNo">508</span>          long size = region.getMemStoreDataSize();<a name="line.508"></a>
+<span class="sourceLineNo">509</span>          Assert.assertEquals(0, size);<a name="line.509"></a>
+<span class="sourceLineNo">510</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.510"></a>
+<span class="sourceLineNo">511</span>          Put p1 = new Put(row);<a name="line.511"></a>
+<span class="sourceLineNo">512</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[]) null));<a name="line.512"></a>
+<span class="sourceLineNo">513</span>          region.put(p1);<a name="line.513"></a>
+<span class="sourceLineNo">514</span>          final long sizeOfOnePut = region.getMemStoreDataSize();<a name="line.514"></a>
+<span class="sourceLineNo">515</span>          // Fail a flush which means the current memstore will hang out as memstore 'snapshot'.<a name="line.515"></a>
+<span class="sourceLineNo">516</span>          try {<a name="line.516"></a>
+<span class="sourceLineNo">517</span>            LOG.info("Flushing");<a name="line.517"></a>
+<span class="sourceLineNo">518</span>            region.flush(true);<a name="line.518"></a>
+<span class="sourceLineNo">519</span>            Assert.fail("Didn't bubble up IOE!");<a name="line.519"></a>
+<span class="sourceLineNo">520</span>          } catch (DroppedSnapshotException dse) {<a name="line.520"></a>
+<span class="sourceLineNo">521</span>            // What we are expecting<a name="line.521"></a>
+<span class="sourceLineNo">522</span>            region.closing.set(false); // this is needed for the rest of the test to work<a name="line.522"></a>
+<span class="sourceLineNo">523</span>          }<a name="line.523"></a>
+<span class="sourceLineNo">524</span>          // Make it so all writes succeed from here on out<a name="line.524"></a>
+<span class="sourceLineNo">525</span>          ffs.fault.set(false);<a name="line.525"></a>
+<span class="sourceLineNo">526</span>          // Check sizes.  Should still be the one entry.<a name="line.526"></a>
+<span class="sourceLineNo">527</span>          Assert.assertEquals(sizeOfOnePut, region.getMemStoreDataSize());<a name="line.527"></a>
+<span class="sourceLineNo">528</span>          // Now add two entries so that on this next flush that fails, we can see if we<a name="line.528"></a>
+<span class="sourceLineNo">529</span>          // subtract the right amount, the snapshot size only.<a name="line.529"></a>
+<span class="sourceLineNo">530</span>          Put p2 = new Put(row);<a name="line.530"></a>
+<span class="sourceLineNo">531</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.531"></a>
+<span class="sourceLineNo">532</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.532"></a>
+<span class="sourceLineNo">533</span>          region.put(p2);<a name="line.533"></a>
+<span class="sourceLineNo">534</span>          long expectedSize = sizeOfOnePut * 3;<a name="line.534"></a>
+<span class="sourceLineNo">535</span>          Assert.assertEquals(expectedSize, region.getMemStoreDataSize());<a name="line.535"></a>
+<span class="sourceLineNo">536</span>          // Do a successful flush.  It will clear the snapshot only.  Thats how flushes work.<a name="line.536"></a>
+<span class="sourceLineNo">537</span>          // If already a snapshot, we clear it else we move the memstore to be snapshot and flush<a name="line.537"></a>
+<span class="sourceLineNo">538</span>          // it<a name="line.538"></a>
+<span class="sourceLineNo">539</span>          region.flush(true);<a name="line.539"></a>
+<span class="sourceLineNo">540</span>          // Make sure our memory accounting is right.<a name="line.540"></a>
+<span class="sourceLineNo">541</span>          Assert.assertEquals(sizeOfOnePut * 2, region.getMemStoreDataSize());<a name="line.541"></a>
+<span class="sourceLineNo">542</span>        } finally {<a name="line.542"></a>
+<span class="sourceLineNo">543</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.543"></a>
+<span class="sourceLineNo">544</span>        }<a name="line.544"></a>
+<span class="sourceLineNo">545</span>        return null;<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>    FileSystem.closeAllForUGI(user.getUGI());<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>  @Test<a name="line.551"></a>
+<span class="sourceLineNo">552</span>  public void testCloseWithFailingFlush() throws Exception {<a name="line.552"></a>
+<span class="sourceLineNo">553</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.553"></a>
+<span class="sourceLineNo">554</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.554"></a>
+<span class="sourceLineNo">555</span>    // Only retry once.<a name="line.555"></a>
+<span class="sourceLineNo">556</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.556"></a>
+<span class="sourceLineNo">557</span>    final User user =<a name="line.557"></a>
+<span class="sourceLineNo">558</span>      User.createUserForTesting(conf, this.method, new String[]{"foo"});<a name="line.558"></a>
+<span class="sourceLineNo">559</span>    // Inject our faulty LocalFileSystem<a name="line.559"></a>
+<span class="sourceLineNo">560</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.560"></a>
+<span class="sourceLineNo">561</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.561"></a>
+<span class="sourceLineNo">562</span>      @Override<a name="line.562"></a>
+<span class="sourceLineNo">563</span>      public Object run() throws Exception {<a name="line.563"></a>
+<span class="sourceLineNo">564</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.564"></a>
+<span class="sourceLineNo">565</span>        FileSystem fs = FileSystem.get(conf);<a name="line.565"></a>
+<span class="sourceLineNo">566</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.566"></a>
+<span class="sourceLineNo">567</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.567"></a>
+<span class="sourceLineNo">568</span>        HRegion region = null;<a name="line.568"></a>
+<span class="sourceLineNo">569</span>        try {<a name="line.569"></a>
+<span class="sourceLineNo">570</span>          // Initialize region<a name="line.570"></a>
+<span class="sourceLineNo">571</span>          region = initHRegion(tableName, null, null, false,<a name="line.571"></a>
+<span class="sourceLineNo">572</span>              Durability.SYNC_WAL, wal, COLUMN_FAMILY_BYTES);<a name="line.572"></a>
+<span class="sourceLineNo">573</span>          long size = region.getMemStoreDataSize();<a name="line.573"></a>
+<span class="sourceLineNo">574</span>          Assert.assertEquals(0, size);<a name="line.574"></a>
+<span class="sourceLineNo">575</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.575"></a>
+<span class="sourceLineNo">576</span>          Put p1 = new Put(row);<a name="line.576"></a>
+<span class="sourceLineNo">577</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[])null));<a name="line.577"></a>
+<span class="sourceLineNo">578</span>          region.put(p1);<a name="line.578"></a>
+<span class="sourceLineNo">579</span>          // Manufacture an outstanding snapshot -- fake a failed flush by doing prepare step only.<a name="line.579"></a>
+<span class="sourceLineNo">580</span>          HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.580"></a>
+<span class="sourceLineNo">581</span>          StoreFlushContext storeFlushCtx =<a name="line.581"></a>
+<span class="sourceLineNo">582</span>              store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY);<a name="line.582"></a>
+<span class="sourceLineNo">583</span>          storeFlushCtx.prepare();<a name="line.583"></a>
+<span class="sourceLineNo">584</span>          // Now add two entries to the foreground memstore.<a name="line.584"></a>
+<span class="sourceLineNo">585</span>          Put p2 = new Put(row);<a name="line.585"></a>
+<span class="sourceLineNo">586</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.586"></a>
+<span class="sourceLineNo">587</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.587"></a>
+<span class="sourceLineNo">588</span>          region.put(p2);<a name="line.588"></a>
+<span class="sourceLineNo">589</span>          // Now try close on top of a failing flush.<a name="line.589"></a>
+<span class="sourceLineNo">590</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.590"></a>
+<span class="sourceLineNo">591</span>          region = null;<a name="line.591"></a>
+<span class="sourceLineNo">592</span>          fail();<a name="line.592"></a>
+<span class="sourceLineNo">593</span>        } catch (DroppedSnapshotException dse) {<a name="line.593"></a>
+<span class="sourceLineNo">594</span>          // Expected<a name="line.594"></a>
+<span class="sourceLineNo">595</span>          LOG.info("Expected DroppedSnapshotException");<a name="line.595"></a>
+<span class="sourceLineNo">596</span>        } finally {<a name="line.596"></a>
+<span class="sourceLineNo">597</span>          // Make it so all writes succeed from here on out so can close clean<a name="line.597"></a>
+<span class="sourceLineNo">598</span>          ffs.fault.set(false);<a name="line.598"></a>
+<span class="sourceLineNo">599</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.599"></a>
+<span class="sourceLineNo">600</span>        }<a name="line.600"></a>
+<span class="sourceLineNo">601</span>        return null;<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>    FileSystem.closeAllForUGI(user.getUGI());<a name="line.604"></a>
+<span class="sourceLineNo">605</span>  }<a name="line.605"></a>
+<span class="sourceLineNo">606</span><a name="line.606"></a>
+<span class="sourceLineNo">607</span>  @Test<a name="line.607"></a>
+<span class="sourceLineNo">608</span>  public void testCompactionAffectedByScanners() throws Exception {<a name="line.608"></a>
+<span class="sourceLineNo">609</span>    byte[] family = Bytes.toBytes("family");<a name="line.609"></a>
+<span class="sourceLineNo">610</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.610"></a>
+<span class="sourceLineNo">611</span><a name="line.611"></a>
+<span class="sourceLineNo">612</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.612"></a>
+<span class="sourceLineNo">613</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.613"></a>
+<span class="sourceLineNo">614</span>    region.put(put);<a name="line.614"></a>
+<span class="sourceLineNo">615</span>    region.flush(true);<a name="line.615"></a>
+<span class="sourceLineNo">616</span><a name="line.616"></a>
+<span class="sourceLineNo">617</span>    Scan scan = new Scan();<a name="line.617"></a>
+<span class="sourceLineNo">618</span>    scan.setMaxVersions(3);<a name="line.618"></a>
+<span class="sourceLineNo">619</span>    // open the first scanner<a name="line.619"></a>
+<span class="sourceLineNo">620</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.620"></a>
+<span class="sourceLineNo">621</span><a name="line.621"></a>
+<span class="sourceLineNo">622</span>    Delete delete = new Delete(Bytes.toBytes("r1"));<a name="line.622"></a>
+<span class="sourceLineNo">623</span>    region.delete(delete);<a name="line.623"></a>
+<span class="sourceLineNo">624</span>    region.flush(true);<a name="line.624"></a>
+<span class="sourceLineNo">625</span><a name="line.625"></a>
+<span class="sourceLineNo">626</span>    // open the second scanner<a name="line.626"></a>
+<span class="sourceLineNo">627</span>    RegionScanner scanner2 = region.getScanner(scan);<a name="line.627"></a>
+<span class="sourceLineNo">628</span><a name="line.628"></a>
+<span class="sourceLineNo">629</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.629"></a>
+<span class="sourceLineNo">630</span><a name="line.630"></a>
+<span class="sourceLineNo">631</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.631"></a>
+<span class="sourceLineNo">632</span><a name="line.632"></a>
+<span class="sourceLineNo">633</span>    // make a major compaction<a name="line.633"></a>
+<span class="sourceLineNo">634</span>    region.compact(true);<a name="line.634"></a>
+<span class="sourceLineNo">635</span><a name="line.635"></a>
+<span class="sourceLineNo">636</span>    // open the third scanner<a name="line.636"></a>
+<span class="sourceLineNo">637</span>    RegionScanner scanner3 = region.getScanner(scan);<a name="line.637"></a>
+<span class="sourceLineNo">638</span><a name="line.638"></a>
+<span class="sourceLineNo">639</span>    // get data from scanner 1, 2, 3 after major compaction<a name="line.639"></a>
+<span class="sourceLineNo">640</span>    scanner1.next(results);<a name="line.640"></a>
+<span class="sourceLineNo">641</span>    System.out.println(results);<a name="line.641"></a>
+<span class="sourceLineNo">642</span>    assertEquals(1, results.size());<a name="line.642"></a>
+<span class="sourceLineNo">643</span><a name="line.643"></a>
+<span class="sourceLineNo">644</span>    results.clear();<a name="line.644"></a>
+<span class="sourceLineNo">645</span>    scanner2.next(results);<a name="line.645"></a>
+<span class="sourceLineNo">646</span>    System.out.println(results);<a name="line.646"></a>
+<span class="sourceLineNo">647</span>    assertEquals(0, results.size());<a name="line.647"></a>
+<span class="sourceLineNo">648</span><a name="line.648"></a>
+<span class="sourceLineNo">649</span>    results.clear();<a name="line.649"></a>
+<span class="sourceLineNo">650</span>    scanner3.next(results);<a name="line.650"></a>
+<span class="sourceLineNo">651</span>    System.out.println(results);<a name="line.651"></a>
+<span class="sourceLineNo">652</span>    assertEquals(0, results.size());<a name="line.652"></a>
+<span class="sourceLineNo">653</span>  }<a name="line.653"></a>
+<span class="sourceLineNo">654</span><a name="line.654"></a>
+<span class="sourceLineNo">655</span>  @Test<a name="line.655"></a>
+<span class="sourceLineNo">656</span>  public void testToShowNPEOnRegionScannerReseek() throws Exception {<a name="line.656"></a>
+<span class="sourceLineNo">657</span>    byte[] family = Bytes.toBytes("family");<a name="line.657"></a>
+<span class="sourceLineNo">658</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.658"></a>
+<span class="sourceLineNo">659</span><a name="line.659"></a>
+<span class="sourceLineNo">660</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.660"></a>
+<span class="sourceLineNo">661</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.661"></a>
+<span class="sourceLineNo">662</span>    region.put(put);<a name="line.662"></a>
+<span class="sourceLineNo">663</span>    put = new Put(Bytes.toBytes("r2"));<a name="line.663"></a>
+<span class="sourceLineNo">664</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.664"></a>
+<span class="sourceLineNo">665</span>    region.put(put);<a name="line.665"></a>
+<span class="sourceLineNo">666</span>    region.flush(true);<a name="line.666"></a>
+<span class="sourceLineNo">667</span><a name="line.667"></a>
+<span class="sourceLineNo">668</span>    Scan scan = new Scan();<a name="line.668"></a>
+<span class="sourceLineNo">669</span>    scan.setMaxVersions(3);<a name="line.669"></a>
+<span class="sourceLineNo">670</span>    // open the first scanner<a name="line.670"></a>
+<span class="sourceLineNo">671</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.671"></a>
+<span class="sourceLineNo">672</span><a name="line.672"></a>
+<span class="sourceLineNo">673</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.673"></a>
+<span class="sourceLineNo">674</span><a name="line.674"></a>
+<span class="sourceLineNo">675</span>    region.compact(true);<a name="line.675"></a>
+<span class="sourceLineNo">676</span><a name="line.676"></a>
+<span class="sourceLineNo">677</span>    scanner1.reseek(Bytes.toBytes("r2"));<a name="line.677"></a>
+<span class="sourceLineNo">678</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.678"></a>
+<span class="sourceLineNo">679</span>    scanner1.next(results);<a name="line.679"></a>
+<span class="sourceLineNo">680</span>    Cell keyValue = results.get(0);<a name="line.680"></a>
+<span class="sourceLineNo">681</span>    Assert.assertTrue(Bytes.compareTo(CellUtil.cloneRow(keyValue), Bytes.toBytes("r2")) == 0);<a name="line.681"></a>
+<span class="sourceLineNo">682</span>    scanner1.close();<a name="line.682"></a>
+<span class="sourceLineNo">683</span>  }<a name="line.683"></a>
+<span class="sourceLineNo">684</span><a name="line.684"></a>
+<span class="sourceLineNo">685</span>  @Test<a name="line.685"></a>
+<span class="sourceLineNo">686</span>  public void testSkipRecoveredEditsReplay() throws Exception {<a name="line.686"></a>
+<span class="sourceLineNo">687</span>    byte[] family = Bytes.toBytes("family");<a name="line.687"></a>
+<span class="sourceLineNo">688</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.688"></a>
+<span class="sourceLineNo">689</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.689"></a>
+<span class="sourceLineNo">690</span>    try {<a name="line.690"></a>
+<span class="sourceLineNo">691</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.691"></a>
+<span class="sourceLineNo">692</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.692"></a>
+<span class="sourceLineNo">693</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.693"></a>
+<span class="sourceLineNo">694</span><a name="line.694"></a>
+<span class="sourceLineNo">695</span>      Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.695"></a>
+<span class="sourceLineNo">696</span><a name="line.696"></a>
+<span class="sourceLineNo">697</span>      long maxSeqId = 1050;<a name="line.697"></a>
+<span class="sourceLineNo">698</span>      long minSeqId = 1000;<a name="line.698"></a>
+<span class="sourceLineNo">699</span><a name="line.699"></a>
+<span class="sourceLineNo">700</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.700"></a>
+<span class="sourceLineNo">701</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.701"></a>
+<span class="sourceLineNo">702</span>        fs.create(recoveredEdits);<a name="line.702"></a>
+<span class="sourceLineNo">703</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.703"></a>
+<span class="sourceLineNo">704</span><a name="line.704"></a>
+<span class="sourceLineNo">705</span>        long time = System.nanoTime();<a name="line.705"></a>
+<span class="sourceLineNo">706</span>        WALEdit edit = new WALEdit();<a name="line.706"></a>
+<span class="sourceLineNo">707</span>        edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.707"></a>
+<span class="sourceLineNo">708</span>            .toBytes(i)));<a name="line.708"></a>
+<span class="sourceLineNo">709</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.709"></a>
+<span class="sourceLineNo">710</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.710"></a>
+<span class="sourceLineNo">711</span><a name="line.711"></a>
+<span class="sourceLineNo">712</span>        writer.close();<a name="line.712"></a>
+<span class="sourceLineNo">713</span>      }<a name="line.713"></a>
+<span class="sourceLineNo">714</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.714"></a>
+<span class="sourceLineNo">715</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.715"></a>
+<span class="sourceLineNo">716</span>      for (HStore store : region.getStores()) {<a name="line.716"></a>
+<span class="sourceLineNo">717</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), minSeqId - 1);<a name="line.717"></a>
+<span class="sourceLineNo">718</span>      }<a name="line.718"></a>
+<span class="sourceLineNo">719</span>      long seqId = region.replayRecoveredEditsIfAny(maxSeqIdInStores, null, status);<a name="line.719"></a>
+<span class="sourceLineNo">720</span>      assertEquals(maxSeqId, seqId);<a name="line.720"></a>
+<span class="sourceLineNo">721</span>      region.getMVCC().advanceTo(seqId);<a name="line.721"></a>
+<span class="sourceLineNo">722</span>      Get get = new Get(row);<a name="line.722"></a>
+<span class="sourceLineNo">723</span>      Result result = region.get(get);<a name="line.723"></a>
+<span class="sourceLineNo">724</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.724"></a>
+<span class="sourceLineNo">725</span>        List&lt;Cell&gt; kvs = result.getColumnCells(family, Bytes.toBytes(i));<a name="line.725"></a>
+<span class="sourceLineNo">726</span>        assertEquals(1, kvs.size());<a name="line.726"></a>
+<span class="sourceLineNo">727</span>        assertArrayEquals(Bytes.toBytes(i), CellUtil.cloneValue(kvs.get(0)));<a name="line.727"></a>
+<span class="sourceLineNo">728</span>      }<a name="line.728"></a>
+<span class="sourceLineNo">729</span>    } finally {<a name="line.729"></a>
+<span class="sourceLineNo">730</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.730"></a>
+<span class="sourceLineNo">731</span>      this.region = null;<a name="line.731"></a>
+<span class="sourceLineNo">732</span>      wals.close();<a name="line.732"></a>
+<span class="sourceLineNo">733</span>    }<a name="line.733"></a>
+<span class="sourceLineNo">734</span>  }<a name="line.734"></a>
+<span class="sourceLineNo">735</span><a name="line.735"></a>
+<span class="sourceLineNo">736</span>  @Test<a name="line.736"></a>
+<span class="sourceLineNo">737</span>  public void testSkipRecoveredEditsReplaySomeIgnored() throws Exception {<a name="line.737"></a>
+<span class="sourceLineNo">738</span>    byte[] family = Bytes.toBytes("family");<a name="line.738"></a>
+<span class="sourceLineNo">739</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.739"></a>
+<span class="sourceLineNo">740</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.740"></a>
+<span class="sourceLineNo">741</span>    try {<a name="line.741"></a>
+<span class="sourceLineNo">742</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.742"></a>
+<span class="sourceLineNo">743</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.743"></a>
+<span class="sourceLineNo">744</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.744"></a>
+<span class="sourceLineNo">745</span><a name="line.745"></a>
+<span class="sourceLineNo">746</span>      Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.746"></a>
+<span class="sourceLineNo">747</span><a name="line.747"></a>
+<span class="sourceLineNo">748</span>      long maxSeqId = 1050;<a name="line.748"></a>
+<span class="sourceLineNo">749</span>      long minSeqId = 1000;<a name="line.749"></a>
+<span class="sourceLineNo">750</span><a name="line.750"></a>
+<span class="sourceLineNo">751</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.751"></a>
+<span class="sourceLineNo">752</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.752"></a>
+<span class="sourceLineNo">753</span>        fs.create(recoveredEdits);<a name="line.753"></a>
+<span class="sourceLineNo">754</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.754"></a>
+<span class="sourceLineNo">755</span><a name="line.755"></a>
+<span class="sourceLineNo">756</span>        long time = System.nanoTime();<a name="line.756"></a>
+<span class="sourceLineNo">757</span>        WALEdit edit = new WALEdit();<a name="line.757"></a>
+<span class="sourceLineNo">758</span>        edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.758"></a>
+<span class="sourceLineNo">759</span>            .toBytes(i)));<a name="line.759"></a>
+<span class="sourceLineNo">760</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.760"></a>
+<span class="sourceLineNo">761</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.761"></a>
+<span class="sourceLineNo">762</span><a name="line.762"></a>
+<span class="sourceLineNo">763</span>        writer.close();<a name="line.763"></a>
+<span class="sourceLineNo">764</span>      }<a name="line.764"></a>
+<span class="sourceLineNo">765</span>      long recoverSeqId = 1030;<a name="line.765"></a>
+<span class="sourceLineNo">766</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.766"></a>
+<span class="sourceLineNo">767</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.767"></a>
+<span class="sourceLineNo">768</span>      for (HStore store : region.getStores()) {<a name="line.768"></a>
+<span class="sourceLineNo">769</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), recoverSeqId - 1);<a name="line.769"></a>
+<span class="sourceLineNo">770</span>      }<a name="line.770"></a>
+<span class="sourceLineNo">771</span>      long seqId = region.replayRecoveredEditsIfAny(maxSeqIdInStores, null, status);<a name="line.771"></a>
+<span class="sourceLineNo">772</span>      assertEquals(maxSeqId, seqId);<a name="line.772"></a>
+<span class="sourceLineNo">773</span>      region.getMVCC().advanceTo(seqId);<a name="line.773"></a>
+<span class="sourceLineNo">774</span>      Get get = new Get(row);<a name="line.774"></a>
+<span class="sourceLineNo">775</span>      Result result = region.get(get);<a name="line.775"></a>
+<span class="sourceLineNo">776</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.776"></a>
+<span class="sourceLineNo">777</span>        List&lt;Cell&gt; kvs = result.getColumnCells(family, Bytes.toBytes(i));<a name="line.777"></a>
+<span class="sourceLineNo">778</span>        if (i &lt; recoverSeqId) {<a name="line.778"></a>
+<span class="sourceLineNo">779</span>          assertEquals(0, kvs.size());<a name="line.779"></a>
+<span class="sourceLineNo">780</span>        } else {<a name="line.780"></a>
+<span class="sourceLineNo">781</span>          assertEquals(1, kvs.size());<a name="line.781"></a>
+<span class="sourceLineNo">782</span>          assertArrayEquals(Bytes.toBytes(i), CellUtil.cloneValue(kvs.get(0)));<a name="line.782"></a>
+<span class="sourceLineNo">783</span>        }<a name="line.783"></a>
+<span class="sourceLineNo">784</span>      }<a name="line.784"></a>
+<span class="sourceLineNo">785</span>    } finally {<a name="line.785"></a>
+<span class="sourceLineNo">786</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.786"></a>
+<span class="sourceLineNo">787</span>      this.region = null;<a name="line.787"></a>
+<span class="sourceLineNo">788</span>      wals.close();<a name="line.788"></a>
+<span class="sourceLineNo">789</span>    }<a name="line.789"></a>
+<span class="sourceLineNo">790</span>  }<a name="line.790"></a>
+<span class="sourceLineNo">791</span><a name="line.791"></a>
+<span class="sourceLineNo">792</span>  @Test<a name="line.792"></a>
+<span class="sourceLineNo">793</span>  public void testSkipRecoveredEditsReplayAllIgnored() throws Exception {<a name="line.793"></a>
+<span class="sourceLineNo">794</span>    byte[] family = Bytes.toBytes("family");<a name="line.794"></a>
+<span class="sourceLineNo">795</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.795"></a>
+<span class="sourceLineNo">796</span>    Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.796"></a>
+<span class="sourceLineNo">797</span>    FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.797"></a>
+<span class="sourceLineNo">798</span><a name="line.798"></a>
+<span class="sourceLineNo">799</span>    Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.799"></a>
+<span class="sourceLineNo">800</span>    for (int i = 1000; i &lt; 1050; i += 10) {<a name="line.800"></a>
+<span class="sourceLineNo">801</span>      Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.801"></a>
+<span class="sourceLineNo">802</span>      FSDataOutputStream dos = fs.create(recoveredEdits);<a name="line.802"></a>
+<span class="sourceLineNo">803</span>      dos.writeInt(i);<a name="line.803"></a>
+<span class="sourceLineNo">804</span>      dos.close();<a name="line.804"></a>
+<span class="sourceLineNo">805</span>    }<a name="line.805"></a>
+<span class="sourceLineNo">806</span>    long minSeqId = 2000;<a name="line.806"></a>
+<span class="sourceLineNo">807</span>    Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", minSeqId - 1));<a name="line.807"></a>
+<span class="sourceLineNo">808</span>    FSDataOutputStream dos = fs.create(recoveredEdits);<a name="line.808"></a>
+<span class="sourceLineNo">809</span>    dos.close();<a name="line.809"></a>
+<span class="sourceLineNo">810</span><a name="line.810"></a>
+<span class="sourceLineNo">811</span>    Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.811"></a>
+<span class="sourceLineNo">812</span>    for (HStore store : region.getStores()) {<a name="line.812"></a>
+<span class="sourceLineNo">813</span>      maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), minSeqId);<a name="line.813"></a>
+<span class="sourceLineNo">814</span>    }<a name="line.814"></a>
+<span class="sourceLineNo">815</span>    long seqId = region.replayRecoveredEditsIfAny(maxSeqIdInStores, null, null);<a name="line.815"></a>
+<span class="sourceLineNo">816</span>    assertEquals(minSeqId, seqId);<a name="line.816"></a>
+<span class="sourceLineNo">817</span>  }<a name="line.817"></a>
+<span class="sourceLineNo">818</span><a name="line.818"></a>
+<span class="sourceLineNo">819</span>  @Test<a name="line.819"></a>
+<span class="sourceLineNo">820</span>  public void testSkipRecoveredEditsReplayTheLastFileIgnored() throws Exception {<a name="line.820"></a>
+<span class="sourceLineNo">821</span>    byte[] family = Bytes.toBytes("family");<a name="line.821"></a>
+<span class="sourceLineNo">822</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.822"></a>
+<span class="sourceLineNo">823</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.823"></a>
+<span class="sourceLineNo">824</span>    try {<a name="line.824"></a>
+<span class="sourceLineNo">825</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.825"></a>
+<span class="sourceLineNo">826</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.826"></a>
+<span class="sourceLineNo">827</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.827"></a>
+<span class="sourceLineNo">828</span>      byte[][] columns = region.getTableDescriptor().getColumnFamilyNames().toArray(new byte[0][]);<a name="line.828"></a>
+<span class="sourceLineNo">829</span><a name="line.829"></a>
+<span class="sourceLineNo">830</span>      assertEquals(0, region.getStoreFileList(columns).size());<a name="line.830"></a>
+<span class="sourceLineNo">831</span><a name="line.831"></a>
+<span class="sourceLineNo">832</span>      Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.832"></a>
+<span class="sourceLineNo">833</span><a name="line.833"></a>
+<span class="sourceLineNo">834</span>      long maxSeqId = 1050;<a name="line.834"></a>
+<span class="sourceLineNo">835</span>      long minSeqId = 1000;<a name="line.835"></a>
+<span class="sourceLineNo">836</span><a name="line.836"></a>
+<span class="sourceLineNo">837</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.837"></a>
+<span class="sourceLineNo">838</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.838"></a>
+<span class="sourceLineNo">839</span>        fs.create(recoveredEdits);<a name="line.839"></a>
+<span class="sourceLineNo">840</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.840"></a>
+<span class="sourceLineNo">841</span><a name="line.841"></a>
+<span class="sourceLineNo">842</span>        long time = System.nanoTime();<a name="line.842"></a>
+<span class="sourceLineNo">843</span>        WALEdit edit = null;<a name="line.843"></a>
+<span class="sourceLineNo">844</span>        if (i == maxSeqId) {<a name="line.844"></a>
+<span class="sourceLineNo">845</span>          edit = WALEdit.createCompaction(region.getRegionInfo(),<a name="line.845"></a>
+<span class="sourceLineNo">846</span>          CompactionDescriptor.newBuilder()<a name="line.846"></a>
+<span class="sourceLineNo">847</span>          .setTableName(ByteString.copyFrom(tableName.getName()))<a name="line.847"></a>
+<span class="sourceLineNo">848</span>          .setFamilyName(ByteString.copyFrom(regionName))<a name="line.848"></a>
+<span class="sourceLineNo">849</span>          .setEncodedRegionName(ByteString.copyFrom(regionName))<a name="line.849"></a>
+<span class="sourceLineNo">850</span>          .setStoreHomeDirBytes(ByteString.copyFrom(Bytes.toBytes(regiondir.toString())))<a name="line.850"></a>
+<span class="sourceLineNo">851</span>          .setRegionName(ByteString.copyFrom(region.getRegionInfo().getRegionName()))<a name="line.851"></a>
+<span class="sourceLineNo">852</span>          .build());<a name="line.852"></a>
+<span class="sourceLineNo">853</span>        } else {<a name="line.853"></a>
+<span class="sourceLineNo">854</span>          edit = new WALEdit();<a name="line.854"></a>
+<span class="sourceLineNo">855</span>          edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.855"></a>
+<span class="sourceLineNo">856</span>            .toBytes(i)));<a name="line.856"></a>
+<span class="sourceLineNo">857</span>        }<a name="line.857"></a>
+<span class="sourceLineNo">858</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.858"></a>
+<span class="sourceLineNo">859</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.859"></a>
+<span class="sourceLineNo">860</span>        writer.close();<a name="line.860"></a>
+<span class="sourceLineNo">861</span>      }<a name="line.861"></a>
+<span class="sourceLineNo">862</span><a name="line.862"></a>
+<span class="sourceLineNo">863</span>      long recoverSeqId = 1030;<a name="line.863"></a>
+<span class="sourceLineNo">864</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.864"></a>
+<span class="sourceLineNo">865</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.865"></a>
+<span class="sourceLineNo">866</span>      for (HStore store : region.getStores()) {<a name="line.866"></a>
+<span class="sourceLineNo">867</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), recoverSeqId - 1);<a name="line.867"></a>
+<span class="sourceLineNo">868</span>      }<a name="line.868"></a>
+<span class="sourceLineNo">869</span>      long seqId = region.replayRecoveredEditsIfAny(maxSeqIdInStores, null, status);<a name="line.869"></a>
+<span class="sourceLineNo">870</span>      assertEquals(maxSeqId, seqId);<a name="line.870"></a>
+<span class="sourceLineNo">871</span><a name="line.871"></a>
+<span class="sourceLineNo">872</span>      // assert that the files are flushed<a name="line.872"></a>
+<span class="sourceLineNo">873</span>      assertEquals(1, region.getStoreFileList(columns).size());<a name="line.873"></a>
+<span class="sourceLineNo">874</span><a name="line.874"></a>
+<span class="sourceLineNo">875</span>    } finally {<a name="line.875"></a>
+<span class="sourceLineNo">876</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.876"></a>
+<span class="sourceLineNo">877</span>      this.region = null;<a name="line.877"></a>
+<span class="sourceLineNo">878</span>      wals.close();<a name="line.878"></a>
+<span class="sourceLineNo">879</span>    }<a name="line.879"></a>
+<span class="sourceLineNo">880</span>  }<a name="line.880"></a>
+<span class="sourceLineNo">881</span><a name="line.881"></a>
+<span class="sourceLineNo">882</span>  @Test<a name="line.882"></a>
+<span class="sourceLineNo">883</span>  public void testRecoveredEditsReplayCompaction() throws Exception {<a name="line.883"></a>
+<span class="sourceLineNo">884</span>    testRecoveredEditsReplayCompaction(false);<a name="line.884"></a>
+<span class="sourceLineNo">885</span>    testRecoveredEditsReplayCompaction(true);<a name="line.885"></a>
+<span class="sourceLineNo">886</span>  }<a name="line.886"></a>
+<span class="sourceLineNo">887</span><a name="line.887"></a>
+<span class="sourceLineNo">888</span>  public void testRecoveredEditsReplayCompaction(boolean mismatchedRegionName) throws Exception {<a name="line.888"></a>
+<span class="sourceLineNo">889</span>    CONF.setClass(HConstants.REGION_IMPL, HRegionForTesting.class, Region.class);<a name="line.889"></a>
+<span class="sourceLineNo">890</span>    byte[] family = Bytes.toBytes("family");<a name="line.890"></a>
+<span class="sourceLineNo">891</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.891"></a>
+<span class="sourceLineNo">892</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.892"></a>
+<span class="sourceLineNo">893</span>    try {<a name="line.893"></a>
+<span class="sourceLineNo">894</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.894"></a>
+<span class="sourceLineNo">895</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.895"></a>
+<span class="sourceLineNo">896</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.896"></a>
+<span class="sourceLineNo">897</span><a name="line.897"></a>
+<span class="sourceLineNo">898</span>      long maxSeqId = 3;<a name="line.898"></a>
+<span class="sourceLineNo">899</span>      long minSeqId = 0;<a name="line.899"></a>
+<span class="sourceLineNo">900</span><a name="line.900"></a>
+<span class="sourceLineNo">901</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.901"></a>
+<span class="sourceLineNo">902</span>        Put put = new Put(Bytes.toBytes(i));<a name="line.902"></a>
+<span class="sourceLineNo">903</span>        put.addColumn(family, Bytes.toBytes(i), Bytes.toBytes(i));<a name="line.903"></a>
+<span class="sourceLineNo">904</span>        region.put(put);<a name="line.904"></a>
+<span class="sourceLineNo">905</span>        region.flush(true);<a name="line.905"></a>
+<span class="sourceLineNo">906</span>      }<a name="line.906"></a>
+<span class="sourceLineNo">907</span><a name="line.907"></a>
+<span class="sourceLineNo">908</span>      // this will create a region with 3 files<a name="line.908"></a>
+<span class="sourceLineNo">909</span>      assertEquals(3, region.getStore(family).getStorefilesCount());<a name="line.909"></a>
+<span class="sourceLineNo">910</span>      List&lt;Path&gt; storeFiles = new ArrayList&lt;&gt;(3);<a name="line.910"></a>
+<span class="sourceLineNo">911</span>      for (HStoreFile sf : region.getStore(family).getStorefiles()) {<a name="line.911"></a>
+<span class="sourceLineNo">912</span>        storeFiles.add(sf.getPath());<a name="line.912"></a>
+<span class="sourceLineNo">913</span>      }<a name="line.913"></a>
+<span class="sourceLineNo">914</span><a name="line.914"></a>
+<span class="sourceLineNo">915</span>      // disable compaction completion<a name="line.915"></a>
+<span class="sourceLineNo">916</span>      CONF.setBoolean("hbase.hstore.compaction.complete", false);<a name="line.916"></a>
+<span class="sourceLineNo">917</span>      region.compactStores();<a name="line.917"></a>
+<span class="sourceLineNo">918</span><a name="line.918"></a>
+<span class="sourceLineNo">919</span>      // ensure that nothing changed<a name="line.919"></a>
+<span class="sourceLineNo">920</span>      assertEquals(3, region.getStore(family).getStorefilesCount());<a name="line.920"></a>
+<span class="sourceLineNo">921</span><a name="line.921"></a>
+<span class="sourceLineNo">922</span>      // now find the compacted file, and manually add it to the recovered edits<a name="line.922"></a>
+<span class="sourceLineNo">923</span>      Path tmpDir = new Path(region.getRegionFileSystem().getTempDir(), Bytes.toString(family));<a name="line.923"></a>
+<span class="sourceLineNo">924</span>      FileStatus[] files = FSUtils.listStatus(fs, tmpDir);<a name="line.924"></a>
+<span class="sourceLineNo">925</span>      String errorMsg = "Expected to find 1 file in the region temp directory "<a name="line.925"></a>
+<span class="sourceLineNo">926</span>          + "from the compaction, could not find any";<a name="line.926"></a>
+<span class="sourceLineNo">927</span>      assertNotNull(errorMsg, files);<a name="line.927"></a>
+<span class="sourceLineNo">928</span>      assertEquals(errorMsg, 1, files.length);<a name="line.928"></a>
+<span class="sourceLineNo">929</span>      // move the file inside region dir<a name="line.929"></a>
+<span class="sourceLineNo">930</span>      Path newFile = region.getRegionFileSystem().commitStoreFile(Bytes.toString(family),<a name="line.930"></a>
+<span class="sourceLineNo">931</span>          files[0].getPath());<a name="line.931"></a>
+<span class="sourceLineNo">932</span><a name="line.932"></a>
+<span class="sourceLineNo">933</span>      byte[] encodedNameAsBytes = this.region.getRegionInfo().getEncodedNameAsBytes();<a name="line.933"></a>
+<span class="sourceLineNo">934</span>      byte[] fakeEncodedNameAsBytes = new byte [encodedNameAsBytes.length];<a name="line.934"></a>
+<span class="sourceLineNo">935</span>      for (int i=0; i &lt; encodedNameAsBytes.length; i++) {<a name="line.935"></a>
+<span class="sourceLineNo">936</span>        // Mix the byte array to have a new encodedName<a name="line.936"></a>
+<span class="sourceLineNo">937</span>        fakeEncodedNameAsBytes[i] = (byte) (encodedNameAsBytes[i] + 1);<a name="line.937"></a>
+<span class="sourceLineNo">938</span>      }<a name="line.938"></a>
+<span class="sourceLineNo">939</span><a name="line.939"></a>
+<span class="sourceLineNo">940</span>      CompactionDescriptor compactionDescriptor = ProtobufUtil.toCompactionDescriptor(this.region<a name="line.940"></a>
+<span class="sourceLineNo">941</span>        .getRegionInfo(), mismatchedRegionName ? fakeEncodedNameAsBytes : null, family,<a name="line.941"></a>
+<span class="sourceLineNo">942</span>            storeFiles, Lists.newArrayList(newFile),<a name="line.942"></a>
+<span class="sourceLineNo">943</span>            region.getRegionFileSystem().getStoreDir(Bytes.toString(family)));<a name="line.943"></a>
+<span class="sourceLineNo">944</span><a name="line.944"></a>
+<span class="sourceLineNo">945</span>      WALUtil.writeCompactionMarker(region.getWAL(), this.region.getReplicationScope(),<a name="line.945"></a>
+<span class="sourceLineNo">946</span>          this.region.getRegionInfo(), compactionDescriptor, region.getMVCC());<a name="line.946"></a>
+<span class="sourceLineNo">947</span><a name="line.947"></a>
+<span class="sourceLineNo">948</span>      Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.948"></a>
+<span class="sourceLineNo">949</span><a name="line.949"></a>
+<span class="sourceLineNo">950</span>      Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", 1000));<a name="line.950"></a>
+<span class="sourceLineNo">951</span>      fs.create(recoveredEdits);<a name="line.951"></a>
+<span class="sourceLineNo">952</span>      WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.952"></a>
+<span class="sourceLineNo">953</span><a name="line.953"></a>
+<span class="sourceLineNo">954</span>      long time = System.nanoTime();<a name="line.954"></a>
+<span class="sourceLineNo">955</span><a name="line.955"></a>
+<span class="sourceLineNo">956</span>      writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, 10, time,<a name="line.956"></a>
+<span class="sourceLineNo">957</span>          HConstants.DEFAULT_CLUSTER_ID), WALEdit.createCompaction(region.getRegionInfo(),<a name="line.957"></a>
+<span class="sourceLineNo">958</span>          compactionDescriptor)));<a name="line.958"></a>
+<span class="sourceLineNo">959</span>      writer.close();<a name="line.959"></a>
+<span class="sourceLineNo">960</span><a name="line.960"></a>
+<span class="sourceLineNo">961</span>      // close the region now, and reopen again<a name="line.961"></a>
+<span class="sourceLineNo">962</span>      region.getTableDescriptor();<a name="line.962"></a>
+<span class="sourceLineNo">963</span>      region.getRegionInfo();<a name="line.963"></a>
+<span class="sourceLineNo">964</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.964"></a>
+<span class="sourceLineNo">965</span>      try {<a name="line.965"></a>
+<span class="sourceLineNo">966</span>        region = HRegion.openHRegion(region, null);<a name="line.966"></a>
+<span class="sourceLineNo">967</span>      } catch (WrongRegionException wre) {<a name="line.967"></a>
+<span class="sourceLineNo">968</span>        fail("Matching encoded region name should not have produced WrongRegionException");<a name="line.968"></a>
+<span class="sourceLineNo">969</span>      }<a name="line.969"></a>
+<span class="sourceLineNo">970</span><a name="line.970"></a>
+<span class="sourceLineNo">971</span>      // now check whether we have only one store file, the compacted one<a name="line.971"></a>
+<span class="sourceLineNo">972</span>      Collection&lt;HStoreFile&gt; sfs = region.getStore(family).getStorefiles();<a name="line.972"></a>
+<span class="sourceLineNo">973</span>      for (HStoreFile sf : sfs) {<a name="line.973"></a>
+<span class="sourceLineNo">974</span>        LOG.info(Objects.toString(sf.getPath()));<a name="line.974"></a>
+<span class="sourceLineNo">975</span>      }<a name="line.975"></a>
+<span class="sourceLineNo">976</span>      if (!mismatchedRegionName) {<a name="line.976"></a>
+<span class="sourceLineNo">977</span>        assertEquals(1, region.getStore(family).getStorefilesCount());<a name="line.977"></a>
+<span class="sourceLineNo">978</span>      }<a name="line.978"></a>
+<span class="sourceLineNo">979</span>      files = FSUtils.listStatus(fs, tmpDir);<a name="line.979"></a>
+<span class="sourceLineNo">980</span>      assertTrue("Expected to find 0 files inside " + tmpDir, files == null || files.length == 0);<a name="line.980"></a>
+<span class="sourceLineNo">981</span><a name="line.981"></a>
+<span class="sourceLineNo">982</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.982"></a>
+<span class="sourceLineNo">983</span>        Get get = new Get(Bytes.toBytes(i));<a name="line.983"></a>
+<span class="sourceLineNo">984</span>        Result result = region.get(get);<a name="line.984"></a>
+<span class="sourceLineNo">985</span>        byte[] value = result.getValue(family, Bytes.toBytes(i));<a name="line.985"></a>
+<span class="sourceLineNo">986</span>        assertArrayEquals(Bytes.toBytes(i), value);<a name="line.986"></a>
+<span class="sourceLineNo">987</span>      }<a name="line.987"></a>
+<span class="sourceLineNo">988</span>    } finally {<a name="line.988"></a>
+<span class="sourceLineNo">989</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.989"></a>
+<span class="sourceLineNo">990</span>      this.region = null;<a name="line.990"></a>
+<span class="sourceLineNo">991</span>      wals.close();<a name="line.991"></a>
+<span class="sourceLineNo">992</span>      CONF.setClass(HConstants.REGION_IMPL, HRegion.class, Region.class);<a name="line.992"></a>
+<span class="sourceLineNo">993</span>    }<a name="line.993"></a>
+<span class="sourceLineNo">994</span>  }<a name="line.994"></a>
+<span class="sourceLineNo">995</span><a name="line.995"></a>
+<span class="sourceLineNo">996</span>  @Test<a name="line.996"></a>
+<span class="sourceLineNo">997</span>  public void testFlushMarkers() throws Exception {<a name="line.997"></a>
+<span class="sourceLineNo">998</span>    // tests that flush markers are written to WAL and handled at recovered edits<a name="line.998"></a>
+<span class="sourceLineNo">999</span>    byte[] family = Bytes.toBytes("family");<a name="line.999"></a>
+<span class="sourceLineNo">1000</span>    Path logDir = TEST_UTIL.getDataTestDirOnTestFS(method + ".log");<a name="line.1000"></a>
+<span class="sourceLineNo">1001</span>    final Configuration walConf = new Configuration(TEST_UTIL.getConfiguration());<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.1002"></a>
+<span class="sourceLineNo">1003</span>    final WALFactory wals = new WALFactory(walConf, method);<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span>    final WAL wal = wals.getWAL(RegionInfoBuilder.newBuilder(tableName).build());<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span><a name="line.1005"></a>
+<span class="sourceLineNo">1006</span>    this.region = initHRegion(tableName, HConstants.EMPTY_START_ROW,<a name="line.1006"></a>
+<span class="sourceLineNo">1007</span>      HConstants.EMPTY_END_ROW, false, Durability.USE_DEFAULT, wal, family);<a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>    try {<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span><a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>      long maxSeqId = 3;<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span>      long minSeqId = 0;<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span><a name="line.1015"></a>
+<span class="sourceLineNo">1016</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>        Put put = new Put(Bytes.toBytes(i));<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span>        put.addColumn(family, Bytes.toBytes(i), Bytes.toBytes(i));<a name="line.1018"></a>
+<span class="sourceLineNo">1019</span>        region.put(put);<a name="line.1019"></a>
+<span class="sourceLineNo">1020</span>        region.flush(true);<a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>      }<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span><a name="line.1022"></a>
+<span class="sourceLineNo">1023</span>      // this will create a region with 3 files from flush<a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>      assertEquals(3, region.getStore(family).getStorefilesCount());<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span>      List&lt;String&gt; storeFiles = new ArrayList&lt;&gt;(3);<a name="line.1025"></a>
+<span class="sourceLineNo">1026</span>      for (HStoreFile sf : region.getStore(family).getStorefiles()) {<a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>        storeFiles.add(sf.getPath().getName());<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span>      }<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span><a name="line.1029"></a>
+<span class="sourceLineNo">1030</span>      // now verify that the flush markers are written<a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>      wal.shutdown();<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>      WAL.Reader reader = WALFactory.createReader(fs, AbstractFSWALProvider.getCurrentFileName(wal),<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>        TEST_UTIL.getConfiguration());<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>      try {<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span>        List&lt;WAL.Entry&gt; flushDescriptors = new ArrayList&lt;&gt;();<a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>        long lastFlushSeqId = -1;<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>        while (true) {<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>          WAL.Entry entry = reader.next();<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>          if (entry == null) {<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>            break;<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span>          }<a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>          Cell cell = entry.getEdit().getCells().get(0);<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>          if (WALEdit.isMetaEditFamily(cell)) {<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>            FlushDescriptor flushDesc = WALEdit.getFlushDescriptor(cell);<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span>            assertNotNull(flushDesc);<a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>            assertArrayEquals(tableName.getName(), flushDesc.getTableName().toByteArray());<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>            if (flushDesc.getAction() == FlushAction.START_FLUSH) {<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span>              assertTrue(flushDesc.getFlushSequenceNumber() &gt; lastFlushSeqId);<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span>            } else if (flushDesc.getAction() == FlushAction.COMMIT_FLUSH) {<a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>              assertTrue(flushDesc.getFlushSequenceNumber() == lastFlushSeqId);<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>            }<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>            lastFlushSeqId = flushDesc.getFlushSequenceNumber();<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>            assertArrayEquals(regionName, flushDesc.getEncodedRegionName().toByteArray());<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>            assertEquals(1, flushDesc.getStoreFlushesCount()); //only one store<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>            StoreFlushDescriptor storeFlushDesc = flushDesc.getStoreFlushes(0);<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>            assertArrayEquals(family, storeFlushDesc.getFamilyName().toByteArray());<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span>            assertEquals("family", storeFlushDesc.getStoreHomeDir());<a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>            if (flushDesc.getAction() == FlushAction.START_FLUSH) {<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>              assertEquals(0, storeFlushDesc.getFlushOutputCount());<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>            } else {<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>              assertEquals(1, storeFlushDesc.getFlushOutputCount()); //only one file from flush<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>              assertTrue(storeFiles.contains(storeFlushDesc.getFlushOutput(0)));<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>            }<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span><a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>            flushDescriptors.add(entry);<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>          }<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>        }<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span><a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>        assertEquals(3 * 2, flushDescriptors.size()); // START_FLUSH and COMMIT_FLUSH per flush<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span><a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>        // now write those markers to the recovered edits again.<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span><a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>        Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span><a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", 1000));<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>        fs.create(recoveredEdits);<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span><a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>        for (WAL.Entry entry : flushDescriptors) {<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>          writer.append(entry);<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>        }<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>        writer.close();<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>      } finally {<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>        if (null != reader) {<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>          try {<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>            reader.close();<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>          } catch (IOException exception) {<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>            LOG.warn("Problem closing wal: " + exception.getMessage());<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>            LOG.debug("exception details", exception);<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>          }<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>        }<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>      }<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span><a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>      // close the region now, and reopen again<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>      region = HRegion.openHRegion(region, null);<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span><a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>      // now check whether we have can read back the data from region<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>        Get get = new Get(Bytes.toBytes(i));<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>        Result result = region.get(get);<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>        byte[] value = result.getValue(family, Bytes.toBytes(i));<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>        assertArrayEquals(Bytes.toBytes(i), value);<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>      }<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>    } finally {<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>      this.region = null;<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>      wals.close();<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>    }<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>  }<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span><a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>  static class IsFlushWALMarker implements ArgumentMatcher&lt;WALEdit&gt; {<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>    volatile FlushAction[] actions;<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>    public IsFlushWALMarker(FlushAction... actions) {<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>      this.actions = actions;<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>    }<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span>    @Override<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>    public boolean matches(WALEdit edit) {<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>      List&lt;Cell&gt; cells = edit.getCells();<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>      if (cells.isEmpty()) {<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span>        return false;<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>      }<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>      if (WALEdit.isMetaEditFamily(cells.get(0))) {<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>        FlushDescriptor desc;<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>        try {<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>          desc = WALEdit.getFlushDescriptor(cells.get(0));<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>        } catch (IOException e) {<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>          LOG.warn(e.toString(), e);<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>          return false;<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>        }<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>        if (desc != null) {<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>          for (FlushAction action : actions) {<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>            if (desc.getAction() == action) {<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>              return true;<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>            }<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>          }<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>        }<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>      }<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span>      return false;<a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>    }<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>    public IsFlushWALMarker set(FlushAction... actions) {<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>      this.actions = actions;<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>      return this;<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>    }<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>  }<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span><a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>  @Test<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span>  public void testFlushMarkersWALFail() throws Exception {<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>    // test the cases where the WAL append for flush markers fail.<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>    byte[] family = Bytes.toBytes("family");<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span><a name="line.1151"></a>
+<span class="sourceLineNo">1152</span>    // spy an actual WAL implementation to throw exception (was not able to mock)<a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>    Path logDir = TEST_UTIL.getDataTestDirOnTestFS(method + "log");<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span><a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>    final Configuration walConf = new Configuration(TEST_UTIL.getConfiguration());<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>    // Make up a WAL that we can manipulate at append time.<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>    class FailAppendFlushMarkerWAL extends FSHLog {<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>      volatile FlushAction [] flushActions = null;<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span><a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>      public FailAppendFlushMarkerWAL(FileSystem fs, Path root, String logDir, Configuration conf)<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>      throws IOException {<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>        super(fs, root, logDir, conf);<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>      }<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span><a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>      @Override<a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>      protected Writer createWriterInstance(Path path) throws IOException {<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>        final Writer w = super.createWriterInstance(path);<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>        return new Writer() {<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>          @Override<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>          public void close() throws IOException {<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>            w.close();<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>          }<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span><a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>          @Override<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>          public void sync(boolean forceSync) throws IOException {<a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>            w.sync(forceSync);<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span>          }<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span><a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>          @Override<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>          public void append(Entry entry) throws IOException {<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>            List&lt;Cell&gt; cells = entry.getEdit().getCells();<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>            if (WALEdit.isMetaEditFamily(cells.get(0))) {<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>              FlushDescriptor desc = WALEdit.getFlushDescriptor(cells.get(0));<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>              if (desc != null) {<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>                for (FlushAction flushAction: flushActions) {<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>                  if (desc.getAction().equals(flushAction)) {<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>                    throw new IOException("Failed to append flush marker! " + flushAction);<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>                  }<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>                }<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>              }<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>            }<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>            w.append(entry);<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>          }<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span><a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>          @Override<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>          public long getLength() {<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>            return w.getLength();<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>          }<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>        };<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>      }<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>    }<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>    FailAppendFlushMarkerWAL wal =<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>      new FailAppendFlushMarkerWAL(FileSystem.get(walConf), FSUtils.getRootDir(walConf),<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>        method, walConf);<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>    wal.init();<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>    this.region = initHRegion(tableName, HConstants.EMPTY_START_ROW,<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>      HConstants.EMPTY_END_ROW, false, Durability.USE_DEFAULT, wal, family);<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>    int i = 0;<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>    Put put = new Put(Bytes.toBytes(i));<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>    put.setDurability(Durability.SKIP_WAL); // have to skip mocked wal<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>    put.addColumn(family, Bytes.toBytes(i), Bytes.toBytes(i));<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>    region.put(put);<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span><a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>    // 1. Test case where START_FLUSH throws exception<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>    wal.flushActions = new FlushAction [] {FlushAction.START_FLUSH};<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span><a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>    // start cache flush will throw exception<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>    try {<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>      region.flush(true);<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>      fail("This should have thrown exception");<a name="line.1221"></a>
+<span class="sourceLineNo">1222</span>    } catch (DroppedSnapshotException unexpected) {<a name="line.1222"></a>
+<span class="sourceLineNo">1223</span>      // this should not be a dropped snapshot exception. Meaning that RS will not abort<a name="line.1223"></a>
+<span class="sourceLineNo">1224</span>      throw unexpected;<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span>    } catch (IOException expected) {<a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>      // expected<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span>    }<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>    // The WAL is hosed now. It has two edits appended. We cannot roll the log without it<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>    // throwing a DroppedSnapshotException to force an abort. Just clean up the mess.<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>    region.close(true);<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>    wal.close();<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span><a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>    // 2. Test case where START_FLUSH succeeds but COMMIT_FLUSH will throw exception<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>    wal.flushActions = new FlushAction [] {FlushAction.COMMIT_FLUSH};<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>    wal = new FailAppendFlushMarkerWAL(FileSystem.get(walConf), FSUtils.getRootDir(walConf),<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>          method, walConf);<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>    wal.init();<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span>    this.region = initHRegion(tableName, HConstants.EMPTY_START_ROW,<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>      HConstants.EMPTY_END_ROW, false, Durability.USE_DEFAULT, wal, family);<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>    region.put(put);<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span><a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>    // 3. Test case where ABORT_FLUSH will throw exception.<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span>    // Even if ABORT_FLUSH throws exception, we should not fail with IOE, but continue with<a name="line.1243"></a>
+<span class="sourceLineNo">1244</span>    // DroppedSnapshotException. Below COMMMIT_FLUSH will cause flush to abort<a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>    wal.flushActions = new FlushAction [] {FlushAction.COMMIT_FLUSH, FlushAction.ABORT_FLUSH};<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span><a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>    try {<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span>      region.flush(true);<a name="line.1248"></a>
+<span class="sourceLineNo">1249</span>      fail("This should have thrown exception");<a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>    } catch (DroppedSnapshotException expected) {<a name="line.1250"></a>
+<span class="sourceLineNo">1251</span>      // we expect this exception, since we were able to write the snapshot, but failed to<a name="line.1251"></a>
+<span class="sourceLineNo">1252</span>      // write the flush marker to WAL<a name="line.1252"></a>
+<span class="sourceLineNo">1253</span>    } catch (IOException unexpected) {<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span>      throw unexpected;<a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>    }<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>  }<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span><a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>  @Test<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>  public void testGetWhileRegionClose() throws IOException {<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span>    Configuration hc = initSplit();<a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>    int numRows = 100;<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>    byte[][] families = { fam1, fam2, fam3 };<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span><a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>    // Setting up region<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span>    this.region = initHRegion(tableName, method, hc, families);<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>    // Put data in region<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span>    final int startRow = 100;<a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>    putData(startRow, numRows, qual1, families);<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>    putData(startRow, numRows, qual2, families);<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>    putData(startRow, numRows, qual3, families);<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span>    final AtomicBoolean done = new AtomicBoolean(false);<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>    final AtomicInteger gets = new AtomicInteger(0);<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>    GetTillDoneOrException[] threads = new GetTillDoneOrException[10];<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>    try {<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>      // Set ten threads running concurrently getting from the region.<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span>      for (int i = 0; i &lt; threads.length / 2; i++) {<a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>        threads[i] = new GetTillDoneOrException(i, Bytes.toBytes("" + startRow), done, gets);<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>        threads[i].setDaemon(true);<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>        threads[i].start();<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>      }<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>      // Artificially make the condition by setting closing flag explicitly.<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span>      // I can't make the issue happen with a call to region.close().<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span>      this.region.closing.set(true);<a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>      for (int i = threads.length / 2; i &lt; threads.length; i++) {<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>        threads[i] = new GetTillDoneOrException(i, Bytes.toBytes("" + startRow), done, gets);<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>        threads[i].setDaemon(true);<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>        threads[i].start();<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span>      }<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>    } finally {<a name="line.1289"></a>
+<span class="sourceLineNo">1290</span>      if (this.region != null) {<a name="line.1290"></a>
+<span class="sourceLineNo">1291</span>        HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>        this.region = null;<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>      }<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>    }<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>    done.set(true);<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>    for (GetTillDoneOrException t : threads) {<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span>      try {<a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>        t.join();<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>      } catch (InterruptedException e) {<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>        e.printStackTrace();<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>      }<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>      if (t.e != null) {<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span>        LOG.info("Exception=" + t.e);<a name="line.1303"></a>
+<span class="sourceLineNo">1304</span>        assertFalse("Found a NPE in " + t.getName(), t.e instanceof NullPointerException);<a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>      }<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>    }<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span>  }<a name="line.1307"></a>
+<span class="sourceLineNo">1308</span><a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>  /*<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>   * Thread that does get on single row until 'done' flag is flipped. If an<a name="line.1310"></a>
+<span class="sourceLineNo">1311</span>   * exception causes us to fail, it records it.<a name="line.1311"></a>
+<span class="sourceLineNo">1312</span>   */<a name="line.1312"></a>
+<span class="sourceLineNo">1313</span>  class GetTillDoneOrException extends Thread {<a name="line.1313"></a>
+<span class="sourceLineNo">1314</span>    private final Get g;<a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>    private final AtomicBoolean done;<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>    private final AtomicInteger count;<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>    private Exception e;<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span><a name="line.1318"></a>
+<span class="sourceLineNo">1319</span>    GetTillDoneOrException(final int i, final byte[] r, final AtomicBoolean d,<a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>        final AtomicInteger c) {<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>      super("getter." + i);<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>      this.g = new Get(r);<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>      this.done = d;<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span>      this.count = c;<a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>    }<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span><a name="line.1326"></a>
+<span class="sourceLineNo">1327</span>    @Override<a name="line.1327"></a>
+<span class="sourceLineNo">1328</span>    public void run() {<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>      while (!this.done.get()) {<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span>        try {<a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>          assertTrue(region.get(g).size() &gt; 0);<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>          this.count.incrementAndGet();<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>        } catch (Exception e) {<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>          this.e = e;<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span>          break;<a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>        }<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>      }<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>    }<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>  }<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span><a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>  /*<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>   * An involved filter test. Has multiple column families and deletes in mix.<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>   */<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>  @Test<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>  public void testWeirdCacheBehaviour() throws Exception {<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.1346"></a>
+<span class="sourceLineNo">1347</span>    byte[][] FAMILIES = new byte[][] { Bytes.toBytes("trans-blob"), Bytes.toBytes("trans-type"),<a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>        Bytes.toBytes("trans-date"), Bytes.toBytes("trans-tags"), Bytes.toBytes("trans-group") };<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span>    this.region = initHRegion(tableName, method, CONF, FAMILIES);<a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>    String value = "this is the value";<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>    String value2 = "this is some other value";<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>    String keyPrefix1 = "prefix1";<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>    String keyPrefix2 = "prefix2";<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span>    String keyPrefix3 = "prefix3";<a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>    putRows(this.region, 3, value, keyPrefix1);<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>    putRows(this.region, 3, value, keyPrefix2);<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span>    putRows(this.region, 3, value, keyPrefix3);<a name="line.1357"></a>
+<span class="sourceLineNo">1358</span>    putRows(this.region, 3, value2, keyPrefix1);<a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>    putRows(this.region, 3, value2, keyPrefix2);<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>    putRows(this.region, 3, value2, keyPrefix3);<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span>    System.out.println("Checking values for key: " + keyPrefix1);<a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>    assertEquals("Got back incorrect number of rows from scan", 3,<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>        getNumberOfRows(keyPrefix1, value2, this.region));<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span>    System.out.println("Checking values for key: " + keyPrefix2);<a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>    assertEquals("Got back incorrect number of rows from scan", 3,<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span>        getNumberOfRows(keyPrefix2, value2, this.region));<a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>    System.out.println("Checking values for key: " + keyPrefix3);<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>    assertEquals("Got back incorrect number of rows from scan", 3,<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>        getNumberOfRows(keyPrefix3, value2, this.region));<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>    deleteColumns(this.region, value2, keyPrefix1);<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>    deleteColumns(this.region, value2, keyPrefix2);<a name="line.1371"></a>
+<span class="sourceLineNo">1372</span>    deleteColumns(this.region, value2, keyPrefix3);<a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>    System.out.println("Starting important checks.....");<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>    assertEquals("Got back incorrect number of rows from scan: " + keyPrefix1, 0,<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span>        getNumberOfRows(keyPrefix1, value2, this.region));<a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>    assertEquals("Got back incorrect number of rows from scan: " + keyPrefix2, 0,<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>        getNumberOfRows(keyPrefix2, value2, this.region));<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>    assertEquals("Got back incorrect number of rows from scan: " + keyPrefix3, 0,<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span>        getNumberOfRows(keyPrefix3, value2, this.region));<a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>  }<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span><a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>  @Test<a name="line.1382"></a>
+<span class="sourceLineNo">1383</span>  public void testAppendWithReadOnlyTable() throws Exception {<a name="line.1383"></a>
+<span class="sourceLineNo">1384</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.1384"></a>
+<span class="sourceLineNo">1385</span>    this.region = initHRegion(tableName, method, CONF, true, Bytes.toBytes("somefamily"));<a name="line.1385"></a>
+<span class="sourceLineNo">1386</span>    boolean exceptionCaught = false;<a name="line.1386"></a>
+<span class="sourceLineNo">1387</span>    Append append = new Append(Bytes.toBytes("somerow"));<a name="line.1387"></a>
+<span class="sourceLineNo">1388</span>    append.setDurability(Durability.SKIP_WAL);<a name="line.1388"></a>
+<span class="sourceLineNo">1389</span>    append.addColumn(Bytes.toBytes("somefamily"), Bytes.toBytes("somequalifier"),<a name="line.1389"></a>
+<span class="sourceLineNo">1390</span>        Bytes.toBytes("somevalue"));<a name="line.1390"></a>
+<span class="sourceLineNo">1391</span>    try {<a name="line.1391"></a>
+<span class="sourceLineNo">1392</span>      region.append(append);<a name="line.1392"></a>
+<span class="sourceLineNo">1393</span>    } catch (IOException e) {<a name="line.1393"></a>
+<span class="sourceLineNo">1394</span>      exceptionCaught = true;<a name="line.1394"></a>
+<span class="sourceLineNo">1395</span>    }<a name="line.1395"></a>
+<span class="sourceLineNo">1396</span>    assertTrue(exceptionCaught == true);<a name="line.1396"></a>
+<span class="sourceLineNo">1397</span>  }<a name="line.1397"></a>
+<span class="sourceLineNo">1398</span><a name="line.1398"></a>
+<span class="sourceLineNo">1399</span>  @Test<a name="line.1399"></a>
+<span class="sourceLineNo">1400</span>  public void testIncrWithReadOnlyTable() throws Exception {<a name="line.1400"></a>
+<span class="sourceLineNo">1401</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.1401"></a>
+<span class="sourceLineNo">1402</span>    this.region = initHRegion(tableName, method, CONF, true, Bytes.toBytes("somefamily"));<a name="line.1402"></a>
+<span class="sourceLineNo">1403</span>    boolean exceptionCaught = false;<a name="line.1403"></a>
+<span class="sourceLineNo">1404</span>    Increment inc = new Increment(Bytes.toBytes("somerow"));<a name="line.1404"></a>
+<span class="sourceLineNo">1405</span>    inc.setDurability(Durability.SKIP_WAL);<a name="line.1405"></a>
+<span class="sourceLineNo">1406</span>    inc.addColumn(Bytes.toBytes("somefamily"), Bytes.toBytes("somequalifier"), 1L);<a name="line.1406"></a>
+<span class="sourceLineNo">1407</span>    try {<a name="line.1407"></a>
+<span class="sourceLineNo">1408</span>      region.increment(inc);<a name="line.1408"></a>
+<span class="sourceLineNo">1409</span>    } catch (IOException e) {<a name="line.1409"></a>
+<span class="sourceLineNo">1410</span>      exceptionCaught = true;<a name="line.1410"></a>
+<span class="sourceLineNo">1411</span>    }<a name="line.1411"></a>
+<span class="sourceLineNo">1412</span>    assertTrue(exceptionCaught == true);<a name="line.1412"></a>
+<span class="sourceLineNo">1413</span>  }<a name="line.1413"></a>
+<span class="sourceLineNo">1414</span><a name="line.1414"></a>
+<span class="sourceLineNo">1415</span>  private void deleteColumns(HRegion r, String value, String keyPrefix) throws IOException {<a name="line.1415"></a>
+<span class="sourceLineNo">1416</span>    InternalScanner scanner = buildScanner(keyPrefix, value, r);<a name="line.1416"></a>
+<span class="sourceLineNo">1417</span>    int count = 0;<a name="line.1417"></a>
+<span class="sourceLineNo">1418</span>    boolean more = false;<a name="line.1418"></a>
+<span class="sourceLineNo">1419</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.1419"></a>
+<span class="sourceLineNo">1420</span>    do {<a name="line.1420"></a>
+<span class="sourceLineNo">1421</span>      more = scanner.next(results);<a name="line.1421"></a>
+<span class="sourceLineNo">1422</span>      if (results != null &amp;&amp; !results.isEmpty())<a name="line.1422"></a>
+<span class="sourceLineNo">1423</span>        count++;<a name="line.1423"></a>
+<span class="sourceLineNo">1424</span>      else<a name="line.1424"></a>
+<span class="sourceLineNo">1425</span>        break;<a name="line.1425"></a>
+<span class="sourceLineNo">1426</span>      Delete delete = new Delete(CellUtil.cloneRow(results.get(0)));<a name="line.1426"></a>
+<span class="sourceLineNo">1427</span>      delete.addColumn(Bytes.toBytes("trans-tags"), Bytes.toBytes("qual2"));<a name="line.1427"></a>
+<span class="sourceLineNo">1428</span>      r.delete(delete);<a name="line.1428"></a>
+<span class="sourceLineNo">1429</span>      results.clear();<a name="line.1429"></a>
+<span class="sourceLineNo">1430</span>    } while (more);<a name="line.1430"></a>
+<span class="sourceLineNo">1431</span>    assertEquals("Did not perform correct number of deletes", 3, count);<a name="line.1431"></a>
+<span class="sourceLineNo">1432</span>  }<a name="line.1432"></a>
+<span class="sourceLineNo">1433</span><a name="line.1433"></a>
+<span class="sourceLineNo">1434</span>  private int getNumberOfRows(String keyPrefix, String value, HRegion r) throws Exception {<a name="line.1434"></a>
+<span class="sourceLineNo">1435</span>    InternalScanner resultScanner = buildScanner(keyPrefix, value, r);<a name="line.1435"></a>
+<span class="sourceLineNo">1436</span>    int numberOfResults = 0;<a name="line.1436"></a>
+<span class="sourceLineNo">1437</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.1437"></a>
+<span class="sourceLineNo">1438</span>    boolean more = false;<a name="line.1438"></a>
+<span class="sourceLineNo">1439</span>    do {<a name="line.1439"></a>
+<span class="sourceLineNo">1440</span>      more = resultScanner.next(results);<a name="line.1440"></a>
+<span class="sourceLineNo">1441</span>      if (results != null &amp;&amp; !results.isEmpty())<a name="line.1441"></a>
+<span class="sourceLineNo">1442</span>        numberOfResults++;<a name="line.1442"></a>
+<span class="sourceLineNo">1443</span>      else<a name="line.1443"></a>
+<span class="sourceLineNo">1444</span>        break;<a name="line.1444"></a>
+<span class="sourceLineNo">1445</span>      for (Cell kv : results) {<a name="line.1445"></a>
+<span class="sourceLineNo">1446</span>        System.out.println("kv=" + kv.toString() + ", " + Bytes.toString(CellUtil.cloneValue(kv)));<a name="line.1446"></a>
+<span class="sourceLineNo">1447</span>      }<a name="line.1447"></a>
+<span class="sourceLineNo">1448</span>      results.clear();<a name="line.1448"></a>
+<span class="sourceLineNo">1449</span>    } while (more);<a name="line.1449"></a>
+<span class="sourceLineNo">1450</span>    return numberOfResults;<a name="line.1450"></a>
+<span class="sourceLineNo">1451</span>  }<a name="line.1451"></a>
+<span class="sourceLineNo">1452</span><a name="line.1452"></a>
+<span class="sourceLineNo">1453</span>  private InternalScanner buildScanner(String keyPrefix, String value, HRegion r)<a name="line.1453"></a>
+<span class="sourceLineNo">1454</span>      throws IOException {<a name="line.1454"></a>
+<span class="sourceLineNo">1455</span>    // Defaults FilterList.Operator.MUST_PASS_ALL.<a name="line.1455"></a>
+<span class="sourceLineNo">1456</span>    FilterList allFilters = new FilterList();<a name="line.1456"></a>
+<span class="sourceLineNo">1457</span>    allFilters.addFilter(new PrefixFilter(Bytes.toBytes(keyPrefix)));<a name="line.1457"></a>
+<span class="sourceLineNo">1458</span>    // Only return rows where this column value exists in the row.<a name="line.1458"></a>
+<span class="sourceLineNo">1459</span>    SingleColumnValueFilter filter = new SingleColumnValueFilter(Bytes.toBytes("trans-tags"),<a name="line.1459"></a>
+<span class="sourceLineNo">1460</span>        Bytes.toBytes("qual2"), CompareOperator.EQUAL, Bytes.toBytes(value));<a name="line.1460"></a>
+<span class="sourceLineNo">1461</span>    filter.setFilterIfMissing(true);<a name="line.1461"></a>
+<span class="sourceLineNo">1462</span>    allFilters.addFilter(filter);<a name="line.1462"></a>
+<span class="sourceLineNo">1463</span>    Scan scan = new Scan();<a name="line.1463"></a>
+<span class="sourceLineNo">1464</span>    scan.addFamily(Bytes.toBytes("trans-blob"));<a name="line.1464"></a>
+<span class="sourceLineNo">1465</span>    scan.addFamily(Bytes.toBytes("trans-type"));<a name="line.1465"></a>
+<span class="sourceLineNo">1466</span>    scan.addFamily(Bytes.toBytes("trans-date"));<a name="line.1466"></a>
+<span class="sourceLineNo">1467</span>    scan.addFamily(Bytes.toBytes("trans-tags"));<a name="line.1467"></a>
+<span class="sourceLineNo">1468</span>    scan.addFamily(Bytes.toBytes("trans-group"));<a name="line.1468"></a>
+<span class="sourceLineNo">1469</span>    scan.setFilter(allFilters);<a name="line.1469"></a>
+<span class="sourceLineNo">1470</span>    return r.getScanner(scan);<a name="line.1470"></a>
+<span class="sourceLineNo">1471</span>  }<a name="line.1471"></a>
+<span class="sourceLineNo">1472</span><a name="line.1472"></a>
+<span class="sourceLineNo">1473</span>  private void putRows(HRegion r, int numRows, String value, String key) throws IOException {<a name="line.1473"></a>
+<span class="sourceLineNo">1474</span>    for (int i = 0; i &lt; numRows; i++) {<a name="line.1474"></a>
+<span class="sourceLineNo">1475</span>      String row = key + "_" + i/* UUID.randomUUID().toString() */;<a name="line.1475"></a>
+<span class="sourceLineNo">1476</span>      System.out.println(String.format("Saving row: %s, with value %s", row, value));<a name="line.1476"></a>
+<span class="sourceLineNo">1477</span>      Put put = new Put(Bytes.toBytes(row));<a name="line.1477"></a>
+<span class="sourceLineNo">1478</span>      put.setDurability(Durability.SKIP_WAL);<a name="line.1478"></a>
+<span class="sourceLineNo">1479</span>      put.addColumn(Bytes.toBytes("trans-blob"), null, Bytes.toBytes("value for blob"));<a name="line.1479"></a>
+<span class="sourceLineNo">1480</span>      put.addColumn(Bytes.toBytes("trans-type"), null, Bytes.toBytes("statement"));<a name="line.1480"></a>
+<span class="sourceLineNo">1481</span>      put.addColumn(Bytes.toBytes("trans-date"), null, Bytes.toBytes("20090921010101999"));<a name="line.1481"></a>
+<span class="sourceLineNo">1482</span>      put.addColumn(Bytes.toBytes("trans-tags"), Bytes.toBytes("qual2"), Bytes.toBytes(value));<a name="line.1482"></a>
+<span class="sourceLineNo">1483</span>      put.addColumn(Bytes.toBytes("trans-group"), null, Bytes.toBytes("adhocTransactionGroupId"));<a name="line.1483"></a>
+<span class="sourceLineNo">1484</span>      r.put(put);<a name="line.1484"></a>
+<span class="sourceLineNo">1485</span>    }<a name="line.1485"></a>
+<span class="sourceLineNo">1486</span>  }<a name="line.1486"></a>
+<span class="sourceLineNo">1487</span><a name="line.1487"></a>
+<span class="sourceLineNo">1488</span>  @Test<a name="line.1488"></a>
+<span class="sourceLineNo">1489</span>  public void testFamilyWithAndWithoutColon() throws Exception {<a name="line.1489"></a>
+<span class="sourceLineNo">1490</span>    byte[] cf = Bytes.toBytes(COLUMN_FAMILY);<a name="line.1490"></a>
+<span class="sourceLineNo">1491</span>    this.region = initHRegion(tableName, method, CONF, cf);<a name="line.1491"></a>
+<span class="sourceLineNo">1492</span>    Put p = new Put(tableName.toBytes());<a name="line.1492"></a>
+<span class="sourceLineNo">1493</span>    byte[] cfwithcolon = Bytes.toBytes(COLUMN_FAMILY + ":");<a name="line.1493"></a>
+<span class="sourceLineNo">1494</span>    p.addColumn(cfwithcolon, cfwithcolon, cfwithcolon);<a name="line.1494"></a>
+<span class="sourceLineNo">1495</span>    boolean exception = false;<a name="line.1495"></a>
+<span class="sourceLineNo">1496</span>    try {<a name="line.1496"></a>
+<span class="sourceLineNo">1497</span>      this.region.put(p);<a name="line.1497"></a>
+<span class="sourceLineNo">1498</span>    } catch (NoSuchColumnFamilyException e) {<a name="line.1498"></a>
+<span class="sourceLineNo">1499</span>      exception = true;<a name="line.1499"></a>
+<span class="sourceLineNo">1500</span>    }<a name="line.1500"></a>
+<span class="sourceLineNo">1501</span>    assertTrue(exception);<a name="line.1501"></a>
+<span class="sourceLineNo">1502</span>  }<a name="line.1502"></a>
+<span class="sourceLineNo">1503</span><a name="line.1503"></a>
+<span class="sourceLineNo">1504</span>  @Test<a name="line.1504"></a>
+<span class="sourceLineNo">1505</span>  public void testBatchPut_whileNoRowLocksHeld() throws IOException {<a name="line.1505"></a>
+<span class="sourceLineNo">1506</span>    final Put[] puts = new Put[10];<a name="line.1506"></a>
+<span class="sourceLineNo">1507</span>    MetricsWALSource source = CompatibilitySingletonFactory.getInstance(MetricsWALSource.class);<a name="line.1507"></a>
+<span class="sourceLineNo">1508</span>    long syncs = prepareRegionForBachPut(puts, source, false);<a name="line.1508"></a>
+<span class="sourceLineNo">1509</span><a name="line.1509"></a>
+<span class="sourceLineNo">1510</span>    OperationStatus[] codes = this.region.batchMutate(puts);<a name="line.1510"></a>
+<span class="sourceLineNo">1511</span>    assertEquals(10, codes.length);<a name="line.1511"></a>
+<span class="sourceLineNo">1512</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.1512"></a>
+<span class="sourceLineNo">1513</span>      assertEquals(OperationStatusCode.SUCCESS, codes[i].getOperationStatusCode());<a name="line.1513"></a>
+<span class="sourceLineNo">1514</span>    }<a name="line.1514"></a>
+<span class="sourceLineNo">1515</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs + 1, source);<a name="line.1515"></a>
+<span class="sourceLineNo">1516</span><a name="line.1516"></a>
+<span class="sourceLineNo">1517</span>    LOG.info("Next a batch put with one invalid family");<a name="line.1517"></a>
+<span class="sourceLineNo">1518</span>    puts[5].addColumn(Bytes.toBytes("BAD_CF"), qual, value);<a name="line.1518"></a>
+<span class="sourceLineNo">1519</span>    codes = this.region.batchMutate(puts);<a name="line.1519"></a>
+<span class="sourceLineNo">1520</span>    assertEquals(10, codes.length);<a name="line.1520"></a>
+<span class="sourceLineNo">1521</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.1521"></a>
+<span class="sourceLineNo">1522</span>      assertEquals((i == 5) ? OperationStatusCode.BAD_FAMILY : OperationStatusCode.SUCCESS,<a name="line.1522"></a>
+<span class="sourceLineNo">1523</span>          codes[i].getOperationStatusCode());<a name="line.1523"></a>
+<span class="sourceLineNo">1524</span>    }<a name="line.1524"></a>
+<span class="sourceLineNo">1525</span><a name="line.1525"></a>
+<span class="sourceLineNo">1526</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs + 2, source);<a name="line.1526"></a>
+<span class="sourceLineNo">1527</span>  }<a name="line.1527"></a>
+<span class="sourceLineNo">1528</span><a name="line.1528"></a>
+<span class="sourceLineNo">1529</span>  @Test<a name="line.1529"></a>
+<span class="sourceLineNo">1530</span>  public void testBatchPut_whileMultipleRowLocksHeld() throws Exception {<a name="line.1530"></a>
+<span class="sourceLineNo">1531</span>    final Put[] puts = new Put[10];<a name="line.1531"></a>
+<span class="sourceLineNo">1532</span>    MetricsWALSource source = CompatibilitySingletonFactory.getInstance(MetricsWALSource.class);<a name="line.1532"></a>
+<span class="sourceLineNo">1533</span>    long syncs = prepareRegionForBachPut(puts, source, false);<a name="line.1533"></a>
+<span class="sourceLineNo">1534</span><a name="line.1534"></a>
+<span class="sourceLineNo">1535</span>    puts[5].addColumn(Bytes.toBytes("BAD_CF"), qual, value);<a name="line.1535"></a>
+<span class="sourceLineNo">1536</span><a name="line.1536"></a>
+<span class="sourceLineNo">1537</span>    LOG.info("batchPut will have to break into four batches to avoid row locks");<a name="line.1537"></a>
+<span class="sourceLineNo">1538</span>    RowLock rowLock1 = region.getRowLock(Bytes.toBytes("row_2"));<a name="line.1538"></a>
+<span class="sourceLineNo">1539</span>    RowLock rowLock2 = region.getRowLock(Bytes.toBytes("row_1"));<a name="line.1539"></a>
+<span class="sourceLineNo">1540</span>    RowLock rowLock3 = region.getRowLock(Bytes.toBytes("row_3"));<a name="line.1540"></a>
+<span class="sourceLineNo">1541</span>    RowLock rowLock4 = region.getRowLock(Bytes.toBytes("row_3"), true);<a name="line.1541"></a>
+<span class="sourceLineNo">1542</span><a name="line.1542"></a>
+<span class="sourceLineNo">1543</span>    MultithreadedTestUtil.TestContext ctx = new MultithreadedTestUtil.TestContext(CONF);<a name="line.1543"></a>
+<span class="sourceLineNo">1544</span>    final AtomicReference&lt;OperationStatus[]&gt; retFromThread = new AtomicReference&lt;&gt;();<a name="line.1544"></a>
+<span class="sourceLineNo">1545</span>    final CountDownLatch startingPuts = new CountDownLatch(1);<a name="line.1545"></a>
+<span class="sourceLineNo">1546</span>    final CountDownLatch startingClose = new CountDownLatch(1);<a name="line.1546"></a>
+<span class="sourceLineNo">1547</span>    TestThread putter = new TestThread(ctx) {<a name="line.1547"></a>
+<span class="sourceLineNo">1548</span>      @Override<a name="line.1548"></a>
+<span class="sourceLineNo">1549</span>      public void doWork() throws IOException {<a name="line.1549"></a>
+<span class="sourceLineNo">1550</span>        startingPuts.countDown();<a name="line.1550"></a>
+<span class="sourceLineNo">1551</span>        retFromThread.set(region.batchMutate(puts));<a name="line.1551"></a>
+<span class="sourceLineNo">1552</span>      }<a name="line.1552"></a>
+<span class="sourceLineNo">1553</span>    };<a name="line.1553"></a>
+<span class="sourceLineNo">1554</span>    LOG.info("...starting put thread while holding locks");<a name="line.1554"></a>
+<span class="sourceLineNo">1555</span>    ctx.addThread(putter);<a name="line.1555"></a>
+<span class="sourceLineNo">1556</span>    ctx.startThreads();<a name="line.1556"></a>
+<span class="sourceLineNo">1557</span><a name="line.1557"></a>
+<span class="sourceLineNo">1558</span>    // Now attempt to close the region from another thread.  Prior to HBASE-12565<a name="line.1558"></a>
+<span class="sourceLineNo">1559</span>    // this would cause the in-progress batchMutate operation to to fail with<a name="line.1559"></a>
+<span class="sourceLineNo">1560</span>    // exception because it use to release and re-acquire the close-guard lock<a name="line.1560"></a>
+<span class="sourceLineNo">1561</span>    // between batches.  Caller then didn't get status indicating which writes succeeded.<a name="line.1561"></a>
+<span class="sourceLineNo">1562</span>    // We now expect this thread to block until the batchMutate call finishes.<a name="line.1562"></a>
+<span class="sourceLineNo">1563</span>    Thread regionCloseThread = new TestThread(ctx) {<a name="line.1563"></a>
+<span class="sourceLineNo">1564</span>      @Override<a name="line.1564"></a>
+<span class="sourceLineNo">1565</span>      public void doWork() {<a name="line.1565"></a>
+<span class="sourceLineNo">1566</span>        try {<a name="line.1566"></a>
+<span class="sourceLineNo">1567</span>          startingPuts.await();<a name="line.1567"></a>
+<span class="sourceLineNo">1568</span>          // Give some time for the batch mutate to get in.<a name="line.1568"></a>
+<span class="sourceLineNo">1569</span>          // We don't want to race with the mutate<a name="line.1569"></a>
+<span class="sourceLineNo">1570</span>          Thread.sleep(10);<a name="line.1570"></a>
+<span class="sourceLineNo">1571</span>          startingClose.countDown();<a name="line.1571"></a>
+<span class="sourceLineNo">1572</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.1572"></a>
+<span class="sourceLineNo">1573</span>          region = null;<a name="line.1573"></a>
+<span class="sourceLineNo">1574</span>        } catch (IOException e) {<a name="line.1574"></a>
+<span class="sourceLineNo">1575</span>          throw new RuntimeException(e);<a name="line.1575"></a>
+<span class="sourceLineNo">1576</span>        } catch (InterruptedException e) {<a name="line.1576"></a>
+<span class="sourceLineNo">1577</span>          throw new RuntimeException(e);<a name="line.1577"></a>
+<span class="sourceLineNo">1578</span>        }<a name="line.1578"></a>
+<span class="sourceLineNo">1579</span>      }<a name="line.1579"></a>
+<span class="sourceLineNo">1580</span>    };<a name="line.1580"></a>
+<span class="sourceLineNo">1581</span>    regionCloseThread.start();<a name="line.1581"></a>
+<span class="sourceLineNo">1582</span><a name="line.1582"></a>
+<span class="sourceLineNo">1583</span>    startingClose.await();<a name="line.1583"></a>
+<span class="sourceLineNo">1584</span>    startingPuts.await();<a name="line.1584"></a>
+<span class="sourceLineNo">1585</span>    Thread.sleep(100);<a name="line.1585"></a>
+<span class="sourceLineNo">1586</span>    LOG.info("...releasing row lock 1, which should let put thread continue");<a name="line.1586"></a>
+<span class="sourceLineNo">1587</span>    rowLock1.release();<a name="line.1587"></a>
+<span class="sourceLineNo">1588</span>    rowLock2.release();<a name="line.1588"></a>
+<span class="sourceLineNo">1589</span>    rowLock3.release();<a name="line.1589"></a>
+<span class="sourceLineNo">1590</span>    waitForCounter(source, "syncTimeNumOps", syncs + 1);<a name="line.1590"></a>
+<span class="sourceLineNo">1591</span><a name="line.1591"></a>
+<span class="sourceLineNo">1592</span>    LOG.info("...joining on put thread");<a name="line.1592"></a>
+<span class="sourceLineNo">1593</span>    ctx.stop();<a name="line.1593"></a>
+<span class="sourceLineNo">1594</span>    regionCloseThread.join();<a name="line.1594"></a>
+<span class="sourceLineNo">1595</span><a name="line.1595"></a>
+<span class="sourceLineNo">1596</span>    OperationStatus[] codes = retFromThread.get();<a name="line.1596"></a>
+<span class="sourceLineNo">1597</span>    for (int i = 0; i &lt; codes.length; i++) {<a name="line.1597"></a>
+<span class="sourceLineNo">1598</span>      assertEquals((i == 5) ? OperationStatusCode.BAD_FAMILY : OperationStatusCode.SUCCESS,<a name="line.1598"></a>
+<span class="sourceLineNo">1599</span>          codes[i].getOperationStatusCode());<a name="line.1599"></a>
+<span class="sourceLineNo">1600</span>    }<a name="line.1600"></a>
+<span class="sourceLineNo">1601</span>    rowLock4.release();<a name="line.1601"></a>
+<span class="sourceLineNo">1602</span>  }<a name="line.1602"></a>
+<span class="sourceLineNo">1603</span><a name="line.1603"></a>
+<span class="sourceLineNo">1604</span>  private void waitForCounter(MetricsWALSource source, String metricName, long expectedCount)<a name="line.1604"></a>
+<span class="sourceLineNo">1605</span>      throws InterruptedException {<a name="line.1605"></a>
+<span class="sourceLineNo">1606</span>    long startWait = System.currentTimeMillis();<a name="line.1606"></a>
+<span class="sourceLineNo">1607</span>    long currentCount;<a name="line.1607"></a>
+<span class="sourceLineNo">1608</span>    while ((currentCount = metricsAssertHelper.getCounter(metricName, source)) &lt; expectedCount) {<a name="line.1608"></a>
+<span class="sourceLineNo">1609</span>      Thread.sleep(100);<a name="line.1609"></a>
+<span class="sourceLineNo">1610</span>      if (System.currentTimeMillis() - startWait &gt; 10000) {<a name="line.1610"></a>
+<span class="sourceLineNo">1611</span>        fail(String.format("Timed out waiting for '%s' &gt;= '%s', currentCount=%s", metricName,<a name="line.1611"></a>
+<span class="sourceLineNo">1612</span>            expectedCount, currentCount));<a name="line.1612"></a>
+<span class="sourceLineNo">1613</span>      }<a name="line.1613"></a>
+<span class="sourceLineNo">1614</span>    }<a name="line.1614"></a>
+<span class="sourceLineNo">1615</span>  }<a name="line.1615"></a>
+<span class="sourceLineNo">1616</span><a name="line.1616"></a>
+<span class="sourceLineNo">1617</span>  @Test<a name="line.1617"></a>
+<span class="sourceLineNo">1618</span>  public void testAtomicBatchPut() throws IOException {<a name="line.1618"></a>
+<span class="sourceLineNo">1619</span>    final Put[] puts = new Put[10];<a name="line.1619"></a>
+<span class="sourceLineNo">1620</span>    MetricsWALSource source = CompatibilitySingletonFactory.getInstance(MetricsWALSource.class);<a name="line.1620"></a>
+<span class="sourceLineNo">1621</span>    long syncs = prepareRegionForBachPut(puts, source, false);<a name="line.1621"></a>
+<span class="sourceLineNo">1622</span><a name="line.1622"></a>
+<span class="sourceLineNo">1623</span>    // 1. Straight forward case, should succeed<a name="line.1623"></a>
+<span class="sourceLineNo">1624</span>    MutationBatchOperation batchOp = new MutationBatchOperation(region, puts, true,<a name="line.1624"></a>
+<span class="sourceLineNo">1625</span>        HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.1625"></a>
+<span class="sourceLineNo">1626</span>    OperationStatus[] codes = this.region.batchMutate(batchOp);<a name="line.1626"></a>
+<span class="sourceLineNo">1627</span>    assertEquals(10, codes.length);<a name="line.1627"></a>
+<span class="sourceLineNo">1628</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.1628"></a>
+<span class="sourceLineNo">1629</span>      assertEquals(OperationStatusCode.SUCCESS, codes[i].getOperationStatusCode());<a name="line.1629"></a>
+<span class="sourceLineNo">1630</span>    }<a name="line.1630"></a>
+<span class="sourceLineNo">1631</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs + 1, source);<a name="line.1631"></a>
+<span class="sourceLineNo">1632</span><a name="line.1632"></a>
+<span class="sourceLineNo">1633</span>    // 2. Failed to get lock<a name="line.1633"></a>
+<span class="sourceLineNo">1634</span>    RowLock lock = region.getRowLock(Bytes.toBytes("row_" + 3));<a name="line.1634"></a>
+<span class="sourceLineNo">1635</span>    // Method {@link HRegion#getRowLock(byte[])} is reentrant. As 'row_3' is locked in this<a name="line.1635"></a>
+<span class="sourceLineNo">1636</span>    // thread, need to run {@link HRegion#batchMutate(HRegion.BatchOperation)} in different thread<a name="line.1636"></a>
+<span class="sourceLineNo">1637</span>    MultithreadedTestUtil.TestContext ctx = new MultithreadedTestUtil.TestContext(CONF);<a name="line.1637"></a>
+<span class="sourceLineNo">1638</span>    final AtomicReference&lt;IOException&gt; retFromThread = new AtomicReference&lt;&gt;();<a name="line.1638"></a>
+<span class="sourceLineNo">1639</span>    final CountDownLatch finishedPuts = new CountDownLatch(1);<a name="line.1639"></a>
+<span class="sourceLineNo">1640</span>    final MutationBatchOperation finalBatchOp = new MutationBatchOperation(region, puts, true,<a name="line.1640"></a>
+<span class="sourceLineNo">1641</span>        HConstants<a name="line.1641"></a>
+<span class="sourceLineNo">1642</span>        .NO_NONCE,<a name="line.1642"></a>
+<span class="sourceLineNo">1643</span>        HConstants.NO_NONCE);<a name="line.1643"></a>
+<span class="sourceLineNo">1644</span>    TestThread putter = new TestThread(ctx) {<a name="line.1644"></a>
+<span class="sourceLineNo">1645</span>      @Override<a name="line.1645"></a>
+<span class="sourceLineNo">1646</span>      public void doWork() throws IOException {<a name="line.1646"></a>
+<span class="sourceLineNo">1647</span>        try {<a name="line.1647"></a>
+<span class="sourceLineNo">1648</span>          region.batchMutate(finalBatchOp);<a name="line.1648"></a>
+<span class="sourceLineNo">1649</span>        } catch (IOException ioe) {<a name="line.1649"></a>
+<span class="sourceLineNo">1650</span>          LOG.error("test failed!", ioe);<a name="line.1650"></a>
+<span class="sourceLineNo">1651</span>          retFromThread.set(ioe);<a name="line.1651"></a>
+<span class="sourceLineNo">1652</span>        }<a name="line.1652"></a>
+<span class="sourceLineNo">1653</span>        finishedPuts.countDown();<a name="line.1653"></a>
+<span class="sourceLineNo">1654</span>      }<a name="line.1654"></a>
+<span class="sourceLineNo">1655</span>    };<a name="line.1655"></a>
+<span class="sourceLineNo">1656</span>    LOG.info("...starting put thread while holding locks");<a name="line.1656"></a>
+<span class="sourceLineNo">1657</span>    ctx.addThread(putter);<a name="line.1657"></a>
+<span class="sourceLineNo">1658</span>    ctx.startThreads();<a name="line.1658"></a>
+<span class="sourceLineNo">1659</span>    LOG.info("...waiting for batch puts while holding locks");<a name="line.1659"></a>
+<span class="sourceLineNo">1660</span>    try {<a name="line.1660"></a>
+<span class="sourceLineNo">1661</span>      finishedPuts.await();<a name="line.1661"></a>
+<span class="sourceLineNo">1662</span>    } catch (InterruptedException e) {<a name="line.1662"></a>
+<span class="sourceLineNo">1663</span>      LOG.error("Interrupted!", e);<a name="line.1663"></a>
+<span class="sourceLineNo">1664</span>    } finally {<a name="line.1664"></a>
+<span class="sourceLineNo">1665</span>      if (lock != null) {<a name="line.1665"></a>
+<span class="sourceLineNo">1666</span>        lock.release();<a name="line.1666"></a>
+<span class="sourceLineNo">1667</span>      }<a name="line.1667"></a>
+<span class="sourceLineNo">1668</span>    }<a name="line.1668"></a>
+<span class="sourceLineNo">1669</span>    assertNotNull(retFromThread.get());<a name="line.1669"></a>
+<span class="sourceLineNo">1670</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs + 1, source);<a name="line.1670"></a>
+<span class="sourceLineNo">1671</span><a name="line.1671"></a>
+<span class="sourceLineNo">1672</span>    // 3. Exception thrown in validation<a name="line.1672"></a>
+<span class="sourceLineNo">1673</span>    LOG.info("Next a batch put with one invalid family");<a name="line.1673"></a>
+<span class="sourceLineNo">1674</span>    puts[5].addColumn(Bytes.toBytes("BAD_CF"), qual, value);<a name="line.1674"></a>
+<span class="sourceLineNo">1675</span>    batchOp = new MutationBatchOperation(region, puts, true, HConstants.NO_NONCE,<a name="line.1675"></a>
+<span class="sourceLineNo">1676</span>        HConstants.NO_NONCE);<a name="line.1676"></a>
+<span class="sourceLineNo">1677</span>    thrown.expect(NoSuchColumnFamilyException.class);<a name="line.1677"></a>
+<span class="sourceLineNo">1678</span>    this.region.batchMutate(batchOp);<a name="line.1678"></a>
+<span class="sourceLineNo">1679</span>  }<a name="line.1679"></a>
+<span class="sourceLineNo">1680</span><a name="line.1680"></a>
+<span class="sourceLineNo">1681</span>  @Test<a name="line.1681"></a>
+<span class="sourceLineNo">1682</span>  public void testBatchPutWithTsSlop() throws Exception {<a name="line.1682"></a>
+<span class="sourceLineNo">1683</span>    // add data with a timestamp that is too recent for range. Ensure assert<a name="line.1683"></a>
+<span class="sourceLineNo">1684</span>    CONF.setInt("hbase.hregion.keyvalue.timestamp.slop.millisecs", 1000);<a name="line.1684"></a>
+<span class="sourceLineNo">1685</span>    final Put[] puts = new Put[10];<a name="line.1685"></a>
+<span class="sourceLineNo">1686</span>    MetricsWALSource source = CompatibilitySingletonFactory.getInstance(MetricsWALSource.class);<a name="line.1686"></a>
+<span class="sourceLineNo">1687</span><a name="line.1687"></a>
+<span class="sourceLineNo">1688</span>    long syncs = prepareRegionForBachPut(puts, source, true);<a name="line.1688"></a>
+<span class="sourceLineNo">1689</span><a name="line.1689"></a>
+<span class="sourceLineNo">1690</span>    OperationStatus[] codes = this.region.batchMutate(puts);<a name="line.1690"></a>
+<span class="sourceLineNo">1691</span>    assertEquals(10, codes.length);<a name="line.1691"></a>
+<span class="sourceLineNo">1692</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.1692"></a>
+<span class="sourceLineNo">1693</span>      assertEquals(OperationStatusCode.SANITY_CHECK_FAILURE, codes[i].getOperationStatusCode());<a name="line.1693"></a>
+<span class="sourceLineNo">1694</span>    }<a name="line.1694"></a>
+<span class="sourceLineNo">1695</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs, source);<a name="line.1695"></a>
+<span class="sourceLineNo">1696</span>  }<a name="line.1696"></a>
+<span class="sourceLineNo">1697</span><a name="line.1697"></a>
+<span class="sourceLineNo">1698</span>  /**<a name="line.1698"></a>
+<span class="sourceLineNo">1699</span>   * @return syncs initial syncTimeNumOps<a name="line.1699"></a>
+<span class="sourceLineNo">1700</span>   */<a name="line.1700"></a>
+<span class="sourceLineNo">1701</span>  private long prepareRegionForBachPut(final Put[] puts, final MetricsWALSource source,<a name="line.1701"></a>
+<span class="sourceLineNo">1702</span>      boolean slop) throws IOException {<a name="line.1702"></a>
+<span class="sourceLineNo">1703</span>    this.region = initHRegion(tableName, method, CONF, COLUMN_FAMILY_BYTES);<a name="line.1703"></a>
+<span class="sourceLineNo">1704</span><a name="line.1704"></a>
+<span class="sourceLineNo">1705</span>    LOG.info("First a batch put with all valid puts");<a name="line.1705"></a>
+<span class="sourceLineNo">1706</span>    for (int i = 0; i &lt; puts.length; i++) {<a name="line.1706"></a>
+<span class="sourceLineNo">1707</span>      puts[i] = slop ? new Put(Bytes.toBytes("row_" + i), Long.MAX_VALUE - 100) :<a name="line.1707"></a>
+<span class="sourceLineNo">1708</span>          new Put(Bytes.toBytes("row_" + i));<a name="line.1708"></a>
+<span class="sourceLineNo">1709</span>      puts[i].addColumn(COLUMN_FAMILY_BYTES, qual, value);<a name="line.1709"></a>
+<span class="sourceLineNo">1710</span>    }<a name="line.1710"></a>
+<span class="sourceLineNo">1711</span><a name="line.1711"></a>
+<span class="sourceLineNo">1712</span>    long syncs = metricsAssertHelper.getCounter("syncTimeNumOps", source);<a name="line.1712"></a>
+<span class="sourceLineNo">1713</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs, source);<a name="line.1713"></a>
+<span class="sourceLineNo">1714</span>    return syncs;<a name="line.1714"></a>
+<span class="sourceLineNo">1715</span>  }<a name="line.1715"></a>
+<span class="sourceLineNo">1716</span><a name="line.1716"></a>
+<span class="sourceLineNo">1717</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.1717"></a>
+<span class="sourceLineNo">1718</span>  // checkAndMutate tests<a name="line.1718"></a>
+<span class="sourceLineNo">1719</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.1719"></a>
+<span class="sourceLineNo">1720</span>  @Test<a name="line.1720"></a>
+<span class="sourceLineNo">1721</span>  public void testCheckAndMutate_WithEmptyRowValue() throws IOException {<a name="line.1721"></a>
+<span class="sourceLineNo">1722</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1722"></a>
+<span class="sourceLineNo">1723</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1723"></a>
+<span class="sourceLineNo">1724</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1724"></a>
+<span class="sourceLineNo">1725</span>    byte[] emptyVal = new byte[] {};<a name="line.1725"></a>
+<span class="sourceLineNo">1726</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1726"></a>
+<span class="sourceLineNo">1727</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.1727"></a>
+<span class="sourceLineNo">1728</span><a name="line.1728"></a>
+<span class="sourceLineNo">1729</span>    // Setting up region<a name="line.1729"></a>
+<span class="sourceLineNo">1730</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.1730"></a>
+<span class="sourceLineNo">1731</span>    // Putting empty data in key<a name="line.1731"></a>
+<span class="sourceLineNo">1732</span>    Put put = new Put(row1);<a name="line.1732"></a>
+<span class="sourceLineNo">1733</span>    put.addColumn(fam1, qf1, emptyVal);<a name="line.1733"></a>
+<span class="sourceLineNo">1734</span><a name="line.1734"></a>
+<span class="sourceLineNo">1735</span>    // checkAndPut with empty value<a name="line.1735"></a>
+<span class="sourceLineNo">1736</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1736"></a>
+<span class="sourceLineNo">1737</span>        new BinaryComparator(emptyVal), put);<a name="line.1737"></a>
+<span class="sourceLineNo">1738</span>    assertTrue(res);<a name="line.1738"></a>
+<span class="sourceLineNo">1739</span><a name="line.1739"></a>
+<span class="sourceLineNo">1740</span>    // Putting data in key<a name="line.1740"></a>
+<span class="sourceLineNo">1741</span>    put = new Put(row1);<a name="line.1741"></a>
+<span class="sourceLineNo">1742</span>    put.addColumn(fam1, qf1, val1);<a name="line.1742"></a>
+<span class="sourceLineNo">1743</span><a name="line.1743"></a>
+<span class="sourceLineNo">1744</span>    // checkAndPut with correct value<a name="line.1744"></a>
+<span class="sourceLineNo">1745</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1745"></a>
+<span class="sourceLineNo">1746</span>        new BinaryComparator(emptyVal), put);<a name="line.1746"></a>
+<span class="sourceLineNo">1747</span>    assertTrue(res);<a name="line.1747"></a>
+<span class="sourceLineNo">1748</span><a name="line.1748"></a>
+<span class="sourceLineNo">1749</span>    // not empty anymore<a name="line.1749"></a>
+<span class="sourceLineNo">1750</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1750"></a>
+<span class="sourceLineNo">1751</span>        new BinaryComparator(emptyVal), put);<a name="line.1751"></a>
+<span class="sourceLineNo">1752</span>    assertFalse(res);<a name="line.1752"></a>
+<span class="sourceLineNo">1753</span><a name="line.1753"></a>
+<span class="sourceLineNo">1754</span>    Delete delete = new Delete(row1);<a name="line.1754"></a>
+<span class="sourceLineNo">1755</span>    delete.addColumn(fam1, qf1);<a name="line.1755"></a>
+<span class="sourceLineNo">1756</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1756"></a>
+<span class="sourceLineNo">1757</span>        new BinaryComparator(emptyVal), delete);<a name="line.1757"></a>
+<span class="sourceLineNo">1758</span>    assertFalse(res);<a name="line.1758"></a>
+<span class="sourceLineNo">1759</span><a name="line.1759"></a>
+<span class="sourceLineNo">1760</span>    put = new Put(row1);<a name="line.1760"></a>
+<span class="sourceLineNo">1761</span>    put.addColumn(fam1, qf1, val2);<a name="line.1761"></a>
+<span class="sourceLineNo">1762</span>    // checkAndPut with correct value<a name="line.1762"></a>
+<span class="sourceLineNo">1763</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1763"></a>
+<span class="sourceLineNo">1764</span>        new BinaryComparator(val1), put);<a name="line.1764"></a>
+<span class="sourceLineNo">1765</span>    assertTrue(res);<a name="line.1765"></a>
+<span class="sourceLineNo">1766</span><a name="line.1766"></a>
+<span class="sourceLineNo">1767</span>    // checkAndDelete with correct value<a name="line.1767"></a>
+<span class="sourceLineNo">1768</span>    delete = new Delete(row1);<a name="line.1768"></a>
 <span class="sourceLineNo">1769</span>    delete.addColumn(fam1, qf1);<a name="line.1769"></a>
-<span class="sourceLineNo">1770</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1770"></a>
-<span class="sourceLineNo">1771</span>        new BinaryComparator(val2), delete);<a name="line.1771"></a>
-<span class="sourceLineNo">1772</span>    assertTrue(res);<a name="line.1772"></a>
-<span class="sourceLineNo">1773</span><a name="line.1773"></a>
-<span class="sourceLineNo">1774</span>    delete = new Delete(row1);<a name="line.1774"></a>
-<span class="sourceLineNo">1775</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1775"></a>
-<span class="sourceLineNo">1776</span>        new BinaryComparator(emptyVal), delete);<a name="line.1776"></a>
-<span class="sourceLineNo">1777</span>    assertTrue(res);<a name="line.1777"></a>
-<span class="sourceLineNo">1778</span><a name="line.1778"></a>
-<span class="sourceLineNo">1779</span>    // checkAndPut looking for a null value<a name="line.1779"></a>
-<span class="sourceLineNo">1780</span>    put = new Put(row1);<a name="line.1780"></a>
-<span class="sourceLineNo">1781</span>    put.addColumn(fam1, qf1, val1);<a name="line.1781"></a>
-<span class="sourceLineNo">1782</span><a name="line.1782"></a>
-<span class="sourceLineNo">1783</span>    res = region<a name="line.1783"></a>
-<span class="sourceLineNo">1784</span>        .checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new NullComparator(), put);<a name="line.1784"></a>
-<span class="sourceLineNo">1785</span>    assertTrue(res);<a name="line.1785"></a>
-<span class="sourceLineNo">1786</span>  }<a name="line.1786"></a>
-<span class="sourceLineNo">1787</span><a name="line.1787"></a>
-<span class="sourceLineNo">1788</span>  @Test<a name="line.1788"></a>
-<span class="sourceLineNo">1789</span>  public void testCheckAndMutate_WithWrongValue() throws IOException {<a name="line.1789"></a>
-<span class="sourceLineNo">1790</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1790"></a>
-<span class="sourceLineNo">1791</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1791"></a>
-<span class="sourceLineNo">1792</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1792"></a>
-<span class="sourceLineNo">1793</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1793"></a>
-<span class="sourceLineNo">1794</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.1794"></a>
-<span class="sourceLineNo">1795</span>    BigDecimal bd1 = new BigDecimal(Double.MAX_VALUE);<a name="line.1795"></a>
-<span class="sourceLineNo">1796</span>    BigDecimal bd2 = new BigDecimal(Double.MIN_VALUE);<a name="line.1796"></a>
-<span class="sourceLineNo">1797</span><a name="line.1797"></a>
-<span class="sourceLineNo">1798</span>    // Setting up region<a name="line.1798"></a>
-<span class="sourceLineNo">1799</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.1799"></a>
-<span class="sourceLineNo">1800</span>    // Putting data in key<a name="line.1800"></a>
-<span class="sourceLineNo">1801</span>    Put put = new Put(row1);<a name="line.1801"></a>
-<span class="sourceLineNo">1802</span>    put.addColumn(fam1, qf1, val1);<a name="line.1802"></a>
-<span class="sourceLineNo">1803</span>    region.put(put);<a name="line.1803"></a>
-<span class="sourceLineNo">1804</span><a name="line.1804"></a>
-<span class="sourceLineNo">1805</span>    // checkAndPut with wrong value<a name="line.1805"></a>
-<span class="sourceLineNo">1806</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1806"></a>
-<span class="sourceLineNo">1807</span>        new BinaryComparator(val2), put);<a name="line.1807"></a>
-<span class="sourceLineNo">1808</span>    assertEquals(false, res);<a name="line.1808"></a>
-<span class="sourceLineNo">1809</span><a name="line.1809"></a>
-<span class="sourceLineNo">1810</span>    // checkAndDelete with wrong value<a name="line.1810"></a>
-<span class="sourceLineNo">1811</span>    Delete delete = new Delete(row1);<a name="line.1811"></a>
-<span class="sourceLineNo">1812</span>    delete.addFamily(fam1);<a name="line.1812"></a>
-<span class="sourceLineNo">1813</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1813"></a>
-<span class="sourceLineNo">1814</span>        new BinaryComparator(val2), put);<a name="line.1814"></a>
-<span class="sourceLineNo">1815</span>    assertEquals(false, res);<a name="line.1815"></a>
-<span class="sourceLineNo">1816</span><a name="line.1816"></a>
-<span class="sourceLineNo">1817</span>    // Putting data in key<a name="line.1817"></a>
-<span class="sourceLineNo">1818</span>    put = new Put(row1);<a name="line.1818"></a>
-<span class="sourceLineNo">1819</span>    put.addColumn(fam1, qf1, Bytes.toBytes(bd1));<a name="line.1819"></a>
-<span class="sourceLineNo">1820</span>    region.put(put);<a name="line.1820"></a>
-<span class="sourceLineNo">1821</span><a name="line.1821"></a>
-<span class="sourceLineNo">1822</span>    // checkAndPut with wrong value<a name="line.1822"></a>
-<span class="sourceLineNo">1823</span>    res =<a name="line.1823"></a>
-<span class="sourceLineNo">1824</span>        region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1824"></a>
-<span class="sourceLineNo">1825</span>            new BigDecimalComparator(bd2), put);<a name="line.1825"></a>
-<span class="sourceLineNo">1826</span>    assertEquals(false, res);<a name="line.1826"></a>
-<span class="sourceLineNo">1827</span><a name="line.1827"></a>
-<span class="sourceLineNo">1828</span>    // checkAndDelete with wrong value<a name="line.1828"></a>
-<span class="sourceLineNo">1829</span>    delete = new Delete(row1);<a name="line.1829"></a>
-<span class="sourceLineNo">1830</span>    delete.addFamily(fam1);<a name="line.1830"></a>
-<span class="sourceLineNo">1831</span>    res =<a name="line.1831"></a>
-<span class="sourceLineNo">1832</span>        region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1832"></a>
-<span class="sourceLineNo">1833</span>            new BigDecimalComparator(bd2), put);<a name="line.1833"></a>
-<span class="sourceLineNo">1834</span>    assertEquals(false, res);<a name="line.1834"></a>
-<span class="sourceLineNo">1835</span>  }<a name="line.1835"></a>
-<span class="sourceLineNo">1836</span><a name="line.1836"></a>
-<span class="sourceLineNo">1837</span>  @Test<a name="line.1837"></a>
-<span class="sourceLineNo">1838</span>  public void testCheckAndMutate_WithCorrectValue() throws IOException {<a name="line.1838"></a>
-<span class="sourceLineNo">1839</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1839"></a>
-<span class="sourceLineNo">1840</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1840"></a>
-<span class="sourceLineNo">1841</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1841"></a>
-<span class="sourceLineNo">1842</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1842"></a>
-<span class="sourceLineNo">1843</span>    BigDecimal bd1 = new BigDecimal(Double.MIN_VALUE);<a name="line.1843"></a>
-<span class="sourceLineNo">1844</span><a name="line.1844"></a>
-<span class="sourceLineNo">1845</span>    // Setting up region<a name="line.1845"></a>
-<span class="sourceLineNo">1846</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.1846"></a>
-<span class="sourceLineNo">1847</span>    // Putting data in key<a name="line.1847"></a>
-<span class="sourceLineNo">1848</span>    Put put = new Put(row1);<a name="line.1848"></a>
-<span class="sourceLineNo">1849</span>    put.addColumn(fam1, qf1, val1);<a name="line.1849"></a>
-<span class="sourceLineNo">1850</span>    region.put(put);<a name="line.1850"></a>
-<span class="sourceLineNo">1851</span><a name="line.1851"></a>
-<span class="sourceLineNo">1852</span>    // checkAndPut with correct value<a name="line.1852"></a>
-<span class="sourceLineNo">1853</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1853"></a>
-<span class="sourceLineNo">1854</span>        new BinaryComparator(val1), put);<a name="line.1854"></a>
-<span class="sourceLineNo">1855</span>    assertEquals(true, res);<a name="line.1855"></a>
-<span class="sourceLineNo">1856</span><a name="line.1856"></a>
-<span class="sourceLineNo">1857</span>    // checkAndDelete with correct value<a name="line.1857"></a>
-<span class="sourceLineNo">1858</span>    Delete delete = new Delete(row1);<a name="line.1858"></a>
-<span class="sourceLineNo">1859</span>    delete.addColumn(fam1, qf1);<a name="line.1859"></a>
-<span class="sourceLineNo">1860</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new BinaryComparator(val1),<a name="line.1860"></a>
-<span class="sourceLineNo">1861</span>        delete);<a name="line.1861"></a>
-<span class="sourceLineNo">1862</span>    assertEquals(true, res);<a name="line.1862"></a>
-<span class="sourceLineNo">1863</span><a name="line.1863"></a>
-<span class="sourceLineNo">1864</span>    // Putting data in key<a name="line.1864"></a>
-<span class="sourceLineNo">1865</span>    put = new Put(row1);<a name="line.1865"></a>
-<span class="sourceLineNo">1866</span>    put.addColumn(fam1, qf1, Bytes.toBytes(bd1));<a name="line.1866"></a>
-<span class="sourceLineNo">1867</span>    region.put(put);<a name="line.1867"></a>
-<span class="sourceLineNo">1868</span><a name="line.1868"></a>
-<span class="sourceLineNo">1869</span>    // checkAndPut with correct value<a name="line.1869"></a>
-<span class="sourceLineNo">1870</span>    res =<a name="line.1870"></a>
-<span class="sourceLineNo">1871</span>        region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new BigDecimalComparator(<a name="line.1871"></a>
-<span class="sourceLineNo">1872</span>            bd1), put);<a name="line.1872"></a>
-<span class="sourceLineNo">1873</span>    assertEquals(true, res);<a name="line.1873"></a>
-<span class="sourceLineNo">1874</span><a name="line.1874"></a>
-<span class="sourceLineNo">1875</span>    // checkAndDelete with correct value<a name="line.1875"></a>
-<span class="sourceLineNo">1876</span>    delete = new Delete(row1);<a name="line.1876"></a>
-<span class="sourceLineNo">1877</span>    delete.addColumn(fam1, qf1);<a name="line.1877"></a>
-<span class="sourceLineNo">1878</span>    res =<a name="line.1878"></a>
-<span class="sourceLineNo">1879</span>        region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new BigDecimalComparator(<a name="line.1879"></a>
-<span class="sourceLineNo">1880</span>            bd1), delete);<a name="line.1880"></a>
-<span class="sourceLineNo">1881</span>    assertEquals(true, res);<a name="line.1881"></a>
-<span class="sourceLineNo">1882</span>  }<a name="line.1882"></a>
-<span class="sourceLineNo">1883</span><a name="line.1883"></a>
-<span class="sourceLineNo">1884</span>  @Test<a name="line.1884"></a>
-<span class="sourceLineNo">1885</span>  public void testCheckAndMutate_WithNonEqualCompareOp() throws IOException {<a name="line.1885"></a>
-<span class="sourceLineNo">1886</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1886"></a>
-<span class="sourceLineNo">1887</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1887"></a>
-<span class="sourceLineNo">1888</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1888"></a>
-<span class="sourceLineNo">1889</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1889"></a>
-<span class="sourceLineNo">1890</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.1890"></a>
-<span class="sourceLineNo">1891</span>    byte[] val3 = Bytes.toBytes("value3");<a name="line.1891"></a>
-<span class="sourceLineNo">1892</span>    byte[] val4 = Bytes.toBytes("value4");<a name="line.1892"></a>
-<span class="sourceLineNo">1893</span><a name="line.1893"></a>
-<span class="sourceLineNo">1894</span>    // Setting up region<a name="line.1894"></a>
-<span class="sourceLineNo">1895</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.1895"></a>
-<span class="sourceLineNo">1896</span>    // Putting val3 in key<a name="line.1896"></a>
-<span class="sourceLineNo">1897</span>    Put put = new Put(row1);<a name="line.1897"></a>
-<span class="sourceLineNo">1898</span>    put.addColumn(fam1, qf1, val3);<a name="line.1898"></a>
-<span class="sourceLineNo">1899</span>    region.put(put);<a name="line.1899"></a>
-<span class="sourceLineNo">1900</span><a name="line.1900"></a>
-<span class="sourceLineNo">1901</span>    // Test CompareOp.LESS: original = val3, compare with val3, fail<a name="line.1901"></a>
-<span class="sourceLineNo">1902</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS,<a name="line.1902"></a>
-<span class="sourceLineNo">1903</span>        new BinaryComparator(val3), put);<a name="line.1903"></a>
-<span class="sourceLineNo">1904</span>    assertEquals(false, res);<a name="line.1904"></a>
-<span class="sourceLineNo">1905</span><a name="line.1905"></a>
-<span class="sourceLineNo">1906</span>    // Test CompareOp.LESS: original = val3, compare with val4, fail<a name="line.1906"></a>
-<span class="sourceLineNo">1907</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS,<a name="line.1907"></a>
-<span class="sourceLineNo">1908</span>        new BinaryComparator(val4), put);<a name="line.1908"></a>
-<span class="sourceLineNo">1909</span>    assertEquals(false, res);<a name="line.1909"></a>
-<span class="sourceLineNo">1910</span><a name="line.1910"></a>
-<span class="sourceLineNo">1911</span>    // Test CompareOp.LESS: original = val3, compare with val2,<a name="line.1911"></a>
-<span class="sourceLineNo">1912</span>    // succeed (now value = val2)<a name="line.1912"></a>
-<span class="sourceLineNo">1913</span>    put = new Put(row1);<a name="line.1913"></a>
-<span class="sourceLineNo">1914</span>    put.addColumn(fam1, qf1, val2);<a name="line.1914"></a>
-<span class="sourceLineNo">1915</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS,<a name="line.1915"></a>
-<span class="sourceLineNo">1916</span>        new BinaryComparator(val2), put);<a name="line.1916"></a>
-<span class="sourceLineNo">1917</span>    assertEquals(true, res);<a name="line.1917"></a>
-<span class="sourceLineNo">1918</span><a name="line.1918"></a>
-<span class="sourceLineNo">1919</span>    // Test CompareOp.LESS_OR_EQUAL: original = val2, compare with val3, fail<a name="line.1919"></a>
-<span class="sourceLineNo">1920</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS_OR_EQUAL,<a name="line.1920"></a>
-<span class="sourceLineNo">1921</span>        new BinaryComparator(val3), put);<a name="line.1921"></a>
-<span class="sourceLineNo">1922</span>    assertEquals(false, res);<a name="line.1922"></a>
-<span class="sourceLineNo">1923</span><a name="line.1923"></a>
-<span class="sourceLineNo">1924</span>    // Test CompareOp.LESS_OR_EQUAL: original = val2, compare with val2,<a name="line.1924"></a>
-<span class="sourceLineNo">1925</span>    // succeed (value still = val2)<a name="line.1925"></a>
-<span class="sourceLineNo">1926</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS_OR_EQUAL,<a name="line.1926"></a>
-<span class="sourceLineNo">1927</span>        new BinaryComparator(val2), put);<a name="line.1927"></a>
-<span class="sourceLineNo">1928</span>    assertEquals(true, res);<a name="line.1928"></a>
-<span class="sourceLineNo">1929</span><a name="line.1929"></a>
-<span class="sourceLineNo">1930</span>    // Test CompareOp.LESS_OR_EQUAL: original = val2, compare with val1,<a name="line.1930"></a>
-<span class="sourceLineNo">1931</span>    // succeed (now value = val3)<a name="line.1931"></a>
-<span class="sourceLineNo">1932</span>    put = new Put(row1);<a name="line.1932"></a>
-<span class="sourceLineNo">1933</span>    put.addColumn(fam1, qf1, val3);<a name="line.1933"></a>
-<span class="sourceLineNo">1934</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS_OR_EQUAL,<a name="line.1934"></a>
-<span class="sourceLineNo">1935</span>        new BinaryComparator(val1), put);<a name="line.1935"></a>
-<span class="sourceLineNo">1936</span>    assertEquals(true, res);<a name="line.1936"></a>
-<span class="sourceLineNo">1937</span><a name="line.1937"></a>
-<span class="sourceLineNo">1938</span>    // Test CompareOp.GREATER: original = val3, compare with val3, fail<a name="line.1938"></a>
-<span class="sourceLineNo">1939</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER,<a name="line.1939"></a>
-<span class="sourceLineNo">1940</span>        new BinaryComparator(val3), put);<a name="line.1940"></a>
-<span class="sourceLineNo">1941</span>    assertEquals(false, res);<a name="line.1941"></a>
-<span class="sourceLineNo">1942</span><a name="line.1942"></a>
-<span class="sourceLineNo">1943</span>    // Test CompareOp.GREATER: original = val3, compare with val2, fail<a name="line.1943"></a>
-<span class="sourceLineNo">1944</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER,<a name="line.1944"></a>
-<span class="sourceLineNo">1945</span>        new BinaryComparator(val2), put);<a name="line.1945"></a>
-<span class="sourceLineNo">1946</span>    assertEquals(false, res);<a name="line.1946"></a>
-<span class="sourceLineNo">1947</span><a name="line.1947"></a>
-<span class="sourceLineNo">1948</span>    // Test CompareOp.GREATER: original = val3, compare with val4,<a name="line.1948"></a>
-<span class="sourceLineNo">1949</span>    // succeed (now value = val2)<a name="line.1949"></a>
-<span class="sourceLineNo">1950</span>    put = new Put(row1);<a name="line.1950"></a>
-<span class="sourceLineNo">1951</span>    put.addColumn(fam1, qf1, val2);<a name="line.1951"></a>
-<span class="sourceLineNo">1952</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER,<a name="line.1952"></a>
-<span class="sourceLineNo">1953</span>        new BinaryComparator(val4), put);<a name="line.1953"></a>
-<span class="sourceLineNo">1954</span>    assertEquals(true, res);<a name="line.1954"></a>
-<span class="sourceLineNo">1955</span><a name="line.1955"></a>
-<span class="sourceLineNo">1956</span>    // Test CompareOp.GREATER_OR_EQUAL: original = val2, compare with val1, fail<a name="line.1956"></a>
-<span class="sourceLineNo">1957</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER_OR_EQUAL,<a name="line.1957"></a>
-<span class="sourceLineNo">1958</span>        new BinaryComparator(val1), put);<a name="line.1958"></a>
-<span class="sourceLineNo">1959</span>    assertEquals(false, res);<a name="line.1959"></a>
-<span class="sourceLineNo">1960</span><a name="line.1960"></a>
-<span class="sourceLineNo">1961</span>    // Test CompareOp.GREATER_OR_EQUAL: original = val2, compare with val2,<a name="line.1961"></a>
-<span class="sourceLineNo">1962</span>    // succeed (value still = val2)<a name="line.1962"></a>
-<span class="sourceLineNo">1963</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER_OR_EQUAL,<a name="line.1963"></a>
-<span class="sourceLineNo">1964</span>        new BinaryComparator(val2), put);<a name="line.1964"></a>
-<span class="sourceLineNo">1965</span>    assertEquals(true, res);<a name="line.1965"></a>
-<span class="sourceLineNo">1966</span><a name="line.1966"></a>
-<span class="sourceLineNo">1967</span>    // Test CompareOp.GREATER_OR_EQUAL: original = val2, compare with val3, succeed<a name="line.1967"></a>
-<span class="sourceLineNo">1968</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER_OR_EQUAL,<a name="line.1968"></a>
-<span class="sourceLineNo">1969</span>        new BinaryComparator(val3), put);<a name="line.1969"></a>
-<span class="sourceLineNo">1970</span>    assertEquals(true, res);<a name="line.1970"></a>
-<span class="sourceLineNo">1971</span>  }<a name="line.1971"></a>
-<span class="sourceLineNo">1972</span><a name="line.1972"></a>
-<span class="sourceLineNo">1973</span>  @Test<a name="line.1973"></a>
-<span class="sourceLineNo">1974</span>  public void testCheckAndPut_ThatPutWasWritten() throws IOException {<a name="line.1974"></a>
-<span class="sourceLineNo">1975</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1975"></a>
-<span class="sourceLineNo">1976</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1976"></a>
-<span class="sourceLineNo">1977</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.1977"></a>
-<span class="sourceLineNo">1978</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1978"></a>
-<span class="sourceLineNo">1979</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1979"></a>
-<span class="sourceLineNo">1980</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.1980"></a>
-<span class="sourceLineNo">1981</span><a name="line.1981"></a>
-<span class="sourceLineNo">1982</span>    byte[][] families = { fam1, fam2 };<a name="line.1982"></a>
-<span class="sourceLineNo">1983</span><a name="line.1983"></a>
-<span class="sourceLineNo">1984</span>    // Setting up region<a name="line.1984"></a>
-<span class="sourceLineNo">1985</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.1985"></a>
-<span class="sourceLineNo">1986</span>    // Putting data in the key to check<a name="line.1986"></a>
-<span class="sourceLineNo">1987</span>    Put put = new Put(row1);<a name="line.1987"></a>
-<span class="sourceLineNo">1988</span>    put.addColumn(fam1, qf1, val1);<a name="line.1988"></a>
-<span class="sourceLineNo">1989</span>    region.put(put);<a name="line.1989"></a>
-<span class="sourceLineNo">1990</span><a name="line.1990"></a>
-<span class="sourceLineNo">1991</span>    // Creating put to add<a name="line.1991"></a>
-<span class="sourceLineNo">1992</span>    long ts = System.currentTimeMillis();<a name="line.1992"></a>
-<span class="sourceLineNo">1993</span>    KeyValue kv = new KeyValue(row1, fam2, qf1, ts, KeyValue.Type.Put, val2);<a name="line.1993"></a>
-<span class="sourceLineNo">1994</span>    put = new Put(row1);<a name="line.1994"></a>
-<span class="sourceLineNo">1995</span>    put.add(kv);<a name="line.1995"></a>
-<span class="sourceLineNo">1996</span><a name="line.1996"></a>
-<span class="sourceLineNo">1997</span>    // checkAndPut with wrong value<a name="line.1997"></a>
-<span class="sourceLineNo">1998</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1998"></a>
-<span class="sourceLineNo">1999</span>        new BinaryComparator(val1), put);<a name="line.1999"></a>
-<span class="sourceLineNo">2000</span>    assertEquals(true, res);<a name="line.2000"></a>
-<span class="sourceLineNo">2001</span><a name="line.2001"></a>
-<span class="sourceLineNo">2002</span>    Get get = new Get(row1);<a name="line.2002"></a>
-<span class="sourceLineNo">2003</span>    get.addColumn(fam2, qf1);<a name="line.2003"></a>
-<span class="sourceLineNo">2004</span>    Cell[] actual = region.get(get).rawCells();<a name="line.2004"></a>
-<span class="sourceLineNo">2005</span><a name="line.2005"></a>
-<span class="sourceLineNo">2006</span>    Cell[] expected = { kv };<a name="line.2006"></a>
-<span class="sourceLineNo">2007</span><a name="line.2007"></a>
-<span class="sourceLineNo">2008</span>    assertEquals(expected.length, actual.length);<a name="line.2008"></a>
-<span class="sourceLineNo">2009</span>    for (int i = 0; i &lt; actual.length; i++) {<a name="line.2009"></a>
-<span class="sourceLineNo">2010</span>      assertEquals(expected[i], actual[i]);<a name="line.2010"></a>
-<span class="sourceLineNo">2011</span>    }<a name="line.2011"></a>
-<span class="sourceLineNo">2012</span>  }<a name="line.2012"></a>
-<span class="sourceLineNo">2013</span><a name="line.2013"></a>
-<span class="sourceLineNo">2014</span>  @Test<a name="line.2014"></a>
-<span class="sourceLineNo">2015</span>  public void testCheckAndPut_wrongRowInPut() throws IOException {<a name="line.2015"></a>
-<span class="sourceLineNo">2016</span>    this.region = initHRegion(tableName, method, CONF, COLUMNS);<a name="line.2016"></a>
-<span class="sourceLineNo">2017</span>    Put put = new Put(row2);<a name="line.2017"></a>
-<span class="sourceLineNo">2018</span>    put.addColumn(fam1, qual1, value1);<a name="line.2018"></a>
-<span class="sourceLineNo">2019</span>    try {<a name="line.2019"></a>
-<span class="sourceLineNo">2020</span>      region.checkAndMutate(row, fam1, qual1, CompareOperator.EQUAL,<a name="line.2020"></a>
-<span class="sourceLineNo">2021</span>          new BinaryComparator(value2), put);<a name="line.2021"></a>
-<span class="sourceLineNo">2022</span>      fail();<a name="line.2022"></a>
-<span class="sourceLineNo">2023</span>    } catch (org.apache.hadoop.hbase.DoNotRetryIOException expected) {<a name="line.2023"></a>
-<span class="sourceLineNo">2024</span>      // expected exception.<a name="line.2024"></a>
-<span class="sourceLineNo">2025</span>    }<a name="line.2025"></a>
-<span class="sourceLineNo">2026</span>  }<a name="line.2026"></a>
-<span class="sourceLineNo">2027</span><a name="line.2027"></a>
-<span class="sourceLineNo">2028</span>  @Test<a name="line.2028"></a>
-<span class="sourceLineNo">2029</span>  public void testCheckAndDelete_ThatDeleteWasWritten() throws IOException {<a name="line.2029"></a>
-<span class="sourceLineNo">2030</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2030"></a>
-<span class="sourceLineNo">2031</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2031"></a>
-<span class="sourceLineNo">2032</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2032"></a>
-<span class="sourceLineNo">2033</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.2033"></a>
-<span class="sourceLineNo">2034</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.2034"></a>
-<span class="sourceLineNo">2035</span>    byte[] qf3 = Bytes.toBytes("qualifier3");<a name="line.2035"></a>
-<span class="sourceLineNo">2036</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.2036"></a>
-<span class="sourceLineNo">2037</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.2037"></a>
-<span class="sourceLineNo">2038</span>    byte[] val3 = Bytes.toBytes("value3");<a name="line.2038"></a>
-<span class="sourceLineNo">2039</span>    byte[] emptyVal = new byte[] {};<a name="line.2039"></a>
-<span class="sourceLineNo">2040</span><a name="line.2040"></a>
-<span class="sourceLineNo">2041</span>    byte[][] families = { fam1, fam2 };<a name="line.2041"></a>
-<span class="sourceLineNo">2042</span><a name="line.2042"></a>
-<span class="sourceLineNo">2043</span>    // Setting up region<a name="line.2043"></a>
-<span class="sourceLineNo">2044</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2044"></a>
-<span class="sourceLineNo">2045</span>    // Put content<a name="line.2045"></a>
-<span class="sourceLineNo">2046</span>    Put put = new Put(row1);<a name="line.2046"></a>
-<span class="sourceLineNo">2047</span>    put.addColumn(fam1, qf1, val1);<a name="line.2047"></a>
-<span class="sourceLineNo">2048</span>    region.put(put);<a name="line.2048"></a>
-<span class="sourceLineNo">2049</span>    Threads.sleep(2);<a name="line.2049"></a>
-<span class="sourceLineNo">2050</span><a name="line.2050"></a>
-<span class="sourceLineNo">2051</span>    put = new Put(row1);<a name="line.2051"></a>
-<span class="sourceLineNo">2052</span>    put.addColumn(fam1, qf1, val2);<a name="line.2052"></a>
-<span class="sourceLineNo">2053</span>    put.addColumn(fam2, qf1, val3);<a name="line.2053"></a>
-<span class="sourceLineNo">2054</span>    put.addColumn(fam2, qf2, val2);<a name="line.2054"></a>
-<span class="sourceLineNo">2055</span>    put.addColumn(fam2, qf3, val1);<a name="line.2055"></a>
-<span class="sourceLineNo">2056</span>    put.addColumn(fam1, qf3, val1);<a name="line.2056"></a>
-<span class="sourceLineNo">2057</span>    region.put(put);<a name="line.2057"></a>
-<span class="sourceLineNo">2058</span><a name="line.2058"></a>
-<span class="sourceLineNo">2059</span>    // Multi-column delete<a name="line.2059"></a>
-<span class="sourceLineNo">2060</span>    Delete delete = new Delete(row1);<a name="line.2060"></a>
-<span class="sourceLineNo">2061</span>    delete.addColumn(fam1, qf1);<a name="line.2061"></a>
-<span class="sourceLineNo">2062</span>    delete.addColumn(fam2, qf1);<a name="line.2062"></a>
-<span class="sourceLineNo">2063</span>    delete.addColumn(fam1, qf3);<a name="line.2063"></a>
-<span class="sourceLineNo">2064</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.2064"></a>
-<span class="sourceLineNo">2065</span>        new BinaryComparator(val2), delete);<a name="line.2065"></a>
-<span class="sourceLineNo">2066</span>    assertEquals(true, res);<a name="line.2066"></a>
-<span class="sourceLineNo">2067</span><a name="line.2067"></a>
-<span class="sourceLineNo">2068</span>    Get get = new Get(row1);<a name="line.2068"></a>
-<span class="sourceLineNo">2069</span>    get.addColumn(fam1, qf1);<a name="line.2069"></a>
-<span class="sourceLineNo">2070</span>    get.addColumn(fam1, qf3);<a name="line.2070"></a>
-<span class="sourceLineNo">2071</span>    get.addColumn(fam2, qf2);<a name="line.2071"></a>
-<span class="sourceLineNo">2072</span>    Result r = region.get(get);<a name="line.2072"></a>
-<span class="sourceLineNo">2073</span>    assertEquals(2, r.size());<a name="line.2073"></a>
-<span class="sourceLineNo">2074</span>    assertArrayEquals(val1, r.getValue(fam1, qf1));<a name="line.2074"></a>
-<span class="sourceLineNo">2075</span>    assertArrayEquals(val2, r.getValue(fam2, qf2));<a name="line.2075"></a>
-<span class="sourceLineNo">2076</span><a name="line.2076"></a>
-<span class="sourceLineNo">2077</span>    // Family delete<a name="line.2077"></a>
-<span class="sourceLineNo">2078</span>    delete = new Delete(row1);<a name="line.2078"></a>
-<span class="sourceLineNo">2079</span>    delete.addFamily(fam2);<a name="line.2079"></a>
-<span class="sourceLineNo">2080</span>    res = region.checkAndMutate(row1, fam2, qf1, CompareOperator.EQUAL,<a name="line.2080"></a>
-<span class="sourceLineNo">2081</span>        new BinaryComparator(emptyVal), delete);<a name="line.2081"></a>
-<span class="sourceLineNo">2082</span>    assertEquals(true, res);<a name="line.2082"></a>
-<span class="sourceLineNo">2083</span><a name="line.2083"></a>
-<span class="sourceLineNo">2084</span>    get = new Get(row1);<a name="line.2084"></a>
-<span class="sourceLineNo">2085</span>    r = region.get(get);<a name="line.2085"></a>
-<span class="sourceLineNo">2086</span>    assertEquals(1, r.size());<a name="line.2086"></a>
-<span class="sourceLineNo">2087</span>    assertArrayEquals(val1, r.getValue(fam1, qf1));<a name="line.2087"></a>
-<span class="sourceLineNo">2088</span><a name="line.2088"></a>
-<span class="sourceLineNo">2089</span>    // Row delete<a name="line.2089"></a>
-<span class="sourceLineNo">2090</span>    delete = new Delete(row1);<a name="line.2090"></a>
-<span class="sourceLineNo">2091</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new BinaryComparator(val1),<a name="line.2091"></a>
-<span class="sourceLineNo">2092</span>        delete);<a name="line.2092"></a>
-<span class="sourceLineNo">2093</span>    assertEquals(true, res);<a name="line.2093"></a>
-<span class="sourceLineNo">2094</span>    get = new Get(row1);<a name="line.2094"></a>
-<span class="sourceLineNo">2095</span>    r = region.get(get);<a name="line.2095"></a>
-<span class="sourceLineNo">2096</span>    assertEquals(0, r.size());<a name="line.2096"></a>
-<span class="sourceLineNo">2097</span>  }<a name="line.2097"></a>
-<span class="sourceLineNo">2098</span><a name="line.2098"></a>
-<span class="sourceLineNo">2099</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2099"></a>
-<span class="sourceLineNo">2100</span>  // Delete tests<a name="line.2100"></a>
-<span class="sourceLineNo">2101</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2101"></a>
-<span class="sourceLineNo">2102</span>  @Test<a name="line.2102"></a>
-<span class="sourceLineNo">2103</span>  public void testDelete_multiDeleteColumn() throws IOException {<a name="line.2103"></a>
-<span class="sourceLineNo">2104</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2104"></a>
-<span class="sourceLineNo">2105</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2105"></a>
-<span class="sourceLineNo">2106</span>    byte[] qual = Bytes.toBytes("qualifier");<a name="line.2106"></a>
-<span class="sourceLineNo">2107</span>    byte[] value = Bytes.toBytes("value");<a name="line.2107"></a>
-<span class="sourceLineNo">2108</span><a name="line.2108"></a>
-<span class="sourceLineNo">2109</span>    Put put = new Put(row1);<a name="line.2109"></a>
-<span class="sourceLineNo">2110</span>    put.addColumn(fam1, qual, 1, value);<a name="line.2110"></a>
-<span class="sourceLineNo">2111</span>    put.addColumn(fam1, qual, 2, value);<a name="line.2111"></a>
-<span class="sourceLineNo">2112</span><a name="line.2112"></a>
-<span class="sourceLineNo">2113</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2113"></a>
-<span class="sourceLineNo">2114</span>    region.put(put);<a name="line.2114"></a>
-<span class="sourceLineNo">2115</span><a name="line.2115"></a>
-<span class="sourceLineNo">2116</span>    // We do support deleting more than 1 'latest' version<a name="line.2116"></a>
-<span class="sourceLineNo">2117</span>    Delete delete = new Delete(row1);<a name="line.2117"></a>
-<span class="sourceLineNo">2118</span>    delete.addColumn(fam1, qual);<a name="line.2118"></a>
+<span class="sourceLineNo">1770</span>    delete.addColumn(fam1, qf1);<a name="line.1770"></a>
+<span class="sourceLineNo">1771</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1771"></a>
+<span class="sourceLineNo">1772</span>        new BinaryComparator(val2), delete);<a name="line.1772"></a>
+<span class="sourceLineNo">1773</span>    assertTrue(res);<a name="line.1773"></a>
+<span class="sourceLineNo">1774</span><a name="line.1774"></a>
+<span class="sourceLineNo">1775</span>    delete = new Delete(row1);<a name="line.1775"></a>
+<span class="sourceLineNo">1776</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1776"></a>
+<span class="sourceLineNo">1777</span>        new BinaryComparator(emptyVal), delete);<a name="line.1777"></a>
+<span class="sourceLineNo">1778</span>    assertTrue(res);<a name="line.1778"></a>
+<span class="sourceLineNo">1779</span><a name="line.1779"></a>
+<span class="sourceLineNo">1780</span>    // checkAndPut looking for a null value<a name="line.1780"></a>
+<span class="sourceLineNo">1781</span>    put = new Put(row1);<a name="line.1781"></a>
+<span class="sourceLineNo">1782</span>    put.addColumn(fam1, qf1, val1);<a name="line.1782"></a>
+<span class="sourceLineNo">1783</span><a name="line.1783"></a>
+<span class="sourceLineNo">1784</span>    res = region<a name="line.1784"></a>
+<span class="sourceLineNo">1785</span>        .checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new NullComparator(), put);<a name="line.1785"></a>
+<span class="sourceLineNo">1786</span>    assertTrue(res);<a name="line.1786"></a>
+<span class="sourceLineNo">1787</span>  }<a name="line.1787"></a>
+<span class="sourceLineNo">1788</span><a name="line.1788"></a>
+<span class="sourceLineNo">1789</span>  @Test<a name="line.1789"></a>
+<span class="sourceLineNo">1790</span>  public void testCheckAndMutate_WithWrongValue() throws IOException {<a name="line.1790"></a>
+<span class="sourceLineNo">1791</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1791"></a>
+<span class="sourceLineNo">1792</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1792"></a>
+<span class="sourceLineNo">1793</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1793"></a>
+<span class="sourceLineNo">1794</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1794"></a>
+<span class="sourceLineNo">1795</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.1795"></a>
+<span class="sourceLineNo">1796</span>    BigDecimal bd1 = new BigDecimal(Double.MAX_VALUE);<a name="line.1796"></a>
+<span class="sourceLineNo">1797</span>    BigDecimal bd2 = new BigDecimal(Double.MIN_VALUE);<a name="line.1797"></a>
+<span class="sourceLineNo">1798</span><a name="line.1798"></a>
+<span class="sourceLineNo">1799</span>    // Setting up region<a name="line.1799"></a>
+<span class="sourceLineNo">1800</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.1800"></a>
+<span class="sourceLineNo">1801</span>    // Putting data in key<a name="line.1801"></a>
+<span class="sourceLineNo">1802</span>    Put put = new Put(row1);<a name="line.1802"></a>
+<span class="sourceLineNo">1803</span>    put.addColumn(fam1, qf1, val1);<a name="line.1803"></a>
+<span class="sourceLineNo">1804</span>    region.put(put);<a name="line.1804"></a>
+<span class="sourceLineNo">1805</span><a name="line.1805"></a>
+<span class="sourceLineNo">1806</span>    // checkAndPut with wrong value<a name="line.1806"></a>
+<span class="sourceLineNo">1807</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1807"></a>
+<span class="sourceLineNo">1808</span>        new BinaryComparator(val2), put);<a name="line.1808"></a>
+<span class="sourceLineNo">1809</span>    assertEquals(false, res);<a name="line.1809"></a>
+<span class="sourceLineNo">1810</span><a name="line.1810"></a>
+<span class="sourceLineNo">1811</span>    // checkAndDelete with wrong value<a name="line.1811"></a>
+<span class="sourceLineNo">1812</span>    Delete delete = new Delete(row1);<a name="line.1812"></a>
+<span class="sourceLineNo">1813</span>    delete.addFamily(fam1);<a name="line.1813"></a>
+<span class="sourceLineNo">1814</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1814"></a>
+<span class="sourceLineNo">1815</span>        new BinaryComparator(val2), put);<a name="line.1815"></a>
+<span class="sourceLineNo">1816</span>    assertEquals(false, res);<a name="line.1816"></a>
+<span class="sourceLineNo">1817</span><a name="line.1817"></a>
+<span class="sourceLineNo">1818</span>    // Putting data in key<a name="line.1818"></a>
+<span class="sourceLineNo">1819</span>    put = new Put(row1);<a name="line.1819"></a>
+<span class="sourceLineNo">1820</span>    put.addColumn(fam1, qf1, Bytes.toBytes(bd1));<a name="line.1820"></a>
+<span class="sourceLineNo">1821</span>    region.put(put);<a name="line.1821"></a>
+<span class="sourceLineNo">1822</span><a name="line.1822"></a>
+<span class="sourceLineNo">1823</span>    // checkAndPut with wrong value<a name="line.1823"></a>
+<span class="sourceLineNo">1824</span>    res =<a name="line.1824"></a>
+<span class="sourceLineNo">1825</span>        region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1825"></a>
+<span class="sourceLineNo">1826</span>            new BigDecimalComparator(bd2), put);<a name="line.1826"></a>
+<span class="sourceLineNo">1827</span>    assertEquals(false, res);<a name="line.1827"></a>
+<span class="sourceLineNo">1828</span><a name="line.1828"></a>
+<span class="sourceLineNo">1829</span>    // checkAndDelete with wrong value<a name="line.1829"></a>
+<span class="sourceLineNo">1830</span>    delete = new Delete(row1);<a name="line.1830"></a>
+<span class="sourceLineNo">1831</span>    delete.addFamily(fam1);<a name="line.1831"></a>
+<span class="sourceLineNo">1832</span>    res =<a name="line.1832"></a>
+<span class="sourceLineNo">1833</span>        region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1833"></a>
+<span class="sourceLineNo">1834</span>            new BigDecimalComparator(bd2), put);<a name="line.1834"></a>
+<span class="sourceLineNo">1835</span>    assertEquals(false, res);<a name="line.1835"></a>
+<span class="sourceLineNo">1836</span>  }<a name="line.1836"></a>
+<span class="sourceLineNo">1837</span><a name="line.1837"></a>
+<span class="sourceLineNo">1838</span>  @Test<a name="line.1838"></a>
+<span class="sourceLineNo">1839</span>  public void testCheckAndMutate_WithCorrectValue() throws IOException {<a name="line.1839"></a>
+<span class="sourceLineNo">1840</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1840"></a>
+<span class="sourceLineNo">1841</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1841"></a>
+<span class="sourceLineNo">1842</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1842"></a>
+<span class="sourceLineNo">1843</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1843"></a>
+<span class="sourceLineNo">1844</span>    BigDecimal bd1 = new BigDecimal(Double.MIN_VALUE);<a name="line.1844"></a>
+<span class="sourceLineNo">1845</span><a name="line.1845"></a>
+<span class="sourceLineNo">1846</span>    // Setting up region<a name="line.1846"></a>
+<span class="sourceLineNo">1847</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.1847"></a>
+<span class="sourceLineNo">1848</span>    // Putting data in key<a name="line.1848"></a>
+<span class="sourceLineNo">1849</span>    Put put = new Put(row1);<a name="line.1849"></a>
+<span class="sourceLineNo">1850</span>    put.addColumn(fam1, qf1, val1);<a name="line.1850"></a>
+<span class="sourceLineNo">1851</span>    region.put(put);<a name="line.1851"></a>
+<span class="sourceLineNo">1852</span><a name="line.1852"></a>
+<span class="sourceLineNo">1853</span>    // checkAndPut with correct value<a name="line.1853"></a>
+<span class="sourceLineNo">1854</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1854"></a>
+<span class="sourceLineNo">1855</span>        new BinaryComparator(val1), put);<a name="line.1855"></a>
+<span class="sourceLineNo">1856</span>    assertEquals(true, res);<a name="line.1856"></a>
+<span class="sourceLineNo">1857</span><a name="line.1857"></a>
+<span class="sourceLineNo">1858</span>    // checkAndDelete with correct value<a name="line.1858"></a>
+<span class="sourceLineNo">1859</span>    Delete delete = new Delete(row1);<a name="line.1859"></a>
+<span class="sourceLineNo">1860</span>    delete.addColumn(fam1, qf1);<a name="line.1860"></a>
+<span class="sourceLineNo">1861</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new BinaryComparator(val1),<a name="line.1861"></a>
+<span class="sourceLineNo">1862</span>        delete);<a name="line.1862"></a>
+<span class="sourceLineNo">1863</span>    assertEquals(true, res);<a name="line.1863"></a>
+<span class="sourceLineNo">1864</span><a name="line.1864"></a>
+<span class="sourceLineNo">1865</span>    // Putting data in key<a name="line.1865"></a>
+<span class="sourceLineNo">1866</span>    put = new Put(row1);<a name="line.1866"></a>
+<span class="sourceLineNo">1867</span>    put.addColumn(fam1, qf1, Bytes.toBytes(bd1));<a name="line.1867"></a>
+<span class="sourceLineNo">1868</span>    region.put(put);<a name="line.1868"></a>
+<span class="sourceLineNo">1869</span><a name="line.1869"></a>
+<span class="sourceLineNo">1870</span>    // checkAndPut with correct value<a name="line.1870"></a>
+<span class="sourceLineNo">1871</span>    res =<a name="line.1871"></a>
+<span class="sourceLineNo">1872</span>        region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new BigDecimalComparator(<a name="line.1872"></a>
+<span class="sourceLineNo">1873</span>            bd1), put);<a name="line.1873"></a>
+<span class="sourceLineNo">1874</span>    assertEquals(true, res);<a name="line.1874"></a>
+<span class="sourceLineNo">1875</span><a name="line.1875"></a>
+<span class="sourceLineNo">1876</span>    // checkAndDelete with correct value<a name="line.1876"></a>
+<span class="sourceLineNo">1877</span>    delete = new Delete(row1);<a name="line.1877"></a>
+<span class="sourceLineNo">1878</span>    delete.addColumn(fam1, qf1);<a name="line.1878"></a>
+<span class="sourceLineNo">1879</span>    res =<a name="line.1879"></a>
+<span class="sourceLineNo">1880</span>        region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new BigDecimalComparator(<a name="line.1880"></a>
+<span class="sourceLineNo">1881</span>            bd1), delete);<a name="line.1881"></a>
+<span class="sourceLineNo">1882</span>    assertEquals(true, res);<a name="line.1882"></a>
+<span class="sourceLineNo">1883</span>  }<a name="line.1883"></a>
+<span class="sourceLineNo">1884</span><a name="line.1884"></a>
+<span class="sourceLineNo">1885</span>  @Test<a name="line.1885"></a>
+<span class="sourceLineNo">1886</span>  public void testCheckAndMutate_WithNonEqualCompareOp() throws IOException {<a name="line.1886"></a>
+<span class="sourceLineNo">1887</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1887"></a>
+<span class="sourceLineNo">1888</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1888"></a>
+<span class="sourceLineNo">1889</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1889"></a>
+<span class="sourceLineNo">1890</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1890"></a>
+<span class="sourceLineNo">1891</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.1891"></a>
+<span class="sourceLineNo">1892</span>    byte[] val3 = Bytes.toBytes("value3");<a name="line.1892"></a>
+<span class="sourceLineNo">1893</span>    byte[] val4 = Bytes.toBytes("value4");<a name="line.1893"></a>
+<span class="sourceLineNo">1894</span><a name="line.1894"></a>
+<span class="sourceLineNo">1895</span>    // Setting up region<a name="line.1895"></a>
+<span class="sourceLineNo">1896</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.1896"></a>
+<span class="sourceLineNo">1897</span>    // Putting val3 in key<a name="line.1897"></a>
+<span class="sourceLineNo">1898</span>    Put put = new Put(row1);<a name="line.1898"></a>
+<span class="sourceLineNo">1899</span>    put.addColumn(fam1, qf1, val3);<a name="line.1899"></a>
+<span class="sourceLineNo">1900</span>    region.put(put);<a name="line.1900"></a>
+<span class="sourceLineNo">1901</span><a name="line.1901"></a>
+<span class="sourceLineNo">1902</span>    // Test CompareOp.LESS: original = val3, compare with val3, fail<a name="line.1902"></a>
+<span class="sourceLineNo">1903</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS,<a name="line.1903"></a>
+<span class="sourceLineNo">1904</span>        new BinaryComparator(val3), put);<a name="line.1904"></a>
+<span class="sourceLineNo">1905</span>    assertEquals(false, res);<a name="line.1905"></a>
+<span class="sourceLineNo">1906</span><a name="line.1906"></a>
+<span class="sourceLineNo">1907</span>    // Test CompareOp.LESS: original = val3, compare with val4, fail<a name="line.1907"></a>
+<span class="sourceLineNo">1908</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS,<a name="line.1908"></a>
+<span class="sourceLineNo">1909</span>        new BinaryComparator(val4), put);<a name="line.1909"></a>
+<span class="sourceLineNo">1910</span>    assertEquals(false, res);<a name="line.1910"></a>
+<span class="sourceLineNo">1911</span><a name="line.1911"></a>
+<span class="sourceLineNo">1912</span>    // Test CompareOp.LESS: original = val3, compare with val2,<a name="line.1912"></a>
+<span class="sourceLineNo">1913</span>    // succeed (now value = val2)<a name="line.1913"></a>
+<span class="sourceLineNo">1914</span>    put = new Put(row1);<a name="line.1914"></a>
+<span class="sourceLineNo">1915</span>    put.addColumn(fam1, qf1, val2);<a name="line.1915"></a>
+<span class="sourceLineNo">1916</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS,<a name="line.1916"></a>
+<span class="sourceLineNo">1917</span>        new BinaryComparator(val2), put);<a name="line.1917"></a>
+<span class="sourceLineNo">1918</span>    assertEquals(true, res);<a name="line.1918"></a>
+<span class="sourceLineNo">1919</span><a name="line.1919"></a>
+<span class="sourceLineNo">1920</span>    // Test CompareOp.LESS_OR_EQUAL: original = val2, compare with val3, fail<a name="line.1920"></a>
+<span class="sourceLineNo">1921</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS_OR_EQUAL,<a name="line.1921"></a>
+<span class="sourceLineNo">1922</span>        new BinaryComparator(val3), put);<a name="line.1922"></a>
+<span class="sourceLineNo">1923</span>    assertEquals(false, res);<a name="line.1923"></a>
+<span class="sourceLineNo">1924</span><a name="line.1924"></a>
+<span class="sourceLineNo">1925</span>    // Test CompareOp.LESS_OR_EQUAL: original = val2, compare with val2,<a name="line.1925"></a>
+<span class="sourceLineNo">1926</span>    // succeed (value still = val2)<a name="line.1926"></a>
+<span class="sourceLineNo">1927</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS_OR_EQUAL,<a name="line.1927"></a>
+<span class="sourceLineNo">1928</span>        new BinaryComparator(val2), put);<a name="line.1928"></a>
+<span class="sourceLineNo">1929</span>    assertEquals(true, res);<a name="line.1929"></a>
+<span class="sourceLineNo">1930</span><a name="line.1930"></a>
+<span class="sourceLineNo">1931</span>    // Test CompareOp.LESS_OR_EQUAL: original = val2, compare with val1,<a name="line.1931"></a>
+<span class="sourceLineNo">1932</span>    // succeed (now value = val3)<a name="line.1932"></a>
+<span class="sourceLineNo">1933</span>    put = new Put(row1);<a name="line.1933"></a>
+<span class="sourceLineNo">1934</span>    put.addColumn(fam1, qf1, val3);<a name="line.1934"></a>
+<span class="sourceLineNo">1935</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS_OR_EQUAL,<a name="line.1935"></a>
+<span class="sourceLineNo">1936</span>        new BinaryComparator(val1), put);<a name="line.1936"></a>
+<span class="sourceLineNo">1937</span>    assertEquals(true, res);<a name="line.1937"></a>
+<span class="sourceLineNo">1938</span><a name="line.1938"></a>
+<span class="sourceLineNo">1939</span>    // Test CompareOp.GREATER: original = val3, compare with val3, fail<a name="line.1939"></a>
+<span class="sourceLineNo">1940</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER,<a name="line.1940"></a>
+<span class="sourceLineNo">1941</span>        new BinaryComparator(val3), put);<a name="line.1941"></a>
+<span class="sourceLineNo">1942</span>    assertEquals(false, res);<a name="line.1942"></a>
+<span class="sourceLineNo">1943</span><a name="line.1943"></a>
+<span class="sourceLineNo">1944</span>    // Test CompareOp.GREATER: original = val3, compare with val2, fail<a name="line.1944"></a>
+<span class="sourceLineNo">1945</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER,<a name="line.1945"></a>
+<span class="sourceLineNo">1946</span>        new BinaryComparator(val2), put);<a name="line.1946"></a>
+<span class="sourceLineNo">1947</span>    assertEquals(false, res);<a name="line.1947"></a>
+<span class="sourceLineNo">1948</span><a name="line.1948"></a>
+<span class="sourceLineNo">1949</span>    // Test CompareOp.GREATER: original = val3, compare with val4,<a name="line.1949"></a>
+<span class="sourceLineNo">1950</span>    // succeed (now value = val2)<a name="line.1950"></a>
+<span class="sourceLineNo">1951</span>    put = new Put(row1);<a name="line.1951"></a>
+<span class="sourceLineNo">1952</span>    put.addColumn(fam1, qf1, val2);<a name="line.1952"></a>
+<span class="sourceLineNo">1953</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER,<a name="line.1953"></a>
+<span class="sourceLineNo">1954</span>        new BinaryComparator(val4), put);<a name="line.1954"></a>
+<span class="sourceLineNo">1955</span>    assertEquals(true, res);<a name="line.1955"></a>
+<span class="sourceLineNo">1956</span><a name="line.1956"></a>
+<span class="sourceLineNo">1957</span>    // Test CompareOp.GREATER_OR_EQUAL: original = val2, compare with val1, fail<a name="line.1957"></a>
+<span class="sourceLineNo">1958</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER_OR_EQUAL,<a name="line.1958"></a>
+<span class="sourceLineNo">1959</span>        new BinaryComparator(val1), put);<a name="line.1959"></a>
+<span class="sourceLineNo">1960</span>    assertEquals(false, res);<a name="line.1960"></a>
+<span class="sourceLineNo">1961</span><a name="line.1961"></a>
+<span class="sourceLineNo">1962</span>    // Test CompareOp.GREATER_OR_EQUAL: original = val2, compare with val2,<a name="line.1962"></a>
+<span class="sourceLineNo">1963</span>    // succeed (value still = val2)<a name="line.1963"></a>
+<span class="sourceLineNo">1964</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER_OR_EQUAL,<a name="line.1964"></a>
+<span class="sourceLineNo">1965</span>        new BinaryComparator(val2), put);<a name="line.1965"></a>
+<span class="sourceLineNo">1966</span>    assertEquals(true, res);<a name="line.1966"></a>
+<span class="sourceLineNo">1967</span><a name="line.1967"></a>
+<span class="sourceLineNo">1968</span>    // Test CompareOp.GREATER_OR_EQUAL: original = val2, compare with val3, succeed<a name="line.1968"></a>
+<span class="sourceLineNo">1969</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER_OR_EQUAL,<a name="line.1969"></a>
+<span class="sourceLineNo">1970</span>        new BinaryComparator(val3), put);<a name="line.1970"></a>
+<span class="sourceLineNo">1971</span>    assertEquals(true, res);<a name="line.1971"></a>
+<span class="sourceLineNo">1972</span>  }<a name="line.1972"></a>
+<span class="sourceLineNo">1973</span><a name="line.1973"></a>
+<span class="sourceLineNo">1974</span>  @Test<a name="line.1974"></a>
+<span class="sourceLineNo">1975</span>  public void testCheckAndPut_ThatPutWasWritten() throws IOException {<a name="line.1975"></a>
+<span class="sourceLineNo">1976</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1976"></a>
+<span class="sourceLineNo">1977</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1977"></a>
+<span class="sourceLineNo">1978</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.1978"></a>
+<span class="sourceLineNo">1979</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1979"></a>
+<span class="sourceLineNo">1980</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1980"></a>
+<span class="sourceLineNo">1981</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.1981"></a>
+<span class="sourceLineNo">1982</span><a name="line.1982"></a>
+<span class="sourceLineNo">1983</span>    byte[][] families = { fam1, fam2 };<a name="line.1983"></a>
+<span class="sourceLineNo">1984</span><a name="line.1984"></a>
+<span class="sourceLineNo">1985</span>    // Setting up region<a name="line.1985"></a>
+<span class="sourceLineNo">1986</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.1986"></a>
+<span class="sourceLineNo">1987</span>    // Putting data in the key to check<a name="line.1987"></a>
+<span class="sourceLineNo">1988</span>    Put put = new Put(row1);<a name="line.1988"></a>
+<span class="sourceLineNo">1989</span>    put.addColumn(fam1, qf1, val1);<a name="line.1989"></a>
+<span class="sourceLineNo">1990</span>    region.put(put);<a name="line.1990"></a>
+<span class="sourceLineNo">1991</span><a name="line.1991"></a>
+<span class="sourceLineNo">1992</span>    // Creating put to add<a name="line.1992"></a>
+<span class="sourceLineNo">1993</span>    long ts = System.currentTimeMillis();<a name="line.1993"></a>
+<span class="sourceLineNo">1994</span>    KeyValue kv = new KeyValue(row1, fam2, qf1, ts, KeyValue.Type.Put, val2);<a name="line.1994"></a>
+<span class="sourceLineNo">1995</span>    put = new Put(row1);<a name="line.1995"></a>
+<span class="sourceLineNo">1996</span>    put.add(kv);<a name="line.1996"></a>
+<span class="sourceLineNo">1997</span><a name="line.1997"></a>
+<span class="sourceLineNo">1998</span>    // checkAndPut with wrong value<a name="line.1998"></a>
+<span class="sourceLineNo">1999</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1999"></a>
+<span class="sourceLineNo">2000</span>        new BinaryComparator(val1), put);<a name="line.2000"></a>
+<span class="sourceLineNo">2001</span>    assertEquals(true, res);<a name="line.2001"></a>
+<span class="sourceLineNo">2002</span><a name="line.2002"></a>
+<span class="sourceLineNo">2003</span>    Get get = new Get(row1);<a name="line.2003"></a>
+<span class="sourceLineNo">2004</span>    get.addColumn(fam2, qf1);<a name="line.2004"></a>
+<span class="sourceLineNo">2005</span>    Cell[] actual = region.get(get).rawCells();<a name="line.2005"></a>
+<span class="sourceLineNo">2006</span><a name="line.2006"></a>
+<span class="sourceLineNo">2007</span>    Cell[] expected = { kv };<a name="line.2007"></a>
+<span class="sourceLineNo">2008</span><a name="line.2008"></a>
+<span class="sourceLineNo">2009</span>    assertEquals(expected.length, actual.length);<a name="line.2009"></a>
+<span class="sourceLineNo">2010</span>    for (int i = 0; i &lt; actual.length; i++) {<a name="line.2010"></a>
+<span class="sourceLineNo">2011</span>      assertEquals(expected[i], actual[i]);<a name="line.2011"></a>
+<span class="sourceLineNo">2012</span>    }<a name="line.2012"></a>
+<span class="sourceLineNo">2013</span>  }<a name="line.2013"></a>
+<span class="sourceLineNo">2014</span><a name="line.2014"></a>
+<span class="sourceLineNo">2015</span>  @Test<a name="line.2015"></a>
+<span class="sourceLineNo">2016</span>  public void testCheckAndPut_wrongRowInPut() throws IOException {<a name="line.2016"></a>
+<span class="sourceLineNo">2017</span>    this.region = initHRegion(tableName, method, CONF, COLUMNS);<a name="line.2017"></a>
+<span class="sourceLineNo">2018</span>    Put put = new Put(row2);<a name="line.2018"></a>
+<span class="sourceLineNo">2019</span>    put.addColumn(fam1, qual1, value1);<a name="line.2019"></a>
+<span class="sourceLineNo">2020</span>    try {<a name="line.2020"></a>
+<span class="sourceLineNo">2021</span>      region.checkAndMutate(row, fam1, qual1, CompareOperator.EQUAL,<a name="line.2021"></a>
+<span class="sourceLineNo">2022</span>          new BinaryComparator(value2), put);<a name="line.2022"></a>
+<span class="sourceLineNo">2023</span>      fail();<a name="line.2023"></a>
+<span class="sourceLineNo">2024</span>    } catch (org.apache.hadoop.hbase.DoNotRetryIOException expected) {<a name="line.2024"></a>
+<span class="sourceLineNo">2025</span>      // expected exception.<a name="line.2025"></a>
+<span class="sourceLineNo">2026</span>    }<a name="line.2026"></a>
+<span class="sourceLineNo">2027</span>  }<a name="line.2027"></a>
+<span class="sourceLineNo">2028</span><a name="line.2028"></a>
+<span class="sourceLineNo">2029</span>  @Test<a name="line.2029"></a>
+<span class="sourceLineNo">2030</span>  public void testCheckAndDelete_ThatDeleteWasWritten() throws IOException {<a name="line.2030"></a>
+<span class="sourceLineNo">2031</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2031"></a>
+<span class="sourceLineNo">2032</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2032"></a>
+<span class="sourceLineNo">2033</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2033"></a>
+<span class="sourceLineNo">2034</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.2034"></a>
+<span class="sourceLineNo">2035</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.2035"></a>
+<span class="sourceLineNo">2036</span>    byte[] qf3 = Bytes.toBytes("qualifier3");<a name="line.2036"></a>
+<span class="sourceLineNo">2037</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.2037"></a>
+<span class="sourceLineNo">2038</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.2038"></a>
+<span class="sourceLineNo">2039</span>    byte[] val3 = Bytes.toBytes("value3");<a name="line.2039"></a>
+<span class="sourceLineNo">2040</span>    byte[] emptyVal = new byte[] {};<a name="line.2040"></a>
+<span class="sourceLineNo">2041</span><a name="line.2041"></a>
+<span class="sourceLineNo">2042</span>    byte[][] families = { fam1, fam2 };<a name="line.2042"></a>
+<span class="sourceLineNo">2043</span><a name="line.2043"></a>
+<span class="sourceLineNo">2044</span>    // Setting up region<a name="line.2044"></a>
+<span class="sourceLineNo">2045</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2045"></a>
+<span class="sourceLineNo">2046</span>    // Put content<a name="line.2046"></a>
+<span class="sourceLineNo">2047</span>    Put put = new Put(row1);<a name="line.2047"></a>
+<span class="sourceLineNo">2048</span>    put.addColumn(fam1, qf1, val1);<a name="line.2048"></a>
+<span class="sourceLineNo">2049</span>    region.put(put);<a name="line.2049"></a>
+<span class="sourceLineNo">2050</span>    Threads.sleep(2);<a name="line.2050"></a>
+<span class="sourceLineNo">2051</span><a name="line.2051"></a>
+<span class="sourceLineNo">2052</span>    put = new Put(row1);<a name="line.2052"></a>
+<span class="sourceLineNo">2053</span>    put.addColumn(fam1, qf1, val2);<a name="line.2053"></a>
+<span class="sourceLineNo">2054</span>    put.addColumn(fam2, qf1, val3);<a name="line.2054"></a>
+<span class="sourceLineNo">2055</span>    put.addColumn(fam2, qf2, val2);<a name="line.2055"></a>
+<span class="sourceLineNo">2056</span>    put.addColumn(fam2, qf3, val1);<a name="line.2056"></a>
+<span class="sourceLineNo">2057</span>    put.addColumn(fam1, qf3, val1);<a name="line.2057"></a>
+<span class="sourceLineNo">2058</span>    region.put(put);<a name="line.2058"></a>
+<span class="sourceLineNo">2059</span><a name="line.2059"></a>
+<span class="sourceLineNo">2060</span>    // Multi-column delete<a name="line.2060"></a>
+<span class="sourceLineNo">2061</span>    Delete delete = new Delete(row1);<a name="line.2061"></a>
+<span class="sourceLineNo">2062</span>    delete.addColumn(fam1, qf1);<a name="line.2062"></a>
+<span class="sourceLineNo">2063</span>    delete.addColumn(fam2, qf1);<a name="line.2063"></a>
+<span class="sourceLineNo">2064</span>    delete.addColumn(fam1, qf3);<a name="line.2064"></a>
+<span class="sourceLineNo">2065</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.2065"></a>
+<span class="sourceLineNo">2066</span>        new BinaryComparator(val2), delete);<a name="line.2066"></a>
+<span class="sourceLineNo">2067</span>    assertEquals(true, res);<a name="line.2067"></a>
+<span class="sourceLineNo">2068</span><a name="line.2068"></a>
+<span class="sourceLineNo">2069</span>    Get get = new Get(row1);<a name="line.2069"></a>
+<span class="sourceLineNo">2070</span>    get.addColumn(fam1, qf1);<a name="line.2070"></a>
+<span class="sourceLineNo">2071</span>    get.addColumn(fam1, qf3);<a name="line.2071"></a>
+<span class="sourceLineNo">2072</span>    get.addColumn(fam2, qf2);<a name="line.2072"></a>
+<span class="sourceLineNo">2073</span>    Result r = region.get(get);<a name="line.2073"></a>
+<span class="sourceLineNo">2074</span>    assertEquals(2, r.size());<a name="line.2074"></a>
+<span class="sourceLineNo">2075</span>    assertArrayEquals(val1, r.getValue(fam1, qf1));<a name="line.2075"></a>
+<span class="sourceLineNo">2076</span>    assertArrayEquals(val2, r.getValue(fam2, qf2));<a name="line.2076"></a>
+<span class="sourceLineNo">2077</span><a name="line.2077"></a>
+<span class="sourceLineNo">2078</span>    // Family delete<a name="line.2078"></a>
+<span class="sourceLineNo">2079</span>    delete = new Delete(row1);<a name="line.2079"></a>
+<span class="sourceLineNo">2080</span>    delete.addFamily(fam2);<a name="line.2080"></a>
+<span class="sourceLineNo">2081</span>    res = region.checkAndMutate(row1, fam2, qf1, CompareOperator.EQUAL,<a name="line.2081"></a>
+<span class="sourceLineNo">2082</span>        new BinaryComparator(emptyVal), delete);<a name="line.2082"></a>
+<span class="sourceLineNo">2083</span>    assertEquals(true, res);<a name="line.2083"></a>
+<span class="sourceLineNo">2084</span><a name="line.2084"></a>
+<span class="sourceLineNo">2085</span>    get = new Get(row1);<a name="line.2085"></a>
+<span class="sourceLineNo">2086</span>    r = region.get(get);<a name="line.2086"></a>
+<span class="sourceLineNo">2087</span>    assertEquals(1, r.size());<a name="line.2087"></a>
+<span class="sourceLineNo">2088</span>    assertArrayEquals(val1, r.getValue(fam1, qf1));<a name="line.2088"></a>
+<span class="sourceLineNo">2089</span><a name="line.2089"></a>
+<span class="sourceLineNo">2090</span>    // Row delete<a name="line.2090"></a>
+<span class="sourceLineNo">2091</span>    delete = new Delete(row1);<a name="line.2091"></a>
+<span class="sourceLineNo">2092</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new BinaryComparator(val1),<a name="line.2092"></a>
+<span class="sourceLineNo">2093</span>        delete);<a name="line.2093"></a>
+<span class="sourceLineNo">2094</span>    assertEquals(true, res);<a name="line.2094"></a>
+<span class="sourceLineNo">2095</span>    get = new Get(row1);<a name="line.2095"></a>
+<span class="sourceLineNo">2096</span>    r = region.get(get);<a name="line.2096"></a>
+<span class="sourceLineNo">2097</span>    assertEquals(0, r.size());<a name="line.2097"></a>
+<span class="sourceLineNo">2098</span>  }<a name="line.2098"></a>
+<span class="sourceLineNo">2099</span><a name="line.2099"></a>
+<span class="sourceLineNo">2100</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2100"></a>
+<span class="sourceLineNo">2101</span>  // Delete tests<a name="line.2101"></a>
+<span class="sourceLineNo">2102</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2102"></a>
+<span class="sourceLineNo">2103</span>  @Test<a name="line.2103"></a>
+<span class="sourceLineNo">2104</span>  public void testDelete_multiDeleteColumn() throws IOException {<a name="line.2104"></a>
+<span class="sourceLineNo">2105</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2105"></a>
+<span class="sourceLineNo">2106</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2106"></a>
+<span class="sourceLineNo">2107</span>    byte[] qual = Bytes.toBytes("qualifier");<a name="line.2107"></a>
+<span class="sourceLineNo">2108</span>    byte[] value = Bytes.toBytes("value");<a name="line.2108"></a>
+<span class="sourceLineNo">2109</span><a name="line.2109"></a>
+<span class="sourceLineNo">2110</span>    Put put = new Put(row1);<a name="line.2110"></a>
+<span class="sourceLineNo">2111</span>    put.addColumn(fam1, qual, 1, value);<a name="line.2111"></a>
+<span class="sourceLineNo">2112</span>    put.addColumn(fam1, qual, 2, value);<a name="line.2112"></a>
+<span class="sourceLineNo">2113</span><a name="line.2113"></a>
+<span class="sourceLineNo">2114</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2114"></a>
+<span class="sourceLineNo">2115</span>    region.put(put);<a name="line.2115"></a>
+<span class="sourceLineNo">2116</span><a name="line.2116"></a>
+<span class="sourceLineNo">2117</span>    // We do support deleting more than 1 'latest' version<a name="line.2117"></a>
+<span class="sourceLineNo">2118</span>    Delete delete = new Delete(row1);<a name="line.2118"></a>
 <span class="sourceLineNo">2119</span>    delete.addColumn(fam1, qual);<a name="line.2119"></a>
-<span class="sourceLineNo">2120</span>    region.delete(delete);<a name="line.2120"></a>
-<span class="sourceLineNo">2121</span><a name="line.2121"></a>
-<span class="sourceLineNo">2122</span>    Get get = new Get(row1);<a name="line.2122"></a>
-<span class="sourceLineNo">2123</span>    get.addFamily(fam1);<a name="line.2123"></a>
-<span class="sourceLineNo">2124</span>    Result r = region.get(get);<a name="line.2124"></a>
-<span class="sourceLineNo">2125</span>    assertEquals(0, r.size());<a name="line.2125"></a>
-<span class="sourceLineNo">2126</span>  }<a name="line.2126"></a>
-<span class="sourceLineNo">2127</span><a name="line.2127"></a>
-<span class="sourceLineNo">2128</span>  @Test<a name="line.2128"></a>
-<span class="sourceLineNo">2129</span>  public void testDelete_CheckFamily() throws IOException {<a name="line.2129"></a>
-<span class="sourceLineNo">2130</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2130"></a>
-<span class="sourceLineNo">2131</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2131"></a>
-<span class="sourceLineNo">2132</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2132"></a>
-<span class="sourceLineNo">2133</span>    byte[] fam3 = Bytes.toBytes("fam3");<a name="line.2133"></a>
-<span class="sourceLineNo">2134</span>    byte[] fam4 = Bytes.toBytes("fam4");<a name="line.2134"></a>
-<span class="sourceLineNo">2135</span><a name="line.2135"></a>
-<span class="sourceLineNo">2136</span>    // Setting up region<a name="line.2136"></a>
-<span class="sourceLineNo">2137</span>    this.region = initHRegion(tableName, method, CONF, fam1, fam2, fam3);<a name="line.2137"></a>
-<span class="sourceLineNo">2138</span>    List&lt;Cell&gt; kvs = new ArrayList&lt;&gt;();<a name="line.2138"></a>
-<span class="sourceLineNo">2139</span>    kvs.add(new KeyValue(row1, fam4, null, null));<a name="line.2139"></a>
-<span class="sourceLineNo">2140</span><a name="line.2140"></a>
-<span class="sourceLineNo">2141</span>    // testing existing family<a name="line.2141"></a>
-<span class="sourceLineNo">2142</span>    byte[] family = fam2;<a name="line.2142"></a>
-<span class="sourceLineNo">2143</span>    NavigableMap&lt;byte[], List&lt;Cell&gt;&gt; deleteMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2143"></a>
-<span class="sourceLineNo">2144</span>    deleteMap.put(family, kvs);<a name="line.2144"></a>
-<span class="sourceLineNo">2145</span>    region.delete(deleteMap, Durability.SYNC_WAL);<a name="line.2145"></a>
-<span class="sourceLineNo">2146</span><a name="line.2146"></a>
-<span class="sourceLineNo">2147</span>    // testing non existing family<a name="line.2147"></a>
-<span class="sourceLineNo">2148</span>    boolean ok = false;<a name="line.2148"></a>
-<span class="sourceLineNo">2149</span>    family = fam4;<a name="line.2149"></a>
-<span class="sourceLineNo">2150</span>    try {<a name="line.2150"></a>
-<span class="sourceLineNo">2151</span>      deleteMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2151"></a>
-<span class="sourceLineNo">2152</span>      deleteMap.put(family, kvs);<a name="line.2152"></a>
-<span class="sourceLineNo">2153</span>      region.delete(deleteMap, Durability.SYNC_WAL);<a name="line.2153"></a>
-<span class="sourceLineNo">2154</span>    } catch (Exception e) {<a name="line.2154"></a>
-<span class="sourceLineNo">2155</span>      ok = true;<a name="line.2155"></a>
-<span class="sourceLineNo">2156</span>    }<a name="line.2156"></a>
-<span class="sourceLineNo">2157</span>    assertTrue("Family " + new String(family, StandardCharsets.UTF_8) + " does exist", ok);<a name="line.2157"></a>
-<span class="sourceLineNo">2158</span>  }<a name="line.2158"></a>
-<span class="sourceLineNo">2159</span><a name="line.2159"></a>
-<span class="sourceLineNo">2160</span>  @Test<a name="line.2160"></a>
-<span class="sourceLineNo">2161</span>  public void testDelete_mixed() throws IOException, InterruptedException {<a name="line.2161"></a>
-<span class="sourceLineNo">2162</span>    byte[] fam = Bytes.toBytes("info");<a name="line.2162"></a>
-<span class="sourceLineNo">2163</span>    byte[][] families = { fam };<a name="line.2163"></a>
-<span class="sourceLineNo">2164</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2164"></a>
-<span class="sourceLineNo">2165</span>    EnvironmentEdgeManagerTestHelper.injectEdge(new IncrementingEnvironmentEdge());<a name="line.2165"></a>
-<span class="sourceLineNo">2166</span><a name="line.2166"></a>
-<span class="sourceLineNo">2167</span>    byte[] row = Bytes.toBytes("table_name");<a name="line.2167"></a>
-<span class="sourceLineNo">2168</span>    // column names<a name="line.2168"></a>
-<span class="sourceLineNo">2169</span>    byte[] serverinfo = Bytes.toBytes("serverinfo");<a name="line.2169"></a>
-<span class="sourceLineNo">2170</span>    byte[] splitA = Bytes.toBytes("splitA");<a name="line.2170"></a>
-<span class="sourceLineNo">2171</span>    byte[] splitB = Bytes.toBytes("splitB");<a name="line.2171"></a>
-<span class="sourceLineNo">2172</span><a name="line.2172"></a>
-<span class="sourceLineNo">2173</span>    // add some data:<a name="line.2173"></a>
-<span class="sourceLineNo">2174</span>    Put put = new Put(row);<a name="line.2174"></a>
-<span class="sourceLineNo">2175</span>    put.addColumn(fam, splitA, Bytes.toBytes("reference_A"));<a name="line.2175"></a>
-<span class="sourceLineNo">2176</span>    region.put(put);<a name="line.2176"></a>
-<span class="sourceLineNo">2177</span><a name="line.2177"></a>
-<span class="sourceLineNo">2178</span>    put = new Put(row);<a name="line.2178"></a>
-<span class="sourceLineNo">2179</span>    put.addColumn(fam, splitB, Bytes.toBytes("reference_B"));<a name="line.2179"></a>
-<span class="sourceLineNo">2180</span>    region.put(put);<a name="line.2180"></a>
-<span class="sourceLineNo">2181</span><a name="line.2181"></a>
-<span class="sourceLineNo">2182</span>    put = new Put(row);<a name="line.2182"></a>
-<span class="sourceLineNo">2183</span>    put.addColumn(fam, serverinfo, Bytes.toBytes("ip_address"));<a name="line.2183"></a>
-<span class="sourceLineNo">2184</span>    region.put(put);<a name="line.2184"></a>
-<span class="sourceLineNo">2185</span><a name="line.2185"></a>
-<span class="sourceLineNo">2186</span>    // ok now delete a split:<a name="line.2186"></a>
-<span class="sourceLineNo">2187</span>    Delete delete = new Delete(row);<a name="line.2187"></a>
-<span class="sourceLineNo">2188</span>    delete.addColumns(fam, splitA);<a name="line.2188"></a>
-<span class="sourceLineNo">2189</span>    region.delete(delete);<a name="line.2189"></a>
-<span class="sourceLineNo">2190</span><a name="line.2190"></a>
-<span class="sourceLineNo">2191</span>    // assert some things:<a name="line.2191"></a>
-<span class="sourceLineNo">2192</span>    Get get = new Get(row).addColumn(fam, serverinfo);<a name="line.2192"></a>
-<span class="sourceLineNo">2193</span>    Result result = region.get(get);<a name="line.2193"></a>
-<span class="sourceLineNo">2194</span>    assertEquals(1, result.size());<a name="line.2194"></a>
-<span class="sourceLineNo">2195</span><a name="line.2195"></a>
-<span class="sourceLineNo">2196</span>    get = new Get(row).addColumn(fam, splitA);<a name="line.2196"></a>
-<span class="sourceLineNo">2197</span>    result = region.get(get);<a name="line.2197"></a>
-<span class="sourceLineNo">2198</span>    assertEquals(0, result.size());<a name="line.2198"></a>
-<span class="sourceLineNo">2199</span><a name="line.2199"></a>
-<span class="sourceLineNo">2200</span>    get = new Get(row).addColumn(fam, splitB);<a name="line.2200"></a>
-<span class="sourceLineNo">2201</span>    result = region.get(get);<a name="line.2201"></a>
-<span class="sourceLineNo">2202</span>    assertEquals(1, result.size());<a name="line.2202"></a>
-<span class="sourceLineNo">2203</span><a name="line.2203"></a>
-<span class="sourceLineNo">2204</span>    // Assert that after a delete, I can put.<a name="line.2204"></a>
-<span class="sourceLineNo">2205</span>    put = new Put(row);<a name="line.2205"></a>
-<span class="sourceLineNo">2206</span>    put.addColumn(fam, splitA, Bytes.toBytes("reference_A"));<a name="line.2206"></a>
-<span class="sourceLineNo">2207</span>    region.put(put);<a name="line.2207"></a>
-<span class="sourceLineNo">2208</span>    get = new Get(row);<a name="line.2208"></a>
-<span class="sourceLineNo">2209</span>    result = region.get(get);<a name="line.2209"></a>
-<span class="sourceLineNo">2210</span>    assertEquals(3, result.size());<a name="line.2210"></a>
-<span class="sourceLineNo">2211</span><a name="line.2211"></a>
-<span class="sourceLineNo">2212</span>    // Now delete all... then test I can add stuff back<a name="line.2212"></a>
-<span class="sourceLineNo">2213</span>    delete = new Delete(row);<a name="line.2213"></a>
-<span class="sourceLineNo">2214</span>    region.delete(delete);<a name="line.2214"></a>
-<span class="sourceLineNo">2215</span>    assertEquals(0, region.get(get).size());<a name="line.2215"></a>
-<span class="sourceLineNo">2216</span><a name="line.2216"></a>
-<span class="sourceLineNo">2217</span>    region.put(new Put(row).addColumn(fam, splitA, Bytes.toBytes("reference_A")));<a name="line.2217"></a>
-<span class="sourceLineNo">2218</span>    result = region.get(get);<a name="line.2218"></a>
-<span class="sourceLineNo">2219</span>    assertEquals(1, result.size());<a name="line.2219"></a>
-<span class="sourceLineNo">2220</span>  }<a name="line.2220"></a>
-<span class="sourceLineNo">2221</span><a name="line.2221"></a>
-<span class="sourceLineNo">2222</span>  @Test<a name="line.2222"></a>
-<span class="sourceLineNo">2223</span>  public void testDeleteRowWithFutureTs() throws IOException {<a name="line.2223"></a>
-<span class="sourceLineNo">2224</span>    byte[] fam = Bytes.toBytes("info");<a name="line.2224"></a>
-<span class="sourceLineNo">2225</span>    byte[][] families = { fam };<a name="line.2225"></a>
-<span class="sourceLineNo">2226</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2226"></a>
-<span class="sourceLineNo">2227</span>    byte[] row = Bytes.toBytes("table_name");<a name="line.2227"></a>
-<span class="sourceLineNo">2228</span>    // column names<a name="line.2228"></a>
-<span class="sourceLineNo">2229</span>    byte[] serverinfo = Bytes.toBytes("serverinfo");<a name="line.2229"></a>
-<span class="sourceLineNo">2230</span><a name="line.2230"></a>
-<span class="sourceLineNo">2231</span>    // add data in the far future<a name="line.2231"></a>
-<span class="sourceLineNo">2232</span>    Put put = new Put(row);<a name="line.2232"></a>
-<span class="sourceLineNo">2233</span>    put.addColumn(fam, serverinfo, HConstants.LATEST_TIMESTAMP - 5, Bytes.toBytes("value"));<a name="line.2233"></a>
-<span class="sourceLineNo">2234</span>    region.put(put);<a name="line.2234"></a>
-<span class="sourceLineNo">2235</span><a name="line.2235"></a>
-<span class="sourceLineNo">2236</span>    // now delete something in the present<a name="line.2236"></a>
-<span class="sourceLineNo">2237</span>    Delete delete = new Delete(row);<a name="line.2237"></a>
-<span class="sourceLineNo">2238</span>    region.delete(delete);<a name="line.2238"></a>
-<span class="sourceLineNo">2239</span><a name="line.2239"></a>
-<span class="sourceLineNo">2240</span>    // make sure we still see our data<a name="line.2240"></a>
-<span class="sourceLineNo">2241</span>    Get get = new Get(row).addColumn(fam, serverinfo);<a name="line.2241"></a>
-<span class="sourceLineNo">2242</span>    Result result = region.get(get);<a name="line.2242"></a>
-<span class="sourceLineNo">2243</span>    assertEquals(1, result.size());<a name="line.2243"></a>
-<span class="sourceLineNo">2244</span><a name="line.2244"></a>
-<span class="sourceLineNo">2245</span>    // delete the future row<a name="line.2245"></a>
-<span class="sourceLineNo">2246</span>    delete = new Delete(row, HConstants.LATEST_TIMESTAMP - 3);<a name="line.2246"></a>
-<span class="sourceLineNo">2247</span>    region.delete(delete);<a name="line.2247"></a>
-<span class="sourceLineNo">2248</span><a name="line.2248"></a>
-<span class="sourceLineNo">2249</span>    // make sure it is gone<a name="line.2249"></a>
-<span class="sourceLineNo">2250</span>    get = new Get(row).addColumn(fam, serverinfo);<a name="line.2250"></a>
-<span class="sourceLineNo">2251</span>    result = region.get(get);<a name="line.2251"></a>
-<span class="sourceLineNo">2252</span>    assertEquals(0, result.size());<a name="line.2252"></a>
-<span class="sourceLineNo">2253</span>  }<a name="line.2253"></a>
-<span class="sourceLineNo">2254</span><a name="line.2254"></a>
-<span class="sourceLineNo">2255</span>  /**<a name="line.2255"></a>
-<span class="sourceLineNo">2256</span>   * Tests that the special LATEST_TIMESTAMP option for puts gets replaced by<a name="line.2256"></a>
-<span class="sourceLineNo">2257</span>   * the actual timestamp<a name="line.2257"></a>
-<span class="sourceLineNo">2258</span>   */<a name="line.2258"></a>
-<span class="sourceLineNo">2259</span>  @Test<a name="line.2259"></a>
-<span class="sourceLineNo">2260</span>  public void testPutWithLatestTS() throws IOException {<a name="line.2260"></a>
-<span class="sourceLineNo">2261</span>    byte[] fam = Bytes.toBytes("info");<a name="line.2261"></a>
-<span class="sourceLineNo">2262</span>    byte[][] families = { fam };<a name="line.2262"></a>
-<span class="sourceLineNo">2263</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2263"></a>
-<span class="sourceLineNo">2264</span>    byte[] row = Bytes.toBytes("row1");<a name="line.2264"></a>
-<span class="sourceLineNo">2265</span>    // column names<a name="line.2265"></a>
-<span class="sourceLineNo">2266</span>    byte[] qual = Bytes.toBytes("qual");<a name="line.2266"></a>
-<span class="sourceLineNo">2267</span><a name="line.2267"></a>
-<span class="sourceLineNo">2268</span>    // add data with LATEST_TIMESTAMP, put without WAL<a name="line.2268"></a>
-<span class="sourceLineNo">2269</span>    Put put = new Put(row);<a name="line.2269"></a>
-<span class="sourceLineNo">2270</span>    put.addColumn(fam, qual, HConstants.LATEST_TIMESTAMP, Bytes.toBytes("value"));<a name="line.2270"></a>
-<span class="sourceLineNo">2271</span>    region.put(put);<a name="line.2271"></a>
-<span class="sourceLineNo">2272</span><a name="line.2272"></a>
-<span class="sourceLineNo">2273</span>    // Make sure it shows up with an actual timestamp<a name="line.2273"></a>
-<span class="sourceLineNo">2274</span>    Get get = new Get(row).addColumn(fam, qual);<a name="line.2274"></a>
-<span class="sourceLineNo">2275</span>    Result result = region.get(get);<a name="line.2275"></a>
-<span class="sourceLineNo">2276</span>    assertEquals(1, result.size());<a name="line.2276"></a>
-<span class="sourceLineNo">2277</span>    Cell kv = result.rawCells()[0];<a name="line.2277"></a>
-<span class="sourceLineNo">2278</span>    LOG.info("Got: " + kv);<a name="line.2278"></a>
-<span class="sourceLineNo">2279</span>    assertTrue("LATEST_TIMESTAMP was not replaced with real timestamp",<a name="line.2279"></a>
-<span class="sourceLineNo">2280</span>        kv.getTimestamp() != HConstants.LATEST_TIMESTAMP);<a name="line.2280"></a>
-<span class="sourceLineNo">2281</span><a name="line.2281"></a>
-<span class="sourceLineNo">2282</span>    // Check same with WAL enabled (historically these took different<a name="line.2282"></a>
-<span class="sourceLineNo">2283</span>    // code paths, so check both)<a name="line.2283"></a>
-<span class="sourceLineNo">2284</span>    row = Bytes.toBytes("row2");<a name="line.2284"></a>
-<span class="sourceLineNo">2285</span>    put = new Put(row);<a name="line.2285"></a>
-<span class="sourceLineNo">2286</span>    put.addColumn(fam, qual, HConstants.LATEST_TIMESTAMP, Bytes.toBytes("value"));<a name="line.2286"></a>
-<span class="sourceLineNo">2287</span>    region.put(put);<a name="line.2287"></a>
-<span class="sourceLineNo">2288</span><a name="line.2288"></a>
-<span class="sourceLineNo">2289</span>    // Make sure it shows up with an actual timestamp<a name="line.2289"></a>
-<span class="sourceLineNo">2290</span>    get = new Get(row).addColumn(fam, qual);<a name="line.2290"></a>
-<span class="sourceLineNo">2291</span>    result = region.get(get);<a name="line.2291"></a>
-<span class="sourceLineNo">2292</span>    assertEquals(1, result.size());<a name="line.2292"></a>
-<span class="sourceLineNo">2293</span>    kv = result.rawCells()[0];<a name="line.2293"></a>
-<span class="sourceLineNo">2294</span>    LOG.info("Got: " + kv);<a name="line.2294"></a>
-<span class="sourceLineNo">2295</span>    assertTrue("LATEST_TIMESTAMP was not replaced with real timestamp",<a name="line.2295"></a>
-<span class="sourceLineNo">2296</span>        kv.getTimestamp() != HConstants.LATEST_TIMESTAMP);<a name="line.2296"></a>
-<span class="sourceLineNo">2297</span>  }<a name="line.2297"></a>
-<span class="sourceLineNo">2298</span><a name="line.2298"></a>
-<span class="sourceLineNo">2299</span>  /**<a name="line.2299"></a>
-<span class="sourceLineNo">2300</span>   * Tests that there is server-side filtering for invalid timestamp upper<a name="line.2300"></a>
-<span class="sourceLineNo">2301</span>   * bound. Note that the timestamp lower bound is automatically handled for us<a name="line.2301"></a>
-<span class="sourceLineNo">2302</span>   * by the TTL field.<a name="line.2302"></a>
-<span class="sourceLineNo">2303</span>   */<a name="line.2303"></a>
-<span class="sourceLineNo">2304</span>  @Test<a name="line.2304"></a>
-<span class="sourceLineNo">2305</span>  public void testPutWithTsSlop() throws IOException {<a name="line.2305"></a>
-<span class="sourceLineNo">2306</span>    byte[] fam = Bytes.toBytes("info");<a name="line.2306"></a>
-<span class="sourceLineNo">2307</span>    byte[][] families = { fam };<a name="line.2307"></a>
-<span class="sourceLineNo">2308</span><a name="line.2308"></a>
-<span class="sourceLineNo">2309</span>    // add data with a timestamp that is too recent for range. Ensure assert<a name="line.2309"></a>
-<span class="sourceLineNo">2310</span>    CONF.setInt("hbase.hregion.keyvalue.timestamp.slop.millisecs", 1000);<a name="line.2310"></a>
-<span class="sourceLineNo">2311</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2311"></a>
-<span class="sourceLineNo">2312</span>    boolean caughtExcep = false;<a name="line.2312"></a>
-<span class="sourceLineNo">2313</span>    try {<a name="line.2313"></a>
-<span class="sourceLineNo">2314</span>      // no TS specified == use latest. should not error<a name="line.2314"></a>
-<span class="sourceLineNo">2315</span>      region.put(new Put(row).addColumn(fam, Bytes.toBytes("qual"), Bytes.toBytes("value")));<a name="line.2315"></a>
-<span class="sourceLineNo">2316</span>      // TS out of range. should error<a name="line.2316"></a>
-<span class="sourceLineNo">2317</span>      region.put(new Put(row).addColumn(fam, Bytes.toBytes("qual"),<a name="line.2317"></a>
-<span class="sourceLineNo">2318</span>          System.currentTimeMillis() + 2000, Bytes.toBytes("value")));<a name="line.2318"></a>
-<span class="sourceLineNo">2319</span>      fail("Expected IOE for TS out of configured timerange");<a name="line.2319"></a>
-<span class="sourceLineNo">2320</span>    } catch (FailedSanityCheckException ioe) {<a name="line.2320"></a>
-<span class="sourceLineNo">2321</span>      LOG.debug("Received expected exception", ioe);<a name="line.2321"></a>
-<span class="sourceLineNo">2322</span>      caughtExcep = true;<a name="line.2322"></a>
-<span class="sourceLineNo">2323</span>    }<a name="line.2323"></a>
-<span class="sourceLineNo">2324</span>    assertTrue("Should catch FailedSanityCheckException", caughtExcep);<a name="line.2324"></a>
-<span class="sourceLineNo">2325</span>  }<a name="line.2325"></a>
-<span class="sourceLineNo">2326</span><a name="line.2326"></a>
-<span class="sourceLineNo">2327</span>  @Test<a name="line.2327"></a>
-<span class="sourceLineNo">2328</span>  public void testScanner_DeleteOneFamilyNotAnother() throws IOException {<a name="line.2328"></a>
-<span class="sourceLineNo">2329</span>    byte[] fam1 = Bytes.toBytes("columnA");<a name="line.2329"></a>
-<span class="sourceLineNo">2330</span>    byte[] fam2 = Bytes.toBytes("columnB");<a name="line.2330"></a>
-<span class="sourceLineNo">2331</span>    this.region = initHRegion(tableName, method, CONF, fam1, fam2);<a name="line.2331"></a>
-<span class="sourceLineNo">2332</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.2332"></a>
-<span class="sourceLineNo">2333</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.2333"></a>
-<span class="sourceLineNo">2334</span><a name="line.2334"></a>
-<span class="sourceLineNo">2335</span>    byte[] value = Bytes.toBytes("value");<a name="line.2335"></a>
-<span class="sourceLineNo">2336</span><a name="line.2336"></a>
-<span class="sourceLineNo">2337</span>    Delete delete = new Delete(rowA);<a name="line.2337"></a>
-<span class="sourceLineNo">2338</span>    delete.addFamily(fam1);<a name="line.2338"></a>
-<span class="sourceLineNo">2339</span><a name="line.2339"></a>
-<span class="sourceLineNo">2340</span>    region.delete(delete);<a name="line.2340"></a>
-<span class="sourceLineNo">2341</span><a name="line.2341"></a>
-<span class="sourceLineNo">2342</span>    // now create data.<a name="line.2342"></a>
-<span class="sourceLineNo">2343</span>    Put put = new Put(rowA);<a name="line.2343"></a>
-<span class="sourceLineNo">2344</span>    put.addColumn(fam2, null, value);<a name="line.2344"></a>
-<span class="sourceLineNo">2345</span>    region.put(put);<a name="line.2345"></a>
-<span class="sourceLineNo">2346</span><a name="line.2346"></a>
-<span class="sourceLineNo">2347</span>    put = new Put(rowB);<a name="line.2347"></a>
-<span class="sourceLineNo">2348</span>    put.addColumn(fam1, null, value);<a name="line.2348"></a>
-<span class="sourceLineNo">2349</span>    put.addColumn(fam2, null, value);<a name="line.2349"></a>
-<span class="sourceLineNo">2350</span>    region.put(put);<a name="line.2350"></a>
-<span class="sourceLineNo">2351</span><a name="line.2351"></a>
-<span class="sourceLineNo">2352</span>    Scan scan = new Scan();<a name="line.2352"></a>
-<span class="sourceLineNo">2353</span>    scan.addFamily(fam1).addFamily(fam2);<a name="line.2353"></a>
-<span class="sourceLineNo">2354</span>    InternalScanner s = region.getScanner(scan);<a name="line.2354"></a>
-<span class="sourceLineNo">2355</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.2355"></a>
-<span class="sourceLineNo">2356</span>    s.next(results);<a name="line.2356"></a>
-<span class="sourceLineNo">2357</span>    assertTrue(CellUtil.matchingRows(results.get(0), rowA));<a name="line.2357"></a>
-<span class="sourceLineNo">2358</span><a name="line.2358"></a>
-<span class="sourceLineNo">2359</span>    results.clear();<a name="line.2359"></a>
-<span class="sourceLineNo">2360</span>    s.next(results);<a name="line.2360"></a>
-<span class="sourceLineNo">2361</span>    assertTrue(CellUtil.matchingRows(results.get(0), rowB));<a name="line.2361"></a>
-<span class="sourceLineNo">2362</span>  }<a name="line.2362"></a>
-<span class="sourceLineNo">2363</span><a name="line.2363"></a>
-<span class="sourceLineNo">2364</span>  @Test<a name="line.2364"></a>
-<span class="sourceLineNo">2365</span>  public void testDataInMemoryWithoutWAL() throws IOException {<a name="line.2365"></a>
-<span class="sourceLineNo">2366</span>    FileSystem fs = FileSystem.get(CONF);<a name="line.2366"></a>
-<span class="sourceLineNo">2367</span>    Path rootDir = new Path(dir + "testDataInMemoryWithoutWAL");<a name="line.2367"></a>
-<span class="sourceLineNo">2368</span>    FSHLog hLog = new FSHLog(fs, rootDir, "testDataInMemoryWithoutWAL", CONF);<a name="line.2368"></a>
-<span class="sourceLineNo">2369</span>    hLog.init();<a name="line.2369"></a>
-<span class="sourceLineNo">2370</span>    // This chunk creation is done throughout the code base. Do we want to move it into core?<a name="line.2370"></a>
-<span class="sourceLineNo">2371</span>    // It is missing from this test. W/o it we NPE.<a name="line.2371"></a>
-<span class="sourceLineNo">2372</span>    ChunkCreator.initialize(MemStoreLABImpl.CHUNK_SIZE_DEFAULT, false, 0, 0, 0, null);<a name="line.2372"></a>
-<span class="sourceLineNo">2373</span>    region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, hLog,<a name="line.2373"></a>
-<span class="sourceLineNo">2374</span>        COLUMN_FAMILY_BYTES);<a name="line.2374"></a>
-<span class="sourceLineNo">2375</span><a name="line.2375"></a>
-<span class="sourceLineNo">2376</span>    Cell originalCell = CellUtil.createCell(row, COLUMN_FAMILY_BYTES, qual1,<a name="line.2376"></a>
-<span class="sourceLineNo">2377</span>      System.currentTimeMillis(), KeyValue.Type.Put.getCode(), value1);<a name="line.2377"></a>
-<span class="sourceLineNo">2378</span>    final long originalSize = originalCell.getSerializedSize();<a name="line.2378"></a>
-<span class="sourceLineNo">2379</span><a name="line.2379"></a>
-<span class="sourceLineNo">2380</span>    Cell addCell = CellUtil.createCell(row, COLUMN_FAMILY_BYTES, qual1,<a name="line.2380"></a>
-<span class="sourceLineNo">2381</span>      System.currentTimeMillis(), KeyValue.Type.Put.getCode(), Bytes.toBytes("xxxxxxxxxx"));<a name="line.2381"></a>
-<span class="sourceLineNo">2382</span>    final long addSize = addCell.getSerializedSize();<a name="line.2382"></a>
-<span class="sourceLineNo">2383</span><a name="line.2383"></a>
-<span class="sourceLineNo">2384</span>    LOG.info("originalSize:" + originalSize<a name="line.2384"></a>
-<span class="sourceLineNo">2385</span>      + ", addSize:" + addSize);<a name="line.2385"></a>
-<span class="sourceLineNo">2386</span>    // start test. We expect that the addPut's durability will be replaced<a name="line.2386"></a>
-<span class="sourceLineNo">2387</span>    // by originalPut's durability.<a name="line.2387"></a>
-<span class="sourceLineNo">2388</span><a name="line.2388"></a>
-<span class="sourceLineNo">2389</span>    // case 1:<a name="line.2389"></a>
-<span class="sourceLineNo">2390</span>    testDataInMemoryWithoutWAL(region,<a name="line.2390"></a>
-<span class="sourceLineNo">2391</span>            new Put(row).add(originalCell).setDurability(Durability.SKIP_WAL),<a name="line.2391"></a>
-<span class="sourceLineNo">2392</span>            new Put(row).add(addCell).setDurability(Durability.SKIP_WAL),<a name="line.2392"></a>
-<span class="sourceLineNo">2393</span>            originalSize + addSize);<a name="line.2393"></a>
-<span class="sourceLineNo">2394</span><a name="line.2394"></a>
-<span class="sourceLineNo">2395</span>    // case 2:<a name="line.2395"></a>
-<span class="sourceLineNo">2396</span>    testDataInMemoryWithoutWAL(region,<a name="line.2396"></a>
-<span class="sourceLineNo">2397</span>            new Put(row).add(originalCell).setDurability(Durability.SKIP_WAL),<a name="line.2397"></a>
-<span class="sourceLineNo">2398</span>            new Put(row).add(addCell).setDurability(Durability.SYNC_WAL),<a name="line.2398"></a>
-<span class="sourceLineNo">2399</span>            originalSize + addSize);<a name="line.2399"></a>
-<span class="sourceLineNo">2400</span><a name="line.2400"></a>
-<span class="sourceLineNo">2401</span>    // case 3:<a name="line.2401"></a>
-<span class="sourceLineNo">2402</span>    testDataInMemoryWithoutWAL(region,<a name="line.2402"></a>
-<span class="sourceLineNo">2403</span>            new Put(row).add(originalCell).setDurability(Durability.SYNC_WAL),<a name="line.2403"></a>
-<span class="sourceLineNo">2404</span>            new Put(row).add(addCell).setDurability(Durability.SKIP_WAL),<a name="line.2404"></a>
-<span class="sourceLineNo">2405</span>            0);<a name="line.2405"></a>
-<span class="sourceLineNo">2406</span><a name="line.2406"></a>
-<span class="sourceLineNo">2407</span>    // case 4:<a name="line.2407"></a>
-<span class="sourceLineNo">2408</span>    testDataInMemoryWithoutWAL(region,<a name="line.2408"></a>
-<span class="sourceLineNo">2409</span>            new Put(row).add(originalCell).setDurability(Durability.SYNC_WAL),<a name="line.2409"></a>
-<span class="sourceLineNo">2410</span>            new Put(row).add(addCell).setDurability(Durability.SYNC_WAL),<a name="line.2410"></a>
-<span class="sourceLineNo">2411</span>            0);<a name="line.2411"></a>
-<span class="sourceLineNo">2412</span>  }<a name="line.2412"></a>
-<span class="sourceLineNo">2413</span><a name="line.2413"></a>
-<span class="sourceLineNo">2414</span>  private static void testDataInMemoryWithoutWAL(HRegion region, Put originalPut,<a name="line.2414"></a>
-<span class="sourceLineNo">2415</span>          final Put addPut, long delta) throws IOException {<a name="line.2415"></a>
-<span class="sourceLineNo">2416</span>    final long initSize = region.getDataInMemoryWithoutWAL();<a name="line.2416"></a>
-<span class="sourceLineNo">2417</span>    // save normalCPHost and replaced by mockedCPHost<a name="line.2417"></a>
-<span class="sourceLineNo">2418</span>    RegionCoprocessorHost normalCPHost = region.getCoprocessorHost();<a name="line.2418"></a>
-<span class="sourceLineNo">2419</span>    RegionCoprocessorHost mockedCPHost = Mockito.mock(RegionCoprocessorHost.class);<a name="line.2419"></a>
-<span class="sourceLineNo">2420</span>    // Because the preBatchMutate returns void, we can't do usual Mockito when...then form. Must<a name="line.2420"></a>
-<span class="sourceLineNo">2421</span>    // do below format (from Mockito doc).<a name="line.2421"></a>
-<span class="sourceLineNo">2422</span>    Mockito.doAnswer(new Answer&lt;Void&gt;() {<a name="line.2422"></a>
-<span class="sourceLineNo">2423</span>      @Override<a name="line.2423"></a>
-<span class="sourceLineNo">2424</span>      public Void answer(InvocationOnMock invocation) throws Throwable {<a name="line.2424"></a>
-<span class="sourceLineNo">2425</span>        MiniBatchOperationInProgress&lt;Mutation&gt; mb = invocation.getArgument(0);<a name="line.2425"></a>
-<span class="sourceLineNo">2426</span>        mb.addOperationsFromCP(0, new Mutation[]{addPut});<a name="line.2426"></a>
-<span class="sourceLineNo">2427</span>        return null;<a name="line.2427"></a>
-<span class="sourceLineNo">2428</span>      }<a name="line.2428"></a>
-<span class="sourceLineNo">2429</span>    }).when(mockedCPHost).preBatchMutate(Mockito.isA(MiniBatchOperationInProgress.class));<a name="line.2429"></a>
-<span class="sourceLineNo">2430</span>    region.setCoprocessorHost(mockedCPHost);<a name="line.2430"></a>
-<span class="sourceLineNo">2431</span>    region.put(originalPut);<a name="line.2431"></a>
-<span class="sourceLineNo">2432</span>    region.setCoprocessorHost(normalCPHost);<a name="line.2432"></a>
-<span class="sourceLineNo">2433</span>    final long finalSize = region.getDataInMemoryWithoutWAL();<a name="line.2433"></a>
-<span class="sourceLineNo">2434</span>    assertEquals("finalSize:" + finalSize + ", initSize:"<a name="line.2434"></a>
-<span class="sourceLineNo">2435</span>      + initSize + ", delta:" + delta,finalSize, initSize + delta);<a name="line.2435"></a>
-<span class="sourceLineNo">2436</span>  }<a name="line.2436"></a>
-<span class="sourceLineNo">2437</span><a name="line.2437"></a>
-<span class="sourceLineNo">2438</span>  @Test<a name="line.2438"></a>
-<span class="sourceLineNo">2439</span>  public void testDeleteColumns_PostInsert() throws IOException, InterruptedException {<a name="line.2439"></a>
-<span class="sourceLineNo">2440</span>    Delete delete = new Delete(row);<a name="line.2440"></a>
-<span class="sourceLineNo">2441</span>    delete.addColumns(fam1, qual1);<a name="line.2441"></a>
-<span class="sourceLineNo">2442</span>    doTestDelete_AndPostInsert(delete);<a name="line.2442"></a>
-<span class="sourceLineNo">2443</span>  }<a name="line.2443"></a>
-<span class="sourceLineNo">2444</span><a name="line.2444"></a>
-<span class="sourceLineNo">2445</span>  @Test<a name="line.2445"></a>
-<span class="sourceLineNo">2446</span>  public void testaddFamily_PostInsert() throws IOException, InterruptedException {<a name="line.2446"></a>
-<span class="sourceLineNo">2447</span>    Delete delete = new Delete(row);<a name="line.2447"></a>
-<span class="sourceLineNo">2448</span>    delete.addFamily(fam1);<a name="line.2448"></a>
-<span class="sourceLineNo">2449</span>    doTestDelete_AndPostInsert(delete);<a name="line.2449"></a>
-<span class="sourceLineNo">2450</span>  }<a name="line.2450"></a>
-<span class="sourceLineNo">2451</span><a name="line.2451"></a>
-<span class="sourceLineNo">2452</span>  public void doTestDelete_AndPostInsert(Delete delete) throws IOException, InterruptedException {<a name="line.2452"></a>
-<span class="sourceLineNo">2453</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2453"></a>
-<span class="sourceLineNo">2454</span>    EnvironmentEdgeManagerTestHelper.injectEdge(new IncrementingEnvironmentEdge());<a name="line.2454"></a>
-<span class="sourceLineNo">2455</span>    Put put = new Put(row);<a name="line.2455"></a>
-<span class="sourceLineNo">2456</span>    put.addColumn(fam1, qual1, value1);<a name="line.2456"></a>
-<span class="sourceLineNo">2457</span>    region.put(put);<a name="line.2457"></a>
-<span class="sourceLineNo">2458</span><a name="line.2458"></a>
-<span class="sourceLineNo">2459</span>    // now delete the value:<a name="line.2459"></a>
-<span class="sourceLineNo">2460</span>    region.delete(delete);<a name="line.2460"></a>
+<span class="sourceLineNo">2120</span>    delete.addColumn(fam1, qual);<a name="line.2120"></a>
+<span class="sourceLineNo">2121</span>    region.delete(delete);<a name="line.2121"></a>
+<span class="sourceLineNo">2122</span><a name="line.2122"></a>
+<span class="sourceLineNo">2123</span>    Get get = new Get(row1);<a name="line.2123"></a>
+<span class="sourceLineNo">2124</span>    get.addFamily(fam1);<a name="line.2124"></a>
+<span class="sourceLineNo">2125</span>    Result r = region.get(get);<a name="line.2125"></a>
+<span class="sourceLineNo">2126</span>    assertEquals(0, r.size());<a name="line.2126"></a>
+<span class="sourceLineNo">2127</span>  }<a name="line.2127"></a>
+<span class="sourceLineNo">2128</span><a name="line.2128"></a>
+<span class="sourceLineNo">2129</span>  @Test<a name="line.2129"></a>
+<span class="sourceLineNo">2130</span>  public void testDelete_CheckFamily() throws IOException {<a name="line.2130"></a>
+<span class="sourceLineNo">2131</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2131"></a>
+<span class="sourceLineNo">2132</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2132"></a>
+<span class="sourceLineNo">2133</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2133"></a>
+<span class="sourceLineNo">2134</span>    byte[] fam3 = Bytes.toBytes("fam3");<a name="line.2134"></a>
+<span class="sourceLineNo">2135</span>    byte[] fam4 = Bytes.toBytes("fam4");<a name="line.2135"></a>
+<span class="sourceLineNo">2136</span><a name="line.2136"></a>
+<span class="sourceLineNo">2137</span>    // Setting up region<a name="line.2137"></a>
+<span class="sourceLineNo">2138</span>    this.region = initHRegion(tableName, method, CONF, fam1, fam2, fam3);<a name="line.2138"></a>
+<span class="sourceLineNo">2139</span>    List&lt;Cell&gt; kvs = new ArrayList&lt;&gt;();<a name="line.2139"></a>
+<span class="sourceLineNo">2140</span>    kvs.add(new KeyValue(row1, fam4, null, null));<a name="line.2140"></a>
+<span class="sourceLineNo">2141</span><a name="line.2141"></a>
+<span class="sourceLineNo">2142</span>    // testing existing family<a name="line.2142"></a>
+<span class="sourceLineNo">2143</span>    byte[] family = fam2;<a name="line.2143"></a>
+<span class="sourceLineNo">2144</span>    NavigableMap&lt;byte[], List&lt;Cell&gt;&gt; deleteMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2144"></a>
+<span class="sourceLineNo">2145</span>    deleteMap.put(family, kvs);<a name="line.2145"></a>
+<span class="sourceLineNo">2146</span>    region.delete(deleteMap, Durability.SYNC_WAL);<a name="line.2146"></a>
+<span class="sourceLineNo">2147</span><a name="line.2147"></a>
+<span class="sourceLineNo">2148</span>    // testing non existing family<a name="line.2148"></a>
+<span class="sourceLineNo">2149</span>    boolean ok = false;<a name="line.2149"></a>
+<span class="sourceLineNo">2150</span>    family = fam4;<a name="line.2150"></a>
+<span class="sourceLineNo">2151</span>    try {<a name="line.2151"></a>
+<span class="sourceLineNo">2152</span>      deleteMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2152"></a>
+<span class="sourceLineNo">2153</span>      deleteMap.put(family, kvs);<a name="line.2153"></a>
+<span class="sourceLineNo">2154</span>      region.delete(deleteMap, Durability.SYNC_WAL);<a name="line.2154"></a>
+<span class="sourceLineNo">2155</span>    } catch (Exception e) {<a name="line.2155"></a>
+<span class="sourceLineNo">2156</span>      ok = true;<a name="line.2156"></a>
+<span class="sourceLineNo">2157</span>    }<a name="line.2157"></a>
+<span class="sourceLineNo">2158</span>    assertTrue("Family " + new String(family, StandardCharsets.UTF_8) + " does exist", ok);<a name="line.2158"></a>
+<span class="sourceLineNo">2159</span>  }<a name="line.2159"></a>
+<span class="sourceLineNo">2160</span><a name="line.2160"></a>
+<span class="sourceLineNo">2161</span>  @Test<a name="line.2161"></a>
+<span class="sourceLineNo">2162</span>  public void testDelete_mixed() throws IOException, InterruptedException {<a name="line.2162"></a>
+<span class="sourceLineNo">2163</span>    byte[] fam = Bytes.toBytes("info");<a name="line.2163"></a>
+<span class="sourceLineNo">2164</span>    byte[][] families = { fam };<a name="line.2164"></a>
+<span class="sourceLineNo">2165</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2165"></a>
+<span class="sourceLineNo">2166</span>    EnvironmentEdgeManagerTestHelper.injectEdge(new IncrementingEnvironmentEdge());<a name="line.2166"></a>
+<span class="sourceLineNo">2167</span><a name="line.2167"></a>
+<span class="sourceLineNo">2168</span>    byte[] row = Bytes.toBytes("table_name");<a name="line.2168"></a>
+<span class="sourceLineNo">2169</span>    // column names<a name="line.2169"></a>
+<span class="sourceLineNo">2170</span>    byte[] serverinfo = Bytes.toBytes("serverinfo");<a name="line.2170"></a>
+<span class="sourceLineNo">2171</span>    byte[] splitA = Bytes.toBytes("splitA");<a name="line.2171"></a>
+<span class="sourceLineNo">2172</span>    byte[] splitB = Bytes.toBytes("splitB");<a name="line.2172"></a>
+<span class="sourceLineNo">2173</span><a name="line.2173"></a>
+<span class="sourceLineNo">2174</span>    // add some data:<a name="line.2174"></a>
+<span class="sourceLineNo">2175</span>    Put put = new Put(row);<a name="line.2175"></a>
+<span class="sourceLineNo">2176</span>    put.addColumn(fam, splitA, Bytes.toBytes("reference_A"));<a name="line.2176"></a>
+<span class="sourceLineNo">2177</span>    region.put(put);<a name="line.2177"></a>
+<span class="sourceLineNo">2178</span><a name="line.2178"></a>
+<span class="sourceLineNo">2179</span>    put = new Put(row);<a name="line.2179"></a>
+<span class="sourceLineNo">2180</span>    put.addColumn(fam, splitB, Bytes.toBytes("reference_B"));<a name="line.2180"></a>
+<span class="sourceLineNo">2181</span>    region.put(put);<a name="line.2181"></a>
+<span class="sourceLineNo">2182</span><a name="line.2182"></a>
+<span class="sourceLineNo">2183</span>    put = new Put(row);<a name="line.2183"></a>
+<span class="sourceLineNo">2184</span>    put.addColumn(fam, serverinfo, Bytes.toBytes("ip_address"));<a name="line.2184"></a>
+<span class="sourceLineNo">2185</span>    region.put(put);<a name="line.2185"></a>
+<span class="sourceLineNo">2186</span><a name="line.2186"></a>
+<span class="sourceLineNo">2187</span>    // ok now delete a split:<a name="line.2187"></a>
+<span class="sourceLineNo">2188</span>    Delete delete = new Delete(row);<a name="line.2188"></a>
+<span class="sourceLineNo">2189</span>    delete.addColumns(fam, splitA);<a name="line.2189"></a>
+<span class="sourceLineNo">2190</span>    region.delete(delete);<a name="line.2190"></a>
+<span class="sourceLineNo">2191</span><a name="line.2191"></a>
+<span class="sourceLineNo">2192</span>    // assert some things:<a name="line.2192"></a>
+<span class="sourceLineNo">2193</span>    Get get = new Get(row).addColumn(fam, serverinfo);<a name="line.2193"></a>
+<span class="sourceLineNo">2194</span>    Result result = region.get(get);<a name="line.2194"></a>
+<span class="sourceLineNo">2195</span>    assertEquals(1, result.size());<a name="line.2195"></a>
+<span class="sourceLineNo">2196</span><a name="line.2196"></a>
+<span class="sourceLineNo">2197</span>    get = new Get(row).addColumn(fam, splitA);<a name="line.2197"></a>
+<span class="sourceLineNo">2198</span>    result = region.get(get);<a name="line.2198"></a>
+<span class="sourceLineNo">2199</span>    assertEquals(0, result.size());<a name="line.2199"></a>
+<span class="sourceLineNo">2200</span><a name="line.2200"></a>
+<span class="sourceLineNo">2201</span>    get = new Get(row).addColumn(fam, splitB);<a name="line.2201"></a>
+<span class="sourceLineNo">2202</span>    result = region.get(get);<a name="line.2202"></a>
+<span class="sourceLineNo">2203</span>    assertEquals(1, result.size());<a name="line.2203"></a>
+<span class="sourceLineNo">2204</span><a name="line.2204"></a>
+<span class="sourceLineNo">2205</span>    // Assert that after a delete, I can put.<a name="line.2205"></a>
+<span class="sourceLineNo">2206</span>    put = new Put(row);<a name="line.2206"></a>
+<span class="sourceLineNo">2207</span>    put.addColumn(fam, splitA, Bytes.toBytes("reference_A"));<a name="line.2207"></a>
+<span class="sourceLineNo">2208</span>    region.put(put);<a name="line.2208"></a>
+<span class="sourceLineNo">2209</span>    get = new Get(row);<a name="line.2209"></a>
+<span class="sourceLineNo">2210</span>    result = region.get(get);<a name="line.2210"></a>
+<span class="sourceLineNo">2211</span>    assertEquals(3, result.size());<a name="line.2211"></a>
+<span class="sourceLineNo">2212</span><a name="line.2212"></a>
+<span class="sourceLineNo">2213</span>    // Now delete all... then test I can add stuff back<a name="line.2213"></a>
+<span class="sourceLineNo">2214</span>    delete = new Delete(row);<a name="line.2214"></a>
+<span class="sourceLineNo">2215</span>    region.delete(delete);<a name="line.2215"></a>
+<span class="sourceLineNo">2216</span>    assertEquals(0, region.get(get).size());<a name="line.2216"></a>
+<span class="sourceLineNo">2217</span><a name="line.2217"></a>
+<span class="sourceLineNo">2218</span>    region.put(new Put(row).addColumn(fam, splitA, Bytes.toBytes("reference_A")));<a name="line.2218"></a>
+<span class="sourceLineNo">2219</span>    result = region.get(get);<a name="line.2219"></a>
+<span class="sourceLineNo">2220</span>    assertEquals(1, result.size());<a name="line.2220"></a>
+<span class="sourceLineNo">2221</span>  }<a name="line.2221"></a>
+<span class="sourceLineNo">2222</span><a name="line.2222"></a>
+<span class="sourceLineNo">2223</span>  @Test<a name="line.2223"></a>
+<span class="sourceLineNo">2224</span>  public void testDeleteRowWithFutureTs() throws IOException {<a name="line.2224"></a>
+<span class="sourceLineNo">2225</span>    byte[] fam = Bytes.toBytes("info");<a name="line.2225"></a>
+<span class="sourceLineNo">2226</span>    byte[][] families = { fam };<a name="line.2226"></a>
+<span class="sourceLineNo">2227</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2227"></a>
+<span class="sourceLineNo">2228</span>    byte[] row = Bytes.toBytes("table_name");<a name="line.2228"></a>
+<span class="sourceLineNo">2229</span>    // column names<a name="line.2229"></a>
+<span class="sourceLineNo">2230</span>    byte[] serverinfo = Bytes.toBytes("serverinfo");<a name="line.2230"></a>
+<span class="sourceLineNo">2231</span><a name="line.2231"></a>
+<span class="sourceLineNo">2232</span>    // add data in the far future<a name="line.2232"></a>
+<span class="sourceLineNo">2233</span>    Put put = new Put(row);<a name="line.2233"></a>
+<span class="sourceLineNo">2234</span>    put.addColumn(fam, serverinfo, HConstants.LATEST_TIMESTAMP - 5, Bytes.toBytes("value"));<a name="line.2234"></a>
+<span class="sourceLineNo">2235</span>    region.put(put);<a name="line.2235"></a>
+<span class="sourceLineNo">2236</span><a name="line.2236"></a>
+<span class="sourceLineNo">2237</span>    // now delete something in the present<a name="line.2237"></a>
+<span class="sourceLineNo">2238</span>    Delete delete = new Delete(row);<a name="line.2238"></a>
+<span class="sourceLineNo">2239</span>    region.delete(delete);<a name="line.2239"></a>
+<span class="sourceLineNo">2240</span><a name="line.2240"></a>
+<span class="sourceLineNo">2241</span>    // make sure we still see our data<a name="line.2241"></a>
+<span class="sourceLineNo">2242</span>    Get get = new Get(row).addColumn(fam, serverinfo);<a name="line.2242"></a>
+<span class="sourceLineNo">2243</span>    Result result = region.get(get);<a name="line.2243"></a>
+<span class="sourceLineNo">2244</span>    assertEquals(1, result.size());<a name="line.2244"></a>
+<span class="sourceLineNo">2245</span><a name="line.2245"></a>
+<span class="sourceLineNo">2246</span>    // delete the future row<a name="line.2246"></a>
+<span class="sourceLineNo">2247</span>    delete = new Delete(row, HConstants.LATEST_TIMESTAMP - 3);<a name="line.2247"></a>
+<span class="sourceLineNo">2248</span>    region.delete(delete);<a name="line.2248"></a>
+<span class="sourceLineNo">2249</span><a name="line.2249"></a>
+<span class="sourceLineNo">2250</span>    // make sure it is gone<a name="line.2250"></a>
+<span class="sourceLineNo">2251</span>    get = new Get(row).addColumn(fam, serverinfo);<a name="line.2251"></a>
+<span class="sourceLineNo">2252</span>    result = region.get(get);<a name="line.2252"></a>
+<span class="sourceLineNo">2253</span>    assertEquals(0, result.size());<a name="line.2253"></a>
+<span class="sourceLineNo">2254</span>  }<a name="line.2254"></a>
+<span class="sourceLineNo">2255</span><a name="line.2255"></a>
+<span class="sourceLineNo">2256</span>  /**<a name="line.2256"></a>
+<span class="sourceLineNo">2257</span>   * Tests that the special LATEST_TIMESTAMP option for puts gets replaced by<a name="line.2257"></a>
+<span class="sourceLineNo">2258</span>   * the actual timestamp<a name="line.2258"></a>
+<span class="sourceLineNo">2259</span>   */<a name="line.2259"></a>
+<span class="sourceLineNo">2260</span>  @Test<a name="line.2260"></a>
+<span class="sourceLineNo">2261</span>  public void testPutWithLatestTS() throws IOException {<a name="line.2261"></a>
+<span class="sourceLineNo">2262</span>    byte[] fam = Bytes.toBytes("info");<a name="line.2262"></a>
+<span class="sourceLineNo">2263</span>    byte[][] families = { fam };<a name="line.2263"></a>
+<span class="sourceLineNo">2264</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2264"></a>
+<span class="sourceLineNo">2265</span>    byte[] row = Bytes.toBytes("row1");<a name="line.2265"></a>
+<span class="sourceLineNo">2266</span>    // column names<a name="line.2266"></a>
+<span class="sourceLineNo">2267</span>    byte[] qual = Bytes.toBytes("qual");<a name="line.2267"></a>
+<span class="sourceLineNo">2268</span><a name="line.2268"></a>
+<span class="sourceLineNo">2269</span>    // add data with LATEST_TIMESTAMP, put without WAL<a name="line.2269"></a>
+<span class="sourceLineNo">2270</span>    Put put = new Put(row);<a name="line.2270"></a>
+<span class="sourceLineNo">2271</span>    put.addColumn(fam, qual, HConstants.LATEST_TIMESTAMP, Bytes.toBytes("value"));<a name="line.2271"></a>
+<span class="sourceLineNo">2272</span>    region.put(put);<a name="line.2272"></a>
+<span class="sourceLineNo">2273</span><a name="line.2273"></a>
+<span class="sourceLineNo">2274</span>    // Make sure it shows up with an actual timestamp<a name="line.2274"></a>
+<span class="sourceLineNo">2275</span>    Get get = new Get(row).addColumn(fam, qual);<a name="line.2275"></a>
+<span class="sourceLineNo">2276</span>    Result result = region.get(get);<a name="line.2276"></a>
+<span class="sourceLineNo">2277</span>    assertEquals(1, result.size());<a name="line.2277"></a>
+<span class="sourceLineNo">2278</span>    Cell kv = result.rawCells()[0];<a name="line.2278"></a>
+<span class="sourceLineNo">2279</span>    LOG.info("Got: " + kv);<a name="line.2279"></a>
+<span class="sourceLineNo">2280</span>    assertTrue("LATEST_TIMESTAMP was not replaced with real timestamp",<a name="line.2280"></a>
+<span class="sourceLineNo">2281</span>        kv.getTimestamp() != HConstants.LATEST_TIMESTAMP);<a name="line.2281"></a>
+<span class="sourceLineNo">2282</span><a name="line.2282"></a>
+<span class="sourceLineNo">2283</span>    // Check same with WAL enabled (historically these took different<a name="line.2283"></a>
+<span class="sourceLineNo">2284</span>    // code paths, so check both)<a name="line.2284"></a>
+<span class="sourceLineNo">2285</span>    row = Bytes.toBytes("row2");<a name="line.2285"></a>
+<span class="sourceLineNo">2286</span>    put = new Put(row);<a name="line.2286"></a>
+<span class="sourceLineNo">2287</span>    put.addColumn(fam, qual, HConstants.LATEST_TIMESTAMP, Bytes.toBytes("value"));<a name="line.2287"></a>
+<span class="sourceLineNo">2288</span>    region.put(put);<a name="line.2288"></a>
+<span class="sourceLineNo">2289</span><a name="line.2289"></a>
+<span class="sourceLineNo">2290</span>    // Make sure it shows up with an actual timestamp<a name="line.2290"></a>
+<span class="sourceLineNo">2291</span>    get = new Get(row).addColumn(fam, qual);<a name="line.2291"></a>
+<span class="sourceLineNo">2292</span>    result = region.get(get);<a name="line.2292"></a>
+<span class="sourceLineNo">2293</span>    assertEquals(1, result.size());<a name="line.2293"></a>
+<span class="sourceLineNo">2294</span>    kv = result.rawCells()[0];<a name="line.2294"></a>
+<span class="sourceLineNo">2295</span>    LOG.info("Got: " + kv);<a name="line.2295"></a>
+<span class="sourceLineNo">2296</span>    assertTrue("LATEST_TIMESTAMP was not replaced with real timestamp",<a name="line.2296"></a>
+<span class="sourceLineNo">2297</span>        kv.getTimestamp() != HConstants.LATEST_TIMESTAMP);<a name="line.2297"></a>
+<span class="sourceLineNo">2298</span>  }<a name="line.2298"></a>
+<span class="sourceLineNo">2299</span><a name="line.2299"></a>
+<span class="sourceLineNo">2300</span>  /**<a name="line.2300"></a>
+<span class="sourceLineNo">2301</span>   * Tests that there is server-side filtering for invalid timestamp upper<a name="line.2301"></a>
+<span class="sourceLineNo">2302</span>   * bound. Note that the timestamp lower bound is automatically handled for us<a name="line.2302"></a>
+<span class="sourceLineNo">2303</span>   * by the TTL field.<a name="line.2303"></a>
+<span class="sourceLineNo">2304</span>   */<a name="line.2304"></a>
+<span class="sourceLineNo">2305</span>  @Test<a name="line.2305"></a>
+<span class="sourceLineNo">2306</span>  public void testPutWithTsSlop() throws IOException {<a name="line.2306"></a>
+<span class="sourceLineNo">2307</span>    byte[] fam = Bytes.toBytes("info");<a name="line.2307"></a>
+<span class="sourceLineNo">2308</span>    byte[][] families = { fam };<a name="line.2308"></a>
+<span class="sourceLineNo">2309</span><a name="line.2309"></a>
+<span class="sourceLineNo">2310</span>    // add data with a timestamp that is too recent for range. Ensure assert<a name="line.2310"></a>
+<span class="sourceLineNo">2311</span>    CONF.setInt("hbase.hregion.keyvalue.timestamp.slop.millisecs", 1000);<a name="line.2311"></a>
+<span class="sourceLineNo">2312</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2312"></a>
+<span class="sourceLineNo">2313</span>    boolean caughtExcep = false;<a name="line.2313"></a>
+<span class="sourceLineNo">2314</span>    try {<a name="line.2314"></a>
+<span class="sourceLineNo">2315</span>      // no TS specified == use latest. should not error<a name="line.2315"></a>
+<span class="sourceLineNo">2316</span>      region.put(new Put(row).addColumn(fam, Bytes.toBytes("qual"), Bytes.toBytes("value")));<a name="line.2316"></a>
+<span class="sourceLineNo">2317</span>      // TS out of range. should error<a name="line.2317"></a>
+<span class="sourceLineNo">2318</span>      region.put(new Put(row).addColumn(fam, Bytes.toBytes("qual"),<a name="line.2318"></a>
+<span class="sourceLineNo">2319</span>          System.currentTimeMillis() + 2000, Bytes.toBytes("value")));<a name="line.2319"></a>
+<span class="sourceLineNo">2320</span>      fail("Expected IOE for TS out of configured timerange");<a name="line.2320"></a>
+<span class="sourceLineNo">2321</span>    } catch (FailedSanityCheckException ioe) {<a name="line.2321"></a>
+<span class="sourceLineNo">2322</span>      LOG.debug("Received expected exception", ioe);<a name="line.2322"></a>
+<span class="sourceLineNo">2323</span>      caughtExcep = true;<a name="line.2323"></a>
+<span class="sourceLineNo">2324</span>    }<a name="line.2324"></a>
+<span class="sourceLineNo">2325</span>    assertTrue("Should catch FailedSanityCheckException", caughtExcep);<a name="line.2325"></a>
+<span class="sourceLineNo">2326</span>  }<a name="line.2326"></a>
+<span class="sourceLineNo">2327</span><a name="line.2327"></a>
+<span class="sourceLineNo">2328</span>  @Test<a name="line.2328"></a>
+<span class="sourceLineNo">2329</span>  public void testScanner_DeleteOneFamilyNotAnother() throws IOException {<a name="line.2329"></a>
+<span class="sourceLineNo">2330</span>    byte[] fam1 = Bytes.toBytes("columnA");<a name="line.2330"></a>
+<span class="sourceLineNo">2331</span>    byte[] fam2 = Bytes.toBytes("columnB");<a name="line.2331"></a>
+<span class="sourceLineNo">2332</span>    this.region = initHRegion(tableName, method, CONF, fam1, fam2);<a name="line.2332"></a>
+<span class="sourceLineNo">2333</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.2333"></a>
+<span class="sourceLineNo">2334</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.2334"></a>
+<span class="sourceLineNo">2335</span><a name="line.2335"></a>
+<span class="sourceLineNo">2336</span>    byte[] value = Bytes.toBytes("value");<a name="line.2336"></a>
+<span class="sourceLineNo">2337</span><a name="line.2337"></a>
+<span class="sourceLineNo">2338</span>    Delete delete = new Delete(rowA);<a name="line.2338"></a>
+<span class="sourceLineNo">2339</span>    delete.addFamily(fam1);<a name="line.2339"></a>
+<span class="sourceLineNo">2340</span><a name="line.2340"></a>
+<span class="sourceLineNo">2341</span>    region.delete(delete);<a name="line.2341"></a>
+<span class="sourceLineNo">2342</span><a name="line.2342"></a>
+<span class="sourceLineNo">2343</span>    // now create data.<a name="line.2343"></a>
+<span class="sourceLineNo">2344</span>    Put put = new Put(rowA);<a name="line.2344"></a>
+<span class="sourceLineNo">2345</span>    put.addColumn(fam2, null, value);<a name="line.2345"></a>
+<span class="sourceLineNo">2346</span>    region.put(put);<a name="line.2346"></a>
+<span class="sourceLineNo">2347</span><a name="line.2347"></a>
+<span class="sourceLineNo">2348</span>    put = new Put(rowB);<a name="line.2348"></a>
+<span class="sourceLineNo">2349</span>    put.addColumn(fam1, null, value);<a name="line.2349"></a>
+<span class="sourceLineNo">2350</span>    put.addColumn(fam2, null, value);<a name="line.2350"></a>
+<span class="sourceLineNo">2351</span>    region.put(put);<a name="line.2351"></a>
+<span class="sourceLineNo">2352</span><a name="line.2352"></a>
+<span class="sourceLineNo">2353</span>    Scan scan = new Scan();<a name="line.2353"></a>
+<span class="sourceLineNo">2354</span>    scan.addFamily(fam1).addFamily(fam2);<a name="line.2354"></a>
+<span class="sourceLineNo">2355</span>    InternalScanner s = region.getScanner(scan);<a name="line.2355"></a>
+<span class="sourceLineNo">2356</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.2356"></a>
+<span class="sourceLineNo">2357</span>    s.next(results);<a name="line.2357"></a>
+<span class="sourceLineNo">2358</span>    assertTrue(CellUtil.matchingRows(results.get(0), rowA));<a name="line.2358"></a>
+<span class="sourceLineNo">2359</span><a name="line.2359"></a>
+<span class="sourceLineNo">2360</span>    results.clear();<a name="line.2360"></a>
+<span class="sourceLineNo">2361</span>    s.next(results);<a name="line.2361"></a>
+<span class="sourceLineNo">2362</span>    assertTrue(CellUtil.matchingRows(results.get(0), rowB));<a name="line.2362"></a>
+<span class="sourceLineNo">2363</span>  }<a name="line.2363"></a>
+<span class="sourceLineNo">2364</span><a name="line.2364"></a>
+<span class="sourceLineNo">2365</span>  @Test<a name="line.2365"></a>
+<span class="sourceLineNo">2366</span>  public void testDataInMemoryWithoutWAL() throws IOException {<a name="line.2366"></a>
+<span class="sourceLineNo">2367</span>    FileSystem fs = FileSystem.get(CONF);<a name="line.2367"></a>
+<span class="sourceLineNo">2368</span>    Path rootDir = new Path(dir + "testDataInMemoryWithoutWAL");<a name="line.2368"></a>
+<span class="sourceLineNo">2369</span>    FSHLog hLog = new FSHLog(fs, rootDir, "testDataInMemoryWithoutWAL", CONF);<a name="line.2369"></a>
+<span class="sourceLineNo">2370</span>    hLog.init();<a name="line.2370"></a>
+<span class="sourceLineNo">2371</span>    // This chunk creation is done throughout the code base. Do we want to move it into core?<a name="line.2371"></a>
+<span class="sourceLineNo">2372</span>    // It is missing from this test. W/o it we NPE.<a name="line.2372"></a>
+<span class="sourceLineNo">2373</span>    ChunkCreator.initialize(MemStoreLABImpl.CHUNK_SIZE_DEFAULT, false, 0, 0, 0, null);<a name="line.2373"></a>
+<span class="sourceLineNo">2374</span>    region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, hLog,<a name="line.2374"></a>
+<span class="sourceLineNo">2375</span>        COLUMN_FAMILY_BYTES);<a name="line.2375"></a>
+<span class="sourceLineNo">2376</span><a name="line.2376"></a>
+<span class="sourceLineNo">2377</span>    Cell originalCell = CellUtil.createCell(row, COLUMN_FAMILY_BYTES, qual1,<a name="line.2377"></a>
+<span class="sourceLineNo">2378</span>      System.currentTimeMillis(), KeyValue.Type.Put.getCode(), value1);<a name="line.2378"></a>
+<span class="sourceLineNo">2379</span>    final long originalSize = originalCell.getSerializedSize();<a name="line.2379"></a>
+<span class="sourceLineNo">2380</span><a name="line.2380"></a>
+<span class="sourceLineNo">2381</span>    Cell addCell = CellUtil.createCell(row, COLUMN_FAMILY_BYTES, qual1,<a name="line.2381"></a>
+<span class="sourceLineNo">2382</span>      System.currentTimeMillis(), KeyValue.Type.Put.getCode(), Bytes.toBytes("xxxxxxxxxx"));<a name="line.2382"></a>
+<span class="sourceLineNo">2383</span>    final long addSize = addCell.getSerializedSize();<a name="line.2383"></a>
+<span class="sourceLineNo">2384</span><a name="line.2384"></a>
+<span class="sourceLineNo">2385</span>    LOG.info("originalSize:" + originalSize<a name="line.2385"></a>
+<span class="sourceLineNo">2386</span>      + ", addSize:" + addSize);<a name="line.2386"></a>
+<span class="sourceLineNo">2387</span>    // start test. We expect that the addPut's durability will be replaced<a name="line.2387"></a>
+<span class="sourceLineNo">2388</span>    // by originalPut's durability.<a name="line.2388"></a>
+<span class="sourceLineNo">2389</span><a name="line.2389"></a>
+<span class="sourceLineNo">2390</span>    // case 1:<a name="line.2390"></a>
+<span class="sourceLineNo">2391</span>    testDataInMemoryWithoutWAL(region,<a name="line.2391"></a>
+<span class="sourceLineNo">2392</span>            new Put(row).add(originalCell).setDurability(Durability.SKIP_WAL),<a name="line.2392"></a>
+<span class="sourceLineNo">2393</span>            new Put(row).add(addCell).setDurability(Durability.SKIP_WAL),<a name="line.2393"></a>
+<span class="sourceLineNo">2394</span>            originalSize + addSize);<a name="line.2394"></a>
+<span class="sourceLineNo">2395</span><a name="line.2395"></a>
+<span class="sourceLineNo">2396</span>    // case 2:<a name="line.2396"></a>
+<span class="sourceLineNo">2397</span>    testDataInMemoryWithoutWAL(region,<a name="line.2397"></a>
+<span class="sourceLineNo">2398</span>            new Put(row).add(originalCell).setDurability(Durability.SKIP_WAL),<a name="line.2398"></a>
+<span class="sourceLineNo">2399</span>            new Put(row).add(addCell).setDurability(Durability.SYNC_WAL),<a name="line.2399"></a>
+<span class="sourceLineNo">2400</span>            originalSize + addSize);<a name="line.2400"></a>
+<span class="sourceLineNo">2401</span><a name="line.2401"></a>
+<span class="sourceLineNo">2402</span>    // case 3:<a name="line.2402"></a>
+<span class="sourceLineNo">2403</span>    testDataInMemoryWithoutWAL(region,<a name="line.2403"></a>
+<span class="sourceLineNo">2404</span>            new Put(row).add(originalCell).setDurability(Durability.SYNC_WAL),<a name="line.2404"></a>
+<span class="sourceLineNo">2405</span>            new Put(row).add(addCell).setDurability(Durability.SKIP_WAL),<a name="line.2405"></a>
+<span class="sourceLineNo">2406</span>            0);<a name="line.2406"></a>
+<span class="sourceLineNo">2407</span><a name="line.2407"></a>
+<span class="sourceLineNo">2408</span>    // case 4:<a name="line.2408"></a>
+<span class="sourceLineNo">2409</span>    testDataInMemoryWithoutWAL(region,<a name="line.2409"></a>
+<span class="sourceLineNo">2410</span>            new Put(row).add(originalCell).setDurability(Durability.SYNC_WAL),<a name="line.2410"></a>
+<span class="sourceLineNo">2411</span>            new Put(row).add(addCell).setDurability(Durability.SYNC_WAL),<a name="line.2411"></a>
+<span class="sourceLineNo">2412</span>            0);<a name="line.2412"></a>
+<span class="sourceLineNo">2413</span>  }<a name="line.2413"></a>
+<span class="sourceLineNo">2414</span><a name="line.2414"></a>
+<span class="sourceLineNo">2415</span>  private static void testDataInMemoryWithoutWAL(HRegion region, Put originalPut,<a name="line.2415"></a>
+<span class="sourceLineNo">2416</span>          final Put addPut, long delta) throws IOException {<a name="line.2416"></a>
+<span class="sourceLineNo">2417</span>    final long initSize = region.getDataInMemoryWithoutWAL();<a name="line.2417"></a>
+<span class="sourceLineNo">2418</span>    // save normalCPHost and replaced by mockedCPHost<a name="line.2418"></a>
+<span class="sourceLineNo">2419</span>    RegionCoprocessorHost normalCPHost = region.getCoprocessorHost();<a name="line.2419"></a>
+<span class="sourceLineNo">2420</span>    RegionCoprocessorHost mockedCPHost = Mockito.mock(RegionCoprocessorHost.class);<a name="line.2420"></a>
+<span class="sourceLineNo">2421</span>    // Because the preBatchMutate returns void, we can't do usual Mockito when...then form. Must<a name="line.2421"></a>
+<span class="sourceLineNo">2422</span>    // do below format (from Mockito doc).<a name="line.2422"></a>
+<span class="sourceLineNo">2423</span>    Mockito.doAnswer(new Answer&lt;Void&gt;() {<a name="line.2423"></a>
+<span class="sourceLineNo">2424</span>      @Override<a name="line.2424"></a>
+<span class="sourceLineNo">2425</span>      public Void answer(InvocationOnMock invocation) throws Throwable {<a name="line.2425"></a>
+<span class="sourceLineNo">2426</span>        MiniBatchOperationInProgress&lt;Mutation&gt; mb = invocation.getArgument(0);<a name="line.2426"></a>
+<span class="sourceLineNo">2427</span>        mb.addOperationsFromCP(0, new Mutation[]{addPut});<a name="line.2427"></a>
+<span class="sourceLineNo">2428</span>        return null;<a name="line.2428"></a>
+<span class="sourceLineNo">2429</span>      }<a name="line.2429"></a>
+<span class="sourceLineNo">2430</span>    }).when(mockedCPHost).preBatchMutate(Mockito.isA(MiniBatchOperationInProgress.class));<a name="line.2430"></a>
+<span class="sourceLineNo">2431</span>    ColumnFamilyDescriptorBuilder builder = ColumnFamilyDescriptorBuilder.<a name="line.2431"></a>
+<span class="sourceLineNo">2432</span>        newBuilder(COLUMN_FAMILY_BYTES);<a name="line.2432"></a>
+<span class="sourceLineNo">2433</span>    ScanInfo info = new ScanInfo(CONF, builder.build(), Long.MAX_VALUE,<a name="line.2433"></a>
+<span class="sourceLineNo">2434</span>        Long.MAX_VALUE, region.getCellComparator());<a name="line.2434"></a>
+<span class="sourceLineNo">2435</span>    Mockito.when(mockedCPHost.preFlushScannerOpen(Mockito.any(HStore.class),<a name="line.2435"></a>
+<span class="sourceLineNo">2436</span>        Mockito.any())).thenReturn(info);<a name="line.2436"></a>
+<span class="sourceLineNo">2437</span>    Mockito.when(mockedCPHost.preFlush(Mockito.any(), Mockito.any(StoreScanner.class),<a name="line.2437"></a>
+<span class="sourceLineNo">2438</span>        Mockito.any())).thenAnswer(i -&gt; i.getArgument(1));<a name="line.2438"></a>
+<span class="sourceLineNo">2439</span>    region.setCoprocessorHost(mockedCPHost);<a name="line.2439"></a>
+<span class="sourceLineNo">2440</span><a name="line.2440"></a>
+<span class="sourceLineNo">2441</span>    region.put(originalPut);<a name="line.2441"></a>
+<span class="sourceLineNo">2442</span>    region.setCoprocessorHost(normalCPHost);<a name="line.2442"></a>
+<span class="sourceLineNo">2443</span>    final long finalSize = region.getDataInMemoryWithoutWAL();<a name="line.2443"></a>
+<span class="sourceLineNo">2444</span>    assertEquals("finalSize:" + finalSize + ", initSize:"<a name="line.2444"></a>
+<span class="sourceLineNo">2445</span>      + initSize + ", delta:" + delta,finalSize, initSize + delta);<a name="line.2445"></a>
+<span class="sourceLineNo">2446</span>  }<a name="line.2446"></a>
+<span class="sourceLineNo">2447</span><a name="line.2447"></a>
+<span class="sourceLineNo">2448</span>  @Test<a name="line.2448"></a>
+<span class="sourceLineNo">2449</span>  public void testDeleteColumns_PostInsert() throws IOException, InterruptedException {<a name="line.2449"></a>
+<span class="sourceLineNo">2450</span>    Delete delete = new Delete(row);<a name="line.2450"></a>
+<span class="sourceLineNo">2451</span>    delete.addColumns(fam1, qual1);<a name="line.2451"></a>
+<span class="sourceLineNo">2452</span>    doTestDelete_AndPostInsert(delete);<a name="line.2452"></a>
+<span class="sourceLineNo">2453</span>  }<a name="line.2453"></a>
+<span class="sourceLineNo">2454</span><a name="line.2454"></a>
+<span class="sourceLineNo">2455</span>  @Test<a name="line.2455"></a>
+<span class="sourceLineNo">2456</span>  public void testaddFamily_PostInsert() throws IOException, InterruptedException {<a name="line.2456"></a>
+<span class="sourceLineNo">2457</span>    Delete delete = new Delete(row);<a name="line.2457"></a>
+<span class="sourceLineNo">2458</span>    delete.addFamily(fam1);<a name="line.2458"></a>
+<span class="sourceLineNo">2459</span>    doTestDelete_AndPostInsert(delete);<a name="line.2459"></a>
+<span class="sourceLineNo">2460</span>  }<a name="line.2460"></a>
 <span class="sourceLineNo">2461</span><a name="line.2461"></a>
-<span class="sourceLineNo">2462</span>    // ok put data:<a name="line.2462"></a>
-<span class="sourceLineNo">2463</span>    put = new Put(row);<a name="line.2463"></a>
-<span class="sourceLineNo">2464</span>    put.addColumn(fam1, qual1, value2);<a name="line.2464"></a>
-<span class="sourceLineNo">2465</span>    region.put(put);<a name="line.2465"></a>
-<span class="sourceLineNo">2466</span><a name="line.2466"></a>
-<span class="sourceLineNo">2467</span>    // ok get:<a name="line.2467"></a>
-<span class="sourceLineNo">2468</span>    Get get = new Get(row);<a name="line.2468"></a>
-<span class="sourceLineNo">2469</span>    get.addColumn(fam1, qual1);<a name="line.2469"></a>
-<span class="sourceLineNo">2470</span><a name="line.2470"></a>
-<span class="sourceLineNo">2471</span>    Result r = region.get(get);<a name="line.2471"></a>
-<span class="sourceLineNo">2472</span>    assertEquals(1, r.size());<a name="line.2472"></a>
-<span class="sourceLineNo">2473</span>    assertArrayEquals(value2, r.getValue(fam1, qual1));<a name="line.2473"></a>
-<span class="sourceLineNo">2474</span><a name="line.2474"></a>
-<span class="sourceLineNo">2475</span>    // next:<a name="line.2475"></a>
-<span class="sourceLineNo">2476</span>    Scan scan = new Scan(row);<a name="line.2476"></a>
-<span class="sourceLineNo">2477</span>    scan.addColumn(fam1, qual1);<a name="line.2477"></a>
-<span class="sourceLineNo">2478</span>    InternalScanner s = region.getScanner(scan);<a name="line.2478"></a>
-<span class="sourceLineNo">2479</span><a name="line.2479"></a>
-<span class="sourceLineNo">2480</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.2480"></a>
-<span class="sourceLineNo">2481</span>    assertEquals(false, s.next(results));<a name="line.2481"></a>
-<span class="sourceLineNo">2482</span>    assertEquals(1, results.size());<a name="line.2482"></a>
-<span class="sourceLineNo">2483</span>    Cell kv = results.get(0);<a name="line.2483"></a>
+<span class="sourceLineNo">2462</span>  public void doTestDelete_AndPostInsert(Delete delete) throws IOException, InterruptedException {<a name="line.2462"></a>
+<span class="sourceLineNo">2463</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2463"></a>
+<span class="sourceLineNo">2464</span>    EnvironmentEdgeManagerTestHelper.injectEdge(new IncrementingEnvironmentEdge());<a name="line.2464"></a>
+<span class="sourceLineNo">2465</span>    Put put = new Put(row);<a name="line.2465"></a>
+<span class="sourceLineNo">2466</span>    put.addColumn(fam1, qual1, value1);<a name="line.2466"></a>
+<span class="sourceLineNo">2467</span>    region.put(put);<a name="line.2467"></a>
+<span class="sourceLineNo">2468</span><a name="line.2468"></a>
+<span class="sourceLineNo">2469</span>    // now delete the value:<a name="line.2469"></a>
+<span class="sourceLineNo">2470</span>    region.delete(delete);<a name="line.2470"></a>
+<span class="sourceLineNo">2471</span><a name="line.2471"></a>
+<span class="sourceLineNo">2472</span>    // ok put data:<a name="line.2472"></a>
+<span class="sourceLineNo">2473</span>    put = new Put(row);<a name="line.2473"></a>
+<span class="sourceLineNo">2474</span>    put.addColumn(fam1, qual1, value2);<a name="line.2474"></a>
+<span class="sourceLineNo">2475</span>    region.put(put);<a name="line.2475"></a>
+<span class="sourceLineNo">2476</span><a name="line.2476"></a>
+<span class="sourceLineNo">2477</span>    // ok get:<a name="line.2477"></a>
+<span class="sourceLineNo">2478</span>    Get get = new Get(row);<a name="line.2478"></a>
+<span class="sourceLineNo">2479</span>    get.addColumn(fam1, qual1);<a name="line.2479"></a>
+<span class="sourceLineNo">2480</span><a name="line.2480"></a>
+<span class="sourceLineNo">2481</span>    Result r = region.get(get);<a name="line.2481"></a>
+<span class="sourceLineNo">2482</span>    assertEquals(1, r.size());<a name="line.2482"></a>
+<span class="sourceLineNo">2483</span>    assertArrayEquals(value2, r.getValue(fam1, qual1));<a name="line.2483"></a>
 <span class="sourceLineNo">2484</span><a name="line.2484"></a>
-<span class="sourceLineNo">2485</span>    assertArrayEquals(value2, CellUtil.cloneValue(kv));<a name="line.2485"></a>
-<span class="sourceLineNo">2486</span>    assertArrayEquals(fam1, CellUtil.cloneFamily(kv));<a name="line.2486"></a>
-<span class="sourceLineNo">2487</span>    assertArrayEquals(qual1, CellUtil.cloneQualifier(kv));<a name="line.2487"></a>
-<span class="sourceLineNo">2488</span>    assertArrayEquals(row, CellUtil.cloneRow(kv));<a name="line.2488"></a>
-<span class="sourceLineNo">2489</span>  }<a name="line.2489"></a>
-<span class="sourceLineNo">2490</span><a name="line.2490"></a>
-<span class="sourceLineNo">2491</span>  @Test<a name="line.2491"></a>
-<span class="sourceLineNo">2492</span>  public void testDelete_CheckTimestampUpdated() throws IOException {<a name="line.2492"></a>
-<span class="sourceLineNo">2493</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2493"></a>
-<span class="sourceLineNo">2494</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.2494"></a>
-<span class="sourceLineNo">2495</span>    byte[] col2 = Bytes.toBytes("col2");<a name="line.2495"></a>
-<span class="sourceLineNo">2496</span>    byte[] col3 = Bytes.toBytes("col3");<a name="line.2496"></a>
-<span class="sourceLineNo">2497</span><a name="line.2497"></a>
-<span class="sourceLineNo">2498</span>    // Setting up region<a name="line.2498"></a>
-<span class="sourceLineNo">2499</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2499"></a>
-<span class="sourceLineNo">2500</span>    // Building checkerList<a name="line.2500"></a>
-<span class="sourceLineNo">2501</span>    List&lt;Cell&gt; kvs = new ArrayList&lt;&gt;();<a name="line.2501"></a>
-<span class="sourceLineNo">2502</span>    kvs.add(new KeyValue(row1, fam1, col1, null));<a name="line.2502"></a>
-<span class="sourceLineNo">2503</span>    kvs.add(new KeyValue(row1, fam1, col2, null));<a name="line.2503"></a>
-<span class="sourceLineNo">2504</span>    kvs.add(new KeyValue(row1, fam1, col3, null));<a name="line.2504"></a>
-<span class="sourceLineNo">2505</span><a name="line.2505"></a>
-<span class="sourceLineNo">2506</span>    NavigableMap&lt;byte[], List&lt;Cell&gt;&gt; deleteMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2506"></a>
-<span class="sourceLineNo">2507</span>    deleteMap.put(fam1, kvs);<a name="line.2507"></a>
-<span class="sourceLineNo">2508</span>    region.delete(deleteMap, Durability.SYNC_WAL);<a name="line.2508"></a>
-<span class="sourceLineNo">2509</span><a name="line.2509"></a>
-<span class="sourceLineNo">2510</span>    // extract the key values out the memstore:<a name="line.2510"></a>
-<span class="sourceLineNo">2511</span>    // This is kinda hacky, but better than nothing...<a name="line.2511"></a>
-<span class="sourceLineNo">2512</span>    long now = System.currentTimeMillis();<a name="line.2512"></a>
-<span class="sourceLineNo">2513</span>    AbstractMemStore memstore = (AbstractMemStore)region.getStore(fam1).memstore;<a name="line.2513"></a>
-<span class="sourceLineNo">2514</span>    Cell firstCell = memstore.getActive().first();<a name="line.2514"></a>
-<span class="sourceLineNo">2515</span>    assertTrue(firstCell.getTimestamp() &lt;= now);<a name="line.2515"></a>
-<span class="sourceLineNo">2516</span>    now = firstCell.getTimestamp();<a name="line.2516"></a>
-<span class="sourceLineNo">2517</span>    for (Cell cell : memstore.getActive().getCellSet()) {<a name="line.2517"></a>
-<span class="sourceLineNo">2518</span>      assertTrue(cell.getTimestamp() &lt;= now);<a name="line.2518"></a>
-<span class="sourceLineNo">2519</span>      now = cell.getTimestamp();<a name="line.2519"></a>
-<span class="sourceLineNo">2520</span>    }<a name="line.2520"></a>
-<span class="sourceLineNo">2521</span>  }<a name="line.2521"></a>
-<span class="sourceLineNo">2522</span><a name="line.2522"></a>
-<span class="sourceLineNo">2523</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2523"></a>
-<span class="sourceLineNo">2524</span>  // Get tests<a name="line.2524"></a>
-<span class="sourceLineNo">2525</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2525"></a>
-<span class="sourceLineNo">2526</span>  @Test<a name="line.2526"></a>
-<span class="sourceLineNo">2527</span>  public void testGet_FamilyChecker() throws IOException {<a name="line.2527"></a>
-<span class="sourceLineNo">2528</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2528"></a>
-<span class="sourceLineNo">2529</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2529"></a>
-<span class="sourceLineNo">2530</span>    byte[] fam2 = Bytes.toBytes("False");<a name="line.2530"></a>
-<span class="sourceLineNo">2531</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.2531"></a>
+<span class="sourceLineNo">2485</span>    // next:<a name="line.2485"></a>
+<span class="sourceLineNo">2486</span>    Scan scan = new Scan(row);<a name="line.2486"></a>
+<span class="sourceLineNo">2487</span>    scan.addColumn(fam1, qual1);<a name="line.2487"></a>
+<span class="sourceLineNo">2488</span>    InternalScanner s = region.getScanner(scan);<a name="line.2488"></a>
+<span class="sourceLineNo">2489</span><a name="line.2489"></a>
+<span class="sourceLineNo">2490</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.2490"></a>
+<span class="sourceLineNo">2491</span>    assertEquals(false, s.next(results));<a name="line.2491"></a>
+<span class="sourceLineNo">2492</span>    assertEquals(1, results.size());<a name="line.2492"></a>
+<span class="sourceLineNo">2493</span>    Cell kv = results.get(0);<a name="line.2493"></a>
+<span class="sourceLineNo">2494</span><a name="line.2494"></a>
+<span class="sourceLineNo">2495</span>    assertArrayEquals(value2, CellUtil.cloneValue(kv));<a name="line.2495"></a>
+<span class="sourceLineNo">2496</span>    assertArrayEquals(fam1, CellUtil.cloneFamily(kv));<a name="line.2496"></a>
+<span class="sourceLineNo">2497</span>    assertArrayEquals(qual1, CellUtil.cloneQualifier(kv));<a name="line.2497"></a>
+<span class="sourceLineNo">2498</span>    assertArrayEquals(row, CellUtil.cloneRow(kv));<a name="line.2498"></a>
+<span class="sourceLineNo">2499</span>  }<a name="line.2499"></a>
+<span class="sourceLineNo">2500</span><a name="line.2500"></a>
+<span class="sourceLineNo">2501</span>  @Test<a name="line.2501"></a>
+<span class="sourceLineNo">2502</span>  public void testDelete_CheckTimestampUpdated() throws IOException {<a name="line.2502"></a>
+<span class="sourceLineNo">2503</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2503"></a>
+<span class="sourceLineNo">2504</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.2504"></a>
+<span class="sourceLineNo">2505</span>    byte[] col2 = Bytes.toBytes("col2");<a name="line.2505"></a>
+<span class="sourceLineNo">2506</span>    byte[] col3 = Bytes.toBytes("col3");<a name="line.2506"></a>
+<span class="sourceLineNo">2507</span><a name="line.2507"></a>
+<span class="sourceLineNo">2508</span>    // Setting up region<a name="line.2508"></a>
+<span class="sourceLineNo">2509</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2509"></a>
+<span class="sourceLineNo">2510</span>    // Building checkerList<a name="line.2510"></a>
+<span class="sourceLineNo">2511</span>    List&lt;Cell&gt; kvs = new ArrayList&lt;&gt;();<a name="line.2511"></a>
+<span class="sourceLineNo">2512</span>    kvs.add(new KeyValue(row1, fam1, col1, null));<a name="line.2512"></a>
+<span class="sourceLineNo">2513</span>    kvs.add(new KeyValue(row1, fam1, col2, null));<a name="line.2513"></a>
+<span class="sourceLineNo">2514</span>    kvs.add(new KeyValue(row1, fam1, col3, null));<a name="line.2514"></a>
+<span class="sourceLineNo">2515</span><a name="line.2515"></a>
+<span class="sourceLineNo">2516</span>    NavigableMap&lt;byte[], List&lt;Cell&gt;&gt; deleteMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2516"></a>
+<span class="sourceLineNo">2517</span>    deleteMap.put(fam1, kvs);<a name="line.2517"></a>
+<span class="sourceLineNo">2518</span>    region.delete(deleteMap, Durability.SYNC_WAL);<a name="line.2518"></a>
+<span class="sourceLineNo">2519</span><a name="line.2519"></a>
+<span class="sourceLineNo">2520</span>    // extract the key values out the memstore:<a name="line.2520"></a>
+<span class="sourceLineNo">2521</span>    // This is kinda hacky, but better than nothing...<a name="line.2521"></a>
+<span class="sourceLineNo">2522</span>    long now = System.currentTimeMillis();<a name="line.2522"></a>
+<span class="sourceLineNo">2523</span>    AbstractMemStore memstore = (AbstractMemStore)region.getStore(fam1).memstore;<a name="line.2523"></a>
+<span class="sourceLineNo">2524</span>    Cell firstCell = memstore.getActive().first();<a name="line.2524"></a>
+<span class="sourceLineNo">2525</span>    assertTrue(firstCell.getTimestamp() &lt;= now);<a name="line.2525"></a>
+<span class="sourceLineNo">2526</span>    now = firstCell.getTimestamp();<a name="line.2526"></a>
+<span class="sourceLineNo">2527</span>    for (Cell cell : memstore.getActive().getCellSet()) {<a name="line.2527"></a>
+<span class="sourceLineNo">2528</span>      assertTrue(cell.getTimestamp() &lt;= now);<a name="line.2528"></a>
+<span class="sourceLineNo">2529</span>      now = cell.getTimestamp();<a name="line.2529"></a>
+<span class="sourceLineNo">2530</span>    }<a name="line.2530"></a>
+<span class="sourceLineNo">2531</span>  }<a name="line.2531"></a>
 <span class="sourceLineNo">2532</span><a name="line.2532"></a>
-<span class="sourceLineNo">2533</span>    // Setting up region<a name="line.2533"></a>
-<span class="sourceLineNo">2534</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2534"></a>
-<span class="sourceLineNo">2535</span>    Get get = new Get(row1);<a name="line.2535"></a>
-<span class="sourceLineNo">2536</span>    get.addColumn(fam2, col1);<a name="line.2536"></a>
-<span class="sourceLineNo">2537</span><a name="line.2537"></a>
-<span class="sourceLineNo">2538</span>    // Test<a name="line.2538"></a>
-<span class="sourceLineNo">2539</span>    try {<a name="line.2539"></a>
-<span class="sourceLineNo">2540</span>      region.get(get);<a name="line.2540"></a>
-<span class="sourceLineNo">2541</span>      fail("Expecting DoNotRetryIOException in get but did not get any");<a name="line.2541"></a>
-<span class="sourceLineNo">2542</span>    } catch (org.apache.hadoop.hbase.DoNotRetryIOException e) {<a name="line.2542"></a>
-<span class="sourceLineNo">2543</span>      LOG.info("Got expected DoNotRetryIOException successfully");<a name="line.2543"></a>
-<span class="sourceLineNo">2544</span>    }<a name="line.2544"></a>
-<span class="sourceLineNo">2545</span>  }<a name="line.2545"></a>
-<span class="sourceLineNo">2546</span><a name="line.2546"></a>
-<span class="sourceLineNo">2547</span>  @Test<a name="line.2547"></a>
-<span class="sourceLineNo">2548</span>  public void testGet_Basic() throws IOException {<a name="line.2548"></a>
-<span class="sourceLineNo">2549</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2549"></a>
-<span class="sourceLineNo">2550</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2550"></a>
-<span class="sourceLineNo">2551</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.2551"></a>
-<span class="sourceLineNo">2552</span>    byte[] col2 = Bytes.toBytes("col2");<a name="line.2552"></a>
-<span class="sourceLineNo">2553</span>    byte[] col3 = Bytes.toBytes("col3");<a name="line.2553"></a>
-<span class="sourceLineNo">2554</span>    byte[] col4 = Bytes.toBytes("col4");<a name="line.2554"></a>
-<span class="sourceLineNo">2555</span>    byte[] col5 = Bytes.toBytes("col5");<a name="line.2555"></a>
+<span class="sourceLineNo">2533</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2533"></a>
+<span class="sourceLineNo">2534</span>  // Get tests<a name="line.2534"></a>
+<span class="sourceLineNo">2535</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2535"></a>
+<span class="sourceLineNo">2536</span>  @Test<a name="line.2536"></a>
+<span class="sourceLineNo">2537</span>  public void testGet_FamilyChecker() throws IOException {<a name="line.2537"></a>
+<span class="sourceLineNo">2538</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2538"></a>
+<span class="sourceLineNo">2539</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2539"></a>
+<span class="sourceLineNo">2540</span>    byte[] fam2 = Bytes.toBytes("False");<a name="line.2540"></a>
+<span class="sourceLineNo">2541</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.2541"></a>
+<span class="sourceLineNo">2542</span><a name="line.2542"></a>
+<span class="sourceLineNo">2543</span>    // Setting up region<a name="line.2543"></a>
+<span class="sourceLineNo">2544</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2544"></a>
+<span class="sourceLineNo">2545</span>    Get get = new Get(row1);<a name="line.2545"></a>
+<span class="sourceLineNo">2546</span>    get.addColumn(fam2, col1);<a name="line.2546"></a>
+<span class="sourceLineNo">2547</span><a name="line.2547"></a>
+<span class="sourceLineNo">2548</span>    // Test<a name="line.2548"></a>
+<span class="sourceLineNo">2549</span>    try {<a name="line.2549"></a>
+<span class="sourceLineNo">2550</span>      region.get(get);<a name="line.2550"></a>
+<span class="sourceLineNo">2551</span>      fail("Expecting DoNotRetryIOException in get but did not get any");<a name="line.2551"></a>
+<span class="sourceLineNo">2552</span>    } catch (org.apache.hadoop.hbase.DoNotRetryIOException e) {<a name="line.2552"></a>
+<span class="sourceLineNo">2553</span>      LOG.info("Got expected DoNotRetryIOException successfully");<a name="line.2553"></a>
+<span class="sourceLineNo">2554</span>    }<a name="line.2554"></a>
+<span class="sourceLineNo">2555</span>  }<a name="line.2555"></a>
 <span class="sourceLineNo">2556</span><a name="line.2556"></a>
-<span class="sourceLineNo">2557</span>    // Setting up region<a name="line.2557"></a>
-<span class="sourceLineNo">2558</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2558"></a>
-<span class="sourceLineNo">2559</span>    // Add to memstore<a name="line.2559"></a>
-<span class="sourceLineNo">2560</span>    Put put = new Put(row1);<a name="line.2560"></a>
-<span class="sourceLineNo">2561</span>    put.addColumn(fam1, col1, null);<a name="line.2561"></a>
-<span class="sourceLineNo">2562</span>    put.addColumn(fam1, col2, null);<a name="line.2562"></a>
-<span class="sourceLineNo">2563</span>    put.addColumn(fam1, col3, null);<a name="line.2563"></a>
-<span class="sourceLineNo">2564</span>    put.addColumn(fam1, col4, null);<a name="line.2564"></a>
-<span class="sourceLineNo">2565</span>    put.addColumn(fam1, col5, null);<a name="line.2565"></a>
-<span class="sourceLineNo">2566</span>    region.put(put);<a name="line.2566"></a>
-<span class="sourceLineNo">2567</span><a name="line.2567"></a>
-<span class="sourceLineNo">2568</span>    Get get = new Get(row1);<a name="line.2568"></a>
-<span class="sourceLineNo">2569</span>    get.addColumn(fam1, col2);<a name="line.2569"></a>
-<span class="sourceLineNo">2570</span>    get.addColumn(fam1, col4);<a name="line.2570"></a>
-<span class="sourceLineNo">2571</span>    // Expected result<a name="line.2571"></a>
-<span class="sourceLineNo">2572</span>    KeyValue kv1 = new KeyValue(row1, fam1, col2);<a name="line.2572"></a>
-<span class="sourceLineNo">2573</span>    KeyValue kv2 = new KeyValue(row1, fam1, col4);<a name="line.2573"></a>
-<span class="sourceLineNo">2574</span>    KeyValue[] expected = { kv1, kv2 };<a name="line.2574"></a>
-<span class="sourceLineNo">2575</span><a name="line.2575"></a>
-<span class="sourceLineNo">2576</span>    // Test<a name="line.2576"></a>
-<span class="sourceLineNo">2577</span>    Result res = region.get(get);<a name="line.2577"></a>
-<span class="sourceLineNo">2578</span>    assertEquals(expected.length, res.size());<a name="line.2578"></a>
-<span class="sourceLineNo">2579</span>    for (int i = 0; i &lt; res.size(); i++) {<a name="line.2579"></a>
-<span class="sourceLineNo">2580</span>      assertTrue(CellUtil.matchingRows(expected[i], res.rawCells()[i]));<a name="line.2580"></a>
-<span class="sourceLineNo">2581</span>      assertTrue(CellUtil.matchingFamily(expected[i], res.rawCells()[i]));<a name="line.2581"></a>
-<span class="sourceLineNo">2582</span>      assertTrue(CellUtil.matchingQualifier(expected[i], res.rawCells()[i]));<a name="line.2582"></a>
-<span class="sourceLineNo">2583</span>    }<a name="line.2583"></a>
-<span class="sourceLineNo">2584</span><a name="line.2584"></a>
-<span class="sourceLineNo">2585</span>    // Test using a filter on a Get<a name="line.2585"></a>
-<span class="sourceLineNo">2586</span>    Get g = new Get(row1);<a name="line.2586"></a>
-<span class="sourceLineNo">2587</span>    final int count = 2;<a name="line.2587"></a>
-<span class="sourceLineNo">2588</span>    g.setFilter(new ColumnCountGetFilter(count));<a name="line.2588"></a>
-<span class="sourceLineNo">2589</span>    res = region.get(g);<a name="line.2589"></a>
-<span class="sourceLineNo">2590</span>    assertEquals(count, res.size());<a name="line.2590"></a>
-<span class="sourceLineNo">2591</span>  }<a name="line.2591"></a>
-<span class="sourceLineNo">2592</span><a name="line.2592"></a>
-<span class="sourceLineNo">2593</span>  @Test<a name="line.2593"></a>
-<span class="sourceLineNo">2594</span>  public void testGet_Empty() throws IOException {<a name="line.2594"></a>
-<span class="sourceLineNo">2595</span>    byte[] row = Bytes.toBytes("row");<a name="line.2595"></a>
-<span class="sourceLineNo">2596</span>    byte[] fam = Bytes.toBytes("fam");<a name="line.2596"></a>
-<span class="sourceLineNo">2597</span><a name="line.2597"></a>
-<span class="sourceLineNo">2598</span>    this.region = initHRegion(tableName, method, CONF, fam);<a name="line.2598"></a>
-<span class="sourceLineNo">2599</span>    Get get = new Get(row);<a name="line.2599"></a>
-<span class="sourceLineNo">2600</span>    get.addFamily(fam);<a name="line.2600"></a>
-<span class="sourceLineNo">2601</span>    Result r = region.get(get);<a name="line.2601"></a>
+<span class="sourceLineNo">2557</span>  @Test<a name="line.2557"></a>
+<span class="sourceLineNo">2558</span>  public void testGet_Basic() throws IOException {<a name="line.2558"></a>
+<span class="sourceLineNo">2559</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2559"></a>
+<span class="sourceLineNo">2560</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2560"></a>
+<span class="sourceLineNo">2561</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.2561"></a>
+<span class="sourceLineNo">2562</span>    byte[] col2 = Bytes.toBytes("col2");<a name="line.2562"></a>
+<span class="sourceLineNo">2563</span>    byte[] col3 = Bytes.toBytes("col3");<a name="line.2563"></a>
+<span class="sourceLineNo">2564</span>    byte[] col4 = Bytes.toBytes("col4");<a name="line.2564"></a>
+<span class="sourceLineNo">2565</span>    byte[] col5 = Bytes.toBytes("col5");<a name="line.2565"></a>
+<span class="sourceLineNo">2566</span><a name="line.2566"></a>
+<span class="sourceLineNo">2567</span>    // Setting up region<a name="line.2567"></a>
+<span class="sourceLineNo">2568</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2568"></a>
+<span class="sourceLineNo">2569</span>    // Add to memstore<a name="line.2569"></a>
+<span class="sourceLineNo">2570</span>    Put put = new Put(row1);<a name="line.2570"></a>
+<span class="sourceLineNo">2571</span>    put.addColumn(fam1, col1, null);<a name="line.2571"></a>
+<span class="sourceLineNo">2572</span>    put.addColumn(fam1, col2, null);<a name="line.2572"></a>
+<span class="sourceLineNo">2573</span>    put.addColumn(fam1, col3, null);<a name="line.2573"></a>
+<span class="sourceLineNo">2574</span>    put.addColumn(fam1, col4, null);<a name="line.2574"></a>
+<span class="sourceLineNo">2575</span>    put.addColumn(fam1, col5, null);<a name="line.2575"></a>
+<span class="sourceLineNo">2576</span>    region.put(put);<a name="line.2576"></a>
+<span class="sourceLineNo">2577</span><a name="line.2577"></a>
+<span class="sourceLineNo">2578</span>    Get get = new Get(row1);<a name="line.2578"></a>
+<span class="sourceLineNo">2579</span>    get.addColumn(fam1, col2);<a name="line.2579"></a>
+<span class="sourceLineNo">2580</span>    get.addColumn(fam1, col4);<a name="line.2580"></a>
+<span class="sourceLineNo">2581</span>    // Expected result<a name="line.2581"></a>
+<span class="sourceLineNo">2582</span>    KeyValue kv1 = new KeyValue(row1, fam1, col2);<a name="line.2582"></a>
+<span class="sourceLineNo">2583</span>    KeyValue kv2 = new KeyValue(row1, fam1, col4);<a name="line.2583"></a>
+<span class="sourceLineNo">2584</span>    KeyValue[] expected = { kv1, kv2 };<a name="line.2584"></a>
+<span class="sourceLineNo">2585</span><a name="line.2585"></a>
+<span class="sourceLineNo">2586</span>    // Test<a name="line.2586"></a>
+<span class="sourceLineNo">2587</span>    Result res = region.get(get);<a name="line.2587"></a>
+<span class="sourceLineNo">2588</span>    assertEquals(expected.length, res.size());<a name="line.2588"></a>
+<span class="sourceLineNo">2589</span>    for (int i = 0; i &lt; res.size(); i++) {<a name="line.2589"></a>
+<span class="sourceLineNo">2590</span>      assertTrue(CellUtil.matchingRows(expected[i], res.rawCells()[i]));<a name="line.2590"></a>
+<span class="sourceLineNo">2591</span>      assertTrue(CellUtil.matchingFamily(expected[i], res.rawCells()[i]));<a name="line.2591"></a>
+<span class="sourceLineNo">2592</span>      assertTrue(CellUtil.matchingQualifier(expected[i], res.rawCells()[i]));<a name="line.2592"></a>
+<span class="sourceLineNo">2593</span>    }<a name="line.2593"></a>
+<span class="sourceLineNo">2594</span><a name="line.2594"></a>
+<span class="sourceLineNo">2595</span>    // Test using a filter on a Get<a name="line.2595"></a>
+<span class="sourceLineNo">2596</span>    Get g = new Get(row1);<a name="line.2596"></a>
+<span class="sourceLineNo">2597</span>    final int count = 2;<a name="line.2597"></a>
+<span class="sourceLineNo">2598</span>    g.setFilter(new ColumnCountGetFilter(count));<a name="line.2598"></a>
+<span class="sourceLineNo">2599</span>    res = region.get(g);<a name="line.2599"></a>
+<span class="sourceLineNo">2600</span>    assertEquals(count, res.size());<a name="line.2600"></a>
+<span class="sourceLineNo">2601</span>  }<a name="line.2601"></a>
 <span class="sourceLineNo">2602</span><a name="line.2602"></a>
-<span class="sourceLineNo">2603</span>    assertTrue(r.isEmpty());<a name="line.2603"></a>
-<span class="sourceLineNo">2604</span>  }<a name="line.2604"></a>
-<span class="sourceLineNo">2605</span><a name="line.2605"></a>
-<span class="sourceLineNo">2606</span>  @Test<a name="line.2606"></a>
-<span class="sourceLineNo">2607</span>  public void testGetWithFilter() throws IOException, InterruptedException {<a name="line.2607"></a>
-<span class="sourceLineNo">2608</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2608"></a>
-<span class="sourceLineNo">2609</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2609"></a>
-<span class="sourceLineNo">2610</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.2610"></a>
-<span class="sourceLineNo">2611</span>    byte[] value1 = Bytes.toBytes("value1");<a name="line.2611"></a>
-<span class="sourceLineNo">2612</span>    byte[] value2 = Bytes.toBytes("value2");<a name="line.2612"></a>
-<span class="sourceLineNo">2613</span><a name="line.2613"></a>
-<span class="sourceLineNo">2614</span>    final int maxVersions = 3;<a name="line.2614"></a>
-<span class="sourceLineNo">2615</span>    HColumnDescriptor hcd = new HColumnDescriptor(fam1);<a name="line.2615"></a>
-<span class="sourceLineNo">2616</span>    hcd.setMaxVersions(maxVersions);<a name="line.2616"></a>
-<span class="sourceLineNo">2617</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf("testFilterAndColumnTracker"));<a name="line.2617"></a>
-<span class="sourceLineNo">2618</span>    htd.addFamily(hcd);<a name="line.2618"></a>
-<span class="sourceLineNo">2619</span>    ChunkCreator.initialize(MemStoreLABImpl.CHUNK_SIZE_DEFAULT, false, 0, 0, 0, null);<a name="line.2619"></a>
-<span class="sourceLineNo">2620</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.2620"></a>
-<span class="sourceLineNo">2621</span>    Path logDir = TEST_UTIL.getDataTestDirOnTestFS(method + ".log");<a name="line.2621"></a>
-<span class="sourceLineNo">2622</span>    final WAL wal = HBaseTestingUtility.createWal(TEST_UTIL.getConfiguration(), logDir, info);<a name="line.2622"></a>
-<span class="sourceLineNo">2623</span>    this.region = TEST_UTIL.createLocalHRegion(info, htd, wal);<a name="line.2623"></a>
-<span class="sourceLineNo">2624</span><a name="line.2624"></a>
-<span class="sourceLineNo">2625</span>    // Put 4 version to memstore<a name="line.2625"></a>
-<span class="sourceLineNo">2626</span>    long ts = 0;<a name="line.2626"></a>
-<span class="sourceLineNo">2627</span>    Put put = new Put(row1, ts);<a name="line.2627"></a>
-<span class="sourceLineNo">2628</span>    put.addColumn(fam1, col1, value1);<a name="line.2628"></a>
-<span class="sourceLineNo">2629</span>    region.put(put);<a name="line.2629"></a>
-<span class="sourceLineNo">2630</span>    put = new Put(row1, ts + 1);<a name="line.2630"></a>
-<span class="sourceLineNo">2631</span>    put.addColumn(fam1, col1, Bytes.toBytes("filter1"));<a name="line.2631"></a>
-<span class="sourceLineNo">2632</span>    region.put(put);<a name="line.2632"></a>
-<span class="sourceLineNo">2633</span>    put = new Put(row1, ts + 2);<a name="line.2633"></a>
-<span class="sourceLineNo">2634</span>    put.addColumn(fam1, col1, Bytes.toBytes("filter2"));<a name="line.2634"></a>
-<span class="sourceLineNo">2635</span>    region.put(put);<a name="line.2635"></a>
-<span class="sourceLineNo">2636</span>    put = new Put(row1, ts + 3);<a name="line.2636"></a>
-<span class="sourceLineNo">2637</span>    put.addColumn(fam1, col1, value2);<a name="line.2637"></a>
-<span class="sourceLineNo">2638</span>    region.put(put);<a name="line.2638"></a>
-<span class="sourceLineNo">2639</span><a name="line.2639"></a>
-<span class="sourceLineNo">2640</span>    Get get = new Get(row1);<a name="line.2640"></a>
-<span class="sourceLineNo">2641</span>    get.readAllVersions();<a name="line.2641"></a>
-<span class="sourceLineNo">2642</span>    Result res = region.get(get);<a name="line.2642"></a>
-<span class="sourceLineNo">2643</span>    // Get 3 versions, the oldest version has gone from user view<a name="line.2643"></a>
-<span class="sourceLineNo">2644</span>    assertEquals(maxVersions, res.size());<a name="line.2644"></a>
-<span class="sourceLineNo">2645</span><a name="line.2645"></a>
-<span class="sourceLineNo">2646</span>    get.setFilter(new ValueFilter(CompareOperator.EQUAL, new SubstringComparator("value")));<a name="line.2646"></a>
-<span class="sourceLineNo">2647</span>    res = region.get(get);<a name="line.2647"></a>
-<span class="sourceLineNo">2648</span>    // When use value filter, the oldest version should still gone from user view and it<a name="line.2648"></a>
-<span class="sourceLineNo">2649</span>    // should only return one key vaule<a name="line.2649"></a>
-<span class="sourceLineNo">2650</span>    assertEquals(1, res.size());<a name="line.2650"></a>
-<span class="sourceLineNo">2651</span>    assertTrue(CellUtil.matchingValue(new KeyValue(row1, fam1, col1, value2), res.rawCells()[0]));<a name="line.2651"></a>
-<span class="sourceLineNo">2652</span>    assertEquals(ts + 3, res.rawCells()[0].getTimestamp());<a name="line.2652"></a>
-<span class="sourceLineNo">2653</span><a name="line.2653"></a>
-<span class="sourceLineNo">2654</span>    region.flush(true);<a name="line.2654"></a>
-<span class="sourceLineNo">2655</span>    region.compact(true);<a name="line.2655"></a>
-<span class="sourceLineNo">2656</span>    Thread.sleep(1000);<a name="line.2656"></a>
+<span class="sourceLineNo">2603</span>  @Test<a name="line.2603"></a>
+<span class="sourceLineNo">2604</span>  public void testGet_Empty() throws IOException {<a name="line.2604"></a>
+<span class="sourceLineNo">2605</span>    byte[] row = Bytes.toBytes("row");<a name="line.2605"></a>
+<span class="sourceLineNo">2606</span>    byte[] fam = Bytes.toBytes("fam");<a name="line.2606"></a>
+<span class="sourceLineNo">2607</span><a name="line.2607"></a>
+<span class="sourceLineNo">2608</span>    this.region = initHRegion(tableName, method, CONF, fam);<a name="line.2608"></a>
+<span class="sourceLineNo">2609</span>    Get get = new Get(row);<a name="line.2609"></a>
+<span class="sourceLineNo">2610</span>    get.addFamily(fam);<a name="line.2610"></a>
+<span class="sourceLineNo">2611</span>    Result r = region.get(get);<a name="line.2611"></a>
+<span class="sourceLineNo">2612</span><a name="line.2612"></a>
+<span class="sourceLineNo">2613</span>    assertTrue(r.isEmpty());<a name="line.2613"></a>
+<span class="sourceLineNo">2614</span>  }<a name="line.2614"></a>
+<span class="sourceLineNo">2615</span><a name="line.2615"></a>
+<span class="sourceLineNo">2616</span>  @Test<a name="line.2616"></a>
+<span class="sourceLineNo">2617</span>  public void testGetWithFilter() throws IOException, InterruptedException {<a name="line.2617"></a>
+<span class="sourceLineNo">2618</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2618"></a>
+<span class="sourceLineNo">2619</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2619"></a>
+<span class="sourceLineNo">2620</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.2620"></a>
+<span class="sourceLineNo">2621</span>    byte[] value1 = Bytes.toBytes("value1");<a name="line.2621"></a>
+<span class="sourceLineNo">2622</span>    byte[] value2 = Bytes.toBytes("value2");<a name="line.2622"></a>
+<span class="sourceLineNo">2623</span><a name="line.2623"></a>
+<span class="sourceLineNo">2624</span>    final int maxVersions = 3;<a name="line.2624"></a>
+<span class="sourceLineNo">2625</span>    HColumnDescriptor hcd = new HColumnDescriptor(fam1);<a name="line.2625"></a>
+<span class="sourceLineNo">2626</span>    hcd.setMaxVersions(maxVersions);<a name="line.2626"></a>
+<span class="sourceLineNo">2627</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf("testFilterAndColumnTracker"));<a name="line.2627"></a>
+<span class="sourceLineNo">2628</span>    htd.addFamily(hcd);<a name="line.2628"></a>
+<span class="sourceLineNo">2629</span>    ChunkCreator.initialize(MemStoreLABImpl.CHUNK_SIZE_DEFAULT, false, 0, 0, 0, null);<a name="line.2629"></a>
+<span class="sourceLineNo">2630</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.2630"></a>
+<span class="sourceLineNo">2631</span>    Path logDir = TEST_UTIL.getDataTestDirOnTestFS(method + ".log");<a name="line.2631"></a>
+<span class="sourceLineNo">2632</span>    final WAL wal = HBaseTestingUtility.createWal(TEST_UTIL.getConfiguration(), logDir, info);<a name="line.2632"></a>
+<span class="sourceLineNo">2633</span>    this.region = TEST_UTIL.createLocalHRegion(info, htd, wal);<a name="line.2633"></a>
+<span class="sourceLineNo">2634</span><a name="line.2634"></a>
+<span class="sourceLineNo">2635</span>    // Put 4 version to memstore<a name="line.2635"></a>
+<span class="sourceLineNo">2636</span>    long ts = 0;<a name="line.2636"></a>
+<span class="sourceLineNo">2637</span>    Put put = new Put(row1, ts);<a name="line.2637"></a>
+<span class="sourceLineNo">2638</span>    put.addColumn(fam1, col1, value1);<a name="line.2638"></a>
+<span class="sourceLineNo">2639</span>    region.put(put);<a name="line.2639"></a>
+<span class="sourceLineNo">2640</span>    put = new Put(row1, ts + 1);<a name="line.2640"></a>
+<span class="sourceLineNo">2641</span>    put.addColumn(fam1, col1, Bytes.toBytes("filter1"));<a name="line.2641"></a>
+<span class="sourceLineNo">2642</span>    region.put(put);<a name="line.2642"></a>
+<span class="sourceLineNo">2643</span>    put = new Put(row1, ts + 2);<a name="line.2643"></a>
+<span class="sourceLineNo">2644</span>    put.addColumn(fam1, col1, Bytes.toBytes("filter2"));<a name="line.2644"></a>
+<span class="sourceLineNo">2645</span>    region.put(put);<a name="line.2645"></a>
+<span class="sourceLineNo">2646</span>    put = new Put(row1, ts + 3);<a name="line.2646"></a>
+<span class="sourceLineNo">2647</span>    put.addColumn(fam1, col1, value2);<a name="line.2647"></a>
+<span class="sourceLineNo">2648</span>    region.put(put);<a name="line.2648"></a>
+<span class="sourceLineNo">2649</span><a name="line.2649"></a>
+<span class="sourceLineNo">2650</span>    Get get = new Get(row1);<a name="line.2650"></a>
+<span class="sourceLineNo">2651</span>    get.readAllVersions();<a name="line.2651"></a>
+<span class="sourceLineNo">2652</span>    Result res = region.get(get);<a name="line.2652"></a>
+<span class="sourceLineNo">2653</span>    // Get 3 versions, the oldest version has gone from user view<a name="line.2653"></a>
+<span class="sourceLineNo">2654</span>    assertEquals(maxVersions, res.size());<a name="line.2654"></a>
+<span class="sourceLineNo">2655</span><a name="line.2655"></a>
+<span class="sourceLineNo">2656</span>    get.setFilter(new ValueFilter(CompareOperator.EQUAL, new SubstringComparator("value")));<a name="line.2656"></a>
 <span class="sourceLineNo">2657</span>    res = region.get(get);<a name="line.2657"></a>
-<span class="sourceLineNo">2658</span>    // After flush and compact, the result should be consistent with previous result<a name="line.2658"></a>
-<span class="sourceLineNo">2659</span>    assertEquals(1, res.size());<a name="line.2659"></a>
-<span class="sourceLineNo">2660</span>    assertTrue(CellUtil.matchingValue(new KeyValue(row1, fam1, col1, value2), res.rawCells()[0]));<a name="line.2660"></a>
-<span class="sourceLineNo">2661</span>  }<a name="line.2661"></a>
-<span class="sourceLineNo">2662</span><a name="line.2662"></a>
-<span class="sourceLineNo">2663</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2663"></a>
-<span class="sourceLineNo">2664</span>  // Scanner tests<a name="line.2664"></a>
-<span class="sourceLineNo">2665</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2665"></a>
-<span class="sourceLineNo">2666</span>  @Test<a name="line.2666"></a>
-<span class="sourceLineNo">2667</span>  public void testGetScanner_WithOkFamilies() throws IOException {<a name="line.2667"></a>
-<span class="sourceLineNo">2668</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2668"></a>
-<span class="sourceLineNo">2669</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2669"></a>
-<span class="sourceLineNo">2670</span><a name="line.2670"></a>
-<span class="sourceLineNo">2671</span>    byte[][] families = { fam1, fam2 };<a name="line.2671"></a>
+<span class="sourceLineNo">2658</span>    // When use value filter, the oldest version should still gone from user view and it<a name="line.2658"></a>
+<span class="sourceLineNo">2659</span>    // should only return one key vaule<a name="line.2659"></a>
+<span class="sourceLineNo">2660</span>    assertEquals(1, res.size());<a name="line.2660"></a>
+<span class="sourceLineNo">2661</span>    assertTrue(CellUtil.matchingValue(new KeyValue(row1, fam1, col1, value2), res.rawCells()[0]));<a name="line.2661"></a>
+<span class="sourceLineNo">2662</span>    assertEquals(ts + 3, res.rawCells()[0].getTimestamp());<a name="line.2662"></a>
+<span class="sourceLineNo">2663</span><a name="line.2663"></a>
+<span class="sourceLineNo">2664</span>    region.flush(true);<a name="line.2664"></a>
+<span class="sourceLineNo">2665</span>    region.compact(true);<a name="line.2665"></a>
+<span class="sourceLineNo">2666</span>    Thread.sleep(1000);<a name="line.2666"></a>
+<span class="sourceLineNo">2667</span>    res = region.get(get);<a name="line.2667"></a>
+<span class="sourceLineNo">2668</span>    // After flush and compact, the result should be consistent with previous result<a name="line.2668"></a>
+<span class="sourceLineNo">2669</span>    assertEquals(1, res.size());<a name="line.2669"></a>
+<span class="sourceLineNo">2670</span>    assertTrue(CellUtil.matchingValue(new KeyValue(row1, fam1, col1, value2), res.rawCells()[0]));<a name="line.2670"></a>
+<span class="sourceLineNo">2671</span>  }<a name="line.2671"></a>
 <span class="sourceLineNo">2672</span><a name="line.2672"></a>
-<span class="sourceLineNo">2673</span>    // Setting up region<a name="line.2673"></a>
-<span class="sourceLineNo">2674</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2674"></a>
-<span class="sourceLineNo">2675</span>    Scan scan = new Scan();<a name="line.2675"></a>
-<span class="sourceLineNo">2676</span>    scan.addFamily(fam1);<a name="line.2676"></a>
-<span class="sourceLineNo">2677</span>    scan.addFamily(fam2);<a name="line.2677"></a>
-<span class="sourceLineNo">2678</span>    try {<a name="line.2678"></a>
-<span class="sourceLineNo">2679</span>      region.getScanner(scan);<a name="line.2679"></a>
-<span class="sourceLineNo">2680</span>    } catch (Exception e) {<a name="line.2680"></a>
-<span class="sourceLineNo">2681</span>      assertTrue("Families could not be found in Region", false);<a name="line.2681"></a>
-<span class="sourceLineNo">2682</span>    }<a name="line.2682"></a>
-<span class="sourceLineNo">2683</span>  }<a name="line.2683"></a>
-<span class="sourceLineNo">2684</span><a name="line.2684"></a>
-<span class="sourceLineNo">2685</span>  @Test<a name="line.2685"></a>
-<span class="sourceLineNo">2686</span>  public void testGetScanner_WithNotOkFamilies() throws IOException {<a name="line.2686"></a>
-<span class="sourceLineNo">2687</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2687"></a>
-<span class="sourceLineNo">2688</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2688"></a>
-<span class="sourceLineNo">2689</span><a name="line.2689"></a>
-<span class="sourceLineNo">2690</span>    byte[][] families = { fam1 };<a name="line.2690"></a>
-<span class="sourceLineNo">2691</span><a name="line.2691"></a>
-<span class="sourceLineNo">2692</span>    // Setting up region<a name="line.2692"></a>
-<span class="sourceLineNo">2693</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2693"></a>
-<span class="sourceLineNo">2694</span>    Scan scan = new Scan();<a name="line.2694"></a>
-<span class="sourceLineNo">2695</span>    scan.addFamily(fam2);<a name="line.2695"></a>
-<span class="sourceLineNo">2696</span>    boolean ok = false;<a name="line.2696"></a>
-<span class="sourceLineNo">2697</span>    try {<a name="line.2697"></a>
-<span class="sourceLineNo">2698</span>      region.getScanner(scan);<a name="line.2698"></a>
-<span class="sourceLineNo">2699</span>    } catch (Exception e) {<a name="line.2699"></a>
-<span class="sourceLineNo">2700</span>      ok = true;<a name="line.2700"></a>
-<span class="sourceLineNo">2701</span>    }<a name="line.2701"></a>
-<span class="sourceLineNo">2702</span>    assertTrue("Families could not be found in Region", ok);<a name="line.2702"></a>
-<span class="sourceLineNo">2703</span>  }<a name="line.2703"></a>
-<span class="sourceLineNo">2704</span><a name="line.2704"></a>
-<span class="sourceLineNo">2705</span>  @Test<a name="line.2705"></a>
-<span class="sourceLineNo">2706</span>  public void testGetScanner_WithNoFamilies() throws IOException {<a name="line.2706"></a>
-<span class="sourceLineNo">2707</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2707"></a>
-<span class="sourceLineNo">2708</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2708"></a>
-<span class="sourceLineNo">2709</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2709"></a>
-<span class="sourceLineNo">2710</span>    byte[] fam3 = Bytes.toBytes("fam3");<a name="line.2710"></a>
-<span class="sourceLineNo">2711</span>    byte[] fam4 = Bytes.toBytes("fam4");<a name="line.2711"></a>
-<span class="sourceLineNo">2712</span><a name="line.2712"></a>
-<span class="sourceLineNo">2713</span>    byte[][] families = { fam1, fam2, fam3, fam4 };<a name="line.2713"></a>
+<span class="sourceLineNo">2673</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2673"></a>
+<span class="sourceLineNo">2674</span>  // Scanner tests<a name="line.2674"></a>
+<span class="sourceLineNo">2675</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2675"></a>
+<span class="sourceLineNo">2676</span>  @Test<a name="line.2676"></a>
+<span class="sourceLineNo">2677</span>  public void testGetScanner_WithOkFamilies() throws IOException {<a name="line.2677"></a>
+<span class="sourceLineNo">2678</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2678"></a>
+<span class="sourceLineNo">2679</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2679"></a>
+<span class="sourceLineNo">2680</span><a name="line.2680"></a>
+<span class="sourceLineNo">2681</span>    byte[][] families = { fam1, fam2 };<a name="line.2681"></a>
+<span class="sourceLineNo">2682</span><a name="line.2682"></a>
+<span class="sourceLineNo">2683</span>    // Setting up region<a name="line.2683"></a>
+<span class="sourceLineNo">2684</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2684"></a>
+<span class="sourceLineNo">2685</span>    Scan scan = new Scan();<a name="line.2685"></a>
+<span class="sourceLineNo">2686</span>    scan.addFamily(fam1);<a name="line.2686"></a>
+<span class="sourceLineNo">2687</span>    scan.addFamily(fam2);<a name="line.2687"></a>
+<span class="sourceLineNo">2688</span>    try {<a name="line.2688"></a>
+<span class="sourceLineNo">2689</span>      region.getScanner(scan);<a name="line.2689"></a>
+<span class="sourceLineNo">2690</span>    } catch (Exception e) {<a name="line.2690"></a>
+<span class="sourceLineNo">2691</span>      assertTrue("Families could not be found in Region", false);<a name="line.2691"></a>
+<span class="sourceLineNo">2692</span>    }<a name="line.2692"></a>
+<span class="sourceLineNo">2693</span>  }<a name="line.2693"></a>
+<span class="sourceLineNo">2694</span><a name="line.2694"></a>
+<span class="sourceLineNo">2695</span>  @Test<a name="line.2695"></a>
+<span class="sourceLineNo">2696</span>  public void testGetScanner_WithNotOkFamilies() throws IOException {<a name="line.2696"></a>
+<span class="sourceLineNo">2697</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2697"></a>
+<span class="sourceLineNo">2698</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2698"></a>
+<span class="sourceLineNo">2699</span><a name="line.2699"></a>
+<span class="sourceLineNo">2700</span>    byte[][] families = { fam1 };<a name="line.2700"></a>
+<span class="sourceLineNo">2701</span><a name="line.2701"></a>
+<span class="sourceLineNo">2702</span>    // Setting up region<a name="line.2702"></a>
+<span class="sourceLineNo">2703</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2703"></a>
+<span class="sourceLineNo">2704</span>    Scan scan = new Scan();<a name="line.2704"></a>
+<span class="sourceLineNo">2705</span>    scan.addFamily(fam2);<a name="line.2705"></a>
+<span class="sourceLineNo">2706</span>    boolean ok = false;<a name="line.2706"></a>
+<span class="sourceLineNo">2707</span>    try {<a name="line.2707"></a>
+<span class="sourceLineNo">2708</span>      region.getScanner(scan);<a name="line.2708"></a>
+<span class="sourceLineNo">2709</span>    } catch (Exception e) {<a name="line.2709"></a>
+<span class="sourceLineNo">2710</span>      ok = true;<a name="line.2710"></a>
+<span class="sourceLineNo">2711</span>    }<a name="line.2711"></a>
+<span class="sourceLineNo">2712</span>    assertTrue("Families could not be found in Region", ok);<a name="line.2712"></a>
+<span class="sourceLineNo">2713</span>  }<a name="line.2713"></a>
 <span class="sourceLineNo">2714</span><a name="line.2714"></a>
-<span class="sourceLineNo">2715</span>    // Setting up region<a name="line.2715"></a>
-<span class="sourceLineNo">2716</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2716"></a>
-<span class="sourceLineNo">2717</span>    // Putting data in Region<a name="line.2717"></a>
-<span class="sourceLineNo">2718</span>    Put put = new Put(row1);<a name="line.2718"></a>
-<span class="sourceLineNo">2719</span>    put.addColumn(fam1, null, null);<a name="line.2719"></a>
-<span class="sourceLineNo">2720</span>    put.addColumn(fam2, null, null);<a name="line.2720"></a>
-<span class="sourceLineNo">2721</span>    put.addColumn(fam3, null, null);<a name="line.2721"></a>
-<span class="sourceLineNo">2722</span>    put.addColumn(fam4, null, null);<a name="line.2722"></a>
-<span class="sourceLineNo">2723</span>    region.put(put);<a name="line.2723"></a>
+<span class="sourceLineNo">2715</span>  @Test<a name="line.2715"></a>
+<span class="sourceLineNo">2716</span>  public void testGetScanner_WithNoFamilies() throws IOException {<a name="line.2716"></a>
+<span class="sourceLineNo">2717</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2717"></a>
+<span class="sourceLineNo">2718</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2718"></a>
+<span class="sourceLineNo">2719</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2719"></a>
+<span class="sourceLineNo">2720</span>    byte[] fam3 = Bytes.toBytes("fam3");<a name="line.2720"></a>
+<span class="sourceLineNo">2721</span>    byte[] fam4 = Bytes.toBytes("fam4");<a name="line.2721"></a>
+<span class="sourceLineNo">2722</span><a name="line.2722"></a>
+<span class="sourceLineNo">2723</span>    byte[][] families = { fam1, fam2, fam3, fam4 };<a name="line.2723"></a>
 <span class="sourceLineNo">2724</span><a name="line.2724"></a>
-<span class="sourceLineNo">2725</span>    Scan scan = null;<a name="line.2725"></a>
-<span class="sourceLineNo">2726</span>    HRegion.RegionScannerImpl is = null;<a name="line.2726"></a>
-<span class="sourceLineNo">2727</span><a name="line.2727"></a>
-<span class="sourceLineNo">2728</span>    // Testing to see how many scanners that is produced by getScanner,<a name="line.2728"></a>
-<span class="sourceLineNo">2729</span>    // starting<a name="line.2729"></a>
-<span class="sourceLineNo">2730</span>    // with known number, 2 - current = 1<a name="line.2730"></a>
-<span class="sourceLineNo">2731</span>    scan = new Scan();<a name="line.2731"></a>
-<span class="sourceLineNo">2732</span>    scan.addFamily(fam2);<a name="line.2732"></a>
-<span class="sourceLineNo">2733</span>    scan.addFamily(fam4);<a name="line.2733"></a>
-<span class="sourceLineNo">2734</span>    is = region.getScanner(scan);<a name="line.2734"></a>
-<span class="sourceLineNo">2735</span>    assertEquals(1, is.storeHeap.getHeap().size());<a name="line.2735"></a>
-<span class="sourceLineNo">2736</span><a name="line.2736"></a>
-<span class="sourceLineNo">2737</span>    scan = new Scan();<a name="line.2737"></a>
-<span class="sourceLineNo">2738</span>    is = region.getScanner(scan);<a name="line.2738"></a>
-<span class="sourceLineNo">2739</span>    assertEquals(families.length - 1, is.storeHeap.getHeap().size());<a name="line.2739"></a>
-<span class="sourceLineNo">2740</span>  }<a name="line.2740"></a>
-<span class="sourceLineNo">2741</span><a name="line.2741"></a>
-<span class="sourceLineNo">2742</span>  /**<a name="line.2742"></a>
-<span class="sourceLineNo">2743</span>   * This method tests https://issues.apache.org/jira/browse/HBASE-2516.<a name="line.2743"></a>
-<span class="sourceLineNo">2744</span>   *<a name="line.2744"></a>
-<span class="sourceLineNo">2745</span>   * @throws IOException<a name="line.2745"></a>
-<span class="sourceLineNo">2746</span>   */<a name="line.2746"></a>
-<span class="sourceLineNo">2747</span>  @Test<a name="line.2747"></a>
-<span class="sourceLineNo">2748</span>  public void testGetScanner_WithRegionClosed() throws IOException {<a name="line.2748"></a>
-<span class="sourceLineNo">2749</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2749"></a>
-<span class="sourceLineNo">2750</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2750"></a>
+<span class="sourceLineNo">2725</span>    // Setting up region<a name="line.2725"></a>
+<span class="sourceLineNo">2726</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2726"></a>
+<span class="sourceLineNo">2727</span>    // Putting data in Region<a name="line.2727"></a>
+<span class="sourceLineNo">2728</span>    Put put = new Put(row1);<a name="line.2728"></a>
+<span class="sourceLineNo">2729</span>    put.addColumn(fam1, null, null);<a name="line.2729"></a>
+<span class="sourceLineNo">2730</span>    put.addColumn(fam2, null, null);<a name="line.2730"></a>
+<span class="sourceLineNo">2731</span>    put.addColumn(fam3, null, null);<a name="line.2731"></a>
+<span class="sourceLineNo">2732</span>    put.addColumn(fam4, null, null);<a name="line.2732"></a>
+<span class="sourceLineNo">2733</span>    region.put(put);<a name="line.2733"></a>
+<span class="sourceLineNo">2734</span><a name="line.2734"></a>
+<span class="sourceLineNo">2735</span>    Scan scan = null;<a name="line.2735"></a>
+<span class="sourceLineNo">2736</span>    HRegion.RegionScannerImpl is = null;<a name="line.2736"></a>
+<span class="sourceLineNo">2737</span><a name="line.2737"></a>
+<span class="sourceLineNo">2738</span>    // Testing to see how many scanners that is produced by getScanner,<a name="line.2738"></a>
+<span class="sourceLineNo">2739</span>    // starting<a name="line.2739"></a>
+<span class="sourceLineNo">2740</span>    // with known number, 2 - current = 1<a name="line.2740"></a>
+<span class="sourceLineNo">2741</span>    scan = new Scan();<a name="line.2741"></a>
+<span class="sourceLineNo">2742</span>    scan.addFamily(fam2);<a name="line.2742"></a>
+<span class="sourceLineNo">2743</span>    scan.addFamily(fam4);<a name="line.2743"></a>
+<span class="sourceLineNo">2744</span>    is = region.getScanner(scan);<a name="line.2744"></a>
+<span class="sourceLineNo">2745</span>    assertEquals(1, is.storeHeap.getHeap().size());<a name="line.2745"></a>
+<span class="sourceLineNo">2746</span><a name="line.2746"></a>
+<span class="sourceLineNo">2747</span>    scan = new Scan();<a name="line.2747"></a>
+<span class="sourceLineNo">2748</span>    is = region.getScanner(scan);<a name="line.2748"></a>
+<span class="sourceLineNo">2749</span>    assertEquals(families.length - 1, is.storeHeap.getHeap().size());<a name="line.2749"></a>
+<span class="sourceLineNo">2750</span>  }<a name="line.2750"></a>
 <span class="sourceLineNo">2751</span><a name="line.2751"></a>
-<span class="sourceLineNo">2752</span>    byte[][] families = { fam1, fam2 };<a name="line.2752"></a>
-<span class="sourceLineNo">2753</span><a name="line.2753"></a>
-<span class="sourceLineNo">2754</span>    // Setting up region<a name="line.2754"></a>
-<span class="sourceLineNo">2755</span>    try {<a name="line.2755"></a>
-<span class="sourceLineNo">2756</span>      this.region = initHRegion(tableName, method, CONF, families);<a name="line.2756"></a>
-<span class="sourceLineNo">2757</span>    } catch (IOException e) {<a name="line.2757"></a>
-<span class="sourceLineNo">2758</span>      e.printStackTrace();<a name="line.2758"></a>
-<span class="sourceLineNo">2759</span>      fail("Got IOException during initHRegion, " + e.getMessage());<a name="line.2759"></a>
-<span class="sourceLineNo">2760</span>    }<a name="line.2760"></a>
-<span class="sourceLineNo">2761</span>    region.closed.set(true);<a name="line.2761"></a>
-<span class="sourceLineNo">2762</span>    try {<a name="line.2762"></a>
-<span class="sourceLineNo">2763</span>      region.getScanner(null);<a name="line.2763"></a>
-<span class="sourceLineNo">2764</span>      fail("Expected to get an exception during getScanner on a region that is closed");<a name="line.2764"></a>
-<span class="sourceLineNo">2765</span>    } catch (NotServingRegionException e) {<a name="line.2765"></a>
-<span class="sourceLineNo">2766</span>      // this is the correct exception that is expected<a name="line.2766"></a>
+<span class="sourceLineNo">2752</span>  /**<a name="line.2752"></a>
+<span class="sourceLineNo">2753</span>   * This method tests https://issues.apache.org/jira/browse/HBASE-2516.<a name="line.2753"></a>
+<span class="sourceLineNo">2754</span>   *<a name="line.2754"></a>
+<span class="sourceLineNo">2755</span>   * @throws IOException<a name="line.2755"></a>
+<span class="sourceLineNo">2756</span>   */<a name="line.2756"></a>
+<span class="sourceLineNo">2757</span>  @Test<a name="line.2757"></a>
+<span class="sourceLineNo">2758</span>  public void testGetScanner_WithRegionClosed() throws IOException {<a name="line.2758"></a>
+<span class="sourceLineNo">2759</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2759"></a>
+<span class="sourceLineNo">2760</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2760"></a>
+<span class="sourceLineNo">2761</span><a name="line.2761"></a>
+<span class="sourceLineNo">2762</span>    byte[][] families = { fam1, fam2 };<a name="line.2762"></a>
+<span class="sourceLineNo">2763</span><a name="line.2763"></a>
+<span class="sourceLineNo">2764</span>    // Setting up region<a name="line.2764"></a>
+<span class="sourceLineNo">2765</span>    try {<a name="line.2765"></a>
+<span class="sourceLineNo">2766</span>      this.region = initHRegion(tableName, method, CONF, families);<a name="line.2766"></a>
 <span class="sourceLineNo">2767</span>    } catch (IOException e) {<a name="line.2767"></a>
-<span class="sourceLineNo">2768</span>      fail("Got wrong type of exception - should be a NotServingRegionException, " +<a name="line.2768"></a>
-<span class="sourceLineNo">2769</span>          "but was an IOException: "<a name="line.2769"></a>
-<span class="sourceLineNo">2770</span>          + e.getMessage());<a name="line.2770"></a>
-<span class="sourceLineNo">2771</span>    }<a name="line.2771"></a>
-<span class="sourceLineNo">2772</span>  }<a name="line.2772"></a>
-<span class="sourceLineNo">2773</span><a name="line.2773"></a>
-<span class="sourceLineNo">2774</span>  @Test<a name="line.2774"></a>
-<span class="sourceLineNo">2775</span>  public void testRegionScanner_Next() throws IOException {<a name="line.2775"></a>
-<span class="sourceLineNo">2776</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2776"></a>
-<span class="sourceLineNo">2777</span>    byte[] row2 = Bytes.toBytes("row2");<a name="line.2777"></a>
-<span class="sourceLineNo">2778</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2778"></a>
-<span class="sourceLineNo">2779</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2779"></a>
-<span class="sourceLineNo">2780</span>    byte[] fam3 = Bytes.toBytes("fam3");<a name="line.2780"></a>
-<span class="sourceLineNo">2781</span>    byte[] fam4 = Bytes.toBytes("fam4");<a name="line.2781"></a>
-<span class="sourceLineNo">2782</span><a name="line.2782"></a>
-<span class="sourceLineNo">2783</span>    byte[][] families = { fam1, fam2, fam3, fam4 };<a name="line.2783"></a>
-<span class="sourceLineNo">2784</span>    long ts = System.currentTimeMillis();<a name="line.2784"></a>
-<span class="sourceLineNo">2785</span><a name="line.2785"></a>
-<span class="sourceLineNo">2786</span>    // Setting up region<a name="line.2786"></a>
-<span class="sourceLineNo">2787</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2787"></a>
-<span class="sourceLineNo">2788</span>    // Putting data in Region<a name="line.2788"></a>
-<span class="sourceLineNo">2789</span>    Put put = null;<a name="line.2789"></a>
-<span class="sourceLineNo">2790</span>    put = new Put(row1);<a name="line.2790"></a>
-<span class="sourceLineNo">2791</span>    put.addColumn(fam1, (byte[]) null, ts, null);<a name="line.2791"></a>
-<span class="sourceLineNo">2792</span>    put.addColumn(fam2, (byte[]) null, ts, null);<a name="line.2792"></a>
-<span class="sourceLineNo">2793</span>    put.addColumn(fam3, (byte[]) null, ts, null);<a name="line.2793"></a>
-<span class="sourceLineNo">2794</span>    put.addColumn(fam4, (byte[]) null, ts, null);<a name="line.2794"></a>
-<span class="sourceLineNo">2795</span>    region.put(put);<a name="line.2795"></a>
-<span class="sourceLineNo">2796</span><a name="line.2796"></a>
-<span class="sourceLineNo">2797</span>    put = new Put(row2);<a name="line.2797"></a>
-<span class="sourceLineNo">2798</span>    put.addColumn(fam1, (byte[]) null, ts, null);<a name="line.2798"></a>
-<span class="sourceLineNo">2799</span>    put.addColumn(fam2, (byte[]) null, ts, null);<a name="line.2799"></a>
-<span class="sourceLineNo">2800</span>    put.addColumn(fam3, (byte[]) null, ts, null);<a name="line.2800"></a>
-<span class="sourceLineNo">2801</span>    put.addColumn(fam4, (byte[]) null, ts, null);<a name="line.2801"></a>
-<span class="sourceLineNo">2802</span>    region.put(put);<a name="line.2802"></a>
-<span class="sourceLineNo">2803</span><a name="line.2803"></a>
-<span class="sourceLineNo">2804</span>    Scan scan = new Scan();<a name="line.2804"></a>
-<span class="sourceLineNo">2805</span>    scan.addFamily(fam2);<a name="line.2805"></a>
-<span class="sourceLineNo">2806</span>    scan.addFamily(fam4);<a name="line.2806"></a>
-<span class="sourceLineNo">2807</span>    InternalScanner is = region.getScanner(scan);<a name="line.2807"></a>
-<span class="sourceLineNo">2808</span><a name="line.2808"></a>
-<span class="sourceLineNo">2809</span>    List&lt;Cell&gt; res = null;<a name="line.2809"></a>
-<span class="sourceLineNo">2810</span><a name="line.2810"></a>
-<span class="sourceLineNo">2811</span>    // Result 1<a name="line.2811"></a>
-<span class="sourceLineNo">2812</span>    List&lt;Cell&gt; expected1 = new ArrayList&lt;&gt;();<a name="line.2812"></a>
-<span class="sourceLineNo">2813</span>    expected1.add(new KeyValue(row1, fam2, null, ts, KeyValue.Type.Put, null));<a name="line.2813"></a>
-<span class="sourceLineNo">2814</span>    expected1.add(new KeyValue(row1, fam4, null, ts, KeyValue.Type.Put, null));<a name="line.2814"></a>
-<span class="sourceLineNo">2815</span><a name="line.2815"></a>
-<span class="sourceLineNo">2816</span>    res = new ArrayList&lt;&gt;();<a name="line.2816"></a>
-<span class="sourceLineNo">2817</span>    is.next(res);<a name="line.2817"></a>
-<span class="sourceLineNo">2818</span>    for (int i = 0; i &lt; res.size(); i++) {<a name="line.2818"></a>
-<span class="sourceLineNo">2819</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected1.get(i), res.get(i)));<a name="line.2819"></a>
-<span class="sourceLineNo">2820</span>    }<a name="line.2820"></a>
-<span class="sourceLineNo">2821</span><a name="line.2821"></a>
-<span class="sourceLineNo">2822</span>    // Result 2<a name="line.2822"></a>
-<span class="sourceLineNo">2823</span>    List&lt;Cell&gt; expected2 = new ArrayList&lt;&gt;();<a name="line.2823"></a>
-<span class="sourceLineNo">2824</span>    expected2.add(new KeyValue(row2, fam2, null, ts, KeyValue.Type.Put, null));<a name="line.2824"></a>
-<span class="sourceLineNo">2825</span>    expected2.add(new KeyValue(row2, fam4, null, ts, KeyValue.Type.Put, null));<a name="line.2825"></a>
-<span class="sourceLineNo">2826</span><a name="line.2826"></a>
-<span class="sourceLineNo">2827</span>    res = new ArrayList&lt;&gt;();<a name="line.2827"></a>
-<span class="sourceLineNo">2828</span>    is.next(res);<a name="line.2828"></a>
-<span class="sourceLineNo">2829</span>    for (int i = 0; i &lt; res.size(); i++) {<a name="line.2829"></a>
-<span class="sourceLineNo">2830</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected2.get(i), res.get(i)));<a name="line.2830"></a>
-<span class="sourceLineNo">2831</span>    }<a name="line.2831"></a>
-<span class="sourceLineNo">2832</span>  }<a name="line.2832"></a>
-<span class="sourceLineNo">2833</span><a name="line.2833"></a>
-<span class="sourceLineNo">2834</span>  @Test<a name="line.2834"></a>
-<span class="sourceLineNo">2835</span>  public void testScanner_ExplicitColumns_FromMemStore_EnforceVersions() throws IOException {<a name="line.2835"></a>
-<span class="sourceLineNo">2836</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2836"></a>
-<span class="sourceLineNo">2837</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.2837"></a>
-<span class="sourceLineNo">2838</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.2838"></a>
-<span class="sourceLineNo">2839</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2839"></a>
-<span class="sourceLineNo">2840</span>    byte[][] families = { fam1 };<a name="line.2840"></a>
-<span class="sourceLineNo">2841</span><a name="line.2841"></a>
-<span class="sourceLineNo">2842</span>    long ts1 = System.currentTimeMillis();<a name="line.2842"></a>
-<span class="sourceLineNo">2843</span>    long ts2 = ts1 + 1;<a name="line.2843"></a>
-<span class="sourceLineNo">2844</span>    long ts3 = ts1 + 2;<a name="line.2844"></a>
-<span class="sourceLineNo">2845</span><a name="line.2845"></a>
-<span class="sourceLineNo">2846</span>    // Setting up region<a name="line.2846"></a>
-<span class="sourceLineNo">2847</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2847"></a>
-<span class="sourceLineNo">2848</span>    // Putting data in Region<a name="line.2848"></a>
-<span class="sourceLineNo">2849</span>    Put put = null;<a name="line.2849"></a>
-<span class="sourceLineNo">2850</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.2850"></a>
-<span class="sourceLineNo">2851</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.2851"></a>
-<span class="sourceLineNo">2852</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.2852"></a>
-<span class="sourceLineNo">2853</span><a name="line.2853"></a>
-<span class="sourceLineNo">2854</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.2854"></a>
-<span class="sourceLineNo">2855</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.2855"></a>
-<span class="sourceLineNo">2856</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.2856"></a>
-<span class="sourceLineNo">2857</span><a name="line.2857"></a>
-<span class="sourceLineNo">2858</span>    put = new Put(row1);<a name="line.2858"></a>
-<span class="sourceLineNo">2859</span>    put.add(kv13);<a name="line.2859"></a>
-<span class="sourceLineNo">2860</span>    put.add(kv12);<a name="line.2860"></a>
-<span class="sourceLineNo">2861</span>    put.add(kv11);<a name="line.2861"></a>
-<span class="sourceLineNo">2862</span>    put.add(kv23);<a name="line.2862"></a>
-<span class="sourceLineNo">2863</span>    put.add(kv22);<a name="line.2863"></a>
-<span class="sourceLineNo">2864</span>    put.add(kv21);<a name="line.2864"></a>
-<span class="sourceLineNo">2865</span>    region.put(put);<a name="line.2865"></a>
-<span class="sourceLineNo">2866</span><a name="line.2866"></a>
-<span class="sourceLineNo">2867</span>    // Expected<a name="line.2867"></a>
-<span class="sourceLineNo">2868</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.2868"></a>
-<span class="sourceLineNo">2869</span>    expected.add(kv13);<a name="line.2869"></a>
-<span class="sourceLineNo">2870</span>    expected.add(kv12);<a name="line.2870"></a>
-<span class="sourceLineNo">2871</span><a name="line.2871"></a>
-<span class="sourceLineNo">2872</span>    Scan scan = new Scan(row1);<a name="line.2872"></a>
-<span class="sourceLineNo">2873</span>    scan.addColumn(fam1, qf1);<a name="line.2873"></a>
-<span class="sourceLineNo">2874</span>    scan.setMaxVersions(MAX_VERSIONS);<a name="line.2874"></a>
-<span class="sourceLineNo">2875</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.2875"></a>
-<span class="sourceLineNo">2876</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.2876"></a>
-<span class="sourceLineNo">2877</span><a name="line.2877"></a>
-<span class="sourceLineNo">2878</span>    boolean hasNext = scanner.next(actual);<a name="line.2878"></a>
-<span class="sourceLineNo">2879</span>    assertEquals(false, hasNext);<a name="line.2879"></a>
-<span class="sourceLineNo">2880</span><a name="line.2880"></a>
-<span class="sourceLineNo">2881</span>    // Verify result<a name="line.2881"></a>
-<span class="sourceLineNo">2882</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.2882"></a>
-<span class="sourceLineNo">2883</span>      assertEquals(expected.get(i), actual.get(i));<a name="line.2883"></a>
-<span class="sourceLineNo">2884</span>    }<a name="line.2884"></a>
-<span class="sourceLineNo">2885</span>  }<a name="line.2885"></a>
-<span class="sourceLineNo">2886</span><a name="line.2886"></a>
-<span class="sourceLineNo">2887</span>  @Test<a name="line.2887"></a>
-<span class="sourceLineNo">2888</span>  public void testScanner_ExplicitColumns_FromFilesOnly_EnforceVersions() throws IOException {<a name="line.2888"></a>
-<span class="sourceLineNo">2889</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2889"></a>
-<span class="sourceLineNo">2890</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.2890"></a>
-<span class="sourceLineNo">2891</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.2891"></a>
-<span class="sourceLineNo">2892</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2892"></a>
-<span class="sourceLineNo">2893</span>    byte[][] families = { fam1 };<a name="line.2893"></a>
-<span class="sourceLineNo">2894</span><a name="line.2894"></a>
-<span class="sourceLineNo">2895</span>    long ts1 = 1; // System.currentTimeMillis();<a name="line.2895"></a>
-<span class="sourceLineNo">2896</span>    long ts2 = ts1 + 1;<a name="line.2896"></a>
-<span class="sourceLineNo">2897</span>    long ts3 = ts1 + 2;<a name="line.2897"></a>
-<span class="sourceLineNo">2898</span><a name="line.2898"></a>
-<span class="sourceLineNo">2899</span>    // Setting up region<a name="line.2899"></a>
-<span class="sourceLineNo">2900</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2900"></a>
-<span class="sourceLineNo">2901</span>    // Putting data in Region<a name="line.2901"></a>
-<span class="sourceLineNo">2902</span>    Put put = null;<a name="line.2902"></a>
-<span class="sourceLineNo">2903</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.2903"></a>
-<span class="sourceLineNo">2904</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.2904"></a>
-<span class="sourceLineNo">2905</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.2905"></a>
-<span class="sourceLineNo">2906</span><a name="line.2906"></a>
-<span class="sourceLineNo">2907</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.2907"></a>
-<span class="sourceLineNo">2908</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.2908"></a>
-<span class="sourceLineNo">2909</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.2909"></a>
-<span class="sourceLineNo">2910</span><a name="line.2910"></a>
-<span class="sourceLineNo">2911</span>    put = new Put(row1);<a name="line.2911"></a>
-<span class="sourceLineNo">2912</span>    put.add(kv13);<a name="line.2912"></a>
-<span class="sourceLineNo">2913</span>    put.add(kv12);<a name="line.2913"></a>
-<span class="sourceLineNo">2914</span>    put.add(kv11);<a name="line.2914"></a>
-<span class="sourceLineNo">2915</span>    put.add(kv23);<a name="line.2915"></a>
-<span class="sourceLineNo">2916</span>    put.add(kv22);<a name="line.2916"></a>
-<span class="sourceLineNo">2917</span>    put.add(kv21);<a name="line.2917"></a>
-<span class="sourceLineNo">2918</span>    region.put(put);<a name="line.2918"></a>
-<span class="sourceLineNo">2919</span>    region.flush(true);<a name="line.2919"></a>
+<span class="sourceLineNo">2768</span>      e.printStackTrace();<a name="line.2768"></a>
+<span class="sourceLineNo">2769</span>      fail("Got IOException during initHRegion, " + e.getMessage());<a name="line.2769"></a>
+<span class="sourceLineNo">2770</span>    }<a name="line.2770"></a>
+<span class="sourceLineNo">2771</span>    region.closed.set(true);<a name="line.2771"></a>
+<span class="sourceLineNo">2772</span>    try {<a name="line.2772"></a>
+<span class="sourceLineNo">2773</span>      region.getScanner(null);<a name="line.2773"></a>
+<span class="sourceLineNo">2774</span>      fail("Expected to get an exception during getScanner on a region that is closed");<a name="line.2774"></a>
+<span class="sourceLineNo">2775</span>    } catch (NotServingRegionException e) {<a name="line.2775"></a>
+<span class="sourceLineNo">2776</span>      // this is the correct exception that is expected<a name="line.2776"></a>
+<span class="sourceLineNo">2777</span>    } catch (IOException e) {<a name="line.2777"></a>
+<span class="sourceLineNo">2778</span>      fail("Got wrong type of exception - should be a NotServingRegionException, " +<a name="line.2778"></a>
+<span class="sourceLineNo">2779</span>          "but was an IOException: "<a name="line.2779"></a>
+<span class="sourceLineNo">2780</span>          + e.getMessage());<a name="line.2780"></a>
+<span class="sourceLineNo">2781</span>    }<a name="line.2781"></a>
+<span class="sourceLineNo">2782</span>  }<a name="line.2782"></a>
+<span class="sourceLineNo">2783</span><a name="line.2783"></a>
+<span class="sourceLineNo">2784</span>  @Test<a name="line.2784"></a>
+<span class="sourceLineNo">2785</span>  public void testRegionScanner_Next() throws IOException {<a name="line.2785"></a>
+<span class="sourceLineNo">2786</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2786"></a>
+<span class="sourceLineNo">2787</span>    byte[] row2 = Bytes.toBytes("row2");<a name="line.2787"></a>
+<span class="sourceLineNo">2788</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2788"></a>
+<span class="sourceLineNo">2789</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2789"></a>
+<span class="sourceLineNo">2790</span>    byte[] fam3 = Bytes.toBytes("fam3");<a name="line.2790"></a>
+<span class="sourceLineNo">2791</span>    byte[] fam4 = Bytes.toBytes("fam4");<a name="line.2791"></a>
+<span class="sourceLineNo">2792</span><a name="line.2792"></a>
+<span class="sourceLineNo">2793</span>    byte[][] families = { fam1, fam2, fam3, fam4 };<a name="line.2793"></a>
+<span class="sourceLineNo">2794</span>    long ts = System.currentTimeMillis();<a name="line.2794"></a>
+<span class="sourceLineNo">2795</span><a name="line.2795"></a>
+<span class="sourceLineNo">2796</span>    // Setting up region<a name="line.2796"></a>
+<span class="sourceLineNo">2797</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2797"></a>
+<span class="sourceLineNo">2798</span>    // Putting data in Region<a name="line.2798"></a>
+<span class="sourceLineNo">2799</span>    Put put = null;<a name="line.2799"></a>
+<span class="sourceLineNo">2800</span>    put = new Put(row1);<a name="line.2800"></a>
+<span class="sourceLineNo">2801</span>    put.addColumn(fam1, (byte[]) null, ts, null);<a name="line.2801"></a>
+<span class="sourceLineNo">2802</span>    put.addColumn(fam2, (byte[]) null, ts, null);<a name="line.2802"></a>
+<span class="sourceLineNo">2803</span>    put.addColumn(fam3, (byte[]) null, ts, null);<a name="line.2803"></a>
+<span class="sourceLineNo">2804</span>    put.addColumn(fam4, (byte[]) null, ts, null);<a name="line.2804"></a>
+<span class="sourceLineNo">2805</span>    region.put(put);<a name="line.2805"></a>
+<span class="sourceLineNo">2806</span><a name="line.2806"></a>
+<span class="sourceLineNo">2807</span>    put = new Put(row2);<a name="line.2807"></a>
+<span class="sourceLineNo">2808</span>    put.addColumn(fam1, (byte[]) null, ts, null);<a name="line.2808"></a>
+<span class="sourceLineNo">2809</span>    put.addColumn(fam2, (byte[]) null, ts, null);<a name="line.2809"></a>
+<span class="sourceLineNo">2810</span>    put.addColumn(fam3, (byte[]) null, ts, null);<a name="line.2810"></a>
+<span class="sourceLineNo">2811</span>    put.addColumn(fam4, (byte[]) null, ts, null);<a name="line.2811"></a>
+<span class="sourceLineNo">2812</span>    region.put(put);<a name="line.2812"></a>
+<span class="sourceLineNo">2813</span><a name="line.2813"></a>
+<span class="sourceLineNo">2814</span>    Scan scan = new Scan();<a name="line.2814"></a>
+<span class="sourceLineNo">2815</span>    scan.addFamily(fam2);<a name="line.2815"></a>
+<span class="sourceLineNo">2816</span>    scan.addFamily(fam4);<a name="line.2816"></a>
+<span class="sourceLineNo">2817</span>    InternalScanner is = region.getScanner(scan);<a name="line.2817"></a>
+<span class="sourceLineNo">2818</span><a name="line.2818"></a>
+<span class="sourceLineNo">2819</span>    List&lt;Cell&gt; res = null;<a name="line.2819"></a>
+<span class="sourceLineNo">2820</span><a name="line.2820"></a>
+<span class="sourceLineNo">2821</span>    // Result 1<a name="line.2821"></a>
+<span class="sourceLineNo">2822</span>    List&lt;Cell&gt; expected1 = new ArrayList&lt;&gt;();<a name="line.2822"></a>
+<span class="sourceLineNo">2823</span>    expected1.add(new KeyValue(row1, fam2, null, ts, KeyValue.Type.Put, null));<a name="line.2823"></a>
+<span class="sourceLineNo">2824</span>    expected1.add(new KeyValue(row1, fam4, null, ts, KeyValue.Type.Put, null));<a name="line.2824"></a>
+<span class="sourceLineNo">2825</span><a name="line.2825"></a>
+<span class="sourceLineNo">2826</span>    res = new ArrayList&lt;&gt;();<a name="line.2826"></a>
+<span class="sourceLineNo">2827</span>    is.next(res);<a name="line.2827"></a>
+<span class="sourceLineNo">2828</span>    for (int i = 0; i &lt; res.size(); i++) {<a name="line.2828"></a>
+<span class="sourceLineNo">2829</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected1.get(i), res.get(i)));<a name="line.2829"></a>
+<span class="sourceLineNo">2830</span>    }<a name="line.2830"></a>
+<span class="sourceLineNo">2831</span><a name="line.2831"></a>
+<span class="sourceLineNo">2832</span>    // Result 2<a name="line.2832"></a>
+<span class="sourceLineNo">2833</span>    List&lt;Cell&gt; expected2 = new ArrayList&lt;&gt;();<a name="line.2833"></a>
+<span class="sourceLineNo">2834</span>    expected2.add(new KeyValue(row2, fam2, null, ts, KeyValue.Type.Put, null));<a name="line.2834"></a>
+<span class="sourceLineNo">2835</span>    expected2.add(new KeyValue(row2, fam4, null, ts, KeyValue.Type.Put, null));<a name="line.2835"></a>
+<span class="sourceLineNo">2836</span><a name="line.2836"></a>
+<span class="sourceLineNo">2837</span>    res = new ArrayList&lt;&gt;();<a name="line.2837"></a>
+<span class="sourceLineNo">2838</span>    is.next(res);<a name="line.2838"></a>
+<span class="sourceLineNo">2839</span>    for (int i = 0; i &lt; res.size(); i++) {<a name="line.2839"></a>
+<span class="sourceLineNo">2840</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected2.get(i), res.get(i)));<a name="line.2840"></a>
+<span class="sourceLineNo">2841</span>    }<a name="line.2841"></a>
+<span class="sourceLineNo">2842</span>  }<a name="line.2842"></a>
+<span class="sourceLineNo">2843</span><a name="line.2843"></a>
+<span class="sourceLineNo">2844</span>  @Test<a name="line.2844"></a>
+<span class="sourceLineNo">2845</span>  public void testScanner_ExplicitColumns_FromMemStore_EnforceVersions() throws IOException {<a name="line.2845"></a>
+<span class="sourceLineNo">2846</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2846"></a>
+<span class="sourceLineNo">2847</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.2847"></a>
+<span class="sourceLineNo">2848</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.2848"></a>
+<span class="sourceLineNo">2849</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2849"></a>
+<span class="sourceLineNo">2850</span>    byte[][] families = { fam1 };<a name="line.2850"></a>
+<span class="sourceLineNo">2851</span><a name="line.2851"></a>
+<span class="sourceLineNo">2852</span>    long ts1 = System.currentTimeMillis();<a name="line.2852"></a>
+<span class="sourceLineNo">2853</span>    long ts2 = ts1 + 1;<a name="line.2853"></a>
+<span class="sourceLineNo">2854</span>    long ts3 = ts1 + 2;<a name="line.2854"></a>
+<span class="sourceLineNo">2855</span><a name="line.2855"></a>
+<span class="sourceLineNo">2856</span>    // Setting up region<a name="line.2856"></a>
+<span class="sourceLineNo">2857</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2857"></a>
+<span class="sourceLineNo">2858</span>    // Putting data in Region<a name="line.2858"></a>
+<span class="sourceLineNo">2859</span>    Put put = null;<a name="line.2859"></a>
+<span class="sourceLineNo">2860</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.2860"></a>
+<span class="sourceLineNo">2861</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.2861"></a>
+<span class="sourceLineNo">2862</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.2862"></a>
+<span class="sourceLineNo">2863</span><a name="line.2863"></a>
+<span class="sourceLineNo">2864</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.2864"></a>
+<span class="sourceLineNo">2865</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.2865"></a>
+<span class="sourceLineNo">2866</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.2866"></a>
+<span class="sourceLineNo">2867</span><a name="line.2867"></a>
+<span class="sourceLineNo">2868</span>    put = new Put(row1);<a name="line.2868"></a>
+<span class="sourceLineNo">2869</span>    put.add(kv13);<a name="line.2869"></a>
+<span class="sourceLineNo">2870</span>    put.add(kv12);<a name="line.2870"></a>
+<span class="sourceLineNo">2871</span>    put.add(kv11);<a name="line.2871"></a>
+<span class="sourceLineNo">2872</span>    put.add(kv23);<a name="line.2872"></a>
+<span class="sourceLineNo">2873</span>    put.add(kv22);<a name="line.2873"></a>
+<span class="sourceLineNo">2874</span>    put.add(kv21);<a name="line.2874"></a>
+<span class="sourceLineNo">2875</span>    region.put(put);<a name="line.2875"></a>
+<span class="sourceLineNo">2876</span><a name="line.2876"></a>
+<span class="sourceLineNo">2877</span>    // Expected<a name="line.2877"></a>
+<span class="sourceLineNo">2878</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.2878"></a>
+<span class="sourceLineNo">2879</span>    expected.add(kv13);<a name="line.2879"></a>
+<span class="sourceLineNo">2880</span>    expected.add(kv12);<a name="line.2880"></a>
+<span class="sourceLineNo">2881</span><a name="line.2881"></a>
+<span class="sourceLineNo">2882</span>    Scan scan = new Scan(row1);<a name="line.2882"></a>
+<span class="sourceLineNo">2883</span>    scan.addColumn(fam1, qf1);<a name="line.2883"></a>
+<span class="sourceLineNo">2884</span>    scan.setMaxVersions(MAX_VERSIONS);<a name="line.2884"></a>
+<span class="sourceLineNo">2885</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.2885"></a>
+<span class="sourceLineNo">2886</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.2886"></a>
+<span class="sourceLineNo">2887</span><a name="line.2887"></a>
+<span class="sourceLineNo">2888</span>    boolean hasNext = scanner.next(actual);<a name="line.2888"></a>
+<span class="sourceLineNo">2889</span>    assertEquals(false, hasNext);<a name="line.2889"></a>
+<span class="sourceLineNo">2890</span><a name="line.2890"></a>
+<span class="sourceLineNo">2891</span>    // Verify result<a name="line.2891"></a>
+<span class="sourceLineNo">2892</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.2892"></a>
+<span class="sourceLineNo">2893</span>      assertEquals(expected.get(i), actual.get(i));<a name="line.2893"></a>
+<span class="sourceLineNo">2894</span>    }<a name="line.2894"></a>
+<span class="sourceLineNo">2895</span>  }<a name="line.2895"></a>
+<span class="sourceLineNo">2896</span><a name="line.2896"></a>
+<span class="sourceLineNo">2897</span>  @Test<a name="line.2897"></a>
+<span class="sourceLineNo">2898</span>  public void testScanner_ExplicitColumns_FromFilesOnly_EnforceVersions() throws IOException {<a name="line.2898"></a>
+<span class="sourceLineNo">2899</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2899"></a>
+<span class="sourceLineNo">2900</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.2900"></a>
+<span class="sourceLineNo">2901</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.2901"></a>
+<span class="sourceLineNo">2902</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2902"></a>
+<span class="sourceLineNo">2903</span>    byte[][] families = { fam1 };<a name="line.2903"></a>
+<span class="sourceLineNo">2904</span><a name="line.2904"></a>
+<span class="sourceLineNo">2905</span>    long ts1 = 1; // System.currentTimeMillis();<a name="line.2905"></a>
+<span class="sourceLineNo">2906</span>    long ts2 = ts1 + 1;<a name="line.2906"></a>
+<span class="sourceLineNo">2907</span>    long ts3 = ts1 + 2;<a name="line.2907"></a>
+<span class="sourceLineNo">2908</span><a name="line.2908"></a>
+<span class="sourceLineNo">2909</span>    // Setting up region<a name="line.2909"></a>
+<span class="sourceLineNo">2910</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2910"></a>
+<span class="sourceLineNo">2911</span>    // Putting data in Region<a name="line.2911"></a>
+<span class="sourceLineNo">2912</span>    Put put = null;<a name="line.2912"></a>
+<span class="sourceLineNo">2913</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.2913"></a>
+<span class="sourceLineNo">2914</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.2914"></a>
+<span class="sourceLineNo">2915</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.2915"></a>
+<span class="sourceLineNo">2916</span><a name="line.2916"></a>
+<span class="sourceLineNo">2917</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.2917"></a>
+<span class="sourceLineNo">2918</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.2918"></a>
+<span class="sourceLineNo">2919</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.2919"></a>
 <span class="sourceLineNo">2920</span><a name="line.2920"></a>
-<span class="sourceLineNo">2921</span>    // Expected<a name="line.2921"></a>
-<span class="sourceLineNo">2922</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.2922"></a>
-<span class="sourceLineNo">2923</span>    expected.add(kv13);<a name="line.2923"></a>
-<span class="sourceLineNo">2924</span>    expected.add(kv12);<a name="line.2924"></a>
-<span class="sourceLineNo">2925</span>    expected.add(kv23);<a name="line.2925"></a>
-<span class="sourceLineNo">2926</span>    expected.add(kv22);<a name="line.2926"></a>
-<span class="sourceLineNo">2927</span><a name="line.2927"></a>
-<span class="sourceLineNo">2928</span>    Scan scan = new Scan(row1);<a name="line.2928"></a>
-<span class="sourceLineNo">2929</span>    scan.addColumn(fam1, qf1);<a name="line.2929"></a>
-<span class="sourceLineNo">2930</span>    scan.addColumn(fam1, qf2);<a name="line.2930"></a>
-<span class="sourceLineNo">2931</span>    scan.setMaxVersions(MAX_VERSIONS);<a name="line.2931"></a>
-<span class="sourceLineNo">2932</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.2932"></a>
-<span class="sourceLineNo">2933</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.2933"></a>
-<span class="sourceLineNo">2934</span><a name="line.2934"></a>
-<span class="sourceLineNo">2935</span>    boolean hasNext = scanner.next(actual);<a name="line.2935"></a>
-<span class="sourceLineNo">2936</span>    assertEquals(false, hasNext);<a name="line.2936"></a>
+<span class="sourceLineNo">2921</span>    put = new Put(row1);<a name="line.2921"></a>
+<span class="sourceLineNo">2922</span>    put.add(kv13);<a name="line.2922"></a>
+<span class="sourceLineNo">2923</span>    put.add(kv12);<a name="line.2923"></a>
+<span class="sourceLineNo">2924</span>    put.add(kv11);<a name="line.2924"></a>
+<span class="sourceLineNo">2925</span>    put.add(kv23);<a name="line.2925"></a>
+<span class="sourceLineNo">2926</span>    put.add(kv22);<a name="line.2926"></a>
+<span class="sourceLineNo">2927</span>    put.add(kv21);<a name="line.2927"></a>
+<span class="sourceLineNo">2928</span>    region.put(put);<a name="line.2928"></a>
+<span class="sourceLineNo">2929</span>    region.flush(true);<a name="line.2929"></a>
+<span class="sourceLineNo">2930</span><a name="line.2930"></a>
+<span class="sourceLineNo">2931</span>    // Expected<a name="line.2931"></a>
+<span class="sourceLineNo">2932</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.2932"></a>
+<span class="sourceLineNo">2933</span>    expected.add(kv13);<a name="line.2933"></a>
+<span class="sourceLineNo">2934</span>    expected.add(kv12);<a name="line.2934"></a>
+<span class="sourceLineNo">2935</span>    expected.add(kv23);<a name="line.2935"></a>
+<span class="sourceLineNo">2936</span>    expected.add(kv22);<a name="line.2936"></a>
 <span class="sourceLineNo">2937</span><a name="line.2937"></a>
-<span class="sourceLineNo">2938</span>    // Verify result<a name="line.2938"></a>
-<span class="sourceLineNo">2939</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.2939"></a>
-<span class="sourceLineNo">2940</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected.get(i), actual.get(i)));<a name="line.2940"></a>
-<span class="sourceLineNo">2941</span>    }<a name="line.2941"></a>
-<span class="sourceLineNo">2942</span>  }<a name="line.2942"></a>
-<span class="sourceLineNo">2943</span><a name="line.2943"></a>
-<span class="sourceLineNo">2944</span>  @Test<a name="line.2944"></a>
-<span class="sourceLineNo">2945</span>  public void testScanner_ExplicitColumns_FromMemStoreAndFiles_EnforceVersions() throws<a name="line.2945"></a>
-<span class="sourceLineNo">2946</span>      IOException {<a name="line.2946"></a>
-<span class="sourceLineNo">2947</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2947"></a>
-<span class="sourceLineNo">2948</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2948"></a>
-<span class="sourceLineNo">2949</span>    byte[][] families = { fam1 };<a name="line.2949"></a>
-<span class="sourceLineNo">2950</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.2950"></a>
-<span class="sourceLineNo">2951</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.2951"></a>
-<span class="sourceLineNo">2952</span><a name="line.2952"></a>
-<span class="sourceLineNo">2953</span>    long ts1 = 1;<a name="line.2953"></a>
-<span class="sourceLineNo">2954</span>    long ts2 = ts1 + 1;<a name="line.2954"></a>
-<span class="sourceLineNo">2955</span>    long ts3 = ts1 + 2;<a name="line.2955"></a>
-<span class="sourceLineNo">2956</span>    long ts4 = ts1 + 3;<a name="line.2956"></a>
-<span class="sourceLineNo">2957</span><a name="line.2957"></a>
-<span class="sourceLineNo">2958</span>    // Setting up region<a name="line.2958"></a>
-<span class="sourceLineNo">2959</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2959"></a>
-<span class="sourceLineNo">2960</span>    // Putting data in Region<a name="line.2960"></a>
-<span class="sourceLineNo">2961</span>    KeyValue kv14 = new KeyValue(row1, fam1, qf1, ts4, KeyValue.Type.Put, null);<a name="line.2961"></a>
-<span class="sourceLineNo">2962</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.2962"></a>
-<span class="sourceLineNo">2963</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.2963"></a>
-<span class="sourceLineNo">2964</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.2964"></a>
-<span class="sourceLineNo">2965</span><a name="line.2965"></a>
-<span class="sourceLineNo">2966</span>    KeyValue kv24 = new KeyValue(row1, fam1, qf2, ts4, KeyValue.Type.Put, null);<a name="line.2966"></a>
-<span class="sourceLineNo">2967</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.2967"></a>
-<span class="sourceLineNo">2968</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.2968"></a>
-<span class="sourceLineNo">2969</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.2969"></a>
-<span class="sourceLineNo">2970</span><a name="line.2970"></a>
-<span class="sourceLineNo">2971</span>    Put put = null;<a name="line.2971"></a>
-<span class="sourceLineNo">2972</span>    put = new Put(row1);<a name="line.2972"></a>
-<span class="sourceLineNo">2973</span>    put.add(kv14);<a name="line.2973"></a>
-<span class="sourceLineNo">2974</span>    put.add(kv24);<a name="line.2974"></a>
-<span class="sourceLineNo">2975</span>    region.put(put);<a name="line.2975"></a>
-<span class="sourceLineNo">2976</span>    region.flush(true);<a name="line.2976"></a>
-<span class="sourceLineNo">2977</span><a name="line.2977"></a>
-<span class="sourceLineNo">2978</span>    put = new Put(row1);<a name="line.2978"></a>
-<span class="sourceLineNo">2979</span>    put.add(kv23);<a name="line.2979"></a>
-<span class="sourceLineNo">2980</span>    put.add(kv13);<a name="line.2980"></a>
-<span class="sourceLineNo">2981</span>    region.put(put);<a name="line.2981"></a>
-<span class="sourceLineNo">2982</span>    region.flush(true);<a name="line.2982"></a>
-<span class="sourceLineNo">2983</span><a name="line.2983"></a>
-<span class="sourceLineNo">2984</span>    put = new Put(row1);<a name="line.2984"></a>
-<span class="sourceLineNo">2985</span>    put.add(kv22);<a name="line.2985"></a>
-<span class="sourceLineNo">2986</span>    put.add(kv12);<a name="line.2986"></a>
-<span class="sourceLineNo">2987</span>    region.put(put);<a name="line.2987"></a>
-<span class="sourceLineNo">2988</span>    region.flush(true);<a name="line.2988"></a>
-<span class="sourceLineNo">2989</span><a name="line.2989"></a>
-<span class="sourceLineNo">2990</span>    put = new Put(row1);<a name="line.2990"></a>
-<span class="sourceLineNo">2991</span>    put.add(kv21);<a name="line.2991"></a>
-<span class="sourceLineNo">2992</span>    put.add(kv11);<a name="line.2992"></a>
-<span class="sourceLineNo">2993</span>    region.put(put);<a name="line.2993"></a>
-<span class="sourceLineNo">2994</span><a name="line.2994"></a>
-<span class="sourceLineNo">2995</span>    // Expected<a name="line.2995"></a>
-<span class="sourceLineNo">2996</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.2996"></a>
-<span class="sourceLineNo">2997</span>    expected.add(kv14);<a name="line.2997"></a>
-<span class="sourceLineNo">2998</span>    expected.add(kv13);<a name="line.2998"></a>
-<span class="sourceLineNo">2999</span>    expected.add(kv12);<a name="line.2999"></a>
-<span class="sourceLineNo">3000</span>    expected.add(kv24);<a name="line.3000"></a>
-<span class="sourceLineNo">3001</span>    expected.add(kv23);<a name="line.3001"></a>
-<span class="sourceLineNo">3002</span>    expected.add(kv22);<a name="line.3002"></a>
-<span class="sourceLineNo">3003</span><a name="line.3003"></a>
-<span class="sourceLineNo">3004</span>    Scan scan = new Scan(row1);<a name="line.3004"></a>
-<span class="sourceLineNo">3005</span>    scan.addColumn(fam1, qf1);<a name="line.3005"></a>
-<span class="sourceLineNo">3006</span>    scan.addColumn(fam1, qf2);<a name="line.3006"></a>
-<span class="sourceLineNo">3007</span>    int versions = 3;<a name="line.3007"></a>
-<span class="sourceLineNo">3008</span>    scan.setMaxVersions(versions);<a name="line.3008"></a>
-<span class="sourceLineNo">3009</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.3009"></a>
-<span class="sourceLineNo">3010</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.3010"></a>
-<span class="sourceLineNo">3011</span><a name="line.3011"></a>
-<span class="sourceLineNo">3012</span>    boolean hasNext = scanner.next(actual);<a name="line.3012"></a>
-<span class="sourceLineNo">3013</span>    assertEquals(false, hasNext);<a name="line.3013"></a>
-<span class="sourceLineNo">3014</span><a name="line.3014"></a>
-<span class="sourceLineNo">3015</span>    // Verify result<a name="line.3015"></a>
-<span class="sourceLineNo">3016</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.3016"></a>
-<span class="sourceLineNo">3017</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected.get(i), actual.get(i)));<a name="line.3017"></a>
-<span class="sourceLineNo">3018</span>    }<a name="line.3018"></a>
-<span class="sourceLineNo">3019</span>  }<a name="line.3019"></a>
-<span class="sourceLineNo">3020</span><a name="line.3020"></a>
-<span class="sourceLineNo">3021</span>  @Test<a name="line.3021"></a>
-<span class="sourceLineNo">3022</span>  public void testScanner_Wildcard_FromMemStore_EnforceVersions() throws IOException {<a name="line.3022"></a>
-<span class="sourceLineNo">3023</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.3023"></a>
-<span class="sourceLineNo">3024</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.3024"></a>
-<span class="sourceLineNo">3025</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.3025"></a>
-<span class="sourceLineNo">3026</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.3026"></a>
-<span class="sourceLineNo">3027</span>    byte[][] families = { fam1 };<a name="line.3027"></a>
-<span class="sourceLineNo">3028</span><a name="line.3028"></a>
-<span class="sourceLineNo">3029</span>    long ts1 = System.currentTimeMillis();<a name="line.3029"></a>
-<span class="sourceLineNo">3030</span>    long ts2 = ts1 + 1;<a name="line.3030"></a>
-<span class="sourceLineNo">3031</span>    long ts3 = ts1 + 2;<a name="line.3031"></a>
-<span class="sourceLineNo">3032</span><a name="line.3032"></a>
-<span class="sourceLineNo">3033</span>    // Setting up region<a name="line.3033"></a>
-<span class="sourceLineNo">3034</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.3034"></a>
-<span class="sourceLineNo">3035</span>    // Putting data in Region<a name="line.3035"></a>
-<span class="sourceLineNo">3036</span>    Put put = null;<a name="line.3036"></a>
-<span class="sourceLineNo">3037</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.3037"></a>
-<span class="sourceLineNo">3038</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.3038"></a>
-<span class="sourceLineNo">3039</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.3039"></a>
-<span class="sourceLineNo">3040</span><a name="line.3040"></a>
-<span class="sourceLineNo">3041</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.3041"></a>
-<span class="sourceLineNo">3042</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.3042"></a>
-<span class="sourceLineNo">3043</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.3043"></a>
-<span class="sourceLineNo">3044</span><a name="line.3044"></a>
-<span class="sourceLineNo">3045</span>    put = new Put(row1);<a name="line.3045"></a>
-<span class="sourceLineNo">3046</span>    put.add(kv13);<a name="line.3046"></a>
-<span class="sourceLineNo">3047</span>    put.add(kv12);<a name="line.3047"></a>
-<span class="sourceLineNo">3048</span>    put.add(kv11);<a name="line.3048"></a>
-<span class="sourceLineNo">3049</span>    put.add(kv23);<a name="line.3049"></a>
-<span class="sourceLineNo">3050</span>    put.add(kv22);<a name="line.3050"></a>
-<span class="sourceLineNo">3051</span>    put.add(kv21);<a name="line.3051"></a>
-<span class="sourceLineNo">3052</span>    region.put(put);<a name="line.3052"></a>
-<span class="sourceLineNo">3053</span><a name="line.3053"></a>
-<span class="sourceLineNo">3054</span>    // Expected<a name="line.3054"></a>
-<span class="sourceLineNo">3055</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.3055"></a>
-<span class="sourceLineNo">3056</span>    expected.add(kv13);<a name="line.3056"></a>
-<span class="sourceLineNo">3057</span>    expected.add(kv12);<a name="line.3057"></a>
-<span class="sourceLineNo">3058</span>    expected.add(kv23);<a name="line.3058"></a>
-<span class="sourceLineNo">3059</span>    expected.add(kv22);<a name="line.3059"></a>
-<span class="sourceLineNo">3060</span><a name="line.3060"></a>
-<span class="sourceLineNo">3061</span>    Scan scan = new Scan(row1);<a name="line.3061"></a>
-<span class="sourceLineNo">3062</span>    scan.addFamily(fam1);<a name="line.3062"></a>
-<span class="sourceLineNo">3063</span>    scan.setMaxVersions(MAX_VERSIONS);<a name="line.3063"></a>
-<span class="sourceLineNo">3064</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.3064"></a>
-<span class="sourceLineNo">3065</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.3065"></a>
-<span class="sourceLineNo">3066</span><a name="line.3066"></a>
-<span class="sourceLineNo">3067</span>    boolean hasNext = scanner.next(actual);<a name="line.3067"></a>
-<span class="sourceLineNo">3068</span>    assertEquals(false, hasNext);<a name="line.3068"></a>
-<span class="sourceLineNo">3069</span><a name="line.3069"></a>
-<span class="sourceLineNo">3070</span>    // Verify result<a name="line.3070"></a>
-<span class="sourceLineNo">3071</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.3071"></a>
-<span class="sourceLineNo">3072</span>      assertEquals(expected.get(i), actual.get(i));<a name="line.3072"></a>
-<span class="sourceLineNo">3073</span>    }<a name="line.3073"></a>
-<span class="sourceLineNo">3074</span>  }<a name="line.3074"></a>
-<span class="sourceLineNo">3075</span><a name="line.3075"></a>
-<span class="sourceLineNo">3076</span>  @Test<a name="line.3076"></a>
-<span class="sourceLineNo">3077</span>  public void testScanner_Wildcard_FromFilesOnly_EnforceVersions() throws IOException {<a name="line.3077"></a>
-<span class="sourceLineNo">3078</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.3078"></a>
-<span class="sourceLineNo">3079</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.3079"></a>
-<span class="sourceLineNo">3080</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.3080"></a>
-<span class="sourceLineNo">3081</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.3081"></a>
-<span class="sourceLineNo">3082</span><a name="line.3082"></a>
-<span class="sourceLineNo">3083</span>    long ts1 = 1; // System.currentTimeMillis();<a name="line.3083"></a>
-<span class="sourceLineNo">3084</span>    long ts2 = ts1 + 1;<a name="line.3084"></a>
-<span class="sourceLineNo">3085</span>    long ts3 = ts1 + 2;<a name="line.3085"></a>
-<span class="sourceLineNo">3086</span><a name="line.3086"></a>
-<span class="sourceLineNo">3087</span>    // Setting up region<a name="line.3087"></a>
-<span class="sourceLineNo">3088</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.3088"></a>
-<span class="sourceLineNo">3089</span>    // Putting data in Region<a name="line.3089"></a>
-<span class="sourceLineNo">3090</span>    Put put = null;<a name="line.3090"></a>
-<span class="sourceLineNo">3091</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.3091"></a>
-<span class="sourceLineNo">3092</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.3092"></a>
-<span class="sourceLineNo">3093</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.3093"></a>
-<span class="sourceLineNo">3094</span><a name="line.3094"></a>
-<span class="sourceLineNo">3095</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.3095"></a>
-<span class="sourceLineNo">3096</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.3096"></a>
-<span class="sourceLineNo">3097</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.3097"></a>
-<span class="sourceLineNo">3098</span><a name="line.3098"></a>
-<span class="sourceLineNo">3099</span>    put = new Put(row1);<a name="line.3099"></a>
-<span class="sourceLineNo">3100</span>    put.add(kv13);<a name="line.3100"></a>
-<span class="sourceLineNo">3101</span>    put.add(kv12);<a name="line.3101"></a>
-<span class="sourceLineNo">3102</span>    put.add(kv11);<a name="line.3102"></a>
-<span class="sourceLineNo">3103</span>    put.add(kv23);<a name="line.3103"></a>
-<span class="sourceLineNo">3104</span>    put.add(kv22);<a name="line.3104"></a>
-<span class="sourceLineNo">3105</span>    put.add(kv21);<a name="line.3105"></a>
-<span class="sourceLineNo">3106</span>    region.put(put);<a name="line.3106"></a>
-<span class="sourceLineNo">3107</span>    region.flush(true);<a name="line.3107"></a>
+<span class="sourceLineNo">2938</span>    Scan scan = new Scan(row1);<a name="line.2938"></a>
+<span class="sourceLineNo">2939</span>    scan.addColumn(fam1, qf1);<a name="line.2939"></a>
+<span class="sourceLineNo">2940</span>    scan.addColumn(fam1, qf2);<a name="line.2940"></a>
+<span class="sourceLineNo">2941</span>    scan.setMaxVersions(MAX_VERSIONS);<a name="line.2941"></a>
+<span class="sourceLineNo">2942</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.2942"></a>
+<span class="sourceLineNo">2943</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.2943"></a>
+<span class="sourceLineNo">2944</span><a name="line.2944"></a>
+<span class="sourceLineNo">2945</span>    boolean hasNext = scanner.next(actual);<a name="line.2945"></a>
+<span class="sourceLineNo">2946</span>    assertEquals(false, hasNext);<a name="line.2946"></a>
+<span class="sourceLineNo">2947</span><a name="line.2947"></a>
+<span class="sourceLineNo">2948</span>    // Verify result<a name="line.2948"></a>
+<span class="sourceLineNo">2949</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.2949"></a>
+<span class="sourceLineNo">2950</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected.get(i), actual.get(i)));<a name="line.2950"></a>
+<span class="sourceLineNo">2951</span>    }<a name="line.2951"></a>
+<span class="sourceLineNo">2952</span>  }<a name="line.2952"></a>
+<span class="sourceLineNo">2953</span><a name="line.2953"></a>
+<span class="sourceLineNo">2954</span>  @Test<a name="line.2954"></a>
+<span class="sourceLineNo">2955</span>  public void testScanner_ExplicitColumns_FromMemStoreAndFiles_EnforceVersions() throws<a name="line.2955"></a>
+<span class="sourceLineNo">2956</span>      IOException {<a name="line.2956"></a>
+<span class="sourceLineNo">2957</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2957"></a>
+<span class="sourceLineNo">2958</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2958"></a>
+<span class="sourceLineNo">2959</span>    byte[][] families = { fam1 };<a name="line.2959"></a>
+<span class="sourceLineNo">2960</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.2960"></a>
+<span class="sourceLineNo">2961</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.2961"></a>
+<span class="sourceLineNo">2962</span><a name="line.2962"></a>
+<span class="sourceLineNo">2963</span>    long ts1 = 1;<a name="line.2963"></a>
+<span class="sourceLineNo">2964</span>    long ts2 = ts1 + 1;<a name="line.2964"></a>
+<span class="sourceLineNo">2965</span>    long ts3 = ts1 + 2;<a name="line.2965"></a>
+<span class="sourceLineNo">2966</span>    long ts4 = ts1 + 3;<a name="line.2966"></a>
+<span class="sourceLineNo">2967</span><a name="line.2967"></a>
+<span class="sourceLineNo">2968</span>    // Setting up region<a name="line.2968"></a>
+<span class="sourceLineNo">2969</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2969"></a>
+<span class="sourceLineNo">2970</span>    // Putting data in Region<a name="line.2970"></a>
+<span class="sourceLineNo">2971</span>    KeyValue kv14 = new KeyValue(row1, fam1, qf1, ts4, KeyValue.Type.Put, null);<a name="line.2971"></a>
+<span class="sourceLineNo">2972</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.2972"></a>
+<span class="sourceLineNo">2973</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.2973"></a>
+<span class="sourceLineNo">2974</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.2974"></a>
+<span class="sourceLineNo">2975</span><a name="line.2975"></a>
+<span class="sourceLineNo">2976</span>    KeyValue kv24 = new KeyValue(row1, fam1, qf2, ts4, KeyValue.Type.Put, null);<a name="line.2976"></a>
+<span class="sourceLineNo">2977</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.2977"></a>
+<span class="sourceLineNo">2978</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.2978"></a>
+<span class="sourceLineNo">2979</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.2979"></a>
+<span class="sourceLineNo">2980</span><a name="line.2980"></a>
+<span class="sourceLineNo">2981</span>    Put put = null;<a name="line.2981"></a>
+<span class="sourceLineNo">2982</span>    put = new Put(row1);<a name="line.2982"></a>
+<span class="sourceLineNo">2983</span>    put.add(kv14);<a name="line.2983"></a>
+<span class="sourceLineNo">2984</span>    put.add(kv24);<a name="line.2984"></a>
+<span class="sourceLineNo">2985</span>    region.put(put);<a name="line.2985"></a>
+<span class="sourceLineNo">2986</span>    region.flush(true);<a name="line.2986"></a>
+<span class="sourceLineNo">2987</span><a name="line.2987"></a>
+<span class="sourceLineNo">2988</span>    put = new Put(row1);<a name="line.2988"></a>
+<span class="sourceLineNo">2989</span>    put.add(kv23);<a name="line.2989"></a>
+<span class="sourceLineNo">2990</span>    put.add(kv13);<a name="line.2990"></a>
+<span class="sourceLineNo">2991</span>    region.put(put);<a name="line.2991"></a>
+<span class="sourceLineNo">2992</span>    region.flush(true);<a name="line.2992"></a>
+<span class="sourceLineNo">2993</span><a name="line.2993"></a>
+<span class="sourceLineNo">2994</span>    put = new Put(row1);<a name="line.2994"></a>
+<span class="sourceLineNo">2995</span>    put.add(kv22);<a name="line.2995"></a>
+<span class="sourceLineNo">2996</span>    put.add(kv12);<a name="line.2996"></a>
+<span class="sourceLineNo">2997</span>    region.put(put);<a name="line.2997"></a>
+<span class="sourceLineNo">2998</span>    region.flush(true);<a name="line.2998"></a>
+<span class="sourceLineNo">2999</span><a name="line.2999"></a>
+<span class="sourceLineNo">3000</span>    put = new Put(row1);<a name="line.3000"></a>
+<span class="sourceLineNo">3001</span>    put.add(kv21);<a name="line.3001"></a>
+<span class="sourceLineNo">3002</span>    put.add(kv11);<a name="line.3002"></a>
+<span class="sourceLineNo">3003</span>    region.put(put);<a name="line.3003"></a>
+<span class="sourceLineNo">3004</span><a name="line.3004"></a>
+<span class="sourceLineNo">3005</span>    // Expected<a name="line.3005"></a>
+<span class="sourceLineNo">3006</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.3006"></a>
+<span class="sourceLineNo">3007</span>    expected.add(kv14);<a name="line.3007"></a>
+<span class="sourceLineNo">3008</span>    expected.add(kv13);<a name="line.3008"></a>
+<span class="sourceLineNo">3009</span>    expected.add(kv12);<a name="line.3009"></a>
+<span class="sourceLineNo">3010</span>    expected.add(kv24);<a name="line.3010"></a>
+<span class="sourceLineNo">3011</span>    expected.add(kv23);<a name="line.3011"></a>
+<span class="sourceLineNo">3012</span>    expected.add(kv22);<a name="line.3012"></a>
+<span class="sourceLineNo">3013</span><a name="line.3013"></a>
+<span class="sourceLineNo">3014</span>    Scan scan = new Scan(row1);<a name="line.3014"></a>
+<span class="sourceLineNo">3015</span>    scan.addColumn(fam1, qf1);<a name="line.3015"></a>
+<span class="sourceLineNo">3016</span>    scan.addColumn(fam1, qf2);<a name="line.3016"></a>
+<span class="sourceLineNo">3017</span>    int versions = 3;<a name="line.3017"></a>
+<span class="sourceLineNo">3018</span>    scan.setMaxVersions(versions);<a name="line.3018"></a>
+<span class="sourceLineNo">3019</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.3019"></a>
+<span class="sourceLineNo">3020</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.3020"></a>
+<span class="sourceLineNo">3021</span><a name="line.3021"></a>
+<span class="sourceLineNo">3022</span>    boolean hasNext = scanner.next(actual);<a name="line.3022"></a>
+<span class="sourceLineNo">3023</span>    assertEquals(false, hasNext);<a name="line.3023"></a>
+<span class="sourceLineNo">3024</span><a name="line.3024"></a>
+<span class="sourceLineNo">3025</span>    // Verify result<a name="line.3025"></a>
+<span class="sourceLineNo">3026</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.3026"></a>
+<span class="sourceLineNo">3027</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected.get(i), actual.get(i)));<a name="line.3027"></a>
+<span class="sourceLineNo">3028</span>    }<a name="line.3028"></a>
+<span class="sourceLineNo">3029</span>  }<a name="line.3029"></a>
+<span class="sourceLineNo">3030</span><a name="line.3030"></a>
+<span class="sourceLineNo">3031</span>  @Test<a name="line.3031"></a>
+<span class="sourceLineNo">3032</span>  public void testScanner_Wildcard_FromMemStore_EnforceVersions() throws IOException {<a name="line.3032"></a>
+<span class="sourceLineNo">3033</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.3033"></a>
+<span class="sourceLineNo">3034</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.3034"></a>
+<span class="sourceLineNo">3035</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.3035"></a>
+<span class="sourceLineNo">3036</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.3036"></a>
+<span class="sourceLineNo">3037</span>    byte[][] families = { fam1 };<a name="line.3037"></a>
+<span class="sourceLineNo">3038</span><a name="line.3038"></a>
+<span class="sourceLineNo">3039</span>    long ts1 = System.currentTimeMillis();<a name="line.3039"></a>
+<span class="sourceLineNo">3040</span>    long ts2 = ts1 + 1;<a name="line.3040"></a>
+<span class="sourceLineNo">3041</span>    long ts3 = ts1 + 2;<a name="line.3041"></a>
+<span class="sourceLineNo">3042</span><a name="line.3042"></a>
+<span class="sourceLineNo">3043</span>    // Setting up region<a name="line.3043"></a>
+<span class="sourceLineNo">3044</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.3044"></a>
+<span class="sourceLineNo">3045</span>    // Putting data in Region<a name="line.3045"></a>
+<span class="sourceLineNo">3046</span>    Put put = null;<a name="line.3046"></a>
+<span class="sourceLineNo">3047</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.3047"></a>
+<span class="sourceLineNo">3048</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.3048"></a>
+<span class="sourceLineNo">3049</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.3049"></a>
+<span class="sourceLineNo">3050</span><a name="line.3050"></a>
+<span class="sourceLineNo">3051</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.3051"></a>
+<span class="sourceLineNo">3052</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.3052"></a>
+<span class="sourceLineNo">3053</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.3053"></a>
+<span class="sourceLineNo">3054</span><a name="line.3054"></a>
+<span class="sourceLineNo">3055</span>    put = new Put(row1);<a name="line.3055"></a>
+<span class="sourceLineNo">3056</span>    put.add(kv13);<a name="line.3056"></a>
+<span class="sourceLineNo">3057</span>    put.add(kv12);<a name="line.3057"></a>
+<span class="sourceLineNo">3058</span>    put.add(kv11);<a name="line.3058"></a>
+<span class="sourceLineNo">3059</span>    put.add(kv23);<a name="line.3059"></a>
+<span class="sourceLineNo">3060</span>    put.add(kv22);<a name="line.3060"></a>
+<span class="sourceLineNo">3061</span>    put.add(kv21);<a name="line.3061"></a>
+<span class="sourceLineNo">3062</span>    region.put(put);<a name="line.3062"></a>
+<span class="sourceLineNo">3063</span><a name="line.3063"></a>
+<span class="sourceLineNo">3064</span>    // Expected<a name="line.3064"></a>
+<span class="sourceLineNo">3065</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.3065"></a>
+<span class="sourceLineNo">3066</span>    expected.add(kv13);<a name="line.3066"></a>
+<span class="sourceLineNo">3067</span>    expected.add(kv12);<a name="line.3067"></a>
+<span class="sourceLineNo">3068</span>    expected.add(kv23);<a name="line.3068"></a>
+<span class="sourceLineNo">3069</span>    expected.add(kv22);<a name="line.3069"></a>
+<span class="sourceLineNo">3070</span><a name="line.3070"></a>
+<span class="sourceLineNo">3071</span>    Scan scan = new Scan(row1);<a name="line.3071"></a>
+<span class="sourceLineNo">3072</span>    scan.addFamily(fam1);<a name="line.3072"></a>
+<span class="sourceLineNo">3073</span>    scan.setMaxVersions(MAX_VERSIONS);<a name="line.3073"></a>
+<span class="sourceLineNo">3074</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.3074"></a>
+<span class="sourceLineNo">3075</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.3075"></a>
+<span class="sourceLineNo">3076</span><a name="line.3076"></a>
+<span class="sourceLineNo">3077</span>    boolean hasNext = scanner.next(actual);<a name="line.3077"></a>
+<span class="sourceLineNo">3078</span>    assertEquals(false, hasNext);<a name="line.3078"></a>
+<span class="sourceLineNo">3079</span><a name="line.3079"></a>
+<span class="sourceLineNo">3080</span>    // Verify result<a name="line.3080"></a>
+<span class="sourceLineNo">3081</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.3081"></a>
+<span class="sourceLineNo">3082</span>      assertEquals(expected.get(i), actual.get(i));<a name="line.3082"></a>
+<span class="sourceLineNo">3083</span>    }<a name="line.3083"></a>
+<span class="sourceLineNo">3084</span>  }<a name="line.3084"></a>
+<span class="sourceLineNo">3085</span><a name="line.3085"></a>
+<span class="sourceLineNo">3086</span>  @Test<a name="line.3086"></a>
+<span class="sourceLineNo">3087</span>  public void testScanner_Wildcard_FromFilesOnly_EnforceVersions() throws IOException {<a name="line.3087"></a>
+<span class="sourceLineNo">3088</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.3088"></a>
+<span class="sourceLineNo">3089</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.3089"></a>
+<span class="sourceLineNo">3090</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.3090"></a>
+<span class="sourceLineNo">3091</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.3091"></a>
+<span class="sourceLineNo">3092</span><a name="line.3092"></a>
+<span class="sourceLineNo">3093</span>    long ts1 = 1; // System.currentTimeMillis();<a name="line.3093"></a>
+<span class="sourceLineNo">3094</span>    long ts2 = ts1 + 1;<a name="line.3094"></a>
+<span class="sourceLineNo">3095</span>    long ts3 = ts1 + 2;<a name="line.3095"></a>
+<span class="sourceLineNo">3096</span><a name="line.3096"></a>
+<span class="sourceLineNo">3097</span>    // Setting up region<a name="line.3097"></a>
+<span class="sourceLineNo">3098</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.3098"></a>
+<span class="sourceLineNo">3099</span>    // Putting data in Region<a name="line.3099"></a>
+<span class="sourceLineNo">3100</span>    Put put = null;<a name="line.3100"></a>
+<span class="sourceLineNo">3101</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.3101"></a>
+<span class="sourceLineNo">3102</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.3102"></a>
+<span class="sourceLineNo">3103</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.3103"></a>
+<span class="sourceLineNo">3104</span><a name="line.3104"></a>
+<span class="sourceLineNo">3105</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.3105"></a>
+<span class="sourceLineNo">3106</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.3106"></a>
+<span class="sourceLineNo">3107</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.3107"></a>
 <span class="sourceLineNo">3108</span><a name="line.3108"></a>
-<span class="sourceLineNo">3109</span>    // Expected<a name="line.3109"></a>
-<span class="sourceLineNo">3110</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.3110"></a>
-<span class="sourceLineNo">3111</span>    expected.add(kv13);<a name="line.3111"></a>
-<span class="sourceLineNo">3112</span>    expected.add(kv12);<a name="line.3112"></a>
-<span class="sourceLineNo">3113</span>    expected.add(kv23);<a name="line.3113"></a>
-<span class="sourceLineNo">3114</span>    expected.add(kv22);<a name="line.3114"></a>
-<span class="sourceLineNo">3115</span><a name="line.3115"></a>
-<span class="sourceLineNo">3116</span>    Scan scan = new Scan(row1);<a name="line.3116"></a>
-<span class="sourceLineNo">3117</span>    scan.addFamily(fam1);<a name="line.3117"></a>
-<span class="sourceLineNo">3118</span>    scan.setMaxVersions(MAX_VERSIONS);<a name="line.3118"></a>
-<span class="sourceLineNo">3119</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.3119"></a>
-<span class="sourceLineNo">3120</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.3120"></a>
-<span class="sourceLineNo">3121</span><a name="line.3121"></a>
-<span class="sourceLineNo">3122</span>    boolean hasNext = scanner.next(actual);<a name="line.3122"></a>
-<span class="sourceLineNo">3123</span>    assertEquals(false, hasNext);<a name="line.3123"></a>
-<span class="sourceLineNo">3124</span><a name="line.3124"></a>
-<span class="sourceLineNo">3125</span>    // Verify result<a name="line.3125"></a>
-<span class="sourceLineNo">3126</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.3126"></a>
-<span class="sourceLineNo">3127</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected.get(i), actual.get(i)));<a name="line.3127"></a>
-<span class="sourceLineNo">3128</span>    }<a name="line.3128"></a>
-<span class="sourceLineNo">3129</span>  }<a name="line.3129"></a>
-<span class="sourceLineNo">3130</span><a name="line.3130"></a>
-<span class="sourceLineNo">3131</span>  @Test<a name="line.3131"></a>
-<span class="sourceLineNo">3132</span>  public void testScanner_StopRow1542() throws IOException {<a name="line.3132"></a>
-<span class="sourceLineNo">3133</span>    byte[] family = Bytes.toBytes("testFamily");<a name="line.3133"></a>
-<span class="sourceLineNo">3134</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.3134"></a>
-<span class="sourceLineNo">3135</span>    byte[] row1 = Bytes.toBytes("row111");<a name="line.3135"></a>
-<span class="sourceLineNo">3136</span>    byte[] row2 = Bytes.toBytes("row222");<a name="line.3136"></a>
-<span class="sourceLineNo">3137</span>    byte[] row3 = Bytes.toBytes("row333");<a name="line.3137"></a>
-<span class="sourceLineNo">3138</span>    byte[] row4 = Bytes.toBytes("row444");<a name="line.3138"></a>
-<span class="sourceLineNo">3139</span>    byte[] row5 = Bytes.toBytes("row555");<a name="line.3139"></a>
+<span class="sourceLineNo">3109</span>    put = new Put(row1);<a name="line.3109"></a>
+<span class="sourceLineNo">3110</span>    put.add(kv13);<a name="line.3110"></a>
+<span class="sourceLineNo">3111</span>    put.add(kv12);<a name="line.3111"></a>
+<span class="sourceLineNo">3112</span>    put.add(kv11);<a name="line.3112"></a>
+<span class="sourceLineNo">3113</span>    put.add(kv23);<a name="line.3113"></a>
+<span class="sourceLineNo">3114</span>    put.add(kv22);<a name="line.3114"></a>
+<span class="sourceLineNo">3115</span>    put.add(kv21);<a name="line.3115"></a>
+<span class="sourceLineNo">3116</span>    region.put(put);<a name="line.3116"></a>
+<span class="sourceLineNo">3117</span>    region.flush(true);<a name="line.3117"></a>
+<span class="sourceLineNo">3118</span><a name="line.3118"></a>
+<span class="sourceLineNo">3119</span>    // Expected<a name="line.3119"></a>
+<span class="sourceLineNo">3120</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.3120"></a>
+<span class="sourceLineNo">3121</span>    expected.add(kv13);<a name="line.3121"></a>
+<span class="sourceLineNo">3122</span>    expected.add(kv12);<a name="line.3122"></a>
+<span class="sourceLineNo">3123</span>    expected.add(kv23);<a name="line.3123"></a>
+<span class="sourceLineNo">3124</span>    expected.add(kv22);<a name="line.3124"></a>
+<span class="sourceLineNo">3125</span><a name="line.3125"></a>
+<span class="sourceLineNo">3126</span>    Scan scan = new Scan(row1);<a name="line.3126"></a>
+<span class="sourceLineNo">3127</span>    scan.addFamily(fam1);<a name="line.3127"></a>
+<span class="sourceLineNo">3128</span>    scan.setMaxVersions(MAX_VERSIONS);<a name="line.3128"></a>
+<span class="sourceLineNo">3129</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.3129"></a>
+<span class="sourceLineNo">3130</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.3130"></a>
+<span class="sourceLineNo">3131</span><a name="line.3131"></a>
+<span class="sourceLineNo">3132</span>    boolean hasNext = scanner.next(actual);<a name="line.3132"></a>
+<span class="sourceLineNo">3133</span>    assertEquals(false, hasNext);<a name="line.3133"></a>
+<span class="sourceLineNo">3134</span><a name="line.3134"></a>
+<span class="sourceLineNo">3135</span>    // Verify result<a name="line.3135"></a>
+<span class="sourceLineNo">3136</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.3136"></a>
+<span class="sourceLineNo">3137</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected.get(i), actual.get(i)));<a name="line.3137"></a>
+<span class="sourceLineNo">3138</span>    }<a name="line.3138"></a>
+<span class="sourceLineNo">3139</span>  }<a name="line.3139"></a>
 <span class="sourceLineNo">3140</span><a name="line.3140"></a>
-<span class="sourceLineNo">3141</span>    byte[] col1 = Bytes.toBytes("Pub111");<a name="line.3141"></a>
-<span class="sourceLineNo">3142</span>    byte[] col2 = Bytes.toBytes("Pub222");<a name="line.3142"></a>
-<span class="sourceLineNo">3143</span><a name="line.3143"></a>
-<span class="sourceLineNo">3144</span>    Put put = new Put(row1);<a name="line.3144"></a>
-<span class="sourceLineNo">3145</span>    put.addColumn(family, col1, Bytes.toBytes(10L));<a name="line.3145"></a>
-<span class="sourceLineNo">3146</span>    region.put(put);<a name="line.3146"></a>
-<span class="sourceLineNo">3147</span><a name="line.3147"></a>
-<span class="sourceLineNo">3148</span>    put = new Put(row2);<a name="line.3148"></a>
-<span class="sourceLineNo">3149</span>    put.addColumn(family, col1, Bytes.toBytes(15L));<a name="line.3149"></a>
-<span class="sourceLineNo">3150</span>    region.put(put);<a name="line.3150"></a>
-<span class="sourceLineNo">3151</span><a name="line.3151"></a>
-<span class="sourceLineNo">3152</span>    put = new Put(row3);<a name="line.3152"></a>
-<span class="sourceLineNo">3153</span>    put.addColumn(family, col2, Bytes.toBytes(20L));<a name="line.3153"></a>
-<span class="sourceLineNo">3154</span>    region.put(put);<a name="line.3154"></a>
-<span class="sourceLineNo">3155</span><a name="line.3155"></a>
-<span class="sourceLineNo">3156</span>    put = new Put(row4);<a name="line.3156"></a>
-<span class="sourceLineNo">3157</span>    put.addColumn(family, col2, Bytes.toBytes(30L));<a name="line.3157"></a>
-<span class="sourceLineNo">3158</span>    region.put(put);<a name="line.3158"></a>
-<span class="sourceLineNo">3159</span><a name="line.3159"></a>
-<span class="sourceLineNo">3160</span>    put = new Put(row5);<a name="line.3160"></a>
-<span class="sourceLineNo">3161</span>    put.addColumn(family, col1, Bytes.toBytes(40L));<a name="line.3161"></a>
-<span class="sourceLineNo">3162</span>    region.put(put);<a name="line.3162"></a>
-<span class="sourceLineNo">3163</span><a name="line.3163"></a>
-<span class="sourceLineNo">3164</span>    Scan scan = new Scan(row3, row4);<a name="line.3164"></a>
-<span class="sourceLineNo">3165</span>    scan.setMaxVersions();<a name="line.3165"></a>
-<span class="sourceLineNo">3166</span>    scan.addColumn(family, col1);<a name="line.3166"></a>
-<span class="sourceLineNo">3167</span>    InternalScanner s = region.getScanner(scan);<a name="line.3167"></a>
-<span class="sourceLineNo">3168</span><a name="line.3168"></a>
-<span class="sourceLineNo">3169</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.3169"></a>
-<span class="sourceLineNo">3170</span>    assertEquals(false, s.next(results));<a name="line.3170"></a>
-<span class="sourceLineNo">3171</span>    assertEquals(0, results.size());<a name="line.3171"></a>
-<span class="sourceLineNo">3172</span>  }<a name="line.3172"></a>
+<span class="sourceLineNo">3141</span>  @Test<a name="line.3141"></a>
+<span class="sourceLineNo">3142</span>  public void testScanner_StopRow1542() throws IOException {<a name="line.3142"></a>
+<span class="sourceLineNo">3143</span>    byte[] family = Bytes.toBytes("testFamily");<a name="line.3143"></a>
+<span class="sourceLineNo">3144</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.3144"></a>
+<span class="sourceLineNo">3145</span>    byte[] row1 = Bytes.toBytes("row111");<a name="line.3145"></a>
+<span class="sourceLineNo">3146</span>    byte[] row2 = Bytes.toBytes("row222");<a name="line.3146"></a>
+<span class="sourceLineNo">3147</span>    byte[] row3 = Bytes.toBytes("row333");<a name="line.3147"></a>
+<span class="sourceLineNo">3148</span>    byte[] row4 = Bytes.toBytes("row444");<a name="line.3148"></a>
+<span class="sourceLineNo">3149</span>    byte[] row5 = Bytes.toBytes("row555");<a name="line.3149"></a>
+<span class="sourceLineNo">3150</span><a name="line.3150"></a>
+<span class="sourceLineNo">3151</span>    byte[] col1 = Bytes.toBytes("Pub111");<a name="line.3151"></a>
+<span class="sourceLineNo">3152</span>    byte[] col2 = Bytes.toBytes("Pub222");<a name="line.3152"></a>
+<span class="sourceLineNo">3153</span><a name="line.3153"></a>
+<span class="sourceLineNo">3154</span>    Put put = new Put(row1);<a name="line.3154"></a>
+<span class="sourceLineNo">3155</span>    put.addColumn(family, col1, Bytes.toBytes(10L));<a name="line.3155"></a>
+<span class="sourceLineNo">3156</span>    region.put(put);<a name="line.3156"></a>
+<span class="sourceLineNo">3157</span><a name="line.3157"></a>
+<span class="sourceLineNo">3158</span>    put = new Put(row2);<a name="line.3158"></a>
+<span class="sourceLineNo">3159</span>    put.addColumn(family, col1, Bytes.toBytes(15L));<a name="line.3159"></a>
+<span class="sourceLineNo">3160</span>    region.put(put);<a name="line.3160"></a>
+<span class="sourceLineNo">3161</span><a name="line.3161"></a>
+<span class="sourceLineNo">3162</span>    put = new Put(row3);<a name="line.3162"></a>
+<span class="sourceLineNo">3163</span>    put.addColumn(family, col2, Bytes.toBytes(20L));<a name="line.3163"></a>
+<span class="sourceLineNo">3164</span>    region.put(put);<a name="line.3164"></a>
+<span class="sourceLineNo">3165</span><a name="line.3165"></a>
+<span class="sourceLineNo">3166</span>    put = new Put(row4);<a name="line.3166"></a>
+<span class="sourceLineNo">3167</span>    put.addColumn(family, col2, Bytes.toBytes(30L));<a name="line.3167"></a>
+<span class="sourceLineNo">3168</span>    region.put(put);<a name="line.3168"></a>
+<span class="sourceLineNo">3169</span><a name="line.3169"></a>
+<span class="sourceLineNo">3170</span>    put = new Put(row5);<a name="line.3170"></a>
+<span class="sourceLineNo">3171</span>    put.addColumn(family, col1, Bytes.toBytes(40L));<a name="line.3171"></a>
+<span class="sourceLineNo">3172</span>    region.put(put);<a name="line.3172"></a>
 <span class="sourceLineNo">3173</span><a name="line.3173"></a>
-<span class="sourceLineNo">3174</span>  @Test<a name="line.3174"></a>
-<span class="sourceLineNo">3175</span>  public void testScanner_Wildcard_FromMemStoreAndFiles_EnforceVersions() throws IOException {<a name="line.3175"></a>
-<span class="sourceLineNo">3176</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.3176"></a>
-<span class="sourceLineNo">3177</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.3177"></a>
-<span class="sourceLineNo">3178</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.3178"></a>
-<span class="sourceLineNo">3179</span>    byte[] qf2 = Bytes.toBytes("quateslifier2");<a name="line.3179"></a>
-<span class="sourceLineNo">3180</span><a name="line.3180"></a>
-<span class="sourceLineNo">3181</span>    long ts1 = 1;<a name="line.3181"></a>
-<span class="sourceLineNo">3182</span>    long ts2 = ts1 + 1;<a name="line.3182"></a>
-<span class="sourceLineNo">3183</span>    long ts3 = ts1 + 2;<a name="line.3183"></a>
-<span class="sourceLineNo">3184</span>    long ts4 = ts1 + 3;<a name="line.3184"></a>
-<span class="sourceLineNo">3185</span><a name="line.3185"></a>
-<span class="sourceLineNo">3186</span>    // Setting up region<a name="line.3186"></a>
-<span class="sourceLineNo">3187</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.3187"></a>
-<span class="sourceLineNo">3188</span>    // Putting data in Region<a name="line.3188"></a>
-<span class="sourceLineNo">3189</span>    KeyValue kv14 = new KeyValue(row1, fam1, qf1, ts4, KeyValue.Type.Put, null);<a name="line.3189"></a>
-<span class="sourceLineNo">3190</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.3190"></a>
-<span class="sourceLineNo">3191</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.3191"></a>
-<span class="sourceLineNo">3192</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.3192"></a>
-<span class="sourceLineNo">3193</span><a name="line.3193"></a>
-<span class="sourceLineNo">3194</span>    KeyValue kv24 = new KeyValue(row1, fam1, qf2, ts4, KeyValue.Type.Put, null);<a name="line.3194"></a>
-<span class="sourceLineNo">3195</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.3195"></a>
-<span class="sourceLineNo">3196</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.3196"></a>
-<span class="sourceLineNo">3197</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.3197"></a>
-<span class="sourceLineNo">3198</span><a name="line.3198"></a>
-<span class="sourceLineNo">3199</span>    Put put = null;<a name="line.3199"></a>
-<span class="sourceLineNo">3200</span>    put = new Put(row1);<a name="line.3200"></a>
-<span class="sourceLineNo">3201</span>    put.add(kv14);<a name="line.3201"></a>
-<span class="sourceLineNo">3202</span>    put.add(kv24);<a name="line.3202"></a>
-<span class="sourceLineNo">3203</span>    region.put(put);<a name="line.3203"></a>
-<span class="sourceLineNo">3204</span>    region.flush(true);<a name="line.3204"></a>
-<span class="sourceLineNo">3205</span><a name="line.3205"></a>
-<span class="sourceLineNo">3206</span>    put = new Put(row1);<a name="line.3206"></a>
-<span class="sourceLineNo">3207</span>    put.add(kv23);<a name="line.3207"></a>
-<span class="sourceLineNo">3208</span>    put.add(kv13);<a name="line.3208"></a>
-<span class="sourceLineNo">3209</span>    region.put(put);<a name="line.3209"></a>
-<span class="sourceLineNo">3210</span>    region.flush(true);<a name="line.3210"></a>
-<span class="sourceLineNo">3211</span><a name="line.3211"></a>
-<span class="sourceLineNo">3212</span>    put = new Put(row1);<a name="line.3212"></a>
-<span class="sourceLineNo">3213</span>    put.add(kv22);<a name="line.3213"></a>
-<span class="sourceLineNo">3214</span>    put.add(kv12);<a name="line.3214"></a>
-<span class="sourceLineNo">3215</span>    region.put(put);<a name="line.3215"></a>
-<span class="sourceLineNo">3216</span>    region.flush(true);<a name="line.3216"></a>
-<span class="sourceLineNo">3217</span><a name="line.3217"></a>
-<span class="sourceLineNo">3218</span>    put = new Put(row1);<a name="line.3218"></a>
-<span class="sourceLineNo">3219</span>    put.add(kv21);<a name="line.3219"></a>
-<span class="sourceLineNo">3220</span>    put.add(kv11);<a name="line.3220"></a>
-<span class="sourceLineNo">3221</span>    region.put(put);<a name="line.3221"></a>
-<span class="sourceLineNo">3222</span><a name="line.3222"></a>
-<span class="sourceLineNo">3223</span>    // Expected<a name="line.3223"></a>
-<span class="sourceLineNo">3224</span>    List&lt;KeyValue&gt; expected = new ArrayList&lt;&gt;();<a name="line.3224"></a>
-<span class="sourceLineNo">3225</span>    expected.add(kv14);<a name="line.3225"></a>
-<span class="sourceLineNo">3226</span>    expected.add(kv13);<a name="line.3226"></a>
-<span class="sourceLineNo">3227</span>    expected.add(kv12);<a name="line.3227"></a>
-<span class="sourceLineNo">3228</span>    expected.add(kv24);<a name="line.3228"></a>
-<span class="sourceLineNo">3229</span>    expected.add(kv23);<a name="line.3229"></a>
-<span class="sourceLineNo">3230</span>    expected.add(kv22);<a name="line.3230"></a>
-<span class="sourceLineNo">3231</span><a name="line.3231"></a>
-<span class="sourceLineNo">3232</span>    Scan scan = new Scan(row1);<a name="line.3232"></a>
-<span class="sourceLineNo">3233</span>    int versions = 3;<a name="line.3233"></a>
-<span class="sourceLineNo">3234</span>    scan.setMaxVersions(versions);<a name="line.3234"></a>
-<span class="sourceLineNo">3235</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.3235"></a>
-<span class="sourceLineNo">3236</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.3236"></a>
-<span class="sourceLineNo">3237</span><a name="line.3237"></a>
-<span class="sourceLineNo">3238</span>    boolean hasNext = scanner.next(actual);<a name="line.3238"></a>
-<span class="sourceLineNo">3239</span>    assertEquals(false, hasNext);<a name="line.3239"></a>
-<span class="sourceLineNo">3240</span><a name="line.3240"></a>
-<span class="sourceLineNo">3241</span>    // Verify result<a name="line.3241"></a>
-<span class="sourceLineNo">3242</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.3242"></a>
-<span class="sourceLineNo">3243</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected.get(i), actual.get(i)));<a name="line.3243"></a>
-<span class="sourceLineNo">3244</span>    }<a name="line.3244"></a>
-<span class="sourceLineNo">3245</span>  }<a name="line.3245"></a>
-<span class="sourceLineNo">3246</span><a name="line.3246"></a>
-<span class="sourceLineNo">3247</span>  /**<a name="line.3247"></a>
-<span class="sourceLineNo">3248</span>   * Added for HBASE-5416<a name="line.3248"></a>
-<span class="sourceLineNo">3249</span>   *<a name="line.3249"></a>
-<span class="sourceLineNo">3250</span>   * Here we test scan optimization when only subset of CFs are used in filter<a name="line.3250"></a>
-<span class="sourceLineNo">3251</span>   * conditions.<a name="line.3251"></a>
-<span class="sourceLineNo">3252</span>   */<a name="line.3252"></a>
-<span class="sourceLineNo">3253</span>  @Test<a name="line.3253"></a>
-<span class="sourceLineNo">3254</span>  public void testScanner_JoinedScanners() throws IOException {<a name="line.3254"></a>
-<span class="sourceLineNo">3255</span>    byte[] cf_essential = Bytes.toBytes("essential");<a name="line.3255"></a>
-<span class="sourceLineNo">3256</span>    byte[] cf_joined = Bytes.toBytes("joined");<a name="line.3256"></a>
-<span class="sourceLineNo">3257</span>    byte[] cf_alpha = Bytes.toBytes("alpha");<a name="line.3257"></a>
-<span class="sourceLineNo">3258</span>    this.region = initHRegion(tableName, method, CONF, cf_essential, cf_joined, cf_alpha);<a name="line.3258"></a>
-<span class="sourceLineNo">3259</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.3259"></a>
-<span class="sourceLineNo">3260</span>    byte[] row2 = Bytes.toBytes("row2");<a name="line.3260"></a>
-<span class="sourceLineNo">3261</span>    byte[] row3 = Bytes.toBytes("row3");<a name="line.3261"></a>
-<span class="sourceLineNo">3262</span><a name="line.3262"></a>
-<span class="sourceLineNo">3263</span>    byte[] col_normal = Bytes.toBytes("d");<a name="line.3263"></a>
-<span class="sourceLineNo">3264</span>    byte[] col_alpha = Bytes.toBytes("a");<a name="line.3264"></a>
-<span class="sourceLineNo">3265</span><a name="line.3265"></a>
-<span class="sourceLineNo">3266</span>    byte[] filtered_val = Bytes.toBytes(3);<a name="line.3266"></a>
-<span class="sourceLineNo">3267</span><a name="line.3267"></a>
-<span class="sourceLineNo">3268</span>    Put put = new Put(row1);<a name="line.3268"></a>
-<span class="sourceLineNo">3269</span>    put.addColumn(cf_essential, col_normal, Bytes.toBytes(1));<a name="line.3269"></a>
-<span class="sourceLineNo">3270</span>    put.addColumn(cf_joined, col_alpha, Bytes.toBytes(1));<a name="line.3270"></a>
-<span class="sourceLineNo">3271</span>    region.put(put);<a name="line.3271"></a>
+<span class="sourceLineNo">3174</span>    Scan scan = new Scan(row3, row4);<a name="line.3174"></a>
+<span class="sourceLineNo">3175</span>    scan.setMaxVersions();<a name="line.3175"></a>
+<span class="sourceLineNo">3176</span>    scan.addColumn(family, col1);<a name="line.3176"></a>
+<span class="sourceLineNo">3177</span>    InternalScanner s = region.getScanner(scan);<a name="line.3177"></a>
+<span class="sourceLineNo">3178</span><a name="line.3178"></a>
+<span class="sourceLineNo">3179</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.3179"></a>
+<span class="sourceLineNo">3180</span>    assertEquals(false, s.next(results));<a name="line.3180"></a>
+<span class="sourceLineNo">3181</span>    assertEquals(0, results.size());<a name="line.3181"></a>
+<span class="sourceLineNo">3182</span>  }<a name="line.3182"></a>
+<span class="sourceLineNo">3183</span><a name="line.3183"></a>
+<span class="sourceLineNo">3184</span>  @Test<a name="line.3184"></a>
+<span class="sourceLineNo">3185</span>  public void testScanner_Wildcard_FromMemStoreAndFiles_EnforceVersions() throws IOException {<a name="line.3185"></a>
+<span class="sourceLineNo">3186</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.3186"></a>
+<span class="sourceLineNo">3187</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.3187"></a>
+<span class="sourceLineNo">3188</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.3188"></a>
+<span class="sourceLineNo">3189</span>    byte[] qf2 = Bytes.toBytes("quateslifier2");<a name="line.3189"></a>
+<span class="sourceLineNo">3190</span><a name="line.3190"></a>
+<span class="sourceLineNo">3191</span>    long ts1 = 1;<a name="line.3191"></a>
+<span class="sourceLineNo">3192</span>    long ts2 = ts1 + 1;<a name="line.3192"></a>
+<span class="sourceLineNo">3193</span>    long ts3 = ts1 + 2;<a name="line.3193"></a>
+<span class="sourceLineNo">3194</span>    long ts4 = ts1 + 3;<a name="line.3194"></a>
+<span class="sourceLineNo">3195</span><a name="line.3195"></a>
+<span class="sourceLineNo">3196</span>    // Setting up region<a name="line.3196"></a>
+<span class="sourceLineNo">3197</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.3197"></a>
+<span class="sourceLineNo">3198</span>    // Putting data in Region<a name="line.3198"></a>
+<span class="sourceLineNo">3199</span>    KeyValue kv14 = new KeyValue(row1, fam1, qf1, ts4, KeyValue.Type.Put, null);<a name="line.3199"></a>
+<span class="sourceLineNo">3200</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.3200"></a>
+<span class="sourceLineNo">3201</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.3201"></a>
+<span class="sourceLineNo">3202</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.3202"></a>
+<span class="sourceLineNo">3203</span><a name="line.3203"></a>
+<span class="sourceLineNo">3204</span>    KeyValue kv24 = new KeyValue(row1, fam1, qf2, ts4, KeyValue.Type.Put, null);<a name="line.3204"></a>
+<span class="sourceLineNo">3205</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.3205"></a>
+<span class="sourceLineNo">3206</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.3206"></a>
+<span class="sourceLineNo">3207</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.3207"></a>
+<span class="sourceLineNo">3208</span><a name="line.3208"></a>
+<span class="sourceLineNo">3209</span>    Put put = null;<a name="line.3209"></a>
+<span class="sourceLineNo">3210</span>    put = new Put(row1);<a name="line.3210"></a>
+<span class="sourceLineNo">3211</span>    put.add(kv14);<a name="line.3211"></a>
+<span class="sourceLineNo">3212</span>    put.add(kv24);<a name="line.3212"></a>
+<span class="sourceLineNo">3213</span>    region.put(put);<a name="line.3213"></a>
+<span class="sourceLineNo">3214</span>    region.flush(true);<a name="line.3214"></a>
+<span class="sourceLineNo">3215</span><a name="line.3215"></a>
+<span class="sourceLineNo">3216</span>    put = new Put(row1);<a name="line.3216"></a>
+<span class="sourceLineNo">3217</span>    put.add(kv23);<a name="line.3217"></a>
+<span class="sourceLineNo">3218</span>    put.add(kv13);<a name="line.3218"></a>
+<span class="sourceLineNo">3219</span>    region.put(put);<a name="line.3219"></a>
+<span class="sourceLineNo">3220</span>    region.flush(true);<a name="line.3220"></a>
+<span class="sourceLineNo">3221</span><a name="line.3221"></a>
+<span class="sourceLineNo">3222</span>    put = new Put(row1);<a name="line.3222"></a>
+<span class="sourceLineNo">3223</span>    put.add(kv22);<a name="line.3223"></a>
+<span class="sourceLineNo">3224</span>    put.add(kv12);<a name="line.3224"></a>
+<span class="sourceLineNo">3225</span>    region.put(put);<a name="line.3225"></a>
+<span class="sourceLineNo">3226</span>    region.flush(true);<a name="line.3226"></a>
+<span class="sourceLineNo">3227</span><a name="line.3227"></a>
+<span class="sourceLineNo">3228</span>    put = new Put(row1);<a name="line.3228"></a>
+<span class="sourceLineNo">3229</span>    put.add(kv21);<a name="line.3229"></a>
+<span class="sourceLineNo">3230</span>    put.add(kv11);<a name="line.3230"></a>
+<span class="sourceLineNo">3231</span>    region.put(put);<a name="line.3231"></a>
+<span class="sourceLineNo">3232</span><a name="line.3232"></a>
+<span class="sourceLineNo">3233</span>    // Expected<a name="line.3233"></a>
+<span class="sourceLineNo">3234</span>    List&lt;KeyValue&gt; expected = new ArrayList&lt;&gt;();<a name="line.3234"></a>
+<span class="sourceLineNo">3235</span>    expected.add(kv14);<a name="line.3235"></a>
+<span class="sourceLineNo">3236</span>    expected.add(kv13);<a name="line.3236"></a>
+<span class="sourceLineNo">3237</span>    expected.add(kv12);<a name="line.3237"></a>
+<span class="sourceLineNo">3238</span>    expected.add(kv24);<a name="line.3238"></a>
+<span class="sourceLineNo">3239</span>    expected.add(kv23);<a name="line.3239"></a>
+<span class="sourceLineNo">3240</span>    expected.add(kv22);<a name="line.3240"></a>
+<span class="sourceLineNo">3241</span><a name="line.3241"></a>
+<span class="sourceLineNo">3242</span>    Scan scan = new Scan(row1);<a name="line.3242"></a>
+<span class="sourceLineNo">3243</span>    int versions = 3;<a name="line.3243"></a>
+<span class="sourceLineNo">3244</span>    scan.setMaxVersions(versions);<a name="line.3244"></a>
+<span class="sourceLineNo">3245</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.3245"></a>
+<span class="sourceLineNo">3246</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.3246"></a>
+<span class="sourceLineNo">3247</span><a name="line.3247"></a>
+<span class="sourceLineNo">3248</span>    boolean hasNext = scanner.next(actual);<a name="line.3248"></a>
+<span class="sourceLineNo">3249</span>    assertEquals(false, hasNext);<a name="line.3249"></a>
+<span class="sourceLineNo">3250</span><a name="line.3250"></a>
+<span class="sourceLineNo">3251</span>    // Verify result<a name="line.3251"></a>
+<span class="sourceLineNo">3252</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.3252"></a>
+<span class="sourceLineNo">3253</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected.get(i), actual.get(i)));<a name="line.3253"></a>
+<span class="sourceLineNo">3254</span>    }<a name="line.3254"></a>
+<span class="sourceLineNo">3255</span>  }<a name="line.3255"></a>
+<span class="sourceLineNo">3256</span><a name="line.3256"></a>
+<span class="sourceLineNo">3257</span>  /**<a name="line.3257"></a>
+<span class="sourceLineNo">3258</span>   * Added for HBASE-5416<a name="line.3258"></a>
+<span class="sourceLineNo">3259</span>   *<a name="line.3259"></a>
+<span class="sourceLineNo">3260</span>   * Here we test scan optimization when only subset of CFs are used in filter<a name="line.3260"></a>
+<span class="sourceLineNo">3261</span>   * conditions.<a name="line.3261"></a>
+<span class="sourceLineNo">3262</span>   */<a name="line.3262"></a>
+<span class="sourceLineNo">3263</span>  @Test<a name="line.3263"></a>
+<span class="sourceLineNo">3264</span>  public void testScanner_JoinedScanners() throws IOException {<a name="line.3264"></a>
+<span class="sourceLineNo">3265</span>    byte[] cf_essential = Bytes.toBytes("essential");<a name="line.3265"></a>
+<span class="sourceLineNo">3266</span>    byte[] cf_joined = Bytes.toBytes("joined");<a name="line.3266"></a>
+<span class="sourceLineNo">3267</span>    byte[] cf_alpha = Bytes.toBytes("alpha");<a name="line.3267"></a>
+<span class="sourceLineNo">3268</span>    this.region = initHRegion(tableName, method, CONF, cf_essential, cf_joined, cf_alpha);<a name="line.3268"></a>
+<span class="sourceLineNo">3269</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.3269"></a>
+<span class="sourceLineNo">3270</span>    byte[] row2 = Bytes.toBytes("row2");<a name="line.3270"></a>
+<span class="sourceLineNo">3271</span>    byte[] row3 = Bytes.toBytes("row3");<a name="line.3271"></a>
 <span class="sourceLineNo">3272</span><a name="line.3272"></a>
-<span class="sourceLineNo">3273</span>    put = new Put(row2);<a name="line.3273"></a>
-<span class="sourceLineNo">3274</span>    put.addColumn(cf_essential, col_alpha, Bytes.toBytes(2));<a name="line.3274"></a>
-<span class="sourceLineNo">3275</span>    put.addColumn(cf_joined, col_normal, Bytes.toBytes(2));<a name="line.3275"></a>
-<span class="sourceLineNo">3276</span>    put.addColumn(cf_alpha, col_alpha, Bytes.toBytes(2));<a name="line.3276"></a>
-<span class="sourceLineNo">3277</span>    region.put(put);<a name="line.3277"></a>
-<span class="sourceLineNo">3278</span><a name="line.3278"></a>
-<span class="sourceLineNo">3279</span>    put = new Put(row3);<a name="line.3279"></a>
-<span class="sourceLineNo">3280</span>    put.addColumn(cf_essential, col_normal, filtered_val);<a name="line.3280"></a>
-<span class="sourceLineNo">3281</span>    put.addColumn(cf_joined, col_normal, filtered_val);<a name="line.3281"></a>
-<span class="sourceLineNo">3282</span>    region.put(put);<a name="line.3282"></a>
-<span class="sourceLineNo">3283</span><a name="line.3283"></a>
-<span class="sourceLineNo">3284</span>    // Check two things:<a name="line.3284"></a>
-<span class="sourceLineNo">3285</span>    // 1. result list contains expected values<a name="line.3285"></a>
-<span class="sourceLineNo">3286</span>    // 2. result list is sorted properly<a name="line.3286"></a>
-<span class="sourceLineNo">3287</span><a name="line.3287"></a>
-<span class="sourceLineNo">3288</span>    Scan scan = new Scan();<a name="line.3288"></a>
-<span class="sourceLineNo">3289</span>    Filter filter = new SingleColumnValueExcludeFilter(cf_essential, col_normal,<a name="line.3289"></a>
-<span class="sourceLineNo">3290</span>            CompareOperator.NOT_EQUAL, filtered_val);<a name="line.3290"></a>
-<span class="sourceLineNo">3291</span>    scan.setFilter(filter);<a name="line.3291"></a>
-<span class="sourceLineNo">3292</span>    scan.setLoadColumnFamiliesOnDemand(true);<a name="line.3292"></a>
-<span class="sourceLineNo">3293</span>    InternalScanner s = region.getScanner(scan);<a name="line.3293"></a>
-<span class="sourceLineNo">3294</span><a name="line.3294"></a>
-<span class="sourceLineNo">3295</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.3295"></a>
-<span class="sourceLineNo">3296</span>    assertTrue(s.next(results));<a name="line.3296"></a>
-<span class="sourceLineNo">3297</span>    assertEquals(1, results.size());<a name="line.3297"></a>
-<span class="sourceLineNo">3298</span>    results.clear();<a name="line.3298"></a>
-<span class="sourceLineNo">3299</span><a name="line.3299"></a>
-<span class="sourceLineNo">3300</span>    assertTrue(s.next(results));<a name="line.3300"></a>
-<span class="sourceLineNo">3301</span>    assertEquals(3, results.size());<a name="line.3301"></a>
-<span class="sourceLineNo">3302</span>    assertTrue("orderCheck", CellUtil.matchingFamily(results.get(0), cf_alpha));<a name="line.3302"></a>
-<span class="sourceLineNo">3303</span>    assertTrue("orderCheck", CellUtil.matchingFamily(results.get(1), cf_essential));<a name="line.3303"></a>
-<span class="sourceLineNo">3304</span>    assertTrue("orderCheck", CellUtil.matchingFamily(results.get(2), cf_joined));<a name="line.3304"></a>
-<span class="sourceLineNo">3305</span>    results.clear();<a name="line.3305"></a>
-<span class="sourceLineNo">3306</span><a name="line.3306"></a>
-<span class="sourceLineNo">3307</span>    assertFalse(s.next(results));<a name="line.3307"></a>
-<span class="sourceLineNo">3308</span>    assertEquals(0, results.size());<a name="line.3308"></a>
-<span class="sourceLineNo">3309</span>  }<a name="line.3309"></a>
-<span class="sourceLineNo">3310</span><a name="line.3310"></a>
-<span class="sourceLineNo">3311</span>  /**<a name="line.3311"></a>
-<span class="sourceLineNo">3312</span>   * HBASE-5416<a name="line.3312"></a>
-<span class="sourceLineNo">3313</span>   *<a name="line.3313"></a>
-<span class="sourceLineNo">3314</span>   * Test case when scan limits amount of KVs returned on each next() call.<a name="line.3314"></a>
-<span class="sourceLineNo">3315</span>   */<a name="line.3315"></a>
-<span class="sourceLineNo">3316</span>  @Test<a name="line.3316"></a>
-<span class="sourceLineNo">3317</span>  public void testScanner_JoinedScannersWithLimits() throws IOException {<a name="line.3317"></a>
-<span class="sourceLineNo">3318</span>    final byte[] cf_first = Bytes.toBytes("first");<a name="line.3318"></a>
-<span class="sourceLineNo">3319</span>    final byte[] cf_second = Bytes.toBytes("second");<a name="line.3319"></a>
+<span class="sourceLineNo">3273</span>    byte[] col_normal = Bytes.toBytes("d");<a name="line.3273"></a>
+<span class="sourceLineNo">3274</span>    byte[] col_alpha = Bytes.toBytes("a");<a name="line.3274"></a>
+<span class="sourceLineNo">3275</span><a name="line.3275"></a>
+<span class="sourceLineNo">3276</span>    byte[] filtered_val = Bytes.toBytes(3);<a name="line.3276"></a>
+<span class="sourceLineNo">3277</span><a name="line.3277"></a>
+<span class="sourceLineNo">3278</span>    Put put = new Put(row1);<a name="line.3278"></a>
+<span class="sourceLineNo">3279</span>    put.addColumn(cf_essential, col_normal, Bytes.toBytes(1));<a name="line.3279"></a>
+<span class="sourceLineNo">3280</span>    put.addColumn(cf_joined, col_alpha, Bytes.toBytes(1));<a name="line.3280"></a>
+<span class="sourceLineNo">3281</span>    region.put(put);<a name="line.3281"></a>
+<span class="sourceLineNo">3282</span><a name="line.3282"></a>
+<span class="sourceLineNo">3283</span>    put = new Put(row2);<a name="line.3283"></a>
+<span class="sourceLineNo">3284</span>    put.addColumn(cf_essential, col_alpha, Bytes.toBytes(2));<a name="line.3284"></a>
+<span class="sourceLineNo">3285</span>    put.addColumn(cf_joined, col_normal, Bytes.toBytes(2));<a name="line.3285"></a>
+<span class="sourceLineNo">3286</span>    put.addColumn(cf_alpha, col_alpha, Bytes.toBytes(2));<a name="line.3286"></a>
+<span class="sourceLineNo">3287</span>    region.put(put);<a name="line.3287"></a>
+<span class="sourceLineNo">3288</span><a name="line.3288"></a>
+<span class="sourceLineNo">3289</span>    put = new Put(row3);<a name="line.3289"></a>
+<span class="sourceLineNo">3290</span>    put.addColumn(cf_essential, col_normal, filtered_val);<a name="line.3290"></a>
+<span class="sourceLineNo">3291</span>    put.addColumn(cf_joined, col_normal, filtered_val);<a name="line.3291"></a>
+<span class="sourceLineNo">3292</span>    region.put(put);<a name="line.3292"></a>
+<span class="sourceLineNo">3293</span><a name="line.3293"></a>
+<span class="sourceLineNo">3294</span>    // Check two things:<a name="line.3294"></a>
+<span class="sourceLineNo">3295</span>    // 1. result list contains expected values<a name="line.3295"></a>
+<span class="sourceLineNo">3296</span>    // 2. result list is sorted properly<a name="line.3296"></a>
+<span class="sourceLineNo">3297</span><a name="line.3297"></a>
+<span class="sourceLineNo">3298</span>    Scan scan = new Scan();<a name="line.3298"></a>
+<span class="sourceLineNo">3299</span>    Filter filter = new SingleColumnValueExcludeFilter(cf_essential, col_normal,<a name="line.3299"></a>
+<span class="sourceLineNo">3300</span>            CompareOperator.NOT_EQUAL, filtered_val);<a name="line.3300"></a>
+<span class="sourceLineNo">3301</span>    scan.setFilter(filter);<a name="line.3301"></a>
+<span class="sourceLineNo">3302</span>    scan.setLoadColumnFamiliesOnDemand(true);<a name="line.3302"></a>
+<span class="sourceLineNo">3303</span>    InternalScanner s = region.getScanner(scan);<a name="line.3303"></a>
+<span class="sourceLineNo">3304</span><a name="line.3304"></a>
+<span class="sourceLineNo">3305</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.3305"></a>
+<span class="sourceLineNo">3306</span>    assertTrue(s.next(results));<a name="line.3306"></a>
+<span class="sourceLineNo">3307</span>    assertEquals(1, results.size());<a name="line.3307"></a>
+<span class="sourceLineNo">3308</span>    results.clear();<a name="line.3308"></a>
+<span class="sourceLineNo">3309</span><a name="line.3309"></a>
+<span class="sourceLineNo">3310</span>    assertTrue(s.next(results));<a name="line.3310"></a>
+<span class="sourceLineNo">3311</span>    assertEquals(3, results.size());<a name="line.3311"></a>
+<span class="sourceLineNo">3312</span>    assertTrue("orderCheck", CellUtil.matchingFamily(results.get(0), cf_alpha));<a name="line.3312"></a>
+<span class="sourceLineNo">3313</span>    assertTrue("orderCheck", CellUtil.matchingFamily(results.get(1), cf_essential));<a name="line.3313"></a>
+<span class="sourceLineNo">3314</span>    assertTrue("orderCheck", CellUtil.matchingFamily(results.get(2), cf_joined));<a name="line.3314"></a>
+<span class="sourceLineNo">3315</span>    results.clear();<a name="line.3315"></a>
+<span class="sourceLineNo">3316</span><a name="line.3316"></a>
+<span class="sourceLineNo">3317</span>    assertFalse(s.next(results));<a name="line.3317"></a>
+<span class="sourceLineNo">3318</span>    assertEquals(0, results.size());<a name="line.3318"></a>
+<span class="sourceLineNo">3319</span>  }<a name="line.3319"></a>
 <span class="sourceLineNo">3320</span><a name="line.3320"></a>
-<span class="sourceLineNo">3321</span>    this.region = initHRegion(tableName, method, CONF, cf_first, cf_second);<a name="line.3321"></a>
-<span class="sourceLineNo">3322</span>    final byte[] col_a = Bytes.toBytes("a");<a name="line.3322"></a>
-<span class="sourceLineNo">3323</span>    final byte[] col_b = Bytes.toBytes("b");<a name="line.3323"></a>
-<span class="sourceLineNo">3324</span><a name="line.3324"></a>
-<span class="sourceLineNo">3325</span>    Put put;<a name="line.3325"></a>
-<span class="sourceLineNo">3326</span><a name="line.3326"></a>
-<span class="sourceLineNo">3327</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.3327"></a>
-<span class="sourceLineNo">3328</span>      put = new Put(Bytes.toBytes("r" + Integer.toString(i)));<a name="line.3328"></a>
-<span class="sourceLineNo">3329</span>      put.addColumn(cf_first, col_a, Bytes.toBytes(i));<a name="line.3329"></a>
-<span class="sourceLineNo">3330</span>      if (i &lt; 5) {<a name="line.3330"></a>
-<span class="sourceLineNo">3331</span>        put.addColumn(cf_first, col_b, Bytes.toBytes(i));<a name="line.3331"></a>
-<span class="sourceLineNo">3332</span>        put.addColumn(cf_second, col_a, Bytes.toBytes(i));<a name="line.3332"></a>
-<span class="sourceLineNo">3333</span>        put.addColumn(cf_second, col_b, Bytes.toBytes(i));<a name="line.3333"></a>
-<span class="sourceLineNo">3334</span>      }<a name="line.3334"></a>
-<span class="sourceLineNo">3335</span>      region.put(put);<a name="line.3335"></a>
-<span class="sourceLineNo">3336</span>    }<a name="line.3336"></a>
-<span class="sourceLineNo">3337</span><a name="line.3337"></a>
-<span class="sourceLineNo">3338</span>    Scan scan = new Scan();<a name="line.3338"></a>
-<span class="sourceLineNo">3339</span>    scan.setLoadColumnFamiliesOnDemand(true);<a name="line.3339"></a>
-<span class="sourceLineNo">3340</span>    Filter bogusFilter = new FilterBase() {<a name="line.3340"></a>
-<span class="sourceLineNo">3341</span>      @Override<a name="line.3341"></a>
-<span class="sourceLineNo">3342</span>      public ReturnCode filterCell(final Cell ignored) throws IOException {<a name="line.3342"></a>
-<span class="sourceLineNo">3343</span>        return ReturnCode.INCLUDE;<a name="line.3343"></a>
+<span class="sourceLineNo">3321</span>  /**<a name="line.3321"></a>
+<span class="sourceLineNo">3322</span>   * HBASE-5416<a name="line.3322"></a>
+<span class="sourceLineNo">3323</span>   *<a name="line.3323"></a>
+<span class="sourceLineNo">3324</span>   * Test case when scan limits amount of KVs returned on each next() call.<a name="line.3324"></a>
+<span class="sourceLineNo">3325</span>   */<a name="line.3325"></a>
+<span class="sourceLineNo">3326</span>  @Test<a name="line.3326"></a>
+<span class="sourceLineNo">3327</span>  public void testScanner_JoinedScannersWithLimits() throws IOException {<a name="line.3327"></a>
+<span class="sourceLineNo">3328</span>    final byte[] cf_first = Bytes.toBytes("first");<a name="line.3328"></a>
+<span class="sourceLineNo">3329</span>    final byte[] cf_second = Bytes.toBytes("second");<a name="line.3329"></a>
+<span class="sourceLineNo">3330</span><a name="line.3330"></a>
+<span class="sourceLineNo">3331</span>    this.region = initHRegion(tableName, method, CONF, cf_first, cf_second);<a name="line.3331"></a>
+<span class="sourceLineNo">3332</span>    final byte[] col_a = Bytes.toBytes("a");<a name="line.3332"></a>
+<span class="sourceLineNo">3333</span>    final byte[] col_b = Bytes.toBytes("b");<a name="line.3333"></a>
+<span class="sourceLineNo">3334</span><a name="line.3334"></a>
+<span class="sourceLineNo">3335</span>    Put put;<a name="line.3335"></a>
+<span class="sourceLineNo">3336</span><a name="line.3336"></a>
+<span class="sourceLineNo">3337</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.3337"></a>
+<span class="sourceLineNo">3338</span>      put = new Put(Bytes.toBytes("r" + Integer.toString(i)));<a name="line.3338"></a>
+<span class="sourceLineNo">3339</span>      put.addColumn(cf_first, col_a, Bytes.toBytes(i));<a name="line.3339"></a>
+<span class="sourceLineNo">3340</span>      if (i &lt; 5) {<a name="line.3340"></a>
+<span class="sourceLineNo">3341</span>        put.addColumn(cf_first, col_b, Bytes.toBytes(i));<a name="line.3341"></a>
+<span class="sourceLineNo">3342</span>        put.addColumn(cf_second, col_a, Bytes.toBytes(i));<a name="line.3342"></a>
+<span class="sourceLineNo">3343</span>        put.addColumn(cf_second, col_b, Bytes.toBytes(i));<a name="line.3343"></a>
 <span class="sourceLineNo">3344</span>      }<a name="line.3344"></a>
-<span class="sourceLineNo">3345</span>      @Override<a name="line.3345"></a>
-<span class="sourceLineNo">3346</span>      public boolean isFamilyEssential(byte[] name) {<a name="line.3346"></a>
-<span class="sourceLineNo">3347</span>        return Bytes.equals(name, cf_first);<a name="line.3347"></a>
-<span class="sourceLineNo">3348</span>      }<a name="line.3348"></a>
-<span class="sourceLineNo">3349</span>    };<a name="line.3349"></a>
-<span class="sourceLineNo">3350</span><a name="line.3350"></a>
-<span class="sourceLineNo">3351</span>    scan.setFilter(bogusFilter);<a name="line.3351"></a>
-<span class="sourceLineNo">3352</span>    InternalScanner s = region.getScanner(scan);<a name="line.3352"></a>
-<span class="sourceLineNo">3353</span><a name="line.3353"></a>
-<span class="sourceLineNo">3354</span>    // Our data looks like this:<a name="line.3354"></a>
-<span class="sourceLineNo">3355</span>    // r0: first:a, first:b, second:a, second:b<a name="line.3355"></a>
-<span class="sourceLineNo">3356</span>    // r1: first:a, first:b, second:a, second:b<a name="line.3356"></a>
-<span class="sourceLineNo">3357</span>    // r2: first:a, first:b, second:a, second:b<a name="line.3357"></a>
-<span class="sourceLineNo">3358</span>    // r3: first:a, first:b, second:a, second:b<a name="line.3358"></a>
-<span class="sourceLineNo">3359</span>    // r4: first:a, first:b, second:a, second:b<a name="line.3359"></a>
-<span class="sourceLineNo">3360</span>    // r5: first:a<a name="line.3360"></a>
-<span class="sourceLineNo">3361</span>    // r6: first:a<a name="line.3361"></a>
-<span class="sourceLineNo">3362</span>    // r7: first:a<a name="line.3362"></a>
-<span class="sourceLineNo">3363</span>    // r8: first:a<a name="line.3363"></a>
-<span class="sourceLineNo">3364</span>    // r9: first:a<a name="line.3364"></a>
-<span class="sourceLineNo">3365</span><a name="line.3365"></a>
-<span class="sourceLineNo">3366</span>    // But due to next's limit set to 3, we should get this:<a name="line.3366"></a>
-<span class="sourceLineNo">3367</span>    // r0: first:a, first:b, second:a<a name="line.3367"></a>
-<span class="sourceLineNo">3368</span>    // r0: second:b<a name="line.3368"></a>
-<span class="sourceLineNo">3369</span>    // r1: first:a, first:b, second:a<a name="line.3369"></a>
-<span class="sourceLineNo">3370</span>    // r1: second:b<a name="line.3370"></a>
-<span class="sourceLineNo">3371</span>    // r2: first:a, first:b, second:a<a name="line.3371"></a>
-<span class="sourceLineNo">3372</span>    // r2: second:b<a name="line.3372"></a>
-<span class="sourceLineNo">3373</span>    // r3: first:a, first:b, second:a<a name="line.3373"></a>
-<span class="sourceLineNo">3374</span>    // r3: second:b<a name="line.3374"></a>
-<span class="sourceLineNo">3375</span>    // r4: first:a, first:b, second:a<a name="line.3375"></a>
-<span class="sourceLineNo">3376</span>    // r4: second:b<a name="line.3376"></a>
-<span class="sourceLineNo">3377</span>    // r5: first:a<a name="line.3377"></a>
-<span class="sourceLineNo">3378</span>    // r6: first:a<a name="line.3378"></a>
-<span class="sourceLineNo">3379</span>    // r7: first:a<a name="line.3379"></a>
-<span class="sourceLineNo">3380</span>    // r8: first:a<a name="line.3380"></a>
-<span class="sourceLineNo">3381</span>    // r9: first:a<a name="line.3381"></a>
-<span class="sourceLineNo">3382</span><a name="line.3382"></a>
-<span class="sourceLineNo">3383</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.3383"></a>
-<span class="sourceLineNo">3384</span>    int index = 0;<a name="line.3384"></a>
-<span class="sourceLineNo">3385</span>    ScannerContext scannerContext = ScannerContext.newBuilder().setBatchLimit(3).build();<a name="line.3385"></a>
-<span class="sourceLineNo">3386</span>    while (true) {<a name="line.3386"></a>
-<span class="sourceLineNo">3387</span>      boolean more = s.next(results, scannerContext);<a name="line.3387"></a>
-<span class="sourceLineNo">3388</span>      if ((index &gt;&gt; 1) &lt; 5) {<a name="line.3388"></a>
-<span class="sourceLineNo">3389</span>        if (index % 2 == 0) {<a name="line.3389"></a>
-<span class="sourceLineNo">3390</span>          assertEquals(3, results.size());<a name="line.3390"></a>
-<span class="sourceLineNo">3391</span>        } else {<a name="line.3391"></a>
-<span class="sourceLineNo">3392</span>          assertEquals(1, results.size());<a name="line.3392"></a>
-<span class="sourceLineNo">3393</span>        }<a name="line.3393"></a>
-<span class="sourceLineNo">3394</span>      } else {<a name="line.3394"></a>
-<span class="sourceLineNo">3395</span>        assertEquals(1, results.size());<a name="line.3395"></a>
-<span class="sourceLineNo">3396</span>      }<a name="line.3396"></a>
-<span class="sourceLineNo">3397</span>      results.clear();<a name="line.3397"></a>
-<span class="sourceLineNo">3398</span>      index++;<a name="line.3398"></a>
-<span class="sourceLineNo">3399</span>      if (!more) {<a name="line.3399"></a>
-<span class="sourceLineNo">3400</span>        break;<a name="line.3400"></a>
-<span class="sourceLineNo">3401</span>      }<a name="line.3401"></a>
-<span class="sourceLineNo">3402</span>    }<a name="line.3402"></a>
-<span class="sourceLineNo">3403</span>  }<a name="line.3403"></a>
-<span class="sourceLineNo">3404</span><a name="line.3404"></a>
-<span class="sourceLineNo">3405</span>  /**<a name="line.3405"></a>
-<span class="sourceLineNo">3406</span>   * Write an HFile block full with Cells whose qualifier that are identical between<a name="line.3406"></a>
-<span class="sourceLineNo">3407</span>   * 0 and Short.MAX_VALUE. See HBASE-13329.<a name="line.3407"></a>
-<span class="sourceLineNo">3408</span>   * @throws Exception<a name="line.3408"></a>
-<span class="sourceLineNo">3409</span>   */<a name="line.3409"></a>
-<span class="sourceLineNo">3410</span>  @Test<a name="line.3410"></a>
-<span class="sourceLineNo">3411</span>  public void testLongQualifier() throws Exception {<a name="line.3411"></a>
-<span class="sourceLineNo">3412</span>    byte[] family = Bytes.toBytes("family");<a name="line.3412"></a>
-<span class="sourceLineNo">3413</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.3413"></a>
-<span class="sourceLineNo">3414</span>    byte[] q = new byte[Short.MAX_VALUE+2];<a name="line.3414"></a>
-<span class="sourceLineNo">3415</span>    Arrays.fill(q, 0, q.length-1, (byte)42);<a name="line.3415"></a>
-<span class="sourceLineNo">3416</span>    for (byte i=0; i&lt;10; i++) {<a name="line.3416"></a>
-<span class="sourceLineNo">3417</span>      Put p = new Put(Bytes.toBytes("row"));<a name="line.3417"></a>
-<span class="sourceLineNo">3418</span>      // qualifiers that differ past Short.MAX_VALUE<a name="line.3418"></a>
-<span class="sourceLineNo">3419</span>      q[q.length-1]=i;<a name="line.3419"></a>
-<span class="sourceLineNo">3420</span>      p.addColumn(family, q, q);<a name="line.3420"></a>
-<span class="sourceLineNo">3421</span>      region.put(p);<a name="line.3421"></a>
-<span class="sourceLineNo">3422</span>    }<a name="line.3422"></a>
-<span class="sourceLineNo">3423</span>    region.flush(false);<a name="line.3423"></a>
-<span class="sourceLineNo">3424</span>  }<a name="line.3424"></a>
-<span class="sourceLineNo">3425</span><a name="line.3425"></a>
-<span class="sourceLineNo">3426</span>  /**<a name="line.3426"></a>
-<span class="sourceLineNo">3427</span>   * Flushes the cache in a thread while scanning. The tests verify that the<a name="line.3427"></a>
-<span class="sourceLineNo">3428</span>   * scan is coherent - e.g. the returned results are always of the same or<a name="line.3428"></a>
-<span class="sourceLineNo">3429</span>   * later update as the previous results.<a name="line.3429"></a>
-<span class="sourceLineNo">3430</span>   *<a name="line.3430"></a>
-<span class="sourceLineNo">3431</span>   * @throws IOException<a name="line.3431"></a>
-<span class="sourceLineNo">3432</span>   *           scan / compact<a name="line.3432"></a>
-<span class="sourceLineNo">3433</span>   * @throws InterruptedException<a name="line.3433"></a>
-<span class="sourceLineNo">3434</span>   *           thread join<a name="line.3434"></a>
-<span class="sourceLineNo">3435</span>   */<a name="line.3435"></a>
-<span class="sourceLineNo">3436</span>  @Test<a name="line.3436"></a>
-<span class="sourceLineNo">3437</span>  public void testFlushCacheWhileScanning() throws IOException, InterruptedException {<a name="line.3437"></a>
-<span class="sourceLineNo">3438</span>    byte[] family = Bytes.toBytes("family");<a name="line.3438"></a>
-<span class="sourceLineNo">3439</span>    int numRows = 1000;<a name="line.3439"></a>
-<span class="sourceLineNo">3440</span>    int flushAndScanInterval = 10;<a name="line.3440"></a>
-<span class="sourceLineNo">3441</span>    int compactInterval = 10 * flushAndScanInterval;<a name="line.3441"></a>
-<span class="sourceLineNo">3442</span><a name="line.3442"></a>
-<span class="sourceLineNo">3443</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.3443"></a>
-<span class="sourceLineNo">3444</span>    FlushThread flushThread = new FlushThread();<a name="line.3444"></a>
-<span class="sourceLineNo">3445</span>    try {<a name="line.3445"></a>
-<span class="sourceLineNo">3446</span>      flushThread.start();<a name="line.3446"></a>
-<span class="sourceLineNo">3447</span><a name="line.3447"></a>
-<span class="sourceLineNo">3448</span>      Scan scan = new Scan();<a name="line.3448"></a>
-<span class="sourceLineNo">3449</span>      scan.addFamily(family);<a name="line.3449"></a>
-<span class="sourceLineNo">3450</span>      scan.setFilter(new SingleColumnValueFilter(family, qual1, CompareOperator.EQUAL,<a name="line.3450"></a>
-<span class="sourceLineNo">3451</span>          new BinaryComparator(Bytes.toBytes(5L))));<a name="line.3451"></a>
+<span class="sourceLineNo">3345</span>      region.put(put);<a name="line.3345"></a>
+<span class="sourceLineNo">3346</span>    }<a name="line.3346"></a>
+<span class="sourceLineNo">3347</span><a name="line.3347"></a>
+<span class="sourceLineNo">3348</span>    Scan scan = new Scan();<a name="line.3348"></a>
+<span class="sourceLineNo">3349</span>    scan.setLoadColumnFamiliesOnDemand(true);<a name="line.3349"></a>
+<span class="sourceLineNo">3350</span>    Filter bogusFilter = new FilterBase() {<a name="line.3350"></a>
+<span class="sourceLineNo">3351</span>      @Override<a name="line.3351"></a>
+<span class="sourceLineNo">3352</span>      public ReturnCode filterCell(final Cell ignored) throws IOException {<a name="line.3352"></a>
+<span class="sourceLineNo">3353</span>        return ReturnCode.INCLUDE;<a name="line.3353"></a>
+<span class="sourceLineNo">3354</span>      }<a name="line.3354"></a>
+<span class="sourceLineNo">3355</span>      @Override<a name="line.3355"></a>
+<span class="sourceLineNo">3356</span>      public boolean isFamilyEssential(byte[] name) {<a name="line.3356"></a>
+<span class="sourceLineNo">3357</span>        return Bytes.equals(name, cf_first);<a name="line.3357"></a>
+<span class="sourceLineNo">3358</span>      }<a name="line.3358"></a>
+<span class="sourceLineNo">3359</span>    };<a name="line.3359"></a>
+<span class="sourceLineNo">3360</span><a name="line.3360"></a>
+<span class="sourceLineNo">3361</span>    scan.setFilter(bogusFilter);<a name="line.3361"></a>
+<span class="sourceLineNo">3362</span>    InternalScanner s = region.getScanner(scan);<a name="line.3362"></a>
+<span class="sourceLineNo">3363</span><a name="line.3363"></a>
+<span class="sourceLineNo">3364</span>    // Our data looks like this:<a name="line.3364"></a>
+<span class="sourceLineNo">3365</span>    // r0: first:a, first:b, second:a, second:b<a name="line.3365"></a>
+<span class="sourceLineNo">3366</span>    // r1: first:a, first:b, second:a, second:b<a name="line.3366"></a>
+<span class="sourceLineNo">3367</span>    // r2: first:a, first:b, second:a, second:b<a name="line.3367"></a>
+<span class="sourceLineNo">3368</span>    // r3: first:a, first:b, second:a, second:b<a name="line.3368"></a>
+<span class="sourceLineNo">3369</span>    // r4: first:a, first:b, second:a, second:b<a name="line.3369"></a>
+<span class="sourceLineNo">3370</span>    // r5: first:a<a name="line.3370"></a>
+<span class="sourceLineNo">3371</span>    // r6: first:a<a name="line.3371"></a>
+<span class="sourceLineNo">3372</span>    // r7: first:a<a name="line.3372"></a>
+<span class="sourceLineNo">3373</span>    // r8: first:a<a name="line.3373"></a>
+<span class="sourceLineNo">3374</span>    // r9: first:a<a name="line.3374"></a>
+<span class="sourceLineNo">3375</span><a name="line.3375"></a>
+<span class="sourceLineNo">3376</span>    // But due to next's limit set to 3, we should get this:<a name="line.3376"></a>
+<span class="sourceLineNo">3377</span>    // r0: first:a, first:b, second:a<a name="line.3377"></a>
+<span class="sourceLineNo">3378</span>    // r0: second:b<a name="line.3378"></a>
+<span class="sourceLineNo">3379</span>    // r1: first:a, first:b, second:a<a name="line.3379"></a>
+<span class="sourceLineNo">3380</span>    // r1: second:b<a name="line.3380"></a>
+<span class="sourceLineNo">3381</span>    // r2: first:a, first:b, second:a<a name="line.3381"></a>
+<span class="sourceLineNo">3382</span>    // r2: second:b<a name="line.3382"></a>
+<span class="sourceLineNo">3383</span>    // r3: first:a, first:b, second:a<a name="line.3383"></a>
+<span class="sourceLineNo">3384</span>    // r3: second:b<a name="line.3384"></a>
+<span class="sourceLineNo">3385</span>    // r4: first:a, first:b, second:a<a name="line.3385"></a>
+<span class="sourceLineNo">3386</span>    // r4: second:b<a name="line.3386"></a>
+<span class="sourceLineNo">3387</span>    // r5: first:a<a name="line.3387"></a>
+<span class="sourceLineNo">3388</span>    // r6: first:a<a name="line.3388"></a>
+<span class="sourceLineNo">3389</span>    // r7: first:a<a name="line.3389"></a>
+<span class="sourceLineNo">3390</span>    // r8: first:a<a name="line.3390"></a>
+<span class="sourceLineNo">3391</span>    // r9: first:a<a name="line.3391"></a>
+<span class="sourceLineNo">3392</span><a name="line.3392"></a>
+<span class="sourceLineNo">3393</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.3393"></a>
+<span class="sourceLineNo">3394</span>    int index = 0;<a name="line.3394"></a>
+<span class="sourceLineNo">3395</span>    ScannerContext scannerContext = ScannerContext.newBuilder().setBatchLimit(3).build();<a name="line.3395"></a>
+<span class="sourceLineNo">3396</span>    while (true) {<a name="line.3396"></a>
+<span class="sourceLineNo">3397</span>      boolean more = s.next(results, scannerContext);<a name="line.3397"></a>
+<span class="sourceLineNo">3398</span>      if ((index &gt;&gt; 1) &lt; 5) {<a name="line.3398"></a>
+<span class="sourceLineNo">3399</span>        if (index % 2 == 0) {<a name="line.3399"></a>
+<span class="sourceLineNo">3400</span>          assertEquals(3, results.size());<a name="line.3400"></a>
+<span class="sourceLineNo">3401</span>        } else {<a name="line.3401"></a>
+<span class="sourceLineNo">3402</span>          assertEquals(1, results.size());<a name="line.3402"></a>
+<span class="sourceLineNo">3403</span>        }<a name="line.3403"></a>
+<span class="sourceLineNo">3404</span>      } else {<a name="line.3404"></a>
+<span class="sourceLineNo">3405</span>        assertEquals(1, results.size());<a name="line.3405"></a>
+<span class="sourceLineNo">3406</span>      }<a name="line.3406"></a>
+<span class="sourceLineNo">3407</span>      results.clear();<a name="line.3407"></a>
+<span class="sourceLineNo">3408</span>      index++;<a name="line.3408"></a>
+<span class="sourceLineNo">3409</span>      if (!more) {<a name="line.3409"></a>
+<span class="sourceLineNo">3410</span>        break;<a name="line.3410"></a>
+<span class="sourceLineNo">3411</span>      }<a name="line.3411"></a>
+<span class="sourceLineNo">3412</span>    }<a name="line.3412"></a>
+<span class="sourceLineNo">3413</span>  }<a name="line.3413"></a>
+<span class="sourceLineNo">3414</span><a name="line.3414"></a>
+<span class="sourceLineNo">3415</span>  /**<a name="line.3415"></a>
+<span class="sourceLineNo">3416</span>   * Write an HFile block full with Cells whose qualifier that are identical between<a name="line.3416"></a>
+<span class="sourceLineNo">3417</span>   * 0 and Short.MAX_VALUE. See HBASE-13329.<a name="line.3417"></a>
+<span class="sourceLineNo">3418</span>   * @throws Exception<a name="line.3418"></a>
+<span class="sourceLineNo">3419</span>   */<a name="line.3419"></a>
+<span class="sourceLineNo">3420</span>  @Test<a name="line.3420"></a>
+<span class="sourceLineNo">3421</span>  public void testLongQualifier() throws Exception {<a name="line.3421"></a>
+<span class="sourceLineNo">3422</span>    byte[] family = Bytes.toBytes("family");<a name="line.3422"></a>
+<span class="sourceLineNo">3423</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.3423"></a>
+<span class="sourceLineNo">3424</span>    byte[] q = new byte[Short.MAX_VALUE+2];<a name="line.3424"></a>
+<span class="sourceLineNo">3425</span>    Arrays.fill(q, 0, q.length-1, (byte)42);<a name="line.3425"></a>
+<span class="sourceLineNo">3426</span>    for (byte i=0; i&lt;10; i++) {<a name="line.3426"></a>
+<span class="sourceLineNo">3427</span>      Put p = new Put(Bytes.toBytes("row"));<a name="line.3427"></a>
+<span class="sourceLineNo">3428</span>      // qualifiers that differ past Short.MAX_VALUE<a name="line.3428"></a>
+<span class="sourceLineNo">3429</span>      q[q.length-1]=i;<a name="line.3429"></a>
+<span class="sourceLineNo">3430</span>      p.addColumn(family, q, q);<a name="line.3430"></a>
+<span class="sourceLineNo">3431</span>      region.put(p);<a name="line.3431"></a>
+<span class="sourceLineNo">3432</span>    }<a name="line.3432"></a>
+<span class="sourceLineNo">3433</span>    region.flush(false);<a name="line.3433"></a>
+<span class="sourceLineNo">3434</span>  }<a name="line.3434"></a>
+<span class="sourceLineNo">3435</span><a name="line.3435"></a>
+<span class="sourceLineNo">3436</span>  /**<a name="line.3436"></a>
+<span class="sourceLineNo">3437</span>   * Flushes the cache in a thread while scanning. The tests verify that the<a name="line.3437"></a>
+<span class="sourceLineNo">3438</span>   * scan is coherent - e.g. the returned results are always of the same or<a name="line.3438"></a>
+<span class="sourceLineNo">3439</span>   * later update as the previous results.<a name="line.3439"></a>
+<span class="sourceLineNo">3440</span>   *<a name="line.3440"></a>
+<span class="sourceLineNo">3441</span>   * @throws IOException<a name="line.3441"></a>
+<span class="sourceLineNo">3442</span>   *           scan / compact<a name="line.3442"></a>
+<span class="sourceLineNo">3443</span>   * @throws InterruptedException<a name="line.3443"></a>
+<span class="sourceLineNo">3444</span>   *           thread join<a name="line.3444"></a>
+<span class="sourceLineNo">3445</span>   */<a name="line.3445"></a>
+<span class="sourceLineNo">3446</span>  @Test<a name="line.3446"></a>
+<span class="sourceLineNo">3447</span>  public void testFlushCacheWhileScanning() throws IOException, InterruptedException {<a name="line.3447"></a>
+<span class="sourceLineNo">3448</span>    byte[] family = Bytes.toBytes("family");<a name="line.3448"></a>
+<span class="sourceLineNo">3449</span>    int numRows = 1000;<a name="line.3449"></a>
+<span class="sourceLineNo">3450</span>    int flushAndScanInterval = 10;<a name="line.3450"></a>
+<span class="sourceLineNo">3451</span>    int compactInterval = 10 * flushAndScanInterval;<a name="line.3451"></a>
 <span class="sourceLineNo">3452</span><a name="line.3452"></a>
-<span class="sourceLineNo">3453</span>      int expectedCount = 0;<a name="line.3453"></a>
-<span class="sourceLineNo">3454</span>      List&lt;Cell&gt; res = new ArrayList&lt;&gt;();<a name="line.3454"></a>
-<span class="sourceLineNo">3455</span><a name="line.3455"></a>
-<span class="sourceLineNo">3456</span>      boolean toggle = true;<a name="line.3456"></a>
-<span class="sourceLineNo">3457</span>      for (long i = 0; i &lt; numRows; i++) {<a name="line.3457"></a>
-<span class="sourceLineNo">3458</span>        Put put = new Put(Bytes.toBytes(i));<a name="line.3458"></a>
-<span class="sourceLineNo">3459</span>        put.setDurability(Durability.SKIP_WAL);<a name="line.3459"></a>
-<span class="sourceLineNo">3460</span>        put.addColumn(family, qual1, Bytes.toBytes(i % 10));<a name="line.3460"></a>
-<span class="sourceLineNo">3461</span>        region.put(put);<a name="line.3461"></a>
+<span class="sourceLineNo">3453</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.3453"></a>
+<span class="sourceLineNo">3454</span>    FlushThread flushThread = new FlushThread();<a name="line.3454"></a>
+<span class="sourceLineNo">3455</span>    try {<a name="line.3455"></a>
+<span class="sourceLineNo">3456</span>      flushThread.start();<a name="line.3456"></a>
+<span class="sourceLineNo">3457</span><a name="line.3457"></a>
+<span class="sourceLineNo">3458</span>      Scan scan = new Scan();<a name="line.3458"></a>
+<span class="sourceLineNo">3459</span>      scan.addFamily(family);<a name="line.3459"></a>
+<span class="sourceLineNo">3460</span>      scan.setFilter(new SingleColumnValueFilter(family, qual1, CompareOperator.EQUAL,<a name="line.3460"></a>
+<span class="sourceLineNo">3461</span>          new BinaryComparator(Bytes.toBytes(5L))));<a name="line.3461"></a>
 <span class="sourceLineNo">3462</span><a name="line.3462"></a>
-<span class="sourceLineNo">3463</span>        if (i != 0 &amp;&amp; i % compactInterval == 0) {<a name="line.3463"></a>
-<span class="sourceLineNo">3464</span>          LOG.debug("iteration = " + i+ " ts="+System.currentTimeMillis());<a name="line.3464"></a>
-<span class="sourceLineNo">3465</span>          region.compact(true);<a name="line.3465"></a>
-<span class="sourceLineNo">3466</span>        }<a name="line.3466"></a>
-<span class="sourceLineNo">3467</span><a name="line.3467"></a>
-<span class="sourceLineNo">3468</span>        if (i % 10 == 5L) {<a name="line.3468"></a>
-<span class="sourceLineNo">3469</span>          expectedCount++;<a name="line.3469"></a>
-<span class="sourceLineNo">3470</span>        }<a name="line.3470"></a>
-<span class="sourceLineNo">3471</span><a name="line.3471"></a>
-<span class="sourceLineNo">3472</span>        if (i != 0 &amp;&amp; i % flushAndScanInterval == 0) {<a name="line.3472"></a>
-<span class="sourceLineNo">3473</span>          res.clear();<a name="line.3473"></a>
-<span class="sourceLineNo">3474</span>          InternalScanner scanner = region.getScanner(scan);<a name="line.3474"></a>
-<span class="sourceLineNo">3475</span>          if (toggle) {<a name="line.3475"></a>
-<span class="sourceLineNo">3476</span>            flushThread.flush();<a name="line.3476"></a>
-<span class="sourceLineNo">3477</span>          }<a name="line.3477"></a>
-<span class="sourceLineNo">3478</span>          while (scanner.next(res))<a name="line.3478"></a>
-<span class="sourceLineNo">3479</span>            ;<a name="line.3479"></a>
-<span class="sourceLineNo">3480</span>          if (!toggle) {<a name="line.3480"></a>
-<span class="sourceLineNo">3481</span>            flushThread.flush();<a name="line.3481"></a>
-<span class="sourceLineNo">3482</span>          }<a name="line.3482"></a>
-<span class="sourceLineNo">3483</span>          assertEquals("toggle="+toggle+"i=" + i + " ts="+System.currentTimeMillis(),<a name="line.3483"></a>
-<span class="sourceLineNo">3484</span>              expectedCount, res.size());<a name="line.3484"></a>
-<span class="sourceLineNo">3485</span>          toggle = !toggle;<a name="line.3485"></a>
-<span class="sourceLineNo">3486</span>        }<a name="line.3486"></a>
-<span class="sourceLineNo">3487</span>      }<a name="line.3487"></a>
-<span class="sourceLineNo">3488</span><a name="line.3488"></a>
-<span class="sourceLineNo">3489</span>    } finally {<a name="line.3489"></a>
-<span class="sourceLineNo">3490</span>      try {<a name="line.3490"></a>
-<span class="sourceLineNo">3491</span>        flushThread.done();<a name="line.3491"></a>
-<span class="sourceLineNo">3492</span>        flushThread.join();<a name="line.3492"></a>
-<span class="sourceLineNo">3493</span>        flushThread.checkNoError();<a name="line.3493"></a>
-<span class="sourceLineNo">3494</span>      } catch (InterruptedException ie) {<a name="line.3494"></a>
-<span class="sourceLineNo">3495</span>        LOG.warn("Caught exception when joining with flushThread", ie);<a name="line.3495"></a>
-<span class="sourceLineNo">3496</span>      }<a name="line.3496"></a>
-<span class="sourceLineNo">3497</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.3497"></a>
-<span class="sourceLineNo">3498</span>      this.region = null;<a name="line.3498"></a>
-<span class="sourceLineNo">3499</span>    }<a name="line.3499"></a>
-<span class="sourceLineNo">3500</span>  }<a name="line.3500"></a>
-<span class="sourceLineNo">3501</span><a name="line.3501"></a>
-<span class="sourceLineNo">3502</span>  protected class FlushThread extends Thread {<a name="line.3502"></a>
-<span class="sourceLineNo">3503</span>    private volatile boolean done;<a name="line.3503"></a>
-<span class="sourceLineNo">3504</span>    private Throwable error = null;<a name="line.3504"></a>
-<span class="sourceLineNo">3505</span><a name="line.3505"></a>
-<span class="sourceLineNo">3506</span>    FlushThread() {<a name="line.3506"></a>
-<span class="sourceLineNo">3507</span>      super("FlushThread");<a name="line.3507"></a>
-<span class="sourceLineNo">3508</span>    }<a name="line.3508"></a>
-<span class="sourceLineNo">3509</span><a name="line.3509"></a>
-<span class="sourceLineNo">3510</span>    public void done() {<a name="line.3510"></a>
-<span class="sourceLineNo">3511</span>      done = true;<a name="line.3511"></a>
-<span class="sourceLineNo">3512</span>      synchronized (this) {<a name="line.3512"></a>
-<span class="sourceLineNo">3513</span>        interrupt();<a name="line.3513"></a>
-<span class="sourceLineNo">3514</span>      }<a name="line.3514"></a>
-<span class="sourceLineNo">3515</span>    }<a name="line.3515"></a>
-<span class="sourceLineNo">3516</span><a name="line.3516"></a>
-<span class="sourceLineNo">3517</span>    public void checkNoError() {<a name="line.3517"></a>
-<span class="sourceLineNo">3518</span>      if (error != null) {<a name="line.3518"></a>
-<span class="sourceLineNo">3519</span>        assertNull(error);<a name="line.3519"></a>
-<span class="sourceLineNo">3520</span>      }<a name="line.3520"></a>
-<span class="sourceLineNo">3521</span>    }<a name="line.3521"></a>
-<span class="sourceLineNo">3522</span><a name="line.3522"></a>
-<span class="sourceLineNo">3523</span>    @Override<a name="line.3523"></a>
-<span class="sourceLineNo">3524</span>    public void run() {<a name="line.3524"></a>
-<span class="sourceLineNo">3525</span>      done = false;<a name="line.3525"></a>
-<span class="sourceLineNo">3526</span>      while (!done) {<a name="line.3526"></a>
-<span class="sourceLineNo">3527</span>        synchronized (this) {<a name="line.3527"></a>
-<span class="sourceLineNo">3528</span>          try {<a name="line.3528"></a>
-<span class="sourceLineNo">3529</span>            wait();<a name="line.3529"></a>
-<span class="sourceLineNo">3530</span>          } catch (InterruptedException ignored) {<a name="line.3530"></a>
-<span class="sourceLineNo">3531</span>            if (done) {<a name="line.3531"></a>
-<span class="sourceLineNo">3532</span>              break;<a name="line.3532"></a>
-<span class="sourceLineNo">3533</span>            }<a name="line.3533"></a>
-<span class="sourceLineNo">3534</span>          }<a name="line.3534"></a>
-<span class="sourceLineNo">3535</span>        }<a name="line.3535"></a>
-<span class="sourceLineNo">3536</span>        try {<a name="line.3536"></a>
-<span class="sourceLineNo">3537</span>          region.flush(true);<a name="line.3537"></a>
-<span class="sourceLineNo">3538</span>        } catch (IOException e) {<a name="line.3538"></a>
-<span class="sourceLineNo">3539</span>          if (!done) {<a name="line.3539"></a>
-<span class="sourceLineNo">3540</span>            LOG.error("Error while flushing cache", e);<a name="line.3540"></a>
-<span class="sourceLineNo">3541</span>            error = e;<a name="line.3541"></a>
-<span class="sourceLineNo">3542</span>          }<a name="line.3542"></a>
-<span class="sourceLineNo">3543</span>          break;<a name="line.3543"></a>
-<span class="sourceLineNo">3544</span>        } catch (Throwable t) {<a name="line.3544"></a>
-<span class="sourceLineNo">3545</span>          LOG.error("Uncaught exception", t);<a name="line.3545"></a>
-<span class="sourceLineNo">3546</span>          throw t;<a name="line.3546"></a>
-<span class="sourceLineNo">3547</span>        }<a name="line.3547"></a>
-<span class="sourceLineNo">3548</span>      }<a name="line.3548"></a>
-<span class="sourceLineNo">3549</span>    }<a name="line.3549"></a>
-<span class="sourceLineNo">3550</span><a name="line.3550"></a>
-<span class="sourceLineNo">3551</span>    public void flush() {<a name="line.3551"></a>
-<span class="sourceLineNo">3552</span>      synchronized (this) {<a name="line.3552"></a>
-<span class="sourceLineNo">3553</span>        notify();<a name="line.3553"></a>
-<span class="sourceLineNo">3554</span>      }<a name="line.3554"></a>
-<span class="sourceLineNo">3555</span>    }<a name="line.3555"></a>
-<span class="sourceLineNo">3556</span>  }<a name="line.3556"></a>
-<span class="sourceLineNo">3557</span><a name="line.3557"></a>
-<span class="sourceLineNo">3558</span>  /**<a name="line.3558"></a>
-<span class="sourceLineNo">3559</span>   * Writes very wide records and scans for the latest every time.. Flushes and<a name="line.3559"></a>
-<span class="sourceLineNo">3560</span>   * compacts the region every now and then to keep things realistic.<a name="line.3560"></a>
-<span class="sourceLineNo">3561</span>   *<a name="line.3561"></a>
-<span class="sourceLineNo">3562</span>   * @throws IOException<a name="line.3562"></a>
-<span class="sourceLineNo">3563</span>   *           by flush / scan / compaction<a name="line.3563"></a>
-<span class="sourceLineNo">3564</span>   * @throws InterruptedException<a name="line.3564"></a>
-<span class="sourceLineNo">3565</span>   *           when joining threads<a name="line.3565"></a>
-<span class="sourceLineNo">3566</span>   */<a name="line.3566"></a>
-<span class="sourceLineNo">3567</span>  @Test<a name="line.3567"></a>
-<span class="sourceLineNo">3568</span>  public void testWritesWhileScanning() throws IOException, InterruptedException {<a name="line.3568"></a>
-<span class="sourceLineNo">3569</span>    int testCount = 100;<a name="line.3569"></a>
-<span class="sourceLineNo">3570</span>    int numRows = 1;<a name="line.3570"></a>
-<span class="sourceLineNo">3571</span>    int numFamilies = 10;<a name="line.3571"></a>
-<span class="sourceLineNo">3572</span>    int numQualifiers = 100;<a name="line.3572"></a>
-<span class="sourceLineNo">3573</span>    int flushInterval = 7;<a name="line.3573"></a>
-<span class="sourceLineNo">3574</span>    int compactInterval = 5 * flushInterval;<a name="line.3574"></a>
-<span class="sourceLineNo">3575</span>    byte[][] families = new byte[numFamilies][];<a name="line.3575"></a>
-<span class="sourceLineNo">3576</span>    for (int i = 0; i &lt; numFamilies; i++) {<a name="line.3576"></a>
-<span class="sourceLineNo">3577</span>      families[i] = Bytes.toBytes("family" + i);<a name="line.3577"></a>
-<span class="sourceLineNo">3578</span>    }<a name="line.3578"></a>
-<span class="sourceLineNo">3579</span>    byte[][] qualifiers = new byte[numQualifiers][];<a name="line.3579"></a>
-<span class="sourceLineNo">3580</span>    for (int i = 0; i &lt; numQualifiers; i++) {<a name="line.3580"></a>
-<span class="sourceLineNo">3581</span>      qualifiers[i] = Bytes.toBytes("qual" + i);<a name="line.3581"></a>
-<span class="sourceLineNo">3582</span>    }<a name="line.3582"></a>
-<span class="sourceLineNo">3583</span><a name="line.3583"></a>
-<span class="sourceLineNo">3584</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.3584"></a>
-<span class="sourceLineNo">3585</span>    FlushThread flushThread = new FlushThread();<a name="line.3585"></a>
-<span class="sourceLineNo">3586</span>    PutThread putThread = new PutThread(numRows, families, qualifiers);<a name="line.3586"></a>
-<span class="sourceLineNo">3587</span>    try {<a name="line.3587"></a>
-<span class="sourceLineNo">3588</span>      putThread.start();<a name="line.3588"></a>
-<span class="sourceLineNo">3589</span>      putThread.waitForFirstPut();<a name="line.3589"></a>
-<span class="sourceLineNo">3590</span><a name="line.3590"></a>
-<span class="sourceLineNo">3591</span>      flushThread.start();<a name="line.3591"></a>
-<span class="sourceLineNo">3592</span><a name="line.3592"></a>
-<span class="sourceLineNo">3593</span>      Scan scan = new Scan(Bytes.toBytes("row0"), Bytes.toBytes("row1"));<a name="line.3593"></a>
-<span class="sourceLineNo">3594</span><a name="line.3594"></a>
-<span class="sourceLineNo">3595</span>      int expectedCount = numFamilies * numQualifiers;<a name="line.3595"></a>
-<span class="sourceLineNo">3596</span>      List&lt;Cell&gt; res = new ArrayList&lt;&gt;();<a name="line.3596"></a>
-<span class="sourceLineNo">3597</span><a name="line.3597"></a>
-<span class="sourceLineNo">3598</span>      long prevTimestamp = 0L;<a name="line.3598"></a>
-<span class="sourceLineNo">3599</span>      for (int i = 0; i &lt; testCount; i++) {<a name="line.3599"></a>
+<span class="sourceLineNo">3463</span>      int expectedCount = 0;<a name="line.3463"></a>
+<span class="sourceLineNo">3464</span>      List&lt;Cell&gt; res = new ArrayList&lt;&gt;();<a name="line.3464"></a>
+<span class="sourceLineNo">3465</span><a name="line.3465"></a>
+<span class="sourceLineNo">3466</span>      boolean toggle = true;<a name="line.3466"></a>
+<span class="sourceLineNo">3467</span>      for (long i = 0; i &lt; numRows; i++) {<a name="line.3467"></a>
+<span class="sourceLineNo">3468</span>        Put put = new Put(Bytes.toBytes(i));<a name="line.3468"></a>
+<span class="sourceLineNo">3469</span>        put.setDurability(Durability.SKIP_WAL);<a name="line.3469"></a>
+<span class="sourceLineNo">3470</span>        put.addColumn(family, qual1, Bytes.toBytes(i % 10));<a name="line.3470"></a>
+<span class="sourceLineNo">3471</span>        region.put(put);<a name="line.3471"></a>
+<span class="sourceLineNo">3472</span><a name="line.3472"></a>
+<span class="sourceLineNo">3473</span>        if (i != 0 &amp;&amp; i % compactInterval == 0) {<a name="line.3473"></a>
+<span class="sourceLineNo">3474</span>          LOG.debug("iteration = " + i+ " ts="+System.currentTimeMillis());<a name="line.3474"></a>
+<span class="sourceLineNo">3475</span>          region.compact(true);<a name="line.3475"></a>
+<span class="sourceLineNo">3476</span>        }<a name="line.3476"></a>
+<span class="sourceLineNo">3477</span><a name="line.3477"></a>
+<span class="sourceLineNo">3478</span>        if (i % 10 == 5L) {<a name="line.3478"></a>
+<span class="sourceLineNo">3479</span>          expectedCount++;<a name="line.3479"></a>
+<span class="sourceLineNo">3480</span>        }<a name="line.3480"></a>
+<span class="sourceLineNo">3481</span><a name="line.3481"></a>
+<span class="sourceLineNo">3482</span>        if (i != 0 &amp;&amp; i % flushAndScanInterval == 0) {<a name="line.3482"></a>
+<span class="sourceLineNo">3483</span>          res.clear();<a name="line.3483"></a>
+<span class="sourceLineNo">3484</span>          InternalScanner scanner = region.getScanner(scan);<a name="line.3484"></a>
+<span class="sourceLineNo">3485</span>          if (toggle) {<a name="line.3485"></a>
+<span class="sourceLineNo">3486</span>            flushThread.flush();<a name="line.3486"></a>
+<span class="sourceLineNo">3487</span>          }<a name="line.3487"></a>
+<span class="sourceLineNo">3488</span>          while (scanner.next(res))<a name="line.3488"></a>
+<span class="sourceLineNo">3489</span>            ;<a name="line.3489"></a>
+<span class="sourceLineNo">3490</span>          if (!toggle) {<a name="line.3490"></a>
+<span class="sourceLineNo">3491</span>            flushThread.flush();<a name="line.3491"></a>
+<span class="sourceLineNo">3492</span>          }<a name="line.3492"></a>
+<span class="sourceLineNo">3493</span>          assertEquals("toggle="+toggle+"i=" + i + " ts="+System.currentTimeMillis(),<a name="line.3493"></a>
+<span class="sourceLineNo">3494</span>              expectedCount, res.size());<a name="line.3494"></a>
+<span class="sourceLineNo">3495</span>          toggle = !toggle;<a name="line.3495"></a>
+<span class="sourceLineNo">3496</span>        }<a name="line.3496"></a>
+<span class="sourceLineNo">3497</span>      }<a name="line.3497"></a>
+<span class="sourceLineNo">3498</span><a name="line.3498"></a>
+<span class="sourceLineNo">3499</span>    } finally {<a name="line.3499"></a>
+<span class="sourceLineNo">3500</span>      try {<a name="line.3500"></a>
+<span class="sourceLineNo">3501</span>        flushThread.done();<a name="line.3501"></a>
+<span class="sourceLineNo">3502</span>        flushThread.join();<a name="line.3502"></a>
+<span class="sourceLineNo">3503</span>        flushThread.checkNoError();<a name="line.3503"></a>
+<span class="sourceLineNo">3504</span>      } catch (InterruptedException ie) {<a name="line.3504"></a>
+<span class="sourceLineNo">3505</span>        LOG.warn("Caught exception when joining with flushThread", ie);<a name="line.3505"></a>
+<span class="sourceLineNo">3506</span>      }<a name="line.3506"></a>
+<span class="sourceLineNo">3507</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.3507"></a>
+<span class="sourceLineNo">3508</span>      this.region = null;<a name="line.3508"></a>
+<span class="sourceLineNo">3509</span>    }<a name="line.3509"></a>
+<span class="sourceLineNo">3510</span>  }<a name="line.3510"></a>
+<span class="sourceLineNo">3511</span><a name="line.3511"></a>
+<span class="sourceLineNo">3512</span>  protected class FlushThread extends Thread {<a name="line.3512"></a>
+<span class="sourceLineNo">3513</span>    private volatile boolean done;<a name="line.3513"></a>
+<span class="sourceLineNo">3514</span>    private Throwable error = null;<a name="line.3514"></a>
+<span class="sourceLineNo">3515</span><a name="line.3515"></a>
+<span class="sourceLineNo">3516</span>    FlushThread() {<a name="line.3516"></a>
+<span class="sourceLineNo">3517</span>      super("FlushThread");<a name="line.3517"></a>
+<span class="sourceLineNo">3518</span>    }<a name="line.3518"></a>
+<span class="sourceLineNo">3519</span><a name="line.3519"></a>
+<span class="sourceLineNo">3520</span>    public void done() {<a name="line.3520"></a>
+<span class="sourceLineNo">3521</span>      done = true;<a name="line.3521"></a>
+<span class="sourceLineNo">3522</span>      synchronized (this) {<a name="line.3522"></a>
+<span class="sourceLineNo">3523</span>        interrupt();<a name="line.3523"></a>
+<span class="sourceLineNo">3524</span>      }<a name="line.3524"></a>
+<span class="sourceLineNo">3525</span>    }<a name="line.3525"></a>
+<span class="sourceLineNo">3526</span><a name="line.3526"></a>
+<span class="sourceLineNo">3527</span>    public void checkNoError() {<a name="line.3527"></a>
+<span class="sourceLineNo">3528</span>      if (error != null) {<a name="line.3528"></a>
+<span class="sourceLineNo">3529</span>        assertNull(error);<a name="line.3529"></a>
+<span class="sourceLineNo">3530</span>      }<a name="line.3530"></a>
+<span class="sourceLineNo">3531</span>    }<a name="line.3531"></a>
+<span class="sourceLineNo">3532</span><a name="line.3532"></a>
+<span class="sourceLineNo">3533</span>    @Override<a name="line.3533"></a>
+<span class="sourceLineNo">3534</span>    public void run() {<a name="line.3534"></a>
+<span class="sourceLineNo">3535</span>      done = false;<a name="line.3535"></a>
+<span class="sourceLineNo">3536</span>      while (!done) {<a name="line.3536"></a>
+<span class="sourceLineNo">3537</span>        synchronized (this) {<a name="line.3537"></a>
+<span class="sourceLineNo">3538</span>          try {<a name="line.3538"></a>
+<span class="sourceLineNo">3539</span>            wait();<a name="line.3539"></a>
+<span class="sourceLineNo">3540</span>          } catch (InterruptedException ignored) {<a name="line.3540"></a>
+<span class="sourceLineNo">3541</span>            if (done) {<a name="line.3541"></a>
+<span class="sourceLineNo">3542</span>              break;<a name="line.3542"></a>
+<span class="sourceLineNo">3543</span>            }<a name="line.3543"></a>
+<span class="sourceLineNo">3544</span>          }<a name="line.3544"></a>
+<span class="sourceLineNo">3545</span>        }<a name="line.3545"></a>
+<span class="sourceLineNo">3546</span>        try {<a name="line.3546"></a>
+<span class="sourceLineNo">3547</span>          region.flush(true);<a name="line.3547"></a>
+<span class="sourceLineNo">3548</span>        } catch (IOException e) {<a name="line.3548"></a>
+<span class="sourceLineNo">3549</span>          if (!done) {<a name="line.3549"></a>
+<span class="sourceLineNo">3550</span>            LOG.error("Error while flushing cache", e);<a name="line.3550"></a>
+<span class="sourceLineNo">3551</span>            error = e;<a name="line.3551"></a>
+<span class="sourceLineNo">3552</span>          }<a name="line.3552"></a>
+<span class="sourceLineNo">3553</span>          break;<a name="line.3553"></a>
+<span class="sourceLineNo">3554</span>        } catch (Throwable t) {<a name="line.3554"></a>
+<span class="sourceLineNo">3555</span>          LOG.error("Uncaught exception", t);<a name="line.3555"></a>
+<span class="sourceLineNo">3556</span>          throw t;<a name="line.3556"></a>
+<span class="sourceLineNo">3557</span>        }<a name="line.3557"></a>
+<span class="sourceLineNo">3558</span>      }<a name="line.3558"></a>
+<span class="sourceLineNo">3559</span>    }<a name="line.3559"></a>
+<span class="sourceLineNo">3560</span><a name="line.3560"></a>
+<span class="sourceLineNo">3561</span>    public void flush() {<a name="line.3561"></a>
+<span class="sourceLineNo">3562</span>      synchronized (this) {<a name="line.3562"></a>
+<span class="sourceLineNo">3563</span>        notify();<a name="line.3563"></a>
+<span class="sourceLineNo">3564</span>      }<a name="line.3564"></a>
+<span class="sourceLineNo">3565</span>    }<a name="line.3565"></a>
+<span class="sourceLineNo">3566</span>  }<a name="line.3566"></a>
+<span class="sourceLineNo">3567</span><a name="line.3567"></a>
+<span class="sourceLineNo">3568</span>  /**<a name="line.3568"></a>
+<span class="sourceLineNo">3569</span>   * Writes very wide records and scans for the latest every time.. Flushes and<a name="line.3569"></a>
+<span class="sourceLineNo">3570</span>   * compacts the region every now and then to keep things realistic.<a name="line.3570"></a>
+<span class="sourceLineNo">3571</span>   *<a name="line.3571"></a>
+<span class="sourceLineNo">3572</span>   * @throws IOException<a name="line.3572"></a>
+<span class="sourceLineNo">3573</span>   *           by flush / scan / compaction<a name="line.3573"></a>
+<span class="sourceLineNo">3574</span>   * @throws InterruptedException<a name="line.3574"></a>
+<span class="sourceLineNo">3575</span>   *           when joining threads<a name="line.3575"></a>
+<span class="sourceLineNo">3576</span>   */<a name="line.3576"></a>
+<span class="sourceLineNo">3577</span>  @Test<a name="line.3577"></a>
+<span class="sourceLineNo">3578</span>  public void testWritesWhileScanning() throws IOException, InterruptedException {<a name="line.3578"></a>
+<span class="sourceLineNo">3579</span>    int testCount = 100;<a name="line.3579"></a>
+<span class="sourceLineNo">3580</span>    int numRows = 1;<a name="line.3580"></a>
+<span class="sourceLineNo">3581</span>    int numFamilies = 10;<a name="line.3581"></a>
+<span class="sourceLineNo">3582</span>    int numQualifiers = 100;<a name="line.3582"></a>
+<span class="sourceLineNo">3583</span>    int flushInterval = 7;<a name="line.3583"></a>
+<span class="sourceLineNo">3584</span>    int compactInterval = 5 * flushInterval;<a name="line.3584"></a>
+<span class="sourceLineNo">3585</span>    byte[][] families = new byte[numFamilies][];<a name="line.3585"></a>
+<span class="sourceLineNo">3586</span>    for (int i = 0; i &lt; numFamilies; i++) {<a name="line.3586"></a>
+<span class="sourceLineNo">3587</span>      families[i] = Bytes.toBytes("family" + i);<a name="line.3587"></a>
+<span class="sourceLineNo">3588</span>    }<a name="line.3588"></a>
+<span class="sourceLineNo">3589</span>    byte[][] qualifiers = new byte[numQualifiers][];<a name="line.3589"></a>
+<span class="sourceLineNo">3590</span>    for (int i = 0; i &lt; numQualifiers; i++) {<a name="line.3590"></a>
+<span class="sourceLineNo">3591</span>      qualifiers[i] = Bytes.toBytes("qual" + i);<a name="line.3591"></a>
+<span class="sourceLineNo">3592</span>    }<a name="line.3592"></a>
+<span class="sourceLineNo">3593</span><a name="line.3593"></a>
+<span class="sourceLineNo">3594</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.3594"></a>
+<span class="sourceLineNo">3595</span>    FlushThread flushThread = new FlushThread();<a name="line.3595"></a>
+<span class="sourceLineNo">3596</span>    PutThread putThread = new PutThread(numRows, families, qualifiers);<a name="line.3596"></a>
+<span class="sourceLineNo">3597</span>    try {<a name="line.3597"></a>
+<span class="sourceLineNo">3598</span>      putThread.start();<a name="line.3598"></a>
+<span class="sourceLineNo">3599</span>      putThread.waitForFirstPut();<a name="line.3599"></a>
 <span class="sourceLineNo">3600</span><a name="line.3600"></a>
-<span class="sourceLineNo">3601</span>        if (i != 0 &amp;&amp; i % compactInterval == 0) {<a name="line.3601"></a>
-<span class="sourceLineNo">3602</span>          region.compact(true);<a name="line.3602"></a>
-<span class="sourceLineNo">3603</span>          for (HStore store : region.getStores()) {<a name="line.3603"></a>
-<span class="sourceLineNo">3604</span>            store.closeAndArchiveCompactedFiles();<a name="line.3604"></a>
-<span class="sourceLineNo">3605</span>          }<a name="line.3605"></a>
-<span class="sourceLineNo">3606</span>        }<a name="line.3606"></a>
+<span class="sourceLineNo">3601</span>      flushThread.start();<a name="line.3601"></a>
+<span class="sourceLineNo">3602</span><a name="line.3602"></a>
+<span class="sourceLineNo">3603</span>      Scan scan = new Scan(Bytes.toBytes("row0"), Bytes.toBytes("row1"));<a name="line.3603"></a>
+<span class="sourceLineNo">3604</span><a name="line.3604"></a>
+<span class="sourceLineNo">3605</span>      int expectedCount = numFamilies * numQualifiers;<a name="line.3605"></a>
+<span class="sourceLineNo">3606</span>      List&lt;Cell&gt; res = new ArrayList&lt;&gt;();<a name="line.3606"></a>
 <span class="sourceLineNo">3607</span><a name="line.3607"></a>
-<span class="sourceLineNo">3608</span>        if (i != 0 &amp;&amp; i % flushInterval == 0) {<a name="line.3608"></a>
-<span class="sourceLineNo">3609</span>          flushThread.flush();<a name="line.3609"></a>
-<span class="sourceLineNo">3610</span>        }<a name="line.3610"></a>
-<span class="sourceLineNo">3611</span><a name="line.3611"></a>
-<span class="sourceLineNo">3612</span>        boolean previousEmpty = res.isEmpty();<a name="line.3612"></a>
-<span class="sourceLineNo">3613</span>        res.clear();<a name="line.3613"></a>
-<span class="sourceLineNo">3614</span>        try (InternalScanner scanner = region.getScanner(scan)) {<a name="line.3614"></a>
-<span class="sourceLineNo">3615</span>          boolean moreRows;<a name="line.3615"></a>
-<span class="sourceLineNo">3616</span>          do {<a name="line.3616"></a>
-<span class="sourceLineNo">3617</span>            moreRows = scanner.next(res);<a name="line.3617"></a>
-<span class="sourceLineNo">3618</span>          } while (moreRows);<a name="line.3618"></a>
-<span class="sourceLineNo">3619</span>        }<a name="line.3619"></a>
-<span class="sourceLineNo">3620</span>        if (!res.isEmpty() || !previousEmpty || i &gt; compactInterval) {<a name="line.3620"></a>
-<span class="sourceLineNo">3621</span>          assertEquals("i=" + i, expectedCount, res.size());<a name="line.3621"></a>
-<span class="sourceLineNo">3622</span>          long timestamp = res.get(0).getTimestamp();<a name="line.3622"></a>
-<span class="sourceLineNo">3623</span>          assertTrue("Timestamps were broke: " + timestamp + " prev: " + prevTimestamp,<a name="line.3623"></a>
-<span class="sourceLineNo">3624</span>              timestamp &gt;= prevTimestamp);<a name="line.3624"></a>
-<span class="sourceLineNo">3625</span>          prevTimestamp = timestamp;<a name="line.3625"></a>
-<span class="sourceLineNo">3626</span>        }<a name="line.3626"></a>
-<span class="sourceLineNo">3627</span>      }<a name="line.3627"></a>
-<span class="sourceLineNo">3628</span><a name="line.3628"></a>
-<span class="sourceLineNo">3629</span>      putThread.done();<a name="line.3629"></a>
-<span class="sourceLineNo">3630</span><a name="line.3630"></a>
-<span class="sourceLineNo">3631</span>      region.flush(true);<a name="line.3631"></a>
-<span class="sourceLineNo">3632</span><a name="line.3632"></a>
-<span class="sourceLineNo">3633</span>    } finally {<a name="line.3633"></a>
-<span class="sourceLineNo">3634</span>      try {<a name="line.3634"></a>
-<span class="sourceLineNo">3635</span>        flushThread.done();<a name="line.3635"></a>
-<span class="sourceLineNo">3636</span>        flushThread.join();<a name="line.3636"></a>
-<span class="sourceLineNo">3637</span>        flushThread.checkNoError();<a name="line.3637"></a>
+<span class="sourceLineNo">3608</span>      long prevTimestamp = 0L;<a name="line.3608"></a>
+<span class="sourceLineNo">3609</span>      for (int i = 0; i &lt; testCount; i++) {<a name="line.3609"></a>
+<span class="sourceLineNo">3610</span><a name="line.3610"></a>
+<span class="sourceLineNo">3611</span>        if (i != 0 &amp;&amp; i % compactInterval == 0) {<a name="line.3611"></a>
+<span class="sourceLineNo">3612</span>          region.compact(true);<a name="line.3612"></a>
+<span class="sourceLineNo">3613</span>          for (HStore store : region.getStores()) {<a name="line.3613"></a>
+<span class="sourceLineNo">3614</span>            store.closeAndArchiveCompactedFiles();<a name="line.3614"></a>
+<span class="sourceLineNo">3615</span>          }<a name="line.3615"></a>
+<span class="sourceLineNo">3616</span>        }<a name="line.3616"></a>
+<span class="sourceLineNo">3617</span><a name="line.3617"></a>
+<span class="sourceLineNo">3618</span>        if (i != 0 &amp;&amp; i % flushInterval == 0) {<a name="line.3618"></a>
+<span class="sourceLineNo">3619</span>          flushThread.flush();<a name="line.3619"></a>
+<span class="sourceLineNo">3620</span>        }<a name="line.3620"></a>
+<span class="sourceLineNo">3621</span><a name="line.3621"></a>
+<span class="sourceLineNo">3622</span>        boolean previousEmpty = res.isEmpty();<a name="line.3622"></a>
+<span class="sourceLineNo">3623</span>        res.clear();<a name="line.3623"></a>
+<span class="sourceLineNo">3624</span>        try (InternalScanner scanner = region.getScanner(scan)) {<a name="line.3624"></a>
+<span class="sourceLineNo">3625</span>          boolean moreRows;<a name="line.3625"></a>
+<span class="sourceLineNo">3626</span>          do {<a name="line.3626"></a>
+<span class="sourceLineNo">3627</span>            moreRows = scanner.next(res);<a name="line.3627"></a>
+<span class="sourceLineNo">3628</span>          } while (moreRows);<a name="line.3628"></a>
+<span class="sourceLineNo">3629</span>        }<a name="line.3629"></a>
+<span class="sourceLineNo">3630</span>        if (!res.isEmpty() || !previousEmpty || i &gt; compactInterval) {<a name="line.3630"></a>
+<span class="sourceLineNo">3631</span>          assertEquals("i=" + i, expectedCount, res.size());<a name="line.3631"></a>
+<span class="sourceLineNo">3632</span>          long timestamp = res.get(0).getTimestamp();<a name="line.3632"></a>
+<span class="sourceLineNo">3633</span>          assertTrue("Timestamps were broke: " + timestamp + " prev: " + prevTimestamp,<a name="line.3633"></a>
+<span class="sourceLineNo">3634</span>              timestamp &gt;= prevTimestamp);<a name="line.3634"></a>
+<span class="sourceLineNo">3635</span>          prevTimestamp = timestamp;<a name="line.3635"></a>
+<span class="sourceLineNo">3636</span>        }<a name="line.3636"></a>
+<span class="sourceLineNo">3637</span>      }<a name="line.3637"></a>
 <span class="sourceLineNo">3638</span><a name="line.3638"></a>
-<span class="sourceLineNo">3639</span>        putThread.join();<a name="line.3639"></a>
-<span class="sourceLineNo">3640</span>        putThread.checkNoError();<a name="line.3640"></a>
-<span class="sourceLineNo">3641</span>      } catch (InterruptedException ie) {<a name="line.3641"></a>
-<span class="sourceLineNo">3642</span>        LOG.warn("Caught exception when joining with flushThread", ie);<a name="line.3642"></a>
-<span class="sourceLineNo">3643</span>      }<a name="line.3643"></a>
-<span class="sourceLineNo">3644</span><a name="line.3644"></a>
-<span class="sourceLineNo">3645</span>      try {<a name="line.3645"></a>
-<span class="sourceLineNo">3646</span>          HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.3646"></a>
-<span class="sourceLineNo">3647</span>      } catch (DroppedSnapshotException dse) {<a name="line.3647"></a>
-<span class="sourceLineNo">3648</span>        // We could get this on way out because we interrupt the background flusher and it could<a name="line.3648"></a>
-<span class="sourceLineNo">3649</span>        // fail anywhere causing a DSE over in the background flusher... only it is not properly<a name="line.3649"></a>
-<span class="sourceLineNo">3650</span>        // dealt with so could still be memory hanging out when we get to here -- memory we can't<a name="line.3650"></a>
-<span class="sourceLineNo">3651</span>        // flush because the accounting is 'off' since original DSE.<a name="line.3651"></a>
-<span class="sourceLineNo">3652</span>      }<a name="line.3652"></a>
-<span class="sourceLineNo">3653</span>      this.region = null;<a name="line.3653"></a>
-<span class="sourceLineNo">3654</span>    }<a name="line.3654"></a>
-<span class="sourceLineNo">3655</span>  }<a name="line.3655"></a>
-<span class="sourceLineNo">3656</span><a name="line.3656"></a>
-<span class="sourceLineNo">3657</span>  protected class PutThread extends Thread {<a name="line.3657"></a>
-<span class="sourceLineNo">3658</span>    private volatile boolean done;<a name="line.3658"></a>
-<span class="sourceLineNo">3659</span>    private volatile int numPutsFinished = 0;<a name="line.3659"></a>
-<span class="sourceLineNo">3660</span><a name="line.3660"></a>
-<span class="sourceLineNo">3661</span>    private Throwable error = null;<a name="line.3661"></a>
-<span class="sourceLineNo">3662</span>    private int numRows;<a name="line.3662"></a>
-<span class="sourceLineNo">3663</span>    private byte[][] families;<a name="line.3663"></a>
-<span class="sourceLineNo">3664</span>    private byte[][] qualifiers;<a name="line.3664"></a>
-<span class="sourceLineNo">3665</span><a name="line.3665"></a>
-<span class="sourceLineNo">3666</span>    private PutThread(int numRows, byte[][] families, byte[][] qualifiers) {<a name="line.3666"></a>
-<span class="sourceLineNo">3667</span>      super("PutThread");<a name="line.3667"></a>
-<span class="sourceLineNo">3668</span>      this.numRows = numRows;<a name="line.3668"></a>
-<span class="sourceLineNo">3669</span>      this.families = families;<a name="line.3669"></a>
-<span class="sourceLineNo">3670</span>      this.qualifiers = qualifiers;<a name="line.3670"></a>
-<span class="sourceLineNo">3671</span>    }<a name="line.3671"></a>
-<span class="sourceLineNo">3672</span><a name="line.3672"></a>
-<span class="sourceLineNo">3673</span>    /**<a name="line.3673"></a>
-<span class="sourceLineNo">3674</span>     * Block calling thread until this instance of PutThread has put at least one row.<a name="line.3674"></a>
-<span class="sourceLineNo">3675</span>     */<a name="line.3675"></a>
-<span class="sourceLineNo">3676</span>    public void waitForFirstPut() throws InterruptedException {<a name="line.3676"></a>
-<span class="sourceLineNo">3677</span>      // wait until put thread actually puts some data<a name="line.3677"></a>
-<span class="sourceLineNo">3678</span>      while (isAlive() &amp;&amp; numPutsFinished == 0) {<a name="line.3678"></a>
-<span class="sourceLineNo">3679</span>        checkNoError();<a name="line.3679"></a>
-<span class="sourceLineNo">3680</span>        Thread.sleep(50);<a name="line.3680"></a>
-<span class="sourceLineNo">3681</span>      }<a name="line.3681"></a>
-<span class="sourceLineNo">3682</span>    }<a name="line.3682"></a>
-<span class="sourceLineNo">3683</span><a name="line.3683"></a>
-<span class="sourceLineNo">3684</span>    public void done() {<a name="line.3684"></a>
-<span class="sourceLineNo">3685</span>      done = true;<a name="line.3685"></a>
-<span class="sourceLineNo">3686</span>      synchronized (this) {<a name="line.3686"></a>
-<span class="sourceLineNo">3687</span>        interrupt();<a name="line.3687"></a>
-<span class="sourceLineNo">3688</span>      }<a name="line.3688"></a>
-<span class="sourceLineNo">3689</span>    }<a name="line.3689"></a>
-<span class="sourceLineNo">3690</span><a name="line.3690"></a>
-<span class="sourceLineNo">3691</span>    public void checkNoError() {<a name="line.3691"></a>
-<span class="sourceLineNo">3692</span>      if (error != null) {<a name="line.3692"></a>
-<span class="sourceLineNo">3693</span>        assertNull(error);<a name="line.3693"></a>
-<span class="sourceLineNo">3694</span>      }<a name="line.3694"></a>
-<span class="sourceLineNo">3695</span>    }<a name="line.3695"></a>
-<span class="sourceLineNo">3696</span><a name="line.3696"></a>
-<span class="sourceLineNo">3697</span>    @Override<a name="line.3697"></a>
-<span class="sourceLineNo">3698</span>    public void run() {<a name="line.3698"></a>
-<span class="sourceLineNo">3699</span>      done = false;<a name="line.3699"></a>
-<span class="sourceLineNo">3700</span>      while (!done) {<a name="line.3700"></a>
-<span class="sourceLineNo">3701</span>        try {<a name="line.3701"></a>
-<span class="sourceLineNo">3702</span>          for (int r = 0; r &lt; numRows; r++) {<a name="line.3702"></a>
-<span class="sourceLineNo">3703</span>            byte[] row = Bytes.toBytes("row" + r);<a name="line.3703"></a>
-<span class="sourceLineNo">3704</span>            Put put = new Put(row);<a name="line.3704"></a>
-<span class="sourceLineNo">3705</span>            put.setDurability(Durability.SKIP_WAL);<a name="line.3705"></a>
-<span class="sourceLineNo">3706</span>            byte[] value = Bytes.toBytes(String.valueOf(numPutsFinished));<a name="line.3706"></a>
-<span class="sourceLineNo">3707</span>            for (byte[] family : families) {<a name="line.3707"></a>
-<span class="sourceLineNo">3708</span>              for (byte[] qualifier : qualifiers) {<a name="line.3708"></a>
-<span class="sourceLineNo">3709</span>                put.addColumn(family, qualifier, numPutsFinished, value);<a name="line.3709"></a>
-<span class="sourceLineNo">3710</span>              }<a name="line.3710"></a>
-<span class="sourceLineNo">3711</span>            }<a name="line.3711"></a>
-<span class="sourceLineNo">3712</span>            region.put(put);<a name="line.3712"></a>
-<span class="sourceLineNo">3713</span>            numPutsFinished++;<a name="line.3713"></a>
-<span class="sourceLineNo">3714</span>            if (numPutsFinished &gt; 0 &amp;&amp; numPutsFinished % 47 == 0) {<a name="line.3714"></a>
-<span class="sourceLineNo">3715</span>              LOG.debug("put iteration = {}", numPutsFinished);<a name="line.3715"></a>
-<span class="sourceLineNo">3716</span>              Delete delete = new Delete(row, (long) numPutsFinished - 30);<a name="line.3716"></a>
-<span class="sourceLineNo">3717</span>              region.delete(delete);<a name="line.3717"></a>
-<span class="sourceLineNo">3718</span>            }<a name="line.3718"></a>
-<span class="sourceLineNo">3719</span>            numPutsFinished++;<a name="line.3719"></a>
-<span class="sourceLineNo">3720</span>          }<a name="line.3720"></a>
-<span class="sourceLineNo">3721</span>        } catch (InterruptedIOException e) {<a name="line.3721"></a>
-<span class="sourceLineNo">3722</span>          // This is fine. It means we are done, or didn't get the lock on time<a name="line.3722"></a>
-<span class="sourceLineNo">3723</span>          LOG.info("Interrupted", e);<a name="line.3723"></a>
-<span class="sourceLineNo">3724</span>        } catch (IOException e) {<a name="line.3724"></a>
-<span class="sourceLineNo">3725</span>          LOG.error("Error while putting records", e);<a name="line.3725"></a>
-<span class="sourceLineNo">3726</span>          error = e;<a name="line.3726"></a>
-<span class="sourceLineNo">3727</span>          break;<a name="line.3727"></a>
-<span class="sourceLineNo">3728</span>        }<a name="line.3728"></a>
-<span class="sourceLineNo">3729</span>      }<a name="line.3729"></a>
-<span class="sourceLineNo">3730</span><a name="line.3730"></a>
-<span class="sourceLineNo">3731</span>    }<a name="line.3731"></a>
-<span class="sourceLineNo">3732</span><a name="line.3732"></a>
-<span class="sourceLineNo">3733</span>  }<a name="line.3733"></a>
-<span class="sourceLineNo">3734</span><a name="line.3734"></a>
-<span class="sourceLineNo">3735</span>  /**<a name="line.3735"></a>
-<span class="sourceLineNo">3736</span>   * Writes very wide records and gets the latest row every time.. Flushes and<a name="line.3736"></a>
-<span class="sourceLineNo">3737</span>   * compacts the region aggressivly to catch issues.<a name="line.3737"></a>
-<span class="sourceLineNo">3738</span>   *<a name="line.3738"></a>
-<span class="sourceLineNo">3739</span>   * @throws IOException<a name="line.3739"></a>
-<span class="sourceLineNo">3740</span>   *           by flush / scan / compaction<a name="line.3740"></a>
-<span class="sourceLineNo">3741</span>   * @throws InterruptedException<a name="line.3741"></a>
-<span class="sourceLineNo">3742</span>   *           when joining threads<a name="line.3742"></a>
-<span class="sourceLineNo">3743</span>   */<a name="line.3743"></a>
-<span class="sourceLineNo">3744</span>  @Test<a name="line.3744"></a>
-<span class="sourceLineNo">3745</span>  public void testWritesWhileGetting() throws Exception {<a name="line.3745"></a>
-<span class="sourceLineNo">3746</span>    int testCount = 50;<a name="line.3746"></a>
-<span class="sourceLineNo">3747</span>    int numRows = 1;<a name="line.3747"></a>
-<span class="sourceLineNo">3748</span>    int numFamilies = 10;<a name="line.3748"></a>
-<span class="sourceLineNo">3749</span>    int numQualifiers = 100;<a name="line.3749"></a>
-<span class="sourceLineNo">3750</span>    int compactInterval = 100;<a name="line.3750"></a>
-<span class="sourceLineNo">3751</span>    byte[][] families = new byte[numFamilies][];<a name="line.3751"></a>
-<span class="sourceLineNo">3752</span>    for (int i = 0; i &lt; numFamilies; i++) {<a name="line.3752"></a>
-<span class="sourceLineNo">3753</span>      families[i] = Bytes.toBytes("family" + i);<a name="line.3753"></a>
-<span class="sourceLineNo">3754</span>    }<a name="line.3754"></a>
-<span class="sourceLineNo">3755</span>    byte[][] qualifiers = new byte[numQualifiers][];<a name="line.3755"></a>
-<span class="sourceLineNo">3756</span>    for (int i = 0; i &lt; numQualifiers; i++) {<a name="line.3756"></a>
-<span class="sourceLineNo">3757</span>      qualifiers[i] = Bytes.toBytes("qual" + i);<a name="line.3757"></a>
-<span class="sourceLineNo">3758</span>    }<a name="line.3758"></a>
-<span class="sourceLineNo">3759</span><a name="line.3759"></a>
-<span class="sourceLineNo">3760</span><a name="line.3760"></a>
-<span class="sourceLineNo">3761</span>    // This test flushes constantly and can cause many files to be created,<a name="line.3761"></a>
-<span class="sourceLineNo">3762</span>    // possibly<a name="line.3762"></a>
-<span class="sourceLineNo">3763</span>    // extending over the ulimit. Make sure compactions are aggressive in<a name="line.3763"></a>
-<span class="sourceLineNo">3764</span>    // reducing<a name="line.3764"></a>
-<span class="sourceLineNo">3765</span>    // the number of HFiles created.<a name="line.3765"></a>
-<span class="sourceLineNo">3766</span>    Configuration conf = HBaseConfiguration.create(CONF);<a name="line.3766"></a>
-<span class="sourceLineNo">3767</span>    conf.setInt("hbase.hstore.compaction.min", 1);<a name="line.3767"></a>
-<span class="sourceLineNo">3768</span>    conf.setInt("hbase.hstore.compaction.max", 1000);<a name="line.3768"></a>
-<span class="sourceLineNo">3769</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.3769"></a>
-<span class="sourceLineNo">3770</span>    PutThread putThread = null;<a name="line.3770"></a>
-<span class="sourceLineNo">3771</span>    MultithreadedTestUtil.TestContext ctx = new MultithreadedTestUtil.TestContext(conf);<a name="line.3771"></a>
-<span class="sourceLineNo">3772</span>    try {<a name="line.3772"></a>
-<span class="sourceLineNo">3773</span>      putThread = new PutThread(numRows, families, qualifiers);<a name="line.3773"></a>
-<span class="sourceLineNo">3774</span>      putThread.start();<a name="line.3774"></a>
-<span class="sourceLineNo">3775</span>      putThread.waitForFirstPut();<a name="line.3775"></a>
-<span class="sourceLineNo">3776</span><a name="line.3776"></a>
-<span class="sourceLineNo">3777</span>      // Add a thread that flushes as fast as possible<a name="line.3777"></a>
-<span class="sourceLineNo">3778</span>      ctx.addThread(new RepeatingTestThread(ctx) {<a name="line.3778"></a>
-<span class="sourceLineNo">3779</span><a name="line.3779"></a>
-<span class="sourceLineNo">3780</span>        @Override<a name="line.3780"></a>
-<span class="sourceLineNo">3781</span>        public void doAnAction() throws Exception {<a name="line.3781"></a>
-<span class="sourceLineNo">3782</span>          region.flush(true);<a name="line.3782"></a>
-<span class="sourceLineNo">3783</span>          // Compact regularly to avoid creating too many files and exceeding<a name="line.3783"></a>
-<span class="sourceLineNo">3784</span>          // the ulimit.<a name="line.3784"></a>
-<span class="sourceLineNo">3785</span>          region.compact(false);<a name="line.3785"></a>
-<span class="sourceLineNo">3786</span>          for (HStore store : region.getStores()) {<a name="line.3786"></a>
-<span class="sourceLineNo">3787</span>            store.closeAndArchiveCompactedFiles();<a name="line.3787"></a>
-<span class="sourceLineNo">3788</span>          }<a name="line.3788"></a>
-<span class="sourceLineNo">3789</span>        }<a name="line.3789"></a>
-<span class="sourceLineNo">3790</span>      });<a name="line.3790"></a>
-<span class="sourceLineNo">3791</span>      ctx.startThreads();<a name="line.3791"></a>
-<span class="sourceLineNo">3792</span><a name="line.3792"></a>
-<span class="sourceLineNo">3793</span>      Get get = new Get(Bytes.toBytes("row0"));<a name="line.3793"></a>
-<span class="sourceLineNo">3794</span>      Result result = null;<a name="line.3794"></a>
-<span class="sourceLineNo">3795</span><a name="line.3795"></a>
-<span class="sourceLineNo">3796</span>      int expectedCount = numFamilies * numQualifiers;<a name="line.3796"></a>
-<span class="sourceLineNo">3797</span><a name="line.3797"></a>
-<span class="sourceLineNo">3798</span>      long prevTimestamp = 0L;<a name="line.3798"></a>
-<span class="sourceLineNo">3799</span>      for (int i = 0; i &lt; testCount; i++) {<a name="line.3799"></a>
-<span class="sourceLineNo">3800</span>        LOG.info("testWritesWhileGetting verify turn " + i);<a name="line.3800"></a>
-<span class="sourceLineNo">3801</span>        boolean previousEmpty = result == null || result.isEmpty();<a name="line.3801"></a>
-<span class="sourceLineNo">3802</span>        result = region.get(get);<a name="line.3802"></a>
-<span class="sourceLineNo">3803</span>        if (!result.isEmpty() || !previousEmpty || i &gt; compactInterval) {<a name="line.3803"></a>
-<span class="sourceLineNo">3804</span>          assertEquals("i=" + i, expectedCount, result.size());<a name="line.3804"></a>
-<span class="sourceLineNo">3805</span>          // TODO this was removed, now what dangit?!<a name="line.3805"></a>
-<span class="sourceLineNo">3806</span>          // search looking for the qualifier in question?<a name="line.3806"></a>
-<span class="sourceLineNo">3807</span>          long timestamp = 0;<a name="line.3807"></a>
-<span class="sourceLineNo">3808</span>          for (Cell kv : result.rawCells()) {<a name="line.3808"></a>
-<span class="sourceLineNo">3809</span>            if (CellUtil.matchingFamily(kv, families[0])<a name="line.3809"></a>
-<span class="sourceLineNo">3810</span>                &amp;&amp; CellUtil.matchingQualifier(kv, qualifiers[0])) {<a name="line.3810"></a>
-<span class="sourceLineNo">3811</span>              timestamp = kv.getTimestamp();<a name="line.3811"></a>
-<span class="sourceLineNo">3812</span>            }<a name="line.3812"></a>
-<span class="sourceLineNo">3813</span>          }<a name="line.3813"></a>
-<span class="sourceLineNo">3814</span>          assertTrue(timestamp &gt;= prevTimestamp);<a name="line.3814"></a>
-<span class="sourceLineNo">3815</span>          prevTimestamp = timestamp;<a name="line.3815"></a>
-<span class="sourceLineNo">3816</span>          Cell previousKV = null;<a name="line.3816"></a>
-<span class="sourceLineNo">3817</span><a name="line.3817"></a>
+<span class="sourceLineNo">3639</span>      putThread.done();<a name="line.3639"></a>
+<span class="sourceLineNo">3640</span><a name="line.3640"></a>
+<span class="sourceLineNo">3641</span>      region.flush(true);<a name="line.3641"></a>
+<span class="sourceLineNo">3642</span><a name="line.3642"></a>
+<span class="sourceLineNo">3643</span>    } finally {<a name="line.3643"></a>
+<span class="sourceLineNo">3644</span>      try {<a name="line.3644"></a>
+<span class="sourceLineNo">3645</span>        flushThread.done();<a name="line.3645"></a>
+<span class="sourceLineNo">3646</span>        flushThread.join();<a name="line.3646"></a>
+<span class="sourceLineNo">3647</span>        flushThread.checkNoError();<a name="line.3647"></a>
+<span class="sourceLineNo">3648</span><a name="line.3648"></a>
+<span class="sourceLineNo">3649</span>        putThread.join();<a name="line.3649"></a>
+<span class="sourceLineNo">3650</span>        putThread.checkNoError();<a name="line.3650"></a>
+<span class="sourceLineNo">3651</span>      } catch (InterruptedException ie) {<a name="line.3651"></a>
+<span class="sourceLineNo">3652</span>        LOG.warn("Caught exception when joining with flushThread", ie);<a name="line.3652"></a>
+<span class="sourceLineNo">3653</span>      }<a name="line.3653"></a>
+<span class="sourceLineNo">3654</span><a name="line.3654"></a>
+<span class="sourceLineNo">3655</span>      try {<a name="line.3655"></a>
+<span class="sourceLineNo">3656</span>          HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.3656"></a>
+<span class="sourceLineNo">3657</span>      } catch (DroppedSnapshotException dse) {<a name="line.3657"></a>
+<span class="sourceLineNo">3658</span>        // We could get this on way out because we interrupt the background flusher and it could<a name="line.3658"></a>
+<span class="sourceLineNo">3659</span>        // fail anywhere causing a DSE over in the background flusher... only it is not properly<a name="line.3659"></a>
+<span class="sourceLineNo">3660</span>        // dealt with so could still be memory hanging out when we get to here -- memory we can't<a name="line.3660"></a>
+<span class="sourceLineNo">3661</span>        // flush because the accounting is 'off' since original DSE.<a name="line.3661"></a>
+<span class="sourceLineNo">3662</span>      }<a name="line.3662"></a>
+<span class="sourceLineNo">3663</span>      this.region = null;<a name="line.3663"></a>
+<span class="sourceLineNo">3664</span>    }<a name="line.3664"></a>
+<span class="sourceLineNo">3665</span>  }<a name="line.3665"></a>
+<span class="sourceLineNo">3666</span><a name="line.3666"></a>
+<span class="sourceLineNo">3667</span>  protected class PutThread extends Thread {<a name="line.3667"></a>
+<span class="sourceLineNo">3668</span>    private volatile boolean done;<a name="line.3668"></a>
+<span class="sourceLineNo">3669</span>    private volatile int numPutsFinished = 0;<a name="line.3669"></a>
+<span class="sourceLineNo">3670</span><a name="line.3670"></a>
+<span class="sourceLineNo">3671</span>    private Throwable error = null;<a name="line.3671"></a>
+<span class="sourceLineNo">3672</span>    private int numRows;<a name="line.3672"></a>
+<span class="sourceLineNo">3673</span>    private byte[][] families;<a name="line.3673"></a>
+<span class="sourceLineNo">3674</span>    private byte[][] qualifiers;<a name="line.3674"></a>
+<span class="sourceLineNo">3675</span><a name="line.3675"></a>
+<span class="sourceLineNo">3676</span>    private PutThread(int numRows, byte[][] families, byte[][] qualifiers) {<a name="line.3676"></a>
+<span class="sourceLineNo">3677</span>      super("PutThread");<a name="line.3677"></a>
+<span class="sourceLineNo">3678</span>      this.numRows = numRows;<a name="line.3678"></a>
+<span class="sourceLineNo">3679</span>      this.families = families;<a name="line.3679"></a>
+<span class="sourceLineNo">3680</span>      this.qualifiers = qualifiers;<a name="line.3680"></a>
+<span class="sourceLineNo">3681</span>    }<a name="line.3681"></a>
+<span class="sourceLineNo">3682</span><a name="line.3682"></a>
+<span class="sourceLineNo">3683</span>    /**<a name="line.3683"></a>
+<span class="sourceLineNo">3684</span>     * Block calling thread until this instance of PutThread has put at least one row.<a name="line.3684"></a>
+<span class="sourceLineNo">3685</span>     */<a name="line.3685"></a>
+<span class="sourceLineNo">3686</span>    public void waitForFirstPut() throws InterruptedException {<a name="line.3686"></a>
+<span class="sourceLineNo">3687</span>      // wait until put thread actually puts some data<a name="line.3687"></a>
+<span class="sourceLineNo">3688</span>      while (isAlive() &amp;&amp; numPutsFinished == 0) {<a name="line.3688"></a>
+<span class="sourceLineNo">3689</span>        checkNoError();<a name="line.3689"></a>
+<span class="sourceLineNo">3690</span>        Thread.sleep(50);<a name="line.3690"></a>
+<span class="sourceLineNo">3691</span>      }<a name="line.3691"></a>
+<span class="sourceLineNo">3692</span>    }<a name="line.3692"></a>
+<span class="sourceLineNo">3693</span><a name="line.3693"></a>
+<span class="sourceLineNo">3694</span>    public void done() {<a name="line.3694"></a>
+<span class="sourceLineNo">3695</span>      done = true;<a name="line.3695"></a>
+<span class="sourceLineNo">3696</span>      synchronized (this) {<a name="line.3696"></a>
+<span class="sourceLineNo">3697</span>        interrupt();<a name="line.3697"></a>
+<span class="sourceLineNo">3698</span>      }<a name="line.3698"></a>
+<span class="sourceLineNo">3699</span>    }<a name="line.3699"></a>
+<span class="sourceLineNo">3700</span><a name="line.3700"></a>
+<span class="sourceLineNo">3701</span>    public void checkNoError() {<a name="line.3701"></a>
+<span class="sourceLineNo">3702</span>      if (error != null) {<a name="line.3702"></a>
+<span class="sourceLineNo">3703</span>        assertNull(error);<a name="line.3703"></a>
+<span class="sourceLineNo">3704</span>      }<a name="line.3704"></a>
+<span class="sourceLineNo">3705</span>    }<a name="line.3705"></a>
+<span class="sourceLineNo">3706</span><a name="line.3706"></a>
+<span class="sourceLineNo">3707</span>    @Override<a name="line.3707"></a>
+<span class="sourceLineNo">3708</span>    public void run() {<a name="line.3708"></a>
+<span class="sourceLineNo">3709</span>      done = false;<a name="line.3709"></a>
+<span class="sourceLineNo">3710</span>      while (!done) {<a name="line.3710"></a>
+<span class="sourceLineNo">3711</span>        try {<a name="line.3711"></a>
+<span class="sourceLineNo">3712</span>          for (int r = 0; r &lt; numRows; r++) {<a name="line.3712"></a>
+<span class="sourceLineNo">3713</span>            byte[] row = Bytes.toBytes("row" + r);<a name="line.3713"></a>
+<span class="sourceLineNo">3714</span>            Put put = new Put(row);<a name="line.3714"></a>
+<span class="sourceLineNo">3715</span>            put.setDurability(Durability.SKIP_WAL);<a name="line.3715"></a>
+<span class="sourceLineNo">3716</span>            byte[] value = Bytes.toBytes(String.valueOf(numPutsFinished));<a name="line.3716"></a>
+<span class="sourceLineNo">3717</span>            for (byte[] family : families) {<a name="line.3717"></a>
+<span class="sourceLineNo">3718</span>              for (byte[] qualifier : qualifiers) {<a name="line.3718"></a>
+<span class="sourceLineNo">3719</span>                put.addColumn(family, qualifier, numPutsFinished, value);<a name="line.3719"></a>
+<span class="sourceLineNo">3720</span>              }<a name="line.3720"></a>
+<span class="sourceLineNo">3721</span>            }<a name="line.3721"></a>
+<span class="sourceLineNo">3722</span>            region.put(put);<a name="line.3722"></a>
+<span class="sourceLineNo">3723</span>            numPutsFinished++;<a name="line.3723"></a>
+<span class="sourceLineNo">3724</span>            if (numPutsFinished &gt; 0 &amp;&amp; numPutsFinished % 47 == 0) {<a name="line.3724"></a>
+<span class="sourceLineNo">3725</span>              LOG.debug("put iteration = {}", numPutsFinished);<a name="line.3725"></a>
+<span class="sourceLineNo">3726</span>              Delete delete = new Delete(row, (long) numPutsFinished - 30);<a name="line.3726"></a>
+<span class="sourceLineNo">3727</span>              region.delete(delete);<a name="line.3727"></a>
+<span class="sourceLineNo">3728</span>            }<a name="line.3728"></a>
+<span class="sourceLineNo">3729</span>            numPutsFinished++;<a name="line.3729"></a>
+<span class="sourceLineNo">3730</span>          }<a name="line.3730"></a>
+<span class="sourceLineNo">3731</span>        } catch (InterruptedIOException e) {<a name="line.3731"></a>
+<span class="sourceLineNo">3732</span>          // This is fine. It means we are done, or didn't get the lock on time<a name="line.3732"></a>
+<span class="sourceLineNo">3733</span>          LOG.info("Interrupted", e);<a name="line.3733"></a>
+<span class="sourceLineNo">3734</span>        } catch (IOException e) {<a name="line.3734"></a>
+<span class="sourceLineNo">3735</span>          LOG.error("Error while putting records", e);<a name="line.3735"></a>
+<span class="sourceLineNo">3736</span>          error = e;<a name="line.3736"></a>
+<span class="sourceLineNo">3737</span>          break;<a name="line.3737"></a>
+<span class="sourceLineNo">3738</span>        }<a name="line.3738"></a>
+<span class="sourceLineNo">3739</span>      }<a name="line.3739"></a>
+<span class="sourceLineNo">3740</span><a name="line.3740"></a>
+<span class="sourceLineNo">3741</span>    }<a name="line.3741"></a>
+<span class="sourceLineNo">3742</span><a name="line.3742"></a>
+<span class="sourceLineNo">3743</span>  }<a name="line.3743"></a>
+<span class="sourceLineNo">3744</span><a name="line.3744"></a>
+<span class="sourceLineNo">3745</span>  /**<a name="line.3745"></a>
+<span class="sourceLineNo">3746</span>   * Writes very wide records and gets the latest row every time.. Flushes and<a name="line.3746"></a>
+<span class="sourceLineNo">3747</span>   * compacts the region aggressivly to catch issues.<a name="line.3747"></a>
+<span class="sourceLineNo">3748</span>   *<a name="line.3748"></a>
+<span class="sourceLineNo">3749</span>   * @throws IOException<a name="line.3749"></a>
+<span class="sourceLineNo">3750</span>   *           by flush / scan / compaction<a name="line.3750"></a>
+<span class="sourceLineNo">3751</span>   * @throws InterruptedException<a name="line.3751"></a>
+<span class="sourceLineNo">3752</span>   *           when joining threads<a name="line.3752"></a>
+<span class="sourceLineNo">3753</span>   */<a name="line.3753"></a>
+<span class="sourceLineNo">3754</span>  @Test<a name="line.3754"></a>
+<span class="sourceLineNo">3755</span>  public void testWritesWhileGetting() throws Exception {<a name="line.3755"></a>
+<span class="sourceLineNo">3756</span>    int testCount = 50;<a name="line.3756"></a>
+<span class="sourceLineNo">3757</span>    int numRows = 1;<a name="line.3757"></a>
+<span class="sourceLineNo">3758</span>    int numFamilies = 10;<a name="line.3758"></a>
+<span class="sourceLineNo">3759</span>    int numQualifiers = 100;<a name="line.3759"></a>
+<span class="sourceLineNo">3760</span>    int compactInterval = 100;<a name="line.3760"></a>
+<span class="sourceLineNo">3761</span>    byte[][] families = new byte[numFamilies][];<a name="line.3761"></a>
+<span class="sourceLineNo">3762</span>    for (int i = 0; i &lt; numFamilies; i++) {<a name="line.3762"></a>
+<span class="sourceLineNo">3763</span>      families[i] = Bytes.toBytes("family" + i);<a name="line.3763"></a>
+<span class="sourceLineNo">3764</span>    }<a name="line.3764"></a>
+<span class="sourceLineNo">3765</span>    byte[][] qualifiers = new byte[numQualifiers][];<a name="line.3765"></a>
+<span class="sourceLineNo">3766</span>    for (int i = 0; i &lt; numQualifiers; i++) {<a name="line.3766"></a>
+<span class="sourceLineNo">3767</span>      qualifiers[i] = Bytes.toBytes("qual" + i);<a name="line.3767"></a>
+<span class="sourceLineNo">3768</span>    }<a name="line.3768"></a>
+<span class="sourceLineNo">3769</span><a name="line.3769"></a>
+<span class="sourceLineNo">3770</span><a name="line.3770"></a>
+<span class="sourceLineNo">3771</span>    // This test flushes constantly and can cause many files to be created,<a name="line.3771"></a>
+<span class="sourceLineNo">3772</span>    // possibly<a name="line.3772"></a>
+<span class="sourceLineNo">3773</span>    // extending over the ulimit. Make sure compactions are aggressive in<a name="line.3773"></a>
+<span class="sourceLineNo">3774</span>    // reducing<a name="line.3774"></a>
+<span class="sourceLineNo">3775</span>    // the number of HFiles created.<a name="line.3775"></a>
+<span class="sourceLineNo">3776</span>    Configuration conf = HBaseConfiguration.create(CONF);<a name="line.3776"></a>
+<span class="sourceLineNo">3777</span>    conf.setInt("hbase.hstore.compaction.min", 1);<a name="line.3777"></a>
+<span class="sourceLineNo">3778</span>    conf.setInt("hbase.hstore.compaction.max", 1000);<a name="line.3778"></a>
+<span class="sourceLineNo">3779</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.3779"></a>
+<span class="sourceLineNo">3780</span>    PutThread putThread = null;<a name="line.3780"></a>
+<span class="sourceLineNo">3781</span>    MultithreadedTestUtil.TestContext ctx = new MultithreadedTestUtil.TestContext(conf);<a name="line.3781"></a>
+<span class="sourceLineNo">3782</span>    try {<a name="line.3782"></a>
+<span class="sourceLineNo">3783</span>      putThread = new PutThread(numRows, families, qualifiers);<a name="line.3783"></a>
+<span class="sourceLineNo">3784</span>      putThread.start();<a name="line.3784"></a>
+<span class="sourceLineNo">3785</span>      putThread.waitForFirstPut();<a name="line.3785"></a>
+<span class="sourceLineNo">3786</span><a name="line.3786"></a>
+<span class="sourceLineNo">3787</span>      // Add a thread that flushes as fast as possible<a name="line.3787"></a>
+<span class="sourceLineNo">3788</span>      ctx.addThread(new RepeatingTestThread(ctx) {<a name="line.3788"></a>
+<span class="sourceLineNo">3789</span><a name="line.3789"></a>
+<span class="sourceLineNo">3790</span>        @Override<a name="line.3790"></a>
+<span class="sourceLineNo">3791</span>        public void doAnAction() throws Exception {<a name="line.3791"></a>
+<span class="sourceLineNo">3792</span>          region.flush(true);<a name="line.3792"></a>
+<span class="sourceLineNo">3793</span>          // Compact regularly to avoid creating too many files and exceeding<a name="line.3793"></a>
+<span class="sourceLineNo">3794</span>          // the ulimit.<a name="line.3794"></a>
+<span class="sourceLineNo">3795</span>          region.compact(false);<a name="line.3795"></a>
+<span class="sourceLineNo">3796</span>          for (HStore store : region.getStores()) {<a name="line.3796"></a>
+<span class="sourceLineNo">3797</span>            store.closeAndArchiveCompactedFiles();<a name="line.3797"></a>
+<span class="sourceLineNo">3798</span>          }<a name="line.3798"></a>
+<span class="sourceLineNo">3799</span>        }<a name="line.3799"></a>
+<span class="sourceLineNo">3800</span>      });<a name="line.3800"></a>
+<span class="sourceLineNo">3801</span>      ctx.startThreads();<a name="line.3801"></a>
+<span class="sourceLineNo">3802</span><a name="line.3802"></a>
+<span class="sourceLineNo">3803</span>      Get get = new Get(Bytes.toBytes("row0"));<a name="line.3803"></a>
+<span class="sourceLineNo">3804</span>      Result result = null;<a name="line.3804"></a>
+<span class="sourceLineNo">3805</span><a name="line.3805"></a>
+<span class="sourceLineNo">3806</span>      int expectedCount = numFamilies * numQualifiers;<a name="line.3806"></a>
+<span class="sourceLineNo">3807</span><a name="line.3807"></a>
+<span class="sourceLineNo">3808</span>      long prevTimestamp = 0L;<a name="line.3808"></a>
+<span class="sourceLineNo">3809</span>      for (int i = 0; i &lt; testCount; i++) {<a name="line.3809"></a>
+<span class="sourceLineNo">3810</span>        LOG.info("testWritesWhileGetting verify turn " + i);<a name="line.3810"></a>
+<span class="sourceLineNo">3811</span>        boolean previousEmpty = result == null || result.isEmpty();<a name="line.3811"></a>
+<span class="sourceLineNo">3812</span>        result = region.get(get);<a name="line.3812"></a>
+<span class="sourceLineNo">3813</span>        if (!result.isEmpty() || !previousEmpty || i &gt; compactInterval) {<a name="line.3813"></a>
+<span class="sourceLineNo">3814</span>          assertEquals("i=" + i, expectedCount, result.size());<a name="line.3814"></a>
+<span class="sourceLineNo">3815</span>          // TODO this was removed, now what dangit?!<a name="line.3815"></a>
+<span class="sourceLineNo">3816</span>          // search looking for the qualifier in question?<a name="line.3816"></a>
+<span class="sourceLineNo">3817</span>          long timestamp = 0;<a name="line.3817"></a>
 <span class="sourceLineNo">3818</span>          for (Cell kv : result.rawCells()) {<a name="line.3818"></a>
-<span class="sourceLineNo">3819</span>            byte[] thisValue = CellUtil.cloneValue(kv);<a name="line.3819"></a>
-<span class="sourceLineNo">3820</span>            if (previousKV != null) {<a name="line.3820"></a>
-<span class="sourceLineNo">3821</span>              if (Bytes.compareTo(CellUtil.cloneValue(previousKV), thisValue) != 0) {<a name="line.3821"></a>
-<span class="sourceLineNo">3822</span>                LOG.warn("These two KV should have the same value." + " Previous KV:" + previousKV<a name="line.3822"></a>
-<span class="sourceLineNo">3823</span>                    + "(memStoreTS:" + previousKV.getSequenceId() + ")" + ", New KV: " + kv<a name="line.3823"></a>
-<span class="sourceLineNo">3824</span>                    + "(memStoreTS:" + kv.getSequenceId() + ")");<a name="line.3824"></a>
-<span class="sourceLineNo">3825</span>                assertEquals(0, Bytes.compareTo(CellUtil.cloneValue(previousKV), thisValue));<a name="line.3825"></a>
-<span class="sourceLineNo">3826</span>              }<a name="line.3826"></a>
-<span class="sourceLineNo">3827</span>            }<a name="line.3827"></a>
-<span class="sourceLineNo">3828</span>            previousKV = kv;<a name="line.3828"></a>
-<span class="sourceLineNo">3829</span>          }<a name="line.3829"></a>
-<span class="sourceLineNo">3830</span>        }<a name="line.3830"></a>
-<span class="sourceLineNo">3831</span>      }<a name="line.3831"></a>
-<span class="sourceLineNo">3832</span>    } finally {<a name="line.3832"></a>
-<span class="sourceLineNo">3833</span>      if (putThread != null)<a name="line.3833"></a>
-<span class="sourceLineNo">3834</span>        putThread.done();<a name="line.3834"></a>
-<span class="sourceLineNo">3835</span><a name="line.3835"></a>
-<span class="sourceLineNo">3836</span>      region.flush(true);<a name="line.3836"></a>
-<span class="sourceLineNo">3837</span><a name="line.3837"></a>
-<span class="sourceLineNo">3838</span>      if (putThread != null) {<a name="line.3838"></a>
-<span class="sourceLineNo">3839</span>        putThread.join();<a name="line.3839"></a>
-<span class="sourceLineNo">3840</span>        putThread.checkNoError();<a name="line.3840"></a>
+<span class="sourceLineNo">3819</span>            if (CellUtil.matchingFamily(kv, families[0])<a name="line.3819"></a>
+<span class="sourceLineNo">3820</span>                &amp;&amp; CellUtil.matchingQualifier(kv, qualifiers[0])) {<a name="line.3820"></a>
+<span class="sourceLineNo">3821</span>              timestamp = kv.getTimestamp();<a name="line.3821"></a>
+<span class="sourceLineNo">3822</span>            }<a name="line.3822"></a>
+<span class="sourceLineNo">3823</span>          }<a name="line.3823"></a>
+<span class="sourceLineNo">3824</span>          assertTrue(timestamp &gt;= prevTimestamp);<a name="line.3824"></a>
+<span class="sourceLineNo">3825</span>          prevTimestamp = timestamp;<a name="line.3825"></a>
+<span class="sourceLineNo">3826</span>          Cell previousKV = null;<a name="line.3826"></a>
+<span class="sourceLineNo">3827</span><a name="line.3827"></a>
+<span class="sourceLineNo">3828</span>          for (Cell kv : result.rawCells()) {<a name="line.3828"></a>
+<span class="sourceLineNo">3829</span>            byte[] thisValue = CellUtil.cloneValue(kv);<a name="line.3829"></a>
+<span class="sourceLineNo">3830</span>            if (previousKV != null) {<a name="line.3830"></a>
+<span class="sourceLineNo">3831</span>              if (Bytes.compareTo(CellUtil.cloneValue(previousKV), thisValue) != 0) {<a name="line.3831"></a>
+<span class="sourceLineNo">3832</span>                LOG.warn("These two KV should have the same value." + " Previous KV:" + previousKV<a name="line.3832"></a>
+<span class="sourceLineNo">3833</span>                    + "(memStoreTS:" + previousKV.getSequenceId() + ")" + ", New KV: " + kv<a name="line.3833"></a>
+<span class="sourceLineNo">3834</span>                    + "(memStoreTS:" + kv.getSequenceId() + ")");<a name="line.3834"></a>
+<span class="sourceLineNo">3835</span>                assertEquals(0, Bytes.compareTo(CellUtil.cloneValue(previousKV), thisValue));<a name="line.3835"></a>
+<span class="sourceLineNo">3836</span>              }<a name="line.3836"></a>
+<span class="sourceLineNo">3837</span>            }<a name="line.3837"></a>
+<span class="sourceLineNo">3838</span>            previousKV = kv;<a name="line.3838"></a>
+<span class="sourceLineNo">3839</span>          }<a name="line.3839"></a>
+<span class="sourceLineNo">3840</span>        }<a name="line.3840"></a>
 <span class="sourceLineNo">3841</span>      }<a name="line.3841"></a>
-<span class="sourceLineNo">3842</span><a name="line.3842"></a>
-<span class="sourceLineNo">3843</span>      ctx.stop();<a name="line.3843"></a>
-<span class="sourceLineNo">3844</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.3844"></a>
-<span class="sourceLineNo">3845</span>      this.region = null;<a name="line.3845"></a>
-<span class="sourceLineNo">3846</span>    }<a name="line.3846"></a>
-<span class="sourceLineNo">3847</span>  }<a name="line.3847"></a>
-<span class="sourceLineNo">3848</span><a name="line.3848"></a>
-<span class="sourceLineNo">3849</span>  @Test<a name="line.3849"></a>
-<span class="sourceLineNo">3850</span>  public void testHolesInMeta() throws Exception {<a name="line.3850"></a>
-<span class="sourceLineNo">3851</span>    byte[] family = Bytes.toBytes("family");<a name="line.3851"></a>
-<span class="sourceLineNo">3852</span>    this.region = initHRegion(tableName, Bytes.toBytes("x"), Bytes.toBytes("z"), method, CONF,<a name="line.3852"></a>
-<span class="sourceLineNo">3853</span>        false, family);<a name="line.3853"></a>
-<span class="sourceLineNo">3854</span>    byte[] rowNotServed = Bytes.toBytes("a");<a name="line.3854"></a>
-<span class="sourceLineNo">3855</span>    Get g = new Get(rowNotServed);<a name="line.3855"></a>
-<span class="sourceLineNo">3856</span>    try {<a name="line.3856"></a>
-<span class="sourceLineNo">3857</span>      region.get(g);<a name="line.3857"></a>
-<span class="sourceLineNo">3858</span>      fail();<a name="line.3858"></a>
-<span class="sourceLineNo">3859</span>    } catch (WrongRegionException x) {<a name="line.3859"></a>
-<span class="sourceLineNo">3860</span>      // OK<a name="line.3860"></a>
-<span class="sourceLineNo">3861</span>    }<a name="line.3861"></a>
-<span class="sourceLineNo">3862</span>    byte[] row = Bytes.toBytes("y");<a name="line.3862"></a>
-<span class="sourceLineNo">3863</span>    g = new Get(row);<a name="line.3863"></a>
-<span class="sourceLineNo">3864</span>    region.get(g);<a name="line.3864"></a>
-<span class="sourceLineNo">3865</span>  }<a name="line.3865"></a>
-<span class="sourceLineNo">3866</span><a name="line.3866"></a>
-<span class="sourceLineNo">3867</span>  @Test<a name="line.3867"></a>
-<span class="sourceLineNo">3868</span>  public void testIndexesScanWithOneDeletedRow() throws IOException {<a name="line.3868"></a>
-<span class="sourceLineNo">3869</span>    byte[] family = Bytes.toBytes("family");<a name="line.3869"></a>
-<span class="sourceLineNo">3870</span><a name="line.3870"></a>
-<span class="sourceLineNo">3871</span>    // Setting up region<a name="line.3871"></a>
-<span class="sourceLineNo">3872</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.3872"></a>
-<span class="sourceLineNo">3873</span>    Put put = new Put(Bytes.toBytes(1L));<a name="line.3873"></a>
-<span class="sourceLineNo">3874</span>    put.addColumn(family, qual1, 1L, Bytes.toBytes(1L));<a name="line.3874"></a>
-<span class="sourceLineNo">3875</span>    region.put(put);<a name="line.3875"></a>
+<span class="sourceLineNo">3842</span>    } finally {<a name="line.3842"></a>
+<span class="sourceLineNo">3843</span>      if (putThread != null)<a name="line.3843"></a>
+<span class="sourceLineNo">3844</span>        putThread.done();<a name="line.3844"></a>
+<span class="sourceLineNo">3845</span><a name="line.3845"></a>
+<span class="sourceLineNo">3846</span>      region.flush(true);<a name="line.3846"></a>
+<span class="sourceLineNo">3847</span><a name="line.3847"></a>
+<span class="sourceLineNo">3848</span>      if (putThread != null) {<a name="line.3848"></a>
+<span class="sourceLineNo">3849</span>        putThread.join();<a name="line.3849"></a>
+<span class="sourceLineNo">3850</span>        putThread.checkNoError();<a name="line.3850"></a>
+<span class="sourceLineNo">3851</span>      }<a name="line.3851"></a>
+<span class="sourceLineNo">3852</span><a name="line.3852"></a>
+<span class="sourceLineNo">3853</span>      ctx.stop();<a name="line.3853"></a>
+<span class="sourceLineNo">3854</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.3854"></a>
+<span class="sourceLineNo">3855</span>      this.region = null;<a name="line.3855"></a>
+<span class="sourceLineNo">3856</span>    }<a name="line.3856"></a>
+<span class="sourceLineNo">3857</span>  }<a name="line.3857"></a>
+<span class="sourceLineNo">3858</span><a name="line.3858"></a>
+<span class="sourceLineNo">3859</span>  @Test<a name="line.3859"></a>
+<span class="sourceLineNo">3860</span>  public void testHolesInMeta() throws Exception {<a name="line.3860"></a>
+<span class="sourceLineNo">3861</span>    byte[] family = Bytes.toBytes("family");<a name="line.3861"></a>
+<span class="sourceLineNo">3862</span>    this.region = initHRegion(tableName, Bytes.toBytes("x"), Bytes.toBytes("z"), method, CONF,<a name="line.3862"></a>
+<span class="sourceLineNo">3863</span>        false, family);<a name="line.3863"></a>
+<span class="sourceLineNo">3864</span>    byte[] rowNotServed = Bytes.toBytes("a");<a name="line.3864"></a>
+<span class="sourceLineNo">3865</span>    Get g = new Get(rowNotServed);<a name="line.3865"></a>
+<span class="sourceLineNo">3866</span>    try {<a name="line.3866"></a>
+<span class="sourceLineNo">3867</span>      region.get(g);<a name="line.3867"></a>
+<span class="sourceLineNo">3868</span>      fail();<a name="line.3868"></a>
+<span class="sourceLineNo">3869</span>    } catch (WrongRegionException x) {<a name="line.3869"></a>
+<span class="sourceLineNo">3870</span>      // OK<a name="line.3870"></a>
+<span class="sourceLineNo">3871</span>    }<a name="line.3871"></a>
+<span class="sourceLineNo">3872</span>    byte[] row = Bytes.toBytes("y");<a name="line.3872"></a>
+<span class="sourceLineNo">3873</span>    g = new Get(row);<a name="line.3873"></a>
+<span class="sourceLineNo">3874</span>    region.get(g);<a name="line.3874"></a>
+<span class="sourceLineNo">3875</span>  }<a name="line.3875"></a>
 <span class="sourceLineNo">3876</span><a name="line.3876"></a>
-<span class="sourceLineNo">3877</span>    region.flush(true);<a name="line.3877"></a>
-<span class="sourceLineNo">3878</span><a name="line.3878"></a>
-<span class="sourceLineNo">3879</span>    Delete delete = new Delete(Bytes.toBytes(1L), 1L);<a name="line.3879"></a>
-<span class="sourceLineNo">3880</span>    region.delete(delete);<a name="line.3880"></a>
-<span class="sourceLineNo">3881</span><a name="line.3881"></a>
-<span class="sourceLineNo">3882</span>    put = new Put(Bytes.toBytes(2L));<a name="line.3882"></a>
-<span class="sourceLineNo">3883</span>    put.addColumn(family, qual1, 2L, Bytes.toBytes(2L));<a name="line.3883"></a>
-<span class="sourceLineNo">3884</span>    region.put(put);<a name="line.3884"></a>
-<span class="sourceLineNo">3885</span><a name="line.3885"></a>
-<span class="sourceLineNo">3886</span>    Scan idxScan = new Scan();<a name="line.3886"></a>
-<span class="sourceLineNo">3887</span>    idxScan.addFamily(family);<a name="line.3887"></a>
-<span class="sourceLineNo">3888</span>    idxScan.setFilter(new FilterList(FilterList.Operator.MUST_PASS_ALL, Arrays.&lt;Filter&gt; asList(<a name="line.3888"></a>
-<span class="sourceLineNo">3889</span>        new SingleColumnValueFilter(family, qual1, CompareOperator.GREATER_OR_EQUAL,<a name="line.3889"></a>
-<span class="sourceLineNo">3890</span>            new BinaryComparator(Bytes.toBytes(0L))), new SingleColumnValueFilter(family, qual1,<a name="line.3890"></a>
-<span class="sourceLineNo">3891</span>                    CompareOperator.LESS_OR_EQUAL, new BinaryComparator(Bytes.toBytes(3L))))));<a name="line.3891"></a>
-<span class="sourceLineNo">3892</span>    InternalScanner scanner = region.getScanner(idxScan);<a name="line.3892"></a>
-<span class="sourceLineNo">3893</span>    List&lt;Cell&gt; res = new ArrayList&lt;&gt;();<a name="line.3893"></a>
-<span class="sourceLineNo">3894</span><a name="line.3894"></a>
-<span class="sourceLineNo">3895</span>    while (scanner.next(res)) {<a name="line.3895"></a>
-<span class="sourceLineNo">3896</span>      // Ignore res value.<a name="line.3896"></a>
-<span class="sourceLineNo">3897</span>    }<a name="line.3897"></a>
-<span class="sourceLineNo">3898</span>    assertEquals(1L, res.size());<a name="line.3898"></a>
-<span class="sourceLineNo">3899</span>  }<a name="line.3899"></a>
-<span class="sourceLineNo">3900</span><a name="line.3900"></a>
-<span class="sourceLineNo">3901</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.3901"></a>
-<span class="sourceLineNo">3902</span>  // Bloom filter test<a name="line.3902"></a>
-<span class="sourceLineNo">3903</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.3903"></a>
-<span class="sourceLineNo">3904</span>  @Test<a name="line.3904"></a>
-<span class="sourceLineNo">3905</span>  public void testBloomFilterSize() throws IOException {<a name="line.3905"></a>
-<span class="sourceLineNo">3906</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.3906"></a>
-<span class="sourceLineNo">3907</span>    byte[] qf1 = Bytes.toBytes("col");<a name="line.3907"></a>
-<span class="sourceLineNo">3908</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.3908"></a>
-<span class="sourceLineNo">3909</span>    // Create Table<a name="line.3909"></a>
-<span class="sourceLineNo">3910</span>    HColumnDescriptor hcd = new HColumnDescriptor(fam1).setMaxVersions(Integer.MAX_VALUE)<a name="line.3910"></a>
-<span class="sourceLineNo">3911</span>        .setBloomFilterType(BloomType.ROWCOL);<a name="line.3911"></a>
-<span class="sourceLineNo">3912</span><a name="line.3912"></a>
-<span class="sourceLineNo">3913</span>    HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.3913"></a>
-<span class="sourceLineNo">3914</span>    htd.addFamily(hcd);<a name="line.3914"></a>
-<span class="sourceLineNo">3915</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.3915"></a>
-<span class="sourceLineNo">3916</span>    this.region = TEST_UTIL.createLocalHRegion(info, htd);<a name="line.3916"></a>
-<span class="sourceLineNo">3917</span>    int num_unique_rows = 10;<a name="line.3917"></a>
-<span class="sourceLineNo">3918</span>    int duplicate_multiplier = 2;<a name="line.3918"></a>
-<span class="sourceLineNo">3919</span>    int num_storefiles = 4;<a name="line.3919"></a>
-<span class="sourceLineNo">3920</span><a name="line.3920"></a>
-<span class="sourceLineNo">3921</span>    int version = 0;<a name="line.3921"></a>
-<span class="sourceLineNo">3922</span>    for (int f = 0; f &lt; num_storefiles; f++) {<a name="line.3922"></a>
-<span class="sourceLineNo">3923</span>      for (int i = 0; i &lt; duplicate_multiplier; i++) {<a name="line.3923"></a>
-<span class="sourceLineNo">3924</span>        for (int j = 0; j &lt; num_unique_rows; j++) {<a name="line.3924"></a>
-<span class="sourceLineNo">3925</span>          Put put = new Put(Bytes.toBytes("row" + j));<a name="line.3925"></a>
-<span class="sourceLineNo">3926</span>          put.setDurability(Durability.SKIP_WAL);<a name="line.3926"></a>
-<span class="sourceLineNo">3927</span>          long ts = version++;<a name="line.3927"></a>
-<span class="sourceLineNo">3928</span>          put.addColumn(fam1, qf1, ts, val1);<a name="line.3928"></a>
-<span class="sourceLineNo">3929</span>          region.put(put);<a name="line.3929"></a>
-<span class="sourceLineNo">3930</span>        }<a name="line.3930"></a>
-<span class="sourceLineNo">3931</span>      }<a name="line.3931"></a>
-<span class="sourceLineNo">3932</span>      region.flush(true);<a name="line.3932"></a>
-<span class="sourceLineNo">3933</span>    }<a name="line.3933"></a>
-<span class="sourceLineNo">3934</span>    // before compaction<a name="line.3934"></a>
-<span class="sourceLineNo">3935</span>    HStore store = region.getStore(fam1);<a name="line.3935"></a>
-<span class="sourceLineNo">3936</span>    Collection&lt;HStoreFile&gt; storeFiles = store.getStorefiles();<a name="line.3936"></a>
-<span class="sourceLineNo">3937</span>    for (HStoreFile storefile : storeFiles) {<a name="line.3937"></a>
-<span class="sourceLineNo">3938</span>      StoreFileReader reader = storefile.getReader();<a name="line.3938"></a>
-<span class="sourceLineNo">3939</span>      reader.loadFileInfo();<a name="line.3939"></a>
-<span class="sourceLineNo">3940</span>      reader.loadBloomfilter();<a name="line.3940"></a>
-<span class="sourceLineNo">3941</span>      assertEquals(num_unique_rows * duplicate_multiplier, reader.getEntries());<a name="line.3941"></a>
-<span class="sourceLineNo">3942</span>      assertEquals(num_unique_rows, reader.getFilterEntries());<a name="line.3942"></a>
+<span class="sourceLineNo">3877</span>  @Test<a name="line.3877"></a>
+<span class="sourceLineNo">3878</span>  public void testIndexesScanWithOneDeletedRow() throws IOException {<a name="line.3878"></a>
+<span class="sourceLineNo">3879</span>    byte[] family = Bytes.toBytes("family");<a name="line.3879"></a>
+<span class="sourceLineNo">3880</span><a name="line.3880"></a>
+<span class="sourceLineNo">3881</span>    // Setting up region<a name="line.3881"></a>
+<span class="sourceLineNo">3882</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.3882"></a>
+<span class="sourceLineNo">3883</span>    Put put = new Put(Bytes.toBytes(1L));<a name="line.3883"></a>
+<span class="sourceLineNo">3884</span>    put.addColumn(family, qual1, 1L, Bytes.toBytes(1L));<a name="line.3884"></a>
+<span class="sourceLineNo">3885</span>    region.put(put);<a name="line.3885"></a>
+<span class="sourceLineNo">3886</span><a name="line.3886"></a>
+<span class="sourceLineNo">3887</span>    region.flush(true);<a name="line.3887"></a>
+<span class="sourceLineNo">3888</span><a name="line.3888"></a>
+<span class="sourceLineNo">3889</span>    Delete delete = new Delete(Bytes.toBytes(1L), 1L);<a name="line.3889"></a>
+<span class="sourceLineNo">3890</span>    region.delete(delete);<a name="line.3890"></a>
+<span class="sourceLineNo">3891</span><a name="line.3891"></a>
+<span class="sourceLineNo">3892</span>    put = new Put(Bytes.toBytes(2L));<a name="line.3892"></a>
+<span class="sourceLineNo">3893</span>    put.addColumn(family, qual1, 2L, Bytes.toBytes(2L));<a name="line.3893"></a>
+<span class="sourceLineNo">3894</span>    region.put(put);<a name="line.3894"></a>
+<span class="sourceLineNo">3895</span><a name="line.3895"></a>
+<span class="sourceLineNo">3896</span>    Scan idxScan = new Scan();<a name="line.3896"></a>
+<span class="sourceLineNo">3897</span>    idxScan.addFamily(family);<a name="line.3897"></a>
+<span class="sourceLineNo">3898</span>    idxScan.setFilter(new FilterList(FilterList.Operator.MUST_PASS_ALL, Arrays.&lt;Filter&gt; asList(<a name="line.3898"></a>
+<span class="sourceLineNo">3899</span>        new SingleColumnValueFilter(family, qual1, CompareOperator.GREATER_OR_EQUAL,<a name="line.3899"></a>
+<span class="sourceLineNo">3900</span>            new BinaryComparator(Bytes.toBytes(0L))), new SingleColumnValueFilter(family, qual1,<a name="line.3900"></a>
+<span class="sourceLineNo">3901</span>                    CompareOperator.LESS_OR_EQUAL, new BinaryComparator(Bytes.toBytes(3L))))));<a name="line.3901"></a>
+<span class="sourceLineNo">3902</span>    InternalScanner scanner = region.getScanner(idxScan);<a name="line.3902"></a>
+<span class="sourceLineNo">3903</span>    List&lt;Cell&gt; res = new ArrayList&lt;&gt;();<a name="line.3903"></a>
+<span class="sourceLineNo">3904</span><a name="line.3904"></a>
+<span class="sourceLineNo">3905</span>    while (scanner.next(res)) {<a name="line.3905"></a>
+<span class="sourceLineNo">3906</span>      // Ignore res value.<a name="line.3906"></a>
+<span class="sourceLineNo">3907</span>    }<a name="line.3907"></a>
+<span class="sourceLineNo">3908</span>    assertEquals(1L, res.size());<a name="line.3908"></a>
+<span class="sourceLineNo">3909</span>  }<a name="line.3909"></a>
+<span class="sourceLineNo">3910</span><a name="line.3910"></a>
+<span class="sourceLineNo">3911</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.3911"></a>
+<span class="sourceLineNo">3912</span>  // Bloom filter test<a name="line.3912"></a>
+<span class="sourceLineNo">3913</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.3913"></a>
+<span class="sourceLineNo">3914</span>  @Test<a name="line.3914"></a>
+<span class="sourceLineNo">3915</span>  public void testBloomFilterSize() throws IOException {<a name="line.3915"></a>
+<span class="sourceLineNo">3916</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.3916"></a>
+<span class="sourceLineNo">3917</span>    byte[] qf1 = Bytes.toBytes("col");<a name="line.3917"></a>
+<span class="sourceLineNo">3918</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.3918"></a>
+<span class="sourceLineNo">3919</span>    // Create Table<a name="line.3919"></a>
+<span class="sourceLineNo">3920</span>    HColumnDescriptor hcd = new HColumnDescriptor(fam1).setMaxVersions(Integer.MAX_VALUE)<a name="line.3920"></a>
+<span class="sourceLineNo">3921</span>        .setBloomFilterType(BloomType.ROWCOL);<a name="line.3921"></a>
+<span class="sourceLineNo">3922</span><a name="line.3922"></a>
+<span class="sourceLineNo">3923</span>    HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.3923"></a>
+<span class="sourceLineNo">3924</span>    htd.addFamily(hcd);<a name="line.3924"></a>
+<span class="sourceLineNo">3925</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.3925"></a>
+<span class="sourceLineNo">3926</span>    this.region = TEST_UTIL.createLocalHRegion(info, htd);<a name="line.3926"></a>
+<span class="sourceLineNo">3927</span>    int num_unique_rows = 10;<a name="line.3927"></a>
+<span class="sourceLineNo">3928</span>    int duplicate_multiplier = 2;<a name="line.3928"></a>
+<span class="sourceLineNo">3929</span>    int num_storefiles = 4;<a name="line.3929"></a>
+<span class="sourceLineNo">3930</span><a name="line.3930"></a>
+<span class="sourceLineNo">3931</span>    int version = 0;<a name="line.3931"></a>
+<span class="sourceLineNo">3932</span>    for (int f = 0; f &lt; num_storefiles; f++) {<a name="line.3932"></a>
+<span class="sourceLineNo">3933</span>      for (int i = 0; i &lt; duplicate_multiplier; i++) {<a name="line.3933"></a>
+<span class="sourceLineNo">3934</span>        for (int j = 0; j &lt; num_unique_rows; j++) {<a name="line.3934"></a>
+<span class="sourceLineNo">3935</span>          Put put = new Put(Bytes.toBytes("row" + j));<a name="line.3935"></a>
+<span class="sourceLineNo">3936</span>          put.setDurability(Durability.SKIP_WAL);<a name="line.3936"></a>
+<span class="sourceLineNo">3937</span>          long ts = version++;<a name="line.3937"></a>
+<span class="sourceLineNo">3938</span>          put.addColumn(fam1, qf1, ts, val1);<a name="line.3938"></a>
+<span class="sourceLineNo">3939</span>          region.put(put);<a name="line.3939"></a>
+<span class="sourceLineNo">3940</span>        }<a name="line.3940"></a>
+<span class="sourceLineNo">3941</span>      }<a name="line.3941"></a>
+<span class="sourceLineNo">3942</span>      region.flush(true);<a name="line.3942"></a>
 <span class="sourceLineNo">3943</span>    }<a name="line.3943"></a>
-<span class="sourceLineNo">3944</span><a name="line.3944"></a>
-<span class="sourceLineNo">3945</span>    region.compact(true);<a name="line.3945"></a>
-<span class="sourceLineNo">3946</span><a name="line.3946"></a>
-<span class="sourceLineNo">3947</span>    // after compaction<a name="line.3947"></a>
-<span class="sourceLineNo">3948</span>    storeFiles = store.getStorefiles();<a name="line.3948"></a>
-<span class="sourceLineNo">3949</span>    for (HStoreFile storefile : storeFiles) {<a name="line.3949"></a>
-<span class="sourceLineNo">3950</span>      StoreFileReader reader = storefile.getReader();<a name="line.3950"></a>
-<span class="sourceLineNo">3951</span>      reader.loadFileInfo();<a name="line.3951"></a>
-<span class="sourceLineNo">3952</span>      reader.loadBloomfilter();<a name="line.3952"></a>
-<span class="sourceLineNo">3953</span>      assertEquals(num_unique_rows * duplicate_multiplier * num_storefiles, reader.getEntries());<a name="line.3953"></a>
-<span class="sourceLineNo">3954</span>      assertEquals(num_unique_rows, reader.getFilterEntries());<a name="line.3954"></a>
-<span class="sourceLineNo">3955</span>    }<a name="line.3955"></a>
-<span class="sourceLineNo">3956</span>  }<a name="line.3956"></a>
-<span class="sourceLineNo">3957</span><a name="line.3957"></a>
-<span class="sourceLineNo">3958</span>  @Test<a name="line.3958"></a>
-<span class="sourceLineNo">3959</span>  public void testAllColumnsWithBloomFilter() throws IOException {<a name="line.3959"></a>
-<span class="sourceLineNo">3960</span>    byte[] TABLE = Bytes.toBytes(name.getMethodName());<a name="line.3960"></a>
-<span class="sourceLineNo">3961</span>    byte[] FAMILY = Bytes.toBytes("family");<a name="line.3961"></a>
-<span class="sourceLineNo">3962</span><a name="line.3962"></a>
-<span class="sourceLineNo">3963</span>    // Create table<a name="line.3963"></a>
-<span class="sourceLineNo">3964</span>    HColumnDescriptor hcd = new HColumnDescriptor(FAMILY).setMaxVersions(Integer.MAX_VALUE)<a name="line.3964"></a>
-<span class="sourceLineNo">3965</span>        .setBloomFilterType(BloomType.ROWCOL);<a name="line.3965"></a>
-<span class="sourceLineNo">3966</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(TABLE));<a name="line.3966"></a>
-<span class="sourceLineNo">3967</span>    htd.addFamily(hcd);<a name="line.3967"></a>
-<span class="sourceLineNo">3968</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.3968"></a>
-<span class="sourceLineNo">3969</span>    this.region = TEST_UTIL.createLocalHRegion(info, htd);<a name="line.3969"></a>
-<span class="sourceLineNo">3970</span>    // For row:0, col:0: insert versions 1 through 5.<a name="line.3970"></a>
-<span class="sourceLineNo">3971</span>    byte[] row = Bytes.toBytes("row:" + 0);<a name="line.3971"></a>
-<span class="sourceLineNo">3972</span>    byte[] column = Bytes.toBytes("column:" + 0);<a name="line.3972"></a>
-<span class="sourceLineNo">3973</span>    Put put = new Put(row);<a name="line.3973"></a>
-<span class="sourceLineNo">3974</span>    put.setDurability(Durability.SKIP_WAL);<a name="line.3974"></a>
-<span class="sourceLineNo">3975</span>    for (long idx = 1; idx &lt;= 4; idx++) {<a name="line.3975"></a>
-<span class="sourceLineNo">3976</span>      put.addColumn(FAMILY, column, idx, Bytes.toBytes("value-version-" + idx));<a name="line.3976"></a>
-<span class="sourceLineNo">3977</span>    }<a name="line.3977"></a>
-<span class="sourceLineNo">3978</span>    region.put(put);<a name="line.3978"></a>
-<span class="sourceLineNo">3979</span><a name="line.3979"></a>
-<span class="sourceLineNo">3980</span>    // Flush<a name="line.3980"></a>
-<span class="sourceLineNo">3981</span>    region.flush(true);<a name="line.3981"></a>
-<span class="sourceLineNo">3982</span><a name="line.3982"></a>
-<span class="sourceLineNo">3983</span>    // Get rows<a name="line.3983"></a>
-<span class="sourceLineNo">3984</span>    Get get = new Get(row);<a name="line.3984"></a>
-<span class="sourceLineNo">3985</span>    get.readAllVersions();<a name="line.3985"></a>
-<span class="sourceLineNo">3986</span>    Cell[] kvs = region.get(get).rawCells();<a name="line.3986"></a>
-<span class="sourceLineNo">3987</span><a name="line.3987"></a>
-<span class="sourceLineNo">3988</span>    // Check if rows are correct<a name="line.3988"></a>
-<span class="sourceLineNo">3989</span>    assertEquals(4, kvs.length);<a name="line.3989"></a>
-<span class="sourceLineNo">3990</span>    checkOneCell(kvs[0], FAMILY, 0, 0, 4);<a name="line.3990"></a>
-<span class="sourceLineNo">3991</span>    checkOneCell(kvs[1], FAMILY, 0, 0, 3);<a name="line.3991"></a>
-<span class="sourceLineNo">3992</span>    checkOneCell(kvs[2], FAMILY, 0, 0, 2);<a name="line.3992"></a>
-<span class="sourceLineNo">3993</span>    checkOneCell(kvs[3], FAMILY, 0, 0, 1);<a name="line.3993"></a>
-<span class="sourceLineNo">3994</span>  }<a name="line.3994"></a>
-<span class="sourceLineNo">3995</span><a name="line.3995"></a>
-<span class="sourceLineNo">3996</span>  /**<a name="line.3996"></a>
-<span class="sourceLineNo">3997</span>   * Testcase to cover bug-fix for HBASE-2823 Ensures correct delete when<a name="line.3997"></a>
-<span class="sourceLineNo">3998</span>   * issuing delete row on columns with bloom filter set to row+col<a name="line.3998"></a>
-<span class="sourceLineNo">3999</span>   * (BloomType.ROWCOL)<a name="line.3999"></a>
-<span class="sourceLineNo">4000</span>   */<a name="line.4000"></a>
-<span class="sourceLineNo">4001</span>  @Test<a name="line.4001"></a>
-<span class="sourceLineNo">4002</span>  public void testDeleteRowWithBloomFilter() throws IOException {<a name="line.4002"></a>
-<span class="sourceLineNo">4003</span>    byte[] familyName = Bytes.toBytes("familyName");<a name="line.4003"></a>
-<span class="sourceLineNo">4004</span><a name="line.4004"></a>
-<span class="sourceLineNo">4005</span>    // Create Table<a name="line.4005"></a>
-<span class="sourceLineNo">4006</span>    HColumnDescriptor hcd = new HColumnDescriptor(familyName).setMaxVersions(Integer.MAX_VALUE)<a name="line.4006"></a>
-<span class="sourceLineNo">4007</span>        .setBloomFilterType(BloomType.ROWCOL);<a name="line.4007"></a>
-<span class="sourceLineNo">4008</span><a name="line.4008"></a>
-<span class="sourceLineNo">4009</span>    HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.4009"></a>
-<span class="sourceLineNo">4010</span>    htd.addFamily(hcd);<a name="line.4010"></a>
-<span class="sourceLineNo">4011</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.4011"></a>
-<span class="sourceLineNo">4012</span>    this.region = TEST_UTIL.createLocalHRegion(info, htd);<a name="line.4012"></a>
-<span class="sourceLineNo">4013</span>    // Insert some data<a name="line.4013"></a>
-<span class="sourceLineNo">4014</span>    byte[] row = Bytes.toBytes("row1");<a name="line.4014"></a>
-<span class="sourceLineNo">4015</span>    byte[] col = Bytes.toBytes("col1");<a name="line.4015"></a>
-<span class="sourceLineNo">4016</span><a name="line.4016"></a>
-<span class="sourceLineNo">4017</span>    Put put = new Put(row);<a name="line.4017"></a>
-<span class="sourceLineNo">4018</span>    put.addColumn(familyName, col, 1, Bytes.toBytes("SomeRandomValue"));<a name="line.4018"></a>
-<span class="sourceLineNo">4019</span>    region.put(put);<a name="line.4019"></a>
-<span class="sourceLineNo">4020</span>    region.flush(true);<a name="line.4020"></a>
-<span class="sourceLineNo">4021</span><a name="line.4021"></a>
-<span class="sourceLineNo">4022</span>    Delete del = new Delete(row);<a name="line.4022"></a>
-<span class="sourceLineNo">4023</span>    region.delete(del);<a name="line.4023"></a>
-<span class="sourceLineNo">4024</span>    region.flush(true);<a name="line.4024"></a>
-<span class="sourceLineNo">4025</span><a name="line.4025"></a>
-<span class="sourceLineNo">4026</span>    // Get remaining rows (should have none)<a name="line.4026"></a>
-<span class="sourceLineNo">4027</span>    Get get = new Get(row);<a name="line.4027"></a>
-<span class="sourceLineNo">4028</span>    get.addColumn(familyName, col);<a name="line.4028"></a>
-<span class="sourceLineNo">4029</span><a name="line.4029"></a>
-<span class="sourceLineNo">4030</span>    Cell[] keyValues = region.get(get).rawCells();<a name="line.4030"></a>
-<span class="sourceLineNo">4031</span>    assertEquals(0, keyValues.length);<a name="line.4031"></a>
-<span class="sourceLineNo">4032</span>  }<a name="line.4032"></a>
-<span class="sourceLineNo">4033</span><a name="line.4033"></a>
-<span class="sourceLineNo">4034</span>  @Test<a name="line.4034"></a>
-<span class="sourceLineNo">4035</span>  public void testgetHDFSBlocksDistribution() throws Exception {<a name="line.4035"></a>
-<span class="sourceLineNo">4036</span>    HBaseTestingUtility htu = new HBaseTestingUtility();<a name="line.4036"></a>
-<span class="sourceLineNo">4037</span>    // Why do we set the block size in this test?  If we set it smaller than the kvs, then we'll<a name="line.4037"></a>
-<span class="sourceLineNo">4038</span>    // break up the file in to more pieces that can be distributed across the three nodes and we<a name="line.4038"></a>
-<span class="sourceLineNo">4039</span>    // won't be able to have the condition this test asserts; that at least one node has<a name="line.4039"></a>
-<span class="sourceLineNo">4040</span>    // a copy of all replicas -- if small block size, then blocks are spread evenly across the<a name="line.4040"></a>
-<span class="sourceLineNo">4041</span>    // the three nodes.  hfilev3 with tags seems to put us over the block size.  St.Ack.<a name="line.4041"></a>
-<span class="sourceLineNo">4042</span>    // final int DEFAULT_BLOCK_SIZE = 1024;<a name="line.4042"></a>
-<span class="sourceLineNo">4043</span>    // htu.getConfiguration().setLong("dfs.blocksize", DEFAULT_BLOCK_SIZE);<a name="line.4043"></a>
-<span class="sourceLineNo">4044</span>    htu.getConfiguration().setInt("dfs.replication", 2);<a name="line.4044"></a>
-<span class="sourceLineNo">4045</span><a name="line.4045"></a>
-<span class="sourceLineNo">4046</span>    // set up a cluster with 3 nodes<a name="line.4046"></a>
-<span class="sourceLineNo">4047</span>    MiniHBaseCluster cluster = null;<a name="line.4047"></a>
-<span class="sourceLineNo">4048</span>    String dataNodeHosts[] = new String[] { "host1", "host2", "host3" };<a name="line.4048"></a>
-<span class="sourceLineNo">4049</span>    int regionServersCount = 3;<a name="line.4049"></a>
-<span class="sourceLineNo">4050</span><a name="line.4050"></a>
-<span class="sourceLineNo">4051</span>    try {<a name="line.4051"></a>
-<span class="sourceLineNo">4052</span>      StartMiniClusterOption option = StartMiniClusterOption.builder()<a name="line.4052"></a>
-<span class="sourceLineNo">4053</span>          .numRegionServers(regionServersCount).dataNodeHosts(dataNodeHosts).build();<a name="line.4053"></a>
-<span class="sourceLineNo">4054</span>      cluster = htu.startMiniCluster(option);<a name="line.4054"></a>
-<span class="sourceLineNo">4055</span>      byte[][] families = { fam1, fam2 };<a name="line.4055"></a>
-<span class="sourceLineNo">4056</span>      Table ht = htu.createTable(tableName, families);<a name="line.4056"></a>
-<span class="sourceLineNo">4057</span><a name="line.4057"></a>
-<span class="sourceLineNo">4058</span>      // Setting up region<a name="line.4058"></a>
-<span class="sourceLineNo">4059</span>      byte row[] = Bytes.toBytes("row1");<a name="line.4059"></a>
-<span class="sourceLineNo">4060</span>      byte col[] = Bytes.toBytes("col1");<a name="line.4060"></a>
-<span class="sourceLineNo">4061</span><a name="line.4061"></a>
-<span class="sourceLineNo">4062</span>      Put put = new Put(row);<a name="line.4062"></a>
-<span class="sourceLineNo">4063</span>      put.addColumn(fam1, col, 1, Bytes.toBytes("test1"));<a name="line.4063"></a>
-<span class="sourceLineNo">4064</span>      put.addColumn(fam2, col, 1, Bytes.toBytes("test2"));<a name="line.4064"></a>
-<span class="sourceLineNo">4065</span>      ht.put(put);<a name="line.4065"></a>
-<span class="sourceLineNo">4066</span><a name="line.4066"></a>
-<span class="sourceLineNo">4067</span>      HRegion firstRegion = htu.getHBaseCluster().getRegions(tableName).get(0);<a name="line.4067"></a>
-<span class="sourceLineNo">4068</span>      firstRegion.flush(true);<a name="line.4068"></a>
-<span class="sourceLineNo">4069</span>      HDFSBlocksDistribution blocksDistribution1 = firstRegion.getHDFSBlocksDistribution();<a name="line.4069"></a>
-<span class="sourceLineNo">4070</span><a name="line.4070"></a>
-<span class="sourceLineNo">4071</span>      // Given the default replication factor is 2 and we have 2 HFiles,<a name="line.4071"></a>
-<span class="sourceLineNo">4072</span>      // we will have total of 4 replica of blocks on 3 datanodes; thus there<a name="line.4072"></a>
-<span class="sourceLineNo">4073</span>      // must be at least one host that have replica for 2 HFiles. That host's<a name="line.4073"></a>
-<span class="sourceLineNo">4074</span>      // weight will be equal to the unique block weight.<a name="line.4074"></a>
-<span class="sourceLineNo">4075</span>      long uniqueBlocksWeight1 = blocksDistribution1.getUniqueBlocksTotalWeight();<a name="line.4075"></a>
-<span class="sourceLineNo">4076</span>      StringBuilder sb = new StringBuilder();<a name="line.4076"></a>
-<span class="sourceLineNo">4077</span>      for (String host: blocksDistribution1.getTopHosts()) {<a name="line.4077"></a>
-<span class="sourceLineNo">4078</span>        if (sb.length() &gt; 0) sb.append(", ");<a name="line.4078"></a>
-<span class="sourceLineNo">4079</span>        sb.append(host);<a name="line.4079"></a>
-<span class="sourceLineNo">4080</span>        sb.append("=");<a name="line.4080"></a>
-<span class="sourceLineNo">4081</span>        sb.append(blocksDistribution1.getWeight(host));<a name="line.4081"></a>
-<span class="sourceLineNo">4082</span>      }<a name="line.4082"></a>
-<span class="sourceLineNo">4083</span><a name="line.4083"></a>
-<span class="sourceLineNo">4084</span>      String topHost = blocksDistribution1.getTopHosts().get(0);<a name="line.4084"></a>
-<span class="sourceLineNo">4085</span>      long topHostWeight = blocksDistribution1.getWeight(topHost);<a name="line.4085"></a>
-<span class="sourceLineNo">4086</span>      String msg = "uniqueBlocksWeight=" + uniqueBlocksWeight1 + ", topHostWeight=" +<a name="line.4086"></a>
-<span class="sourceLineNo">4087</span>        topHostWeight + ", topHost=" + topHost + "; " + sb.toString();<a name="line.4087"></a>
-<span class="sourceLineNo">4088</span>      LOG.info(msg);<a name="line.4088"></a>
-<span class="sourceLineNo">4089</span>      assertTrue(msg, uniqueBlocksWeight1 == topHostWeight);<a name="line.4089"></a>
-<span class="sourceLineNo">4090</span><a name="line.4090"></a>
-<span class="sourceLineNo">4091</span>      // use the static method to compute the value, it should be the same.<a name="line.4091"></a>
-<span class="sourceLineNo">4092</span>      // static method is used by load balancer or other components<a name="line.4092"></a>
-<span class="sourceLineNo">4093</span>      HDFSBlocksDistribution blocksDistribution2 = HRegion.computeHDFSBlocksDistribution(<a name="line.4093"></a>
-<span class="sourceLineNo">4094</span>          htu.getConfiguration(), firstRegion.getTableDescriptor(), firstRegion.getRegionInfo());<a name="line.4094"></a>
-<span class="sourceLineNo">4095</span>      long uniqueBlocksWeight2 = blocksDistribution2.getUniqueBlocksTotalWeight();<a name="line.4095"></a>
-<span class="sourceLineNo">4096</span><a name="line.4096"></a>
-<span class="sourceLineNo">4097</span>      assertTrue(uniqueBlocksWeight1 == uniqueBlocksWeight2);<a name="line.4097"></a>
-<span class="sourceLineNo">4098</span><a name="line.4098"></a>
-<span class="sourceLineNo">4099</span>      ht.close();<a name="line.4099"></a>
-<span class="sourceLineNo">4100</span>    } finally {<a name="line.4100"></a>
-<span class="sourceLineNo">4101</span>      if (cluster != null) {<a name="line.4101"></a>
-<span class="sourceLineNo">4102</span>        htu.shutdownMiniCluster();<a name="line.4102"></a>
-<span class="sourceLineNo">4103</span>      }<a name="line.4103"></a>
-<span class="sourceLineNo">4104</span>    }<a name="line.4104"></a>
-<span class="sourceLineNo">4105</span>  }<a name="line.4105"></a>
+<span class="sourceLineNo">3944</span>    // before compaction<a name="line.3944"></a>
+<span class="sourceLineNo">3945</span>    HStore store = region.getStore(fam1);<a name="line.3945"></a>
+<span class="sourceLineNo">3946</span>    Collection&lt;HStoreFile&gt; storeFiles = store.getStorefiles();<a name="line.3946"></a>
+<span class="sourceLineNo">3947</span>    for (HStoreFile storefile : storeFiles) {<a name="line.3947"></a>
+<span class="sourceLineNo">3948</span>      StoreFileReader reader = storefile.getReader();<a name="line.3948"></a>
+<span class="sourceLineNo">3949</span>      reader.loadFileInfo();<a name="line.3949"></a>
+<span class="sourceLineNo">3950</span>      reader.loadBloomfilter();<a name="line.3950"></a>
+<span class="sourceLineNo">3951</span>      assertEquals(num_unique_rows * duplicate_multiplier, reader.getEntries());<a name="line.3951"></a>
+<span class="sourceLineNo">3952</span>      assertEquals(num_unique_rows, reader.getFilterEntries());<a name="line.3952"></a>
+<span class="sourceLineNo">3953</span>    }<a name="line.3953"></a>
+<span class="sourceLineNo">3954</span><a name="line.3954"></a>
+<span class="sourceLineNo">3955</span>    region.compact(true);<a name="line.3955"></a>
+<span class="sourceLineNo">3956</span><a name="line.3956"></a>
+<span class="sourceLineNo">3957</span>    // after compaction<a name="line.3957"></a>
+<span class="sourceLineNo">3958</span>    storeFiles = store.getStorefiles();<a name="line.3958"></a>
+<span class="sourceLineNo">3959</span>    for (HStoreFile storefile : storeFiles) {<a name="line.3959"></a>
+<span class="sourceLineNo">3960</span>      StoreFileReader reader = storefile.getReader();<a name="line.3960"></a>
+<span class="sourceLineNo">3961</span>      reader.loadFileInfo();<a name="line.3961"></a>
+<span class="sourceLineNo">3962</span>      reader.loadBloomfilter();<a name="line.3962"></a>
+<span class="sourceLineNo">3963</span>      assertEquals(num_unique_rows * duplicate_multiplier * num_storefiles, reader.getEntries());<a name="line.3963"></a>
+<span class="sourceLineNo">3964</span>      assertEquals(num_unique_rows, reader.getFilterEntries());<a name="line.3964"></a>
+<span class="sourceLineNo">3965</span>    }<a name="line.3965"></a>
+<span class="sourceLineNo">3966</span>  }<a name="line.3966"></a>
+<span class="sourceLineNo">3967</span><a name="line.3967"></a>
+<span class="sourceLineNo">3968</span>  @Test<a name="line.3968"></a>
+<span class="sourceLineNo">3969</span>  public void testAllColumnsWithBloomFilter() throws IOException {<a name="line.3969"></a>
+<span class="sourceLineNo">3970</span>    byte[] TABLE = Bytes.toBytes(name.getMethodName());<a name="line.3970"></a>
+<span class="sourceLineNo">3971</span>    byte[] FAMILY = Bytes.toBytes("family");<a name="line.3971"></a>
+<span class="sourceLineNo">3972</span><a name="line.3972"></a>
+<span class="sourceLineNo">3973</span>    // Create table<a name="line.3973"></a>
+<span class="sourceLineNo">3974</span>    HColumnDescriptor hcd = new HColumnDescriptor(FAMILY).setMaxVersions(Integer.MAX_VALUE)<a name="line.3974"></a>
+<span class="sourceLineNo">3975</span>        .setBloomFilterType(BloomType.ROWCOL);<a name="line.3975"></a>
+<span class="sourceLineNo">3976</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(TABLE));<a name="line.3976"></a>
+<span class="sourceLineNo">3977</span>    htd.addFamily(hcd);<a name="line.3977"></a>
+<span class="sourceLineNo">3978</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.3978"></a>
+<span class="sourceLineNo">3979</span>    this.region = TEST_UTIL.createLocalHRegion(info, htd);<a name="line.3979"></a>
+<span class="sourceLineNo">3980</span>    // For row:0, col:0: insert versions 1 through 5.<a name="line.3980"></a>
+<span class="sourceLineNo">3981</span>    byte[] row = Bytes.toBytes("row:" + 0);<a name="line.3981"></a>
+<span class="sourceLineNo">3982</span>    byte[] column = Bytes.toBytes("column:" + 0);<a name="line.3982"></a>
+<span class="sourceLineNo">3983</span>    Put put = new Put(row);<a name="line.3983"></a>
+<span class="sourceLineNo">3984</span>    put.setDurability(Durability.SKIP_WAL);<a name="line.3984"></a>
+<span class="sourceLineNo">3985</span>    for (long idx = 1; idx &lt;= 4; idx++) {<a name="line.3985"></a>
+<span class="sourceLineNo">3986</span>      put.addColumn(FAMILY, column, idx, Bytes.toBytes("value-version-" + idx));<a name="line.3986"></a>
+<span class="sourceLineNo">3987</span>    }<a name="line.3987"></a>
+<span class="sourceLineNo">3988</span>    region.put(put);<a name="line.3988"></a>
+<span class="sourceLineNo">3989</span><a name="line.3989"></a>
+<span class="sourceLineNo">3990</span>    // Flush<a name="line.3990"></a>
+<span class="sourceLineNo">3991</span>    region.flush(true);<a name="line.3991"></a>
+<span class="sourceLineNo">3992</span><a name="line.3992"></a>
+<span class="sourceLineNo">3993</span>    // Get rows<a name="line.3993"></a>
+<span class="sourceLineNo">3994</span>    Get get = new Get(row);<a name="line.3994"></a>
+<span class="sourceLineNo">3995</span>    get.readAllVersions();<a name="line.3995"></a>
+<span class="sourceLineNo">3996</span>    Cell[] kvs = region.get(get).rawCells();<a name="line.3996"></a>
+<span class="sourceLineNo">3997</span><a name="line.3997"></a>
+<span class="sourceLineNo">3998</span>    // Check if rows are correct<a name="line.3998"></a>
+<span class="sourceLineNo">3999</span>    assertEquals(4, kvs.length);<a name="line.3999"></a>
+<span class="sourceLineNo">4000</span>    checkOneCell(kvs[0], FAMILY, 0, 0, 4);<a name="line.4000"></a>
+<span class="sourceLineNo">4001</span>    checkOneCell(kvs[1], FAMILY, 0, 0, 3);<a name="line.4001"></a>
+<span class="sourceLineNo">4002</span>    checkOneCell(kvs[2], FAMILY, 0, 0, 2);<a name="line.4002"></a>
+<span class="sourceLineNo">4003</span>    checkOneCell(kvs[3], FAMILY, 0, 0, 1);<a name="line.4003"></a>
+<span class="sourceLineNo">4004</span>  }<a name="line.4004"></a>
+<span class="sourceLineNo">4005</span><a name="line.4005"></a>
+<span class="sourceLineNo">4006</span>  /**<a name="line.4006"></a>
+<span class="sourceLineNo">4007</span>   * Testcase to cover bug-fix for HBASE-2823 Ensures correct delete when<a name="line.4007"></a>
+<span class="sourceLineNo">4008</span>   * issuing delete row on columns with bloom filter set to row+col<a name="line.4008"></a>
+<span class="sourceLineNo">4009</span>   * (BloomType.ROWCOL)<a name="line.4009"></a>
+<span class="sourceLineNo">4010</span>   */<a name="line.4010"></a>
+<span class="sourceLineNo">4011</span>  @Test<a name="line.4011"></a>
+<span class="sourceLineNo">4012</span>  public void testDeleteRowWithBloomFilter() throws IOException {<a name="line.4012"></a>
+<span class="sourceLineNo">4013</span>    byte[] familyName = Bytes.toBytes("familyName");<a name="line.4013"></a>
+<span class="sourceLineNo">4014</span><a name="line.4014"></a>
+<span class="sourceLineNo">4015</span>    // Create Table<a name="line.4015"></a>
+<span class="sourceLineNo">4016</span>    HColumnDescriptor hcd = new HColumnDescriptor(familyName).setMaxVersions(Integer.MAX_VALUE)<a name="line.4016"></a>
+<span class="sourceLineNo">4017</span>        .setBloomFilterType(BloomType.ROWCOL);<a name="line.4017"></a>
+<span class="sourceLineNo">4018</span><a name="line.4018"></a>
+<span class="sourceLineNo">4019</span>    HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.4019"></a>
+<span class="sourceLineNo">4020</span>    htd.addFamily(hcd);<a name="line.4020"></a>
+<span class="sourceLineNo">4021</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.4021"></a>
+<span class="sourceLineNo">4022</span>    this.region = TEST_UTIL.createLocalHRegion(info, htd);<a name="line.4022"></a>
+<span class="sourceLineNo">4023</span>    // Insert some data<a name="line.4023"></a>
+<span class="sourceLineNo">4024</span>    byte[] row = Bytes.toBytes("row1");<a name="line.4024"></a>
+<span class="sourceLineNo">4025</span>    byte[] col = Bytes.toBytes("col1");<a name="line.4025"></a>
+<span class="sourceLineNo">4026</span><a name="line.4026"></a>
+<span class="sourceLineNo">4027</span>    Put put = new Put(row);<a name="line.4027"></a>
+<span class="sourceLineNo">4028</span>    put.addColumn(familyName, col, 1, Bytes.toBytes("SomeRandomValue"));<a name="line.4028"></a>
+<span class="sourceLineNo">4029</span>    region.put(put);<a name="line.4029"></a>
+<span class="sourceLineNo">4030</span>    region.flush(true);<a name="line.4030"></a>
+<span class="sourceLineNo">4031</span><a name="line.4031"></a>
+<span class="sourceLineNo">4032</span>    Delete del = new Delete(row);<a name="line.4032"></a>
+<span class="sourceLineNo">4033</span>    region.delete(del);<a name="line.4033"></a>
+<span class="sourceLineNo">4034</span>    region.flush(true);<a name="line.4034"></a>
+<span class="sourceLineNo">4035</span><a name="line.4035"></a>
+<span class="sourceLineNo">4036</span>    // Get remaining rows (should have none)<a name="line.4036"></a>
+<span class="sourceLineNo">4037</span>    Get get = new Get(row);<a name="line.4037"></a>
+<span class="sourceLineNo">4038</span>    get.addColumn(familyName, col);<a name="line.4038"></a>
+<span class="sourceLineNo">4039</span><a name="line.4039"></a>
+<span class="sourceLineNo">4040</span>    Cell[] keyValues = region.get(get).rawCells();<a name="line.4040"></a>
+<span class="sourceLineNo">4041</span>    assertEquals(0, keyValues.length);<a name="line.4041"></a>
+<span class="sourceLineNo">4042</span>  }<a name="line.4042"></a>
+<span class="sourceLineNo">4043</span><a name="line.4043"></a>
+<span class="sourceLineNo">4044</span>  @Test<a name="line.4044"></a>
+<span class="sourceLineNo">4045</span>  public void testgetHDFSBlocksDistribution() throws Exception {<a name="line.4045"></a>
+<span class="sourceLineNo">4046</span>    HBaseTestingUtility htu = new HBaseTestingUtility();<a name="line.4046"></a>
+<span class="sourceLineNo">4047</span>    // Why do we set the block size in this test?  If we set it smaller than the kvs, then we'll<a name="line.4047"></a>
+<span class="sourceLineNo">4048</span>    // break up the file in to more pieces that can be distributed across the three nodes and we<a name="line.4048"></a>
+<span class="sourceLineNo">4049</span>    // won't be able to have the condition this test asserts; that at least one node has<a name="line.4049"></a>
+<span class="sourceLineNo">4050</span>    // a copy of all replicas -- if small block size, then blocks are spread evenly across the<a name="line.4050"></a>
+<span class="sourceLineNo">4051</span>    // the three nodes.  hfilev3 with tags seems to put us over the block size.  St.Ack.<a name="line.4051"></a>
+<span class="sourceLineNo">4052</span>    // final int DEFAULT_BLOCK_SIZE = 1024;<a name="line.4052"></a>
+<span class="sourceLineNo">4053</span>    // htu.getConfiguration().setLong("dfs.blocksize", DEFAULT_BLOCK_SIZE);<a name="line.4053"></a>
+<span class="sourceLineNo">4054</span>    htu.getConfiguration().setInt("dfs.replication", 2);<a name="line.4054"></a>
+<span class="sourceLineNo">4055</span><a name="line.4055"></a>
+<span class="sourceLineNo">4056</span>    // set up a cluster with 3 nodes<a name="line.4056"></a>
+<span class="sourceLineNo">4057</span>    MiniHBaseCluster cluster = null;<a name="line.4057"></a>
+<span class="sourceLineNo">4058</span>    String dataNodeHosts[] = new String[] { "host1", "host2", "host3" };<a name="line.4058"></a>
+<span class="sourceLineNo">4059</span>    int regionServersCount = 3;<a name="line.4059"></a>
+<span class="sourceLineNo">4060</span><a name="line.4060"></a>
+<span class="sourceLineNo">4061</span>    try {<a name="line.4061"></a>
+<span class="sourceLineNo">4062</span>      StartMiniClusterOption option = StartMiniClusterOption.builder()<a name="line.4062"></a>
+<span class="sourceLineNo">4063</span>          .numRegionServers(regionServersCount).dataNodeHosts(dataNodeHosts).build();<a name="line.4063"></a>
+<span class="sourceLineNo">4064</span>      cluster = htu.startMiniCluster(option);<a name="line.4064"></a>
+<span class="sourceLineNo">4065</span>      byte[][] families = { fam1, fam2 };<a name="line.4065"></a>
+<span class="sourceLineNo">4066</span>      Table ht = htu.createTable(tableName, families);<a name="line.4066"></a>
+<span class="sourceLineNo">4067</span><a name="line.4067"></a>
+<span class="sourceLineNo">4068</span>      // Setting up region<a name="line.4068"></a>
+<span class="sourceLineNo">4069</span>      byte row[] = Bytes.toBytes("row1");<a name="line.4069"></a>
+<span class="sourceLineNo">4070</span>      byte col[] = Bytes.toBytes("col1");<a name="line.4070"></a>
+<span class="sourceLineNo">4071</span><a name="line.4071"></a>
+<span class="sourceLineNo">4072</span>      Put put = new Put(row);<a name="line.4072"></a>
+<span class="sourceLineNo">4073</span>      put.addColumn(fam1, col, 1, Bytes.toBytes("test1"));<a name="line.4073"></a>
+<span class="sourceLineNo">4074</span>      put.addColumn(fam2, col, 1, Bytes.toBytes("test2"));<a name="line.4074"></a>
+<span class="sourceLineNo">4075</span>      ht.put(put);<a name="line.4075"></a>
+<span class="sourceLineNo">4076</span><a name="line.4076"></a>
+<span class="sourceLineNo">4077</span>      HRegion firstRegion = htu.getHBaseCluster().getRegions(tableName).get(0);<a name="line.4077"></a>
+<span class="sourceLineNo">4078</span>      firstRegion.flush(true);<a name="line.4078"></a>
+<span class="sourceLineNo">4079</span>      HDFSBlocksDistribution blocksDistribution1 = firstRegion.getHDFSBlocksDistribution();<a name="line.4079"></a>
+<span class="sourceLineNo">4080</span><a name="line.4080"></a>
+<span class="sourceLineNo">4081</span>      // Given the default replication factor is 2 and we have 2 HFiles,<a name="line.4081"></a>
+<span class="sourceLineNo">4082</span>      // we will have total of 4 replica of blocks on 3 datanodes; thus there<a name="line.4082"></a>
+<span class="sourceLineNo">4083</span>      // must be at least one host that have replica for 2 HFiles. That host's<a name="line.4083"></a>
+<span class="sourceLineNo">4084</span>      // weight will be equal to the unique block weight.<a name="line.4084"></a>
+<span class="sourceLineNo">4085</span>      long uniqueBlocksWeight1 = blocksDistribution1.getUniqueBlocksTotalWeight();<a name="line.4085"></a>
+<span class="sourceLineNo">4086</span>      StringBuilder sb = new StringBuilder();<a name="line.4086"></a>
+<span class="sourceLineNo">4087</span>      for (String host: blocksDistribution1.getTopHosts()) {<a name="line.4087"></a>
+<span class="sourceLineNo">4088</span>        if (sb.length() &gt; 0) sb.append(", ");<a name="line.4088"></a>
+<span class="sourceLineNo">4089</span>        sb.append(host);<a name="line.4089"></a>
+<span class="sourceLineNo">4090</span>        sb.append("=");<a name="line.4090"></a>
+<span class="sourceLineNo">4091</span>        sb.append(blocksDistribution1.getWeight(host));<a name="line.4091"></a>
+<span class="sourceLineNo">4092</span>      }<a name="line.4092"></a>
+<span class="sourceLineNo">4093</span><a name="line.4093"></a>
+<span class="sourceLineNo">4094</span>      String topHost = blocksDistribution1.getTopHosts().get(0);<a name="line.4094"></a>
+<span class="sourceLineNo">4095</span>      long topHostWeight = blocksDistribution1.getWeight(topHost);<a name="line.4095"></a>
+<span class="sourceLineNo">4096</span>      String msg = "uniqueBlocksWeight=" + uniqueBlocksWeight1 + ", topHostWeight=" +<a name="line.4096"></a>
+<span class="sourceLineNo">4097</span>        topHostWeight + ", topHost=" + topHost + "; " + sb.toString();<a name="line.4097"></a>
+<span class="sourceLineNo">4098</span>      LOG.info(msg);<a name="line.4098"></a>
+<span class="sourceLineNo">4099</span>      assertTrue(msg, uniqueBlocksWeight1 == topHostWeight);<a name="line.4099"></a>
+<span class="sourceLineNo">4100</span><a name="line.4100"></a>
+<span class="sourceLineNo">4101</span>      // use the static method to compute the value, it should be the same.<a name="line.4101"></a>
+<span class="sourceLineNo">4102</span>      // static method is used by load balancer or other components<a name="line.4102"></a>
+<span class="sourceLineNo">4103</span>      HDFSBlocksDistribution blocksDistribution2 = HRegion.computeHDFSBlocksDistribution(<a name="line.4103"></a>
+<span class="sourceLineNo">4104</span>          htu.getConfiguration(), firstRegion.getTableDescriptor(), firstRegion.getRegionInfo());<a name="line.4104"></a>
+<span class="sourceLineNo">4105</span>      long uniqueBlocksWeight2 = blocksDistribution2.getUniqueBlocksTotalWeight();<a name="line.4105"></a>
 <span class="sourceLineNo">4106</span><a name="line.4106"></a>
-<span class="sourceLineNo">4107</span>  /**<a name="line.4107"></a>
-<span class="sourceLineNo">4108</span>   * Testcase to check state of region initialization task set to ABORTED or not<a name="line.4108"></a>
-<span class="sourceLineNo">4109</span>   * if any exceptions during initialization<a name="line.4109"></a>
-<span class="sourceLineNo">4110</span>   *<a name="line.4110"></a>
-<span class="sourceLineNo">4111</span>   * @throws Exception<a name="line.4111"></a>
-<span class="sourceLineNo">4112</span>   */<a name="line.4112"></a>
-<span class="sourceLineNo">4113</span>  @Test<a name="line.4113"></a>
-<span class="sourceLineNo">4114</span>  public void testStatusSettingToAbortIfAnyExceptionDuringRegionInitilization() throws Exception {<a name="line.4114"></a>
-<span class="sourceLineNo">4115</span>    HRegionInfo info;<a name="line.4115"></a>
-<span class="sourceLineNo">4116</span>    try {<a name="line.4116"></a>
-<span class="sourceLineNo">4117</span>      FileSystem fs = Mockito.mock(FileSystem.class);<a name="line.4117"></a>
-<span class="sourceLineNo">4118</span>      Mockito.when(fs.exists((Path) Mockito.anyObject())).thenThrow(new IOException());<a name="line.4118"></a>
-<span class="sourceLineNo">4119</span>      HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.4119"></a>
-<span class="sourceLineNo">4120</span>      htd.addFamily(new HColumnDescriptor("cf"));<a name="line.4120"></a>
-<span class="sourceLineNo">4121</span>      info = new HRegionInfo(htd.getTableName(), HConstants.EMPTY_BYTE_ARRAY,<a name="line.4121"></a>
-<span class="sourceLineNo">4122</span>          HConstants.EMPTY_BYTE_ARRAY, false);<a name="line.4122"></a>
-<span class="sourceLineNo">4123</span>      Path path = new Path(dir + "testStatusSettingToAbortIfAnyExceptionDuringRegionInitilization");<a name="line.4123"></a>
-<span class="sourceLineNo">4124</span>      region = HRegion.newHRegion(path, null, fs, CONF, info, htd, null);<a name="line.4124"></a>
-<span class="sourceLineNo">4125</span>      // region initialization throws IOException and set task state to ABORTED.<a name="line.4125"></a>
-<span class="sourceLineNo">4126</span>      region.initialize();<a name="line.4126"></a>
-<span class="sourceLineNo">4127</span>      fail("Region initialization should fail due to IOException");<a name="line.4127"></a>
-<span class="sourceLineNo">4128</span>    } catch (IOException io) {<a name="line.4128"></a>
-<span class="sourceLineNo">4129</span>      List&lt;MonitoredTask&gt; tasks = TaskMonitor.get().getTasks();<a name="line.4129"></a>
-<span class="sourceLineNo">4130</span>      for (MonitoredTask monitoredTask : tasks) {<a name="line.4130"></a>
-<span class="sourceLineNo">4131</span>        if (!(monitoredTask instanceof MonitoredRPCHandler)<a name="line.4131"></a>
-<span class="sourceLineNo">4132</span>            &amp;&amp; monitoredTask.getDescription().contains(region.toString())) {<a name="line.4132"></a>
-<span class="sourceLineNo">4133</span>          assertTrue("Region state should be ABORTED.",<a name="line.4133"></a>
-<span class="sourceLineNo">4134</span>              monitoredTask.getState().equals(MonitoredTask.State.ABORTED));<a name="line.4134"></a>
-<span class="sourceLineNo">4135</span>          break;<a name="line.4135"></a>
-<span class="sourceLineNo">4136</span>        }<a name="line.4136"></a>
-<span class="sourceLineNo">4137</span>      }<a name="line.4137"></a>
-<span class="sourceLineNo">4138</span>    }<a name="line.4138"></a>
-<span class="sourceLineNo">4139</span>  }<a name="line.4139"></a>
-<span class="sourceLineNo">4140</span><a name="line.4140"></a>
-<span class="sourceLineNo">4141</span>  /**<a name="line.4141"></a>
-<span class="sourceLineNo">4142</span>   * Verifies that the .regioninfo file is written on region creation and that<a name="line.4142"></a>
-<span class="sourceLineNo">4143</span>   * is recreated if missing during region opening.<a name="line.4143"></a>
-<span class="sourceLineNo">4144</span>   */<a name="line.4144"></a>
-<span class="sourceLineNo">4145</span>  @Test<a name="line.4145"></a>
-<span class="sourceLineNo">4146</span>  public void testRegionInfoFileCreation() throws IOException {<a name="line.4146"></a>
-<span class="sourceLineNo">4147</span>    Path rootDir = new Path(dir + "testRegionInfoFileCreation");<a name="line.4147"></a>
-<span class="sourceLineNo">4148</span><a name="line.4148"></a>
-<span class="sourceLineNo">4149</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.4149"></a>
-<span class="sourceLineNo">4150</span>    htd.addFamily(new HColumnDescriptor("cf"));<a name="line.4150"></a>
-<span class="sourceLineNo">4151</span><a name="line.4151"></a>
-<span class="sourceLineNo">4152</span>    HRegionInfo hri = new HRegionInfo(htd.getTableName());<a name="line.4152"></a>
-<span class="sourceLineNo">4153</span><a name="line.4153"></a>
-<span class="sourceLineNo">4154</span>    // Create a region and skip the initialization (like CreateTableHandler)<a name="line.4154"></a>
-<span class="sourceLineNo">4155</span>    region = HBaseTestingUtility.createRegionAndWAL(hri, rootDir, CONF, htd, false);<a name="line.4155"></a>
-<span class="sourceLineNo">4156</span>    Path regionDir = region.getRegionFileSystem().getRegionDir();<a name="line.4156"></a>
-<span class="sourceLineNo">4157</span>    FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.4157"></a>
-<span class="sourceLineNo">4158</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.4158"></a>
-<span class="sourceLineNo">4159</span><a name="line.4159"></a>
-<span class="sourceLineNo">4160</span>    Path regionInfoFile = new Path(regionDir, HRegionFileSystem.REGION_INFO_FILE);<a name="line.4160"></a>
+<span class="sourceLineNo">4107</span>      assertTrue(uniqueBlocksWeight1 == uniqueBlocksWeight2);<a name="line.4107"></a>
+<span class="sourceLineNo">4108</span><a name="line.4108"></a>
+<span class="sourceLineNo">4109</span>      ht.close();<a name="line.4109"></a>
+<span class="sourceLineNo">4110</span>    } finally {<a name="line.4110"></a>
+<span class="sourceLineNo">4111</span>      if (cluster != null) {<a name="line.4111"></a>
+<span class="sourceLineNo">4112</span>        htu.shutdownMiniCluster();<a name="line.4112"></a>
+<span class="sourceLineNo">4113</span>      }<a name="line.4113"></a>
+<span class="sourceLineNo">4114</span>    }<a name="line.4114"></a>
+<span class="sourceLineNo">4115</span>  }<a name="line.4115"></a>
+<span class="sourceLineNo">4116</span><a name="line.4116"></a>
+<span class="sourceLineNo">4117</span>  /**<a name="line.4117"></a>
+<span class="sourceLineNo">4118</span>   * Testcase to check state of region initialization task set to ABORTED or not<a name="line.4118"></a>
+<span class="sourceLineNo">4119</span>   * if any exceptions during initialization<a name="line.4119"></a>
+<span class="sourceLineNo">4120</span>   *<a name="line.4120"></a>
+<span class="sourceLineNo">4121</span>   * @throws Exception<a name="line.4121"></a>
+<span class="sourceLineNo">4122</span>   */<a name="line.4122"></a>
+<span class="sourceLineNo">4123</span>  @Test<a name="line.4123"></a>
+<span class="sourceLineNo">4124</span>  public void testStatusSettingToAbortIfAnyExceptionDuringRegionInitilization() throws Exception {<a name="line.4124"></a>
+<span class="sourceLineNo">4125</span>    HRegionInfo info;<a name="line.4125"></a>
+<span class="sourceLineNo">4126</span>    try {<a name="line.4126"></a>
+<span class="sourceLineNo">4127</span>      FileSystem fs = Mockito.mock(FileSystem.class);<a name="line.4127"></a>
+<span class="sourceLineNo">4128</span>      Mockito.when(fs.exists((Path) Mockito.anyObject())).thenThrow(new IOException());<a name="line.4128"></a>
+<span class="sourceLineNo">4129</span>      HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.4129"></a>
+<span class="sourceLineNo">4130</span>      htd.addFamily(new HColumnDescriptor("cf"));<a name="line.4130"></a>
+<span class="sourceLineNo">4131</span>      info = new HRegionInfo(htd.getTableName(), HConstants.EMPTY_BYTE_ARRAY,<a name="line.4131"></a>
+<span class="sourceLineNo">4132</span>          HConstants.EMPTY_BYTE_ARRAY, false);<a name="line.4132"></a>
+<span class="sourceLineNo">4133</span>      Path path = new Path(dir + "testStatusSettingToAbortIfAnyExceptionDuringRegionInitilization");<a name="line.4133"></a>
+<span class="sourceLineNo">4134</span>      region = HRegion.newHRegion(path, null, fs, CONF, info, htd, null);<a name="line.4134"></a>
+<span class="sourceLineNo">4135</span>      // region initialization throws IOException and set task state to ABORTED.<a name="line.4135"></a>
+<span class="sourceLineNo">4136</span>      region.initialize();<a name="line.4136"></a>
+<span class="sourceLineNo">4137</span>      fail("Region initialization should fail due to IOException");<a name="line.4137"></a>
+<span class="sourceLineNo">4138</span>    } catch (IOException io) {<a name="line.4138"></a>
+<span class="sourceLineNo">4139</span>      List&lt;MonitoredTask&gt; tasks = TaskMonitor.get().getTasks();<a name="line.4139"></a>
+<span class="sourceLineNo">4140</span>      for (MonitoredTask monitoredTask : tasks) {<a name="line.4140"></a>
+<span class="sourceLineNo">4141</span>        if (!(monitoredTask instanceof MonitoredRPCHandler)<a name="line.4141"></a>
+<span class="sourceLineNo">4142</span>            &amp;&amp; monitoredTask.getDescription().contains(region.toString())) {<a name="line.4142"></a>
+<span class="sourceLineNo">4143</span>          assertTrue("Region state should be ABORTED.",<a name="line.4143"></a>
+<span class="sourceLineNo">4144</span>              monitoredTask.getState().equals(MonitoredTask.State.ABORTED));<a name="line.4144"></a>
+<span class="sourceLineNo">4145</span>          break;<a name="line.4145"></a>
+<span class="sourceLineNo">4146</span>        }<a name="line.4146"></a>
+<span class="sourceLineNo">4147</span>      }<a name="line.4147"></a>
+<span class="sourceLineNo">4148</span>    }<a name="line.4148"></a>
+<span class="sourceLineNo">4149</span>  }<a name="line.4149"></a>
+<span class="sourceLineNo">4150</span><a name="line.4150"></a>
+<span class="sourceLineNo">4151</span>  /**<a name="line.4151"></a>
+<span class="sourceLineNo">4152</span>   * Verifies that the .regioninfo file is written on region creation and that<a name="line.4152"></a>
+<span class="sourceLineNo">4153</span>   * is recreated if missing during region opening.<a name="line.4153"></a>
+<span class="sourceLineNo">4154</span>   */<a name="line.4154"></a>
+<span class="sourceLineNo">4155</span>  @Test<a name="line.4155"></a>
+<span class="sourceLineNo">4156</span>  public void testRegionInfoFileCreation() throws IOException {<a name="line.4156"></a>
+<span class="sourceLineNo">4157</span>    Path rootDir = new Path(dir + "testRegionInfoFileCreation");<a name="line.4157"></a>
+<span class="sourceLineNo">4158</span><a name="line.4158"></a>
+<span class="sourceLineNo">4159</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.4159"></a>
+<span class="sourceLineNo">4160</span>    htd.addFamily(new HColumnDescriptor("cf"));<a name="line.4160"></a>
 <span class="sourceLineNo">4161</span><a name="line.4161"></a>
-<span class="sourceLineNo">4162</span>    // Verify that the .regioninfo file is present<a name="line.4162"></a>
-<span class="sourceLineNo">4163</span>    assertTrue(HRegionFileSystem.REGION_INFO_FILE + " should be present in the region dir",<a name="line.4163"></a>
-<span class="sourceLineNo">4164</span>        fs.exists(regionInfoFile));<a name="line.4164"></a>
-<span class="sourceLineNo">4165</span><a name="line.4165"></a>
-<span class="sourceLineNo">4166</span>    // Try to open the region<a name="line.4166"></a>
-<span class="sourceLineNo">4167</span>    region = HRegion.openHRegion(rootDir, hri, htd, null, CONF);<a name="line.4167"></a>
-<span class="sourceLineNo">4168</span>    assertEquals(regionDir, region.getRegionFileSystem().getRegionDir());<a name="line.4168"></a>
-<span class="sourceLineNo">4169</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.4169"></a>
-<span class="sourceLineNo">4170</span><a name="line.4170"></a>
-<span class="sourceLineNo">4171</span>    // Verify that the .regioninfo file is still there<a name="line.4171"></a>
-<span class="sourceLineNo">4172</span>    assertTrue(HRegionFileSystem.REGION_INFO_FILE + " should be present in the region dir",<a name="line.4172"></a>
-<span class="sourceLineNo">4173</span>        fs.exists(regionInfoFile));<a name="line.4173"></a>
-<span class="sourceLineNo">4174</span><a name="line.4174"></a>
-<span class="sourceLineNo">4175</span>    // Remove the .regioninfo file and verify is recreated on region open<a name="line.4175"></a>
-<span class="sourceLineNo">4176</span>    fs.delete(regionInfoFile, true);<a name="line.4176"></a>
-<span class="sourceLineNo">4177</span>    assertFalse(HRegionFileSystem.REGION_INFO_FILE + " should be removed from the region dir",<a name="line.4177"></a>
-<span class="sourceLineNo">4178</span>        fs.exists(regionInfoFile));<a name="line.4178"></a>
-<span class="sourceLineNo">4179</span><a name="line.4179"></a>
-<span class="sourceLineNo">4180</span>    region = HRegion.openHRegion(rootDir, hri, htd, null, CONF);<a name="line.4180"></a>
-<span class="sourceLineNo">4181</span>//    region = TEST_UTIL.openHRegion(hri, htd);<a name="line.4181"></a>
-<span class="sourceLineNo">4182</span>    assertEquals(regionDir, region.getRegionFileSystem().getRegionDir());<a name="line.4182"></a>
-<span class="sourceLineNo">4183</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.4183"></a>
+<span class="sourceLineNo">4162</span>    HRegionInfo hri = new HRegionInfo(htd.getTableName());<a name="line.4162"></a>
+<span class="sourceLineNo">4163</span><a name="line.4163"></a>
+<span class="sourceLineNo">4164</span>    // Create a region and skip the initialization (like CreateTableHandler)<a name="line.4164"></a>
+<span class="sourceLineNo">4165</span>    region = HBaseTestingUtility.createRegionAndWAL(hri, rootDir, CONF, htd, false);<a name="line.4165"></a>
+<span class="sourceLineNo">4166</span>    Path regionDir = region.getRegionFileSystem().getRegionDir();<a name="line.4166"></a>
+<span class="sourceLineNo">4167</span>    FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.4167"></a>
+<span class="sourceLineNo">4168</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.4168"></a>
+<span class="sourceLineNo">4169</span><a name="line.4169"></a>
+<span class="sourceLineNo">4170</span>    Path regionInfoFile = new Path(regionDir, HRegionFileSystem.REGION_INFO_FILE);<a name="line.4170"></a>
+<span class="sourceLineNo">4171</span><a name="line.4171"></a>
+<span class="sourceLineNo">4172</span>    // Verify that the .regioninfo file is present<a name="line.4172"></a>
+<span class="sourceLineNo">4173</span>    assertTrue(HRegionFileSystem.REGION_INFO_FILE + " should be present in the region dir",<a name="line.4173"></a>
+<span class="sourceLineNo">4174</span>        fs.exists(regionInfoFile));<a name="line.4174"></a>
+<span class="sourceLineNo">4175</span><a name="line.4175"></a>
+<span class="sourceLineNo">4176</span>    // Try to open the region<a name="line.4176"></a>
+<span class="sourceLineNo">4177</span>    region = HRegion.openHRegion(rootDir, hri, htd, null, CONF);<a name="line.4177"></a>
+<span class="sourceLineNo">4178</span>    assertEquals(regionDir, region.getRegionFileSystem().getRegionDir());<a name="line.4178"></a>
+<span class="sourceLineNo">4179</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.4179"></a>
+<span class="sourceLineNo">4180</span><a name="line.4180"></a>
+<span class="sourceLineNo">4181</span>    // Verify that the .regioninfo file is still there<a name="line.4181"></a>
+<span class="sourceLineNo">4182</span>    assertTrue(HRegionFileSystem.REGION_INFO_FILE + " should be present in the region dir",<a name="line.4182"></a>
+<span class="sourceLineNo">4183</span>        fs.exists(regionInfoFile));<a name="line.4183"></a>
 <span class="sourceLineNo">4184</span><a name="line.4184"></a>
-<span class="sourceLineNo">4185</span>    // Verify that the .regioninfo file is still there<a name="line.4185"></a>
-<span class="sourceLineNo">4186</span>    assertTrue(HRegionFileSystem.REGION_INFO_FILE + " should be present in the region dir",<a name="line.4186"></a>
-<span class="sourceLineNo">4187</span>        fs.exists(new Path(regionDir, HRegionFileSystem.REGION_INFO_FILE)));<a name="line.4187"></a>
-<span class="sourceLineNo">4188</span><a name="line.4188"></a>
-<span class="sourceLineNo">4189</span>    region = null;<a name="line.4189"></a>
-<span class="sourceLineNo">4190</span>  }<a name="line.4190"></a>
-<span class="sourceLineNo">4191</span><a name="line.4191"></a>
-<span class="sourceLineNo">4192</span>  /**<a name="line.4192"></a>
-<span class="sourceLineNo">4193</span>   * TestCase for increment<a name="line.4193"></a>
-<span class="sourceLineNo">4194</span>   */<a name="line.4194"></a>
-<span class="sourceLineNo">4195</span>  private static class Incrementer implements Runnable {<a name="line.4195"></a>
-<span class="sourceLineNo">4196</span>    private HRegion region;<a name="line.4196"></a>
-<span class="sourceLineNo">4197</span>    private final static byte[] incRow = Bytes.toBytes("incRow");<a name="line.4197"></a>
-<span class="sourceLineNo">4198</span>    private final static byte[] family = Bytes.toBytes("family");<a name="line.4198"></a>
-<span class="sourceLineNo">4199</span>    private final static byte[] qualifier = Bytes.toBytes("qualifier");<a name="line.4199"></a>
-<span class="sourceLineNo">4200</span>    private final static long ONE = 1L;<a name="line.4200"></a>
-<span class="sourceLineNo">4201</span>    private int incCounter;<a name="line.4201"></a>
-<span class="sourceLineNo">4202</span><a name="line.4202"></a>
-<span class="sourceLineNo">4203</span>    public Incrementer(HRegion region, int incCounter) {<a name="line.4203"></a>
-<span class="sourceLineNo">4204</span>      this.region = region;<a name="line.4204"></a>
-<span class="sourceLineNo">4205</span>      this.incCounter = incCounter;<a name="line.4205"></a>
-<span class="sourceLineNo">4206</span>    }<a name="line.4206"></a>
-<span class="sourceLineNo">4207</span><a name="line.4207"></a>
-<span class="sourceLineNo">4208</span>    @Override<a name="line.4208"></a>
-<span class="sourceLineNo">4209</span>    public void run() {<a name="line.4209"></a>
-<span class="sourceLineNo">4210</span>      int count = 0;<a name="line.4210"></a>
-<span class="sourceLineNo">4211</span>      while (count &lt; incCounter) {<a name="line.4211"></a>
-<span class="sourceLineNo">4212</span>        Increment inc = new Increment(incRow);<a name="line.4212"></a>
-<span class="sourceLineNo">4213</span>        inc.addColumn(family, qualifier, ONE);<a name="line.4213"></a>
-<span class="sourceLineNo">4214</span>        count++;<a name="line.4214"></a>
-<span class="sourceLineNo">4215</span>        try {<a name="line.4215"></a>
-<span class="sourceLineNo">4216</span>          region.increment(inc);<a name="line.4216"></a>
-<span class="sourceLineNo">4217</span>        } catch (IOException e) {<a name="line.4217"></a>
-<span class="sourceLineNo">4218</span>          LOG.info("Count=" + count + ", " + e);<a name="line.4218"></a>
-<span class="sourceLineNo">4219</span>          break;<a name="line.4219"></a>
-<span class="sourceLineNo">4220</span>        }<a name="line.4220"></a>
-<span class="sourceLineNo">4221</span>      }<a name="line.4221"></a>
-<span class="sourceLineNo">4222</span>    }<a name="line.4222"></a>
-<span class="sourceLineNo">4223</span>  }<a name="line.4223"></a>
-<span class="sourceLineNo">4224</span><a name="line.4224"></a>
-<span class="sourceLineNo">4225</span>  /**<a name="line.4225"></a>
-<span class="sourceLineNo">4226</span>   * Test case to check increment function with memstore flushing<a name="line.4226"></a>
-<span class="sourceLineNo">4227</span>   * @throws Exception<a name="line.4227"></a>
-<span class="sourceLineNo">4228</span>   */<a name="line.4228"></a>
-<span class="sourceLineNo">4229</span>  @Test<a name="line.4229"></a>
-<span class="sourceLineNo">4230</span>  public void testParallelIncrementWithMemStoreFlush() throws Exception {<a name="line.4230"></a>
-<span class="sourceLineNo">4231</span>    byte[] family = Incrementer.family;<a name="line.4231"></a>
-<span class="sourceLineNo">4232</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.4232"></a>
-<span class="sourceLineNo">4233</span>    final HRegion region = this.region;<a name="line.4233"></a>
-<span class="sourceLineNo">4234</span>    final AtomicBoolean incrementDone = new AtomicBoolean(false);<a name="line.4234"></a>
-<span class="sourceLineNo">4235</span>    Runnable flusher = new Runnable() {<a name="line.4235"></a>
-<span class="sourceLineNo">4236</span>      @Override<a name="line.4236"></a>
-<span class="sourceLineNo">4237</span>      public void run() {<a name="line.4237"></a>
-<span class="sourceLineNo">4238</span>        while (!incrementDone.get()) {<a name="line.4238"></a>
-<span class="sourceLineNo">4239</span>          try {<a name="line.4239"></a>
-<span class="sourceLineNo">4240</span>            region.flush(true);<a name="line.4240"></a>
-<span class="sourceLineNo">4241</span>          } catch (Exception e) {<a name="line.4241"></a>
-<span class="sourceLineNo">4242</span>            e.printStackTrace();<a name="line.4242"></a>
-<span class="sourceLineNo">4243</span>          }<a name="line.4243"></a>
-<span class="sourceLineNo">4244</span>        }<a name="line.4244"></a>
-<span class="sourceLineNo">4245</span>      }<a name="line.4245"></a>
-<span class="sourceLineNo">4246</span>    };<a name="line.4246"></a>
-<span class="sourceLineNo">4247</span><a name="line.4247"></a>
-<span class="sourceLineNo">4248</span>    // after all increment finished, the row will increment to 20*100 = 2000<a name="line.4248"></a>
-<span class="sourceLineNo">4249</span>    int threadNum = 20;<a name="line.4249"></a>
-<span class="sourceLineNo">4250</span>    int incCounter = 100;<a name="line.4250"></a>
-<span class="sourceLineNo">4251</span>    long expected = (long) threadNum * incCounter;<a name="line.4251"></a>
-<span class="sourceLineNo">4252</span>    Thread[] incrementers = new Thread[threadNum];<a name="line.4252"></a>
-<span class="sourceLineNo">4253</span>    Thread flushThread = new Thread(flusher);<a name="line.4253"></a>
-<span class="sourceLineNo">4254</span>    for (int i = 0; i &lt; threadNum; i++) {<a name="line.4254"></a>
-<span class="sourceLineNo">4255</span>      incrementers[i] = new Thread(new Incrementer(this.region, incCounter));<a name="line.4255"></a>
-<span class="sourceLineNo">4256</span>      incrementers[i].start();<a name="line.4256"></a>
-<span class="sourceLineNo">4257</span>    }<a name="line.4257"></a>
-<span class="sourceLineNo">4258</span>    flushThread.start();<a name="line.4258"></a>
-<span class="sourceLineNo">4259</span>    for (int i = 0; i &lt; threadNum; i++) {<a name="line.4259"></a>
-<span class="sourceLineNo">4260</span>      incrementers[i].join();<a name="line.4260"></a>
-<span class="sourceLineNo">4261</span>    }<a name="line.4261"></a>
-<span class="sourceLineNo">4262</span><a name="line.4262"></a>
-<span class="sourceLineNo">4263</span>    incrementDone.set(true);<a name="line.4263"></a>
-<span class="sourceLineNo">4264</span>    flushThread.join();<a name="line.4264"></a>
-<span class="sourceLineNo">4265</span><a name="line.4265"></a>
-<span class="sourceLineNo">4266</span>    Get get = new Get(Incrementer.incRow);<a name="line.4266"></a>
-<span class="sourceLineNo">4267</span>    get.addColumn(Incrementer.family, Incrementer.qualifier);<a name="line.4267"></a>
-<span class="sourceLineNo">4268</span>    get.readVersions(1);<a name="line.4268"></a>
-<span class="sourceLineNo">4269</span>    Result res = this.region.get(get);<a name="line.4269"></a>
-<span class="sourceLineNo">4270</span>    List&lt;Cell&gt; kvs = res.getColumnCells(Incrementer.family, Incrementer.qualifier);<a name="line.4270"></a>
-<span class="sourceLineNo">4271</span><a name="line.4271"></a>
-<span class="sourceLineNo">4272</span>    // we just got the latest version<a name="line.4272"></a>
-<span class="sourceLineNo">4273</span>    assertEquals(1, kvs.size());<a name="line.4273"></a>
-<span class="sourceLineNo">4274</span>    Cell kv = kvs.get(0);<a name="line.4274"></a>
-<span class="sourceLineNo">4275</span>    assertEquals(expected, Bytes.toLong(kv.getValueArray(), kv.getValueOffset()));<a name="line.4275"></a>
-<span class="sourceLineNo">4276</span>  }<a name="line.4276"></a>
-<span class="sourceLineNo">4277</span><a name="line.4277"></a>
-<span class="sourceLineNo">4278</span>  /**<a name="line.4278"></a>
-<span class="sourceLineNo">4279</span>   * TestCase for append<a name="line.4279"></a>
-<span class="sourceLineNo">4280</span>   */<a name="line.4280"></a>
-<span class="sourceLineNo">4281</span>  private static class Appender implements Runnable {<a name="line.4281"></a>
-<span class="sourceLineNo">4282</span>    private HRegion region;<a name="line.4282"></a>
-<span class="sourceLineNo">4283</span>    private final static byte[] appendRow = Bytes.toBytes("appendRow");<a name="line.4283"></a>
-<span class="sourceLineNo">4284</span>    private final static byte[] family = Bytes.toBytes("family");<a name="line.4284"></a>
-<span class="sourceLineNo">4285</span>    private final static byte[] qualifier = Bytes.toBytes("qualifier");<a name="line.4285"></a>
-<span class="sourceLineNo">4286</span>    private final static byte[] CHAR = Bytes.toBytes("a");<a name="line.4286"></a>
-<span class="sourceLineNo">4287</span>    private int appendCounter;<a name="line.4287"></a>
-<span class="sourceLineNo">4288</span><a name="line.4288"></a>
-<span class="sourceLineNo">4289</span>    public Appender(HRegion region, int appendCounter) {<a name="line.4289"></a>
-<span class="sourceLineNo">4290</span>      this.region = region;<a name="line.4290"></a>
-<span class="sourceLineNo">4291</span>      this.appendCounter = appendCounter;<a name="line.4291"></a>
-<span class="sourceLineNo">4292</span>    }<a name="line.4292"></a>
-<span class="sourceLineNo">4293</span><a name="line.4293"></a>
-<span class="sourceLineNo">4294</span>    @Override<a name="line.4294"></a>
-<span class="sourceLineNo">4295</span>    public void run() {<a name="line.4295"></a>
-<span class="sourceLineNo">4296</span>      int count = 0;<a name="line.4296"></a>
-<span class="sourceLineNo">4297</span>      while (count &lt; appendCounter) {<a name="line.4297"></a>
-<span class="sourceLineNo">4298</span>        Append app = new Append(appendRow);<a name="line.4298"></a>
-<span class="sourceLineNo">4299</span>        app.addColumn(family, qualifier, CHAR);<a name="line.4299"></a>
-<span class="sourceLineNo">4300</span>        count++;<a name="line.4300"></a>
-<span class="sourceLineNo">4301</span>        try {<a name="line.4301"></a>
-<span class="sourceLineNo">4302</span>          region.append(app);<a name="line.4302"></a>
-<span class="sourceLineNo">4303</span>        } catch (IOException e) {<a name="line.4303"></a>
-<span class="sourceLineNo">4304</span>          LOG.info("Count=" + count + ", max=" + appendCounter + ", " + e);<a name="line.4304"></a>
-<span class="sourceLineNo">4305</span>          break;<a name="line.4305"></a>
-<span class="sourceLineNo">4306</span>        }<a name="line.4306"></a>
-<span class="sourceLineNo">4307</span>      }<a name="line.4307"></a>
-<span class="sourceLineNo">4308</span>    }<a name="line.4308"></a>
-<span class="sourceLineNo">4309</span>  }<a name="line.4309"></a>
-<span class="sourceLineNo">4310</span><a name="line.4310"></a>
-<span class="sourceLineNo">4311</span>  /**<a name="line.4311"></a>
-<span class="sourceLineNo">4312</span>   * Test case to check append function with memstore flushing<a name="line.4312"></a>
-<span class="sourceLineNo">4313</span>   * @throws Exception<a name="line.4313"></a>
-<span class="sourceLineNo">4314</span>   */<a name="line.4314"></a>
-<span class="sourceLineNo">4315</span>  @Test<a name="line.4315"></a>
-<span class="sourceLineNo">4316</span>  public void testParallelAppendWithMemStoreFlush() throws Exception {<a name="line.4316"></a>
-<span class="sourceLineNo">4317</span>    byte[] family = Appender.family;<a name="line.4317"></a>
-<span class="sourceLineNo">4318</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.4318"></a>
-<span class="sourceLineNo">4319</span>    final HRegion region = this.region;<a name="line.4319"></a>
-<span class="sourceLineNo">4320</span>    final AtomicBoolean appendDone = new AtomicBoolean(false);<a name="line.4320"></a>
-<span class="sourceLineNo">4321</span>    Runnable flusher = new Runnable() {<a name="line.4321"></a>
-<span class="sourceLineNo">4322</span>      @Override<a name="line.4322"></a>
-<span class="sourceLineNo">4323</span>      public void run() {<a name="line.4323"></a>
-<span class="sourceLineNo">4324</span>        while (!appendDone.get()) {<a name="line.4324"></a>
-<span class="sourceLineNo">4325</span>          try {<a name="line.4325"></a>
-<span class="sourceLineNo">4326</span>            region.flush(true);<a name="line.4326"></a>
-<span class="sourceLineNo">4327</span>          } catch (Exception e) {<a name="line.4327"></a>
-<span class="sourceLineNo">4328</span>            e.printStackTrace();<a name="line.4328"></a>
-<span class="sourceLineNo">4329</span>          }<a name="line.4329"></a>
-<span class="sourceLineNo">4330</span>        }<a name="line.4330"></a>
-<span class="sourceLineNo">4331</span>      }<a name="line.4331"></a>
-<span class="sourceLineNo">4332</span>    };<a name="line.4332"></a>
-<span class="sourceLineNo">4333</span><a name="line.4333"></a>
-<span class="sourceLineNo">4334</span>    // After all append finished, the value will append to threadNum *<a name="line.4334"></a>
-<span class="sourceLineNo">4335</span>    // appendCounter Appender.CHAR<a name="line.4335"></a>
-<span class="sourceLineNo">4336</span>    int threadNum = 20;<a name="line.4336"></a>
-<span class="sourceLineNo">4337</span>    int appendCounter = 100;<a name="line.4337"></a>
-<span class="sourceLineNo">4338</span>    byte[] expected = new byte[threadNum * appendCounter];<a name="line.4338"></a>
-<span class="sourceLineNo">4339</span>    for (int i = 0; i &lt; threadNum * appendCounter; i++) {<a name="line.4339"></a>
-<span class="sourceLineNo">4340</span>      System.arraycopy(Appender.CHAR, 0, expected, i, 1);<a name="line.4340"></a>
-<span class="sourceLineNo">4341</span>    }<a name="line.4341"></a>
-<span class="sourceLineNo">4342</span>    Thread[] appenders = new Thread[threadNum];<a name="line.4342"></a>
-<span class="sourceLineNo">4343</span>    Thread flushThread = new Thread(flusher);<a name="line.4343"></a>
-<span class="sourceLineNo">4344</span>    for (int i = 0; i &lt; threadNum; i++) {<a name="line.4344"></a>
-<span class="sourceLineNo">4345</span>      appenders[i] = new Thread(new Appender(this.region, appendCounter));<a name="line.4345"></a>
-<span class="sourceLineNo">4346</span>      appenders[i].start();<a name="line.4346"></a>
-<span class="sourceLineNo">4347</span>    }<a name="line.4347"></a>
-<span class="sourceLineNo">4348</span>    flushThread.start();<a name="line.4348"></a>
-<span class="sourceLineNo">4349</span>    for (int i = 0; i &lt; threadNum; i++) {<a name="line.4349"></a>
-<span class="sourceLineNo">4350</span>      appenders[i].join();<a name="line.4350"></a>
+<span class="sourceLineNo">4185</span>    // Remove the .regioninfo file and verify is recreated on region open<a name="line.4185"></a>
+<span class="sourceLineNo">4186</span>    fs.delete(regionInfoFile, true);<a name="line.4186"></a>
+<span class="sourceLineNo">4187</span>    assertFalse(HRegionFileSystem.REGION_INFO_FILE + " should be removed from the region dir",<a name="line.4187"></a>
+<span class="sourceLineNo">4188</span>        fs.exists(regionInfoFile));<a name="line.4188"></a>
+<span class="sourceLineNo">4189</span><a name="line.4189"></a>
+<span class="sourceLineNo">4190</span>    region = HRegion.openHRegion(rootDir, hri, htd, null, CONF);<a name="line.4190"></a>
+<span class="sourceLineNo">4191</span>//    region = TEST_UTIL.openHRegion(hri, htd);<a name="line.4191"></a>
+<span class="sourceLineNo">4192</span>    assertEquals(regionDir, region.getRegionFileSystem().getRegionDir());<a name="line.4192"></a>
+<span class="sourceLineNo">4193</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.4193"></a>
+<span class="sourceLineNo">4194</span><a name="line.4194"></a>
+<span class="sourceLineNo">4195</span>    // Verify that the .regioninfo file is still there<a name="line.4195"></a>
+<span class="sourceLineNo">4196</span>    assertTrue(HRegionFileSystem.REGION_INFO_FILE + " should be present in the region dir",<a name="line.4196"></a>
+<span class="sourceLineNo">4197</span>        fs.exists(new Path(regionDir, HRegionFileSystem.REGION_INFO_FILE)));<a name="line.4197"></a>
+<span class="sourceLineNo">4198</span><a name="line.4198"></a>
+<span class="sourceLineNo">4199</span>    region = null;<a name="line.4199"></a>
+<span class="sourceLineNo">4200</span>  }<a name="line.4200"></a>
+<span class="sourceLineNo">4201</span><a name="line.4201"></a>
+<span class="sourceLineNo">4202</span>  /**<a name="line.4202"></a>
+<span class="sourceLineNo">4203</span>   * TestCase for increment<a name="line.4203"></a>
+<span class="sourceLineNo">4204</span>   */<a name="line.4204"></a>
+<span class="sourceLineNo">4205</span>  private static class Incrementer implements Runnable {<a name="line.4205"></a>
+<span class="sourceLineNo">4206</span>    private HRegion region;<a name="line.4206"></a>
+<span class="sourceLineNo">4207</span>    private final static byte[] incRow = Bytes.toBytes("incRow");<a name="line.4207"></a>
+<span class="sourceLineNo">4208</span>    private final static byte[] family = Bytes.toBytes("family");<a name="line.4208"></a>
+<span class="sourceLineNo">4209</span>    private final static byte[] qualifier = Bytes.toBytes("qualifier");<a name="line.4209"></a>
+<span class="sourceLineNo">4210</span>    private final static long ONE = 1L;<a name="line.4210"></a>
+<span class="sourceLineNo">4211</span>    private int incCounter;<a name="line.4211"></a>
+<span class="sourceLineNo">4212</span><a name="line.4212"></a>
+<span class="sourceLineNo">4213</span>    public Incrementer(HRegion region, int incCounter) {<a name="line.4213"></a>
+<span class="sourceLineNo">4214</span>      this.region = region;<a name="line.4214"></a>
+<span class="sourceLineNo">4215</span>      this.incCounter = incCounter;<a name="line.4215"></a>
+<span class="sourceLineNo">4216</span>    }<a name="line.4216"></a>
+<span class="sourceLineNo">4217</span><a name="line.4217"></a>
+<span class="sourceLineNo">4218</span>    @Override<a name="line.4218"></a>
+<span class="sourceLineNo">4219</span>    public void run() {<a name="line.4219"></a>
+<span class="sourceLineNo">4220</span>      int count = 0;<a name="line.4220"></a>
+<span class="sourceLineNo">4221</span>      while (count &lt; incCounter) {<a name="line.4221"></a>
+<span class="sourceLineNo">4222</span>        Increment inc = new Increment(incRow);<a name="line.4222"></a>
+<span class="sourceLineNo">4223</span>        inc.addColumn(family, qualifier, ONE);<a name="line.4223"></a>
+<span class="sourceLineNo">4224</span>        count++;<a name="line.4224"></a>
+<span class="sourceLineNo">4225</span>        try {<a name="line.4225"></a>
+<span class="sourceLineNo">4226</span>          region.increment(inc);<a name="line.4226"></a>
+<span class="sourceLineNo">4227</span>        } catch (IOException e) {<a name="line.4227"></a>
+<span class="sourceLineNo">4228</span>          LOG.info("Count=" + count + ", " + e);<a name="line.4228"></a>
+<span class="sourceLineNo">4229</span>          break;<a name="line.4229"></a>
+<span class="sourceLineNo">4230</span>        }<a name="line.4230"></a>
+<span class="sourceLineNo">4231</span>      }<a name="line.4231"></a>
+<span class="sourceLineNo">4232</span>    }<a name="line.4232"></a>
+<span class="sourceLineNo">4233</span>  }<a name="line.4233"></a>
+<span class="sourceLineNo">4234</span><a name="line.4234"></a>
+<span class="sourceLineNo">4235</span>  /**<a name="line.4235"></a>
+<span class="sourceLineNo">4236</span>   * Test case to check increment function with memstore flushing<a name="line.4236"></a>
+<span class="sourceLineNo">4237</span>   * @throws Exception<a name="line.4237"></a>
+<span class="sourceLineNo">4238</span>   */<a name="line.4238"></a>
+<span class="sourceLineNo">4239</span>  @Test<a name="line.4239"></a>
+<span class="sourceLineNo">4240</span>  public void testParallelIncrementWithMemStoreFlush() throws Exception {<a name="line.4240"></a>
+<span class="sourceLineNo">4241</span>    byte[] family = Incrementer.family;<a name="line.4241"></a>
+<span class="sourceLineNo">4242</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.4242"></a>
+<span class="sourceLineNo">4243</span>    final HRegion region = this.region;<a name="line.4243"></a>
+<span class="sourceLineNo">4244</span>    final AtomicBoolean incrementDone = new AtomicBoolean(false);<a name="line.4244"></a>
+<span class="sourceLineNo">4245</span>    Runnable flusher = new Runnable() {<a name="line.4245"></a>
+<span class="sourceLineNo">4246</span>      @Override<a name="line.4246"></a>
+<span class="sourceLineNo">4247</span>      public void run() {<a name="line.4247"></a>
+<span class="sourceLineNo">4248</span>        while (!incrementDone.get()) {<a name="line.4248"></a>
+<span class="sourceLineNo">4249</span>          try {<a name="line.4249"></a>
+<span class="sourceLineNo">4250</span>            region.flush(true);<a name="line.4250"></a>
+<span class="sourceLineNo">4251</span>          } catch (Exception e) {<a name="line.4251"></a>
+<span class="sourceLineNo">4252</span>            e.printStackTrace();<a name="line.4252"></a>
+<span class="sourceLineNo">4253</span>          }<a name="line.4253"></a>
+<span class="sourceLineNo">4254</span>        }<a name="line.4254"></a>
+<span class="sourceLineNo">4255</span>      }<a name="line.4255"></a>
+<span class="sourceLineNo">4256</span>    };<a name="line.4256"></a>
+<span class="sourceLineNo">4257</span><a name="line.4257"></a>
+<span class="sourceLineNo">4258</span>    // after all increment finished, the row will increment to 20*100 = 2000<a name="line.4258"></a>
+<span class="sourceLineNo">4259</span>    int threadNum = 20;<a name="line.4259"></a>
+<span class="sourceLineNo">4260</span>    int incCounter = 100;<a name="line.4260"></a>
+<span class="sourceLineNo">4261</span>    long expected = (long) threadNum * incCounter;<a name="line.4261"></a>
+<span class="sourceLineNo">4262</span>    Thread[] incrementers = new Thread[threadNum];<a name="line.4262"></a>
+<span class="sourceLineNo">4263</span>    Thread flushThread = new Thread(flusher);<a name="line.4263"></a>
+<span class="sourceLineNo">4264</span>    for (int i = 0; i &lt; threadNum; i++) {<a name="line.4264"></a>
+<span class="sourceLineNo">4265</span>      incrementers[i] = new Thread(new Incrementer(this.region, incCounter));<a name="line.4265"></a>
+<span class="sourceLineNo">4266</span>      incrementers[i].start();<a name="line.4266"></a>
+<span class="sourceLineNo">4267</span>    }<a name="line.4267"></a>
+<span class="sourceLineNo">4268</span>    flushThread.start();<a name="line.4268"></a>
+<span class="sourceLineNo">4269</span>    for (int i = 0; i &lt; threadNum; i++) {<a name="line.4269"></a>
+<span class="sourceLineNo">4270</span>      incrementers[i].join();<a name="line.4270"></a>
+<span class="sourceLineNo">4271</span>    }<a name="line.4271"></a>
+<span class="sourceLineNo">4272</span><a name="line.4272"></a>
+<span class="sourceLineNo">4273</span>    incrementDone.set(true);<a name="line.4273"></a>
+<span class="sourceLineNo">4274</span>    flushThread.join();<a name="line.4274"></a>
+<span class="sourceLineNo">4275</span><a name="line.4275"></a>
+<span class="sourceLineNo">4276</span>    Get get = new Get(Incrementer.incRow);<a name="line.4276"></a>
+<span class="sourceLineNo">4277</span>    get.addColumn(Incrementer.family, Incrementer.qualifier);<a name="line.4277"></a>
+<span class="sourceLineNo">4278</span>    get.readVersions(1);<a name="line.4278"></a>
+<span class="sourceLineNo">4279</span>    Result res = this.region.get(get);<a name="line.4279"></a>
+<span class="sourceLineNo">4280</span>    List&lt;Cell&gt; kvs = res.getColumnCells(Incrementer.family, Incrementer.qualifier);<a name="line.4280"></a>
+<span class="sourceLineNo">4281</span><a name="line.4281"></a>
+<span class="sourceLineNo">4282</span>    // we just got the latest version<a name="line.4282"></a>
+<span class="sourceLineNo">4283</span>    assertEquals(1, kvs.size());<a name="line.4283"></a>
+<span class="sourceLineNo">4284</span>    Cell kv = kvs.get(0);<a name="line.4284"></a>
+<span class="sourceLineNo">4285</span>    assertEquals(expected, Bytes.toLong(kv.getValueArray(), kv.getValueOffset()));<a name="line.4285"></a>
+<span class="sourceLineNo">4286</span>  }<a name="line.4286"></a>
+<span class="sourceLineNo">4287</span><a name="line.4287"></a>
+<span class="sourceLineNo">4288</span>  /**<a name="line.4288"></a>
+<span class="sourceLineNo">4289</span>   * TestCase for append<a name="line.4289"></a>
+<span class="sourceLineNo">4290</span>   */<a name="line.4290"></a>
+<span class="sourceLineNo">4291</span>  private static class Appender implements Runnable {<a name="line.4291"></a>
+<span class="sourceLineNo">4292</span>    private HRegion region;<a name="line.4292"></a>
+<span class="sourceLineNo">4293</span>    private final static byte[] appendRow = Bytes.toBytes("appendRow");<a name="line.4293"></a>
+<span class="sourceLineNo">4294</span>    private final static byte[] family = Bytes.toBytes("family");<a name="line.4294"></a>
+<span class="sourceLineNo">4295</span>    private final static byte[] qualifier = Bytes.toBytes("qualifier");<a name="line.4295"></a>
+<span class="sourceLineNo">4296</span>    private final static byte[] CHAR = Bytes.toBytes("a");<a name="line.4296"></a>
+<span class="sourceLineNo">4297</span>    private int appendCounter;<a name="line.4297"></a>
+<span class="sourceLineNo">4298</span><a name="line.4298"></a>
+<span class="sourceLineNo">4299</span>    public Appender(HRegion region, int appendCounter) {<a name="line.4299"></a>
+<span class="sourceLineNo">4300</span>      this.region = region;<a name="line.4300"></a>
+<span class="sourceLineNo">4301</span>      this.appendCounter = appendCounter;<a name="line.4301"></a>
+<span class="sourceLineNo">4302</span>    }<a name="line.4302"></a>
+<span class="sourceLineNo">4303</span><a name="line.4303"></a>
+<span class="sourceLineNo">4304</span>    @Override<a name="line.4304"></a>
+<span class="sourceLineNo">4305</span>    public void run() {<a name="line.4305"></a>
+<span class="sourceLineNo">4306</span>      int count = 0;<a name="line.4306"></a>
+<span class="sourceLineNo">4307</span>      while (count &lt; appendCounter) {<a name="line.4307"></a>
+<span class="sourceLineNo">4308</span>        Append app = new Append(appendRow);<a name="line.4308"></a>
+<span class="sourceLineNo">4309</span>        app.addColumn(family, qualifier, CHAR);<a name="line.4309"></a>
+<span class="sourceLineNo">4310</span>        count++;<a name="line.4310"></a>
+<span class="sourceLineNo">4311</span>        try {<a name="line.4311"></a>
+<span class="sourceLineNo">4312</span>          region.append(app);<a name="line.4312"></a>
+<span class="sourceLineNo">4313</span>        } catch (IOException e) {<a name="line.4313"></a>
+<span class="sourceLineNo">4314</span>          LOG.info("Count=" + count + ", max=" + appendCounter + ", " + e);<a name="line.4314"></a>
+<span class="sourceLineNo">4315</span>          break;<a name="line.4315"></a>
+<span class="sourceLineNo">4316</span>        }<a name="line.4316"></a>
+<span class="sourceLineNo">4317</span>      }<a name="line.4317"></a>
+<span class="sourceLineNo">4318</span>    }<a name="line.4318"></a>
+<span class="sourceLineNo">4319</span>  }<a name="line.4319"></a>
+<span class="sourceLineNo">4320</span><a name="line.4320"></a>
+<span class="sourceLineNo">4321</span>  /**<a name="line.4321"></a>
+<span class="sourceLineNo">4322</span>   * Test case to check append function with memstore flushing<a name="line.4322"></a>
+<span class="sourceLineNo">4323</span>   * @throws Exception<a name="line.4323"></a>
+<span class="sourceLineNo">4324</span>   */<a name="line.4324"></a>
+<span class="sourceLineNo">4325</span>  @Test<a name="line.4325"></a>
+<span class="sourceLineNo">4326</span>  public void testParallelAppendWithMemStoreFlush() throws Exception {<a name="line.4326"></a>
+<span class="sourceLineNo">4327</span>    byte[] family = Appender.family;<a name="line.4327"></a>
+<span class="sourceLineNo">4328</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.4328"></a>
+<span class="sourceLineNo">4329</span>    final HRegion region = this.region;<a name="line.4329"></a>
+<span class="sourceLineNo">4330</span>    final AtomicBoolean appendDone = new AtomicBoolean(false);<a name="line.4330"></a>
+<span class="sourceLineNo">4331</span>    Runnable flusher = new Runnable() {<a name="line.4331"></a>
+<span class="sourceLineNo">4332</span>      @Override<a name="line.4332"></a>
+<span class="sourceLineNo">4333</span>      public void run() {<a name="line.4333"></a>
+<span class="sourceLineNo">4334</span>        while (!appendDone.get()) {<a name="line.4334"></a>
+<span class="sourceLineNo">4335</span>          try {<a name="line.4335"></a>
+<span class="sourceLineNo">4336</span>            region.flush(true);<a name="line.4336"></a>
+<span class="sourceLineNo">4337</span>          } catch (Exception e) {<a name="line.4337"></a>
+<span class="sourceLineNo">4338</span>            e.printStackTrace();<a name="line.4338"></a>
+<span class="sourceLineNo">4339</span>          }<a name="line.4339"></a>
+<span class="sourceLineNo">4340</span>        }<a name="line.4340"></a>
+<span class="sourceLineNo">4341</span>      }<a name="line.4341"></a>
+<span class="sourceLineNo">4342</span>    };<a name="line.4342"></a>
+<span class="sourceLineNo">4343</span><a name="line.4343"></a>
+<span class="sourceLineNo">4344</span>    // After all append finished, the value will append to threadNum *<a name="line.4344"></a>
+<span class="sourceLineNo">4345</span>    // appendCounter Appender.CHAR<a name="line.4345"></a>
+<span class="sourceLineNo">4346</span>    int threadNum = 20;<a name="line.4346"></a>
+<span class="sourceLineNo">4347</span>    int appendCounter = 100;<a name="line.4347"></a>
+<span class="sourceLineNo">4348</span>    byte[] expected = new byte[threadNum * appendCounter];<a name="line.4348"></a>
+<span class="sourceLineNo">4349</span>    for (int i = 0; i &lt; threadNum * appendCounter; i++) {<a name="line.4349"></a>
+<span class="sourceLineNo">4350</span>      System.arraycopy(Appender.CHAR, 0, expected, i, 1);<a name="line.4350"></a>
 <span class="sourceLineNo">4351</span>    }<a name="line.4351"></a>
-<span class="sourceLineNo">4352</span><a name="line.4352"></a>
-<span class="sourceLineNo">4353</span>    appendDone.set(true);<a name="line.4353"></a>
-<span class="sourceLineNo">4354</span>    flushThread.join();<a name="line.4354"></a>
-<span class="sourceLineNo">4355</span><a name="line.4355"></a>
-<span class="sourceLineNo">4356</span>    Get get = new Get(Appender.appendRow);<a name="line.4356"></a>
-<span class="sourceLineNo">4357</span>    get.addColumn(Appender.family, Appender.qualifier);<a name="line.4357"></a>
-<span class="sourceLineNo">4358</span>    get.readVersions(1);<a name="line.4358"></a>
-<span class="sourceLineNo">4359</span>    Result res = this.region.get(get);<a name="line.4359"></a>
-<span class="sourceLineNo">4360</span>    List&lt;Cell&gt; kvs = res.getColumnCells(Appender.family, Appender.qualifier);<a name="line.4360"></a>
-<span class="sourceLineNo">4361</span><a name="line.4361"></a>
-<span class="sourceLineNo">4362</span>    // we just got the latest version<a name="line.4362"></a>
-<span class="sourceLineNo">4363</span>    assertEquals(1, kvs.size());<a name="line.4363"></a>
-<span class="sourceLineNo">4364</span>    Cell kv = kvs.get(0);<a name="line.4364"></a>
-<span class="sourceLineNo">4365</span>    byte[] appendResult = new byte[kv.getValueLength()];<a name="line.4365"></a>
-<span class="sourceLineNo">4366</span>    System.arraycopy(kv.getValueArray(), kv.getValueOffset(), appendResult, 0, kv.getValueLength());<a name="line.4366"></a>
-<span class="sourceLineNo">4367</span>    assertArrayEquals(expected, appendResult);<a name="line.4367"></a>
-<span class="sourceLineNo">4368</span>  }<a name="line.4368"></a>
-<span class="sourceLineNo">4369</span><a name="line.4369"></a>
-<span class="sourceLineNo">4370</span>  /**<a name="line.4370"></a>
-<span class="sourceLineNo">4371</span>   * Test case to check put function with memstore flushing for same row, same ts<a name="line.4371"></a>
-<span class="sourceLineNo">4372</span>   * @throws Exception<a name="line.4372"></a>
-<span class="sourceLineNo">4373</span>   */<a name="line.4373"></a>
-<span class="sourceLineNo">4374</span>  @Test<a name="line.4374"></a>
-<span class="sourceLineNo">4375</span>  public void testPutWithMemStoreFlush() throws Exception {<a name="line.4375"></a>
-<span class="sourceLineNo">4376</span>    byte[] family = Bytes.toBytes("family");<a name="line.4376"></a>
-<span class="sourceLineNo">4377</span>    byte[] qualifier = Bytes.toBytes("qualifier");<a name="line.4377"></a>
-<span class="sourceLineNo">4378</span>    byte[] row = Bytes.toBytes("putRow");<a name="line.4378"></a>
-<span class="sourceLineNo">4379</span>    byte[] value = null;<a name="line.4379"></a>
-<span class="sourceLineNo">4380</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.4380"></a>
-<span class="sourceLineNo">4381</span>    Put put = null;<a name="line.4381"></a>
-<span class="sourceLineNo">4382</span>    Get get = null;<a name="line.4382"></a>
-<span class="sourceLineNo">4383</span>    List&lt;Cell&gt; kvs = null;<a name="line.4383"></a>
-<span class="sourceLineNo">4384</span>    Result res = null;<a name="line.4384"></a>
-<span class="sourceLineNo">4385</span><a name="line.4385"></a>
-<span class="sourceLineNo">4386</span>    put = new Put(row);<a name="line.4386"></a>
-<span class="sourceLineNo">4387</span>    value = Bytes.toBytes("value0");<a name="line.4387"></a>
-<span class="sourceLineNo">4388</span>    put.addColumn(family, qualifier, 1234567L, value);<a name="line.4388"></a>
-<span class="sourceLineNo">4389</span>    region.put(put);<a name="line.4389"></a>
-<span class="sourceLineNo">4390</span>    get = new Get(row);<a name="line.4390"></a>
-<span class="sourceLineNo">4391</span>    get.addColumn(family, qualifier);<a name="line.4391"></a>
-<span class="sourceLineNo">4392</span>    get.readAllVersions();<a name="line.4392"></a>
-<span class="sourceLineNo">4393</span>    res = this.region.get(get);<a name="line.4393"></a>
-<span class="sourceLineNo">4394</span>    kvs = res.getColumnCells(family, qualifier);<a name="line.4394"></a>
-<span class="sourceLineNo">4395</span>    assertEquals(1, kvs.size());<a name="line.4395"></a>
-<span class="sourceLineNo">4396</span>    assertArrayEquals(Bytes.toBytes("value0"), CellUtil.cloneValue(kvs.get(0)));<a name="line.4396"></a>
-<span class="sourceLineNo">4397</span><a name="line.4397"></a>
-<span class="sourceLineNo">4398</span>    region.flush(true);<a name="line.4398"></a>
-<span class="sourceLineNo">4399</span>    get = new Get(row);<a name="line.4399"></a>
-<span class="sourceLineNo">4400</span>    get.addColumn(family, qualifier);<a name="line.4400"></a>
-<span class="sourceLineNo">4401</span>    get.readAllVersions();<a name="line.4401"></a>
-<span class="sourceLineNo">4402</span>    res = this.region.get(get);<a name="line.4402"></a>
-<span class="sourceLineNo">4403</span>    kvs = res.getColumnCells(family, qualifier);<a name="line.4403"></a>
-<span class="sourceLineNo">4404</span>    assertEquals(1, kvs.size());<a name="line.4404"></a>
-<span class="sourceLineNo">4405</span>    assertArrayEquals(Bytes.toBytes("value0"), CellUtil.cloneValue(kvs.get(0)));<a name="line.4405"></a>
-<span class="sourceLineNo">4406</span><a name="line.4406"></a>
-<span class="sourceLineNo">4407</span>    put = new Put(row);<a name="line.4407"></a>
-<span class="sourceLineNo">4408</span>    value = Bytes.toBytes("value1");<a name="line.4408"></a>
-<span class="sourceLineNo">4409</span>    put.addColumn(family, qualifier, 1234567L, value);<a name="line.4409"></a>
-<span class="sourceLineNo">4410</span>    region.put(put);<a name="line.4410"></a>
-<span class="sourceLineNo">4411</span>    get = new Get(row);<a name="line.4411"></a>
-<span class="sourceLineNo">4412</span>    get.addColumn(family, qualifier);<a name="line.4412"></a>
-<span class="sourceLineNo">4413</span>    get.readAllVersions();<a name="line.4413"></a>
-<span class="sourceLineNo">4414</span>    res = this.region.get(get);<a name="line.4414"></a>
-<span class="sourceLineNo">4415</span>    kvs = res.getColumnCells(family, qualifier);<a name="line.4415"></a>
-<span class="sourceLineNo">4416</span>    assertEquals(1, kvs.size());<a name="line.4416"></a>
-<span class="sourceLineNo">4417</span>    assertArrayEquals(Bytes.toBytes("value1"), CellUtil.cloneValue(kvs.get(0)));<a name="line.4417"></a>
-<span class="sourceLineNo">4418</span><a name="line.4418"></a>
-<span class="sourceLineNo">4419</span>    region.flush(true);<a name="line.4419"></a>
-<span class="sourceLineNo">4420</span>    get = new Get(row);<a name="line.4420"></a>
-<span class="sourceLineNo">4421</span>    get.addColumn(family, qualifier);<a name="line.4421"></a>
-<span class="sourceLineNo">4422</span>    get.readAllVersions();<a name="line.4422"></a>
-<span class="sourceLineNo">4423</span>    res = this.region.get(get);<a name="line.4423"></a>
-<span class="sourceLineNo">4424</span>    kvs = res.getColumnCells(family, qualifier);<a name="line.4424"></a>
-<span class="sourceLineNo">4425</span>    assertEquals(1, kvs.size());<a name="line.4425"></a>
-<span class="sourceLineNo">4426</span>    assertArrayEquals(Bytes.toBytes("value1"), CellUtil.cloneValue(kvs.get(0)));<a name="line.4426"></a>
-<span class="sourceLineNo">4427</span>  }<a name="line.4427"></a>
+<span class="sourceLineNo">4352</span>    Thread[] appenders = new Thread[threadNum];<a name="line.4352"></a>
+<span class="sourceLineNo">4353</span>    Thread flushThread = new Thread(flusher);<a name="line.4353"></a>
+<span class="sourceLineNo">4354</span>    for (int i = 0; i &lt; threadNum; i++) {<a name="line.4354"></a>
+<span class="sourceLineNo">4355</span>      appenders[i] = new Thread(new Appender(this.region, appendCounter));<a name="line.4355"></a>
+<span class="sourceLineNo">4356</span>      appenders[i].start();<a name="line.4356"></a>
+<span class="sourceLineNo">4357</span>    }<a name="line.4357"></a>
+<span class="sourceLineNo">4358</span>    flushThread.start();<a name="line.4358"></a>
+<span class="sourceLineNo">4359</span>    for (int i = 0; i &lt; threadNum; i++) {<a name="line.4359"></a>
+<span class="sourceLineNo">4360</span>      appenders[i].join();<a name="line.4360"></a>
+<span class="sourceLineNo">4361</span>    }<a name="line.4361"></a>
+<span class="sourceLineNo">4362</span><a name="line.4362"></a>
+<span class="sourceLineNo">4363</span>    appendDone.set(true);<a name="line.4363"></a>
+<span class="sourceLineNo">4364</span>    flushThread.join();<a name="line.4364"></a>
+<span class="sourceLineNo">4365</span><a name="line.4365"></a>
+<span class="sourceLineNo">4366</span>    Get get = new Get(Appender.appendRow);<a name="line.4366"></a>
+<span class="sourceLineNo">4367</span>    get.addColumn(Appender.family, Appender.qualifier);<a name="line.4367"></a>
+<span class="sourceLineNo">4368</span>    get.readVersions(1);<a name="line.4368"></a>
+<span class="sourceLineNo">4369</span>    Result res = this.region.get(get);<a name="line.4369"></a>
+<span class="sourceLineNo">4370</span>    List&lt;Cell&gt; kvs = res.getColumnCells(Appender.family, Appender.qualifier);<a name="line.4370"></a>
+<span class="sourceLineNo">4371</span><a name="line.4371"></a>
+<span class="sourceLineNo">4372</span>    // we just got the latest version<a name="line.4372"></a>
+<span class="sourceLineNo">4373</span>    assertEquals(1, kvs.size());<a name="line.4373"></a>
+<span class="sourceLineNo">4374</span>    Cell kv = kvs.get(0);<a name="line.4374"></a>
+<span class="sourceLineNo">4375</span>    byte[] appendResult = new byte[kv.getValueLength()];<a name="line.4375"></a>
+<span class="sourceLineNo">4376</span>    System.arraycopy(kv.getValueArray(), kv.getValueOffset(), appendResult, 0, kv.getValueLength());<a name="line.4376"></a>
+<span class="sourceLineNo">4377</span>    assertArrayEquals(expected, appendResult);<a name="line.4377"></a>
+<span class="sourceLineNo">4378</span>  }<a name="line.4378"></a>
+<span class="sourceLineNo">4379</span><a name="line.4379"></a>
+<span class="sourceLineNo">4380</span>  /**<a name="line.4380"></a>
+<span class="sourceLineNo">4381</span>   * Test case to check put function with memstore flushing for same row, same ts<a name="line.4381"></a>
+<span class="sourceLineNo">4382</span>   * @throws Exception<a name="line.4382"></a>
+<span class="sourceLineNo">4383</span>   */<a name="line.4383"></a>
+<span class="sourceLineNo">4384</span>  @Test<a name="line.4384"></a>
+<span class="sourceLineNo">4385</span>  public void testPutWithMemStoreFlush() throws Exception {<a name="line.4385"></a>
+<span class="sourceLineNo">4386</span>    byte[] family = Bytes.toBytes("family");<a name="line.4386"></a>
+<span class="sourceLineNo">4387</span>    byte[] qualifier = Bytes.toBytes("qualifier");<a name="line.4387"></a>
+<span class="sourceLineNo">4388</span>    byte[] row = Bytes.toBytes("putRow");<a name="line.4388"></a>
+<span class="sourceLineNo">4389</span>    byte[] value = null;<a name="line.4389"></a>
+<span class="sourceLineNo">4390</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.4390"></a>
+<span class="sourceLineNo">4391</span>    Put put = null;<a name="line.4391"></a>
+<span class="sourceLineNo">4392</span>    Get get = null;<a name="line.4392"></a>
+<span class="sourceLineNo">4393</span>    List&lt;Cell&gt; kvs = null;<a name="line.4393"></a>
+<span class="sourceLineNo">4394</span>    Result res = null;<a name="line.4394"></a>
+<span class="sourceLineNo">4395</span><a name="line.4395"></a>
+<span class="sourceLineNo">4396</span>    put = new Put(row);<a name="line.4396"></a>
+<span class="sourceLineNo">4397</span>    value = Bytes.toBytes("value0");<a name="line.4397"></a>
+<span class="sourceLineNo">4398</span>    put.addColumn(family, qualifier, 1234567L, value);<a name="line.4398"></a>
+<span class="sourceLineNo">4399</span>    region.put(put);<a name="line.4399"></a>
+<span class="sourceLineNo">4400</span>    get = new Get(row);<a name="line.4400"></a>
+<span class="sourceLineNo">4401</span>    get.addColumn(family, qualifier);<a name="line.4401"></a>
+<span class="sourceLineNo">4402</span>    get.readAllVersions();<a name="line.4402"></a>
+<span class="sourceLineNo">4403</span>    res = this.region.get(get);<a name="line.4403"></a>
+<span class="sourceLineNo">4404</span>    kvs = res.getColumnCells(family, qualifier);<a name="line.4404"></a>
+<span class="sourceLineNo">4405</span>    assertEquals(1, kvs.size());<a name="line.4405"></a>
+<span class="sourceLineNo">4406</span>    assertArrayEquals(Bytes.toBytes("value0"), CellUtil.cloneValue(kvs.get(0)));<a name="line.4406"></a>
+<span class="sourceLineNo">4407</span><a name="line.4407"></a>
+<span class="sourceLineNo">4408</span>    region.flush(true);<a name="line.4408"></a>
+<span class="sourceLineNo">4409</span>    get = new Get(row);<a name="line.4409"></a>
+<span class="sourceLineNo">4410</span>    get.addColumn(family, qualifier);<a name="line.4410"></a>
+<span class="sourceLineNo">4411</span>    get.readAllVersions();<a name="line.4411"></a>
+<span class="sourceLineNo">4412</span>    res = this.region.get(get);<a name="line.4412"></a>
+<span class="sourceLineNo">4413</span>    kvs = res.getColumnCells(family, qualifier);<a name="line.4413"></a>
+<span class="sourceLineNo">4414</span>    assertEquals(1, kvs.size());<a name="line.4414"></a>
+<span class="sourceLineNo">4415</span>    assertArrayEquals(Bytes.toBytes("value0"), CellUtil.cloneValue(kvs.get(0)));<a name="line.4415"></a>
+<span class="sourceLineNo">4416</span><a name="line.4416"></a>
+<span class="sourceLineNo">4417</span>    put = new Put(row);<a name="line.4417"></a>
+<span class="sourceLineNo">4418</span>    value = Bytes.toBytes("value1");<a name="line.4418"></a>
+<span class="sourceLineNo">4419</span>    put.addColumn(family, qualifier, 1234567L, value);<a name="line.4419"></a>
+<span class="sourceLineNo">4420</span>    region.put(put);<a name="line.4420"></a>
+<span class="sourceLineNo">4421</span>    get = new Get(row);<a name="line.4421"></a>
+<span class="sourceLineNo">4422</span>    get.addColumn(family, qualifier);<a name="line.4422"></a>
+<span class="sourceLineNo">4423</span>    get.readAllVersions();<a name="line.4423"></a>
+<span class="sourceLineNo">4424</span>    res = this.region.get(get);<a name="line.4424"></a>
+<span class="sourceLineNo">4425</span>    kvs = res.getColumnCells(family, qualifier);<a name="line.4425"></a>
+<span class="sourceLineNo">4426</span>    assertEquals(1, kvs.size());<a name="line.4426"></a>
+<span class="sourceLineNo">4427</span>    assertArrayEquals(Bytes.toBytes("value1"), CellUtil.cloneValue(kvs.get(0)));<a name="line.4427"></a>
 <span class="sourceLineNo">4428</span><a name="line.4428"></a>
-<span class="sourceLineNo">4429</span>  @Test<a name="line.4429"></a>
-<span class="sourceLineNo">4430</span>  public void testDurability() throws Exception {<a name="line.4430"></a>
-<span class="sourceLineNo">4431</span>    // there are 5 x 5 cases:<a name="line.4431"></a>
-<span class="sourceLineNo">4432</span>    // table durability(SYNC,FSYNC,ASYC,SKIP,USE_DEFAULT) x mutation<a name="line.4432"></a>
-<span class="sourceLineNo">4433</span>    // durability(SYNC,FSYNC,ASYC,SKIP,USE_DEFAULT)<a name="line.4433"></a>
-<span class="sourceLineNo">4434</span><a name="line.4434"></a>
-<span class="sourceLineNo">4435</span>    // expected cases for append and sync wal<a name="line.4435"></a>
-<span class="sourceLineNo">4436</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4436"></a>
-<span class="sourceLineNo">4437</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4437"></a>
-<span class="sourceLineNo">4438</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.USE_DEFAULT, 0, true, true, false);<a name="line.4438"></a>
-<span class="sourceLineNo">4439</span><a name="line.4439"></a>
-<span class="sourceLineNo">4440</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4440"></a>
-<span class="sourceLineNo">4441</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4441"></a>
-<span class="sourceLineNo">4442</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.USE_DEFAULT, 0, true, true, false);<a name="line.4442"></a>
-<span class="sourceLineNo">4443</span><a name="line.4443"></a>
-<span class="sourceLineNo">4444</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4444"></a>
-<span class="sourceLineNo">4445</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4445"></a>
-<span class="sourceLineNo">4446</span><a name="line.4446"></a>
-<span class="sourceLineNo">4447</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4447"></a>
-<span class="sourceLineNo">4448</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4448"></a>
+<span class="sourceLineNo">4429</span>    region.flush(true);<a name="line.4429"></a>
+<span class="sourceLineNo">4430</span>    get = new Get(row);<a name="line.4430"></a>
+<span class="sourceLineNo">4431</span>    get.addColumn(family, qualifier);<a name="line.4431"></a>
+<span class="sourceLineNo">4432</span>    get.readAllVersions();<a name="line.4432"></a>
+<span class="sourceLineNo">4433</span>    res = this.region.get(get);<a name="line.4433"></a>
+<span class="sourceLineNo">4434</span>    kvs = res.getColumnCells(family, qualifier);<a name="line.4434"></a>
+<span class="sourceLineNo">4435</span>    assertEquals(1, kvs.size());<a name="line.4435"></a>
+<span class="sourceLineNo">4436</span>    assertArrayEquals(Bytes.toBytes("value1"), CellUtil.cloneValue(kvs.get(0)));<a name="line.4436"></a>
+<span class="sourceLineNo">4437</span>  }<a name="line.4437"></a>
+<span class="sourceLineNo">4438</span><a name="line.4438"></a>
+<span class="sourceLineNo">4439</span>  @Test<a name="line.4439"></a>
+<span class="sourceLineNo">4440</span>  public void testDurability() throws Exception {<a name="line.4440"></a>
+<span class="sourceLineNo">4441</span>    // there are 5 x 5 cases:<a name="line.4441"></a>
+<span class="sourceLineNo">4442</span>    // table durability(SYNC,FSYNC,ASYC,SKIP,USE_DEFAULT) x mutation<a name="line.4442"></a>
+<span class="sourceLineNo">4443</span>    // durability(SYNC,FSYNC,ASYC,SKIP,USE_DEFAULT)<a name="line.4443"></a>
+<span class="sourceLineNo">4444</span><a name="line.4444"></a>
+<span class="sourceLineNo">4445</span>    // expected cases for append and sync wal<a name="line.4445"></a>
+<span class="sourceLineNo">4446</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4446"></a>
+<span class="sourceLineNo">4447</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4447"></a>
+<span class="sourceLineNo">4448</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.USE_DEFAULT, 0, true, true, false);<a name="line.4448"></a>
 <span class="sourceLineNo">4449</span><a name="line.4449"></a>
-<span class="sourceLineNo">4450</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4450"></a>
-<span class="sourceLineNo">4451</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4451"></a>
-<span class="sourceLineNo">4452</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.USE_DEFAULT, 0, true, true, false);<a name="line.4452"></a>
+<span class="sourceLineNo">4450</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4450"></a>
+<span class="sourceLineNo">4451</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4451"></a>
+<span class="sourceLineNo">4452</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.USE_DEFAULT, 0, true, true, false);<a name="line.4452"></a>
 <span class="sourceLineNo">4453</span><a name="line.4453"></a>
-<span class="sourceLineNo">4454</span>    // expected cases for async wal<a name="line.4454"></a>
-<span class="sourceLineNo">4455</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4455"></a>
-<span class="sourceLineNo">4456</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4456"></a>
-<span class="sourceLineNo">4457</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4457"></a>
-<span class="sourceLineNo">4458</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4458"></a>
-<span class="sourceLineNo">4459</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4459"></a>
-<span class="sourceLineNo">4460</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.USE_DEFAULT, 0, true, false, false);<a name="line.4460"></a>
-<span class="sourceLineNo">4461</span><a name="line.4461"></a>
-<span class="sourceLineNo">4462</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4462"></a>
-<span class="sourceLineNo">4463</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4463"></a>
-<span class="sourceLineNo">4464</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4464"></a>
-<span class="sourceLineNo">4465</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4465"></a>
-<span class="sourceLineNo">4466</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4466"></a>
-<span class="sourceLineNo">4467</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.USE_DEFAULT, 5000, true, false, true);<a name="line.4467"></a>
-<span class="sourceLineNo">4468</span><a name="line.4468"></a>
-<span class="sourceLineNo">4469</span>    // expect skip wal cases<a name="line.4469"></a>
-<span class="sourceLineNo">4470</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4470"></a>
-<span class="sourceLineNo">4471</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4471"></a>
-<span class="sourceLineNo">4472</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4472"></a>
-<span class="sourceLineNo">4473</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4473"></a>
-<span class="sourceLineNo">4474</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4474"></a>
-<span class="sourceLineNo">4475</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.USE_DEFAULT, 0, false, false, false);<a name="line.4475"></a>
-<span class="sourceLineNo">4476</span><a name="line.4476"></a>
-<span class="sourceLineNo">4477</span>  }<a name="line.4477"></a>
+<span class="sourceLineNo">4454</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4454"></a>
+<span class="sourceLineNo">4455</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4455"></a>
+<span class="sourceLineNo">4456</span><a name="line.4456"></a>
+<span class="sourceLineNo">4457</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4457"></a>
+<span class="sourceLineNo">4458</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4458"></a>
+<span class="sourceLineNo">4459</span><a name="line.4459"></a>
+<span class="sourceLineNo">4460</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4460"></a>
+<span class="sourceLineNo">4461</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4461"></a>
+<span class="sourceLineNo">4462</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.USE_DEFAULT, 0, true, true, false);<a name="line.4462"></a>
+<span class="sourceLineNo">4463</span><a name="line.4463"></a>
+<span class="sourceLineNo">4464</span>    // expected cases for async wal<a name="line.4464"></a>
+<span class="sourceLineNo">4465</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4465"></a>
+<span class="sourceLineNo">4466</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4466"></a>
+<span class="sourceLineNo">4467</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4467"></a>
+<span class="sourceLineNo">4468</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4468"></a>
+<span class="sourceLineNo">4469</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4469"></a>
+<span class="sourceLineNo">4470</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.USE_DEFAULT, 0, true, false, false);<a name="line.4470"></a>
+<span class="sourceLineNo">4471</span><a name="line.4471"></a>
+<span class="sourceLineNo">4472</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4472"></a>
+<span class="sourceLineNo">4473</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4473"></a>
+<span class="sourceLineNo">4474</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4474"></a>
+<span class="sourceLineNo">4475</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4475"></a>
+<span class="sourceLineNo">4476</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4476"></a>
+<span class="sourceLineNo">4477</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.USE_DEFAULT, 5000, true, false, true);<a name="line.4477"></a>
 <span class="sourceLineNo">4478</span><a name="line.4478"></a>
-<span class="sourceLineNo">4479</span>  private void durabilityTest(String method, Durability tableDurability,<a name="line.4479"></a>
-<span class="sourceLineNo">4480</span>      Durability mutationDurability, long timeout, boolean expectAppend, final boolean expectSync,<a name="line.4480"></a>
-<span class="sourceLineNo">4481</span>      final boolean expectSyncFromLogSyncer) throws Exception {<a name="line.4481"></a>
-<span class="sourceLineNo">4482</span>    Configuration conf = HBaseConfiguration.create(CONF);<a name="line.4482"></a>
-<span class="sourceLineNo">4483</span>    method = method + "_" + tableDurability.name() + "_" + mutationDurability.name();<a name="line.4483"></a>
-<span class="sourceLineNo">4484</span>    byte[] family = Bytes.toBytes("family");<a name="line.4484"></a>
-<span class="sourceLineNo">4485</span>    Path logDir = new Path(new Path(dir + method), "log");<a name="line.4485"></a>
-<span class="sourceLineNo">4486</span>    final Configuration walConf = new Configuration(conf);<a name="line.4486"></a>
-<span class="sourceLineNo">4487</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.4487"></a>
-<span class="sourceLineNo">4488</span>    // XXX: The spied AsyncFSWAL can not work properly because of a Mockito defect that can not<a name="line.4488"></a>
-<span class="sourceLineNo">4489</span>    // deal with classes which have a field of an inner class. See discussions in HBASE-15536.<a name="line.4489"></a>
-<span class="sourceLineNo">4490</span>    walConf.set(WALFactory.WAL_PROVIDER, "filesystem");<a name="line.4490"></a>
-<span class="sourceLineNo">4491</span>    final WALFactory wals = new WALFactory(walConf, TEST_UTIL.getRandomUUID().toString());<a name="line.4491"></a>
-<span class="sourceLineNo">4492</span>    final WAL wal = spy(wals.getWAL(RegionInfoBuilder.newBuilder(tableName).build()));<a name="line.4492"></a>
-<span class="sourceLineNo">4493</span>    this.region = initHRegion(tableName, HConstants.EMPTY_START_ROW,<a name="line.4493"></a>
-<span class="sourceLineNo">4494</span>        HConstants.EMPTY_END_ROW, false, tableDurability, wal,<a name="line.4494"></a>
-<span class="sourceLineNo">4495</span>        new byte[][] { family });<a name="line.4495"></a>
-<span class="sourceLineNo">4496</span><a name="line.4496"></a>
-<span class="sourceLineNo">4497</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.4497"></a>
-<span class="sourceLineNo">4498</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.4498"></a>
-<span class="sourceLineNo">4499</span>    put.setDurability(mutationDurability);<a name="line.4499"></a>
-<span class="sourceLineNo">4500</span>    region.put(put);<a name="line.4500"></a>
-<span class="sourceLineNo">4501</span><a name="line.4501"></a>
-<span class="sourceLineNo">4502</span>    //verify append called or not<a name="line.4502"></a>
-<span class="sourceLineNo">4503</span>    verify(wal, expectAppend ? times(1) : never())<a name="line.4503"></a>
-<span class="sourceLineNo">4504</span>      .append((HRegionInfo)any(), (WALKeyImpl)any(),<a name="line.4504"></a>
-<span class="sourceLineNo">4505</span>          (WALEdit)any(), Mockito.anyBoolean());<a name="line.4505"></a>
+<span class="sourceLineNo">4479</span>    // expect skip wal cases<a name="line.4479"></a>
+<span class="sourceLineNo">4480</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4480"></a>
+<span class="sourceLineNo">4481</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4481"></a>
+<span class="sourceLineNo">4482</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4482"></a>
+<span class="sourceLineNo">4483</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4483"></a>
+<span class="sourceLineNo">4484</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4484"></a>
+<span class="sourceLineNo">4485</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.USE_DEFAULT, 0, false, false, false);<a name="line.4485"></a>
+<span class="sourceLineNo">4486</span><a name="line.4486"></a>
+<span class="sourceLineNo">4487</span>  }<a name="line.4487"></a>
+<span class="sourceLineNo">4488</span><a name="line.4488"></a>
+<span class="sourceLineNo">4489</span>  private void durabilityTest(String method, Durability tableDurability,<a name="line.4489"></a>
+<span class="sourceLineNo">4490</span>      Durability mutationDurability, long timeout, boolean expectAppend, final boolean expectSync,<a name="line.4490"></a>
+<span class="sourceLineNo">4491</span>      final boolean expectSyncFromLogSyncer) throws Exception {<a name="line.4491"></a>
+<span class="sourceLineNo">4492</span>    Configuration conf = HBaseConfiguration.create(CONF);<a name="line.4492"></a>
+<span class="sourceLineNo">4493</span>    method = method + "_" + tableDurability.name() + "_" + mutationDurability.name();<a name="line.4493"></a>
+<span class="sourceLineNo">4494</span>    byte[] family = Bytes.toBytes("family");<a name="line.4494"></a>
+<span class="sourceLineNo">4495</span>    Path logDir = new Path(new Path(dir + method), "log");<a name="line.4495"></a>
+<span class="sourceLineNo">4496</span>    final Configuration walConf = new Configuration(conf);<a name="line.4496"></a>
+<span class="sourceLineNo">4497</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.4497"></a>
+<span class="sourceLineNo">4498</span>    // XXX: The spied AsyncFSWAL can not work properly because of a Mockito defect that can not<a name="line.4498"></a>
+<span class="sourceLineNo">4499</span>    // deal with classes which have a field of an inner class. See discussions in HBASE-15536.<a name="line.4499"></a>
+<span class="sourceLineNo">4500</span>    walConf.set(WALFactory.WAL_PROVIDER, "filesystem");<a name="line.4500"></a>
+<span class="sourceLineNo">4501</span>    final WALFactory wals = new WALFactory(walConf, TEST_UTIL.getRandomUUID().toString());<a name="line.4501"></a>
+<span class="sourceLineNo">4502</span>    final WAL wal = spy(wals.getWAL(RegionInfoBuilder.newBuilder(tableName).build()));<a name="line.4502"></a>
+<span class="sourceLineNo">4503</span>    this.region = initHRegion(tableName, HConstants.EMPTY_START_ROW,<a name="line.4503"></a>
+<span class="sourceLineNo">4504</span>        HConstants.EMPTY_END_ROW, false, tableDurability, wal,<a name="line.4504"></a>
+<span class="sourceLineNo">4505</span>        new byte[][] { family });<a name="line.4505"></a>
 <span class="sourceLineNo">4506</span><a name="line.4506"></a>
-<span class="sourceLineNo">4507</span>    // verify sync called or not<a name="line.4507"></a>
-<span class="sourceLineNo">4508</span>    if (expectSync || expectSyncFromLogSyncer) {<a name="line.4508"></a>
-<span class="sourceLineNo">4509</span>      TEST_UTIL.waitFor(timeout, new Waiter.Predicate&lt;Exception&gt;() {<a name="line.4509"></a>
-<span class="sourceLineNo">4510</span>        @Override<a name="line.4510"></a>
-<span class="sourceLineNo">4511</span>        public boolean evaluate() throws Exception {<a name="line.4511"></a>
-<span class="sourceLineNo">4512</span>          try {<a name="line.4512"></a>
-<span class="sourceLineNo">4513</span>            if (expectSync) {<a name="line.4513"></a>
-<span class="sourceLineNo">4514</span>              verify(wal, times(1)).sync(anyLong()); // Hregion calls this one<a name="line.4514"></a>
-<span class="sourceLineNo">4515</span>            } else if (expectSyncFromLogSyncer) {<a name="line.4515"></a>
-<span class="sourceLineNo">4516</span>              verify(wal, times(1)).sync(); // wal syncer calls this one<a name="line.4516"></a>
-<span class="sourceLineNo">4517</span>            }<a name="line.4517"></a>
-<span class="sourceLineNo">4518</span>          } catch (Throwable ignore) {<a name="line.4518"></a>
-<span class="sourceLineNo">4519</span>          }<a name="line.4519"></a>
-<span class="sourceLineNo">4520</span>          return true;<a name="line.4520"></a>
-<span class="sourceLineNo">4521</span>        }<a name="line.4521"></a>
-<span class="sourceLineNo">4522</span>      });<a name="line.4522"></a>
-<span class="sourceLineNo">4523</span>    } else {<a name="line.4523"></a>
-<span class="sourceLineNo">4524</span>      //verify(wal, never()).sync(anyLong());<a name="line.4524"></a>
-<span class="sourceLineNo">4525</span>      verify(wal, never()).sync();<a name="line.4525"></a>
-<span class="sourceLineNo">4526</span>    }<a name="line.4526"></a>
-<span class="sourceLineNo">4527</span><a name="line.4527"></a>
-<span class="sourceLineNo">4528</span>    HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.4528"></a>
-<span class="sourceLineNo">4529</span>    wals.close();<a name="line.4529"></a>
-<span class="sourceLineNo">4530</span>    this.region = null;<a name="line.4530"></a>
-<span class="sourceLineNo">4531</span>  }<a name="line.4531"></a>
-<span class="sourceLineNo">4532</span><a name="line.4532"></a>
-<span class="sourceLineNo">4533</span>  @Test<a name="line.4533"></a>
-<span class="sourceLineNo">4534</span>  public void testRegionReplicaSecondary() throws IOException {<a name="line.4534"></a>
-<span class="sourceLineNo">4535</span>    // create a primary region, load some data and flush<a name="line.4535"></a>
-<span class="sourceLineNo">4536</span>    // create a secondary region, and do a get against that<a name="line.4536"></a>
-<span class="sourceLineNo">4537</span>    Path rootDir = new Path(dir + name.getMethodName());<a name="line.4537"></a>
-<span class="sourceLineNo">4538</span>    FSUtils.setRootDir(TEST_UTIL.getConfiguration(), rootDir);<a name="line.4538"></a>
-<span class="sourceLineNo">4539</span><a name="line.4539"></a>
-<span class="sourceLineNo">4540</span>    byte[][] families = new byte[][] {<a name="line.4540"></a>
-<span class="sourceLineNo">4541</span>        Bytes.toBytes("cf1"), Bytes.toBytes("cf2"), Bytes.toBytes("cf3")<a name="line.4541"></a>
-<span class="sourceLineNo">4542</span>    };<a name="line.4542"></a>
-<span class="sourceLineNo">4543</span>    byte[] cq = Bytes.toBytes("cq");<a name="line.4543"></a>
-<span class="sourceLineNo">4544</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.4544"></a>
-<span class="sourceLineNo">4545</span>    for (byte[] family : families) {<a name="line.4545"></a>
-<span class="sourceLineNo">4546</span>      htd.addFamily(new HColumnDescriptor(family));<a name="line.4546"></a>
-<span class="sourceLineNo">4547</span>    }<a name="line.4547"></a>
-<span class="sourceLineNo">4548</span><a name="line.4548"></a>
-<span class="sourceLineNo">4549</span>    long time = System.currentTimeMillis();<a name="line.4549"></a>
-<span class="sourceLineNo">4550</span>    HRegionInfo primaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4550"></a>
-<span class="sourceLineNo">4551</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4551"></a>
-<span class="sourceLineNo">4552</span>      false, time, 0);<a name="line.4552"></a>
-<span class="sourceLineNo">4553</span>    HRegionInfo secondaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4553"></a>
-<span class="sourceLineNo">4554</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4554"></a>
-<span class="sourceLineNo">4555</span>      false, time, 1);<a name="line.4555"></a>
-<span class="sourceLineNo">4556</span><a name="line.4556"></a>
-<span class="sourceLineNo">4557</span>    HRegion primaryRegion = null, secondaryRegion = null;<a name="line.4557"></a>
+<span class="sourceLineNo">4507</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.4507"></a>
+<span class="sourceLineNo">4508</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.4508"></a>
+<span class="sourceLineNo">4509</span>    put.setDurability(mutationDurability);<a name="line.4509"></a>
+<span class="sourceLineNo">4510</span>    region.put(put);<a name="line.4510"></a>
+<span class="sourceLineNo">4511</span><a name="line.4511"></a>
+<span class="sourceLineNo">4512</span>    //verify append called or not<a name="line.4512"></a>
+<span class="sourceLineNo">4513</span>    verify(wal, expectAppend ? times(1) : never())<a name="line.4513"></a>
+<span class="sourceLineNo">4514</span>      .append((HRegionInfo)any(), (WALKeyImpl)any(),<a name="line.4514"></a>
+<span class="sourceLineNo">4515</span>          (WALEdit)any(), Mockito.anyBoolean());<a name="line.4515"></a>
+<span class="sourceLineNo">4516</span><a name="line.4516"></a>
+<span class="sourceLineNo">4517</span>    // verify sync called or not<a name="line.4517"></a>
+<span class="sourceLineNo">4518</span>    if (expectSync || expectSyncFromLogSyncer) {<a name="line.4518"></a>
+<span class="sourceLineNo">4519</span>      TEST_UTIL.waitFor(timeout, new Waiter.Predicate&lt;Exception&gt;() {<a name="line.4519"></a>
+<span class="sourceLineNo">4520</span>        @Override<a name="line.4520"></a>
+<span class="sourceLineNo">4521</span>        public boolean evaluate() throws Exception {<a name="line.4521"></a>
+<span class="sourceLineNo">4522</span>          try {<a name="line.4522"></a>
+<span class="sourceLineNo">4523</span>            if (expectSync) {<a name="line.4523"></a>
+<span class="sourceLineNo">4524</span>              verify(wal, times(1)).sync(anyLong()); // Hregion calls this one<a name="line.4524"></a>
+<span class="sourceLineNo">4525</span>            } else if (expectSyncFromLogSyncer) {<a name="line.4525"></a>
+<span class="sourceLineNo">4526</span>              verify(wal, times(1)).sync(); // wal syncer calls this one<a name="line.4526"></a>
+<span class="sourceLineNo">4527</span>            }<a name="line.4527"></a>
+<span class="sourceLineNo">4528</span>          } catch (Throwable ignore) {<a name="line.4528"></a>
+<span class="sourceLineNo">4529</span>          }<a name="line.4529"></a>
+<span class="sourceLineNo">4530</span>          return true;<a name="line.4530"></a>
+<span class="sourceLineNo">4531</span>        }<a name="line.4531"></a>
+<span class="sourceLineNo">4532</span>      });<a name="line.4532"></a>
+<span class="sourceLineNo">4533</span>    } else {<a name="line.4533"></a>
+<span class="sourceLineNo">4534</span>      //verify(wal, never()).sync(anyLong());<a name="line.4534"></a>
+<span class="sourceLineNo">4535</span>      verify(wal, never()).sync();<a name="line.4535"></a>
+<span class="sourceLineNo">4536</span>    }<a name="line.4536"></a>
+<span class="sourceLineNo">4537</span><a name="line.4537"></a>
+<span class="sourceLineNo">4538</span>    HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.4538"></a>
+<span class="sourceLineNo">4539</span>    wals.close();<a name="line.4539"></a>
+<span class="sourceLineNo">4540</span>    this.region = null;<a name="line.4540"></a>
+<span class="sourceLineNo">4541</span>  }<a name="line.4541"></a>
+<span class="sourceLineNo">4542</span><a name="line.4542"></a>
+<span class="sourceLineNo">4543</span>  @Test<a name="line.4543"></a>
+<span class="sourceLineNo">4544</span>  public void testRegionReplicaSecondary() throws IOException {<a name="line.4544"></a>
+<span class="sourceLineNo">4545</span>    // create a primary region, load some data and flush<a name="line.4545"></a>
+<span class="sourceLineNo">4546</span>    // create a secondary region, and do a get against that<a name="line.4546"></a>
+<span class="sourceLineNo">4547</span>    Path rootDir = new Path(dir + name.getMethodName());<a name="line.4547"></a>
+<span class="sourceLineNo">4548</span>    FSUtils.setRootDir(TEST_UTIL.getConfiguration(), rootDir);<a name="line.4548"></a>
+<span class="sourceLineNo">4549</span><a name="line.4549"></a>
+<span class="sourceLineNo">4550</span>    byte[][] families = new byte[][] {<a name="line.4550"></a>
+<span class="sourceLineNo">4551</span>        Bytes.toBytes("cf1"), Bytes.toBytes("cf2"), Bytes.toBytes("cf3")<a name="line.4551"></a>
+<span class="sourceLineNo">4552</span>    };<a name="line.4552"></a>
+<span class="sourceLineNo">4553</span>    byte[] cq = Bytes.toBytes("cq");<a name="line.4553"></a>
+<span class="sourceLineNo">4554</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.4554"></a>
+<span class="sourceLineNo">4555</span>    for (byte[] family : families) {<a name="line.4555"></a>
+<span class="sourceLineNo">4556</span>      htd.addFamily(new HColumnDescriptor(family));<a name="line.4556"></a>
+<span class="sourceLineNo">4557</span>    }<a name="line.4557"></a>
 <span class="sourceLineNo">4558</span><a name="line.4558"></a>
-<span class="sourceLineNo">4559</span>    try {<a name="line.4559"></a>
-<span class="sourceLineNo">4560</span>      primaryRegion = HBaseTestingUtility.createRegionAndWAL(primaryHri,<a name="line.4560"></a>
-<span class="sourceLineNo">4561</span>          rootDir, TEST_UTIL.getConfiguration(), htd);<a name="line.4561"></a>
-<span class="sourceLineNo">4562</span><a name="line.4562"></a>
-<span class="sourceLineNo">4563</span>      // load some data<a name="line.4563"></a>
-<span class="sourceLineNo">4564</span>      putData(primaryRegion, 0, 1000, cq, families);<a name="line.4564"></a>
-<span class="sourceLineNo">4565</span><a name="line.4565"></a>
-<span class="sourceLineNo">4566</span>      // flush region<a name="line.4566"></a>
-<span class="sourceLineNo">4567</span>      primaryRegion.flush(true);<a name="line.4567"></a>
+<span class="sourceLineNo">4559</span>    long time = System.currentTimeMillis();<a name="line.4559"></a>
+<span class="sourceLineNo">4560</span>    HRegionInfo primaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4560"></a>
+<span class="sourceLineNo">4561</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4561"></a>
+<span class="sourceLineNo">4562</span>      false, time, 0);<a name="line.4562"></a>
+<span class="sourceLineNo">4563</span>    HRegionInfo secondaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4563"></a>
+<span class="sourceLineNo">4564</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4564"></a>
+<span class="sourceLineNo">4565</span>      false, time, 1);<a name="line.4565"></a>
+<span class="sourceLineNo">4566</span><a name="line.4566"></a>
+<span class="sourceLineNo">4567</span>    HRegion primaryRegion = null, secondaryRegion = null;<a name="line.4567"></a>
 <span class="sourceLineNo">4568</span><a name="line.4568"></a>
-<span class="sourceLineNo">4569</span>      // open secondary region<a name="line.4569"></a>
-<span class="sourceLineNo">4570</span>      secondaryRegion = HRegion.openHRegion(rootDir, secondaryHri, htd, null, CONF);<a name="line.4570"></a>
-<span class="sourceLineNo">4571</span><a name="line.4571"></a>
-<span class="sourceLineNo">4572</span>      verifyData(secondaryRegion, 0, 1000, cq, families);<a name="line.4572"></a>
-<span class="sourceLineNo">4573</span>    } finally {<a name="line.4573"></a>
-<span class="sourceLineNo">4574</span>      if (primaryRegion != null) {<a name="line.4574"></a>
-<span class="sourceLineNo">4575</span>        HBaseTestingUtility.closeRegionAndWAL(primaryRegion);<a name="line.4575"></a>
-<span class="sourceLineNo">4576</span>      }<a name="line.4576"></a>
-<span class="sourceLineNo">4577</span>      if (secondaryRegion != null) {<a name="line.4577"></a>
-<span class="sourceLineNo">4578</span>        HBaseTestingUtility.closeRegionAndWAL(secondaryRegion);<a name="line.4578"></a>
-<span class="sourceLineNo">4579</span>      }<a name="line.4579"></a>
-<span class="sourceLineNo">4580</span>    }<a name="line.4580"></a>
-<span class="sourceLineNo">4581</span>  }<a name="line.4581"></a>
-<span class="sourceLineNo">4582</span><a name="line.4582"></a>
-<span class="sourceLineNo">4583</span>  @Test<a name="line.4583"></a>
-<span class="sourceLineNo">4584</span>  public void testRegionReplicaSecondaryIsReadOnly() throws IOException {<a name="line.4584"></a>
-<span class="sourceLineNo">4585</span>    // create a primary region, load some data and flush<a name="line.4585"></a>
-<span class="sourceLineNo">4586</span>    // create a secondary region, and do a put against that<a name="line.4586"></a>
-<span class="sourceLineNo">4587</span>    Path rootDir = new Path(dir + name.getMethodName());<a name="line.4587"></a>
-<span class="sourceLineNo">4588</span>    FSUtils.setRootDir(TEST_UTIL.getConfiguration(), rootDir);<a name="line.4588"></a>
-<span class="sourceLineNo">4589</span><a name="line.4589"></a>
-<span class="sourceLineNo">4590</span>    byte[][] families = new byte[][] {<a name="line.4590"></a>
-<span class="sourceLineNo">4591</span>        Bytes.toBytes("cf1"), Bytes.toBytes("cf2"), Bytes.toBytes("cf3")<a name="line.4591"></a>
-<span class="sourceLineNo">4592</span>    };<a name="line.4592"></a>
-<span class="sourceLineNo">4593</span>    byte[] cq = Bytes.toBytes("cq");<a name="line.4593"></a>
-<span class="sourceLineNo">4594</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.4594"></a>
-<span class="sourceLineNo">4595</span>    for (byte[] family : families) {<a name="line.4595"></a>
-<span class="sourceLineNo">4596</span>      htd.addFamily(new HColumnDescriptor(family));<a name="line.4596"></a>
-<span class="sourceLineNo">4597</span>    }<a name="line.4597"></a>
-<span class="sourceLineNo">4598</span><a name="line.4598"></a>
-<span class="sourceLineNo">4599</span>    long time = System.currentTimeMillis();<a name="line.4599"></a>
-<span class="sourceLineNo">4600</span>    HRegionInfo primaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4600"></a>
-<span class="sourceLineNo">4601</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4601"></a>
-<span class="sourceLineNo">4602</span>      false, time, 0);<a name="line.4602"></a>
-<span class="sourceLineNo">4603</span>    HRegionInfo secondaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4603"></a>
-<span class="sourceLineNo">4604</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4604"></a>
-<span class="sourceLineNo">4605</span>      false, time, 1);<a name="line.4605"></a>
-<span class="sourceLineNo">4606</span><a name="line.4606"></a>
-<span class="sourceLineNo">4607</span>    HRegion primaryRegion = null, secondaryRegion = null;<a name="line.4607"></a>
+<span class="sourceLineNo">4569</span>    try {<a name="line.4569"></a>
+<span class="sourceLineNo">4570</span>      primaryRegion = HBaseTestingUtility.createRegionAndWAL(primaryHri,<a name="line.4570"></a>
+<span class="sourceLineNo">4571</span>          rootDir, TEST_UTIL.getConfiguration(), htd);<a name="line.4571"></a>
+<span class="sourceLineNo">4572</span><a name="line.4572"></a>
+<span class="sourceLineNo">4573</span>      // load some data<a name="line.4573"></a>
+<span class="sourceLineNo">4574</span>      putData(primaryRegion, 0, 1000, cq, families);<a name="line.4574"></a>
+<span class="sourceLineNo">4575</span><a name="line.4575"></a>
+<span class="sourceLineNo">4576</span>      // flush region<a name="line.4576"></a>
+<span class="sourceLineNo">4577</span>      primaryRegion.flush(true);<a name="line.4577"></a>
+<span class="sourceLineNo">4578</span><a name="line.4578"></a>
+<span class="sourceLineNo">4579</span>      // open secondary region<a name="line.4579"></a>
+<span class="sourceLineNo">4580</span>      secondaryRegion = HRegion.openHRegion(rootDir, secondaryHri, htd, null, CONF);<a name="line.4580"></a>
+<span class="sourceLineNo">4581</span><a name="line.4581"></a>
+<span class="sourceLineNo">4582</span>      verifyData(secondaryRegion, 0, 1000, cq, families);<a name="line.4582"></a>
+<span class="sourceLineNo">4583</span>    } finally {<a name="line.4583"></a>
+<span class="sourceLineNo">4584</span>      if (primaryRegion != null) {<a name="line.4584"></a>
+<span class="sourceLineNo">4585</span>        HBaseTestingUtility.closeRegionAndWAL(primaryRegion);<a name="line.4585"></a>
+<span class="sourceLineNo">4586</span>      }<a name="line.4586"></a>
+<span class="sourceLineNo">4587</span>      if (secondaryRegion != null) {<a name="line.4587"></a>
+<span class="sourceLineNo">4588</span>        HBaseTestingUtility.closeRegionAndWAL(secondaryRegion);<a name="line.4588"></a>
+<span class="sourceLineNo">4589</span>      }<a name="line.4589"></a>
+<span class="sourceLineNo">4590</span>    }<a name="line.4590"></a>
+<span class="sourceLineNo">4591</span>  }<a name="line.4591"></a>
+<span class="sourceLineNo">4592</span><a name="line.4592"></a>
+<span class="sourceLineNo">4593</span>  @Test<a name="line.4593"></a>
+<span class="sourceLineNo">4594</span>  public void testRegionReplicaSecondaryIsReadOnly() throws IOException {<a name="line.4594"></a>
+<span class="sourceLineNo">4595</span>    // create a primary region, load some data and flush<a name="line.4595"></a>
+<span class="sourceLineNo">4596</span>    // create a secondary region, and do a put against that<a name="line.4596"></a>
+<span class="sourceLineNo">4597</span>    Path rootDir = new Path(dir + name.getMethodName());<a name="line.4597"></a>
+<span class="sourceLineNo">4598</span>    FSUtils.setRootDir(TEST_UTIL.getConfiguration(), rootDir);<a name="line.4598"></a>
+<span class="sourceLineNo">4599</span><a name="line.4599"></a>
+<span class="sourceLineNo">4600</span>    byte[][] families = new byte[][] {<a name="line.4600"></a>
+<span class="sourceLineNo">4601</span>        Bytes.toBytes("cf1"), Bytes.toBytes("cf2"), Bytes.toBytes("cf3")<a name="line.4601"></a>
+<span class="sourceLineNo">4602</span>    };<a name="line.4602"></a>
+<span class="sourceLineNo">4603</span>    byte[] cq = Bytes.toBytes("cq");<a name="line.4603"></a>
+<span class="sourceLineNo">4604</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.4604"></a>
+<span class="sourceLineNo">4605</span>    for (byte[] family : families) {<a name="line.4605"></a>
+<span class="sourceLineNo">4606</span>      htd.addFamily(new HColumnDescriptor(family));<a name="line.4606"></a>
+<span class="sourceLineNo">4607</span>    }<a name="line.4607"></a>
 <span class="sourceLineNo">4608</span><a name="line.4608"></a>
-<span class="sourceLineNo">4609</span>    try {<a name="line.4609"></a>
-<span class="sourceLineNo">4610</span>      primaryRegion = HBaseTestingUtility.createRegionAndWAL(primaryHri,<a name="line.4610"></a>
-<span class="sourceLineNo">4611</span>          rootDir, TEST_UTIL.getConfiguration(), htd);<a name="line.4611"></a>
-<span class="sourceLineNo">4612</span><a name="line.4612"></a>
-<span class="sourceLineNo">4613</span>      // load some data<a name="line.4613"></a>
-<span class="sourceLineNo">4614</span>      putData(primaryRegion, 0, 1000, cq, families);<a name="line.4614"></a>
-<span class="sourceLineNo">4615</span><a name="line.4615"></a>
-<span class="sourceLineNo">4616</span>      // flush region<a name="line.4616"></a>
-<span class="sourceLineNo">4617</span>      primaryRegion.flush(true);<a name="line.4617"></a>
+<span class="sourceLineNo">4609</span>    long time = System.currentTimeMillis();<a name="line.4609"></a>
+<span class="sourceLineNo">4610</span>    HRegionInfo primaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4610"></a>
+<span class="sourceLineNo">4611</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4611"></a>
+<span class="sourceLineNo">4612</span>      false, time, 0);<a name="line.4612"></a>
+<span class="sourceLineNo">4613</span>    HRegionInfo secondaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4613"></a>
+<span class="sourceLineNo">4614</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4614"></a>
+<span class="sourceLineNo">4615</span>      false, time, 1);<a name="line.4615"></a>
+<span class="sourceLineNo">4616</span><a name="line.4616"></a>
+<span class="sourceLineNo">4617</span>    HRegion primaryRegion = null, secondaryRegion = null;<a name="line.4617"></a>
 <span class="sourceLineNo">4618</span><a name="line.4618"></a>
-<span class="sourceLineNo">4619</span>      // open secondary region<a name="line.4619"></a>
-<span class="sourceLineNo">4620</span>      secondaryRegion = HRegion.openHRegion(rootDir, secondaryHri, htd, null, CONF);<a name="line.4620"></a>
-<span class="sourceLineNo">4621</span><a name="line.4621"></a>
-<span class="sourceLineNo">4622</span>      try {<a name="line.4622"></a>
-<span class="sourceLineNo">4623</span>        putData(secondaryRegion, 0, 1000, cq, families);<a name="line.4623"></a>
-<span class="sourceLineNo">4624</span>        fail("Should have thrown exception");<a name="line.4624"></a>
-<span class="sourceLineNo">4625</span>      } catch (IOException ex) {<a name="line.4625"></a>
-<span class="sourceLineNo">4626</span>        // expected<a name="line.4626"></a>
-<span class="sourceLineNo">4627</span>      }<a name="line.4627"></a>
-<span class="sourceLineNo">4628</span>    } finally {<a name="line.4628"></a>
-<span class="sourceLineNo">4629</span>      if (primaryRegion != null) {<a name="line.4629"></a>
-<span class="sourceLineNo">4630</span>        HBaseTestingUtility.closeRegionAndWAL(primaryRegion);<a name="line.4630"></a>
-<span class="sourceLineNo">4631</span>      }<a name="line.4631"></a>
-<span class="sourceLineNo">4632</span>      if (secondaryRegion != null) {<a name="line.4632"></a>
-<span class="sourceLineNo">4633</span>        HBaseTestingUtility.closeRegionAndWAL(secondaryRegion);<a name="line.4633"></a>
-<span class="sourceLineNo">4634</span>      }<a name="line.4634"></a>
-<span class="sourceLineNo">4635</span>    }<a name="line.4635"></a>
-<span class="sourceLineNo">4636</span>  }<a name="line.4636"></a>
-<span class="sourceLineNo">4637</span><a name="line.4637"></a>
-<span class="sourceLineNo">4638</span>  static WALFactory createWALFactory(Configuration conf, Path rootDir) throws IOException {<a name="line.4638"></a>
-<span class="sourceLineNo">4639</span>    Configuration confForWAL = new Configuration(conf);<a name="line.4639"></a>
-<span class="sourceLineNo">4640</span>    confForWAL.set(HConstants.HBASE_DIR, rootDir.toString());<a name="line.4640"></a>
-<span class="sourceLineNo">4641</span>    return new WALFactory(confForWAL, "hregion-" + RandomStringUtils.randomNumeric(8));<a name="line.4641"></a>
-<span class="sourceLineNo">4642</span>  }<a name="line.4642"></a>
-<span class="sourceLineNo">4643</span><a name="line.4643"></a>
-<span class="sourceLineNo">4644</span>  @Test<a name="line.4644"></a>
-<span class="sourceLineNo">4645</span>  public void testCompactionFromPrimary() throws IOException {<a name="line.4645"></a>
-<span class="sourceLineNo">4646</span>    Path rootDir = new Path(dir + name.getMethodName());<a name="line.4646"></a>
-<span class="sourceLineNo">4647</span>    FSUtils.setRootDir(TEST_UTIL.getConfiguration(), rootDir);<a name="line.4647"></a>
-<span class="sourceLineNo">4648</span><a name="line.4648"></a>
-<span class="sourceLineNo">4649</span>    byte[][] families = new byte[][] {<a name="line.4649"></a>
-<span class="sourceLineNo">4650</span>        Bytes.toBytes("cf1"), Bytes.toBytes("cf2"), Bytes.toBytes("cf3")<a name="line.4650"></a>
-<span class="sourceLineNo">4651</span>    };<a name="line.4651"></a>
-<span class="sourceLineNo">4652</span>    byte[] cq = Bytes.toBytes("cq");<a name="line.4652"></a>
-<span class="sourceLineNo">4653</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.4653"></a>
-<span class="sourceLineNo">4654</span>    for (byte[] family : families) {<a name="line.4654"></a>
-<span class="sourceLineNo">4655</span>      htd.addFamily(new HColumnDescriptor(family));<a name="line.4655"></a>
-<span class="sourceLineNo">4656</span>    }<a name="line.4656"></a>
-<span class="sourceLineNo">4657</span><a name="line.4657"></a>
-<span class="sourceLineNo">4658</span>    long time = System.currentTimeMillis();<a name="line.4658"></a>
-<span class="sourceLineNo">4659</span>    HRegionInfo primaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4659"></a>
-<span class="sourceLineNo">4660</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4660"></a>
-<span class="sourceLineNo">4661</span>      false, time, 0);<a name="line.4661"></a>
-<span class="sourceLineNo">4662</span>    HRegionInfo secondaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4662"></a>
-<span class="sourceLineNo">4663</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4663"></a>
-<span class="sourceLineNo">4664</span>      false, time, 1);<a name="line.4664"></a>
-<span class="sourceLineNo">4665</span><a name="line.4665"></a>
-<span class="sourceLineNo">4666</span>    HRegion primaryRegion = null, secondaryRegion = null;<a name="line.4666"></a>
+<span class="sourceLineNo">4619</span>    try {<a name="line.4619"></a>
+<span class="sourceLineNo">4620</span>      primaryRegion = HBaseTestingUtility.createRegionAndWAL(primaryHri,<a name="line.4620"></a>
+<span class="sourceLineNo">4621</span>          rootDir, TEST_UTIL.getConfiguration(), htd);<a name="line.4621"></a>
+<span class="sourceLineNo">4622</span><a name="line.4622"></a>
+<span class="sourceLineNo">4623</span>      // load some data<a name="line.4623"></a>
+<span class="sourceLineNo">4624</span>      putData(primaryRegion, 0, 1000, cq, families);<a name="line.4624"></a>
+<span class="sourceLineNo">4625</span><a name="line.4625"></a>
+<span class="sourceLineNo">4626</span>      // flush region<a name="line.4626"></a>
+<span class="sourceLineNo">4627</span>      primaryRegion.flush(true);<a name="line.4627"></a>
+<span class="sourceLineNo">4628</span><a name="line.4628"></a>
+<span class="sourceLineNo">4629</span>      // open secondary region<a name="line.4629"></a>
+<span class="sourceLineNo">4630</span>      secondaryRegion = HRegion.openHRegion(rootDir, secondaryHri, htd, null, CONF);<a name="line.4630"></a>
+<span class="sourceLineNo">4631</span><a name="line.4631"></a>
+<span class="sourceLineNo">4632</span>      try {<a name="line.4632"></a>
+<span class="sourceLineNo">4633</span>        putData(secondaryRegion, 0, 1000, cq, families);<a name="line.4633"></a>
+<span class="sourceLineNo">4634</span>        fail("Should have thrown exception");<a name="line.4634"></a>
+<span class="sourceLineNo">4635</span>      } catch (IOException ex) {<a name="line.4635"></a>
+<span class="sourceLineNo">4636</span>        // expected<a name="line.4636"></a>
+<span class="sourceLineNo">4637</span>      }<a name="line.4637"></a>
+<span class="sourceLineNo">4638</span>    } finally {<a name="line.4638"></a>
+<span class="sourceLineNo">4639</span>      if (primaryRegion != null) {<a name="line.4639"></a>
+<span class="sourceLineNo">4640</span>        HBaseTestingUtility.closeRegionAndWAL(primaryRegion);<a name="line.4640"></a>
+<span class="sourceLineNo">4641</span>      }<a name="line.4641"></a>
+<span class="sourceLineNo">4642</span>      if (secondaryRegion != null) {<a name="line.4642"></a>
+<span class="sourceLineNo">4643</span>        HBaseTestingUtility.closeRegionAndWAL(secondaryRegion);<a name="line.4643"></a>
+<span class="sourceLineNo">4644</span>      }<a name="line.4644"></a>
+<span class="sourceLineNo">4645</span>    }<a name="line.4645"></a>
+<span class="sourceLineNo">4646</span>  }<a name="line.4646"></a>
+<span class="sourceLineNo">4647</span><a name="line.4647"></a>
+<span class="sourceLineNo">4648</span>  static WALFactory createWALFactory(Configuration conf, Path rootDir) throws IOException {<a name="line.4648"></a>
+<span class="sourceLineNo">4649</span>    Configuration confForWAL = new Configuration(conf);<a name="line.4649"></a>
+<span class="sourceLineNo">4650</span>    confForWAL.set(HConstants.HBASE_DIR, rootDir.toString());<a name="line.4650"></a>
+<span class="sourceLineNo">4651</span>    return new WALFactory(confForWAL, "hregion-" + RandomStringUtils.randomNumeric(8));<a name="line.4651"></a>
+<span class="sourceLineNo">4652</span>  }<a name="line.4652"></a>
+<span class="sourceLineNo">4653</span><a name="line.4653"></a>
+<span class="sourceLineNo">4654</span>  @Test<a name="line.4654"></a>
+<span class="sourceLineNo">4655</span>  public void testCompactionFromPrimary() throws IOException {<a name="line.4655"></a>
+<span class="sourceLineNo">4656</span>    Path rootDir = new Path(dir + name.getMethodName());<a name="line.4656"></a>
+<span class="sourceLineNo">4657</span>    FSUtils.setRootDir(TEST_UTIL.getConfiguration(), rootDir);<a name="line.4657"></a>
+<span class="sourceLineNo">4658</span><a name="line.4658"></a>
+<span class="sourceLineNo">4659</span>    byte[][] families = new byte[][] {<a name="line.4659"></a>
+<span class="sourceLineNo">4660</span>        Bytes.toBytes("cf1"), Bytes.toBytes("cf2"), Bytes.toBytes("cf3")<a name="line.4660"></a>
+<span class="sourceLineNo">4661</span>    };<a name="line.4661"></a>
+<span class="sourceLineNo">4662</span>    byte[] cq = Bytes.toBytes("cq");<a name="line.4662"></a>
+<span class="sourceLineNo">4663</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.4663"></a>
+<span class="sourceLineNo">4664</span>    for (byte[] family : families) {<a name="line.4664"></a>
+<span class="sourceLineNo">4665</span>      htd.addFamily(new HColumnDescriptor(family));<a name="line.4665"></a>
+<span class="sourceLineNo">4666</span>    }<a name="line.4666"></a>
 <span class="sourceLineNo">4667</span><a name="line.4667"></a>
-<span class="sourceLineNo">4668</span>    try {<a name="line.4668"></a>
-<span class="sourceLineNo">4669</span>      primaryRegion = HBaseTestingUtility.createRegionAndWAL(primaryHri,<a name="line.4669"></a>
-<span class="sourceLineNo">4670</span>          rootDir, TEST_UTIL.getConfiguration(), htd);<a name="line.4670"></a>
-<span class="sourceLineNo">4671</span><a name="line.4671"></a>
-<span class="sourceLineNo">4672</span>      // load some data<a name="line.4672"></a>
-<span class="sourceLineNo">4673</span>      putData(primaryRegion, 0, 1000, cq, families);<a name="line.4673"></a>
-<span class="sourceLineNo">4674</span><a name="line.4674"></a>
-<span class="sourceLineNo">4675</span>      // flush region<a name="line.4675"></a>
-<span class="sourceLineNo">4676</span>      primaryRegion.flush(true);<a name="line.4676"></a>
+<span class="sourceLineNo">4668</span>    long time = System.currentTimeMillis();<a name="line.4668"></a>
+<span class="sourceLineNo">4669</span>    HRegionInfo primaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4669"></a>
+<span class="sourceLineNo">4670</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4670"></a>
+<span class="sourceLineNo">4671</span>      false, time, 0);<a name="line.4671"></a>
+<span class="sourceLineNo">4672</span>    HRegionInfo secondaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4672"></a>
+<span class="sourceLineNo">4673</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4673"></a>
+<span class="sourceLineNo">4674</span>      false, time, 1);<a name="line.4674"></a>
+<span class="sourceLineNo">4675</span><a name="line.4675"></a>
+<span class="sourceLineNo">4676</span>    HRegion primaryRegion = null, secondaryRegion = null;<a name="line.4676"></a>
 <span class="sourceLineNo">4677</span><a name="line.4677"></a>
-<span class="sourceLineNo">4678</span>      // open secondary region<a name="line.4678"></a>
-<span class="sourceLineNo">4679</span>      secondaryRegion = HRegion.openHRegion(rootDir, secondaryHri, htd, null, CONF);<a name="line.4679"></a>
-<span class="sourceLineNo">4680</span><a name="line.4680"></a>
-<span class="sourceLineNo">4681</span>      // move the file of the primary region to the archive, simulating a compaction<a name="line.4681"></a>
-<span class="sourceLineNo">4682</span>      Collection&lt;HStoreFile&gt; storeFiles = primaryRegion.getStore(families[0]).getStorefiles();<a name="line.4682"></a>
-<span class="sourceLineNo">4683</span>      primaryRegion.getRegionFileSystem().removeStoreFiles(Bytes.toString(families[0]), storeFiles);<a name="line.4683"></a>
-<span class="sourceLineNo">4684</span>      Collection&lt;StoreFileInfo&gt; storeFileInfos = primaryRegion.getRegionFileSystem()<a name="line.4684"></a>
-<span class="sourceLineNo">4685</span>          .getStoreFiles(families[0]);<a name="line.4685"></a>
-<span class="sourceLineNo">4686</span>      Assert.assertTrue(storeFileInfos == null || storeFileInfos.isEmpty());<a name="line.4686"></a>
+<span class="sourceLineNo">4678</span>    try {<a name="line.4678"></a>
+<span class="sourceLineNo">4679</span>      primaryRegion = HBaseTestingUtility.createRegionAndWAL(primaryHri,<a name="line.4679"></a>
+<span class="sourceLineNo">4680</span>          rootDir, TEST_UTIL.getConfiguration(), htd);<a name="line.4680"></a>
+<span class="sourceLineNo">4681</span><a name="line.4681"></a>
+<span class="sourceLineNo">4682</span>      // load some data<a name="line.4682"></a>
+<span class="sourceLineNo">4683</span>      putData(primaryRegion, 0, 1000, cq, families);<a name="line.4683"></a>
+<span class="sourceLineNo">4684</span><a name="line.4684"></a>
+<span class="sourceLineNo">4685</span>      // flush region<a name="line.4685"></a>
+<span class="sourceLineNo">4686</span>      primaryRegion.flush(true);<a name="line.4686"></a>
 <span class="sourceLineNo">4687</span><a name="line.4687"></a>
-<span class="sourceLineNo">4688</span>      verifyData(secondaryRegion, 0, 1000, cq, families);<a name="line.4688"></a>
-<span class="sourceLineNo">4689</span>    } finally {<a name="line.4689"></a>
-<span class="sourceLineNo">4690</span>      if (primaryRegion != null) {<a name="line.4690"></a>
-<span class="sourceLineNo">4691</span>        HBaseTestingUtility.closeRegionAndWAL(primaryRegion);<a name="line.4691"></a>
-<span class="sourceLineNo">4692</span>      }<a name="line.4692"></a>
-<span class="sourceLineNo">4693</span>      if (secondaryRegion != null) {<a name="line.4693"></a>
-<span class="sourceLineNo">4694</span>        HBaseTestingUtility.closeRegionAndWAL(secondaryRegion);<a name="line.4694"></a>
-<span class="sourceLineNo">4695</span>      }<a name="line.4695"></a>
-<span class="sourceLineNo">4696</span>    }<a name="line.4696"></a>
-<span class="sourceLineNo">4697</span>  }<a name="line.4697"></a>
-<span class="sourceLineNo">4698</span><a name="line.4698"></a>
-<span class="sourceLineNo">4699</span>  private void putData(int startRow, int numRows, byte[] qf, byte[]... families) throws<a name="line.4699"></a>
-<span class="sourceLineNo">4700</span>      IOException {<a name="line.4700"></a>
-<span class="sourceLineNo">4701</span>    putData(this.region, startRow, numRows, qf, families);<a name="line.4701"></a>
-<span class="sourceLineNo">4702</span>  }<a name="line.4702"></a>
-<span class="sourceLineNo">4703</span><a name="line.4703"></a>
-<span class="sourceLineNo">4704</span>  private void putData(HRegion region,<a name="line.4704"></a>
-<span class="sourceLineNo">4705</span>      int startRow, int numRows, byte[] qf, byte[]... families) throws IOException {<a name="line.4705"></a>
-<span class="sourceLineNo">4706</span>    putData(region, Durability.SKIP_WAL, startRow, numRows, qf, families);<a name="line.4706"></a>
+<span class="sourceLineNo">4688</span>      // open secondary region<a name="line.4688"></a>
+<span class="sourceLineNo">4689</span>      secondaryRegion = HRegion.openHRegion(rootDir, secondaryHri, htd, null, CONF);<a name="line.4689"></a>
+<span class="sourceLineNo">4690</span><a name="line.4690"></a>
+<span class="sourceLineNo">4691</span>      // move the file of the primary region to the archive, simulating a compaction<a name="line.4691"></a>
+<span class="sourceLineNo">4692</span>      Collection&lt;HStoreFile&gt; storeFiles = primaryRegion.getStore(families[0]).getStorefiles();<a name="line.4692"></a>
+<span class="sourceLineNo">4693</span>      primaryRegion.getRegionFileSystem().removeStoreFiles(Bytes.toString(families[0]), storeFiles);<a name="line.4693"></a>
+<span class="sourceLineNo">4694</span>      Collection&lt;StoreFileInfo&gt; storeFileInfos = primaryRegion.getRegionFileSystem()<a name="line.4694"></a>
+<span class="sourceLineNo">4695</span>          .getStoreFiles(families[0]);<a name="line.4695"></a>
+<span class="sourceLineNo">4696</span>      Assert.assertTrue(storeFileInfos == null || storeFileInfos.isEmpty());<a name="line.4696"></a>
+<span class="sourceLineNo">4697</span><a name="line.4697"></a>
+<span class="sourceLineNo">4698</span>      verifyData(secondaryRegion, 0, 1000, cq, families);<a name="line.4698"></a>
+<span class="sourceLineNo">4699</span>    } finally {<a name="line.4699"></a>
+<span class="sourceLineNo">4700</span>      if (primaryRegion != null) {<a name="line.4700"></a>
+<span class="sourceLineNo">4701</span>        HBaseTestingUtility.closeRegionAndWAL(primaryRegion);<a name="line.4701"></a>
+<span class="sourceLineNo">4702</span>      }<a name="line.4702"></a>
+<span class="sourceLineNo">4703</span>      if (secondaryRegion != null) {<a name="line.4703"></a>
+<span class="sourceLineNo">4704</span>        HBaseTestingUtility.closeRegionAndWAL(secondaryRegion);<a name="line.4704"></a>
+<span class="sourceLineNo">4705</span>      }<a name="line.4705"></a>
+<span class="sourceLineNo">4706</span>    }<a name="line.4706"></a>
 <span class="sourceLineNo">4707</span>  }<a name="line.4707"></a>
 <span class="sourceLineNo">4708</span><a name="line.4708"></a>
-<span class="sourceLineNo">4709</span>  static void putData(HRegion region, Durability durability,<a name="line.4709"></a>
-<span class="sourceLineNo">4710</span>      int startRow, int numRows, byte[] qf, byte[]... families) throws IOException {<a name="line.4710"></a>
-<span class="sourceLineNo">4711</span>    for (int i = startRow; i &lt; startRow + numRows; i++) {<a name="line.4711"></a>
-<span class="sourceLineNo">4712</span>      Put put = new Put(Bytes.toBytes("" + i));<a name="line.4712"></a>
-<span class="sourceLineNo">4713</span>      put.setDurability(durability);<a name="line.4713"></a>
-<span class="sourceLineNo">4714</span>      for (byte[] family : families) {<a name="line.4714"></a>
-<span class="sourceLineNo">4715</span>        put.addColumn(family, qf, null);<a name="line.4715"></a>
-<span class="sourceLineNo">4716</span>      }<a name="line.4716"></a>
-<span class="sourceLineNo">4717</span>      region.put(put);<a name="line.4717"></a>
-<span class="sourceLineNo">4718</span>      LOG.info(put.toString());<a name="line.4718"></a>
-<span class="sourceLineNo">4719</span>    }<a name="line.4719"></a>
-<span class="sourceLineNo">4720</span>  }<a name="line.4720"></a>
-<span class="sourceLineNo">4721</span><a name="line.4721"></a>
-<span class="sourceLineNo">4722</span>  static void verifyData(HRegion newReg, int startRow, int numRows, byte[] qf, byte[]... families)<a name="line.4722"></a>
-<span class="sourceLineNo">4723</span>      throws IOException {<a name="line.4723"></a>
-<span class="sourceLineNo">4724</span>    for (int i = startRow; i &lt; startRow + numRows; i++) {<a name="line.4724"></a>
-<span class="sourceLineNo">4725</span>      byte[] row = Bytes.toBytes("" + i);<a name="line.4725"></a>
-<span class="sourceLineNo">4726</span>      Get get = new Get(row);<a name="line.4726"></a>
-<span class="sourceLineNo">4727</span>      for (byte[] family : families) {<a name="line.4727"></a>
-<span class="sourceLineNo">4728</span>        get.addColumn(family, qf);<a name="line.4728"></a>
-<span class="sourceLineNo">4729</span>      }<a name="line.4729"></a>
-<span class="sourceLineNo">4730</span>      Result result = newReg.get(get);<a name="line.4730"></a>
-<span class="sourceLineNo">4731</span>      Cell[] raw = result.rawCells();<a name="line.4731"></a>
-<span class="sourceLineNo">4732</span>      assertEquals(families.length, result.size());<a name="line.4732"></a>
-<span class="sourceLineNo">4733</span>      for (int j = 0; j &lt; families.length; j++) {<a name="line.4733"></a>
-<span class="sourceLineNo">4734</span>        assertTrue(CellUtil.matchingRows(raw[j], row));<a name="line.4734"></a>
-<span class="sourceLineNo">4735</span>        assertTrue(CellUtil.matchingFamily(raw[j], families[j]));<a name="line.4735"></a>
-<span class="sourceLineNo">4736</span>        assertTrue(CellUtil.matchingQualifier(raw[j], qf));<a name="line.4736"></a>
-<span class="sourceLineNo">4737</span>      }<a name="line.4737"></a>
-<span class="sourceLineNo">4738</span>    }<a name="line.4738"></a>
-<span class="sourceLineNo">4739</span>  }<a name="line.4739"></a>
-<span class="sourceLineNo">4740</span><a name="line.4740"></a>
-<span class="sourceLineNo">4741</span>  static void assertGet(final HRegion r, final byte[] family, final byte[] k) throws IOException {<a name="line.4741"></a>
-<span class="sourceLineNo">4742</span>    // Now I have k, get values out and assert they are as expected.<a name="line.4742"></a>
-<span class="sourceLineNo">4743</span>    Get get = new Get(k).addFamily(family).readAllVersions();<a name="line.4743"></a>
-<span class="sourceLineNo">4744</span>    Cell[] results = r.get(get).rawCells();<a name="line.4744"></a>
-<span class="sourceLineNo">4745</span>    for (int j = 0; j &lt; results.length; j++) {<a name="line.4745"></a>
-<span class="sourceLineNo">4746</span>      byte[] tmp = CellUtil.cloneValue(results[j]);<a name="line.4746"></a>
-<span class="sourceLineNo">4747</span>      // Row should be equal to value every time.<a name="line.4747"></a>
-<span class="sourceLineNo">4748</span>      assertTrue(Bytes.equals(k, tmp));<a name="line.4748"></a>
-<span class="sourceLineNo">4749</span>    }<a name="line.4749"></a>
-<span class="sourceLineNo">4750</span>  }<a name="line.4750"></a>
-<span class="sourceLineNo">4751</span><a name="line.4751"></a>
-<span class="sourceLineNo">4752</span>  /*<a name="line.4752"></a>
-<span class="sourceLineNo">4753</span>   * Assert first value in the passed region is &lt;code&gt;firstValue&lt;/code&gt;.<a name="line.4753"></a>
-<span class="sourceLineNo">4754</span>   *<a name="line.4754"></a>
-<span class="sourceLineNo">4755</span>   * @param r<a name="line.4755"></a>
-<span class="sourceLineNo">4756</span>   *<a name="line.4756"></a>
-<span class="sourceLineNo">4757</span>   * @param fs<a name="line.4757"></a>
-<span class="sourceLineNo">4758</span>   *<a name="line.4758"></a>
-<span class="sourceLineNo">4759</span>   * @param firstValue<a name="line.4759"></a>
-<span class="sourceLineNo">4760</span>   *<a name="line.4760"></a>
-<span class="sourceLineNo">4761</span>   * @throws IOException<a name="line.4761"></a>
-<span class="sourceLineNo">4762</span>   */<a name="line.4762"></a>
-<span class="sourceLineNo">4763</span>  protected void assertScan(final HRegion r, final byte[] fs, final byte[] firstValue)<a name="line.4763"></a>
-<span class="sourceLineNo">4764</span>      throws IOException {<a name="line.4764"></a>
-<span class="sourceLineNo">4765</span>    byte[][] families = { fs };<a name="line.4765"></a>
-<span class="sourceLineNo">4766</span>    Scan scan = new Scan();<a name="line.4766"></a>
-<span class="sourceLineNo">4767</span>    for (int i = 0; i &lt; families.length; i++)<a name="line.4767"></a>
-<span class="sourceLineNo">4768</span>      scan.addFamily(families[i]);<a name="line.4768"></a>
-<span class="sourceLineNo">4769</span>    InternalScanner s = r.getScanner(scan);<a name="line.4769"></a>
-<span class="sourceLineNo">4770</span>    try {<a name="line.4770"></a>
-<span class="sourceLineNo">4771</span>      List&lt;Cell&gt; curVals = new ArrayList&lt;&gt;();<a name="line.4771"></a>
-<span class="sourceLineNo">4772</span>      boolean first = true;<a name="line.4772"></a>
-<span class="sourceLineNo">4773</span>      OUTER_LOOP: while (s.next(curVals)) {<a name="line.4773"></a>
-<span class="sourceLineNo">4774</span>        for (Cell kv : curVals) {<a name="line.4774"></a>
-<span class="sourceLineNo">4775</span>          byte[] val = CellUtil.cloneValue(kv);<a name="line.4775"></a>
-<span class="sourceLineNo">4776</span>          byte[] curval = val;<a name="line.4776"></a>
-<span class="sourceLineNo">4777</span>          if (first) {<a name="line.4777"></a>
-<span class="sourceLineNo">4778</span>            first = false;<a name="line.4778"></a>
-<span class="sourceLineNo">4779</span>            assertTrue(Bytes.compareTo(curval, firstValue) == 0);<a name="line.4779"></a>
-<span class="sourceLineNo">4780</span>          } else {<a name="line.4780"></a>
-<span class="sourceLineNo">4781</span>            // Not asserting anything. Might as well break.<a name="line.4781"></a>
-<span class="sourceLineNo">4782</span>            break OUTER_LOOP;<a name="line.4782"></a>
-<span class="sourceLineNo">4783</span>          }<a name="line.4783"></a>
-<span class="sourceLineNo">4784</span>        }<a name="line.4784"></a>
-<span class="sourceLineNo">4785</span>      }<a name="line.4785"></a>
-<span class="sourceLineNo">4786</span>    } finally {<a name="line.4786"></a>
-<span class="sourceLineNo">4787</span>      s.close();<a name="line.4787"></a>
-<span class="sourceLineNo">4788</span>    }<a name="line.4788"></a>
-<span class="sourceLineNo">4789</span>  }<a name="line.4789"></a>
-<span class="sourceLineNo">4790</span><a name="line.4790"></a>
-<span class="sourceLineNo">4791</span>  /**<a name="line.4791"></a>
-<span class="sourceLineNo">4792</span>   * Test that we get the expected flush results back<a name="line.4792"></a>
-<span class="sourceLineNo">4793</span>   */<a name="line.4793"></a>
-<span class="sourceLineNo">4794</span>  @Test<a name="line.4794"></a>
-<span class="sourceLineNo">4795</span>  public void testFlushResult() throws IOException {<a name="line.4795"></a>
-<span class="sourceLineNo">4796</span>    byte[] family = Bytes.toBytes("family");<a name="line.4796"></a>
-<span class="sourceLineNo">4797</span><a name="line.4797"></a>
-<span class="sourceLineNo">4798</span>    this.region = initHRegion(tableName, method, family);<a name="line.4798"></a>
-<span class="sourceLineNo">4799</span><a name="line.4799"></a>
-<span class="sourceLineNo">4800</span>    // empty memstore, flush doesn't run<a name="line.4800"></a>
-<span class="sourceLineNo">4801</span>    HRegion.FlushResult fr = region.flush(true);<a name="line.4801"></a>
-<span class="sourceLineNo">4802</span>    assertFalse(fr.isFlushSucceeded());<a name="line.4802"></a>
-<span class="sourceLineNo">4803</span>    assertFalse(fr.isCompactionNeeded());<a name="line.4803"></a>
-<span class="sourceLineNo">4804</span><a name="line.4804"></a>
-<span class="sourceLineNo">4805</span>    // Flush enough files to get up to the threshold, doesn't need compactions<a name="line.4805"></a>
-<span class="sourceLineNo">4806</span>    for (int i = 0; i &lt; 2; i++) {<a name="line.4806"></a>
-<span class="sourceLineNo">4807</span>      Put put = new Put(tableName.toBytes()).addColumn(family, family, tableName.toBytes());<a name="line.4807"></a>
-<span class="sourceLineNo">4808</span>      region.put(put);<a name="line.4808"></a>
-<span class="sourceLineNo">4809</span>      fr = region.flush(true);<a name="line.4809"></a>
-<span class="sourceLineNo">4810</span>      assertTrue(fr.isFlushSucceeded());<a name="line.4810"></a>
-<span class="sourceLineNo">4811</span>      assertFalse(fr.isCompactionNeeded());<a name="line.4811"></a>
-<span class="sourceLineNo">4812</span>    }<a name="line.4812"></a>
-<span class="sourceLineNo">4813</span><a name="line.4813"></a>
-<span class="sourceLineNo">4814</span>    // Two flushes after the threshold, compactions are needed<a name="line.4814"></a>
-<span class="sourceLineNo">4815</span>    for (int i = 0; i &lt; 2; i++) {<a name="line.4815"></a>
-<span class="sourceLineNo">4816</span>      Put put = new Put(tableName.toBytes()).addColumn(family, family, tableName.toBytes());<a name="line.4816"></a>
-<span class="sourceLineNo">4817</span>      region.put(put);<a name="line.4817"></a>
-<span class="sourceLineNo">4818</span>      fr = region.flush(true);<a name="line.4818"></a>
-<span class="sourceLineNo">4819</span>      assertTrue(fr.isFlushSucceeded());<a name="line.4819"></a>
-<span class="sourceLineNo">4820</span>      assertTrue(fr.isCompactionNeeded());<a name="line.4820"></a>
-<span class="sourceLineNo">4821</span>    }<a name="line.4821"></a>
-<span class="sourceLineNo">4822</span>  }<a name="line.4822"></a>
+<span class="sourceLineNo">4709</span>  private void putData(int startRow, int numRows, byte[] qf, byte[]... families) throws<a name="line.4709"></a>
+<span class="sourceLineNo">4710</span>      IOException {<a name="line.4710"></a>
+<span class="sourceLineNo">4711</span>    putData(this.region, startRow, numRows, qf, families);<a name="line.4711"></a>
+<span class="sourceLineNo">4712</span>  }<a name="line.4712"></a>
+<span class="sourceLineNo">4713</span><a name="line.4713"></a>
+<span class="sourceLineNo">4714</span>  private void putData(HRegion region,<a name="line.4714"></a>
+<span class="sourceLineNo">4715</span>      int startRow, int numRows, byte[] qf, byte[]... families) throws IOException {<a name="line.4715"></a>
+<span class="sourceLineNo">4716</span>    putData(region, Durability.SKIP_WAL, startRow, numRows, qf, families);<a name="line.4716"></a>
+<span class="sourceLineNo">4717</span>  }<a name="line.4717"></a>
+<span class="sourceLineNo">4718</span><a name="line.4718"></a>
+<span class="sourceLineNo">4719</span>  static void putData(HRegion region, Durability durability,<a name="line.4719"></a>
+<span class="sourceLineNo">4720</span>      int startRow, int numRows, byte[] qf, byte[]... families) throws IOException {<a name="line.4720"></a>
+<span class="sourceLineNo">4721</span>    for (int i = startRow; i &lt; startRow + numRows; i++) {<a name="line.4721"></a>
+<span class="sourceLineNo">4722</span>      Put put = new Put(Bytes.toBytes("" + i));<a name="line.4722"></a>
+<span class="sourceLineNo">4723</span>      put.setDurability(durability);<a name="line.4723"></a>
+<span class="sourceLineNo">4724</span>      for (byte[] family : families) {<a name="line.4724"></a>
+<span class="sourceLineNo">4725</span>        put.addColumn(family, qf, null);<a name="line.4725"></a>
+<span class="sourceLineNo">4726</span>      }<a name="line.4726"></a>
+<span class="sourceLineNo">4727</span>      region.put(put);<a name="line.4727"></a>
+<span class="sourceLineNo">4728</span>      LOG.info(put.toString());<a name="line.4728"></a>
+<span class="sourceLineNo">4729</span>    }<a name="line.4729"></a>
+<span class="sourceLineNo">4730</span>  }<a name="line.4730"></a>
+<span class="sourceLineNo">4731</span><a name="line.4731"></a>
+<span class="sourceLineNo">4732</span>  static void verifyData(HRegion newReg, int startRow, int numRows, byte[] qf, byte[]... families)<a name="line.4732"></a>
+<span class="sourceLineNo">4733</span>      throws IOException {<a name="line.4733"></a>
+<span class="sourceLineNo">4734</span>    for (int i = startRow; i &lt; startRow + numRows; i++) {<a name="line.4734"></a>
+<span class="sourceLineNo">4735</span>      byte[] row = Bytes.toBytes("" + i);<a name="line.4735"></a>
+<span class="sourceLineNo">4736</span>      Get get = new Get(row);<a name="line.4736"></a>
+<span class="sourceLineNo">4737</span>      for (byte[] family : families) {<a name="line.4737"></a>
+<span class="sourceLineNo">4738</span>        get.addColumn(family, qf);<a name="line.4738"></a>
+<span class="sourceLineNo">4739</span>      }<a name="line.4739"></a>
+<span class="sourceLineNo">4740</span>      Result result = newReg.get(get);<a name="line.4740"></a>
+<span class="sourceLineNo">4741</span>      Cell[] raw = result.rawCells();<a name="line.4741"></a>
+<span class="sourceLineNo">4742</span>      assertEquals(families.length, result.size());<a name="line.4742"></a>
+<span class="sourceLineNo">4743</span>      for (int j = 0; j &lt; families.length; j++) {<a name="line.4743"></a>
+<span class="sourceLineNo">4744</span>        assertTrue(CellUtil.matchingRows(raw[j], row));<a name="line.4744"></a>
+<span class="sourceLineNo">4745</span>        assertTrue(CellUtil.matchingFamily(raw[j], families[j]));<a name="line.4745"></a>
+<span class="sourceLineNo">4746</span>        assertTrue(CellUtil.matchingQualifier(raw[j], qf));<a name="line.4746"></a>
+<span class="sourceLineNo">4747</span>      }<a name="line.4747"></a>
+<span class="sourceLineNo">4748</span>    }<a name="line.4748"></a>
+<span class="sourceLineNo">4749</span>  }<a name="line.4749"></a>
+<span class="sourceLineNo">4750</span><a name="line.4750"></a>
+<span class="sourceLineNo">4751</span>  static void assertGet(final HRegion r, final byte[] family, final byte[] k) throws IOException {<a name="line.4751"></a>
+<span class="sourceLineNo">4752</span>    // Now I have k, get values out and assert they are as expected.<a name="line.4752"></a>
+<span class="sourceLineNo">4753</span>    Get get = new Get(k).addFamily(family).readAllVersions();<a name="line.4753"></a>
+<span class="sourceLineNo">4754</span>    Cell[] results = r.get(get).rawCells();<a name="line.4754"></a>
+<span class="sourceLineNo">4755</span>    for (int j = 0; j &lt; results.length; j++) {<a name="line.4755"></a>
+<span class="sourceLineNo">4756</span>      byte[] tmp = CellUtil.cloneValue(results[j]);<a name="line.4756"></a>
+<span class="sourceLineNo">4757</span>      // Row should be equal to value every time.<a name="line.4757"></a>
+<span class="sourceLineNo">4758</span>      assertTrue(Bytes.equals(k, tmp));<a name="line.4758"></a>
+<span class="sourceLineNo">4759</span>    }<a name="line.4759"></a>
+<span class="sourceLineNo">4760</span>  }<a name="line.4760"></a>
+<span class="sourceLineNo">4761</span><a name="line.4761"></a>
+<span class="sourceLineNo">4762</span>  /*<a name="line.4762"></a>
+<span class="sourceLineNo">4763</span>   * Assert first value in the passed region is &lt;code&gt;firstValue&lt;/code&gt;.<a name="line.4763"></a>
+<span class="sourceLineNo">4764</span>   *<a name="line.4764"></a>
+<span class="sourceLineNo">4765</span>   * @param r<a name="line.4765"></a>
+<span class="sourceLineNo">4766</span>   *<a name="line.4766"></a>
+<span class="sourceLineNo">4767</span>   * @param fs<a name="line.4767"></a>
+<span class="sourceLineNo">4768</span>   *<a name="line.4768"></a>
+<span class="sourceLineNo">4769</span>   * @param firstValue<a name="line.4769"></a>
+<span class="sourceLineNo">4770</span>   *<a name="line.4770"></a>
+<span class="sourceLineNo">4771</span>   * @throws IOException<a name="line.4771"></a>
+<span class="sourceLineNo">4772</span>   */<a name="line.4772"></a>
+<span class="sourceLineNo">4773</span>  protected void assertScan(final HRegion r, final byte[] fs, final byte[] firstValue)<a name="line.4773"></a>
+<span class="sourceLineNo">4774</span>      throws IOException {<a name="line.4774"></a>
+<span class="sourceLineNo">4775</span>    byte[][] families = { fs };<a name="line.4775"></a>
+<span class="sourceLineNo">4776</span>    Scan scan = new Scan();<a name="line.4776"></a>
+<span class="sourceLineNo">4777</span>    for (int i = 0; i &lt; families.length; i++)<a name="line.4777"></a>
+<span class="sourceLineNo">4778</span>      scan.addFamily(families[i]);<a name="line.4778"></a>
+<span class="sourceLineNo">4779</span>    InternalScanner s = r.getScanner(scan);<a name="line.4779"></a>
+<span class="sourceLineNo">4780</span>    try {<a name="line.4780"></a>
+<span class="sourceLineNo">4781</span>      List&lt;Cell&gt; curVals = new ArrayList&lt;&gt;();<a name="line.4781"></a>
+<span class="sourceLineNo">4782</span>      boolean first = true;<a name="line.4782"></a>
+<span class="sourceLineNo">4783</span>      OUTER_LOOP: while (s.next(curVals)) {<a name="line.4783"></a>
+<span class="sourceLineNo">4784</span>        for (Cell kv : curVals) {<a name="line.4784"></a>
+<span class="sourceLineNo">4785</span>          byte[] val = CellUtil.cloneValue(kv);<a name="line.4785"></a>
+<span class="sourceLineNo">4786</span>          byte[] curval = val;<a name="line.4786"></a>
+<span class="sourceLineNo">4787</span>          if (first) {<a name="line.4787"></a>
+<span class="sourceLineNo">4788</span>            first = false;<a name="line.4788"></a>
+<span class="sourceLineNo">4789</span>            assertTrue(Bytes.compareTo(curval, firstValue) == 0);<a name="line.4789"></a>
+<span class="sourceLineNo">4790</span>          } else {<a name="line.4790"></a>
+<span class="sourceLineNo">4791</span>            // Not asserting anything. Might as well break.<a name="line.4791"></a>
+<span class="sourceLineNo">4792</span>            break OUTER_LOOP;<a name="line.4792"></a>
+<span class="sourceLineNo">4793</span>          }<a name="line.4793"></a>
+<span class="sourceLineNo">4794</span>        }<a name="line.4794"></a>
+<span class="sourceLineNo">4795</span>      }<a name="line.4795"></a>
+<span class="sourceLineNo">4796</span>    } finally {<a name="line.4796"></a>
+<span class="sourceLineNo">4797</span>      s.close();<a name="line.4797"></a>
+<span class="sourceLineNo">4798</span>    }<a name="line.4798"></a>
+<span class="sourceLineNo">4799</span>  }<a name="line.4799"></a>
+<span class="sourceLineNo">4800</span><a name="line.4800"></a>
+<span class="sourceLineNo">4801</span>  /**<a name="line.4801"></a>
+<span class="sourceLineNo">4802</span>   * Test that we get the expected flush results back<a name="line.4802"></a>
+<span class="sourceLineNo">4803</span>   */<a name="line.4803"></a>
+<span class="sourceLineNo">4804</span>  @Test<a name="line.4804"></a>
+<span class="sourceLineNo">4805</span>  public void testFlushResult() throws IOException {<a name="line.4805"></a>
+<span class="sourceLineNo">4806</span>    byte[] family = Bytes.toBytes("family");<a name="line.4806"></a>
+<span class="sourceLineNo">4807</span><a name="line.4807"></a>
+<span class="sourceLineNo">4808</span>    this.region = initHRegion(tableName, method, family);<a name="line.4808"></a>
+<span class="sourceLineNo">4809</span><a name="line.4809"></a>
+<span class="sourceLineNo">4810</span>    // empty memstore, flush doesn't run<a name="line.4810"></a>
+<span class="sourceLineNo">4811</span>    HRegion.FlushResult fr = region.flush(true);<a name="line.4811"></a>
+<span class="sourceLineNo">4812</span>    assertFalse(fr.isFlushSucceeded());<a name="line.4812"></a>
+<span class="sourceLineNo">4813</span>    assertFalse(fr.isCompactionNeeded());<a name="line.4813"></a>
+<span class="sourceLineNo">4814</span><a name="line.4814"></a>
+<span class="sourceLineNo">4815</span>    // Flush enough files to get up to the threshold, doesn't need compactions<a name="line.4815"></a>
+<span class="sourceLineNo">4816</span>    for (int i = 0; i &lt; 2; i++) {<a name="line.4816"></a>
+<span class="sourceLineNo">4817</span>      Put put = new Put(tableName.toBytes()).addColumn(family, family, tableName.toBytes());<a name="line.4817"></a>
+<span class="sourceLineNo">4818</span>      region.put(put);<a name="line.4818"></a>
+<span class="sourceLineNo">4819</span>      fr = region.flush(true);<a name="line.4819"></a>
+<span class="sourceLineNo">4820</span>      assertTrue(fr.isFlushSucceeded());<a name="line.4820"></a>
+<span class="sourceLineNo">4821</span>      assertFalse(fr.isCompactionNeeded());<a name="line.4821"></a>
+<span class="sourceLineNo">4822</span>    }<a name="line.4822"></a>
 <span class="sourceLineNo">4823</span><a name="line.4823"></a>
-<span class="sourceLineNo">4824</span>  protected Configuration initSplit() {<a name="line.4824"></a>
-<span class="sourceLineNo">4825</span>    // Always compact if there is more than one store file.<a name="line.4825"></a>
-<span class="sourceLineNo">4826</span>    CONF.setInt("hbase.hstore.compactionThreshold", 2);<a name="line.4826"></a>
-<span class="sourceLineNo">4827</span><a name="line.4827"></a>
-<span class="sourceLineNo">4828</span>    CONF.setInt(HConstants.HBASE_CLIENT_SCANNER_TIMEOUT_PERIOD, 10 * 1000);<a name="line.4828"></a>
-<span class="sourceLineNo">4829</span><a name="line.4829"></a>
-<span class="sourceLineNo">4830</span>    // Increase the amount of time between client retries<a name="line.4830"></a>
-<span class="sourceLineNo">4831</span>    CONF.setLong("hbase.client.pause", 15 * 1000);<a name="line.4831"></a>
-<span class="sourceLineNo">4832</span><a name="line.4832"></a>
-<span class="sourceLineNo">4833</span>    // This size should make it so we always split using the addContent<a name="line.4833"></a>
-<span class="sourceLineNo">4834</span>    // below. After adding all data, the first region is 1.3M<a name="line.4834"></a>
-<span class="sourceLineNo">4835</span>    CONF.setLong(HConstants.HREGION_MAX_FILESIZE, 1024 * 128);<a name="line.4835"></a>
-<span class="sourceLineNo">4836</span>    return CONF;<a name="line.4836"></a>
-<span class="sourceLineNo">4837</span>  }<a name="line.4837"></a>
-<span class="sourceLineNo">4838</span><a name="line.4838"></a>
-<span class="sourceLineNo">4839</span>  /**<a name="line.4839"></a>
-<span class="sourceLineNo">4840</span>   * @return A region on which you must call<a name="line.4840"></a>
-<span class="sourceLineNo">4841</span>   *         {@link HBaseTestingUtility#closeRegionAndWAL(HRegion)} when done.<a name="line.4841"></a>
-<span class="sourceLineNo">4842</span>   */<a name="line.4842"></a>
-<span class="sourceLineNo">4843</span>  protected HRegion initHRegion(TableName tableName, String callingMethod, Configuration conf,<a name="line.4843"></a>
-<span class="sourceLineNo">4844</span>      byte[]... families) throws IOException {<a name="line.4844"></a>
-<span class="sourceLineNo">4845</span>    return initHRegion(tableName, callingMethod, conf, false, families);<a name="line.4845"></a>
-<span class="sourceLineNo">4846</span>  }<a name="line.4846"></a>
-<span class="sourceLineNo">4847</span><a name="line.4847"></a>
-<span class="sourceLineNo">4848</span>  /**<a name="line.4848"></a>
-<span class="sourceLineNo">4849</span>   * @return A region on which you must call<a name="line.4849"></a>
-<span class="sourceLineNo">4850</span>   *         {@link HBaseTestingUtility#closeRegionAndWAL(HRegion)} when done.<a name="line.4850"></a>
-<span class="sourceLineNo">4851</span>   */<a name="line.4851"></a>
-<span class="sourceLineNo">4852</span>  protected HRegion initHRegion(TableName tableName, String callingMethod, Configuration conf,<a name="line.4852"></a>
-<span class="sourceLineNo">4853</span>      boolean isReadOnly, byte[]... families) throws IOException {<a name="line.4853"></a>
-<span class="sourceLineNo">4854</span>    return initHRegion(tableName, null, null, callingMethod, conf, isReadOnly, families);<a name="line.4854"></a>
-<span class="sourceLineNo">4855</span>  }<a name="line.4855"></a>
-<span class="sourceLineNo">4856</span><a name="line.4856"></a>
-<span class="sourceLineNo">4857</span>  protected HRegion initHRegion(TableName tableName, byte[] startKey, byte[] stopKey,<a name="line.4857"></a>
-<span class="sourceLineNo">4858</span>      String callingMethod, Configuration conf, boolean isReadOnly, byte[]... families)<a name="line.4858"></a>
-<span class="sourceLineNo">4859</span>      throws IOException {<a name="line.4859"></a>
-<span class="sourceLineNo">4860</span>    Path logDir = TEST_UTIL.getDataTestDirOnTestFS(callingMethod + ".log");<a name="line.4860"></a>
-<span class="sourceLineNo">4861</span>    ChunkCreator.initialize(MemStoreLABImpl.CHUNK_SIZE_DEFAULT, false, 0, 0, 0, null);<a name="line.4861"></a>
-<span class="sourceLineNo">4862</span>    HRegionInfo hri = new HRegionInfo(tableName, startKey, stopKey);<a name="line.4862"></a>
-<span class="sourceLineNo">4863</span>    final WAL wal = HBaseTestingUtility.createWal(conf, logDir, hri);<a name="line.4863"></a>
-<span class="sourceLineNo">4864</span>    return initHRegion(tableName, startKey, stopKey, isReadOnly,<a name="line.4864"></a>
-<span class="sourceLineNo">4865</span>        Durability.SYNC_WAL, wal, families);<a name="line.4865"></a>
-<span class="sourceLineNo">4866</span>  }<a name="line.4866"></a>
-<span class="sourceLineNo">4867</span><a name="line.4867"></a>
-<span class="sourceLineNo">4868</span>  /**<a name="line.4868"></a>
-<span class="sourceLineNo">4869</span>   * @return A region on which you must call<a name="line.4869"></a>
-<span class="sourceLineNo">4870</span>   *         {@link HBaseTestingUtility#closeRegionAndWAL(HRegion)} when done.<a name="line.4870"></a>
-<span class="sourceLineNo">4871</span>   */<a name="line.4871"></a>
-<span class="sourceLineNo">4872</span>  public HRegion initHRegion(TableName tableName, byte[] startKey, byte[] stopKey,<a name="line.4872"></a>
-<span class="sourceLineNo">4873</span>      boolean isReadOnly, Durability durability, WAL wal, byte[]... families) throws IOException {<a name="line.4873"></a>
-<span class="sourceLineNo">4874</span>    return TEST_UTIL.createLocalHRegion(tableName, startKey, stopKey,<a name="line.4874"></a>
-<span class="sourceLineNo">4875</span>        isReadOnly, durability, wal, families);<a name="line.4875"></a>
+<span class="sourceLineNo">4824</span>    // Two flushes after the threshold, compactions are needed<a name="line.4824"></a>
+<span class="sourceLineNo">4825</span>    for (int i = 0; i &lt; 2; i++) {<a name="line.4825"></a>
+<span class="sourceLineNo">4826</span>      Put put = new Put(tableName.toBytes()).addColumn(family, family, tableName.toBytes());<a name="line.4826"></a>
+<span class="sourceLineNo">4827</span>      region.put(put);<a name="line.4827"></a>
+<span class="sourceLineNo">4828</span>      fr = region.flush(true);<a name="line.4828"></a>
+<span class="sourceLineNo">4829</span>      assertTrue(fr.isFlushSucceeded());<a name="line.4829"></a>
+<span class="sourceLineNo">4830</span>      assertTrue(fr.isCompactionNeeded());<a name="line.4830"></a>
+<span class="sourceLineNo">4831</span>    }<a name="line.4831"></a>
+<span class="sourceLineNo">4832</span>  }<a name="line.4832"></a>
+<span class="sourceLineNo">4833</span><a name="line.4833"></a>
+<span class="sourceLineNo">4834</span>  protected Configuration initSplit() {<a name="line.4834"></a>
+<span class="sourceLineNo">4835</span>    // Always compact if there is more than one store file.<a name="line.4835"></a>
+<span class="sourceLineNo">4836</span>    CONF.setInt("hbase.hstore.compactionThreshold", 2);<a name="line.4836"></a>
+<span class="sourceLineNo">4837</span><a name="line.4837"></a>
+<span class="sourceLineNo">4838</span>    CONF.setInt(HConstants.HBASE_CLIENT_SCANNER_TIMEOUT_PERIOD, 10 * 1000);<a name="line.4838"></a>
+<span class="sourceLineNo">4839</span><a name="line.4839"></a>
+<span class="sourceLineNo">4840</span>    // Increase the amount of time between client retries<a name="line.4840"></a>
+<span class="sourceLineNo">4841</span>    CONF.setLong("hbase.client.pause", 15 * 1000);<a name="line.4841"></a>
+<span class="sourceLineNo">4842</span><a name="line.4842"></a>
+<span class="sourceLineNo">4843</span>    // This size should make it so we always split using the addContent<a name="line.4843"></a>
+<span class="sourceLineNo">4844</span>    // below. After adding all data, the first region is 1.3M<a name="line.4844"></a>
+<span class="sourceLineNo">4845</span>    CONF.setLong(HConstants.HREGION_MAX_FILESIZE, 1024 * 128);<a name="line.4845"></a>
+<span class="sourceLineNo">4846</span>    return CONF;<a name="line.4846"></a>
+<span class="sourceLineNo">4847</span>  }<a name="line.4847"></a>
+<span class="sourceLineNo">4848</span><a name="line.4848"></a>
+<span class="sourceLineNo">4849</span>  /**<a name="line.4849"></a>
+<span class="sourceLineNo">4850</span>   * @return A region on which you must call<a name="line.4850"></a>
+<span class="sourceLineNo">4851</span>   *         {@link HBaseTestingUtility#closeRegionAndWAL(HRegion)} when done.<a name="line.4851"></a>
+<span class="sourceLineNo">4852</span>   */<a name="line.4852"></a>
+<span class="sourceLineNo">4853</span>  protected HRegion initHRegion(TableName tableName, String callingMethod, Configuration conf,<a name="line.4853"></a>
+<span class="sourceLineNo">4854</span>      byte[]... families) throws IOException {<a name="line.4854"></a>
+<span class="sourceLineNo">4855</span>    return initHRegion(tableName, callingMethod, conf, false, families);<a name="line.4855"></a>
+<span class="sourceLineNo">4856</span>  }<a name="line.4856"></a>
+<span class="sourceLineNo">4857</span><a name="line.4857"></a>
+<span class="sourceLineNo">4858</span>  /**<a name="line.4858"></a>
+<span class="sourceLineNo">4859</span>   * @return A region on which you must call<a name="line.4859"></a>
+<span class="sourceLineNo">4860</span>   *         {@link HBaseTestingUtility#closeRegionAndWAL(HRegion)} when done.<a name="line.4860"></a>
+<span class="sourceLineNo">4861</span>   */<a name="line.4861"></a>
+<span class="sourceLineNo">4862</span>  protected HRegion initHRegion(TableName tableName, String callingMethod, Configuration conf,<a name="line.4862"></a>
+<span class="sourceLineNo">4863</span>      boolean isReadOnly, byte[]... families) throws IOException {<a name="line.4863"></a>
+<span class="sourceLineNo">4864</span>    return initHRegion(tableName, null, null, callingMethod, conf, isReadOnly, families);<a name="line.4864"></a>
+<span class="sourceLineNo">4865</span>  }<a name="line.4865"></a>
+<span class="sourceLineNo">4866</span><a name="line.4866"></a>
+<span class="sourceLineNo">4867</span>  protected HRegion initHRegion(TableName tableName, byte[] startKey, byte[] stopKey,<a name="line.4867"></a>
+<span class="sourceLineNo">4868</span>      String callingMethod, Configuration conf, boolean isReadOnly, byte[]... families)<a name="line.4868"></a>
+<span class="sourceLineNo">4869</span>      throws IOException {<a name="line.4869"></a>
+<span class="sourceLineNo">4870</span>    Path logDir = TEST_UTIL.getDataTestDirOnTestFS(callingMethod + ".log");<a name="line.4870"></a>
+<span class="sourceLineNo">4871</span>    ChunkCreator.initialize(MemStoreLABImpl.CHUNK_SIZE_DEFAULT, false, 0, 0, 0, null);<a name="line.4871"></a>
+<span class="sourceLineNo">4872</span>    HRegionInfo hri = new HRegionInfo(tableName, startKey, stopKey);<a name="line.4872"></a>
+<span class="sourceLineNo">4873</span>    final WAL wal = HBaseTestingUtility.createWal(conf, logDir, hri);<a name="line.4873"></a>
+<span class="sourceLineNo">4874</span>    return initHRegion(tableName, startKey, stopKey, isReadOnly,<a name="line.4874"></a>
+<span class="sourceLineNo">4875</span>        Durability.SYNC_WAL, wal, families);<a name="line.4875"></a>
 <span class="sourceLineNo">4876</span>  }<a name="line.4876"></a>
 <span class="sourceLineNo">4877</span><a name="line.4877"></a>
 <span class="sourceLineNo">4878</span>  /**<a name="line.4878"></a>
-<span class="sourceLineNo">4879</span>   * Assert that the passed in Cell has expected contents for the specified row,<a name="line.4879"></a>
-<span class="sourceLineNo">4880</span>   * column &amp; timestamp.<a name="line.4880"></a>
+<span class="sourceLineNo">4879</span>   * @return A region on which you must call<a name="line.4879"></a>
+<span class="sourceLineNo">4880</span>   *         {@link HBaseTestingUtility#closeRegionAndWAL(HRegion)} when done.<a name="line.4880"></a>
 <span class="sourceLineNo">4881</span>   */<a name="line.4881"></a>
-<span class="sourceLineNo">4882</span>  private void checkOneCell(Cell kv, byte[] cf, int rowIdx, int colIdx, long ts) {<a name="line.4882"></a>
-<span class="sourceLineNo">4883</span>    String ctx = "rowIdx=" + rowIdx + "; colIdx=" + colIdx + "; ts=" + ts;<a name="line.4883"></a>
-<span class="sourceLineNo">4884</span>    assertEquals("Row mismatch which checking: " + ctx, "row:" + rowIdx,<a name="line.4884"></a>
-<span class="sourceLineNo">4885</span>        Bytes.toString(CellUtil.cloneRow(kv)));<a name="line.4885"></a>
-<span class="sourceLineNo">4886</span>    assertEquals("ColumnFamily mismatch while checking: " + ctx, Bytes.toString(cf),<a name="line.4886"></a>
-<span class="sourceLineNo">4887</span>        Bytes.toString(CellUtil.cloneFamily(kv)));<a name="line.4887"></a>
-<span class="sourceLineNo">4888</span>    assertEquals("Column qualifier mismatch while checking: " + ctx, "column:" + colIdx,<a name="line.4888"></a>
-<span class="sourceLineNo">4889</span>        Bytes.toString(CellUtil.cloneQualifier(kv)));<a name="line.4889"></a>
-<span class="sourceLineNo">4890</span>    assertEquals("Timestamp mismatch while checking: " + ctx, ts, kv.getTimestamp());<a name="line.4890"></a>
-<span class="sourceLineNo">4891</span>    assertEquals("Value mismatch while checking: " + ctx, "value-version-" + ts,<a name="line.4891"></a>
-<span class="sourceLineNo">4892</span>        Bytes.toString(CellUtil.cloneValue(kv)));<a name="line.4892"></a>
-<span class="sourceLineNo">4893</span>  }<a name="line.4893"></a>
-<span class="sourceLineNo">4894</span><a name="line.4894"></a>
-<span class="sourceLineNo">4895</span>  @Test<a name="line.4895"></a>
-<span class="sourceLineNo">4896</span>  public void testReverseScanner_FromMemStore_SingleCF_Normal()<a name="line.4896"></a>
-<span class="sourceLineNo">4897</span>      throws IOException {<a name="line.4897"></a>
-<span class="sourceLineNo">4898</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.4898"></a>
-<span class="sourceLineNo">4899</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.4899"></a>
-<span class="sourceLineNo">4900</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.4900"></a>
-<span class="sourceLineNo">4901</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.4901"></a>
-<span class="sourceLineNo">4902</span>    byte[][] families = { cf };<a name="line.4902"></a>
-<span class="sourceLineNo">4903</span>    byte[] col = Bytes.toBytes("C");<a name="line.4903"></a>
-<span class="sourceLineNo">4904</span>    long ts = 1;<a name="line.4904"></a>
-<span class="sourceLineNo">4905</span>    this.region = initHRegion(tableName, method, families);<a name="line.4905"></a>
-<span class="sourceLineNo">4906</span>    KeyValue kv1 = new KeyValue(rowC, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4906"></a>
-<span class="sourceLineNo">4907</span>    KeyValue kv11 = new KeyValue(rowC, cf, col, ts + 1, KeyValue.Type.Put,<a name="line.4907"></a>
-<span class="sourceLineNo">4908</span>        null);<a name="line.4908"></a>
-<span class="sourceLineNo">4909</span>    KeyValue kv2 = new KeyValue(rowA, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4909"></a>
-<span class="sourceLineNo">4910</span>    KeyValue kv3 = new KeyValue(rowB, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4910"></a>
-<span class="sourceLineNo">4911</span>    Put put = null;<a name="line.4911"></a>
-<span class="sourceLineNo">4912</span>    put = new Put(rowC);<a name="line.4912"></a>
-<span class="sourceLineNo">4913</span>    put.add(kv1);<a name="line.4913"></a>
-<span class="sourceLineNo">4914</span>    put.add(kv11);<a name="line.4914"></a>
-<span class="sourceLineNo">4915</span>    region.put(put);<a name="line.4915"></a>
-<span class="sourceLineNo">4916</span>    put = new Put(rowA);<a name="line.4916"></a>
-<span class="sourceLineNo">4917</span>    put.add(kv2);<a name="line.4917"></a>
-<span class="sourceLineNo">4918</span>    region.put(put);<a name="line.4918"></a>
-<span class="sourceLineNo">4919</span>    put = new Put(rowB);<a name="line.4919"></a>
-<span class="sourceLineNo">4920</span>    put.add(kv3);<a name="line.4920"></a>
-<span class="sourceLineNo">4921</span>    region.put(put);<a name="line.4921"></a>
-<span class="sourceLineNo">4922</span><a name="line.4922"></a>
-<span class="sourceLineNo">4923</span>    Scan scan = new Scan(rowC);<a name="line.4923"></a>
-<span class="sourceLineNo">4924</span>    scan.setMaxVersions(5);<a name="line.4924"></a>
-<span class="sourceLineNo">4925</span>    scan.setReversed(true);<a name="line.4925"></a>
-<span class="sourceLineNo">4926</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.4926"></a>
-<span class="sourceLineNo">4927</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.4927"></a>
-<span class="sourceLineNo">4928</span>    boolean hasNext = scanner.next(currRow);<a name="line.4928"></a>
-<span class="sourceLineNo">4929</span>    assertEquals(2, currRow.size());<a name="line.4929"></a>
-<span class="sourceLineNo">4930</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4930"></a>
-<span class="sourceLineNo">4931</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.4931"></a>
-<span class="sourceLineNo">4932</span>    assertTrue(hasNext);<a name="line.4932"></a>
-<span class="sourceLineNo">4933</span>    currRow.clear();<a name="line.4933"></a>
-<span class="sourceLineNo">4934</span>    hasNext = scanner.next(currRow);<a name="line.4934"></a>
-<span class="sourceLineNo">4935</span>    assertEquals(1, currRow.size());<a name="line.4935"></a>
-<span class="sourceLineNo">4936</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4936"></a>
-<span class="sourceLineNo">4937</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.4937"></a>
-<span class="sourceLineNo">4938</span>    assertTrue(hasNext);<a name="line.4938"></a>
-<span class="sourceLineNo">4939</span>    currRow.clear();<a name="line.4939"></a>
-<span class="sourceLineNo">4940</span>    hasNext = scanner.next(currRow);<a name="line.4940"></a>
-<span class="sourceLineNo">4941</span>    assertEquals(1, currRow.size());<a name="line.4941"></a>
-<span class="sourceLineNo">4942</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4942"></a>
-<span class="sourceLineNo">4943</span>        .get(0).getRowLength(), rowA, 0, rowA.length));<a name="line.4943"></a>
-<span class="sourceLineNo">4944</span>    assertFalse(hasNext);<a name="line.4944"></a>
-<span class="sourceLineNo">4945</span>    scanner.close();<a name="line.4945"></a>
-<span class="sourceLineNo">4946</span>  }<a name="line.4946"></a>
-<span class="sourceLineNo">4947</span><a name="line.4947"></a>
-<span class="sourceLineNo">4948</span>  @Test<a name="line.4948"></a>
-<span class="sourceLineNo">4949</span>  public void testReverseScanner_FromMemStore_SingleCF_LargerKey()<a name="line.4949"></a>
-<span class="sourceLineNo">4950</span>      throws IOException {<a name="line.4950"></a>
-<span class="sourceLineNo">4951</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.4951"></a>
-<span class="sourceLineNo">4952</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.4952"></a>
-<span class="sourceLineNo">4953</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.4953"></a>
-<span class="sourceLineNo">4954</span>    byte[] rowD = Bytes.toBytes("rowD");<a name="line.4954"></a>
-<span class="sourceLineNo">4955</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.4955"></a>
-<span class="sourceLineNo">4956</span>    byte[][] families = { cf };<a name="line.4956"></a>
-<span class="sourceLineNo">4957</span>    byte[] col = Bytes.toBytes("C");<a name="line.4957"></a>
-<span class="sourceLineNo">4958</span>    long ts = 1;<a name="line.4958"></a>
-<span class="sourceLineNo">4959</span>    this.region = initHRegion(tableName, method, families);<a name="line.4959"></a>
-<span class="sourceLineNo">4960</span>    KeyValue kv1 = new KeyValue(rowC, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4960"></a>
-<span class="sourceLineNo">4961</span>    KeyValue kv11 = new KeyValue(rowC, cf, col, ts + 1, KeyValue.Type.Put,<a name="line.4961"></a>
-<span class="sourceLineNo">4962</span>        null);<a name="line.4962"></a>
-<span class="sourceLineNo">4963</span>    KeyValue kv2 = new KeyValue(rowA, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4963"></a>
-<span class="sourceLineNo">4964</span>    KeyValue kv3 = new KeyValue(rowB, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4964"></a>
-<span class="sourceLineNo">4965</span>    Put put = null;<a name="line.4965"></a>
-<span class="sourceLineNo">4966</span>    put = new Put(rowC);<a name="line.4966"></a>
-<span class="sourceLineNo">4967</span>    put.add(kv1);<a name="line.4967"></a>
-<span class="sourceLineNo">4968</span>    put.add(kv11);<a name="line.4968"></a>
-<span class="sourceLineNo">4969</span>    region.put(put);<a name="line.4969"></a>
-<span class="sourceLineNo">4970</span>    put = new Put(rowA);<a name="line.4970"></a>
-<span class="sourceLineNo">4971</span>    put.add(kv2);<a name="line.4971"></a>
-<span class="sourceLineNo">4972</span>    region.put(put);<a name="line.4972"></a>
-<span class="sourceLineNo">4973</span>    put = new Put(rowB);<a name="line.4973"></a>
-<span class="sourceLineNo">4974</span>    put.add(kv3);<a name="line.4974"></a>
-<span class="sourceLineNo">4975</span>    region.put(put);<a name="line.4975"></a>
-<span class="sourceLineNo">4976</span><a name="line.4976"></a>
-<span class="sourceLineNo">4977</span>    Scan scan = new Scan(rowD);<a name="line.4977"></a>
-<span class="sourceLineNo">4978</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.4978"></a>
-<span class="sourceLineNo">4979</span>    scan.setReversed(true);<a name="line.4979"></a>
-<span class="sourceLineNo">4980</span>    scan.setMaxVersions(5);<a name="line.4980"></a>
-<span class="sourceLineNo">4981</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.4981"></a>
-<span class="sourceLineNo">4982</span>    boolean hasNext = scanner.next(currRow);<a name="line.4982"></a>
-<span class="sourceLineNo">4983</span>    assertEquals(2, currRow.size());<a name="line.4983"></a>
-<span class="sourceLineNo">4984</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4984"></a>
-<span class="sourceLineNo">4985</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.4985"></a>
-<span class="sourceLineNo">4986</span>    assertTrue(hasNext);<a name="line.4986"></a>
-<span class="sourceLineNo">4987</span>    currRow.clear();<a name="line.4987"></a>
-<span class="sourceLineNo">4988</span>    hasNext = scanner.next(currRow);<a name="line.4988"></a>
-<span class="sourceLineNo">4989</span>    assertEquals(1, currRow.size());<a name="line.4989"></a>
-<span class="sourceLineNo">4990</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4990"></a>
-<span class="sourceLineNo">4991</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.4991"></a>
-<span class="sourceLineNo">4992</span>    assertTrue(hasNext);<a name="line.4992"></a>
-<span class="sourceLineNo">4993</span>    currRow.clear();<a name="line.4993"></a>
-<span class="sourceLineNo">4994</span>    hasNext = scanner.next(currRow);<a name="line.4994"></a>
-<span class="sourceLineNo">4995</span>    assertEquals(1, currRow.size());<a name="line.4995"></a>
-<span class="sourceLineNo">4996</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4996"></a>
-<span class="sourceLineNo">4997</span>        .get(0).getRowLength(), rowA, 0, rowA.length));<a name="line.4997"></a>
-<span class="sourceLineNo">4998</span>    assertFalse(hasNext);<a name="line.4998"></a>
-<span class="sourceLineNo">4999</span>    scanner.close();<a name="line.4999"></a>
-<span class="sourceLineNo">5000</span>  }<a name="line.5000"></a>
-<span class="sourceLineNo">5001</span><a name="line.5001"></a>
-<span class="sourceLineNo">5002</span>  @Test<a name="line.5002"></a>
-<span class="sourceLineNo">5003</span>  public void testReverseScanner_FromMemStore_SingleCF_FullScan()<a name="line.5003"></a>
-<span class="sourceLineNo">5004</span>      throws IOException {<a name="line.5004"></a>
-<span class="sourceLineNo">5005</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.5005"></a>
-<span class="sourceLineNo">5006</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.5006"></a>
-<span class="sourceLineNo">5007</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.5007"></a>
-<span class="sourceLineNo">5008</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.5008"></a>
-<span class="sourceLineNo">5009</span>    byte[][] families = { cf };<a name="line.5009"></a>
-<span class="sourceLineNo">5010</span>    byte[] col = Bytes.toBytes("C");<a name="line.5010"></a>
-<span class="sourceLineNo">5011</span>    long ts = 1;<a name="line.5011"></a>
-<span class="sourceLineNo">5012</span>    this.region = initHRegion(tableName, method, families);<a name="line.5012"></a>
-<span class="sourceLineNo">5013</span>    KeyValue kv1 = new KeyValue(rowC, cf, col, ts, KeyValue.Type.Put, null);<a name="line.5013"></a>
-<span class="sourceLineNo">5014</span>    KeyValue kv11 = new KeyValue(rowC, cf, col, ts + 1, KeyValue.Type.Put,<a name="line.5014"></a>
-<span class="sourceLineNo">5015</span>        null);<a name="line.5015"></a>
-<span class="sourceLineNo">5016</span>    KeyValue kv2 = new KeyValue(rowA, cf, col, ts, KeyValue.Type.Put, null);<a name="line.5016"></a>
-<span class="sourceLineNo">5017</span>    KeyValue kv3 = new KeyValue(rowB, cf, col, ts, KeyValue.Type.Put, null);<a name="line.5017"></a>
-<span class="sourceLineNo">5018</span>    Put put = null;<a name="line.5018"></a>
-<span class="sourceLineNo">5019</span>    put = new Put(rowC);<a name="line.5019"></a>
-<span class="sourceLineNo">5020</span>    put.add(kv1);<a name="line.5020"></a>
-<span class="sourceLineNo">5021</span>    put.add(kv11);<a name="line.5021"></a>
-<span class="sourceLineNo">5022</span>    region.put(put);<a name="line.5022"></a>
-<span class="sourceLineNo">5023</span>    put = new Put(rowA);<a name="line.5023"></a>
-<span class="sourceLineNo">5024</span>    put.add(kv2);<a name="line.5024"></a>
-<span class="sourceLineNo">5025</span>    region.put(put);<a name="line.5025"></a>
-<span class="sourceLineNo">5026</span>    put = new Put(rowB);<a name="line.5026"></a>
-<span class="sourceLineNo">5027</span>    put.add(kv3);<a name="line.5027"></a>
-<span class="sourceLineNo">5028</span>    region.put(put);<a name="line.5028"></a>
-<span class="sourceLineNo">5029</span>    Scan scan = new Scan();<a name="line.5029"></a>
-<span class="sourceLineNo">5030</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5030"></a>
-<span class="sourceLineNo">5031</span>    scan.setReversed(true);<a name="line.5031"></a>
-<span class="sourceLineNo">5032</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5032"></a>
-<span class="sourceLineNo">5033</span>    boolean hasNext = scanner.next(currRow);<a name="line.5033"></a>
-<span class="sourceLineNo">5034</span>    assertEquals(1, currRow.size());<a name="line.5034"></a>
-<span class="sourceLineNo">5035</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5035"></a>
-<span class="sourceLineNo">5036</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.5036"></a>
-<span class="sourceLineNo">5037</span>    assertTrue(hasNext);<a name="line.5037"></a>
-<span class="sourceLineNo">5038</span>    currRow.clear();<a name="line.5038"></a>
-<span class="sourceLineNo">5039</span>    hasNext = scanner.next(currRow);<a name="line.5039"></a>
-<span class="sourceLineNo">5040</span>    assertEquals(1, currRow.size());<a name="line.5040"></a>
-<span class="sourceLineNo">5041</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5041"></a>
-<span class="sourceLineNo">5042</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.5042"></a>
-<span class="sourceLineNo">5043</span>    assertTrue(hasNext);<a name="line.5043"></a>
-<span class="sourceLineNo">5044</span>    currRow.clear();<a name="line.5044"></a>
-<span class="sourceLineNo">5045</span>    hasNext = scanner.next(currRow);<a name="line.5045"></a>
-<span class="sourceLineNo">5046</span>    assertEquals(1, currRow.size());<a name="line.5046"></a>
-<span class="sourceLineNo">5047</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5047"></a>
-<span class="sourceLineNo">5048</span>        .get(0).getRowLength(), rowA, 0, rowA.length));<a name="line.5048"></a>
-<span class="sourceLineNo">5049</span>    assertFalse(hasNext);<a name="line.5049"></a>
-<span class="sourceLineNo">5050</span>    scanner.close();<a name="line.5050"></a>
-<span class="sourceLineNo">5051</span>  }<a name="line.5051"></a>
-<span class="sourceLineNo">5052</span><a name="line.5052"></a>
-<span class="sourceLineNo">5053</span>  @Test<a name="line.5053"></a>
-<span class="sourceLineNo">5054</span>  public void testReverseScanner_moreRowsMayExistAfter() throws IOException {<a name="line.5054"></a>
-<span class="sourceLineNo">5055</span>    // case for "INCLUDE_AND_SEEK_NEXT_ROW &amp; SEEK_NEXT_ROW" endless loop<a name="line.5055"></a>
-<span class="sourceLineNo">5056</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.5056"></a>
-<span class="sourceLineNo">5057</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.5057"></a>
-<span class="sourceLineNo">5058</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.5058"></a>
-<span class="sourceLineNo">5059</span>    byte[] rowD = Bytes.toBytes("rowD");<a name="line.5059"></a>
-<span class="sourceLineNo">5060</span>    byte[] rowE = Bytes.toBytes("rowE");<a name="line.5060"></a>
-<span class="sourceLineNo">5061</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.5061"></a>
-<span class="sourceLineNo">5062</span>    byte[][] families = { cf };<a name="line.5062"></a>
-<span class="sourceLineNo">5063</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.5063"></a>
-<span class="sourceLineNo">5064</span>    byte[] col2 = Bytes.toBytes("col2");<a name="line.5064"></a>
-<span class="sourceLineNo">5065</span>    long ts = 1;<a name="line.5065"></a>
-<span class="sourceLineNo">5066</span>    this.region = initHRegion(tableName, method, families);<a name="line.5066"></a>
-<span class="sourceLineNo">5067</span>    KeyValue kv1 = new KeyValue(rowA, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5067"></a>
-<span class="sourceLineNo">5068</span>    KeyValue kv2 = new KeyValue(rowB, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5068"></a>
-<span class="sourceLineNo">5069</span>    KeyValue kv3 = new KeyValue(rowC, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5069"></a>
-<span class="sourceLineNo">5070</span>    KeyValue kv4_1 = new KeyValue(rowD, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5070"></a>
-<span class="sourceLineNo">5071</span>    KeyValue kv4_2 = new KeyValue(rowD, cf, col2, ts, KeyValue.Type.Put, null);<a name="line.5071"></a>
-<span class="sourceLineNo">5072</span>    KeyValue kv5 = new KeyValue(rowE, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5072"></a>
-<span class="sourceLineNo">5073</span>    Put put = null;<a name="line.5073"></a>
-<span class="sourceLineNo">5074</span>    put = new Put(rowA);<a name="line.5074"></a>
-<span class="sourceLineNo">5075</span>    put.add(kv1);<a name="line.5075"></a>
-<span class="sourceLineNo">5076</span>    region.put(put);<a name="line.5076"></a>
-<span class="sourceLineNo">5077</span>    put = new Put(rowB);<a name="line.5077"></a>
-<span class="sourceLineNo">5078</span>    put.add(kv2);<a name="line.5078"></a>
-<span class="sourceLineNo">5079</span>    region.put(put);<a name="line.5079"></a>
-<span class="sourceLineNo">5080</span>    put = new Put(rowC);<a name="line.5080"></a>
-<span class="sourceLineNo">5081</span>    put.add(kv3);<a name="line.5081"></a>
-<span class="sourceLineNo">5082</span>    region.put(put);<a name="line.5082"></a>
-<span class="sourceLineNo">5083</span>    put = new Put(rowD);<a name="line.5083"></a>
-<span class="sourceLineNo">5084</span>    put.add(kv4_1);<a name="line.5084"></a>
-<span class="sourceLineNo">5085</span>    region.put(put);<a name="line.5085"></a>
-<span class="sourceLineNo">5086</span>    put = new Put(rowD);<a name="line.5086"></a>
-<span class="sourceLineNo">5087</span>    put.add(kv4_2);<a name="line.5087"></a>
-<span class="sourceLineNo">5088</span>    region.put(put);<a name="line.5088"></a>
-<span class="sourceLineNo">5089</span>    put = new Put(rowE);<a name="line.5089"></a>
-<span class="sourceLineNo">5090</span>    put.add(kv5);<a name="line.5090"></a>
-<span class="sourceLineNo">5091</span>    region.put(put);<a name="line.5091"></a>
-<span class="sourceLineNo">5092</span>    region.flush(true);<a name="line.5092"></a>
-<span class="sourceLineNo">5093</span>    Scan scan = new Scan(rowD, rowA);<a name="line.5093"></a>
-<span class="sourceLineNo">5094</span>    scan.addColumn(families[0], col1);<a name="line.5094"></a>
-<span class="sourceLineNo">5095</span>    scan.setReversed(true);<a name="line.5095"></a>
-<span class="sourceLineNo">5096</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5096"></a>
-<span class="sourceLineNo">5097</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5097"></a>
-<span class="sourceLineNo">5098</span>    boolean hasNext = scanner.next(currRow);<a name="line.5098"></a>
-<span class="sourceLineNo">5099</span>    assertEquals(1, currRow.size());<a name="line.5099"></a>
-<span class="sourceLineNo">5100</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5100"></a>
-<span class="sourceLineNo">5101</span>        .get(0).getRowLength(), rowD, 0, rowD.length));<a name="line.5101"></a>
-<span class="sourceLineNo">5102</span>    assertTrue(hasNext);<a name="line.5102"></a>
-<span class="sourceLineNo">5103</span>    currRow.clear();<a name="line.5103"></a>
-<span class="sourceLineNo">5104</span>    hasNext = scanner.next(currRow);<a name="line.5104"></a>
-<span class="sourceLineNo">5105</span>    assertEquals(1, currRow.size());<a name="line.5105"></a>
-<span class="sourceLineNo">5106</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5106"></a>
-<span class="sourceLineNo">5107</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.5107"></a>
-<span class="sourceLineNo">5108</span>    assertTrue(hasNext);<a name="line.5108"></a>
-<span class="sourceLineNo">5109</span>    currRow.clear();<a name="line.5109"></a>
-<span class="sourceLineNo">5110</span>    hasNext = scanner.next(currRow);<a name="line.5110"></a>
-<span class="sourceLineNo">5111</span>    assertEquals(1, currRow.size());<a name="line.5111"></a>
-<span class="sourceLineNo">5112</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5112"></a>
-<span class="sourceLineNo">5113</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.5113"></a>
-<span class="sourceLineNo">5114</span>    assertFalse(hasNext);<a name="line.5114"></a>
-<span class="sourceLineNo">5115</span>    scanner.close();<a name="line.5115"></a>
-<span class="sourceLineNo">5116</span><a name="line.5116"></a>
-<span class="sourceLineNo">5117</span>    scan = new Scan(rowD, rowA);<a name="line.5117"></a>
-<span class="sourceLineNo">5118</span>    scan.addColumn(families[0], col2);<a name="line.5118"></a>
-<span class="sourceLineNo">5119</span>    scan.setReversed(true);<a name="line.5119"></a>
-<span class="sourceLineNo">5120</span>    currRow.clear();<a name="line.5120"></a>
-<span class="sourceLineNo">5121</span>    scanner = region.getScanner(scan);<a name="line.5121"></a>
-<span class="sourceLineNo">5122</span>    hasNext = scanner.next(currRow);<a name="line.5122"></a>
-<span class="sourceLineNo">5123</span>    assertEquals(1, currRow.size());<a name="line.5123"></a>
-<span class="sourceLineNo">5124</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5124"></a>
-<span class="sourceLineNo">5125</span>        .get(0).getRowLength(), rowD, 0, rowD.length));<a name="line.5125"></a>
-<span class="sourceLineNo">5126</span>    scanner.close();<a name="line.5126"></a>
-<span class="sourceLineNo">5127</span>  }<a name="line.5127"></a>
-<span class="sourceLineNo">5128</span><a name="line.5128"></a>
-<span class="sourceLineNo">5129</span>  @Test<a name="line.5129"></a>
-<span class="sourceLineNo">5130</span>  public void testReverseScanner_smaller_blocksize() throws IOException {<a name="line.5130"></a>
-<span class="sourceLineNo">5131</span>    // case to ensure no conflict with HFile index optimization<a name="line.5131"></a>
-<span class="sourceLineNo">5132</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.5132"></a>
-<span class="sourceLineNo">5133</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.5133"></a>
-<span class="sourceLineNo">5134</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.5134"></a>
-<span class="sourceLineNo">5135</span>    byte[] rowD = Bytes.toBytes("rowD");<a name="line.5135"></a>
-<span class="sourceLineNo">5136</span>    byte[] rowE = Bytes.toBytes("rowE");<a name="line.5136"></a>
-<span class="sourceLineNo">5137</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.5137"></a>
-<span class="sourceLineNo">5138</span>    byte[][] families = { cf };<a name="line.5138"></a>
-<span class="sourceLineNo">5139</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.5139"></a>
-<span class="sourceLineNo">5140</span>    byte[] col2 = Bytes.toBytes("col2");<a name="line.5140"></a>
-<span class="sourceLineNo">5141</span>    long ts = 1;<a name="line.5141"></a>
-<span class="sourceLineNo">5142</span>    HBaseConfiguration config = new HBaseConfiguration();<a name="line.5142"></a>
-<span class="sourceLineNo">5143</span>    config.setInt("test.block.size", 1);<a name="line.5143"></a>
-<span class="sourceLineNo">5144</span>    this.region = initHRegion(tableName, method, config, families);<a name="line.5144"></a>
-<span class="sourceLineNo">5145</span>    KeyValue kv1 = new KeyValue(rowA, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5145"></a>
-<span class="sourceLineNo">5146</span>    KeyValue kv2 = new KeyValue(rowB, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5146"></a>
-<span class="sourceLineNo">5147</span>    KeyValue kv3 = new KeyValue(rowC, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5147"></a>
-<span class="sourceLineNo">5148</span>    KeyValue kv4_1 = new KeyValue(rowD, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5148"></a>
-<span class="sourceLineNo">5149</span>    KeyValue kv4_2 = new KeyValue(rowD, cf, col2, ts, KeyValue.Type.Put, null);<a name="line.5149"></a>
-<span class="sourceLineNo">5150</span>    KeyValue kv5 = new KeyValue(rowE, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5150"></a>
-<span class="sourceLineNo">5151</span>    Put put = null;<a name="line.5151"></a>
-<span class="sourceLineNo">5152</span>    put = new Put(rowA);<a name="line.5152"></a>
-<span class="sourceLineNo">5153</span>    put.add(kv1);<a name="line.5153"></a>
-<span class="sourceLineNo">5154</span>    region.put(put);<a name="line.5154"></a>
-<span class="sourceLineNo">5155</span>    put = new Put(rowB);<a name="line.5155"></a>
-<span class="sourceLineNo">5156</span>    put.add(kv2);<a name="line.5156"></a>
-<span class="sourceLineNo">5157</span>    region.put(put);<a name="line.5157"></a>
-<span class="sourceLineNo">5158</span>    put = new Put(rowC);<a name="line.5158"></a>
-<span class="sourceLineNo">5159</span>    put.add(kv3);<a name="line.5159"></a>
-<span class="sourceLineNo">5160</span>    region.put(put);<a name="line.5160"></a>
-<span class="sourceLineNo">5161</span>    put = new Put(rowD);<a name="line.5161"></a>
-<span class="sourceLineNo">5162</span>    put.add(kv4_1);<a name="line.5162"></a>
-<span class="sourceLineNo">5163</span>    region.put(put);<a name="line.5163"></a>
-<span class="sourceLineNo">5164</span>    put = new Put(rowD);<a name="line.5164"></a>
-<span class="sourceLineNo">5165</span>    put.add(kv4_2);<a name="line.5165"></a>
-<span class="sourceLineNo">5166</span>    region.put(put);<a name="line.5166"></a>
-<span class="sourceLineNo">5167</span>    put = new Put(rowE);<a name="line.5167"></a>
-<span class="sourceLineNo">5168</span>    put.add(kv5);<a name="line.5168"></a>
-<span class="sourceLineNo">5169</span>    region.put(put);<a name="line.5169"></a>
-<span class="sourceLineNo">5170</span>    region.flush(true);<a name="line.5170"></a>
-<span class="sourceLineNo">5171</span>    Scan scan = new Scan(rowD, rowA);<a name="line.5171"></a>
-<span class="sourceLineNo">5172</span>    scan.addColumn(families[0], col1);<a name="line.5172"></a>
-<span class="sourceLineNo">5173</span>    scan.setReversed(true);<a name="line.5173"></a>
-<span class="sourceLineNo">5174</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5174"></a>
-<span class="sourceLineNo">5175</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5175"></a>
-<span class="sourceLineNo">5176</span>    boolean hasNext = scanner.next(currRow);<a name="line.5176"></a>
-<span class="sourceLineNo">5177</span>    assertEquals(1, currRow.size());<a name="line.5177"></a>
-<span class="sourceLineNo">5178</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5178"></a>
-<span class="sourceLineNo">5179</span>        .get(0).getRowLength(), rowD, 0, rowD.length));<a name="line.5179"></a>
-<span class="sourceLineNo">5180</span>    assertTrue(hasNext);<a name="line.5180"></a>
-<span class="sourceLineNo">5181</span>    currRow.clear();<a name="line.5181"></a>
-<span class="sourceLineNo">5182</span>    hasNext = scanner.next(currRow);<a name="line.5182"></a>
-<span class="sourceLineNo">5183</span>    assertEquals(1, currRow.size());<a name="line.5183"></a>
-<span class="sourceLineNo">5184</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5184"></a>
-<span class="sourceLineNo">5185</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.5185"></a>
-<span class="sourceLineNo">5186</span>    assertTrue(hasNext);<a name="line.5186"></a>
-<span class="sourceLineNo">5187</span>    currRow.clear();<a name="line.5187"></a>
-<span class="sourceLineNo">5188</span>    hasNext = scanner.next(currRow);<a name="line.5188"></a>
-<span class="sourceLineNo">5189</span>    assertEquals(1, currRow.size());<a name="line.5189"></a>
-<span class="sourceLineNo">5190</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5190"></a>
-<span class="sourceLineNo">5191</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.5191"></a>
-<span class="sourceLineNo">5192</span>    assertFalse(hasNext);<a name="line.5192"></a>
-<span class="sourceLineNo">5193</span>    scanner.close();<a name="line.5193"></a>
-<span class="sourceLineNo">5194</span><a name="line.5194"></a>
-<span class="sourceLineNo">5195</span>    scan = new Scan(rowD, rowA);<a name="line.5195"></a>
-<span class="sourceLineNo">5196</span>    scan.addColumn(families[0], col2);<a name="line.5196"></a>
-<span class="sourceLineNo">5197</span>    scan.setReversed(true);<a name="line.5197"></a>
-<span class="sourceLineNo">5198</span>    currRow.clear();<a name="line.5198"></a>
-<span class="sourceLineNo">5199</span>    scanner = region.getScanner(scan);<a name="line.5199"></a>
-<span class="sourceLineNo">5200</span>    hasNext = scanner.next(currRow);<a name="line.5200"></a>
-<span class="sourceLineNo">5201</span>    assertEquals(1, currRow.size());<a name="line.5201"></a>
-<span class="sourceLineNo">5202</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5202"></a>
-<span class="sourceLineNo">5203</span>        .get(0).getRowLength(), rowD, 0, rowD.length));<a name="line.5203"></a>
-<span class="sourceLineNo">5204</span>    scanner.close();<a name="line.5204"></a>
-<span class="sourceLineNo">5205</span>  }<a name="line.5205"></a>
-<span class="sourceLineNo">5206</span><a name="line.5206"></a>
-<span class="sourceLineNo">5207</span>  @Test<a name="line.5207"></a>
-<span class="sourceLineNo">5208</span>  public void testReverseScanner_FromMemStoreAndHFiles_MultiCFs1()<a name="line.5208"></a>
-<span class="sourceLineNo">5209</span>      throws IOException {<a name="line.5209"></a>
-<span class="sourceLineNo">5210</span>    byte[] row0 = Bytes.toBytes("row0"); // 1 kv<a name="line.5210"></a>
-<span class="sourceLineNo">5211</span>    byte[] row1 = Bytes.toBytes("row1"); // 2 kv<a name="line.5211"></a>
-<span class="sourceLineNo">5212</span>    byte[] row2 = Bytes.toBytes("row2"); // 4 kv<a name="line.5212"></a>
-<span class="sourceLineNo">5213</span>    byte[] row3 = Bytes.toBytes("row3"); // 2 kv<a name="line.5213"></a>
-<span class="sourceLineNo">5214</span>    byte[] row4 = Bytes.toBytes("row4"); // 5 kv<a name="line.5214"></a>
-<span class="sourceLineNo">5215</span>    byte[] row5 = Bytes.toBytes("row5"); // 2 kv<a name="line.5215"></a>
-<span class="sourceLineNo">5216</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5216"></a>
-<span class="sourceLineNo">5217</span>    byte[] cf2 = Bytes.toBytes("CF2");<a name="line.5217"></a>
-<span class="sourceLineNo">5218</span>    byte[] cf3 = Bytes.toBytes("CF3");<a name="line.5218"></a>
-<span class="sourceLineNo">5219</span>    byte[][] families = { cf1, cf2, cf3 };<a name="line.5219"></a>
-<span class="sourceLineNo">5220</span>    byte[] col = Bytes.toBytes("C");<a name="line.5220"></a>
-<span class="sourceLineNo">5221</span>    long ts = 1;<a name="line.5221"></a>
-<span class="sourceLineNo">5222</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5222"></a>
-<span class="sourceLineNo">5223</span>    // disable compactions in this test.<a name="line.5223"></a>
-<span class="sourceLineNo">5224</span>    conf.setInt("hbase.hstore.compactionThreshold", 10000);<a name="line.5224"></a>
-<span class="sourceLineNo">5225</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5225"></a>
-<span class="sourceLineNo">5226</span>    // kv naming style: kv(row number) totalKvCountInThisRow seq no<a name="line.5226"></a>
-<span class="sourceLineNo">5227</span>    KeyValue kv0_1_1 = new KeyValue(row0, cf1, col, ts, KeyValue.Type.Put,<a name="line.5227"></a>
-<span class="sourceLineNo">5228</span>        null);<a name="line.5228"></a>
-<span class="sourceLineNo">5229</span>    KeyValue kv1_2_1 = new KeyValue(row1, cf2, col, ts, KeyValue.Type.Put,<a name="line.5229"></a>
-<span class="sourceLineNo">5230</span>        null);<a name="line.5230"></a>
-<span class="sourceLineNo">5231</span>    KeyValue kv1_2_2 = new KeyValue(row1, cf1, col, ts + 1,<a name="line.5231"></a>
-<span class="sourceLineNo">5232</span>        KeyValue.Type.Put, null);<a name="line.5232"></a>
-<span class="sourceLineNo">5233</span>    KeyValue kv2_4_1 = new KeyValue(row2, cf2, col, ts, KeyValue.Type.Put,<a name="line.5233"></a>
-<span class="sourceLineNo">5234</span>        null);<a name="line.5234"></a>
-<span class="sourceLineNo">5235</span>    KeyValue kv2_4_2 = new KeyValue(row2, cf1, col, ts, KeyValue.Type.Put,<a name="line.5235"></a>
-<span class="sourceLineNo">5236</span>        null);<a name="line.5236"></a>
-<span class="sourceLineNo">5237</span>    KeyValue kv2_4_3 = new KeyValue(row2, cf3, col, ts, KeyValue.Type.Put,<a name="line.5237"></a>
+<span class="sourceLineNo">4882</span>  public HRegion initHRegion(TableName tableName, byte[] startKey, byte[] stopKey,<a name="line.4882"></a>
+<span class="sourceLineNo">4883</span>      boolean isReadOnly, Durability durability, WAL wal, byte[]... families) throws IOException {<a name="line.4883"></a>
+<span class="sourceLineNo">4884</span>    return TEST_UTIL.createLocalHRegion(tableName, startKey, stopKey,<a name="line.4884"></a>
+<span class="sourceLineNo">4885</span>        isReadOnly, durability, wal, families);<a name="line.4885"></a>
+<span class="sourceLineNo">4886</span>  }<a name="line.4886"></a>
+<span class="sourceLineNo">4887</span><a name="line.4887"></a>
+<span class="sourceLineNo">4888</span>  /**<a name="line.4888"></a>
+<span class="sourceLineNo">4889</span>   * Assert that the passed in Cell has expected contents for the specified row,<a name="line.4889"></a>
+<span class="sourceLineNo">4890</span>   * column &amp; timestamp.<a name="line.4890"></a>
+<span class="sourceLineNo">4891</span>   */<a name="line.4891"></a>
+<span class="sourceLineNo">4892</span>  private void checkOneCell(Cell kv, byte[] cf, int rowIdx, int colIdx, long ts) {<a name="line.4892"></a>
+<span class="sourceLineNo">4893</span>    String ctx = "rowIdx=" + rowIdx + "; colIdx=" + colIdx + "; ts=" + ts;<a name="line.4893"></a>
+<span class="sourceLineNo">4894</span>    assertEquals("Row mismatch which checking: " + ctx, "row:" + rowIdx,<a name="line.4894"></a>
+<span class="sourceLineNo">4895</span>        Bytes.toString(CellUtil.cloneRow(kv)));<a name="line.4895"></a>
+<span class="sourceLineNo">4896</span>    assertEquals("ColumnFamily mismatch while checking: " + ctx, Bytes.toString(cf),<a name="line.4896"></a>
+<span class="sourceLineNo">4897</span>        Bytes.toString(CellUtil.cloneFamily(kv)));<a name="line.4897"></a>
+<span class="sourceLineNo">4898</span>    assertEquals("Column qualifier mismatch while checking: " + ctx, "column:" + colIdx,<a name="line.4898"></a>
+<span class="sourceLineNo">4899</span>        Bytes.toString(CellUtil.cloneQualifier(kv)));<a name="line.4899"></a>
+<span class="sourceLineNo">4900</span>    assertEquals("Timestamp mismatch while checking: " + ctx, ts, kv.getTimestamp());<a name="line.4900"></a>
+<span class="sourceLineNo">4901</span>    assertEquals("Value mismatch while checking: " + ctx, "value-version-" + ts,<a name="line.4901"></a>
+<span class="sourceLineNo">4902</span>        Bytes.toString(CellUtil.cloneValue(kv)));<a name="line.4902"></a>
+<span class="sourceLineNo">4903</span>  }<a name="line.4903"></a>
+<span class="sourceLineNo">4904</span><a name="line.4904"></a>
+<span class="sourceLineNo">4905</span>  @Test<a name="line.4905"></a>
+<span class="sourceLineNo">4906</span>  public void testReverseScanner_FromMemStore_SingleCF_Normal()<a name="line.4906"></a>
+<span class="sourceLineNo">4907</span>      throws IOException {<a name="line.4907"></a>
+<span class="sourceLineNo">4908</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.4908"></a>
+<span class="sourceLineNo">4909</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.4909"></a>
+<span class="sourceLineNo">4910</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.4910"></a>
+<span class="sourceLineNo">4911</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.4911"></a>
+<span class="sourceLineNo">4912</span>    byte[][] families = { cf };<a name="line.4912"></a>
+<span class="sourceLineNo">4913</span>    byte[] col = Bytes.toBytes("C");<a name="line.4913"></a>
+<span class="sourceLineNo">4914</span>    long ts = 1;<a name="line.4914"></a>
+<span class="sourceLineNo">4915</span>    this.region = initHRegion(tableName, method, families);<a name="line.4915"></a>
+<span class="sourceLineNo">4916</span>    KeyValue kv1 = new KeyValue(rowC, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4916"></a>
+<span class="sourceLineNo">4917</span>    KeyValue kv11 = new KeyValue(rowC, cf, col, ts + 1, KeyValue.Type.Put,<a name="line.4917"></a>
+<span class="sourceLineNo">4918</span>        null);<a name="line.4918"></a>
+<span class="sourceLineNo">4919</span>    KeyValue kv2 = new KeyValue(rowA, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4919"></a>
+<span class="sourceLineNo">4920</span>    KeyValue kv3 = new KeyValue(rowB, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4920"></a>
+<span class="sourceLineNo">4921</span>    Put put = null;<a name="line.4921"></a>
+<span class="sourceLineNo">4922</span>    put = new Put(rowC);<a name="line.4922"></a>
+<span class="sourceLineNo">4923</span>    put.add(kv1);<a name="line.4923"></a>
+<span class="sourceLineNo">4924</span>    put.add(kv11);<a name="line.4924"></a>
+<span class="sourceLineNo">4925</span>    region.put(put);<a name="line.4925"></a>
+<span class="sourceLineNo">4926</span>    put = new Put(rowA);<a name="line.4926"></a>
+<span class="sourceLineNo">4927</span>    put.add(kv2);<a name="line.4927"></a>
+<span class="sourceLineNo">4928</span>    region.put(put);<a name="line.4928"></a>
+<span class="sourceLineNo">4929</span>    put = new Put(rowB);<a name="line.4929"></a>
+<span class="sourceLineNo">4930</span>    put.add(kv3);<a name="line.4930"></a>
+<span class="sourceLineNo">4931</span>    region.put(put);<a name="line.4931"></a>
+<span class="sourceLineNo">4932</span><a name="line.4932"></a>
+<span class="sourceLineNo">4933</span>    Scan scan = new Scan(rowC);<a name="line.4933"></a>
+<span class="sourceLineNo">4934</span>    scan.setMaxVersions(5);<a name="line.4934"></a>
+<span class="sourceLineNo">4935</span>    scan.setReversed(true);<a name="line.4935"></a>
+<span class="sourceLineNo">4936</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.4936"></a>
+<span class="sourceLineNo">4937</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.4937"></a>
+<span class="sourceLineNo">4938</span>    boolean hasNext = scanner.next(currRow);<a name="line.4938"></a>
+<span class="sourceLineNo">4939</span>    assertEquals(2, currRow.size());<a name="line.4939"></a>
+<span class="sourceLineNo">4940</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4940"></a>
+<span class="sourceLineNo">4941</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.4941"></a>
+<span class="sourceLineNo">4942</span>    assertTrue(hasNext);<a name="line.4942"></a>
+<span class="sourceLineNo">4943</span>    currRow.clear();<a name="line.4943"></a>
+<span class="sourceLineNo">4944</span>    hasNext = scanner.next(currRow);<a name="line.4944"></a>
+<span class="sourceLineNo">4945</span>    assertEquals(1, currRow.size());<a name="line.4945"></a>
+<span class="sourceLineNo">4946</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4946"></a>
+<span class="sourceLineNo">4947</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.4947"></a>
+<span class="sourceLineNo">4948</span>    assertTrue(hasNext);<a name="line.4948"></a>
+<span class="sourceLineNo">4949</span>    currRow.clear();<a name="line.4949"></a>
+<span class="sourceLineNo">4950</span>    hasNext = scanner.next(currRow);<a name="line.4950"></a>
+<span class="sourceLineNo">4951</span>    assertEquals(1, currRow.size());<a name="line.4951"></a>
+<span class="sourceLineNo">4952</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4952"></a>
+<span class="sourceLineNo">4953</span>        .get(0).getRowLength(), rowA, 0, rowA.length));<a name="line.4953"></a>
+<span class="sourceLineNo">4954</span>    assertFalse(hasNext);<a name="line.4954"></a>
+<span class="sourceLineNo">4955</span>    scanner.close();<a name="line.4955"></a>
+<span class="sourceLineNo">4956</span>  }<a name="line.4956"></a>
+<span class="sourceLineNo">4957</span><a name="line.4957"></a>
+<span class="sourceLineNo">4958</span>  @Test<a name="line.4958"></a>
+<span class="sourceLineNo">4959</span>  public void testReverseScanner_FromMemStore_SingleCF_LargerKey()<a name="line.4959"></a>
+<span class="sourceLineNo">4960</span>      throws IOException {<a name="line.4960"></a>
+<span class="sourceLineNo">4961</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.4961"></a>
+<span class="sourceLineNo">4962</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.4962"></a>
+<span class="sourceLineNo">4963</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.4963"></a>
+<span class="sourceLineNo">4964</span>    byte[] rowD = Bytes.toBytes("rowD");<a name="line.4964"></a>
+<span class="sourceLineNo">4965</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.4965"></a>
+<span class="sourceLineNo">4966</span>    byte[][] families = { cf };<a name="line.4966"></a>
+<span class="sourceLineNo">4967</span>    byte[] col = Bytes.toBytes("C");<a name="line.4967"></a>
+<span class="sourceLineNo">4968</span>    long ts = 1;<a name="line.4968"></a>
+<span class="sourceLineNo">4969</span>    this.region = initHRegion(tableName, method, families);<a name="line.4969"></a>
+<span class="sourceLineNo">4970</span>    KeyValue kv1 = new KeyValue(rowC, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4970"></a>
+<span class="sourceLineNo">4971</span>    KeyValue kv11 = new KeyValue(rowC, cf, col, ts + 1, KeyValue.Type.Put,<a name="line.4971"></a>
+<span class="sourceLineNo">4972</span>        null);<a name="line.4972"></a>
+<span class="sourceLineNo">4973</span>    KeyValue kv2 = new KeyValue(rowA, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4973"></a>
+<span class="sourceLineNo">4974</span>    KeyValue kv3 = new KeyValue(rowB, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4974"></a>
+<span class="sourceLineNo">4975</span>    Put put = null;<a name="line.4975"></a>
+<span class="sourceLineNo">4976</span>    put = new Put(rowC);<a name="line.4976"></a>
+<span class="sourceLineNo">4977</span>    put.add(kv1);<a name="line.4977"></a>
+<span class="sourceLineNo">4978</span>    put.add(kv11);<a name="line.4978"></a>
+<span class="sourceLineNo">4979</span>    region.put(put);<a name="line.4979"></a>
+<span class="sourceLineNo">4980</span>    put = new Put(rowA);<a name="line.4980"></a>
+<span class="sourceLineNo">4981</span>    put.add(kv2);<a name="line.4981"></a>
+<span class="sourceLineNo">4982</span>    region.put(put);<a name="line.4982"></a>
+<span class="sourceLineNo">4983</span>    put = new Put(rowB);<a name="line.4983"></a>
+<span class="sourceLineNo">4984</span>    put.add(kv3);<a name="line.4984"></a>
+<span class="sourceLineNo">4985</span>    region.put(put);<a name="line.4985"></a>
+<span class="sourceLineNo">4986</span><a name="line.4986"></a>
+<span class="sourceLineNo">4987</span>    Scan scan = new Scan(rowD);<a name="line.4987"></a>
+<span class="sourceLineNo">4988</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.4988"></a>
+<span class="sourceLineNo">4989</span>    scan.setReversed(true);<a name="line.4989"></a>
+<span class="sourceLineNo">4990</span>    scan.setMaxVersions(5);<a name="line.4990"></a>
+<span class="sourceLineNo">4991</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.4991"></a>
+<span class="sourceLineNo">4992</span>    boolean hasNext = scanner.next(currRow);<a name="line.4992"></a>
+<span class="sourceLineNo">4993</span>    assertEquals(2, currRow.size());<a name="line.4993"></a>
+<span class="sourceLineNo">4994</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4994"></a>
+<span class="sourceLineNo">4995</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.4995"></a>
+<span class="sourceLineNo">4996</span>    assertTrue(hasNext);<a name="line.4996"></a>
+<span class="sourceLineNo">4997</span>    currRow.clear();<a name="line.4997"></a>
+<span class="sourceLineNo">4998</span>    hasNext = scanner.next(currRow);<a name="line.4998"></a>
+<span class="sourceLineNo">4999</span>    assertEquals(1, currRow.size());<a name="line.4999"></a>
+<span class="sourceLineNo">5000</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5000"></a>
+<span class="sourceLineNo">5001</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.5001"></a>
+<span class="sourceLineNo">5002</span>    assertTrue(hasNext);<a name="line.5002"></a>
+<span class="sourceLineNo">5003</span>    currRow.clear();<a name="line.5003"></a>
+<span class="sourceLineNo">5004</span>    hasNext = scanner.next(currRow);<a name="line.5004"></a>
+<span class="sourceLineNo">5005</span>    assertEquals(1, currRow.size());<a name="line.5005"></a>
+<span class="sourceLineNo">5006</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5006"></a>
+<span class="sourceLineNo">5007</span>        .get(0).getRowLength(), rowA, 0, rowA.length));<a name="line.5007"></a>
+<span class="sourceLineNo">5008</span>    assertFalse(hasNext);<a name="line.5008"></a>
+<span class="sourceLineNo">5009</span>    scanner.close();<a name="line.5009"></a>
+<span class="sourceLineNo">5010</span>  }<a name="line.5010"></a>
+<span class="sourceLineNo">5011</span><a name="line.5011"></a>
+<span class="sourceLineNo">5012</span>  @Test<a name="line.5012"></a>
+<span class="sourceLineNo">5013</span>  public void testReverseScanner_FromMemStore_SingleCF_FullScan()<a name="line.5013"></a>
+<span class="sourceLineNo">5014</span>      throws IOException {<a name="line.5014"></a>
+<span class="sourceLineNo">5015</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.5015"></a>
+<span class="sourceLineNo">5016</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.5016"></a>
+<span class="sourceLineNo">5017</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.5017"></a>
+<span class="sourceLineNo">5018</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.5018"></a>
+<span class="sourceLineNo">5019</span>    byte[][] families = { cf };<a name="line.5019"></a>
+<span class="sourceLineNo">5020</span>    byte[] col = Bytes.toBytes("C");<a name="line.5020"></a>
+<span class="sourceLineNo">5021</span>    long ts = 1;<a name="line.5021"></a>
+<span class="sourceLineNo">5022</span>    this.region = initHRegion(tableName, method, families);<a name="line.5022"></a>
+<span class="sourceLineNo">5023</span>    KeyValue kv1 = new KeyValue(rowC, cf, col, ts, KeyValue.Type.Put, null);<a name="line.5023"></a>
+<span class="sourceLineNo">5024</span>    KeyValue kv11 = new KeyValue(rowC, cf, col, ts + 1, KeyValue.Type.Put,<a name="line.5024"></a>
+<span class="sourceLineNo">5025</span>        null);<a name="line.5025"></a>
+<span class="sourceLineNo">5026</span>    KeyValue kv2 = new KeyValue(rowA, cf, col, ts, KeyValue.Type.Put, null);<a name="line.5026"></a>
+<span class="sourceLineNo">5027</span>    KeyValue kv3 = new KeyValue(rowB, cf, col, ts, KeyValue.Type.Put, null);<a name="line.5027"></a>
+<span class="sourceLineNo">5028</span>    Put put = null;<a name="line.5028"></a>
+<span class="sourceLineNo">5029</span>    put = new Put(rowC);<a name="line.5029"></a>
+<span class="sourceLineNo">5030</span>    put.add(kv1);<a name="line.5030"></a>
+<span class="sourceLineNo">5031</span>    put.add(kv11);<a name="line.5031"></a>
+<span class="sourceLineNo">5032</span>    region.put(put);<a name="line.5032"></a>
+<span class="sourceLineNo">5033</span>    put = new Put(rowA);<a name="line.5033"></a>
+<span class="sourceLineNo">5034</span>    put.add(kv2);<a name="line.5034"></a>
+<span class="sourceLineNo">5035</span>    region.put(put);<a name="line.5035"></a>
+<span class="sourceLineNo">5036</span>    put = new Put(rowB);<a name="line.5036"></a>
+<span class="sourceLineNo">5037</span>    put.add(kv3);<a name="line.5037"></a>
+<span class="sourceLineNo">5038</span>    region.put(put);<a name="line.5038"></a>
+<span class="sourceLineNo">5039</span>    Scan scan = new Scan();<a name="line.5039"></a>
+<span class="sourceLineNo">5040</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5040"></a>
+<span class="sourceLineNo">5041</span>    scan.setReversed(true);<a name="line.5041"></a>
+<span class="sourceLineNo">5042</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5042"></a>
+<span class="sourceLineNo">5043</span>    boolean hasNext = scanner.next(currRow);<a name="line.5043"></a>
+<span class="sourceLineNo">5044</span>    assertEquals(1, currRow.size());<a name="line.5044"></a>
+<span class="sourceLineNo">5045</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5045"></a>
+<span class="sourceLineNo">5046</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.5046"></a>
+<span class="sourceLineNo">5047</span>    assertTrue(hasNext);<a name="line.5047"></a>
+<span class="sourceLineNo">5048</span>    currRow.clear();<a name="line.5048"></a>
+<span class="sourceLineNo">5049</span>    hasNext = scanner.next(currRow);<a name="line.5049"></a>
+<span class="sourceLineNo">5050</span>    assertEquals(1, currRow.size());<a name="line.5050"></a>
+<span class="sourceLineNo">5051</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5051"></a>
+<span class="sourceLineNo">5052</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.5052"></a>
+<span class="sourceLineNo">5053</span>    assertTrue(hasNext);<a name="line.5053"></a>
+<span class="sourceLineNo">5054</span>    currRow.clear();<a name="line.5054"></a>
+<span class="sourceLineNo">5055</span>    hasNext = scanner.next(currRow);<a name="line.5055"></a>
+<span class="sourceLineNo">5056</span>    assertEquals(1, currRow.size());<a name="line.5056"></a>
+<span class="sourceLineNo">5057</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5057"></a>
+<span class="sourceLineNo">5058</span>        .get(0).getRowLength(), rowA, 0, rowA.length));<a name="line.5058"></a>
+<span class="sourceLineNo">5059</span>    assertFalse(hasNext);<a name="line.5059"></a>
+<span class="sourceLineNo">5060</span>    scanner.close();<a name="line.5060"></a>
+<span class="sourceLineNo">5061</span>  }<a name="line.5061"></a>
+<span class="sourceLineNo">5062</span><a name="line.5062"></a>
+<span class="sourceLineNo">5063</span>  @Test<a name="line.5063"></a>
+<span class="sourceLineNo">5064</span>  public void testReverseScanner_moreRowsMayExistAfter() throws IOException {<a name="line.5064"></a>
+<span class="sourceLineNo">5065</span>    // case for "INCLUDE_AND_SEEK_NEXT_ROW &amp; SEEK_NEXT_ROW" endless loop<a name="line.5065"></a>
+<span class="sourceLineNo">5066</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.5066"></a>
+<span class="sourceLineNo">5067</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.5067"></a>
+<span class="sourceLineNo">5068</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.5068"></a>
+<span class="sourceLineNo">5069</span>    byte[] rowD = Bytes.toBytes("rowD");<a name="line.5069"></a>
+<span class="sourceLineNo">5070</span>    byte[] rowE = Bytes.toBytes("rowE");<a name="line.5070"></a>
+<span class="sourceLineNo">5071</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.5071"></a>
+<span class="sourceLineNo">5072</span>    byte[][] families = { cf };<a name="line.5072"></a>
+<span class="sourceLineNo">5073</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.5073"></a>
+<span class="sourceLineNo">5074</span>    byte[] col2 = Bytes.toBytes("col2");<a name="line.5074"></a>
+<span class="sourceLineNo">5075</span>    long ts = 1;<a name="line.5075"></a>
+<span class="sourceLineNo">5076</span>    this.region = initHRegion(tableName, method, families);<a name="line.5076"></a>
+<span class="sourceLineNo">5077</span>    KeyValue kv1 = new KeyValue(rowA, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5077"></a>
+<span class="sourceLineNo">5078</span>    KeyValue kv2 = new KeyValue(rowB, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5078"></a>
+<span class="sourceLineNo">5079</span>    KeyValue kv3 = new KeyValue(rowC, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5079"></a>
+<span class="sourceLineNo">5080</span>    KeyValue kv4_1 = new KeyValue(rowD, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5080"></a>
+<span class="sourceLineNo">5081</span>    KeyValue kv4_2 = new KeyValue(rowD, cf, col2, ts, KeyValue.Type.Put, null);<a name="line.5081"></a>
+<span class="sourceLineNo">5082</span>    KeyValue kv5 = new KeyValue(rowE, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5082"></a>
+<span class="sourceLineNo">5083</span>    Put put = null;<a name="line.5083"></a>
+<span class="sourceLineNo">5084</span>    put = new Put(rowA);<a name="line.5084"></a>
+<span class="sourceLineNo">5085</span>    put.add(kv1);<a name="line.5085"></a>
+<span class="sourceLineNo">5086</span>    region.put(put);<a name="line.5086"></a>
+<span class="sourceLineNo">5087</span>    put = new Put(rowB);<a name="line.5087"></a>
+<span class="sourceLineNo">5088</span>    put.add(kv2);<a name="line.5088"></a>
+<span class="sourceLineNo">5089</span>    region.put(put);<a name="line.5089"></a>
+<span class="sourceLineNo">5090</span>    put = new Put(rowC);<a name="line.5090"></a>
+<span class="sourceLineNo">5091</span>    put.add(kv3);<a name="line.5091"></a>
+<span class="sourceLineNo">5092</span>    region.put(put);<a name="line.5092"></a>
+<span class="sourceLineNo">5093</span>    put = new Put(rowD);<a name="line.5093"></a>
+<span class="sourceLineNo">5094</span>    put.add(kv4_1);<a name="line.5094"></a>
+<span class="sourceLineNo">5095</span>    region.put(put);<a name="line.5095"></a>
+<span class="sourceLineNo">5096</span>    put = new Put(rowD);<a name="line.5096"></a>
+<span class="sourceLineNo">5097</span>    put.add(kv4_2);<a name="line.5097"></a>
+<span class="sourceLineNo">5098</span>    region.put(put);<a name="line.5098"></a>
+<span class="sourceLineNo">5099</span>    put = new Put(rowE);<a name="line.5099"></a>
+<span class="sourceLineNo">5100</span>    put.add(kv5);<a name="line.5100"></a>
+<span class="sourceLineNo">5101</span>    region.put(put);<a name="line.5101"></a>
+<span class="sourceLineNo">5102</span>    region.flush(true);<a name="line.5102"></a>
+<span class="sourceLineNo">5103</span>    Scan scan = new Scan(rowD, rowA);<a name="line.5103"></a>
+<span class="sourceLineNo">5104</span>    scan.addColumn(families[0], col1);<a name="line.5104"></a>
+<span class="sourceLineNo">5105</span>    scan.setReversed(true);<a name="line.5105"></a>
+<span class="sourceLineNo">5106</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5106"></a>
+<span class="sourceLineNo">5107</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5107"></a>
+<span class="sourceLineNo">5108</span>    boolean hasNext = scanner.next(currRow);<a name="line.5108"></a>
+<span class="sourceLineNo">5109</span>    assertEquals(1, currRow.size());<a name="line.5109"></a>
+<span class="sourceLineNo">5110</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5110"></a>
+<span class="sourceLineNo">5111</span>        .get(0).getRowLength(), rowD, 0, rowD.length));<a name="line.5111"></a>
+<span class="sourceLineNo">5112</span>    assertTrue(hasNext);<a name="line.5112"></a>
+<span class="sourceLineNo">5113</span>    currRow.clear();<a name="line.5113"></a>
+<span class="sourceLineNo">5114</span>    hasNext = scanner.next(currRow);<a name="line.5114"></a>
+<span class="sourceLineNo">5115</span>    assertEquals(1, currRow.size());<a name="line.5115"></a>
+<span class="sourceLineNo">5116</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5116"></a>
+<span class="sourceLineNo">5117</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.5117"></a>
+<span class="sourceLineNo">5118</span>    assertTrue(hasNext);<a name="line.5118"></a>
+<span class="sourceLineNo">5119</span>    currRow.clear();<a name="line.5119"></a>
+<span class="sourceLineNo">5120</span>    hasNext = scanner.next(currRow);<a name="line.5120"></a>
+<span class="sourceLineNo">5121</span>    assertEquals(1, currRow.size());<a name="line.5121"></a>
+<span class="sourceLineNo">5122</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5122"></a>
+<span class="sourceLineNo">5123</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.5123"></a>
+<span class="sourceLineNo">5124</span>    assertFalse(hasNext);<a name="line.5124"></a>
+<span class="sourceLineNo">5125</span>    scanner.close();<a name="line.5125"></a>
+<span class="sourceLineNo">5126</span><a name="line.5126"></a>
+<span class="sourceLineNo">5127</span>    scan = new Scan(rowD, rowA);<a name="line.5127"></a>
+<span class="sourceLineNo">5128</span>    scan.addColumn(families[0], col2);<a name="line.5128"></a>
+<span class="sourceLineNo">5129</span>    scan.setReversed(true);<a name="line.5129"></a>
+<span class="sourceLineNo">5130</span>    currRow.clear();<a name="line.5130"></a>
+<span class="sourceLineNo">5131</span>    scanner = region.getScanner(scan);<a name="line.5131"></a>
+<span class="sourceLineNo">5132</span>    hasNext = scanner.next(currRow);<a name="line.5132"></a>
+<span class="sourceLineNo">5133</span>    assertEquals(1, currRow.size());<a name="line.5133"></a>
+<span class="sourceLineNo">5134</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5134"></a>
+<span class="sourceLineNo">5135</span>        .get(0).getRowLength(), rowD, 0, rowD.length));<a name="line.5135"></a>
+<span class="sourceLineNo">5136</span>    scanner.close();<a name="line.5136"></a>
+<span class="sourceLineNo">5137</span>  }<a name="line.5137"></a>
+<span class="sourceLineNo">5138</span><a name="line.5138"></a>
+<span class="sourceLineNo">5139</span>  @Test<a name="line.5139"></a>
+<span class="sourceLineNo">5140</span>  public void testReverseScanner_smaller_blocksize() throws IOException {<a name="line.5140"></a>
+<span class="sourceLineNo">5141</span>    // case to ensure no conflict with HFile index optimization<a name="line.5141"></a>
+<span class="sourceLineNo">5142</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.5142"></a>
+<span class="sourceLineNo">5143</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.5143"></a>
+<span class="sourceLineNo">5144</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.5144"></a>
+<span class="sourceLineNo">5145</span>    byte[] rowD = Bytes.toBytes("rowD");<a name="line.5145"></a>
+<span class="sourceLineNo">5146</span>    byte[] rowE = Bytes.toBytes("rowE");<a name="line.5146"></a>
+<span class="sourceLineNo">5147</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.5147"></a>
+<span class="sourceLineNo">5148</span>    byte[][] families = { cf };<a name="line.5148"></a>
+<span class="sourceLineNo">5149</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.5149"></a>
+<span class="sourceLineNo">5150</span>    byte[] col2 = Bytes.toBytes("col2");<a name="line.5150"></a>
+<span class="sourceLineNo">5151</span>    long ts = 1;<a name="line.5151"></a>
+<span class="sourceLineNo">5152</span>    HBaseConfiguration config = new HBaseConfiguration();<a name="line.5152"></a>
+<span class="sourceLineNo">5153</span>    config.setInt("test.block.size", 1);<a name="line.5153"></a>
+<span class="sourceLineNo">5154</span>    this.region = initHRegion(tableName, method, config, families);<a name="line.5154"></a>
+<span class="sourceLineNo">5155</span>    KeyValue kv1 = new KeyValue(rowA, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5155"></a>
+<span class="sourceLineNo">5156</span>    KeyValue kv2 = new KeyValue(rowB, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5156"></a>
+<span class="sourceLineNo">5157</span>    KeyValue kv3 = new KeyValue(rowC, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5157"></a>
+<span class="sourceLineNo">5158</span>    KeyValue kv4_1 = new KeyValue(rowD, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5158"></a>
+<span class="sourceLineNo">5159</span>    KeyValue kv4_2 = new KeyValue(rowD, cf, col2, ts, KeyValue.Type.Put, null);<a name="line.5159"></a>
+<span class="sourceLineNo">5160</span>    KeyValue kv5 = new KeyValue(rowE, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5160"></a>
+<span class="sourceLineNo">5161</span>    Put put = null;<a name="line.5161"></a>
+<span class="sourceLineNo">5162</span>    put = new Put(rowA);<a name="line.5162"></a>
+<span class="sourceLineNo">5163</span>    put.add(kv1);<a name="line.5163"></a>
+<span class="sourceLineNo">5164</span>    region.put(put);<a name="line.5164"></a>
+<span class="sourceLineNo">5165</span>    put = new Put(rowB);<a name="line.5165"></a>
+<span class="sourceLineNo">5166</span>    put.add(kv2);<a name="line.5166"></a>
+<span class="sourceLineNo">5167</span>    region.put(put);<a name="line.5167"></a>
+<span class="sourceLineNo">5168</span>    put = new Put(rowC);<a name="line.5168"></a>
+<span class="sourceLineNo">5169</span>    put.add(kv3);<a name="line.5169"></a>
+<span class="sourceLineNo">5170</span>    region.put(put);<a name="line.5170"></a>
+<span class="sourceLineNo">5171</span>    put = new Put(rowD);<a name="line.5171"></a>
+<span class="sourceLineNo">5172</span>    put.add(kv4_1);<a name="line.5172"></a>
+<span class="sourceLineNo">5173</span>    region.put(put);<a name="line.5173"></a>
+<span class="sourceLineNo">5174</span>    put = new Put(rowD);<a name="line.5174"></a>
+<span class="sourceLineNo">5175</span>    put.add(kv4_2);<a name="line.5175"></a>
+<span class="sourceLineNo">5176</span>    region.put(put);<a name="line.5176"></a>
+<span class="sourceLineNo">5177</span>    put = new Put(rowE);<a name="line.5177"></a>
+<span class="sourceLineNo">5178</span>    put.add(kv5);<a name="line.5178"></a>
+<span class="sourceLineNo">5179</span>    region.put(put);<a name="line.5179"></a>
+<span class="sourceLineNo">5180</span>    region.flush(true);<a name="line.5180"></a>
+<span class="sourceLineNo">5181</span>    Scan scan = new Scan(rowD, rowA);<a name="line.5181"></a>
+<span class="sourceLineNo">5182</span>    scan.addColumn(families[0], col1);<a name="line.5182"></a>
+<span class="sourceLineNo">5183</span>    scan.setReversed(true);<a name="line.5183"></a>
+<span class="sourceLineNo">5184</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5184"></a>
+<span class="sourceLineNo">5185</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5185"></a>
+<span class="sourceLineNo">5186</span>    boolean hasNext = scanner.next(currRow);<a name="line.5186"></a>
+<span class="sourceLineNo">5187</span>    assertEquals(1, currRow.size());<a name="line.5187"></a>
+<span class="sourceLineNo">5188</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5188"></a>
+<span class="sourceLineNo">5189</span>        .get(0).getRowLength(), rowD, 0, rowD.length));<a name="line.5189"></a>
+<span class="sourceLineNo">5190</span>    assertTrue(hasNext);<a name="line.5190"></a>
+<span class="sourceLineNo">5191</span>    currRow.clear();<a name="line.5191"></a>
+<span class="sourceLineNo">5192</span>    hasNext = scanner.next(currRow);<a name="line.5192"></a>
+<span class="sourceLineNo">5193</span>    assertEquals(1, currRow.size());<a name="line.5193"></a>
+<span class="sourceLineNo">5194</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5194"></a>
+<span class="sourceLineNo">5195</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.5195"></a>
+<span class="sourceLineNo">5196</span>    assertTrue(hasNext);<a name="line.5196"></a>
+<span class="sourceLineNo">5197</span>    currRow.clear();<a name="line.5197"></a>
+<span class="sourceLineNo">5198</span>    hasNext = scanner.next(currRow);<a name="line.5198"></a>
+<span class="sourceLineNo">5199</span>    assertEquals(1, currRow.size());<a name="line.5199"></a>
+<span class="sourceLineNo">5200</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5200"></a>
+<span class="sourceLineNo">5201</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.5201"></a>
+<span class="sourceLineNo">5202</span>    assertFalse(hasNext);<a name="line.5202"></a>
+<span class="sourceLineNo">5203</span>    scanner.close();<a name="line.5203"></a>
+<span class="sourceLineNo">5204</span><a name="line.5204"></a>
+<span class="sourceLineNo">5205</span>    scan = new Scan(rowD, rowA);<a name="line.5205"></a>
+<span class="sourceLineNo">5206</span>    scan.addColumn(families[0], col2);<a name="line.5206"></a>
+<span class="sourceLineNo">5207</span>    scan.setReversed(true);<a name="line.5207"></a>
+<span class="sourceLineNo">5208</span>    currRow.clear();<a name="line.5208"></a>
+<span class="sourceLineNo">5209</span>    scanner = region.getScanner(scan);<a name="line.5209"></a>
+<span class="sourceLineNo">5210</span>    hasNext = scanner.next(currRow);<a name="line.5210"></a>
+<span class="sourceLineNo">5211</span>    assertEquals(1, currRow.size());<a name="line.5211"></a>
+<span class="sourceLineNo">5212</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5212"></a>
+<span class="sourceLineNo">5213</span>        .get(0).getRowLength(), rowD, 0, rowD.length));<a name="line.5213"></a>
+<span class="sourceLineNo">5214</span>    scanner.close();<a name="line.5214"></a>
+<span class="sourceLineNo">5215</span>  }<a name="line.5215"></a>
+<span class="sourceLineNo">5216</span><a name="line.5216"></a>
+<span class="sourceLineNo">5217</span>  @Test<a name="line.5217"></a>
+<span class="sourceLineNo">5218</span>  public void testReverseScanner_FromMemStoreAndHFiles_MultiCFs1()<a name="line.5218"></a>
+<span class="sourceLineNo">5219</span>      throws IOException {<a name="line.5219"></a>
+<span class="sourceLineNo">5220</span>    byte[] row0 = Bytes.toBytes("row0"); // 1 kv<a name="line.5220"></a>
+<span class="sourceLineNo">5221</span>    byte[] row1 = Bytes.toBytes("row1"); // 2 kv<a name="line.5221"></a>
+<span class="sourceLineNo">5222</span>    byte[] row2 = Bytes.toBytes("row2"); // 4 kv<a name="line.5222"></a>
+<span class="sourceLineNo">5223</span>    byte[] row3 = Bytes.toBytes("row3"); // 2 kv<a name="line.5223"></a>
+<span class="sourceLineNo">5224</span>    byte[] row4 = Bytes.toBytes("row4"); // 5 kv<a name="line.5224"></a>
+<span class="sourceLineNo">5225</span>    byte[] row5 = Bytes.toBytes("row5"); // 2 kv<a name="line.5225"></a>
+<span class="sourceLineNo">5226</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5226"></a>
+<span class="sourceLineNo">5227</span>    byte[] cf2 = Bytes.toBytes("CF2");<a name="line.5227"></a>
+<span class="sourceLineNo">5228</span>    byte[] cf3 = Bytes.toBytes("CF3");<a name="line.5228"></a>
+<span class="sourceLineNo">5229</span>    byte[][] families = { cf1, cf2, cf3 };<a name="line.5229"></a>
+<span class="sourceLineNo">5230</span>    byte[] col = Bytes.toBytes("C");<a name="line.5230"></a>
+<span class="sourceLineNo">5231</span>    long ts = 1;<a name="line.5231"></a>
+<span class="sourceLineNo">5232</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5232"></a>
+<span class="sourceLineNo">5233</span>    // disable compactions in this test.<a name="line.5233"></a>
+<span class="sourceLineNo">5234</span>    conf.setInt("hbase.hstore.compactionThreshold", 10000);<a name="line.5234"></a>
+<span class="sourceLineNo">5235</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5235"></a>
+<span class="sourceLineNo">5236</span>    // kv naming style: kv(row number) totalKvCountInThisRow seq no<a name="line.5236"></a>
+<span class="sourceLineNo">5237</span>    KeyValue kv0_1_1 = new KeyValue(row0, cf1, col, ts, KeyValue.Type.Put,<a name="line.5237"></a>
 <span class="sourceLineNo">5238</span>        null);<a name="line.5238"></a>
-<span class="sourceLineNo">5239</span>    KeyValue kv2_4_4 = new KeyValue(row2, cf1, col, ts + 4,<a name="line.5239"></a>
-<span class="sourceLineNo">5240</span>        KeyValue.Type.Put, null);<a name="line.5240"></a>
-<span class="sourceLineNo">5241</span>    KeyValue kv3_2_1 = new KeyValue(row3, cf2, col, ts, KeyValue.Type.Put,<a name="line.5241"></a>
-<span class="sourceLineNo">5242</span>        null);<a name="line.5242"></a>
-<span class="sourceLineNo">5243</span>    KeyValue kv3_2_2 = new KeyValue(row3, cf1, col, ts + 4,<a name="line.5243"></a>
-<span class="sourceLineNo">5244</span>        KeyValue.Type.Put, null);<a name="line.5244"></a>
-<span class="sourceLineNo">5245</span>    KeyValue kv4_5_1 = new KeyValue(row4, cf1, col, ts, KeyValue.Type.Put,<a name="line.5245"></a>
+<span class="sourceLineNo">5239</span>    KeyValue kv1_2_1 = new KeyValue(row1, cf2, col, ts, KeyValue.Type.Put,<a name="line.5239"></a>
+<span class="sourceLineNo">5240</span>        null);<a name="line.5240"></a>
+<span class="sourceLineNo">5241</span>    KeyValue kv1_2_2 = new KeyValue(row1, cf1, col, ts + 1,<a name="line.5241"></a>
+<span class="sourceLineNo">5242</span>        KeyValue.Type.Put, null);<a name="line.5242"></a>
+<span class="sourceLineNo">5243</span>    KeyValue kv2_4_1 = new KeyValue(row2, cf2, col, ts, KeyValue.Type.Put,<a name="line.5243"></a>
+<span class="sourceLineNo">5244</span>        null);<a name="line.5244"></a>
+<span class="sourceLineNo">5245</span>    KeyValue kv2_4_2 = new KeyValue(row2, cf1, col, ts, KeyValue.Type.Put,<a name="line.5245"></a>
 <span class="sourceLineNo">5246</span>        null);<a name="line.5246"></a>
-<span class="sourceLineNo">5247</span>    KeyValue kv4_5_2 = new KeyValue(row4, cf3, col, ts, KeyValue.Type.Put,<a name="line.5247"></a>
+<span class="sourceLineNo">5247</span>    KeyValue kv2_4_3 = new KeyValue(row2, cf3, col, ts, KeyValue.Type.Put,<a name="line.5247"></a>
 <span class="sourceLineNo">5248</span>        null);<a name="line.5248"></a>
-<span class="sourceLineNo">5249</span>    KeyValue kv4_5_3 = new KeyValue(row4, cf3, col, ts + 5,<a name="line.5249"></a>
+<span class="sourceLineNo">5249</span>    KeyValue kv2_4_4 = new KeyValue(row2, cf1, col, ts + 4,<a name="line.5249"></a>
 <span class="sourceLineNo">5250</span>        KeyValue.Type.Put, null);<a name="line.5250"></a>
-<span class="sourceLineNo">5251</span>    KeyValue kv4_5_4 = new KeyValue(row4, cf2, col, ts, KeyValue.Type.Put,<a name="line.5251"></a>
+<span class="sourceLineNo">5251</span>    KeyValue kv3_2_1 = new KeyValue(row3, cf2, col, ts, KeyValue.Type.Put,<a name="line.5251"></a>
 <span class="sourceLineNo">5252</span>        null);<a name="line.5252"></a>
-<span class="sourceLineNo">5253</span>    KeyValue kv4_5_5 = new KeyValue(row4, cf1, col, ts + 3,<a name="line.5253"></a>
+<span class="sourceLineNo">5253</span>    KeyValue kv3_2_2 = new KeyValue(row3, cf1, col, ts + 4,<a name="line.5253"></a>
 <span class="sourceLineNo">5254</span>        KeyValue.Type.Put, null);<a name="line.5254"></a>
-<span class="sourceLineNo">5255</span>    KeyValue kv5_2_1 = new KeyValue(row5, cf2, col, ts, KeyValue.Type.Put,<a name="line.5255"></a>
+<span class="sourceLineNo">5255</span>    KeyValue kv4_5_1 = new KeyValue(row4, cf1, col, ts, KeyValue.Type.Put,<a name="line.5255"></a>
 <span class="sourceLineNo">5256</span>        null);<a name="line.5256"></a>
-<span class="sourceLineNo">5257</span>    KeyValue kv5_2_2 = new KeyValue(row5, cf3, col, ts, KeyValue.Type.Put,<a name="line.5257"></a>
+<span class="sourceLineNo">5257</span>    KeyValue kv4_5_2 = new KeyValue(row4, cf3, col, ts, KeyValue.Type.Put,<a name="line.5257"></a>
 <span class="sourceLineNo">5258</span>        null);<a name="line.5258"></a>
-<span class="sourceLineNo">5259</span>    // hfiles(cf1/cf2) :"row1"(1 kv) / "row2"(1 kv) / "row4"(2 kv)<a name="line.5259"></a>
-<span class="sourceLineNo">5260</span>    Put put = null;<a name="line.5260"></a>
-<span class="sourceLineNo">5261</span>    put = new Put(row1);<a name="line.5261"></a>
-<span class="sourceLineNo">5262</span>    put.add(kv1_2_1);<a name="line.5262"></a>
-<span class="sourceLineNo">5263</span>    region.put(put);<a name="line.5263"></a>
-<span class="sourceLineNo">5264</span>    put = new Put(row2);<a name="line.5264"></a>
-<span class="sourceLineNo">5265</span>    put.add(kv2_4_1);<a name="line.5265"></a>
-<span class="sourceLineNo">5266</span>    region.put(put);<a name="line.5266"></a>
-<span class="sourceLineNo">5267</span>    put = new Put(row4);<a name="line.5267"></a>
-<span class="sourceLineNo">5268</span>    put.add(kv4_5_4);<a name="line.5268"></a>
-<span class="sourceLineNo">5269</span>    put.add(kv4_5_5);<a name="line.5269"></a>
-<span class="sourceLineNo">5270</span>    region.put(put);<a name="line.5270"></a>
-<span class="sourceLineNo">5271</span>    region.flush(true);<a name="line.5271"></a>
-<span class="sourceLineNo">5272</span>    // hfiles(cf1/cf3) : "row1" (1 kvs) / "row2" (1 kv) / "row4" (2 kv)<a name="line.5272"></a>
-<span class="sourceLineNo">5273</span>    put = new Put(row4);<a name="line.5273"></a>
-<span class="sourceLineNo">5274</span>    put.add(kv4_5_1);<a name="line.5274"></a>
-<span class="sourceLineNo">5275</span>    put.add(kv4_5_3);<a name="line.5275"></a>
+<span class="sourceLineNo">5259</span>    KeyValue kv4_5_3 = new KeyValue(row4, cf3, col, ts + 5,<a name="line.5259"></a>
+<span class="sourceLineNo">5260</span>        KeyValue.Type.Put, null);<a name="line.5260"></a>
+<span class="sourceLineNo">5261</span>    KeyValue kv4_5_4 = new KeyValue(row4, cf2, col, ts, KeyValue.Type.Put,<a name="line.5261"></a>
+<span class="sourceLineNo">5262</span>        null);<a name="line.5262"></a>
+<span class="sourceLineNo">5263</span>    KeyValue kv4_5_5 = new KeyValue(row4, cf1, col, ts + 3,<a name="line.5263"></a>
+<span class="sourceLineNo">5264</span>        KeyValue.Type.Put, null);<a name="line.5264"></a>
+<span class="sourceLineNo">5265</span>    KeyValue kv5_2_1 = new KeyValue(row5, cf2, col, ts, KeyValue.Type.Put,<a name="line.5265"></a>
+<span class="sourceLineNo">5266</span>        null);<a name="line.5266"></a>
+<span class="sourceLineNo">5267</span>    KeyValue kv5_2_2 = new KeyValue(row5, cf3, col, ts, KeyValue.Type.Put,<a name="line.5267"></a>
+<span class="sourceLineNo">5268</span>        null);<a name="line.5268"></a>
+<span class="sourceLineNo">5269</span>    // hfiles(cf1/cf2) :"row1"(1 kv) / "row2"(1 kv) / "row4"(2 kv)<a name="line.5269"></a>
+<span class="sourceLineNo">5270</span>    Put put = null;<a name="line.5270"></a>
+<span class="sourceLineNo">5271</span>    put = new Put(row1);<a name="line.5271"></a>
+<span class="sourceLineNo">5272</span>    put.add(kv1_2_1);<a name="line.5272"></a>
+<span class="sourceLineNo">5273</span>    region.put(put);<a name="line.5273"></a>
+<span class="sourceLineNo">5274</span>    put = new Put(row2);<a name="line.5274"></a>
+<span class="sourceLineNo">5275</span>    put.add(kv2_4_1);<a name="line.5275"></a>
 <span class="sourceLineNo">5276</span>    region.put(put);<a name="line.5276"></a>
-<span class="sourceLineNo">5277</span>    put = new Put(row1);<a name="line.5277"></a>
-<span class="sourceLineNo">5278</span>    put.add(kv1_2_2);<a name="line.5278"></a>
-<span class="sourceLineNo">5279</span>    region.put(put);<a name="line.5279"></a>
-<span class="sourceLineNo">5280</span>    put = new Put(row2);<a name="line.5280"></a>
-<span class="sourceLineNo">5281</span>    put.add(kv2_4_4);<a name="line.5281"></a>
-<span class="sourceLineNo">5282</span>    region.put(put);<a name="line.5282"></a>
-<span class="sourceLineNo">5283</span>    region.flush(true);<a name="line.5283"></a>
-<span class="sourceLineNo">5284</span>    // hfiles(cf1/cf3) : "row2"(2 kv) / "row3"(1 kvs) / "row4" (1 kv)<a name="line.5284"></a>
-<span class="sourceLineNo">5285</span>    put = new Put(row4);<a name="line.5285"></a>
-<span class="sourceLineNo">5286</span>    put.add(kv4_5_2);<a name="line.5286"></a>
-<span class="sourceLineNo">5287</span>    region.put(put);<a name="line.5287"></a>
-<span class="sourceLineNo">5288</span>    put = new Put(row2);<a name="line.5288"></a>
-<span class="sourceLineNo">5289</span>    put.add(kv2_4_2);<a name="line.5289"></a>
-<span class="sourceLineNo">5290</span>    put.add(kv2_4_3);<a name="line.5290"></a>
-<span class="sourceLineNo">5291</span>    region.put(put);<a name="line.5291"></a>
-<span class="sourceLineNo">5292</span>    put = new Put(row3);<a name="line.5292"></a>
-<span class="sourceLineNo">5293</span>    put.add(kv3_2_2);<a name="line.5293"></a>
-<span class="sourceLineNo">5294</span>    region.put(put);<a name="line.5294"></a>
-<span class="sourceLineNo">5295</span>    region.flush(true);<a name="line.5295"></a>
-<span class="sourceLineNo">5296</span>    // memstore(cf1/cf2/cf3) : "row0" (1 kvs) / "row3" ( 1 kv) / "row5" (max)<a name="line.5296"></a>
-<span class="sourceLineNo">5297</span>    // ( 2 kv)<a name="line.5297"></a>
-<span class="sourceLineNo">5298</span>    put = new Put(row0);<a name="line.5298"></a>
-<span class="sourceLineNo">5299</span>    put.add(kv0_1_1);<a name="line.5299"></a>
-<span class="sourceLineNo">5300</span>    region.put(put);<a name="line.5300"></a>
-<span class="sourceLineNo">5301</span>    put = new Put(row3);<a name="line.5301"></a>
-<span class="sourceLineNo">5302</span>    put.add(kv3_2_1);<a name="line.5302"></a>
-<span class="sourceLineNo">5303</span>    region.put(put);<a name="line.5303"></a>
-<span class="sourceLineNo">5304</span>    put = new Put(row5);<a name="line.5304"></a>
-<span class="sourceLineNo">5305</span>    put.add(kv5_2_1);<a name="line.5305"></a>
-<span class="sourceLineNo">5306</span>    put.add(kv5_2_2);<a name="line.5306"></a>
-<span class="sourceLineNo">5307</span>    region.put(put);<a name="line.5307"></a>
-<span class="sourceLineNo">5308</span>    // scan range = ["row4", min), skip the max "row5"<a name="line.5308"></a>
-<span class="sourceLineNo">5309</span>    Scan scan = new Scan(row4);<a name="line.5309"></a>
-<span class="sourceLineNo">5310</span>    scan.setMaxVersions(5);<a name="line.5310"></a>
-<span class="sourceLineNo">5311</span>    scan.setBatch(3);<a name="line.5311"></a>
-<span class="sourceLineNo">5312</span>    scan.setReversed(true);<a name="line.5312"></a>
-<span class="sourceLineNo">5313</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5313"></a>
-<span class="sourceLineNo">5314</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5314"></a>
-<span class="sourceLineNo">5315</span>    boolean hasNext = false;<a name="line.5315"></a>
-<span class="sourceLineNo">5316</span>    // 1. scan out "row4" (5 kvs), "row5" can't be scanned out since not<a name="line.5316"></a>
-<span class="sourceLineNo">5317</span>    // included in scan range<a name="line.5317"></a>
-<span class="sourceLineNo">5318</span>    // "row4" takes 2 next() calls since batch=3<a name="line.5318"></a>
-<span class="sourceLineNo">5319</span>    hasNext = scanner.next(currRow);<a name="line.5319"></a>
-<span class="sourceLineNo">5320</span>    assertEquals(3, currRow.size());<a name="line.5320"></a>
-<span class="sourceLineNo">5321</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5321"></a>
-<span class="sourceLineNo">5322</span>        .get(0).getRowLength(), row4, 0, row4.length));<a name="line.5322"></a>
-<span class="sourceLineNo">5323</span>    assertTrue(hasNext);<a name="line.5323"></a>
-<span class="sourceLineNo">5324</span>    currRow.clear();<a name="line.5324"></a>
-<span class="sourceLineNo">5325</span>    hasNext = scanner.next(currRow);<a name="line.5325"></a>
-<span class="sourceLineNo">5326</span>    assertEquals(2, currRow.size());<a name="line.5326"></a>
-<span class="sourceLineNo">5327</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(),<a name="line.5327"></a>
-<span class="sourceLineNo">5328</span>        currRow.get(0).getRowLength(), row4, 0,<a name="line.5328"></a>
-<span class="sourceLineNo">5329</span>      row4.length));<a name="line.5329"></a>
-<span class="sourceLineNo">5330</span>    assertTrue(hasNext);<a name="line.5330"></a>
-<span class="sourceLineNo">5331</span>    // 2. scan out "row3" (2 kv)<a name="line.5331"></a>
-<span class="sourceLineNo">5332</span>    currRow.clear();<a name="line.5332"></a>
-<span class="sourceLineNo">5333</span>    hasNext = scanner.next(currRow);<a name="line.5333"></a>
-<span class="sourceLineNo">5334</span>    assertEquals(2, currRow.size());<a name="line.5334"></a>
-<span class="sourceLineNo">5335</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5335"></a>
-<span class="sourceLineNo">5336</span>        .get(0).getRowLength(), row3, 0, row3.length));<a name="line.5336"></a>
-<span class="sourceLineNo">5337</span>    assertTrue(hasNext);<a name="line.5337"></a>
-<span class="sourceLineNo">5338</span>    // 3. scan out "row2" (4 kvs)<a name="line.5338"></a>
-<span class="sourceLineNo">5339</span>    // "row2" takes 2 next() calls since batch=3<a name="line.5339"></a>
-<span class="sourceLineNo">5340</span>    currRow.clear();<a name="line.5340"></a>
-<span class="sourceLineNo">5341</span>    hasNext = scanner.next(currRow);<a name="line.5341"></a>
-<span class="sourceLineNo">5342</span>    assertEquals(3, currRow.size());<a name="line.5342"></a>
-<span class="sourceLineNo">5343</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5343"></a>
-<span class="sourceLineNo">5344</span>        .get(0).getRowLength(), row2, 0, row2.length));<a name="line.5344"></a>
-<span class="sourceLineNo">5345</span>    assertTrue(hasNext);<a name="line.5345"></a>
-<span class="sourceLineNo">5346</span>    currRow.clear();<a name="line.5346"></a>
-<span class="sourceLineNo">5347</span>    hasNext = scanner.next(currRow);<a name="line.5347"></a>
-<span class="sourceLineNo">5348</span>    assertEquals(1, currRow.size());<a name="line.5348"></a>
-<span class="sourceLineNo">5349</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5349"></a>
-<span class="sourceLineNo">5350</span>        .get(0).getRowLength(), row2, 0, row2.length));<a name="line.5350"></a>
-<span class="sourceLineNo">5351</span>    assertTrue(hasNext);<a name="line.5351"></a>
-<span class="sourceLineNo">5352</span>    // 4. scan out "row1" (2 kv)<a name="line.5352"></a>
-<span class="sourceLineNo">5353</span>    currRow.clear();<a name="line.5353"></a>
-<span class="sourceLineNo">5354</span>    hasNext = scanner.next(currRow);<a name="line.5354"></a>
-<span class="sourceLineNo">5355</span>    assertEquals(2, currRow.size());<a name="line.5355"></a>
-<span class="sourceLineNo">5356</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5356"></a>
-<span class="sourceLineNo">5357</span>        .get(0).getRowLength(), row1, 0, row1.length));<a name="line.5357"></a>
-<span class="sourceLineNo">5358</span>    assertTrue(hasNext);<a name="line.5358"></a>
-<span class="sourceLineNo">5359</span>    // 5. scan out "row0" (1 kv)<a name="line.5359"></a>
-<span class="sourceLineNo">5360</span>    currRow.clear();<a name="line.5360"></a>
-<span class="sourceLineNo">5361</span>    hasNext = scanner.next(currRow);<a name="line.5361"></a>
-<span class="sourceLineNo">5362</span>    assertEquals(1, currRow.size());<a name="line.5362"></a>
-<span class="sourceLineNo">5363</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5363"></a>
-<span class="sourceLineNo">5364</span>        .get(0).getRowLength(), row0, 0, row0.length));<a name="line.5364"></a>
-<span class="sourceLineNo">5365</span>    assertFalse(hasNext);<a name="line.5365"></a>
-<span class="sourceLineNo">5366</span><a name="line.5366"></a>
-<span class="sourceLineNo">5367</span>    scanner.close();<a name="line.5367"></a>
-<span class="sourceLineNo">5368</span>  }<a name="line.5368"></a>
-<span class="sourceLineNo">5369</span><a name="line.5369"></a>
-<span class="sourceLineNo">5370</span>  @Test<a name="line.5370"></a>
-<span class="sourceLineNo">5371</span>  public void testReverseScanner_FromMemStoreAndHFiles_MultiCFs2()<a name="line.5371"></a>
-<span class="sourceLineNo">5372</span>      throws IOException {<a name="line.5372"></a>
-<span class="sourceLineNo">5373</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.5373"></a>
-<span class="sourceLineNo">5374</span>    byte[] row2 = Bytes.toBytes("row2");<a name="line.5374"></a>
-<span class="sourceLineNo">5375</span>    byte[] row3 = Bytes.toBytes("row3");<a name="line.5375"></a>
-<span class="sourceLineNo">5376</span>    byte[] row4 = Bytes.toBytes("row4");<a name="line.5376"></a>
-<span class="sourceLineNo">5377</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5377"></a>
-<span class="sourceLineNo">5378</span>    byte[] cf2 = Bytes.toBytes("CF2");<a name="line.5378"></a>
-<span class="sourceLineNo">5379</span>    byte[] cf3 = Bytes.toBytes("CF3");<a name="line.5379"></a>
-<span class="sourceLineNo">5380</span>    byte[] cf4 = Bytes.toBytes("CF4");<a name="line.5380"></a>
-<span class="sourceLineNo">5381</span>    byte[][] families = { cf1, cf2, cf3, cf4 };<a name="line.5381"></a>
-<span class="sourceLineNo">5382</span>    byte[] col = Bytes.toBytes("C");<a name="line.5382"></a>
-<span class="sourceLineNo">5383</span>    long ts = 1;<a name="line.5383"></a>
-<span class="sourceLineNo">5384</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5384"></a>
-<span class="sourceLineNo">5385</span>    // disable compactions in this test.<a name="line.5385"></a>
-<span class="sourceLineNo">5386</span>    conf.setInt("hbase.hstore.compactionThreshold", 10000);<a name="line.5386"></a>
-<span class="sourceLineNo">5387</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5387"></a>
-<span class="sourceLineNo">5388</span>    KeyValue kv1 = new KeyValue(row1, cf1, col, ts, KeyValue.Type.Put, null);<a name="line.5388"></a>
-<span class="sourceLineNo">5389</span>    KeyValue kv2 = new KeyValue(row2, cf2, col, ts, KeyValue.Type.Put, null);<a name="line.5389"></a>
-<span class="sourceLineNo">5390</span>    KeyValue kv3 = new KeyValue(row3, cf3, col, ts, KeyValue.Type.Put, null);<a name="line.5390"></a>
-<span class="sourceLineNo">5391</span>    KeyValue kv4 = new KeyValue(row4, cf4, col, ts, KeyValue.Type.Put, null);<a name="line.5391"></a>
-<span class="sourceLineNo">5392</span>    // storefile1<a name="line.5392"></a>
-<span class="sourceLineNo">5393</span>    Put put = new Put(row1);<a name="line.5393"></a>
-<span class="sourceLineNo">5394</span>    put.add(kv1);<a name="line.5394"></a>
-<span class="sourceLineNo">5395</span>    region.put(put);<a name="line.5395"></a>
-<span class="sourceLineNo">5396</span>    region.flush(true);<a name="line.5396"></a>
-<span class="sourceLineNo">5397</span>    // storefile2<a name="line.5397"></a>
-<span class="sourceLineNo">5398</span>    put = new Put(row2);<a name="line.5398"></a>
-<span class="sourceLineNo">5399</span>    put.add(kv2);<a name="line.5399"></a>
-<span class="sourceLineNo">5400</span>    region.put(put);<a name="line.5400"></a>
-<span class="sourceLineNo">5401</span>    region.flush(true);<a name="line.5401"></a>
-<span class="sourceLineNo">5402</span>    // storefile3<a name="line.5402"></a>
-<span class="sourceLineNo">5403</span>    put = new Put(row3);<a name="line.5403"></a>
-<span class="sourceLineNo">5404</span>    put.add(kv3);<a name="line.5404"></a>
+<span class="sourceLineNo">5277</span>    put = new Put(row4);<a name="line.5277"></a>
+<span class="sourceLineNo">5278</span>    put.add(kv4_5_4);<a name="line.5278"></a>
+<span class="sourceLineNo">5279</span>    put.add(kv4_5_5);<a name="line.5279"></a>
+<span class="sourceLineNo">5280</span>    region.put(put);<a name="line.5280"></a>
+<span class="sourceLineNo">5281</span>    region.flush(true);<a name="line.5281"></a>
+<span class="sourceLineNo">5282</span>    // hfiles(cf1/cf3) : "row1" (1 kvs) / "row2" (1 kv) / "row4" (2 kv)<a name="line.5282"></a>
+<span class="sourceLineNo">5283</span>    put = new Put(row4);<a name="line.5283"></a>
+<span class="sourceLineNo">5284</span>    put.add(kv4_5_1);<a name="line.5284"></a>
+<span class="sourceLineNo">5285</span>    put.add(kv4_5_3);<a name="line.5285"></a>
+<span class="sourceLineNo">5286</span>    region.put(put);<a name="line.5286"></a>
+<span class="sourceLineNo">5287</span>    put = new Put(row1);<a name="line.5287"></a>
+<span class="sourceLineNo">5288</span>    put.add(kv1_2_2);<a name="line.5288"></a>
+<span class="sourceLineNo">5289</span>    region.put(put);<a name="line.5289"></a>
+<span class="sourceLineNo">5290</span>    put = new Put(row2);<a name="line.5290"></a>
+<span class="sourceLineNo">5291</span>    put.add(kv2_4_4);<a name="line.5291"></a>
+<span class="sourceLineNo">5292</span>    region.put(put);<a name="line.5292"></a>
+<span class="sourceLineNo">5293</span>    region.flush(true);<a name="line.5293"></a>
+<span class="sourceLineNo">5294</span>    // hfiles(cf1/cf3) : "row2"(2 kv) / "row3"(1 kvs) / "row4" (1 kv)<a name="line.5294"></a>
+<span class="sourceLineNo">5295</span>    put = new Put(row4);<a name="line.5295"></a>
+<span class="sourceLineNo">5296</span>    put.add(kv4_5_2);<a name="line.5296"></a>
+<span class="sourceLineNo">5297</span>    region.put(put);<a name="line.5297"></a>
+<span class="sourceLineNo">5298</span>    put = new Put(row2);<a name="line.5298"></a>
+<span class="sourceLineNo">5299</span>    put.add(kv2_4_2);<a name="line.5299"></a>
+<span class="sourceLineNo">5300</span>    put.add(kv2_4_3);<a name="line.5300"></a>
+<span class="sourceLineNo">5301</span>    region.put(put);<a name="line.5301"></a>
+<span class="sourceLineNo">5302</span>    put = new Put(row3);<a name="line.5302"></a>
+<span class="sourceLineNo">5303</span>    put.add(kv3_2_2);<a name="line.5303"></a>
+<span class="sourceLineNo">5304</span>    region.put(put);<a name="line.5304"></a>
+<span class="sourceLineNo">5305</span>    region.flush(true);<a name="line.5305"></a>
+<span class="sourceLineNo">5306</span>    // memstore(cf1/cf2/cf3) : "row0" (1 kvs) / "row3" ( 1 kv) / "row5" (max)<a name="line.5306"></a>
+<span class="sourceLineNo">5307</span>    // ( 2 kv)<a name="line.5307"></a>
+<span class="sourceLineNo">5308</span>    put = new Put(row0);<a name="line.5308"></a>
+<span class="sourceLineNo">5309</span>    put.add(kv0_1_1);<a name="line.5309"></a>
+<span class="sourceLineNo">5310</span>    region.put(put);<a name="line.5310"></a>
+<span class="sourceLineNo">5311</span>    put = new Put(row3);<a name="line.5311"></a>
+<span class="sourceLineNo">5312</span>    put.add(kv3_2_1);<a name="line.5312"></a>
+<span class="sourceLineNo">5313</span>    region.put(put);<a name="line.5313"></a>
+<span class="sourceLineNo">5314</span>    put = new Put(row5);<a name="line.5314"></a>
+<span class="sourceLineNo">5315</span>    put.add(kv5_2_1);<a name="line.5315"></a>
+<span class="sourceLineNo">5316</span>    put.add(kv5_2_2);<a name="line.5316"></a>
+<span class="sourceLineNo">5317</span>    region.put(put);<a name="line.5317"></a>
+<span class="sourceLineNo">5318</span>    // scan range = ["row4", min), skip the max "row5"<a name="line.5318"></a>
+<span class="sourceLineNo">5319</span>    Scan scan = new Scan(row4);<a name="line.5319"></a>
+<span class="sourceLineNo">5320</span>    scan.setMaxVersions(5);<a name="line.5320"></a>
+<span class="sourceLineNo">5321</span>    scan.setBatch(3);<a name="line.5321"></a>
+<span class="sourceLineNo">5322</span>    scan.setReversed(true);<a name="line.5322"></a>
+<span class="sourceLineNo">5323</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5323"></a>
+<span class="sourceLineNo">5324</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5324"></a>
+<span class="sourceLineNo">5325</span>    boolean hasNext = false;<a name="line.5325"></a>
+<span class="sourceLineNo">5326</span>    // 1. scan out "row4" (5 kvs), "row5" can't be scanned out since not<a name="line.5326"></a>
+<span class="sourceLineNo">5327</span>    // included in scan range<a name="line.5327"></a>
+<span class="sourceLineNo">5328</span>    // "row4" takes 2 next() calls since batch=3<a name="line.5328"></a>
+<span class="sourceLineNo">5329</span>    hasNext = scanner.next(currRow);<a name="line.5329"></a>
+<span class="sourceLineNo">5330</span>    assertEquals(3, currRow.size());<a name="line.5330"></a>
+<span class="sourceLineNo">5331</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5331"></a>
+<span class="sourceLineNo">5332</span>        .get(0).getRowLength(), row4, 0, row4.length));<a name="line.5332"></a>
+<span class="sourceLineNo">5333</span>    assertTrue(hasNext);<a name="line.5333"></a>
+<span class="sourceLineNo">5334</span>    currRow.clear();<a name="line.5334"></a>
+<span class="sourceLineNo">5335</span>    hasNext = scanner.next(currRow);<a name="line.5335"></a>
+<span class="sourceLineNo">5336</span>    assertEquals(2, currRow.size());<a name="line.5336"></a>
+<span class="sourceLineNo">5337</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(),<a name="line.5337"></a>
+<span class="sourceLineNo">5338</span>        currRow.get(0).getRowLength(), row4, 0,<a name="line.5338"></a>
+<span class="sourceLineNo">5339</span>      row4.length));<a name="line.5339"></a>
+<span class="sourceLineNo">5340</span>    assertTrue(hasNext);<a name="line.5340"></a>
+<span class="sourceLineNo">5341</span>    // 2. scan out "row3" (2 kv)<a name="line.5341"></a>
+<span class="sourceLineNo">5342</span>    currRow.clear();<a name="line.5342"></a>
+<span class="sourceLineNo">5343</span>    hasNext = scanner.next(currRow);<a name="line.5343"></a>
+<span class="sourceLineNo">5344</span>    assertEquals(2, currRow.size());<a name="line.5344"></a>
+<span class="sourceLineNo">5345</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5345"></a>
+<span class="sourceLineNo">5346</span>        .get(0).getRowLength(), row3, 0, row3.length));<a name="line.5346"></a>
+<span class="sourceLineNo">5347</span>    assertTrue(hasNext);<a name="line.5347"></a>
+<span class="sourceLineNo">5348</span>    // 3. scan out "row2" (4 kvs)<a name="line.5348"></a>
+<span class="sourceLineNo">5349</span>    // "row2" takes 2 next() calls since batch=3<a name="line.5349"></a>
+<span class="sourceLineNo">5350</span>    currRow.clear();<a name="line.5350"></a>
+<span class="sourceLineNo">5351</span>    hasNext = scanner.next(currRow);<a name="line.5351"></a>
+<span class="sourceLineNo">5352</span>    assertEquals(3, currRow.size());<a name="line.5352"></a>
+<span class="sourceLineNo">5353</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5353"></a>
+<span class="sourceLineNo">5354</span>        .get(0).getRowLength(), row2, 0, row2.length));<a name="line.5354"></a>
+<span class="sourceLineNo">5355</span>    assertTrue(hasNext);<a name="line.5355"></a>
+<span class="sourceLineNo">5356</span>    currRow.clear();<a name="line.5356"></a>
+<span class="sourceLineNo">5357</span>    hasNext = scanner.next(currRow);<a name="line.5357"></a>
+<span class="sourceLineNo">5358</span>    assertEquals(1, currRow.size());<a name="line.5358"></a>
+<span class="sourceLineNo">5359</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5359"></a>
+<span class="sourceLineNo">5360</span>        .get(0).getRowLength(), row2, 0, row2.length));<a name="line.5360"></a>
+<span class="sourceLineNo">5361</span>    assertTrue(hasNext);<a name="line.5361"></a>
+<span class="sourceLineNo">5362</span>    // 4. scan out "row1" (2 kv)<a name="line.5362"></a>
+<span class="sourceLineNo">5363</span>    currRow.clear();<a name="line.5363"></a>
+<span class="sourceLineNo">5364</span>    hasNext = scanner.next(currRow);<a name="line.5364"></a>
+<span class="sourceLineNo">5365</span>    assertEquals(2, currRow.size());<a name="line.5365"></a>
+<span class="sourceLineNo">5366</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5366"></a>
+<span class="sourceLineNo">5367</span>        .get(0).getRowLength(), row1, 0, row1.length));<a name="line.5367"></a>
+<span class="sourceLineNo">5368</span>    assertTrue(hasNext);<a name="line.5368"></a>
+<span class="sourceLineNo">5369</span>    // 5. scan out "row0" (1 kv)<a name="line.5369"></a>
+<span class="sourceLineNo">5370</span>    currRow.clear();<a name="line.5370"></a>
+<span class="sourceLineNo">5371</span>    hasNext = scanner.next(currRow);<a name="line.5371"></a>
+<span class="sourceLineNo">5372</span>    assertEquals(1, currRow.size());<a name="line.5372"></a>
+<span class="sourceLineNo">5373</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5373"></a>
+<span class="sourceLineNo">5374</span>        .get(0).getRowLength(), row0, 0, row0.length));<a name="line.5374"></a>
+<span class="sourceLineNo">5375</span>    assertFalse(hasNext);<a name="line.5375"></a>
+<span class="sourceLineNo">5376</span><a name="line.5376"></a>
+<span class="sourceLineNo">5377</span>    scanner.close();<a name="line.5377"></a>
+<span class="sourceLineNo">5378</span>  }<a name="line.5378"></a>
+<span class="sourceLineNo">5379</span><a name="line.5379"></a>
+<span class="sourceLineNo">5380</span>  @Test<a name="line.5380"></a>
+<span class="sourceLineNo">5381</span>  public void testReverseScanner_FromMemStoreAndHFiles_MultiCFs2()<a name="line.5381"></a>
+<span class="sourceLineNo">5382</span>      throws IOException {<a name="line.5382"></a>
+<span class="sourceLineNo">5383</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.5383"></a>
+<span class="sourceLineNo">5384</span>    byte[] row2 = Bytes.toBytes("row2");<a name="line.5384"></a>
+<span class="sourceLineNo">5385</span>    byte[] row3 = Bytes.toBytes("row3");<a name="line.5385"></a>
+<span class="sourceLineNo">5386</span>    byte[] row4 = Bytes.toBytes("row4");<a name="line.5386"></a>
+<span class="sourceLineNo">5387</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5387"></a>
+<span class="sourceLineNo">5388</span>    byte[] cf2 = Bytes.toBytes("CF2");<a name="line.5388"></a>
+<span class="sourceLineNo">5389</span>    byte[] cf3 = Bytes.toBytes("CF3");<a name="line.5389"></a>
+<span class="sourceLineNo">5390</span>    byte[] cf4 = Bytes.toBytes("CF4");<a name="line.5390"></a>
+<span class="sourceLineNo">5391</span>    byte[][] families = { cf1, cf2, cf3, cf4 };<a name="line.5391"></a>
+<span class="sourceLineNo">5392</span>    byte[] col = Bytes.toBytes("C");<a name="line.5392"></a>
+<span class="sourceLineNo">5393</span>    long ts = 1;<a name="line.5393"></a>
+<span class="sourceLineNo">5394</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5394"></a>
+<span class="sourceLineNo">5395</span>    // disable compactions in this test.<a name="line.5395"></a>
+<span class="sourceLineNo">5396</span>    conf.setInt("hbase.hstore.compactionThreshold", 10000);<a name="line.5396"></a>
+<span class="sourceLineNo">5397</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5397"></a>
+<span class="sourceLineNo">5398</span>    KeyValue kv1 = new KeyValue(row1, cf1, col, ts, KeyValue.Type.Put, null);<a name="line.5398"></a>
+<span class="sourceLineNo">5399</span>    KeyValue kv2 = new KeyValue(row2, cf2, col, ts, KeyValue.Type.Put, null);<a name="line.5399"></a>
+<span class="sourceLineNo">5400</span>    KeyValue kv3 = new KeyValue(row3, cf3, col, ts, KeyValue.Type.Put, null);<a name="line.5400"></a>
+<span class="sourceLineNo">5401</span>    KeyValue kv4 = new KeyValue(row4, cf4, col, ts, KeyValue.Type.Put, null);<a name="line.5401"></a>
+<span class="sourceLineNo">5402</span>    // storefile1<a name="line.5402"></a>
+<span class="sourceLineNo">5403</span>    Put put = new Put(row1);<a name="line.5403"></a>
+<span class="sourceLineNo">5404</span>    put.add(kv1);<a name="line.5404"></a>
 <span class="sourceLineNo">5405</span>    region.put(put);<a name="line.5405"></a>
 <span class="sourceLineNo">5406</span>    region.flush(true);<a name="line.5406"></a>
-<span class="sourceLineNo">5407</span>    // memstore<a name="line.5407"></a>
-<span class="sourceLineNo">5408</span>    put = new Put(row4);<a name="line.5408"></a>
-<span class="sourceLineNo">5409</span>    put.add(kv4);<a name="line.5409"></a>
+<span class="sourceLineNo">5407</span>    // storefile2<a name="line.5407"></a>
+<span class="sourceLineNo">5408</span>    put = new Put(row2);<a name="line.5408"></a>
+<span class="sourceLineNo">5409</span>    put.add(kv2);<a name="line.5409"></a>
 <span class="sourceLineNo">5410</span>    region.put(put);<a name="line.5410"></a>
-<span class="sourceLineNo">5411</span>    // scan range = ["row4", min)<a name="line.5411"></a>
-<span class="sourceLineNo">5412</span>    Scan scan = new Scan(row4);<a name="line.5412"></a>
-<span class="sourceLineNo">5413</span>    scan.setReversed(true);<a name="line.5413"></a>
-<span class="sourceLineNo">5414</span>    scan.setBatch(10);<a name="line.5414"></a>
-<span class="sourceLineNo">5415</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5415"></a>
-<span class="sourceLineNo">5416</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5416"></a>
-<span class="sourceLineNo">5417</span>    boolean hasNext = scanner.next(currRow);<a name="line.5417"></a>
-<span class="sourceLineNo">5418</span>    assertEquals(1, currRow.size());<a name="line.5418"></a>
-<span class="sourceLineNo">5419</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5419"></a>
-<span class="sourceLineNo">5420</span>        .get(0).getRowLength(), row4, 0, row4.length));<a name="line.5420"></a>
-<span class="sourceLineNo">5421</span>    assertTrue(hasNext);<a name="line.5421"></a>
-<span class="sourceLineNo">5422</span>    currRow.clear();<a name="line.5422"></a>
-<span class="sourceLineNo">5423</span>    hasNext = scanner.next(currRow);<a name="line.5423"></a>
-<span class="sourceLineNo">5424</span>    assertEquals(1, currRow.size());<a name="line.5424"></a>
-<span class="sourceLineNo">5425</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5425"></a>
-<span class="sourceLineNo">5426</span>        .get(0).getRowLength(), row3, 0, row3.length));<a name="line.5426"></a>
-<span class="sourceLineNo">5427</span>    assertTrue(hasNext);<a name="line.5427"></a>
-<span class="sourceLineNo">5428</span>    currRow.clear();<a name="line.5428"></a>
-<span class="sourceLineNo">5429</span>    hasNext = scanner.next(currRow);<a name="line.5429"></a>
-<span class="sourceLineNo">5430</span>    assertEquals(1, currRow.size());<a name="line.5430"></a>
-<span class="sourceLineNo">5431</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5431"></a>
-<span class="sourceLineNo">5432</span>        .get(0).getRowLength(), row2, 0, row2.length));<a name="line.5432"></a>
-<span class="sourceLineNo">5433</span>    assertTrue(hasNext);<a name="line.5433"></a>
-<span class="sourceLineNo">5434</span>    currRow.clear();<a name="line.5434"></a>
-<span class="sourceLineNo">5435</span>    hasNext = scanner.next(currRow);<a name="line.5435"></a>
-<span class="sourceLineNo">5436</span>    assertEquals(1, currRow.size());<a name="line.5436"></a>
-<span class="sourceLineNo">5437</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5437"></a>
-<span class="sourceLineNo">5438</span>        .get(0).getRowLength(), row1, 0, row1.length));<a name="line.5438"></a>
-<span class="sourceLineNo">5439</span>    assertFalse(hasNext);<a name="line.5439"></a>
-<span class="sourceLineNo">5440</span>  }<a name="line.5440"></a>
-<span class="sourceLineNo">5441</span><a name="line.5441"></a>
-<span class="sourceLineNo">5442</span>  /**<a name="line.5442"></a>
-<span class="sourceLineNo">5443</span>   * Test for HBASE-14497: Reverse Scan threw StackOverflow caused by readPt checking<a name="line.5443"></a>
-<span class="sourceLineNo">5444</span>   */<a name="line.5444"></a>
-<span class="sourceLineNo">5445</span>  @Test<a name="line.5445"></a>
-<span class="sourceLineNo">5446</span>  public void testReverseScanner_StackOverflow() throws IOException {<a name="line.5446"></a>
-<span class="sourceLineNo">5447</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5447"></a>
-<span class="sourceLineNo">5448</span>    byte[][] families = {cf1};<a name="line.5448"></a>
-<span class="sourceLineNo">5449</span>    byte[] col = Bytes.toBytes("C");<a name="line.5449"></a>
-<span class="sourceLineNo">5450</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5450"></a>
-<span class="sourceLineNo">5451</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5451"></a>
-<span class="sourceLineNo">5452</span>    // setup with one storefile and one memstore, to create scanner and get an earlier readPt<a name="line.5452"></a>
-<span class="sourceLineNo">5453</span>    Put put = new Put(Bytes.toBytes("19998"));<a name="line.5453"></a>
-<span class="sourceLineNo">5454</span>    put.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5454"></a>
-<span class="sourceLineNo">5455</span>    region.put(put);<a name="line.5455"></a>
-<span class="sourceLineNo">5456</span>    region.flushcache(true, true, FlushLifeCycleTracker.DUMMY);<a name="line.5456"></a>
-<span class="sourceLineNo">5457</span>    Put put2 = new Put(Bytes.toBytes("19997"));<a name="line.5457"></a>
-<span class="sourceLineNo">5458</span>    put2.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5458"></a>
-<span class="sourceLineNo">5459</span>    region.put(put2);<a name="line.5459"></a>
-<span class="sourceLineNo">5460</span><a name="line.5460"></a>
-<span class="sourceLineNo">5461</span>    Scan scan = new Scan(Bytes.toBytes("19998"));<a name="line.5461"></a>
-<span class="sourceLineNo">5462</span>    scan.setReversed(true);<a name="line.5462"></a>
-<span class="sourceLineNo">5463</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5463"></a>
-<span class="sourceLineNo">5464</span><a name="line.5464"></a>
-<span class="sourceLineNo">5465</span>    // create one storefile contains many rows will be skipped<a name="line.5465"></a>
-<span class="sourceLineNo">5466</span>    // to check StoreFileScanner.seekToPreviousRow<a name="line.5466"></a>
-<span class="sourceLineNo">5467</span>    for (int i = 10000; i &lt; 20000; i++) {<a name="line.5467"></a>
-<span class="sourceLineNo">5468</span>      Put p = new Put(Bytes.toBytes(""+i));<a name="line.5468"></a>
-<span class="sourceLineNo">5469</span>      p.addColumn(cf1, col, Bytes.toBytes("" + i));<a name="line.5469"></a>
-<span class="sourceLineNo">5470</span>      region.put(p);<a name="line.5470"></a>
-<span class="sourceLineNo">5471</span>    }<a name="line.5471"></a>
-<span class="sourceLineNo">5472</span>    region.flushcache(true, true, FlushLifeCycleTracker.DUMMY);<a name="line.5472"></a>
-<span class="sourceLineNo">5473</span><a name="line.5473"></a>
-<span class="sourceLineNo">5474</span>    // create one memstore contains many rows will be skipped<a name="line.5474"></a>
-<span class="sourceLineNo">5475</span>    // to check MemStoreScanner.seekToPreviousRow<a name="line.5475"></a>
-<span class="sourceLineNo">5476</span>    for (int i = 10000; i &lt; 20000; i++) {<a name="line.5476"></a>
-<span class="sourceLineNo">5477</span>      Put p = new Put(Bytes.toBytes(""+i));<a name="line.5477"></a>
-<span class="sourceLineNo">5478</span>      p.addColumn(cf1, col, Bytes.toBytes("" + i));<a name="line.5478"></a>
-<span class="sourceLineNo">5479</span>      region.put(p);<a name="line.5479"></a>
-<span class="sourceLineNo">5480</span>    }<a name="line.5480"></a>
-<span class="sourceLineNo">5481</span><a name="line.5481"></a>
-<span class="sourceLineNo">5482</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5482"></a>
-<span class="sourceLineNo">5483</span>    boolean hasNext;<a name="line.5483"></a>
-<span class="sourceLineNo">5484</span>    do {<a name="line.5484"></a>
-<span class="sourceLineNo">5485</span>      hasNext = scanner.next(currRow);<a name="line.5485"></a>
-<span class="sourceLineNo">5486</span>    } while (hasNext);<a name="line.5486"></a>
-<span class="sourceLineNo">5487</span>    assertEquals(2, currRow.size());<a name="line.5487"></a>
-<span class="sourceLineNo">5488</span>    assertEquals("19998", Bytes.toString(currRow.get(0).getRowArray(),<a name="line.5488"></a>
-<span class="sourceLineNo">5489</span>      currRow.get(0).getRowOffset(), currRow.get(0).getRowLength()));<a name="line.5489"></a>
-<span class="sourceLineNo">5490</span>    assertEquals("19997", Bytes.toString(currRow.get(1).getRowArray(),<a name="line.5490"></a>
-<span class="sourceLineNo">5491</span>      currRow.get(1).getRowOffset(), currRow.get(1).getRowLength()));<a name="line.5491"></a>
-<span class="sourceLineNo">5492</span>  }<a name="line.5492"></a>
-<span class="sourceLineNo">5493</span><a name="line.5493"></a>
-<span class="sourceLineNo">5494</span>  @Test<a name="line.5494"></a>
-<span class="sourceLineNo">5495</span>  public void testReverseScanShouldNotScanMemstoreIfReadPtLesser() throws Exception {<a name="line.5495"></a>
-<span class="sourceLineNo">5496</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5496"></a>
-<span class="sourceLineNo">5497</span>    byte[][] families = { cf1 };<a name="line.5497"></a>
-<span class="sourceLineNo">5498</span>    byte[] col = Bytes.toBytes("C");<a name="line.5498"></a>
-<span class="sourceLineNo">5499</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5499"></a>
-<span class="sourceLineNo">5500</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5500"></a>
-<span class="sourceLineNo">5501</span>    // setup with one storefile and one memstore, to create scanner and get an earlier readPt<a name="line.5501"></a>
-<span class="sourceLineNo">5502</span>    Put put = new Put(Bytes.toBytes("19996"));<a name="line.5502"></a>
-<span class="sourceLineNo">5503</span>    put.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5503"></a>
-<span class="sourceLineNo">5504</span>    region.put(put);<a name="line.5504"></a>
-<span class="sourceLineNo">5505</span>    Put put2 = new Put(Bytes.toBytes("19995"));<a name="line.5505"></a>
-<span class="sourceLineNo">5506</span>    put2.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5506"></a>
-<span class="sourceLineNo">5507</span>    region.put(put2);<a name="line.5507"></a>
-<span class="sourceLineNo">5508</span>    // create a reverse scan<a name="line.5508"></a>
-<span class="sourceLineNo">5509</span>    Scan scan = new Scan(Bytes.toBytes("19996"));<a name="line.5509"></a>
-<span class="sourceLineNo">5510</span>    scan.setReversed(true);<a name="line.5510"></a>
-<span class="sourceLineNo">5511</span>    RegionScannerImpl scanner = region.getScanner(scan);<a name="line.5511"></a>
-<span class="sourceLineNo">5512</span><a name="line.5512"></a>
-<span class="sourceLineNo">5513</span>    // flush the cache. This will reset the store scanner<a name="line.5513"></a>
-<span class="sourceLineNo">5514</span>    region.flushcache(true, true, FlushLifeCycleTracker.DUMMY);<a name="line.5514"></a>
-<span class="sourceLineNo">5515</span><a name="line.5515"></a>
-<span class="sourceLineNo">5516</span>    // create one memstore contains many rows will be skipped<a name="line.5516"></a>
-<span class="sourceLineNo">5517</span>    // to check MemStoreScanner.seekToPreviousRow<a name="line.5517"></a>
-<span class="sourceLineNo">5518</span>    for (int i = 10000; i &lt; 20000; i++) {<a name="line.5518"></a>
-<span class="sourceLineNo">5519</span>      Put p = new Put(Bytes.toBytes("" + i));<a name="line.5519"></a>
-<span class="sourceLineNo">5520</span>      p.addColumn(cf1, col, Bytes.toBytes("" + i));<a name="line.5520"></a>
-<span class="sourceLineNo">5521</span>      region.put(p);<a name="line.5521"></a>
-<span class="sourceLineNo">5522</span>    }<a name="line.5522"></a>
-<span class="sourceLineNo">5523</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5523"></a>
-<span class="sourceLineNo">5524</span>    boolean hasNext;<a name="line.5524"></a>
-<span class="sourceLineNo">5525</span>    boolean assertDone = false;<a name="line.5525"></a>
-<span class="sourceLineNo">5526</span>    do {<a name="line.5526"></a>
-<span class="sourceLineNo">5527</span>      hasNext = scanner.next(currRow);<a name="line.5527"></a>
-<span class="sourceLineNo">5528</span>      // With HBASE-15871, after the scanner is reset the memstore scanner should not be<a name="line.5528"></a>
-<span class="sourceLineNo">5529</span>      // added here<a name="line.5529"></a>
-<span class="sourceLineNo">5530</span>      if (!assertDone) {<a name="line.5530"></a>
-<span class="sourceLineNo">5531</span>        StoreScanner current =<a name="line.5531"></a>
-<span class="sourceLineNo">5532</span>            (StoreScanner) (scanner.storeHeap).getCurrentForTesting();<a name="line.5532"></a>
-<span class="sourceLineNo">5533</span>        List&lt;KeyValueScanner&gt; scanners = current.getAllScannersForTesting();<a name="line.5533"></a>
-<span class="sourceLineNo">5534</span>        assertEquals("There should be only one scanner the store file scanner", 1,<a name="line.5534"></a>
-<span class="sourceLineNo">5535</span>          scanners.size());<a name="line.5535"></a>
-<span class="sourceLineNo">5536</span>        assertDone = true;<a name="line.5536"></a>
-<span class="sourceLineNo">5537</span>      }<a name="line.5537"></a>
-<span class="sourceLineNo">5538</span>    } while (hasNext);<a name="line.5538"></a>
-<span class="sourceLineNo">5539</span>    assertEquals(2, currRow.size());<a name="line.5539"></a>
-<span class="sourceLineNo">5540</span>    assertEquals("19996", Bytes.toString(currRow.get(0).getRowArray(),<a name="line.5540"></a>
-<span class="sourceLineNo">5541</span>      currRow.get(0).getRowOffset(), currRow.get(0).getRowLength()));<a name="line.5541"></a>
-<span class="sourceLineNo">5542</span>    assertEquals("19995", Bytes.toString(currRow.get(1).getRowArray(),<a name="line.5542"></a>
-<span class="sourceLineNo">5543</span>      currRow.get(1).getRowOffset(), currRow.get(1).getRowLength()));<a name="line.5543"></a>
-<span class="sourceLineNo">5544</span>  }<a name="line.5544"></a>
-<span class="sourceLineNo">5545</span><a name="line.5545"></a>
-<span class="sourceLineNo">5546</span>  @Test<a name="line.5546"></a>
-<span class="sourceLineNo">5547</span>  public void testReverseScanWhenPutCellsAfterOpenReverseScan() throws Exception {<a name="line.5547"></a>
-<span class="sourceLineNo">5548</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5548"></a>
-<span class="sourceLineNo">5549</span>    byte[][] families = { cf1 };<a name="line.5549"></a>
-<span class="sourceLineNo">5550</span>    byte[] col = Bytes.toBytes("C");<a name="line.5550"></a>
-<span class="sourceLineNo">5551</span><a name="line.5551"></a>
-<span class="sourceLineNo">5552</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5552"></a>
-<span class="sourceLineNo">5553</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5553"></a>
-<span class="sourceLineNo">5554</span><a name="line.5554"></a>
-<span class="sourceLineNo">5555</span>    Put put = new Put(Bytes.toBytes("199996"));<a name="line.5555"></a>
-<span class="sourceLineNo">5556</span>    put.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5556"></a>
-<span class="sourceLineNo">5557</span>    region.put(put);<a name="line.5557"></a>
-<span class="sourceLineNo">5558</span>    Put put2 = new Put(Bytes.toBytes("199995"));<a name="line.5558"></a>
-<span class="sourceLineNo">5559</span>    put2.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5559"></a>
-<span class="sourceLineNo">5560</span>    region.put(put2);<a name="line.5560"></a>
+<span class="sourceLineNo">5411</span>    region.flush(true);<a name="line.5411"></a>
+<span class="sourceLineNo">5412</span>    // storefile3<a name="line.5412"></a>
+<span class="sourceLineNo">5413</span>    put = new Put(row3);<a name="line.5413"></a>
+<span class="sourceLineNo">5414</span>    put.add(kv3);<a name="line.5414"></a>
+<span class="sourceLineNo">5415</span>    region.put(put);<a name="line.5415"></a>
+<span class="sourceLineNo">5416</span>    region.flush(true);<a name="line.5416"></a>
+<span class="sourceLineNo">5417</span>    // memstore<a name="line.5417"></a>
+<span class="sourceLineNo">5418</span>    put = new Put(row4);<a name="line.5418"></a>
+<span class="sourceLineNo">5419</span>    put.add(kv4);<a name="line.5419"></a>
+<span class="sourceLineNo">5420</span>    region.put(put);<a name="line.5420"></a>
+<span class="sourceLineNo">5421</span>    // scan range = ["row4", min)<a name="line.5421"></a>
+<span class="sourceLineNo">5422</span>    Scan scan = new Scan(row4);<a name="line.5422"></a>
+<span class="sourceLineNo">5423</span>    scan.setReversed(true);<a name="line.5423"></a>
+<span class="sourceLineNo">5424</span>    scan.setBatch(10);<a name="line.5424"></a>
+<span class="sourceLineNo">5425</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5425"></a>
+<span class="sourceLineNo">5426</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5426"></a>
+<span class="sourceLineNo">5427</span>    boolean hasNext = scanner.next(currRow);<a name="line.5427"></a>
+<span class="sourceLineNo">5428</span>    assertEquals(1, currRow.size());<a name="line.5428"></a>
+<span class="sourceLineNo">5429</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5429"></a>
+<span class="sourceLineNo">5430</span>        .get(0).getRowLength(), row4, 0, row4.length));<a name="line.5430"></a>
+<span class="sourceLineNo">5431</span>    assertTrue(hasNext);<a name="line.5431"></a>
+<span class="sourceLineNo">5432</span>    currRow.clear();<a name="line.5432"></a>
+<span class="sourceLineNo">5433</span>    hasNext = scanner.next(currRow);<a name="line.5433"></a>
+<span class="sourceLineNo">5434</span>    assertEquals(1, currRow.size());<a name="line.5434"></a>
+<span class="sourceLineNo">5435</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5435"></a>
+<span class="sourceLineNo">5436</span>        .get(0).getRowLength(), row3, 0, row3.length));<a name="line.5436"></a>
+<span class="sourceLineNo">5437</span>    assertTrue(hasNext);<a name="line.5437"></a>
+<span class="sourceLineNo">5438</span>    currRow.clear();<a name="line.5438"></a>
+<span class="sourceLineNo">5439</span>    hasNext = scanner.next(currRow);<a name="line.5439"></a>
+<span class="sourceLineNo">5440</span>    assertEquals(1, currRow.size());<a name="line.5440"></a>
+<span class="sourceLineNo">5441</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5441"></a>
+<span class="sourceLineNo">5442</span>        .get(0).getRowLength(), row2, 0, row2.length));<a name="line.5442"></a>
+<span class="sourceLineNo">5443</span>    assertTrue(hasNext);<a name="line.5443"></a>
+<span class="sourceLineNo">5444</span>    currRow.clear();<a name="line.5444"></a>
+<span class="sourceLineNo">5445</span>    hasNext = scanner.next(currRow);<a name="line.5445"></a>
+<span class="sourceLineNo">5446</span>    assertEquals(1, currRow.size());<a name="line.5446"></a>
+<span class="sourceLineNo">5447</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5447"></a>
+<span class="sourceLineNo">5448</span>        .get(0).getRowLength(), row1, 0, row1.length));<a name="line.5448"></a>
+<span class="sourceLineNo">5449</span>    assertFalse(hasNext);<a name="line.5449"></a>
+<span class="sourceLineNo">5450</span>  }<a name="line.5450"></a>
+<span class="sourceLineNo">5451</span><a name="line.5451"></a>
+<span class="sourceLineNo">5452</span>  /**<a name="line.5452"></a>
+<span class="sourceLineNo">5453</span>   * Test for HBASE-14497: Reverse Scan threw StackOverflow caused by readPt checking<a name="line.5453"></a>
+<span class="sourceLineNo">5454</span>   */<a name="line.5454"></a>
+<span class="sourceLineNo">5455</span>  @Test<a name="line.5455"></a>
+<span class="sourceLineNo">5456</span>  public void testReverseScanner_StackOverflow() throws IOException {<a name="line.5456"></a>
+<span class="sourceLineNo">5457</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5457"></a>
+<span class="sourceLineNo">5458</span>    byte[][] families = {cf1};<a name="line.5458"></a>
+<span class="sourceLineNo">5459</span>    byte[] col = Bytes.toBytes("C");<a name="line.5459"></a>
+<span class="sourceLineNo">5460</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5460"></a>
+<span class="sourceLineNo">5461</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5461"></a>
+<span class="sourceLineNo">5462</span>    // setup with one storefile and one memstore, to create scanner and get an earlier readPt<a name="line.5462"></a>
+<span class="sourceLineNo">5463</span>    Put put = new Put(Bytes.toBytes("19998"));<a name="line.5463"></a>
+<span class="sourceLineNo">5464</span>    put.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5464"></a>
+<span class="sourceLineNo">5465</span>    region.put(put);<a name="line.5465"></a>
+<span class="sourceLineNo">5466</span>    region.flushcache(true, true, FlushLifeCycleTracker.DUMMY);<a name="line.5466"></a>
+<span class="sourceLineNo">5467</span>    Put put2 = new Put(Bytes.toBytes("19997"));<a name="line.5467"></a>
+<span class="sourceLineNo">5468</span>    put2.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5468"></a>
+<span class="sourceLineNo">5469</span>    region.put(put2);<a name="line.5469"></a>
+<span class="sourceLineNo">5470</span><a name="line.5470"></a>
+<span class="sourceLineNo">5471</span>    Scan scan = new Scan(Bytes.toBytes("19998"));<a name="line.5471"></a>
+<span class="sourceLineNo">5472</span>    scan.setReversed(true);<a name="line.5472"></a>
+<span class="sourceLineNo">5473</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5473"></a>
+<span class="sourceLineNo">5474</span><a name="line.5474"></a>
+<span class="sourceLineNo">5475</span>    // create one storefile contains many rows will be skipped<a name="line.5475"></a>
+<span class="sourceLineNo">5476</span>    // to check StoreFileScanner.seekToPreviousRow<a name="line.5476"></a>
+<span class="sourceLineNo">5477</span>    for (int i = 10000; i &lt; 20000; i++) {<a name="line.5477"></a>
+<span class="sourceLineNo">5478</span>      Put p = new Put(Bytes.toBytes(""+i));<a name="line.5478"></a>
+<span class="sourceLineNo">5479</span>      p.addColumn(cf1, col, Bytes.toBytes("" + i));<a name="line.5479"></a>
+<span class="sourceLineNo">5480</span>      region.put(p);<a name="line.5480"></a>
+<span class="sourceLineNo">5481</span>    }<a name="line.5481"></a>
+<span class="sourceLineNo">5482</span>    region.flushcache(true, true, FlushLifeCycleTracker.DUMMY);<a name="line.5482"></a>
+<span class="sourceLineNo">5483</span><a name="line.5483"></a>
+<span class="sourceLineNo">5484</span>    // create one memstore contains many rows will be skipped<a name="line.5484"></a>
+<span class="sourceLineNo">5485</span>    // to check MemStoreScanner.seekToPreviousRow<a name="line.5485"></a>
+<span class="sourceLineNo">5486</span>    for (int i = 10000; i &lt; 20000; i++) {<a name="line.5486"></a>
+<span class="sourceLineNo">5487</span>      Put p = new Put(Bytes.toBytes(""+i));<a name="line.5487"></a>
+<span class="sourceLineNo">5488</span>      p.addColumn(cf1, col, Bytes.toBytes("" + i));<a name="line.5488"></a>
+<span class="sourceLineNo">5489</span>      region.put(p);<a name="line.5489"></a>
+<span class="sourceLineNo">5490</span>    }<a name="line.5490"></a>
+<span class="sourceLineNo">5491</span><a name="line.5491"></a>
+<span class="sourceLineNo">5492</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5492"></a>
+<span class="sourceLineNo">5493</span>    boolean hasNext;<a name="line.5493"></a>
+<span class="sourceLineNo">5494</span>    do {<a name="line.5494"></a>
+<span class="sourceLineNo">5495</span>      hasNext = scanner.next(currRow);<a name="line.5495"></a>
+<span class="sourceLineNo">5496</span>    } while (hasNext);<a name="line.5496"></a>
+<span class="sourceLineNo">5497</span>    assertEquals(2, currRow.size());<a name="line.5497"></a>
+<span class="sourceLineNo">5498</span>    assertEquals("19998", Bytes.toString(currRow.get(0).getRowArray(),<a name="line.5498"></a>
+<span class="sourceLineNo">5499</span>      currRow.get(0).getRowOffset(), currRow.get(0).getRowLength()));<a name="line.5499"></a>
+<span class="sourceLineNo">5500</span>    assertEquals("19997", Bytes.toString(currRow.get(1).getRowArray(),<a name="line.5500"></a>
+<span class="sourceLineNo">5501</span>      currRow.get(1).getRowOffset(), currRow.get(1).getRowLength()));<a name="line.5501"></a>
+<span class="sourceLineNo">5502</span>  }<a name="line.5502"></a>
+<span class="sourceLineNo">5503</span><a name="line.5503"></a>
+<span class="sourceLineNo">5504</span>  @Test<a name="line.5504"></a>
+<span class="sourceLineNo">5505</span>  public void testReverseScanShouldNotScanMemstoreIfReadPtLesser() throws Exception {<a name="line.5505"></a>
+<span class="sourceLineNo">5506</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5506"></a>
+<span class="sourceLineNo">5507</span>    byte[][] families = { cf1 };<a name="line.5507"></a>
+<span class="sourceLineNo">5508</span>    byte[] col = Bytes.toBytes("C");<a name="line.5508"></a>
+<span class="sourceLineNo">5509</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5509"></a>
+<span class="sourceLineNo">5510</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5510"></a>
+<span class="sourceLineNo">5511</span>    // setup with one storefile and one memstore, to create scanner and get an earlier readPt<a name="line.5511"></a>
+<span class="sourceLineNo">5512</span>    Put put = new Put(Bytes.toBytes("19996"));<a name="line.5512"></a>
+<span class="sourceLineNo">5513</span>    put.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5513"></a>
+<span class="sourceLineNo">5514</span>    region.put(put);<a name="line.5514"></a>
+<span class="sourceLineNo">5515</span>    Put put2 = new Put(Bytes.toBytes("19995"));<a name="line.5515"></a>
+<span class="sourceLineNo">5516</span>    put2.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5516"></a>
+<span class="sourceLineNo">5517</span>    region.put(put2);<a name="line.5517"></a>
+<span class="sourceLineNo">5518</span>    // create a reverse scan<a name="line.5518"></a>
+<span class="sourceLineNo">5519</span>    Scan scan = new Scan(Bytes.toBytes("19996"));<a name="line.5519"></a>
+<span class="sourceLineNo">5520</span>    scan.setReversed(true);<a name="line.5520"></a>
+<span class="sourceLineNo">5521</span>    RegionScannerImpl scanner = region.getScanner(scan);<a name="line.5521"></a>
+<span class="sourceLineNo">5522</span><a name="line.5522"></a>
+<span class="sourceLineNo">5523</span>    // flush the cache. This will reset the store scanner<a name="line.5523"></a>
+<span class="sourceLineNo">5524</span>    region.flushcache(true, true, FlushLifeCycleTracker.DUMMY);<a name="line.5524"></a>
+<span class="sourceLineNo">5525</span><a name="line.5525"></a>
+<span class="sourceLineNo">5526</span>    // create one memstore contains many rows will be skipped<a name="line.5526"></a>
+<span class="sourceLineNo">5527</span>    // to check MemStoreScanner.seekToPreviousRow<a name="line.5527"></a>
+<span class="sourceLineNo">5528</span>    for (int i = 10000; i &lt; 20000; i++) {<a name="line.5528"></a>
+<span class="sourceLineNo">5529</span>      Put p = new Put(Bytes.toBytes("" + i));<a name="line.5529"></a>
+<span class="sourceLineNo">5530</span>      p.addColumn(cf1, col, Bytes.toBytes("" + i));<a name="line.5530"></a>
+<span class="sourceLineNo">5531</span>      region.put(p);<a name="line.5531"></a>
+<span class="sourceLineNo">5532</span>    }<a name="line.5532"></a>
+<span class="sourceLineNo">5533</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5533"></a>
+<span class="sourceLineNo">5534</span>    boolean hasNext;<a name="line.5534"></a>
+<span class="sourceLineNo">5535</span>    boolean assertDone = false;<a name="line.5535"></a>
+<span class="sourceLineNo">5536</span>    do {<a name="line.5536"></a>
+<span class="sourceLineNo">5537</span>      hasNext = scanner.next(currRow);<a name="line.5537"></a>
+<span class="sourceLineNo">5538</span>      // With HBASE-15871, after the scanner is reset the memstore scanner should not be<a name="line.5538"></a>
+<span class="sourceLineNo">5539</span>      // added here<a name="line.5539"></a>
+<span class="sourceLineNo">5540</span>      if (!assertDone) {<a name="line.5540"></a>
+<span class="sourceLineNo">5541</span>        StoreScanner current =<a name="line.5541"></a>
+<span class="sourceLineNo">5542</span>            (StoreScanner) (scanner.storeHeap).getCurrentForTesting();<a name="line.5542"></a>
+<span class="sourceLineNo">5543</span>        List&lt;KeyValueScanner&gt; scanners = current.getAllScannersForTesting();<a name="line.5543"></a>
+<span class="sourceLineNo">5544</span>        assertEquals("There should be only one scanner the store file scanner", 1,<a name="line.5544"></a>
+<span class="sourceLineNo">5545</span>          scanners.size());<a name="line.5545"></a>
+<span class="sourceLineNo">5546</span>        assertDone = true;<a name="line.5546"></a>
+<span class="sourceLineNo">5547</span>      }<a name="line.5547"></a>
+<span class="sourceLineNo">5548</span>    } while (hasNext);<a name="line.5548"></a>
+<span class="sourceLineNo">5549</span>    assertEquals(2, currRow.size());<a name="line.5549"></a>
+<span class="sourceLineNo">5550</span>    assertEquals("19996", Bytes.toString(currRow.get(0).getRowArray(),<a name="line.5550"></a>
+<span class="sourceLineNo">5551</span>      currRow.get(0).getRowOffset(), currRow.get(0).getRowLength()));<a name="line.5551"></a>
+<span class="sourceLineNo">5552</span>    assertEquals("19995", Bytes.toString(currRow.get(1).getRowArray(),<a name="line.5552"></a>
+<span class="sourceLineNo">5553</span>      currRow.get(1).getRowOffset(), currRow.get(1).getRowLength()));<a name="line.5553"></a>
+<span class="sourceLineNo">5554</span>  }<a name="line.5554"></a>
+<span class="sourceLineNo">5555</span><a name="line.5555"></a>
+<span class="sourceLineNo">5556</span>  @Test<a name="line.5556"></a>
+<span class="sourceLineNo">5557</span>  public void testReverseScanWhenPutCellsAfterOpenReverseScan() throws Exception {<a name="line.5557"></a>
+<span class="sourceLineNo">5558</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5558"></a>
+<span class="sourceLineNo">5559</span>    byte[][] families = { cf1 };<a name="line.5559"></a>
+<span class="sourceLineNo">5560</span>    byte[] col = Bytes.toBytes("C");<a name="line.5560"></a>
 <span class="sourceLineNo">5561</span><a name="line.5561"></a>
-<span class="sourceLineNo">5562</span>    // Create a reverse scan<a name="line.5562"></a>
-<span class="sourceLineNo">5563</span>    Scan scan = new Scan(Bytes.toBytes("199996"));<a name="line.5563"></a>
-<span class="sourceLineNo">5564</span>    scan.setReversed(true);<a name="line.5564"></a>
-<span class="sourceLineNo">5565</span>    RegionScannerImpl scanner = region.getScanner(scan);<a name="line.5565"></a>
-<span class="sourceLineNo">5566</span><a name="line.5566"></a>
-<span class="sourceLineNo">5567</span>    // Put a lot of cells that have sequenceIDs grater than the readPt of the reverse scan<a name="line.5567"></a>
-<span class="sourceLineNo">5568</span>    for (int i = 100000; i &lt; 200000; i++) {<a name="line.5568"></a>
-<span class="sourceLineNo">5569</span>      Put p = new Put(Bytes.toBytes("" + i));<a name="line.5569"></a>
-<span class="sourceLineNo">5570</span>      p.addColumn(cf1, col, Bytes.toBytes("" + i));<a name="line.5570"></a>
-<span class="sourceLineNo">5571</span>      region.put(p);<a name="line.5571"></a>
-<span class="sourceLineNo">5572</span>    }<a name="line.5572"></a>
-<span class="sourceLineNo">5573</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5573"></a>
-<span class="sourceLineNo">5574</span>    boolean hasNext;<a name="line.5574"></a>
-<span class="sourceLineNo">5575</span>    do {<a name="line.5575"></a>
-<span class="sourceLineNo">5576</span>      hasNext = scanner.next(currRow);<a name="line.5576"></a>
-<span class="sourceLineNo">5577</span>    } while (hasNext);<a name="line.5577"></a>
-<span class="sourceLineNo">5578</span><a name="line.5578"></a>
-<span class="sourceLineNo">5579</span>    assertEquals(2, currRow.size());<a name="line.5579"></a>
-<span class="sourceLineNo">5580</span>    assertEquals("199996", Bytes.toString(currRow.get(0).getRowArray(),<a name="line.5580"></a>
-<span class="sourceLineNo">5581</span>      currRow.get(0).getRowOffset(), currRow.get(0).getRowLength()));<a name="line.5581"></a>
-<span class="sourceLineNo">5582</span>    assertEquals("199995", Bytes.toString(currRow.get(1).getRowArray(),<a name="line.5582"></a>
-<span class="sourceLineNo">5583</span>      currRow.get(1).getRowOffset(), currRow.get(1).getRowLength()));<a name="line.5583"></a>
-<span class="sourceLineNo">5584</span>  }<a name="line.5584"></a>
-<span class="sourceLineNo">5585</span><a name="line.5585"></a>
-<span class="sourceLineNo">5586</span>  @Test<a name="line.5586"></a>
-<span class="sourceLineNo">5587</span>  public void testWriteRequestsCounter() throws IOException {<a name="line.5587"></a>
-<span class="sourceLineNo">5588</span>    byte[] fam = Bytes.toBytes("info");<a name="line.5588"></a>
-<span class="sourceLineNo">5589</span>    byte[][] families = { fam };<a name="line.5589"></a>
-<span class="sourceLineNo">5590</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.5590"></a>
-<span class="sourceLineNo">5591</span><a name="line.5591"></a>
-<span class="sourceLineNo">5592</span>    Assert.assertEquals(0L, region.getWriteRequestsCount());<a name="line.5592"></a>
-<span class="sourceLineNo">5593</span><a name="line.5593"></a>
-<span class="sourceLineNo">5594</span>    Put put = new Put(row);<a name="line.5594"></a>
-<span class="sourceLineNo">5595</span>    put.addColumn(fam, fam, fam);<a name="line.5595"></a>
-<span class="sourceLineNo">5596</span><a name="line.5596"></a>
-<span class="sourceLineNo">5597</span>    Assert.assertEquals(0L, region.getWriteRequestsCount());<a name="line.5597"></a>
-<span class="sourceLineNo">5598</span>    region.put(put);<a name="line.5598"></a>
-<span class="sourceLineNo">5599</span>    Assert.assertEquals(1L, region.getWriteRequestsCount());<a name="line.5599"></a>
-<span class="sourceLineNo">5600</span>    region.put(put);<a name="line.5600"></a>
-<span class="sourceLineNo">5601</span>    Assert.assertEquals(2L, region.getWriteRequestsCount());<a name="line.5601"></a>
-<span class="sourceLineNo">5602</span>    region.put(put);<a name="line.5602"></a>
-<span class="sourceLineNo">5603</span>    Assert.assertEquals(3L, region.getWriteRequestsCount());<a name="line.5603"></a>
-<span class="sourceLineNo">5604</span><a name="line.5604"></a>
-<span class="sourceLineNo">5605</span>    region.delete(new Delete(row));<a name="line.5605"></a>
-<span class="sourceLineNo">5606</span>    Assert.assertEquals(4L, region.getWriteRequestsCount());<a name="line.5606"></a>
-<span class="sourceLineNo">5607</span>  }<a name="line.5607"></a>
-<span class="sourceLineNo">5608</span><a name="line.5608"></a>
-<span class="sourceLineNo">5609</span>  @Test<a name="line.5609"></a>
-<span class="sourceLineNo">5610</span>  public void testOpenRegionWrittenToWAL() throws Exception {<a name="line.5610"></a>
-<span class="sourceLineNo">5611</span>    final ServerName serverName = ServerName.valueOf(name.getMethodName(), 100, 42);<a name="line.5611"></a>
-<span class="sourceLineNo">5612</span>    final RegionServerServices rss = spy(TEST_UTIL.createMockRegionServerService(serverName));<a name="line.5612"></a>
-<span class="sourceLineNo">5613</span><a name="line.5613"></a>
-<span class="sourceLineNo">5614</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.5614"></a>
-<span class="sourceLineNo">5615</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.5615"></a>
-<span class="sourceLineNo">5616</span>    htd.addFamily(new HColumnDescriptor(fam2));<a name="line.5616"></a>
-<span class="sourceLineNo">5617</span><a name="line.5617"></a>
-<span class="sourceLineNo">5618</span>    HRegionInfo hri = new HRegionInfo(htd.getTableName(),<a name="line.5618"></a>
-<span class="sourceLineNo">5619</span>      HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY);<a name="line.5619"></a>
-<span class="sourceLineNo">5620</span><a name="line.5620"></a>
-<span class="sourceLineNo">5621</span>    // open the region w/o rss and wal and flush some files<a name="line.5621"></a>
-<span class="sourceLineNo">5622</span>    region =<a name="line.5622"></a>
-<span class="sourceLineNo">5623</span>         HBaseTestingUtility.createRegionAndWAL(hri, TEST_UTIL.getDataTestDir(), TEST_UTIL<a name="line.5623"></a>
-<span class="sourceLineNo">5624</span>             .getConfiguration(), htd);<a name="line.5624"></a>
-<span class="sourceLineNo">5625</span>    assertNotNull(region);<a name="line.5625"></a>
-<span class="sourceLineNo">5626</span><a name="line.5626"></a>
-<span class="sourceLineNo">5627</span>    // create a file in fam1 for the region before opening in OpenRegionHandler<a name="line.5627"></a>
-<span class="sourceLineNo">5628</span>    region.put(new Put(Bytes.toBytes("a")).addColumn(fam1, fam1, fam1));<a name="line.5628"></a>
-<span class="sourceLineNo">5629</span>    region.flush(true);<a name="line.5629"></a>
-<span class="sourceLineNo">5630</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.5630"></a>
-<span class="sourceLineNo">5631</span><a name="line.5631"></a>
-<span class="sourceLineNo">5632</span>    ArgumentCaptor&lt;WALEdit&gt; editCaptor = ArgumentCaptor.forClass(WALEdit.class);<a name="line.5632"></a>
-<span class="sourceLineNo">5633</span><a name="line.5633"></a>
-<span class="sourceLineNo">5634</span>    // capture append() calls<a name="line.5634"></a>
-<span class="sourceLineNo">5635</span>    WAL wal = mockWAL();<a name="line.5635"></a>
-<span class="sourceLineNo">5636</span>    when(rss.getWAL((HRegionInfo) any())).thenReturn(wal);<a name="line.5636"></a>
-<span class="sourceLineNo">5637</span><a name="line.5637"></a>
-<span class="sourceLineNo">5638</span>    region = HRegion.openHRegion(hri, htd, rss.getWAL(hri),<a name="line.5638"></a>
-<span class="sourceLineNo">5639</span>      TEST_UTIL.getConfiguration(), rss, null);<a name="line.5639"></a>
-<span class="sourceLineNo">5640</span><a name="line.5640"></a>
-<span class="sourceLineNo">5641</span>    verify(wal, times(1)).append((HRegionInfo)any(), (WALKeyImpl)any()<a name="line.5641"></a>
-<span class="sourceLineNo">5642</span>      , editCaptor.capture(), anyBoolean());<a name="line.5642"></a>
+<span class="sourceLineNo">5562</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5562"></a>
+<span class="sourceLineNo">5563</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5563"></a>
+<span class="sourceLineNo">5564</span><a name="line.5564"></a>
+<span class="sourceLineNo">5565</span>    Put put = new Put(Bytes.toBytes("199996"));<a name="line.5565"></a>
+<span class="sourceLineNo">5566</span>    put.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5566"></a>
+<span class="sourceLineNo">5567</span>    region.put(put);<a name="line.5567"></a>
+<span class="sourceLineNo">5568</span>    Put put2 = new Put(Bytes.toBytes("199995"));<a name="line.5568"></a>
+<span class="sourceLineNo">5569</span>    put2.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5569"></a>
+<span class="sourceLineNo">5570</span>    region.put(put2);<a name="line.5570"></a>
+<span class="sourceLineNo">5571</span><a name="line.5571"></a>
+<span class="sourceLineNo">5572</span>    // Create a reverse scan<a name="line.5572"></a>
+<span class="sourceLineNo">5573</span>    Scan scan = new Scan(Bytes.toBytes("199996"));<a name="line.5573"></a>
+<span class="sourceLineNo">5574</span>    scan.setReversed(true);<a name="line.5574"></a>
+<span class="sourceLineNo">5575</span>    RegionScannerImpl scanner = region.getScanner(scan);<a name="line.5575"></a>
+<span class="sourceLineNo">5576</span><a name="line.5576"></a>
+<span class="sourceLineNo">5577</span>    // Put a lot of cells that have sequenceIDs grater than the readPt of the reverse scan<a name="line.5577"></a>
+<span class="sourceLineNo">5578</span>    for (int i = 100000; i &lt; 200000; i++) {<a name="line.5578"></a>
+<span class="sourceLineNo">5579</span>      Put p = new Put(Bytes.toBytes("" + i));<a name="line.5579"></a>
+<span class="sourceLineNo">5580</span>      p.addColumn(cf1, col, Bytes.toBytes("" + i));<a name="line.5580"></a>
+<span class="sourceLineNo">5581</span>      region.put(p);<a name="line.5581"></a>
+<span class="sourceLineNo">5582</span>    }<a name="line.5582"></a>
+<span class="sourceLineNo">5583</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5583"></a>
+<span class="sourceLineNo">5584</span>    boolean hasNext;<a name="line.5584"></a>
+<span class="sourceLineNo">5585</span>    do {<a name="line.5585"></a>
+<span class="sourceLineNo">5586</span>      hasNext = scanner.next(currRow);<a name="line.5586"></a>
+<span class="sourceLineNo">5587</span>    } while (hasNext);<a name="line.5587"></a>
+<span class="sourceLineNo">5588</span><a name="line.5588"></a>
+<span class="sourceLineNo">5589</span>    assertEquals(2, currRow.size());<a name="line.5589"></a>
+<span class="sourceLineNo">5590</span>    assertEquals("199996", Bytes.toString(currRow.get(0).getRowArray(),<a name="line.5590"></a>
+<span class="sourceLineNo">5591</span>      currRow.get(0).getRowOffset(), currRow.get(0).getRowLength()));<a name="line.5591"></a>
+<span class="sourceLineNo">5592</span>    assertEquals("199995", Bytes.toString(currRow.get(1).getRowArray(),<a name="line.5592"></a>
+<span class="sourceLineNo">5593</span>      currRow.get(1).getRowOffset(), currRow.get(1).getRowLength()));<a name="line.5593"></a>
+<span class="sourceLineNo">5594</span>  }<a name="line.5594"></a>
+<span class="sourceLineNo">5595</span><a name="line.5595"></a>
+<span class="sourceLineNo">5596</span>  @Test<a name="line.5596"></a>
+<span class="sourceLineNo">5597</span>  public void testWriteRequestsCounter() throws IOException {<a name="line.5597"></a>
+<span class="sourceLineNo">5598</span>    byte[] fam = Bytes.toBytes("info");<a name="line.5598"></a>
+<span class="sourceLineNo">5599</span>    byte[][] families = { fam };<a name="line.5599"></a>
+<span class="sourceLineNo">5600</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.5600"></a>
+<span class="sourceLineNo">5601</span><a name="line.5601"></a>
+<span class="sourceLineNo">5602</span>    Assert.assertEquals(0L, region.getWriteRequestsCount());<a name="line.5602"></a>
+<span class="sourceLineNo">5603</span><a name="line.5603"></a>
+<span class="sourceLineNo">5604</span>    Put put = new Put(row);<a name="line.5604"></a>
+<span class="sourceLineNo">5605</span>    put.addColumn(fam, fam, fam);<a name="line.5605"></a>
+<span class="sourceLineNo">5606</span><a name="line.5606"></a>
+<span class="sourceLineNo">5607</span>    Assert.assertEquals(0L, region.getWriteRequestsCount());<a name="line.5607"></a>
+<span class="sourceLineNo">5608</span>    region.put(put);<a name="line.5608"></a>
+<span class="sourceLineNo">5609</span>    Assert.assertEquals(1L, region.getWriteRequestsCount());<a name="line.5609"></a>
+<span class="sourceLineNo">5610</span>    region.put(put);<a name="line.5610"></a>
+<span class="sourceLineNo">5611</span>    Assert.assertEquals(2L, region.getWriteRequestsCount());<a name="line.5611"></a>
+<span class="sourceLineNo">5612</span>    region.put(put);<a name="line.5612"></a>
+<span class="sourceLineNo">5613</span>    Assert.assertEquals(3L, region.getWriteRequestsCount());<a name="line.5613"></a>
+<span class="sourceLineNo">5614</span><a name="line.5614"></a>
+<span class="sourceLineNo">5615</span>    region.delete(new Delete(row));<a name="line.5615"></a>
+<span class="sourceLineNo">5616</span>    Assert.assertEquals(4L, region.getWriteRequestsCount());<a name="line.5616"></a>
+<span class="sourceLineNo">5617</span>  }<a name="line.5617"></a>
+<span class="sourceLineNo">5618</span><a name="line.5618"></a>
+<span class="sourceLineNo">5619</span>  @Test<a name="line.5619"></a>
+<span class="sourceLineNo">5620</span>  public void testOpenRegionWrittenToWAL() throws Exception {<a name="line.5620"></a>
+<span class="sourceLineNo">5621</span>    final ServerName serverName = ServerName.valueOf(name.getMethodName(), 100, 42);<a name="line.5621"></a>
+<span class="sourceLineNo">5622</span>    final RegionServerServices rss = spy(TEST_UTIL.createMockRegionServerService(serverName));<a name="line.5622"></a>
+<span class="sourceLineNo">5623</span><a name="line.5623"></a>
+<span class="sourceLineNo">5624</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.5624"></a>
+<span class="sourceLineNo">5625</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.5625"></a>
+<span class="sourceLineNo">5626</span>    htd.addFamily(new HColumnDescriptor(fam2));<a name="line.5626"></a>
+<span class="sourceLineNo">5627</span><a name="line.5627"></a>
+<span class="sourceLineNo">5628</span>    HRegionInfo hri = new HRegionInfo(htd.getTableName(),<a name="line.5628"></a>
+<span class="sourceLineNo">5629</span>      HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY);<a name="line.5629"></a>
+<span class="sourceLineNo">5630</span><a name="line.5630"></a>
+<span class="sourceLineNo">5631</span>    // open the region w/o rss and wal and flush some files<a name="line.5631"></a>
+<span class="sourceLineNo">5632</span>    region =<a name="line.5632"></a>
+<span class="sourceLineNo">5633</span>         HBaseTestingUtility.createRegionAndWAL(hri, TEST_UTIL.getDataTestDir(), TEST_UTIL<a name="line.5633"></a>
+<span class="sourceLineNo">5634</span>             .getConfiguration(), htd);<a name="line.5634"></a>
+<span class="sourceLineNo">5635</span>    assertNotNull(region);<a name="line.5635"></a>
+<span class="sourceLineNo">5636</span><a name="line.5636"></a>
+<span class="sourceLineNo">5637</span>    // create a file in fam1 for the region before opening in OpenRegionHandler<a name="line.5637"></a>
+<span class="sourceLineNo">5638</span>    region.put(new Put(Bytes.toBytes("a")).addColumn(fam1, fam1, fam1));<a name="line.5638"></a>
+<span class="sourceLineNo">5639</span>    region.flush(true);<a name="line.5639"></a>
+<span class="sourceLineNo">5640</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.5640"></a>
+<span class="sourceLineNo">5641</span><a name="line.5641"></a>
+<span class="sourceLineNo">5642</span>    ArgumentCaptor&lt;WALEdit&gt; editCaptor = ArgumentCaptor.forClass(WALEdit.class);<a name="line.5642"></a>
 <span class="sourceLineNo">5643</span><a name="line.5643"></a>
-<span class="sourceLineNo">5644</span>    WALEdit edit = editCaptor.getValue();<a name="line.5644"></a>
-<span class="sourceLineNo">5645</span>    assertNotNull(edit);<a name="line.5645"></a>
-<span class="sourceLineNo">5646</span>    assertNotNull(edit.getCells());<a name="line.5646"></a>
-<span class="sourceLineNo">5647</span>    assertEquals(1, edit.getCells().size());<a name="line.5647"></a>
-<span class="sourceLineNo">5648</span>    RegionEventDescriptor desc = WALEdit.getRegionEventDescriptor(edit.getCells().get(0));<a name="line.5648"></a>
-<span class="sourceLineNo">5649</span>    assertNotNull(desc);<a name="line.5649"></a>
+<span class="sourceLineNo">5644</span>    // capture append() calls<a name="line.5644"></a>
+<span class="sourceLineNo">5645</span>    WAL wal = mockWAL();<a name="line.5645"></a>
+<span class="sourceLineNo">5646</span>    when(rss.getWAL((HRegionInfo) any())).thenReturn(wal);<a name="line.5646"></a>
+<span class="sourceLineNo">5647</span><a name="line.5647"></a>
+<span class="sourceLineNo">5648</span>    region = HRegion.openHRegion(hri, htd, rss.getWAL(hri),<a name="line.5648"></a>
+<span class="sourceLineNo">5649</span>      TEST_UTIL.getConfiguration(), rss, null);<a name="line.5649"></a>
 <span class="sourceLineNo">5650</span><a name="line.5650"></a>
-<span class="sourceLineNo">5651</span>    LOG.info("RegionEventDescriptor from WAL: " + desc);<a name="line.5651"></a>
-<span class="sourceLineNo">5652</span><a name="line.5652"></a>
-<span class="sourceLineNo">5653</span>    assertEquals(RegionEventDescriptor.EventType.REGION_OPEN, desc.getEventType());<a name="line.5653"></a>
-<span class="sourceLineNo">5654</span>    assertTrue(Bytes.equals(desc.getTableName().toByteArray(), htd.getTableName().toBytes()));<a name="line.5654"></a>
-<span class="sourceLineNo">5655</span>    assertTrue(Bytes.equals(desc.getEncodedRegionName().toByteArray(),<a name="line.5655"></a>
-<span class="sourceLineNo">5656</span>      hri.getEncodedNameAsBytes()));<a name="line.5656"></a>
-<span class="sourceLineNo">5657</span>    assertTrue(desc.getLogSequenceNumber() &gt; 0);<a name="line.5657"></a>
-<span class="sourceLineNo">5658</span>    assertEquals(serverName, ProtobufUtil.toServerName(desc.getServer()));<a name="line.5658"></a>
-<span class="sourceLineNo">5659</span>    assertEquals(2, desc.getStoresCount());<a name="line.5659"></a>
+<span class="sourceLineNo">5651</span>    verify(wal, times(1)).append((HRegionInfo)any(), (WALKeyImpl)any()<a name="line.5651"></a>
+<span class="sourceLineNo">5652</span>      , editCaptor.capture(), anyBoolean());<a name="line.5652"></a>
+<span class="sourceLineNo">5653</span><a name="line.5653"></a>
+<span class="sourceLineNo">5654</span>    WALEdit edit = editCaptor.getValue();<a name="line.5654"></a>
+<span class="sourceLineNo">5655</span>    assertNotNull(edit);<a name="line.5655"></a>
+<span class="sourceLineNo">5656</span>    assertNotNull(edit.getCells());<a name="line.5656"></a>
+<span class="sourceLineNo">5657</span>    assertEquals(1, edit.getCells().size());<a name="line.5657"></a>
+<span class="sourceLineNo">5658</span>    RegionEventDescriptor desc = WALEdit.getRegionEventDescriptor(edit.getCells().get(0));<a name="line.5658"></a>
+<span class="sourceLineNo">5659</span>    assertNotNull(desc);<a name="line.5659"></a>
 <span class="sourceLineNo">5660</span><a name="line.5660"></a>
-<span class="sourceLineNo">5661</span>    StoreDescriptor store = desc.getStores(0);<a name="line.5661"></a>
-<span class="sourceLineNo">5662</span>    assertTrue(Bytes.equals(store.getFamilyName().toByteArray(), fam1));<a name="line.5662"></a>
-<span class="sourceLineNo">5663</span>    assertEquals(store.getStoreHomeDir(), Bytes.toString(fam1));<a name="line.5663"></a>
-<span class="sourceLineNo">5664</span>    assertEquals(1, store.getStoreFileCount()); // 1store file<a name="line.5664"></a>
-<span class="sourceLineNo">5665</span>    assertFalse(store.getStoreFile(0).contains("/")); // ensure path is relative<a name="line.5665"></a>
-<span class="sourceLineNo">5666</span><a name="line.5666"></a>
-<span class="sourceLineNo">5667</span>    store = desc.getStores(1);<a name="line.5667"></a>
-<span class="sourceLineNo">5668</span>    assertTrue(Bytes.equals(store.getFamilyName().toByteArray(), fam2));<a name="line.5668"></a>
-<span class="sourceLineNo">5669</span>    assertEquals(store.getStoreHomeDir(), Bytes.toString(fam2));<a name="line.5669"></a>
-<span class="sourceLineNo">5670</span>    assertEquals(0, store.getStoreFileCount()); // no store files<a name="line.5670"></a>
-<span class="sourceLineNo">5671</span>  }<a name="line.5671"></a>
-<span class="sourceLineNo">5672</span><a name="line.5672"></a>
-<span class="sourceLineNo">5673</span>  // Helper for test testOpenRegionWrittenToWALForLogReplay<a name="line.5673"></a>
-<span class="sourceLineNo">5674</span>  static class HRegionWithSeqId extends HRegion {<a name="line.5674"></a>
-<span class="sourceLineNo">5675</span>    public HRegionWithSeqId(final Path tableDir, final WAL wal, final FileSystem fs,<a name="line.5675"></a>
-<span class="sourceLineNo">5676</span>        final Configuration confParam, final RegionInfo regionInfo,<a name="line.5676"></a>
-<span class="sourceLineNo">5677</span>        final TableDescriptor htd, final RegionServerServices rsServices) {<a name="line.5677"></a>
-<span class="sourceLineNo">5678</span>      super(tableDir, wal, fs, confParam, regionInfo, htd, rsServices);<a name="line.5678"></a>
-<span class="sourceLineNo">5679</span>    }<a name="line.5679"></a>
-<span class="sourceLineNo">5680</span>    @Override<a name="line.5680"></a>
-<span class="sourceLineNo">5681</span>    protected long getNextSequenceId(WAL wal) throws IOException {<a name="line.5681"></a>
-<span class="sourceLineNo">5682</span>      return 42;<a name="line.5682"></a>
-<span class="sourceLineNo">5683</span>    }<a name="line.5683"></a>
-<span class="sourceLineNo">5684</span>  }<a name="line.5684"></a>
-<span class="sourceLineNo">5685</span><a name="line.5685"></a>
-<span class="sourceLineNo">5686</span>  @Test<a name="line.5686"></a>
-<span class="sourceLineNo">5687</span>  public void testFlushedFileWithNoTags() throws Exception {<a name="line.5687"></a>
-<span class="sourceLineNo">5688</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.5688"></a>
-<span class="sourceLineNo">5689</span>    HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.5689"></a>
-<span class="sourceLineNo">5690</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.5690"></a>
-<span class="sourceLineNo">5691</span>    HRegionInfo info = new HRegionInfo(tableName, null, null, false);<a name="line.5691"></a>
-<span class="sourceLineNo">5692</span>    Path path = TEST_UTIL.getDataTestDir(getClass().getSimpleName());<a name="line.5692"></a>
-<span class="sourceLineNo">5693</span>    region = HBaseTestingUtility.createRegionAndWAL(info, path, TEST_UTIL.getConfiguration(), htd);<a name="line.5693"></a>
-<span class="sourceLineNo">5694</span>    Put put = new Put(Bytes.toBytes("a-b-0-0"));<a name="line.5694"></a>
-<span class="sourceLineNo">5695</span>    put.addColumn(fam1, qual1, Bytes.toBytes("c1-value"));<a name="line.5695"></a>
-<span class="sourceLineNo">5696</span>    region.put(put);<a name="line.5696"></a>
-<span class="sourceLineNo">5697</span>    region.flush(true);<a name="line.5697"></a>
-<span class="sourceLineNo">5698</span>    HStore store = region.getStore(fam1);<a name="line.5698"></a>
-<span class="sourceLineNo">5699</span>    Collection&lt;HStoreFile&gt; storefiles = store.getStorefiles();<a name="line.5699"></a>
-<span class="sourceLineNo">5700</span>    for (HStoreFile sf : storefiles) {<a name="line.5700"></a>
-<span class="sourceLineNo">5701</span>      assertFalse("Tags should not be present "<a name="line.5701"></a>
-<span class="sourceLineNo">5702</span>          ,sf.getReader().getHFileReader().getFileContext().isIncludesTags());<a name="line.5702"></a>
-<span class="sourceLineNo">5703</span>    }<a name="line.5703"></a>
-<span class="sourceLineNo">5704</span>  }<a name="line.5704"></a>
-<span class="sourceLineNo">5705</span><a name="line.5705"></a>
-<span class="sourceLineNo">5706</span>  /**<a name="line.5706"></a>
-<span class="sourceLineNo">5707</span>   * Utility method to setup a WAL mock.<a name="line.5707"></a>
-<span class="sourceLineNo">5708</span>   * Needs to do the bit where we close latch on the WALKeyImpl on append else test hangs.<a name="line.5708"></a>
-<span class="sourceLineNo">5709</span>   * @return a mock WAL<a name="line.5709"></a>
-<span class="sourceLineNo">5710</span>   * @throws IOException<a name="line.5710"></a>
-<span class="sourceLineNo">5711</span>   */<a name="line.5711"></a>
-<span class="sourceLineNo">5712</span>  private WAL mockWAL() throws IOException {<a name="line.5712"></a>
-<span class="sourceLineNo">5713</span>    WAL wal = mock(WAL.class);<a name="line.5713"></a>
-<span class="sourceLineNo">5714</span>    Mockito.when(wal.append((HRegionInfo)Mockito.any(),<a name="line.5714"></a>
-<span class="sourceLineNo">5715</span>        (WALKeyImpl)Mockito.any(), (WALEdit)Mockito.any(), Mockito.anyBoolean())).<a name="line.5715"></a>
-<span class="sourceLineNo">5716</span>      thenAnswer(new Answer&lt;Long&gt;() {<a name="line.5716"></a>
-<span class="sourceLineNo">5717</span>        @Override<a name="line.5717"></a>
-<span class="sourceLineNo">5718</span>        public Long answer(InvocationOnMock invocation) throws Throwable {<a name="line.5718"></a>
-<span class="sourceLineNo">5719</span>          WALKeyImpl key = invocation.getArgument(1);<a name="line.5719"></a>
-<span class="sourceLineNo">5720</span>          MultiVersionConcurrencyControl.WriteEntry we = key.getMvcc().begin();<a name="line.5720"></a>
-<span class="sourceLineNo">5721</span>          key.setWriteEntry(we);<a name="line.5721"></a>
-<span class="sourceLineNo">5722</span>          return 1L;<a name="line.5722"></a>
-<span class="sourceLineNo">5723</span>        }<a name="line.5723"></a>
-<span class="sourceLineNo">5724</span><a name="line.5724"></a>
-<span class="sourceLineNo">5725</span>    });<a name="line.5725"></a>
-<span class="sourceLineNo">5726</span>    return wal;<a name="line.5726"></a>
-<span class="sourceLineNo">5727</span>  }<a name="line.5727"></a>
-<span class="sourceLineNo">5728</span><a name="line.5728"></a>
-<span class="sourceLineNo">5729</span>  @Test<a name="line.5729"></a>
-<span class="sourceLineNo">5730</span>  public void testCloseRegionWrittenToWAL() throws Exception {<a name="line.5730"></a>
-<span class="sourceLineNo">5731</span><a name="line.5731"></a>
-<span class="sourceLineNo">5732</span>    Path rootDir = new Path(dir + name.getMethodName());<a name="line.5732"></a>
-<span class="sourceLineNo">5733</span>    FSUtils.setRootDir(TEST_UTIL.getConfiguration(), rootDir);<a name="line.5733"></a>
+<span class="sourceLineNo">5661</span>    LOG.info("RegionEventDescriptor from WAL: " + desc);<a name="line.5661"></a>
+<span class="sourceLineNo">5662</span><a name="line.5662"></a>
+<span class="sourceLineNo">5663</span>    assertEquals(RegionEventDescriptor.EventType.REGION_OPEN, desc.getEventType());<a name="line.5663"></a>
+<span class="sourceLineNo">5664</span>    assertTrue(Bytes.equals(desc.getTableName().toByteArray(), htd.getTableName().toBytes()));<a name="line.5664"></a>
+<span class="sourceLineNo">5665</span>    assertTrue(Bytes.equals(desc.getEncodedRegionName().toByteArray(),<a name="line.5665"></a>
+<span class="sourceLineNo">5666</span>      hri.getEncodedNameAsBytes()));<a name="line.5666"></a>
+<span class="sourceLineNo">5667</span>    assertTrue(desc.getLogSequenceNumber() &gt; 0);<a name="line.5667"></a>
+<span class="sourceLineNo">5668</span>    assertEquals(serverName, ProtobufUtil.toServerName(desc.getServer()));<a name="line.5668"></a>
+<span class="sourceLineNo">5669</span>    assertEquals(2, desc.getStoresCount());<a name="line.5669"></a>
+<span class="sourceLineNo">5670</span><a name="line.5670"></a>
+<span class="sourceLineNo">5671</span>    StoreDescriptor store = desc.getStores(0);<a name="line.5671"></a>
+<span class="sourceLineNo">5672</span>    assertTrue(Bytes.equals(store.getFamilyName().toByteArray(), fam1));<a name="line.5672"></a>
+<span class="sourceLineNo">5673</span>    assertEquals(store.getStoreHomeDir(), Bytes.toString(fam1));<a name="line.5673"></a>
+<span class="sourceLineNo">5674</span>    assertEquals(1, store.getStoreFileCount()); // 1store file<a name="line.5674"></a>
+<span class="sourceLineNo">5675</span>    assertFalse(store.getStoreFile(0).contains("/")); // ensure path is relative<a name="line.5675"></a>
+<span class="sourceLineNo">5676</span><a name="line.5676"></a>
+<span class="sourceLineNo">5677</span>    store = desc.getStores(1);<a name="line.5677"></a>
+<span class="sourceLineNo">5678</span>    assertTrue(Bytes.equals(store.getFamilyName().toByteArray(), fam2));<a name="line.5678"></a>
+<span class="sourceLineNo">5679</span>    assertEquals(store.getStoreHomeDir(), Bytes.toString(fam2));<a name="line.5679"></a>
+<span class="sourceLineNo">5680</span>    assertEquals(0, store.getStoreFileCount()); // no store files<a name="line.5680"></a>
+<span class="sourceLineNo">5681</span>  }<a name="line.5681"></a>
+<span class="sourceLineNo">5682</span><a name="line.5682"></a>
+<span class="sourceLineNo">5683</span>  // Helper for test testOpenRegionWrittenToWALForLogReplay<a name="line.5683"></a>
+<span class="sourceLineNo">5684</span>  static class HRegionWithSeqId extends HRegion {<a name="line.5684"></a>
+<span class="sourceLineNo">5685</span>    public HRegionWithSeqId(final Path tableDir, final WAL wal, final FileSystem fs,<a name="line.5685"></a>
+<span class="sourceLineNo">5686</span>        final Configuration confParam, final RegionInfo regionInfo,<a name="line.5686"></a>
+<span class="sourceLineNo">5687</span>        final TableDescriptor htd, final RegionServerServices rsServices) {<a name="line.5687"></a>
+<span class="sourceLineNo">5688</span>      super(tableDir, wal, fs, confParam, regionInfo, htd, rsServices);<a name="line.5688"></a>
+<span class="sourceLineNo">5689</span>    }<a name="line.5689"></a>
+<span class="sourceLineNo">5690</span>    @Override<a name="line.5690"></a>
+<span class="sourceLineNo">5691</span>    protected long getNextSequenceId(WAL wal) throws IOException {<a name="line.5691"></a>
+<span class="sourceLineNo">5692</span>      return 42;<a name="line.5692"></a>
+<span class="sourceLineNo">5693</span>    }<a name="line.5693"></a>
+<span class="sourceLineNo">5694</span>  }<a name="line.5694"></a>
+<span class="sourceLineNo">5695</span><a name="line.5695"></a>
+<span class="sourceLineNo">5696</span>  @Test<a name="line.5696"></a>
+<span class="sourceLineNo">5697</span>  public void testFlushedFileWithNoTags() throws Exception {<a name="line.5697"></a>
+<span class="sourceLineNo">5698</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.5698"></a>
+<span class="sourceLineNo">5699</span>    HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.5699"></a>
+<span class="sourceLineNo">5700</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.5700"></a>
+<span class="sourceLineNo">5701</span>    HRegionInfo info = new HRegionInfo(tableName, null, null, false);<a name="line.5701"></a>
+<span class="sourceLineNo">5702</span>    Path path = TEST_UTIL.getDataTestDir(getClass().getSimpleName());<a name="line.5702"></a>
+<span class="sourceLineNo">5703</span>    region = HBaseTestingUtility.createRegionAndWAL(info, path, TEST_UTIL.getConfiguration(), htd);<a name="line.5703"></a>
+<span class="sourceLineNo">5704</span>    Put put = new Put(Bytes.toBytes("a-b-0-0"));<a name="line.5704"></a>
+<span class="sourceLineNo">5705</span>    put.addColumn(fam1, qual1, Bytes.toBytes("c1-value"));<a name="line.5705"></a>
+<span class="sourceLineNo">5706</span>    region.put(put);<a name="line.5706"></a>
+<span class="sourceLineNo">5707</span>    region.flush(true);<a name="line.5707"></a>
+<span class="sourceLineNo">5708</span>    HStore store = region.getStore(fam1);<a name="line.5708"></a>
+<span class="sourceLineNo">5709</span>    Collection&lt;HStoreFile&gt; storefiles = store.getStorefiles();<a name="line.5709"></a>
+<span class="sourceLineNo">5710</span>    for (HStoreFile sf : storefiles) {<a name="line.5710"></a>
+<span class="sourceLineNo">5711</span>      assertFalse("Tags should not be present "<a name="line.5711"></a>
+<span class="sourceLineNo">5712</span>          ,sf.getReader().getHFileReader().getFileContext().isIncludesTags());<a name="line.5712"></a>
+<span class="sourceLineNo">5713</span>    }<a name="line.5713"></a>
+<span class="sourceLineNo">5714</span>  }<a name="line.5714"></a>
+<span class="sourceLineNo">5715</span><a name="line.5715"></a>
+<span class="sourceLineNo">5716</span>  /**<a name="line.5716"></a>
+<span class="sourceLineNo">5717</span>   * Utility method to setup a WAL mock.<a name="line.5717"></a>
+<span class="sourceLineNo">5718</span>   * Needs to do the bit where we close latch on the WALKeyImpl on append else test hangs.<a name="line.5718"></a>
+<span class="sourceLineNo">5719</span>   * @return a mock WAL<a name="line.5719"></a>
+<span class="sourceLineNo">5720</span>   * @throws IOException<a name="line.5720"></a>
+<span class="sourceLineNo">5721</span>   */<a name="line.5721"></a>
+<span class="sourceLineNo">5722</span>  private WAL mockWAL() throws IOException {<a name="line.5722"></a>
+<span class="sourceLineNo">5723</span>    WAL wal = mock(WAL.class);<a name="line.5723"></a>
+<span class="sourceLineNo">5724</span>    Mockito.when(wal.append((HRegionInfo)Mockito.any(),<a name="line.5724"></a>
+<span class="sourceLineNo">5725</span>        (WALKeyImpl)Mockito.any(), (WALEdit)Mockito.any(), Mockito.anyBoolean())).<a name="line.5725"></a>
+<span class="sourceLineNo">5726</span>      thenAnswer(new Answer&lt;Long&gt;() {<a name="line.5726"></a>
+<span class="sourceLineNo">5727</span>        @Override<a name="line.5727"></a>
+<span class="sourceLineNo">5728</span>        public Long answer(InvocationOnMock invocation) throws Throwable {<a name="line.5728"></a>
+<span class="sourceLineNo">5729</span>          WALKeyImpl key = invocation.getArgument(1);<a name="line.5729"></a>
+<span class="sourceLineNo">5730</span>          MultiVersionConcurrencyControl.WriteEntry we = key.getMvcc().begin();<a name="line.5730"></a>
+<span class="sourceLineNo">5731</span>          key.setWriteEntry(we);<a name="line.5731"></a>
+<span class="sourceLineNo">5732</span>          return 1L;<a name="line.5732"></a>
+<span class="sourceLineNo">5733</span>        }<a name="line.5733"></a>
 <span class="sourceLineNo">5734</span><a name="line.5734"></a>
-<span class="sourceLineNo">5735</span>    final ServerName serverName = ServerName.valueOf("testCloseRegionWrittenToWAL", 100, 42);<a name="line.5735"></a>
-<span class="sourceLineNo">5736</span>    final RegionServerServices rss = spy(TEST_UTIL.createMockRegionServerService(serverName));<a name="line.5736"></a>
-<span class="sourceLineNo">5737</span><a name="line.5737"></a>
-<span class="sourceLineNo">5738</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.5738"></a>
-<span class="sourceLineNo">5739</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.5739"></a>
-<span class="sourceLineNo">5740</span>    htd.addFamily(new HColumnDescriptor(fam2));<a name="line.5740"></a>
+<span class="sourceLineNo">5735</span>    });<a name="line.5735"></a>
+<span class="sourceLineNo">5736</span>    return wal;<a name="line.5736"></a>
+<span class="sourceLineNo">5737</span>  }<a name="line.5737"></a>
+<span class="sourceLineNo">5738</span><a name="line.5738"></a>
+<span class="sourceLineNo">5739</span>  @Test<a name="line.5739"></a>
+<span class="sourceLineNo">5740</span>  public void testCloseRegionWrittenToWAL() throws Exception {<a name="line.5740"></a>
 <span class="sourceLineNo">5741</span><a name="line.5741"></a>
-<span class="sourceLineNo">5742</span>    final HRegionInfo hri = new HRegionInfo(htd.getTableName(),<a name="line.5742"></a>
-<span class="sourceLineNo">5743</span>      HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY);<a name="line.5743"></a>
+<span class="sourceLineNo">5742</span>    Path rootDir = new Path(dir + name.getMethodName());<a name="line.5742"></a>
+<span class="sourceLineNo">5743</span>    FSUtils.setRootDir(TEST_UTIL.getConfiguration(), rootDir);<a name="line.5743"></a>
 <span class="sourceLineNo">5744</span><a name="line.5744"></a>
-<span class="sourceLineNo">5745</span>    ArgumentCaptor&lt;WALEdit&gt; editCaptor = ArgumentCaptor.forClass(WALEdit.class);<a name="line.5745"></a>
-<span class="sourceLineNo">5746</span><a name="line.5746"></a>
-<span class="sourceLineNo">5747</span>    // capture append() calls<a name="line.5747"></a>
-<span class="sourceLineNo">5748</span>    WAL wal = mockWAL();<a name="line.5748"></a>
-<span class="sourceLineNo">5749</span>    when(rss.getWAL((HRegionInfo) any())).thenReturn(wal);<a name="line.5749"></a>
-<span class="sourceLineNo">5750</span><a name="line.5750"></a>
+<span class="sourceLineNo">5745</span>    final ServerName serverName = ServerName.valueOf("testCloseRegionWrittenToWAL", 100, 42);<a name="line.5745"></a>
+<span class="sourceLineNo">5746</span>    final RegionServerServices rss = spy(TEST_UTIL.createMockRegionServerService(serverName));<a name="line.5746"></a>
+<span class="sourceLineNo">5747</span><a name="line.5747"></a>
+<span class="sourceLineNo">5748</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.5748"></a>
+<span class="sourceLineNo">5749</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.5749"></a>
+<span class="sourceLineNo">5750</span>    htd.addFamily(new HColumnDescriptor(fam2));<a name="line.5750"></a>
 <span class="sourceLineNo">5751</span><a name="line.5751"></a>
-<span class="sourceLineNo">5752</span>    // create and then open a region first so that it can be closed later<a name="line.5752"></a>
-<span class="sourceLineNo">5753</span>    region = HRegion.createHRegion(hri, rootDir, TEST_UTIL.getConfiguration(), htd, rss.getWAL(hri));<a name="line.5753"></a>
-<span class="sourceLineNo">5754</span>    region = HRegion.openHRegion(hri, htd, rss.getWAL(hri),<a name="line.5754"></a>
-<span class="sourceLineNo">5755</span>      TEST_UTIL.getConfiguration(), rss, null);<a name="line.5755"></a>
+<span class="sourceLineNo">5752</span>    final HRegionInfo hri = new HRegionInfo(htd.getTableName(),<a name="line.5752"></a>
+<span class="sourceLineNo">5753</span>      HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY);<a name="line.5753"></a>
+<span class="sourceLineNo">5754</span><a name="line.5754"></a>
+<span class="sourceLineNo">5755</span>    ArgumentCaptor&lt;WALEdit&gt; editCaptor = ArgumentCaptor.forClass(WALEdit.class);<a name="line.5755"></a>
 <span class="sourceLineNo">5756</span><a name="line.5756"></a>
-<span class="sourceLineNo">5757</span>    // close the region<a name="line.5757"></a>
-<span class="sourceLineNo">5758</span>    region.close(false);<a name="line.5758"></a>
-<span class="sourceLineNo">5759</span><a name="line.5759"></a>
-<span class="sourceLineNo">5760</span>    // 2 times, one for region open, the other close region<a name="line.5760"></a>
-<span class="sourceLineNo">5761</span>    verify(wal, times(2)).append((HRegionInfo)any(), (WALKeyImpl)any(),<a name="line.5761"></a>
-<span class="sourceLineNo">5762</span>      editCaptor.capture(), anyBoolean());<a name="line.5762"></a>
-<span class="sourceLineNo">5763</span><a name="line.5763"></a>
-<span class="sourceLineNo">5764</span>    WALEdit edit = editCaptor.getAllValues().get(1);<a name="line.5764"></a>
-<span class="sourceLineNo">5765</span>    assertNotNull(edit);<a name="line.5765"></a>
-<span class="sourceLineNo">5766</span>    assertNotNull(edit.getCells());<a name="line.5766"></a>
-<span class="sourceLineNo">5767</span>    assertEquals(1, edit.getCells().size());<a name="line.5767"></a>
-<span class="sourceLineNo">5768</span>    RegionEventDescriptor desc = WALEdit.getRegionEventDescriptor(edit.getCells().get(0));<a name="line.5768"></a>
-<span class="sourceLineNo">5769</span>    assertNotNull(desc);<a name="line.5769"></a>
-<span class="sourceLineNo">5770</span><a name="line.5770"></a>
-<span class="sourceLineNo">5771</span>    LOG.info("RegionEventDescriptor from WAL: " + desc);<a name="line.5771"></a>
-<span class="sourceLineNo">5772</span><a name="line.5772"></a>
-<span class="sourceLineNo">5773</span>    assertEquals(RegionEventDescriptor.EventType.REGION_CLOSE, desc.getEventType());<a name="line.5773"></a>
-<span class="sourceLineNo">5774</span>    assertTrue(Bytes.equals(desc.getTableName().toByteArray(), htd.getTableName().toBytes()));<a name="line.5774"></a>
-<span class="sourceLineNo">5775</span>    assertTrue(Bytes.equals(desc.getEncodedRegionName().toByteArray(),<a name="line.5775"></a>
-<span class="sourceLineNo">5776</span>      hri.getEncodedNameAsBytes()));<a name="line.5776"></a>
-<span class="sourceLineNo">5777</span>    assertTrue(desc.getLogSequenceNumber() &gt; 0);<a name="line.5777"></a>
-<span class="sourceLineNo">5778</span>    assertEquals(serverName, ProtobufUtil.toServerName(desc.getServer()));<a name="line.5778"></a>
-<span class="sourceLineNo">5779</span>    assertEquals(2, desc.getStoresCount());<a name="line.5779"></a>
+<span class="sourceLineNo">5757</span>    // capture append() calls<a name="line.5757"></a>
+<span class="sourceLineNo">5758</span>    WAL wal = mockWAL();<a name="line.5758"></a>
+<span class="sourceLineNo">5759</span>    when(rss.getWAL((HRegionInfo) any())).thenReturn(wal);<a name="line.5759"></a>
+<span class="sourceLineNo">5760</span><a name="line.5760"></a>
+<span class="sourceLineNo">5761</span><a name="line.5761"></a>
+<span class="sourceLineNo">5762</span>    // create and then open a region first so that it can be closed later<a name="line.5762"></a>
+<span class="sourceLineNo">5763</span>    region = HRegion.createHRegion(hri, rootDir, TEST_UTIL.getConfiguration(), htd, rss.getWAL(hri));<a name="line.5763"></a>
+<span class="sourceLineNo">5764</span>    region = HRegion.openHRegion(hri, htd, rss.getWAL(hri),<a name="line.5764"></a>
+<span class="sourceLineNo">5765</span>      TEST_UTIL.getConfiguration(), rss, null);<a name="line.5765"></a>
+<span class="sourceLineNo">5766</span><a name="line.5766"></a>
+<span class="sourceLineNo">5767</span>    // close the region<a name="line.5767"></a>
+<span class="sourceLineNo">5768</span>    region.close(false);<a name="line.5768"></a>
+<span class="sourceLineNo">5769</span><a name="line.5769"></a>
+<span class="sourceLineNo">5770</span>    // 2 times, one for region open, the other close region<a name="line.5770"></a>
+<span class="sourceLineNo">5771</span>    verify(wal, times(2)).append((HRegionInfo)any(), (WALKeyImpl)any(),<a name="line.5771"></a>
+<span class="sourceLineNo">5772</span>      editCaptor.capture(), anyBoolean());<a name="line.5772"></a>
+<span class="sourceLineNo">5773</span><a name="line.5773"></a>
+<span class="sourceLineNo">5774</span>    WALEdit edit = editCaptor.getAllValues().get(1);<a name="line.5774"></a>
+<span class="sourceLineNo">5775</span>    assertNotNull(edit);<a name="line.5775"></a>
+<span class="sourceLineNo">5776</span>    assertNotNull(edit.getCells());<a name="line.5776"></a>
+<span class="sourceLineNo">5777</span>    assertEquals(1, edit.getCells().size());<a name="line.5777"></a>
+<span class="sourceLineNo">5778</span>    RegionEventDescriptor desc = WALEdit.getRegionEventDescriptor(edit.getCells().get(0));<a name="line.5778"></a>
+<span class="sourceLineNo">5779</span>    assertNotNull(desc);<a name="line.5779"></a>
 <span class="sourceLineNo">5780</span><a name="line.5780"></a>
-<span class="sourceLineNo">5781</span>    StoreDescriptor store = desc.getStores(0);<a name="line.5781"></a>
-<span class="sourceLineNo">5782</span>    assertTrue(Bytes.equals(store.getFamilyName().toByteArray(), fam1));<a name="line.5782"></a>
-<span class="sourceLineNo">5783</span>    assertEquals(store.getStoreHomeDir(), Bytes.toString(fam1));<a name="line.5783"></a>
-<span class="sourceLineNo">5784</span>    assertEquals(0, store.getStoreFileCount()); // no store files<a name="line.5784"></a>
-<span class="sourceLineNo">5785</span><a name="line.5785"></a>
-<span class="sourceLineNo">5786</span>    store = desc.getStores(1);<a name="line.5786"></a>
-<span class="sourceLineNo">5787</span>    assertTrue(Bytes.equals(store.getFamilyName().toByteArray(), fam2));<a name="line.5787"></a>
-<span class="sourceLineNo">5788</span>    assertEquals(store.getStoreHomeDir(), Bytes.toString(fam2));<a name="line.5788"></a>
-<span class="sourceLineNo">5789</span>    assertEquals(0, store.getStoreFileCount()); // no store files<a name="line.5789"></a>
-<span class="sourceLineNo">5790</span>  }<a name="line.5790"></a>
-<span class="sourceLineNo">5791</span><a name="line.5791"></a>
-<span class="sourceLineNo">5792</span>  /**<a name="line.5792"></a>
-<span class="sourceLineNo">5793</span>   * Test RegionTooBusyException thrown when region is busy<a name="line.5793"></a>
-<span class="sourceLineNo">5794</span>   */<a name="line.5794"></a>
-<span class="sourceLineNo">5795</span>  @Test<a name="line.5795"></a>
-<span class="sourceLineNo">5796</span>  public void testRegionTooBusy() throws IOException {<a name="line.5796"></a>
-<span class="sourceLineNo">5797</span>    byte[] family = Bytes.toBytes("family");<a name="line.5797"></a>
-<span class="sourceLineNo">5798</span>    long defaultBusyWaitDuration = CONF.getLong("hbase.busy.wait.duration",<a name="line.5798"></a>
-<span class="sourceLineNo">5799</span>      HRegion.DEFAULT_BUSY_WAIT_DURATION);<a name="line.5799"></a>
-<span class="sourceLineNo">5800</span>    CONF.setLong("hbase.busy.wait.duration", 1000);<a name="line.5800"></a>
-<span class="sourceLineNo">5801</span>    region = initHRegion(tableName, method, CONF, family);<a name="line.5801"></a>
-<span class="sourceLineNo">5802</span>    final AtomicBoolean stopped = new AtomicBoolean(true);<a name="line.5802"></a>
-<span class="sourceLineNo">5803</span>    Thread t = new Thread(new Runnable() {<a name="line.5803"></a>
-<span class="sourceLineNo">5804</span>      @Override<a name="line.5804"></a>
-<span class="sourceLineNo">5805</span>      public void run() {<a name="line.5805"></a>
-<span class="sourceLineNo">5806</span>        try {<a name="line.5806"></a>
-<span class="sourceLineNo">5807</span>          region.lock.writeLock().lock();<a name="line.5807"></a>
-<span class="sourceLineNo">5808</span>          stopped.set(false);<a name="line.5808"></a>
-<span class="sourceLineNo">5809</span>          while (!stopped.get()) {<a name="line.5809"></a>
-<span class="sourceLineNo">5810</span>            Thread.sleep(100);<a name="line.5810"></a>
-<span class="sourceLineNo">5811</span>          }<a name="line.5811"></a>
-<span class="sourceLineNo">5812</span>        } catch (InterruptedException ie) {<a name="line.5812"></a>
-<span class="sourceLineNo">5813</span>        } finally {<a name="line.5813"></a>
-<span class="sourceLineNo">5814</span>          region.lock.writeLock().unlock();<a name="line.5814"></a>
-<span class="sourceLineNo">5815</span>        }<a name="line.5815"></a>
-<span class="sourceLineNo">5816</span>      }<a name="line.5816"></a>
-<span class="sourceLineNo">5817</span>    });<a name="line.5817"></a>
-<span class="sourceLineNo">5818</span>    t.start();<a name="line.5818"></a>
-<span class="sourceLineNo">5819</span>    Get get = new Get(row);<a name="line.5819"></a>
-<span class="sourceLineNo">5820</span>    try {<a name="line.5820"></a>
-<span class="sourceLineNo">5821</span>      while (stopped.get()) {<a name="line.5821"></a>
-<span class="sourceLineNo">5822</span>        Thread.sleep(100);<a name="line.5822"></a>
-<span class="sourceLineNo">5823</span>      }<a name="line.5823"></a>
-<span class="sourceLineNo">5824</span>      region.get(get);<a name="line.5824"></a>
-<span class="sourceLineNo">5825</span>      fail("Should throw RegionTooBusyException");<a name="line.5825"></a>
-<span class="sourceLineNo">5826</span>    } catch (InterruptedException ie) {<a name="line.5826"></a>
-<span class="sourceLineNo">5827</span>      fail("test interrupted");<a name="line.5827"></a>
-<span class="sourceLineNo">5828</span>    } catch (RegionTooBusyException e) {<a name="line.5828"></a>
-<span class="sourceLineNo">5829</span>      // Good, expected<a name="line.5829"></a>
-<span class="sourceLineNo">5830</span>    } finally {<a name="line.5830"></a>
-<span class="sourceLineNo">5831</span>      stopped.set(true);<a name="line.5831"></a>
-<span class="sourceLineNo">5832</span>      try {<a name="line.5832"></a>
-<span class="sourceLineNo">5833</span>        t.join();<a name="line.5833"></a>
-<span class="sourceLineNo">5834</span>      } catch (Throwable e) {<a name="line.5834"></a>
-<span class="sourceLineNo">5835</span>      }<a name="line.5835"></a>
-<span class="sourceLineNo">5836</span><a name="line.5836"></a>
-<span class="sourceLineNo">5837</span>      HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.5837"></a>
-<span class="sourceLineNo">5838</span>      region = null;<a name="line.5838"></a>
-<span class="sourceLineNo">5839</span>      CONF.setLong("hbase.busy.wait.duration", defaultBusyWaitDuration);<a name="line.5839"></a>
-<span class="sourceLineNo">5840</span>    }<a name="line.5840"></a>
-<span class="sourceLineNo">5841</span>  }<a name="line.5841"></a>
-<span class="sourceLineNo">5842</span><a name="line.5842"></a>
-<span class="sourceLineNo">5843</span>  @Test<a name="line.5843"></a>
-<span class="sourceLineNo">5844</span>  public void testCellTTLs() throws IOException {<a name="line.5844"></a>
-<span class="sourceLineNo">5845</span>    IncrementingEnvironmentEdge edge = new IncrementingEnvironmentEdge();<a name="line.5845"></a>
-<span class="sourceLineNo">5846</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.5846"></a>
-<span class="sourceLineNo">5847</span><a name="line.5847"></a>
-<span class="sourceLineNo">5848</span>    final byte[] row = Bytes.toBytes("testRow");<a name="line.5848"></a>
-<span class="sourceLineNo">5849</span>    final byte[] q1 = Bytes.toBytes("q1");<a name="line.5849"></a>
-<span class="sourceLineNo">5850</span>    final byte[] q2 = Bytes.toBytes("q2");<a name="line.5850"></a>
-<span class="sourceLineNo">5851</span>    final byte[] q3 = Bytes.toBytes("q3");<a name="line.5851"></a>
-<span class="sourceLineNo">5852</span>    final byte[] q4 = Bytes.toBytes("q4");<a name="line.5852"></a>
-<span class="sourceLineNo">5853</span><a name="line.5853"></a>
-<span class="sourceLineNo">5854</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.5854"></a>
-<span class="sourceLineNo">5855</span>    HColumnDescriptor hcd = new HColumnDescriptor(fam1);<a name="line.5855"></a>
-<span class="sourceLineNo">5856</span>    hcd.setTimeToLive(10); // 10 seconds<a name="line.5856"></a>
-<span class="sourceLineNo">5857</span>    htd.addFamily(hcd);<a name="line.5857"></a>
-<span class="sourceLineNo">5858</span><a name="line.5858"></a>
-<span class="sourceLineNo">5859</span>    Configuration conf = new Configuration(TEST_UTIL.getConfiguration());<a name="line.5859"></a>
-<span class="sourceLineNo">5860</span>    conf.setInt(HFile.FORMAT_VERSION_KEY, HFile.MIN_FORMAT_VERSION_WITH_TAGS);<a name="line.5860"></a>
-<span class="sourceLineNo">5861</span><a name="line.5861"></a>
-<span class="sourceLineNo">5862</span>    region = HBaseTestingUtility.createRegionAndWAL(new HRegionInfo(htd.getTableName(),<a name="line.5862"></a>
-<span class="sourceLineNo">5863</span>            HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY),<a name="line.5863"></a>
-<span class="sourceLineNo">5864</span>        TEST_UTIL.getDataTestDir(), conf, htd);<a name="line.5864"></a>
-<span class="sourceLineNo">5865</span>    assertNotNull(region);<a name="line.5865"></a>
-<span class="sourceLineNo">5866</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.5866"></a>
-<span class="sourceLineNo">5867</span>    // Add a cell that will expire in 5 seconds via cell TTL<a name="line.5867"></a>
-<span class="sourceLineNo">5868</span>    region.put(new Put(row).add(new KeyValue(row, fam1, q1, now,<a name="line.5868"></a>
-<span class="sourceLineNo">5869</span>      HConstants.EMPTY_BYTE_ARRAY, new ArrayBackedTag[] {<a name="line.5869"></a>
-<span class="sourceLineNo">5870</span>        // TTL tags specify ts in milliseconds<a name="line.5870"></a>
-<span class="sourceLineNo">5871</span>        new ArrayBackedTag(TagType.TTL_TAG_TYPE, Bytes.toBytes(5000L)) })));<a name="line.5871"></a>
-<span class="sourceLineNo">5872</span>    // Add a cell that will expire after 10 seconds via family setting<a name="line.5872"></a>
-<span class="sourceLineNo">5873</span>    region.put(new Put(row).addColumn(fam1, q2, now, HConstants.EMPTY_BYTE_ARRAY));<a name="line.5873"></a>
-<span class="sourceLineNo">5874</span>    // Add a cell that will expire in 15 seconds via cell TTL<a name="line.5874"></a>
-<span class="sourceLineNo">5875</span>    region.put(new Put(row).add(new KeyValue(row, fam1, q3, now + 10000 - 1,<a name="line.5875"></a>
-<span class="sourceLineNo">5876</span>      HConstants.EMPTY_BYTE_ARRAY, new ArrayBackedTag[] {<a name="line.5876"></a>
-<span class="sourceLineNo">5877</span>        // TTL tags specify ts in milliseconds<a name="line.5877"></a>
-<span class="sourceLineNo">5878</span>        new ArrayBackedTag(TagType.TTL_TAG_TYPE, Bytes.toBytes(5000L)) })));<a name="line.5878"></a>
-<span class="sourceLineNo">5879</span>    // Add a cell that will expire in 20 seconds via family setting<a name="line.5879"></a>
-<span class="sourceLineNo">5880</span>    region.put(new Put(row).addColumn(fam1, q4, now + 10000 - 1, HConstants.EMPTY_BYTE_ARRAY));<a name="line.5880"></a>
-<span class="sourceLineNo">5881</span><a name="line.5881"></a>
-<span class="sourceLineNo">5882</span>    // Flush so we are sure store scanning gets this right<a name="line.5882"></a>
-<span class="sourceLineNo">5883</span>    region.flush(true);<a name="line.5883"></a>
-<span class="sourceLineNo">5884</span><a name="line.5884"></a>
-<span class="sourceLineNo">5885</span>    // A query at time T+0 should return all cells<a name="line.5885"></a>
-<span class="sourceLineNo">5886</span>    Result r = region.get(new Get(row));<a name="line.5886"></a>
-<span class="sourceLineNo">5887</span>    assertNotNull(r.getValue(fam1, q1));<a name="line.5887"></a>
-<span class="sourceLineNo">5888</span>    assertNotNull(r.getValue(fam1, q2));<a name="line.5888"></a>
-<span class="sourceLineNo">5889</span>    assertNotNull(r.getValue(fam1, q3));<a name="line.5889"></a>
-<span class="sourceLineNo">5890</span>    assertNotNull(r.getValue(fam1, q4));<a name="line.5890"></a>
+<span class="sourceLineNo">5781</span>    LOG.info("RegionEventDescriptor from WAL: " + desc);<a name="line.5781"></a>
+<span class="sourceLineNo">5782</span><a name="line.5782"></a>
+<span class="sourceLineNo">5783</span>    assertEquals(RegionEventDescriptor.EventType.REGION_CLOSE, desc.getEventType());<a name="line.5783"></a>
+<span class="sourceLineNo">5784</span>    assertTrue(Bytes.equals(desc.getTableName().toByteArray(), htd.getTableName().toBytes()));<a name="line.5784"></a>
+<span class="sourceLineNo">5785</span>    assertTrue(Bytes.equals(desc.getEncodedRegionName().toByteArray(),<a name="line.5785"></a>
+<span class="sourceLineNo">5786</span>      hri.getEncodedNameAsBytes()));<a name="line.5786"></a>
+<span class="sourceLineNo">5787</span>    assertTrue(desc.getLogSequenceNumber() &gt; 0);<a name="line.5787"></a>
+<span class="sourceLineNo">5788</span>    assertEquals(serverName, ProtobufUtil.toServerName(desc.getServer()));<a name="line.5788"></a>
+<span class="sourceLineNo">5789</span>    assertEquals(2, desc.getStoresCount());<a name="line.5789"></a>
+<span class="sourceLineNo">5790</span><a name="line.5790"></a>
+<span class="sourceLineNo">5791</span>    StoreDescriptor store = desc.getStores(0);<a name="line.5791"></a>
+<span class="sourceLineNo">5792</span>    assertTrue(Bytes.equals(store.getFamilyName().toByteArray(), fam1));<a name="line.5792"></a>
+<span class="sourceLineNo">5793</span>    assertEquals(store.getStoreHomeDir(), Bytes.toString(fam1));<a name="line.5793"></a>
+<span class="sourceLineNo">5794</span>    assertEquals(0, store.getStoreFileCount()); // no store files<a name="line.5794"></a>
+<span class="sourceLineNo">5795</span><a name="line.5795"></a>
+<span class="sourceLineNo">5796</span>    store = desc.getStores(1);<a name="line.5796"></a>
+<span class="sourceLineNo">5797</span>    assertTrue(Bytes.equals(store.getFamilyName().toByteArray(), fam2));<a name="line.5797"></a>
+<span class="sourceLineNo">5798</span>    assertEquals(store.getStoreHomeDir(), Bytes.toString(fam2));<a name="line.5798"></a>
+<span class="sourceLineNo">5799</span>    assertEquals(0, store.getStoreFileCount()); // no store files<a name="line.5799"></a>
+<span class="sourceLineNo">5800</span>  }<a name="line.5800"></a>
+<span class="sourceLineNo">5801</span><a name="line.5801"></a>
+<span class="sourceLineNo">5802</span>  /**<a name="line.5802"></a>
+<span class="sourceLineNo">5803</span>   * Test RegionTooBusyException thrown when region is busy<a name="line.5803"></a>
+<span class="sourceLineNo">5804</span>   */<a name="line.5804"></a>
+<span class="sourceLineNo">5805</span>  @Test<a name="line.5805"></a>
+<span class="sourceLineNo">5806</span>  public void testRegionTooBusy() throws IOException {<a name="line.5806"></a>
+<span class="sourceLineNo">5807</span>    byte[] family = Bytes.toBytes("family");<a name="line.5807"></a>
+<span class="sourceLineNo">5808</span>    long defaultBusyWaitDuration = CONF.getLong("hbase.busy.wait.duration",<a name="line.5808"></a>
+<span class="sourceLineNo">5809</span>      HRegion.DEFAULT_BUSY_WAIT_DURATION);<a name="line.5809"></a>
+<span class="sourceLineNo">5810</span>    CONF.setLong("hbase.busy.wait.duration", 1000);<a name="line.5810"></a>
+<span class="sourceLineNo">5811</span>    region = initHRegion(tableName, method, CONF, family);<a name="line.5811"></a>
+<span class="sourceLineNo">5812</span>    final AtomicBoolean stopped = new AtomicBoolean(true);<a name="line.5812"></a>
+<span class="sourceLineNo">5813</span>    Thread t = new Thread(new Runnable() {<a name="line.5813"></a>
+<span class="sourceLineNo">5814</span>      @Override<a name="line.5814"></a>
+<span class="sourceLineNo">5815</span>      public void run() {<a name="line.5815"></a>
+<span class="sourceLineNo">5816</span>        try {<a name="line.5816"></a>
+<span class="sourceLineNo">5817</span>          region.lock.writeLock().lock();<a name="line.5817"></a>
+<span class="sourceLineNo">5818</span>          stopped.set(false);<a name="line.5818"></a>
+<span class="sourceLineNo">5819</span>          while (!stopped.get()) {<a name="line.5819"></a>
+<span class="sourceLineNo">5820</span>            Thread.sleep(100);<a name="line.5820"></a>
+<span class="sourceLineNo">5821</span>          }<a name="line.5821"></a>
+<span class="sourceLineNo">5822</span>        } catch (InterruptedException ie) {<a name="line.5822"></a>
+<span class="sourceLineNo">5823</span>        } finally {<a name="line.5823"></a>
+<span class="sourceLineNo">5824</span>          region.lock.writeLock().unlock();<a name="line.5824"></a>
+<span class="sourceLineNo">5825</span>        }<a name="line.5825"></a>
+<span class="sourceLineNo">5826</span>      }<a name="line.5826"></a>
+<span class="sourceLineNo">5827</span>    });<a name="line.5827"></a>
+<span class="sourceLineNo">5828</span>    t.start();<a name="line.5828"></a>
+<span class="sourceLineNo">5829</span>    Get get = new Get(row);<a name="line.5829"></a>
+<span class="sourceLineNo">5830</span>    try {<a name="line.5830"></a>
+<span class="sourceLineNo">5831</span>      while (stopped.get()) {<a name="line.5831"></a>
+<span class="sourceLineNo">5832</span>        Thread.sleep(100);<a name="line.5832"></a>
+<span class="sourceLineNo">5833</span>      }<a name="line.5833"></a>
+<span class="sourceLineNo">5834</span>      region.get(get);<a name="line.5834"></a>
+<span class="sourceLineNo">5835</span>      fail("Should throw RegionTooBusyException");<a name="line.5835"></a>
+<span class="sourceLineNo">5836</span>    } catch (InterruptedException ie) {<a name="line.5836"></a>
+<span class="sourceLineNo">5837</span>      fail("test interrupted");<a name="line.5837"></a>
+<span class="sourceLineNo">5838</span>    } catch (RegionTooBusyException e) {<a name="line.5838"></a>
+<span class="sourceLineNo">5839</span>      // Good, expected<a name="line.5839"></a>
+<span class="sourceLineNo">5840</span>    } finally {<a name="line.5840"></a>
+<span class="sourceLineNo">5841</span>      stopped.set(true);<a name="line.5841"></a>
+<span class="sourceLineNo">5842</span>      try {<a name="line.5842"></a>
+<span class="sourceLineNo">5843</span>        t.join();<a name="line.5843"></a>
+<span class="sourceLineNo">5844</span>      } catch (Throwable e) {<a name="line.5844"></a>
+<span class="sourceLineNo">5845</span>      }<a name="line.5845"></a>
+<span class="sourceLineNo">5846</span><a name="line.5846"></a>
+<span class="sourceLineNo">5847</span>      HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.5847"></a>
+<span class="sourceLineNo">5848</span>      region = null;<a name="line.5848"></a>
+<span class="sourceLineNo">5849</span>      CONF.setLong("hbase.busy.wait.duration", defaultBusyWaitDuration);<a name="line.5849"></a>
+<span class="sourceLineNo">5850</span>    }<a name="line.5850"></a>
+<span class="sourceLineNo">5851</span>  }<a name="line.5851"></a>
+<span class="sourceLineNo">5852</span><a name="line.5852"></a>
+<span class="sourceLineNo">5853</span>  @Test<a name="line.5853"></a>
+<span class="sourceLineNo">5854</span>  public void testCellTTLs() throws IOException {<a name="line.5854"></a>
+<span class="sourceLineNo">5855</span>    IncrementingEnvironmentEdge edge = new IncrementingEnvironmentEdge();<a name="line.5855"></a>
+<span class="sourceLineNo">5856</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.5856"></a>
+<span class="sourceLineNo">5857</span><a name="line.5857"></a>
+<span class="sourceLineNo">5858</span>    final byte[] row = Bytes.toBytes("testRow");<a name="line.5858"></a>
+<span class="sourceLineNo">5859</span>    final byte[] q1 = Bytes.toBytes("q1");<a name="line.5859"></a>
+<span class="sourceLineNo">5860</span>    final byte[] q2 = Bytes.toBytes("q2");<a name="line.5860"></a>
+<span class="sourceLineNo">5861</span>    final byte[] q3 = Bytes.toBytes("q3");<a name="line.5861"></a>
+<span class="sourceLineNo">5862</span>    final byte[] q4 = Bytes.toBytes("q4");<a name="line.5862"></a>
+<span class="sourceLineNo">5863</span><a name="line.5863"></a>
+<span class="sourceLineNo">5864</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.5864"></a>
+<span class="sourceLineNo">5865</span>    HColumnDescriptor hcd = new HColumnDescriptor(fam1);<a name="line.5865"></a>
+<span class="sourceLineNo">5866</span>    hcd.setTimeToLive(10); // 10 seconds<a name="line.5866"></a>
+<span class="sourceLineNo">5867</span>    htd.addFamily(hcd);<a name="line.5867"></a>
+<span class="sourceLineNo">5868</span><a name="line.5868"></a>
+<span class="sourceLineNo">5869</span>    Configuration conf = new Configuration(TEST_UTIL.getConfiguration());<a name="line.5869"></a>
+<span class="sourceLineNo">5870</span>    conf.setInt(HFile.FORMAT_VERSION_KEY, HFile.MIN_FORMAT_VERSION_WITH_TAGS);<a name="line.5870"></a>
+<span class="sourceLineNo">5871</span><a name="line.5871"></a>
+<span class="sourceLineNo">5872</span>    region = HBaseTestingUtility.createRegionAndWAL(new HRegionInfo(htd.getTableName(),<a name="line.5872"></a>
+<span class="sourceLineNo">5873</span>            HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY),<a name="line.5873"></a>
+<span class="sourceLineNo">5874</span>        TEST_UTIL.getDataTestDir(), conf, htd);<a name="line.5874"></a>
+<span class="sourceLineNo">5875</span>    assertNotNull(region);<a name="line.5875"></a>
+<span class="sourceLineNo">5876</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.5876"></a>
+<span class="sourceLineNo">5877</span>    // Add a cell that will expire in 5 seconds via cell TTL<a name="line.5877"></a>
+<span class="sourceLineNo">5878</span>    region.put(new Put(row).add(new KeyValue(row, fam1, q1, now,<a name="line.5878"></a>
+<span class="sourceLineNo">5879</span>      HConstants.EMPTY_BYTE_ARRAY, new ArrayBackedTag[] {<a name="line.5879"></a>
+<span class="sourceLineNo">5880</span>        // TTL tags specify ts in milliseconds<a name="line.5880"></a>
+<span class="sourceLineNo">5881</span>        new ArrayBackedTag(TagType.TTL_TAG_TYPE, Bytes.toBytes(5000L)) })));<a name="line.5881"></a>
+<span class="sourceLineNo">5882</span>    // Add a cell that will expire after 10 seconds via family setting<a name="line.5882"></a>
+<span class="sourceLineNo">5883</span>    region.put(new Put(row).addColumn(fam1, q2, now, HConstants.EMPTY_BYTE_ARRAY));<a name="line.5883"></a>
+<span class="sourceLineNo">5884</span>    // Add a cell that will expire in 15 seconds via cell TTL<a name="line.5884"></a>
+<span class="sourceLineNo">5885</span>    region.put(new Put(row).add(new KeyValue(row, fam1, q3, now + 10000 - 1,<a name="line.5885"></a>
+<span class="sourceLineNo">5886</span>      HConstants.EMPTY_BYTE_ARRAY, new ArrayBackedTag[] {<a name="line.5886"></a>
+<span class="sourceLineNo">5887</span>        // TTL tags specify ts in milliseconds<a name="line.5887"></a>
+<span class="sourceLineNo">5888</span>        new ArrayBackedTag(TagType.TTL_TAG_TYPE, Bytes.toBytes(5000L)) })));<a name="line.5888"></a>
+<span class="sourceLineNo">5889</span>    // Add a cell that will expire in 20 seconds via family setting<a name="line.5889"></a>
+<span class="sourceLineNo">5890</span>    region.put(new Put(row).addColumn(fam1, q4, now + 10000 - 1, HConstants.EMPTY_BYTE_ARRAY));<a name="line.5890"></a>
 <span class="sourceLineNo">5891</span><a name="line.5891"></a>
-<span class="sourceLineNo">5892</span>    // Increment time to T+5 seconds<a name="line.5892"></a>
-<span class="sourceLineNo">5893</span>    edge.incrementTime(5000);<a name="line.5893"></a>
+<span class="sourceLineNo">5892</span>    // Flush so we are sure store scanning gets this right<a name="line.5892"></a>
+<span class="sourceLineNo">5893</span>    region.flush(true);<a name="line.5893"></a>
 <span class="sourceLineNo">5894</span><a name="line.5894"></a>
-<span class="sourceLineNo">5895</span>    r = region.get(new Get(row));<a name="line.5895"></a>
-<span class="sourceLineNo">5896</span>    assertNull(r.getValue(fam1, q1));<a name="line.5896"></a>
-<span class="sourceLineNo">5897</span>    assertNotNull(r.getValue(fam1, q2));<a name="line.5897"></a>
-<span class="sourceLineNo">5898</span>    assertNotNull(r.getValue(fam1, q3));<a name="line.5898"></a>
-<span class="sourceLineNo">5899</span>    assertNotNull(r.getValue(fam1, q4));<a name="line.5899"></a>
-<span class="sourceLineNo">5900</span><a name="line.5900"></a>
-<span class="sourceLineNo">5901</span>    // Increment time to T+10 seconds<a name="line.5901"></a>
-<span class="sourceLineNo">5902</span>    edge.incrementTime(5000);<a name="line.5902"></a>
-<span class="sourceLineNo">5903</span><a name="line.5903"></a>
-<span class="sourceLineNo">5904</span>    r = region.get(new Get(row));<a name="line.5904"></a>
-<span class="sourceLineNo">5905</span>    assertNull(r.getValue(fam1, q1));<a name="line.5905"></a>
-<span class="sourceLineNo">5906</span>    assertNull(r.getValue(fam1, q2));<a name="line.5906"></a>
-<span class="sourceLineNo">5907</span>    assertNotNull(r.getValue(fam1, q3));<a name="line.5907"></a>
-<span class="sourceLineNo">5908</span>    assertNotNull(r.getValue(fam1, q4));<a name="line.5908"></a>
-<span class="sourceLineNo">5909</span><a name="line.5909"></a>
-<span class="sourceLineNo">5910</span>    // Increment time to T+15 seconds<a name="line.5910"></a>
-<span class="sourceLineNo">5911</span>    edge.incrementTime(5000);<a name="line.5911"></a>
-<span class="sourceLineNo">5912</span><a name="line.5912"></a>
-<span class="sourceLineNo">5913</span>    r = region.get(new Get(row));<a name="line.5913"></a>
-<span class="sourceLineNo">5914</span>    assertNull(r.getValue(fam1, q1));<a name="line.5914"></a>
-<span class="sourceLineNo">5915</span>    assertNull(r.getValue(fam1, q2));<a name="line.5915"></a>
-<span class="sourceLineNo">5916</span>    assertNull(r.getValue(fam1, q3));<a name="line.5916"></a>
-<span class="sourceLineNo">5917</span>    assertNotNull(r.getValue(fam1, q4));<a name="line.5917"></a>
-<span class="sourceLineNo">5918</span><a name="line.5918"></a>
-<span class="sourceLineNo">5919</span>    // Increment time to T+20 seconds<a name="line.5919"></a>
-<span class="sourceLineNo">5920</span>    edge.incrementTime(10000);<a name="line.5920"></a>
-<span class="sourceLineNo">5921</span><a name="line.5921"></a>
-<span class="sourceLineNo">5922</span>    r = region.get(new Get(row));<a name="line.5922"></a>
-<span class="sourceLineNo">5923</span>    assertNull(r.getValue(fam1, q1));<a name="line.5923"></a>
-<span class="sourceLineNo">5924</span>    assertNull(r.getValue(fam1, q2));<a name="line.5924"></a>
-<span class="sourceLineNo">5925</span>    assertNull(r.getValue(fam1, q3));<a name="line.5925"></a>
-<span class="sourceLineNo">5926</span>    assertNull(r.getValue(fam1, q4));<a name="line.5926"></a>
-<span class="sourceLineNo">5927</span><a name="line.5927"></a>
-<span class="sourceLineNo">5928</span>    // Fun with disappearing increments<a name="line.5928"></a>
-<span class="sourceLineNo">5929</span><a name="line.5929"></a>
-<span class="sourceLineNo">5930</span>    // Start at 1<a name="line.5930"></a>
-<span class="sourceLineNo">5931</span>    region.put(new Put(row).addColumn(fam1, q1, Bytes.toBytes(1L)));<a name="line.5931"></a>
+<span class="sourceLineNo">5895</span>    // A query at time T+0 should return all cells<a name="line.5895"></a>
+<span class="sourceLineNo">5896</span>    Result r = region.get(new Get(row));<a name="line.5896"></a>
+<span class="sourceLineNo">5897</span>    assertNotNull(r.getValue(fam1, q1));<a name="line.5897"></a>
+<span class="sourceLineNo">5898</span>    assertNotNull(r.getValue(fam1, q2));<a name="line.5898"></a>
+<span class="sourceLineNo">5899</span>    assertNotNull(r.getValue(fam1, q3));<a name="line.5899"></a>
+<span class="sourceLineNo">5900</span>    assertNotNull(r.getValue(fam1, q4));<a name="line.5900"></a>
+<span class="sourceLineNo">5901</span><a name="line.5901"></a>
+<span class="sourceLineNo">5902</span>    // Increment time to T+5 seconds<a name="line.5902"></a>
+<span class="sourceLineNo">5903</span>    edge.incrementTime(5000);<a name="line.5903"></a>
+<span class="sourceLineNo">5904</span><a name="line.5904"></a>
+<span class="sourceLineNo">5905</span>    r = region.get(new Get(row));<a name="line.5905"></a>
+<span class="sourceLineNo">5906</span>    assertNull(r.getValue(fam1, q1));<a name="line.5906"></a>
+<span class="sourceLineNo">5907</span>    assertNotNull(r.getValue(fam1, q2));<a name="line.5907"></a>
+<span class="sourceLineNo">5908</span>    assertNotNull(r.getValue(fam1, q3));<a name="line.5908"></a>
+<span class="sourceLineNo">5909</span>    assertNotNull(r.getValue(fam1, q4));<a name="line.5909"></a>
+<span class="sourceLineNo">5910</span><a name="line.5910"></a>
+<span class="sourceLineNo">5911</span>    // Increment time to T+10 seconds<a name="line.5911"></a>
+<span class="sourceLineNo">5912</span>    edge.incrementTime(5000);<a name="line.5912"></a>
+<span class="sourceLineNo">5913</span><a name="line.5913"></a>
+<span class="sourceLineNo">5914</span>    r = region.get(new Get(row));<a name="line.5914"></a>
+<span class="sourceLineNo">5915</span>    assertNull(r.getValue(fam1, q1));<a name="line.5915"></a>
+<span class="sourceLineNo">5916</span>    assertNull(r.getValue(fam1, q2));<a name="line.5916"></a>
+<span class="sourceLineNo">5917</span>    assertNotNull(r.getValue(fam1, q3));<a name="line.5917"></a>
+<span class="sourceLineNo">5918</span>    assertNotNull(r.getValue(fam1, q4));<a name="line.5918"></a>
+<span class="sourceLineNo">5919</span><a name="line.5919"></a>
+<span class="sourceLineNo">5920</span>    // Increment time to T+15 seconds<a name="line.5920"></a>
+<span class="sourceLineNo">5921</span>    edge.incrementTime(5000);<a name="line.5921"></a>
+<span class="sourceLineNo">5922</span><a name="line.5922"></a>
+<span class="sourceLineNo">5923</span>    r = region.get(new Get(row));<a name="line.5923"></a>
+<span class="sourceLineNo">5924</span>    assertNull(r.getValue(fam1, q1));<a name="line.5924"></a>
+<span class="sourceLineNo">5925</span>    assertNull(r.getValue(fam1, q2));<a name="line.5925"></a>
+<span class="sourceLineNo">5926</span>    assertNull(r.getValue(fam1, q3));<a name="line.5926"></a>
+<span class="sourceLineNo">5927</span>    assertNotNull(r.getValue(fam1, q4));<a name="line.5927"></a>
+<span class="sourceLineNo">5928</span><a name="line.5928"></a>
+<span class="sourceLineNo">5929</span>    // Increment time to T+20 seconds<a name="line.5929"></a>
+<span class="sourceLineNo">5930</span>    edge.incrementTime(10000);<a name="line.5930"></a>
+<span class="sourceLineNo">5931</span><a name="line.5931"></a>
 <span class="sourceLineNo">5932</span>    r = region.get(new Get(row));<a name="line.5932"></a>
-<span class="sourceLineNo">5933</span>    byte[] val = r.getValue(fam1, q1);<a name="line.5933"></a>
-<span class="sourceLineNo">5934</span>    assertNotNull(val);<a name="line.5934"></a>
-<span class="sourceLineNo">5935</span>    assertEquals(1L, Bytes.toLong(val));<a name="line.5935"></a>
-<span class="sourceLineNo">5936</span><a name="line.5936"></a>
-<span class="sourceLineNo">5937</span>    // Increment with a TTL of 5 seconds<a name="line.5937"></a>
-<span class="sourceLineNo">5938</span>    Increment incr = new Increment(row).addColumn(fam1, q1, 1L);<a name="line.5938"></a>
-<span class="sourceLineNo">5939</span>    incr.setTTL(5000);<a name="line.5939"></a>
-<span class="sourceLineNo">5940</span>    region.increment(incr); // 2<a name="line.5940"></a>
-<span class="sourceLineNo">5941</span><a name="line.5941"></a>
-<span class="sourceLineNo">5942</span>    // New value should be 2<a name="line.5942"></a>
-<span class="sourceLineNo">5943</span>    r = region.get(new Get(row));<a name="line.5943"></a>
-<span class="sourceLineNo">5944</span>    val = r.getValue(fam1, q1);<a name="line.5944"></a>
-<span class="sourceLineNo">5945</span>    assertNotNull(val);<a name="line.5945"></a>
-<span class="sourceLineNo">5946</span>    assertEquals(2L, Bytes.toLong(val));<a name="line.5946"></a>
-<span class="sourceLineNo">5947</span><a name="line.5947"></a>
-<span class="sourceLineNo">5948</span>    // Increment time to T+25 seconds<a name="line.5948"></a>
-<span class="sourceLineNo">5949</span>    edge.incrementTime(5000);<a name="line.5949"></a>
-<span class="sourceLineNo">5950</span><a name="line.5950"></a>
-<span class="sourceLineNo">5951</span>    // Value should be back to 1<a name="line.5951"></a>
-<span class="sourceLineNo">5952</span>    r = region.get(new Get(row));<a name="line.5952"></a>
-<span class="sourceLineNo">5953</span>    val = r.getValue(fam1, q1);<a name="line.5953"></a>
-<span class="sourceLineNo">5954</span>    assertNotNull(val);<a name="line.5954"></a>
-<span class="sourceLineNo">5955</span>    assertEquals(1L, Bytes.toLong(val));<a name="line.5955"></a>
-<span class="sourceLineNo">5956</span><a name="line.5956"></a>
-<span class="sourceLineNo">5957</span>    // Increment time to T+30 seconds<a name="line.5957"></a>
-<span class="sourceLineNo">5958</span>    edge.incrementTime(5000);<a name="line.5958"></a>
-<span class="sourceLineNo">5959</span><a name="line.5959"></a>
-<span class="sourceLineNo">5960</span>    // Original value written at T+20 should be gone now via family TTL<a name="line.5960"></a>
-<span class="sourceLineNo">5961</span>    r = region.get(new Get(row));<a name="line.5961"></a>
-<span class="sourceLineNo">5962</span>    assertNull(r.getValue(fam1, q1));<a name="line.5962"></a>
-<span class="sourceLineNo">5963</span>  }<a name="line.5963"></a>
-<span class="sourceLineNo">5964</span><a name="line.5964"></a>
-<span class="sourceLineNo">5965</span>  @Test<a name="line.5965"></a>
-<span class="sourceLineNo">5966</span>  public void testIncrementTimestampsAreMonotonic() throws IOException {<a name="line.5966"></a>
-<span class="sourceLineNo">5967</span>    region = initHRegion(tableName, method, CONF, fam1);<a name="line.5967"></a>
-<span class="sourceLineNo">5968</span>    ManualEnvironmentEdge edge = new ManualEnvironmentEdge();<a name="line.5968"></a>
-<span class="sourceLineNo">5969</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.5969"></a>
-<span class="sourceLineNo">5970</span><a name="line.5970"></a>
-<span class="sourceLineNo">5971</span>    edge.setValue(10);<a name="line.5971"></a>
-<span class="sourceLineNo">5972</span>    Increment inc = new Increment(row);<a name="line.5972"></a>
-<span class="sourceLineNo">5973</span>    inc.setDurability(Durability.SKIP_WAL);<a name="line.5973"></a>
-<span class="sourceLineNo">5974</span>    inc.addColumn(fam1, qual1, 1L);<a name="line.5974"></a>
-<span class="sourceLineNo">5975</span>    region.increment(inc);<a name="line.5975"></a>
-<span class="sourceLineNo">5976</span><a name="line.5976"></a>
-<span class="sourceLineNo">5977</span>    Result result = region.get(new Get(row));<a name="line.5977"></a>
-<span class="sourceLineNo">5978</span>    Cell c = result.getColumnLatestCell(fam1, qual1);<a name="line.5978"></a>
-<span class="sourceLineNo">5979</span>    assertNotNull(c);<a name="line.5979"></a>
-<span class="sourceLineNo">5980</span>    assertEquals(10L, c.getTimestamp());<a name="line.5980"></a>
-<span class="sourceLineNo">5981</span><a name="line.5981"></a>
-<span class="sourceLineNo">5982</span>    edge.setValue(1); // clock goes back<a name="line.5982"></a>
-<span class="sourceLineNo">5983</span>    region.increment(inc);<a name="line.5983"></a>
-<span class="sourceLineNo">5984</span>    result = region.get(new Get(row));<a name="line.5984"></a>
-<span class="sourceLineNo">5985</span>    c = result.getColumnLatestCell(fam1, qual1);<a name="line.5985"></a>
-<span class="sourceLineNo">5986</span>    assertEquals(11L, c.getTimestamp());<a name="line.5986"></a>
-<span class="sourceLineNo">5987</span>    assertEquals(2L, Bytes.toLong(c.getValueArray(), c.getValueOffset(), c.getValueLength()));<a name="line.5987"></a>
-<span class="sourceLineNo">5988</span>  }<a name="line.5988"></a>
-<span class="sourceLineNo">5989</span><a name="line.5989"></a>
-<span class="sourceLineNo">5990</span>  @Test<a name="line.5990"></a>
-<span class="sourceLineNo">5991</span>  public void testAppendTimestampsAreMonotonic() throws IOException {<a name="line.5991"></a>
-<span class="sourceLineNo">5992</span>    region = initHRegion(tableName, method, CONF, fam1);<a name="line.5992"></a>
-<span class="sourceLineNo">5993</span>    ManualEnvironmentEdge edge = new ManualEnvironmentEdge();<a name="line.5993"></a>
-<span class="sourceLineNo">5994</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.5994"></a>
-<span class="sourceLineNo">5995</span><a name="line.5995"></a>
-<span class="sourceLineNo">5996</span>    edge.setValue(10);<a name="line.5996"></a>
-<span class="sourceLineNo">5997</span>    Append a = new Append(row);<a name="line.5997"></a>
-<span class="sourceLineNo">5998</span>    a.setDurability(Durability.SKIP_WAL);<a name="line.5998"></a>
-<span class="sourceLineNo">5999</span>    a.addColumn(fam1, qual1, qual1);<a name="line.5999"></a>
-<span class="sourceLineNo">6000</span>    region.append(a);<a name="line.6000"></a>
-<span class="sourceLineNo">6001</span><a name="line.6001"></a>
-<span class="sourceLineNo">6002</span>    Result result = region.get(new Get(row));<a name="line.6002"></a>
-<span class="sourceLineNo">6003</span>    Cell c = result.getColumnLatestCell(fam1, qual1);<a name="line.6003"></a>
-<span class="sourceLineNo">6004</span>    assertNotNull(c);<a name="line.6004"></a>
-<span class="sourceLineNo">6005</span>    assertEquals(10L, c.getTimestamp());<a name="line.6005"></a>
-<span class="sourceLineNo">6006</span><a name="line.6006"></a>
-<span class="sourceLineNo">6007</span>    edge.setValue(1); // clock goes back<a name="line.6007"></a>
-<span class="sourceLineNo">6008</span>    region.append(a);<a name="line.6008"></a>
-<span class="sourceLineNo">6009</span>    result = region.get(new Get(row));<a name="line.6009"></a>
-<span class="sourceLineNo">6010</span>    c = result.getColumnLatestCell(fam1, qual1);<a name="line.6010"></a>
-<span class="sourceLineNo">6011</span>    assertEquals(11L, c.getTimestamp());<a name="line.6011"></a>
-<span class="sourceLineNo">6012</span><a name="line.6012"></a>
-<span class="sourceLineNo">6013</span>    byte[] expected = new byte[qual1.length*2];<a name="line.6013"></a>
-<span class="sourceLineNo">6014</span>    System.arraycopy(qual1, 0, expected, 0, qual1.length);<a name="line.6014"></a>
-<span class="sourceLineNo">6015</span>    System.arraycopy(qual1, 0, expected, qual1.length, qual1.length);<a name="line.6015"></a>
+<span class="sourceLineNo">5933</span>    assertNull(r.getValue(fam1, q1));<a name="line.5933"></a>
+<span class="sourceLineNo">5934</span>    assertNull(r.getValue(fam1, q2));<a name="line.5934"></a>
+<span class="sourceLineNo">5935</span>    assertNull(r.getValue(fam1, q3));<a name="line.5935"></a>
+<span class="sourceLineNo">5936</span>    assertNull(r.getValue(fam1, q4));<a name="line.5936"></a>
+<span class="sourceLineNo">5937</span><a name="line.5937"></a>
+<span class="sourceLineNo">5938</span>    // Fun with disappearing increments<a name="line.5938"></a>
+<span class="sourceLineNo">5939</span><a name="line.5939"></a>
+<span class="sourceLineNo">5940</span>    // Start at 1<a name="line.5940"></a>
+<span class="sourceLineNo">5941</span>    region.put(new Put(row).addColumn(fam1, q1, Bytes.toBytes(1L)));<a name="line.5941"></a>
+<span class="sourceLineNo">5942</span>    r = region.get(new Get(row));<a name="line.5942"></a>
+<span class="sourceLineNo">5943</span>    byte[] val = r.getValue(fam1, q1);<a name="line.5943"></a>
+<span class="sourceLineNo">5944</span>    assertNotNull(val);<a name="line.5944"></a>
+<span class="sourceLineNo">5945</span>    assertEquals(1L, Bytes.toLong(val));<a name="line.5945"></a>
+<span class="sourceLineNo">5946</span><a name="line.5946"></a>
+<span class="sourceLineNo">5947</span>    // Increment with a TTL of 5 seconds<a name="line.5947"></a>
+<span class="sourceLineNo">5948</span>    Increment incr = new Increment(row).addColumn(fam1, q1, 1L);<a name="line.5948"></a>
+<span class="sourceLineNo">5949</span>    incr.setTTL(5000);<a name="line.5949"></a>
+<span class="sourceLineNo">5950</span>    region.increment(incr); // 2<a name="line.5950"></a>
+<span class="sourceLineNo">5951</span><a name="line.5951"></a>
+<span class="sourceLineNo">5952</span>    // New value should be 2<a name="line.5952"></a>
+<span class="sourceLineNo">5953</span>    r = region.get(new Get(row));<a name="line.5953"></a>
+<span class="sourceLineNo">5954</span>    val = r.getValue(fam1, q1);<a name="line.5954"></a>
+<span class="sourceLineNo">5955</span>    assertNotNull(val);<a name="line.5955"></a>
+<span class="sourceLineNo">5956</span>    assertEquals(2L, Bytes.toLong(val));<a name="line.5956"></a>
+<span class="sourceLineNo">5957</span><a name="line.5957"></a>
+<span class="sourceLineNo">5958</span>    // Increment time to T+25 seconds<a name="line.5958"></a>
+<span class="sourceLineNo">5959</span>    edge.incrementTime(5000);<a name="line.5959"></a>
+<span class="sourceLineNo">5960</span><a name="line.5960"></a>
+<span class="sourceLineNo">5961</span>    // Value should be back to 1<a name="line.5961"></a>
+<span class="sourceLineNo">5962</span>    r = region.get(new Get(row));<a name="line.5962"></a>
+<span class="sourceLineNo">5963</span>    val = r.getValue(fam1, q1);<a name="line.5963"></a>
+<span class="sourceLineNo">5964</span>    assertNotNull(val);<a name="line.5964"></a>
+<span class="sourceLineNo">5965</span>    assertEquals(1L, Bytes.toLong(val));<a name="line.5965"></a>
+<span class="sourceLineNo">5966</span><a name="line.5966"></a>
+<span class="sourceLineNo">5967</span>    // Increment time to T+30 seconds<a name="line.5967"></a>
+<span class="sourceLineNo">5968</span>    edge.incrementTime(5000);<a name="line.5968"></a>
+<span class="sourceLineNo">5969</span><a name="line.5969"></a>
+<span class="sourceLineNo">5970</span>    // Original value written at T+20 should be gone now via family TTL<a name="line.5970"></a>
+<span class="sourceLineNo">5971</span>    r = region.get(new Get(row));<a name="line.5971"></a>
+<span class="sourceLineNo">5972</span>    assertNull(r.getValue(fam1, q1));<a name="line.5972"></a>
+<span class="sourceLineNo">5973</span>  }<a name="line.5973"></a>
+<span class="sourceLineNo">5974</span><a name="line.5974"></a>
+<span class="sourceLineNo">5975</span>  @Test<a name="line.5975"></a>
+<span class="sourceLineNo">5976</span>  public void testIncrementTimestampsAreMonotonic() throws IOException {<a name="line.5976"></a>
+<span class="sourceLineNo">5977</span>    region = initHRegion(tableName, method, CONF, fam1);<a name="line.5977"></a>
+<span class="sourceLineNo">5978</span>    ManualEnvironmentEdge edge = new ManualEnvironmentEdge();<a name="line.5978"></a>
+<span class="sourceLineNo">5979</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.5979"></a>
+<span class="sourceLineNo">5980</span><a name="line.5980"></a>
+<span class="sourceLineNo">5981</span>    edge.setValue(10);<a name="line.5981"></a>
+<span class="sourceLineNo">5982</span>    Increment inc = new Increment(row);<a name="line.5982"></a>
+<span class="sourceLineNo">5983</span>    inc.setDurability(Durability.SKIP_WAL);<a name="line.5983"></a>
+<span class="sourceLineNo">5984</span>    inc.addColumn(fam1, qual1, 1L);<a name="line.5984"></a>
+<span class="sourceLineNo">5985</span>    region.increment(inc);<a name="line.5985"></a>
+<span class="sourceLineNo">5986</span><a name="line.5986"></a>
+<span class="sourceLineNo">5987</span>    Result result = region.get(new Get(row));<a name="line.5987"></a>
+<span class="sourceLineNo">5988</span>    Cell c = result.getColumnLatestCell(fam1, qual1);<a name="line.5988"></a>
+<span class="sourceLineNo">5989</span>    assertNotNull(c);<a name="line.5989"></a>
+<span class="sourceLineNo">5990</span>    assertEquals(10L, c.getTimestamp());<a name="line.5990"></a>
+<span class="sourceLineNo">5991</span><a name="line.5991"></a>
+<span class="sourceLineNo">5992</span>    edge.setValue(1); // clock goes back<a name="line.5992"></a>
+<span class="sourceLineNo">5993</span>    region.increment(inc);<a name="line.5993"></a>
+<span class="sourceLineNo">5994</span>    result = region.get(new Get(row));<a name="line.5994"></a>
+<span class="sourceLineNo">5995</span>    c = result.getColumnLatestCell(fam1, qual1);<a name="line.5995"></a>
+<span class="sourceLineNo">5996</span>    assertEquals(11L, c.getTimestamp());<a name="line.5996"></a>
+<span class="sourceLineNo">5997</span>    assertEquals(2L, Bytes.toLong(c.getValueArray(), c.getValueOffset(), c.getValueLength()));<a name="line.5997"></a>
+<span class="sourceLineNo">5998</span>  }<a name="line.5998"></a>
+<span class="sourceLineNo">5999</span><a name="line.5999"></a>
+<span class="sourceLineNo">6000</span>  @Test<a name="line.6000"></a>
+<span class="sourceLineNo">6001</span>  public void testAppendTimestampsAreMonotonic() throws IOException {<a name="line.6001"></a>
+<span class="sourceLineNo">6002</span>    region = initHRegion(tableName, method, CONF, fam1);<a name="line.6002"></a>
+<span class="sourceLineNo">6003</span>    ManualEnvironmentEdge edge = new ManualEnvironmentEdge();<a name="line.6003"></a>
+<span class="sourceLineNo">6004</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.6004"></a>
+<span class="sourceLineNo">6005</span><a name="line.6005"></a>
+<span class="sourceLineNo">6006</span>    edge.setValue(10);<a name="line.6006"></a>
+<span class="sourceLineNo">6007</span>    Append a = new Append(row);<a name="line.6007"></a>
+<span class="sourceLineNo">6008</span>    a.setDurability(Durability.SKIP_WAL);<a name="line.6008"></a>
+<span class="sourceLineNo">6009</span>    a.addColumn(fam1, qual1, qual1);<a name="line.6009"></a>
+<span class="sourceLineNo">6010</span>    region.append(a);<a name="line.6010"></a>
+<span class="sourceLineNo">6011</span><a name="line.6011"></a>
+<span class="sourceLineNo">6012</span>    Result result = region.get(new Get(row));<a name="line.6012"></a>
+<span class="sourceLineNo">6013</span>    Cell c = result.getColumnLatestCell(fam1, qual1);<a name="line.6013"></a>
+<span class="sourceLineNo">6014</span>    assertNotNull(c);<a name="line.6014"></a>
+<span class="sourceLineNo">6015</span>    assertEquals(10L, c.getTimestamp());<a name="line.6015"></a>
 <span class="sourceLineNo">6016</span><a name="line.6016"></a>
-<span class="sourceLineNo">6017</span>    assertTrue(Bytes.equals(c.getValueArray(), c.getValueOffset(), c.getValueLength(),<a name="line.6017"></a>
-<span class="sourceLineNo">6018</span>      expected, 0, expected.length));<a name="line.6018"></a>
-<span class="sourceLineNo">6019</span>  }<a name="line.6019"></a>
-<span class="sourceLineNo">6020</span><a name="line.6020"></a>
-<span class="sourceLineNo">6021</span>  @Test<a name="line.6021"></a>
-<span class="sourceLineNo">6022</span>  public void testCheckAndMutateTimestampsAreMonotonic() throws IOException {<a name="line.6022"></a>
-<span class="sourceLineNo">6023</span>    region = initHRegion(tableName, method, CONF, fam1);<a name="line.6023"></a>
-<span class="sourceLineNo">6024</span>    ManualEnvironmentEdge edge = new ManualEnvironmentEdge();<a name="line.6024"></a>
-<span class="sourceLineNo">6025</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.6025"></a>
+<span class="sourceLineNo">6017</span>    edge.setValue(1); // clock goes back<a name="line.6017"></a>
+<span class="sourceLineNo">6018</span>    region.append(a);<a name="line.6018"></a>
+<span class="sourceLineNo">6019</span>    result = region.get(new Get(row));<a name="line.6019"></a>
+<span class="sourceLineNo">6020</span>    c = result.getColumnLatestCell(fam1, qual1);<a name="line.6020"></a>
+<span class="sourceLineNo">6021</span>    assertEquals(11L, c.getTimestamp());<a name="line.6021"></a>
+<span class="sourceLineNo">6022</span><a name="line.6022"></a>
+<span class="sourceLineNo">6023</span>    byte[] expected = new byte[qual1.length*2];<a name="line.6023"></a>
+<span class="sourceLineNo">6024</span>    System.arraycopy(qual1, 0, expected, 0, qual1.length);<a name="line.6024"></a>
+<span class="sourceLineNo">6025</span>    System.arraycopy(qual1, 0, expected, qual1.length, qual1.length);<a name="line.6025"></a>
 <span class="sourceLineNo">6026</span><a name="line.6026"></a>
-<span class="sourceLineNo">6027</span>    edge.setValue(10);<a name="line.6027"></a>
-<span class="sourceLineNo">6028</span>    Put p = new Put(row);<a name="line.6028"></a>
-<span class="sourceLineNo">6029</span>    p.setDurability(Durability.SKIP_WAL);<a name="line.6029"></a>
-<span class="sourceLineNo">6030</span>    p.addColumn(fam1, qual1, qual1);<a name="line.6030"></a>
-<span class="sourceLineNo">6031</span>    region.put(p);<a name="line.6031"></a>
-<span class="sourceLineNo">6032</span><a name="line.6032"></a>
-<span class="sourceLineNo">6033</span>    Result result = region.get(new Get(row));<a name="line.6033"></a>
-<span class="sourceLineNo">6034</span>    Cell c = result.getColumnLatestCell(fam1, qual1);<a name="line.6034"></a>
-<span class="sourceLineNo">6035</span>    assertNotNull(c);<a name="line.6035"></a>
-<span class="sourceLineNo">6036</span>    assertEquals(10L, c.getTimestamp());<a name="line.6036"></a>
-<span class="sourceLineNo">6037</span><a name="line.6037"></a>
-<span class="sourceLineNo">6038</span>    edge.setValue(1); // clock goes back<a name="line.6038"></a>
-<span class="sourceLineNo">6039</span>    p = new Put(row);<a name="line.6039"></a>
-<span class="sourceLineNo">6040</span>    p.setDurability(Durability.SKIP_WAL);<a name="line.6040"></a>
-<span class="sourceLineNo">6041</span>    p.addColumn(fam1, qual1, qual2);<a name="line.6041"></a>
-<span class="sourceLineNo">6042</span>    region.checkAndMutate(row, fam1, qual1, CompareOperator.EQUAL, new BinaryComparator(qual1), p);<a name="line.6042"></a>
-<span class="sourceLineNo">6043</span>    result = region.get(new Get(row));<a name="line.6043"></a>
-<span class="sourceLineNo">6044</span>    c = result.getColumnLatestCell(fam1, qual1);<a name="line.6044"></a>
-<span class="sourceLineNo">6045</span>    assertEquals(10L, c.getTimestamp());<a name="line.6045"></a>
-<span class="sourceLineNo">6046</span><a name="line.6046"></a>
-<span class="sourceLineNo">6047</span>    assertTrue(Bytes.equals(c.getValueArray(), c.getValueOffset(), c.getValueLength(),<a name="line.6047"></a>
-<span class="sourceLineNo">6048</span>      qual2, 0, qual2.length));<a name="line.6048"></a>
-<span class="sourceLineNo">6049</span>  }<a name="line.6049"></a>
-<span class="sourceLineNo">6050</span><a name="line.6050"></a>
-<span class="sourceLineNo">6051</span>  @Test<a name="line.6051"></a>
-<span class="sourceLineNo">6052</span>  public void testBatchMutateWithWrongRegionException() throws Exception {<a name="line.6052"></a>
-<span class="sourceLineNo">6053</span>    final byte[] a = Bytes.toBytes("a");<a name="line.6053"></a>
-<span class="sourceLineNo">6054</span>    final byte[] b = Bytes.toBytes("b");<a name="line.6054"></a>
-<span class="sourceLineNo">6055</span>    final byte[] c = Bytes.toBytes("c"); // exclusive<a name="line.6055"></a>
+<span class="sourceLineNo">6027</span>    assertTrue(Bytes.equals(c.getValueArray(), c.getValueOffset(), c.getValueLength(),<a name="line.6027"></a>
+<span class="sourceLineNo">6028</span>      expected, 0, expected.length));<a name="line.6028"></a>
+<span class="sourceLineNo">6029</span>  }<a name="line.6029"></a>
+<span class="sourceLineNo">6030</span><a name="line.6030"></a>
+<span class="sourceLineNo">6031</span>  @Test<a name="line.6031"></a>
+<span class="sourceLineNo">6032</span>  public void testCheckAndMutateTimestampsAreMonotonic() throws IOException {<a name="line.6032"></a>
+<span class="sourceLineNo">6033</span>    region = initHRegion(tableName, method, CONF, fam1);<a name="line.6033"></a>
+<span class="sourceLineNo">6034</span>    ManualEnvironmentEdge edge = new ManualEnvironmentEdge();<a name="line.6034"></a>
+<span class="sourceLineNo">6035</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.6035"></a>
+<span class="sourceLineNo">6036</span><a name="line.6036"></a>
+<span class="sourceLineNo">6037</span>    edge.setValue(10);<a name="line.6037"></a>
+<span class="sourceLineNo">6038</span>    Put p = new Put(row);<a name="line.6038"></a>
+<span class="sourceLineNo">6039</span>    p.setDurability(Durability.SKIP_WAL);<a name="line.6039"></a>
+<span class="sourceLineNo">6040</span>    p.addColumn(fam1, qual1, qual1);<a name="line.6040"></a>
+<span class="sourceLineNo">6041</span>    region.put(p);<a name="line.6041"></a>
+<span class="sourceLineNo">6042</span><a name="line.6042"></a>
+<span class="sourceLineNo">6043</span>    Result result = region.get(new Get(row));<a name="line.6043"></a>
+<span class="sourceLineNo">6044</span>    Cell c = result.getColumnLatestCell(fam1, qual1);<a name="line.6044"></a>
+<span class="sourceLineNo">6045</span>    assertNotNull(c);<a name="line.6045"></a>
+<span class="sourceLineNo">6046</span>    assertEquals(10L, c.getTimestamp());<a name="line.6046"></a>
+<span class="sourceLineNo">6047</span><a name="line.6047"></a>
+<span class="sourceLineNo">6048</span>    edge.setValue(1); // clock goes back<a name="line.6048"></a>
+<span class="sourceLineNo">6049</span>    p = new Put(row);<a name="line.6049"></a>
+<span class="sourceLineNo">6050</span>    p.setDurability(Durability.SKIP_WAL);<a name="line.6050"></a>
+<span class="sourceLineNo">6051</span>    p.addColumn(fam1, qual1, qual2);<a name="line.6051"></a>
+<span class="sourceLineNo">6052</span>    region.checkAndMutate(row, fam1, qual1, CompareOperator.EQUAL, new BinaryComparator(qual1), p);<a name="line.6052"></a>
+<span class="sourceLineNo">6053</span>    result = region.get(new Get(row));<a name="line.6053"></a>
+<span class="sourceLineNo">6054</span>    c = result.getColumnLatestCell(fam1, qual1);<a name="line.6054"></a>
+<span class="sourceLineNo">6055</span>    assertEquals(10L, c.getTimestamp());<a name="line.6055"></a>
 <span class="sourceLineNo">6056</span><a name="line.6056"></a>
-<span class="sourceLineNo">6057</span>    int prevLockTimeout = CONF.getInt("hbase.rowlock.wait.duration", 30000);<a name="line.6057"></a>
-<span class="sourceLineNo">6058</span>    CONF.setInt("hbase.rowlock.wait.duration", 1000);<a name="line.6058"></a>
-<span class="sourceLineNo">6059</span>    region = initHRegion(tableName, a, c, method, CONF, false, fam1);<a name="line.6059"></a>
+<span class="sourceLineNo">6057</span>    assertTrue(Bytes.equals(c.getValueArray(), c.getValueOffset(), c.getValueLength(),<a name="line.6057"></a>
+<span class="sourceLineNo">6058</span>      qual2, 0, qual2.length));<a name="line.6058"></a>
+<span class="sourceLineNo">6059</span>  }<a name="line.6059"></a>
 <span class="sourceLineNo">6060</span><a name="line.6060"></a>
-<span class="sourceLineNo">6061</span>    Mutation[] mutations = new Mutation[] {<a name="line.6061"></a>
-<span class="sourceLineNo">6062</span>        new Put(a)<a name="line.6062"></a>
-<span class="sourceLineNo">6063</span>            .add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6063"></a>
-<span class="sourceLineNo">6064</span>              .setRow(a)<a name="line.6064"></a>
-<span class="sourceLineNo">6065</span>              .setFamily(fam1)<a name="line.6065"></a>
-<span class="sourceLineNo">6066</span>              .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6066"></a>
-<span class="sourceLineNo">6067</span>              .setType(Cell.Type.Put)<a name="line.6067"></a>
-<span class="sourceLineNo">6068</span>              .build()),<a name="line.6068"></a>
-<span class="sourceLineNo">6069</span>        // this is outside the region boundary<a name="line.6069"></a>
-<span class="sourceLineNo">6070</span>        new Put(c).add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6070"></a>
-<span class="sourceLineNo">6071</span>              .setRow(c)<a name="line.6071"></a>
-<span class="sourceLineNo">6072</span>              .setFamily(fam1)<a name="line.6072"></a>
-<span class="sourceLineNo">6073</span>              .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6073"></a>
-<span class="sourceLineNo">6074</span>              .setType(Type.Put)<a name="line.6074"></a>
-<span class="sourceLineNo">6075</span>              .build()),<a name="line.6075"></a>
-<span class="sourceLineNo">6076</span>        new Put(b).add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6076"></a>
-<span class="sourceLineNo">6077</span>              .setRow(b)<a name="line.6077"></a>
-<span class="sourceLineNo">6078</span>              .setFamily(fam1)<a name="line.6078"></a>
-<span class="sourceLineNo">6079</span>              .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6079"></a>
-<span class="sourceLineNo">6080</span>              .setType(Cell.Type.Put)<a name="line.6080"></a>
-<span class="sourceLineNo">6081</span>              .build())<a name="line.6081"></a>
-<span class="sourceLineNo">6082</span>    };<a name="line.6082"></a>
-<span class="sourceLineNo">6083</span><a name="line.6083"></a>
-<span class="sourceLineNo">6084</span>    OperationStatus[] status = region.batchMutate(mutations);<a name="line.6084"></a>
-<span class="sourceLineNo">6085</span>    assertEquals(OperationStatusCode.SUCCESS, status[0].getOperationStatusCode());<a name="line.6085"></a>
-<span class="sourceLineNo">6086</span>    assertEquals(OperationStatusCode.SANITY_CHECK_FAILURE, status[1].getOperationStatusCode());<a name="line.6086"></a>
-<span class="sourceLineNo">6087</span>    assertEquals(OperationStatusCode.SUCCESS, status[2].getOperationStatusCode());<a name="line.6087"></a>
-<span class="sourceLineNo">6088</span><a name="line.6088"></a>
-<span class="sourceLineNo">6089</span><a name="line.6089"></a>
-<span class="sourceLineNo">6090</span>    // test with a row lock held for a long time<a name="line.6090"></a>
-<span class="sourceLineNo">6091</span>    final CountDownLatch obtainedRowLock = new CountDownLatch(1);<a name="line.6091"></a>
-<span class="sourceLineNo">6092</span>    ExecutorService exec = Executors.newFixedThreadPool(2);<a name="line.6092"></a>
-<span class="sourceLineNo">6093</span>    Future&lt;Void&gt; f1 = exec.submit(new Callable&lt;Void&gt;() {<a name="line.6093"></a>
-<span class="sourceLineNo">6094</span>      @Override<a name="line.6094"></a>
-<span class="sourceLineNo">6095</span>      public Void call() throws Exception {<a name="line.6095"></a>
-<span class="sourceLineNo">6096</span>        LOG.info("Acquiring row lock");<a name="line.6096"></a>
-<span class="sourceLineNo">6097</span>        RowLock rl = region.getRowLock(b);<a name="line.6097"></a>
-<span class="sourceLineNo">6098</span>        obtainedRowLock.countDown();<a name="line.6098"></a>
-<span class="sourceLineNo">6099</span>        LOG.info("Waiting for 5 seconds before releasing lock");<a name="line.6099"></a>
-<span class="sourceLineNo">6100</span>        Threads.sleep(5000);<a name="line.6100"></a>
-<span class="sourceLineNo">6101</span>        LOG.info("Releasing row lock");<a name="line.6101"></a>
-<span class="sourceLineNo">6102</span>        rl.release();<a name="line.6102"></a>
-<span class="sourceLineNo">6103</span>        return null;<a name="line.6103"></a>
-<span class="sourceLineNo">6104</span>      }<a name="line.6104"></a>
-<span class="sourceLineNo">6105</span>    });<a name="line.6105"></a>
-<span class="sourceLineNo">6106</span>    obtainedRowLock.await(30, TimeUnit.SECONDS);<a name="line.6106"></a>
-<span class="sourceLineNo">6107</span><a name="line.6107"></a>
-<span class="sourceLineNo">6108</span>    Future&lt;Void&gt; f2 = exec.submit(new Callable&lt;Void&gt;() {<a name="line.6108"></a>
-<span class="sourceLineNo">6109</span>      @Override<a name="line.6109"></a>
-<span class="sourceLineNo">6110</span>      public Void call() throws Exception {<a name="line.6110"></a>
-<span class="sourceLineNo">6111</span>        Mutation[] mutations = new Mutation[] {<a name="line.6111"></a>
-<span class="sourceLineNo">6112</span>            new Put(a).add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6112"></a>
-<span class="sourceLineNo">6113</span>                .setRow(a)<a name="line.6113"></a>
-<span class="sourceLineNo">6114</span>                .setFamily(fam1)<a name="line.6114"></a>
-<span class="sourceLineNo">6115</span>                .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6115"></a>
-<span class="sourceLineNo">6116</span>                .setType(Cell.Type.Put)<a name="line.6116"></a>
-<span class="sourceLineNo">6117</span>                .build()),<a name="line.6117"></a>
-<span class="sourceLineNo">6118</span>            new Put(b).add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6118"></a>
-<span class="sourceLineNo">6119</span>                .setRow(b)<a name="line.6119"></a>
-<span class="sourceLineNo">6120</span>                .setFamily(fam1)<a name="line.6120"></a>
-<span class="sourceLineNo">6121</span>                .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6121"></a>
-<span class="sourceLineNo">6122</span>                .setType(Cell.Type.Put)<a name="line.6122"></a>
-<span class="sourceLineNo">6123</span>                .build()),<a name="line.6123"></a>
-<span class="sourceLineNo">6124</span>        };<a name="line.6124"></a>
-<span class="sourceLineNo">6125</span><a name="line.6125"></a>
-<span class="sourceLineNo">6126</span>        // this will wait for the row lock, and it will eventually succeed<a name="line.6126"></a>
-<span class="sourceLineNo">6127</span>        OperationStatus[] status = region.batchMutate(mutations);<a name="line.6127"></a>
-<span class="sourceLineNo">6128</span>        assertEquals(OperationStatusCode.SUCCESS, status[0].getOperationStatusCode());<a name="line.6128"></a>
-<span class="sourceLineNo">6129</span>        assertEquals(OperationStatusCode.SUCCESS, status[1].getOperationStatusCode());<a name="line.6129"></a>
-<span class="sourceLineNo">6130</span>        return null;<a name="line.6130"></a>
-<span class="sourceLineNo">6131</span>      }<a name="line.6131"></a>
-<span class="sourceLineNo">6132</span>    });<a name="line.6132"></a>
-<span class="sourceLineNo">6133</span><a name="line.6133"></a>
-<span class="sourceLineNo">6134</span>    f1.get();<a name="line.6134"></a>
-<span class="sourceLineNo">6135</span>    f2.get();<a name="line.6135"></a>
-<span class="sourceLineNo">6136</span><a name="line.6136"></a>
-<span class="sourceLineNo">6137</span>    CONF.setInt("hbase.rowlock.wait.duration", prevLockTimeout);<a name="line.6137"></a>
-<span class="sourceLineNo">6138</span>  }<a name="line.6138"></a>
-<span class="sourceLineNo">6139</span><a name="line.6139"></a>
-<span class="sourceLineNo">6140</span>  @Test<a name="line.6140"></a>
-<span class="sourceLineNo">6141</span>  public void testCheckAndRowMutateTimestampsAreMonotonic() throws IOException {<a name="line.6141"></a>
-<span class="sourceLineNo">6142</span>    region = initHRegion(tableName, method, CONF, fam1);<a name="line.6142"></a>
-<span class="sourceLineNo">6143</span>    ManualEnvironmentEdge edge = new ManualEnvironmentEdge();<a name="line.6143"></a>
-<span class="sourceLineNo">6144</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.6144"></a>
-<span class="sourceLineNo">6145</span><a name="line.6145"></a>
-<span class="sourceLineNo">6146</span>    edge.setValue(10);<a name="line.6146"></a>
-<span class="sourceLineNo">6147</span>    Put p = new Put(row);<a name="line.6147"></a>
-<span class="sourceLineNo">6148</span>    p.setDurability(Durability.SKIP_WAL);<a name="line.6148"></a>
-<span class="sourceLineNo">6149</span>    p.addColumn(fam1, qual1, qual1);<a name="line.6149"></a>
-<span class="sourceLineNo">6150</span>    region.put(p);<a name="line.6150"></a>
-<span class="sourceLineNo">6151</span><a name="line.6151"></a>
-<span class="sourceLineNo">6152</span>    Result result = region.get(new Get(row));<a name="line.6152"></a>
-<span class="sourceLineNo">6153</span>    Cell c = result.getColumnLatestCell(fam1, qual1);<a name="line.6153"></a>
-<span class="sourceLineNo">6154</span>    assertNotNull(c);<a name="line.6154"></a>
-<span class="sourceLineNo">6155</span>    assertEquals(10L, c.getTimestamp());<a name="line.6155"></a>
-<span class="sourceLineNo">6156</span><a name="line.6156"></a>
-<span class="sourceLineNo">6157</span>    edge.setValue(1); // clock goes back<a name="line.6157"></a>
-<span class="sourceLineNo">6158</span>    p = new Put(row);<a name="line.6158"></a>
-<span class="sourceLineNo">6159</span>    p.setDurability(Durability.SKIP_WAL);<a name="line.6159"></a>
-<span class="sourceLineNo">6160</span>    p.addColumn(fam1, qual1, qual2);<a name="line.6160"></a>
-<span class="sourceLineNo">6161</span>    RowMutations rm = new RowMutations(row);<a name="line.6161"></a>
-<span class="sourceLineNo">6162</span>    rm.add(p);<a name="line.6162"></a>
-<span class="sourceLineNo">6163</span>    assertTrue(region.checkAndRowMutate(row, fam1, qual1, CompareOperator.EQUAL,<a name="line.6163"></a>
-<span class="sourceLineNo">6164</span>        new BinaryComparator(qual1), rm));<a name="line.6164"></a>
-<span class="sourceLineNo">6165</span>    result = region.get(new Get(row));<a name="line.6165"></a>
-<span class="sourceLineNo">6166</span>    c = result.getColumnLatestCell(fam1, qual1);<a name="line.6166"></a>
-<span class="sourceLineNo">6167</span>    assertEquals(10L, c.getTimestamp());<a name="line.6167"></a>
-<span class="sourceLineNo">6168</span>    LOG.info("c value " +<a name="line.6168"></a>
-<span class="sourceLineNo">6169</span>      Bytes.toStringBinary(c.getValueArray(), c.getValueOffset(), c.getValueLength()));<a name="line.6169"></a>
-<span class="sourceLineNo">6170</span><a name="line.6170"></a>
-<span class="sourceLineNo">6171</span>    assertTrue(Bytes.equals(c.getValueArray(), c.getValueOffset(), c.getValueLength(),<a name="line.6171"></a>
-<span class="sourceLineNo">6172</span>      qual2, 0, qual2.length));<a name="line.6172"></a>
-<span class="sourceLineNo">6173</span>  }<a name="line.6173"></a>
-<span class="sourceLineNo">6174</span><a name="line.6174"></a>
-<span class="sourceLineNo">6175</span>  HRegion initHRegion(TableName tableName, String callingMethod,<a name="line.6175"></a>
-<span class="sourceLineNo">6176</span>      byte[]... families) throws IOException {<a name="line.6176"></a>
-<span class="sourceLineNo">6177</span>    return initHRegion(tableName, callingMethod, HBaseConfiguration.create(),<a name="line.6177"></a>
-<span class="sourceLineNo">6178</span>        families);<a name="line.6178"></a>
-<span class="sourceLineNo">6179</span>  }<a name="line.6179"></a>
+<span class="sourceLineNo">6061</span>  @Test<a name="line.6061"></a>
+<span class="sourceLineNo">6062</span>  public void testBatchMutateWithWrongRegionException() throws Exception {<a name="line.6062"></a>
+<span class="sourceLineNo">6063</span>    final byte[] a = Bytes.toBytes("a");<a name="line.6063"></a>
+<span class="sourceLineNo">6064</span>    final byte[] b = Bytes.toBytes("b");<a name="line.6064"></a>
+<span class="sourceLineNo">6065</span>    final byte[] c = Bytes.toBytes("c"); // exclusive<a name="line.6065"></a>
+<span class="sourceLineNo">6066</span><a name="line.6066"></a>
+<span class="sourceLineNo">6067</span>    int prevLockTimeout = CONF.getInt("hbase.rowlock.wait.duration", 30000);<a name="line.6067"></a>
+<span class="sourceLineNo">6068</span>    CONF.setInt("hbase.rowlock.wait.duration", 1000);<a name="line.6068"></a>
+<span class="sourceLineNo">6069</span>    region = initHRegion(tableName, a, c, method, CONF, false, fam1);<a name="line.6069"></a>
+<span class="sourceLineNo">6070</span><a name="line.6070"></a>
+<span class="sourceLineNo">6071</span>    Mutation[] mutations = new Mutation[] {<a name="line.6071"></a>
+<span class="sourceLineNo">6072</span>        new Put(a)<a name="line.6072"></a>
+<span class="sourceLineNo">6073</span>            .add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6073"></a>
+<span class="sourceLineNo">6074</span>              .setRow(a)<a name="line.6074"></a>
+<span class="sourceLineNo">6075</span>              .setFamily(fam1)<a name="line.6075"></a>
+<span class="sourceLineNo">6076</span>              .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6076"></a>
+<span class="sourceLineNo">6077</span>              .setType(Cell.Type.Put)<a name="line.6077"></a>
+<span class="sourceLineNo">6078</span>              .build()),<a name="line.6078"></a>
+<span class="sourceLineNo">6079</span>        // this is outside the region boundary<a name="line.6079"></a>
+<span class="sourceLineNo">6080</span>        new Put(c).add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6080"></a>
+<span class="sourceLineNo">6081</span>              .setRow(c)<a name="line.6081"></a>
+<span class="sourceLineNo">6082</span>              .setFamily(fam1)<a name="line.6082"></a>
+<span class="sourceLineNo">6083</span>              .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6083"></a>
+<span class="sourceLineNo">6084</span>              .setType(Type.Put)<a name="line.6084"></a>
+<span class="sourceLineNo">6085</span>              .build()),<a name="line.6085"></a>
+<span class="sourceLineNo">6086</span>        new Put(b).add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6086"></a>
+<span class="sourceLineNo">6087</span>              .setRow(b)<a name="line.6087"></a>
+<span class="sourceLineNo">6088</span>              .setFamily(fam1)<a name="line.6088"></a>
+<span class="sourceLineNo">6089</span>              .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6089"></a>
+<span class="sourceLineNo">6090</span>              .setType(Cell.Type.Put)<a name="line.6090"></a>
+<span class="sourceLineNo">6091</span>              .build())<a name="line.6091"></a>
+<span class="sourceLineNo">6092</span>    };<a name="line.6092"></a>
+<span class="sourceLineNo">6093</span><a name="line.6093"></a>
+<span class="sourceLineNo">6094</span>    OperationStatus[] status = region.batchMutate(mutations);<a name="line.6094"></a>
+<span class="sourceLineNo">6095</span>    assertEquals(OperationStatusCode.SUCCESS, status[0].getOperationStatusCode());<a name="line.6095"></a>
+<span class="sourceLineNo">6096</span>    assertEquals(OperationStatusCode.SANITY_CHECK_FAILURE, status[1].getOperationStatusCode());<a name="line.6096"></a>
+<span class="sourceLineNo">6097</span>    assertEquals(OperationStatusCode.SUCCESS, status[2].getOperationStatusCode());<a name="line.6097"></a>
+<span class="sourceLineNo">6098</span><a name="line.6098"></a>
+<span class="sourceLineNo">6099</span><a name="line.6099"></a>
+<span class="sourceLineNo">6100</span>    // test with a row lock held for a long time<a name="line.6100"></a>
+<span class="sourceLineNo">6101</span>    final CountDownLatch obtainedRowLock = new CountDownLatch(1);<a name="line.6101"></a>
+<span class="sourceLineNo">6102</span>    ExecutorService exec = Executors.newFixedThreadPool(2);<a name="line.6102"></a>
+<span class="sourceLineNo">6103</span>    Future&lt;Void&gt; f1 = exec.submit(new Callable&lt;Void&gt;() {<a name="line.6103"></a>
+<span class="sourceLineNo">6104</span>      @Override<a name="line.6104"></a>
+<span class="sourceLineNo">6105</span>      public Void call() throws Exception {<a name="line.6105"></a>
+<span class="sourceLineNo">6106</span>        LOG.info("Acquiring row lock");<a name="line.6106"></a>
+<span class="sourceLineNo">6107</span>        RowLock rl = region.getRowLock(b);<a name="line.6107"></a>
+<span class="sourceLineNo">6108</span>        obtainedRowLock.countDown();<a name="line.6108"></a>
+<span class="sourceLineNo">6109</span>        LOG.info("Waiting for 5 seconds before releasing lock");<a name="line.6109"></a>
+<span class="sourceLineNo">6110</span>        Threads.sleep(5000);<a name="line.6110"></a>
+<span class="sourceLineNo">6111</span>        LOG.info("Releasing row lock");<a name="line.6111"></a>
+<span class="sourceLineNo">6112</span>        rl.release();<a name="line.6112"></a>
+<span class="sourceLineNo">6113</span>        return null;<a name="line.6113"></a>
+<span class="sourceLineNo">6114</span>      }<a name="line.6114"></a>
+<span class="sourceLineNo">6115</span>    });<a name="line.6115"></a>
+<span class="sourceLineNo">6116</span>    obtainedRowLock.await(30, TimeUnit.SECONDS);<a name="line.6116"></a>
+<span class="sourceLineNo">6117</span><a name="line.6117"></a>
+<span class="sourceLineNo">6118</span>    Future&lt;Void&gt; f2 = exec.submit(new Callable&lt;Void&gt;() {<a name="line.6118"></a>
+<span class="sourceLineNo">6119</span>      @Override<a name="line.6119"></a>
+<span class="sourceLineNo">6120</span>      public Void call() throws Exception {<a name="line.6120"></a>
+<span class="sourceLineNo">6121</span>        Mutation[] mutations = new Mutation[] {<a name="line.6121"></a>
+<span class="sourceLineNo">6122</span>            new Put(a).add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6122"></a>
+<span class="sourceLineNo">6123</span>                .setRow(a)<a name="line.6123"></a>
+<span class="sourceLineNo">6124</span>                .setFamily(fam1)<a name="line.6124"></a>
+<span class="sourceLineNo">6125</span>                .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6125"></a>
+<span class="sourceLineNo">6126</span>                .setType(Cell.Type.Put)<a name="line.6126"></a>
+<span class="sourceLineNo">6127</span>                .build()),<a name="line.6127"></a>
+<span class="sourceLineNo">6128</span>            new Put(b).add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6128"></a>
+<span class="sourceLineNo">6129</span>                .setRow(b)<a name="line.6129"></a>
+<span class="sourceLineNo">6130</span>                .setFamily(fam1)<a name="line.6130"></a>
+<span class="sourceLineNo">6131</span>                .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6131"></a>
+<span class="sourceLineNo">6132</span>                .setType(Cell.Type.Put)<a name="line.6132"></a>
+<span class="sourceLineNo">6133</span>                .build()),<a name="line.6133"></a>
+<span class="sourceLineNo">6134</span>        };<a name="line.6134"></a>
+<span class="sourceLineNo">6135</span><a name="line.6135"></a>
+<span class="sourceLineNo">6136</span>        // this will wait for the row lock, and it will eventually succeed<a name="line.6136"></a>
+<span class="sourceLineNo">6137</span>        OperationStatus[] status = region.batchMutate(mutations);<a name="line.6137"></a>
+<span class="sourceLineNo">6138</span>        assertEquals(OperationStatusCode.SUCCESS, status[0].getOperationStatusCode());<a name="line.6138"></a>
+<span class="sourceLineNo">6139</span>        assertEquals(OperationStatusCode.SUCCESS, status[1].getOperationStatusCode());<a name="line.6139"></a>
+<span class="sourceLineNo">6140</span>        return null;<a name="line.6140"></a>
+<span class="sourceLineNo">6141</span>      }<a name="line.6141"></a>
+<span class="sourceLineNo">6142</span>    });<a name="line.6142"></a>
+<span class="sourceLineNo">6143</span><a name="line.6143"></a>
+<span class="sourceLineNo">6144</span>    f1.get();<a name="line.6144"></a>
+<span class="sourceLineNo">6145</span>    f2.get();<a name="line.6145"></a>
+<span class="sourceLineNo">6146</span><a name="line.6146"></a>
+<span class="sourceLineNo">6147</span>    CONF.setInt("hbase.rowlock.wait.duration", prevLockTimeout);<a name="line.6147"></a>
+<span class="sourceLineNo">6148</span>  }<a name="line.6148"></a>
+<span class="sourceLineNo">6149</span><a name="line.6149"></a>
+<span class="sourceLineNo">6150</span>  @Test<a name="line.6150"></a>
+<span class="sourceLineNo">6151</span>  public void testCheckAndRowMutateTimestampsAreMonotonic() throws IOException {<a name="line.6151"></a>
+<span class="sourceLineNo">6152</span>    region = initHRegion(tableName, method, CONF, fam1);<a name="line.6152"></a>
+<span class="sourceLineNo">6153</span>    ManualEnvironmentEdge edge = new ManualEnvironmentEdge();<a name="line.6153"></a>
+<span class="sourceLineNo">6154</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.6154"></a>
+<span class="sourceLineNo">6155</span><a name="line.6155"></a>
+<span class="sourceLineNo">6156</span>    edge.setValue(10);<a name="line.6156"></a>
+<span class="sourceLineNo">6157</span>    Put p = new Put(row);<a name="line.6157"></a>
+<span class="sourceLineNo">6158</span>    p.setDurability(Durability.SKIP_WAL);<a name="line.6158"></a>
+<span class="sourceLineNo">6159</span>    p.addColumn(fam1, qual1, qual1);<a name="line.6159"></a>
+<span class="sourceLineNo">6160</span>    region.put(p);<a name="line.6160"></a>
+<span class="sourceLineNo">6161</span><a name="line.6161"></a>
+<span class="sourceLineNo">6162</span>    Result result = region.get(new Get(row));<a name="line.6162"></a>
+<span class="sourceLineNo">6163</span>    Cell c = result.getColumnLatestCell(fam1, qual1);<a name="line.6163"></a>
+<span class="sourceLineNo">6164</span>    assertNotNull(c);<a name="line.6164"></a>
+<span class="sourceLineNo">6165</span>    assertEquals(10L, c.getTimestamp());<a name="line.6165"></a>
+<span class="sourceLineNo">6166</span><a name="line.6166"></a>
+<span class="sourceLineNo">6167</span>    edge.setValue(1); // clock goes back<a name="line.6167"></a>
+<span class="sourceLineNo">6168</span>    p = new Put(row);<a name="line.6168"></a>
+<span class="sourceLineNo">6169</span>    p.setDurability(Durability.SKIP_WAL);<a name="line.6169"></a>
+<span class="sourceLineNo">6170</span>    p.addColumn(fam1, qual1, qual2);<a name="line.6170"></a>
+<span class="sourceLineNo">6171</span>    RowMutations rm = new RowMutations(row);<a name="line.6171"></a>
+<span class="sourceLineNo">6172</span>    rm.add(p);<a name="line.6172"></a>
+<span class="sourceLineNo">6173</span>    assertTrue(region.checkAndRowMutate(row, fam1, qual1, CompareOperator.EQUAL,<a name="line.6173"></a>
+<span class="sourceLineNo">6174</span>        new BinaryComparator(qual1), rm));<a name="line.6174"></a>
+<span class="sourceLineNo">6175</span>    result = region.get(new Get(row));<a name="line.6175"></a>
+<span class="sourceLineNo">6176</span>    c = result.getColumnLatestCell(fam1, qual1);<a name="line.6176"></a>
+<span class="sourceLineNo">6177</span>    assertEquals(10L, c.getTimestamp());<a name="line.6177"></a>
+<span class="sourceLineNo">6178</span>    LOG.info("c value " +<a name="line.6178"></a>
+<span class="sourceLineNo">6179</span>      Bytes.toStringBinary(c.getValueArray(), c.getValueOffset(), c.getValueLength()));<a name="line.6179"></a>
 <span class="sourceLineNo">6180</span><a name="line.6180"></a>
-<span class="sourceLineNo">6181</span>  /**<a name="line.6181"></a>
-<span class="sourceLineNo">6182</span>   * HBASE-16429 Make sure no stuck if roll writer when ring buffer is filled with appends<a name="line.6182"></a>
-<span class="sourceLineNo">6183</span>   * @throws IOException if IO error occurred during test<a name="line.6183"></a>
-<span class="sourceLineNo">6184</span>   */<a name="line.6184"></a>
-<span class="sourceLineNo">6185</span>  @Test<a name="line.6185"></a>
-<span class="sourceLineNo">6186</span>  public void testWritesWhileRollWriter() throws IOException {<a name="line.6186"></a>
-<span class="sourceLineNo">6187</span>    int testCount = 10;<a name="line.6187"></a>
-<span class="sourceLineNo">6188</span>    int numRows = 1024;<a name="line.6188"></a>
-<span class="sourceLineNo">6189</span>    int numFamilies = 2;<a name="line.6189"></a>
-<span class="sourceLineNo">6190</span>    int numQualifiers = 2;<a name="line.6190"></a>
-<span class="sourceLineNo">6191</span>    final byte[][] families = new byte[numFamilies][];<a name="line.6191"></a>
-<span class="sourceLineNo">6192</span>    for (int i = 0; i &lt; numFamilies; i++) {<a name="line.6192"></a>
-<span class="sourceLineNo">6193</span>      families[i] = Bytes.toBytes("family" + i);<a name="line.6193"></a>
-<span class="sourceLineNo">6194</span>    }<a name="line.6194"></a>
-<span class="sourceLineNo">6195</span>    final byte[][] qualifiers = new byte[numQualifiers][];<a name="line.6195"></a>
-<span class="sourceLineNo">6196</span>    for (int i = 0; i &lt; numQualifiers; i++) {<a name="line.6196"></a>
-<span class="sourceLineNo">6197</span>      qualifiers[i] = Bytes.toBytes("qual" + i);<a name="line.6197"></a>
-<span class="sourceLineNo">6198</span>    }<a name="line.6198"></a>
-<span class="sourceLineNo">6199</span><a name="line.6199"></a>
-<span class="sourceLineNo">6200</span>    CONF.setInt("hbase.regionserver.wal.disruptor.event.count", 2);<a name="line.6200"></a>
-<span class="sourceLineNo">6201</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.6201"></a>
-<span class="sourceLineNo">6202</span>    try {<a name="line.6202"></a>
-<span class="sourceLineNo">6203</span>      List&lt;Thread&gt; threads = new ArrayList&lt;&gt;();<a name="line.6203"></a>
-<span class="sourceLineNo">6204</span>      for (int i = 0; i &lt; numRows; i++) {<a name="line.6204"></a>
-<span class="sourceLineNo">6205</span>        final int count = i;<a name="line.6205"></a>
-<span class="sourceLineNo">6206</span>        Thread t = new Thread(new Runnable() {<a name="line.6206"></a>
-<span class="sourceLineNo">6207</span><a name="line.6207"></a>
-<span class="sourceLineNo">6208</span>          @Override<a name="line.6208"></a>
-<span class="sourceLineNo">6209</span>          public void run() {<a name="line.6209"></a>
-<span class="sourceLineNo">6210</span>            byte[] row = Bytes.toBytes("row" + count);<a name="line.6210"></a>
-<span class="sourceLineNo">6211</span>            Put put = new Put(row);<a name="line.6211"></a>
-<span class="sourceLineNo">6212</span>            put.setDurability(Durability.SYNC_WAL);<a name="line.6212"></a>
-<span class="sourceLineNo">6213</span>            byte[] value = Bytes.toBytes(String.valueOf(count));<a name="line.6213"></a>
-<span class="sourceLineNo">6214</span>            for (byte[] family : families) {<a name="line.6214"></a>
-<span class="sourceLineNo">6215</span>              for (byte[] qualifier : qualifiers) {<a name="line.6215"></a>
-<span class="sourceLineNo">6216</span>                put.addColumn(family, qualifier, count, value);<a name="line.6216"></a>
-<span class="sourceLineNo">6217</span>              }<a name="line.6217"></a>
-<span class="sourceLineNo">6218</span>            }<a name="line.6218"></a>
-<span class="sourceLineNo">6219</span>            try {<a name="line.6219"></a>
-<span class="sourceLineNo">6220</span>              region.put(put);<a name="line.6220"></a>
-<span class="sourceLineNo">6221</span>            } catch (IOException e) {<a name="line.6221"></a>
-<span class="sourceLineNo">6222</span>              throw new RuntimeException(e);<a name="line.6222"></a>
-<span class="sourceLineNo">6223</span>            }<a name="line.6223"></a>
-<span class="sourceLineNo">6224</span>          }<a name="line.6224"></a>
-<span class="sourceLineNo">6225</span>        });<a name="line.6225"></a>
-<span class="sourceLineNo">6226</span>        threads.add(t);<a name="line.6226"></a>
-<span class="sourceLineNo">6227</span>      }<a name="line.6227"></a>
-<span class="sourceLineNo">6228</span>      for (Thread t : threads) {<a name="line.6228"></a>
-<span class="sourceLineNo">6229</span>        t.start();<a name="line.6229"></a>
-<span class="sourceLineNo">6230</span>      }<a name="line.6230"></a>
-<span class="sourceLineNo">6231</span><a name="line.6231"></a>
-<span class="sourceLineNo">6232</span>      for (int i = 0; i &lt; testCount; i++) {<a name="line.6232"></a>
-<span class="sourceLineNo">6233</span>        region.getWAL().rollWriter();<a name="line.6233"></a>
-<span class="sourceLineNo">6234</span>        Thread.yield();<a name="line.6234"></a>
-<span class="sourceLineNo">6235</span>      }<a name="line.6235"></a>
-<span class="sourceLineNo">6236</span>    } finally {<a name="line.6236"></a>
-<span class="sourceLineNo">6237</span>      try {<a name="line.6237"></a>
-<span class="sourceLineNo">6238</span>        HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.6238"></a>
-<span class="sourceLineNo">6239</span>        CONF.setInt("hbase.regionserver.wal.disruptor.event.count", 16 * 1024);<a name="line.6239"></a>
-<span class="sourceLineNo">6240</span>      } catch (DroppedSnapshotException dse) {<a name="line.6240"></a>
-<span class="sourceLineNo">6241</span>        // We could get this on way out because we interrupt the background flusher and it could<a name="line.6241"></a>
-<span class="sourceLineNo">6242</span>        // fail anywhere causing a DSE over in the background flusher... only it is not properly<a name="line.6242"></a>
-<span class="sourceLineNo">6243</span>        // dealt with so could still be memory hanging out when we get to here -- memory we can't<a name="line.6243"></a>
-<span class="sourceLineNo">6244</span>        // flush because the accounting is 'off' since original DSE.<a name="line.6244"></a>
+<span class="sourceLineNo">6181</span>    assertTrue(Bytes.equals(c.getValueArray(), c.getValueOffset(), c.getValueLength(),<a name="line.6181"></a>
+<span class="sourceLineNo">6182</span>      qual2, 0, qual2.length));<a name="line.6182"></a>
+<span class="sourceLineNo">6183</span>  }<a name="line.6183"></a>
+<span class="sourceLineNo">6184</span><a name="line.6184"></a>
+<span class="sourceLineNo">6185</span>  HRegion initHRegion(TableName tableName, String callingMethod,<a name="line.6185"></a>
+<span class="sourceLineNo">6186</span>      byte[]... families) throws IOException {<a name="line.6186"></a>
+<span class="sourceLineNo">6187</span>    return initHRegion(tableName, callingMethod, HBaseConfiguration.create(),<a name="line.6187"></a>
+<span class="sourceLineNo">6188</span>        families);<a name="line.6188"></a>
+<span class="sourceLineNo">6189</span>  }<a name="line.6189"></a>
+<span class="sourceLineNo">6190</span><a name="line.6190"></a>
+<span class="sourceLineNo">6191</span>  /**<a name="line.6191"></a>
+<span class="sourceLineNo">6192</span>   * HBASE-16429 Make sure no stuck if roll writer when ring buffer is filled with appends<a name="line.6192"></a>
+<span class="sourceLineNo">6193</span>   * @throws IOException if IO error occurred during test<a name="line.6193"></a>
+<span class="sourceLineNo">6194</span>   */<a name="line.6194"></a>
+<span class="sourceLineNo">6195</span>  @Test<a name="line.6195"></a>
+<span class="sourceLineNo">6196</span>  public void testWritesWhileRollWriter() throws IOException {<a name="line.6196"></a>
+<span class="sourceLineNo">6197</span>    int testCount = 10;<a name="line.6197"></a>
+<span class="sourceLineNo">6198</span>    int numRows = 1024;<a name="line.6198"></a>
+<span class="sourceLineNo">6199</span>    int numFamilies = 2;<a name="line.6199"></a>
+<span class="sourceLineNo">6200</span>    int numQualifiers = 2;<a name="line.6200"></a>
+<span class="sourceLineNo">6201</span>    final byte[][] families = new byte[numFamilies][];<a name="line.6201"></a>
+<span class="sourceLineNo">6202</span>    for (int i = 0; i &lt; numFamilies; i++) {<a name="line.6202"></a>
+<span class="sourceLineNo">6203</span>      families[i] = Bytes.toBytes("family" + i);<a name="line.6203"></a>
+<span class="sourceLineNo">6204</span>    }<a name="line.6204"></a>
+<span class="sourceLineNo">6205</span>    final byte[][] qualifiers = new byte[numQualifiers][];<a name="line.6205"></a>
+<span class="sourceLineNo">6206</span>    for (int i = 0; i &lt; numQualifiers; i++) {<a name="line.6206"></a>
+<span class="sourceLineNo">6207</span>      qualifiers[i] = Bytes.toBytes("qual" + i);<a name="line.6207"></a>
+<span class="sourceLineNo">6208</span>    }<a name="line.6208"></a>
+<span class="sourceLineNo">6209</span><a name="line.6209"></a>
+<span class="sourceLineNo">6210</span>    CONF.setInt("hbase.regionserver.wal.disruptor.event.count", 2);<a name="line.6210"></a>
+<span class="sourceLineNo">6211</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.6211"></a>
+<span class="sourceLineNo">6212</span>    try {<a name="line.6212"></a>
+<span class="sourceLineNo">6213</span>      List&lt;Thread&gt; threads = new ArrayList&lt;&gt;();<a name="line.6213"></a>
+<span class="sourceLineNo">6214</span>      for (int i = 0; i &lt; numRows; i++) {<a name="line.6214"></a>
+<span class="sourceLineNo">6215</span>        final int count = i;<a name="line.6215"></a>
+<span class="sourceLineNo">6216</span>        Thread t = new Thread(new Runnable() {<a name="line.6216"></a>
+<span class="sourceLineNo">6217</span><a name="line.6217"></a>
+<span class="sourceLineNo">6218</span>          @Override<a name="line.6218"></a>
+<span class="sourceLineNo">6219</span>          public void run() {<a name="line.6219"></a>
+<span class="sourceLineNo">6220</span>            byte[] row = Bytes.toBytes("row" + count);<a name="line.6220"></a>
+<span class="sourceLineNo">6221</span>            Put put = new Put(row);<a name="line.6221"></a>
+<span class="sourceLineNo">6222</span>            put.setDurability(Durability.SYNC_WAL);<a name="line.6222"></a>
+<span class="sourceLineNo">6223</span>            byte[] value = Bytes.toBytes(String.valueOf(count));<a name="line.6223"></a>
+<span class="sourceLineNo">6224</span>            for (byte[] family : families) {<a name="line.6224"></a>
+<span class="sourceLineNo">6225</span>              for (byte[] qualifier : qualifiers) {<a name="line.6225"></a>
+<span class="sourceLineNo">6226</span>                put.addColumn(family, qualifier, count, value);<a name="line.6226"></a>
+<span class="sourceLineNo">6227</span>              }<a name="line.6227"></a>
+<span class="sourceLineNo">6228</span>            }<a name="line.6228"></a>
+<span class="sourceLineNo">6229</span>            try {<a name="line.6229"></a>
+<span class="sourceLineNo">6230</span>              region.put(put);<a name="line.6230"></a>
+<span class="sourceLineNo">6231</span>            } catch (IOException e) {<a name="line.6231"></a>
+<span class="sourceLineNo">6232</span>              throw new RuntimeException(e);<a name="line.6232"></a>
+<span class="sourceLineNo">6233</span>            }<a name="line.6233"></a>
+<span class="sourceLineNo">6234</span>          }<a name="line.6234"></a>
+<span class="sourceLineNo">6235</span>        });<a name="line.6235"></a>
+<span class="sourceLineNo">6236</span>        threads.add(t);<a name="line.6236"></a>
+<span class="sourceLineNo">6237</span>      }<a name="line.6237"></a>
+<span class="sourceLineNo">6238</span>      for (Thread t : threads) {<a name="line.6238"></a>
+<span class="sourceLineNo">6239</span>        t.start();<a name="line.6239"></a>
+<span class="sourceLineNo">6240</span>      }<a name="line.6240"></a>
+<span class="sourceLineNo">6241</span><a name="line.6241"></a>
+<span class="sourceLineNo">6242</span>      for (int i = 0; i &lt; testCount; i++) {<a name="line.6242"></a>
+<span class="sourceLineNo">6243</span>        region.getWAL().rollWriter();<a name="line.6243"></a>
+<span class="sourceLineNo">6244</span>        Thread.yield();<a name="line.6244"></a>
 <span class="sourceLineNo">6245</span>      }<a name="line.6245"></a>
-<span class="sourceLineNo">6246</span>      this.region = null;<a name="line.6246"></a>
-<span class="sourceLineNo">6247</span>    }<a name="line.6247"></a>
-<span class="sourceLineNo">6248</span>  }<a name="line.6248"></a>
-<span class="sourceLineNo">6249</span><a name="line.6249"></a>
-<span class="sourceLineNo">6250</span>  @Test<a name="line.6250"></a>
-<span class="sourceLineNo">6251</span>  public void testMutateRow_WriteRequestCount() throws Exception {<a name="line.6251"></a>
-<span class="sourceLineNo">6252</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.6252"></a>
-<span class="sourceLineNo">6253</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.6253"></a>
-<span class="sourceLineNo">6254</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.6254"></a>
-<span class="sourceLineNo">6255</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.6255"></a>
-<span class="sourceLineNo">6256</span><a name="line.6256"></a>
-<span class="sourceLineNo">6257</span>    RowMutations rm = new RowMutations(row1);<a name="line.6257"></a>
-<span class="sourceLineNo">6258</span>    Put put = new Put(row1);<a name="line.6258"></a>
-<span class="sourceLineNo">6259</span>    put.addColumn(fam1, qf1, val1);<a name="line.6259"></a>
-<span class="sourceLineNo">6260</span>    rm.add(put);<a name="line.6260"></a>
-<span class="sourceLineNo">6261</span><a name="line.6261"></a>
-<span class="sourceLineNo">6262</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.6262"></a>
-<span class="sourceLineNo">6263</span>    long wrcBeforeMutate = this.region.writeRequestsCount.longValue();<a name="line.6263"></a>
-<span class="sourceLineNo">6264</span>    this.region.mutateRow(rm);<a name="line.6264"></a>
-<span class="sourceLineNo">6265</span>    long wrcAfterMutate = this.region.writeRequestsCount.longValue();<a name="line.6265"></a>
-<span class="sourceLineNo">6266</span>    Assert.assertEquals(wrcBeforeMutate + rm.getMutations().size(), wrcAfterMutate);<a name="line.6266"></a>
-<span class="sourceLineNo">6267</span>  }<a name="line.6267"></a>
-<span class="sourceLineNo">6268</span><a name="line.6268"></a>
-<span class="sourceLineNo">6269</span>  @Test<a name="line.6269"></a>
-<span class="sourceLineNo">6270</span>  public void testBulkLoadReplicationEnabled() throws IOException {<a name="line.6270"></a>
-<span class="sourceLineNo">6271</span>    TEST_UTIL.getConfiguration().setBoolean(HConstants.REPLICATION_BULKLOAD_ENABLE_KEY, true);<a name="line.6271"></a>
-<span class="sourceLineNo">6272</span>    final ServerName serverName = ServerName.valueOf(name.getMethodName(), 100, 42);<a name="line.6272"></a>
-<span class="sourceLineNo">6273</span>    final RegionServerServices rss = spy(TEST_UTIL.createMockRegionServerService(serverName));<a name="line.6273"></a>
-<span class="sourceLineNo">6274</span><a name="line.6274"></a>
-<span class="sourceLineNo">6275</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.6275"></a>
-<span class="sourceLineNo">6276</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.6276"></a>
-<span class="sourceLineNo">6277</span>    HRegionInfo hri = new HRegionInfo(htd.getTableName(),<a name="line.6277"></a>
-<span class="sourceLineNo">6278</span>        HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY);<a name="line.6278"></a>
-<span class="sourceLineNo">6279</span>    region = HRegion.openHRegion(hri, htd, rss.getWAL(hri), TEST_UTIL.getConfiguration(),<a name="line.6279"></a>
-<span class="sourceLineNo">6280</span>        rss, null);<a name="line.6280"></a>
-<span class="sourceLineNo">6281</span><a name="line.6281"></a>
-<span class="sourceLineNo">6282</span>    assertTrue(region.conf.getBoolean(HConstants.REPLICATION_BULKLOAD_ENABLE_KEY, false));<a name="line.6282"></a>
-<span class="sourceLineNo">6283</span>    String plugins = region.conf.get(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY, "");<a name="line.6283"></a>
-<span class="sourceLineNo">6284</span>    String replicationCoprocessorClass = ReplicationObserver.class.getCanonicalName();<a name="line.6284"></a>
-<span class="sourceLineNo">6285</span>    assertTrue(plugins.contains(replicationCoprocessorClass));<a name="line.6285"></a>
-<span class="sourceLineNo">6286</span>    assertTrue(region.getCoprocessorHost().<a name="line.6286"></a>
-<span class="sourceLineNo">6287</span>        getCoprocessors().contains(ReplicationObserver.class.getSimpleName()));<a name="line.6287"></a>
-<span class="sourceLineNo">6288</span>  }<a name="line.6288"></a>
-<span class="sourceLineNo">6289</span><a name="line.6289"></a>
-<span class="sourceLineNo">6290</span>  // make sure region is success close when coprocessor wrong region open failed<a name="line.6290"></a>
-<span class="sourceLineNo">6291</span>  @Test<a name="line.6291"></a>
-<span class="sourceLineNo">6292</span>  public void testOpenRegionFailedMemoryLeak() throws Exception {<a name="line.6292"></a>
-<span class="sourceLineNo">6293</span>    final ServerName serverName = ServerName.valueOf("testOpenRegionFailed", 100, 42);<a name="line.6293"></a>
-<span class="sourceLineNo">6294</span>    final RegionServerServices rss = spy(TEST_UTIL.createMockRegionServerService(serverName));<a name="line.6294"></a>
-<span class="sourceLineNo">6295</span><a name="line.6295"></a>
-<span class="sourceLineNo">6296</span>    HTableDescriptor htd<a name="line.6296"></a>
-<span class="sourceLineNo">6297</span>      = new HTableDescriptor(TableName.valueOf("testOpenRegionFailed"));<a name="line.6297"></a>
-<span class="sourceLineNo">6298</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.6298"></a>
-<span class="sourceLineNo">6299</span>    htd.setValue("COPROCESSOR$1", "hdfs://test/test.jar|test||");<a name="line.6299"></a>
-<span class="sourceLineNo">6300</span><a name="line.6300"></a>
-<span class="sourceLineNo">6301</span>    HRegionInfo hri = new HRegionInfo(htd.getTableName(),<a name="line.6301"></a>
-<span class="sourceLineNo">6302</span>      HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY);<a name="line.6302"></a>
-<span class="sourceLineNo">6303</span>    ScheduledExecutorService executor = CompatibilitySingletonFactory.<a name="line.6303"></a>
-<span class="sourceLineNo">6304</span>      getInstance(MetricsExecutor.class).getExecutor();<a name="line.6304"></a>
-<span class="sourceLineNo">6305</span>    for (int i = 0; i &lt; 20 ; i++) {<a name="line.6305"></a>
-<span class="sourceLineNo">6306</span>      try {<a name="line.6306"></a>
-<span class="sourceLineNo">6307</span>        HRegion.openHRegion(hri, htd, rss.getWAL(hri),<a name="line.6307"></a>
-<span class="sourceLineNo">6308</span>          TEST_UTIL.getConfiguration(), rss, null);<a name="line.6308"></a>
-<span class="sourceLineNo">6309</span>      }catch(Throwable t){<a name="line.6309"></a>
-<span class="sourceLineNo">6310</span>        LOG.info("Expected exception, continue");<a name="line.6310"></a>
-<span class="sourceLineNo">6311</span>      }<a name="line.6311"></a>
-<span class="sourceLineNo">6312</span>    }<a name="line.6312"></a>
-<span class="sourceLineNo">6313</span>    TimeUnit.SECONDS.sleep(MetricsRegionWrapperImpl.PERIOD);<a name="line.6313"></a>
-<span class="sourceLineNo">6314</span>    Field[] fields = ThreadPoolExecutor.class.getDeclaredFields();<a name="line.6314"></a>
-<span class="sourceLineNo">6315</span>    boolean found = false;<a name="line.6315"></a>
-<span class="sourceLineNo">6316</span>    for(Field field : fields){<a name="line.6316"></a>
-<span class="sourceLineNo">6317</span>      if(field.getName().equals("workQueue")){<a name="line.6317"></a>
-<span class="sourceLineNo">6318</span>        field.setAccessible(true);<a name="line.6318"></a>
-<span class="sourceLineNo">6319</span>        BlockingQueue&lt;Runnable&gt; workQueue = (BlockingQueue&lt;Runnable&gt;)field.get(executor);<a name="line.6319"></a>
-<span class="sourceLineNo">6320</span>        //there are still two task not cancel, can not cause to memory lack<a name="line.6320"></a>
-<span class="sourceLineNo">6321</span>        Assert.assertTrue("ScheduledExecutor#workQueue should equals 2, now is " +<a name="line.6321"></a>
-<span class="sourceLineNo">6322</span>          workQueue.size() + ", please check region is close", 2 == workQueue.size());<a name="line.6322"></a>
-<span class="sourceLineNo">6323</span>        found = true;<a name="line.6323"></a>
-<span class="sourceLineNo">6324</span>      }<a name="line.6324"></a>
-<span class="sourceLineNo">6325</span>    }<a name="line.6325"></a>
-<span class="sourceLineNo">6326</span>    Assert.assertTrue("can not find workQueue, test failed", found);<a name="line.6326"></a>
-<span class="sourceLineNo">6327</span>  }<a name="line.6327"></a>
-<span class="sourceLineNo">6328</span><a name="line.6328"></a>
-<span class="sourceLineNo">6329</span>  /**<a name="line.6329"></a>
-<span class="sourceLineNo">6330</span>   * The same as HRegion class, the only difference is that instantiateHStore will<a name="line.6330"></a>
-<span class="sourceLineNo">6331</span>   * create a different HStore - HStoreForTesting. [HBASE-8518]<a name="line.6331"></a>
-<span class="sourceLineNo">6332</span>   */<a name="line.6332"></a>
-<span class="sourceLineNo">6333</span>  public static class HRegionForTesting extends HRegion {<a name="line.6333"></a>
-<span class="sourceLineNo">6334</span><a name="line.6334"></a>
-<span class="sourceLineNo">6335</span>    public HRegionForTesting(final Path tableDir, final WAL wal, final FileSystem fs,<a name="line.6335"></a>
-<span class="sourceLineNo">6336</span>                             final Configuration confParam, final RegionInfo regionInfo,<a name="line.6336"></a>
-<span class="sourceLineNo">6337</span>                             final TableDescriptor htd, final RegionServerServices rsServices) {<a name="line.6337"></a>
-<span class="sourceLineNo">6338</span>      this(new HRegionFileSystem(confParam, fs, tableDir, regionInfo),<a name="line.6338"></a>
-<span class="sourceLineNo">6339</span>          wal, confParam, htd, rsServices);<a name="line.6339"></a>
-<span class="sourceLineNo">6340</span>    }<a name="line.6340"></a>
-<span class="sourceLineNo">6341</span><a name="line.6341"></a>
-<span class="sourceLineNo">6342</span>    public HRegionForTesting(HRegionFileSystem fs, WAL wal,<a name="line.6342"></a>
-<span class="sourceLineNo">6343</span>                             Configuration confParam, TableDescriptor htd,<a name="line.6343"></a>
-<span class="sourceLineNo">6344</span>                             RegionServerServices rsServices) {<a name="line.6344"></a>
-<span class="sourceLineNo">6345</span>      super(fs, wal, confParam, htd, rsServices);<a name="line.6345"></a>
-<span class="sourceLineNo">6346</span>    }<a name="line.6346"></a>
-<span class="sourceLineNo">6347</span><a name="line.6347"></a>
-<span class="sourceLineNo">6348</span>    /**<a name="line.6348"></a>
-<span class="sourceLineNo">6349</span>     * Create HStore instance.<a name="line.6349"></a>
-<span class="sourceLineNo">6350</span>     * @return If Mob is enabled, return HMobStore, otherwise return HStoreForTesting.<a name="line.6350"></a>
-<span class="sourceLineNo">6351</span>     */<a name="line.6351"></a>
-<span class="sourceLineNo">6352</span>    @Override<a name="line.6352"></a>
-<span class="sourceLineNo">6353</span>    protected HStore instantiateHStore(final ColumnFamilyDescriptor family, boolean warmup)<a name="line.6353"></a>
-<span class="sourceLineNo">6354</span>        throws IOException {<a name="line.6354"></a>
-<span class="sourceLineNo">6355</span>      if (family.isMobEnabled()) {<a name="line.6355"></a>
-<span class="sourceLineNo">6356</span>        if (HFile.getFormatVersion(this.conf) &lt; HFile.MIN_FORMAT_VERSION_WITH_TAGS) {<a name="line.6356"></a>
-<span class="sourceLineNo">6357</span>          throw new IOException("A minimum HFile version of " + HFile.MIN_FORMAT_VERSION_WITH_TAGS +<a name="line.6357"></a>
-<span class="sourceLineNo">6358</span>              " is required for MOB feature. Consider setting " + HFile.FORMAT_VERSION_KEY +<a name="line.6358"></a>
-<span class="sourceLineNo">6359</span>              " accordingly.");<a name="line.6359"></a>
-<span class="sourceLineNo">6360</span>        }<a name="line.6360"></a>
-<span class="sourceLineNo">6361</span>        return new HMobStore(this, family, this.conf, warmup);<a name="line.6361"></a>
-<span class="sourceLineNo">6362</span>      }<a name="line.6362"></a>
-<span class="sourceLineNo">6363</span>      return new HStoreForTesting(this, family, this.conf, warmup);<a name="line.6363"></a>
-<span class="sourceLineNo">6364</span>    }<a name="line.6364"></a>
-<span class="sourceLineNo">6365</span>  }<a name="line.6365"></a>
-<span class="sourceLineNo">6366</span><a name="line.6366"></a>
-<span class="sourceLineNo">6367</span>  /**<a name="line.6367"></a>
-<span class="sourceLineNo">6368</span>   * HStoreForTesting is merely the same as HStore, the difference is in the doCompaction method<a name="line.6368"></a>
-<span class="sourceLineNo">6369</span>   * of HStoreForTesting there is a checkpoint "hbase.hstore.compaction.complete" which<a name="line.6369"></a>
-<span class="sourceLineNo">6370</span>   * doesn't let hstore compaction complete. In the former edition, this config is set in<a name="line.6370"></a>
-<span class="sourceLineNo">6371</span>   * HStore class inside compact method, though this is just for testing, otherwise it<a name="line.6371"></a>
-<span class="sourceLineNo">6372</span>   * doesn't do any help. In HBASE-8518, we try to get rid of all "hbase.hstore.compaction.complete"<a name="line.6372"></a>
-<span class="sourceLineNo">6373</span>   * config (except for testing code).<a name="line.6373"></a>
-<span class="sourceLineNo">6374</span>   */<a name="line.6374"></a>
-<span class="sourceLineNo">6375</span>  public static class HStoreForTesting extends HStore {<a name="line.6375"></a>
+<span class="sourceLineNo">6246</span>    } finally {<a name="line.6246"></a>
+<span class="sourceLineNo">6247</span>      try {<a name="line.6247"></a>
+<span class="sourceLineNo">6248</span>        HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.6248"></a>
+<span class="sourceLineNo">6249</span>        CONF.setInt("hbase.regionserver.wal.disruptor.event.count", 16 * 1024);<a name="line.6249"></a>
+<span class="sourceLineNo">6250</span>      } catch (DroppedSnapshotException dse) {<a name="line.6250"></a>
+<span class="sourceLineNo">6251</span>        // We could get this on way out because we interrupt the background flusher and it could<a name="line.6251"></a>
+<span class="sourceLineNo">6252</span>        // fail anywhere causing a DSE over in the background flusher... only it is not properly<a name="line.6252"></a>
+<span class="sourceLineNo">6253</span>        // dealt with so could still be memory hanging out when we get to here -- memory we can't<a name="line.6253"></a>
+<span class="sourceLineNo">6254</span>        // flush because the accounting is 'off' since original DSE.<a name="line.6254"></a>
+<span class="sourceLineNo">6255</span>      }<a name="line.6255"></a>
+<span class="sourceLineNo">6256</span>      this.region = null;<a name="line.6256"></a>
+<span class="sourceLineNo">6257</span>    }<a name="line.6257"></a>
+<span class="sourceLineNo">6258</span>  }<a name="line.6258"></a>
+<span class="sourceLineNo">6259</span><a name="line.6259"></a>
+<span class="sourceLineNo">6260</span>  @Test<a name="line.6260"></a>
+<span class="sourceLineNo">6261</span>  public void testMutateRow_WriteRequestCount() throws Exception {<a name="line.6261"></a>
+<span class="sourceLineNo">6262</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.6262"></a>
+<span class="sourceLineNo">6263</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.6263"></a>
+<span class="sourceLineNo">6264</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.6264"></a>
+<span class="sourceLineNo">6265</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.6265"></a>
+<span class="sourceLineNo">6266</span><a name="line.6266"></a>
+<span class="sourceLineNo">6267</span>    RowMutations rm = new RowMutations(row1);<a name="line.6267"></a>
+<span class="sourceLineNo">6268</span>    Put put = new Put(row1);<a name="line.6268"></a>
+<span class="sourceLineNo">6269</span>    put.addColumn(fam1, qf1, val1);<a name="line.6269"></a>
+<span class="sourceLineNo">6270</span>    rm.add(put);<a name="line.6270"></a>
+<span class="sourceLineNo">6271</span><a name="line.6271"></a>
+<span class="sourceLineNo">6272</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.6272"></a>
+<span class="sourceLineNo">6273</span>    long wrcBeforeMutate = this.region.writeRequestsCount.longValue();<a name="line.6273"></a>
+<span class="sourceLineNo">6274</span>    this.region.mutateRow(rm);<a name="line.6274"></a>
+<span class="sourceLineNo">6275</span>    long wrcAfterMutate = this.region.writeRequestsCount.longValue();<a name="line.6275"></a>
+<span class="sourceLineNo">6276</span>    Assert.assertEquals(wrcBeforeMutate + rm.getMutations().size(), wrcAfterMutate);<a name="line.6276"></a>
+<span class="sourceLineNo">6277</span>  }<a name="line.6277"></a>
+<span class="sourceLineNo">6278</span><a name="line.6278"></a>
+<span class="sourceLineNo">6279</span>  @Test<a name="line.6279"></a>
+<span class="sourceLineNo">6280</span>  public void testBulkLoadReplicationEnabled() throws IOException {<a name="line.6280"></a>
+<span class="sourceLineNo">6281</span>    TEST_UTIL.getConfiguration().setBoolean(HConstants.REPLICATION_BULKLOAD_ENABLE_KEY, true);<a name="line.6281"></a>
+<span class="sourceLineNo">6282</span>    final ServerName serverName = ServerName.valueOf(name.getMethodName(), 100, 42);<a name="line.6282"></a>
+<span class="sourceLineNo">6283</span>    final RegionServerServices rss = spy(TEST_UTIL.createMockRegionServerService(serverName));<a name="line.6283"></a>
+<span class="sourceLineNo">6284</span><a name="line.6284"></a>
+<span class="sourceLineNo">6285</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.6285"></a>
+<span class="sourceLineNo">6286</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.6286"></a>
+<span class="sourceLineNo">6287</span>    HRegionInfo hri = new HRegionInfo(htd.getTableName(),<a name="line.6287"></a>
+<span class="sourceLineNo">6288</span>        HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY);<a name="line.6288"></a>
+<span class="sourceLineNo">6289</span>    region = HRegion.openHRegion(hri, htd, rss.getWAL(hri), TEST_UTIL.getConfiguration(),<a name="line.6289"></a>
+<span class="sourceLineNo">6290</span>        rss, null);<a name="line.6290"></a>
+<span class="sourceLineNo">6291</span><a name="line.6291"></a>
+<span class="sourceLineNo">6292</span>    assertTrue(region.conf.getBoolean(HConstants.REPLICATION_BULKLOAD_ENABLE_KEY, false));<a name="line.6292"></a>
+<span class="sourceLineNo">6293</span>    String plugins = region.conf.get(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY, "");<a name="line.6293"></a>
+<span class="sourceLineNo">6294</span>    String replicationCoprocessorClass = ReplicationObserver.class.getCanonicalName();<a name="line.6294"></a>
+<span class="sourceLineNo">6295</span>    assertTrue(plugins.contains(replicationCoprocessorClass));<a name="line.6295"></a>
+<span class="sourceLineNo">6296</span>    assertTrue(region.getCoprocessorHost().<a name="line.6296"></a>
+<span class="sourceLineNo">6297</span>        getCoprocessors().contains(ReplicationObserver.class.getSimpleName()));<a name="line.6297"></a>
+<span class="sourceLineNo">6298</span>  }<a name="line.6298"></a>
+<span class="sourceLineNo">6299</span><a name="line.6299"></a>
+<span class="sourceLineNo">6300</span>  // make sure region is success close when coprocessor wrong region open failed<a name="line.6300"></a>
+<span class="sourceLineNo">6301</span>  @Test<a name="line.6301"></a>
+<span class="sourceLineNo">6302</span>  public void testOpenRegionFailedMemoryLeak() throws Exception {<a name="line.6302"></a>
+<span class="sourceLineNo">6303</span>    final ServerName serverName = ServerName.valueOf("testOpenRegionFailed", 100, 42);<a name="line.6303"></a>
+<span class="sourceLineNo">6304</span>    final RegionServerServices rss = spy(TEST_UTIL.createMockRegionServerService(serverName));<a name="line.6304"></a>
+<span class="sourceLineNo">6305</span><a name="line.6305"></a>
+<span class="sourceLineNo">6306</span>    HTableDescriptor htd<a name="line.6306"></a>
+<span class="sourceLineNo">6307</span>      = new HTableDescriptor(TableName.valueOf("testOpenRegionFailed"));<a name="line.6307"></a>
+<span class="sourceLineNo">6308</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.6308"></a>
+<span class="sourceLineNo">6309</span>    htd.setValue("COPROCESSOR$1", "hdfs://test/test.jar|test||");<a name="line.6309"></a>
+<span class="sourceLineNo">6310</span><a name="line.6310"></a>
+<span class="sourceLineNo">6311</span>    HRegionInfo hri = new HRegionInfo(htd.getTableName(),<a name="line.6311"></a>
+<span class="sourceLineNo">6312</span>      HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY);<a name="line.6312"></a>
+<span class="sourceLineNo">6313</span>    ScheduledExecutorService executor = CompatibilitySingletonFactory.<a name="line.6313"></a>
+<span class="sourceLineNo">6314</span>      getInstance(MetricsExecutor.class).getExecutor();<a name="line.6314"></a>
+<span class="sourceLineNo">6315</span>    for (int i = 0; i &lt; 20 ; i++) {<a name="line.6315"></a>
+<span class="sourceLineNo">6316</span>      try {<a name="line.6316"></a>
+<span class="sourceLineNo">6317</span>        HRegion.openHRegion(hri, htd, rss.getWAL(hri),<a name="line.6317"></a>
+<span class="sourceLineNo">6318</span>          TEST_UTIL.getConfiguration(), rss, null);<a name="line.6318"></a>
+<span class="sourceLineNo">6319</span>      }catch(Throwable t){<a name="line.6319"></a>
+<span class="sourceLineNo">6320</span>        LOG.info("Expected exception, continue");<a name="line.6320"></a>
+<span class="sourceLineNo">6321</span>      }<a name="line.6321"></a>
+<span class="sourceLineNo">6322</span>    }<a name="line.6322"></a>
+<span class="sourceLineNo">6323</span>    TimeUnit.SECONDS.sleep(MetricsRegionWrapperImpl.PERIOD);<a name="line.6323"></a>
+<span class="sourceLineNo">6324</span>    Field[] fields = ThreadPoolExecutor.class.getDeclaredFields();<a name="line.6324"></a>
+<span class="sourceLineNo">6325</span>    boolean found = false;<a name="line.6325"></a>
+<span class="sourceLineNo">6326</span>    for(Field field : fields){<a name="line.6326"></a>
+<span class="sourceLineNo">6327</span>      if(field.getName().equals("workQueue")){<a name="line.6327"></a>
+<span class="sourceLineNo">6328</span>        field.setAccessible(true);<a name="line.6328"></a>
+<span class="sourceLineNo">6329</span>        BlockingQueue&lt;Runnable&gt; workQueue = (BlockingQueue&lt;Runnable&gt;)field.get(executor);<a name="line.6329"></a>
+<span class="sourceLineNo">6330</span>        //there are still two task not cancel, can not cause to memory lack<a name="line.6330"></a>
+<span class="sourceLineNo">6331</span>        Assert.assertTrue("ScheduledExecutor#workQueue should equals 2, now is " +<a name="line.6331"></a>
+<span class="sourceLineNo">6332</span>          workQueue.size() + ", please check region is close", 2 == workQueue.size());<a name="line.6332"></a>
+<span class="sourceLineNo">6333</span>        found = true;<a name="line.6333"></a>
+<span class="sourceLineNo">6334</span>      }<a name="line.6334"></a>
+<span class="sourceLineNo">6335</span>    }<a name="line.6335"></a>
+<span class="sourceLineNo">6336</span>    Assert.assertTrue("can not find workQueue, test failed", found);<a name="line.6336"></a>
+<span class="sourceLineNo">6337</span>  }<a name="line.6337"></a>
+<span class="sourceLineNo">6338</span><a name="line.6338"></a>
+<span class="sourceLineNo">6339</span>  /**<a name="line.6339"></a>
+<span class="sourceLineNo">6340</span>   * The same as HRegion class, the only difference is that instantiateHStore will<a name="line.6340"></a>
+<span class="sourceLineNo">6341</span>   * create a different HStore - HStoreForTesting. [HBASE-8518]<a name="line.6341"></a>
+<span class="sourceLineNo">6342</span>   */<a name="line.6342"></a>
+<span class="sourceLineNo">6343</span>  public static class HRegionForTesting extends HRegion {<a name="line.6343"></a>
+<span class="sourceLineNo">6344</span><a name="line.6344"></a>
+<span class="sourceLineNo">6345</span>    public HRegionForTesting(final Path tableDir, final WAL wal, final FileSystem fs,<a name="line.6345"></a>
+<span class="sourceLineNo">6346</span>                             final Configuration confParam, final RegionInfo regionInfo,<a name="line.6346"></a>
+<span class="sourceLineNo">6347</span>                             final TableDescriptor htd, final RegionServerServices rsServices) {<a name="line.6347"></a>
+<span class="sourceLineNo">6348</span>      this(new HRegionFileSystem(confParam, fs, tableDir, regionInfo),<a name="line.6348"></a>
+<span class="sourceLineNo">6349</span>          wal, confParam, htd, rsServices);<a name="line.6349"></a>
+<span class="sourceLineNo">6350</span>    }<a name="line.6350"></a>
+<span class="sourceLineNo">6351</span><a name="line.6351"></a>
+<span class="sourceLineNo">6352</span>    public HRegionForTesting(HRegionFileSystem fs, WAL wal,<a name="line.6352"></a>
+<span class="sourceLineNo">6353</span>                             Configuration confParam, TableDescriptor htd,<a name="line.6353"></a>
+<span class="sourceLineNo">6354</span>                             RegionServerServices rsServices) {<a name="line.6354"></a>
+<span class="sourceLineNo">6355</span>      super(fs, wal, confParam, htd, rsServices);<a name="line.6355"></a>
+<span class="sourceLineNo">6356</span>    }<a name="line.6356"></a>
+<span class="sourceLineNo">6357</span><a name="line.6357"></a>
+<span class="sourceLineNo">6358</span>    /**<a name="line.6358"></a>
+<span class="sourceLineNo">6359</span>     * Create HStore instance.<a name="line.6359"></a>
+<span class="sourceLineNo">6360</span>     * @return If Mob is enabled, return HMobStore, otherwise return HStoreForTesting.<a name="line.6360"></a>
+<span class="sourceLineNo">6361</span>     */<a name="line.6361"></a>
+<span class="sourceLineNo">6362</span>    @Override<a name="line.6362"></a>
+<span class="sourceLineNo">6363</span>    protected HStore instantiateHStore(final ColumnFamilyDescriptor family, boolean warmup)<a name="line.6363"></a>
+<span class="sourceLineNo">6364</span>        throws IOException {<a name="line.6364"></a>
+<span class="sourceLineNo">6365</span>      if (family.isMobEnabled()) {<a name="line.6365"></a>
+<span class="sourceLineNo">6366</span>        if (HFile.getFormatVersion(this.conf) &lt; HFile.MIN_FORMAT_VERSION_WITH_TAGS) {<a name="line.6366"></a>
+<span class="sourceLineNo">6367</span>          throw new IOException("A minimum HFile version of " + HFile.MIN_FORMAT_VERSION_WITH_TAGS +<a name="line.6367"></a>
+<span class="sourceLineNo">6368</span>              " is required for MOB feature. Consider setting " + HFile.FORMAT_VERSION_KEY +<a name="line.6368"></a>
+<span class="sourceLineNo">6369</span>              " accordingly.");<a name="line.6369"></a>
+<span class="sourceLineNo">6370</span>        }<a name="line.6370"></a>
+<span class="sourceLineNo">6371</span>        return new HMobStore(this, family, this.conf, warmup);<a name="line.6371"></a>
+<span class="sourceLineNo">6372</span>      }<a name="line.6372"></a>
+<span class="sourceLineNo">6373</span>      return new HStoreForTesting(this, family, this.conf, warmup);<a name="line.6373"></a>
+<span class="sourceLineNo">6374</span>    }<a name="line.6374"></a>
+<span class="sourceLineNo">6375</span>  }<a name="line.6375"></a>
 <span class="sourceLineNo">6376</span><a name="line.6376"></a>
-<span class="sourceLineNo">6377</span>    protected HStoreForTesting(final HRegion region,<a name="line.6377"></a>
-<span class="sourceLineNo">6378</span>        final ColumnFamilyDescriptor family,<a name="line.6378"></a>
-<span class="sourceLineNo">6379</span>        final Configuration confParam, boolean warmup) throws IOException {<a name="line.6379"></a>
-<span class="sourceLineNo">6380</span>      super(region, family, confParam, warmup);<a name="line.6380"></a>
-<span class="sourceLineNo">6381</span>    }<a name="line.6381"></a>
-<span class="sourceLineNo">6382</span><a name="line.6382"></a>
-<span class="sourceLineNo">6383</span>    @Override<a name="line.6383"></a>
-<span class="sourceLineNo">6384</span>    protected List&lt;HStoreFile&gt; doCompaction(CompactionRequestImpl cr,<a name="line.6384"></a>
-<span class="sourceLineNo">6385</span>        Collection&lt;HStoreFile&gt; filesToCompact, User user, long compactionStartTime,<a name="line.6385"></a>
-<span class="sourceLineNo">6386</span>        List&lt;Path&gt; newFiles) throws IOException {<a name="line.6386"></a>
-<span class="sourceLineNo">6387</span>      // let compaction incomplete.<a name="line.6387"></a>
-<span class="sourceLineNo">6388</span>      if (!this.conf.getBoolean("hbase.hstore.compaction.complete", true)) {<a name="line.6388"></a>
-<span class="sourceLineNo">6389</span>        LOG.warn("hbase.hstore.compaction.complete is set to false");<a name="line.6389"></a>
-<span class="sourceLineNo">6390</span>        List&lt;HStoreFile&gt; sfs = new ArrayList&lt;&gt;(newFiles.size());<a name="line.6390"></a>
-<span class="sourceLineNo">6391</span>        final boolean evictOnClose =<a name="line.6391"></a>
-<span class="sourceLineNo">6392</span>            cacheConf != null? cacheConf.shouldEvictOnClose(): true;<a name="line.6392"></a>
-<span class="sourceLineNo">6393</span>        for (Path newFile : newFiles) {<a name="line.6393"></a>
-<span class="sourceLineNo">6394</span>          // Create storefile around what we wrote with a reader on it.<a name="line.6394"></a>
-<span class="sourceLineNo">6395</span>          HStoreFile sf = createStoreFileAndReader(newFile);<a name="line.6395"></a>
-<span class="sourceLineNo">6396</span>          sf.closeStoreFile(evictOnClose);<a name="line.6396"></a>
-<span class="sourceLineNo">6397</span>          sfs.add(sf);<a name="line.6397"></a>
-<span class="sourceLineNo">6398</span>        }<a name="line.6398"></a>
-<span class="sourceLineNo">6399</span>        return sfs;<a name="line.6399"></a>
-<span class="sourceLineNo">6400</span>      }<a name="line.6400"></a>
-<span class="sourceLineNo">6401</span>      return super.doCompaction(cr, filesToCompact, user, compactionStartTime, newFiles);<a name="line.6401"></a>
-<span class="sourceLineNo">6402</span>    }<a name="line.6402"></a>
-<span class="sourceLineNo">6403</span>  }<a name="line.6403"></a>
-<span class="sourceLineNo">6404</span>}<a name="line.6404"></a>
+<span class="sourceLineNo">6377</span>  /**<a name="line.6377"></a>
+<span class="sourceLineNo">6378</span>   * HStoreForTesting is merely the same as HStore, the difference is in the doCompaction method<a name="line.6378"></a>
+<span class="sourceLineNo">6379</span>   * of HStoreForTesting there is a checkpoint "hbase.hstore.compaction.complete" which<a name="line.6379"></a>
+<span class="sourceLineNo">6380</span>   * doesn't let hstore compaction complete. In the former edition, this config is set in<a name="line.6380"></a>
+<span class="sourceLineNo">6381</span>   * HStore class inside compact method, though this is just for testing, otherwise it<a name="line.6381"></a>
+<span class="sourceLineNo">6382</span>   * doesn't do any help. In HBASE-8518, we try to get rid of all "hbase.hstore.compaction.complete"<a name="line.6382"></a>
+<span class="sourceLineNo">6383</span>   * config (except for testing code).<a name="line.6383"></a>
+<span class="sourceLineNo">6384</span>   */<a name="line.6384"></a>
+<span class="sourceLineNo">6385</span>  public static class HStoreForTesting extends HStore {<a name="line.6385"></a>
+<span class="sourceLineNo">6386</span><a name="line.6386"></a>
+<span class="sourceLineNo">6387</span>    protected HStoreForTesting(final HRegion region,<a name="line.6387"></a>
+<span class="sourceLineNo">6388</span>        final ColumnFamilyDescriptor family,<a name="line.6388"></a>
+<span class="sourceLineNo">6389</span>        final Configuration confParam, boolean warmup) throws IOException {<a name="line.6389"></a>
+<span class="sourceLineNo">6390</span>      super(region, family, confParam, warmup);<a name="line.6390"></a>
+<span class="sourceLineNo">6391</span>    }<a name="line.6391"></a>
+<span class="sourceLineNo">6392</span><a name="line.6392"></a>
+<span class="sourceLineNo">6393</span>    @Override<a name="line.6393"></a>
+<span class="sourceLineNo">6394</span>    protected List&lt;HStoreFile&gt; doCompaction(CompactionRequestImpl cr,<a name="line.6394"></a>
+<span class="sourceLineNo">6395</span>        Collection&lt;HStoreFile&gt; filesToCompact, User user, long compactionStartTime,<a name="line.6395"></a>
+<span class="sourceLineNo">6396</span>        List&lt;Path&gt; newFiles) throws IOException {<a name="line.6396"></a>
+<span class="sourceLineNo">6397</span>      // let compaction incomplete.<a name="line.6397"></a>
+<span class="sourceLineNo">6398</span>      if (!this.conf.getBoolean("hbase.hstore.compaction.complete", true)) {<a name="line.6398"></a>
+<span class="sourceLineNo">6399</span>        LOG.warn("hbase.hstore.compaction.complete is set to false");<a name="line.6399"></a>
+<span class="sourceLineNo">6400</span>        List&lt;HStoreFile&gt; sfs = new ArrayList&lt;&gt;(newFiles.size());<a name="line.6400"></a>
+<span class="sourceLineNo">6401</span>        final boolean evictOnClose =<a name="line.6401"></a>
+<span class="sourceLineNo">6402</span>            cacheConf != null? cacheConf.shouldEvictOnClose(): true;<a name="line.6402"></a>
+<span class="sourceLineNo">6403</span>        for (Path newFile : newFiles) {<a name="line.6403"></a>
+<span class="sourceLineNo">6404</span>          // Create storefile around what we wrote with a reader on it.<a name="line.6404"></a>
+<span class="sourceLineNo">6405</span>          HStoreFile sf = createStoreFileAndReader(newFile);<a name="line.6405"></a>
+<span class="sourceLineNo">6406</span>          sf.closeStoreFile(evictOnClose);<a name="line.6406"></a>
+<span class="sourceLineNo">6407</span>          sfs.add(sf);<a name="line.6407"></a>
+<span class="sourceLineNo">6408</span>        }<a name="line.6408"></a>
+<span class="sourceLineNo">6409</span>        return sfs;<a name="line.6409"></a>
+<span class="sourceLineNo">6410</span>      }<a name="line.6410"></a>
+<span class="sourceLineNo">6411</span>      return super.doCompaction(cr, filesToCompact, user, compactionStartTime, newFiles);<a name="line.6411"></a>
+<span class="sourceLineNo">6412</span>    }<a name="line.6412"></a>
+<span class="sourceLineNo">6413</span>  }<a name="line.6413"></a>
+<span class="sourceLineNo">6414</span>}<a name="line.6414"></a>
 
 
 
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionForTesting.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionForTesting.html
index ddde350..77be719 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionForTesting.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionForTesting.html
@@ -112,68 +112,68 @@
 <span class="sourceLineNo">104</span>import org.apache.hadoop.hbase.Waiter;<a name="line.104"></a>
 <span class="sourceLineNo">105</span>import org.apache.hadoop.hbase.client.Append;<a name="line.105"></a>
 <span class="sourceLineNo">106</span>import org.apache.hadoop.hbase.client.ColumnFamilyDescriptor;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.apache.hadoop.hbase.client.Get;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.110"></a>
-<span class="sourceLineNo">111</span>import org.apache.hadoop.hbase.client.Mutation;<a name="line.111"></a>
-<span class="sourceLineNo">112</span>import org.apache.hadoop.hbase.client.Put;<a name="line.112"></a>
-<span class="sourceLineNo">113</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.113"></a>
-<span class="sourceLineNo">114</span>import org.apache.hadoop.hbase.client.RegionInfoBuilder;<a name="line.114"></a>
-<span class="sourceLineNo">115</span>import org.apache.hadoop.hbase.client.Result;<a name="line.115"></a>
-<span class="sourceLineNo">116</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.116"></a>
-<span class="sourceLineNo">117</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.117"></a>
-<span class="sourceLineNo">118</span>import org.apache.hadoop.hbase.client.Table;<a name="line.118"></a>
-<span class="sourceLineNo">119</span>import org.apache.hadoop.hbase.client.TableDescriptor;<a name="line.119"></a>
-<span class="sourceLineNo">120</span>import org.apache.hadoop.hbase.coprocessor.CoprocessorHost;<a name="line.120"></a>
-<span class="sourceLineNo">121</span>import org.apache.hadoop.hbase.exceptions.FailedSanityCheckException;<a name="line.121"></a>
-<span class="sourceLineNo">122</span>import org.apache.hadoop.hbase.filter.BigDecimalComparator;<a name="line.122"></a>
-<span class="sourceLineNo">123</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.123"></a>
-<span class="sourceLineNo">124</span>import org.apache.hadoop.hbase.filter.ColumnCountGetFilter;<a name="line.124"></a>
-<span class="sourceLineNo">125</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.125"></a>
-<span class="sourceLineNo">126</span>import org.apache.hadoop.hbase.filter.FilterBase;<a name="line.126"></a>
-<span class="sourceLineNo">127</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.127"></a>
-<span class="sourceLineNo">128</span>import org.apache.hadoop.hbase.filter.NullComparator;<a name="line.128"></a>
-<span class="sourceLineNo">129</span>import org.apache.hadoop.hbase.filter.PrefixFilter;<a name="line.129"></a>
-<span class="sourceLineNo">130</span>import org.apache.hadoop.hbase.filter.SingleColumnValueExcludeFilter;<a name="line.130"></a>
-<span class="sourceLineNo">131</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.131"></a>
-<span class="sourceLineNo">132</span>import org.apache.hadoop.hbase.filter.SubstringComparator;<a name="line.132"></a>
-<span class="sourceLineNo">133</span>import org.apache.hadoop.hbase.filter.ValueFilter;<a name="line.133"></a>
-<span class="sourceLineNo">134</span>import org.apache.hadoop.hbase.io.hfile.HFile;<a name="line.134"></a>
-<span class="sourceLineNo">135</span>import org.apache.hadoop.hbase.monitoring.MonitoredRPCHandler;<a name="line.135"></a>
-<span class="sourceLineNo">136</span>import org.apache.hadoop.hbase.monitoring.MonitoredTask;<a name="line.136"></a>
-<span class="sourceLineNo">137</span>import org.apache.hadoop.hbase.monitoring.TaskMonitor;<a name="line.137"></a>
-<span class="sourceLineNo">138</span>import org.apache.hadoop.hbase.regionserver.HRegion.MutationBatchOperation;<a name="line.138"></a>
-<span class="sourceLineNo">139</span>import org.apache.hadoop.hbase.regionserver.HRegion.RegionScannerImpl;<a name="line.139"></a>
-<span class="sourceLineNo">140</span>import org.apache.hadoop.hbase.regionserver.Region.RowLock;<a name="line.140"></a>
-<span class="sourceLineNo">141</span>import org.apache.hadoop.hbase.regionserver.TestHStore.FaultyFileSystem;<a name="line.141"></a>
-<span class="sourceLineNo">142</span>import org.apache.hadoop.hbase.regionserver.compactions.CompactionRequestImpl;<a name="line.142"></a>
-<span class="sourceLineNo">143</span>import org.apache.hadoop.hbase.regionserver.wal.FSHLog;<a name="line.143"></a>
-<span class="sourceLineNo">144</span>import org.apache.hadoop.hbase.regionserver.wal.MetricsWALSource;<a name="line.144"></a>
-<span class="sourceLineNo">145</span>import org.apache.hadoop.hbase.regionserver.wal.WALUtil;<a name="line.145"></a>
-<span class="sourceLineNo">146</span>import org.apache.hadoop.hbase.replication.regionserver.ReplicationObserver;<a name="line.146"></a>
-<span class="sourceLineNo">147</span>import org.apache.hadoop.hbase.security.User;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>import org.apache.hadoop.hbase.test.MetricsAssertHelper;<a name="line.148"></a>
-<span class="sourceLineNo">149</span>import org.apache.hadoop.hbase.testclassification.LargeTests;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>import org.apache.hadoop.hbase.testclassification.VerySlowRegionServerTests;<a name="line.150"></a>
-<span class="sourceLineNo">151</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.151"></a>
-<span class="sourceLineNo">152</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.152"></a>
-<span class="sourceLineNo">153</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManagerTestHelper;<a name="line.153"></a>
-<span class="sourceLineNo">154</span>import org.apache.hadoop.hbase.util.FSUtils;<a name="line.154"></a>
-<span class="sourceLineNo">155</span>import org.apache.hadoop.hbase.util.IncrementingEnvironmentEdge;<a name="line.155"></a>
-<span class="sourceLineNo">156</span>import org.apache.hadoop.hbase.util.ManualEnvironmentEdge;<a name="line.156"></a>
-<span class="sourceLineNo">157</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.157"></a>
-<span class="sourceLineNo">158</span>import org.apache.hadoop.hbase.wal.AbstractFSWALProvider;<a name="line.158"></a>
-<span class="sourceLineNo">159</span>import org.apache.hadoop.hbase.wal.FaultyFSLog;<a name="line.159"></a>
-<span class="sourceLineNo">160</span>import org.apache.hadoop.hbase.wal.NettyAsyncFSWALConfigHelper;<a name="line.160"></a>
-<span class="sourceLineNo">161</span>import org.apache.hadoop.hbase.wal.WAL;<a name="line.161"></a>
-<span class="sourceLineNo">162</span>import org.apache.hadoop.hbase.wal.WALEdit;<a name="line.162"></a>
-<span class="sourceLineNo">163</span>import org.apache.hadoop.hbase.wal.WALFactory;<a name="line.163"></a>
-<span class="sourceLineNo">164</span>import org.apache.hadoop.hbase.wal.WALKeyImpl;<a name="line.164"></a>
-<span class="sourceLineNo">165</span>import org.apache.hadoop.hbase.wal.WALProvider;<a name="line.165"></a>
-<span class="sourceLineNo">166</span>import org.apache.hadoop.hbase.wal.WALProvider.Writer;<a name="line.166"></a>
-<span class="sourceLineNo">167</span>import org.apache.hadoop.hbase.wal.WALSplitUtil;<a name="line.167"></a>
-<span class="sourceLineNo">168</span>import org.apache.hadoop.hbase.wal.WALSplitter;<a name="line.168"></a>
+<span class="sourceLineNo">107</span>import org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>import org.apache.hadoop.hbase.client.Get;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.111"></a>
+<span class="sourceLineNo">112</span>import org.apache.hadoop.hbase.client.Mutation;<a name="line.112"></a>
+<span class="sourceLineNo">113</span>import org.apache.hadoop.hbase.client.Put;<a name="line.113"></a>
+<span class="sourceLineNo">114</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.114"></a>
+<span class="sourceLineNo">115</span>import org.apache.hadoop.hbase.client.RegionInfoBuilder;<a name="line.115"></a>
+<span class="sourceLineNo">116</span>import org.apache.hadoop.hbase.client.Result;<a name="line.116"></a>
+<span class="sourceLineNo">117</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.117"></a>
+<span class="sourceLineNo">118</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.118"></a>
+<span class="sourceLineNo">119</span>import org.apache.hadoop.hbase.client.Table;<a name="line.119"></a>
+<span class="sourceLineNo">120</span>import org.apache.hadoop.hbase.client.TableDescriptor;<a name="line.120"></a>
+<span class="sourceLineNo">121</span>import org.apache.hadoop.hbase.coprocessor.CoprocessorHost;<a name="line.121"></a>
+<span class="sourceLineNo">122</span>import org.apache.hadoop.hbase.exceptions.FailedSanityCheckException;<a name="line.122"></a>
+<span class="sourceLineNo">123</span>import org.apache.hadoop.hbase.filter.BigDecimalComparator;<a name="line.123"></a>
+<span class="sourceLineNo">124</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.124"></a>
+<span class="sourceLineNo">125</span>import org.apache.hadoop.hbase.filter.ColumnCountGetFilter;<a name="line.125"></a>
+<span class="sourceLineNo">126</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.126"></a>
+<span class="sourceLineNo">127</span>import org.apache.hadoop.hbase.filter.FilterBase;<a name="line.127"></a>
+<span class="sourceLineNo">128</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.128"></a>
+<span class="sourceLineNo">129</span>import org.apache.hadoop.hbase.filter.NullComparator;<a name="line.129"></a>
+<span class="sourceLineNo">130</span>import org.apache.hadoop.hbase.filter.PrefixFilter;<a name="line.130"></a>
+<span class="sourceLineNo">131</span>import org.apache.hadoop.hbase.filter.SingleColumnValueExcludeFilter;<a name="line.131"></a>
+<span class="sourceLineNo">132</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.132"></a>
+<span class="sourceLineNo">133</span>import org.apache.hadoop.hbase.filter.SubstringComparator;<a name="line.133"></a>
+<span class="sourceLineNo">134</span>import org.apache.hadoop.hbase.filter.ValueFilter;<a name="line.134"></a>
+<span class="sourceLineNo">135</span>import org.apache.hadoop.hbase.io.hfile.HFile;<a name="line.135"></a>
+<span class="sourceLineNo">136</span>import org.apache.hadoop.hbase.monitoring.MonitoredRPCHandler;<a name="line.136"></a>
+<span class="sourceLineNo">137</span>import org.apache.hadoop.hbase.monitoring.MonitoredTask;<a name="line.137"></a>
+<span class="sourceLineNo">138</span>import org.apache.hadoop.hbase.monitoring.TaskMonitor;<a name="line.138"></a>
+<span class="sourceLineNo">139</span>import org.apache.hadoop.hbase.regionserver.HRegion.MutationBatchOperation;<a name="line.139"></a>
+<span class="sourceLineNo">140</span>import org.apache.hadoop.hbase.regionserver.HRegion.RegionScannerImpl;<a name="line.140"></a>
+<span class="sourceLineNo">141</span>import org.apache.hadoop.hbase.regionserver.Region.RowLock;<a name="line.141"></a>
+<span class="sourceLineNo">142</span>import org.apache.hadoop.hbase.regionserver.TestHStore.FaultyFileSystem;<a name="line.142"></a>
+<span class="sourceLineNo">143</span>import org.apache.hadoop.hbase.regionserver.compactions.CompactionRequestImpl;<a name="line.143"></a>
+<span class="sourceLineNo">144</span>import org.apache.hadoop.hbase.regionserver.wal.FSHLog;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>import org.apache.hadoop.hbase.regionserver.wal.MetricsWALSource;<a name="line.145"></a>
+<span class="sourceLineNo">146</span>import org.apache.hadoop.hbase.regionserver.wal.WALUtil;<a name="line.146"></a>
+<span class="sourceLineNo">147</span>import org.apache.hadoop.hbase.replication.regionserver.ReplicationObserver;<a name="line.147"></a>
+<span class="sourceLineNo">148</span>import org.apache.hadoop.hbase.security.User;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>import org.apache.hadoop.hbase.test.MetricsAssertHelper;<a name="line.149"></a>
+<span class="sourceLineNo">150</span>import org.apache.hadoop.hbase.testclassification.LargeTests;<a name="line.150"></a>
+<span class="sourceLineNo">151</span>import org.apache.hadoop.hbase.testclassification.VerySlowRegionServerTests;<a name="line.151"></a>
+<span class="sourceLineNo">152</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.152"></a>
+<span class="sourceLineNo">153</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.153"></a>
+<span class="sourceLineNo">154</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManagerTestHelper;<a name="line.154"></a>
+<span class="sourceLineNo">155</span>import org.apache.hadoop.hbase.util.FSUtils;<a name="line.155"></a>
+<span class="sourceLineNo">156</span>import org.apache.hadoop.hbase.util.IncrementingEnvironmentEdge;<a name="line.156"></a>
+<span class="sourceLineNo">157</span>import org.apache.hadoop.hbase.util.ManualEnvironmentEdge;<a name="line.157"></a>
+<span class="sourceLineNo">158</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.158"></a>
+<span class="sourceLineNo">159</span>import org.apache.hadoop.hbase.wal.AbstractFSWALProvider;<a name="line.159"></a>
+<span class="sourceLineNo">160</span>import org.apache.hadoop.hbase.wal.FaultyFSLog;<a name="line.160"></a>
+<span class="sourceLineNo">161</span>import org.apache.hadoop.hbase.wal.NettyAsyncFSWALConfigHelper;<a name="line.161"></a>
+<span class="sourceLineNo">162</span>import org.apache.hadoop.hbase.wal.WAL;<a name="line.162"></a>
+<span class="sourceLineNo">163</span>import org.apache.hadoop.hbase.wal.WALEdit;<a name="line.163"></a>
+<span class="sourceLineNo">164</span>import org.apache.hadoop.hbase.wal.WALFactory;<a name="line.164"></a>
+<span class="sourceLineNo">165</span>import org.apache.hadoop.hbase.wal.WALKeyImpl;<a name="line.165"></a>
+<span class="sourceLineNo">166</span>import org.apache.hadoop.hbase.wal.WALProvider;<a name="line.166"></a>
+<span class="sourceLineNo">167</span>import org.apache.hadoop.hbase.wal.WALProvider.Writer;<a name="line.167"></a>
+<span class="sourceLineNo">168</span>import org.apache.hadoop.hbase.wal.WALSplitUtil;<a name="line.168"></a>
 <span class="sourceLineNo">169</span>import org.apache.hadoop.metrics2.MetricsExecutor;<a name="line.169"></a>
 <span class="sourceLineNo">170</span>import org.junit.After;<a name="line.170"></a>
 <span class="sourceLineNo">171</span>import org.junit.Assert;<a name="line.171"></a>
@@ -409,6007 +409,6017 @@
 <span class="sourceLineNo">401</span>    String testName = "testMemstoreSizeAccountingWithFailedPostBatchMutate";<a name="line.401"></a>
 <span class="sourceLineNo">402</span>    FileSystem fs = FileSystem.get(CONF);<a name="line.402"></a>
 <span class="sourceLineNo">403</span>    Path rootDir = new Path(dir + testName);<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    FSHLog hLog = new FSHLog(fs, rootDir, testName, CONF);<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    hLog.init();<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, hLog,<a name="line.406"></a>
-<span class="sourceLineNo">407</span>        COLUMN_FAMILY_BYTES);<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    assertEquals(0, region.getMemStoreDataSize());<a name="line.409"></a>
-<span class="sourceLineNo">410</span><a name="line.410"></a>
-<span class="sourceLineNo">411</span>    // Put one value<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    byte [] value = Bytes.toBytes(method);<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    Put put = new Put(value);<a name="line.413"></a>
-<span class="sourceLineNo">414</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.414"></a>
-<span class="sourceLineNo">415</span>    region.put(put);<a name="line.415"></a>
-<span class="sourceLineNo">416</span>    long onePutSize = region.getMemStoreDataSize();<a name="line.416"></a>
-<span class="sourceLineNo">417</span>    assertTrue(onePutSize &gt; 0);<a name="line.417"></a>
-<span class="sourceLineNo">418</span><a name="line.418"></a>
-<span class="sourceLineNo">419</span>    RegionCoprocessorHost mockedCPHost = Mockito.mock(RegionCoprocessorHost.class);<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    doThrow(new IOException())<a name="line.420"></a>
-<span class="sourceLineNo">421</span>       .when(mockedCPHost).postBatchMutate(Mockito.&lt;MiniBatchOperationInProgress&lt;Mutation&gt;&gt;any());<a name="line.421"></a>
-<span class="sourceLineNo">422</span>    region.setCoprocessorHost(mockedCPHost);<a name="line.422"></a>
-<span class="sourceLineNo">423</span><a name="line.423"></a>
-<span class="sourceLineNo">424</span>    put = new Put(value);<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("dfg"), value);<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    try {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      region.put(put);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>      fail("Should have failed with IOException");<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    } catch (IOException expected) {<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    }<a name="line.430"></a>
-<span class="sourceLineNo">431</span>    long expectedSize = onePutSize * 2;<a name="line.431"></a>
-<span class="sourceLineNo">432</span>    assertEquals("memstoreSize should be incremented",<a name="line.432"></a>
-<span class="sourceLineNo">433</span>        expectedSize, region.getMemStoreDataSize());<a name="line.433"></a>
-<span class="sourceLineNo">434</span>    assertEquals("flushable size should be incremented",<a name="line.434"></a>
-<span class="sourceLineNo">435</span>        expectedSize, store.getFlushableSize().getDataSize());<a name="line.435"></a>
-<span class="sourceLineNo">436</span><a name="line.436"></a>
-<span class="sourceLineNo">437</span>    region.setCoprocessorHost(null);<a name="line.437"></a>
-<span class="sourceLineNo">438</span>  }<a name="line.438"></a>
-<span class="sourceLineNo">439</span><a name="line.439"></a>
-<span class="sourceLineNo">440</span>  /**<a name="line.440"></a>
-<span class="sourceLineNo">441</span>   * A test case of HBASE-21041<a name="line.441"></a>
-<span class="sourceLineNo">442</span>   * @throws Exception Exception<a name="line.442"></a>
-<span class="sourceLineNo">443</span>   */<a name="line.443"></a>
-<span class="sourceLineNo">444</span>  @Test<a name="line.444"></a>
-<span class="sourceLineNo">445</span>  public void testFlushAndMemstoreSizeCounting() throws Exception {<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    byte[] family = Bytes.toBytes("family");<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.447"></a>
-<span class="sourceLineNo">448</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.448"></a>
-<span class="sourceLineNo">449</span>    try {<a name="line.449"></a>
-<span class="sourceLineNo">450</span>      for (byte[] row : HBaseTestingUtility.ROWS) {<a name="line.450"></a>
-<span class="sourceLineNo">451</span>        Put put = new Put(row);<a name="line.451"></a>
-<span class="sourceLineNo">452</span>        put.addColumn(family, family, row);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>        region.put(put);<a name="line.453"></a>
-<span class="sourceLineNo">454</span>      }<a name="line.454"></a>
-<span class="sourceLineNo">455</span>      region.flush(true);<a name="line.455"></a>
-<span class="sourceLineNo">456</span>      // After flush, data size should be zero<a name="line.456"></a>
-<span class="sourceLineNo">457</span>      assertEquals(0, region.getMemStoreDataSize());<a name="line.457"></a>
-<span class="sourceLineNo">458</span>      // After flush, a new active mutable segment is created, so the heap size<a name="line.458"></a>
-<span class="sourceLineNo">459</span>      // should equal to MutableSegment.DEEP_OVERHEAD<a name="line.459"></a>
-<span class="sourceLineNo">460</span>      assertEquals(MutableSegment.DEEP_OVERHEAD, region.getMemStoreHeapSize());<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      // After flush, offheap should be zero<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      assertEquals(0, region.getMemStoreOffHeapSize());<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    } finally {<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.464"></a>
-<span class="sourceLineNo">465</span>      this.region = null;<a name="line.465"></a>
-<span class="sourceLineNo">466</span>      wals.close();<a name="line.466"></a>
-<span class="sourceLineNo">467</span>    }<a name="line.467"></a>
-<span class="sourceLineNo">468</span>  }<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>   * Test we do not lose data if we fail a flush and then close.<a name="line.471"></a>
-<span class="sourceLineNo">472</span>   * Part of HBase-10466.  Tests the following from the issue description:<a name="line.472"></a>
-<span class="sourceLineNo">473</span>   * "Bug 1: Wrong calculation of HRegion.memstoreSize: When a flush fails, data to be flushed is<a name="line.473"></a>
-<span class="sourceLineNo">474</span>   * kept in each MemStore's snapshot and wait for next flush attempt to continue on it. But when<a name="line.474"></a>
-<span class="sourceLineNo">475</span>   * the next flush succeeds, the counter of total memstore size in HRegion is always deduced by<a name="line.475"></a>
-<span class="sourceLineNo">476</span>   * the sum of current memstore sizes instead of snapshots left from previous failed flush. This<a name="line.476"></a>
-<span class="sourceLineNo">477</span>   * calculation is problematic that almost every time there is failed flush, HRegion.memstoreSize<a name="line.477"></a>
-<span class="sourceLineNo">478</span>   * gets reduced by a wrong value. If region flush could not proceed for a couple cycles, the size<a name="line.478"></a>
-<span class="sourceLineNo">479</span>   * in current memstore could be much larger than the snapshot. It's likely to drift memstoreSize<a name="line.479"></a>
-<span class="sourceLineNo">480</span>   * much smaller than expected. In extreme case, if the error accumulates to even bigger than<a name="line.480"></a>
-<span class="sourceLineNo">481</span>   * HRegion's memstore size limit, any further flush is skipped because flush does not do anything<a name="line.481"></a>
-<span class="sourceLineNo">482</span>   * if memstoreSize is not larger than 0."<a name="line.482"></a>
-<span class="sourceLineNo">483</span>   * @throws Exception<a name="line.483"></a>
-<span class="sourceLineNo">484</span>   */<a name="line.484"></a>
-<span class="sourceLineNo">485</span>  @Test<a name="line.485"></a>
-<span class="sourceLineNo">486</span>  public void testFlushSizeAccounting() throws Exception {<a name="line.486"></a>
-<span class="sourceLineNo">487</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    // Only retry once.<a name="line.489"></a>
-<span class="sourceLineNo">490</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.490"></a>
-<span class="sourceLineNo">491</span>    final User user =<a name="line.491"></a>
-<span class="sourceLineNo">492</span>      User.createUserForTesting(conf, method, new String[]{"foo"});<a name="line.492"></a>
-<span class="sourceLineNo">493</span>    // Inject our faulty LocalFileSystem<a name="line.493"></a>
-<span class="sourceLineNo">494</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.494"></a>
-<span class="sourceLineNo">495</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.495"></a>
-<span class="sourceLineNo">496</span>      @Override<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      public Object run() throws Exception {<a name="line.497"></a>
-<span class="sourceLineNo">498</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.498"></a>
-<span class="sourceLineNo">499</span>        FileSystem fs = FileSystem.get(conf);<a name="line.499"></a>
-<span class="sourceLineNo">500</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.500"></a>
-<span class="sourceLineNo">501</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.501"></a>
-<span class="sourceLineNo">502</span>        HRegion region = null;<a name="line.502"></a>
-<span class="sourceLineNo">503</span>        try {<a name="line.503"></a>
-<span class="sourceLineNo">504</span>          // Initialize region<a name="line.504"></a>
-<span class="sourceLineNo">505</span>          region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, wal,<a name="line.505"></a>
-<span class="sourceLineNo">506</span>              COLUMN_FAMILY_BYTES);<a name="line.506"></a>
-<span class="sourceLineNo">507</span>          long size = region.getMemStoreDataSize();<a name="line.507"></a>
-<span class="sourceLineNo">508</span>          Assert.assertEquals(0, size);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.509"></a>
-<span class="sourceLineNo">510</span>          Put p1 = new Put(row);<a name="line.510"></a>
-<span class="sourceLineNo">511</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[]) null));<a name="line.511"></a>
-<span class="sourceLineNo">512</span>          region.put(p1);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>          final long sizeOfOnePut = region.getMemStoreDataSize();<a name="line.513"></a>
-<span class="sourceLineNo">514</span>          // Fail a flush which means the current memstore will hang out as memstore 'snapshot'.<a name="line.514"></a>
-<span class="sourceLineNo">515</span>          try {<a name="line.515"></a>
-<span class="sourceLineNo">516</span>            LOG.info("Flushing");<a name="line.516"></a>
-<span class="sourceLineNo">517</span>            region.flush(true);<a name="line.517"></a>
-<span class="sourceLineNo">518</span>            Assert.fail("Didn't bubble up IOE!");<a name="line.518"></a>
-<span class="sourceLineNo">519</span>          } catch (DroppedSnapshotException dse) {<a name="line.519"></a>
-<span class="sourceLineNo">520</span>            // What we are expecting<a name="line.520"></a>
-<span class="sourceLineNo">521</span>            region.closing.set(false); // this is needed for the rest of the test to work<a name="line.521"></a>
-<span class="sourceLineNo">522</span>          }<a name="line.522"></a>
-<span class="sourceLineNo">523</span>          // Make it so all writes succeed from here on out<a name="line.523"></a>
-<span class="sourceLineNo">524</span>          ffs.fault.set(false);<a name="line.524"></a>
-<span class="sourceLineNo">525</span>          // Check sizes.  Should still be the one entry.<a name="line.525"></a>
-<span class="sourceLineNo">526</span>          Assert.assertEquals(sizeOfOnePut, region.getMemStoreDataSize());<a name="line.526"></a>
-<span class="sourceLineNo">527</span>          // Now add two entries so that on this next flush that fails, we can see if we<a name="line.527"></a>
-<span class="sourceLineNo">528</span>          // subtract the right amount, the snapshot size only.<a name="line.528"></a>
-<span class="sourceLineNo">529</span>          Put p2 = new Put(row);<a name="line.529"></a>
-<span class="sourceLineNo">530</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.530"></a>
-<span class="sourceLineNo">531</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.531"></a>
-<span class="sourceLineNo">532</span>          region.put(p2);<a name="line.532"></a>
-<span class="sourceLineNo">533</span>          long expectedSize = sizeOfOnePut * 3;<a name="line.533"></a>
-<span class="sourceLineNo">534</span>          Assert.assertEquals(expectedSize, region.getMemStoreDataSize());<a name="line.534"></a>
-<span class="sourceLineNo">535</span>          // Do a successful flush.  It will clear the snapshot only.  Thats how flushes work.<a name="line.535"></a>
-<span class="sourceLineNo">536</span>          // If already a snapshot, we clear it else we move the memstore to be snapshot and flush<a name="line.536"></a>
-<span class="sourceLineNo">537</span>          // it<a name="line.537"></a>
-<span class="sourceLineNo">538</span>          region.flush(true);<a name="line.538"></a>
-<span class="sourceLineNo">539</span>          // Make sure our memory accounting is right.<a name="line.539"></a>
-<span class="sourceLineNo">540</span>          Assert.assertEquals(sizeOfOnePut * 2, region.getMemStoreDataSize());<a name="line.540"></a>
-<span class="sourceLineNo">541</span>        } finally {<a name="line.541"></a>
-<span class="sourceLineNo">542</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.542"></a>
-<span class="sourceLineNo">543</span>        }<a name="line.543"></a>
-<span class="sourceLineNo">544</span>        return null;<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>    FileSystem.closeAllForUGI(user.getUGI());<a name="line.547"></a>
-<span class="sourceLineNo">548</span>  }<a name="line.548"></a>
-<span class="sourceLineNo">549</span><a name="line.549"></a>
-<span class="sourceLineNo">550</span>  @Test<a name="line.550"></a>
-<span class="sourceLineNo">551</span>  public void testCloseWithFailingFlush() throws Exception {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    // Only retry once.<a name="line.554"></a>
-<span class="sourceLineNo">555</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.555"></a>
-<span class="sourceLineNo">556</span>    final User user =<a name="line.556"></a>
-<span class="sourceLineNo">557</span>      User.createUserForTesting(conf, this.method, new String[]{"foo"});<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    // Inject our faulty LocalFileSystem<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      @Override<a name="line.561"></a>
-<span class="sourceLineNo">562</span>      public Object run() throws Exception {<a name="line.562"></a>
-<span class="sourceLineNo">563</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.563"></a>
-<span class="sourceLineNo">564</span>        FileSystem fs = FileSystem.get(conf);<a name="line.564"></a>
-<span class="sourceLineNo">565</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.565"></a>
-<span class="sourceLineNo">566</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.566"></a>
-<span class="sourceLineNo">567</span>        HRegion region = null;<a name="line.567"></a>
-<span class="sourceLineNo">568</span>        try {<a name="line.568"></a>
-<span class="sourceLineNo">569</span>          // Initialize region<a name="line.569"></a>
-<span class="sourceLineNo">570</span>          region = initHRegion(tableName, null, null, false,<a name="line.570"></a>
-<span class="sourceLineNo">571</span>              Durability.SYNC_WAL, wal, COLUMN_FAMILY_BYTES);<a name="line.571"></a>
-<span class="sourceLineNo">572</span>          long size = region.getMemStoreDataSize();<a name="line.572"></a>
-<span class="sourceLineNo">573</span>          Assert.assertEquals(0, size);<a name="line.573"></a>
-<span class="sourceLineNo">574</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.574"></a>
-<span class="sourceLineNo">575</span>          Put p1 = new Put(row);<a name="line.575"></a>
-<span class="sourceLineNo">576</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[])null));<a name="line.576"></a>
-<span class="sourceLineNo">577</span>          region.put(p1);<a name="line.577"></a>
-<span class="sourceLineNo">578</span>          // Manufacture an outstanding snapshot -- fake a failed flush by doing prepare step only.<a name="line.578"></a>
-<span class="sourceLineNo">579</span>          HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>          StoreFlushContext storeFlushCtx =<a name="line.580"></a>
-<span class="sourceLineNo">581</span>              store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY);<a name="line.581"></a>
-<span class="sourceLineNo">582</span>          storeFlushCtx.prepare();<a name="line.582"></a>
-<span class="sourceLineNo">583</span>          // Now add two entries to the foreground memstore.<a name="line.583"></a>
-<span class="sourceLineNo">584</span>          Put p2 = new Put(row);<a name="line.584"></a>
-<span class="sourceLineNo">585</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.585"></a>
-<span class="sourceLineNo">586</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.586"></a>
-<span class="sourceLineNo">587</span>          region.put(p2);<a name="line.587"></a>
-<span class="sourceLineNo">588</span>          // Now try close on top of a failing flush.<a name="line.588"></a>
-<span class="sourceLineNo">589</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.589"></a>
-<span class="sourceLineNo">590</span>          region = null;<a name="line.590"></a>
-<span class="sourceLineNo">591</span>          fail();<a name="line.591"></a>
-<span class="sourceLineNo">592</span>        } catch (DroppedSnapshotException dse) {<a name="line.592"></a>
-<span class="sourceLineNo">593</span>          // Expected<a name="line.593"></a>
-<span class="sourceLineNo">594</span>          LOG.info("Expected DroppedSnapshotException");<a name="line.594"></a>
-<span class="sourceLineNo">595</span>        } finally {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>          // Make it so all writes succeed from here on out so can close clean<a name="line.596"></a>
-<span class="sourceLineNo">597</span>          ffs.fault.set(false);<a name="line.597"></a>
-<span class="sourceLineNo">598</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.598"></a>
-<span class="sourceLineNo">599</span>        }<a name="line.599"></a>
-<span class="sourceLineNo">600</span>        return null;<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      }<a name="line.601"></a>
-<span class="sourceLineNo">602</span>    });<a name="line.602"></a>
-<span class="sourceLineNo">603</span>    FileSystem.closeAllForUGI(user.getUGI());<a name="line.603"></a>
-<span class="sourceLineNo">604</span>  }<a name="line.604"></a>
-<span class="sourceLineNo">605</span><a name="line.605"></a>
-<span class="sourceLineNo">606</span>  @Test<a name="line.606"></a>
-<span class="sourceLineNo">607</span>  public void testCompactionAffectedByScanners() throws Exception {<a name="line.607"></a>
-<span class="sourceLineNo">608</span>    byte[] family = Bytes.toBytes("family");<a name="line.608"></a>
-<span class="sourceLineNo">609</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.609"></a>
-<span class="sourceLineNo">610</span><a name="line.610"></a>
-<span class="sourceLineNo">611</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.612"></a>
-<span class="sourceLineNo">613</span>    region.put(put);<a name="line.613"></a>
-<span class="sourceLineNo">614</span>    region.flush(true);<a name="line.614"></a>
-<span class="sourceLineNo">615</span><a name="line.615"></a>
-<span class="sourceLineNo">616</span>    Scan scan = new Scan();<a name="line.616"></a>
-<span class="sourceLineNo">617</span>    scan.setMaxVersions(3);<a name="line.617"></a>
-<span class="sourceLineNo">618</span>    // open the first scanner<a name="line.618"></a>
-<span class="sourceLineNo">619</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.619"></a>
-<span class="sourceLineNo">620</span><a name="line.620"></a>
-<span class="sourceLineNo">621</span>    Delete delete = new Delete(Bytes.toBytes("r1"));<a name="line.621"></a>
-<span class="sourceLineNo">622</span>    region.delete(delete);<a name="line.622"></a>
-<span class="sourceLineNo">623</span>    region.flush(true);<a name="line.623"></a>
-<span class="sourceLineNo">624</span><a name="line.624"></a>
-<span class="sourceLineNo">625</span>    // open the second scanner<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    RegionScanner scanner2 = region.getScanner(scan);<a name="line.626"></a>
-<span class="sourceLineNo">627</span><a name="line.627"></a>
-<span class="sourceLineNo">628</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.628"></a>
-<span class="sourceLineNo">629</span><a name="line.629"></a>
-<span class="sourceLineNo">630</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.630"></a>
-<span class="sourceLineNo">631</span><a name="line.631"></a>
-<span class="sourceLineNo">632</span>    // make a major compaction<a name="line.632"></a>
-<span class="sourceLineNo">633</span>    region.compact(true);<a name="line.633"></a>
-<span class="sourceLineNo">634</span><a name="line.634"></a>
-<span class="sourceLineNo">635</span>    // open the third scanner<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    RegionScanner scanner3 = region.getScanner(scan);<a name="line.636"></a>
-<span class="sourceLineNo">637</span><a name="line.637"></a>
-<span class="sourceLineNo">638</span>    // get data from scanner 1, 2, 3 after major compaction<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    scanner1.next(results);<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    System.out.println(results);<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    assertEquals(1, results.size());<a name="line.641"></a>
-<span class="sourceLineNo">642</span><a name="line.642"></a>
-<span class="sourceLineNo">643</span>    results.clear();<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    scanner2.next(results);<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    System.out.println(results);<a name="line.645"></a>
-<span class="sourceLineNo">646</span>    assertEquals(0, results.size());<a name="line.646"></a>
-<span class="sourceLineNo">647</span><a name="line.647"></a>
-<span class="sourceLineNo">648</span>    results.clear();<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    scanner3.next(results);<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    System.out.println(results);<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    assertEquals(0, results.size());<a name="line.651"></a>
-<span class="sourceLineNo">652</span>  }<a name="line.652"></a>
-<span class="sourceLineNo">653</span><a name="line.653"></a>
-<span class="sourceLineNo">654</span>  @Test<a name="line.654"></a>
-<span class="sourceLineNo">655</span>  public void testToShowNPEOnRegionScannerReseek() throws Exception {<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    byte[] family = Bytes.toBytes("family");<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.657"></a>
-<span class="sourceLineNo">658</span><a name="line.658"></a>
-<span class="sourceLineNo">659</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.659"></a>
-<span class="sourceLineNo">660</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.660"></a>
-<span class="sourceLineNo">661</span>    region.put(put);<a name="line.661"></a>
-<span class="sourceLineNo">662</span>    put = new Put(Bytes.toBytes("r2"));<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.663"></a>
-<span class="sourceLineNo">664</span>    region.put(put);<a name="line.664"></a>
-<span class="sourceLineNo">665</span>    region.flush(true);<a name="line.665"></a>
-<span class="sourceLineNo">666</span><a name="line.666"></a>
-<span class="sourceLineNo">667</span>    Scan scan = new Scan();<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    scan.setMaxVersions(3);<a name="line.668"></a>
-<span class="sourceLineNo">669</span>    // open the first scanner<a name="line.669"></a>
-<span class="sourceLineNo">670</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.670"></a>
-<span class="sourceLineNo">671</span><a name="line.671"></a>
-<span class="sourceLineNo">672</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.672"></a>
-<span class="sourceLineNo">673</span><a name="line.673"></a>
-<span class="sourceLineNo">674</span>    region.compact(true);<a name="line.674"></a>
-<span class="sourceLineNo">675</span><a name="line.675"></a>
-<span class="sourceLineNo">676</span>    scanner1.reseek(Bytes.toBytes("r2"));<a name="line.676"></a>
-<span class="sourceLineNo">677</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.677"></a>
-<span class="sourceLineNo">678</span>    scanner1.next(results);<a name="line.678"></a>
-<span class="sourceLineNo">679</span>    Cell keyValue = results.get(0);<a name="line.679"></a>
-<span class="sourceLineNo">680</span>    Assert.assertTrue(Bytes.compareTo(CellUtil.cloneRow(keyValue), Bytes.toBytes("r2")) == 0);<a name="line.680"></a>
-<span class="sourceLineNo">681</span>    scanner1.close();<a name="line.681"></a>
-<span class="sourceLineNo">682</span>  }<a name="line.682"></a>
-<span class="sourceLineNo">683</span><a name="line.683"></a>
-<span class="sourceLineNo">684</span>  @Test<a name="line.684"></a>
-<span class="sourceLineNo">685</span>  public void testSkipRecoveredEditsReplay() throws Exception {<a name="line.685"></a>
-<span class="sourceLineNo">686</span>    byte[] family = Bytes.toBytes("family");<a name="line.686"></a>
-<span class="sourceLineNo">687</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.687"></a>
-<span class="sourceLineNo">688</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.688"></a>
-<span class="sourceLineNo">689</span>    try {<a name="line.689"></a>
-<span class="sourceLineNo">690</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.690"></a>
-<span class="sourceLineNo">691</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.691"></a>
-<span class="sourceLineNo">692</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.692"></a>
-<span class="sourceLineNo">693</span><a name="line.693"></a>
-<span class="sourceLineNo">694</span>      Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.694"></a>
-<span class="sourceLineNo">695</span><a name="line.695"></a>
-<span class="sourceLineNo">696</span>      long maxSeqId = 1050;<a name="line.696"></a>
-<span class="sourceLineNo">697</span>      long minSeqId = 1000;<a name="line.697"></a>
-<span class="sourceLineNo">698</span><a name="line.698"></a>
-<span class="sourceLineNo">699</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.699"></a>
-<span class="sourceLineNo">700</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.700"></a>
-<span class="sourceLineNo">701</span>        fs.create(recoveredEdits);<a name="line.701"></a>
-<span class="sourceLineNo">702</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.702"></a>
-<span class="sourceLineNo">703</span><a name="line.703"></a>
-<span class="sourceLineNo">704</span>        long time = System.nanoTime();<a name="line.704"></a>
-<span class="sourceLineNo">705</span>        WALEdit edit = new WALEdit();<a name="line.705"></a>
-<span class="sourceLineNo">706</span>        edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.706"></a>
-<span class="sourceLineNo">707</span>            .toBytes(i)));<a name="line.707"></a>
-<span class="sourceLineNo">708</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.708"></a>
-<span class="sourceLineNo">709</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.709"></a>
-<span class="sourceLineNo">710</span><a name="line.710"></a>
-<span class="sourceLineNo">711</span>        writer.close();<a name="line.711"></a>
-<span class="sourceLineNo">712</span>      }<a name="line.712"></a>
-<span class="sourceLineNo">713</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.713"></a>
-<span class="sourceLineNo">714</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.714"></a>
-<span class="sourceLineNo">715</span>      for (HStore store : region.getStores()) {<a name="line.715"></a>
-<span class="sourceLineNo">716</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), minSeqId - 1);<a name="line.716"></a>
-<span class="sourceLineNo">717</span>      }<a name="line.717"></a>
-<span class="sourceLineNo">718</span>      long seqId = region.replayRecoveredEditsIfAny(maxSeqIdInStores, null, status);<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      assertEquals(maxSeqId, seqId);<a name="line.719"></a>
-<span class="sourceLineNo">720</span>      region.getMVCC().advanceTo(seqId);<a name="line.720"></a>
-<span class="sourceLineNo">721</span>      Get get = new Get(row);<a name="line.721"></a>
-<span class="sourceLineNo">722</span>      Result result = region.get(get);<a name="line.722"></a>
-<span class="sourceLineNo">723</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.723"></a>
-<span class="sourceLineNo">724</span>        List&lt;Cell&gt; kvs = result.getColumnCells(family, Bytes.toBytes(i));<a name="line.724"></a>
-<span class="sourceLineNo">725</span>        assertEquals(1, kvs.size());<a name="line.725"></a>
-<span class="sourceLineNo">726</span>        assertArrayEquals(Bytes.toBytes(i), CellUtil.cloneValue(kvs.get(0)));<a name="line.726"></a>
-<span class="sourceLineNo">727</span>      }<a name="line.727"></a>
-<span class="sourceLineNo">728</span>    } finally {<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      this.region = null;<a name="line.730"></a>
-<span class="sourceLineNo">731</span>      wals.close();<a name="line.731"></a>
-<span class="sourceLineNo">732</span>    }<a name="line.732"></a>
-<span class="sourceLineNo">733</span>  }<a name="line.733"></a>
-<span class="sourceLineNo">734</span><a name="line.734"></a>
-<span class="sourceLineNo">735</span>  @Test<a name="line.735"></a>
-<span class="sourceLineNo">736</span>  public void testSkipRecoveredEditsReplaySomeIgnored() throws Exception {<a name="line.736"></a>
-<span class="sourceLineNo">737</span>    byte[] family = Bytes.toBytes("family");<a name="line.737"></a>
-<span class="sourceLineNo">738</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.738"></a>
-<span class="sourceLineNo">739</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.739"></a>
-<span class="sourceLineNo">740</span>    try {<a name="line.740"></a>
-<span class="sourceLineNo">741</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.741"></a>
-<span class="sourceLineNo">742</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.742"></a>
-<span class="sourceLineNo">743</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.743"></a>
-<span class="sourceLineNo">744</span><a name="line.744"></a>
-<span class="sourceLineNo">745</span>      Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.745"></a>
-<span class="sourceLineNo">746</span><a name="line.746"></a>
-<span class="sourceLineNo">747</span>      long maxSeqId = 1050;<a name="line.747"></a>
-<span class="sourceLineNo">748</span>      long minSeqId = 1000;<a name="line.748"></a>
-<span class="sourceLineNo">749</span><a name="line.749"></a>
-<span class="sourceLineNo">750</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.750"></a>
-<span class="sourceLineNo">751</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.751"></a>
-<span class="sourceLineNo">752</span>        fs.create(recoveredEdits);<a name="line.752"></a>
-<span class="sourceLineNo">753</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.753"></a>
-<span class="sourceLineNo">754</span><a name="line.754"></a>
-<span class="sourceLineNo">755</span>        long time = System.nanoTime();<a name="line.755"></a>
-<span class="sourceLineNo">756</span>        WALEdit edit = new WALEdit();<a name="line.756"></a>
-<span class="sourceLineNo">757</span>        edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.757"></a>
-<span class="sourceLineNo">758</span>            .toBytes(i)));<a name="line.758"></a>
-<span class="sourceLineNo">759</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.759"></a>
-<span class="sourceLineNo">760</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.760"></a>
-<span class="sourceLineNo">761</span><a name="line.761"></a>
-<span class="sourceLineNo">762</span>        writer.close();<a name="line.762"></a>
-<span class="sourceLineNo">763</span>      }<a name="line.763"></a>
-<span class="sourceLineNo">764</span>      long recoverSeqId = 1030;<a name="line.764"></a>
-<span class="sourceLineNo">765</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.766"></a>
-<span class="sourceLineNo">767</span>      for (HStore store : region.getStores()) {<a name="line.767"></a>
-<span class="sourceLineNo">768</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), recoverSeqId - 1);<a name="line.768"></a>
-<span class="sourceLineNo">769</span>      }<a name="line.769"></a>
-<span class="sourceLineNo">770</span>      long seqId = region.replayRecoveredEditsIfAny(maxSeqIdInStores, null, status);<a name="line.770"></a>
-<span class="sourceLineNo">771</span>      assertEquals(maxSeqId, seqId);<a name="line.771"></a>
-<span class="sourceLineNo">772</span>      region.getMVCC().advanceTo(seqId);<a name="line.772"></a>
-<span class="sourceLineNo">773</span>      Get get = new Get(row);<a name="line.773"></a>
-<span class="sourceLineNo">774</span>      Result result = region.get(get);<a name="line.774"></a>
-<span class="sourceLineNo">775</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.775"></a>
-<span class="sourceLineNo">776</span>        List&lt;Cell&gt; kvs = result.getColumnCells(family, Bytes.toBytes(i));<a name="line.776"></a>
-<span class="sourceLineNo">777</span>        if (i &lt; recoverSeqId) {<a name="line.777"></a>
-<span class="sourceLineNo">778</span>          assertEquals(0, kvs.size());<a name="line.778"></a>
-<span class="sourceLineNo">779</span>        } else {<a name="line.779"></a>
-<span class="sourceLineNo">780</span>          assertEquals(1, kvs.size());<a name="line.780"></a>
-<span class="sourceLineNo">781</span>          assertArrayEquals(Bytes.toBytes(i), CellUtil.cloneValue(kvs.get(0)));<a name="line.781"></a>
-<span class="sourceLineNo">782</span>        }<a name="line.782"></a>
-<span class="sourceLineNo">783</span>      }<a name="line.783"></a>
-<span class="sourceLineNo">784</span>    } finally {<a name="line.784"></a>
-<span class="sourceLineNo">785</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.785"></a>
-<span class="sourceLineNo">786</span>      this.region = null;<a name="line.786"></a>
-<span class="sourceLineNo">787</span>      wals.close();<a name="line.787"></a>
-<span class="sourceLineNo">788</span>    }<a name="line.788"></a>
-<span class="sourceLineNo">789</span>  }<a name="line.789"></a>
-<span class="sourceLineNo">790</span><a name="line.790"></a>
-<span class="sourceLineNo">791</span>  @Test<a name="line.791"></a>
-<span class="sourceLineNo">792</span>  public void testSkipRecoveredEditsReplayAllIgnored() throws Exception {<a name="line.792"></a>
-<span class="sourceLineNo">793</span>    byte[] family = Bytes.toBytes("family");<a name="line.793"></a>
-<span class="sourceLineNo">794</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.794"></a>
-<span class="sourceLineNo">795</span>    Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.795"></a>
-<span class="sourceLineNo">796</span>    FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.796"></a>
-<span class="sourceLineNo">797</span><a name="line.797"></a>
-<span class="sourceLineNo">798</span>    Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.798"></a>
-<span class="sourceLineNo">799</span>    for (int i = 1000; i &lt; 1050; i += 10) {<a name="line.799"></a>
-<span class="sourceLineNo">800</span>      Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.800"></a>
-<span class="sourceLineNo">801</span>      FSDataOutputStream dos = fs.create(recoveredEdits);<a name="line.801"></a>
-<span class="sourceLineNo">802</span>      dos.writeInt(i);<a name="line.802"></a>
-<span class="sourceLineNo">803</span>      dos.close();<a name="line.803"></a>
-<span class="sourceLineNo">804</span>    }<a name="line.804"></a>
-<span class="sourceLineNo">805</span>    long minSeqId = 2000;<a name="line.805"></a>
-<span class="sourceLineNo">806</span>    Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", minSeqId - 1));<a name="line.806"></a>
-<span class="sourceLineNo">807</span>    FSDataOutputStream dos = fs.create(recoveredEdits);<a name="line.807"></a>
-<span class="sourceLineNo">808</span>    dos.close();<a name="line.808"></a>
-<span class="sourceLineNo">809</span><a name="line.809"></a>
-<span class="sourceLineNo">810</span>    Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.810"></a>
-<span class="sourceLineNo">811</span>    for (HStore store : region.getStores()) {<a name="line.811"></a>
-<span class="sourceLineNo">812</span>      maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), minSeqId);<a name="line.812"></a>
-<span class="sourceLineNo">813</span>    }<a name="line.813"></a>
-<span class="sourceLineNo">814</span>    long seqId = region.replayRecoveredEditsIfAny(maxSeqIdInStores, null, null);<a name="line.814"></a>
-<span class="sourceLineNo">815</span>    assertEquals(minSeqId, seqId);<a name="line.815"></a>
-<span class="sourceLineNo">816</span>  }<a name="line.816"></a>
-<span class="sourceLineNo">817</span><a name="line.817"></a>
-<span class="sourceLineNo">818</span>  @Test<a name="line.818"></a>
-<span class="sourceLineNo">819</span>  public void testSkipRecoveredEditsReplayTheLastFileIgnored() throws Exception {<a name="line.819"></a>
-<span class="sourceLineNo">820</span>    byte[] family = Bytes.toBytes("family");<a name="line.820"></a>
-<span class="sourceLineNo">821</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.821"></a>
-<span class="sourceLineNo">822</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.822"></a>
-<span class="sourceLineNo">823</span>    try {<a name="line.823"></a>
-<span class="sourceLineNo">824</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.824"></a>
-<span class="sourceLineNo">825</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.825"></a>
-<span class="sourceLineNo">826</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.826"></a>
-<span class="sourceLineNo">827</span>      byte[][] columns = region.getTableDescriptor().getColumnFamilyNames().toArray(new byte[0][]);<a name="line.827"></a>
-<span class="sourceLineNo">828</span><a name="line.828"></a>
-<span class="sourceLineNo">829</span>      assertEquals(0, region.getStoreFileList(columns).size());<a name="line.829"></a>
-<span class="sourceLineNo">830</span><a name="line.830"></a>
-<span class="sourceLineNo">831</span>      Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.831"></a>
-<span class="sourceLineNo">832</span><a name="line.832"></a>
-<span class="sourceLineNo">833</span>      long maxSeqId = 1050;<a name="line.833"></a>
-<span class="sourceLineNo">834</span>      long minSeqId = 1000;<a name="line.834"></a>
-<span class="sourceLineNo">835</span><a name="line.835"></a>
-<span class="sourceLineNo">836</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.836"></a>
-<span class="sourceLineNo">837</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.837"></a>
-<span class="sourceLineNo">838</span>        fs.create(recoveredEdits);<a name="line.838"></a>
-<span class="sourceLineNo">839</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.839"></a>
-<span class="sourceLineNo">840</span><a name="line.840"></a>
-<span class="sourceLineNo">841</span>        long time = System.nanoTime();<a name="line.841"></a>
-<span class="sourceLineNo">842</span>        WALEdit edit = null;<a name="line.842"></a>
-<span class="sourceLineNo">843</span>        if (i == maxSeqId) {<a name="line.843"></a>
-<span class="sourceLineNo">844</span>          edit = WALEdit.createCompaction(region.getRegionInfo(),<a name="line.844"></a>
-<span class="sourceLineNo">845</span>          CompactionDescriptor.newBuilder()<a name="line.845"></a>
-<span class="sourceLineNo">846</span>          .setTableName(ByteString.copyFrom(tableName.getName()))<a name="line.846"></a>
-<span class="sourceLineNo">847</span>          .setFamilyName(ByteString.copyFrom(regionName))<a name="line.847"></a>
-<span class="sourceLineNo">848</span>          .setEncodedRegionName(ByteString.copyFrom(regionName))<a name="line.848"></a>
-<span class="sourceLineNo">849</span>          .setStoreHomeDirBytes(ByteString.copyFrom(Bytes.toBytes(regiondir.toString())))<a name="line.849"></a>
-<span class="sourceLineNo">850</span>          .setRegionName(ByteString.copyFrom(region.getRegionInfo().getRegionName()))<a name="line.850"></a>
-<span class="sourceLineNo">851</span>          .build());<a name="line.851"></a>
-<span class="sourceLineNo">852</span>        } else {<a name="line.852"></a>
-<span class="sourceLineNo">853</span>          edit = new WALEdit();<a name="line.853"></a>
-<span class="sourceLineNo">854</span>          edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.854"></a>
-<span class="sourceLineNo">855</span>            .toBytes(i)));<a name="line.855"></a>
-<span class="sourceLineNo">856</span>        }<a name="line.856"></a>
-<span class="sourceLineNo">857</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.857"></a>
-<span class="sourceLineNo">858</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.858"></a>
-<span class="sourceLineNo">859</span>        writer.close();<a name="line.859"></a>
-<span class="sourceLineNo">860</span>      }<a name="line.860"></a>
-<span class="sourceLineNo">861</span><a name="line.861"></a>
-<span class="sourceLineNo">862</span>      long recoverSeqId = 1030;<a name="line.862"></a>
-<span class="sourceLineNo">863</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.863"></a>
-<span class="sourceLineNo">864</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.864"></a>
-<span class="sourceLineNo">865</span>      for (HStore store : region.getStores()) {<a name="line.865"></a>
-<span class="sourceLineNo">866</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), recoverSeqId - 1);<a name="line.866"></a>
-<span class="sourceLineNo">867</span>      }<a name="line.867"></a>
-<span class="sourceLineNo">868</span>      long seqId = region.replayRecoveredEditsIfAny(maxSeqIdInStores, null, status);<a name="line.868"></a>
-<span class="sourceLineNo">869</span>      assertEquals(maxSeqId, seqId);<a name="line.869"></a>
-<span class="sourceLineNo">870</span><a name="line.870"></a>
-<span class="sourceLineNo">871</span>      // assert that the files are flushed<a name="line.871"></a>
-<span class="sourceLineNo">872</span>      assertEquals(1, region.getStoreFileList(columns).size());<a name="line.872"></a>
-<span class="sourceLineNo">873</span><a name="line.873"></a>
-<span class="sourceLineNo">874</span>    } finally {<a name="line.874"></a>
-<span class="sourceLineNo">875</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.875"></a>
-<span class="sourceLineNo">876</span>      this.region = null;<a name="line.876"></a>
-<span class="sourceLineNo">877</span>      wals.close();<a name="line.877"></a>
-<span class="sourceLineNo">878</span>    }<a name="line.878"></a>
-<span class="sourceLineNo">879</span>  }<a name="line.879"></a>
-<span class="sourceLineNo">880</span><a name="line.880"></a>
-<span class="sourceLineNo">881</span>  @Test<a name="line.881"></a>
-<span class="sourceLineNo">882</span>  public void testRecoveredEditsReplayCompaction() throws Exception {<a name="line.882"></a>
-<span class="sourceLineNo">883</span>    testRecoveredEditsReplayCompaction(false);<a name="line.883"></a>
-<span class="sourceLineNo">884</span>    testRecoveredEditsReplayCompaction(true);<a name="line.884"></a>
-<span class="sourceLineNo">885</span>  }<a name="line.885"></a>
-<span class="sourceLineNo">886</span><a name="line.886"></a>
-<span class="sourceLineNo">887</span>  public void testRecoveredEditsReplayCompaction(boolean mismatchedRegionName) throws Exception {<a name="line.887"></a>
-<span class="sourceLineNo">888</span>    CONF.setClass(HConstants.REGION_IMPL, HRegionForTesting.class, Region.class);<a name="line.888"></a>
-<span class="sourceLineNo">889</span>    byte[] family = Bytes.toBytes("family");<a name="line.889"></a>
-<span class="sourceLineNo">890</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.890"></a>
-<span class="sourceLineNo">891</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.891"></a>
-<span class="sourceLineNo">892</span>    try {<a name="line.892"></a>
-<span class="sourceLineNo">893</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.893"></a>
-<span class="sourceLineNo">894</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.894"></a>
-<span class="sourceLineNo">895</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.895"></a>
-<span class="sourceLineNo">896</span><a name="line.896"></a>
-<span class="sourceLineNo">897</span>      long maxSeqId = 3;<a name="line.897"></a>
-<span class="sourceLineNo">898</span>      long minSeqId = 0;<a name="line.898"></a>
-<span class="sourceLineNo">899</span><a name="line.899"></a>
-<span class="sourceLineNo">900</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.900"></a>
-<span class="sourceLineNo">901</span>        Put put = new Put(Bytes.toBytes(i));<a name="line.901"></a>
-<span class="sourceLineNo">902</span>        put.addColumn(family, Bytes.toBytes(i), Bytes.toBytes(i));<a name="line.902"></a>
-<span class="sourceLineNo">903</span>        region.put(put);<a name="line.903"></a>
-<span class="sourceLineNo">904</span>        region.flush(true);<a name="line.904"></a>
-<span class="sourceLineNo">905</span>      }<a name="line.905"></a>
-<span class="sourceLineNo">906</span><a name="line.906"></a>
-<span class="sourceLineNo">907</span>      // this will create a region with 3 files<a name="line.907"></a>
-<span class="sourceLineNo">908</span>      assertEquals(3, region.getStore(family).getStorefilesCount());<a name="line.908"></a>
-<span class="sourceLineNo">909</span>      List&lt;Path&gt; storeFiles = new ArrayList&lt;&gt;(3);<a name="line.909"></a>
-<span class="sourceLineNo">910</span>      for (HStoreFile sf : region.getStore(family).getStorefiles()) {<a name="line.910"></a>
-<span class="sourceLineNo">911</span>        storeFiles.add(sf.getPath());<a name="line.911"></a>
-<span class="sourceLineNo">912</span>      }<a name="line.912"></a>
-<span class="sourceLineNo">913</span><a name="line.913"></a>
-<span class="sourceLineNo">914</span>      // disable compaction completion<a name="line.914"></a>
-<span class="sourceLineNo">915</span>      CONF.setBoolean("hbase.hstore.compaction.complete", false);<a name="line.915"></a>
-<span class="sourceLineNo">916</span>      region.compactStores();<a name="line.916"></a>
-<span class="sourceLineNo">917</span><a name="line.917"></a>
-<span class="sourceLineNo">918</span>      // ensure that nothing changed<a name="line.918"></a>
-<span class="sourceLineNo">919</span>      assertEquals(3, region.getStore(family).getStorefilesCount());<a name="line.919"></a>
-<span class="sourceLineNo">920</span><a name="line.920"></a>
-<span class="sourceLineNo">921</span>      // now find the compacted file, and manually add it to the recovered edits<a name="line.921"></a>
-<span class="sourceLineNo">922</span>      Path tmpDir = new Path(region.getRegionFileSystem().getTempDir(), Bytes.toString(family));<a name="line.922"></a>
-<span class="sourceLineNo">923</span>      FileStatus[] files = FSUtils.listStatus(fs, tmpDir);<a name="line.923"></a>
-<span class="sourceLineNo">924</span>      String errorMsg = "Expected to find 1 file in the region temp directory "<a name="line.924"></a>
-<span class="sourceLineNo">925</span>          + "from the compaction, could not find any";<a name="line.925"></a>
-<span class="sourceLineNo">926</span>      assertNotNull(errorMsg, files);<a name="line.926"></a>
-<span class="sourceLineNo">927</span>      assertEquals(errorMsg, 1, files.length);<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      // move the file inside region dir<a name="line.928"></a>
-<span class="sourceLineNo">929</span>      Path newFile = region.getRegionFileSystem().commitStoreFile(Bytes.toString(family),<a name="line.929"></a>
-<span class="sourceLineNo">930</span>          files[0].getPath());<a name="line.930"></a>
-<span class="sourceLineNo">931</span><a name="line.931"></a>
-<span class="sourceLineNo">932</span>      byte[] encodedNameAsBytes = this.region.getRegionInfo().getEncodedNameAsBytes();<a name="line.932"></a>
-<span class="sourceLineNo">933</span>      byte[] fakeEncodedNameAsBytes = new byte [encodedNameAsBytes.length];<a name="line.933"></a>
-<span class="sourceLineNo">934</span>      for (int i=0; i &lt; encodedNameAsBytes.length; i++) {<a name="line.934"></a>
-<span class="sourceLineNo">935</span>        // Mix the byte array to have a new encodedName<a name="line.935"></a>
-<span class="sourceLineNo">936</span>        fakeEncodedNameAsBytes[i] = (byte) (encodedNameAsBytes[i] + 1);<a name="line.936"></a>
-<span class="sourceLineNo">937</span>      }<a name="line.937"></a>
-<span class="sourceLineNo">938</span><a name="line.938"></a>
-<span class="sourceLineNo">939</span>      CompactionDescriptor compactionDescriptor = ProtobufUtil.toCompactionDescriptor(this.region<a name="line.939"></a>
-<span class="sourceLineNo">940</span>        .getRegionInfo(), mismatchedRegionName ? fakeEncodedNameAsBytes : null, family,<a name="line.940"></a>
-<span class="sourceLineNo">941</span>            storeFiles, Lists.newArrayList(newFile),<a name="line.941"></a>
-<span class="sourceLineNo">942</span>            region.getRegionFileSystem().getStoreDir(Bytes.toString(family)));<a name="line.942"></a>
-<span class="sourceLineNo">943</span><a name="line.943"></a>
-<span class="sourceLineNo">944</span>      WALUtil.writeCompactionMarker(region.getWAL(), this.region.getReplicationScope(),<a name="line.944"></a>
-<span class="sourceLineNo">945</span>          this.region.getRegionInfo(), compactionDescriptor, region.getMVCC());<a name="line.945"></a>
-<span class="sourceLineNo">946</span><a name="line.946"></a>
-<span class="sourceLineNo">947</span>      Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.947"></a>
-<span class="sourceLineNo">948</span><a name="line.948"></a>
-<span class="sourceLineNo">949</span>      Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", 1000));<a name="line.949"></a>
-<span class="sourceLineNo">950</span>      fs.create(recoveredEdits);<a name="line.950"></a>
-<span class="sourceLineNo">951</span>      WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.951"></a>
-<span class="sourceLineNo">952</span><a name="line.952"></a>
-<span class="sourceLineNo">953</span>      long time = System.nanoTime();<a name="line.953"></a>
-<span class="sourceLineNo">954</span><a name="line.954"></a>
-<span class="sourceLineNo">955</span>      writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, 10, time,<a name="line.955"></a>
-<span class="sourceLineNo">956</span>          HConstants.DEFAULT_CLUSTER_ID), WALEdit.createCompaction(region.getRegionInfo(),<a name="line.956"></a>
-<span class="sourceLineNo">957</span>          compactionDescriptor)));<a name="line.957"></a>
-<span class="sourceLineNo">958</span>      writer.close();<a name="line.958"></a>
-<span class="sourceLineNo">959</span><a name="line.959"></a>
-<span class="sourceLineNo">960</span>      // close the region now, and reopen again<a name="line.960"></a>
-<span class="sourceLineNo">961</span>      region.getTableDescriptor();<a name="line.961"></a>
-<span class="sourceLineNo">962</span>      region.getRegionInfo();<a name="line.962"></a>
-<span class="sourceLineNo">963</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.963"></a>
-<span class="sourceLineNo">964</span>      try {<a name="line.964"></a>
-<span class="sourceLineNo">965</span>        region = HRegion.openHRegion(region, null);<a name="line.965"></a>
-<span class="sourceLineNo">966</span>      } catch (WrongRegionException wre) {<a name="line.966"></a>
-<span class="sourceLineNo">967</span>        fail("Matching encoded region name should not have produced WrongRegionException");<a name="line.967"></a>
-<span class="sourceLineNo">968</span>      }<a name="line.968"></a>
-<span class="sourceLineNo">969</span><a name="line.969"></a>
-<span class="sourceLineNo">970</span>      // now check whether we have only one store file, the compacted one<a name="line.970"></a>
-<span class="sourceLineNo">971</span>      Collection&lt;HStoreFile&gt; sfs = region.getStore(family).getStorefiles();<a name="line.971"></a>
-<span class="sourceLineNo">972</span>      for (HStoreFile sf : sfs) {<a name="line.972"></a>
-<span class="sourceLineNo">973</span>        LOG.info(Objects.toString(sf.getPath()));<a name="line.973"></a>
-<span class="sourceLineNo">974</span>      }<a name="line.974"></a>
-<span class="sourceLineNo">975</span>      if (!mismatchedRegionName) {<a name="line.975"></a>
-<span class="sourceLineNo">976</span>        assertEquals(1, region.getStore(family).getStorefilesCount());<a name="line.976"></a>
-<span class="sourceLineNo">977</span>      }<a name="line.977"></a>
-<span class="sourceLineNo">978</span>      files = FSUtils.listStatus(fs, tmpDir);<a name="line.978"></a>
-<span class="sourceLineNo">979</span>      assertTrue("Expected to find 0 files inside " + tmpDir, files == null || files.length == 0);<a name="line.979"></a>
-<span class="sourceLineNo">980</span><a name="line.980"></a>
-<span class="sourceLineNo">981</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.981"></a>
-<span class="sourceLineNo">982</span>        Get get = new Get(Bytes.toBytes(i));<a name="line.982"></a>
-<span class="sourceLineNo">983</span>        Result result = region.get(get);<a name="line.983"></a>
-<span class="sourceLineNo">984</span>        byte[] value = result.getValue(family, Bytes.toBytes(i));<a name="line.984"></a>
-<span class="sourceLineNo">985</span>        assertArrayEquals(Bytes.toBytes(i), value);<a name="line.985"></a>
-<span class="sourceLineNo">986</span>      }<a name="line.986"></a>
-<span class="sourceLineNo">987</span>    } finally {<a name="line.987"></a>
-<span class="sourceLineNo">988</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.988"></a>
-<span class="sourceLineNo">989</span>      this.region = null;<a name="line.989"></a>
-<span class="sourceLineNo">990</span>      wals.close();<a name="line.990"></a>
-<span class="sourceLineNo">991</span>      CONF.setClass(HConstants.REGION_IMPL, HRegion.class, Region.class);<a name="line.991"></a>
-<span class="sourceLineNo">992</span>    }<a name="line.992"></a>
-<span class="sourceLineNo">993</span>  }<a name="line.993"></a>
-<span class="sourceLineNo">994</span><a name="line.994"></a>
-<span class="sourceLineNo">995</span>  @Test<a name="line.995"></a>
-<span class="sourceLineNo">996</span>  public void testFlushMarkers() throws Exception {<a name="line.996"></a>
-<span class="sourceLineNo">997</span>    // tests that flush markers are written to WAL and handled at recovered edits<a name="line.997"></a>
-<span class="sourceLineNo">998</span>    byte[] family = Bytes.toBytes("family");<a name="line.998"></a>
-<span class="sourceLineNo">999</span>    Path logDir = TEST_UTIL.getDataTestDirOnTestFS(method + ".log");<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>    final Configuration walConf = new Configuration(TEST_UTIL.getConfiguration());<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>    final WALFactory wals = new WALFactory(walConf, method);<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>    final WAL wal = wals.getWAL(RegionInfoBuilder.newBuilder(tableName).build());<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span><a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>    this.region = initHRegion(tableName, HConstants.EMPTY_START_ROW,<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>      HConstants.EMPTY_END_ROW, false, Durability.USE_DEFAULT, wal, family);<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>    try {<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span><a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>      long maxSeqId = 3;<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>      long minSeqId = 0;<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span><a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>        Put put = new Put(Bytes.toBytes(i));<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>        put.addColumn(family, Bytes.toBytes(i), Bytes.toBytes(i));<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>        region.put(put);<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>        region.flush(true);<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>      }<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span><a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>      // this will create a region with 3 files from flush<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>      assertEquals(3, region.getStore(family).getStorefilesCount());<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>      List&lt;String&gt; storeFiles = new ArrayList&lt;&gt;(3);<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>      for (HStoreFile sf : region.getStore(family).getStorefiles()) {<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>        storeFiles.add(sf.getPath().getName());<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>      }<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span><a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>      // now verify that the flush markers are written<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>      wal.shutdown();<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>      WAL.Reader reader = WALFactory.createReader(fs, AbstractFSWALProvider.getCurrentFileName(wal),<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>        TEST_UTIL.getConfiguration());<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>      try {<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>        List&lt;WAL.Entry&gt; flushDescriptors = new ArrayList&lt;&gt;();<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>        long lastFlushSeqId = -1;<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>        while (true) {<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>          WAL.Entry entry = reader.next();<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>          if (entry == null) {<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>            break;<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>          }<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>          Cell cell = entry.getEdit().getCells().get(0);<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>          if (WALEdit.isMetaEditFamily(cell)) {<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>            FlushDescriptor flushDesc = WALEdit.getFlushDescriptor(cell);<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>            assertNotNull(flushDesc);<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>            assertArrayEquals(tableName.getName(), flushDesc.getTableName().toByteArray());<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>            if (flushDesc.getAction() == FlushAction.START_FLUSH) {<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>              assertTrue(flushDesc.getFlushSequenceNumber() &gt; lastFlushSeqId);<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>            } else if (flushDesc.getAction() == FlushAction.COMMIT_FLUSH) {<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>              assertTrue(flushDesc.getFlushSequenceNumber() == lastFlushSeqId);<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>            }<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>            lastFlushSeqId = flushDesc.getFlushSequenceNumber();<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>            assertArrayEquals(regionName, flushDesc.getEncodedRegionName().toByteArray());<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>            assertEquals(1, flushDesc.getStoreFlushesCount()); //only one store<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>            StoreFlushDescriptor storeFlushDesc = flushDesc.getStoreFlushes(0);<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>            assertArrayEquals(family, storeFlushDesc.getFamilyName().toByteArray());<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>            assertEquals("family", storeFlushDesc.getStoreHomeDir());<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>            if (flushDesc.getAction() == FlushAction.START_FLUSH) {<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>              assertEquals(0, storeFlushDesc.getFlushOutputCount());<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>            } else {<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>              assertEquals(1, storeFlushDesc.getFlushOutputCount()); //only one file from flush<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>              assertTrue(storeFiles.contains(storeFlushDesc.getFlushOutput(0)));<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>            }<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span><a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>            flushDescriptors.add(entry);<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>          }<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>        }<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span><a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>        assertEquals(3 * 2, flushDescriptors.size()); // START_FLUSH and COMMIT_FLUSH per flush<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span><a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>        // now write those markers to the recovered edits again.<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span><a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>        Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span><a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", 1000));<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>        fs.create(recoveredEdits);<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span><a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>        for (WAL.Entry entry : flushDescriptors) {<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>          writer.append(entry);<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>        }<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>        writer.close();<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      } finally {<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>        if (null != reader) {<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>          try {<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>            reader.close();<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>          } catch (IOException exception) {<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>            LOG.warn("Problem closing wal: " + exception.getMessage());<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>            LOG.debug("exception details", exception);<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>          }<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>        }<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>      }<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span><a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>      // close the region now, and reopen again<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>      region = HRegion.openHRegion(region, null);<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span><a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>      // now check whether we have can read back the data from region<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>        Get get = new Get(Bytes.toBytes(i));<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>        Result result = region.get(get);<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>        byte[] value = result.getValue(family, Bytes.toBytes(i));<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>        assertArrayEquals(Bytes.toBytes(i), value);<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>      }<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>    } finally {<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>      this.region = null;<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>      wals.close();<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>    }<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>  }<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span><a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>  static class IsFlushWALMarker implements ArgumentMatcher&lt;WALEdit&gt; {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>    volatile FlushAction[] actions;<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>    public IsFlushWALMarker(FlushAction... actions) {<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>      this.actions = actions;<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>    }<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>    @Override<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>    public boolean matches(WALEdit edit) {<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>      List&lt;Cell&gt; cells = edit.getCells();<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>      if (cells.isEmpty()) {<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>        return false;<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>      }<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>      if (WALEdit.isMetaEditFamily(cells.get(0))) {<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>        FlushDescriptor desc;<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>        try {<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>          desc = WALEdit.getFlushDescriptor(cells.get(0));<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>        } catch (IOException e) {<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>          LOG.warn(e.toString(), e);<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>          return false;<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>        }<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>        if (desc != null) {<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>          for (FlushAction action : actions) {<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>            if (desc.getAction() == action) {<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>              return true;<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>            }<a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>          }<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>        }<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>      }<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>      return false;<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>    }<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>    public IsFlushWALMarker set(FlushAction... actions) {<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>      this.actions = actions;<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>      return this;<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>    }<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>  }<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span><a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>  @Test<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>  public void testFlushMarkersWALFail() throws Exception {<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>    // test the cases where the WAL append for flush markers fail.<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>    byte[] family = Bytes.toBytes("family");<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span><a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>    // spy an actual WAL implementation to throw exception (was not able to mock)<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>    Path logDir = TEST_UTIL.getDataTestDirOnTestFS(method + "log");<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span><a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>    final Configuration walConf = new Configuration(TEST_UTIL.getConfiguration());<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>    // Make up a WAL that we can manipulate at append time.<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    class FailAppendFlushMarkerWAL extends FSHLog {<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>      volatile FlushAction [] flushActions = null;<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span><a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>      public FailAppendFlushMarkerWAL(FileSystem fs, Path root, String logDir, Configuration conf)<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>      throws IOException {<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>        super(fs, root, logDir, conf);<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>      }<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span><a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>      @Override<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>      protected Writer createWriterInstance(Path path) throws IOException {<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>        final Writer w = super.createWriterInstance(path);<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>        return new Writer() {<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>          @Override<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>          public void close() throws IOException {<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>            w.close();<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>          }<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span><a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>          @Override<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>          public void sync(boolean forceSync) throws IOException {<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>            w.sync(forceSync);<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>          }<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span><a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>          @Override<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>          public void append(Entry entry) throws IOException {<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>            List&lt;Cell&gt; cells = entry.getEdit().getCells();<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>            if (WALEdit.isMetaEditFamily(cells.get(0))) {<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>              FlushDescriptor desc = WALEdit.getFlushDescriptor(cells.get(0));<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>              if (desc != null) {<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>                for (FlushAction flushAction: flushActions) {<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>                  if (desc.getAction().equals(flushAction)) {<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>                    throw new IOException("Failed to append flush marker! " + flushAction);<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>                  }<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>                }<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>              }<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>            }<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>            w.append(entry);<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>          }<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span><a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>          @Override<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>          public long getLength() {<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>            return w.getLength();<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>          }<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>        };<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>      }<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>    }<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>    FailAppendFlushMarkerWAL wal =<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>      new FailAppendFlushMarkerWAL(FileSystem.get(walConf), FSUtils.getRootDir(walConf),<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>        method, walConf);<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>    wal.init();<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>    this.region = initHRegion(tableName, HConstants.EMPTY_START_ROW,<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>      HConstants.EMPTY_END_ROW, false, Durability.USE_DEFAULT, wal, family);<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>    int i = 0;<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>    Put put = new Put(Bytes.toBytes(i));<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>    put.setDurability(Durability.SKIP_WAL); // have to skip mocked wal<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>    put.addColumn(family, Bytes.toBytes(i), Bytes.toBytes(i));<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>    region.put(put);<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span><a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>    // 1. Test case where START_FLUSH throws exception<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>    wal.flushActions = new FlushAction [] {FlushAction.START_FLUSH};<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span><a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>    // start cache flush will throw exception<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>    try {<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>      region.flush(true);<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>      fail("This should have thrown exception");<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>    } catch (DroppedSnapshotException unexpected) {<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>      // this should not be a dropped snapshot exception. Meaning that RS will not abort<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>      throw unexpected;<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>    } catch (IOException expected) {<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>      // expected<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>    }<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>    // The WAL is hosed now. It has two edits appended. We cannot roll the log without it<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>    // throwing a DroppedSnapshotException to force an abort. Just clean up the mess.<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>    region.close(true);<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>    wal.close();<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span><a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>    // 2. Test case where START_FLUSH succeeds but COMMIT_FLUSH will throw exception<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>    wal.flushActions = new FlushAction [] {FlushAction.COMMIT_FLUSH};<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>    wal = new FailAppendFlushMarkerWAL(FileSystem.get(walConf), FSUtils.getRootDir(walConf),<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>          method, walConf);<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>    wal.init();<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>    this.region = initHRegion(tableName, HConstants.EMPTY_START_ROW,<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>      HConstants.EMPTY_END_ROW, false, Durability.USE_DEFAULT, wal, family);<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    region.put(put);<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span><a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>    // 3. Test case where ABORT_FLUSH will throw exception.<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>    // Even if ABORT_FLUSH throws exception, we should not fail with IOE, but continue with<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>    // DroppedSnapshotException. Below COMMMIT_FLUSH will cause flush to abort<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>    wal.flushActions = new FlushAction [] {FlushAction.COMMIT_FLUSH, FlushAction.ABORT_FLUSH};<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span><a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>    try {<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>      region.flush(true);<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>      fail("This should have thrown exception");<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>    } catch (DroppedSnapshotException expected) {<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>      // we expect this exception, since we were able to write the snapshot, but failed to<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span>      // write the flush marker to WAL<a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>    } catch (IOException unexpected) {<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>      throw unexpected;<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>    }<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>  }<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span><a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>  @Test<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>  public void testGetWhileRegionClose() throws IOException {<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>    Configuration hc = initSplit();<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>    int numRows = 100;<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>    byte[][] families = { fam1, fam2, fam3 };<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span><a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>    // Setting up region<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>    this.region = initHRegion(tableName, method, hc, families);<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>    // Put data in region<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>    final int startRow = 100;<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>    putData(startRow, numRows, qual1, families);<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>    putData(startRow, numRows, qual2, families);<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>    putData(startRow, numRows, qual3, families);<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    final AtomicBoolean done = new AtomicBoolean(false);<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>    final AtomicInteger gets = new AtomicInteger(0);<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>    GetTillDoneOrException[] threads = new GetTillDoneOrException[10];<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>    try {<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>      // Set ten threads running concurrently getting from the region.<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>      for (int i = 0; i &lt; threads.length / 2; i++) {<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>        threads[i] = new GetTillDoneOrException(i, Bytes.toBytes("" + startRow), done, gets);<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>        threads[i].setDaemon(true);<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>        threads[i].start();<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span>      }<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>      // Artificially make the condition by setting closing flag explicitly.<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>      // I can't make the issue happen with a call to region.close().<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>      this.region.closing.set(true);<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>      for (int i = threads.length / 2; i &lt; threads.length; i++) {<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>        threads[i] = new GetTillDoneOrException(i, Bytes.toBytes("" + startRow), done, gets);<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>        threads[i].setDaemon(true);<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>        threads[i].start();<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>      }<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>    } finally {<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>      if (this.region != null) {<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>        HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>        this.region = null;<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>      }<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>    }<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>    done.set(true);<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>    for (GetTillDoneOrException t : threads) {<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>      try {<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>        t.join();<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>      } catch (InterruptedException e) {<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>        e.printStackTrace();<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>      }<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>      if (t.e != null) {<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>        LOG.info("Exception=" + t.e);<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>        assertFalse("Found a NPE in " + t.getName(), t.e instanceof NullPointerException);<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>      }<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>    }<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>  }<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span><a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>  /*<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>   * Thread that does get on single row until 'done' flag is flipped. If an<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>   * exception causes us to fail, it records it.<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>   */<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>  class GetTillDoneOrException extends Thread {<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>    private final Get g;<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>    private final AtomicBoolean done;<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>    private final AtomicInteger count;<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>    private Exception e;<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span><a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>    GetTillDoneOrException(final int i, final byte[] r, final AtomicBoolean d,<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>        final AtomicInteger c) {<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>      super("getter." + i);<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>      this.g = new Get(r);<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>      this.done = d;<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>      this.count = c;<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>    }<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span><a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    @Override<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span>    public void run() {<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>      while (!this.done.get()) {<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>        try {<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>          assertTrue(region.get(g).size() &gt; 0);<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>          this.count.incrementAndGet();<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>        } catch (Exception e) {<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>          this.e = e;<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>          break;<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>        }<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>      }<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>    }<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>  }<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span><a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>  /*<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>   * An involved filter test. Has multiple column families and deletes in mix.<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>   */<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>  @Test<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>  public void testWeirdCacheBehaviour() throws Exception {<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>    byte[][] FAMILIES = new byte[][] { Bytes.toBytes("trans-blob"), Bytes.toBytes("trans-type"),<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>        Bytes.toBytes("trans-date"), Bytes.toBytes("trans-tags"), Bytes.toBytes("trans-group") };<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>    this.region = initHRegion(tableName, method, CONF, FAMILIES);<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>    String value = "this is the value";<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>    String value2 = "this is some other value";<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>    String keyPrefix1 = "prefix1";<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>    String keyPrefix2 = "prefix2";<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>    String keyPrefix3 = "prefix3";<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>    putRows(this.region, 3, value, keyPrefix1);<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>    putRows(this.region, 3, value, keyPrefix2);<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>    putRows(this.region, 3, value, keyPrefix3);<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>    putRows(this.region, 3, value2, keyPrefix1);<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>    putRows(this.region, 3, value2, keyPrefix2);<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>    putRows(this.region, 3, value2, keyPrefix3);<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>    System.out.println("Checking values for key: " + keyPrefix1);<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>    assertEquals("Got back incorrect number of rows from scan", 3,<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>        getNumberOfRows(keyPrefix1, value2, this.region));<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>    System.out.println("Checking values for key: " + keyPrefix2);<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>    assertEquals("Got back incorrect number of rows from scan", 3,<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>        getNumberOfRows(keyPrefix2, value2, this.region));<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>    System.out.println("Checking values for key: " + keyPrefix3);<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>    assertEquals("Got back incorrect number of rows from scan", 3,<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>        getNumberOfRows(keyPrefix3, value2, this.region));<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>    deleteColumns(this.region, value2, keyPrefix1);<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>    deleteColumns(this.region, value2, keyPrefix2);<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>    deleteColumns(this.region, value2, keyPrefix3);<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>    System.out.println("Starting important checks.....");<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>    assertEquals("Got back incorrect number of rows from scan: " + keyPrefix1, 0,<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>        getNumberOfRows(keyPrefix1, value2, this.region));<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>    assertEquals("Got back incorrect number of rows from scan: " + keyPrefix2, 0,<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>        getNumberOfRows(keyPrefix2, value2, this.region));<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>    assertEquals("Got back incorrect number of rows from scan: " + keyPrefix3, 0,<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>        getNumberOfRows(keyPrefix3, value2, this.region));<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>  }<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span><a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>  @Test<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>  public void testAppendWithReadOnlyTable() throws Exception {<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>    this.region = initHRegion(tableName, method, CONF, true, Bytes.toBytes("somefamily"));<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span>    boolean exceptionCaught = false;<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>    Append append = new Append(Bytes.toBytes("somerow"));<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>    append.setDurability(Durability.SKIP_WAL);<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>    append.addColumn(Bytes.toBytes("somefamily"), Bytes.toBytes("somequalifier"),<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>        Bytes.toBytes("somevalue"));<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>    try {<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>      region.append(append);<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>    } catch (IOException e) {<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>      exceptionCaught = true;<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>    }<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>    assertTrue(exceptionCaught == true);<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>  }<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span><a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>  @Test<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>  public void testIncrWithReadOnlyTable() throws Exception {<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>    this.region = initHRegion(tableName, method, CONF, true, Bytes.toBytes("somefamily"));<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>    boolean exceptionCaught = false;<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>    Increment inc = new Increment(Bytes.toBytes("somerow"));<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>    inc.setDurability(Durability.SKIP_WAL);<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>    inc.addColumn(Bytes.toBytes("somefamily"), Bytes.toBytes("somequalifier"), 1L);<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>    try {<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>      region.increment(inc);<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>    } catch (IOException e) {<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>      exceptionCaught = true;<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>    }<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>    assertTrue(exceptionCaught == true);<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>  }<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span><a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>  private void deleteColumns(HRegion r, String value, String keyPrefix) throws IOException {<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>    InternalScanner scanner = buildScanner(keyPrefix, value, r);<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>    int count = 0;<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>    boolean more = false;<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>    do {<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>      more = scanner.next(results);<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>      if (results != null &amp;&amp; !results.isEmpty())<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>        count++;<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>      else<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>        break;<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>      Delete delete = new Delete(CellUtil.cloneRow(results.get(0)));<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>      delete.addColumn(Bytes.toBytes("trans-tags"), Bytes.toBytes("qual2"));<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>      r.delete(delete);<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>      results.clear();<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>    } while (more);<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>    assertEquals("Did not perform correct number of deletes", 3, count);<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>  }<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span><a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>  private int getNumberOfRows(String keyPrefix, String value, HRegion r) throws Exception {<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>    InternalScanner resultScanner = buildScanner(keyPrefix, value, r);<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>    int numberOfResults = 0;<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>    boolean more = false;<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>    do {<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>      more = resultScanner.next(results);<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>      if (results != null &amp;&amp; !results.isEmpty())<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>        numberOfResults++;<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>      else<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>        break;<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>      for (Cell kv : results) {<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>        System.out.println("kv=" + kv.toString() + ", " + Bytes.toString(CellUtil.cloneValue(kv)));<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>      }<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>      results.clear();<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>    } while (more);<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>    return numberOfResults;<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>  }<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span><a name="line.1451"></a>
-<span class="sourceLineNo">1452</span>  private InternalScanner buildScanner(String keyPrefix, String value, HRegion r)<a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>      throws IOException {<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>    // Defaults FilterList.Operator.MUST_PASS_ALL.<a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>    FilterList allFilters = new FilterList();<a name="line.1455"></a>
-<span class="sourceLineNo">1456</span>    allFilters.addFilter(new PrefixFilter(Bytes.toBytes(keyPrefix)));<a name="line.1456"></a>
-<span class="sourceLineNo">1457</span>    // Only return rows where this column value exists in the row.<a name="line.1457"></a>
-<span class="sourceLineNo">1458</span>    SingleColumnValueFilter filter = new SingleColumnValueFilter(Bytes.toBytes("trans-tags"),<a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>        Bytes.toBytes("qual2"), CompareOperator.EQUAL, Bytes.toBytes(value));<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>    filter.setFilterIfMissing(true);<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>    allFilters.addFilter(filter);<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span>    Scan scan = new Scan();<a name="line.1462"></a>
-<span class="sourceLineNo">1463</span>    scan.addFamily(Bytes.toBytes("trans-blob"));<a name="line.1463"></a>
-<span class="sourceLineNo">1464</span>    scan.addFamily(Bytes.toBytes("trans-type"));<a name="line.1464"></a>
-<span class="sourceLineNo">1465</span>    scan.addFamily(Bytes.toBytes("trans-date"));<a name="line.1465"></a>
-<span class="sourceLineNo">1466</span>    scan.addFamily(Bytes.toBytes("trans-tags"));<a name="line.1466"></a>
-<span class="sourceLineNo">1467</span>    scan.addFamily(Bytes.toBytes("trans-group"));<a name="line.1467"></a>
-<span class="sourceLineNo">1468</span>    scan.setFilter(allFilters);<a name="line.1468"></a>
-<span class="sourceLineNo">1469</span>    return r.getScanner(scan);<a name="line.1469"></a>
-<span class="sourceLineNo">1470</span>  }<a name="line.1470"></a>
-<span class="sourceLineNo">1471</span><a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>  private void putRows(HRegion r, int numRows, String value, String key) throws IOException {<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span>    for (int i = 0; i &lt; numRows; i++) {<a name="line.1473"></a>
-<span class="sourceLineNo">1474</span>      String row = key + "_" + i/* UUID.randomUUID().toString() */;<a name="line.1474"></a>
-<span class="sourceLineNo">1475</span>      System.out.println(String.format("Saving row: %s, with value %s", row, value));<a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>      Put put = new Put(Bytes.toBytes(row));<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>      put.setDurability(Durability.SKIP_WAL);<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span>      put.addColumn(Bytes.toBytes("trans-blob"), null, Bytes.toBytes("value for blob"));<a name="line.1478"></a>
-<span class="sourceLineNo">1479</span>      put.addColumn(Bytes.toBytes("trans-type"), null, Bytes.toBytes("statement"));<a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>      put.addColumn(Bytes.toBytes("trans-date"), null, Bytes.toBytes("20090921010101999"));<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>      put.addColumn(Bytes.toBytes("trans-tags"), Bytes.toBytes("qual2"), Bytes.toBytes(value));<a name="line.1481"></a>
-<span class="sourceLineNo">1482</span>      put.addColumn(Bytes.toBytes("trans-group"), null, Bytes.toBytes("adhocTransactionGroupId"));<a name="line.1482"></a>
-<span class="sourceLineNo">1483</span>      r.put(put);<a name="line.1483"></a>
-<span class="sourceLineNo">1484</span>    }<a name="line.1484"></a>
-<span class="sourceLineNo">1485</span>  }<a name="line.1485"></a>
-<span class="sourceLineNo">1486</span><a name="line.1486"></a>
-<span class="sourceLineNo">1487</span>  @Test<a name="line.1487"></a>
-<span class="sourceLineNo">1488</span>  public void testFamilyWithAndWithoutColon() throws Exception {<a name="line.1488"></a>
-<span class="sourceLineNo">1489</span>    byte[] cf = Bytes.toBytes(COLUMN_FAMILY);<a name="line.1489"></a>
-<span class="sourceLineNo">1490</span>    this.region = initHRegion(tableName, method, CONF, cf);<a name="line.1490"></a>
-<span class="sourceLineNo">1491</span>    Put p = new Put(tableName.toBytes());<a name="line.1491"></a>
-<span class="sourceLineNo">1492</span>    byte[] cfwithcolon = Bytes.toBytes(COLUMN_FAMILY + ":");<a name="line.1492"></a>
-<span class="sourceLineNo">1493</span>    p.addColumn(cfwithcolon, cfwithcolon, cfwithcolon);<a name="line.1493"></a>
-<span class="sourceLineNo">1494</span>    boolean exception = false;<a name="line.1494"></a>
-<span class="sourceLineNo">1495</span>    try {<a name="line.1495"></a>
-<span class="sourceLineNo">1496</span>      this.region.put(p);<a name="line.1496"></a>
-<span class="sourceLineNo">1497</span>    } catch (NoSuchColumnFamilyException e) {<a name="line.1497"></a>
-<span class="sourceLineNo">1498</span>      exception = true;<a name="line.1498"></a>
-<span class="sourceLineNo">1499</span>    }<a name="line.1499"></a>
-<span class="sourceLineNo">1500</span>    assertTrue(exception);<a name="line.1500"></a>
-<span class="sourceLineNo">1501</span>  }<a name="line.1501"></a>
-<span class="sourceLineNo">1502</span><a name="line.1502"></a>
-<span class="sourceLineNo">1503</span>  @Test<a name="line.1503"></a>
-<span class="sourceLineNo">1504</span>  public void testBatchPut_whileNoRowLocksHeld() throws IOException {<a name="line.1504"></a>
-<span class="sourceLineNo">1505</span>    final Put[] puts = new Put[10];<a name="line.1505"></a>
-<span class="sourceLineNo">1506</span>    MetricsWALSource source = CompatibilitySingletonFactory.getInstance(MetricsWALSource.class);<a name="line.1506"></a>
-<span class="sourceLineNo">1507</span>    long syncs = prepareRegionForBachPut(puts, source, false);<a name="line.1507"></a>
-<span class="sourceLineNo">1508</span><a name="line.1508"></a>
-<span class="sourceLineNo">1509</span>    OperationStatus[] codes = this.region.batchMutate(puts);<a name="line.1509"></a>
-<span class="sourceLineNo">1510</span>    assertEquals(10, codes.length);<a name="line.1510"></a>
-<span class="sourceLineNo">1511</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.1511"></a>
-<span class="sourceLineNo">1512</span>      assertEquals(OperationStatusCode.SUCCESS, codes[i].getOperationStatusCode());<a name="line.1512"></a>
-<span class="sourceLineNo">1513</span>    }<a name="line.1513"></a>
-<span class="sourceLineNo">1514</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs + 1, source);<a name="line.1514"></a>
-<span class="sourceLineNo">1515</span><a name="line.1515"></a>
-<span class="sourceLineNo">1516</span>    LOG.info("Next a batch put with one invalid family");<a name="line.1516"></a>
-<span class="sourceLineNo">1517</span>    puts[5].addColumn(Bytes.toBytes("BAD_CF"), qual, value);<a name="line.1517"></a>
-<span class="sourceLineNo">1518</span>    codes = this.region.batchMutate(puts);<a name="line.1518"></a>
-<span class="sourceLineNo">1519</span>    assertEquals(10, codes.length);<a name="line.1519"></a>
-<span class="sourceLineNo">1520</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.1520"></a>
-<span class="sourceLineNo">1521</span>      assertEquals((i == 5) ? OperationStatusCode.BAD_FAMILY : OperationStatusCode.SUCCESS,<a name="line.1521"></a>
-<span class="sourceLineNo">1522</span>          codes[i].getOperationStatusCode());<a name="line.1522"></a>
-<span class="sourceLineNo">1523</span>    }<a name="line.1523"></a>
-<span class="sourceLineNo">1524</span><a name="line.1524"></a>
-<span class="sourceLineNo">1525</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs + 2, source);<a name="line.1525"></a>
-<span class="sourceLineNo">1526</span>  }<a name="line.1526"></a>
-<span class="sourceLineNo">1527</span><a name="line.1527"></a>
-<span class="sourceLineNo">1528</span>  @Test<a name="line.1528"></a>
-<span class="sourceLineNo">1529</span>  public void testBatchPut_whileMultipleRowLocksHeld() throws Exception {<a name="line.1529"></a>
-<span class="sourceLineNo">1530</span>    final Put[] puts = new Put[10];<a name="line.1530"></a>
-<span class="sourceLineNo">1531</span>    MetricsWALSource source = CompatibilitySingletonFactory.getInstance(MetricsWALSource.class);<a name="line.1531"></a>
-<span class="sourceLineNo">1532</span>    long syncs = prepareRegionForBachPut(puts, source, false);<a name="line.1532"></a>
-<span class="sourceLineNo">1533</span><a name="line.1533"></a>
-<span class="sourceLineNo">1534</span>    puts[5].addColumn(Bytes.toBytes("BAD_CF"), qual, value);<a name="line.1534"></a>
-<span class="sourceLineNo">1535</span><a name="line.1535"></a>
-<span class="sourceLineNo">1536</span>    LOG.info("batchPut will have to break into four batches to avoid row locks");<a name="line.1536"></a>
-<span class="sourceLineNo">1537</span>    RowLock rowLock1 = region.getRowLock(Bytes.toBytes("row_2"));<a name="line.1537"></a>
-<span class="sourceLineNo">1538</span>    RowLock rowLock2 = region.getRowLock(Bytes.toBytes("row_1"));<a name="line.1538"></a>
-<span class="sourceLineNo">1539</span>    RowLock rowLock3 = region.getRowLock(Bytes.toBytes("row_3"));<a name="line.1539"></a>
-<span class="sourceLineNo">1540</span>    RowLock rowLock4 = region.getRowLock(Bytes.toBytes("row_3"), true);<a name="line.1540"></a>
-<span class="sourceLineNo">1541</span><a name="line.1541"></a>
-<span class="sourceLineNo">1542</span>    MultithreadedTestUtil.TestContext ctx = new MultithreadedTestUtil.TestContext(CONF);<a name="line.1542"></a>
-<span class="sourceLineNo">1543</span>    final AtomicReference&lt;OperationStatus[]&gt; retFromThread = new AtomicReference&lt;&gt;();<a name="line.1543"></a>
-<span class="sourceLineNo">1544</span>    final CountDownLatch startingPuts = new CountDownLatch(1);<a name="line.1544"></a>
-<span class="sourceLineNo">1545</span>    final CountDownLatch startingClose = new CountDownLatch(1);<a name="line.1545"></a>
-<span class="sourceLineNo">1546</span>    TestThread putter = new TestThread(ctx) {<a name="line.1546"></a>
-<span class="sourceLineNo">1547</span>      @Override<a name="line.1547"></a>
-<span class="sourceLineNo">1548</span>      public void doWork() throws IOException {<a name="line.1548"></a>
-<span class="sourceLineNo">1549</span>        startingPuts.countDown();<a name="line.1549"></a>
-<span class="sourceLineNo">1550</span>        retFromThread.set(region.batchMutate(puts));<a name="line.1550"></a>
-<span class="sourceLineNo">1551</span>      }<a name="line.1551"></a>
-<span class="sourceLineNo">1552</span>    };<a name="line.1552"></a>
-<span class="sourceLineNo">1553</span>    LOG.info("...starting put thread while holding locks");<a name="line.1553"></a>
-<span class="sourceLineNo">1554</span>    ctx.addThread(putter);<a name="line.1554"></a>
-<span class="sourceLineNo">1555</span>    ctx.startThreads();<a name="line.1555"></a>
-<span class="sourceLineNo">1556</span><a name="line.1556"></a>
-<span class="sourceLineNo">1557</span>    // Now attempt to close the region from another thread.  Prior to HBASE-12565<a name="line.1557"></a>
-<span class="sourceLineNo">1558</span>    // this would cause the in-progress batchMutate operation to to fail with<a name="line.1558"></a>
-<span class="sourceLineNo">1559</span>    // exception because it use to release and re-acquire the close-guard lock<a name="line.1559"></a>
-<span class="sourceLineNo">1560</span>    // between batches.  Caller then didn't get status indicating which writes succeeded.<a name="line.1560"></a>
-<span class="sourceLineNo">1561</span>    // We now expect this thread to block until the batchMutate call finishes.<a name="line.1561"></a>
-<span class="sourceLineNo">1562</span>    Thread regionCloseThread = new TestThread(ctx) {<a name="line.1562"></a>
-<span class="sourceLineNo">1563</span>      @Override<a name="line.1563"></a>
-<span class="sourceLineNo">1564</span>      public void doWork() {<a name="line.1564"></a>
-<span class="sourceLineNo">1565</span>        try {<a name="line.1565"></a>
-<span class="sourceLineNo">1566</span>          startingPuts.await();<a name="line.1566"></a>
-<span class="sourceLineNo">1567</span>          // Give some time for the batch mutate to get in.<a name="line.1567"></a>
-<span class="sourceLineNo">1568</span>          // We don't want to race with the mutate<a name="line.1568"></a>
-<span class="sourceLineNo">1569</span>          Thread.sleep(10);<a name="line.1569"></a>
-<span class="sourceLineNo">1570</span>          startingClose.countDown();<a name="line.1570"></a>
-<span class="sourceLineNo">1571</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.1571"></a>
-<span class="sourceLineNo">1572</span>          region = null;<a name="line.1572"></a>
-<span class="sourceLineNo">1573</span>        } catch (IOException e) {<a name="line.1573"></a>
-<span class="sourceLineNo">1574</span>          throw new RuntimeException(e);<a name="line.1574"></a>
-<span class="sourceLineNo">1575</span>        } catch (InterruptedException e) {<a name="line.1575"></a>
-<span class="sourceLineNo">1576</span>          throw new RuntimeException(e);<a name="line.1576"></a>
-<span class="sourceLineNo">1577</span>        }<a name="line.1577"></a>
-<span class="sourceLineNo">1578</span>      }<a name="line.1578"></a>
-<span class="sourceLineNo">1579</span>    };<a name="line.1579"></a>
-<span class="sourceLineNo">1580</span>    regionCloseThread.start();<a name="line.1580"></a>
-<span class="sourceLineNo">1581</span><a name="line.1581"></a>
-<span class="sourceLineNo">1582</span>    startingClose.await();<a name="line.1582"></a>
-<span class="sourceLineNo">1583</span>    startingPuts.await();<a name="line.1583"></a>
-<span class="sourceLineNo">1584</span>    Thread.sleep(100);<a name="line.1584"></a>
-<span class="sourceLineNo">1585</span>    LOG.info("...releasing row lock 1, which should let put thread continue");<a name="line.1585"></a>
-<span class="sourceLineNo">1586</span>    rowLock1.release();<a name="line.1586"></a>
-<span class="sourceLineNo">1587</span>    rowLock2.release();<a name="line.1587"></a>
-<span class="sourceLineNo">1588</span>    rowLock3.release();<a name="line.1588"></a>
-<span class="sourceLineNo">1589</span>    waitForCounter(source, "syncTimeNumOps", syncs + 1);<a name="line.1589"></a>
-<span class="sourceLineNo">1590</span><a name="line.1590"></a>
-<span class="sourceLineNo">1591</span>    LOG.info("...joining on put thread");<a name="line.1591"></a>
-<span class="sourceLineNo">1592</span>    ctx.stop();<a name="line.1592"></a>
-<span class="sourceLineNo">1593</span>    regionCloseThread.join();<a name="line.1593"></a>
-<span class="sourceLineNo">1594</span><a name="line.1594"></a>
-<span class="sourceLineNo">1595</span>    OperationStatus[] codes = retFromThread.get();<a name="line.1595"></a>
-<span class="sourceLineNo">1596</span>    for (int i = 0; i &lt; codes.length; i++) {<a name="line.1596"></a>
-<span class="sourceLineNo">1597</span>      assertEquals((i == 5) ? OperationStatusCode.BAD_FAMILY : OperationStatusCode.SUCCESS,<a name="line.1597"></a>
-<span class="sourceLineNo">1598</span>          codes[i].getOperationStatusCode());<a name="line.1598"></a>
-<span class="sourceLineNo">1599</span>    }<a name="line.1599"></a>
-<span class="sourceLineNo">1600</span>    rowLock4.release();<a name="line.1600"></a>
-<span class="sourceLineNo">1601</span>  }<a name="line.1601"></a>
-<span class="sourceLineNo">1602</span><a name="line.1602"></a>
-<span class="sourceLineNo">1603</span>  private void waitForCounter(MetricsWALSource source, String metricName, long expectedCount)<a name="line.1603"></a>
-<span class="sourceLineNo">1604</span>      throws InterruptedException {<a name="line.1604"></a>
-<span class="sourceLineNo">1605</span>    long startWait = System.currentTimeMillis();<a name="line.1605"></a>
-<span class="sourceLineNo">1606</span>    long currentCount;<a name="line.1606"></a>
-<span class="sourceLineNo">1607</span>    while ((currentCount = metricsAssertHelper.getCounter(metricName, source)) &lt; expectedCount) {<a name="line.1607"></a>
-<span class="sourceLineNo">1608</span>      Thread.sleep(100);<a name="line.1608"></a>
-<span class="sourceLineNo">1609</span>      if (System.currentTimeMillis() - startWait &gt; 10000) {<a name="line.1609"></a>
-<span class="sourceLineNo">1610</span>        fail(String.format("Timed out waiting for '%s' &gt;= '%s', currentCount=%s", metricName,<a name="line.1610"></a>
-<span class="sourceLineNo">1611</span>            expectedCount, currentCount));<a name="line.1611"></a>
-<span class="sourceLineNo">1612</span>      }<a name="line.1612"></a>
-<span class="sourceLineNo">1613</span>    }<a name="line.1613"></a>
-<span class="sourceLineNo">1614</span>  }<a name="line.1614"></a>
-<span class="sourceLineNo">1615</span><a name="line.1615"></a>
-<span class="sourceLineNo">1616</span>  @Test<a name="line.1616"></a>
-<span class="sourceLineNo">1617</span>  public void testAtomicBatchPut() throws IOException {<a name="line.1617"></a>
-<span class="sourceLineNo">1618</span>    final Put[] puts = new Put[10];<a name="line.1618"></a>
-<span class="sourceLineNo">1619</span>    MetricsWALSource source = CompatibilitySingletonFactory.getInstance(MetricsWALSource.class);<a name="line.1619"></a>
-<span class="sourceLineNo">1620</span>    long syncs = prepareRegionForBachPut(puts, source, false);<a name="line.1620"></a>
-<span class="sourceLineNo">1621</span><a name="line.1621"></a>
-<span class="sourceLineNo">1622</span>    // 1. Straight forward case, should succeed<a name="line.1622"></a>
-<span class="sourceLineNo">1623</span>    MutationBatchOperation batchOp = new MutationBatchOperation(region, puts, true,<a name="line.1623"></a>
-<span class="sourceLineNo">1624</span>        HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.1624"></a>
-<span class="sourceLineNo">1625</span>    OperationStatus[] codes = this.region.batchMutate(batchOp);<a name="line.1625"></a>
-<span class="sourceLineNo">1626</span>    assertEquals(10, codes.length);<a name="line.1626"></a>
-<span class="sourceLineNo">1627</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.1627"></a>
-<span class="sourceLineNo">1628</span>      assertEquals(OperationStatusCode.SUCCESS, codes[i].getOperationStatusCode());<a name="line.1628"></a>
-<span class="sourceLineNo">1629</span>    }<a name="line.1629"></a>
-<span class="sourceLineNo">1630</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs + 1, source);<a name="line.1630"></a>
-<span class="sourceLineNo">1631</span><a name="line.1631"></a>
-<span class="sourceLineNo">1632</span>    // 2. Failed to get lock<a name="line.1632"></a>
-<span class="sourceLineNo">1633</span>    RowLock lock = region.getRowLock(Bytes.toBytes("row_" + 3));<a name="line.1633"></a>
-<span class="sourceLineNo">1634</span>    // Method {@link HRegion#getRowLock(byte[])} is reentrant. As 'row_3' is locked in this<a name="line.1634"></a>
-<span class="sourceLineNo">1635</span>    // thread, need to run {@link HRegion#batchMutate(HRegion.BatchOperation)} in different thread<a name="line.1635"></a>
-<span class="sourceLineNo">1636</span>    MultithreadedTestUtil.TestContext ctx = new MultithreadedTestUtil.TestContext(CONF);<a name="line.1636"></a>
-<span class="sourceLineNo">1637</span>    final AtomicReference&lt;IOException&gt; retFromThread = new AtomicReference&lt;&gt;();<a name="line.1637"></a>
-<span class="sourceLineNo">1638</span>    final CountDownLatch finishedPuts = new CountDownLatch(1);<a name="line.1638"></a>
-<span class="sourceLineNo">1639</span>    final MutationBatchOperation finalBatchOp = new MutationBatchOperation(region, puts, true,<a name="line.1639"></a>
-<span class="sourceLineNo">1640</span>        HConstants<a name="line.1640"></a>
-<span class="sourceLineNo">1641</span>        .NO_NONCE,<a name="line.1641"></a>
-<span class="sourceLineNo">1642</span>        HConstants.NO_NONCE);<a name="line.1642"></a>
-<span class="sourceLineNo">1643</span>    TestThread putter = new TestThread(ctx) {<a name="line.1643"></a>
-<span class="sourceLineNo">1644</span>      @Override<a name="line.1644"></a>
-<span class="sourceLineNo">1645</span>      public void doWork() throws IOException {<a name="line.1645"></a>
-<span class="sourceLineNo">1646</span>        try {<a name="line.1646"></a>
-<span class="sourceLineNo">1647</span>          region.batchMutate(finalBatchOp);<a name="line.1647"></a>
-<span class="sourceLineNo">1648</span>        } catch (IOException ioe) {<a name="line.1648"></a>
-<span class="sourceLineNo">1649</span>          LOG.error("test failed!", ioe);<a name="line.1649"></a>
-<span class="sourceLineNo">1650</span>          retFromThread.set(ioe);<a name="line.1650"></a>
-<span class="sourceLineNo">1651</span>        }<a name="line.1651"></a>
-<span class="sourceLineNo">1652</span>        finishedPuts.countDown();<a name="line.1652"></a>
-<span class="sourceLineNo">1653</span>      }<a name="line.1653"></a>
-<span class="sourceLineNo">1654</span>    };<a name="line.1654"></a>
-<span class="sourceLineNo">1655</span>    LOG.info("...starting put thread while holding locks");<a name="line.1655"></a>
-<span class="sourceLineNo">1656</span>    ctx.addThread(putter);<a name="line.1656"></a>
-<span class="sourceLineNo">1657</span>    ctx.startThreads();<a name="line.1657"></a>
-<span class="sourceLineNo">1658</span>    LOG.info("...waiting for batch puts while holding locks");<a name="line.1658"></a>
-<span class="sourceLineNo">1659</span>    try {<a name="line.1659"></a>
-<span class="sourceLineNo">1660</span>      finishedPuts.await();<a name="line.1660"></a>
-<span class="sourceLineNo">1661</span>    } catch (InterruptedException e) {<a name="line.1661"></a>
-<span class="sourceLineNo">1662</span>      LOG.error("Interrupted!", e);<a name="line.1662"></a>
-<span class="sourceLineNo">1663</span>    } finally {<a name="line.1663"></a>
-<span class="sourceLineNo">1664</span>      if (lock != null) {<a name="line.1664"></a>
-<span class="sourceLineNo">1665</span>        lock.release();<a name="line.1665"></a>
-<span class="sourceLineNo">1666</span>      }<a name="line.1666"></a>
-<span class="sourceLineNo">1667</span>    }<a name="line.1667"></a>
-<span class="sourceLineNo">1668</span>    assertNotNull(retFromThread.get());<a name="line.1668"></a>
-<span class="sourceLineNo">1669</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs + 1, source);<a name="line.1669"></a>
-<span class="sourceLineNo">1670</span><a name="line.1670"></a>
-<span class="sourceLineNo">1671</span>    // 3. Exception thrown in validation<a name="line.1671"></a>
-<span class="sourceLineNo">1672</span>    LOG.info("Next a batch put with one invalid family");<a name="line.1672"></a>
-<span class="sourceLineNo">1673</span>    puts[5].addColumn(Bytes.toBytes("BAD_CF"), qual, value);<a name="line.1673"></a>
-<span class="sourceLineNo">1674</span>    batchOp = new MutationBatchOperation(region, puts, true, HConstants.NO_NONCE,<a name="line.1674"></a>
-<span class="sourceLineNo">1675</span>        HConstants.NO_NONCE);<a name="line.1675"></a>
-<span class="sourceLineNo">1676</span>    thrown.expect(NoSuchColumnFamilyException.class);<a name="line.1676"></a>
-<span class="sourceLineNo">1677</span>    this.region.batchMutate(batchOp);<a name="line.1677"></a>
-<span class="sourceLineNo">1678</span>  }<a name="line.1678"></a>
-<span class="sourceLineNo">1679</span><a name="line.1679"></a>
-<span class="sourceLineNo">1680</span>  @Test<a name="line.1680"></a>
-<span class="sourceLineNo">1681</span>  public void testBatchPutWithTsSlop() throws Exception {<a name="line.1681"></a>
-<span class="sourceLineNo">1682</span>    // add data with a timestamp that is too recent for range. Ensure assert<a name="line.1682"></a>
-<span class="sourceLineNo">1683</span>    CONF.setInt("hbase.hregion.keyvalue.timestamp.slop.millisecs", 1000);<a name="line.1683"></a>
-<span class="sourceLineNo">1684</span>    final Put[] puts = new Put[10];<a name="line.1684"></a>
-<span class="sourceLineNo">1685</span>    MetricsWALSource source = CompatibilitySingletonFactory.getInstance(MetricsWALSource.class);<a name="line.1685"></a>
-<span class="sourceLineNo">1686</span><a name="line.1686"></a>
-<span class="sourceLineNo">1687</span>    long syncs = prepareRegionForBachPut(puts, source, true);<a name="line.1687"></a>
-<span class="sourceLineNo">1688</span><a name="line.1688"></a>
-<span class="sourceLineNo">1689</span>    OperationStatus[] codes = this.region.batchMutate(puts);<a name="line.1689"></a>
-<span class="sourceLineNo">1690</span>    assertEquals(10, codes.length);<a name="line.1690"></a>
-<span class="sourceLineNo">1691</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.1691"></a>
-<span class="sourceLineNo">1692</span>      assertEquals(OperationStatusCode.SANITY_CHECK_FAILURE, codes[i].getOperationStatusCode());<a name="line.1692"></a>
-<span class="sourceLineNo">1693</span>    }<a name="line.1693"></a>
-<span class="sourceLineNo">1694</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs, source);<a name="line.1694"></a>
-<span class="sourceLineNo">1695</span>  }<a name="line.1695"></a>
-<span class="sourceLineNo">1696</span><a name="line.1696"></a>
-<span class="sourceLineNo">1697</span>  /**<a name="line.1697"></a>
-<span class="sourceLineNo">1698</span>   * @return syncs initial syncTimeNumOps<a name="line.1698"></a>
-<span class="sourceLineNo">1699</span>   */<a name="line.1699"></a>
-<span class="sourceLineNo">1700</span>  private long prepareRegionForBachPut(final Put[] puts, final MetricsWALSource source,<a name="line.1700"></a>
-<span class="sourceLineNo">1701</span>      boolean slop) throws IOException {<a name="line.1701"></a>
-<span class="sourceLineNo">1702</span>    this.region = initHRegion(tableName, method, CONF, COLUMN_FAMILY_BYTES);<a name="line.1702"></a>
-<span class="sourceLineNo">1703</span><a name="line.1703"></a>
-<span class="sourceLineNo">1704</span>    LOG.info("First a batch put with all valid puts");<a name="line.1704"></a>
-<span class="sourceLineNo">1705</span>    for (int i = 0; i &lt; puts.length; i++) {<a name="line.1705"></a>
-<span class="sourceLineNo">1706</span>      puts[i] = slop ? new Put(Bytes.toBytes("row_" + i), Long.MAX_VALUE - 100) :<a name="line.1706"></a>
-<span class="sourceLineNo">1707</span>          new Put(Bytes.toBytes("row_" + i));<a name="line.1707"></a>
-<span class="sourceLineNo">1708</span>      puts[i].addColumn(COLUMN_FAMILY_BYTES, qual, value);<a name="line.1708"></a>
-<span class="sourceLineNo">1709</span>    }<a name="line.1709"></a>
-<span class="sourceLineNo">1710</span><a name="line.1710"></a>
-<span class="sourceLineNo">1711</span>    long syncs = metricsAssertHelper.getCounter("syncTimeNumOps", source);<a name="line.1711"></a>
-<span class="sourceLineNo">1712</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs, source);<a name="line.1712"></a>
-<span class="sourceLineNo">1713</span>    return syncs;<a name="line.1713"></a>
-<span class="sourceLineNo">1714</span>  }<a name="line.1714"></a>
-<span class="sourceLineNo">1715</span><a name="line.1715"></a>
-<span class="sourceLineNo">1716</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.1716"></a>
-<span class="sourceLineNo">1717</span>  // checkAndMutate tests<a name="line.1717"></a>
-<span class="sourceLineNo">1718</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.1718"></a>
-<span class="sourceLineNo">1719</span>  @Test<a name="line.1719"></a>
-<span class="sourceLineNo">1720</span>  public void testCheckAndMutate_WithEmptyRowValue() throws IOException {<a name="line.1720"></a>
-<span class="sourceLineNo">1721</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1721"></a>
-<span class="sourceLineNo">1722</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1722"></a>
-<span class="sourceLineNo">1723</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1723"></a>
-<span class="sourceLineNo">1724</span>    byte[] emptyVal = new byte[] {};<a name="line.1724"></a>
-<span class="sourceLineNo">1725</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1725"></a>
-<span class="sourceLineNo">1726</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.1726"></a>
-<span class="sourceLineNo">1727</span><a name="line.1727"></a>
-<span class="sourceLineNo">1728</span>    // Setting up region<a name="line.1728"></a>
-<span class="sourceLineNo">1729</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.1729"></a>
-<span class="sourceLineNo">1730</span>    // Putting empty data in key<a name="line.1730"></a>
-<span class="sourceLineNo">1731</span>    Put put = new Put(row1);<a name="line.1731"></a>
-<span class="sourceLineNo">1732</span>    put.addColumn(fam1, qf1, emptyVal);<a name="line.1732"></a>
-<span class="sourceLineNo">1733</span><a name="line.1733"></a>
-<span class="sourceLineNo">1734</span>    // checkAndPut with empty value<a name="line.1734"></a>
-<span class="sourceLineNo">1735</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1735"></a>
-<span class="sourceLineNo">1736</span>        new BinaryComparator(emptyVal), put);<a name="line.1736"></a>
-<span class="sourceLineNo">1737</span>    assertTrue(res);<a name="line.1737"></a>
-<span class="sourceLineNo">1738</span><a name="line.1738"></a>
-<span class="sourceLineNo">1739</span>    // Putting data in key<a name="line.1739"></a>
-<span class="sourceLineNo">1740</span>    put = new Put(row1);<a name="line.1740"></a>
-<span class="sourceLineNo">1741</span>    put.addColumn(fam1, qf1, val1);<a name="line.1741"></a>
-<span class="sourceLineNo">1742</span><a name="line.1742"></a>
-<span class="sourceLineNo">1743</span>    // checkAndPut with correct value<a name="line.1743"></a>
-<span class="sourceLineNo">1744</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1744"></a>
-<span class="sourceLineNo">1745</span>        new BinaryComparator(emptyVal), put);<a name="line.1745"></a>
-<span class="sourceLineNo">1746</span>    assertTrue(res);<a name="line.1746"></a>
-<span class="sourceLineNo">1747</span><a name="line.1747"></a>
-<span class="sourceLineNo">1748</span>    // not empty anymore<a name="line.1748"></a>
-<span class="sourceLineNo">1749</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1749"></a>
-<span class="sourceLineNo">1750</span>        new BinaryComparator(emptyVal), put);<a name="line.1750"></a>
-<span class="sourceLineNo">1751</span>    assertFalse(res);<a name="line.1751"></a>
-<span class="sourceLineNo">1752</span><a name="line.1752"></a>
-<span class="sourceLineNo">1753</span>    Delete delete = new Delete(row1);<a name="line.1753"></a>
-<span class="sourceLineNo">1754</span>    delete.addColumn(fam1, qf1);<a name="line.1754"></a>
-<span class="sourceLineNo">1755</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1755"></a>
-<span class="sourceLineNo">1756</span>        new BinaryComparator(emptyVal), delete);<a name="line.1756"></a>
-<span class="sourceLineNo">1757</span>    assertFalse(res);<a name="line.1757"></a>
-<span class="sourceLineNo">1758</span><a name="line.1758"></a>
-<span class="sourceLineNo">1759</span>    put = new Put(row1);<a name="line.1759"></a>
-<span class="sourceLineNo">1760</span>    put.addColumn(fam1, qf1, val2);<a name="line.1760"></a>
-<span class="sourceLineNo">1761</span>    // checkAndPut with correct value<a name="line.1761"></a>
-<span class="sourceLineNo">1762</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1762"></a>
-<span class="sourceLineNo">1763</span>        new BinaryComparator(val1), put);<a name="line.1763"></a>
-<span class="sourceLineNo">1764</span>    assertTrue(res);<a name="line.1764"></a>
-<span class="sourceLineNo">1765</span><a name="line.1765"></a>
-<span class="sourceLineNo">1766</span>    // checkAndDelete with correct value<a name="line.1766"></a>
-<span class="sourceLineNo">1767</span>    delete = new Delete(row1);<a name="line.1767"></a>
-<span class="sourceLineNo">1768</span>    delete.addColumn(fam1, qf1);<a name="line.1768"></a>
+<span class="sourceLineNo">404</span>    ChunkCreator.initialize(MemStoreLABImpl.CHUNK_SIZE_DEFAULT, false, 0, 0, 0, null);<a name="line.404"></a>
+<span class="sourceLineNo">405</span>    FSHLog hLog = new FSHLog(fs, rootDir, testName, CONF);<a name="line.405"></a>
+<span class="sourceLineNo">406</span>    hLog.init();<a name="line.406"></a>
+<span class="sourceLineNo">407</span>    region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, hLog,<a name="line.407"></a>
+<span class="sourceLineNo">408</span>        COLUMN_FAMILY_BYTES);<a name="line.408"></a>
+<span class="sourceLineNo">409</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.409"></a>
+<span class="sourceLineNo">410</span>    assertEquals(0, region.getMemStoreDataSize());<a name="line.410"></a>
+<span class="sourceLineNo">411</span><a name="line.411"></a>
+<span class="sourceLineNo">412</span>    // Put one value<a name="line.412"></a>
+<span class="sourceLineNo">413</span>    byte [] value = Bytes.toBytes(method);<a name="line.413"></a>
+<span class="sourceLineNo">414</span>    Put put = new Put(value);<a name="line.414"></a>
+<span class="sourceLineNo">415</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    region.put(put);<a name="line.416"></a>
+<span class="sourceLineNo">417</span>    long onePutSize = region.getMemStoreDataSize();<a name="line.417"></a>
+<span class="sourceLineNo">418</span>    assertTrue(onePutSize &gt; 0);<a name="line.418"></a>
+<span class="sourceLineNo">419</span><a name="line.419"></a>
+<span class="sourceLineNo">420</span>    RegionCoprocessorHost mockedCPHost = Mockito.mock(RegionCoprocessorHost.class);<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    doThrow(new IOException())<a name="line.421"></a>
+<span class="sourceLineNo">422</span>       .when(mockedCPHost).postBatchMutate(Mockito.&lt;MiniBatchOperationInProgress&lt;Mutation&gt;&gt;any());<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    region.setCoprocessorHost(mockedCPHost);<a name="line.423"></a>
+<span class="sourceLineNo">424</span><a name="line.424"></a>
+<span class="sourceLineNo">425</span>    put = new Put(value);<a name="line.425"></a>
+<span class="sourceLineNo">426</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("dfg"), value);<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    try {<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      region.put(put);<a name="line.428"></a>
+<span class="sourceLineNo">429</span>      fail("Should have failed with IOException");<a name="line.429"></a>
+<span class="sourceLineNo">430</span>    } catch (IOException expected) {<a name="line.430"></a>
+<span class="sourceLineNo">431</span>    }<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    long expectedSize = onePutSize * 2;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>    assertEquals("memstoreSize should be incremented",<a name="line.433"></a>
+<span class="sourceLineNo">434</span>        expectedSize, region.getMemStoreDataSize());<a name="line.434"></a>
+<span class="sourceLineNo">435</span>    assertEquals("flushable size should be incremented",<a name="line.435"></a>
+<span class="sourceLineNo">436</span>        expectedSize, store.getFlushableSize().getDataSize());<a name="line.436"></a>
+<span class="sourceLineNo">437</span><a name="line.437"></a>
+<span class="sourceLineNo">438</span>    region.setCoprocessorHost(null);<a name="line.438"></a>
+<span class="sourceLineNo">439</span>  }<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>   * A test case of HBASE-21041<a name="line.442"></a>
+<span class="sourceLineNo">443</span>   * @throws Exception Exception<a name="line.443"></a>
+<span class="sourceLineNo">444</span>   */<a name="line.444"></a>
+<span class="sourceLineNo">445</span>  @Test<a name="line.445"></a>
+<span class="sourceLineNo">446</span>  public void testFlushAndMemstoreSizeCounting() throws Exception {<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    byte[] family = Bytes.toBytes("family");<a name="line.447"></a>
+<span class="sourceLineNo">448</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.448"></a>
+<span class="sourceLineNo">449</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.449"></a>
+<span class="sourceLineNo">450</span>    try {<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      for (byte[] row : HBaseTestingUtility.ROWS) {<a name="line.451"></a>
+<span class="sourceLineNo">452</span>        Put put = new Put(row);<a name="line.452"></a>
+<span class="sourceLineNo">453</span>        put.addColumn(family, family, row);<a name="line.453"></a>
+<span class="sourceLineNo">454</span>        region.put(put);<a name="line.454"></a>
+<span class="sourceLineNo">455</span>      }<a name="line.455"></a>
+<span class="sourceLineNo">456</span>      region.flush(true);<a name="line.456"></a>
+<span class="sourceLineNo">457</span>      // After flush, data size should be zero<a name="line.457"></a>
+<span class="sourceLineNo">458</span>      assertEquals(0, region.getMemStoreDataSize());<a name="line.458"></a>
+<span class="sourceLineNo">459</span>      // After flush, a new active mutable segment is created, so the heap size<a name="line.459"></a>
+<span class="sourceLineNo">460</span>      // should equal to MutableSegment.DEEP_OVERHEAD<a name="line.460"></a>
+<span class="sourceLineNo">461</span>      assertEquals(MutableSegment.DEEP_OVERHEAD, region.getMemStoreHeapSize());<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      // After flush, offheap should be zero<a name="line.462"></a>
+<span class="sourceLineNo">463</span>      assertEquals(0, region.getMemStoreOffHeapSize());<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    } finally {<a name="line.464"></a>
+<span class="sourceLineNo">465</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.465"></a>
+<span class="sourceLineNo">466</span>      this.region = null;<a name="line.466"></a>
+<span class="sourceLineNo">467</span>      wals.close();<a name="line.467"></a>
+<span class="sourceLineNo">468</span>    }<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>  /**<a name="line.471"></a>
+<span class="sourceLineNo">472</span>   * Test we do not lose data if we fail a flush and then close.<a name="line.472"></a>
+<span class="sourceLineNo">473</span>   * Part of HBase-10466.  Tests the following from the issue description:<a name="line.473"></a>
+<span class="sourceLineNo">474</span>   * "Bug 1: Wrong calculation of HRegion.memstoreSize: When a flush fails, data to be flushed is<a name="line.474"></a>
+<span class="sourceLineNo">475</span>   * kept in each MemStore's snapshot and wait for next flush attempt to continue on it. But when<a name="line.475"></a>
+<span class="sourceLineNo">476</span>   * the next flush succeeds, the counter of total memstore size in HRegion is always deduced by<a name="line.476"></a>
+<span class="sourceLineNo">477</span>   * the sum of current memstore sizes instead of snapshots left from previous failed flush. This<a name="line.477"></a>
+<span class="sourceLineNo">478</span>   * calculation is problematic that almost every time there is failed flush, HRegion.memstoreSize<a name="line.478"></a>
+<span class="sourceLineNo">479</span>   * gets reduced by a wrong value. If region flush could not proceed for a couple cycles, the size<a name="line.479"></a>
+<span class="sourceLineNo">480</span>   * in current memstore could be much larger than the snapshot. It's likely to drift memstoreSize<a name="line.480"></a>
+<span class="sourceLineNo">481</span>   * much smaller than expected. In extreme case, if the error accumulates to even bigger than<a name="line.481"></a>
+<span class="sourceLineNo">482</span>   * HRegion's memstore size limit, any further flush is skipped because flush does not do anything<a name="line.482"></a>
+<span class="sourceLineNo">483</span>   * if memstoreSize is not larger than 0."<a name="line.483"></a>
+<span class="sourceLineNo">484</span>   * @throws Exception<a name="line.484"></a>
+<span class="sourceLineNo">485</span>   */<a name="line.485"></a>
+<span class="sourceLineNo">486</span>  @Test<a name="line.486"></a>
+<span class="sourceLineNo">487</span>  public void testFlushSizeAccounting() throws Exception {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.488"></a>
+<span class="sourceLineNo">489</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.489"></a>
+<span class="sourceLineNo">490</span>    // Only retry once.<a name="line.490"></a>
+<span class="sourceLineNo">491</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.491"></a>
+<span class="sourceLineNo">492</span>    final User user =<a name="line.492"></a>
+<span class="sourceLineNo">493</span>      User.createUserForTesting(conf, method, new String[]{"foo"});<a name="line.493"></a>
+<span class="sourceLineNo">494</span>    // Inject our faulty LocalFileSystem<a name="line.494"></a>
+<span class="sourceLineNo">495</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.496"></a>
+<span class="sourceLineNo">497</span>      @Override<a name="line.497"></a>
+<span class="sourceLineNo">498</span>      public Object run() throws Exception {<a name="line.498"></a>
+<span class="sourceLineNo">499</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.499"></a>
+<span class="sourceLineNo">500</span>        FileSystem fs = FileSystem.get(conf);<a name="line.500"></a>
+<span class="sourceLineNo">501</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.501"></a>
+<span class="sourceLineNo">502</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.502"></a>
+<span class="sourceLineNo">503</span>        HRegion region = null;<a name="line.503"></a>
+<span class="sourceLineNo">504</span>        try {<a name="line.504"></a>
+<span class="sourceLineNo">505</span>          // Initialize region<a name="line.505"></a>
+<span class="sourceLineNo">506</span>          region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, wal,<a name="line.506"></a>
+<span class="sourceLineNo">507</span>              COLUMN_FAMILY_BYTES);<a name="line.507"></a>
+<span class="sourceLineNo">508</span>          long size = region.getMemStoreDataSize();<a name="line.508"></a>
+<span class="sourceLineNo">509</span>          Assert.assertEquals(0, size);<a name="line.509"></a>
+<span class="sourceLineNo">510</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.510"></a>
+<span class="sourceLineNo">511</span>          Put p1 = new Put(row);<a name="line.511"></a>
+<span class="sourceLineNo">512</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[]) null));<a name="line.512"></a>
+<span class="sourceLineNo">513</span>          region.put(p1);<a name="line.513"></a>
+<span class="sourceLineNo">514</span>          final long sizeOfOnePut = region.getMemStoreDataSize();<a name="line.514"></a>
+<span class="sourceLineNo">515</span>          // Fail a flush which means the current memstore will hang out as memstore 'snapshot'.<a name="line.515"></a>
+<span class="sourceLineNo">516</span>          try {<a name="line.516"></a>
+<span class="sourceLineNo">517</span>            LOG.info("Flushing");<a name="line.517"></a>
+<span class="sourceLineNo">518</span>            region.flush(true);<a name="line.518"></a>
+<span class="sourceLineNo">519</span>            Assert.fail("Didn't bubble up IOE!");<a name="line.519"></a>
+<span class="sourceLineNo">520</span>          } catch (DroppedSnapshotException dse) {<a name="line.520"></a>
+<span class="sourceLineNo">521</span>            // What we are expecting<a name="line.521"></a>
+<span class="sourceLineNo">522</span>            region.closing.set(false); // this is needed for the rest of the test to work<a name="line.522"></a>
+<span class="sourceLineNo">523</span>          }<a name="line.523"></a>
+<span class="sourceLineNo">524</span>          // Make it so all writes succeed from here on out<a name="line.524"></a>
+<span class="sourceLineNo">525</span>          ffs.fault.set(false);<a name="line.525"></a>
+<span class="sourceLineNo">526</span>          // Check sizes.  Should still be the one entry.<a name="line.526"></a>
+<span class="sourceLineNo">527</span>          Assert.assertEquals(sizeOfOnePut, region.getMemStoreDataSize());<a name="line.527"></a>
+<span class="sourceLineNo">528</span>          // Now add two entries so that on this next flush that fails, we can see if we<a name="line.528"></a>
+<span class="sourceLineNo">529</span>          // subtract the right amount, the snapshot size only.<a name="line.529"></a>
+<span class="sourceLineNo">530</span>          Put p2 = new Put(row);<a name="line.530"></a>
+<span class="sourceLineNo">531</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.531"></a>
+<span class="sourceLineNo">532</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.532"></a>
+<span class="sourceLineNo">533</span>          region.put(p2);<a name="line.533"></a>
+<span class="sourceLineNo">534</span>          long expectedSize = sizeOfOnePut * 3;<a name="line.534"></a>
+<span class="sourceLineNo">535</span>          Assert.assertEquals(expectedSize, region.getMemStoreDataSize());<a name="line.535"></a>
+<span class="sourceLineNo">536</span>          // Do a successful flush.  It will clear the snapshot only.  Thats how flushes work.<a name="line.536"></a>
+<span class="sourceLineNo">537</span>          // If already a snapshot, we clear it else we move the memstore to be snapshot and flush<a name="line.537"></a>
+<span class="sourceLineNo">538</span>          // it<a name="line.538"></a>
+<span class="sourceLineNo">539</span>          region.flush(true);<a name="line.539"></a>
+<span class="sourceLineNo">540</span>          // Make sure our memory accounting is right.<a name="line.540"></a>
+<span class="sourceLineNo">541</span>          Assert.assertEquals(sizeOfOnePut * 2, region.getMemStoreDataSize());<a name="line.541"></a>
+<span class="sourceLineNo">542</span>        } finally {<a name="line.542"></a>
+<span class="sourceLineNo">543</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.543"></a>
+<span class="sourceLineNo">544</span>        }<a name="line.544"></a>
+<span class="sourceLineNo">545</span>        return null;<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>    FileSystem.closeAllForUGI(user.getUGI());<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>  @Test<a name="line.551"></a>
+<span class="sourceLineNo">552</span>  public void testCloseWithFailingFlush() throws Exception {<a name="line.552"></a>
+<span class="sourceLineNo">553</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.553"></a>
+<span class="sourceLineNo">554</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.554"></a>
+<span class="sourceLineNo">555</span>    // Only retry once.<a name="line.555"></a>
+<span class="sourceLineNo">556</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.556"></a>
+<span class="sourceLineNo">557</span>    final User user =<a name="line.557"></a>
+<span class="sourceLineNo">558</span>      User.createUserForTesting(conf, this.method, new String[]{"foo"});<a name="line.558"></a>
+<span class="sourceLineNo">559</span>    // Inject our faulty LocalFileSystem<a name="line.559"></a>
+<span class="sourceLineNo">560</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.560"></a>
+<span class="sourceLineNo">561</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.561"></a>
+<span class="sourceLineNo">562</span>      @Override<a name="line.562"></a>
+<span class="sourceLineNo">563</span>      public Object run() throws Exception {<a name="line.563"></a>
+<span class="sourceLineNo">564</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.564"></a>
+<span class="sourceLineNo">565</span>        FileSystem fs = FileSystem.get(conf);<a name="line.565"></a>
+<span class="sourceLineNo">566</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.566"></a>
+<span class="sourceLineNo">567</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.567"></a>
+<span class="sourceLineNo">568</span>        HRegion region = null;<a name="line.568"></a>
+<span class="sourceLineNo">569</span>        try {<a name="line.569"></a>
+<span class="sourceLineNo">570</span>          // Initialize region<a name="line.570"></a>
+<span class="sourceLineNo">571</span>          region = initHRegion(tableName, null, null, false,<a name="line.571"></a>
+<span class="sourceLineNo">572</span>              Durability.SYNC_WAL, wal, COLUMN_FAMILY_BYTES);<a name="line.572"></a>
+<span class="sourceLineNo">573</span>          long size = region.getMemStoreDataSize();<a name="line.573"></a>
+<span class="sourceLineNo">574</span>          Assert.assertEquals(0, size);<a name="line.574"></a>
+<span class="sourceLineNo">575</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.575"></a>
+<span class="sourceLineNo">576</span>          Put p1 = new Put(row);<a name="line.576"></a>
+<span class="sourceLineNo">577</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[])null));<a name="line.577"></a>
+<span class="sourceLineNo">578</span>          region.put(p1);<a name="line.578"></a>
+<span class="sourceLineNo">579</span>          // Manufacture an outstanding snapshot -- fake a failed flush by doing prepare step only.<a name="line.579"></a>
+<span class="sourceLineNo">580</span>          HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.580"></a>
+<span class="sourceLineNo">581</span>          StoreFlushContext storeFlushCtx =<a name="line.581"></a>
+<span class="sourceLineNo">582</span>              store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY);<a name="line.582"></a>
+<span class="sourceLineNo">583</span>          storeFlushCtx.prepare();<a name="line.583"></a>
+<span class="sourceLineNo">584</span>          // Now add two entries to the foreground memstore.<a name="line.584"></a>
+<span class="sourceLineNo">585</span>          Put p2 = new Put(row);<a name="line.585"></a>
+<span class="sourceLineNo">586</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.586"></a>
+<span class="sourceLineNo">587</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.587"></a>
+<span class="sourceLineNo">588</span>          region.put(p2);<a name="line.588"></a>
+<span class="sourceLineNo">589</span>          // Now try close on top of a failing flush.<a name="line.589"></a>
+<span class="sourceLineNo">590</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.590"></a>
+<span class="sourceLineNo">591</span>          region = null;<a name="line.591"></a>
+<span class="sourceLineNo">592</span>          fail();<a name="line.592"></a>
+<span class="sourceLineNo">593</span>        } catch (DroppedSnapshotException dse) {<a name="line.593"></a>
+<span class="sourceLineNo">594</span>          // Expected<a name="line.594"></a>
+<span class="sourceLineNo">595</span>          LOG.info("Expected DroppedSnapshotException");<a name="line.595"></a>
+<span class="sourceLineNo">596</span>        } finally {<a name="line.596"></a>
+<span class="sourceLineNo">597</span>          // Make it so all writes succeed from here on out so can close clean<a name="line.597"></a>
+<span class="sourceLineNo">598</span>          ffs.fault.set(false);<a name="line.598"></a>
+<span class="sourceLineNo">599</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.599"></a>
+<span class="sourceLineNo">600</span>        }<a name="line.600"></a>
+<span class="sourceLineNo">601</span>        return null;<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>    FileSystem.closeAllForUGI(user.getUGI());<a name="line.604"></a>
+<span class="sourceLineNo">605</span>  }<a name="line.605"></a>
+<span class="sourceLineNo">606</span><a name="line.606"></a>
+<span class="sourceLineNo">607</span>  @Test<a name="line.607"></a>
+<span class="sourceLineNo">608</span>  public void testCompactionAffectedByScanners() throws Exception {<a name="line.608"></a>
+<span class="sourceLineNo">609</span>    byte[] family = Bytes.toBytes("family");<a name="line.609"></a>
+<span class="sourceLineNo">610</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.610"></a>
+<span class="sourceLineNo">611</span><a name="line.611"></a>
+<span class="sourceLineNo">612</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.612"></a>
+<span class="sourceLineNo">613</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.613"></a>
+<span class="sourceLineNo">614</span>    region.put(put);<a name="line.614"></a>
+<span class="sourceLineNo">615</span>    region.flush(true);<a name="line.615"></a>
+<span class="sourceLineNo">616</span><a name="line.616"></a>
+<span class="sourceLineNo">617</span>    Scan scan = new Scan();<a name="line.617"></a>
+<span class="sourceLineNo">618</span>    scan.setMaxVersions(3);<a name="line.618"></a>
+<span class="sourceLineNo">619</span>    // open the first scanner<a name="line.619"></a>
+<span class="sourceLineNo">620</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.620"></a>
+<span class="sourceLineNo">621</span><a name="line.621"></a>
+<span class="sourceLineNo">622</span>    Delete delete = new Delete(Bytes.toBytes("r1"));<a name="line.622"></a>
+<span class="sourceLineNo">623</span>    region.delete(delete);<a name="line.623"></a>
+<span class="sourceLineNo">624</span>    region.flush(true);<a name="line.624"></a>
+<span class="sourceLineNo">625</span><a name="line.625"></a>
+<span class="sourceLineNo">626</span>    // open the second scanner<a name="line.626"></a>
+<span class="sourceLineNo">627</span>    RegionScanner scanner2 = region.getScanner(scan);<a name="line.627"></a>
+<span class="sourceLineNo">628</span><a name="line.628"></a>
+<span class="sourceLineNo">629</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.629"></a>
+<span class="sourceLineNo">630</span><a name="line.630"></a>
+<span class="sourceLineNo">631</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.631"></a>
+<span class="sourceLineNo">632</span><a name="line.632"></a>
+<span class="sourceLineNo">633</span>    // make a major compaction<a name="line.633"></a>
+<span class="sourceLineNo">634</span>    region.compact(true);<a name="line.634"></a>
+<span class="sourceLineNo">635</span><a name="line.635"></a>
+<span class="sourceLineNo">636</span>    // open the third scanner<a name="line.636"></a>
+<span class="sourceLineNo">637</span>    RegionScanner scanner3 = region.getScanner(scan);<a name="line.637"></a>
+<span class="sourceLineNo">638</span><a name="line.638"></a>
+<span class="sourceLineNo">639</span>    // get data from scanner 1, 2, 3 after major compaction<a name="line.639"></a>
+<span class="sourceLineNo">640</span>    scanner1.next(results);<a name="line.640"></a>
+<span class="sourceLineNo">641</span>    System.out.println(results);<a name="line.641"></a>
+<span class="sourceLineNo">642</span>    assertEquals(1, results.size());<a name="line.642"></a>
+<span class="sourceLineNo">643</span><a name="line.643"></a>
+<span class="sourceLineNo">644</span>    results.clear();<a name="line.644"></a>
+<span class="sourceLineNo">645</span>    scanner2.next(results);<a name="line.645"></a>
+<span class="sourceLineNo">646</span>    System.out.println(results);<a name="line.646"></a>
+<span class="sourceLineNo">647</span>    assertEquals(0, results.size());<a name="line.647"></a>
+<span class="sourceLineNo">648</span><a name="line.648"></a>
+<span class="sourceLineNo">649</span>    results.clear();<a name="line.649"></a>
+<span class="sourceLineNo">650</span>    scanner3.next(results);<a name="line.650"></a>
+<span class="sourceLineNo">651</span>    System.out.println(results);<a name="line.651"></a>
+<span class="sourceLineNo">652</span>    assertEquals(0, results.size());<a name="line.652"></a>
+<span class="sourceLineNo">653</span>  }<a name="line.653"></a>
+<span class="sourceLineNo">654</span><a name="line.654"></a>
+<span class="sourceLineNo">655</span>  @Test<a name="line.655"></a>
+<span class="sourceLineNo">656</span>  public void testToShowNPEOnRegionScannerReseek() throws Exception {<a name="line.656"></a>
+<span class="sourceLineNo">657</span>    byte[] family = Bytes.toBytes("family");<a name="line.657"></a>
+<span class="sourceLineNo">658</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.658"></a>
+<span class="sourceLineNo">659</span><a name="line.659"></a>
+<span class="sourceLineNo">660</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.660"></a>
+<span class="sourceLineNo">661</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.661"></a>
+<span class="sourceLineNo">662</span>    region.put(put);<a name="line.662"></a>
+<span class="sourceLineNo">663</span>    put = new Put(Bytes.toBytes("r2"));<a name="line.663"></a>
+<span class="sourceLineNo">664</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.664"></a>
+<span class="sourceLineNo">665</span>    region.put(put);<a name="line.665"></a>
+<span class="sourceLineNo">666</span>    region.flush(true);<a name="line.666"></a>
+<span class="sourceLineNo">667</span><a name="line.667"></a>
+<span class="sourceLineNo">668</span>    Scan scan = new Scan();<a name="line.668"></a>
+<span class="sourceLineNo">669</span>    scan.setMaxVersions(3);<a name="line.669"></a>
+<span class="sourceLineNo">670</span>    // open the first scanner<a name="line.670"></a>
+<span class="sourceLineNo">671</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.671"></a>
+<span class="sourceLineNo">672</span><a name="line.672"></a>
+<span class="sourceLineNo">673</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.673"></a>
+<span class="sourceLineNo">674</span><a name="line.674"></a>
+<span class="sourceLineNo">675</span>    region.compact(true);<a name="line.675"></a>
+<span class="sourceLineNo">676</span><a name="line.676"></a>
+<span class="sourceLineNo">677</span>    scanner1.reseek(Bytes.toBytes("r2"));<a name="line.677"></a>
+<span class="sourceLineNo">678</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.678"></a>
+<span class="sourceLineNo">679</span>    scanner1.next(results);<a name="line.679"></a>
+<span class="sourceLineNo">680</span>    Cell keyValue = results.get(0);<a name="line.680"></a>
+<span class="sourceLineNo">681</span>    Assert.assertTrue(Bytes.compareTo(CellUtil.cloneRow(keyValue), Bytes.toBytes("r2")) == 0);<a name="line.681"></a>
+<span class="sourceLineNo">682</span>    scanner1.close();<a name="line.682"></a>
+<span class="sourceLineNo">683</span>  }<a name="line.683"></a>
+<span class="sourceLineNo">684</span><a name="line.684"></a>
+<span class="sourceLineNo">685</span>  @Test<a name="line.685"></a>
+<span class="sourceLineNo">686</span>  public void testSkipRecoveredEditsReplay() throws Exception {<a name="line.686"></a>
+<span class="sourceLineNo">687</span>    byte[] family = Bytes.toBytes("family");<a name="line.687"></a>
+<span class="sourceLineNo">688</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.688"></a>
+<span class="sourceLineNo">689</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.689"></a>
+<span class="sourceLineNo">690</span>    try {<a name="line.690"></a>
+<span class="sourceLineNo">691</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.691"></a>
+<span class="sourceLineNo">692</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.692"></a>
+<span class="sourceLineNo">693</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.693"></a>
+<span class="sourceLineNo">694</span><a name="line.694"></a>
+<span class="sourceLineNo">695</span>      Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.695"></a>
+<span class="sourceLineNo">696</span><a name="line.696"></a>
+<span class="sourceLineNo">697</span>      long maxSeqId = 1050;<a name="line.697"></a>
+<span class="sourceLineNo">698</span>      long minSeqId = 1000;<a name="line.698"></a>
+<span class="sourceLineNo">699</span><a name="line.699"></a>
+<span class="sourceLineNo">700</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.700"></a>
+<span class="sourceLineNo">701</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.701"></a>
+<span class="sourceLineNo">702</span>        fs.create(recoveredEdits);<a name="line.702"></a>
+<span class="sourceLineNo">703</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.703"></a>
+<span class="sourceLineNo">704</span><a name="line.704"></a>
+<span class="sourceLineNo">705</span>        long time = System.nanoTime();<a name="line.705"></a>
+<span class="sourceLineNo">706</span>        WALEdit edit = new WALEdit();<a name="line.706"></a>
+<span class="sourceLineNo">707</span>        edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.707"></a>
+<span class="sourceLineNo">708</span>            .toBytes(i)));<a name="line.708"></a>
+<span class="sourceLineNo">709</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.709"></a>
+<span class="sourceLineNo">710</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.710"></a>
+<span class="sourceLineNo">711</span><a name="line.711"></a>
+<span class="sourceLineNo">712</span>        writer.close();<a name="line.712"></a>
+<span class="sourceLineNo">713</span>      }<a name="line.713"></a>
+<span class="sourceLineNo">714</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.714"></a>
+<span class="sourceLineNo">715</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.715"></a>
+<span class="sourceLineNo">716</span>      for (HStore store : region.getStores()) {<a name="line.716"></a>
+<span class="sourceLineNo">717</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), minSeqId - 1);<a name="line.717"></a>
+<span class="sourceLineNo">718</span>      }<a name="line.718"></a>
+<span class="sourceLineNo">719</span>      long seqId = region.replayRecoveredEditsIfAny(maxSeqIdInStores, null, status);<a name="line.719"></a>
+<span class="sourceLineNo">720</span>      assertEquals(maxSeqId, seqId);<a name="line.720"></a>
+<span class="sourceLineNo">721</span>      region.getMVCC().advanceTo(seqId);<a name="line.721"></a>
+<span class="sourceLineNo">722</span>      Get get = new Get(row);<a name="line.722"></a>
+<span class="sourceLineNo">723</span>      Result result = region.get(get);<a name="line.723"></a>
+<span class="sourceLineNo">724</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.724"></a>
+<span class="sourceLineNo">725</span>        List&lt;Cell&gt; kvs = result.getColumnCells(family, Bytes.toBytes(i));<a name="line.725"></a>
+<span class="sourceLineNo">726</span>        assertEquals(1, kvs.size());<a name="line.726"></a>
+<span class="sourceLineNo">727</span>        assertArrayEquals(Bytes.toBytes(i), CellUtil.cloneValue(kvs.get(0)));<a name="line.727"></a>
+<span class="sourceLineNo">728</span>      }<a name="line.728"></a>
+<span class="sourceLineNo">729</span>    } finally {<a name="line.729"></a>
+<span class="sourceLineNo">730</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.730"></a>
+<span class="sourceLineNo">731</span>      this.region = null;<a name="line.731"></a>
+<span class="sourceLineNo">732</span>      wals.close();<a name="line.732"></a>
+<span class="sourceLineNo">733</span>    }<a name="line.733"></a>
+<span class="sourceLineNo">734</span>  }<a name="line.734"></a>
+<span class="sourceLineNo">735</span><a name="line.735"></a>
+<span class="sourceLineNo">736</span>  @Test<a name="line.736"></a>
+<span class="sourceLineNo">737</span>  public void testSkipRecoveredEditsReplaySomeIgnored() throws Exception {<a name="line.737"></a>
+<span class="sourceLineNo">738</span>    byte[] family = Bytes.toBytes("family");<a name="line.738"></a>
+<span class="sourceLineNo">739</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.739"></a>
+<span class="sourceLineNo">740</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.740"></a>
+<span class="sourceLineNo">741</span>    try {<a name="line.741"></a>
+<span class="sourceLineNo">742</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.742"></a>
+<span class="sourceLineNo">743</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.743"></a>
+<span class="sourceLineNo">744</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.744"></a>
+<span class="sourceLineNo">745</span><a name="line.745"></a>
+<span class="sourceLineNo">746</span>      Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.746"></a>
+<span class="sourceLineNo">747</span><a name="line.747"></a>
+<span class="sourceLineNo">748</span>      long maxSeqId = 1050;<a name="line.748"></a>
+<span class="sourceLineNo">749</span>      long minSeqId = 1000;<a name="line.749"></a>
+<span class="sourceLineNo">750</span><a name="line.750"></a>
+<span class="sourceLineNo">751</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.751"></a>
+<span class="sourceLineNo">752</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.752"></a>
+<span class="sourceLineNo">753</span>        fs.create(recoveredEdits);<a name="line.753"></a>
+<span class="sourceLineNo">754</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.754"></a>
+<span class="sourceLineNo">755</span><a name="line.755"></a>
+<span class="sourceLineNo">756</span>        long time = System.nanoTime();<a name="line.756"></a>
+<span class="sourceLineNo">757</span>        WALEdit edit = new WALEdit();<a name="line.757"></a>
+<span class="sourceLineNo">758</span>        edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.758"></a>
+<span class="sourceLineNo">759</span>            .toBytes(i)));<a name="line.759"></a>
+<span class="sourceLineNo">760</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.760"></a>
+<span class="sourceLineNo">761</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.761"></a>
+<span class="sourceLineNo">762</span><a name="line.762"></a>
+<span class="sourceLineNo">763</span>        writer.close();<a name="line.763"></a>
+<span class="sourceLineNo">764</span>      }<a name="line.764"></a>
+<span class="sourceLineNo">765</span>      long recoverSeqId = 1030;<a name="line.765"></a>
+<span class="sourceLineNo">766</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.766"></a>
+<span class="sourceLineNo">767</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.767"></a>
+<span class="sourceLineNo">768</span>      for (HStore store : region.getStores()) {<a name="line.768"></a>
+<span class="sourceLineNo">769</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), recoverSeqId - 1);<a name="line.769"></a>
+<span class="sourceLineNo">770</span>      }<a name="line.770"></a>
+<span class="sourceLineNo">771</span>      long seqId = region.replayRecoveredEditsIfAny(maxSeqIdInStores, null, status);<a name="line.771"></a>
+<span class="sourceLineNo">772</span>      assertEquals(maxSeqId, seqId);<a name="line.772"></a>
+<span class="sourceLineNo">773</span>      region.getMVCC().advanceTo(seqId);<a name="line.773"></a>
+<span class="sourceLineNo">774</span>      Get get = new Get(row);<a name="line.774"></a>
+<span class="sourceLineNo">775</span>      Result result = region.get(get);<a name="line.775"></a>
+<span class="sourceLineNo">776</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.776"></a>
+<span class="sourceLineNo">777</span>        List&lt;Cell&gt; kvs = result.getColumnCells(family, Bytes.toBytes(i));<a name="line.777"></a>
+<span class="sourceLineNo">778</span>        if (i &lt; recoverSeqId) {<a name="line.778"></a>
+<span class="sourceLineNo">779</span>          assertEquals(0, kvs.size());<a name="line.779"></a>
+<span class="sourceLineNo">780</span>        } else {<a name="line.780"></a>
+<span class="sourceLineNo">781</span>          assertEquals(1, kvs.size());<a name="line.781"></a>
+<span class="sourceLineNo">782</span>          assertArrayEquals(Bytes.toBytes(i), CellUtil.cloneValue(kvs.get(0)));<a name="line.782"></a>
+<span class="sourceLineNo">783</span>        }<a name="line.783"></a>
+<span class="sourceLineNo">784</span>      }<a name="line.784"></a>
+<span class="sourceLineNo">785</span>    } finally {<a name="line.785"></a>
+<span class="sourceLineNo">786</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.786"></a>
+<span class="sourceLineNo">787</span>      this.region = null;<a name="line.787"></a>
+<span class="sourceLineNo">788</span>      wals.close();<a name="line.788"></a>
+<span class="sourceLineNo">789</span>    }<a name="line.789"></a>
+<span class="sourceLineNo">790</span>  }<a name="line.790"></a>
+<span class="sourceLineNo">791</span><a name="line.791"></a>
+<span class="sourceLineNo">792</span>  @Test<a name="line.792"></a>
+<span class="sourceLineNo">793</span>  public void testSkipRecoveredEditsReplayAllIgnored() throws Exception {<a name="line.793"></a>
+<span class="sourceLineNo">794</span>    byte[] family = Bytes.toBytes("family");<a name="line.794"></a>
+<span class="sourceLineNo">795</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.795"></a>
+<span class="sourceLineNo">796</span>    Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.796"></a>
+<span class="sourceLineNo">797</span>    FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.797"></a>
+<span class="sourceLineNo">798</span><a name="line.798"></a>
+<span class="sourceLineNo">799</span>    Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.799"></a>
+<span class="sourceLineNo">800</span>    for (int i = 1000; i &lt; 1050; i += 10) {<a name="line.800"></a>
+<span class="sourceLineNo">801</span>      Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.801"></a>
+<span class="sourceLineNo">802</span>      FSDataOutputStream dos = fs.create(recoveredEdits);<a name="line.802"></a>
+<span class="sourceLineNo">803</span>      dos.writeInt(i);<a name="line.803"></a>
+<span class="sourceLineNo">804</span>      dos.close();<a name="line.804"></a>
+<span class="sourceLineNo">805</span>    }<a name="line.805"></a>
+<span class="sourceLineNo">806</span>    long minSeqId = 2000;<a name="line.806"></a>
+<span class="sourceLineNo">807</span>    Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", minSeqId - 1));<a name="line.807"></a>
+<span class="sourceLineNo">808</span>    FSDataOutputStream dos = fs.create(recoveredEdits);<a name="line.808"></a>
+<span class="sourceLineNo">809</span>    dos.close();<a name="line.809"></a>
+<span class="sourceLineNo">810</span><a name="line.810"></a>
+<span class="sourceLineNo">811</span>    Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.811"></a>
+<span class="sourceLineNo">812</span>    for (HStore store : region.getStores()) {<a name="line.812"></a>
+<span class="sourceLineNo">813</span>      maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), minSeqId);<a name="line.813"></a>
+<span class="sourceLineNo">814</span>    }<a name="line.814"></a>
+<span class="sourceLineNo">815</span>    long seqId = region.replayRecoveredEditsIfAny(maxSeqIdInStores, null, null);<a name="line.815"></a>
+<span class="sourceLineNo">816</span>    assertEquals(minSeqId, seqId);<a name="line.816"></a>
+<span class="sourceLineNo">817</span>  }<a name="line.817"></a>
+<span class="sourceLineNo">818</span><a name="line.818"></a>
+<span class="sourceLineNo">819</span>  @Test<a name="line.819"></a>
+<span class="sourceLineNo">820</span>  public void testSkipRecoveredEditsReplayTheLastFileIgnored() throws Exception {<a name="line.820"></a>
+<span class="sourceLineNo">821</span>    byte[] family = Bytes.toBytes("family");<a name="line.821"></a>
+<span class="sourceLineNo">822</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.822"></a>
+<span class="sourceLineNo">823</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.823"></a>
+<span class="sourceLineNo">824</span>    try {<a name="line.824"></a>
+<span class="sourceLineNo">825</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.825"></a>
+<span class="sourceLineNo">826</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.826"></a>
+<span class="sourceLineNo">827</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.827"></a>
+<span class="sourceLineNo">828</span>      byte[][] columns = region.getTableDescriptor().getColumnFamilyNames().toArray(new byte[0][]);<a name="line.828"></a>
+<span class="sourceLineNo">829</span><a name="line.829"></a>
+<span class="sourceLineNo">830</span>      assertEquals(0, region.getStoreFileList(columns).size());<a name="line.830"></a>
+<span class="sourceLineNo">831</span><a name="line.831"></a>
+<span class="sourceLineNo">832</span>      Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.832"></a>
+<span class="sourceLineNo">833</span><a name="line.833"></a>
+<span class="sourceLineNo">834</span>      long maxSeqId = 1050;<a name="line.834"></a>
+<span class="sourceLineNo">835</span>      long minSeqId = 1000;<a name="line.835"></a>
+<span class="sourceLineNo">836</span><a name="line.836"></a>
+<span class="sourceLineNo">837</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.837"></a>
+<span class="sourceLineNo">838</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.838"></a>
+<span class="sourceLineNo">839</span>        fs.create(recoveredEdits);<a name="line.839"></a>
+<span class="sourceLineNo">840</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.840"></a>
+<span class="sourceLineNo">841</span><a name="line.841"></a>
+<span class="sourceLineNo">842</span>        long time = System.nanoTime();<a name="line.842"></a>
+<span class="sourceLineNo">843</span>        WALEdit edit = null;<a name="line.843"></a>
+<span class="sourceLineNo">844</span>        if (i == maxSeqId) {<a name="line.844"></a>
+<span class="sourceLineNo">845</span>          edit = WALEdit.createCompaction(region.getRegionInfo(),<a name="line.845"></a>
+<span class="sourceLineNo">846</span>          CompactionDescriptor.newBuilder()<a name="line.846"></a>
+<span class="sourceLineNo">847</span>          .setTableName(ByteString.copyFrom(tableName.getName()))<a name="line.847"></a>
+<span class="sourceLineNo">848</span>          .setFamilyName(ByteString.copyFrom(regionName))<a name="line.848"></a>
+<span class="sourceLineNo">849</span>          .setEncodedRegionName(ByteString.copyFrom(regionName))<a name="line.849"></a>
+<span class="sourceLineNo">850</span>          .setStoreHomeDirBytes(ByteString.copyFrom(Bytes.toBytes(regiondir.toString())))<a name="line.850"></a>
+<span class="sourceLineNo">851</span>          .setRegionName(ByteString.copyFrom(region.getRegionInfo().getRegionName()))<a name="line.851"></a>
+<span class="sourceLineNo">852</span>          .build());<a name="line.852"></a>
+<span class="sourceLineNo">853</span>        } else {<a name="line.853"></a>
+<span class="sourceLineNo">854</span>          edit = new WALEdit();<a name="line.854"></a>
+<span class="sourceLineNo">855</span>          edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.855"></a>
+<span class="sourceLineNo">856</span>            .toBytes(i)));<a name="line.856"></a>
+<span class="sourceLineNo">857</span>        }<a name="line.857"></a>
+<span class="sourceLineNo">858</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.858"></a>
+<span class="sourceLineNo">859</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.859"></a>
+<span class="sourceLineNo">860</span>        writer.close();<a name="line.860"></a>
+<span class="sourceLineNo">861</span>      }<a name="line.861"></a>
+<span class="sourceLineNo">862</span><a name="line.862"></a>
+<span class="sourceLineNo">863</span>      long recoverSeqId = 1030;<a name="line.863"></a>
+<span class="sourceLineNo">864</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.864"></a>
+<span class="sourceLineNo">865</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.865"></a>
+<span class="sourceLineNo">866</span>      for (HStore store : region.getStores()) {<a name="line.866"></a>
+<span class="sourceLineNo">867</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), recoverSeqId - 1);<a name="line.867"></a>
+<span class="sourceLineNo">868</span>      }<a name="line.868"></a>
+<span class="sourceLineNo">869</span>      long seqId = region.replayRecoveredEditsIfAny(maxSeqIdInStores, null, status);<a name="line.869"></a>
+<span class="sourceLineNo">870</span>      assertEquals(maxSeqId, seqId);<a name="line.870"></a>
+<span class="sourceLineNo">871</span><a name="line.871"></a>
+<span class="sourceLineNo">872</span>      // assert that the files are flushed<a name="line.872"></a>
+<span class="sourceLineNo">873</span>      assertEquals(1, region.getStoreFileList(columns).size());<a name="line.873"></a>
+<span class="sourceLineNo">874</span><a name="line.874"></a>
+<span class="sourceLineNo">875</span>    } finally {<a name="line.875"></a>
+<span class="sourceLineNo">876</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.876"></a>
+<span class="sourceLineNo">877</span>      this.region = null;<a name="line.877"></a>
+<span class="sourceLineNo">878</span>      wals.close();<a name="line.878"></a>
+<span class="sourceLineNo">879</span>    }<a name="line.879"></a>
+<span class="sourceLineNo">880</span>  }<a name="line.880"></a>
+<span class="sourceLineNo">881</span><a name="line.881"></a>
+<span class="sourceLineNo">882</span>  @Test<a name="line.882"></a>
+<span class="sourceLineNo">883</span>  public void testRecoveredEditsReplayCompaction() throws Exception {<a name="line.883"></a>
+<span class="sourceLineNo">884</span>    testRecoveredEditsReplayCompaction(false);<a name="line.884"></a>
+<span class="sourceLineNo">885</span>    testRecoveredEditsReplayCompaction(true);<a name="line.885"></a>
+<span class="sourceLineNo">886</span>  }<a name="line.886"></a>
+<span class="sourceLineNo">887</span><a name="line.887"></a>
+<span class="sourceLineNo">888</span>  public void testRecoveredEditsReplayCompaction(boolean mismatchedRegionName) throws Exception {<a name="line.888"></a>
+<span class="sourceLineNo">889</span>    CONF.setClass(HConstants.REGION_IMPL, HRegionForTesting.class, Region.class);<a name="line.889"></a>
+<span class="sourceLineNo">890</span>    byte[] family = Bytes.toBytes("family");<a name="line.890"></a>
+<span class="sourceLineNo">891</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.891"></a>
+<span class="sourceLineNo">892</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.892"></a>
+<span class="sourceLineNo">893</span>    try {<a name="line.893"></a>
+<span class="sourceLineNo">894</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.894"></a>
+<span class="sourceLineNo">895</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.895"></a>
+<span class="sourceLineNo">896</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.896"></a>
+<span class="sourceLineNo">897</span><a name="line.897"></a>
+<span class="sourceLineNo">898</span>      long maxSeqId = 3;<a name="line.898"></a>
+<span class="sourceLineNo">899</span>      long minSeqId = 0;<a name="line.899"></a>
+<span class="sourceLineNo">900</span><a name="line.900"></a>
+<span class="sourceLineNo">901</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.901"></a>
+<span class="sourceLineNo">902</span>        Put put = new Put(Bytes.toBytes(i));<a name="line.902"></a>
+<span class="sourceLineNo">903</span>        put.addColumn(family, Bytes.toBytes(i), Bytes.toBytes(i));<a name="line.903"></a>
+<span class="sourceLineNo">904</span>        region.put(put);<a name="line.904"></a>
+<span class="sourceLineNo">905</span>        region.flush(true);<a name="line.905"></a>
+<span class="sourceLineNo">906</span>      }<a name="line.906"></a>
+<span class="sourceLineNo">907</span><a name="line.907"></a>
+<span class="sourceLineNo">908</span>      // this will create a region with 3 files<a name="line.908"></a>
+<span class="sourceLineNo">909</span>      assertEquals(3, region.getStore(family).getStorefilesCount());<a name="line.909"></a>
+<span class="sourceLineNo">910</span>      List&lt;Path&gt; storeFiles = new ArrayList&lt;&gt;(3);<a name="line.910"></a>
+<span class="sourceLineNo">911</span>      for (HStoreFile sf : region.getStore(family).getStorefiles()) {<a name="line.911"></a>
+<span class="sourceLineNo">912</span>        storeFiles.add(sf.getPath());<a name="line.912"></a>
+<span class="sourceLineNo">913</span>      }<a name="line.913"></a>
+<span class="sourceLineNo">914</span><a name="line.914"></a>
+<span class="sourceLineNo">915</span>      // disable compaction completion<a name="line.915"></a>
+<span class="sourceLineNo">916</span>      CONF.setBoolean("hbase.hstore.compaction.complete", false);<a name="line.916"></a>
+<span class="sourceLineNo">917</span>      region.compactStores();<a name="line.917"></a>
+<span class="sourceLineNo">918</span><a name="line.918"></a>
+<span class="sourceLineNo">919</span>      // ensure that nothing changed<a name="line.919"></a>
+<span class="sourceLineNo">920</span>      assertEquals(3, region.getStore(family).getStorefilesCount());<a name="line.920"></a>
+<span class="sourceLineNo">921</span><a name="line.921"></a>
+<span class="sourceLineNo">922</span>      // now find the compacted file, and manually add it to the recovered edits<a name="line.922"></a>
+<span class="sourceLineNo">923</span>      Path tmpDir = new Path(region.getRegionFileSystem().getTempDir(), Bytes.toString(family));<a name="line.923"></a>
+<span class="sourceLineNo">924</span>      FileStatus[] files = FSUtils.listStatus(fs, tmpDir);<a name="line.924"></a>
+<span class="sourceLineNo">925</span>      String errorMsg = "Expected to find 1 file in the region temp directory "<a name="line.925"></a>
+<span class="sourceLineNo">926</span>          + "from the compaction, could not find any";<a name="line.926"></a>
+<span class="sourceLineNo">927</span>      assertNotNull(errorMsg, files);<a name="line.927"></a>
+<span class="sourceLineNo">928</span>      assertEquals(errorMsg, 1, files.length);<a name="line.928"></a>
+<span class="sourceLineNo">929</span>      // move the file inside region dir<a name="line.929"></a>
+<span class="sourceLineNo">930</span>      Path newFile = region.getRegionFileSystem().commitStoreFile(Bytes.toString(family),<a name="line.930"></a>
+<span class="sourceLineNo">931</span>          files[0].getPath());<a name="line.931"></a>
+<span class="sourceLineNo">932</span><a name="line.932"></a>
+<span class="sourceLineNo">933</span>      byte[] encodedNameAsBytes = this.region.getRegionInfo().getEncodedNameAsBytes();<a name="line.933"></a>
+<span class="sourceLineNo">934</span>      byte[] fakeEncodedNameAsBytes = new byte [encodedNameAsBytes.length];<a name="line.934"></a>
+<span class="sourceLineNo">935</span>      for (int i=0; i &lt; encodedNameAsBytes.length; i++) {<a name="line.935"></a>
+<span class="sourceLineNo">936</span>        // Mix the byte array to have a new encodedName<a name="line.936"></a>
+<span class="sourceLineNo">937</span>        fakeEncodedNameAsBytes[i] = (byte) (encodedNameAsBytes[i] + 1);<a name="line.937"></a>
+<span class="sourceLineNo">938</span>      }<a name="line.938"></a>
+<span class="sourceLineNo">939</span><a name="line.939"></a>
+<span class="sourceLineNo">940</span>      CompactionDescriptor compactionDescriptor = ProtobufUtil.toCompactionDescriptor(this.region<a name="line.940"></a>
+<span class="sourceLineNo">941</span>        .getRegionInfo(), mismatchedRegionName ? fakeEncodedNameAsBytes : null, family,<a name="line.941"></a>
+<span class="sourceLineNo">942</span>            storeFiles, Lists.newArrayList(newFile),<a name="line.942"></a>
+<span class="sourceLineNo">943</span>            region.getRegionFileSystem().getStoreDir(Bytes.toString(family)));<a name="line.943"></a>
+<span class="sourceLineNo">944</span><a name="line.944"></a>
+<span class="sourceLineNo">945</span>      WALUtil.writeCompactionMarker(region.getWAL(), this.region.getReplicationScope(),<a name="line.945"></a>
+<span class="sourceLineNo">946</span>          this.region.getRegionInfo(), compactionDescriptor, region.getMVCC());<a name="line.946"></a>
+<span class="sourceLineNo">947</span><a name="line.947"></a>
+<span class="sourceLineNo">948</span>      Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.948"></a>
+<span class="sourceLineNo">949</span><a name="line.949"></a>
+<span class="sourceLineNo">950</span>      Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", 1000));<a name="line.950"></a>
+<span class="sourceLineNo">951</span>      fs.create(recoveredEdits);<a name="line.951"></a>
+<span class="sourceLineNo">952</span>      WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.952"></a>
+<span class="sourceLineNo">953</span><a name="line.953"></a>
+<span class="sourceLineNo">954</span>      long time = System.nanoTime();<a name="line.954"></a>
+<span class="sourceLineNo">955</span><a name="line.955"></a>
+<span class="sourceLineNo">956</span>      writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, 10, time,<a name="line.956"></a>
+<span class="sourceLineNo">957</span>          HConstants.DEFAULT_CLUSTER_ID), WALEdit.createCompaction(region.getRegionInfo(),<a name="line.957"></a>
+<span class="sourceLineNo">958</span>          compactionDescriptor)));<a name="line.958"></a>
+<span class="sourceLineNo">959</span>      writer.close();<a name="line.959"></a>
+<span class="sourceLineNo">960</span><a name="line.960"></a>
+<span class="sourceLineNo">961</span>      // close the region now, and reopen again<a name="line.961"></a>
+<span class="sourceLineNo">962</span>      region.getTableDescriptor();<a name="line.962"></a>
+<span class="sourceLineNo">963</span>      region.getRegionInfo();<a name="line.963"></a>
+<span class="sourceLineNo">964</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.964"></a>
+<span class="sourceLineNo">965</span>      try {<a name="line.965"></a>
+<span class="sourceLineNo">966</span>        region = HRegion.openHRegion(region, null);<a name="line.966"></a>
+<span class="sourceLineNo">967</span>      } catch (WrongRegionException wre) {<a name="line.967"></a>
+<span class="sourceLineNo">968</span>        fail("Matching encoded region name should not have produced WrongRegionException");<a name="line.968"></a>
+<span class="sourceLineNo">969</span>      }<a name="line.969"></a>
+<span class="sourceLineNo">970</span><a name="line.970"></a>
+<span class="sourceLineNo">971</span>      // now check whether we have only one store file, the compacted one<a name="line.971"></a>
+<span class="sourceLineNo">972</span>      Collection&lt;HStoreFile&gt; sfs = region.getStore(family).getStorefiles();<a name="line.972"></a>
+<span class="sourceLineNo">973</span>      for (HStoreFile sf : sfs) {<a name="line.973"></a>
+<span class="sourceLineNo">974</span>        LOG.info(Objects.toString(sf.getPath()));<a name="line.974"></a>
+<span class="sourceLineNo">975</span>      }<a name="line.975"></a>
+<span class="sourceLineNo">976</span>      if (!mismatchedRegionName) {<a name="line.976"></a>
+<span class="sourceLineNo">977</span>        assertEquals(1, region.getStore(family).getStorefilesCount());<a name="line.977"></a>
+<span class="sourceLineNo">978</span>      }<a name="line.978"></a>
+<span class="sourceLineNo">979</span>      files = FSUtils.listStatus(fs, tmpDir);<a name="line.979"></a>
+<span class="sourceLineNo">980</span>      assertTrue("Expected to find 0 files inside " + tmpDir, files == null || files.length == 0);<a name="line.980"></a>
+<span class="sourceLineNo">981</span><a name="line.981"></a>
+<span class="sourceLineNo">982</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.982"></a>
+<span class="sourceLineNo">983</span>        Get get = new Get(Bytes.toBytes(i));<a name="line.983"></a>
+<span class="sourceLineNo">984</span>        Result result = region.get(get);<a name="line.984"></a>
+<span class="sourceLineNo">985</span>        byte[] value = result.getValue(family, Bytes.toBytes(i));<a name="line.985"></a>
+<span class="sourceLineNo">986</span>        assertArrayEquals(Bytes.toBytes(i), value);<a name="line.986"></a>
+<span class="sourceLineNo">987</span>      }<a name="line.987"></a>
+<span class="sourceLineNo">988</span>    } finally {<a name="line.988"></a>
+<span class="sourceLineNo">989</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.989"></a>
+<span class="sourceLineNo">990</span>      this.region = null;<a name="line.990"></a>
+<span class="sourceLineNo">991</span>      wals.close();<a name="line.991"></a>
+<span class="sourceLineNo">992</span>      CONF.setClass(HConstants.REGION_IMPL, HRegion.class, Region.class);<a name="line.992"></a>
+<span class="sourceLineNo">993</span>    }<a name="line.993"></a>
+<span class="sourceLineNo">994</span>  }<a name="line.994"></a>
+<span class="sourceLineNo">995</span><a name="line.995"></a>
+<span class="sourceLineNo">996</span>  @Test<a name="line.996"></a>
+<span class="sourceLineNo">997</span>  public void testFlushMarkers() throws Exception {<a name="line.997"></a>
+<span class="sourceLineNo">998</span>    // tests that flush markers are written to WAL and handled at recovered edits<a name="line.998"></a>
+<span class="sourceLineNo">999</span>    byte[] family = Bytes.toBytes("family");<a name="line.999"></a>
+<span class="sourceLineNo">1000</span>    Path logDir = TEST_UTIL.getDataTestDirOnTestFS(method + ".log");<a name="line.1000"></a>
+<span class="sourceLineNo">1001</span>    final Configuration walConf = new Configuration(TEST_UTIL.getConfiguration());<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.1002"></a>
+<span class="sourceLineNo">1003</span>    final WALFactory wals = new WALFactory(walConf, method);<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span>    final WAL wal = wals.getWAL(RegionInfoBuilder.newBuilder(tableName).build());<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span><a name="line.1005"></a>
+<span class="sourceLineNo">1006</span>    this.region = initHRegion(tableName, HConstants.EMPTY_START_ROW,<a name="line.1006"></a>
+<span class="sourceLineNo">1007</span>      HConstants.EMPTY_END_ROW, false, Durability.USE_DEFAULT, wal, family);<a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>    try {<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span><a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>      long maxSeqId = 3;<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span>      long minSeqId = 0;<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span><a name="line.1015"></a>
+<span class="sourceLineNo">1016</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>        Put put = new Put(Bytes.toBytes(i));<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span>        put.addColumn(family, Bytes.toBytes(i), Bytes.toBytes(i));<a name="line.1018"></a>
+<span class="sourceLineNo">1019</span>        region.put(put);<a name="line.1019"></a>
+<span class="sourceLineNo">1020</span>        region.flush(true);<a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>      }<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span><a name="line.1022"></a>
+<span class="sourceLineNo">1023</span>      // this will create a region with 3 files from flush<a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>      assertEquals(3, region.getStore(family).getStorefilesCount());<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span>      List&lt;String&gt; storeFiles = new ArrayList&lt;&gt;(3);<a name="line.1025"></a>
+<span class="sourceLineNo">1026</span>      for (HStoreFile sf : region.getStore(family).getStorefiles()) {<a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>        storeFiles.add(sf.getPath().getName());<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span>      }<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span><a name="line.1029"></a>
+<span class="sourceLineNo">1030</span>      // now verify that the flush markers are written<a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>      wal.shutdown();<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>      WAL.Reader reader = WALFactory.createReader(fs, AbstractFSWALProvider.getCurrentFileName(wal),<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>        TEST_UTIL.getConfiguration());<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>      try {<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span>        List&lt;WAL.Entry&gt; flushDescriptors = new ArrayList&lt;&gt;();<a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>        long lastFlushSeqId = -1;<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>        while (true) {<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>          WAL.Entry entry = reader.next();<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>          if (entry == null) {<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>            break;<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span>          }<a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>          Cell cell = entry.getEdit().getCells().get(0);<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>          if (WALEdit.isMetaEditFamily(cell)) {<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>            FlushDescriptor flushDesc = WALEdit.getFlushDescriptor(cell);<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span>            assertNotNull(flushDesc);<a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>            assertArrayEquals(tableName.getName(), flushDesc.getTableName().toByteArray());<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>            if (flushDesc.getAction() == FlushAction.START_FLUSH) {<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span>              assertTrue(flushDesc.getFlushSequenceNumber() &gt; lastFlushSeqId);<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span>            } else if (flushDesc.getAction() == FlushAction.COMMIT_FLUSH) {<a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>              assertTrue(flushDesc.getFlushSequenceNumber() == lastFlushSeqId);<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>            }<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>            lastFlushSeqId = flushDesc.getFlushSequenceNumber();<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>            assertArrayEquals(regionName, flushDesc.getEncodedRegionName().toByteArray());<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>            assertEquals(1, flushDesc.getStoreFlushesCount()); //only one store<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>            StoreFlushDescriptor storeFlushDesc = flushDesc.getStoreFlushes(0);<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>            assertArrayEquals(family, storeFlushDesc.getFamilyName().toByteArray());<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span>            assertEquals("family", storeFlushDesc.getStoreHomeDir());<a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>            if (flushDesc.getAction() == FlushAction.START_FLUSH) {<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>              assertEquals(0, storeFlushDesc.getFlushOutputCount());<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>            } else {<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>              assertEquals(1, storeFlushDesc.getFlushOutputCount()); //only one file from flush<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>              assertTrue(storeFiles.contains(storeFlushDesc.getFlushOutput(0)));<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>            }<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span><a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>            flushDescriptors.add(entry);<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>          }<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>        }<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span><a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>        assertEquals(3 * 2, flushDescriptors.size()); // START_FLUSH and COMMIT_FLUSH per flush<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span><a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>        // now write those markers to the recovered edits again.<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span><a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>        Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span><a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", 1000));<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>        fs.create(recoveredEdits);<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span><a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>        for (WAL.Entry entry : flushDescriptors) {<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>          writer.append(entry);<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>        }<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>        writer.close();<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>      } finally {<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>        if (null != reader) {<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>          try {<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>            reader.close();<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>          } catch (IOException exception) {<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>            LOG.warn("Problem closing wal: " + exception.getMessage());<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>            LOG.debug("exception details", exception);<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>          }<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>        }<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>      }<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span><a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>      // close the region now, and reopen again<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>      region = HRegion.openHRegion(region, null);<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span><a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>      // now check whether we have can read back the data from region<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>        Get get = new Get(Bytes.toBytes(i));<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>        Result result = region.get(get);<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>        byte[] value = result.getValue(family, Bytes.toBytes(i));<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>        assertArrayEquals(Bytes.toBytes(i), value);<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>      }<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>    } finally {<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>      this.region = null;<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>      wals.close();<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>    }<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>  }<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span><a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>  static class IsFlushWALMarker implements ArgumentMatcher&lt;WALEdit&gt; {<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>    volatile FlushAction[] actions;<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>    public IsFlushWALMarker(FlushAction... actions) {<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>      this.actions = actions;<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>    }<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span>    @Override<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>    public boolean matches(WALEdit edit) {<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>      List&lt;Cell&gt; cells = edit.getCells();<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>      if (cells.isEmpty()) {<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span>        return false;<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>      }<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>      if (WALEdit.isMetaEditFamily(cells.get(0))) {<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>        FlushDescriptor desc;<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>        try {<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>          desc = WALEdit.getFlushDescriptor(cells.get(0));<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>        } catch (IOException e) {<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>          LOG.warn(e.toString(), e);<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>          return false;<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>        }<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>        if (desc != null) {<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>          for (FlushAction action : actions) {<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>            if (desc.getAction() == action) {<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>              return true;<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>            }<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>          }<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>        }<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>      }<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span>      return false;<a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>    }<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>    public IsFlushWALMarker set(FlushAction... actions) {<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>      this.actions = actions;<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>      return this;<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>    }<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>  }<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span><a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>  @Test<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span>  public void testFlushMarkersWALFail() throws Exception {<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>    // test the cases where the WAL append for flush markers fail.<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>    byte[] family = Bytes.toBytes("family");<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span><a name="line.1151"></a>
+<span class="sourceLineNo">1152</span>    // spy an actual WAL implementation to throw exception (was not able to mock)<a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>    Path logDir = TEST_UTIL.getDataTestDirOnTestFS(method + "log");<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span><a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>    final Configuration walConf = new Configuration(TEST_UTIL.getConfiguration());<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>    // Make up a WAL that we can manipulate at append time.<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>    class FailAppendFlushMarkerWAL extends FSHLog {<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>      volatile FlushAction [] flushActions = null;<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span><a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>      public FailAppendFlushMarkerWAL(FileSystem fs, Path root, String logDir, Configuration conf)<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>      throws IOException {<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>        super(fs, root, logDir, conf);<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>      }<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span><a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>      @Override<a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>      protected Writer createWriterInstance(Path path) throws IOException {<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>        final Writer w = super.createWriterInstance(path);<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>        return new Writer() {<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>          @Override<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>          public void close() throws IOException {<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>            w.close();<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>          }<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span><a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>          @Override<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>          public void sync(boolean forceSync) throws IOException {<a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>            w.sync(forceSync);<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span>          }<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span><a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>          @Override<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>          public void append(Entry entry) throws IOException {<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>            List&lt;Cell&gt; cells = entry.getEdit().getCells();<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>            if (WALEdit.isMetaEditFamily(cells.get(0))) {<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>              FlushDescriptor desc = WALEdit.getFlushDescriptor(cells.get(0));<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>              if (desc != null) {<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>                for (FlushAction flushAction: flushActions) {<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>                  if (desc.getAction().equals(flushAction)) {<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>                    throw new IOException("Failed to append flush marker! " + flushAction);<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>                  }<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>                }<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>              }<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>            }<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>            w.append(entry);<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>          }<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span><a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>          @Override<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>          public long getLength() {<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>            return w.getLength();<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>          }<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>        };<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>      }<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>    }<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>    FailAppendFlushMarkerWAL wal =<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>      new FailAppendFlushMarkerWAL(FileSystem.get(walConf), FSUtils.getRootDir(walConf),<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>        method, walConf);<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>    wal.init();<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>    this.region = initHRegion(tableName, HConstants.EMPTY_START_ROW,<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>      HConstants.EMPTY_END_ROW, false, Durability.USE_DEFAULT, wal, family);<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>    int i = 0;<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>    Put put = new Put(Bytes.toBytes(i));<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>    put.setDurability(Durability.SKIP_WAL); // have to skip mocked wal<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>    put.addColumn(family, Bytes.toBytes(i), Bytes.toBytes(i));<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>    region.put(put);<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span><a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>    // 1. Test case where START_FLUSH throws exception<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>    wal.flushActions = new FlushAction [] {FlushAction.START_FLUSH};<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span><a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>    // start cache flush will throw exception<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>    try {<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>      region.flush(true);<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>      fail("This should have thrown exception");<a name="line.1221"></a>
+<span class="sourceLineNo">1222</span>    } catch (DroppedSnapshotException unexpected) {<a name="line.1222"></a>
+<span class="sourceLineNo">1223</span>      // this should not be a dropped snapshot exception. Meaning that RS will not abort<a name="line.1223"></a>
+<span class="sourceLineNo">1224</span>      throw unexpected;<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span>    } catch (IOException expected) {<a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>      // expected<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span>    }<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>    // The WAL is hosed now. It has two edits appended. We cannot roll the log without it<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>    // throwing a DroppedSnapshotException to force an abort. Just clean up the mess.<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>    region.close(true);<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>    wal.close();<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span><a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>    // 2. Test case where START_FLUSH succeeds but COMMIT_FLUSH will throw exception<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>    wal.flushActions = new FlushAction [] {FlushAction.COMMIT_FLUSH};<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>    wal = new FailAppendFlushMarkerWAL(FileSystem.get(walConf), FSUtils.getRootDir(walConf),<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>          method, walConf);<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>    wal.init();<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span>    this.region = initHRegion(tableName, HConstants.EMPTY_START_ROW,<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>      HConstants.EMPTY_END_ROW, false, Durability.USE_DEFAULT, wal, family);<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>    region.put(put);<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span><a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>    // 3. Test case where ABORT_FLUSH will throw exception.<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span>    // Even if ABORT_FLUSH throws exception, we should not fail with IOE, but continue with<a name="line.1243"></a>
+<span class="sourceLineNo">1244</span>    // DroppedSnapshotException. Below COMMMIT_FLUSH will cause flush to abort<a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>    wal.flushActions = new FlushAction [] {FlushAction.COMMIT_FLUSH, FlushAction.ABORT_FLUSH};<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span><a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>    try {<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span>      region.flush(true);<a name="line.1248"></a>
+<span class="sourceLineNo">1249</span>      fail("This should have thrown exception");<a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>    } catch (DroppedSnapshotException expected) {<a name="line.1250"></a>
+<span class="sourceLineNo">1251</span>      // we expect this exception, since we were able to write the snapshot, but failed to<a name="line.1251"></a>
+<span class="sourceLineNo">1252</span>      // write the flush marker to WAL<a name="line.1252"></a>
+<span class="sourceLineNo">1253</span>    } catch (IOException unexpected) {<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span>      throw unexpected;<a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>    }<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>  }<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span><a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>  @Test<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>  public void testGetWhileRegionClose() throws IOException {<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span>    Configuration hc = initSplit();<a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>    int numRows = 100;<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>    byte[][] families = { fam1, fam2, fam3 };<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span><a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>    // Setting up region<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span>    this.region = initHRegion(tableName, method, hc, families);<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>    // Put data in region<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span>    final int startRow = 100;<a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>    putData(startRow, numRows, qual1, families);<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>    putData(startRow, numRows, qual2, families);<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>    putData(startRow, numRows, qual3, families);<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span>    final AtomicBoolean done = new AtomicBoolean(false);<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>    final AtomicInteger gets = new AtomicInteger(0);<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>    GetTillDoneOrException[] threads = new GetTillDoneOrException[10];<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>    try {<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>      // Set ten threads running concurrently getting from the region.<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span>      for (int i = 0; i &lt; threads.length / 2; i++) {<a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>        threads[i] = new GetTillDoneOrException(i, Bytes.toBytes("" + startRow), done, gets);<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>        threads[i].setDaemon(true);<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>        threads[i].start();<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>      }<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>      // Artificially make the condition by setting closing flag explicitly.<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span>      // I can't make the issue happen with a call to region.close().<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span>      this.region.closing.set(true);<a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>      for (int i = threads.length / 2; i &lt; threads.length; i++) {<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>        threads[i] = new GetTillDoneOrException(i, Bytes.toBytes("" + startRow), done, gets);<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>        threads[i].setDaemon(true);<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>        threads[i].start();<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span>      }<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>    } finally {<a name="line.1289"></a>
+<span class="sourceLineNo">1290</span>      if (this.region != null) {<a name="line.1290"></a>
+<span class="sourceLineNo">1291</span>        HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>        this.region = null;<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>      }<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>    }<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>    done.set(true);<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>    for (GetTillDoneOrException t : threads) {<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span>      try {<a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>        t.join();<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>      } catch (InterruptedException e) {<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>        e.printStackTrace();<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>      }<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>      if (t.e != null) {<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span>        LOG.info("Exception=" + t.e);<a name="line.1303"></a>
+<span class="sourceLineNo">1304</span>        assertFalse("Found a NPE in " + t.getName(), t.e instanceof NullPointerException);<a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>      }<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>    }<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span>  }<a name="line.1307"></a>
+<span class="sourceLineNo">1308</span><a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>  /*<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>   * Thread that does get on single row until 'done' flag is flipped. If an<a name="line.1310"></a>
+<span class="sourceLineNo">1311</span>   * exception causes us to fail, it records it.<a name="line.1311"></a>
+<span class="sourceLineNo">1312</span>   */<a name="line.1312"></a>
+<span class="sourceLineNo">1313</span>  class GetTillDoneOrException extends Thread {<a name="line.1313"></a>
+<span class="sourceLineNo">1314</span>    private final Get g;<a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>    private final AtomicBoolean done;<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>    private final AtomicInteger count;<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>    private Exception e;<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span><a name="line.1318"></a>
+<span class="sourceLineNo">1319</span>    GetTillDoneOrException(final int i, final byte[] r, final AtomicBoolean d,<a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>        final AtomicInteger c) {<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>      super("getter." + i);<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>      this.g = new Get(r);<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>      this.done = d;<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span>      this.count = c;<a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>    }<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span><a name="line.1326"></a>
+<span class="sourceLineNo">1327</span>    @Override<a name="line.1327"></a>
+<span class="sourceLineNo">1328</span>    public void run() {<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>      while (!this.done.get()) {<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span>        try {<a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>          assertTrue(region.get(g).size() &gt; 0);<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>          this.count.incrementAndGet();<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>        } catch (Exception e) {<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>          this.e = e;<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span>          break;<a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>        }<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>      }<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>    }<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>  }<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span><a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>  /*<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>   * An involved filter test. Has multiple column families and deletes in mix.<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>   */<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>  @Test<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>  public void testWeirdCacheBehaviour() throws Exception {<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.1346"></a>
+<span class="sourceLineNo">1347</span>    byte[][] FAMILIES = new byte[][] { Bytes.toBytes("trans-blob"), Bytes.toBytes("trans-type"),<a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>        Bytes.toBytes("trans-date"), Bytes.toBytes("trans-tags"), Bytes.toBytes("trans-group") };<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span>    this.region = initHRegion(tableName, method, CONF, FAMILIES);<a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>    String value = "this is the value";<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>    String value2 = "this is some other value";<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>    String keyPrefix1 = "prefix1";<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>    String keyPrefix2 = "prefix2";<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span>    String keyPrefix3 = "prefix3";<a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>    putRows(this.region, 3, value, keyPrefix1);<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>    putRows(this.region, 3, value, keyPrefix2);<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span>    putRows(this.region, 3, value, keyPrefix3);<a name="line.1357"></a>
+<span class="sourceLineNo">1358</span>    putRows(this.region, 3, value2, keyPrefix1);<a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>    putRows(this.region, 3, value2, keyPrefix2);<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>    putRows(this.region, 3, value2, keyPrefix3);<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span>    System.out.println("Checking values for key: " + keyPrefix1);<a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>    assertEquals("Got back incorrect number of rows from scan", 3,<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>        getNumberOfRows(keyPrefix1, value2, this.region));<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span>    System.out.println("Checking values for key: " + keyPrefix2);<a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>    assertEquals("Got back incorrect number of rows from scan", 3,<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span>        getNumberOfRows(keyPrefix2, value2, this.region));<a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>    System.out.println("Checking values for key: " + keyPrefix3);<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>    assertEquals("Got back incorrect number of rows from scan", 3,<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>        getNumberOfRows(keyPrefix3, value2, this.region));<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>    deleteColumns(this.region, value2, keyPrefix1);<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>    deleteColumns(this.region, value2, keyPrefix2);<a name="line.1371"></a>
+<span class="sourceLineNo">1372</span>    deleteColumns(this.region, value2, keyPrefix3);<a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>    System.out.println("Starting important checks.....");<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>    assertEquals("Got back incorrect number of rows from scan: " + keyPrefix1, 0,<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span>        getNumberOfRows(keyPrefix1, value2, this.region));<a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>    assertEquals("Got back incorrect number of rows from scan: " + keyPrefix2, 0,<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>        getNumberOfRows(keyPrefix2, value2, this.region));<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>    assertEquals("Got back incorrect number of rows from scan: " + keyPrefix3, 0,<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span>        getNumberOfRows(keyPrefix3, value2, this.region));<a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>  }<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span><a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>  @Test<a name="line.1382"></a>
+<span class="sourceLineNo">1383</span>  public void testAppendWithReadOnlyTable() throws Exception {<a name="line.1383"></a>
+<span class="sourceLineNo">1384</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.1384"></a>
+<span class="sourceLineNo">1385</span>    this.region = initHRegion(tableName, method, CONF, true, Bytes.toBytes("somefamily"));<a name="line.1385"></a>
+<span class="sourceLineNo">1386</span>    boolean exceptionCaught = false;<a name="line.1386"></a>
+<span class="sourceLineNo">1387</span>    Append append = new Append(Bytes.toBytes("somerow"));<a name="line.1387"></a>
+<span class="sourceLineNo">1388</span>    append.setDurability(Durability.SKIP_WAL);<a name="line.1388"></a>
+<span class="sourceLineNo">1389</span>    append.addColumn(Bytes.toBytes("somefamily"), Bytes.toBytes("somequalifier"),<a name="line.1389"></a>
+<span class="sourceLineNo">1390</span>        Bytes.toBytes("somevalue"));<a name="line.1390"></a>
+<span class="sourceLineNo">1391</span>    try {<a name="line.1391"></a>
+<span class="sourceLineNo">1392</span>      region.append(append);<a name="line.1392"></a>
+<span class="sourceLineNo">1393</span>    } catch (IOException e) {<a name="line.1393"></a>
+<span class="sourceLineNo">1394</span>      exceptionCaught = true;<a name="line.1394"></a>
+<span class="sourceLineNo">1395</span>    }<a name="line.1395"></a>
+<span class="sourceLineNo">1396</span>    assertTrue(exceptionCaught == true);<a name="line.1396"></a>
+<span class="sourceLineNo">1397</span>  }<a name="line.1397"></a>
+<span class="sourceLineNo">1398</span><a name="line.1398"></a>
+<span class="sourceLineNo">1399</span>  @Test<a name="line.1399"></a>
+<span class="sourceLineNo">1400</span>  public void testIncrWithReadOnlyTable() throws Exception {<a name="line.1400"></a>
+<span class="sourceLineNo">1401</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.1401"></a>
+<span class="sourceLineNo">1402</span>    this.region = initHRegion(tableName, method, CONF, true, Bytes.toBytes("somefamily"));<a name="line.1402"></a>
+<span class="sourceLineNo">1403</span>    boolean exceptionCaught = false;<a name="line.1403"></a>
+<span class="sourceLineNo">1404</span>    Increment inc = new Increment(Bytes.toBytes("somerow"));<a name="line.1404"></a>
+<span class="sourceLineNo">1405</span>    inc.setDurability(Durability.SKIP_WAL);<a name="line.1405"></a>
+<span class="sourceLineNo">1406</span>    inc.addColumn(Bytes.toBytes("somefamily"), Bytes.toBytes("somequalifier"), 1L);<a name="line.1406"></a>
+<span class="sourceLineNo">1407</span>    try {<a name="line.1407"></a>
+<span class="sourceLineNo">1408</span>      region.increment(inc);<a name="line.1408"></a>
+<span class="sourceLineNo">1409</span>    } catch (IOException e) {<a name="line.1409"></a>
+<span class="sourceLineNo">1410</span>      exceptionCaught = true;<a name="line.1410"></a>
+<span class="sourceLineNo">1411</span>    }<a name="line.1411"></a>
+<span class="sourceLineNo">1412</span>    assertTrue(exceptionCaught == true);<a name="line.1412"></a>
+<span class="sourceLineNo">1413</span>  }<a name="line.1413"></a>
+<span class="sourceLineNo">1414</span><a name="line.1414"></a>
+<span class="sourceLineNo">1415</span>  private void deleteColumns(HRegion r, String value, String keyPrefix) throws IOException {<a name="line.1415"></a>
+<span class="sourceLineNo">1416</span>    InternalScanner scanner = buildScanner(keyPrefix, value, r);<a name="line.1416"></a>
+<span class="sourceLineNo">1417</span>    int count = 0;<a name="line.1417"></a>
+<span class="sourceLineNo">1418</span>    boolean more = false;<a name="line.1418"></a>
+<span class="sourceLineNo">1419</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.1419"></a>
+<span class="sourceLineNo">1420</span>    do {<a name="line.1420"></a>
+<span class="sourceLineNo">1421</span>      more = scanner.next(results);<a name="line.1421"></a>
+<span class="sourceLineNo">1422</span>      if (results != null &amp;&amp; !results.isEmpty())<a name="line.1422"></a>
+<span class="sourceLineNo">1423</span>        count++;<a name="line.1423"></a>
+<span class="sourceLineNo">1424</span>      else<a name="line.1424"></a>
+<span class="sourceLineNo">1425</span>        break;<a name="line.1425"></a>
+<span class="sourceLineNo">1426</span>      Delete delete = new Delete(CellUtil.cloneRow(results.get(0)));<a name="line.1426"></a>
+<span class="sourceLineNo">1427</span>      delete.addColumn(Bytes.toBytes("trans-tags"), Bytes.toBytes("qual2"));<a name="line.1427"></a>
+<span class="sourceLineNo">1428</span>      r.delete(delete);<a name="line.1428"></a>
+<span class="sourceLineNo">1429</span>      results.clear();<a name="line.1429"></a>
+<span class="sourceLineNo">1430</span>    } while (more);<a name="line.1430"></a>
+<span class="sourceLineNo">1431</span>    assertEquals("Did not perform correct number of deletes", 3, count);<a name="line.1431"></a>
+<span class="sourceLineNo">1432</span>  }<a name="line.1432"></a>
+<span class="sourceLineNo">1433</span><a name="line.1433"></a>
+<span class="sourceLineNo">1434</span>  private int getNumberOfRows(String keyPrefix, String value, HRegion r) throws Exception {<a name="line.1434"></a>
+<span class="sourceLineNo">1435</span>    InternalScanner resultScanner = buildScanner(keyPrefix, value, r);<a name="line.1435"></a>
+<span class="sourceLineNo">1436</span>    int numberOfResults = 0;<a name="line.1436"></a>
+<span class="sourceLineNo">1437</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.1437"></a>
+<span class="sourceLineNo">1438</span>    boolean more = false;<a name="line.1438"></a>
+<span class="sourceLineNo">1439</span>    do {<a name="line.1439"></a>
+<span class="sourceLineNo">1440</span>      more = resultScanner.next(results);<a name="line.1440"></a>
+<span class="sourceLineNo">1441</span>      if (results != null &amp;&amp; !results.isEmpty())<a name="line.1441"></a>
+<span class="sourceLineNo">1442</span>        numberOfResults++;<a name="line.1442"></a>
+<span class="sourceLineNo">1443</span>      else<a name="line.1443"></a>
+<span class="sourceLineNo">1444</span>        break;<a name="line.1444"></a>
+<span class="sourceLineNo">1445</span>      for (Cell kv : results) {<a name="line.1445"></a>
+<span class="sourceLineNo">1446</span>        System.out.println("kv=" + kv.toString() + ", " + Bytes.toString(CellUtil.cloneValue(kv)));<a name="line.1446"></a>
+<span class="sourceLineNo">1447</span>      }<a name="line.1447"></a>
+<span class="sourceLineNo">1448</span>      results.clear();<a name="line.1448"></a>
+<span class="sourceLineNo">1449</span>    } while (more);<a name="line.1449"></a>
+<span class="sourceLineNo">1450</span>    return numberOfResults;<a name="line.1450"></a>
+<span class="sourceLineNo">1451</span>  }<a name="line.1451"></a>
+<span class="sourceLineNo">1452</span><a name="line.1452"></a>
+<span class="sourceLineNo">1453</span>  private InternalScanner buildScanner(String keyPrefix, String value, HRegion r)<a name="line.1453"></a>
+<span class="sourceLineNo">1454</span>      throws IOException {<a name="line.1454"></a>
+<span class="sourceLineNo">1455</span>    // Defaults FilterList.Operator.MUST_PASS_ALL.<a name="line.1455"></a>
+<span class="sourceLineNo">1456</span>    FilterList allFilters = new FilterList();<a name="line.1456"></a>
+<span class="sourceLineNo">1457</span>    allFilters.addFilter(new PrefixFilter(Bytes.toBytes(keyPrefix)));<a name="line.1457"></a>
+<span class="sourceLineNo">1458</span>    // Only return rows where this column value exists in the row.<a name="line.1458"></a>
+<span class="sourceLineNo">1459</span>    SingleColumnValueFilter filter = new SingleColumnValueFilter(Bytes.toBytes("trans-tags"),<a name="line.1459"></a>
+<span class="sourceLineNo">1460</span>        Bytes.toBytes("qual2"), CompareOperator.EQUAL, Bytes.toBytes(value));<a name="line.1460"></a>
+<span class="sourceLineNo">1461</span>    filter.setFilterIfMissing(true);<a name="line.1461"></a>
+<span class="sourceLineNo">1462</span>    allFilters.addFilter(filter);<a name="line.1462"></a>
+<span class="sourceLineNo">1463</span>    Scan scan = new Scan();<a name="line.1463"></a>
+<span class="sourceLineNo">1464</span>    scan.addFamily(Bytes.toBytes("trans-blob"));<a name="line.1464"></a>
+<span class="sourceLineNo">1465</span>    scan.addFamily(Bytes.toBytes("trans-type"));<a name="line.1465"></a>
+<span class="sourceLineNo">1466</span>    scan.addFamily(Bytes.toBytes("trans-date"));<a name="line.1466"></a>
+<span class="sourceLineNo">1467</span>    scan.addFamily(Bytes.toBytes("trans-tags"));<a name="line.1467"></a>
+<span class="sourceLineNo">1468</span>    scan.addFamily(Bytes.toBytes("trans-group"));<a name="line.1468"></a>
+<span class="sourceLineNo">1469</span>    scan.setFilter(allFilters);<a name="line.1469"></a>
+<span class="sourceLineNo">1470</span>    return r.getScanner(scan);<a name="line.1470"></a>
+<span class="sourceLineNo">1471</span>  }<a name="line.1471"></a>
+<span class="sourceLineNo">1472</span><a name="line.1472"></a>
+<span class="sourceLineNo">1473</span>  private void putRows(HRegion r, int numRows, String value, String key) throws IOException {<a name="line.1473"></a>
+<span class="sourceLineNo">1474</span>    for (int i = 0; i &lt; numRows; i++) {<a name="line.1474"></a>
+<span class="sourceLineNo">1475</span>      String row = key + "_" + i/* UUID.randomUUID().toString() */;<a name="line.1475"></a>
+<span class="sourceLineNo">1476</span>      System.out.println(String.format("Saving row: %s, with value %s", row, value));<a name="line.1476"></a>
+<span class="sourceLineNo">1477</span>      Put put = new Put(Bytes.toBytes(row));<a name="line.1477"></a>
+<span class="sourceLineNo">1478</span>      put.setDurability(Durability.SKIP_WAL);<a name="line.1478"></a>
+<span class="sourceLineNo">1479</span>      put.addColumn(Bytes.toBytes("trans-blob"), null, Bytes.toBytes("value for blob"));<a name="line.1479"></a>
+<span class="sourceLineNo">1480</span>      put.addColumn(Bytes.toBytes("trans-type"), null, Bytes.toBytes("statement"));<a name="line.1480"></a>
+<span class="sourceLineNo">1481</span>      put.addColumn(Bytes.toBytes("trans-date"), null, Bytes.toBytes("20090921010101999"));<a name="line.1481"></a>
+<span class="sourceLineNo">1482</span>      put.addColumn(Bytes.toBytes("trans-tags"), Bytes.toBytes("qual2"), Bytes.toBytes(value));<a name="line.1482"></a>
+<span class="sourceLineNo">1483</span>      put.addColumn(Bytes.toBytes("trans-group"), null, Bytes.toBytes("adhocTransactionGroupId"));<a name="line.1483"></a>
+<span class="sourceLineNo">1484</span>      r.put(put);<a name="line.1484"></a>
+<span class="sourceLineNo">1485</span>    }<a name="line.1485"></a>
+<span class="sourceLineNo">1486</span>  }<a name="line.1486"></a>
+<span class="sourceLineNo">1487</span><a name="line.1487"></a>
+<span class="sourceLineNo">1488</span>  @Test<a name="line.1488"></a>
+<span class="sourceLineNo">1489</span>  public void testFamilyWithAndWithoutColon() throws Exception {<a name="line.1489"></a>
+<span class="sourceLineNo">1490</span>    byte[] cf = Bytes.toBytes(COLUMN_FAMILY);<a name="line.1490"></a>
+<span class="sourceLineNo">1491</span>    this.region = initHRegion(tableName, method, CONF, cf);<a name="line.1491"></a>
+<span class="sourceLineNo">1492</span>    Put p = new Put(tableName.toBytes());<a name="line.1492"></a>
+<span class="sourceLineNo">1493</span>    byte[] cfwithcolon = Bytes.toBytes(COLUMN_FAMILY + ":");<a name="line.1493"></a>
+<span class="sourceLineNo">1494</span>    p.addColumn(cfwithcolon, cfwithcolon, cfwithcolon);<a name="line.1494"></a>
+<span class="sourceLineNo">1495</span>    boolean exception = false;<a name="line.1495"></a>
+<span class="sourceLineNo">1496</span>    try {<a name="line.1496"></a>
+<span class="sourceLineNo">1497</span>      this.region.put(p);<a name="line.1497"></a>
+<span class="sourceLineNo">1498</span>    } catch (NoSuchColumnFamilyException e) {<a name="line.1498"></a>
+<span class="sourceLineNo">1499</span>      exception = true;<a name="line.1499"></a>
+<span class="sourceLineNo">1500</span>    }<a name="line.1500"></a>
+<span class="sourceLineNo">1501</span>    assertTrue(exception);<a name="line.1501"></a>
+<span class="sourceLineNo">1502</span>  }<a name="line.1502"></a>
+<span class="sourceLineNo">1503</span><a name="line.1503"></a>
+<span class="sourceLineNo">1504</span>  @Test<a name="line.1504"></a>
+<span class="sourceLineNo">1505</span>  public void testBatchPut_whileNoRowLocksHeld() throws IOException {<a name="line.1505"></a>
+<span class="sourceLineNo">1506</span>    final Put[] puts = new Put[10];<a name="line.1506"></a>
+<span class="sourceLineNo">1507</span>    MetricsWALSource source = CompatibilitySingletonFactory.getInstance(MetricsWALSource.class);<a name="line.1507"></a>
+<span class="sourceLineNo">1508</span>    long syncs = prepareRegionForBachPut(puts, source, false);<a name="line.1508"></a>
+<span class="sourceLineNo">1509</span><a name="line.1509"></a>
+<span class="sourceLineNo">1510</span>    OperationStatus[] codes = this.region.batchMutate(puts);<a name="line.1510"></a>
+<span class="sourceLineNo">1511</span>    assertEquals(10, codes.length);<a name="line.1511"></a>
+<span class="sourceLineNo">1512</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.1512"></a>
+<span class="sourceLineNo">1513</span>      assertEquals(OperationStatusCode.SUCCESS, codes[i].getOperationStatusCode());<a name="line.1513"></a>
+<span class="sourceLineNo">1514</span>    }<a name="line.1514"></a>
+<span class="sourceLineNo">1515</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs + 1, source);<a name="line.1515"></a>
+<span class="sourceLineNo">1516</span><a name="line.1516"></a>
+<span class="sourceLineNo">1517</span>    LOG.info("Next a batch put with one invalid family");<a name="line.1517"></a>
+<span class="sourceLineNo">1518</span>    puts[5].addColumn(Bytes.toBytes("BAD_CF"), qual, value);<a name="line.1518"></a>
+<span class="sourceLineNo">1519</span>    codes = this.region.batchMutate(puts);<a name="line.1519"></a>
+<span class="sourceLineNo">1520</span>    assertEquals(10, codes.length);<a name="line.1520"></a>
+<span class="sourceLineNo">1521</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.1521"></a>
+<span class="sourceLineNo">1522</span>      assertEquals((i == 5) ? OperationStatusCode.BAD_FAMILY : OperationStatusCode.SUCCESS,<a name="line.1522"></a>
+<span class="sourceLineNo">1523</span>          codes[i].getOperationStatusCode());<a name="line.1523"></a>
+<span class="sourceLineNo">1524</span>    }<a name="line.1524"></a>
+<span class="sourceLineNo">1525</span><a name="line.1525"></a>
+<span class="sourceLineNo">1526</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs + 2, source);<a name="line.1526"></a>
+<span class="sourceLineNo">1527</span>  }<a name="line.1527"></a>
+<span class="sourceLineNo">1528</span><a name="line.1528"></a>
+<span class="sourceLineNo">1529</span>  @Test<a name="line.1529"></a>
+<span class="sourceLineNo">1530</span>  public void testBatchPut_whileMultipleRowLocksHeld() throws Exception {<a name="line.1530"></a>
+<span class="sourceLineNo">1531</span>    final Put[] puts = new Put[10];<a name="line.1531"></a>
+<span class="sourceLineNo">1532</span>    MetricsWALSource source = CompatibilitySingletonFactory.getInstance(MetricsWALSource.class);<a name="line.1532"></a>
+<span class="sourceLineNo">1533</span>    long syncs = prepareRegionForBachPut(puts, source, false);<a name="line.1533"></a>
+<span class="sourceLineNo">1534</span><a name="line.1534"></a>
+<span class="sourceLineNo">1535</span>    puts[5].addColumn(Bytes.toBytes("BAD_CF"), qual, value);<a name="line.1535"></a>
+<span class="sourceLineNo">1536</span><a name="line.1536"></a>
+<span class="sourceLineNo">1537</span>    LOG.info("batchPut will have to break into four batches to avoid row locks");<a name="line.1537"></a>
+<span class="sourceLineNo">1538</span>    RowLock rowLock1 = region.getRowLock(Bytes.toBytes("row_2"));<a name="line.1538"></a>
+<span class="sourceLineNo">1539</span>    RowLock rowLock2 = region.getRowLock(Bytes.toBytes("row_1"));<a name="line.1539"></a>
+<span class="sourceLineNo">1540</span>    RowLock rowLock3 = region.getRowLock(Bytes.toBytes("row_3"));<a name="line.1540"></a>
+<span class="sourceLineNo">1541</span>    RowLock rowLock4 = region.getRowLock(Bytes.toBytes("row_3"), true);<a name="line.1541"></a>
+<span class="sourceLineNo">1542</span><a name="line.1542"></a>
+<span class="sourceLineNo">1543</span>    MultithreadedTestUtil.TestContext ctx = new MultithreadedTestUtil.TestContext(CONF);<a name="line.1543"></a>
+<span class="sourceLineNo">1544</span>    final AtomicReference&lt;OperationStatus[]&gt; retFromThread = new AtomicReference&lt;&gt;();<a name="line.1544"></a>
+<span class="sourceLineNo">1545</span>    final CountDownLatch startingPuts = new CountDownLatch(1);<a name="line.1545"></a>
+<span class="sourceLineNo">1546</span>    final CountDownLatch startingClose = new CountDownLatch(1);<a name="line.1546"></a>
+<span class="sourceLineNo">1547</span>    TestThread putter = new TestThread(ctx) {<a name="line.1547"></a>
+<span class="sourceLineNo">1548</span>      @Override<a name="line.1548"></a>
+<span class="sourceLineNo">1549</span>      public void doWork() throws IOException {<a name="line.1549"></a>
+<span class="sourceLineNo">1550</span>        startingPuts.countDown();<a name="line.1550"></a>
+<span class="sourceLineNo">1551</span>        retFromThread.set(region.batchMutate(puts));<a name="line.1551"></a>
+<span class="sourceLineNo">1552</span>      }<a name="line.1552"></a>
+<span class="sourceLineNo">1553</span>    };<a name="line.1553"></a>
+<span class="sourceLineNo">1554</span>    LOG.info("...starting put thread while holding locks");<a name="line.1554"></a>
+<span class="sourceLineNo">1555</span>    ctx.addThread(putter);<a name="line.1555"></a>
+<span class="sourceLineNo">1556</span>    ctx.startThreads();<a name="line.1556"></a>
+<span class="sourceLineNo">1557</span><a name="line.1557"></a>
+<span class="sourceLineNo">1558</span>    // Now attempt to close the region from another thread.  Prior to HBASE-12565<a name="line.1558"></a>
+<span class="sourceLineNo">1559</span>    // this would cause the in-progress batchMutate operation to to fail with<a name="line.1559"></a>
+<span class="sourceLineNo">1560</span>    // exception because it use to release and re-acquire the close-guard lock<a name="line.1560"></a>
+<span class="sourceLineNo">1561</span>    // between batches.  Caller then didn't get status indicating which writes succeeded.<a name="line.1561"></a>
+<span class="sourceLineNo">1562</span>    // We now expect this thread to block until the batchMutate call finishes.<a name="line.1562"></a>
+<span class="sourceLineNo">1563</span>    Thread regionCloseThread = new TestThread(ctx) {<a name="line.1563"></a>
+<span class="sourceLineNo">1564</span>      @Override<a name="line.1564"></a>
+<span class="sourceLineNo">1565</span>      public void doWork() {<a name="line.1565"></a>
+<span class="sourceLineNo">1566</span>        try {<a name="line.1566"></a>
+<span class="sourceLineNo">1567</span>          startingPuts.await();<a name="line.1567"></a>
+<span class="sourceLineNo">1568</span>          // Give some time for the batch mutate to get in.<a name="line.1568"></a>
+<span class="sourceLineNo">1569</span>          // We don't want to race with the mutate<a name="line.1569"></a>
+<span class="sourceLineNo">1570</span>          Thread.sleep(10);<a name="line.1570"></a>
+<span class="sourceLineNo">1571</span>          startingClose.countDown();<a name="line.1571"></a>
+<span class="sourceLineNo">1572</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.1572"></a>
+<span class="sourceLineNo">1573</span>          region = null;<a name="line.1573"></a>
+<span class="sourceLineNo">1574</span>        } catch (IOException e) {<a name="line.1574"></a>
+<span class="sourceLineNo">1575</span>          throw new RuntimeException(e);<a name="line.1575"></a>
+<span class="sourceLineNo">1576</span>        } catch (InterruptedException e) {<a name="line.1576"></a>
+<span class="sourceLineNo">1577</span>          throw new RuntimeException(e);<a name="line.1577"></a>
+<span class="sourceLineNo">1578</span>        }<a name="line.1578"></a>
+<span class="sourceLineNo">1579</span>      }<a name="line.1579"></a>
+<span class="sourceLineNo">1580</span>    };<a name="line.1580"></a>
+<span class="sourceLineNo">1581</span>    regionCloseThread.start();<a name="line.1581"></a>
+<span class="sourceLineNo">1582</span><a name="line.1582"></a>
+<span class="sourceLineNo">1583</span>    startingClose.await();<a name="line.1583"></a>
+<span class="sourceLineNo">1584</span>    startingPuts.await();<a name="line.1584"></a>
+<span class="sourceLineNo">1585</span>    Thread.sleep(100);<a name="line.1585"></a>
+<span class="sourceLineNo">1586</span>    LOG.info("...releasing row lock 1, which should let put thread continue");<a name="line.1586"></a>
+<span class="sourceLineNo">1587</span>    rowLock1.release();<a name="line.1587"></a>
+<span class="sourceLineNo">1588</span>    rowLock2.release();<a name="line.1588"></a>
+<span class="sourceLineNo">1589</span>    rowLock3.release();<a name="line.1589"></a>
+<span class="sourceLineNo">1590</span>    waitForCounter(source, "syncTimeNumOps", syncs + 1);<a name="line.1590"></a>
+<span class="sourceLineNo">1591</span><a name="line.1591"></a>
+<span class="sourceLineNo">1592</span>    LOG.info("...joining on put thread");<a name="line.1592"></a>
+<span class="sourceLineNo">1593</span>    ctx.stop();<a name="line.1593"></a>
+<span class="sourceLineNo">1594</span>    regionCloseThread.join();<a name="line.1594"></a>
+<span class="sourceLineNo">1595</span><a name="line.1595"></a>
+<span class="sourceLineNo">1596</span>    OperationStatus[] codes = retFromThread.get();<a name="line.1596"></a>
+<span class="sourceLineNo">1597</span>    for (int i = 0; i &lt; codes.length; i++) {<a name="line.1597"></a>
+<span class="sourceLineNo">1598</span>      assertEquals((i == 5) ? OperationStatusCode.BAD_FAMILY : OperationStatusCode.SUCCESS,<a name="line.1598"></a>
+<span class="sourceLineNo">1599</span>          codes[i].getOperationStatusCode());<a name="line.1599"></a>
+<span class="sourceLineNo">1600</span>    }<a name="line.1600"></a>
+<span class="sourceLineNo">1601</span>    rowLock4.release();<a name="line.1601"></a>
+<span class="sourceLineNo">1602</span>  }<a name="line.1602"></a>
+<span class="sourceLineNo">1603</span><a name="line.1603"></a>
+<span class="sourceLineNo">1604</span>  private void waitForCounter(MetricsWALSource source, String metricName, long expectedCount)<a name="line.1604"></a>
+<span class="sourceLineNo">1605</span>      throws InterruptedException {<a name="line.1605"></a>
+<span class="sourceLineNo">1606</span>    long startWait = System.currentTimeMillis();<a name="line.1606"></a>
+<span class="sourceLineNo">1607</span>    long currentCount;<a name="line.1607"></a>
+<span class="sourceLineNo">1608</span>    while ((currentCount = metricsAssertHelper.getCounter(metricName, source)) &lt; expectedCount) {<a name="line.1608"></a>
+<span class="sourceLineNo">1609</span>      Thread.sleep(100);<a name="line.1609"></a>
+<span class="sourceLineNo">1610</span>      if (System.currentTimeMillis() - startWait &gt; 10000) {<a name="line.1610"></a>
+<span class="sourceLineNo">1611</span>        fail(String.format("Timed out waiting for '%s' &gt;= '%s', currentCount=%s", metricName,<a name="line.1611"></a>
+<span class="sourceLineNo">1612</span>            expectedCount, currentCount));<a name="line.1612"></a>
+<span class="sourceLineNo">1613</span>      }<a name="line.1613"></a>
+<span class="sourceLineNo">1614</span>    }<a name="line.1614"></a>
+<span class="sourceLineNo">1615</span>  }<a name="line.1615"></a>
+<span class="sourceLineNo">1616</span><a name="line.1616"></a>
+<span class="sourceLineNo">1617</span>  @Test<a name="line.1617"></a>
+<span class="sourceLineNo">1618</span>  public void testAtomicBatchPut() throws IOException {<a name="line.1618"></a>
+<span class="sourceLineNo">1619</span>    final Put[] puts = new Put[10];<a name="line.1619"></a>
+<span class="sourceLineNo">1620</span>    MetricsWALSource source = CompatibilitySingletonFactory.getInstance(MetricsWALSource.class);<a name="line.1620"></a>
+<span class="sourceLineNo">1621</span>    long syncs = prepareRegionForBachPut(puts, source, false);<a name="line.1621"></a>
+<span class="sourceLineNo">1622</span><a name="line.1622"></a>
+<span class="sourceLineNo">1623</span>    // 1. Straight forward case, should succeed<a name="line.1623"></a>
+<span class="sourceLineNo">1624</span>    MutationBatchOperation batchOp = new MutationBatchOperation(region, puts, true,<a name="line.1624"></a>
+<span class="sourceLineNo">1625</span>        HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.1625"></a>
+<span class="sourceLineNo">1626</span>    OperationStatus[] codes = this.region.batchMutate(batchOp);<a name="line.1626"></a>
+<span class="sourceLineNo">1627</span>    assertEquals(10, codes.length);<a name="line.1627"></a>
+<span class="sourceLineNo">1628</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.1628"></a>
+<span class="sourceLineNo">1629</span>      assertEquals(OperationStatusCode.SUCCESS, codes[i].getOperationStatusCode());<a name="line.1629"></a>
+<span class="sourceLineNo">1630</span>    }<a name="line.1630"></a>
+<span class="sourceLineNo">1631</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs + 1, source);<a name="line.1631"></a>
+<span class="sourceLineNo">1632</span><a name="line.1632"></a>
+<span class="sourceLineNo">1633</span>    // 2. Failed to get lock<a name="line.1633"></a>
+<span class="sourceLineNo">1634</span>    RowLock lock = region.getRowLock(Bytes.toBytes("row_" + 3));<a name="line.1634"></a>
+<span class="sourceLineNo">1635</span>    // Method {@link HRegion#getRowLock(byte[])} is reentrant. As 'row_3' is locked in this<a name="line.1635"></a>
+<span class="sourceLineNo">1636</span>    // thread, need to run {@link HRegion#batchMutate(HRegion.BatchOperation)} in different thread<a name="line.1636"></a>
+<span class="sourceLineNo">1637</span>    MultithreadedTestUtil.TestContext ctx = new MultithreadedTestUtil.TestContext(CONF);<a name="line.1637"></a>
+<span class="sourceLineNo">1638</span>    final AtomicReference&lt;IOException&gt; retFromThread = new AtomicReference&lt;&gt;();<a name="line.1638"></a>
+<span class="sourceLineNo">1639</span>    final CountDownLatch finishedPuts = new CountDownLatch(1);<a name="line.1639"></a>
+<span class="sourceLineNo">1640</span>    final MutationBatchOperation finalBatchOp = new MutationBatchOperation(region, puts, true,<a name="line.1640"></a>
+<span class="sourceLineNo">1641</span>        HConstants<a name="line.1641"></a>
+<span class="sourceLineNo">1642</span>        .NO_NONCE,<a name="line.1642"></a>
+<span class="sourceLineNo">1643</span>        HConstants.NO_NONCE);<a name="line.1643"></a>
+<span class="sourceLineNo">1644</span>    TestThread putter = new TestThread(ctx) {<a name="line.1644"></a>
+<span class="sourceLineNo">1645</span>      @Override<a name="line.1645"></a>
+<span class="sourceLineNo">1646</span>      public void doWork() throws IOException {<a name="line.1646"></a>
+<span class="sourceLineNo">1647</span>        try {<a name="line.1647"></a>
+<span class="sourceLineNo">1648</span>          region.batchMutate(finalBatchOp);<a name="line.1648"></a>
+<span class="sourceLineNo">1649</span>        } catch (IOException ioe) {<a name="line.1649"></a>
+<span class="sourceLineNo">1650</span>          LOG.error("test failed!", ioe);<a name="line.1650"></a>
+<span class="sourceLineNo">1651</span>          retFromThread.set(ioe);<a name="line.1651"></a>
+<span class="sourceLineNo">1652</span>        }<a name="line.1652"></a>
+<span class="sourceLineNo">1653</span>        finishedPuts.countDown();<a name="line.1653"></a>
+<span class="sourceLineNo">1654</span>      }<a name="line.1654"></a>
+<span class="sourceLineNo">1655</span>    };<a name="line.1655"></a>
+<span class="sourceLineNo">1656</span>    LOG.info("...starting put thread while holding locks");<a name="line.1656"></a>
+<span class="sourceLineNo">1657</span>    ctx.addThread(putter);<a name="line.1657"></a>
+<span class="sourceLineNo">1658</span>    ctx.startThreads();<a name="line.1658"></a>
+<span class="sourceLineNo">1659</span>    LOG.info("...waiting for batch puts while holding locks");<a name="line.1659"></a>
+<span class="sourceLineNo">1660</span>    try {<a name="line.1660"></a>
+<span class="sourceLineNo">1661</span>      finishedPuts.await();<a name="line.1661"></a>
+<span class="sourceLineNo">1662</span>    } catch (InterruptedException e) {<a name="line.1662"></a>
+<span class="sourceLineNo">1663</span>      LOG.error("Interrupted!", e);<a name="line.1663"></a>
+<span class="sourceLineNo">1664</span>    } finally {<a name="line.1664"></a>
+<span class="sourceLineNo">1665</span>      if (lock != null) {<a name="line.1665"></a>
+<span class="sourceLineNo">1666</span>        lock.release();<a name="line.1666"></a>
+<span class="sourceLineNo">1667</span>      }<a name="line.1667"></a>
+<span class="sourceLineNo">1668</span>    }<a name="line.1668"></a>
+<span class="sourceLineNo">1669</span>    assertNotNull(retFromThread.get());<a name="line.1669"></a>
+<span class="sourceLineNo">1670</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs + 1, source);<a name="line.1670"></a>
+<span class="sourceLineNo">1671</span><a name="line.1671"></a>
+<span class="sourceLineNo">1672</span>    // 3. Exception thrown in validation<a name="line.1672"></a>
+<span class="sourceLineNo">1673</span>    LOG.info("Next a batch put with one invalid family");<a name="line.1673"></a>
+<span class="sourceLineNo">1674</span>    puts[5].addColumn(Bytes.toBytes("BAD_CF"), qual, value);<a name="line.1674"></a>
+<span class="sourceLineNo">1675</span>    batchOp = new MutationBatchOperation(region, puts, true, HConstants.NO_NONCE,<a name="line.1675"></a>
+<span class="sourceLineNo">1676</span>        HConstants.NO_NONCE);<a name="line.1676"></a>
+<span class="sourceLineNo">1677</span>    thrown.expect(NoSuchColumnFamilyException.class);<a name="line.1677"></a>
+<span class="sourceLineNo">1678</span>    this.region.batchMutate(batchOp);<a name="line.1678"></a>
+<span class="sourceLineNo">1679</span>  }<a name="line.1679"></a>
+<span class="sourceLineNo">1680</span><a name="line.1680"></a>
+<span class="sourceLineNo">1681</span>  @Test<a name="line.1681"></a>
+<span class="sourceLineNo">1682</span>  public void testBatchPutWithTsSlop() throws Exception {<a name="line.1682"></a>
+<span class="sourceLineNo">1683</span>    // add data with a timestamp that is too recent for range. Ensure assert<a name="line.1683"></a>
+<span class="sourceLineNo">1684</span>    CONF.setInt("hbase.hregion.keyvalue.timestamp.slop.millisecs", 1000);<a name="line.1684"></a>
+<span class="sourceLineNo">1685</span>    final Put[] puts = new Put[10];<a name="line.1685"></a>
+<span class="sourceLineNo">1686</span>    MetricsWALSource source = CompatibilitySingletonFactory.getInstance(MetricsWALSource.class);<a name="line.1686"></a>
+<span class="sourceLineNo">1687</span><a name="line.1687"></a>
+<span class="sourceLineNo">1688</span>    long syncs = prepareRegionForBachPut(puts, source, true);<a name="line.1688"></a>
+<span class="sourceLineNo">1689</span><a name="line.1689"></a>
+<span class="sourceLineNo">1690</span>    OperationStatus[] codes = this.region.batchMutate(puts);<a name="line.1690"></a>
+<span class="sourceLineNo">1691</span>    assertEquals(10, codes.length);<a name="line.1691"></a>
+<span class="sourceLineNo">1692</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.1692"></a>
+<span class="sourceLineNo">1693</span>      assertEquals(OperationStatusCode.SANITY_CHECK_FAILURE, codes[i].getOperationStatusCode());<a name="line.1693"></a>
+<span class="sourceLineNo">1694</span>    }<a name="line.1694"></a>
+<span class="sourceLineNo">1695</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs, source);<a name="line.1695"></a>
+<span class="sourceLineNo">1696</span>  }<a name="line.1696"></a>
+<span class="sourceLineNo">1697</span><a name="line.1697"></a>
+<span class="sourceLineNo">1698</span>  /**<a name="line.1698"></a>
+<span class="sourceLineNo">1699</span>   * @return syncs initial syncTimeNumOps<a name="line.1699"></a>
+<span class="sourceLineNo">1700</span>   */<a name="line.1700"></a>
+<span class="sourceLineNo">1701</span>  private long prepareRegionForBachPut(final Put[] puts, final MetricsWALSource source,<a name="line.1701"></a>
+<span class="sourceLineNo">1702</span>      boolean slop) throws IOException {<a name="line.1702"></a>
+<span class="sourceLineNo">1703</span>    this.region = initHRegion(tableName, method, CONF, COLUMN_FAMILY_BYTES);<a name="line.1703"></a>
+<span class="sourceLineNo">1704</span><a name="line.1704"></a>
+<span class="sourceLineNo">1705</span>    LOG.info("First a batch put with all valid puts");<a name="line.1705"></a>
+<span class="sourceLineNo">1706</span>    for (int i = 0; i &lt; puts.length; i++) {<a name="line.1706"></a>
+<span class="sourceLineNo">1707</span>      puts[i] = slop ? new Put(Bytes.toBytes("row_" + i), Long.MAX_VALUE - 100) :<a name="line.1707"></a>
+<span class="sourceLineNo">1708</span>          new Put(Bytes.toBytes("row_" + i));<a name="line.1708"></a>
+<span class="sourceLineNo">1709</span>      puts[i].addColumn(COLUMN_FAMILY_BYTES, qual, value);<a name="line.1709"></a>
+<span class="sourceLineNo">1710</span>    }<a name="line.1710"></a>
+<span class="sourceLineNo">1711</span><a name="line.1711"></a>
+<span class="sourceLineNo">1712</span>    long syncs = metricsAssertHelper.getCounter("syncTimeNumOps", source);<a name="line.1712"></a>
+<span class="sourceLineNo">1713</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs, source);<a name="line.1713"></a>
+<span class="sourceLineNo">1714</span>    return syncs;<a name="line.1714"></a>
+<span class="sourceLineNo">1715</span>  }<a name="line.1715"></a>
+<span class="sourceLineNo">1716</span><a name="line.1716"></a>
+<span class="sourceLineNo">1717</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.1717"></a>
+<span class="sourceLineNo">1718</span>  // checkAndMutate tests<a name="line.1718"></a>
+<span class="sourceLineNo">1719</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.1719"></a>
+<span class="sourceLineNo">1720</span>  @Test<a name="line.1720"></a>
+<span class="sourceLineNo">1721</span>  public void testCheckAndMutate_WithEmptyRowValue() throws IOException {<a name="line.1721"></a>
+<span class="sourceLineNo">1722</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1722"></a>
+<span class="sourceLineNo">1723</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1723"></a>
+<span class="sourceLineNo">1724</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1724"></a>
+<span class="sourceLineNo">1725</span>    byte[] emptyVal = new byte[] {};<a name="line.1725"></a>
+<span class="sourceLineNo">1726</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1726"></a>
+<span class="sourceLineNo">1727</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.1727"></a>
+<span class="sourceLineNo">1728</span><a name="line.1728"></a>
+<span class="sourceLineNo">1729</span>    // Setting up region<a name="line.1729"></a>
+<span class="sourceLineNo">1730</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.1730"></a>
+<span class="sourceLineNo">1731</span>    // Putting empty data in key<a name="line.1731"></a>
+<span class="sourceLineNo">1732</span>    Put put = new Put(row1);<a name="line.1732"></a>
+<span class="sourceLineNo">1733</span>    put.addColumn(fam1, qf1, emptyVal);<a name="line.1733"></a>
+<span class="sourceLineNo">1734</span><a name="line.1734"></a>
+<span class="sourceLineNo">1735</span>    // checkAndPut with empty value<a name="line.1735"></a>
+<span class="sourceLineNo">1736</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1736"></a>
+<span class="sourceLineNo">1737</span>        new BinaryComparator(emptyVal), put);<a name="line.1737"></a>
+<span class="sourceLineNo">1738</span>    assertTrue(res);<a name="line.1738"></a>
+<span class="sourceLineNo">1739</span><a name="line.1739"></a>
+<span class="sourceLineNo">1740</span>    // Putting data in key<a name="line.1740"></a>
+<span class="sourceLineNo">1741</span>    put = new Put(row1);<a name="line.1741"></a>
+<span class="sourceLineNo">1742</span>    put.addColumn(fam1, qf1, val1);<a name="line.1742"></a>
+<span class="sourceLineNo">1743</span><a name="line.1743"></a>
+<span class="sourceLineNo">1744</span>    // checkAndPut with correct value<a name="line.1744"></a>
+<span class="sourceLineNo">1745</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1745"></a>
+<span class="sourceLineNo">1746</span>        new BinaryComparator(emptyVal), put);<a name="line.1746"></a>
+<span class="sourceLineNo">1747</span>    assertTrue(res);<a name="line.1747"></a>
+<span class="sourceLineNo">1748</span><a name="line.1748"></a>
+<span class="sourceLineNo">1749</span>    // not empty anymore<a name="line.1749"></a>
+<span class="sourceLineNo">1750</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1750"></a>
+<span class="sourceLineNo">1751</span>        new BinaryComparator(emptyVal), put);<a name="line.1751"></a>
+<span class="sourceLineNo">1752</span>    assertFalse(res);<a name="line.1752"></a>
+<span class="sourceLineNo">1753</span><a name="line.1753"></a>
+<span class="sourceLineNo">1754</span>    Delete delete = new Delete(row1);<a name="line.1754"></a>
+<span class="sourceLineNo">1755</span>    delete.addColumn(fam1, qf1);<a name="line.1755"></a>
+<span class="sourceLineNo">1756</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1756"></a>
+<span class="sourceLineNo">1757</span>        new BinaryComparator(emptyVal), delete);<a name="line.1757"></a>
+<span class="sourceLineNo">1758</span>    assertFalse(res);<a name="line.1758"></a>
+<span class="sourceLineNo">1759</span><a name="line.1759"></a>
+<span class="sourceLineNo">1760</span>    put = new Put(row1);<a name="line.1760"></a>
+<span class="sourceLineNo">1761</span>    put.addColumn(fam1, qf1, val2);<a name="line.1761"></a>
+<span class="sourceLineNo">1762</span>    // checkAndPut with correct value<a name="line.1762"></a>
+<span class="sourceLineNo">1763</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1763"></a>
+<span class="sourceLineNo">1764</span>        new BinaryComparator(val1), put);<a name="line.1764"></a>
+<span class="sourceLineNo">1765</span>    assertTrue(res);<a name="line.1765"></a>
+<span class="sourceLineNo">1766</span><a name="line.1766"></a>
+<span class="sourceLineNo">1767</span>    // checkAndDelete with correct value<a name="line.1767"></a>
+<span class="sourceLineNo">1768</span>    delete = new Delete(row1);<a name="line.1768"></a>
 <span class="sourceLineNo">1769</span>    delete.addColumn(fam1, qf1);<a name="line.1769"></a>
-<span class="sourceLineNo">1770</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1770"></a>
-<span class="sourceLineNo">1771</span>        new BinaryComparator(val2), delete);<a name="line.1771"></a>
-<span class="sourceLineNo">1772</span>    assertTrue(res);<a name="line.1772"></a>
-<span class="sourceLineNo">1773</span><a name="line.1773"></a>
-<span class="sourceLineNo">1774</span>    delete = new Delete(row1);<a name="line.1774"></a>
-<span class="sourceLineNo">1775</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1775"></a>
-<span class="sourceLineNo">1776</span>        new BinaryComparator(emptyVal), delete);<a name="line.1776"></a>
-<span class="sourceLineNo">1777</span>    assertTrue(res);<a name="line.1777"></a>
-<span class="sourceLineNo">1778</span><a name="line.1778"></a>
-<span class="sourceLineNo">1779</span>    // checkAndPut looking for a null value<a name="line.1779"></a>
-<span class="sourceLineNo">1780</span>    put = new Put(row1);<a name="line.1780"></a>
-<span class="sourceLineNo">1781</span>    put.addColumn(fam1, qf1, val1);<a name="line.1781"></a>
-<span class="sourceLineNo">1782</span><a name="line.1782"></a>
-<span class="sourceLineNo">1783</span>    res = region<a name="line.1783"></a>
-<span class="sourceLineNo">1784</span>        .checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new NullComparator(), put);<a name="line.1784"></a>
-<span class="sourceLineNo">1785</span>    assertTrue(res);<a name="line.1785"></a>
-<span class="sourceLineNo">1786</span>  }<a name="line.1786"></a>
-<span class="sourceLineNo">1787</span><a name="line.1787"></a>
-<span class="sourceLineNo">1788</span>  @Test<a name="line.1788"></a>
-<span class="sourceLineNo">1789</span>  public void testCheckAndMutate_WithWrongValue() throws IOException {<a name="line.1789"></a>
-<span class="sourceLineNo">1790</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1790"></a>
-<span class="sourceLineNo">1791</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1791"></a>
-<span class="sourceLineNo">1792</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1792"></a>
-<span class="sourceLineNo">1793</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1793"></a>
-<span class="sourceLineNo">1794</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.1794"></a>
-<span class="sourceLineNo">1795</span>    BigDecimal bd1 = new BigDecimal(Double.MAX_VALUE);<a name="line.1795"></a>
-<span class="sourceLineNo">1796</span>    BigDecimal bd2 = new BigDecimal(Double.MIN_VALUE);<a name="line.1796"></a>
-<span class="sourceLineNo">1797</span><a name="line.1797"></a>
-<span class="sourceLineNo">1798</span>    // Setting up region<a name="line.1798"></a>
-<span class="sourceLineNo">1799</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.1799"></a>
-<span class="sourceLineNo">1800</span>    // Putting data in key<a name="line.1800"></a>
-<span class="sourceLineNo">1801</span>    Put put = new Put(row1);<a name="line.1801"></a>
-<span class="sourceLineNo">1802</span>    put.addColumn(fam1, qf1, val1);<a name="line.1802"></a>
-<span class="sourceLineNo">1803</span>    region.put(put);<a name="line.1803"></a>
-<span class="sourceLineNo">1804</span><a name="line.1804"></a>
-<span class="sourceLineNo">1805</span>    // checkAndPut with wrong value<a name="line.1805"></a>
-<span class="sourceLineNo">1806</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1806"></a>
-<span class="sourceLineNo">1807</span>        new BinaryComparator(val2), put);<a name="line.1807"></a>
-<span class="sourceLineNo">1808</span>    assertEquals(false, res);<a name="line.1808"></a>
-<span class="sourceLineNo">1809</span><a name="line.1809"></a>
-<span class="sourceLineNo">1810</span>    // checkAndDelete with wrong value<a name="line.1810"></a>
-<span class="sourceLineNo">1811</span>    Delete delete = new Delete(row1);<a name="line.1811"></a>
-<span class="sourceLineNo">1812</span>    delete.addFamily(fam1);<a name="line.1812"></a>
-<span class="sourceLineNo">1813</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1813"></a>
-<span class="sourceLineNo">1814</span>        new BinaryComparator(val2), put);<a name="line.1814"></a>
-<span class="sourceLineNo">1815</span>    assertEquals(false, res);<a name="line.1815"></a>
-<span class="sourceLineNo">1816</span><a name="line.1816"></a>
-<span class="sourceLineNo">1817</span>    // Putting data in key<a name="line.1817"></a>
-<span class="sourceLineNo">1818</span>    put = new Put(row1);<a name="line.1818"></a>
-<span class="sourceLineNo">1819</span>    put.addColumn(fam1, qf1, Bytes.toBytes(bd1));<a name="line.1819"></a>
-<span class="sourceLineNo">1820</span>    region.put(put);<a name="line.1820"></a>
-<span class="sourceLineNo">1821</span><a name="line.1821"></a>
-<span class="sourceLineNo">1822</span>    // checkAndPut with wrong value<a name="line.1822"></a>
-<span class="sourceLineNo">1823</span>    res =<a name="line.1823"></a>
-<span class="sourceLineNo">1824</span>        region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1824"></a>
-<span class="sourceLineNo">1825</span>            new BigDecimalComparator(bd2), put);<a name="line.1825"></a>
-<span class="sourceLineNo">1826</span>    assertEquals(false, res);<a name="line.1826"></a>
-<span class="sourceLineNo">1827</span><a name="line.1827"></a>
-<span class="sourceLineNo">1828</span>    // checkAndDelete with wrong value<a name="line.1828"></a>
-<span class="sourceLineNo">1829</span>    delete = new Delete(row1);<a name="line.1829"></a>
-<span class="sourceLineNo">1830</span>    delete.addFamily(fam1);<a name="line.1830"></a>
-<span class="sourceLineNo">1831</span>    res =<a name="line.1831"></a>
-<span class="sourceLineNo">1832</span>        region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1832"></a>
-<span class="sourceLineNo">1833</span>            new BigDecimalComparator(bd2), put);<a name="line.1833"></a>
-<span class="sourceLineNo">1834</span>    assertEquals(false, res);<a name="line.1834"></a>
-<span class="sourceLineNo">1835</span>  }<a name="line.1835"></a>
-<span class="sourceLineNo">1836</span><a name="line.1836"></a>
-<span class="sourceLineNo">1837</span>  @Test<a name="line.1837"></a>
-<span class="sourceLineNo">1838</span>  public void testCheckAndMutate_WithCorrectValue() throws IOException {<a name="line.1838"></a>
-<span class="sourceLineNo">1839</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1839"></a>
-<span class="sourceLineNo">1840</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1840"></a>
-<span class="sourceLineNo">1841</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1841"></a>
-<span class="sourceLineNo">1842</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1842"></a>
-<span class="sourceLineNo">1843</span>    BigDecimal bd1 = new BigDecimal(Double.MIN_VALUE);<a name="line.1843"></a>
-<span class="sourceLineNo">1844</span><a name="line.1844"></a>
-<span class="sourceLineNo">1845</span>    // Setting up region<a name="line.1845"></a>
-<span class="sourceLineNo">1846</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.1846"></a>
-<span class="sourceLineNo">1847</span>    // Putting data in key<a name="line.1847"></a>
-<span class="sourceLineNo">1848</span>    Put put = new Put(row1);<a name="line.1848"></a>
-<span class="sourceLineNo">1849</span>    put.addColumn(fam1, qf1, val1);<a name="line.1849"></a>
-<span class="sourceLineNo">1850</span>    region.put(put);<a name="line.1850"></a>
-<span class="sourceLineNo">1851</span><a name="line.1851"></a>
-<span class="sourceLineNo">1852</span>    // checkAndPut with correct value<a name="line.1852"></a>
-<span class="sourceLineNo">1853</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1853"></a>
-<span class="sourceLineNo">1854</span>        new BinaryComparator(val1), put);<a name="line.1854"></a>
-<span class="sourceLineNo">1855</span>    assertEquals(true, res);<a name="line.1855"></a>
-<span class="sourceLineNo">1856</span><a name="line.1856"></a>
-<span class="sourceLineNo">1857</span>    // checkAndDelete with correct value<a name="line.1857"></a>
-<span class="sourceLineNo">1858</span>    Delete delete = new Delete(row1);<a name="line.1858"></a>
-<span class="sourceLineNo">1859</span>    delete.addColumn(fam1, qf1);<a name="line.1859"></a>
-<span class="sourceLineNo">1860</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new BinaryComparator(val1),<a name="line.1860"></a>
-<span class="sourceLineNo">1861</span>        delete);<a name="line.1861"></a>
-<span class="sourceLineNo">1862</span>    assertEquals(true, res);<a name="line.1862"></a>
-<span class="sourceLineNo">1863</span><a name="line.1863"></a>
-<span class="sourceLineNo">1864</span>    // Putting data in key<a name="line.1864"></a>
-<span class="sourceLineNo">1865</span>    put = new Put(row1);<a name="line.1865"></a>
-<span class="sourceLineNo">1866</span>    put.addColumn(fam1, qf1, Bytes.toBytes(bd1));<a name="line.1866"></a>
-<span class="sourceLineNo">1867</span>    region.put(put);<a name="line.1867"></a>
-<span class="sourceLineNo">1868</span><a name="line.1868"></a>
-<span class="sourceLineNo">1869</span>    // checkAndPut with correct value<a name="line.1869"></a>
-<span class="sourceLineNo">1870</span>    res =<a name="line.1870"></a>
-<span class="sourceLineNo">1871</span>        region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new BigDecimalComparator(<a name="line.1871"></a>
-<span class="sourceLineNo">1872</span>            bd1), put);<a name="line.1872"></a>
-<span class="sourceLineNo">1873</span>    assertEquals(true, res);<a name="line.1873"></a>
-<span class="sourceLineNo">1874</span><a name="line.1874"></a>
-<span class="sourceLineNo">1875</span>    // checkAndDelete with correct value<a name="line.1875"></a>
-<span class="sourceLineNo">1876</span>    delete = new Delete(row1);<a name="line.1876"></a>
-<span class="sourceLineNo">1877</span>    delete.addColumn(fam1, qf1);<a name="line.1877"></a>
-<span class="sourceLineNo">1878</span>    res =<a name="line.1878"></a>
-<span class="sourceLineNo">1879</span>        region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new BigDecimalComparator(<a name="line.1879"></a>
-<span class="sourceLineNo">1880</span>            bd1), delete);<a name="line.1880"></a>
-<span class="sourceLineNo">1881</span>    assertEquals(true, res);<a name="line.1881"></a>
-<span class="sourceLineNo">1882</span>  }<a name="line.1882"></a>
-<span class="sourceLineNo">1883</span><a name="line.1883"></a>
-<span class="sourceLineNo">1884</span>  @Test<a name="line.1884"></a>
-<span class="sourceLineNo">1885</span>  public void testCheckAndMutate_WithNonEqualCompareOp() throws IOException {<a name="line.1885"></a>
-<span class="sourceLineNo">1886</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1886"></a>
-<span class="sourceLineNo">1887</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1887"></a>
-<span class="sourceLineNo">1888</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1888"></a>
-<span class="sourceLineNo">1889</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1889"></a>
-<span class="sourceLineNo">1890</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.1890"></a>
-<span class="sourceLineNo">1891</span>    byte[] val3 = Bytes.toBytes("value3");<a name="line.1891"></a>
-<span class="sourceLineNo">1892</span>    byte[] val4 = Bytes.toBytes("value4");<a name="line.1892"></a>
-<span class="sourceLineNo">1893</span><a name="line.1893"></a>
-<span class="sourceLineNo">1894</span>    // Setting up region<a name="line.1894"></a>
-<span class="sourceLineNo">1895</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.1895"></a>
-<span class="sourceLineNo">1896</span>    // Putting val3 in key<a name="line.1896"></a>
-<span class="sourceLineNo">1897</span>    Put put = new Put(row1);<a name="line.1897"></a>
-<span class="sourceLineNo">1898</span>    put.addColumn(fam1, qf1, val3);<a name="line.1898"></a>
-<span class="sourceLineNo">1899</span>    region.put(put);<a name="line.1899"></a>
-<span class="sourceLineNo">1900</span><a name="line.1900"></a>
-<span class="sourceLineNo">1901</span>    // Test CompareOp.LESS: original = val3, compare with val3, fail<a name="line.1901"></a>
-<span class="sourceLineNo">1902</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS,<a name="line.1902"></a>
-<span class="sourceLineNo">1903</span>        new BinaryComparator(val3), put);<a name="line.1903"></a>
-<span class="sourceLineNo">1904</span>    assertEquals(false, res);<a name="line.1904"></a>
-<span class="sourceLineNo">1905</span><a name="line.1905"></a>
-<span class="sourceLineNo">1906</span>    // Test CompareOp.LESS: original = val3, compare with val4, fail<a name="line.1906"></a>
-<span class="sourceLineNo">1907</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS,<a name="line.1907"></a>
-<span class="sourceLineNo">1908</span>        new BinaryComparator(val4), put);<a name="line.1908"></a>
-<span class="sourceLineNo">1909</span>    assertEquals(false, res);<a name="line.1909"></a>
-<span class="sourceLineNo">1910</span><a name="line.1910"></a>
-<span class="sourceLineNo">1911</span>    // Test CompareOp.LESS: original = val3, compare with val2,<a name="line.1911"></a>
-<span class="sourceLineNo">1912</span>    // succeed (now value = val2)<a name="line.1912"></a>
-<span class="sourceLineNo">1913</span>    put = new Put(row1);<a name="line.1913"></a>
-<span class="sourceLineNo">1914</span>    put.addColumn(fam1, qf1, val2);<a name="line.1914"></a>
-<span class="sourceLineNo">1915</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS,<a name="line.1915"></a>
-<span class="sourceLineNo">1916</span>        new BinaryComparator(val2), put);<a name="line.1916"></a>
-<span class="sourceLineNo">1917</span>    assertEquals(true, res);<a name="line.1917"></a>
-<span class="sourceLineNo">1918</span><a name="line.1918"></a>
-<span class="sourceLineNo">1919</span>    // Test CompareOp.LESS_OR_EQUAL: original = val2, compare with val3, fail<a name="line.1919"></a>
-<span class="sourceLineNo">1920</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS_OR_EQUAL,<a name="line.1920"></a>
-<span class="sourceLineNo">1921</span>        new BinaryComparator(val3), put);<a name="line.1921"></a>
-<span class="sourceLineNo">1922</span>    assertEquals(false, res);<a name="line.1922"></a>
-<span class="sourceLineNo">1923</span><a name="line.1923"></a>
-<span class="sourceLineNo">1924</span>    // Test CompareOp.LESS_OR_EQUAL: original = val2, compare with val2,<a name="line.1924"></a>
-<span class="sourceLineNo">1925</span>    // succeed (value still = val2)<a name="line.1925"></a>
-<span class="sourceLineNo">1926</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS_OR_EQUAL,<a name="line.1926"></a>
-<span class="sourceLineNo">1927</span>        new BinaryComparator(val2), put);<a name="line.1927"></a>
-<span class="sourceLineNo">1928</span>    assertEquals(true, res);<a name="line.1928"></a>
-<span class="sourceLineNo">1929</span><a name="line.1929"></a>
-<span class="sourceLineNo">1930</span>    // Test CompareOp.LESS_OR_EQUAL: original = val2, compare with val1,<a name="line.1930"></a>
-<span class="sourceLineNo">1931</span>    // succeed (now value = val3)<a name="line.1931"></a>
-<span class="sourceLineNo">1932</span>    put = new Put(row1);<a name="line.1932"></a>
-<span class="sourceLineNo">1933</span>    put.addColumn(fam1, qf1, val3);<a name="line.1933"></a>
-<span class="sourceLineNo">1934</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS_OR_EQUAL,<a name="line.1934"></a>
-<span class="sourceLineNo">1935</span>        new BinaryComparator(val1), put);<a name="line.1935"></a>
-<span class="sourceLineNo">1936</span>    assertEquals(true, res);<a name="line.1936"></a>
-<span class="sourceLineNo">1937</span><a name="line.1937"></a>
-<span class="sourceLineNo">1938</span>    // Test CompareOp.GREATER: original = val3, compare with val3, fail<a name="line.1938"></a>
-<span class="sourceLineNo">1939</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER,<a name="line.1939"></a>
-<span class="sourceLineNo">1940</span>        new BinaryComparator(val3), put);<a name="line.1940"></a>
-<span class="sourceLineNo">1941</span>    assertEquals(false, res);<a name="line.1941"></a>
-<span class="sourceLineNo">1942</span><a name="line.1942"></a>
-<span class="sourceLineNo">1943</span>    // Test CompareOp.GREATER: original = val3, compare with val2, fail<a name="line.1943"></a>
-<span class="sourceLineNo">1944</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER,<a name="line.1944"></a>
-<span class="sourceLineNo">1945</span>        new BinaryComparator(val2), put);<a name="line.1945"></a>
-<span class="sourceLineNo">1946</span>    assertEquals(false, res);<a name="line.1946"></a>
-<span class="sourceLineNo">1947</span><a name="line.1947"></a>
-<span class="sourceLineNo">1948</span>    // Test CompareOp.GREATER: original = val3, compare with val4,<a name="line.1948"></a>
-<span class="sourceLineNo">1949</span>    // succeed (now value = val2)<a name="line.1949"></a>
-<span class="sourceLineNo">1950</span>    put = new Put(row1);<a name="line.1950"></a>
-<span class="sourceLineNo">1951</span>    put.addColumn(fam1, qf1, val2);<a name="line.1951"></a>
-<span class="sourceLineNo">1952</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER,<a name="line.1952"></a>
-<span class="sourceLineNo">1953</span>        new BinaryComparator(val4), put);<a name="line.1953"></a>
-<span class="sourceLineNo">1954</span>    assertEquals(true, res);<a name="line.1954"></a>
-<span class="sourceLineNo">1955</span><a name="line.1955"></a>
-<span class="sourceLineNo">1956</span>    // Test CompareOp.GREATER_OR_EQUAL: original = val2, compare with val1, fail<a name="line.1956"></a>
-<span class="sourceLineNo">1957</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER_OR_EQUAL,<a name="line.1957"></a>
-<span class="sourceLineNo">1958</span>        new BinaryComparator(val1), put);<a name="line.1958"></a>
-<span class="sourceLineNo">1959</span>    assertEquals(false, res);<a name="line.1959"></a>
-<span class="sourceLineNo">1960</span><a name="line.1960"></a>
-<span class="sourceLineNo">1961</span>    // Test CompareOp.GREATER_OR_EQUAL: original = val2, compare with val2,<a name="line.1961"></a>
-<span class="sourceLineNo">1962</span>    // succeed (value still = val2)<a name="line.1962"></a>
-<span class="sourceLineNo">1963</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER_OR_EQUAL,<a name="line.1963"></a>
-<span class="sourceLineNo">1964</span>        new BinaryComparator(val2), put);<a name="line.1964"></a>
-<span class="sourceLineNo">1965</span>    assertEquals(true, res);<a name="line.1965"></a>
-<span class="sourceLineNo">1966</span><a name="line.1966"></a>
-<span class="sourceLineNo">1967</span>    // Test CompareOp.GREATER_OR_EQUAL: original = val2, compare with val3, succeed<a name="line.1967"></a>
-<span class="sourceLineNo">1968</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER_OR_EQUAL,<a name="line.1968"></a>
-<span class="sourceLineNo">1969</span>        new BinaryComparator(val3), put);<a name="line.1969"></a>
-<span class="sourceLineNo">1970</span>    assertEquals(true, res);<a name="line.1970"></a>
-<span class="sourceLineNo">1971</span>  }<a name="line.1971"></a>
-<span class="sourceLineNo">1972</span><a name="line.1972"></a>
-<span class="sourceLineNo">1973</span>  @Test<a name="line.1973"></a>
-<span class="sourceLineNo">1974</span>  public void testCheckAndPut_ThatPutWasWritten() throws IOException {<a name="line.1974"></a>
-<span class="sourceLineNo">1975</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1975"></a>
-<span class="sourceLineNo">1976</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1976"></a>
-<span class="sourceLineNo">1977</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.1977"></a>
-<span class="sourceLineNo">1978</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1978"></a>
-<span class="sourceLineNo">1979</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1979"></a>
-<span class="sourceLineNo">1980</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.1980"></a>
-<span class="sourceLineNo">1981</span><a name="line.1981"></a>
-<span class="sourceLineNo">1982</span>    byte[][] families = { fam1, fam2 };<a name="line.1982"></a>
-<span class="sourceLineNo">1983</span><a name="line.1983"></a>
-<span class="sourceLineNo">1984</span>    // Setting up region<a name="line.1984"></a>
-<span class="sourceLineNo">1985</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.1985"></a>
-<span class="sourceLineNo">1986</span>    // Putting data in the key to check<a name="line.1986"></a>
-<span class="sourceLineNo">1987</span>    Put put = new Put(row1);<a name="line.1987"></a>
-<span class="sourceLineNo">1988</span>    put.addColumn(fam1, qf1, val1);<a name="line.1988"></a>
-<span class="sourceLineNo">1989</span>    region.put(put);<a name="line.1989"></a>
-<span class="sourceLineNo">1990</span><a name="line.1990"></a>
-<span class="sourceLineNo">1991</span>    // Creating put to add<a name="line.1991"></a>
-<span class="sourceLineNo">1992</span>    long ts = System.currentTimeMillis();<a name="line.1992"></a>
-<span class="sourceLineNo">1993</span>    KeyValue kv = new KeyValue(row1, fam2, qf1, ts, KeyValue.Type.Put, val2);<a name="line.1993"></a>
-<span class="sourceLineNo">1994</span>    put = new Put(row1);<a name="line.1994"></a>
-<span class="sourceLineNo">1995</span>    put.add(kv);<a name="line.1995"></a>
-<span class="sourceLineNo">1996</span><a name="line.1996"></a>
-<span class="sourceLineNo">1997</span>    // checkAndPut with wrong value<a name="line.1997"></a>
-<span class="sourceLineNo">1998</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1998"></a>
-<span class="sourceLineNo">1999</span>        new BinaryComparator(val1), put);<a name="line.1999"></a>
-<span class="sourceLineNo">2000</span>    assertEquals(true, res);<a name="line.2000"></a>
-<span class="sourceLineNo">2001</span><a name="line.2001"></a>
-<span class="sourceLineNo">2002</span>    Get get = new Get(row1);<a name="line.2002"></a>
-<span class="sourceLineNo">2003</span>    get.addColumn(fam2, qf1);<a name="line.2003"></a>
-<span class="sourceLineNo">2004</span>    Cell[] actual = region.get(get).rawCells();<a name="line.2004"></a>
-<span class="sourceLineNo">2005</span><a name="line.2005"></a>
-<span class="sourceLineNo">2006</span>    Cell[] expected = { kv };<a name="line.2006"></a>
-<span class="sourceLineNo">2007</span><a name="line.2007"></a>
-<span class="sourceLineNo">2008</span>    assertEquals(expected.length, actual.length);<a name="line.2008"></a>
-<span class="sourceLineNo">2009</span>    for (int i = 0; i &lt; actual.length; i++) {<a name="line.2009"></a>
-<span class="sourceLineNo">2010</span>      assertEquals(expected[i], actual[i]);<a name="line.2010"></a>
-<span class="sourceLineNo">2011</span>    }<a name="line.2011"></a>
-<span class="sourceLineNo">2012</span>  }<a name="line.2012"></a>
-<span class="sourceLineNo">2013</span><a name="line.2013"></a>
-<span class="sourceLineNo">2014</span>  @Test<a name="line.2014"></a>
-<span class="sourceLineNo">2015</span>  public void testCheckAndPut_wrongRowInPut() throws IOException {<a name="line.2015"></a>
-<span class="sourceLineNo">2016</span>    this.region = initHRegion(tableName, method, CONF, COLUMNS);<a name="line.2016"></a>
-<span class="sourceLineNo">2017</span>    Put put = new Put(row2);<a name="line.2017"></a>
-<span class="sourceLineNo">2018</span>    put.addColumn(fam1, qual1, value1);<a name="line.2018"></a>
-<span class="sourceLineNo">2019</span>    try {<a name="line.2019"></a>
-<span class="sourceLineNo">2020</span>      region.checkAndMutate(row, fam1, qual1, CompareOperator.EQUAL,<a name="line.2020"></a>
-<span class="sourceLineNo">2021</span>          new BinaryComparator(value2), put);<a name="line.2021"></a>
-<span class="sourceLineNo">2022</span>      fail();<a name="line.2022"></a>
-<span class="sourceLineNo">2023</span>    } catch (org.apache.hadoop.hbase.DoNotRetryIOException expected) {<a name="line.2023"></a>
-<span class="sourceLineNo">2024</span>      // expected exception.<a name="line.2024"></a>
-<span class="sourceLineNo">2025</span>    }<a name="line.2025"></a>
-<span class="sourceLineNo">2026</span>  }<a name="line.2026"></a>
-<span class="sourceLineNo">2027</span><a name="line.2027"></a>
-<span class="sourceLineNo">2028</span>  @Test<a name="line.2028"></a>
-<span class="sourceLineNo">2029</span>  public void testCheckAndDelete_ThatDeleteWasWritten() throws IOException {<a name="line.2029"></a>
-<span class="sourceLineNo">2030</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2030"></a>
-<span class="sourceLineNo">2031</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2031"></a>
-<span class="sourceLineNo">2032</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2032"></a>
-<span class="sourceLineNo">2033</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.2033"></a>
-<span class="sourceLineNo">2034</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.2034"></a>
-<span class="sourceLineNo">2035</span>    byte[] qf3 = Bytes.toBytes("qualifier3");<a name="line.2035"></a>
-<span class="sourceLineNo">2036</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.2036"></a>
-<span class="sourceLineNo">2037</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.2037"></a>
-<span class="sourceLineNo">2038</span>    byte[] val3 = Bytes.toBytes("value3");<a name="line.2038"></a>
-<span class="sourceLineNo">2039</span>    byte[] emptyVal = new byte[] {};<a name="line.2039"></a>
-<span class="sourceLineNo">2040</span><a name="line.2040"></a>
-<span class="sourceLineNo">2041</span>    byte[][] families = { fam1, fam2 };<a name="line.2041"></a>
-<span class="sourceLineNo">2042</span><a name="line.2042"></a>
-<span class="sourceLineNo">2043</span>    // Setting up region<a name="line.2043"></a>
-<span class="sourceLineNo">2044</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2044"></a>
-<span class="sourceLineNo">2045</span>    // Put content<a name="line.2045"></a>
-<span class="sourceLineNo">2046</span>    Put put = new Put(row1);<a name="line.2046"></a>
-<span class="sourceLineNo">2047</span>    put.addColumn(fam1, qf1, val1);<a name="line.2047"></a>
-<span class="sourceLineNo">2048</span>    region.put(put);<a name="line.2048"></a>
-<span class="sourceLineNo">2049</span>    Threads.sleep(2);<a name="line.2049"></a>
-<span class="sourceLineNo">2050</span><a name="line.2050"></a>
-<span class="sourceLineNo">2051</span>    put = new Put(row1);<a name="line.2051"></a>
-<span class="sourceLineNo">2052</span>    put.addColumn(fam1, qf1, val2);<a name="line.2052"></a>
-<span class="sourceLineNo">2053</span>    put.addColumn(fam2, qf1, val3);<a name="line.2053"></a>
-<span class="sourceLineNo">2054</span>    put.addColumn(fam2, qf2, val2);<a name="line.2054"></a>
-<span class="sourceLineNo">2055</span>    put.addColumn(fam2, qf3, val1);<a name="line.2055"></a>
-<span class="sourceLineNo">2056</span>    put.addColumn(fam1, qf3, val1);<a name="line.2056"></a>
-<span class="sourceLineNo">2057</span>    region.put(put);<a name="line.2057"></a>
-<span class="sourceLineNo">2058</span><a name="line.2058"></a>
-<span class="sourceLineNo">2059</span>    // Multi-column delete<a name="line.2059"></a>
-<span class="sourceLineNo">2060</span>    Delete delete = new Delete(row1);<a name="line.2060"></a>
-<span class="sourceLineNo">2061</span>    delete.addColumn(fam1, qf1);<a name="line.2061"></a>
-<span class="sourceLineNo">2062</span>    delete.addColumn(fam2, qf1);<a name="line.2062"></a>
-<span class="sourceLineNo">2063</span>    delete.addColumn(fam1, qf3);<a name="line.2063"></a>
-<span class="sourceLineNo">2064</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.2064"></a>
-<span class="sourceLineNo">2065</span>        new BinaryComparator(val2), delete);<a name="line.2065"></a>
-<span class="sourceLineNo">2066</span>    assertEquals(true, res);<a name="line.2066"></a>
-<span class="sourceLineNo">2067</span><a name="line.2067"></a>
-<span class="sourceLineNo">2068</span>    Get get = new Get(row1);<a name="line.2068"></a>
-<span class="sourceLineNo">2069</span>    get.addColumn(fam1, qf1);<a name="line.2069"></a>
-<span class="sourceLineNo">2070</span>    get.addColumn(fam1, qf3);<a name="line.2070"></a>
-<span class="sourceLineNo">2071</span>    get.addColumn(fam2, qf2);<a name="line.2071"></a>
-<span class="sourceLineNo">2072</span>    Result r = region.get(get);<a name="line.2072"></a>
-<span class="sourceLineNo">2073</span>    assertEquals(2, r.size());<a name="line.2073"></a>
-<span class="sourceLineNo">2074</span>    assertArrayEquals(val1, r.getValue(fam1, qf1));<a name="line.2074"></a>
-<span class="sourceLineNo">2075</span>    assertArrayEquals(val2, r.getValue(fam2, qf2));<a name="line.2075"></a>
-<span class="sourceLineNo">2076</span><a name="line.2076"></a>
-<span class="sourceLineNo">2077</span>    // Family delete<a name="line.2077"></a>
-<span class="sourceLineNo">2078</span>    delete = new Delete(row1);<a name="line.2078"></a>
-<span class="sourceLineNo">2079</span>    delete.addFamily(fam2);<a name="line.2079"></a>
-<span class="sourceLineNo">2080</span>    res = region.checkAndMutate(row1, fam2, qf1, CompareOperator.EQUAL,<a name="line.2080"></a>
-<span class="sourceLineNo">2081</span>        new BinaryComparator(emptyVal), delete);<a name="line.2081"></a>
-<span class="sourceLineNo">2082</span>    assertEquals(true, res);<a name="line.2082"></a>
-<span class="sourceLineNo">2083</span><a name="line.2083"></a>
-<span class="sourceLineNo">2084</span>    get = new Get(row1);<a name="line.2084"></a>
-<span class="sourceLineNo">2085</span>    r = region.get(get);<a name="line.2085"></a>
-<span class="sourceLineNo">2086</span>    assertEquals(1, r.size());<a name="line.2086"></a>
-<span class="sourceLineNo">2087</span>    assertArrayEquals(val1, r.getValue(fam1, qf1));<a name="line.2087"></a>
-<span class="sourceLineNo">2088</span><a name="line.2088"></a>
-<span class="sourceLineNo">2089</span>    // Row delete<a name="line.2089"></a>
-<span class="sourceLineNo">2090</span>    delete = new Delete(row1);<a name="line.2090"></a>
-<span class="sourceLineNo">2091</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new BinaryComparator(val1),<a name="line.2091"></a>
-<span class="sourceLineNo">2092</span>        delete);<a name="line.2092"></a>
-<span class="sourceLineNo">2093</span>    assertEquals(true, res);<a name="line.2093"></a>
-<span class="sourceLineNo">2094</span>    get = new Get(row1);<a name="line.2094"></a>
-<span class="sourceLineNo">2095</span>    r = region.get(get);<a name="line.2095"></a>
-<span class="sourceLineNo">2096</span>    assertEquals(0, r.size());<a name="line.2096"></a>
-<span class="sourceLineNo">2097</span>  }<a name="line.2097"></a>
-<span class="sourceLineNo">2098</span><a name="line.2098"></a>
-<span class="sourceLineNo">2099</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2099"></a>
-<span class="sourceLineNo">2100</span>  // Delete tests<a name="line.2100"></a>
-<span class="sourceLineNo">2101</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2101"></a>
-<span class="sourceLineNo">2102</span>  @Test<a name="line.2102"></a>
-<span class="sourceLineNo">2103</span>  public void testDelete_multiDeleteColumn() throws IOException {<a name="line.2103"></a>
-<span class="sourceLineNo">2104</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2104"></a>
-<span class="sourceLineNo">2105</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2105"></a>
-<span class="sourceLineNo">2106</span>    byte[] qual = Bytes.toBytes("qualifier");<a name="line.2106"></a>
-<span class="sourceLineNo">2107</span>    byte[] value = Bytes.toBytes("value");<a name="line.2107"></a>
-<span class="sourceLineNo">2108</span><a name="line.2108"></a>
-<span class="sourceLineNo">2109</span>    Put put = new Put(row1);<a name="line.2109"></a>
-<span class="sourceLineNo">2110</span>    put.addColumn(fam1, qual, 1, value);<a name="line.2110"></a>
-<span class="sourceLineNo">2111</span>    put.addColumn(fam1, qual, 2, value);<a name="line.2111"></a>
-<span class="sourceLineNo">2112</span><a name="line.2112"></a>
-<span class="sourceLineNo">2113</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2113"></a>
-<span class="sourceLineNo">2114</span>    region.put(put);<a name="line.2114"></a>
-<span class="sourceLineNo">2115</span><a name="line.2115"></a>
-<span class="sourceLineNo">2116</span>    // We do support deleting more than 1 'latest' version<a name="line.2116"></a>
-<span class="sourceLineNo">2117</span>    Delete delete = new Delete(row1);<a name="line.2117"></a>
-<span class="sourceLineNo">2118</span>    delete.addColumn(fam1, qual);<a name="line.2118"></a>
+<span class="sourceLineNo">1770</span>    delete.addColumn(fam1, qf1);<a name="line.1770"></a>
+<span class="sourceLineNo">1771</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1771"></a>
+<span class="sourceLineNo">1772</span>        new BinaryComparator(val2), delete);<a name="line.1772"></a>
+<span class="sourceLineNo">1773</span>    assertTrue(res);<a name="line.1773"></a>
+<span class="sourceLineNo">1774</span><a name="line.1774"></a>
+<span class="sourceLineNo">1775</span>    delete = new Delete(row1);<a name="line.1775"></a>
+<span class="sourceLineNo">1776</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1776"></a>
+<span class="sourceLineNo">1777</span>        new BinaryComparator(emptyVal), delete);<a name="line.1777"></a>
+<span class="sourceLineNo">1778</span>    assertTrue(res);<a name="line.1778"></a>
+<span class="sourceLineNo">1779</span><a name="line.1779"></a>
+<span class="sourceLineNo">1780</span>    // checkAndPut looking for a null value<a name="line.1780"></a>
+<span class="sourceLineNo">1781</span>    put = new Put(row1);<a name="line.1781"></a>
+<span class="sourceLineNo">1782</span>    put.addColumn(fam1, qf1, val1);<a name="line.1782"></a>
+<span class="sourceLineNo">1783</span><a name="line.1783"></a>
+<span class="sourceLineNo">1784</span>    res = region<a name="line.1784"></a>
+<span class="sourceLineNo">1785</span>        .checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new NullComparator(), put);<a name="line.1785"></a>
+<span class="sourceLineNo">1786</span>    assertTrue(res);<a name="line.1786"></a>
+<span class="sourceLineNo">1787</span>  }<a name="line.1787"></a>
+<span class="sourceLineNo">1788</span><a name="line.1788"></a>
+<span class="sourceLineNo">1789</span>  @Test<a name="line.1789"></a>
+<span class="sourceLineNo">1790</span>  public void testCheckAndMutate_WithWrongValue() throws IOException {<a name="line.1790"></a>
+<span class="sourceLineNo">1791</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1791"></a>
+<span class="sourceLineNo">1792</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1792"></a>
+<span class="sourceLineNo">1793</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1793"></a>
+<span class="sourceLineNo">1794</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1794"></a>
+<span class="sourceLineNo">1795</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.1795"></a>
+<span class="sourceLineNo">1796</span>    BigDecimal bd1 = new BigDecimal(Double.MAX_VALUE);<a name="line.1796"></a>
+<span class="sourceLineNo">1797</span>    BigDecimal bd2 = new BigDecimal(Double.MIN_VALUE);<a name="line.1797"></a>
+<span class="sourceLineNo">1798</span><a name="line.1798"></a>
+<span class="sourceLineNo">1799</span>    // Setting up region<a name="line.1799"></a>
+<span class="sourceLineNo">1800</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.1800"></a>
+<span class="sourceLineNo">1801</span>    // Putting data in key<a name="line.1801"></a>
+<span class="sourceLineNo">1802</span>    Put put = new Put(row1);<a name="line.1802"></a>
+<span class="sourceLineNo">1803</span>    put.addColumn(fam1, qf1, val1);<a name="line.1803"></a>
+<span class="sourceLineNo">1804</span>    region.put(put);<a name="line.1804"></a>
+<span class="sourceLineNo">1805</span><a name="line.1805"></a>
+<span class="sourceLineNo">1806</span>    // checkAndPut with wrong value<a name="line.1806"></a>
+<span class="sourceLineNo">1807</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1807"></a>
+<span class="sourceLineNo">1808</span>        new BinaryComparator(val2), put);<a name="line.1808"></a>
+<span class="sourceLineNo">1809</span>    assertEquals(false, res);<a name="line.1809"></a>
+<span class="sourceLineNo">1810</span><a name="line.1810"></a>
+<span class="sourceLineNo">1811</span>    // checkAndDelete with wrong value<a name="line.1811"></a>
+<span class="sourceLineNo">1812</span>    Delete delete = new Delete(row1);<a name="line.1812"></a>
+<span class="sourceLineNo">1813</span>    delete.addFamily(fam1);<a name="line.1813"></a>
+<span class="sourceLineNo">1814</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1814"></a>
+<span class="sourceLineNo">1815</span>        new BinaryComparator(val2), put);<a name="line.1815"></a>
+<span class="sourceLineNo">1816</span>    assertEquals(false, res);<a name="line.1816"></a>
+<span class="sourceLineNo">1817</span><a name="line.1817"></a>
+<span class="sourceLineNo">1818</span>    // Putting data in key<a name="line.1818"></a>
+<span class="sourceLineNo">1819</span>    put = new Put(row1);<a name="line.1819"></a>
+<span class="sourceLineNo">1820</span>    put.addColumn(fam1, qf1, Bytes.toBytes(bd1));<a name="line.1820"></a>
+<span class="sourceLineNo">1821</span>    region.put(put);<a name="line.1821"></a>
+<span class="sourceLineNo">1822</span><a name="line.1822"></a>
+<span class="sourceLineNo">1823</span>    // checkAndPut with wrong value<a name="line.1823"></a>
+<span class="sourceLineNo">1824</span>    res =<a name="line.1824"></a>
+<span class="sourceLineNo">1825</span>        region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1825"></a>
+<span class="sourceLineNo">1826</span>            new BigDecimalComparator(bd2), put);<a name="line.1826"></a>
+<span class="sourceLineNo">1827</span>    assertEquals(false, res);<a name="line.1827"></a>
+<span class="sourceLineNo">1828</span><a name="line.1828"></a>
+<span class="sourceLineNo">1829</span>    // checkAndDelete with wrong value<a name="line.1829"></a>
+<span class="sourceLineNo">1830</span>    delete = new Delete(row1);<a name="line.1830"></a>
+<span class="sourceLineNo">1831</span>    delete.addFamily(fam1);<a name="line.1831"></a>
+<span class="sourceLineNo">1832</span>    res =<a name="line.1832"></a>
+<span class="sourceLineNo">1833</span>        region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1833"></a>
+<span class="sourceLineNo">1834</span>            new BigDecimalComparator(bd2), put);<a name="line.1834"></a>
+<span class="sourceLineNo">1835</span>    assertEquals(false, res);<a name="line.1835"></a>
+<span class="sourceLineNo">1836</span>  }<a name="line.1836"></a>
+<span class="sourceLineNo">1837</span><a name="line.1837"></a>
+<span class="sourceLineNo">1838</span>  @Test<a name="line.1838"></a>
+<span class="sourceLineNo">1839</span>  public void testCheckAndMutate_WithCorrectValue() throws IOException {<a name="line.1839"></a>
+<span class="sourceLineNo">1840</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1840"></a>
+<span class="sourceLineNo">1841</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1841"></a>
+<span class="sourceLineNo">1842</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1842"></a>
+<span class="sourceLineNo">1843</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1843"></a>
+<span class="sourceLineNo">1844</span>    BigDecimal bd1 = new BigDecimal(Double.MIN_VALUE);<a name="line.1844"></a>
+<span class="sourceLineNo">1845</span><a name="line.1845"></a>
+<span class="sourceLineNo">1846</span>    // Setting up region<a name="line.1846"></a>
+<span class="sourceLineNo">1847</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.1847"></a>
+<span class="sourceLineNo">1848</span>    // Putting data in key<a name="line.1848"></a>
+<span class="sourceLineNo">1849</span>    Put put = new Put(row1);<a name="line.1849"></a>
+<span class="sourceLineNo">1850</span>    put.addColumn(fam1, qf1, val1);<a name="line.1850"></a>
+<span class="sourceLineNo">1851</span>    region.put(put);<a name="line.1851"></a>
+<span class="sourceLineNo">1852</span><a name="line.1852"></a>
+<span class="sourceLineNo">1853</span>    // checkAndPut with correct value<a name="line.1853"></a>
+<span class="sourceLineNo">1854</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1854"></a>
+<span class="sourceLineNo">1855</span>        new BinaryComparator(val1), put);<a name="line.1855"></a>
+<span class="sourceLineNo">1856</span>    assertEquals(true, res);<a name="line.1856"></a>
+<span class="sourceLineNo">1857</span><a name="line.1857"></a>
+<span class="sourceLineNo">1858</span>    // checkAndDelete with correct value<a name="line.1858"></a>
+<span class="sourceLineNo">1859</span>    Delete delete = new Delete(row1);<a name="line.1859"></a>
+<span class="sourceLineNo">1860</span>    delete.addColumn(fam1, qf1);<a name="line.1860"></a>
+<span class="sourceLineNo">1861</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new BinaryComparator(val1),<a name="line.1861"></a>
+<span class="sourceLineNo">1862</span>        delete);<a name="line.1862"></a>
+<span class="sourceLineNo">1863</span>    assertEquals(true, res);<a name="line.1863"></a>
+<span class="sourceLineNo">1864</span><a name="line.1864"></a>
+<span class="sourceLineNo">1865</span>    // Putting data in key<a name="line.1865"></a>
+<span class="sourceLineNo">1866</span>    put = new Put(row1);<a name="line.1866"></a>
+<span class="sourceLineNo">1867</span>    put.addColumn(fam1, qf1, Bytes.toBytes(bd1));<a name="line.1867"></a>
+<span class="sourceLineNo">1868</span>    region.put(put);<a name="line.1868"></a>
+<span class="sourceLineNo">1869</span><a name="line.1869"></a>
+<span class="sourceLineNo">1870</span>    // checkAndPut with correct value<a name="line.1870"></a>
+<span class="sourceLineNo">1871</span>    res =<a name="line.1871"></a>
+<span class="sourceLineNo">1872</span>        region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new BigDecimalComparator(<a name="line.1872"></a>
+<span class="sourceLineNo">1873</span>            bd1), put);<a name="line.1873"></a>
+<span class="sourceLineNo">1874</span>    assertEquals(true, res);<a name="line.1874"></a>
+<span class="sourceLineNo">1875</span><a name="line.1875"></a>
+<span class="sourceLineNo">1876</span>    // checkAndDelete with correct value<a name="line.1876"></a>
+<span class="sourceLineNo">1877</span>    delete = new Delete(row1);<a name="line.1877"></a>
+<span class="sourceLineNo">1878</span>    delete.addColumn(fam1, qf1);<a name="line.1878"></a>
+<span class="sourceLineNo">1879</span>    res =<a name="line.1879"></a>
+<span class="sourceLineNo">1880</span>        region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new BigDecimalComparator(<a name="line.1880"></a>
+<span class="sourceLineNo">1881</span>            bd1), delete);<a name="line.1881"></a>
+<span class="sourceLineNo">1882</span>    assertEquals(true, res);<a name="line.1882"></a>
+<span class="sourceLineNo">1883</span>  }<a name="line.1883"></a>
+<span class="sourceLineNo">1884</span><a name="line.1884"></a>
+<span class="sourceLineNo">1885</span>  @Test<a name="line.1885"></a>
+<span class="sourceLineNo">1886</span>  public void testCheckAndMutate_WithNonEqualCompareOp() throws IOException {<a name="line.1886"></a>
+<span class="sourceLineNo">1887</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1887"></a>
+<span class="sourceLineNo">1888</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1888"></a>
+<span class="sourceLineNo">1889</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1889"></a>
+<span class="sourceLineNo">1890</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1890"></a>
+<span class="sourceLineNo">1891</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.1891"></a>
+<span class="sourceLineNo">1892</span>    byte[] val3 = Bytes.toBytes("value3");<a name="line.1892"></a>
+<span class="sourceLineNo">1893</span>    byte[] val4 = Bytes.toBytes("value4");<a name="line.1893"></a>
+<span class="sourceLineNo">1894</span><a name="line.1894"></a>
+<span class="sourceLineNo">1895</span>    // Setting up region<a name="line.1895"></a>
+<span class="sourceLineNo">1896</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.1896"></a>
+<span class="sourceLineNo">1897</span>    // Putting val3 in key<a name="line.1897"></a>
+<span class="sourceLineNo">1898</span>    Put put = new Put(row1);<a name="line.1898"></a>
+<span class="sourceLineNo">1899</span>    put.addColumn(fam1, qf1, val3);<a name="line.1899"></a>
+<span class="sourceLineNo">1900</span>    region.put(put);<a name="line.1900"></a>
+<span class="sourceLineNo">1901</span><a name="line.1901"></a>
+<span class="sourceLineNo">1902</span>    // Test CompareOp.LESS: original = val3, compare with val3, fail<a name="line.1902"></a>
+<span class="sourceLineNo">1903</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS,<a name="line.1903"></a>
+<span class="sourceLineNo">1904</span>        new BinaryComparator(val3), put);<a name="line.1904"></a>
+<span class="sourceLineNo">1905</span>    assertEquals(false, res);<a name="line.1905"></a>
+<span class="sourceLineNo">1906</span><a name="line.1906"></a>
+<span class="sourceLineNo">1907</span>    // Test CompareOp.LESS: original = val3, compare with val4, fail<a name="line.1907"></a>
+<span class="sourceLineNo">1908</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS,<a name="line.1908"></a>
+<span class="sourceLineNo">1909</span>        new BinaryComparator(val4), put);<a name="line.1909"></a>
+<span class="sourceLineNo">1910</span>    assertEquals(false, res);<a name="line.1910"></a>
+<span class="sourceLineNo">1911</span><a name="line.1911"></a>
+<span class="sourceLineNo">1912</span>    // Test CompareOp.LESS: original = val3, compare with val2,<a name="line.1912"></a>
+<span class="sourceLineNo">1913</span>    // succeed (now value = val2)<a name="line.1913"></a>
+<span class="sourceLineNo">1914</span>    put = new Put(row1);<a name="line.1914"></a>
+<span class="sourceLineNo">1915</span>    put.addColumn(fam1, qf1, val2);<a name="line.1915"></a>
+<span class="sourceLineNo">1916</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS,<a name="line.1916"></a>
+<span class="sourceLineNo">1917</span>        new BinaryComparator(val2), put);<a name="line.1917"></a>
+<span class="sourceLineNo">1918</span>    assertEquals(true, res);<a name="line.1918"></a>
+<span class="sourceLineNo">1919</span><a name="line.1919"></a>
+<span class="sourceLineNo">1920</span>    // Test CompareOp.LESS_OR_EQUAL: original = val2, compare with val3, fail<a name="line.1920"></a>
+<span class="sourceLineNo">1921</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS_OR_EQUAL,<a name="line.1921"></a>
+<span class="sourceLineNo">1922</span>        new BinaryComparator(val3), put);<a name="line.1922"></a>
+<span class="sourceLineNo">1923</span>    assertEquals(false, res);<a name="line.1923"></a>
+<span class="sourceLineNo">1924</span><a name="line.1924"></a>
+<span class="sourceLineNo">1925</span>    // Test CompareOp.LESS_OR_EQUAL: original = val2, compare with val2,<a name="line.1925"></a>
+<span class="sourceLineNo">1926</span>    // succeed (value still = val2)<a name="line.1926"></a>
+<span class="sourceLineNo">1927</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS_OR_EQUAL,<a name="line.1927"></a>
+<span class="sourceLineNo">1928</span>        new BinaryComparator(val2), put);<a name="line.1928"></a>
+<span class="sourceLineNo">1929</span>    assertEquals(true, res);<a name="line.1929"></a>
+<span class="sourceLineNo">1930</span><a name="line.1930"></a>
+<span class="sourceLineNo">1931</span>    // Test CompareOp.LESS_OR_EQUAL: original = val2, compare with val1,<a name="line.1931"></a>
+<span class="sourceLineNo">1932</span>    // succeed (now value = val3)<a name="line.1932"></a>
+<span class="sourceLineNo">1933</span>    put = new Put(row1);<a name="line.1933"></a>
+<span class="sourceLineNo">1934</span>    put.addColumn(fam1, qf1, val3);<a name="line.1934"></a>
+<span class="sourceLineNo">1935</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS_OR_EQUAL,<a name="line.1935"></a>
+<span class="sourceLineNo">1936</span>        new BinaryComparator(val1), put);<a name="line.1936"></a>
+<span class="sourceLineNo">1937</span>    assertEquals(true, res);<a name="line.1937"></a>
+<span class="sourceLineNo">1938</span><a name="line.1938"></a>
+<span class="sourceLineNo">1939</span>    // Test CompareOp.GREATER: original = val3, compare with val3, fail<a name="line.1939"></a>
+<span class="sourceLineNo">1940</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER,<a name="line.1940"></a>
+<span class="sourceLineNo">1941</span>        new BinaryComparator(val3), put);<a name="line.1941"></a>
+<span class="sourceLineNo">1942</span>    assertEquals(false, res);<a name="line.1942"></a>
+<span class="sourceLineNo">1943</span><a name="line.1943"></a>
+<span class="sourceLineNo">1944</span>    // Test CompareOp.GREATER: original = val3, compare with val2, fail<a name="line.1944"></a>
+<span class="sourceLineNo">1945</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER,<a name="line.1945"></a>
+<span class="sourceLineNo">1946</span>        new BinaryComparator(val2), put);<a name="line.1946"></a>
+<span class="sourceLineNo">1947</span>    assertEquals(false, res);<a name="line.1947"></a>
+<span class="sourceLineNo">1948</span><a name="line.1948"></a>
+<span class="sourceLineNo">1949</span>    // Test CompareOp.GREATER: original = val3, compare with val4,<a name="line.1949"></a>
+<span class="sourceLineNo">1950</span>    // succeed (now value = val2)<a name="line.1950"></a>
+<span class="sourceLineNo">1951</span>    put = new Put(row1);<a name="line.1951"></a>
+<span class="sourceLineNo">1952</span>    put.addColumn(fam1, qf1, val2);<a name="line.1952"></a>
+<span class="sourceLineNo">1953</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER,<a name="line.1953"></a>
+<span class="sourceLineNo">1954</span>        new BinaryComparator(val4), put);<a name="line.1954"></a>
+<span class="sourceLineNo">1955</span>    assertEquals(true, res);<a name="line.1955"></a>
+<span class="sourceLineNo">1956</span><a name="line.1956"></a>
+<span class="sourceLineNo">1957</span>    // Test CompareOp.GREATER_OR_EQUAL: original = val2, compare with val1, fail<a name="line.1957"></a>
+<span class="sourceLineNo">1958</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER_OR_EQUAL,<a name="line.1958"></a>
+<span class="sourceLineNo">1959</span>        new BinaryComparator(val1), put);<a name="line.1959"></a>
+<span class="sourceLineNo">1960</span>    assertEquals(false, res);<a name="line.1960"></a>
+<span class="sourceLineNo">1961</span><a name="line.1961"></a>
+<span class="sourceLineNo">1962</span>    // Test CompareOp.GREATER_OR_EQUAL: original = val2, compare with val2,<a name="line.1962"></a>
+<span class="sourceLineNo">1963</span>    // succeed (value still = val2)<a name="line.1963"></a>
+<span class="sourceLineNo">1964</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER_OR_EQUAL,<a name="line.1964"></a>
+<span class="sourceLineNo">1965</span>        new BinaryComparator(val2), put);<a name="line.1965"></a>
+<span class="sourceLineNo">1966</span>    assertEquals(true, res);<a name="line.1966"></a>
+<span class="sourceLineNo">1967</span><a name="line.1967"></a>
+<span class="sourceLineNo">1968</span>    // Test CompareOp.GREATER_OR_EQUAL: original = val2, compare with val3, succeed<a name="line.1968"></a>
+<span class="sourceLineNo">1969</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER_OR_EQUAL,<a name="line.1969"></a>
+<span class="sourceLineNo">1970</span>        new BinaryComparator(val3), put);<a name="line.1970"></a>
+<span class="sourceLineNo">1971</span>    assertEquals(true, res);<a name="line.1971"></a>
+<span class="sourceLineNo">1972</span>  }<a name="line.1972"></a>
+<span class="sourceLineNo">1973</span><a name="line.1973"></a>
+<span class="sourceLineNo">1974</span>  @Test<a name="line.1974"></a>
+<span class="sourceLineNo">1975</span>  public void testCheckAndPut_ThatPutWasWritten() throws IOException {<a name="line.1975"></a>
+<span class="sourceLineNo">1976</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1976"></a>
+<span class="sourceLineNo">1977</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1977"></a>
+<span class="sourceLineNo">1978</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.1978"></a>
+<span class="sourceLineNo">1979</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1979"></a>
+<span class="sourceLineNo">1980</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1980"></a>
+<span class="sourceLineNo">1981</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.1981"></a>
+<span class="sourceLineNo">1982</span><a name="line.1982"></a>
+<span class="sourceLineNo">1983</span>    byte[][] families = { fam1, fam2 };<a name="line.1983"></a>
+<span class="sourceLineNo">1984</span><a name="line.1984"></a>
+<span class="sourceLineNo">1985</span>    // Setting up region<a name="line.1985"></a>
+<span class="sourceLineNo">1986</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.1986"></a>
+<span class="sourceLineNo">1987</span>    // Putting data in the key to check<a name="line.1987"></a>
+<span class="sourceLineNo">1988</span>    Put put = new Put(row1);<a name="line.1988"></a>
+<span class="sourceLineNo">1989</span>    put.addColumn(fam1, qf1, val1);<a name="line.1989"></a>
+<span class="sourceLineNo">1990</span>    region.put(put);<a name="line.1990"></a>
+<span class="sourceLineNo">1991</span><a name="line.1991"></a>
+<span class="sourceLineNo">1992</span>    // Creating put to add<a name="line.1992"></a>
+<span class="sourceLineNo">1993</span>    long ts = System.currentTimeMillis();<a name="line.1993"></a>
+<span class="sourceLineNo">1994</span>    KeyValue kv = new KeyValue(row1, fam2, qf1, ts, KeyValue.Type.Put, val2);<a name="line.1994"></a>
+<span class="sourceLineNo">1995</span>    put = new Put(row1);<a name="line.1995"></a>
+<span class="sourceLineNo">1996</span>    put.add(kv);<a name="line.1996"></a>
+<span class="sourceLineNo">1997</span><a name="line.1997"></a>
+<span class="sourceLineNo">1998</span>    // checkAndPut with wrong value<a name="line.1998"></a>
+<span class="sourceLineNo">1999</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1999"></a>
+<span class="sourceLineNo">2000</span>        new BinaryComparator(val1), put);<a name="line.2000"></a>
+<span class="sourceLineNo">2001</span>    assertEquals(true, res);<a name="line.2001"></a>
+<span class="sourceLineNo">2002</span><a name="line.2002"></a>
+<span class="sourceLineNo">2003</span>    Get get = new Get(row1);<a name="line.2003"></a>
+<span class="sourceLineNo">2004</span>    get.addColumn(fam2, qf1);<a name="line.2004"></a>
+<span class="sourceLineNo">2005</span>    Cell[] actual = region.get(get).rawCells();<a name="line.2005"></a>
+<span class="sourceLineNo">2006</span><a name="line.2006"></a>
+<span class="sourceLineNo">2007</span>    Cell[] expected = { kv };<a name="line.2007"></a>
+<span class="sourceLineNo">2008</span><a name="line.2008"></a>
+<span class="sourceLineNo">2009</span>    assertEquals(expected.length, actual.length);<a name="line.2009"></a>
+<span class="sourceLineNo">2010</span>    for (int i = 0; i &lt; actual.length; i++) {<a name="line.2010"></a>
+<span class="sourceLineNo">2011</span>      assertEquals(expected[i], actual[i]);<a name="line.2011"></a>
+<span class="sourceLineNo">2012</span>    }<a name="line.2012"></a>
+<span class="sourceLineNo">2013</span>  }<a name="line.2013"></a>
+<span class="sourceLineNo">2014</span><a name="line.2014"></a>
+<span class="sourceLineNo">2015</span>  @Test<a name="line.2015"></a>
+<span class="sourceLineNo">2016</span>  public void testCheckAndPut_wrongRowInPut() throws IOException {<a name="line.2016"></a>
+<span class="sourceLineNo">2017</span>    this.region = initHRegion(tableName, method, CONF, COLUMNS);<a name="line.2017"></a>
+<span class="sourceLineNo">2018</span>    Put put = new Put(row2);<a name="line.2018"></a>
+<span class="sourceLineNo">2019</span>    put.addColumn(fam1, qual1, value1);<a name="line.2019"></a>
+<span class="sourceLineNo">2020</span>    try {<a name="line.2020"></a>
+<span class="sourceLineNo">2021</span>      region.checkAndMutate(row, fam1, qual1, CompareOperator.EQUAL,<a name="line.2021"></a>
+<span class="sourceLineNo">2022</span>          new BinaryComparator(value2), put);<a name="line.2022"></a>
+<span class="sourceLineNo">2023</span>      fail();<a name="line.2023"></a>
+<span class="sourceLineNo">2024</span>    } catch (org.apache.hadoop.hbase.DoNotRetryIOException expected) {<a name="line.2024"></a>
+<span class="sourceLineNo">2025</span>      // expected exception.<a name="line.2025"></a>
+<span class="sourceLineNo">2026</span>    }<a name="line.2026"></a>
+<span class="sourceLineNo">2027</span>  }<a name="line.2027"></a>
+<span class="sourceLineNo">2028</span><a name="line.2028"></a>
+<span class="sourceLineNo">2029</span>  @Test<a name="line.2029"></a>
+<span class="sourceLineNo">2030</span>  public void testCheckAndDelete_ThatDeleteWasWritten() throws IOException {<a name="line.2030"></a>
+<span class="sourceLineNo">2031</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2031"></a>
+<span class="sourceLineNo">2032</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2032"></a>
+<span class="sourceLineNo">2033</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2033"></a>
+<span class="sourceLineNo">2034</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.2034"></a>
+<span class="sourceLineNo">2035</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.2035"></a>
+<span class="sourceLineNo">2036</span>    byte[] qf3 = Bytes.toBytes("qualifier3");<a name="line.2036"></a>
+<span class="sourceLineNo">2037</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.2037"></a>
+<span class="sourceLineNo">2038</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.2038"></a>
+<span class="sourceLineNo">2039</span>    byte[] val3 = Bytes.toBytes("value3");<a name="line.2039"></a>
+<span class="sourceLineNo">2040</span>    byte[] emptyVal = new byte[] {};<a name="line.2040"></a>
+<span class="sourceLineNo">2041</span><a name="line.2041"></a>
+<span class="sourceLineNo">2042</span>    byte[][] families = { fam1, fam2 };<a name="line.2042"></a>
+<span class="sourceLineNo">2043</span><a name="line.2043"></a>
+<span class="sourceLineNo">2044</span>    // Setting up region<a name="line.2044"></a>
+<span class="sourceLineNo">2045</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2045"></a>
+<span class="sourceLineNo">2046</span>    // Put content<a name="line.2046"></a>
+<span class="sourceLineNo">2047</span>    Put put = new Put(row1);<a name="line.2047"></a>
+<span class="sourceLineNo">2048</span>    put.addColumn(fam1, qf1, val1);<a name="line.2048"></a>
+<span class="sourceLineNo">2049</span>    region.put(put);<a name="line.2049"></a>
+<span class="sourceLineNo">2050</span>    Threads.sleep(2);<a name="line.2050"></a>
+<span class="sourceLineNo">2051</span><a name="line.2051"></a>
+<span class="sourceLineNo">2052</span>    put = new Put(row1);<a name="line.2052"></a>
+<span class="sourceLineNo">2053</span>    put.addColumn(fam1, qf1, val2);<a name="line.2053"></a>
+<span class="sourceLineNo">2054</span>    put.addColumn(fam2, qf1, val3);<a name="line.2054"></a>
+<span class="sourceLineNo">2055</span>    put.addColumn(fam2, qf2, val2);<a name="line.2055"></a>
+<span class="sourceLineNo">2056</span>    put.addColumn(fam2, qf3, val1);<a name="line.2056"></a>
+<span class="sourceLineNo">2057</span>    put.addColumn(fam1, qf3, val1);<a name="line.2057"></a>
+<span class="sourceLineNo">2058</span>    region.put(put);<a name="line.2058"></a>
+<span class="sourceLineNo">2059</span><a name="line.2059"></a>
+<span class="sourceLineNo">2060</span>    // Multi-column delete<a name="line.2060"></a>
+<span class="sourceLineNo">2061</span>    Delete delete = new Delete(row1);<a name="line.2061"></a>
+<span class="sourceLineNo">2062</span>    delete.addColumn(fam1, qf1);<a name="line.2062"></a>
+<span class="sourceLineNo">2063</span>    delete.addColumn(fam2, qf1);<a name="line.2063"></a>
+<span class="sourceLineNo">2064</span>    delete.addColumn(fam1, qf3);<a name="line.2064"></a>
+<span class="sourceLineNo">2065</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.2065"></a>
+<span class="sourceLineNo">2066</span>        new BinaryComparator(val2), delete);<a name="line.2066"></a>
+<span class="sourceLineNo">2067</span>    assertEquals(true, res);<a name="line.2067"></a>
+<span class="sourceLineNo">2068</span><a name="line.2068"></a>
+<span class="sourceLineNo">2069</span>    Get get = new Get(row1);<a name="line.2069"></a>
+<span class="sourceLineNo">2070</span>    get.addColumn(fam1, qf1);<a name="line.2070"></a>
+<span class="sourceLineNo">2071</span>    get.addColumn(fam1, qf3);<a name="line.2071"></a>
+<span class="sourceLineNo">2072</span>    get.addColumn(fam2, qf2);<a name="line.2072"></a>
+<span class="sourceLineNo">2073</span>    Result r = region.get(get);<a name="line.2073"></a>
+<span class="sourceLineNo">2074</span>    assertEquals(2, r.size());<a name="line.2074"></a>
+<span class="sourceLineNo">2075</span>    assertArrayEquals(val1, r.getValue(fam1, qf1));<a name="line.2075"></a>
+<span class="sourceLineNo">2076</span>    assertArrayEquals(val2, r.getValue(fam2, qf2));<a name="line.2076"></a>
+<span class="sourceLineNo">2077</span><a name="line.2077"></a>
+<span class="sourceLineNo">2078</span>    // Family delete<a name="line.2078"></a>
+<span class="sourceLineNo">2079</span>    delete = new Delete(row1);<a name="line.2079"></a>
+<span class="sourceLineNo">2080</span>    delete.addFamily(fam2);<a name="line.2080"></a>
+<span class="sourceLineNo">2081</span>    res = region.checkAndMutate(row1, fam2, qf1, CompareOperator.EQUAL,<a name="line.2081"></a>
+<span class="sourceLineNo">2082</span>        new BinaryComparator(emptyVal), delete);<a name="line.2082"></a>
+<span class="sourceLineNo">2083</span>    assertEquals(true, res);<a name="line.2083"></a>
+<span class="sourceLineNo">2084</span><a name="line.2084"></a>
+<span class="sourceLineNo">2085</span>    get = new Get(row1);<a name="line.2085"></a>
+<span class="sourceLineNo">2086</span>    r = region.get(get);<a name="line.2086"></a>
+<span class="sourceLineNo">2087</span>    assertEquals(1, r.size());<a name="line.2087"></a>
+<span class="sourceLineNo">2088</span>    assertArrayEquals(val1, r.getValue(fam1, qf1));<a name="line.2088"></a>
+<span class="sourceLineNo">2089</span><a name="line.2089"></a>
+<span class="sourceLineNo">2090</span>    // Row delete<a name="line.2090"></a>
+<span class="sourceLineNo">2091</span>    delete = new Delete(row1);<a name="line.2091"></a>
+<span class="sourceLineNo">2092</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new BinaryComparator(val1),<a name="line.2092"></a>
+<span class="sourceLineNo">2093</span>        delete);<a name="line.2093"></a>
+<span class="sourceLineNo">2094</span>    assertEquals(true, res);<a name="line.2094"></a>
+<span class="sourceLineNo">2095</span>    get = new Get(row1);<a name="line.2095"></a>
+<span class="sourceLineNo">2096</span>    r = region.get(get);<a name="line.2096"></a>
+<span class="sourceLineNo">2097</span>    assertEquals(0, r.size());<a name="line.2097"></a>
+<span class="sourceLineNo">2098</span>  }<a name="line.2098"></a>
+<span class="sourceLineNo">2099</span><a name="line.2099"></a>
+<span class="sourceLineNo">2100</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2100"></a>
+<span class="sourceLineNo">2101</span>  // Delete tests<a name="line.2101"></a>
+<span class="sourceLineNo">2102</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2102"></a>
+<span class="sourceLineNo">2103</span>  @Test<a name="line.2103"></a>
+<span class="sourceLineNo">2104</span>  public void testDelete_multiDeleteColumn() throws IOException {<a name="line.2104"></a>
+<span class="sourceLineNo">2105</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2105"></a>
+<span class="sourceLineNo">2106</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2106"></a>
+<span class="sourceLineNo">2107</span>    byte[] qual = Bytes.toBytes("qualifier");<a name="line.2107"></a>
+<span class="sourceLineNo">2108</span>    byte[] value = Bytes.toBytes("value");<a name="line.2108"></a>
+<span class="sourceLineNo">2109</span><a name="line.2109"></a>
+<span class="sourceLineNo">2110</span>    Put put = new Put(row1);<a name="line.2110"></a>
+<span class="sourceLineNo">2111</span>    put.addColumn(fam1, qual, 1, value);<a name="line.2111"></a>
+<span class="sourceLineNo">2112</span>    put.addColumn(fam1, qual, 2, value);<a name="line.2112"></a>
+<span class="sourceLineNo">2113</span><a name="line.2113"></a>
+<span class="sourceLineNo">2114</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2114"></a>
+<span class="sourceLineNo">2115</span>    region.put(put);<a name="line.2115"></a>
+<span class="sourceLineNo">2116</span><a name="line.2116"></a>
+<span class="sourceLineNo">2117</span>    // We do support deleting more than 1 'latest' version<a name="line.2117"></a>
+<span class="sourceLineNo">2118</span>    Delete delete = new Delete(row1);<a name="line.2118"></a>
 <span class="sourceLineNo">2119</span>    delete.addColumn(fam1, qual);<a name="line.2119"></a>
-<span class="sourceLineNo">2120</span>    region.delete(delete);<a name="line.2120"></a>
-<span class="sourceLineNo">2121</span><a name="line.2121"></a>
-<span class="sourceLineNo">2122</span>    Get get = new Get(row1);<a name="line.2122"></a>
-<span class="sourceLineNo">2123</span>    get.addFamily(fam1);<a name="line.2123"></a>
-<span class="sourceLineNo">2124</span>    Result r = region.get(get);<a name="line.2124"></a>
-<span class="sourceLineNo">2125</span>    assertEquals(0, r.size());<a name="line.2125"></a>
-<span class="sourceLineNo">2126</span>  }<a name="line.2126"></a>
-<span class="sourceLineNo">2127</span><a name="line.2127"></a>
-<span class="sourceLineNo">2128</span>  @Test<a name="line.2128"></a>
-<span class="sourceLineNo">2129</span>  public void testDelete_CheckFamily() throws IOException {<a name="line.2129"></a>
-<span class="sourceLineNo">2130</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2130"></a>
-<span class="sourceLineNo">2131</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2131"></a>
-<span class="sourceLineNo">2132</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2132"></a>
-<span class="sourceLineNo">2133</span>    byte[] fam3 = Bytes.toBytes("fam3");<a name="line.2133"></a>
-<span class="sourceLineNo">2134</span>    byte[] fam4 = Bytes.toBytes("fam4");<a name="line.2134"></a>
-<span class="sourceLineNo">2135</span><a name="line.2135"></a>
-<span class="sourceLineNo">2136</span>    // Setting up region<a name="line.2136"></a>
-<span class="sourceLineNo">2137</span>    this.region = initHRegion(tableName, method, CONF, fam1, fam2, fam3);<a name="line.2137"></a>
-<span class="sourceLineNo">2138</span>    List&lt;Cell&gt; kvs = new ArrayList&lt;&gt;();<a name="line.2138"></a>
-<span class="sourceLineNo">2139</span>    kvs.add(new KeyValue(row1, fam4, null, null));<a name="line.2139"></a>
-<span class="sourceLineNo">2140</span><a name="line.2140"></a>
-<span class="sourceLineNo">2141</span>    // testing existing family<a name="line.2141"></a>
-<span class="sourceLineNo">2142</span>    byte[] family = fam2;<a name="line.2142"></a>
-<span class="sourceLineNo">2143</span>    NavigableMap&lt;byte[], List&lt;Cell&gt;&gt; deleteMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2143"></a>
-<span class="sourceLineNo">2144</span>    deleteMap.put(family, kvs);<a name="line.2144"></a>
-<span class="sourceLineNo">2145</span>    region.delete(deleteMap, Durability.SYNC_WAL);<a name="line.2145"></a>
-<span class="sourceLineNo">2146</span><a name="line.2146"></a>
-<span class="sourceLineNo">2147</span>    // testing non existing family<a name="line.2147"></a>
-<span class="sourceLineNo">2148</span>    boolean ok = false;<a name="line.2148"></a>
-<span class="sourceLineNo">2149</span>    family = fam4;<a name="line.2149"></a>
-<span class="sourceLineNo">2150</span>    try {<a name="line.2150"></a>
-<span class="sourceLineNo">2151</span>      deleteMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2151"></a>
-<span class="sourceLineNo">2152</span>      deleteMap.put(family, kvs);<a name="line.2152"></a>
-<span class="sourceLineNo">2153</span>      region.delete(deleteMap, Durability.SYNC_WAL);<a name="line.2153"></a>
-<span class="sourceLineNo">2154</span>    } catch (Exception e) {<a name="line.2154"></a>
-<span class="sourceLineNo">2155</span>      ok = true;<a name="line.2155"></a>
-<span class="sourceLineNo">2156</span>    }<a name="line.2156"></a>
-<span class="sourceLineNo">2157</span>    assertTrue("Family " + new String(family, StandardCharsets.UTF_8) + " does exist", ok);<a name="line.2157"></a>
-<span class="sourceLineNo">2158</span>  }<a name="line.2158"></a>
-<span class="sourceLineNo">2159</span><a name="line.2159"></a>
-<span class="sourceLineNo">2160</span>  @Test<a name="line.2160"></a>
-<span class="sourceLineNo">2161</span>  public void testDelete_mixed() throws IOException, InterruptedException {<a name="line.2161"></a>
-<span class="sourceLineNo">2162</span>    byte[] fam = Bytes.toBytes("info");<a name="line.2162"></a>
-<span class="sourceLineNo">2163</span>    byte[][] families = { fam };<a name="line.2163"></a>
-<span class="sourceLineNo">2164</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2164"></a>
-<span class="sourceLineNo">2165</span>    EnvironmentEdgeManagerTestHelper.injectEdge(new IncrementingEnvironmentEdge());<a name="line.2165"></a>
-<span class="sourceLineNo">2166</span><a name="line.2166"></a>
-<span class="sourceLineNo">2167</span>    byte[] row = Bytes.toBytes("table_name");<a name="line.2167"></a>
-<span class="sourceLineNo">2168</span>    // column names<a name="line.2168"></a>
-<span class="sourceLineNo">2169</span>    byte[] serverinfo = Bytes.toBytes("serverinfo");<a name="line.2169"></a>
-<span class="sourceLineNo">2170</span>    byte[] splitA = Bytes.toBytes("splitA");<a name="line.2170"></a>
-<span class="sourceLineNo">2171</span>    byte[] splitB = Bytes.toBytes("splitB");<a name="line.2171"></a>
-<span class="sourceLineNo">2172</span><a name="line.2172"></a>
-<span class="sourceLineNo">2173</span>    // add some data:<a name="line.2173"></a>
-<span class="sourceLineNo">2174</span>    Put put = new Put(row);<a name="line.2174"></a>
-<span class="sourceLineNo">2175</span>    put.addColumn(fam, splitA, Bytes.toBytes("reference_A"));<a name="line.2175"></a>
-<span class="sourceLineNo">2176</span>    region.put(put);<a name="line.2176"></a>
-<span class="sourceLineNo">2177</span><a name="line.2177"></a>
-<span class="sourceLineNo">2178</span>    put = new Put(row);<a name="line.2178"></a>
-<span class="sourceLineNo">2179</span>    put.addColumn(fam, splitB, Bytes.toBytes("reference_B"));<a name="line.2179"></a>
-<span class="sourceLineNo">2180</span>    region.put(put);<a name="line.2180"></a>
-<span class="sourceLineNo">2181</span><a name="line.2181"></a>
-<span class="sourceLineNo">2182</span>    put = new Put(row);<a name="line.2182"></a>
-<span class="sourceLineNo">2183</span>    put.addColumn(fam, serverinfo, Bytes.toBytes("ip_address"));<a name="line.2183"></a>
-<span class="sourceLineNo">2184</span>    region.put(put);<a name="line.2184"></a>
-<span class="sourceLineNo">2185</span><a name="line.2185"></a>
-<span class="sourceLineNo">2186</span>    // ok now delete a split:<a name="line.2186"></a>
-<span class="sourceLineNo">2187</span>    Delete delete = new Delete(row);<a name="line.2187"></a>
-<span class="sourceLineNo">2188</span>    delete.addColumns(fam, splitA);<a name="line.2188"></a>
-<span class="sourceLineNo">2189</span>    region.delete(delete);<a name="line.2189"></a>
-<span class="sourceLineNo">2190</span><a name="line.2190"></a>
-<span class="sourceLineNo">2191</span>    // assert some things:<a name="line.2191"></a>
-<span class="sourceLineNo">2192</span>    Get get = new Get(row).addColumn(fam, serverinfo);<a name="line.2192"></a>
-<span class="sourceLineNo">2193</span>    Result result = region.get(get);<a name="line.2193"></a>
-<span class="sourceLineNo">2194</span>    assertEquals(1, result.size());<a name="line.2194"></a>
-<span class="sourceLineNo">2195</span><a name="line.2195"></a>
-<span class="sourceLineNo">2196</span>    get = new Get(row).addColumn(fam, splitA);<a name="line.2196"></a>
-<span class="sourceLineNo">2197</span>    result = region.get(get);<a name="line.2197"></a>
-<span class="sourceLineNo">2198</span>    assertEquals(0, result.size());<a name="line.2198"></a>
-<span class="sourceLineNo">2199</span><a name="line.2199"></a>
-<span class="sourceLineNo">2200</span>    get = new Get(row).addColumn(fam, splitB);<a name="line.2200"></a>
-<span class="sourceLineNo">2201</span>    result = region.get(get);<a name="line.2201"></a>
-<span class="sourceLineNo">2202</span>    assertEquals(1, result.size());<a name="line.2202"></a>
-<span class="sourceLineNo">2203</span><a name="line.2203"></a>
-<span class="sourceLineNo">2204</span>    // Assert that after a delete, I can put.<a name="line.2204"></a>
-<span class="sourceLineNo">2205</span>    put = new Put(row);<a name="line.2205"></a>
-<span class="sourceLineNo">2206</span>    put.addColumn(fam, splitA, Bytes.toBytes("reference_A"));<a name="line.2206"></a>
-<span class="sourceLineNo">2207</span>    region.put(put);<a name="line.2207"></a>
-<span class="sourceLineNo">2208</span>    get = new Get(row);<a name="line.2208"></a>
-<span class="sourceLineNo">2209</span>    result = region.get(get);<a name="line.2209"></a>
-<span class="sourceLineNo">2210</span>    assertEquals(3, result.size());<a name="line.2210"></a>
-<span class="sourceLineNo">2211</span><a name="line.2211"></a>
-<span class="sourceLineNo">2212</span>    // Now delete all... then test I can add stuff back<a name="line.2212"></a>
-<span class="sourceLineNo">2213</span>    delete = new Delete(row);<a name="line.2213"></a>
-<span class="sourceLineNo">2214</span>    region.delete(delete);<a name="line.2214"></a>
-<span class="sourceLineNo">2215</span>    assertEquals(0, region.get(get).size());<a name="line.2215"></a>
-<span class="sourceLineNo">2216</span><a name="line.2216"></a>
-<span class="sourceLineNo">2217</span>    region.put(new Put(row).addColumn(fam, splitA, Bytes.toBytes("reference_A")));<a name="line.2217"></a>
-<span class="sourceLineNo">2218</span>    result = region.get(get);<a name="line.2218"></a>
-<span class="sourceLineNo">2219</span>    assertEquals(1, result.size());<a name="line.2219"></a>
-<span class="sourceLineNo">2220</span>  }<a name="line.2220"></a>
-<span class="sourceLineNo">2221</span><a name="line.2221"></a>
-<span class="sourceLineNo">2222</span>  @Test<a name="line.2222"></a>
-<span class="sourceLineNo">2223</span>  public void testDeleteRowWithFutureTs() throws IOException {<a name="line.2223"></a>
-<span class="sourceLineNo">2224</span>    byte[] fam = Bytes.toBytes("info");<a name="line.2224"></a>
-<span class="sourceLineNo">2225</span>    byte[][] families = { fam };<a name="line.2225"></a>
-<span class="sourceLineNo">2226</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2226"></a>
-<span class="sourceLineNo">2227</span>    byte[] row = Bytes.toBytes("table_name");<a name="line.2227"></a>
-<span class="sourceLineNo">2228</span>    // column names<a name="line.2228"></a>
-<span class="sourceLineNo">2229</span>    byte[] serverinfo = Bytes.toBytes("serverinfo");<a name="line.2229"></a>
-<span class="sourceLineNo">2230</span><a name="line.2230"></a>
-<span class="sourceLineNo">2231</span>    // add data in the far future<a name="line.2231"></a>
-<span class="sourceLineNo">2232</span>    Put put = new Put(row);<a name="line.2232"></a>
-<span class="sourceLineNo">2233</span>    put.addColumn(fam, serverinfo, HConstants.LATEST_TIMESTAMP - 5, Bytes.toBytes("value"));<a name="line.2233"></a>
-<span class="sourceLineNo">2234</span>    region.put(put);<a name="line.2234"></a>
-<span class="sourceLineNo">2235</span><a name="line.2235"></a>
-<span class="sourceLineNo">2236</span>    // now delete something in the present<a name="line.2236"></a>
-<span class="sourceLineNo">2237</span>    Delete delete = new Delete(row);<a name="line.2237"></a>
-<span class="sourceLineNo">2238</span>    region.delete(delete);<a name="line.2238"></a>
-<span class="sourceLineNo">2239</span><a name="line.2239"></a>
-<span class="sourceLineNo">2240</span>    // make sure we still see our data<a name="line.2240"></a>
-<span class="sourceLineNo">2241</span>    Get get = new Get(row).addColumn(fam, serverinfo);<a name="line.2241"></a>
-<span class="sourceLineNo">2242</span>    Result result = region.get(get);<a name="line.2242"></a>
-<span class="sourceLineNo">2243</span>    assertEquals(1, result.size());<a name="line.2243"></a>
-<span class="sourceLineNo">2244</span><a name="line.2244"></a>
-<span class="sourceLineNo">2245</span>    // delete the future row<a name="line.2245"></a>
-<span class="sourceLineNo">2246</span>    delete = new Delete(row, HConstants.LATEST_TIMESTAMP - 3);<a name="line.2246"></a>
-<span class="sourceLineNo">2247</span>    region.delete(delete);<a name="line.2247"></a>
-<span class="sourceLineNo">2248</span><a name="line.2248"></a>
-<span class="sourceLineNo">2249</span>    // make sure it is gone<a name="line.2249"></a>
-<span class="sourceLineNo">2250</span>    get = new Get(row).addColumn(fam, serverinfo);<a name="line.2250"></a>
-<span class="sourceLineNo">2251</span>    result = region.get(get);<a name="line.2251"></a>
-<span class="sourceLineNo">2252</span>    assertEquals(0, result.size());<a name="line.2252"></a>
-<span class="sourceLineNo">2253</span>  }<a name="line.2253"></a>
-<span class="sourceLineNo">2254</span><a name="line.2254"></a>
-<span class="sourceLineNo">2255</span>  /**<a name="line.2255"></a>
-<span class="sourceLineNo">2256</span>   * Tests that the special LATEST_TIMESTAMP option for puts gets replaced by<a name="line.2256"></a>
-<span class="sourceLineNo">2257</span>   * the actual timestamp<a name="line.2257"></a>
-<span class="sourceLineNo">2258</span>   */<a name="line.2258"></a>
-<span class="sourceLineNo">2259</span>  @Test<a name="line.2259"></a>
-<span class="sourceLineNo">2260</span>  public void testPutWithLatestTS() throws IOException {<a name="line.2260"></a>
-<span class="sourceLineNo">2261</span>    byte[] fam = Bytes.toBytes("info");<a name="line.2261"></a>
-<span class="sourceLineNo">2262</span>    byte[][] families = { fam };<a name="line.2262"></a>
-<span class="sourceLineNo">2263</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2263"></a>
-<span class="sourceLineNo">2264</span>    byte[] row = Bytes.toBytes("row1");<a name="line.2264"></a>
-<span class="sourceLineNo">2265</span>    // column names<a name="line.2265"></a>
-<span class="sourceLineNo">2266</span>    byte[] qual = Bytes.toBytes("qual");<a name="line.2266"></a>
-<span class="sourceLineNo">2267</span><a name="line.2267"></a>
-<span class="sourceLineNo">2268</span>    // add data with LATEST_TIMESTAMP, put without WAL<a name="line.2268"></a>
-<span class="sourceLineNo">2269</span>    Put put = new Put(row);<a name="line.2269"></a>
-<span class="sourceLineNo">2270</span>    put.addColumn(fam, qual, HConstants.LATEST_TIMESTAMP, Bytes.toBytes("value"));<a name="line.2270"></a>
-<span class="sourceLineNo">2271</span>    region.put(put);<a name="line.2271"></a>
-<span class="sourceLineNo">2272</span><a name="line.2272"></a>
-<span class="sourceLineNo">2273</span>    // Make sure it shows up with an actual timestamp<a name="line.2273"></a>
-<span class="sourceLineNo">2274</span>    Get get = new Get(row).addColumn(fam, qual);<a name="line.2274"></a>
-<span class="sourceLineNo">2275</span>    Result result = region.get(get);<a name="line.2275"></a>
-<span class="sourceLineNo">2276</span>    assertEquals(1, result.size());<a name="line.2276"></a>
-<span class="sourceLineNo">2277</span>    Cell kv = result.rawCells()[0];<a name="line.2277"></a>
-<span class="sourceLineNo">2278</span>    LOG.info("Got: " + kv);<a name="line.2278"></a>
-<span class="sourceLineNo">2279</span>    assertTrue("LATEST_TIMESTAMP was not replaced with real timestamp",<a name="line.2279"></a>
-<span class="sourceLineNo">2280</span>        kv.getTimestamp() != HConstants.LATEST_TIMESTAMP);<a name="line.2280"></a>
-<span class="sourceLineNo">2281</span><a name="line.2281"></a>
-<span class="sourceLineNo">2282</span>    // Check same with WAL enabled (historically these took different<a name="line.2282"></a>
-<span class="sourceLineNo">2283</span>    // code paths, so check both)<a name="line.2283"></a>
-<span class="sourceLineNo">2284</span>    row = Bytes.toBytes("row2");<a name="line.2284"></a>
-<span class="sourceLineNo">2285</span>    put = new Put(row);<a name="line.2285"></a>
-<span class="sourceLineNo">2286</span>    put.addColumn(fam, qual, HConstants.LATEST_TIMESTAMP, Bytes.toBytes("value"));<a name="line.2286"></a>
-<span class="sourceLineNo">2287</span>    region.put(put);<a name="line.2287"></a>
-<span class="sourceLineNo">2288</span><a name="line.2288"></a>
-<span class="sourceLineNo">2289</span>    // Make sure it shows up with an actual timestamp<a name="line.2289"></a>
-<span class="sourceLineNo">2290</span>    get = new Get(row).addColumn(fam, qual);<a name="line.2290"></a>
-<span class="sourceLineNo">2291</span>    result = region.get(get);<a name="line.2291"></a>
-<span class="sourceLineNo">2292</span>    assertEquals(1, result.size());<a name="line.2292"></a>
-<span class="sourceLineNo">2293</span>    kv = result.rawCells()[0];<a name="line.2293"></a>
-<span class="sourceLineNo">2294</span>    LOG.info("Got: " + kv);<a name="line.2294"></a>
-<span class="sourceLineNo">2295</span>    assertTrue("LATEST_TIMESTAMP was not replaced with real timestamp",<a name="line.2295"></a>
-<span class="sourceLineNo">2296</span>        kv.getTimestamp() != HConstants.LATEST_TIMESTAMP);<a name="line.2296"></a>
-<span class="sourceLineNo">2297</span>  }<a name="line.2297"></a>
-<span class="sourceLineNo">2298</span><a name="line.2298"></a>
-<span class="sourceLineNo">2299</span>  /**<a name="line.2299"></a>
-<span class="sourceLineNo">2300</span>   * Tests that there is server-side filtering for invalid timestamp upper<a name="line.2300"></a>
-<span class="sourceLineNo">2301</span>   * bound. Note that the timestamp lower bound is automatically handled for us<a name="line.2301"></a>
-<span class="sourceLineNo">2302</span>   * by the TTL field.<a name="line.2302"></a>
-<span class="sourceLineNo">2303</span>   */<a name="line.2303"></a>
-<span class="sourceLineNo">2304</span>  @Test<a name="line.2304"></a>
-<span class="sourceLineNo">2305</span>  public void testPutWithTsSlop() throws IOException {<a name="line.2305"></a>
-<span class="sourceLineNo">2306</span>    byte[] fam = Bytes.toBytes("info");<a name="line.2306"></a>
-<span class="sourceLineNo">2307</span>    byte[][] families = { fam };<a name="line.2307"></a>
-<span class="sourceLineNo">2308</span><a name="line.2308"></a>
-<span class="sourceLineNo">2309</span>    // add data with a timestamp that is too recent for range. Ensure assert<a name="line.2309"></a>
-<span class="sourceLineNo">2310</span>    CONF.setInt("hbase.hregion.keyvalue.timestamp.slop.millisecs", 1000);<a name="line.2310"></a>
-<span class="sourceLineNo">2311</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2311"></a>
-<span class="sourceLineNo">2312</span>    boolean caughtExcep = false;<a name="line.2312"></a>
-<span class="sourceLineNo">2313</span>    try {<a name="line.2313"></a>
-<span class="sourceLineNo">2314</span>      // no TS specified == use latest. should not error<a name="line.2314"></a>
-<span class="sourceLineNo">2315</span>      region.put(new Put(row).addColumn(fam, Bytes.toBytes("qual"), Bytes.toBytes("value")));<a name="line.2315"></a>
-<span class="sourceLineNo">2316</span>      // TS out of range. should error<a name="line.2316"></a>
-<span class="sourceLineNo">2317</span>      region.put(new Put(row).addColumn(fam, Bytes.toBytes("qual"),<a name="line.2317"></a>
-<span class="sourceLineNo">2318</span>          System.currentTimeMillis() + 2000, Bytes.toBytes("value")));<a name="line.2318"></a>
-<span class="sourceLineNo">2319</span>      fail("Expected IOE for TS out of configured timerange");<a name="line.2319"></a>
-<span class="sourceLineNo">2320</span>    } catch (FailedSanityCheckException ioe) {<a name="line.2320"></a>
-<span class="sourceLineNo">2321</span>      LOG.debug("Received expected exception", ioe);<a name="line.2321"></a>
-<span class="sourceLineNo">2322</span>      caughtExcep = true;<a name="line.2322"></a>
-<span class="sourceLineNo">2323</span>    }<a name="line.2323"></a>
-<span class="sourceLineNo">2324</span>    assertTrue("Should catch FailedSanityCheckException", caughtExcep);<a name="line.2324"></a>
-<span class="sourceLineNo">2325</span>  }<a name="line.2325"></a>
-<span class="sourceLineNo">2326</span><a name="line.2326"></a>
-<span class="sourceLineNo">2327</span>  @Test<a name="line.2327"></a>
-<span class="sourceLineNo">2328</span>  public void testScanner_DeleteOneFamilyNotAnother() throws IOException {<a name="line.2328"></a>
-<span class="sourceLineNo">2329</span>    byte[] fam1 = Bytes.toBytes("columnA");<a name="line.2329"></a>
-<span class="sourceLineNo">2330</span>    byte[] fam2 = Bytes.toBytes("columnB");<a name="line.2330"></a>
-<span class="sourceLineNo">2331</span>    this.region = initHRegion(tableName, method, CONF, fam1, fam2);<a name="line.2331"></a>
-<span class="sourceLineNo">2332</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.2332"></a>
-<span class="sourceLineNo">2333</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.2333"></a>
-<span class="sourceLineNo">2334</span><a name="line.2334"></a>
-<span class="sourceLineNo">2335</span>    byte[] value = Bytes.toBytes("value");<a name="line.2335"></a>
-<span class="sourceLineNo">2336</span><a name="line.2336"></a>
-<span class="sourceLineNo">2337</span>    Delete delete = new Delete(rowA);<a name="line.2337"></a>
-<span class="sourceLineNo">2338</span>    delete.addFamily(fam1);<a name="line.2338"></a>
-<span class="sourceLineNo">2339</span><a name="line.2339"></a>
-<span class="sourceLineNo">2340</span>    region.delete(delete);<a name="line.2340"></a>
-<span class="sourceLineNo">2341</span><a name="line.2341"></a>
-<span class="sourceLineNo">2342</span>    // now create data.<a name="line.2342"></a>
-<span class="sourceLineNo">2343</span>    Put put = new Put(rowA);<a name="line.2343"></a>
-<span class="sourceLineNo">2344</span>    put.addColumn(fam2, null, value);<a name="line.2344"></a>
-<span class="sourceLineNo">2345</span>    region.put(put);<a name="line.2345"></a>
-<span class="sourceLineNo">2346</span><a name="line.2346"></a>
-<span class="sourceLineNo">2347</span>    put = new Put(rowB);<a name="line.2347"></a>
-<span class="sourceLineNo">2348</span>    put.addColumn(fam1, null, value);<a name="line.2348"></a>
-<span class="sourceLineNo">2349</span>    put.addColumn(fam2, null, value);<a name="line.2349"></a>
-<span class="sourceLineNo">2350</span>    region.put(put);<a name="line.2350"></a>
-<span class="sourceLineNo">2351</span><a name="line.2351"></a>
-<span class="sourceLineNo">2352</span>    Scan scan = new Scan();<a name="line.2352"></a>
-<span class="sourceLineNo">2353</span>    scan.addFamily(fam1).addFamily(fam2);<a name="line.2353"></a>
-<span class="sourceLineNo">2354</span>    InternalScanner s = region.getScanner(scan);<a name="line.2354"></a>
-<span class="sourceLineNo">2355</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.2355"></a>
-<span class="sourceLineNo">2356</span>    s.next(results);<a name="line.2356"></a>
-<span class="sourceLineNo">2357</span>    assertTrue(CellUtil.matchingRows(results.get(0), rowA));<a name="line.2357"></a>
-<span class="sourceLineNo">2358</span><a name="line.2358"></a>
-<span class="sourceLineNo">2359</span>    results.clear();<a name="line.2359"></a>
-<span class="sourceLineNo">2360</span>    s.next(results);<a name="line.2360"></a>
-<span class="sourceLineNo">2361</span>    assertTrue(CellUtil.matchingRows(results.get(0), rowB));<a name="line.2361"></a>
-<span class="sourceLineNo">2362</span>  }<a name="line.2362"></a>
-<span class="sourceLineNo">2363</span><a name="line.2363"></a>
-<span class="sourceLineNo">2364</span>  @Test<a name="line.2364"></a>
-<span class="sourceLineNo">2365</span>  public void testDataInMemoryWithoutWAL() throws IOException {<a name="line.2365"></a>
-<span class="sourceLineNo">2366</span>    FileSystem fs = FileSystem.get(CONF);<a name="line.2366"></a>
-<span class="sourceLineNo">2367</span>    Path rootDir = new Path(dir + "testDataInMemoryWithoutWAL");<a name="line.2367"></a>
-<span class="sourceLineNo">2368</span>    FSHLog hLog = new FSHLog(fs, rootDir, "testDataInMemoryWithoutWAL", CONF);<a name="line.2368"></a>
-<span class="sourceLineNo">2369</span>    hLog.init();<a name="line.2369"></a>
-<span class="sourceLineNo">2370</span>    // This chunk creation is done throughout the code base. Do we want to move it into core?<a name="line.2370"></a>
-<span class="sourceLineNo">2371</span>    // It is missing from this test. W/o it we NPE.<a name="line.2371"></a>
-<span class="sourceLineNo">2372</span>    ChunkCreator.initialize(MemStoreLABImpl.CHUNK_SIZE_DEFAULT, false, 0, 0, 0, null);<a name="line.2372"></a>
-<span class="sourceLineNo">2373</span>    region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, hLog,<a name="line.2373"></a>
-<span class="sourceLineNo">2374</span>        COLUMN_FAMILY_BYTES);<a name="line.2374"></a>
-<span class="sourceLineNo">2375</span><a name="line.2375"></a>
-<span class="sourceLineNo">2376</span>    Cell originalCell = CellUtil.createCell(row, COLUMN_FAMILY_BYTES, qual1,<a name="line.2376"></a>
-<span class="sourceLineNo">2377</span>      System.currentTimeMillis(), KeyValue.Type.Put.getCode(), value1);<a name="line.2377"></a>
-<span class="sourceLineNo">2378</span>    final long originalSize = originalCell.getSerializedSize();<a name="line.2378"></a>
-<span class="sourceLineNo">2379</span><a name="line.2379"></a>
-<span class="sourceLineNo">2380</span>    Cell addCell = CellUtil.createCell(row, COLUMN_FAMILY_BYTES, qual1,<a name="line.2380"></a>
-<span class="sourceLineNo">2381</span>      System.currentTimeMillis(), KeyValue.Type.Put.getCode(), Bytes.toBytes("xxxxxxxxxx"));<a name="line.2381"></a>
-<span class="sourceLineNo">2382</span>    final long addSize = addCell.getSerializedSize();<a name="line.2382"></a>
-<span class="sourceLineNo">2383</span><a name="line.2383"></a>
-<span class="sourceLineNo">2384</span>    LOG.info("originalSize:" + originalSize<a name="line.2384"></a>
-<span class="sourceLineNo">2385</span>      + ", addSize:" + addSize);<a name="line.2385"></a>
-<span class="sourceLineNo">2386</span>    // start test. We expect that the addPut's durability will be replaced<a name="line.2386"></a>
-<span class="sourceLineNo">2387</span>    // by originalPut's durability.<a name="line.2387"></a>
-<span class="sourceLineNo">2388</span><a name="line.2388"></a>
-<span class="sourceLineNo">2389</span>    // case 1:<a name="line.2389"></a>
-<span class="sourceLineNo">2390</span>    testDataInMemoryWithoutWAL(region,<a name="line.2390"></a>
-<span class="sourceLineNo">2391</span>            new Put(row).add(originalCell).setDurability(Durability.SKIP_WAL),<a name="line.2391"></a>
-<span class="sourceLineNo">2392</span>            new Put(row).add(addCell).setDurability(Durability.SKIP_WAL),<a name="line.2392"></a>
-<span class="sourceLineNo">2393</span>            originalSize + addSize);<a name="line.2393"></a>
-<span class="sourceLineNo">2394</span><a name="line.2394"></a>
-<span class="sourceLineNo">2395</span>    // case 2:<a name="line.2395"></a>
-<span class="sourceLineNo">2396</span>    testDataInMemoryWithoutWAL(region,<a name="line.2396"></a>
-<span class="sourceLineNo">2397</span>            new Put(row).add(originalCell).setDurability(Durability.SKIP_WAL),<a name="line.2397"></a>
-<span class="sourceLineNo">2398</span>            new Put(row).add(addCell).setDurability(Durability.SYNC_WAL),<a name="line.2398"></a>
-<span class="sourceLineNo">2399</span>            originalSize + addSize);<a name="line.2399"></a>
-<span class="sourceLineNo">2400</span><a name="line.2400"></a>
-<span class="sourceLineNo">2401</span>    // case 3:<a name="line.2401"></a>
-<span class="sourceLineNo">2402</span>    testDataInMemoryWithoutWAL(region,<a name="line.2402"></a>
-<span class="sourceLineNo">2403</span>            new Put(row).add(originalCell).setDurability(Durability.SYNC_WAL),<a name="line.2403"></a>
-<span class="sourceLineNo">2404</span>            new Put(row).add(addCell).setDurability(Durability.SKIP_WAL),<a name="line.2404"></a>
-<span class="sourceLineNo">2405</span>            0);<a name="line.2405"></a>
-<span class="sourceLineNo">2406</span><a name="line.2406"></a>
-<span class="sourceLineNo">2407</span>    // case 4:<a name="line.2407"></a>
-<span class="sourceLineNo">2408</span>    testDataInMemoryWithoutWAL(region,<a name="line.2408"></a>
-<span class="sourceLineNo">2409</span>            new Put(row).add(originalCell).setDurability(Durability.SYNC_WAL),<a name="line.2409"></a>
-<span class="sourceLineNo">2410</span>            new Put(row).add(addCell).setDurability(Durability.SYNC_WAL),<a name="line.2410"></a>
-<span class="sourceLineNo">2411</span>            0);<a name="line.2411"></a>
-<span class="sourceLineNo">2412</span>  }<a name="line.2412"></a>
-<span class="sourceLineNo">2413</span><a name="line.2413"></a>
-<span class="sourceLineNo">2414</span>  private static void testDataInMemoryWithoutWAL(HRegion region, Put originalPut,<a name="line.2414"></a>
-<span class="sourceLineNo">2415</span>          final Put addPut, long delta) throws IOException {<a name="line.2415"></a>
-<span class="sourceLineNo">2416</span>    final long initSize = region.getDataInMemoryWithoutWAL();<a name="line.2416"></a>
-<span class="sourceLineNo">2417</span>    // save normalCPHost and replaced by mockedCPHost<a name="line.2417"></a>
-<span class="sourceLineNo">2418</span>    RegionCoprocessorHost normalCPHost = region.getCoprocessorHost();<a name="line.2418"></a>
-<span class="sourceLineNo">2419</span>    RegionCoprocessorHost mockedCPHost = Mockito.mock(RegionCoprocessorHost.class);<a name="line.2419"></a>
-<span class="sourceLineNo">2420</span>    // Because the preBatchMutate returns void, we can't do usual Mockito when...then form. Must<a name="line.2420"></a>
-<span class="sourceLineNo">2421</span>    // do below format (from Mockito doc).<a name="line.2421"></a>
-<span class="sourceLineNo">2422</span>    Mockito.doAnswer(new Answer&lt;Void&gt;() {<a name="line.2422"></a>
-<span class="sourceLineNo">2423</span>      @Override<a name="line.2423"></a>
-<span class="sourceLineNo">2424</span>      public Void answer(InvocationOnMock invocation) throws Throwable {<a name="line.2424"></a>
-<span class="sourceLineNo">2425</span>        MiniBatchOperationInProgress&lt;Mutation&gt; mb = invocation.getArgument(0);<a name="line.2425"></a>
-<span class="sourceLineNo">2426</span>        mb.addOperationsFromCP(0, new Mutation[]{addPut});<a name="line.2426"></a>
-<span class="sourceLineNo">2427</span>        return null;<a name="line.2427"></a>
-<span class="sourceLineNo">2428</span>      }<a name="line.2428"></a>
-<span class="sourceLineNo">2429</span>    }).when(mockedCPHost).preBatchMutate(Mockito.isA(MiniBatchOperationInProgress.class));<a name="line.2429"></a>
-<span class="sourceLineNo">2430</span>    region.setCoprocessorHost(mockedCPHost);<a name="line.2430"></a>
-<span class="sourceLineNo">2431</span>    region.put(originalPut);<a name="line.2431"></a>
-<span class="sourceLineNo">2432</span>    region.setCoprocessorHost(normalCPHost);<a name="line.2432"></a>
-<span class="sourceLineNo">2433</span>    final long finalSize = region.getDataInMemoryWithoutWAL();<a name="line.2433"></a>
-<span class="sourceLineNo">2434</span>    assertEquals("finalSize:" + finalSize + ", initSize:"<a name="line.2434"></a>
-<span class="sourceLineNo">2435</span>      + initSize + ", delta:" + delta,finalSize, initSize + delta);<a name="line.2435"></a>
-<span class="sourceLineNo">2436</span>  }<a name="line.2436"></a>
-<span class="sourceLineNo">2437</span><a name="line.2437"></a>
-<span class="sourceLineNo">2438</span>  @Test<a name="line.2438"></a>
-<span class="sourceLineNo">2439</span>  public void testDeleteColumns_PostInsert() throws IOException, InterruptedException {<a name="line.2439"></a>
-<span class="sourceLineNo">2440</span>    Delete delete = new Delete(row);<a name="line.2440"></a>
-<span class="sourceLineNo">2441</span>    delete.addColumns(fam1, qual1);<a name="line.2441"></a>
-<span class="sourceLineNo">2442</span>    doTestDelete_AndPostInsert(delete);<a name="line.2442"></a>
-<span class="sourceLineNo">2443</span>  }<a name="line.2443"></a>
-<span class="sourceLineNo">2444</span><a name="line.2444"></a>
-<span class="sourceLineNo">2445</span>  @Test<a name="line.2445"></a>
-<span class="sourceLineNo">2446</span>  public void testaddFamily_PostInsert() throws IOException, InterruptedException {<a name="line.2446"></a>
-<span class="sourceLineNo">2447</span>    Delete delete = new Delete(row);<a name="line.2447"></a>
-<span class="sourceLineNo">2448</span>    delete.addFamily(fam1);<a name="line.2448"></a>
-<span class="sourceLineNo">2449</span>    doTestDelete_AndPostInsert(delete);<a name="line.2449"></a>
-<span class="sourceLineNo">2450</span>  }<a name="line.2450"></a>
-<span class="sourceLineNo">2451</span><a name="line.2451"></a>
-<span class="sourceLineNo">2452</span>  public void doTestDelete_AndPostInsert(Delete delete) throws IOException, InterruptedException {<a name="line.2452"></a>
-<span class="sourceLineNo">2453</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2453"></a>
-<span class="sourceLineNo">2454</span>    EnvironmentEdgeManagerTestHelper.injectEdge(new IncrementingEnvironmentEdge());<a name="line.2454"></a>
-<span class="sourceLineNo">2455</span>    Put put = new Put(row);<a name="line.2455"></a>
-<span class="sourceLineNo">2456</span>    put.addColumn(fam1, qual1, value1);<a name="line.2456"></a>
-<span class="sourceLineNo">2457</span>    region.put(put);<a name="line.2457"></a>
-<span class="sourceLineNo">2458</span><a name="line.2458"></a>
-<span class="sourceLineNo">2459</span>    // now delete the value:<a name="line.2459"></a>
-<span class="sourceLineNo">2460</span>    region.delete(delete);<a name="line.2460"></a>
+<span class="sourceLineNo">2120</span>    delete.addColumn(fam1, qual);<a name="line.2120"></a>
+<span class="sourceLineNo">2121</span>    region.delete(delete);<a name="line.2121"></a>
+<span class="sourceLineNo">2122</span><a name="line.2122"></a>
+<span class="sourceLineNo">2123</span>    Get get = new Get(row1);<a name="line.2123"></a>
+<span class="sourceLineNo">2124</span>    get.addFamily(fam1);<a name="line.2124"></a>
+<span class="sourceLineNo">2125</span>    Result r = region.get(get);<a name="line.2125"></a>
+<span class="sourceLineNo">2126</span>    assertEquals(0, r.size());<a name="line.2126"></a>
+<span class="sourceLineNo">2127</span>  }<a name="line.2127"></a>
+<span class="sourceLineNo">2128</span><a name="line.2128"></a>
+<span class="sourceLineNo">2129</span>  @Test<a name="line.2129"></a>
+<span class="sourceLineNo">2130</span>  public void testDelete_CheckFamily() throws IOException {<a name="line.2130"></a>
+<span class="sourceLineNo">2131</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2131"></a>
+<span class="sourceLineNo">2132</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2132"></a>
+<span class="sourceLineNo">2133</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2133"></a>
+<span class="sourceLineNo">2134</span>    byte[] fam3 = Bytes.toBytes("fam3");<a name="line.2134"></a>
+<span class="sourceLineNo">2135</span>    byte[] fam4 = Bytes.toBytes("fam4");<a name="line.2135"></a>
+<span class="sourceLineNo">2136</span><a name="line.2136"></a>
+<span class="sourceLineNo">2137</span>    // Setting up region<a name="line.2137"></a>
+<span class="sourceLineNo">2138</span>    this.region = initHRegion(tableName, method, CONF, fam1, fam2, fam3);<a name="line.2138"></a>
+<span class="sourceLineNo">2139</span>    List&lt;Cell&gt; kvs = new ArrayList&lt;&gt;();<a name="line.2139"></a>
+<span class="sourceLineNo">2140</span>    kvs.add(new KeyValue(row1, fam4, null, null));<a name="line.2140"></a>
+<span class="sourceLineNo">2141</span><a name="line.2141"></a>
+<span class="sourceLineNo">2142</span>    // testing existing family<a name="line.2142"></a>
+<span class="sourceLineNo">2143</span>    byte[] family = fam2;<a name="line.2143"></a>
+<span class="sourceLineNo">2144</span>    NavigableMap&lt;byte[], List&lt;Cell&gt;&gt; deleteMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2144"></a>
+<span class="sourceLineNo">2145</span>    deleteMap.put(family, kvs);<a name="line.2145"></a>
+<span class="sourceLineNo">2146</span>    region.delete(deleteMap, Durability.SYNC_WAL);<a name="line.2146"></a>
+<span class="sourceLineNo">2147</span><a name="line.2147"></a>
+<span class="sourceLineNo">2148</span>    // testing non existing family<a name="line.2148"></a>
+<span class="sourceLineNo">2149</span>    boolean ok = false;<a name="line.2149"></a>
+<span class="sourceLineNo">2150</span>    family = fam4;<a name="line.2150"></a>
+<span class="sourceLineNo">2151</span>    try {<a name="line.2151"></a>
+<span class="sourceLineNo">2152</span>      deleteMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2152"></a>
+<span class="sourceLineNo">2153</span>      deleteMap.put(family, kvs);<a name="line.2153"></a>
+<span class="sourceLineNo">2154</span>      region.delete(deleteMap, Durability.SYNC_WAL);<a name="line.2154"></a>
+<span class="sourceLineNo">2155</span>    } catch (Exception e) {<a name="line.2155"></a>
+<span class="sourceLineNo">2156</span>      ok = true;<a name="line.2156"></a>
+<span class="sourceLineNo">2157</span>    }<a name="line.2157"></a>
+<span class="sourceLineNo">2158</span>    assertTrue("Family " + new String(family, StandardCharsets.UTF_8) + " does exist", ok);<a name="line.2158"></a>
+<span class="sourceLineNo">2159</span>  }<a name="line.2159"></a>
+<span class="sourceLineNo">2160</span><a name="line.2160"></a>
+<span class="sourceLineNo">2161</span>  @Test<a name="line.2161"></a>
+<span class="sourceLineNo">2162</span>  public void testDelete_mixed() throws IOException, InterruptedException {<a name="line.2162"></a>
+<span class="sourceLineNo">2163</span>    byte[] fam = Bytes.toBytes("info");<a name="line.2163"></a>
+<span class="sourceLineNo">2164</span>    byte[][] families = { fam };<a name="line.2164"></a>
+<span class="sourceLineNo">2165</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2165"></a>
+<span class="sourceLineNo">2166</span>    EnvironmentEdgeManagerTestHelper.injectEdge(new IncrementingEnvironmentEdge());<a name="line.2166"></a>
+<span class="sourceLineNo">2167</span><a name="line.2167"></a>
+<span class="sourceLineNo">2168</span>    byte[] row = Bytes.toBytes("table_name");<a name="line.2168"></a>
+<span class="sourceLineNo">2169</span>    // column names<a name="line.2169"></a>
+<span class="sourceLineNo">2170</span>    byte[] serverinfo = Bytes.toBytes("serverinfo");<a name="line.2170"></a>
+<span class="sourceLineNo">2171</span>    byte[] splitA = Bytes.toBytes("splitA");<a name="line.2171"></a>
+<span class="sourceLineNo">2172</span>    byte[] splitB = Bytes.toBytes("splitB");<a name="line.2172"></a>
+<span class="sourceLineNo">2173</span><a name="line.2173"></a>
+<span class="sourceLineNo">2174</span>    // add some data:<a name="line.2174"></a>
+<span class="sourceLineNo">2175</span>    Put put = new Put(row);<a name="line.2175"></a>
+<span class="sourceLineNo">2176</span>    put.addColumn(fam, splitA, Bytes.toBytes("reference_A"));<a name="line.2176"></a>
+<span class="sourceLineNo">2177</span>    region.put(put);<a name="line.2177"></a>
+<span class="sourceLineNo">2178</span><a name="line.2178"></a>
+<span class="sourceLineNo">2179</span>    put = new Put(row);<a name="line.2179"></a>
+<span class="sourceLineNo">2180</span>    put.addColumn(fam, splitB, Bytes.toBytes("reference_B"));<a name="line.2180"></a>
+<span class="sourceLineNo">2181</span>    region.put(put);<a name="line.2181"></a>
+<span class="sourceLineNo">2182</span><a name="line.2182"></a>
+<span class="sourceLineNo">2183</span>    put = new Put(row);<a name="line.2183"></a>
+<span class="sourceLineNo">2184</span>    put.addColumn(fam, serverinfo, Bytes.toBytes("ip_address"));<a name="line.2184"></a>
+<span class="sourceLineNo">2185</span>    region.put(put);<a name="line.2185"></a>
+<span class="sourceLineNo">2186</span><a name="line.2186"></a>
+<span class="sourceLineNo">2187</span>    // ok now delete a split:<a name="line.2187"></a>
+<span class="sourceLineNo">2188</span>    Delete delete = new Delete(row);<a name="line.2188"></a>
+<span class="sourceLineNo">2189</span>    delete.addColumns(fam, splitA);<a name="line.2189"></a>
+<span class="sourceLineNo">2190</span>    region.delete(delete);<a name="line.2190"></a>
+<span class="sourceLineNo">2191</span><a name="line.2191"></a>
+<span class="sourceLineNo">2192</span>    // assert some things:<a name="line.2192"></a>
+<span class="sourceLineNo">2193</span>    Get get = new Get(row).addColumn(fam, serverinfo);<a name="line.2193"></a>
+<span class="sourceLineNo">2194</span>    Result result = region.get(get);<a name="line.2194"></a>
+<span class="sourceLineNo">2195</span>    assertEquals(1, result.size());<a name="line.2195"></a>
+<span class="sourceLineNo">2196</span><a name="line.2196"></a>
+<span class="sourceLineNo">2197</span>    get = new Get(row).addColumn(fam, splitA);<a name="line.2197"></a>
+<span class="sourceLineNo">2198</span>    result = region.get(get);<a name="line.2198"></a>
+<span class="sourceLineNo">2199</span>    assertEquals(0, result.size());<a name="line.2199"></a>
+<span class="sourceLineNo">2200</span><a name="line.2200"></a>
+<span class="sourceLineNo">2201</span>    get = new Get(row).addColumn(fam, splitB);<a name="line.2201"></a>
+<span class="sourceLineNo">2202</span>    result = region.get(get);<a name="line.2202"></a>
+<span class="sourceLineNo">2203</span>    assertEquals(1, result.size());<a name="line.2203"></a>
+<span class="sourceLineNo">2204</span><a name="line.2204"></a>
+<span class="sourceLineNo">2205</span>    // Assert that after a delete, I can put.<a name="line.2205"></a>
+<span class="sourceLineNo">2206</span>    put = new Put(row);<a name="line.2206"></a>
+<span class="sourceLineNo">2207</span>    put.addColumn(fam, splitA, Bytes.toBytes("reference_A"));<a name="line.2207"></a>
+<span class="sourceLineNo">2208</span>    region.put(put);<a name="line.2208"></a>
+<span class="sourceLineNo">2209</span>    get = new Get(row);<a name="line.2209"></a>
+<span class="sourceLineNo">2210</span>    result = region.get(get);<a name="line.2210"></a>
+<span class="sourceLineNo">2211</span>    assertEquals(3, result.size());<a name="line.2211"></a>
+<span class="sourceLineNo">2212</span><a name="line.2212"></a>
+<span class="sourceLineNo">2213</span>    // Now delete all... then test I can add stuff back<a name="line.2213"></a>
+<span class="sourceLineNo">2214</span>    delete = new Delete(row);<a name="line.2214"></a>
+<span class="sourceLineNo">2215</span>    region.delete(delete);<a name="line.2215"></a>
+<span class="sourceLineNo">2216</span>    assertEquals(0, region.get(get).size());<a name="line.2216"></a>
+<span class="sourceLineNo">2217</span><a name="line.2217"></a>
+<span class="sourceLineNo">2218</span>    region.put(new Put(row).addColumn(fam, splitA, Bytes.toBytes("reference_A")));<a name="line.2218"></a>
+<span class="sourceLineNo">2219</span>    result = region.get(get);<a name="line.2219"></a>
+<span class="sourceLineNo">2220</span>    assertEquals(1, result.size());<a name="line.2220"></a>
+<span class="sourceLineNo">2221</span>  }<a name="line.2221"></a>
+<span class="sourceLineNo">2222</span><a name="line.2222"></a>
+<span class="sourceLineNo">2223</span>  @Test<a name="line.2223"></a>
+<span class="sourceLineNo">2224</span>  public void testDeleteRowWithFutureTs() throws IOException {<a name="line.2224"></a>
+<span class="sourceLineNo">2225</span>    byte[] fam = Bytes.toBytes("info");<a name="line.2225"></a>
+<span class="sourceLineNo">2226</span>    byte[][] families = { fam };<a name="line.2226"></a>
+<span class="sourceLineNo">2227</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2227"></a>
+<span class="sourceLineNo">2228</span>    byte[] row = Bytes.toBytes("table_name");<a name="line.2228"></a>
+<span class="sourceLineNo">2229</span>    // column names<a name="line.2229"></a>
+<span class="sourceLineNo">2230</span>    byte[] serverinfo = Bytes.toBytes("serverinfo");<a name="line.2230"></a>
+<span class="sourceLineNo">2231</span><a name="line.2231"></a>
+<span class="sourceLineNo">2232</span>    // add data in the far future<a name="line.2232"></a>
+<span class="sourceLineNo">2233</span>    Put put = new Put(row);<a name="line.2233"></a>
+<span class="sourceLineNo">2234</span>    put.addColumn(fam, serverinfo, HConstants.LATEST_TIMESTAMP - 5, Bytes.toBytes("value"));<a name="line.2234"></a>
+<span class="sourceLineNo">2235</span>    region.put(put);<a name="line.2235"></a>
+<span class="sourceLineNo">2236</span><a name="line.2236"></a>
+<span class="sourceLineNo">2237</span>    // now delete something in the present<a name="line.2237"></a>
+<span class="sourceLineNo">2238</span>    Delete delete = new Delete(row);<a name="line.2238"></a>
+<span class="sourceLineNo">2239</span>    region.delete(delete);<a name="line.2239"></a>
+<span class="sourceLineNo">2240</span><a name="line.2240"></a>
+<span class="sourceLineNo">2241</span>    // make sure we still see our data<a name="line.2241"></a>
+<span class="sourceLineNo">2242</span>    Get get = new Get(row).addColumn(fam, serverinfo);<a name="line.2242"></a>
+<span class="sourceLineNo">2243</span>    Result result = region.get(get);<a name="line.2243"></a>
+<span class="sourceLineNo">2244</span>    assertEquals(1, result.size());<a name="line.2244"></a>
+<span class="sourceLineNo">2245</span><a name="line.2245"></a>
+<span class="sourceLineNo">2246</span>    // delete the future row<a name="line.2246"></a>
+<span class="sourceLineNo">2247</span>    delete = new Delete(row, HConstants.LATEST_TIMESTAMP - 3);<a name="line.2247"></a>
+<span class="sourceLineNo">2248</span>    region.delete(delete);<a name="line.2248"></a>
+<span class="sourceLineNo">2249</span><a name="line.2249"></a>
+<span class="sourceLineNo">2250</span>    // make sure it is gone<a name="line.2250"></a>
+<span class="sourceLineNo">2251</span>    get = new Get(row).addColumn(fam, serverinfo);<a name="line.2251"></a>
+<span class="sourceLineNo">2252</span>    result = region.get(get);<a name="line.2252"></a>
+<span class="sourceLineNo">2253</span>    assertEquals(0, result.size());<a name="line.2253"></a>
+<span class="sourceLineNo">2254</span>  }<a name="line.2254"></a>
+<span class="sourceLineNo">2255</span><a name="line.2255"></a>
+<span class="sourceLineNo">2256</span>  /**<a name="line.2256"></a>
+<span class="sourceLineNo">2257</span>   * Tests that the special LATEST_TIMESTAMP option for puts gets replaced by<a name="line.2257"></a>
+<span class="sourceLineNo">2258</span>   * the actual timestamp<a name="line.2258"></a>
+<span class="sourceLineNo">2259</span>   */<a name="line.2259"></a>
+<span class="sourceLineNo">2260</span>  @Test<a name="line.2260"></a>
+<span class="sourceLineNo">2261</span>  public void testPutWithLatestTS() throws IOException {<a name="line.2261"></a>
+<span class="sourceLineNo">2262</span>    byte[] fam = Bytes.toBytes("info");<a name="line.2262"></a>
+<span class="sourceLineNo">2263</span>    byte[][] families = { fam };<a name="line.2263"></a>
+<span class="sourceLineNo">2264</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2264"></a>
+<span class="sourceLineNo">2265</span>    byte[] row = Bytes.toBytes("row1");<a name="line.2265"></a>
+<span class="sourceLineNo">2266</span>    // column names<a name="line.2266"></a>
+<span class="sourceLineNo">2267</span>    byte[] qual = Bytes.toBytes("qual");<a name="line.2267"></a>
+<span class="sourceLineNo">2268</span><a name="line.2268"></a>
+<span class="sourceLineNo">2269</span>    // add data with LATEST_TIMESTAMP, put without WAL<a name="line.2269"></a>
+<span class="sourceLineNo">2270</span>    Put put = new Put(row);<a name="line.2270"></a>
+<span class="sourceLineNo">2271</span>    put.addColumn(fam, qual, HConstants.LATEST_TIMESTAMP, Bytes.toBytes("value"));<a name="line.2271"></a>
+<span class="sourceLineNo">2272</span>    region.put(put);<a name="line.2272"></a>
+<span class="sourceLineNo">2273</span><a name="line.2273"></a>
+<span class="sourceLineNo">2274</span>    // Make sure it shows up with an actual timestamp<a name="line.2274"></a>
+<span class="sourceLineNo">2275</span>    Get get = new Get(row).addColumn(fam, qual);<a name="line.2275"></a>
+<span class="sourceLineNo">2276</span>    Result result = region.get(get);<a name="line.2276"></a>
+<span class="sourceLineNo">2277</span>    assertEquals(1, result.size());<a name="line.2277"></a>
+<span class="sourceLineNo">2278</span>    Cell kv = result.rawCells()[0];<a name="line.2278"></a>
+<span class="sourceLineNo">2279</span>    LOG.info("Got: " + kv);<a name="line.2279"></a>
+<span class="sourceLineNo">2280</span>    assertTrue("LATEST_TIMESTAMP was not replaced with real timestamp",<a name="line.2280"></a>
+<span class="sourceLineNo">2281</span>        kv.getTimestamp() != HConstants.LATEST_TIMESTAMP);<a name="line.2281"></a>
+<span class="sourceLineNo">2282</span><a name="line.2282"></a>
+<span class="sourceLineNo">2283</span>    // Check same with WAL enabled (historically these took different<a name="line.2283"></a>
+<span class="sourceLineNo">2284</span>    // code paths, so check both)<a name="line.2284"></a>
+<span class="sourceLineNo">2285</span>    row = Bytes.toBytes("row2");<a name="line.2285"></a>
+<span class="sourceLineNo">2286</span>    put = new Put(row);<a name="line.2286"></a>
+<span class="sourceLineNo">2287</span>    put.addColumn(fam, qual, HConstants.LATEST_TIMESTAMP, Bytes.toBytes("value"));<a name="line.2287"></a>
+<span class="sourceLineNo">2288</span>    region.put(put);<a name="line.2288"></a>
+<span class="sourceLineNo">2289</span><a name="line.2289"></a>
+<span class="sourceLineNo">2290</span>    // Make sure it shows up with an actual timestamp<a name="line.2290"></a>
+<span class="sourceLineNo">2291</span>    get = new Get(row).addColumn(fam, qual);<a name="line.2291"></a>
+<span class="sourceLineNo">2292</span>    result = region.get(get);<a name="line.2292"></a>
+<span class="sourceLineNo">2293</span>    assertEquals(1, result.size());<a name="line.2293"></a>
+<span class="sourceLineNo">2294</span>    kv = result.rawCells()[0];<a name="line.2294"></a>
+<span class="sourceLineNo">2295</span>    LOG.info("Got: " + kv);<a name="line.2295"></a>
+<span class="sourceLineNo">2296</span>    assertTrue("LATEST_TIMESTAMP was not replaced with real timestamp",<a name="line.2296"></a>
+<span class="sourceLineNo">2297</span>        kv.getTimestamp() != HConstants.LATEST_TIMESTAMP);<a name="line.2297"></a>
+<span class="sourceLineNo">2298</span>  }<a name="line.2298"></a>
+<span class="sourceLineNo">2299</span><a name="line.2299"></a>
+<span class="sourceLineNo">2300</span>  /**<a name="line.2300"></a>
+<span class="sourceLineNo">2301</span>   * Tests that there is server-side filtering for invalid timestamp upper<a name="line.2301"></a>
+<span class="sourceLineNo">2302</span>   * bound. Note that the timestamp lower bound is automatically handled for us<a name="line.2302"></a>
+<span class="sourceLineNo">2303</span>   * by the TTL field.<a name="line.2303"></a>
+<span class="sourceLineNo">2304</span>   */<a name="line.2304"></a>
+<span class="sourceLineNo">2305</span>  @Test<a name="line.2305"></a>
+<span class="sourceLineNo">2306</span>  public void testPutWithTsSlop() throws IOException {<a name="line.2306"></a>
+<span class="sourceLineNo">2307</span>    byte[] fam = Bytes.toBytes("info");<a name="line.2307"></a>
+<span class="sourceLineNo">2308</span>    byte[][] families = { fam };<a name="line.2308"></a>
+<span class="sourceLineNo">2309</span><a name="line.2309"></a>
+<span class="sourceLineNo">2310</span>    // add data with a timestamp that is too recent for range. Ensure assert<a name="line.2310"></a>
+<span class="sourceLineNo">2311</span>    CONF.setInt("hbase.hregion.keyvalue.timestamp.slop.millisecs", 1000);<a name="line.2311"></a>
+<span class="sourceLineNo">2312</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2312"></a>
+<span class="sourceLineNo">2313</span>    boolean caughtExcep = false;<a name="line.2313"></a>
+<span class="sourceLineNo">2314</span>    try {<a name="line.2314"></a>
+<span class="sourceLineNo">2315</span>      // no TS specified == use latest. should not error<a name="line.2315"></a>
+<span class="sourceLineNo">2316</span>      region.put(new Put(row).addColumn(fam, Bytes.toBytes("qual"), Bytes.toBytes("value")));<a name="line.2316"></a>
+<span class="sourceLineNo">2317</span>      // TS out of range. should error<a name="line.2317"></a>
+<span class="sourceLineNo">2318</span>      region.put(new Put(row).addColumn(fam, Bytes.toBytes("qual"),<a name="line.2318"></a>
+<span class="sourceLineNo">2319</span>          System.currentTimeMillis() + 2000, Bytes.toBytes("value")));<a name="line.2319"></a>
+<span class="sourceLineNo">2320</span>      fail("Expected IOE for TS out of configured timerange");<a name="line.2320"></a>
+<span class="sourceLineNo">2321</span>    } catch (FailedSanityCheckException ioe) {<a name="line.2321"></a>
+<span class="sourceLineNo">2322</span>      LOG.debug("Received expected exception", ioe);<a name="line.2322"></a>
+<span class="sourceLineNo">2323</span>      caughtExcep = true;<a name="line.2323"></a>
+<span class="sourceLineNo">2324</span>    }<a name="line.2324"></a>
+<span class="sourceLineNo">2325</span>    assertTrue("Should catch FailedSanityCheckException", caughtExcep);<a name="line.2325"></a>
+<span class="sourceLineNo">2326</span>  }<a name="line.2326"></a>
+<span class="sourceLineNo">2327</span><a name="line.2327"></a>
+<span class="sourceLineNo">2328</span>  @Test<a name="line.2328"></a>
+<span class="sourceLineNo">2329</span>  public void testScanner_DeleteOneFamilyNotAnother() throws IOException {<a name="line.2329"></a>
+<span class="sourceLineNo">2330</span>    byte[] fam1 = Bytes.toBytes("columnA");<a name="line.2330"></a>
+<span class="sourceLineNo">2331</span>    byte[] fam2 = Bytes.toBytes("columnB");<a name="line.2331"></a>
+<span class="sourceLineNo">2332</span>    this.region = initHRegion(tableName, method, CONF, fam1, fam2);<a name="line.2332"></a>
+<span class="sourceLineNo">2333</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.2333"></a>
+<span class="sourceLineNo">2334</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.2334"></a>
+<span class="sourceLineNo">2335</span><a name="line.2335"></a>
+<span class="sourceLineNo">2336</span>    byte[] value = Bytes.toBytes("value");<a name="line.2336"></a>
+<span class="sourceLineNo">2337</span><a name="line.2337"></a>
+<span class="sourceLineNo">2338</span>    Delete delete = new Delete(rowA);<a name="line.2338"></a>
+<span class="sourceLineNo">2339</span>    delete.addFamily(fam1);<a name="line.2339"></a>
+<span class="sourceLineNo">2340</span><a name="line.2340"></a>
+<span class="sourceLineNo">2341</span>    region.delete(delete);<a name="line.2341"></a>
+<span class="sourceLineNo">2342</span><a name="line.2342"></a>
+<span class="sourceLineNo">2343</span>    // now create data.<a name="line.2343"></a>
+<span class="sourceLineNo">2344</span>    Put put = new Put(rowA);<a name="line.2344"></a>
+<span class="sourceLineNo">2345</span>    put.addColumn(fam2, null, value);<a name="line.2345"></a>
+<span class="sourceLineNo">2346</span>    region.put(put);<a name="line.2346"></a>
+<span class="sourceLineNo">2347</span><a name="line.2347"></a>
+<span class="sourceLineNo">2348</span>    put = new Put(rowB);<a name="line.2348"></a>
+<span class="sourceLineNo">2349</span>    put.addColumn(fam1, null, value);<a name="line.2349"></a>
+<span class="sourceLineNo">2350</span>    put.addColumn(fam2, null, value);<a name="line.2350"></a>
+<span class="sourceLineNo">2351</span>    region.put(put);<a name="line.2351"></a>
+<span class="sourceLineNo">2352</span><a name="line.2352"></a>
+<span class="sourceLineNo">2353</span>    Scan scan = new Scan();<a name="line.2353"></a>
+<span class="sourceLineNo">2354</span>    scan.addFamily(fam1).addFamily(fam2);<a name="line.2354"></a>
+<span class="sourceLineNo">2355</span>    InternalScanner s = region.getScanner(scan);<a name="line.2355"></a>
+<span class="sourceLineNo">2356</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.2356"></a>
+<span class="sourceLineNo">2357</span>    s.next(results);<a name="line.2357"></a>
+<span class="sourceLineNo">2358</span>    assertTrue(CellUtil.matchingRows(results.get(0), rowA));<a name="line.2358"></a>
+<span class="sourceLineNo">2359</span><a name="line.2359"></a>
+<span class="sourceLineNo">2360</span>    results.clear();<a name="line.2360"></a>
+<span class="sourceLineNo">2361</span>    s.next(results);<a name="line.2361"></a>
+<span class="sourceLineNo">2362</span>    assertTrue(CellUtil.matchingRows(results.get(0), rowB));<a name="line.2362"></a>
+<span class="sourceLineNo">2363</span>  }<a name="line.2363"></a>
+<span class="sourceLineNo">2364</span><a name="line.2364"></a>
+<span class="sourceLineNo">2365</span>  @Test<a name="line.2365"></a>
+<span class="sourceLineNo">2366</span>  public void testDataInMemoryWithoutWAL() throws IOException {<a name="line.2366"></a>
+<span class="sourceLineNo">2367</span>    FileSystem fs = FileSystem.get(CONF);<a name="line.2367"></a>
+<span class="sourceLineNo">2368</span>    Path rootDir = new Path(dir + "testDataInMemoryWithoutWAL");<a name="line.2368"></a>
+<span class="sourceLineNo">2369</span>    FSHLog hLog = new FSHLog(fs, rootDir, "testDataInMemoryWithoutWAL", CONF);<a name="line.2369"></a>
+<span class="sourceLineNo">2370</span>    hLog.init();<a name="line.2370"></a>
+<span class="sourceLineNo">2371</span>    // This chunk creation is done throughout the code base. Do we want to move it into core?<a name="line.2371"></a>
+<span class="sourceLineNo">2372</span>    // It is missing from this test. W/o it we NPE.<a name="line.2372"></a>
+<span class="sourceLineNo">2373</span>    ChunkCreator.initialize(MemStoreLABImpl.CHUNK_SIZE_DEFAULT, false, 0, 0, 0, null);<a name="line.2373"></a>
+<span class="sourceLineNo">2374</span>    region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, hLog,<a name="line.2374"></a>
+<span class="sourceLineNo">2375</span>        COLUMN_FAMILY_BYTES);<a name="line.2375"></a>
+<span class="sourceLineNo">2376</span><a name="line.2376"></a>
+<span class="sourceLineNo">2377</span>    Cell originalCell = CellUtil.createCell(row, COLUMN_FAMILY_BYTES, qual1,<a name="line.2377"></a>
+<span class="sourceLineNo">2378</span>      System.currentTimeMillis(), KeyValue.Type.Put.getCode(), value1);<a name="line.2378"></a>
+<span class="sourceLineNo">2379</span>    final long originalSize = originalCell.getSerializedSize();<a name="line.2379"></a>
+<span class="sourceLineNo">2380</span><a name="line.2380"></a>
+<span class="sourceLineNo">2381</span>    Cell addCell = CellUtil.createCell(row, COLUMN_FAMILY_BYTES, qual1,<a name="line.2381"></a>
+<span class="sourceLineNo">2382</span>      System.currentTimeMillis(), KeyValue.Type.Put.getCode(), Bytes.toBytes("xxxxxxxxxx"));<a name="line.2382"></a>
+<span class="sourceLineNo">2383</span>    final long addSize = addCell.getSerializedSize();<a name="line.2383"></a>
+<span class="sourceLineNo">2384</span><a name="line.2384"></a>
+<span class="sourceLineNo">2385</span>    LOG.info("originalSize:" + originalSize<a name="line.2385"></a>
+<span class="sourceLineNo">2386</span>      + ", addSize:" + addSize);<a name="line.2386"></a>
+<span class="sourceLineNo">2387</span>    // start test. We expect that the addPut's durability will be replaced<a name="line.2387"></a>
+<span class="sourceLineNo">2388</span>    // by originalPut's durability.<a name="line.2388"></a>
+<span class="sourceLineNo">2389</span><a name="line.2389"></a>
+<span class="sourceLineNo">2390</span>    // case 1:<a name="line.2390"></a>
+<span class="sourceLineNo">2391</span>    testDataInMemoryWithoutWAL(region,<a name="line.2391"></a>
+<span class="sourceLineNo">2392</span>            new Put(row).add(originalCell).setDurability(Durability.SKIP_WAL),<a name="line.2392"></a>
+<span class="sourceLineNo">2393</span>            new Put(row).add(addCell).setDurability(Durability.SKIP_WAL),<a name="line.2393"></a>
+<span class="sourceLineNo">2394</span>            originalSize + addSize);<a name="line.2394"></a>
+<span class="sourceLineNo">2395</span><a name="line.2395"></a>
+<span class="sourceLineNo">2396</span>    // case 2:<a name="line.2396"></a>
+<span class="sourceLineNo">2397</span>    testDataInMemoryWithoutWAL(region,<a name="line.2397"></a>
+<span class="sourceLineNo">2398</span>            new Put(row).add(originalCell).setDurability(Durability.SKIP_WAL),<a name="line.2398"></a>
+<span class="sourceLineNo">2399</span>            new Put(row).add(addCell).setDurability(Durability.SYNC_WAL),<a name="line.2399"></a>
+<span class="sourceLineNo">2400</span>            originalSize + addSize);<a name="line.2400"></a>
+<span class="sourceLineNo">2401</span><a name="line.2401"></a>
+<span class="sourceLineNo">2402</span>    // case 3:<a name="line.2402"></a>
+<span class="sourceLineNo">2403</span>    testDataInMemoryWithoutWAL(region,<a name="line.2403"></a>
+<span class="sourceLineNo">2404</span>            new Put(row).add(originalCell).setDurability(Durability.SYNC_WAL),<a name="line.2404"></a>
+<span class="sourceLineNo">2405</span>            new Put(row).add(addCell).setDurability(Durability.SKIP_WAL),<a name="line.2405"></a>
+<span class="sourceLineNo">2406</span>            0);<a name="line.2406"></a>
+<span class="sourceLineNo">2407</span><a name="line.2407"></a>
+<span class="sourceLineNo">2408</span>    // case 4:<a name="line.2408"></a>
+<span class="sourceLineNo">2409</span>    testDataInMemoryWithoutWAL(region,<a name="line.2409"></a>
+<span class="sourceLineNo">2410</span>            new Put(row).add(originalCell).setDurability(Durability.SYNC_WAL),<a name="line.2410"></a>
+<span class="sourceLineNo">2411</span>            new Put(row).add(addCell).setDurability(Durability.SYNC_WAL),<a name="line.2411"></a>
+<span class="sourceLineNo">2412</span>            0);<a name="line.2412"></a>
+<span class="sourceLineNo">2413</span>  }<a name="line.2413"></a>
+<span class="sourceLineNo">2414</span><a name="line.2414"></a>
+<span class="sourceLineNo">2415</span>  private static void testDataInMemoryWithoutWAL(HRegion region, Put originalPut,<a name="line.2415"></a>
+<span class="sourceLineNo">2416</span>          final Put addPut, long delta) throws IOException {<a name="line.2416"></a>
+<span class="sourceLineNo">2417</span>    final long initSize = region.getDataInMemoryWithoutWAL();<a name="line.2417"></a>
+<span class="sourceLineNo">2418</span>    // save normalCPHost and replaced by mockedCPHost<a name="line.2418"></a>
+<span class="sourceLineNo">2419</span>    RegionCoprocessorHost normalCPHost = region.getCoprocessorHost();<a name="line.2419"></a>
+<span class="sourceLineNo">2420</span>    RegionCoprocessorHost mockedCPHost = Mockito.mock(RegionCoprocessorHost.class);<a name="line.2420"></a>
+<span class="sourceLineNo">2421</span>    // Because the preBatchMutate returns void, we can't do usual Mockito when...then form. Must<a name="line.2421"></a>
+<span class="sourceLineNo">2422</span>    // do below format (from Mockito doc).<a name="line.2422"></a>
+<span class="sourceLineNo">2423</span>    Mockito.doAnswer(new Answer&lt;Void&gt;() {<a name="line.2423"></a>
+<span class="sourceLineNo">2424</span>      @Override<a name="line.2424"></a>
+<span class="sourceLineNo">2425</span>      public Void answer(InvocationOnMock invocation) throws Throwable {<a name="line.2425"></a>
+<span class="sourceLineNo">2426</span>        MiniBatchOperationInProgress&lt;Mutation&gt; mb = invocation.getArgument(0);<a name="line.2426"></a>
+<span class="sourceLineNo">2427</span>        mb.addOperationsFromCP(0, new Mutation[]{addPut});<a name="line.2427"></a>
+<span class="sourceLineNo">2428</span>        return null;<a name="line.2428"></a>
+<span class="sourceLineNo">2429</span>      }<a name="line.2429"></a>
+<span class="sourceLineNo">2430</span>    }).when(mockedCPHost).preBatchMutate(Mockito.isA(MiniBatchOperationInProgress.class));<a name="line.2430"></a>
+<span class="sourceLineNo">2431</span>    ColumnFamilyDescriptorBuilder builder = ColumnFamilyDescriptorBuilder.<a name="line.2431"></a>
+<span class="sourceLineNo">2432</span>        newBuilder(COLUMN_FAMILY_BYTES);<a name="line.2432"></a>
+<span class="sourceLineNo">2433</span>    ScanInfo info = new ScanInfo(CONF, builder.build(), Long.MAX_VALUE,<a name="line.2433"></a>
+<span class="sourceLineNo">2434</span>        Long.MAX_VALUE, region.getCellComparator());<a name="line.2434"></a>
+<span class="sourceLineNo">2435</span>    Mockito.when(mockedCPHost.preFlushScannerOpen(Mockito.any(HStore.class),<a name="line.2435"></a>
+<span class="sourceLineNo">2436</span>        Mockito.any())).thenReturn(info);<a name="line.2436"></a>
+<span class="sourceLineNo">2437</span>    Mockito.when(mockedCPHost.preFlush(Mockito.any(), Mockito.any(StoreScanner.class),<a name="line.2437"></a>
+<span class="sourceLineNo">2438</span>        Mockito.any())).thenAnswer(i -&gt; i.getArgument(1));<a name="line.2438"></a>
+<span class="sourceLineNo">2439</span>    region.setCoprocessorHost(mockedCPHost);<a name="line.2439"></a>
+<span class="sourceLineNo">2440</span><a name="line.2440"></a>
+<span class="sourceLineNo">2441</span>    region.put(originalPut);<a name="line.2441"></a>
+<span class="sourceLineNo">2442</span>    region.setCoprocessorHost(normalCPHost);<a name="line.2442"></a>
+<span class="sourceLineNo">2443</span>    final long finalSize = region.getDataInMemoryWithoutWAL();<a name="line.2443"></a>
+<span class="sourceLineNo">2444</span>    assertEquals("finalSize:" + finalSize + ", initSize:"<a name="line.2444"></a>
+<span class="sourceLineNo">2445</span>      + initSize + ", delta:" + delta,finalSize, initSize + delta);<a name="line.2445"></a>
+<span class="sourceLineNo">2446</span>  }<a name="line.2446"></a>
+<span class="sourceLineNo">2447</span><a name="line.2447"></a>
+<span class="sourceLineNo">2448</span>  @Test<a name="line.2448"></a>
+<span class="sourceLineNo">2449</span>  public void testDeleteColumns_PostInsert() throws IOException, InterruptedException {<a name="line.2449"></a>
+<span class="sourceLineNo">2450</span>    Delete delete = new Delete(row);<a name="line.2450"></a>
+<span class="sourceLineNo">2451</span>    delete.addColumns(fam1, qual1);<a name="line.2451"></a>
+<span class="sourceLineNo">2452</span>    doTestDelete_AndPostInsert(delete);<a name="line.2452"></a>
+<span class="sourceLineNo">2453</span>  }<a name="line.2453"></a>
+<span class="sourceLineNo">2454</span><a name="line.2454"></a>
+<span class="sourceLineNo">2455</span>  @Test<a name="line.2455"></a>
+<span class="sourceLineNo">2456</span>  public void testaddFamily_PostInsert() throws IOException, InterruptedException {<a name="line.2456"></a>
+<span class="sourceLineNo">2457</span>    Delete delete = new Delete(row);<a name="line.2457"></a>
+<span class="sourceLineNo">2458</span>    delete.addFamily(fam1);<a name="line.2458"></a>
+<span class="sourceLineNo">2459</span>    doTestDelete_AndPostInsert(delete);<a name="line.2459"></a>
+<span class="sourceLineNo">2460</span>  }<a name="line.2460"></a>
 <span class="sourceLineNo">2461</span><a name="line.2461"></a>
-<span class="sourceLineNo">2462</span>    // ok put data:<a name="line.2462"></a>
-<span class="sourceLineNo">2463</span>    put = new Put(row);<a name="line.2463"></a>
-<span class="sourceLineNo">2464</span>    put.addColumn(fam1, qual1, value2);<a name="line.2464"></a>
-<span class="sourceLineNo">2465</span>    region.put(put);<a name="line.2465"></a>
-<span class="sourceLineNo">2466</span><a name="line.2466"></a>
-<span class="sourceLineNo">2467</span>    // ok get:<a name="line.2467"></a>
-<span class="sourceLineNo">2468</span>    Get get = new Get(row);<a name="line.2468"></a>
-<span class="sourceLineNo">2469</span>    get.addColumn(fam1, qual1);<a name="line.2469"></a>
-<span class="sourceLineNo">2470</span><a name="line.2470"></a>
-<span class="sourceLineNo">2471</span>    Result r = region.get(get);<a name="line.2471"></a>
-<span class="sourceLineNo">2472</span>    assertEquals(1, r.size());<a name="line.2472"></a>
-<span class="sourceLineNo">2473</span>    assertArrayEquals(value2, r.getValue(fam1, qual1));<a name="line.2473"></a>
-<span class="sourceLineNo">2474</span><a name="line.2474"></a>
-<span class="sourceLineNo">2475</span>    // next:<a name="line.2475"></a>
-<span class="sourceLineNo">2476</span>    Scan scan = new Scan(row);<a name="line.2476"></a>
-<span class="sourceLineNo">2477</span>    scan.addColumn(fam1, qual1);<a name="line.2477"></a>
-<span class="sourceLineNo">2478</span>    InternalScanner s = region.getScanner(scan);<a name="line.2478"></a>
-<span class="sourceLineNo">2479</span><a name="line.2479"></a>
-<span class="sourceLineNo">2480</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.2480"></a>
-<span class="sourceLineNo">2481</span>    assertEquals(false, s.next(results));<a name="line.2481"></a>
-<span class="sourceLineNo">2482</span>    assertEquals(1, results.size());<a name="line.2482"></a>
-<span class="sourceLineNo">2483</span>    Cell kv = results.get(0);<a name="line.2483"></a>
+<span class="sourceLineNo">2462</span>  public void doTestDelete_AndPostInsert(Delete delete) throws IOException, InterruptedException {<a name="line.2462"></a>
+<span class="sourceLineNo">2463</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2463"></a>
+<span class="sourceLineNo">2464</span>    EnvironmentEdgeManagerTestHelper.injectEdge(new IncrementingEnvironmentEdge());<a name="line.2464"></a>
+<span class="sourceLineNo">2465</span>    Put put = new Put(row);<a name="line.2465"></a>
+<span class="sourceLineNo">2466</span>    put.addColumn(fam1, qual1, value1);<a name="line.2466"></a>
+<span class="sourceLineNo">2467</span>    region.put(put);<a name="line.2467"></a>
+<span class="sourceLineNo">2468</span><a name="line.2468"></a>
+<span class="sourceLineNo">2469</span>    // now delete the value:<a name="line.2469"></a>
+<span class="sourceLineNo">2470</span>    region.delete(delete);<a name="line.2470"></a>
+<span class="sourceLineNo">2471</span><a name="line.2471"></a>
+<span class="sourceLineNo">2472</span>    // ok put data:<a name="line.2472"></a>
+<span class="sourceLineNo">2473</span>    put = new Put(row);<a name="line.2473"></a>
+<span class="sourceLineNo">2474</span>    put.addColumn(fam1, qual1, value2);<a name="line.2474"></a>
+<span class="sourceLineNo">2475</span>    region.put(put);<a name="line.2475"></a>
+<span class="sourceLineNo">2476</span><a name="line.2476"></a>
+<span class="sourceLineNo">2477</span>    // ok get:<a name="line.2477"></a>
+<span class="sourceLineNo">2478</span>    Get get = new Get(row);<a name="line.2478"></a>
+<span class="sourceLineNo">2479</span>    get.addColumn(fam1, qual1);<a name="line.2479"></a>
+<span class="sourceLineNo">2480</span><a name="line.2480"></a>
+<span class="sourceLineNo">2481</span>    Result r = region.get(get);<a name="line.2481"></a>
+<span class="sourceLineNo">2482</span>    assertEquals(1, r.size());<a name="line.2482"></a>
+<span class="sourceLineNo">2483</span>    assertArrayEquals(value2, r.getValue(fam1, qual1));<a name="line.2483"></a>
 <span class="sourceLineNo">2484</span><a name="line.2484"></a>
-<span class="sourceLineNo">2485</span>    assertArrayEquals(value2, CellUtil.cloneValue(kv));<a name="line.2485"></a>
-<span class="sourceLineNo">2486</span>    assertArrayEquals(fam1, CellUtil.cloneFamily(kv));<a name="line.2486"></a>
-<span class="sourceLineNo">2487</span>    assertArrayEquals(qual1, CellUtil.cloneQualifier(kv));<a name="line.2487"></a>
-<span class="sourceLineNo">2488</span>    assertArrayEquals(row, CellUtil.cloneRow(kv));<a name="line.2488"></a>
-<span class="sourceLineNo">2489</span>  }<a name="line.2489"></a>
-<span class="sourceLineNo">2490</span><a name="line.2490"></a>
-<span class="sourceLineNo">2491</span>  @Test<a name="line.2491"></a>
-<span class="sourceLineNo">2492</span>  public void testDelete_CheckTimestampUpdated() throws IOException {<a name="line.2492"></a>
-<span class="sourceLineNo">2493</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2493"></a>
-<span class="sourceLineNo">2494</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.2494"></a>
-<span class="sourceLineNo">2495</span>    byte[] col2 = Bytes.toBytes("col2");<a name="line.2495"></a>
-<span class="sourceLineNo">2496</span>    byte[] col3 = Bytes.toBytes("col3");<a name="line.2496"></a>
-<span class="sourceLineNo">2497</span><a name="line.2497"></a>
-<span class="sourceLineNo">2498</span>    // Setting up region<a name="line.2498"></a>
-<span class="sourceLineNo">2499</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2499"></a>
-<span class="sourceLineNo">2500</span>    // Building checkerList<a name="line.2500"></a>
-<span class="sourceLineNo">2501</span>    List&lt;Cell&gt; kvs = new ArrayList&lt;&gt;();<a name="line.2501"></a>
-<span class="sourceLineNo">2502</span>    kvs.add(new KeyValue(row1, fam1, col1, null));<a name="line.2502"></a>
-<span class="sourceLineNo">2503</span>    kvs.add(new KeyValue(row1, fam1, col2, null));<a name="line.2503"></a>
-<span class="sourceLineNo">2504</span>    kvs.add(new KeyValue(row1, fam1, col3, null));<a name="line.2504"></a>
-<span class="sourceLineNo">2505</span><a name="line.2505"></a>
-<span class="sourceLineNo">2506</span>    NavigableMap&lt;byte[], List&lt;Cell&gt;&gt; deleteMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2506"></a>
-<span class="sourceLineNo">2507</span>    deleteMap.put(fam1, kvs);<a name="line.2507"></a>
-<span class="sourceLineNo">2508</span>    region.delete(deleteMap, Durability.SYNC_WAL);<a name="line.2508"></a>
-<span class="sourceLineNo">2509</span><a name="line.2509"></a>
-<span class="sourceLineNo">2510</span>    // extract the key values out the memstore:<a name="line.2510"></a>
-<span class="sourceLineNo">2511</span>    // This is kinda hacky, but better than nothing...<a name="line.2511"></a>
-<span class="sourceLineNo">2512</span>    long now = System.currentTimeMillis();<a name="line.2512"></a>
-<span class="sourceLineNo">2513</span>    AbstractMemStore memstore = (AbstractMemStore)region.getStore(fam1).memstore;<a name="line.2513"></a>
-<span class="sourceLineNo">2514</span>    Cell firstCell = memstore.getActive().first();<a name="line.2514"></a>
-<span class="sourceLineNo">2515</span>    assertTrue(firstCell.getTimestamp() &lt;= now);<a name="line.2515"></a>
-<span class="sourceLineNo">2516</span>    now = firstCell.getTimestamp();<a name="line.2516"></a>
-<span class="sourceLineNo">2517</span>    for (Cell cell : memstore.getActive().getCellSet()) {<a name="line.2517"></a>
-<span class="sourceLineNo">2518</span>      assertTrue(cell.getTimestamp() &lt;= now);<a name="line.2518"></a>
-<span class="sourceLineNo">2519</span>      now = cell.getTimestamp();<a name="line.2519"></a>
-<span class="sourceLineNo">2520</span>    }<a name="line.2520"></a>
-<span class="sourceLineNo">2521</span>  }<a name="line.2521"></a>
-<span class="sourceLineNo">2522</span><a name="line.2522"></a>
-<span class="sourceLineNo">2523</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2523"></a>
-<span class="sourceLineNo">2524</span>  // Get tests<a name="line.2524"></a>
-<span class="sourceLineNo">2525</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2525"></a>
-<span class="sourceLineNo">2526</span>  @Test<a name="line.2526"></a>
-<span class="sourceLineNo">2527</span>  public void testGet_FamilyChecker() throws IOException {<a name="line.2527"></a>
-<span class="sourceLineNo">2528</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2528"></a>
-<span class="sourceLineNo">2529</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2529"></a>
-<span class="sourceLineNo">2530</span>    byte[] fam2 = Bytes.toBytes("False");<a name="line.2530"></a>
-<span class="sourceLineNo">2531</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.2531"></a>
+<span class="sourceLineNo">2485</span>    // next:<a name="line.2485"></a>
+<span class="sourceLineNo">2486</span>    Scan scan = new Scan(row);<a name="line.2486"></a>
+<span class="sourceLineNo">2487</span>    scan.addColumn(fam1, qual1);<a name="line.2487"></a>
+<span class="sourceLineNo">2488</span>    InternalScanner s = region.getScanner(scan);<a name="line.2488"></a>
+<span class="sourceLineNo">2489</span><a name="line.2489"></a>
+<span class="sourceLineNo">2490</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.2490"></a>
+<span class="sourceLineNo">2491</span>    assertEquals(false, s.next(results));<a name="line.2491"></a>
+<span class="sourceLineNo">2492</span>    assertEquals(1, results.size());<a name="line.2492"></a>
+<span class="sourceLineNo">2493</span>    Cell kv = results.get(0);<a name="line.2493"></a>
+<span class="sourceLineNo">2494</span><a name="line.2494"></a>
+<span class="sourceLineNo">2495</span>    assertArrayEquals(value2, CellUtil.cloneValue(kv));<a name="line.2495"></a>
+<span class="sourceLineNo">2496</span>    assertArrayEquals(fam1, CellUtil.cloneFamily(kv));<a name="line.2496"></a>
+<span class="sourceLineNo">2497</span>    assertArrayEquals(qual1, CellUtil.cloneQualifier(kv));<a name="line.2497"></a>
+<span class="sourceLineNo">2498</span>    assertArrayEquals(row, CellUtil.cloneRow(kv));<a name="line.2498"></a>
+<span class="sourceLineNo">2499</span>  }<a name="line.2499"></a>
+<span class="sourceLineNo">2500</span><a name="line.2500"></a>
+<span class="sourceLineNo">2501</span>  @Test<a name="line.2501"></a>
+<span class="sourceLineNo">2502</span>  public void testDelete_CheckTimestampUpdated() throws IOException {<a name="line.2502"></a>
+<span class="sourceLineNo">2503</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2503"></a>
+<span class="sourceLineNo">2504</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.2504"></a>
+<span class="sourceLineNo">2505</span>    byte[] col2 = Bytes.toBytes("col2");<a name="line.2505"></a>
+<span class="sourceLineNo">2506</span>    byte[] col3 = Bytes.toBytes("col3");<a name="line.2506"></a>
+<span class="sourceLineNo">2507</span><a name="line.2507"></a>
+<span class="sourceLineNo">2508</span>    // Setting up region<a name="line.2508"></a>
+<span class="sourceLineNo">2509</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2509"></a>
+<span class="sourceLineNo">2510</span>    // Building checkerList<a name="line.2510"></a>
+<span class="sourceLineNo">2511</span>    List&lt;Cell&gt; kvs = new ArrayList&lt;&gt;();<a name="line.2511"></a>
+<span class="sourceLineNo">2512</span>    kvs.add(new KeyValue(row1, fam1, col1, null));<a name="line.2512"></a>
+<span class="sourceLineNo">2513</span>    kvs.add(new KeyValue(row1, fam1, col2, null));<a name="line.2513"></a>
+<span class="sourceLineNo">2514</span>    kvs.add(new KeyValue(row1, fam1, col3, null));<a name="line.2514"></a>
+<span class="sourceLineNo">2515</span><a name="line.2515"></a>
+<span class="sourceLineNo">2516</span>    NavigableMap&lt;byte[], List&lt;Cell&gt;&gt; deleteMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2516"></a>
+<span class="sourceLineNo">2517</span>    deleteMap.put(fam1, kvs);<a name="line.2517"></a>
+<span class="sourceLineNo">2518</span>    region.delete(deleteMap, Durability.SYNC_WAL);<a name="line.2518"></a>
+<span class="sourceLineNo">2519</span><a name="line.2519"></a>
+<span class="sourceLineNo">2520</span>    // extract the key values out the memstore:<a name="line.2520"></a>
+<span class="sourceLineNo">2521</span>    // This is kinda hacky, but better than nothing...<a name="line.2521"></a>
+<span class="sourceLineNo">2522</span>    long now = System.currentTimeMillis();<a name="line.2522"></a>
+<span class="sourceLineNo">2523</span>    AbstractMemStore memstore = (AbstractMemStore)region.getStore(fam1).memstore;<a name="line.2523"></a>
+<span class="sourceLineNo">2524</span>    Cell firstCell = memstore.getActive().first();<a name="line.2524"></a>
+<span class="sourceLineNo">2525</span>    assertTrue(firstCell.getTimestamp() &lt;= now);<a name="line.2525"></a>
+<span class="sourceLineNo">2526</span>    now = firstCell.getTimestamp();<a name="line.2526"></a>
+<span class="sourceLineNo">2527</span>    for (Cell cell : memstore.getActive().getCellSet()) {<a name="line.2527"></a>
+<span class="sourceLineNo">2528</span>      assertTrue(cell.getTimestamp() &lt;= now);<a name="line.2528"></a>
+<span class="sourceLineNo">2529</span>      now = cell.getTimestamp();<a name="line.2529"></a>
+<span class="sourceLineNo">2530</span>    }<a name="line.2530"></a>
+<span class="sourceLineNo">2531</span>  }<a name="line.2531"></a>
 <span class="sourceLineNo">2532</span><a name="line.2532"></a>
-<span class="sourceLineNo">2533</span>    // Setting up region<a name="line.2533"></a>
-<span class="sourceLineNo">2534</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2534"></a>
-<span class="sourceLineNo">2535</span>    Get get = new Get(row1);<a name="line.2535"></a>
-<span class="sourceLineNo">2536</span>    get.addColumn(fam2, col1);<a name="line.2536"></a>
-<span class="sourceLineNo">2537</span><a name="line.2537"></a>
-<span class="sourceLineNo">2538</span>    // Test<a name="line.2538"></a>
-<span class="sourceLineNo">2539</span>    try {<a name="line.2539"></a>
-<span class="sourceLineNo">2540</span>      region.get(get);<a name="line.2540"></a>
-<span class="sourceLineNo">2541</span>      fail("Expecting DoNotRetryIOException in get but did not get any");<a name="line.2541"></a>
-<span class="sourceLineNo">2542</span>    } catch (org.apache.hadoop.hbase.DoNotRetryIOException e) {<a name="line.2542"></a>
-<span class="sourceLineNo">2543</span>      LOG.info("Got expected DoNotRetryIOException successfully");<a name="line.2543"></a>
-<span class="sourceLineNo">2544</span>    }<a name="line.2544"></a>
-<span class="sourceLineNo">2545</span>  }<a name="line.2545"></a>
-<span class="sourceLineNo">2546</span><a name="line.2546"></a>
-<span class="sourceLineNo">2547</span>  @Test<a name="line.2547"></a>
-<span class="sourceLineNo">2548</span>  public void testGet_Basic() throws IOException {<a name="line.2548"></a>
-<span class="sourceLineNo">2549</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2549"></a>
-<span class="sourceLineNo">2550</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2550"></a>
-<span class="sourceLineNo">2551</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.2551"></a>
-<span class="sourceLineNo">2552</span>    byte[] col2 = Bytes.toBytes("col2");<a name="line.2552"></a>
-<span class="sourceLineNo">2553</span>    byte[] col3 = Bytes.toBytes("col3");<a name="line.2553"></a>
-<span class="sourceLineNo">2554</span>    byte[] col4 = Bytes.toBytes("col4");<a name="line.2554"></a>
-<span class="sourceLineNo">2555</span>    byte[] col5 = Bytes.toBytes("col5");<a name="line.2555"></a>
+<span class="sourceLineNo">2533</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2533"></a>
+<span class="sourceLineNo">2534</span>  // Get tests<a name="line.2534"></a>
+<span class="sourceLineNo">2535</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2535"></a>
+<span class="sourceLineNo">2536</span>  @Test<a name="line.2536"></a>
+<span class="sourceLineNo">2537</span>  public void testGet_FamilyChecker() throws IOException {<a name="line.2537"></a>
+<span class="sourceLineNo">2538</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2538"></a>
+<span class="sourceLineNo">2539</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2539"></a>
+<span class="sourceLineNo">2540</span>    byte[] fam2 = Bytes.toBytes("False");<a name="line.2540"></a>
+<span class="sourceLineNo">2541</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.2541"></a>
+<span class="sourceLineNo">2542</span><a name="line.2542"></a>
+<span class="sourceLineNo">2543</span>    // Setting up region<a name="line.2543"></a>
+<span class="sourceLineNo">2544</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2544"></a>
+<span class="sourceLineNo">2545</span>    Get get = new Get(row1);<a name="line.2545"></a>
+<span class="sourceLineNo">2546</span>    get.addColumn(fam2, col1);<a name="line.2546"></a>
+<span class="sourceLineNo">2547</span><a name="line.2547"></a>
+<span class="sourceLineNo">2548</span>    // Test<a name="line.2548"></a>
+<span class="sourceLineNo">2549</span>    try {<a name="line.2549"></a>
+<span class="sourceLineNo">2550</span>      region.get(get);<a name="line.2550"></a>
+<span class="sourceLineNo">2551</span>      fail("Expecting DoNotRetryIOException in get but did not get any");<a name="line.2551"></a>
+<span class="sourceLineNo">2552</span>    } catch (org.apache.hadoop.hbase.DoNotRetryIOException e) {<a name="line.2552"></a>
+<span class="sourceLineNo">2553</span>      LOG.info("Got expected DoNotRetryIOException successfully");<a name="line.2553"></a>
+<span class="sourceLineNo">2554</span>    }<a name="line.2554"></a>
+<span class="sourceLineNo">2555</span>  }<a name="line.2555"></a>
 <span class="sourceLineNo">2556</span><a name="line.2556"></a>
-<span class="sourceLineNo">2557</span>    // Setting up region<a name="line.2557"></a>
-<span class="sourceLineNo">2558</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2558"></a>
-<span class="sourceLineNo">2559</span>    // Add to memstore<a name="line.2559"></a>
-<span class="sourceLineNo">2560</span>    Put put = new Put(row1);<a name="line.2560"></a>
-<span class="sourceLineNo">2561</span>    put.addColumn(fam1, col1, null);<a name="line.2561"></a>
-<span class="sourceLineNo">2562</span>    put.addColumn(fam1, col2, null);<a name="line.2562"></a>
-<span class="sourceLineNo">2563</span>    put.addColumn(fam1, col3, null);<a name="line.2563"></a>
-<span class="sourceLineNo">2564</span>    put.addColumn(fam1, col4, null);<a name="line.2564"></a>
-<span class="sourceLineNo">2565</span>    put.addColumn(fam1, col5, null);<a name="line.2565"></a>
-<span class="sourceLineNo">2566</span>    region.put(put);<a name="line.2566"></a>
-<span class="sourceLineNo">2567</span><a name="line.2567"></a>
-<span class="sourceLineNo">2568</span>    Get get = new Get(row1);<a name="line.2568"></a>
-<span class="sourceLineNo">2569</span>    get.addColumn(fam1, col2);<a name="line.2569"></a>
-<span class="sourceLineNo">2570</span>    get.addColumn(fam1, col4);<a name="line.2570"></a>
-<span class="sourceLineNo">2571</span>    // Expected result<a name="line.2571"></a>
-<span class="sourceLineNo">2572</span>    KeyValue kv1 = new KeyValue(row1, fam1, col2);<a name="line.2572"></a>
-<span class="sourceLineNo">2573</span>    KeyValue kv2 = new KeyValue(row1, fam1, col4);<a name="line.2573"></a>
-<span class="sourceLineNo">2574</span>    KeyValue[] expected = { kv1, kv2 };<a name="line.2574"></a>
-<span class="sourceLineNo">2575</span><a name="line.2575"></a>
-<span class="sourceLineNo">2576</span>    // Test<a name="line.2576"></a>
-<span class="sourceLineNo">2577</span>    Result res = region.get(get);<a name="line.2577"></a>
-<span class="sourceLineNo">2578</span>    assertEquals(expected.length, res.size());<a name="line.2578"></a>
-<span class="sourceLineNo">2579</span>    for (int i = 0; i &lt; res.size(); i++) {<a name="line.2579"></a>
-<span class="sourceLineNo">2580</span>      assertTrue(CellUtil.matchingRows(expected[i], res.rawCells()[i]));<a name="line.2580"></a>
-<span class="sourceLineNo">2581</span>      assertTrue(CellUtil.matchingFamily(expected[i], res.rawCells()[i]));<a name="line.2581"></a>
-<span class="sourceLineNo">2582</span>      assertTrue(CellUtil.matchingQualifier(expected[i], res.rawCells()[i]));<a name="line.2582"></a>
-<span class="sourceLineNo">2583</span>    }<a name="line.2583"></a>
-<span class="sourceLineNo">2584</span><a name="line.2584"></a>
-<span class="sourceLineNo">2585</span>    // Test using a filter on a Get<a name="line.2585"></a>
-<span class="sourceLineNo">2586</span>    Get g = new Get(row1);<a name="line.2586"></a>
-<span class="sourceLineNo">2587</span>    final int count = 2;<a name="line.2587"></a>
-<span class="sourceLineNo">2588</span>    g.setFilter(new ColumnCountGetFilter(count));<a name="line.2588"></a>
-<span class="sourceLineNo">2589</span>    res = region.get(g);<a name="line.2589"></a>
-<span class="sourceLineNo">2590</span>    assertEquals(count, res.size());<a name="line.2590"></a>
-<span class="sourceLineNo">2591</span>  }<a name="line.2591"></a>
-<span class="sourceLineNo">2592</span><a name="line.2592"></a>
-<span class="sourceLineNo">2593</span>  @Test<a name="line.2593"></a>
-<span class="sourceLineNo">2594</span>  public void testGet_Empty() throws IOException {<a name="line.2594"></a>
-<span class="sourceLineNo">2595</span>    byte[] row = Bytes.toBytes("row");<a name="line.2595"></a>
-<span class="sourceLineNo">2596</span>    byte[] fam = Bytes.toBytes("fam");<a name="line.2596"></a>
-<span class="sourceLineNo">2597</span><a name="line.2597"></a>
-<span class="sourceLineNo">2598</span>    this.region = initHRegion(tableName, method, CONF, fam);<a name="line.2598"></a>
-<span class="sourceLineNo">2599</span>    Get get = new Get(row);<a name="line.2599"></a>
-<span class="sourceLineNo">2600</span>    get.addFamily(fam);<a name="line.2600"></a>
-<span class="sourceLineNo">2601</span>    Result r = region.get(get);<a name="line.2601"></a>
+<span class="sourceLineNo">2557</span>  @Test<a name="line.2557"></a>
+<span class="sourceLineNo">2558</span>  public void testGet_Basic() throws IOException {<a name="line.2558"></a>
+<span class="sourceLineNo">2559</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2559"></a>
+<span class="sourceLineNo">2560</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2560"></a>
+<span class="sourceLineNo">2561</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.2561"></a>
+<span class="sourceLineNo">2562</span>    byte[] col2 = Bytes.toBytes("col2");<a name="line.2562"></a>
+<span class="sourceLineNo">2563</span>    byte[] col3 = Bytes.toBytes("col3");<a name="line.2563"></a>
+<span class="sourceLineNo">2564</span>    byte[] col4 = Bytes.toBytes("col4");<a name="line.2564"></a>
+<span class="sourceLineNo">2565</span>    byte[] col5 = Bytes.toBytes("col5");<a name="line.2565"></a>
+<span class="sourceLineNo">2566</span><a name="line.2566"></a>
+<span class="sourceLineNo">2567</span>    // Setting up region<a name="line.2567"></a>
+<span class="sourceLineNo">2568</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2568"></a>
+<span class="sourceLineNo">2569</span>    // Add to memstore<a name="line.2569"></a>
+<span class="sourceLineNo">2570</span>    Put put = new Put(row1);<a name="line.2570"></a>
+<span class="sourceLineNo">2571</span>    put.addColumn(fam1, col1, null);<a name="line.2571"></a>
+<span class="sourceLineNo">2572</span>    put.addColumn(fam1, col2, null);<a name="line.2572"></a>
+<span class="sourceLineNo">2573</span>    put.addColumn(fam1, col3, null);<a name="line.2573"></a>
+<span class="sourceLineNo">2574</span>    put.addColumn(fam1, col4, null);<a name="line.2574"></a>
+<span class="sourceLineNo">2575</span>    put.addColumn(fam1, col5, null);<a name="line.2575"></a>
+<span class="sourceLineNo">2576</span>    region.put(put);<a name="line.2576"></a>
+<span class="sourceLineNo">2577</span><a name="line.2577"></a>
+<span class="sourceLineNo">2578</span>    Get get = new Get(row1);<a name="line.2578"></a>
+<span class="sourceLineNo">2579</span>    get.addColumn(fam1, col2);<a name="line.2579"></a>
+<span class="sourceLineNo">2580</span>    get.addColumn(fam1, col4);<a name="line.2580"></a>
+<span class="sourceLineNo">2581</span>    // Expected result<a name="line.2581"></a>
+<span class="sourceLineNo">2582</span>    KeyValue kv1 = new KeyValue(row1, fam1, col2);<a name="line.2582"></a>
+<span class="sourceLineNo">2583</span>    KeyValue kv2 = new KeyValue(row1, fam1, col4);<a name="line.2583"></a>
+<span class="sourceLineNo">2584</span>    KeyValue[] expected = { kv1, kv2 };<a name="line.2584"></a>
+<span class="sourceLineNo">2585</span><a name="line.2585"></a>
+<span class="sourceLineNo">2586</span>    // Test<a name="line.2586"></a>
+<span class="sourceLineNo">2587</span>    Result res = region.get(get);<a name="line.2587"></a>
+<span class="sourceLineNo">2588</span>    assertEquals(expected.length, res.size());<a name="line.2588"></a>
+<span class="sourceLineNo">2589</span>    for (int i = 0; i &lt; res.size(); i++) {<a name="line.2589"></a>
+<span class="sourceLineNo">2590</span>      assertTrue(CellUtil.matchingRows(expected[i], res.rawCells()[i]));<a name="line.2590"></a>
+<span class="sourceLineNo">2591</span>      assertTrue(CellUtil.matchingFamily(expected[i], res.rawCells()[i]));<a name="line.2591"></a>
+<span class="sourceLineNo">2592</span>      assertTrue(CellUtil.matchingQualifier(expected[i], res.rawCells()[i]));<a name="line.2592"></a>
+<span class="sourceLineNo">2593</span>    }<a name="line.2593"></a>
+<span class="sourceLineNo">2594</span><a name="line.2594"></a>
+<span class="sourceLineNo">2595</span>    // Test using a filter on a Get<a name="line.2595"></a>
+<span class="sourceLineNo">2596</span>    Get g = new Get(row1);<a name="line.2596"></a>
+<span class="sourceLineNo">2597</span>    final int count = 2;<a name="line.2597"></a>
+<span class="sourceLineNo">2598</span>    g.setFilter(new ColumnCountGetFilter(count));<a name="line.2598"></a>
+<span class="sourceLineNo">2599</span>    res = region.get(g);<a name="line.2599"></a>
+<span class="sourceLineNo">2600</span>    assertEquals(count, res.size());<a name="line.2600"></a>
+<span class="sourceLineNo">2601</span>  }<a name="line.2601"></a>
 <span class="sourceLineNo">2602</span><a name="line.2602"></a>
-<span class="sourceLineNo">2603</span>    assertTrue(r.isEmpty());<a name="line.2603"></a>
-<span class="sourceLineNo">2604</span>  }<a name="line.2604"></a>
-<span class="sourceLineNo">2605</span><a name="line.2605"></a>
-<span class="sourceLineNo">2606</span>  @Test<a name="line.2606"></a>
-<span class="sourceLineNo">2607</span>  public void testGetWithFilter() throws IOException, InterruptedException {<a name="line.2607"></a>
-<span class="sourceLineNo">2608</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2608"></a>
-<span class="sourceLineNo">2609</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2609"></a>
-<span class="sourceLineNo">2610</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.2610"></a>
-<span class="sourceLineNo">2611</span>    byte[] value1 = Bytes.toBytes("value1");<a name="line.2611"></a>
-<span class="sourceLineNo">2612</span>    byte[] value2 = Bytes.toBytes("value2");<a name="line.2612"></a>
-<span class="sourceLineNo">2613</span><a name="line.2613"></a>
-<span class="sourceLineNo">2614</span>    final int maxVersions = 3;<a name="line.2614"></a>
-<span class="sourceLineNo">2615</span>    HColumnDescriptor hcd = new HColumnDescriptor(fam1);<a name="line.2615"></a>
-<span class="sourceLineNo">2616</span>    hcd.setMaxVersions(maxVersions);<a name="line.2616"></a>
-<span class="sourceLineNo">2617</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf("testFilterAndColumnTracker"));<a name="line.2617"></a>
-<span class="sourceLineNo">2618</span>    htd.addFamily(hcd);<a name="line.2618"></a>
-<span class="sourceLineNo">2619</span>    ChunkCreator.initialize(MemStoreLABImpl.CHUNK_SIZE_DEFAULT, false, 0, 0, 0, null);<a name="line.2619"></a>
-<span class="sourceLineNo">2620</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.2620"></a>
-<span class="sourceLineNo">2621</span>    Path logDir = TEST_UTIL.getDataTestDirOnTestFS(method + ".log");<a name="line.2621"></a>
-<span class="sourceLineNo">2622</span>    final WAL wal = HBaseTestingUtility.createWal(TEST_UTIL.getConfiguration(), logDir, info);<a name="line.2622"></a>
-<span class="sourceLineNo">2623</span>    this.region = TEST_UTIL.createLocalHRegion(info, htd, wal);<a name="line.2623"></a>
-<span class="sourceLineNo">2624</span><a name="line.2624"></a>
-<span class="sourceLineNo">2625</span>    // Put 4 version to memstore<a name="line.2625"></a>
-<span class="sourceLineNo">2626</span>    long ts = 0;<a name="line.2626"></a>
-<span class="sourceLineNo">2627</span>    Put put = new Put(row1, ts);<a name="line.2627"></a>
-<span class="sourceLineNo">2628</span>    put.addColumn(fam1, col1, value1);<a name="line.2628"></a>
-<span class="sourceLineNo">2629</span>    region.put(put);<a name="line.2629"></a>
-<span class="sourceLineNo">2630</span>    put = new Put(row1, ts + 1);<a name="line.2630"></a>
-<span class="sourceLineNo">2631</span>    put.addColumn(fam1, col1, Bytes.toBytes("filter1"));<a name="line.2631"></a>
-<span class="sourceLineNo">2632</span>    region.put(put);<a name="line.2632"></a>
-<span class="sourceLineNo">2633</span>    put = new Put(row1, ts + 2);<a name="line.2633"></a>
-<span class="sourceLineNo">2634</span>    put.addColumn(fam1, col1, Bytes.toBytes("filter2"));<a name="line.2634"></a>
-<span class="sourceLineNo">2635</span>    region.put(put);<a name="line.2635"></a>
-<span class="sourceLineNo">2636</span>    put = new Put(row1, ts + 3);<a name="line.2636"></a>
-<span class="sourceLineNo">2637</span>    put.addColumn(fam1, col1, value2);<a name="line.2637"></a>
-<span class="sourceLineNo">2638</span>    region.put(put);<a name="line.2638"></a>
-<span class="sourceLineNo">2639</span><a name="line.2639"></a>
-<span class="sourceLineNo">2640</span>    Get get = new Get(row1);<a name="line.2640"></a>
-<span class="sourceLineNo">2641</span>    get.readAllVersions();<a name="line.2641"></a>
-<span class="sourceLineNo">2642</span>    Result res = region.get(get);<a name="line.2642"></a>
-<span class="sourceLineNo">2643</span>    // Get 3 versions, the oldest version has gone from user view<a name="line.2643"></a>
-<span class="sourceLineNo">2644</span>    assertEquals(maxVersions, res.size());<a name="line.2644"></a>
-<span class="sourceLineNo">2645</span><a name="line.2645"></a>
-<span class="sourceLineNo">2646</span>    get.setFilter(new ValueFilter(CompareOperator.EQUAL, new SubstringComparator("value")));<a name="line.2646"></a>
-<span class="sourceLineNo">2647</span>    res = region.get(get);<a name="line.2647"></a>
-<span class="sourceLineNo">2648</span>    // When use value filter, the oldest version should still gone from user view and it<a name="line.2648"></a>
-<span class="sourceLineNo">2649</span>    // should only return one key vaule<a name="line.2649"></a>
-<span class="sourceLineNo">2650</span>    assertEquals(1, res.size());<a name="line.2650"></a>
-<span class="sourceLineNo">2651</span>    assertTrue(CellUtil.matchingValue(new KeyValue(row1, fam1, col1, value2), res.rawCells()[0]));<a name="line.2651"></a>
-<span class="sourceLineNo">2652</span>    assertEquals(ts + 3, res.rawCells()[0].getTimestamp());<a name="line.2652"></a>
-<span class="sourceLineNo">2653</span><a name="line.2653"></a>
-<span class="sourceLineNo">2654</span>    region.flush(true);<a name="line.2654"></a>
-<span class="sourceLineNo">2655</span>    region.compact(true);<a name="line.2655"></a>
-<span class="sourceLineNo">2656</span>    Thread.sleep(1000);<a name="line.2656"></a>
+<span class="sourceLineNo">2603</span>  @Test<a name="line.2603"></a>
+<span class="sourceLineNo">2604</span>  public void testGet_Empty() throws IOException {<a name="line.2604"></a>
+<span class="sourceLineNo">2605</span>    byte[] row = Bytes.toBytes("row");<a name="line.2605"></a>
+<span class="sourceLineNo">2606</span>    byte[] fam = Bytes.toBytes("fam");<a name="line.2606"></a>
+<span class="sourceLineNo">2607</span><a name="line.2607"></a>
+<span class="sourceLineNo">2608</span>    this.region = initHRegion(tableName, method, CONF, fam);<a name="line.2608"></a>
+<span class="sourceLineNo">2609</span>    Get get = new Get(row);<a name="line.2609"></a>
+<span class="sourceLineNo">2610</span>    get.addFamily(fam);<a name="line.2610"></a>
+<span class="sourceLineNo">2611</span>    Result r = region.get(get);<a name="line.2611"></a>
+<span class="sourceLineNo">2612</span><a name="line.2612"></a>
+<span class="sourceLineNo">2613</span>    assertTrue(r.isEmpty());<a name="line.2613"></a>
+<span class="sourceLineNo">2614</span>  }<a name="line.2614"></a>
+<span class="sourceLineNo">2615</span><a name="line.2615"></a>
+<span class="sourceLineNo">2616</span>  @Test<a name="line.2616"></a>
+<span class="sourceLineNo">2617</span>  public void testGetWithFilter() throws IOException, InterruptedException {<a name="line.2617"></a>
+<span class="sourceLineNo">2618</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2618"></a>
+<span class="sourceLineNo">2619</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2619"></a>
+<span class="sourceLineNo">2620</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.2620"></a>
+<span class="sourceLineNo">2621</span>    byte[] value1 = Bytes.toBytes("value1");<a name="line.2621"></a>
+<span class="sourceLineNo">2622</span>    byte[] value2 = Bytes.toBytes("value2");<a name="line.2622"></a>
+<span class="sourceLineNo">2623</span><a name="line.2623"></a>
+<span class="sourceLineNo">2624</span>    final int maxVersions = 3;<a name="line.2624"></a>
+<span class="sourceLineNo">2625</span>    HColumnDescriptor hcd = new HColumnDescriptor(fam1);<a name="line.2625"></a>
+<span class="sourceLineNo">2626</span>    hcd.setMaxVersions(maxVersions);<a name="line.2626"></a>
+<span class="sourceLineNo">2627</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf("testFilterAndColumnTracker"));<a name="line.2627"></a>
+<span class="sourceLineNo">2628</span>    htd.addFamily(hcd);<a name="line.2628"></a>
+<span class="sourceLineNo">2629</span>    ChunkCreator.initialize(MemStoreLABImpl.CHUNK_SIZE_DEFAULT, false, 0, 0, 0, null);<a name="line.2629"></a>
+<span class="sourceLineNo">2630</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.2630"></a>
+<span class="sourceLineNo">2631</span>    Path logDir = TEST_UTIL.getDataTestDirOnTestFS(method + ".log");<a name="line.2631"></a>
+<span class="sourceLineNo">2632</span>    final WAL wal = HBaseTestingUtility.createWal(TEST_UTIL.getConfiguration(), logDir, info);<a name="line.2632"></a>
+<span class="sourceLineNo">2633</span>    this.region = TEST_UTIL.createLocalHRegion(info, htd, wal);<a name="line.2633"></a>
+<span class="sourceLineNo">2634</span><a name="line.2634"></a>
+<span class="sourceLineNo">2635</span>    // Put 4 version to memstore<a name="line.2635"></a>
+<span class="sourceLineNo">2636</span>    long ts = 0;<a name="line.2636"></a>
+<span class="sourceLineNo">2637</span>    Put put = new Put(row1, ts);<a name="line.2637"></a>
+<span class="sourceLineNo">2638</span>    put.addColumn(fam1, col1, value1);<a name="line.2638"></a>
+<span class="sourceLineNo">2639</span>    region.put(put);<a name="line.2639"></a>
+<span class="sourceLineNo">2640</span>    put = new Put(row1, ts + 1);<a name="line.2640"></a>
+<span class="sourceLineNo">2641</span>    put.addColumn(fam1, col1, Bytes.toBytes("filter1"));<a name="line.2641"></a>
+<span class="sourceLineNo">2642</span>    region.put(put);<a name="line.2642"></a>
+<span class="sourceLineNo">2643</span>    put = new Put(row1, ts + 2);<a name="line.2643"></a>
+<span class="sourceLineNo">2644</span>    put.addColumn(fam1, col1, Bytes.toBytes("filter2"));<a name="line.2644"></a>
+<span class="sourceLineNo">2645</span>    region.put(put);<a name="line.2645"></a>
+<span class="sourceLineNo">2646</span>    put = new Put(row1, ts + 3);<a name="line.2646"></a>
+<span class="sourceLineNo">2647</span>    put.addColumn(fam1, col1, value2);<a name="line.2647"></a>
+<span class="sourceLineNo">2648</span>    region.put(put);<a name="line.2648"></a>
+<span class="sourceLineNo">2649</span><a name="line.2649"></a>
+<span class="sourceLineNo">2650</span>    Get get = new Get(row1);<a name="line.2650"></a>
+<span class="sourceLineNo">2651</span>    get.readAllVersions();<a name="line.2651"></a>
+<span class="sourceLineNo">2652</span>    Result res = region.get(get);<a name="line.2652"></a>
+<span class="sourceLineNo">2653</span>    // Get 3 versions, the oldest version has gone from user view<a name="line.2653"></a>
+<span class="sourceLineNo">2654</span>    assertEquals(maxVersions, res.size());<a name="line.2654"></a>
+<span class="sourceLineNo">2655</span><a name="line.2655"></a>
+<span class="sourceLineNo">2656</span>    get.setFilter(new ValueFilter(CompareOperator.EQUAL, new SubstringComparator("value")));<a name="line.2656"></a>
 <span class="sourceLineNo">2657</span>    res = region.get(get);<a name="line.2657"></a>
-<span class="sourceLineNo">2658</span>    // After flush and compact, the result should be consistent with previous result<a name="line.2658"></a>
-<span class="sourceLineNo">2659</span>    assertEquals(1, res.size());<a name="line.2659"></a>
-<span class="sourceLineNo">2660</span>    assertTrue(CellUtil.matchingValue(new KeyValue(row1, fam1, col1, value2), res.rawCells()[0]));<a name="line.2660"></a>
-<span class="sourceLineNo">2661</span>  }<a name="line.2661"></a>
-<span class="sourceLineNo">2662</span><a name="line.2662"></a>
-<span class="sourceLineNo">2663</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2663"></a>
-<span class="sourceLineNo">2664</span>  // Scanner tests<a name="line.2664"></a>
-<span class="sourceLineNo">2665</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2665"></a>
-<span class="sourceLineNo">2666</span>  @Test<a name="line.2666"></a>
-<span class="sourceLineNo">2667</span>  public void testGetScanner_WithOkFamilies() throws IOException {<a name="line.2667"></a>
-<span class="sourceLineNo">2668</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2668"></a>
-<span class="sourceLineNo">2669</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2669"></a>
-<span class="sourceLineNo">2670</span><a name="line.2670"></a>
-<span class="sourceLineNo">2671</span>    byte[][] families = { fam1, fam2 };<a name="line.2671"></a>
+<span class="sourceLineNo">2658</span>    // When use value filter, the oldest version should still gone from user view and it<a name="line.2658"></a>
+<span class="sourceLineNo">2659</span>    // should only return one key vaule<a name="line.2659"></a>
+<span class="sourceLineNo">2660</span>    assertEquals(1, res.size());<a name="line.2660"></a>
+<span class="sourceLineNo">2661</span>    assertTrue(CellUtil.matchingValue(new KeyValue(row1, fam1, col1, value2), res.rawCells()[0]));<a name="line.2661"></a>
+<span class="sourceLineNo">2662</span>    assertEquals(ts + 3, res.rawCells()[0].getTimestamp());<a name="line.2662"></a>
+<span class="sourceLineNo">2663</span><a name="line.2663"></a>
+<span class="sourceLineNo">2664</span>    region.flush(true);<a name="line.2664"></a>
+<span class="sourceLineNo">2665</span>    region.compact(true);<a name="line.2665"></a>
+<span class="sourceLineNo">2666</span>    Thread.sleep(1000);<a name="line.2666"></a>
+<span class="sourceLineNo">2667</span>    res = region.get(get);<a name="line.2667"></a>
+<span class="sourceLineNo">2668</span>    // After flush and compact, the result should be consistent with previous result<a name="line.2668"></a>
+<span class="sourceLineNo">2669</span>    assertEquals(1, res.size());<a name="line.2669"></a>
+<span class="sourceLineNo">2670</span>    assertTrue(CellUtil.matchingValue(new KeyValue(row1, fam1, col1, value2), res.rawCells()[0]));<a name="line.2670"></a>
+<span class="sourceLineNo">2671</span>  }<a name="line.2671"></a>
 <span class="sourceLineNo">2672</span><a name="line.2672"></a>
-<span class="sourceLineNo">2673</span>    // Setting up region<a name="line.2673"></a>
-<span class="sourceLineNo">2674</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2674"></a>
-<span class="sourceLineNo">2675</span>    Scan scan = new Scan();<a name="line.2675"></a>
-<span class="sourceLineNo">2676</span>    scan.addFamily(fam1);<a name="line.2676"></a>
-<span class="sourceLineNo">2677</span>    scan.addFamily(fam2);<a name="line.2677"></a>
-<span class="sourceLineNo">2678</span>    try {<a name="line.2678"></a>
-<span class="sourceLineNo">2679</span>      region.getScanner(scan);<a name="line.2679"></a>
-<span class="sourceLineNo">2680</span>    } catch (Exception e) {<a name="line.2680"></a>
-<span class="sourceLineNo">2681</span>      assertTrue("Families could not be found in Region", false);<a name="line.2681"></a>
-<span class="sourceLineNo">2682</span>    }<a name="line.2682"></a>
-<span class="sourceLineNo">2683</span>  }<a name="line.2683"></a>
-<span class="sourceLineNo">2684</span><a name="line.2684"></a>
-<span class="sourceLineNo">2685</span>  @Test<a name="line.2685"></a>
-<span class="sourceLineNo">2686</span>  public void testGetScanner_WithNotOkFamilies() throws IOException {<a name="line.2686"></a>
-<span class="sourceLineNo">2687</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2687"></a>
-<span class="sourceLineNo">2688</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2688"></a>
-<span class="sourceLineNo">2689</span><a name="line.2689"></a>
-<span class="sourceLineNo">2690</span>    byte[][] families = { fam1 };<a name="line.2690"></a>
-<span class="sourceLineNo">2691</span><a name="line.2691"></a>
-<span class="sourceLineNo">2692</span>    // Setting up region<a name="line.2692"></a>
-<span class="sourceLineNo">2693</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2693"></a>
-<span class="sourceLineNo">2694</span>    Scan scan = new Scan();<a name="line.2694"></a>
-<span class="sourceLineNo">2695</span>    scan.addFamily(fam2);<a name="line.2695"></a>
-<span class="sourceLineNo">2696</span>    boolean ok = false;<a name="line.2696"></a>
-<span class="sourceLineNo">2697</span>    try {<a name="line.2697"></a>
-<span class="sourceLineNo">2698</span>      region.getScanner(scan);<a name="line.2698"></a>
-<span class="sourceLineNo">2699</span>    } catch (Exception e) {<a name="line.2699"></a>
-<span class="sourceLineNo">2700</span>      ok = true;<a name="line.2700"></a>
-<span class="sourceLineNo">2701</span>    }<a name="line.2701"></a>
-<span class="sourceLineNo">2702</span>    assertTrue("Families could not be found in Region", ok);<a name="line.2702"></a>
-<span class="sourceLineNo">2703</span>  }<a name="line.2703"></a>
-<span class="sourceLineNo">2704</span><a name="line.2704"></a>
-<span class="sourceLineNo">2705</span>  @Test<a name="line.2705"></a>
-<span class="sourceLineNo">2706</span>  public void testGetScanner_WithNoFamilies() throws IOException {<a name="line.2706"></a>
-<span class="sourceLineNo">2707</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2707"></a>
-<span class="sourceLineNo">2708</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2708"></a>
-<span class="sourceLineNo">2709</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2709"></a>
-<span class="sourceLineNo">2710</span>    byte[] fam3 = Bytes.toBytes("fam3");<a name="line.2710"></a>
-<span class="sourceLineNo">2711</span>    byte[] fam4 = Bytes.toBytes("fam4");<a name="line.2711"></a>
-<span class="sourceLineNo">2712</span><a name="line.2712"></a>
-<span class="sourceLineNo">2713</span>    byte[][] families = { fam1, fam2, fam3, fam4 };<a name="line.2713"></a>
+<span class="sourceLineNo">2673</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2673"></a>
+<span class="sourceLineNo">2674</span>  // Scanner tests<a name="line.2674"></a>
+<span class="sourceLineNo">2675</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2675"></a>
+<span class="sourceLineNo">2676</span>  @Test<a name="line.2676"></a>
+<span class="sourceLineNo">2677</span>  public void testGetScanner_WithOkFamilies() throws IOException {<a name="line.2677"></a>
+<span class="sourceLineNo">2678</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2678"></a>
+<span class="sourceLineNo">2679</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2679"></a>
+<span class="sourceLineNo">2680</span><a name="line.2680"></a>
+<span class="sourceLineNo">2681</span>    byte[][] families = { fam1, fam2 };<a name="line.2681"></a>
+<span class="sourceLineNo">2682</span><a name="line.2682"></a>
+<span class="sourceLineNo">2683</span>    // Setting up region<a name="line.2683"></a>
+<span class="sourceLineNo">2684</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2684"></a>
+<span class="sourceLineNo">2685</span>    Scan scan = new Scan();<a name="line.2685"></a>
+<span class="sourceLineNo">2686</span>    scan.addFamily(fam1);<a name="line.2686"></a>
+<span class="sourceLineNo">2687</span>    scan.addFamily(fam2);<a name="line.2687"></a>
+<span class="sourceLineNo">2688</span>    try {<a name="line.2688"></a>
+<span class="sourceLineNo">2689</span>      region.getScanner(scan);<a name="line.2689"></a>
+<span class="sourceLineNo">2690</span>    } catch (Exception e) {<a name="line.2690"></a>
+<span class="sourceLineNo">2691</span>      assertTrue("Families could not be found in Region", false);<a name="line.2691"></a>
+<span class="sourceLineNo">2692</span>    }<a name="line.2692"></a>
+<span class="sourceLineNo">2693</span>  }<a name="line.2693"></a>
+<span class="sourceLineNo">2694</span><a name="line.2694"></a>
+<span class="sourceLineNo">2695</span>  @Test<a name="line.2695"></a>
+<span class="sourceLineNo">2696</span>  public void testGetScanner_WithNotOkFamilies() throws IOException {<a name="line.2696"></a>
+<span class="sourceLineNo">2697</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2697"></a>
+<span class="sourceLineNo">2698</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2698"></a>
+<span class="sourceLineNo">2699</span><a name="line.2699"></a>
+<span class="sourceLineNo">2700</span>    byte[][] families = { fam1 };<a name="line.2700"></a>
+<span class="sourceLineNo">2701</span><a name="line.2701"></a>
+<span class="sourceLineNo">2702</span>    // Setting up region<a name="line.2702"></a>
+<span class="sourceLineNo">2703</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2703"></a>
+<span class="sourceLineNo">2704</span>    Scan scan = new Scan();<a name="line.2704"></a>
+<span class="sourceLineNo">2705</span>    scan.addFamily(fam2);<a name="line.2705"></a>
+<span class="sourceLineNo">2706</span>    boolean ok = false;<a name="line.2706"></a>
+<span class="sourceLineNo">2707</span>    try {<a name="line.2707"></a>
+<span class="sourceLineNo">2708</span>      region.getScanner(scan);<a name="line.2708"></a>
+<span class="sourceLineNo">2709</span>    } catch (Exception e) {<a name="line.2709"></a>
+<span class="sourceLineNo">2710</span>      ok = true;<a name="line.2710"></a>
+<span class="sourceLineNo">2711</span>    }<a name="line.2711"></a>
+<span class="sourceLineNo">2712</span>    assertTrue("Families could not be found in Region", ok);<a name="line.2712"></a>
+<span class="sourceLineNo">2713</span>  }<a name="line.2713"></a>
 <span class="sourceLineNo">2714</span><a name="line.2714"></a>
-<span class="sourceLineNo">2715</span>    // Setting up region<a name="line.2715"></a>
-<span class="sourceLineNo">2716</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2716"></a>
-<span class="sourceLineNo">2717</span>    // Putting data in Region<a name="line.2717"></a>
-<span class="sourceLineNo">2718</span>    Put put = new Put(row1);<a name="line.2718"></a>
-<span class="sourceLineNo">2719</span>    put.addColumn(fam1, null, null);<a name="line.2719"></a>
-<span class="sourceLineNo">2720</span>    put.addColumn(fam2, null, null);<a name="line.2720"></a>
-<span class="sourceLineNo">2721</span>    put.addColumn(fam3, null, null);<a name="line.2721"></a>
-<span class="sourceLineNo">2722</span>    put.addColumn(fam4, null, null);<a name="line.2722"></a>
-<span class="sourceLineNo">2723</span>    region.put(put);<a name="line.2723"></a>
+<span class="sourceLineNo">2715</span>  @Test<a name="line.2715"></a>
+<span class="sourceLineNo">2716</span>  public void testGetScanner_WithNoFamilies() throws IOException {<a name="line.2716"></a>
+<span class="sourceLineNo">2717</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2717"></a>
+<span class="sourceLineNo">2718</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2718"></a>
+<span class="sourceLineNo">2719</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2719"></a>
+<span class="sourceLineNo">2720</span>    byte[] fam3 = Bytes.toBytes("fam3");<a name="line.2720"></a>
+<span class="sourceLineNo">2721</span>    byte[] fam4 = Bytes.toBytes("fam4");<a name="line.2721"></a>
+<span class="sourceLineNo">2722</span><a name="line.2722"></a>
+<span class="sourceLineNo">2723</span>    byte[][] families = { fam1, fam2, fam3, fam4 };<a name="line.2723"></a>
 <span class="sourceLineNo">2724</span><a name="line.2724"></a>
-<span class="sourceLineNo">2725</span>    Scan scan = null;<a name="line.2725"></a>
-<span class="sourceLineNo">2726</span>    HRegion.RegionScannerImpl is = null;<a name="line.2726"></a>
-<span class="sourceLineNo">2727</span><a name="line.2727"></a>
-<span class="sourceLineNo">2728</span>    // Testing to see how many scanners that is produced by getScanner,<a name="line.2728"></a>
-<span class="sourceLineNo">2729</span>    // starting<a name="line.2729"></a>
-<span class="sourceLineNo">2730</span>    // with known number, 2 - current = 1<a name="line.2730"></a>
-<span class="sourceLineNo">2731</span>    scan = new Scan();<a name="line.2731"></a>
-<span class="sourceLineNo">2732</span>    scan.addFamily(fam2);<a name="line.2732"></a>
-<span class="sourceLineNo">2733</span>    scan.addFamily(fam4);<a name="line.2733"></a>
-<span class="sourceLineNo">2734</span>    is = region.getScanner(scan);<a name="line.2734"></a>
-<span class="sourceLineNo">2735</span>    assertEquals(1, is.storeHeap.getHeap().size());<a name="line.2735"></a>
-<span class="sourceLineNo">2736</span><a name="line.2736"></a>
-<span class="sourceLineNo">2737</span>    scan = new Scan();<a name="line.2737"></a>
-<span class="sourceLineNo">2738</span>    is = region.getScanner(scan);<a name="line.2738"></a>
-<span class="sourceLineNo">2739</span>    assertEquals(families.length - 1, is.storeHeap.getHeap().size());<a name="line.2739"></a>
-<span class="sourceLineNo">2740</span>  }<a name="line.2740"></a>
-<span class="sourceLineNo">2741</span><a name="line.2741"></a>
-<span class="sourceLineNo">2742</span>  /**<a name="line.2742"></a>
-<span class="sourceLineNo">2743</span>   * This method tests https://issues.apache.org/jira/browse/HBASE-2516.<a name="line.2743"></a>
-<span class="sourceLineNo">2744</span>   *<a name="line.2744"></a>
-<span class="sourceLineNo">2745</span>   * @throws IOException<a name="line.2745"></a>
-<span class="sourceLineNo">2746</span>   */<a name="line.2746"></a>
-<span class="sourceLineNo">2747</span>  @Test<a name="line.2747"></a>
-<span class="sourceLineNo">2748</span>  public void testGetScanner_WithRegionClosed() throws IOException {<a name="line.2748"></a>
-<span class="sourceLineNo">2749</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2749"></a>
-<span class="sourceLineNo">2750</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2750"></a>
+<span class="sourceLineNo">2725</span>    // Setting up region<a name="line.2725"></a>
+<span class="sourceLineNo">2726</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2726"></a>
+<span class="sourceLineNo">2727</span>    // Putting data in Region<a name="line.2727"></a>
+<span class="sourceLineNo">2728</span>    Put put = new Put(row1);<a name="line.2728"></a>
+<span class="sourceLineNo">2729</span>    put.addColumn(fam1, null, null);<a name="line.2729"></a>
+<span class="sourceLineNo">2730</span>    put.addColumn(fam2, null, null);<a name="line.2730"></a>
+<span class="sourceLineNo">2731</span>    put.addColumn(fam3, null, null);<a name="line.2731"></a>
+<span class="sourceLineNo">2732</span>    put.addColumn(fam4, null, null);<a name="line.2732"></a>
+<span class="sourceLineNo">2733</span>    region.put(put);<a name="line.2733"></a>
+<span class="sourceLineNo">2734</span><a name="line.2734"></a>
+<span class="sourceLineNo">2735</span>    Scan scan = null;<a name="line.2735"></a>
+<span class="sourceLineNo">2736</span>    HRegion.RegionScannerImpl is = null;<a name="line.2736"></a>
+<span class="sourceLineNo">2737</span><a name="line.2737"></a>
+<span class="sourceLineNo">2738</span>    // Testing to see how many scanners that is produced by getScanner,<a name="line.2738"></a>
+<span class="sourceLineNo">2739</span>    // starting<a name="line.2739"></a>
+<span class="sourceLineNo">2740</span>    // with known number, 2 - current = 1<a name="line.2740"></a>
+<span class="sourceLineNo">2741</span>    scan = new Scan();<a name="line.2741"></a>
+<span class="sourceLineNo">2742</span>    scan.addFamily(fam2);<a name="line.2742"></a>
+<span class="sourceLineNo">2743</span>    scan.addFamily(fam4);<a name="line.2743"></a>
+<span class="sourceLineNo">2744</span>    is = region.getScanner(scan);<a name="line.2744"></a>
+<span class="sourceLineNo">2745</span>    assertEquals(1, is.storeHeap.getHeap().size());<a name="line.2745"></a>
+<span class="sourceLineNo">2746</span><a name="line.2746"></a>
+<span class="sourceLineNo">2747</span>    scan = new Scan();<a name="line.2747"></a>
+<span class="sourceLineNo">2748</span>    is = region.getScanner(scan);<a name="line.2748"></a>
+<span class="sourceLineNo">2749</span>    assertEquals(families.length - 1, is.storeHeap.getHeap().size());<a name="line.2749"></a>
+<span class="sourceLineNo">2750</span>  }<a name="line.2750"></a>
 <span class="sourceLineNo">2751</span><a name="line.2751"></a>
-<span class="sourceLineNo">2752</span>    byte[][] families = { fam1, fam2 };<a name="line.2752"></a>
-<span class="sourceLineNo">2753</span><a name="line.2753"></a>
-<span class="sourceLineNo">2754</span>    // Setting up region<a name="line.2754"></a>
-<span class="sourceLineNo">2755</span>    try {<a name="line.2755"></a>
-<span class="sourceLineNo">2756</span>      this.region = initHRegion(tableName, method, CONF, families);<a name="line.2756"></a>
-<span class="sourceLineNo">2757</span>    } catch (IOException e) {<a name="line.2757"></a>
-<span class="sourceLineNo">2758</span>      e.printStackTrace();<a name="line.2758"></a>
-<span class="sourceLineNo">2759</span>      fail("Got IOException during initHRegion, " + e.getMessage());<a name="line.2759"></a>
-<span class="sourceLineNo">2760</span>    }<a name="line.2760"></a>
-<span class="sourceLineNo">2761</span>    region.closed.set(true);<a name="line.2761"></a>
-<span class="sourceLineNo">2762</span>    try {<a name="line.2762"></a>
-<span class="sourceLineNo">2763</span>      region.getScanner(null);<a name="line.2763"></a>
-<span class="sourceLineNo">2764</span>      fail("Expected to get an exception during getScanner on a region that is closed");<a name="line.2764"></a>
-<span class="sourceLineNo">2765</span>    } catch (NotServingRegionException e) {<a name="line.2765"></a>
-<span class="sourceLineNo">2766</span>      // this is the correct exception that is expected<a name="line.2766"></a>
+<span class="sourceLineNo">2752</span>  /**<a name="line.2752"></a>
+<span class="sourceLineNo">2753</span>   * This method tests https://issues.apache.org/jira/browse/HBASE-2516.<a name="line.2753"></a>
+<span class="sourceLineNo">2754</span>   *<a name="line.2754"></a>
+<span class="sourceLineNo">2755</span>   * @throws IOException<a name="line.2755"></a>
+<span class="sourceLineNo">2756</span>   */<a name="line.2756"></a>
+<span class="sourceLineNo">2757</span>  @Test<a name="line.2757"></a>
+<span class="sourceLineNo">2758</span>  public void testGetScanner_WithRegionClosed() throws IOException {<a name="line.2758"></a>
+<span class="sourceLineNo">2759</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2759"></a>
+<span class="sourceLineNo">2760</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2760"></a>
+<span class="sourceLineNo">2761</span><a name="line.2761"></a>
+<span class="sourceLineNo">2762</span>    byte[][] families = { fam1, fam2 };<a name="line.2762"></a>
+<span class="sourceLineNo">2763</span><a name="line.2763"></a>
+<span class="sourceLineNo">2764</span>    // Setting up region<a name="line.2764"></a>
+<span class="sourceLineNo">2765</span>    try {<a name="line.2765"></a>
+<span class="sourceLineNo">2766</span>      this.region = initHRegion(tableName, method, CONF, families);<a name="line.2766"></a>
 <span class="sourceLineNo">2767</span>    } catch (IOException e) {<a name="line.2767"></a>
-<span class="sourceLineNo">2768</span>      fail("Got wrong type of exception - should be a NotServingRegionException, " +<a name="line.2768"></a>
-<span class="sourceLineNo">2769</span>          "but was an IOException: "<a name="line.2769"></a>
-<span class="sourceLineNo">2770</span>          + e.getMessage());<a name="line.2770"></a>
-<span class="sourceLineNo">2771</span>    }<a name="line.2771"></a>
-<span class="sourceLineNo">2772</span>  }<a name="line.2772"></a>
-<span class="sourceLineNo">2773</span><a name="line.2773"></a>
-<span class="sourceLineNo">2774</span>  @Test<a name="line.2774"></a>
-<span class="sourceLineNo">2775</span>  public void testRegionScanner_Next() throws IOException {<a name="line.2775"></a>
-<span class="sourceLineNo">2776</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2776"></a>
-<span class="sourceLineNo">2777</span>    byte[] row2 = Bytes.toBytes("row2");<a name="line.2777"></a>
-<span class="sourceLineNo">2778</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2778"></a>
-<span class="sourceLineNo">2779</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2779"></a>
-<span class="sourceLineNo">2780</span>    byte[] fam3 = Bytes.toBytes("fam3");<a name="line.2780"></a>
-<span class="sourceLineNo">2781</span>    byte[] fam4 = Bytes.toBytes("fam4");<a name="line.2781"></a>
-<span class="sourceLineNo">2782</span><a name="line.2782"></a>
-<span class="sourceLineNo">2783</span>    byte[][] families = { fam1, fam2, fam3, fam4 };<a name="line.2783"></a>
-<span class="sourceLineNo">2784</span>    long ts = System.currentTimeMillis();<a name="line.2784"></a>
-<span class="sourceLineNo">2785</span><a name="line.2785"></a>
-<span class="sourceLineNo">2786</span>    // Setting up region<a name="line.2786"></a>
-<span class="sourceLineNo">2787</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2787"></a>
-<span class="sourceLineNo">2788</span>    // Putting data in Region<a name="line.2788"></a>
-<span class="sourceLineNo">2789</span>    Put put = null;<a name="line.2789"></a>
-<span class="sourceLineNo">2790</span>    put = new Put(row1);<a name="line.2790"></a>
-<span class="sourceLineNo">2791</span>    put.addColumn(fam1, (byte[]) null, ts, null);<a name="line.2791"></a>
-<span class="sourceLineNo">2792</span>    put.addColumn(fam2, (byte[]) null, ts, null);<a name="line.2792"></a>
-<span class="sourceLineNo">2793</span>    put.addColumn(fam3, (byte[]) null, ts, null);<a name="line.2793"></a>
-<span class="sourceLineNo">2794</span>    put.addColumn(fam4, (byte[]) null, ts, null);<a name="line.2794"></a>
-<span class="sourceLineNo">2795</span>    region.put(put);<a name="line.2795"></a>
-<span class="sourceLineNo">2796</span><a name="line.2796"></a>
-<span class="sourceLineNo">2797</span>    put = new Put(row2);<a name="line.2797"></a>
-<span class="sourceLineNo">2798</span>    put.addColumn(fam1, (byte[]) null, ts, null);<a name="line.2798"></a>
-<span class="sourceLineNo">2799</span>    put.addColumn(fam2, (byte[]) null, ts, null);<a name="line.2799"></a>
-<span class="sourceLineNo">2800</span>    put.addColumn(fam3, (byte[]) null, ts, null);<a name="line.2800"></a>
-<span class="sourceLineNo">2801</span>    put.addColumn(fam4, (byte[]) null, ts, null);<a name="line.2801"></a>
-<span class="sourceLineNo">2802</span>    region.put(put);<a name="line.2802"></a>
-<span class="sourceLineNo">2803</span><a name="line.2803"></a>
-<span class="sourceLineNo">2804</span>    Scan scan = new Scan();<a name="line.2804"></a>
-<span class="sourceLineNo">2805</span>    scan.addFamily(fam2);<a name="line.2805"></a>
-<span class="sourceLineNo">2806</span>    scan.addFamily(fam4);<a name="line.2806"></a>
-<span class="sourceLineNo">2807</span>    InternalScanner is = region.getScanner(scan);<a name="line.2807"></a>
-<span class="sourceLineNo">2808</span><a name="line.2808"></a>
-<span class="sourceLineNo">2809</span>    List&lt;Cell&gt; res = null;<a name="line.2809"></a>
-<span class="sourceLineNo">2810</span><a name="line.2810"></a>
-<span class="sourceLineNo">2811</span>    // Result 1<a name="line.2811"></a>
-<span class="sourceLineNo">2812</span>    List&lt;Cell&gt; expected1 = new ArrayList&lt;&gt;();<a name="line.2812"></a>
-<span class="sourceLineNo">2813</span>    expected1.add(new KeyValue(row1, fam2, null, ts, KeyValue.Type.Put, null));<a name="line.2813"></a>
-<span class="sourceLineNo">2814</span>    expected1.add(new KeyValue(row1, fam4, null, ts, KeyValue.Type.Put, null));<a name="line.2814"></a>
-<span class="sourceLineNo">2815</span><a name="line.2815"></a>
-<span class="sourceLineNo">2816</span>    res = new ArrayList&lt;&gt;();<a name="line.2816"></a>
-<span class="sourceLineNo">2817</span>    is.next(res);<a name="line.2817"></a>
-<span class="sourceLineNo">2818</span>    for (int i = 0; i &lt; res.size(); i++) {<a name="line.2818"></a>
-<span class="sourceLineNo">2819</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected1.get(i), res.get(i)));<a name="line.2819"></a>
-<span class="sourceLineNo">2820</span>    }<a name="line.2820"></a>
-<span class="sourceLineNo">2821</span><a name="line.2821"></a>
-<span class="sourceLineNo">2822</span>    // Result 2<a name="line.2822"></a>
-<span class="sourceLineNo">2823</span>    List&lt;Cell&gt; expected2 = new ArrayList&lt;&gt;();<a name="line.2823"></a>
-<span class="sourceLineNo">2824</span>    expected2.add(new KeyValue(row2, fam2, null, ts, KeyValue.Type.Put, null));<a name="line.2824"></a>
-<span class="sourceLineNo">2825</span>    expected2.add(new KeyValue(row2, fam4, null, ts, KeyValue.Type.Put, null));<a name="line.2825"></a>
-<span class="sourceLineNo">2826</span><a name="line.2826"></a>
-<span class="sourceLineNo">2827</span>    res = new ArrayList&lt;&gt;();<a name="line.2827"></a>
-<span class="sourceLineNo">2828</span>    is.next(res);<a name="line.2828"></a>
-<span class="sourceLineNo">2829</span>    for (int i = 0; i &lt; res.size(); i++) {<a name="line.2829"></a>
-<span class="sourceLineNo">2830</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected2.get(i), res.get(i)));<a name="line.2830"></a>
-<span class="sourceLineNo">2831</span>    }<a name="line.2831"></a>
-<span class="sourceLineNo">2832</span>  }<a name="line.2832"></a>
-<span class="sourceLineNo">2833</span><a name="line.2833"></a>
-<span class="sourceLineNo">2834</span>  @Test<a name="line.2834"></a>
-<span class="sourceLineNo">2835</span>  public void testScanner_ExplicitColumns_FromMemStore_EnforceVersions() throws IOException {<a name="line.2835"></a>
-<span class="sourceLineNo">2836</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2836"></a>
-<span class="sourceLineNo">2837</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.2837"></a>
-<span class="sourceLineNo">2838</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.2838"></a>
-<span class="sourceLineNo">2839</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2839"></a>
-<span class="sourceLineNo">2840</span>    byte[][] families = { fam1 };<a name="line.2840"></a>
-<span class="sourceLineNo">2841</span><a name="line.2841"></a>
-<span class="sourceLineNo">2842</span>    long ts1 = System.currentTimeMillis();<a name="line.2842"></a>
-<span class="sourceLineNo">2843</span>    long ts2 = ts1 + 1;<a name="line.2843"></a>
-<span class="sourceLineNo">2844</span>    long ts3 = ts1 + 2;<a name="line.2844"></a>
-<span class="sourceLineNo">2845</span><a name="line.2845"></a>
-<span class="sourceLineNo">2846</span>    // Setting up region<a name="line.2846"></a>
-<span class="sourceLineNo">2847</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2847"></a>
-<span class="sourceLineNo">2848</span>    // Putting data in Region<a name="line.2848"></a>
-<span class="sourceLineNo">2849</span>    Put put = null;<a name="line.2849"></a>
-<span class="sourceLineNo">2850</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.2850"></a>
-<span class="sourceLineNo">2851</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.2851"></a>
-<span class="sourceLineNo">2852</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.2852"></a>
-<span class="sourceLineNo">2853</span><a name="line.2853"></a>
-<span class="sourceLineNo">2854</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.2854"></a>
-<span class="sourceLineNo">2855</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.2855"></a>
-<span class="sourceLineNo">2856</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.2856"></a>
-<span class="sourceLineNo">2857</span><a name="line.2857"></a>
-<span class="sourceLineNo">2858</span>    put = new Put(row1);<a name="line.2858"></a>
-<span class="sourceLineNo">2859</span>    put.add(kv13);<a name="line.2859"></a>
-<span class="sourceLineNo">2860</span>    put.add(kv12);<a name="line.2860"></a>
-<span class="sourceLineNo">2861</span>    put.add(kv11);<a name="line.2861"></a>
-<span class="sourceLineNo">2862</span>    put.add(kv23);<a name="line.2862"></a>
-<span class="sourceLineNo">2863</span>    put.add(kv22);<a name="line.2863"></a>
-<span class="sourceLineNo">2864</span>    put.add(kv21);<a name="line.2864"></a>
-<span class="sourceLineNo">2865</span>    region.put(put);<a name="line.2865"></a>
-<span class="sourceLineNo">2866</span><a name="line.2866"></a>
-<span class="sourceLineNo">2867</span>    // Expected<a name="line.2867"></a>
-<span class="sourceLineNo">2868</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.2868"></a>
-<span class="sourceLineNo">2869</span>    expected.add(kv13);<a name="line.2869"></a>
-<span class="sourceLineNo">2870</span>    expected.add(kv12);<a name="line.2870"></a>
-<span class="sourceLineNo">2871</span><a name="line.2871"></a>
-<span class="sourceLineNo">2872</span>    Scan scan = new Scan(row1);<a name="line.2872"></a>
-<span class="sourceLineNo">2873</span>    scan.addColumn(fam1, qf1);<a name="line.2873"></a>
-<span class="sourceLineNo">2874</span>    scan.setMaxVersions(MAX_VERSIONS);<a name="line.2874"></a>
-<span class="sourceLineNo">2875</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.2875"></a>
-<span class="sourceLineNo">2876</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.2876"></a>
-<span class="sourceLineNo">2877</span><a name="line.2877"></a>
-<span class="sourceLineNo">2878</span>    boolean hasNext = scanner.next(actual);<a name="line.2878"></a>
-<span class="sourceLineNo">2879</span>    assertEquals(false, hasNext);<a name="line.2879"></a>
-<span class="sourceLineNo">2880</span><a name="line.2880"></a>
-<span class="sourceLineNo">2881</span>    // Verify result<a name="line.2881"></a>
-<span class="sourceLineNo">2882</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.2882"></a>
-<span class="sourceLineNo">2883</span>      assertEquals(expected.get(i), actual.get(i));<a name="line.2883"></a>
-<span class="sourceLineNo">2884</span>    }<a name="line.2884"></a>
-<span class="sourceLineNo">2885</span>  }<a name="line.2885"></a>
-<span class="sourceLineNo">2886</span><a name="line.2886"></a>
-<span class="sourceLineNo">2887</span>  @Test<a name="line.2887"></a>
-<span class="sourceLineNo">2888</span>  public void testScanner_ExplicitColumns_FromFilesOnly_EnforceVersions() throws IOException {<a name="line.2888"></a>
-<span class="sourceLineNo">2889</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2889"></a>
-<span class="sourceLineNo">2890</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.2890"></a>
-<span class="sourceLineNo">2891</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.2891"></a>
-<span class="sourceLineNo">2892</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2892"></a>
-<span class="sourceLineNo">2893</span>    byte[][] families = { fam1 };<a name="line.2893"></a>
-<span class="sourceLineNo">2894</span><a name="line.2894"></a>
-<span class="sourceLineNo">2895</span>    long ts1 = 1; // System.currentTimeMillis();<a name="line.2895"></a>
-<span class="sourceLineNo">2896</span>    long ts2 = ts1 + 1;<a name="line.2896"></a>
-<span class="sourceLineNo">2897</span>    long ts3 = ts1 + 2;<a name="line.2897"></a>
-<span class="sourceLineNo">2898</span><a name="line.2898"></a>
-<span class="sourceLineNo">2899</span>    // Setting up region<a name="line.2899"></a>
-<span class="sourceLineNo">2900</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2900"></a>
-<span class="sourceLineNo">2901</span>    // Putting data in Region<a name="line.2901"></a>
-<span class="sourceLineNo">2902</span>    Put put = null;<a name="line.2902"></a>
-<span class="sourceLineNo">2903</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.2903"></a>
-<span class="sourceLineNo">2904</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.2904"></a>
-<span class="sourceLineNo">2905</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.2905"></a>
-<span class="sourceLineNo">2906</span><a name="line.2906"></a>
-<span class="sourceLineNo">2907</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.2907"></a>
-<span class="sourceLineNo">2908</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.2908"></a>
-<span class="sourceLineNo">2909</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.2909"></a>
-<span class="sourceLineNo">2910</span><a name="line.2910"></a>
-<span class="sourceLineNo">2911</span>    put = new Put(row1);<a name="line.2911"></a>
-<span class="sourceLineNo">2912</span>    put.add(kv13);<a name="line.2912"></a>
-<span class="sourceLineNo">2913</span>    put.add(kv12);<a name="line.2913"></a>
-<span class="sourceLineNo">2914</span>    put.add(kv11);<a name="line.2914"></a>
-<span class="sourceLineNo">2915</span>    put.add(kv23);<a name="line.2915"></a>
-<span class="sourceLineNo">2916</span>    put.add(kv22);<a name="line.2916"></a>
-<span class="sourceLineNo">2917</span>    put.add(kv21);<a name="line.2917"></a>
-<span class="sourceLineNo">2918</span>    region.put(put);<a name="line.2918"></a>
-<span class="sourceLineNo">2919</span>    region.flush(true);<a name="line.2919"></a>
+<span class="sourceLineNo">2768</span>      e.printStackTrace();<a name="line.2768"></a>
+<span class="sourceLineNo">2769</span>      fail("Got IOException during initHRegion, " + e.getMessage());<a name="line.2769"></a>
+<span class="sourceLineNo">2770</span>    }<a name="line.2770"></a>
+<span class="sourceLineNo">2771</span>    region.closed.set(true);<a name="line.2771"></a>
+<span class="sourceLineNo">2772</span>    try {<a name="line.2772"></a>
+<span class="sourceLineNo">2773</span>      region.getScanner(null);<a name="line.2773"></a>
+<span class="sourceLineNo">2774</span>      fail("Expected to get an exception during getScanner on a region that is closed");<a name="line.2774"></a>
+<span class="sourceLineNo">2775</span>    } catch (NotServingRegionException e) {<a name="line.2775"></a>
+<span class="sourceLineNo">2776</span>      // this is the correct exception that is expected<a name="line.2776"></a>
+<span class="sourceLineNo">2777</span>    } catch (IOException e) {<a name="line.2777"></a>
+<span class="sourceLineNo">2778</span>      fail("Got wrong type of exception - should be a NotServingRegionException, " +<a name="line.2778"></a>
+<span class="sourceLineNo">2779</span>          "but was an IOException: "<a name="line.2779"></a>
+<span class="sourceLineNo">2780</span>          + e.getMessage());<a name="line.2780"></a>
+<span class="sourceLineNo">2781</span>    }<a name="line.2781"></a>
+<span class="sourceLineNo">2782</span>  }<a name="line.2782"></a>
+<span class="sourceLineNo">2783</span><a name="line.2783"></a>
+<span class="sourceLineNo">2784</span>  @Test<a name="line.2784"></a>
+<span class="sourceLineNo">2785</span>  public void testRegionScanner_Next() throws IOException {<a name="line.2785"></a>
+<span class="sourceLineNo">2786</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2786"></a>
+<span class="sourceLineNo">2787</span>    byte[] row2 = Bytes.toBytes("row2");<a name="line.2787"></a>
+<span class="sourceLineNo">2788</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2788"></a>
+<span class="sourceLineNo">2789</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2789"></a>
+<span class="sourceLineNo">2790</span>    byte[] fam3 = Bytes.toBytes("fam3");<a name="line.2790"></a>
+<span class="sourceLineNo">2791</span>    byte[] fam4 = Bytes.toBytes("fam4");<a name="line.2791"></a>
+<span class="sourceLineNo">2792</span><a name="line.2792"></a>
+<span class="sourceLineNo">2793</span>    byte[][] families = { fam1, fam2, fam3, fam4 };<a name="line.2793"></a>
+<span class="sourceLineNo">2794</span>    long ts = System.currentTimeMillis();<a name="line.2794"></a>
+<span class="sourceLineNo">2795</span><a name="line.2795"></a>
+<span class="sourceLineNo">2796</span>    // Setting up region<a name="line.2796"></a>
+<span class="sourceLineNo">2797</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2797"></a>
+<span class="sourceLineNo">2798</span>    // Putting data in Region<a name="line.2798"></a>
+<span class="sourceLineNo">2799</span>    Put put = null;<a name="line.2799"></a>
+<span class="sourceLineNo">2800</span>    put = new Put(row1);<a name="line.2800"></a>
+<span class="sourceLineNo">2801</span>    put.addColumn(fam1, (byte[]) null, ts, null);<a name="line.2801"></a>
+<span class="sourceLineNo">2802</span>    put.addColumn(fam2, (byte[]) null, ts, null);<a name="line.2802"></a>
+<span class="sourceLineNo">2803</span>    put.addColumn(fam3, (byte[]) null, ts, null);<a name="line.2803"></a>
+<span class="sourceLineNo">2804</span>    put.addColumn(fam4, (byte[]) null, ts, null);<a name="line.2804"></a>
+<span class="sourceLineNo">2805</span>    region.put(put);<a name="line.2805"></a>
+<span class="sourceLineNo">2806</span><a name="line.2806"></a>
+<span class="sourceLineNo">2807</span>    put = new Put(row2);<a name="line.2807"></a>
+<span class="sourceLineNo">2808</span>    put.addColumn(fam1, (byte[]) null, ts, null);<a name="line.2808"></a>
+<span class="sourceLineNo">2809</span>    put.addColumn(fam2, (byte[]) null, ts, null);<a name="line.2809"></a>
+<span class="sourceLineNo">2810</span>    put.addColumn(fam3, (byte[]) null, ts, null);<a name="line.2810"></a>
+<span class="sourceLineNo">2811</span>    put.addColumn(fam4, (byte[]) null, ts, null);<a name="line.2811"></a>
+<span class="sourceLineNo">2812</span>    region.put(put);<a name="line.2812"></a>
+<span class="sourceLineNo">2813</span><a name="line.2813"></a>
+<span class="sourceLineNo">2814</span>    Scan scan = new Scan();<a name="line.2814"></a>
+<span class="sourceLineNo">2815</span>    scan.addFamily(fam2);<a name="line.2815"></a>
+<span class="sourceLineNo">2816</span>    scan.addFamily(fam4);<a name="line.2816"></a>
+<span class="sourceLineNo">2817</span>    InternalScanner is = region.getScanner(scan);<a name="line.2817"></a>
+<span class="sourceLineNo">2818</span><a name="line.2818"></a>
+<span class="sourceLineNo">2819</span>    List&lt;Cell&gt; res = null;<a name="line.2819"></a>
+<span class="sourceLineNo">2820</span><a name="line.2820"></a>
+<span class="sourceLineNo">2821</span>    // Result 1<a name="line.2821"></a>
+<span class="sourceLineNo">2822</span>    List&lt;Cell&gt; expected1 = new ArrayList&lt;&gt;();<a name="line.2822"></a>
+<span class="sourceLineNo">2823</span>    expected1.add(new KeyValue(row1, fam2, null, ts, KeyValue.Type.Put, null));<a name="line.2823"></a>
+<span class="sourceLineNo">2824</span>    expected1.add(new KeyValue(row1, fam4, null, ts, KeyValue.Type.Put, null));<a name="line.2824"></a>
+<span class="sourceLineNo">2825</span><a name="line.2825"></a>
+<span class="sourceLineNo">2826</span>    res = new ArrayList&lt;&gt;();<a name="line.2826"></a>
+<span class="sourceLineNo">2827</span>    is.next(res);<a name="line.2827"></a>
+<span class="sourceLineNo">2828</span>    for (int i = 0; i &lt; res.size(); i++) {<a name="line.2828"></a>
+<span class="sourceLineNo">2829</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected1.get(i), res.get(i)));<a name="line.2829"></a>
+<span class="sourceLineNo">2830</span>    }<a name="line.2830"></a>
+<span class="sourceLineNo">2831</span><a name="line.2831"></a>
+<span class="sourceLineNo">2832</span>    // Result 2<a name="line.2832"></a>
+<span class="sourceLineNo">2833</span>    List&lt;Cell&gt; expected2 = new ArrayList&lt;&gt;();<a name="line.2833"></a>
+<span class="sourceLineNo">2834</span>    expected2.add(new KeyValue(row2, fam2, null, ts, KeyValue.Type.Put, null));<a name="line.2834"></a>
+<span class="sourceLineNo">2835</span>    expected2.add(new KeyValue(row2, fam4, null, ts, KeyValue.Type.Put, null));<a name="line.2835"></a>
+<span class="sourceLineNo">2836</span><a name="line.2836"></a>
+<span class="sourceLineNo">2837</span>    res = new ArrayList&lt;&gt;();<a name="line.2837"></a>
+<span class="sourceLineNo">2838</span>    is.next(res);<a name="line.2838"></a>
+<span class="sourceLineNo">2839</span>    for (int i = 0; i &lt; res.size(); i++) {<a name="line.2839"></a>
+<span class="sourceLineNo">2840</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected2.get(i), res.get(i)));<a name="line.2840"></a>
+<span class="sourceLineNo">2841</span>    }<a name="line.2841"></a>
+<span class="sourceLineNo">2842</span>  }<a name="line.2842"></a>
+<span class="sourceLineNo">2843</span><a name="line.2843"></a>
+<span class="sourceLineNo">2844</span>  @Test<a name="line.2844"></a>
+<span class="sourceLineNo">2845</span>  public void testScanner_ExplicitColumns_FromMemStore_EnforceVersions() throws IOException {<a name="line.2845"></a>
+<span class="sourceLineNo">2846</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2846"></a>
+<span class="sourceLineNo">2847</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.2847"></a>
+<span class="sourceLineNo">2848</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.2848"></a>
+<span class="sourceLineNo">2849</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2849"></a>
+<span class="sourceLineNo">2850</span>    byte[][] families = { fam1 };<a name="line.2850"></a>
+<span class="sourceLineNo">2851</span><a name="line.2851"></a>
+<span class="sourceLineNo">2852</span>    long ts1 = System.currentTimeMillis();<a name="line.2852"></a>
+<span class="sourceLineNo">2853</span>    long ts2 = ts1 + 1;<a name="line.2853"></a>
+<span class="sourceLineNo">2854</span>    long ts3 = ts1 + 2;<a name="line.2854"></a>
+<span class="sourceLineNo">2855</span><a name="line.2855"></a>
+<span class="sourceLineNo">2856</span>    // Setting up region<a name="line.2856"></a>
+<span class="sourceLineNo">2857</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2857"></a>
+<span class="sourceLineNo">2858</span>    // Putting data in Region<a name="line.2858"></a>
+<span class="sourceLineNo">2859</span>    Put put = null;<a name="line.2859"></a>
+<span class="sourceLineNo">2860</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.2860"></a>
+<span class="sourceLineNo">2861</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.2861"></a>
+<span class="sourceLineNo">2862</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.2862"></a>
+<span class="sourceLineNo">2863</span><a name="line.2863"></a>
+<span class="sourceLineNo">2864</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.2864"></a>
+<span class="sourceLineNo">2865</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.2865"></a>
+<span class="sourceLineNo">2866</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.2866"></a>
+<span class="sourceLineNo">2867</span><a name="line.2867"></a>
+<span class="sourceLineNo">2868</span>    put = new Put(row1);<a name="line.2868"></a>
+<span class="sourceLineNo">2869</span>    put.add(kv13);<a name="line.2869"></a>
+<span class="sourceLineNo">2870</span>    put.add(kv12);<a name="line.2870"></a>
+<span class="sourceLineNo">2871</span>    put.add(kv11);<a name="line.2871"></a>
+<span class="sourceLineNo">2872</span>    put.add(kv23);<a name="line.2872"></a>
+<span class="sourceLineNo">2873</span>    put.add(kv22);<a name="line.2873"></a>
+<span class="sourceLineNo">2874</span>    put.add(kv21);<a name="line.2874"></a>
+<span class="sourceLineNo">2875</span>    region.put(put);<a name="line.2875"></a>
+<span class="sourceLineNo">2876</span><a name="line.2876"></a>
+<span class="sourceLineNo">2877</span>    // Expected<a name="line.2877"></a>
+<span class="sourceLineNo">2878</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.2878"></a>
+<span class="sourceLineNo">2879</span>    expected.add(kv13);<a name="line.2879"></a>
+<span class="sourceLineNo">2880</span>    expected.add(kv12);<a name="line.2880"></a>
+<span class="sourceLineNo">2881</span><a name="line.2881"></a>
+<span class="sourceLineNo">2882</span>    Scan scan = new Scan(row1);<a name="line.2882"></a>
+<span class="sourceLineNo">2883</span>    scan.addColumn(fam1, qf1);<a name="line.2883"></a>
+<span class="sourceLineNo">2884</span>    scan.setMaxVersions(MAX_VERSIONS);<a name="line.2884"></a>
+<span class="sourceLineNo">2885</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.2885"></a>
+<span class="sourceLineNo">2886</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.2886"></a>
+<span class="sourceLineNo">2887</span><a name="line.2887"></a>
+<span class="sourceLineNo">2888</span>    boolean hasNext = scanner.next(actual);<a name="line.2888"></a>
+<span class="sourceLineNo">2889</span>    assertEquals(false, hasNext);<a name="line.2889"></a>
+<span class="sourceLineNo">2890</span><a name="line.2890"></a>
+<span class="sourceLineNo">2891</span>    // Verify result<a name="line.2891"></a>
+<span class="sourceLineNo">2892</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.2892"></a>
+<span class="sourceLineNo">2893</span>      assertEquals(expected.get(i), actual.get(i));<a name="line.2893"></a>
+<span class="sourceLineNo">2894</span>    }<a name="line.2894"></a>
+<span class="sourceLineNo">2895</span>  }<a name="line.2895"></a>
+<span class="sourceLineNo">2896</span><a name="line.2896"></a>
+<span class="sourceLineNo">2897</span>  @Test<a name="line.2897"></a>
+<span class="sourceLineNo">2898</span>  public void testScanner_ExplicitColumns_FromFilesOnly_EnforceVersions() throws IOException {<a name="line.2898"></a>
+<span class="sourceLineNo">2899</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2899"></a>
+<span class="sourceLineNo">2900</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.2900"></a>
+<span class="sourceLineNo">2901</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.2901"></a>
+<span class="sourceLineNo">2902</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2902"></a>
+<span class="sourceLineNo">2903</span>    byte[][] families = { fam1 };<a name="line.2903"></a>
+<span class="sourceLineNo">2904</span><a name="line.2904"></a>
+<span class="sourceLineNo">2905</span>    long ts1 = 1; // System.currentTimeMillis();<a name="line.2905"></a>
+<span class="sourceLineNo">2906</span>    long ts2 = ts1 + 1;<a name="line.2906"></a>
+<span class="sourceLineNo">2907</span>    long ts3 = ts1 + 2;<a name="line.2907"></a>
+<span class="sourceLineNo">2908</span><a name="line.2908"></a>
+<span class="sourceLineNo">2909</span>    // Setting up region<a name="line.2909"></a>
+<span class="sourceLineNo">2910</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2910"></a>
+<span class="sourceLineNo">2911</span>    // Putting data in Region<a name="line.2911"></a>
+<span class="sourceLineNo">2912</span>    Put put = null;<a name="line.2912"></a>
+<span class="sourceLineNo">2913</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.2913"></a>
+<span class="sourceLineNo">2914</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.2914"></a>
+<span class="sourceLineNo">2915</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.2915"></a>
+<span class="sourceLineNo">2916</span><a name="line.2916"></a>
+<span class="sourceLineNo">2917</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.2917"></a>
+<span class="sourceLineNo">2918</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.2918"></a>
+<span class="sourceLineNo">2919</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.2919"></a>
 <span class="sourceLineNo">2920</span><a name="line.2920"></a>
-<span class="sourceLineNo">2921</span>    // Expected<a name="line.2921"></a>
-<span class="sourceLineNo">2922</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.2922"></a>
-<span class="sourceLineNo">2923</span>    expected.add(kv13);<a name="line.2923"></a>
-<span class="sourceLineNo">2924</span>    expected.add(kv12);<a name="line.2924"></a>
-<span class="sourceLineNo">2925</span>    expected.add(kv23);<a name="line.2925"></a>
-<span class="sourceLineNo">2926</span>    expected.add(kv22);<a name="line.2926"></a>
-<span class="sourceLineNo">2927</span><a name="line.2927"></a>
-<span class="sourceLineNo">2928</span>    Scan scan = new Scan(row1);<a name="line.2928"></a>
-<span class="sourceLineNo">2929</span>    scan.addColumn(fam1, qf1);<a name="line.2929"></a>
-<span class="sourceLineNo">2930</span>    scan.addColumn(fam1, qf2);<a name="line.2930"></a>
-<span class="sourceLineNo">2931</span>    scan.setMaxVersions(MAX_VERSIONS);<a name="line.2931"></a>
-<span class="sourceLineNo">2932</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.2932"></a>
-<span class="sourceLineNo">2933</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.2933"></a>
-<span class="sourceLineNo">2934</span><a name="line.2934"></a>
-<span class="sourceLineNo">2935</span>    boolean hasNext = scanner.next(actual);<a name="line.2935"></a>
-<span class="sourceLineNo">2936</span>    assertEquals(false, hasNext);<a name="line.2936"></a>
+<span class="sourceLineNo">2921</span>    put = new Put(row1);<a name="line.2921"></a>
+<span class="sourceLineNo">2922</span>    put.add(kv13);<a name="line.2922"></a>
+<span class="sourceLineNo">2923</span>    put.add(kv12);<a name="line.2923"></a>
+<span class="sourceLineNo">2924</span>    put.add(kv11);<a name="line.2924"></a>
+<span class="sourceLineNo">2925</span>    put.add(kv23);<a name="line.2925"></a>
+<span class="sourceLineNo">2926</span>    put.add(kv22);<a name="line.2926"></a>
+<span class="sourceLineNo">2927</span>    put.add(kv21);<a name="line.2927"></a>
+<span class="sourceLineNo">2928</span>    region.put(put);<a name="line.2928"></a>
+<span class="sourceLineNo">2929</span>    region.flush(true);<a name="line.2929"></a>
+<span class="sourceLineNo">2930</span><a name="line.2930"></a>
+<span class="sourceLineNo">2931</span>    // Expected<a name="line.2931"></a>
+<span class="sourceLineNo">2932</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.2932"></a>
+<span class="sourceLineNo">2933</span>    expected.add(kv13);<a name="line.2933"></a>
+<span class="sourceLineNo">2934</span>    expected.add(kv12);<a name="line.2934"></a>
+<span class="sourceLineNo">2935</span>    expected.add(kv23);<a name="line.2935"></a>
+<span class="sourceLineNo">2936</span>    expected.add(kv22);<a name="line.2936"></a>
 <span class="sourceLineNo">2937</span><a name="line.2937"></a>
-<span class="sourceLineNo">2938</span>    // Verify result<a name="line.2938"></a>
-<span class="sourceLineNo">2939</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.2939"></a>
-<span class="sourceLineNo">2940</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected.get(i), actual.get(i)));<a name="line.2940"></a>
-<span class="sourceLineNo">2941</span>    }<a name="line.2941"></a>
-<span class="sourceLineNo">2942</span>  }<a name="line.2942"></a>
-<span class="sourceLineNo">2943</span><a name="line.2943"></a>
-<span class="sourceLineNo">2944</span>  @Test<a name="line.2944"></a>
-<span class="sourceLineNo">2945</span>  public void testScanner_ExplicitColumns_FromMemStoreAndFiles_EnforceVersions() throws<a name="line.2945"></a>
-<span class="sourceLineNo">2946</span>      IOException {<a name="line.2946"></a>
-<span class="sourceLineNo">2947</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2947"></a>
-<span class="sourceLineNo">2948</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2948"></a>
-<span class="sourceLineNo">2949</span>    byte[][] families = { fam1 };<a name="line.2949"></a>
-<span class="sourceLineNo">2950</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.2950"></a>
-<span class="sourceLineNo">2951</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.2951"></a>
-<span class="sourceLineNo">2952</span><a name="line.2952"></a>
-<span class="sourceLineNo">2953</span>    long ts1 = 1;<a name="line.2953"></a>
-<span class="sourceLineNo">2954</span>    long ts2 = ts1 + 1;<a name="line.2954"></a>
-<span class="sourceLineNo">2955</span>    long ts3 = ts1 + 2;<a name="line.2955"></a>
-<span class="sourceLineNo">2956</span>    long ts4 = ts1 + 3;<a name="line.2956"></a>
-<span class="sourceLineNo">2957</span><a name="line.2957"></a>
-<span class="sourceLineNo">2958</span>    // Setting up region<a name="line.2958"></a>
-<span class="sourceLineNo">2959</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2959"></a>
-<span class="sourceLineNo">2960</span>    // Putting data in Region<a name="line.2960"></a>
-<span class="sourceLineNo">2961</span>    KeyValue kv14 = new KeyValue(row1, fam1, qf1, ts4, KeyValue.Type.Put, null);<a name="line.2961"></a>
-<span class="sourceLineNo">2962</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.2962"></a>
-<span class="sourceLineNo">2963</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.2963"></a>
-<span class="sourceLineNo">2964</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.2964"></a>
-<span class="sourceLineNo">2965</span><a name="line.2965"></a>
-<span class="sourceLineNo">2966</span>    KeyValue kv24 = new KeyValue(row1, fam1, qf2, ts4, KeyValue.Type.Put, null);<a name="line.2966"></a>
-<span class="sourceLineNo">2967</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.2967"></a>
-<span class="sourceLineNo">2968</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.2968"></a>
-<span class="sourceLineNo">2969</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.2969"></a>
-<span class="sourceLineNo">2970</span><a name="line.2970"></a>
-<span class="sourceLineNo">2971</span>    Put put = null;<a name="line.2971"></a>
-<span class="sourceLineNo">2972</span>    put = new Put(row1);<a name="line.2972"></a>
-<span class="sourceLineNo">2973</span>    put.add(kv14);<a name="line.2973"></a>
-<span class="sourceLineNo">2974</span>    put.add(kv24);<a name="line.2974"></a>
-<span class="sourceLineNo">2975</span>    region.put(put);<a name="line.2975"></a>
-<span class="sourceLineNo">2976</span>    region.flush(true);<a name="line.2976"></a>
-<span class="sourceLineNo">2977</span><a name="line.2977"></a>
-<span class="sourceLineNo">2978</span>    put = new Put(row1);<a name="line.2978"></a>
-<span class="sourceLineNo">2979</span>    put.add(kv23);<a name="line.2979"></a>
-<span class="sourceLineNo">2980</span>    put.add(kv13);<a name="line.2980"></a>
-<span class="sourceLineNo">2981</span>    region.put(put);<a name="line.2981"></a>
-<span class="sourceLineNo">2982</span>    region.flush(true);<a name="line.2982"></a>
-<span class="sourceLineNo">2983</span><a name="line.2983"></a>
-<span class="sourceLineNo">2984</span>    put = new Put(row1);<a name="line.2984"></a>
-<span class="sourceLineNo">2985</span>    put.add(kv22);<a name="line.2985"></a>
-<span class="sourceLineNo">2986</span>    put.add(kv12);<a name="line.2986"></a>
-<span class="sourceLineNo">2987</span>    region.put(put);<a name="line.2987"></a>
-<span class="sourceLineNo">2988</span>    region.flush(true);<a name="line.2988"></a>
-<span class="sourceLineNo">2989</span><a name="line.2989"></a>
-<span class="sourceLineNo">2990</span>    put = new Put(row1);<a name="line.2990"></a>
-<span class="sourceLineNo">2991</span>    put.add(kv21);<a name="line.2991"></a>
-<span class="sourceLineNo">2992</span>    put.add(kv11);<a name="line.2992"></a>
-<span class="sourceLineNo">2993</span>    region.put(put);<a name="line.2993"></a>
-<span class="sourceLineNo">2994</span><a name="line.2994"></a>
-<span class="sourceLineNo">2995</span>    // Expected<a name="line.2995"></a>
-<span class="sourceLineNo">2996</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.2996"></a>
-<span class="sourceLineNo">2997</span>    expected.add(kv14);<a name="line.2997"></a>
-<span class="sourceLineNo">2998</span>    expected.add(kv13);<a name="line.2998"></a>
-<span class="sourceLineNo">2999</span>    expected.add(kv12);<a name="line.2999"></a>
-<span class="sourceLineNo">3000</span>    expected.add(kv24);<a name="line.3000"></a>
-<span class="sourceLineNo">3001</span>    expected.add(kv23);<a name="line.3001"></a>
-<span class="sourceLineNo">3002</span>    expected.add(kv22);<a name="line.3002"></a>
-<span class="sourceLineNo">3003</span><a name="line.3003"></a>
-<span class="sourceLineNo">3004</span>    Scan scan = new Scan(row1);<a name="line.3004"></a>
-<span class="sourceLineNo">3005</span>    scan.addColumn(fam1, qf1);<a name="line.3005"></a>
-<span class="sourceLineNo">3006</span>    scan.addColumn(fam1, qf2);<a name="line.3006"></a>
-<span class="sourceLineNo">3007</span>    int versions = 3;<a name="line.3007"></a>
-<span class="sourceLineNo">3008</span>    scan.setMaxVersions(versions);<a name="line.3008"></a>
-<span class="sourceLineNo">3009</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.3009"></a>
-<span class="sourceLineNo">3010</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.3010"></a>
-<span class="sourceLineNo">3011</span><a name="line.3011"></a>
-<span class="sourceLineNo">3012</span>    boolean hasNext = scanner.next(actual);<a name="line.3012"></a>
-<span class="sourceLineNo">3013</span>    assertEquals(false, hasNext);<a name="line.3013"></a>
-<span class="sourceLineNo">3014</span><a name="line.3014"></a>
-<span class="sourceLineNo">3015</span>    // Verify result<a name="line.3015"></a>
-<span class="sourceLineNo">3016</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.3016"></a>
-<span class="sourceLineNo">3017</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected.get(i), actual.get(i)));<a name="line.3017"></a>
-<span class="sourceLineNo">3018</span>    }<a name="line.3018"></a>
-<span class="sourceLineNo">3019</span>  }<a name="line.3019"></a>
-<span class="sourceLineNo">3020</span><a name="line.3020"></a>
-<span class="sourceLineNo">3021</span>  @Test<a name="line.3021"></a>
-<span class="sourceLineNo">3022</span>  public void testScanner_Wildcard_FromMemStore_EnforceVersions() throws IOException {<a name="line.3022"></a>
-<span class="sourceLineNo">3023</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.3023"></a>
-<span class="sourceLineNo">3024</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.3024"></a>
-<span class="sourceLineNo">3025</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.3025"></a>
-<span class="sourceLineNo">3026</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.3026"></a>
-<span class="sourceLineNo">3027</span>    byte[][] families = { fam1 };<a name="line.3027"></a>
-<span class="sourceLineNo">3028</span><a name="line.3028"></a>
-<span class="sourceLineNo">3029</span>    long ts1 = System.currentTimeMillis();<a name="line.3029"></a>
-<span class="sourceLineNo">3030</span>    long ts2 = ts1 + 1;<a name="line.3030"></a>
-<span class="sourceLineNo">3031</span>    long ts3 = ts1 + 2;<a name="line.3031"></a>
-<span class="sourceLineNo">3032</span><a name="line.3032"></a>
-<span class="sourceLineNo">3033</span>    // Setting up region<a name="line.3033"></a>
-<span class="sourceLineNo">3034</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.3034"></a>
-<span class="sourceLineNo">3035</span>    // Putting data in Region<a name="line.3035"></a>
-<span class="sourceLineNo">3036</span>    Put put = null;<a name="line.3036"></a>
-<span class="sourceLineNo">3037</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.3037"></a>
-<span class="sourceLineNo">3038</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.3038"></a>
-<span class="sourceLineNo">3039</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.3039"></a>
-<span class="sourceLineNo">3040</span><a name="line.3040"></a>
-<span class="sourceLineNo">3041</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.3041"></a>
-<span class="sourceLineNo">3042</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.3042"></a>
-<span class="sourceLineNo">3043</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.3043"></a>
-<span class="sourceLineNo">3044</span><a name="line.3044"></a>
-<span class="sourceLineNo">3045</span>    put = new Put(row1);<a name="line.3045"></a>
-<span class="sourceLineNo">3046</span>    put.add(kv13);<a name="line.3046"></a>
-<span class="sourceLineNo">3047</span>    put.add(kv12);<a name="line.3047"></a>
-<span class="sourceLineNo">3048</span>    put.add(kv11);<a name="line.3048"></a>
-<span class="sourceLineNo">3049</span>    put.add(kv23);<a name="line.3049"></a>
-<span class="sourceLineNo">3050</span>    put.add(kv22);<a name="line.3050"></a>
-<span class="sourceLineNo">3051</span>    put.add(kv21);<a name="line.3051"></a>
-<span class="sourceLineNo">3052</span>    region.put(put);<a name="line.3052"></a>
-<span class="sourceLineNo">3053</span><a name="line.3053"></a>
-<span class="sourceLineNo">3054</span>    // Expected<a name="line.3054"></a>
-<span class="sourceLineNo">3055</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.3055"></a>
-<span class="sourceLineNo">3056</span>    expected.add(kv13);<a name="line.3056"></a>
-<span class="sourceLineNo">3057</span>    expected.add(kv12);<a name="line.3057"></a>
-<span class="sourceLineNo">3058</span>    expected.add(kv23);<a name="line.3058"></a>
-<span class="sourceLineNo">3059</span>    expected.add(kv22);<a name="line.3059"></a>
-<span class="sourceLineNo">3060</span><a name="line.3060"></a>
-<span class="sourceLineNo">3061</span>    Scan scan = new Scan(row1);<a name="line.3061"></a>
-<span class="sourceLineNo">3062</span>    scan.addFamily(fam1);<a name="line.3062"></a>
-<span class="sourceLineNo">3063</span>    scan.setMaxVersions(MAX_VERSIONS);<a name="line.3063"></a>
-<span class="sourceLineNo">3064</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.3064"></a>
-<span class="sourceLineNo">3065</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.3065"></a>
-<span class="sourceLineNo">3066</span><a name="line.3066"></a>
-<span class="sourceLineNo">3067</span>    boolean hasNext = scanner.next(actual);<a name="line.3067"></a>
-<span class="sourceLineNo">3068</span>    assertEquals(false, hasNext);<a name="line.3068"></a>
-<span class="sourceLineNo">3069</span><a name="line.3069"></a>
-<span class="sourceLineNo">3070</span>    // Verify result<a name="line.3070"></a>
-<span class="sourceLineNo">3071</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.3071"></a>
-<span class="sourceLineNo">3072</span>      assertEquals(expected.get(i), actual.get(i));<a name="line.3072"></a>
-<span class="sourceLineNo">3073</span>    }<a name="line.3073"></a>
-<span class="sourceLineNo">3074</span>  }<a name="line.3074"></a>
-<span class="sourceLineNo">3075</span><a name="line.3075"></a>
-<span class="sourceLineNo">3076</span>  @Test<a name="line.3076"></a>
-<span class="sourceLineNo">3077</span>  public void testScanner_Wildcard_FromFilesOnly_EnforceVersions() throws IOException {<a name="line.3077"></a>
-<span class="sourceLineNo">3078</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.3078"></a>
-<span class="sourceLineNo">3079</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.3079"></a>
-<span class="sourceLineNo">3080</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.3080"></a>
-<span class="sourceLineNo">3081</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.3081"></a>
-<span class="sourceLineNo">3082</span><a name="line.3082"></a>
-<span class="sourceLineNo">3083</span>    long ts1 = 1; // System.currentTimeMillis();<a name="line.3083"></a>
-<span class="sourceLineNo">3084</span>    long ts2 = ts1 + 1;<a name="line.3084"></a>
-<span class="sourceLineNo">3085</span>    long ts3 = ts1 + 2;<a name="line.3085"></a>
-<span class="sourceLineNo">3086</span><a name="line.3086"></a>
-<span class="sourceLineNo">3087</span>    // Setting up region<a name="line.3087"></a>
-<span class="sourceLineNo">3088</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.3088"></a>
-<span class="sourceLineNo">3089</span>    // Putting data in Region<a name="line.3089"></a>
-<span class="sourceLineNo">3090</span>    Put put = null;<a name="line.3090"></a>
-<span class="sourceLineNo">3091</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.3091"></a>
-<span class="sourceLineNo">3092</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.3092"></a>
-<span class="sourceLineNo">3093</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.3093"></a>
-<span class="sourceLineNo">3094</span><a name="line.3094"></a>
-<span class="sourceLineNo">3095</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.3095"></a>
-<span class="sourceLineNo">3096</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.3096"></a>
-<span class="sourceLineNo">3097</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.3097"></a>
-<span class="sourceLineNo">3098</span><a name="line.3098"></a>
-<span class="sourceLineNo">3099</span>    put = new Put(row1);<a name="line.3099"></a>
-<span class="sourceLineNo">3100</span>    put.add(kv13);<a name="line.3100"></a>
-<span class="sourceLineNo">3101</span>    put.add(kv12);<a name="line.3101"></a>
-<span class="sourceLineNo">3102</span>    put.add(kv11);<a name="line.3102"></a>
-<span class="sourceLineNo">3103</span>    put.add(kv23);<a name="line.3103"></a>
-<span class="sourceLineNo">3104</span>    put.add(kv22);<a name="line.3104"></a>
-<span class="sourceLineNo">3105</span>    put.add(kv21);<a name="line.3105"></a>
-<span class="sourceLineNo">3106</span>    region.put(put);<a name="line.3106"></a>
-<span class="sourceLineNo">3107</span>    region.flush(true);<a name="line.3107"></a>
+<span class="sourceLineNo">2938</span>    Scan scan = new Scan(row1);<a name="line.2938"></a>
+<span class="sourceLineNo">2939</span>    scan.addColumn(fam1, qf1);<a name="line.2939"></a>
+<span class="sourceLineNo">2940</span>    scan.addColumn(fam1, qf2);<a name="line.2940"></a>
+<span class="sourceLineNo">2941</span>    scan.setMaxVersions(MAX_VERSIONS);<a name="line.2941"></a>
+<span class="sourceLineNo">2942</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.2942"></a>
+<span class="sourceLineNo">2943</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.2943"></a>
+<span class="sourceLineNo">2944</span><a name="line.2944"></a>
+<span class="sourceLineNo">2945</span>    boolean hasNext = scanner.next(actual);<a name="line.2945"></a>
+<span class="sourceLineNo">2946</span>    assertEquals(false, hasNext);<a name="line.2946"></a>
+<span class="sourceLineNo">2947</span><a name="line.2947"></a>
+<span class="sourceLineNo">2948</span>    // Verify result<a name="line.2948"></a>
+<span class="sourceLineNo">2949</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.2949"></a>
+<span class="sourceLineNo">2950</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected.get(i), actual.get(i)));<a name="line.2950"></a>
+<span class="sourceLineNo">2951</span>    }<a name="line.2951"></a>
+<span class="sourceLineNo">2952</span>  }<a name="line.2952"></a>
+<span class="sourceLineNo">2953</span><a name="line.2953"></a>
+<span class="sourceLineNo">2954</span>  @Test<a name="line.2954"></a>
+<span class="sourceLineNo">2955</span>  public void testScanner_ExplicitColumns_FromMemStoreAndFiles_EnforceVersions() throws<a name="line.2955"></a>
+<span class="sourceLineNo">2956</span>      IOException {<a name="line.2956"></a>
+<span class="sourceLineNo">2957</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2957"></a>
+<span class="sourceLineNo">2958</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2958"></a>
+<span class="sourceLineNo">2959</span>    byte[][] families = { fam1 };<a name="line.2959"></a>
+<span class="sourceLineNo">2960</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.2960"></a>
+<span class="sourceLineNo">2961</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.2961"></a>
+<span class="sourceLineNo">2962</span><a name="line.2962"></a>
+<span class="sourceLineNo">2963</span>    long ts1 = 1;<a name="line.2963"></a>
+<span class="sourceLineNo">2964</span>    long ts2 = ts1 + 1;<a name="line.2964"></a>
+<span class="sourceLineNo">2965</span>    long ts3 = ts1 + 2;<a name="line.2965"></a>
+<span class="sourceLineNo">2966</span>    long ts4 = ts1 + 3;<a name="line.2966"></a>
+<span class="sourceLineNo">2967</span><a name="line.2967"></a>
+<span class="sourceLineNo">2968</span>    // Setting up region<a name="line.2968"></a>
+<span class="sourceLineNo">2969</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2969"></a>
+<span class="sourceLineNo">2970</span>    // Putting data in Region<a name="line.2970"></a>
+<span class="sourceLineNo">2971</span>    KeyValue kv14 = new KeyValue(row1, fam1, qf1, ts4, KeyValue.Type.Put, null);<a name="line.2971"></a>
+<span class="sourceLineNo">2972</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.2972"></a>
+<span class="sourceLineNo">2973</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.2973"></a>
+<span class="sourceLineNo">2974</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.2974"></a>
+<span class="sourceLineNo">2975</span><a name="line.2975"></a>
+<span class="sourceLineNo">2976</span>    KeyValue kv24 = new KeyValue(row1, fam1, qf2, ts4, KeyValue.Type.Put, null);<a name="line.2976"></a>
+<span class="sourceLineNo">2977</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.2977"></a>
+<span class="sourceLineNo">2978</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.2978"></a>
+<span class="sourceLineNo">2979</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.2979"></a>
+<span class="sourceLineNo">2980</span><a name="line.2980"></a>
+<span class="sourceLineNo">2981</span>    Put put = null;<a name="line.2981"></a>
+<span class="sourceLineNo">2982</span>    put = new Put(row1);<a name="line.2982"></a>
+<span class="sourceLineNo">2983</span>    put.add(kv14);<a name="line.2983"></a>
+<span class="sourceLineNo">2984</span>    put.add(kv24);<a name="line.2984"></a>
+<span class="sourceLineNo">2985</span>    region.put(put);<a name="line.2985"></a>
+<span class="sourceLineNo">2986</span>    region.flush(true);<a name="line.2986"></a>
+<span class="sourceLineNo">2987</span><a name="line.2987"></a>
+<span class="sourceLineNo">2988</span>    put = new Put(row1);<a name="line.2988"></a>
+<span class="sourceLineNo">2989</span>    put.add(kv23);<a name="line.2989"></a>
+<span class="sourceLineNo">2990</span>    put.add(kv13);<a name="line.2990"></a>
+<span class="sourceLineNo">2991</span>    region.put(put);<a name="line.2991"></a>
+<span class="sourceLineNo">2992</span>    region.flush(true);<a name="line.2992"></a>
+<span class="sourceLineNo">2993</span><a name="line.2993"></a>
+<span class="sourceLineNo">2994</span>    put = new Put(row1);<a name="line.2994"></a>
+<span class="sourceLineNo">2995</span>    put.add(kv22);<a name="line.2995"></a>
+<span class="sourceLineNo">2996</span>    put.add(kv12);<a name="line.2996"></a>
+<span class="sourceLineNo">2997</span>    region.put(put);<a name="line.2997"></a>
+<span class="sourceLineNo">2998</span>    region.flush(true);<a name="line.2998"></a>
+<span class="sourceLineNo">2999</span><a name="line.2999"></a>
+<span class="sourceLineNo">3000</span>    put = new Put(row1);<a name="line.3000"></a>
+<span class="sourceLineNo">3001</span>    put.add(kv21);<a name="line.3001"></a>
+<span class="sourceLineNo">3002</span>    put.add(kv11);<a name="line.3002"></a>
+<span class="sourceLineNo">3003</span>    region.put(put);<a name="line.3003"></a>
+<span class="sourceLineNo">3004</span><a name="line.3004"></a>
+<span class="sourceLineNo">3005</span>    // Expected<a name="line.3005"></a>
+<span class="sourceLineNo">3006</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.3006"></a>
+<span class="sourceLineNo">3007</span>    expected.add(kv14);<a name="line.3007"></a>
+<span class="sourceLineNo">3008</span>    expected.add(kv13);<a name="line.3008"></a>
+<span class="sourceLineNo">3009</span>    expected.add(kv12);<a name="line.3009"></a>
+<span class="sourceLineNo">3010</span>    expected.add(kv24);<a name="line.3010"></a>
+<span class="sourceLineNo">3011</span>    expected.add(kv23);<a name="line.3011"></a>
+<span class="sourceLineNo">3012</span>    expected.add(kv22);<a name="line.3012"></a>
+<span class="sourceLineNo">3013</span><a name="line.3013"></a>
+<span class="sourceLineNo">3014</span>    Scan scan = new Scan(row1);<a name="line.3014"></a>
+<span class="sourceLineNo">3015</span>    scan.addColumn(fam1, qf1);<a name="line.3015"></a>
+<span class="sourceLineNo">3016</span>    scan.addColumn(fam1, qf2);<a name="line.3016"></a>
+<span class="sourceLineNo">3017</span>    int versions = 3;<a name="line.3017"></a>
+<span class="sourceLineNo">3018</span>    scan.setMaxVersions(versions);<a name="line.3018"></a>
+<span class="sourceLineNo">3019</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.3019"></a>
+<span class="sourceLineNo">3020</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.3020"></a>
+<span class="sourceLineNo">3021</span><a name="line.3021"></a>
+<span class="sourceLineNo">3022</span>    boolean hasNext = scanner.next(actual);<a name="line.3022"></a>
+<span class="sourceLineNo">3023</span>    assertEquals(false, hasNext);<a name="line.3023"></a>
+<span class="sourceLineNo">3024</span><a name="line.3024"></a>
+<span class="sourceLineNo">3025</span>    // Verify result<a name="line.3025"></a>
+<span class="sourceLineNo">3026</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.3026"></a>
+<span class="sourceLineNo">3027</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected.get(i), actual.get(i)));<a name="line.3027"></a>
+<span class="sourceLineNo">3028</span>    }<a name="line.3028"></a>
+<span class="sourceLineNo">3029</span>  }<a name="line.3029"></a>
+<span class="sourceLineNo">3030</span><a name="line.3030"></a>
+<span class="sourceLineNo">3031</span>  @Test<a name="line.3031"></a>
+<span class="sourceLineNo">3032</span>  public void testScanner_Wildcard_FromMemStore_EnforceVersions() throws IOException {<a name="line.3032"></a>
+<span class="sourceLineNo">3033</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.3033"></a>
+<span class="sourceLineNo">3034</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.3034"></a>
+<span class="sourceLineNo">3035</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.3035"></a>
+<span class="sourceLineNo">3036</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.3036"></a>
+<span class="sourceLineNo">3037</span>    byte[][] families = { fam1 };<a name="line.3037"></a>
+<span class="sourceLineNo">3038</span><a name="line.3038"></a>
+<span class="sourceLineNo">3039</span>    long ts1 = System.currentTimeMillis();<a name="line.3039"></a>
+<span class="sourceLineNo">3040</span>    long ts2 = ts1 + 1;<a name="line.3040"></a>
+<span class="sourceLineNo">3041</span>    long ts3 = ts1 + 2;<a name="line.3041"></a>
+<span class="sourceLineNo">3042</span><a name="line.3042"></a>
+<span class="sourceLineNo">3043</span>    // Setting up region<a name="line.3043"></a>
+<span class="sourceLineNo">3044</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.3044"></a>
+<span class="sourceLineNo">3045</span>    // Putting data in Region<a name="line.3045"></a>
+<span class="sourceLineNo">3046</span>    Put put = null;<a name="line.3046"></a>
+<span class="sourceLineNo">3047</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.3047"></a>
+<span class="sourceLineNo">3048</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.3048"></a>
+<span class="sourceLineNo">3049</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.3049"></a>
+<span class="sourceLineNo">3050</span><a name="line.3050"></a>
+<span class="sourceLineNo">3051</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.3051"></a>
+<span class="sourceLineNo">3052</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.3052"></a>
+<span class="sourceLineNo">3053</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.3053"></a>
+<span class="sourceLineNo">3054</span><a name="line.3054"></a>
+<span class="sourceLineNo">3055</span>    put = new Put(row1);<a name="line.3055"></a>
+<span class="sourceLineNo">3056</span>    put.add(kv13);<a name="line.3056"></a>
+<span class="sourceLineNo">3057</span>    put.add(kv12);<a name="line.3057"></a>
+<span class="sourceLineNo">3058</span>    put.add(kv11);<a name="line.3058"></a>
+<span class="sourceLineNo">3059</span>    put.add(kv23);<a name="line.3059"></a>
+<span class="sourceLineNo">3060</span>    put.add(kv22);<a name="line.3060"></a>
+<span class="sourceLineNo">3061</span>    put.add(kv21);<a name="line.3061"></a>
+<span class="sourceLineNo">3062</span>    region.put(put);<a name="line.3062"></a>
+<span class="sourceLineNo">3063</span><a name="line.3063"></a>
+<span class="sourceLineNo">3064</span>    // Expected<a name="line.3064"></a>
+<span class="sourceLineNo">3065</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.3065"></a>
+<span class="sourceLineNo">3066</span>    expected.add(kv13);<a name="line.3066"></a>
+<span class="sourceLineNo">3067</span>    expected.add(kv12);<a name="line.3067"></a>
+<span class="sourceLineNo">3068</span>    expected.add(kv23);<a name="line.3068"></a>
+<span class="sourceLineNo">3069</span>    expected.add(kv22);<a name="line.3069"></a>
+<span class="sourceLineNo">3070</span><a name="line.3070"></a>
+<span class="sourceLineNo">3071</span>    Scan scan = new Scan(row1);<a name="line.3071"></a>
+<span class="sourceLineNo">3072</span>    scan.addFamily(fam1);<a name="line.3072"></a>
+<span class="sourceLineNo">3073</span>    scan.setMaxVersions(MAX_VERSIONS);<a name="line.3073"></a>
+<span class="sourceLineNo">3074</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.3074"></a>
+<span class="sourceLineNo">3075</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.3075"></a>
+<span class="sourceLineNo">3076</span><a name="line.3076"></a>
+<span class="sourceLineNo">3077</span>    boolean hasNext = scanner.next(actual);<a name="line.3077"></a>
+<span class="sourceLineNo">3078</span>    assertEquals(false, hasNext);<a name="line.3078"></a>
+<span class="sourceLineNo">3079</span><a name="line.3079"></a>
+<span class="sourceLineNo">3080</span>    // Verify result<a name="line.3080"></a>
+<span class="sourceLineNo">3081</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.3081"></a>
+<span class="sourceLineNo">3082</span>      assertEquals(expected.get(i), actual.get(i));<a name="line.3082"></a>
+<span class="sourceLineNo">3083</span>    }<a name="line.3083"></a>
+<span class="sourceLineNo">3084</span>  }<a name="line.3084"></a>
+<span class="sourceLineNo">3085</span><a name="line.3085"></a>
+<span class="sourceLineNo">3086</span>  @Test<a name="line.3086"></a>
+<span class="sourceLineNo">3087</span>  public void testScanner_Wildcard_FromFilesOnly_EnforceVersions() throws IOException {<a name="line.3087"></a>
+<span class="sourceLineNo">3088</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.3088"></a>
+<span class="sourceLineNo">3089</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.3089"></a>
+<span class="sourceLineNo">3090</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.3090"></a>
+<span class="sourceLineNo">3091</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.3091"></a>
+<span class="sourceLineNo">3092</span><a name="line.3092"></a>
+<span class="sourceLineNo">3093</span>    long ts1 = 1; // System.currentTimeMillis();<a name="line.3093"></a>
+<span class="sourceLineNo">3094</span>    long ts2 = ts1 + 1;<a name="line.3094"></a>
+<span class="sourceLineNo">3095</span>    long ts3 = ts1 + 2;<a name="line.3095"></a>
+<span class="sourceLineNo">3096</span><a name="line.3096"></a>
+<span class="sourceLineNo">3097</span>    // Setting up region<a name="line.3097"></a>
+<span class="sourceLineNo">3098</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.3098"></a>
+<span class="sourceLineNo">3099</span>    // Putting data in Region<a name="line.3099"></a>
+<span class="sourceLineNo">3100</span>    Put put = null;<a name="line.3100"></a>
+<span class="sourceLineNo">3101</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.3101"></a>
+<span class="sourceLineNo">3102</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.3102"></a>
+<span class="sourceLineNo">3103</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.3103"></a>
+<span class="sourceLineNo">3104</span><a name="line.3104"></a>
+<span class="sourceLineNo">3105</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.3105"></a>
+<span class="sourceLineNo">3106</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.3106"></a>
+<span class="sourceLineNo">3107</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.3107"></a>
 <span class="sourceLineNo">3108</span><a name="line.3108"></a>
-<span class="sourceLineNo">3109</span>    // Expected<a name="line.3109"></a>
-<span class="sourceLineNo">3110</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.3110"></a>
-<span class="sourceLineNo">3111</span>    expected.add(kv13);<a name="line.3111"></a>
-<span class="sourceLineNo">3112</span>    expected.add(kv12);<a name="line.3112"></a>
-<span class="sourceLineNo">3113</span>    expected.add(kv23);<a name="line.3113"></a>
-<span class="sourceLineNo">3114</span>    expected.add(kv22);<a name="line.3114"></a>
-<span class="sourceLineNo">3115</span><a name="line.3115"></a>
-<span class="sourceLineNo">3116</span>    Scan scan = new Scan(row1);<a name="line.3116"></a>
-<span class="sourceLineNo">3117</span>    scan.addFamily(fam1);<a name="line.3117"></a>
-<span class="sourceLineNo">3118</span>    scan.setMaxVersions(MAX_VERSIONS);<a name="line.3118"></a>
-<span class="sourceLineNo">3119</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.3119"></a>
-<span class="sourceLineNo">3120</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.3120"></a>
-<span class="sourceLineNo">3121</span><a name="line.3121"></a>
-<span class="sourceLineNo">3122</span>    boolean hasNext = scanner.next(actual);<a name="line.3122"></a>
-<span class="sourceLineNo">3123</span>    assertEquals(false, hasNext);<a name="line.3123"></a>
-<span class="sourceLineNo">3124</span><a name="line.3124"></a>
-<span class="sourceLineNo">3125</span>    // Verify result<a name="line.3125"></a>
-<span class="sourceLineNo">3126</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.3126"></a>
-<span class="sourceLineNo">3127</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected.get(i), actual.get(i)));<a name="line.3127"></a>
-<span class="sourceLineNo">3128</span>    }<a name="line.3128"></a>
-<span class="sourceLineNo">3129</span>  }<a name="line.3129"></a>
-<span class="sourceLineNo">3130</span><a name="line.3130"></a>
-<span class="sourceLineNo">3131</span>  @Test<a name="line.3131"></a>
-<span class="sourceLineNo">3132</span>  public void testScanner_StopRow1542() throws IOException {<a name="line.3132"></a>
-<span class="sourceLineNo">3133</span>    byte[] family = Bytes.toBytes("testFamily");<a name="line.3133"></a>
-<span class="sourceLineNo">3134</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.3134"></a>
-<span class="sourceLineNo">3135</span>    byte[] row1 = Bytes.toBytes("row111");<a name="line.3135"></a>
-<span class="sourceLineNo">3136</span>    byte[] row2 = Bytes.toBytes("row222");<a name="line.3136"></a>
-<span class="sourceLineNo">3137</span>    byte[] row3 = Bytes.toBytes("row333");<a name="line.3137"></a>
-<span class="sourceLineNo">3138</span>    byte[] row4 = Bytes.toBytes("row444");<a name="line.3138"></a>
-<span class="sourceLineNo">3139</span>    byte[] row5 = Bytes.toBytes("row555");<a name="line.3139"></a>
+<span class="sourceLineNo">3109</span>    put = new Put(row1);<a name="line.3109"></a>
+<span class="sourceLineNo">3110</span>    put.add(kv13);<a name="line.3110"></a>
+<span class="sourceLineNo">3111</span>    put.add(kv12);<a name="line.3111"></a>
+<span class="sourceLineNo">3112</span>    put.add(kv11);<a name="line.3112"></a>
+<span class="sourceLineNo">3113</span>    put.add(kv23);<a name="line.3113"></a>
+<span class="sourceLineNo">3114</span>    put.add(kv22);<a name="line.3114"></a>
+<span class="sourceLineNo">3115</span>    put.add(kv21);<a name="line.3115"></a>
+<span class="sourceLineNo">3116</span>    region.put(put);<a name="line.3116"></a>
+<span class="sourceLineNo">3117</span>    region.flush(true);<a name="line.3117"></a>
+<span class="sourceLineNo">3118</span><a name="line.3118"></a>
+<span class="sourceLineNo">3119</span>    // Expected<a name="line.3119"></a>
+<span class="sourceLineNo">3120</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.3120"></a>
+<span class="sourceLineNo">3121</span>    expected.add(kv13);<a name="line.3121"></a>
+<span class="sourceLineNo">3122</span>    expected.add(kv12);<a name="line.3122"></a>
+<span class="sourceLineNo">3123</span>    expected.add(kv23);<a name="line.3123"></a>
+<span class="sourceLineNo">3124</span>    expected.add(kv22);<a name="line.3124"></a>
+<span class="sourceLineNo">3125</span><a name="line.3125"></a>
+<span class="sourceLineNo">3126</span>    Scan scan = new Scan(row1);<a name="line.3126"></a>
+<span class="sourceLineNo">3127</span>    scan.addFamily(fam1);<a name="line.3127"></a>
+<span class="sourceLineNo">3128</span>    scan.setMaxVersions(MAX_VERSIONS);<a name="line.3128"></a>
+<span class="sourceLineNo">3129</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.3129"></a>
+<span class="sourceLineNo">3130</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.3130"></a>
+<span class="sourceLineNo">3131</span><a name="line.3131"></a>
+<span class="sourceLineNo">3132</span>    boolean hasNext = scanner.next(actual);<a name="line.3132"></a>
+<span class="sourceLineNo">3133</span>    assertEquals(false, hasNext);<a name="line.3133"></a>
+<span class="sourceLineNo">3134</span><a name="line.3134"></a>
+<span class="sourceLineNo">3135</span>    // Verify result<a name="line.3135"></a>
+<span class="sourceLineNo">3136</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.3136"></a>
+<span class="sourceLineNo">3137</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected.get(i), actual.get(i)));<a name="line.3137"></a>
+<span class="sourceLineNo">3138</span>    }<a name="line.3138"></a>
+<span class="sourceLineNo">3139</span>  }<a name="line.3139"></a>
 <span class="sourceLineNo">3140</span><a name="line.3140"></a>
-<span class="sourceLineNo">3141</span>    byte[] col1 = Bytes.toBytes("Pub111");<a name="line.3141"></a>
-<span class="sourceLineNo">3142</span>    byte[] col2 = Bytes.toBytes("Pub222");<a name="line.3142"></a>
-<span class="sourceLineNo">3143</span><a name="line.3143"></a>
-<span class="sourceLineNo">3144</span>    Put put = new Put(row1);<a name="line.3144"></a>
-<span class="sourceLineNo">3145</span>    put.addColumn(family, col1, Bytes.toBytes(10L));<a name="line.3145"></a>
-<span class="sourceLineNo">3146</span>    region.put(put);<a name="line.3146"></a>
-<span class="sourceLineNo">3147</span><a name="line.3147"></a>
-<span class="sourceLineNo">3148</span>    put = new Put(row2);<a name="line.3148"></a>
-<span class="sourceLineNo">3149</span>    put.addColumn(family, col1, Bytes.toBytes(15L));<a name="line.3149"></a>
-<span class="sourceLineNo">3150</span>    region.put(put);<a name="line.3150"></a>
-<span class="sourceLineNo">3151</span><a name="line.3151"></a>
-<span class="sourceLineNo">3152</span>    put = new Put(row3);<a name="line.3152"></a>
-<span class="sourceLineNo">3153</span>    put.addColumn(family, col2, Bytes.toBytes(20L));<a name="line.3153"></a>
-<span class="sourceLineNo">3154</span>    region.put(put);<a name="line.3154"></a>
-<span class="sourceLineNo">3155</span><a name="line.3155"></a>
-<span class="sourceLineNo">3156</span>    put = new Put(row4);<a name="line.3156"></a>
-<span class="sourceLineNo">3157</span>    put.addColumn(family, col2, Bytes.toBytes(30L));<a name="line.3157"></a>
-<span class="sourceLineNo">3158</span>    region.put(put);<a name="line.3158"></a>
-<span class="sourceLineNo">3159</span><a name="line.3159"></a>
-<span class="sourceLineNo">3160</span>    put = new Put(row5);<a name="line.3160"></a>
-<span class="sourceLineNo">3161</span>    put.addColumn(family, col1, Bytes.toBytes(40L));<a name="line.3161"></a>
-<span class="sourceLineNo">3162</span>    region.put(put);<a name="line.3162"></a>
-<span class="sourceLineNo">3163</span><a name="line.3163"></a>
-<span class="sourceLineNo">3164</span>    Scan scan = new Scan(row3, row4);<a name="line.3164"></a>
-<span class="sourceLineNo">3165</span>    scan.setMaxVersions();<a name="line.3165"></a>
-<span class="sourceLineNo">3166</span>    scan.addColumn(family, col1);<a name="line.3166"></a>
-<span class="sourceLineNo">3167</span>    InternalScanner s = region.getScanner(scan);<a name="line.3167"></a>
-<span class="sourceLineNo">3168</span><a name="line.3168"></a>
-<span class="sourceLineNo">3169</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.3169"></a>
-<span class="sourceLineNo">3170</span>    assertEquals(false, s.next(results));<a name="line.3170"></a>
-<span class="sourceLineNo">3171</span>    assertEquals(0, results.size());<a name="line.3171"></a>
-<span class="sourceLineNo">3172</span>  }<a name="line.3172"></a>
+<span class="sourceLineNo">3141</span>  @Test<a name="line.3141"></a>
+<span class="sourceLineNo">3142</span>  public void testScanner_StopRow1542() throws IOException {<a name="line.3142"></a>
+<span class="sourceLineNo">3143</span>    byte[] family = Bytes.toBytes("testFamily");<a name="line.3143"></a>
+<span class="sourceLineNo">3144</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.3144"></a>
+<span class="sourceLineNo">3145</span>    byte[] row1 = Bytes.toBytes("row111");<a name="line.3145"></a>
+<span class="sourceLineNo">3146</span>    byte[] row2 = Bytes.toBytes("row222");<a name="line.3146"></a>
+<span class="sourceLineNo">3147</span>    byte[] row3 = Bytes.toBytes("row333");<a name="line.3147"></a>
+<span class="sourceLineNo">3148</span>    byte[] row4 = Bytes.toBytes("row444");<a name="line.3148"></a>
+<span class="sourceLineNo">3149</span>    byte[] row5 = Bytes.toBytes("row555");<a name="line.3149"></a>
+<span class="sourceLineNo">3150</span><a name="line.3150"></a>
+<span class="sourceLineNo">3151</span>    byte[] col1 = Bytes.toBytes("Pub111");<a name="line.3151"></a>
+<span class="sourceLineNo">3152</span>    byte[] col2 = Bytes.toBytes("Pub222");<a name="line.3152"></a>
+<span class="sourceLineNo">3153</span><a name="line.3153"></a>
+<span class="sourceLineNo">3154</span>    Put put = new Put(row1);<a name="line.3154"></a>
+<span class="sourceLineNo">3155</span>    put.addColumn(family, col1, Bytes.toBytes(10L));<a name="line.3155"></a>
+<span class="sourceLineNo">3156</span>    region.put(put);<a name="line.3156"></a>
+<span class="sourceLineNo">3157</span><a name="line.3157"></a>
+<span class="sourceLineNo">3158</span>    put = new Put(row2);<a name="line.3158"></a>
+<span class="sourceLineNo">3159</span>    put.addColumn(family, col1, Bytes.toBytes(15L));<a name="line.3159"></a>
+<span class="sourceLineNo">3160</span>    region.put(put);<a name="line.3160"></a>
+<span class="sourceLineNo">3161</span><a name="line.3161"></a>
+<span class="sourceLineNo">3162</span>    put = new Put(row3);<a name="line.3162"></a>
+<span class="sourceLineNo">3163</span>    put.addColumn(family, col2, Bytes.toBytes(20L));<a name="line.3163"></a>
+<span class="sourceLineNo">3164</span>    region.put(put);<a name="line.3164"></a>
+<span class="sourceLineNo">3165</span><a name="line.3165"></a>
+<span class="sourceLineNo">3166</span>    put = new Put(row4);<a name="line.3166"></a>
+<span class="sourceLineNo">3167</span>    put.addColumn(family, col2, Bytes.toBytes(30L));<a name="line.3167"></a>
+<span class="sourceLineNo">3168</span>    region.put(put);<a name="line.3168"></a>
+<span class="sourceLineNo">3169</span><a name="line.3169"></a>
+<span class="sourceLineNo">3170</span>    put = new Put(row5);<a name="line.3170"></a>
+<span class="sourceLineNo">3171</span>    put.addColumn(family, col1, Bytes.toBytes(40L));<a name="line.3171"></a>
+<span class="sourceLineNo">3172</span>    region.put(put);<a name="line.3172"></a>
 <span class="sourceLineNo">3173</span><a name="line.3173"></a>
-<span class="sourceLineNo">3174</span>  @Test<a name="line.3174"></a>
-<span class="sourceLineNo">3175</span>  public void testScanner_Wildcard_FromMemStoreAndFiles_EnforceVersions() throws IOException {<a name="line.3175"></a>
-<span class="sourceLineNo">3176</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.3176"></a>
-<span class="sourceLineNo">3177</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.3177"></a>
-<span class="sourceLineNo">3178</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.3178"></a>
-<span class="sourceLineNo">3179</span>    byte[] qf2 = Bytes.toBytes("quateslifier2");<a name="line.3179"></a>
-<span class="sourceLineNo">3180</span><a name="line.3180"></a>
-<span class="sourceLineNo">3181</span>    long ts1 = 1;<a name="line.3181"></a>
-<span class="sourceLineNo">3182</span>    long ts2 = ts1 + 1;<a name="line.3182"></a>
-<span class="sourceLineNo">3183</span>    long ts3 = ts1 + 2;<a name="line.3183"></a>
-<span class="sourceLineNo">3184</span>    long ts4 = ts1 + 3;<a name="line.3184"></a>
-<span class="sourceLineNo">3185</span><a name="line.3185"></a>
-<span class="sourceLineNo">3186</span>    // Setting up region<a name="line.3186"></a>
-<span class="sourceLineNo">3187</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.3187"></a>
-<span class="sourceLineNo">3188</span>    // Putting data in Region<a name="line.3188"></a>
-<span class="sourceLineNo">3189</span>    KeyValue kv14 = new KeyValue(row1, fam1, qf1, ts4, KeyValue.Type.Put, null);<a name="line.3189"></a>
-<span class="sourceLineNo">3190</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.3190"></a>
-<span class="sourceLineNo">3191</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.3191"></a>
-<span class="sourceLineNo">3192</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.3192"></a>
-<span class="sourceLineNo">3193</span><a name="line.3193"></a>
-<span class="sourceLineNo">3194</span>    KeyValue kv24 = new KeyValue(row1, fam1, qf2, ts4, KeyValue.Type.Put, null);<a name="line.3194"></a>
-<span class="sourceLineNo">3195</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.3195"></a>
-<span class="sourceLineNo">3196</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.3196"></a>
-<span class="sourceLineNo">3197</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.3197"></a>
-<span class="sourceLineNo">3198</span><a name="line.3198"></a>
-<span class="sourceLineNo">3199</span>    Put put = null;<a name="line.3199"></a>
-<span class="sourceLineNo">3200</span>    put = new Put(row1);<a name="line.3200"></a>
-<span class="sourceLineNo">3201</span>    put.add(kv14);<a name="line.3201"></a>
-<span class="sourceLineNo">3202</span>    put.add(kv24);<a name="line.3202"></a>
-<span class="sourceLineNo">3203</span>    region.put(put);<a name="line.3203"></a>
-<span class="sourceLineNo">3204</span>    region.flush(true);<a name="line.3204"></a>
-<span class="sourceLineNo">3205</span><a name="line.3205"></a>
-<span class="sourceLineNo">3206</span>    put = new Put(row1);<a name="line.3206"></a>
-<span class="sourceLineNo">3207</span>    put.add(kv23);<a name="line.3207"></a>
-<span class="sourceLineNo">3208</span>    put.add(kv13);<a name="line.3208"></a>
-<span class="sourceLineNo">3209</span>    region.put(put);<a name="line.3209"></a>
-<span class="sourceLineNo">3210</span>    region.flush(true);<a name="line.3210"></a>
-<span class="sourceLineNo">3211</span><a name="line.3211"></a>
-<span class="sourceLineNo">3212</span>    put = new Put(row1);<a name="line.3212"></a>
-<span class="sourceLineNo">3213</span>    put.add(kv22);<a name="line.3213"></a>
-<span class="sourceLineNo">3214</span>    put.add(kv12);<a name="line.3214"></a>
-<span class="sourceLineNo">3215</span>    region.put(put);<a name="line.3215"></a>
-<span class="sourceLineNo">3216</span>    region.flush(true);<a name="line.3216"></a>
-<span class="sourceLineNo">3217</span><a name="line.3217"></a>
-<span class="sourceLineNo">3218</span>    put = new Put(row1);<a name="line.3218"></a>
-<span class="sourceLineNo">3219</span>    put.add(kv21);<a name="line.3219"></a>
-<span class="sourceLineNo">3220</span>    put.add(kv11);<a name="line.3220"></a>
-<span class="sourceLineNo">3221</span>    region.put(put);<a name="line.3221"></a>
-<span class="sourceLineNo">3222</span><a name="line.3222"></a>
-<span class="sourceLineNo">3223</span>    // Expected<a name="line.3223"></a>
-<span class="sourceLineNo">3224</span>    List&lt;KeyValue&gt; expected = new ArrayList&lt;&gt;();<a name="line.3224"></a>
-<span class="sourceLineNo">3225</span>    expected.add(kv14);<a name="line.3225"></a>
-<span class="sourceLineNo">3226</span>    expected.add(kv13);<a name="line.3226"></a>
-<span class="sourceLineNo">3227</span>    expected.add(kv12);<a name="line.3227"></a>
-<span class="sourceLineNo">3228</span>    expected.add(kv24);<a name="line.3228"></a>
-<span class="sourceLineNo">3229</span>    expected.add(kv23);<a name="line.3229"></a>
-<span class="sourceLineNo">3230</span>    expected.add(kv22);<a name="line.3230"></a>
-<span class="sourceLineNo">3231</span><a name="line.3231"></a>
-<span class="sourceLineNo">3232</span>    Scan scan = new Scan(row1);<a name="line.3232"></a>
-<span class="sourceLineNo">3233</span>    int versions = 3;<a name="line.3233"></a>
-<span class="sourceLineNo">3234</span>    scan.setMaxVersions(versions);<a name="line.3234"></a>
-<span class="sourceLineNo">3235</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.3235"></a>
-<span class="sourceLineNo">3236</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.3236"></a>
-<span class="sourceLineNo">3237</span><a name="line.3237"></a>
-<span class="sourceLineNo">3238</span>    boolean hasNext = scanner.next(actual);<a name="line.3238"></a>
-<span class="sourceLineNo">3239</span>    assertEquals(false, hasNext);<a name="line.3239"></a>
-<span class="sourceLineNo">3240</span><a name="line.3240"></a>
-<span class="sourceLineNo">3241</span>    // Verify result<a name="line.3241"></a>
-<span class="sourceLineNo">3242</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.3242"></a>
-<span class="sourceLineNo">3243</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected.get(i), actual.get(i)));<a name="line.3243"></a>
-<span class="sourceLineNo">3244</span>    }<a name="line.3244"></a>
-<span class="sourceLineNo">3245</span>  }<a name="line.3245"></a>
-<span class="sourceLineNo">3246</span><a name="line.3246"></a>
-<span class="sourceLineNo">3247</span>  /**<a name="line.3247"></a>
-<span class="sourceLineNo">3248</span>   * Added for HBASE-5416<a name="line.3248"></a>
-<span class="sourceLineNo">3249</span>   *<a name="line.3249"></a>
-<span class="sourceLineNo">3250</span>   * Here we test scan optimization when only subset of CFs are used in filter<a name="line.3250"></a>
-<span class="sourceLineNo">3251</span>   * conditions.<a name="line.3251"></a>
-<span class="sourceLineNo">3252</span>   */<a name="line.3252"></a>
-<span class="sourceLineNo">3253</span>  @Test<a name="line.3253"></a>
-<span class="sourceLineNo">3254</span>  public void testScanner_JoinedScanners() throws IOException {<a name="line.3254"></a>
-<span class="sourceLineNo">3255</span>    byte[] cf_essential = Bytes.toBytes("essential");<a name="line.3255"></a>
-<span class="sourceLineNo">3256</span>    byte[] cf_joined = Bytes.toBytes("joined");<a name="line.3256"></a>
-<span class="sourceLineNo">3257</span>    byte[] cf_alpha = Bytes.toBytes("alpha");<a name="line.3257"></a>
-<span class="sourceLineNo">3258</span>    this.region = initHRegion(tableName, method, CONF, cf_essential, cf_joined, cf_alpha);<a name="line.3258"></a>
-<span class="sourceLineNo">3259</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.3259"></a>
-<span class="sourceLineNo">3260</span>    byte[] row2 = Bytes.toBytes("row2");<a name="line.3260"></a>
-<span class="sourceLineNo">3261</span>    byte[] row3 = Bytes.toBytes("row3");<a name="line.3261"></a>
-<span class="sourceLineNo">3262</span><a name="line.3262"></a>
-<span class="sourceLineNo">3263</span>    byte[] col_normal = Bytes.toBytes("d");<a name="line.3263"></a>
-<span class="sourceLineNo">3264</span>    byte[] col_alpha = Bytes.toBytes("a");<a name="line.3264"></a>
-<span class="sourceLineNo">3265</span><a name="line.3265"></a>
-<span class="sourceLineNo">3266</span>    byte[] filtered_val = Bytes.toBytes(3);<a name="line.3266"></a>
-<span class="sourceLineNo">3267</span><a name="line.3267"></a>
-<span class="sourceLineNo">3268</span>    Put put = new Put(row1);<a name="line.3268"></a>
-<span class="sourceLineNo">3269</span>    put.addColumn(cf_essential, col_normal, Bytes.toBytes(1));<a name="line.3269"></a>
-<span class="sourceLineNo">3270</span>    put.addColumn(cf_joined, col_alpha, Bytes.toBytes(1));<a name="line.3270"></a>
-<span class="sourceLineNo">3271</span>    region.put(put);<a name="line.3271"></a>
+<span class="sourceLineNo">3174</span>    Scan scan = new Scan(row3, row4);<a name="line.3174"></a>
+<span class="sourceLineNo">3175</span>    scan.setMaxVersions();<a name="line.3175"></a>
+<span class="sourceLineNo">3176</span>    scan.addColumn(family, col1);<a name="line.3176"></a>
+<span class="sourceLineNo">3177</span>    InternalScanner s = region.getScanner(scan);<a name="line.3177"></a>
+<span class="sourceLineNo">3178</span><a name="line.3178"></a>
+<span class="sourceLineNo">3179</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.3179"></a>
+<span class="sourceLineNo">3180</span>    assertEquals(false, s.next(results));<a name="line.3180"></a>
+<span class="sourceLineNo">3181</span>    assertEquals(0, results.size());<a name="line.3181"></a>
+<span class="sourceLineNo">3182</span>  }<a name="line.3182"></a>
+<span class="sourceLineNo">3183</span><a name="line.3183"></a>
+<span class="sourceLineNo">3184</span>  @Test<a name="line.3184"></a>
+<span class="sourceLineNo">3185</span>  public void testScanner_Wildcard_FromMemStoreAndFiles_EnforceVersions() throws IOException {<a name="line.3185"></a>
+<span class="sourceLineNo">3186</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.3186"></a>
+<span class="sourceLineNo">3187</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.3187"></a>
+<span class="sourceLineNo">3188</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.3188"></a>
+<span class="sourceLineNo">3189</span>    byte[] qf2 = Bytes.toBytes("quateslifier2");<a name="line.3189"></a>
+<span class="sourceLineNo">3190</span><a name="line.3190"></a>
+<span class="sourceLineNo">3191</span>    long ts1 = 1;<a name="line.3191"></a>
+<span class="sourceLineNo">3192</span>    long ts2 = ts1 + 1;<a name="line.3192"></a>
+<span class="sourceLineNo">3193</span>    long ts3 = ts1 + 2;<a name="line.3193"></a>
+<span class="sourceLineNo">3194</span>    long ts4 = ts1 + 3;<a name="line.3194"></a>
+<span class="sourceLineNo">3195</span><a name="line.3195"></a>
+<span class="sourceLineNo">3196</span>    // Setting up region<a name="line.3196"></a>
+<span class="sourceLineNo">3197</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.3197"></a>
+<span class="sourceLineNo">3198</span>    // Putting data in Region<a name="line.3198"></a>
+<span class="sourceLineNo">3199</span>    KeyValue kv14 = new KeyValue(row1, fam1, qf1, ts4, KeyValue.Type.Put, null);<a name="line.3199"></a>
+<span class="sourceLineNo">3200</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.3200"></a>
+<span class="sourceLineNo">3201</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.3201"></a>
+<span class="sourceLineNo">3202</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.3202"></a>
+<span class="sourceLineNo">3203</span><a name="line.3203"></a>
+<span class="sourceLineNo">3204</span>    KeyValue kv24 = new KeyValue(row1, fam1, qf2, ts4, KeyValue.Type.Put, null);<a name="line.3204"></a>
+<span class="sourceLineNo">3205</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.3205"></a>
+<span class="sourceLineNo">3206</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.3206"></a>
+<span class="sourceLineNo">3207</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.3207"></a>
+<span class="sourceLineNo">3208</span><a name="line.3208"></a>
+<span class="sourceLineNo">3209</span>    Put put = null;<a name="line.3209"></a>
+<span class="sourceLineNo">3210</span>    put = new Put(row1);<a name="line.3210"></a>
+<span class="sourceLineNo">3211</span>    put.add(kv14);<a name="line.3211"></a>
+<span class="sourceLineNo">3212</span>    put.add(kv24);<a name="line.3212"></a>
+<span class="sourceLineNo">3213</span>    region.put(put);<a name="line.3213"></a>
+<span class="sourceLineNo">3214</span>    region.flush(true);<a name="line.3214"></a>
+<span class="sourceLineNo">3215</span><a name="line.3215"></a>
+<span class="sourceLineNo">3216</span>    put = new Put(row1);<a name="line.3216"></a>
+<span class="sourceLineNo">3217</span>    put.add(kv23);<a name="line.3217"></a>
+<span class="sourceLineNo">3218</span>    put.add(kv13);<a name="line.3218"></a>
+<span class="sourceLineNo">3219</span>    region.put(put);<a name="line.3219"></a>
+<span class="sourceLineNo">3220</span>    region.flush(true);<a name="line.3220"></a>
+<span class="sourceLineNo">3221</span><a name="line.3221"></a>
+<span class="sourceLineNo">3222</span>    put = new Put(row1);<a name="line.3222"></a>
+<span class="sourceLineNo">3223</span>    put.add(kv22);<a name="line.3223"></a>
+<span class="sourceLineNo">3224</span>    put.add(kv12);<a name="line.3224"></a>
+<span class="sourceLineNo">3225</span>    region.put(put);<a name="line.3225"></a>
+<span class="sourceLineNo">3226</span>    region.flush(true);<a name="line.3226"></a>
+<span class="sourceLineNo">3227</span><a name="line.3227"></a>
+<span class="sourceLineNo">3228</span>    put = new Put(row1);<a name="line.3228"></a>
+<span class="sourceLineNo">3229</span>    put.add(kv21);<a name="line.3229"></a>
+<span class="sourceLineNo">3230</span>    put.add(kv11);<a name="line.3230"></a>
+<span class="sourceLineNo">3231</span>    region.put(put);<a name="line.3231"></a>
+<span class="sourceLineNo">3232</span><a name="line.3232"></a>
+<span class="sourceLineNo">3233</span>    // Expected<a name="line.3233"></a>
+<span class="sourceLineNo">3234</span>    List&lt;KeyValue&gt; expected = new ArrayList&lt;&gt;();<a name="line.3234"></a>
+<span class="sourceLineNo">3235</span>    expected.add(kv14);<a name="line.3235"></a>
+<span class="sourceLineNo">3236</span>    expected.add(kv13);<a name="line.3236"></a>
+<span class="sourceLineNo">3237</span>    expected.add(kv12);<a name="line.3237"></a>
+<span class="sourceLineNo">3238</span>    expected.add(kv24);<a name="line.3238"></a>
+<span class="sourceLineNo">3239</span>    expected.add(kv23);<a name="line.3239"></a>
+<span class="sourceLineNo">3240</span>    expected.add(kv22);<a name="line.3240"></a>
+<span class="sourceLineNo">3241</span><a name="line.3241"></a>
+<span class="sourceLineNo">3242</span>    Scan scan = new Scan(row1);<a name="line.3242"></a>
+<span class="sourceLineNo">3243</span>    int versions = 3;<a name="line.3243"></a>
+<span class="sourceLineNo">3244</span>    scan.setMaxVersions(versions);<a name="line.3244"></a>
+<span class="sourceLineNo">3245</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.3245"></a>
+<span class="sourceLineNo">3246</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.3246"></a>
+<span class="sourceLineNo">3247</span><a name="line.3247"></a>
+<span class="sourceLineNo">3248</span>    boolean hasNext = scanner.next(actual);<a name="line.3248"></a>
+<span class="sourceLineNo">3249</span>    assertEquals(false, hasNext);<a name="line.3249"></a>
+<span class="sourceLineNo">3250</span><a name="line.3250"></a>
+<span class="sourceLineNo">3251</span>    // Verify result<a name="line.3251"></a>
+<span class="sourceLineNo">3252</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.3252"></a>
+<span class="sourceLineNo">3253</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected.get(i), actual.get(i)));<a name="line.3253"></a>
+<span class="sourceLineNo">3254</span>    }<a name="line.3254"></a>
+<span class="sourceLineNo">3255</span>  }<a name="line.3255"></a>
+<span class="sourceLineNo">3256</span><a name="line.3256"></a>
+<span class="sourceLineNo">3257</span>  /**<a name="line.3257"></a>
+<span class="sourceLineNo">3258</span>   * Added for HBASE-5416<a name="line.3258"></a>
+<span class="sourceLineNo">3259</span>   *<a name="line.3259"></a>
+<span class="sourceLineNo">3260</span>   * Here we test scan optimization when only subset of CFs are used in filter<a name="line.3260"></a>
+<span class="sourceLineNo">3261</span>   * conditions.<a name="line.3261"></a>
+<span class="sourceLineNo">3262</span>   */<a name="line.3262"></a>
+<span class="sourceLineNo">3263</span>  @Test<a name="line.3263"></a>
+<span class="sourceLineNo">3264</span>  public void testScanner_JoinedScanners() throws IOException {<a name="line.3264"></a>
+<span class="sourceLineNo">3265</span>    byte[] cf_essential = Bytes.toBytes("essential");<a name="line.3265"></a>
+<span class="sourceLineNo">3266</span>    byte[] cf_joined = Bytes.toBytes("joined");<a name="line.3266"></a>
+<span class="sourceLineNo">3267</span>    byte[] cf_alpha = Bytes.toBytes("alpha");<a name="line.3267"></a>
+<span class="sourceLineNo">3268</span>    this.region = initHRegion(tableName, method, CONF, cf_essential, cf_joined, cf_alpha);<a name="line.3268"></a>
+<span class="sourceLineNo">3269</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.3269"></a>
+<span class="sourceLineNo">3270</span>    byte[] row2 = Bytes.toBytes("row2");<a name="line.3270"></a>
+<span class="sourceLineNo">3271</span>    byte[] row3 = Bytes.toBytes("row3");<a name="line.3271"></a>
 <span class="sourceLineNo">3272</span><a name="line.3272"></a>
-<span class="sourceLineNo">3273</span>    put = new Put(row2);<a name="line.3273"></a>
-<span class="sourceLineNo">3274</span>    put.addColumn(cf_essential, col_alpha, Bytes.toBytes(2));<a name="line.3274"></a>
-<span class="sourceLineNo">3275</span>    put.addColumn(cf_joined, col_normal, Bytes.toBytes(2));<a name="line.3275"></a>
-<span class="sourceLineNo">3276</span>    put.addColumn(cf_alpha, col_alpha, Bytes.toBytes(2));<a name="line.3276"></a>
-<span class="sourceLineNo">3277</span>    region.put(put);<a name="line.3277"></a>
-<span class="sourceLineNo">3278</span><a name="line.3278"></a>
-<span class="sourceLineNo">3279</span>    put = new Put(row3);<a name="line.3279"></a>
-<span class="sourceLineNo">3280</span>    put.addColumn(cf_essential, col_normal, filtered_val);<a name="line.3280"></a>
-<span class="sourceLineNo">3281</span>    put.addColumn(cf_joined, col_normal, filtered_val);<a name="line.3281"></a>
-<span class="sourceLineNo">3282</span>    region.put(put);<a name="line.3282"></a>
-<span class="sourceLineNo">3283</span><a name="line.3283"></a>
-<span class="sourceLineNo">3284</span>    // Check two things:<a name="line.3284"></a>
-<span class="sourceLineNo">3285</span>    // 1. result list contains expected values<a name="line.3285"></a>
-<span class="sourceLineNo">3286</span>    // 2. result list is sorted properly<a name="line.3286"></a>
-<span class="sourceLineNo">3287</span><a name="line.3287"></a>
-<span class="sourceLineNo">3288</span>    Scan scan = new Scan();<a name="line.3288"></a>
-<span class="sourceLineNo">3289</span>    Filter filter = new SingleColumnValueExcludeFilter(cf_essential, col_normal,<a name="line.3289"></a>
-<span class="sourceLineNo">3290</span>            CompareOperator.NOT_EQUAL, filtered_val);<a name="line.3290"></a>
-<span class="sourceLineNo">3291</span>    scan.setFilter(filter);<a name="line.3291"></a>
-<span class="sourceLineNo">3292</span>    scan.setLoadColumnFamiliesOnDemand(true);<a name="line.3292"></a>
-<span class="sourceLineNo">3293</span>    InternalScanner s = region.getScanner(scan);<a name="line.3293"></a>
-<span class="sourceLineNo">3294</span><a name="line.3294"></a>
-<span class="sourceLineNo">3295</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.3295"></a>
-<span class="sourceLineNo">3296</span>    assertTrue(s.next(results));<a name="line.3296"></a>
-<span class="sourceLineNo">3297</span>    assertEquals(1, results.size());<a name="line.3297"></a>
-<span class="sourceLineNo">3298</span>    results.clear();<a name="line.3298"></a>
-<span class="sourceLineNo">3299</span><a name="line.3299"></a>
-<span class="sourceLineNo">3300</span>    assertTrue(s.next(results));<a name="line.3300"></a>
-<span class="sourceLineNo">3301</span>    assertEquals(3, results.size());<a name="line.3301"></a>
-<span class="sourceLineNo">3302</span>    assertTrue("orderCheck", CellUtil.matchingFamily(results.get(0), cf_alpha));<a name="line.3302"></a>
-<span class="sourceLineNo">3303</span>    assertTrue("orderCheck", CellUtil.matchingFamily(results.get(1), cf_essential));<a name="line.3303"></a>
-<span class="sourceLineNo">3304</span>    assertTrue("orderCheck", CellUtil.matchingFamily(results.get(2), cf_joined));<a name="line.3304"></a>
-<span class="sourceLineNo">3305</span>    results.clear();<a name="line.3305"></a>
-<span class="sourceLineNo">3306</span><a name="line.3306"></a>
-<span class="sourceLineNo">3307</span>    assertFalse(s.next(results));<a name="line.3307"></a>
-<span class="sourceLineNo">3308</span>    assertEquals(0, results.size());<a name="line.3308"></a>
-<span class="sourceLineNo">3309</span>  }<a name="line.3309"></a>
-<span class="sourceLineNo">3310</span><a name="line.3310"></a>
-<span class="sourceLineNo">3311</span>  /**<a name="line.3311"></a>
-<span class="sourceLineNo">3312</span>   * HBASE-5416<a name="line.3312"></a>
-<span class="sourceLineNo">3313</span>   *<a name="line.3313"></a>
-<span class="sourceLineNo">3314</span>   * Test case when scan limits amount of KVs returned on each next() call.<a name="line.3314"></a>
-<span class="sourceLineNo">3315</span>   */<a name="line.3315"></a>
-<span class="sourceLineNo">3316</span>  @Test<a name="line.3316"></a>
-<span class="sourceLineNo">3317</span>  public void testScanner_JoinedScannersWithLimits() throws IOException {<a name="line.3317"></a>
-<span class="sourceLineNo">3318</span>    final byte[] cf_first = Bytes.toBytes("first");<a name="line.3318"></a>
-<span class="sourceLineNo">3319</span>    final byte[] cf_second = Bytes.toBytes("second");<a name="line.3319"></a>
+<span class="sourceLineNo">3273</span>    byte[] col_normal = Bytes.toBytes("d");<a name="line.3273"></a>
+<span class="sourceLineNo">3274</span>    byte[] col_alpha = Bytes.toBytes("a");<a name="line.3274"></a>
+<span class="sourceLineNo">3275</span><a name="line.3275"></a>
+<span class="sourceLineNo">3276</span>    byte[] filtered_val = Bytes.toBytes(3);<a name="line.3276"></a>
+<span class="sourceLineNo">3277</span><a name="line.3277"></a>
+<span class="sourceLineNo">3278</span>    Put put = new Put(row1);<a name="line.3278"></a>
+<span class="sourceLineNo">3279</span>    put.addColumn(cf_essential, col_normal, Bytes.toBytes(1));<a name="line.3279"></a>
+<span class="sourceLineNo">3280</span>    put.addColumn(cf_joined, col_alpha, Bytes.toBytes(1));<a name="line.3280"></a>
+<span class="sourceLineNo">3281</span>    region.put(put);<a name="line.3281"></a>
+<span class="sourceLineNo">3282</span><a name="line.3282"></a>
+<span class="sourceLineNo">3283</span>    put = new Put(row2);<a name="line.3283"></a>
+<span class="sourceLineNo">3284</span>    put.addColumn(cf_essential, col_alpha, Bytes.toBytes(2));<a name="line.3284"></a>
+<span class="sourceLineNo">3285</span>    put.addColumn(cf_joined, col_normal, Bytes.toBytes(2));<a name="line.3285"></a>
+<span class="sourceLineNo">3286</span>    put.addColumn(cf_alpha, col_alpha, Bytes.toBytes(2));<a name="line.3286"></a>
+<span class="sourceLineNo">3287</span>    region.put(put);<a name="line.3287"></a>
+<span class="sourceLineNo">3288</span><a name="line.3288"></a>
+<span class="sourceLineNo">3289</span>    put = new Put(row3);<a name="line.3289"></a>
+<span class="sourceLineNo">3290</span>    put.addColumn(cf_essential, col_normal, filtered_val);<a name="line.3290"></a>
+<span class="sourceLineNo">3291</span>    put.addColumn(cf_joined, col_normal, filtered_val);<a name="line.3291"></a>
+<span class="sourceLineNo">3292</span>    region.put(put);<a name="line.3292"></a>
+<span class="sourceLineNo">3293</span><a name="line.3293"></a>
+<span class="sourceLineNo">3294</span>    // Check two things:<a name="line.3294"></a>
+<span class="sourceLineNo">3295</span>    // 1. result list contains expected values<a name="line.3295"></a>
+<span class="sourceLineNo">3296</span>    // 2. result list is sorted properly<a name="line.3296"></a>
+<span class="sourceLineNo">3297</span><a name="line.3297"></a>
+<span class="sourceLineNo">3298</span>    Scan scan = new Scan();<a name="line.3298"></a>
+<span class="sourceLineNo">3299</span>    Filter filter = new SingleColumnValueExcludeFilter(cf_essential, col_normal,<a name="line.3299"></a>
+<span class="sourceLineNo">3300</span>            CompareOperator.NOT_EQUAL, filtered_val);<a name="line.3300"></a>
+<span class="sourceLineNo">3301</span>    scan.setFilter(filter);<a name="line.3301"></a>
+<span class="sourceLineNo">3302</span>    scan.setLoadColumnFamiliesOnDemand(true);<a name="line.3302"></a>
+<span class="sourceLineNo">3303</span>    InternalScanner s = region.getScanner(scan);<a name="line.3303"></a>
+<span class="sourceLineNo">3304</span><a name="line.3304"></a>
+<span class="sourceLineNo">3305</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.3305"></a>
+<span class="sourceLineNo">3306</span>    assertTrue(s.next(results));<a name="line.3306"></a>
+<span class="sourceLineNo">3307</span>    assertEquals(1, results.size());<a name="line.3307"></a>
+<span class="sourceLineNo">3308</span>    results.clear();<a name="line.3308"></a>
+<span class="sourceLineNo">3309</span><a name="line.3309"></a>
+<span class="sourceLineNo">3310</span>    assertTrue(s.next(results));<a name="line.3310"></a>
+<span class="sourceLineNo">3311</span>    assertEquals(3, results.size());<a name="line.3311"></a>
+<span class="sourceLineNo">3312</span>    assertTrue("orderCheck", CellUtil.matchingFamily(results.get(0), cf_alpha));<a name="line.3312"></a>
+<span class="sourceLineNo">3313</span>    assertTrue("orderCheck", CellUtil.matchingFamily(results.get(1), cf_essential));<a name="line.3313"></a>
+<span class="sourceLineNo">3314</span>    assertTrue("orderCheck", CellUtil.matchingFamily(results.get(2), cf_joined));<a name="line.3314"></a>
+<span class="sourceLineNo">3315</span>    results.clear();<a name="line.3315"></a>
+<span class="sourceLineNo">3316</span><a name="line.3316"></a>
+<span class="sourceLineNo">3317</span>    assertFalse(s.next(results));<a name="line.3317"></a>
+<span class="sourceLineNo">3318</span>    assertEquals(0, results.size());<a name="line.3318"></a>
+<span class="sourceLineNo">3319</span>  }<a name="line.3319"></a>
 <span class="sourceLineNo">3320</span><a name="line.3320"></a>
-<span class="sourceLineNo">3321</span>    this.region = initHRegion(tableName, method, CONF, cf_first, cf_second);<a name="line.3321"></a>
-<span class="sourceLineNo">3322</span>    final byte[] col_a = Bytes.toBytes("a");<a name="line.3322"></a>
-<span class="sourceLineNo">3323</span>    final byte[] col_b = Bytes.toBytes("b");<a name="line.3323"></a>
-<span class="sourceLineNo">3324</span><a name="line.3324"></a>
-<span class="sourceLineNo">3325</span>    Put put;<a name="line.3325"></a>
-<span class="sourceLineNo">3326</span><a name="line.3326"></a>
-<span class="sourceLineNo">3327</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.3327"></a>
-<span class="sourceLineNo">3328</span>      put = new Put(Bytes.toBytes("r" + Integer.toString(i)));<a name="line.3328"></a>
-<span class="sourceLineNo">3329</span>      put.addColumn(cf_first, col_a, Bytes.toBytes(i));<a name="line.3329"></a>
-<span class="sourceLineNo">3330</span>      if (i &lt; 5) {<a name="line.3330"></a>
-<span class="sourceLineNo">3331</span>        put.addColumn(cf_first, col_b, Bytes.toBytes(i));<a name="line.3331"></a>
-<span class="sourceLineNo">3332</span>        put.addColumn(cf_second, col_a, Bytes.toBytes(i));<a name="line.3332"></a>
-<span class="sourceLineNo">3333</span>        put.addColumn(cf_second, col_b, Bytes.toBytes(i));<a name="line.3333"></a>
-<span class="sourceLineNo">3334</span>      }<a name="line.3334"></a>
-<span class="sourceLineNo">3335</span>      region.put(put);<a name="line.3335"></a>
-<span class="sourceLineNo">3336</span>    }<a name="line.3336"></a>
-<span class="sourceLineNo">3337</span><a name="line.3337"></a>
-<span class="sourceLineNo">3338</span>    Scan scan = new Scan();<a name="line.3338"></a>
-<span class="sourceLineNo">3339</span>    scan.setLoadColumnFamiliesOnDemand(true);<a name="line.3339"></a>
-<span class="sourceLineNo">3340</span>    Filter bogusFilter = new FilterBase() {<a name="line.3340"></a>
-<span class="sourceLineNo">3341</span>      @Override<a name="line.3341"></a>
-<span class="sourceLineNo">3342</span>      public ReturnCode filterCell(final Cell ignored) throws IOException {<a name="line.3342"></a>
-<span class="sourceLineNo">3343</span>        return ReturnCode.INCLUDE;<a name="line.3343"></a>
+<span class="sourceLineNo">3321</span>  /**<a name="line.3321"></a>
+<span class="sourceLineNo">3322</span>   * HBASE-5416<a name="line.3322"></a>
+<span class="sourceLineNo">3323</span>   *<a name="line.3323"></a>
+<span class="sourceLineNo">3324</span>   * Test case when scan limits amount of KVs returned on each next() call.<a name="line.3324"></a>
+<span class="sourceLineNo">3325</span>   */<a name="line.3325"></a>
+<span class="sourceLineNo">3326</span>  @Test<a name="line.3326"></a>
+<span class="sourceLineNo">3327</span>  public void testScanner_JoinedScannersWithLimits() throws IOException {<a name="line.3327"></a>
+<span class="sourceLineNo">3328</span>    final byte[] cf_first = Bytes.toBytes("first");<a name="line.3328"></a>
+<span class="sourceLineNo">3329</span>    final byte[] cf_second = Bytes.toBytes("second");<a name="line.3329"></a>
+<span class="sourceLineNo">3330</span><a name="line.3330"></a>
+<span class="sourceLineNo">3331</span>    this.region = initHRegion(tableName, method, CONF, cf_first, cf_second);<a name="line.3331"></a>
+<span class="sourceLineNo">3332</span>    final byte[] col_a = Bytes.toBytes("a");<a name="line.3332"></a>
+<span class="sourceLineNo">3333</span>    final byte[] col_b = Bytes.toBytes("b");<a name="line.3333"></a>
+<span class="sourceLineNo">3334</span><a name="line.3334"></a>
+<span class="sourceLineNo">3335</span>    Put put;<a name="line.3335"></a>
+<span class="sourceLineNo">3336</span><a name="line.3336"></a>
+<span class="sourceLineNo">3337</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.3337"></a>
+<span class="sourceLineNo">3338</span>      put = new Put(Bytes.toBytes("r" + Integer.toString(i)));<a name="line.3338"></a>
+<span class="sourceLineNo">3339</span>      put.addColumn(cf_first, col_a, Bytes.toBytes(i));<a name="line.3339"></a>
+<span class="sourceLineNo">3340</span>      if (i &lt; 5) {<a name="line.3340"></a>
+<span class="sourceLineNo">3341</span>        put.addColumn(cf_first, col_b, Bytes.toBytes(i));<a name="line.3341"></a>
+<span class="sourceLineNo">3342</span>        put.addColumn(cf_second, col_a, Bytes.toBytes(i));<a name="line.3342"></a>
+<span class="sourceLineNo">3343</span>        put.addColumn(cf_second, col_b, Bytes.toBytes(i));<a name="line.3343"></a>
 <span class="sourceLineNo">3344</span>      }<a name="line.3344"></a>
-<span class="sourceLineNo">3345</span>      @Override<a name="line.3345"></a>
-<span class="sourceLineNo">3346</span>      public boolean isFamilyEssential(byte[] name) {<a name="line.3346"></a>
-<span class="sourceLineNo">3347</span>        return Bytes.equals(name, cf_first);<a name="line.3347"></a>
-<span class="sourceLineNo">3348</span>      }<a name="line.3348"></a>
-<span class="sourceLineNo">3349</span>    };<a name="line.3349"></a>
-<span class="sourceLineNo">3350</span><a name="line.3350"></a>
-<span class="sourceLineNo">3351</span>    scan.setFilter(bogusFilter);<a name="line.3351"></a>
-<span class="sourceLineNo">3352</span>    InternalScanner s = region.getScanner(scan);<a name="line.3352"></a>
-<span class="sourceLineNo">3353</span><a name="line.3353"></a>
-<span class="sourceLineNo">3354</span>    // Our data looks like this:<a name="line.3354"></a>
-<span class="sourceLineNo">3355</span>    // r0: first:a, first:b, second:a, second:b<a name="line.3355"></a>
-<span class="sourceLineNo">3356</span>    // r1: first:a, first:b, second:a, second:b<a name="line.3356"></a>
-<span class="sourceLineNo">3357</span>    // r2: first:a, first:b, second:a, second:b<a name="line.3357"></a>
-<span class="sourceLineNo">3358</span>    // r3: first:a, first:b, second:a, second:b<a name="line.3358"></a>
-<span class="sourceLineNo">3359</span>    // r4: first:a, first:b, second:a, second:b<a name="line.3359"></a>
-<span class="sourceLineNo">3360</span>    // r5: first:a<a name="line.3360"></a>
-<span class="sourceLineNo">3361</span>    // r6: first:a<a name="line.3361"></a>
-<span class="sourceLineNo">3362</span>    // r7: first:a<a name="line.3362"></a>
-<span class="sourceLineNo">3363</span>    // r8: first:a<a name="line.3363"></a>
-<span class="sourceLineNo">3364</span>    // r9: first:a<a name="line.3364"></a>
-<span class="sourceLineNo">3365</span><a name="line.3365"></a>
-<span class="sourceLineNo">3366</span>    // But due to next's limit set to 3, we should get this:<a name="line.3366"></a>
-<span class="sourceLineNo">3367</span>    // r0: first:a, first:b, second:a<a name="line.3367"></a>
-<span class="sourceLineNo">3368</span>    // r0: second:b<a name="line.3368"></a>
-<span class="sourceLineNo">3369</span>    // r1: first:a, first:b, second:a<a name="line.3369"></a>
-<span class="sourceLineNo">3370</span>    // r1: second:b<a name="line.3370"></a>
-<span class="sourceLineNo">3371</span>    // r2: first:a, first:b, second:a<a name="line.3371"></a>
-<span class="sourceLineNo">3372</span>    // r2: second:b<a name="line.3372"></a>
-<span class="sourceLineNo">3373</span>    // r3: first:a, first:b, second:a<a name="line.3373"></a>
-<span class="sourceLineNo">3374</span>    // r3: second:b<a name="line.3374"></a>
-<span class="sourceLineNo">3375</span>    // r4: first:a, first:b, second:a<a name="line.3375"></a>
-<span class="sourceLineNo">3376</span>    // r4: second:b<a name="line.3376"></a>
-<span class="sourceLineNo">3377</span>    // r5: first:a<a name="line.3377"></a>
-<span class="sourceLineNo">3378</span>    // r6: first:a<a name="line.3378"></a>
-<span class="sourceLineNo">3379</span>    // r7: first:a<a name="line.3379"></a>
-<span class="sourceLineNo">3380</span>    // r8: first:a<a name="line.3380"></a>
-<span class="sourceLineNo">3381</span>    // r9: first:a<a name="line.3381"></a>
-<span class="sourceLineNo">3382</span><a name="line.3382"></a>
-<span class="sourceLineNo">3383</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.3383"></a>
-<span class="sourceLineNo">3384</span>    int index = 0;<a name="line.3384"></a>
-<span class="sourceLineNo">3385</span>    ScannerContext scannerContext = ScannerContext.newBuilder().setBatchLimit(3).build();<a name="line.3385"></a>
-<span class="sourceLineNo">3386</span>    while (true) {<a name="line.3386"></a>
-<span class="sourceLineNo">3387</span>      boolean more = s.next(results, scannerContext);<a name="line.3387"></a>
-<span class="sourceLineNo">3388</span>      if ((index &gt;&gt; 1) &lt; 5) {<a name="line.3388"></a>
-<span class="sourceLineNo">3389</span>        if (index % 2 == 0) {<a name="line.3389"></a>
-<span class="sourceLineNo">3390</span>          assertEquals(3, results.size());<a name="line.3390"></a>
-<span class="sourceLineNo">3391</span>        } else {<a name="line.3391"></a>
-<span class="sourceLineNo">3392</span>          assertEquals(1, results.size());<a name="line.3392"></a>
-<span class="sourceLineNo">3393</span>        }<a name="line.3393"></a>
-<span class="sourceLineNo">3394</span>      } else {<a name="line.3394"></a>
-<span class="sourceLineNo">3395</span>        assertEquals(1, results.size());<a name="line.3395"></a>
-<span class="sourceLineNo">3396</span>      }<a name="line.3396"></a>
-<span class="sourceLineNo">3397</span>      results.clear();<a name="line.3397"></a>
-<span class="sourceLineNo">3398</span>      index++;<a name="line.3398"></a>
-<span class="sourceLineNo">3399</span>      if (!more) {<a name="line.3399"></a>
-<span class="sourceLineNo">3400</span>        break;<a name="line.3400"></a>
-<span class="sourceLineNo">3401</span>      }<a name="line.3401"></a>
-<span class="sourceLineNo">3402</span>    }<a name="line.3402"></a>
-<span class="sourceLineNo">3403</span>  }<a name="line.3403"></a>
-<span class="sourceLineNo">3404</span><a name="line.3404"></a>
-<span class="sourceLineNo">3405</span>  /**<a name="line.3405"></a>
-<span class="sourceLineNo">3406</span>   * Write an HFile block full with Cells whose qualifier that are identical between<a name="line.3406"></a>
-<span class="sourceLineNo">3407</span>   * 0 and Short.MAX_VALUE. See HBASE-13329.<a name="line.3407"></a>
-<span class="sourceLineNo">3408</span>   * @throws Exception<a name="line.3408"></a>
-<span class="sourceLineNo">3409</span>   */<a name="line.3409"></a>
-<span class="sourceLineNo">3410</span>  @Test<a name="line.3410"></a>
-<span class="sourceLineNo">3411</span>  public void testLongQualifier() throws Exception {<a name="line.3411"></a>
-<span class="sourceLineNo">3412</span>    byte[] family = Bytes.toBytes("family");<a name="line.3412"></a>
-<span class="sourceLineNo">3413</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.3413"></a>
-<span class="sourceLineNo">3414</span>    byte[] q = new byte[Short.MAX_VALUE+2];<a name="line.3414"></a>
-<span class="sourceLineNo">3415</span>    Arrays.fill(q, 0, q.length-1, (byte)42);<a name="line.3415"></a>
-<span class="sourceLineNo">3416</span>    for (byte i=0; i&lt;10; i++) {<a name="line.3416"></a>
-<span class="sourceLineNo">3417</span>      Put p = new Put(Bytes.toBytes("row"));<a name="line.3417"></a>
-<span class="sourceLineNo">3418</span>      // qualifiers that differ past Short.MAX_VALUE<a name="line.3418"></a>
-<span class="sourceLineNo">3419</span>      q[q.length-1]=i;<a name="line.3419"></a>
-<span class="sourceLineNo">3420</span>      p.addColumn(family, q, q);<a name="line.3420"></a>
-<span class="sourceLineNo">3421</span>      region.put(p);<a name="line.3421"></a>
-<span class="sourceLineNo">3422</span>    }<a name="line.3422"></a>
-<span class="sourceLineNo">3423</span>    region.flush(false);<a name="line.3423"></a>
-<span class="sourceLineNo">3424</span>  }<a name="line.3424"></a>
-<span class="sourceLineNo">3425</span><a name="line.3425"></a>
-<span class="sourceLineNo">3426</span>  /**<a name="line.3426"></a>
-<span class="sourceLineNo">3427</span>   * Flushes the cache in a thread while scanning. The tests verify that the<a name="line.3427"></a>
-<span class="sourceLineNo">3428</span>   * scan is coherent - e.g. the returned results are always of the same or<a name="line.3428"></a>
-<span class="sourceLineNo">3429</span>   * later update as the previous results.<a name="line.3429"></a>
-<span class="sourceLineNo">3430</span>   *<a name="line.3430"></a>
-<span class="sourceLineNo">3431</span>   * @throws IOException<a name="line.3431"></a>
-<span class="sourceLineNo">3432</span>   *           scan / compact<a name="line.3432"></a>
-<span class="sourceLineNo">3433</span>   * @throws InterruptedException<a name="line.3433"></a>
-<span class="sourceLineNo">3434</span>   *           thread join<a name="line.3434"></a>
-<span class="sourceLineNo">3435</span>   */<a name="line.3435"></a>
-<span class="sourceLineNo">3436</span>  @Test<a name="line.3436"></a>
-<span class="sourceLineNo">3437</span>  public void testFlushCacheWhileScanning() throws IOException, InterruptedException {<a name="line.3437"></a>
-<span class="sourceLineNo">3438</span>    byte[] family = Bytes.toBytes("family");<a name="line.3438"></a>
-<span class="sourceLineNo">3439</span>    int numRows = 1000;<a name="line.3439"></a>
-<span class="sourceLineNo">3440</span>    int flushAndScanInterval = 10;<a name="line.3440"></a>
-<span class="sourceLineNo">3441</span>    int compactInterval = 10 * flushAndScanInterval;<a name="line.3441"></a>
-<span class="sourceLineNo">3442</span><a name="line.3442"></a>
-<span class="sourceLineNo">3443</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.3443"></a>
-<span class="sourceLineNo">3444</span>    FlushThread flushThread = new FlushThread();<a name="line.3444"></a>
-<span class="sourceLineNo">3445</span>    try {<a name="line.3445"></a>
-<span class="sourceLineNo">3446</span>      flushThread.start();<a name="line.3446"></a>
-<span class="sourceLineNo">3447</span><a name="line.3447"></a>
-<span class="sourceLineNo">3448</span>      Scan scan = new Scan();<a name="line.3448"></a>
-<span class="sourceLineNo">3449</span>      scan.addFamily(family);<a name="line.3449"></a>
-<span class="sourceLineNo">3450</span>      scan.setFilter(new SingleColumnValueFilter(family, qual1, CompareOperator.EQUAL,<a name="line.3450"></a>
-<span class="sourceLineNo">3451</span>          new BinaryComparator(Bytes.toBytes(5L))));<a name="line.3451"></a>
+<span class="sourceLineNo">3345</span>      region.put(put);<a name="line.3345"></a>
+<span class="sourceLineNo">3346</span>    }<a name="line.3346"></a>
+<span class="sourceLineNo">3347</span><a name="line.3347"></a>
+<span class="sourceLineNo">3348</span>    Scan scan = new Scan();<a name="line.3348"></a>
+<span class="sourceLineNo">3349</span>    scan.setLoadColumnFamiliesOnDemand(true);<a name="line.3349"></a>
+<span class="sourceLineNo">3350</span>    Filter bogusFilter = new FilterBase() {<a name="line.3350"></a>
+<span class="sourceLineNo">3351</span>      @Override<a name="line.3351"></a>
+<span class="sourceLineNo">3352</span>      public ReturnCode filterCell(final Cell ignored) throws IOException {<a name="line.3352"></a>
+<span class="sourceLineNo">3353</span>        return ReturnCode.INCLUDE;<a name="line.3353"></a>
+<span class="sourceLineNo">3354</span>      }<a name="line.3354"></a>
+<span class="sourceLineNo">3355</span>      @Override<a name="line.3355"></a>
+<span class="sourceLineNo">3356</span>      public boolean isFamilyEssential(byte[] name) {<a name="line.3356"></a>
+<span class="sourceLineNo">3357</span>        return Bytes.equals(name, cf_first);<a name="line.3357"></a>
+<span class="sourceLineNo">3358</span>      }<a name="line.3358"></a>
+<span class="sourceLineNo">3359</span>    };<a name="line.3359"></a>
+<span class="sourceLineNo">3360</span><a name="line.3360"></a>
+<span class="sourceLineNo">3361</span>    scan.setFilter(bogusFilter);<a name="line.3361"></a>
+<span class="sourceLineNo">3362</span>    InternalScanner s = region.getScanner(scan);<a name="line.3362"></a>
+<span class="sourceLineNo">3363</span><a name="line.3363"></a>
+<span class="sourceLineNo">3364</span>    // Our data looks like this:<a name="line.3364"></a>
+<span class="sourceLineNo">3365</span>    // r0: first:a, first:b, second:a, second:b<a name="line.3365"></a>
+<span class="sourceLineNo">3366</span>    // r1: first:a, first:b, second:a, second:b<a name="line.3366"></a>
+<span class="sourceLineNo">3367</span>    // r2: first:a, first:b, second:a, second:b<a name="line.3367"></a>
+<span class="sourceLineNo">3368</span>    // r3: first:a, first:b, second:a, second:b<a name="line.3368"></a>
+<span class="sourceLineNo">3369</span>    // r4: first:a, first:b, second:a, second:b<a name="line.3369"></a>
+<span class="sourceLineNo">3370</span>    // r5: first:a<a name="line.3370"></a>
+<span class="sourceLineNo">3371</span>    // r6: first:a<a name="line.3371"></a>
+<span class="sourceLineNo">3372</span>    // r7: first:a<a name="line.3372"></a>
+<span class="sourceLineNo">3373</span>    // r8: first:a<a name="line.3373"></a>
+<span class="sourceLineNo">3374</span>    // r9: first:a<a name="line.3374"></a>
+<span class="sourceLineNo">3375</span><a name="line.3375"></a>
+<span class="sourceLineNo">3376</span>    // But due to next's limit set to 3, we should get this:<a name="line.3376"></a>
+<span class="sourceLineNo">3377</span>    // r0: first:a, first:b, second:a<a name="line.3377"></a>
+<span class="sourceLineNo">3378</span>    // r0: second:b<a name="line.3378"></a>
+<span class="sourceLineNo">3379</span>    // r1: first:a, first:b, second:a<a name="line.3379"></a>
+<span class="sourceLineNo">3380</span>    // r1: second:b<a name="line.3380"></a>
+<span class="sourceLineNo">3381</span>    // r2: first:a, first:b, second:a<a name="line.3381"></a>
+<span class="sourceLineNo">3382</span>    // r2: second:b<a name="line.3382"></a>
+<span class="sourceLineNo">3383</span>    // r3: first:a, first:b, second:a<a name="line.3383"></a>
+<span class="sourceLineNo">3384</span>    // r3: second:b<a name="line.3384"></a>
+<span class="sourceLineNo">3385</span>    // r4: first:a, first:b, second:a<a name="line.3385"></a>
+<span class="sourceLineNo">3386</span>    // r4: second:b<a name="line.3386"></a>
+<span class="sourceLineNo">3387</span>    // r5: first:a<a name="line.3387"></a>
+<span class="sourceLineNo">3388</span>    // r6: first:a<a name="line.3388"></a>
+<span class="sourceLineNo">3389</span>    // r7: first:a<a name="line.3389"></a>
+<span class="sourceLineNo">3390</span>    // r8: first:a<a name="line.3390"></a>
+<span class="sourceLineNo">3391</span>    // r9: first:a<a name="line.3391"></a>
+<span class="sourceLineNo">3392</span><a name="line.3392"></a>
+<span class="sourceLineNo">3393</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.3393"></a>
+<span class="sourceLineNo">3394</span>    int index = 0;<a name="line.3394"></a>
+<span class="sourceLineNo">3395</span>    ScannerContext scannerContext = ScannerContext.newBuilder().setBatchLimit(3).build();<a name="line.3395"></a>
+<span class="sourceLineNo">3396</span>    while (true) {<a name="line.3396"></a>
+<span class="sourceLineNo">3397</span>      boolean more = s.next(results, scannerContext);<a name="line.3397"></a>
+<span class="sourceLineNo">3398</span>      if ((index &gt;&gt; 1) &lt; 5) {<a name="line.3398"></a>
+<span class="sourceLineNo">3399</span>        if (index % 2 == 0) {<a name="line.3399"></a>
+<span class="sourceLineNo">3400</span>          assertEquals(3, results.size());<a name="line.3400"></a>
+<span class="sourceLineNo">3401</span>        } else {<a name="line.3401"></a>
+<span class="sourceLineNo">3402</span>          assertEquals(1, results.size());<a name="line.3402"></a>
+<span class="sourceLineNo">3403</span>        }<a name="line.3403"></a>
+<span class="sourceLineNo">3404</span>      } else {<a name="line.3404"></a>
+<span class="sourceLineNo">3405</span>        assertEquals(1, results.size());<a name="line.3405"></a>
+<span class="sourceLineNo">3406</span>      }<a name="line.3406"></a>
+<span class="sourceLineNo">3407</span>      results.clear();<a name="line.3407"></a>
+<span class="sourceLineNo">3408</span>      index++;<a name="line.3408"></a>
+<span class="sourceLineNo">3409</span>      if (!more) {<a name="line.3409"></a>
+<span class="sourceLineNo">3410</span>        break;<a name="line.3410"></a>
+<span class="sourceLineNo">3411</span>      }<a name="line.3411"></a>
+<span class="sourceLineNo">3412</span>    }<a name="line.3412"></a>
+<span class="sourceLineNo">3413</span>  }<a name="line.3413"></a>
+<span class="sourceLineNo">3414</span><a name="line.3414"></a>
+<span class="sourceLineNo">3415</span>  /**<a name="line.3415"></a>
+<span class="sourceLineNo">3416</span>   * Write an HFile block full with Cells whose qualifier that are identical between<a name="line.3416"></a>
+<span class="sourceLineNo">3417</span>   * 0 and Short.MAX_VALUE. See HBASE-13329.<a name="line.3417"></a>
+<span class="sourceLineNo">3418</span>   * @throws Exception<a name="line.3418"></a>
+<span class="sourceLineNo">3419</span>   */<a name="line.3419"></a>
+<span class="sourceLineNo">3420</span>  @Test<a name="line.3420"></a>
+<span class="sourceLineNo">3421</span>  public void testLongQualifier() throws Exception {<a name="line.3421"></a>
+<span class="sourceLineNo">3422</span>    byte[] family = Bytes.toBytes("family");<a name="line.3422"></a>
+<span class="sourceLineNo">3423</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.3423"></a>
+<span class="sourceLineNo">3424</span>    byte[] q = new byte[Short.MAX_VALUE+2];<a name="line.3424"></a>
+<span class="sourceLineNo">3425</span>    Arrays.fill(q, 0, q.length-1, (byte)42);<a name="line.3425"></a>
+<span class="sourceLineNo">3426</span>    for (byte i=0; i&lt;10; i++) {<a name="line.3426"></a>
+<span class="sourceLineNo">3427</span>      Put p = new Put(Bytes.toBytes("row"));<a name="line.3427"></a>
+<span class="sourceLineNo">3428</span>      // qualifiers that differ past Short.MAX_VALUE<a name="line.3428"></a>
+<span class="sourceLineNo">3429</span>      q[q.length-1]=i;<a name="line.3429"></a>
+<span class="sourceLineNo">3430</span>      p.addColumn(family, q, q);<a name="line.3430"></a>
+<span class="sourceLineNo">3431</span>      region.put(p);<a name="line.3431"></a>
+<span class="sourceLineNo">3432</span>    }<a name="line.3432"></a>
+<span class="sourceLineNo">3433</span>    region.flush(false);<a name="line.3433"></a>
+<span class="sourceLineNo">3434</span>  }<a name="line.3434"></a>
+<span class="sourceLineNo">3435</span><a name="line.3435"></a>
+<span class="sourceLineNo">3436</span>  /**<a name="line.3436"></a>
+<span class="sourceLineNo">3437</span>   * Flushes the cache in a thread while scanning. The tests verify that the<a name="line.3437"></a>
+<span class="sourceLineNo">3438</span>   * scan is coherent - e.g. the returned results are always of the same or<a name="line.3438"></a>
+<span class="sourceLineNo">3439</span>   * later update as the previous results.<a name="line.3439"></a>
+<span class="sourceLineNo">3440</span>   *<a name="line.3440"></a>
+<span class="sourceLineNo">3441</span>   * @throws IOException<a name="line.3441"></a>
+<span class="sourceLineNo">3442</span>   *           scan / compact<a name="line.3442"></a>
+<span class="sourceLineNo">3443</span>   * @throws InterruptedException<a name="line.3443"></a>
+<span class="sourceLineNo">3444</span>   *           thread join<a name="line.3444"></a>
+<span class="sourceLineNo">3445</span>   */<a name="line.3445"></a>
+<span class="sourceLineNo">3446</span>  @Test<a name="line.3446"></a>
+<span class="sourceLineNo">3447</span>  public void testFlushCacheWhileScanning() throws IOException, InterruptedException {<a name="line.3447"></a>
+<span class="sourceLineNo">3448</span>    byte[] family = Bytes.toBytes("family");<a name="line.3448"></a>
+<span class="sourceLineNo">3449</span>    int numRows = 1000;<a name="line.3449"></a>
+<span class="sourceLineNo">3450</span>    int flushAndScanInterval = 10;<a name="line.3450"></a>
+<span class="sourceLineNo">3451</span>    int compactInterval = 10 * flushAndScanInterval;<a name="line.3451"></a>
 <span class="sourceLineNo">3452</span><a name="line.3452"></a>
-<span class="sourceLineNo">3453</span>      int expectedCount = 0;<a name="line.3453"></a>
-<span class="sourceLineNo">3454</span>      List&lt;Cell&gt; res = new ArrayList&lt;&gt;();<a name="line.3454"></a>
-<span class="sourceLineNo">3455</span><a name="line.3455"></a>
-<span class="sourceLineNo">3456</span>      boolean toggle = true;<a name="line.3456"></a>
-<span class="sourceLineNo">3457</span>      for (long i = 0; i &lt; numRows; i++) {<a name="line.3457"></a>
-<span class="sourceLineNo">3458</span>        Put put = new Put(Bytes.toBytes(i));<a name="line.3458"></a>
-<span class="sourceLineNo">3459</span>        put.setDurability(Durability.SKIP_WAL);<a name="line.3459"></a>
-<span class="sourceLineNo">3460</span>        put.addColumn(family, qual1, Bytes.toBytes(i % 10));<a name="line.3460"></a>
-<span class="sourceLineNo">3461</span>        region.put(put);<a name="line.3461"></a>
+<span class="sourceLineNo">3453</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.3453"></a>
+<span class="sourceLineNo">3454</span>    FlushThread flushThread = new FlushThread();<a name="line.3454"></a>
+<span class="sourceLineNo">3455</span>    try {<a name="line.3455"></a>
+<span class="sourceLineNo">3456</span>      flushThread.start();<a name="line.3456"></a>
+<span class="sourceLineNo">3457</span><a name="line.3457"></a>
+<span class="sourceLineNo">3458</span>      Scan scan = new Scan();<a name="line.3458"></a>
+<span class="sourceLineNo">3459</span>      scan.addFamily(family);<a name="line.3459"></a>
+<span class="sourceLineNo">3460</span>      scan.setFilter(new SingleColumnValueFilter(family, qual1, CompareOperator.EQUAL,<a name="line.3460"></a>
+<span class="sourceLineNo">3461</span>          new BinaryComparator(Bytes.toBytes(5L))));<a name="line.3461"></a>
 <span class="sourceLineNo">3462</span><a name="line.3462"></a>
-<span class="sourceLineNo">3463</span>        if (i != 0 &amp;&amp; i % compactInterval == 0) {<a name="line.3463"></a>
-<span class="sourceLineNo">3464</span>          LOG.debug("iteration = " + i+ " ts="+System.currentTimeMillis());<a name="line.3464"></a>
-<span class="sourceLineNo">3465</span>          region.compact(true);<a name="line.3465"></a>
-<span class="sourceLineNo">3466</span>        }<a name="line.3466"></a>
-<span class="sourceLineNo">3467</span><a name="line.3467"></a>
-<span class="sourceLineNo">3468</span>        if (i % 10 == 5L) {<a name="line.3468"></a>
-<span class="sourceLineNo">3469</span>          expectedCount++;<a name="line.3469"></a>
-<span class="sourceLineNo">3470</span>        }<a name="line.3470"></a>
-<span class="sourceLineNo">3471</span><a name="line.3471"></a>
-<span class="sourceLineNo">3472</span>        if (i != 0 &amp;&amp; i % flushAndScanInterval == 0) {<a name="line.3472"></a>
-<span class="sourceLineNo">3473</span>          res.clear();<a name="line.3473"></a>
-<span class="sourceLineNo">3474</span>          InternalScanner scanner = region.getScanner(scan);<a name="line.3474"></a>
-<span class="sourceLineNo">3475</span>          if (toggle) {<a name="line.3475"></a>
-<span class="sourceLineNo">3476</span>            flushThread.flush();<a name="line.3476"></a>
-<span class="sourceLineNo">3477</span>          }<a name="line.3477"></a>
-<span class="sourceLineNo">3478</span>          while (scanner.next(res))<a name="line.3478"></a>
-<span class="sourceLineNo">3479</span>            ;<a name="line.3479"></a>
-<span class="sourceLineNo">3480</span>          if (!toggle) {<a name="line.3480"></a>
-<span class="sourceLineNo">3481</span>            flushThread.flush();<a name="line.3481"></a>
-<span class="sourceLineNo">3482</span>          }<a name="line.3482"></a>
-<span class="sourceLineNo">3483</span>          assertEquals("toggle="+toggle+"i=" + i + " ts="+System.currentTimeMillis(),<a name="line.3483"></a>
-<span class="sourceLineNo">3484</span>              expectedCount, res.size());<a name="line.3484"></a>
-<span class="sourceLineNo">3485</span>          toggle = !toggle;<a name="line.3485"></a>
-<span class="sourceLineNo">3486</span>        }<a name="line.3486"></a>
-<span class="sourceLineNo">3487</span>      }<a name="line.3487"></a>
-<span class="sourceLineNo">3488</span><a name="line.3488"></a>
-<span class="sourceLineNo">3489</span>    } finally {<a name="line.3489"></a>
-<span class="sourceLineNo">3490</span>      try {<a name="line.3490"></a>
-<span class="sourceLineNo">3491</span>        flushThread.done();<a name="line.3491"></a>
-<span class="sourceLineNo">3492</span>        flushThread.join();<a name="line.3492"></a>
-<span class="sourceLineNo">3493</span>        flushThread.checkNoError();<a name="line.3493"></a>
-<span class="sourceLineNo">3494</span>      } catch (InterruptedException ie) {<a name="line.3494"></a>
-<span class="sourceLineNo">3495</span>        LOG.warn("Caught exception when joining with flushThread", ie);<a name="line.3495"></a>
-<span class="sourceLineNo">3496</span>      }<a name="line.3496"></a>
-<span class="sourceLineNo">3497</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.3497"></a>
-<span class="sourceLineNo">3498</span>      this.region = null;<a name="line.3498"></a>
-<span class="sourceLineNo">3499</span>    }<a name="line.3499"></a>
-<span class="sourceLineNo">3500</span>  }<a name="line.3500"></a>
-<span class="sourceLineNo">3501</span><a name="line.3501"></a>
-<span class="sourceLineNo">3502</span>  protected class FlushThread extends Thread {<a name="line.3502"></a>
-<span class="sourceLineNo">3503</span>    private volatile boolean done;<a name="line.3503"></a>
-<span class="sourceLineNo">3504</span>    private Throwable error = null;<a name="line.3504"></a>
-<span class="sourceLineNo">3505</span><a name="line.3505"></a>
-<span class="sourceLineNo">3506</span>    FlushThread() {<a name="line.3506"></a>
-<span class="sourceLineNo">3507</span>      super("FlushThread");<a name="line.3507"></a>
-<span class="sourceLineNo">3508</span>    }<a name="line.3508"></a>
-<span class="sourceLineNo">3509</span><a name="line.3509"></a>
-<span class="sourceLineNo">3510</span>    public void done() {<a name="line.3510"></a>
-<span class="sourceLineNo">3511</span>      done = true;<a name="line.3511"></a>
-<span class="sourceLineNo">3512</span>      synchronized (this) {<a name="line.3512"></a>
-<span class="sourceLineNo">3513</span>        interrupt();<a name="line.3513"></a>
-<span class="sourceLineNo">3514</span>      }<a name="line.3514"></a>
-<span class="sourceLineNo">3515</span>    }<a name="line.3515"></a>
-<span class="sourceLineNo">3516</span><a name="line.3516"></a>
-<span class="sourceLineNo">3517</span>    public void checkNoError() {<a name="line.3517"></a>
-<span class="sourceLineNo">3518</span>      if (error != null) {<a name="line.3518"></a>
-<span class="sourceLineNo">3519</span>        assertNull(error);<a name="line.3519"></a>
-<span class="sourceLineNo">3520</span>      }<a name="line.3520"></a>
-<span class="sourceLineNo">3521</span>    }<a name="line.3521"></a>
-<span class="sourceLineNo">3522</span><a name="line.3522"></a>
-<span class="sourceLineNo">3523</span>    @Override<a name="line.3523"></a>
-<span class="sourceLineNo">3524</span>    public void run() {<a name="line.3524"></a>
-<span class="sourceLineNo">3525</span>      done = false;<a name="line.3525"></a>
-<span class="sourceLineNo">3526</span>      while (!done) {<a name="line.3526"></a>
-<span class="sourceLineNo">3527</span>        synchronized (this) {<a name="line.3527"></a>
-<span class="sourceLineNo">3528</span>          try {<a name="line.3528"></a>
-<span class="sourceLineNo">3529</span>            wait();<a name="line.3529"></a>
-<span class="sourceLineNo">3530</span>          } catch (InterruptedException ignored) {<a name="line.3530"></a>
-<span class="sourceLineNo">3531</span>            if (done) {<a name="line.3531"></a>
-<span class="sourceLineNo">3532</span>              break;<a name="line.3532"></a>
-<span class="sourceLineNo">3533</span>            }<a name="line.3533"></a>
-<span class="sourceLineNo">3534</span>          }<a name="line.3534"></a>
-<span class="sourceLineNo">3535</span>        }<a name="line.3535"></a>
-<span class="sourceLineNo">3536</span>        try {<a name="line.3536"></a>
-<span class="sourceLineNo">3537</span>          region.flush(true);<a name="line.3537"></a>
-<span class="sourceLineNo">3538</span>        } catch (IOException e) {<a name="line.3538"></a>
-<span class="sourceLineNo">3539</span>          if (!done) {<a name="line.3539"></a>
-<span class="sourceLineNo">3540</span>            LOG.error("Error while flushing cache", e);<a name="line.3540"></a>
-<span class="sourceLineNo">3541</span>            error = e;<a name="line.3541"></a>
-<span class="sourceLineNo">3542</span>          }<a name="line.3542"></a>
-<span class="sourceLineNo">3543</span>          break;<a name="line.3543"></a>
-<span class="sourceLineNo">3544</span>        } catch (Throwable t) {<a name="line.3544"></a>
-<span class="sourceLineNo">3545</span>          LOG.error("Uncaught exception", t);<a name="line.3545"></a>
-<span class="sourceLineNo">3546</span>          throw t;<a name="line.3546"></a>
-<span class="sourceLineNo">3547</span>        }<a name="line.3547"></a>
-<span class="sourceLineNo">3548</span>      }<a name="line.3548"></a>
-<span class="sourceLineNo">3549</span>    }<a name="line.3549"></a>
-<span class="sourceLineNo">3550</span><a name="line.3550"></a>
-<span class="sourceLineNo">3551</span>    public void flush() {<a name="line.3551"></a>
-<span class="sourceLineNo">3552</span>      synchronized (this) {<a name="line.3552"></a>
-<span class="sourceLineNo">3553</span>        notify();<a name="line.3553"></a>
-<span class="sourceLineNo">3554</span>      }<a name="line.3554"></a>
-<span class="sourceLineNo">3555</span>    }<a name="line.3555"></a>
-<span class="sourceLineNo">3556</span>  }<a name="line.3556"></a>
-<span class="sourceLineNo">3557</span><a name="line.3557"></a>
-<span class="sourceLineNo">3558</span>  /**<a name="line.3558"></a>
-<span class="sourceLineNo">3559</span>   * Writes very wide records and scans for the latest every time.. Flushes and<a name="line.3559"></a>
-<span class="sourceLineNo">3560</span>   * compacts the region every now and then to keep things realistic.<a name="line.3560"></a>
-<span class="sourceLineNo">3561</span>   *<a name="line.3561"></a>
-<span class="sourceLineNo">3562</span>   * @throws IOException<a name="line.3562"></a>
-<span class="sourceLineNo">3563</span>   *           by flush / scan / compaction<a name="line.3563"></a>
-<span class="sourceLineNo">3564</span>   * @throws InterruptedException<a name="line.3564"></a>
-<span class="sourceLineNo">3565</span>   *           when joining threads<a name="line.3565"></a>
-<span class="sourceLineNo">3566</span>   */<a name="line.3566"></a>
-<span class="sourceLineNo">3567</span>  @Test<a name="line.3567"></a>
-<span class="sourceLineNo">3568</span>  public void testWritesWhileScanning() throws IOException, InterruptedException {<a name="line.3568"></a>
-<span class="sourceLineNo">3569</span>    int testCount = 100;<a name="line.3569"></a>
-<span class="sourceLineNo">3570</span>    int numRows = 1;<a name="line.3570"></a>
-<span class="sourceLineNo">3571</span>    int numFamilies = 10;<a name="line.3571"></a>
-<span class="sourceLineNo">3572</span>    int numQualifiers = 100;<a name="line.3572"></a>
-<span class="sourceLineNo">3573</span>    int flushInterval = 7;<a name="line.3573"></a>
-<span class="sourceLineNo">3574</span>    int compactInterval = 5 * flushInterval;<a name="line.3574"></a>
-<span class="sourceLineNo">3575</span>    byte[][] families = new byte[numFamilies][];<a name="line.3575"></a>
-<span class="sourceLineNo">3576</span>    for (int i = 0; i &lt; numFamilies; i++) {<a name="line.3576"></a>
-<span class="sourceLineNo">3577</span>      families[i] = Bytes.toBytes("family" + i);<a name="line.3577"></a>
-<span class="sourceLineNo">3578</span>    }<a name="line.3578"></a>
-<span class="sourceLineNo">3579</span>    byte[][] qualifiers = new byte[numQualifiers][];<a name="line.3579"></a>
-<span class="sourceLineNo">3580</span>    for (int i = 0; i &lt; numQualifiers; i++) {<a name="line.3580"></a>
-<span class="sourceLineNo">3581</span>      qualifiers[i] = Bytes.toBytes("qual" + i);<a name="line.3581"></a>
-<span class="sourceLineNo">3582</span>    }<a name="line.3582"></a>
-<span class="sourceLineNo">3583</span><a name="line.3583"></a>
-<span class="sourceLineNo">3584</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.3584"></a>
-<span class="sourceLineNo">3585</span>    FlushThread flushThread = new FlushThread();<a name="line.3585"></a>
-<span class="sourceLineNo">3586</span>    PutThread putThread = new PutThread(numRows, families, qualifiers);<a name="line.3586"></a>
-<span class="sourceLineNo">3587</span>    try {<a name="line.3587"></a>
-<span class="sourceLineNo">3588</span>      putThread.start();<a name="line.3588"></a>
-<span class="sourceLineNo">3589</span>      putThread.waitForFirstPut();<a name="line.3589"></a>
-<span class="sourceLineNo">3590</span><a name="line.3590"></a>
-<span class="sourceLineNo">3591</span>      flushThread.start();<a name="line.3591"></a>
-<span class="sourceLineNo">3592</span><a name="line.3592"></a>
-<span class="sourceLineNo">3593</span>      Scan scan = new Scan(Bytes.toBytes("row0"), Bytes.toBytes("row1"));<a name="line.3593"></a>
-<span class="sourceLineNo">3594</span><a name="line.3594"></a>
-<span class="sourceLineNo">3595</span>      int expectedCount = numFamilies * numQualifiers;<a name="line.3595"></a>
-<span class="sourceLineNo">3596</span>      List&lt;Cell&gt; res = new ArrayList&lt;&gt;();<a name="line.3596"></a>
-<span class="sourceLineNo">3597</span><a name="line.3597"></a>
-<span class="sourceLineNo">3598</span>      long prevTimestamp = 0L;<a name="line.3598"></a>
-<span class="sourceLineNo">3599</span>      for (int i = 0; i &lt; testCount; i++) {<a name="line.3599"></a>
+<span class="sourceLineNo">3463</span>      int expectedCount = 0;<a name="line.3463"></a>
+<span class="sourceLineNo">3464</span>      List&lt;Cell&gt; res = new ArrayList&lt;&gt;();<a name="line.3464"></a>
+<span class="sourceLineNo">3465</span><a name="line.3465"></a>
+<span class="sourceLineNo">3466</span>      boolean toggle = true;<a name="line.3466"></a>
+<span class="sourceLineNo">3467</span>      for (long i = 0; i &lt; numRows; i++) {<a name="line.3467"></a>
+<span class="sourceLineNo">3468</span>        Put put = new Put(Bytes.toBytes(i));<a name="line.3468"></a>
+<span class="sourceLineNo">3469</span>        put.setDurability(Durability.SKIP_WAL);<a name="line.3469"></a>
+<span class="sourceLineNo">3470</span>        put.addColumn(family, qual1, Bytes.toBytes(i % 10));<a name="line.3470"></a>
+<span class="sourceLineNo">3471</span>        region.put(put);<a name="line.3471"></a>
+<span class="sourceLineNo">3472</span><a name="line.3472"></a>
+<span class="sourceLineNo">3473</span>        if (i != 0 &amp;&amp; i % compactInterval == 0) {<a name="line.3473"></a>
+<span class="sourceLineNo">3474</span>          LOG.debug("iteration = " + i+ " ts="+System.currentTimeMillis());<a name="line.3474"></a>
+<span class="sourceLineNo">3475</span>          region.compact(true);<a name="line.3475"></a>
+<span class="sourceLineNo">3476</span>        }<a name="line.3476"></a>
+<span class="sourceLineNo">3477</span><a name="line.3477"></a>
+<span class="sourceLineNo">3478</span>        if (i % 10 == 5L) {<a name="line.3478"></a>
+<span class="sourceLineNo">3479</span>          expectedCount++;<a name="line.3479"></a>
+<span class="sourceLineNo">3480</span>        }<a name="line.3480"></a>
+<span class="sourceLineNo">3481</span><a name="line.3481"></a>
+<span class="sourceLineNo">3482</span>        if (i != 0 &amp;&amp; i % flushAndScanInterval == 0) {<a name="line.3482"></a>
+<span class="sourceLineNo">3483</span>          res.clear();<a name="line.3483"></a>
+<span class="sourceLineNo">3484</span>          InternalScanner scanner = region.getScanner(scan);<a name="line.3484"></a>
+<span class="sourceLineNo">3485</span>          if (toggle) {<a name="line.3485"></a>
+<span class="sourceLineNo">3486</span>            flushThread.flush();<a name="line.3486"></a>
+<span class="sourceLineNo">3487</span>          }<a name="line.3487"></a>
+<span class="sourceLineNo">3488</span>          while (scanner.next(res))<a name="line.3488"></a>
+<span class="sourceLineNo">3489</span>            ;<a name="line.3489"></a>
+<span class="sourceLineNo">3490</span>          if (!toggle) {<a name="line.3490"></a>
+<span class="sourceLineNo">3491</span>            flushThread.flush();<a name="line.3491"></a>
+<span class="sourceLineNo">3492</span>          }<a name="line.3492"></a>
+<span class="sourceLineNo">3493</span>          assertEquals("toggle="+toggle+"i=" + i + " ts="+System.currentTimeMillis(),<a name="line.3493"></a>
+<span class="sourceLineNo">3494</span>              expectedCount, res.size());<a name="line.3494"></a>
+<span class="sourceLineNo">3495</span>          toggle = !toggle;<a name="line.3495"></a>
+<span class="sourceLineNo">3496</span>        }<a name="line.3496"></a>
+<span class="sourceLineNo">3497</span>      }<a name="line.3497"></a>
+<span class="sourceLineNo">3498</span><a name="line.3498"></a>
+<span class="sourceLineNo">3499</span>    } finally {<a name="line.3499"></a>
+<span class="sourceLineNo">3500</span>      try {<a name="line.3500"></a>
+<span class="sourceLineNo">3501</span>        flushThread.done();<a name="line.3501"></a>
+<span class="sourceLineNo">3502</span>        flushThread.join();<a name="line.3502"></a>
+<span class="sourceLineNo">3503</span>        flushThread.checkNoError();<a name="line.3503"></a>
+<span class="sourceLineNo">3504</span>      } catch (InterruptedException ie) {<a name="line.3504"></a>
+<span class="sourceLineNo">3505</span>        LOG.warn("Caught exception when joining with flushThread", ie);<a name="line.3505"></a>
+<span class="sourceLineNo">3506</span>      }<a name="line.3506"></a>
+<span class="sourceLineNo">3507</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.3507"></a>
+<span class="sourceLineNo">3508</span>      this.region = null;<a name="line.3508"></a>
+<span class="sourceLineNo">3509</span>    }<a name="line.3509"></a>
+<span class="sourceLineNo">3510</span>  }<a name="line.3510"></a>
+<span class="sourceLineNo">3511</span><a name="line.3511"></a>
+<span class="sourceLineNo">3512</span>  protected class FlushThread extends Thread {<a name="line.3512"></a>
+<span class="sourceLineNo">3513</span>    private volatile boolean done;<a name="line.3513"></a>
+<span class="sourceLineNo">3514</span>    private Throwable error = null;<a name="line.3514"></a>
+<span class="sourceLineNo">3515</span><a name="line.3515"></a>
+<span class="sourceLineNo">3516</span>    FlushThread() {<a name="line.3516"></a>
+<span class="sourceLineNo">3517</span>      super("FlushThread");<a name="line.3517"></a>
+<span class="sourceLineNo">3518</span>    }<a name="line.3518"></a>
+<span class="sourceLineNo">3519</span><a name="line.3519"></a>
+<span class="sourceLineNo">3520</span>    public void done() {<a name="line.3520"></a>
+<span class="sourceLineNo">3521</span>      done = true;<a name="line.3521"></a>
+<span class="sourceLineNo">3522</span>      synchronized (this) {<a name="line.3522"></a>
+<span class="sourceLineNo">3523</span>        interrupt();<a name="line.3523"></a>
+<span class="sourceLineNo">3524</span>      }<a name="line.3524"></a>
+<span class="sourceLineNo">3525</span>    }<a name="line.3525"></a>
+<span class="sourceLineNo">3526</span><a name="line.3526"></a>
+<span class="sourceLineNo">3527</span>    public void checkNoError() {<a name="line.3527"></a>
+<span class="sourceLineNo">3528</span>      if (error != null) {<a name="line.3528"></a>
+<span class="sourceLineNo">3529</span>        assertNull(error);<a name="line.3529"></a>
+<span class="sourceLineNo">3530</span>      }<a name="line.3530"></a>
+<span class="sourceLineNo">3531</span>    }<a name="line.3531"></a>
+<span class="sourceLineNo">3532</span><a name="line.3532"></a>
+<span class="sourceLineNo">3533</span>    @Override<a name="line.3533"></a>
+<span class="sourceLineNo">3534</span>    public void run() {<a name="line.3534"></a>
+<span class="sourceLineNo">3535</span>      done = false;<a name="line.3535"></a>
+<span class="sourceLineNo">3536</span>      while (!done) {<a name="line.3536"></a>
+<span class="sourceLineNo">3537</span>        synchronized (this) {<a name="line.3537"></a>
+<span class="sourceLineNo">3538</span>          try {<a name="line.3538"></a>
+<span class="sourceLineNo">3539</span>            wait();<a name="line.3539"></a>
+<span class="sourceLineNo">3540</span>          } catch (InterruptedException ignored) {<a name="line.3540"></a>
+<span class="sourceLineNo">3541</span>            if (done) {<a name="line.3541"></a>
+<span class="sourceLineNo">3542</span>              break;<a name="line.3542"></a>
+<span class="sourceLineNo">3543</span>            }<a name="line.3543"></a>
+<span class="sourceLineNo">3544</span>          }<a name="line.3544"></a>
+<span class="sourceLineNo">3545</span>        }<a name="line.3545"></a>
+<span class="sourceLineNo">3546</span>        try {<a name="line.3546"></a>
+<span class="sourceLineNo">3547</span>          region.flush(true);<a name="line.3547"></a>
+<span class="sourceLineNo">3548</span>        } catch (IOException e) {<a name="line.3548"></a>
+<span class="sourceLineNo">3549</span>          if (!done) {<a name="line.3549"></a>
+<span class="sourceLineNo">3550</span>            LOG.error("Error while flushing cache", e);<a name="line.3550"></a>
+<span class="sourceLineNo">3551</span>            error = e;<a name="line.3551"></a>
+<span class="sourceLineNo">3552</span>          }<a name="line.3552"></a>
+<span class="sourceLineNo">3553</span>          break;<a name="line.3553"></a>
+<span class="sourceLineNo">3554</span>        } catch (Throwable t) {<a name="line.3554"></a>
+<span class="sourceLineNo">3555</span>          LOG.error("Uncaught exception", t);<a name="line.3555"></a>
+<span class="sourceLineNo">3556</span>          throw t;<a name="line.3556"></a>
+<span class="sourceLineNo">3557</span>        }<a name="line.3557"></a>
+<span class="sourceLineNo">3558</span>      }<a name="line.3558"></a>
+<span class="sourceLineNo">3559</span>    }<a name="line.3559"></a>
+<span class="sourceLineNo">3560</span><a name="line.3560"></a>
+<span class="sourceLineNo">3561</span>    public void flush() {<a name="line.3561"></a>
+<span class="sourceLineNo">3562</span>      synchronized (this) {<a name="line.3562"></a>
+<span class="sourceLineNo">3563</span>        notify();<a name="line.3563"></a>
+<span class="sourceLineNo">3564</span>      }<a name="line.3564"></a>
+<span class="sourceLineNo">3565</span>    }<a name="line.3565"></a>
+<span class="sourceLineNo">3566</span>  }<a name="line.3566"></a>
+<span class="sourceLineNo">3567</span><a name="line.3567"></a>
+<span class="sourceLineNo">3568</span>  /**<a name="line.3568"></a>
+<span class="sourceLineNo">3569</span>   * Writes very wide records and scans for the latest every time.. Flushes and<a name="line.3569"></a>
+<span class="sourceLineNo">3570</span>   * compacts the region every now and then to keep things realistic.<a name="line.3570"></a>
+<span class="sourceLineNo">3571</span>   *<a name="line.3571"></a>
+<span class="sourceLineNo">3572</span>   * @throws IOException<a name="line.3572"></a>
+<span class="sourceLineNo">3573</span>   *           by flush / scan / compaction<a name="line.3573"></a>
+<span class="sourceLineNo">3574</span>   * @throws InterruptedException<a name="line.3574"></a>
+<span class="sourceLineNo">3575</span>   *           when joining threads<a name="line.3575"></a>
+<span class="sourceLineNo">3576</span>   */<a name="line.3576"></a>
+<span class="sourceLineNo">3577</span>  @Test<a name="line.3577"></a>
+<span class="sourceLineNo">3578</span>  public void testWritesWhileScanning() throws IOException, InterruptedException {<a name="line.3578"></a>
+<span class="sourceLineNo">3579</span>    int testCount = 100;<a name="line.3579"></a>
+<span class="sourceLineNo">3580</span>    int numRows = 1;<a name="line.3580"></a>
+<span class="sourceLineNo">3581</span>    int numFamilies = 10;<a name="line.3581"></a>
+<span class="sourceLineNo">3582</span>    int numQualifiers = 100;<a name="line.3582"></a>
+<span class="sourceLineNo">3583</span>    int flushInterval = 7;<a name="line.3583"></a>
+<span class="sourceLineNo">3584</span>    int compactInterval = 5 * flushInterval;<a name="line.3584"></a>
+<span class="sourceLineNo">3585</span>    byte[][] families = new byte[numFamilies][];<a name="line.3585"></a>
+<span class="sourceLineNo">3586</span>    for (int i = 0; i &lt; numFamilies; i++) {<a name="line.3586"></a>
+<span class="sourceLineNo">3587</span>      families[i] = Bytes.toBytes("family" + i);<a name="line.3587"></a>
+<span class="sourceLineNo">3588</span>    }<a name="line.3588"></a>
+<span class="sourceLineNo">3589</span>    byte[][] qualifiers = new byte[numQualifiers][];<a name="line.3589"></a>
+<span class="sourceLineNo">3590</span>    for (int i = 0; i &lt; numQualifiers; i++) {<a name="line.3590"></a>
+<span class="sourceLineNo">3591</span>      qualifiers[i] = Bytes.toBytes("qual" + i);<a name="line.3591"></a>
+<span class="sourceLineNo">3592</span>    }<a name="line.3592"></a>
+<span class="sourceLineNo">3593</span><a name="line.3593"></a>
+<span class="sourceLineNo">3594</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.3594"></a>
+<span class="sourceLineNo">3595</span>    FlushThread flushThread = new FlushThread();<a name="line.3595"></a>
+<span class="sourceLineNo">3596</span>    PutThread putThread = new PutThread(numRows, families, qualifiers);<a name="line.3596"></a>
+<span class="sourceLineNo">3597</span>    try {<a name="line.3597"></a>
+<span class="sourceLineNo">3598</span>      putThread.start();<a name="line.3598"></a>
+<span class="sourceLineNo">3599</span>      putThread.waitForFirstPut();<a name="line.3599"></a>
 <span class="sourceLineNo">3600</span><a name="line.3600"></a>
-<span class="sourceLineNo">3601</span>        if (i != 0 &amp;&amp; i % compactInterval == 0) {<a name="line.3601"></a>
-<span class="sourceLineNo">3602</span>          region.compact(true);<a name="line.3602"></a>
-<span class="sourceLineNo">3603</span>          for (HStore store : region.getStores()) {<a name="line.3603"></a>
-<span class="sourceLineNo">3604</span>            store.closeAndArchiveCompactedFiles();<a name="line.3604"></a>
-<span class="sourceLineNo">3605</span>          }<a name="line.3605"></a>
-<span class="sourceLineNo">3606</span>        }<a name="line.3606"></a>
+<span class="sourceLineNo">3601</span>      flushThread.start();<a name="line.3601"></a>
+<span class="sourceLineNo">3602</span><a name="line.3602"></a>
+<span class="sourceLineNo">3603</span>      Scan scan = new Scan(Bytes.toBytes("row0"), Bytes.toBytes("row1"));<a name="line.3603"></a>
+<span class="sourceLineNo">3604</span><a name="line.3604"></a>
+<span class="sourceLineNo">3605</span>      int expectedCount = numFamilies * numQualifiers;<a name="line.3605"></a>
+<span class="sourceLineNo">3606</span>      List&lt;Cell&gt; res = new ArrayList&lt;&gt;();<a name="line.3606"></a>
 <span class="sourceLineNo">3607</span><a name="line.3607"></a>
-<span class="sourceLineNo">3608</span>        if (i != 0 &amp;&amp; i % flushInterval == 0) {<a name="line.3608"></a>
-<span class="sourceLineNo">3609</span>          flushThread.flush();<a name="line.3609"></a>
-<span class="sourceLineNo">3610</span>        }<a name="line.3610"></a>
-<span class="sourceLineNo">3611</span><a name="line.3611"></a>
-<span class="sourceLineNo">3612</span>        boolean previousEmpty = res.isEmpty();<a name="line.3612"></a>
-<span class="sourceLineNo">3613</span>        res.clear();<a name="line.3613"></a>
-<span class="sourceLineNo">3614</span>        try (InternalScanner scanner = region.getScanner(scan)) {<a name="line.3614"></a>
-<span class="sourceLineNo">3615</span>          boolean moreRows;<a name="line.3615"></a>
-<span class="sourceLineNo">3616</span>          do {<a name="line.3616"></a>
-<span class="sourceLineNo">3617</span>            moreRows = scanner.next(res);<a name="line.3617"></a>
-<span class="sourceLineNo">3618</span>          } while (moreRows);<a name="line.3618"></a>
-<span class="sourceLineNo">3619</span>        }<a name="line.3619"></a>
-<span class="sourceLineNo">3620</span>        if (!res.isEmpty() || !previousEmpty || i &gt; compactInterval) {<a name="line.3620"></a>
-<span class="sourceLineNo">3621</span>          assertEquals("i=" + i, expectedCount, res.size());<a name="line.3621"></a>
-<span class="sourceLineNo">3622</span>          long timestamp = res.get(0).getTimestamp();<a name="line.3622"></a>
-<span class="sourceLineNo">3623</span>          assertTrue("Timestamps were broke: " + timestamp + " prev: " + prevTimestamp,<a name="line.3623"></a>
-<span class="sourceLineNo">3624</span>              timestamp &gt;= prevTimestamp);<a name="line.3624"></a>
-<span class="sourceLineNo">3625</span>          prevTimestamp = timestamp;<a name="line.3625"></a>
-<span class="sourceLineNo">3626</span>        }<a name="line.3626"></a>
-<span class="sourceLineNo">3627</span>      }<a name="line.3627"></a>
-<span class="sourceLineNo">3628</span><a name="line.3628"></a>
-<span class="sourceLineNo">3629</span>      putThread.done();<a name="line.3629"></a>
-<span class="sourceLineNo">3630</span><a name="line.3630"></a>
-<span class="sourceLineNo">3631</span>      region.flush(true);<a name="line.3631"></a>
-<span class="sourceLineNo">3632</span><a name="line.3632"></a>
-<span class="sourceLineNo">3633</span>    } finally {<a name="line.3633"></a>
-<span class="sourceLineNo">3634</span>      try {<a name="line.3634"></a>
-<span class="sourceLineNo">3635</span>        flushThread.done();<a name="line.3635"></a>
-<span class="sourceLineNo">3636</span>        flushThread.join();<a name="line.3636"></a>
-<span class="sourceLineNo">3637</span>        flushThread.checkNoError();<a name="line.3637"></a>
+<span class="sourceLineNo">3608</span>      long prevTimestamp = 0L;<a name="line.3608"></a>
+<span class="sourceLineNo">3609</span>      for (int i = 0; i &lt; testCount; i++) {<a name="line.3609"></a>
+<span class="sourceLineNo">3610</span><a name="line.3610"></a>
+<span class="sourceLineNo">3611</span>        if (i != 0 &amp;&amp; i % compactInterval == 0) {<a name="line.3611"></a>
+<span class="sourceLineNo">3612</span>          region.compact(true);<a name="line.3612"></a>
+<span class="sourceLineNo">3613</span>          for (HStore store : region.getStores()) {<a name="line.3613"></a>
+<span class="sourceLineNo">3614</span>            store.closeAndArchiveCompactedFiles();<a name="line.3614"></a>
+<span class="sourceLineNo">3615</span>          }<a name="line.3615"></a>
+<span class="sourceLineNo">3616</span>        }<a name="line.3616"></a>
+<span class="sourceLineNo">3617</span><a name="line.3617"></a>
+<span class="sourceLineNo">3618</span>        if (i != 0 &amp;&amp; i % flushInterval == 0) {<a name="line.3618"></a>
+<span class="sourceLineNo">3619</span>          flushThread.flush();<a name="line.3619"></a>
+<span class="sourceLineNo">3620</span>        }<a name="line.3620"></a>
+<span class="sourceLineNo">3621</span><a name="line.3621"></a>
+<span class="sourceLineNo">3622</span>        boolean previousEmpty = res.isEmpty();<a name="line.3622"></a>
+<span class="sourceLineNo">3623</span>        res.clear();<a name="line.3623"></a>
+<span class="sourceLineNo">3624</span>        try (InternalScanner scanner = region.getScanner(scan)) {<a name="line.3624"></a>
+<span class="sourceLineNo">3625</span>          boolean moreRows;<a name="line.3625"></a>
+<span class="sourceLineNo">3626</span>          do {<a name="line.3626"></a>
+<span class="sourceLineNo">3627</span>            moreRows = scanner.next(res);<a name="line.3627"></a>
+<span class="sourceLineNo">3628</span>          } while (moreRows);<a name="line.3628"></a>
+<span class="sourceLineNo">3629</span>        }<a name="line.3629"></a>
+<span class="sourceLineNo">3630</span>        if (!res.isEmpty() || !previousEmpty || i &gt; compactInterval) {<a name="line.3630"></a>
+<span class="sourceLineNo">3631</span>          assertEquals("i=" + i, expectedCount, res.size());<a name="line.3631"></a>
+<span class="sourceLineNo">3632</span>          long timestamp = res.get(0).getTimestamp();<a name="line.3632"></a>
+<span class="sourceLineNo">3633</span>          assertTrue("Timestamps were broke: " + timestamp + " prev: " + prevTimestamp,<a name="line.3633"></a>
+<span class="sourceLineNo">3634</span>              timestamp &gt;= prevTimestamp);<a name="line.3634"></a>
+<span class="sourceLineNo">3635</span>          prevTimestamp = timestamp;<a name="line.3635"></a>
+<span class="sourceLineNo">3636</span>        }<a name="line.3636"></a>
+<span class="sourceLineNo">3637</span>      }<a name="line.3637"></a>
 <span class="sourceLineNo">3638</span><a name="line.3638"></a>
-<span class="sourceLineNo">3639</span>        putThread.join();<a name="line.3639"></a>
-<span class="sourceLineNo">3640</span>        putThread.checkNoError();<a name="line.3640"></a>
-<span class="sourceLineNo">3641</span>      } catch (InterruptedException ie) {<a name="line.3641"></a>
-<span class="sourceLineNo">3642</span>        LOG.warn("Caught exception when joining with flushThread", ie);<a name="line.3642"></a>
-<span class="sourceLineNo">3643</span>      }<a name="line.3643"></a>
-<span class="sourceLineNo">3644</span><a name="line.3644"></a>
-<span class="sourceLineNo">3645</span>      try {<a name="line.3645"></a>
-<span class="sourceLineNo">3646</span>          HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.3646"></a>
-<span class="sourceLineNo">3647</span>      } catch (DroppedSnapshotException dse) {<a name="line.3647"></a>
-<span class="sourceLineNo">3648</span>        // We could get this on way out because we interrupt the background flusher and it could<a name="line.3648"></a>
-<span class="sourceLineNo">3649</span>        // fail anywhere causing a DSE over in the background flusher... only it is not properly<a name="line.3649"></a>
-<span class="sourceLineNo">3650</span>        // dealt with so could still be memory hanging out when we get to here -- memory we can't<a name="line.3650"></a>
-<span class="sourceLineNo">3651</span>        // flush because the accounting is 'off' since original DSE.<a name="line.3651"></a>
-<span class="sourceLineNo">3652</span>      }<a name="line.3652"></a>
-<span class="sourceLineNo">3653</span>      this.region = null;<a name="line.3653"></a>
-<span class="sourceLineNo">3654</span>    }<a name="line.3654"></a>
-<span class="sourceLineNo">3655</span>  }<a name="line.3655"></a>
-<span class="sourceLineNo">3656</span><a name="line.3656"></a>
-<span class="sourceLineNo">3657</span>  protected class PutThread extends Thread {<a name="line.3657"></a>
-<span class="sourceLineNo">3658</span>    private volatile boolean done;<a name="line.3658"></a>
-<span class="sourceLineNo">3659</span>    private volatile int numPutsFinished = 0;<a name="line.3659"></a>
-<span class="sourceLineNo">3660</span><a name="line.3660"></a>
-<span class="sourceLineNo">3661</span>    private Throwable error = null;<a name="line.3661"></a>
-<span class="sourceLineNo">3662</span>    private int numRows;<a name="line.3662"></a>
-<span class="sourceLineNo">3663</span>    private byte[][] families;<a name="line.3663"></a>
-<span class="sourceLineNo">3664</span>    private byte[][] qualifiers;<a name="line.3664"></a>
-<span class="sourceLineNo">3665</span><a name="line.3665"></a>
-<span class="sourceLineNo">3666</span>    private PutThread(int numRows, byte[][] families, byte[][] qualifiers) {<a name="line.3666"></a>
-<span class="sourceLineNo">3667</span>      super("PutThread");<a name="line.3667"></a>
-<span class="sourceLineNo">3668</span>      this.numRows = numRows;<a name="line.3668"></a>
-<span class="sourceLineNo">3669</span>      this.families = families;<a name="line.3669"></a>
-<span class="sourceLineNo">3670</span>      this.qualifiers = qualifiers;<a name="line.3670"></a>
-<span class="sourceLineNo">3671</span>    }<a name="line.3671"></a>
-<span class="sourceLineNo">3672</span><a name="line.3672"></a>
-<span class="sourceLineNo">3673</span>    /**<a name="line.3673"></a>
-<span class="sourceLineNo">3674</span>     * Block calling thread until this instance of PutThread has put at least one row.<a name="line.3674"></a>
-<span class="sourceLineNo">3675</span>     */<a name="line.3675"></a>
-<span class="sourceLineNo">3676</span>    public void waitForFirstPut() throws InterruptedException {<a name="line.3676"></a>
-<span class="sourceLineNo">3677</span>      // wait until put thread actually puts some data<a name="line.3677"></a>
-<span class="sourceLineNo">3678</span>      while (isAlive() &amp;&amp; numPutsFinished == 0) {<a name="line.3678"></a>
-<span class="sourceLineNo">3679</span>        checkNoError();<a name="line.3679"></a>
-<span class="sourceLineNo">3680</span>        Thread.sleep(50);<a name="line.3680"></a>
-<span class="sourceLineNo">3681</span>      }<a name="line.3681"></a>
-<span class="sourceLineNo">3682</span>    }<a name="line.3682"></a>
-<span class="sourceLineNo">3683</span><a name="line.3683"></a>
-<span class="sourceLineNo">3684</span>    public void done() {<a name="line.3684"></a>
-<span class="sourceLineNo">3685</span>      done = true;<a name="line.3685"></a>
-<span class="sourceLineNo">3686</span>      synchronized (this) {<a name="line.3686"></a>
-<span class="sourceLineNo">3687</span>        interrupt();<a name="line.3687"></a>
-<span class="sourceLineNo">3688</span>      }<a name="line.3688"></a>
-<span class="sourceLineNo">3689</span>    }<a name="line.3689"></a>
-<span class="sourceLineNo">3690</span><a name="line.3690"></a>
-<span class="sourceLineNo">3691</span>    public void checkNoError() {<a name="line.3691"></a>
-<span class="sourceLineNo">3692</span>      if (error != null) {<a name="line.3692"></a>
-<span class="sourceLineNo">3693</span>        assertNull(error);<a name="line.3693"></a>
-<span class="sourceLineNo">3694</span>      }<a name="line.3694"></a>
-<span class="sourceLineNo">3695</span>    }<a name="line.3695"></a>
-<span class="sourceLineNo">3696</span><a name="line.3696"></a>
-<span class="sourceLineNo">3697</span>    @Override<a name="line.3697"></a>
-<span class="sourceLineNo">3698</span>    public void run() {<a name="line.3698"></a>
-<span class="sourceLineNo">3699</span>      done = false;<a name="line.3699"></a>
-<span class="sourceLineNo">3700</span>      while (!done) {<a name="line.3700"></a>
-<span class="sourceLineNo">3701</span>        try {<a name="line.3701"></a>
-<span class="sourceLineNo">3702</span>          for (int r = 0; r &lt; numRows; r++) {<a name="line.3702"></a>
-<span class="sourceLineNo">3703</span>            byte[] row = Bytes.toBytes("row" + r);<a name="line.3703"></a>
-<span class="sourceLineNo">3704</span>            Put put = new Put(row);<a name="line.3704"></a>
-<span class="sourceLineNo">3705</span>            put.setDurability(Durability.SKIP_WAL);<a name="line.3705"></a>
-<span class="sourceLineNo">3706</span>            byte[] value = Bytes.toBytes(String.valueOf(numPutsFinished));<a name="line.3706"></a>
-<span class="sourceLineNo">3707</span>            for (byte[] family : families) {<a name="line.3707"></a>
-<span class="sourceLineNo">3708</span>              for (byte[] qualifier : qualifiers) {<a name="line.3708"></a>
-<span class="sourceLineNo">3709</span>                put.addColumn(family, qualifier, numPutsFinished, value);<a name="line.3709"></a>
-<span class="sourceLineNo">3710</span>              }<a name="line.3710"></a>
-<span class="sourceLineNo">3711</span>            }<a name="line.3711"></a>
-<span class="sourceLineNo">3712</span>            region.put(put);<a name="line.3712"></a>
-<span class="sourceLineNo">3713</span>            numPutsFinished++;<a name="line.3713"></a>
-<span class="sourceLineNo">3714</span>            if (numPutsFinished &gt; 0 &amp;&amp; numPutsFinished % 47 == 0) {<a name="line.3714"></a>
-<span class="sourceLineNo">3715</span>              LOG.debug("put iteration = {}", numPutsFinished);<a name="line.3715"></a>
-<span class="sourceLineNo">3716</span>              Delete delete = new Delete(row, (long) numPutsFinished - 30);<a name="line.3716"></a>
-<span class="sourceLineNo">3717</span>              region.delete(delete);<a name="line.3717"></a>
-<span class="sourceLineNo">3718</span>            }<a name="line.3718"></a>
-<span class="sourceLineNo">3719</span>            numPutsFinished++;<a name="line.3719"></a>
-<span class="sourceLineNo">3720</span>          }<a name="line.3720"></a>
-<span class="sourceLineNo">3721</span>        } catch (InterruptedIOException e) {<a name="line.3721"></a>
-<span class="sourceLineNo">3722</span>          // This is fine. It means we are done, or didn't get the lock on time<a name="line.3722"></a>
-<span class="sourceLineNo">3723</span>          LOG.info("Interrupted", e);<a name="line.3723"></a>
-<span class="sourceLineNo">3724</span>        } catch (IOException e) {<a name="line.3724"></a>
-<span class="sourceLineNo">3725</span>          LOG.error("Error while putting records", e);<a name="line.3725"></a>
-<span class="sourceLineNo">3726</span>          error = e;<a name="line.3726"></a>
-<span class="sourceLineNo">3727</span>          break;<a name="line.3727"></a>
-<span class="sourceLineNo">3728</span>        }<a name="line.3728"></a>
-<span class="sourceLineNo">3729</span>      }<a name="line.3729"></a>
-<span class="sourceLineNo">3730</span><a name="line.3730"></a>
-<span class="sourceLineNo">3731</span>    }<a name="line.3731"></a>
-<span class="sourceLineNo">3732</span><a name="line.3732"></a>
-<span class="sourceLineNo">3733</span>  }<a name="line.3733"></a>
-<span class="sourceLineNo">3734</span><a name="line.3734"></a>
-<span class="sourceLineNo">3735</span>  /**<a name="line.3735"></a>
-<span class="sourceLineNo">3736</span>   * Writes very wide records and gets the latest row every time.. Flushes and<a name="line.3736"></a>
-<span class="sourceLineNo">3737</span>   * compacts the region aggressivly to catch issues.<a name="line.3737"></a>
-<span class="sourceLineNo">3738</span>   *<a name="line.3738"></a>
-<span class="sourceLineNo">3739</span>   * @throws IOException<a name="line.3739"></a>
-<span class="sourceLineNo">3740</span>   *           by flush / scan / compaction<a name="line.3740"></a>
-<span class="sourceLineNo">3741</span>   * @throws InterruptedException<a name="line.3741"></a>
-<span class="sourceLineNo">3742</span>   *           when joining threads<a name="line.3742"></a>
-<span class="sourceLineNo">3743</span>   */<a name="line.3743"></a>
-<span class="sourceLineNo">3744</span>  @Test<a name="line.3744"></a>
-<span class="sourceLineNo">3745</span>  public void testWritesWhileGetting() throws Exception {<a name="line.3745"></a>
-<span class="sourceLineNo">3746</span>    int testCount = 50;<a name="line.3746"></a>
-<span class="sourceLineNo">3747</span>    int numRows = 1;<a name="line.3747"></a>
-<span class="sourceLineNo">3748</span>    int numFamilies = 10;<a name="line.3748"></a>
-<span class="sourceLineNo">3749</span>    int numQualifiers = 100;<a name="line.3749"></a>
-<span class="sourceLineNo">3750</span>    int compactInterval = 100;<a name="line.3750"></a>
-<span class="sourceLineNo">3751</span>    byte[][] families = new byte[numFamilies][];<a name="line.3751"></a>
-<span class="sourceLineNo">3752</span>    for (int i = 0; i &lt; numFamilies; i++) {<a name="line.3752"></a>
-<span class="sourceLineNo">3753</span>      families[i] = Bytes.toBytes("family" + i);<a name="line.3753"></a>
-<span class="sourceLineNo">3754</span>    }<a name="line.3754"></a>
-<span class="sourceLineNo">3755</span>    byte[][] qualifiers = new byte[numQualifiers][];<a name="line.3755"></a>
-<span class="sourceLineNo">3756</span>    for (int i = 0; i &lt; numQualifiers; i++) {<a name="line.3756"></a>
-<span class="sourceLineNo">3757</span>      qualifiers[i] = Bytes.toBytes("qual" + i);<a name="line.3757"></a>
-<span class="sourceLineNo">3758</span>    }<a name="line.3758"></a>
-<span class="sourceLineNo">3759</span><a name="line.3759"></a>
-<span class="sourceLineNo">3760</span><a name="line.3760"></a>
-<span class="sourceLineNo">3761</span>    // This test flushes constantly and can cause many files to be created,<a name="line.3761"></a>
-<span class="sourceLineNo">3762</span>    // possibly<a name="line.3762"></a>
-<span class="sourceLineNo">3763</span>    // extending over the ulimit. Make sure compactions are aggressive in<a name="line.3763"></a>
-<span class="sourceLineNo">3764</span>    // reducing<a name="line.3764"></a>
-<span class="sourceLineNo">3765</span>    // the number of HFiles created.<a name="line.3765"></a>
-<span class="sourceLineNo">3766</span>    Configuration conf = HBaseConfiguration.create(CONF);<a name="line.3766"></a>
-<span class="sourceLineNo">3767</span>    conf.setInt("hbase.hstore.compaction.min", 1);<a name="line.3767"></a>
-<span class="sourceLineNo">3768</span>    conf.setInt("hbase.hstore.compaction.max", 1000);<a name="line.3768"></a>
-<span class="sourceLineNo">3769</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.3769"></a>
-<span class="sourceLineNo">3770</span>    PutThread putThread = null;<a name="line.3770"></a>
-<span class="sourceLineNo">3771</span>    MultithreadedTestUtil.TestContext ctx = new MultithreadedTestUtil.TestContext(conf);<a name="line.3771"></a>
-<span class="sourceLineNo">3772</span>    try {<a name="line.3772"></a>
-<span class="sourceLineNo">3773</span>      putThread = new PutThread(numRows, families, qualifiers);<a name="line.3773"></a>
-<span class="sourceLineNo">3774</span>      putThread.start();<a name="line.3774"></a>
-<span class="sourceLineNo">3775</span>      putThread.waitForFirstPut();<a name="line.3775"></a>
-<span class="sourceLineNo">3776</span><a name="line.3776"></a>
-<span class="sourceLineNo">3777</span>      // Add a thread that flushes as fast as possible<a name="line.3777"></a>
-<span class="sourceLineNo">3778</span>      ctx.addThread(new RepeatingTestThread(ctx) {<a name="line.3778"></a>
-<span class="sourceLineNo">3779</span><a name="line.3779"></a>
-<span class="sourceLineNo">3780</span>        @Override<a name="line.3780"></a>
-<span class="sourceLineNo">3781</span>        public void doAnAction() throws Exception {<a name="line.3781"></a>
-<span class="sourceLineNo">3782</span>          region.flush(true);<a name="line.3782"></a>
-<span class="sourceLineNo">3783</span>          // Compact regularly to avoid creating too many files and exceeding<a name="line.3783"></a>
-<span class="sourceLineNo">3784</span>          // the ulimit.<a name="line.3784"></a>
-<span class="sourceLineNo">3785</span>          region.compact(false);<a name="line.3785"></a>
-<span class="sourceLineNo">3786</span>          for (HStore store : region.getStores()) {<a name="line.3786"></a>
-<span class="sourceLineNo">3787</span>            store.closeAndArchiveCompactedFiles();<a name="line.3787"></a>
-<span class="sourceLineNo">3788</span>          }<a name="line.3788"></a>
-<span class="sourceLineNo">3789</span>        }<a name="line.3789"></a>
-<span class="sourceLineNo">3790</span>      });<a name="line.3790"></a>
-<span class="sourceLineNo">3791</span>      ctx.startThreads();<a name="line.3791"></a>
-<span class="sourceLineNo">3792</span><a name="line.3792"></a>
-<span class="sourceLineNo">3793</span>      Get get = new Get(Bytes.toBytes("row0"));<a name="line.3793"></a>
-<span class="sourceLineNo">3794</span>      Result result = null;<a name="line.3794"></a>
-<span class="sourceLineNo">3795</span><a name="line.3795"></a>
-<span class="sourceLineNo">3796</span>      int expectedCount = numFamilies * numQualifiers;<a name="line.3796"></a>
-<span class="sourceLineNo">3797</span><a name="line.3797"></a>
-<span class="sourceLineNo">3798</span>      long prevTimestamp = 0L;<a name="line.3798"></a>
-<span class="sourceLineNo">3799</span>      for (int i = 0; i &lt; testCount; i++) {<a name="line.3799"></a>
-<span class="sourceLineNo">3800</span>        LOG.info("testWritesWhileGetting verify turn " + i);<a name="line.3800"></a>
-<span class="sourceLineNo">3801</span>        boolean previousEmpty = result == null || result.isEmpty();<a name="line.3801"></a>
-<span class="sourceLineNo">3802</span>        result = region.get(get);<a name="line.3802"></a>
-<span class="sourceLineNo">3803</span>        if (!result.isEmpty() || !previousEmpty || i &gt; compactInterval) {<a name="line.3803"></a>
-<span class="sourceLineNo">3804</span>          assertEquals("i=" + i, expectedCount, result.size());<a name="line.3804"></a>
-<span class="sourceLineNo">3805</span>          // TODO this was removed, now what dangit?!<a name="line.3805"></a>
-<span class="sourceLineNo">3806</span>          // search looking for the qualifier in question?<a name="line.3806"></a>
-<span class="sourceLineNo">3807</span>          long timestamp = 0;<a name="line.3807"></a>
-<span class="sourceLineNo">3808</span>          for (Cell kv : result.rawCells()) {<a name="line.3808"></a>
-<span class="sourceLineNo">3809</span>            if (CellUtil.matchingFamily(kv, families[0])<a name="line.3809"></a>
-<span class="sourceLineNo">3810</span>                &amp;&amp; CellUtil.matchingQualifier(kv, qualifiers[0])) {<a name="line.3810"></a>
-<span class="sourceLineNo">3811</span>              timestamp = kv.getTimestamp();<a name="line.3811"></a>
-<span class="sourceLineNo">3812</span>            }<a name="line.3812"></a>
-<span class="sourceLineNo">3813</span>          }<a name="line.3813"></a>
-<span class="sourceLineNo">3814</span>          assertTrue(timestamp &gt;= prevTimestamp);<a name="line.3814"></a>
-<span class="sourceLineNo">3815</span>          prevTimestamp = timestamp;<a name="line.3815"></a>
-<span class="sourceLineNo">3816</span>          Cell previousKV = null;<a name="line.3816"></a>
-<span class="sourceLineNo">3817</span><a name="line.3817"></a>
+<span class="sourceLineNo">3639</span>      putThread.done();<a name="line.3639"></a>
+<span class="sourceLineNo">3640</span><a name="line.3640"></a>
+<span class="sourceLineNo">3641</span>      region.flush(true);<a name="line.3641"></a>
+<span class="sourceLineNo">3642</span><a name="line.3642"></a>
+<span class="sourceLineNo">3643</span>    } finally {<a name="line.3643"></a>
+<span class="sourceLineNo">3644</span>      try {<a name="line.3644"></a>
+<span class="sourceLineNo">3645</span>        flushThread.done();<a name="line.3645"></a>
+<span class="sourceLineNo">3646</span>        flushThread.join();<a name="line.3646"></a>
+<span class="sourceLineNo">3647</span>        flushThread.checkNoError();<a name="line.3647"></a>
+<span class="sourceLineNo">3648</span><a name="line.3648"></a>
+<span class="sourceLineNo">3649</span>        putThread.join();<a name="line.3649"></a>
+<span class="sourceLineNo">3650</span>        putThread.checkNoError();<a name="line.3650"></a>
+<span class="sourceLineNo">3651</span>      } catch (InterruptedException ie) {<a name="line.3651"></a>
+<span class="sourceLineNo">3652</span>        LOG.warn("Caught exception when joining with flushThread", ie);<a name="line.3652"></a>
+<span class="sourceLineNo">3653</span>      }<a name="line.3653"></a>
+<span class="sourceLineNo">3654</span><a name="line.3654"></a>
+<span class="sourceLineNo">3655</span>      try {<a name="line.3655"></a>
+<span class="sourceLineNo">3656</span>          HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.3656"></a>
+<span class="sourceLineNo">3657</span>      } catch (DroppedSnapshotException dse) {<a name="line.3657"></a>
+<span class="sourceLineNo">3658</span>        // We could get this on way out because we interrupt the background flusher and it could<a name="line.3658"></a>
+<span class="sourceLineNo">3659</span>        // fail anywhere causing a DSE over in the background flusher... only it is not properly<a name="line.3659"></a>
+<span class="sourceLineNo">3660</span>        // dealt with so could still be memory hanging out when we get to here -- memory we can't<a name="line.3660"></a>
+<span class="sourceLineNo">3661</span>        // flush because the accounting is 'off' since original DSE.<a name="line.3661"></a>
+<span class="sourceLineNo">3662</span>      }<a name="line.3662"></a>
+<span class="sourceLineNo">3663</span>      this.region = null;<a name="line.3663"></a>
+<span class="sourceLineNo">3664</span>    }<a name="line.3664"></a>
+<span class="sourceLineNo">3665</span>  }<a name="line.3665"></a>
+<span class="sourceLineNo">3666</span><a name="line.3666"></a>
+<span class="sourceLineNo">3667</span>  protected class PutThread extends Thread {<a name="line.3667"></a>
+<span class="sourceLineNo">3668</span>    private volatile boolean done;<a name="line.3668"></a>
+<span class="sourceLineNo">3669</span>    private volatile int numPutsFinished = 0;<a name="line.3669"></a>
+<span class="sourceLineNo">3670</span><a name="line.3670"></a>
+<span class="sourceLineNo">3671</span>    private Throwable error = null;<a name="line.3671"></a>
+<span class="sourceLineNo">3672</span>    private int numRows;<a name="line.3672"></a>
+<span class="sourceLineNo">3673</span>    private byte[][] families;<a name="line.3673"></a>
+<span class="sourceLineNo">3674</span>    private byte[][] qualifiers;<a name="line.3674"></a>
+<span class="sourceLineNo">3675</span><a name="line.3675"></a>
+<span class="sourceLineNo">3676</span>    private PutThread(int numRows, byte[][] families, byte[][] qualifiers) {<a name="line.3676"></a>
+<span class="sourceLineNo">3677</span>      super("PutThread");<a name="line.3677"></a>
+<span class="sourceLineNo">3678</span>      this.numRows = numRows;<a name="line.3678"></a>
+<span class="sourceLineNo">3679</span>      this.families = families;<a name="line.3679"></a>
+<span class="sourceLineNo">3680</span>      this.qualifiers = qualifiers;<a name="line.3680"></a>
+<span class="sourceLineNo">3681</span>    }<a name="line.3681"></a>
+<span class="sourceLineNo">3682</span><a name="line.3682"></a>
+<span class="sourceLineNo">3683</span>    /**<a name="line.3683"></a>
+<span class="sourceLineNo">3684</span>     * Block calling thread until this instance of PutThread has put at least one row.<a name="line.3684"></a>
+<span class="sourceLineNo">3685</span>     */<a name="line.3685"></a>
+<span class="sourceLineNo">3686</span>    public void waitForFirstPut() throws InterruptedException {<a name="line.3686"></a>
+<span class="sourceLineNo">3687</span>      // wait until put thread actually puts some data<a name="line.3687"></a>
+<span class="sourceLineNo">3688</span>      while (isAlive() &amp;&amp; numPutsFinished == 0) {<a name="line.3688"></a>
+<span class="sourceLineNo">3689</span>        checkNoError();<a name="line.3689"></a>
+<span class="sourceLineNo">3690</span>        Thread.sleep(50);<a name="line.3690"></a>
+<span class="sourceLineNo">3691</span>      }<a name="line.3691"></a>
+<span class="sourceLineNo">3692</span>    }<a name="line.3692"></a>
+<span class="sourceLineNo">3693</span><a name="line.3693"></a>
+<span class="sourceLineNo">3694</span>    public void done() {<a name="line.3694"></a>
+<span class="sourceLineNo">3695</span>      done = true;<a name="line.3695"></a>
+<span class="sourceLineNo">3696</span>      synchronized (this) {<a name="line.3696"></a>
+<span class="sourceLineNo">3697</span>        interrupt();<a name="line.3697"></a>
+<span class="sourceLineNo">3698</span>      }<a name="line.3698"></a>
+<span class="sourceLineNo">3699</span>    }<a name="line.3699"></a>
+<span class="sourceLineNo">3700</span><a name="line.3700"></a>
+<span class="sourceLineNo">3701</span>    public void checkNoError() {<a name="line.3701"></a>
+<span class="sourceLineNo">3702</span>      if (error != null) {<a name="line.3702"></a>
+<span class="sourceLineNo">3703</span>        assertNull(error);<a name="line.3703"></a>
+<span class="sourceLineNo">3704</span>      }<a name="line.3704"></a>
+<span class="sourceLineNo">3705</span>    }<a name="line.3705"></a>
+<span class="sourceLineNo">3706</span><a name="line.3706"></a>
+<span class="sourceLineNo">3707</span>    @Override<a name="line.3707"></a>
+<span class="sourceLineNo">3708</span>    public void run() {<a name="line.3708"></a>
+<span class="sourceLineNo">3709</span>      done = false;<a name="line.3709"></a>
+<span class="sourceLineNo">3710</span>      while (!done) {<a name="line.3710"></a>
+<span class="sourceLineNo">3711</span>        try {<a name="line.3711"></a>
+<span class="sourceLineNo">3712</span>          for (int r = 0; r &lt; numRows; r++) {<a name="line.3712"></a>
+<span class="sourceLineNo">3713</span>            byte[] row = Bytes.toBytes("row" + r);<a name="line.3713"></a>
+<span class="sourceLineNo">3714</span>            Put put = new Put(row);<a name="line.3714"></a>
+<span class="sourceLineNo">3715</span>            put.setDurability(Durability.SKIP_WAL);<a name="line.3715"></a>
+<span class="sourceLineNo">3716</span>            byte[] value = Bytes.toBytes(String.valueOf(numPutsFinished));<a name="line.3716"></a>
+<span class="sourceLineNo">3717</span>            for (byte[] family : families) {<a name="line.3717"></a>
+<span class="sourceLineNo">3718</span>              for (byte[] qualifier : qualifiers) {<a name="line.3718"></a>
+<span class="sourceLineNo">3719</span>                put.addColumn(family, qualifier, numPutsFinished, value);<a name="line.3719"></a>
+<span class="sourceLineNo">3720</span>              }<a name="line.3720"></a>
+<span class="sourceLineNo">3721</span>            }<a name="line.3721"></a>
+<span class="sourceLineNo">3722</span>            region.put(put);<a name="line.3722"></a>
+<span class="sourceLineNo">3723</span>            numPutsFinished++;<a name="line.3723"></a>
+<span class="sourceLineNo">3724</span>            if (numPutsFinished &gt; 0 &amp;&amp; numPutsFinished % 47 == 0) {<a name="line.3724"></a>
+<span class="sourceLineNo">3725</span>              LOG.debug("put iteration = {}", numPutsFinished);<a name="line.3725"></a>
+<span class="sourceLineNo">3726</span>              Delete delete = new Delete(row, (long) numPutsFinished - 30);<a name="line.3726"></a>
+<span class="sourceLineNo">3727</span>              region.delete(delete);<a name="line.3727"></a>
+<span class="sourceLineNo">3728</span>            }<a name="line.3728"></a>
+<span class="sourceLineNo">3729</span>            numPutsFinished++;<a name="line.3729"></a>
+<span class="sourceLineNo">3730</span>          }<a name="line.3730"></a>
+<span class="sourceLineNo">3731</span>        } catch (InterruptedIOException e) {<a name="line.3731"></a>
+<span class="sourceLineNo">3732</span>          // This is fine. It means we are done, or didn't get the lock on time<a name="line.3732"></a>
+<span class="sourceLineNo">3733</span>          LOG.info("Interrupted", e);<a name="line.3733"></a>
+<span class="sourceLineNo">3734</span>        } catch (IOException e) {<a name="line.3734"></a>
+<span class="sourceLineNo">3735</span>          LOG.error("Error while putting records", e);<a name="line.3735"></a>
+<span class="sourceLineNo">3736</span>          error = e;<a name="line.3736"></a>
+<span class="sourceLineNo">3737</span>          break;<a name="line.3737"></a>
+<span class="sourceLineNo">3738</span>        }<a name="line.3738"></a>
+<span class="sourceLineNo">3739</span>      }<a name="line.3739"></a>
+<span class="sourceLineNo">3740</span><a name="line.3740"></a>
+<span class="sourceLineNo">3741</span>    }<a name="line.3741"></a>
+<span class="sourceLineNo">3742</span><a name="line.3742"></a>
+<span class="sourceLineNo">3743</span>  }<a name="line.3743"></a>
+<span class="sourceLineNo">3744</span><a name="line.3744"></a>
+<span class="sourceLineNo">3745</span>  /**<a name="line.3745"></a>
+<span class="sourceLineNo">3746</span>   * Writes very wide records and gets the latest row every time.. Flushes and<a name="line.3746"></a>
+<span class="sourceLineNo">3747</span>   * compacts the region aggressivly to catch issues.<a name="line.3747"></a>
+<span class="sourceLineNo">3748</span>   *<a name="line.3748"></a>
+<span class="sourceLineNo">3749</span>   * @throws IOException<a name="line.3749"></a>
+<span class="sourceLineNo">3750</span>   *           by flush / scan / compaction<a name="line.3750"></a>
+<span class="sourceLineNo">3751</span>   * @throws InterruptedException<a name="line.3751"></a>
+<span class="sourceLineNo">3752</span>   *           when joining threads<a name="line.3752"></a>
+<span class="sourceLineNo">3753</span>   */<a name="line.3753"></a>
+<span class="sourceLineNo">3754</span>  @Test<a name="line.3754"></a>
+<span class="sourceLineNo">3755</span>  public void testWritesWhileGetting() throws Exception {<a name="line.3755"></a>
+<span class="sourceLineNo">3756</span>    int testCount = 50;<a name="line.3756"></a>
+<span class="sourceLineNo">3757</span>    int numRows = 1;<a name="line.3757"></a>
+<span class="sourceLineNo">3758</span>    int numFamilies = 10;<a name="line.3758"></a>
+<span class="sourceLineNo">3759</span>    int numQualifiers = 100;<a name="line.3759"></a>
+<span class="sourceLineNo">3760</span>    int compactInterval = 100;<a name="line.3760"></a>
+<span class="sourceLineNo">3761</span>    byte[][] families = new byte[numFamilies][];<a name="line.3761"></a>
+<span class="sourceLineNo">3762</span>    for (int i = 0; i &lt; numFamilies; i++) {<a name="line.3762"></a>
+<span class="sourceLineNo">3763</span>      families[i] = Bytes.toBytes("family" + i);<a name="line.3763"></a>
+<span class="sourceLineNo">3764</span>    }<a name="line.3764"></a>
+<span class="sourceLineNo">3765</span>    byte[][] qualifiers = new byte[numQualifiers][];<a name="line.3765"></a>
+<span class="sourceLineNo">3766</span>    for (int i = 0; i &lt; numQualifiers; i++) {<a name="line.3766"></a>
+<span class="sourceLineNo">3767</span>      qualifiers[i] = Bytes.toBytes("qual" + i);<a name="line.3767"></a>
+<span class="sourceLineNo">3768</span>    }<a name="line.3768"></a>
+<span class="sourceLineNo">3769</span><a name="line.3769"></a>
+<span class="sourceLineNo">3770</span><a name="line.3770"></a>
+<span class="sourceLineNo">3771</span>    // This test flushes constantly and can cause many files to be created,<a name="line.3771"></a>
+<span class="sourceLineNo">3772</span>    // possibly<a name="line.3772"></a>
+<span class="sourceLineNo">3773</span>    // extending over the ulimit. Make sure compactions are aggressive in<a name="line.3773"></a>
+<span class="sourceLineNo">3774</span>    // reducing<a name="line.3774"></a>
+<span class="sourceLineNo">3775</span>    // the number of HFiles created.<a name="line.3775"></a>
+<span class="sourceLineNo">3776</span>    Configuration conf = HBaseConfiguration.create(CONF);<a name="line.3776"></a>
+<span class="sourceLineNo">3777</span>    conf.setInt("hbase.hstore.compaction.min", 1);<a name="line.3777"></a>
+<span class="sourceLineNo">3778</span>    conf.setInt("hbase.hstore.compaction.max", 1000);<a name="line.3778"></a>
+<span class="sourceLineNo">3779</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.3779"></a>
+<span class="sourceLineNo">3780</span>    PutThread putThread = null;<a name="line.3780"></a>
+<span class="sourceLineNo">3781</span>    MultithreadedTestUtil.TestContext ctx = new MultithreadedTestUtil.TestContext(conf);<a name="line.3781"></a>
+<span class="sourceLineNo">3782</span>    try {<a name="line.3782"></a>
+<span class="sourceLineNo">3783</span>      putThread = new PutThread(numRows, families, qualifiers);<a name="line.3783"></a>
+<span class="sourceLineNo">3784</span>      putThread.start();<a name="line.3784"></a>
+<span class="sourceLineNo">3785</span>      putThread.waitForFirstPut();<a name="line.3785"></a>
+<span class="sourceLineNo">3786</span><a name="line.3786"></a>
+<span class="sourceLineNo">3787</span>      // Add a thread that flushes as fast as possible<a name="line.3787"></a>
+<span class="sourceLineNo">3788</span>      ctx.addThread(new RepeatingTestThread(ctx) {<a name="line.3788"></a>
+<span class="sourceLineNo">3789</span><a name="line.3789"></a>
+<span class="sourceLineNo">3790</span>        @Override<a name="line.3790"></a>
+<span class="sourceLineNo">3791</span>        public void doAnAction() throws Exception {<a name="line.3791"></a>
+<span class="sourceLineNo">3792</span>          region.flush(true);<a name="line.3792"></a>
+<span class="sourceLineNo">3793</span>          // Compact regularly to avoid creating too many files and exceeding<a name="line.3793"></a>
+<span class="sourceLineNo">3794</span>          // the ulimit.<a name="line.3794"></a>
+<span class="sourceLineNo">3795</span>          region.compact(false);<a name="line.3795"></a>
+<span class="sourceLineNo">3796</span>          for (HStore store : region.getStores()) {<a name="line.3796"></a>
+<span class="sourceLineNo">3797</span>            store.closeAndArchiveCompactedFiles();<a name="line.3797"></a>
+<span class="sourceLineNo">3798</span>          }<a name="line.3798"></a>
+<span class="sourceLineNo">3799</span>        }<a name="line.3799"></a>
+<span class="sourceLineNo">3800</span>      });<a name="line.3800"></a>
+<span class="sourceLineNo">3801</span>      ctx.startThreads();<a name="line.3801"></a>
+<span class="sourceLineNo">3802</span><a name="line.3802"></a>
+<span class="sourceLineNo">3803</span>      Get get = new Get(Bytes.toBytes("row0"));<a name="line.3803"></a>
+<span class="sourceLineNo">3804</span>      Result result = null;<a name="line.3804"></a>
+<span class="sourceLineNo">3805</span><a name="line.3805"></a>
+<span class="sourceLineNo">3806</span>      int expectedCount = numFamilies * numQualifiers;<a name="line.3806"></a>
+<span class="sourceLineNo">3807</span><a name="line.3807"></a>
+<span class="sourceLineNo">3808</span>      long prevTimestamp = 0L;<a name="line.3808"></a>
+<span class="sourceLineNo">3809</span>      for (int i = 0; i &lt; testCount; i++) {<a name="line.3809"></a>
+<span class="sourceLineNo">3810</span>        LOG.info("testWritesWhileGetting verify turn " + i);<a name="line.3810"></a>
+<span class="sourceLineNo">3811</span>        boolean previousEmpty = result == null || result.isEmpty();<a name="line.3811"></a>
+<span class="sourceLineNo">3812</span>        result = region.get(get);<a name="line.3812"></a>
+<span class="sourceLineNo">3813</span>        if (!result.isEmpty() || !previousEmpty || i &gt; compactInterval) {<a name="line.3813"></a>
+<span class="sourceLineNo">3814</span>          assertEquals("i=" + i, expectedCount, result.size());<a name="line.3814"></a>
+<span class="sourceLineNo">3815</span>          // TODO this was removed, now what dangit?!<a name="line.3815"></a>
+<span class="sourceLineNo">3816</span>          // search looking for the qualifier in question?<a name="line.3816"></a>
+<span class="sourceLineNo">3817</span>          long timestamp = 0;<a name="line.3817"></a>
 <span class="sourceLineNo">3818</span>          for (Cell kv : result.rawCells()) {<a name="line.3818"></a>
-<span class="sourceLineNo">3819</span>            byte[] thisValue = CellUtil.cloneValue(kv);<a name="line.3819"></a>
-<span class="sourceLineNo">3820</span>            if (previousKV != null) {<a name="line.3820"></a>
-<span class="sourceLineNo">3821</span>              if (Bytes.compareTo(CellUtil.cloneValue(previousKV), thisValue) != 0) {<a name="line.3821"></a>
-<span class="sourceLineNo">3822</span>                LOG.warn("These two KV should have the same value." + " Previous KV:" + previousKV<a name="line.3822"></a>
-<span class="sourceLineNo">3823</span>                    + "(memStoreTS:" + previousKV.getSequenceId() + ")" + ", New KV: " + kv<a name="line.3823"></a>
-<span class="sourceLineNo">3824</span>                    + "(memStoreTS:" + kv.getSequenceId() + ")");<a name="line.3824"></a>
-<span class="sourceLineNo">3825</span>                assertEquals(0, Bytes.compareTo(CellUtil.cloneValue(previousKV), thisValue));<a name="line.3825"></a>
-<span class="sourceLineNo">3826</span>              }<a name="line.3826"></a>
-<span class="sourceLineNo">3827</span>            }<a name="line.3827"></a>
-<span class="sourceLineNo">3828</span>            previousKV = kv;<a name="line.3828"></a>
-<span class="sourceLineNo">3829</span>          }<a name="line.3829"></a>
-<span class="sourceLineNo">3830</span>        }<a name="line.3830"></a>
-<span class="sourceLineNo">3831</span>      }<a name="line.3831"></a>
-<span class="sourceLineNo">3832</span>    } finally {<a name="line.3832"></a>
-<span class="sourceLineNo">3833</span>      if (putThread != null)<a name="line.3833"></a>
-<span class="sourceLineNo">3834</span>        putThread.done();<a name="line.3834"></a>
-<span class="sourceLineNo">3835</span><a name="line.3835"></a>
-<span class="sourceLineNo">3836</span>      region.flush(true);<a name="line.3836"></a>
-<span class="sourceLineNo">3837</span><a name="line.3837"></a>
-<span class="sourceLineNo">3838</span>      if (putThread != null) {<a name="line.3838"></a>
-<span class="sourceLineNo">3839</span>        putThread.join();<a name="line.3839"></a>
-<span class="sourceLineNo">3840</span>        putThread.checkNoError();<a name="line.3840"></a>
+<span class="sourceLineNo">3819</span>            if (CellUtil.matchingFamily(kv, families[0])<a name="line.3819"></a>
+<span class="sourceLineNo">3820</span>                &amp;&amp; CellUtil.matchingQualifier(kv, qualifiers[0])) {<a name="line.3820"></a>
+<span class="sourceLineNo">3821</span>              timestamp = kv.getTimestamp();<a name="line.3821"></a>
+<span class="sourceLineNo">3822</span>            }<a name="line.3822"></a>
+<span class="sourceLineNo">3823</span>          }<a name="line.3823"></a>
+<span class="sourceLineNo">3824</span>          assertTrue(timestamp &gt;= prevTimestamp);<a name="line.3824"></a>
+<span class="sourceLineNo">3825</span>          prevTimestamp = timestamp;<a name="line.3825"></a>
+<span class="sourceLineNo">3826</span>          Cell previousKV = null;<a name="line.3826"></a>
+<span class="sourceLineNo">3827</span><a name="line.3827"></a>
+<span class="sourceLineNo">3828</span>          for (Cell kv : result.rawCells()) {<a name="line.3828"></a>
+<span class="sourceLineNo">3829</span>            byte[] thisValue = CellUtil.cloneValue(kv);<a name="line.3829"></a>
+<span class="sourceLineNo">3830</span>            if (previousKV != null) {<a name="line.3830"></a>
+<span class="sourceLineNo">3831</span>              if (Bytes.compareTo(CellUtil.cloneValue(previousKV), thisValue) != 0) {<a name="line.3831"></a>
+<span class="sourceLineNo">3832</span>                LOG.warn("These two KV should have the same value." + " Previous KV:" + previousKV<a name="line.3832"></a>
+<span class="sourceLineNo">3833</span>                    + "(memStoreTS:" + previousKV.getSequenceId() + ")" + ", New KV: " + kv<a name="line.3833"></a>
+<span class="sourceLineNo">3834</span>                    + "(memStoreTS:" + kv.getSequenceId() + ")");<a name="line.3834"></a>
+<span class="sourceLineNo">3835</span>                assertEquals(0, Bytes.compareTo(CellUtil.cloneValue(previousKV), thisValue));<a name="line.3835"></a>
+<span class="sourceLineNo">3836</span>              }<a name="line.3836"></a>
+<span class="sourceLineNo">3837</span>            }<a name="line.3837"></a>
+<span class="sourceLineNo">3838</span>            previousKV = kv;<a name="line.3838"></a>
+<span class="sourceLineNo">3839</span>          }<a name="line.3839"></a>
+<span class="sourceLineNo">3840</span>        }<a name="line.3840"></a>
 <span class="sourceLineNo">3841</span>      }<a name="line.3841"></a>
-<span class="sourceLineNo">3842</span><a name="line.3842"></a>
-<span class="sourceLineNo">3843</span>      ctx.stop();<a name="line.3843"></a>
-<span class="sourceLineNo">3844</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.3844"></a>
-<span class="sourceLineNo">3845</span>      this.region = null;<a name="line.3845"></a>
-<span class="sourceLineNo">3846</span>    }<a name="line.3846"></a>
-<span class="sourceLineNo">3847</span>  }<a name="line.3847"></a>
-<span class="sourceLineNo">3848</span><a name="line.3848"></a>
-<span class="sourceLineNo">3849</span>  @Test<a name="line.3849"></a>
-<span class="sourceLineNo">3850</span>  public void testHolesInMeta() throws Exception {<a name="line.3850"></a>
-<span class="sourceLineNo">3851</span>    byte[] family = Bytes.toBytes("family");<a name="line.3851"></a>
-<span class="sourceLineNo">3852</span>    this.region = initHRegion(tableName, Bytes.toBytes("x"), Bytes.toBytes("z"), method, CONF,<a name="line.3852"></a>
-<span class="sourceLineNo">3853</span>        false, family);<a name="line.3853"></a>
-<span class="sourceLineNo">3854</span>    byte[] rowNotServed = Bytes.toBytes("a");<a name="line.3854"></a>
-<span class="sourceLineNo">3855</span>    Get g = new Get(rowNotServed);<a name="line.3855"></a>
-<span class="sourceLineNo">3856</span>    try {<a name="line.3856"></a>
-<span class="sourceLineNo">3857</span>      region.get(g);<a name="line.3857"></a>
-<span class="sourceLineNo">3858</span>      fail();<a name="line.3858"></a>
-<span class="sourceLineNo">3859</span>    } catch (WrongRegionException x) {<a name="line.3859"></a>
-<span class="sourceLineNo">3860</span>      // OK<a name="line.3860"></a>
-<span class="sourceLineNo">3861</span>    }<a name="line.3861"></a>
-<span class="sourceLineNo">3862</span>    byte[] row = Bytes.toBytes("y");<a name="line.3862"></a>
-<span class="sourceLineNo">3863</span>    g = new Get(row);<a name="line.3863"></a>
-<span class="sourceLineNo">3864</span>    region.get(g);<a name="line.3864"></a>
-<span class="sourceLineNo">3865</span>  }<a name="line.3865"></a>
-<span class="sourceLineNo">3866</span><a name="line.3866"></a>
-<span class="sourceLineNo">3867</span>  @Test<a name="line.3867"></a>
-<span class="sourceLineNo">3868</span>  public void testIndexesScanWithOneDeletedRow() throws IOException {<a name="line.3868"></a>
-<span class="sourceLineNo">3869</span>    byte[] family = Bytes.toBytes("family");<a name="line.3869"></a>
-<span class="sourceLineNo">3870</span><a name="line.3870"></a>
-<span class="sourceLineNo">3871</span>    // Setting up region<a name="line.3871"></a>
-<span class="sourceLineNo">3872</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.3872"></a>
-<span class="sourceLineNo">3873</span>    Put put = new Put(Bytes.toBytes(1L));<a name="line.3873"></a>
-<span class="sourceLineNo">3874</span>    put.addColumn(family, qual1, 1L, Bytes.toBytes(1L));<a name="line.3874"></a>
-<span class="sourceLineNo">3875</span>    region.put(put);<a name="line.3875"></a>
+<span class="sourceLineNo">3842</span>    } finally {<a name="line.3842"></a>
+<span class="sourceLineNo">3843</span>      if (putThread != null)<a name="line.3843"></a>
+<span class="sourceLineNo">3844</span>        putThread.done();<a name="line.3844"></a>
+<span class="sourceLineNo">3845</span><a name="line.3845"></a>
+<span class="sourceLineNo">3846</span>      region.flush(true);<a name="line.3846"></a>
+<span class="sourceLineNo">3847</span><a name="line.3847"></a>
+<span class="sourceLineNo">3848</span>      if (putThread != null) {<a name="line.3848"></a>
+<span class="sourceLineNo">3849</span>        putThread.join();<a name="line.3849"></a>
+<span class="sourceLineNo">3850</span>        putThread.checkNoError();<a name="line.3850"></a>
+<span class="sourceLineNo">3851</span>      }<a name="line.3851"></a>
+<span class="sourceLineNo">3852</span><a name="line.3852"></a>
+<span class="sourceLineNo">3853</span>      ctx.stop();<a name="line.3853"></a>
+<span class="sourceLineNo">3854</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.3854"></a>
+<span class="sourceLineNo">3855</span>      this.region = null;<a name="line.3855"></a>
+<span class="sourceLineNo">3856</span>    }<a name="line.3856"></a>
+<span class="sourceLineNo">3857</span>  }<a name="line.3857"></a>
+<span class="sourceLineNo">3858</span><a name="line.3858"></a>
+<span class="sourceLineNo">3859</span>  @Test<a name="line.3859"></a>
+<span class="sourceLineNo">3860</span>  public void testHolesInMeta() throws Exception {<a name="line.3860"></a>
+<span class="sourceLineNo">3861</span>    byte[] family = Bytes.toBytes("family");<a name="line.3861"></a>
+<span class="sourceLineNo">3862</span>    this.region = initHRegion(tableName, Bytes.toBytes("x"), Bytes.toBytes("z"), method, CONF,<a name="line.3862"></a>
+<span class="sourceLineNo">3863</span>        false, family);<a name="line.3863"></a>
+<span class="sourceLineNo">3864</span>    byte[] rowNotServed = Bytes.toBytes("a");<a name="line.3864"></a>
+<span class="sourceLineNo">3865</span>    Get g = new Get(rowNotServed);<a name="line.3865"></a>
+<span class="sourceLineNo">3866</span>    try {<a name="line.3866"></a>
+<span class="sourceLineNo">3867</span>      region.get(g);<a name="line.3867"></a>
+<span class="sourceLineNo">3868</span>      fail();<a name="line.3868"></a>
+<span class="sourceLineNo">3869</span>    } catch (WrongRegionException x) {<a name="line.3869"></a>
+<span class="sourceLineNo">3870</span>      // OK<a name="line.3870"></a>
+<span class="sourceLineNo">3871</span>    }<a name="line.3871"></a>
+<span class="sourceLineNo">3872</span>    byte[] row = Bytes.toBytes("y");<a name="line.3872"></a>
+<span class="sourceLineNo">3873</span>    g = new Get(row);<a name="line.3873"></a>
+<span class="sourceLineNo">3874</span>    region.get(g);<a name="line.3874"></a>
+<span class="sourceLineNo">3875</span>  }<a name="line.3875"></a>
 <span class="sourceLineNo">3876</span><a name="line.3876"></a>
-<span class="sourceLineNo">3877</span>    region.flush(true);<a name="line.3877"></a>
-<span class="sourceLineNo">3878</span><a name="line.3878"></a>
-<span class="sourceLineNo">3879</span>    Delete delete = new Delete(Bytes.toBytes(1L), 1L);<a name="line.3879"></a>
-<span class="sourceLineNo">3880</span>    region.delete(delete);<a name="line.3880"></a>
-<span class="sourceLineNo">3881</span><a name="line.3881"></a>
-<span class="sourceLineNo">3882</span>    put = new Put(Bytes.toBytes(2L));<a name="line.3882"></a>
-<span class="sourceLineNo">3883</span>    put.addColumn(family, qual1, 2L, Bytes.toBytes(2L));<a name="line.3883"></a>
-<span class="sourceLineNo">3884</span>    region.put(put);<a name="line.3884"></a>
-<span class="sourceLineNo">3885</span><a name="line.3885"></a>
-<span class="sourceLineNo">3886</span>    Scan idxScan = new Scan();<a name="line.3886"></a>
-<span class="sourceLineNo">3887</span>    idxScan.addFamily(family);<a name="line.3887"></a>
-<span class="sourceLineNo">3888</span>    idxScan.setFilter(new FilterList(FilterList.Operator.MUST_PASS_ALL, Arrays.&lt;Filter&gt; asList(<a name="line.3888"></a>
-<span class="sourceLineNo">3889</span>        new SingleColumnValueFilter(family, qual1, CompareOperator.GREATER_OR_EQUAL,<a name="line.3889"></a>
-<span class="sourceLineNo">3890</span>            new BinaryComparator(Bytes.toBytes(0L))), new SingleColumnValueFilter(family, qual1,<a name="line.3890"></a>
-<span class="sourceLineNo">3891</span>                    CompareOperator.LESS_OR_EQUAL, new BinaryComparator(Bytes.toBytes(3L))))));<a name="line.3891"></a>
-<span class="sourceLineNo">3892</span>    InternalScanner scanner = region.getScanner(idxScan);<a name="line.3892"></a>
-<span class="sourceLineNo">3893</span>    List&lt;Cell&gt; res = new ArrayList&lt;&gt;();<a name="line.3893"></a>
-<span class="sourceLineNo">3894</span><a name="line.3894"></a>
-<span class="sourceLineNo">3895</span>    while (scanner.next(res)) {<a name="line.3895"></a>
-<span class="sourceLineNo">3896</span>      // Ignore res value.<a name="line.3896"></a>
-<span class="sourceLineNo">3897</span>    }<a name="line.3897"></a>
-<span class="sourceLineNo">3898</span>    assertEquals(1L, res.size());<a name="line.3898"></a>
-<span class="sourceLineNo">3899</span>  }<a name="line.3899"></a>
-<span class="sourceLineNo">3900</span><a name="line.3900"></a>
-<span class="sourceLineNo">3901</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.3901"></a>
-<span class="sourceLineNo">3902</span>  // Bloom filter test<a name="line.3902"></a>
-<span class="sourceLineNo">3903</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.3903"></a>
-<span class="sourceLineNo">3904</span>  @Test<a name="line.3904"></a>
-<span class="sourceLineNo">3905</span>  public void testBloomFilterSize() throws IOException {<a name="line.3905"></a>
-<span class="sourceLineNo">3906</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.3906"></a>
-<span class="sourceLineNo">3907</span>    byte[] qf1 = Bytes.toBytes("col");<a name="line.3907"></a>
-<span class="sourceLineNo">3908</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.3908"></a>
-<span class="sourceLineNo">3909</span>    // Create Table<a name="line.3909"></a>
-<span class="sourceLineNo">3910</span>    HColumnDescriptor hcd = new HColumnDescriptor(fam1).setMaxVersions(Integer.MAX_VALUE)<a name="line.3910"></a>
-<span class="sourceLineNo">3911</span>        .setBloomFilterType(BloomType.ROWCOL);<a name="line.3911"></a>
-<span class="sourceLineNo">3912</span><a name="line.3912"></a>
-<span class="sourceLineNo">3913</span>    HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.3913"></a>
-<span class="sourceLineNo">3914</span>    htd.addFamily(hcd);<a name="line.3914"></a>
-<span class="sourceLineNo">3915</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.3915"></a>
-<span class="sourceLineNo">3916</span>    this.region = TEST_UTIL.createLocalHRegion(info, htd);<a name="line.3916"></a>
-<span class="sourceLineNo">3917</span>    int num_unique_rows = 10;<a name="line.3917"></a>
-<span class="sourceLineNo">3918</span>    int duplicate_multiplier = 2;<a name="line.3918"></a>
-<span class="sourceLineNo">3919</span>    int num_storefiles = 4;<a name="line.3919"></a>
-<span class="sourceLineNo">3920</span><a name="line.3920"></a>
-<span class="sourceLineNo">3921</span>    int version = 0;<a name="line.3921"></a>
-<span class="sourceLineNo">3922</span>    for (int f = 0; f &lt; num_storefiles; f++) {<a name="line.3922"></a>
-<span class="sourceLineNo">3923</span>      for (int i = 0; i &lt; duplicate_multiplier; i++) {<a name="line.3923"></a>
-<span class="sourceLineNo">3924</span>        for (int j = 0; j &lt; num_unique_rows; j++) {<a name="line.3924"></a>
-<span class="sourceLineNo">3925</span>          Put put = new Put(Bytes.toBytes("row" + j));<a name="line.3925"></a>
-<span class="sourceLineNo">3926</span>          put.setDurability(Durability.SKIP_WAL);<a name="line.3926"></a>
-<span class="sourceLineNo">3927</span>          long ts = version++;<a name="line.3927"></a>
-<span class="sourceLineNo">3928</span>          put.addColumn(fam1, qf1, ts, val1);<a name="line.3928"></a>
-<span class="sourceLineNo">3929</span>          region.put(put);<a name="line.3929"></a>
-<span class="sourceLineNo">3930</span>        }<a name="line.3930"></a>
-<span class="sourceLineNo">3931</span>      }<a name="line.3931"></a>
-<span class="sourceLineNo">3932</span>      region.flush(true);<a name="line.3932"></a>
-<span class="sourceLineNo">3933</span>    }<a name="line.3933"></a>
-<span class="sourceLineNo">3934</span>    // before compaction<a name="line.3934"></a>
-<span class="sourceLineNo">3935</span>    HStore store = region.getStore(fam1);<a name="line.3935"></a>
-<span class="sourceLineNo">3936</span>    Collection&lt;HStoreFile&gt; storeFiles = store.getStorefiles();<a name="line.3936"></a>
-<span class="sourceLineNo">3937</span>    for (HStoreFile storefile : storeFiles) {<a name="line.3937"></a>
-<span class="sourceLineNo">3938</span>      StoreFileReader reader = storefile.getReader();<a name="line.3938"></a>
-<span class="sourceLineNo">3939</span>      reader.loadFileInfo();<a name="line.3939"></a>
-<span class="sourceLineNo">3940</span>      reader.loadBloomfilter();<a name="line.3940"></a>
-<span class="sourceLineNo">3941</span>      assertEquals(num_unique_rows * duplicate_multiplier, reader.getEntries());<a name="line.3941"></a>
-<span class="sourceLineNo">3942</span>      assertEquals(num_unique_rows, reader.getFilterEntries());<a name="line.3942"></a>
+<span class="sourceLineNo">3877</span>  @Test<a name="line.3877"></a>
+<span class="sourceLineNo">3878</span>  public void testIndexesScanWithOneDeletedRow() throws IOException {<a name="line.3878"></a>
+<span class="sourceLineNo">3879</span>    byte[] family = Bytes.toBytes("family");<a name="line.3879"></a>
+<span class="sourceLineNo">3880</span><a name="line.3880"></a>
+<span class="sourceLineNo">3881</span>    // Setting up region<a name="line.3881"></a>
+<span class="sourceLineNo">3882</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.3882"></a>
+<span class="sourceLineNo">3883</span>    Put put = new Put(Bytes.toBytes(1L));<a name="line.3883"></a>
+<span class="sourceLineNo">3884</span>    put.addColumn(family, qual1, 1L, Bytes.toBytes(1L));<a name="line.3884"></a>
+<span class="sourceLineNo">3885</span>    region.put(put);<a name="line.3885"></a>
+<span class="sourceLineNo">3886</span><a name="line.3886"></a>
+<span class="sourceLineNo">3887</span>    region.flush(true);<a name="line.3887"></a>
+<span class="sourceLineNo">3888</span><a name="line.3888"></a>
+<span class="sourceLineNo">3889</span>    Delete delete = new Delete(Bytes.toBytes(1L), 1L);<a name="line.3889"></a>
+<span class="sourceLineNo">3890</span>    region.delete(delete);<a name="line.3890"></a>
+<span class="sourceLineNo">3891</span><a name="line.3891"></a>
+<span class="sourceLineNo">3892</span>    put = new Put(Bytes.toBytes(2L));<a name="line.3892"></a>
+<span class="sourceLineNo">3893</span>    put.addColumn(family, qual1, 2L, Bytes.toBytes(2L));<a name="line.3893"></a>
+<span class="sourceLineNo">3894</span>    region.put(put);<a name="line.3894"></a>
+<span class="sourceLineNo">3895</span><a name="line.3895"></a>
+<span class="sourceLineNo">3896</span>    Scan idxScan = new Scan();<a name="line.3896"></a>
+<span class="sourceLineNo">3897</span>    idxScan.addFamily(family);<a name="line.3897"></a>
+<span class="sourceLineNo">3898</span>    idxScan.setFilter(new FilterList(FilterList.Operator.MUST_PASS_ALL, Arrays.&lt;Filter&gt; asList(<a name="line.3898"></a>
+<span class="sourceLineNo">3899</span>        new SingleColumnValueFilter(family, qual1, CompareOperator.GREATER_OR_EQUAL,<a name="line.3899"></a>
+<span class="sourceLineNo">3900</span>            new BinaryComparator(Bytes.toBytes(0L))), new SingleColumnValueFilter(family, qual1,<a name="line.3900"></a>
+<span class="sourceLineNo">3901</span>                    CompareOperator.LESS_OR_EQUAL, new BinaryComparator(Bytes.toBytes(3L))))));<a name="line.3901"></a>
+<span class="sourceLineNo">3902</span>    InternalScanner scanner = region.getScanner(idxScan);<a name="line.3902"></a>
+<span class="sourceLineNo">3903</span>    List&lt;Cell&gt; res = new ArrayList&lt;&gt;();<a name="line.3903"></a>
+<span class="sourceLineNo">3904</span><a name="line.3904"></a>
+<span class="sourceLineNo">3905</span>    while (scanner.next(res)) {<a name="line.3905"></a>
+<span class="sourceLineNo">3906</span>      // Ignore res value.<a name="line.3906"></a>
+<span class="sourceLineNo">3907</span>    }<a name="line.3907"></a>
+<span class="sourceLineNo">3908</span>    assertEquals(1L, res.size());<a name="line.3908"></a>
+<span class="sourceLineNo">3909</span>  }<a name="line.3909"></a>
+<span class="sourceLineNo">3910</span><a name="line.3910"></a>
+<span class="sourceLineNo">3911</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.3911"></a>
+<span class="sourceLineNo">3912</span>  // Bloom filter test<a name="line.3912"></a>
+<span class="sourceLineNo">3913</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.3913"></a>
+<span class="sourceLineNo">3914</span>  @Test<a name="line.3914"></a>
+<span class="sourceLineNo">3915</span>  public void testBloomFilterSize() throws IOException {<a name="line.3915"></a>
+<span class="sourceLineNo">3916</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.3916"></a>
+<span class="sourceLineNo">3917</span>    byte[] qf1 = Bytes.toBytes("col");<a name="line.3917"></a>
+<span class="sourceLineNo">3918</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.3918"></a>
+<span class="sourceLineNo">3919</span>    // Create Table<a name="line.3919"></a>
+<span class="sourceLineNo">3920</span>    HColumnDescriptor hcd = new HColumnDescriptor(fam1).setMaxVersions(Integer.MAX_VALUE)<a name="line.3920"></a>
+<span class="sourceLineNo">3921</span>        .setBloomFilterType(BloomType.ROWCOL);<a name="line.3921"></a>
+<span class="sourceLineNo">3922</span><a name="line.3922"></a>
+<span class="sourceLineNo">3923</span>    HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.3923"></a>
+<span class="sourceLineNo">3924</span>    htd.addFamily(hcd);<a name="line.3924"></a>
+<span class="sourceLineNo">3925</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.3925"></a>
+<span class="sourceLineNo">3926</span>    this.region = TEST_UTIL.createLocalHRegion(info, htd);<a name="line.3926"></a>
+<span class="sourceLineNo">3927</span>    int num_unique_rows = 10;<a name="line.3927"></a>
+<span class="sourceLineNo">3928</span>    int duplicate_multiplier = 2;<a name="line.3928"></a>
+<span class="sourceLineNo">3929</span>    int num_storefiles = 4;<a name="line.3929"></a>
+<span class="sourceLineNo">3930</span><a name="line.3930"></a>
+<span class="sourceLineNo">3931</span>    int version = 0;<a name="line.3931"></a>
+<span class="sourceLineNo">3932</span>    for (int f = 0; f &lt; num_storefiles; f++) {<a name="line.3932"></a>
+<span class="sourceLineNo">3933</span>      for (int i = 0; i &lt; duplicate_multiplier; i++) {<a name="line.3933"></a>
+<span class="sourceLineNo">3934</span>        for (int j = 0; j &lt; num_unique_rows; j++) {<a name="line.3934"></a>
+<span class="sourceLineNo">3935</span>          Put put = new Put(Bytes.toBytes("row" + j));<a name="line.3935"></a>
+<span class="sourceLineNo">3936</span>          put.setDurability(Durability.SKIP_WAL);<a name="line.3936"></a>
+<span class="sourceLineNo">3937</span>          long ts = version++;<a name="line.3937"></a>
+<span class="sourceLineNo">3938</span>          put.addColumn(fam1, qf1, ts, val1);<a name="line.3938"></a>
+<span class="sourceLineNo">3939</span>          region.put(put);<a name="line.3939"></a>
+<span class="sourceLineNo">3940</span>        }<a name="line.3940"></a>
+<span class="sourceLineNo">3941</span>      }<a name="line.3941"></a>
+<span class="sourceLineNo">3942</span>      region.flush(true);<a name="line.3942"></a>
 <span class="sourceLineNo">3943</span>    }<a name="line.3943"></a>
-<span class="sourceLineNo">3944</span><a name="line.3944"></a>
-<span class="sourceLineNo">3945</span>    region.compact(true);<a name="line.3945"></a>
-<span class="sourceLineNo">3946</span><a name="line.3946"></a>
-<span class="sourceLineNo">3947</span>    // after compaction<a name="line.3947"></a>
-<span class="sourceLineNo">3948</span>    storeFiles = store.getStorefiles();<a name="line.3948"></a>
-<span class="sourceLineNo">3949</span>    for (HStoreFile storefile : storeFiles) {<a name="line.3949"></a>
-<span class="sourceLineNo">3950</span>      StoreFileReader reader = storefile.getReader();<a name="line.3950"></a>
-<span class="sourceLineNo">3951</span>      reader.loadFileInfo();<a name="line.3951"></a>
-<span class="sourceLineNo">3952</span>      reader.loadBloomfilter();<a name="line.3952"></a>
-<span class="sourceLineNo">3953</span>      assertEquals(num_unique_rows * duplicate_multiplier * num_storefiles, reader.getEntries());<a name="line.3953"></a>
-<span class="sourceLineNo">3954</span>      assertEquals(num_unique_rows, reader.getFilterEntries());<a name="line.3954"></a>
-<span class="sourceLineNo">3955</span>    }<a name="line.3955"></a>
-<span class="sourceLineNo">3956</span>  }<a name="line.3956"></a>
-<span class="sourceLineNo">3957</span><a name="line.3957"></a>
-<span class="sourceLineNo">3958</span>  @Test<a name="line.3958"></a>
-<span class="sourceLineNo">3959</span>  public void testAllColumnsWithBloomFilter() throws IOException {<a name="line.3959"></a>
-<span class="sourceLineNo">3960</span>    byte[] TABLE = Bytes.toBytes(name.getMethodName());<a name="line.3960"></a>
-<span class="sourceLineNo">3961</span>    byte[] FAMILY = Bytes.toBytes("family");<a name="line.3961"></a>
-<span class="sourceLineNo">3962</span><a name="line.3962"></a>
-<span class="sourceLineNo">3963</span>    // Create table<a name="line.3963"></a>
-<span class="sourceLineNo">3964</span>    HColumnDescriptor hcd = new HColumnDescriptor(FAMILY).setMaxVersions(Integer.MAX_VALUE)<a name="line.3964"></a>
-<span class="sourceLineNo">3965</span>        .setBloomFilterType(BloomType.ROWCOL);<a name="line.3965"></a>
-<span class="sourceLineNo">3966</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(TABLE));<a name="line.3966"></a>
-<span class="sourceLineNo">3967</span>    htd.addFamily(hcd);<a name="line.3967"></a>
-<span class="sourceLineNo">3968</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.3968"></a>
-<span class="sourceLineNo">3969</span>    this.region = TEST_UTIL.createLocalHRegion(info, htd);<a name="line.3969"></a>
-<span class="sourceLineNo">3970</span>    // For row:0, col:0: insert versions 1 through 5.<a name="line.3970"></a>
-<span class="sourceLineNo">3971</span>    byte[] row = Bytes.toBytes("row:" + 0);<a name="line.3971"></a>
-<span class="sourceLineNo">3972</span>    byte[] column = Bytes.toBytes("column:" + 0);<a name="line.3972"></a>
-<span class="sourceLineNo">3973</span>    Put put = new Put(row);<a name="line.3973"></a>
-<span class="sourceLineNo">3974</span>    put.setDurability(Durability.SKIP_WAL);<a name="line.3974"></a>
-<span class="sourceLineNo">3975</span>    for (long idx = 1; idx &lt;= 4; idx++) {<a name="line.3975"></a>
-<span class="sourceLineNo">3976</span>      put.addColumn(FAMILY, column, idx, Bytes.toBytes("value-version-" + idx));<a name="line.3976"></a>
-<span class="sourceLineNo">3977</span>    }<a name="line.3977"></a>
-<span class="sourceLineNo">3978</span>    region.put(put);<a name="line.3978"></a>
-<span class="sourceLineNo">3979</span><a name="line.3979"></a>
-<span class="sourceLineNo">3980</span>    // Flush<a name="line.3980"></a>
-<span class="sourceLineNo">3981</span>    region.flush(true);<a name="line.3981"></a>
-<span class="sourceLineNo">3982</span><a name="line.3982"></a>
-<span class="sourceLineNo">3983</span>    // Get rows<a name="line.3983"></a>
-<span class="sourceLineNo">3984</span>    Get get = new Get(row);<a name="line.3984"></a>
-<span class="sourceLineNo">3985</span>    get.readAllVersions();<a name="line.3985"></a>
-<span class="sourceLineNo">3986</span>    Cell[] kvs = region.get(get).rawCells();<a name="line.3986"></a>
-<span class="sourceLineNo">3987</span><a name="line.3987"></a>
-<span class="sourceLineNo">3988</span>    // Check if rows are correct<a name="line.3988"></a>
-<span class="sourceLineNo">3989</span>    assertEquals(4, kvs.length);<a name="line.3989"></a>
-<span class="sourceLineNo">3990</span>    checkOneCell(kvs[0], FAMILY, 0, 0, 4);<a name="line.3990"></a>
-<span class="sourceLineNo">3991</span>    checkOneCell(kvs[1], FAMILY, 0, 0, 3);<a name="line.3991"></a>
-<span class="sourceLineNo">3992</span>    checkOneCell(kvs[2], FAMILY, 0, 0, 2);<a name="line.3992"></a>
-<span class="sourceLineNo">3993</span>    checkOneCell(kvs[3], FAMILY, 0, 0, 1);<a name="line.3993"></a>
-<span class="sourceLineNo">3994</span>  }<a name="line.3994"></a>
-<span class="sourceLineNo">3995</span><a name="line.3995"></a>
-<span class="sourceLineNo">3996</span>  /**<a name="line.3996"></a>
-<span class="sourceLineNo">3997</span>   * Testcase to cover bug-fix for HBASE-2823 Ensures correct delete when<a name="line.3997"></a>
-<span class="sourceLineNo">3998</span>   * issuing delete row on columns with bloom filter set to row+col<a name="line.3998"></a>
-<span class="sourceLineNo">3999</span>   * (BloomType.ROWCOL)<a name="line.3999"></a>
-<span class="sourceLineNo">4000</span>   */<a name="line.4000"></a>
-<span class="sourceLineNo">4001</span>  @Test<a name="line.4001"></a>
-<span class="sourceLineNo">4002</span>  public void testDeleteRowWithBloomFilter() throws IOException {<a name="line.4002"></a>
-<span class="sourceLineNo">4003</span>    byte[] familyName = Bytes.toBytes("familyName");<a name="line.4003"></a>
-<span class="sourceLineNo">4004</span><a name="line.4004"></a>
-<span class="sourceLineNo">4005</span>    // Create Table<a name="line.4005"></a>
-<span class="sourceLineNo">4006</span>    HColumnDescriptor hcd = new HColumnDescriptor(familyName).setMaxVersions(Integer.MAX_VALUE)<a name="line.4006"></a>
-<span class="sourceLineNo">4007</span>        .setBloomFilterType(BloomType.ROWCOL);<a name="line.4007"></a>
-<span class="sourceLineNo">4008</span><a name="line.4008"></a>
-<span class="sourceLineNo">4009</span>    HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.4009"></a>
-<span class="sourceLineNo">4010</span>    htd.addFamily(hcd);<a name="line.4010"></a>
-<span class="sourceLineNo">4011</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.4011"></a>
-<span class="sourceLineNo">4012</span>    this.region = TEST_UTIL.createLocalHRegion(info, htd);<a name="line.4012"></a>
-<span class="sourceLineNo">4013</span>    // Insert some data<a name="line.4013"></a>
-<span class="sourceLineNo">4014</span>    byte[] row = Bytes.toBytes("row1");<a name="line.4014"></a>
-<span class="sourceLineNo">4015</span>    byte[] col = Bytes.toBytes("col1");<a name="line.4015"></a>
-<span class="sourceLineNo">4016</span><a name="line.4016"></a>
-<span class="sourceLineNo">4017</span>    Put put = new Put(row);<a name="line.4017"></a>
-<span class="sourceLineNo">4018</span>    put.addColumn(familyName, col, 1, Bytes.toBytes("SomeRandomValue"));<a name="line.4018"></a>
-<span class="sourceLineNo">4019</span>    region.put(put);<a name="line.4019"></a>
-<span class="sourceLineNo">4020</span>    region.flush(true);<a name="line.4020"></a>
-<span class="sourceLineNo">4021</span><a name="line.4021"></a>
-<span class="sourceLineNo">4022</span>    Delete del = new Delete(row);<a name="line.4022"></a>
-<span class="sourceLineNo">4023</span>    region.delete(del);<a name="line.4023"></a>
-<span class="sourceLineNo">4024</span>    region.flush(true);<a name="line.4024"></a>
-<span class="sourceLineNo">4025</span><a name="line.4025"></a>
-<span class="sourceLineNo">4026</span>    // Get remaining rows (should have none)<a name="line.4026"></a>
-<span class="sourceLineNo">4027</span>    Get get = new Get(row);<a name="line.4027"></a>
-<span class="sourceLineNo">4028</span>    get.addColumn(familyName, col);<a name="line.4028"></a>
-<span class="sourceLineNo">4029</span><a name="line.4029"></a>
-<span class="sourceLineNo">4030</span>    Cell[] keyValues = region.get(get).rawCells();<a name="line.4030"></a>
-<span class="sourceLineNo">4031</span>    assertEquals(0, keyValues.length);<a name="line.4031"></a>
-<span class="sourceLineNo">4032</span>  }<a name="line.4032"></a>
-<span class="sourceLineNo">4033</span><a name="line.4033"></a>
-<span class="sourceLineNo">4034</span>  @Test<a name="line.4034"></a>
-<span class="sourceLineNo">4035</span>  public void testgetHDFSBlocksDistribution() throws Exception {<a name="line.4035"></a>
-<span class="sourceLineNo">4036</span>    HBaseTestingUtility htu = new HBaseTestingUtility();<a name="line.4036"></a>
-<span class="sourceLineNo">4037</span>    // Why do we set the block size in this test?  If we set it smaller than the kvs, then we'll<a name="line.4037"></a>
-<span class="sourceLineNo">4038</span>    // break up the file in to more pieces that can be distributed across the three nodes and we<a name="line.4038"></a>
-<span class="sourceLineNo">4039</span>    // won't be able to have the condition this test asserts; that at least one node has<a name="line.4039"></a>
-<span class="sourceLineNo">4040</span>    // a copy of all replicas -- if small block size, then blocks are spread evenly across the<a name="line.4040"></a>
-<span class="sourceLineNo">4041</span>    // the three nodes.  hfilev3 with tags seems to put us over the block size.  St.Ack.<a name="line.4041"></a>
-<span class="sourceLineNo">4042</span>    // final int DEFAULT_BLOCK_SIZE = 1024;<a name="line.4042"></a>
-<span class="sourceLineNo">4043</span>    // htu.getConfiguration().setLong("dfs.blocksize", DEFAULT_BLOCK_SIZE);<a name="line.4043"></a>
-<span class="sourceLineNo">4044</span>    htu.getConfiguration().setInt("dfs.replication", 2);<a name="line.4044"></a>
-<span class="sourceLineNo">4045</span><a name="line.4045"></a>
-<span class="sourceLineNo">4046</span>    // set up a cluster with 3 nodes<a name="line.4046"></a>
-<span class="sourceLineNo">4047</span>    MiniHBaseCluster cluster = null;<a name="line.4047"></a>
-<span class="sourceLineNo">4048</span>    String dataNodeHosts[] = new String[] { "host1", "host2", "host3" };<a name="line.4048"></a>
-<span class="sourceLineNo">4049</span>    int regionServersCount = 3;<a name="line.4049"></a>
-<span class="sourceLineNo">4050</span><a name="line.4050"></a>
-<span class="sourceLineNo">4051</span>    try {<a name="line.4051"></a>
-<span class="sourceLineNo">4052</span>      StartMiniClusterOption option = StartMiniClusterOption.builder()<a name="line.4052"></a>
-<span class="sourceLineNo">4053</span>          .numRegionServers(regionServersCount).dataNodeHosts(dataNodeHosts).build();<a name="line.4053"></a>
-<span class="sourceLineNo">4054</span>      cluster = htu.startMiniCluster(option);<a name="line.4054"></a>
-<span class="sourceLineNo">4055</span>      byte[][] families = { fam1, fam2 };<a name="line.4055"></a>
-<span class="sourceLineNo">4056</span>      Table ht = htu.createTable(tableName, families);<a name="line.4056"></a>
-<span class="sourceLineNo">4057</span><a name="line.4057"></a>
-<span class="sourceLineNo">4058</span>      // Setting up region<a name="line.4058"></a>
-<span class="sourceLineNo">4059</span>      byte row[] = Bytes.toBytes("row1");<a name="line.4059"></a>
-<span class="sourceLineNo">4060</span>      byte col[] = Bytes.toBytes("col1");<a name="line.4060"></a>
-<span class="sourceLineNo">4061</span><a name="line.4061"></a>
-<span class="sourceLineNo">4062</span>      Put put = new Put(row);<a name="line.4062"></a>
-<span class="sourceLineNo">4063</span>      put.addColumn(fam1, col, 1, Bytes.toBytes("test1"));<a name="line.4063"></a>
-<span class="sourceLineNo">4064</span>      put.addColumn(fam2, col, 1, Bytes.toBytes("test2"));<a name="line.4064"></a>
-<span class="sourceLineNo">4065</span>      ht.put(put);<a name="line.4065"></a>
-<span class="sourceLineNo">4066</span><a name="line.4066"></a>
-<span class="sourceLineNo">4067</span>      HRegion firstRegion = htu.getHBaseCluster().getRegions(tableName).get(0);<a name="line.4067"></a>
-<span class="sourceLineNo">4068</span>      firstRegion.flush(true);<a name="line.4068"></a>
-<span class="sourceLineNo">4069</span>      HDFSBlocksDistribution blocksDistribution1 = firstRegion.getHDFSBlocksDistribution();<a name="line.4069"></a>
-<span class="sourceLineNo">4070</span><a name="line.4070"></a>
-<span class="sourceLineNo">4071</span>      // Given the default replication factor is 2 and we have 2 HFiles,<a name="line.4071"></a>
-<span class="sourceLineNo">4072</span>      // we will have total of 4 replica of blocks on 3 datanodes; thus there<a name="line.4072"></a>
-<span class="sourceLineNo">4073</span>      // must be at least one host that have replica for 2 HFiles. That host's<a name="line.4073"></a>
-<span class="sourceLineNo">4074</span>      // weight will be equal to the unique block weight.<a name="line.4074"></a>
-<span class="sourceLineNo">4075</span>      long uniqueBlocksWeight1 = blocksDistribution1.getUniqueBlocksTotalWeight();<a name="line.4075"></a>
-<span class="sourceLineNo">4076</span>      StringBuilder sb = new StringBuilder();<a name="line.4076"></a>
-<span class="sourceLineNo">4077</span>      for (String host: blocksDistribution1.getTopHosts()) {<a name="line.4077"></a>
-<span class="sourceLineNo">4078</span>        if (sb.length() &gt; 0) sb.append(", ");<a name="line.4078"></a>
-<span class="sourceLineNo">4079</span>        sb.append(host);<a name="line.4079"></a>
-<span class="sourceLineNo">4080</span>        sb.append("=");<a name="line.4080"></a>
-<span class="sourceLineNo">4081</span>        sb.append(blocksDistribution1.getWeight(host));<a name="line.4081"></a>
-<span class="sourceLineNo">4082</span>      }<a name="line.4082"></a>
-<span class="sourceLineNo">4083</span><a name="line.4083"></a>
-<span class="sourceLineNo">4084</span>      String topHost = blocksDistribution1.getTopHosts().get(0);<a name="line.4084"></a>
-<span class="sourceLineNo">4085</span>      long topHostWeight = blocksDistribution1.getWeight(topHost);<a name="line.4085"></a>
-<span class="sourceLineNo">4086</span>      String msg = "uniqueBlocksWeight=" + uniqueBlocksWeight1 + ", topHostWeight=" +<a name="line.4086"></a>
-<span class="sourceLineNo">4087</span>        topHostWeight + ", topHost=" + topHost + "; " + sb.toString();<a name="line.4087"></a>
-<span class="sourceLineNo">4088</span>      LOG.info(msg);<a name="line.4088"></a>
-<span class="sourceLineNo">4089</span>      assertTrue(msg, uniqueBlocksWeight1 == topHostWeight);<a name="line.4089"></a>
-<span class="sourceLineNo">4090</span><a name="line.4090"></a>
-<span class="sourceLineNo">4091</span>      // use the static method to compute the value, it should be the same.<a name="line.4091"></a>
-<span class="sourceLineNo">4092</span>      // static method is used by load balancer or other components<a name="line.4092"></a>
-<span class="sourceLineNo">4093</span>      HDFSBlocksDistribution blocksDistribution2 = HRegion.computeHDFSBlocksDistribution(<a name="line.4093"></a>
-<span class="sourceLineNo">4094</span>          htu.getConfiguration(), firstRegion.getTableDescriptor(), firstRegion.getRegionInfo());<a name="line.4094"></a>
-<span class="sourceLineNo">4095</span>      long uniqueBlocksWeight2 = blocksDistribution2.getUniqueBlocksTotalWeight();<a name="line.4095"></a>
-<span class="sourceLineNo">4096</span><a name="line.4096"></a>
-<span class="sourceLineNo">4097</span>      assertTrue(uniqueBlocksWeight1 == uniqueBlocksWeight2);<a name="line.4097"></a>
-<span class="sourceLineNo">4098</span><a name="line.4098"></a>
-<span class="sourceLineNo">4099</span>      ht.close();<a name="line.4099"></a>
-<span class="sourceLineNo">4100</span>    } finally {<a name="line.4100"></a>
-<span class="sourceLineNo">4101</span>      if (cluster != null) {<a name="line.4101"></a>
-<span class="sourceLineNo">4102</span>        htu.shutdownMiniCluster();<a name="line.4102"></a>
-<span class="sourceLineNo">4103</span>      }<a name="line.4103"></a>
-<span class="sourceLineNo">4104</span>    }<a name="line.4104"></a>
-<span class="sourceLineNo">4105</span>  }<a name="line.4105"></a>
+<span class="sourceLineNo">3944</span>    // before compaction<a name="line.3944"></a>
+<span class="sourceLineNo">3945</span>    HStore store = region.getStore(fam1);<a name="line.3945"></a>
+<span class="sourceLineNo">3946</span>    Collection&lt;HStoreFile&gt; storeFiles = store.getStorefiles();<a name="line.3946"></a>
+<span class="sourceLineNo">3947</span>    for (HStoreFile storefile : storeFiles) {<a name="line.3947"></a>
+<span class="sourceLineNo">3948</span>      StoreFileReader reader = storefile.getReader();<a name="line.3948"></a>
+<span class="sourceLineNo">3949</span>      reader.loadFileInfo();<a name="line.3949"></a>
+<span class="sourceLineNo">3950</span>      reader.loadBloomfilter();<a name="line.3950"></a>
+<span class="sourceLineNo">3951</span>      assertEquals(num_unique_rows * duplicate_multiplier, reader.getEntries());<a name="line.3951"></a>
+<span class="sourceLineNo">3952</span>      assertEquals(num_unique_rows, reader.getFilterEntries());<a name="line.3952"></a>
+<span class="sourceLineNo">3953</span>    }<a name="line.3953"></a>
+<span class="sourceLineNo">3954</span><a name="line.3954"></a>
+<span class="sourceLineNo">3955</span>    region.compact(true);<a name="line.3955"></a>
+<span class="sourceLineNo">3956</span><a name="line.3956"></a>
+<span class="sourceLineNo">3957</span>    // after compaction<a name="line.3957"></a>
+<span class="sourceLineNo">3958</span>    storeFiles = store.getStorefiles();<a name="line.3958"></a>
+<span class="sourceLineNo">3959</span>    for (HStoreFile storefile : storeFiles) {<a name="line.3959"></a>
+<span class="sourceLineNo">3960</span>      StoreFileReader reader = storefile.getReader();<a name="line.3960"></a>
+<span class="sourceLineNo">3961</span>      reader.loadFileInfo();<a name="line.3961"></a>
+<span class="sourceLineNo">3962</span>      reader.loadBloomfilter();<a name="line.3962"></a>
+<span class="sourceLineNo">3963</span>      assertEquals(num_unique_rows * duplicate_multiplier * num_storefiles, reader.getEntries());<a name="line.3963"></a>
+<span class="sourceLineNo">3964</span>      assertEquals(num_unique_rows, reader.getFilterEntries());<a name="line.3964"></a>
+<span class="sourceLineNo">3965</span>    }<a name="line.3965"></a>
+<span class="sourceLineNo">3966</span>  }<a name="line.3966"></a>
+<span class="sourceLineNo">3967</span><a name="line.3967"></a>
+<span class="sourceLineNo">3968</span>  @Test<a name="line.3968"></a>
+<span class="sourceLineNo">3969</span>  public void testAllColumnsWithBloomFilter() throws IOException {<a name="line.3969"></a>
+<span class="sourceLineNo">3970</span>    byte[] TABLE = Bytes.toBytes(name.getMethodName());<a name="line.3970"></a>
+<span class="sourceLineNo">3971</span>    byte[] FAMILY = Bytes.toBytes("family");<a name="line.3971"></a>
+<span class="sourceLineNo">3972</span><a name="line.3972"></a>
+<span class="sourceLineNo">3973</span>    // Create table<a name="line.3973"></a>
+<span class="sourceLineNo">3974</span>    HColumnDescriptor hcd = new HColumnDescriptor(FAMILY).setMaxVersions(Integer.MAX_VALUE)<a name="line.3974"></a>
+<span class="sourceLineNo">3975</span>        .setBloomFilterType(BloomType.ROWCOL);<a name="line.3975"></a>
+<span class="sourceLineNo">3976</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(TABLE));<a name="line.3976"></a>
+<span class="sourceLineNo">3977</span>    htd.addFamily(hcd);<a name="line.3977"></a>
+<span class="sourceLineNo">3978</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.3978"></a>
+<span class="sourceLineNo">3979</span>    this.region = TEST_UTIL.createLocalHRegion(info, htd);<a name="line.3979"></a>
+<span class="sourceLineNo">3980</span>    // For row:0, col:0: insert versions 1 through 5.<a name="line.3980"></a>
+<span class="sourceLineNo">3981</span>    byte[] row = Bytes.toBytes("row:" + 0);<a name="line.3981"></a>
+<span class="sourceLineNo">3982</span>    byte[] column = Bytes.toBytes("column:" + 0);<a name="line.3982"></a>
+<span class="sourceLineNo">3983</span>    Put put = new Put(row);<a name="line.3983"></a>
+<span class="sourceLineNo">3984</span>    put.setDurability(Durability.SKIP_WAL);<a name="line.3984"></a>
+<span class="sourceLineNo">3985</span>    for (long idx = 1; idx &lt;= 4; idx++) {<a name="line.3985"></a>
+<span class="sourceLineNo">3986</span>      put.addColumn(FAMILY, column, idx, Bytes.toBytes("value-version-" + idx));<a name="line.3986"></a>
+<span class="sourceLineNo">3987</span>    }<a name="line.3987"></a>
+<span class="sourceLineNo">3988</span>    region.put(put);<a name="line.3988"></a>
+<span class="sourceLineNo">3989</span><a name="line.3989"></a>
+<span class="sourceLineNo">3990</span>    // Flush<a name="line.3990"></a>
+<span class="sourceLineNo">3991</span>    region.flush(true);<a name="line.3991"></a>
+<span class="sourceLineNo">3992</span><a name="line.3992"></a>
+<span class="sourceLineNo">3993</span>    // Get rows<a name="line.3993"></a>
+<span class="sourceLineNo">3994</span>    Get get = new Get(row);<a name="line.3994"></a>
+<span class="sourceLineNo">3995</span>    get.readAllVersions();<a name="line.3995"></a>
+<span class="sourceLineNo">3996</span>    Cell[] kvs = region.get(get).rawCells();<a name="line.3996"></a>
+<span class="sourceLineNo">3997</span><a name="line.3997"></a>
+<span class="sourceLineNo">3998</span>    // Check if rows are correct<a name="line.3998"></a>
+<span class="sourceLineNo">3999</span>    assertEquals(4, kvs.length);<a name="line.3999"></a>
+<span class="sourceLineNo">4000</span>    checkOneCell(kvs[0], FAMILY, 0, 0, 4);<a name="line.4000"></a>
+<span class="sourceLineNo">4001</span>    checkOneCell(kvs[1], FAMILY, 0, 0, 3);<a name="line.4001"></a>
+<span class="sourceLineNo">4002</span>    checkOneCell(kvs[2], FAMILY, 0, 0, 2);<a name="line.4002"></a>
+<span class="sourceLineNo">4003</span>    checkOneCell(kvs[3], FAMILY, 0, 0, 1);<a name="line.4003"></a>
+<span class="sourceLineNo">4004</span>  }<a name="line.4004"></a>
+<span class="sourceLineNo">4005</span><a name="line.4005"></a>
+<span class="sourceLineNo">4006</span>  /**<a name="line.4006"></a>
+<span class="sourceLineNo">4007</span>   * Testcase to cover bug-fix for HBASE-2823 Ensures correct delete when<a name="line.4007"></a>
+<span class="sourceLineNo">4008</span>   * issuing delete row on columns with bloom filter set to row+col<a name="line.4008"></a>
+<span class="sourceLineNo">4009</span>   * (BloomType.ROWCOL)<a name="line.4009"></a>
+<span class="sourceLineNo">4010</span>   */<a name="line.4010"></a>
+<span class="sourceLineNo">4011</span>  @Test<a name="line.4011"></a>
+<span class="sourceLineNo">4012</span>  public void testDeleteRowWithBloomFilter() throws IOException {<a name="line.4012"></a>
+<span class="sourceLineNo">4013</span>    byte[] familyName = Bytes.toBytes("familyName");<a name="line.4013"></a>
+<span class="sourceLineNo">4014</span><a name="line.4014"></a>
+<span class="sourceLineNo">4015</span>    // Create Table<a name="line.4015"></a>
+<span class="sourceLineNo">4016</span>    HColumnDescriptor hcd = new HColumnDescriptor(familyName).setMaxVersions(Integer.MAX_VALUE)<a name="line.4016"></a>
+<span class="sourceLineNo">4017</span>        .setBloomFilterType(BloomType.ROWCOL);<a name="line.4017"></a>
+<span class="sourceLineNo">4018</span><a name="line.4018"></a>
+<span class="sourceLineNo">4019</span>    HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.4019"></a>
+<span class="sourceLineNo">4020</span>    htd.addFamily(hcd);<a name="line.4020"></a>
+<span class="sourceLineNo">4021</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.4021"></a>
+<span class="sourceLineNo">4022</span>    this.region = TEST_UTIL.createLocalHRegion(info, htd);<a name="line.4022"></a>
+<span class="sourceLineNo">4023</span>    // Insert some data<a name="line.4023"></a>
+<span class="sourceLineNo">4024</span>    byte[] row = Bytes.toBytes("row1");<a name="line.4024"></a>
+<span class="sourceLineNo">4025</span>    byte[] col = Bytes.toBytes("col1");<a name="line.4025"></a>
+<span class="sourceLineNo">4026</span><a name="line.4026"></a>
+<span class="sourceLineNo">4027</span>    Put put = new Put(row);<a name="line.4027"></a>
+<span class="sourceLineNo">4028</span>    put.addColumn(familyName, col, 1, Bytes.toBytes("SomeRandomValue"));<a name="line.4028"></a>
+<span class="sourceLineNo">4029</span>    region.put(put);<a name="line.4029"></a>
+<span class="sourceLineNo">4030</span>    region.flush(true);<a name="line.4030"></a>
+<span class="sourceLineNo">4031</span><a name="line.4031"></a>
+<span class="sourceLineNo">4032</span>    Delete del = new Delete(row);<a name="line.4032"></a>
+<span class="sourceLineNo">4033</span>    region.delete(del);<a name="line.4033"></a>
+<span class="sourceLineNo">4034</span>    region.flush(true);<a name="line.4034"></a>
+<span class="sourceLineNo">4035</span><a name="line.4035"></a>
+<span class="sourceLineNo">4036</span>    // Get remaining rows (should have none)<a name="line.4036"></a>
+<span class="sourceLineNo">4037</span>    Get get = new Get(row);<a name="line.4037"></a>
+<span class="sourceLineNo">4038</span>    get.addColumn(familyName, col);<a name="line.4038"></a>
+<span class="sourceLineNo">4039</span><a name="line.4039"></a>
+<span class="sourceLineNo">4040</span>    Cell[] keyValues = region.get(get).rawCells();<a name="line.4040"></a>
+<span class="sourceLineNo">4041</span>    assertEquals(0, keyValues.length);<a name="line.4041"></a>
+<span class="sourceLineNo">4042</span>  }<a name="line.4042"></a>
+<span class="sourceLineNo">4043</span><a name="line.4043"></a>
+<span class="sourceLineNo">4044</span>  @Test<a name="line.4044"></a>
+<span class="sourceLineNo">4045</span>  public void testgetHDFSBlocksDistribution() throws Exception {<a name="line.4045"></a>
+<span class="sourceLineNo">4046</span>    HBaseTestingUtility htu = new HBaseTestingUtility();<a name="line.4046"></a>
+<span class="sourceLineNo">4047</span>    // Why do we set the block size in this test?  If we set it smaller than the kvs, then we'll<a name="line.4047"></a>
+<span class="sourceLineNo">4048</span>    // break up the file in to more pieces that can be distributed across the three nodes and we<a name="line.4048"></a>
+<span class="sourceLineNo">4049</span>    // won't be able to have the condition this test asserts; that at least one node has<a name="line.4049"></a>
+<span class="sourceLineNo">4050</span>    // a copy of all replicas -- if small block size, then blocks are spread evenly across the<a name="line.4050"></a>
+<span class="sourceLineNo">4051</span>    // the three nodes.  hfilev3 with tags seems to put us over the block size.  St.Ack.<a name="line.4051"></a>
+<span class="sourceLineNo">4052</span>    // final int DEFAULT_BLOCK_SIZE = 1024;<a name="line.4052"></a>
+<span class="sourceLineNo">4053</span>    // htu.getConfiguration().setLong("dfs.blocksize", DEFAULT_BLOCK_SIZE);<a name="line.4053"></a>
+<span class="sourceLineNo">4054</span>    htu.getConfiguration().setInt("dfs.replication", 2);<a name="line.4054"></a>
+<span class="sourceLineNo">4055</span><a name="line.4055"></a>
+<span class="sourceLineNo">4056</span>    // set up a cluster with 3 nodes<a name="line.4056"></a>
+<span class="sourceLineNo">4057</span>    MiniHBaseCluster cluster = null;<a name="line.4057"></a>
+<span class="sourceLineNo">4058</span>    String dataNodeHosts[] = new String[] { "host1", "host2", "host3" };<a name="line.4058"></a>
+<span class="sourceLineNo">4059</span>    int regionServersCount = 3;<a name="line.4059"></a>
+<span class="sourceLineNo">4060</span><a name="line.4060"></a>
+<span class="sourceLineNo">4061</span>    try {<a name="line.4061"></a>
+<span class="sourceLineNo">4062</span>      StartMiniClusterOption option = StartMiniClusterOption.builder()<a name="line.4062"></a>
+<span class="sourceLineNo">4063</span>          .numRegionServers(regionServersCount).dataNodeHosts(dataNodeHosts).build();<a name="line.4063"></a>
+<span class="sourceLineNo">4064</span>      cluster = htu.startMiniCluster(option);<a name="line.4064"></a>
+<span class="sourceLineNo">4065</span>      byte[][] families = { fam1, fam2 };<a name="line.4065"></a>
+<span class="sourceLineNo">4066</span>      Table ht = htu.createTable(tableName, families);<a name="line.4066"></a>
+<span class="sourceLineNo">4067</span><a name="line.4067"></a>
+<span class="sourceLineNo">4068</span>      // Setting up region<a name="line.4068"></a>
+<span class="sourceLineNo">4069</span>      byte row[] = Bytes.toBytes("row1");<a name="line.4069"></a>
+<span class="sourceLineNo">4070</span>      byte col[] = Bytes.toBytes("col1");<a name="line.4070"></a>
+<span class="sourceLineNo">4071</span><a name="line.4071"></a>
+<span class="sourceLineNo">4072</span>      Put put = new Put(row);<a name="line.4072"></a>
+<span class="sourceLineNo">4073</span>      put.addColumn(fam1, col, 1, Bytes.toBytes("test1"));<a name="line.4073"></a>
+<span class="sourceLineNo">4074</span>      put.addColumn(fam2, col, 1, Bytes.toBytes("test2"));<a name="line.4074"></a>
+<span class="sourceLineNo">4075</span>      ht.put(put);<a name="line.4075"></a>
+<span class="sourceLineNo">4076</span><a name="line.4076"></a>
+<span class="sourceLineNo">4077</span>      HRegion firstRegion = htu.getHBaseCluster().getRegions(tableName).get(0);<a name="line.4077"></a>
+<span class="sourceLineNo">4078</span>      firstRegion.flush(true);<a name="line.4078"></a>
+<span class="sourceLineNo">4079</span>      HDFSBlocksDistribution blocksDistribution1 = firstRegion.getHDFSBlocksDistribution();<a name="line.4079"></a>
+<span class="sourceLineNo">4080</span><a name="line.4080"></a>
+<span class="sourceLineNo">4081</span>      // Given the default replication factor is 2 and we have 2 HFiles,<a name="line.4081"></a>
+<span class="sourceLineNo">4082</span>      // we will have total of 4 replica of blocks on 3 datanodes; thus there<a name="line.4082"></a>
+<span class="sourceLineNo">4083</span>      // must be at least one host that have replica for 2 HFiles. That host's<a name="line.4083"></a>
+<span class="sourceLineNo">4084</span>      // weight will be equal to the unique block weight.<a name="line.4084"></a>
+<span class="sourceLineNo">4085</span>      long uniqueBlocksWeight1 = blocksDistribution1.getUniqueBlocksTotalWeight();<a name="line.4085"></a>
+<span class="sourceLineNo">4086</span>      StringBuilder sb = new StringBuilder();<a name="line.4086"></a>
+<span class="sourceLineNo">4087</span>      for (String host: blocksDistribution1.getTopHosts()) {<a name="line.4087"></a>
+<span class="sourceLineNo">4088</span>        if (sb.length() &gt; 0) sb.append(", ");<a name="line.4088"></a>
+<span class="sourceLineNo">4089</span>        sb.append(host);<a name="line.4089"></a>
+<span class="sourceLineNo">4090</span>        sb.append("=");<a name="line.4090"></a>
+<span class="sourceLineNo">4091</span>        sb.append(blocksDistribution1.getWeight(host));<a name="line.4091"></a>
+<span class="sourceLineNo">4092</span>      }<a name="line.4092"></a>
+<span class="sourceLineNo">4093</span><a name="line.4093"></a>
+<span class="sourceLineNo">4094</span>      String topHost = blocksDistribution1.getTopHosts().get(0);<a name="line.4094"></a>
+<span class="sourceLineNo">4095</span>      long topHostWeight = blocksDistribution1.getWeight(topHost);<a name="line.4095"></a>
+<span class="sourceLineNo">4096</span>      String msg = "uniqueBlocksWeight=" + uniqueBlocksWeight1 + ", topHostWeight=" +<a name="line.4096"></a>
+<span class="sourceLineNo">4097</span>        topHostWeight + ", topHost=" + topHost + "; " + sb.toString();<a name="line.4097"></a>
+<span class="sourceLineNo">4098</span>      LOG.info(msg);<a name="line.4098"></a>
+<span class="sourceLineNo">4099</span>      assertTrue(msg, uniqueBlocksWeight1 == topHostWeight);<a name="line.4099"></a>
+<span class="sourceLineNo">4100</span><a name="line.4100"></a>
+<span class="sourceLineNo">4101</span>      // use the static method to compute the value, it should be the same.<a name="line.4101"></a>
+<span class="sourceLineNo">4102</span>      // static method is used by load balancer or other components<a name="line.4102"></a>
+<span class="sourceLineNo">4103</span>      HDFSBlocksDistribution blocksDistribution2 = HRegion.computeHDFSBlocksDistribution(<a name="line.4103"></a>
+<span class="sourceLineNo">4104</span>          htu.getConfiguration(), firstRegion.getTableDescriptor(), firstRegion.getRegionInfo());<a name="line.4104"></a>
+<span class="sourceLineNo">4105</span>      long uniqueBlocksWeight2 = blocksDistribution2.getUniqueBlocksTotalWeight();<a name="line.4105"></a>
 <span class="sourceLineNo">4106</span><a name="line.4106"></a>
-<span class="sourceLineNo">4107</span>  /**<a name="line.4107"></a>
-<span class="sourceLineNo">4108</span>   * Testcase to check state of region initialization task set to ABORTED or not<a name="line.4108"></a>
-<span class="sourceLineNo">4109</span>   * if any exceptions during initialization<a name="line.4109"></a>
-<span class="sourceLineNo">4110</span>   *<a name="line.4110"></a>
-<span class="sourceLineNo">4111</span>   * @throws Exception<a name="line.4111"></a>
-<span class="sourceLineNo">4112</span>   */<a name="line.4112"></a>
-<span class="sourceLineNo">4113</span>  @Test<a name="line.4113"></a>
-<span class="sourceLineNo">4114</span>  public void testStatusSettingToAbortIfAnyExceptionDuringRegionInitilization() throws Exception {<a name="line.4114"></a>
-<span class="sourceLineNo">4115</span>    HRegionInfo info;<a name="line.4115"></a>
-<span class="sourceLineNo">4116</span>    try {<a name="line.4116"></a>
-<span class="sourceLineNo">4117</span>      FileSystem fs = Mockito.mock(FileSystem.class);<a name="line.4117"></a>
-<span class="sourceLineNo">4118</span>      Mockito.when(fs.exists((Path) Mockito.anyObject())).thenThrow(new IOException());<a name="line.4118"></a>
-<span class="sourceLineNo">4119</span>      HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.4119"></a>
-<span class="sourceLineNo">4120</span>      htd.addFamily(new HColumnDescriptor("cf"));<a name="line.4120"></a>
-<span class="sourceLineNo">4121</span>      info = new HRegionInfo(htd.getTableName(), HConstants.EMPTY_BYTE_ARRAY,<a name="line.4121"></a>
-<span class="sourceLineNo">4122</span>          HConstants.EMPTY_BYTE_ARRAY, false);<a name="line.4122"></a>
-<span class="sourceLineNo">4123</span>      Path path = new Path(dir + "testStatusSettingToAbortIfAnyExceptionDuringRegionInitilization");<a name="line.4123"></a>
-<span class="sourceLineNo">4124</span>      region = HRegion.newHRegion(path, null, fs, CONF, info, htd, null);<a name="line.4124"></a>
-<span class="sourceLineNo">4125</span>      // region initialization throws IOException and set task state to ABORTED.<a name="line.4125"></a>
-<span class="sourceLineNo">4126</span>      region.initialize();<a name="line.4126"></a>
-<span class="sourceLineNo">4127</span>      fail("Region initialization should fail due to IOException");<a name="line.4127"></a>
-<span class="sourceLineNo">4128</span>    } catch (IOException io) {<a name="line.4128"></a>
-<span class="sourceLineNo">4129</span>      List&lt;MonitoredTask&gt; tasks = TaskMonitor.get().getTasks();<a name="line.4129"></a>
-<span class="sourceLineNo">4130</span>      for (MonitoredTask monitoredTask : tasks) {<a name="line.4130"></a>
-<span class="sourceLineNo">4131</span>        if (!(monitoredTask instanceof MonitoredRPCHandler)<a name="line.4131"></a>
-<span class="sourceLineNo">4132</span>            &amp;&amp; monitoredTask.getDescription().contains(region.toString())) {<a name="line.4132"></a>
-<span class="sourceLineNo">4133</span>          assertTrue("Region state should be ABORTED.",<a name="line.4133"></a>
-<span class="sourceLineNo">4134</span>              monitoredTask.getState().equals(MonitoredTask.State.ABORTED));<a name="line.4134"></a>
-<span class="sourceLineNo">4135</span>          break;<a name="line.4135"></a>
-<span class="sourceLineNo">4136</span>        }<a name="line.4136"></a>
-<span class="sourceLineNo">4137</span>      }<a name="line.4137"></a>
-<span class="sourceLineNo">4138</span>    }<a name="line.4138"></a>
-<span class="sourceLineNo">4139</span>  }<a name="line.4139"></a>
-<span class="sourceLineNo">4140</span><a name="line.4140"></a>
-<span class="sourceLineNo">4141</span>  /**<a name="line.4141"></a>
-<span class="sourceLineNo">4142</span>   * Verifies that the .regioninfo file is written on region creation and that<a name="line.4142"></a>
-<span class="sourceLineNo">4143</span>   * is recreated if missing during region opening.<a name="line.4143"></a>
-<span class="sourceLineNo">4144</span>   */<a name="line.4144"></a>
-<span class="sourceLineNo">4145</span>  @Test<a name="line.4145"></a>
-<span class="sourceLineNo">4146</span>  public void testRegionInfoFileCreation() throws IOException {<a name="line.4146"></a>
-<span class="sourceLineNo">4147</span>    Path rootDir = new Path(dir + "testRegionInfoFileCreation");<a name="line.4147"></a>
-<span class="sourceLineNo">4148</span><a name="line.4148"></a>
-<span class="sourceLineNo">4149</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.4149"></a>
-<span class="sourceLineNo">4150</span>    htd.addFamily(new HColumnDescriptor("cf"));<a name="line.4150"></a>
-<span class="sourceLineNo">4151</span><a name="line.4151"></a>
-<span class="sourceLineNo">4152</span>    HRegionInfo hri = new HRegionInfo(htd.getTableName());<a name="line.4152"></a>
-<span class="sourceLineNo">4153</span><a name="line.4153"></a>
-<span class="sourceLineNo">4154</span>    // Create a region and skip the initialization (like CreateTableHandler)<a name="line.4154"></a>
-<span class="sourceLineNo">4155</span>    region = HBaseTestingUtility.createRegionAndWAL(hri, rootDir, CONF, htd, false);<a name="line.4155"></a>
-<span class="sourceLineNo">4156</span>    Path regionDir = region.getRegionFileSystem().getRegionDir();<a name="line.4156"></a>
-<span class="sourceLineNo">4157</span>    FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.4157"></a>
-<span class="sourceLineNo">4158</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.4158"></a>
-<span class="sourceLineNo">4159</span><a name="line.4159"></a>
-<span class="sourceLineNo">4160</span>    Path regionInfoFile = new Path(regionDir, HRegionFileSystem.REGION_INFO_FILE);<a name="line.4160"></a>
+<span class="sourceLineNo">4107</span>      assertTrue(uniqueBlocksWeight1 == uniqueBlocksWeight2);<a name="line.4107"></a>
+<span class="sourceLineNo">4108</span><a name="line.4108"></a>
+<span class="sourceLineNo">4109</span>      ht.close();<a name="line.4109"></a>
+<span class="sourceLineNo">4110</span>    } finally {<a name="line.4110"></a>
+<span class="sourceLineNo">4111</span>      if (cluster != null) {<a name="line.4111"></a>
+<span class="sourceLineNo">4112</span>        htu.shutdownMiniCluster();<a name="line.4112"></a>
+<span class="sourceLineNo">4113</span>      }<a name="line.4113"></a>
+<span class="sourceLineNo">4114</span>    }<a name="line.4114"></a>
+<span class="sourceLineNo">4115</span>  }<a name="line.4115"></a>
+<span class="sourceLineNo">4116</span><a name="line.4116"></a>
+<span class="sourceLineNo">4117</span>  /**<a name="line.4117"></a>
+<span class="sourceLineNo">4118</span>   * Testcase to check state of region initialization task set to ABORTED or not<a name="line.4118"></a>
+<span class="sourceLineNo">4119</span>   * if any exceptions during initialization<a name="line.4119"></a>
+<span class="sourceLineNo">4120</span>   *<a name="line.4120"></a>
+<span class="sourceLineNo">4121</span>   * @throws Exception<a name="line.4121"></a>
+<span class="sourceLineNo">4122</span>   */<a name="line.4122"></a>
+<span class="sourceLineNo">4123</span>  @Test<a name="line.4123"></a>
+<span class="sourceLineNo">4124</span>  public void testStatusSettingToAbortIfAnyExceptionDuringRegionInitilization() throws Exception {<a name="line.4124"></a>
+<span class="sourceLineNo">4125</span>    HRegionInfo info;<a name="line.4125"></a>
+<span class="sourceLineNo">4126</span>    try {<a name="line.4126"></a>
+<span class="sourceLineNo">4127</span>      FileSystem fs = Mockito.mock(FileSystem.class);<a name="line.4127"></a>
+<span class="sourceLineNo">4128</span>      Mockito.when(fs.exists((Path) Mockito.anyObject())).thenThrow(new IOException());<a name="line.4128"></a>
+<span class="sourceLineNo">4129</span>      HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.4129"></a>
+<span class="sourceLineNo">4130</span>      htd.addFamily(new HColumnDescriptor("cf"));<a name="line.4130"></a>
+<span class="sourceLineNo">4131</span>      info = new HRegionInfo(htd.getTableName(), HConstants.EMPTY_BYTE_ARRAY,<a name="line.4131"></a>
+<span class="sourceLineNo">4132</span>          HConstants.EMPTY_BYTE_ARRAY, false);<a name="line.4132"></a>
+<span class="sourceLineNo">4133</span>      Path path = new Path(dir + "testStatusSettingToAbortIfAnyExceptionDuringRegionInitilization");<a name="line.4133"></a>
+<span class="sourceLineNo">4134</span>      region = HRegion.newHRegion(path, null, fs, CONF, info, htd, null);<a name="line.4134"></a>
+<span class="sourceLineNo">4135</span>      // region initialization throws IOException and set task state to ABORTED.<a name="line.4135"></a>
+<span class="sourceLineNo">4136</span>      region.initialize();<a name="line.4136"></a>
+<span class="sourceLineNo">4137</span>      fail("Region initialization should fail due to IOException");<a name="line.4137"></a>
+<span class="sourceLineNo">4138</span>    } catch (IOException io) {<a name="line.4138"></a>
+<span class="sourceLineNo">4139</span>      List&lt;MonitoredTask&gt; tasks = TaskMonitor.get().getTasks();<a name="line.4139"></a>
+<span class="sourceLineNo">4140</span>      for (MonitoredTask monitoredTask : tasks) {<a name="line.4140"></a>
+<span class="sourceLineNo">4141</span>        if (!(monitoredTask instanceof MonitoredRPCHandler)<a name="line.4141"></a>
+<span class="sourceLineNo">4142</span>            &amp;&amp; monitoredTask.getDescription().contains(region.toString())) {<a name="line.4142"></a>
+<span class="sourceLineNo">4143</span>          assertTrue("Region state should be ABORTED.",<a name="line.4143"></a>
+<span class="sourceLineNo">4144</span>              monitoredTask.getState().equals(MonitoredTask.State.ABORTED));<a name="line.4144"></a>
+<span class="sourceLineNo">4145</span>          break;<a name="line.4145"></a>
+<span class="sourceLineNo">4146</span>        }<a name="line.4146"></a>
+<span class="sourceLineNo">4147</span>      }<a name="line.4147"></a>
+<span class="sourceLineNo">4148</span>    }<a name="line.4148"></a>
+<span class="sourceLineNo">4149</span>  }<a name="line.4149"></a>
+<span class="sourceLineNo">4150</span><a name="line.4150"></a>
+<span class="sourceLineNo">4151</span>  /**<a name="line.4151"></a>
+<span class="sourceLineNo">4152</span>   * Verifies that the .regioninfo file is written on region creation and that<a name="line.4152"></a>
+<span class="sourceLineNo">4153</span>   * is recreated if missing during region opening.<a name="line.4153"></a>
+<span class="sourceLineNo">4154</span>   */<a name="line.4154"></a>
+<span class="sourceLineNo">4155</span>  @Test<a name="line.4155"></a>
+<span class="sourceLineNo">4156</span>  public void testRegionInfoFileCreation() throws IOException {<a name="line.4156"></a>
+<span class="sourceLineNo">4157</span>    Path rootDir = new Path(dir + "testRegionInfoFileCreation");<a name="line.4157"></a>
+<span class="sourceLineNo">4158</span><a name="line.4158"></a>
+<span class="sourceLineNo">4159</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.4159"></a>
+<span class="sourceLineNo">4160</span>    htd.addFamily(new HColumnDescriptor("cf"));<a name="line.4160"></a>
 <span class="sourceLineNo">4161</span><a name="line.4161"></a>
-<span class="sourceLineNo">4162</span>    // Verify that the .regioninfo file is present<a name="line.4162"></a>
-<span class="sourceLineNo">4163</span>    assertTrue(HRegionFileSystem.REGION_INFO_FILE + " should be present in the region dir",<a name="line.4163"></a>
-<span class="sourceLineNo">4164</span>        fs.exists(regionInfoFile));<a name="line.4164"></a>
-<span class="sourceLineNo">4165</span><a name="line.4165"></a>
-<span class="sourceLineNo">4166</span>    // Try to open the region<a name="line.4166"></a>
-<span class="sourceLineNo">4167</span>    region = HRegion.openHRegion(rootDir, hri, htd, null, CONF);<a name="line.4167"></a>
-<span class="sourceLineNo">4168</span>    assertEquals(regionDir, region.getRegionFileSystem().getRegionDir());<a name="line.4168"></a>
-<span class="sourceLineNo">4169</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.4169"></a>
-<span class="sourceLineNo">4170</span><a name="line.4170"></a>
-<span class="sourceLineNo">4171</span>    // Verify that the .regioninfo file is still there<a name="line.4171"></a>
-<span class="sourceLineNo">4172</span>    assertTrue(HRegionFileSystem.REGION_INFO_FILE + " should be present in the region dir",<a name="line.4172"></a>
-<span class="sourceLineNo">4173</span>        fs.exists(regionInfoFile));<a name="line.4173"></a>
-<span class="sourceLineNo">4174</span><a name="line.4174"></a>
-<span class="sourceLineNo">4175</span>    // Remove the .regioninfo file and verify is recreated on region open<a name="line.4175"></a>
-<span class="sourceLineNo">4176</span>    fs.delete(regionInfoFile, true);<a name="line.4176"></a>
-<span class="sourceLineNo">4177</span>    assertFalse(HRegionFileSystem.REGION_INFO_FILE + " should be removed from the region dir",<a name="line.4177"></a>
-<span class="sourceLineNo">4178</span>        fs.exists(regionInfoFile));<a name="line.4178"></a>
-<span class="sourceLineNo">4179</span><a name="line.4179"></a>
-<span class="sourceLineNo">4180</span>    region = HRegion.openHRegion(rootDir, hri, htd, null, CONF);<a name="line.4180"></a>
-<span class="sourceLineNo">4181</span>//    region = TEST_UTIL.openHRegion(hri, htd);<a name="line.4181"></a>
-<span class="sourceLineNo">4182</span>    assertEquals(regionDir, region.getRegionFileSystem().getRegionDir());<a name="line.4182"></a>
-<span class="sourceLineNo">4183</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.4183"></a>
+<span class="sourceLineNo">4162</span>    HRegionInfo hri = new HRegionInfo(htd.getTableName());<a name="line.4162"></a>
+<span class="sourceLineNo">4163</span><a name="line.4163"></a>
+<span class="sourceLineNo">4164</span>    // Create a region and skip the initialization (like CreateTableHandler)<a name="line.4164"></a>
+<span class="sourceLineNo">4165</span>    region = HBaseTestingUtility.createRegionAndWAL(hri, rootDir, CONF, htd, false);<a name="line.4165"></a>
+<span class="sourceLineNo">4166</span>    Path regionDir = region.getRegionFileSystem().getRegionDir();<a name="line.4166"></a>
+<span class="sourceLineNo">4167</span>    FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.4167"></a>
+<span class="sourceLineNo">4168</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.4168"></a>
+<span class="sourceLineNo">4169</span><a name="line.4169"></a>
+<span class="sourceLineNo">4170</span>    Path regionInfoFile = new Path(regionDir, HRegionFileSystem.REGION_INFO_FILE);<a name="line.4170"></a>
+<span class="sourceLineNo">4171</span><a name="line.4171"></a>
+<span class="sourceLineNo">4172</span>    // Verify that the .regioninfo file is present<a name="line.4172"></a>
+<span class="sourceLineNo">4173</span>    assertTrue(HRegionFileSystem.REGION_INFO_FILE + " should be present in the region dir",<a name="line.4173"></a>
+<span class="sourceLineNo">4174</span>        fs.exists(regionInfoFile));<a name="line.4174"></a>
+<span class="sourceLineNo">4175</span><a name="line.4175"></a>
+<span class="sourceLineNo">4176</span>    // Try to open the region<a name="line.4176"></a>
+<span class="sourceLineNo">4177</span>    region = HRegion.openHRegion(rootDir, hri, htd, null, CONF);<a name="line.4177"></a>
+<span class="sourceLineNo">4178</span>    assertEquals(regionDir, region.getRegionFileSystem().getRegionDir());<a name="line.4178"></a>
+<span class="sourceLineNo">4179</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.4179"></a>
+<span class="sourceLineNo">4180</span><a name="line.4180"></a>
+<span class="sourceLineNo">4181</span>    // Verify that the .regioninfo file is still there<a name="line.4181"></a>
+<span class="sourceLineNo">4182</span>    assertTrue(HRegionFileSystem.REGION_INFO_FILE + " should be present in the region dir",<a name="line.4182"></a>
+<span class="sourceLineNo">4183</span>        fs.exists(regionInfoFile));<a name="line.4183"></a>
 <span class="sourceLineNo">4184</span><a name="line.4184"></a>
-<span class="sourceLineNo">4185</span>    // Verify that the .regioninfo file is still there<a name="line.4185"></a>
-<span class="sourceLineNo">4186</span>    assertTrue(HRegionFileSystem.REGION_INFO_FILE + " should be present in the region dir",<a name="line.4186"></a>
-<span class="sourceLineNo">4187</span>        fs.exists(new Path(regionDir, HRegionFileSystem.REGION_INFO_FILE)));<a name="line.4187"></a>
-<span class="sourceLineNo">4188</span><a name="line.4188"></a>
-<span class="sourceLineNo">4189</span>    region = null;<a name="line.4189"></a>
-<span class="sourceLineNo">4190</span>  }<a name="line.4190"></a>
-<span class="sourceLineNo">4191</span><a name="line.4191"></a>
-<span class="sourceLineNo">4192</span>  /**<a name="line.4192"></a>
-<span class="sourceLineNo">4193</span>   * TestCase for increment<a name="line.4193"></a>
-<span class="sourceLineNo">4194</span>   */<a name="line.4194"></a>
-<span class="sourceLineNo">4195</span>  private static class Incrementer implements Runnable {<a name="line.4195"></a>
-<span class="sourceLineNo">4196</span>    private HRegion region;<a name="line.4196"></a>
-<span class="sourceLineNo">4197</span>    private final static byte[] incRow = Bytes.toBytes("incRow");<a name="line.4197"></a>
-<span class="sourceLineNo">4198</span>    private final static byte[] family = Bytes.toBytes("family");<a name="line.4198"></a>
-<span class="sourceLineNo">4199</span>    private final static byte[] qualifier = Bytes.toBytes("qualifier");<a name="line.4199"></a>
-<span class="sourceLineNo">4200</span>    private final static long ONE = 1L;<a name="line.4200"></a>
-<span class="sourceLineNo">4201</span>    private int incCounter;<a name="line.4201"></a>
-<span class="sourceLineNo">4202</span><a name="line.4202"></a>
-<span class="sourceLineNo">4203</span>    public Incrementer(HRegion region, int incCounter) {<a name="line.4203"></a>
-<span class="sourceLineNo">4204</span>      this.region = region;<a name="line.4204"></a>
-<span class="sourceLineNo">4205</span>      this.incCounter = incCounter;<a name="line.4205"></a>
-<span class="sourceLineNo">4206</span>    }<a name="line.4206"></a>
-<span class="sourceLineNo">4207</span><a name="line.4207"></a>
-<span class="sourceLineNo">4208</span>    @Override<a name="line.4208"></a>
-<span class="sourceLineNo">4209</span>    public void run() {<a name="line.4209"></a>
-<span class="sourceLineNo">4210</span>      int count = 0;<a name="line.4210"></a>
-<span class="sourceLineNo">4211</span>      while (count &lt; incCounter) {<a name="line.4211"></a>
-<span class="sourceLineNo">4212</span>        Increment inc = new Increment(incRow);<a name="line.4212"></a>
-<span class="sourceLineNo">4213</span>        inc.addColumn(family, qualifier, ONE);<a name="line.4213"></a>
-<span class="sourceLineNo">4214</span>        count++;<a name="line.4214"></a>
-<span class="sourceLineNo">4215</span>        try {<a name="line.4215"></a>
-<span class="sourceLineNo">4216</span>          region.increment(inc);<a name="line.4216"></a>
-<span class="sourceLineNo">4217</span>        } catch (IOException e) {<a name="line.4217"></a>
-<span class="sourceLineNo">4218</span>          LOG.info("Count=" + count + ", " + e);<a name="line.4218"></a>
-<span class="sourceLineNo">4219</span>          break;<a name="line.4219"></a>
-<span class="sourceLineNo">4220</span>        }<a name="line.4220"></a>
-<span class="sourceLineNo">4221</span>      }<a name="line.4221"></a>
-<span class="sourceLineNo">4222</span>    }<a name="line.4222"></a>
-<span class="sourceLineNo">4223</span>  }<a name="line.4223"></a>
-<span class="sourceLineNo">4224</span><a name="line.4224"></a>
-<span class="sourceLineNo">4225</span>  /**<a name="line.4225"></a>
-<span class="sourceLineNo">4226</span>   * Test case to check increment function with memstore flushing<a name="line.4226"></a>
-<span class="sourceLineNo">4227</span>   * @throws Exception<a name="line.4227"></a>
-<span class="sourceLineNo">4228</span>   */<a name="line.4228"></a>
-<span class="sourceLineNo">4229</span>  @Test<a name="line.4229"></a>
-<span class="sourceLineNo">4230</span>  public void testParallelIncrementWithMemStoreFlush() throws Exception {<a name="line.4230"></a>
-<span class="sourceLineNo">4231</span>    byte[] family = Incrementer.family;<a name="line.4231"></a>
-<span class="sourceLineNo">4232</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.4232"></a>
-<span class="sourceLineNo">4233</span>    final HRegion region = this.region;<a name="line.4233"></a>
-<span class="sourceLineNo">4234</span>    final AtomicBoolean incrementDone = new AtomicBoolean(false);<a name="line.4234"></a>
-<span class="sourceLineNo">4235</span>    Runnable flusher = new Runnable() {<a name="line.4235"></a>
-<span class="sourceLineNo">4236</span>      @Override<a name="line.4236"></a>
-<span class="sourceLineNo">4237</span>      public void run() {<a name="line.4237"></a>
-<span class="sourceLineNo">4238</span>        while (!incrementDone.get()) {<a name="line.4238"></a>
-<span class="sourceLineNo">4239</span>          try {<a name="line.4239"></a>
-<span class="sourceLineNo">4240</span>            region.flush(true);<a name="line.4240"></a>
-<span class="sourceLineNo">4241</span>          } catch (Exception e) {<a name="line.4241"></a>
-<span class="sourceLineNo">4242</span>            e.printStackTrace();<a name="line.4242"></a>
-<span class="sourceLineNo">4243</span>          }<a name="line.4243"></a>
-<span class="sourceLineNo">4244</span>        }<a name="line.4244"></a>
-<span class="sourceLineNo">4245</span>      }<a name="line.4245"></a>
-<span class="sourceLineNo">4246</span>    };<a name="line.4246"></a>
-<span class="sourceLineNo">4247</span><a name="line.4247"></a>
-<span class="sourceLineNo">4248</span>    // after all increment finished, the row will increment to 20*100 = 2000<a name="line.4248"></a>
-<span class="sourceLineNo">4249</span>    int threadNum = 20;<a name="line.4249"></a>
-<span class="sourceLineNo">4250</span>    int incCounter = 100;<a name="line.4250"></a>
-<span class="sourceLineNo">4251</span>    long expected = (long) threadNum * incCounter;<a name="line.4251"></a>
-<span class="sourceLineNo">4252</span>    Thread[] incrementers = new Thread[threadNum];<a name="line.4252"></a>
-<span class="sourceLineNo">4253</span>    Thread flushThread = new Thread(flusher);<a name="line.4253"></a>
-<span class="sourceLineNo">4254</span>    for (int i = 0; i &lt; threadNum; i++) {<a name="line.4254"></a>
-<span class="sourceLineNo">4255</span>      incrementers[i] = new Thread(new Incrementer(this.region, incCounter));<a name="line.4255"></a>
-<span class="sourceLineNo">4256</span>      incrementers[i].start();<a name="line.4256"></a>
-<span class="sourceLineNo">4257</span>    }<a name="line.4257"></a>
-<span class="sourceLineNo">4258</span>    flushThread.start();<a name="line.4258"></a>
-<span class="sourceLineNo">4259</span>    for (int i = 0; i &lt; threadNum; i++) {<a name="line.4259"></a>
-<span class="sourceLineNo">4260</span>      incrementers[i].join();<a name="line.4260"></a>
-<span class="sourceLineNo">4261</span>    }<a name="line.4261"></a>
-<span class="sourceLineNo">4262</span><a name="line.4262"></a>
-<span class="sourceLineNo">4263</span>    incrementDone.set(true);<a name="line.4263"></a>
-<span class="sourceLineNo">4264</span>    flushThread.join();<a name="line.4264"></a>
-<span class="sourceLineNo">4265</span><a name="line.4265"></a>
-<span class="sourceLineNo">4266</span>    Get get = new Get(Incrementer.incRow);<a name="line.4266"></a>
-<span class="sourceLineNo">4267</span>    get.addColumn(Incrementer.family, Incrementer.qualifier);<a name="line.4267"></a>
-<span class="sourceLineNo">4268</span>    get.readVersions(1);<a name="line.4268"></a>
-<span class="sourceLineNo">4269</span>    Result res = this.region.get(get);<a name="line.4269"></a>
-<span class="sourceLineNo">4270</span>    List&lt;Cell&gt; kvs = res.getColumnCells(Incrementer.family, Incrementer.qualifier);<a name="line.4270"></a>
-<span class="sourceLineNo">4271</span><a name="line.4271"></a>
-<span class="sourceLineNo">4272</span>    // we just got the latest version<a name="line.4272"></a>
-<span class="sourceLineNo">4273</span>    assertEquals(1, kvs.size());<a name="line.4273"></a>
-<span class="sourceLineNo">4274</span>    Cell kv = kvs.get(0);<a name="line.4274"></a>
-<span class="sourceLineNo">4275</span>    assertEquals(expected, Bytes.toLong(kv.getValueArray(), kv.getValueOffset()));<a name="line.4275"></a>
-<span class="sourceLineNo">4276</span>  }<a name="line.4276"></a>
-<span class="sourceLineNo">4277</span><a name="line.4277"></a>
-<span class="sourceLineNo">4278</span>  /**<a name="line.4278"></a>
-<span class="sourceLineNo">4279</span>   * TestCase for append<a name="line.4279"></a>
-<span class="sourceLineNo">4280</span>   */<a name="line.4280"></a>
-<span class="sourceLineNo">4281</span>  private static class Appender implements Runnable {<a name="line.4281"></a>
-<span class="sourceLineNo">4282</span>    private HRegion region;<a name="line.4282"></a>
-<span class="sourceLineNo">4283</span>    private final static byte[] appendRow = Bytes.toBytes("appendRow");<a name="line.4283"></a>
-<span class="sourceLineNo">4284</span>    private final static byte[] family = Bytes.toBytes("family");<a name="line.4284"></a>
-<span class="sourceLineNo">4285</span>    private final static byte[] qualifier = Bytes.toBytes("qualifier");<a name="line.4285"></a>
-<span class="sourceLineNo">4286</span>    private final static byte[] CHAR = Bytes.toBytes("a");<a name="line.4286"></a>
-<span class="sourceLineNo">4287</span>    private int appendCounter;<a name="line.4287"></a>
-<span class="sourceLineNo">4288</span><a name="line.4288"></a>
-<span class="sourceLineNo">4289</span>    public Appender(HRegion region, int appendCounter) {<a name="line.4289"></a>
-<span class="sourceLineNo">4290</span>      this.region = region;<a name="line.4290"></a>
-<span class="sourceLineNo">4291</span>      this.appendCounter = appendCounter;<a name="line.4291"></a>
-<span class="sourceLineNo">4292</span>    }<a name="line.4292"></a>
-<span class="sourceLineNo">4293</span><a name="line.4293"></a>
-<span class="sourceLineNo">4294</span>    @Override<a name="line.4294"></a>
-<span class="sourceLineNo">4295</span>    public void run() {<a name="line.4295"></a>
-<span class="sourceLineNo">4296</span>      int count = 0;<a name="line.4296"></a>
-<span class="sourceLineNo">4297</span>      while (count &lt; appendCounter) {<a name="line.4297"></a>
-<span class="sourceLineNo">4298</span>        Append app = new Append(appendRow);<a name="line.4298"></a>
-<span class="sourceLineNo">4299</span>        app.addColumn(family, qualifier, CHAR);<a name="line.4299"></a>
-<span class="sourceLineNo">4300</span>        count++;<a name="line.4300"></a>
-<span class="sourceLineNo">4301</span>        try {<a name="line.4301"></a>
-<span class="sourceLineNo">4302</span>          region.append(app);<a name="line.4302"></a>
-<span class="sourceLineNo">4303</span>        } catch (IOException e) {<a name="line.4303"></a>
-<span class="sourceLineNo">4304</span>          LOG.info("Count=" + count + ", max=" + appendCounter + ", " + e);<a name="line.4304"></a>
-<span class="sourceLineNo">4305</span>          break;<a name="line.4305"></a>
-<span class="sourceLineNo">4306</span>        }<a name="line.4306"></a>
-<span class="sourceLineNo">4307</span>      }<a name="line.4307"></a>
-<span class="sourceLineNo">4308</span>    }<a name="line.4308"></a>
-<span class="sourceLineNo">4309</span>  }<a name="line.4309"></a>
-<span class="sourceLineNo">4310</span><a name="line.4310"></a>
-<span class="sourceLineNo">4311</span>  /**<a name="line.4311"></a>
-<span class="sourceLineNo">4312</span>   * Test case to check append function with memstore flushing<a name="line.4312"></a>
-<span class="sourceLineNo">4313</span>   * @throws Exception<a name="line.4313"></a>
-<span class="sourceLineNo">4314</span>   */<a name="line.4314"></a>
-<span class="sourceLineNo">4315</span>  @Test<a name="line.4315"></a>
-<span class="sourceLineNo">4316</span>  public void testParallelAppendWithMemStoreFlush() throws Exception {<a name="line.4316"></a>
-<span class="sourceLineNo">4317</span>    byte[] family = Appender.family;<a name="line.4317"></a>
-<span class="sourceLineNo">4318</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.4318"></a>
-<span class="sourceLineNo">4319</span>    final HRegion region = this.region;<a name="line.4319"></a>
-<span class="sourceLineNo">4320</span>    final AtomicBoolean appendDone = new AtomicBoolean(false);<a name="line.4320"></a>
-<span class="sourceLineNo">4321</span>    Runnable flusher = new Runnable() {<a name="line.4321"></a>
-<span class="sourceLineNo">4322</span>      @Override<a name="line.4322"></a>
-<span class="sourceLineNo">4323</span>      public void run() {<a name="line.4323"></a>
-<span class="sourceLineNo">4324</span>        while (!appendDone.get()) {<a name="line.4324"></a>
-<span class="sourceLineNo">4325</span>          try {<a name="line.4325"></a>
-<span class="sourceLineNo">4326</span>            region.flush(true);<a name="line.4326"></a>
-<span class="sourceLineNo">4327</span>          } catch (Exception e) {<a name="line.4327"></a>
-<span class="sourceLineNo">4328</span>            e.printStackTrace();<a name="line.4328"></a>
-<span class="sourceLineNo">4329</span>          }<a name="line.4329"></a>
-<span class="sourceLineNo">4330</span>        }<a name="line.4330"></a>
-<span class="sourceLineNo">4331</span>      }<a name="line.4331"></a>
-<span class="sourceLineNo">4332</span>    };<a name="line.4332"></a>
-<span class="sourceLineNo">4333</span><a name="line.4333"></a>
-<span class="sourceLineNo">4334</span>    // After all append finished, the value will append to threadNum *<a name="line.4334"></a>
-<span class="sourceLineNo">4335</span>    // appendCounter Appender.CHAR<a name="line.4335"></a>
-<span class="sourceLineNo">4336</span>    int threadNum = 20;<a name="line.4336"></a>
-<span class="sourceLineNo">4337</span>    int appendCounter = 100;<a name="line.4337"></a>
-<span class="sourceLineNo">4338</span>    byte[] expected = new byte[threadNum * appendCounter];<a name="line.4338"></a>
-<span class="sourceLineNo">4339</span>    for (int i = 0; i &lt; threadNum * appendCounter; i++) {<a name="line.4339"></a>
-<span class="sourceLineNo">4340</span>      System.arraycopy(Appender.CHAR, 0, expected, i, 1);<a name="line.4340"></a>
-<span class="sourceLineNo">4341</span>    }<a name="line.4341"></a>
-<span class="sourceLineNo">4342</span>    Thread[] appenders = new Thread[threadNum];<a name="line.4342"></a>
-<span class="sourceLineNo">4343</span>    Thread flushThread = new Thread(flusher);<a name="line.4343"></a>
-<span class="sourceLineNo">4344</span>    for (int i = 0; i &lt; threadNum; i++) {<a name="line.4344"></a>
-<span class="sourceLineNo">4345</span>      appenders[i] = new Thread(new Appender(this.region, appendCounter));<a name="line.4345"></a>
-<span class="sourceLineNo">4346</span>      appenders[i].start();<a name="line.4346"></a>
-<span class="sourceLineNo">4347</span>    }<a name="line.4347"></a>
-<span class="sourceLineNo">4348</span>    flushThread.start();<a name="line.4348"></a>
-<span class="sourceLineNo">4349</span>    for (int i = 0; i &lt; threadNum; i++) {<a name="line.4349"></a>
-<span class="sourceLineNo">4350</span>      appenders[i].join();<a name="line.4350"></a>
+<span class="sourceLineNo">4185</span>    // Remove the .regioninfo file and verify is recreated on region open<a name="line.4185"></a>
+<span class="sourceLineNo">4186</span>    fs.delete(regionInfoFile, true);<a name="line.4186"></a>
+<span class="sourceLineNo">4187</span>    assertFalse(HRegionFileSystem.REGION_INFO_FILE + " should be removed from the region dir",<a name="line.4187"></a>
+<span class="sourceLineNo">4188</span>        fs.exists(regionInfoFile));<a name="line.4188"></a>
+<span class="sourceLineNo">4189</span><a name="line.4189"></a>
+<span class="sourceLineNo">4190</span>    region = HRegion.openHRegion(rootDir, hri, htd, null, CONF);<a name="line.4190"></a>
+<span class="sourceLineNo">4191</span>//    region = TEST_UTIL.openHRegion(hri, htd);<a name="line.4191"></a>
+<span class="sourceLineNo">4192</span>    assertEquals(regionDir, region.getRegionFileSystem().getRegionDir());<a name="line.4192"></a>
+<span class="sourceLineNo">4193</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.4193"></a>
+<span class="sourceLineNo">4194</span><a name="line.4194"></a>
+<span class="sourceLineNo">4195</span>    // Verify that the .regioninfo file is still there<a name="line.4195"></a>
+<span class="sourceLineNo">4196</span>    assertTrue(HRegionFileSystem.REGION_INFO_FILE + " should be present in the region dir",<a name="line.4196"></a>
+<span class="sourceLineNo">4197</span>        fs.exists(new Path(regionDir, HRegionFileSystem.REGION_INFO_FILE)));<a name="line.4197"></a>
+<span class="sourceLineNo">4198</span><a name="line.4198"></a>
+<span class="sourceLineNo">4199</span>    region = null;<a name="line.4199"></a>
+<span class="sourceLineNo">4200</span>  }<a name="line.4200"></a>
+<span class="sourceLineNo">4201</span><a name="line.4201"></a>
+<span class="sourceLineNo">4202</span>  /**<a name="line.4202"></a>
+<span class="sourceLineNo">4203</span>   * TestCase for increment<a name="line.4203"></a>
+<span class="sourceLineNo">4204</span>   */<a name="line.4204"></a>
+<span class="sourceLineNo">4205</span>  private static class Incrementer implements Runnable {<a name="line.4205"></a>
+<span class="sourceLineNo">4206</span>    private HRegion region;<a name="line.4206"></a>
+<span class="sourceLineNo">4207</span>    private final static byte[] incRow = Bytes.toBytes("incRow");<a name="line.4207"></a>
+<span class="sourceLineNo">4208</span>    private final static byte[] family = Bytes.toBytes("family");<a name="line.4208"></a>
+<span class="sourceLineNo">4209</span>    private final static byte[] qualifier = Bytes.toBytes("qualifier");<a name="line.4209"></a>
+<span class="sourceLineNo">4210</span>    private final static long ONE = 1L;<a name="line.4210"></a>
+<span class="sourceLineNo">4211</span>    private int incCounter;<a name="line.4211"></a>
+<span class="sourceLineNo">4212</span><a name="line.4212"></a>
+<span class="sourceLineNo">4213</span>    public Incrementer(HRegion region, int incCounter) {<a name="line.4213"></a>
+<span class="sourceLineNo">4214</span>      this.region = region;<a name="line.4214"></a>
+<span class="sourceLineNo">4215</span>      this.incCounter = incCounter;<a name="line.4215"></a>
+<span class="sourceLineNo">4216</span>    }<a name="line.4216"></a>
+<span class="sourceLineNo">4217</span><a name="line.4217"></a>
+<span class="sourceLineNo">4218</span>    @Override<a name="line.4218"></a>
+<span class="sourceLineNo">4219</span>    public void run() {<a name="line.4219"></a>
+<span class="sourceLineNo">4220</span>      int count = 0;<a name="line.4220"></a>
+<span class="sourceLineNo">4221</span>      while (count &lt; incCounter) {<a name="line.4221"></a>
+<span class="sourceLineNo">4222</span>        Increment inc = new Increment(incRow);<a name="line.4222"></a>
+<span class="sourceLineNo">4223</span>        inc.addColumn(family, qualifier, ONE);<a name="line.4223"></a>
+<span class="sourceLineNo">4224</span>        count++;<a name="line.4224"></a>
+<span class="sourceLineNo">4225</span>        try {<a name="line.4225"></a>
+<span class="sourceLineNo">4226</span>          region.increment(inc);<a name="line.4226"></a>
+<span class="sourceLineNo">4227</span>        } catch (IOException e) {<a name="line.4227"></a>
+<span class="sourceLineNo">4228</span>          LOG.info("Count=" + count + ", " + e);<a name="line.4228"></a>
+<span class="sourceLineNo">4229</span>          break;<a name="line.4229"></a>
+<span class="sourceLineNo">4230</span>        }<a name="line.4230"></a>
+<span class="sourceLineNo">4231</span>      }<a name="line.4231"></a>
+<span class="sourceLineNo">4232</span>    }<a name="line.4232"></a>
+<span class="sourceLineNo">4233</span>  }<a name="line.4233"></a>
+<span class="sourceLineNo">4234</span><a name="line.4234"></a>
+<span class="sourceLineNo">4235</span>  /**<a name="line.4235"></a>
+<span class="sourceLineNo">4236</span>   * Test case to check increment function with memstore flushing<a name="line.4236"></a>
+<span class="sourceLineNo">4237</span>   * @throws Exception<a name="line.4237"></a>
+<span class="sourceLineNo">4238</span>   */<a name="line.4238"></a>
+<span class="sourceLineNo">4239</span>  @Test<a name="line.4239"></a>
+<span class="sourceLineNo">4240</span>  public void testParallelIncrementWithMemStoreFlush() throws Exception {<a name="line.4240"></a>
+<span class="sourceLineNo">4241</span>    byte[] family = Incrementer.family;<a name="line.4241"></a>
+<span class="sourceLineNo">4242</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.4242"></a>
+<span class="sourceLineNo">4243</span>    final HRegion region = this.region;<a name="line.4243"></a>
+<span class="sourceLineNo">4244</span>    final AtomicBoolean incrementDone = new AtomicBoolean(false);<a name="line.4244"></a>
+<span class="sourceLineNo">4245</span>    Runnable flusher = new Runnable() {<a name="line.4245"></a>
+<span class="sourceLineNo">4246</span>      @Override<a name="line.4246"></a>
+<span class="sourceLineNo">4247</span>      public void run() {<a name="line.4247"></a>
+<span class="sourceLineNo">4248</span>        while (!incrementDone.get()) {<a name="line.4248"></a>
+<span class="sourceLineNo">4249</span>          try {<a name="line.4249"></a>
+<span class="sourceLineNo">4250</span>            region.flush(true);<a name="line.4250"></a>
+<span class="sourceLineNo">4251</span>          } catch (Exception e) {<a name="line.4251"></a>
+<span class="sourceLineNo">4252</span>            e.printStackTrace();<a name="line.4252"></a>
+<span class="sourceLineNo">4253</span>          }<a name="line.4253"></a>
+<span class="sourceLineNo">4254</span>        }<a name="line.4254"></a>
+<span class="sourceLineNo">4255</span>      }<a name="line.4255"></a>
+<span class="sourceLineNo">4256</span>    };<a name="line.4256"></a>
+<span class="sourceLineNo">4257</span><a name="line.4257"></a>
+<span class="sourceLineNo">4258</span>    // after all increment finished, the row will increment to 20*100 = 2000<a name="line.4258"></a>
+<span class="sourceLineNo">4259</span>    int threadNum = 20;<a name="line.4259"></a>
+<span class="sourceLineNo">4260</span>    int incCounter = 100;<a name="line.4260"></a>
+<span class="sourceLineNo">4261</span>    long expected = (long) threadNum * incCounter;<a name="line.4261"></a>
+<span class="sourceLineNo">4262</span>    Thread[] incrementers = new Thread[threadNum];<a name="line.4262"></a>
+<span class="sourceLineNo">4263</span>    Thread flushThread = new Thread(flusher);<a name="line.4263"></a>
+<span class="sourceLineNo">4264</span>    for (int i = 0; i &lt; threadNum; i++) {<a name="line.4264"></a>
+<span class="sourceLineNo">4265</span>      incrementers[i] = new Thread(new Incrementer(this.region, incCounter));<a name="line.4265"></a>
+<span class="sourceLineNo">4266</span>      incrementers[i].start();<a name="line.4266"></a>
+<span class="sourceLineNo">4267</span>    }<a name="line.4267"></a>
+<span class="sourceLineNo">4268</span>    flushThread.start();<a name="line.4268"></a>
+<span class="sourceLineNo">4269</span>    for (int i = 0; i &lt; threadNum; i++) {<a name="line.4269"></a>
+<span class="sourceLineNo">4270</span>      incrementers[i].join();<a name="line.4270"></a>
+<span class="sourceLineNo">4271</span>    }<a name="line.4271"></a>
+<span class="sourceLineNo">4272</span><a name="line.4272"></a>
+<span class="sourceLineNo">4273</span>    incrementDone.set(true);<a name="line.4273"></a>
+<span class="sourceLineNo">4274</span>    flushThread.join();<a name="line.4274"></a>
+<span class="sourceLineNo">4275</span><a name="line.4275"></a>
+<span class="sourceLineNo">4276</span>    Get get = new Get(Incrementer.incRow);<a name="line.4276"></a>
+<span class="sourceLineNo">4277</span>    get.addColumn(Incrementer.family, Incrementer.qualifier);<a name="line.4277"></a>
+<span class="sourceLineNo">4278</span>    get.readVersions(1);<a name="line.4278"></a>
+<span class="sourceLineNo">4279</span>    Result res = this.region.get(get);<a name="line.4279"></a>
+<span class="sourceLineNo">4280</span>    List&lt;Cell&gt; kvs = res.getColumnCells(Incrementer.family, Incrementer.qualifier);<a name="line.4280"></a>
+<span class="sourceLineNo">4281</span><a name="line.4281"></a>
+<span class="sourceLineNo">4282</span>    // we just got the latest version<a name="line.4282"></a>
+<span class="sourceLineNo">4283</span>    assertEquals(1, kvs.size());<a name="line.4283"></a>
+<span class="sourceLineNo">4284</span>    Cell kv = kvs.get(0);<a name="line.4284"></a>
+<span class="sourceLineNo">4285</span>    assertEquals(expected, Bytes.toLong(kv.getValueArray(), kv.getValueOffset()));<a name="line.4285"></a>
+<span class="sourceLineNo">4286</span>  }<a name="line.4286"></a>
+<span class="sourceLineNo">4287</span><a name="line.4287"></a>
+<span class="sourceLineNo">4288</span>  /**<a name="line.4288"></a>
+<span class="sourceLineNo">4289</span>   * TestCase for append<a name="line.4289"></a>
+<span class="sourceLineNo">4290</span>   */<a name="line.4290"></a>
+<span class="sourceLineNo">4291</span>  private static class Appender implements Runnable {<a name="line.4291"></a>
+<span class="sourceLineNo">4292</span>    private HRegion region;<a name="line.4292"></a>
+<span class="sourceLineNo">4293</span>    private final static byte[] appendRow = Bytes.toBytes("appendRow");<a name="line.4293"></a>
+<span class="sourceLineNo">4294</span>    private final static byte[] family = Bytes.toBytes("family");<a name="line.4294"></a>
+<span class="sourceLineNo">4295</span>    private final static byte[] qualifier = Bytes.toBytes("qualifier");<a name="line.4295"></a>
+<span class="sourceLineNo">4296</span>    private final static byte[] CHAR = Bytes.toBytes("a");<a name="line.4296"></a>
+<span class="sourceLineNo">4297</span>    private int appendCounter;<a name="line.4297"></a>
+<span class="sourceLineNo">4298</span><a name="line.4298"></a>
+<span class="sourceLineNo">4299</span>    public Appender(HRegion region, int appendCounter) {<a name="line.4299"></a>
+<span class="sourceLineNo">4300</span>      this.region = region;<a name="line.4300"></a>
+<span class="sourceLineNo">4301</span>      this.appendCounter = appendCounter;<a name="line.4301"></a>
+<span class="sourceLineNo">4302</span>    }<a name="line.4302"></a>
+<span class="sourceLineNo">4303</span><a name="line.4303"></a>
+<span class="sourceLineNo">4304</span>    @Override<a name="line.4304"></a>
+<span class="sourceLineNo">4305</span>    public void run() {<a name="line.4305"></a>
+<span class="sourceLineNo">4306</span>      int count = 0;<a name="line.4306"></a>
+<span class="sourceLineNo">4307</span>      while (count &lt; appendCounter) {<a name="line.4307"></a>
+<span class="sourceLineNo">4308</span>        Append app = new Append(appendRow);<a name="line.4308"></a>
+<span class="sourceLineNo">4309</span>        app.addColumn(family, qualifier, CHAR);<a name="line.4309"></a>
+<span class="sourceLineNo">4310</span>        count++;<a name="line.4310"></a>
+<span class="sourceLineNo">4311</span>        try {<a name="line.4311"></a>
+<span class="sourceLineNo">4312</span>          region.append(app);<a name="line.4312"></a>
+<span class="sourceLineNo">4313</span>        } catch (IOException e) {<a name="line.4313"></a>
+<span class="sourceLineNo">4314</span>          LOG.info("Count=" + count + ", max=" + appendCounter + ", " + e);<a name="line.4314"></a>
+<span class="sourceLineNo">4315</span>          break;<a name="line.4315"></a>
+<span class="sourceLineNo">4316</span>        }<a name="line.4316"></a>
+<span class="sourceLineNo">4317</span>      }<a name="line.4317"></a>
+<span class="sourceLineNo">4318</span>    }<a name="line.4318"></a>
+<span class="sourceLineNo">4319</span>  }<a name="line.4319"></a>
+<span class="sourceLineNo">4320</span><a name="line.4320"></a>
+<span class="sourceLineNo">4321</span>  /**<a name="line.4321"></a>
+<span class="sourceLineNo">4322</span>   * Test case to check append function with memstore flushing<a name="line.4322"></a>
+<span class="sourceLineNo">4323</span>   * @throws Exception<a name="line.4323"></a>
+<span class="sourceLineNo">4324</span>   */<a name="line.4324"></a>
+<span class="sourceLineNo">4325</span>  @Test<a name="line.4325"></a>
+<span class="sourceLineNo">4326</span>  public void testParallelAppendWithMemStoreFlush() throws Exception {<a name="line.4326"></a>
+<span class="sourceLineNo">4327</span>    byte[] family = Appender.family;<a name="line.4327"></a>
+<span class="sourceLineNo">4328</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.4328"></a>
+<span class="sourceLineNo">4329</span>    final HRegion region = this.region;<a name="line.4329"></a>
+<span class="sourceLineNo">4330</span>    final AtomicBoolean appendDone = new AtomicBoolean(false);<a name="line.4330"></a>
+<span class="sourceLineNo">4331</span>    Runnable flusher = new Runnable() {<a name="line.4331"></a>
+<span class="sourceLineNo">4332</span>      @Override<a name="line.4332"></a>
+<span class="sourceLineNo">4333</span>      public void run() {<a name="line.4333"></a>
+<span class="sourceLineNo">4334</span>        while (!appendDone.get()) {<a name="line.4334"></a>
+<span class="sourceLineNo">4335</span>          try {<a name="line.4335"></a>
+<span class="sourceLineNo">4336</span>            region.flush(true);<a name="line.4336"></a>
+<span class="sourceLineNo">4337</span>          } catch (Exception e) {<a name="line.4337"></a>
+<span class="sourceLineNo">4338</span>            e.printStackTrace();<a name="line.4338"></a>
+<span class="sourceLineNo">4339</span>          }<a name="line.4339"></a>
+<span class="sourceLineNo">4340</span>        }<a name="line.4340"></a>
+<span class="sourceLineNo">4341</span>      }<a name="line.4341"></a>
+<span class="sourceLineNo">4342</span>    };<a name="line.4342"></a>
+<span class="sourceLineNo">4343</span><a name="line.4343"></a>
+<span class="sourceLineNo">4344</span>    // After all append finished, the value will append to threadNum *<a name="line.4344"></a>
+<span class="sourceLineNo">4345</span>    // appendCounter Appender.CHAR<a name="line.4345"></a>
+<span class="sourceLineNo">4346</span>    int threadNum = 20;<a name="line.4346"></a>
+<span class="sourceLineNo">4347</span>    int appendCounter = 100;<a name="line.4347"></a>
+<span class="sourceLineNo">4348</span>    byte[] expected = new byte[threadNum * appendCounter];<a name="line.4348"></a>
+<span class="sourceLineNo">4349</span>    for (int i = 0; i &lt; threadNum * appendCounter; i++) {<a name="line.4349"></a>
+<span class="sourceLineNo">4350</span>      System.arraycopy(Appender.CHAR, 0, expected, i, 1);<a name="line.4350"></a>
 <span class="sourceLineNo">4351</span>    }<a name="line.4351"></a>
-<span class="sourceLineNo">4352</span><a name="line.4352"></a>
-<span class="sourceLineNo">4353</span>    appendDone.set(true);<a name="line.4353"></a>
-<span class="sourceLineNo">4354</span>    flushThread.join();<a name="line.4354"></a>
-<span class="sourceLineNo">4355</span><a name="line.4355"></a>
-<span class="sourceLineNo">4356</span>    Get get = new Get(Appender.appendRow);<a name="line.4356"></a>
-<span class="sourceLineNo">4357</span>    get.addColumn(Appender.family, Appender.qualifier);<a name="line.4357"></a>
-<span class="sourceLineNo">4358</span>    get.readVersions(1);<a name="line.4358"></a>
-<span class="sourceLineNo">4359</span>    Result res = this.region.get(get);<a name="line.4359"></a>
-<span class="sourceLineNo">4360</span>    List&lt;Cell&gt; kvs = res.getColumnCells(Appender.family, Appender.qualifier);<a name="line.4360"></a>
-<span class="sourceLineNo">4361</span><a name="line.4361"></a>
-<span class="sourceLineNo">4362</span>    // we just got the latest version<a name="line.4362"></a>
-<span class="sourceLineNo">4363</span>    assertEquals(1, kvs.size());<a name="line.4363"></a>
-<span class="sourceLineNo">4364</span>    Cell kv = kvs.get(0);<a name="line.4364"></a>
-<span class="sourceLineNo">4365</span>    byte[] appendResult = new byte[kv.getValueLength()];<a name="line.4365"></a>
-<span class="sourceLineNo">4366</span>    System.arraycopy(kv.getValueArray(), kv.getValueOffset(), appendResult, 0, kv.getValueLength());<a name="line.4366"></a>
-<span class="sourceLineNo">4367</span>    assertArrayEquals(expected, appendResult);<a name="line.4367"></a>
-<span class="sourceLineNo">4368</span>  }<a name="line.4368"></a>
-<span class="sourceLineNo">4369</span><a name="line.4369"></a>
-<span class="sourceLineNo">4370</span>  /**<a name="line.4370"></a>
-<span class="sourceLineNo">4371</span>   * Test case to check put function with memstore flushing for same row, same ts<a name="line.4371"></a>
-<span class="sourceLineNo">4372</span>   * @throws Exception<a name="line.4372"></a>
-<span class="sourceLineNo">4373</span>   */<a name="line.4373"></a>
-<span class="sourceLineNo">4374</span>  @Test<a name="line.4374"></a>
-<span class="sourceLineNo">4375</span>  public void testPutWithMemStoreFlush() throws Exception {<a name="line.4375"></a>
-<span class="sourceLineNo">4376</span>    byte[] family = Bytes.toBytes("family");<a name="line.4376"></a>
-<span class="sourceLineNo">4377</span>    byte[] qualifier = Bytes.toBytes("qualifier");<a name="line.4377"></a>
-<span class="sourceLineNo">4378</span>    byte[] row = Bytes.toBytes("putRow");<a name="line.4378"></a>
-<span class="sourceLineNo">4379</span>    byte[] value = null;<a name="line.4379"></a>
-<span class="sourceLineNo">4380</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.4380"></a>
-<span class="sourceLineNo">4381</span>    Put put = null;<a name="line.4381"></a>
-<span class="sourceLineNo">4382</span>    Get get = null;<a name="line.4382"></a>
-<span class="sourceLineNo">4383</span>    List&lt;Cell&gt; kvs = null;<a name="line.4383"></a>
-<span class="sourceLineNo">4384</span>    Result res = null;<a name="line.4384"></a>
-<span class="sourceLineNo">4385</span><a name="line.4385"></a>
-<span class="sourceLineNo">4386</span>    put = new Put(row);<a name="line.4386"></a>
-<span class="sourceLineNo">4387</span>    value = Bytes.toBytes("value0");<a name="line.4387"></a>
-<span class="sourceLineNo">4388</span>    put.addColumn(family, qualifier, 1234567L, value);<a name="line.4388"></a>
-<span class="sourceLineNo">4389</span>    region.put(put);<a name="line.4389"></a>
-<span class="sourceLineNo">4390</span>    get = new Get(row);<a name="line.4390"></a>
-<span class="sourceLineNo">4391</span>    get.addColumn(family, qualifier);<a name="line.4391"></a>
-<span class="sourceLineNo">4392</span>    get.readAllVersions();<a name="line.4392"></a>
-<span class="sourceLineNo">4393</span>    res = this.region.get(get);<a name="line.4393"></a>
-<span class="sourceLineNo">4394</span>    kvs = res.getColumnCells(family, qualifier);<a name="line.4394"></a>
-<span class="sourceLineNo">4395</span>    assertEquals(1, kvs.size());<a name="line.4395"></a>
-<span class="sourceLineNo">4396</span>    assertArrayEquals(Bytes.toBytes("value0"), CellUtil.cloneValue(kvs.get(0)));<a name="line.4396"></a>
-<span class="sourceLineNo">4397</span><a name="line.4397"></a>
-<span class="sourceLineNo">4398</span>    region.flush(true);<a name="line.4398"></a>
-<span class="sourceLineNo">4399</span>    get = new Get(row);<a name="line.4399"></a>
-<span class="sourceLineNo">4400</span>    get.addColumn(family, qualifier);<a name="line.4400"></a>
-<span class="sourceLineNo">4401</span>    get.readAllVersions();<a name="line.4401"></a>
-<span class="sourceLineNo">4402</span>    res = this.region.get(get);<a name="line.4402"></a>
-<span class="sourceLineNo">4403</span>    kvs = res.getColumnCells(family, qualifier);<a name="line.4403"></a>
-<span class="sourceLineNo">4404</span>    assertEquals(1, kvs.size());<a name="line.4404"></a>
-<span class="sourceLineNo">4405</span>    assertArrayEquals(Bytes.toBytes("value0"), CellUtil.cloneValue(kvs.get(0)));<a name="line.4405"></a>
-<span class="sourceLineNo">4406</span><a name="line.4406"></a>
-<span class="sourceLineNo">4407</span>    put = new Put(row);<a name="line.4407"></a>
-<span class="sourceLineNo">4408</span>    value = Bytes.toBytes("value1");<a name="line.4408"></a>
-<span class="sourceLineNo">4409</span>    put.addColumn(family, qualifier, 1234567L, value);<a name="line.4409"></a>
-<span class="sourceLineNo">4410</span>    region.put(put);<a name="line.4410"></a>
-<span class="sourceLineNo">4411</span>    get = new Get(row);<a name="line.4411"></a>
-<span class="sourceLineNo">4412</span>    get.addColumn(family, qualifier);<a name="line.4412"></a>
-<span class="sourceLineNo">4413</span>    get.readAllVersions();<a name="line.4413"></a>
-<span class="sourceLineNo">4414</span>    res = this.region.get(get);<a name="line.4414"></a>
-<span class="sourceLineNo">4415</span>    kvs = res.getColumnCells(family, qualifier);<a name="line.4415"></a>
-<span class="sourceLineNo">4416</span>    assertEquals(1, kvs.size());<a name="line.4416"></a>
-<span class="sourceLineNo">4417</span>    assertArrayEquals(Bytes.toBytes("value1"), CellUtil.cloneValue(kvs.get(0)));<a name="line.4417"></a>
-<span class="sourceLineNo">4418</span><a name="line.4418"></a>
-<span class="sourceLineNo">4419</span>    region.flush(true);<a name="line.4419"></a>
-<span class="sourceLineNo">4420</span>    get = new Get(row);<a name="line.4420"></a>
-<span class="sourceLineNo">4421</span>    get.addColumn(family, qualifier);<a name="line.4421"></a>
-<span class="sourceLineNo">4422</span>    get.readAllVersions();<a name="line.4422"></a>
-<span class="sourceLineNo">4423</span>    res = this.region.get(get);<a name="line.4423"></a>
-<span class="sourceLineNo">4424</span>    kvs = res.getColumnCells(family, qualifier);<a name="line.4424"></a>
-<span class="sourceLineNo">4425</span>    assertEquals(1, kvs.size());<a name="line.4425"></a>
-<span class="sourceLineNo">4426</span>    assertArrayEquals(Bytes.toBytes("value1"), CellUtil.cloneValue(kvs.get(0)));<a name="line.4426"></a>
-<span class="sourceLineNo">4427</span>  }<a name="line.4427"></a>
+<span class="sourceLineNo">4352</span>    Thread[] appenders = new Thread[threadNum];<a name="line.4352"></a>
+<span class="sourceLineNo">4353</span>    Thread flushThread = new Thread(flusher);<a name="line.4353"></a>
+<span class="sourceLineNo">4354</span>    for (int i = 0; i &lt; threadNum; i++) {<a name="line.4354"></a>
+<span class="sourceLineNo">4355</span>      appenders[i] = new Thread(new Appender(this.region, appendCounter));<a name="line.4355"></a>
+<span class="sourceLineNo">4356</span>      appenders[i].start();<a name="line.4356"></a>
+<span class="sourceLineNo">4357</span>    }<a name="line.4357"></a>
+<span class="sourceLineNo">4358</span>    flushThread.start();<a name="line.4358"></a>
+<span class="sourceLineNo">4359</span>    for (int i = 0; i &lt; threadNum; i++) {<a name="line.4359"></a>
+<span class="sourceLineNo">4360</span>      appenders[i].join();<a name="line.4360"></a>
+<span class="sourceLineNo">4361</span>    }<a name="line.4361"></a>
+<span class="sourceLineNo">4362</span><a name="line.4362"></a>
+<span class="sourceLineNo">4363</span>    appendDone.set(true);<a name="line.4363"></a>
+<span class="sourceLineNo">4364</span>    flushThread.join();<a name="line.4364"></a>
+<span class="sourceLineNo">4365</span><a name="line.4365"></a>
+<span class="sourceLineNo">4366</span>    Get get = new Get(Appender.appendRow);<a name="line.4366"></a>
+<span class="sourceLineNo">4367</span>    get.addColumn(Appender.family, Appender.qualifier);<a name="line.4367"></a>
+<span class="sourceLineNo">4368</span>    get.readVersions(1);<a name="line.4368"></a>
+<span class="sourceLineNo">4369</span>    Result res = this.region.get(get);<a name="line.4369"></a>
+<span class="sourceLineNo">4370</span>    List&lt;Cell&gt; kvs = res.getColumnCells(Appender.family, Appender.qualifier);<a name="line.4370"></a>
+<span class="sourceLineNo">4371</span><a name="line.4371"></a>
+<span class="sourceLineNo">4372</span>    // we just got the latest version<a name="line.4372"></a>
+<span class="sourceLineNo">4373</span>    assertEquals(1, kvs.size());<a name="line.4373"></a>
+<span class="sourceLineNo">4374</span>    Cell kv = kvs.get(0);<a name="line.4374"></a>
+<span class="sourceLineNo">4375</span>    byte[] appendResult = new byte[kv.getValueLength()];<a name="line.4375"></a>
+<span class="sourceLineNo">4376</span>    System.arraycopy(kv.getValueArray(), kv.getValueOffset(), appendResult, 0, kv.getValueLength());<a name="line.4376"></a>
+<span class="sourceLineNo">4377</span>    assertArrayEquals(expected, appendResult);<a name="line.4377"></a>
+<span class="sourceLineNo">4378</span>  }<a name="line.4378"></a>
+<span class="sourceLineNo">4379</span><a name="line.4379"></a>
+<span class="sourceLineNo">4380</span>  /**<a name="line.4380"></a>
+<span class="sourceLineNo">4381</span>   * Test case to check put function with memstore flushing for same row, same ts<a name="line.4381"></a>
+<span class="sourceLineNo">4382</span>   * @throws Exception<a name="line.4382"></a>
+<span class="sourceLineNo">4383</span>   */<a name="line.4383"></a>
+<span class="sourceLineNo">4384</span>  @Test<a name="line.4384"></a>
+<span class="sourceLineNo">4385</span>  public void testPutWithMemStoreFlush() throws Exception {<a name="line.4385"></a>
+<span class="sourceLineNo">4386</span>    byte[] family = Bytes.toBytes("family");<a name="line.4386"></a>
+<span class="sourceLineNo">4387</span>    byte[] qualifier = Bytes.toBytes("qualifier");<a name="line.4387"></a>
+<span class="sourceLineNo">4388</span>    byte[] row = Bytes.toBytes("putRow");<a name="line.4388"></a>
+<span class="sourceLineNo">4389</span>    byte[] value = null;<a name="line.4389"></a>
+<span class="sourceLineNo">4390</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.4390"></a>
+<span class="sourceLineNo">4391</span>    Put put = null;<a name="line.4391"></a>
+<span class="sourceLineNo">4392</span>    Get get = null;<a name="line.4392"></a>
+<span class="sourceLineNo">4393</span>    List&lt;Cell&gt; kvs = null;<a name="line.4393"></a>
+<span class="sourceLineNo">4394</span>    Result res = null;<a name="line.4394"></a>
+<span class="sourceLineNo">4395</span><a name="line.4395"></a>
+<span class="sourceLineNo">4396</span>    put = new Put(row);<a name="line.4396"></a>
+<span class="sourceLineNo">4397</span>    value = Bytes.toBytes("value0");<a name="line.4397"></a>
+<span class="sourceLineNo">4398</span>    put.addColumn(family, qualifier, 1234567L, value);<a name="line.4398"></a>
+<span class="sourceLineNo">4399</span>    region.put(put);<a name="line.4399"></a>
+<span class="sourceLineNo">4400</span>    get = new Get(row);<a name="line.4400"></a>
+<span class="sourceLineNo">4401</span>    get.addColumn(family, qualifier);<a name="line.4401"></a>
+<span class="sourceLineNo">4402</span>    get.readAllVersions();<a name="line.4402"></a>
+<span class="sourceLineNo">4403</span>    res = this.region.get(get);<a name="line.4403"></a>
+<span class="sourceLineNo">4404</span>    kvs = res.getColumnCells(family, qualifier);<a name="line.4404"></a>
+<span class="sourceLineNo">4405</span>    assertEquals(1, kvs.size());<a name="line.4405"></a>
+<span class="sourceLineNo">4406</span>    assertArrayEquals(Bytes.toBytes("value0"), CellUtil.cloneValue(kvs.get(0)));<a name="line.4406"></a>
+<span class="sourceLineNo">4407</span><a name="line.4407"></a>
+<span class="sourceLineNo">4408</span>    region.flush(true);<a name="line.4408"></a>
+<span class="sourceLineNo">4409</span>    get = new Get(row);<a name="line.4409"></a>
+<span class="sourceLineNo">4410</span>    get.addColumn(family, qualifier);<a name="line.4410"></a>
+<span class="sourceLineNo">4411</span>    get.readAllVersions();<a name="line.4411"></a>
+<span class="sourceLineNo">4412</span>    res = this.region.get(get);<a name="line.4412"></a>
+<span class="sourceLineNo">4413</span>    kvs = res.getColumnCells(family, qualifier);<a name="line.4413"></a>
+<span class="sourceLineNo">4414</span>    assertEquals(1, kvs.size());<a name="line.4414"></a>
+<span class="sourceLineNo">4415</span>    assertArrayEquals(Bytes.toBytes("value0"), CellUtil.cloneValue(kvs.get(0)));<a name="line.4415"></a>
+<span class="sourceLineNo">4416</span><a name="line.4416"></a>
+<span class="sourceLineNo">4417</span>    put = new Put(row);<a name="line.4417"></a>
+<span class="sourceLineNo">4418</span>    value = Bytes.toBytes("value1");<a name="line.4418"></a>
+<span class="sourceLineNo">4419</span>    put.addColumn(family, qualifier, 1234567L, value);<a name="line.4419"></a>
+<span class="sourceLineNo">4420</span>    region.put(put);<a name="line.4420"></a>
+<span class="sourceLineNo">4421</span>    get = new Get(row);<a name="line.4421"></a>
+<span class="sourceLineNo">4422</span>    get.addColumn(family, qualifier);<a name="line.4422"></a>
+<span class="sourceLineNo">4423</span>    get.readAllVersions();<a name="line.4423"></a>
+<span class="sourceLineNo">4424</span>    res = this.region.get(get);<a name="line.4424"></a>
+<span class="sourceLineNo">4425</span>    kvs = res.getColumnCells(family, qualifier);<a name="line.4425"></a>
+<span class="sourceLineNo">4426</span>    assertEquals(1, kvs.size());<a name="line.4426"></a>
+<span class="sourceLineNo">4427</span>    assertArrayEquals(Bytes.toBytes("value1"), CellUtil.cloneValue(kvs.get(0)));<a name="line.4427"></a>
 <span class="sourceLineNo">4428</span><a name="line.4428"></a>
-<span class="sourceLineNo">4429</span>  @Test<a name="line.4429"></a>
-<span class="sourceLineNo">4430</span>  public void testDurability() throws Exception {<a name="line.4430"></a>
-<span class="sourceLineNo">4431</span>    // there are 5 x 5 cases:<a name="line.4431"></a>
-<span class="sourceLineNo">4432</span>    // table durability(SYNC,FSYNC,ASYC,SKIP,USE_DEFAULT) x mutation<a name="line.4432"></a>
-<span class="sourceLineNo">4433</span>    // durability(SYNC,FSYNC,ASYC,SKIP,USE_DEFAULT)<a name="line.4433"></a>
-<span class="sourceLineNo">4434</span><a name="line.4434"></a>
-<span class="sourceLineNo">4435</span>    // expected cases for append and sync wal<a name="line.4435"></a>
-<span class="sourceLineNo">4436</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4436"></a>
-<span class="sourceLineNo">4437</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4437"></a>
-<span class="sourceLineNo">4438</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.USE_DEFAULT, 0, true, true, false);<a name="line.4438"></a>
-<span class="sourceLineNo">4439</span><a name="line.4439"></a>
-<span class="sourceLineNo">4440</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4440"></a>
-<span class="sourceLineNo">4441</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4441"></a>
-<span class="sourceLineNo">4442</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.USE_DEFAULT, 0, true, true, false);<a name="line.4442"></a>
-<span class="sourceLineNo">4443</span><a name="line.4443"></a>
-<span class="sourceLineNo">4444</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4444"></a>
-<span class="sourceLineNo">4445</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4445"></a>
-<span class="sourceLineNo">4446</span><a name="line.4446"></a>
-<span class="sourceLineNo">4447</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4447"></a>
-<span class="sourceLineNo">4448</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4448"></a>
+<span class="sourceLineNo">4429</span>    region.flush(true);<a name="line.4429"></a>
+<span class="sourceLineNo">4430</span>    get = new Get(row);<a name="line.4430"></a>
+<span class="sourceLineNo">4431</span>    get.addColumn(family, qualifier);<a name="line.4431"></a>
+<span class="sourceLineNo">4432</span>    get.readAllVersions();<a name="line.4432"></a>
+<span class="sourceLineNo">4433</span>    res = this.region.get(get);<a name="line.4433"></a>
+<span class="sourceLineNo">4434</span>    kvs = res.getColumnCells(family, qualifier);<a name="line.4434"></a>
+<span class="sourceLineNo">4435</span>    assertEquals(1, kvs.size());<a name="line.4435"></a>
+<span class="sourceLineNo">4436</span>    assertArrayEquals(Bytes.toBytes("value1"), CellUtil.cloneValue(kvs.get(0)));<a name="line.4436"></a>
+<span class="sourceLineNo">4437</span>  }<a name="line.4437"></a>
+<span class="sourceLineNo">4438</span><a name="line.4438"></a>
+<span class="sourceLineNo">4439</span>  @Test<a name="line.4439"></a>
+<span class="sourceLineNo">4440</span>  public void testDurability() throws Exception {<a name="line.4440"></a>
+<span class="sourceLineNo">4441</span>    // there are 5 x 5 cases:<a name="line.4441"></a>
+<span class="sourceLineNo">4442</span>    // table durability(SYNC,FSYNC,ASYC,SKIP,USE_DEFAULT) x mutation<a name="line.4442"></a>
+<span class="sourceLineNo">4443</span>    // durability(SYNC,FSYNC,ASYC,SKIP,USE_DEFAULT)<a name="line.4443"></a>
+<span class="sourceLineNo">4444</span><a name="line.4444"></a>
+<span class="sourceLineNo">4445</span>    // expected cases for append and sync wal<a name="line.4445"></a>
+<span class="sourceLineNo">4446</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4446"></a>
+<span class="sourceLineNo">4447</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4447"></a>
+<span class="sourceLineNo">4448</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.USE_DEFAULT, 0, true, true, false);<a name="line.4448"></a>
 <span class="sourceLineNo">4449</span><a name="line.4449"></a>
-<span class="sourceLineNo">4450</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4450"></a>
-<span class="sourceLineNo">4451</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4451"></a>
-<span class="sourceLineNo">4452</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.USE_DEFAULT, 0, true, true, false);<a name="line.4452"></a>
+<span class="sourceLineNo">4450</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4450"></a>
+<span class="sourceLineNo">4451</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4451"></a>
+<span class="sourceLineNo">4452</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.USE_DEFAULT, 0, true, true, false);<a name="line.4452"></a>
 <span class="sourceLineNo">4453</span><a name="line.4453"></a>
-<span class="sourceLineNo">4454</span>    // expected cases for async wal<a name="line.4454"></a>
-<span class="sourceLineNo">4455</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4455"></a>
-<span class="sourceLineNo">4456</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4456"></a>
-<span class="sourceLineNo">4457</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4457"></a>
-<span class="sourceLineNo">4458</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4458"></a>
-<span class="sourceLineNo">4459</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4459"></a>
-<span class="sourceLineNo">4460</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.USE_DEFAULT, 0, true, false, false);<a name="line.4460"></a>
-<span class="sourceLineNo">4461</span><a name="line.4461"></a>
-<span class="sourceLineNo">4462</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4462"></a>
-<span class="sourceLineNo">4463</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4463"></a>
-<span class="sourceLineNo">4464</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4464"></a>
-<span class="sourceLineNo">4465</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4465"></a>
-<span class="sourceLineNo">4466</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4466"></a>
-<span class="sourceLineNo">4467</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.USE_DEFAULT, 5000, true, false, true);<a name="line.4467"></a>
-<span class="sourceLineNo">4468</span><a name="line.4468"></a>
-<span class="sourceLineNo">4469</span>    // expect skip wal cases<a name="line.4469"></a>
-<span class="sourceLineNo">4470</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4470"></a>
-<span class="sourceLineNo">4471</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4471"></a>
-<span class="sourceLineNo">4472</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4472"></a>
-<span class="sourceLineNo">4473</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4473"></a>
-<span class="sourceLineNo">4474</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4474"></a>
-<span class="sourceLineNo">4475</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.USE_DEFAULT, 0, false, false, false);<a name="line.4475"></a>
-<span class="sourceLineNo">4476</span><a name="line.4476"></a>
-<span class="sourceLineNo">4477</span>  }<a name="line.4477"></a>
+<span class="sourceLineNo">4454</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4454"></a>
+<span class="sourceLineNo">4455</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4455"></a>
+<span class="sourceLineNo">4456</span><a name="line.4456"></a>
+<span class="sourceLineNo">4457</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4457"></a>
+<span class="sourceLineNo">4458</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4458"></a>
+<span class="sourceLineNo">4459</span><a name="line.4459"></a>
+<span class="sourceLineNo">4460</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4460"></a>
+<span class="sourceLineNo">4461</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4461"></a>
+<span class="sourceLineNo">4462</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.USE_DEFAULT, 0, true, true, false);<a name="line.4462"></a>
+<span class="sourceLineNo">4463</span><a name="line.4463"></a>
+<span class="sourceLineNo">4464</span>    // expected cases for async wal<a name="line.4464"></a>
+<span class="sourceLineNo">4465</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4465"></a>
+<span class="sourceLineNo">4466</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4466"></a>
+<span class="sourceLineNo">4467</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4467"></a>
+<span class="sourceLineNo">4468</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4468"></a>
+<span class="sourceLineNo">4469</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4469"></a>
+<span class="sourceLineNo">4470</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.USE_DEFAULT, 0, true, false, false);<a name="line.4470"></a>
+<span class="sourceLineNo">4471</span><a name="line.4471"></a>
+<span class="sourceLineNo">4472</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4472"></a>
+<span class="sourceLineNo">4473</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4473"></a>
+<span class="sourceLineNo">4474</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4474"></a>
+<span class="sourceLineNo">4475</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4475"></a>
+<span class="sourceLineNo">4476</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4476"></a>
+<span class="sourceLineNo">4477</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.USE_DEFAULT, 5000, true, false, true);<a name="line.4477"></a>
 <span class="sourceLineNo">4478</span><a name="line.4478"></a>
-<span class="sourceLineNo">4479</span>  private void durabilityTest(String method, Durability tableDurability,<a name="line.4479"></a>
-<span class="sourceLineNo">4480</span>      Durability mutationDurability, long timeout, boolean expectAppend, final boolean expectSync,<a name="line.4480"></a>
-<span class="sourceLineNo">4481</span>      final boolean expectSyncFromLogSyncer) throws Exception {<a name="line.4481"></a>
-<span class="sourceLineNo">4482</span>    Configuration conf = HBaseConfiguration.create(CONF);<a name="line.4482"></a>
-<span class="sourceLineNo">4483</span>    method = method + "_" + tableDurability.name() + "_" + mutationDurability.name();<a name="line.4483"></a>
-<span class="sourceLineNo">4484</span>    byte[] family = Bytes.toBytes("family");<a name="line.4484"></a>
-<span class="sourceLineNo">4485</span>    Path logDir = new Path(new Path(dir + method), "log");<a name="line.4485"></a>
-<span class="sourceLineNo">4486</span>    final Configuration walConf = new Configuration(conf);<a name="line.4486"></a>
-<span class="sourceLineNo">4487</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.4487"></a>
-<span class="sourceLineNo">4488</span>    // XXX: The spied AsyncFSWAL can not work properly because of a Mockito defect that can not<a name="line.4488"></a>
-<span class="sourceLineNo">4489</span>    // deal with classes which have a field of an inner class. See discussions in HBASE-15536.<a name="line.4489"></a>
-<span class="sourceLineNo">4490</span>    walConf.set(WALFactory.WAL_PROVIDER, "filesystem");<a name="line.4490"></a>
-<span class="sourceLineNo">4491</span>    final WALFactory wals = new WALFactory(walConf, TEST_UTIL.getRandomUUID().toString());<a name="line.4491"></a>
-<span class="sourceLineNo">4492</span>    final WAL wal = spy(wals.getWAL(RegionInfoBuilder.newBuilder(tableName).build()));<a name="line.4492"></a>
-<span class="sourceLineNo">4493</span>    this.region = initHRegion(tableName, HConstants.EMPTY_START_ROW,<a name="line.4493"></a>
-<span class="sourceLineNo">4494</span>        HConstants.EMPTY_END_ROW, false, tableDurability, wal,<a name="line.4494"></a>
-<span class="sourceLineNo">4495</span>        new byte[][] { family });<a name="line.4495"></a>
-<span class="sourceLineNo">4496</span><a name="line.4496"></a>
-<span class="sourceLineNo">4497</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.4497"></a>
-<span class="sourceLineNo">4498</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.4498"></a>
-<span class="sourceLineNo">4499</span>    put.setDurability(mutationDurability);<a name="line.4499"></a>
-<span class="sourceLineNo">4500</span>    region.put(put);<a name="line.4500"></a>
-<span class="sourceLineNo">4501</span><a name="line.4501"></a>
-<span class="sourceLineNo">4502</span>    //verify append called or not<a name="line.4502"></a>
-<span class="sourceLineNo">4503</span>    verify(wal, expectAppend ? times(1) : never())<a name="line.4503"></a>
-<span class="sourceLineNo">4504</span>      .append((HRegionInfo)any(), (WALKeyImpl)any(),<a name="line.4504"></a>
-<span class="sourceLineNo">4505</span>          (WALEdit)any(), Mockito.anyBoolean());<a name="line.4505"></a>
+<span class="sourceLineNo">4479</span>    // expect skip wal cases<a name="line.4479"></a>
+<span class="sourceLineNo">4480</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4480"></a>
+<span class="sourceLineNo">4481</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4481"></a>
+<span class="sourceLineNo">4482</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4482"></a>
+<span class="sourceLineNo">4483</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4483"></a>
+<span class="sourceLineNo">4484</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4484"></a>
+<span class="sourceLineNo">4485</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.USE_DEFAULT, 0, false, false, false);<a name="line.4485"></a>
+<span class="sourceLineNo">4486</span><a name="line.4486"></a>
+<span class="sourceLineNo">4487</span>  }<a name="line.4487"></a>
+<span class="sourceLineNo">4488</span><a name="line.4488"></a>
+<span class="sourceLineNo">4489</span>  private void durabilityTest(String method, Durability tableDurability,<a name="line.4489"></a>
+<span class="sourceLineNo">4490</span>      Durability mutationDurability, long timeout, boolean expectAppend, final boolean expectSync,<a name="line.4490"></a>
+<span class="sourceLineNo">4491</span>      final boolean expectSyncFromLogSyncer) throws Exception {<a name="line.4491"></a>
+<span class="sourceLineNo">4492</span>    Configuration conf = HBaseConfiguration.create(CONF);<a name="line.4492"></a>
+<span class="sourceLineNo">4493</span>    method = method + "_" + tableDurability.name() + "_" + mutationDurability.name();<a name="line.4493"></a>
+<span class="sourceLineNo">4494</span>    byte[] family = Bytes.toBytes("family");<a name="line.4494"></a>
+<span class="sourceLineNo">4495</span>    Path logDir = new Path(new Path(dir + method), "log");<a name="line.4495"></a>
+<span class="sourceLineNo">4496</span>    final Configuration walConf = new Configuration(conf);<a name="line.4496"></a>
+<span class="sourceLineNo">4497</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.4497"></a>
+<span class="sourceLineNo">4498</span>    // XXX: The spied AsyncFSWAL can not work properly because of a Mockito defect that can not<a name="line.4498"></a>
+<span class="sourceLineNo">4499</span>    // deal with classes which have a field of an inner class. See discussions in HBASE-15536.<a name="line.4499"></a>
+<span class="sourceLineNo">4500</span>    walConf.set(WALFactory.WAL_PROVIDER, "filesystem");<a name="line.4500"></a>
+<span class="sourceLineNo">4501</span>    final WALFactory wals = new WALFactory(walConf, TEST_UTIL.getRandomUUID().toString());<a name="line.4501"></a>
+<span class="sourceLineNo">4502</span>    final WAL wal = spy(wals.getWAL(RegionInfoBuilder.newBuilder(tableName).build()));<a name="line.4502"></a>
+<span class="sourceLineNo">4503</span>    this.region = initHRegion(tableName, HConstants.EMPTY_START_ROW,<a name="line.4503"></a>
+<span class="sourceLineNo">4504</span>        HConstants.EMPTY_END_ROW, false, tableDurability, wal,<a name="line.4504"></a>
+<span class="sourceLineNo">4505</span>        new byte[][] { family });<a name="line.4505"></a>
 <span class="sourceLineNo">4506</span><a name="line.4506"></a>
-<span class="sourceLineNo">4507</span>    // verify sync called or not<a name="line.4507"></a>
-<span class="sourceLineNo">4508</span>    if (expectSync || expectSyncFromLogSyncer) {<a name="line.4508"></a>
-<span class="sourceLineNo">4509</span>      TEST_UTIL.waitFor(timeout, new Waiter.Predicate&lt;Exception&gt;() {<a name="line.4509"></a>
-<span class="sourceLineNo">4510</span>        @Override<a name="line.4510"></a>
-<span class="sourceLineNo">4511</span>        public boolean evaluate() throws Exception {<a name="line.4511"></a>
-<span class="sourceLineNo">4512</span>          try {<a name="line.4512"></a>
-<span class="sourceLineNo">4513</span>            if (expectSync) {<a name="line.4513"></a>
-<span class="sourceLineNo">4514</span>              verify(wal, times(1)).sync(anyLong()); // Hregion calls this one<a name="line.4514"></a>
-<span class="sourceLineNo">4515</span>            } else if (expectSyncFromLogSyncer) {<a name="line.4515"></a>
-<span class="sourceLineNo">4516</span>              verify(wal, times(1)).sync(); // wal syncer calls this one<a name="line.4516"></a>
-<span class="sourceLineNo">4517</span>            }<a name="line.4517"></a>
-<span class="sourceLineNo">4518</span>          } catch (Throwable ignore) {<a name="line.4518"></a>
-<span class="sourceLineNo">4519</span>          }<a name="line.4519"></a>
-<span class="sourceLineNo">4520</span>          return true;<a name="line.4520"></a>
-<span class="sourceLineNo">4521</span>        }<a name="line.4521"></a>
-<span class="sourceLineNo">4522</span>      });<a name="line.4522"></a>
-<span class="sourceLineNo">4523</span>    } else {<a name="line.4523"></a>
-<span class="sourceLineNo">4524</span>      //verify(wal, never()).sync(anyLong());<a name="line.4524"></a>
-<span class="sourceLineNo">4525</span>      verify(wal, never()).sync();<a name="line.4525"></a>
-<span class="sourceLineNo">4526</span>    }<a name="line.4526"></a>
-<span class="sourceLineNo">4527</span><a name="line.4527"></a>
-<span class="sourceLineNo">4528</span>    HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.4528"></a>
-<span class="sourceLineNo">4529</span>    wals.close();<a name="line.4529"></a>
-<span class="sourceLineNo">4530</span>    this.region = null;<a name="line.4530"></a>
-<span class="sourceLineNo">4531</span>  }<a name="line.4531"></a>
-<span class="sourceLineNo">4532</span><a name="line.4532"></a>
-<span class="sourceLineNo">4533</span>  @Test<a name="line.4533"></a>
-<span class="sourceLineNo">4534</span>  public void testRegionReplicaSecondary() throws IOException {<a name="line.4534"></a>
-<span class="sourceLineNo">4535</span>    // create a primary region, load some data and flush<a name="line.4535"></a>
-<span class="sourceLineNo">4536</span>    // create a secondary region, and do a get against that<a name="line.4536"></a>
-<span class="sourceLineNo">4537</span>    Path rootDir = new Path(dir + name.getMethodName());<a name="line.4537"></a>
-<span class="sourceLineNo">4538</span>    FSUtils.setRootDir(TEST_UTIL.getConfiguration(), rootDir);<a name="line.4538"></a>
-<span class="sourceLineNo">4539</span><a name="line.4539"></a>
-<span class="sourceLineNo">4540</span>    byte[][] families = new byte[][] {<a name="line.4540"></a>
-<span class="sourceLineNo">4541</span>        Bytes.toBytes("cf1"), Bytes.toBytes("cf2"), Bytes.toBytes("cf3")<a name="line.4541"></a>
-<span class="sourceLineNo">4542</span>    };<a name="line.4542"></a>
-<span class="sourceLineNo">4543</span>    byte[] cq = Bytes.toBytes("cq");<a name="line.4543"></a>
-<span class="sourceLineNo">4544</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.4544"></a>
-<span class="sourceLineNo">4545</span>    for (byte[] family : families) {<a name="line.4545"></a>
-<span class="sourceLineNo">4546</span>      htd.addFamily(new HColumnDescriptor(family));<a name="line.4546"></a>
-<span class="sourceLineNo">4547</span>    }<a name="line.4547"></a>
-<span class="sourceLineNo">4548</span><a name="line.4548"></a>
-<span class="sourceLineNo">4549</span>    long time = System.currentTimeMillis();<a name="line.4549"></a>
-<span class="sourceLineNo">4550</span>    HRegionInfo primaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4550"></a>
-<span class="sourceLineNo">4551</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4551"></a>
-<span class="sourceLineNo">4552</span>      false, time, 0);<a name="line.4552"></a>
-<span class="sourceLineNo">4553</span>    HRegionInfo secondaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4553"></a>
-<span class="sourceLineNo">4554</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4554"></a>
-<span class="sourceLineNo">4555</span>      false, time, 1);<a name="line.4555"></a>
-<span class="sourceLineNo">4556</span><a name="line.4556"></a>
-<span class="sourceLineNo">4557</span>    HRegion primaryRegion = null, secondaryRegion = null;<a name="line.4557"></a>
+<span class="sourceLineNo">4507</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.4507"></a>
+<span class="sourceLineNo">4508</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.4508"></a>
+<span class="sourceLineNo">4509</span>    put.setDurability(mutationDurability);<a name="line.4509"></a>
+<span class="sourceLineNo">4510</span>    region.put(put);<a name="line.4510"></a>
+<span class="sourceLineNo">4511</span><a name="line.4511"></a>
+<span class="sourceLineNo">4512</span>    //verify append called or not<a name="line.4512"></a>
+<span class="sourceLineNo">4513</span>    verify(wal, expectAppend ? times(1) : never())<a name="line.4513"></a>
+<span class="sourceLineNo">4514</span>      .append((HRegionInfo)any(), (WALKeyImpl)any(),<a name="line.4514"></a>
+<span class="sourceLineNo">4515</span>          (WALEdit)any(), Mockito.anyBoolean());<a name="line.4515"></a>
+<span class="sourceLineNo">4516</span><a name="line.4516"></a>
+<span class="sourceLineNo">4517</span>    // verify sync called or not<a name="line.4517"></a>
+<span class="sourceLineNo">4518</span>    if (expectSync || expectSyncFromLogSyncer) {<a name="line.4518"></a>
+<span class="sourceLineNo">4519</span>      TEST_UTIL.waitFor(timeout, new Waiter.Predicate&lt;Exception&gt;() {<a name="line.4519"></a>
+<span class="sourceLineNo">4520</span>        @Override<a name="line.4520"></a>
+<span class="sourceLineNo">4521</span>        public boolean evaluate() throws Exception {<a name="line.4521"></a>
+<span class="sourceLineNo">4522</span>          try {<a name="line.4522"></a>
+<span class="sourceLineNo">4523</span>            if (expectSync) {<a name="line.4523"></a>
+<span class="sourceLineNo">4524</span>              verify(wal, times(1)).sync(anyLong()); // Hregion calls this one<a name="line.4524"></a>
+<span class="sourceLineNo">4525</span>            } else if (expectSyncFromLogSyncer) {<a name="line.4525"></a>
+<span class="sourceLineNo">4526</span>              verify(wal, times(1)).sync(); // wal syncer calls this one<a name="line.4526"></a>
+<span class="sourceLineNo">4527</span>            }<a name="line.4527"></a>
+<span class="sourceLineNo">4528</span>          } catch (Throwable ignore) {<a name="line.4528"></a>
+<span class="sourceLineNo">4529</span>          }<a name="line.4529"></a>
+<span class="sourceLineNo">4530</span>          return true;<a name="line.4530"></a>
+<span class="sourceLineNo">4531</span>        }<a name="line.4531"></a>
+<span class="sourceLineNo">4532</span>      });<a name="line.4532"></a>
+<span class="sourceLineNo">4533</span>    } else {<a name="line.4533"></a>
+<span class="sourceLineNo">4534</span>      //verify(wal, never()).sync(anyLong());<a name="line.4534"></a>
+<span class="sourceLineNo">4535</span>      verify(wal, never()).sync();<a name="line.4535"></a>
+<span class="sourceLineNo">4536</span>    }<a name="line.4536"></a>
+<span class="sourceLineNo">4537</span><a name="line.4537"></a>
+<span class="sourceLineNo">4538</span>    HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.4538"></a>
+<span class="sourceLineNo">4539</span>    wals.close();<a name="line.4539"></a>
+<span class="sourceLineNo">4540</span>    this.region = null;<a name="line.4540"></a>
+<span class="sourceLineNo">4541</span>  }<a name="line.4541"></a>
+<span class="sourceLineNo">4542</span><a name="line.4542"></a>
+<span class="sourceLineNo">4543</span>  @Test<a name="line.4543"></a>
+<span class="sourceLineNo">4544</span>  public void testRegionReplicaSecondary() throws IOException {<a name="line.4544"></a>
+<span class="sourceLineNo">4545</span>    // create a primary region, load some data and flush<a name="line.4545"></a>
+<span class="sourceLineNo">4546</span>    // create a secondary region, and do a get against that<a name="line.4546"></a>
+<span class="sourceLineNo">4547</span>    Path rootDir = new Path(dir + name.getMethodName());<a name="line.4547"></a>
+<span class="sourceLineNo">4548</span>    FSUtils.setRootDir(TEST_UTIL.getConfiguration(), rootDir);<a name="line.4548"></a>
+<span class="sourceLineNo">4549</span><a name="line.4549"></a>
+<span class="sourceLineNo">4550</span>    byte[][] families = new byte[][] {<a name="line.4550"></a>
+<span class="sourceLineNo">4551</span>        Bytes.toBytes("cf1"), Bytes.toBytes("cf2"), Bytes.toBytes("cf3")<a name="line.4551"></a>
+<span class="sourceLineNo">4552</span>    };<a name="line.4552"></a>
+<span class="sourceLineNo">4553</span>    byte[] cq = Bytes.toBytes("cq");<a name="line.4553"></a>
+<span class="sourceLineNo">4554</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.4554"></a>
+<span class="sourceLineNo">4555</span>    for (byte[] family : families) {<a name="line.4555"></a>
+<span class="sourceLineNo">4556</span>      htd.addFamily(new HColumnDescriptor(family));<a name="line.4556"></a>
+<span class="sourceLineNo">4557</span>    }<a name="line.4557"></a>
 <span class="sourceLineNo">4558</span><a name="line.4558"></a>
-<span class="sourceLineNo">4559</span>    try {<a name="line.4559"></a>
-<span class="sourceLineNo">4560</span>      primaryRegion = HBaseTestingUtility.createRegionAndWAL(primaryHri,<a name="line.4560"></a>
-<span class="sourceLineNo">4561</span>          rootDir, TEST_UTIL.getConfiguration(), htd);<a name="line.4561"></a>
-<span class="sourceLineNo">4562</span><a name="line.4562"></a>
-<span class="sourceLineNo">4563</span>      // load some data<a name="line.4563"></a>
-<span class="sourceLineNo">4564</span>      putData(primaryRegion, 0, 1000, cq, families);<a name="line.4564"></a>
-<span class="sourceLineNo">4565</span><a name="line.4565"></a>
-<span class="sourceLineNo">4566</span>      // flush region<a name="line.4566"></a>
-<span class="sourceLineNo">4567</span>      primaryRegion.flush(true);<a name="line.4567"></a>
+<span class="sourceLineNo">4559</span>    long time = System.currentTimeMillis();<a name="line.4559"></a>
+<span class="sourceLineNo">4560</span>    HRegionInfo primaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4560"></a>
+<span class="sourceLineNo">4561</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4561"></a>
+<span class="sourceLineNo">4562</span>      false, time, 0);<a name="line.4562"></a>
+<span class="sourceLineNo">4563</span>    HRegionInfo secondaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4563"></a>
+<span class="sourceLineNo">4564</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4564"></a>
+<span class="sourceLineNo">4565</span>      false, time, 1);<a name="line.4565"></a>
+<span class="sourceLineNo">4566</span><a name="line.4566"></a>
+<span class="sourceLineNo">4567</span>    HRegion primaryRegion = null, secondaryRegion = null;<a name="line.4567"></a>
 <span class="sourceLineNo">4568</span><a name="line.4568"></a>
-<span class="sourceLineNo">4569</span>      // open secondary region<a name="line.4569"></a>
-<span class="sourceLineNo">4570</span>      secondaryRegion = HRegion.openHRegion(rootDir, secondaryHri, htd, null, CONF);<a name="line.4570"></a>
-<span class="sourceLineNo">4571</span><a name="line.4571"></a>
-<span class="sourceLineNo">4572</span>      verifyData(secondaryRegion, 0, 1000, cq, families);<a name="line.4572"></a>
-<span class="sourceLineNo">4573</span>    } finally {<a name="line.4573"></a>
-<span class="sourceLineNo">4574</span>      if (primaryRegion != null) {<a name="line.4574"></a>
-<span class="sourceLineNo">4575</span>        HBaseTestingUtility.closeRegionAndWAL(primaryRegion);<a name="line.4575"></a>
-<span class="sourceLineNo">4576</span>      }<a name="line.4576"></a>
-<span class="sourceLineNo">4577</span>      if (secondaryRegion != null) {<a name="line.4577"></a>
-<span class="sourceLineNo">4578</span>        HBaseTestingUtility.closeRegionAndWAL(secondaryRegion);<a name="line.4578"></a>
-<span class="sourceLineNo">4579</span>      }<a name="line.4579"></a>
-<span class="sourceLineNo">4580</span>    }<a name="line.4580"></a>
-<span class="sourceLineNo">4581</span>  }<a name="line.4581"></a>
-<span class="sourceLineNo">4582</span><a name="line.4582"></a>
-<span class="sourceLineNo">4583</span>  @Test<a name="line.4583"></a>
-<span class="sourceLineNo">4584</span>  public void testRegionReplicaSecondaryIsReadOnly() throws IOException {<a name="line.4584"></a>
-<span class="sourceLineNo">4585</span>    // create a primary region, load some data and flush<a name="line.4585"></a>
-<span class="sourceLineNo">4586</span>    // create a secondary region, and do a put against that<a name="line.4586"></a>
-<span class="sourceLineNo">4587</span>    Path rootDir = new Path(dir + name.getMethodName());<a name="line.4587"></a>
-<span class="sourceLineNo">4588</span>    FSUtils.setRootDir(TEST_UTIL.getConfiguration(), rootDir);<a name="line.4588"></a>
-<span class="sourceLineNo">4589</span><a name="line.4589"></a>
-<span class="sourceLineNo">4590</span>    byte[][] families = new byte[][] {<a name="line.4590"></a>
-<span class="sourceLineNo">4591</span>        Bytes.toBytes("cf1"), Bytes.toBytes("cf2"), Bytes.toBytes("cf3")<a name="line.4591"></a>
-<span class="sourceLineNo">4592</span>    };<a name="line.4592"></a>
-<span class="sourceLineNo">4593</span>    byte[] cq = Bytes.toBytes("cq");<a name="line.4593"></a>
-<span class="sourceLineNo">4594</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.4594"></a>
-<span class="sourceLineNo">4595</span>    for (byte[] family : families) {<a name="line.4595"></a>
-<span class="sourceLineNo">4596</span>      htd.addFamily(new HColumnDescriptor(family));<a name="line.4596"></a>
-<span class="sourceLineNo">4597</span>    }<a name="line.4597"></a>
-<span class="sourceLineNo">4598</span><a name="line.4598"></a>
-<span class="sourceLineNo">4599</span>    long time = System.currentTimeMillis();<a name="line.4599"></a>
-<span class="sourceLineNo">4600</span>    HRegionInfo primaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4600"></a>
-<span class="sourceLineNo">4601</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4601"></a>
-<span class="sourceLineNo">4602</span>      false, time, 0);<a name="line.4602"></a>
-<span class="sourceLineNo">4603</span>    HRegionInfo secondaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4603"></a>
-<span class="sourceLineNo">4604</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4604"></a>
-<span class="sourceLineNo">4605</span>      false, time, 1);<a name="line.4605"></a>
-<span class="sourceLineNo">4606</span><a name="line.4606"></a>
-<span class="sourceLineNo">4607</span>    HRegion primaryRegion = null, secondaryRegion = null;<a name="line.4607"></a>
+<span class="sourceLineNo">4569</span>    try {<a name="line.4569"></a>
+<span class="sourceLineNo">4570</span>      primaryRegion = HBaseTestingUtility.createRegionAndWAL(primaryHri,<a name="line.4570"></a>
+<span class="sourceLineNo">4571</span>          rootDir, TEST_UTIL.getConfiguration(), htd);<a name="line.4571"></a>
+<span class="sourceLineNo">4572</span><a name="line.4572"></a>
+<span class="sourceLineNo">4573</span>      // load some data<a name="line.4573"></a>
+<span class="sourceLineNo">4574</span>      putData(primaryRegion, 0, 1000, cq, families);<a name="line.4574"></a>
+<span class="sourceLineNo">4575</span><a name="line.4575"></a>
+<span class="sourceLineNo">4576</span>      // flush region<a name="line.4576"></a>
+<span class="sourceLineNo">4577</span>      primaryRegion.flush(true);<a name="line.4577"></a>
+<span class="sourceLineNo">4578</span><a name="line.4578"></a>
+<span class="sourceLineNo">4579</span>      // open secondary region<a name="line.4579"></a>
+<span class="sourceLineNo">4580</span>      secondaryRegion = HRegion.openHRegion(rootDir, secondaryHri, htd, null, CONF);<a name="line.4580"></a>
+<span class="sourceLineNo">4581</span><a name="line.4581"></a>
+<span class="sourceLineNo">4582</span>      verifyData(secondaryRegion, 0, 1000, cq, families);<a name="line.4582"></a>
+<span class="sourceLineNo">4583</span>    } finally {<a name="line.4583"></a>
+<span class="sourceLineNo">4584</span>      if (primaryRegion != null) {<a name="line.4584"></a>
+<span class="sourceLineNo">4585</span>        HBaseTestingUtility.closeRegionAndWAL(primaryRegion);<a name="line.4585"></a>
+<span class="sourceLineNo">4586</span>      }<a name="line.4586"></a>
+<span class="sourceLineNo">4587</span>      if (secondaryRegion != null) {<a name="line.4587"></a>
+<span class="sourceLineNo">4588</span>        HBaseTestingUtility.closeRegionAndWAL(secondaryRegion);<a name="line.4588"></a>
+<span class="sourceLineNo">4589</span>      }<a name="line.4589"></a>
+<span class="sourceLineNo">4590</span>    }<a name="line.4590"></a>
+<span class="sourceLineNo">4591</span>  }<a name="line.4591"></a>
+<span class="sourceLineNo">4592</span><a name="line.4592"></a>
+<span class="sourceLineNo">4593</span>  @Test<a name="line.4593"></a>
+<span class="sourceLineNo">4594</span>  public void testRegionReplicaSecondaryIsReadOnly() throws IOException {<a name="line.4594"></a>
+<span class="sourceLineNo">4595</span>    // create a primary region, load some data and flush<a name="line.4595"></a>
+<span class="sourceLineNo">4596</span>    // create a secondary region, and do a put against that<a name="line.4596"></a>
+<span class="sourceLineNo">4597</span>    Path rootDir = new Path(dir + name.getMethodName());<a name="line.4597"></a>
+<span class="sourceLineNo">4598</span>    FSUtils.setRootDir(TEST_UTIL.getConfiguration(), rootDir);<a name="line.4598"></a>
+<span class="sourceLineNo">4599</span><a name="line.4599"></a>
+<span class="sourceLineNo">4600</span>    byte[][] families = new byte[][] {<a name="line.4600"></a>
+<span class="sourceLineNo">4601</span>        Bytes.toBytes("cf1"), Bytes.toBytes("cf2"), Bytes.toBytes("cf3")<a name="line.4601"></a>
+<span class="sourceLineNo">4602</span>    };<a name="line.4602"></a>
+<span class="sourceLineNo">4603</span>    byte[] cq = Bytes.toBytes("cq");<a name="line.4603"></a>
+<span class="sourceLineNo">4604</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.4604"></a>
+<span class="sourceLineNo">4605</span>    for (byte[] family : families) {<a name="line.4605"></a>
+<span class="sourceLineNo">4606</span>      htd.addFamily(new HColumnDescriptor(family));<a name="line.4606"></a>
+<span class="sourceLineNo">4607</span>    }<a name="line.4607"></a>
 <span class="sourceLineNo">4608</span><a name="line.4608"></a>
-<span class="sourceLineNo">4609</span>    try {<a name="line.4609"></a>
-<span class="sourceLineNo">4610</span>      primaryRegion = HBaseTestingUtility.createRegionAndWAL(primaryHri,<a name="line.4610"></a>
-<span class="sourceLineNo">4611</span>          rootDir, TEST_UTIL.getConfiguration(), htd);<a name="line.4611"></a>
-<span class="sourceLineNo">4612</span><a name="line.4612"></a>
-<span class="sourceLineNo">4613</span>      // load some data<a name="line.4613"></a>
-<span class="sourceLineNo">4614</span>      putData(primaryRegion, 0, 1000, cq, families);<a name="line.4614"></a>
-<span class="sourceLineNo">4615</span><a name="line.4615"></a>
-<span class="sourceLineNo">4616</span>      // flush region<a name="line.4616"></a>
-<span class="sourceLineNo">4617</span>      primaryRegion.flush(true);<a name="line.4617"></a>
+<span class="sourceLineNo">4609</span>    long time = System.currentTimeMillis();<a name="line.4609"></a>
+<span class="sourceLineNo">4610</span>    HRegionInfo primaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4610"></a>
+<span class="sourceLineNo">4611</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4611"></a>
+<span class="sourceLineNo">4612</span>      false, time, 0);<a name="line.4612"></a>
+<span class="sourceLineNo">4613</span>    HRegionInfo secondaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4613"></a>
+<span class="sourceLineNo">4614</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4614"></a>
+<span class="sourceLineNo">4615</span>      false, time, 1);<a name="line.4615"></a>
+<span class="sourceLineNo">4616</span><a name="line.4616"></a>
+<span class="sourceLineNo">4617</span>    HRegion primaryRegion = null, secondaryRegion = null;<a name="line.4617"></a>
 <span class="sourceLineNo">4618</span><a name="line.4618"></a>
-<span class="sourceLineNo">4619</span>      // open secondary region<a name="line.4619"></a>
-<span class="sourceLineNo">4620</span>      secondaryRegion = HRegion.openHRegion(rootDir, secondaryHri, htd, null, CONF);<a name="line.4620"></a>
-<span class="sourceLineNo">4621</span><a name="line.4621"></a>
-<span class="sourceLineNo">4622</span>      try {<a name="line.4622"></a>
-<span class="sourceLineNo">4623</span>        putData(secondaryRegion, 0, 1000, cq, families);<a name="line.4623"></a>
-<span class="sourceLineNo">4624</span>        fail("Should have thrown exception");<a name="line.4624"></a>
-<span class="sourceLineNo">4625</span>      } catch (IOException ex) {<a name="line.4625"></a>
-<span class="sourceLineNo">4626</span>        // expected<a name="line.4626"></a>
-<span class="sourceLineNo">4627</span>      }<a name="line.4627"></a>
-<span class="sourceLineNo">4628</span>    } finally {<a name="line.4628"></a>
-<span class="sourceLineNo">4629</span>      if (primaryRegion != null) {<a name="line.4629"></a>
-<span class="sourceLineNo">4630</span>        HBaseTestingUtility.closeRegionAndWAL(primaryRegion);<a name="line.4630"></a>
-<span class="sourceLineNo">4631</span>      }<a name="line.4631"></a>
-<span class="sourceLineNo">4632</span>      if (secondaryRegion != null) {<a name="line.4632"></a>
-<span class="sourceLineNo">4633</span>        HBaseTestingUtility.closeRegionAndWAL(secondaryRegion);<a name="line.4633"></a>
-<span class="sourceLineNo">4634</span>      }<a name="line.4634"></a>
-<span class="sourceLineNo">4635</span>    }<a name="line.4635"></a>
-<span class="sourceLineNo">4636</span>  }<a name="line.4636"></a>
-<span class="sourceLineNo">4637</span><a name="line.4637"></a>
-<span class="sourceLineNo">4638</span>  static WALFactory createWALFactory(Configuration conf, Path rootDir) throws IOException {<a name="line.4638"></a>
-<span class="sourceLineNo">4639</span>    Configuration confForWAL = new Configuration(conf);<a name="line.4639"></a>
-<span class="sourceLineNo">4640</span>    confForWAL.set(HConstants.HBASE_DIR, rootDir.toString());<a name="line.4640"></a>
-<span class="sourceLineNo">4641</span>    return new WALFactory(confForWAL, "hregion-" + RandomStringUtils.randomNumeric(8));<a name="line.4641"></a>
-<span class="sourceLineNo">4642</span>  }<a name="line.4642"></a>
-<span class="sourceLineNo">4643</span><a name="line.4643"></a>
-<span class="sourceLineNo">4644</span>  @Test<a name="line.4644"></a>
-<span class="sourceLineNo">4645</span>  public void testCompactionFromPrimary() throws IOException {<a name="line.4645"></a>
-<span class="sourceLineNo">4646</span>    Path rootDir = new Path(dir + name.getMethodName());<a name="line.4646"></a>
-<span class="sourceLineNo">4647</span>    FSUtils.setRootDir(TEST_UTIL.getConfiguration(), rootDir);<a name="line.4647"></a>
-<span class="sourceLineNo">4648</span><a name="line.4648"></a>
-<span class="sourceLineNo">4649</span>    byte[][] families = new byte[][] {<a name="line.4649"></a>
-<span class="sourceLineNo">4650</span>        Bytes.toBytes("cf1"), Bytes.toBytes("cf2"), Bytes.toBytes("cf3")<a name="line.4650"></a>
-<span class="sourceLineNo">4651</span>    };<a name="line.4651"></a>
-<span class="sourceLineNo">4652</span>    byte[] cq = Bytes.toBytes("cq");<a name="line.4652"></a>
-<span class="sourceLineNo">4653</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.4653"></a>
-<span class="sourceLineNo">4654</span>    for (byte[] family : families) {<a name="line.4654"></a>
-<span class="sourceLineNo">4655</span>      htd.addFamily(new HColumnDescriptor(family));<a name="line.4655"></a>
-<span class="sourceLineNo">4656</span>    }<a name="line.4656"></a>
-<span class="sourceLineNo">4657</span><a name="line.4657"></a>
-<span class="sourceLineNo">4658</span>    long time = System.currentTimeMillis();<a name="line.4658"></a>
-<span class="sourceLineNo">4659</span>    HRegionInfo primaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4659"></a>
-<span class="sourceLineNo">4660</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4660"></a>
-<span class="sourceLineNo">4661</span>      false, time, 0);<a name="line.4661"></a>
-<span class="sourceLineNo">4662</span>    HRegionInfo secondaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4662"></a>
-<span class="sourceLineNo">4663</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4663"></a>
-<span class="sourceLineNo">4664</span>      false, time, 1);<a name="line.4664"></a>
-<span class="sourceLineNo">4665</span><a name="line.4665"></a>
-<span class="sourceLineNo">4666</span>    HRegion primaryRegion = null, secondaryRegion = null;<a name="line.4666"></a>
+<span class="sourceLineNo">4619</span>    try {<a name="line.4619"></a>
+<span class="sourceLineNo">4620</span>      primaryRegion = HBaseTestingUtility.createRegionAndWAL(primaryHri,<a name="line.4620"></a>
+<span class="sourceLineNo">4621</span>          rootDir, TEST_UTIL.getConfiguration(), htd);<a name="line.4621"></a>
+<span class="sourceLineNo">4622</span><a name="line.4622"></a>
+<span class="sourceLineNo">4623</span>      // load some data<a name="line.4623"></a>
+<span class="sourceLineNo">4624</span>      putData(primaryRegion, 0, 1000, cq, families);<a name="line.4624"></a>
+<span class="sourceLineNo">4625</span><a name="line.4625"></a>
+<span class="sourceLineNo">4626</span>      // flush region<a name="line.4626"></a>
+<span class="sourceLineNo">4627</span>      primaryRegion.flush(true);<a name="line.4627"></a>
+<span class="sourceLineNo">4628</span><a name="line.4628"></a>
+<span class="sourceLineNo">4629</span>      // open secondary region<a name="line.4629"></a>
+<span class="sourceLineNo">4630</span>      secondaryRegion = HRegion.openHRegion(rootDir, secondaryHri, htd, null, CONF);<a name="line.4630"></a>
+<span class="sourceLineNo">4631</span><a name="line.4631"></a>
+<span class="sourceLineNo">4632</span>      try {<a name="line.4632"></a>
+<span class="sourceLineNo">4633</span>        putData(secondaryRegion, 0, 1000, cq, families);<a name="line.4633"></a>
+<span class="sourceLineNo">4634</span>        fail("Should have thrown exception");<a name="line.4634"></a>
+<span class="sourceLineNo">4635</span>      } catch (IOException ex) {<a name="line.4635"></a>
+<span class="sourceLineNo">4636</span>        // expected<a name="line.4636"></a>
+<span class="sourceLineNo">4637</span>      }<a name="line.4637"></a>
+<span class="sourceLineNo">4638</span>    } finally {<a name="line.4638"></a>
+<span class="sourceLineNo">4639</span>      if (primaryRegion != null) {<a name="line.4639"></a>
+<span class="sourceLineNo">4640</span>        HBaseTestingUtility.closeRegionAndWAL(primaryRegion);<a name="line.4640"></a>
+<span class="sourceLineNo">4641</span>      }<a name="line.4641"></a>
+<span class="sourceLineNo">4642</span>      if (secondaryRegion != null) {<a name="line.4642"></a>
+<span class="sourceLineNo">4643</span>        HBaseTestingUtility.closeRegionAndWAL(secondaryRegion);<a name="line.4643"></a>
+<span class="sourceLineNo">4644</span>      }<a name="line.4644"></a>
+<span class="sourceLineNo">4645</span>    }<a name="line.4645"></a>
+<span class="sourceLineNo">4646</span>  }<a name="line.4646"></a>
+<span class="sourceLineNo">4647</span><a name="line.4647"></a>
+<span class="sourceLineNo">4648</span>  static WALFactory createWALFactory(Configuration conf, Path rootDir) throws IOException {<a name="line.4648"></a>
+<span class="sourceLineNo">4649</span>    Configuration confForWAL = new Configuration(conf);<a name="line.4649"></a>
+<span class="sourceLineNo">4650</span>    confForWAL.set(HConstants.HBASE_DIR, rootDir.toString());<a name="line.4650"></a>
+<span class="sourceLineNo">4651</span>    return new WALFactory(confForWAL, "hregion-" + RandomStringUtils.randomNumeric(8));<a name="line.4651"></a>
+<span class="sourceLineNo">4652</span>  }<a name="line.4652"></a>
+<span class="sourceLineNo">4653</span><a name="line.4653"></a>
+<span class="sourceLineNo">4654</span>  @Test<a name="line.4654"></a>
+<span class="sourceLineNo">4655</span>  public void testCompactionFromPrimary() throws IOException {<a name="line.4655"></a>
+<span class="sourceLineNo">4656</span>    Path rootDir = new Path(dir + name.getMethodName());<a name="line.4656"></a>
+<span class="sourceLineNo">4657</span>    FSUtils.setRootDir(TEST_UTIL.getConfiguration(), rootDir);<a name="line.4657"></a>
+<span class="sourceLineNo">4658</span><a name="line.4658"></a>
+<span class="sourceLineNo">4659</span>    byte[][] families = new byte[][] {<a name="line.4659"></a>
+<span class="sourceLineNo">4660</span>        Bytes.toBytes("cf1"), Bytes.toBytes("cf2"), Bytes.toBytes("cf3")<a name="line.4660"></a>
+<span class="sourceLineNo">4661</span>    };<a name="line.4661"></a>
+<span class="sourceLineNo">4662</span>    byte[] cq = Bytes.toBytes("cq");<a name="line.4662"></a>
+<span class="sourceLineNo">4663</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.4663"></a>
+<span class="sourceLineNo">4664</span>    for (byte[] family : families) {<a name="line.4664"></a>
+<span class="sourceLineNo">4665</span>      htd.addFamily(new HColumnDescriptor(family));<a name="line.4665"></a>
+<span class="sourceLineNo">4666</span>    }<a name="line.4666"></a>
 <span class="sourceLineNo">4667</span><a name="line.4667"></a>
-<span class="sourceLineNo">4668</span>    try {<a name="line.4668"></a>
-<span class="sourceLineNo">4669</span>      primaryRegion = HBaseTestingUtility.createRegionAndWAL(primaryHri,<a name="line.4669"></a>
-<span class="sourceLineNo">4670</span>          rootDir, TEST_UTIL.getConfiguration(), htd);<a name="line.4670"></a>
-<span class="sourceLineNo">4671</span><a name="line.4671"></a>
-<span class="sourceLineNo">4672</span>      // load some data<a name="line.4672"></a>
-<span class="sourceLineNo">4673</span>      putData(primaryRegion, 0, 1000, cq, families);<a name="line.4673"></a>
-<span class="sourceLineNo">4674</span><a name="line.4674"></a>
-<span class="sourceLineNo">4675</span>      // flush region<a name="line.4675"></a>
-<span class="sourceLineNo">4676</span>      primaryRegion.flush(true);<a name="line.4676"></a>
+<span class="sourceLineNo">4668</span>    long time = System.currentTimeMillis();<a name="line.4668"></a>
+<span class="sourceLineNo">4669</span>    HRegionInfo primaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4669"></a>
+<span class="sourceLineNo">4670</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4670"></a>
+<span class="sourceLineNo">4671</span>      false, time, 0);<a name="line.4671"></a>
+<span class="sourceLineNo">4672</span>    HRegionInfo secondaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4672"></a>
+<span class="sourceLineNo">4673</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4673"></a>
+<span class="sourceLineNo">4674</span>      false, time, 1);<a name="line.4674"></a>
+<span class="sourceLineNo">4675</span><a name="line.4675"></a>
+<span class="sourceLineNo">4676</span>    HRegion primaryRegion = null, secondaryRegion = null;<a name="line.4676"></a>
 <span class="sourceLineNo">4677</span><a name="line.4677"></a>
-<span class="sourceLineNo">4678</span>      // open secondary region<a name="line.4678"></a>
-<span class="sourceLineNo">4679</span>      secondaryRegion = HRegion.openHRegion(rootDir, secondaryHri, htd, null, CONF);<a name="line.4679"></a>
-<span class="sourceLineNo">4680</span><a name="line.4680"></a>
-<span class="sourceLineNo">4681</span>      // move the file of the primary region to the archive, simulating a compaction<a name="line.4681"></a>
-<span class="sourceLineNo">4682</span>      Collection&lt;HStoreFile&gt; storeFiles = primaryRegion.getStore(families[0]).getStorefiles();<a name="line.4682"></a>
-<span class="sourceLineNo">4683</span>      primaryRegion.getRegionFileSystem().removeStoreFiles(Bytes.toString(families[0]), storeFiles);<a name="line.4683"></a>
-<span class="sourceLineNo">4684</span>      Collection&lt;StoreFileInfo&gt; storeFileInfos = primaryRegion.getRegionFileSystem()<a name="line.4684"></a>
-<span class="sourceLineNo">4685</span>          .getStoreFiles(families[0]);<a name="line.4685"></a>
-<span class="sourceLineNo">4686</span>      Assert.assertTrue(storeFileInfos == null || storeFileInfos.isEmpty());<a name="line.4686"></a>
+<span class="sourceLineNo">4678</span>    try {<a name="line.4678"></a>
+<span class="sourceLineNo">4679</span>      primaryRegion = HBaseTestingUtility.createRegionAndWAL(primaryHri,<a name="line.4679"></a>
+<span class="sourceLineNo">4680</span>          rootDir, TEST_UTIL.getConfiguration(), htd);<a name="line.4680"></a>
+<span class="sourceLineNo">4681</span><a name="line.4681"></a>
+<span class="sourceLineNo">4682</span>      // load some data<a name="line.4682"></a>
+<span class="sourceLineNo">4683</span>      putData(primaryRegion, 0, 1000, cq, families);<a name="line.4683"></a>
+<span class="sourceLineNo">4684</span><a name="line.4684"></a>
+<span class="sourceLineNo">4685</span>      // flush region<a name="line.4685"></a>
+<span class="sourceLineNo">4686</span>      primaryRegion.flush(true);<a name="line.4686"></a>
 <span class="sourceLineNo">4687</span><a name="line.4687"></a>
-<span class="sourceLineNo">4688</span>      verifyData(secondaryRegion, 0, 1000, cq, families);<a name="line.4688"></a>
-<span class="sourceLineNo">4689</span>    } finally {<a name="line.4689"></a>
-<span class="sourceLineNo">4690</span>      if (primaryRegion != null) {<a name="line.4690"></a>
-<span class="sourceLineNo">4691</span>        HBaseTestingUtility.closeRegionAndWAL(primaryRegion);<a name="line.4691"></a>
-<span class="sourceLineNo">4692</span>      }<a name="line.4692"></a>
-<span class="sourceLineNo">4693</span>      if (secondaryRegion != null) {<a name="line.4693"></a>
-<span class="sourceLineNo">4694</span>        HBaseTestingUtility.closeRegionAndWAL(secondaryRegion);<a name="line.4694"></a>
-<span class="sourceLineNo">4695</span>      }<a name="line.4695"></a>
-<span class="sourceLineNo">4696</span>    }<a name="line.4696"></a>
-<span class="sourceLineNo">4697</span>  }<a name="line.4697"></a>
-<span class="sourceLineNo">4698</span><a name="line.4698"></a>
-<span class="sourceLineNo">4699</span>  private void putData(int startRow, int numRows, byte[] qf, byte[]... families) throws<a name="line.4699"></a>
-<span class="sourceLineNo">4700</span>      IOException {<a name="line.4700"></a>
-<span class="sourceLineNo">4701</span>    putData(this.region, startRow, numRows, qf, families);<a name="line.4701"></a>
-<span class="sourceLineNo">4702</span>  }<a name="line.4702"></a>
-<span class="sourceLineNo">4703</span><a name="line.4703"></a>
-<span class="sourceLineNo">4704</span>  private void putData(HRegion region,<a name="line.4704"></a>
-<span class="sourceLineNo">4705</span>      int startRow, int numRows, byte[] qf, byte[]... families) throws IOException {<a name="line.4705"></a>
-<span class="sourceLineNo">4706</span>    putData(region, Durability.SKIP_WAL, startRow, numRows, qf, families);<a name="line.4706"></a>
+<span class="sourceLineNo">4688</span>      // open secondary region<a name="line.4688"></a>
+<span class="sourceLineNo">4689</span>      secondaryRegion = HRegion.openHRegion(rootDir, secondaryHri, htd, null, CONF);<a name="line.4689"></a>
+<span class="sourceLineNo">4690</span><a name="line.4690"></a>
+<span class="sourceLineNo">4691</span>      // move the file of the primary region to the archive, simulating a compaction<a name="line.4691"></a>
+<span class="sourceLineNo">4692</span>      Collection&lt;HStoreFile&gt; storeFiles = primaryRegion.getStore(families[0]).getStorefiles();<a name="line.4692"></a>
+<span class="sourceLineNo">4693</span>      primaryRegion.getRegionFileSystem().removeStoreFiles(Bytes.toString(families[0]), storeFiles);<a name="line.4693"></a>
+<span class="sourceLineNo">4694</span>      Collection&lt;StoreFileInfo&gt; storeFileInfos = primaryRegion.getRegionFileSystem()<a name="line.4694"></a>
+<span class="sourceLineNo">4695</span>          .getStoreFiles(families[0]);<a name="line.4695"></a>
+<span class="sourceLineNo">4696</span>      Assert.assertTrue(storeFileInfos == null || storeFileInfos.isEmpty());<a name="line.4696"></a>
+<span class="sourceLineNo">4697</span><a name="line.4697"></a>
+<span class="sourceLineNo">4698</span>      verifyData(secondaryRegion, 0, 1000, cq, families);<a name="line.4698"></a>
+<span class="sourceLineNo">4699</span>    } finally {<a name="line.4699"></a>
+<span class="sourceLineNo">4700</span>      if (primaryRegion != null) {<a name="line.4700"></a>
+<span class="sourceLineNo">4701</span>        HBaseTestingUtility.closeRegionAndWAL(primaryRegion);<a name="line.4701"></a>
+<span class="sourceLineNo">4702</span>      }<a name="line.4702"></a>
+<span class="sourceLineNo">4703</span>      if (secondaryRegion != null) {<a name="line.4703"></a>
+<span class="sourceLineNo">4704</span>        HBaseTestingUtility.closeRegionAndWAL(secondaryRegion);<a name="line.4704"></a>
+<span class="sourceLineNo">4705</span>      }<a name="line.4705"></a>
+<span class="sourceLineNo">4706</span>    }<a name="line.4706"></a>
 <span class="sourceLineNo">4707</span>  }<a name="line.4707"></a>
 <span class="sourceLineNo">4708</span><a name="line.4708"></a>
-<span class="sourceLineNo">4709</span>  static void putData(HRegion region, Durability durability,<a name="line.4709"></a>
-<span class="sourceLineNo">4710</span>      int startRow, int numRows, byte[] qf, byte[]... families) throws IOException {<a name="line.4710"></a>
-<span class="sourceLineNo">4711</span>    for (int i = startRow; i &lt; startRow + numRows; i++) {<a name="line.4711"></a>
-<span class="sourceLineNo">4712</span>      Put put = new Put(Bytes.toBytes("" + i));<a name="line.4712"></a>
-<span class="sourceLineNo">4713</span>      put.setDurability(durability);<a name="line.4713"></a>
-<span class="sourceLineNo">4714</span>      for (byte[] family : families) {<a name="line.4714"></a>
-<span class="sourceLineNo">4715</span>        put.addColumn(family, qf, null);<a name="line.4715"></a>
-<span class="sourceLineNo">4716</span>      }<a name="line.4716"></a>
-<span class="sourceLineNo">4717</span>      region.put(put);<a name="line.4717"></a>
-<span class="sourceLineNo">4718</span>      LOG.info(put.toString());<a name="line.4718"></a>
-<span class="sourceLineNo">4719</span>    }<a name="line.4719"></a>
-<span class="sourceLineNo">4720</span>  }<a name="line.4720"></a>
-<span class="sourceLineNo">4721</span><a name="line.4721"></a>
-<span class="sourceLineNo">4722</span>  static void verifyData(HRegion newReg, int startRow, int numRows, byte[] qf, byte[]... families)<a name="line.4722"></a>
-<span class="sourceLineNo">4723</span>      throws IOException {<a name="line.4723"></a>
-<span class="sourceLineNo">4724</span>    for (int i = startRow; i &lt; startRow + numRows; i++) {<a name="line.4724"></a>
-<span class="sourceLineNo">4725</span>      byte[] row = Bytes.toBytes("" + i);<a name="line.4725"></a>
-<span class="sourceLineNo">4726</span>      Get get = new Get(row);<a name="line.4726"></a>
-<span class="sourceLineNo">4727</span>      for (byte[] family : families) {<a name="line.4727"></a>
-<span class="sourceLineNo">4728</span>        get.addColumn(family, qf);<a name="line.4728"></a>
-<span class="sourceLineNo">4729</span>      }<a name="line.4729"></a>
-<span class="sourceLineNo">4730</span>      Result result = newReg.get(get);<a name="line.4730"></a>
-<span class="sourceLineNo">4731</span>      Cell[] raw = result.rawCells();<a name="line.4731"></a>
-<span class="sourceLineNo">4732</span>      assertEquals(families.length, result.size());<a name="line.4732"></a>
-<span class="sourceLineNo">4733</span>      for (int j = 0; j &lt; families.length; j++) {<a name="line.4733"></a>
-<span class="sourceLineNo">4734</span>        assertTrue(CellUtil.matchingRows(raw[j], row));<a name="line.4734"></a>
-<span class="sourceLineNo">4735</span>        assertTrue(CellUtil.matchingFamily(raw[j], families[j]));<a name="line.4735"></a>
-<span class="sourceLineNo">4736</span>        assertTrue(CellUtil.matchingQualifier(raw[j], qf));<a name="line.4736"></a>
-<span class="sourceLineNo">4737</span>      }<a name="line.4737"></a>
-<span class="sourceLineNo">4738</span>    }<a name="line.4738"></a>
-<span class="sourceLineNo">4739</span>  }<a name="line.4739"></a>
-<span class="sourceLineNo">4740</span><a name="line.4740"></a>
-<span class="sourceLineNo">4741</span>  static void assertGet(final HRegion r, final byte[] family, final byte[] k) throws IOException {<a name="line.4741"></a>
-<span class="sourceLineNo">4742</span>    // Now I have k, get values out and assert they are as expected.<a name="line.4742"></a>
-<span class="sourceLineNo">4743</span>    Get get = new Get(k).addFamily(family).readAllVersions();<a name="line.4743"></a>
-<span class="sourceLineNo">4744</span>    Cell[] results = r.get(get).rawCells();<a name="line.4744"></a>
-<span class="sourceLineNo">4745</span>    for (int j = 0; j &lt; results.length; j++) {<a name="line.4745"></a>
-<span class="sourceLineNo">4746</span>      byte[] tmp = CellUtil.cloneValue(results[j]);<a name="line.4746"></a>
-<span class="sourceLineNo">4747</span>      // Row should be equal to value every time.<a name="line.4747"></a>
-<span class="sourceLineNo">4748</span>      assertTrue(Bytes.equals(k, tmp));<a name="line.4748"></a>
-<span class="sourceLineNo">4749</span>    }<a name="line.4749"></a>
-<span class="sourceLineNo">4750</span>  }<a name="line.4750"></a>
-<span class="sourceLineNo">4751</span><a name="line.4751"></a>
-<span class="sourceLineNo">4752</span>  /*<a name="line.4752"></a>
-<span class="sourceLineNo">4753</span>   * Assert first value in the passed region is &lt;code&gt;firstValue&lt;/code&gt;.<a name="line.4753"></a>
-<span class="sourceLineNo">4754</span>   *<a name="line.4754"></a>
-<span class="sourceLineNo">4755</span>   * @param r<a name="line.4755"></a>
-<span class="sourceLineNo">4756</span>   *<a name="line.4756"></a>
-<span class="sourceLineNo">4757</span>   * @param fs<a name="line.4757"></a>
-<span class="sourceLineNo">4758</span>   *<a name="line.4758"></a>
-<span class="sourceLineNo">4759</span>   * @param firstValue<a name="line.4759"></a>
-<span class="sourceLineNo">4760</span>   *<a name="line.4760"></a>
-<span class="sourceLineNo">4761</span>   * @throws IOException<a name="line.4761"></a>
-<span class="sourceLineNo">4762</span>   */<a name="line.4762"></a>
-<span class="sourceLineNo">4763</span>  protected void assertScan(final HRegion r, final byte[] fs, final byte[] firstValue)<a name="line.4763"></a>
-<span class="sourceLineNo">4764</span>      throws IOException {<a name="line.4764"></a>
-<span class="sourceLineNo">4765</span>    byte[][] families = { fs };<a name="line.4765"></a>
-<span class="sourceLineNo">4766</span>    Scan scan = new Scan();<a name="line.4766"></a>
-<span class="sourceLineNo">4767</span>    for (int i = 0; i &lt; families.length; i++)<a name="line.4767"></a>
-<span class="sourceLineNo">4768</span>      scan.addFamily(families[i]);<a name="line.4768"></a>
-<span class="sourceLineNo">4769</span>    InternalScanner s = r.getScanner(scan);<a name="line.4769"></a>
-<span class="sourceLineNo">4770</span>    try {<a name="line.4770"></a>
-<span class="sourceLineNo">4771</span>      List&lt;Cell&gt; curVals = new ArrayList&lt;&gt;();<a name="line.4771"></a>
-<span class="sourceLineNo">4772</span>      boolean first = true;<a name="line.4772"></a>
-<span class="sourceLineNo">4773</span>      OUTER_LOOP: while (s.next(curVals)) {<a name="line.4773"></a>
-<span class="sourceLineNo">4774</span>        for (Cell kv : curVals) {<a name="line.4774"></a>
-<span class="sourceLineNo">4775</span>          byte[] val = CellUtil.cloneValue(kv);<a name="line.4775"></a>
-<span class="sourceLineNo">4776</span>          byte[] curval = val;<a name="line.4776"></a>
-<span class="sourceLineNo">4777</span>          if (first) {<a name="line.4777"></a>
-<span class="sourceLineNo">4778</span>            first = false;<a name="line.4778"></a>
-<span class="sourceLineNo">4779</span>            assertTrue(Bytes.compareTo(curval, firstValue) == 0);<a name="line.4779"></a>
-<span class="sourceLineNo">4780</span>          } else {<a name="line.4780"></a>
-<span class="sourceLineNo">4781</span>            // Not asserting anything. Might as well break.<a name="line.4781"></a>
-<span class="sourceLineNo">4782</span>            break OUTER_LOOP;<a name="line.4782"></a>
-<span class="sourceLineNo">4783</span>          }<a name="line.4783"></a>
-<span class="sourceLineNo">4784</span>        }<a name="line.4784"></a>
-<span class="sourceLineNo">4785</span>      }<a name="line.4785"></a>
-<span class="sourceLineNo">4786</span>    } finally {<a name="line.4786"></a>
-<span class="sourceLineNo">4787</span>      s.close();<a name="line.4787"></a>
-<span class="sourceLineNo">4788</span>    }<a name="line.4788"></a>
-<span class="sourceLineNo">4789</span>  }<a name="line.4789"></a>
-<span class="sourceLineNo">4790</span><a name="line.4790"></a>
-<span class="sourceLineNo">4791</span>  /**<a name="line.4791"></a>
-<span class="sourceLineNo">4792</span>   * Test that we get the expected flush results back<a name="line.4792"></a>
-<span class="sourceLineNo">4793</span>   */<a name="line.4793"></a>
-<span class="sourceLineNo">4794</span>  @Test<a name="line.4794"></a>
-<span class="sourceLineNo">4795</span>  public void testFlushResult() throws IOException {<a name="line.4795"></a>
-<span class="sourceLineNo">4796</span>    byte[] family = Bytes.toBytes("family");<a name="line.4796"></a>
-<span class="sourceLineNo">4797</span><a name="line.4797"></a>
-<span class="sourceLineNo">4798</span>    this.region = initHRegion(tableName, method, family);<a name="line.4798"></a>
-<span class="sourceLineNo">4799</span><a name="line.4799"></a>
-<span class="sourceLineNo">4800</span>    // empty memstore, flush doesn't run<a name="line.4800"></a>
-<span class="sourceLineNo">4801</span>    HRegion.FlushResult fr = region.flush(true);<a name="line.4801"></a>
-<span class="sourceLineNo">4802</span>    assertFalse(fr.isFlushSucceeded());<a name="line.4802"></a>
-<span class="sourceLineNo">4803</span>    assertFalse(fr.isCompactionNeeded());<a name="line.4803"></a>
-<span class="sourceLineNo">4804</span><a name="line.4804"></a>
-<span class="sourceLineNo">4805</span>    // Flush enough files to get up to the threshold, doesn't need compactions<a name="line.4805"></a>
-<span class="sourceLineNo">4806</span>    for (int i = 0; i &lt; 2; i++) {<a name="line.4806"></a>
-<span class="sourceLineNo">4807</span>      Put put = new Put(tableName.toBytes()).addColumn(family, family, tableName.toBytes());<a name="line.4807"></a>
-<span class="sourceLineNo">4808</span>      region.put(put);<a name="line.4808"></a>
-<span class="sourceLineNo">4809</span>      fr = region.flush(true);<a name="line.4809"></a>
-<span class="sourceLineNo">4810</span>      assertTrue(fr.isFlushSucceeded());<a name="line.4810"></a>
-<span class="sourceLineNo">4811</span>      assertFalse(fr.isCompactionNeeded());<a name="line.4811"></a>
-<span class="sourceLineNo">4812</span>    }<a name="line.4812"></a>
-<span class="sourceLineNo">4813</span><a name="line.4813"></a>
-<span class="sourceLineNo">4814</span>    // Two flushes after the threshold, compactions are needed<a name="line.4814"></a>
-<span class="sourceLineNo">4815</span>    for (int i = 0; i &lt; 2; i++) {<a name="line.4815"></a>
-<span class="sourceLineNo">4816</span>      Put put = new Put(tableName.toBytes()).addColumn(family, family, tableName.toBytes());<a name="line.4816"></a>
-<span class="sourceLineNo">4817</span>      region.put(put);<a name="line.4817"></a>
-<span class="sourceLineNo">4818</span>      fr = region.flush(true);<a name="line.4818"></a>
-<span class="sourceLineNo">4819</span>      assertTrue(fr.isFlushSucceeded());<a name="line.4819"></a>
-<span class="sourceLineNo">4820</span>      assertTrue(fr.isCompactionNeeded());<a name="line.4820"></a>
-<span class="sourceLineNo">4821</span>    }<a name="line.4821"></a>
-<span class="sourceLineNo">4822</span>  }<a name="line.4822"></a>
+<span class="sourceLineNo">4709</span>  private void putData(int startRow, int numRows, byte[] qf, byte[]... families) throws<a name="line.4709"></a>
+<span class="sourceLineNo">4710</span>      IOException {<a name="line.4710"></a>
+<span class="sourceLineNo">4711</span>    putData(this.region, startRow, numRows, qf, families);<a name="line.4711"></a>
+<span class="sourceLineNo">4712</span>  }<a name="line.4712"></a>
+<span class="sourceLineNo">4713</span><a name="line.4713"></a>
+<span class="sourceLineNo">4714</span>  private void putData(HRegion region,<a name="line.4714"></a>
+<span class="sourceLineNo">4715</span>      int startRow, int numRows, byte[] qf, byte[]... families) throws IOException {<a name="line.4715"></a>
+<span class="sourceLineNo">4716</span>    putData(region, Durability.SKIP_WAL, startRow, numRows, qf, families);<a name="line.4716"></a>
+<span class="sourceLineNo">4717</span>  }<a name="line.4717"></a>
+<span class="sourceLineNo">4718</span><a name="line.4718"></a>
+<span class="sourceLineNo">4719</span>  static void putData(HRegion region, Durability durability,<a name="line.4719"></a>
+<span class="sourceLineNo">4720</span>      int startRow, int numRows, byte[] qf, byte[]... families) throws IOException {<a name="line.4720"></a>
+<span class="sourceLineNo">4721</span>    for (int i = startRow; i &lt; startRow + numRows; i++) {<a name="line.4721"></a>
+<span class="sourceLineNo">4722</span>      Put put = new Put(Bytes.toBytes("" + i));<a name="line.4722"></a>
+<span class="sourceLineNo">4723</span>      put.setDurability(durability);<a name="line.4723"></a>
+<span class="sourceLineNo">4724</span>      for (byte[] family : families) {<a name="line.4724"></a>
+<span class="sourceLineNo">4725</span>        put.addColumn(family, qf, null);<a name="line.4725"></a>
+<span class="sourceLineNo">4726</span>      }<a name="line.4726"></a>
+<span class="sourceLineNo">4727</span>      region.put(put);<a name="line.4727"></a>
+<span class="sourceLineNo">4728</span>      LOG.info(put.toString());<a name="line.4728"></a>
+<span class="sourceLineNo">4729</span>    }<a name="line.4729"></a>
+<span class="sourceLineNo">4730</span>  }<a name="line.4730"></a>
+<span class="sourceLineNo">4731</span><a name="line.4731"></a>
+<span class="sourceLineNo">4732</span>  static void verifyData(HRegion newReg, int startRow, int numRows, byte[] qf, byte[]... families)<a name="line.4732"></a>
+<span class="sourceLineNo">4733</span>      throws IOException {<a name="line.4733"></a>
+<span class="sourceLineNo">4734</span>    for (int i = startRow; i &lt; startRow + numRows; i++) {<a name="line.4734"></a>
+<span class="sourceLineNo">4735</span>      byte[] row = Bytes.toBytes("" + i);<a name="line.4735"></a>
+<span class="sourceLineNo">4736</span>      Get get = new Get(row);<a name="line.4736"></a>
+<span class="sourceLineNo">4737</span>      for (byte[] family : families) {<a name="line.4737"></a>
+<span class="sourceLineNo">4738</span>        get.addColumn(family, qf);<a name="line.4738"></a>
+<span class="sourceLineNo">4739</span>      }<a name="line.4739"></a>
+<span class="sourceLineNo">4740</span>      Result result = newReg.get(get);<a name="line.4740"></a>
+<span class="sourceLineNo">4741</span>      Cell[] raw = result.rawCells();<a name="line.4741"></a>
+<span class="sourceLineNo">4742</span>      assertEquals(families.length, result.size());<a name="line.4742"></a>
+<span class="sourceLineNo">4743</span>      for (int j = 0; j &lt; families.length; j++) {<a name="line.4743"></a>
+<span class="sourceLineNo">4744</span>        assertTrue(CellUtil.matchingRows(raw[j], row));<a name="line.4744"></a>
+<span class="sourceLineNo">4745</span>        assertTrue(CellUtil.matchingFamily(raw[j], families[j]));<a name="line.4745"></a>
+<span class="sourceLineNo">4746</span>        assertTrue(CellUtil.matchingQualifier(raw[j], qf));<a name="line.4746"></a>
+<span class="sourceLineNo">4747</span>      }<a name="line.4747"></a>
+<span class="sourceLineNo">4748</span>    }<a name="line.4748"></a>
+<span class="sourceLineNo">4749</span>  }<a name="line.4749"></a>
+<span class="sourceLineNo">4750</span><a name="line.4750"></a>
+<span class="sourceLineNo">4751</span>  static void assertGet(final HRegion r, final byte[] family, final byte[] k) throws IOException {<a name="line.4751"></a>
+<span class="sourceLineNo">4752</span>    // Now I have k, get values out and assert they are as expected.<a name="line.4752"></a>
+<span class="sourceLineNo">4753</span>    Get get = new Get(k).addFamily(family).readAllVersions();<a name="line.4753"></a>
+<span class="sourceLineNo">4754</span>    Cell[] results = r.get(get).rawCells();<a name="line.4754"></a>
+<span class="sourceLineNo">4755</span>    for (int j = 0; j &lt; results.length; j++) {<a name="line.4755"></a>
+<span class="sourceLineNo">4756</span>      byte[] tmp = CellUtil.cloneValue(results[j]);<a name="line.4756"></a>
+<span class="sourceLineNo">4757</span>      // Row should be equal to value every time.<a name="line.4757"></a>
+<span class="sourceLineNo">4758</span>      assertTrue(Bytes.equals(k, tmp));<a name="line.4758"></a>
+<span class="sourceLineNo">4759</span>    }<a name="line.4759"></a>
+<span class="sourceLineNo">4760</span>  }<a name="line.4760"></a>
+<span class="sourceLineNo">4761</span><a name="line.4761"></a>
+<span class="sourceLineNo">4762</span>  /*<a name="line.4762"></a>
+<span class="sourceLineNo">4763</span>   * Assert first value in the passed region is &lt;code&gt;firstValue&lt;/code&gt;.<a name="line.4763"></a>
+<span class="sourceLineNo">4764</span>   *<a name="line.4764"></a>
+<span class="sourceLineNo">4765</span>   * @param r<a name="line.4765"></a>
+<span class="sourceLineNo">4766</span>   *<a name="line.4766"></a>
+<span class="sourceLineNo">4767</span>   * @param fs<a name="line.4767"></a>
+<span class="sourceLineNo">4768</span>   *<a name="line.4768"></a>
+<span class="sourceLineNo">4769</span>   * @param firstValue<a name="line.4769"></a>
+<span class="sourceLineNo">4770</span>   *<a name="line.4770"></a>
+<span class="sourceLineNo">4771</span>   * @throws IOException<a name="line.4771"></a>
+<span class="sourceLineNo">4772</span>   */<a name="line.4772"></a>
+<span class="sourceLineNo">4773</span>  protected void assertScan(final HRegion r, final byte[] fs, final byte[] firstValue)<a name="line.4773"></a>
+<span class="sourceLineNo">4774</span>      throws IOException {<a name="line.4774"></a>
+<span class="sourceLineNo">4775</span>    byte[][] families = { fs };<a name="line.4775"></a>
+<span class="sourceLineNo">4776</span>    Scan scan = new Scan();<a name="line.4776"></a>
+<span class="sourceLineNo">4777</span>    for (int i = 0; i &lt; families.length; i++)<a name="line.4777"></a>
+<span class="sourceLineNo">4778</span>      scan.addFamily(families[i]);<a name="line.4778"></a>
+<span class="sourceLineNo">4779</span>    InternalScanner s = r.getScanner(scan);<a name="line.4779"></a>
+<span class="sourceLineNo">4780</span>    try {<a name="line.4780"></a>
+<span class="sourceLineNo">4781</span>      List&lt;Cell&gt; curVals = new ArrayList&lt;&gt;();<a name="line.4781"></a>
+<span class="sourceLineNo">4782</span>      boolean first = true;<a name="line.4782"></a>
+<span class="sourceLineNo">4783</span>      OUTER_LOOP: while (s.next(curVals)) {<a name="line.4783"></a>
+<span class="sourceLineNo">4784</span>        for (Cell kv : curVals) {<a name="line.4784"></a>
+<span class="sourceLineNo">4785</span>          byte[] val = CellUtil.cloneValue(kv);<a name="line.4785"></a>
+<span class="sourceLineNo">4786</span>          byte[] curval = val;<a name="line.4786"></a>
+<span class="sourceLineNo">4787</span>          if (first) {<a name="line.4787"></a>
+<span class="sourceLineNo">4788</span>            first = false;<a name="line.4788"></a>
+<span class="sourceLineNo">4789</span>            assertTrue(Bytes.compareTo(curval, firstValue) == 0);<a name="line.4789"></a>
+<span class="sourceLineNo">4790</span>          } else {<a name="line.4790"></a>
+<span class="sourceLineNo">4791</span>            // Not asserting anything. Might as well break.<a name="line.4791"></a>
+<span class="sourceLineNo">4792</span>            break OUTER_LOOP;<a name="line.4792"></a>
+<span class="sourceLineNo">4793</span>          }<a name="line.4793"></a>
+<span class="sourceLineNo">4794</span>        }<a name="line.4794"></a>
+<span class="sourceLineNo">4795</span>      }<a name="line.4795"></a>
+<span class="sourceLineNo">4796</span>    } finally {<a name="line.4796"></a>
+<span class="sourceLineNo">4797</span>      s.close();<a name="line.4797"></a>
+<span class="sourceLineNo">4798</span>    }<a name="line.4798"></a>
+<span class="sourceLineNo">4799</span>  }<a name="line.4799"></a>
+<span class="sourceLineNo">4800</span><a name="line.4800"></a>
+<span class="sourceLineNo">4801</span>  /**<a name="line.4801"></a>
+<span class="sourceLineNo">4802</span>   * Test that we get the expected flush results back<a name="line.4802"></a>
+<span class="sourceLineNo">4803</span>   */<a name="line.4803"></a>
+<span class="sourceLineNo">4804</span>  @Test<a name="line.4804"></a>
+<span class="sourceLineNo">4805</span>  public void testFlushResult() throws IOException {<a name="line.4805"></a>
+<span class="sourceLineNo">4806</span>    byte[] family = Bytes.toBytes("family");<a name="line.4806"></a>
+<span class="sourceLineNo">4807</span><a name="line.4807"></a>
+<span class="sourceLineNo">4808</span>    this.region = initHRegion(tableName, method, family);<a name="line.4808"></a>
+<span class="sourceLineNo">4809</span><a name="line.4809"></a>
+<span class="sourceLineNo">4810</span>    // empty memstore, flush doesn't run<a name="line.4810"></a>
+<span class="sourceLineNo">4811</span>    HRegion.FlushResult fr = region.flush(true);<a name="line.4811"></a>
+<span class="sourceLineNo">4812</span>    assertFalse(fr.isFlushSucceeded());<a name="line.4812"></a>
+<span class="sourceLineNo">4813</span>    assertFalse(fr.isCompactionNeeded());<a name="line.4813"></a>
+<span class="sourceLineNo">4814</span><a name="line.4814"></a>
+<span class="sourceLineNo">4815</span>    // Flush enough files to get up to the threshold, doesn't need compactions<a name="line.4815"></a>
+<span class="sourceLineNo">4816</span>    for (int i = 0; i &lt; 2; i++) {<a name="line.4816"></a>
+<span class="sourceLineNo">4817</span>      Put put = new Put(tableName.toBytes()).addColumn(family, family, tableName.toBytes());<a name="line.4817"></a>
+<span class="sourceLineNo">4818</span>      region.put(put);<a name="line.4818"></a>
+<span class="sourceLineNo">4819</span>      fr = region.flush(true);<a name="line.4819"></a>
+<span class="sourceLineNo">4820</span>      assertTrue(fr.isFlushSucceeded());<a name="line.4820"></a>
+<span class="sourceLineNo">4821</span>      assertFalse(fr.isCompactionNeeded());<a name="line.4821"></a>
+<span class="sourceLineNo">4822</span>    }<a name="line.4822"></a>
 <span class="sourceLineNo">4823</span><a name="line.4823"></a>
-<span class="sourceLineNo">4824</span>  protected Configuration initSplit() {<a name="line.4824"></a>
-<span class="sourceLineNo">4825</span>    // Always compact if there is more than one store file.<a name="line.4825"></a>
-<span class="sourceLineNo">4826</span>    CONF.setInt("hbase.hstore.compactionThreshold", 2);<a name="line.4826"></a>
-<span class="sourceLineNo">4827</span><a name="line.4827"></a>
-<span class="sourceLineNo">4828</span>    CONF.setInt(HConstants.HBASE_CLIENT_SCANNER_TIMEOUT_PERIOD, 10 * 1000);<a name="line.4828"></a>
-<span class="sourceLineNo">4829</span><a name="line.4829"></a>
-<span class="sourceLineNo">4830</span>    // Increase the amount of time between client retries<a name="line.4830"></a>
-<span class="sourceLineNo">4831</span>    CONF.setLong("hbase.client.pause", 15 * 1000);<a name="line.4831"></a>
-<span class="sourceLineNo">4832</span><a name="line.4832"></a>
-<span class="sourceLineNo">4833</span>    // This size should make it so we always split using the addContent<a name="line.4833"></a>
-<span class="sourceLineNo">4834</span>    // below. After adding all data, the first region is 1.3M<a name="line.4834"></a>
-<span class="sourceLineNo">4835</span>    CONF.setLong(HConstants.HREGION_MAX_FILESIZE, 1024 * 128);<a name="line.4835"></a>
-<span class="sourceLineNo">4836</span>    return CONF;<a name="line.4836"></a>
-<span class="sourceLineNo">4837</span>  }<a name="line.4837"></a>
-<span class="sourceLineNo">4838</span><a name="line.4838"></a>
-<span class="sourceLineNo">4839</span>  /**<a name="line.4839"></a>
-<span class="sourceLineNo">4840</span>   * @return A region on which you must call<a name="line.4840"></a>
-<span class="sourceLineNo">4841</span>   *         {@link HBaseTestingUtility#closeRegionAndWAL(HRegion)} when done.<a name="line.4841"></a>
-<span class="sourceLineNo">4842</span>   */<a name="line.4842"></a>
-<span class="sourceLineNo">4843</span>  protected HRegion initHRegion(TableName tableName, String callingMethod, Configuration conf,<a name="line.4843"></a>
-<span class="sourceLineNo">4844</span>      byte[]... families) throws IOException {<a name="line.4844"></a>
-<span class="sourceLineNo">4845</span>    return initHRegion(tableName, callingMethod, conf, false, families);<a name="line.4845"></a>
-<span class="sourceLineNo">4846</span>  }<a name="line.4846"></a>
-<span class="sourceLineNo">4847</span><a name="line.4847"></a>
-<span class="sourceLineNo">4848</span>  /**<a name="line.4848"></a>
-<span class="sourceLineNo">4849</span>   * @return A region on which you must call<a name="line.4849"></a>
-<span class="sourceLineNo">4850</span>   *         {@link HBaseTestingUtility#closeRegionAndWAL(HRegion)} when done.<a name="line.4850"></a>
-<span class="sourceLineNo">4851</span>   */<a name="line.4851"></a>
-<span class="sourceLineNo">4852</span>  protected HRegion initHRegion(TableName tableName, String callingMethod, Configuration conf,<a name="line.4852"></a>
-<span class="sourceLineNo">4853</span>      boolean isReadOnly, byte[]... families) throws IOException {<a name="line.4853"></a>
-<span class="sourceLineNo">4854</span>    return initHRegion(tableName, null, null, callingMethod, conf, isReadOnly, families);<a name="line.4854"></a>
-<span class="sourceLineNo">4855</span>  }<a name="line.4855"></a>
-<span class="sourceLineNo">4856</span><a name="line.4856"></a>
-<span class="sourceLineNo">4857</span>  protected HRegion initHRegion(TableName tableName, byte[] startKey, byte[] stopKey,<a name="line.4857"></a>
-<span class="sourceLineNo">4858</span>      String callingMethod, Configuration conf, boolean isReadOnly, byte[]... families)<a name="line.4858"></a>
-<span class="sourceLineNo">4859</span>      throws IOException {<a name="line.4859"></a>
-<span class="sourceLineNo">4860</span>    Path logDir = TEST_UTIL.getDataTestDirOnTestFS(callingMethod + ".log");<a name="line.4860"></a>
-<span class="sourceLineNo">4861</span>    ChunkCreator.initialize(MemStoreLABImpl.CHUNK_SIZE_DEFAULT, false, 0, 0, 0, null);<a name="line.4861"></a>
-<span class="sourceLineNo">4862</span>    HRegionInfo hri = new HRegionInfo(tableName, startKey, stopKey);<a name="line.4862"></a>
-<span class="sourceLineNo">4863</span>    final WAL wal = HBaseTestingUtility.createWal(conf, logDir, hri);<a name="line.4863"></a>
-<span class="sourceLineNo">4864</span>    return initHRegion(tableName, startKey, stopKey, isReadOnly,<a name="line.4864"></a>
-<span class="sourceLineNo">4865</span>        Durability.SYNC_WAL, wal, families);<a name="line.4865"></a>
-<span class="sourceLineNo">4866</span>  }<a name="line.4866"></a>
-<span class="sourceLineNo">4867</span><a name="line.4867"></a>
-<span class="sourceLineNo">4868</span>  /**<a name="line.4868"></a>
-<span class="sourceLineNo">4869</span>   * @return A region on which you must call<a name="line.4869"></a>
-<span class="sourceLineNo">4870</span>   *         {@link HBaseTestingUtility#closeRegionAndWAL(HRegion)} when done.<a name="line.4870"></a>
-<span class="sourceLineNo">4871</span>   */<a name="line.4871"></a>
-<span class="sourceLineNo">4872</span>  public HRegion initHRegion(TableName tableName, byte[] startKey, byte[] stopKey,<a name="line.4872"></a>
-<span class="sourceLineNo">4873</span>      boolean isReadOnly, Durability durability, WAL wal, byte[]... families) throws IOException {<a name="line.4873"></a>
-<span class="sourceLineNo">4874</span>    return TEST_UTIL.createLocalHRegion(tableName, startKey, stopKey,<a name="line.4874"></a>
-<span class="sourceLineNo">4875</span>        isReadOnly, durability, wal, families);<a name="line.4875"></a>
+<span class="sourceLineNo">4824</span>    // Two flushes after the threshold, compactions are needed<a name="line.4824"></a>
+<span class="sourceLineNo">4825</span>    for (int i = 0; i &lt; 2; i++) {<a name="line.4825"></a>
+<span class="sourceLineNo">4826</span>      Put put = new Put(tableName.toBytes()).addColumn(family, family, tableName.toBytes());<a name="line.4826"></a>
+<span class="sourceLineNo">4827</span>      region.put(put);<a name="line.4827"></a>
+<span class="sourceLineNo">4828</span>      fr = region.flush(true);<a name="line.4828"></a>
+<span class="sourceLineNo">4829</span>      assertTrue(fr.isFlushSucceeded());<a name="line.4829"></a>
+<span class="sourceLineNo">4830</span>      assertTrue(fr.isCompactionNeeded());<a name="line.4830"></a>
+<span class="sourceLineNo">4831</span>    }<a name="line.4831"></a>
+<span class="sourceLineNo">4832</span>  }<a name="line.4832"></a>
+<span class="sourceLineNo">4833</span><a name="line.4833"></a>
+<span class="sourceLineNo">4834</span>  protected Configuration initSplit() {<a name="line.4834"></a>
+<span class="sourceLineNo">4835</span>    // Always compact if there is more than one store file.<a name="line.4835"></a>
+<span class="sourceLineNo">4836</span>    CONF.setInt("hbase.hstore.compactionThreshold", 2);<a name="line.4836"></a>
+<span class="sourceLineNo">4837</span><a name="line.4837"></a>
+<span class="sourceLineNo">4838</span>    CONF.setInt(HConstants.HBASE_CLIENT_SCANNER_TIMEOUT_PERIOD, 10 * 1000);<a name="line.4838"></a>
+<span class="sourceLineNo">4839</span><a name="line.4839"></a>
+<span class="sourceLineNo">4840</span>    // Increase the amount of time between client retries<a name="line.4840"></a>
+<span class="sourceLineNo">4841</span>    CONF.setLong("hbase.client.pause", 15 * 1000);<a name="line.4841"></a>
+<span class="sourceLineNo">4842</span><a name="line.4842"></a>
+<span class="sourceLineNo">4843</span>    // This size should make it so we always split using the addContent<a name="line.4843"></a>
+<span class="sourceLineNo">4844</span>    // below. After adding all data, the first region is 1.3M<a name="line.4844"></a>
+<span class="sourceLineNo">4845</span>    CONF.setLong(HConstants.HREGION_MAX_FILESIZE, 1024 * 128);<a name="line.4845"></a>
+<span class="sourceLineNo">4846</span>    return CONF;<a name="line.4846"></a>
+<span class="sourceLineNo">4847</span>  }<a name="line.4847"></a>
+<span class="sourceLineNo">4848</span><a name="line.4848"></a>
+<span class="sourceLineNo">4849</span>  /**<a name="line.4849"></a>
+<span class="sourceLineNo">4850</span>   * @return A region on which you must call<a name="line.4850"></a>
+<span class="sourceLineNo">4851</span>   *         {@link HBaseTestingUtility#closeRegionAndWAL(HRegion)} when done.<a name="line.4851"></a>
+<span class="sourceLineNo">4852</span>   */<a name="line.4852"></a>
+<span class="sourceLineNo">4853</span>  protected HRegion initHRegion(TableName tableName, String callingMethod, Configuration conf,<a name="line.4853"></a>
+<span class="sourceLineNo">4854</span>      byte[]... families) throws IOException {<a name="line.4854"></a>
+<span class="sourceLineNo">4855</span>    return initHRegion(tableName, callingMethod, conf, false, families);<a name="line.4855"></a>
+<span class="sourceLineNo">4856</span>  }<a name="line.4856"></a>
+<span class="sourceLineNo">4857</span><a name="line.4857"></a>
+<span class="sourceLineNo">4858</span>  /**<a name="line.4858"></a>
+<span class="sourceLineNo">4859</span>   * @return A region on which you must call<a name="line.4859"></a>
+<span class="sourceLineNo">4860</span>   *         {@link HBaseTestingUtility#closeRegionAndWAL(HRegion)} when done.<a name="line.4860"></a>
+<span class="sourceLineNo">4861</span>   */<a name="line.4861"></a>
+<span class="sourceLineNo">4862</span>  protected HRegion initHRegion(TableName tableName, String callingMethod, Configuration conf,<a name="line.4862"></a>
+<span class="sourceLineNo">4863</span>      boolean isReadOnly, byte[]... families) throws IOException {<a name="line.4863"></a>
+<span class="sourceLineNo">4864</span>    return initHRegion(tableName, null, null, callingMethod, conf, isReadOnly, families);<a name="line.4864"></a>
+<span class="sourceLineNo">4865</span>  }<a name="line.4865"></a>
+<span class="sourceLineNo">4866</span><a name="line.4866"></a>
+<span class="sourceLineNo">4867</span>  protected HRegion initHRegion(TableName tableName, byte[] startKey, byte[] stopKey,<a name="line.4867"></a>
+<span class="sourceLineNo">4868</span>      String callingMethod, Configuration conf, boolean isReadOnly, byte[]... families)<a name="line.4868"></a>
+<span class="sourceLineNo">4869</span>      throws IOException {<a name="line.4869"></a>
+<span class="sourceLineNo">4870</span>    Path logDir = TEST_UTIL.getDataTestDirOnTestFS(callingMethod + ".log");<a name="line.4870"></a>
+<span class="sourceLineNo">4871</span>    ChunkCreator.initialize(MemStoreLABImpl.CHUNK_SIZE_DEFAULT, false, 0, 0, 0, null);<a name="line.4871"></a>
+<span class="sourceLineNo">4872</span>    HRegionInfo hri = new HRegionInfo(tableName, startKey, stopKey);<a name="line.4872"></a>
+<span class="sourceLineNo">4873</span>    final WAL wal = HBaseTestingUtility.createWal(conf, logDir, hri);<a name="line.4873"></a>
+<span class="sourceLineNo">4874</span>    return initHRegion(tableName, startKey, stopKey, isReadOnly,<a name="line.4874"></a>
+<span class="sourceLineNo">4875</span>        Durability.SYNC_WAL, wal, families);<a name="line.4875"></a>
 <span class="sourceLineNo">4876</span>  }<a name="line.4876"></a>
 <span class="sourceLineNo">4877</span><a name="line.4877"></a>
 <span class="sourceLineNo">4878</span>  /**<a name="line.4878"></a>
-<span class="sourceLineNo">4879</span>   * Assert that the passed in Cell has expected contents for the specified row,<a name="line.4879"></a>
-<span class="sourceLineNo">4880</span>   * column &amp; timestamp.<a name="line.4880"></a>
+<span class="sourceLineNo">4879</span>   * @return A region on which you must call<a name="line.4879"></a>
+<span class="sourceLineNo">4880</span>   *         {@link HBaseTestingUtility#closeRegionAndWAL(HRegion)} when done.<a name="line.4880"></a>
 <span class="sourceLineNo">4881</span>   */<a name="line.4881"></a>
-<span class="sourceLineNo">4882</span>  private void checkOneCell(Cell kv, byte[] cf, int rowIdx, int colIdx, long ts) {<a name="line.4882"></a>
-<span class="sourceLineNo">4883</span>    String ctx = "rowIdx=" + rowIdx + "; colIdx=" + colIdx + "; ts=" + ts;<a name="line.4883"></a>
-<span class="sourceLineNo">4884</span>    assertEquals("Row mismatch which checking: " + ctx, "row:" + rowIdx,<a name="line.4884"></a>
-<span class="sourceLineNo">4885</span>        Bytes.toString(CellUtil.cloneRow(kv)));<a name="line.4885"></a>
-<span class="sourceLineNo">4886</span>    assertEquals("ColumnFamily mismatch while checking: " + ctx, Bytes.toString(cf),<a name="line.4886"></a>
-<span class="sourceLineNo">4887</span>        Bytes.toString(CellUtil.cloneFamily(kv)));<a name="line.4887"></a>
-<span class="sourceLineNo">4888</span>    assertEquals("Column qualifier mismatch while checking: " + ctx, "column:" + colIdx,<a name="line.4888"></a>
-<span class="sourceLineNo">4889</span>        Bytes.toString(CellUtil.cloneQualifier(kv)));<a name="line.4889"></a>
-<span class="sourceLineNo">4890</span>    assertEquals("Timestamp mismatch while checking: " + ctx, ts, kv.getTimestamp());<a name="line.4890"></a>
-<span class="sourceLineNo">4891</span>    assertEquals("Value mismatch while checking: " + ctx, "value-version-" + ts,<a name="line.4891"></a>
-<span class="sourceLineNo">4892</span>        Bytes.toString(CellUtil.cloneValue(kv)));<a name="line.4892"></a>
-<span class="sourceLineNo">4893</span>  }<a name="line.4893"></a>
-<span class="sourceLineNo">4894</span><a name="line.4894"></a>
-<span class="sourceLineNo">4895</span>  @Test<a name="line.4895"></a>
-<span class="sourceLineNo">4896</span>  public void testReverseScanner_FromMemStore_SingleCF_Normal()<a name="line.4896"></a>
-<span class="sourceLineNo">4897</span>      throws IOException {<a name="line.4897"></a>
-<span class="sourceLineNo">4898</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.4898"></a>
-<span class="sourceLineNo">4899</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.4899"></a>
-<span class="sourceLineNo">4900</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.4900"></a>
-<span class="sourceLineNo">4901</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.4901"></a>
-<span class="sourceLineNo">4902</span>    byte[][] families = { cf };<a name="line.4902"></a>
-<span class="sourceLineNo">4903</span>    byte[] col = Bytes.toBytes("C");<a name="line.4903"></a>
-<span class="sourceLineNo">4904</span>    long ts = 1;<a name="line.4904"></a>
-<span class="sourceLineNo">4905</span>    this.region = initHRegion(tableName, method, families);<a name="line.4905"></a>
-<span class="sourceLineNo">4906</span>    KeyValue kv1 = new KeyValue(rowC, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4906"></a>
-<span class="sourceLineNo">4907</span>    KeyValue kv11 = new KeyValue(rowC, cf, col, ts + 1, KeyValue.Type.Put,<a name="line.4907"></a>
-<span class="sourceLineNo">4908</span>        null);<a name="line.4908"></a>
-<span class="sourceLineNo">4909</span>    KeyValue kv2 = new KeyValue(rowA, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4909"></a>
-<span class="sourceLineNo">4910</span>    KeyValue kv3 = new KeyValue(rowB, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4910"></a>
-<span class="sourceLineNo">4911</span>    Put put = null;<a name="line.4911"></a>
-<span class="sourceLineNo">4912</span>    put = new Put(rowC);<a name="line.4912"></a>
-<span class="sourceLineNo">4913</span>    put.add(kv1);<a name="line.4913"></a>
-<span class="sourceLineNo">4914</span>    put.add(kv11);<a name="line.4914"></a>
-<span class="sourceLineNo">4915</span>    region.put(put);<a name="line.4915"></a>
-<span class="sourceLineNo">4916</span>    put = new Put(rowA);<a name="line.4916"></a>
-<span class="sourceLineNo">4917</span>    put.add(kv2);<a name="line.4917"></a>
-<span class="sourceLineNo">4918</span>    region.put(put);<a name="line.4918"></a>
-<span class="sourceLineNo">4919</span>    put = new Put(rowB);<a name="line.4919"></a>
-<span class="sourceLineNo">4920</span>    put.add(kv3);<a name="line.4920"></a>
-<span class="sourceLineNo">4921</span>    region.put(put);<a name="line.4921"></a>
-<span class="sourceLineNo">4922</span><a name="line.4922"></a>
-<span class="sourceLineNo">4923</span>    Scan scan = new Scan(rowC);<a name="line.4923"></a>
-<span class="sourceLineNo">4924</span>    scan.setMaxVersions(5);<a name="line.4924"></a>
-<span class="sourceLineNo">4925</span>    scan.setReversed(true);<a name="line.4925"></a>
-<span class="sourceLineNo">4926</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.4926"></a>
-<span class="sourceLineNo">4927</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.4927"></a>
-<span class="sourceLineNo">4928</span>    boolean hasNext = scanner.next(currRow);<a name="line.4928"></a>
-<span class="sourceLineNo">4929</span>    assertEquals(2, currRow.size());<a name="line.4929"></a>
-<span class="sourceLineNo">4930</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4930"></a>
-<span class="sourceLineNo">4931</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.4931"></a>
-<span class="sourceLineNo">4932</span>    assertTrue(hasNext);<a name="line.4932"></a>
-<span class="sourceLineNo">4933</span>    currRow.clear();<a name="line.4933"></a>
-<span class="sourceLineNo">4934</span>    hasNext = scanner.next(currRow);<a name="line.4934"></a>
-<span class="sourceLineNo">4935</span>    assertEquals(1, currRow.size());<a name="line.4935"></a>
-<span class="sourceLineNo">4936</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4936"></a>
-<span class="sourceLineNo">4937</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.4937"></a>
-<span class="sourceLineNo">4938</span>    assertTrue(hasNext);<a name="line.4938"></a>
-<span class="sourceLineNo">4939</span>    currRow.clear();<a name="line.4939"></a>
-<span class="sourceLineNo">4940</span>    hasNext = scanner.next(currRow);<a name="line.4940"></a>
-<span class="sourceLineNo">4941</span>    assertEquals(1, currRow.size());<a name="line.4941"></a>
-<span class="sourceLineNo">4942</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4942"></a>
-<span class="sourceLineNo">4943</span>        .get(0).getRowLength(), rowA, 0, rowA.length));<a name="line.4943"></a>
-<span class="sourceLineNo">4944</span>    assertFalse(hasNext);<a name="line.4944"></a>
-<span class="sourceLineNo">4945</span>    scanner.close();<a name="line.4945"></a>
-<span class="sourceLineNo">4946</span>  }<a name="line.4946"></a>
-<span class="sourceLineNo">4947</span><a name="line.4947"></a>
-<span class="sourceLineNo">4948</span>  @Test<a name="line.4948"></a>
-<span class="sourceLineNo">4949</span>  public void testReverseScanner_FromMemStore_SingleCF_LargerKey()<a name="line.4949"></a>
-<span class="sourceLineNo">4950</span>      throws IOException {<a name="line.4950"></a>
-<span class="sourceLineNo">4951</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.4951"></a>
-<span class="sourceLineNo">4952</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.4952"></a>
-<span class="sourceLineNo">4953</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.4953"></a>
-<span class="sourceLineNo">4954</span>    byte[] rowD = Bytes.toBytes("rowD");<a name="line.4954"></a>
-<span class="sourceLineNo">4955</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.4955"></a>
-<span class="sourceLineNo">4956</span>    byte[][] families = { cf };<a name="line.4956"></a>
-<span class="sourceLineNo">4957</span>    byte[] col = Bytes.toBytes("C");<a name="line.4957"></a>
-<span class="sourceLineNo">4958</span>    long ts = 1;<a name="line.4958"></a>
-<span class="sourceLineNo">4959</span>    this.region = initHRegion(tableName, method, families);<a name="line.4959"></a>
-<span class="sourceLineNo">4960</span>    KeyValue kv1 = new KeyValue(rowC, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4960"></a>
-<span class="sourceLineNo">4961</span>    KeyValue kv11 = new KeyValue(rowC, cf, col, ts + 1, KeyValue.Type.Put,<a name="line.4961"></a>
-<span class="sourceLineNo">4962</span>        null);<a name="line.4962"></a>
-<span class="sourceLineNo">4963</span>    KeyValue kv2 = new KeyValue(rowA, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4963"></a>
-<span class="sourceLineNo">4964</span>    KeyValue kv3 = new KeyValue(rowB, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4964"></a>
-<span class="sourceLineNo">4965</span>    Put put = null;<a name="line.4965"></a>
-<span class="sourceLineNo">4966</span>    put = new Put(rowC);<a name="line.4966"></a>
-<span class="sourceLineNo">4967</span>    put.add(kv1);<a name="line.4967"></a>
-<span class="sourceLineNo">4968</span>    put.add(kv11);<a name="line.4968"></a>
-<span class="sourceLineNo">4969</span>    region.put(put);<a name="line.4969"></a>
-<span class="sourceLineNo">4970</span>    put = new Put(rowA);<a name="line.4970"></a>
-<span class="sourceLineNo">4971</span>    put.add(kv2);<a name="line.4971"></a>
-<span class="sourceLineNo">4972</span>    region.put(put);<a name="line.4972"></a>
-<span class="sourceLineNo">4973</span>    put = new Put(rowB);<a name="line.4973"></a>
-<span class="sourceLineNo">4974</span>    put.add(kv3);<a name="line.4974"></a>
-<span class="sourceLineNo">4975</span>    region.put(put);<a name="line.4975"></a>
-<span class="sourceLineNo">4976</span><a name="line.4976"></a>
-<span class="sourceLineNo">4977</span>    Scan scan = new Scan(rowD);<a name="line.4977"></a>
-<span class="sourceLineNo">4978</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.4978"></a>
-<span class="sourceLineNo">4979</span>    scan.setReversed(true);<a name="line.4979"></a>
-<span class="sourceLineNo">4980</span>    scan.setMaxVersions(5);<a name="line.4980"></a>
-<span class="sourceLineNo">4981</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.4981"></a>
-<span class="sourceLineNo">4982</span>    boolean hasNext = scanner.next(currRow);<a name="line.4982"></a>
-<span class="sourceLineNo">4983</span>    assertEquals(2, currRow.size());<a name="line.4983"></a>
-<span class="sourceLineNo">4984</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4984"></a>
-<span class="sourceLineNo">4985</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.4985"></a>
-<span class="sourceLineNo">4986</span>    assertTrue(hasNext);<a name="line.4986"></a>
-<span class="sourceLineNo">4987</span>    currRow.clear();<a name="line.4987"></a>
-<span class="sourceLineNo">4988</span>    hasNext = scanner.next(currRow);<a name="line.4988"></a>
-<span class="sourceLineNo">4989</span>    assertEquals(1, currRow.size());<a name="line.4989"></a>
-<span class="sourceLineNo">4990</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4990"></a>
-<span class="sourceLineNo">4991</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.4991"></a>
-<span class="sourceLineNo">4992</span>    assertTrue(hasNext);<a name="line.4992"></a>
-<span class="sourceLineNo">4993</span>    currRow.clear();<a name="line.4993"></a>
-<span class="sourceLineNo">4994</span>    hasNext = scanner.next(currRow);<a name="line.4994"></a>
-<span class="sourceLineNo">4995</span>    assertEquals(1, currRow.size());<a name="line.4995"></a>
-<span class="sourceLineNo">4996</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4996"></a>
-<span class="sourceLineNo">4997</span>        .get(0).getRowLength(), rowA, 0, rowA.length));<a name="line.4997"></a>
-<span class="sourceLineNo">4998</span>    assertFalse(hasNext);<a name="line.4998"></a>
-<span class="sourceLineNo">4999</span>    scanner.close();<a name="line.4999"></a>
-<span class="sourceLineNo">5000</span>  }<a name="line.5000"></a>
-<span class="sourceLineNo">5001</span><a name="line.5001"></a>
-<span class="sourceLineNo">5002</span>  @Test<a name="line.5002"></a>
-<span class="sourceLineNo">5003</span>  public void testReverseScanner_FromMemStore_SingleCF_FullScan()<a name="line.5003"></a>
-<span class="sourceLineNo">5004</span>      throws IOException {<a name="line.5004"></a>
-<span class="sourceLineNo">5005</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.5005"></a>
-<span class="sourceLineNo">5006</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.5006"></a>
-<span class="sourceLineNo">5007</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.5007"></a>
-<span class="sourceLineNo">5008</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.5008"></a>
-<span class="sourceLineNo">5009</span>    byte[][] families = { cf };<a name="line.5009"></a>
-<span class="sourceLineNo">5010</span>    byte[] col = Bytes.toBytes("C");<a name="line.5010"></a>
-<span class="sourceLineNo">5011</span>    long ts = 1;<a name="line.5011"></a>
-<span class="sourceLineNo">5012</span>    this.region = initHRegion(tableName, method, families);<a name="line.5012"></a>
-<span class="sourceLineNo">5013</span>    KeyValue kv1 = new KeyValue(rowC, cf, col, ts, KeyValue.Type.Put, null);<a name="line.5013"></a>
-<span class="sourceLineNo">5014</span>    KeyValue kv11 = new KeyValue(rowC, cf, col, ts + 1, KeyValue.Type.Put,<a name="line.5014"></a>
-<span class="sourceLineNo">5015</span>        null);<a name="line.5015"></a>
-<span class="sourceLineNo">5016</span>    KeyValue kv2 = new KeyValue(rowA, cf, col, ts, KeyValue.Type.Put, null);<a name="line.5016"></a>
-<span class="sourceLineNo">5017</span>    KeyValue kv3 = new KeyValue(rowB, cf, col, ts, KeyValue.Type.Put, null);<a name="line.5017"></a>
-<span class="sourceLineNo">5018</span>    Put put = null;<a name="line.5018"></a>
-<span class="sourceLineNo">5019</span>    put = new Put(rowC);<a name="line.5019"></a>
-<span class="sourceLineNo">5020</span>    put.add(kv1);<a name="line.5020"></a>
-<span class="sourceLineNo">5021</span>    put.add(kv11);<a name="line.5021"></a>
-<span class="sourceLineNo">5022</span>    region.put(put);<a name="line.5022"></a>
-<span class="sourceLineNo">5023</span>    put = new Put(rowA);<a name="line.5023"></a>
-<span class="sourceLineNo">5024</span>    put.add(kv2);<a name="line.5024"></a>
-<span class="sourceLineNo">5025</span>    region.put(put);<a name="line.5025"></a>
-<span class="sourceLineNo">5026</span>    put = new Put(rowB);<a name="line.5026"></a>
-<span class="sourceLineNo">5027</span>    put.add(kv3);<a name="line.5027"></a>
-<span class="sourceLineNo">5028</span>    region.put(put);<a name="line.5028"></a>
-<span class="sourceLineNo">5029</span>    Scan scan = new Scan();<a name="line.5029"></a>
-<span class="sourceLineNo">5030</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5030"></a>
-<span class="sourceLineNo">5031</span>    scan.setReversed(true);<a name="line.5031"></a>
-<span class="sourceLineNo">5032</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5032"></a>
-<span class="sourceLineNo">5033</span>    boolean hasNext = scanner.next(currRow);<a name="line.5033"></a>
-<span class="sourceLineNo">5034</span>    assertEquals(1, currRow.size());<a name="line.5034"></a>
-<span class="sourceLineNo">5035</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5035"></a>
-<span class="sourceLineNo">5036</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.5036"></a>
-<span class="sourceLineNo">5037</span>    assertTrue(hasNext);<a name="line.5037"></a>
-<span class="sourceLineNo">5038</span>    currRow.clear();<a name="line.5038"></a>
-<span class="sourceLineNo">5039</span>    hasNext = scanner.next(currRow);<a name="line.5039"></a>
-<span class="sourceLineNo">5040</span>    assertEquals(1, currRow.size());<a name="line.5040"></a>
-<span class="sourceLineNo">5041</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5041"></a>
-<span class="sourceLineNo">5042</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.5042"></a>
-<span class="sourceLineNo">5043</span>    assertTrue(hasNext);<a name="line.5043"></a>
-<span class="sourceLineNo">5044</span>    currRow.clear();<a name="line.5044"></a>
-<span class="sourceLineNo">5045</span>    hasNext = scanner.next(currRow);<a name="line.5045"></a>
-<span class="sourceLineNo">5046</span>    assertEquals(1, currRow.size());<a name="line.5046"></a>
-<span class="sourceLineNo">5047</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5047"></a>
-<span class="sourceLineNo">5048</span>        .get(0).getRowLength(), rowA, 0, rowA.length));<a name="line.5048"></a>
-<span class="sourceLineNo">5049</span>    assertFalse(hasNext);<a name="line.5049"></a>
-<span class="sourceLineNo">5050</span>    scanner.close();<a name="line.5050"></a>
-<span class="sourceLineNo">5051</span>  }<a name="line.5051"></a>
-<span class="sourceLineNo">5052</span><a name="line.5052"></a>
-<span class="sourceLineNo">5053</span>  @Test<a name="line.5053"></a>
-<span class="sourceLineNo">5054</span>  public void testReverseScanner_moreRowsMayExistAfter() throws IOException {<a name="line.5054"></a>
-<span class="sourceLineNo">5055</span>    // case for "INCLUDE_AND_SEEK_NEXT_ROW &amp; SEEK_NEXT_ROW" endless loop<a name="line.5055"></a>
-<span class="sourceLineNo">5056</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.5056"></a>
-<span class="sourceLineNo">5057</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.5057"></a>
-<span class="sourceLineNo">5058</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.5058"></a>
-<span class="sourceLineNo">5059</span>    byte[] rowD = Bytes.toBytes("rowD");<a name="line.5059"></a>
-<span class="sourceLineNo">5060</span>    byte[] rowE = Bytes.toBytes("rowE");<a name="line.5060"></a>
-<span class="sourceLineNo">5061</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.5061"></a>
-<span class="sourceLineNo">5062</span>    byte[][] families = { cf };<a name="line.5062"></a>
-<span class="sourceLineNo">5063</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.5063"></a>
-<span class="sourceLineNo">5064</span>    byte[] col2 = Bytes.toBytes("col2");<a name="line.5064"></a>
-<span class="sourceLineNo">5065</span>    long ts = 1;<a name="line.5065"></a>
-<span class="sourceLineNo">5066</span>    this.region = initHRegion(tableName, method, families);<a name="line.5066"></a>
-<span class="sourceLineNo">5067</span>    KeyValue kv1 = new KeyValue(rowA, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5067"></a>
-<span class="sourceLineNo">5068</span>    KeyValue kv2 = new KeyValue(rowB, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5068"></a>
-<span class="sourceLineNo">5069</span>    KeyValue kv3 = new KeyValue(rowC, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5069"></a>
-<span class="sourceLineNo">5070</span>    KeyValue kv4_1 = new KeyValue(rowD, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5070"></a>
-<span class="sourceLineNo">5071</span>    KeyValue kv4_2 = new KeyValue(rowD, cf, col2, ts, KeyValue.Type.Put, null);<a name="line.5071"></a>
-<span class="sourceLineNo">5072</span>    KeyValue kv5 = new KeyValue(rowE, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5072"></a>
-<span class="sourceLineNo">5073</span>    Put put = null;<a name="line.5073"></a>
-<span class="sourceLineNo">5074</span>    put = new Put(rowA);<a name="line.5074"></a>
-<span class="sourceLineNo">5075</span>    put.add(kv1);<a name="line.5075"></a>
-<span class="sourceLineNo">5076</span>    region.put(put);<a name="line.5076"></a>
-<span class="sourceLineNo">5077</span>    put = new Put(rowB);<a name="line.5077"></a>
-<span class="sourceLineNo">5078</span>    put.add(kv2);<a name="line.5078"></a>
-<span class="sourceLineNo">5079</span>    region.put(put);<a name="line.5079"></a>
-<span class="sourceLineNo">5080</span>    put = new Put(rowC);<a name="line.5080"></a>
-<span class="sourceLineNo">5081</span>    put.add(kv3);<a name="line.5081"></a>
-<span class="sourceLineNo">5082</span>    region.put(put);<a name="line.5082"></a>
-<span class="sourceLineNo">5083</span>    put = new Put(rowD);<a name="line.5083"></a>
-<span class="sourceLineNo">5084</span>    put.add(kv4_1);<a name="line.5084"></a>
-<span class="sourceLineNo">5085</span>    region.put(put);<a name="line.5085"></a>
-<span class="sourceLineNo">5086</span>    put = new Put(rowD);<a name="line.5086"></a>
-<span class="sourceLineNo">5087</span>    put.add(kv4_2);<a name="line.5087"></a>
-<span class="sourceLineNo">5088</span>    region.put(put);<a name="line.5088"></a>
-<span class="sourceLineNo">5089</span>    put = new Put(rowE);<a name="line.5089"></a>
-<span class="sourceLineNo">5090</span>    put.add(kv5);<a name="line.5090"></a>
-<span class="sourceLineNo">5091</span>    region.put(put);<a name="line.5091"></a>
-<span class="sourceLineNo">5092</span>    region.flush(true);<a name="line.5092"></a>
-<span class="sourceLineNo">5093</span>    Scan scan = new Scan(rowD, rowA);<a name="line.5093"></a>
-<span class="sourceLineNo">5094</span>    scan.addColumn(families[0], col1);<a name="line.5094"></a>
-<span class="sourceLineNo">5095</span>    scan.setReversed(true);<a name="line.5095"></a>
-<span class="sourceLineNo">5096</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5096"></a>
-<span class="sourceLineNo">5097</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5097"></a>
-<span class="sourceLineNo">5098</span>    boolean hasNext = scanner.next(currRow);<a name="line.5098"></a>
-<span class="sourceLineNo">5099</span>    assertEquals(1, currRow.size());<a name="line.5099"></a>
-<span class="sourceLineNo">5100</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5100"></a>
-<span class="sourceLineNo">5101</span>        .get(0).getRowLength(), rowD, 0, rowD.length));<a name="line.5101"></a>
-<span class="sourceLineNo">5102</span>    assertTrue(hasNext);<a name="line.5102"></a>
-<span class="sourceLineNo">5103</span>    currRow.clear();<a name="line.5103"></a>
-<span class="sourceLineNo">5104</span>    hasNext = scanner.next(currRow);<a name="line.5104"></a>
-<span class="sourceLineNo">5105</span>    assertEquals(1, currRow.size());<a name="line.5105"></a>
-<span class="sourceLineNo">5106</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5106"></a>
-<span class="sourceLineNo">5107</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.5107"></a>
-<span class="sourceLineNo">5108</span>    assertTrue(hasNext);<a name="line.5108"></a>
-<span class="sourceLineNo">5109</span>    currRow.clear();<a name="line.5109"></a>
-<span class="sourceLineNo">5110</span>    hasNext = scanner.next(currRow);<a name="line.5110"></a>
-<span class="sourceLineNo">5111</span>    assertEquals(1, currRow.size());<a name="line.5111"></a>
-<span class="sourceLineNo">5112</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5112"></a>
-<span class="sourceLineNo">5113</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.5113"></a>
-<span class="sourceLineNo">5114</span>    assertFalse(hasNext);<a name="line.5114"></a>
-<span class="sourceLineNo">5115</span>    scanner.close();<a name="line.5115"></a>
-<span class="sourceLineNo">5116</span><a name="line.5116"></a>
-<span class="sourceLineNo">5117</span>    scan = new Scan(rowD, rowA);<a name="line.5117"></a>
-<span class="sourceLineNo">5118</span>    scan.addColumn(families[0], col2);<a name="line.5118"></a>
-<span class="sourceLineNo">5119</span>    scan.setReversed(true);<a name="line.5119"></a>
-<span class="sourceLineNo">5120</span>    currRow.clear();<a name="line.5120"></a>
-<span class="sourceLineNo">5121</span>    scanner = region.getScanner(scan);<a name="line.5121"></a>
-<span class="sourceLineNo">5122</span>    hasNext = scanner.next(currRow);<a name="line.5122"></a>
-<span class="sourceLineNo">5123</span>    assertEquals(1, currRow.size());<a name="line.5123"></a>
-<span class="sourceLineNo">5124</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5124"></a>
-<span class="sourceLineNo">5125</span>        .get(0).getRowLength(), rowD, 0, rowD.length));<a name="line.5125"></a>
-<span class="sourceLineNo">5126</span>    scanner.close();<a name="line.5126"></a>
-<span class="sourceLineNo">5127</span>  }<a name="line.5127"></a>
-<span class="sourceLineNo">5128</span><a name="line.5128"></a>
-<span class="sourceLineNo">5129</span>  @Test<a name="line.5129"></a>
-<span class="sourceLineNo">5130</span>  public void testReverseScanner_smaller_blocksize() throws IOException {<a name="line.5130"></a>
-<span class="sourceLineNo">5131</span>    // case to ensure no conflict with HFile index optimization<a name="line.5131"></a>
-<span class="sourceLineNo">5132</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.5132"></a>
-<span class="sourceLineNo">5133</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.5133"></a>
-<span class="sourceLineNo">5134</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.5134"></a>
-<span class="sourceLineNo">5135</span>    byte[] rowD = Bytes.toBytes("rowD");<a name="line.5135"></a>
-<span class="sourceLineNo">5136</span>    byte[] rowE = Bytes.toBytes("rowE");<a name="line.5136"></a>
-<span class="sourceLineNo">5137</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.5137"></a>
-<span class="sourceLineNo">5138</span>    byte[][] families = { cf };<a name="line.5138"></a>
-<span class="sourceLineNo">5139</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.5139"></a>
-<span class="sourceLineNo">5140</span>    byte[] col2 = Bytes.toBytes("col2");<a name="line.5140"></a>
-<span class="sourceLineNo">5141</span>    long ts = 1;<a name="line.5141"></a>
-<span class="sourceLineNo">5142</span>    HBaseConfiguration config = new HBaseConfiguration();<a name="line.5142"></a>
-<span class="sourceLineNo">5143</span>    config.setInt("test.block.size", 1);<a name="line.5143"></a>
-<span class="sourceLineNo">5144</span>    this.region = initHRegion(tableName, method, config, families);<a name="line.5144"></a>
-<span class="sourceLineNo">5145</span>    KeyValue kv1 = new KeyValue(rowA, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5145"></a>
-<span class="sourceLineNo">5146</span>    KeyValue kv2 = new KeyValue(rowB, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5146"></a>
-<span class="sourceLineNo">5147</span>    KeyValue kv3 = new KeyValue(rowC, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5147"></a>
-<span class="sourceLineNo">5148</span>    KeyValue kv4_1 = new KeyValue(rowD, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5148"></a>
-<span class="sourceLineNo">5149</span>    KeyValue kv4_2 = new KeyValue(rowD, cf, col2, ts, KeyValue.Type.Put, null);<a name="line.5149"></a>
-<span class="sourceLineNo">5150</span>    KeyValue kv5 = new KeyValue(rowE, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5150"></a>
-<span class="sourceLineNo">5151</span>    Put put = null;<a name="line.5151"></a>
-<span class="sourceLineNo">5152</span>    put = new Put(rowA);<a name="line.5152"></a>
-<span class="sourceLineNo">5153</span>    put.add(kv1);<a name="line.5153"></a>
-<span class="sourceLineNo">5154</span>    region.put(put);<a name="line.5154"></a>
-<span class="sourceLineNo">5155</span>    put = new Put(rowB);<a name="line.5155"></a>
-<span class="sourceLineNo">5156</span>    put.add(kv2);<a name="line.5156"></a>
-<span class="sourceLineNo">5157</span>    region.put(put);<a name="line.5157"></a>
-<span class="sourceLineNo">5158</span>    put = new Put(rowC);<a name="line.5158"></a>
-<span class="sourceLineNo">5159</span>    put.add(kv3);<a name="line.5159"></a>
-<span class="sourceLineNo">5160</span>    region.put(put);<a name="line.5160"></a>
-<span class="sourceLineNo">5161</span>    put = new Put(rowD);<a name="line.5161"></a>
-<span class="sourceLineNo">5162</span>    put.add(kv4_1);<a name="line.5162"></a>
-<span class="sourceLineNo">5163</span>    region.put(put);<a name="line.5163"></a>
-<span class="sourceLineNo">5164</span>    put = new Put(rowD);<a name="line.5164"></a>
-<span class="sourceLineNo">5165</span>    put.add(kv4_2);<a name="line.5165"></a>
-<span class="sourceLineNo">5166</span>    region.put(put);<a name="line.5166"></a>
-<span class="sourceLineNo">5167</span>    put = new Put(rowE);<a name="line.5167"></a>
-<span class="sourceLineNo">5168</span>    put.add(kv5);<a name="line.5168"></a>
-<span class="sourceLineNo">5169</span>    region.put(put);<a name="line.5169"></a>
-<span class="sourceLineNo">5170</span>    region.flush(true);<a name="line.5170"></a>
-<span class="sourceLineNo">5171</span>    Scan scan = new Scan(rowD, rowA);<a name="line.5171"></a>
-<span class="sourceLineNo">5172</span>    scan.addColumn(families[0], col1);<a name="line.5172"></a>
-<span class="sourceLineNo">5173</span>    scan.setReversed(true);<a name="line.5173"></a>
-<span class="sourceLineNo">5174</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5174"></a>
-<span class="sourceLineNo">5175</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5175"></a>
-<span class="sourceLineNo">5176</span>    boolean hasNext = scanner.next(currRow);<a name="line.5176"></a>
-<span class="sourceLineNo">5177</span>    assertEquals(1, currRow.size());<a name="line.5177"></a>
-<span class="sourceLineNo">5178</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5178"></a>
-<span class="sourceLineNo">5179</span>        .get(0).getRowLength(), rowD, 0, rowD.length));<a name="line.5179"></a>
-<span class="sourceLineNo">5180</span>    assertTrue(hasNext);<a name="line.5180"></a>
-<span class="sourceLineNo">5181</span>    currRow.clear();<a name="line.5181"></a>
-<span class="sourceLineNo">5182</span>    hasNext = scanner.next(currRow);<a name="line.5182"></a>
-<span class="sourceLineNo">5183</span>    assertEquals(1, currRow.size());<a name="line.5183"></a>
-<span class="sourceLineNo">5184</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5184"></a>
-<span class="sourceLineNo">5185</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.5185"></a>
-<span class="sourceLineNo">5186</span>    assertTrue(hasNext);<a name="line.5186"></a>
-<span class="sourceLineNo">5187</span>    currRow.clear();<a name="line.5187"></a>
-<span class="sourceLineNo">5188</span>    hasNext = scanner.next(currRow);<a name="line.5188"></a>
-<span class="sourceLineNo">5189</span>    assertEquals(1, currRow.size());<a name="line.5189"></a>
-<span class="sourceLineNo">5190</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5190"></a>
-<span class="sourceLineNo">5191</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.5191"></a>
-<span class="sourceLineNo">5192</span>    assertFalse(hasNext);<a name="line.5192"></a>
-<span class="sourceLineNo">5193</span>    scanner.close();<a name="line.5193"></a>
-<span class="sourceLineNo">5194</span><a name="line.5194"></a>
-<span class="sourceLineNo">5195</span>    scan = new Scan(rowD, rowA);<a name="line.5195"></a>
-<span class="sourceLineNo">5196</span>    scan.addColumn(families[0], col2);<a name="line.5196"></a>
-<span class="sourceLineNo">5197</span>    scan.setReversed(true);<a name="line.5197"></a>
-<span class="sourceLineNo">5198</span>    currRow.clear();<a name="line.5198"></a>
-<span class="sourceLineNo">5199</span>    scanner = region.getScanner(scan);<a name="line.5199"></a>
-<span class="sourceLineNo">5200</span>    hasNext = scanner.next(currRow);<a name="line.5200"></a>
-<span class="sourceLineNo">5201</span>    assertEquals(1, currRow.size());<a name="line.5201"></a>
-<span class="sourceLineNo">5202</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5202"></a>
-<span class="sourceLineNo">5203</span>        .get(0).getRowLength(), rowD, 0, rowD.length));<a name="line.5203"></a>
-<span class="sourceLineNo">5204</span>    scanner.close();<a name="line.5204"></a>
-<span class="sourceLineNo">5205</span>  }<a name="line.5205"></a>
-<span class="sourceLineNo">5206</span><a name="line.5206"></a>
-<span class="sourceLineNo">5207</span>  @Test<a name="line.5207"></a>
-<span class="sourceLineNo">5208</span>  public void testReverseScanner_FromMemStoreAndHFiles_MultiCFs1()<a name="line.5208"></a>
-<span class="sourceLineNo">5209</span>      throws IOException {<a name="line.5209"></a>
-<span class="sourceLineNo">5210</span>    byte[] row0 = Bytes.toBytes("row0"); // 1 kv<a name="line.5210"></a>
-<span class="sourceLineNo">5211</span>    byte[] row1 = Bytes.toBytes("row1"); // 2 kv<a name="line.5211"></a>
-<span class="sourceLineNo">5212</span>    byte[] row2 = Bytes.toBytes("row2"); // 4 kv<a name="line.5212"></a>
-<span class="sourceLineNo">5213</span>    byte[] row3 = Bytes.toBytes("row3"); // 2 kv<a name="line.5213"></a>
-<span class="sourceLineNo">5214</span>    byte[] row4 = Bytes.toBytes("row4"); // 5 kv<a name="line.5214"></a>
-<span class="sourceLineNo">5215</span>    byte[] row5 = Bytes.toBytes("row5"); // 2 kv<a name="line.5215"></a>
-<span class="sourceLineNo">5216</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5216"></a>
-<span class="sourceLineNo">5217</span>    byte[] cf2 = Bytes.toBytes("CF2");<a name="line.5217"></a>
-<span class="sourceLineNo">5218</span>    byte[] cf3 = Bytes.toBytes("CF3");<a name="line.5218"></a>
-<span class="sourceLineNo">5219</span>    byte[][] families = { cf1, cf2, cf3 };<a name="line.5219"></a>
-<span class="sourceLineNo">5220</span>    byte[] col = Bytes.toBytes("C");<a name="line.5220"></a>
-<span class="sourceLineNo">5221</span>    long ts = 1;<a name="line.5221"></a>
-<span class="sourceLineNo">5222</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5222"></a>
-<span class="sourceLineNo">5223</span>    // disable compactions in this test.<a name="line.5223"></a>
-<span class="sourceLineNo">5224</span>    conf.setInt("hbase.hstore.compactionThreshold", 10000);<a name="line.5224"></a>
-<span class="sourceLineNo">5225</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5225"></a>
-<span class="sourceLineNo">5226</span>    // kv naming style: kv(row number) totalKvCountInThisRow seq no<a name="line.5226"></a>
-<span class="sourceLineNo">5227</span>    KeyValue kv0_1_1 = new KeyValue(row0, cf1, col, ts, KeyValue.Type.Put,<a name="line.5227"></a>
-<span class="sourceLineNo">5228</span>        null);<a name="line.5228"></a>
-<span class="sourceLineNo">5229</span>    KeyValue kv1_2_1 = new KeyValue(row1, cf2, col, ts, KeyValue.Type.Put,<a name="line.5229"></a>
-<span class="sourceLineNo">5230</span>        null);<a name="line.5230"></a>
-<span class="sourceLineNo">5231</span>    KeyValue kv1_2_2 = new KeyValue(row1, cf1, col, ts + 1,<a name="line.5231"></a>
-<span class="sourceLineNo">5232</span>        KeyValue.Type.Put, null);<a name="line.5232"></a>
-<span class="sourceLineNo">5233</span>    KeyValue kv2_4_1 = new KeyValue(row2, cf2, col, ts, KeyValue.Type.Put,<a name="line.5233"></a>
-<span class="sourceLineNo">5234</span>        null);<a name="line.5234"></a>
-<span class="sourceLineNo">5235</span>    KeyValue kv2_4_2 = new KeyValue(row2, cf1, col, ts, KeyValue.Type.Put,<a name="line.5235"></a>
-<span class="sourceLineNo">5236</span>        null);<a name="line.5236"></a>
-<span class="sourceLineNo">5237</span>    KeyValue kv2_4_3 = new KeyValue(row2, cf3, col, ts, KeyValue.Type.Put,<a name="line.5237"></a>
+<span class="sourceLineNo">4882</span>  public HRegion initHRegion(TableName tableName, byte[] startKey, byte[] stopKey,<a name="line.4882"></a>
+<span class="sourceLineNo">4883</span>      boolean isReadOnly, Durability durability, WAL wal, byte[]... families) throws IOException {<a name="line.4883"></a>
+<span class="sourceLineNo">4884</span>    return TEST_UTIL.createLocalHRegion(tableName, startKey, stopKey,<a name="line.4884"></a>
+<span class="sourceLineNo">4885</span>        isReadOnly, durability, wal, families);<a name="line.4885"></a>
+<span class="sourceLineNo">4886</span>  }<a name="line.4886"></a>
+<span class="sourceLineNo">4887</span><a name="line.4887"></a>
+<span class="sourceLineNo">4888</span>  /**<a name="line.4888"></a>
+<span class="sourceLineNo">4889</span>   * Assert that the passed in Cell has expected contents for the specified row,<a name="line.4889"></a>
+<span class="sourceLineNo">4890</span>   * column &amp; timestamp.<a name="line.4890"></a>
+<span class="sourceLineNo">4891</span>   */<a name="line.4891"></a>
+<span class="sourceLineNo">4892</span>  private void checkOneCell(Cell kv, byte[] cf, int rowIdx, int colIdx, long ts) {<a name="line.4892"></a>
+<span class="sourceLineNo">4893</span>    String ctx = "rowIdx=" + rowIdx + "; colIdx=" + colIdx + "; ts=" + ts;<a name="line.4893"></a>
+<span class="sourceLineNo">4894</span>    assertEquals("Row mismatch which checking: " + ctx, "row:" + rowIdx,<a name="line.4894"></a>
+<span class="sourceLineNo">4895</span>        Bytes.toString(CellUtil.cloneRow(kv)));<a name="line.4895"></a>
+<span class="sourceLineNo">4896</span>    assertEquals("ColumnFamily mismatch while checking: " + ctx, Bytes.toString(cf),<a name="line.4896"></a>
+<span class="sourceLineNo">4897</span>        Bytes.toString(CellUtil.cloneFamily(kv)));<a name="line.4897"></a>
+<span class="sourceLineNo">4898</span>    assertEquals("Column qualifier mismatch while checking: " + ctx, "column:" + colIdx,<a name="line.4898"></a>
+<span class="sourceLineNo">4899</span>        Bytes.toString(CellUtil.cloneQualifier(kv)));<a name="line.4899"></a>
+<span class="sourceLineNo">4900</span>    assertEquals("Timestamp mismatch while checking: " + ctx, ts, kv.getTimestamp());<a name="line.4900"></a>
+<span class="sourceLineNo">4901</span>    assertEquals("Value mismatch while checking: " + ctx, "value-version-" + ts,<a name="line.4901"></a>
+<span class="sourceLineNo">4902</span>        Bytes.toString(CellUtil.cloneValue(kv)));<a name="line.4902"></a>
+<span class="sourceLineNo">4903</span>  }<a name="line.4903"></a>
+<span class="sourceLineNo">4904</span><a name="line.4904"></a>
+<span class="sourceLineNo">4905</span>  @Test<a name="line.4905"></a>
+<span class="sourceLineNo">4906</span>  public void testReverseScanner_FromMemStore_SingleCF_Normal()<a name="line.4906"></a>
+<span class="sourceLineNo">4907</span>      throws IOException {<a name="line.4907"></a>
+<span class="sourceLineNo">4908</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.4908"></a>
+<span class="sourceLineNo">4909</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.4909"></a>
+<span class="sourceLineNo">4910</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.4910"></a>
+<span class="sourceLineNo">4911</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.4911"></a>
+<span class="sourceLineNo">4912</span>    byte[][] families = { cf };<a name="line.4912"></a>
+<span class="sourceLineNo">4913</span>    byte[] col = Bytes.toBytes("C");<a name="line.4913"></a>
+<span class="sourceLineNo">4914</span>    long ts = 1;<a name="line.4914"></a>
+<span class="sourceLineNo">4915</span>    this.region = initHRegion(tableName, method, families);<a name="line.4915"></a>
+<span class="sourceLineNo">4916</span>    KeyValue kv1 = new KeyValue(rowC, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4916"></a>
+<span class="sourceLineNo">4917</span>    KeyValue kv11 = new KeyValue(rowC, cf, col, ts + 1, KeyValue.Type.Put,<a name="line.4917"></a>
+<span class="sourceLineNo">4918</span>        null);<a name="line.4918"></a>
+<span class="sourceLineNo">4919</span>    KeyValue kv2 = new KeyValue(rowA, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4919"></a>
+<span class="sourceLineNo">4920</span>    KeyValue kv3 = new KeyValue(rowB, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4920"></a>
+<span class="sourceLineNo">4921</span>    Put put = null;<a name="line.4921"></a>
+<span class="sourceLineNo">4922</span>    put = new Put(rowC);<a name="line.4922"></a>
+<span class="sourceLineNo">4923</span>    put.add(kv1);<a name="line.4923"></a>
+<span class="sourceLineNo">4924</span>    put.add(kv11);<a name="line.4924"></a>
+<span class="sourceLineNo">4925</span>    region.put(put);<a name="line.4925"></a>
+<span class="sourceLineNo">4926</span>    put = new Put(rowA);<a name="line.4926"></a>
+<span class="sourceLineNo">4927</span>    put.add(kv2);<a name="line.4927"></a>
+<span class="sourceLineNo">4928</span>    region.put(put);<a name="line.4928"></a>
+<span class="sourceLineNo">4929</span>    put = new Put(rowB);<a name="line.4929"></a>
+<span class="sourceLineNo">4930</span>    put.add(kv3);<a name="line.4930"></a>
+<span class="sourceLineNo">4931</span>    region.put(put);<a name="line.4931"></a>
+<span class="sourceLineNo">4932</span><a name="line.4932"></a>
+<span class="sourceLineNo">4933</span>    Scan scan = new Scan(rowC);<a name="line.4933"></a>
+<span class="sourceLineNo">4934</span>    scan.setMaxVersions(5);<a name="line.4934"></a>
+<span class="sourceLineNo">4935</span>    scan.setReversed(true);<a name="line.4935"></a>
+<span class="sourceLineNo">4936</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.4936"></a>
+<span class="sourceLineNo">4937</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.4937"></a>
+<span class="sourceLineNo">4938</span>    boolean hasNext = scanner.next(currRow);<a name="line.4938"></a>
+<span class="sourceLineNo">4939</span>    assertEquals(2, currRow.size());<a name="line.4939"></a>
+<span class="sourceLineNo">4940</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4940"></a>
+<span class="sourceLineNo">4941</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.4941"></a>
+<span class="sourceLineNo">4942</span>    assertTrue(hasNext);<a name="line.4942"></a>
+<span class="sourceLineNo">4943</span>    currRow.clear();<a name="line.4943"></a>
+<span class="sourceLineNo">4944</span>    hasNext = scanner.next(currRow);<a name="line.4944"></a>
+<span class="sourceLineNo">4945</span>    assertEquals(1, currRow.size());<a name="line.4945"></a>
+<span class="sourceLineNo">4946</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4946"></a>
+<span class="sourceLineNo">4947</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.4947"></a>
+<span class="sourceLineNo">4948</span>    assertTrue(hasNext);<a name="line.4948"></a>
+<span class="sourceLineNo">4949</span>    currRow.clear();<a name="line.4949"></a>
+<span class="sourceLineNo">4950</span>    hasNext = scanner.next(currRow);<a name="line.4950"></a>
+<span class="sourceLineNo">4951</span>    assertEquals(1, currRow.size());<a name="line.4951"></a>
+<span class="sourceLineNo">4952</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4952"></a>
+<span class="sourceLineNo">4953</span>        .get(0).getRowLength(), rowA, 0, rowA.length));<a name="line.4953"></a>
+<span class="sourceLineNo">4954</span>    assertFalse(hasNext);<a name="line.4954"></a>
+<span class="sourceLineNo">4955</span>    scanner.close();<a name="line.4955"></a>
+<span class="sourceLineNo">4956</span>  }<a name="line.4956"></a>
+<span class="sourceLineNo">4957</span><a name="line.4957"></a>
+<span class="sourceLineNo">4958</span>  @Test<a name="line.4958"></a>
+<span class="sourceLineNo">4959</span>  public void testReverseScanner_FromMemStore_SingleCF_LargerKey()<a name="line.4959"></a>
+<span class="sourceLineNo">4960</span>      throws IOException {<a name="line.4960"></a>
+<span class="sourceLineNo">4961</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.4961"></a>
+<span class="sourceLineNo">4962</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.4962"></a>
+<span class="sourceLineNo">4963</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.4963"></a>
+<span class="sourceLineNo">4964</span>    byte[] rowD = Bytes.toBytes("rowD");<a name="line.4964"></a>
+<span class="sourceLineNo">4965</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.4965"></a>
+<span class="sourceLineNo">4966</span>    byte[][] families = { cf };<a name="line.4966"></a>
+<span class="sourceLineNo">4967</span>    byte[] col = Bytes.toBytes("C");<a name="line.4967"></a>
+<span class="sourceLineNo">4968</span>    long ts = 1;<a name="line.4968"></a>
+<span class="sourceLineNo">4969</span>    this.region = initHRegion(tableName, method, families);<a name="line.4969"></a>
+<span class="sourceLineNo">4970</span>    KeyValue kv1 = new KeyValue(rowC, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4970"></a>
+<span class="sourceLineNo">4971</span>    KeyValue kv11 = new KeyValue(rowC, cf, col, ts + 1, KeyValue.Type.Put,<a name="line.4971"></a>
+<span class="sourceLineNo">4972</span>        null);<a name="line.4972"></a>
+<span class="sourceLineNo">4973</span>    KeyValue kv2 = new KeyValue(rowA, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4973"></a>
+<span class="sourceLineNo">4974</span>    KeyValue kv3 = new KeyValue(rowB, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4974"></a>
+<span class="sourceLineNo">4975</span>    Put put = null;<a name="line.4975"></a>
+<span class="sourceLineNo">4976</span>    put = new Put(rowC);<a name="line.4976"></a>
+<span class="sourceLineNo">4977</span>    put.add(kv1);<a name="line.4977"></a>
+<span class="sourceLineNo">4978</span>    put.add(kv11);<a name="line.4978"></a>
+<span class="sourceLineNo">4979</span>    region.put(put);<a name="line.4979"></a>
+<span class="sourceLineNo">4980</span>    put = new Put(rowA);<a name="line.4980"></a>
+<span class="sourceLineNo">4981</span>    put.add(kv2);<a name="line.4981"></a>
+<span class="sourceLineNo">4982</span>    region.put(put);<a name="line.4982"></a>
+<span class="sourceLineNo">4983</span>    put = new Put(rowB);<a name="line.4983"></a>
+<span class="sourceLineNo">4984</span>    put.add(kv3);<a name="line.4984"></a>
+<span class="sourceLineNo">4985</span>    region.put(put);<a name="line.4985"></a>
+<span class="sourceLineNo">4986</span><a name="line.4986"></a>
+<span class="sourceLineNo">4987</span>    Scan scan = new Scan(rowD);<a name="line.4987"></a>
+<span class="sourceLineNo">4988</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.4988"></a>
+<span class="sourceLineNo">4989</span>    scan.setReversed(true);<a name="line.4989"></a>
+<span class="sourceLineNo">4990</span>    scan.setMaxVersions(5);<a name="line.4990"></a>
+<span class="sourceLineNo">4991</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.4991"></a>
+<span class="sourceLineNo">4992</span>    boolean hasNext = scanner.next(currRow);<a name="line.4992"></a>
+<span class="sourceLineNo">4993</span>    assertEquals(2, currRow.size());<a name="line.4993"></a>
+<span class="sourceLineNo">4994</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4994"></a>
+<span class="sourceLineNo">4995</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.4995"></a>
+<span class="sourceLineNo">4996</span>    assertTrue(hasNext);<a name="line.4996"></a>
+<span class="sourceLineNo">4997</span>    currRow.clear();<a name="line.4997"></a>
+<span class="sourceLineNo">4998</span>    hasNext = scanner.next(currRow);<a name="line.4998"></a>
+<span class="sourceLineNo">4999</span>    assertEquals(1, currRow.size());<a name="line.4999"></a>
+<span class="sourceLineNo">5000</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5000"></a>
+<span class="sourceLineNo">5001</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.5001"></a>
+<span class="sourceLineNo">5002</span>    assertTrue(hasNext);<a name="line.5002"></a>
+<span class="sourceLineNo">5003</span>    currRow.clear();<a name="line.5003"></a>
+<span class="sourceLineNo">5004</span>    hasNext = scanner.next(currRow);<a name="line.5004"></a>
+<span class="sourceLineNo">5005</span>    assertEquals(1, currRow.size());<a name="line.5005"></a>
+<span class="sourceLineNo">5006</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5006"></a>
+<span class="sourceLineNo">5007</span>        .get(0).getRowLength(), rowA, 0, rowA.length));<a name="line.5007"></a>
+<span class="sourceLineNo">5008</span>    assertFalse(hasNext);<a name="line.5008"></a>
+<span class="sourceLineNo">5009</span>    scanner.close();<a name="line.5009"></a>
+<span class="sourceLineNo">5010</span>  }<a name="line.5010"></a>
+<span class="sourceLineNo">5011</span><a name="line.5011"></a>
+<span class="sourceLineNo">5012</span>  @Test<a name="line.5012"></a>
+<span class="sourceLineNo">5013</span>  public void testReverseScanner_FromMemStore_SingleCF_FullScan()<a name="line.5013"></a>
+<span class="sourceLineNo">5014</span>      throws IOException {<a name="line.5014"></a>
+<span class="sourceLineNo">5015</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.5015"></a>
+<span class="sourceLineNo">5016</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.5016"></a>
+<span class="sourceLineNo">5017</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.5017"></a>
+<span class="sourceLineNo">5018</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.5018"></a>
+<span class="sourceLineNo">5019</span>    byte[][] families = { cf };<a name="line.5019"></a>
+<span class="sourceLineNo">5020</span>    byte[] col = Bytes.toBytes("C");<a name="line.5020"></a>
+<span class="sourceLineNo">5021</span>    long ts = 1;<a name="line.5021"></a>
+<span class="sourceLineNo">5022</span>    this.region = initHRegion(tableName, method, families);<a name="line.5022"></a>
+<span class="sourceLineNo">5023</span>    KeyValue kv1 = new KeyValue(rowC, cf, col, ts, KeyValue.Type.Put, null);<a name="line.5023"></a>
+<span class="sourceLineNo">5024</span>    KeyValue kv11 = new KeyValue(rowC, cf, col, ts + 1, KeyValue.Type.Put,<a name="line.5024"></a>
+<span class="sourceLineNo">5025</span>        null);<a name="line.5025"></a>
+<span class="sourceLineNo">5026</span>    KeyValue kv2 = new KeyValue(rowA, cf, col, ts, KeyValue.Type.Put, null);<a name="line.5026"></a>
+<span class="sourceLineNo">5027</span>    KeyValue kv3 = new KeyValue(rowB, cf, col, ts, KeyValue.Type.Put, null);<a name="line.5027"></a>
+<span class="sourceLineNo">5028</span>    Put put = null;<a name="line.5028"></a>
+<span class="sourceLineNo">5029</span>    put = new Put(rowC);<a name="line.5029"></a>
+<span class="sourceLineNo">5030</span>    put.add(kv1);<a name="line.5030"></a>
+<span class="sourceLineNo">5031</span>    put.add(kv11);<a name="line.5031"></a>
+<span class="sourceLineNo">5032</span>    region.put(put);<a name="line.5032"></a>
+<span class="sourceLineNo">5033</span>    put = new Put(rowA);<a name="line.5033"></a>
+<span class="sourceLineNo">5034</span>    put.add(kv2);<a name="line.5034"></a>
+<span class="sourceLineNo">5035</span>    region.put(put);<a name="line.5035"></a>
+<span class="sourceLineNo">5036</span>    put = new Put(rowB);<a name="line.5036"></a>
+<span class="sourceLineNo">5037</span>    put.add(kv3);<a name="line.5037"></a>
+<span class="sourceLineNo">5038</span>    region.put(put);<a name="line.5038"></a>
+<span class="sourceLineNo">5039</span>    Scan scan = new Scan();<a name="line.5039"></a>
+<span class="sourceLineNo">5040</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5040"></a>
+<span class="sourceLineNo">5041</span>    scan.setReversed(true);<a name="line.5041"></a>
+<span class="sourceLineNo">5042</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5042"></a>
+<span class="sourceLineNo">5043</span>    boolean hasNext = scanner.next(currRow);<a name="line.5043"></a>
+<span class="sourceLineNo">5044</span>    assertEquals(1, currRow.size());<a name="line.5044"></a>
+<span class="sourceLineNo">5045</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5045"></a>
+<span class="sourceLineNo">5046</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.5046"></a>
+<span class="sourceLineNo">5047</span>    assertTrue(hasNext);<a name="line.5047"></a>
+<span class="sourceLineNo">5048</span>    currRow.clear();<a name="line.5048"></a>
+<span class="sourceLineNo">5049</span>    hasNext = scanner.next(currRow);<a name="line.5049"></a>
+<span class="sourceLineNo">5050</span>    assertEquals(1, currRow.size());<a name="line.5050"></a>
+<span class="sourceLineNo">5051</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5051"></a>
+<span class="sourceLineNo">5052</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.5052"></a>
+<span class="sourceLineNo">5053</span>    assertTrue(hasNext);<a name="line.5053"></a>
+<span class="sourceLineNo">5054</span>    currRow.clear();<a name="line.5054"></a>
+<span class="sourceLineNo">5055</span>    hasNext = scanner.next(currRow);<a name="line.5055"></a>
+<span class="sourceLineNo">5056</span>    assertEquals(1, currRow.size());<a name="line.5056"></a>
+<span class="sourceLineNo">5057</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5057"></a>
+<span class="sourceLineNo">5058</span>        .get(0).getRowLength(), rowA, 0, rowA.length));<a name="line.5058"></a>
+<span class="sourceLineNo">5059</span>    assertFalse(hasNext);<a name="line.5059"></a>
+<span class="sourceLineNo">5060</span>    scanner.close();<a name="line.5060"></a>
+<span class="sourceLineNo">5061</span>  }<a name="line.5061"></a>
+<span class="sourceLineNo">5062</span><a name="line.5062"></a>
+<span class="sourceLineNo">5063</span>  @Test<a name="line.5063"></a>
+<span class="sourceLineNo">5064</span>  public void testReverseScanner_moreRowsMayExistAfter() throws IOException {<a name="line.5064"></a>
+<span class="sourceLineNo">5065</span>    // case for "INCLUDE_AND_SEEK_NEXT_ROW &amp; SEEK_NEXT_ROW" endless loop<a name="line.5065"></a>
+<span class="sourceLineNo">5066</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.5066"></a>
+<span class="sourceLineNo">5067</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.5067"></a>
+<span class="sourceLineNo">5068</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.5068"></a>
+<span class="sourceLineNo">5069</span>    byte[] rowD = Bytes.toBytes("rowD");<a name="line.5069"></a>
+<span class="sourceLineNo">5070</span>    byte[] rowE = Bytes.toBytes("rowE");<a name="line.5070"></a>
+<span class="sourceLineNo">5071</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.5071"></a>
+<span class="sourceLineNo">5072</span>    byte[][] families = { cf };<a name="line.5072"></a>
+<span class="sourceLineNo">5073</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.5073"></a>
+<span class="sourceLineNo">5074</span>    byte[] col2 = Bytes.toBytes("col2");<a name="line.5074"></a>
+<span class="sourceLineNo">5075</span>    long ts = 1;<a name="line.5075"></a>
+<span class="sourceLineNo">5076</span>    this.region = initHRegion(tableName, method, families);<a name="line.5076"></a>
+<span class="sourceLineNo">5077</span>    KeyValue kv1 = new KeyValue(rowA, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5077"></a>
+<span class="sourceLineNo">5078</span>    KeyValue kv2 = new KeyValue(rowB, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5078"></a>
+<span class="sourceLineNo">5079</span>    KeyValue kv3 = new KeyValue(rowC, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5079"></a>
+<span class="sourceLineNo">5080</span>    KeyValue kv4_1 = new KeyValue(rowD, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5080"></a>
+<span class="sourceLineNo">5081</span>    KeyValue kv4_2 = new KeyValue(rowD, cf, col2, ts, KeyValue.Type.Put, null);<a name="line.5081"></a>
+<span class="sourceLineNo">5082</span>    KeyValue kv5 = new KeyValue(rowE, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5082"></a>
+<span class="sourceLineNo">5083</span>    Put put = null;<a name="line.5083"></a>
+<span class="sourceLineNo">5084</span>    put = new Put(rowA);<a name="line.5084"></a>
+<span class="sourceLineNo">5085</span>    put.add(kv1);<a name="line.5085"></a>
+<span class="sourceLineNo">5086</span>    region.put(put);<a name="line.5086"></a>
+<span class="sourceLineNo">5087</span>    put = new Put(rowB);<a name="line.5087"></a>
+<span class="sourceLineNo">5088</span>    put.add(kv2);<a name="line.5088"></a>
+<span class="sourceLineNo">5089</span>    region.put(put);<a name="line.5089"></a>
+<span class="sourceLineNo">5090</span>    put = new Put(rowC);<a name="line.5090"></a>
+<span class="sourceLineNo">5091</span>    put.add(kv3);<a name="line.5091"></a>
+<span class="sourceLineNo">5092</span>    region.put(put);<a name="line.5092"></a>
+<span class="sourceLineNo">5093</span>    put = new Put(rowD);<a name="line.5093"></a>
+<span class="sourceLineNo">5094</span>    put.add(kv4_1);<a name="line.5094"></a>
+<span class="sourceLineNo">5095</span>    region.put(put);<a name="line.5095"></a>
+<span class="sourceLineNo">5096</span>    put = new Put(rowD);<a name="line.5096"></a>
+<span class="sourceLineNo">5097</span>    put.add(kv4_2);<a name="line.5097"></a>
+<span class="sourceLineNo">5098</span>    region.put(put);<a name="line.5098"></a>
+<span class="sourceLineNo">5099</span>    put = new Put(rowE);<a name="line.5099"></a>
+<span class="sourceLineNo">5100</span>    put.add(kv5);<a name="line.5100"></a>
+<span class="sourceLineNo">5101</span>    region.put(put);<a name="line.5101"></a>
+<span class="sourceLineNo">5102</span>    region.flush(true);<a name="line.5102"></a>
+<span class="sourceLineNo">5103</span>    Scan scan = new Scan(rowD, rowA);<a name="line.5103"></a>
+<span class="sourceLineNo">5104</span>    scan.addColumn(families[0], col1);<a name="line.5104"></a>
+<span class="sourceLineNo">5105</span>    scan.setReversed(true);<a name="line.5105"></a>
+<span class="sourceLineNo">5106</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5106"></a>
+<span class="sourceLineNo">5107</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5107"></a>
+<span class="sourceLineNo">5108</span>    boolean hasNext = scanner.next(currRow);<a name="line.5108"></a>
+<span class="sourceLineNo">5109</span>    assertEquals(1, currRow.size());<a name="line.5109"></a>
+<span class="sourceLineNo">5110</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5110"></a>
+<span class="sourceLineNo">5111</span>        .get(0).getRowLength(), rowD, 0, rowD.length));<a name="line.5111"></a>
+<span class="sourceLineNo">5112</span>    assertTrue(hasNext);<a name="line.5112"></a>
+<span class="sourceLineNo">5113</span>    currRow.clear();<a name="line.5113"></a>
+<span class="sourceLineNo">5114</span>    hasNext = scanner.next(currRow);<a name="line.5114"></a>
+<span class="sourceLineNo">5115</span>    assertEquals(1, currRow.size());<a name="line.5115"></a>
+<span class="sourceLineNo">5116</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5116"></a>
+<span class="sourceLineNo">5117</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.5117"></a>
+<span class="sourceLineNo">5118</span>    assertTrue(hasNext);<a name="line.5118"></a>
+<span class="sourceLineNo">5119</span>    currRow.clear();<a name="line.5119"></a>
+<span class="sourceLineNo">5120</span>    hasNext = scanner.next(currRow);<a name="line.5120"></a>
+<span class="sourceLineNo">5121</span>    assertEquals(1, currRow.size());<a name="line.5121"></a>
+<span class="sourceLineNo">5122</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5122"></a>
+<span class="sourceLineNo">5123</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.5123"></a>
+<span class="sourceLineNo">5124</span>    assertFalse(hasNext);<a name="line.5124"></a>
+<span class="sourceLineNo">5125</span>    scanner.close();<a name="line.5125"></a>
+<span class="sourceLineNo">5126</span><a name="line.5126"></a>
+<span class="sourceLineNo">5127</span>    scan = new Scan(rowD, rowA);<a name="line.5127"></a>
+<span class="sourceLineNo">5128</span>    scan.addColumn(families[0], col2);<a name="line.5128"></a>
+<span class="sourceLineNo">5129</span>    scan.setReversed(true);<a name="line.5129"></a>
+<span class="sourceLineNo">5130</span>    currRow.clear();<a name="line.5130"></a>
+<span class="sourceLineNo">5131</span>    scanner = region.getScanner(scan);<a name="line.5131"></a>
+<span class="sourceLineNo">5132</span>    hasNext = scanner.next(currRow);<a name="line.5132"></a>
+<span class="sourceLineNo">5133</span>    assertEquals(1, currRow.size());<a name="line.5133"></a>
+<span class="sourceLineNo">5134</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5134"></a>
+<span class="sourceLineNo">5135</span>        .get(0).getRowLength(), rowD, 0, rowD.length));<a name="line.5135"></a>
+<span class="sourceLineNo">5136</span>    scanner.close();<a name="line.5136"></a>
+<span class="sourceLineNo">5137</span>  }<a name="line.5137"></a>
+<span class="sourceLineNo">5138</span><a name="line.5138"></a>
+<span class="sourceLineNo">5139</span>  @Test<a name="line.5139"></a>
+<span class="sourceLineNo">5140</span>  public void testReverseScanner_smaller_blocksize() throws IOException {<a name="line.5140"></a>
+<span class="sourceLineNo">5141</span>    // case to ensure no conflict with HFile index optimization<a name="line.5141"></a>
+<span class="sourceLineNo">5142</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.5142"></a>
+<span class="sourceLineNo">5143</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.5143"></a>
+<span class="sourceLineNo">5144</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.5144"></a>
+<span class="sourceLineNo">5145</span>    byte[] rowD = Bytes.toBytes("rowD");<a name="line.5145"></a>
+<span class="sourceLineNo">5146</span>    byte[] rowE = Bytes.toBytes("rowE");<a name="line.5146"></a>
+<span class="sourceLineNo">5147</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.5147"></a>
+<span class="sourceLineNo">5148</span>    byte[][] families = { cf };<a name="line.5148"></a>
+<span class="sourceLineNo">5149</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.5149"></a>
+<span class="sourceLineNo">5150</span>    byte[] col2 = Bytes.toBytes("col2");<a name="line.5150"></a>
+<span class="sourceLineNo">5151</span>    long ts = 1;<a name="line.5151"></a>
+<span class="sourceLineNo">5152</span>    HBaseConfiguration config = new HBaseConfiguration();<a name="line.5152"></a>
+<span class="sourceLineNo">5153</span>    config.setInt("test.block.size", 1);<a name="line.5153"></a>
+<span class="sourceLineNo">5154</span>    this.region = initHRegion(tableName, method, config, families);<a name="line.5154"></a>
+<span class="sourceLineNo">5155</span>    KeyValue kv1 = new KeyValue(rowA, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5155"></a>
+<span class="sourceLineNo">5156</span>    KeyValue kv2 = new KeyValue(rowB, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5156"></a>
+<span class="sourceLineNo">5157</span>    KeyValue kv3 = new KeyValue(rowC, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5157"></a>
+<span class="sourceLineNo">5158</span>    KeyValue kv4_1 = new KeyValue(rowD, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5158"></a>
+<span class="sourceLineNo">5159</span>    KeyValue kv4_2 = new KeyValue(rowD, cf, col2, ts, KeyValue.Type.Put, null);<a name="line.5159"></a>
+<span class="sourceLineNo">5160</span>    KeyValue kv5 = new KeyValue(rowE, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5160"></a>
+<span class="sourceLineNo">5161</span>    Put put = null;<a name="line.5161"></a>
+<span class="sourceLineNo">5162</span>    put = new Put(rowA);<a name="line.5162"></a>
+<span class="sourceLineNo">5163</span>    put.add(kv1);<a name="line.5163"></a>
+<span class="sourceLineNo">5164</span>    region.put(put);<a name="line.5164"></a>
+<span class="sourceLineNo">5165</span>    put = new Put(rowB);<a name="line.5165"></a>
+<span class="sourceLineNo">5166</span>    put.add(kv2);<a name="line.5166"></a>
+<span class="sourceLineNo">5167</span>    region.put(put);<a name="line.5167"></a>
+<span class="sourceLineNo">5168</span>    put = new Put(rowC);<a name="line.5168"></a>
+<span class="sourceLineNo">5169</span>    put.add(kv3);<a name="line.5169"></a>
+<span class="sourceLineNo">5170</span>    region.put(put);<a name="line.5170"></a>
+<span class="sourceLineNo">5171</span>    put = new Put(rowD);<a name="line.5171"></a>
+<span class="sourceLineNo">5172</span>    put.add(kv4_1);<a name="line.5172"></a>
+<span class="sourceLineNo">5173</span>    region.put(put);<a name="line.5173"></a>
+<span class="sourceLineNo">5174</span>    put = new Put(rowD);<a name="line.5174"></a>
+<span class="sourceLineNo">5175</span>    put.add(kv4_2);<a name="line.5175"></a>
+<span class="sourceLineNo">5176</span>    region.put(put);<a name="line.5176"></a>
+<span class="sourceLineNo">5177</span>    put = new Put(rowE);<a name="line.5177"></a>
+<span class="sourceLineNo">5178</span>    put.add(kv5);<a name="line.5178"></a>
+<span class="sourceLineNo">5179</span>    region.put(put);<a name="line.5179"></a>
+<span class="sourceLineNo">5180</span>    region.flush(true);<a name="line.5180"></a>
+<span class="sourceLineNo">5181</span>    Scan scan = new Scan(rowD, rowA);<a name="line.5181"></a>
+<span class="sourceLineNo">5182</span>    scan.addColumn(families[0], col1);<a name="line.5182"></a>
+<span class="sourceLineNo">5183</span>    scan.setReversed(true);<a name="line.5183"></a>
+<span class="sourceLineNo">5184</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5184"></a>
+<span class="sourceLineNo">5185</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5185"></a>
+<span class="sourceLineNo">5186</span>    boolean hasNext = scanner.next(currRow);<a name="line.5186"></a>
+<span class="sourceLineNo">5187</span>    assertEquals(1, currRow.size());<a name="line.5187"></a>
+<span class="sourceLineNo">5188</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5188"></a>
+<span class="sourceLineNo">5189</span>        .get(0).getRowLength(), rowD, 0, rowD.length));<a name="line.5189"></a>
+<span class="sourceLineNo">5190</span>    assertTrue(hasNext);<a name="line.5190"></a>
+<span class="sourceLineNo">5191</span>    currRow.clear();<a name="line.5191"></a>
+<span class="sourceLineNo">5192</span>    hasNext = scanner.next(currRow);<a name="line.5192"></a>
+<span class="sourceLineNo">5193</span>    assertEquals(1, currRow.size());<a name="line.5193"></a>
+<span class="sourceLineNo">5194</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5194"></a>
+<span class="sourceLineNo">5195</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.5195"></a>
+<span class="sourceLineNo">5196</span>    assertTrue(hasNext);<a name="line.5196"></a>
+<span class="sourceLineNo">5197</span>    currRow.clear();<a name="line.5197"></a>
+<span class="sourceLineNo">5198</span>    hasNext = scanner.next(currRow);<a name="line.5198"></a>
+<span class="sourceLineNo">5199</span>    assertEquals(1, currRow.size());<a name="line.5199"></a>
+<span class="sourceLineNo">5200</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5200"></a>
+<span class="sourceLineNo">5201</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.5201"></a>
+<span class="sourceLineNo">5202</span>    assertFalse(hasNext);<a name="line.5202"></a>
+<span class="sourceLineNo">5203</span>    scanner.close();<a name="line.5203"></a>
+<span class="sourceLineNo">5204</span><a name="line.5204"></a>
+<span class="sourceLineNo">5205</span>    scan = new Scan(rowD, rowA);<a name="line.5205"></a>
+<span class="sourceLineNo">5206</span>    scan.addColumn(families[0], col2);<a name="line.5206"></a>
+<span class="sourceLineNo">5207</span>    scan.setReversed(true);<a name="line.5207"></a>
+<span class="sourceLineNo">5208</span>    currRow.clear();<a name="line.5208"></a>
+<span class="sourceLineNo">5209</span>    scanner = region.getScanner(scan);<a name="line.5209"></a>
+<span class="sourceLineNo">5210</span>    hasNext = scanner.next(currRow);<a name="line.5210"></a>
+<span class="sourceLineNo">5211</span>    assertEquals(1, currRow.size());<a name="line.5211"></a>
+<span class="sourceLineNo">5212</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5212"></a>
+<span class="sourceLineNo">5213</span>        .get(0).getRowLength(), rowD, 0, rowD.length));<a name="line.5213"></a>
+<span class="sourceLineNo">5214</span>    scanner.close();<a name="line.5214"></a>
+<span class="sourceLineNo">5215</span>  }<a name="line.5215"></a>
+<span class="sourceLineNo">5216</span><a name="line.5216"></a>
+<span class="sourceLineNo">5217</span>  @Test<a name="line.5217"></a>
+<span class="sourceLineNo">5218</span>  public void testReverseScanner_FromMemStoreAndHFiles_MultiCFs1()<a name="line.5218"></a>
+<span class="sourceLineNo">5219</span>      throws IOException {<a name="line.5219"></a>
+<span class="sourceLineNo">5220</span>    byte[] row0 = Bytes.toBytes("row0"); // 1 kv<a name="line.5220"></a>
+<span class="sourceLineNo">5221</span>    byte[] row1 = Bytes.toBytes("row1"); // 2 kv<a name="line.5221"></a>
+<span class="sourceLineNo">5222</span>    byte[] row2 = Bytes.toBytes("row2"); // 4 kv<a name="line.5222"></a>
+<span class="sourceLineNo">5223</span>    byte[] row3 = Bytes.toBytes("row3"); // 2 kv<a name="line.5223"></a>
+<span class="sourceLineNo">5224</span>    byte[] row4 = Bytes.toBytes("row4"); // 5 kv<a name="line.5224"></a>
+<span class="sourceLineNo">5225</span>    byte[] row5 = Bytes.toBytes("row5"); // 2 kv<a name="line.5225"></a>
+<span class="sourceLineNo">5226</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5226"></a>
+<span class="sourceLineNo">5227</span>    byte[] cf2 = Bytes.toBytes("CF2");<a name="line.5227"></a>
+<span class="sourceLineNo">5228</span>    byte[] cf3 = Bytes.toBytes("CF3");<a name="line.5228"></a>
+<span class="sourceLineNo">5229</span>    byte[][] families = { cf1, cf2, cf3 };<a name="line.5229"></a>
+<span class="sourceLineNo">5230</span>    byte[] col = Bytes.toBytes("C");<a name="line.5230"></a>
+<span class="sourceLineNo">5231</span>    long ts = 1;<a name="line.5231"></a>
+<span class="sourceLineNo">5232</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5232"></a>
+<span class="sourceLineNo">5233</span>    // disable compactions in this test.<a name="line.5233"></a>
+<span class="sourceLineNo">5234</span>    conf.setInt("hbase.hstore.compactionThreshold", 10000);<a name="line.5234"></a>
+<span class="sourceLineNo">5235</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5235"></a>
+<span class="sourceLineNo">5236</span>    // kv naming style: kv(row number) totalKvCountInThisRow seq no<a name="line.5236"></a>
+<span class="sourceLineNo">5237</span>    KeyValue kv0_1_1 = new KeyValue(row0, cf1, col, ts, KeyValue.Type.Put,<a name="line.5237"></a>
 <span class="sourceLineNo">5238</span>        null);<a name="line.5238"></a>
-<span class="sourceLineNo">5239</span>    KeyValue kv2_4_4 = new KeyValue(row2, cf1, col, ts + 4,<a name="line.5239"></a>
-<span class="sourceLineNo">5240</span>        KeyValue.Type.Put, null);<a name="line.5240"></a>
-<span class="sourceLineNo">5241</span>    KeyValue kv3_2_1 = new KeyValue(row3, cf2, col, ts, KeyValue.Type.Put,<a name="line.5241"></a>
-<span class="sourceLineNo">5242</span>        null);<a name="line.5242"></a>
-<span class="sourceLineNo">5243</span>    KeyValue kv3_2_2 = new KeyValue(row3, cf1, col, ts + 4,<a name="line.5243"></a>
-<span class="sourceLineNo">5244</span>        KeyValue.Type.Put, null);<a name="line.5244"></a>
-<span class="sourceLineNo">5245</span>    KeyValue kv4_5_1 = new KeyValue(row4, cf1, col, ts, KeyValue.Type.Put,<a name="line.5245"></a>
+<span class="sourceLineNo">5239</span>    KeyValue kv1_2_1 = new KeyValue(row1, cf2, col, ts, KeyValue.Type.Put,<a name="line.5239"></a>
+<span class="sourceLineNo">5240</span>        null);<a name="line.5240"></a>
+<span class="sourceLineNo">5241</span>    KeyValue kv1_2_2 = new KeyValue(row1, cf1, col, ts + 1,<a name="line.5241"></a>
+<span class="sourceLineNo">5242</span>        KeyValue.Type.Put, null);<a name="line.5242"></a>
+<span class="sourceLineNo">5243</span>    KeyValue kv2_4_1 = new KeyValue(row2, cf2, col, ts, KeyValue.Type.Put,<a name="line.5243"></a>
+<span class="sourceLineNo">5244</span>        null);<a name="line.5244"></a>
+<span class="sourceLineNo">5245</span>    KeyValue kv2_4_2 = new KeyValue(row2, cf1, col, ts, KeyValue.Type.Put,<a name="line.5245"></a>
 <span class="sourceLineNo">5246</span>        null);<a name="line.5246"></a>
-<span class="sourceLineNo">5247</span>    KeyValue kv4_5_2 = new KeyValue(row4, cf3, col, ts, KeyValue.Type.Put,<a name="line.5247"></a>
+<span class="sourceLineNo">5247</span>    KeyValue kv2_4_3 = new KeyValue(row2, cf3, col, ts, KeyValue.Type.Put,<a name="line.5247"></a>
 <span class="sourceLineNo">5248</span>        null);<a name="line.5248"></a>
-<span class="sourceLineNo">5249</span>    KeyValue kv4_5_3 = new KeyValue(row4, cf3, col, ts + 5,<a name="line.5249"></a>
+<span class="sourceLineNo">5249</span>    KeyValue kv2_4_4 = new KeyValue(row2, cf1, col, ts + 4,<a name="line.5249"></a>
 <span class="sourceLineNo">5250</span>        KeyValue.Type.Put, null);<a name="line.5250"></a>
-<span class="sourceLineNo">5251</span>    KeyValue kv4_5_4 = new KeyValue(row4, cf2, col, ts, KeyValue.Type.Put,<a name="line.5251"></a>
+<span class="sourceLineNo">5251</span>    KeyValue kv3_2_1 = new KeyValue(row3, cf2, col, ts, KeyValue.Type.Put,<a name="line.5251"></a>
 <span class="sourceLineNo">5252</span>        null);<a name="line.5252"></a>
-<span class="sourceLineNo">5253</span>    KeyValue kv4_5_5 = new KeyValue(row4, cf1, col, ts + 3,<a name="line.5253"></a>
+<span class="sourceLineNo">5253</span>    KeyValue kv3_2_2 = new KeyValue(row3, cf1, col, ts + 4,<a name="line.5253"></a>
 <span class="sourceLineNo">5254</span>        KeyValue.Type.Put, null);<a name="line.5254"></a>
-<span class="sourceLineNo">5255</span>    KeyValue kv5_2_1 = new KeyValue(row5, cf2, col, ts, KeyValue.Type.Put,<a name="line.5255"></a>
+<span class="sourceLineNo">5255</span>    KeyValue kv4_5_1 = new KeyValue(row4, cf1, col, ts, KeyValue.Type.Put,<a name="line.5255"></a>
 <span class="sourceLineNo">5256</span>        null);<a name="line.5256"></a>
-<span class="sourceLineNo">5257</span>    KeyValue kv5_2_2 = new KeyValue(row5, cf3, col, ts, KeyValue.Type.Put,<a name="line.5257"></a>
+<span class="sourceLineNo">5257</span>    KeyValue kv4_5_2 = new KeyValue(row4, cf3, col, ts, KeyValue.Type.Put,<a name="line.5257"></a>
 <span class="sourceLineNo">5258</span>        null);<a name="line.5258"></a>
-<span class="sourceLineNo">5259</span>    // hfiles(cf1/cf2) :"row1"(1 kv) / "row2"(1 kv) / "row4"(2 kv)<a name="line.5259"></a>
-<span class="sourceLineNo">5260</span>    Put put = null;<a name="line.5260"></a>
-<span class="sourceLineNo">5261</span>    put = new Put(row1);<a name="line.5261"></a>
-<span class="sourceLineNo">5262</span>    put.add(kv1_2_1);<a name="line.5262"></a>
-<span class="sourceLineNo">5263</span>    region.put(put);<a name="line.5263"></a>
-<span class="sourceLineNo">5264</span>    put = new Put(row2);<a name="line.5264"></a>
-<span class="sourceLineNo">5265</span>    put.add(kv2_4_1);<a name="line.5265"></a>
-<span class="sourceLineNo">5266</span>    region.put(put);<a name="line.5266"></a>
-<span class="sourceLineNo">5267</span>    put = new Put(row4);<a name="line.5267"></a>
-<span class="sourceLineNo">5268</span>    put.add(kv4_5_4);<a name="line.5268"></a>
-<span class="sourceLineNo">5269</span>    put.add(kv4_5_5);<a name="line.5269"></a>
-<span class="sourceLineNo">5270</span>    region.put(put);<a name="line.5270"></a>
-<span class="sourceLineNo">5271</span>    region.flush(true);<a name="line.5271"></a>
-<span class="sourceLineNo">5272</span>    // hfiles(cf1/cf3) : "row1" (1 kvs) / "row2" (1 kv) / "row4" (2 kv)<a name="line.5272"></a>
-<span class="sourceLineNo">5273</span>    put = new Put(row4);<a name="line.5273"></a>
-<span class="sourceLineNo">5274</span>    put.add(kv4_5_1);<a name="line.5274"></a>
-<span class="sourceLineNo">5275</span>    put.add(kv4_5_3);<a name="line.5275"></a>
+<span class="sourceLineNo">5259</span>    KeyValue kv4_5_3 = new KeyValue(row4, cf3, col, ts + 5,<a name="line.5259"></a>
+<span class="sourceLineNo">5260</span>        KeyValue.Type.Put, null);<a name="line.5260"></a>
+<span class="sourceLineNo">5261</span>    KeyValue kv4_5_4 = new KeyValue(row4, cf2, col, ts, KeyValue.Type.Put,<a name="line.5261"></a>
+<span class="sourceLineNo">5262</span>        null);<a name="line.5262"></a>
+<span class="sourceLineNo">5263</span>    KeyValue kv4_5_5 = new KeyValue(row4, cf1, col, ts + 3,<a name="line.5263"></a>
+<span class="sourceLineNo">5264</span>        KeyValue.Type.Put, null);<a name="line.5264"></a>
+<span class="sourceLineNo">5265</span>    KeyValue kv5_2_1 = new KeyValue(row5, cf2, col, ts, KeyValue.Type.Put,<a name="line.5265"></a>
+<span class="sourceLineNo">5266</span>        null);<a name="line.5266"></a>
+<span class="sourceLineNo">5267</span>    KeyValue kv5_2_2 = new KeyValue(row5, cf3, col, ts, KeyValue.Type.Put,<a name="line.5267"></a>
+<span class="sourceLineNo">5268</span>        null);<a name="line.5268"></a>
+<span class="sourceLineNo">5269</span>    // hfiles(cf1/cf2) :"row1"(1 kv) / "row2"(1 kv) / "row4"(2 kv)<a name="line.5269"></a>
+<span class="sourceLineNo">5270</span>    Put put = null;<a name="line.5270"></a>
+<span class="sourceLineNo">5271</span>    put = new Put(row1);<a name="line.5271"></a>
+<span class="sourceLineNo">5272</span>    put.add(kv1_2_1);<a name="line.5272"></a>
+<span class="sourceLineNo">5273</span>    region.put(put);<a name="line.5273"></a>
+<span class="sourceLineNo">5274</span>    put = new Put(row2);<a name="line.5274"></a>
+<span class="sourceLineNo">5275</span>    put.add(kv2_4_1);<a name="line.5275"></a>
 <span class="sourceLineNo">5276</span>    region.put(put);<a name="line.5276"></a>
-<span class="sourceLineNo">5277</span>    put = new Put(row1);<a name="line.5277"></a>
-<span class="sourceLineNo">5278</span>    put.add(kv1_2_2);<a name="line.5278"></a>
-<span class="sourceLineNo">5279</span>    region.put(put);<a name="line.5279"></a>
-<span class="sourceLineNo">5280</span>    put = new Put(row2);<a name="line.5280"></a>
-<span class="sourceLineNo">5281</span>    put.add(kv2_4_4);<a name="line.5281"></a>
-<span class="sourceLineNo">5282</span>    region.put(put);<a name="line.5282"></a>
-<span class="sourceLineNo">5283</span>    region.flush(true);<a name="line.5283"></a>
-<span class="sourceLineNo">5284</span>    // hfiles(cf1/cf3) : "row2"(2 kv) / "row3"(1 kvs) / "row4" (1 kv)<a name="line.5284"></a>
-<span class="sourceLineNo">5285</span>    put = new Put(row4);<a name="line.5285"></a>
-<span class="sourceLineNo">5286</span>    put.add(kv4_5_2);<a name="line.5286"></a>
-<span class="sourceLineNo">5287</span>    region.put(put);<a name="line.5287"></a>
-<span class="sourceLineNo">5288</span>    put = new Put(row2);<a name="line.5288"></a>
-<span class="sourceLineNo">5289</span>    put.add(kv2_4_2);<a name="line.5289"></a>
-<span class="sourceLineNo">5290</span>    put.add(kv2_4_3);<a name="line.5290"></a>
-<span class="sourceLineNo">5291</span>    region.put(put);<a name="line.5291"></a>
-<span class="sourceLineNo">5292</span>    put = new Put(row3);<a name="line.5292"></a>
-<span class="sourceLineNo">5293</span>    put.add(kv3_2_2);<a name="line.5293"></a>
-<span class="sourceLineNo">5294</span>    region.put(put);<a name="line.5294"></a>
-<span class="sourceLineNo">5295</span>    region.flush(true);<a name="line.5295"></a>
-<span class="sourceLineNo">5296</span>    // memstore(cf1/cf2/cf3) : "row0" (1 kvs) / "row3" ( 1 kv) / "row5" (max)<a name="line.5296"></a>
-<span class="sourceLineNo">5297</span>    // ( 2 kv)<a name="line.5297"></a>
-<span class="sourceLineNo">5298</span>    put = new Put(row0);<a name="line.5298"></a>
-<span class="sourceLineNo">5299</span>    put.add(kv0_1_1);<a name="line.5299"></a>
-<span class="sourceLineNo">5300</span>    region.put(put);<a name="line.5300"></a>
-<span class="sourceLineNo">5301</span>    put = new Put(row3);<a name="line.5301"></a>
-<span class="sourceLineNo">5302</span>    put.add(kv3_2_1);<a name="line.5302"></a>
-<span class="sourceLineNo">5303</span>    region.put(put);<a name="line.5303"></a>
-<span class="sourceLineNo">5304</span>    put = new Put(row5);<a name="line.5304"></a>
-<span class="sourceLineNo">5305</span>    put.add(kv5_2_1);<a name="line.5305"></a>
-<span class="sourceLineNo">5306</span>    put.add(kv5_2_2);<a name="line.5306"></a>
-<span class="sourceLineNo">5307</span>    region.put(put);<a name="line.5307"></a>
-<span class="sourceLineNo">5308</span>    // scan range = ["row4", min), skip the max "row5"<a name="line.5308"></a>
-<span class="sourceLineNo">5309</span>    Scan scan = new Scan(row4);<a name="line.5309"></a>
-<span class="sourceLineNo">5310</span>    scan.setMaxVersions(5);<a name="line.5310"></a>
-<span class="sourceLineNo">5311</span>    scan.setBatch(3);<a name="line.5311"></a>
-<span class="sourceLineNo">5312</span>    scan.setReversed(true);<a name="line.5312"></a>
-<span class="sourceLineNo">5313</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5313"></a>
-<span class="sourceLineNo">5314</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5314"></a>
-<span class="sourceLineNo">5315</span>    boolean hasNext = false;<a name="line.5315"></a>
-<span class="sourceLineNo">5316</span>    // 1. scan out "row4" (5 kvs), "row5" can't be scanned out since not<a name="line.5316"></a>
-<span class="sourceLineNo">5317</span>    // included in scan range<a name="line.5317"></a>
-<span class="sourceLineNo">5318</span>    // "row4" takes 2 next() calls since batch=3<a name="line.5318"></a>
-<span class="sourceLineNo">5319</span>    hasNext = scanner.next(currRow);<a name="line.5319"></a>
-<span class="sourceLineNo">5320</span>    assertEquals(3, currRow.size());<a name="line.5320"></a>
-<span class="sourceLineNo">5321</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5321"></a>
-<span class="sourceLineNo">5322</span>        .get(0).getRowLength(), row4, 0, row4.length));<a name="line.5322"></a>
-<span class="sourceLineNo">5323</span>    assertTrue(hasNext);<a name="line.5323"></a>
-<span class="sourceLineNo">5324</span>    currRow.clear();<a name="line.5324"></a>
-<span class="sourceLineNo">5325</span>    hasNext = scanner.next(currRow);<a name="line.5325"></a>
-<span class="sourceLineNo">5326</span>    assertEquals(2, currRow.size());<a name="line.5326"></a>
-<span class="sourceLineNo">5327</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(),<a name="line.5327"></a>
-<span class="sourceLineNo">5328</span>        currRow.get(0).getRowLength(), row4, 0,<a name="line.5328"></a>
-<span class="sourceLineNo">5329</span>      row4.length));<a name="line.5329"></a>
-<span class="sourceLineNo">5330</span>    assertTrue(hasNext);<a name="line.5330"></a>
-<span class="sourceLineNo">5331</span>    // 2. scan out "row3" (2 kv)<a name="line.5331"></a>
-<span class="sourceLineNo">5332</span>    currRow.clear();<a name="line.5332"></a>
-<span class="sourceLineNo">5333</span>    hasNext = scanner.next(currRow);<a name="line.5333"></a>
-<span class="sourceLineNo">5334</span>    assertEquals(2, currRow.size());<a name="line.5334"></a>
-<span class="sourceLineNo">5335</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5335"></a>
-<span class="sourceLineNo">5336</span>        .get(0).getRowLength(), row3, 0, row3.length));<a name="line.5336"></a>
-<span class="sourceLineNo">5337</span>    assertTrue(hasNext);<a name="line.5337"></a>
-<span class="sourceLineNo">5338</span>    // 3. scan out "row2" (4 kvs)<a name="line.5338"></a>
-<span class="sourceLineNo">5339</span>    // "row2" takes 2 next() calls since batch=3<a name="line.5339"></a>
-<span class="sourceLineNo">5340</span>    currRow.clear();<a name="line.5340"></a>
-<span class="sourceLineNo">5341</span>    hasNext = scanner.next(currRow);<a name="line.5341"></a>
-<span class="sourceLineNo">5342</span>    assertEquals(3, currRow.size());<a name="line.5342"></a>
-<span class="sourceLineNo">5343</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5343"></a>
-<span class="sourceLineNo">5344</span>        .get(0).getRowLength(), row2, 0, row2.length));<a name="line.5344"></a>
-<span class="sourceLineNo">5345</span>    assertTrue(hasNext);<a name="line.5345"></a>
-<span class="sourceLineNo">5346</span>    currRow.clear();<a name="line.5346"></a>
-<span class="sourceLineNo">5347</span>    hasNext = scanner.next(currRow);<a name="line.5347"></a>
-<span class="sourceLineNo">5348</span>    assertEquals(1, currRow.size());<a name="line.5348"></a>
-<span class="sourceLineNo">5349</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5349"></a>
-<span class="sourceLineNo">5350</span>        .get(0).getRowLength(), row2, 0, row2.length));<a name="line.5350"></a>
-<span class="sourceLineNo">5351</span>    assertTrue(hasNext);<a name="line.5351"></a>
-<span class="sourceLineNo">5352</span>    // 4. scan out "row1" (2 kv)<a name="line.5352"></a>
-<span class="sourceLineNo">5353</span>    currRow.clear();<a name="line.5353"></a>
-<span class="sourceLineNo">5354</span>    hasNext = scanner.next(currRow);<a name="line.5354"></a>
-<span class="sourceLineNo">5355</span>    assertEquals(2, currRow.size());<a name="line.5355"></a>
-<span class="sourceLineNo">5356</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5356"></a>
-<span class="sourceLineNo">5357</span>        .get(0).getRowLength(), row1, 0, row1.length));<a name="line.5357"></a>
-<span class="sourceLineNo">5358</span>    assertTrue(hasNext);<a name="line.5358"></a>
-<span class="sourceLineNo">5359</span>    // 5. scan out "row0" (1 kv)<a name="line.5359"></a>
-<span class="sourceLineNo">5360</span>    currRow.clear();<a name="line.5360"></a>
-<span class="sourceLineNo">5361</span>    hasNext = scanner.next(currRow);<a name="line.5361"></a>
-<span class="sourceLineNo">5362</span>    assertEquals(1, currRow.size());<a name="line.5362"></a>
-<span class="sourceLineNo">5363</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5363"></a>
-<span class="sourceLineNo">5364</span>        .get(0).getRowLength(), row0, 0, row0.length));<a name="line.5364"></a>
-<span class="sourceLineNo">5365</span>    assertFalse(hasNext);<a name="line.5365"></a>
-<span class="sourceLineNo">5366</span><a name="line.5366"></a>
-<span class="sourceLineNo">5367</span>    scanner.close();<a name="line.5367"></a>
-<span class="sourceLineNo">5368</span>  }<a name="line.5368"></a>
-<span class="sourceLineNo">5369</span><a name="line.5369"></a>
-<span class="sourceLineNo">5370</span>  @Test<a name="line.5370"></a>
-<span class="sourceLineNo">5371</span>  public void testReverseScanner_FromMemStoreAndHFiles_MultiCFs2()<a name="line.5371"></a>
-<span class="sourceLineNo">5372</span>      throws IOException {<a name="line.5372"></a>
-<span class="sourceLineNo">5373</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.5373"></a>
-<span class="sourceLineNo">5374</span>    byte[] row2 = Bytes.toBytes("row2");<a name="line.5374"></a>
-<span class="sourceLineNo">5375</span>    byte[] row3 = Bytes.toBytes("row3");<a name="line.5375"></a>
-<span class="sourceLineNo">5376</span>    byte[] row4 = Bytes.toBytes("row4");<a name="line.5376"></a>
-<span class="sourceLineNo">5377</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5377"></a>
-<span class="sourceLineNo">5378</span>    byte[] cf2 = Bytes.toBytes("CF2");<a name="line.5378"></a>
-<span class="sourceLineNo">5379</span>    byte[] cf3 = Bytes.toBytes("CF3");<a name="line.5379"></a>
-<span class="sourceLineNo">5380</span>    byte[] cf4 = Bytes.toBytes("CF4");<a name="line.5380"></a>
-<span class="sourceLineNo">5381</span>    byte[][] families = { cf1, cf2, cf3, cf4 };<a name="line.5381"></a>
-<span class="sourceLineNo">5382</span>    byte[] col = Bytes.toBytes("C");<a name="line.5382"></a>
-<span class="sourceLineNo">5383</span>    long ts = 1;<a name="line.5383"></a>
-<span class="sourceLineNo">5384</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5384"></a>
-<span class="sourceLineNo">5385</span>    // disable compactions in this test.<a name="line.5385"></a>
-<span class="sourceLineNo">5386</span>    conf.setInt("hbase.hstore.compactionThreshold", 10000);<a name="line.5386"></a>
-<span class="sourceLineNo">5387</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5387"></a>
-<span class="sourceLineNo">5388</span>    KeyValue kv1 = new KeyValue(row1, cf1, col, ts, KeyValue.Type.Put, null);<a name="line.5388"></a>
-<span class="sourceLineNo">5389</span>    KeyValue kv2 = new KeyValue(row2, cf2, col, ts, KeyValue.Type.Put, null);<a name="line.5389"></a>
-<span class="sourceLineNo">5390</span>    KeyValue kv3 = new KeyValue(row3, cf3, col, ts, KeyValue.Type.Put, null);<a name="line.5390"></a>
-<span class="sourceLineNo">5391</span>    KeyValue kv4 = new KeyValue(row4, cf4, col, ts, KeyValue.Type.Put, null);<a name="line.5391"></a>
-<span class="sourceLineNo">5392</span>    // storefile1<a name="line.5392"></a>
-<span class="sourceLineNo">5393</span>    Put put = new Put(row1);<a name="line.5393"></a>
-<span class="sourceLineNo">5394</span>    put.add(kv1);<a name="line.5394"></a>
-<span class="sourceLineNo">5395</span>    region.put(put);<a name="line.5395"></a>
-<span class="sourceLineNo">5396</span>    region.flush(true);<a name="line.5396"></a>
-<span class="sourceLineNo">5397</span>    // storefile2<a name="line.5397"></a>
-<span class="sourceLineNo">5398</span>    put = new Put(row2);<a name="line.5398"></a>
-<span class="sourceLineNo">5399</span>    put.add(kv2);<a name="line.5399"></a>
-<span class="sourceLineNo">5400</span>    region.put(put);<a name="line.5400"></a>
-<span class="sourceLineNo">5401</span>    region.flush(true);<a name="line.5401"></a>
-<span class="sourceLineNo">5402</span>    // storefile3<a name="line.5402"></a>
-<span class="sourceLineNo">5403</span>    put = new Put(row3);<a name="line.5403"></a>
-<span class="sourceLineNo">5404</span>    put.add(kv3);<a name="line.5404"></a>
+<span class="sourceLineNo">5277</span>    put = new Put(row4);<a name="line.5277"></a>
+<span class="sourceLineNo">5278</span>    put.add(kv4_5_4);<a name="line.5278"></a>
+<span class="sourceLineNo">5279</span>    put.add(kv4_5_5);<a name="line.5279"></a>
+<span class="sourceLineNo">5280</span>    region.put(put);<a name="line.5280"></a>
+<span class="sourceLineNo">5281</span>    region.flush(true);<a name="line.5281"></a>
+<span class="sourceLineNo">5282</span>    // hfiles(cf1/cf3) : "row1" (1 kvs) / "row2" (1 kv) / "row4" (2 kv)<a name="line.5282"></a>
+<span class="sourceLineNo">5283</span>    put = new Put(row4);<a name="line.5283"></a>
+<span class="sourceLineNo">5284</span>    put.add(kv4_5_1);<a name="line.5284"></a>
+<span class="sourceLineNo">5285</span>    put.add(kv4_5_3);<a name="line.5285"></a>
+<span class="sourceLineNo">5286</span>    region.put(put);<a name="line.5286"></a>
+<span class="sourceLineNo">5287</span>    put = new Put(row1);<a name="line.5287"></a>
+<span class="sourceLineNo">5288</span>    put.add(kv1_2_2);<a name="line.5288"></a>
+<span class="sourceLineNo">5289</span>    region.put(put);<a name="line.5289"></a>
+<span class="sourceLineNo">5290</span>    put = new Put(row2);<a name="line.5290"></a>
+<span class="sourceLineNo">5291</span>    put.add(kv2_4_4);<a name="line.5291"></a>
+<span class="sourceLineNo">5292</span>    region.put(put);<a name="line.5292"></a>
+<span class="sourceLineNo">5293</span>    region.flush(true);<a name="line.5293"></a>
+<span class="sourceLineNo">5294</span>    // hfiles(cf1/cf3) : "row2"(2 kv) / "row3"(1 kvs) / "row4" (1 kv)<a name="line.5294"></a>
+<span class="sourceLineNo">5295</span>    put = new Put(row4);<a name="line.5295"></a>
+<span class="sourceLineNo">5296</span>    put.add(kv4_5_2);<a name="line.5296"></a>
+<span class="sourceLineNo">5297</span>    region.put(put);<a name="line.5297"></a>
+<span class="sourceLineNo">5298</span>    put = new Put(row2);<a name="line.5298"></a>
+<span class="sourceLineNo">5299</span>    put.add(kv2_4_2);<a name="line.5299"></a>
+<span class="sourceLineNo">5300</span>    put.add(kv2_4_3);<a name="line.5300"></a>
+<span class="sourceLineNo">5301</span>    region.put(put);<a name="line.5301"></a>
+<span class="sourceLineNo">5302</span>    put = new Put(row3);<a name="line.5302"></a>
+<span class="sourceLineNo">5303</span>    put.add(kv3_2_2);<a name="line.5303"></a>
+<span class="sourceLineNo">5304</span>    region.put(put);<a name="line.5304"></a>
+<span class="sourceLineNo">5305</span>    region.flush(true);<a name="line.5305"></a>
+<span class="sourceLineNo">5306</span>    // memstore(cf1/cf2/cf3) : "row0" (1 kvs) / "row3" ( 1 kv) / "row5" (max)<a name="line.5306"></a>
+<span class="sourceLineNo">5307</span>    // ( 2 kv)<a name="line.5307"></a>
+<span class="sourceLineNo">5308</span>    put = new Put(row0);<a name="line.5308"></a>
+<span class="sourceLineNo">5309</span>    put.add(kv0_1_1);<a name="line.5309"></a>
+<span class="sourceLineNo">5310</span>    region.put(put);<a name="line.5310"></a>
+<span class="sourceLineNo">5311</span>    put = new Put(row3);<a name="line.5311"></a>
+<span class="sourceLineNo">5312</span>    put.add(kv3_2_1);<a name="line.5312"></a>
+<span class="sourceLineNo">5313</span>    region.put(put);<a name="line.5313"></a>
+<span class="sourceLineNo">5314</span>    put = new Put(row5);<a name="line.5314"></a>
+<span class="sourceLineNo">5315</span>    put.add(kv5_2_1);<a name="line.5315"></a>
+<span class="sourceLineNo">5316</span>    put.add(kv5_2_2);<a name="line.5316"></a>
+<span class="sourceLineNo">5317</span>    region.put(put);<a name="line.5317"></a>
+<span class="sourceLineNo">5318</span>    // scan range = ["row4", min), skip the max "row5"<a name="line.5318"></a>
+<span class="sourceLineNo">5319</span>    Scan scan = new Scan(row4);<a name="line.5319"></a>
+<span class="sourceLineNo">5320</span>    scan.setMaxVersions(5);<a name="line.5320"></a>
+<span class="sourceLineNo">5321</span>    scan.setBatch(3);<a name="line.5321"></a>
+<span class="sourceLineNo">5322</span>    scan.setReversed(true);<a name="line.5322"></a>
+<span class="sourceLineNo">5323</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5323"></a>
+<span class="sourceLineNo">5324</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5324"></a>
+<span class="sourceLineNo">5325</span>    boolean hasNext = false;<a name="line.5325"></a>
+<span class="sourceLineNo">5326</span>    // 1. scan out "row4" (5 kvs), "row5" can't be scanned out since not<a name="line.5326"></a>
+<span class="sourceLineNo">5327</span>    // included in scan range<a name="line.5327"></a>
+<span class="sourceLineNo">5328</span>    // "row4" takes 2 next() calls since batch=3<a name="line.5328"></a>
+<span class="sourceLineNo">5329</span>    hasNext = scanner.next(currRow);<a name="line.5329"></a>
+<span class="sourceLineNo">5330</span>    assertEquals(3, currRow.size());<a name="line.5330"></a>
+<span class="sourceLineNo">5331</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5331"></a>
+<span class="sourceLineNo">5332</span>        .get(0).getRowLength(), row4, 0, row4.length));<a name="line.5332"></a>
+<span class="sourceLineNo">5333</span>    assertTrue(hasNext);<a name="line.5333"></a>
+<span class="sourceLineNo">5334</span>    currRow.clear();<a name="line.5334"></a>
+<span class="sourceLineNo">5335</span>    hasNext = scanner.next(currRow);<a name="line.5335"></a>
+<span class="sourceLineNo">5336</span>    assertEquals(2, currRow.size());<a name="line.5336"></a>
+<span class="sourceLineNo">5337</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(),<a name="line.5337"></a>
+<span class="sourceLineNo">5338</span>        currRow.get(0).getRowLength(), row4, 0,<a name="line.5338"></a>
+<span class="sourceLineNo">5339</span>      row4.length));<a name="line.5339"></a>
+<span class="sourceLineNo">5340</span>    assertTrue(hasNext);<a name="line.5340"></a>
+<span class="sourceLineNo">5341</span>    // 2. scan out "row3" (2 kv)<a name="line.5341"></a>
+<span class="sourceLineNo">5342</span>    currRow.clear();<a name="line.5342"></a>
+<span class="sourceLineNo">5343</span>    hasNext = scanner.next(currRow);<a name="line.5343"></a>
+<span class="sourceLineNo">5344</span>    assertEquals(2, currRow.size());<a name="line.5344"></a>
+<span class="sourceLineNo">5345</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5345"></a>
+<span class="sourceLineNo">5346</span>        .get(0).getRowLength(), row3, 0, row3.length));<a name="line.5346"></a>
+<span class="sourceLineNo">5347</span>    assertTrue(hasNext);<a name="line.5347"></a>
+<span class="sourceLineNo">5348</span>    // 3. scan out "row2" (4 kvs)<a name="line.5348"></a>
+<span class="sourceLineNo">5349</span>    // "row2" takes 2 next() calls since batch=3<a name="line.5349"></a>
+<span class="sourceLineNo">5350</span>    currRow.clear();<a name="line.5350"></a>
+<span class="sourceLineNo">5351</span>    hasNext = scanner.next(currRow);<a name="line.5351"></a>
+<span class="sourceLineNo">5352</span>    assertEquals(3, currRow.size());<a name="line.5352"></a>
+<span class="sourceLineNo">5353</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5353"></a>
+<span class="sourceLineNo">5354</span>        .get(0).getRowLength(), row2, 0, row2.length));<a name="line.5354"></a>
+<span class="sourceLineNo">5355</span>    assertTrue(hasNext);<a name="line.5355"></a>
+<span class="sourceLineNo">5356</span>    currRow.clear();<a name="line.5356"></a>
+<span class="sourceLineNo">5357</span>    hasNext = scanner.next(currRow);<a name="line.5357"></a>
+<span class="sourceLineNo">5358</span>    assertEquals(1, currRow.size());<a name="line.5358"></a>
+<span class="sourceLineNo">5359</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5359"></a>
+<span class="sourceLineNo">5360</span>        .get(0).getRowLength(), row2, 0, row2.length));<a name="line.5360"></a>
+<span class="sourceLineNo">5361</span>    assertTrue(hasNext);<a name="line.5361"></a>
+<span class="sourceLineNo">5362</span>    // 4. scan out "row1" (2 kv)<a name="line.5362"></a>
+<span class="sourceLineNo">5363</span>    currRow.clear();<a name="line.5363"></a>
+<span class="sourceLineNo">5364</span>    hasNext = scanner.next(currRow);<a name="line.5364"></a>
+<span class="sourceLineNo">5365</span>    assertEquals(2, currRow.size());<a name="line.5365"></a>
+<span class="sourceLineNo">5366</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5366"></a>
+<span class="sourceLineNo">5367</span>        .get(0).getRowLength(), row1, 0, row1.length));<a name="line.5367"></a>
+<span class="sourceLineNo">5368</span>    assertTrue(hasNext);<a name="line.5368"></a>
+<span class="sourceLineNo">5369</span>    // 5. scan out "row0" (1 kv)<a name="line.5369"></a>
+<span class="sourceLineNo">5370</span>    currRow.clear();<a name="line.5370"></a>
+<span class="sourceLineNo">5371</span>    hasNext = scanner.next(currRow);<a name="line.5371"></a>
+<span class="sourceLineNo">5372</span>    assertEquals(1, currRow.size());<a name="line.5372"></a>
+<span class="sourceLineNo">5373</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5373"></a>
+<span class="sourceLineNo">5374</span>        .get(0).getRowLength(), row0, 0, row0.length));<a name="line.5374"></a>
+<span class="sourceLineNo">5375</span>    assertFalse(hasNext);<a name="line.5375"></a>
+<span class="sourceLineNo">5376</span><a name="line.5376"></a>
+<span class="sourceLineNo">5377</span>    scanner.close();<a name="line.5377"></a>
+<span class="sourceLineNo">5378</span>  }<a name="line.5378"></a>
+<span class="sourceLineNo">5379</span><a name="line.5379"></a>
+<span class="sourceLineNo">5380</span>  @Test<a name="line.5380"></a>
+<span class="sourceLineNo">5381</span>  public void testReverseScanner_FromMemStoreAndHFiles_MultiCFs2()<a name="line.5381"></a>
+<span class="sourceLineNo">5382</span>      throws IOException {<a name="line.5382"></a>
+<span class="sourceLineNo">5383</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.5383"></a>
+<span class="sourceLineNo">5384</span>    byte[] row2 = Bytes.toBytes("row2");<a name="line.5384"></a>
+<span class="sourceLineNo">5385</span>    byte[] row3 = Bytes.toBytes("row3");<a name="line.5385"></a>
+<span class="sourceLineNo">5386</span>    byte[] row4 = Bytes.toBytes("row4");<a name="line.5386"></a>
+<span class="sourceLineNo">5387</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5387"></a>
+<span class="sourceLineNo">5388</span>    byte[] cf2 = Bytes.toBytes("CF2");<a name="line.5388"></a>
+<span class="sourceLineNo">5389</span>    byte[] cf3 = Bytes.toBytes("CF3");<a name="line.5389"></a>
+<span class="sourceLineNo">5390</span>    byte[] cf4 = Bytes.toBytes("CF4");<a name="line.5390"></a>
+<span class="sourceLineNo">5391</span>    byte[][] families = { cf1, cf2, cf3, cf4 };<a name="line.5391"></a>
+<span class="sourceLineNo">5392</span>    byte[] col = Bytes.toBytes("C");<a name="line.5392"></a>
+<span class="sourceLineNo">5393</span>    long ts = 1;<a name="line.5393"></a>
+<span class="sourceLineNo">5394</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5394"></a>
+<span class="sourceLineNo">5395</span>    // disable compactions in this test.<a name="line.5395"></a>
+<span class="sourceLineNo">5396</span>    conf.setInt("hbase.hstore.compactionThreshold", 10000);<a name="line.5396"></a>
+<span class="sourceLineNo">5397</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5397"></a>
+<span class="sourceLineNo">5398</span>    KeyValue kv1 = new KeyValue(row1, cf1, col, ts, KeyValue.Type.Put, null);<a name="line.5398"></a>
+<span class="sourceLineNo">5399</span>    KeyValue kv2 = new KeyValue(row2, cf2, col, ts, KeyValue.Type.Put, null);<a name="line.5399"></a>
+<span class="sourceLineNo">5400</span>    KeyValue kv3 = new KeyValue(row3, cf3, col, ts, KeyValue.Type.Put, null);<a name="line.5400"></a>
+<span class="sourceLineNo">5401</span>    KeyValue kv4 = new KeyValue(row4, cf4, col, ts, KeyValue.Type.Put, null);<a name="line.5401"></a>
+<span class="sourceLineNo">5402</span>    // storefile1<a name="line.5402"></a>
+<span class="sourceLineNo">5403</span>    Put put = new Put(row1);<a name="line.5403"></a>
+<span class="sourceLineNo">5404</span>    put.add(kv1);<a name="line.5404"></a>
 <span class="sourceLineNo">5405</span>    region.put(put);<a name="line.5405"></a>
 <span class="sourceLineNo">5406</span>    region.flush(true);<a name="line.5406"></a>
-<span class="sourceLineNo">5407</span>    // memstore<a name="line.5407"></a>
-<span class="sourceLineNo">5408</span>    put = new Put(row4);<a name="line.5408"></a>
-<span class="sourceLineNo">5409</span>    put.add(kv4);<a name="line.5409"></a>
+<span class="sourceLineNo">5407</span>    // storefile2<a name="line.5407"></a>
+<span class="sourceLineNo">5408</span>    put = new Put(row2);<a name="line.5408"></a>
+<span class="sourceLineNo">5409</span>    put.add(kv2);<a name="line.5409"></a>
 <span class="sourceLineNo">5410</span>    region.put(put);<a name="line.5410"></a>
-<span class="sourceLineNo">5411</span>    // scan range = ["row4", min)<a name="line.5411"></a>
-<span class="sourceLineNo">5412</span>    Scan scan = new Scan(row4);<a name="line.5412"></a>
-<span class="sourceLineNo">5413</span>    scan.setReversed(true);<a name="line.5413"></a>
-<span class="sourceLineNo">5414</span>    scan.setBatch(10);<a name="line.5414"></a>
-<span class="sourceLineNo">5415</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5415"></a>
-<span class="sourceLineNo">5416</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5416"></a>
-<span class="sourceLineNo">5417</span>    boolean hasNext = scanner.next(currRow);<a name="line.5417"></a>
-<span class="sourceLineNo">5418</span>    assertEquals(1, currRow.size());<a name="line.5418"></a>
-<span class="sourceLineNo">5419</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5419"></a>
-<span class="sourceLineNo">5420</span>        .get(0).getRowLength(), row4, 0, row4.length));<a name="line.5420"></a>
-<span class="sourceLineNo">5421</span>    assertTrue(hasNext);<a name="line.5421"></a>
-<span class="sourceLineNo">5422</span>    currRow.clear();<a name="line.5422"></a>
-<span class="sourceLineNo">5423</span>    hasNext = scanner.next(currRow);<a name="line.5423"></a>
-<span class="sourceLineNo">5424</span>    assertEquals(1, currRow.size());<a name="line.5424"></a>
-<span class="sourceLineNo">5425</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5425"></a>
-<span class="sourceLineNo">5426</span>        .get(0).getRowLength(), row3, 0, row3.length));<a name="line.5426"></a>
-<span class="sourceLineNo">5427</span>    assertTrue(hasNext);<a name="line.5427"></a>
-<span class="sourceLineNo">5428</span>    currRow.clear();<a name="line.5428"></a>
-<span class="sourceLineNo">5429</span>    hasNext = scanner.next(currRow);<a name="line.5429"></a>
-<span class="sourceLineNo">5430</span>    assertEquals(1, currRow.size());<a name="line.5430"></a>
-<span class="sourceLineNo">5431</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5431"></a>
-<span class="sourceLineNo">5432</span>        .get(0).getRowLength(), row2, 0, row2.length));<a name="line.5432"></a>
-<span class="sourceLineNo">5433</span>    assertTrue(hasNext);<a name="line.5433"></a>
-<span class="sourceLineNo">5434</span>    currRow.clear();<a name="line.5434"></a>
-<span class="sourceLineNo">5435</span>    hasNext = scanner.next(currRow);<a name="line.5435"></a>
-<span class="sourceLineNo">5436</span>    assertEquals(1, currRow.size());<a name="line.5436"></a>
-<span class="sourceLineNo">5437</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5437"></a>
-<span class="sourceLineNo">5438</span>        .get(0).getRowLength(), row1, 0, row1.length));<a name="line.5438"></a>
-<span class="sourceLineNo">5439</span>    assertFalse(hasNext);<a name="line.5439"></a>
-<span class="sourceLineNo">5440</span>  }<a name="line.5440"></a>
-<span class="sourceLineNo">5441</span><a name="line.5441"></a>
-<span class="sourceLineNo">5442</span>  /**<a name="line.5442"></a>
-<span class="sourceLineNo">5443</span>   * Test for HBASE-14497: Reverse Scan threw StackOverflow caused by readPt checking<a name="line.5443"></a>
-<span class="sourceLineNo">5444</span>   */<a name="line.5444"></a>
-<span class="sourceLineNo">5445</span>  @Test<a name="line.5445"></a>
-<span class="sourceLineNo">5446</span>  public void testReverseScanner_StackOverflow() throws IOException {<a name="line.5446"></a>
-<span class="sourceLineNo">5447</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5447"></a>
-<span class="sourceLineNo">5448</span>    byte[][] families = {cf1};<a name="line.5448"></a>
-<span class="sourceLineNo">5449</span>    byte[] col = Bytes.toBytes("C");<a name="line.5449"></a>
-<span class="sourceLineNo">5450</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5450"></a>
-<span class="sourceLineNo">5451</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5451"></a>
-<span class="sourceLineNo">5452</span>    // setup with one storefile and one memstore, to create scanner and get an earlier readPt<a name="line.5452"></a>
-<span class="sourceLineNo">5453</span>    Put put = new Put(Bytes.toBytes("19998"));<a name="line.5453"></a>
-<span class="sourceLineNo">5454</span>    put.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5454"></a>
-<span class="sourceLineNo">5455</span>    region.put(put);<a name="line.5455"></a>
-<span class="sourceLineNo">5456</span>    region.flushcache(true, true, FlushLifeCycleTracker.DUMMY);<a name="line.5456"></a>
-<span class="sourceLineNo">5457</span>    Put put2 = new Put(Bytes.toBytes("19997"));<a name="line.5457"></a>
-<span class="sourceLineNo">5458</span>    put2.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5458"></a>
-<span class="sourceLineNo">5459</span>    region.put(put2);<a name="line.5459"></a>
-<span class="sourceLineNo">5460</span><a name="line.5460"></a>
-<span class="sourceLineNo">5461</span>    Scan scan = new Scan(Bytes.toBytes("19998"));<a name="line.5461"></a>
-<span class="sourceLineNo">5462</span>    scan.setReversed(true);<a name="line.5462"></a>
-<span class="sourceLineNo">5463</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5463"></a>
-<span class="sourceLineNo">5464</span><a name="line.5464"></a>
-<span class="sourceLineNo">5465</span>    // create one storefile contains many rows will be skipped<a name="line.5465"></a>
-<span class="sourceLineNo">5466</span>    // to check StoreFileScanner.seekToPreviousRow<a name="line.5466"></a>
-<span class="sourceLineNo">5467</span>    for (int i = 10000; i &lt; 20000; i++) {<a name="line.5467"></a>
-<span class="sourceLineNo">5468</span>      Put p = new Put(Bytes.toBytes(""+i));<a name="line.5468"></a>
-<span class="sourceLineNo">5469</span>      p.addColumn(cf1, col, Bytes.toBytes("" + i));<a name="line.5469"></a>
-<span class="sourceLineNo">5470</span>      region.put(p);<a name="line.5470"></a>
-<span class="sourceLineNo">5471</span>    }<a name="line.5471"></a>
-<span class="sourceLineNo">5472</span>    region.flushcache(true, true, FlushLifeCycleTracker.DUMMY);<a name="line.5472"></a>
-<span class="sourceLineNo">5473</span><a name="line.5473"></a>
-<span class="sourceLineNo">5474</span>    // create one memstore contains many rows will be skipped<a name="line.5474"></a>
-<span class="sourceLineNo">5475</span>    // to check MemStoreScanner.seekToPreviousRow<a name="line.5475"></a>
-<span class="sourceLineNo">5476</span>    for (int i = 10000; i &lt; 20000; i++) {<a name="line.5476"></a>
-<span class="sourceLineNo">5477</span>      Put p = new Put(Bytes.toBytes(""+i));<a name="line.5477"></a>
-<span class="sourceLineNo">5478</span>      p.addColumn(cf1, col, Bytes.toBytes("" + i));<a name="line.5478"></a>
-<span class="sourceLineNo">5479</span>      region.put(p);<a name="line.5479"></a>
-<span class="sourceLineNo">5480</span>    }<a name="line.5480"></a>
-<span class="sourceLineNo">5481</span><a name="line.5481"></a>
-<span class="sourceLineNo">5482</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5482"></a>
-<span class="sourceLineNo">5483</span>    boolean hasNext;<a name="line.5483"></a>
-<span class="sourceLineNo">5484</span>    do {<a name="line.5484"></a>
-<span class="sourceLineNo">5485</span>      hasNext = scanner.next(currRow);<a name="line.5485"></a>
-<span class="sourceLineNo">5486</span>    } while (hasNext);<a name="line.5486"></a>
-<span class="sourceLineNo">5487</span>    assertEquals(2, currRow.size());<a name="line.5487"></a>
-<span class="sourceLineNo">5488</span>    assertEquals("19998", Bytes.toString(currRow.get(0).getRowArray(),<a name="line.5488"></a>
-<span class="sourceLineNo">5489</span>      currRow.get(0).getRowOffset(), currRow.get(0).getRowLength()));<a name="line.5489"></a>
-<span class="sourceLineNo">5490</span>    assertEquals("19997", Bytes.toString(currRow.get(1).getRowArray(),<a name="line.5490"></a>
-<span class="sourceLineNo">5491</span>      currRow.get(1).getRowOffset(), currRow.get(1).getRowLength()));<a name="line.5491"></a>
-<span class="sourceLineNo">5492</span>  }<a name="line.5492"></a>
-<span class="sourceLineNo">5493</span><a name="line.5493"></a>
-<span class="sourceLineNo">5494</span>  @Test<a name="line.5494"></a>
-<span class="sourceLineNo">5495</span>  public void testReverseScanShouldNotScanMemstoreIfReadPtLesser() throws Exception {<a name="line.5495"></a>
-<span class="sourceLineNo">5496</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5496"></a>
-<span class="sourceLineNo">5497</span>    byte[][] families = { cf1 };<a name="line.5497"></a>
-<span class="sourceLineNo">5498</span>    byte[] col = Bytes.toBytes("C");<a name="line.5498"></a>
-<span class="sourceLineNo">5499</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5499"></a>
-<span class="sourceLineNo">5500</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5500"></a>
-<span class="sourceLineNo">5501</span>    // setup with one storefile and one memstore, to create scanner and get an earlier readPt<a name="line.5501"></a>
-<span class="sourceLineNo">5502</span>    Put put = new Put(Bytes.toBytes("19996"));<a name="line.5502"></a>
-<span class="sourceLineNo">5503</span>    put.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5503"></a>
-<span class="sourceLineNo">5504</span>    region.put(put);<a name="line.5504"></a>
-<span class="sourceLineNo">5505</span>    Put put2 = new Put(Bytes.toBytes("19995"));<a name="line.5505"></a>
-<span class="sourceLineNo">5506</span>    put2.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5506"></a>
-<span class="sourceLineNo">5507</span>    region.put(put2);<a name="line.5507"></a>
-<span class="sourceLineNo">5508</span>    // create a reverse scan<a name="line.5508"></a>
-<span class="sourceLineNo">5509</span>    Scan scan = new Scan(Bytes.toBytes("19996"));<a name="line.5509"></a>
-<span class="sourceLineNo">5510</span>    scan.setReversed(true);<a name="line.5510"></a>
-<span class="sourceLineNo">5511</span>    RegionScannerImpl scanner = region.getScanner(scan);<a name="line.5511"></a>
-<span class="sourceLineNo">5512</span><a name="line.5512"></a>
-<span class="sourceLineNo">5513</span>    // flush the cache. This will reset the store scanner<a name="line.5513"></a>
-<span class="sourceLineNo">5514</span>    region.flushcache(true, true, FlushLifeCycleTracker.DUMMY);<a name="line.5514"></a>
-<span class="sourceLineNo">5515</span><a name="line.5515"></a>
-<span class="sourceLineNo">5516</span>    // create one memstore contains many rows will be skipped<a name="line.5516"></a>
-<span class="sourceLineNo">5517</span>    // to check MemStoreScanner.seekToPreviousRow<a name="line.5517"></a>
-<span class="sourceLineNo">5518</span>    for (int i = 10000; i &lt; 20000; i++) {<a name="line.5518"></a>
-<span class="sourceLineNo">5519</span>      Put p = new Put(Bytes.toBytes("" + i));<a name="line.5519"></a>
-<span class="sourceLineNo">5520</span>      p.addColumn(cf1, col, Bytes.toBytes("" + i));<a name="line.5520"></a>
-<span class="sourceLineNo">5521</span>      region.put(p);<a name="line.5521"></a>
-<span class="sourceLineNo">5522</span>    }<a name="line.5522"></a>
-<span class="sourceLineNo">5523</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5523"></a>
-<span class="sourceLineNo">5524</span>    boolean hasNext;<a name="line.5524"></a>
-<span class="sourceLineNo">5525</span>    boolean assertDone = false;<a name="line.5525"></a>
-<span class="sourceLineNo">5526</span>    do {<a name="line.5526"></a>
-<span class="sourceLineNo">5527</span>      hasNext = scanner.next(currRow);<a name="line.5527"></a>
-<span class="sourceLineNo">5528</span>      // With HBASE-15871, after the scanner is reset the memstore scanner should not be<a name="line.5528"></a>
-<span class="sourceLineNo">5529</span>      // added here<a name="line.5529"></a>
-<span class="sourceLineNo">5530</span>      if (!assertDone) {<a name="line.5530"></a>
-<span class="sourceLineNo">5531</span>        StoreScanner current =<a name="line.5531"></a>
-<span class="sourceLineNo">5532</span>            (StoreScanner) (scanner.storeHeap).getCurrentForTesting();<a name="line.5532"></a>
-<span class="sourceLineNo">5533</span>        List&lt;KeyValueScanner&gt; scanners = current.getAllScannersForTesting();<a name="line.5533"></a>
-<span class="sourceLineNo">5534</span>        assertEquals("There should be only one scanner the store file scanner", 1,<a name="line.5534"></a>
-<span class="sourceLineNo">5535</span>          scanners.size());<a name="line.5535"></a>
-<span class="sourceLineNo">5536</span>        assertDone = true;<a name="line.5536"></a>
-<span class="sourceLineNo">5537</span>      }<a name="line.5537"></a>
-<span class="sourceLineNo">5538</span>    } while (hasNext);<a name="line.5538"></a>
-<span class="sourceLineNo">5539</span>    assertEquals(2, currRow.size());<a name="line.5539"></a>
-<span class="sourceLineNo">5540</span>    assertEquals("19996", Bytes.toString(currRow.get(0).getRowArray(),<a name="line.5540"></a>
-<span class="sourceLineNo">5541</span>      currRow.get(0).getRowOffset(), currRow.get(0).getRowLength()));<a name="line.5541"></a>
-<span class="sourceLineNo">5542</span>    assertEquals("19995", Bytes.toString(currRow.get(1).getRowArray(),<a name="line.5542"></a>
-<span class="sourceLineNo">5543</span>      currRow.get(1).getRowOffset(), currRow.get(1).getRowLength()));<a name="line.5543"></a>
-<span class="sourceLineNo">5544</span>  }<a name="line.5544"></a>
-<span class="sourceLineNo">5545</span><a name="line.5545"></a>
-<span class="sourceLineNo">5546</span>  @Test<a name="line.5546"></a>
-<span class="sourceLineNo">5547</span>  public void testReverseScanWhenPutCellsAfterOpenReverseScan() throws Exception {<a name="line.5547"></a>
-<span class="sourceLineNo">5548</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5548"></a>
-<span class="sourceLineNo">5549</span>    byte[][] families = { cf1 };<a name="line.5549"></a>
-<span class="sourceLineNo">5550</span>    byte[] col = Bytes.toBytes("C");<a name="line.5550"></a>
-<span class="sourceLineNo">5551</span><a name="line.5551"></a>
-<span class="sourceLineNo">5552</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5552"></a>
-<span class="sourceLineNo">5553</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5553"></a>
-<span class="sourceLineNo">5554</span><a name="line.5554"></a>
-<span class="sourceLineNo">5555</span>    Put put = new Put(Bytes.toBytes("199996"));<a name="line.5555"></a>
-<span class="sourceLineNo">5556</span>    put.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5556"></a>
-<span class="sourceLineNo">5557</span>    region.put(put);<a name="line.5557"></a>
-<span class="sourceLineNo">5558</span>    Put put2 = new Put(Bytes.toBytes("199995"));<a name="line.5558"></a>
-<span class="sourceLineNo">5559</span>    put2.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5559"></a>
-<span class="sourceLineNo">5560</span>    region.put(put2);<a name="line.5560"></a>
+<span class="sourceLineNo">5411</span>    region.flush(true);<a name="line.5411"></a>
+<span class="sourceLineNo">5412</span>    // storefile3<a name="line.5412"></a>
+<span class="sourceLineNo">5413</span>    put = new Put(row3);<a name="line.5413"></a>
+<span class="sourceLineNo">5414</span>    put.add(kv3);<a name="line.5414"></a>
+<span class="sourceLineNo">5415</span>    region.put(put);<a name="line.5415"></a>
+<span class="sourceLineNo">5416</span>    region.flush(true);<a name="line.5416"></a>
+<span class="sourceLineNo">5417</span>    // memstore<a name="line.5417"></a>
+<span class="sourceLineNo">5418</span>    put = new Put(row4);<a name="line.5418"></a>
+<span class="sourceLineNo">5419</span>    put.add(kv4);<a name="line.5419"></a>
+<span class="sourceLineNo">5420</span>    region.put(put);<a name="line.5420"></a>
+<span class="sourceLineNo">5421</span>    // scan range = ["row4", min)<a name="line.5421"></a>
+<span class="sourceLineNo">5422</span>    Scan scan = new Scan(row4);<a name="line.5422"></a>
+<span class="sourceLineNo">5423</span>    scan.setReversed(true);<a name="line.5423"></a>
+<span class="sourceLineNo">5424</span>    scan.setBatch(10);<a name="line.5424"></a>
+<span class="sourceLineNo">5425</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5425"></a>
+<span class="sourceLineNo">5426</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5426"></a>
+<span class="sourceLineNo">5427</span>    boolean hasNext = scanner.next(currRow);<a name="line.5427"></a>
+<span class="sourceLineNo">5428</span>    assertEquals(1, currRow.size());<a name="line.5428"></a>
+<span class="sourceLineNo">5429</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5429"></a>
+<span class="sourceLineNo">5430</span>        .get(0).getRowLength(), row4, 0, row4.length));<a name="line.5430"></a>
+<span class="sourceLineNo">5431</span>    assertTrue(hasNext);<a name="line.5431"></a>
+<span class="sourceLineNo">5432</span>    currRow.clear();<a name="line.5432"></a>
+<span class="sourceLineNo">5433</span>    hasNext = scanner.next(currRow);<a name="line.5433"></a>
+<span class="sourceLineNo">5434</span>    assertEquals(1, currRow.size());<a name="line.5434"></a>
+<span class="sourceLineNo">5435</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5435"></a>
+<span class="sourceLineNo">5436</span>        .get(0).getRowLength(), row3, 0, row3.length));<a name="line.5436"></a>
+<span class="sourceLineNo">5437</span>    assertTrue(hasNext);<a name="line.5437"></a>
+<span class="sourceLineNo">5438</span>    currRow.clear();<a name="line.5438"></a>
+<span class="sourceLineNo">5439</span>    hasNext = scanner.next(currRow);<a name="line.5439"></a>
+<span class="sourceLineNo">5440</span>    assertEquals(1, currRow.size());<a name="line.5440"></a>
+<span class="sourceLineNo">5441</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5441"></a>
+<span class="sourceLineNo">5442</span>        .get(0).getRowLength(), row2, 0, row2.length));<a name="line.5442"></a>
+<span class="sourceLineNo">5443</span>    assertTrue(hasNext);<a name="line.5443"></a>
+<span class="sourceLineNo">5444</span>    currRow.clear();<a name="line.5444"></a>
+<span class="sourceLineNo">5445</span>    hasNext = scanner.next(currRow);<a name="line.5445"></a>
+<span class="sourceLineNo">5446</span>    assertEquals(1, currRow.size());<a name="line.5446"></a>
+<span class="sourceLineNo">5447</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5447"></a>
+<span class="sourceLineNo">5448</span>        .get(0).getRowLength(), row1, 0, row1.length));<a name="line.5448"></a>
+<span class="sourceLineNo">5449</span>    assertFalse(hasNext);<a name="line.5449"></a>
+<span class="sourceLineNo">5450</span>  }<a name="line.5450"></a>
+<span class="sourceLineNo">5451</span><a name="line.5451"></a>
+<span class="sourceLineNo">5452</span>  /**<a name="line.5452"></a>
+<span class="sourceLineNo">5453</span>   * Test for HBASE-14497: Reverse Scan threw StackOverflow caused by readPt checking<a name="line.5453"></a>
+<span class="sourceLineNo">5454</span>   */<a name="line.5454"></a>
+<span class="sourceLineNo">5455</span>  @Test<a name="line.5455"></a>
+<span class="sourceLineNo">5456</span>  public void testReverseScanner_StackOverflow() throws IOException {<a name="line.5456"></a>
+<span class="sourceLineNo">5457</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5457"></a>
+<span class="sourceLineNo">5458</span>    byte[][] families = {cf1};<a name="line.5458"></a>
+<span class="sourceLineNo">5459</span>    byte[] col = Bytes.toBytes("C");<a name="line.5459"></a>
+<span class="sourceLineNo">5460</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5460"></a>
+<span class="sourceLineNo">5461</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5461"></a>
+<span class="sourceLineNo">5462</span>    // setup with one storefile and one memstore, to create scanner and get an earlier readPt<a name="line.5462"></a>
+<span class="sourceLineNo">5463</span>    Put put = new Put(Bytes.toBytes("19998"));<a name="line.5463"></a>
+<span class="sourceLineNo">5464</span>    put.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5464"></a>
+<span class="sourceLineNo">5465</span>    region.put(put);<a name="line.5465"></a>
+<span class="sourceLineNo">5466</span>    region.flushcache(true, true, FlushLifeCycleTracker.DUMMY);<a name="line.5466"></a>
+<span class="sourceLineNo">5467</span>    Put put2 = new Put(Bytes.toBytes("19997"));<a name="line.5467"></a>
+<span class="sourceLineNo">5468</span>    put2.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5468"></a>
+<span class="sourceLineNo">5469</span>    region.put(put2);<a name="line.5469"></a>
+<span class="sourceLineNo">5470</span><a name="line.5470"></a>
+<span class="sourceLineNo">5471</span>    Scan scan = new Scan(Bytes.toBytes("19998"));<a name="line.5471"></a>
+<span class="sourceLineNo">5472</span>    scan.setReversed(true);<a name="line.5472"></a>
+<span class="sourceLineNo">5473</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5473"></a>
+<span class="sourceLineNo">5474</span><a name="line.5474"></a>
+<span class="sourceLineNo">5475</span>    // create one storefile contains many rows will be skipped<a name="line.5475"></a>
+<span class="sourceLineNo">5476</span>    // to check StoreFileScanner.seekToPreviousRow<a name="line.5476"></a>
+<span class="sourceLineNo">5477</span>    for (int i = 10000; i &lt; 20000; i++) {<a name="line.5477"></a>
+<span class="sourceLineNo">5478</span>      Put p = new Put(Bytes.toBytes(""+i));<a name="line.5478"></a>
+<span class="sourceLineNo">5479</span>      p.addColumn(cf1, col, Bytes.toBytes("" + i));<a name="line.5479"></a>
+<span class="sourceLineNo">5480</span>      region.put(p);<a name="line.5480"></a>
+<span class="sourceLineNo">5481</span>    }<a name="line.5481"></a>
+<span class="sourceLineNo">5482</span>    region.flushcache(true, true, FlushLifeCycleTracker.DUMMY);<a name="line.5482"></a>
+<span class="sourceLineNo">5483</span><a name="line.5483"></a>
+<span class="sourceLineNo">5484</span>    // create one memstore contains many rows will be skipped<a name="line.5484"></a>
+<span class="sourceLineNo">5485</span>    // to check MemStoreScanner.seekToPreviousRow<a name="line.5485"></a>
+<span class="sourceLineNo">5486</span>    for (int i = 10000; i &lt; 20000; i++) {<a name="line.5486"></a>
+<span class="sourceLineNo">5487</span>      Put p = new Put(Bytes.toBytes(""+i));<a name="line.5487"></a>
+<span class="sourceLineNo">5488</span>      p.addColumn(cf1, col, Bytes.toBytes("" + i));<a name="line.5488"></a>
+<span class="sourceLineNo">5489</span>      region.put(p);<a name="line.5489"></a>
+<span class="sourceLineNo">5490</span>    }<a name="line.5490"></a>
+<span class="sourceLineNo">5491</span><a name="line.5491"></a>
+<span class="sourceLineNo">5492</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5492"></a>
+<span class="sourceLineNo">5493</span>    boolean hasNext;<a name="line.5493"></a>
+<span class="sourceLineNo">5494</span>    do {<a name="line.5494"></a>
+<span class="sourceLineNo">5495</span>      hasNext = scanner.next(currRow);<a name="line.5495"></a>
+<span class="sourceLineNo">5496</span>    } while (hasNext);<a name="line.5496"></a>
+<span class="sourceLineNo">5497</span>    assertEquals(2, currRow.size());<a name="line.5497"></a>
+<span class="sourceLineNo">5498</span>    assertEquals("19998", Bytes.toString(currRow.get(0).getRowArray(),<a name="line.5498"></a>
+<span class="sourceLineNo">5499</span>      currRow.get(0).getRowOffset(), currRow.get(0).getRowLength()));<a name="line.5499"></a>
+<span class="sourceLineNo">5500</span>    assertEquals("19997", Bytes.toString(currRow.get(1).getRowArray(),<a name="line.5500"></a>
+<span class="sourceLineNo">5501</span>      currRow.get(1).getRowOffset(), currRow.get(1).getRowLength()));<a name="line.5501"></a>
+<span class="sourceLineNo">5502</span>  }<a name="line.5502"></a>
+<span class="sourceLineNo">5503</span><a name="line.5503"></a>
+<span class="sourceLineNo">5504</span>  @Test<a name="line.5504"></a>
+<span class="sourceLineNo">5505</span>  public void testReverseScanShouldNotScanMemstoreIfReadPtLesser() throws Exception {<a name="line.5505"></a>
+<span class="sourceLineNo">5506</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5506"></a>
+<span class="sourceLineNo">5507</span>    byte[][] families = { cf1 };<a name="line.5507"></a>
+<span class="sourceLineNo">5508</span>    byte[] col = Bytes.toBytes("C");<a name="line.5508"></a>
+<span class="sourceLineNo">5509</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5509"></a>
+<span class="sourceLineNo">5510</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5510"></a>
+<span class="sourceLineNo">5511</span>    // setup with one storefile and one memstore, to create scanner and get an earlier readPt<a name="line.5511"></a>
+<span class="sourceLineNo">5512</span>    Put put = new Put(Bytes.toBytes("19996"));<a name="line.5512"></a>
+<span class="sourceLineNo">5513</span>    put.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5513"></a>
+<span class="sourceLineNo">5514</span>    region.put(put);<a name="line.5514"></a>
+<span class="sourceLineNo">5515</span>    Put put2 = new Put(Bytes.toBytes("19995"));<a name="line.5515"></a>
+<span class="sourceLineNo">5516</span>    put2.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5516"></a>
+<span class="sourceLineNo">5517</span>    region.put(put2);<a name="line.5517"></a>
+<span class="sourceLineNo">5518</span>    // create a reverse scan<a name="line.5518"></a>
+<span class="sourceLineNo">5519</span>    Scan scan = new Scan(Bytes.toBytes("19996"));<a name="line.5519"></a>
+<span class="sourceLineNo">5520</span>    scan.setReversed(true);<a name="line.5520"></a>
+<span class="sourceLineNo">5521</span>    RegionScannerImpl scanner = region.getScanner(scan);<a name="line.5521"></a>
+<span class="sourceLineNo">5522</span><a name="line.5522"></a>
+<span class="sourceLineNo">5523</span>    // flush the cache. This will reset the store scanner<a name="line.5523"></a>
+<span class="sourceLineNo">5524</span>    region.flushcache(true, true, FlushLifeCycleTracker.DUMMY);<a name="line.5524"></a>
+<span class="sourceLineNo">5525</span><a name="line.5525"></a>
+<span class="sourceLineNo">5526</span>    // create one memstore contains many rows will be skipped<a name="line.5526"></a>
+<span class="sourceLineNo">5527</span>    // to check MemStoreScanner.seekToPreviousRow<a name="line.5527"></a>
+<span class="sourceLineNo">5528</span>    for (int i = 10000; i &lt; 20000; i++) {<a name="line.5528"></a>
+<span class="sourceLineNo">5529</span>      Put p = new Put(Bytes.toBytes("" + i));<a name="line.5529"></a>
+<span class="sourceLineNo">5530</span>      p.addColumn(cf1, col, Bytes.toBytes("" + i));<a name="line.5530"></a>
+<span class="sourceLineNo">5531</span>      region.put(p);<a name="line.5531"></a>
+<span class="sourceLineNo">5532</span>    }<a name="line.5532"></a>
+<span class="sourceLineNo">5533</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5533"></a>
+<span class="sourceLineNo">5534</span>    boolean hasNext;<a name="line.5534"></a>
+<span class="sourceLineNo">5535</span>    boolean assertDone = false;<a name="line.5535"></a>
+<span class="sourceLineNo">5536</span>    do {<a name="line.5536"></a>
+<span class="sourceLineNo">5537</span>      hasNext = scanner.next(currRow);<a name="line.5537"></a>
+<span class="sourceLineNo">5538</span>      // With HBASE-15871, after the scanner is reset the memstore scanner should not be<a name="line.5538"></a>
+<span class="sourceLineNo">5539</span>      // added here<a name="line.5539"></a>
+<span class="sourceLineNo">5540</span>      if (!assertDone) {<a name="line.5540"></a>
+<span class="sourceLineNo">5541</span>        StoreScanner current =<a name="line.5541"></a>
+<span class="sourceLineNo">5542</span>            (StoreScanner) (scanner.storeHeap).getCurrentForTesting();<a name="line.5542"></a>
+<span class="sourceLineNo">5543</span>        List&lt;KeyValueScanner&gt; scanners = current.getAllScannersForTesting();<a name="line.5543"></a>
+<span class="sourceLineNo">5544</span>        assertEquals("There should be only one scanner the store file scanner", 1,<a name="line.5544"></a>
+<span class="sourceLineNo">5545</span>          scanners.size());<a name="line.5545"></a>
+<span class="sourceLineNo">5546</span>        assertDone = true;<a name="line.5546"></a>
+<span class="sourceLineNo">5547</span>      }<a name="line.5547"></a>
+<span class="sourceLineNo">5548</span>    } while (hasNext);<a name="line.5548"></a>
+<span class="sourceLineNo">5549</span>    assertEquals(2, currRow.size());<a name="line.5549"></a>
+<span class="sourceLineNo">5550</span>    assertEquals("19996", Bytes.toString(currRow.get(0).getRowArray(),<a name="line.5550"></a>
+<span class="sourceLineNo">5551</span>      currRow.get(0).getRowOffset(), currRow.get(0).getRowLength()));<a name="line.5551"></a>
+<span class="sourceLineNo">5552</span>    assertEquals("19995", Bytes.toString(currRow.get(1).getRowArray(),<a name="line.5552"></a>
+<span class="sourceLineNo">5553</span>      currRow.get(1).getRowOffset(), currRow.get(1).getRowLength()));<a name="line.5553"></a>
+<span class="sourceLineNo">5554</span>  }<a name="line.5554"></a>
+<span class="sourceLineNo">5555</span><a name="line.5555"></a>
+<span class="sourceLineNo">5556</span>  @Test<a name="line.5556"></a>
+<span class="sourceLineNo">5557</span>  public void testReverseScanWhenPutCellsAfterOpenReverseScan() throws Exception {<a name="line.5557"></a>
+<span class="sourceLineNo">5558</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5558"></a>
+<span class="sourceLineNo">5559</span>    byte[][] families = { cf1 };<a name="line.5559"></a>
+<span class="sourceLineNo">5560</span>    byte[] col = Bytes.toBytes("C");<a name="line.5560"></a>
 <span class="sourceLineNo">5561</span><a name="line.5561"></a>
-<span class="sourceLineNo">5562</span>    // Create a reverse scan<a name="line.5562"></a>
-<span class="sourceLineNo">5563</span>    Scan scan = new Scan(Bytes.toBytes("199996"));<a name="line.5563"></a>
-<span class="sourceLineNo">5564</span>    scan.setReversed(true);<a name="line.5564"></a>
-<span class="sourceLineNo">5565</span>    RegionScannerImpl scanner = region.getScanner(scan);<a name="line.5565"></a>
-<span class="sourceLineNo">5566</span><a name="line.5566"></a>
-<span class="sourceLineNo">5567</span>    // Put a lot of cells that have sequenceIDs grater than the readPt of the reverse scan<a name="line.5567"></a>
-<span class="sourceLineNo">5568</span>    for (int i = 100000; i &lt; 200000; i++) {<a name="line.5568"></a>
-<span class="sourceLineNo">5569</span>      Put p = new Put(Bytes.toBytes("" + i));<a name="line.5569"></a>
-<span class="sourceLineNo">5570</span>      p.addColumn(cf1, col, Bytes.toBytes("" + i));<a name="line.5570"></a>
-<span class="sourceLineNo">5571</span>      region.put(p);<a name="line.5571"></a>
-<span class="sourceLineNo">5572</span>    }<a name="line.5572"></a>
-<span class="sourceLineNo">5573</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5573"></a>
-<span class="sourceLineNo">5574</span>    boolean hasNext;<a name="line.5574"></a>
-<span class="sourceLineNo">5575</span>    do {<a name="line.5575"></a>
-<span class="sourceLineNo">5576</span>      hasNext = scanner.next(currRow);<a name="line.5576"></a>
-<span class="sourceLineNo">5577</span>    } while (hasNext);<a name="line.5577"></a>
-<span class="sourceLineNo">5578</span><a name="line.5578"></a>
-<span class="sourceLineNo">5579</span>    assertEquals(2, currRow.size());<a name="line.5579"></a>
-<span class="sourceLineNo">5580</span>    assertEquals("199996", Bytes.toString(currRow.get(0).getRowArray(),<a name="line.5580"></a>
-<span class="sourceLineNo">5581</span>      currRow.get(0).getRowOffset(), currRow.get(0).getRowLength()));<a name="line.5581"></a>
-<span class="sourceLineNo">5582</span>    assertEquals("199995", Bytes.toString(currRow.get(1).getRowArray(),<a name="line.5582"></a>
-<span class="sourceLineNo">5583</span>      currRow.get(1).getRowOffset(), currRow.get(1).getRowLength()));<a name="line.5583"></a>
-<span class="sourceLineNo">5584</span>  }<a name="line.5584"></a>
-<span class="sourceLineNo">5585</span><a name="line.5585"></a>
-<span class="sourceLineNo">5586</span>  @Test<a name="line.5586"></a>
-<span class="sourceLineNo">5587</span>  public void testWriteRequestsCounter() throws IOException {<a name="line.5587"></a>
-<span class="sourceLineNo">5588</span>    byte[] fam = Bytes.toBytes("info");<a name="line.5588"></a>
-<span class="sourceLineNo">5589</span>    byte[][] families = { fam };<a name="line.5589"></a>
-<span class="sourceLineNo">5590</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.5590"></a>
-<span class="sourceLineNo">5591</span><a name="line.5591"></a>
-<span class="sourceLineNo">5592</span>    Assert.assertEquals(0L, region.getWriteRequestsCount());<a name="line.5592"></a>
-<span class="sourceLineNo">5593</span><a name="line.5593"></a>
-<span class="sourceLineNo">5594</span>    Put put = new Put(row);<a name="line.5594"></a>
-<span class="sourceLineNo">5595</span>    put.addColumn(fam, fam, fam);<a name="line.5595"></a>
-<span class="sourceLineNo">5596</span><a name="line.5596"></a>
-<span class="sourceLineNo">5597</span>    Assert.assertEquals(0L, region.getWriteRequestsCount());<a name="line.5597"></a>
-<span class="sourceLineNo">5598</span>    region.put(put);<a name="line.5598"></a>
-<span class="sourceLineNo">5599</span>    Assert.assertEquals(1L, region.getWriteRequestsCount());<a name="line.5599"></a>
-<span class="sourceLineNo">5600</span>    region.put(put);<a name="line.5600"></a>
-<span class="sourceLineNo">5601</span>    Assert.assertEquals(2L, region.getWriteRequestsCount());<a name="line.5601"></a>
-<span class="sourceLineNo">5602</span>    region.put(put);<a name="line.5602"></a>
-<span class="sourceLineNo">5603</span>    Assert.assertEquals(3L, region.getWriteRequestsCount());<a name="line.5603"></a>
-<span class="sourceLineNo">5604</span><a name="line.5604"></a>
-<span class="sourceLineNo">5605</span>    region.delete(new Delete(row));<a name="line.5605"></a>
-<span class="sourceLineNo">5606</span>    Assert.assertEquals(4L, region.getWriteRequestsCount());<a name="line.5606"></a>
-<span class="sourceLineNo">5607</span>  }<a name="line.5607"></a>
-<span class="sourceLineNo">5608</span><a name="line.5608"></a>
-<span class="sourceLineNo">5609</span>  @Test<a name="line.5609"></a>
-<span class="sourceLineNo">5610</span>  public void testOpenRegionWrittenToWAL() throws Exception {<a name="line.5610"></a>
-<span class="sourceLineNo">5611</span>    final ServerName serverName = ServerName.valueOf(name.getMethodName(), 100, 42);<a name="line.5611"></a>
-<span class="sourceLineNo">5612</span>    final RegionServerServices rss = spy(TEST_UTIL.createMockRegionServerService(serverName));<a name="line.5612"></a>
-<span class="sourceLineNo">5613</span><a name="line.5613"></a>
-<span class="sourceLineNo">5614</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.5614"></a>
-<span class="sourceLineNo">5615</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.5615"></a>
-<span class="sourceLineNo">5616</span>    htd.addFamily(new HColumnDescriptor(fam2));<a name="line.5616"></a>
-<span class="sourceLineNo">5617</span><a name="line.5617"></a>
-<span class="sourceLineNo">5618</span>    HRegionInfo hri = new HRegionInfo(htd.getTableName(),<a name="line.5618"></a>
-<span class="sourceLineNo">5619</span>      HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY);<a name="line.5619"></a>
-<span class="sourceLineNo">5620</span><a name="line.5620"></a>
-<span class="sourceLineNo">5621</span>    // open the region w/o rss and wal and flush some files<a name="line.5621"></a>
-<span class="sourceLineNo">5622</span>    region =<a name="line.5622"></a>
-<span class="sourceLineNo">5623</span>         HBaseTestingUtility.createRegionAndWAL(hri, TEST_UTIL.getDataTestDir(), TEST_UTIL<a name="line.5623"></a>
-<span class="sourceLineNo">5624</span>             .getConfiguration(), htd);<a name="line.5624"></a>
-<span class="sourceLineNo">5625</span>    assertNotNull(region);<a name="line.5625"></a>
-<span class="sourceLineNo">5626</span><a name="line.5626"></a>
-<span class="sourceLineNo">5627</span>    // create a file in fam1 for the region before opening in OpenRegionHandler<a name="line.5627"></a>
-<span class="sourceLineNo">5628</span>    region.put(new Put(Bytes.toBytes("a")).addColumn(fam1, fam1, fam1));<a name="line.5628"></a>
-<span class="sourceLineNo">5629</span>    region.flush(true);<a name="line.5629"></a>
-<span class="sourceLineNo">5630</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.5630"></a>
-<span class="sourceLineNo">5631</span><a name="line.5631"></a>
-<span class="sourceLineNo">5632</span>    ArgumentCaptor&lt;WALEdit&gt; editCaptor = ArgumentCaptor.forClass(WALEdit.class);<a name="line.5632"></a>
-<span class="sourceLineNo">5633</span><a name="line.5633"></a>
-<span class="sourceLineNo">5634</span>    // capture append() calls<a name="line.5634"></a>
-<span class="sourceLineNo">5635</span>    WAL wal = mockWAL();<a name="line.5635"></a>
-<span class="sourceLineNo">5636</span>    when(rss.getWAL((HRegionInfo) any())).thenReturn(wal);<a name="line.5636"></a>
-<span class="sourceLineNo">5637</span><a name="line.5637"></a>
-<span class="sourceLineNo">5638</span>    region = HRegion.openHRegion(hri, htd, rss.getWAL(hri),<a name="line.5638"></a>
-<span class="sourceLineNo">5639</span>      TEST_UTIL.getConfiguration(), rss, null);<a name="line.5639"></a>
-<span class="sourceLineNo">5640</span><a name="line.5640"></a>
-<span class="sourceLineNo">5641</span>    verify(wal, times(1)).append((HRegionInfo)any(), (WALKeyImpl)any()<a name="line.5641"></a>
-<span class="sourceLineNo">5642</span>      , editCaptor.capture(), anyBoolean());<a name="line.5642"></a>
+<span class="sourceLineNo">5562</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5562"></a>
+<span class="sourceLineNo">5563</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5563"></a>
+<span class="sourceLineNo">5564</span><a name="line.5564"></a>
+<span class="sourceLineNo">5565</span>    Put put = new Put(Bytes.toBytes("199996"));<a name="line.5565"></a>
+<span class="sourceLineNo">5566</span>    put.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5566"></a>
+<span class="sourceLineNo">5567</span>    region.put(put);<a name="line.5567"></a>
+<span class="sourceLineNo">5568</span>    Put put2 = new Put(Bytes.toBytes("199995"));<a name="line.5568"></a>
+<span class="sourceLineNo">5569</span>    put2.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5569"></a>
+<span class="sourceLineNo">5570</span>    region.put(put2);<a name="line.5570"></a>
+<span class="sourceLineNo">5571</span><a name="line.5571"></a>
+<span class="sourceLineNo">5572</span>    // Create a reverse scan<a name="line.5572"></a>
+<span class="sourceLineNo">5573</span>    Scan scan = new Scan(Bytes.toBytes("199996"));<a name="line.5573"></a>
+<span class="sourceLineNo">5574</span>    scan.setReversed(true);<a name="line.5574"></a>
+<span class="sourceLineNo">5575</span>    RegionScannerImpl scanner = region.getScanner(scan);<a name="line.5575"></a>
+<span class="sourceLineNo">5576</span><a name="line.5576"></a>
+<span class="sourceLineNo">5577</span>    // Put a lot of cells that have sequenceIDs grater than the readPt of the reverse scan<a name="line.5577"></a>
+<span class="sourceLineNo">5578</span>    for (int i = 100000; i &lt; 200000; i++) {<a name="line.5578"></a>
+<span class="sourceLineNo">5579</span>      Put p = new Put(Bytes.toBytes("" + i));<a name="line.5579"></a>
+<span class="sourceLineNo">5580</span>      p.addColumn(cf1, col, Bytes.toBytes("" + i));<a name="line.5580"></a>
+<span class="sourceLineNo">5581</span>      region.put(p);<a name="line.5581"></a>
+<span class="sourceLineNo">5582</span>    }<a name="line.5582"></a>
+<span class="sourceLineNo">5583</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5583"></a>
+<span class="sourceLineNo">5584</span>    boolean hasNext;<a name="line.5584"></a>
+<span class="sourceLineNo">5585</span>    do {<a name="line.5585"></a>
+<span class="sourceLineNo">5586</span>      hasNext = scanner.next(currRow);<a name="line.5586"></a>
+<span class="sourceLineNo">5587</span>    } while (hasNext);<a name="line.5587"></a>
+<span class="sourceLineNo">5588</span><a name="line.5588"></a>
+<span class="sourceLineNo">5589</span>    assertEquals(2, currRow.size());<a name="line.5589"></a>
+<span class="sourceLineNo">5590</span>    assertEquals("199996", Bytes.toString(currRow.get(0).getRowArray(),<a name="line.5590"></a>
+<span class="sourceLineNo">5591</span>      currRow.get(0).getRowOffset(), currRow.get(0).getRowLength()));<a name="line.5591"></a>
+<span class="sourceLineNo">5592</span>    assertEquals("199995", Bytes.toString(currRow.get(1).getRowArray(),<a name="line.5592"></a>
+<span class="sourceLineNo">5593</span>      currRow.get(1).getRowOffset(), currRow.get(1).getRowLength()));<a name="line.5593"></a>
+<span class="sourceLineNo">5594</span>  }<a name="line.5594"></a>
+<span class="sourceLineNo">5595</span><a name="line.5595"></a>
+<span class="sourceLineNo">5596</span>  @Test<a name="line.5596"></a>
+<span class="sourceLineNo">5597</span>  public void testWriteRequestsCounter() throws IOException {<a name="line.5597"></a>
+<span class="sourceLineNo">5598</span>    byte[] fam = Bytes.toBytes("info");<a name="line.5598"></a>
+<span class="sourceLineNo">5599</span>    byte[][] families = { fam };<a name="line.5599"></a>
+<span class="sourceLineNo">5600</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.5600"></a>
+<span class="sourceLineNo">5601</span><a name="line.5601"></a>
+<span class="sourceLineNo">5602</span>    Assert.assertEquals(0L, region.getWriteRequestsCount());<a name="line.5602"></a>
+<span class="sourceLineNo">5603</span><a name="line.5603"></a>
+<span class="sourceLineNo">5604</span>    Put put = new Put(row);<a name="line.5604"></a>
+<span class="sourceLineNo">5605</span>    put.addColumn(fam, fam, fam);<a name="line.5605"></a>
+<span class="sourceLineNo">5606</span><a name="line.5606"></a>
+<span class="sourceLineNo">5607</span>    Assert.assertEquals(0L, region.getWriteRequestsCount());<a name="line.5607"></a>
+<span class="sourceLineNo">5608</span>    region.put(put);<a name="line.5608"></a>
+<span class="sourceLineNo">5609</span>    Assert.assertEquals(1L, region.getWriteRequestsCount());<a name="line.5609"></a>
+<span class="sourceLineNo">5610</span>    region.put(put);<a name="line.5610"></a>
+<span class="sourceLineNo">5611</span>    Assert.assertEquals(2L, region.getWriteRequestsCount());<a name="line.5611"></a>
+<span class="sourceLineNo">5612</span>    region.put(put);<a name="line.5612"></a>
+<span class="sourceLineNo">5613</span>    Assert.assertEquals(3L, region.getWriteRequestsCount());<a name="line.5613"></a>
+<span class="sourceLineNo">5614</span><a name="line.5614"></a>
+<span class="sourceLineNo">5615</span>    region.delete(new Delete(row));<a name="line.5615"></a>
+<span class="sourceLineNo">5616</span>    Assert.assertEquals(4L, region.getWriteRequestsCount());<a name="line.5616"></a>
+<span class="sourceLineNo">5617</span>  }<a name="line.5617"></a>
+<span class="sourceLineNo">5618</span><a name="line.5618"></a>
+<span class="sourceLineNo">5619</span>  @Test<a name="line.5619"></a>
+<span class="sourceLineNo">5620</span>  public void testOpenRegionWrittenToWAL() throws Exception {<a name="line.5620"></a>
+<span class="sourceLineNo">5621</span>    final ServerName serverName = ServerName.valueOf(name.getMethodName(), 100, 42);<a name="line.5621"></a>
+<span class="sourceLineNo">5622</span>    final RegionServerServices rss = spy(TEST_UTIL.createMockRegionServerService(serverName));<a name="line.5622"></a>
+<span class="sourceLineNo">5623</span><a name="line.5623"></a>
+<span class="sourceLineNo">5624</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.5624"></a>
+<span class="sourceLineNo">5625</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.5625"></a>
+<span class="sourceLineNo">5626</span>    htd.addFamily(new HColumnDescriptor(fam2));<a name="line.5626"></a>
+<span class="sourceLineNo">5627</span><a name="line.5627"></a>
+<span class="sourceLineNo">5628</span>    HRegionInfo hri = new HRegionInfo(htd.getTableName(),<a name="line.5628"></a>
+<span class="sourceLineNo">5629</span>      HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY);<a name="line.5629"></a>
+<span class="sourceLineNo">5630</span><a name="line.5630"></a>
+<span class="sourceLineNo">5631</span>    // open the region w/o rss and wal and flush some files<a name="line.5631"></a>
+<span class="sourceLineNo">5632</span>    region =<a name="line.5632"></a>
+<span class="sourceLineNo">5633</span>         HBaseTestingUtility.createRegionAndWAL(hri, TEST_UTIL.getDataTestDir(), TEST_UTIL<a name="line.5633"></a>
+<span class="sourceLineNo">5634</span>             .getConfiguration(), htd);<a name="line.5634"></a>
+<span class="sourceLineNo">5635</span>    assertNotNull(region);<a name="line.5635"></a>
+<span class="sourceLineNo">5636</span><a name="line.5636"></a>
+<span class="sourceLineNo">5637</span>    // create a file in fam1 for the region before opening in OpenRegionHandler<a name="line.5637"></a>
+<span class="sourceLineNo">5638</span>    region.put(new Put(Bytes.toBytes("a")).addColumn(fam1, fam1, fam1));<a name="line.5638"></a>
+<span class="sourceLineNo">5639</span>    region.flush(true);<a name="line.5639"></a>
+<span class="sourceLineNo">5640</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.5640"></a>
+<span class="sourceLineNo">5641</span><a name="line.5641"></a>
+<span class="sourceLineNo">5642</span>    ArgumentCaptor&lt;WALEdit&gt; editCaptor = ArgumentCaptor.forClass(WALEdit.class);<a name="line.5642"></a>
 <span class="sourceLineNo">5643</span><a name="line.5643"></a>
-<span class="sourceLineNo">5644</span>    WALEdit edit = editCaptor.getValue();<a name="line.5644"></a>
-<span class="sourceLineNo">5645</span>    assertNotNull(edit);<a name="line.5645"></a>
-<span class="sourceLineNo">5646</span>    assertNotNull(edit.getCells());<a name="line.5646"></a>
-<span class="sourceLineNo">5647</span>    assertEquals(1, edit.getCells().size());<a name="line.5647"></a>
-<span class="sourceLineNo">5648</span>    RegionEventDescriptor desc = WALEdit.getRegionEventDescriptor(edit.getCells().get(0));<a name="line.5648"></a>
-<span class="sourceLineNo">5649</span>    assertNotNull(desc);<a name="line.5649"></a>
+<span class="sourceLineNo">5644</span>    // capture append() calls<a name="line.5644"></a>
+<span class="sourceLineNo">5645</span>    WAL wal = mockWAL();<a name="line.5645"></a>
+<span class="sourceLineNo">5646</span>    when(rss.getWAL((HRegionInfo) any())).thenReturn(wal);<a name="line.5646"></a>
+<span class="sourceLineNo">5647</span><a name="line.5647"></a>
+<span class="sourceLineNo">5648</span>    region = HRegion.openHRegion(hri, htd, rss.getWAL(hri),<a name="line.5648"></a>
+<span class="sourceLineNo">5649</span>      TEST_UTIL.getConfiguration(), rss, null);<a name="line.5649"></a>
 <span class="sourceLineNo">5650</span><a name="line.5650"></a>
-<span class="sourceLineNo">5651</span>    LOG.info("RegionEventDescriptor from WAL: " + desc);<a name="line.5651"></a>
-<span class="sourceLineNo">5652</span><a name="line.5652"></a>
-<span class="sourceLineNo">5653</span>    assertEquals(RegionEventDescriptor.EventType.REGION_OPEN, desc.getEventType());<a name="line.5653"></a>
-<span class="sourceLineNo">5654</span>    assertTrue(Bytes.equals(desc.getTableName().toByteArray(), htd.getTableName().toBytes()));<a name="line.5654"></a>
-<span class="sourceLineNo">5655</span>    assertTrue(Bytes.equals(desc.getEncodedRegionName().toByteArray(),<a name="line.5655"></a>
-<span class="sourceLineNo">5656</span>      hri.getEncodedNameAsBytes()));<a name="line.5656"></a>
-<span class="sourceLineNo">5657</span>    assertTrue(desc.getLogSequenceNumber() &gt; 0);<a name="line.5657"></a>
-<span class="sourceLineNo">5658</span>    assertEquals(serverName, ProtobufUtil.toServerName(desc.getServer()));<a name="line.5658"></a>
-<span class="sourceLineNo">5659</span>    assertEquals(2, desc.getStoresCount());<a name="line.5659"></a>
+<span class="sourceLineNo">5651</span>    verify(wal, times(1)).append((HRegionInfo)any(), (WALKeyImpl)any()<a name="line.5651"></a>
+<span class="sourceLineNo">5652</span>      , editCaptor.capture(), anyBoolean());<a name="line.5652"></a>
+<span class="sourceLineNo">5653</span><a name="line.5653"></a>
+<span class="sourceLineNo">5654</span>    WALEdit edit = editCaptor.getValue();<a name="line.5654"></a>
+<span class="sourceLineNo">5655</span>    assertNotNull(edit);<a name="line.5655"></a>
+<span class="sourceLineNo">5656</span>    assertNotNull(edit.getCells());<a name="line.5656"></a>
+<span class="sourceLineNo">5657</span>    assertEquals(1, edit.getCells().size());<a name="line.5657"></a>
+<span class="sourceLineNo">5658</span>    RegionEventDescriptor desc = WALEdit.getRegionEventDescriptor(edit.getCells().get(0));<a name="line.5658"></a>
+<span class="sourceLineNo">5659</span>    assertNotNull(desc);<a name="line.5659"></a>
 <span class="sourceLineNo">5660</span><a name="line.5660"></a>
-<span class="sourceLineNo">5661</span>    StoreDescriptor store = desc.getStores(0);<a name="line.5661"></a>
-<span class="sourceLineNo">5662</span>    assertTrue(Bytes.equals(store.getFamilyName().toByteArray(), fam1));<a name="line.5662"></a>
-<span class="sourceLineNo">5663</span>    assertEquals(store.getStoreHomeDir(), Bytes.toString(fam1));<a name="line.5663"></a>
-<span class="sourceLineNo">5664</span>    assertEquals(1, store.getStoreFileCount()); // 1store file<a name="line.5664"></a>
-<span class="sourceLineNo">5665</span>    assertFalse(store.getStoreFile(0).contains("/")); // ensure path is relative<a name="line.5665"></a>
-<span class="sourceLineNo">5666</span><a name="line.5666"></a>
-<span class="sourceLineNo">5667</span>    store = desc.getStores(1);<a name="line.5667"></a>
-<span class="sourceLineNo">5668</span>    assertTrue(Bytes.equals(store.getFamilyName().toByteArray(), fam2));<a name="line.5668"></a>
-<span class="sourceLineNo">5669</span>    assertEquals(store.getStoreHomeDir(), Bytes.toString(fam2));<a name="line.5669"></a>
-<span class="sourceLineNo">5670</span>    assertEquals(0, store.getStoreFileCount()); // no store files<a name="line.5670"></a>
-<span class="sourceLineNo">5671</span>  }<a name="line.5671"></a>
-<span class="sourceLineNo">5672</span><a name="line.5672"></a>
-<span class="sourceLineNo">5673</span>  // Helper for test testOpenRegionWrittenToWALForLogReplay<a name="line.5673"></a>
-<span class="sourceLineNo">5674</span>  static class HRegionWithSeqId extends HRegion {<a name="line.5674"></a>
-<span class="sourceLineNo">5675</span>    public HRegionWithSeqId(final Path tableDir, final WAL wal, final FileSystem fs,<a name="line.5675"></a>
-<span class="sourceLineNo">5676</span>        final Configuration confParam, final RegionInfo regionInfo,<a name="line.5676"></a>
-<span class="sourceLineNo">5677</span>        final TableDescriptor htd, final RegionServerServices rsServices) {<a name="line.5677"></a>
-<span class="sourceLineNo">5678</span>      super(tableDir, wal, fs, confParam, regionInfo, htd, rsServices);<a name="line.5678"></a>
-<span class="sourceLineNo">5679</span>    }<a name="line.5679"></a>
-<span class="sourceLineNo">5680</span>    @Override<a name="line.5680"></a>
-<span class="sourceLineNo">5681</span>    protected long getNextSequenceId(WAL wal) throws IOException {<a name="line.5681"></a>
-<span class="sourceLineNo">5682</span>      return 42;<a name="line.5682"></a>
-<span class="sourceLineNo">5683</span>    }<a name="line.5683"></a>
-<span class="sourceLineNo">5684</span>  }<a name="line.5684"></a>
-<span class="sourceLineNo">5685</span><a name="line.5685"></a>
-<span class="sourceLineNo">5686</span>  @Test<a name="line.5686"></a>
-<span class="sourceLineNo">5687</span>  public void testFlushedFileWithNoTags() throws Exception {<a name="line.5687"></a>
-<span class="sourceLineNo">5688</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.5688"></a>
-<span class="sourceLineNo">5689</span>    HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.5689"></a>
-<span class="sourceLineNo">5690</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.5690"></a>
-<span class="sourceLineNo">5691</span>    HRegionInfo info = new HRegionInfo(tableName, null, null, false);<a name="line.5691"></a>
-<span class="sourceLineNo">5692</span>    Path path = TEST_UTIL.getDataTestDir(getClass().getSimpleName());<a name="line.5692"></a>
-<span class="sourceLineNo">5693</span>    region = HBaseTestingUtility.createRegionAndWAL(info, path, TEST_UTIL.getConfiguration(), htd);<a name="line.5693"></a>
-<span class="sourceLineNo">5694</span>    Put put = new Put(Bytes.toBytes("a-b-0-0"));<a name="line.5694"></a>
-<span class="sourceLineNo">5695</span>    put.addColumn(fam1, qual1, Bytes.toBytes("c1-value"));<a name="line.5695"></a>
-<span class="sourceLineNo">5696</span>    region.put(put);<a name="line.5696"></a>
-<span class="sourceLineNo">5697</span>    region.flush(true);<a name="line.5697"></a>
-<span class="sourceLineNo">5698</span>    HStore store = region.getStore(fam1);<a name="line.5698"></a>
-<span class="sourceLineNo">5699</span>    Collection&lt;HStoreFile&gt; storefiles = store.getStorefiles();<a name="line.5699"></a>
-<span class="sourceLineNo">5700</span>    for (HStoreFile sf : storefiles) {<a name="line.5700"></a>
-<span class="sourceLineNo">5701</span>      assertFalse("Tags should not be present "<a name="line.5701"></a>
-<span class="sourceLineNo">5702</span>          ,sf.getReader().getHFileReader().getFileContext().isIncludesTags());<a name="line.5702"></a>
-<span class="sourceLineNo">5703</span>    }<a name="line.5703"></a>
-<span class="sourceLineNo">5704</span>  }<a name="line.5704"></a>
-<span class="sourceLineNo">5705</span><a name="line.5705"></a>
-<span class="sourceLineNo">5706</span>  /**<a name="line.5706"></a>
-<span class="sourceLineNo">5707</span>   * Utility method to setup a WAL mock.<a name="line.5707"></a>
-<span class="sourceLineNo">5708</span>   * Needs to do the bit where we close latch on the WALKeyImpl on append else test hangs.<a name="line.5708"></a>
-<span class="sourceLineNo">5709</span>   * @return a mock WAL<a name="line.5709"></a>
-<span class="sourceLineNo">5710</span>   * @throws IOException<a name="line.5710"></a>
-<span class="sourceLineNo">5711</span>   */<a name="line.5711"></a>
-<span class="sourceLineNo">5712</span>  private WAL mockWAL() throws IOException {<a name="line.5712"></a>
-<span class="sourceLineNo">5713</span>    WAL wal = mock(WAL.class);<a name="line.5713"></a>
-<span class="sourceLineNo">5714</span>    Mockito.when(wal.append((HRegionInfo)Mockito.any(),<a name="line.5714"></a>
-<span class="sourceLineNo">5715</span>        (WALKeyImpl)Mockito.any(), (WALEdit)Mockito.any(), Mockito.anyBoolean())).<a name="line.5715"></a>
-<span class="sourceLineNo">5716</span>      thenAnswer(new Answer&lt;Long&gt;() {<a name="line.5716"></a>
-<span class="sourceLineNo">5717</span>        @Override<a name="line.5717"></a>
-<span class="sourceLineNo">5718</span>        public Long answer(InvocationOnMock invocation) throws Throwable {<a name="line.5718"></a>
-<span class="sourceLineNo">5719</span>          WALKeyImpl key = invocation.getArgument(1);<a name="line.5719"></a>
-<span class="sourceLineNo">5720</span>          MultiVersionConcurrencyControl.WriteEntry we = key.getMvcc().begin();<a name="line.5720"></a>
-<span class="sourceLineNo">5721</span>          key.setWriteEntry(we);<a name="line.5721"></a>
-<span class="sourceLineNo">5722</span>          return 1L;<a name="line.5722"></a>
-<span class="sourceLineNo">5723</span>        }<a name="line.5723"></a>
-<span class="sourceLineNo">5724</span><a name="line.5724"></a>
-<span class="sourceLineNo">5725</span>    });<a name="line.5725"></a>
-<span class="sourceLineNo">5726</span>    return wal;<a name="line.5726"></a>
-<span class="sourceLineNo">5727</span>  }<a name="line.5727"></a>
-<span class="sourceLineNo">5728</span><a name="line.5728"></a>
-<span class="sourceLineNo">5729</span>  @Test<a name="line.5729"></a>
-<span class="sourceLineNo">5730</span>  public void testCloseRegionWrittenToWAL() throws Exception {<a name="line.5730"></a>
-<span class="sourceLineNo">5731</span><a name="line.5731"></a>
-<span class="sourceLineNo">5732</span>    Path rootDir = new Path(dir + name.getMethodName());<a name="line.5732"></a>
-<span class="sourceLineNo">5733</span>    FSUtils.setRootDir(TEST_UTIL.getConfiguration(), rootDir);<a name="line.5733"></a>
+<span class="sourceLineNo">5661</span>    LOG.info("RegionEventDescriptor from WAL: " + desc);<a name="line.5661"></a>
+<span class="sourceLineNo">5662</span><a name="line.5662"></a>
+<span class="sourceLineNo">5663</span>    assertEquals(RegionEventDescriptor.EventType.REGION_OPEN, desc.getEventType());<a name="line.5663"></a>
+<span class="sourceLineNo">5664</span>    assertTrue(Bytes.equals(desc.getTableName().toByteArray(), htd.getTableName().toBytes()));<a name="line.5664"></a>
+<span class="sourceLineNo">5665</span>    assertTrue(Bytes.equals(desc.getEncodedRegionName().toByteArray(),<a name="line.5665"></a>
+<span class="sourceLineNo">5666</span>      hri.getEncodedNameAsBytes()));<a name="line.5666"></a>
+<span class="sourceLineNo">5667</span>    assertTrue(desc.getLogSequenceNumber() &gt; 0);<a name="line.5667"></a>
+<span class="sourceLineNo">5668</span>    assertEquals(serverName, ProtobufUtil.toServerName(desc.getServer()));<a name="line.5668"></a>
+<span class="sourceLineNo">5669</span>    assertEquals(2, desc.getStoresCount());<a name="line.5669"></a>
+<span class="sourceLineNo">5670</span><a name="line.5670"></a>
+<span class="sourceLineNo">5671</span>    StoreDescriptor store = desc.getStores(0);<a name="line.5671"></a>
+<span class="sourceLineNo">5672</span>    assertTrue(Bytes.equals(store.getFamilyName().toByteArray(), fam1));<a name="line.5672"></a>
+<span class="sourceLineNo">5673</span>    assertEquals(store.getStoreHomeDir(), Bytes.toString(fam1));<a name="line.5673"></a>
+<span class="sourceLineNo">5674</span>    assertEquals(1, store.getStoreFileCount()); // 1store file<a name="line.5674"></a>
+<span class="sourceLineNo">5675</span>    assertFalse(store.getStoreFile(0).contains("/")); // ensure path is relative<a name="line.5675"></a>
+<span class="sourceLineNo">5676</span><a name="line.5676"></a>
+<span class="sourceLineNo">5677</span>    store = desc.getStores(1);<a name="line.5677"></a>
+<span class="sourceLineNo">5678</span>    assertTrue(Bytes.equals(store.getFamilyName().toByteArray(), fam2));<a name="line.5678"></a>
+<span class="sourceLineNo">5679</span>    assertEquals(store.getStoreHomeDir(), Bytes.toString(fam2));<a name="line.5679"></a>
+<span class="sourceLineNo">5680</span>    assertEquals(0, store.getStoreFileCount()); // no store files<a name="line.5680"></a>
+<span class="sourceLineNo">5681</span>  }<a name="line.5681"></a>
+<span class="sourceLineNo">5682</span><a name="line.5682"></a>
+<span class="sourceLineNo">5683</span>  // Helper for test testOpenRegionWrittenToWALForLogReplay<a name="line.5683"></a>
+<span class="sourceLineNo">5684</span>  static class HRegionWithSeqId extends HRegion {<a name="line.5684"></a>
+<span class="sourceLineNo">5685</span>    public HRegionWithSeqId(final Path tableDir, final WAL wal, final FileSystem fs,<a name="line.5685"></a>
+<span class="sourceLineNo">5686</span>        final Configuration confParam, final RegionInfo regionInfo,<a name="line.5686"></a>
+<span class="sourceLineNo">5687</span>        final TableDescriptor htd, final RegionServerServices rsServices) {<a name="line.5687"></a>
+<span class="sourceLineNo">5688</span>      super(tableDir, wal, fs, confParam, regionInfo, htd, rsServices);<a name="line.5688"></a>
+<span class="sourceLineNo">5689</span>    }<a name="line.5689"></a>
+<span class="sourceLineNo">5690</span>    @Override<a name="line.5690"></a>
+<span class="sourceLineNo">5691</span>    protected long getNextSequenceId(WAL wal) throws IOException {<a name="line.5691"></a>
+<span class="sourceLineNo">5692</span>      return 42;<a name="line.5692"></a>
+<span class="sourceLineNo">5693</span>    }<a name="line.5693"></a>
+<span class="sourceLineNo">5694</span>  }<a name="line.5694"></a>
+<span class="sourceLineNo">5695</span><a name="line.5695"></a>
+<span class="sourceLineNo">5696</span>  @Test<a name="line.5696"></a>
+<span class="sourceLineNo">5697</span>  public void testFlushedFileWithNoTags() throws Exception {<a name="line.5697"></a>
+<span class="sourceLineNo">5698</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.5698"></a>
+<span class="sourceLineNo">5699</span>    HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.5699"></a>
+<span class="sourceLineNo">5700</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.5700"></a>
+<span class="sourceLineNo">5701</span>    HRegionInfo info = new HRegionInfo(tableName, null, null, false);<a name="line.5701"></a>
+<span class="sourceLineNo">5702</span>    Path path = TEST_UTIL.getDataTestDir(getClass().getSimpleName());<a name="line.5702"></a>
+<span class="sourceLineNo">5703</span>    region = HBaseTestingUtility.createRegionAndWAL(info, path, TEST_UTIL.getConfiguration(), htd);<a name="line.5703"></a>
+<span class="sourceLineNo">5704</span>    Put put = new Put(Bytes.toBytes("a-b-0-0"));<a name="line.5704"></a>
+<span class="sourceLineNo">5705</span>    put.addColumn(fam1, qual1, Bytes.toBytes("c1-value"));<a name="line.5705"></a>
+<span class="sourceLineNo">5706</span>    region.put(put);<a name="line.5706"></a>
+<span class="sourceLineNo">5707</span>    region.flush(true);<a name="line.5707"></a>
+<span class="sourceLineNo">5708</span>    HStore store = region.getStore(fam1);<a name="line.5708"></a>
+<span class="sourceLineNo">5709</span>    Collection&lt;HStoreFile&gt; storefiles = store.getStorefiles();<a name="line.5709"></a>
+<span class="sourceLineNo">5710</span>    for (HStoreFile sf : storefiles) {<a name="line.5710"></a>
+<span class="sourceLineNo">5711</span>      assertFalse("Tags should not be present "<a name="line.5711"></a>
+<span class="sourceLineNo">5712</span>          ,sf.getReader().getHFileReader().getFileContext().isIncludesTags());<a name="line.5712"></a>
+<span class="sourceLineNo">5713</span>    }<a name="line.5713"></a>
+<span class="sourceLineNo">5714</span>  }<a name="line.5714"></a>
+<span class="sourceLineNo">5715</span><a name="line.5715"></a>
+<span class="sourceLineNo">5716</span>  /**<a name="line.5716"></a>
+<span class="sourceLineNo">5717</span>   * Utility method to setup a WAL mock.<a name="line.5717"></a>
+<span class="sourceLineNo">5718</span>   * Needs to do the bit where we close latch on the WALKeyImpl on append else test hangs.<a name="line.5718"></a>
+<span class="sourceLineNo">5719</span>   * @return a mock WAL<a name="line.5719"></a>
+<span class="sourceLineNo">5720</span>   * @throws IOException<a name="line.5720"></a>
+<span class="sourceLineNo">5721</span>   */<a name="line.5721"></a>
+<span class="sourceLineNo">5722</span>  private WAL mockWAL() throws IOException {<a name="line.5722"></a>
+<span class="sourceLineNo">5723</span>    WAL wal = mock(WAL.class);<a name="line.5723"></a>
+<span class="sourceLineNo">5724</span>    Mockito.when(wal.append((HRegionInfo)Mockito.any(),<a name="line.5724"></a>
+<span class="sourceLineNo">5725</span>        (WALKeyImpl)Mockito.any(), (WALEdit)Mockito.any(), Mockito.anyBoolean())).<a name="line.5725"></a>
+<span class="sourceLineNo">5726</span>      thenAnswer(new Answer&lt;Long&gt;() {<a name="line.5726"></a>
+<span class="sourceLineNo">5727</span>        @Override<a name="line.5727"></a>
+<span class="sourceLineNo">5728</span>        public Long answer(InvocationOnMock invocation) throws Throwable {<a name="line.5728"></a>
+<span class="sourceLineNo">5729</span>          WALKeyImpl key = invocation.getArgument(1);<a name="line.5729"></a>
+<span class="sourceLineNo">5730</span>          MultiVersionConcurrencyControl.WriteEntry we = key.getMvcc().begin();<a name="line.5730"></a>
+<span class="sourceLineNo">5731</span>          key.setWriteEntry(we);<a name="line.5731"></a>
+<span class="sourceLineNo">5732</span>          return 1L;<a name="line.5732"></a>
+<span class="sourceLineNo">5733</span>        }<a name="line.5733"></a>
 <span class="sourceLineNo">5734</span><a name="line.5734"></a>
-<span class="sourceLineNo">5735</span>    final ServerName serverName = ServerName.valueOf("testCloseRegionWrittenToWAL", 100, 42);<a name="line.5735"></a>
-<span class="sourceLineNo">5736</span>    final RegionServerServices rss = spy(TEST_UTIL.createMockRegionServerService(serverName));<a name="line.5736"></a>
-<span class="sourceLineNo">5737</span><a name="line.5737"></a>
-<span class="sourceLineNo">5738</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.5738"></a>
-<span class="sourceLineNo">5739</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.5739"></a>
-<span class="sourceLineNo">5740</span>    htd.addFamily(new HColumnDescriptor(fam2));<a name="line.5740"></a>
+<span class="sourceLineNo">5735</span>    });<a name="line.5735"></a>
+<span class="sourceLineNo">5736</span>    return wal;<a name="line.5736"></a>
+<span class="sourceLineNo">5737</span>  }<a name="line.5737"></a>
+<span class="sourceLineNo">5738</span><a name="line.5738"></a>
+<span class="sourceLineNo">5739</span>  @Test<a name="line.5739"></a>
+<span class="sourceLineNo">5740</span>  public void testCloseRegionWrittenToWAL() throws Exception {<a name="line.5740"></a>
 <span class="sourceLineNo">5741</span><a name="line.5741"></a>
-<span class="sourceLineNo">5742</span>    final HRegionInfo hri = new HRegionInfo(htd.getTableName(),<a name="line.5742"></a>
-<span class="sourceLineNo">5743</span>      HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY);<a name="line.5743"></a>
+<span class="sourceLineNo">5742</span>    Path rootDir = new Path(dir + name.getMethodName());<a name="line.5742"></a>
+<span class="sourceLineNo">5743</span>    FSUtils.setRootDir(TEST_UTIL.getConfiguration(), rootDir);<a name="line.5743"></a>
 <span class="sourceLineNo">5744</span><a name="line.5744"></a>
-<span class="sourceLineNo">5745</span>    ArgumentCaptor&lt;WALEdit&gt; editCaptor = ArgumentCaptor.forClass(WALEdit.class);<a name="line.5745"></a>
-<span class="sourceLineNo">5746</span><a name="line.5746"></a>
-<span class="sourceLineNo">5747</span>    // capture append() calls<a name="line.5747"></a>
-<span class="sourceLineNo">5748</span>    WAL wal = mockWAL();<a name="line.5748"></a>
-<span class="sourceLineNo">5749</span>    when(rss.getWAL((HRegionInfo) any())).thenReturn(wal);<a name="line.5749"></a>
-<span class="sourceLineNo">5750</span><a name="line.5750"></a>
+<span class="sourceLineNo">5745</span>    final ServerName serverName = ServerName.valueOf("testCloseRegionWrittenToWAL", 100, 42);<a name="line.5745"></a>
+<span class="sourceLineNo">5746</span>    final RegionServerServices rss = spy(TEST_UTIL.createMockRegionServerService(serverName));<a name="line.5746"></a>
+<span class="sourceLineNo">5747</span><a name="line.5747"></a>
+<span class="sourceLineNo">5748</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.5748"></a>
+<span class="sourceLineNo">5749</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.5749"></a>
+<span class="sourceLineNo">5750</span>    htd.addFamily(new HColumnDescriptor(fam2));<a name="line.5750"></a>
 <span class="sourceLineNo">5751</span><a name="line.5751"></a>
-<span class="sourceLineNo">5752</span>    // create and then open a region first so that it can be closed later<a name="line.5752"></a>
-<span class="sourceLineNo">5753</span>    region = HRegion.createHRegion(hri, rootDir, TEST_UTIL.getConfiguration(), htd, rss.getWAL(hri));<a name="line.5753"></a>
-<span class="sourceLineNo">5754</span>    region = HRegion.openHRegion(hri, htd, rss.getWAL(hri),<a name="line.5754"></a>
-<span class="sourceLineNo">5755</span>      TEST_UTIL.getConfiguration(), rss, null);<a name="line.5755"></a>
+<span class="sourceLineNo">5752</span>    final HRegionInfo hri = new HRegionInfo(htd.getTableName(),<a name="line.5752"></a>
+<span class="sourceLineNo">5753</span>      HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY);<a name="line.5753"></a>
+<span class="sourceLineNo">5754</span><a name="line.5754"></a>
+<span class="sourceLineNo">5755</span>    ArgumentCaptor&lt;WALEdit&gt; editCaptor = ArgumentCaptor.forClass(WALEdit.class);<a name="line.5755"></a>
 <span class="sourceLineNo">5756</span><a name="line.5756"></a>
-<span class="sourceLineNo">5757</span>    // close the region<a name="line.5757"></a>
-<span class="sourceLineNo">5758</span>    region.close(false);<a name="line.5758"></a>
-<span class="sourceLineNo">5759</span><a name="line.5759"></a>
-<span class="sourceLineNo">5760</span>    // 2 times, one for region open, the other close region<a name="line.5760"></a>
-<span class="sourceLineNo">5761</span>    verify(wal, times(2)).append((HRegionInfo)any(), (WALKeyImpl)any(),<a name="line.5761"></a>
-<span class="sourceLineNo">5762</span>      editCaptor.capture(), anyBoolean());<a name="line.5762"></a>
-<span class="sourceLineNo">5763</span><a name="line.5763"></a>
-<span class="sourceLineNo">5764</span>    WALEdit edit = editCaptor.getAllValues().get(1);<a name="line.5764"></a>
-<span class="sourceLineNo">5765</span>    assertNotNull(edit);<a name="line.5765"></a>
-<span class="sourceLineNo">5766</span>    assertNotNull(edit.getCells());<a name="line.5766"></a>
-<span class="sourceLineNo">5767</span>    assertEquals(1, edit.getCells().size());<a name="line.5767"></a>
-<span class="sourceLineNo">5768</span>    RegionEventDescriptor desc = WALEdit.getRegionEventDescriptor(edit.getCells().get(0));<a name="line.5768"></a>
-<span class="sourceLineNo">5769</span>    assertNotNull(desc);<a name="line.5769"></a>
-<span class="sourceLineNo">5770</span><a name="line.5770"></a>
-<span class="sourceLineNo">5771</span>    LOG.info("RegionEventDescriptor from WAL: " + desc);<a name="line.5771"></a>
-<span class="sourceLineNo">5772</span><a name="line.5772"></a>
-<span class="sourceLineNo">5773</span>    assertEquals(RegionEventDescriptor.EventType.REGION_CLOSE, desc.getEventType());<a name="line.5773"></a>
-<span class="sourceLineNo">5774</span>    assertTrue(Bytes.equals(desc.getTableName().toByteArray(), htd.getTableName().toBytes()));<a name="line.5774"></a>
-<span class="sourceLineNo">5775</span>    assertTrue(Bytes.equals(desc.getEncodedRegionName().toByteArray(),<a name="line.5775"></a>
-<span class="sourceLineNo">5776</span>      hri.getEncodedNameAsBytes()));<a name="line.5776"></a>
-<span class="sourceLineNo">5777</span>    assertTrue(desc.getLogSequenceNumber() &gt; 0);<a name="line.5777"></a>
-<span class="sourceLineNo">5778</span>    assertEquals(serverName, ProtobufUtil.toServerName(desc.getServer()));<a name="line.5778"></a>
-<span class="sourceLineNo">5779</span>    assertEquals(2, desc.getStoresCount());<a name="line.5779"></a>
+<span class="sourceLineNo">5757</span>    // capture append() calls<a name="line.5757"></a>
+<span class="sourceLineNo">5758</span>    WAL wal = mockWAL();<a name="line.5758"></a>
+<span class="sourceLineNo">5759</span>    when(rss.getWAL((HRegionInfo) any())).thenReturn(wal);<a name="line.5759"></a>
+<span class="sourceLineNo">5760</span><a name="line.5760"></a>
+<span class="sourceLineNo">5761</span><a name="line.5761"></a>
+<span class="sourceLineNo">5762</span>    // create and then open a region first so that it can be closed later<a name="line.5762"></a>
+<span class="sourceLineNo">5763</span>    region = HRegion.createHRegion(hri, rootDir, TEST_UTIL.getConfiguration(), htd, rss.getWAL(hri));<a name="line.5763"></a>
+<span class="sourceLineNo">5764</span>    region = HRegion.openHRegion(hri, htd, rss.getWAL(hri),<a name="line.5764"></a>
+<span class="sourceLineNo">5765</span>      TEST_UTIL.getConfiguration(), rss, null);<a name="line.5765"></a>
+<span class="sourceLineNo">5766</span><a name="line.5766"></a>
+<span class="sourceLineNo">5767</span>    // close the region<a name="line.5767"></a>
+<span class="sourceLineNo">5768</span>    region.close(false);<a name="line.5768"></a>
+<span class="sourceLineNo">5769</span><a name="line.5769"></a>
+<span class="sourceLineNo">5770</span>    // 2 times, one for region open, the other close region<a name="line.5770"></a>
+<span class="sourceLineNo">5771</span>    verify(wal, times(2)).append((HRegionInfo)any(), (WALKeyImpl)any(),<a name="line.5771"></a>
+<span class="sourceLineNo">5772</span>      editCaptor.capture(), anyBoolean());<a name="line.5772"></a>
+<span class="sourceLineNo">5773</span><a name="line.5773"></a>
+<span class="sourceLineNo">5774</span>    WALEdit edit = editCaptor.getAllValues().get(1);<a name="line.5774"></a>
+<span class="sourceLineNo">5775</span>    assertNotNull(edit);<a name="line.5775"></a>
+<span class="sourceLineNo">5776</span>    assertNotNull(edit.getCells());<a name="line.5776"></a>
+<span class="sourceLineNo">5777</span>    assertEquals(1, edit.getCells().size());<a name="line.5777"></a>
+<span class="sourceLineNo">5778</span>    RegionEventDescriptor desc = WALEdit.getRegionEventDescriptor(edit.getCells().get(0));<a name="line.5778"></a>
+<span class="sourceLineNo">5779</span>    assertNotNull(desc);<a name="line.5779"></a>
 <span class="sourceLineNo">5780</span><a name="line.5780"></a>
-<span class="sourceLineNo">5781</span>    StoreDescriptor store = desc.getStores(0);<a name="line.5781"></a>
-<span class="sourceLineNo">5782</span>    assertTrue(Bytes.equals(store.getFamilyName().toByteArray(), fam1));<a name="line.5782"></a>
-<span class="sourceLineNo">5783</span>    assertEquals(store.getStoreHomeDir(), Bytes.toString(fam1));<a name="line.5783"></a>
-<span class="sourceLineNo">5784</span>    assertEquals(0, store.getStoreFileCount()); // no store files<a name="line.5784"></a>
-<span class="sourceLineNo">5785</span><a name="line.5785"></a>
-<span class="sourceLineNo">5786</span>    store = desc.getStores(1);<a name="line.5786"></a>
-<span class="sourceLineNo">5787</span>    assertTrue(Bytes.equals(store.getFamilyName().toByteArray(), fam2));<a name="line.5787"></a>
-<span class="sourceLineNo">5788</span>    assertEquals(store.getStoreHomeDir(), Bytes.toString(fam2));<a name="line.5788"></a>
-<span class="sourceLineNo">5789</span>    assertEquals(0, store.getStoreFileCount()); // no store files<a name="line.5789"></a>
-<span class="sourceLineNo">5790</span>  }<a name="line.5790"></a>
-<span class="sourceLineNo">5791</span><a name="line.5791"></a>
-<span class="sourceLineNo">5792</span>  /**<a name="line.5792"></a>
-<span class="sourceLineNo">5793</span>   * Test RegionTooBusyException thrown when region is busy<a name="line.5793"></a>
-<span class="sourceLineNo">5794</span>   */<a name="line.5794"></a>
-<span class="sourceLineNo">5795</span>  @Test<a name="line.5795"></a>
-<span class="sourceLineNo">5796</span>  public void testRegionTooBusy() throws IOException {<a name="line.5796"></a>
-<span class="sourceLineNo">5797</span>    byte[] family = Bytes.toBytes("family");<a name="line.5797"></a>
-<span class="sourceLineNo">5798</span>    long defaultBusyWaitDuration = CONF.getLong("hbase.busy.wait.duration",<a name="line.5798"></a>
-<span class="sourceLineNo">5799</span>      HRegion.DEFAULT_BUSY_WAIT_DURATION);<a name="line.5799"></a>
-<span class="sourceLineNo">5800</span>    CONF.setLong("hbase.busy.wait.duration", 1000);<a name="line.5800"></a>
-<span class="sourceLineNo">5801</span>    region = initHRegion(tableName, method, CONF, family);<a name="line.5801"></a>
-<span class="sourceLineNo">5802</span>    final AtomicBoolean stopped = new AtomicBoolean(true);<a name="line.5802"></a>
-<span class="sourceLineNo">5803</span>    Thread t = new Thread(new Runnable() {<a name="line.5803"></a>
-<span class="sourceLineNo">5804</span>      @Override<a name="line.5804"></a>
-<span class="sourceLineNo">5805</span>      public void run() {<a name="line.5805"></a>
-<span class="sourceLineNo">5806</span>        try {<a name="line.5806"></a>
-<span class="sourceLineNo">5807</span>          region.lock.writeLock().lock();<a name="line.5807"></a>
-<span class="sourceLineNo">5808</span>          stopped.set(false);<a name="line.5808"></a>
-<span class="sourceLineNo">5809</span>          while (!stopped.get()) {<a name="line.5809"></a>
-<span class="sourceLineNo">5810</span>            Thread.sleep(100);<a name="line.5810"></a>
-<span class="sourceLineNo">5811</span>          }<a name="line.5811"></a>
-<span class="sourceLineNo">5812</span>        } catch (InterruptedException ie) {<a name="line.5812"></a>
-<span class="sourceLineNo">5813</span>        } finally {<a name="line.5813"></a>
-<span class="sourceLineNo">5814</span>          region.lock.writeLock().unlock();<a name="line.5814"></a>
-<span class="sourceLineNo">5815</span>        }<a name="line.5815"></a>
-<span class="sourceLineNo">5816</span>      }<a name="line.5816"></a>
-<span class="sourceLineNo">5817</span>    });<a name="line.5817"></a>
-<span class="sourceLineNo">5818</span>    t.start();<a name="line.5818"></a>
-<span class="sourceLineNo">5819</span>    Get get = new Get(row);<a name="line.5819"></a>
-<span class="sourceLineNo">5820</span>    try {<a name="line.5820"></a>
-<span class="sourceLineNo">5821</span>      while (stopped.get()) {<a name="line.5821"></a>
-<span class="sourceLineNo">5822</span>        Thread.sleep(100);<a name="line.5822"></a>
-<span class="sourceLineNo">5823</span>      }<a name="line.5823"></a>
-<span class="sourceLineNo">5824</span>      region.get(get);<a name="line.5824"></a>
-<span class="sourceLineNo">5825</span>      fail("Should throw RegionTooBusyException");<a name="line.5825"></a>
-<span class="sourceLineNo">5826</span>    } catch (InterruptedException ie) {<a name="line.5826"></a>
-<span class="sourceLineNo">5827</span>      fail("test interrupted");<a name="line.5827"></a>
-<span class="sourceLineNo">5828</span>    } catch (RegionTooBusyException e) {<a name="line.5828"></a>
-<span class="sourceLineNo">5829</span>      // Good, expected<a name="line.5829"></a>
-<span class="sourceLineNo">5830</span>    } finally {<a name="line.5830"></a>
-<span class="sourceLineNo">5831</span>      stopped.set(true);<a name="line.5831"></a>
-<span class="sourceLineNo">5832</span>      try {<a name="line.5832"></a>
-<span class="sourceLineNo">5833</span>        t.join();<a name="line.5833"></a>
-<span class="sourceLineNo">5834</span>      } catch (Throwable e) {<a name="line.5834"></a>
-<span class="sourceLineNo">5835</span>      }<a name="line.5835"></a>
-<span class="sourceLineNo">5836</span><a name="line.5836"></a>
-<span class="sourceLineNo">5837</span>      HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.5837"></a>
-<span class="sourceLineNo">5838</span>      region = null;<a name="line.5838"></a>
-<span class="sourceLineNo">5839</span>      CONF.setLong("hbase.busy.wait.duration", defaultBusyWaitDuration);<a name="line.5839"></a>
-<span class="sourceLineNo">5840</span>    }<a name="line.5840"></a>
-<span class="sourceLineNo">5841</span>  }<a name="line.5841"></a>
-<span class="sourceLineNo">5842</span><a name="line.5842"></a>
-<span class="sourceLineNo">5843</span>  @Test<a name="line.5843"></a>
-<span class="sourceLineNo">5844</span>  public void testCellTTLs() throws IOException {<a name="line.5844"></a>
-<span class="sourceLineNo">5845</span>    IncrementingEnvironmentEdge edge = new IncrementingEnvironmentEdge();<a name="line.5845"></a>
-<span class="sourceLineNo">5846</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.5846"></a>
-<span class="sourceLineNo">5847</span><a name="line.5847"></a>
-<span class="sourceLineNo">5848</span>    final byte[] row = Bytes.toBytes("testRow");<a name="line.5848"></a>
-<span class="sourceLineNo">5849</span>    final byte[] q1 = Bytes.toBytes("q1");<a name="line.5849"></a>
-<span class="sourceLineNo">5850</span>    final byte[] q2 = Bytes.toBytes("q2");<a name="line.5850"></a>
-<span class="sourceLineNo">5851</span>    final byte[] q3 = Bytes.toBytes("q3");<a name="line.5851"></a>
-<span class="sourceLineNo">5852</span>    final byte[] q4 = Bytes.toBytes("q4");<a name="line.5852"></a>
-<span class="sourceLineNo">5853</span><a name="line.5853"></a>
-<span class="sourceLineNo">5854</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.5854"></a>
-<span class="sourceLineNo">5855</span>    HColumnDescriptor hcd = new HColumnDescriptor(fam1);<a name="line.5855"></a>
-<span class="sourceLineNo">5856</span>    hcd.setTimeToLive(10); // 10 seconds<a name="line.5856"></a>
-<span class="sourceLineNo">5857</span>    htd.addFamily(hcd);<a name="line.5857"></a>
-<span class="sourceLineNo">5858</span><a name="line.5858"></a>
-<span class="sourceLineNo">5859</span>    Configuration conf = new Configuration(TEST_UTIL.getConfiguration());<a name="line.5859"></a>
-<span class="sourceLineNo">5860</span>    conf.setInt(HFile.FORMAT_VERSION_KEY, HFile.MIN_FORMAT_VERSION_WITH_TAGS);<a name="line.5860"></a>
-<span class="sourceLineNo">5861</span><a name="line.5861"></a>
-<span class="sourceLineNo">5862</span>    region = HBaseTestingUtility.createRegionAndWAL(new HRegionInfo(htd.getTableName(),<a name="line.5862"></a>
-<span class="sourceLineNo">5863</span>            HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY),<a name="line.5863"></a>
-<span class="sourceLineNo">5864</span>        TEST_UTIL.getDataTestDir(), conf, htd);<a name="line.5864"></a>
-<span class="sourceLineNo">5865</span>    assertNotNull(region);<a name="line.5865"></a>
-<span class="sourceLineNo">5866</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.5866"></a>
-<span class="sourceLineNo">5867</span>    // Add a cell that will expire in 5 seconds via cell TTL<a name="line.5867"></a>
-<span class="sourceLineNo">5868</span>    region.put(new Put(row).add(new KeyValue(row, fam1, q1, now,<a name="line.5868"></a>
-<span class="sourceLineNo">5869</span>      HConstants.EMPTY_BYTE_ARRAY, new ArrayBackedTag[] {<a name="line.5869"></a>
-<span class="sourceLineNo">5870</span>        // TTL tags specify ts in milliseconds<a name="line.5870"></a>
-<span class="sourceLineNo">5871</span>        new ArrayBackedTag(TagType.TTL_TAG_TYPE, Bytes.toBytes(5000L)) })));<a name="line.5871"></a>
-<span class="sourceLineNo">5872</span>    // Add a cell that will expire after 10 seconds via family setting<a name="line.5872"></a>
-<span class="sourceLineNo">5873</span>    region.put(new Put(row).addColumn(fam1, q2, now, HConstants.EMPTY_BYTE_ARRAY));<a name="line.5873"></a>
-<span class="sourceLineNo">5874</span>    // Add a cell that will expire in 15 seconds via cell TTL<a name="line.5874"></a>
-<span class="sourceLineNo">5875</span>    region.put(new Put(row).add(new KeyValue(row, fam1, q3, now + 10000 - 1,<a name="line.5875"></a>
-<span class="sourceLineNo">5876</span>      HConstants.EMPTY_BYTE_ARRAY, new ArrayBackedTag[] {<a name="line.5876"></a>
-<span class="sourceLineNo">5877</span>        // TTL tags specify ts in milliseconds<a name="line.5877"></a>
-<span class="sourceLineNo">5878</span>        new ArrayBackedTag(TagType.TTL_TAG_TYPE, Bytes.toBytes(5000L)) })));<a name="line.5878"></a>
-<span class="sourceLineNo">5879</span>    // Add a cell that will expire in 20 seconds via family setting<a name="line.5879"></a>
-<span class="sourceLineNo">5880</span>    region.put(new Put(row).addColumn(fam1, q4, now + 10000 - 1, HConstants.EMPTY_BYTE_ARRAY));<a name="line.5880"></a>
-<span class="sourceLineNo">5881</span><a name="line.5881"></a>
-<span class="sourceLineNo">5882</span>    // Flush so we are sure store scanning gets this right<a name="line.5882"></a>
-<span class="sourceLineNo">5883</span>    region.flush(true);<a name="line.5883"></a>
-<span class="sourceLineNo">5884</span><a name="line.5884"></a>
-<span class="sourceLineNo">5885</span>    // A query at time T+0 should return all cells<a name="line.5885"></a>
-<span class="sourceLineNo">5886</span>    Result r = region.get(new Get(row));<a name="line.5886"></a>
-<span class="sourceLineNo">5887</span>    assertNotNull(r.getValue(fam1, q1));<a name="line.5887"></a>
-<span class="sourceLineNo">5888</span>    assertNotNull(r.getValue(fam1, q2));<a name="line.5888"></a>
-<span class="sourceLineNo">5889</span>    assertNotNull(r.getValue(fam1, q3));<a name="line.5889"></a>
-<span class="sourceLineNo">5890</span>    assertNotNull(r.getValue(fam1, q4));<a name="line.5890"></a>
+<span class="sourceLineNo">5781</span>    LOG.info("RegionEventDescriptor from WAL: " + desc);<a name="line.5781"></a>
+<span class="sourceLineNo">5782</span><a name="line.5782"></a>
+<span class="sourceLineNo">5783</span>    assertEquals(RegionEventDescriptor.EventType.REGION_CLOSE, desc.getEventType());<a name="line.5783"></a>
+<span class="sourceLineNo">5784</span>    assertTrue(Bytes.equals(desc.getTableName().toByteArray(), htd.getTableName().toBytes()));<a name="line.5784"></a>
+<span class="sourceLineNo">5785</span>    assertTrue(Bytes.equals(desc.getEncodedRegionName().toByteArray(),<a name="line.5785"></a>
+<span class="sourceLineNo">5786</span>      hri.getEncodedNameAsBytes()));<a name="line.5786"></a>
+<span class="sourceLineNo">5787</span>    assertTrue(desc.getLogSequenceNumber() &gt; 0);<a name="line.5787"></a>
+<span class="sourceLineNo">5788</span>    assertEquals(serverName, ProtobufUtil.toServerName(desc.getServer()));<a name="line.5788"></a>
+<span class="sourceLineNo">5789</span>    assertEquals(2, desc.getStoresCount());<a name="line.5789"></a>
+<span class="sourceLineNo">5790</span><a name="line.5790"></a>
+<span class="sourceLineNo">5791</span>    StoreDescriptor store = desc.getStores(0);<a name="line.5791"></a>
+<span class="sourceLineNo">5792</span>    assertTrue(Bytes.equals(store.getFamilyName().toByteArray(), fam1));<a name="line.5792"></a>
+<span class="sourceLineNo">5793</span>    assertEquals(store.getStoreHomeDir(), Bytes.toString(fam1));<a name="line.5793"></a>
+<span class="sourceLineNo">5794</span>    assertEquals(0, store.getStoreFileCount()); // no store files<a name="line.5794"></a>
+<span class="sourceLineNo">5795</span><a name="line.5795"></a>
+<span class="sourceLineNo">5796</span>    store = desc.getStores(1);<a name="line.5796"></a>
+<span class="sourceLineNo">5797</span>    assertTrue(Bytes.equals(store.getFamilyName().toByteArray(), fam2));<a name="line.5797"></a>
+<span class="sourceLineNo">5798</span>    assertEquals(store.getStoreHomeDir(), Bytes.toString(fam2));<a name="line.5798"></a>
+<span class="sourceLineNo">5799</span>    assertEquals(0, store.getStoreFileCount()); // no store files<a name="line.5799"></a>
+<span class="sourceLineNo">5800</span>  }<a name="line.5800"></a>
+<span class="sourceLineNo">5801</span><a name="line.5801"></a>
+<span class="sourceLineNo">5802</span>  /**<a name="line.5802"></a>
+<span class="sourceLineNo">5803</span>   * Test RegionTooBusyException thrown when region is busy<a name="line.5803"></a>
+<span class="sourceLineNo">5804</span>   */<a name="line.5804"></a>
+<span class="sourceLineNo">5805</span>  @Test<a name="line.5805"></a>
+<span class="sourceLineNo">5806</span>  public void testRegionTooBusy() throws IOException {<a name="line.5806"></a>
+<span class="sourceLineNo">5807</span>    byte[] family = Bytes.toBytes("family");<a name="line.5807"></a>
+<span class="sourceLineNo">5808</span>    long defaultBusyWaitDuration = CONF.getLong("hbase.busy.wait.duration",<a name="line.5808"></a>
+<span class="sourceLineNo">5809</span>      HRegion.DEFAULT_BUSY_WAIT_DURATION);<a name="line.5809"></a>
+<span class="sourceLineNo">5810</span>    CONF.setLong("hbase.busy.wait.duration", 1000);<a name="line.5810"></a>
+<span class="sourceLineNo">5811</span>    region = initHRegion(tableName, method, CONF, family);<a name="line.5811"></a>
+<span class="sourceLineNo">5812</span>    final AtomicBoolean stopped = new AtomicBoolean(true);<a name="line.5812"></a>
+<span class="sourceLineNo">5813</span>    Thread t = new Thread(new Runnable() {<a name="line.5813"></a>
+<span class="sourceLineNo">5814</span>      @Override<a name="line.5814"></a>
+<span class="sourceLineNo">5815</span>      public void run() {<a name="line.5815"></a>
+<span class="sourceLineNo">5816</span>        try {<a name="line.5816"></a>
+<span class="sourceLineNo">5817</span>          region.lock.writeLock().lock();<a name="line.5817"></a>
+<span class="sourceLineNo">5818</span>          stopped.set(false);<a name="line.5818"></a>
+<span class="sourceLineNo">5819</span>          while (!stopped.get()) {<a name="line.5819"></a>
+<span class="sourceLineNo">5820</span>            Thread.sleep(100);<a name="line.5820"></a>
+<span class="sourceLineNo">5821</span>          }<a name="line.5821"></a>
+<span class="sourceLineNo">5822</span>        } catch (InterruptedException ie) {<a name="line.5822"></a>
+<span class="sourceLineNo">5823</span>        } finally {<a name="line.5823"></a>
+<span class="sourceLineNo">5824</span>          region.lock.writeLock().unlock();<a name="line.5824"></a>
+<span class="sourceLineNo">5825</span>        }<a name="line.5825"></a>
+<span class="sourceLineNo">5826</span>      }<a name="line.5826"></a>
+<span class="sourceLineNo">5827</span>    });<a name="line.5827"></a>
+<span class="sourceLineNo">5828</span>    t.start();<a name="line.5828"></a>
+<span class="sourceLineNo">5829</span>    Get get = new Get(row);<a name="line.5829"></a>
+<span class="sourceLineNo">5830</span>    try {<a name="line.5830"></a>
+<span class="sourceLineNo">5831</span>      while (stopped.get()) {<a name="line.5831"></a>
+<span class="sourceLineNo">5832</span>        Thread.sleep(100);<a name="line.5832"></a>
+<span class="sourceLineNo">5833</span>      }<a name="line.5833"></a>
+<span class="sourceLineNo">5834</span>      region.get(get);<a name="line.5834"></a>
+<span class="sourceLineNo">5835</span>      fail("Should throw RegionTooBusyException");<a name="line.5835"></a>
+<span class="sourceLineNo">5836</span>    } catch (InterruptedException ie) {<a name="line.5836"></a>
+<span class="sourceLineNo">5837</span>      fail("test interrupted");<a name="line.5837"></a>
+<span class="sourceLineNo">5838</span>    } catch (RegionTooBusyException e) {<a name="line.5838"></a>
+<span class="sourceLineNo">5839</span>      // Good, expected<a name="line.5839"></a>
+<span class="sourceLineNo">5840</span>    } finally {<a name="line.5840"></a>
+<span class="sourceLineNo">5841</span>      stopped.set(true);<a name="line.5841"></a>
+<span class="sourceLineNo">5842</span>      try {<a name="line.5842"></a>
+<span class="sourceLineNo">5843</span>        t.join();<a name="line.5843"></a>
+<span class="sourceLineNo">5844</span>      } catch (Throwable e) {<a name="line.5844"></a>
+<span class="sourceLineNo">5845</span>      }<a name="line.5845"></a>
+<span class="sourceLineNo">5846</span><a name="line.5846"></a>
+<span class="sourceLineNo">5847</span>      HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.5847"></a>
+<span class="sourceLineNo">5848</span>      region = null;<a name="line.5848"></a>
+<span class="sourceLineNo">5849</span>      CONF.setLong("hbase.busy.wait.duration", defaultBusyWaitDuration);<a name="line.5849"></a>
+<span class="sourceLineNo">5850</span>    }<a name="line.5850"></a>
+<span class="sourceLineNo">5851</span>  }<a name="line.5851"></a>
+<span class="sourceLineNo">5852</span><a name="line.5852"></a>
+<span class="sourceLineNo">5853</span>  @Test<a name="line.5853"></a>
+<span class="sourceLineNo">5854</span>  public void testCellTTLs() throws IOException {<a name="line.5854"></a>
+<span class="sourceLineNo">5855</span>    IncrementingEnvironmentEdge edge = new IncrementingEnvironmentEdge();<a name="line.5855"></a>
+<span class="sourceLineNo">5856</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.5856"></a>
+<span class="sourceLineNo">5857</span><a name="line.5857"></a>
+<span class="sourceLineNo">5858</span>    final byte[] row = Bytes.toBytes("testRow");<a name="line.5858"></a>
+<span class="sourceLineNo">5859</span>    final byte[] q1 = Bytes.toBytes("q1");<a name="line.5859"></a>
+<span class="sourceLineNo">5860</span>    final byte[] q2 = Bytes.toBytes("q2");<a name="line.5860"></a>
+<span class="sourceLineNo">5861</span>    final byte[] q3 = Bytes.toBytes("q3");<a name="line.5861"></a>
+<span class="sourceLineNo">5862</span>    final byte[] q4 = Bytes.toBytes("q4");<a name="line.5862"></a>
+<span class="sourceLineNo">5863</span><a name="line.5863"></a>
+<span class="sourceLineNo">5864</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.5864"></a>
+<span class="sourceLineNo">5865</span>    HColumnDescriptor hcd = new HColumnDescriptor(fam1);<a name="line.5865"></a>
+<span class="sourceLineNo">5866</span>    hcd.setTimeToLive(10); // 10 seconds<a name="line.5866"></a>
+<span class="sourceLineNo">5867</span>    htd.addFamily(hcd);<a name="line.5867"></a>
+<span class="sourceLineNo">5868</span><a name="line.5868"></a>
+<span class="sourceLineNo">5869</span>    Configuration conf = new Configuration(TEST_UTIL.getConfiguration());<a name="line.5869"></a>
+<span class="sourceLineNo">5870</span>    conf.setInt(HFile.FORMAT_VERSION_KEY, HFile.MIN_FORMAT_VERSION_WITH_TAGS);<a name="line.5870"></a>
+<span class="sourceLineNo">5871</span><a name="line.5871"></a>
+<span class="sourceLineNo">5872</span>    region = HBaseTestingUtility.createRegionAndWAL(new HRegionInfo(htd.getTableName(),<a name="line.5872"></a>
+<span class="sourceLineNo">5873</span>            HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY),<a name="line.5873"></a>
+<span class="sourceLineNo">5874</span>        TEST_UTIL.getDataTestDir(), conf, htd);<a name="line.5874"></a>
+<span class="sourceLineNo">5875</span>    assertNotNull(region);<a name="line.5875"></a>
+<span class="sourceLineNo">5876</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.5876"></a>
+<span class="sourceLineNo">5877</span>    // Add a cell that will expire in 5 seconds via cell TTL<a name="line.5877"></a>
+<span class="sourceLineNo">5878</span>    region.put(new Put(row).add(new KeyValue(row, fam1, q1, now,<a name="line.5878"></a>
+<span class="sourceLineNo">5879</span>      HConstants.EMPTY_BYTE_ARRAY, new ArrayBackedTag[] {<a name="line.5879"></a>
+<span class="sourceLineNo">5880</span>        // TTL tags specify ts in milliseconds<a name="line.5880"></a>
+<span class="sourceLineNo">5881</span>        new ArrayBackedTag(TagType.TTL_TAG_TYPE, Bytes.toBytes(5000L)) })));<a name="line.5881"></a>
+<span class="sourceLineNo">5882</span>    // Add a cell that will expire after 10 seconds via family setting<a name="line.5882"></a>
+<span class="sourceLineNo">5883</span>    region.put(new Put(row).addColumn(fam1, q2, now, HConstants.EMPTY_BYTE_ARRAY));<a name="line.5883"></a>
+<span class="sourceLineNo">5884</span>    // Add a cell that will expire in 15 seconds via cell TTL<a name="line.5884"></a>
+<span class="sourceLineNo">5885</span>    region.put(new Put(row).add(new KeyValue(row, fam1, q3, now + 10000 - 1,<a name="line.5885"></a>
+<span class="sourceLineNo">5886</span>      HConstants.EMPTY_BYTE_ARRAY, new ArrayBackedTag[] {<a name="line.5886"></a>
+<span class="sourceLineNo">5887</span>        // TTL tags specify ts in milliseconds<a name="line.5887"></a>
+<span class="sourceLineNo">5888</span>        new ArrayBackedTag(TagType.TTL_TAG_TYPE, Bytes.toBytes(5000L)) })));<a name="line.5888"></a>
+<span class="sourceLineNo">5889</span>    // Add a cell that will expire in 20 seconds via family setting<a name="line.5889"></a>
+<span class="sourceLineNo">5890</span>    region.put(new Put(row).addColumn(fam1, q4, now + 10000 - 1, HConstants.EMPTY_BYTE_ARRAY));<a name="line.5890"></a>
 <span class="sourceLineNo">5891</span><a name="line.5891"></a>
-<span class="sourceLineNo">5892</span>    // Increment time to T+5 seconds<a name="line.5892"></a>
-<span class="sourceLineNo">5893</span>    edge.incrementTime(5000);<a name="line.5893"></a>
+<span class="sourceLineNo">5892</span>    // Flush so we are sure store scanning gets this right<a name="line.5892"></a>
+<span class="sourceLineNo">5893</span>    region.flush(true);<a name="line.5893"></a>
 <span class="sourceLineNo">5894</span><a name="line.5894"></a>
-<span class="sourceLineNo">5895</span>    r = region.get(new Get(row));<a name="line.5895"></a>
-<span class="sourceLineNo">5896</span>    assertNull(r.getValue(fam1, q1));<a name="line.5896"></a>
-<span class="sourceLineNo">5897</span>    assertNotNull(r.getValue(fam1, q2));<a name="line.5897"></a>
-<span class="sourceLineNo">5898</span>    assertNotNull(r.getValue(fam1, q3));<a name="line.5898"></a>
-<span class="sourceLineNo">5899</span>    assertNotNull(r.getValue(fam1, q4));<a name="line.5899"></a>
-<span class="sourceLineNo">5900</span><a name="line.5900"></a>
-<span class="sourceLineNo">5901</span>    // Increment time to T+10 seconds<a name="line.5901"></a>
-<span class="sourceLineNo">5902</span>    edge.incrementTime(5000);<a name="line.5902"></a>
-<span class="sourceLineNo">5903</span><a name="line.5903"></a>
-<span class="sourceLineNo">5904</span>    r = region.get(new Get(row));<a name="line.5904"></a>
-<span class="sourceLineNo">5905</span>    assertNull(r.getValue(fam1, q1));<a name="line.5905"></a>
-<span class="sourceLineNo">5906</span>    assertNull(r.getValue(fam1, q2));<a name="line.5906"></a>
-<span class="sourceLineNo">5907</span>    assertNotNull(r.getValue(fam1, q3));<a name="line.5907"></a>
-<span class="sourceLineNo">5908</span>    assertNotNull(r.getValue(fam1, q4));<a name="line.5908"></a>
-<span class="sourceLineNo">5909</span><a name="line.5909"></a>
-<span class="sourceLineNo">5910</span>    // Increment time to T+15 seconds<a name="line.5910"></a>
-<span class="sourceLineNo">5911</span>    edge.incrementTime(5000);<a name="line.5911"></a>
-<span class="sourceLineNo">5912</span><a name="line.5912"></a>
-<span class="sourceLineNo">5913</span>    r = region.get(new Get(row));<a name="line.5913"></a>
-<span class="sourceLineNo">5914</span>    assertNull(r.getValue(fam1, q1));<a name="line.5914"></a>
-<span class="sourceLineNo">5915</span>    assertNull(r.getValue(fam1, q2));<a name="line.5915"></a>
-<span class="sourceLineNo">5916</span>    assertNull(r.getValue(fam1, q3));<a name="line.5916"></a>
-<span class="sourceLineNo">5917</span>    assertNotNull(r.getValue(fam1, q4));<a name="line.5917"></a>
-<span class="sourceLineNo">5918</span><a name="line.5918"></a>
-<span class="sourceLineNo">5919</span>    // Increment time to T+20 seconds<a name="line.5919"></a>
-<span class="sourceLineNo">5920</span>    edge.incrementTime(10000);<a name="line.5920"></a>
-<span class="sourceLineNo">5921</span><a name="line.5921"></a>
-<span class="sourceLineNo">5922</span>    r = region.get(new Get(row));<a name="line.5922"></a>
-<span class="sourceLineNo">5923</span>    assertNull(r.getValue(fam1, q1));<a name="line.5923"></a>
-<span class="sourceLineNo">5924</span>    assertNull(r.getValue(fam1, q2));<a name="line.5924"></a>
-<span class="sourceLineNo">5925</span>    assertNull(r.getValue(fam1, q3));<a name="line.5925"></a>
-<span class="sourceLineNo">5926</span>    assertNull(r.getValue(fam1, q4));<a name="line.5926"></a>
-<span class="sourceLineNo">5927</span><a name="line.5927"></a>
-<span class="sourceLineNo">5928</span>    // Fun with disappearing increments<a name="line.5928"></a>
-<span class="sourceLineNo">5929</span><a name="line.5929"></a>
-<span class="sourceLineNo">5930</span>    // Start at 1<a name="line.5930"></a>
-<span class="sourceLineNo">5931</span>    region.put(new Put(row).addColumn(fam1, q1, Bytes.toBytes(1L)));<a name="line.5931"></a>
+<span class="sourceLineNo">5895</span>    // A query at time T+0 should return all cells<a name="line.5895"></a>
+<span class="sourceLineNo">5896</span>    Result r = region.get(new Get(row));<a name="line.5896"></a>
+<span class="sourceLineNo">5897</span>    assertNotNull(r.getValue(fam1, q1));<a name="line.5897"></a>
+<span class="sourceLineNo">5898</span>    assertNotNull(r.getValue(fam1, q2));<a name="line.5898"></a>
+<span class="sourceLineNo">5899</span>    assertNotNull(r.getValue(fam1, q3));<a name="line.5899"></a>
+<span class="sourceLineNo">5900</span>    assertNotNull(r.getValue(fam1, q4));<a name="line.5900"></a>
+<span class="sourceLineNo">5901</span><a name="line.5901"></a>
+<span class="sourceLineNo">5902</span>    // Increment time to T+5 seconds<a name="line.5902"></a>
+<span class="sourceLineNo">5903</span>    edge.incrementTime(5000);<a name="line.5903"></a>
+<span class="sourceLineNo">5904</span><a name="line.5904"></a>
+<span class="sourceLineNo">5905</span>    r = region.get(new Get(row));<a name="line.5905"></a>
+<span class="sourceLineNo">5906</span>    assertNull(r.getValue(fam1, q1));<a name="line.5906"></a>
+<span class="sourceLineNo">5907</span>    assertNotNull(r.getValue(fam1, q2));<a name="line.5907"></a>
+<span class="sourceLineNo">5908</span>    assertNotNull(r.getValue(fam1, q3));<a name="line.5908"></a>
+<span class="sourceLineNo">5909</span>    assertNotNull(r.getValue(fam1, q4));<a name="line.5909"></a>
+<span class="sourceLineNo">5910</span><a name="line.5910"></a>
+<span class="sourceLineNo">5911</span>    // Increment time to T+10 seconds<a name="line.5911"></a>
+<span class="sourceLineNo">5912</span>    edge.incrementTime(5000);<a name="line.5912"></a>
+<span class="sourceLineNo">5913</span><a name="line.5913"></a>
+<span class="sourceLineNo">5914</span>    r = region.get(new Get(row));<a name="line.5914"></a>
+<span class="sourceLineNo">5915</span>    assertNull(r.getValue(fam1, q1));<a name="line.5915"></a>
+<span class="sourceLineNo">5916</span>    assertNull(r.getValue(fam1, q2));<a name="line.5916"></a>
+<span class="sourceLineNo">5917</span>    assertNotNull(r.getValue(fam1, q3));<a name="line.5917"></a>
+<span class="sourceLineNo">5918</span>    assertNotNull(r.getValue(fam1, q4));<a name="line.5918"></a>
+<span class="sourceLineNo">5919</span><a name="line.5919"></a>
+<span class="sourceLineNo">5920</span>    // Increment time to T+15 seconds<a name="line.5920"></a>
+<span class="sourceLineNo">5921</span>    edge.incrementTime(5000);<a name="line.5921"></a>
+<span class="sourceLineNo">5922</span><a name="line.5922"></a>
+<span class="sourceLineNo">5923</span>    r = region.get(new Get(row));<a name="line.5923"></a>
+<span class="sourceLineNo">5924</span>    assertNull(r.getValue(fam1, q1));<a name="line.5924"></a>
+<span class="sourceLineNo">5925</span>    assertNull(r.getValue(fam1, q2));<a name="line.5925"></a>
+<span class="sourceLineNo">5926</span>    assertNull(r.getValue(fam1, q3));<a name="line.5926"></a>
+<span class="sourceLineNo">5927</span>    assertNotNull(r.getValue(fam1, q4));<a name="line.5927"></a>
+<span class="sourceLineNo">5928</span><a name="line.5928"></a>
+<span class="sourceLineNo">5929</span>    // Increment time to T+20 seconds<a name="line.5929"></a>
+<span class="sourceLineNo">5930</span>    edge.incrementTime(10000);<a name="line.5930"></a>
+<span class="sourceLineNo">5931</span><a name="line.5931"></a>
 <span class="sourceLineNo">5932</span>    r = region.get(new Get(row));<a name="line.5932"></a>
-<span class="sourceLineNo">5933</span>    byte[] val = r.getValue(fam1, q1);<a name="line.5933"></a>
-<span class="sourceLineNo">5934</span>    assertNotNull(val);<a name="line.5934"></a>
-<span class="sourceLineNo">5935</span>    assertEquals(1L, Bytes.toLong(val));<a name="line.5935"></a>
-<span class="sourceLineNo">5936</span><a name="line.5936"></a>
-<span class="sourceLineNo">5937</span>    // Increment with a TTL of 5 seconds<a name="line.5937"></a>
-<span class="sourceLineNo">5938</span>    Increment incr = new Increment(row).addColumn(fam1, q1, 1L);<a name="line.5938"></a>
-<span class="sourceLineNo">5939</span>    incr.setTTL(5000);<a name="line.5939"></a>
-<span class="sourceLineNo">5940</span>    region.increment(incr); // 2<a name="line.5940"></a>
-<span class="sourceLineNo">5941</span><a name="line.5941"></a>
-<span class="sourceLineNo">5942</span>    // New value should be 2<a name="line.5942"></a>
-<span class="sourceLineNo">5943</span>    r = region.get(new Get(row));<a name="line.5943"></a>
-<span class="sourceLineNo">5944</span>    val = r.getValue(fam1, q1);<a name="line.5944"></a>
-<span class="sourceLineNo">5945</span>    assertNotNull(val);<a name="line.5945"></a>
-<span class="sourceLineNo">5946</span>    assertEquals(2L, Bytes.toLong(val));<a name="line.5946"></a>
-<span class="sourceLineNo">5947</span><a name="line.5947"></a>
-<span class="sourceLineNo">5948</span>    // Increment time to T+25 seconds<a name="line.5948"></a>
-<span class="sourceLineNo">5949</span>    edge.incrementTime(5000);<a name="line.5949"></a>
-<span class="sourceLineNo">5950</span><a name="line.5950"></a>
-<span class="sourceLineNo">5951</span>    // Value should be back to 1<a name="line.5951"></a>
-<span class="sourceLineNo">5952</span>    r = region.get(new Get(row));<a name="line.5952"></a>
-<span class="sourceLineNo">5953</span>    val = r.getValue(fam1, q1);<a name="line.5953"></a>
-<span class="sourceLineNo">5954</span>    assertNotNull(val);<a name="line.5954"></a>
-<span class="sourceLineNo">5955</span>    assertEquals(1L, Bytes.toLong(val));<a name="line.5955"></a>
-<span class="sourceLineNo">5956</span><a name="line.5956"></a>
-<span class="sourceLineNo">5957</span>    // Increment time to T+30 seconds<a name="line.5957"></a>
-<span class="sourceLineNo">5958</span>    edge.incrementTime(5000);<a name="line.5958"></a>
-<span class="sourceLineNo">5959</span><a name="line.5959"></a>
-<span class="sourceLineNo">5960</span>    // Original value written at T+20 should be gone now via family TTL<a name="line.5960"></a>
-<span class="sourceLineNo">5961</span>    r = region.get(new Get(row));<a name="line.5961"></a>
-<span class="sourceLineNo">5962</span>    assertNull(r.getValue(fam1, q1));<a name="line.5962"></a>
-<span class="sourceLineNo">5963</span>  }<a name="line.5963"></a>
-<span class="sourceLineNo">5964</span><a name="line.5964"></a>
-<span class="sourceLineNo">5965</span>  @Test<a name="line.5965"></a>
-<span class="sourceLineNo">5966</span>  public void testIncrementTimestampsAreMonotonic() throws IOException {<a name="line.5966"></a>
-<span class="sourceLineNo">5967</span>    region = initHRegion(tableName, method, CONF, fam1);<a name="line.5967"></a>
-<span class="sourceLineNo">5968</span>    ManualEnvironmentEdge edge = new ManualEnvironmentEdge();<a name="line.5968"></a>
-<span class="sourceLineNo">5969</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.5969"></a>
-<span class="sourceLineNo">5970</span><a name="line.5970"></a>
-<span class="sourceLineNo">5971</span>    edge.setValue(10);<a name="line.5971"></a>
-<span class="sourceLineNo">5972</span>    Increment inc = new Increment(row);<a name="line.5972"></a>
-<span class="sourceLineNo">5973</span>    inc.setDurability(Durability.SKIP_WAL);<a name="line.5973"></a>
-<span class="sourceLineNo">5974</span>    inc.addColumn(fam1, qual1, 1L);<a name="line.5974"></a>
-<span class="sourceLineNo">5975</span>    region.increment(inc);<a name="line.5975"></a>
-<span class="sourceLineNo">5976</span><a name="line.5976"></a>
-<span class="sourceLineNo">5977</span>    Result result = region.get(new Get(row));<a name="line.5977"></a>
-<span class="sourceLineNo">5978</span>    Cell c = result.getColumnLatestCell(fam1, qual1);<a name="line.5978"></a>
-<span class="sourceLineNo">5979</span>    assertNotNull(c);<a name="line.5979"></a>
-<span class="sourceLineNo">5980</span>    assertEquals(10L, c.getTimestamp());<a name="line.5980"></a>
-<span class="sourceLineNo">5981</span><a name="line.5981"></a>
-<span class="sourceLineNo">5982</span>    edge.setValue(1); // clock goes back<a name="line.5982"></a>
-<span class="sourceLineNo">5983</span>    region.increment(inc);<a name="line.5983"></a>
-<span class="sourceLineNo">5984</span>    result = region.get(new Get(row));<a name="line.5984"></a>
-<span class="sourceLineNo">5985</span>    c = result.getColumnLatestCell(fam1, qual1);<a name="line.5985"></a>
-<span class="sourceLineNo">5986</span>    assertEquals(11L, c.getTimestamp());<a name="line.5986"></a>
-<span class="sourceLineNo">5987</span>    assertEquals(2L, Bytes.toLong(c.getValueArray(), c.getValueOffset(), c.getValueLength()));<a name="line.5987"></a>
-<span class="sourceLineNo">5988</span>  }<a name="line.5988"></a>
-<span class="sourceLineNo">5989</span><a name="line.5989"></a>
-<span class="sourceLineNo">5990</span>  @Test<a name="line.5990"></a>
-<span class="sourceLineNo">5991</span>  public void testAppendTimestampsAreMonotonic() throws IOException {<a name="line.5991"></a>
-<span class="sourceLineNo">5992</span>    region = initHRegion(tableName, method, CONF, fam1);<a name="line.5992"></a>
-<span class="sourceLineNo">5993</span>    ManualEnvironmentEdge edge = new ManualEnvironmentEdge();<a name="line.5993"></a>
-<span class="sourceLineNo">5994</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.5994"></a>
-<span class="sourceLineNo">5995</span><a name="line.5995"></a>
-<span class="sourceLineNo">5996</span>    edge.setValue(10);<a name="line.5996"></a>
-<span class="sourceLineNo">5997</span>    Append a = new Append(row);<a name="line.5997"></a>
-<span class="sourceLineNo">5998</span>    a.setDurability(Durability.SKIP_WAL);<a name="line.5998"></a>
-<span class="sourceLineNo">5999</span>    a.addColumn(fam1, qual1, qual1);<a name="line.5999"></a>
-<span class="sourceLineNo">6000</span>    region.append(a);<a name="line.6000"></a>
-<span class="sourceLineNo">6001</span><a name="line.6001"></a>
-<span class="sourceLineNo">6002</span>    Result result = region.get(new Get(row));<a name="line.6002"></a>
-<span class="sourceLineNo">6003</span>    Cell c = result.getColumnLatestCell(fam1, qual1);<a name="line.6003"></a>
-<span class="sourceLineNo">6004</span>    assertNotNull(c);<a name="line.6004"></a>
-<span class="sourceLineNo">6005</span>    assertEquals(10L, c.getTimestamp());<a name="line.6005"></a>
-<span class="sourceLineNo">6006</span><a name="line.6006"></a>
-<span class="sourceLineNo">6007</span>    edge.setValue(1); // clock goes back<a name="line.6007"></a>
-<span class="sourceLineNo">6008</span>    region.append(a);<a name="line.6008"></a>
-<span class="sourceLineNo">6009</span>    result = region.get(new Get(row));<a name="line.6009"></a>
-<span class="sourceLineNo">6010</span>    c = result.getColumnLatestCell(fam1, qual1);<a name="line.6010"></a>
-<span class="sourceLineNo">6011</span>    assertEquals(11L, c.getTimestamp());<a name="line.6011"></a>
-<span class="sourceLineNo">6012</span><a name="line.6012"></a>
-<span class="sourceLineNo">6013</span>    byte[] expected = new byte[qual1.length*2];<a name="line.6013"></a>
-<span class="sourceLineNo">6014</span>    System.arraycopy(qual1, 0, expected, 0, qual1.length);<a name="line.6014"></a>
-<span class="sourceLineNo">6015</span>    System.arraycopy(qual1, 0, expected, qual1.length, qual1.length);<a name="line.6015"></a>
+<span class="sourceLineNo">5933</span>    assertNull(r.getValue(fam1, q1));<a name="line.5933"></a>
+<span class="sourceLineNo">5934</span>    assertNull(r.getValue(fam1, q2));<a name="line.5934"></a>
+<span class="sourceLineNo">5935</span>    assertNull(r.getValue(fam1, q3));<a name="line.5935"></a>
+<span class="sourceLineNo">5936</span>    assertNull(r.getValue(fam1, q4));<a name="line.5936"></a>
+<span class="sourceLineNo">5937</span><a name="line.5937"></a>
+<span class="sourceLineNo">5938</span>    // Fun with disappearing increments<a name="line.5938"></a>
+<span class="sourceLineNo">5939</span><a name="line.5939"></a>
+<span class="sourceLineNo">5940</span>    // Start at 1<a name="line.5940"></a>
+<span class="sourceLineNo">5941</span>    region.put(new Put(row).addColumn(fam1, q1, Bytes.toBytes(1L)));<a name="line.5941"></a>
+<span class="sourceLineNo">5942</span>    r = region.get(new Get(row));<a name="line.5942"></a>
+<span class="sourceLineNo">5943</span>    byte[] val = r.getValue(fam1, q1);<a name="line.5943"></a>
+<span class="sourceLineNo">5944</span>    assertNotNull(val);<a name="line.5944"></a>
+<span class="sourceLineNo">5945</span>    assertEquals(1L, Bytes.toLong(val));<a name="line.5945"></a>
+<span class="sourceLineNo">5946</span><a name="line.5946"></a>
+<span class="sourceLineNo">5947</span>    // Increment with a TTL of 5 seconds<a name="line.5947"></a>
+<span class="sourceLineNo">5948</span>    Increment incr = new Increment(row).addColumn(fam1, q1, 1L);<a name="line.5948"></a>
+<span class="sourceLineNo">5949</span>    incr.setTTL(5000);<a name="line.5949"></a>
+<span class="sourceLineNo">5950</span>    region.increment(incr); // 2<a name="line.5950"></a>
+<span class="sourceLineNo">5951</span><a name="line.5951"></a>
+<span class="sourceLineNo">5952</span>    // New value should be 2<a name="line.5952"></a>
+<span class="sourceLineNo">5953</span>    r = region.get(new Get(row));<a name="line.5953"></a>
+<span class="sourceLineNo">5954</span>    val = r.getValue(fam1, q1);<a name="line.5954"></a>
+<span class="sourceLineNo">5955</span>    assertNotNull(val);<a name="line.5955"></a>
+<span class="sourceLineNo">5956</span>    assertEquals(2L, Bytes.toLong(val));<a name="line.5956"></a>
+<span class="sourceLineNo">5957</span><a name="line.5957"></a>
+<span class="sourceLineNo">5958</span>    // Increment time to T+25 seconds<a name="line.5958"></a>
+<span class="sourceLineNo">5959</span>    edge.incrementTime(5000);<a name="line.5959"></a>
+<span class="sourceLineNo">5960</span><a name="line.5960"></a>
+<span class="sourceLineNo">5961</span>    // Value should be back to 1<a name="line.5961"></a>
+<span class="sourceLineNo">5962</span>    r = region.get(new Get(row));<a name="line.5962"></a>
+<span class="sourceLineNo">5963</span>    val = r.getValue(fam1, q1);<a name="line.5963"></a>
+<span class="sourceLineNo">5964</span>    assertNotNull(val);<a name="line.5964"></a>
+<span class="sourceLineNo">5965</span>    assertEquals(1L, Bytes.toLong(val));<a name="line.5965"></a>
+<span class="sourceLineNo">5966</span><a name="line.5966"></a>
+<span class="sourceLineNo">5967</span>    // Increment time to T+30 seconds<a name="line.5967"></a>
+<span class="sourceLineNo">5968</span>    edge.incrementTime(5000);<a name="line.5968"></a>
+<span class="sourceLineNo">5969</span><a name="line.5969"></a>
+<span class="sourceLineNo">5970</span>    // Original value written at T+20 should be gone now via family TTL<a name="line.5970"></a>
+<span class="sourceLineNo">5971</span>    r = region.get(new Get(row));<a name="line.5971"></a>
+<span class="sourceLineNo">5972</span>    assertNull(r.getValue(fam1, q1));<a name="line.5972"></a>
+<span class="sourceLineNo">5973</span>  }<a name="line.5973"></a>
+<span class="sourceLineNo">5974</span><a name="line.5974"></a>
+<span class="sourceLineNo">5975</span>  @Test<a name="line.5975"></a>
+<span class="sourceLineNo">5976</span>  public void testIncrementTimestampsAreMonotonic() throws IOException {<a name="line.5976"></a>
+<span class="sourceLineNo">5977</span>    region = initHRegion(tableName, method, CONF, fam1);<a name="line.5977"></a>
+<span class="sourceLineNo">5978</span>    ManualEnvironmentEdge edge = new ManualEnvironmentEdge();<a name="line.5978"></a>
+<span class="sourceLineNo">5979</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.5979"></a>
+<span class="sourceLineNo">5980</span><a name="line.5980"></a>
+<span class="sourceLineNo">5981</span>    edge.setValue(10);<a name="line.5981"></a>
+<span class="sourceLineNo">5982</span>    Increment inc = new Increment(row);<a name="line.5982"></a>
+<span class="sourceLineNo">5983</span>    inc.setDurability(Durability.SKIP_WAL);<a name="line.5983"></a>
+<span class="sourceLineNo">5984</span>    inc.addColumn(fam1, qual1, 1L);<a name="line.5984"></a>
+<span class="sourceLineNo">5985</span>    region.increment(inc);<a name="line.5985"></a>
+<span class="sourceLineNo">5986</span><a name="line.5986"></a>
+<span class="sourceLineNo">5987</span>    Result result = region.get(new Get(row));<a name="line.5987"></a>
+<span class="sourceLineNo">5988</span>    Cell c = result.getColumnLatestCell(fam1, qual1);<a name="line.5988"></a>
+<span class="sourceLineNo">5989</span>    assertNotNull(c);<a name="line.5989"></a>
+<span class="sourceLineNo">5990</span>    assertEquals(10L, c.getTimestamp());<a name="line.5990"></a>
+<span class="sourceLineNo">5991</span><a name="line.5991"></a>
+<span class="sourceLineNo">5992</span>    edge.setValue(1); // clock goes back<a name="line.5992"></a>
+<span class="sourceLineNo">5993</span>    region.increment(inc);<a name="line.5993"></a>
+<span class="sourceLineNo">5994</span>    result = region.get(new Get(row));<a name="line.5994"></a>
+<span class="sourceLineNo">5995</span>    c = result.getColumnLatestCell(fam1, qual1);<a name="line.5995"></a>
+<span class="sourceLineNo">5996</span>    assertEquals(11L, c.getTimestamp());<a name="line.5996"></a>
+<span class="sourceLineNo">5997</span>    assertEquals(2L, Bytes.toLong(c.getValueArray(), c.getValueOffset(), c.getValueLength()));<a name="line.5997"></a>
+<span class="sourceLineNo">5998</span>  }<a name="line.5998"></a>
+<span class="sourceLineNo">5999</span><a name="line.5999"></a>
+<span class="sourceLineNo">6000</span>  @Test<a name="line.6000"></a>
+<span class="sourceLineNo">6001</span>  public void testAppendTimestampsAreMonotonic() throws IOException {<a name="line.6001"></a>
+<span class="sourceLineNo">6002</span>    region = initHRegion(tableName, method, CONF, fam1);<a name="line.6002"></a>
+<span class="sourceLineNo">6003</span>    ManualEnvironmentEdge edge = new ManualEnvironmentEdge();<a name="line.6003"></a>
+<span class="sourceLineNo">6004</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.6004"></a>
+<span class="sourceLineNo">6005</span><a name="line.6005"></a>
+<span class="sourceLineNo">6006</span>    edge.setValue(10);<a name="line.6006"></a>
+<span class="sourceLineNo">6007</span>    Append a = new Append(row);<a name="line.6007"></a>
+<span class="sourceLineNo">6008</span>    a.setDurability(Durability.SKIP_WAL);<a name="line.6008"></a>
+<span class="sourceLineNo">6009</span>    a.addColumn(fam1, qual1, qual1);<a name="line.6009"></a>
+<span class="sourceLineNo">6010</span>    region.append(a);<a name="line.6010"></a>
+<span class="sourceLineNo">6011</span><a name="line.6011"></a>
+<span class="sourceLineNo">6012</span>    Result result = region.get(new Get(row));<a name="line.6012"></a>
+<span class="sourceLineNo">6013</span>    Cell c = result.getColumnLatestCell(fam1, qual1);<a name="line.6013"></a>
+<span class="sourceLineNo">6014</span>    assertNotNull(c);<a name="line.6014"></a>
+<span class="sourceLineNo">6015</span>    assertEquals(10L, c.getTimestamp());<a name="line.6015"></a>
 <span class="sourceLineNo">6016</span><a name="line.6016"></a>
-<span class="sourceLineNo">6017</span>    assertTrue(Bytes.equals(c.getValueArray(), c.getValueOffset(), c.getValueLength(),<a name="line.6017"></a>
-<span class="sourceLineNo">6018</span>      expected, 0, expected.length));<a name="line.6018"></a>
-<span class="sourceLineNo">6019</span>  }<a name="line.6019"></a>
-<span class="sourceLineNo">6020</span><a name="line.6020"></a>
-<span class="sourceLineNo">6021</span>  @Test<a name="line.6021"></a>
-<span class="sourceLineNo">6022</span>  public void testCheckAndMutateTimestampsAreMonotonic() throws IOException {<a name="line.6022"></a>
-<span class="sourceLineNo">6023</span>    region = initHRegion(tableName, method, CONF, fam1);<a name="line.6023"></a>
-<span class="sourceLineNo">6024</span>    ManualEnvironmentEdge edge = new ManualEnvironmentEdge();<a name="line.6024"></a>
-<span class="sourceLineNo">6025</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.6025"></a>
+<span class="sourceLineNo">6017</span>    edge.setValue(1); // clock goes back<a name="line.6017"></a>
+<span class="sourceLineNo">6018</span>    region.append(a);<a name="line.6018"></a>
+<span class="sourceLineNo">6019</span>    result = region.get(new Get(row));<a name="line.6019"></a>
+<span class="sourceLineNo">6020</span>    c = result.getColumnLatestCell(fam1, qual1);<a name="line.6020"></a>
+<span class="sourceLineNo">6021</span>    assertEquals(11L, c.getTimestamp());<a name="line.6021"></a>
+<span class="sourceLineNo">6022</span><a name="line.6022"></a>
+<span class="sourceLineNo">6023</span>    byte[] expected = new byte[qual1.length*2];<a name="line.6023"></a>
+<span class="sourceLineNo">6024</span>    System.arraycopy(qual1, 0, expected, 0, qual1.length);<a name="line.6024"></a>
+<span class="sourceLineNo">6025</span>    System.arraycopy(qual1, 0, expected, qual1.length, qual1.length);<a name="line.6025"></a>
 <span class="sourceLineNo">6026</span><a name="line.6026"></a>
-<span class="sourceLineNo">6027</span>    edge.setValue(10);<a name="line.6027"></a>
-<span class="sourceLineNo">6028</span>    Put p = new Put(row);<a name="line.6028"></a>
-<span class="sourceLineNo">6029</span>    p.setDurability(Durability.SKIP_WAL);<a name="line.6029"></a>
-<span class="sourceLineNo">6030</span>    p.addColumn(fam1, qual1, qual1);<a name="line.6030"></a>
-<span class="sourceLineNo">6031</span>    region.put(p);<a name="line.6031"></a>
-<span class="sourceLineNo">6032</span><a name="line.6032"></a>
-<span class="sourceLineNo">6033</span>    Result result = region.get(new Get(row));<a name="line.6033"></a>
-<span class="sourceLineNo">6034</span>    Cell c = result.getColumnLatestCell(fam1, qual1);<a name="line.6034"></a>
-<span class="sourceLineNo">6035</span>    assertNotNull(c);<a name="line.6035"></a>
-<span class="sourceLineNo">6036</span>    assertEquals(10L, c.getTimestamp());<a name="line.6036"></a>
-<span class="sourceLineNo">6037</span><a name="line.6037"></a>
-<span class="sourceLineNo">6038</span>    edge.setValue(1); // clock goes back<a name="line.6038"></a>
-<span class="sourceLineNo">6039</span>    p = new Put(row);<a name="line.6039"></a>
-<span class="sourceLineNo">6040</span>    p.setDurability(Durability.SKIP_WAL);<a name="line.6040"></a>
-<span class="sourceLineNo">6041</span>    p.addColumn(fam1, qual1, qual2);<a name="line.6041"></a>
-<span class="sourceLineNo">6042</span>    region.checkAndMutate(row, fam1, qual1, CompareOperator.EQUAL, new BinaryComparator(qual1), p);<a name="line.6042"></a>
-<span class="sourceLineNo">6043</span>    result = region.get(new Get(row));<a name="line.6043"></a>
-<span class="sourceLineNo">6044</span>    c = result.getColumnLatestCell(fam1, qual1);<a name="line.6044"></a>
-<span class="sourceLineNo">6045</span>    assertEquals(10L, c.getTimestamp());<a name="line.6045"></a>
-<span class="sourceLineNo">6046</span><a name="line.6046"></a>
-<span class="sourceLineNo">6047</span>    assertTrue(Bytes.equals(c.getValueArray(), c.getValueOffset(), c.getValueLength(),<a name="line.6047"></a>
-<span class="sourceLineNo">6048</span>      qual2, 0, qual2.length));<a name="line.6048"></a>
-<span class="sourceLineNo">6049</span>  }<a name="line.6049"></a>
-<span class="sourceLineNo">6050</span><a name="line.6050"></a>
-<span class="sourceLineNo">6051</span>  @Test<a name="line.6051"></a>
-<span class="sourceLineNo">6052</span>  public void testBatchMutateWithWrongRegionException() throws Exception {<a name="line.6052"></a>
-<span class="sourceLineNo">6053</span>    final byte[] a = Bytes.toBytes("a");<a name="line.6053"></a>
-<span class="sourceLineNo">6054</span>    final byte[] b = Bytes.toBytes("b");<a name="line.6054"></a>
-<span class="sourceLineNo">6055</span>    final byte[] c = Bytes.toBytes("c"); // exclusive<a name="line.6055"></a>
+<span class="sourceLineNo">6027</span>    assertTrue(Bytes.equals(c.getValueArray(), c.getValueOffset(), c.getValueLength(),<a name="line.6027"></a>
+<span class="sourceLineNo">6028</span>      expected, 0, expected.length));<a name="line.6028"></a>
+<span class="sourceLineNo">6029</span>  }<a name="line.6029"></a>
+<span class="sourceLineNo">6030</span><a name="line.6030"></a>
+<span class="sourceLineNo">6031</span>  @Test<a name="line.6031"></a>
+<span class="sourceLineNo">6032</span>  public void testCheckAndMutateTimestampsAreMonotonic() throws IOException {<a name="line.6032"></a>
+<span class="sourceLineNo">6033</span>    region = initHRegion(tableName, method, CONF, fam1);<a name="line.6033"></a>
+<span class="sourceLineNo">6034</span>    ManualEnvironmentEdge edge = new ManualEnvironmentEdge();<a name="line.6034"></a>
+<span class="sourceLineNo">6035</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.6035"></a>
+<span class="sourceLineNo">6036</span><a name="line.6036"></a>
+<span class="sourceLineNo">6037</span>    edge.setValue(10);<a name="line.6037"></a>
+<span class="sourceLineNo">6038</span>    Put p = new Put(row);<a name="line.6038"></a>
+<span class="sourceLineNo">6039</span>    p.setDurability(Durability.SKIP_WAL);<a name="line.6039"></a>
+<span class="sourceLineNo">6040</span>    p.addColumn(fam1, qual1, qual1);<a name="line.6040"></a>
+<span class="sourceLineNo">6041</span>    region.put(p);<a name="line.6041"></a>
+<span class="sourceLineNo">6042</span><a name="line.6042"></a>
+<span class="sourceLineNo">6043</span>    Result result = region.get(new Get(row));<a name="line.6043"></a>
+<span class="sourceLineNo">6044</span>    Cell c = result.getColumnLatestCell(fam1, qual1);<a name="line.6044"></a>
+<span class="sourceLineNo">6045</span>    assertNotNull(c);<a name="line.6045"></a>
+<span class="sourceLineNo">6046</span>    assertEquals(10L, c.getTimestamp());<a name="line.6046"></a>
+<span class="sourceLineNo">6047</span><a name="line.6047"></a>
+<span class="sourceLineNo">6048</span>    edge.setValue(1); // clock goes back<a name="line.6048"></a>
+<span class="sourceLineNo">6049</span>    p = new Put(row);<a name="line.6049"></a>
+<span class="sourceLineNo">6050</span>    p.setDurability(Durability.SKIP_WAL);<a name="line.6050"></a>
+<span class="sourceLineNo">6051</span>    p.addColumn(fam1, qual1, qual2);<a name="line.6051"></a>
+<span class="sourceLineNo">6052</span>    region.checkAndMutate(row, fam1, qual1, CompareOperator.EQUAL, new BinaryComparator(qual1), p);<a name="line.6052"></a>
+<span class="sourceLineNo">6053</span>    result = region.get(new Get(row));<a name="line.6053"></a>
+<span class="sourceLineNo">6054</span>    c = result.getColumnLatestCell(fam1, qual1);<a name="line.6054"></a>
+<span class="sourceLineNo">6055</span>    assertEquals(10L, c.getTimestamp());<a name="line.6055"></a>
 <span class="sourceLineNo">6056</span><a name="line.6056"></a>
-<span class="sourceLineNo">6057</span>    int prevLockTimeout = CONF.getInt("hbase.rowlock.wait.duration", 30000);<a name="line.6057"></a>
-<span class="sourceLineNo">6058</span>    CONF.setInt("hbase.rowlock.wait.duration", 1000);<a name="line.6058"></a>
-<span class="sourceLineNo">6059</span>    region = initHRegion(tableName, a, c, method, CONF, false, fam1);<a name="line.6059"></a>
+<span class="sourceLineNo">6057</span>    assertTrue(Bytes.equals(c.getValueArray(), c.getValueOffset(), c.getValueLength(),<a name="line.6057"></a>
+<span class="sourceLineNo">6058</span>      qual2, 0, qual2.length));<a name="line.6058"></a>
+<span class="sourceLineNo">6059</span>  }<a name="line.6059"></a>
 <span class="sourceLineNo">6060</span><a name="line.6060"></a>
-<span class="sourceLineNo">6061</span>    Mutation[] mutations = new Mutation[] {<a name="line.6061"></a>
-<span class="sourceLineNo">6062</span>        new Put(a)<a name="line.6062"></a>
-<span class="sourceLineNo">6063</span>            .add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6063"></a>
-<span class="sourceLineNo">6064</span>              .setRow(a)<a name="line.6064"></a>
-<span class="sourceLineNo">6065</span>              .setFamily(fam1)<a name="line.6065"></a>
-<span class="sourceLineNo">6066</span>              .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6066"></a>
-<span class="sourceLineNo">6067</span>              .setType(Cell.Type.Put)<a name="line.6067"></a>
-<span class="sourceLineNo">6068</span>              .build()),<a name="line.6068"></a>
-<span class="sourceLineNo">6069</span>        // this is outside the region boundary<a name="line.6069"></a>
-<span class="sourceLineNo">6070</span>        new Put(c).add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6070"></a>
-<span class="sourceLineNo">6071</span>              .setRow(c)<a name="line.6071"></a>
-<span class="sourceLineNo">6072</span>              .setFamily(fam1)<a name="line.6072"></a>
-<span class="sourceLineNo">6073</span>              .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6073"></a>
-<span class="sourceLineNo">6074</span>              .setType(Type.Put)<a name="line.6074"></a>
-<span class="sourceLineNo">6075</span>              .build()),<a name="line.6075"></a>
-<span class="sourceLineNo">6076</span>        new Put(b).add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6076"></a>
-<span class="sourceLineNo">6077</span>              .setRow(b)<a name="line.6077"></a>
-<span class="sourceLineNo">6078</span>              .setFamily(fam1)<a name="line.6078"></a>
-<span class="sourceLineNo">6079</span>              .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6079"></a>
-<span class="sourceLineNo">6080</span>              .setType(Cell.Type.Put)<a name="line.6080"></a>
-<span class="sourceLineNo">6081</span>              .build())<a name="line.6081"></a>
-<span class="sourceLineNo">6082</span>    };<a name="line.6082"></a>
-<span class="sourceLineNo">6083</span><a name="line.6083"></a>
-<span class="sourceLineNo">6084</span>    OperationStatus[] status = region.batchMutate(mutations);<a name="line.6084"></a>
-<span class="sourceLineNo">6085</span>    assertEquals(OperationStatusCode.SUCCESS, status[0].getOperationStatusCode());<a name="line.6085"></a>
-<span class="sourceLineNo">6086</span>    assertEquals(OperationStatusCode.SANITY_CHECK_FAILURE, status[1].getOperationStatusCode());<a name="line.6086"></a>
-<span class="sourceLineNo">6087</span>    assertEquals(OperationStatusCode.SUCCESS, status[2].getOperationStatusCode());<a name="line.6087"></a>
-<span class="sourceLineNo">6088</span><a name="line.6088"></a>
-<span class="sourceLineNo">6089</span><a name="line.6089"></a>
-<span class="sourceLineNo">6090</span>    // test with a row lock held for a long time<a name="line.6090"></a>
-<span class="sourceLineNo">6091</span>    final CountDownLatch obtainedRowLock = new CountDownLatch(1);<a name="line.6091"></a>
-<span class="sourceLineNo">6092</span>    ExecutorService exec = Executors.newFixedThreadPool(2);<a name="line.6092"></a>
-<span class="sourceLineNo">6093</span>    Future&lt;Void&gt; f1 = exec.submit(new Callable&lt;Void&gt;() {<a name="line.6093"></a>
-<span class="sourceLineNo">6094</span>      @Override<a name="line.6094"></a>
-<span class="sourceLineNo">6095</span>      public Void call() throws Exception {<a name="line.6095"></a>
-<span class="sourceLineNo">6096</span>        LOG.info("Acquiring row lock");<a name="line.6096"></a>
-<span class="sourceLineNo">6097</span>        RowLock rl = region.getRowLock(b);<a name="line.6097"></a>
-<span class="sourceLineNo">6098</span>        obtainedRowLock.countDown();<a name="line.6098"></a>
-<span class="sourceLineNo">6099</span>        LOG.info("Waiting for 5 seconds before releasing lock");<a name="line.6099"></a>
-<span class="sourceLineNo">6100</span>        Threads.sleep(5000);<a name="line.6100"></a>
-<span class="sourceLineNo">6101</span>        LOG.info("Releasing row lock");<a name="line.6101"></a>
-<span class="sourceLineNo">6102</span>        rl.release();<a name="line.6102"></a>
-<span class="sourceLineNo">6103</span>        return null;<a name="line.6103"></a>
-<span class="sourceLineNo">6104</span>      }<a name="line.6104"></a>
-<span class="sourceLineNo">6105</span>    });<a name="line.6105"></a>
-<span class="sourceLineNo">6106</span>    obtainedRowLock.await(30, TimeUnit.SECONDS);<a name="line.6106"></a>
-<span class="sourceLineNo">6107</span><a name="line.6107"></a>
-<span class="sourceLineNo">6108</span>    Future&lt;Void&gt; f2 = exec.submit(new Callable&lt;Void&gt;() {<a name="line.6108"></a>
-<span class="sourceLineNo">6109</span>      @Override<a name="line.6109"></a>
-<span class="sourceLineNo">6110</span>      public Void call() throws Exception {<a name="line.6110"></a>
-<span class="sourceLineNo">6111</span>        Mutation[] mutations = new Mutation[] {<a name="line.6111"></a>
-<span class="sourceLineNo">6112</span>            new Put(a).add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6112"></a>
-<span class="sourceLineNo">6113</span>                .setRow(a)<a name="line.6113"></a>
-<span class="sourceLineNo">6114</span>                .setFamily(fam1)<a name="line.6114"></a>
-<span class="sourceLineNo">6115</span>                .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6115"></a>
-<span class="sourceLineNo">6116</span>                .setType(Cell.Type.Put)<a name="line.6116"></a>
-<span class="sourceLineNo">6117</span>                .build()),<a name="line.6117"></a>
-<span class="sourceLineNo">6118</span>            new Put(b).add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6118"></a>
-<span class="sourceLineNo">6119</span>                .setRow(b)<a name="line.6119"></a>
-<span class="sourceLineNo">6120</span>                .setFamily(fam1)<a name="line.6120"></a>
-<span class="sourceLineNo">6121</span>                .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6121"></a>
-<span class="sourceLineNo">6122</span>                .setType(Cell.Type.Put)<a name="line.6122"></a>
-<span class="sourceLineNo">6123</span>                .build()),<a name="line.6123"></a>
-<span class="sourceLineNo">6124</span>        };<a name="line.6124"></a>
-<span class="sourceLineNo">6125</span><a name="line.6125"></a>
-<span class="sourceLineNo">6126</span>        // this will wait for the row lock, and it will eventually succeed<a name="line.6126"></a>
-<span class="sourceLineNo">6127</span>        OperationStatus[] status = region.batchMutate(mutations);<a name="line.6127"></a>
-<span class="sourceLineNo">6128</span>        assertEquals(OperationStatusCode.SUCCESS, status[0].getOperationStatusCode());<a name="line.6128"></a>
-<span class="sourceLineNo">6129</span>        assertEquals(OperationStatusCode.SUCCESS, status[1].getOperationStatusCode());<a name="line.6129"></a>
-<span class="sourceLineNo">6130</span>        return null;<a name="line.6130"></a>
-<span class="sourceLineNo">6131</span>      }<a name="line.6131"></a>
-<span class="sourceLineNo">6132</span>    });<a name="line.6132"></a>
-<span class="sourceLineNo">6133</span><a name="line.6133"></a>
-<span class="sourceLineNo">6134</span>    f1.get();<a name="line.6134"></a>
-<span class="sourceLineNo">6135</span>    f2.get();<a name="line.6135"></a>
-<span class="sourceLineNo">6136</span><a name="line.6136"></a>
-<span class="sourceLineNo">6137</span>    CONF.setInt("hbase.rowlock.wait.duration", prevLockTimeout);<a name="line.6137"></a>
-<span class="sourceLineNo">6138</span>  }<a name="line.6138"></a>
-<span class="sourceLineNo">6139</span><a name="line.6139"></a>
-<span class="sourceLineNo">6140</span>  @Test<a name="line.6140"></a>
-<span class="sourceLineNo">6141</span>  public void testCheckAndRowMutateTimestampsAreMonotonic() throws IOException {<a name="line.6141"></a>
-<span class="sourceLineNo">6142</span>    region = initHRegion(tableName, method, CONF, fam1);<a name="line.6142"></a>
-<span class="sourceLineNo">6143</span>    ManualEnvironmentEdge edge = new ManualEnvironmentEdge();<a name="line.6143"></a>
-<span class="sourceLineNo">6144</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.6144"></a>
-<span class="sourceLineNo">6145</span><a name="line.6145"></a>
-<span class="sourceLineNo">6146</span>    edge.setValue(10);<a name="line.6146"></a>
-<span class="sourceLineNo">6147</span>    Put p = new Put(row);<a name="line.6147"></a>
-<span class="sourceLineNo">6148</span>    p.setDurability(Durability.SKIP_WAL);<a name="line.6148"></a>
-<span class="sourceLineNo">6149</span>    p.addColumn(fam1, qual1, qual1);<a name="line.6149"></a>
-<span class="sourceLineNo">6150</span>    region.put(p);<a name="line.6150"></a>
-<span class="sourceLineNo">6151</span><a name="line.6151"></a>
-<span class="sourceLineNo">6152</span>    Result result = region.get(new Get(row));<a name="line.6152"></a>
-<span class="sourceLineNo">6153</span>    Cell c = result.getColumnLatestCell(fam1, qual1);<a name="line.6153"></a>
-<span class="sourceLineNo">6154</span>    assertNotNull(c);<a name="line.6154"></a>
-<span class="sourceLineNo">6155</span>    assertEquals(10L, c.getTimestamp());<a name="line.6155"></a>
-<span class="sourceLineNo">6156</span><a name="line.6156"></a>
-<span class="sourceLineNo">6157</span>    edge.setValue(1); // clock goes back<a name="line.6157"></a>
-<span class="sourceLineNo">6158</span>    p = new Put(row);<a name="line.6158"></a>
-<span class="sourceLineNo">6159</span>    p.setDurability(Durability.SKIP_WAL);<a name="line.6159"></a>
-<span class="sourceLineNo">6160</span>    p.addColumn(fam1, qual1, qual2);<a name="line.6160"></a>
-<span class="sourceLineNo">6161</span>    RowMutations rm = new RowMutations(row);<a name="line.6161"></a>
-<span class="sourceLineNo">6162</span>    rm.add(p);<a name="line.6162"></a>
-<span class="sourceLineNo">6163</span>    assertTrue(region.checkAndRowMutate(row, fam1, qual1, CompareOperator.EQUAL,<a name="line.6163"></a>
-<span class="sourceLineNo">6164</span>        new BinaryComparator(qual1), rm));<a name="line.6164"></a>
-<span class="sourceLineNo">6165</span>    result = region.get(new Get(row));<a name="line.6165"></a>
-<span class="sourceLineNo">6166</span>    c = result.getColumnLatestCell(fam1, qual1);<a name="line.6166"></a>
-<span class="sourceLineNo">6167</span>    assertEquals(10L, c.getTimestamp());<a name="line.6167"></a>
-<span class="sourceLineNo">6168</span>    LOG.info("c value " +<a name="line.6168"></a>
-<span class="sourceLineNo">6169</span>      Bytes.toStringBinary(c.getValueArray(), c.getValueOffset(), c.getValueLength()));<a name="line.6169"></a>
-<span class="sourceLineNo">6170</span><a name="line.6170"></a>
-<span class="sourceLineNo">6171</span>    assertTrue(Bytes.equals(c.getValueArray(), c.getValueOffset(), c.getValueLength(),<a name="line.6171"></a>
-<span class="sourceLineNo">6172</span>      qual2, 0, qual2.length));<a name="line.6172"></a>
-<span class="sourceLineNo">6173</span>  }<a name="line.6173"></a>
-<span class="sourceLineNo">6174</span><a name="line.6174"></a>
-<span class="sourceLineNo">6175</span>  HRegion initHRegion(TableName tableName, String callingMethod,<a name="line.6175"></a>
-<span class="sourceLineNo">6176</span>      byte[]... families) throws IOException {<a name="line.6176"></a>
-<span class="sourceLineNo">6177</span>    return initHRegion(tableName, callingMethod, HBaseConfiguration.create(),<a name="line.6177"></a>
-<span class="sourceLineNo">6178</span>        families);<a name="line.6178"></a>
-<span class="sourceLineNo">6179</span>  }<a name="line.6179"></a>
+<span class="sourceLineNo">6061</span>  @Test<a name="line.6061"></a>
+<span class="sourceLineNo">6062</span>  public void testBatchMutateWithWrongRegionException() throws Exception {<a name="line.6062"></a>
+<span class="sourceLineNo">6063</span>    final byte[] a = Bytes.toBytes("a");<a name="line.6063"></a>
+<span class="sourceLineNo">6064</span>    final byte[] b = Bytes.toBytes("b");<a name="line.6064"></a>
+<span class="sourceLineNo">6065</span>    final byte[] c = Bytes.toBytes("c"); // exclusive<a name="line.6065"></a>
+<span class="sourceLineNo">6066</span><a name="line.6066"></a>
+<span class="sourceLineNo">6067</span>    int prevLockTimeout = CONF.getInt("hbase.rowlock.wait.duration", 30000);<a name="line.6067"></a>
+<span class="sourceLineNo">6068</span>    CONF.setInt("hbase.rowlock.wait.duration", 1000);<a name="line.6068"></a>
+<span class="sourceLineNo">6069</span>    region = initHRegion(tableName, a, c, method, CONF, false, fam1);<a name="line.6069"></a>
+<span class="sourceLineNo">6070</span><a name="line.6070"></a>
+<span class="sourceLineNo">6071</span>    Mutation[] mutations = new Mutation[] {<a name="line.6071"></a>
+<span class="sourceLineNo">6072</span>        new Put(a)<a name="line.6072"></a>
+<span class="sourceLineNo">6073</span>            .add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6073"></a>
+<span class="sourceLineNo">6074</span>              .setRow(a)<a name="line.6074"></a>
+<span class="sourceLineNo">6075</span>              .setFamily(fam1)<a name="line.6075"></a>
+<span class="sourceLineNo">6076</span>              .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6076"></a>
+<span class="sourceLineNo">6077</span>              .setType(Cell.Type.Put)<a name="line.6077"></a>
+<span class="sourceLineNo">6078</span>              .build()),<a name="line.6078"></a>
+<span class="sourceLineNo">6079</span>        // this is outside the region boundary<a name="line.6079"></a>
+<span class="sourceLineNo">6080</span>        new Put(c).add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6080"></a>
+<span class="sourceLineNo">6081</span>              .setRow(c)<a name="line.6081"></a>
+<span class="sourceLineNo">6082</span>              .setFamily(fam1)<a name="line.6082"></a>
+<span class="sourceLineNo">6083</span>              .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6083"></a>
+<span class="sourceLineNo">6084</span>              .setType(Type.Put)<a name="line.6084"></a>
+<span class="sourceLineNo">6085</span>              .build()),<a name="line.6085"></a>
+<span class="sourceLineNo">6086</span>        new Put(b).add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6086"></a>
+<span class="sourceLineNo">6087</span>              .setRow(b)<a name="line.6087"></a>
+<span class="sourceLineNo">6088</span>              .setFamily(fam1)<a name="line.6088"></a>
+<span class="sourceLineNo">6089</span>              .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6089"></a>
+<span class="sourceLineNo">6090</span>              .setType(Cell.Type.Put)<a name="line.6090"></a>
+<span class="sourceLineNo">6091</span>              .build())<a name="line.6091"></a>
+<span class="sourceLineNo">6092</span>    };<a name="line.6092"></a>
+<span class="sourceLineNo">6093</span><a name="line.6093"></a>
+<span class="sourceLineNo">6094</span>    OperationStatus[] status = region.batchMutate(mutations);<a name="line.6094"></a>
+<span class="sourceLineNo">6095</span>    assertEquals(OperationStatusCode.SUCCESS, status[0].getOperationStatusCode());<a name="line.6095"></a>
+<span class="sourceLineNo">6096</span>    assertEquals(OperationStatusCode.SANITY_CHECK_FAILURE, status[1].getOperationStatusCode());<a name="line.6096"></a>
+<span class="sourceLineNo">6097</span>    assertEquals(OperationStatusCode.SUCCESS, status[2].getOperationStatusCode());<a name="line.6097"></a>
+<span class="sourceLineNo">6098</span><a name="line.6098"></a>
+<span class="sourceLineNo">6099</span><a name="line.6099"></a>
+<span class="sourceLineNo">6100</span>    // test with a row lock held for a long time<a name="line.6100"></a>
+<span class="sourceLineNo">6101</span>    final CountDownLatch obtainedRowLock = new CountDownLatch(1);<a name="line.6101"></a>
+<span class="sourceLineNo">6102</span>    ExecutorService exec = Executors.newFixedThreadPool(2);<a name="line.6102"></a>
+<span class="sourceLineNo">6103</span>    Future&lt;Void&gt; f1 = exec.submit(new Callable&lt;Void&gt;() {<a name="line.6103"></a>
+<span class="sourceLineNo">6104</span>      @Override<a name="line.6104"></a>
+<span class="sourceLineNo">6105</span>      public Void call() throws Exception {<a name="line.6105"></a>
+<span class="sourceLineNo">6106</span>        LOG.info("Acquiring row lock");<a name="line.6106"></a>
+<span class="sourceLineNo">6107</span>        RowLock rl = region.getRowLock(b);<a name="line.6107"></a>
+<span class="sourceLineNo">6108</span>        obtainedRowLock.countDown();<a name="line.6108"></a>
+<span class="sourceLineNo">6109</span>        LOG.info("Waiting for 5 seconds before releasing lock");<a name="line.6109"></a>
+<span class="sourceLineNo">6110</span>        Threads.sleep(5000);<a name="line.6110"></a>
+<span class="sourceLineNo">6111</span>        LOG.info("Releasing row lock");<a name="line.6111"></a>
+<span class="sourceLineNo">6112</span>        rl.release();<a name="line.6112"></a>
+<span class="sourceLineNo">6113</span>        return null;<a name="line.6113"></a>
+<span class="sourceLineNo">6114</span>      }<a name="line.6114"></a>
+<span class="sourceLineNo">6115</span>    });<a name="line.6115"></a>
+<span class="sourceLineNo">6116</span>    obtainedRowLock.await(30, TimeUnit.SECONDS);<a name="line.6116"></a>
+<span class="sourceLineNo">6117</span><a name="line.6117"></a>
+<span class="sourceLineNo">6118</span>    Future&lt;Void&gt; f2 = exec.submit(new Callable&lt;Void&gt;() {<a name="line.6118"></a>
+<span class="sourceLineNo">6119</span>      @Override<a name="line.6119"></a>
+<span class="sourceLineNo">6120</span>      public Void call() throws Exception {<a name="line.6120"></a>
+<span class="sourceLineNo">6121</span>        Mutation[] mutations = new Mutation[] {<a name="line.6121"></a>
+<span class="sourceLineNo">6122</span>            new Put(a).add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6122"></a>
+<span class="sourceLineNo">6123</span>                .setRow(a)<a name="line.6123"></a>
+<span class="sourceLineNo">6124</span>                .setFamily(fam1)<a name="line.6124"></a>
+<span class="sourceLineNo">6125</span>                .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6125"></a>
+<span class="sourceLineNo">6126</span>                .setType(Cell.Type.Put)<a name="line.6126"></a>
+<span class="sourceLineNo">6127</span>                .build()),<a name="line.6127"></a>
+<span class="sourceLineNo">6128</span>            new Put(b).add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6128"></a>
+<span class="sourceLineNo">6129</span>                .setRow(b)<a name="line.6129"></a>
+<span class="sourceLineNo">6130</span>                .setFamily(fam1)<a name="line.6130"></a>
+<span class="sourceLineNo">6131</span>                .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6131"></a>
+<span class="sourceLineNo">6132</span>                .setType(Cell.Type.Put)<a name="line.6132"></a>
+<span class="sourceLineNo">6133</span>                .build()),<a name="line.6133"></a>
+<span class="sourceLineNo">6134</span>        };<a name="line.6134"></a>
+<span class="sourceLineNo">6135</span><a name="line.6135"></a>
+<span class="sourceLineNo">6136</span>        // this will wait for the row lock, and it will eventually succeed<a name="line.6136"></a>
+<span class="sourceLineNo">6137</span>        OperationStatus[] status = region.batchMutate(mutations);<a name="line.6137"></a>
+<span class="sourceLineNo">6138</span>        assertEquals(OperationStatusCode.SUCCESS, status[0].getOperationStatusCode());<a name="line.6138"></a>
+<span class="sourceLineNo">6139</span>        assertEquals(OperationStatusCode.SUCCESS, status[1].getOperationStatusCode());<a name="line.6139"></a>
+<span class="sourceLineNo">6140</span>        return null;<a name="line.6140"></a>
+<span class="sourceLineNo">6141</span>      }<a name="line.6141"></a>
+<span class="sourceLineNo">6142</span>    });<a name="line.6142"></a>
+<span class="sourceLineNo">6143</span><a name="line.6143"></a>
+<span class="sourceLineNo">6144</span>    f1.get();<a name="line.6144"></a>
+<span class="sourceLineNo">6145</span>    f2.get();<a name="line.6145"></a>
+<span class="sourceLineNo">6146</span><a name="line.6146"></a>
+<span class="sourceLineNo">6147</span>    CONF.setInt("hbase.rowlock.wait.duration", prevLockTimeout);<a name="line.6147"></a>
+<span class="sourceLineNo">6148</span>  }<a name="line.6148"></a>
+<span class="sourceLineNo">6149</span><a name="line.6149"></a>
+<span class="sourceLineNo">6150</span>  @Test<a name="line.6150"></a>
+<span class="sourceLineNo">6151</span>  public void testCheckAndRowMutateTimestampsAreMonotonic() throws IOException {<a name="line.6151"></a>
+<span class="sourceLineNo">6152</span>    region = initHRegion(tableName, method, CONF, fam1);<a name="line.6152"></a>
+<span class="sourceLineNo">6153</span>    ManualEnvironmentEdge edge = new ManualEnvironmentEdge();<a name="line.6153"></a>
+<span class="sourceLineNo">6154</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.6154"></a>
+<span class="sourceLineNo">6155</span><a name="line.6155"></a>
+<span class="sourceLineNo">6156</span>    edge.setValue(10);<a name="line.6156"></a>
+<span class="sourceLineNo">6157</span>    Put p = new Put(row);<a name="line.6157"></a>
+<span class="sourceLineNo">6158</span>    p.setDurability(Durability.SKIP_WAL);<a name="line.6158"></a>
+<span class="sourceLineNo">6159</span>    p.addColumn(fam1, qual1, qual1);<a name="line.6159"></a>
+<span class="sourceLineNo">6160</span>    region.put(p);<a name="line.6160"></a>
+<span class="sourceLineNo">6161</span><a name="line.6161"></a>
+<span class="sourceLineNo">6162</span>    Result result = region.get(new Get(row));<a name="line.6162"></a>
+<span class="sourceLineNo">6163</span>    Cell c = result.getColumnLatestCell(fam1, qual1);<a name="line.6163"></a>
+<span class="sourceLineNo">6164</span>    assertNotNull(c);<a name="line.6164"></a>
+<span class="sourceLineNo">6165</span>    assertEquals(10L, c.getTimestamp());<a name="line.6165"></a>
+<span class="sourceLineNo">6166</span><a name="line.6166"></a>
+<span class="sourceLineNo">6167</span>    edge.setValue(1); // clock goes back<a name="line.6167"></a>
+<span class="sourceLineNo">6168</span>    p = new Put(row);<a name="line.6168"></a>
+<span class="sourceLineNo">6169</span>    p.setDurability(Durability.SKIP_WAL);<a name="line.6169"></a>
+<span class="sourceLineNo">6170</span>    p.addColumn(fam1, qual1, qual2);<a name="line.6170"></a>
+<span class="sourceLineNo">6171</span>    RowMutations rm = new RowMutations(row);<a name="line.6171"></a>
+<span class="sourceLineNo">6172</span>    rm.add(p);<a name="line.6172"></a>
+<span class="sourceLineNo">6173</span>    assertTrue(region.checkAndRowMutate(row, fam1, qual1, CompareOperator.EQUAL,<a name="line.6173"></a>
+<span class="sourceLineNo">6174</span>        new BinaryComparator(qual1), rm));<a name="line.6174"></a>
+<span class="sourceLineNo">6175</span>    result = region.get(new Get(row));<a name="line.6175"></a>
+<span class="sourceLineNo">6176</span>    c = result.getColumnLatestCell(fam1, qual1);<a name="line.6176"></a>
+<span class="sourceLineNo">6177</span>    assertEquals(10L, c.getTimestamp());<a name="line.6177"></a>
+<span class="sourceLineNo">6178</span>    LOG.info("c value " +<a name="line.6178"></a>
+<span class="sourceLineNo">6179</span>      Bytes.toStringBinary(c.getValueArray(), c.getValueOffset(), c.getValueLength()));<a name="line.6179"></a>
 <span class="sourceLineNo">6180</span><a name="line.6180"></a>
-<span class="sourceLineNo">6181</span>  /**<a name="line.6181"></a>
-<span class="sourceLineNo">6182</span>   * HBASE-16429 Make sure no stuck if roll writer when ring buffer is filled with appends<a name="line.6182"></a>
-<span class="sourceLineNo">6183</span>   * @throws IOException if IO error occurred during test<a name="line.6183"></a>
-<span class="sourceLineNo">6184</span>   */<a name="line.6184"></a>
-<span class="sourceLineNo">6185</span>  @Test<a name="line.6185"></a>
-<span class="sourceLineNo">6186</span>  public void testWritesWhileRollWriter() throws IOException {<a name="line.6186"></a>
-<span class="sourceLineNo">6187</span>    int testCount = 10;<a name="line.6187"></a>
-<span class="sourceLineNo">6188</span>    int numRows = 1024;<a name="line.6188"></a>
-<span class="sourceLineNo">6189</span>    int numFamilies = 2;<a name="line.6189"></a>
-<span class="sourceLineNo">6190</span>    int numQualifiers = 2;<a name="line.6190"></a>
-<span class="sourceLineNo">6191</span>    final byte[][] families = new byte[numFamilies][];<a name="line.6191"></a>
-<span class="sourceLineNo">6192</span>    for (int i = 0; i &lt; numFamilies; i++) {<a name="line.6192"></a>
-<span class="sourceLineNo">6193</span>      families[i] = Bytes.toBytes("family" + i);<a name="line.6193"></a>
-<span class="sourceLineNo">6194</span>    }<a name="line.6194"></a>
-<span class="sourceLineNo">6195</span>    final byte[][] qualifiers = new byte[numQualifiers][];<a name="line.6195"></a>
-<span class="sourceLineNo">6196</span>    for (int i = 0; i &lt; numQualifiers; i++) {<a name="line.6196"></a>
-<span class="sourceLineNo">6197</span>      qualifiers[i] = Bytes.toBytes("qual" + i);<a name="line.6197"></a>
-<span class="sourceLineNo">6198</span>    }<a name="line.6198"></a>
-<span class="sourceLineNo">6199</span><a name="line.6199"></a>
-<span class="sourceLineNo">6200</span>    CONF.setInt("hbase.regionserver.wal.disruptor.event.count", 2);<a name="line.6200"></a>
-<span class="sourceLineNo">6201</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.6201"></a>
-<span class="sourceLineNo">6202</span>    try {<a name="line.6202"></a>
-<span class="sourceLineNo">6203</span>      List&lt;Thread&gt; threads = new ArrayList&lt;&gt;();<a name="line.6203"></a>
-<span class="sourceLineNo">6204</span>      for (int i = 0; i &lt; numRows; i++) {<a name="line.6204"></a>
-<span class="sourceLineNo">6205</span>        final int count = i;<a name="line.6205"></a>
-<span class="sourceLineNo">6206</span>        Thread t = new Thread(new Runnable() {<a name="line.6206"></a>
-<span class="sourceLineNo">6207</span><a name="line.6207"></a>
-<span class="sourceLineNo">6208</span>          @Override<a name="line.6208"></a>
-<span class="sourceLineNo">6209</span>          public void run() {<a name="line.6209"></a>
-<span class="sourceLineNo">6210</span>            byte[] row = Bytes.toBytes("row" + count);<a name="line.6210"></a>
-<span class="sourceLineNo">6211</span>            Put put = new Put(row);<a name="line.6211"></a>
-<span class="sourceLineNo">6212</span>            put.setDurability(Durability.SYNC_WAL);<a name="line.6212"></a>
-<span class="sourceLineNo">6213</span>            byte[] value = Bytes.toBytes(String.valueOf(count));<a name="line.6213"></a>
-<span class="sourceLineNo">6214</span>            for (byte[] family : families) {<a name="line.6214"></a>
-<span class="sourceLineNo">6215</span>              for (byte[] qualifier : qualifiers) {<a name="line.6215"></a>
-<span class="sourceLineNo">6216</span>                put.addColumn(family, qualifier, count, value);<a name="line.6216"></a>
-<span class="sourceLineNo">6217</span>              }<a name="line.6217"></a>
-<span class="sourceLineNo">6218</span>            }<a name="line.6218"></a>
-<span class="sourceLineNo">6219</span>            try {<a name="line.6219"></a>
-<span class="sourceLineNo">6220</span>              region.put(put);<a name="line.6220"></a>
-<span class="sourceLineNo">6221</span>            } catch (IOException e) {<a name="line.6221"></a>
-<span class="sourceLineNo">6222</span>              throw new RuntimeException(e);<a name="line.6222"></a>
-<span class="sourceLineNo">6223</span>            }<a name="line.6223"></a>
-<span class="sourceLineNo">6224</span>          }<a name="line.6224"></a>
-<span class="sourceLineNo">6225</span>        });<a name="line.6225"></a>
-<span class="sourceLineNo">6226</span>        threads.add(t);<a name="line.6226"></a>
-<span class="sourceLineNo">6227</span>      }<a name="line.6227"></a>
-<span class="sourceLineNo">6228</span>      for (Thread t : threads) {<a name="line.6228"></a>
-<span class="sourceLineNo">6229</span>        t.start();<a name="line.6229"></a>
-<span class="sourceLineNo">6230</span>      }<a name="line.6230"></a>
-<span class="sourceLineNo">6231</span><a name="line.6231"></a>
-<span class="sourceLineNo">6232</span>      for (int i = 0; i &lt; testCount; i++) {<a name="line.6232"></a>
-<span class="sourceLineNo">6233</span>        region.getWAL().rollWriter();<a name="line.6233"></a>
-<span class="sourceLineNo">6234</span>        Thread.yield();<a name="line.6234"></a>
-<span class="sourceLineNo">6235</span>      }<a name="line.6235"></a>
-<span class="sourceLineNo">6236</span>    } finally {<a name="line.6236"></a>
-<span class="sourceLineNo">6237</span>      try {<a name="line.6237"></a>
-<span class="sourceLineNo">6238</span>        HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.6238"></a>
-<span class="sourceLineNo">6239</span>        CONF.setInt("hbase.regionserver.wal.disruptor.event.count", 16 * 1024);<a name="line.6239"></a>
-<span class="sourceLineNo">6240</span>      } catch (DroppedSnapshotException dse) {<a name="line.6240"></a>
-<span class="sourceLineNo">6241</span>        // We could get this on way out because we interrupt the background flusher and it could<a name="line.6241"></a>
-<span class="sourceLineNo">6242</span>        // fail anywhere causing a DSE over in the background flusher... only it is not properly<a name="line.6242"></a>
-<span class="sourceLineNo">6243</span>        // dealt with so could still be memory hanging out when we get to here -- memory we can't<a name="line.6243"></a>
-<span class="sourceLineNo">6244</span>        // flush because the accounting is 'off' since original DSE.<a name="line.6244"></a>
+<span class="sourceLineNo">6181</span>    assertTrue(Bytes.equals(c.getValueArray(), c.getValueOffset(), c.getValueLength(),<a name="line.6181"></a>
+<span class="sourceLineNo">6182</span>      qual2, 0, qual2.length));<a name="line.6182"></a>
+<span class="sourceLineNo">6183</span>  }<a name="line.6183"></a>
+<span class="sourceLineNo">6184</span><a name="line.6184"></a>
+<span class="sourceLineNo">6185</span>  HRegion initHRegion(TableName tableName, String callingMethod,<a name="line.6185"></a>
+<span class="sourceLineNo">6186</span>      byte[]... families) throws IOException {<a name="line.6186"></a>
+<span class="sourceLineNo">6187</span>    return initHRegion(tableName, callingMethod, HBaseConfiguration.create(),<a name="line.6187"></a>
+<span class="sourceLineNo">6188</span>        families);<a name="line.6188"></a>
+<span class="sourceLineNo">6189</span>  }<a name="line.6189"></a>
+<span class="sourceLineNo">6190</span><a name="line.6190"></a>
+<span class="sourceLineNo">6191</span>  /**<a name="line.6191"></a>
+<span class="sourceLineNo">6192</span>   * HBASE-16429 Make sure no stuck if roll writer when ring buffer is filled with appends<a name="line.6192"></a>
+<span class="sourceLineNo">6193</span>   * @throws IOException if IO error occurred during test<a name="line.6193"></a>
+<span class="sourceLineNo">6194</span>   */<a name="line.6194"></a>
+<span class="sourceLineNo">6195</span>  @Test<a name="line.6195"></a>
+<span class="sourceLineNo">6196</span>  public void testWritesWhileRollWriter() throws IOException {<a name="line.6196"></a>
+<span class="sourceLineNo">6197</span>    int testCount = 10;<a name="line.6197"></a>
+<span class="sourceLineNo">6198</span>    int numRows = 1024;<a name="line.6198"></a>
+<span class="sourceLineNo">6199</span>    int numFamilies = 2;<a name="line.6199"></a>
+<span class="sourceLineNo">6200</span>    int numQualifiers = 2;<a name="line.6200"></a>
+<span class="sourceLineNo">6201</span>    final byte[][] families = new byte[numFamilies][];<a name="line.6201"></a>
+<span class="sourceLineNo">6202</span>    for (int i = 0; i &lt; numFamilies; i++) {<a name="line.6202"></a>
+<span class="sourceLineNo">6203</span>      families[i] = Bytes.toBytes("family" + i);<a name="line.6203"></a>
+<span class="sourceLineNo">6204</span>    }<a name="line.6204"></a>
+<span class="sourceLineNo">6205</span>    final byte[][] qualifiers = new byte[numQualifiers][];<a name="line.6205"></a>
+<span class="sourceLineNo">6206</span>    for (int i = 0; i &lt; numQualifiers; i++) {<a name="line.6206"></a>
+<span class="sourceLineNo">6207</span>      qualifiers[i] = Bytes.toBytes("qual" + i);<a name="line.6207"></a>
+<span class="sourceLineNo">6208</span>    }<a name="line.6208"></a>
+<span class="sourceLineNo">6209</span><a name="line.6209"></a>
+<span class="sourceLineNo">6210</span>    CONF.setInt("hbase.regionserver.wal.disruptor.event.count", 2);<a name="line.6210"></a>
+<span class="sourceLineNo">6211</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.6211"></a>
+<span class="sourceLineNo">6212</span>    try {<a name="line.6212"></a>
+<span class="sourceLineNo">6213</span>      List&lt;Thread&gt; threads = new ArrayList&lt;&gt;();<a name="line.6213"></a>
+<span class="sourceLineNo">6214</span>      for (int i = 0; i &lt; numRows; i++) {<a name="line.6214"></a>
+<span class="sourceLineNo">6215</span>        final int count = i;<a name="line.6215"></a>
+<span class="sourceLineNo">6216</span>        Thread t = new Thread(new Runnable() {<a name="line.6216"></a>
+<span class="sourceLineNo">6217</span><a name="line.6217"></a>
+<span class="sourceLineNo">6218</span>          @Override<a name="line.6218"></a>
+<span class="sourceLineNo">6219</span>          public void run() {<a name="line.6219"></a>
+<span class="sourceLineNo">6220</span>            byte[] row = Bytes.toBytes("row" + count);<a name="line.6220"></a>
+<span class="sourceLineNo">6221</span>            Put put = new Put(row);<a name="line.6221"></a>
+<span class="sourceLineNo">6222</span>            put.setDurability(Durability.SYNC_WAL);<a name="line.6222"></a>
+<span class="sourceLineNo">6223</span>            byte[] value = Bytes.toBytes(String.valueOf(count));<a name="line.6223"></a>
+<span class="sourceLineNo">6224</span>            for (byte[] family : families) {<a name="line.6224"></a>
+<span class="sourceLineNo">6225</span>              for (byte[] qualifier : qualifiers) {<a name="line.6225"></a>
+<span class="sourceLineNo">6226</span>                put.addColumn(family, qualifier, count, value);<a name="line.6226"></a>
+<span class="sourceLineNo">6227</span>              }<a name="line.6227"></a>
+<span class="sourceLineNo">6228</span>            }<a name="line.6228"></a>
+<span class="sourceLineNo">6229</span>            try {<a name="line.6229"></a>
+<span class="sourceLineNo">6230</span>              region.put(put);<a name="line.6230"></a>
+<span class="sourceLineNo">6231</span>            } catch (IOException e) {<a name="line.6231"></a>
+<span class="sourceLineNo">6232</span>              throw new RuntimeException(e);<a name="line.6232"></a>
+<span class="sourceLineNo">6233</span>            }<a name="line.6233"></a>
+<span class="sourceLineNo">6234</span>          }<a name="line.6234"></a>
+<span class="sourceLineNo">6235</span>        });<a name="line.6235"></a>
+<span class="sourceLineNo">6236</span>        threads.add(t);<a name="line.6236"></a>
+<span class="sourceLineNo">6237</span>      }<a name="line.6237"></a>
+<span class="sourceLineNo">6238</span>      for (Thread t : threads) {<a name="line.6238"></a>
+<span class="sourceLineNo">6239</span>        t.start();<a name="line.6239"></a>
+<span class="sourceLineNo">6240</span>      }<a name="line.6240"></a>
+<span class="sourceLineNo">6241</span><a name="line.6241"></a>
+<span class="sourceLineNo">6242</span>      for (int i = 0; i &lt; testCount; i++) {<a name="line.6242"></a>
+<span class="sourceLineNo">6243</span>        region.getWAL().rollWriter();<a name="line.6243"></a>
+<span class="sourceLineNo">6244</span>        Thread.yield();<a name="line.6244"></a>
 <span class="sourceLineNo">6245</span>      }<a name="line.6245"></a>
-<span class="sourceLineNo">6246</span>      this.region = null;<a name="line.6246"></a>
-<span class="sourceLineNo">6247</span>    }<a name="line.6247"></a>
-<span class="sourceLineNo">6248</span>  }<a name="line.6248"></a>
-<span class="sourceLineNo">6249</span><a name="line.6249"></a>
-<span class="sourceLineNo">6250</span>  @Test<a name="line.6250"></a>
-<span class="sourceLineNo">6251</span>  public void testMutateRow_WriteRequestCount() throws Exception {<a name="line.6251"></a>
-<span class="sourceLineNo">6252</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.6252"></a>
-<span class="sourceLineNo">6253</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.6253"></a>
-<span class="sourceLineNo">6254</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.6254"></a>
-<span class="sourceLineNo">6255</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.6255"></a>
-<span class="sourceLineNo">6256</span><a name="line.6256"></a>
-<span class="sourceLineNo">6257</span>    RowMutations rm = new RowMutations(row1);<a name="line.6257"></a>
-<span class="sourceLineNo">6258</span>    Put put = new Put(row1);<a name="line.6258"></a>
-<span class="sourceLineNo">6259</span>    put.addColumn(fam1, qf1, val1);<a name="line.6259"></a>
-<span class="sourceLineNo">6260</span>    rm.add(put);<a name="line.6260"></a>
-<span class="sourceLineNo">6261</span><a name="line.6261"></a>
-<span class="sourceLineNo">6262</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.6262"></a>
-<span class="sourceLineNo">6263</span>    long wrcBeforeMutate = this.region.writeRequestsCount.longValue();<a name="line.6263"></a>
-<span class="sourceLineNo">6264</span>    this.region.mutateRow(rm);<a name="line.6264"></a>
-<span class="sourceLineNo">6265</span>    long wrcAfterMutate = this.region.writeRequestsCount.longValue();<a name="line.6265"></a>
-<span class="sourceLineNo">6266</span>    Assert.assertEquals(wrcBeforeMutate + rm.getMutations().size(), wrcAfterMutate);<a name="line.6266"></a>
-<span class="sourceLineNo">6267</span>  }<a name="line.6267"></a>
-<span class="sourceLineNo">6268</span><a name="line.6268"></a>
-<span class="sourceLineNo">6269</span>  @Test<a name="line.6269"></a>
-<span class="sourceLineNo">6270</span>  public void testBulkLoadReplicationEnabled() throws IOException {<a name="line.6270"></a>
-<span class="sourceLineNo">6271</span>    TEST_UTIL.getConfiguration().setBoolean(HConstants.REPLICATION_BULKLOAD_ENABLE_KEY, true);<a name="line.6271"></a>
-<span class="sourceLineNo">6272</span>    final ServerName serverName = ServerName.valueOf(name.getMethodName(), 100, 42);<a name="line.6272"></a>
-<span class="sourceLineNo">6273</span>    final RegionServerServices rss = spy(TEST_UTIL.createMockRegionServerService(serverName));<a name="line.6273"></a>
-<span class="sourceLineNo">6274</span><a name="line.6274"></a>
-<span class="sourceLineNo">6275</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.6275"></a>
-<span class="sourceLineNo">6276</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.6276"></a>
-<span class="sourceLineNo">6277</span>    HRegionInfo hri = new HRegionInfo(htd.getTableName(),<a name="line.6277"></a>
-<span class="sourceLineNo">6278</span>        HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY);<a name="line.6278"></a>
-<span class="sourceLineNo">6279</span>    region = HRegion.openHRegion(hri, htd, rss.getWAL(hri), TEST_UTIL.getConfiguration(),<a name="line.6279"></a>
-<span class="sourceLineNo">6280</span>        rss, null);<a name="line.6280"></a>
-<span class="sourceLineNo">6281</span><a name="line.6281"></a>
-<span class="sourceLineNo">6282</span>    assertTrue(region.conf.getBoolean(HConstants.REPLICATION_BULKLOAD_ENABLE_KEY, false));<a name="line.6282"></a>
-<span class="sourceLineNo">6283</span>    String plugins = region.conf.get(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY, "");<a name="line.6283"></a>
-<span class="sourceLineNo">6284</span>    String replicationCoprocessorClass = ReplicationObserver.class.getCanonicalName();<a name="line.6284"></a>
-<span class="sourceLineNo">6285</span>    assertTrue(plugins.contains(replicationCoprocessorClass));<a name="line.6285"></a>
-<span class="sourceLineNo">6286</span>    assertTrue(region.getCoprocessorHost().<a name="line.6286"></a>
-<span class="sourceLineNo">6287</span>        getCoprocessors().contains(ReplicationObserver.class.getSimpleName()));<a name="line.6287"></a>
-<span class="sourceLineNo">6288</span>  }<a name="line.6288"></a>
-<span class="sourceLineNo">6289</span><a name="line.6289"></a>
-<span class="sourceLineNo">6290</span>  // make sure region is success close when coprocessor wrong region open failed<a name="line.6290"></a>
-<span class="sourceLineNo">6291</span>  @Test<a name="line.6291"></a>
-<span class="sourceLineNo">6292</span>  public void testOpenRegionFailedMemoryLeak() throws Exception {<a name="line.6292"></a>
-<span class="sourceLineNo">6293</span>    final ServerName serverName = ServerName.valueOf("testOpenRegionFailed", 100, 42);<a name="line.6293"></a>
-<span class="sourceLineNo">6294</span>    final RegionServerServices rss = spy(TEST_UTIL.createMockRegionServerService(serverName));<a name="line.6294"></a>
-<span class="sourceLineNo">6295</span><a name="line.6295"></a>
-<span class="sourceLineNo">6296</span>    HTableDescriptor htd<a name="line.6296"></a>
-<span class="sourceLineNo">6297</span>      = new HTableDescriptor(TableName.valueOf("testOpenRegionFailed"));<a name="line.6297"></a>
-<span class="sourceLineNo">6298</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.6298"></a>
-<span class="sourceLineNo">6299</span>    htd.setValue("COPROCESSOR$1", "hdfs://test/test.jar|test||");<a name="line.6299"></a>
-<span class="sourceLineNo">6300</span><a name="line.6300"></a>
-<span class="sourceLineNo">6301</span>    HRegionInfo hri = new HRegionInfo(htd.getTableName(),<a name="line.6301"></a>
-<span class="sourceLineNo">6302</span>      HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY);<a name="line.6302"></a>
-<span class="sourceLineNo">6303</span>    ScheduledExecutorService executor = CompatibilitySingletonFactory.<a name="line.6303"></a>
-<span class="sourceLineNo">6304</span>      getInstance(MetricsExecutor.class).getExecutor();<a name="line.6304"></a>
-<span class="sourceLineNo">6305</span>    for (int i = 0; i &lt; 20 ; i++) {<a name="line.6305"></a>
-<span class="sourceLineNo">6306</span>      try {<a name="line.6306"></a>
-<span class="sourceLineNo">6307</span>        HRegion.openHRegion(hri, htd, rss.getWAL(hri),<a name="line.6307"></a>
-<span class="sourceLineNo">6308</span>          TEST_UTIL.getConfiguration(), rss, null);<a name="line.6308"></a>
-<span class="sourceLineNo">6309</span>      }catch(Throwable t){<a name="line.6309"></a>
-<span class="sourceLineNo">6310</span>        LOG.info("Expected exception, continue");<a name="line.6310"></a>
-<span class="sourceLineNo">6311</span>      }<a name="line.6311"></a>
-<span class="sourceLineNo">6312</span>    }<a name="line.6312"></a>
-<span class="sourceLineNo">6313</span>    TimeUnit.SECONDS.sleep(MetricsRegionWrapperImpl.PERIOD);<a name="line.6313"></a>
-<span class="sourceLineNo">6314</span>    Field[] fields = ThreadPoolExecutor.class.getDeclaredFields();<a name="line.6314"></a>
-<span class="sourceLineNo">6315</span>    boolean found = false;<a name="line.6315"></a>
-<span class="sourceLineNo">6316</span>    for(Field field : fields){<a name="line.6316"></a>
-<span class="sourceLineNo">6317</span>      if(field.getName().equals("workQueue")){<a name="line.6317"></a>
-<span class="sourceLineNo">6318</span>        field.setAccessible(true);<a name="line.6318"></a>
-<span class="sourceLineNo">6319</span>        BlockingQueue&lt;Runnable&gt; workQueue = (BlockingQueue&lt;Runnable&gt;)field.get(executor);<a name="line.6319"></a>
-<span class="sourceLineNo">6320</span>        //there are still two task not cancel, can not cause to memory lack<a name="line.6320"></a>
-<span class="sourceLineNo">6321</span>        Assert.assertTrue("ScheduledExecutor#workQueue should equals 2, now is " +<a name="line.6321"></a>
-<span class="sourceLineNo">6322</span>          workQueue.size() + ", please check region is close", 2 == workQueue.size());<a name="line.6322"></a>
-<span class="sourceLineNo">6323</span>        found = true;<a name="line.6323"></a>
-<span class="sourceLineNo">6324</span>      }<a name="line.6324"></a>
-<span class="sourceLineNo">6325</span>    }<a name="line.6325"></a>
-<span class="sourceLineNo">6326</span>    Assert.assertTrue("can not find workQueue, test failed", found);<a name="line.6326"></a>
-<span class="sourceLineNo">6327</span>  }<a name="line.6327"></a>
-<span class="sourceLineNo">6328</span><a name="line.6328"></a>
-<span class="sourceLineNo">6329</span>  /**<a name="line.6329"></a>
-<span class="sourceLineNo">6330</span>   * The same as HRegion class, the only difference is that instantiateHStore will<a name="line.6330"></a>
-<span class="sourceLineNo">6331</span>   * create a different HStore - HStoreForTesting. [HBASE-8518]<a name="line.6331"></a>
-<span class="sourceLineNo">6332</span>   */<a name="line.6332"></a>
-<span class="sourceLineNo">6333</span>  public static class HRegionForTesting extends HRegion {<a name="line.6333"></a>
-<span class="sourceLineNo">6334</span><a name="line.6334"></a>
-<span class="sourceLineNo">6335</span>    public HRegionForTesting(final Path tableDir, final WAL wal, final FileSystem fs,<a name="line.6335"></a>
-<span class="sourceLineNo">6336</span>                             final Configuration confParam, final RegionInfo regionInfo,<a name="line.6336"></a>
-<span class="sourceLineNo">6337</span>                             final TableDescriptor htd, final RegionServerServices rsServices) {<a name="line.6337"></a>
-<span class="sourceLineNo">6338</span>      this(new HRegionFileSystem(confParam, fs, tableDir, regionInfo),<a name="line.6338"></a>
-<span class="sourceLineNo">6339</span>          wal, confParam, htd, rsServices);<a name="line.6339"></a>
-<span class="sourceLineNo">6340</span>    }<a name="line.6340"></a>
-<span class="sourceLineNo">6341</span><a name="line.6341"></a>
-<span class="sourceLineNo">6342</span>    public HRegionForTesting(HRegionFileSystem fs, WAL wal,<a name="line.6342"></a>
-<span class="sourceLineNo">6343</span>                             Configuration confParam, TableDescriptor htd,<a name="line.6343"></a>
-<span class="sourceLineNo">6344</span>                             RegionServerServices rsServices) {<a name="line.6344"></a>
-<span class="sourceLineNo">6345</span>      super(fs, wal, confParam, htd, rsServices);<a name="line.6345"></a>
-<span class="sourceLineNo">6346</span>    }<a name="line.6346"></a>
-<span class="sourceLineNo">6347</span><a name="line.6347"></a>
-<span class="sourceLineNo">6348</span>    /**<a name="line.6348"></a>
-<span class="sourceLineNo">6349</span>     * Create HStore instance.<a name="line.6349"></a>
-<span class="sourceLineNo">6350</span>     * @return If Mob is enabled, return HMobStore, otherwise return HStoreForTesting.<a name="line.6350"></a>
-<span class="sourceLineNo">6351</span>     */<a name="line.6351"></a>
-<span class="sourceLineNo">6352</span>    @Override<a name="line.6352"></a>
-<span class="sourceLineNo">6353</span>    protected HStore instantiateHStore(final ColumnFamilyDescriptor family, boolean warmup)<a name="line.6353"></a>
-<span class="sourceLineNo">6354</span>        throws IOException {<a name="line.6354"></a>
-<span class="sourceLineNo">6355</span>      if (family.isMobEnabled()) {<a name="line.6355"></a>
-<span class="sourceLineNo">6356</span>        if (HFile.getFormatVersion(this.conf) &lt; HFile.MIN_FORMAT_VERSION_WITH_TAGS) {<a name="line.6356"></a>
-<span class="sourceLineNo">6357</span>          throw new IOException("A minimum HFile version of " + HFile.MIN_FORMAT_VERSION_WITH_TAGS +<a name="line.6357"></a>
-<span class="sourceLineNo">6358</span>              " is required for MOB feature. Consider setting " + HFile.FORMAT_VERSION_KEY +<a name="line.6358"></a>
-<span class="sourceLineNo">6359</span>              " accordingly.");<a name="line.6359"></a>
-<span class="sourceLineNo">6360</span>        }<a name="line.6360"></a>
-<span class="sourceLineNo">6361</span>        return new HMobStore(this, family, this.conf, warmup);<a name="line.6361"></a>
-<span class="sourceLineNo">6362</span>      }<a name="line.6362"></a>
-<span class="sourceLineNo">6363</span>      return new HStoreForTesting(this, family, this.conf, warmup);<a name="line.6363"></a>
-<span class="sourceLineNo">6364</span>    }<a name="line.6364"></a>
-<span class="sourceLineNo">6365</span>  }<a name="line.6365"></a>
-<span class="sourceLineNo">6366</span><a name="line.6366"></a>
-<span class="sourceLineNo">6367</span>  /**<a name="line.6367"></a>
-<span class="sourceLineNo">6368</span>   * HStoreForTesting is merely the same as HStore, the difference is in the doCompaction method<a name="line.6368"></a>
-<span class="sourceLineNo">6369</span>   * of HStoreForTesting there is a checkpoint "hbase.hstore.compaction.complete" which<a name="line.6369"></a>
-<span class="sourceLineNo">6370</span>   * doesn't let hstore compaction complete. In the former edition, this config is set in<a name="line.6370"></a>
-<span class="sourceLineNo">6371</span>   * HStore class inside compact method, though this is just for testing, otherwise it<a name="line.6371"></a>
-<span class="sourceLineNo">6372</span>   * doesn't do any help. In HBASE-8518, we try to get rid of all "hbase.hstore.compaction.complete"<a name="line.6372"></a>
-<span class="sourceLineNo">6373</span>   * config (except for testing code).<a name="line.6373"></a>
-<span class="sourceLineNo">6374</span>   */<a name="line.6374"></a>
-<span class="sourceLineNo">6375</span>  public static class HStoreForTesting extends HStore {<a name="line.6375"></a>
+<span class="sourceLineNo">6246</span>    } finally {<a name="line.6246"></a>
+<span class="sourceLineNo">6247</span>      try {<a name="line.6247"></a>
+<span class="sourceLineNo">6248</span>        HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.6248"></a>
+<span class="sourceLineNo">6249</span>        CONF.setInt("hbase.regionserver.wal.disruptor.event.count", 16 * 1024);<a name="line.6249"></a>
+<span class="sourceLineNo">6250</span>      } catch (DroppedSnapshotException dse) {<a name="line.6250"></a>
+<span class="sourceLineNo">6251</span>        // We could get this on way out because we interrupt the background flusher and it could<a name="line.6251"></a>
+<span class="sourceLineNo">6252</span>        // fail anywhere causing a DSE over in the background flusher... only it is not properly<a name="line.6252"></a>
+<span class="sourceLineNo">6253</span>        // dealt with so could still be memory hanging out when we get to here -- memory we can't<a name="line.6253"></a>
+<span class="sourceLineNo">6254</span>        // flush because the accounting is 'off' since original DSE.<a name="line.6254"></a>
+<span class="sourceLineNo">6255</span>      }<a name="line.6255"></a>
+<span class="sourceLineNo">6256</span>      this.region = null;<a name="line.6256"></a>
+<span class="sourceLineNo">6257</span>    }<a name="line.6257"></a>
+<span class="sourceLineNo">6258</span>  }<a name="line.6258"></a>
+<span class="sourceLineNo">6259</span><a name="line.6259"></a>
+<span class="sourceLineNo">6260</span>  @Test<a name="line.6260"></a>
+<span class="sourceLineNo">6261</span>  public void testMutateRow_WriteRequestCount() throws Exception {<a name="line.6261"></a>
+<span class="sourceLineNo">6262</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.6262"></a>
+<span class="sourceLineNo">6263</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.6263"></a>
+<span class="sourceLineNo">6264</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.6264"></a>
+<span class="sourceLineNo">6265</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.6265"></a>
+<span class="sourceLineNo">6266</span><a name="line.6266"></a>
+<span class="sourceLineNo">6267</span>    RowMutations rm = new RowMutations(row1);<a name="line.6267"></a>
+<span class="sourceLineNo">6268</span>    Put put = new Put(row1);<a name="line.6268"></a>
+<span class="sourceLineNo">6269</span>    put.addColumn(fam1, qf1, val1);<a name="line.6269"></a>
+<span class="sourceLineNo">6270</span>    rm.add(put);<a name="line.6270"></a>
+<span class="sourceLineNo">6271</span><a name="line.6271"></a>
+<span class="sourceLineNo">6272</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.6272"></a>
+<span class="sourceLineNo">6273</span>    long wrcBeforeMutate = this.region.writeRequestsCount.longValue();<a name="line.6273"></a>
+<span class="sourceLineNo">6274</span>    this.region.mutateRow(rm);<a name="line.6274"></a>
+<span class="sourceLineNo">6275</span>    long wrcAfterMutate = this.region.writeRequestsCount.longValue();<a name="line.6275"></a>
+<span class="sourceLineNo">6276</span>    Assert.assertEquals(wrcBeforeMutate + rm.getMutations().size(), wrcAfterMutate);<a name="line.6276"></a>
+<span class="sourceLineNo">6277</span>  }<a name="line.6277"></a>
+<span class="sourceLineNo">6278</span><a name="line.6278"></a>
+<span class="sourceLineNo">6279</span>  @Test<a name="line.6279"></a>
+<span class="sourceLineNo">6280</span>  public void testBulkLoadReplicationEnabled() throws IOException {<a name="line.6280"></a>
+<span class="sourceLineNo">6281</span>    TEST_UTIL.getConfiguration().setBoolean(HConstants.REPLICATION_BULKLOAD_ENABLE_KEY, true);<a name="line.6281"></a>
+<span class="sourceLineNo">6282</span>    final ServerName serverName = ServerName.valueOf(name.getMethodName(), 100, 42);<a name="line.6282"></a>
+<span class="sourceLineNo">6283</span>    final RegionServerServices rss = spy(TEST_UTIL.createMockRegionServerService(serverName));<a name="line.6283"></a>
+<span class="sourceLineNo">6284</span><a name="line.6284"></a>
+<span class="sourceLineNo">6285</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.6285"></a>
+<span class="sourceLineNo">6286</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.6286"></a>
+<span class="sourceLineNo">6287</span>    HRegionInfo hri = new HRegionInfo(htd.getTableName(),<a name="line.6287"></a>
+<span class="sourceLineNo">6288</span>        HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY);<a name="line.6288"></a>
+<span class="sourceLineNo">6289</span>    region = HRegion.openHRegion(hri, htd, rss.getWAL(hri), TEST_UTIL.getConfiguration(),<a name="line.6289"></a>
+<span class="sourceLineNo">6290</span>        rss, null);<a name="line.6290"></a>
+<span class="sourceLineNo">6291</span><a name="line.6291"></a>
+<span class="sourceLineNo">6292</span>    assertTrue(region.conf.getBoolean(HConstants.REPLICATION_BULKLOAD_ENABLE_KEY, false));<a name="line.6292"></a>
+<span class="sourceLineNo">6293</span>    String plugins = region.conf.get(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY, "");<a name="line.6293"></a>
+<span class="sourceLineNo">6294</span>    String replicationCoprocessorClass = ReplicationObserver.class.getCanonicalName();<a name="line.6294"></a>
+<span class="sourceLineNo">6295</span>    assertTrue(plugins.contains(replicationCoprocessorClass));<a name="line.6295"></a>
+<span class="sourceLineNo">6296</span>    assertTrue(region.getCoprocessorHost().<a name="line.6296"></a>
+<span class="sourceLineNo">6297</span>        getCoprocessors().contains(ReplicationObserver.class.getSimpleName()));<a name="line.6297"></a>
+<span class="sourceLineNo">6298</span>  }<a name="line.6298"></a>
+<span class="sourceLineNo">6299</span><a name="line.6299"></a>
+<span class="sourceLineNo">6300</span>  // make sure region is success close when coprocessor wrong region open failed<a name="line.6300"></a>
+<span class="sourceLineNo">6301</span>  @Test<a name="line.6301"></a>
+<span class="sourceLineNo">6302</span>  public void testOpenRegionFailedMemoryLeak() throws Exception {<a name="line.6302"></a>
+<span class="sourceLineNo">6303</span>    final ServerName serverName = ServerName.valueOf("testOpenRegionFailed", 100, 42);<a name="line.6303"></a>
+<span class="sourceLineNo">6304</span>    final RegionServerServices rss = spy(TEST_UTIL.createMockRegionServerService(serverName));<a name="line.6304"></a>
+<span class="sourceLineNo">6305</span><a name="line.6305"></a>
+<span class="sourceLineNo">6306</span>    HTableDescriptor htd<a name="line.6306"></a>
+<span class="sourceLineNo">6307</span>      = new HTableDescriptor(TableName.valueOf("testOpenRegionFailed"));<a name="line.6307"></a>
+<span class="sourceLineNo">6308</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.6308"></a>
+<span class="sourceLineNo">6309</span>    htd.setValue("COPROCESSOR$1", "hdfs://test/test.jar|test||");<a name="line.6309"></a>
+<span class="sourceLineNo">6310</span><a name="line.6310"></a>
+<span class="sourceLineNo">6311</span>    HRegionInfo hri = new HRegionInfo(htd.getTableName(),<a name="line.6311"></a>
+<span class="sourceLineNo">6312</span>      HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY);<a name="line.6312"></a>
+<span class="sourceLineNo">6313</span>    ScheduledExecutorService executor = CompatibilitySingletonFactory.<a name="line.6313"></a>
+<span class="sourceLineNo">6314</span>      getInstance(MetricsExecutor.class).getExecutor();<a name="line.6314"></a>
+<span class="sourceLineNo">6315</span>    for (int i = 0; i &lt; 20 ; i++) {<a name="line.6315"></a>
+<span class="sourceLineNo">6316</span>      try {<a name="line.6316"></a>
+<span class="sourceLineNo">6317</span>        HRegion.openHRegion(hri, htd, rss.getWAL(hri),<a name="line.6317"></a>
+<span class="sourceLineNo">6318</span>          TEST_UTIL.getConfiguration(), rss, null);<a name="line.6318"></a>
+<span class="sourceLineNo">6319</span>      }catch(Throwable t){<a name="line.6319"></a>
+<span class="sourceLineNo">6320</span>        LOG.info("Expected exception, continue");<a name="line.6320"></a>
+<span class="sourceLineNo">6321</span>      }<a name="line.6321"></a>
+<span class="sourceLineNo">6322</span>    }<a name="line.6322"></a>
+<span class="sourceLineNo">6323</span>    TimeUnit.SECONDS.sleep(MetricsRegionWrapperImpl.PERIOD);<a name="line.6323"></a>
+<span class="sourceLineNo">6324</span>    Field[] fields = ThreadPoolExecutor.class.getDeclaredFields();<a name="line.6324"></a>
+<span class="sourceLineNo">6325</span>    boolean found = false;<a name="line.6325"></a>
+<span class="sourceLineNo">6326</span>    for(Field field : fields){<a name="line.6326"></a>
+<span class="sourceLineNo">6327</span>      if(field.getName().equals("workQueue")){<a name="line.6327"></a>
+<span class="sourceLineNo">6328</span>        field.setAccessible(true);<a name="line.6328"></a>
+<span class="sourceLineNo">6329</span>        BlockingQueue&lt;Runnable&gt; workQueue = (BlockingQueue&lt;Runnable&gt;)field.get(executor);<a name="line.6329"></a>
+<span class="sourceLineNo">6330</span>        //there are still two task not cancel, can not cause to memory lack<a name="line.6330"></a>
+<span class="sourceLineNo">6331</span>        Assert.assertTrue("ScheduledExecutor#workQueue should equals 2, now is " +<a name="line.6331"></a>
+<span class="sourceLineNo">6332</span>          workQueue.size() + ", please check region is close", 2 == workQueue.size());<a name="line.6332"></a>
+<span class="sourceLineNo">6333</span>        found = true;<a name="line.6333"></a>
+<span class="sourceLineNo">6334</span>      }<a name="line.6334"></a>
+<span class="sourceLineNo">6335</span>    }<a name="line.6335"></a>
+<span class="sourceLineNo">6336</span>    Assert.assertTrue("can not find workQueue, test failed", found);<a name="line.6336"></a>
+<span class="sourceLineNo">6337</span>  }<a name="line.6337"></a>
+<span class="sourceLineNo">6338</span><a name="line.6338"></a>
+<span class="sourceLineNo">6339</span>  /**<a name="line.6339"></a>
+<span class="sourceLineNo">6340</span>   * The same as HRegion class, the only difference is that instantiateHStore will<a name="line.6340"></a>
+<span class="sourceLineNo">6341</span>   * create a different HStore - HStoreForTesting. [HBASE-8518]<a name="line.6341"></a>
+<span class="sourceLineNo">6342</span>   */<a name="line.6342"></a>
+<span class="sourceLineNo">6343</span>  public static class HRegionForTesting extends HRegion {<a name="line.6343"></a>
+<span class="sourceLineNo">6344</span><a name="line.6344"></a>
+<span class="sourceLineNo">6345</span>    public HRegionForTesting(final Path tableDir, final WAL wal, final FileSystem fs,<a name="line.6345"></a>
+<span class="sourceLineNo">6346</span>                             final Configuration confParam, final RegionInfo regionInfo,<a name="line.6346"></a>
+<span class="sourceLineNo">6347</span>                             final TableDescriptor htd, final RegionServerServices rsServices) {<a name="line.6347"></a>
+<span class="sourceLineNo">6348</span>      this(new HRegionFileSystem(confParam, fs, tableDir, regionInfo),<a name="line.6348"></a>
+<span class="sourceLineNo">6349</span>          wal, confParam, htd, rsServices);<a name="line.6349"></a>
+<span class="sourceLineNo">6350</span>    }<a name="line.6350"></a>
+<span class="sourceLineNo">6351</span><a name="line.6351"></a>
+<span class="sourceLineNo">6352</span>    public HRegionForTesting(HRegionFileSystem fs, WAL wal,<a name="line.6352"></a>
+<span class="sourceLineNo">6353</span>                             Configuration confParam, TableDescriptor htd,<a name="line.6353"></a>
+<span class="sourceLineNo">6354</span>                             RegionServerServices rsServices) {<a name="line.6354"></a>
+<span class="sourceLineNo">6355</span>      super(fs, wal, confParam, htd, rsServices);<a name="line.6355"></a>
+<span class="sourceLineNo">6356</span>    }<a name="line.6356"></a>
+<span class="sourceLineNo">6357</span><a name="line.6357"></a>
+<span class="sourceLineNo">6358</span>    /**<a name="line.6358"></a>
+<span class="sourceLineNo">6359</span>     * Create HStore instance.<a name="line.6359"></a>
+<span class="sourceLineNo">6360</span>     * @return If Mob is enabled, return HMobStore, otherwise return HStoreForTesting.<a name="line.6360"></a>
+<span class="sourceLineNo">6361</span>     */<a name="line.6361"></a>
+<span class="sourceLineNo">6362</span>    @Override<a name="line.6362"></a>
+<span class="sourceLineNo">6363</span>    protected HStore instantiateHStore(final ColumnFamilyDescriptor family, boolean warmup)<a name="line.6363"></a>
+<span class="sourceLineNo">6364</span>        throws IOException {<a name="line.6364"></a>
+<span class="sourceLineNo">6365</span>      if (family.isMobEnabled()) {<a name="line.6365"></a>
+<span class="sourceLineNo">6366</span>        if (HFile.getFormatVersion(this.conf) &lt; HFile.MIN_FORMAT_VERSION_WITH_TAGS) {<a name="line.6366"></a>
+<span class="sourceLineNo">6367</span>          throw new IOException("A minimum HFile version of " + HFile.MIN_FORMAT_VERSION_WITH_TAGS +<a name="line.6367"></a>
+<span class="sourceLineNo">6368</span>              " is required for MOB feature. Consider setting " + HFile.FORMAT_VERSION_KEY +<a name="line.6368"></a>
+<span class="sourceLineNo">6369</span>              " accordingly.");<a name="line.6369"></a>
+<span class="sourceLineNo">6370</span>        }<a name="line.6370"></a>
+<span class="sourceLineNo">6371</span>        return new HMobStore(this, family, this.conf, warmup);<a name="line.6371"></a>
+<span class="sourceLineNo">6372</span>      }<a name="line.6372"></a>
+<span class="sourceLineNo">6373</span>      return new HStoreForTesting(this, family, this.conf, warmup);<a name="line.6373"></a>
+<span class="sourceLineNo">6374</span>    }<a name="line.6374"></a>
+<span class="sourceLineNo">6375</span>  }<a name="line.6375"></a>
 <span class="sourceLineNo">6376</span><a name="line.6376"></a>
-<span class="sourceLineNo">6377</span>    protected HStoreForTesting(final HRegion region,<a name="line.6377"></a>
-<span class="sourceLineNo">6378</span>        final ColumnFamilyDescriptor family,<a name="line.6378"></a>
-<span class="sourceLineNo">6379</span>        final Configuration confParam, boolean warmup) throws IOException {<a name="line.6379"></a>
-<span class="sourceLineNo">6380</span>      super(region, family, confParam, warmup);<a name="line.6380"></a>
-<span class="sourceLineNo">6381</span>    }<a name="line.6381"></a>
-<span class="sourceLineNo">6382</span><a name="line.6382"></a>
-<span class="sourceLineNo">6383</span>    @Override<a name="line.6383"></a>
-<span class="sourceLineNo">6384</span>    protected List&lt;HStoreFile&gt; doCompaction(CompactionRequestImpl cr,<a name="line.6384"></a>
-<span class="sourceLineNo">6385</span>        Collection&lt;HStoreFile&gt; filesToCompact, User user, long compactionStartTime,<a name="line.6385"></a>
-<span class="sourceLineNo">6386</span>        List&lt;Path&gt; newFiles) throws IOException {<a name="line.6386"></a>
-<span class="sourceLineNo">6387</span>      // let compaction incomplete.<a name="line.6387"></a>
-<span class="sourceLineNo">6388</span>      if (!this.conf.getBoolean("hbase.hstore.compaction.complete", true)) {<a name="line.6388"></a>
-<span class="sourceLineNo">6389</span>        LOG.warn("hbase.hstore.compaction.complete is set to false");<a name="line.6389"></a>
-<span class="sourceLineNo">6390</span>        List&lt;HStoreFile&gt; sfs = new ArrayList&lt;&gt;(newFiles.size());<a name="line.6390"></a>
-<span class="sourceLineNo">6391</span>        final boolean evictOnClose =<a name="line.6391"></a>
-<span class="sourceLineNo">6392</span>            cacheConf != null? cacheConf.shouldEvictOnClose(): true;<a name="line.6392"></a>
-<span class="sourceLineNo">6393</span>        for (Path newFile : newFiles) {<a name="line.6393"></a>
-<span class="sourceLineNo">6394</span>          // Create storefile around what we wrote with a reader on it.<a name="line.6394"></a>
-<span class="sourceLineNo">6395</span>          HStoreFile sf = createStoreFileAndReader(newFile);<a name="line.6395"></a>
-<span class="sourceLineNo">6396</span>          sf.closeStoreFile(evictOnClose);<a name="line.6396"></a>
-<span class="sourceLineNo">6397</span>          sfs.add(sf);<a name="line.6397"></a>
-<span class="sourceLineNo">6398</span>        }<a name="line.6398"></a>
-<span class="sourceLineNo">6399</span>        return sfs;<a name="line.6399"></a>
-<span class="sourceLineNo">6400</span>      }<a name="line.6400"></a>
-<span class="sourceLineNo">6401</span>      return super.doCompaction(cr, filesToCompact, user, compactionStartTime, newFiles);<a name="line.6401"></a>
-<span class="sourceLineNo">6402</span>    }<a name="line.6402"></a>
-<span class="sourceLineNo">6403</span>  }<a name="line.6403"></a>
-<span class="sourceLineNo">6404</span>}<a name="line.6404"></a>
+<span class="sourceLineNo">6377</span>  /**<a name="line.6377"></a>
+<span class="sourceLineNo">6378</span>   * HStoreForTesting is merely the same as HStore, the difference is in the doCompaction method<a name="line.6378"></a>
+<span class="sourceLineNo">6379</span>   * of HStoreForTesting there is a checkpoint "hbase.hstore.compaction.complete" which<a name="line.6379"></a>
+<span class="sourceLineNo">6380</span>   * doesn't let hstore compaction complete. In the former edition, this config is set in<a name="line.6380"></a>
+<span class="sourceLineNo">6381</span>   * HStore class inside compact method, though this is just for testing, otherwise it<a name="line.6381"></a>
+<span class="sourceLineNo">6382</span>   * doesn't do any help. In HBASE-8518, we try to get rid of all "hbase.hstore.compaction.complete"<a name="line.6382"></a>
+<span class="sourceLineNo">6383</span>   * config (except for testing code).<a name="line.6383"></a>
+<span class="sourceLineNo">6384</span>   */<a name="line.6384"></a>
+<span class="sourceLineNo">6385</span>  public static class HStoreForTesting extends HStore {<a name="line.6385"></a>
+<span class="sourceLineNo">6386</span><a name="line.6386"></a>
+<span class="sourceLineNo">6387</span>    protected HStoreForTesting(final HRegion region,<a name="line.6387"></a>
+<span class="sourceLineNo">6388</span>        final ColumnFamilyDescriptor family,<a name="line.6388"></a>
+<span class="sourceLineNo">6389</span>        final Configuration confParam, boolean warmup) throws IOException {<a name="line.6389"></a>
+<span class="sourceLineNo">6390</span>      super(region, family, confParam, warmup);<a name="line.6390"></a>
+<span class="sourceLineNo">6391</span>    }<a name="line.6391"></a>
+<span class="sourceLineNo">6392</span><a name="line.6392"></a>
+<span class="sourceLineNo">6393</span>    @Override<a name="line.6393"></a>
+<span class="sourceLineNo">6394</span>    protected List&lt;HStoreFile&gt; doCompaction(CompactionRequestImpl cr,<a name="line.6394"></a>
+<span class="sourceLineNo">6395</span>        Collection&lt;HStoreFile&gt; filesToCompact, User user, long compactionStartTime,<a name="line.6395"></a>
+<span class="sourceLineNo">6396</span>        List&lt;Path&gt; newFiles) throws IOException {<a name="line.6396"></a>
+<span class="sourceLineNo">6397</span>      // let compaction incomplete.<a name="line.6397"></a>
+<span class="sourceLineNo">6398</span>      if (!this.conf.getBoolean("hbase.hstore.compaction.complete", true)) {<a name="line.6398"></a>
+<span class="sourceLineNo">6399</span>        LOG.warn("hbase.hstore.compaction.complete is set to false");<a name="line.6399"></a>
+<span class="sourceLineNo">6400</span>        List&lt;HStoreFile&gt; sfs = new ArrayList&lt;&gt;(newFiles.size());<a name="line.6400"></a>
+<span class="sourceLineNo">6401</span>        final boolean evictOnClose =<a name="line.6401"></a>
+<span class="sourceLineNo">6402</span>            cacheConf != null? cacheConf.shouldEvictOnClose(): true;<a name="line.6402"></a>
+<span class="sourceLineNo">6403</span>        for (Path newFile : newFiles) {<a name="line.6403"></a>
+<span class="sourceLineNo">6404</span>          // Create storefile around what we wrote with a reader on it.<a name="line.6404"></a>
+<span class="sourceLineNo">6405</span>          HStoreFile sf = createStoreFileAndReader(newFile);<a name="line.6405"></a>
+<span class="sourceLineNo">6406</span>          sf.closeStoreFile(evictOnClose);<a name="line.6406"></a>
+<span class="sourceLineNo">6407</span>          sfs.add(sf);<a name="line.6407"></a>
+<span class="sourceLineNo">6408</span>        }<a name="line.6408"></a>
+<span class="sourceLineNo">6409</span>        return sfs;<a name="line.6409"></a>
+<span class="sourceLineNo">6410</span>      }<a name="line.6410"></a>
+<span class="sourceLineNo">6411</span>      return super.doCompaction(cr, filesToCompact, user, compactionStartTime, newFiles);<a name="line.6411"></a>
+<span class="sourceLineNo">6412</span>    }<a name="line.6412"></a>
+<span class="sourceLineNo">6413</span>  }<a name="line.6413"></a>
+<span class="sourceLineNo">6414</span>}<a name="line.6414"></a>
 
 
 
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionWithSeqId.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionWithSeqId.html
index ddde350..77be719 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionWithSeqId.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.HRegionWithSeqId.html
@@ -112,68 +112,68 @@
 <span class="sourceLineNo">104</span>import org.apache.hadoop.hbase.Waiter;<a name="line.104"></a>
 <span class="sourceLineNo">105</span>import org.apache.hadoop.hbase.client.Append;<a name="line.105"></a>
 <span class="sourceLineNo">106</span>import org.apache.hadoop.hbase.client.ColumnFamilyDescriptor;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.apache.hadoop.hbase.client.Get;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.110"></a>
-<span class="sourceLineNo">111</span>import org.apache.hadoop.hbase.client.Mutation;<a name="line.111"></a>
-<span class="sourceLineNo">112</span>import org.apache.hadoop.hbase.client.Put;<a name="line.112"></a>
-<span class="sourceLineNo">113</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.113"></a>
-<span class="sourceLineNo">114</span>import org.apache.hadoop.hbase.client.RegionInfoBuilder;<a name="line.114"></a>
-<span class="sourceLineNo">115</span>import org.apache.hadoop.hbase.client.Result;<a name="line.115"></a>
-<span class="sourceLineNo">116</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.116"></a>
-<span class="sourceLineNo">117</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.117"></a>
-<span class="sourceLineNo">118</span>import org.apache.hadoop.hbase.client.Table;<a name="line.118"></a>
-<span class="sourceLineNo">119</span>import org.apache.hadoop.hbase.client.TableDescriptor;<a name="line.119"></a>
-<span class="sourceLineNo">120</span>import org.apache.hadoop.hbase.coprocessor.CoprocessorHost;<a name="line.120"></a>
-<span class="sourceLineNo">121</span>import org.apache.hadoop.hbase.exceptions.FailedSanityCheckException;<a name="line.121"></a>
-<span class="sourceLineNo">122</span>import org.apache.hadoop.hbase.filter.BigDecimalComparator;<a name="line.122"></a>
-<span class="sourceLineNo">123</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.123"></a>
-<span class="sourceLineNo">124</span>import org.apache.hadoop.hbase.filter.ColumnCountGetFilter;<a name="line.124"></a>
-<span class="sourceLineNo">125</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.125"></a>
-<span class="sourceLineNo">126</span>import org.apache.hadoop.hbase.filter.FilterBase;<a name="line.126"></a>
-<span class="sourceLineNo">127</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.127"></a>
-<span class="sourceLineNo">128</span>import org.apache.hadoop.hbase.filter.NullComparator;<a name="line.128"></a>
-<span class="sourceLineNo">129</span>import org.apache.hadoop.hbase.filter.PrefixFilter;<a name="line.129"></a>
-<span class="sourceLineNo">130</span>import org.apache.hadoop.hbase.filter.SingleColumnValueExcludeFilter;<a name="line.130"></a>
-<span class="sourceLineNo">131</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.131"></a>
-<span class="sourceLineNo">132</span>import org.apache.hadoop.hbase.filter.SubstringComparator;<a name="line.132"></a>
-<span class="sourceLineNo">133</span>import org.apache.hadoop.hbase.filter.ValueFilter;<a name="line.133"></a>
-<span class="sourceLineNo">134</span>import org.apache.hadoop.hbase.io.hfile.HFile;<a name="line.134"></a>
-<span class="sourceLineNo">135</span>import org.apache.hadoop.hbase.monitoring.MonitoredRPCHandler;<a name="line.135"></a>
-<span class="sourceLineNo">136</span>import org.apache.hadoop.hbase.monitoring.MonitoredTask;<a name="line.136"></a>
-<span class="sourceLineNo">137</span>import org.apache.hadoop.hbase.monitoring.TaskMonitor;<a name="line.137"></a>
-<span class="sourceLineNo">138</span>import org.apache.hadoop.hbase.regionserver.HRegion.MutationBatchOperation;<a name="line.138"></a>
-<span class="sourceLineNo">139</span>import org.apache.hadoop.hbase.regionserver.HRegion.RegionScannerImpl;<a name="line.139"></a>
-<span class="sourceLineNo">140</span>import org.apache.hadoop.hbase.regionserver.Region.RowLock;<a name="line.140"></a>
-<span class="sourceLineNo">141</span>import org.apache.hadoop.hbase.regionserver.TestHStore.FaultyFileSystem;<a name="line.141"></a>
-<span class="sourceLineNo">142</span>import org.apache.hadoop.hbase.regionserver.compactions.CompactionRequestImpl;<a name="line.142"></a>
-<span class="sourceLineNo">143</span>import org.apache.hadoop.hbase.regionserver.wal.FSHLog;<a name="line.143"></a>
-<span class="sourceLineNo">144</span>import org.apache.hadoop.hbase.regionserver.wal.MetricsWALSource;<a name="line.144"></a>
-<span class="sourceLineNo">145</span>import org.apache.hadoop.hbase.regionserver.wal.WALUtil;<a name="line.145"></a>
-<span class="sourceLineNo">146</span>import org.apache.hadoop.hbase.replication.regionserver.ReplicationObserver;<a name="line.146"></a>
-<span class="sourceLineNo">147</span>import org.apache.hadoop.hbase.security.User;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>import org.apache.hadoop.hbase.test.MetricsAssertHelper;<a name="line.148"></a>
-<span class="sourceLineNo">149</span>import org.apache.hadoop.hbase.testclassification.LargeTests;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>import org.apache.hadoop.hbase.testclassification.VerySlowRegionServerTests;<a name="line.150"></a>
-<span class="sourceLineNo">151</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.151"></a>
-<span class="sourceLineNo">152</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.152"></a>
-<span class="sourceLineNo">153</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManagerTestHelper;<a name="line.153"></a>
-<span class="sourceLineNo">154</span>import org.apache.hadoop.hbase.util.FSUtils;<a name="line.154"></a>
-<span class="sourceLineNo">155</span>import org.apache.hadoop.hbase.util.IncrementingEnvironmentEdge;<a name="line.155"></a>
-<span class="sourceLineNo">156</span>import org.apache.hadoop.hbase.util.ManualEnvironmentEdge;<a name="line.156"></a>
-<span class="sourceLineNo">157</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.157"></a>
-<span class="sourceLineNo">158</span>import org.apache.hadoop.hbase.wal.AbstractFSWALProvider;<a name="line.158"></a>
-<span class="sourceLineNo">159</span>import org.apache.hadoop.hbase.wal.FaultyFSLog;<a name="line.159"></a>
-<span class="sourceLineNo">160</span>import org.apache.hadoop.hbase.wal.NettyAsyncFSWALConfigHelper;<a name="line.160"></a>
-<span class="sourceLineNo">161</span>import org.apache.hadoop.hbase.wal.WAL;<a name="line.161"></a>
-<span class="sourceLineNo">162</span>import org.apache.hadoop.hbase.wal.WALEdit;<a name="line.162"></a>
-<span class="sourceLineNo">163</span>import org.apache.hadoop.hbase.wal.WALFactory;<a name="line.163"></a>
-<span class="sourceLineNo">164</span>import org.apache.hadoop.hbase.wal.WALKeyImpl;<a name="line.164"></a>
-<span class="sourceLineNo">165</span>import org.apache.hadoop.hbase.wal.WALProvider;<a name="line.165"></a>
-<span class="sourceLineNo">166</span>import org.apache.hadoop.hbase.wal.WALProvider.Writer;<a name="line.166"></a>
-<span class="sourceLineNo">167</span>import org.apache.hadoop.hbase.wal.WALSplitUtil;<a name="line.167"></a>
-<span class="sourceLineNo">168</span>import org.apache.hadoop.hbase.wal.WALSplitter;<a name="line.168"></a>
+<span class="sourceLineNo">107</span>import org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>import org.apache.hadoop.hbase.client.Get;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.111"></a>
+<span class="sourceLineNo">112</span>import org.apache.hadoop.hbase.client.Mutation;<a name="line.112"></a>
+<span class="sourceLineNo">113</span>import org.apache.hadoop.hbase.client.Put;<a name="line.113"></a>
+<span class="sourceLineNo">114</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.114"></a>
+<span class="sourceLineNo">115</span>import org.apache.hadoop.hbase.client.RegionInfoBuilder;<a name="line.115"></a>
+<span class="sourceLineNo">116</span>import org.apache.hadoop.hbase.client.Result;<a name="line.116"></a>
+<span class="sourceLineNo">117</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.117"></a>
+<span class="sourceLineNo">118</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.118"></a>
+<span class="sourceLineNo">119</span>import org.apache.hadoop.hbase.client.Table;<a name="line.119"></a>
+<span class="sourceLineNo">120</span>import org.apache.hadoop.hbase.client.TableDescriptor;<a name="line.120"></a>
+<span class="sourceLineNo">121</span>import org.apache.hadoop.hbase.coprocessor.CoprocessorHost;<a name="line.121"></a>
+<span class="sourceLineNo">122</span>import org.apache.hadoop.hbase.exceptions.FailedSanityCheckException;<a name="line.122"></a>
+<span class="sourceLineNo">123</span>import org.apache.hadoop.hbase.filter.BigDecimalComparator;<a name="line.123"></a>
+<span class="sourceLineNo">124</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.124"></a>
+<span class="sourceLineNo">125</span>import org.apache.hadoop.hbase.filter.ColumnCountGetFilter;<a name="line.125"></a>
+<span class="sourceLineNo">126</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.126"></a>
+<span class="sourceLineNo">127</span>import org.apache.hadoop.hbase.filter.FilterBase;<a name="line.127"></a>
+<span class="sourceLineNo">128</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.128"></a>
+<span class="sourceLineNo">129</span>import org.apache.hadoop.hbase.filter.NullComparator;<a name="line.129"></a>
+<span class="sourceLineNo">130</span>import org.apache.hadoop.hbase.filter.PrefixFilter;<a name="line.130"></a>
+<span class="sourceLineNo">131</span>import org.apache.hadoop.hbase.filter.SingleColumnValueExcludeFilter;<a name="line.131"></a>
+<span class="sourceLineNo">132</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.132"></a>
+<span class="sourceLineNo">133</span>import org.apache.hadoop.hbase.filter.SubstringComparator;<a name="line.133"></a>
+<span class="sourceLineNo">134</span>import org.apache.hadoop.hbase.filter.ValueFilter;<a name="line.134"></a>
+<span class="sourceLineNo">135</span>import org.apache.hadoop.hbase.io.hfile.HFile;<a name="line.135"></a>
+<span class="sourceLineNo">136</span>import org.apache.hadoop.hbase.monitoring.MonitoredRPCHandler;<a name="line.136"></a>
+<span class="sourceLineNo">137</span>import org.apache.hadoop.hbase.monitoring.MonitoredTask;<a name="line.137"></a>
+<span class="sourceLineNo">138</span>import org.apache.hadoop.hbase.monitoring.TaskMonitor;<a name="line.138"></a>
+<span class="sourceLineNo">139</span>import org.apache.hadoop.hbase.regionserver.HRegion.MutationBatchOperation;<a name="line.139"></a>
+<span class="sourceLineNo">140</span>import org.apache.hadoop.hbase.regionserver.HRegion.RegionScannerImpl;<a name="line.140"></a>
+<span class="sourceLineNo">141</span>import org.apache.hadoop.hbase.regionserver.Region.RowLock;<a name="line.141"></a>
+<span class="sourceLineNo">142</span>import org.apache.hadoop.hbase.regionserver.TestHStore.FaultyFileSystem;<a name="line.142"></a>
+<span class="sourceLineNo">143</span>import org.apache.hadoop.hbase.regionserver.compactions.CompactionRequestImpl;<a name="line.143"></a>
+<span class="sourceLineNo">144</span>import org.apache.hadoop.hbase.regionserver.wal.FSHLog;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>import org.apache.hadoop.hbase.regionserver.wal.MetricsWALSource;<a name="line.145"></a>
+<span class="sourceLineNo">146</span>import org.apache.hadoop.hbase.regionserver.wal.WALUtil;<a name="line.146"></a>
+<span class="sourceLineNo">147</span>import org.apache.hadoop.hbase.replication.regionserver.ReplicationObserver;<a name="line.147"></a>
+<span class="sourceLineNo">148</span>import org.apache.hadoop.hbase.security.User;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>import org.apache.hadoop.hbase.test.MetricsAssertHelper;<a name="line.149"></a>
+<span class="sourceLineNo">150</span>import org.apache.hadoop.hbase.testclassification.LargeTests;<a name="line.150"></a>
+<span class="sourceLineNo">151</span>import org.apache.hadoop.hbase.testclassification.VerySlowRegionServerTests;<a name="line.151"></a>
+<span class="sourceLineNo">152</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.152"></a>
+<span class="sourceLineNo">153</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.153"></a>
+<span class="sourceLineNo">154</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManagerTestHelper;<a name="line.154"></a>
+<span class="sourceLineNo">155</span>import org.apache.hadoop.hbase.util.FSUtils;<a name="line.155"></a>
+<span class="sourceLineNo">156</span>import org.apache.hadoop.hbase.util.IncrementingEnvironmentEdge;<a name="line.156"></a>
+<span class="sourceLineNo">157</span>import org.apache.hadoop.hbase.util.ManualEnvironmentEdge;<a name="line.157"></a>
+<span class="sourceLineNo">158</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.158"></a>
+<span class="sourceLineNo">159</span>import org.apache.hadoop.hbase.wal.AbstractFSWALProvider;<a name="line.159"></a>
+<span class="sourceLineNo">160</span>import org.apache.hadoop.hbase.wal.FaultyFSLog;<a name="line.160"></a>
+<span class="sourceLineNo">161</span>import org.apache.hadoop.hbase.wal.NettyAsyncFSWALConfigHelper;<a name="line.161"></a>
+<span class="sourceLineNo">162</span>import org.apache.hadoop.hbase.wal.WAL;<a name="line.162"></a>
+<span class="sourceLineNo">163</span>import org.apache.hadoop.hbase.wal.WALEdit;<a name="line.163"></a>
+<span class="sourceLineNo">164</span>import org.apache.hadoop.hbase.wal.WALFactory;<a name="line.164"></a>
+<span class="sourceLineNo">165</span>import org.apache.hadoop.hbase.wal.WALKeyImpl;<a name="line.165"></a>
+<span class="sourceLineNo">166</span>import org.apache.hadoop.hbase.wal.WALProvider;<a name="line.166"></a>
+<span class="sourceLineNo">167</span>import org.apache.hadoop.hbase.wal.WALProvider.Writer;<a name="line.167"></a>
+<span class="sourceLineNo">168</span>import org.apache.hadoop.hbase.wal.WALSplitUtil;<a name="line.168"></a>
 <span class="sourceLineNo">169</span>import org.apache.hadoop.metrics2.MetricsExecutor;<a name="line.169"></a>
 <span class="sourceLineNo">170</span>import org.junit.After;<a name="line.170"></a>
 <span class="sourceLineNo">171</span>import org.junit.Assert;<a name="line.171"></a>
@@ -409,6007 +409,6017 @@
 <span class="sourceLineNo">401</span>    String testName = "testMemstoreSizeAccountingWithFailedPostBatchMutate";<a name="line.401"></a>
 <span class="sourceLineNo">402</span>    FileSystem fs = FileSystem.get(CONF);<a name="line.402"></a>
 <span class="sourceLineNo">403</span>    Path rootDir = new Path(dir + testName);<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    FSHLog hLog = new FSHLog(fs, rootDir, testName, CONF);<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    hLog.init();<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, hLog,<a name="line.406"></a>
-<span class="sourceLineNo">407</span>        COLUMN_FAMILY_BYTES);<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    assertEquals(0, region.getMemStoreDataSize());<a name="line.409"></a>
-<span class="sourceLineNo">410</span><a name="line.410"></a>
-<span class="sourceLineNo">411</span>    // Put one value<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    byte [] value = Bytes.toBytes(method);<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    Put put = new Put(value);<a name="line.413"></a>
-<span class="sourceLineNo">414</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.414"></a>
-<span class="sourceLineNo">415</span>    region.put(put);<a name="line.415"></a>
-<span class="sourceLineNo">416</span>    long onePutSize = region.getMemStoreDataSize();<a name="line.416"></a>
-<span class="sourceLineNo">417</span>    assertTrue(onePutSize &gt; 0);<a name="line.417"></a>
-<span class="sourceLineNo">418</span><a name="line.418"></a>
-<span class="sourceLineNo">419</span>    RegionCoprocessorHost mockedCPHost = Mockito.mock(RegionCoprocessorHost.class);<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    doThrow(new IOException())<a name="line.420"></a>
-<span class="sourceLineNo">421</span>       .when(mockedCPHost).postBatchMutate(Mockito.&lt;MiniBatchOperationInProgress&lt;Mutation&gt;&gt;any());<a name="line.421"></a>
-<span class="sourceLineNo">422</span>    region.setCoprocessorHost(mockedCPHost);<a name="line.422"></a>
-<span class="sourceLineNo">423</span><a name="line.423"></a>
-<span class="sourceLineNo">424</span>    put = new Put(value);<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("dfg"), value);<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    try {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      region.put(put);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>      fail("Should have failed with IOException");<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    } catch (IOException expected) {<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    }<a name="line.430"></a>
-<span class="sourceLineNo">431</span>    long expectedSize = onePutSize * 2;<a name="line.431"></a>
-<span class="sourceLineNo">432</span>    assertEquals("memstoreSize should be incremented",<a name="line.432"></a>
-<span class="sourceLineNo">433</span>        expectedSize, region.getMemStoreDataSize());<a name="line.433"></a>
-<span class="sourceLineNo">434</span>    assertEquals("flushable size should be incremented",<a name="line.434"></a>
-<span class="sourceLineNo">435</span>        expectedSize, store.getFlushableSize().getDataSize());<a name="line.435"></a>
-<span class="sourceLineNo">436</span><a name="line.436"></a>
-<span class="sourceLineNo">437</span>    region.setCoprocessorHost(null);<a name="line.437"></a>
-<span class="sourceLineNo">438</span>  }<a name="line.438"></a>
-<span class="sourceLineNo">439</span><a name="line.439"></a>
-<span class="sourceLineNo">440</span>  /**<a name="line.440"></a>
-<span class="sourceLineNo">441</span>   * A test case of HBASE-21041<a name="line.441"></a>
-<span class="sourceLineNo">442</span>   * @throws Exception Exception<a name="line.442"></a>
-<span class="sourceLineNo">443</span>   */<a name="line.443"></a>
-<span class="sourceLineNo">444</span>  @Test<a name="line.444"></a>
-<span class="sourceLineNo">445</span>  public void testFlushAndMemstoreSizeCounting() throws Exception {<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    byte[] family = Bytes.toBytes("family");<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.447"></a>
-<span class="sourceLineNo">448</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.448"></a>
-<span class="sourceLineNo">449</span>    try {<a name="line.449"></a>
-<span class="sourceLineNo">450</span>      for (byte[] row : HBaseTestingUtility.ROWS) {<a name="line.450"></a>
-<span class="sourceLineNo">451</span>        Put put = new Put(row);<a name="line.451"></a>
-<span class="sourceLineNo">452</span>        put.addColumn(family, family, row);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>        region.put(put);<a name="line.453"></a>
-<span class="sourceLineNo">454</span>      }<a name="line.454"></a>
-<span class="sourceLineNo">455</span>      region.flush(true);<a name="line.455"></a>
-<span class="sourceLineNo">456</span>      // After flush, data size should be zero<a name="line.456"></a>
-<span class="sourceLineNo">457</span>      assertEquals(0, region.getMemStoreDataSize());<a name="line.457"></a>
-<span class="sourceLineNo">458</span>      // After flush, a new active mutable segment is created, so the heap size<a name="line.458"></a>
-<span class="sourceLineNo">459</span>      // should equal to MutableSegment.DEEP_OVERHEAD<a name="line.459"></a>
-<span class="sourceLineNo">460</span>      assertEquals(MutableSegment.DEEP_OVERHEAD, region.getMemStoreHeapSize());<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      // After flush, offheap should be zero<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      assertEquals(0, region.getMemStoreOffHeapSize());<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    } finally {<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.464"></a>
-<span class="sourceLineNo">465</span>      this.region = null;<a name="line.465"></a>
-<span class="sourceLineNo">466</span>      wals.close();<a name="line.466"></a>
-<span class="sourceLineNo">467</span>    }<a name="line.467"></a>
-<span class="sourceLineNo">468</span>  }<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>   * Test we do not lose data if we fail a flush and then close.<a name="line.471"></a>
-<span class="sourceLineNo">472</span>   * Part of HBase-10466.  Tests the following from the issue description:<a name="line.472"></a>
-<span class="sourceLineNo">473</span>   * "Bug 1: Wrong calculation of HRegion.memstoreSize: When a flush fails, data to be flushed is<a name="line.473"></a>
-<span class="sourceLineNo">474</span>   * kept in each MemStore's snapshot and wait for next flush attempt to continue on it. But when<a name="line.474"></a>
-<span class="sourceLineNo">475</span>   * the next flush succeeds, the counter of total memstore size in HRegion is always deduced by<a name="line.475"></a>
-<span class="sourceLineNo">476</span>   * the sum of current memstore sizes instead of snapshots left from previous failed flush. This<a name="line.476"></a>
-<span class="sourceLineNo">477</span>   * calculation is problematic that almost every time there is failed flush, HRegion.memstoreSize<a name="line.477"></a>
-<span class="sourceLineNo">478</span>   * gets reduced by a wrong value. If region flush could not proceed for a couple cycles, the size<a name="line.478"></a>
-<span class="sourceLineNo">479</span>   * in current memstore could be much larger than the snapshot. It's likely to drift memstoreSize<a name="line.479"></a>
-<span class="sourceLineNo">480</span>   * much smaller than expected. In extreme case, if the error accumulates to even bigger than<a name="line.480"></a>
-<span class="sourceLineNo">481</span>   * HRegion's memstore size limit, any further flush is skipped because flush does not do anything<a name="line.481"></a>
-<span class="sourceLineNo">482</span>   * if memstoreSize is not larger than 0."<a name="line.482"></a>
-<span class="sourceLineNo">483</span>   * @throws Exception<a name="line.483"></a>
-<span class="sourceLineNo">484</span>   */<a name="line.484"></a>
-<span class="sourceLineNo">485</span>  @Test<a name="line.485"></a>
-<span class="sourceLineNo">486</span>  public void testFlushSizeAccounting() throws Exception {<a name="line.486"></a>
-<span class="sourceLineNo">487</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    // Only retry once.<a name="line.489"></a>
-<span class="sourceLineNo">490</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.490"></a>
-<span class="sourceLineNo">491</span>    final User user =<a name="line.491"></a>
-<span class="sourceLineNo">492</span>      User.createUserForTesting(conf, method, new String[]{"foo"});<a name="line.492"></a>
-<span class="sourceLineNo">493</span>    // Inject our faulty LocalFileSystem<a name="line.493"></a>
-<span class="sourceLineNo">494</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.494"></a>
-<span class="sourceLineNo">495</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.495"></a>
-<span class="sourceLineNo">496</span>      @Override<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      public Object run() throws Exception {<a name="line.497"></a>
-<span class="sourceLineNo">498</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.498"></a>
-<span class="sourceLineNo">499</span>        FileSystem fs = FileSystem.get(conf);<a name="line.499"></a>
-<span class="sourceLineNo">500</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.500"></a>
-<span class="sourceLineNo">501</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.501"></a>
-<span class="sourceLineNo">502</span>        HRegion region = null;<a name="line.502"></a>
-<span class="sourceLineNo">503</span>        try {<a name="line.503"></a>
-<span class="sourceLineNo">504</span>          // Initialize region<a name="line.504"></a>
-<span class="sourceLineNo">505</span>          region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, wal,<a name="line.505"></a>
-<span class="sourceLineNo">506</span>              COLUMN_FAMILY_BYTES);<a name="line.506"></a>
-<span class="sourceLineNo">507</span>          long size = region.getMemStoreDataSize();<a name="line.507"></a>
-<span class="sourceLineNo">508</span>          Assert.assertEquals(0, size);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.509"></a>
-<span class="sourceLineNo">510</span>          Put p1 = new Put(row);<a name="line.510"></a>
-<span class="sourceLineNo">511</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[]) null));<a name="line.511"></a>
-<span class="sourceLineNo">512</span>          region.put(p1);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>          final long sizeOfOnePut = region.getMemStoreDataSize();<a name="line.513"></a>
-<span class="sourceLineNo">514</span>          // Fail a flush which means the current memstore will hang out as memstore 'snapshot'.<a name="line.514"></a>
-<span class="sourceLineNo">515</span>          try {<a name="line.515"></a>
-<span class="sourceLineNo">516</span>            LOG.info("Flushing");<a name="line.516"></a>
-<span class="sourceLineNo">517</span>            region.flush(true);<a name="line.517"></a>
-<span class="sourceLineNo">518</span>            Assert.fail("Didn't bubble up IOE!");<a name="line.518"></a>
-<span class="sourceLineNo">519</span>          } catch (DroppedSnapshotException dse) {<a name="line.519"></a>
-<span class="sourceLineNo">520</span>            // What we are expecting<a name="line.520"></a>
-<span class="sourceLineNo">521</span>            region.closing.set(false); // this is needed for the rest of the test to work<a name="line.521"></a>
-<span class="sourceLineNo">522</span>          }<a name="line.522"></a>
-<span class="sourceLineNo">523</span>          // Make it so all writes succeed from here on out<a name="line.523"></a>
-<span class="sourceLineNo">524</span>          ffs.fault.set(false);<a name="line.524"></a>
-<span class="sourceLineNo">525</span>          // Check sizes.  Should still be the one entry.<a name="line.525"></a>
-<span class="sourceLineNo">526</span>          Assert.assertEquals(sizeOfOnePut, region.getMemStoreDataSize());<a name="line.526"></a>
-<span class="sourceLineNo">527</span>          // Now add two entries so that on this next flush that fails, we can see if we<a name="line.527"></a>
-<span class="sourceLineNo">528</span>          // subtract the right amount, the snapshot size only.<a name="line.528"></a>
-<span class="sourceLineNo">529</span>          Put p2 = new Put(row);<a name="line.529"></a>
-<span class="sourceLineNo">530</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.530"></a>
-<span class="sourceLineNo">531</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.531"></a>
-<span class="sourceLineNo">532</span>          region.put(p2);<a name="line.532"></a>
-<span class="sourceLineNo">533</span>          long expectedSize = sizeOfOnePut * 3;<a name="line.533"></a>
-<span class="sourceLineNo">534</span>          Assert.assertEquals(expectedSize, region.getMemStoreDataSize());<a name="line.534"></a>
-<span class="sourceLineNo">535</span>          // Do a successful flush.  It will clear the snapshot only.  Thats how flushes work.<a name="line.535"></a>
-<span class="sourceLineNo">536</span>          // If already a snapshot, we clear it else we move the memstore to be snapshot and flush<a name="line.536"></a>
-<span class="sourceLineNo">537</span>          // it<a name="line.537"></a>
-<span class="sourceLineNo">538</span>          region.flush(true);<a name="line.538"></a>
-<span class="sourceLineNo">539</span>          // Make sure our memory accounting is right.<a name="line.539"></a>
-<span class="sourceLineNo">540</span>          Assert.assertEquals(sizeOfOnePut * 2, region.getMemStoreDataSize());<a name="line.540"></a>
-<span class="sourceLineNo">541</span>        } finally {<a name="line.541"></a>
-<span class="sourceLineNo">542</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.542"></a>
-<span class="sourceLineNo">543</span>        }<a name="line.543"></a>
-<span class="sourceLineNo">544</span>        return null;<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>    FileSystem.closeAllForUGI(user.getUGI());<a name="line.547"></a>
-<span class="sourceLineNo">548</span>  }<a name="line.548"></a>
-<span class="sourceLineNo">549</span><a name="line.549"></a>
-<span class="sourceLineNo">550</span>  @Test<a name="line.550"></a>
-<span class="sourceLineNo">551</span>  public void testCloseWithFailingFlush() throws Exception {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    // Only retry once.<a name="line.554"></a>
-<span class="sourceLineNo">555</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.555"></a>
-<span class="sourceLineNo">556</span>    final User user =<a name="line.556"></a>
-<span class="sourceLineNo">557</span>      User.createUserForTesting(conf, this.method, new String[]{"foo"});<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    // Inject our faulty LocalFileSystem<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      @Override<a name="line.561"></a>
-<span class="sourceLineNo">562</span>      public Object run() throws Exception {<a name="line.562"></a>
-<span class="sourceLineNo">563</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.563"></a>
-<span class="sourceLineNo">564</span>        FileSystem fs = FileSystem.get(conf);<a name="line.564"></a>
-<span class="sourceLineNo">565</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.565"></a>
-<span class="sourceLineNo">566</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.566"></a>
-<span class="sourceLineNo">567</span>        HRegion region = null;<a name="line.567"></a>
-<span class="sourceLineNo">568</span>        try {<a name="line.568"></a>
-<span class="sourceLineNo">569</span>          // Initialize region<a name="line.569"></a>
-<span class="sourceLineNo">570</span>          region = initHRegion(tableName, null, null, false,<a name="line.570"></a>
-<span class="sourceLineNo">571</span>              Durability.SYNC_WAL, wal, COLUMN_FAMILY_BYTES);<a name="line.571"></a>
-<span class="sourceLineNo">572</span>          long size = region.getMemStoreDataSize();<a name="line.572"></a>
-<span class="sourceLineNo">573</span>          Assert.assertEquals(0, size);<a name="line.573"></a>
-<span class="sourceLineNo">574</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.574"></a>
-<span class="sourceLineNo">575</span>          Put p1 = new Put(row);<a name="line.575"></a>
-<span class="sourceLineNo">576</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[])null));<a name="line.576"></a>
-<span class="sourceLineNo">577</span>          region.put(p1);<a name="line.577"></a>
-<span class="sourceLineNo">578</span>          // Manufacture an outstanding snapshot -- fake a failed flush by doing prepare step only.<a name="line.578"></a>
-<span class="sourceLineNo">579</span>          HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>          StoreFlushContext storeFlushCtx =<a name="line.580"></a>
-<span class="sourceLineNo">581</span>              store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY);<a name="line.581"></a>
-<span class="sourceLineNo">582</span>          storeFlushCtx.prepare();<a name="line.582"></a>
-<span class="sourceLineNo">583</span>          // Now add two entries to the foreground memstore.<a name="line.583"></a>
-<span class="sourceLineNo">584</span>          Put p2 = new Put(row);<a name="line.584"></a>
-<span class="sourceLineNo">585</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.585"></a>
-<span class="sourceLineNo">586</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.586"></a>
-<span class="sourceLineNo">587</span>          region.put(p2);<a name="line.587"></a>
-<span class="sourceLineNo">588</span>          // Now try close on top of a failing flush.<a name="line.588"></a>
-<span class="sourceLineNo">589</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.589"></a>
-<span class="sourceLineNo">590</span>          region = null;<a name="line.590"></a>
-<span class="sourceLineNo">591</span>          fail();<a name="line.591"></a>
-<span class="sourceLineNo">592</span>        } catch (DroppedSnapshotException dse) {<a name="line.592"></a>
-<span class="sourceLineNo">593</span>          // Expected<a name="line.593"></a>
-<span class="sourceLineNo">594</span>          LOG.info("Expected DroppedSnapshotException");<a name="line.594"></a>
-<span class="sourceLineNo">595</span>        } finally {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>          // Make it so all writes succeed from here on out so can close clean<a name="line.596"></a>
-<span class="sourceLineNo">597</span>          ffs.fault.set(false);<a name="line.597"></a>
-<span class="sourceLineNo">598</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.598"></a>
-<span class="sourceLineNo">599</span>        }<a name="line.599"></a>
-<span class="sourceLineNo">600</span>        return null;<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      }<a name="line.601"></a>
-<span class="sourceLineNo">602</span>    });<a name="line.602"></a>
-<span class="sourceLineNo">603</span>    FileSystem.closeAllForUGI(user.getUGI());<a name="line.603"></a>
-<span class="sourceLineNo">604</span>  }<a name="line.604"></a>
-<span class="sourceLineNo">605</span><a name="line.605"></a>
-<span class="sourceLineNo">606</span>  @Test<a name="line.606"></a>
-<span class="sourceLineNo">607</span>  public void testCompactionAffectedByScanners() throws Exception {<a name="line.607"></a>
-<span class="sourceLineNo">608</span>    byte[] family = Bytes.toBytes("family");<a name="line.608"></a>
-<span class="sourceLineNo">609</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.609"></a>
-<span class="sourceLineNo">610</span><a name="line.610"></a>
-<span class="sourceLineNo">611</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.612"></a>
-<span class="sourceLineNo">613</span>    region.put(put);<a name="line.613"></a>
-<span class="sourceLineNo">614</span>    region.flush(true);<a name="line.614"></a>
-<span class="sourceLineNo">615</span><a name="line.615"></a>
-<span class="sourceLineNo">616</span>    Scan scan = new Scan();<a name="line.616"></a>
-<span class="sourceLineNo">617</span>    scan.setMaxVersions(3);<a name="line.617"></a>
-<span class="sourceLineNo">618</span>    // open the first scanner<a name="line.618"></a>
-<span class="sourceLineNo">619</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.619"></a>
-<span class="sourceLineNo">620</span><a name="line.620"></a>
-<span class="sourceLineNo">621</span>    Delete delete = new Delete(Bytes.toBytes("r1"));<a name="line.621"></a>
-<span class="sourceLineNo">622</span>    region.delete(delete);<a name="line.622"></a>
-<span class="sourceLineNo">623</span>    region.flush(true);<a name="line.623"></a>
-<span class="sourceLineNo">624</span><a name="line.624"></a>
-<span class="sourceLineNo">625</span>    // open the second scanner<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    RegionScanner scanner2 = region.getScanner(scan);<a name="line.626"></a>
-<span class="sourceLineNo">627</span><a name="line.627"></a>
-<span class="sourceLineNo">628</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.628"></a>
-<span class="sourceLineNo">629</span><a name="line.629"></a>
-<span class="sourceLineNo">630</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.630"></a>
-<span class="sourceLineNo">631</span><a name="line.631"></a>
-<span class="sourceLineNo">632</span>    // make a major compaction<a name="line.632"></a>
-<span class="sourceLineNo">633</span>    region.compact(true);<a name="line.633"></a>
-<span class="sourceLineNo">634</span><a name="line.634"></a>
-<span class="sourceLineNo">635</span>    // open the third scanner<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    RegionScanner scanner3 = region.getScanner(scan);<a name="line.636"></a>
-<span class="sourceLineNo">637</span><a name="line.637"></a>
-<span class="sourceLineNo">638</span>    // get data from scanner 1, 2, 3 after major compaction<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    scanner1.next(results);<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    System.out.println(results);<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    assertEquals(1, results.size());<a name="line.641"></a>
-<span class="sourceLineNo">642</span><a name="line.642"></a>
-<span class="sourceLineNo">643</span>    results.clear();<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    scanner2.next(results);<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    System.out.println(results);<a name="line.645"></a>
-<span class="sourceLineNo">646</span>    assertEquals(0, results.size());<a name="line.646"></a>
-<span class="sourceLineNo">647</span><a name="line.647"></a>
-<span class="sourceLineNo">648</span>    results.clear();<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    scanner3.next(results);<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    System.out.println(results);<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    assertEquals(0, results.size());<a name="line.651"></a>
-<span class="sourceLineNo">652</span>  }<a name="line.652"></a>
-<span class="sourceLineNo">653</span><a name="line.653"></a>
-<span class="sourceLineNo">654</span>  @Test<a name="line.654"></a>
-<span class="sourceLineNo">655</span>  public void testToShowNPEOnRegionScannerReseek() throws Exception {<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    byte[] family = Bytes.toBytes("family");<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.657"></a>
-<span class="sourceLineNo">658</span><a name="line.658"></a>
-<span class="sourceLineNo">659</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.659"></a>
-<span class="sourceLineNo">660</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.660"></a>
-<span class="sourceLineNo">661</span>    region.put(put);<a name="line.661"></a>
-<span class="sourceLineNo">662</span>    put = new Put(Bytes.toBytes("r2"));<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.663"></a>
-<span class="sourceLineNo">664</span>    region.put(put);<a name="line.664"></a>
-<span class="sourceLineNo">665</span>    region.flush(true);<a name="line.665"></a>
-<span class="sourceLineNo">666</span><a name="line.666"></a>
-<span class="sourceLineNo">667</span>    Scan scan = new Scan();<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    scan.setMaxVersions(3);<a name="line.668"></a>
-<span class="sourceLineNo">669</span>    // open the first scanner<a name="line.669"></a>
-<span class="sourceLineNo">670</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.670"></a>
-<span class="sourceLineNo">671</span><a name="line.671"></a>
-<span class="sourceLineNo">672</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.672"></a>
-<span class="sourceLineNo">673</span><a name="line.673"></a>
-<span class="sourceLineNo">674</span>    region.compact(true);<a name="line.674"></a>
-<span class="sourceLineNo">675</span><a name="line.675"></a>
-<span class="sourceLineNo">676</span>    scanner1.reseek(Bytes.toBytes("r2"));<a name="line.676"></a>
-<span class="sourceLineNo">677</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.677"></a>
-<span class="sourceLineNo">678</span>    scanner1.next(results);<a name="line.678"></a>
-<span class="sourceLineNo">679</span>    Cell keyValue = results.get(0);<a name="line.679"></a>
-<span class="sourceLineNo">680</span>    Assert.assertTrue(Bytes.compareTo(CellUtil.cloneRow(keyValue), Bytes.toBytes("r2")) == 0);<a name="line.680"></a>
-<span class="sourceLineNo">681</span>    scanner1.close();<a name="line.681"></a>
-<span class="sourceLineNo">682</span>  }<a name="line.682"></a>
-<span class="sourceLineNo">683</span><a name="line.683"></a>
-<span class="sourceLineNo">684</span>  @Test<a name="line.684"></a>
-<span class="sourceLineNo">685</span>  public void testSkipRecoveredEditsReplay() throws Exception {<a name="line.685"></a>
-<span class="sourceLineNo">686</span>    byte[] family = Bytes.toBytes("family");<a name="line.686"></a>
-<span class="sourceLineNo">687</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.687"></a>
-<span class="sourceLineNo">688</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.688"></a>
-<span class="sourceLineNo">689</span>    try {<a name="line.689"></a>
-<span class="sourceLineNo">690</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.690"></a>
-<span class="sourceLineNo">691</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.691"></a>
-<span class="sourceLineNo">692</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.692"></a>
-<span class="sourceLineNo">693</span><a name="line.693"></a>
-<span class="sourceLineNo">694</span>      Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.694"></a>
-<span class="sourceLineNo">695</span><a name="line.695"></a>
-<span class="sourceLineNo">696</span>      long maxSeqId = 1050;<a name="line.696"></a>
-<span class="sourceLineNo">697</span>      long minSeqId = 1000;<a name="line.697"></a>
-<span class="sourceLineNo">698</span><a name="line.698"></a>
-<span class="sourceLineNo">699</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.699"></a>
-<span class="sourceLineNo">700</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.700"></a>
-<span class="sourceLineNo">701</span>        fs.create(recoveredEdits);<a name="line.701"></a>
-<span class="sourceLineNo">702</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.702"></a>
-<span class="sourceLineNo">703</span><a name="line.703"></a>
-<span class="sourceLineNo">704</span>        long time = System.nanoTime();<a name="line.704"></a>
-<span class="sourceLineNo">705</span>        WALEdit edit = new WALEdit();<a name="line.705"></a>
-<span class="sourceLineNo">706</span>        edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.706"></a>
-<span class="sourceLineNo">707</span>            .toBytes(i)));<a name="line.707"></a>
-<span class="sourceLineNo">708</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.708"></a>
-<span class="sourceLineNo">709</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.709"></a>
-<span class="sourceLineNo">710</span><a name="line.710"></a>
-<span class="sourceLineNo">711</span>        writer.close();<a name="line.711"></a>
-<span class="sourceLineNo">712</span>      }<a name="line.712"></a>
-<span class="sourceLineNo">713</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.713"></a>
-<span class="sourceLineNo">714</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.714"></a>
-<span class="sourceLineNo">715</span>      for (HStore store : region.getStores()) {<a name="line.715"></a>
-<span class="sourceLineNo">716</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), minSeqId - 1);<a name="line.716"></a>
-<span class="sourceLineNo">717</span>      }<a name="line.717"></a>
-<span class="sourceLineNo">718</span>      long seqId = region.replayRecoveredEditsIfAny(maxSeqIdInStores, null, status);<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      assertEquals(maxSeqId, seqId);<a name="line.719"></a>
-<span class="sourceLineNo">720</span>      region.getMVCC().advanceTo(seqId);<a name="line.720"></a>
-<span class="sourceLineNo">721</span>      Get get = new Get(row);<a name="line.721"></a>
-<span class="sourceLineNo">722</span>      Result result = region.get(get);<a name="line.722"></a>
-<span class="sourceLineNo">723</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.723"></a>
-<span class="sourceLineNo">724</span>        List&lt;Cell&gt; kvs = result.getColumnCells(family, Bytes.toBytes(i));<a name="line.724"></a>
-<span class="sourceLineNo">725</span>        assertEquals(1, kvs.size());<a name="line.725"></a>
-<span class="sourceLineNo">726</span>        assertArrayEquals(Bytes.toBytes(i), CellUtil.cloneValue(kvs.get(0)));<a name="line.726"></a>
-<span class="sourceLineNo">727</span>      }<a name="line.727"></a>
-<span class="sourceLineNo">728</span>    } finally {<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      this.region = null;<a name="line.730"></a>
-<span class="sourceLineNo">731</span>      wals.close();<a name="line.731"></a>
-<span class="sourceLineNo">732</span>    }<a name="line.732"></a>
-<span class="sourceLineNo">733</span>  }<a name="line.733"></a>
-<span class="sourceLineNo">734</span><a name="line.734"></a>
-<span class="sourceLineNo">735</span>  @Test<a name="line.735"></a>
-<span class="sourceLineNo">736</span>  public void testSkipRecoveredEditsReplaySomeIgnored() throws Exception {<a name="line.736"></a>
-<span class="sourceLineNo">737</span>    byte[] family = Bytes.toBytes("family");<a name="line.737"></a>
-<span class="sourceLineNo">738</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.738"></a>
-<span class="sourceLineNo">739</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.739"></a>
-<span class="sourceLineNo">740</span>    try {<a name="line.740"></a>
-<span class="sourceLineNo">741</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.741"></a>
-<span class="sourceLineNo">742</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.742"></a>
-<span class="sourceLineNo">743</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.743"></a>
-<span class="sourceLineNo">744</span><a name="line.744"></a>
-<span class="sourceLineNo">745</span>      Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.745"></a>
-<span class="sourceLineNo">746</span><a name="line.746"></a>
-<span class="sourceLineNo">747</span>      long maxSeqId = 1050;<a name="line.747"></a>
-<span class="sourceLineNo">748</span>      long minSeqId = 1000;<a name="line.748"></a>
-<span class="sourceLineNo">749</span><a name="line.749"></a>
-<span class="sourceLineNo">750</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.750"></a>
-<span class="sourceLineNo">751</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.751"></a>
-<span class="sourceLineNo">752</span>        fs.create(recoveredEdits);<a name="line.752"></a>
-<span class="sourceLineNo">753</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.753"></a>
-<span class="sourceLineNo">754</span><a name="line.754"></a>
-<span class="sourceLineNo">755</span>        long time = System.nanoTime();<a name="line.755"></a>
-<span class="sourceLineNo">756</span>        WALEdit edit = new WALEdit();<a name="line.756"></a>
-<span class="sourceLineNo">757</span>        edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.757"></a>
-<span class="sourceLineNo">758</span>            .toBytes(i)));<a name="line.758"></a>
-<span class="sourceLineNo">759</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.759"></a>
-<span class="sourceLineNo">760</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.760"></a>
-<span class="sourceLineNo">761</span><a name="line.761"></a>
-<span class="sourceLineNo">762</span>        writer.close();<a name="line.762"></a>
-<span class="sourceLineNo">763</span>      }<a name="line.763"></a>
-<span class="sourceLineNo">764</span>      long recoverSeqId = 1030;<a name="line.764"></a>
-<span class="sourceLineNo">765</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.766"></a>
-<span class="sourceLineNo">767</span>      for (HStore store : region.getStores()) {<a name="line.767"></a>
-<span class="sourceLineNo">768</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), recoverSeqId - 1);<a name="line.768"></a>
-<span class="sourceLineNo">769</span>      }<a name="line.769"></a>
-<span class="sourceLineNo">770</span>      long seqId = region.replayRecoveredEditsIfAny(maxSeqIdInStores, null, status);<a name="line.770"></a>
-<span class="sourceLineNo">771</span>      assertEquals(maxSeqId, seqId);<a name="line.771"></a>
-<span class="sourceLineNo">772</span>      region.getMVCC().advanceTo(seqId);<a name="line.772"></a>
-<span class="sourceLineNo">773</span>      Get get = new Get(row);<a name="line.773"></a>
-<span class="sourceLineNo">774</span>      Result result = region.get(get);<a name="line.774"></a>
-<span class="sourceLineNo">775</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.775"></a>
-<span class="sourceLineNo">776</span>        List&lt;Cell&gt; kvs = result.getColumnCells(family, Bytes.toBytes(i));<a name="line.776"></a>
-<span class="sourceLineNo">777</span>        if (i &lt; recoverSeqId) {<a name="line.777"></a>
-<span class="sourceLineNo">778</span>          assertEquals(0, kvs.size());<a name="line.778"></a>
-<span class="sourceLineNo">779</span>        } else {<a name="line.779"></a>
-<span class="sourceLineNo">780</span>          assertEquals(1, kvs.size());<a name="line.780"></a>
-<span class="sourceLineNo">781</span>          assertArrayEquals(Bytes.toBytes(i), CellUtil.cloneValue(kvs.get(0)));<a name="line.781"></a>
-<span class="sourceLineNo">782</span>        }<a name="line.782"></a>
-<span class="sourceLineNo">783</span>      }<a name="line.783"></a>
-<span class="sourceLineNo">784</span>    } finally {<a name="line.784"></a>
-<span class="sourceLineNo">785</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.785"></a>
-<span class="sourceLineNo">786</span>      this.region = null;<a name="line.786"></a>
-<span class="sourceLineNo">787</span>      wals.close();<a name="line.787"></a>
-<span class="sourceLineNo">788</span>    }<a name="line.788"></a>
-<span class="sourceLineNo">789</span>  }<a name="line.789"></a>
-<span class="sourceLineNo">790</span><a name="line.790"></a>
-<span class="sourceLineNo">791</span>  @Test<a name="line.791"></a>
-<span class="sourceLineNo">792</span>  public void testSkipRecoveredEditsReplayAllIgnored() throws Exception {<a name="line.792"></a>
-<span class="sourceLineNo">793</span>    byte[] family = Bytes.toBytes("family");<a name="line.793"></a>
-<span class="sourceLineNo">794</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.794"></a>
-<span class="sourceLineNo">795</span>    Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.795"></a>
-<span class="sourceLineNo">796</span>    FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.796"></a>
-<span class="sourceLineNo">797</span><a name="line.797"></a>
-<span class="sourceLineNo">798</span>    Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.798"></a>
-<span class="sourceLineNo">799</span>    for (int i = 1000; i &lt; 1050; i += 10) {<a name="line.799"></a>
-<span class="sourceLineNo">800</span>      Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.800"></a>
-<span class="sourceLineNo">801</span>      FSDataOutputStream dos = fs.create(recoveredEdits);<a name="line.801"></a>
-<span class="sourceLineNo">802</span>      dos.writeInt(i);<a name="line.802"></a>
-<span class="sourceLineNo">803</span>      dos.close();<a name="line.803"></a>
-<span class="sourceLineNo">804</span>    }<a name="line.804"></a>
-<span class="sourceLineNo">805</span>    long minSeqId = 2000;<a name="line.805"></a>
-<span class="sourceLineNo">806</span>    Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", minSeqId - 1));<a name="line.806"></a>
-<span class="sourceLineNo">807</span>    FSDataOutputStream dos = fs.create(recoveredEdits);<a name="line.807"></a>
-<span class="sourceLineNo">808</span>    dos.close();<a name="line.808"></a>
-<span class="sourceLineNo">809</span><a name="line.809"></a>
-<span class="sourceLineNo">810</span>    Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.810"></a>
-<span class="sourceLineNo">811</span>    for (HStore store : region.getStores()) {<a name="line.811"></a>
-<span class="sourceLineNo">812</span>      maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), minSeqId);<a name="line.812"></a>
-<span class="sourceLineNo">813</span>    }<a name="line.813"></a>
-<span class="sourceLineNo">814</span>    long seqId = region.replayRecoveredEditsIfAny(maxSeqIdInStores, null, null);<a name="line.814"></a>
-<span class="sourceLineNo">815</span>    assertEquals(minSeqId, seqId);<a name="line.815"></a>
-<span class="sourceLineNo">816</span>  }<a name="line.816"></a>
-<span class="sourceLineNo">817</span><a name="line.817"></a>
-<span class="sourceLineNo">818</span>  @Test<a name="line.818"></a>
-<span class="sourceLineNo">819</span>  public void testSkipRecoveredEditsReplayTheLastFileIgnored() throws Exception {<a name="line.819"></a>
-<span class="sourceLineNo">820</span>    byte[] family = Bytes.toBytes("family");<a name="line.820"></a>
-<span class="sourceLineNo">821</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.821"></a>
-<span class="sourceLineNo">822</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.822"></a>
-<span class="sourceLineNo">823</span>    try {<a name="line.823"></a>
-<span class="sourceLineNo">824</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.824"></a>
-<span class="sourceLineNo">825</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.825"></a>
-<span class="sourceLineNo">826</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.826"></a>
-<span class="sourceLineNo">827</span>      byte[][] columns = region.getTableDescriptor().getColumnFamilyNames().toArray(new byte[0][]);<a name="line.827"></a>
-<span class="sourceLineNo">828</span><a name="line.828"></a>
-<span class="sourceLineNo">829</span>      assertEquals(0, region.getStoreFileList(columns).size());<a name="line.829"></a>
-<span class="sourceLineNo">830</span><a name="line.830"></a>
-<span class="sourceLineNo">831</span>      Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.831"></a>
-<span class="sourceLineNo">832</span><a name="line.832"></a>
-<span class="sourceLineNo">833</span>      long maxSeqId = 1050;<a name="line.833"></a>
-<span class="sourceLineNo">834</span>      long minSeqId = 1000;<a name="line.834"></a>
-<span class="sourceLineNo">835</span><a name="line.835"></a>
-<span class="sourceLineNo">836</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.836"></a>
-<span class="sourceLineNo">837</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.837"></a>
-<span class="sourceLineNo">838</span>        fs.create(recoveredEdits);<a name="line.838"></a>
-<span class="sourceLineNo">839</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.839"></a>
-<span class="sourceLineNo">840</span><a name="line.840"></a>
-<span class="sourceLineNo">841</span>        long time = System.nanoTime();<a name="line.841"></a>
-<span class="sourceLineNo">842</span>        WALEdit edit = null;<a name="line.842"></a>
-<span class="sourceLineNo">843</span>        if (i == maxSeqId) {<a name="line.843"></a>
-<span class="sourceLineNo">844</span>          edit = WALEdit.createCompaction(region.getRegionInfo(),<a name="line.844"></a>
-<span class="sourceLineNo">845</span>          CompactionDescriptor.newBuilder()<a name="line.845"></a>
-<span class="sourceLineNo">846</span>          .setTableName(ByteString.copyFrom(tableName.getName()))<a name="line.846"></a>
-<span class="sourceLineNo">847</span>          .setFamilyName(ByteString.copyFrom(regionName))<a name="line.847"></a>
-<span class="sourceLineNo">848</span>          .setEncodedRegionName(ByteString.copyFrom(regionName))<a name="line.848"></a>
-<span class="sourceLineNo">849</span>          .setStoreHomeDirBytes(ByteString.copyFrom(Bytes.toBytes(regiondir.toString())))<a name="line.849"></a>
-<span class="sourceLineNo">850</span>          .setRegionName(ByteString.copyFrom(region.getRegionInfo().getRegionName()))<a name="line.850"></a>
-<span class="sourceLineNo">851</span>          .build());<a name="line.851"></a>
-<span class="sourceLineNo">852</span>        } else {<a name="line.852"></a>
-<span class="sourceLineNo">853</span>          edit = new WALEdit();<a name="line.853"></a>
-<span class="sourceLineNo">854</span>          edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.854"></a>
-<span class="sourceLineNo">855</span>            .toBytes(i)));<a name="line.855"></a>
-<span class="sourceLineNo">856</span>        }<a name="line.856"></a>
-<span class="sourceLineNo">857</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.857"></a>
-<span class="sourceLineNo">858</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.858"></a>
-<span class="sourceLineNo">859</span>        writer.close();<a name="line.859"></a>
-<span class="sourceLineNo">860</span>      }<a name="line.860"></a>
-<span class="sourceLineNo">861</span><a name="line.861"></a>
-<span class="sourceLineNo">862</span>      long recoverSeqId = 1030;<a name="line.862"></a>
-<span class="sourceLineNo">863</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.863"></a>
-<span class="sourceLineNo">864</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.864"></a>
-<span class="sourceLineNo">865</span>      for (HStore store : region.getStores()) {<a name="line.865"></a>
-<span class="sourceLineNo">866</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), recoverSeqId - 1);<a name="line.866"></a>
-<span class="sourceLineNo">867</span>      }<a name="line.867"></a>
-<span class="sourceLineNo">868</span>      long seqId = region.replayRecoveredEditsIfAny(maxSeqIdInStores, null, status);<a name="line.868"></a>
-<span class="sourceLineNo">869</span>      assertEquals(maxSeqId, seqId);<a name="line.869"></a>
-<span class="sourceLineNo">870</span><a name="line.870"></a>
-<span class="sourceLineNo">871</span>      // assert that the files are flushed<a name="line.871"></a>
-<span class="sourceLineNo">872</span>      assertEquals(1, region.getStoreFileList(columns).size());<a name="line.872"></a>
-<span class="sourceLineNo">873</span><a name="line.873"></a>
-<span class="sourceLineNo">874</span>    } finally {<a name="line.874"></a>
-<span class="sourceLineNo">875</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.875"></a>
-<span class="sourceLineNo">876</span>      this.region = null;<a name="line.876"></a>
-<span class="sourceLineNo">877</span>      wals.close();<a name="line.877"></a>
-<span class="sourceLineNo">878</span>    }<a name="line.878"></a>
-<span class="sourceLineNo">879</span>  }<a name="line.879"></a>
-<span class="sourceLineNo">880</span><a name="line.880"></a>
-<span class="sourceLineNo">881</span>  @Test<a name="line.881"></a>
-<span class="sourceLineNo">882</span>  public void testRecoveredEditsReplayCompaction() throws Exception {<a name="line.882"></a>
-<span class="sourceLineNo">883</span>    testRecoveredEditsReplayCompaction(false);<a name="line.883"></a>
-<span class="sourceLineNo">884</span>    testRecoveredEditsReplayCompaction(true);<a name="line.884"></a>
-<span class="sourceLineNo">885</span>  }<a name="line.885"></a>
-<span class="sourceLineNo">886</span><a name="line.886"></a>
-<span class="sourceLineNo">887</span>  public void testRecoveredEditsReplayCompaction(boolean mismatchedRegionName) throws Exception {<a name="line.887"></a>
-<span class="sourceLineNo">888</span>    CONF.setClass(HConstants.REGION_IMPL, HRegionForTesting.class, Region.class);<a name="line.888"></a>
-<span class="sourceLineNo">889</span>    byte[] family = Bytes.toBytes("family");<a name="line.889"></a>
-<span class="sourceLineNo">890</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.890"></a>
-<span class="sourceLineNo">891</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.891"></a>
-<span class="sourceLineNo">892</span>    try {<a name="line.892"></a>
-<span class="sourceLineNo">893</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.893"></a>
-<span class="sourceLineNo">894</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.894"></a>
-<span class="sourceLineNo">895</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.895"></a>
-<span class="sourceLineNo">896</span><a name="line.896"></a>
-<span class="sourceLineNo">897</span>      long maxSeqId = 3;<a name="line.897"></a>
-<span class="sourceLineNo">898</span>      long minSeqId = 0;<a name="line.898"></a>
-<span class="sourceLineNo">899</span><a name="line.899"></a>
-<span class="sourceLineNo">900</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.900"></a>
-<span class="sourceLineNo">901</span>        Put put = new Put(Bytes.toBytes(i));<a name="line.901"></a>
-<span class="sourceLineNo">902</span>        put.addColumn(family, Bytes.toBytes(i), Bytes.toBytes(i));<a name="line.902"></a>
-<span class="sourceLineNo">903</span>        region.put(put);<a name="line.903"></a>
-<span class="sourceLineNo">904</span>        region.flush(true);<a name="line.904"></a>
-<span class="sourceLineNo">905</span>      }<a name="line.905"></a>
-<span class="sourceLineNo">906</span><a name="line.906"></a>
-<span class="sourceLineNo">907</span>      // this will create a region with 3 files<a name="line.907"></a>
-<span class="sourceLineNo">908</span>      assertEquals(3, region.getStore(family).getStorefilesCount());<a name="line.908"></a>
-<span class="sourceLineNo">909</span>      List&lt;Path&gt; storeFiles = new ArrayList&lt;&gt;(3);<a name="line.909"></a>
-<span class="sourceLineNo">910</span>      for (HStoreFile sf : region.getStore(family).getStorefiles()) {<a name="line.910"></a>
-<span class="sourceLineNo">911</span>        storeFiles.add(sf.getPath());<a name="line.911"></a>
-<span class="sourceLineNo">912</span>      }<a name="line.912"></a>
-<span class="sourceLineNo">913</span><a name="line.913"></a>
-<span class="sourceLineNo">914</span>      // disable compaction completion<a name="line.914"></a>
-<span class="sourceLineNo">915</span>      CONF.setBoolean("hbase.hstore.compaction.complete", false);<a name="line.915"></a>
-<span class="sourceLineNo">916</span>      region.compactStores();<a name="line.916"></a>
-<span class="sourceLineNo">917</span><a name="line.917"></a>
-<span class="sourceLineNo">918</span>      // ensure that nothing changed<a name="line.918"></a>
-<span class="sourceLineNo">919</span>      assertEquals(3, region.getStore(family).getStorefilesCount());<a name="line.919"></a>
-<span class="sourceLineNo">920</span><a name="line.920"></a>
-<span class="sourceLineNo">921</span>      // now find the compacted file, and manually add it to the recovered edits<a name="line.921"></a>
-<span class="sourceLineNo">922</span>      Path tmpDir = new Path(region.getRegionFileSystem().getTempDir(), Bytes.toString(family));<a name="line.922"></a>
-<span class="sourceLineNo">923</span>      FileStatus[] files = FSUtils.listStatus(fs, tmpDir);<a name="line.923"></a>
-<span class="sourceLineNo">924</span>      String errorMsg = "Expected to find 1 file in the region temp directory "<a name="line.924"></a>
-<span class="sourceLineNo">925</span>          + "from the compaction, could not find any";<a name="line.925"></a>
-<span class="sourceLineNo">926</span>      assertNotNull(errorMsg, files);<a name="line.926"></a>
-<span class="sourceLineNo">927</span>      assertEquals(errorMsg, 1, files.length);<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      // move the file inside region dir<a name="line.928"></a>
-<span class="sourceLineNo">929</span>      Path newFile = region.getRegionFileSystem().commitStoreFile(Bytes.toString(family),<a name="line.929"></a>
-<span class="sourceLineNo">930</span>          files[0].getPath());<a name="line.930"></a>
-<span class="sourceLineNo">931</span><a name="line.931"></a>
-<span class="sourceLineNo">932</span>      byte[] encodedNameAsBytes = this.region.getRegionInfo().getEncodedNameAsBytes();<a name="line.932"></a>
-<span class="sourceLineNo">933</span>      byte[] fakeEncodedNameAsBytes = new byte [encodedNameAsBytes.length];<a name="line.933"></a>
-<span class="sourceLineNo">934</span>      for (int i=0; i &lt; encodedNameAsBytes.length; i++) {<a name="line.934"></a>
-<span class="sourceLineNo">935</span>        // Mix the byte array to have a new encodedName<a name="line.935"></a>
-<span class="sourceLineNo">936</span>        fakeEncodedNameAsBytes[i] = (byte) (encodedNameAsBytes[i] + 1);<a name="line.936"></a>
-<span class="sourceLineNo">937</span>      }<a name="line.937"></a>
-<span class="sourceLineNo">938</span><a name="line.938"></a>
-<span class="sourceLineNo">939</span>      CompactionDescriptor compactionDescriptor = ProtobufUtil.toCompactionDescriptor(this.region<a name="line.939"></a>
-<span class="sourceLineNo">940</span>        .getRegionInfo(), mismatchedRegionName ? fakeEncodedNameAsBytes : null, family,<a name="line.940"></a>
-<span class="sourceLineNo">941</span>            storeFiles, Lists.newArrayList(newFile),<a name="line.941"></a>
-<span class="sourceLineNo">942</span>            region.getRegionFileSystem().getStoreDir(Bytes.toString(family)));<a name="line.942"></a>
-<span class="sourceLineNo">943</span><a name="line.943"></a>
-<span class="sourceLineNo">944</span>      WALUtil.writeCompactionMarker(region.getWAL(), this.region.getReplicationScope(),<a name="line.944"></a>
-<span class="sourceLineNo">945</span>          this.region.getRegionInfo(), compactionDescriptor, region.getMVCC());<a name="line.945"></a>
-<span class="sourceLineNo">946</span><a name="line.946"></a>
-<span class="sourceLineNo">947</span>      Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.947"></a>
-<span class="sourceLineNo">948</span><a name="line.948"></a>
-<span class="sourceLineNo">949</span>      Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", 1000));<a name="line.949"></a>
-<span class="sourceLineNo">950</span>      fs.create(recoveredEdits);<a name="line.950"></a>
-<span class="sourceLineNo">951</span>      WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.951"></a>
-<span class="sourceLineNo">952</span><a name="line.952"></a>
-<span class="sourceLineNo">953</span>      long time = System.nanoTime();<a name="line.953"></a>
-<span class="sourceLineNo">954</span><a name="line.954"></a>
-<span class="sourceLineNo">955</span>      writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, 10, time,<a name="line.955"></a>
-<span class="sourceLineNo">956</span>          HConstants.DEFAULT_CLUSTER_ID), WALEdit.createCompaction(region.getRegionInfo(),<a name="line.956"></a>
-<span class="sourceLineNo">957</span>          compactionDescriptor)));<a name="line.957"></a>
-<span class="sourceLineNo">958</span>      writer.close();<a name="line.958"></a>
-<span class="sourceLineNo">959</span><a name="line.959"></a>
-<span class="sourceLineNo">960</span>      // close the region now, and reopen again<a name="line.960"></a>
-<span class="sourceLineNo">961</span>      region.getTableDescriptor();<a name="line.961"></a>
-<span class="sourceLineNo">962</span>      region.getRegionInfo();<a name="line.962"></a>
-<span class="sourceLineNo">963</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.963"></a>
-<span class="sourceLineNo">964</span>      try {<a name="line.964"></a>
-<span class="sourceLineNo">965</span>        region = HRegion.openHRegion(region, null);<a name="line.965"></a>
-<span class="sourceLineNo">966</span>      } catch (WrongRegionException wre) {<a name="line.966"></a>
-<span class="sourceLineNo">967</span>        fail("Matching encoded region name should not have produced WrongRegionException");<a name="line.967"></a>
-<span class="sourceLineNo">968</span>      }<a name="line.968"></a>
-<span class="sourceLineNo">969</span><a name="line.969"></a>
-<span class="sourceLineNo">970</span>      // now check whether we have only one store file, the compacted one<a name="line.970"></a>
-<span class="sourceLineNo">971</span>      Collection&lt;HStoreFile&gt; sfs = region.getStore(family).getStorefiles();<a name="line.971"></a>
-<span class="sourceLineNo">972</span>      for (HStoreFile sf : sfs) {<a name="line.972"></a>
-<span class="sourceLineNo">973</span>        LOG.info(Objects.toString(sf.getPath()));<a name="line.973"></a>
-<span class="sourceLineNo">974</span>      }<a name="line.974"></a>
-<span class="sourceLineNo">975</span>      if (!mismatchedRegionName) {<a name="line.975"></a>
-<span class="sourceLineNo">976</span>        assertEquals(1, region.getStore(family).getStorefilesCount());<a name="line.976"></a>
-<span class="sourceLineNo">977</span>      }<a name="line.977"></a>
-<span class="sourceLineNo">978</span>      files = FSUtils.listStatus(fs, tmpDir);<a name="line.978"></a>
-<span class="sourceLineNo">979</span>      assertTrue("Expected to find 0 files inside " + tmpDir, files == null || files.length == 0);<a name="line.979"></a>
-<span class="sourceLineNo">980</span><a name="line.980"></a>
-<span class="sourceLineNo">981</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.981"></a>
-<span class="sourceLineNo">982</span>        Get get = new Get(Bytes.toBytes(i));<a name="line.982"></a>
-<span class="sourceLineNo">983</span>        Result result = region.get(get);<a name="line.983"></a>
-<span class="sourceLineNo">984</span>        byte[] value = result.getValue(family, Bytes.toBytes(i));<a name="line.984"></a>
-<span class="sourceLineNo">985</span>        assertArrayEquals(Bytes.toBytes(i), value);<a name="line.985"></a>
-<span class="sourceLineNo">986</span>      }<a name="line.986"></a>
-<span class="sourceLineNo">987</span>    } finally {<a name="line.987"></a>
-<span class="sourceLineNo">988</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.988"></a>
-<span class="sourceLineNo">989</span>      this.region = null;<a name="line.989"></a>
-<span class="sourceLineNo">990</span>      wals.close();<a name="line.990"></a>
-<span class="sourceLineNo">991</span>      CONF.setClass(HConstants.REGION_IMPL, HRegion.class, Region.class);<a name="line.991"></a>
-<span class="sourceLineNo">992</span>    }<a name="line.992"></a>
-<span class="sourceLineNo">993</span>  }<a name="line.993"></a>
-<span class="sourceLineNo">994</span><a name="line.994"></a>
-<span class="sourceLineNo">995</span>  @Test<a name="line.995"></a>
-<span class="sourceLineNo">996</span>  public void testFlushMarkers() throws Exception {<a name="line.996"></a>
-<span class="sourceLineNo">997</span>    // tests that flush markers are written to WAL and handled at recovered edits<a name="line.997"></a>
-<span class="sourceLineNo">998</span>    byte[] family = Bytes.toBytes("family");<a name="line.998"></a>
-<span class="sourceLineNo">999</span>    Path logDir = TEST_UTIL.getDataTestDirOnTestFS(method + ".log");<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>    final Configuration walConf = new Configuration(TEST_UTIL.getConfiguration());<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>    final WALFactory wals = new WALFactory(walConf, method);<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>    final WAL wal = wals.getWAL(RegionInfoBuilder.newBuilder(tableName).build());<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span><a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>    this.region = initHRegion(tableName, HConstants.EMPTY_START_ROW,<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>      HConstants.EMPTY_END_ROW, false, Durability.USE_DEFAULT, wal, family);<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>    try {<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span><a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>      long maxSeqId = 3;<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>      long minSeqId = 0;<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span><a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>        Put put = new Put(Bytes.toBytes(i));<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>        put.addColumn(family, Bytes.toBytes(i), Bytes.toBytes(i));<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>        region.put(put);<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>        region.flush(true);<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>      }<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span><a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>      // this will create a region with 3 files from flush<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>      assertEquals(3, region.getStore(family).getStorefilesCount());<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>      List&lt;String&gt; storeFiles = new ArrayList&lt;&gt;(3);<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>      for (HStoreFile sf : region.getStore(family).getStorefiles()) {<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>        storeFiles.add(sf.getPath().getName());<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>      }<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span><a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>      // now verify that the flush markers are written<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>      wal.shutdown();<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>      WAL.Reader reader = WALFactory.createReader(fs, AbstractFSWALProvider.getCurrentFileName(wal),<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>        TEST_UTIL.getConfiguration());<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>      try {<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>        List&lt;WAL.Entry&gt; flushDescriptors = new ArrayList&lt;&gt;();<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>        long lastFlushSeqId = -1;<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>        while (true) {<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>          WAL.Entry entry = reader.next();<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>          if (entry == null) {<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>            break;<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>          }<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>          Cell cell = entry.getEdit().getCells().get(0);<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>          if (WALEdit.isMetaEditFamily(cell)) {<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>            FlushDescriptor flushDesc = WALEdit.getFlushDescriptor(cell);<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>            assertNotNull(flushDesc);<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>            assertArrayEquals(tableName.getName(), flushDesc.getTableName().toByteArray());<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>            if (flushDesc.getAction() == FlushAction.START_FLUSH) {<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>              assertTrue(flushDesc.getFlushSequenceNumber() &gt; lastFlushSeqId);<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>            } else if (flushDesc.getAction() == FlushAction.COMMIT_FLUSH) {<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>              assertTrue(flushDesc.getFlushSequenceNumber() == lastFlushSeqId);<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>            }<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>            lastFlushSeqId = flushDesc.getFlushSequenceNumber();<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>            assertArrayEquals(regionName, flushDesc.getEncodedRegionName().toByteArray());<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>            assertEquals(1, flushDesc.getStoreFlushesCount()); //only one store<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>            StoreFlushDescriptor storeFlushDesc = flushDesc.getStoreFlushes(0);<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>            assertArrayEquals(family, storeFlushDesc.getFamilyName().toByteArray());<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>            assertEquals("family", storeFlushDesc.getStoreHomeDir());<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>            if (flushDesc.getAction() == FlushAction.START_FLUSH) {<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>              assertEquals(0, storeFlushDesc.getFlushOutputCount());<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>            } else {<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>              assertEquals(1, storeFlushDesc.getFlushOutputCount()); //only one file from flush<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>              assertTrue(storeFiles.contains(storeFlushDesc.getFlushOutput(0)));<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>            }<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span><a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>            flushDescriptors.add(entry);<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>          }<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>        }<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span><a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>        assertEquals(3 * 2, flushDescriptors.size()); // START_FLUSH and COMMIT_FLUSH per flush<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span><a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>        // now write those markers to the recovered edits again.<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span><a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>        Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span><a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", 1000));<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>        fs.create(recoveredEdits);<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span><a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>        for (WAL.Entry entry : flushDescriptors) {<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>          writer.append(entry);<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>        }<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>        writer.close();<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      } finally {<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>        if (null != reader) {<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>          try {<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>            reader.close();<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>          } catch (IOException exception) {<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>            LOG.warn("Problem closing wal: " + exception.getMessage());<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>            LOG.debug("exception details", exception);<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>          }<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>        }<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>      }<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span><a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>      // close the region now, and reopen again<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>      region = HRegion.openHRegion(region, null);<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span><a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>      // now check whether we have can read back the data from region<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>        Get get = new Get(Bytes.toBytes(i));<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>        Result result = region.get(get);<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>        byte[] value = result.getValue(family, Bytes.toBytes(i));<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>        assertArrayEquals(Bytes.toBytes(i), value);<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>      }<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>    } finally {<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>      this.region = null;<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>      wals.close();<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>    }<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>  }<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span><a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>  static class IsFlushWALMarker implements ArgumentMatcher&lt;WALEdit&gt; {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>    volatile FlushAction[] actions;<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>    public IsFlushWALMarker(FlushAction... actions) {<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>      this.actions = actions;<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>    }<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>    @Override<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>    public boolean matches(WALEdit edit) {<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>      List&lt;Cell&gt; cells = edit.getCells();<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>      if (cells.isEmpty()) {<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>        return false;<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>      }<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>      if (WALEdit.isMetaEditFamily(cells.get(0))) {<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>        FlushDescriptor desc;<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>        try {<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>          desc = WALEdit.getFlushDescriptor(cells.get(0));<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>        } catch (IOException e) {<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>          LOG.warn(e.toString(), e);<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>          return false;<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>        }<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>        if (desc != null) {<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>          for (FlushAction action : actions) {<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>            if (desc.getAction() == action) {<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>              return true;<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>            }<a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>          }<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>        }<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>      }<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>      return false;<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>    }<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>    public IsFlushWALMarker set(FlushAction... actions) {<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>      this.actions = actions;<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>      return this;<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>    }<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>  }<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span><a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>  @Test<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>  public void testFlushMarkersWALFail() throws Exception {<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>    // test the cases where the WAL append for flush markers fail.<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>    byte[] family = Bytes.toBytes("family");<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span><a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>    // spy an actual WAL implementation to throw exception (was not able to mock)<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>    Path logDir = TEST_UTIL.getDataTestDirOnTestFS(method + "log");<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span><a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>    final Configuration walConf = new Configuration(TEST_UTIL.getConfiguration());<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>    // Make up a WAL that we can manipulate at append time.<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    class FailAppendFlushMarkerWAL extends FSHLog {<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>      volatile FlushAction [] flushActions = null;<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span><a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>      public FailAppendFlushMarkerWAL(FileSystem fs, Path root, String logDir, Configuration conf)<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>      throws IOException {<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>        super(fs, root, logDir, conf);<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>      }<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span><a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>      @Override<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>      protected Writer createWriterInstance(Path path) throws IOException {<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>        final Writer w = super.createWriterInstance(path);<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>        return new Writer() {<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>          @Override<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>          public void close() throws IOException {<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>            w.close();<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>          }<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span><a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>          @Override<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>          public void sync(boolean forceSync) throws IOException {<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>            w.sync(forceSync);<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>          }<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span><a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>          @Override<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>          public void append(Entry entry) throws IOException {<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>            List&lt;Cell&gt; cells = entry.getEdit().getCells();<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>            if (WALEdit.isMetaEditFamily(cells.get(0))) {<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>              FlushDescriptor desc = WALEdit.getFlushDescriptor(cells.get(0));<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>              if (desc != null) {<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>                for (FlushAction flushAction: flushActions) {<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>                  if (desc.getAction().equals(flushAction)) {<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>                    throw new IOException("Failed to append flush marker! " + flushAction);<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>                  }<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>                }<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>              }<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>            }<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>            w.append(entry);<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>          }<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span><a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>          @Override<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>          public long getLength() {<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>            return w.getLength();<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>          }<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>        };<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>      }<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>    }<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>    FailAppendFlushMarkerWAL wal =<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>      new FailAppendFlushMarkerWAL(FileSystem.get(walConf), FSUtils.getRootDir(walConf),<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>        method, walConf);<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>    wal.init();<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>    this.region = initHRegion(tableName, HConstants.EMPTY_START_ROW,<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>      HConstants.EMPTY_END_ROW, false, Durability.USE_DEFAULT, wal, family);<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>    int i = 0;<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>    Put put = new Put(Bytes.toBytes(i));<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>    put.setDurability(Durability.SKIP_WAL); // have to skip mocked wal<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>    put.addColumn(family, Bytes.toBytes(i), Bytes.toBytes(i));<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>    region.put(put);<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span><a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>    // 1. Test case where START_FLUSH throws exception<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>    wal.flushActions = new FlushAction [] {FlushAction.START_FLUSH};<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span><a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>    // start cache flush will throw exception<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>    try {<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>      region.flush(true);<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>      fail("This should have thrown exception");<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>    } catch (DroppedSnapshotException unexpected) {<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>      // this should not be a dropped snapshot exception. Meaning that RS will not abort<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>      throw unexpected;<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>    } catch (IOException expected) {<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>      // expected<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>    }<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>    // The WAL is hosed now. It has two edits appended. We cannot roll the log without it<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>    // throwing a DroppedSnapshotException to force an abort. Just clean up the mess.<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>    region.close(true);<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>    wal.close();<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span><a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>    // 2. Test case where START_FLUSH succeeds but COMMIT_FLUSH will throw exception<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>    wal.flushActions = new FlushAction [] {FlushAction.COMMIT_FLUSH};<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>    wal = new FailAppendFlushMarkerWAL(FileSystem.get(walConf), FSUtils.getRootDir(walConf),<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>          method, walConf);<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>    wal.init();<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>    this.region = initHRegion(tableName, HConstants.EMPTY_START_ROW,<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>      HConstants.EMPTY_END_ROW, false, Durability.USE_DEFAULT, wal, family);<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    region.put(put);<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span><a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>    // 3. Test case where ABORT_FLUSH will throw exception.<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>    // Even if ABORT_FLUSH throws exception, we should not fail with IOE, but continue with<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>    // DroppedSnapshotException. Below COMMMIT_FLUSH will cause flush to abort<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>    wal.flushActions = new FlushAction [] {FlushAction.COMMIT_FLUSH, FlushAction.ABORT_FLUSH};<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span><a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>    try {<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>      region.flush(true);<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>      fail("This should have thrown exception");<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>    } catch (DroppedSnapshotException expected) {<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>      // we expect this exception, since we were able to write the snapshot, but failed to<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span>      // write the flush marker to WAL<a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>    } catch (IOException unexpected) {<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>      throw unexpected;<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>    }<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>  }<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span><a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>  @Test<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>  public void testGetWhileRegionClose() throws IOException {<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>    Configuration hc = initSplit();<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>    int numRows = 100;<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>    byte[][] families = { fam1, fam2, fam3 };<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span><a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>    // Setting up region<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>    this.region = initHRegion(tableName, method, hc, families);<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>    // Put data in region<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>    final int startRow = 100;<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>    putData(startRow, numRows, qual1, families);<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>    putData(startRow, numRows, qual2, families);<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>    putData(startRow, numRows, qual3, families);<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    final AtomicBoolean done = new AtomicBoolean(false);<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>    final AtomicInteger gets = new AtomicInteger(0);<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>    GetTillDoneOrException[] threads = new GetTillDoneOrException[10];<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>    try {<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>      // Set ten threads running concurrently getting from the region.<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>      for (int i = 0; i &lt; threads.length / 2; i++) {<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>        threads[i] = new GetTillDoneOrException(i, Bytes.toBytes("" + startRow), done, gets);<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>        threads[i].setDaemon(true);<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>        threads[i].start();<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span>      }<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>      // Artificially make the condition by setting closing flag explicitly.<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>      // I can't make the issue happen with a call to region.close().<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>      this.region.closing.set(true);<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>      for (int i = threads.length / 2; i &lt; threads.length; i++) {<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>        threads[i] = new GetTillDoneOrException(i, Bytes.toBytes("" + startRow), done, gets);<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>        threads[i].setDaemon(true);<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>        threads[i].start();<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>      }<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>    } finally {<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>      if (this.region != null) {<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>        HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>        this.region = null;<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>      }<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>    }<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>    done.set(true);<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>    for (GetTillDoneOrException t : threads) {<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>      try {<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>        t.join();<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>      } catch (InterruptedException e) {<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>        e.printStackTrace();<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>      }<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>      if (t.e != null) {<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>        LOG.info("Exception=" + t.e);<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>        assertFalse("Found a NPE in " + t.getName(), t.e instanceof NullPointerException);<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>      }<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>    }<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>  }<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span><a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>  /*<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>   * Thread that does get on single row until 'done' flag is flipped. If an<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>   * exception causes us to fail, it records it.<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>   */<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>  class GetTillDoneOrException extends Thread {<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>    private final Get g;<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>    private final AtomicBoolean done;<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>    private final AtomicInteger count;<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>    private Exception e;<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span><a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>    GetTillDoneOrException(final int i, final byte[] r, final AtomicBoolean d,<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>        final AtomicInteger c) {<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>      super("getter." + i);<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>      this.g = new Get(r);<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>      this.done = d;<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>      this.count = c;<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>    }<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span><a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    @Override<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span>    public void run() {<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>      while (!this.done.get()) {<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>        try {<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>          assertTrue(region.get(g).size() &gt; 0);<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>          this.count.incrementAndGet();<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>        } catch (Exception e) {<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>          this.e = e;<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>          break;<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>        }<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>      }<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>    }<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>  }<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span><a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>  /*<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>   * An involved filter test. Has multiple column families and deletes in mix.<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>   */<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>  @Test<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>  public void testWeirdCacheBehaviour() throws Exception {<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>    byte[][] FAMILIES = new byte[][] { Bytes.toBytes("trans-blob"), Bytes.toBytes("trans-type"),<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>        Bytes.toBytes("trans-date"), Bytes.toBytes("trans-tags"), Bytes.toBytes("trans-group") };<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>    this.region = initHRegion(tableName, method, CONF, FAMILIES);<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>    String value = "this is the value";<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>    String value2 = "this is some other value";<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>    String keyPrefix1 = "prefix1";<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>    String keyPrefix2 = "prefix2";<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>    String keyPrefix3 = "prefix3";<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>    putRows(this.region, 3, value, keyPrefix1);<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>    putRows(this.region, 3, value, keyPrefix2);<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>    putRows(this.region, 3, value, keyPrefix3);<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>    putRows(this.region, 3, value2, keyPrefix1);<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>    putRows(this.region, 3, value2, keyPrefix2);<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>    putRows(this.region, 3, value2, keyPrefix3);<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>    System.out.println("Checking values for key: " + keyPrefix1);<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>    assertEquals("Got back incorrect number of rows from scan", 3,<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>        getNumberOfRows(keyPrefix1, value2, this.region));<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>    System.out.println("Checking values for key: " + keyPrefix2);<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>    assertEquals("Got back incorrect number of rows from scan", 3,<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>        getNumberOfRows(keyPrefix2, value2, this.region));<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>    System.out.println("Checking values for key: " + keyPrefix3);<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>    assertEquals("Got back incorrect number of rows from scan", 3,<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>        getNumberOfRows(keyPrefix3, value2, this.region));<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>    deleteColumns(this.region, value2, keyPrefix1);<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>    deleteColumns(this.region, value2, keyPrefix2);<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>    deleteColumns(this.region, value2, keyPrefix3);<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>    System.out.println("Starting important checks.....");<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>    assertEquals("Got back incorrect number of rows from scan: " + keyPrefix1, 0,<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>        getNumberOfRows(keyPrefix1, value2, this.region));<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>    assertEquals("Got back incorrect number of rows from scan: " + keyPrefix2, 0,<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>        getNumberOfRows(keyPrefix2, value2, this.region));<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>    assertEquals("Got back incorrect number of rows from scan: " + keyPrefix3, 0,<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>        getNumberOfRows(keyPrefix3, value2, this.region));<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>  }<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span><a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>  @Test<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>  public void testAppendWithReadOnlyTable() throws Exception {<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>    this.region = initHRegion(tableName, method, CONF, true, Bytes.toBytes("somefamily"));<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span>    boolean exceptionCaught = false;<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>    Append append = new Append(Bytes.toBytes("somerow"));<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>    append.setDurability(Durability.SKIP_WAL);<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>    append.addColumn(Bytes.toBytes("somefamily"), Bytes.toBytes("somequalifier"),<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>        Bytes.toBytes("somevalue"));<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>    try {<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>      region.append(append);<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>    } catch (IOException e) {<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>      exceptionCaught = true;<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>    }<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>    assertTrue(exceptionCaught == true);<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>  }<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span><a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>  @Test<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>  public void testIncrWithReadOnlyTable() throws Exception {<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>    this.region = initHRegion(tableName, method, CONF, true, Bytes.toBytes("somefamily"));<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>    boolean exceptionCaught = false;<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>    Increment inc = new Increment(Bytes.toBytes("somerow"));<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>    inc.setDurability(Durability.SKIP_WAL);<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>    inc.addColumn(Bytes.toBytes("somefamily"), Bytes.toBytes("somequalifier"), 1L);<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>    try {<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>      region.increment(inc);<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>    } catch (IOException e) {<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>      exceptionCaught = true;<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>    }<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>    assertTrue(exceptionCaught == true);<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>  }<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span><a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>  private void deleteColumns(HRegion r, String value, String keyPrefix) throws IOException {<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>    InternalScanner scanner = buildScanner(keyPrefix, value, r);<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>    int count = 0;<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>    boolean more = false;<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>    do {<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>      more = scanner.next(results);<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>      if (results != null &amp;&amp; !results.isEmpty())<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>        count++;<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>      else<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>        break;<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>      Delete delete = new Delete(CellUtil.cloneRow(results.get(0)));<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>      delete.addColumn(Bytes.toBytes("trans-tags"), Bytes.toBytes("qual2"));<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>      r.delete(delete);<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>      results.clear();<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>    } while (more);<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>    assertEquals("Did not perform correct number of deletes", 3, count);<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>  }<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span><a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>  private int getNumberOfRows(String keyPrefix, String value, HRegion r) throws Exception {<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>    InternalScanner resultScanner = buildScanner(keyPrefix, value, r);<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>    int numberOfResults = 0;<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>    boolean more = false;<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>    do {<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>      more = resultScanner.next(results);<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>      if (results != null &amp;&amp; !results.isEmpty())<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>        numberOfResults++;<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>      else<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>        break;<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>      for (Cell kv : results) {<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>        System.out.println("kv=" + kv.toString() + ", " + Bytes.toString(CellUtil.cloneValue(kv)));<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>      }<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>      results.clear();<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>    } while (more);<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>    return numberOfResults;<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>  }<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span><a name="line.1451"></a>
-<span class="sourceLineNo">1452</span>  private InternalScanner buildScanner(String keyPrefix, String value, HRegion r)<a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>      throws IOException {<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>    // Defaults FilterList.Operator.MUST_PASS_ALL.<a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>    FilterList allFilters = new FilterList();<a name="line.1455"></a>
-<span class="sourceLineNo">1456</span>    allFilters.addFilter(new PrefixFilter(Bytes.toBytes(keyPrefix)));<a name="line.1456"></a>
-<span class="sourceLineNo">1457</span>    // Only return rows where this column value exists in the row.<a name="line.1457"></a>
-<span class="sourceLineNo">1458</span>    SingleColumnValueFilter filter = new SingleColumnValueFilter(Bytes.toBytes("trans-tags"),<a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>        Bytes.toBytes("qual2"), CompareOperator.EQUAL, Bytes.toBytes(value));<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>    filter.setFilterIfMissing(true);<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>    allFilters.addFilter(filter);<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span>    Scan scan = new Scan();<a name="line.1462"></a>
-<span class="sourceLineNo">1463</span>    scan.addFamily(Bytes.toBytes("trans-blob"));<a name="line.1463"></a>
-<span class="sourceLineNo">1464</span>    scan.addFamily(Bytes.toBytes("trans-type"));<a name="line.1464"></a>
-<span class="sourceLineNo">1465</span>    scan.addFamily(Bytes.toBytes("trans-date"));<a name="line.1465"></a>
-<span class="sourceLineNo">1466</span>    scan.addFamily(Bytes.toBytes("trans-tags"));<a name="line.1466"></a>
-<span class="sourceLineNo">1467</span>    scan.addFamily(Bytes.toBytes("trans-group"));<a name="line.1467"></a>
-<span class="sourceLineNo">1468</span>    scan.setFilter(allFilters);<a name="line.1468"></a>
-<span class="sourceLineNo">1469</span>    return r.getScanner(scan);<a name="line.1469"></a>
-<span class="sourceLineNo">1470</span>  }<a name="line.1470"></a>
-<span class="sourceLineNo">1471</span><a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>  private void putRows(HRegion r, int numRows, String value, String key) throws IOException {<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span>    for (int i = 0; i &lt; numRows; i++) {<a name="line.1473"></a>
-<span class="sourceLineNo">1474</span>      String row = key + "_" + i/* UUID.randomUUID().toString() */;<a name="line.1474"></a>
-<span class="sourceLineNo">1475</span>      System.out.println(String.format("Saving row: %s, with value %s", row, value));<a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>      Put put = new Put(Bytes.toBytes(row));<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>      put.setDurability(Durability.SKIP_WAL);<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span>      put.addColumn(Bytes.toBytes("trans-blob"), null, Bytes.toBytes("value for blob"));<a name="line.1478"></a>
-<span class="sourceLineNo">1479</span>      put.addColumn(Bytes.toBytes("trans-type"), null, Bytes.toBytes("statement"));<a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>      put.addColumn(Bytes.toBytes("trans-date"), null, Bytes.toBytes("20090921010101999"));<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>      put.addColumn(Bytes.toBytes("trans-tags"), Bytes.toBytes("qual2"), Bytes.toBytes(value));<a name="line.1481"></a>
-<span class="sourceLineNo">1482</span>      put.addColumn(Bytes.toBytes("trans-group"), null, Bytes.toBytes("adhocTransactionGroupId"));<a name="line.1482"></a>
-<span class="sourceLineNo">1483</span>      r.put(put);<a name="line.1483"></a>
-<span class="sourceLineNo">1484</span>    }<a name="line.1484"></a>
-<span class="sourceLineNo">1485</span>  }<a name="line.1485"></a>
-<span class="sourceLineNo">1486</span><a name="line.1486"></a>
-<span class="sourceLineNo">1487</span>  @Test<a name="line.1487"></a>
-<span class="sourceLineNo">1488</span>  public void testFamilyWithAndWithoutColon() throws Exception {<a name="line.1488"></a>
-<span class="sourceLineNo">1489</span>    byte[] cf = Bytes.toBytes(COLUMN_FAMILY);<a name="line.1489"></a>
-<span class="sourceLineNo">1490</span>    this.region = initHRegion(tableName, method, CONF, cf);<a name="line.1490"></a>
-<span class="sourceLineNo">1491</span>    Put p = new Put(tableName.toBytes());<a name="line.1491"></a>
-<span class="sourceLineNo">1492</span>    byte[] cfwithcolon = Bytes.toBytes(COLUMN_FAMILY + ":");<a name="line.1492"></a>
-<span class="sourceLineNo">1493</span>    p.addColumn(cfwithcolon, cfwithcolon, cfwithcolon);<a name="line.1493"></a>
-<span class="sourceLineNo">1494</span>    boolean exception = false;<a name="line.1494"></a>
-<span class="sourceLineNo">1495</span>    try {<a name="line.1495"></a>
-<span class="sourceLineNo">1496</span>      this.region.put(p);<a name="line.1496"></a>
-<span class="sourceLineNo">1497</span>    } catch (NoSuchColumnFamilyException e) {<a name="line.1497"></a>
-<span class="sourceLineNo">1498</span>      exception = true;<a name="line.1498"></a>
-<span class="sourceLineNo">1499</span>    }<a name="line.1499"></a>
-<span class="sourceLineNo">1500</span>    assertTrue(exception);<a name="line.1500"></a>
-<span class="sourceLineNo">1501</span>  }<a name="line.1501"></a>
-<span class="sourceLineNo">1502</span><a name="line.1502"></a>
-<span class="sourceLineNo">1503</span>  @Test<a name="line.1503"></a>
-<span class="sourceLineNo">1504</span>  public void testBatchPut_whileNoRowLocksHeld() throws IOException {<a name="line.1504"></a>
-<span class="sourceLineNo">1505</span>    final Put[] puts = new Put[10];<a name="line.1505"></a>
-<span class="sourceLineNo">1506</span>    MetricsWALSource source = CompatibilitySingletonFactory.getInstance(MetricsWALSource.class);<a name="line.1506"></a>
-<span class="sourceLineNo">1507</span>    long syncs = prepareRegionForBachPut(puts, source, false);<a name="line.1507"></a>
-<span class="sourceLineNo">1508</span><a name="line.1508"></a>
-<span class="sourceLineNo">1509</span>    OperationStatus[] codes = this.region.batchMutate(puts);<a name="line.1509"></a>
-<span class="sourceLineNo">1510</span>    assertEquals(10, codes.length);<a name="line.1510"></a>
-<span class="sourceLineNo">1511</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.1511"></a>
-<span class="sourceLineNo">1512</span>      assertEquals(OperationStatusCode.SUCCESS, codes[i].getOperationStatusCode());<a name="line.1512"></a>
-<span class="sourceLineNo">1513</span>    }<a name="line.1513"></a>
-<span class="sourceLineNo">1514</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs + 1, source);<a name="line.1514"></a>
-<span class="sourceLineNo">1515</span><a name="line.1515"></a>
-<span class="sourceLineNo">1516</span>    LOG.info("Next a batch put with one invalid family");<a name="line.1516"></a>
-<span class="sourceLineNo">1517</span>    puts[5].addColumn(Bytes.toBytes("BAD_CF"), qual, value);<a name="line.1517"></a>
-<span class="sourceLineNo">1518</span>    codes = this.region.batchMutate(puts);<a name="line.1518"></a>
-<span class="sourceLineNo">1519</span>    assertEquals(10, codes.length);<a name="line.1519"></a>
-<span class="sourceLineNo">1520</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.1520"></a>
-<span class="sourceLineNo">1521</span>      assertEquals((i == 5) ? OperationStatusCode.BAD_FAMILY : OperationStatusCode.SUCCESS,<a name="line.1521"></a>
-<span class="sourceLineNo">1522</span>          codes[i].getOperationStatusCode());<a name="line.1522"></a>
-<span class="sourceLineNo">1523</span>    }<a name="line.1523"></a>
-<span class="sourceLineNo">1524</span><a name="line.1524"></a>
-<span class="sourceLineNo">1525</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs + 2, source);<a name="line.1525"></a>
-<span class="sourceLineNo">1526</span>  }<a name="line.1526"></a>
-<span class="sourceLineNo">1527</span><a name="line.1527"></a>
-<span class="sourceLineNo">1528</span>  @Test<a name="line.1528"></a>
-<span class="sourceLineNo">1529</span>  public void testBatchPut_whileMultipleRowLocksHeld() throws Exception {<a name="line.1529"></a>
-<span class="sourceLineNo">1530</span>    final Put[] puts = new Put[10];<a name="line.1530"></a>
-<span class="sourceLineNo">1531</span>    MetricsWALSource source = CompatibilitySingletonFactory.getInstance(MetricsWALSource.class);<a name="line.1531"></a>
-<span class="sourceLineNo">1532</span>    long syncs = prepareRegionForBachPut(puts, source, false);<a name="line.1532"></a>
-<span class="sourceLineNo">1533</span><a name="line.1533"></a>
-<span class="sourceLineNo">1534</span>    puts[5].addColumn(Bytes.toBytes("BAD_CF"), qual, value);<a name="line.1534"></a>
-<span class="sourceLineNo">1535</span><a name="line.1535"></a>
-<span class="sourceLineNo">1536</span>    LOG.info("batchPut will have to break into four batches to avoid row locks");<a name="line.1536"></a>
-<span class="sourceLineNo">1537</span>    RowLock rowLock1 = region.getRowLock(Bytes.toBytes("row_2"));<a name="line.1537"></a>
-<span class="sourceLineNo">1538</span>    RowLock rowLock2 = region.getRowLock(Bytes.toBytes("row_1"));<a name="line.1538"></a>
-<span class="sourceLineNo">1539</span>    RowLock rowLock3 = region.getRowLock(Bytes.toBytes("row_3"));<a name="line.1539"></a>
-<span class="sourceLineNo">1540</span>    RowLock rowLock4 = region.getRowLock(Bytes.toBytes("row_3"), true);<a name="line.1540"></a>
-<span class="sourceLineNo">1541</span><a name="line.1541"></a>
-<span class="sourceLineNo">1542</span>    MultithreadedTestUtil.TestContext ctx = new MultithreadedTestUtil.TestContext(CONF);<a name="line.1542"></a>
-<span class="sourceLineNo">1543</span>    final AtomicReference&lt;OperationStatus[]&gt; retFromThread = new AtomicReference&lt;&gt;();<a name="line.1543"></a>
-<span class="sourceLineNo">1544</span>    final CountDownLatch startingPuts = new CountDownLatch(1);<a name="line.1544"></a>
-<span class="sourceLineNo">1545</span>    final CountDownLatch startingClose = new CountDownLatch(1);<a name="line.1545"></a>
-<span class="sourceLineNo">1546</span>    TestThread putter = new TestThread(ctx) {<a name="line.1546"></a>
-<span class="sourceLineNo">1547</span>      @Override<a name="line.1547"></a>
-<span class="sourceLineNo">1548</span>      public void doWork() throws IOException {<a name="line.1548"></a>
-<span class="sourceLineNo">1549</span>        startingPuts.countDown();<a name="line.1549"></a>
-<span class="sourceLineNo">1550</span>        retFromThread.set(region.batchMutate(puts));<a name="line.1550"></a>
-<span class="sourceLineNo">1551</span>      }<a name="line.1551"></a>
-<span class="sourceLineNo">1552</span>    };<a name="line.1552"></a>
-<span class="sourceLineNo">1553</span>    LOG.info("...starting put thread while holding locks");<a name="line.1553"></a>
-<span class="sourceLineNo">1554</span>    ctx.addThread(putter);<a name="line.1554"></a>
-<span class="sourceLineNo">1555</span>    ctx.startThreads();<a name="line.1555"></a>
-<span class="sourceLineNo">1556</span><a name="line.1556"></a>
-<span class="sourceLineNo">1557</span>    // Now attempt to close the region from another thread.  Prior to HBASE-12565<a name="line.1557"></a>
-<span class="sourceLineNo">1558</span>    // this would cause the in-progress batchMutate operation to to fail with<a name="line.1558"></a>
-<span class="sourceLineNo">1559</span>    // exception because it use to release and re-acquire the close-guard lock<a name="line.1559"></a>
-<span class="sourceLineNo">1560</span>    // between batches.  Caller then didn't get status indicating which writes succeeded.<a name="line.1560"></a>
-<span class="sourceLineNo">1561</span>    // We now expect this thread to block until the batchMutate call finishes.<a name="line.1561"></a>
-<span class="sourceLineNo">1562</span>    Thread regionCloseThread = new TestThread(ctx) {<a name="line.1562"></a>
-<span class="sourceLineNo">1563</span>      @Override<a name="line.1563"></a>
-<span class="sourceLineNo">1564</span>      public void doWork() {<a name="line.1564"></a>
-<span class="sourceLineNo">1565</span>        try {<a name="line.1565"></a>
-<span class="sourceLineNo">1566</span>          startingPuts.await();<a name="line.1566"></a>
-<span class="sourceLineNo">1567</span>          // Give some time for the batch mutate to get in.<a name="line.1567"></a>
-<span class="sourceLineNo">1568</span>          // We don't want to race with the mutate<a name="line.1568"></a>
-<span class="sourceLineNo">1569</span>          Thread.sleep(10);<a name="line.1569"></a>
-<span class="sourceLineNo">1570</span>          startingClose.countDown();<a name="line.1570"></a>
-<span class="sourceLineNo">1571</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.1571"></a>
-<span class="sourceLineNo">1572</span>          region = null;<a name="line.1572"></a>
-<span class="sourceLineNo">1573</span>        } catch (IOException e) {<a name="line.1573"></a>
-<span class="sourceLineNo">1574</span>          throw new RuntimeException(e);<a name="line.1574"></a>
-<span class="sourceLineNo">1575</span>        } catch (InterruptedException e) {<a name="line.1575"></a>
-<span class="sourceLineNo">1576</span>          throw new RuntimeException(e);<a name="line.1576"></a>
-<span class="sourceLineNo">1577</span>        }<a name="line.1577"></a>
-<span class="sourceLineNo">1578</span>      }<a name="line.1578"></a>
-<span class="sourceLineNo">1579</span>    };<a name="line.1579"></a>
-<span class="sourceLineNo">1580</span>    regionCloseThread.start();<a name="line.1580"></a>
-<span class="sourceLineNo">1581</span><a name="line.1581"></a>
-<span class="sourceLineNo">1582</span>    startingClose.await();<a name="line.1582"></a>
-<span class="sourceLineNo">1583</span>    startingPuts.await();<a name="line.1583"></a>
-<span class="sourceLineNo">1584</span>    Thread.sleep(100);<a name="line.1584"></a>
-<span class="sourceLineNo">1585</span>    LOG.info("...releasing row lock 1, which should let put thread continue");<a name="line.1585"></a>
-<span class="sourceLineNo">1586</span>    rowLock1.release();<a name="line.1586"></a>
-<span class="sourceLineNo">1587</span>    rowLock2.release();<a name="line.1587"></a>
-<span class="sourceLineNo">1588</span>    rowLock3.release();<a name="line.1588"></a>
-<span class="sourceLineNo">1589</span>    waitForCounter(source, "syncTimeNumOps", syncs + 1);<a name="line.1589"></a>
-<span class="sourceLineNo">1590</span><a name="line.1590"></a>
-<span class="sourceLineNo">1591</span>    LOG.info("...joining on put thread");<a name="line.1591"></a>
-<span class="sourceLineNo">1592</span>    ctx.stop();<a name="line.1592"></a>
-<span class="sourceLineNo">1593</span>    regionCloseThread.join();<a name="line.1593"></a>
-<span class="sourceLineNo">1594</span><a name="line.1594"></a>
-<span class="sourceLineNo">1595</span>    OperationStatus[] codes = retFromThread.get();<a name="line.1595"></a>
-<span class="sourceLineNo">1596</span>    for (int i = 0; i &lt; codes.length; i++) {<a name="line.1596"></a>
-<span class="sourceLineNo">1597</span>      assertEquals((i == 5) ? OperationStatusCode.BAD_FAMILY : OperationStatusCode.SUCCESS,<a name="line.1597"></a>
-<span class="sourceLineNo">1598</span>          codes[i].getOperationStatusCode());<a name="line.1598"></a>
-<span class="sourceLineNo">1599</span>    }<a name="line.1599"></a>
-<span class="sourceLineNo">1600</span>    rowLock4.release();<a name="line.1600"></a>
-<span class="sourceLineNo">1601</span>  }<a name="line.1601"></a>
-<span class="sourceLineNo">1602</span><a name="line.1602"></a>
-<span class="sourceLineNo">1603</span>  private void waitForCounter(MetricsWALSource source, String metricName, long expectedCount)<a name="line.1603"></a>
-<span class="sourceLineNo">1604</span>      throws InterruptedException {<a name="line.1604"></a>
-<span class="sourceLineNo">1605</span>    long startWait = System.currentTimeMillis();<a name="line.1605"></a>
-<span class="sourceLineNo">1606</span>    long currentCount;<a name="line.1606"></a>
-<span class="sourceLineNo">1607</span>    while ((currentCount = metricsAssertHelper.getCounter(metricName, source)) &lt; expectedCount) {<a name="line.1607"></a>
-<span class="sourceLineNo">1608</span>      Thread.sleep(100);<a name="line.1608"></a>
-<span class="sourceLineNo">1609</span>      if (System.currentTimeMillis() - startWait &gt; 10000) {<a name="line.1609"></a>
-<span class="sourceLineNo">1610</span>        fail(String.format("Timed out waiting for '%s' &gt;= '%s', currentCount=%s", metricName,<a name="line.1610"></a>
-<span class="sourceLineNo">1611</span>            expectedCount, currentCount));<a name="line.1611"></a>
-<span class="sourceLineNo">1612</span>      }<a name="line.1612"></a>
-<span class="sourceLineNo">1613</span>    }<a name="line.1613"></a>
-<span class="sourceLineNo">1614</span>  }<a name="line.1614"></a>
-<span class="sourceLineNo">1615</span><a name="line.1615"></a>
-<span class="sourceLineNo">1616</span>  @Test<a name="line.1616"></a>
-<span class="sourceLineNo">1617</span>  public void testAtomicBatchPut() throws IOException {<a name="line.1617"></a>
-<span class="sourceLineNo">1618</span>    final Put[] puts = new Put[10];<a name="line.1618"></a>
-<span class="sourceLineNo">1619</span>    MetricsWALSource source = CompatibilitySingletonFactory.getInstance(MetricsWALSource.class);<a name="line.1619"></a>
-<span class="sourceLineNo">1620</span>    long syncs = prepareRegionForBachPut(puts, source, false);<a name="line.1620"></a>
-<span class="sourceLineNo">1621</span><a name="line.1621"></a>
-<span class="sourceLineNo">1622</span>    // 1. Straight forward case, should succeed<a name="line.1622"></a>
-<span class="sourceLineNo">1623</span>    MutationBatchOperation batchOp = new MutationBatchOperation(region, puts, true,<a name="line.1623"></a>
-<span class="sourceLineNo">1624</span>        HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.1624"></a>
-<span class="sourceLineNo">1625</span>    OperationStatus[] codes = this.region.batchMutate(batchOp);<a name="line.1625"></a>
-<span class="sourceLineNo">1626</span>    assertEquals(10, codes.length);<a name="line.1626"></a>
-<span class="sourceLineNo">1627</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.1627"></a>
-<span class="sourceLineNo">1628</span>      assertEquals(OperationStatusCode.SUCCESS, codes[i].getOperationStatusCode());<a name="line.1628"></a>
-<span class="sourceLineNo">1629</span>    }<a name="line.1629"></a>
-<span class="sourceLineNo">1630</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs + 1, source);<a name="line.1630"></a>
-<span class="sourceLineNo">1631</span><a name="line.1631"></a>
-<span class="sourceLineNo">1632</span>    // 2. Failed to get lock<a name="line.1632"></a>
-<span class="sourceLineNo">1633</span>    RowLock lock = region.getRowLock(Bytes.toBytes("row_" + 3));<a name="line.1633"></a>
-<span class="sourceLineNo">1634</span>    // Method {@link HRegion#getRowLock(byte[])} is reentrant. As 'row_3' is locked in this<a name="line.1634"></a>
-<span class="sourceLineNo">1635</span>    // thread, need to run {@link HRegion#batchMutate(HRegion.BatchOperation)} in different thread<a name="line.1635"></a>
-<span class="sourceLineNo">1636</span>    MultithreadedTestUtil.TestContext ctx = new MultithreadedTestUtil.TestContext(CONF);<a name="line.1636"></a>
-<span class="sourceLineNo">1637</span>    final AtomicReference&lt;IOException&gt; retFromThread = new AtomicReference&lt;&gt;();<a name="line.1637"></a>
-<span class="sourceLineNo">1638</span>    final CountDownLatch finishedPuts = new CountDownLatch(1);<a name="line.1638"></a>
-<span class="sourceLineNo">1639</span>    final MutationBatchOperation finalBatchOp = new MutationBatchOperation(region, puts, true,<a name="line.1639"></a>
-<span class="sourceLineNo">1640</span>        HConstants<a name="line.1640"></a>
-<span class="sourceLineNo">1641</span>        .NO_NONCE,<a name="line.1641"></a>
-<span class="sourceLineNo">1642</span>        HConstants.NO_NONCE);<a name="line.1642"></a>
-<span class="sourceLineNo">1643</span>    TestThread putter = new TestThread(ctx) {<a name="line.1643"></a>
-<span class="sourceLineNo">1644</span>      @Override<a name="line.1644"></a>
-<span class="sourceLineNo">1645</span>      public void doWork() throws IOException {<a name="line.1645"></a>
-<span class="sourceLineNo">1646</span>        try {<a name="line.1646"></a>
-<span class="sourceLineNo">1647</span>          region.batchMutate(finalBatchOp);<a name="line.1647"></a>
-<span class="sourceLineNo">1648</span>        } catch (IOException ioe) {<a name="line.1648"></a>
-<span class="sourceLineNo">1649</span>          LOG.error("test failed!", ioe);<a name="line.1649"></a>
-<span class="sourceLineNo">1650</span>          retFromThread.set(ioe);<a name="line.1650"></a>
-<span class="sourceLineNo">1651</span>        }<a name="line.1651"></a>
-<span class="sourceLineNo">1652</span>        finishedPuts.countDown();<a name="line.1652"></a>
-<span class="sourceLineNo">1653</span>      }<a name="line.1653"></a>
-<span class="sourceLineNo">1654</span>    };<a name="line.1654"></a>
-<span class="sourceLineNo">1655</span>    LOG.info("...starting put thread while holding locks");<a name="line.1655"></a>
-<span class="sourceLineNo">1656</span>    ctx.addThread(putter);<a name="line.1656"></a>
-<span class="sourceLineNo">1657</span>    ctx.startThreads();<a name="line.1657"></a>
-<span class="sourceLineNo">1658</span>    LOG.info("...waiting for batch puts while holding locks");<a name="line.1658"></a>
-<span class="sourceLineNo">1659</span>    try {<a name="line.1659"></a>
-<span class="sourceLineNo">1660</span>      finishedPuts.await();<a name="line.1660"></a>
-<span class="sourceLineNo">1661</span>    } catch (InterruptedException e) {<a name="line.1661"></a>
-<span class="sourceLineNo">1662</span>      LOG.error("Interrupted!", e);<a name="line.1662"></a>
-<span class="sourceLineNo">1663</span>    } finally {<a name="line.1663"></a>
-<span class="sourceLineNo">1664</span>      if (lock != null) {<a name="line.1664"></a>
-<span class="sourceLineNo">1665</span>        lock.release();<a name="line.1665"></a>
-<span class="sourceLineNo">1666</span>      }<a name="line.1666"></a>
-<span class="sourceLineNo">1667</span>    }<a name="line.1667"></a>
-<span class="sourceLineNo">1668</span>    assertNotNull(retFromThread.get());<a name="line.1668"></a>
-<span class="sourceLineNo">1669</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs + 1, source);<a name="line.1669"></a>
-<span class="sourceLineNo">1670</span><a name="line.1670"></a>
-<span class="sourceLineNo">1671</span>    // 3. Exception thrown in validation<a name="line.1671"></a>
-<span class="sourceLineNo">1672</span>    LOG.info("Next a batch put with one invalid family");<a name="line.1672"></a>
-<span class="sourceLineNo">1673</span>    puts[5].addColumn(Bytes.toBytes("BAD_CF"), qual, value);<a name="line.1673"></a>
-<span class="sourceLineNo">1674</span>    batchOp = new MutationBatchOperation(region, puts, true, HConstants.NO_NONCE,<a name="line.1674"></a>
-<span class="sourceLineNo">1675</span>        HConstants.NO_NONCE);<a name="line.1675"></a>
-<span class="sourceLineNo">1676</span>    thrown.expect(NoSuchColumnFamilyException.class);<a name="line.1676"></a>
-<span class="sourceLineNo">1677</span>    this.region.batchMutate(batchOp);<a name="line.1677"></a>
-<span class="sourceLineNo">1678</span>  }<a name="line.1678"></a>
-<span class="sourceLineNo">1679</span><a name="line.1679"></a>
-<span class="sourceLineNo">1680</span>  @Test<a name="line.1680"></a>
-<span class="sourceLineNo">1681</span>  public void testBatchPutWithTsSlop() throws Exception {<a name="line.1681"></a>
-<span class="sourceLineNo">1682</span>    // add data with a timestamp that is too recent for range. Ensure assert<a name="line.1682"></a>
-<span class="sourceLineNo">1683</span>    CONF.setInt("hbase.hregion.keyvalue.timestamp.slop.millisecs", 1000);<a name="line.1683"></a>
-<span class="sourceLineNo">1684</span>    final Put[] puts = new Put[10];<a name="line.1684"></a>
-<span class="sourceLineNo">1685</span>    MetricsWALSource source = CompatibilitySingletonFactory.getInstance(MetricsWALSource.class);<a name="line.1685"></a>
-<span class="sourceLineNo">1686</span><a name="line.1686"></a>
-<span class="sourceLineNo">1687</span>    long syncs = prepareRegionForBachPut(puts, source, true);<a name="line.1687"></a>
-<span class="sourceLineNo">1688</span><a name="line.1688"></a>
-<span class="sourceLineNo">1689</span>    OperationStatus[] codes = this.region.batchMutate(puts);<a name="line.1689"></a>
-<span class="sourceLineNo">1690</span>    assertEquals(10, codes.length);<a name="line.1690"></a>
-<span class="sourceLineNo">1691</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.1691"></a>
-<span class="sourceLineNo">1692</span>      assertEquals(OperationStatusCode.SANITY_CHECK_FAILURE, codes[i].getOperationStatusCode());<a name="line.1692"></a>
-<span class="sourceLineNo">1693</span>    }<a name="line.1693"></a>
-<span class="sourceLineNo">1694</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs, source);<a name="line.1694"></a>
-<span class="sourceLineNo">1695</span>  }<a name="line.1695"></a>
-<span class="sourceLineNo">1696</span><a name="line.1696"></a>
-<span class="sourceLineNo">1697</span>  /**<a name="line.1697"></a>
-<span class="sourceLineNo">1698</span>   * @return syncs initial syncTimeNumOps<a name="line.1698"></a>
-<span class="sourceLineNo">1699</span>   */<a name="line.1699"></a>
-<span class="sourceLineNo">1700</span>  private long prepareRegionForBachPut(final Put[] puts, final MetricsWALSource source,<a name="line.1700"></a>
-<span class="sourceLineNo">1701</span>      boolean slop) throws IOException {<a name="line.1701"></a>
-<span class="sourceLineNo">1702</span>    this.region = initHRegion(tableName, method, CONF, COLUMN_FAMILY_BYTES);<a name="line.1702"></a>
-<span class="sourceLineNo">1703</span><a name="line.1703"></a>
-<span class="sourceLineNo">1704</span>    LOG.info("First a batch put with all valid puts");<a name="line.1704"></a>
-<span class="sourceLineNo">1705</span>    for (int i = 0; i &lt; puts.length; i++) {<a name="line.1705"></a>
-<span class="sourceLineNo">1706</span>      puts[i] = slop ? new Put(Bytes.toBytes("row_" + i), Long.MAX_VALUE - 100) :<a name="line.1706"></a>
-<span class="sourceLineNo">1707</span>          new Put(Bytes.toBytes("row_" + i));<a name="line.1707"></a>
-<span class="sourceLineNo">1708</span>      puts[i].addColumn(COLUMN_FAMILY_BYTES, qual, value);<a name="line.1708"></a>
-<span class="sourceLineNo">1709</span>    }<a name="line.1709"></a>
-<span class="sourceLineNo">1710</span><a name="line.1710"></a>
-<span class="sourceLineNo">1711</span>    long syncs = metricsAssertHelper.getCounter("syncTimeNumOps", source);<a name="line.1711"></a>
-<span class="sourceLineNo">1712</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs, source);<a name="line.1712"></a>
-<span class="sourceLineNo">1713</span>    return syncs;<a name="line.1713"></a>
-<span class="sourceLineNo">1714</span>  }<a name="line.1714"></a>
-<span class="sourceLineNo">1715</span><a name="line.1715"></a>
-<span class="sourceLineNo">1716</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.1716"></a>
-<span class="sourceLineNo">1717</span>  // checkAndMutate tests<a name="line.1717"></a>
-<span class="sourceLineNo">1718</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.1718"></a>
-<span class="sourceLineNo">1719</span>  @Test<a name="line.1719"></a>
-<span class="sourceLineNo">1720</span>  public void testCheckAndMutate_WithEmptyRowValue() throws IOException {<a name="line.1720"></a>
-<span class="sourceLineNo">1721</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1721"></a>
-<span class="sourceLineNo">1722</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1722"></a>
-<span class="sourceLineNo">1723</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1723"></a>
-<span class="sourceLineNo">1724</span>    byte[] emptyVal = new byte[] {};<a name="line.1724"></a>
-<span class="sourceLineNo">1725</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1725"></a>
-<span class="sourceLineNo">1726</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.1726"></a>
-<span class="sourceLineNo">1727</span><a name="line.1727"></a>
-<span class="sourceLineNo">1728</span>    // Setting up region<a name="line.1728"></a>
-<span class="sourceLineNo">1729</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.1729"></a>
-<span class="sourceLineNo">1730</span>    // Putting empty data in key<a name="line.1730"></a>
-<span class="sourceLineNo">1731</span>    Put put = new Put(row1);<a name="line.1731"></a>
-<span class="sourceLineNo">1732</span>    put.addColumn(fam1, qf1, emptyVal);<a name="line.1732"></a>
-<span class="sourceLineNo">1733</span><a name="line.1733"></a>
-<span class="sourceLineNo">1734</span>    // checkAndPut with empty value<a name="line.1734"></a>
-<span class="sourceLineNo">1735</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1735"></a>
-<span class="sourceLineNo">1736</span>        new BinaryComparator(emptyVal), put);<a name="line.1736"></a>
-<span class="sourceLineNo">1737</span>    assertTrue(res);<a name="line.1737"></a>
-<span class="sourceLineNo">1738</span><a name="line.1738"></a>
-<span class="sourceLineNo">1739</span>    // Putting data in key<a name="line.1739"></a>
-<span class="sourceLineNo">1740</span>    put = new Put(row1);<a name="line.1740"></a>
-<span class="sourceLineNo">1741</span>    put.addColumn(fam1, qf1, val1);<a name="line.1741"></a>
-<span class="sourceLineNo">1742</span><a name="line.1742"></a>
-<span class="sourceLineNo">1743</span>    // checkAndPut with correct value<a name="line.1743"></a>
-<span class="sourceLineNo">1744</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1744"></a>
-<span class="sourceLineNo">1745</span>        new BinaryComparator(emptyVal), put);<a name="line.1745"></a>
-<span class="sourceLineNo">1746</span>    assertTrue(res);<a name="line.1746"></a>
-<span class="sourceLineNo">1747</span><a name="line.1747"></a>
-<span class="sourceLineNo">1748</span>    // not empty anymore<a name="line.1748"></a>
-<span class="sourceLineNo">1749</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1749"></a>
-<span class="sourceLineNo">1750</span>        new BinaryComparator(emptyVal), put);<a name="line.1750"></a>
-<span class="sourceLineNo">1751</span>    assertFalse(res);<a name="line.1751"></a>
-<span class="sourceLineNo">1752</span><a name="line.1752"></a>
-<span class="sourceLineNo">1753</span>    Delete delete = new Delete(row1);<a name="line.1753"></a>
-<span class="sourceLineNo">1754</span>    delete.addColumn(fam1, qf1);<a name="line.1754"></a>
-<span class="sourceLineNo">1755</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1755"></a>
-<span class="sourceLineNo">1756</span>        new BinaryComparator(emptyVal), delete);<a name="line.1756"></a>
-<span class="sourceLineNo">1757</span>    assertFalse(res);<a name="line.1757"></a>
-<span class="sourceLineNo">1758</span><a name="line.1758"></a>
-<span class="sourceLineNo">1759</span>    put = new Put(row1);<a name="line.1759"></a>
-<span class="sourceLineNo">1760</span>    put.addColumn(fam1, qf1, val2);<a name="line.1760"></a>
-<span class="sourceLineNo">1761</span>    // checkAndPut with correct value<a name="line.1761"></a>
-<span class="sourceLineNo">1762</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1762"></a>
-<span class="sourceLineNo">1763</span>        new BinaryComparator(val1), put);<a name="line.1763"></a>
-<span class="sourceLineNo">1764</span>    assertTrue(res);<a name="line.1764"></a>
-<span class="sourceLineNo">1765</span><a name="line.1765"></a>
-<span class="sourceLineNo">1766</span>    // checkAndDelete with correct value<a name="line.1766"></a>
-<span class="sourceLineNo">1767</span>    delete = new Delete(row1);<a name="line.1767"></a>
-<span class="sourceLineNo">1768</span>    delete.addColumn(fam1, qf1);<a name="line.1768"></a>
+<span class="sourceLineNo">404</span>    ChunkCreator.initialize(MemStoreLABImpl.CHUNK_SIZE_DEFAULT, false, 0, 0, 0, null);<a name="line.404"></a>
+<span class="sourceLineNo">405</span>    FSHLog hLog = new FSHLog(fs, rootDir, testName, CONF);<a name="line.405"></a>
+<span class="sourceLineNo">406</span>    hLog.init();<a name="line.406"></a>
+<span class="sourceLineNo">407</span>    region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, hLog,<a name="line.407"></a>
+<span class="sourceLineNo">408</span>        COLUMN_FAMILY_BYTES);<a name="line.408"></a>
+<span class="sourceLineNo">409</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.409"></a>
+<span class="sourceLineNo">410</span>    assertEquals(0, region.getMemStoreDataSize());<a name="line.410"></a>
+<span class="sourceLineNo">411</span><a name="line.411"></a>
+<span class="sourceLineNo">412</span>    // Put one value<a name="line.412"></a>
+<span class="sourceLineNo">413</span>    byte [] value = Bytes.toBytes(method);<a name="line.413"></a>
+<span class="sourceLineNo">414</span>    Put put = new Put(value);<a name="line.414"></a>
+<span class="sourceLineNo">415</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    region.put(put);<a name="line.416"></a>
+<span class="sourceLineNo">417</span>    long onePutSize = region.getMemStoreDataSize();<a name="line.417"></a>
+<span class="sourceLineNo">418</span>    assertTrue(onePutSize &gt; 0);<a name="line.418"></a>
+<span class="sourceLineNo">419</span><a name="line.419"></a>
+<span class="sourceLineNo">420</span>    RegionCoprocessorHost mockedCPHost = Mockito.mock(RegionCoprocessorHost.class);<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    doThrow(new IOException())<a name="line.421"></a>
+<span class="sourceLineNo">422</span>       .when(mockedCPHost).postBatchMutate(Mockito.&lt;MiniBatchOperationInProgress&lt;Mutation&gt;&gt;any());<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    region.setCoprocessorHost(mockedCPHost);<a name="line.423"></a>
+<span class="sourceLineNo">424</span><a name="line.424"></a>
+<span class="sourceLineNo">425</span>    put = new Put(value);<a name="line.425"></a>
+<span class="sourceLineNo">426</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("dfg"), value);<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    try {<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      region.put(put);<a name="line.428"></a>
+<span class="sourceLineNo">429</span>      fail("Should have failed with IOException");<a name="line.429"></a>
+<span class="sourceLineNo">430</span>    } catch (IOException expected) {<a name="line.430"></a>
+<span class="sourceLineNo">431</span>    }<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    long expectedSize = onePutSize * 2;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>    assertEquals("memstoreSize should be incremented",<a name="line.433"></a>
+<span class="sourceLineNo">434</span>        expectedSize, region.getMemStoreDataSize());<a name="line.434"></a>
+<span class="sourceLineNo">435</span>    assertEquals("flushable size should be incremented",<a name="line.435"></a>
+<span class="sourceLineNo">436</span>        expectedSize, store.getFlushableSize().getDataSize());<a name="line.436"></a>
+<span class="sourceLineNo">437</span><a name="line.437"></a>
+<span class="sourceLineNo">438</span>    region.setCoprocessorHost(null);<a name="line.438"></a>
+<span class="sourceLineNo">439</span>  }<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>   * A test case of HBASE-21041<a name="line.442"></a>
+<span class="sourceLineNo">443</span>   * @throws Exception Exception<a name="line.443"></a>
+<span class="sourceLineNo">444</span>   */<a name="line.444"></a>
+<span class="sourceLineNo">445</span>  @Test<a name="line.445"></a>
+<span class="sourceLineNo">446</span>  public void testFlushAndMemstoreSizeCounting() throws Exception {<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    byte[] family = Bytes.toBytes("family");<a name="line.447"></a>
+<span class="sourceLineNo">448</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.448"></a>
+<span class="sourceLineNo">449</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.449"></a>
+<span class="sourceLineNo">450</span>    try {<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      for (byte[] row : HBaseTestingUtility.ROWS) {<a name="line.451"></a>
+<span class="sourceLineNo">452</span>        Put put = new Put(row);<a name="line.452"></a>
+<span class="sourceLineNo">453</span>        put.addColumn(family, family, row);<a name="line.453"></a>
+<span class="sourceLineNo">454</span>        region.put(put);<a name="line.454"></a>
+<span class="sourceLineNo">455</span>      }<a name="line.455"></a>
+<span class="sourceLineNo">456</span>      region.flush(true);<a name="line.456"></a>
+<span class="sourceLineNo">457</span>      // After flush, data size should be zero<a name="line.457"></a>
+<span class="sourceLineNo">458</span>      assertEquals(0, region.getMemStoreDataSize());<a name="line.458"></a>
+<span class="sourceLineNo">459</span>      // After flush, a new active mutable segment is created, so the heap size<a name="line.459"></a>
+<span class="sourceLineNo">460</span>      // should equal to MutableSegment.DEEP_OVERHEAD<a name="line.460"></a>
+<span class="sourceLineNo">461</span>      assertEquals(MutableSegment.DEEP_OVERHEAD, region.getMemStoreHeapSize());<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      // After flush, offheap should be zero<a name="line.462"></a>
+<span class="sourceLineNo">463</span>      assertEquals(0, region.getMemStoreOffHeapSize());<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    } finally {<a name="line.464"></a>
+<span class="sourceLineNo">465</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.465"></a>
+<span class="sourceLineNo">466</span>      this.region = null;<a name="line.466"></a>
+<span class="sourceLineNo">467</span>      wals.close();<a name="line.467"></a>
+<span class="sourceLineNo">468</span>    }<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>  /**<a name="line.471"></a>
+<span class="sourceLineNo">472</span>   * Test we do not lose data if we fail a flush and then close.<a name="line.472"></a>
+<span class="sourceLineNo">473</span>   * Part of HBase-10466.  Tests the following from the issue description:<a name="line.473"></a>
+<span class="sourceLineNo">474</span>   * "Bug 1: Wrong calculation of HRegion.memstoreSize: When a flush fails, data to be flushed is<a name="line.474"></a>
+<span class="sourceLineNo">475</span>   * kept in each MemStore's snapshot and wait for next flush attempt to continue on it. But when<a name="line.475"></a>
+<span class="sourceLineNo">476</span>   * the next flush succeeds, the counter of total memstore size in HRegion is always deduced by<a name="line.476"></a>
+<span class="sourceLineNo">477</span>   * the sum of current memstore sizes instead of snapshots left from previous failed flush. This<a name="line.477"></a>
+<span class="sourceLineNo">478</span>   * calculation is problematic that almost every time there is failed flush, HRegion.memstoreSize<a name="line.478"></a>
+<span class="sourceLineNo">479</span>   * gets reduced by a wrong value. If region flush could not proceed for a couple cycles, the size<a name="line.479"></a>
+<span class="sourceLineNo">480</span>   * in current memstore could be much larger than the snapshot. It's likely to drift memstoreSize<a name="line.480"></a>
+<span class="sourceLineNo">481</span>   * much smaller than expected. In extreme case, if the error accumulates to even bigger than<a name="line.481"></a>
+<span class="sourceLineNo">482</span>   * HRegion's memstore size limit, any further flush is skipped because flush does not do anything<a name="line.482"></a>
+<span class="sourceLineNo">483</span>   * if memstoreSize is not larger than 0."<a name="line.483"></a>
+<span class="sourceLineNo">484</span>   * @throws Exception<a name="line.484"></a>
+<span class="sourceLineNo">485</span>   */<a name="line.485"></a>
+<span class="sourceLineNo">486</span>  @Test<a name="line.486"></a>
+<span class="sourceLineNo">487</span>  public void testFlushSizeAccounting() throws Exception {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.488"></a>
+<span class="sourceLineNo">489</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.489"></a>
+<span class="sourceLineNo">490</span>    // Only retry once.<a name="line.490"></a>
+<span class="sourceLineNo">491</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.491"></a>
+<span class="sourceLineNo">492</span>    final User user =<a name="line.492"></a>
+<span class="sourceLineNo">493</span>      User.createUserForTesting(conf, method, new String[]{"foo"});<a name="line.493"></a>
+<span class="sourceLineNo">494</span>    // Inject our faulty LocalFileSystem<a name="line.494"></a>
+<span class="sourceLineNo">495</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.496"></a>
+<span class="sourceLineNo">497</span>      @Override<a name="line.497"></a>
+<span class="sourceLineNo">498</span>      public Object run() throws Exception {<a name="line.498"></a>
+<span class="sourceLineNo">499</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.499"></a>
+<span class="sourceLineNo">500</span>        FileSystem fs = FileSystem.get(conf);<a name="line.500"></a>
+<span class="sourceLineNo">501</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.501"></a>
+<span class="sourceLineNo">502</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.502"></a>
+<span class="sourceLineNo">503</span>        HRegion region = null;<a name="line.503"></a>
+<span class="sourceLineNo">504</span>        try {<a name="line.504"></a>
+<span class="sourceLineNo">505</span>          // Initialize region<a name="line.505"></a>
+<span class="sourceLineNo">506</span>          region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, wal,<a name="line.506"></a>
+<span class="sourceLineNo">507</span>              COLUMN_FAMILY_BYTES);<a name="line.507"></a>
+<span class="sourceLineNo">508</span>          long size = region.getMemStoreDataSize();<a name="line.508"></a>
+<span class="sourceLineNo">509</span>          Assert.assertEquals(0, size);<a name="line.509"></a>
+<span class="sourceLineNo">510</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.510"></a>
+<span class="sourceLineNo">511</span>          Put p1 = new Put(row);<a name="line.511"></a>
+<span class="sourceLineNo">512</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[]) null));<a name="line.512"></a>
+<span class="sourceLineNo">513</span>          region.put(p1);<a name="line.513"></a>
+<span class="sourceLineNo">514</span>          final long sizeOfOnePut = region.getMemStoreDataSize();<a name="line.514"></a>
+<span class="sourceLineNo">515</span>          // Fail a flush which means the current memstore will hang out as memstore 'snapshot'.<a name="line.515"></a>
+<span class="sourceLineNo">516</span>          try {<a name="line.516"></a>
+<span class="sourceLineNo">517</span>            LOG.info("Flushing");<a name="line.517"></a>
+<span class="sourceLineNo">518</span>            region.flush(true);<a name="line.518"></a>
+<span class="sourceLineNo">519</span>            Assert.fail("Didn't bubble up IOE!");<a name="line.519"></a>
+<span class="sourceLineNo">520</span>          } catch (DroppedSnapshotException dse) {<a name="line.520"></a>
+<span class="sourceLineNo">521</span>            // What we are expecting<a name="line.521"></a>
+<span class="sourceLineNo">522</span>            region.closing.set(false); // this is needed for the rest of the test to work<a name="line.522"></a>
+<span class="sourceLineNo">523</span>          }<a name="line.523"></a>
+<span class="sourceLineNo">524</span>          // Make it so all writes succeed from here on out<a name="line.524"></a>
+<span class="sourceLineNo">525</span>          ffs.fault.set(false);<a name="line.525"></a>
+<span class="sourceLineNo">526</span>          // Check sizes.  Should still be the one entry.<a name="line.526"></a>
+<span class="sourceLineNo">527</span>          Assert.assertEquals(sizeOfOnePut, region.getMemStoreDataSize());<a name="line.527"></a>
+<span class="sourceLineNo">528</span>          // Now add two entries so that on this next flush that fails, we can see if we<a name="line.528"></a>
+<span class="sourceLineNo">529</span>          // subtract the right amount, the snapshot size only.<a name="line.529"></a>
+<span class="sourceLineNo">530</span>          Put p2 = new Put(row);<a name="line.530"></a>
+<span class="sourceLineNo">531</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.531"></a>
+<span class="sourceLineNo">532</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.532"></a>
+<span class="sourceLineNo">533</span>          region.put(p2);<a name="line.533"></a>
+<span class="sourceLineNo">534</span>          long expectedSize = sizeOfOnePut * 3;<a name="line.534"></a>
+<span class="sourceLineNo">535</span>          Assert.assertEquals(expectedSize, region.getMemStoreDataSize());<a name="line.535"></a>
+<span class="sourceLineNo">536</span>          // Do a successful flush.  It will clear the snapshot only.  Thats how flushes work.<a name="line.536"></a>
+<span class="sourceLineNo">537</span>          // If already a snapshot, we clear it else we move the memstore to be snapshot and flush<a name="line.537"></a>
+<span class="sourceLineNo">538</span>          // it<a name="line.538"></a>
+<span class="sourceLineNo">539</span>          region.flush(true);<a name="line.539"></a>
+<span class="sourceLineNo">540</span>          // Make sure our memory accounting is right.<a name="line.540"></a>
+<span class="sourceLineNo">541</span>          Assert.assertEquals(sizeOfOnePut * 2, region.getMemStoreDataSize());<a name="line.541"></a>
+<span class="sourceLineNo">542</span>        } finally {<a name="line.542"></a>
+<span class="sourceLineNo">543</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.543"></a>
+<span class="sourceLineNo">544</span>        }<a name="line.544"></a>
+<span class="sourceLineNo">545</span>        return null;<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>    FileSystem.closeAllForUGI(user.getUGI());<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>  @Test<a name="line.551"></a>
+<span class="sourceLineNo">552</span>  public void testCloseWithFailingFlush() throws Exception {<a name="line.552"></a>
+<span class="sourceLineNo">553</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.553"></a>
+<span class="sourceLineNo">554</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.554"></a>
+<span class="sourceLineNo">555</span>    // Only retry once.<a name="line.555"></a>
+<span class="sourceLineNo">556</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.556"></a>
+<span class="sourceLineNo">557</span>    final User user =<a name="line.557"></a>
+<span class="sourceLineNo">558</span>      User.createUserForTesting(conf, this.method, new String[]{"foo"});<a name="line.558"></a>
+<span class="sourceLineNo">559</span>    // Inject our faulty LocalFileSystem<a name="line.559"></a>
+<span class="sourceLineNo">560</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.560"></a>
+<span class="sourceLineNo">561</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.561"></a>
+<span class="sourceLineNo">562</span>      @Override<a name="line.562"></a>
+<span class="sourceLineNo">563</span>      public Object run() throws Exception {<a name="line.563"></a>
+<span class="sourceLineNo">564</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.564"></a>
+<span class="sourceLineNo">565</span>        FileSystem fs = FileSystem.get(conf);<a name="line.565"></a>
+<span class="sourceLineNo">566</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.566"></a>
+<span class="sourceLineNo">567</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.567"></a>
+<span class="sourceLineNo">568</span>        HRegion region = null;<a name="line.568"></a>
+<span class="sourceLineNo">569</span>        try {<a name="line.569"></a>
+<span class="sourceLineNo">570</span>          // Initialize region<a name="line.570"></a>
+<span class="sourceLineNo">571</span>          region = initHRegion(tableName, null, null, false,<a name="line.571"></a>
+<span class="sourceLineNo">572</span>              Durability.SYNC_WAL, wal, COLUMN_FAMILY_BYTES);<a name="line.572"></a>
+<span class="sourceLineNo">573</span>          long size = region.getMemStoreDataSize();<a name="line.573"></a>
+<span class="sourceLineNo">574</span>          Assert.assertEquals(0, size);<a name="line.574"></a>
+<span class="sourceLineNo">575</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.575"></a>
+<span class="sourceLineNo">576</span>          Put p1 = new Put(row);<a name="line.576"></a>
+<span class="sourceLineNo">577</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[])null));<a name="line.577"></a>
+<span class="sourceLineNo">578</span>          region.put(p1);<a name="line.578"></a>
+<span class="sourceLineNo">579</span>          // Manufacture an outstanding snapshot -- fake a failed flush by doing prepare step only.<a name="line.579"></a>
+<span class="sourceLineNo">580</span>          HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.580"></a>
+<span class="sourceLineNo">581</span>          StoreFlushContext storeFlushCtx =<a name="line.581"></a>
+<span class="sourceLineNo">582</span>              store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY);<a name="line.582"></a>
+<span class="sourceLineNo">583</span>          storeFlushCtx.prepare();<a name="line.583"></a>
+<span class="sourceLineNo">584</span>          // Now add two entries to the foreground memstore.<a name="line.584"></a>
+<span class="sourceLineNo">585</span>          Put p2 = new Put(row);<a name="line.585"></a>
+<span class="sourceLineNo">586</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.586"></a>
+<span class="sourceLineNo">587</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.587"></a>
+<span class="sourceLineNo">588</span>          region.put(p2);<a name="line.588"></a>
+<span class="sourceLineNo">589</span>          // Now try close on top of a failing flush.<a name="line.589"></a>
+<span class="sourceLineNo">590</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.590"></a>
+<span class="sourceLineNo">591</span>          region = null;<a name="line.591"></a>
+<span class="sourceLineNo">592</span>          fail();<a name="line.592"></a>
+<span class="sourceLineNo">593</span>        } catch (DroppedSnapshotException dse) {<a name="line.593"></a>
+<span class="sourceLineNo">594</span>          // Expected<a name="line.594"></a>
+<span class="sourceLineNo">595</span>          LOG.info("Expected DroppedSnapshotException");<a name="line.595"></a>
+<span class="sourceLineNo">596</span>        } finally {<a name="line.596"></a>
+<span class="sourceLineNo">597</span>          // Make it so all writes succeed from here on out so can close clean<a name="line.597"></a>
+<span class="sourceLineNo">598</span>          ffs.fault.set(false);<a name="line.598"></a>
+<span class="sourceLineNo">599</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.599"></a>
+<span class="sourceLineNo">600</span>        }<a name="line.600"></a>
+<span class="sourceLineNo">601</span>        return null;<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>    FileSystem.closeAllForUGI(user.getUGI());<a name="line.604"></a>
+<span class="sourceLineNo">605</span>  }<a name="line.605"></a>
+<span class="sourceLineNo">606</span><a name="line.606"></a>
+<span class="sourceLineNo">607</span>  @Test<a name="line.607"></a>
+<span class="sourceLineNo">608</span>  public void testCompactionAffectedByScanners() throws Exception {<a name="line.608"></a>
+<span class="sourceLineNo">609</span>    byte[] family = Bytes.toBytes("family");<a name="line.609"></a>
+<span class="sourceLineNo">610</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.610"></a>
+<span class="sourceLineNo">611</span><a name="line.611"></a>
+<span class="sourceLineNo">612</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.612"></a>
+<span class="sourceLineNo">613</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.613"></a>
+<span class="sourceLineNo">614</span>    region.put(put);<a name="line.614"></a>
+<span class="sourceLineNo">615</span>    region.flush(true);<a name="line.615"></a>
+<span class="sourceLineNo">616</span><a name="line.616"></a>
+<span class="sourceLineNo">617</span>    Scan scan = new Scan();<a name="line.617"></a>
+<span class="sourceLineNo">618</span>    scan.setMaxVersions(3);<a name="line.618"></a>
+<span class="sourceLineNo">619</span>    // open the first scanner<a name="line.619"></a>
+<span class="sourceLineNo">620</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.620"></a>
+<span class="sourceLineNo">621</span><a name="line.621"></a>
+<span class="sourceLineNo">622</span>    Delete delete = new Delete(Bytes.toBytes("r1"));<a name="line.622"></a>
+<span class="sourceLineNo">623</span>    region.delete(delete);<a name="line.623"></a>
+<span class="sourceLineNo">624</span>    region.flush(true);<a name="line.624"></a>
+<span class="sourceLineNo">625</span><a name="line.625"></a>
+<span class="sourceLineNo">626</span>    // open the second scanner<a name="line.626"></a>
+<span class="sourceLineNo">627</span>    RegionScanner scanner2 = region.getScanner(scan);<a name="line.627"></a>
+<span class="sourceLineNo">628</span><a name="line.628"></a>
+<span class="sourceLineNo">629</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.629"></a>
+<span class="sourceLineNo">630</span><a name="line.630"></a>
+<span class="sourceLineNo">631</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.631"></a>
+<span class="sourceLineNo">632</span><a name="line.632"></a>
+<span class="sourceLineNo">633</span>    // make a major compaction<a name="line.633"></a>
+<span class="sourceLineNo">634</span>    region.compact(true);<a name="line.634"></a>
+<span class="sourceLineNo">635</span><a name="line.635"></a>
+<span class="sourceLineNo">636</span>    // open the third scanner<a name="line.636"></a>
+<span class="sourceLineNo">637</span>    RegionScanner scanner3 = region.getScanner(scan);<a name="line.637"></a>
+<span class="sourceLineNo">638</span><a name="line.638"></a>
+<span class="sourceLineNo">639</span>    // get data from scanner 1, 2, 3 after major compaction<a name="line.639"></a>
+<span class="sourceLineNo">640</span>    scanner1.next(results);<a name="line.640"></a>
+<span class="sourceLineNo">641</span>    System.out.println(results);<a name="line.641"></a>
+<span class="sourceLineNo">642</span>    assertEquals(1, results.size());<a name="line.642"></a>
+<span class="sourceLineNo">643</span><a name="line.643"></a>
+<span class="sourceLineNo">644</span>    results.clear();<a name="line.644"></a>
+<span class="sourceLineNo">645</span>    scanner2.next(results);<a name="line.645"></a>
+<span class="sourceLineNo">646</span>    System.out.println(results);<a name="line.646"></a>
+<span class="sourceLineNo">647</span>    assertEquals(0, results.size());<a name="line.647"></a>
+<span class="sourceLineNo">648</span><a name="line.648"></a>
+<span class="sourceLineNo">649</span>    results.clear();<a name="line.649"></a>
+<span class="sourceLineNo">650</span>    scanner3.next(results);<a name="line.650"></a>
+<span class="sourceLineNo">651</span>    System.out.println(results);<a name="line.651"></a>
+<span class="sourceLineNo">652</span>    assertEquals(0, results.size());<a name="line.652"></a>
+<span class="sourceLineNo">653</span>  }<a name="line.653"></a>
+<span class="sourceLineNo">654</span><a name="line.654"></a>
+<span class="sourceLineNo">655</span>  @Test<a name="line.655"></a>
+<span class="sourceLineNo">656</span>  public void testToShowNPEOnRegionScannerReseek() throws Exception {<a name="line.656"></a>
+<span class="sourceLineNo">657</span>    byte[] family = Bytes.toBytes("family");<a name="line.657"></a>
+<span class="sourceLineNo">658</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.658"></a>
+<span class="sourceLineNo">659</span><a name="line.659"></a>
+<span class="sourceLineNo">660</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.660"></a>
+<span class="sourceLineNo">661</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.661"></a>
+<span class="sourceLineNo">662</span>    region.put(put);<a name="line.662"></a>
+<span class="sourceLineNo">663</span>    put = new Put(Bytes.toBytes("r2"));<a name="line.663"></a>
+<span class="sourceLineNo">664</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.664"></a>
+<span class="sourceLineNo">665</span>    region.put(put);<a name="line.665"></a>
+<span class="sourceLineNo">666</span>    region.flush(true);<a name="line.666"></a>
+<span class="sourceLineNo">667</span><a name="line.667"></a>
+<span class="sourceLineNo">668</span>    Scan scan = new Scan();<a name="line.668"></a>
+<span class="sourceLineNo">669</span>    scan.setMaxVersions(3);<a name="line.669"></a>
+<span class="sourceLineNo">670</span>    // open the first scanner<a name="line.670"></a>
+<span class="sourceLineNo">671</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.671"></a>
+<span class="sourceLineNo">672</span><a name="line.672"></a>
+<span class="sourceLineNo">673</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.673"></a>
+<span class="sourceLineNo">674</span><a name="line.674"></a>
+<span class="sourceLineNo">675</span>    region.compact(true);<a name="line.675"></a>
+<span class="sourceLineNo">676</span><a name="line.676"></a>
+<span class="sourceLineNo">677</span>    scanner1.reseek(Bytes.toBytes("r2"));<a name="line.677"></a>
+<span class="sourceLineNo">678</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.678"></a>
+<span class="sourceLineNo">679</span>    scanner1.next(results);<a name="line.679"></a>
+<span class="sourceLineNo">680</span>    Cell keyValue = results.get(0);<a name="line.680"></a>
+<span class="sourceLineNo">681</span>    Assert.assertTrue(Bytes.compareTo(CellUtil.cloneRow(keyValue), Bytes.toBytes("r2")) == 0);<a name="line.681"></a>
+<span class="sourceLineNo">682</span>    scanner1.close();<a name="line.682"></a>
+<span class="sourceLineNo">683</span>  }<a name="line.683"></a>
+<span class="sourceLineNo">684</span><a name="line.684"></a>
+<span class="sourceLineNo">685</span>  @Test<a name="line.685"></a>
+<span class="sourceLineNo">686</span>  public void testSkipRecoveredEditsReplay() throws Exception {<a name="line.686"></a>
+<span class="sourceLineNo">687</span>    byte[] family = Bytes.toBytes("family");<a name="line.687"></a>
+<span class="sourceLineNo">688</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.688"></a>
+<span class="sourceLineNo">689</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.689"></a>
+<span class="sourceLineNo">690</span>    try {<a name="line.690"></a>
+<span class="sourceLineNo">691</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.691"></a>
+<span class="sourceLineNo">692</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.692"></a>
+<span class="sourceLineNo">693</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.693"></a>
+<span class="sourceLineNo">694</span><a name="line.694"></a>
+<span class="sourceLineNo">695</span>      Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.695"></a>
+<span class="sourceLineNo">696</span><a name="line.696"></a>
+<span class="sourceLineNo">697</span>      long maxSeqId = 1050;<a name="line.697"></a>
+<span class="sourceLineNo">698</span>      long minSeqId = 1000;<a name="line.698"></a>
+<span class="sourceLineNo">699</span><a name="line.699"></a>
+<span class="sourceLineNo">700</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.700"></a>
+<span class="sourceLineNo">701</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.701"></a>
+<span class="sourceLineNo">702</span>        fs.create(recoveredEdits);<a name="line.702"></a>
+<span class="sourceLineNo">703</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.703"></a>
+<span class="sourceLineNo">704</span><a name="line.704"></a>
+<span class="sourceLineNo">705</span>        long time = System.nanoTime();<a name="line.705"></a>
+<span class="sourceLineNo">706</span>        WALEdit edit = new WALEdit();<a name="line.706"></a>
+<span class="sourceLineNo">707</span>        edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.707"></a>
+<span class="sourceLineNo">708</span>            .toBytes(i)));<a name="line.708"></a>
+<span class="sourceLineNo">709</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.709"></a>
+<span class="sourceLineNo">710</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.710"></a>
+<span class="sourceLineNo">711</span><a name="line.711"></a>
+<span class="sourceLineNo">712</span>        writer.close();<a name="line.712"></a>
+<span class="sourceLineNo">713</span>      }<a name="line.713"></a>
+<span class="sourceLineNo">714</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.714"></a>
+<span class="sourceLineNo">715</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.715"></a>
+<span class="sourceLineNo">716</span>      for (HStore store : region.getStores()) {<a name="line.716"></a>
+<span class="sourceLineNo">717</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), minSeqId - 1);<a name="line.717"></a>
+<span class="sourceLineNo">718</span>      }<a name="line.718"></a>
+<span class="sourceLineNo">719</span>      long seqId = region.replayRecoveredEditsIfAny(maxSeqIdInStores, null, status);<a name="line.719"></a>
+<span class="sourceLineNo">720</span>      assertEquals(maxSeqId, seqId);<a name="line.720"></a>
+<span class="sourceLineNo">721</span>      region.getMVCC().advanceTo(seqId);<a name="line.721"></a>
+<span class="sourceLineNo">722</span>      Get get = new Get(row);<a name="line.722"></a>
+<span class="sourceLineNo">723</span>      Result result = region.get(get);<a name="line.723"></a>
+<span class="sourceLineNo">724</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.724"></a>
+<span class="sourceLineNo">725</span>        List&lt;Cell&gt; kvs = result.getColumnCells(family, Bytes.toBytes(i));<a name="line.725"></a>
+<span class="sourceLineNo">726</span>        assertEquals(1, kvs.size());<a name="line.726"></a>
+<span class="sourceLineNo">727</span>        assertArrayEquals(Bytes.toBytes(i), CellUtil.cloneValue(kvs.get(0)));<a name="line.727"></a>
+<span class="sourceLineNo">728</span>      }<a name="line.728"></a>
+<span class="sourceLineNo">729</span>    } finally {<a name="line.729"></a>
+<span class="sourceLineNo">730</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.730"></a>
+<span class="sourceLineNo">731</span>      this.region = null;<a name="line.731"></a>
+<span class="sourceLineNo">732</span>      wals.close();<a name="line.732"></a>
+<span class="sourceLineNo">733</span>    }<a name="line.733"></a>
+<span class="sourceLineNo">734</span>  }<a name="line.734"></a>
+<span class="sourceLineNo">735</span><a name="line.735"></a>
+<span class="sourceLineNo">736</span>  @Test<a name="line.736"></a>
+<span class="sourceLineNo">737</span>  public void testSkipRecoveredEditsReplaySomeIgnored() throws Exception {<a name="line.737"></a>
+<span class="sourceLineNo">738</span>    byte[] family = Bytes.toBytes("family");<a name="line.738"></a>
+<span class="sourceLineNo">739</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.739"></a>
+<span class="sourceLineNo">740</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.740"></a>
+<span class="sourceLineNo">741</span>    try {<a name="line.741"></a>
+<span class="sourceLineNo">742</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.742"></a>
+<span class="sourceLineNo">743</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.743"></a>
+<span class="sourceLineNo">744</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.744"></a>
+<span class="sourceLineNo">745</span><a name="line.745"></a>
+<span class="sourceLineNo">746</span>      Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.746"></a>
+<span class="sourceLineNo">747</span><a name="line.747"></a>
+<span class="sourceLineNo">748</span>      long maxSeqId = 1050;<a name="line.748"></a>
+<span class="sourceLineNo">749</span>      long minSeqId = 1000;<a name="line.749"></a>
+<span class="sourceLineNo">750</span><a name="line.750"></a>
+<span class="sourceLineNo">751</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.751"></a>
+<span class="sourceLineNo">752</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.752"></a>
+<span class="sourceLineNo">753</span>        fs.create(recoveredEdits);<a name="line.753"></a>
+<span class="sourceLineNo">754</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.754"></a>
+<span class="sourceLineNo">755</span><a name="line.755"></a>
+<span class="sourceLineNo">756</span>        long time = System.nanoTime();<a name="line.756"></a>
+<span class="sourceLineNo">757</span>        WALEdit edit = new WALEdit();<a name="line.757"></a>
+<span class="sourceLineNo">758</span>        edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.758"></a>
+<span class="sourceLineNo">759</span>            .toBytes(i)));<a name="line.759"></a>
+<span class="sourceLineNo">760</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.760"></a>
+<span class="sourceLineNo">761</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.761"></a>
+<span class="sourceLineNo">762</span><a name="line.762"></a>
+<span class="sourceLineNo">763</span>        writer.close();<a name="line.763"></a>
+<span class="sourceLineNo">764</span>      }<a name="line.764"></a>
+<span class="sourceLineNo">765</span>      long recoverSeqId = 1030;<a name="line.765"></a>
+<span class="sourceLineNo">766</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.766"></a>
+<span class="sourceLineNo">767</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.767"></a>
+<span class="sourceLineNo">768</span>      for (HStore store : region.getStores()) {<a name="line.768"></a>
+<span class="sourceLineNo">769</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), recoverSeqId - 1);<a name="line.769"></a>
+<span class="sourceLineNo">770</span>      }<a name="line.770"></a>
+<span class="sourceLineNo">771</span>      long seqId = region.replayRecoveredEditsIfAny(maxSeqIdInStores, null, status);<a name="line.771"></a>
+<span class="sourceLineNo">772</span>      assertEquals(maxSeqId, seqId);<a name="line.772"></a>
+<span class="sourceLineNo">773</span>      region.getMVCC().advanceTo(seqId);<a name="line.773"></a>
+<span class="sourceLineNo">774</span>      Get get = new Get(row);<a name="line.774"></a>
+<span class="sourceLineNo">775</span>      Result result = region.get(get);<a name="line.775"></a>
+<span class="sourceLineNo">776</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.776"></a>
+<span class="sourceLineNo">777</span>        List&lt;Cell&gt; kvs = result.getColumnCells(family, Bytes.toBytes(i));<a name="line.777"></a>
+<span class="sourceLineNo">778</span>        if (i &lt; recoverSeqId) {<a name="line.778"></a>
+<span class="sourceLineNo">779</span>          assertEquals(0, kvs.size());<a name="line.779"></a>
+<span class="sourceLineNo">780</span>        } else {<a name="line.780"></a>
+<span class="sourceLineNo">781</span>          assertEquals(1, kvs.size());<a name="line.781"></a>
+<span class="sourceLineNo">782</span>          assertArrayEquals(Bytes.toBytes(i), CellUtil.cloneValue(kvs.get(0)));<a name="line.782"></a>
+<span class="sourceLineNo">783</span>        }<a name="line.783"></a>
+<span class="sourceLineNo">784</span>      }<a name="line.784"></a>
+<span class="sourceLineNo">785</span>    } finally {<a name="line.785"></a>
+<span class="sourceLineNo">786</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.786"></a>
+<span class="sourceLineNo">787</span>      this.region = null;<a name="line.787"></a>
+<span class="sourceLineNo">788</span>      wals.close();<a name="line.788"></a>
+<span class="sourceLineNo">789</span>    }<a name="line.789"></a>
+<span class="sourceLineNo">790</span>  }<a name="line.790"></a>
+<span class="sourceLineNo">791</span><a name="line.791"></a>
+<span class="sourceLineNo">792</span>  @Test<a name="line.792"></a>
+<span class="sourceLineNo">793</span>  public void testSkipRecoveredEditsReplayAllIgnored() throws Exception {<a name="line.793"></a>
+<span class="sourceLineNo">794</span>    byte[] family = Bytes.toBytes("family");<a name="line.794"></a>
+<span class="sourceLineNo">795</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.795"></a>
+<span class="sourceLineNo">796</span>    Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.796"></a>
+<span class="sourceLineNo">797</span>    FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.797"></a>
+<span class="sourceLineNo">798</span><a name="line.798"></a>
+<span class="sourceLineNo">799</span>    Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.799"></a>
+<span class="sourceLineNo">800</span>    for (int i = 1000; i &lt; 1050; i += 10) {<a name="line.800"></a>
+<span class="sourceLineNo">801</span>      Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.801"></a>
+<span class="sourceLineNo">802</span>      FSDataOutputStream dos = fs.create(recoveredEdits);<a name="line.802"></a>
+<span class="sourceLineNo">803</span>      dos.writeInt(i);<a name="line.803"></a>
+<span class="sourceLineNo">804</span>      dos.close();<a name="line.804"></a>
+<span class="sourceLineNo">805</span>    }<a name="line.805"></a>
+<span class="sourceLineNo">806</span>    long minSeqId = 2000;<a name="line.806"></a>
+<span class="sourceLineNo">807</span>    Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", minSeqId - 1));<a name="line.807"></a>
+<span class="sourceLineNo">808</span>    FSDataOutputStream dos = fs.create(recoveredEdits);<a name="line.808"></a>
+<span class="sourceLineNo">809</span>    dos.close();<a name="line.809"></a>
+<span class="sourceLineNo">810</span><a name="line.810"></a>
+<span class="sourceLineNo">811</span>    Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.811"></a>
+<span class="sourceLineNo">812</span>    for (HStore store : region.getStores()) {<a name="line.812"></a>
+<span class="sourceLineNo">813</span>      maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), minSeqId);<a name="line.813"></a>
+<span class="sourceLineNo">814</span>    }<a name="line.814"></a>
+<span class="sourceLineNo">815</span>    long seqId = region.replayRecoveredEditsIfAny(maxSeqIdInStores, null, null);<a name="line.815"></a>
+<span class="sourceLineNo">816</span>    assertEquals(minSeqId, seqId);<a name="line.816"></a>
+<span class="sourceLineNo">817</span>  }<a name="line.817"></a>
+<span class="sourceLineNo">818</span><a name="line.818"></a>
+<span class="sourceLineNo">819</span>  @Test<a name="line.819"></a>
+<span class="sourceLineNo">820</span>  public void testSkipRecoveredEditsReplayTheLastFileIgnored() throws Exception {<a name="line.820"></a>
+<span class="sourceLineNo">821</span>    byte[] family = Bytes.toBytes("family");<a name="line.821"></a>
+<span class="sourceLineNo">822</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.822"></a>
+<span class="sourceLineNo">823</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.823"></a>
+<span class="sourceLineNo">824</span>    try {<a name="line.824"></a>
+<span class="sourceLineNo">825</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.825"></a>
+<span class="sourceLineNo">826</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.826"></a>
+<span class="sourceLineNo">827</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.827"></a>
+<span class="sourceLineNo">828</span>      byte[][] columns = region.getTableDescriptor().getColumnFamilyNames().toArray(new byte[0][]);<a name="line.828"></a>
+<span class="sourceLineNo">829</span><a name="line.829"></a>
+<span class="sourceLineNo">830</span>      assertEquals(0, region.getStoreFileList(columns).size());<a name="line.830"></a>
+<span class="sourceLineNo">831</span><a name="line.831"></a>
+<span class="sourceLineNo">832</span>      Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.832"></a>
+<span class="sourceLineNo">833</span><a name="line.833"></a>
+<span class="sourceLineNo">834</span>      long maxSeqId = 1050;<a name="line.834"></a>
+<span class="sourceLineNo">835</span>      long minSeqId = 1000;<a name="line.835"></a>
+<span class="sourceLineNo">836</span><a name="line.836"></a>
+<span class="sourceLineNo">837</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.837"></a>
+<span class="sourceLineNo">838</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.838"></a>
+<span class="sourceLineNo">839</span>        fs.create(recoveredEdits);<a name="line.839"></a>
+<span class="sourceLineNo">840</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.840"></a>
+<span class="sourceLineNo">841</span><a name="line.841"></a>
+<span class="sourceLineNo">842</span>        long time = System.nanoTime();<a name="line.842"></a>
+<span class="sourceLineNo">843</span>        WALEdit edit = null;<a name="line.843"></a>
+<span class="sourceLineNo">844</span>        if (i == maxSeqId) {<a name="line.844"></a>
+<span class="sourceLineNo">845</span>          edit = WALEdit.createCompaction(region.getRegionInfo(),<a name="line.845"></a>
+<span class="sourceLineNo">846</span>          CompactionDescriptor.newBuilder()<a name="line.846"></a>
+<span class="sourceLineNo">847</span>          .setTableName(ByteString.copyFrom(tableName.getName()))<a name="line.847"></a>
+<span class="sourceLineNo">848</span>          .setFamilyName(ByteString.copyFrom(regionName))<a name="line.848"></a>
+<span class="sourceLineNo">849</span>          .setEncodedRegionName(ByteString.copyFrom(regionName))<a name="line.849"></a>
+<span class="sourceLineNo">850</span>          .setStoreHomeDirBytes(ByteString.copyFrom(Bytes.toBytes(regiondir.toString())))<a name="line.850"></a>
+<span class="sourceLineNo">851</span>          .setRegionName(ByteString.copyFrom(region.getRegionInfo().getRegionName()))<a name="line.851"></a>
+<span class="sourceLineNo">852</span>          .build());<a name="line.852"></a>
+<span class="sourceLineNo">853</span>        } else {<a name="line.853"></a>
+<span class="sourceLineNo">854</span>          edit = new WALEdit();<a name="line.854"></a>
+<span class="sourceLineNo">855</span>          edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.855"></a>
+<span class="sourceLineNo">856</span>            .toBytes(i)));<a name="line.856"></a>
+<span class="sourceLineNo">857</span>        }<a name="line.857"></a>
+<span class="sourceLineNo">858</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.858"></a>
+<span class="sourceLineNo">859</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.859"></a>
+<span class="sourceLineNo">860</span>        writer.close();<a name="line.860"></a>
+<span class="sourceLineNo">861</span>      }<a name="line.861"></a>
+<span class="sourceLineNo">862</span><a name="line.862"></a>
+<span class="sourceLineNo">863</span>      long recoverSeqId = 1030;<a name="line.863"></a>
+<span class="sourceLineNo">864</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.864"></a>
+<span class="sourceLineNo">865</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.865"></a>
+<span class="sourceLineNo">866</span>      for (HStore store : region.getStores()) {<a name="line.866"></a>
+<span class="sourceLineNo">867</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), recoverSeqId - 1);<a name="line.867"></a>
+<span class="sourceLineNo">868</span>      }<a name="line.868"></a>
+<span class="sourceLineNo">869</span>      long seqId = region.replayRecoveredEditsIfAny(maxSeqIdInStores, null, status);<a name="line.869"></a>
+<span class="sourceLineNo">870</span>      assertEquals(maxSeqId, seqId);<a name="line.870"></a>
+<span class="sourceLineNo">871</span><a name="line.871"></a>
+<span class="sourceLineNo">872</span>      // assert that the files are flushed<a name="line.872"></a>
+<span class="sourceLineNo">873</span>      assertEquals(1, region.getStoreFileList(columns).size());<a name="line.873"></a>
+<span class="sourceLineNo">874</span><a name="line.874"></a>
+<span class="sourceLineNo">875</span>    } finally {<a name="line.875"></a>
+<span class="sourceLineNo">876</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.876"></a>
+<span class="sourceLineNo">877</span>      this.region = null;<a name="line.877"></a>
+<span class="sourceLineNo">878</span>      wals.close();<a name="line.878"></a>
+<span class="sourceLineNo">879</span>    }<a name="line.879"></a>
+<span class="sourceLineNo">880</span>  }<a name="line.880"></a>
+<span class="sourceLineNo">881</span><a name="line.881"></a>
+<span class="sourceLineNo">882</span>  @Test<a name="line.882"></a>
+<span class="sourceLineNo">883</span>  public void testRecoveredEditsReplayCompaction() throws Exception {<a name="line.883"></a>
+<span class="sourceLineNo">884</span>    testRecoveredEditsReplayCompaction(false);<a name="line.884"></a>
+<span class="sourceLineNo">885</span>    testRecoveredEditsReplayCompaction(true);<a name="line.885"></a>
+<span class="sourceLineNo">886</span>  }<a name="line.886"></a>
+<span class="sourceLineNo">887</span><a name="line.887"></a>
+<span class="sourceLineNo">888</span>  public void testRecoveredEditsReplayCompaction(boolean mismatchedRegionName) throws Exception {<a name="line.888"></a>
+<span class="sourceLineNo">889</span>    CONF.setClass(HConstants.REGION_IMPL, HRegionForTesting.class, Region.class);<a name="line.889"></a>
+<span class="sourceLineNo">890</span>    byte[] family = Bytes.toBytes("family");<a name="line.890"></a>
+<span class="sourceLineNo">891</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.891"></a>
+<span class="sourceLineNo">892</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.892"></a>
+<span class="sourceLineNo">893</span>    try {<a name="line.893"></a>
+<span class="sourceLineNo">894</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.894"></a>
+<span class="sourceLineNo">895</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.895"></a>
+<span class="sourceLineNo">896</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.896"></a>
+<span class="sourceLineNo">897</span><a name="line.897"></a>
+<span class="sourceLineNo">898</span>      long maxSeqId = 3;<a name="line.898"></a>
+<span class="sourceLineNo">899</span>      long minSeqId = 0;<a name="line.899"></a>
+<span class="sourceLineNo">900</span><a name="line.900"></a>
+<span class="sourceLineNo">901</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.901"></a>
+<span class="sourceLineNo">902</span>        Put put = new Put(Bytes.toBytes(i));<a name="line.902"></a>
+<span class="sourceLineNo">903</span>        put.addColumn(family, Bytes.toBytes(i), Bytes.toBytes(i));<a name="line.903"></a>
+<span class="sourceLineNo">904</span>        region.put(put);<a name="line.904"></a>
+<span class="sourceLineNo">905</span>        region.flush(true);<a name="line.905"></a>
+<span class="sourceLineNo">906</span>      }<a name="line.906"></a>
+<span class="sourceLineNo">907</span><a name="line.907"></a>
+<span class="sourceLineNo">908</span>      // this will create a region with 3 files<a name="line.908"></a>
+<span class="sourceLineNo">909</span>      assertEquals(3, region.getStore(family).getStorefilesCount());<a name="line.909"></a>
+<span class="sourceLineNo">910</span>      List&lt;Path&gt; storeFiles = new ArrayList&lt;&gt;(3);<a name="line.910"></a>
+<span class="sourceLineNo">911</span>      for (HStoreFile sf : region.getStore(family).getStorefiles()) {<a name="line.911"></a>
+<span class="sourceLineNo">912</span>        storeFiles.add(sf.getPath());<a name="line.912"></a>
+<span class="sourceLineNo">913</span>      }<a name="line.913"></a>
+<span class="sourceLineNo">914</span><a name="line.914"></a>
+<span class="sourceLineNo">915</span>      // disable compaction completion<a name="line.915"></a>
+<span class="sourceLineNo">916</span>      CONF.setBoolean("hbase.hstore.compaction.complete", false);<a name="line.916"></a>
+<span class="sourceLineNo">917</span>      region.compactStores();<a name="line.917"></a>
+<span class="sourceLineNo">918</span><a name="line.918"></a>
+<span class="sourceLineNo">919</span>      // ensure that nothing changed<a name="line.919"></a>
+<span class="sourceLineNo">920</span>      assertEquals(3, region.getStore(family).getStorefilesCount());<a name="line.920"></a>
+<span class="sourceLineNo">921</span><a name="line.921"></a>
+<span class="sourceLineNo">922</span>      // now find the compacted file, and manually add it to the recovered edits<a name="line.922"></a>
+<span class="sourceLineNo">923</span>      Path tmpDir = new Path(region.getRegionFileSystem().getTempDir(), Bytes.toString(family));<a name="line.923"></a>
+<span class="sourceLineNo">924</span>      FileStatus[] files = FSUtils.listStatus(fs, tmpDir);<a name="line.924"></a>
+<span class="sourceLineNo">925</span>      String errorMsg = "Expected to find 1 file in the region temp directory "<a name="line.925"></a>
+<span class="sourceLineNo">926</span>          + "from the compaction, could not find any";<a name="line.926"></a>
+<span class="sourceLineNo">927</span>      assertNotNull(errorMsg, files);<a name="line.927"></a>
+<span class="sourceLineNo">928</span>      assertEquals(errorMsg, 1, files.length);<a name="line.928"></a>
+<span class="sourceLineNo">929</span>      // move the file inside region dir<a name="line.929"></a>
+<span class="sourceLineNo">930</span>      Path newFile = region.getRegionFileSystem().commitStoreFile(Bytes.toString(family),<a name="line.930"></a>
+<span class="sourceLineNo">931</span>          files[0].getPath());<a name="line.931"></a>
+<span class="sourceLineNo">932</span><a name="line.932"></a>
+<span class="sourceLineNo">933</span>      byte[] encodedNameAsBytes = this.region.getRegionInfo().getEncodedNameAsBytes();<a name="line.933"></a>
+<span class="sourceLineNo">934</span>      byte[] fakeEncodedNameAsBytes = new byte [encodedNameAsBytes.length];<a name="line.934"></a>
+<span class="sourceLineNo">935</span>      for (int i=0; i &lt; encodedNameAsBytes.length; i++) {<a name="line.935"></a>
+<span class="sourceLineNo">936</span>        // Mix the byte array to have a new encodedName<a name="line.936"></a>
+<span class="sourceLineNo">937</span>        fakeEncodedNameAsBytes[i] = (byte) (encodedNameAsBytes[i] + 1);<a name="line.937"></a>
+<span class="sourceLineNo">938</span>      }<a name="line.938"></a>
+<span class="sourceLineNo">939</span><a name="line.939"></a>
+<span class="sourceLineNo">940</span>      CompactionDescriptor compactionDescriptor = ProtobufUtil.toCompactionDescriptor(this.region<a name="line.940"></a>
+<span class="sourceLineNo">941</span>        .getRegionInfo(), mismatchedRegionName ? fakeEncodedNameAsBytes : null, family,<a name="line.941"></a>
+<span class="sourceLineNo">942</span>            storeFiles, Lists.newArrayList(newFile),<a name="line.942"></a>
+<span class="sourceLineNo">943</span>            region.getRegionFileSystem().getStoreDir(Bytes.toString(family)));<a name="line.943"></a>
+<span class="sourceLineNo">944</span><a name="line.944"></a>
+<span class="sourceLineNo">945</span>      WALUtil.writeCompactionMarker(region.getWAL(), this.region.getReplicationScope(),<a name="line.945"></a>
+<span class="sourceLineNo">946</span>          this.region.getRegionInfo(), compactionDescriptor, region.getMVCC());<a name="line.946"></a>
+<span class="sourceLineNo">947</span><a name="line.947"></a>
+<span class="sourceLineNo">948</span>      Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.948"></a>
+<span class="sourceLineNo">949</span><a name="line.949"></a>
+<span class="sourceLineNo">950</span>      Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", 1000));<a name="line.950"></a>
+<span class="sourceLineNo">951</span>      fs.create(recoveredEdits);<a name="line.951"></a>
+<span class="sourceLineNo">952</span>      WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.952"></a>
+<span class="sourceLineNo">953</span><a name="line.953"></a>
+<span class="sourceLineNo">954</span>      long time = System.nanoTime();<a name="line.954"></a>
+<span class="sourceLineNo">955</span><a name="line.955"></a>
+<span class="sourceLineNo">956</span>      writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, 10, time,<a name="line.956"></a>
+<span class="sourceLineNo">957</span>          HConstants.DEFAULT_CLUSTER_ID), WALEdit.createCompaction(region.getRegionInfo(),<a name="line.957"></a>
+<span class="sourceLineNo">958</span>          compactionDescriptor)));<a name="line.958"></a>
+<span class="sourceLineNo">959</span>      writer.close();<a name="line.959"></a>
+<span class="sourceLineNo">960</span><a name="line.960"></a>
+<span class="sourceLineNo">961</span>      // close the region now, and reopen again<a name="line.961"></a>
+<span class="sourceLineNo">962</span>      region.getTableDescriptor();<a name="line.962"></a>
+<span class="sourceLineNo">963</span>      region.getRegionInfo();<a name="line.963"></a>
+<span class="sourceLineNo">964</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.964"></a>
+<span class="sourceLineNo">965</span>      try {<a name="line.965"></a>
+<span class="sourceLineNo">966</span>        region = HRegion.openHRegion(region, null);<a name="line.966"></a>
+<span class="sourceLineNo">967</span>      } catch (WrongRegionException wre) {<a name="line.967"></a>
+<span class="sourceLineNo">968</span>        fail("Matching encoded region name should not have produced WrongRegionException");<a name="line.968"></a>
+<span class="sourceLineNo">969</span>      }<a name="line.969"></a>
+<span class="sourceLineNo">970</span><a name="line.970"></a>
+<span class="sourceLineNo">971</span>      // now check whether we have only one store file, the compacted one<a name="line.971"></a>
+<span class="sourceLineNo">972</span>      Collection&lt;HStoreFile&gt; sfs = region.getStore(family).getStorefiles();<a name="line.972"></a>
+<span class="sourceLineNo">973</span>      for (HStoreFile sf : sfs) {<a name="line.973"></a>
+<span class="sourceLineNo">974</span>        LOG.info(Objects.toString(sf.getPath()));<a name="line.974"></a>
+<span class="sourceLineNo">975</span>      }<a name="line.975"></a>
+<span class="sourceLineNo">976</span>      if (!mismatchedRegionName) {<a name="line.976"></a>
+<span class="sourceLineNo">977</span>        assertEquals(1, region.getStore(family).getStorefilesCount());<a name="line.977"></a>
+<span class="sourceLineNo">978</span>      }<a name="line.978"></a>
+<span class="sourceLineNo">979</span>      files = FSUtils.listStatus(fs, tmpDir);<a name="line.979"></a>
+<span class="sourceLineNo">980</span>      assertTrue("Expected to find 0 files inside " + tmpDir, files == null || files.length == 0);<a name="line.980"></a>
+<span class="sourceLineNo">981</span><a name="line.981"></a>
+<span class="sourceLineNo">982</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.982"></a>
+<span class="sourceLineNo">983</span>        Get get = new Get(Bytes.toBytes(i));<a name="line.983"></a>
+<span class="sourceLineNo">984</span>        Result result = region.get(get);<a name="line.984"></a>
+<span class="sourceLineNo">985</span>        byte[] value = result.getValue(family, Bytes.toBytes(i));<a name="line.985"></a>
+<span class="sourceLineNo">986</span>        assertArrayEquals(Bytes.toBytes(i), value);<a name="line.986"></a>
+<span class="sourceLineNo">987</span>      }<a name="line.987"></a>
+<span class="sourceLineNo">988</span>    } finally {<a name="line.988"></a>
+<span class="sourceLineNo">989</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.989"></a>
+<span class="sourceLineNo">990</span>      this.region = null;<a name="line.990"></a>
+<span class="sourceLineNo">991</span>      wals.close();<a name="line.991"></a>
+<span class="sourceLineNo">992</span>      CONF.setClass(HConstants.REGION_IMPL, HRegion.class, Region.class);<a name="line.992"></a>
+<span class="sourceLineNo">993</span>    }<a name="line.993"></a>
+<span class="sourceLineNo">994</span>  }<a name="line.994"></a>
+<span class="sourceLineNo">995</span><a name="line.995"></a>
+<span class="sourceLineNo">996</span>  @Test<a name="line.996"></a>
+<span class="sourceLineNo">997</span>  public void testFlushMarkers() throws Exception {<a name="line.997"></a>
+<span class="sourceLineNo">998</span>    // tests that flush markers are written to WAL and handled at recovered edits<a name="line.998"></a>
+<span class="sourceLineNo">999</span>    byte[] family = Bytes.toBytes("family");<a name="line.999"></a>
+<span class="sourceLineNo">1000</span>    Path logDir = TEST_UTIL.getDataTestDirOnTestFS(method + ".log");<a name="line.1000"></a>
+<span class="sourceLineNo">1001</span>    final Configuration walConf = new Configuration(TEST_UTIL.getConfiguration());<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.1002"></a>
+<span class="sourceLineNo">1003</span>    final WALFactory wals = new WALFactory(walConf, method);<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span>    final WAL wal = wals.getWAL(RegionInfoBuilder.newBuilder(tableName).build());<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span><a name="line.1005"></a>
+<span class="sourceLineNo">1006</span>    this.region = initHRegion(tableName, HConstants.EMPTY_START_ROW,<a name="line.1006"></a>
+<span class="sourceLineNo">1007</span>      HConstants.EMPTY_END_ROW, false, Durability.USE_DEFAULT, wal, family);<a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>    try {<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span><a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>      long maxSeqId = 3;<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span>      long minSeqId = 0;<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span><a name="line.1015"></a>
+<span class="sourceLineNo">1016</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>        Put put = new Put(Bytes.toBytes(i));<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span>        put.addColumn(family, Bytes.toBytes(i), Bytes.toBytes(i));<a name="line.1018"></a>
+<span class="sourceLineNo">1019</span>        region.put(put);<a name="line.1019"></a>
+<span class="sourceLineNo">1020</span>        region.flush(true);<a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>      }<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span><a name="line.1022"></a>
+<span class="sourceLineNo">1023</span>      // this will create a region with 3 files from flush<a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>      assertEquals(3, region.getStore(family).getStorefilesCount());<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span>      List&lt;String&gt; storeFiles = new ArrayList&lt;&gt;(3);<a name="line.1025"></a>
+<span class="sourceLineNo">1026</span>      for (HStoreFile sf : region.getStore(family).getStorefiles()) {<a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>        storeFiles.add(sf.getPath().getName());<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span>      }<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span><a name="line.1029"></a>
+<span class="sourceLineNo">1030</span>      // now verify that the flush markers are written<a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>      wal.shutdown();<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>      WAL.Reader reader = WALFactory.createReader(fs, AbstractFSWALProvider.getCurrentFileName(wal),<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>        TEST_UTIL.getConfiguration());<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>      try {<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span>        List&lt;WAL.Entry&gt; flushDescriptors = new ArrayList&lt;&gt;();<a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>        long lastFlushSeqId = -1;<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>        while (true) {<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>          WAL.Entry entry = reader.next();<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>          if (entry == null) {<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>            break;<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span>          }<a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>          Cell cell = entry.getEdit().getCells().get(0);<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>          if (WALEdit.isMetaEditFamily(cell)) {<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>            FlushDescriptor flushDesc = WALEdit.getFlushDescriptor(cell);<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span>            assertNotNull(flushDesc);<a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>            assertArrayEquals(tableName.getName(), flushDesc.getTableName().toByteArray());<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>            if (flushDesc.getAction() == FlushAction.START_FLUSH) {<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span>              assertTrue(flushDesc.getFlushSequenceNumber() &gt; lastFlushSeqId);<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span>            } else if (flushDesc.getAction() == FlushAction.COMMIT_FLUSH) {<a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>              assertTrue(flushDesc.getFlushSequenceNumber() == lastFlushSeqId);<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>            }<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>            lastFlushSeqId = flushDesc.getFlushSequenceNumber();<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>            assertArrayEquals(regionName, flushDesc.getEncodedRegionName().toByteArray());<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>            assertEquals(1, flushDesc.getStoreFlushesCount()); //only one store<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>            StoreFlushDescriptor storeFlushDesc = flushDesc.getStoreFlushes(0);<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>            assertArrayEquals(family, storeFlushDesc.getFamilyName().toByteArray());<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span>            assertEquals("family", storeFlushDesc.getStoreHomeDir());<a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>            if (flushDesc.getAction() == FlushAction.START_FLUSH) {<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>              assertEquals(0, storeFlushDesc.getFlushOutputCount());<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>            } else {<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>              assertEquals(1, storeFlushDesc.getFlushOutputCount()); //only one file from flush<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>              assertTrue(storeFiles.contains(storeFlushDesc.getFlushOutput(0)));<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>            }<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span><a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>            flushDescriptors.add(entry);<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>          }<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>        }<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span><a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>        assertEquals(3 * 2, flushDescriptors.size()); // START_FLUSH and COMMIT_FLUSH per flush<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span><a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>        // now write those markers to the recovered edits again.<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span><a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>        Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span><a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", 1000));<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>        fs.create(recoveredEdits);<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span><a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>        for (WAL.Entry entry : flushDescriptors) {<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>          writer.append(entry);<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>        }<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>        writer.close();<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>      } finally {<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>        if (null != reader) {<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>          try {<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>            reader.close();<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>          } catch (IOException exception) {<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>            LOG.warn("Problem closing wal: " + exception.getMessage());<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>            LOG.debug("exception details", exception);<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>          }<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>        }<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>      }<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span><a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>      // close the region now, and reopen again<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>      region = HRegion.openHRegion(region, null);<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span><a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>      // now check whether we have can read back the data from region<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>        Get get = new Get(Bytes.toBytes(i));<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>        Result result = region.get(get);<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>        byte[] value = result.getValue(family, Bytes.toBytes(i));<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>        assertArrayEquals(Bytes.toBytes(i), value);<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>      }<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>    } finally {<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>      this.region = null;<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>      wals.close();<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>    }<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>  }<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span><a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>  static class IsFlushWALMarker implements ArgumentMatcher&lt;WALEdit&gt; {<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>    volatile FlushAction[] actions;<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>    public IsFlushWALMarker(FlushAction... actions) {<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>      this.actions = actions;<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>    }<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span>    @Override<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>    public boolean matches(WALEdit edit) {<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>      List&lt;Cell&gt; cells = edit.getCells();<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>      if (cells.isEmpty()) {<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span>        return false;<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>      }<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>      if (WALEdit.isMetaEditFamily(cells.get(0))) {<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>        FlushDescriptor desc;<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>        try {<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>          desc = WALEdit.getFlushDescriptor(cells.get(0));<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>        } catch (IOException e) {<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>          LOG.warn(e.toString(), e);<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>          return false;<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>        }<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>        if (desc != null) {<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>          for (FlushAction action : actions) {<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>            if (desc.getAction() == action) {<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>              return true;<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>            }<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>          }<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>        }<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>      }<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span>      return false;<a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>    }<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>    public IsFlushWALMarker set(FlushAction... actions) {<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>      this.actions = actions;<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>      return this;<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>    }<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>  }<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span><a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>  @Test<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span>  public void testFlushMarkersWALFail() throws Exception {<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>    // test the cases where the WAL append for flush markers fail.<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>    byte[] family = Bytes.toBytes("family");<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span><a name="line.1151"></a>
+<span class="sourceLineNo">1152</span>    // spy an actual WAL implementation to throw exception (was not able to mock)<a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>    Path logDir = TEST_UTIL.getDataTestDirOnTestFS(method + "log");<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span><a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>    final Configuration walConf = new Configuration(TEST_UTIL.getConfiguration());<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>    // Make up a WAL that we can manipulate at append time.<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>    class FailAppendFlushMarkerWAL extends FSHLog {<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>      volatile FlushAction [] flushActions = null;<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span><a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>      public FailAppendFlushMarkerWAL(FileSystem fs, Path root, String logDir, Configuration conf)<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>      throws IOException {<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>        super(fs, root, logDir, conf);<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>      }<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span><a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>      @Override<a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>      protected Writer createWriterInstance(Path path) throws IOException {<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>        final Writer w = super.createWriterInstance(path);<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>        return new Writer() {<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>          @Override<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>          public void close() throws IOException {<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>            w.close();<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>          }<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span><a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>          @Override<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>          public void sync(boolean forceSync) throws IOException {<a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>            w.sync(forceSync);<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span>          }<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span><a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>          @Override<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>          public void append(Entry entry) throws IOException {<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>            List&lt;Cell&gt; cells = entry.getEdit().getCells();<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>            if (WALEdit.isMetaEditFamily(cells.get(0))) {<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>              FlushDescriptor desc = WALEdit.getFlushDescriptor(cells.get(0));<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>              if (desc != null) {<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>                for (FlushAction flushAction: flushActions) {<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>                  if (desc.getAction().equals(flushAction)) {<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>                    throw new IOException("Failed to append flush marker! " + flushAction);<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>                  }<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>                }<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>              }<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>            }<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>            w.append(entry);<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>          }<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span><a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>          @Override<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>          public long getLength() {<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>            return w.getLength();<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>          }<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>        };<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>      }<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>    }<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>    FailAppendFlushMarkerWAL wal =<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>      new FailAppendFlushMarkerWAL(FileSystem.get(walConf), FSUtils.getRootDir(walConf),<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>        method, walConf);<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>    wal.init();<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>    this.region = initHRegion(tableName, HConstants.EMPTY_START_ROW,<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>      HConstants.EMPTY_END_ROW, false, Durability.USE_DEFAULT, wal, family);<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>    int i = 0;<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>    Put put = new Put(Bytes.toBytes(i));<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>    put.setDurability(Durability.SKIP_WAL); // have to skip mocked wal<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>    put.addColumn(family, Bytes.toBytes(i), Bytes.toBytes(i));<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>    region.put(put);<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span><a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>    // 1. Test case where START_FLUSH throws exception<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>    wal.flushActions = new FlushAction [] {FlushAction.START_FLUSH};<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span><a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>    // start cache flush will throw exception<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>    try {<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>      region.flush(true);<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>      fail("This should have thrown exception");<a name="line.1221"></a>
+<span class="sourceLineNo">1222</span>    } catch (DroppedSnapshotException unexpected) {<a name="line.1222"></a>
+<span class="sourceLineNo">1223</span>      // this should not be a dropped snapshot exception. Meaning that RS will not abort<a name="line.1223"></a>
+<span class="sourceLineNo">1224</span>      throw unexpected;<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span>    } catch (IOException expected) {<a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>      // expected<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span>    }<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>    // The WAL is hosed now. It has two edits appended. We cannot roll the log without it<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>    // throwing a DroppedSnapshotException to force an abort. Just clean up the mess.<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>    region.close(true);<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>    wal.close();<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span><a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>    // 2. Test case where START_FLUSH succeeds but COMMIT_FLUSH will throw exception<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>    wal.flushActions = new FlushAction [] {FlushAction.COMMIT_FLUSH};<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>    wal = new FailAppendFlushMarkerWAL(FileSystem.get(walConf), FSUtils.getRootDir(walConf),<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>          method, walConf);<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>    wal.init();<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span>    this.region = initHRegion(tableName, HConstants.EMPTY_START_ROW,<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>      HConstants.EMPTY_END_ROW, false, Durability.USE_DEFAULT, wal, family);<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>    region.put(put);<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span><a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>    // 3. Test case where ABORT_FLUSH will throw exception.<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span>    // Even if ABORT_FLUSH throws exception, we should not fail with IOE, but continue with<a name="line.1243"></a>
+<span class="sourceLineNo">1244</span>    // DroppedSnapshotException. Below COMMMIT_FLUSH will cause flush to abort<a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>    wal.flushActions = new FlushAction [] {FlushAction.COMMIT_FLUSH, FlushAction.ABORT_FLUSH};<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span><a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>    try {<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span>      region.flush(true);<a name="line.1248"></a>
+<span class="sourceLineNo">1249</span>      fail("This should have thrown exception");<a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>    } catch (DroppedSnapshotException expected) {<a name="line.1250"></a>
+<span class="sourceLineNo">1251</span>      // we expect this exception, since we were able to write the snapshot, but failed to<a name="line.1251"></a>
+<span class="sourceLineNo">1252</span>      // write the flush marker to WAL<a name="line.1252"></a>
+<span class="sourceLineNo">1253</span>    } catch (IOException unexpected) {<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span>      throw unexpected;<a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>    }<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>  }<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span><a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>  @Test<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>  public void testGetWhileRegionClose() throws IOException {<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span>    Configuration hc = initSplit();<a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>    int numRows = 100;<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>    byte[][] families = { fam1, fam2, fam3 };<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span><a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>    // Setting up region<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span>    this.region = initHRegion(tableName, method, hc, families);<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>    // Put data in region<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span>    final int startRow = 100;<a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>    putData(startRow, numRows, qual1, families);<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>    putData(startRow, numRows, qual2, families);<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>    putData(startRow, numRows, qual3, families);<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span>    final AtomicBoolean done = new AtomicBoolean(false);<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>    final AtomicInteger gets = new AtomicInteger(0);<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>    GetTillDoneOrException[] threads = new GetTillDoneOrException[10];<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>    try {<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>      // Set ten threads running concurrently getting from the region.<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span>      for (int i = 0; i &lt; threads.length / 2; i++) {<a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>        threads[i] = new GetTillDoneOrException(i, Bytes.toBytes("" + startRow), done, gets);<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>        threads[i].setDaemon(true);<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>        threads[i].start();<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>      }<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>      // Artificially make the condition by setting closing flag explicitly.<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span>      // I can't make the issue happen with a call to region.close().<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span>      this.region.closing.set(true);<a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>      for (int i = threads.length / 2; i &lt; threads.length; i++) {<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>        threads[i] = new GetTillDoneOrException(i, Bytes.toBytes("" + startRow), done, gets);<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>        threads[i].setDaemon(true);<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>        threads[i].start();<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span>      }<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>    } finally {<a name="line.1289"></a>
+<span class="sourceLineNo">1290</span>      if (this.region != null) {<a name="line.1290"></a>
+<span class="sourceLineNo">1291</span>        HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>        this.region = null;<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>      }<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>    }<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>    done.set(true);<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>    for (GetTillDoneOrException t : threads) {<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span>      try {<a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>        t.join();<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>      } catch (InterruptedException e) {<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>        e.printStackTrace();<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>      }<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>      if (t.e != null) {<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span>        LOG.info("Exception=" + t.e);<a name="line.1303"></a>
+<span class="sourceLineNo">1304</span>        assertFalse("Found a NPE in " + t.getName(), t.e instanceof NullPointerException);<a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>      }<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>    }<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span>  }<a name="line.1307"></a>
+<span class="sourceLineNo">1308</span><a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>  /*<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>   * Thread that does get on single row until 'done' flag is flipped. If an<a name="line.1310"></a>
+<span class="sourceLineNo">1311</span>   * exception causes us to fail, it records it.<a name="line.1311"></a>
+<span class="sourceLineNo">1312</span>   */<a name="line.1312"></a>
+<span class="sourceLineNo">1313</span>  class GetTillDoneOrException extends Thread {<a name="line.1313"></a>
+<span class="sourceLineNo">1314</span>    private final Get g;<a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>    private final AtomicBoolean done;<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>    private final AtomicInteger count;<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>    private Exception e;<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span><a name="line.1318"></a>
+<span class="sourceLineNo">1319</span>    GetTillDoneOrException(final int i, final byte[] r, final AtomicBoolean d,<a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>        final AtomicInteger c) {<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>      super("getter." + i);<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>      this.g = new Get(r);<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>      this.done = d;<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span>      this.count = c;<a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>    }<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span><a name="line.1326"></a>
+<span class="sourceLineNo">1327</span>    @Override<a name="line.1327"></a>
+<span class="sourceLineNo">1328</span>    public void run() {<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>      while (!this.done.get()) {<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span>        try {<a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>          assertTrue(region.get(g).size() &gt; 0);<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>          this.count.incrementAndGet();<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>        } catch (Exception e) {<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>          this.e = e;<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span>          break;<a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>        }<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>      }<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>    }<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>  }<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span><a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>  /*<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>   * An involved filter test. Has multiple column families and deletes in mix.<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>   */<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>  @Test<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>  public void testWeirdCacheBehaviour() throws Exception {<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.1346"></a>
+<span class="sourceLineNo">1347</span>    byte[][] FAMILIES = new byte[][] { Bytes.toBytes("trans-blob"), Bytes.toBytes("trans-type"),<a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>        Bytes.toBytes("trans-date"), Bytes.toBytes("trans-tags"), Bytes.toBytes("trans-group") };<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span>    this.region = initHRegion(tableName, method, CONF, FAMILIES);<a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>    String value = "this is the value";<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>    String value2 = "this is some other value";<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>    String keyPrefix1 = "prefix1";<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>    String keyPrefix2 = "prefix2";<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span>    String keyPrefix3 = "prefix3";<a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>    putRows(this.region, 3, value, keyPrefix1);<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>    putRows(this.region, 3, value, keyPrefix2);<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span>    putRows(this.region, 3, value, keyPrefix3);<a name="line.1357"></a>
+<span class="sourceLineNo">1358</span>    putRows(this.region, 3, value2, keyPrefix1);<a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>    putRows(this.region, 3, value2, keyPrefix2);<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>    putRows(this.region, 3, value2, keyPrefix3);<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span>    System.out.println("Checking values for key: " + keyPrefix1);<a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>    assertEquals("Got back incorrect number of rows from scan", 3,<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>        getNumberOfRows(keyPrefix1, value2, this.region));<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span>    System.out.println("Checking values for key: " + keyPrefix2);<a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>    assertEquals("Got back incorrect number of rows from scan", 3,<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span>        getNumberOfRows(keyPrefix2, value2, this.region));<a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>    System.out.println("Checking values for key: " + keyPrefix3);<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>    assertEquals("Got back incorrect number of rows from scan", 3,<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>        getNumberOfRows(keyPrefix3, value2, this.region));<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>    deleteColumns(this.region, value2, keyPrefix1);<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>    deleteColumns(this.region, value2, keyPrefix2);<a name="line.1371"></a>
+<span class="sourceLineNo">1372</span>    deleteColumns(this.region, value2, keyPrefix3);<a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>    System.out.println("Starting important checks.....");<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>    assertEquals("Got back incorrect number of rows from scan: " + keyPrefix1, 0,<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span>        getNumberOfRows(keyPrefix1, value2, this.region));<a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>    assertEquals("Got back incorrect number of rows from scan: " + keyPrefix2, 0,<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>        getNumberOfRows(keyPrefix2, value2, this.region));<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>    assertEquals("Got back incorrect number of rows from scan: " + keyPrefix3, 0,<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span>        getNumberOfRows(keyPrefix3, value2, this.region));<a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>  }<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span><a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>  @Test<a name="line.1382"></a>
+<span class="sourceLineNo">1383</span>  public void testAppendWithReadOnlyTable() throws Exception {<a name="line.1383"></a>
+<span class="sourceLineNo">1384</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.1384"></a>
+<span class="sourceLineNo">1385</span>    this.region = initHRegion(tableName, method, CONF, true, Bytes.toBytes("somefamily"));<a name="line.1385"></a>
+<span class="sourceLineNo">1386</span>    boolean exceptionCaught = false;<a name="line.1386"></a>
+<span class="sourceLineNo">1387</span>    Append append = new Append(Bytes.toBytes("somerow"));<a name="line.1387"></a>
+<span class="sourceLineNo">1388</span>    append.setDurability(Durability.SKIP_WAL);<a name="line.1388"></a>
+<span class="sourceLineNo">1389</span>    append.addColumn(Bytes.toBytes("somefamily"), Bytes.toBytes("somequalifier"),<a name="line.1389"></a>
+<span class="sourceLineNo">1390</span>        Bytes.toBytes("somevalue"));<a name="line.1390"></a>
+<span class="sourceLineNo">1391</span>    try {<a name="line.1391"></a>
+<span class="sourceLineNo">1392</span>      region.append(append);<a name="line.1392"></a>
+<span class="sourceLineNo">1393</span>    } catch (IOException e) {<a name="line.1393"></a>
+<span class="sourceLineNo">1394</span>      exceptionCaught = true;<a name="line.1394"></a>
+<span class="sourceLineNo">1395</span>    }<a name="line.1395"></a>
+<span class="sourceLineNo">1396</span>    assertTrue(exceptionCaught == true);<a name="line.1396"></a>
+<span class="sourceLineNo">1397</span>  }<a name="line.1397"></a>
+<span class="sourceLineNo">1398</span><a name="line.1398"></a>
+<span class="sourceLineNo">1399</span>  @Test<a name="line.1399"></a>
+<span class="sourceLineNo">1400</span>  public void testIncrWithReadOnlyTable() throws Exception {<a name="line.1400"></a>
+<span class="sourceLineNo">1401</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.1401"></a>
+<span class="sourceLineNo">1402</span>    this.region = initHRegion(tableName, method, CONF, true, Bytes.toBytes("somefamily"));<a name="line.1402"></a>
+<span class="sourceLineNo">1403</span>    boolean exceptionCaught = false;<a name="line.1403"></a>
+<span class="sourceLineNo">1404</span>    Increment inc = new Increment(Bytes.toBytes("somerow"));<a name="line.1404"></a>
+<span class="sourceLineNo">1405</span>    inc.setDurability(Durability.SKIP_WAL);<a name="line.1405"></a>
+<span class="sourceLineNo">1406</span>    inc.addColumn(Bytes.toBytes("somefamily"), Bytes.toBytes("somequalifier"), 1L);<a name="line.1406"></a>
+<span class="sourceLineNo">1407</span>    try {<a name="line.1407"></a>
+<span class="sourceLineNo">1408</span>      region.increment(inc);<a name="line.1408"></a>
+<span class="sourceLineNo">1409</span>    } catch (IOException e) {<a name="line.1409"></a>
+<span class="sourceLineNo">1410</span>      exceptionCaught = true;<a name="line.1410"></a>
+<span class="sourceLineNo">1411</span>    }<a name="line.1411"></a>
+<span class="sourceLineNo">1412</span>    assertTrue(exceptionCaught == true);<a name="line.1412"></a>
+<span class="sourceLineNo">1413</span>  }<a name="line.1413"></a>
+<span class="sourceLineNo">1414</span><a name="line.1414"></a>
+<span class="sourceLineNo">1415</span>  private void deleteColumns(HRegion r, String value, String keyPrefix) throws IOException {<a name="line.1415"></a>
+<span class="sourceLineNo">1416</span>    InternalScanner scanner = buildScanner(keyPrefix, value, r);<a name="line.1416"></a>
+<span class="sourceLineNo">1417</span>    int count = 0;<a name="line.1417"></a>
+<span class="sourceLineNo">1418</span>    boolean more = false;<a name="line.1418"></a>
+<span class="sourceLineNo">1419</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.1419"></a>
+<span class="sourceLineNo">1420</span>    do {<a name="line.1420"></a>
+<span class="sourceLineNo">1421</span>      more = scanner.next(results);<a name="line.1421"></a>
+<span class="sourceLineNo">1422</span>      if (results != null &amp;&amp; !results.isEmpty())<a name="line.1422"></a>
+<span class="sourceLineNo">1423</span>        count++;<a name="line.1423"></a>
+<span class="sourceLineNo">1424</span>      else<a name="line.1424"></a>
+<span class="sourceLineNo">1425</span>        break;<a name="line.1425"></a>
+<span class="sourceLineNo">1426</span>      Delete delete = new Delete(CellUtil.cloneRow(results.get(0)));<a name="line.1426"></a>
+<span class="sourceLineNo">1427</span>      delete.addColumn(Bytes.toBytes("trans-tags"), Bytes.toBytes("qual2"));<a name="line.1427"></a>
+<span class="sourceLineNo">1428</span>      r.delete(delete);<a name="line.1428"></a>
+<span class="sourceLineNo">1429</span>      results.clear();<a name="line.1429"></a>
+<span class="sourceLineNo">1430</span>    } while (more);<a name="line.1430"></a>
+<span class="sourceLineNo">1431</span>    assertEquals("Did not perform correct number of deletes", 3, count);<a name="line.1431"></a>
+<span class="sourceLineNo">1432</span>  }<a name="line.1432"></a>
+<span class="sourceLineNo">1433</span><a name="line.1433"></a>
+<span class="sourceLineNo">1434</span>  private int getNumberOfRows(String keyPrefix, String value, HRegion r) throws Exception {<a name="line.1434"></a>
+<span class="sourceLineNo">1435</span>    InternalScanner resultScanner = buildScanner(keyPrefix, value, r);<a name="line.1435"></a>
+<span class="sourceLineNo">1436</span>    int numberOfResults = 0;<a name="line.1436"></a>
+<span class="sourceLineNo">1437</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.1437"></a>
+<span class="sourceLineNo">1438</span>    boolean more = false;<a name="line.1438"></a>
+<span class="sourceLineNo">1439</span>    do {<a name="line.1439"></a>
+<span class="sourceLineNo">1440</span>      more = resultScanner.next(results);<a name="line.1440"></a>
+<span class="sourceLineNo">1441</span>      if (results != null &amp;&amp; !results.isEmpty())<a name="line.1441"></a>
+<span class="sourceLineNo">1442</span>        numberOfResults++;<a name="line.1442"></a>
+<span class="sourceLineNo">1443</span>      else<a name="line.1443"></a>
+<span class="sourceLineNo">1444</span>        break;<a name="line.1444"></a>
+<span class="sourceLineNo">1445</span>      for (Cell kv : results) {<a name="line.1445"></a>
+<span class="sourceLineNo">1446</span>        System.out.println("kv=" + kv.toString() + ", " + Bytes.toString(CellUtil.cloneValue(kv)));<a name="line.1446"></a>
+<span class="sourceLineNo">1447</span>      }<a name="line.1447"></a>
+<span class="sourceLineNo">1448</span>      results.clear();<a name="line.1448"></a>
+<span class="sourceLineNo">1449</span>    } while (more);<a name="line.1449"></a>
+<span class="sourceLineNo">1450</span>    return numberOfResults;<a name="line.1450"></a>
+<span class="sourceLineNo">1451</span>  }<a name="line.1451"></a>
+<span class="sourceLineNo">1452</span><a name="line.1452"></a>
+<span class="sourceLineNo">1453</span>  private InternalScanner buildScanner(String keyPrefix, String value, HRegion r)<a name="line.1453"></a>
+<span class="sourceLineNo">1454</span>      throws IOException {<a name="line.1454"></a>
+<span class="sourceLineNo">1455</span>    // Defaults FilterList.Operator.MUST_PASS_ALL.<a name="line.1455"></a>
+<span class="sourceLineNo">1456</span>    FilterList allFilters = new FilterList();<a name="line.1456"></a>
+<span class="sourceLineNo">1457</span>    allFilters.addFilter(new PrefixFilter(Bytes.toBytes(keyPrefix)));<a name="line.1457"></a>
+<span class="sourceLineNo">1458</span>    // Only return rows where this column value exists in the row.<a name="line.1458"></a>
+<span class="sourceLineNo">1459</span>    SingleColumnValueFilter filter = new SingleColumnValueFilter(Bytes.toBytes("trans-tags"),<a name="line.1459"></a>
+<span class="sourceLineNo">1460</span>        Bytes.toBytes("qual2"), CompareOperator.EQUAL, Bytes.toBytes(value));<a name="line.1460"></a>
+<span class="sourceLineNo">1461</span>    filter.setFilterIfMissing(true);<a name="line.1461"></a>
+<span class="sourceLineNo">1462</span>    allFilters.addFilter(filter);<a name="line.1462"></a>
+<span class="sourceLineNo">1463</span>    Scan scan = new Scan();<a name="line.1463"></a>
+<span class="sourceLineNo">1464</span>    scan.addFamily(Bytes.toBytes("trans-blob"));<a name="line.1464"></a>
+<span class="sourceLineNo">1465</span>    scan.addFamily(Bytes.toBytes("trans-type"));<a name="line.1465"></a>
+<span class="sourceLineNo">1466</span>    scan.addFamily(Bytes.toBytes("trans-date"));<a name="line.1466"></a>
+<span class="sourceLineNo">1467</span>    scan.addFamily(Bytes.toBytes("trans-tags"));<a name="line.1467"></a>
+<span class="sourceLineNo">1468</span>    scan.addFamily(Bytes.toBytes("trans-group"));<a name="line.1468"></a>
+<span class="sourceLineNo">1469</span>    scan.setFilter(allFilters);<a name="line.1469"></a>
+<span class="sourceLineNo">1470</span>    return r.getScanner(scan);<a name="line.1470"></a>
+<span class="sourceLineNo">1471</span>  }<a name="line.1471"></a>
+<span class="sourceLineNo">1472</span><a name="line.1472"></a>
+<span class="sourceLineNo">1473</span>  private void putRows(HRegion r, int numRows, String value, String key) throws IOException {<a name="line.1473"></a>
+<span class="sourceLineNo">1474</span>    for (int i = 0; i &lt; numRows; i++) {<a name="line.1474"></a>
+<span class="sourceLineNo">1475</span>      String row = key + "_" + i/* UUID.randomUUID().toString() */;<a name="line.1475"></a>
+<span class="sourceLineNo">1476</span>      System.out.println(String.format("Saving row: %s, with value %s", row, value));<a name="line.1476"></a>
+<span class="sourceLineNo">1477</span>      Put put = new Put(Bytes.toBytes(row));<a name="line.1477"></a>
+<span class="sourceLineNo">1478</span>      put.setDurability(Durability.SKIP_WAL);<a name="line.1478"></a>
+<span class="sourceLineNo">1479</span>      put.addColumn(Bytes.toBytes("trans-blob"), null, Bytes.toBytes("value for blob"));<a name="line.1479"></a>
+<span class="sourceLineNo">1480</span>      put.addColumn(Bytes.toBytes("trans-type"), null, Bytes.toBytes("statement"));<a name="line.1480"></a>
+<span class="sourceLineNo">1481</span>      put.addColumn(Bytes.toBytes("trans-date"), null, Bytes.toBytes("20090921010101999"));<a name="line.1481"></a>
+<span class="sourceLineNo">1482</span>      put.addColumn(Bytes.toBytes("trans-tags"), Bytes.toBytes("qual2"), Bytes.toBytes(value));<a name="line.1482"></a>
+<span class="sourceLineNo">1483</span>      put.addColumn(Bytes.toBytes("trans-group"), null, Bytes.toBytes("adhocTransactionGroupId"));<a name="line.1483"></a>
+<span class="sourceLineNo">1484</span>      r.put(put);<a name="line.1484"></a>
+<span class="sourceLineNo">1485</span>    }<a name="line.1485"></a>
+<span class="sourceLineNo">1486</span>  }<a name="line.1486"></a>
+<span class="sourceLineNo">1487</span><a name="line.1487"></a>
+<span class="sourceLineNo">1488</span>  @Test<a name="line.1488"></a>
+<span class="sourceLineNo">1489</span>  public void testFamilyWithAndWithoutColon() throws Exception {<a name="line.1489"></a>
+<span class="sourceLineNo">1490</span>    byte[] cf = Bytes.toBytes(COLUMN_FAMILY);<a name="line.1490"></a>
+<span class="sourceLineNo">1491</span>    this.region = initHRegion(tableName, method, CONF, cf);<a name="line.1491"></a>
+<span class="sourceLineNo">1492</span>    Put p = new Put(tableName.toBytes());<a name="line.1492"></a>
+<span class="sourceLineNo">1493</span>    byte[] cfwithcolon = Bytes.toBytes(COLUMN_FAMILY + ":");<a name="line.1493"></a>
+<span class="sourceLineNo">1494</span>    p.addColumn(cfwithcolon, cfwithcolon, cfwithcolon);<a name="line.1494"></a>
+<span class="sourceLineNo">1495</span>    boolean exception = false;<a name="line.1495"></a>
+<span class="sourceLineNo">1496</span>    try {<a name="line.1496"></a>
+<span class="sourceLineNo">1497</span>      this.region.put(p);<a name="line.1497"></a>
+<span class="sourceLineNo">1498</span>    } catch (NoSuchColumnFamilyException e) {<a name="line.1498"></a>
+<span class="sourceLineNo">1499</span>      exception = true;<a name="line.1499"></a>
+<span class="sourceLineNo">1500</span>    }<a name="line.1500"></a>
+<span class="sourceLineNo">1501</span>    assertTrue(exception);<a name="line.1501"></a>
+<span class="sourceLineNo">1502</span>  }<a name="line.1502"></a>
+<span class="sourceLineNo">1503</span><a name="line.1503"></a>
+<span class="sourceLineNo">1504</span>  @Test<a name="line.1504"></a>
+<span class="sourceLineNo">1505</span>  public void testBatchPut_whileNoRowLocksHeld() throws IOException {<a name="line.1505"></a>
+<span class="sourceLineNo">1506</span>    final Put[] puts = new Put[10];<a name="line.1506"></a>
+<span class="sourceLineNo">1507</span>    MetricsWALSource source = CompatibilitySingletonFactory.getInstance(MetricsWALSource.class);<a name="line.1507"></a>
+<span class="sourceLineNo">1508</span>    long syncs = prepareRegionForBachPut(puts, source, false);<a name="line.1508"></a>
+<span class="sourceLineNo">1509</span><a name="line.1509"></a>
+<span class="sourceLineNo">1510</span>    OperationStatus[] codes = this.region.batchMutate(puts);<a name="line.1510"></a>
+<span class="sourceLineNo">1511</span>    assertEquals(10, codes.length);<a name="line.1511"></a>
+<span class="sourceLineNo">1512</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.1512"></a>
+<span class="sourceLineNo">1513</span>      assertEquals(OperationStatusCode.SUCCESS, codes[i].getOperationStatusCode());<a name="line.1513"></a>
+<span class="sourceLineNo">1514</span>    }<a name="line.1514"></a>
+<span class="sourceLineNo">1515</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs + 1, source);<a name="line.1515"></a>
+<span class="sourceLineNo">1516</span><a name="line.1516"></a>
+<span class="sourceLineNo">1517</span>    LOG.info("Next a batch put with one invalid family");<a name="line.1517"></a>
+<span class="sourceLineNo">1518</span>    puts[5].addColumn(Bytes.toBytes("BAD_CF"), qual, value);<a name="line.1518"></a>
+<span class="sourceLineNo">1519</span>    codes = this.region.batchMutate(puts);<a name="line.1519"></a>
+<span class="sourceLineNo">1520</span>    assertEquals(10, codes.length);<a name="line.1520"></a>
+<span class="sourceLineNo">1521</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.1521"></a>
+<span class="sourceLineNo">1522</span>      assertEquals((i == 5) ? OperationStatusCode.BAD_FAMILY : OperationStatusCode.SUCCESS,<a name="line.1522"></a>
+<span class="sourceLineNo">1523</span>          codes[i].getOperationStatusCode());<a name="line.1523"></a>
+<span class="sourceLineNo">1524</span>    }<a name="line.1524"></a>
+<span class="sourceLineNo">1525</span><a name="line.1525"></a>
+<span class="sourceLineNo">1526</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs + 2, source);<a name="line.1526"></a>
+<span class="sourceLineNo">1527</span>  }<a name="line.1527"></a>
+<span class="sourceLineNo">1528</span><a name="line.1528"></a>
+<span class="sourceLineNo">1529</span>  @Test<a name="line.1529"></a>
+<span class="sourceLineNo">1530</span>  public void testBatchPut_whileMultipleRowLocksHeld() throws Exception {<a name="line.1530"></a>
+<span class="sourceLineNo">1531</span>    final Put[] puts = new Put[10];<a name="line.1531"></a>
+<span class="sourceLineNo">1532</span>    MetricsWALSource source = CompatibilitySingletonFactory.getInstance(MetricsWALSource.class);<a name="line.1532"></a>
+<span class="sourceLineNo">1533</span>    long syncs = prepareRegionForBachPut(puts, source, false);<a name="line.1533"></a>
+<span class="sourceLineNo">1534</span><a name="line.1534"></a>
+<span class="sourceLineNo">1535</span>    puts[5].addColumn(Bytes.toBytes("BAD_CF"), qual, value);<a name="line.1535"></a>
+<span class="sourceLineNo">1536</span><a name="line.1536"></a>
+<span class="sourceLineNo">1537</span>    LOG.info("batchPut will have to break into four batches to avoid row locks");<a name="line.1537"></a>
+<span class="sourceLineNo">1538</span>    RowLock rowLock1 = region.getRowLock(Bytes.toBytes("row_2"));<a name="line.1538"></a>
+<span class="sourceLineNo">1539</span>    RowLock rowLock2 = region.getRowLock(Bytes.toBytes("row_1"));<a name="line.1539"></a>
+<span class="sourceLineNo">1540</span>    RowLock rowLock3 = region.getRowLock(Bytes.toBytes("row_3"));<a name="line.1540"></a>
+<span class="sourceLineNo">1541</span>    RowLock rowLock4 = region.getRowLock(Bytes.toBytes("row_3"), true);<a name="line.1541"></a>
+<span class="sourceLineNo">1542</span><a name="line.1542"></a>
+<span class="sourceLineNo">1543</span>    MultithreadedTestUtil.TestContext ctx = new MultithreadedTestUtil.TestContext(CONF);<a name="line.1543"></a>
+<span class="sourceLineNo">1544</span>    final AtomicReference&lt;OperationStatus[]&gt; retFromThread = new AtomicReference&lt;&gt;();<a name="line.1544"></a>
+<span class="sourceLineNo">1545</span>    final CountDownLatch startingPuts = new CountDownLatch(1);<a name="line.1545"></a>
+<span class="sourceLineNo">1546</span>    final CountDownLatch startingClose = new CountDownLatch(1);<a name="line.1546"></a>
+<span class="sourceLineNo">1547</span>    TestThread putter = new TestThread(ctx) {<a name="line.1547"></a>
+<span class="sourceLineNo">1548</span>      @Override<a name="line.1548"></a>
+<span class="sourceLineNo">1549</span>      public void doWork() throws IOException {<a name="line.1549"></a>
+<span class="sourceLineNo">1550</span>        startingPuts.countDown();<a name="line.1550"></a>
+<span class="sourceLineNo">1551</span>        retFromThread.set(region.batchMutate(puts));<a name="line.1551"></a>
+<span class="sourceLineNo">1552</span>      }<a name="line.1552"></a>
+<span class="sourceLineNo">1553</span>    };<a name="line.1553"></a>
+<span class="sourceLineNo">1554</span>    LOG.info("...starting put thread while holding locks");<a name="line.1554"></a>
+<span class="sourceLineNo">1555</span>    ctx.addThread(putter);<a name="line.1555"></a>
+<span class="sourceLineNo">1556</span>    ctx.startThreads();<a name="line.1556"></a>
+<span class="sourceLineNo">1557</span><a name="line.1557"></a>
+<span class="sourceLineNo">1558</span>    // Now attempt to close the region from another thread.  Prior to HBASE-12565<a name="line.1558"></a>
+<span class="sourceLineNo">1559</span>    // this would cause the in-progress batchMutate operation to to fail with<a name="line.1559"></a>
+<span class="sourceLineNo">1560</span>    // exception because it use to release and re-acquire the close-guard lock<a name="line.1560"></a>
+<span class="sourceLineNo">1561</span>    // between batches.  Caller then didn't get status indicating which writes succeeded.<a name="line.1561"></a>
+<span class="sourceLineNo">1562</span>    // We now expect this thread to block until the batchMutate call finishes.<a name="line.1562"></a>
+<span class="sourceLineNo">1563</span>    Thread regionCloseThread = new TestThread(ctx) {<a name="line.1563"></a>
+<span class="sourceLineNo">1564</span>      @Override<a name="line.1564"></a>
+<span class="sourceLineNo">1565</span>      public void doWork() {<a name="line.1565"></a>
+<span class="sourceLineNo">1566</span>        try {<a name="line.1566"></a>
+<span class="sourceLineNo">1567</span>          startingPuts.await();<a name="line.1567"></a>
+<span class="sourceLineNo">1568</span>          // Give some time for the batch mutate to get in.<a name="line.1568"></a>
+<span class="sourceLineNo">1569</span>          // We don't want to race with the mutate<a name="line.1569"></a>
+<span class="sourceLineNo">1570</span>          Thread.sleep(10);<a name="line.1570"></a>
+<span class="sourceLineNo">1571</span>          startingClose.countDown();<a name="line.1571"></a>
+<span class="sourceLineNo">1572</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.1572"></a>
+<span class="sourceLineNo">1573</span>          region = null;<a name="line.1573"></a>
+<span class="sourceLineNo">1574</span>        } catch (IOException e) {<a name="line.1574"></a>
+<span class="sourceLineNo">1575</span>          throw new RuntimeException(e);<a name="line.1575"></a>
+<span class="sourceLineNo">1576</span>        } catch (InterruptedException e) {<a name="line.1576"></a>
+<span class="sourceLineNo">1577</span>          throw new RuntimeException(e);<a name="line.1577"></a>
+<span class="sourceLineNo">1578</span>        }<a name="line.1578"></a>
+<span class="sourceLineNo">1579</span>      }<a name="line.1579"></a>
+<span class="sourceLineNo">1580</span>    };<a name="line.1580"></a>
+<span class="sourceLineNo">1581</span>    regionCloseThread.start();<a name="line.1581"></a>
+<span class="sourceLineNo">1582</span><a name="line.1582"></a>
+<span class="sourceLineNo">1583</span>    startingClose.await();<a name="line.1583"></a>
+<span class="sourceLineNo">1584</span>    startingPuts.await();<a name="line.1584"></a>
+<span class="sourceLineNo">1585</span>    Thread.sleep(100);<a name="line.1585"></a>
+<span class="sourceLineNo">1586</span>    LOG.info("...releasing row lock 1, which should let put thread continue");<a name="line.1586"></a>
+<span class="sourceLineNo">1587</span>    rowLock1.release();<a name="line.1587"></a>
+<span class="sourceLineNo">1588</span>    rowLock2.release();<a name="line.1588"></a>
+<span class="sourceLineNo">1589</span>    rowLock3.release();<a name="line.1589"></a>
+<span class="sourceLineNo">1590</span>    waitForCounter(source, "syncTimeNumOps", syncs + 1);<a name="line.1590"></a>
+<span class="sourceLineNo">1591</span><a name="line.1591"></a>
+<span class="sourceLineNo">1592</span>    LOG.info("...joining on put thread");<a name="line.1592"></a>
+<span class="sourceLineNo">1593</span>    ctx.stop();<a name="line.1593"></a>
+<span class="sourceLineNo">1594</span>    regionCloseThread.join();<a name="line.1594"></a>
+<span class="sourceLineNo">1595</span><a name="line.1595"></a>
+<span class="sourceLineNo">1596</span>    OperationStatus[] codes = retFromThread.get();<a name="line.1596"></a>
+<span class="sourceLineNo">1597</span>    for (int i = 0; i &lt; codes.length; i++) {<a name="line.1597"></a>
+<span class="sourceLineNo">1598</span>      assertEquals((i == 5) ? OperationStatusCode.BAD_FAMILY : OperationStatusCode.SUCCESS,<a name="line.1598"></a>
+<span class="sourceLineNo">1599</span>          codes[i].getOperationStatusCode());<a name="line.1599"></a>
+<span class="sourceLineNo">1600</span>    }<a name="line.1600"></a>
+<span class="sourceLineNo">1601</span>    rowLock4.release();<a name="line.1601"></a>
+<span class="sourceLineNo">1602</span>  }<a name="line.1602"></a>
+<span class="sourceLineNo">1603</span><a name="line.1603"></a>
+<span class="sourceLineNo">1604</span>  private void waitForCounter(MetricsWALSource source, String metricName, long expectedCount)<a name="line.1604"></a>
+<span class="sourceLineNo">1605</span>      throws InterruptedException {<a name="line.1605"></a>
+<span class="sourceLineNo">1606</span>    long startWait = System.currentTimeMillis();<a name="line.1606"></a>
+<span class="sourceLineNo">1607</span>    long currentCount;<a name="line.1607"></a>
+<span class="sourceLineNo">1608</span>    while ((currentCount = metricsAssertHelper.getCounter(metricName, source)) &lt; expectedCount) {<a name="line.1608"></a>
+<span class="sourceLineNo">1609</span>      Thread.sleep(100);<a name="line.1609"></a>
+<span class="sourceLineNo">1610</span>      if (System.currentTimeMillis() - startWait &gt; 10000) {<a name="line.1610"></a>
+<span class="sourceLineNo">1611</span>        fail(String.format("Timed out waiting for '%s' &gt;= '%s', currentCount=%s", metricName,<a name="line.1611"></a>
+<span class="sourceLineNo">1612</span>            expectedCount, currentCount));<a name="line.1612"></a>
+<span class="sourceLineNo">1613</span>      }<a name="line.1613"></a>
+<span class="sourceLineNo">1614</span>    }<a name="line.1614"></a>
+<span class="sourceLineNo">1615</span>  }<a name="line.1615"></a>
+<span class="sourceLineNo">1616</span><a name="line.1616"></a>
+<span class="sourceLineNo">1617</span>  @Test<a name="line.1617"></a>
+<span class="sourceLineNo">1618</span>  public void testAtomicBatchPut() throws IOException {<a name="line.1618"></a>
+<span class="sourceLineNo">1619</span>    final Put[] puts = new Put[10];<a name="line.1619"></a>
+<span class="sourceLineNo">1620</span>    MetricsWALSource source = CompatibilitySingletonFactory.getInstance(MetricsWALSource.class);<a name="line.1620"></a>
+<span class="sourceLineNo">1621</span>    long syncs = prepareRegionForBachPut(puts, source, false);<a name="line.1621"></a>
+<span class="sourceLineNo">1622</span><a name="line.1622"></a>
+<span class="sourceLineNo">1623</span>    // 1. Straight forward case, should succeed<a name="line.1623"></a>
+<span class="sourceLineNo">1624</span>    MutationBatchOperation batchOp = new MutationBatchOperation(region, puts, true,<a name="line.1624"></a>
+<span class="sourceLineNo">1625</span>        HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.1625"></a>
+<span class="sourceLineNo">1626</span>    OperationStatus[] codes = this.region.batchMutate(batchOp);<a name="line.1626"></a>
+<span class="sourceLineNo">1627</span>    assertEquals(10, codes.length);<a name="line.1627"></a>
+<span class="sourceLineNo">1628</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.1628"></a>
+<span class="sourceLineNo">1629</span>      assertEquals(OperationStatusCode.SUCCESS, codes[i].getOperationStatusCode());<a name="line.1629"></a>
+<span class="sourceLineNo">1630</span>    }<a name="line.1630"></a>
+<span class="sourceLineNo">1631</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs + 1, source);<a name="line.1631"></a>
+<span class="sourceLineNo">1632</span><a name="line.1632"></a>
+<span class="sourceLineNo">1633</span>    // 2. Failed to get lock<a name="line.1633"></a>
+<span class="sourceLineNo">1634</span>    RowLock lock = region.getRowLock(Bytes.toBytes("row_" + 3));<a name="line.1634"></a>
+<span class="sourceLineNo">1635</span>    // Method {@link HRegion#getRowLock(byte[])} is reentrant. As 'row_3' is locked in this<a name="line.1635"></a>
+<span class="sourceLineNo">1636</span>    // thread, need to run {@link HRegion#batchMutate(HRegion.BatchOperation)} in different thread<a name="line.1636"></a>
+<span class="sourceLineNo">1637</span>    MultithreadedTestUtil.TestContext ctx = new MultithreadedTestUtil.TestContext(CONF);<a name="line.1637"></a>
+<span class="sourceLineNo">1638</span>    final AtomicReference&lt;IOException&gt; retFromThread = new AtomicReference&lt;&gt;();<a name="line.1638"></a>
+<span class="sourceLineNo">1639</span>    final CountDownLatch finishedPuts = new CountDownLatch(1);<a name="line.1639"></a>
+<span class="sourceLineNo">1640</span>    final MutationBatchOperation finalBatchOp = new MutationBatchOperation(region, puts, true,<a name="line.1640"></a>
+<span class="sourceLineNo">1641</span>        HConstants<a name="line.1641"></a>
+<span class="sourceLineNo">1642</span>        .NO_NONCE,<a name="line.1642"></a>
+<span class="sourceLineNo">1643</span>        HConstants.NO_NONCE);<a name="line.1643"></a>
+<span class="sourceLineNo">1644</span>    TestThread putter = new TestThread(ctx) {<a name="line.1644"></a>
+<span class="sourceLineNo">1645</span>      @Override<a name="line.1645"></a>
+<span class="sourceLineNo">1646</span>      public void doWork() throws IOException {<a name="line.1646"></a>
+<span class="sourceLineNo">1647</span>        try {<a name="line.1647"></a>
+<span class="sourceLineNo">1648</span>          region.batchMutate(finalBatchOp);<a name="line.1648"></a>
+<span class="sourceLineNo">1649</span>        } catch (IOException ioe) {<a name="line.1649"></a>
+<span class="sourceLineNo">1650</span>          LOG.error("test failed!", ioe);<a name="line.1650"></a>
+<span class="sourceLineNo">1651</span>          retFromThread.set(ioe);<a name="line.1651"></a>
+<span class="sourceLineNo">1652</span>        }<a name="line.1652"></a>
+<span class="sourceLineNo">1653</span>        finishedPuts.countDown();<a name="line.1653"></a>
+<span class="sourceLineNo">1654</span>      }<a name="line.1654"></a>
+<span class="sourceLineNo">1655</span>    };<a name="line.1655"></a>
+<span class="sourceLineNo">1656</span>    LOG.info("...starting put thread while holding locks");<a name="line.1656"></a>
+<span class="sourceLineNo">1657</span>    ctx.addThread(putter);<a name="line.1657"></a>
+<span class="sourceLineNo">1658</span>    ctx.startThreads();<a name="line.1658"></a>
+<span class="sourceLineNo">1659</span>    LOG.info("...waiting for batch puts while holding locks");<a name="line.1659"></a>
+<span class="sourceLineNo">1660</span>    try {<a name="line.1660"></a>
+<span class="sourceLineNo">1661</span>      finishedPuts.await();<a name="line.1661"></a>
+<span class="sourceLineNo">1662</span>    } catch (InterruptedException e) {<a name="line.1662"></a>
+<span class="sourceLineNo">1663</span>      LOG.error("Interrupted!", e);<a name="line.1663"></a>
+<span class="sourceLineNo">1664</span>    } finally {<a name="line.1664"></a>
+<span class="sourceLineNo">1665</span>      if (lock != null) {<a name="line.1665"></a>
+<span class="sourceLineNo">1666</span>        lock.release();<a name="line.1666"></a>
+<span class="sourceLineNo">1667</span>      }<a name="line.1667"></a>
+<span class="sourceLineNo">1668</span>    }<a name="line.1668"></a>
+<span class="sourceLineNo">1669</span>    assertNotNull(retFromThread.get());<a name="line.1669"></a>
+<span class="sourceLineNo">1670</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs + 1, source);<a name="line.1670"></a>
+<span class="sourceLineNo">1671</span><a name="line.1671"></a>
+<span class="sourceLineNo">1672</span>    // 3. Exception thrown in validation<a name="line.1672"></a>
+<span class="sourceLineNo">1673</span>    LOG.info("Next a batch put with one invalid family");<a name="line.1673"></a>
+<span class="sourceLineNo">1674</span>    puts[5].addColumn(Bytes.toBytes("BAD_CF"), qual, value);<a name="line.1674"></a>
+<span class="sourceLineNo">1675</span>    batchOp = new MutationBatchOperation(region, puts, true, HConstants.NO_NONCE,<a name="line.1675"></a>
+<span class="sourceLineNo">1676</span>        HConstants.NO_NONCE);<a name="line.1676"></a>
+<span class="sourceLineNo">1677</span>    thrown.expect(NoSuchColumnFamilyException.class);<a name="line.1677"></a>
+<span class="sourceLineNo">1678</span>    this.region.batchMutate(batchOp);<a name="line.1678"></a>
+<span class="sourceLineNo">1679</span>  }<a name="line.1679"></a>
+<span class="sourceLineNo">1680</span><a name="line.1680"></a>
+<span class="sourceLineNo">1681</span>  @Test<a name="line.1681"></a>
+<span class="sourceLineNo">1682</span>  public void testBatchPutWithTsSlop() throws Exception {<a name="line.1682"></a>
+<span class="sourceLineNo">1683</span>    // add data with a timestamp that is too recent for range. Ensure assert<a name="line.1683"></a>
+<span class="sourceLineNo">1684</span>    CONF.setInt("hbase.hregion.keyvalue.timestamp.slop.millisecs", 1000);<a name="line.1684"></a>
+<span class="sourceLineNo">1685</span>    final Put[] puts = new Put[10];<a name="line.1685"></a>
+<span class="sourceLineNo">1686</span>    MetricsWALSource source = CompatibilitySingletonFactory.getInstance(MetricsWALSource.class);<a name="line.1686"></a>
+<span class="sourceLineNo">1687</span><a name="line.1687"></a>
+<span class="sourceLineNo">1688</span>    long syncs = prepareRegionForBachPut(puts, source, true);<a name="line.1688"></a>
+<span class="sourceLineNo">1689</span><a name="line.1689"></a>
+<span class="sourceLineNo">1690</span>    OperationStatus[] codes = this.region.batchMutate(puts);<a name="line.1690"></a>
+<span class="sourceLineNo">1691</span>    assertEquals(10, codes.length);<a name="line.1691"></a>
+<span class="sourceLineNo">1692</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.1692"></a>
+<span class="sourceLineNo">1693</span>      assertEquals(OperationStatusCode.SANITY_CHECK_FAILURE, codes[i].getOperationStatusCode());<a name="line.1693"></a>
+<span class="sourceLineNo">1694</span>    }<a name="line.1694"></a>
+<span class="sourceLineNo">1695</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs, source);<a name="line.1695"></a>
+<span class="sourceLineNo">1696</span>  }<a name="line.1696"></a>
+<span class="sourceLineNo">1697</span><a name="line.1697"></a>
+<span class="sourceLineNo">1698</span>  /**<a name="line.1698"></a>
+<span class="sourceLineNo">1699</span>   * @return syncs initial syncTimeNumOps<a name="line.1699"></a>
+<span class="sourceLineNo">1700</span>   */<a name="line.1700"></a>
+<span class="sourceLineNo">1701</span>  private long prepareRegionForBachPut(final Put[] puts, final MetricsWALSource source,<a name="line.1701"></a>
+<span class="sourceLineNo">1702</span>      boolean slop) throws IOException {<a name="line.1702"></a>
+<span class="sourceLineNo">1703</span>    this.region = initHRegion(tableName, method, CONF, COLUMN_FAMILY_BYTES);<a name="line.1703"></a>
+<span class="sourceLineNo">1704</span><a name="line.1704"></a>
+<span class="sourceLineNo">1705</span>    LOG.info("First a batch put with all valid puts");<a name="line.1705"></a>
+<span class="sourceLineNo">1706</span>    for (int i = 0; i &lt; puts.length; i++) {<a name="line.1706"></a>
+<span class="sourceLineNo">1707</span>      puts[i] = slop ? new Put(Bytes.toBytes("row_" + i), Long.MAX_VALUE - 100) :<a name="line.1707"></a>
+<span class="sourceLineNo">1708</span>          new Put(Bytes.toBytes("row_" + i));<a name="line.1708"></a>
+<span class="sourceLineNo">1709</span>      puts[i].addColumn(COLUMN_FAMILY_BYTES, qual, value);<a name="line.1709"></a>
+<span class="sourceLineNo">1710</span>    }<a name="line.1710"></a>
+<span class="sourceLineNo">1711</span><a name="line.1711"></a>
+<span class="sourceLineNo">1712</span>    long syncs = metricsAssertHelper.getCounter("syncTimeNumOps", source);<a name="line.1712"></a>
+<span class="sourceLineNo">1713</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs, source);<a name="line.1713"></a>
+<span class="sourceLineNo">1714</span>    return syncs;<a name="line.1714"></a>
+<span class="sourceLineNo">1715</span>  }<a name="line.1715"></a>
+<span class="sourceLineNo">1716</span><a name="line.1716"></a>
+<span class="sourceLineNo">1717</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.1717"></a>
+<span class="sourceLineNo">1718</span>  // checkAndMutate tests<a name="line.1718"></a>
+<span class="sourceLineNo">1719</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.1719"></a>
+<span class="sourceLineNo">1720</span>  @Test<a name="line.1720"></a>
+<span class="sourceLineNo">1721</span>  public void testCheckAndMutate_WithEmptyRowValue() throws IOException {<a name="line.1721"></a>
+<span class="sourceLineNo">1722</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1722"></a>
+<span class="sourceLineNo">1723</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1723"></a>
+<span class="sourceLineNo">1724</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1724"></a>
+<span class="sourceLineNo">1725</span>    byte[] emptyVal = new byte[] {};<a name="line.1725"></a>
+<span class="sourceLineNo">1726</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1726"></a>
+<span class="sourceLineNo">1727</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.1727"></a>
+<span class="sourceLineNo">1728</span><a name="line.1728"></a>
+<span class="sourceLineNo">1729</span>    // Setting up region<a name="line.1729"></a>
+<span class="sourceLineNo">1730</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.1730"></a>
+<span class="sourceLineNo">1731</span>    // Putting empty data in key<a name="line.1731"></a>
+<span class="sourceLineNo">1732</span>    Put put = new Put(row1);<a name="line.1732"></a>
+<span class="sourceLineNo">1733</span>    put.addColumn(fam1, qf1, emptyVal);<a name="line.1733"></a>
+<span class="sourceLineNo">1734</span><a name="line.1734"></a>
+<span class="sourceLineNo">1735</span>    // checkAndPut with empty value<a name="line.1735"></a>
+<span class="sourceLineNo">1736</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1736"></a>
+<span class="sourceLineNo">1737</span>        new BinaryComparator(emptyVal), put);<a name="line.1737"></a>
+<span class="sourceLineNo">1738</span>    assertTrue(res);<a name="line.1738"></a>
+<span class="sourceLineNo">1739</span><a name="line.1739"></a>
+<span class="sourceLineNo">1740</span>    // Putting data in key<a name="line.1740"></a>
+<span class="sourceLineNo">1741</span>    put = new Put(row1);<a name="line.1741"></a>
+<span class="sourceLineNo">1742</span>    put.addColumn(fam1, qf1, val1);<a name="line.1742"></a>
+<span class="sourceLineNo">1743</span><a name="line.1743"></a>
+<span class="sourceLineNo">1744</span>    // checkAndPut with correct value<a name="line.1744"></a>
+<span class="sourceLineNo">1745</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1745"></a>
+<span class="sourceLineNo">1746</span>        new BinaryComparator(emptyVal), put);<a name="line.1746"></a>
+<span class="sourceLineNo">1747</span>    assertTrue(res);<a name="line.1747"></a>
+<span class="sourceLineNo">1748</span><a name="line.1748"></a>
+<span class="sourceLineNo">1749</span>    // not empty anymore<a name="line.1749"></a>
+<span class="sourceLineNo">1750</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1750"></a>
+<span class="sourceLineNo">1751</span>        new BinaryComparator(emptyVal), put);<a name="line.1751"></a>
+<span class="sourceLineNo">1752</span>    assertFalse(res);<a name="line.1752"></a>
+<span class="sourceLineNo">1753</span><a name="line.1753"></a>
+<span class="sourceLineNo">1754</span>    Delete delete = new Delete(row1);<a name="line.1754"></a>
+<span class="sourceLineNo">1755</span>    delete.addColumn(fam1, qf1);<a name="line.1755"></a>
+<span class="sourceLineNo">1756</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1756"></a>
+<span class="sourceLineNo">1757</span>        new BinaryComparator(emptyVal), delete);<a name="line.1757"></a>
+<span class="sourceLineNo">1758</span>    assertFalse(res);<a name="line.1758"></a>
+<span class="sourceLineNo">1759</span><a name="line.1759"></a>
+<span class="sourceLineNo">1760</span>    put = new Put(row1);<a name="line.1760"></a>
+<span class="sourceLineNo">1761</span>    put.addColumn(fam1, qf1, val2);<a name="line.1761"></a>
+<span class="sourceLineNo">1762</span>    // checkAndPut with correct value<a name="line.1762"></a>
+<span class="sourceLineNo">1763</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1763"></a>
+<span class="sourceLineNo">1764</span>        new BinaryComparator(val1), put);<a name="line.1764"></a>
+<span class="sourceLineNo">1765</span>    assertTrue(res);<a name="line.1765"></a>
+<span class="sourceLineNo">1766</span><a name="line.1766"></a>
+<span class="sourceLineNo">1767</span>    // checkAndDelete with correct value<a name="line.1767"></a>
+<span class="sourceLineNo">1768</span>    delete = new Delete(row1);<a name="line.1768"></a>
 <span class="sourceLineNo">1769</span>    delete.addColumn(fam1, qf1);<a name="line.1769"></a>
-<span class="sourceLineNo">1770</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1770"></a>
-<span class="sourceLineNo">1771</span>        new BinaryComparator(val2), delete);<a name="line.1771"></a>
-<span class="sourceLineNo">1772</span>    assertTrue(res);<a name="line.1772"></a>
-<span class="sourceLineNo">1773</span><a name="line.1773"></a>
-<span class="sourceLineNo">1774</span>    delete = new Delete(row1);<a name="line.1774"></a>
-<span class="sourceLineNo">1775</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1775"></a>
-<span class="sourceLineNo">1776</span>        new BinaryComparator(emptyVal), delete);<a name="line.1776"></a>
-<span class="sourceLineNo">1777</span>    assertTrue(res);<a name="line.1777"></a>
-<span class="sourceLineNo">1778</span><a name="line.1778"></a>
-<span class="sourceLineNo">1779</span>    // checkAndPut looking for a null value<a name="line.1779"></a>
-<span class="sourceLineNo">1780</span>    put = new Put(row1);<a name="line.1780"></a>
-<span class="sourceLineNo">1781</span>    put.addColumn(fam1, qf1, val1);<a name="line.1781"></a>
-<span class="sourceLineNo">1782</span><a name="line.1782"></a>
-<span class="sourceLineNo">1783</span>    res = region<a name="line.1783"></a>
-<span class="sourceLineNo">1784</span>        .checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new NullComparator(), put);<a name="line.1784"></a>
-<span class="sourceLineNo">1785</span>    assertTrue(res);<a name="line.1785"></a>
-<span class="sourceLineNo">1786</span>  }<a name="line.1786"></a>
-<span class="sourceLineNo">1787</span><a name="line.1787"></a>
-<span class="sourceLineNo">1788</span>  @Test<a name="line.1788"></a>
-<span class="sourceLineNo">1789</span>  public void testCheckAndMutate_WithWrongValue() throws IOException {<a name="line.1789"></a>
-<span class="sourceLineNo">1790</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1790"></a>
-<span class="sourceLineNo">1791</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1791"></a>
-<span class="sourceLineNo">1792</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1792"></a>
-<span class="sourceLineNo">1793</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1793"></a>
-<span class="sourceLineNo">1794</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.1794"></a>
-<span class="sourceLineNo">1795</span>    BigDecimal bd1 = new BigDecimal(Double.MAX_VALUE);<a name="line.1795"></a>
-<span class="sourceLineNo">1796</span>    BigDecimal bd2 = new BigDecimal(Double.MIN_VALUE);<a name="line.1796"></a>
-<span class="sourceLineNo">1797</span><a name="line.1797"></a>
-<span class="sourceLineNo">1798</span>    // Setting up region<a name="line.1798"></a>
-<span class="sourceLineNo">1799</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.1799"></a>
-<span class="sourceLineNo">1800</span>    // Putting data in key<a name="line.1800"></a>
-<span class="sourceLineNo">1801</span>    Put put = new Put(row1);<a name="line.1801"></a>
-<span class="sourceLineNo">1802</span>    put.addColumn(fam1, qf1, val1);<a name="line.1802"></a>
-<span class="sourceLineNo">1803</span>    region.put(put);<a name="line.1803"></a>
-<span class="sourceLineNo">1804</span><a name="line.1804"></a>
-<span class="sourceLineNo">1805</span>    // checkAndPut with wrong value<a name="line.1805"></a>
-<span class="sourceLineNo">1806</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1806"></a>
-<span class="sourceLineNo">1807</span>        new BinaryComparator(val2), put);<a name="line.1807"></a>
-<span class="sourceLineNo">1808</span>    assertEquals(false, res);<a name="line.1808"></a>
-<span class="sourceLineNo">1809</span><a name="line.1809"></a>
-<span class="sourceLineNo">1810</span>    // checkAndDelete with wrong value<a name="line.1810"></a>
-<span class="sourceLineNo">1811</span>    Delete delete = new Delete(row1);<a name="line.1811"></a>
-<span class="sourceLineNo">1812</span>    delete.addFamily(fam1);<a name="line.1812"></a>
-<span class="sourceLineNo">1813</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1813"></a>
-<span class="sourceLineNo">1814</span>        new BinaryComparator(val2), put);<a name="line.1814"></a>
-<span class="sourceLineNo">1815</span>    assertEquals(false, res);<a name="line.1815"></a>
-<span class="sourceLineNo">1816</span><a name="line.1816"></a>
-<span class="sourceLineNo">1817</span>    // Putting data in key<a name="line.1817"></a>
-<span class="sourceLineNo">1818</span>    put = new Put(row1);<a name="line.1818"></a>
-<span class="sourceLineNo">1819</span>    put.addColumn(fam1, qf1, Bytes.toBytes(bd1));<a name="line.1819"></a>
-<span class="sourceLineNo">1820</span>    region.put(put);<a name="line.1820"></a>
-<span class="sourceLineNo">1821</span><a name="line.1821"></a>
-<span class="sourceLineNo">1822</span>    // checkAndPut with wrong value<a name="line.1822"></a>
-<span class="sourceLineNo">1823</span>    res =<a name="line.1823"></a>
-<span class="sourceLineNo">1824</span>        region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1824"></a>
-<span class="sourceLineNo">1825</span>            new BigDecimalComparator(bd2), put);<a name="line.1825"></a>
-<span class="sourceLineNo">1826</span>    assertEquals(false, res);<a name="line.1826"></a>
-<span class="sourceLineNo">1827</span><a name="line.1827"></a>
-<span class="sourceLineNo">1828</span>    // checkAndDelete with wrong value<a name="line.1828"></a>
-<span class="sourceLineNo">1829</span>    delete = new Delete(row1);<a name="line.1829"></a>
-<span class="sourceLineNo">1830</span>    delete.addFamily(fam1);<a name="line.1830"></a>
-<span class="sourceLineNo">1831</span>    res =<a name="line.1831"></a>
-<span class="sourceLineNo">1832</span>        region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1832"></a>
-<span class="sourceLineNo">1833</span>            new BigDecimalComparator(bd2), put);<a name="line.1833"></a>
-<span class="sourceLineNo">1834</span>    assertEquals(false, res);<a name="line.1834"></a>
-<span class="sourceLineNo">1835</span>  }<a name="line.1835"></a>
-<span class="sourceLineNo">1836</span><a name="line.1836"></a>
-<span class="sourceLineNo">1837</span>  @Test<a name="line.1837"></a>
-<span class="sourceLineNo">1838</span>  public void testCheckAndMutate_WithCorrectValue() throws IOException {<a name="line.1838"></a>
-<span class="sourceLineNo">1839</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1839"></a>
-<span class="sourceLineNo">1840</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1840"></a>
-<span class="sourceLineNo">1841</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1841"></a>
-<span class="sourceLineNo">1842</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1842"></a>
-<span class="sourceLineNo">1843</span>    BigDecimal bd1 = new BigDecimal(Double.MIN_VALUE);<a name="line.1843"></a>
-<span class="sourceLineNo">1844</span><a name="line.1844"></a>
-<span class="sourceLineNo">1845</span>    // Setting up region<a name="line.1845"></a>
-<span class="sourceLineNo">1846</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.1846"></a>
-<span class="sourceLineNo">1847</span>    // Putting data in key<a name="line.1847"></a>
-<span class="sourceLineNo">1848</span>    Put put = new Put(row1);<a name="line.1848"></a>
-<span class="sourceLineNo">1849</span>    put.addColumn(fam1, qf1, val1);<a name="line.1849"></a>
-<span class="sourceLineNo">1850</span>    region.put(put);<a name="line.1850"></a>
-<span class="sourceLineNo">1851</span><a name="line.1851"></a>
-<span class="sourceLineNo">1852</span>    // checkAndPut with correct value<a name="line.1852"></a>
-<span class="sourceLineNo">1853</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1853"></a>
-<span class="sourceLineNo">1854</span>        new BinaryComparator(val1), put);<a name="line.1854"></a>
-<span class="sourceLineNo">1855</span>    assertEquals(true, res);<a name="line.1855"></a>
-<span class="sourceLineNo">1856</span><a name="line.1856"></a>
-<span class="sourceLineNo">1857</span>    // checkAndDelete with correct value<a name="line.1857"></a>
-<span class="sourceLineNo">1858</span>    Delete delete = new Delete(row1);<a name="line.1858"></a>
-<span class="sourceLineNo">1859</span>    delete.addColumn(fam1, qf1);<a name="line.1859"></a>
-<span class="sourceLineNo">1860</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new BinaryComparator(val1),<a name="line.1860"></a>
-<span class="sourceLineNo">1861</span>        delete);<a name="line.1861"></a>
-<span class="sourceLineNo">1862</span>    assertEquals(true, res);<a name="line.1862"></a>
-<span class="sourceLineNo">1863</span><a name="line.1863"></a>
-<span class="sourceLineNo">1864</span>    // Putting data in key<a name="line.1864"></a>
-<span class="sourceLineNo">1865</span>    put = new Put(row1);<a name="line.1865"></a>
-<span class="sourceLineNo">1866</span>    put.addColumn(fam1, qf1, Bytes.toBytes(bd1));<a name="line.1866"></a>
-<span class="sourceLineNo">1867</span>    region.put(put);<a name="line.1867"></a>
-<span class="sourceLineNo">1868</span><a name="line.1868"></a>
-<span class="sourceLineNo">1869</span>    // checkAndPut with correct value<a name="line.1869"></a>
-<span class="sourceLineNo">1870</span>    res =<a name="line.1870"></a>
-<span class="sourceLineNo">1871</span>        region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new BigDecimalComparator(<a name="line.1871"></a>
-<span class="sourceLineNo">1872</span>            bd1), put);<a name="line.1872"></a>
-<span class="sourceLineNo">1873</span>    assertEquals(true, res);<a name="line.1873"></a>
-<span class="sourceLineNo">1874</span><a name="line.1874"></a>
-<span class="sourceLineNo">1875</span>    // checkAndDelete with correct value<a name="line.1875"></a>
-<span class="sourceLineNo">1876</span>    delete = new Delete(row1);<a name="line.1876"></a>
-<span class="sourceLineNo">1877</span>    delete.addColumn(fam1, qf1);<a name="line.1877"></a>
-<span class="sourceLineNo">1878</span>    res =<a name="line.1878"></a>
-<span class="sourceLineNo">1879</span>        region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new BigDecimalComparator(<a name="line.1879"></a>
-<span class="sourceLineNo">1880</span>            bd1), delete);<a name="line.1880"></a>
-<span class="sourceLineNo">1881</span>    assertEquals(true, res);<a name="line.1881"></a>
-<span class="sourceLineNo">1882</span>  }<a name="line.1882"></a>
-<span class="sourceLineNo">1883</span><a name="line.1883"></a>
-<span class="sourceLineNo">1884</span>  @Test<a name="line.1884"></a>
-<span class="sourceLineNo">1885</span>  public void testCheckAndMutate_WithNonEqualCompareOp() throws IOException {<a name="line.1885"></a>
-<span class="sourceLineNo">1886</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1886"></a>
-<span class="sourceLineNo">1887</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1887"></a>
-<span class="sourceLineNo">1888</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1888"></a>
-<span class="sourceLineNo">1889</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1889"></a>
-<span class="sourceLineNo">1890</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.1890"></a>
-<span class="sourceLineNo">1891</span>    byte[] val3 = Bytes.toBytes("value3");<a name="line.1891"></a>
-<span class="sourceLineNo">1892</span>    byte[] val4 = Bytes.toBytes("value4");<a name="line.1892"></a>
-<span class="sourceLineNo">1893</span><a name="line.1893"></a>
-<span class="sourceLineNo">1894</span>    // Setting up region<a name="line.1894"></a>
-<span class="sourceLineNo">1895</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.1895"></a>
-<span class="sourceLineNo">1896</span>    // Putting val3 in key<a name="line.1896"></a>
-<span class="sourceLineNo">1897</span>    Put put = new Put(row1);<a name="line.1897"></a>
-<span class="sourceLineNo">1898</span>    put.addColumn(fam1, qf1, val3);<a name="line.1898"></a>
-<span class="sourceLineNo">1899</span>    region.put(put);<a name="line.1899"></a>
-<span class="sourceLineNo">1900</span><a name="line.1900"></a>
-<span class="sourceLineNo">1901</span>    // Test CompareOp.LESS: original = val3, compare with val3, fail<a name="line.1901"></a>
-<span class="sourceLineNo">1902</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS,<a name="line.1902"></a>
-<span class="sourceLineNo">1903</span>        new BinaryComparator(val3), put);<a name="line.1903"></a>
-<span class="sourceLineNo">1904</span>    assertEquals(false, res);<a name="line.1904"></a>
-<span class="sourceLineNo">1905</span><a name="line.1905"></a>
-<span class="sourceLineNo">1906</span>    // Test CompareOp.LESS: original = val3, compare with val4, fail<a name="line.1906"></a>
-<span class="sourceLineNo">1907</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS,<a name="line.1907"></a>
-<span class="sourceLineNo">1908</span>        new BinaryComparator(val4), put);<a name="line.1908"></a>
-<span class="sourceLineNo">1909</span>    assertEquals(false, res);<a name="line.1909"></a>
-<span class="sourceLineNo">1910</span><a name="line.1910"></a>
-<span class="sourceLineNo">1911</span>    // Test CompareOp.LESS: original = val3, compare with val2,<a name="line.1911"></a>
-<span class="sourceLineNo">1912</span>    // succeed (now value = val2)<a name="line.1912"></a>
-<span class="sourceLineNo">1913</span>    put = new Put(row1);<a name="line.1913"></a>
-<span class="sourceLineNo">1914</span>    put.addColumn(fam1, qf1, val2);<a name="line.1914"></a>
-<span class="sourceLineNo">1915</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS,<a name="line.1915"></a>
-<span class="sourceLineNo">1916</span>        new BinaryComparator(val2), put);<a name="line.1916"></a>
-<span class="sourceLineNo">1917</span>    assertEquals(true, res);<a name="line.1917"></a>
-<span class="sourceLineNo">1918</span><a name="line.1918"></a>
-<span class="sourceLineNo">1919</span>    // Test CompareOp.LESS_OR_EQUAL: original = val2, compare with val3, fail<a name="line.1919"></a>
-<span class="sourceLineNo">1920</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS_OR_EQUAL,<a name="line.1920"></a>
-<span class="sourceLineNo">1921</span>        new BinaryComparator(val3), put);<a name="line.1921"></a>
-<span class="sourceLineNo">1922</span>    assertEquals(false, res);<a name="line.1922"></a>
-<span class="sourceLineNo">1923</span><a name="line.1923"></a>
-<span class="sourceLineNo">1924</span>    // Test CompareOp.LESS_OR_EQUAL: original = val2, compare with val2,<a name="line.1924"></a>
-<span class="sourceLineNo">1925</span>    // succeed (value still = val2)<a name="line.1925"></a>
-<span class="sourceLineNo">1926</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS_OR_EQUAL,<a name="line.1926"></a>
-<span class="sourceLineNo">1927</span>        new BinaryComparator(val2), put);<a name="line.1927"></a>
-<span class="sourceLineNo">1928</span>    assertEquals(true, res);<a name="line.1928"></a>
-<span class="sourceLineNo">1929</span><a name="line.1929"></a>
-<span class="sourceLineNo">1930</span>    // Test CompareOp.LESS_OR_EQUAL: original = val2, compare with val1,<a name="line.1930"></a>
-<span class="sourceLineNo">1931</span>    // succeed (now value = val3)<a name="line.1931"></a>
-<span class="sourceLineNo">1932</span>    put = new Put(row1);<a name="line.1932"></a>
-<span class="sourceLineNo">1933</span>    put.addColumn(fam1, qf1, val3);<a name="line.1933"></a>
-<span class="sourceLineNo">1934</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS_OR_EQUAL,<a name="line.1934"></a>
-<span class="sourceLineNo">1935</span>        new BinaryComparator(val1), put);<a name="line.1935"></a>
-<span class="sourceLineNo">1936</span>    assertEquals(true, res);<a name="line.1936"></a>
-<span class="sourceLineNo">1937</span><a name="line.1937"></a>
-<span class="sourceLineNo">1938</span>    // Test CompareOp.GREATER: original = val3, compare with val3, fail<a name="line.1938"></a>
-<span class="sourceLineNo">1939</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER,<a name="line.1939"></a>
-<span class="sourceLineNo">1940</span>        new BinaryComparator(val3), put);<a name="line.1940"></a>
-<span class="sourceLineNo">1941</span>    assertEquals(false, res);<a name="line.1941"></a>
-<span class="sourceLineNo">1942</span><a name="line.1942"></a>
-<span class="sourceLineNo">1943</span>    // Test CompareOp.GREATER: original = val3, compare with val2, fail<a name="line.1943"></a>
-<span class="sourceLineNo">1944</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER,<a name="line.1944"></a>
-<span class="sourceLineNo">1945</span>        new BinaryComparator(val2), put);<a name="line.1945"></a>
-<span class="sourceLineNo">1946</span>    assertEquals(false, res);<a name="line.1946"></a>
-<span class="sourceLineNo">1947</span><a name="line.1947"></a>
-<span class="sourceLineNo">1948</span>    // Test CompareOp.GREATER: original = val3, compare with val4,<a name="line.1948"></a>
-<span class="sourceLineNo">1949</span>    // succeed (now value = val2)<a name="line.1949"></a>
-<span class="sourceLineNo">1950</span>    put = new Put(row1);<a name="line.1950"></a>
-<span class="sourceLineNo">1951</span>    put.addColumn(fam1, qf1, val2);<a name="line.1951"></a>
-<span class="sourceLineNo">1952</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER,<a name="line.1952"></a>
-<span class="sourceLineNo">1953</span>        new BinaryComparator(val4), put);<a name="line.1953"></a>
-<span class="sourceLineNo">1954</span>    assertEquals(true, res);<a name="line.1954"></a>
-<span class="sourceLineNo">1955</span><a name="line.1955"></a>
-<span class="sourceLineNo">1956</span>    // Test CompareOp.GREATER_OR_EQUAL: original = val2, compare with val1, fail<a name="line.1956"></a>
-<span class="sourceLineNo">1957</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER_OR_EQUAL,<a name="line.1957"></a>
-<span class="sourceLineNo">1958</span>        new BinaryComparator(val1), put);<a name="line.1958"></a>
-<span class="sourceLineNo">1959</span>    assertEquals(false, res);<a name="line.1959"></a>
-<span class="sourceLineNo">1960</span><a name="line.1960"></a>
-<span class="sourceLineNo">1961</span>    // Test CompareOp.GREATER_OR_EQUAL: original = val2, compare with val2,<a name="line.1961"></a>
-<span class="sourceLineNo">1962</span>    // succeed (value still = val2)<a name="line.1962"></a>
-<span class="sourceLineNo">1963</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER_OR_EQUAL,<a name="line.1963"></a>
-<span class="sourceLineNo">1964</span>        new BinaryComparator(val2), put);<a name="line.1964"></a>
-<span class="sourceLineNo">1965</span>    assertEquals(true, res);<a name="line.1965"></a>
-<span class="sourceLineNo">1966</span><a name="line.1966"></a>
-<span class="sourceLineNo">1967</span>    // Test CompareOp.GREATER_OR_EQUAL: original = val2, compare with val3, succeed<a name="line.1967"></a>
-<span class="sourceLineNo">1968</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER_OR_EQUAL,<a name="line.1968"></a>
-<span class="sourceLineNo">1969</span>        new BinaryComparator(val3), put);<a name="line.1969"></a>
-<span class="sourceLineNo">1970</span>    assertEquals(true, res);<a name="line.1970"></a>
-<span class="sourceLineNo">1971</span>  }<a name="line.1971"></a>
-<span class="sourceLineNo">1972</span><a name="line.1972"></a>
-<span class="sourceLineNo">1973</span>  @Test<a name="line.1973"></a>
-<span class="sourceLineNo">1974</span>  public void testCheckAndPut_ThatPutWasWritten() throws IOException {<a name="line.1974"></a>
-<span class="sourceLineNo">1975</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1975"></a>
-<span class="sourceLineNo">1976</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1976"></a>
-<span class="sourceLineNo">1977</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.1977"></a>
-<span class="sourceLineNo">1978</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1978"></a>
-<span class="sourceLineNo">1979</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1979"></a>
-<span class="sourceLineNo">1980</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.1980"></a>
-<span class="sourceLineNo">1981</span><a name="line.1981"></a>
-<span class="sourceLineNo">1982</span>    byte[][] families = { fam1, fam2 };<a name="line.1982"></a>
-<span class="sourceLineNo">1983</span><a name="line.1983"></a>
-<span class="sourceLineNo">1984</span>    // Setting up region<a name="line.1984"></a>
-<span class="sourceLineNo">1985</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.1985"></a>
-<span class="sourceLineNo">1986</span>    // Putting data in the key to check<a name="line.1986"></a>
-<span class="sourceLineNo">1987</span>    Put put = new Put(row1);<a name="line.1987"></a>
-<span class="sourceLineNo">1988</span>    put.addColumn(fam1, qf1, val1);<a name="line.1988"></a>
-<span class="sourceLineNo">1989</span>    region.put(put);<a name="line.1989"></a>
-<span class="sourceLineNo">1990</span><a name="line.1990"></a>
-<span class="sourceLineNo">1991</span>    // Creating put to add<a name="line.1991"></a>
-<span class="sourceLineNo">1992</span>    long ts = System.currentTimeMillis();<a name="line.1992"></a>
-<span class="sourceLineNo">1993</span>    KeyValue kv = new KeyValue(row1, fam2, qf1, ts, KeyValue.Type.Put, val2);<a name="line.1993"></a>
-<span class="sourceLineNo">1994</span>    put = new Put(row1);<a name="line.1994"></a>
-<span class="sourceLineNo">1995</span>    put.add(kv);<a name="line.1995"></a>
-<span class="sourceLineNo">1996</span><a name="line.1996"></a>
-<span class="sourceLineNo">1997</span>    // checkAndPut with wrong value<a name="line.1997"></a>
-<span class="sourceLineNo">1998</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1998"></a>
-<span class="sourceLineNo">1999</span>        new BinaryComparator(val1), put);<a name="line.1999"></a>
-<span class="sourceLineNo">2000</span>    assertEquals(true, res);<a name="line.2000"></a>
-<span class="sourceLineNo">2001</span><a name="line.2001"></a>
-<span class="sourceLineNo">2002</span>    Get get = new Get(row1);<a name="line.2002"></a>
-<span class="sourceLineNo">2003</span>    get.addColumn(fam2, qf1);<a name="line.2003"></a>
-<span class="sourceLineNo">2004</span>    Cell[] actual = region.get(get).rawCells();<a name="line.2004"></a>
-<span class="sourceLineNo">2005</span><a name="line.2005"></a>
-<span class="sourceLineNo">2006</span>    Cell[] expected = { kv };<a name="line.2006"></a>
-<span class="sourceLineNo">2007</span><a name="line.2007"></a>
-<span class="sourceLineNo">2008</span>    assertEquals(expected.length, actual.length);<a name="line.2008"></a>
-<span class="sourceLineNo">2009</span>    for (int i = 0; i &lt; actual.length; i++) {<a name="line.2009"></a>
-<span class="sourceLineNo">2010</span>      assertEquals(expected[i], actual[i]);<a name="line.2010"></a>
-<span class="sourceLineNo">2011</span>    }<a name="line.2011"></a>
-<span class="sourceLineNo">2012</span>  }<a name="line.2012"></a>
-<span class="sourceLineNo">2013</span><a name="line.2013"></a>
-<span class="sourceLineNo">2014</span>  @Test<a name="line.2014"></a>
-<span class="sourceLineNo">2015</span>  public void testCheckAndPut_wrongRowInPut() throws IOException {<a name="line.2015"></a>
-<span class="sourceLineNo">2016</span>    this.region = initHRegion(tableName, method, CONF, COLUMNS);<a name="line.2016"></a>
-<span class="sourceLineNo">2017</span>    Put put = new Put(row2);<a name="line.2017"></a>
-<span class="sourceLineNo">2018</span>    put.addColumn(fam1, qual1, value1);<a name="line.2018"></a>
-<span class="sourceLineNo">2019</span>    try {<a name="line.2019"></a>
-<span class="sourceLineNo">2020</span>      region.checkAndMutate(row, fam1, qual1, CompareOperator.EQUAL,<a name="line.2020"></a>
-<span class="sourceLineNo">2021</span>          new BinaryComparator(value2), put);<a name="line.2021"></a>
-<span class="sourceLineNo">2022</span>      fail();<a name="line.2022"></a>
-<span class="sourceLineNo">2023</span>    } catch (org.apache.hadoop.hbase.DoNotRetryIOException expected) {<a name="line.2023"></a>
-<span class="sourceLineNo">2024</span>      // expected exception.<a name="line.2024"></a>
-<span class="sourceLineNo">2025</span>    }<a name="line.2025"></a>
-<span class="sourceLineNo">2026</span>  }<a name="line.2026"></a>
-<span class="sourceLineNo">2027</span><a name="line.2027"></a>
-<span class="sourceLineNo">2028</span>  @Test<a name="line.2028"></a>
-<span class="sourceLineNo">2029</span>  public void testCheckAndDelete_ThatDeleteWasWritten() throws IOException {<a name="line.2029"></a>
-<span class="sourceLineNo">2030</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2030"></a>
-<span class="sourceLineNo">2031</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2031"></a>
-<span class="sourceLineNo">2032</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2032"></a>
-<span class="sourceLineNo">2033</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.2033"></a>
-<span class="sourceLineNo">2034</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.2034"></a>
-<span class="sourceLineNo">2035</span>    byte[] qf3 = Bytes.toBytes("qualifier3");<a name="line.2035"></a>
-<span class="sourceLineNo">2036</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.2036"></a>
-<span class="sourceLineNo">2037</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.2037"></a>
-<span class="sourceLineNo">2038</span>    byte[] val3 = Bytes.toBytes("value3");<a name="line.2038"></a>
-<span class="sourceLineNo">2039</span>    byte[] emptyVal = new byte[] {};<a name="line.2039"></a>
-<span class="sourceLineNo">2040</span><a name="line.2040"></a>
-<span class="sourceLineNo">2041</span>    byte[][] families = { fam1, fam2 };<a name="line.2041"></a>
-<span class="sourceLineNo">2042</span><a name="line.2042"></a>
-<span class="sourceLineNo">2043</span>    // Setting up region<a name="line.2043"></a>
-<span class="sourceLineNo">2044</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2044"></a>
-<span class="sourceLineNo">2045</span>    // Put content<a name="line.2045"></a>
-<span class="sourceLineNo">2046</span>    Put put = new Put(row1);<a name="line.2046"></a>
-<span class="sourceLineNo">2047</span>    put.addColumn(fam1, qf1, val1);<a name="line.2047"></a>
-<span class="sourceLineNo">2048</span>    region.put(put);<a name="line.2048"></a>
-<span class="sourceLineNo">2049</span>    Threads.sleep(2);<a name="line.2049"></a>
-<span class="sourceLineNo">2050</span><a name="line.2050"></a>
-<span class="sourceLineNo">2051</span>    put = new Put(row1);<a name="line.2051"></a>
-<span class="sourceLineNo">2052</span>    put.addColumn(fam1, qf1, val2);<a name="line.2052"></a>
-<span class="sourceLineNo">2053</span>    put.addColumn(fam2, qf1, val3);<a name="line.2053"></a>
-<span class="sourceLineNo">2054</span>    put.addColumn(fam2, qf2, val2);<a name="line.2054"></a>
-<span class="sourceLineNo">2055</span>    put.addColumn(fam2, qf3, val1);<a name="line.2055"></a>
-<span class="sourceLineNo">2056</span>    put.addColumn(fam1, qf3, val1);<a name="line.2056"></a>
-<span class="sourceLineNo">2057</span>    region.put(put);<a name="line.2057"></a>
-<span class="sourceLineNo">2058</span><a name="line.2058"></a>
-<span class="sourceLineNo">2059</span>    // Multi-column delete<a name="line.2059"></a>
-<span class="sourceLineNo">2060</span>    Delete delete = new Delete(row1);<a name="line.2060"></a>
-<span class="sourceLineNo">2061</span>    delete.addColumn(fam1, qf1);<a name="line.2061"></a>
-<span class="sourceLineNo">2062</span>    delete.addColumn(fam2, qf1);<a name="line.2062"></a>
-<span class="sourceLineNo">2063</span>    delete.addColumn(fam1, qf3);<a name="line.2063"></a>
-<span class="sourceLineNo">2064</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.2064"></a>
-<span class="sourceLineNo">2065</span>        new BinaryComparator(val2), delete);<a name="line.2065"></a>
-<span class="sourceLineNo">2066</span>    assertEquals(true, res);<a name="line.2066"></a>
-<span class="sourceLineNo">2067</span><a name="line.2067"></a>
-<span class="sourceLineNo">2068</span>    Get get = new Get(row1);<a name="line.2068"></a>
-<span class="sourceLineNo">2069</span>    get.addColumn(fam1, qf1);<a name="line.2069"></a>
-<span class="sourceLineNo">2070</span>    get.addColumn(fam1, qf3);<a name="line.2070"></a>
-<span class="sourceLineNo">2071</span>    get.addColumn(fam2, qf2);<a name="line.2071"></a>
-<span class="sourceLineNo">2072</span>    Result r = region.get(get);<a name="line.2072"></a>
-<span class="sourceLineNo">2073</span>    assertEquals(2, r.size());<a name="line.2073"></a>
-<span class="sourceLineNo">2074</span>    assertArrayEquals(val1, r.getValue(fam1, qf1));<a name="line.2074"></a>
-<span class="sourceLineNo">2075</span>    assertArrayEquals(val2, r.getValue(fam2, qf2));<a name="line.2075"></a>
-<span class="sourceLineNo">2076</span><a name="line.2076"></a>
-<span class="sourceLineNo">2077</span>    // Family delete<a name="line.2077"></a>
-<span class="sourceLineNo">2078</span>    delete = new Delete(row1);<a name="line.2078"></a>
-<span class="sourceLineNo">2079</span>    delete.addFamily(fam2);<a name="line.2079"></a>
-<span class="sourceLineNo">2080</span>    res = region.checkAndMutate(row1, fam2, qf1, CompareOperator.EQUAL,<a name="line.2080"></a>
-<span class="sourceLineNo">2081</span>        new BinaryComparator(emptyVal), delete);<a name="line.2081"></a>
-<span class="sourceLineNo">2082</span>    assertEquals(true, res);<a name="line.2082"></a>
-<span class="sourceLineNo">2083</span><a name="line.2083"></a>
-<span class="sourceLineNo">2084</span>    get = new Get(row1);<a name="line.2084"></a>
-<span class="sourceLineNo">2085</span>    r = region.get(get);<a name="line.2085"></a>
-<span class="sourceLineNo">2086</span>    assertEquals(1, r.size());<a name="line.2086"></a>
-<span class="sourceLineNo">2087</span>    assertArrayEquals(val1, r.getValue(fam1, qf1));<a name="line.2087"></a>
-<span class="sourceLineNo">2088</span><a name="line.2088"></a>
-<span class="sourceLineNo">2089</span>    // Row delete<a name="line.2089"></a>
-<span class="sourceLineNo">2090</span>    delete = new Delete(row1);<a name="line.2090"></a>
-<span class="sourceLineNo">2091</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new BinaryComparator(val1),<a name="line.2091"></a>
-<span class="sourceLineNo">2092</span>        delete);<a name="line.2092"></a>
-<span class="sourceLineNo">2093</span>    assertEquals(true, res);<a name="line.2093"></a>
-<span class="sourceLineNo">2094</span>    get = new Get(row1);<a name="line.2094"></a>
-<span class="sourceLineNo">2095</span>    r = region.get(get);<a name="line.2095"></a>
-<span class="sourceLineNo">2096</span>    assertEquals(0, r.size());<a name="line.2096"></a>
-<span class="sourceLineNo">2097</span>  }<a name="line.2097"></a>
-<span class="sourceLineNo">2098</span><a name="line.2098"></a>
-<span class="sourceLineNo">2099</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2099"></a>
-<span class="sourceLineNo">2100</span>  // Delete tests<a name="line.2100"></a>
-<span class="sourceLineNo">2101</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2101"></a>
-<span class="sourceLineNo">2102</span>  @Test<a name="line.2102"></a>
-<span class="sourceLineNo">2103</span>  public void testDelete_multiDeleteColumn() throws IOException {<a name="line.2103"></a>
-<span class="sourceLineNo">2104</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2104"></a>
-<span class="sourceLineNo">2105</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2105"></a>
-<span class="sourceLineNo">2106</span>    byte[] qual = Bytes.toBytes("qualifier");<a name="line.2106"></a>
-<span class="sourceLineNo">2107</span>    byte[] value = Bytes.toBytes("value");<a name="line.2107"></a>
-<span class="sourceLineNo">2108</span><a name="line.2108"></a>
-<span class="sourceLineNo">2109</span>    Put put = new Put(row1);<a name="line.2109"></a>
-<span class="sourceLineNo">2110</span>    put.addColumn(fam1, qual, 1, value);<a name="line.2110"></a>
-<span class="sourceLineNo">2111</span>    put.addColumn(fam1, qual, 2, value);<a name="line.2111"></a>
-<span class="sourceLineNo">2112</span><a name="line.2112"></a>
-<span class="sourceLineNo">2113</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2113"></a>
-<span class="sourceLineNo">2114</span>    region.put(put);<a name="line.2114"></a>
-<span class="sourceLineNo">2115</span><a name="line.2115"></a>
-<span class="sourceLineNo">2116</span>    // We do support deleting more than 1 'latest' version<a name="line.2116"></a>
-<span class="sourceLineNo">2117</span>    Delete delete = new Delete(row1);<a name="line.2117"></a>
-<span class="sourceLineNo">2118</span>    delete.addColumn(fam1, qual);<a name="line.2118"></a>
+<span class="sourceLineNo">1770</span>    delete.addColumn(fam1, qf1);<a name="line.1770"></a>
+<span class="sourceLineNo">1771</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1771"></a>
+<span class="sourceLineNo">1772</span>        new BinaryComparator(val2), delete);<a name="line.1772"></a>
+<span class="sourceLineNo">1773</span>    assertTrue(res);<a name="line.1773"></a>
+<span class="sourceLineNo">1774</span><a name="line.1774"></a>
+<span class="sourceLineNo">1775</span>    delete = new Delete(row1);<a name="line.1775"></a>
+<span class="sourceLineNo">1776</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1776"></a>
+<span class="sourceLineNo">1777</span>        new BinaryComparator(emptyVal), delete);<a name="line.1777"></a>
+<span class="sourceLineNo">1778</span>    assertTrue(res);<a name="line.1778"></a>
+<span class="sourceLineNo">1779</span><a name="line.1779"></a>
+<span class="sourceLineNo">1780</span>    // checkAndPut looking for a null value<a name="line.1780"></a>
+<span class="sourceLineNo">1781</span>    put = new Put(row1);<a name="line.1781"></a>
+<span class="sourceLineNo">1782</span>    put.addColumn(fam1, qf1, val1);<a name="line.1782"></a>
+<span class="sourceLineNo">1783</span><a name="line.1783"></a>
+<span class="sourceLineNo">1784</span>    res = region<a name="line.1784"></a>
+<span class="sourceLineNo">1785</span>        .checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new NullComparator(), put);<a name="line.1785"></a>
+<span class="sourceLineNo">1786</span>    assertTrue(res);<a name="line.1786"></a>
+<span class="sourceLineNo">1787</span>  }<a name="line.1787"></a>
+<span class="sourceLineNo">1788</span><a name="line.1788"></a>
+<span class="sourceLineNo">1789</span>  @Test<a name="line.1789"></a>
+<span class="sourceLineNo">1790</span>  public void testCheckAndMutate_WithWrongValue() throws IOException {<a name="line.1790"></a>
+<span class="sourceLineNo">1791</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1791"></a>
+<span class="sourceLineNo">1792</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1792"></a>
+<span class="sourceLineNo">1793</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1793"></a>
+<span class="sourceLineNo">1794</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1794"></a>
+<span class="sourceLineNo">1795</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.1795"></a>
+<span class="sourceLineNo">1796</span>    BigDecimal bd1 = new BigDecimal(Double.MAX_VALUE);<a name="line.1796"></a>
+<span class="sourceLineNo">1797</span>    BigDecimal bd2 = new BigDecimal(Double.MIN_VALUE);<a name="line.1797"></a>
+<span class="sourceLineNo">1798</span><a name="line.1798"></a>
+<span class="sourceLineNo">1799</span>    // Setting up region<a name="line.1799"></a>
+<span class="sourceLineNo">1800</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.1800"></a>
+<span class="sourceLineNo">1801</span>    // Putting data in key<a name="line.1801"></a>
+<span class="sourceLineNo">1802</span>    Put put = new Put(row1);<a name="line.1802"></a>
+<span class="sourceLineNo">1803</span>    put.addColumn(fam1, qf1, val1);<a name="line.1803"></a>
+<span class="sourceLineNo">1804</span>    region.put(put);<a name="line.1804"></a>
+<span class="sourceLineNo">1805</span><a name="line.1805"></a>
+<span class="sourceLineNo">1806</span>    // checkAndPut with wrong value<a name="line.1806"></a>
+<span class="sourceLineNo">1807</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1807"></a>
+<span class="sourceLineNo">1808</span>        new BinaryComparator(val2), put);<a name="line.1808"></a>
+<span class="sourceLineNo">1809</span>    assertEquals(false, res);<a name="line.1809"></a>
+<span class="sourceLineNo">1810</span><a name="line.1810"></a>
+<span class="sourceLineNo">1811</span>    // checkAndDelete with wrong value<a name="line.1811"></a>
+<span class="sourceLineNo">1812</span>    Delete delete = new Delete(row1);<a name="line.1812"></a>
+<span class="sourceLineNo">1813</span>    delete.addFamily(fam1);<a name="line.1813"></a>
+<span class="sourceLineNo">1814</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1814"></a>
+<span class="sourceLineNo">1815</span>        new BinaryComparator(val2), put);<a name="line.1815"></a>
+<span class="sourceLineNo">1816</span>    assertEquals(false, res);<a name="line.1816"></a>
+<span class="sourceLineNo">1817</span><a name="line.1817"></a>
+<span class="sourceLineNo">1818</span>    // Putting data in key<a name="line.1818"></a>
+<span class="sourceLineNo">1819</span>    put = new Put(row1);<a name="line.1819"></a>
+<span class="sourceLineNo">1820</span>    put.addColumn(fam1, qf1, Bytes.toBytes(bd1));<a name="line.1820"></a>
+<span class="sourceLineNo">1821</span>    region.put(put);<a name="line.1821"></a>
+<span class="sourceLineNo">1822</span><a name="line.1822"></a>
+<span class="sourceLineNo">1823</span>    // checkAndPut with wrong value<a name="line.1823"></a>
+<span class="sourceLineNo">1824</span>    res =<a name="line.1824"></a>
+<span class="sourceLineNo">1825</span>        region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1825"></a>
+<span class="sourceLineNo">1826</span>            new BigDecimalComparator(bd2), put);<a name="line.1826"></a>
+<span class="sourceLineNo">1827</span>    assertEquals(false, res);<a name="line.1827"></a>
+<span class="sourceLineNo">1828</span><a name="line.1828"></a>
+<span class="sourceLineNo">1829</span>    // checkAndDelete with wrong value<a name="line.1829"></a>
+<span class="sourceLineNo">1830</span>    delete = new Delete(row1);<a name="line.1830"></a>
+<span class="sourceLineNo">1831</span>    delete.addFamily(fam1);<a name="line.1831"></a>
+<span class="sourceLineNo">1832</span>    res =<a name="line.1832"></a>
+<span class="sourceLineNo">1833</span>        region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1833"></a>
+<span class="sourceLineNo">1834</span>            new BigDecimalComparator(bd2), put);<a name="line.1834"></a>
+<span class="sourceLineNo">1835</span>    assertEquals(false, res);<a name="line.1835"></a>
+<span class="sourceLineNo">1836</span>  }<a name="line.1836"></a>
+<span class="sourceLineNo">1837</span><a name="line.1837"></a>
+<span class="sourceLineNo">1838</span>  @Test<a name="line.1838"></a>
+<span class="sourceLineNo">1839</span>  public void testCheckAndMutate_WithCorrectValue() throws IOException {<a name="line.1839"></a>
+<span class="sourceLineNo">1840</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1840"></a>
+<span class="sourceLineNo">1841</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1841"></a>
+<span class="sourceLineNo">1842</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1842"></a>
+<span class="sourceLineNo">1843</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1843"></a>
+<span class="sourceLineNo">1844</span>    BigDecimal bd1 = new BigDecimal(Double.MIN_VALUE);<a name="line.1844"></a>
+<span class="sourceLineNo">1845</span><a name="line.1845"></a>
+<span class="sourceLineNo">1846</span>    // Setting up region<a name="line.1846"></a>
+<span class="sourceLineNo">1847</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.1847"></a>
+<span class="sourceLineNo">1848</span>    // Putting data in key<a name="line.1848"></a>
+<span class="sourceLineNo">1849</span>    Put put = new Put(row1);<a name="line.1849"></a>
+<span class="sourceLineNo">1850</span>    put.addColumn(fam1, qf1, val1);<a name="line.1850"></a>
+<span class="sourceLineNo">1851</span>    region.put(put);<a name="line.1851"></a>
+<span class="sourceLineNo">1852</span><a name="line.1852"></a>
+<span class="sourceLineNo">1853</span>    // checkAndPut with correct value<a name="line.1853"></a>
+<span class="sourceLineNo">1854</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1854"></a>
+<span class="sourceLineNo">1855</span>        new BinaryComparator(val1), put);<a name="line.1855"></a>
+<span class="sourceLineNo">1856</span>    assertEquals(true, res);<a name="line.1856"></a>
+<span class="sourceLineNo">1857</span><a name="line.1857"></a>
+<span class="sourceLineNo">1858</span>    // checkAndDelete with correct value<a name="line.1858"></a>
+<span class="sourceLineNo">1859</span>    Delete delete = new Delete(row1);<a name="line.1859"></a>
+<span class="sourceLineNo">1860</span>    delete.addColumn(fam1, qf1);<a name="line.1860"></a>
+<span class="sourceLineNo">1861</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new BinaryComparator(val1),<a name="line.1861"></a>
+<span class="sourceLineNo">1862</span>        delete);<a name="line.1862"></a>
+<span class="sourceLineNo">1863</span>    assertEquals(true, res);<a name="line.1863"></a>
+<span class="sourceLineNo">1864</span><a name="line.1864"></a>
+<span class="sourceLineNo">1865</span>    // Putting data in key<a name="line.1865"></a>
+<span class="sourceLineNo">1866</span>    put = new Put(row1);<a name="line.1866"></a>
+<span class="sourceLineNo">1867</span>    put.addColumn(fam1, qf1, Bytes.toBytes(bd1));<a name="line.1867"></a>
+<span class="sourceLineNo">1868</span>    region.put(put);<a name="line.1868"></a>
+<span class="sourceLineNo">1869</span><a name="line.1869"></a>
+<span class="sourceLineNo">1870</span>    // checkAndPut with correct value<a name="line.1870"></a>
+<span class="sourceLineNo">1871</span>    res =<a name="line.1871"></a>
+<span class="sourceLineNo">1872</span>        region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new BigDecimalComparator(<a name="line.1872"></a>
+<span class="sourceLineNo">1873</span>            bd1), put);<a name="line.1873"></a>
+<span class="sourceLineNo">1874</span>    assertEquals(true, res);<a name="line.1874"></a>
+<span class="sourceLineNo">1875</span><a name="line.1875"></a>
+<span class="sourceLineNo">1876</span>    // checkAndDelete with correct value<a name="line.1876"></a>
+<span class="sourceLineNo">1877</span>    delete = new Delete(row1);<a name="line.1877"></a>
+<span class="sourceLineNo">1878</span>    delete.addColumn(fam1, qf1);<a name="line.1878"></a>
+<span class="sourceLineNo">1879</span>    res =<a name="line.1879"></a>
+<span class="sourceLineNo">1880</span>        region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new BigDecimalComparator(<a name="line.1880"></a>
+<span class="sourceLineNo">1881</span>            bd1), delete);<a name="line.1881"></a>
+<span class="sourceLineNo">1882</span>    assertEquals(true, res);<a name="line.1882"></a>
+<span class="sourceLineNo">1883</span>  }<a name="line.1883"></a>
+<span class="sourceLineNo">1884</span><a name="line.1884"></a>
+<span class="sourceLineNo">1885</span>  @Test<a name="line.1885"></a>
+<span class="sourceLineNo">1886</span>  public void testCheckAndMutate_WithNonEqualCompareOp() throws IOException {<a name="line.1886"></a>
+<span class="sourceLineNo">1887</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1887"></a>
+<span class="sourceLineNo">1888</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1888"></a>
+<span class="sourceLineNo">1889</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1889"></a>
+<span class="sourceLineNo">1890</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1890"></a>
+<span class="sourceLineNo">1891</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.1891"></a>
+<span class="sourceLineNo">1892</span>    byte[] val3 = Bytes.toBytes("value3");<a name="line.1892"></a>
+<span class="sourceLineNo">1893</span>    byte[] val4 = Bytes.toBytes("value4");<a name="line.1893"></a>
+<span class="sourceLineNo">1894</span><a name="line.1894"></a>
+<span class="sourceLineNo">1895</span>    // Setting up region<a name="line.1895"></a>
+<span class="sourceLineNo">1896</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.1896"></a>
+<span class="sourceLineNo">1897</span>    // Putting val3 in key<a name="line.1897"></a>
+<span class="sourceLineNo">1898</span>    Put put = new Put(row1);<a name="line.1898"></a>
+<span class="sourceLineNo">1899</span>    put.addColumn(fam1, qf1, val3);<a name="line.1899"></a>
+<span class="sourceLineNo">1900</span>    region.put(put);<a name="line.1900"></a>
+<span class="sourceLineNo">1901</span><a name="line.1901"></a>
+<span class="sourceLineNo">1902</span>    // Test CompareOp.LESS: original = val3, compare with val3, fail<a name="line.1902"></a>
+<span class="sourceLineNo">1903</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS,<a name="line.1903"></a>
+<span class="sourceLineNo">1904</span>        new BinaryComparator(val3), put);<a name="line.1904"></a>
+<span class="sourceLineNo">1905</span>    assertEquals(false, res);<a name="line.1905"></a>
+<span class="sourceLineNo">1906</span><a name="line.1906"></a>
+<span class="sourceLineNo">1907</span>    // Test CompareOp.LESS: original = val3, compare with val4, fail<a name="line.1907"></a>
+<span class="sourceLineNo">1908</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS,<a name="line.1908"></a>
+<span class="sourceLineNo">1909</span>        new BinaryComparator(val4), put);<a name="line.1909"></a>
+<span class="sourceLineNo">1910</span>    assertEquals(false, res);<a name="line.1910"></a>
+<span class="sourceLineNo">1911</span><a name="line.1911"></a>
+<span class="sourceLineNo">1912</span>    // Test CompareOp.LESS: original = val3, compare with val2,<a name="line.1912"></a>
+<span class="sourceLineNo">1913</span>    // succeed (now value = val2)<a name="line.1913"></a>
+<span class="sourceLineNo">1914</span>    put = new Put(row1);<a name="line.1914"></a>
+<span class="sourceLineNo">1915</span>    put.addColumn(fam1, qf1, val2);<a name="line.1915"></a>
+<span class="sourceLineNo">1916</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS,<a name="line.1916"></a>
+<span class="sourceLineNo">1917</span>        new BinaryComparator(val2), put);<a name="line.1917"></a>
+<span class="sourceLineNo">1918</span>    assertEquals(true, res);<a name="line.1918"></a>
+<span class="sourceLineNo">1919</span><a name="line.1919"></a>
+<span class="sourceLineNo">1920</span>    // Test CompareOp.LESS_OR_EQUAL: original = val2, compare with val3, fail<a name="line.1920"></a>
+<span class="sourceLineNo">1921</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS_OR_EQUAL,<a name="line.1921"></a>
+<span class="sourceLineNo">1922</span>        new BinaryComparator(val3), put);<a name="line.1922"></a>
+<span class="sourceLineNo">1923</span>    assertEquals(false, res);<a name="line.1923"></a>
+<span class="sourceLineNo">1924</span><a name="line.1924"></a>
+<span class="sourceLineNo">1925</span>    // Test CompareOp.LESS_OR_EQUAL: original = val2, compare with val2,<a name="line.1925"></a>
+<span class="sourceLineNo">1926</span>    // succeed (value still = val2)<a name="line.1926"></a>
+<span class="sourceLineNo">1927</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS_OR_EQUAL,<a name="line.1927"></a>
+<span class="sourceLineNo">1928</span>        new BinaryComparator(val2), put);<a name="line.1928"></a>
+<span class="sourceLineNo">1929</span>    assertEquals(true, res);<a name="line.1929"></a>
+<span class="sourceLineNo">1930</span><a name="line.1930"></a>
+<span class="sourceLineNo">1931</span>    // Test CompareOp.LESS_OR_EQUAL: original = val2, compare with val1,<a name="line.1931"></a>
+<span class="sourceLineNo">1932</span>    // succeed (now value = val3)<a name="line.1932"></a>
+<span class="sourceLineNo">1933</span>    put = new Put(row1);<a name="line.1933"></a>
+<span class="sourceLineNo">1934</span>    put.addColumn(fam1, qf1, val3);<a name="line.1934"></a>
+<span class="sourceLineNo">1935</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS_OR_EQUAL,<a name="line.1935"></a>
+<span class="sourceLineNo">1936</span>        new BinaryComparator(val1), put);<a name="line.1936"></a>
+<span class="sourceLineNo">1937</span>    assertEquals(true, res);<a name="line.1937"></a>
+<span class="sourceLineNo">1938</span><a name="line.1938"></a>
+<span class="sourceLineNo">1939</span>    // Test CompareOp.GREATER: original = val3, compare with val3, fail<a name="line.1939"></a>
+<span class="sourceLineNo">1940</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER,<a name="line.1940"></a>
+<span class="sourceLineNo">1941</span>        new BinaryComparator(val3), put);<a name="line.1941"></a>
+<span class="sourceLineNo">1942</span>    assertEquals(false, res);<a name="line.1942"></a>
+<span class="sourceLineNo">1943</span><a name="line.1943"></a>
+<span class="sourceLineNo">1944</span>    // Test CompareOp.GREATER: original = val3, compare with val2, fail<a name="line.1944"></a>
+<span class="sourceLineNo">1945</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER,<a name="line.1945"></a>
+<span class="sourceLineNo">1946</span>        new BinaryComparator(val2), put);<a name="line.1946"></a>
+<span class="sourceLineNo">1947</span>    assertEquals(false, res);<a name="line.1947"></a>
+<span class="sourceLineNo">1948</span><a name="line.1948"></a>
+<span class="sourceLineNo">1949</span>    // Test CompareOp.GREATER: original = val3, compare with val4,<a name="line.1949"></a>
+<span class="sourceLineNo">1950</span>    // succeed (now value = val2)<a name="line.1950"></a>
+<span class="sourceLineNo">1951</span>    put = new Put(row1);<a name="line.1951"></a>
+<span class="sourceLineNo">1952</span>    put.addColumn(fam1, qf1, val2);<a name="line.1952"></a>
+<span class="sourceLineNo">1953</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER,<a name="line.1953"></a>
+<span class="sourceLineNo">1954</span>        new BinaryComparator(val4), put);<a name="line.1954"></a>
+<span class="sourceLineNo">1955</span>    assertEquals(true, res);<a name="line.1955"></a>
+<span class="sourceLineNo">1956</span><a name="line.1956"></a>
+<span class="sourceLineNo">1957</span>    // Test CompareOp.GREATER_OR_EQUAL: original = val2, compare with val1, fail<a name="line.1957"></a>
+<span class="sourceLineNo">1958</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER_OR_EQUAL,<a name="line.1958"></a>
+<span class="sourceLineNo">1959</span>        new BinaryComparator(val1), put);<a name="line.1959"></a>
+<span class="sourceLineNo">1960</span>    assertEquals(false, res);<a name="line.1960"></a>
+<span class="sourceLineNo">1961</span><a name="line.1961"></a>
+<span class="sourceLineNo">1962</span>    // Test CompareOp.GREATER_OR_EQUAL: original = val2, compare with val2,<a name="line.1962"></a>
+<span class="sourceLineNo">1963</span>    // succeed (value still = val2)<a name="line.1963"></a>
+<span class="sourceLineNo">1964</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER_OR_EQUAL,<a name="line.1964"></a>
+<span class="sourceLineNo">1965</span>        new BinaryComparator(val2), put);<a name="line.1965"></a>
+<span class="sourceLineNo">1966</span>    assertEquals(true, res);<a name="line.1966"></a>
+<span class="sourceLineNo">1967</span><a name="line.1967"></a>
+<span class="sourceLineNo">1968</span>    // Test CompareOp.GREATER_OR_EQUAL: original = val2, compare with val3, succeed<a name="line.1968"></a>
+<span class="sourceLineNo">1969</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER_OR_EQUAL,<a name="line.1969"></a>
+<span class="sourceLineNo">1970</span>        new BinaryComparator(val3), put);<a name="line.1970"></a>
+<span class="sourceLineNo">1971</span>    assertEquals(true, res);<a name="line.1971"></a>
+<span class="sourceLineNo">1972</span>  }<a name="line.1972"></a>
+<span class="sourceLineNo">1973</span><a name="line.1973"></a>
+<span class="sourceLineNo">1974</span>  @Test<a name="line.1974"></a>
+<span class="sourceLineNo">1975</span>  public void testCheckAndPut_ThatPutWasWritten() throws IOException {<a name="line.1975"></a>
+<span class="sourceLineNo">1976</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1976"></a>
+<span class="sourceLineNo">1977</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1977"></a>
+<span class="sourceLineNo">1978</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.1978"></a>
+<span class="sourceLineNo">1979</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1979"></a>
+<span class="sourceLineNo">1980</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1980"></a>
+<span class="sourceLineNo">1981</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.1981"></a>
+<span class="sourceLineNo">1982</span><a name="line.1982"></a>
+<span class="sourceLineNo">1983</span>    byte[][] families = { fam1, fam2 };<a name="line.1983"></a>
+<span class="sourceLineNo">1984</span><a name="line.1984"></a>
+<span class="sourceLineNo">1985</span>    // Setting up region<a name="line.1985"></a>
+<span class="sourceLineNo">1986</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.1986"></a>
+<span class="sourceLineNo">1987</span>    // Putting data in the key to check<a name="line.1987"></a>
+<span class="sourceLineNo">1988</span>    Put put = new Put(row1);<a name="line.1988"></a>
+<span class="sourceLineNo">1989</span>    put.addColumn(fam1, qf1, val1);<a name="line.1989"></a>
+<span class="sourceLineNo">1990</span>    region.put(put);<a name="line.1990"></a>
+<span class="sourceLineNo">1991</span><a name="line.1991"></a>
+<span class="sourceLineNo">1992</span>    // Creating put to add<a name="line.1992"></a>
+<span class="sourceLineNo">1993</span>    long ts = System.currentTimeMillis();<a name="line.1993"></a>
+<span class="sourceLineNo">1994</span>    KeyValue kv = new KeyValue(row1, fam2, qf1, ts, KeyValue.Type.Put, val2);<a name="line.1994"></a>
+<span class="sourceLineNo">1995</span>    put = new Put(row1);<a name="line.1995"></a>
+<span class="sourceLineNo">1996</span>    put.add(kv);<a name="line.1996"></a>
+<span class="sourceLineNo">1997</span><a name="line.1997"></a>
+<span class="sourceLineNo">1998</span>    // checkAndPut with wrong value<a name="line.1998"></a>
+<span class="sourceLineNo">1999</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1999"></a>
+<span class="sourceLineNo">2000</span>        new BinaryComparator(val1), put);<a name="line.2000"></a>
+<span class="sourceLineNo">2001</span>    assertEquals(true, res);<a name="line.2001"></a>
+<span class="sourceLineNo">2002</span><a name="line.2002"></a>
+<span class="sourceLineNo">2003</span>    Get get = new Get(row1);<a name="line.2003"></a>
+<span class="sourceLineNo">2004</span>    get.addColumn(fam2, qf1);<a name="line.2004"></a>
+<span class="sourceLineNo">2005</span>    Cell[] actual = region.get(get).rawCells();<a name="line.2005"></a>
+<span class="sourceLineNo">2006</span><a name="line.2006"></a>
+<span class="sourceLineNo">2007</span>    Cell[] expected = { kv };<a name="line.2007"></a>
+<span class="sourceLineNo">2008</span><a name="line.2008"></a>
+<span class="sourceLineNo">2009</span>    assertEquals(expected.length, actual.length);<a name="line.2009"></a>
+<span class="sourceLineNo">2010</span>    for (int i = 0; i &lt; actual.length; i++) {<a name="line.2010"></a>
+<span class="sourceLineNo">2011</span>      assertEquals(expected[i], actual[i]);<a name="line.2011"></a>
+<span class="sourceLineNo">2012</span>    }<a name="line.2012"></a>
+<span class="sourceLineNo">2013</span>  }<a name="line.2013"></a>
+<span class="sourceLineNo">2014</span><a name="line.2014"></a>
+<span class="sourceLineNo">2015</span>  @Test<a name="line.2015"></a>
+<span class="sourceLineNo">2016</span>  public void testCheckAndPut_wrongRowInPut() throws IOException {<a name="line.2016"></a>
+<span class="sourceLineNo">2017</span>    this.region = initHRegion(tableName, method, CONF, COLUMNS);<a name="line.2017"></a>
+<span class="sourceLineNo">2018</span>    Put put = new Put(row2);<a name="line.2018"></a>
+<span class="sourceLineNo">2019</span>    put.addColumn(fam1, qual1, value1);<a name="line.2019"></a>
+<span class="sourceLineNo">2020</span>    try {<a name="line.2020"></a>
+<span class="sourceLineNo">2021</span>      region.checkAndMutate(row, fam1, qual1, CompareOperator.EQUAL,<a name="line.2021"></a>
+<span class="sourceLineNo">2022</span>          new BinaryComparator(value2), put);<a name="line.2022"></a>
+<span class="sourceLineNo">2023</span>      fail();<a name="line.2023"></a>
+<span class="sourceLineNo">2024</span>    } catch (org.apache.hadoop.hbase.DoNotRetryIOException expected) {<a name="line.2024"></a>
+<span class="sourceLineNo">2025</span>      // expected exception.<a name="line.2025"></a>
+<span class="sourceLineNo">2026</span>    }<a name="line.2026"></a>
+<span class="sourceLineNo">2027</span>  }<a name="line.2027"></a>
+<span class="sourceLineNo">2028</span><a name="line.2028"></a>
+<span class="sourceLineNo">2029</span>  @Test<a name="line.2029"></a>
+<span class="sourceLineNo">2030</span>  public void testCheckAndDelete_ThatDeleteWasWritten() throws IOException {<a name="line.2030"></a>
+<span class="sourceLineNo">2031</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2031"></a>
+<span class="sourceLineNo">2032</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2032"></a>
+<span class="sourceLineNo">2033</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2033"></a>
+<span class="sourceLineNo">2034</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.2034"></a>
+<span class="sourceLineNo">2035</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.2035"></a>
+<span class="sourceLineNo">2036</span>    byte[] qf3 = Bytes.toBytes("qualifier3");<a name="line.2036"></a>
+<span class="sourceLineNo">2037</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.2037"></a>
+<span class="sourceLineNo">2038</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.2038"></a>
+<span class="sourceLineNo">2039</span>    byte[] val3 = Bytes.toBytes("value3");<a name="line.2039"></a>
+<span class="sourceLineNo">2040</span>    byte[] emptyVal = new byte[] {};<a name="line.2040"></a>
+<span class="sourceLineNo">2041</span><a name="line.2041"></a>
+<span class="sourceLineNo">2042</span>    byte[][] families = { fam1, fam2 };<a name="line.2042"></a>
+<span class="sourceLineNo">2043</span><a name="line.2043"></a>
+<span class="sourceLineNo">2044</span>    // Setting up region<a name="line.2044"></a>
+<span class="sourceLineNo">2045</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2045"></a>
+<span class="sourceLineNo">2046</span>    // Put content<a name="line.2046"></a>
+<span class="sourceLineNo">2047</span>    Put put = new Put(row1);<a name="line.2047"></a>
+<span class="sourceLineNo">2048</span>    put.addColumn(fam1, qf1, val1);<a name="line.2048"></a>
+<span class="sourceLineNo">2049</span>    region.put(put);<a name="line.2049"></a>
+<span class="sourceLineNo">2050</span>    Threads.sleep(2);<a name="line.2050"></a>
+<span class="sourceLineNo">2051</span><a name="line.2051"></a>
+<span class="sourceLineNo">2052</span>    put = new Put(row1);<a name="line.2052"></a>
+<span class="sourceLineNo">2053</span>    put.addColumn(fam1, qf1, val2);<a name="line.2053"></a>
+<span class="sourceLineNo">2054</span>    put.addColumn(fam2, qf1, val3);<a name="line.2054"></a>
+<span class="sourceLineNo">2055</span>    put.addColumn(fam2, qf2, val2);<a name="line.2055"></a>
+<span class="sourceLineNo">2056</span>    put.addColumn(fam2, qf3, val1);<a name="line.2056"></a>
+<span class="sourceLineNo">2057</span>    put.addColumn(fam1, qf3, val1);<a name="line.2057"></a>
+<span class="sourceLineNo">2058</span>    region.put(put);<a name="line.2058"></a>
+<span class="sourceLineNo">2059</span><a name="line.2059"></a>
+<span class="sourceLineNo">2060</span>    // Multi-column delete<a name="line.2060"></a>
+<span class="sourceLineNo">2061</span>    Delete delete = new Delete(row1);<a name="line.2061"></a>
+<span class="sourceLineNo">2062</span>    delete.addColumn(fam1, qf1);<a name="line.2062"></a>
+<span class="sourceLineNo">2063</span>    delete.addColumn(fam2, qf1);<a name="line.2063"></a>
+<span class="sourceLineNo">2064</span>    delete.addColumn(fam1, qf3);<a name="line.2064"></a>
+<span class="sourceLineNo">2065</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.2065"></a>
+<span class="sourceLineNo">2066</span>        new BinaryComparator(val2), delete);<a name="line.2066"></a>
+<span class="sourceLineNo">2067</span>    assertEquals(true, res);<a name="line.2067"></a>
+<span class="sourceLineNo">2068</span><a name="line.2068"></a>
+<span class="sourceLineNo">2069</span>    Get get = new Get(row1);<a name="line.2069"></a>
+<span class="sourceLineNo">2070</span>    get.addColumn(fam1, qf1);<a name="line.2070"></a>
+<span class="sourceLineNo">2071</span>    get.addColumn(fam1, qf3);<a name="line.2071"></a>
+<span class="sourceLineNo">2072</span>    get.addColumn(fam2, qf2);<a name="line.2072"></a>
+<span class="sourceLineNo">2073</span>    Result r = region.get(get);<a name="line.2073"></a>
+<span class="sourceLineNo">2074</span>    assertEquals(2, r.size());<a name="line.2074"></a>
+<span class="sourceLineNo">2075</span>    assertArrayEquals(val1, r.getValue(fam1, qf1));<a name="line.2075"></a>
+<span class="sourceLineNo">2076</span>    assertArrayEquals(val2, r.getValue(fam2, qf2));<a name="line.2076"></a>
+<span class="sourceLineNo">2077</span><a name="line.2077"></a>
+<span class="sourceLineNo">2078</span>    // Family delete<a name="line.2078"></a>
+<span class="sourceLineNo">2079</span>    delete = new Delete(row1);<a name="line.2079"></a>
+<span class="sourceLineNo">2080</span>    delete.addFamily(fam2);<a name="line.2080"></a>
+<span class="sourceLineNo">2081</span>    res = region.checkAndMutate(row1, fam2, qf1, CompareOperator.EQUAL,<a name="line.2081"></a>
+<span class="sourceLineNo">2082</span>        new BinaryComparator(emptyVal), delete);<a name="line.2082"></a>
+<span class="sourceLineNo">2083</span>    assertEquals(true, res);<a name="line.2083"></a>
+<span class="sourceLineNo">2084</span><a name="line.2084"></a>
+<span class="sourceLineNo">2085</span>    get = new Get(row1);<a name="line.2085"></a>
+<span class="sourceLineNo">2086</span>    r = region.get(get);<a name="line.2086"></a>
+<span class="sourceLineNo">2087</span>    assertEquals(1, r.size());<a name="line.2087"></a>
+<span class="sourceLineNo">2088</span>    assertArrayEquals(val1, r.getValue(fam1, qf1));<a name="line.2088"></a>
+<span class="sourceLineNo">2089</span><a name="line.2089"></a>
+<span class="sourceLineNo">2090</span>    // Row delete<a name="line.2090"></a>
+<span class="sourceLineNo">2091</span>    delete = new Delete(row1);<a name="line.2091"></a>
+<span class="sourceLineNo">2092</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new BinaryComparator(val1),<a name="line.2092"></a>
+<span class="sourceLineNo">2093</span>        delete);<a name="line.2093"></a>
+<span class="sourceLineNo">2094</span>    assertEquals(true, res);<a name="line.2094"></a>
+<span class="sourceLineNo">2095</span>    get = new Get(row1);<a name="line.2095"></a>
+<span class="sourceLineNo">2096</span>    r = region.get(get);<a name="line.2096"></a>
+<span class="sourceLineNo">2097</span>    assertEquals(0, r.size());<a name="line.2097"></a>
+<span class="sourceLineNo">2098</span>  }<a name="line.2098"></a>
+<span class="sourceLineNo">2099</span><a name="line.2099"></a>
+<span class="sourceLineNo">2100</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2100"></a>
+<span class="sourceLineNo">2101</span>  // Delete tests<a name="line.2101"></a>
+<span class="sourceLineNo">2102</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2102"></a>
+<span class="sourceLineNo">2103</span>  @Test<a name="line.2103"></a>
+<span class="sourceLineNo">2104</span>  public void testDelete_multiDeleteColumn() throws IOException {<a name="line.2104"></a>
+<span class="sourceLineNo">2105</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2105"></a>
+<span class="sourceLineNo">2106</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2106"></a>
+<span class="sourceLineNo">2107</span>    byte[] qual = Bytes.toBytes("qualifier");<a name="line.2107"></a>
+<span class="sourceLineNo">2108</span>    byte[] value = Bytes.toBytes("value");<a name="line.2108"></a>
+<span class="sourceLineNo">2109</span><a name="line.2109"></a>
+<span class="sourceLineNo">2110</span>    Put put = new Put(row1);<a name="line.2110"></a>
+<span class="sourceLineNo">2111</span>    put.addColumn(fam1, qual, 1, value);<a name="line.2111"></a>
+<span class="sourceLineNo">2112</span>    put.addColumn(fam1, qual, 2, value);<a name="line.2112"></a>
+<span class="sourceLineNo">2113</span><a name="line.2113"></a>
+<span class="sourceLineNo">2114</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2114"></a>
+<span class="sourceLineNo">2115</span>    region.put(put);<a name="line.2115"></a>
+<span class="sourceLineNo">2116</span><a name="line.2116"></a>
+<span class="sourceLineNo">2117</span>    // We do support deleting more than 1 'latest' version<a name="line.2117"></a>
+<span class="sourceLineNo">2118</span>    Delete delete = new Delete(row1);<a name="line.2118"></a>
 <span class="sourceLineNo">2119</span>    delete.addColumn(fam1, qual);<a name="line.2119"></a>
-<span class="sourceLineNo">2120</span>    region.delete(delete);<a name="line.2120"></a>
-<span class="sourceLineNo">2121</span><a name="line.2121"></a>
-<span class="sourceLineNo">2122</span>    Get get = new Get(row1);<a name="line.2122"></a>
-<span class="sourceLineNo">2123</span>    get.addFamily(fam1);<a name="line.2123"></a>
-<span class="sourceLineNo">2124</span>    Result r = region.get(get);<a name="line.2124"></a>
-<span class="sourceLineNo">2125</span>    assertEquals(0, r.size());<a name="line.2125"></a>
-<span class="sourceLineNo">2126</span>  }<a name="line.2126"></a>
-<span class="sourceLineNo">2127</span><a name="line.2127"></a>
-<span class="sourceLineNo">2128</span>  @Test<a name="line.2128"></a>
-<span class="sourceLineNo">2129</span>  public void testDelete_CheckFamily() throws IOException {<a name="line.2129"></a>
-<span class="sourceLineNo">2130</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2130"></a>
-<span class="sourceLineNo">2131</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2131"></a>
-<span class="sourceLineNo">2132</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2132"></a>
-<span class="sourceLineNo">2133</span>    byte[] fam3 = Bytes.toBytes("fam3");<a name="line.2133"></a>
-<span class="sourceLineNo">2134</span>    byte[] fam4 = Bytes.toBytes("fam4");<a name="line.2134"></a>
-<span class="sourceLineNo">2135</span><a name="line.2135"></a>
-<span class="sourceLineNo">2136</span>    // Setting up region<a name="line.2136"></a>
-<span class="sourceLineNo">2137</span>    this.region = initHRegion(tableName, method, CONF, fam1, fam2, fam3);<a name="line.2137"></a>
-<span class="sourceLineNo">2138</span>    List&lt;Cell&gt; kvs = new ArrayList&lt;&gt;();<a name="line.2138"></a>
-<span class="sourceLineNo">2139</span>    kvs.add(new KeyValue(row1, fam4, null, null));<a name="line.2139"></a>
-<span class="sourceLineNo">2140</span><a name="line.2140"></a>
-<span class="sourceLineNo">2141</span>    // testing existing family<a name="line.2141"></a>
-<span class="sourceLineNo">2142</span>    byte[] family = fam2;<a name="line.2142"></a>
-<span class="sourceLineNo">2143</span>    NavigableMap&lt;byte[], List&lt;Cell&gt;&gt; deleteMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2143"></a>
-<span class="sourceLineNo">2144</span>    deleteMap.put(family, kvs);<a name="line.2144"></a>
-<span class="sourceLineNo">2145</span>    region.delete(deleteMap, Durability.SYNC_WAL);<a name="line.2145"></a>
-<span class="sourceLineNo">2146</span><a name="line.2146"></a>
-<span class="sourceLineNo">2147</span>    // testing non existing family<a name="line.2147"></a>
-<span class="sourceLineNo">2148</span>    boolean ok = false;<a name="line.2148"></a>
-<span class="sourceLineNo">2149</span>    family = fam4;<a name="line.2149"></a>
-<span class="sourceLineNo">2150</span>    try {<a name="line.2150"></a>
-<span class="sourceLineNo">2151</span>      deleteMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2151"></a>
-<span class="sourceLineNo">2152</span>      deleteMap.put(family, kvs);<a name="line.2152"></a>
-<span class="sourceLineNo">2153</span>      region.delete(deleteMap, Durability.SYNC_WAL);<a name="line.2153"></a>
-<span class="sourceLineNo">2154</span>    } catch (Exception e) {<a name="line.2154"></a>
-<span class="sourceLineNo">2155</span>      ok = true;<a name="line.2155"></a>
-<span class="sourceLineNo">2156</span>    }<a name="line.2156"></a>
-<span class="sourceLineNo">2157</span>    assertTrue("Family " + new String(family, StandardCharsets.UTF_8) + " does exist", ok);<a name="line.2157"></a>
-<span class="sourceLineNo">2158</span>  }<a name="line.2158"></a>
-<span class="sourceLineNo">2159</span><a name="line.2159"></a>
-<span class="sourceLineNo">2160</span>  @Test<a name="line.2160"></a>
-<span class="sourceLineNo">2161</span>  public void testDelete_mixed() throws IOException, InterruptedException {<a name="line.2161"></a>
-<span class="sourceLineNo">2162</span>    byte[] fam = Bytes.toBytes("info");<a name="line.2162"></a>
-<span class="sourceLineNo">2163</span>    byte[][] families = { fam };<a name="line.2163"></a>
-<span class="sourceLineNo">2164</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2164"></a>
-<span class="sourceLineNo">2165</span>    EnvironmentEdgeManagerTestHelper.injectEdge(new IncrementingEnvironmentEdge());<a name="line.2165"></a>
-<span class="sourceLineNo">2166</span><a name="line.2166"></a>
-<span class="sourceLineNo">2167</span>    byte[] row = Bytes.toBytes("table_name");<a name="line.2167"></a>
-<span class="sourceLineNo">2168</span>    // column names<a name="line.2168"></a>
-<span class="sourceLineNo">2169</span>    byte[] serverinfo = Bytes.toBytes("serverinfo");<a name="line.2169"></a>
-<span class="sourceLineNo">2170</span>    byte[] splitA = Bytes.toBytes("splitA");<a name="line.2170"></a>
-<span class="sourceLineNo">2171</span>    byte[] splitB = Bytes.toBytes("splitB");<a name="line.2171"></a>
-<span class="sourceLineNo">2172</span><a name="line.2172"></a>
-<span class="sourceLineNo">2173</span>    // add some data:<a name="line.2173"></a>
-<span class="sourceLineNo">2174</span>    Put put = new Put(row);<a name="line.2174"></a>
-<span class="sourceLineNo">2175</span>    put.addColumn(fam, splitA, Bytes.toBytes("reference_A"));<a name="line.2175"></a>
-<span class="sourceLineNo">2176</span>    region.put(put);<a name="line.2176"></a>
-<span class="sourceLineNo">2177</span><a name="line.2177"></a>
-<span class="sourceLineNo">2178</span>    put = new Put(row);<a name="line.2178"></a>
-<span class="sourceLineNo">2179</span>    put.addColumn(fam, splitB, Bytes.toBytes("reference_B"));<a name="line.2179"></a>
-<span class="sourceLineNo">2180</span>    region.put(put);<a name="line.2180"></a>
-<span class="sourceLineNo">2181</span><a name="line.2181"></a>
-<span class="sourceLineNo">2182</span>    put = new Put(row);<a name="line.2182"></a>
-<span class="sourceLineNo">2183</span>    put.addColumn(fam, serverinfo, Bytes.toBytes("ip_address"));<a name="line.2183"></a>
-<span class="sourceLineNo">2184</span>    region.put(put);<a name="line.2184"></a>
-<span class="sourceLineNo">2185</span><a name="line.2185"></a>
-<span class="sourceLineNo">2186</span>    // ok now delete a split:<a name="line.2186"></a>
-<span class="sourceLineNo">2187</span>    Delete delete = new Delete(row);<a name="line.2187"></a>
-<span class="sourceLineNo">2188</span>    delete.addColumns(fam, splitA);<a name="line.2188"></a>
-<span class="sourceLineNo">2189</span>    region.delete(delete);<a name="line.2189"></a>
-<span class="sourceLineNo">2190</span><a name="line.2190"></a>
-<span class="sourceLineNo">2191</span>    // assert some things:<a name="line.2191"></a>
-<span class="sourceLineNo">2192</span>    Get get = new Get(row).addColumn(fam, serverinfo);<a name="line.2192"></a>
-<span class="sourceLineNo">2193</span>    Result result = region.get(get);<a name="line.2193"></a>
-<span class="sourceLineNo">2194</span>    assertEquals(1, result.size());<a name="line.2194"></a>
-<span class="sourceLineNo">2195</span><a name="line.2195"></a>
-<span class="sourceLineNo">2196</span>    get = new Get(row).addColumn(fam, splitA);<a name="line.2196"></a>
-<span class="sourceLineNo">2197</span>    result = region.get(get);<a name="line.2197"></a>
-<span class="sourceLineNo">2198</span>    assertEquals(0, result.size());<a name="line.2198"></a>
-<span class="sourceLineNo">2199</span><a name="line.2199"></a>
-<span class="sourceLineNo">2200</span>    get = new Get(row).addColumn(fam, splitB);<a name="line.2200"></a>
-<span class="sourceLineNo">2201</span>    result = region.get(get);<a name="line.2201"></a>
-<span class="sourceLineNo">2202</span>    assertEquals(1, result.size());<a name="line.2202"></a>
-<span class="sourceLineNo">2203</span><a name="line.2203"></a>
-<span class="sourceLineNo">2204</span>    // Assert that after a delete, I can put.<a name="line.2204"></a>
-<span class="sourceLineNo">2205</span>    put = new Put(row);<a name="line.2205"></a>
-<span class="sourceLineNo">2206</span>    put.addColumn(fam, splitA, Bytes.toBytes("reference_A"));<a name="line.2206"></a>
-<span class="sourceLineNo">2207</span>    region.put(put);<a name="line.2207"></a>
-<span class="sourceLineNo">2208</span>    get = new Get(row);<a name="line.2208"></a>
-<span class="sourceLineNo">2209</span>    result = region.get(get);<a name="line.2209"></a>
-<span class="sourceLineNo">2210</span>    assertEquals(3, result.size());<a name="line.2210"></a>
-<span class="sourceLineNo">2211</span><a name="line.2211"></a>
-<span class="sourceLineNo">2212</span>    // Now delete all... then test I can add stuff back<a name="line.2212"></a>
-<span class="sourceLineNo">2213</span>    delete = new Delete(row);<a name="line.2213"></a>
-<span class="sourceLineNo">2214</span>    region.delete(delete);<a name="line.2214"></a>
-<span class="sourceLineNo">2215</span>    assertEquals(0, region.get(get).size());<a name="line.2215"></a>
-<span class="sourceLineNo">2216</span><a name="line.2216"></a>
-<span class="sourceLineNo">2217</span>    region.put(new Put(row).addColumn(fam, splitA, Bytes.toBytes("reference_A")));<a name="line.2217"></a>
-<span class="sourceLineNo">2218</span>    result = region.get(get);<a name="line.2218"></a>
-<span class="sourceLineNo">2219</span>    assertEquals(1, result.size());<a name="line.2219"></a>
-<span class="sourceLineNo">2220</span>  }<a name="line.2220"></a>
-<span class="sourceLineNo">2221</span><a name="line.2221"></a>
-<span class="sourceLineNo">2222</span>  @Test<a name="line.2222"></a>
-<span class="sourceLineNo">2223</span>  public void testDeleteRowWithFutureTs() throws IOException {<a name="line.2223"></a>
-<span class="sourceLineNo">2224</span>    byte[] fam = Bytes.toBytes("info");<a name="line.2224"></a>
-<span class="sourceLineNo">2225</span>    byte[][] families = { fam };<a name="line.2225"></a>
-<span class="sourceLineNo">2226</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2226"></a>
-<span class="sourceLineNo">2227</span>    byte[] row = Bytes.toBytes("table_name");<a name="line.2227"></a>
-<span class="sourceLineNo">2228</span>    // column names<a name="line.2228"></a>
-<span class="sourceLineNo">2229</span>    byte[] serverinfo = Bytes.toBytes("serverinfo");<a name="line.2229"></a>
-<span class="sourceLineNo">2230</span><a name="line.2230"></a>
-<span class="sourceLineNo">2231</span>    // add data in the far future<a name="line.2231"></a>
-<span class="sourceLineNo">2232</span>    Put put = new Put(row);<a name="line.2232"></a>
-<span class="sourceLineNo">2233</span>    put.addColumn(fam, serverinfo, HConstants.LATEST_TIMESTAMP - 5, Bytes.toBytes("value"));<a name="line.2233"></a>
-<span class="sourceLineNo">2234</span>    region.put(put);<a name="line.2234"></a>
-<span class="sourceLineNo">2235</span><a name="line.2235"></a>
-<span class="sourceLineNo">2236</span>    // now delete something in the present<a name="line.2236"></a>
-<span class="sourceLineNo">2237</span>    Delete delete = new Delete(row);<a name="line.2237"></a>
-<span class="sourceLineNo">2238</span>    region.delete(delete);<a name="line.2238"></a>
-<span class="sourceLineNo">2239</span><a name="line.2239"></a>
-<span class="sourceLineNo">2240</span>    // make sure we still see our data<a name="line.2240"></a>
-<span class="sourceLineNo">2241</span>    Get get = new Get(row).addColumn(fam, serverinfo);<a name="line.2241"></a>
-<span class="sourceLineNo">2242</span>    Result result = region.get(get);<a name="line.2242"></a>
-<span class="sourceLineNo">2243</span>    assertEquals(1, result.size());<a name="line.2243"></a>
-<span class="sourceLineNo">2244</span><a name="line.2244"></a>
-<span class="sourceLineNo">2245</span>    // delete the future row<a name="line.2245"></a>
-<span class="sourceLineNo">2246</span>    delete = new Delete(row, HConstants.LATEST_TIMESTAMP - 3);<a name="line.2246"></a>
-<span class="sourceLineNo">2247</span>    region.delete(delete);<a name="line.2247"></a>
-<span class="sourceLineNo">2248</span><a name="line.2248"></a>
-<span class="sourceLineNo">2249</span>    // make sure it is gone<a name="line.2249"></a>
-<span class="sourceLineNo">2250</span>    get = new Get(row).addColumn(fam, serverinfo);<a name="line.2250"></a>
-<span class="sourceLineNo">2251</span>    result = region.get(get);<a name="line.2251"></a>
-<span class="sourceLineNo">2252</span>    assertEquals(0, result.size());<a name="line.2252"></a>
-<span class="sourceLineNo">2253</span>  }<a name="line.2253"></a>
-<span class="sourceLineNo">2254</span><a name="line.2254"></a>
-<span class="sourceLineNo">2255</span>  /**<a name="line.2255"></a>
-<span class="sourceLineNo">2256</span>   * Tests that the special LATEST_TIMESTAMP option for puts gets replaced by<a name="line.2256"></a>
-<span class="sourceLineNo">2257</span>   * the actual timestamp<a name="line.2257"></a>
-<span class="sourceLineNo">2258</span>   */<a name="line.2258"></a>
-<span class="sourceLineNo">2259</span>  @Test<a name="line.2259"></a>
-<span class="sourceLineNo">2260</span>  public void testPutWithLatestTS() throws IOException {<a name="line.2260"></a>
-<span class="sourceLineNo">2261</span>    byte[] fam = Bytes.toBytes("info");<a name="line.2261"></a>
-<span class="sourceLineNo">2262</span>    byte[][] families = { fam };<a name="line.2262"></a>
-<span class="sourceLineNo">2263</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2263"></a>
-<span class="sourceLineNo">2264</span>    byte[] row = Bytes.toBytes("row1");<a name="line.2264"></a>
-<span class="sourceLineNo">2265</span>    // column names<a name="line.2265"></a>
-<span class="sourceLineNo">2266</span>    byte[] qual = Bytes.toBytes("qual");<a name="line.2266"></a>
-<span class="sourceLineNo">2267</span><a name="line.2267"></a>
-<span class="sourceLineNo">2268</span>    // add data with LATEST_TIMESTAMP, put without WAL<a name="line.2268"></a>
-<span class="sourceLineNo">2269</span>    Put put = new Put(row);<a name="line.2269"></a>
-<span class="sourceLineNo">2270</span>    put.addColumn(fam, qual, HConstants.LATEST_TIMESTAMP, Bytes.toBytes("value"));<a name="line.2270"></a>
-<span class="sourceLineNo">2271</span>    region.put(put);<a name="line.2271"></a>
-<span class="sourceLineNo">2272</span><a name="line.2272"></a>
-<span class="sourceLineNo">2273</span>    // Make sure it shows up with an actual timestamp<a name="line.2273"></a>
-<span class="sourceLineNo">2274</span>    Get get = new Get(row).addColumn(fam, qual);<a name="line.2274"></a>
-<span class="sourceLineNo">2275</span>    Result result = region.get(get);<a name="line.2275"></a>
-<span class="sourceLineNo">2276</span>    assertEquals(1, result.size());<a name="line.2276"></a>
-<span class="sourceLineNo">2277</span>    Cell kv = result.rawCells()[0];<a name="line.2277"></a>
-<span class="sourceLineNo">2278</span>    LOG.info("Got: " + kv);<a name="line.2278"></a>
-<span class="sourceLineNo">2279</span>    assertTrue("LATEST_TIMESTAMP was not replaced with real timestamp",<a name="line.2279"></a>
-<span class="sourceLineNo">2280</span>        kv.getTimestamp() != HConstants.LATEST_TIMESTAMP);<a name="line.2280"></a>
-<span class="sourceLineNo">2281</span><a name="line.2281"></a>
-<span class="sourceLineNo">2282</span>    // Check same with WAL enabled (historically these took different<a name="line.2282"></a>
-<span class="sourceLineNo">2283</span>    // code paths, so check both)<a name="line.2283"></a>
-<span class="sourceLineNo">2284</span>    row = Bytes.toBytes("row2");<a name="line.2284"></a>
-<span class="sourceLineNo">2285</span>    put = new Put(row);<a name="line.2285"></a>
-<span class="sourceLineNo">2286</span>    put.addColumn(fam, qual, HConstants.LATEST_TIMESTAMP, Bytes.toBytes("value"));<a name="line.2286"></a>
-<span class="sourceLineNo">2287</span>    region.put(put);<a name="line.2287"></a>
-<span class="sourceLineNo">2288</span><a name="line.2288"></a>
-<span class="sourceLineNo">2289</span>    // Make sure it shows up with an actual timestamp<a name="line.2289"></a>
-<span class="sourceLineNo">2290</span>    get = new Get(row).addColumn(fam, qual);<a name="line.2290"></a>
-<span class="sourceLineNo">2291</span>    result = region.get(get);<a name="line.2291"></a>
-<span class="sourceLineNo">2292</span>    assertEquals(1, result.size());<a name="line.2292"></a>
-<span class="sourceLineNo">2293</span>    kv = result.rawCells()[0];<a name="line.2293"></a>
-<span class="sourceLineNo">2294</span>    LOG.info("Got: " + kv);<a name="line.2294"></a>
-<span class="sourceLineNo">2295</span>    assertTrue("LATEST_TIMESTAMP was not replaced with real timestamp",<a name="line.2295"></a>
-<span class="sourceLineNo">2296</span>        kv.getTimestamp() != HConstants.LATEST_TIMESTAMP);<a name="line.2296"></a>
-<span class="sourceLineNo">2297</span>  }<a name="line.2297"></a>
-<span class="sourceLineNo">2298</span><a name="line.2298"></a>
-<span class="sourceLineNo">2299</span>  /**<a name="line.2299"></a>
-<span class="sourceLineNo">2300</span>   * Tests that there is server-side filtering for invalid timestamp upper<a name="line.2300"></a>
-<span class="sourceLineNo">2301</span>   * bound. Note that the timestamp lower bound is automatically handled for us<a name="line.2301"></a>
-<span class="sourceLineNo">2302</span>   * by the TTL field.<a name="line.2302"></a>
-<span class="sourceLineNo">2303</span>   */<a name="line.2303"></a>
-<span class="sourceLineNo">2304</span>  @Test<a name="line.2304"></a>
-<span class="sourceLineNo">2305</span>  public void testPutWithTsSlop() throws IOException {<a name="line.2305"></a>
-<span class="sourceLineNo">2306</span>    byte[] fam = Bytes.toBytes("info");<a name="line.2306"></a>
-<span class="sourceLineNo">2307</span>    byte[][] families = { fam };<a name="line.2307"></a>
-<span class="sourceLineNo">2308</span><a name="line.2308"></a>
-<span class="sourceLineNo">2309</span>    // add data with a timestamp that is too recent for range. Ensure assert<a name="line.2309"></a>
-<span class="sourceLineNo">2310</span>    CONF.setInt("hbase.hregion.keyvalue.timestamp.slop.millisecs", 1000);<a name="line.2310"></a>
-<span class="sourceLineNo">2311</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2311"></a>
-<span class="sourceLineNo">2312</span>    boolean caughtExcep = false;<a name="line.2312"></a>
-<span class="sourceLineNo">2313</span>    try {<a name="line.2313"></a>
-<span class="sourceLineNo">2314</span>      // no TS specified == use latest. should not error<a name="line.2314"></a>
-<span class="sourceLineNo">2315</span>      region.put(new Put(row).addColumn(fam, Bytes.toBytes("qual"), Bytes.toBytes("value")));<a name="line.2315"></a>
-<span class="sourceLineNo">2316</span>      // TS out of range. should error<a name="line.2316"></a>
-<span class="sourceLineNo">2317</span>      region.put(new Put(row).addColumn(fam, Bytes.toBytes("qual"),<a name="line.2317"></a>
-<span class="sourceLineNo">2318</span>          System.currentTimeMillis() + 2000, Bytes.toBytes("value")));<a name="line.2318"></a>
-<span class="sourceLineNo">2319</span>      fail("Expected IOE for TS out of configured timerange");<a name="line.2319"></a>
-<span class="sourceLineNo">2320</span>    } catch (FailedSanityCheckException ioe) {<a name="line.2320"></a>
-<span class="sourceLineNo">2321</span>      LOG.debug("Received expected exception", ioe);<a name="line.2321"></a>
-<span class="sourceLineNo">2322</span>      caughtExcep = true;<a name="line.2322"></a>
-<span class="sourceLineNo">2323</span>    }<a name="line.2323"></a>
-<span class="sourceLineNo">2324</span>    assertTrue("Should catch FailedSanityCheckException", caughtExcep);<a name="line.2324"></a>
-<span class="sourceLineNo">2325</span>  }<a name="line.2325"></a>
-<span class="sourceLineNo">2326</span><a name="line.2326"></a>
-<span class="sourceLineNo">2327</span>  @Test<a name="line.2327"></a>
-<span class="sourceLineNo">2328</span>  public void testScanner_DeleteOneFamilyNotAnother() throws IOException {<a name="line.2328"></a>
-<span class="sourceLineNo">2329</span>    byte[] fam1 = Bytes.toBytes("columnA");<a name="line.2329"></a>
-<span class="sourceLineNo">2330</span>    byte[] fam2 = Bytes.toBytes("columnB");<a name="line.2330"></a>
-<span class="sourceLineNo">2331</span>    this.region = initHRegion(tableName, method, CONF, fam1, fam2);<a name="line.2331"></a>
-<span class="sourceLineNo">2332</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.2332"></a>
-<span class="sourceLineNo">2333</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.2333"></a>
-<span class="sourceLineNo">2334</span><a name="line.2334"></a>
-<span class="sourceLineNo">2335</span>    byte[] value = Bytes.toBytes("value");<a name="line.2335"></a>
-<span class="sourceLineNo">2336</span><a name="line.2336"></a>
-<span class="sourceLineNo">2337</span>    Delete delete = new Delete(rowA);<a name="line.2337"></a>
-<span class="sourceLineNo">2338</span>    delete.addFamily(fam1);<a name="line.2338"></a>
-<span class="sourceLineNo">2339</span><a name="line.2339"></a>
-<span class="sourceLineNo">2340</span>    region.delete(delete);<a name="line.2340"></a>
-<span class="sourceLineNo">2341</span><a name="line.2341"></a>
-<span class="sourceLineNo">2342</span>    // now create data.<a name="line.2342"></a>
-<span class="sourceLineNo">2343</span>    Put put = new Put(rowA);<a name="line.2343"></a>
-<span class="sourceLineNo">2344</span>    put.addColumn(fam2, null, value);<a name="line.2344"></a>
-<span class="sourceLineNo">2345</span>    region.put(put);<a name="line.2345"></a>
-<span class="sourceLineNo">2346</span><a name="line.2346"></a>
-<span class="sourceLineNo">2347</span>    put = new Put(rowB);<a name="line.2347"></a>
-<span class="sourceLineNo">2348</span>    put.addColumn(fam1, null, value);<a name="line.2348"></a>
-<span class="sourceLineNo">2349</span>    put.addColumn(fam2, null, value);<a name="line.2349"></a>
-<span class="sourceLineNo">2350</span>    region.put(put);<a name="line.2350"></a>
-<span class="sourceLineNo">2351</span><a name="line.2351"></a>
-<span class="sourceLineNo">2352</span>    Scan scan = new Scan();<a name="line.2352"></a>
-<span class="sourceLineNo">2353</span>    scan.addFamily(fam1).addFamily(fam2);<a name="line.2353"></a>
-<span class="sourceLineNo">2354</span>    InternalScanner s = region.getScanner(scan);<a name="line.2354"></a>
-<span class="sourceLineNo">2355</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.2355"></a>
-<span class="sourceLineNo">2356</span>    s.next(results);<a name="line.2356"></a>
-<span class="sourceLineNo">2357</span>    assertTrue(CellUtil.matchingRows(results.get(0), rowA));<a name="line.2357"></a>
-<span class="sourceLineNo">2358</span><a name="line.2358"></a>
-<span class="sourceLineNo">2359</span>    results.clear();<a name="line.2359"></a>
-<span class="sourceLineNo">2360</span>    s.next(results);<a name="line.2360"></a>
-<span class="sourceLineNo">2361</span>    assertTrue(CellUtil.matchingRows(results.get(0), rowB));<a name="line.2361"></a>
-<span class="sourceLineNo">2362</span>  }<a name="line.2362"></a>
-<span class="sourceLineNo">2363</span><a name="line.2363"></a>
-<span class="sourceLineNo">2364</span>  @Test<a name="line.2364"></a>
-<span class="sourceLineNo">2365</span>  public void testDataInMemoryWithoutWAL() throws IOException {<a name="line.2365"></a>
-<span class="sourceLineNo">2366</span>    FileSystem fs = FileSystem.get(CONF);<a name="line.2366"></a>
-<span class="sourceLineNo">2367</span>    Path rootDir = new Path(dir + "testDataInMemoryWithoutWAL");<a name="line.2367"></a>
-<span class="sourceLineNo">2368</span>    FSHLog hLog = new FSHLog(fs, rootDir, "testDataInMemoryWithoutWAL", CONF);<a name="line.2368"></a>
-<span class="sourceLineNo">2369</span>    hLog.init();<a name="line.2369"></a>
-<span class="sourceLineNo">2370</span>    // This chunk creation is done throughout the code base. Do we want to move it into core?<a name="line.2370"></a>
-<span class="sourceLineNo">2371</span>    // It is missing from this test. W/o it we NPE.<a name="line.2371"></a>
-<span class="sourceLineNo">2372</span>    ChunkCreator.initialize(MemStoreLABImpl.CHUNK_SIZE_DEFAULT, false, 0, 0, 0, null);<a name="line.2372"></a>
-<span class="sourceLineNo">2373</span>    region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, hLog,<a name="line.2373"></a>
-<span class="sourceLineNo">2374</span>        COLUMN_FAMILY_BYTES);<a name="line.2374"></a>
-<span class="sourceLineNo">2375</span><a name="line.2375"></a>
-<span class="sourceLineNo">2376</span>    Cell originalCell = CellUtil.createCell(row, COLUMN_FAMILY_BYTES, qual1,<a name="line.2376"></a>
-<span class="sourceLineNo">2377</span>      System.currentTimeMillis(), KeyValue.Type.Put.getCode(), value1);<a name="line.2377"></a>
-<span class="sourceLineNo">2378</span>    final long originalSize = originalCell.getSerializedSize();<a name="line.2378"></a>
-<span class="sourceLineNo">2379</span><a name="line.2379"></a>
-<span class="sourceLineNo">2380</span>    Cell addCell = CellUtil.createCell(row, COLUMN_FAMILY_BYTES, qual1,<a name="line.2380"></a>
-<span class="sourceLineNo">2381</span>      System.currentTimeMillis(), KeyValue.Type.Put.getCode(), Bytes.toBytes("xxxxxxxxxx"));<a name="line.2381"></a>
-<span class="sourceLineNo">2382</span>    final long addSize = addCell.getSerializedSize();<a name="line.2382"></a>
-<span class="sourceLineNo">2383</span><a name="line.2383"></a>
-<span class="sourceLineNo">2384</span>    LOG.info("originalSize:" + originalSize<a name="line.2384"></a>
-<span class="sourceLineNo">2385</span>      + ", addSize:" + addSize);<a name="line.2385"></a>
-<span class="sourceLineNo">2386</span>    // start test. We expect that the addPut's durability will be replaced<a name="line.2386"></a>
-<span class="sourceLineNo">2387</span>    // by originalPut's durability.<a name="line.2387"></a>
-<span class="sourceLineNo">2388</span><a name="line.2388"></a>
-<span class="sourceLineNo">2389</span>    // case 1:<a name="line.2389"></a>
-<span class="sourceLineNo">2390</span>    testDataInMemoryWithoutWAL(region,<a name="line.2390"></a>
-<span class="sourceLineNo">2391</span>            new Put(row).add(originalCell).setDurability(Durability.SKIP_WAL),<a name="line.2391"></a>
-<span class="sourceLineNo">2392</span>            new Put(row).add(addCell).setDurability(Durability.SKIP_WAL),<a name="line.2392"></a>
-<span class="sourceLineNo">2393</span>            originalSize + addSize);<a name="line.2393"></a>
-<span class="sourceLineNo">2394</span><a name="line.2394"></a>
-<span class="sourceLineNo">2395</span>    // case 2:<a name="line.2395"></a>
-<span class="sourceLineNo">2396</span>    testDataInMemoryWithoutWAL(region,<a name="line.2396"></a>
-<span class="sourceLineNo">2397</span>            new Put(row).add(originalCell).setDurability(Durability.SKIP_WAL),<a name="line.2397"></a>
-<span class="sourceLineNo">2398</span>            new Put(row).add(addCell).setDurability(Durability.SYNC_WAL),<a name="line.2398"></a>
-<span class="sourceLineNo">2399</span>            originalSize + addSize);<a name="line.2399"></a>
-<span class="sourceLineNo">2400</span><a name="line.2400"></a>
-<span class="sourceLineNo">2401</span>    // case 3:<a name="line.2401"></a>
-<span class="sourceLineNo">2402</span>    testDataInMemoryWithoutWAL(region,<a name="line.2402"></a>
-<span class="sourceLineNo">2403</span>            new Put(row).add(originalCell).setDurability(Durability.SYNC_WAL),<a name="line.2403"></a>
-<span class="sourceLineNo">2404</span>            new Put(row).add(addCell).setDurability(Durability.SKIP_WAL),<a name="line.2404"></a>
-<span class="sourceLineNo">2405</span>            0);<a name="line.2405"></a>
-<span class="sourceLineNo">2406</span><a name="line.2406"></a>
-<span class="sourceLineNo">2407</span>    // case 4:<a name="line.2407"></a>
-<span class="sourceLineNo">2408</span>    testDataInMemoryWithoutWAL(region,<a name="line.2408"></a>
-<span class="sourceLineNo">2409</span>            new Put(row).add(originalCell).setDurability(Durability.SYNC_WAL),<a name="line.2409"></a>
-<span class="sourceLineNo">2410</span>            new Put(row).add(addCell).setDurability(Durability.SYNC_WAL),<a name="line.2410"></a>
-<span class="sourceLineNo">2411</span>            0);<a name="line.2411"></a>
-<span class="sourceLineNo">2412</span>  }<a name="line.2412"></a>
-<span class="sourceLineNo">2413</span><a name="line.2413"></a>
-<span class="sourceLineNo">2414</span>  private static void testDataInMemoryWithoutWAL(HRegion region, Put originalPut,<a name="line.2414"></a>
-<span class="sourceLineNo">2415</span>          final Put addPut, long delta) throws IOException {<a name="line.2415"></a>
-<span class="sourceLineNo">2416</span>    final long initSize = region.getDataInMemoryWithoutWAL();<a name="line.2416"></a>
-<span class="sourceLineNo">2417</span>    // save normalCPHost and replaced by mockedCPHost<a name="line.2417"></a>
-<span class="sourceLineNo">2418</span>    RegionCoprocessorHost normalCPHost = region.getCoprocessorHost();<a name="line.2418"></a>
-<span class="sourceLineNo">2419</span>    RegionCoprocessorHost mockedCPHost = Mockito.mock(RegionCoprocessorHost.class);<a name="line.2419"></a>
-<span class="sourceLineNo">2420</span>    // Because the preBatchMutate returns void, we can't do usual Mockito when...then form. Must<a name="line.2420"></a>
-<span class="sourceLineNo">2421</span>    // do below format (from Mockito doc).<a name="line.2421"></a>
-<span class="sourceLineNo">2422</span>    Mockito.doAnswer(new Answer&lt;Void&gt;() {<a name="line.2422"></a>
-<span class="sourceLineNo">2423</span>      @Override<a name="line.2423"></a>
-<span class="sourceLineNo">2424</span>      public Void answer(InvocationOnMock invocation) throws Throwable {<a name="line.2424"></a>
-<span class="sourceLineNo">2425</span>        MiniBatchOperationInProgress&lt;Mutation&gt; mb = invocation.getArgument(0);<a name="line.2425"></a>
-<span class="sourceLineNo">2426</span>        mb.addOperationsFromCP(0, new Mutation[]{addPut});<a name="line.2426"></a>
-<span class="sourceLineNo">2427</span>        return null;<a name="line.2427"></a>
-<span class="sourceLineNo">2428</span>      }<a name="line.2428"></a>
-<span class="sourceLineNo">2429</span>    }).when(mockedCPHost).preBatchMutate(Mockito.isA(MiniBatchOperationInProgress.class));<a name="line.2429"></a>
-<span class="sourceLineNo">2430</span>    region.setCoprocessorHost(mockedCPHost);<a name="line.2430"></a>
-<span class="sourceLineNo">2431</span>    region.put(originalPut);<a name="line.2431"></a>
-<span class="sourceLineNo">2432</span>    region.setCoprocessorHost(normalCPHost);<a name="line.2432"></a>
-<span class="sourceLineNo">2433</span>    final long finalSize = region.getDataInMemoryWithoutWAL();<a name="line.2433"></a>
-<span class="sourceLineNo">2434</span>    assertEquals("finalSize:" + finalSize + ", initSize:"<a name="line.2434"></a>
-<span class="sourceLineNo">2435</span>      + initSize + ", delta:" + delta,finalSize, initSize + delta);<a name="line.2435"></a>
-<span class="sourceLineNo">2436</span>  }<a name="line.2436"></a>
-<span class="sourceLineNo">2437</span><a name="line.2437"></a>
-<span class="sourceLineNo">2438</span>  @Test<a name="line.2438"></a>
-<span class="sourceLineNo">2439</span>  public void testDeleteColumns_PostInsert() throws IOException, InterruptedException {<a name="line.2439"></a>
-<span class="sourceLineNo">2440</span>    Delete delete = new Delete(row);<a name="line.2440"></a>
-<span class="sourceLineNo">2441</span>    delete.addColumns(fam1, qual1);<a name="line.2441"></a>
-<span class="sourceLineNo">2442</span>    doTestDelete_AndPostInsert(delete);<a name="line.2442"></a>
-<span class="sourceLineNo">2443</span>  }<a name="line.2443"></a>
-<span class="sourceLineNo">2444</span><a name="line.2444"></a>
-<span class="sourceLineNo">2445</span>  @Test<a name="line.2445"></a>
-<span class="sourceLineNo">2446</span>  public void testaddFamily_PostInsert() throws IOException, InterruptedException {<a name="line.2446"></a>
-<span class="sourceLineNo">2447</span>    Delete delete = new Delete(row);<a name="line.2447"></a>
-<span class="sourceLineNo">2448</span>    delete.addFamily(fam1);<a name="line.2448"></a>
-<span class="sourceLineNo">2449</span>    doTestDelete_AndPostInsert(delete);<a name="line.2449"></a>
-<span class="sourceLineNo">2450</span>  }<a name="line.2450"></a>
-<span class="sourceLineNo">2451</span><a name="line.2451"></a>
-<span class="sourceLineNo">2452</span>  public void doTestDelete_AndPostInsert(Delete delete) throws IOException, InterruptedException {<a name="line.2452"></a>
-<span class="sourceLineNo">2453</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2453"></a>
-<span class="sourceLineNo">2454</span>    EnvironmentEdgeManagerTestHelper.injectEdge(new IncrementingEnvironmentEdge());<a name="line.2454"></a>
-<span class="sourceLineNo">2455</span>    Put put = new Put(row);<a name="line.2455"></a>
-<span class="sourceLineNo">2456</span>    put.addColumn(fam1, qual1, value1);<a name="line.2456"></a>
-<span class="sourceLineNo">2457</span>    region.put(put);<a name="line.2457"></a>
-<span class="sourceLineNo">2458</span><a name="line.2458"></a>
-<span class="sourceLineNo">2459</span>    // now delete the value:<a name="line.2459"></a>
-<span class="sourceLineNo">2460</span>    region.delete(delete);<a name="line.2460"></a>
+<span class="sourceLineNo">2120</span>    delete.addColumn(fam1, qual);<a name="line.2120"></a>
+<span class="sourceLineNo">2121</span>    region.delete(delete);<a name="line.2121"></a>
+<span class="sourceLineNo">2122</span><a name="line.2122"></a>
+<span class="sourceLineNo">2123</span>    Get get = new Get(row1);<a name="line.2123"></a>
+<span class="sourceLineNo">2124</span>    get.addFamily(fam1);<a name="line.2124"></a>
+<span class="sourceLineNo">2125</span>    Result r = region.get(get);<a name="line.2125"></a>
+<span class="sourceLineNo">2126</span>    assertEquals(0, r.size());<a name="line.2126"></a>
+<span class="sourceLineNo">2127</span>  }<a name="line.2127"></a>
+<span class="sourceLineNo">2128</span><a name="line.2128"></a>
+<span class="sourceLineNo">2129</span>  @Test<a name="line.2129"></a>
+<span class="sourceLineNo">2130</span>  public void testDelete_CheckFamily() throws IOException {<a name="line.2130"></a>
+<span class="sourceLineNo">2131</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2131"></a>
+<span class="sourceLineNo">2132</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2132"></a>
+<span class="sourceLineNo">2133</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2133"></a>
+<span class="sourceLineNo">2134</span>    byte[] fam3 = Bytes.toBytes("fam3");<a name="line.2134"></a>
+<span class="sourceLineNo">2135</span>    byte[] fam4 = Bytes.toBytes("fam4");<a name="line.2135"></a>
+<span class="sourceLineNo">2136</span><a name="line.2136"></a>
+<span class="sourceLineNo">2137</span>    // Setting up region<a name="line.2137"></a>
+<span class="sourceLineNo">2138</span>    this.region = initHRegion(tableName, method, CONF, fam1, fam2, fam3);<a name="line.2138"></a>
+<span class="sourceLineNo">2139</span>    List&lt;Cell&gt; kvs = new ArrayList&lt;&gt;();<a name="line.2139"></a>
+<span class="sourceLineNo">2140</span>    kvs.add(new KeyValue(row1, fam4, null, null));<a name="line.2140"></a>
+<span class="sourceLineNo">2141</span><a name="line.2141"></a>
+<span class="sourceLineNo">2142</span>    // testing existing family<a name="line.2142"></a>
+<span class="sourceLineNo">2143</span>    byte[] family = fam2;<a name="line.2143"></a>
+<span class="sourceLineNo">2144</span>    NavigableMap&lt;byte[], List&lt;Cell&gt;&gt; deleteMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2144"></a>
+<span class="sourceLineNo">2145</span>    deleteMap.put(family, kvs);<a name="line.2145"></a>
+<span class="sourceLineNo">2146</span>    region.delete(deleteMap, Durability.SYNC_WAL);<a name="line.2146"></a>
+<span class="sourceLineNo">2147</span><a name="line.2147"></a>
+<span class="sourceLineNo">2148</span>    // testing non existing family<a name="line.2148"></a>
+<span class="sourceLineNo">2149</span>    boolean ok = false;<a name="line.2149"></a>
+<span class="sourceLineNo">2150</span>    family = fam4;<a name="line.2150"></a>
+<span class="sourceLineNo">2151</span>    try {<a name="line.2151"></a>
+<span class="sourceLineNo">2152</span>      deleteMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2152"></a>
+<span class="sourceLineNo">2153</span>      deleteMap.put(family, kvs);<a name="line.2153"></a>
+<span class="sourceLineNo">2154</span>      region.delete(deleteMap, Durability.SYNC_WAL);<a name="line.2154"></a>
+<span class="sourceLineNo">2155</span>    } catch (Exception e) {<a name="line.2155"></a>
+<span class="sourceLineNo">2156</span>      ok = true;<a name="line.2156"></a>
+<span class="sourceLineNo">2157</span>    }<a name="line.2157"></a>
+<span class="sourceLineNo">2158</span>    assertTrue("Family " + new String(family, StandardCharsets.UTF_8) + " does exist", ok);<a name="line.2158"></a>
+<span class="sourceLineNo">2159</span>  }<a name="line.2159"></a>
+<span class="sourceLineNo">2160</span><a name="line.2160"></a>
+<span class="sourceLineNo">2161</span>  @Test<a name="line.2161"></a>
+<span class="sourceLineNo">2162</span>  public void testDelete_mixed() throws IOException, InterruptedException {<a name="line.2162"></a>
+<span class="sourceLineNo">2163</span>    byte[] fam = Bytes.toBytes("info");<a name="line.2163"></a>
+<span class="sourceLineNo">2164</span>    byte[][] families = { fam };<a name="line.2164"></a>
+<span class="sourceLineNo">2165</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2165"></a>
+<span class="sourceLineNo">2166</span>    EnvironmentEdgeManagerTestHelper.injectEdge(new IncrementingEnvironmentEdge());<a name="line.2166"></a>
+<span class="sourceLineNo">2167</span><a name="line.2167"></a>
+<span class="sourceLineNo">2168</span>    byte[] row = Bytes.toBytes("table_name");<a name="line.2168"></a>
+<span class="sourceLineNo">2169</span>    // column names<a name="line.2169"></a>
+<span class="sourceLineNo">2170</span>    byte[] serverinfo = Bytes.toBytes("serverinfo");<a name="line.2170"></a>
+<span class="sourceLineNo">2171</span>    byte[] splitA = Bytes.toBytes("splitA");<a name="line.2171"></a>
+<span class="sourceLineNo">2172</span>    byte[] splitB = Bytes.toBytes("splitB");<a name="line.2172"></a>
+<span class="sourceLineNo">2173</span><a name="line.2173"></a>
+<span class="sourceLineNo">2174</span>    // add some data:<a name="line.2174"></a>
+<span class="sourceLineNo">2175</span>    Put put = new Put(row);<a name="line.2175"></a>
+<span class="sourceLineNo">2176</span>    put.addColumn(fam, splitA, Bytes.toBytes("reference_A"));<a name="line.2176"></a>
+<span class="sourceLineNo">2177</span>    region.put(put);<a name="line.2177"></a>
+<span class="sourceLineNo">2178</span><a name="line.2178"></a>
+<span class="sourceLineNo">2179</span>    put = new Put(row);<a name="line.2179"></a>
+<span class="sourceLineNo">2180</span>    put.addColumn(fam, splitB, Bytes.toBytes("reference_B"));<a name="line.2180"></a>
+<span class="sourceLineNo">2181</span>    region.put(put);<a name="line.2181"></a>
+<span class="sourceLineNo">2182</span><a name="line.2182"></a>
+<span class="sourceLineNo">2183</span>    put = new Put(row);<a name="line.2183"></a>
+<span class="sourceLineNo">2184</span>    put.addColumn(fam, serverinfo, Bytes.toBytes("ip_address"));<a name="line.2184"></a>
+<span class="sourceLineNo">2185</span>    region.put(put);<a name="line.2185"></a>
+<span class="sourceLineNo">2186</span><a name="line.2186"></a>
+<span class="sourceLineNo">2187</span>    // ok now delete a split:<a name="line.2187"></a>
+<span class="sourceLineNo">2188</span>    Delete delete = new Delete(row);<a name="line.2188"></a>
+<span class="sourceLineNo">2189</span>    delete.addColumns(fam, splitA);<a name="line.2189"></a>
+<span class="sourceLineNo">2190</span>    region.delete(delete);<a name="line.2190"></a>
+<span class="sourceLineNo">2191</span><a name="line.2191"></a>
+<span class="sourceLineNo">2192</span>    // assert some things:<a name="line.2192"></a>
+<span class="sourceLineNo">2193</span>    Get get = new Get(row).addColumn(fam, serverinfo);<a name="line.2193"></a>
+<span class="sourceLineNo">2194</span>    Result result = region.get(get);<a name="line.2194"></a>
+<span class="sourceLineNo">2195</span>    assertEquals(1, result.size());<a name="line.2195"></a>
+<span class="sourceLineNo">2196</span><a name="line.2196"></a>
+<span class="sourceLineNo">2197</span>    get = new Get(row).addColumn(fam, splitA);<a name="line.2197"></a>
+<span class="sourceLineNo">2198</span>    result = region.get(get);<a name="line.2198"></a>
+<span class="sourceLineNo">2199</span>    assertEquals(0, result.size());<a name="line.2199"></a>
+<span class="sourceLineNo">2200</span><a name="line.2200"></a>
+<span class="sourceLineNo">2201</span>    get = new Get(row).addColumn(fam, splitB);<a name="line.2201"></a>
+<span class="sourceLineNo">2202</span>    result = region.get(get);<a name="line.2202"></a>
+<span class="sourceLineNo">2203</span>    assertEquals(1, result.size());<a name="line.2203"></a>
+<span class="sourceLineNo">2204</span><a name="line.2204"></a>
+<span class="sourceLineNo">2205</span>    // Assert that after a delete, I can put.<a name="line.2205"></a>
+<span class="sourceLineNo">2206</span>    put = new Put(row);<a name="line.2206"></a>
+<span class="sourceLineNo">2207</span>    put.addColumn(fam, splitA, Bytes.toBytes("reference_A"));<a name="line.2207"></a>
+<span class="sourceLineNo">2208</span>    region.put(put);<a name="line.2208"></a>
+<span class="sourceLineNo">2209</span>    get = new Get(row);<a name="line.2209"></a>
+<span class="sourceLineNo">2210</span>    result = region.get(get);<a name="line.2210"></a>
+<span class="sourceLineNo">2211</span>    assertEquals(3, result.size());<a name="line.2211"></a>
+<span class="sourceLineNo">2212</span><a name="line.2212"></a>
+<span class="sourceLineNo">2213</span>    // Now delete all... then test I can add stuff back<a name="line.2213"></a>
+<span class="sourceLineNo">2214</span>    delete = new Delete(row);<a name="line.2214"></a>
+<span class="sourceLineNo">2215</span>    region.delete(delete);<a name="line.2215"></a>
+<span class="sourceLineNo">2216</span>    assertEquals(0, region.get(get).size());<a name="line.2216"></a>
+<span class="sourceLineNo">2217</span><a name="line.2217"></a>
+<span class="sourceLineNo">2218</span>    region.put(new Put(row).addColumn(fam, splitA, Bytes.toBytes("reference_A")));<a name="line.2218"></a>
+<span class="sourceLineNo">2219</span>    result = region.get(get);<a name="line.2219"></a>
+<span class="sourceLineNo">2220</span>    assertEquals(1, result.size());<a name="line.2220"></a>
+<span class="sourceLineNo">2221</span>  }<a name="line.2221"></a>
+<span class="sourceLineNo">2222</span><a name="line.2222"></a>
+<span class="sourceLineNo">2223</span>  @Test<a name="line.2223"></a>
+<span class="sourceLineNo">2224</span>  public void testDeleteRowWithFutureTs() throws IOException {<a name="line.2224"></a>
+<span class="sourceLineNo">2225</span>    byte[] fam = Bytes.toBytes("info");<a name="line.2225"></a>
+<span class="sourceLineNo">2226</span>    byte[][] families = { fam };<a name="line.2226"></a>
+<span class="sourceLineNo">2227</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2227"></a>
+<span class="sourceLineNo">2228</span>    byte[] row = Bytes.toBytes("table_name");<a name="line.2228"></a>
+<span class="sourceLineNo">2229</span>    // column names<a name="line.2229"></a>
+<span class="sourceLineNo">2230</span>    byte[] serverinfo = Bytes.toBytes("serverinfo");<a name="line.2230"></a>
+<span class="sourceLineNo">2231</span><a name="line.2231"></a>
+<span class="sourceLineNo">2232</span>    // add data in the far future<a name="line.2232"></a>
+<span class="sourceLineNo">2233</span>    Put put = new Put(row);<a name="line.2233"></a>
+<span class="sourceLineNo">2234</span>    put.addColumn(fam, serverinfo, HConstants.LATEST_TIMESTAMP - 5, Bytes.toBytes("value"));<a name="line.2234"></a>
+<span class="sourceLineNo">2235</span>    region.put(put);<a name="line.2235"></a>
+<span class="sourceLineNo">2236</span><a name="line.2236"></a>
+<span class="sourceLineNo">2237</span>    // now delete something in the present<a name="line.2237"></a>
+<span class="sourceLineNo">2238</span>    Delete delete = new Delete(row);<a name="line.2238"></a>
+<span class="sourceLineNo">2239</span>    region.delete(delete);<a name="line.2239"></a>
+<span class="sourceLineNo">2240</span><a name="line.2240"></a>
+<span class="sourceLineNo">2241</span>    // make sure we still see our data<a name="line.2241"></a>
+<span class="sourceLineNo">2242</span>    Get get = new Get(row).addColumn(fam, serverinfo);<a name="line.2242"></a>
+<span class="sourceLineNo">2243</span>    Result result = region.get(get);<a name="line.2243"></a>
+<span class="sourceLineNo">2244</span>    assertEquals(1, result.size());<a name="line.2244"></a>
+<span class="sourceLineNo">2245</span><a name="line.2245"></a>
+<span class="sourceLineNo">2246</span>    // delete the future row<a name="line.2246"></a>
+<span class="sourceLineNo">2247</span>    delete = new Delete(row, HConstants.LATEST_TIMESTAMP - 3);<a name="line.2247"></a>
+<span class="sourceLineNo">2248</span>    region.delete(delete);<a name="line.2248"></a>
+<span class="sourceLineNo">2249</span><a name="line.2249"></a>
+<span class="sourceLineNo">2250</span>    // make sure it is gone<a name="line.2250"></a>
+<span class="sourceLineNo">2251</span>    get = new Get(row).addColumn(fam, serverinfo);<a name="line.2251"></a>
+<span class="sourceLineNo">2252</span>    result = region.get(get);<a name="line.2252"></a>
+<span class="sourceLineNo">2253</span>    assertEquals(0, result.size());<a name="line.2253"></a>
+<span class="sourceLineNo">2254</span>  }<a name="line.2254"></a>
+<span class="sourceLineNo">2255</span><a name="line.2255"></a>
+<span class="sourceLineNo">2256</span>  /**<a name="line.2256"></a>
+<span class="sourceLineNo">2257</span>   * Tests that the special LATEST_TIMESTAMP option for puts gets replaced by<a name="line.2257"></a>
+<span class="sourceLineNo">2258</span>   * the actual timestamp<a name="line.2258"></a>
+<span class="sourceLineNo">2259</span>   */<a name="line.2259"></a>
+<span class="sourceLineNo">2260</span>  @Test<a name="line.2260"></a>
+<span class="sourceLineNo">2261</span>  public void testPutWithLatestTS() throws IOException {<a name="line.2261"></a>
+<span class="sourceLineNo">2262</span>    byte[] fam = Bytes.toBytes("info");<a name="line.2262"></a>
+<span class="sourceLineNo">2263</span>    byte[][] families = { fam };<a name="line.2263"></a>
+<span class="sourceLineNo">2264</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2264"></a>
+<span class="sourceLineNo">2265</span>    byte[] row = Bytes.toBytes("row1");<a name="line.2265"></a>
+<span class="sourceLineNo">2266</span>    // column names<a name="line.2266"></a>
+<span class="sourceLineNo">2267</span>    byte[] qual = Bytes.toBytes("qual");<a name="line.2267"></a>
+<span class="sourceLineNo">2268</span><a name="line.2268"></a>
+<span class="sourceLineNo">2269</span>    // add data with LATEST_TIMESTAMP, put without WAL<a name="line.2269"></a>
+<span class="sourceLineNo">2270</span>    Put put = new Put(row);<a name="line.2270"></a>
+<span class="sourceLineNo">2271</span>    put.addColumn(fam, qual, HConstants.LATEST_TIMESTAMP, Bytes.toBytes("value"));<a name="line.2271"></a>
+<span class="sourceLineNo">2272</span>    region.put(put);<a name="line.2272"></a>
+<span class="sourceLineNo">2273</span><a name="line.2273"></a>
+<span class="sourceLineNo">2274</span>    // Make sure it shows up with an actual timestamp<a name="line.2274"></a>
+<span class="sourceLineNo">2275</span>    Get get = new Get(row).addColumn(fam, qual);<a name="line.2275"></a>
+<span class="sourceLineNo">2276</span>    Result result = region.get(get);<a name="line.2276"></a>
+<span class="sourceLineNo">2277</span>    assertEquals(1, result.size());<a name="line.2277"></a>
+<span class="sourceLineNo">2278</span>    Cell kv = result.rawCells()[0];<a name="line.2278"></a>
+<span class="sourceLineNo">2279</span>    LOG.info("Got: " + kv);<a name="line.2279"></a>
+<span class="sourceLineNo">2280</span>    assertTrue("LATEST_TIMESTAMP was not replaced with real timestamp",<a name="line.2280"></a>
+<span class="sourceLineNo">2281</span>        kv.getTimestamp() != HConstants.LATEST_TIMESTAMP);<a name="line.2281"></a>
+<span class="sourceLineNo">2282</span><a name="line.2282"></a>
+<span class="sourceLineNo">2283</span>    // Check same with WAL enabled (historically these took different<a name="line.2283"></a>
+<span class="sourceLineNo">2284</span>    // code paths, so check both)<a name="line.2284"></a>
+<span class="sourceLineNo">2285</span>    row = Bytes.toBytes("row2");<a name="line.2285"></a>
+<span class="sourceLineNo">2286</span>    put = new Put(row);<a name="line.2286"></a>
+<span class="sourceLineNo">2287</span>    put.addColumn(fam, qual, HConstants.LATEST_TIMESTAMP, Bytes.toBytes("value"));<a name="line.2287"></a>
+<span class="sourceLineNo">2288</span>    region.put(put);<a name="line.2288"></a>
+<span class="sourceLineNo">2289</span><a name="line.2289"></a>
+<span class="sourceLineNo">2290</span>    // Make sure it shows up with an actual timestamp<a name="line.2290"></a>
+<span class="sourceLineNo">2291</span>    get = new Get(row).addColumn(fam, qual);<a name="line.2291"></a>
+<span class="sourceLineNo">2292</span>    result = region.get(get);<a name="line.2292"></a>
+<span class="sourceLineNo">2293</span>    assertEquals(1, result.size());<a name="line.2293"></a>
+<span class="sourceLineNo">2294</span>    kv = result.rawCells()[0];<a name="line.2294"></a>
+<span class="sourceLineNo">2295</span>    LOG.info("Got: " + kv);<a name="line.2295"></a>
+<span class="sourceLineNo">2296</span>    assertTrue("LATEST_TIMESTAMP was not replaced with real timestamp",<a name="line.2296"></a>
+<span class="sourceLineNo">2297</span>        kv.getTimestamp() != HConstants.LATEST_TIMESTAMP);<a name="line.2297"></a>
+<span class="sourceLineNo">2298</span>  }<a name="line.2298"></a>
+<span class="sourceLineNo">2299</span><a name="line.2299"></a>
+<span class="sourceLineNo">2300</span>  /**<a name="line.2300"></a>
+<span class="sourceLineNo">2301</span>   * Tests that there is server-side filtering for invalid timestamp upper<a name="line.2301"></a>
+<span class="sourceLineNo">2302</span>   * bound. Note that the timestamp lower bound is automatically handled for us<a name="line.2302"></a>
+<span class="sourceLineNo">2303</span>   * by the TTL field.<a name="line.2303"></a>
+<span class="sourceLineNo">2304</span>   */<a name="line.2304"></a>
+<span class="sourceLineNo">2305</span>  @Test<a name="line.2305"></a>
+<span class="sourceLineNo">2306</span>  public void testPutWithTsSlop() throws IOException {<a name="line.2306"></a>
+<span class="sourceLineNo">2307</span>    byte[] fam = Bytes.toBytes("info");<a name="line.2307"></a>
+<span class="sourceLineNo">2308</span>    byte[][] families = { fam };<a name="line.2308"></a>
+<span class="sourceLineNo">2309</span><a name="line.2309"></a>
+<span class="sourceLineNo">2310</span>    // add data with a timestamp that is too recent for range. Ensure assert<a name="line.2310"></a>
+<span class="sourceLineNo">2311</span>    CONF.setInt("hbase.hregion.keyvalue.timestamp.slop.millisecs", 1000);<a name="line.2311"></a>
+<span class="sourceLineNo">2312</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2312"></a>
+<span class="sourceLineNo">2313</span>    boolean caughtExcep = false;<a name="line.2313"></a>
+<span class="sourceLineNo">2314</span>    try {<a name="line.2314"></a>
+<span class="sourceLineNo">2315</span>      // no TS specified == use latest. should not error<a name="line.2315"></a>
+<span class="sourceLineNo">2316</span>      region.put(new Put(row).addColumn(fam, Bytes.toBytes("qual"), Bytes.toBytes("value")));<a name="line.2316"></a>
+<span class="sourceLineNo">2317</span>      // TS out of range. should error<a name="line.2317"></a>
+<span class="sourceLineNo">2318</span>      region.put(new Put(row).addColumn(fam, Bytes.toBytes("qual"),<a name="line.2318"></a>
+<span class="sourceLineNo">2319</span>          System.currentTimeMillis() + 2000, Bytes.toBytes("value")));<a name="line.2319"></a>
+<span class="sourceLineNo">2320</span>      fail("Expected IOE for TS out of configured timerange");<a name="line.2320"></a>
+<span class="sourceLineNo">2321</span>    } catch (FailedSanityCheckException ioe) {<a name="line.2321"></a>
+<span class="sourceLineNo">2322</span>      LOG.debug("Received expected exception", ioe);<a name="line.2322"></a>
+<span class="sourceLineNo">2323</span>      caughtExcep = true;<a name="line.2323"></a>
+<span class="sourceLineNo">2324</span>    }<a name="line.2324"></a>
+<span class="sourceLineNo">2325</span>    assertTrue("Should catch FailedSanityCheckException", caughtExcep);<a name="line.2325"></a>
+<span class="sourceLineNo">2326</span>  }<a name="line.2326"></a>
+<span class="sourceLineNo">2327</span><a name="line.2327"></a>
+<span class="sourceLineNo">2328</span>  @Test<a name="line.2328"></a>
+<span class="sourceLineNo">2329</span>  public void testScanner_DeleteOneFamilyNotAnother() throws IOException {<a name="line.2329"></a>
+<span class="sourceLineNo">2330</span>    byte[] fam1 = Bytes.toBytes("columnA");<a name="line.2330"></a>
+<span class="sourceLineNo">2331</span>    byte[] fam2 = Bytes.toBytes("columnB");<a name="line.2331"></a>
+<span class="sourceLineNo">2332</span>    this.region = initHRegion(tableName, method, CONF, fam1, fam2);<a name="line.2332"></a>
+<span class="sourceLineNo">2333</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.2333"></a>
+<span class="sourceLineNo">2334</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.2334"></a>
+<span class="sourceLineNo">2335</span><a name="line.2335"></a>
+<span class="sourceLineNo">2336</span>    byte[] value = Bytes.toBytes("value");<a name="line.2336"></a>
+<span class="sourceLineNo">2337</span><a name="line.2337"></a>
+<span class="sourceLineNo">2338</span>    Delete delete = new Delete(rowA);<a name="line.2338"></a>
+<span class="sourceLineNo">2339</span>    delete.addFamily(fam1);<a name="line.2339"></a>
+<span class="sourceLineNo">2340</span><a name="line.2340"></a>
+<span class="sourceLineNo">2341</span>    region.delete(delete);<a name="line.2341"></a>
+<span class="sourceLineNo">2342</span><a name="line.2342"></a>
+<span class="sourceLineNo">2343</span>    // now create data.<a name="line.2343"></a>
+<span class="sourceLineNo">2344</span>    Put put = new Put(rowA);<a name="line.2344"></a>
+<span class="sourceLineNo">2345</span>    put.addColumn(fam2, null, value);<a name="line.2345"></a>
+<span class="sourceLineNo">2346</span>    region.put(put);<a name="line.2346"></a>
+<span class="sourceLineNo">2347</span><a name="line.2347"></a>
+<span class="sourceLineNo">2348</span>    put = new Put(rowB);<a name="line.2348"></a>
+<span class="sourceLineNo">2349</span>    put.addColumn(fam1, null, value);<a name="line.2349"></a>
+<span class="sourceLineNo">2350</span>    put.addColumn(fam2, null, value);<a name="line.2350"></a>
+<span class="sourceLineNo">2351</span>    region.put(put);<a name="line.2351"></a>
+<span class="sourceLineNo">2352</span><a name="line.2352"></a>
+<span class="sourceLineNo">2353</span>    Scan scan = new Scan();<a name="line.2353"></a>
+<span class="sourceLineNo">2354</span>    scan.addFamily(fam1).addFamily(fam2);<a name="line.2354"></a>
+<span class="sourceLineNo">2355</span>    InternalScanner s = region.getScanner(scan);<a name="line.2355"></a>
+<span class="sourceLineNo">2356</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.2356"></a>
+<span class="sourceLineNo">2357</span>    s.next(results);<a name="line.2357"></a>
+<span class="sourceLineNo">2358</span>    assertTrue(CellUtil.matchingRows(results.get(0), rowA));<a name="line.2358"></a>
+<span class="sourceLineNo">2359</span><a name="line.2359"></a>
+<span class="sourceLineNo">2360</span>    results.clear();<a name="line.2360"></a>
+<span class="sourceLineNo">2361</span>    s.next(results);<a name="line.2361"></a>
+<span class="sourceLineNo">2362</span>    assertTrue(CellUtil.matchingRows(results.get(0), rowB));<a name="line.2362"></a>
+<span class="sourceLineNo">2363</span>  }<a name="line.2363"></a>
+<span class="sourceLineNo">2364</span><a name="line.2364"></a>
+<span class="sourceLineNo">2365</span>  @Test<a name="line.2365"></a>
+<span class="sourceLineNo">2366</span>  public void testDataInMemoryWithoutWAL() throws IOException {<a name="line.2366"></a>
+<span class="sourceLineNo">2367</span>    FileSystem fs = FileSystem.get(CONF);<a name="line.2367"></a>
+<span class="sourceLineNo">2368</span>    Path rootDir = new Path(dir + "testDataInMemoryWithoutWAL");<a name="line.2368"></a>
+<span class="sourceLineNo">2369</span>    FSHLog hLog = new FSHLog(fs, rootDir, "testDataInMemoryWithoutWAL", CONF);<a name="line.2369"></a>
+<span class="sourceLineNo">2370</span>    hLog.init();<a name="line.2370"></a>
+<span class="sourceLineNo">2371</span>    // This chunk creation is done throughout the code base. Do we want to move it into core?<a name="line.2371"></a>
+<span class="sourceLineNo">2372</span>    // It is missing from this test. W/o it we NPE.<a name="line.2372"></a>
+<span class="sourceLineNo">2373</span>    ChunkCreator.initialize(MemStoreLABImpl.CHUNK_SIZE_DEFAULT, false, 0, 0, 0, null);<a name="line.2373"></a>
+<span class="sourceLineNo">2374</span>    region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, hLog,<a name="line.2374"></a>
+<span class="sourceLineNo">2375</span>        COLUMN_FAMILY_BYTES);<a name="line.2375"></a>
+<span class="sourceLineNo">2376</span><a name="line.2376"></a>
+<span class="sourceLineNo">2377</span>    Cell originalCell = CellUtil.createCell(row, COLUMN_FAMILY_BYTES, qual1,<a name="line.2377"></a>
+<span class="sourceLineNo">2378</span>      System.currentTimeMillis(), KeyValue.Type.Put.getCode(), value1);<a name="line.2378"></a>
+<span class="sourceLineNo">2379</span>    final long originalSize = originalCell.getSerializedSize();<a name="line.2379"></a>
+<span class="sourceLineNo">2380</span><a name="line.2380"></a>
+<span class="sourceLineNo">2381</span>    Cell addCell = CellUtil.createCell(row, COLUMN_FAMILY_BYTES, qual1,<a name="line.2381"></a>
+<span class="sourceLineNo">2382</span>      System.currentTimeMillis(), KeyValue.Type.Put.getCode(), Bytes.toBytes("xxxxxxxxxx"));<a name="line.2382"></a>
+<span class="sourceLineNo">2383</span>    final long addSize = addCell.getSerializedSize();<a name="line.2383"></a>
+<span class="sourceLineNo">2384</span><a name="line.2384"></a>
+<span class="sourceLineNo">2385</span>    LOG.info("originalSize:" + originalSize<a name="line.2385"></a>
+<span class="sourceLineNo">2386</span>      + ", addSize:" + addSize);<a name="line.2386"></a>
+<span class="sourceLineNo">2387</span>    // start test. We expect that the addPut's durability will be replaced<a name="line.2387"></a>
+<span class="sourceLineNo">2388</span>    // by originalPut's durability.<a name="line.2388"></a>
+<span class="sourceLineNo">2389</span><a name="line.2389"></a>
+<span class="sourceLineNo">2390</span>    // case 1:<a name="line.2390"></a>
+<span class="sourceLineNo">2391</span>    testDataInMemoryWithoutWAL(region,<a name="line.2391"></a>
+<span class="sourceLineNo">2392</span>            new Put(row).add(originalCell).setDurability(Durability.SKIP_WAL),<a name="line.2392"></a>
+<span class="sourceLineNo">2393</span>            new Put(row).add(addCell).setDurability(Durability.SKIP_WAL),<a name="line.2393"></a>
+<span class="sourceLineNo">2394</span>            originalSize + addSize);<a name="line.2394"></a>
+<span class="sourceLineNo">2395</span><a name="line.2395"></a>
+<span class="sourceLineNo">2396</span>    // case 2:<a name="line.2396"></a>
+<span class="sourceLineNo">2397</span>    testDataInMemoryWithoutWAL(region,<a name="line.2397"></a>
+<span class="sourceLineNo">2398</span>            new Put(row).add(originalCell).setDurability(Durability.SKIP_WAL),<a name="line.2398"></a>
+<span class="sourceLineNo">2399</span>            new Put(row).add(addCell).setDurability(Durability.SYNC_WAL),<a name="line.2399"></a>
+<span class="sourceLineNo">2400</span>            originalSize + addSize);<a name="line.2400"></a>
+<span class="sourceLineNo">2401</span><a name="line.2401"></a>
+<span class="sourceLineNo">2402</span>    // case 3:<a name="line.2402"></a>
+<span class="sourceLineNo">2403</span>    testDataInMemoryWithoutWAL(region,<a name="line.2403"></a>
+<span class="sourceLineNo">2404</span>            new Put(row).add(originalCell).setDurability(Durability.SYNC_WAL),<a name="line.2404"></a>
+<span class="sourceLineNo">2405</span>            new Put(row).add(addCell).setDurability(Durability.SKIP_WAL),<a name="line.2405"></a>
+<span class="sourceLineNo">2406</span>            0);<a name="line.2406"></a>
+<span class="sourceLineNo">2407</span><a name="line.2407"></a>
+<span class="sourceLineNo">2408</span>    // case 4:<a name="line.2408"></a>
+<span class="sourceLineNo">2409</span>    testDataInMemoryWithoutWAL(region,<a name="line.2409"></a>
+<span class="sourceLineNo">2410</span>            new Put(row).add(originalCell).setDurability(Durability.SYNC_WAL),<a name="line.2410"></a>
+<span class="sourceLineNo">2411</span>            new Put(row).add(addCell).setDurability(Durability.SYNC_WAL),<a name="line.2411"></a>
+<span class="sourceLineNo">2412</span>            0);<a name="line.2412"></a>
+<span class="sourceLineNo">2413</span>  }<a name="line.2413"></a>
+<span class="sourceLineNo">2414</span><a name="line.2414"></a>
+<span class="sourceLineNo">2415</span>  private static void testDataInMemoryWithoutWAL(HRegion region, Put originalPut,<a name="line.2415"></a>
+<span class="sourceLineNo">2416</span>          final Put addPut, long delta) throws IOException {<a name="line.2416"></a>
+<span class="sourceLineNo">2417</span>    final long initSize = region.getDataInMemoryWithoutWAL();<a name="line.2417"></a>
+<span class="sourceLineNo">2418</span>    // save normalCPHost and replaced by mockedCPHost<a name="line.2418"></a>
+<span class="sourceLineNo">2419</span>    RegionCoprocessorHost normalCPHost = region.getCoprocessorHost();<a name="line.2419"></a>
+<span class="sourceLineNo">2420</span>    RegionCoprocessorHost mockedCPHost = Mockito.mock(RegionCoprocessorHost.class);<a name="line.2420"></a>
+<span class="sourceLineNo">2421</span>    // Because the preBatchMutate returns void, we can't do usual Mockito when...then form. Must<a name="line.2421"></a>
+<span class="sourceLineNo">2422</span>    // do below format (from Mockito doc).<a name="line.2422"></a>
+<span class="sourceLineNo">2423</span>    Mockito.doAnswer(new Answer&lt;Void&gt;() {<a name="line.2423"></a>
+<span class="sourceLineNo">2424</span>      @Override<a name="line.2424"></a>
+<span class="sourceLineNo">2425</span>      public Void answer(InvocationOnMock invocation) throws Throwable {<a name="line.2425"></a>
+<span class="sourceLineNo">2426</span>        MiniBatchOperationInProgress&lt;Mutation&gt; mb = invocation.getArgument(0);<a name="line.2426"></a>
+<span class="sourceLineNo">2427</span>        mb.addOperationsFromCP(0, new Mutation[]{addPut});<a name="line.2427"></a>
+<span class="sourceLineNo">2428</span>        return null;<a name="line.2428"></a>
+<span class="sourceLineNo">2429</span>      }<a name="line.2429"></a>
+<span class="sourceLineNo">2430</span>    }).when(mockedCPHost).preBatchMutate(Mockito.isA(MiniBatchOperationInProgress.class));<a name="line.2430"></a>
+<span class="sourceLineNo">2431</span>    ColumnFamilyDescriptorBuilder builder = ColumnFamilyDescriptorBuilder.<a name="line.2431"></a>
+<span class="sourceLineNo">2432</span>        newBuilder(COLUMN_FAMILY_BYTES);<a name="line.2432"></a>
+<span class="sourceLineNo">2433</span>    ScanInfo info = new ScanInfo(CONF, builder.build(), Long.MAX_VALUE,<a name="line.2433"></a>
+<span class="sourceLineNo">2434</span>        Long.MAX_VALUE, region.getCellComparator());<a name="line.2434"></a>
+<span class="sourceLineNo">2435</span>    Mockito.when(mockedCPHost.preFlushScannerOpen(Mockito.any(HStore.class),<a name="line.2435"></a>
+<span class="sourceLineNo">2436</span>        Mockito.any())).thenReturn(info);<a name="line.2436"></a>
+<span class="sourceLineNo">2437</span>    Mockito.when(mockedCPHost.preFlush(Mockito.any(), Mockito.any(StoreScanner.class),<a name="line.2437"></a>
+<span class="sourceLineNo">2438</span>        Mockito.any())).thenAnswer(i -&gt; i.getArgument(1));<a name="line.2438"></a>
+<span class="sourceLineNo">2439</span>    region.setCoprocessorHost(mockedCPHost);<a name="line.2439"></a>
+<span class="sourceLineNo">2440</span><a name="line.2440"></a>
+<span class="sourceLineNo">2441</span>    region.put(originalPut);<a name="line.2441"></a>
+<span class="sourceLineNo">2442</span>    region.setCoprocessorHost(normalCPHost);<a name="line.2442"></a>
+<span class="sourceLineNo">2443</span>    final long finalSize = region.getDataInMemoryWithoutWAL();<a name="line.2443"></a>
+<span class="sourceLineNo">2444</span>    assertEquals("finalSize:" + finalSize + ", initSize:"<a name="line.2444"></a>
+<span class="sourceLineNo">2445</span>      + initSize + ", delta:" + delta,finalSize, initSize + delta);<a name="line.2445"></a>
+<span class="sourceLineNo">2446</span>  }<a name="line.2446"></a>
+<span class="sourceLineNo">2447</span><a name="line.2447"></a>
+<span class="sourceLineNo">2448</span>  @Test<a name="line.2448"></a>
+<span class="sourceLineNo">2449</span>  public void testDeleteColumns_PostInsert() throws IOException, InterruptedException {<a name="line.2449"></a>
+<span class="sourceLineNo">2450</span>    Delete delete = new Delete(row);<a name="line.2450"></a>
+<span class="sourceLineNo">2451</span>    delete.addColumns(fam1, qual1);<a name="line.2451"></a>
+<span class="sourceLineNo">2452</span>    doTestDelete_AndPostInsert(delete);<a name="line.2452"></a>
+<span class="sourceLineNo">2453</span>  }<a name="line.2453"></a>
+<span class="sourceLineNo">2454</span><a name="line.2454"></a>
+<span class="sourceLineNo">2455</span>  @Test<a name="line.2455"></a>
+<span class="sourceLineNo">2456</span>  public void testaddFamily_PostInsert() throws IOException, InterruptedException {<a name="line.2456"></a>
+<span class="sourceLineNo">2457</span>    Delete delete = new Delete(row);<a name="line.2457"></a>
+<span class="sourceLineNo">2458</span>    delete.addFamily(fam1);<a name="line.2458"></a>
+<span class="sourceLineNo">2459</span>    doTestDelete_AndPostInsert(delete);<a name="line.2459"></a>
+<span class="sourceLineNo">2460</span>  }<a name="line.2460"></a>
 <span class="sourceLineNo">2461</span><a name="line.2461"></a>
-<span class="sourceLineNo">2462</span>    // ok put data:<a name="line.2462"></a>
-<span class="sourceLineNo">2463</span>    put = new Put(row);<a name="line.2463"></a>
-<span class="sourceLineNo">2464</span>    put.addColumn(fam1, qual1, value2);<a name="line.2464"></a>
-<span class="sourceLineNo">2465</span>    region.put(put);<a name="line.2465"></a>
-<span class="sourceLineNo">2466</span><a name="line.2466"></a>
-<span class="sourceLineNo">2467</span>    // ok get:<a name="line.2467"></a>
-<span class="sourceLineNo">2468</span>    Get get = new Get(row);<a name="line.2468"></a>
-<span class="sourceLineNo">2469</span>    get.addColumn(fam1, qual1);<a name="line.2469"></a>
-<span class="sourceLineNo">2470</span><a name="line.2470"></a>
-<span class="sourceLineNo">2471</span>    Result r = region.get(get);<a name="line.2471"></a>
-<span class="sourceLineNo">2472</span>    assertEquals(1, r.size());<a name="line.2472"></a>
-<span class="sourceLineNo">2473</span>    assertArrayEquals(value2, r.getValue(fam1, qual1));<a name="line.2473"></a>
-<span class="sourceLineNo">2474</span><a name="line.2474"></a>
-<span class="sourceLineNo">2475</span>    // next:<a name="line.2475"></a>
-<span class="sourceLineNo">2476</span>    Scan scan = new Scan(row);<a name="line.2476"></a>
-<span class="sourceLineNo">2477</span>    scan.addColumn(fam1, qual1);<a name="line.2477"></a>
-<span class="sourceLineNo">2478</span>    InternalScanner s = region.getScanner(scan);<a name="line.2478"></a>
-<span class="sourceLineNo">2479</span><a name="line.2479"></a>
-<span class="sourceLineNo">2480</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.2480"></a>
-<span class="sourceLineNo">2481</span>    assertEquals(false, s.next(results));<a name="line.2481"></a>
-<span class="sourceLineNo">2482</span>    assertEquals(1, results.size());<a name="line.2482"></a>
-<span class="sourceLineNo">2483</span>    Cell kv = results.get(0);<a name="line.2483"></a>
+<span class="sourceLineNo">2462</span>  public void doTestDelete_AndPostInsert(Delete delete) throws IOException, InterruptedException {<a name="line.2462"></a>
+<span class="sourceLineNo">2463</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2463"></a>
+<span class="sourceLineNo">2464</span>    EnvironmentEdgeManagerTestHelper.injectEdge(new IncrementingEnvironmentEdge());<a name="line.2464"></a>
+<span class="sourceLineNo">2465</span>    Put put = new Put(row);<a name="line.2465"></a>
+<span class="sourceLineNo">2466</span>    put.addColumn(fam1, qual1, value1);<a name="line.2466"></a>
+<span class="sourceLineNo">2467</span>    region.put(put);<a name="line.2467"></a>
+<span class="sourceLineNo">2468</span><a name="line.2468"></a>
+<span class="sourceLineNo">2469</span>    // now delete the value:<a name="line.2469"></a>
+<span class="sourceLineNo">2470</span>    region.delete(delete);<a name="line.2470"></a>
+<span class="sourceLineNo">2471</span><a name="line.2471"></a>
+<span class="sourceLineNo">2472</span>    // ok put data:<a name="line.2472"></a>
+<span class="sourceLineNo">2473</span>    put = new Put(row);<a name="line.2473"></a>
+<span class="sourceLineNo">2474</span>    put.addColumn(fam1, qual1, value2);<a name="line.2474"></a>
+<span class="sourceLineNo">2475</span>    region.put(put);<a name="line.2475"></a>
+<span class="sourceLineNo">2476</span><a name="line.2476"></a>
+<span class="sourceLineNo">2477</span>    // ok get:<a name="line.2477"></a>
+<span class="sourceLineNo">2478</span>    Get get = new Get(row);<a name="line.2478"></a>
+<span class="sourceLineNo">2479</span>    get.addColumn(fam1, qual1);<a name="line.2479"></a>
+<span class="sourceLineNo">2480</span><a name="line.2480"></a>
+<span class="sourceLineNo">2481</span>    Result r = region.get(get);<a name="line.2481"></a>
+<span class="sourceLineNo">2482</span>    assertEquals(1, r.size());<a name="line.2482"></a>
+<span class="sourceLineNo">2483</span>    assertArrayEquals(value2, r.getValue(fam1, qual1));<a name="line.2483"></a>
 <span class="sourceLineNo">2484</span><a name="line.2484"></a>
-<span class="sourceLineNo">2485</span>    assertArrayEquals(value2, CellUtil.cloneValue(kv));<a name="line.2485"></a>
-<span class="sourceLineNo">2486</span>    assertArrayEquals(fam1, CellUtil.cloneFamily(kv));<a name="line.2486"></a>
-<span class="sourceLineNo">2487</span>    assertArrayEquals(qual1, CellUtil.cloneQualifier(kv));<a name="line.2487"></a>
-<span class="sourceLineNo">2488</span>    assertArrayEquals(row, CellUtil.cloneRow(kv));<a name="line.2488"></a>
-<span class="sourceLineNo">2489</span>  }<a name="line.2489"></a>
-<span class="sourceLineNo">2490</span><a name="line.2490"></a>
-<span class="sourceLineNo">2491</span>  @Test<a name="line.2491"></a>
-<span class="sourceLineNo">2492</span>  public void testDelete_CheckTimestampUpdated() throws IOException {<a name="line.2492"></a>
-<span class="sourceLineNo">2493</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2493"></a>
-<span class="sourceLineNo">2494</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.2494"></a>
-<span class="sourceLineNo">2495</span>    byte[] col2 = Bytes.toBytes("col2");<a name="line.2495"></a>
-<span class="sourceLineNo">2496</span>    byte[] col3 = Bytes.toBytes("col3");<a name="line.2496"></a>
-<span class="sourceLineNo">2497</span><a name="line.2497"></a>
-<span class="sourceLineNo">2498</span>    // Setting up region<a name="line.2498"></a>
-<span class="sourceLineNo">2499</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2499"></a>
-<span class="sourceLineNo">2500</span>    // Building checkerList<a name="line.2500"></a>
-<span class="sourceLineNo">2501</span>    List&lt;Cell&gt; kvs = new ArrayList&lt;&gt;();<a name="line.2501"></a>
-<span class="sourceLineNo">2502</span>    kvs.add(new KeyValue(row1, fam1, col1, null));<a name="line.2502"></a>
-<span class="sourceLineNo">2503</span>    kvs.add(new KeyValue(row1, fam1, col2, null));<a name="line.2503"></a>
-<span class="sourceLineNo">2504</span>    kvs.add(new KeyValue(row1, fam1, col3, null));<a name="line.2504"></a>
-<span class="sourceLineNo">2505</span><a name="line.2505"></a>
-<span class="sourceLineNo">2506</span>    NavigableMap&lt;byte[], List&lt;Cell&gt;&gt; deleteMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2506"></a>
-<span class="sourceLineNo">2507</span>    deleteMap.put(fam1, kvs);<a name="line.2507"></a>
-<span class="sourceLineNo">2508</span>    region.delete(deleteMap, Durability.SYNC_WAL);<a name="line.2508"></a>
-<span class="sourceLineNo">2509</span><a name="line.2509"></a>
-<span class="sourceLineNo">2510</span>    // extract the key values out the memstore:<a name="line.2510"></a>
-<span class="sourceLineNo">2511</span>    // This is kinda hacky, but better than nothing...<a name="line.2511"></a>
-<span class="sourceLineNo">2512</span>    long now = System.currentTimeMillis();<a name="line.2512"></a>
-<span class="sourceLineNo">2513</span>    AbstractMemStore memstore = (AbstractMemStore)region.getStore(fam1).memstore;<a name="line.2513"></a>
-<span class="sourceLineNo">2514</span>    Cell firstCell = memstore.getActive().first();<a name="line.2514"></a>
-<span class="sourceLineNo">2515</span>    assertTrue(firstCell.getTimestamp() &lt;= now);<a name="line.2515"></a>
-<span class="sourceLineNo">2516</span>    now = firstCell.getTimestamp();<a name="line.2516"></a>
-<span class="sourceLineNo">2517</span>    for (Cell cell : memstore.getActive().getCellSet()) {<a name="line.2517"></a>
-<span class="sourceLineNo">2518</span>      assertTrue(cell.getTimestamp() &lt;= now);<a name="line.2518"></a>
-<span class="sourceLineNo">2519</span>      now = cell.getTimestamp();<a name="line.2519"></a>
-<span class="sourceLineNo">2520</span>    }<a name="line.2520"></a>
-<span class="sourceLineNo">2521</span>  }<a name="line.2521"></a>
-<span class="sourceLineNo">2522</span><a name="line.2522"></a>
-<span class="sourceLineNo">2523</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2523"></a>
-<span class="sourceLineNo">2524</span>  // Get tests<a name="line.2524"></a>
-<span class="sourceLineNo">2525</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2525"></a>
-<span class="sourceLineNo">2526</span>  @Test<a name="line.2526"></a>
-<span class="sourceLineNo">2527</span>  public void testGet_FamilyChecker() throws IOException {<a name="line.2527"></a>
-<span class="sourceLineNo">2528</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2528"></a>
-<span class="sourceLineNo">2529</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2529"></a>
-<span class="sourceLineNo">2530</span>    byte[] fam2 = Bytes.toBytes("False");<a name="line.2530"></a>
-<span class="sourceLineNo">2531</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.2531"></a>
+<span class="sourceLineNo">2485</span>    // next:<a name="line.2485"></a>
+<span class="sourceLineNo">2486</span>    Scan scan = new Scan(row);<a name="line.2486"></a>
+<span class="sourceLineNo">2487</span>    scan.addColumn(fam1, qual1);<a name="line.2487"></a>
+<span class="sourceLineNo">2488</span>    InternalScanner s = region.getScanner(scan);<a name="line.2488"></a>
+<span class="sourceLineNo">2489</span><a name="line.2489"></a>
+<span class="sourceLineNo">2490</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.2490"></a>
+<span class="sourceLineNo">2491</span>    assertEquals(false, s.next(results));<a name="line.2491"></a>
+<span class="sourceLineNo">2492</span>    assertEquals(1, results.size());<a name="line.2492"></a>
+<span class="sourceLineNo">2493</span>    Cell kv = results.get(0);<a name="line.2493"></a>
+<span class="sourceLineNo">2494</span><a name="line.2494"></a>
+<span class="sourceLineNo">2495</span>    assertArrayEquals(value2, CellUtil.cloneValue(kv));<a name="line.2495"></a>
+<span class="sourceLineNo">2496</span>    assertArrayEquals(fam1, CellUtil.cloneFamily(kv));<a name="line.2496"></a>
+<span class="sourceLineNo">2497</span>    assertArrayEquals(qual1, CellUtil.cloneQualifier(kv));<a name="line.2497"></a>
+<span class="sourceLineNo">2498</span>    assertArrayEquals(row, CellUtil.cloneRow(kv));<a name="line.2498"></a>
+<span class="sourceLineNo">2499</span>  }<a name="line.2499"></a>
+<span class="sourceLineNo">2500</span><a name="line.2500"></a>
+<span class="sourceLineNo">2501</span>  @Test<a name="line.2501"></a>
+<span class="sourceLineNo">2502</span>  public void testDelete_CheckTimestampUpdated() throws IOException {<a name="line.2502"></a>
+<span class="sourceLineNo">2503</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2503"></a>
+<span class="sourceLineNo">2504</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.2504"></a>
+<span class="sourceLineNo">2505</span>    byte[] col2 = Bytes.toBytes("col2");<a name="line.2505"></a>
+<span class="sourceLineNo">2506</span>    byte[] col3 = Bytes.toBytes("col3");<a name="line.2506"></a>
+<span class="sourceLineNo">2507</span><a name="line.2507"></a>
+<span class="sourceLineNo">2508</span>    // Setting up region<a name="line.2508"></a>
+<span class="sourceLineNo">2509</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2509"></a>
+<span class="sourceLineNo">2510</span>    // Building checkerList<a name="line.2510"></a>
+<span class="sourceLineNo">2511</span>    List&lt;Cell&gt; kvs = new ArrayList&lt;&gt;();<a name="line.2511"></a>
+<span class="sourceLineNo">2512</span>    kvs.add(new KeyValue(row1, fam1, col1, null));<a name="line.2512"></a>
+<span class="sourceLineNo">2513</span>    kvs.add(new KeyValue(row1, fam1, col2, null));<a name="line.2513"></a>
+<span class="sourceLineNo">2514</span>    kvs.add(new KeyValue(row1, fam1, col3, null));<a name="line.2514"></a>
+<span class="sourceLineNo">2515</span><a name="line.2515"></a>
+<span class="sourceLineNo">2516</span>    NavigableMap&lt;byte[], List&lt;Cell&gt;&gt; deleteMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2516"></a>
+<span class="sourceLineNo">2517</span>    deleteMap.put(fam1, kvs);<a name="line.2517"></a>
+<span class="sourceLineNo">2518</span>    region.delete(deleteMap, Durability.SYNC_WAL);<a name="line.2518"></a>
+<span class="sourceLineNo">2519</span><a name="line.2519"></a>
+<span class="sourceLineNo">2520</span>    // extract the key values out the memstore:<a name="line.2520"></a>
+<span class="sourceLineNo">2521</span>    // This is kinda hacky, but better than nothing...<a name="line.2521"></a>
+<span class="sourceLineNo">2522</span>    long now = System.currentTimeMillis();<a name="line.2522"></a>
+<span class="sourceLineNo">2523</span>    AbstractMemStore memstore = (AbstractMemStore)region.getStore(fam1).memstore;<a name="line.2523"></a>
+<span class="sourceLineNo">2524</span>    Cell firstCell = memstore.getActive().first();<a name="line.2524"></a>
+<span class="sourceLineNo">2525</span>    assertTrue(firstCell.getTimestamp() &lt;= now);<a name="line.2525"></a>
+<span class="sourceLineNo">2526</span>    now = firstCell.getTimestamp();<a name="line.2526"></a>
+<span class="sourceLineNo">2527</span>    for (Cell cell : memstore.getActive().getCellSet()) {<a name="line.2527"></a>
+<span class="sourceLineNo">2528</span>      assertTrue(cell.getTimestamp() &lt;= now);<a name="line.2528"></a>
+<span class="sourceLineNo">2529</span>      now = cell.getTimestamp();<a name="line.2529"></a>
+<span class="sourceLineNo">2530</span>    }<a name="line.2530"></a>
+<span class="sourceLineNo">2531</span>  }<a name="line.2531"></a>
 <span class="sourceLineNo">2532</span><a name="line.2532"></a>
-<span class="sourceLineNo">2533</span>    // Setting up region<a name="line.2533"></a>
-<span class="sourceLineNo">2534</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2534"></a>
-<span class="sourceLineNo">2535</span>    Get get = new Get(row1);<a name="line.2535"></a>
-<span class="sourceLineNo">2536</span>    get.addColumn(fam2, col1);<a name="line.2536"></a>
-<span class="sourceLineNo">2537</span><a name="line.2537"></a>
-<span class="sourceLineNo">2538</span>    // Test<a name="line.2538"></a>
-<span class="sourceLineNo">2539</span>    try {<a name="line.2539"></a>
-<span class="sourceLineNo">2540</span>      region.get(get);<a name="line.2540"></a>
-<span class="sourceLineNo">2541</span>      fail("Expecting DoNotRetryIOException in get but did not get any");<a name="line.2541"></a>
-<span class="sourceLineNo">2542</span>    } catch (org.apache.hadoop.hbase.DoNotRetryIOException e) {<a name="line.2542"></a>
-<span class="sourceLineNo">2543</span>      LOG.info("Got expected DoNotRetryIOException successfully");<a name="line.2543"></a>
-<span class="sourceLineNo">2544</span>    }<a name="line.2544"></a>
-<span class="sourceLineNo">2545</span>  }<a name="line.2545"></a>
-<span class="sourceLineNo">2546</span><a name="line.2546"></a>
-<span class="sourceLineNo">2547</span>  @Test<a name="line.2547"></a>
-<span class="sourceLineNo">2548</span>  public void testGet_Basic() throws IOException {<a name="line.2548"></a>
-<span class="sourceLineNo">2549</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2549"></a>
-<span class="sourceLineNo">2550</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2550"></a>
-<span class="sourceLineNo">2551</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.2551"></a>
-<span class="sourceLineNo">2552</span>    byte[] col2 = Bytes.toBytes("col2");<a name="line.2552"></a>
-<span class="sourceLineNo">2553</span>    byte[] col3 = Bytes.toBytes("col3");<a name="line.2553"></a>
-<span class="sourceLineNo">2554</span>    byte[] col4 = Bytes.toBytes("col4");<a name="line.2554"></a>
-<span class="sourceLineNo">2555</span>    byte[] col5 = Bytes.toBytes("col5");<a name="line.2555"></a>
+<span class="sourceLineNo">2533</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2533"></a>
+<span class="sourceLineNo">2534</span>  // Get tests<a name="line.2534"></a>
+<span class="sourceLineNo">2535</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2535"></a>
+<span class="sourceLineNo">2536</span>  @Test<a name="line.2536"></a>
+<span class="sourceLineNo">2537</span>  public void testGet_FamilyChecker() throws IOException {<a name="line.2537"></a>
+<span class="sourceLineNo">2538</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2538"></a>
+<span class="sourceLineNo">2539</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2539"></a>
+<span class="sourceLineNo">2540</span>    byte[] fam2 = Bytes.toBytes("False");<a name="line.2540"></a>
+<span class="sourceLineNo">2541</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.2541"></a>
+<span class="sourceLineNo">2542</span><a name="line.2542"></a>
+<span class="sourceLineNo">2543</span>    // Setting up region<a name="line.2543"></a>
+<span class="sourceLineNo">2544</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2544"></a>
+<span class="sourceLineNo">2545</span>    Get get = new Get(row1);<a name="line.2545"></a>
+<span class="sourceLineNo">2546</span>    get.addColumn(fam2, col1);<a name="line.2546"></a>
+<span class="sourceLineNo">2547</span><a name="line.2547"></a>
+<span class="sourceLineNo">2548</span>    // Test<a name="line.2548"></a>
+<span class="sourceLineNo">2549</span>    try {<a name="line.2549"></a>
+<span class="sourceLineNo">2550</span>      region.get(get);<a name="line.2550"></a>
+<span class="sourceLineNo">2551</span>      fail("Expecting DoNotRetryIOException in get but did not get any");<a name="line.2551"></a>
+<span class="sourceLineNo">2552</span>    } catch (org.apache.hadoop.hbase.DoNotRetryIOException e) {<a name="line.2552"></a>
+<span class="sourceLineNo">2553</span>      LOG.info("Got expected DoNotRetryIOException successfully");<a name="line.2553"></a>
+<span class="sourceLineNo">2554</span>    }<a name="line.2554"></a>
+<span class="sourceLineNo">2555</span>  }<a name="line.2555"></a>
 <span class="sourceLineNo">2556</span><a name="line.2556"></a>
-<span class="sourceLineNo">2557</span>    // Setting up region<a name="line.2557"></a>
-<span class="sourceLineNo">2558</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2558"></a>
-<span class="sourceLineNo">2559</span>    // Add to memstore<a name="line.2559"></a>
-<span class="sourceLineNo">2560</span>    Put put = new Put(row1);<a name="line.2560"></a>
-<span class="sourceLineNo">2561</span>    put.addColumn(fam1, col1, null);<a name="line.2561"></a>
-<span class="sourceLineNo">2562</span>    put.addColumn(fam1, col2, null);<a name="line.2562"></a>
-<span class="sourceLineNo">2563</span>    put.addColumn(fam1, col3, null);<a name="line.2563"></a>
-<span class="sourceLineNo">2564</span>    put.addColumn(fam1, col4, null);<a name="line.2564"></a>
-<span class="sourceLineNo">2565</span>    put.addColumn(fam1, col5, null);<a name="line.2565"></a>
-<span class="sourceLineNo">2566</span>    region.put(put);<a name="line.2566"></a>
-<span class="sourceLineNo">2567</span><a name="line.2567"></a>
-<span class="sourceLineNo">2568</span>    Get get = new Get(row1);<a name="line.2568"></a>
-<span class="sourceLineNo">2569</span>    get.addColumn(fam1, col2);<a name="line.2569"></a>
-<span class="sourceLineNo">2570</span>    get.addColumn(fam1, col4);<a name="line.2570"></a>
-<span class="sourceLineNo">2571</span>    // Expected result<a name="line.2571"></a>
-<span class="sourceLineNo">2572</span>    KeyValue kv1 = new KeyValue(row1, fam1, col2);<a name="line.2572"></a>
-<span class="sourceLineNo">2573</span>    KeyValue kv2 = new KeyValue(row1, fam1, col4);<a name="line.2573"></a>
-<span class="sourceLineNo">2574</span>    KeyValue[] expected = { kv1, kv2 };<a name="line.2574"></a>
-<span class="sourceLineNo">2575</span><a name="line.2575"></a>
-<span class="sourceLineNo">2576</span>    // Test<a name="line.2576"></a>
-<span class="sourceLineNo">2577</span>    Result res = region.get(get);<a name="line.2577"></a>
-<span class="sourceLineNo">2578</span>    assertEquals(expected.length, res.size());<a name="line.2578"></a>
-<span class="sourceLineNo">2579</span>    for (int i = 0; i &lt; res.size(); i++) {<a name="line.2579"></a>
-<span class="sourceLineNo">2580</span>      assertTrue(CellUtil.matchingRows(expected[i], res.rawCells()[i]));<a name="line.2580"></a>
-<span class="sourceLineNo">2581</span>      assertTrue(CellUtil.matchingFamily(expected[i], res.rawCells()[i]));<a name="line.2581"></a>
-<span class="sourceLineNo">2582</span>      assertTrue(CellUtil.matchingQualifier(expected[i], res.rawCells()[i]));<a name="line.2582"></a>
-<span class="sourceLineNo">2583</span>    }<a name="line.2583"></a>
-<span class="sourceLineNo">2584</span><a name="line.2584"></a>
-<span class="sourceLineNo">2585</span>    // Test using a filter on a Get<a name="line.2585"></a>
-<span class="sourceLineNo">2586</span>    Get g = new Get(row1);<a name="line.2586"></a>
-<span class="sourceLineNo">2587</span>    final int count = 2;<a name="line.2587"></a>
-<span class="sourceLineNo">2588</span>    g.setFilter(new ColumnCountGetFilter(count));<a name="line.2588"></a>
-<span class="sourceLineNo">2589</span>    res = region.get(g);<a name="line.2589"></a>
-<span class="sourceLineNo">2590</span>    assertEquals(count, res.size());<a name="line.2590"></a>
-<span class="sourceLineNo">2591</span>  }<a name="line.2591"></a>
-<span class="sourceLineNo">2592</span><a name="line.2592"></a>
-<span class="sourceLineNo">2593</span>  @Test<a name="line.2593"></a>
-<span class="sourceLineNo">2594</span>  public void testGet_Empty() throws IOException {<a name="line.2594"></a>
-<span class="sourceLineNo">2595</span>    byte[] row = Bytes.toBytes("row");<a name="line.2595"></a>
-<span class="sourceLineNo">2596</span>    byte[] fam = Bytes.toBytes("fam");<a name="line.2596"></a>
-<span class="sourceLineNo">2597</span><a name="line.2597"></a>
-<span class="sourceLineNo">2598</span>    this.region = initHRegion(tableName, method, CONF, fam);<a name="line.2598"></a>
-<span class="sourceLineNo">2599</span>    Get get = new Get(row);<a name="line.2599"></a>
-<span class="sourceLineNo">2600</span>    get.addFamily(fam);<a name="line.2600"></a>
-<span class="sourceLineNo">2601</span>    Result r = region.get(get);<a name="line.2601"></a>
+<span class="sourceLineNo">2557</span>  @Test<a name="line.2557"></a>
+<span class="sourceLineNo">2558</span>  public void testGet_Basic() throws IOException {<a name="line.2558"></a>
+<span class="sourceLineNo">2559</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2559"></a>
+<span class="sourceLineNo">2560</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2560"></a>
+<span class="sourceLineNo">2561</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.2561"></a>
+<span class="sourceLineNo">2562</span>    byte[] col2 = Bytes.toBytes("col2");<a name="line.2562"></a>
+<span class="sourceLineNo">2563</span>    byte[] col3 = Bytes.toBytes("col3");<a name="line.2563"></a>
+<span class="sourceLineNo">2564</span>    byte[] col4 = Bytes.toBytes("col4");<a name="line.2564"></a>
+<span class="sourceLineNo">2565</span>    byte[] col5 = Bytes.toBytes("col5");<a name="line.2565"></a>
+<span class="sourceLineNo">2566</span><a name="line.2566"></a>
+<span class="sourceLineNo">2567</span>    // Setting up region<a name="line.2567"></a>
+<span class="sourceLineNo">2568</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2568"></a>
+<span class="sourceLineNo">2569</span>    // Add to memstore<a name="line.2569"></a>
+<span class="sourceLineNo">2570</span>    Put put = new Put(row1);<a name="line.2570"></a>
+<span class="sourceLineNo">2571</span>    put.addColumn(fam1, col1, null);<a name="line.2571"></a>
+<span class="sourceLineNo">2572</span>    put.addColumn(fam1, col2, null);<a name="line.2572"></a>
+<span class="sourceLineNo">2573</span>    put.addColumn(fam1, col3, null);<a name="line.2573"></a>
+<span class="sourceLineNo">2574</span>    put.addColumn(fam1, col4, null);<a name="line.2574"></a>
+<span class="sourceLineNo">2575</span>    put.addColumn(fam1, col5, null);<a name="line.2575"></a>
+<span class="sourceLineNo">2576</span>    region.put(put);<a name="line.2576"></a>
+<span class="sourceLineNo">2577</span><a name="line.2577"></a>
+<span class="sourceLineNo">2578</span>    Get get = new Get(row1);<a name="line.2578"></a>
+<span class="sourceLineNo">2579</span>    get.addColumn(fam1, col2);<a name="line.2579"></a>
+<span class="sourceLineNo">2580</span>    get.addColumn(fam1, col4);<a name="line.2580"></a>
+<span class="sourceLineNo">2581</span>    // Expected result<a name="line.2581"></a>
+<span class="sourceLineNo">2582</span>    KeyValue kv1 = new KeyValue(row1, fam1, col2);<a name="line.2582"></a>
+<span class="sourceLineNo">2583</span>    KeyValue kv2 = new KeyValue(row1, fam1, col4);<a name="line.2583"></a>
+<span class="sourceLineNo">2584</span>    KeyValue[] expected = { kv1, kv2 };<a name="line.2584"></a>
+<span class="sourceLineNo">2585</span><a name="line.2585"></a>
+<span class="sourceLineNo">2586</span>    // Test<a name="line.2586"></a>
+<span class="sourceLineNo">2587</span>    Result res = region.get(get);<a name="line.2587"></a>
+<span class="sourceLineNo">2588</span>    assertEquals(expected.length, res.size());<a name="line.2588"></a>
+<span class="sourceLineNo">2589</span>    for (int i = 0; i &lt; res.size(); i++) {<a name="line.2589"></a>
+<span class="sourceLineNo">2590</span>      assertTrue(CellUtil.matchingRows(expected[i], res.rawCells()[i]));<a name="line.2590"></a>
+<span class="sourceLineNo">2591</span>      assertTrue(CellUtil.matchingFamily(expected[i], res.rawCells()[i]));<a name="line.2591"></a>
+<span class="sourceLineNo">2592</span>      assertTrue(CellUtil.matchingQualifier(expected[i], res.rawCells()[i]));<a name="line.2592"></a>
+<span class="sourceLineNo">2593</span>    }<a name="line.2593"></a>
+<span class="sourceLineNo">2594</span><a name="line.2594"></a>
+<span class="sourceLineNo">2595</span>    // Test using a filter on a Get<a name="line.2595"></a>
+<span class="sourceLineNo">2596</span>    Get g = new Get(row1);<a name="line.2596"></a>
+<span class="sourceLineNo">2597</span>    final int count = 2;<a name="line.2597"></a>
+<span class="sourceLineNo">2598</span>    g.setFilter(new ColumnCountGetFilter(count));<a name="line.2598"></a>
+<span class="sourceLineNo">2599</span>    res = region.get(g);<a name="line.2599"></a>
+<span class="sourceLineNo">2600</span>    assertEquals(count, res.size());<a name="line.2600"></a>
+<span class="sourceLineNo">2601</span>  }<a name="line.2601"></a>
 <span class="sourceLineNo">2602</span><a name="line.2602"></a>
-<span class="sourceLineNo">2603</span>    assertTrue(r.isEmpty());<a name="line.2603"></a>
-<span class="sourceLineNo">2604</span>  }<a name="line.2604"></a>
-<span class="sourceLineNo">2605</span><a name="line.2605"></a>
-<span class="sourceLineNo">2606</span>  @Test<a name="line.2606"></a>
-<span class="sourceLineNo">2607</span>  public void testGetWithFilter() throws IOException, InterruptedException {<a name="line.2607"></a>
-<span class="sourceLineNo">2608</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2608"></a>
-<span class="sourceLineNo">2609</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2609"></a>
-<span class="sourceLineNo">2610</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.2610"></a>
-<span class="sourceLineNo">2611</span>    byte[] value1 = Bytes.toBytes("value1");<a name="line.2611"></a>
-<span class="sourceLineNo">2612</span>    byte[] value2 = Bytes.toBytes("value2");<a name="line.2612"></a>
-<span class="sourceLineNo">2613</span><a name="line.2613"></a>
-<span class="sourceLineNo">2614</span>    final int maxVersions = 3;<a name="line.2614"></a>
-<span class="sourceLineNo">2615</span>    HColumnDescriptor hcd = new HColumnDescriptor(fam1);<a name="line.2615"></a>
-<span class="sourceLineNo">2616</span>    hcd.setMaxVersions(maxVersions);<a name="line.2616"></a>
-<span class="sourceLineNo">2617</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf("testFilterAndColumnTracker"));<a name="line.2617"></a>
-<span class="sourceLineNo">2618</span>    htd.addFamily(hcd);<a name="line.2618"></a>
-<span class="sourceLineNo">2619</span>    ChunkCreator.initialize(MemStoreLABImpl.CHUNK_SIZE_DEFAULT, false, 0, 0, 0, null);<a name="line.2619"></a>
-<span class="sourceLineNo">2620</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.2620"></a>
-<span class="sourceLineNo">2621</span>    Path logDir = TEST_UTIL.getDataTestDirOnTestFS(method + ".log");<a name="line.2621"></a>
-<span class="sourceLineNo">2622</span>    final WAL wal = HBaseTestingUtility.createWal(TEST_UTIL.getConfiguration(), logDir, info);<a name="line.2622"></a>
-<span class="sourceLineNo">2623</span>    this.region = TEST_UTIL.createLocalHRegion(info, htd, wal);<a name="line.2623"></a>
-<span class="sourceLineNo">2624</span><a name="line.2624"></a>
-<span class="sourceLineNo">2625</span>    // Put 4 version to memstore<a name="line.2625"></a>
-<span class="sourceLineNo">2626</span>    long ts = 0;<a name="line.2626"></a>
-<span class="sourceLineNo">2627</span>    Put put = new Put(row1, ts);<a name="line.2627"></a>
-<span class="sourceLineNo">2628</span>    put.addColumn(fam1, col1, value1);<a name="line.2628"></a>
-<span class="sourceLineNo">2629</span>    region.put(put);<a name="line.2629"></a>
-<span class="sourceLineNo">2630</span>    put = new Put(row1, ts + 1);<a name="line.2630"></a>
-<span class="sourceLineNo">2631</span>    put.addColumn(fam1, col1, Bytes.toBytes("filter1"));<a name="line.2631"></a>
-<span class="sourceLineNo">2632</span>    region.put(put);<a name="line.2632"></a>
-<span class="sourceLineNo">2633</span>    put = new Put(row1, ts + 2);<a name="line.2633"></a>
-<span class="sourceLineNo">2634</span>    put.addColumn(fam1, col1, Bytes.toBytes("filter2"));<a name="line.2634"></a>
-<span class="sourceLineNo">2635</span>    region.put(put);<a name="line.2635"></a>
-<span class="sourceLineNo">2636</span>    put = new Put(row1, ts + 3);<a name="line.2636"></a>
-<span class="sourceLineNo">2637</span>    put.addColumn(fam1, col1, value2);<a name="line.2637"></a>
-<span class="sourceLineNo">2638</span>    region.put(put);<a name="line.2638"></a>
-<span class="sourceLineNo">2639</span><a name="line.2639"></a>
-<span class="sourceLineNo">2640</span>    Get get = new Get(row1);<a name="line.2640"></a>
-<span class="sourceLineNo">2641</span>    get.readAllVersions();<a name="line.2641"></a>
-<span class="sourceLineNo">2642</span>    Result res = region.get(get);<a name="line.2642"></a>
-<span class="sourceLineNo">2643</span>    // Get 3 versions, the oldest version has gone from user view<a name="line.2643"></a>
-<span class="sourceLineNo">2644</span>    assertEquals(maxVersions, res.size());<a name="line.2644"></a>
-<span class="sourceLineNo">2645</span><a name="line.2645"></a>
-<span class="sourceLineNo">2646</span>    get.setFilter(new ValueFilter(CompareOperator.EQUAL, new SubstringComparator("value")));<a name="line.2646"></a>
-<span class="sourceLineNo">2647</span>    res = region.get(get);<a name="line.2647"></a>
-<span class="sourceLineNo">2648</span>    // When use value filter, the oldest version should still gone from user view and it<a name="line.2648"></a>
-<span class="sourceLineNo">2649</span>    // should only return one key vaule<a name="line.2649"></a>
-<span class="sourceLineNo">2650</span>    assertEquals(1, res.size());<a name="line.2650"></a>
-<span class="sourceLineNo">2651</span>    assertTrue(CellUtil.matchingValue(new KeyValue(row1, fam1, col1, value2), res.rawCells()[0]));<a name="line.2651"></a>
-<span class="sourceLineNo">2652</span>    assertEquals(ts + 3, res.rawCells()[0].getTimestamp());<a name="line.2652"></a>
-<span class="sourceLineNo">2653</span><a name="line.2653"></a>
-<span class="sourceLineNo">2654</span>    region.flush(true);<a name="line.2654"></a>
-<span class="sourceLineNo">2655</span>    region.compact(true);<a name="line.2655"></a>
-<span class="sourceLineNo">2656</span>    Thread.sleep(1000);<a name="line.2656"></a>
+<span class="sourceLineNo">2603</span>  @Test<a name="line.2603"></a>
+<span class="sourceLineNo">2604</span>  public void testGet_Empty() throws IOException {<a name="line.2604"></a>
+<span class="sourceLineNo">2605</span>    byte[] row = Bytes.toBytes("row");<a name="line.2605"></a>
+<span class="sourceLineNo">2606</span>    byte[] fam = Bytes.toBytes("fam");<a name="line.2606"></a>
+<span class="sourceLineNo">2607</span><a name="line.2607"></a>
+<span class="sourceLineNo">2608</span>    this.region = initHRegion(tableName, method, CONF, fam);<a name="line.2608"></a>
+<span class="sourceLineNo">2609</span>    Get get = new Get(row);<a name="line.2609"></a>
+<span class="sourceLineNo">2610</span>    get.addFamily(fam);<a name="line.2610"></a>
+<span class="sourceLineNo">2611</span>    Result r = region.get(get);<a name="line.2611"></a>
+<span class="sourceLineNo">2612</span><a name="line.2612"></a>
+<span class="sourceLineNo">2613</span>    assertTrue(r.isEmpty());<a name="line.2613"></a>
+<span class="sourceLineNo">2614</span>  }<a name="line.2614"></a>
+<span class="sourceLineNo">2615</span><a name="line.2615"></a>
+<span class="sourceLineNo">2616</span>  @Test<a name="line.2616"></a>
+<span class="sourceLineNo">2617</span>  public void testGetWithFilter() throws IOException, InterruptedException {<a name="line.2617"></a>
+<span class="sourceLineNo">2618</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2618"></a>
+<span class="sourceLineNo">2619</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2619"></a>
+<span class="sourceLineNo">2620</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.2620"></a>
+<span class="sourceLineNo">2621</span>    byte[] value1 = Bytes.toBytes("value1");<a name="line.2621"></a>
+<span class="sourceLineNo">2622</span>    byte[] value2 = Bytes.toBytes("value2");<a name="line.2622"></a>
+<span class="sourceLineNo">2623</span><a name="line.2623"></a>
+<span class="sourceLineNo">2624</span>    final int maxVersions = 3;<a name="line.2624"></a>
+<span class="sourceLineNo">2625</span>    HColumnDescriptor hcd = new HColumnDescriptor(fam1);<a name="line.2625"></a>
+<span class="sourceLineNo">2626</span>    hcd.setMaxVersions(maxVersions);<a name="line.2626"></a>
+<span class="sourceLineNo">2627</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf("testFilterAndColumnTracker"));<a name="line.2627"></a>
+<span class="sourceLineNo">2628</span>    htd.addFamily(hcd);<a name="line.2628"></a>
+<span class="sourceLineNo">2629</span>    ChunkCreator.initialize(MemStoreLABImpl.CHUNK_SIZE_DEFAULT, false, 0, 0, 0, null);<a name="line.2629"></a>
+<span class="sourceLineNo">2630</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.2630"></a>
+<span class="sourceLineNo">2631</span>    Path logDir = TEST_UTIL.getDataTestDirOnTestFS(method + ".log");<a name="line.2631"></a>
+<span class="sourceLineNo">2632</span>    final WAL wal = HBaseTestingUtility.createWal(TEST_UTIL.getConfiguration(), logDir, info);<a name="line.2632"></a>
+<span class="sourceLineNo">2633</span>    this.region = TEST_UTIL.createLocalHRegion(info, htd, wal);<a name="line.2633"></a>
+<span class="sourceLineNo">2634</span><a name="line.2634"></a>
+<span class="sourceLineNo">2635</span>    // Put 4 version to memstore<a name="line.2635"></a>
+<span class="sourceLineNo">2636</span>    long ts = 0;<a name="line.2636"></a>
+<span class="sourceLineNo">2637</span>    Put put = new Put(row1, ts);<a name="line.2637"></a>
+<span class="sourceLineNo">2638</span>    put.addColumn(fam1, col1, value1);<a name="line.2638"></a>
+<span class="sourceLineNo">2639</span>    region.put(put);<a name="line.2639"></a>
+<span class="sourceLineNo">2640</span>    put = new Put(row1, ts + 1);<a name="line.2640"></a>
+<span class="sourceLineNo">2641</span>    put.addColumn(fam1, col1, Bytes.toBytes("filter1"));<a name="line.2641"></a>
+<span class="sourceLineNo">2642</span>    region.put(put);<a name="line.2642"></a>
+<span class="sourceLineNo">2643</span>    put = new Put(row1, ts + 2);<a name="line.2643"></a>
+<span class="sourceLineNo">2644</span>    put.addColumn(fam1, col1, Bytes.toBytes("filter2"));<a name="line.2644"></a>
+<span class="sourceLineNo">2645</span>    region.put(put);<a name="line.2645"></a>
+<span class="sourceLineNo">2646</span>    put = new Put(row1, ts + 3);<a name="line.2646"></a>
+<span class="sourceLineNo">2647</span>    put.addColumn(fam1, col1, value2);<a name="line.2647"></a>
+<span class="sourceLineNo">2648</span>    region.put(put);<a name="line.2648"></a>
+<span class="sourceLineNo">2649</span><a name="line.2649"></a>
+<span class="sourceLineNo">2650</span>    Get get = new Get(row1);<a name="line.2650"></a>
+<span class="sourceLineNo">2651</span>    get.readAllVersions();<a name="line.2651"></a>
+<span class="sourceLineNo">2652</span>    Result res = region.get(get);<a name="line.2652"></a>
+<span class="sourceLineNo">2653</span>    // Get 3 versions, the oldest version has gone from user view<a name="line.2653"></a>
+<span class="sourceLineNo">2654</span>    assertEquals(maxVersions, res.size());<a name="line.2654"></a>
+<span class="sourceLineNo">2655</span><a name="line.2655"></a>
+<span class="sourceLineNo">2656</span>    get.setFilter(new ValueFilter(CompareOperator.EQUAL, new SubstringComparator("value")));<a name="line.2656"></a>
 <span class="sourceLineNo">2657</span>    res = region.get(get);<a name="line.2657"></a>
-<span class="sourceLineNo">2658</span>    // After flush and compact, the result should be consistent with previous result<a name="line.2658"></a>
-<span class="sourceLineNo">2659</span>    assertEquals(1, res.size());<a name="line.2659"></a>
-<span class="sourceLineNo">2660</span>    assertTrue(CellUtil.matchingValue(new KeyValue(row1, fam1, col1, value2), res.rawCells()[0]));<a name="line.2660"></a>
-<span class="sourceLineNo">2661</span>  }<a name="line.2661"></a>
-<span class="sourceLineNo">2662</span><a name="line.2662"></a>
-<span class="sourceLineNo">2663</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2663"></a>
-<span class="sourceLineNo">2664</span>  // Scanner tests<a name="line.2664"></a>
-<span class="sourceLineNo">2665</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2665"></a>
-<span class="sourceLineNo">2666</span>  @Test<a name="line.2666"></a>
-<span class="sourceLineNo">2667</span>  public void testGetScanner_WithOkFamilies() throws IOException {<a name="line.2667"></a>
-<span class="sourceLineNo">2668</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2668"></a>
-<span class="sourceLineNo">2669</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2669"></a>
-<span class="sourceLineNo">2670</span><a name="line.2670"></a>
-<span class="sourceLineNo">2671</span>    byte[][] families = { fam1, fam2 };<a name="line.2671"></a>
+<span class="sourceLineNo">2658</span>    // When use value filter, the oldest version should still gone from user view and it<a name="line.2658"></a>
+<span class="sourceLineNo">2659</span>    // should only return one key vaule<a name="line.2659"></a>
+<span class="sourceLineNo">2660</span>    assertEquals(1, res.size());<a name="line.2660"></a>
+<span class="sourceLineNo">2661</span>    assertTrue(CellUtil.matchingValue(new KeyValue(row1, fam1, col1, value2), res.rawCells()[0]));<a name="line.2661"></a>
+<span class="sourceLineNo">2662</span>    assertEquals(ts + 3, res.rawCells()[0].getTimestamp());<a name="line.2662"></a>
+<span class="sourceLineNo">2663</span><a name="line.2663"></a>
+<span class="sourceLineNo">2664</span>    region.flush(true);<a name="line.2664"></a>
+<span class="sourceLineNo">2665</span>    region.compact(true);<a name="line.2665"></a>
+<span class="sourceLineNo">2666</span>    Thread.sleep(1000);<a name="line.2666"></a>
+<span class="sourceLineNo">2667</span>    res = region.get(get);<a name="line.2667"></a>
+<span class="sourceLineNo">2668</span>    // After flush and compact, the result should be consistent with previous result<a name="line.2668"></a>
+<span class="sourceLineNo">2669</span>    assertEquals(1, res.size());<a name="line.2669"></a>
+<span class="sourceLineNo">2670</span>    assertTrue(CellUtil.matchingValue(new KeyValue(row1, fam1, col1, value2), res.rawCells()[0]));<a name="line.2670"></a>
+<span class="sourceLineNo">2671</span>  }<a name="line.2671"></a>
 <span class="sourceLineNo">2672</span><a name="line.2672"></a>
-<span class="sourceLineNo">2673</span>    // Setting up region<a name="line.2673"></a>
-<span class="sourceLineNo">2674</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2674"></a>
-<span class="sourceLineNo">2675</span>    Scan scan = new Scan();<a name="line.2675"></a>
-<span class="sourceLineNo">2676</span>    scan.addFamily(fam1);<a name="line.2676"></a>
-<span class="sourceLineNo">2677</span>    scan.addFamily(fam2);<a name="line.2677"></a>
-<span class="sourceLineNo">2678</span>    try {<a name="line.2678"></a>
-<span class="sourceLineNo">2679</span>      region.getScanner(scan);<a name="line.2679"></a>
-<span class="sourceLineNo">2680</span>    } catch (Exception e) {<a name="line.2680"></a>
-<span class="sourceLineNo">2681</span>      assertTrue("Families could not be found in Region", false);<a name="line.2681"></a>
-<span class="sourceLineNo">2682</span>    }<a name="line.2682"></a>
-<span class="sourceLineNo">2683</span>  }<a name="line.2683"></a>
-<span class="sourceLineNo">2684</span><a name="line.2684"></a>
-<span class="sourceLineNo">2685</span>  @Test<a name="line.2685"></a>
-<span class="sourceLineNo">2686</span>  public void testGetScanner_WithNotOkFamilies() throws IOException {<a name="line.2686"></a>
-<span class="sourceLineNo">2687</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2687"></a>
-<span class="sourceLineNo">2688</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2688"></a>
-<span class="sourceLineNo">2689</span><a name="line.2689"></a>
-<span class="sourceLineNo">2690</span>    byte[][] families = { fam1 };<a name="line.2690"></a>
-<span class="sourceLineNo">2691</span><a name="line.2691"></a>
-<span class="sourceLineNo">2692</span>    // Setting up region<a name="line.2692"></a>
-<span class="sourceLineNo">2693</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2693"></a>
-<span class="sourceLineNo">2694</span>    Scan scan = new Scan();<a name="line.2694"></a>
-<span class="sourceLineNo">2695</span>    scan.addFamily(fam2);<a name="line.2695"></a>
-<span class="sourceLineNo">2696</span>    boolean ok = false;<a name="line.2696"></a>
-<span class="sourceLineNo">2697</span>    try {<a name="line.2697"></a>
-<span class="sourceLineNo">2698</span>      region.getScanner(scan);<a name="line.2698"></a>
-<span class="sourceLineNo">2699</span>    } catch (Exception e) {<a name="line.2699"></a>
-<span class="sourceLineNo">2700</span>      ok = true;<a name="line.2700"></a>
-<span class="sourceLineNo">2701</span>    }<a name="line.2701"></a>
-<span class="sourceLineNo">2702</span>    assertTrue("Families could not be found in Region", ok);<a name="line.2702"></a>
-<span class="sourceLineNo">2703</span>  }<a name="line.2703"></a>
-<span class="sourceLineNo">2704</span><a name="line.2704"></a>
-<span class="sourceLineNo">2705</span>  @Test<a name="line.2705"></a>
-<span class="sourceLineNo">2706</span>  public void testGetScanner_WithNoFamilies() throws IOException {<a name="line.2706"></a>
-<span class="sourceLineNo">2707</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2707"></a>
-<span class="sourceLineNo">2708</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2708"></a>
-<span class="sourceLineNo">2709</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2709"></a>
-<span class="sourceLineNo">2710</span>    byte[] fam3 = Bytes.toBytes("fam3");<a name="line.2710"></a>
-<span class="sourceLineNo">2711</span>    byte[] fam4 = Bytes.toBytes("fam4");<a name="line.2711"></a>
-<span class="sourceLineNo">2712</span><a name="line.2712"></a>
-<span class="sourceLineNo">2713</span>    byte[][] families = { fam1, fam2, fam3, fam4 };<a name="line.2713"></a>
+<span class="sourceLineNo">2673</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2673"></a>
+<span class="sourceLineNo">2674</span>  // Scanner tests<a name="line.2674"></a>
+<span class="sourceLineNo">2675</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2675"></a>
+<span class="sourceLineNo">2676</span>  @Test<a name="line.2676"></a>
+<span class="sourceLineNo">2677</span>  public void testGetScanner_WithOkFamilies() throws IOException {<a name="line.2677"></a>
+<span class="sourceLineNo">2678</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2678"></a>
+<span class="sourceLineNo">2679</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2679"></a>
+<span class="sourceLineNo">2680</span><a name="line.2680"></a>
+<span class="sourceLineNo">2681</span>    byte[][] families = { fam1, fam2 };<a name="line.2681"></a>
+<span class="sourceLineNo">2682</span><a name="line.2682"></a>
+<span class="sourceLineNo">2683</span>    // Setting up region<a name="line.2683"></a>
+<span class="sourceLineNo">2684</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2684"></a>
+<span class="sourceLineNo">2685</span>    Scan scan = new Scan();<a name="line.2685"></a>
+<span class="sourceLineNo">2686</span>    scan.addFamily(fam1);<a name="line.2686"></a>
+<span class="sourceLineNo">2687</span>    scan.addFamily(fam2);<a name="line.2687"></a>
+<span class="sourceLineNo">2688</span>    try {<a name="line.2688"></a>
+<span class="sourceLineNo">2689</span>      region.getScanner(scan);<a name="line.2689"></a>
+<span class="sourceLineNo">2690</span>    } catch (Exception e) {<a name="line.2690"></a>
+<span class="sourceLineNo">2691</span>      assertTrue("Families could not be found in Region", false);<a name="line.2691"></a>
+<span class="sourceLineNo">2692</span>    }<a name="line.2692"></a>
+<span class="sourceLineNo">2693</span>  }<a name="line.2693"></a>
+<span class="sourceLineNo">2694</span><a name="line.2694"></a>
+<span class="sourceLineNo">2695</span>  @Test<a name="line.2695"></a>
+<span class="sourceLineNo">2696</span>  public void testGetScanner_WithNotOkFamilies() throws IOException {<a name="line.2696"></a>
+<span class="sourceLineNo">2697</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2697"></a>
+<span class="sourceLineNo">2698</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2698"></a>
+<span class="sourceLineNo">2699</span><a name="line.2699"></a>
+<span class="sourceLineNo">2700</span>    byte[][] families = { fam1 };<a name="line.2700"></a>
+<span class="sourceLineNo">2701</span><a name="line.2701"></a>
+<span class="sourceLineNo">2702</span>    // Setting up region<a name="line.2702"></a>
+<span class="sourceLineNo">2703</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2703"></a>
+<span class="sourceLineNo">2704</span>    Scan scan = new Scan();<a name="line.2704"></a>
+<span class="sourceLineNo">2705</span>    scan.addFamily(fam2);<a name="line.2705"></a>
+<span class="sourceLineNo">2706</span>    boolean ok = false;<a name="line.2706"></a>
+<span class="sourceLineNo">2707</span>    try {<a name="line.2707"></a>
+<span class="sourceLineNo">2708</span>      region.getScanner(scan);<a name="line.2708"></a>
+<span class="sourceLineNo">2709</span>    } catch (Exception e) {<a name="line.2709"></a>
+<span class="sourceLineNo">2710</span>      ok = true;<a name="line.2710"></a>
+<span class="sourceLineNo">2711</span>    }<a name="line.2711"></a>
+<span class="sourceLineNo">2712</span>    assertTrue("Families could not be found in Region", ok);<a name="line.2712"></a>
+<span class="sourceLineNo">2713</span>  }<a name="line.2713"></a>
 <span class="sourceLineNo">2714</span><a name="line.2714"></a>
-<span class="sourceLineNo">2715</span>    // Setting up region<a name="line.2715"></a>
-<span class="sourceLineNo">2716</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2716"></a>
-<span class="sourceLineNo">2717</span>    // Putting data in Region<a name="line.2717"></a>
-<span class="sourceLineNo">2718</span>    Put put = new Put(row1);<a name="line.2718"></a>
-<span class="sourceLineNo">2719</span>    put.addColumn(fam1, null, null);<a name="line.2719"></a>
-<span class="sourceLineNo">2720</span>    put.addColumn(fam2, null, null);<a name="line.2720"></a>
-<span class="sourceLineNo">2721</span>    put.addColumn(fam3, null, null);<a name="line.2721"></a>
-<span class="sourceLineNo">2722</span>    put.addColumn(fam4, null, null);<a name="line.2722"></a>
-<span class="sourceLineNo">2723</span>    region.put(put);<a name="line.2723"></a>
+<span class="sourceLineNo">2715</span>  @Test<a name="line.2715"></a>
+<span class="sourceLineNo">2716</span>  public void testGetScanner_WithNoFamilies() throws IOException {<a name="line.2716"></a>
+<span class="sourceLineNo">2717</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2717"></a>
+<span class="sourceLineNo">2718</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2718"></a>
+<span class="sourceLineNo">2719</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2719"></a>
+<span class="sourceLineNo">2720</span>    byte[] fam3 = Bytes.toBytes("fam3");<a name="line.2720"></a>
+<span class="sourceLineNo">2721</span>    byte[] fam4 = Bytes.toBytes("fam4");<a name="line.2721"></a>
+<span class="sourceLineNo">2722</span><a name="line.2722"></a>
+<span class="sourceLineNo">2723</span>    byte[][] families = { fam1, fam2, fam3, fam4 };<a name="line.2723"></a>
 <span class="sourceLineNo">2724</span><a name="line.2724"></a>
-<span class="sourceLineNo">2725</span>    Scan scan = null;<a name="line.2725"></a>
-<span class="sourceLineNo">2726</span>    HRegion.RegionScannerImpl is = null;<a name="line.2726"></a>
-<span class="sourceLineNo">2727</span><a name="line.2727"></a>
-<span class="sourceLineNo">2728</span>    // Testing to see how many scanners that is produced by getScanner,<a name="line.2728"></a>
-<span class="sourceLineNo">2729</span>    // starting<a name="line.2729"></a>
-<span class="sourceLineNo">2730</span>    // with known number, 2 - current = 1<a name="line.2730"></a>
-<span class="sourceLineNo">2731</span>    scan = new Scan();<a name="line.2731"></a>
-<span class="sourceLineNo">2732</span>    scan.addFamily(fam2);<a name="line.2732"></a>
-<span class="sourceLineNo">2733</span>    scan.addFamily(fam4);<a name="line.2733"></a>
-<span class="sourceLineNo">2734</span>    is = region.getScanner(scan);<a name="line.2734"></a>
-<span class="sourceLineNo">2735</span>    assertEquals(1, is.storeHeap.getHeap().size());<a name="line.2735"></a>
-<span class="sourceLineNo">2736</span><a name="line.2736"></a>
-<span class="sourceLineNo">2737</span>    scan = new Scan();<a name="line.2737"></a>
-<span class="sourceLineNo">2738</span>    is = region.getScanner(scan);<a name="line.2738"></a>
-<span class="sourceLineNo">2739</span>    assertEquals(families.length - 1, is.storeHeap.getHeap().size());<a name="line.2739"></a>
-<span class="sourceLineNo">2740</span>  }<a name="line.2740"></a>
-<span class="sourceLineNo">2741</span><a name="line.2741"></a>
-<span class="sourceLineNo">2742</span>  /**<a name="line.2742"></a>
-<span class="sourceLineNo">2743</span>   * This method tests https://issues.apache.org/jira/browse/HBASE-2516.<a name="line.2743"></a>
-<span class="sourceLineNo">2744</span>   *<a name="line.2744"></a>
-<span class="sourceLineNo">2745</span>   * @throws IOException<a name="line.2745"></a>
-<span class="sourceLineNo">2746</span>   */<a name="line.2746"></a>
-<span class="sourceLineNo">2747</span>  @Test<a name="line.2747"></a>
-<span class="sourceLineNo">2748</span>  public void testGetScanner_WithRegionClosed() throws IOException {<a name="line.2748"></a>
-<span class="sourceLineNo">2749</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2749"></a>
-<span class="sourceLineNo">2750</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2750"></a>
+<span class="sourceLineNo">2725</span>    // Setting up region<a name="line.2725"></a>
+<span class="sourceLineNo">2726</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2726"></a>
+<span class="sourceLineNo">2727</span>    // Putting data in Region<a name="line.2727"></a>
+<span class="sourceLineNo">2728</span>    Put put = new Put(row1);<a name="line.2728"></a>
+<span class="sourceLineNo">2729</span>    put.addColumn(fam1, null, null);<a name="line.2729"></a>
+<span class="sourceLineNo">2730</span>    put.addColumn(fam2, null, null);<a name="line.2730"></a>
+<span class="sourceLineNo">2731</span>    put.addColumn(fam3, null, null);<a name="line.2731"></a>
+<span class="sourceLineNo">2732</span>    put.addColumn(fam4, null, null);<a name="line.2732"></a>
+<span class="sourceLineNo">2733</span>    region.put(put);<a name="line.2733"></a>
+<span class="sourceLineNo">2734</span><a name="line.2734"></a>
+<span class="sourceLineNo">2735</span>    Scan scan = null;<a name="line.2735"></a>
+<span class="sourceLineNo">2736</span>    HRegion.RegionScannerImpl is = null;<a name="line.2736"></a>
+<span class="sourceLineNo">2737</span><a name="line.2737"></a>
+<span class="sourceLineNo">2738</span>    // Testing to see how many scanners that is produced by getScanner,<a name="line.2738"></a>
+<span class="sourceLineNo">2739</span>    // starting<a name="line.2739"></a>
+<span class="sourceLineNo">2740</span>    // with known number, 2 - current = 1<a name="line.2740"></a>
+<span class="sourceLineNo">2741</span>    scan = new Scan();<a name="line.2741"></a>
+<span class="sourceLineNo">2742</span>    scan.addFamily(fam2);<a name="line.2742"></a>
+<span class="sourceLineNo">2743</span>    scan.addFamily(fam4);<a name="line.2743"></a>
+<span class="sourceLineNo">2744</span>    is = region.getScanner(scan);<a name="line.2744"></a>
+<span class="sourceLineNo">2745</span>    assertEquals(1, is.storeHeap.getHeap().size());<a name="line.2745"></a>
+<span class="sourceLineNo">2746</span><a name="line.2746"></a>
+<span class="sourceLineNo">2747</span>    scan = new Scan();<a name="line.2747"></a>
+<span class="sourceLineNo">2748</span>    is = region.getScanner(scan);<a name="line.2748"></a>
+<span class="sourceLineNo">2749</span>    assertEquals(families.length - 1, is.storeHeap.getHeap().size());<a name="line.2749"></a>
+<span class="sourceLineNo">2750</span>  }<a name="line.2750"></a>
 <span class="sourceLineNo">2751</span><a name="line.2751"></a>
-<span class="sourceLineNo">2752</span>    byte[][] families = { fam1, fam2 };<a name="line.2752"></a>
-<span class="sourceLineNo">2753</span><a name="line.2753"></a>
-<span class="sourceLineNo">2754</span>    // Setting up region<a name="line.2754"></a>
-<span class="sourceLineNo">2755</span>    try {<a name="line.2755"></a>
-<span class="sourceLineNo">2756</span>      this.region = initHRegion(tableName, method, CONF, families);<a name="line.2756"></a>
-<span class="sourceLineNo">2757</span>    } catch (IOException e) {<a name="line.2757"></a>
-<span class="sourceLineNo">2758</span>      e.printStackTrace();<a name="line.2758"></a>
-<span class="sourceLineNo">2759</span>      fail("Got IOException during initHRegion, " + e.getMessage());<a name="line.2759"></a>
-<span class="sourceLineNo">2760</span>    }<a name="line.2760"></a>
-<span class="sourceLineNo">2761</span>    region.closed.set(true);<a name="line.2761"></a>
-<span class="sourceLineNo">2762</span>    try {<a name="line.2762"></a>
-<span class="sourceLineNo">2763</span>      region.getScanner(null);<a name="line.2763"></a>
-<span class="sourceLineNo">2764</span>      fail("Expected to get an exception during getScanner on a region that is closed");<a name="line.2764"></a>
-<span class="sourceLineNo">2765</span>    } catch (NotServingRegionException e) {<a name="line.2765"></a>
-<span class="sourceLineNo">2766</span>      // this is the correct exception that is expected<a name="line.2766"></a>
+<span class="sourceLineNo">2752</span>  /**<a name="line.2752"></a>
+<span class="sourceLineNo">2753</span>   * This method tests https://issues.apache.org/jira/browse/HBASE-2516.<a name="line.2753"></a>
+<span class="sourceLineNo">2754</span>   *<a name="line.2754"></a>
+<span class="sourceLineNo">2755</span>   * @throws IOException<a name="line.2755"></a>
+<span class="sourceLineNo">2756</span>   */<a name="line.2756"></a>
+<span class="sourceLineNo">2757</span>  @Test<a name="line.2757"></a>
+<span class="sourceLineNo">2758</span>  public void testGetScanner_WithRegionClosed() throws IOException {<a name="line.2758"></a>
+<span class="sourceLineNo">2759</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2759"></a>
+<span class="sourceLineNo">2760</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2760"></a>
+<span class="sourceLineNo">2761</span><a name="line.2761"></a>
+<span class="sourceLineNo">2762</span>    byte[][] families = { fam1, fam2 };<a name="line.2762"></a>
+<span class="sourceLineNo">2763</span><a name="line.2763"></a>
+<span class="sourceLineNo">2764</span>    // Setting up region<a name="line.2764"></a>
+<span class="sourceLineNo">2765</span>    try {<a name="line.2765"></a>
+<span class="sourceLineNo">2766</span>      this.region = initHRegion(tableName, method, CONF, families);<a name="line.2766"></a>
 <span class="sourceLineNo">2767</span>    } catch (IOException e) {<a name="line.2767"></a>
-<span class="sourceLineNo">2768</span>      fail("Got wrong type of exception - should be a NotServingRegionException, " +<a name="line.2768"></a>
-<span class="sourceLineNo">2769</span>          "but was an IOException: "<a name="line.2769"></a>
-<span class="sourceLineNo">2770</span>          + e.getMessage());<a name="line.2770"></a>
-<span class="sourceLineNo">2771</span>    }<a name="line.2771"></a>
-<span class="sourceLineNo">2772</span>  }<a name="line.2772"></a>
-<span class="sourceLineNo">2773</span><a name="line.2773"></a>
-<span class="sourceLineNo">2774</span>  @Test<a name="line.2774"></a>
-<span class="sourceLineNo">2775</span>  public void testRegionScanner_Next() throws IOException {<a name="line.2775"></a>
-<span class="sourceLineNo">2776</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2776"></a>
-<span class="sourceLineNo">2777</span>    byte[] row2 = Bytes.toBytes("row2");<a name="line.2777"></a>
-<span class="sourceLineNo">2778</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2778"></a>
-<span class="sourceLineNo">2779</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2779"></a>
-<span class="sourceLineNo">2780</span>    byte[] fam3 = Bytes.toBytes("fam3");<a name="line.2780"></a>
-<span class="sourceLineNo">2781</span>    byte[] fam4 = Bytes.toBytes("fam4");<a name="line.2781"></a>
-<span class="sourceLineNo">2782</span><a name="line.2782"></a>
-<span class="sourceLineNo">2783</span>    byte[][] families = { fam1, fam2, fam3, fam4 };<a name="line.2783"></a>
-<span class="sourceLineNo">2784</span>    long ts = System.currentTimeMillis();<a name="line.2784"></a>
-<span class="sourceLineNo">2785</span><a name="line.2785"></a>
-<span class="sourceLineNo">2786</span>    // Setting up region<a name="line.2786"></a>
-<span class="sourceLineNo">2787</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2787"></a>
-<span class="sourceLineNo">2788</span>    // Putting data in Region<a name="line.2788"></a>
-<span class="sourceLineNo">2789</span>    Put put = null;<a name="line.2789"></a>
-<span class="sourceLineNo">2790</span>    put = new Put(row1);<a name="line.2790"></a>
-<span class="sourceLineNo">2791</span>    put.addColumn(fam1, (byte[]) null, ts, null);<a name="line.2791"></a>
-<span class="sourceLineNo">2792</span>    put.addColumn(fam2, (byte[]) null, ts, null);<a name="line.2792"></a>
-<span class="sourceLineNo">2793</span>    put.addColumn(fam3, (byte[]) null, ts, null);<a name="line.2793"></a>
-<span class="sourceLineNo">2794</span>    put.addColumn(fam4, (byte[]) null, ts, null);<a name="line.2794"></a>
-<span class="sourceLineNo">2795</span>    region.put(put);<a name="line.2795"></a>
-<span class="sourceLineNo">2796</span><a name="line.2796"></a>
-<span class="sourceLineNo">2797</span>    put = new Put(row2);<a name="line.2797"></a>
-<span class="sourceLineNo">2798</span>    put.addColumn(fam1, (byte[]) null, ts, null);<a name="line.2798"></a>
-<span class="sourceLineNo">2799</span>    put.addColumn(fam2, (byte[]) null, ts, null);<a name="line.2799"></a>
-<span class="sourceLineNo">2800</span>    put.addColumn(fam3, (byte[]) null, ts, null);<a name="line.2800"></a>
-<span class="sourceLineNo">2801</span>    put.addColumn(fam4, (byte[]) null, ts, null);<a name="line.2801"></a>
-<span class="sourceLineNo">2802</span>    region.put(put);<a name="line.2802"></a>
-<span class="sourceLineNo">2803</span><a name="line.2803"></a>
-<span class="sourceLineNo">2804</span>    Scan scan = new Scan();<a name="line.2804"></a>
-<span class="sourceLineNo">2805</span>    scan.addFamily(fam2);<a name="line.2805"></a>
-<span class="sourceLineNo">2806</span>    scan.addFamily(fam4);<a name="line.2806"></a>
-<span class="sourceLineNo">2807</span>    InternalScanner is = region.getScanner(scan);<a name="line.2807"></a>
-<span class="sourceLineNo">2808</span><a name="line.2808"></a>
-<span class="sourceLineNo">2809</span>    List&lt;Cell&gt; res = null;<a name="line.2809"></a>
-<span class="sourceLineNo">2810</span><a name="line.2810"></a>
-<span class="sourceLineNo">2811</span>    // Result 1<a name="line.2811"></a>
-<span class="sourceLineNo">2812</span>    List&lt;Cell&gt; expected1 = new ArrayList&lt;&gt;();<a name="line.2812"></a>
-<span class="sourceLineNo">2813</span>    expected1.add(new KeyValue(row1, fam2, null, ts, KeyValue.Type.Put, null));<a name="line.2813"></a>
-<span class="sourceLineNo">2814</span>    expected1.add(new KeyValue(row1, fam4, null, ts, KeyValue.Type.Put, null));<a name="line.2814"></a>
-<span class="sourceLineNo">2815</span><a name="line.2815"></a>
-<span class="sourceLineNo">2816</span>    res = new ArrayList&lt;&gt;();<a name="line.2816"></a>
-<span class="sourceLineNo">2817</span>    is.next(res);<a name="line.2817"></a>
-<span class="sourceLineNo">2818</span>    for (int i = 0; i &lt; res.size(); i++) {<a name="line.2818"></a>
-<span class="sourceLineNo">2819</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected1.get(i), res.get(i)));<a name="line.2819"></a>
-<span class="sourceLineNo">2820</span>    }<a name="line.2820"></a>
-<span class="sourceLineNo">2821</span><a name="line.2821"></a>
-<span class="sourceLineNo">2822</span>    // Result 2<a name="line.2822"></a>
-<span class="sourceLineNo">2823</span>    List&lt;Cell&gt; expected2 = new ArrayList&lt;&gt;();<a name="line.2823"></a>
-<span class="sourceLineNo">2824</span>    expected2.add(new KeyValue(row2, fam2, null, ts, KeyValue.Type.Put, null));<a name="line.2824"></a>
-<span class="sourceLineNo">2825</span>    expected2.add(new KeyValue(row2, fam4, null, ts, KeyValue.Type.Put, null));<a name="line.2825"></a>
-<span class="sourceLineNo">2826</span><a name="line.2826"></a>
-<span class="sourceLineNo">2827</span>    res = new ArrayList&lt;&gt;();<a name="line.2827"></a>
-<span class="sourceLineNo">2828</span>    is.next(res);<a name="line.2828"></a>
-<span class="sourceLineNo">2829</span>    for (int i = 0; i &lt; res.size(); i++) {<a name="line.2829"></a>
-<span class="sourceLineNo">2830</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected2.get(i), res.get(i)));<a name="line.2830"></a>
-<span class="sourceLineNo">2831</span>    }<a name="line.2831"></a>
-<span class="sourceLineNo">2832</span>  }<a name="line.2832"></a>
-<span class="sourceLineNo">2833</span><a name="line.2833"></a>
-<span class="sourceLineNo">2834</span>  @Test<a name="line.2834"></a>
-<span class="sourceLineNo">2835</span>  public void testScanner_ExplicitColumns_FromMemStore_EnforceVersions() throws IOException {<a name="line.2835"></a>
-<span class="sourceLineNo">2836</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2836"></a>
-<span class="sourceLineNo">2837</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.2837"></a>
-<span class="sourceLineNo">2838</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.2838"></a>
-<span class="sourceLineNo">2839</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2839"></a>
-<span class="sourceLineNo">2840</span>    byte[][] families = { fam1 };<a name="line.2840"></a>
-<span class="sourceLineNo">2841</span><a name="line.2841"></a>
-<span class="sourceLineNo">2842</span>    long ts1 = System.currentTimeMillis();<a name="line.2842"></a>
-<span class="sourceLineNo">2843</span>    long ts2 = ts1 + 1;<a name="line.2843"></a>
-<span class="sourceLineNo">2844</span>    long ts3 = ts1 + 2;<a name="line.2844"></a>
-<span class="sourceLineNo">2845</span><a name="line.2845"></a>
-<span class="sourceLineNo">2846</span>    // Setting up region<a name="line.2846"></a>
-<span class="sourceLineNo">2847</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2847"></a>
-<span class="sourceLineNo">2848</span>    // Putting data in Region<a name="line.2848"></a>
-<span class="sourceLineNo">2849</span>    Put put = null;<a name="line.2849"></a>
-<span class="sourceLineNo">2850</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.2850"></a>
-<span class="sourceLineNo">2851</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.2851"></a>
-<span class="sourceLineNo">2852</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.2852"></a>
-<span class="sourceLineNo">2853</span><a name="line.2853"></a>
-<span class="sourceLineNo">2854</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.2854"></a>
-<span class="sourceLineNo">2855</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.2855"></a>
-<span class="sourceLineNo">2856</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.2856"></a>
-<span class="sourceLineNo">2857</span><a name="line.2857"></a>
-<span class="sourceLineNo">2858</span>    put = new Put(row1);<a name="line.2858"></a>
-<span class="sourceLineNo">2859</span>    put.add(kv13);<a name="line.2859"></a>
-<span class="sourceLineNo">2860</span>    put.add(kv12);<a name="line.2860"></a>
-<span class="sourceLineNo">2861</span>    put.add(kv11);<a name="line.2861"></a>
-<span class="sourceLineNo">2862</span>    put.add(kv23);<a name="line.2862"></a>
-<span class="sourceLineNo">2863</span>    put.add(kv22);<a name="line.2863"></a>
-<span class="sourceLineNo">2864</span>    put.add(kv21);<a name="line.2864"></a>
-<span class="sourceLineNo">2865</span>    region.put(put);<a name="line.2865"></a>
-<span class="sourceLineNo">2866</span><a name="line.2866"></a>
-<span class="sourceLineNo">2867</span>    // Expected<a name="line.2867"></a>
-<span class="sourceLineNo">2868</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.2868"></a>
-<span class="sourceLineNo">2869</span>    expected.add(kv13);<a name="line.2869"></a>
-<span class="sourceLineNo">2870</span>    expected.add(kv12);<a name="line.2870"></a>
-<span class="sourceLineNo">2871</span><a name="line.2871"></a>
-<span class="sourceLineNo">2872</span>    Scan scan = new Scan(row1);<a name="line.2872"></a>
-<span class="sourceLineNo">2873</span>    scan.addColumn(fam1, qf1);<a name="line.2873"></a>
-<span class="sourceLineNo">2874</span>    scan.setMaxVersions(MAX_VERSIONS);<a name="line.2874"></a>
-<span class="sourceLineNo">2875</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.2875"></a>
-<span class="sourceLineNo">2876</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.2876"></a>
-<span class="sourceLineNo">2877</span><a name="line.2877"></a>
-<span class="sourceLineNo">2878</span>    boolean hasNext = scanner.next(actual);<a name="line.2878"></a>
-<span class="sourceLineNo">2879</span>    assertEquals(false, hasNext);<a name="line.2879"></a>
-<span class="sourceLineNo">2880</span><a name="line.2880"></a>
-<span class="sourceLineNo">2881</span>    // Verify result<a name="line.2881"></a>
-<span class="sourceLineNo">2882</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.2882"></a>
-<span class="sourceLineNo">2883</span>      assertEquals(expected.get(i), actual.get(i));<a name="line.2883"></a>
-<span class="sourceLineNo">2884</span>    }<a name="line.2884"></a>
-<span class="sourceLineNo">2885</span>  }<a name="line.2885"></a>
-<span class="sourceLineNo">2886</span><a name="line.2886"></a>
-<span class="sourceLineNo">2887</span>  @Test<a name="line.2887"></a>
-<span class="sourceLineNo">2888</span>  public void testScanner_ExplicitColumns_FromFilesOnly_EnforceVersions() throws IOException {<a name="line.2888"></a>
-<span class="sourceLineNo">2889</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2889"></a>
-<span class="sourceLineNo">2890</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.2890"></a>
-<span class="sourceLineNo">2891</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.2891"></a>
-<span class="sourceLineNo">2892</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2892"></a>
-<span class="sourceLineNo">2893</span>    byte[][] families = { fam1 };<a name="line.2893"></a>
-<span class="sourceLineNo">2894</span><a name="line.2894"></a>
-<span class="sourceLineNo">2895</span>    long ts1 = 1; // System.currentTimeMillis();<a name="line.2895"></a>
-<span class="sourceLineNo">2896</span>    long ts2 = ts1 + 1;<a name="line.2896"></a>
-<span class="sourceLineNo">2897</span>    long ts3 = ts1 + 2;<a name="line.2897"></a>
-<span class="sourceLineNo">2898</span><a name="line.2898"></a>
-<span class="sourceLineNo">2899</span>    // Setting up region<a name="line.2899"></a>
-<span class="sourceLineNo">2900</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2900"></a>
-<span class="sourceLineNo">2901</span>    // Putting data in Region<a name="line.2901"></a>
-<span class="sourceLineNo">2902</span>    Put put = null;<a name="line.2902"></a>
-<span class="sourceLineNo">2903</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.2903"></a>
-<span class="sourceLineNo">2904</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.2904"></a>
-<span class="sourceLineNo">2905</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.2905"></a>
-<span class="sourceLineNo">2906</span><a name="line.2906"></a>
-<span class="sourceLineNo">2907</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.2907"></a>
-<span class="sourceLineNo">2908</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.2908"></a>
-<span class="sourceLineNo">2909</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.2909"></a>
-<span class="sourceLineNo">2910</span><a name="line.2910"></a>
-<span class="sourceLineNo">2911</span>    put = new Put(row1);<a name="line.2911"></a>
-<span class="sourceLineNo">2912</span>    put.add(kv13);<a name="line.2912"></a>
-<span class="sourceLineNo">2913</span>    put.add(kv12);<a name="line.2913"></a>
-<span class="sourceLineNo">2914</span>    put.add(kv11);<a name="line.2914"></a>
-<span class="sourceLineNo">2915</span>    put.add(kv23);<a name="line.2915"></a>
-<span class="sourceLineNo">2916</span>    put.add(kv22);<a name="line.2916"></a>
-<span class="sourceLineNo">2917</span>    put.add(kv21);<a name="line.2917"></a>
-<span class="sourceLineNo">2918</span>    region.put(put);<a name="line.2918"></a>
-<span class="sourceLineNo">2919</span>    region.flush(true);<a name="line.2919"></a>
+<span class="sourceLineNo">2768</span>      e.printStackTrace();<a name="line.2768"></a>
+<span class="sourceLineNo">2769</span>      fail("Got IOException during initHRegion, " + e.getMessage());<a name="line.2769"></a>
+<span class="sourceLineNo">2770</span>    }<a name="line.2770"></a>
+<span class="sourceLineNo">2771</span>    region.closed.set(true);<a name="line.2771"></a>
+<span class="sourceLineNo">2772</span>    try {<a name="line.2772"></a>
+<span class="sourceLineNo">2773</span>      region.getScanner(null);<a name="line.2773"></a>
+<span class="sourceLineNo">2774</span>      fail("Expected to get an exception during getScanner on a region that is closed");<a name="line.2774"></a>
+<span class="sourceLineNo">2775</span>    } catch (NotServingRegionException e) {<a name="line.2775"></a>
+<span class="sourceLineNo">2776</span>      // this is the correct exception that is expected<a name="line.2776"></a>
+<span class="sourceLineNo">2777</span>    } catch (IOException e) {<a name="line.2777"></a>
+<span class="sourceLineNo">2778</span>      fail("Got wrong type of exception - should be a NotServingRegionException, " +<a name="line.2778"></a>
+<span class="sourceLineNo">2779</span>          "but was an IOException: "<a name="line.2779"></a>
+<span class="sourceLineNo">2780</span>          + e.getMessage());<a name="line.2780"></a>
+<span class="sourceLineNo">2781</span>    }<a name="line.2781"></a>
+<span class="sourceLineNo">2782</span>  }<a name="line.2782"></a>
+<span class="sourceLineNo">2783</span><a name="line.2783"></a>
+<span class="sourceLineNo">2784</span>  @Test<a name="line.2784"></a>
+<span class="sourceLineNo">2785</span>  public void testRegionScanner_Next() throws IOException {<a name="line.2785"></a>
+<span class="sourceLineNo">2786</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2786"></a>
+<span class="sourceLineNo">2787</span>    byte[] row2 = Bytes.toBytes("row2");<a name="line.2787"></a>
+<span class="sourceLineNo">2788</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2788"></a>
+<span class="sourceLineNo">2789</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2789"></a>
+<span class="sourceLineNo">2790</span>    byte[] fam3 = Bytes.toBytes("fam3");<a name="line.2790"></a>
+<span class="sourceLineNo">2791</span>    byte[] fam4 = Bytes.toBytes("fam4");<a name="line.2791"></a>
+<span class="sourceLineNo">2792</span><a name="line.2792"></a>
+<span class="sourceLineNo">2793</span>    byte[][] families = { fam1, fam2, fam3, fam4 };<a name="line.2793"></a>
+<span class="sourceLineNo">2794</span>    long ts = System.currentTimeMillis();<a name="line.2794"></a>
+<span class="sourceLineNo">2795</span><a name="line.2795"></a>
+<span class="sourceLineNo">2796</span>    // Setting up region<a name="line.2796"></a>
+<span class="sourceLineNo">2797</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2797"></a>
+<span class="sourceLineNo">2798</span>    // Putting data in Region<a name="line.2798"></a>
+<span class="sourceLineNo">2799</span>    Put put = null;<a name="line.2799"></a>
+<span class="sourceLineNo">2800</span>    put = new Put(row1);<a name="line.2800"></a>
+<span class="sourceLineNo">2801</span>    put.addColumn(fam1, (byte[]) null, ts, null);<a name="line.2801"></a>
+<span class="sourceLineNo">2802</span>    put.addColumn(fam2, (byte[]) null, ts, null);<a name="line.2802"></a>
+<span class="sourceLineNo">2803</span>    put.addColumn(fam3, (byte[]) null, ts, null);<a name="line.2803"></a>
+<span class="sourceLineNo">2804</span>    put.addColumn(fam4, (byte[]) null, ts, null);<a name="line.2804"></a>
+<span class="sourceLineNo">2805</span>    region.put(put);<a name="line.2805"></a>
+<span class="sourceLineNo">2806</span><a name="line.2806"></a>
+<span class="sourceLineNo">2807</span>    put = new Put(row2);<a name="line.2807"></a>
+<span class="sourceLineNo">2808</span>    put.addColumn(fam1, (byte[]) null, ts, null);<a name="line.2808"></a>
+<span class="sourceLineNo">2809</span>    put.addColumn(fam2, (byte[]) null, ts, null);<a name="line.2809"></a>
+<span class="sourceLineNo">2810</span>    put.addColumn(fam3, (byte[]) null, ts, null);<a name="line.2810"></a>
+<span class="sourceLineNo">2811</span>    put.addColumn(fam4, (byte[]) null, ts, null);<a name="line.2811"></a>
+<span class="sourceLineNo">2812</span>    region.put(put);<a name="line.2812"></a>
+<span class="sourceLineNo">2813</span><a name="line.2813"></a>
+<span class="sourceLineNo">2814</span>    Scan scan = new Scan();<a name="line.2814"></a>
+<span class="sourceLineNo">2815</span>    scan.addFamily(fam2);<a name="line.2815"></a>
+<span class="sourceLineNo">2816</span>    scan.addFamily(fam4);<a name="line.2816"></a>
+<span class="sourceLineNo">2817</span>    InternalScanner is = region.getScanner(scan);<a name="line.2817"></a>
+<span class="sourceLineNo">2818</span><a name="line.2818"></a>
+<span class="sourceLineNo">2819</span>    List&lt;Cell&gt; res = null;<a name="line.2819"></a>
+<span class="sourceLineNo">2820</span><a name="line.2820"></a>
+<span class="sourceLineNo">2821</span>    // Result 1<a name="line.2821"></a>
+<span class="sourceLineNo">2822</span>    List&lt;Cell&gt; expected1 = new ArrayList&lt;&gt;();<a name="line.2822"></a>
+<span class="sourceLineNo">2823</span>    expected1.add(new KeyValue(row1, fam2, null, ts, KeyValue.Type.Put, null));<a name="line.2823"></a>
+<span class="sourceLineNo">2824</span>    expected1.add(new KeyValue(row1, fam4, null, ts, KeyValue.Type.Put, null));<a name="line.2824"></a>
+<span class="sourceLineNo">2825</span><a name="line.2825"></a>
+<span class="sourceLineNo">2826</span>    res = new ArrayList&lt;&gt;();<a name="line.2826"></a>
+<span class="sourceLineNo">2827</span>    is.next(res);<a name="line.2827"></a>
+<span class="sourceLineNo">2828</span>    for (int i = 0; i &lt; res.size(); i++) {<a name="line.2828"></a>
+<span class="sourceLineNo">2829</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected1.get(i), res.get(i)));<a name="line.2829"></a>
+<span class="sourceLineNo">2830</span>    }<a name="line.2830"></a>
+<span class="sourceLineNo">2831</span><a name="line.2831"></a>
+<span class="sourceLineNo">2832</span>    // Result 2<a name="line.2832"></a>
+<span class="sourceLineNo">2833</span>    List&lt;Cell&gt; expected2 = new ArrayList&lt;&gt;();<a name="line.2833"></a>
+<span class="sourceLineNo">2834</span>    expected2.add(new KeyValue(row2, fam2, null, ts, KeyValue.Type.Put, null));<a name="line.2834"></a>
+<span class="sourceLineNo">2835</span>    expected2.add(new KeyValue(row2, fam4, null, ts, KeyValue.Type.Put, null));<a name="line.2835"></a>
+<span class="sourceLineNo">2836</span><a name="line.2836"></a>
+<span class="sourceLineNo">2837</span>    res = new ArrayList&lt;&gt;();<a name="line.2837"></a>
+<span class="sourceLineNo">2838</span>    is.next(res);<a name="line.2838"></a>
+<span class="sourceLineNo">2839</span>    for (int i = 0; i &lt; res.size(); i++) {<a name="line.2839"></a>
+<span class="sourceLineNo">2840</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected2.get(i), res.get(i)));<a name="line.2840"></a>
+<span class="sourceLineNo">2841</span>    }<a name="line.2841"></a>
+<span class="sourceLineNo">2842</span>  }<a name="line.2842"></a>
+<span class="sourceLineNo">2843</span><a name="line.2843"></a>
+<span class="sourceLineNo">2844</span>  @Test<a name="line.2844"></a>
+<span class="sourceLineNo">2845</span>  public void testScanner_ExplicitColumns_FromMemStore_EnforceVersions() throws IOException {<a name="line.2845"></a>
+<span class="sourceLineNo">2846</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2846"></a>
+<span class="sourceLineNo">2847</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.2847"></a>
+<span class="sourceLineNo">2848</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.2848"></a>
+<span class="sourceLineNo">2849</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2849"></a>
+<span class="sourceLineNo">2850</span>    byte[][] families = { fam1 };<a name="line.2850"></a>
+<span class="sourceLineNo">2851</span><a name="line.2851"></a>
+<span class="sourceLineNo">2852</span>    long ts1 = System.currentTimeMillis();<a name="line.2852"></a>
+<span class="sourceLineNo">2853</span>    long ts2 = ts1 + 1;<a name="line.2853"></a>
+<span class="sourceLineNo">2854</span>    long ts3 = ts1 + 2;<a name="line.2854"></a>
+<span class="sourceLineNo">2855</span><a name="line.2855"></a>
+<span class="sourceLineNo">2856</span>    // Setting up region<a name="line.2856"></a>
+<span class="sourceLineNo">2857</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2857"></a>
+<span class="sourceLineNo">2858</span>    // Putting data in Region<a name="line.2858"></a>
+<span class="sourceLineNo">2859</span>    Put put = null;<a name="line.2859"></a>
+<span class="sourceLineNo">2860</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.2860"></a>
+<span class="sourceLineNo">2861</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.2861"></a>
+<span class="sourceLineNo">2862</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.2862"></a>
+<span class="sourceLineNo">2863</span><a name="line.2863"></a>
+<span class="sourceLineNo">2864</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.2864"></a>
+<span class="sourceLineNo">2865</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.2865"></a>
+<span class="sourceLineNo">2866</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.2866"></a>
+<span class="sourceLineNo">2867</span><a name="line.2867"></a>
+<span class="sourceLineNo">2868</span>    put = new Put(row1);<a name="line.2868"></a>
+<span class="sourceLineNo">2869</span>    put.add(kv13);<a name="line.2869"></a>
+<span class="sourceLineNo">2870</span>    put.add(kv12);<a name="line.2870"></a>
+<span class="sourceLineNo">2871</span>    put.add(kv11);<a name="line.2871"></a>
+<span class="sourceLineNo">2872</span>    put.add(kv23);<a name="line.2872"></a>
+<span class="sourceLineNo">2873</span>    put.add(kv22);<a name="line.2873"></a>
+<span class="sourceLineNo">2874</span>    put.add(kv21);<a name="line.2874"></a>
+<span class="sourceLineNo">2875</span>    region.put(put);<a name="line.2875"></a>
+<span class="sourceLineNo">2876</span><a name="line.2876"></a>
+<span class="sourceLineNo">2877</span>    // Expected<a name="line.2877"></a>
+<span class="sourceLineNo">2878</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.2878"></a>
+<span class="sourceLineNo">2879</span>    expected.add(kv13);<a name="line.2879"></a>
+<span class="sourceLineNo">2880</span>    expected.add(kv12);<a name="line.2880"></a>
+<span class="sourceLineNo">2881</span><a name="line.2881"></a>
+<span class="sourceLineNo">2882</span>    Scan scan = new Scan(row1);<a name="line.2882"></a>
+<span class="sourceLineNo">2883</span>    scan.addColumn(fam1, qf1);<a name="line.2883"></a>
+<span class="sourceLineNo">2884</span>    scan.setMaxVersions(MAX_VERSIONS);<a name="line.2884"></a>
+<span class="sourceLineNo">2885</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.2885"></a>
+<span class="sourceLineNo">2886</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.2886"></a>
+<span class="sourceLineNo">2887</span><a name="line.2887"></a>
+<span class="sourceLineNo">2888</span>    boolean hasNext = scanner.next(actual);<a name="line.2888"></a>
+<span class="sourceLineNo">2889</span>    assertEquals(false, hasNext);<a name="line.2889"></a>
+<span class="sourceLineNo">2890</span><a name="line.2890"></a>
+<span class="sourceLineNo">2891</span>    // Verify result<a name="line.2891"></a>
+<span class="sourceLineNo">2892</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.2892"></a>
+<span class="sourceLineNo">2893</span>      assertEquals(expected.get(i), actual.get(i));<a name="line.2893"></a>
+<span class="sourceLineNo">2894</span>    }<a name="line.2894"></a>
+<span class="sourceLineNo">2895</span>  }<a name="line.2895"></a>
+<span class="sourceLineNo">2896</span><a name="line.2896"></a>
+<span class="sourceLineNo">2897</span>  @Test<a name="line.2897"></a>
+<span class="sourceLineNo">2898</span>  public void testScanner_ExplicitColumns_FromFilesOnly_EnforceVersions() throws IOException {<a name="line.2898"></a>
+<span class="sourceLineNo">2899</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2899"></a>
+<span class="sourceLineNo">2900</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.2900"></a>
+<span class="sourceLineNo">2901</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.2901"></a>
+<span class="sourceLineNo">2902</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2902"></a>
+<span class="sourceLineNo">2903</span>    byte[][] families = { fam1 };<a name="line.2903"></a>
+<span class="sourceLineNo">2904</span><a name="line.2904"></a>
+<span class="sourceLineNo">2905</span>    long ts1 = 1; // System.currentTimeMillis();<a name="line.2905"></a>
+<span class="sourceLineNo">2906</span>    long ts2 = ts1 + 1;<a name="line.2906"></a>
+<span class="sourceLineNo">2907</span>    long ts3 = ts1 + 2;<a name="line.2907"></a>
+<span class="sourceLineNo">2908</span><a name="line.2908"></a>
+<span class="sourceLineNo">2909</span>    // Setting up region<a name="line.2909"></a>
+<span class="sourceLineNo">2910</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2910"></a>
+<span class="sourceLineNo">2911</span>    // Putting data in Region<a name="line.2911"></a>
+<span class="sourceLineNo">2912</span>    Put put = null;<a name="line.2912"></a>
+<span class="sourceLineNo">2913</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.2913"></a>
+<span class="sourceLineNo">2914</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.2914"></a>
+<span class="sourceLineNo">2915</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.2915"></a>
+<span class="sourceLineNo">2916</span><a name="line.2916"></a>
+<span class="sourceLineNo">2917</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.2917"></a>
+<span class="sourceLineNo">2918</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.2918"></a>
+<span class="sourceLineNo">2919</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.2919"></a>
 <span class="sourceLineNo">2920</span><a name="line.2920"></a>
-<span class="sourceLineNo">2921</span>    // Expected<a name="line.2921"></a>
-<span class="sourceLineNo">2922</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.2922"></a>
-<span class="sourceLineNo">2923</span>    expected.add(kv13);<a name="line.2923"></a>
-<span class="sourceLineNo">2924</span>    expected.add(kv12);<a name="line.2924"></a>
-<span class="sourceLineNo">2925</span>    expected.add(kv23);<a name="line.2925"></a>
-<span class="sourceLineNo">2926</span>    expected.add(kv22);<a name="line.2926"></a>
-<span class="sourceLineNo">2927</span><a name="line.2927"></a>
-<span class="sourceLineNo">2928</span>    Scan scan = new Scan(row1);<a name="line.2928"></a>
-<span class="sourceLineNo">2929</span>    scan.addColumn(fam1, qf1);<a name="line.2929"></a>
-<span class="sourceLineNo">2930</span>    scan.addColumn(fam1, qf2);<a name="line.2930"></a>
-<span class="sourceLineNo">2931</span>    scan.setMaxVersions(MAX_VERSIONS);<a name="line.2931"></a>
-<span class="sourceLineNo">2932</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.2932"></a>
-<span class="sourceLineNo">2933</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.2933"></a>
-<span class="sourceLineNo">2934</span><a name="line.2934"></a>
-<span class="sourceLineNo">2935</span>    boolean hasNext = scanner.next(actual);<a name="line.2935"></a>
-<span class="sourceLineNo">2936</span>    assertEquals(false, hasNext);<a name="line.2936"></a>
+<span class="sourceLineNo">2921</span>    put = new Put(row1);<a name="line.2921"></a>
+<span class="sourceLineNo">2922</span>    put.add(kv13);<a name="line.2922"></a>
+<span class="sourceLineNo">2923</span>    put.add(kv12);<a name="line.2923"></a>
+<span class="sourceLineNo">2924</span>    put.add(kv11);<a name="line.2924"></a>
+<span class="sourceLineNo">2925</span>    put.add(kv23);<a name="line.2925"></a>
+<span class="sourceLineNo">2926</span>    put.add(kv22);<a name="line.2926"></a>
+<span class="sourceLineNo">2927</span>    put.add(kv21);<a name="line.2927"></a>
+<span class="sourceLineNo">2928</span>    region.put(put);<a name="line.2928"></a>
+<span class="sourceLineNo">2929</span>    region.flush(true);<a name="line.2929"></a>
+<span class="sourceLineNo">2930</span><a name="line.2930"></a>
+<span class="sourceLineNo">2931</span>    // Expected<a name="line.2931"></a>
+<span class="sourceLineNo">2932</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.2932"></a>
+<span class="sourceLineNo">2933</span>    expected.add(kv13);<a name="line.2933"></a>
+<span class="sourceLineNo">2934</span>    expected.add(kv12);<a name="line.2934"></a>
+<span class="sourceLineNo">2935</span>    expected.add(kv23);<a name="line.2935"></a>
+<span class="sourceLineNo">2936</span>    expected.add(kv22);<a name="line.2936"></a>
 <span class="sourceLineNo">2937</span><a name="line.2937"></a>
-<span class="sourceLineNo">2938</span>    // Verify result<a name="line.2938"></a>
-<span class="sourceLineNo">2939</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.2939"></a>
-<span class="sourceLineNo">2940</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected.get(i), actual.get(i)));<a name="line.2940"></a>
-<span class="sourceLineNo">2941</span>    }<a name="line.2941"></a>
-<span class="sourceLineNo">2942</span>  }<a name="line.2942"></a>
-<span class="sourceLineNo">2943</span><a name="line.2943"></a>
-<span class="sourceLineNo">2944</span>  @Test<a name="line.2944"></a>
-<span class="sourceLineNo">2945</span>  public void testScanner_ExplicitColumns_FromMemStoreAndFiles_EnforceVersions() throws<a name="line.2945"></a>
-<span class="sourceLineNo">2946</span>      IOException {<a name="line.2946"></a>
-<span class="sourceLineNo">2947</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2947"></a>
-<span class="sourceLineNo">2948</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2948"></a>
-<span class="sourceLineNo">2949</span>    byte[][] families = { fam1 };<a name="line.2949"></a>
-<span class="sourceLineNo">2950</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.2950"></a>
-<span class="sourceLineNo">2951</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.2951"></a>
-<span class="sourceLineNo">2952</span><a name="line.2952"></a>
-<span class="sourceLineNo">2953</span>    long ts1 = 1;<a name="line.2953"></a>
-<span class="sourceLineNo">2954</span>    long ts2 = ts1 + 1;<a name="line.2954"></a>
-<span class="sourceLineNo">2955</span>    long ts3 = ts1 + 2;<a name="line.2955"></a>
-<span class="sourceLineNo">2956</span>    long ts4 = ts1 + 3;<a name="line.2956"></a>
-<span class="sourceLineNo">2957</span><a name="line.2957"></a>
-<span class="sourceLineNo">2958</span>    // Setting up region<a name="line.2958"></a>
-<span class="sourceLineNo">2959</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2959"></a>
-<span class="sourceLineNo">2960</span>    // Putting data in Region<a name="line.2960"></a>
-<span class="sourceLineNo">2961</span>    KeyValue kv14 = new KeyValue(row1, fam1, qf1, ts4, KeyValue.Type.Put, null);<a name="line.2961"></a>
-<span class="sourceLineNo">2962</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.2962"></a>
-<span class="sourceLineNo">2963</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.2963"></a>
-<span class="sourceLineNo">2964</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.2964"></a>
-<span class="sourceLineNo">2965</span><a name="line.2965"></a>
-<span class="sourceLineNo">2966</span>    KeyValue kv24 = new KeyValue(row1, fam1, qf2, ts4, KeyValue.Type.Put, null);<a name="line.2966"></a>
-<span class="sourceLineNo">2967</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.2967"></a>
-<span class="sourceLineNo">2968</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.2968"></a>
-<span class="sourceLineNo">2969</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.2969"></a>
-<span class="sourceLineNo">2970</span><a name="line.2970"></a>
-<span class="sourceLineNo">2971</span>    Put put = null;<a name="line.2971"></a>
-<span class="sourceLineNo">2972</span>    put = new Put(row1);<a name="line.2972"></a>
-<span class="sourceLineNo">2973</span>    put.add(kv14);<a name="line.2973"></a>
-<span class="sourceLineNo">2974</span>    put.add(kv24);<a name="line.2974"></a>
-<span class="sourceLineNo">2975</span>    region.put(put);<a name="line.2975"></a>
-<span class="sourceLineNo">2976</span>    region.flush(true);<a name="line.2976"></a>
-<span class="sourceLineNo">2977</span><a name="line.2977"></a>
-<span class="sourceLineNo">2978</span>    put = new Put(row1);<a name="line.2978"></a>
-<span class="sourceLineNo">2979</span>    put.add(kv23);<a name="line.2979"></a>
-<span class="sourceLineNo">2980</span>    put.add(kv13);<a name="line.2980"></a>
-<span class="sourceLineNo">2981</span>    region.put(put);<a name="line.2981"></a>
-<span class="sourceLineNo">2982</span>    region.flush(true);<a name="line.2982"></a>
-<span class="sourceLineNo">2983</span><a name="line.2983"></a>
-<span class="sourceLineNo">2984</span>    put = new Put(row1);<a name="line.2984"></a>
-<span class="sourceLineNo">2985</span>    put.add(kv22);<a name="line.2985"></a>
-<span class="sourceLineNo">2986</span>    put.add(kv12);<a name="line.2986"></a>
-<span class="sourceLineNo">2987</span>    region.put(put);<a name="line.2987"></a>
-<span class="sourceLineNo">2988</span>    region.flush(true);<a name="line.2988"></a>
-<span class="sourceLineNo">2989</span><a name="line.2989"></a>
-<span class="sourceLineNo">2990</span>    put = new Put(row1);<a name="line.2990"></a>
-<span class="sourceLineNo">2991</span>    put.add(kv21);<a name="line.2991"></a>
-<span class="sourceLineNo">2992</span>    put.add(kv11);<a name="line.2992"></a>
-<span class="sourceLineNo">2993</span>    region.put(put);<a name="line.2993"></a>
-<span class="sourceLineNo">2994</span><a name="line.2994"></a>
-<span class="sourceLineNo">2995</span>    // Expected<a name="line.2995"></a>
-<span class="sourceLineNo">2996</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.2996"></a>
-<span class="sourceLineNo">2997</span>    expected.add(kv14);<a name="line.2997"></a>
-<span class="sourceLineNo">2998</span>    expected.add(kv13);<a name="line.2998"></a>
-<span class="sourceLineNo">2999</span>    expected.add(kv12);<a name="line.2999"></a>
-<span class="sourceLineNo">3000</span>    expected.add(kv24);<a name="line.3000"></a>
-<span class="sourceLineNo">3001</span>    expected.add(kv23);<a name="line.3001"></a>
-<span class="sourceLineNo">3002</span>    expected.add(kv22);<a name="line.3002"></a>
-<span class="sourceLineNo">3003</span><a name="line.3003"></a>
-<span class="sourceLineNo">3004</span>    Scan scan = new Scan(row1);<a name="line.3004"></a>
-<span class="sourceLineNo">3005</span>    scan.addColumn(fam1, qf1);<a name="line.3005"></a>
-<span class="sourceLineNo">3006</span>    scan.addColumn(fam1, qf2);<a name="line.3006"></a>
-<span class="sourceLineNo">3007</span>    int versions = 3;<a name="line.3007"></a>
-<span class="sourceLineNo">3008</span>    scan.setMaxVersions(versions);<a name="line.3008"></a>
-<span class="sourceLineNo">3009</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.3009"></a>
-<span class="sourceLineNo">3010</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.3010"></a>
-<span class="sourceLineNo">3011</span><a name="line.3011"></a>
-<span class="sourceLineNo">3012</span>    boolean hasNext = scanner.next(actual);<a name="line.3012"></a>
-<span class="sourceLineNo">3013</span>    assertEquals(false, hasNext);<a name="line.3013"></a>
-<span class="sourceLineNo">3014</span><a name="line.3014"></a>
-<span class="sourceLineNo">3015</span>    // Verify result<a name="line.3015"></a>
-<span class="sourceLineNo">3016</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.3016"></a>
-<span class="sourceLineNo">3017</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected.get(i), actual.get(i)));<a name="line.3017"></a>
-<span class="sourceLineNo">3018</span>    }<a name="line.3018"></a>
-<span class="sourceLineNo">3019</span>  }<a name="line.3019"></a>
-<span class="sourceLineNo">3020</span><a name="line.3020"></a>
-<span class="sourceLineNo">3021</span>  @Test<a name="line.3021"></a>
-<span class="sourceLineNo">3022</span>  public void testScanner_Wildcard_FromMemStore_EnforceVersions() throws IOException {<a name="line.3022"></a>
-<span class="sourceLineNo">3023</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.3023"></a>
-<span class="sourceLineNo">3024</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.3024"></a>
-<span class="sourceLineNo">3025</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.3025"></a>
-<span class="sourceLineNo">3026</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.3026"></a>
-<span class="sourceLineNo">3027</span>    byte[][] families = { fam1 };<a name="line.3027"></a>
-<span class="sourceLineNo">3028</span><a name="line.3028"></a>
-<span class="sourceLineNo">3029</span>    long ts1 = System.currentTimeMillis();<a name="line.3029"></a>
-<span class="sourceLineNo">3030</span>    long ts2 = ts1 + 1;<a name="line.3030"></a>
-<span class="sourceLineNo">3031</span>    long ts3 = ts1 + 2;<a name="line.3031"></a>
-<span class="sourceLineNo">3032</span><a name="line.3032"></a>
-<span class="sourceLineNo">3033</span>    // Setting up region<a name="line.3033"></a>
-<span class="sourceLineNo">3034</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.3034"></a>
-<span class="sourceLineNo">3035</span>    // Putting data in Region<a name="line.3035"></a>
-<span class="sourceLineNo">3036</span>    Put put = null;<a name="line.3036"></a>
-<span class="sourceLineNo">3037</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.3037"></a>
-<span class="sourceLineNo">3038</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.3038"></a>
-<span class="sourceLineNo">3039</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.3039"></a>
-<span class="sourceLineNo">3040</span><a name="line.3040"></a>
-<span class="sourceLineNo">3041</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.3041"></a>
-<span class="sourceLineNo">3042</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.3042"></a>
-<span class="sourceLineNo">3043</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.3043"></a>
-<span class="sourceLineNo">3044</span><a name="line.3044"></a>
-<span class="sourceLineNo">3045</span>    put = new Put(row1);<a name="line.3045"></a>
-<span class="sourceLineNo">3046</span>    put.add(kv13);<a name="line.3046"></a>
-<span class="sourceLineNo">3047</span>    put.add(kv12);<a name="line.3047"></a>
-<span class="sourceLineNo">3048</span>    put.add(kv11);<a name="line.3048"></a>
-<span class="sourceLineNo">3049</span>    put.add(kv23);<a name="line.3049"></a>
-<span class="sourceLineNo">3050</span>    put.add(kv22);<a name="line.3050"></a>
-<span class="sourceLineNo">3051</span>    put.add(kv21);<a name="line.3051"></a>
-<span class="sourceLineNo">3052</span>    region.put(put);<a name="line.3052"></a>
-<span class="sourceLineNo">3053</span><a name="line.3053"></a>
-<span class="sourceLineNo">3054</span>    // Expected<a name="line.3054"></a>
-<span class="sourceLineNo">3055</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.3055"></a>
-<span class="sourceLineNo">3056</span>    expected.add(kv13);<a name="line.3056"></a>
-<span class="sourceLineNo">3057</span>    expected.add(kv12);<a name="line.3057"></a>
-<span class="sourceLineNo">3058</span>    expected.add(kv23);<a name="line.3058"></a>
-<span class="sourceLineNo">3059</span>    expected.add(kv22);<a name="line.3059"></a>
-<span class="sourceLineNo">3060</span><a name="line.3060"></a>
-<span class="sourceLineNo">3061</span>    Scan scan = new Scan(row1);<a name="line.3061"></a>
-<span class="sourceLineNo">3062</span>    scan.addFamily(fam1);<a name="line.3062"></a>
-<span class="sourceLineNo">3063</span>    scan.setMaxVersions(MAX_VERSIONS);<a name="line.3063"></a>
-<span class="sourceLineNo">3064</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.3064"></a>
-<span class="sourceLineNo">3065</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.3065"></a>
-<span class="sourceLineNo">3066</span><a name="line.3066"></a>
-<span class="sourceLineNo">3067</span>    boolean hasNext = scanner.next(actual);<a name="line.3067"></a>
-<span class="sourceLineNo">3068</span>    assertEquals(false, hasNext);<a name="line.3068"></a>
-<span class="sourceLineNo">3069</span><a name="line.3069"></a>
-<span class="sourceLineNo">3070</span>    // Verify result<a name="line.3070"></a>
-<span class="sourceLineNo">3071</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.3071"></a>
-<span class="sourceLineNo">3072</span>      assertEquals(expected.get(i), actual.get(i));<a name="line.3072"></a>
-<span class="sourceLineNo">3073</span>    }<a name="line.3073"></a>
-<span class="sourceLineNo">3074</span>  }<a name="line.3074"></a>
-<span class="sourceLineNo">3075</span><a name="line.3075"></a>
-<span class="sourceLineNo">3076</span>  @Test<a name="line.3076"></a>
-<span class="sourceLineNo">3077</span>  public void testScanner_Wildcard_FromFilesOnly_EnforceVersions() throws IOException {<a name="line.3077"></a>
-<span class="sourceLineNo">3078</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.3078"></a>
-<span class="sourceLineNo">3079</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.3079"></a>
-<span class="sourceLineNo">3080</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.3080"></a>
-<span class="sourceLineNo">3081</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.3081"></a>
-<span class="sourceLineNo">3082</span><a name="line.3082"></a>
-<span class="sourceLineNo">3083</span>    long ts1 = 1; // System.currentTimeMillis();<a name="line.3083"></a>
-<span class="sourceLineNo">3084</span>    long ts2 = ts1 + 1;<a name="line.3084"></a>
-<span class="sourceLineNo">3085</span>    long ts3 = ts1 + 2;<a name="line.3085"></a>
-<span class="sourceLineNo">3086</span><a name="line.3086"></a>
-<span class="sourceLineNo">3087</span>    // Setting up region<a name="line.3087"></a>
-<span class="sourceLineNo">3088</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.3088"></a>
-<span class="sourceLineNo">3089</span>    // Putting data in Region<a name="line.3089"></a>
-<span class="sourceLineNo">3090</span>    Put put = null;<a name="line.3090"></a>
-<span class="sourceLineNo">3091</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.3091"></a>
-<span class="sourceLineNo">3092</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.3092"></a>
-<span class="sourceLineNo">3093</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.3093"></a>
-<span class="sourceLineNo">3094</span><a name="line.3094"></a>
-<span class="sourceLineNo">3095</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.3095"></a>
-<span class="sourceLineNo">3096</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.3096"></a>
-<span class="sourceLineNo">3097</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.3097"></a>
-<span class="sourceLineNo">3098</span><a name="line.3098"></a>
-<span class="sourceLineNo">3099</span>    put = new Put(row1);<a name="line.3099"></a>
-<span class="sourceLineNo">3100</span>    put.add(kv13);<a name="line.3100"></a>
-<span class="sourceLineNo">3101</span>    put.add(kv12);<a name="line.3101"></a>
-<span class="sourceLineNo">3102</span>    put.add(kv11);<a name="line.3102"></a>
-<span class="sourceLineNo">3103</span>    put.add(kv23);<a name="line.3103"></a>
-<span class="sourceLineNo">3104</span>    put.add(kv22);<a name="line.3104"></a>
-<span class="sourceLineNo">3105</span>    put.add(kv21);<a name="line.3105"></a>
-<span class="sourceLineNo">3106</span>    region.put(put);<a name="line.3106"></a>
-<span class="sourceLineNo">3107</span>    region.flush(true);<a name="line.3107"></a>
+<span class="sourceLineNo">2938</span>    Scan scan = new Scan(row1);<a name="line.2938"></a>
+<span class="sourceLineNo">2939</span>    scan.addColumn(fam1, qf1);<a name="line.2939"></a>
+<span class="sourceLineNo">2940</span>    scan.addColumn(fam1, qf2);<a name="line.2940"></a>
+<span class="sourceLineNo">2941</span>    scan.setMaxVersions(MAX_VERSIONS);<a name="line.2941"></a>
+<span class="sourceLineNo">2942</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.2942"></a>
+<span class="sourceLineNo">2943</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.2943"></a>
+<span class="sourceLineNo">2944</span><a name="line.2944"></a>
+<span class="sourceLineNo">2945</span>    boolean hasNext = scanner.next(actual);<a name="line.2945"></a>
+<span class="sourceLineNo">2946</span>    assertEquals(false, hasNext);<a name="line.2946"></a>
+<span class="sourceLineNo">2947</span><a name="line.2947"></a>
+<span class="sourceLineNo">2948</span>    // Verify result<a name="line.2948"></a>
+<span class="sourceLineNo">2949</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.2949"></a>
+<span class="sourceLineNo">2950</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected.get(i), actual.get(i)));<a name="line.2950"></a>
+<span class="sourceLineNo">2951</span>    }<a name="line.2951"></a>
+<span class="sourceLineNo">2952</span>  }<a name="line.2952"></a>
+<span class="sourceLineNo">2953</span><a name="line.2953"></a>
+<span class="sourceLineNo">2954</span>  @Test<a name="line.2954"></a>
+<span class="sourceLineNo">2955</span>  public void testScanner_ExplicitColumns_FromMemStoreAndFiles_EnforceVersions() throws<a name="line.2955"></a>
+<span class="sourceLineNo">2956</span>      IOException {<a name="line.2956"></a>
+<span class="sourceLineNo">2957</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2957"></a>
+<span class="sourceLineNo">2958</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2958"></a>
+<span class="sourceLineNo">2959</span>    byte[][] families = { fam1 };<a name="line.2959"></a>
+<span class="sourceLineNo">2960</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.2960"></a>
+<span class="sourceLineNo">2961</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.2961"></a>
+<span class="sourceLineNo">2962</span><a name="line.2962"></a>
+<span class="sourceLineNo">2963</span>    long ts1 = 1;<a name="line.2963"></a>
+<span class="sourceLineNo">2964</span>    long ts2 = ts1 + 1;<a name="line.2964"></a>
+<span class="sourceLineNo">2965</span>    long ts3 = ts1 + 2;<a name="line.2965"></a>
+<span class="sourceLineNo">2966</span>    long ts4 = ts1 + 3;<a name="line.2966"></a>
+<span class="sourceLineNo">2967</span><a name="line.2967"></a>
+<span class="sourceLineNo">2968</span>    // Setting up region<a name="line.2968"></a>
+<span class="sourceLineNo">2969</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2969"></a>
+<span class="sourceLineNo">2970</span>    // Putting data in Region<a name="line.2970"></a>
+<span class="sourceLineNo">2971</span>    KeyValue kv14 = new KeyValue(row1, fam1, qf1, ts4, KeyValue.Type.Put, null);<a name="line.2971"></a>
+<span class="sourceLineNo">2972</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.2972"></a>
+<span class="sourceLineNo">2973</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.2973"></a>
+<span class="sourceLineNo">2974</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.2974"></a>
+<span class="sourceLineNo">2975</span><a name="line.2975"></a>
+<span class="sourceLineNo">2976</span>    KeyValue kv24 = new KeyValue(row1, fam1, qf2, ts4, KeyValue.Type.Put, null);<a name="line.2976"></a>
+<span class="sourceLineNo">2977</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.2977"></a>
+<span class="sourceLineNo">2978</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.2978"></a>
+<span class="sourceLineNo">2979</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.2979"></a>
+<span class="sourceLineNo">2980</span><a name="line.2980"></a>
+<span class="sourceLineNo">2981</span>    Put put = null;<a name="line.2981"></a>
+<span class="sourceLineNo">2982</span>    put = new Put(row1);<a name="line.2982"></a>
+<span class="sourceLineNo">2983</span>    put.add(kv14);<a name="line.2983"></a>
+<span class="sourceLineNo">2984</span>    put.add(kv24);<a name="line.2984"></a>
+<span class="sourceLineNo">2985</span>    region.put(put);<a name="line.2985"></a>
+<span class="sourceLineNo">2986</span>    region.flush(true);<a name="line.2986"></a>
+<span class="sourceLineNo">2987</span><a name="line.2987"></a>
+<span class="sourceLineNo">2988</span>    put = new Put(row1);<a name="line.2988"></a>
+<span class="sourceLineNo">2989</span>    put.add(kv23);<a name="line.2989"></a>
+<span class="sourceLineNo">2990</span>    put.add(kv13);<a name="line.2990"></a>
+<span class="sourceLineNo">2991</span>    region.put(put);<a name="line.2991"></a>
+<span class="sourceLineNo">2992</span>    region.flush(true);<a name="line.2992"></a>
+<span class="sourceLineNo">2993</span><a name="line.2993"></a>
+<span class="sourceLineNo">2994</span>    put = new Put(row1);<a name="line.2994"></a>
+<span class="sourceLineNo">2995</span>    put.add(kv22);<a name="line.2995"></a>
+<span class="sourceLineNo">2996</span>    put.add(kv12);<a name="line.2996"></a>
+<span class="sourceLineNo">2997</span>    region.put(put);<a name="line.2997"></a>
+<span class="sourceLineNo">2998</span>    region.flush(true);<a name="line.2998"></a>
+<span class="sourceLineNo">2999</span><a name="line.2999"></a>
+<span class="sourceLineNo">3000</span>    put = new Put(row1);<a name="line.3000"></a>
+<span class="sourceLineNo">3001</span>    put.add(kv21);<a name="line.3001"></a>
+<span class="sourceLineNo">3002</span>    put.add(kv11);<a name="line.3002"></a>
+<span class="sourceLineNo">3003</span>    region.put(put);<a name="line.3003"></a>
+<span class="sourceLineNo">3004</span><a name="line.3004"></a>
+<span class="sourceLineNo">3005</span>    // Expected<a name="line.3005"></a>
+<span class="sourceLineNo">3006</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.3006"></a>
+<span class="sourceLineNo">3007</span>    expected.add(kv14);<a name="line.3007"></a>
+<span class="sourceLineNo">3008</span>    expected.add(kv13);<a name="line.3008"></a>
+<span class="sourceLineNo">3009</span>    expected.add(kv12);<a name="line.3009"></a>
+<span class="sourceLineNo">3010</span>    expected.add(kv24);<a name="line.3010"></a>
+<span class="sourceLineNo">3011</span>    expected.add(kv23);<a name="line.3011"></a>
+<span class="sourceLineNo">3012</span>    expected.add(kv22);<a name="line.3012"></a>
+<span class="sourceLineNo">3013</span><a name="line.3013"></a>
+<span class="sourceLineNo">3014</span>    Scan scan = new Scan(row1);<a name="line.3014"></a>
+<span class="sourceLineNo">3015</span>    scan.addColumn(fam1, qf1);<a name="line.3015"></a>
+<span class="sourceLineNo">3016</span>    scan.addColumn(fam1, qf2);<a name="line.3016"></a>
+<span class="sourceLineNo">3017</span>    int versions = 3;<a name="line.3017"></a>
+<span class="sourceLineNo">3018</span>    scan.setMaxVersions(versions);<a name="line.3018"></a>
+<span class="sourceLineNo">3019</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.3019"></a>
+<span class="sourceLineNo">3020</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.3020"></a>
+<span class="sourceLineNo">3021</span><a name="line.3021"></a>
+<span class="sourceLineNo">3022</span>    boolean hasNext = scanner.next(actual);<a name="line.3022"></a>
+<span class="sourceLineNo">3023</span>    assertEquals(false, hasNext);<a name="line.3023"></a>
+<span class="sourceLineNo">3024</span><a name="line.3024"></a>
+<span class="sourceLineNo">3025</span>    // Verify result<a name="line.3025"></a>
+<span class="sourceLineNo">3026</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.3026"></a>
+<span class="sourceLineNo">3027</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected.get(i), actual.get(i)));<a name="line.3027"></a>
+<span class="sourceLineNo">3028</span>    }<a name="line.3028"></a>
+<span class="sourceLineNo">3029</span>  }<a name="line.3029"></a>
+<span class="sourceLineNo">3030</span><a name="line.3030"></a>
+<span class="sourceLineNo">3031</span>  @Test<a name="line.3031"></a>
+<span class="sourceLineNo">3032</span>  public void testScanner_Wildcard_FromMemStore_EnforceVersions() throws IOException {<a name="line.3032"></a>
+<span class="sourceLineNo">3033</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.3033"></a>
+<span class="sourceLineNo">3034</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.3034"></a>
+<span class="sourceLineNo">3035</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.3035"></a>
+<span class="sourceLineNo">3036</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.3036"></a>
+<span class="sourceLineNo">3037</span>    byte[][] families = { fam1 };<a name="line.3037"></a>
+<span class="sourceLineNo">3038</span><a name="line.3038"></a>
+<span class="sourceLineNo">3039</span>    long ts1 = System.currentTimeMillis();<a name="line.3039"></a>
+<span class="sourceLineNo">3040</span>    long ts2 = ts1 + 1;<a name="line.3040"></a>
+<span class="sourceLineNo">3041</span>    long ts3 = ts1 + 2;<a name="line.3041"></a>
+<span class="sourceLineNo">3042</span><a name="line.3042"></a>
+<span class="sourceLineNo">3043</span>    // Setting up region<a name="line.3043"></a>
+<span class="sourceLineNo">3044</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.3044"></a>
+<span class="sourceLineNo">3045</span>    // Putting data in Region<a name="line.3045"></a>
+<span class="sourceLineNo">3046</span>    Put put = null;<a name="line.3046"></a>
+<span class="sourceLineNo">3047</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.3047"></a>
+<span class="sourceLineNo">3048</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.3048"></a>
+<span class="sourceLineNo">3049</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.3049"></a>
+<span class="sourceLineNo">3050</span><a name="line.3050"></a>
+<span class="sourceLineNo">3051</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.3051"></a>
+<span class="sourceLineNo">3052</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.3052"></a>
+<span class="sourceLineNo">3053</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.3053"></a>
+<span class="sourceLineNo">3054</span><a name="line.3054"></a>
+<span class="sourceLineNo">3055</span>    put = new Put(row1);<a name="line.3055"></a>
+<span class="sourceLineNo">3056</span>    put.add(kv13);<a name="line.3056"></a>
+<span class="sourceLineNo">3057</span>    put.add(kv12);<a name="line.3057"></a>
+<span class="sourceLineNo">3058</span>    put.add(kv11);<a name="line.3058"></a>
+<span class="sourceLineNo">3059</span>    put.add(kv23);<a name="line.3059"></a>
+<span class="sourceLineNo">3060</span>    put.add(kv22);<a name="line.3060"></a>
+<span class="sourceLineNo">3061</span>    put.add(kv21);<a name="line.3061"></a>
+<span class="sourceLineNo">3062</span>    region.put(put);<a name="line.3062"></a>
+<span class="sourceLineNo">3063</span><a name="line.3063"></a>
+<span class="sourceLineNo">3064</span>    // Expected<a name="line.3064"></a>
+<span class="sourceLineNo">3065</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.3065"></a>
+<span class="sourceLineNo">3066</span>    expected.add(kv13);<a name="line.3066"></a>
+<span class="sourceLineNo">3067</span>    expected.add(kv12);<a name="line.3067"></a>
+<span class="sourceLineNo">3068</span>    expected.add(kv23);<a name="line.3068"></a>
+<span class="sourceLineNo">3069</span>    expected.add(kv22);<a name="line.3069"></a>
+<span class="sourceLineNo">3070</span><a name="line.3070"></a>
+<span class="sourceLineNo">3071</span>    Scan scan = new Scan(row1);<a name="line.3071"></a>
+<span class="sourceLineNo">3072</span>    scan.addFamily(fam1);<a name="line.3072"></a>
+<span class="sourceLineNo">3073</span>    scan.setMaxVersions(MAX_VERSIONS);<a name="line.3073"></a>
+<span class="sourceLineNo">3074</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.3074"></a>
+<span class="sourceLineNo">3075</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.3075"></a>
+<span class="sourceLineNo">3076</span><a name="line.3076"></a>
+<span class="sourceLineNo">3077</span>    boolean hasNext = scanner.next(actual);<a name="line.3077"></a>
+<span class="sourceLineNo">3078</span>    assertEquals(false, hasNext);<a name="line.3078"></a>
+<span class="sourceLineNo">3079</span><a name="line.3079"></a>
+<span class="sourceLineNo">3080</span>    // Verify result<a name="line.3080"></a>
+<span class="sourceLineNo">3081</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.3081"></a>
+<span class="sourceLineNo">3082</span>      assertEquals(expected.get(i), actual.get(i));<a name="line.3082"></a>
+<span class="sourceLineNo">3083</span>    }<a name="line.3083"></a>
+<span class="sourceLineNo">3084</span>  }<a name="line.3084"></a>
+<span class="sourceLineNo">3085</span><a name="line.3085"></a>
+<span class="sourceLineNo">3086</span>  @Test<a name="line.3086"></a>
+<span class="sourceLineNo">3087</span>  public void testScanner_Wildcard_FromFilesOnly_EnforceVersions() throws IOException {<a name="line.3087"></a>
+<span class="sourceLineNo">3088</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.3088"></a>
+<span class="sourceLineNo">3089</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.3089"></a>
+<span class="sourceLineNo">3090</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.3090"></a>
+<span class="sourceLineNo">3091</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.3091"></a>
+<span class="sourceLineNo">3092</span><a name="line.3092"></a>
+<span class="sourceLineNo">3093</span>    long ts1 = 1; // System.currentTimeMillis();<a name="line.3093"></a>
+<span class="sourceLineNo">3094</span>    long ts2 = ts1 + 1;<a name="line.3094"></a>
+<span class="sourceLineNo">3095</span>    long ts3 = ts1 + 2;<a name="line.3095"></a>
+<span class="sourceLineNo">3096</span><a name="line.3096"></a>
+<span class="sourceLineNo">3097</span>    // Setting up region<a name="line.3097"></a>
+<span class="sourceLineNo">3098</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.3098"></a>
+<span class="sourceLineNo">3099</span>    // Putting data in Region<a name="line.3099"></a>
+<span class="sourceLineNo">3100</span>    Put put = null;<a name="line.3100"></a>
+<span class="sourceLineNo">3101</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.3101"></a>
+<span class="sourceLineNo">3102</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.3102"></a>
+<span class="sourceLineNo">3103</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.3103"></a>
+<span class="sourceLineNo">3104</span><a name="line.3104"></a>
+<span class="sourceLineNo">3105</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.3105"></a>
+<span class="sourceLineNo">3106</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.3106"></a>
+<span class="sourceLineNo">3107</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.3107"></a>
 <span class="sourceLineNo">3108</span><a name="line.3108"></a>
-<span class="sourceLineNo">3109</span>    // Expected<a name="line.3109"></a>
-<span class="sourceLineNo">3110</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.3110"></a>
-<span class="sourceLineNo">3111</span>    expected.add(kv13);<a name="line.3111"></a>
-<span class="sourceLineNo">3112</span>    expected.add(kv12);<a name="line.3112"></a>
-<span class="sourceLineNo">3113</span>    expected.add(kv23);<a name="line.3113"></a>
-<span class="sourceLineNo">3114</span>    expected.add(kv22);<a name="line.3114"></a>
-<span class="sourceLineNo">3115</span><a name="line.3115"></a>
-<span class="sourceLineNo">3116</span>    Scan scan = new Scan(row1);<a name="line.3116"></a>
-<span class="sourceLineNo">3117</span>    scan.addFamily(fam1);<a name="line.3117"></a>
-<span class="sourceLineNo">3118</span>    scan.setMaxVersions(MAX_VERSIONS);<a name="line.3118"></a>
-<span class="sourceLineNo">3119</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.3119"></a>
-<span class="sourceLineNo">3120</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.3120"></a>
-<span class="sourceLineNo">3121</span><a name="line.3121"></a>
-<span class="sourceLineNo">3122</span>    boolean hasNext = scanner.next(actual);<a name="line.3122"></a>
-<span class="sourceLineNo">3123</span>    assertEquals(false, hasNext);<a name="line.3123"></a>
-<span class="sourceLineNo">3124</span><a name="line.3124"></a>
-<span class="sourceLineNo">3125</span>    // Verify result<a name="line.3125"></a>
-<span class="sourceLineNo">3126</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.3126"></a>
-<span class="sourceLineNo">3127</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected.get(i), actual.get(i)));<a name="line.3127"></a>
-<span class="sourceLineNo">3128</span>    }<a name="line.3128"></a>
-<span class="sourceLineNo">3129</span>  }<a name="line.3129"></a>
-<span class="sourceLineNo">3130</span><a name="line.3130"></a>
-<span class="sourceLineNo">3131</span>  @Test<a name="line.3131"></a>
-<span class="sourceLineNo">3132</span>  public void testScanner_StopRow1542() throws IOException {<a name="line.3132"></a>
-<span class="sourceLineNo">3133</span>    byte[] family = Bytes.toBytes("testFamily");<a name="line.3133"></a>
-<span class="sourceLineNo">3134</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.3134"></a>
-<span class="sourceLineNo">3135</span>    byte[] row1 = Bytes.toBytes("row111");<a name="line.3135"></a>
-<span class="sourceLineNo">3136</span>    byte[] row2 = Bytes.toBytes("row222");<a name="line.3136"></a>
-<span class="sourceLineNo">3137</span>    byte[] row3 = Bytes.toBytes("row333");<a name="line.3137"></a>
-<span class="sourceLineNo">3138</span>    byte[] row4 = Bytes.toBytes("row444");<a name="line.3138"></a>
-<span class="sourceLineNo">3139</span>    byte[] row5 = Bytes.toBytes("row555");<a name="line.3139"></a>
+<span class="sourceLineNo">3109</span>    put = new Put(row1);<a name="line.3109"></a>
+<span class="sourceLineNo">3110</span>    put.add(kv13);<a name="line.3110"></a>
+<span class="sourceLineNo">3111</span>    put.add(kv12);<a name="line.3111"></a>
+<span class="sourceLineNo">3112</span>    put.add(kv11);<a name="line.3112"></a>
+<span class="sourceLineNo">3113</span>    put.add(kv23);<a name="line.3113"></a>
+<span class="sourceLineNo">3114</span>    put.add(kv22);<a name="line.3114"></a>
+<span class="sourceLineNo">3115</span>    put.add(kv21);<a name="line.3115"></a>
+<span class="sourceLineNo">3116</span>    region.put(put);<a name="line.3116"></a>
+<span class="sourceLineNo">3117</span>    region.flush(true);<a name="line.3117"></a>
+<span class="sourceLineNo">3118</span><a name="line.3118"></a>
+<span class="sourceLineNo">3119</span>    // Expected<a name="line.3119"></a>
+<span class="sourceLineNo">3120</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.3120"></a>
+<span class="sourceLineNo">3121</span>    expected.add(kv13);<a name="line.3121"></a>
+<span class="sourceLineNo">3122</span>    expected.add(kv12);<a name="line.3122"></a>
+<span class="sourceLineNo">3123</span>    expected.add(kv23);<a name="line.3123"></a>
+<span class="sourceLineNo">3124</span>    expected.add(kv22);<a name="line.3124"></a>
+<span class="sourceLineNo">3125</span><a name="line.3125"></a>
+<span class="sourceLineNo">3126</span>    Scan scan = new Scan(row1);<a name="line.3126"></a>
+<span class="sourceLineNo">3127</span>    scan.addFamily(fam1);<a name="line.3127"></a>
+<span class="sourceLineNo">3128</span>    scan.setMaxVersions(MAX_VERSIONS);<a name="line.3128"></a>
+<span class="sourceLineNo">3129</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.3129"></a>
+<span class="sourceLineNo">3130</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.3130"></a>
+<span class="sourceLineNo">3131</span><a name="line.3131"></a>
+<span class="sourceLineNo">3132</span>    boolean hasNext = scanner.next(actual);<a name="line.3132"></a>
+<span class="sourceLineNo">3133</span>    assertEquals(false, hasNext);<a name="line.3133"></a>
+<span class="sourceLineNo">3134</span><a name="line.3134"></a>
+<span class="sourceLineNo">3135</span>    // Verify result<a name="line.3135"></a>
+<span class="sourceLineNo">3136</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.3136"></a>
+<span class="sourceLineNo">3137</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected.get(i), actual.get(i)));<a name="line.3137"></a>
+<span class="sourceLineNo">3138</span>    }<a name="line.3138"></a>
+<span class="sourceLineNo">3139</span>  }<a name="line.3139"></a>
 <span class="sourceLineNo">3140</span><a name="line.3140"></a>
-<span class="sourceLineNo">3141</span>    byte[] col1 = Bytes.toBytes("Pub111");<a name="line.3141"></a>
-<span class="sourceLineNo">3142</span>    byte[] col2 = Bytes.toBytes("Pub222");<a name="line.3142"></a>
-<span class="sourceLineNo">3143</span><a name="line.3143"></a>
-<span class="sourceLineNo">3144</span>    Put put = new Put(row1);<a name="line.3144"></a>
-<span class="sourceLineNo">3145</span>    put.addColumn(family, col1, Bytes.toBytes(10L));<a name="line.3145"></a>
-<span class="sourceLineNo">3146</span>    region.put(put);<a name="line.3146"></a>
-<span class="sourceLineNo">3147</span><a name="line.3147"></a>
-<span class="sourceLineNo">3148</span>    put = new Put(row2);<a name="line.3148"></a>
-<span class="sourceLineNo">3149</span>    put.addColumn(family, col1, Bytes.toBytes(15L));<a name="line.3149"></a>
-<span class="sourceLineNo">3150</span>    region.put(put);<a name="line.3150"></a>
-<span class="sourceLineNo">3151</span><a name="line.3151"></a>
-<span class="sourceLineNo">3152</span>    put = new Put(row3);<a name="line.3152"></a>
-<span class="sourceLineNo">3153</span>    put.addColumn(family, col2, Bytes.toBytes(20L));<a name="line.3153"></a>
-<span class="sourceLineNo">3154</span>    region.put(put);<a name="line.3154"></a>
-<span class="sourceLineNo">3155</span><a name="line.3155"></a>
-<span class="sourceLineNo">3156</span>    put = new Put(row4);<a name="line.3156"></a>
-<span class="sourceLineNo">3157</span>    put.addColumn(family, col2, Bytes.toBytes(30L));<a name="line.3157"></a>
-<span class="sourceLineNo">3158</span>    region.put(put);<a name="line.3158"></a>
-<span class="sourceLineNo">3159</span><a name="line.3159"></a>
-<span class="sourceLineNo">3160</span>    put = new Put(row5);<a name="line.3160"></a>
-<span class="sourceLineNo">3161</span>    put.addColumn(family, col1, Bytes.toBytes(40L));<a name="line.3161"></a>
-<span class="sourceLineNo">3162</span>    region.put(put);<a name="line.3162"></a>
-<span class="sourceLineNo">3163</span><a name="line.3163"></a>
-<span class="sourceLineNo">3164</span>    Scan scan = new Scan(row3, row4);<a name="line.3164"></a>
-<span class="sourceLineNo">3165</span>    scan.setMaxVersions();<a name="line.3165"></a>
-<span class="sourceLineNo">3166</span>    scan.addColumn(family, col1);<a name="line.3166"></a>
-<span class="sourceLineNo">3167</span>    InternalScanner s = region.getScanner(scan);<a name="line.3167"></a>
-<span class="sourceLineNo">3168</span><a name="line.3168"></a>
-<span class="sourceLineNo">3169</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.3169"></a>
-<span class="sourceLineNo">3170</span>    assertEquals(false, s.next(results));<a name="line.3170"></a>
-<span class="sourceLineNo">3171</span>    assertEquals(0, results.size());<a name="line.3171"></a>
-<span class="sourceLineNo">3172</span>  }<a name="line.3172"></a>
+<span class="sourceLineNo">3141</span>  @Test<a name="line.3141"></a>
+<span class="sourceLineNo">3142</span>  public void testScanner_StopRow1542() throws IOException {<a name="line.3142"></a>
+<span class="sourceLineNo">3143</span>    byte[] family = Bytes.toBytes("testFamily");<a name="line.3143"></a>
+<span class="sourceLineNo">3144</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.3144"></a>
+<span class="sourceLineNo">3145</span>    byte[] row1 = Bytes.toBytes("row111");<a name="line.3145"></a>
+<span class="sourceLineNo">3146</span>    byte[] row2 = Bytes.toBytes("row222");<a name="line.3146"></a>
+<span class="sourceLineNo">3147</span>    byte[] row3 = Bytes.toBytes("row333");<a name="line.3147"></a>
+<span class="sourceLineNo">3148</span>    byte[] row4 = Bytes.toBytes("row444");<a name="line.3148"></a>
+<span class="sourceLineNo">3149</span>    byte[] row5 = Bytes.toBytes("row555");<a name="line.3149"></a>
+<span class="sourceLineNo">3150</span><a name="line.3150"></a>
+<span class="sourceLineNo">3151</span>    byte[] col1 = Bytes.toBytes("Pub111");<a name="line.3151"></a>
+<span class="sourceLineNo">3152</span>    byte[] col2 = Bytes.toBytes("Pub222");<a name="line.3152"></a>
+<span class="sourceLineNo">3153</span><a name="line.3153"></a>
+<span class="sourceLineNo">3154</span>    Put put = new Put(row1);<a name="line.3154"></a>
+<span class="sourceLineNo">3155</span>    put.addColumn(family, col1, Bytes.toBytes(10L));<a name="line.3155"></a>
+<span class="sourceLineNo">3156</span>    region.put(put);<a name="line.3156"></a>
+<span class="sourceLineNo">3157</span><a name="line.3157"></a>
+<span class="sourceLineNo">3158</span>    put = new Put(row2);<a name="line.3158"></a>
+<span class="sourceLineNo">3159</span>    put.addColumn(family, col1, Bytes.toBytes(15L));<a name="line.3159"></a>
+<span class="sourceLineNo">3160</span>    region.put(put);<a name="line.3160"></a>
+<span class="sourceLineNo">3161</span><a name="line.3161"></a>
+<span class="sourceLineNo">3162</span>    put = new Put(row3);<a name="line.3162"></a>
+<span class="sourceLineNo">3163</span>    put.addColumn(family, col2, Bytes.toBytes(20L));<a name="line.3163"></a>
+<span class="sourceLineNo">3164</span>    region.put(put);<a name="line.3164"></a>
+<span class="sourceLineNo">3165</span><a name="line.3165"></a>
+<span class="sourceLineNo">3166</span>    put = new Put(row4);<a name="line.3166"></a>
+<span class="sourceLineNo">3167</span>    put.addColumn(family, col2, Bytes.toBytes(30L));<a name="line.3167"></a>
+<span class="sourceLineNo">3168</span>    region.put(put);<a name="line.3168"></a>
+<span class="sourceLineNo">3169</span><a name="line.3169"></a>
+<span class="sourceLineNo">3170</span>    put = new Put(row5);<a name="line.3170"></a>
+<span class="sourceLineNo">3171</span>    put.addColumn(family, col1, Bytes.toBytes(40L));<a name="line.3171"></a>
+<span class="sourceLineNo">3172</span>    region.put(put);<a name="line.3172"></a>
 <span class="sourceLineNo">3173</span><a name="line.3173"></a>
-<span class="sourceLineNo">3174</span>  @Test<a name="line.3174"></a>
-<span class="sourceLineNo">3175</span>  public void testScanner_Wildcard_FromMemStoreAndFiles_EnforceVersions() throws IOException {<a name="line.3175"></a>
-<span class="sourceLineNo">3176</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.3176"></a>
-<span class="sourceLineNo">3177</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.3177"></a>
-<span class="sourceLineNo">3178</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.3178"></a>
-<span class="sourceLineNo">3179</span>    byte[] qf2 = Bytes.toBytes("quateslifier2");<a name="line.3179"></a>
-<span class="sourceLineNo">3180</span><a name="line.3180"></a>
-<span class="sourceLineNo">3181</span>    long ts1 = 1;<a name="line.3181"></a>
-<span class="sourceLineNo">3182</span>    long ts2 = ts1 + 1;<a name="line.3182"></a>
-<span class="sourceLineNo">3183</span>    long ts3 = ts1 + 2;<a name="line.3183"></a>
-<span class="sourceLineNo">3184</span>    long ts4 = ts1 + 3;<a name="line.3184"></a>
-<span class="sourceLineNo">3185</span><a name="line.3185"></a>
-<span class="sourceLineNo">3186</span>    // Setting up region<a name="line.3186"></a>
-<span class="sourceLineNo">3187</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.3187"></a>
-<span class="sourceLineNo">3188</span>    // Putting data in Region<a name="line.3188"></a>
-<span class="sourceLineNo">3189</span>    KeyValue kv14 = new KeyValue(row1, fam1, qf1, ts4, KeyValue.Type.Put, null);<a name="line.3189"></a>
-<span class="sourceLineNo">3190</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.3190"></a>
-<span class="sourceLineNo">3191</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.3191"></a>
-<span class="sourceLineNo">3192</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.3192"></a>
-<span class="sourceLineNo">3193</span><a name="line.3193"></a>
-<span class="sourceLineNo">3194</span>    KeyValue kv24 = new KeyValue(row1, fam1, qf2, ts4, KeyValue.Type.Put, null);<a name="line.3194"></a>
-<span class="sourceLineNo">3195</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.3195"></a>
-<span class="sourceLineNo">3196</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.3196"></a>
-<span class="sourceLineNo">3197</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.3197"></a>
-<span class="sourceLineNo">3198</span><a name="line.3198"></a>
-<span class="sourceLineNo">3199</span>    Put put = null;<a name="line.3199"></a>
-<span class="sourceLineNo">3200</span>    put = new Put(row1);<a name="line.3200"></a>
-<span class="sourceLineNo">3201</span>    put.add(kv14);<a name="line.3201"></a>
-<span class="sourceLineNo">3202</span>    put.add(kv24);<a name="line.3202"></a>
-<span class="sourceLineNo">3203</span>    region.put(put);<a name="line.3203"></a>
-<span class="sourceLineNo">3204</span>    region.flush(true);<a name="line.3204"></a>
-<span class="sourceLineNo">3205</span><a name="line.3205"></a>
-<span class="sourceLineNo">3206</span>    put = new Put(row1);<a name="line.3206"></a>
-<span class="sourceLineNo">3207</span>    put.add(kv23);<a name="line.3207"></a>
-<span class="sourceLineNo">3208</span>    put.add(kv13);<a name="line.3208"></a>
-<span class="sourceLineNo">3209</span>    region.put(put);<a name="line.3209"></a>
-<span class="sourceLineNo">3210</span>    region.flush(true);<a name="line.3210"></a>
-<span class="sourceLineNo">3211</span><a name="line.3211"></a>
-<span class="sourceLineNo">3212</span>    put = new Put(row1);<a name="line.3212"></a>
-<span class="sourceLineNo">3213</span>    put.add(kv22);<a name="line.3213"></a>
-<span class="sourceLineNo">3214</span>    put.add(kv12);<a name="line.3214"></a>
-<span class="sourceLineNo">3215</span>    region.put(put);<a name="line.3215"></a>
-<span class="sourceLineNo">3216</span>    region.flush(true);<a name="line.3216"></a>
-<span class="sourceLineNo">3217</span><a name="line.3217"></a>
-<span class="sourceLineNo">3218</span>    put = new Put(row1);<a name="line.3218"></a>
-<span class="sourceLineNo">3219</span>    put.add(kv21);<a name="line.3219"></a>
-<span class="sourceLineNo">3220</span>    put.add(kv11);<a name="line.3220"></a>
-<span class="sourceLineNo">3221</span>    region.put(put);<a name="line.3221"></a>
-<span class="sourceLineNo">3222</span><a name="line.3222"></a>
-<span class="sourceLineNo">3223</span>    // Expected<a name="line.3223"></a>
-<span class="sourceLineNo">3224</span>    List&lt;KeyValue&gt; expected = new ArrayList&lt;&gt;();<a name="line.3224"></a>
-<span class="sourceLineNo">3225</span>    expected.add(kv14);<a name="line.3225"></a>
-<span class="sourceLineNo">3226</span>    expected.add(kv13);<a name="line.3226"></a>
-<span class="sourceLineNo">3227</span>    expected.add(kv12);<a name="line.3227"></a>
-<span class="sourceLineNo">3228</span>    expected.add(kv24);<a name="line.3228"></a>
-<span class="sourceLineNo">3229</span>    expected.add(kv23);<a name="line.3229"></a>
-<span class="sourceLineNo">3230</span>    expected.add(kv22);<a name="line.3230"></a>
-<span class="sourceLineNo">3231</span><a name="line.3231"></a>
-<span class="sourceLineNo">3232</span>    Scan scan = new Scan(row1);<a name="line.3232"></a>
-<span class="sourceLineNo">3233</span>    int versions = 3;<a name="line.3233"></a>
-<span class="sourceLineNo">3234</span>    scan.setMaxVersions(versions);<a name="line.3234"></a>
-<span class="sourceLineNo">3235</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.3235"></a>
-<span class="sourceLineNo">3236</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.3236"></a>
-<span class="sourceLineNo">3237</span><a name="line.3237"></a>
-<span class="sourceLineNo">3238</span>    boolean hasNext = scanner.next(actual);<a name="line.3238"></a>
-<span class="sourceLineNo">3239</span>    assertEquals(false, hasNext);<a name="line.3239"></a>
-<span class="sourceLineNo">3240</span><a name="line.3240"></a>
-<span class="sourceLineNo">3241</span>    // Verify result<a name="line.3241"></a>
-<span class="sourceLineNo">3242</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.3242"></a>
-<span class="sourceLineNo">3243</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected.get(i), actual.get(i)));<a name="line.3243"></a>
-<span class="sourceLineNo">3244</span>    }<a name="line.3244"></a>
-<span class="sourceLineNo">3245</span>  }<a name="line.3245"></a>
-<span class="sourceLineNo">3246</span><a name="line.3246"></a>
-<span class="sourceLineNo">3247</span>  /**<a name="line.3247"></a>
-<span class="sourceLineNo">3248</span>   * Added for HBASE-5416<a name="line.3248"></a>
-<span class="sourceLineNo">3249</span>   *<a name="line.3249"></a>
-<span class="sourceLineNo">3250</span>   * Here we test scan optimization when only subset of CFs are used in filter<a name="line.3250"></a>
-<span class="sourceLineNo">3251</span>   * conditions.<a name="line.3251"></a>
-<span class="sourceLineNo">3252</span>   */<a name="line.3252"></a>
-<span class="sourceLineNo">3253</span>  @Test<a name="line.3253"></a>
-<span class="sourceLineNo">3254</span>  public void testScanner_JoinedScanners() throws IOException {<a name="line.3254"></a>
-<span class="sourceLineNo">3255</span>    byte[] cf_essential = Bytes.toBytes("essential");<a name="line.3255"></a>
-<span class="sourceLineNo">3256</span>    byte[] cf_joined = Bytes.toBytes("joined");<a name="line.3256"></a>
-<span class="sourceLineNo">3257</span>    byte[] cf_alpha = Bytes.toBytes("alpha");<a name="line.3257"></a>
-<span class="sourceLineNo">3258</span>    this.region = initHRegion(tableName, method, CONF, cf_essential, cf_joined, cf_alpha);<a name="line.3258"></a>
-<span class="sourceLineNo">3259</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.3259"></a>
-<span class="sourceLineNo">3260</span>    byte[] row2 = Bytes.toBytes("row2");<a name="line.3260"></a>
-<span class="sourceLineNo">3261</span>    byte[] row3 = Bytes.toBytes("row3");<a name="line.3261"></a>
-<span class="sourceLineNo">3262</span><a name="line.3262"></a>
-<span class="sourceLineNo">3263</span>    byte[] col_normal = Bytes.toBytes("d");<a name="line.3263"></a>
-<span class="sourceLineNo">3264</span>    byte[] col_alpha = Bytes.toBytes("a");<a name="line.3264"></a>
-<span class="sourceLineNo">3265</span><a name="line.3265"></a>
-<span class="sourceLineNo">3266</span>    byte[] filtered_val = Bytes.toBytes(3);<a name="line.3266"></a>
-<span class="sourceLineNo">3267</span><a name="line.3267"></a>
-<span class="sourceLineNo">3268</span>    Put put = new Put(row1);<a name="line.3268"></a>
-<span class="sourceLineNo">3269</span>    put.addColumn(cf_essential, col_normal, Bytes.toBytes(1));<a name="line.3269"></a>
-<span class="sourceLineNo">3270</span>    put.addColumn(cf_joined, col_alpha, Bytes.toBytes(1));<a name="line.3270"></a>
-<span class="sourceLineNo">3271</span>    region.put(put);<a name="line.3271"></a>
+<span class="sourceLineNo">3174</span>    Scan scan = new Scan(row3, row4);<a name="line.3174"></a>
+<span class="sourceLineNo">3175</span>    scan.setMaxVersions();<a name="line.3175"></a>
+<span class="sourceLineNo">3176</span>    scan.addColumn(family, col1);<a name="line.3176"></a>
+<span class="sourceLineNo">3177</span>    InternalScanner s = region.getScanner(scan);<a name="line.3177"></a>
+<span class="sourceLineNo">3178</span><a name="line.3178"></a>
+<span class="sourceLineNo">3179</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.3179"></a>
+<span class="sourceLineNo">3180</span>    assertEquals(false, s.next(results));<a name="line.3180"></a>
+<span class="sourceLineNo">3181</span>    assertEquals(0, results.size());<a name="line.3181"></a>
+<span class="sourceLineNo">3182</span>  }<a name="line.3182"></a>
+<span class="sourceLineNo">3183</span><a name="line.3183"></a>
+<span class="sourceLineNo">3184</span>  @Test<a name="line.3184"></a>
+<span class="sourceLineNo">3185</span>  public void testScanner_Wildcard_FromMemStoreAndFiles_EnforceVersions() throws IOException {<a name="line.3185"></a>
+<span class="sourceLineNo">3186</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.3186"></a>
+<span class="sourceLineNo">3187</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.3187"></a>
+<span class="sourceLineNo">3188</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.3188"></a>
+<span class="sourceLineNo">3189</span>    byte[] qf2 = Bytes.toBytes("quateslifier2");<a name="line.3189"></a>
+<span class="sourceLineNo">3190</span><a name="line.3190"></a>
+<span class="sourceLineNo">3191</span>    long ts1 = 1;<a name="line.3191"></a>
+<span class="sourceLineNo">3192</span>    long ts2 = ts1 + 1;<a name="line.3192"></a>
+<span class="sourceLineNo">3193</span>    long ts3 = ts1 + 2;<a name="line.3193"></a>
+<span class="sourceLineNo">3194</span>    long ts4 = ts1 + 3;<a name="line.3194"></a>
+<span class="sourceLineNo">3195</span><a name="line.3195"></a>
+<span class="sourceLineNo">3196</span>    // Setting up region<a name="line.3196"></a>
+<span class="sourceLineNo">3197</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.3197"></a>
+<span class="sourceLineNo">3198</span>    // Putting data in Region<a name="line.3198"></a>
+<span class="sourceLineNo">3199</span>    KeyValue kv14 = new KeyValue(row1, fam1, qf1, ts4, KeyValue.Type.Put, null);<a name="line.3199"></a>
+<span class="sourceLineNo">3200</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.3200"></a>
+<span class="sourceLineNo">3201</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.3201"></a>
+<span class="sourceLineNo">3202</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.3202"></a>
+<span class="sourceLineNo">3203</span><a name="line.3203"></a>
+<span class="sourceLineNo">3204</span>    KeyValue kv24 = new KeyValue(row1, fam1, qf2, ts4, KeyValue.Type.Put, null);<a name="line.3204"></a>
+<span class="sourceLineNo">3205</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.3205"></a>
+<span class="sourceLineNo">3206</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.3206"></a>
+<span class="sourceLineNo">3207</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.3207"></a>
+<span class="sourceLineNo">3208</span><a name="line.3208"></a>
+<span class="sourceLineNo">3209</span>    Put put = null;<a name="line.3209"></a>
+<span class="sourceLineNo">3210</span>    put = new Put(row1);<a name="line.3210"></a>
+<span class="sourceLineNo">3211</span>    put.add(kv14);<a name="line.3211"></a>
+<span class="sourceLineNo">3212</span>    put.add(kv24);<a name="line.3212"></a>
+<span class="sourceLineNo">3213</span>    region.put(put);<a name="line.3213"></a>
+<span class="sourceLineNo">3214</span>    region.flush(true);<a name="line.3214"></a>
+<span class="sourceLineNo">3215</span><a name="line.3215"></a>
+<span class="sourceLineNo">3216</span>    put = new Put(row1);<a name="line.3216"></a>
+<span class="sourceLineNo">3217</span>    put.add(kv23);<a name="line.3217"></a>
+<span class="sourceLineNo">3218</span>    put.add(kv13);<a name="line.3218"></a>
+<span class="sourceLineNo">3219</span>    region.put(put);<a name="line.3219"></a>
+<span class="sourceLineNo">3220</span>    region.flush(true);<a name="line.3220"></a>
+<span class="sourceLineNo">3221</span><a name="line.3221"></a>
+<span class="sourceLineNo">3222</span>    put = new Put(row1);<a name="line.3222"></a>
+<span class="sourceLineNo">3223</span>    put.add(kv22);<a name="line.3223"></a>
+<span class="sourceLineNo">3224</span>    put.add(kv12);<a name="line.3224"></a>
+<span class="sourceLineNo">3225</span>    region.put(put);<a name="line.3225"></a>
+<span class="sourceLineNo">3226</span>    region.flush(true);<a name="line.3226"></a>
+<span class="sourceLineNo">3227</span><a name="line.3227"></a>
+<span class="sourceLineNo">3228</span>    put = new Put(row1);<a name="line.3228"></a>
+<span class="sourceLineNo">3229</span>    put.add(kv21);<a name="line.3229"></a>
+<span class="sourceLineNo">3230</span>    put.add(kv11);<a name="line.3230"></a>
+<span class="sourceLineNo">3231</span>    region.put(put);<a name="line.3231"></a>
+<span class="sourceLineNo">3232</span><a name="line.3232"></a>
+<span class="sourceLineNo">3233</span>    // Expected<a name="line.3233"></a>
+<span class="sourceLineNo">3234</span>    List&lt;KeyValue&gt; expected = new ArrayList&lt;&gt;();<a name="line.3234"></a>
+<span class="sourceLineNo">3235</span>    expected.add(kv14);<a name="line.3235"></a>
+<span class="sourceLineNo">3236</span>    expected.add(kv13);<a name="line.3236"></a>
+<span class="sourceLineNo">3237</span>    expected.add(kv12);<a name="line.3237"></a>
+<span class="sourceLineNo">3238</span>    expected.add(kv24);<a name="line.3238"></a>
+<span class="sourceLineNo">3239</span>    expected.add(kv23);<a name="line.3239"></a>
+<span class="sourceLineNo">3240</span>    expected.add(kv22);<a name="line.3240"></a>
+<span class="sourceLineNo">3241</span><a name="line.3241"></a>
+<span class="sourceLineNo">3242</span>    Scan scan = new Scan(row1);<a name="line.3242"></a>
+<span class="sourceLineNo">3243</span>    int versions = 3;<a name="line.3243"></a>
+<span class="sourceLineNo">3244</span>    scan.setMaxVersions(versions);<a name="line.3244"></a>
+<span class="sourceLineNo">3245</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.3245"></a>
+<span class="sourceLineNo">3246</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.3246"></a>
+<span class="sourceLineNo">3247</span><a name="line.3247"></a>
+<span class="sourceLineNo">3248</span>    boolean hasNext = scanner.next(actual);<a name="line.3248"></a>
+<span class="sourceLineNo">3249</span>    assertEquals(false, hasNext);<a name="line.3249"></a>
+<span class="sourceLineNo">3250</span><a name="line.3250"></a>
+<span class="sourceLineNo">3251</span>    // Verify result<a name="line.3251"></a>
+<span class="sourceLineNo">3252</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.3252"></a>
+<span class="sourceLineNo">3253</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected.get(i), actual.get(i)));<a name="line.3253"></a>
+<span class="sourceLineNo">3254</span>    }<a name="line.3254"></a>
+<span class="sourceLineNo">3255</span>  }<a name="line.3255"></a>
+<span class="sourceLineNo">3256</span><a name="line.3256"></a>
+<span class="sourceLineNo">3257</span>  /**<a name="line.3257"></a>
+<span class="sourceLineNo">3258</span>   * Added for HBASE-5416<a name="line.3258"></a>
+<span class="sourceLineNo">3259</span>   *<a name="line.3259"></a>
+<span class="sourceLineNo">3260</span>   * Here we test scan optimization when only subset of CFs are used in filter<a name="line.3260"></a>
+<span class="sourceLineNo">3261</span>   * conditions.<a name="line.3261"></a>
+<span class="sourceLineNo">3262</span>   */<a name="line.3262"></a>
+<span class="sourceLineNo">3263</span>  @Test<a name="line.3263"></a>
+<span class="sourceLineNo">3264</span>  public void testScanner_JoinedScanners() throws IOException {<a name="line.3264"></a>
+<span class="sourceLineNo">3265</span>    byte[] cf_essential = Bytes.toBytes("essential");<a name="line.3265"></a>
+<span class="sourceLineNo">3266</span>    byte[] cf_joined = Bytes.toBytes("joined");<a name="line.3266"></a>
+<span class="sourceLineNo">3267</span>    byte[] cf_alpha = Bytes.toBytes("alpha");<a name="line.3267"></a>
+<span class="sourceLineNo">3268</span>    this.region = initHRegion(tableName, method, CONF, cf_essential, cf_joined, cf_alpha);<a name="line.3268"></a>
+<span class="sourceLineNo">3269</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.3269"></a>
+<span class="sourceLineNo">3270</span>    byte[] row2 = Bytes.toBytes("row2");<a name="line.3270"></a>
+<span class="sourceLineNo">3271</span>    byte[] row3 = Bytes.toBytes("row3");<a name="line.3271"></a>
 <span class="sourceLineNo">3272</span><a name="line.3272"></a>
-<span class="sourceLineNo">3273</span>    put = new Put(row2);<a name="line.3273"></a>
-<span class="sourceLineNo">3274</span>    put.addColumn(cf_essential, col_alpha, Bytes.toBytes(2));<a name="line.3274"></a>
-<span class="sourceLineNo">3275</span>    put.addColumn(cf_joined, col_normal, Bytes.toBytes(2));<a name="line.3275"></a>
-<span class="sourceLineNo">3276</span>    put.addColumn(cf_alpha, col_alpha, Bytes.toBytes(2));<a name="line.3276"></a>
-<span class="sourceLineNo">3277</span>    region.put(put);<a name="line.3277"></a>
-<span class="sourceLineNo">3278</span><a name="line.3278"></a>
-<span class="sourceLineNo">3279</span>    put = new Put(row3);<a name="line.3279"></a>
-<span class="sourceLineNo">3280</span>    put.addColumn(cf_essential, col_normal, filtered_val);<a name="line.3280"></a>
-<span class="sourceLineNo">3281</span>    put.addColumn(cf_joined, col_normal, filtered_val);<a name="line.3281"></a>
-<span class="sourceLineNo">3282</span>    region.put(put);<a name="line.3282"></a>
-<span class="sourceLineNo">3283</span><a name="line.3283"></a>
-<span class="sourceLineNo">3284</span>    // Check two things:<a name="line.3284"></a>
-<span class="sourceLineNo">3285</span>    // 1. result list contains expected values<a name="line.3285"></a>
-<span class="sourceLineNo">3286</span>    // 2. result list is sorted properly<a name="line.3286"></a>
-<span class="sourceLineNo">3287</span><a name="line.3287"></a>
-<span class="sourceLineNo">3288</span>    Scan scan = new Scan();<a name="line.3288"></a>
-<span class="sourceLineNo">3289</span>    Filter filter = new SingleColumnValueExcludeFilter(cf_essential, col_normal,<a name="line.3289"></a>
-<span class="sourceLineNo">3290</span>            CompareOperator.NOT_EQUAL, filtered_val);<a name="line.3290"></a>
-<span class="sourceLineNo">3291</span>    scan.setFilter(filter);<a name="line.3291"></a>
-<span class="sourceLineNo">3292</span>    scan.setLoadColumnFamiliesOnDemand(true);<a name="line.3292"></a>
-<span class="sourceLineNo">3293</span>    InternalScanner s = region.getScanner(scan);<a name="line.3293"></a>
-<span class="sourceLineNo">3294</span><a name="line.3294"></a>
-<span class="sourceLineNo">3295</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.3295"></a>
-<span class="sourceLineNo">3296</span>    assertTrue(s.next(results));<a name="line.3296"></a>
-<span class="sourceLineNo">3297</span>    assertEquals(1, results.size());<a name="line.3297"></a>
-<span class="sourceLineNo">3298</span>    results.clear();<a name="line.3298"></a>
-<span class="sourceLineNo">3299</span><a name="line.3299"></a>
-<span class="sourceLineNo">3300</span>    assertTrue(s.next(results));<a name="line.3300"></a>
-<span class="sourceLineNo">3301</span>    assertEquals(3, results.size());<a name="line.3301"></a>
-<span class="sourceLineNo">3302</span>    assertTrue("orderCheck", CellUtil.matchingFamily(results.get(0), cf_alpha));<a name="line.3302"></a>
-<span class="sourceLineNo">3303</span>    assertTrue("orderCheck", CellUtil.matchingFamily(results.get(1), cf_essential));<a name="line.3303"></a>
-<span class="sourceLineNo">3304</span>    assertTrue("orderCheck", CellUtil.matchingFamily(results.get(2), cf_joined));<a name="line.3304"></a>
-<span class="sourceLineNo">3305</span>    results.clear();<a name="line.3305"></a>
-<span class="sourceLineNo">3306</span><a name="line.3306"></a>
-<span class="sourceLineNo">3307</span>    assertFalse(s.next(results));<a name="line.3307"></a>
-<span class="sourceLineNo">3308</span>    assertEquals(0, results.size());<a name="line.3308"></a>
-<span class="sourceLineNo">3309</span>  }<a name="line.3309"></a>
-<span class="sourceLineNo">3310</span><a name="line.3310"></a>
-<span class="sourceLineNo">3311</span>  /**<a name="line.3311"></a>
-<span class="sourceLineNo">3312</span>   * HBASE-5416<a name="line.3312"></a>
-<span class="sourceLineNo">3313</span>   *<a name="line.3313"></a>
-<span class="sourceLineNo">3314</span>   * Test case when scan limits amount of KVs returned on each next() call.<a name="line.3314"></a>
-<span class="sourceLineNo">3315</span>   */<a name="line.3315"></a>
-<span class="sourceLineNo">3316</span>  @Test<a name="line.3316"></a>
-<span class="sourceLineNo">3317</span>  public void testScanner_JoinedScannersWithLimits() throws IOException {<a name="line.3317"></a>
-<span class="sourceLineNo">3318</span>    final byte[] cf_first = Bytes.toBytes("first");<a name="line.3318"></a>
-<span class="sourceLineNo">3319</span>    final byte[] cf_second = Bytes.toBytes("second");<a name="line.3319"></a>
+<span class="sourceLineNo">3273</span>    byte[] col_normal = Bytes.toBytes("d");<a name="line.3273"></a>
+<span class="sourceLineNo">3274</span>    byte[] col_alpha = Bytes.toBytes("a");<a name="line.3274"></a>
+<span class="sourceLineNo">3275</span><a name="line.3275"></a>
+<span class="sourceLineNo">3276</span>    byte[] filtered_val = Bytes.toBytes(3);<a name="line.3276"></a>
+<span class="sourceLineNo">3277</span><a name="line.3277"></a>
+<span class="sourceLineNo">3278</span>    Put put = new Put(row1);<a name="line.3278"></a>
+<span class="sourceLineNo">3279</span>    put.addColumn(cf_essential, col_normal, Bytes.toBytes(1));<a name="line.3279"></a>
+<span class="sourceLineNo">3280</span>    put.addColumn(cf_joined, col_alpha, Bytes.toBytes(1));<a name="line.3280"></a>
+<span class="sourceLineNo">3281</span>    region.put(put);<a name="line.3281"></a>
+<span class="sourceLineNo">3282</span><a name="line.3282"></a>
+<span class="sourceLineNo">3283</span>    put = new Put(row2);<a name="line.3283"></a>
+<span class="sourceLineNo">3284</span>    put.addColumn(cf_essential, col_alpha, Bytes.toBytes(2));<a name="line.3284"></a>
+<span class="sourceLineNo">3285</span>    put.addColumn(cf_joined, col_normal, Bytes.toBytes(2));<a name="line.3285"></a>
+<span class="sourceLineNo">3286</span>    put.addColumn(cf_alpha, col_alpha, Bytes.toBytes(2));<a name="line.3286"></a>
+<span class="sourceLineNo">3287</span>    region.put(put);<a name="line.3287"></a>
+<span class="sourceLineNo">3288</span><a name="line.3288"></a>
+<span class="sourceLineNo">3289</span>    put = new Put(row3);<a name="line.3289"></a>
+<span class="sourceLineNo">3290</span>    put.addColumn(cf_essential, col_normal, filtered_val);<a name="line.3290"></a>
+<span class="sourceLineNo">3291</span>    put.addColumn(cf_joined, col_normal, filtered_val);<a name="line.3291"></a>
+<span class="sourceLineNo">3292</span>    region.put(put);<a name="line.3292"></a>
+<span class="sourceLineNo">3293</span><a name="line.3293"></a>
+<span class="sourceLineNo">3294</span>    // Check two things:<a name="line.3294"></a>
+<span class="sourceLineNo">3295</span>    // 1. result list contains expected values<a name="line.3295"></a>
+<span class="sourceLineNo">3296</span>    // 2. result list is sorted properly<a name="line.3296"></a>
+<span class="sourceLineNo">3297</span><a name="line.3297"></a>
+<span class="sourceLineNo">3298</span>    Scan scan = new Scan();<a name="line.3298"></a>
+<span class="sourceLineNo">3299</span>    Filter filter = new SingleColumnValueExcludeFilter(cf_essential, col_normal,<a name="line.3299"></a>
+<span class="sourceLineNo">3300</span>            CompareOperator.NOT_EQUAL, filtered_val);<a name="line.3300"></a>
+<span class="sourceLineNo">3301</span>    scan.setFilter(filter);<a name="line.3301"></a>
+<span class="sourceLineNo">3302</span>    scan.setLoadColumnFamiliesOnDemand(true);<a name="line.3302"></a>
+<span class="sourceLineNo">3303</span>    InternalScanner s = region.getScanner(scan);<a name="line.3303"></a>
+<span class="sourceLineNo">3304</span><a name="line.3304"></a>
+<span class="sourceLineNo">3305</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.3305"></a>
+<span class="sourceLineNo">3306</span>    assertTrue(s.next(results));<a name="line.3306"></a>
+<span class="sourceLineNo">3307</span>    assertEquals(1, results.size());<a name="line.3307"></a>
+<span class="sourceLineNo">3308</span>    results.clear();<a name="line.3308"></a>
+<span class="sourceLineNo">3309</span><a name="line.3309"></a>
+<span class="sourceLineNo">3310</span>    assertTrue(s.next(results));<a name="line.3310"></a>
+<span class="sourceLineNo">3311</span>    assertEquals(3, results.size());<a name="line.3311"></a>
+<span class="sourceLineNo">3312</span>    assertTrue("orderCheck", CellUtil.matchingFamily(results.get(0), cf_alpha));<a name="line.3312"></a>
+<span class="sourceLineNo">3313</span>    assertTrue("orderCheck", CellUtil.matchingFamily(results.get(1), cf_essential));<a name="line.3313"></a>
+<span class="sourceLineNo">3314</span>    assertTrue("orderCheck", CellUtil.matchingFamily(results.get(2), cf_joined));<a name="line.3314"></a>
+<span class="sourceLineNo">3315</span>    results.clear();<a name="line.3315"></a>
+<span class="sourceLineNo">3316</span><a name="line.3316"></a>
+<span class="sourceLineNo">3317</span>    assertFalse(s.next(results));<a name="line.3317"></a>
+<span class="sourceLineNo">3318</span>    assertEquals(0, results.size());<a name="line.3318"></a>
+<span class="sourceLineNo">3319</span>  }<a name="line.3319"></a>
 <span class="sourceLineNo">3320</span><a name="line.3320"></a>
-<span class="sourceLineNo">3321</span>    this.region = initHRegion(tableName, method, CONF, cf_first, cf_second);<a name="line.3321"></a>
-<span class="sourceLineNo">3322</span>    final byte[] col_a = Bytes.toBytes("a");<a name="line.3322"></a>
-<span class="sourceLineNo">3323</span>    final byte[] col_b = Bytes.toBytes("b");<a name="line.3323"></a>
-<span class="sourceLineNo">3324</span><a name="line.3324"></a>
-<span class="sourceLineNo">3325</span>    Put put;<a name="line.3325"></a>
-<span class="sourceLineNo">3326</span><a name="line.3326"></a>
-<span class="sourceLineNo">3327</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.3327"></a>
-<span class="sourceLineNo">3328</span>      put = new Put(Bytes.toBytes("r" + Integer.toString(i)));<a name="line.3328"></a>
-<span class="sourceLineNo">3329</span>      put.addColumn(cf_first, col_a, Bytes.toBytes(i));<a name="line.3329"></a>
-<span class="sourceLineNo">3330</span>      if (i &lt; 5) {<a name="line.3330"></a>
-<span class="sourceLineNo">3331</span>        put.addColumn(cf_first, col_b, Bytes.toBytes(i));<a name="line.3331"></a>
-<span class="sourceLineNo">3332</span>        put.addColumn(cf_second, col_a, Bytes.toBytes(i));<a name="line.3332"></a>
-<span class="sourceLineNo">3333</span>        put.addColumn(cf_second, col_b, Bytes.toBytes(i));<a name="line.3333"></a>
-<span class="sourceLineNo">3334</span>      }<a name="line.3334"></a>
-<span class="sourceLineNo">3335</span>      region.put(put);<a name="line.3335"></a>
-<span class="sourceLineNo">3336</span>    }<a name="line.3336"></a>
-<span class="sourceLineNo">3337</span><a name="line.3337"></a>
-<span class="sourceLineNo">3338</span>    Scan scan = new Scan();<a name="line.3338"></a>
-<span class="sourceLineNo">3339</span>    scan.setLoadColumnFamiliesOnDemand(true);<a name="line.3339"></a>
-<span class="sourceLineNo">3340</span>    Filter bogusFilter = new FilterBase() {<a name="line.3340"></a>
-<span class="sourceLineNo">3341</span>      @Override<a name="line.3341"></a>
-<span class="sourceLineNo">3342</span>      public ReturnCode filterCell(final Cell ignored) throws IOException {<a name="line.3342"></a>
-<span class="sourceLineNo">3343</span>        return ReturnCode.INCLUDE;<a name="line.3343"></a>
+<span class="sourceLineNo">3321</span>  /**<a name="line.3321"></a>
+<span class="sourceLineNo">3322</span>   * HBASE-5416<a name="line.3322"></a>
+<span class="sourceLineNo">3323</span>   *<a name="line.3323"></a>
+<span class="sourceLineNo">3324</span>   * Test case when scan limits amount of KVs returned on each next() call.<a name="line.3324"></a>
+<span class="sourceLineNo">3325</span>   */<a name="line.3325"></a>
+<span class="sourceLineNo">3326</span>  @Test<a name="line.3326"></a>
+<span class="sourceLineNo">3327</span>  public void testScanner_JoinedScannersWithLimits() throws IOException {<a name="line.3327"></a>
+<span class="sourceLineNo">3328</span>    final byte[] cf_first = Bytes.toBytes("first");<a name="line.3328"></a>
+<span class="sourceLineNo">3329</span>    final byte[] cf_second = Bytes.toBytes("second");<a name="line.3329"></a>
+<span class="sourceLineNo">3330</span><a name="line.3330"></a>
+<span class="sourceLineNo">3331</span>    this.region = initHRegion(tableName, method, CONF, cf_first, cf_second);<a name="line.3331"></a>
+<span class="sourceLineNo">3332</span>    final byte[] col_a = Bytes.toBytes("a");<a name="line.3332"></a>
+<span class="sourceLineNo">3333</span>    final byte[] col_b = Bytes.toBytes("b");<a name="line.3333"></a>
+<span class="sourceLineNo">3334</span><a name="line.3334"></a>
+<span class="sourceLineNo">3335</span>    Put put;<a name="line.3335"></a>
+<span class="sourceLineNo">3336</span><a name="line.3336"></a>
+<span class="sourceLineNo">3337</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.3337"></a>
+<span class="sourceLineNo">3338</span>      put = new Put(Bytes.toBytes("r" + Integer.toString(i)));<a name="line.3338"></a>
+<span class="sourceLineNo">3339</span>      put.addColumn(cf_first, col_a, Bytes.toBytes(i));<a name="line.3339"></a>
+<span class="sourceLineNo">3340</span>      if (i &lt; 5) {<a name="line.3340"></a>
+<span class="sourceLineNo">3341</span>        put.addColumn(cf_first, col_b, Bytes.toBytes(i));<a name="line.3341"></a>
+<span class="sourceLineNo">3342</span>        put.addColumn(cf_second, col_a, Bytes.toBytes(i));<a name="line.3342"></a>
+<span class="sourceLineNo">3343</span>        put.addColumn(cf_second, col_b, Bytes.toBytes(i));<a name="line.3343"></a>
 <span class="sourceLineNo">3344</span>      }<a name="line.3344"></a>
-<span class="sourceLineNo">3345</span>      @Override<a name="line.3345"></a>
-<span class="sourceLineNo">3346</span>      public boolean isFamilyEssential(byte[] name) {<a name="line.3346"></a>
-<span class="sourceLineNo">3347</span>        return Bytes.equals(name, cf_first);<a name="line.3347"></a>
-<span class="sourceLineNo">3348</span>      }<a name="line.3348"></a>
-<span class="sourceLineNo">3349</span>    };<a name="line.3349"></a>
-<span class="sourceLineNo">3350</span><a name="line.3350"></a>
-<span class="sourceLineNo">3351</span>    scan.setFilter(bogusFilter);<a name="line.3351"></a>
-<span class="sourceLineNo">3352</span>    InternalScanner s = region.getScanner(scan);<a name="line.3352"></a>
-<span class="sourceLineNo">3353</span><a name="line.3353"></a>
-<span class="sourceLineNo">3354</span>    // Our data looks like this:<a name="line.3354"></a>
-<span class="sourceLineNo">3355</span>    // r0: first:a, first:b, second:a, second:b<a name="line.3355"></a>
-<span class="sourceLineNo">3356</span>    // r1: first:a, first:b, second:a, second:b<a name="line.3356"></a>
-<span class="sourceLineNo">3357</span>    // r2: first:a, first:b, second:a, second:b<a name="line.3357"></a>
-<span class="sourceLineNo">3358</span>    // r3: first:a, first:b, second:a, second:b<a name="line.3358"></a>
-<span class="sourceLineNo">3359</span>    // r4: first:a, first:b, second:a, second:b<a name="line.3359"></a>
-<span class="sourceLineNo">3360</span>    // r5: first:a<a name="line.3360"></a>
-<span class="sourceLineNo">3361</span>    // r6: first:a<a name="line.3361"></a>
-<span class="sourceLineNo">3362</span>    // r7: first:a<a name="line.3362"></a>
-<span class="sourceLineNo">3363</span>    // r8: first:a<a name="line.3363"></a>
-<span class="sourceLineNo">3364</span>    // r9: first:a<a name="line.3364"></a>
-<span class="sourceLineNo">3365</span><a name="line.3365"></a>
-<span class="sourceLineNo">3366</span>    // But due to next's limit set to 3, we should get this:<a name="line.3366"></a>
-<span class="sourceLineNo">3367</span>    // r0: first:a, first:b, second:a<a name="line.3367"></a>
-<span class="sourceLineNo">3368</span>    // r0: second:b<a name="line.3368"></a>
-<span class="sourceLineNo">3369</span>    // r1: first:a, first:b, second:a<a name="line.3369"></a>
-<span class="sourceLineNo">3370</span>    // r1: second:b<a name="line.3370"></a>
-<span class="sourceLineNo">3371</span>    // r2: first:a, first:b, second:a<a name="line.3371"></a>
-<span class="sourceLineNo">3372</span>    // r2: second:b<a name="line.3372"></a>
-<span class="sourceLineNo">3373</span>    // r3: first:a, first:b, second:a<a name="line.3373"></a>
-<span class="sourceLineNo">3374</span>    // r3: second:b<a name="line.3374"></a>
-<span class="sourceLineNo">3375</span>    // r4: first:a, first:b, second:a<a name="line.3375"></a>
-<span class="sourceLineNo">3376</span>    // r4: second:b<a name="line.3376"></a>
-<span class="sourceLineNo">3377</span>    // r5: first:a<a name="line.3377"></a>
-<span class="sourceLineNo">3378</span>    // r6: first:a<a name="line.3378"></a>
-<span class="sourceLineNo">3379</span>    // r7: first:a<a name="line.3379"></a>
-<span class="sourceLineNo">3380</span>    // r8: first:a<a name="line.3380"></a>
-<span class="sourceLineNo">3381</span>    // r9: first:a<a name="line.3381"></a>
-<span class="sourceLineNo">3382</span><a name="line.3382"></a>
-<span class="sourceLineNo">3383</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.3383"></a>
-<span class="sourceLineNo">3384</span>    int index = 0;<a name="line.3384"></a>
-<span class="sourceLineNo">3385</span>    ScannerContext scannerContext = ScannerContext.newBuilder().setBatchLimit(3).build();<a name="line.3385"></a>
-<span class="sourceLineNo">3386</span>    while (true) {<a name="line.3386"></a>
-<span class="sourceLineNo">3387</span>      boolean more = s.next(results, scannerContext);<a name="line.3387"></a>
-<span class="sourceLineNo">3388</span>      if ((index &gt;&gt; 1) &lt; 5) {<a name="line.3388"></a>
-<span class="sourceLineNo">3389</span>        if (index % 2 == 0) {<a name="line.3389"></a>
-<span class="sourceLineNo">3390</span>          assertEquals(3, results.size());<a name="line.3390"></a>
-<span class="sourceLineNo">3391</span>        } else {<a name="line.3391"></a>
-<span class="sourceLineNo">3392</span>          assertEquals(1, results.size());<a name="line.3392"></a>
-<span class="sourceLineNo">3393</span>        }<a name="line.3393"></a>
-<span class="sourceLineNo">3394</span>      } else {<a name="line.3394"></a>
-<span class="sourceLineNo">3395</span>        assertEquals(1, results.size());<a name="line.3395"></a>
-<span class="sourceLineNo">3396</span>      }<a name="line.3396"></a>
-<span class="sourceLineNo">3397</span>      results.clear();<a name="line.3397"></a>
-<span class="sourceLineNo">3398</span>      index++;<a name="line.3398"></a>
-<span class="sourceLineNo">3399</span>      if (!more) {<a name="line.3399"></a>
-<span class="sourceLineNo">3400</span>        break;<a name="line.3400"></a>
-<span class="sourceLineNo">3401</span>      }<a name="line.3401"></a>
-<span class="sourceLineNo">3402</span>    }<a name="line.3402"></a>
-<span class="sourceLineNo">3403</span>  }<a name="line.3403"></a>
-<span class="sourceLineNo">3404</span><a name="line.3404"></a>
-<span class="sourceLineNo">3405</span>  /**<a name="line.3405"></a>
-<span class="sourceLineNo">3406</span>   * Write an HFile block full with Cells whose qualifier that are identical between<a name="line.3406"></a>
-<span class="sourceLineNo">3407</span>   * 0 and Short.MAX_VALUE. See HBASE-13329.<a name="line.3407"></a>
-<span class="sourceLineNo">3408</span>   * @throws Exception<a name="line.3408"></a>
-<span class="sourceLineNo">3409</span>   */<a name="line.3409"></a>
-<span class="sourceLineNo">3410</span>  @Test<a name="line.3410"></a>
-<span class="sourceLineNo">3411</span>  public void testLongQualifier() throws Exception {<a name="line.3411"></a>
-<span class="sourceLineNo">3412</span>    byte[] family = Bytes.toBytes("family");<a name="line.3412"></a>
-<span class="sourceLineNo">3413</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.3413"></a>
-<span class="sourceLineNo">3414</span>    byte[] q = new byte[Short.MAX_VALUE+2];<a name="line.3414"></a>
-<span class="sourceLineNo">3415</span>    Arrays.fill(q, 0, q.length-1, (byte)42);<a name="line.3415"></a>
-<span class="sourceLineNo">3416</span>    for (byte i=0; i&lt;10; i++) {<a name="line.3416"></a>
-<span class="sourceLineNo">3417</span>      Put p = new Put(Bytes.toBytes("row"));<a name="line.3417"></a>
-<span class="sourceLineNo">3418</span>      // qualifiers that differ past Short.MAX_VALUE<a name="line.3418"></a>
-<span class="sourceLineNo">3419</span>      q[q.length-1]=i;<a name="line.3419"></a>
-<span class="sourceLineNo">3420</span>      p.addColumn(family, q, q);<a name="line.3420"></a>
-<span class="sourceLineNo">3421</span>      region.put(p);<a name="line.3421"></a>
-<span class="sourceLineNo">3422</span>    }<a name="line.3422"></a>
-<span class="sourceLineNo">3423</span>    region.flush(false);<a name="line.3423"></a>
-<span class="sourceLineNo">3424</span>  }<a name="line.3424"></a>
-<span class="sourceLineNo">3425</span><a name="line.3425"></a>
-<span class="sourceLineNo">3426</span>  /**<a name="line.3426"></a>
-<span class="sourceLineNo">3427</span>   * Flushes the cache in a thread while scanning. The tests verify that the<a name="line.3427"></a>
-<span class="sourceLineNo">3428</span>   * scan is coherent - e.g. the returned results are always of the same or<a name="line.3428"></a>
-<span class="sourceLineNo">3429</span>   * later update as the previous results.<a name="line.3429"></a>
-<span class="sourceLineNo">3430</span>   *<a name="line.3430"></a>
-<span class="sourceLineNo">3431</span>   * @throws IOException<a name="line.3431"></a>
-<span class="sourceLineNo">3432</span>   *           scan / compact<a name="line.3432"></a>
-<span class="sourceLineNo">3433</span>   * @throws InterruptedException<a name="line.3433"></a>
-<span class="sourceLineNo">3434</span>   *           thread join<a name="line.3434"></a>
-<span class="sourceLineNo">3435</span>   */<a name="line.3435"></a>
-<span class="sourceLineNo">3436</span>  @Test<a name="line.3436"></a>
-<span class="sourceLineNo">3437</span>  public void testFlushCacheWhileScanning() throws IOException, InterruptedException {<a name="line.3437"></a>
-<span class="sourceLineNo">3438</span>    byte[] family = Bytes.toBytes("family");<a name="line.3438"></a>
-<span class="sourceLineNo">3439</span>    int numRows = 1000;<a name="line.3439"></a>
-<span class="sourceLineNo">3440</span>    int flushAndScanInterval = 10;<a name="line.3440"></a>
-<span class="sourceLineNo">3441</span>    int compactInterval = 10 * flushAndScanInterval;<a name="line.3441"></a>
-<span class="sourceLineNo">3442</span><a name="line.3442"></a>
-<span class="sourceLineNo">3443</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.3443"></a>
-<span class="sourceLineNo">3444</span>    FlushThread flushThread = new FlushThread();<a name="line.3444"></a>
-<span class="sourceLineNo">3445</span>    try {<a name="line.3445"></a>
-<span class="sourceLineNo">3446</span>      flushThread.start();<a name="line.3446"></a>
-<span class="sourceLineNo">3447</span><a name="line.3447"></a>
-<span class="sourceLineNo">3448</span>      Scan scan = new Scan();<a name="line.3448"></a>
-<span class="sourceLineNo">3449</span>      scan.addFamily(family);<a name="line.3449"></a>
-<span class="sourceLineNo">3450</span>      scan.setFilter(new SingleColumnValueFilter(family, qual1, CompareOperator.EQUAL,<a name="line.3450"></a>
-<span class="sourceLineNo">3451</span>          new BinaryComparator(Bytes.toBytes(5L))));<a name="line.3451"></a>
+<span class="sourceLineNo">3345</span>      region.put(put);<a name="line.3345"></a>
+<span class="sourceLineNo">3346</span>    }<a name="line.3346"></a>
+<span class="sourceLineNo">3347</span><a name="line.3347"></a>
+<span class="sourceLineNo">3348</span>    Scan scan = new Scan();<a name="line.3348"></a>
+<span class="sourceLineNo">3349</span>    scan.setLoadColumnFamiliesOnDemand(true);<a name="line.3349"></a>
+<span class="sourceLineNo">3350</span>    Filter bogusFilter = new FilterBase() {<a name="line.3350"></a>
+<span class="sourceLineNo">3351</span>      @Override<a name="line.3351"></a>
+<span class="sourceLineNo">3352</span>      public ReturnCode filterCell(final Cell ignored) throws IOException {<a name="line.3352"></a>
+<span class="sourceLineNo">3353</span>        return ReturnCode.INCLUDE;<a name="line.3353"></a>
+<span class="sourceLineNo">3354</span>      }<a name="line.3354"></a>
+<span class="sourceLineNo">3355</span>      @Override<a name="line.3355"></a>
+<span class="sourceLineNo">3356</span>      public boolean isFamilyEssential(byte[] name) {<a name="line.3356"></a>
+<span class="sourceLineNo">3357</span>        return Bytes.equals(name, cf_first);<a name="line.3357"></a>
+<span class="sourceLineNo">3358</span>      }<a name="line.3358"></a>
+<span class="sourceLineNo">3359</span>    };<a name="line.3359"></a>
+<span class="sourceLineNo">3360</span><a name="line.3360"></a>
+<span class="sourceLineNo">3361</span>    scan.setFilter(bogusFilter);<a name="line.3361"></a>
+<span class="sourceLineNo">3362</span>    InternalScanner s = region.getScanner(scan);<a name="line.3362"></a>
+<span class="sourceLineNo">3363</span><a name="line.3363"></a>
+<span class="sourceLineNo">3364</span>    // Our data looks like this:<a name="line.3364"></a>
+<span class="sourceLineNo">3365</span>    // r0: first:a, first:b, second:a, second:b<a name="line.3365"></a>
+<span class="sourceLineNo">3366</span>    // r1: first:a, first:b, second:a, second:b<a name="line.3366"></a>
+<span class="sourceLineNo">3367</span>    // r2: first:a, first:b, second:a, second:b<a name="line.3367"></a>
+<span class="sourceLineNo">3368</span>    // r3: first:a, first:b, second:a, second:b<a name="line.3368"></a>
+<span class="sourceLineNo">3369</span>    // r4: first:a, first:b, second:a, second:b<a name="line.3369"></a>
+<span class="sourceLineNo">3370</span>    // r5: first:a<a name="line.3370"></a>
+<span class="sourceLineNo">3371</span>    // r6: first:a<a name="line.3371"></a>
+<span class="sourceLineNo">3372</span>    // r7: first:a<a name="line.3372"></a>
+<span class="sourceLineNo">3373</span>    // r8: first:a<a name="line.3373"></a>
+<span class="sourceLineNo">3374</span>    // r9: first:a<a name="line.3374"></a>
+<span class="sourceLineNo">3375</span><a name="line.3375"></a>
+<span class="sourceLineNo">3376</span>    // But due to next's limit set to 3, we should get this:<a name="line.3376"></a>
+<span class="sourceLineNo">3377</span>    // r0: first:a, first:b, second:a<a name="line.3377"></a>
+<span class="sourceLineNo">3378</span>    // r0: second:b<a name="line.3378"></a>
+<span class="sourceLineNo">3379</span>    // r1: first:a, first:b, second:a<a name="line.3379"></a>
+<span class="sourceLineNo">3380</span>    // r1: second:b<a name="line.3380"></a>
+<span class="sourceLineNo">3381</span>    // r2: first:a, first:b, second:a<a name="line.3381"></a>
+<span class="sourceLineNo">3382</span>    // r2: second:b<a name="line.3382"></a>
+<span class="sourceLineNo">3383</span>    // r3: first:a, first:b, second:a<a name="line.3383"></a>
+<span class="sourceLineNo">3384</span>    // r3: second:b<a name="line.3384"></a>
+<span class="sourceLineNo">3385</span>    // r4: first:a, first:b, second:a<a name="line.3385"></a>
+<span class="sourceLineNo">3386</span>    // r4: second:b<a name="line.3386"></a>
+<span class="sourceLineNo">3387</span>    // r5: first:a<a name="line.3387"></a>
+<span class="sourceLineNo">3388</span>    // r6: first:a<a name="line.3388"></a>
+<span class="sourceLineNo">3389</span>    // r7: first:a<a name="line.3389"></a>
+<span class="sourceLineNo">3390</span>    // r8: first:a<a name="line.3390"></a>
+<span class="sourceLineNo">3391</span>    // r9: first:a<a name="line.3391"></a>
+<span class="sourceLineNo">3392</span><a name="line.3392"></a>
+<span class="sourceLineNo">3393</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.3393"></a>
+<span class="sourceLineNo">3394</span>    int index = 0;<a name="line.3394"></a>
+<span class="sourceLineNo">3395</span>    ScannerContext scannerContext = ScannerContext.newBuilder().setBatchLimit(3).build();<a name="line.3395"></a>
+<span class="sourceLineNo">3396</span>    while (true) {<a name="line.3396"></a>
+<span class="sourceLineNo">3397</span>      boolean more = s.next(results, scannerContext);<a name="line.3397"></a>
+<span class="sourceLineNo">3398</span>      if ((index &gt;&gt; 1) &lt; 5) {<a name="line.3398"></a>
+<span class="sourceLineNo">3399</span>        if (index % 2 == 0) {<a name="line.3399"></a>
+<span class="sourceLineNo">3400</span>          assertEquals(3, results.size());<a name="line.3400"></a>
+<span class="sourceLineNo">3401</span>        } else {<a name="line.3401"></a>
+<span class="sourceLineNo">3402</span>          assertEquals(1, results.size());<a name="line.3402"></a>
+<span class="sourceLineNo">3403</span>        }<a name="line.3403"></a>
+<span class="sourceLineNo">3404</span>      } else {<a name="line.3404"></a>
+<span class="sourceLineNo">3405</span>        assertEquals(1, results.size());<a name="line.3405"></a>
+<span class="sourceLineNo">3406</span>      }<a name="line.3406"></a>
+<span class="sourceLineNo">3407</span>      results.clear();<a name="line.3407"></a>
+<span class="sourceLineNo">3408</span>      index++;<a name="line.3408"></a>
+<span class="sourceLineNo">3409</span>      if (!more) {<a name="line.3409"></a>
+<span class="sourceLineNo">3410</span>        break;<a name="line.3410"></a>
+<span class="sourceLineNo">3411</span>      }<a name="line.3411"></a>
+<span class="sourceLineNo">3412</span>    }<a name="line.3412"></a>
+<span class="sourceLineNo">3413</span>  }<a name="line.3413"></a>
+<span class="sourceLineNo">3414</span><a name="line.3414"></a>
+<span class="sourceLineNo">3415</span>  /**<a name="line.3415"></a>
+<span class="sourceLineNo">3416</span>   * Write an HFile block full with Cells whose qualifier that are identical between<a name="line.3416"></a>
+<span class="sourceLineNo">3417</span>   * 0 and Short.MAX_VALUE. See HBASE-13329.<a name="line.3417"></a>
+<span class="sourceLineNo">3418</span>   * @throws Exception<a name="line.3418"></a>
+<span class="sourceLineNo">3419</span>   */<a name="line.3419"></a>
+<span class="sourceLineNo">3420</span>  @Test<a name="line.3420"></a>
+<span class="sourceLineNo">3421</span>  public void testLongQualifier() throws Exception {<a name="line.3421"></a>
+<span class="sourceLineNo">3422</span>    byte[] family = Bytes.toBytes("family");<a name="line.3422"></a>
+<span class="sourceLineNo">3423</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.3423"></a>
+<span class="sourceLineNo">3424</span>    byte[] q = new byte[Short.MAX_VALUE+2];<a name="line.3424"></a>
+<span class="sourceLineNo">3425</span>    Arrays.fill(q, 0, q.length-1, (byte)42);<a name="line.3425"></a>
+<span class="sourceLineNo">3426</span>    for (byte i=0; i&lt;10; i++) {<a name="line.3426"></a>
+<span class="sourceLineNo">3427</span>      Put p = new Put(Bytes.toBytes("row"));<a name="line.3427"></a>
+<span class="sourceLineNo">3428</span>      // qualifiers that differ past Short.MAX_VALUE<a name="line.3428"></a>
+<span class="sourceLineNo">3429</span>      q[q.length-1]=i;<a name="line.3429"></a>
+<span class="sourceLineNo">3430</span>      p.addColumn(family, q, q);<a name="line.3430"></a>
+<span class="sourceLineNo">3431</span>      region.put(p);<a name="line.3431"></a>
+<span class="sourceLineNo">3432</span>    }<a name="line.3432"></a>
+<span class="sourceLineNo">3433</span>    region.flush(false);<a name="line.3433"></a>
+<span class="sourceLineNo">3434</span>  }<a name="line.3434"></a>
+<span class="sourceLineNo">3435</span><a name="line.3435"></a>
+<span class="sourceLineNo">3436</span>  /**<a name="line.3436"></a>
+<span class="sourceLineNo">3437</span>   * Flushes the cache in a thread while scanning. The tests verify that the<a name="line.3437"></a>
+<span class="sourceLineNo">3438</span>   * scan is coherent - e.g. the returned results are always of the same or<a name="line.3438"></a>
+<span class="sourceLineNo">3439</span>   * later update as the previous results.<a name="line.3439"></a>
+<span class="sourceLineNo">3440</span>   *<a name="line.3440"></a>
+<span class="sourceLineNo">3441</span>   * @throws IOException<a name="line.3441"></a>
+<span class="sourceLineNo">3442</span>   *           scan / compact<a name="line.3442"></a>
+<span class="sourceLineNo">3443</span>   * @throws InterruptedException<a name="line.3443"></a>
+<span class="sourceLineNo">3444</span>   *           thread join<a name="line.3444"></a>
+<span class="sourceLineNo">3445</span>   */<a name="line.3445"></a>
+<span class="sourceLineNo">3446</span>  @Test<a name="line.3446"></a>
+<span class="sourceLineNo">3447</span>  public void testFlushCacheWhileScanning() throws IOException, InterruptedException {<a name="line.3447"></a>
+<span class="sourceLineNo">3448</span>    byte[] family = Bytes.toBytes("family");<a name="line.3448"></a>
+<span class="sourceLineNo">3449</span>    int numRows = 1000;<a name="line.3449"></a>
+<span class="sourceLineNo">3450</span>    int flushAndScanInterval = 10;<a name="line.3450"></a>
+<span class="sourceLineNo">3451</span>    int compactInterval = 10 * flushAndScanInterval;<a name="line.3451"></a>
 <span class="sourceLineNo">3452</span><a name="line.3452"></a>
-<span class="sourceLineNo">3453</span>      int expectedCount = 0;<a name="line.3453"></a>
-<span class="sourceLineNo">3454</span>      List&lt;Cell&gt; res = new ArrayList&lt;&gt;();<a name="line.3454"></a>
-<span class="sourceLineNo">3455</span><a name="line.3455"></a>
-<span class="sourceLineNo">3456</span>      boolean toggle = true;<a name="line.3456"></a>
-<span class="sourceLineNo">3457</span>      for (long i = 0; i &lt; numRows; i++) {<a name="line.3457"></a>
-<span class="sourceLineNo">3458</span>        Put put = new Put(Bytes.toBytes(i));<a name="line.3458"></a>
-<span class="sourceLineNo">3459</span>        put.setDurability(Durability.SKIP_WAL);<a name="line.3459"></a>
-<span class="sourceLineNo">3460</span>        put.addColumn(family, qual1, Bytes.toBytes(i % 10));<a name="line.3460"></a>
-<span class="sourceLineNo">3461</span>        region.put(put);<a name="line.3461"></a>
+<span class="sourceLineNo">3453</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.3453"></a>
+<span class="sourceLineNo">3454</span>    FlushThread flushThread = new FlushThread();<a name="line.3454"></a>
+<span class="sourceLineNo">3455</span>    try {<a name="line.3455"></a>
+<span class="sourceLineNo">3456</span>      flushThread.start();<a name="line.3456"></a>
+<span class="sourceLineNo">3457</span><a name="line.3457"></a>
+<span class="sourceLineNo">3458</span>      Scan scan = new Scan();<a name="line.3458"></a>
+<span class="sourceLineNo">3459</span>      scan.addFamily(family);<a name="line.3459"></a>
+<span class="sourceLineNo">3460</span>      scan.setFilter(new SingleColumnValueFilter(family, qual1, CompareOperator.EQUAL,<a name="line.3460"></a>
+<span class="sourceLineNo">3461</span>          new BinaryComparator(Bytes.toBytes(5L))));<a name="line.3461"></a>
 <span class="sourceLineNo">3462</span><a name="line.3462"></a>
-<span class="sourceLineNo">3463</span>        if (i != 0 &amp;&amp; i % compactInterval == 0) {<a name="line.3463"></a>
-<span class="sourceLineNo">3464</span>          LOG.debug("iteration = " + i+ " ts="+System.currentTimeMillis());<a name="line.3464"></a>
-<span class="sourceLineNo">3465</span>          region.compact(true);<a name="line.3465"></a>
-<span class="sourceLineNo">3466</span>        }<a name="line.3466"></a>
-<span class="sourceLineNo">3467</span><a name="line.3467"></a>
-<span class="sourceLineNo">3468</span>        if (i % 10 == 5L) {<a name="line.3468"></a>
-<span class="sourceLineNo">3469</span>          expectedCount++;<a name="line.3469"></a>
-<span class="sourceLineNo">3470</span>        }<a name="line.3470"></a>
-<span class="sourceLineNo">3471</span><a name="line.3471"></a>
-<span class="sourceLineNo">3472</span>        if (i != 0 &amp;&amp; i % flushAndScanInterval == 0) {<a name="line.3472"></a>
-<span class="sourceLineNo">3473</span>          res.clear();<a name="line.3473"></a>
-<span class="sourceLineNo">3474</span>          InternalScanner scanner = region.getScanner(scan);<a name="line.3474"></a>
-<span class="sourceLineNo">3475</span>          if (toggle) {<a name="line.3475"></a>
-<span class="sourceLineNo">3476</span>            flushThread.flush();<a name="line.3476"></a>
-<span class="sourceLineNo">3477</span>          }<a name="line.3477"></a>
-<span class="sourceLineNo">3478</span>          while (scanner.next(res))<a name="line.3478"></a>
-<span class="sourceLineNo">3479</span>            ;<a name="line.3479"></a>
-<span class="sourceLineNo">3480</span>          if (!toggle) {<a name="line.3480"></a>
-<span class="sourceLineNo">3481</span>            flushThread.flush();<a name="line.3481"></a>
-<span class="sourceLineNo">3482</span>          }<a name="line.3482"></a>
-<span class="sourceLineNo">3483</span>          assertEquals("toggle="+toggle+"i=" + i + " ts="+System.currentTimeMillis(),<a name="line.3483"></a>
-<span class="sourceLineNo">3484</span>              expectedCount, res.size());<a name="line.3484"></a>
-<span class="sourceLineNo">3485</span>          toggle = !toggle;<a name="line.3485"></a>
-<span class="sourceLineNo">3486</span>        }<a name="line.3486"></a>
-<span class="sourceLineNo">3487</span>      }<a name="line.3487"></a>
-<span class="sourceLineNo">3488</span><a name="line.3488"></a>
-<span class="sourceLineNo">3489</span>    } finally {<a name="line.3489"></a>
-<span class="sourceLineNo">3490</span>      try {<a name="line.3490"></a>
-<span class="sourceLineNo">3491</span>        flushThread.done();<a name="line.3491"></a>
-<span class="sourceLineNo">3492</span>        flushThread.join();<a name="line.3492"></a>
-<span class="sourceLineNo">3493</span>        flushThread.checkNoError();<a name="line.3493"></a>
-<span class="sourceLineNo">3494</span>      } catch (InterruptedException ie) {<a name="line.3494"></a>
-<span class="sourceLineNo">3495</span>        LOG.warn("Caught exception when joining with flushThread", ie);<a name="line.3495"></a>
-<span class="sourceLineNo">3496</span>      }<a name="line.3496"></a>
-<span class="sourceLineNo">3497</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.3497"></a>
-<span class="sourceLineNo">3498</span>      this.region = null;<a name="line.3498"></a>
-<span class="sourceLineNo">3499</span>    }<a name="line.3499"></a>
-<span class="sourceLineNo">3500</span>  }<a name="line.3500"></a>
-<span class="sourceLineNo">3501</span><a name="line.3501"></a>
-<span class="sourceLineNo">3502</span>  protected class FlushThread extends Thread {<a name="line.3502"></a>
-<span class="sourceLineNo">3503</span>    private volatile boolean done;<a name="line.3503"></a>
-<span class="sourceLineNo">3504</span>    private Throwable error = null;<a name="line.3504"></a>
-<span class="sourceLineNo">3505</span><a name="line.3505"></a>
-<span class="sourceLineNo">3506</span>    FlushThread() {<a name="line.3506"></a>
-<span class="sourceLineNo">3507</span>      super("FlushThread");<a name="line.3507"></a>
-<span class="sourceLineNo">3508</span>    }<a name="line.3508"></a>
-<span class="sourceLineNo">3509</span><a name="line.3509"></a>
-<span class="sourceLineNo">3510</span>    public void done() {<a name="line.3510"></a>
-<span class="sourceLineNo">3511</span>      done = true;<a name="line.3511"></a>
-<span class="sourceLineNo">3512</span>      synchronized (this) {<a name="line.3512"></a>
-<span class="sourceLineNo">3513</span>        interrupt();<a name="line.3513"></a>
-<span class="sourceLineNo">3514</span>      }<a name="line.3514"></a>
-<span class="sourceLineNo">3515</span>    }<a name="line.3515"></a>
-<span class="sourceLineNo">3516</span><a name="line.3516"></a>
-<span class="sourceLineNo">3517</span>    public void checkNoError() {<a name="line.3517"></a>
-<span class="sourceLineNo">3518</span>      if (error != null) {<a name="line.3518"></a>
-<span class="sourceLineNo">3519</span>        assertNull(error);<a name="line.3519"></a>
-<span class="sourceLineNo">3520</span>      }<a name="line.3520"></a>
-<span class="sourceLineNo">3521</span>    }<a name="line.3521"></a>
-<span class="sourceLineNo">3522</span><a name="line.3522"></a>
-<span class="sourceLineNo">3523</span>    @Override<a name="line.3523"></a>
-<span class="sourceLineNo">3524</span>    public void run() {<a name="line.3524"></a>
-<span class="sourceLineNo">3525</span>      done = false;<a name="line.3525"></a>
-<span class="sourceLineNo">3526</span>      while (!done) {<a name="line.3526"></a>
-<span class="sourceLineNo">3527</span>        synchronized (this) {<a name="line.3527"></a>
-<span class="sourceLineNo">3528</span>          try {<a name="line.3528"></a>
-<span class="sourceLineNo">3529</span>            wait();<a name="line.3529"></a>
-<span class="sourceLineNo">3530</span>          } catch (InterruptedException ignored) {<a name="line.3530"></a>
-<span class="sourceLineNo">3531</span>            if (done) {<a name="line.3531"></a>
-<span class="sourceLineNo">3532</span>              break;<a name="line.3532"></a>
-<span class="sourceLineNo">3533</span>            }<a name="line.3533"></a>
-<span class="sourceLineNo">3534</span>          }<a name="line.3534"></a>
-<span class="sourceLineNo">3535</span>        }<a name="line.3535"></a>
-<span class="sourceLineNo">3536</span>        try {<a name="line.3536"></a>
-<span class="sourceLineNo">3537</span>          region.flush(true);<a name="line.3537"></a>
-<span class="sourceLineNo">3538</span>        } catch (IOException e) {<a name="line.3538"></a>
-<span class="sourceLineNo">3539</span>          if (!done) {<a name="line.3539"></a>
-<span class="sourceLineNo">3540</span>            LOG.error("Error while flushing cache", e);<a name="line.3540"></a>
-<span class="sourceLineNo">3541</span>            error = e;<a name="line.3541"></a>
-<span class="sourceLineNo">3542</span>          }<a name="line.3542"></a>
-<span class="sourceLineNo">3543</span>          break;<a name="line.3543"></a>
-<span class="sourceLineNo">3544</span>        } catch (Throwable t) {<a name="line.3544"></a>
-<span class="sourceLineNo">3545</span>          LOG.error("Uncaught exception", t);<a name="line.3545"></a>
-<span class="sourceLineNo">3546</span>          throw t;<a name="line.3546"></a>
-<span class="sourceLineNo">3547</span>        }<a name="line.3547"></a>
-<span class="sourceLineNo">3548</span>      }<a name="line.3548"></a>
-<span class="sourceLineNo">3549</span>    }<a name="line.3549"></a>
-<span class="sourceLineNo">3550</span><a name="line.3550"></a>
-<span class="sourceLineNo">3551</span>    public void flush() {<a name="line.3551"></a>
-<span class="sourceLineNo">3552</span>      synchronized (this) {<a name="line.3552"></a>
-<span class="sourceLineNo">3553</span>        notify();<a name="line.3553"></a>
-<span class="sourceLineNo">3554</span>      }<a name="line.3554"></a>
-<span class="sourceLineNo">3555</span>    }<a name="line.3555"></a>
-<span class="sourceLineNo">3556</span>  }<a name="line.3556"></a>
-<span class="sourceLineNo">3557</span><a name="line.3557"></a>
-<span class="sourceLineNo">3558</span>  /**<a name="line.3558"></a>
-<span class="sourceLineNo">3559</span>   * Writes very wide records and scans for the latest every time.. Flushes and<a name="line.3559"></a>
-<span class="sourceLineNo">3560</span>   * compacts the region every now and then to keep things realistic.<a name="line.3560"></a>
-<span class="sourceLineNo">3561</span>   *<a name="line.3561"></a>
-<span class="sourceLineNo">3562</span>   * @throws IOException<a name="line.3562"></a>
-<span class="sourceLineNo">3563</span>   *           by flush / scan / compaction<a name="line.3563"></a>
-<span class="sourceLineNo">3564</span>   * @throws InterruptedException<a name="line.3564"></a>
-<span class="sourceLineNo">3565</span>   *           when joining threads<a name="line.3565"></a>
-<span class="sourceLineNo">3566</span>   */<a name="line.3566"></a>
-<span class="sourceLineNo">3567</span>  @Test<a name="line.3567"></a>
-<span class="sourceLineNo">3568</span>  public void testWritesWhileScanning() throws IOException, InterruptedException {<a name="line.3568"></a>
-<span class="sourceLineNo">3569</span>    int testCount = 100;<a name="line.3569"></a>
-<span class="sourceLineNo">3570</span>    int numRows = 1;<a name="line.3570"></a>
-<span class="sourceLineNo">3571</span>    int numFamilies = 10;<a name="line.3571"></a>
-<span class="sourceLineNo">3572</span>    int numQualifiers = 100;<a name="line.3572"></a>
-<span class="sourceLineNo">3573</span>    int flushInterval = 7;<a name="line.3573"></a>
-<span class="sourceLineNo">3574</span>    int compactInterval = 5 * flushInterval;<a name="line.3574"></a>
-<span class="sourceLineNo">3575</span>    byte[][] families = new byte[numFamilies][];<a name="line.3575"></a>
-<span class="sourceLineNo">3576</span>    for (int i = 0; i &lt; numFamilies; i++) {<a name="line.3576"></a>
-<span class="sourceLineNo">3577</span>      families[i] = Bytes.toBytes("family" + i);<a name="line.3577"></a>
-<span class="sourceLineNo">3578</span>    }<a name="line.3578"></a>
-<span class="sourceLineNo">3579</span>    byte[][] qualifiers = new byte[numQualifiers][];<a name="line.3579"></a>
-<span class="sourceLineNo">3580</span>    for (int i = 0; i &lt; numQualifiers; i++) {<a name="line.3580"></a>
-<span class="sourceLineNo">3581</span>      qualifiers[i] = Bytes.toBytes("qual" + i);<a name="line.3581"></a>
-<span class="sourceLineNo">3582</span>    }<a name="line.3582"></a>
-<span class="sourceLineNo">3583</span><a name="line.3583"></a>
-<span class="sourceLineNo">3584</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.3584"></a>
-<span class="sourceLineNo">3585</span>    FlushThread flushThread = new FlushThread();<a name="line.3585"></a>
-<span class="sourceLineNo">3586</span>    PutThread putThread = new PutThread(numRows, families, qualifiers);<a name="line.3586"></a>
-<span class="sourceLineNo">3587</span>    try {<a name="line.3587"></a>
-<span class="sourceLineNo">3588</span>      putThread.start();<a name="line.3588"></a>
-<span class="sourceLineNo">3589</span>      putThread.waitForFirstPut();<a name="line.3589"></a>
-<span class="sourceLineNo">3590</span><a name="line.3590"></a>
-<span class="sourceLineNo">3591</span>      flushThread.start();<a name="line.3591"></a>
-<span class="sourceLineNo">3592</span><a name="line.3592"></a>
-<span class="sourceLineNo">3593</span>      Scan scan = new Scan(Bytes.toBytes("row0"), Bytes.toBytes("row1"));<a name="line.3593"></a>
-<span class="sourceLineNo">3594</span><a name="line.3594"></a>
-<span class="sourceLineNo">3595</span>      int expectedCount = numFamilies * numQualifiers;<a name="line.3595"></a>
-<span class="sourceLineNo">3596</span>      List&lt;Cell&gt; res = new ArrayList&lt;&gt;();<a name="line.3596"></a>
-<span class="sourceLineNo">3597</span><a name="line.3597"></a>
-<span class="sourceLineNo">3598</span>      long prevTimestamp = 0L;<a name="line.3598"></a>
-<span class="sourceLineNo">3599</span>      for (int i = 0; i &lt; testCount; i++) {<a name="line.3599"></a>
+<span class="sourceLineNo">3463</span>      int expectedCount = 0;<a name="line.3463"></a>
+<span class="sourceLineNo">3464</span>      List&lt;Cell&gt; res = new ArrayList&lt;&gt;();<a name="line.3464"></a>
+<span class="sourceLineNo">3465</span><a name="line.3465"></a>
+<span class="sourceLineNo">3466</span>      boolean toggle = true;<a name="line.3466"></a>
+<span class="sourceLineNo">3467</span>      for (long i = 0; i &lt; numRows; i++) {<a name="line.3467"></a>
+<span class="sourceLineNo">3468</span>        Put put = new Put(Bytes.toBytes(i));<a name="line.3468"></a>
+<span class="sourceLineNo">3469</span>        put.setDurability(Durability.SKIP_WAL);<a name="line.3469"></a>
+<span class="sourceLineNo">3470</span>        put.addColumn(family, qual1, Bytes.toBytes(i % 10));<a name="line.3470"></a>
+<span class="sourceLineNo">3471</span>        region.put(put);<a name="line.3471"></a>
+<span class="sourceLineNo">3472</span><a name="line.3472"></a>
+<span class="sourceLineNo">3473</span>        if (i != 0 &amp;&amp; i % compactInterval == 0) {<a name="line.3473"></a>
+<span class="sourceLineNo">3474</span>          LOG.debug("iteration = " + i+ " ts="+System.currentTimeMillis());<a name="line.3474"></a>
+<span class="sourceLineNo">3475</span>          region.compact(true);<a name="line.3475"></a>
+<span class="sourceLineNo">3476</span>        }<a name="line.3476"></a>
+<span class="sourceLineNo">3477</span><a name="line.3477"></a>
+<span class="sourceLineNo">3478</span>        if (i % 10 == 5L) {<a name="line.3478"></a>
+<span class="sourceLineNo">3479</span>          expectedCount++;<a name="line.3479"></a>
+<span class="sourceLineNo">3480</span>        }<a name="line.3480"></a>
+<span class="sourceLineNo">3481</span><a name="line.3481"></a>
+<span class="sourceLineNo">3482</span>        if (i != 0 &amp;&amp; i % flushAndScanInterval == 0) {<a name="line.3482"></a>
+<span class="sourceLineNo">3483</span>          res.clear();<a name="line.3483"></a>
+<span class="sourceLineNo">3484</span>          InternalScanner scanner = region.getScanner(scan);<a name="line.3484"></a>
+<span class="sourceLineNo">3485</span>          if (toggle) {<a name="line.3485"></a>
+<span class="sourceLineNo">3486</span>            flushThread.flush();<a name="line.3486"></a>
+<span class="sourceLineNo">3487</span>          }<a name="line.3487"></a>
+<span class="sourceLineNo">3488</span>          while (scanner.next(res))<a name="line.3488"></a>
+<span class="sourceLineNo">3489</span>            ;<a name="line.3489"></a>
+<span class="sourceLineNo">3490</span>          if (!toggle) {<a name="line.3490"></a>
+<span class="sourceLineNo">3491</span>            flushThread.flush();<a name="line.3491"></a>
+<span class="sourceLineNo">3492</span>          }<a name="line.3492"></a>
+<span class="sourceLineNo">3493</span>          assertEquals("toggle="+toggle+"i=" + i + " ts="+System.currentTimeMillis(),<a name="line.3493"></a>
+<span class="sourceLineNo">3494</span>              expectedCount, res.size());<a name="line.3494"></a>
+<span class="sourceLineNo">3495</span>          toggle = !toggle;<a name="line.3495"></a>
+<span class="sourceLineNo">3496</span>        }<a name="line.3496"></a>
+<span class="sourceLineNo">3497</span>      }<a name="line.3497"></a>
+<span class="sourceLineNo">3498</span><a name="line.3498"></a>
+<span class="sourceLineNo">3499</span>    } finally {<a name="line.3499"></a>
+<span class="sourceLineNo">3500</span>      try {<a name="line.3500"></a>
+<span class="sourceLineNo">3501</span>        flushThread.done();<a name="line.3501"></a>
+<span class="sourceLineNo">3502</span>        flushThread.join();<a name="line.3502"></a>
+<span class="sourceLineNo">3503</span>        flushThread.checkNoError();<a name="line.3503"></a>
+<span class="sourceLineNo">3504</span>      } catch (InterruptedException ie) {<a name="line.3504"></a>
+<span class="sourceLineNo">3505</span>        LOG.warn("Caught exception when joining with flushThread", ie);<a name="line.3505"></a>
+<span class="sourceLineNo">3506</span>      }<a name="line.3506"></a>
+<span class="sourceLineNo">3507</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.3507"></a>
+<span class="sourceLineNo">3508</span>      this.region = null;<a name="line.3508"></a>
+<span class="sourceLineNo">3509</span>    }<a name="line.3509"></a>
+<span class="sourceLineNo">3510</span>  }<a name="line.3510"></a>
+<span class="sourceLineNo">3511</span><a name="line.3511"></a>
+<span class="sourceLineNo">3512</span>  protected class FlushThread extends Thread {<a name="line.3512"></a>
+<span class="sourceLineNo">3513</span>    private volatile boolean done;<a name="line.3513"></a>
+<span class="sourceLineNo">3514</span>    private Throwable error = null;<a name="line.3514"></a>
+<span class="sourceLineNo">3515</span><a name="line.3515"></a>
+<span class="sourceLineNo">3516</span>    FlushThread() {<a name="line.3516"></a>
+<span class="sourceLineNo">3517</span>      super("FlushThread");<a name="line.3517"></a>
+<span class="sourceLineNo">3518</span>    }<a name="line.3518"></a>
+<span class="sourceLineNo">3519</span><a name="line.3519"></a>
+<span class="sourceLineNo">3520</span>    public void done() {<a name="line.3520"></a>
+<span class="sourceLineNo">3521</span>      done = true;<a name="line.3521"></a>
+<span class="sourceLineNo">3522</span>      synchronized (this) {<a name="line.3522"></a>
+<span class="sourceLineNo">3523</span>        interrupt();<a name="line.3523"></a>
+<span class="sourceLineNo">3524</span>      }<a name="line.3524"></a>
+<span class="sourceLineNo">3525</span>    }<a name="line.3525"></a>
+<span class="sourceLineNo">3526</span><a name="line.3526"></a>
+<span class="sourceLineNo">3527</span>    public void checkNoError() {<a name="line.3527"></a>
+<span class="sourceLineNo">3528</span>      if (error != null) {<a name="line.3528"></a>
+<span class="sourceLineNo">3529</span>        assertNull(error);<a name="line.3529"></a>
+<span class="sourceLineNo">3530</span>      }<a name="line.3530"></a>
+<span class="sourceLineNo">3531</span>    }<a name="line.3531"></a>
+<span class="sourceLineNo">3532</span><a name="line.3532"></a>
+<span class="sourceLineNo">3533</span>    @Override<a name="line.3533"></a>
+<span class="sourceLineNo">3534</span>    public void run() {<a name="line.3534"></a>
+<span class="sourceLineNo">3535</span>      done = false;<a name="line.3535"></a>
+<span class="sourceLineNo">3536</span>      while (!done) {<a name="line.3536"></a>
+<span class="sourceLineNo">3537</span>        synchronized (this) {<a name="line.3537"></a>
+<span class="sourceLineNo">3538</span>          try {<a name="line.3538"></a>
+<span class="sourceLineNo">3539</span>            wait();<a name="line.3539"></a>
+<span class="sourceLineNo">3540</span>          } catch (InterruptedException ignored) {<a name="line.3540"></a>
+<span class="sourceLineNo">3541</span>            if (done) {<a name="line.3541"></a>
+<span class="sourceLineNo">3542</span>              break;<a name="line.3542"></a>
+<span class="sourceLineNo">3543</span>            }<a name="line.3543"></a>
+<span class="sourceLineNo">3544</span>          }<a name="line.3544"></a>
+<span class="sourceLineNo">3545</span>        }<a name="line.3545"></a>
+<span class="sourceLineNo">3546</span>        try {<a name="line.3546"></a>
+<span class="sourceLineNo">3547</span>          region.flush(true);<a name="line.3547"></a>
+<span class="sourceLineNo">3548</span>        } catch (IOException e) {<a name="line.3548"></a>
+<span class="sourceLineNo">3549</span>          if (!done) {<a name="line.3549"></a>
+<span class="sourceLineNo">3550</span>            LOG.error("Error while flushing cache", e);<a name="line.3550"></a>
+<span class="sourceLineNo">3551</span>            error = e;<a name="line.3551"></a>
+<span class="sourceLineNo">3552</span>          }<a name="line.3552"></a>
+<span class="sourceLineNo">3553</span>          break;<a name="line.3553"></a>
+<span class="sourceLineNo">3554</span>        } catch (Throwable t) {<a name="line.3554"></a>
+<span class="sourceLineNo">3555</span>          LOG.error("Uncaught exception", t);<a name="line.3555"></a>
+<span class="sourceLineNo">3556</span>          throw t;<a name="line.3556"></a>
+<span class="sourceLineNo">3557</span>        }<a name="line.3557"></a>
+<span class="sourceLineNo">3558</span>      }<a name="line.3558"></a>
+<span class="sourceLineNo">3559</span>    }<a name="line.3559"></a>
+<span class="sourceLineNo">3560</span><a name="line.3560"></a>
+<span class="sourceLineNo">3561</span>    public void flush() {<a name="line.3561"></a>
+<span class="sourceLineNo">3562</span>      synchronized (this) {<a name="line.3562"></a>
+<span class="sourceLineNo">3563</span>        notify();<a name="line.3563"></a>
+<span class="sourceLineNo">3564</span>      }<a name="line.3564"></a>
+<span class="sourceLineNo">3565</span>    }<a name="line.3565"></a>
+<span class="sourceLineNo">3566</span>  }<a name="line.3566"></a>
+<span class="sourceLineNo">3567</span><a name="line.3567"></a>
+<span class="sourceLineNo">3568</span>  /**<a name="line.3568"></a>
+<span class="sourceLineNo">3569</span>   * Writes very wide records and scans for the latest every time.. Flushes and<a name="line.3569"></a>
+<span class="sourceLineNo">3570</span>   * compacts the region every now and then to keep things realistic.<a name="line.3570"></a>
+<span class="sourceLineNo">3571</span>   *<a name="line.3571"></a>
+<span class="sourceLineNo">3572</span>   * @throws IOException<a name="line.3572"></a>
+<span class="sourceLineNo">3573</span>   *           by flush / scan / compaction<a name="line.3573"></a>
+<span class="sourceLineNo">3574</span>   * @throws InterruptedException<a name="line.3574"></a>
+<span class="sourceLineNo">3575</span>   *           when joining threads<a name="line.3575"></a>
+<span class="sourceLineNo">3576</span>   */<a name="line.3576"></a>
+<span class="sourceLineNo">3577</span>  @Test<a name="line.3577"></a>
+<span class="sourceLineNo">3578</span>  public void testWritesWhileScanning() throws IOException, InterruptedException {<a name="line.3578"></a>
+<span class="sourceLineNo">3579</span>    int testCount = 100;<a name="line.3579"></a>
+<span class="sourceLineNo">3580</span>    int numRows = 1;<a name="line.3580"></a>
+<span class="sourceLineNo">3581</span>    int numFamilies = 10;<a name="line.3581"></a>
+<span class="sourceLineNo">3582</span>    int numQualifiers = 100;<a name="line.3582"></a>
+<span class="sourceLineNo">3583</span>    int flushInterval = 7;<a name="line.3583"></a>
+<span class="sourceLineNo">3584</span>    int compactInterval = 5 * flushInterval;<a name="line.3584"></a>
+<span class="sourceLineNo">3585</span>    byte[][] families = new byte[numFamilies][];<a name="line.3585"></a>
+<span class="sourceLineNo">3586</span>    for (int i = 0; i &lt; numFamilies; i++) {<a name="line.3586"></a>
+<span class="sourceLineNo">3587</span>      families[i] = Bytes.toBytes("family" + i);<a name="line.3587"></a>
+<span class="sourceLineNo">3588</span>    }<a name="line.3588"></a>
+<span class="sourceLineNo">3589</span>    byte[][] qualifiers = new byte[numQualifiers][];<a name="line.3589"></a>
+<span class="sourceLineNo">3590</span>    for (int i = 0; i &lt; numQualifiers; i++) {<a name="line.3590"></a>
+<span class="sourceLineNo">3591</span>      qualifiers[i] = Bytes.toBytes("qual" + i);<a name="line.3591"></a>
+<span class="sourceLineNo">3592</span>    }<a name="line.3592"></a>
+<span class="sourceLineNo">3593</span><a name="line.3593"></a>
+<span class="sourceLineNo">3594</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.3594"></a>
+<span class="sourceLineNo">3595</span>    FlushThread flushThread = new FlushThread();<a name="line.3595"></a>
+<span class="sourceLineNo">3596</span>    PutThread putThread = new PutThread(numRows, families, qualifiers);<a name="line.3596"></a>
+<span class="sourceLineNo">3597</span>    try {<a name="line.3597"></a>
+<span class="sourceLineNo">3598</span>      putThread.start();<a name="line.3598"></a>
+<span class="sourceLineNo">3599</span>      putThread.waitForFirstPut();<a name="line.3599"></a>
 <span class="sourceLineNo">3600</span><a name="line.3600"></a>
-<span class="sourceLineNo">3601</span>        if (i != 0 &amp;&amp; i % compactInterval == 0) {<a name="line.3601"></a>
-<span class="sourceLineNo">3602</span>          region.compact(true);<a name="line.3602"></a>
-<span class="sourceLineNo">3603</span>          for (HStore store : region.getStores()) {<a name="line.3603"></a>
-<span class="sourceLineNo">3604</span>            store.closeAndArchiveCompactedFiles();<a name="line.3604"></a>
-<span class="sourceLineNo">3605</span>          }<a name="line.3605"></a>
-<span class="sourceLineNo">3606</span>        }<a name="line.3606"></a>
+<span class="sourceLineNo">3601</span>      flushThread.start();<a name="line.3601"></a>
+<span class="sourceLineNo">3602</span><a name="line.3602"></a>
+<span class="sourceLineNo">3603</span>      Scan scan = new Scan(Bytes.toBytes("row0"), Bytes.toBytes("row1"));<a name="line.3603"></a>
+<span class="sourceLineNo">3604</span><a name="line.3604"></a>
+<span class="sourceLineNo">3605</span>      int expectedCount = numFamilies * numQualifiers;<a name="line.3605"></a>
+<span class="sourceLineNo">3606</span>      List&lt;Cell&gt; res = new ArrayList&lt;&gt;();<a name="line.3606"></a>
 <span class="sourceLineNo">3607</span><a name="line.3607"></a>
-<span class="sourceLineNo">3608</span>        if (i != 0 &amp;&amp; i % flushInterval == 0) {<a name="line.3608"></a>
-<span class="sourceLineNo">3609</span>          flushThread.flush();<a name="line.3609"></a>
-<span class="sourceLineNo">3610</span>        }<a name="line.3610"></a>
-<span class="sourceLineNo">3611</span><a name="line.3611"></a>
-<span class="sourceLineNo">3612</span>        boolean previousEmpty = res.isEmpty();<a name="line.3612"></a>
-<span class="sourceLineNo">3613</span>        res.clear();<a name="line.3613"></a>
-<span class="sourceLineNo">3614</span>        try (InternalScanner scanner = region.getScanner(scan)) {<a name="line.3614"></a>
-<span class="sourceLineNo">3615</span>          boolean moreRows;<a name="line.3615"></a>
-<span class="sourceLineNo">3616</span>          do {<a name="line.3616"></a>
-<span class="sourceLineNo">3617</span>            moreRows = scanner.next(res);<a name="line.3617"></a>
-<span class="sourceLineNo">3618</span>          } while (moreRows);<a name="line.3618"></a>
-<span class="sourceLineNo">3619</span>        }<a name="line.3619"></a>
-<span class="sourceLineNo">3620</span>        if (!res.isEmpty() || !previousEmpty || i &gt; compactInterval) {<a name="line.3620"></a>
-<span class="sourceLineNo">3621</span>          assertEquals("i=" + i, expectedCount, res.size());<a name="line.3621"></a>
-<span class="sourceLineNo">3622</span>          long timestamp = res.get(0).getTimestamp();<a name="line.3622"></a>
-<span class="sourceLineNo">3623</span>          assertTrue("Timestamps were broke: " + timestamp + " prev: " + prevTimestamp,<a name="line.3623"></a>
-<span class="sourceLineNo">3624</span>              timestamp &gt;= prevTimestamp);<a name="line.3624"></a>
-<span class="sourceLineNo">3625</span>          prevTimestamp = timestamp;<a name="line.3625"></a>
-<span class="sourceLineNo">3626</span>        }<a name="line.3626"></a>
-<span class="sourceLineNo">3627</span>      }<a name="line.3627"></a>
-<span class="sourceLineNo">3628</span><a name="line.3628"></a>
-<span class="sourceLineNo">3629</span>      putThread.done();<a name="line.3629"></a>
-<span class="sourceLineNo">3630</span><a name="line.3630"></a>
-<span class="sourceLineNo">3631</span>      region.flush(true);<a name="line.3631"></a>
-<span class="sourceLineNo">3632</span><a name="line.3632"></a>
-<span class="sourceLineNo">3633</span>    } finally {<a name="line.3633"></a>
-<span class="sourceLineNo">3634</span>      try {<a name="line.3634"></a>
-<span class="sourceLineNo">3635</span>        flushThread.done();<a name="line.3635"></a>
-<span class="sourceLineNo">3636</span>        flushThread.join();<a name="line.3636"></a>
-<span class="sourceLineNo">3637</span>        flushThread.checkNoError();<a name="line.3637"></a>
+<span class="sourceLineNo">3608</span>      long prevTimestamp = 0L;<a name="line.3608"></a>
+<span class="sourceLineNo">3609</span>      for (int i = 0; i &lt; testCount; i++) {<a name="line.3609"></a>
+<span class="sourceLineNo">3610</span><a name="line.3610"></a>
+<span class="sourceLineNo">3611</span>        if (i != 0 &amp;&amp; i % compactInterval == 0) {<a name="line.3611"></a>
+<span class="sourceLineNo">3612</span>          region.compact(true);<a name="line.3612"></a>
+<span class="sourceLineNo">3613</span>          for (HStore store : region.getStores()) {<a name="line.3613"></a>
+<span class="sourceLineNo">3614</span>            store.closeAndArchiveCompactedFiles();<a name="line.3614"></a>
+<span class="sourceLineNo">3615</span>          }<a name="line.3615"></a>
+<span class="sourceLineNo">3616</span>        }<a name="line.3616"></a>
+<span class="sourceLineNo">3617</span><a name="line.3617"></a>
+<span class="sourceLineNo">3618</span>        if (i != 0 &amp;&amp; i % flushInterval == 0) {<a name="line.3618"></a>
+<span class="sourceLineNo">3619</span>          flushThread.flush();<a name="line.3619"></a>
+<span class="sourceLineNo">3620</span>        }<a name="line.3620"></a>
+<span class="sourceLineNo">3621</span><a name="line.3621"></a>
+<span class="sourceLineNo">3622</span>        boolean previousEmpty = res.isEmpty();<a name="line.3622"></a>
+<span class="sourceLineNo">3623</span>        res.clear();<a name="line.3623"></a>
+<span class="sourceLineNo">3624</span>        try (InternalScanner scanner = region.getScanner(scan)) {<a name="line.3624"></a>
+<span class="sourceLineNo">3625</span>          boolean moreRows;<a name="line.3625"></a>
+<span class="sourceLineNo">3626</span>          do {<a name="line.3626"></a>
+<span class="sourceLineNo">3627</span>            moreRows = scanner.next(res);<a name="line.3627"></a>
+<span class="sourceLineNo">3628</span>          } while (moreRows);<a name="line.3628"></a>
+<span class="sourceLineNo">3629</span>        }<a name="line.3629"></a>
+<span class="sourceLineNo">3630</span>        if (!res.isEmpty() || !previousEmpty || i &gt; compactInterval) {<a name="line.3630"></a>
+<span class="sourceLineNo">3631</span>          assertEquals("i=" + i, expectedCount, res.size());<a name="line.3631"></a>
+<span class="sourceLineNo">3632</span>          long timestamp = res.get(0).getTimestamp();<a name="line.3632"></a>
+<span class="sourceLineNo">3633</span>          assertTrue("Timestamps were broke: " + timestamp + " prev: " + prevTimestamp,<a name="line.3633"></a>
+<span class="sourceLineNo">3634</span>              timestamp &gt;= prevTimestamp);<a name="line.3634"></a>
+<span class="sourceLineNo">3635</span>          prevTimestamp = timestamp;<a name="line.3635"></a>
+<span class="sourceLineNo">3636</span>        }<a name="line.3636"></a>
+<span class="sourceLineNo">3637</span>      }<a name="line.3637"></a>
 <span class="sourceLineNo">3638</span><a name="line.3638"></a>
-<span class="sourceLineNo">3639</span>        putThread.join();<a name="line.3639"></a>
-<span class="sourceLineNo">3640</span>        putThread.checkNoError();<a name="line.3640"></a>
-<span class="sourceLineNo">3641</span>      } catch (InterruptedException ie) {<a name="line.3641"></a>
-<span class="sourceLineNo">3642</span>        LOG.warn("Caught exception when joining with flushThread", ie);<a name="line.3642"></a>
-<span class="sourceLineNo">3643</span>      }<a name="line.3643"></a>
-<span class="sourceLineNo">3644</span><a name="line.3644"></a>
-<span class="sourceLineNo">3645</span>      try {<a name="line.3645"></a>
-<span class="sourceLineNo">3646</span>          HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.3646"></a>
-<span class="sourceLineNo">3647</span>      } catch (DroppedSnapshotException dse) {<a name="line.3647"></a>
-<span class="sourceLineNo">3648</span>        // We could get this on way out because we interrupt the background flusher and it could<a name="line.3648"></a>
-<span class="sourceLineNo">3649</span>        // fail anywhere causing a DSE over in the background flusher... only it is not properly<a name="line.3649"></a>
-<span class="sourceLineNo">3650</span>        // dealt with so could still be memory hanging out when we get to here -- memory we can't<a name="line.3650"></a>
-<span class="sourceLineNo">3651</span>        // flush because the accounting is 'off' since original DSE.<a name="line.3651"></a>
-<span class="sourceLineNo">3652</span>      }<a name="line.3652"></a>
-<span class="sourceLineNo">3653</span>      this.region = null;<a name="line.3653"></a>
-<span class="sourceLineNo">3654</span>    }<a name="line.3654"></a>
-<span class="sourceLineNo">3655</span>  }<a name="line.3655"></a>
-<span class="sourceLineNo">3656</span><a name="line.3656"></a>
-<span class="sourceLineNo">3657</span>  protected class PutThread extends Thread {<a name="line.3657"></a>
-<span class="sourceLineNo">3658</span>    private volatile boolean done;<a name="line.3658"></a>
-<span class="sourceLineNo">3659</span>    private volatile int numPutsFinished = 0;<a name="line.3659"></a>
-<span class="sourceLineNo">3660</span><a name="line.3660"></a>
-<span class="sourceLineNo">3661</span>    private Throwable error = null;<a name="line.3661"></a>
-<span class="sourceLineNo">3662</span>    private int numRows;<a name="line.3662"></a>
-<span class="sourceLineNo">3663</span>    private byte[][] families;<a name="line.3663"></a>
-<span class="sourceLineNo">3664</span>    private byte[][] qualifiers;<a name="line.3664"></a>
-<span class="sourceLineNo">3665</span><a name="line.3665"></a>
-<span class="sourceLineNo">3666</span>    private PutThread(int numRows, byte[][] families, byte[][] qualifiers) {<a name="line.3666"></a>
-<span class="sourceLineNo">3667</span>      super("PutThread");<a name="line.3667"></a>
-<span class="sourceLineNo">3668</span>      this.numRows = numRows;<a name="line.3668"></a>
-<span class="sourceLineNo">3669</span>      this.families = families;<a name="line.3669"></a>
-<span class="sourceLineNo">3670</span>      this.qualifiers = qualifiers;<a name="line.3670"></a>
-<span class="sourceLineNo">3671</span>    }<a name="line.3671"></a>
-<span class="sourceLineNo">3672</span><a name="line.3672"></a>
-<span class="sourceLineNo">3673</span>    /**<a name="line.3673"></a>
-<span class="sourceLineNo">3674</span>     * Block calling thread until this instance of PutThread has put at least one row.<a name="line.3674"></a>
-<span class="sourceLineNo">3675</span>     */<a name="line.3675"></a>
-<span class="sourceLineNo">3676</span>    public void waitForFirstPut() throws InterruptedException {<a name="line.3676"></a>
-<span class="sourceLineNo">3677</span>      // wait until put thread actually puts some data<a name="line.3677"></a>
-<span class="sourceLineNo">3678</span>      while (isAlive() &amp;&amp; numPutsFinished == 0) {<a name="line.3678"></a>
-<span class="sourceLineNo">3679</span>        checkNoError();<a name="line.3679"></a>
-<span class="sourceLineNo">3680</span>        Thread.sleep(50);<a name="line.3680"></a>
-<span class="sourceLineNo">3681</span>      }<a name="line.3681"></a>
-<span class="sourceLineNo">3682</span>    }<a name="line.3682"></a>
-<span class="sourceLineNo">3683</span><a name="line.3683"></a>
-<span class="sourceLineNo">3684</span>    public void done() {<a name="line.3684"></a>
-<span class="sourceLineNo">3685</span>      done = true;<a name="line.3685"></a>
-<span class="sourceLineNo">3686</span>      synchronized (this) {<a name="line.3686"></a>
-<span class="sourceLineNo">3687</span>        interrupt();<a name="line.3687"></a>
-<span class="sourceLineNo">3688</span>      }<a name="line.3688"></a>
-<span class="sourceLineNo">3689</span>    }<a name="line.3689"></a>
-<span class="sourceLineNo">3690</span><a name="line.3690"></a>
-<span class="sourceLineNo">3691</span>    public void checkNoError() {<a name="line.3691"></a>
-<span class="sourceLineNo">3692</span>      if (error != null) {<a name="line.3692"></a>
-<span class="sourceLineNo">3693</span>        assertNull(error);<a name="line.3693"></a>
-<span class="sourceLineNo">3694</span>      }<a name="line.3694"></a>
-<span class="sourceLineNo">3695</span>    }<a name="line.3695"></a>
-<span class="sourceLineNo">3696</span><a name="line.3696"></a>
-<span class="sourceLineNo">3697</span>    @Override<a name="line.3697"></a>
-<span class="sourceLineNo">3698</span>    public void run() {<a name="line.3698"></a>
-<span class="sourceLineNo">3699</span>      done = false;<a name="line.3699"></a>
-<span class="sourceLineNo">3700</span>      while (!done) {<a name="line.3700"></a>
-<span class="sourceLineNo">3701</span>        try {<a name="line.3701"></a>
-<span class="sourceLineNo">3702</span>          for (int r = 0; r &lt; numRows; r++) {<a name="line.3702"></a>
-<span class="sourceLineNo">3703</span>            byte[] row = Bytes.toBytes("row" + r);<a name="line.3703"></a>
-<span class="sourceLineNo">3704</span>            Put put = new Put(row);<a name="line.3704"></a>
-<span class="sourceLineNo">3705</span>            put.setDurability(Durability.SKIP_WAL);<a name="line.3705"></a>
-<span class="sourceLineNo">3706</span>            byte[] value = Bytes.toBytes(String.valueOf(numPutsFinished));<a name="line.3706"></a>
-<span class="sourceLineNo">3707</span>            for (byte[] family : families) {<a name="line.3707"></a>
-<span class="sourceLineNo">3708</span>              for (byte[] qualifier : qualifiers) {<a name="line.3708"></a>
-<span class="sourceLineNo">3709</span>                put.addColumn(family, qualifier, numPutsFinished, value);<a name="line.3709"></a>
-<span class="sourceLineNo">3710</span>              }<a name="line.3710"></a>
-<span class="sourceLineNo">3711</span>            }<a name="line.3711"></a>
-<span class="sourceLineNo">3712</span>            region.put(put);<a name="line.3712"></a>
-<span class="sourceLineNo">3713</span>            numPutsFinished++;<a name="line.3713"></a>
-<span class="sourceLineNo">3714</span>            if (numPutsFinished &gt; 0 &amp;&amp; numPutsFinished % 47 == 0) {<a name="line.3714"></a>
-<span class="sourceLineNo">3715</span>              LOG.debug("put iteration = {}", numPutsFinished);<a name="line.3715"></a>
-<span class="sourceLineNo">3716</span>              Delete delete = new Delete(row, (long) numPutsFinished - 30);<a name="line.3716"></a>
-<span class="sourceLineNo">3717</span>              region.delete(delete);<a name="line.3717"></a>
-<span class="sourceLineNo">3718</span>            }<a name="line.3718"></a>
-<span class="sourceLineNo">3719</span>            numPutsFinished++;<a name="line.3719"></a>
-<span class="sourceLineNo">3720</span>          }<a name="line.3720"></a>
-<span class="sourceLineNo">3721</span>        } catch (InterruptedIOException e) {<a name="line.3721"></a>
-<span class="sourceLineNo">3722</span>          // This is fine. It means we are done, or didn't get the lock on time<a name="line.3722"></a>
-<span class="sourceLineNo">3723</span>          LOG.info("Interrupted", e);<a name="line.3723"></a>
-<span class="sourceLineNo">3724</span>        } catch (IOException e) {<a name="line.3724"></a>
-<span class="sourceLineNo">3725</span>          LOG.error("Error while putting records", e);<a name="line.3725"></a>
-<span class="sourceLineNo">3726</span>          error = e;<a name="line.3726"></a>
-<span class="sourceLineNo">3727</span>          break;<a name="line.3727"></a>
-<span class="sourceLineNo">3728</span>        }<a name="line.3728"></a>
-<span class="sourceLineNo">3729</span>      }<a name="line.3729"></a>
-<span class="sourceLineNo">3730</span><a name="line.3730"></a>
-<span class="sourceLineNo">3731</span>    }<a name="line.3731"></a>
-<span class="sourceLineNo">3732</span><a name="line.3732"></a>
-<span class="sourceLineNo">3733</span>  }<a name="line.3733"></a>
-<span class="sourceLineNo">3734</span><a name="line.3734"></a>
-<span class="sourceLineNo">3735</span>  /**<a name="line.3735"></a>
-<span class="sourceLineNo">3736</span>   * Writes very wide records and gets the latest row every time.. Flushes and<a name="line.3736"></a>
-<span class="sourceLineNo">3737</span>   * compacts the region aggressivly to catch issues.<a name="line.3737"></a>
-<span class="sourceLineNo">3738</span>   *<a name="line.3738"></a>
-<span class="sourceLineNo">3739</span>   * @throws IOException<a name="line.3739"></a>
-<span class="sourceLineNo">3740</span>   *           by flush / scan / compaction<a name="line.3740"></a>
-<span class="sourceLineNo">3741</span>   * @throws InterruptedException<a name="line.3741"></a>
-<span class="sourceLineNo">3742</span>   *           when joining threads<a name="line.3742"></a>
-<span class="sourceLineNo">3743</span>   */<a name="line.3743"></a>
-<span class="sourceLineNo">3744</span>  @Test<a name="line.3744"></a>
-<span class="sourceLineNo">3745</span>  public void testWritesWhileGetting() throws Exception {<a name="line.3745"></a>
-<span class="sourceLineNo">3746</span>    int testCount = 50;<a name="line.3746"></a>
-<span class="sourceLineNo">3747</span>    int numRows = 1;<a name="line.3747"></a>
-<span class="sourceLineNo">3748</span>    int numFamilies = 10;<a name="line.3748"></a>
-<span class="sourceLineNo">3749</span>    int numQualifiers = 100;<a name="line.3749"></a>
-<span class="sourceLineNo">3750</span>    int compactInterval = 100;<a name="line.3750"></a>
-<span class="sourceLineNo">3751</span>    byte[][] families = new byte[numFamilies][];<a name="line.3751"></a>
-<span class="sourceLineNo">3752</span>    for (int i = 0; i &lt; numFamilies; i++) {<a name="line.3752"></a>
-<span class="sourceLineNo">3753</span>      families[i] = Bytes.toBytes("family" + i);<a name="line.3753"></a>
-<span class="sourceLineNo">3754</span>    }<a name="line.3754"></a>
-<span class="sourceLineNo">3755</span>    byte[][] qualifiers = new byte[numQualifiers][];<a name="line.3755"></a>
-<span class="sourceLineNo">3756</span>    for (int i = 0; i &lt; numQualifiers; i++) {<a name="line.3756"></a>
-<span class="sourceLineNo">3757</span>      qualifiers[i] = Bytes.toBytes("qual" + i);<a name="line.3757"></a>
-<span class="sourceLineNo">3758</span>    }<a name="line.3758"></a>
-<span class="sourceLineNo">3759</span><a name="line.3759"></a>
-<span class="sourceLineNo">3760</span><a name="line.3760"></a>
-<span class="sourceLineNo">3761</span>    // This test flushes constantly and can cause many files to be created,<a name="line.3761"></a>
-<span class="sourceLineNo">3762</span>    // possibly<a name="line.3762"></a>
-<span class="sourceLineNo">3763</span>    // extending over the ulimit. Make sure compactions are aggressive in<a name="line.3763"></a>
-<span class="sourceLineNo">3764</span>    // reducing<a name="line.3764"></a>
-<span class="sourceLineNo">3765</span>    // the number of HFiles created.<a name="line.3765"></a>
-<span class="sourceLineNo">3766</span>    Configuration conf = HBaseConfiguration.create(CONF);<a name="line.3766"></a>
-<span class="sourceLineNo">3767</span>    conf.setInt("hbase.hstore.compaction.min", 1);<a name="line.3767"></a>
-<span class="sourceLineNo">3768</span>    conf.setInt("hbase.hstore.compaction.max", 1000);<a name="line.3768"></a>
-<span class="sourceLineNo">3769</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.3769"></a>
-<span class="sourceLineNo">3770</span>    PutThread putThread = null;<a name="line.3770"></a>
-<span class="sourceLineNo">3771</span>    MultithreadedTestUtil.TestContext ctx = new MultithreadedTestUtil.TestContext(conf);<a name="line.3771"></a>
-<span class="sourceLineNo">3772</span>    try {<a name="line.3772"></a>
-<span class="sourceLineNo">3773</span>      putThread = new PutThread(numRows, families, qualifiers);<a name="line.3773"></a>
-<span class="sourceLineNo">3774</span>      putThread.start();<a name="line.3774"></a>
-<span class="sourceLineNo">3775</span>      putThread.waitForFirstPut();<a name="line.3775"></a>
-<span class="sourceLineNo">3776</span><a name="line.3776"></a>
-<span class="sourceLineNo">3777</span>      // Add a thread that flushes as fast as possible<a name="line.3777"></a>
-<span class="sourceLineNo">3778</span>      ctx.addThread(new RepeatingTestThread(ctx) {<a name="line.3778"></a>
-<span class="sourceLineNo">3779</span><a name="line.3779"></a>
-<span class="sourceLineNo">3780</span>        @Override<a name="line.3780"></a>
-<span class="sourceLineNo">3781</span>        public void doAnAction() throws Exception {<a name="line.3781"></a>
-<span class="sourceLineNo">3782</span>          region.flush(true);<a name="line.3782"></a>
-<span class="sourceLineNo">3783</span>          // Compact regularly to avoid creating too many files and exceeding<a name="line.3783"></a>
-<span class="sourceLineNo">3784</span>          // the ulimit.<a name="line.3784"></a>
-<span class="sourceLineNo">3785</span>          region.compact(false);<a name="line.3785"></a>
-<span class="sourceLineNo">3786</span>          for (HStore store : region.getStores()) {<a name="line.3786"></a>
-<span class="sourceLineNo">3787</span>            store.closeAndArchiveCompactedFiles();<a name="line.3787"></a>
-<span class="sourceLineNo">3788</span>          }<a name="line.3788"></a>
-<span class="sourceLineNo">3789</span>        }<a name="line.3789"></a>
-<span class="sourceLineNo">3790</span>      });<a name="line.3790"></a>
-<span class="sourceLineNo">3791</span>      ctx.startThreads();<a name="line.3791"></a>
-<span class="sourceLineNo">3792</span><a name="line.3792"></a>
-<span class="sourceLineNo">3793</span>      Get get = new Get(Bytes.toBytes("row0"));<a name="line.3793"></a>
-<span class="sourceLineNo">3794</span>      Result result = null;<a name="line.3794"></a>
-<span class="sourceLineNo">3795</span><a name="line.3795"></a>
-<span class="sourceLineNo">3796</span>      int expectedCount = numFamilies * numQualifiers;<a name="line.3796"></a>
-<span class="sourceLineNo">3797</span><a name="line.3797"></a>
-<span class="sourceLineNo">3798</span>      long prevTimestamp = 0L;<a name="line.3798"></a>
-<span class="sourceLineNo">3799</span>      for (int i = 0; i &lt; testCount; i++) {<a name="line.3799"></a>
-<span class="sourceLineNo">3800</span>        LOG.info("testWritesWhileGetting verify turn " + i);<a name="line.3800"></a>
-<span class="sourceLineNo">3801</span>        boolean previousEmpty = result == null || result.isEmpty();<a name="line.3801"></a>
-<span class="sourceLineNo">3802</span>        result = region.get(get);<a name="line.3802"></a>
-<span class="sourceLineNo">3803</span>        if (!result.isEmpty() || !previousEmpty || i &gt; compactInterval) {<a name="line.3803"></a>
-<span class="sourceLineNo">3804</span>          assertEquals("i=" + i, expectedCount, result.size());<a name="line.3804"></a>
-<span class="sourceLineNo">3805</span>          // TODO this was removed, now what dangit?!<a name="line.3805"></a>
-<span class="sourceLineNo">3806</span>          // search looking for the qualifier in question?<a name="line.3806"></a>
-<span class="sourceLineNo">3807</span>          long timestamp = 0;<a name="line.3807"></a>
-<span class="sourceLineNo">3808</span>          for (Cell kv : result.rawCells()) {<a name="line.3808"></a>
-<span class="sourceLineNo">3809</span>            if (CellUtil.matchingFamily(kv, families[0])<a name="line.3809"></a>
-<span class="sourceLineNo">3810</span>                &amp;&amp; CellUtil.matchingQualifier(kv, qualifiers[0])) {<a name="line.3810"></a>
-<span class="sourceLineNo">3811</span>              timestamp = kv.getTimestamp();<a name="line.3811"></a>
-<span class="sourceLineNo">3812</span>            }<a name="line.3812"></a>
-<span class="sourceLineNo">3813</span>          }<a name="line.3813"></a>
-<span class="sourceLineNo">3814</span>          assertTrue(timestamp &gt;= prevTimestamp);<a name="line.3814"></a>
-<span class="sourceLineNo">3815</span>          prevTimestamp = timestamp;<a name="line.3815"></a>
-<span class="sourceLineNo">3816</span>          Cell previousKV = null;<a name="line.3816"></a>
-<span class="sourceLineNo">3817</span><a name="line.3817"></a>
+<span class="sourceLineNo">3639</span>      putThread.done();<a name="line.3639"></a>
+<span class="sourceLineNo">3640</span><a name="line.3640"></a>
+<span class="sourceLineNo">3641</span>      region.flush(true);<a name="line.3641"></a>
+<span class="sourceLineNo">3642</span><a name="line.3642"></a>
+<span class="sourceLineNo">3643</span>    } finally {<a name="line.3643"></a>
+<span class="sourceLineNo">3644</span>      try {<a name="line.3644"></a>
+<span class="sourceLineNo">3645</span>        flushThread.done();<a name="line.3645"></a>
+<span class="sourceLineNo">3646</span>        flushThread.join();<a name="line.3646"></a>
+<span class="sourceLineNo">3647</span>        flushThread.checkNoError();<a name="line.3647"></a>
+<span class="sourceLineNo">3648</span><a name="line.3648"></a>
+<span class="sourceLineNo">3649</span>        putThread.join();<a name="line.3649"></a>
+<span class="sourceLineNo">3650</span>        putThread.checkNoError();<a name="line.3650"></a>
+<span class="sourceLineNo">3651</span>      } catch (InterruptedException ie) {<a name="line.3651"></a>
+<span class="sourceLineNo">3652</span>        LOG.warn("Caught exception when joining with flushThread", ie);<a name="line.3652"></a>
+<span class="sourceLineNo">3653</span>      }<a name="line.3653"></a>
+<span class="sourceLineNo">3654</span><a name="line.3654"></a>
+<span class="sourceLineNo">3655</span>      try {<a name="line.3655"></a>
+<span class="sourceLineNo">3656</span>          HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.3656"></a>
+<span class="sourceLineNo">3657</span>      } catch (DroppedSnapshotException dse) {<a name="line.3657"></a>
+<span class="sourceLineNo">3658</span>        // We could get this on way out because we interrupt the background flusher and it could<a name="line.3658"></a>
+<span class="sourceLineNo">3659</span>        // fail anywhere causing a DSE over in the background flusher... only it is not properly<a name="line.3659"></a>
+<span class="sourceLineNo">3660</span>        // dealt with so could still be memory hanging out when we get to here -- memory we can't<a name="line.3660"></a>
+<span class="sourceLineNo">3661</span>        // flush because the accounting is 'off' since original DSE.<a name="line.3661"></a>
+<span class="sourceLineNo">3662</span>      }<a name="line.3662"></a>
+<span class="sourceLineNo">3663</span>      this.region = null;<a name="line.3663"></a>
+<span class="sourceLineNo">3664</span>    }<a name="line.3664"></a>
+<span class="sourceLineNo">3665</span>  }<a name="line.3665"></a>
+<span class="sourceLineNo">3666</span><a name="line.3666"></a>
+<span class="sourceLineNo">3667</span>  protected class PutThread extends Thread {<a name="line.3667"></a>
+<span class="sourceLineNo">3668</span>    private volatile boolean done;<a name="line.3668"></a>
+<span class="sourceLineNo">3669</span>    private volatile int numPutsFinished = 0;<a name="line.3669"></a>
+<span class="sourceLineNo">3670</span><a name="line.3670"></a>
+<span class="sourceLineNo">3671</span>    private Throwable error = null;<a name="line.3671"></a>
+<span class="sourceLineNo">3672</span>    private int numRows;<a name="line.3672"></a>
+<span class="sourceLineNo">3673</span>    private byte[][] families;<a name="line.3673"></a>
+<span class="sourceLineNo">3674</span>    private byte[][] qualifiers;<a name="line.3674"></a>
+<span class="sourceLineNo">3675</span><a name="line.3675"></a>
+<span class="sourceLineNo">3676</span>    private PutThread(int numRows, byte[][] families, byte[][] qualifiers) {<a name="line.3676"></a>
+<span class="sourceLineNo">3677</span>      super("PutThread");<a name="line.3677"></a>
+<span class="sourceLineNo">3678</span>      this.numRows = numRows;<a name="line.3678"></a>
+<span class="sourceLineNo">3679</span>      this.families = families;<a name="line.3679"></a>
+<span class="sourceLineNo">3680</span>      this.qualifiers = qualifiers;<a name="line.3680"></a>
+<span class="sourceLineNo">3681</span>    }<a name="line.3681"></a>
+<span class="sourceLineNo">3682</span><a name="line.3682"></a>
+<span class="sourceLineNo">3683</span>    /**<a name="line.3683"></a>
+<span class="sourceLineNo">3684</span>     * Block calling thread until this instance of PutThread has put at least one row.<a name="line.3684"></a>
+<span class="sourceLineNo">3685</span>     */<a name="line.3685"></a>
+<span class="sourceLineNo">3686</span>    public void waitForFirstPut() throws InterruptedException {<a name="line.3686"></a>
+<span class="sourceLineNo">3687</span>      // wait until put thread actually puts some data<a name="line.3687"></a>
+<span class="sourceLineNo">3688</span>      while (isAlive() &amp;&amp; numPutsFinished == 0) {<a name="line.3688"></a>
+<span class="sourceLineNo">3689</span>        checkNoError();<a name="line.3689"></a>
+<span class="sourceLineNo">3690</span>        Thread.sleep(50);<a name="line.3690"></a>
+<span class="sourceLineNo">3691</span>      }<a name="line.3691"></a>
+<span class="sourceLineNo">3692</span>    }<a name="line.3692"></a>
+<span class="sourceLineNo">3693</span><a name="line.3693"></a>
+<span class="sourceLineNo">3694</span>    public void done() {<a name="line.3694"></a>
+<span class="sourceLineNo">3695</span>      done = true;<a name="line.3695"></a>
+<span class="sourceLineNo">3696</span>      synchronized (this) {<a name="line.3696"></a>
+<span class="sourceLineNo">3697</span>        interrupt();<a name="line.3697"></a>
+<span class="sourceLineNo">3698</span>      }<a name="line.3698"></a>
+<span class="sourceLineNo">3699</span>    }<a name="line.3699"></a>
+<span class="sourceLineNo">3700</span><a name="line.3700"></a>
+<span class="sourceLineNo">3701</span>    public void checkNoError() {<a name="line.3701"></a>
+<span class="sourceLineNo">3702</span>      if (error != null) {<a name="line.3702"></a>
+<span class="sourceLineNo">3703</span>        assertNull(error);<a name="line.3703"></a>
+<span class="sourceLineNo">3704</span>      }<a name="line.3704"></a>
+<span class="sourceLineNo">3705</span>    }<a name="line.3705"></a>
+<span class="sourceLineNo">3706</span><a name="line.3706"></a>
+<span class="sourceLineNo">3707</span>    @Override<a name="line.3707"></a>
+<span class="sourceLineNo">3708</span>    public void run() {<a name="line.3708"></a>
+<span class="sourceLineNo">3709</span>      done = false;<a name="line.3709"></a>
+<span class="sourceLineNo">3710</span>      while (!done) {<a name="line.3710"></a>
+<span class="sourceLineNo">3711</span>        try {<a name="line.3711"></a>
+<span class="sourceLineNo">3712</span>          for (int r = 0; r &lt; numRows; r++) {<a name="line.3712"></a>
+<span class="sourceLineNo">3713</span>            byte[] row = Bytes.toBytes("row" + r);<a name="line.3713"></a>
+<span class="sourceLineNo">3714</span>            Put put = new Put(row);<a name="line.3714"></a>
+<span class="sourceLineNo">3715</span>            put.setDurability(Durability.SKIP_WAL);<a name="line.3715"></a>
+<span class="sourceLineNo">3716</span>            byte[] value = Bytes.toBytes(String.valueOf(numPutsFinished));<a name="line.3716"></a>
+<span class="sourceLineNo">3717</span>            for (byte[] family : families) {<a name="line.3717"></a>
+<span class="sourceLineNo">3718</span>              for (byte[] qualifier : qualifiers) {<a name="line.3718"></a>
+<span class="sourceLineNo">3719</span>                put.addColumn(family, qualifier, numPutsFinished, value);<a name="line.3719"></a>
+<span class="sourceLineNo">3720</span>              }<a name="line.3720"></a>
+<span class="sourceLineNo">3721</span>            }<a name="line.3721"></a>
+<span class="sourceLineNo">3722</span>            region.put(put);<a name="line.3722"></a>
+<span class="sourceLineNo">3723</span>            numPutsFinished++;<a name="line.3723"></a>
+<span class="sourceLineNo">3724</span>            if (numPutsFinished &gt; 0 &amp;&amp; numPutsFinished % 47 == 0) {<a name="line.3724"></a>
+<span class="sourceLineNo">3725</span>              LOG.debug("put iteration = {}", numPutsFinished);<a name="line.3725"></a>
+<span class="sourceLineNo">3726</span>              Delete delete = new Delete(row, (long) numPutsFinished - 30);<a name="line.3726"></a>
+<span class="sourceLineNo">3727</span>              region.delete(delete);<a name="line.3727"></a>
+<span class="sourceLineNo">3728</span>            }<a name="line.3728"></a>
+<span class="sourceLineNo">3729</span>            numPutsFinished++;<a name="line.3729"></a>
+<span class="sourceLineNo">3730</span>          }<a name="line.3730"></a>
+<span class="sourceLineNo">3731</span>        } catch (InterruptedIOException e) {<a name="line.3731"></a>
+<span class="sourceLineNo">3732</span>          // This is fine. It means we are done, or didn't get the lock on time<a name="line.3732"></a>
+<span class="sourceLineNo">3733</span>          LOG.info("Interrupted", e);<a name="line.3733"></a>
+<span class="sourceLineNo">3734</span>        } catch (IOException e) {<a name="line.3734"></a>
+<span class="sourceLineNo">3735</span>          LOG.error("Error while putting records", e);<a name="line.3735"></a>
+<span class="sourceLineNo">3736</span>          error = e;<a name="line.3736"></a>
+<span class="sourceLineNo">3737</span>          break;<a name="line.3737"></a>
+<span class="sourceLineNo">3738</span>        }<a name="line.3738"></a>
+<span class="sourceLineNo">3739</span>      }<a name="line.3739"></a>
+<span class="sourceLineNo">3740</span><a name="line.3740"></a>
+<span class="sourceLineNo">3741</span>    }<a name="line.3741"></a>
+<span class="sourceLineNo">3742</span><a name="line.3742"></a>
+<span class="sourceLineNo">3743</span>  }<a name="line.3743"></a>
+<span class="sourceLineNo">3744</span><a name="line.3744"></a>
+<span class="sourceLineNo">3745</span>  /**<a name="line.3745"></a>
+<span class="sourceLineNo">3746</span>   * Writes very wide records and gets the latest row every time.. Flushes and<a name="line.3746"></a>
+<span class="sourceLineNo">3747</span>   * compacts the region aggressivly to catch issues.<a name="line.3747"></a>
+<span class="sourceLineNo">3748</span>   *<a name="line.3748"></a>
+<span class="sourceLineNo">3749</span>   * @throws IOException<a name="line.3749"></a>
+<span class="sourceLineNo">3750</span>   *           by flush / scan / compaction<a name="line.3750"></a>
+<span class="sourceLineNo">3751</span>   * @throws InterruptedException<a name="line.3751"></a>
+<span class="sourceLineNo">3752</span>   *           when joining threads<a name="line.3752"></a>
+<span class="sourceLineNo">3753</span>   */<a name="line.3753"></a>
+<span class="sourceLineNo">3754</span>  @Test<a name="line.3754"></a>
+<span class="sourceLineNo">3755</span>  public void testWritesWhileGetting() throws Exception {<a name="line.3755"></a>
+<span class="sourceLineNo">3756</span>    int testCount = 50;<a name="line.3756"></a>
+<span class="sourceLineNo">3757</span>    int numRows = 1;<a name="line.3757"></a>
+<span class="sourceLineNo">3758</span>    int numFamilies = 10;<a name="line.3758"></a>
+<span class="sourceLineNo">3759</span>    int numQualifiers = 100;<a name="line.3759"></a>
+<span class="sourceLineNo">3760</span>    int compactInterval = 100;<a name="line.3760"></a>
+<span class="sourceLineNo">3761</span>    byte[][] families = new byte[numFamilies][];<a name="line.3761"></a>
+<span class="sourceLineNo">3762</span>    for (int i = 0; i &lt; numFamilies; i++) {<a name="line.3762"></a>
+<span class="sourceLineNo">3763</span>      families[i] = Bytes.toBytes("family" + i);<a name="line.3763"></a>
+<span class="sourceLineNo">3764</span>    }<a name="line.3764"></a>
+<span class="sourceLineNo">3765</span>    byte[][] qualifiers = new byte[numQualifiers][];<a name="line.3765"></a>
+<span class="sourceLineNo">3766</span>    for (int i = 0; i &lt; numQualifiers; i++) {<a name="line.3766"></a>
+<span class="sourceLineNo">3767</span>      qualifiers[i] = Bytes.toBytes("qual" + i);<a name="line.3767"></a>
+<span class="sourceLineNo">3768</span>    }<a name="line.3768"></a>
+<span class="sourceLineNo">3769</span><a name="line.3769"></a>
+<span class="sourceLineNo">3770</span><a name="line.3770"></a>
+<span class="sourceLineNo">3771</span>    // This test flushes constantly and can cause many files to be created,<a name="line.3771"></a>
+<span class="sourceLineNo">3772</span>    // possibly<a name="line.3772"></a>
+<span class="sourceLineNo">3773</span>    // extending over the ulimit. Make sure compactions are aggressive in<a name="line.3773"></a>
+<span class="sourceLineNo">3774</span>    // reducing<a name="line.3774"></a>
+<span class="sourceLineNo">3775</span>    // the number of HFiles created.<a name="line.3775"></a>
+<span class="sourceLineNo">3776</span>    Configuration conf = HBaseConfiguration.create(CONF);<a name="line.3776"></a>
+<span class="sourceLineNo">3777</span>    conf.setInt("hbase.hstore.compaction.min", 1);<a name="line.3777"></a>
+<span class="sourceLineNo">3778</span>    conf.setInt("hbase.hstore.compaction.max", 1000);<a name="line.3778"></a>
+<span class="sourceLineNo">3779</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.3779"></a>
+<span class="sourceLineNo">3780</span>    PutThread putThread = null;<a name="line.3780"></a>
+<span class="sourceLineNo">3781</span>    MultithreadedTestUtil.TestContext ctx = new MultithreadedTestUtil.TestContext(conf);<a name="line.3781"></a>
+<span class="sourceLineNo">3782</span>    try {<a name="line.3782"></a>
+<span class="sourceLineNo">3783</span>      putThread = new PutThread(numRows, families, qualifiers);<a name="line.3783"></a>
+<span class="sourceLineNo">3784</span>      putThread.start();<a name="line.3784"></a>
+<span class="sourceLineNo">3785</span>      putThread.waitForFirstPut();<a name="line.3785"></a>
+<span class="sourceLineNo">3786</span><a name="line.3786"></a>
+<span class="sourceLineNo">3787</span>      // Add a thread that flushes as fast as possible<a name="line.3787"></a>
+<span class="sourceLineNo">3788</span>      ctx.addThread(new RepeatingTestThread(ctx) {<a name="line.3788"></a>
+<span class="sourceLineNo">3789</span><a name="line.3789"></a>
+<span class="sourceLineNo">3790</span>        @Override<a name="line.3790"></a>
+<span class="sourceLineNo">3791</span>        public void doAnAction() throws Exception {<a name="line.3791"></a>
+<span class="sourceLineNo">3792</span>          region.flush(true);<a name="line.3792"></a>
+<span class="sourceLineNo">3793</span>          // Compact regularly to avoid creating too many files and exceeding<a name="line.3793"></a>
+<span class="sourceLineNo">3794</span>          // the ulimit.<a name="line.3794"></a>
+<span class="sourceLineNo">3795</span>          region.compact(false);<a name="line.3795"></a>
+<span class="sourceLineNo">3796</span>          for (HStore store : region.getStores()) {<a name="line.3796"></a>
+<span class="sourceLineNo">3797</span>            store.closeAndArchiveCompactedFiles();<a name="line.3797"></a>
+<span class="sourceLineNo">3798</span>          }<a name="line.3798"></a>
+<span class="sourceLineNo">3799</span>        }<a name="line.3799"></a>
+<span class="sourceLineNo">3800</span>      });<a name="line.3800"></a>
+<span class="sourceLineNo">3801</span>      ctx.startThreads();<a name="line.3801"></a>
+<span class="sourceLineNo">3802</span><a name="line.3802"></a>
+<span class="sourceLineNo">3803</span>      Get get = new Get(Bytes.toBytes("row0"));<a name="line.3803"></a>
+<span class="sourceLineNo">3804</span>      Result result = null;<a name="line.3804"></a>
+<span class="sourceLineNo">3805</span><a name="line.3805"></a>
+<span class="sourceLineNo">3806</span>      int expectedCount = numFamilies * numQualifiers;<a name="line.3806"></a>
+<span class="sourceLineNo">3807</span><a name="line.3807"></a>
+<span class="sourceLineNo">3808</span>      long prevTimestamp = 0L;<a name="line.3808"></a>
+<span class="sourceLineNo">3809</span>      for (int i = 0; i &lt; testCount; i++) {<a name="line.3809"></a>
+<span class="sourceLineNo">3810</span>        LOG.info("testWritesWhileGetting verify turn " + i);<a name="line.3810"></a>
+<span class="sourceLineNo">3811</span>        boolean previousEmpty = result == null || result.isEmpty();<a name="line.3811"></a>
+<span class="sourceLineNo">3812</span>        result = region.get(get);<a name="line.3812"></a>
+<span class="sourceLineNo">3813</span>        if (!result.isEmpty() || !previousEmpty || i &gt; compactInterval) {<a name="line.3813"></a>
+<span class="sourceLineNo">3814</span>          assertEquals("i=" + i, expectedCount, result.size());<a name="line.3814"></a>
+<span class="sourceLineNo">3815</span>          // TODO this was removed, now what dangit?!<a name="line.3815"></a>
+<span class="sourceLineNo">3816</span>          // search looking for the qualifier in question?<a name="line.3816"></a>
+<span class="sourceLineNo">3817</span>          long timestamp = 0;<a name="line.3817"></a>
 <span class="sourceLineNo">3818</span>          for (Cell kv : result.rawCells()) {<a name="line.3818"></a>
-<span class="sourceLineNo">3819</span>            byte[] thisValue = CellUtil.cloneValue(kv);<a name="line.3819"></a>
-<span class="sourceLineNo">3820</span>            if (previousKV != null) {<a name="line.3820"></a>
-<span class="sourceLineNo">3821</span>              if (Bytes.compareTo(CellUtil.cloneValue(previousKV), thisValue) != 0) {<a name="line.3821"></a>
-<span class="sourceLineNo">3822</span>                LOG.warn("These two KV should have the same value." + " Previous KV:" + previousKV<a name="line.3822"></a>
-<span class="sourceLineNo">3823</span>                    + "(memStoreTS:" + previousKV.getSequenceId() + ")" + ", New KV: " + kv<a name="line.3823"></a>
-<span class="sourceLineNo">3824</span>                    + "(memStoreTS:" + kv.getSequenceId() + ")");<a name="line.3824"></a>
-<span class="sourceLineNo">3825</span>                assertEquals(0, Bytes.compareTo(CellUtil.cloneValue(previousKV), thisValue));<a name="line.3825"></a>
-<span class="sourceLineNo">3826</span>              }<a name="line.3826"></a>
-<span class="sourceLineNo">3827</span>            }<a name="line.3827"></a>
-<span class="sourceLineNo">3828</span>            previousKV = kv;<a name="line.3828"></a>
-<span class="sourceLineNo">3829</span>          }<a name="line.3829"></a>
-<span class="sourceLineNo">3830</span>        }<a name="line.3830"></a>
-<span class="sourceLineNo">3831</span>      }<a name="line.3831"></a>
-<span class="sourceLineNo">3832</span>    } finally {<a name="line.3832"></a>
-<span class="sourceLineNo">3833</span>      if (putThread != null)<a name="line.3833"></a>
-<span class="sourceLineNo">3834</span>        putThread.done();<a name="line.3834"></a>
-<span class="sourceLineNo">3835</span><a name="line.3835"></a>
-<span class="sourceLineNo">3836</span>      region.flush(true);<a name="line.3836"></a>
-<span class="sourceLineNo">3837</span><a name="line.3837"></a>
-<span class="sourceLineNo">3838</span>      if (putThread != null) {<a name="line.3838"></a>
-<span class="sourceLineNo">3839</span>        putThread.join();<a name="line.3839"></a>
-<span class="sourceLineNo">3840</span>        putThread.checkNoError();<a name="line.3840"></a>
+<span class="sourceLineNo">3819</span>            if (CellUtil.matchingFamily(kv, families[0])<a name="line.3819"></a>
+<span class="sourceLineNo">3820</span>                &amp;&amp; CellUtil.matchingQualifier(kv, qualifiers[0])) {<a name="line.3820"></a>
+<span class="sourceLineNo">3821</span>              timestamp = kv.getTimestamp();<a name="line.3821"></a>
+<span class="sourceLineNo">3822</span>            }<a name="line.3822"></a>
+<span class="sourceLineNo">3823</span>          }<a name="line.3823"></a>
+<span class="sourceLineNo">3824</span>          assertTrue(timestamp &gt;= prevTimestamp);<a name="line.3824"></a>
+<span class="sourceLineNo">3825</span>          prevTimestamp = timestamp;<a name="line.3825"></a>
+<span class="sourceLineNo">3826</span>          Cell previousKV = null;<a name="line.3826"></a>
+<span class="sourceLineNo">3827</span><a name="line.3827"></a>
+<span class="sourceLineNo">3828</span>          for (Cell kv : result.rawCells()) {<a name="line.3828"></a>
+<span class="sourceLineNo">3829</span>            byte[] thisValue = CellUtil.cloneValue(kv);<a name="line.3829"></a>
+<span class="sourceLineNo">3830</span>            if (previousKV != null) {<a name="line.3830"></a>
+<span class="sourceLineNo">3831</span>              if (Bytes.compareTo(CellUtil.cloneValue(previousKV), thisValue) != 0) {<a name="line.3831"></a>
+<span class="sourceLineNo">3832</span>                LOG.warn("These two KV should have the same value." + " Previous KV:" + previousKV<a name="line.3832"></a>
+<span class="sourceLineNo">3833</span>                    + "(memStoreTS:" + previousKV.getSequenceId() + ")" + ", New KV: " + kv<a name="line.3833"></a>
+<span class="sourceLineNo">3834</span>                    + "(memStoreTS:" + kv.getSequenceId() + ")");<a name="line.3834"></a>
+<span class="sourceLineNo">3835</span>                assertEquals(0, Bytes.compareTo(CellUtil.cloneValue(previousKV), thisValue));<a name="line.3835"></a>
+<span class="sourceLineNo">3836</span>              }<a name="line.3836"></a>
+<span class="sourceLineNo">3837</span>            }<a name="line.3837"></a>
+<span class="sourceLineNo">3838</span>            previousKV = kv;<a name="line.3838"></a>
+<span class="sourceLineNo">3839</span>          }<a name="line.3839"></a>
+<span class="sourceLineNo">3840</span>        }<a name="line.3840"></a>
 <span class="sourceLineNo">3841</span>      }<a name="line.3841"></a>
-<span class="sourceLineNo">3842</span><a name="line.3842"></a>
-<span class="sourceLineNo">3843</span>      ctx.stop();<a name="line.3843"></a>
-<span class="sourceLineNo">3844</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.3844"></a>
-<span class="sourceLineNo">3845</span>      this.region = null;<a name="line.3845"></a>
-<span class="sourceLineNo">3846</span>    }<a name="line.3846"></a>
-<span class="sourceLineNo">3847</span>  }<a name="line.3847"></a>
-<span class="sourceLineNo">3848</span><a name="line.3848"></a>
-<span class="sourceLineNo">3849</span>  @Test<a name="line.3849"></a>
-<span class="sourceLineNo">3850</span>  public void testHolesInMeta() throws Exception {<a name="line.3850"></a>
-<span class="sourceLineNo">3851</span>    byte[] family = Bytes.toBytes("family");<a name="line.3851"></a>
-<span class="sourceLineNo">3852</span>    this.region = initHRegion(tableName, Bytes.toBytes("x"), Bytes.toBytes("z"), method, CONF,<a name="line.3852"></a>
-<span class="sourceLineNo">3853</span>        false, family);<a name="line.3853"></a>
-<span class="sourceLineNo">3854</span>    byte[] rowNotServed = Bytes.toBytes("a");<a name="line.3854"></a>
-<span class="sourceLineNo">3855</span>    Get g = new Get(rowNotServed);<a name="line.3855"></a>
-<span class="sourceLineNo">3856</span>    try {<a name="line.3856"></a>
-<span class="sourceLineNo">3857</span>      region.get(g);<a name="line.3857"></a>
-<span class="sourceLineNo">3858</span>      fail();<a name="line.3858"></a>
-<span class="sourceLineNo">3859</span>    } catch (WrongRegionException x) {<a name="line.3859"></a>
-<span class="sourceLineNo">3860</span>      // OK<a name="line.3860"></a>
-<span class="sourceLineNo">3861</span>    }<a name="line.3861"></a>
-<span class="sourceLineNo">3862</span>    byte[] row = Bytes.toBytes("y");<a name="line.3862"></a>
-<span class="sourceLineNo">3863</span>    g = new Get(row);<a name="line.3863"></a>
-<span class="sourceLineNo">3864</span>    region.get(g);<a name="line.3864"></a>
-<span class="sourceLineNo">3865</span>  }<a name="line.3865"></a>
-<span class="sourceLineNo">3866</span><a name="line.3866"></a>
-<span class="sourceLineNo">3867</span>  @Test<a name="line.3867"></a>
-<span class="sourceLineNo">3868</span>  public void testIndexesScanWithOneDeletedRow() throws IOException {<a name="line.3868"></a>
-<span class="sourceLineNo">3869</span>    byte[] family = Bytes.toBytes("family");<a name="line.3869"></a>
-<span class="sourceLineNo">3870</span><a name="line.3870"></a>
-<span class="sourceLineNo">3871</span>    // Setting up region<a name="line.3871"></a>
-<span class="sourceLineNo">3872</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.3872"></a>
-<span class="sourceLineNo">3873</span>    Put put = new Put(Bytes.toBytes(1L));<a name="line.3873"></a>
-<span class="sourceLineNo">3874</span>    put.addColumn(family, qual1, 1L, Bytes.toBytes(1L));<a name="line.3874"></a>
-<span class="sourceLineNo">3875</span>    region.put(put);<a name="line.3875"></a>
+<span class="sourceLineNo">3842</span>    } finally {<a name="line.3842"></a>
+<span class="sourceLineNo">3843</span>      if (putThread != null)<a name="line.3843"></a>
+<span class="sourceLineNo">3844</span>        putThread.done();<a name="line.3844"></a>
+<span class="sourceLineNo">3845</span><a name="line.3845"></a>
+<span class="sourceLineNo">3846</span>      region.flush(true);<a name="line.3846"></a>
+<span class="sourceLineNo">3847</span><a name="line.3847"></a>
+<span class="sourceLineNo">3848</span>      if (putThread != null) {<a name="line.3848"></a>
+<span class="sourceLineNo">3849</span>        putThread.join();<a name="line.3849"></a>
+<span class="sourceLineNo">3850</span>        putThread.checkNoError();<a name="line.3850"></a>
+<span class="sourceLineNo">3851</span>      }<a name="line.3851"></a>
+<span class="sourceLineNo">3852</span><a name="line.3852"></a>
+<span class="sourceLineNo">3853</span>      ctx.stop();<a name="line.3853"></a>
+<span class="sourceLineNo">3854</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.3854"></a>
+<span class="sourceLineNo">3855</span>      this.region = null;<a name="line.3855"></a>
+<span class="sourceLineNo">3856</span>    }<a name="line.3856"></a>
+<span class="sourceLineNo">3857</span>  }<a name="line.3857"></a>
+<span class="sourceLineNo">3858</span><a name="line.3858"></a>
+<span class="sourceLineNo">3859</span>  @Test<a name="line.3859"></a>
+<span class="sourceLineNo">3860</span>  public void testHolesInMeta() throws Exception {<a name="line.3860"></a>
+<span class="sourceLineNo">3861</span>    byte[] family = Bytes.toBytes("family");<a name="line.3861"></a>
+<span class="sourceLineNo">3862</span>    this.region = initHRegion(tableName, Bytes.toBytes("x"), Bytes.toBytes("z"), method, CONF,<a name="line.3862"></a>
+<span class="sourceLineNo">3863</span>        false, family);<a name="line.3863"></a>
+<span class="sourceLineNo">3864</span>    byte[] rowNotServed = Bytes.toBytes("a");<a name="line.3864"></a>
+<span class="sourceLineNo">3865</span>    Get g = new Get(rowNotServed);<a name="line.3865"></a>
+<span class="sourceLineNo">3866</span>    try {<a name="line.3866"></a>
+<span class="sourceLineNo">3867</span>      region.get(g);<a name="line.3867"></a>
+<span class="sourceLineNo">3868</span>      fail();<a name="line.3868"></a>
+<span class="sourceLineNo">3869</span>    } catch (WrongRegionException x) {<a name="line.3869"></a>
+<span class="sourceLineNo">3870</span>      // OK<a name="line.3870"></a>
+<span class="sourceLineNo">3871</span>    }<a name="line.3871"></a>
+<span class="sourceLineNo">3872</span>    byte[] row = Bytes.toBytes("y");<a name="line.3872"></a>
+<span class="sourceLineNo">3873</span>    g = new Get(row);<a name="line.3873"></a>
+<span class="sourceLineNo">3874</span>    region.get(g);<a name="line.3874"></a>
+<span class="sourceLineNo">3875</span>  }<a name="line.3875"></a>
 <span class="sourceLineNo">3876</span><a name="line.3876"></a>
-<span class="sourceLineNo">3877</span>    region.flush(true);<a name="line.3877"></a>
-<span class="sourceLineNo">3878</span><a name="line.3878"></a>
-<span class="sourceLineNo">3879</span>    Delete delete = new Delete(Bytes.toBytes(1L), 1L);<a name="line.3879"></a>
-<span class="sourceLineNo">3880</span>    region.delete(delete);<a name="line.3880"></a>
-<span class="sourceLineNo">3881</span><a name="line.3881"></a>
-<span class="sourceLineNo">3882</span>    put = new Put(Bytes.toBytes(2L));<a name="line.3882"></a>
-<span class="sourceLineNo">3883</span>    put.addColumn(family, qual1, 2L, Bytes.toBytes(2L));<a name="line.3883"></a>
-<span class="sourceLineNo">3884</span>    region.put(put);<a name="line.3884"></a>
-<span class="sourceLineNo">3885</span><a name="line.3885"></a>
-<span class="sourceLineNo">3886</span>    Scan idxScan = new Scan();<a name="line.3886"></a>
-<span class="sourceLineNo">3887</span>    idxScan.addFamily(family);<a name="line.3887"></a>
-<span class="sourceLineNo">3888</span>    idxScan.setFilter(new FilterList(FilterList.Operator.MUST_PASS_ALL, Arrays.&lt;Filter&gt; asList(<a name="line.3888"></a>
-<span class="sourceLineNo">3889</span>        new SingleColumnValueFilter(family, qual1, CompareOperator.GREATER_OR_EQUAL,<a name="line.3889"></a>
-<span class="sourceLineNo">3890</span>            new BinaryComparator(Bytes.toBytes(0L))), new SingleColumnValueFilter(family, qual1,<a name="line.3890"></a>
-<span class="sourceLineNo">3891</span>                    CompareOperator.LESS_OR_EQUAL, new BinaryComparator(Bytes.toBytes(3L))))));<a name="line.3891"></a>
-<span class="sourceLineNo">3892</span>    InternalScanner scanner = region.getScanner(idxScan);<a name="line.3892"></a>
-<span class="sourceLineNo">3893</span>    List&lt;Cell&gt; res = new ArrayList&lt;&gt;();<a name="line.3893"></a>
-<span class="sourceLineNo">3894</span><a name="line.3894"></a>
-<span class="sourceLineNo">3895</span>    while (scanner.next(res)) {<a name="line.3895"></a>
-<span class="sourceLineNo">3896</span>      // Ignore res value.<a name="line.3896"></a>
-<span class="sourceLineNo">3897</span>    }<a name="line.3897"></a>
-<span class="sourceLineNo">3898</span>    assertEquals(1L, res.size());<a name="line.3898"></a>
-<span class="sourceLineNo">3899</span>  }<a name="line.3899"></a>
-<span class="sourceLineNo">3900</span><a name="line.3900"></a>
-<span class="sourceLineNo">3901</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.3901"></a>
-<span class="sourceLineNo">3902</span>  // Bloom filter test<a name="line.3902"></a>
-<span class="sourceLineNo">3903</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.3903"></a>
-<span class="sourceLineNo">3904</span>  @Test<a name="line.3904"></a>
-<span class="sourceLineNo">3905</span>  public void testBloomFilterSize() throws IOException {<a name="line.3905"></a>
-<span class="sourceLineNo">3906</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.3906"></a>
-<span class="sourceLineNo">3907</span>    byte[] qf1 = Bytes.toBytes("col");<a name="line.3907"></a>
-<span class="sourceLineNo">3908</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.3908"></a>
-<span class="sourceLineNo">3909</span>    // Create Table<a name="line.3909"></a>
-<span class="sourceLineNo">3910</span>    HColumnDescriptor hcd = new HColumnDescriptor(fam1).setMaxVersions(Integer.MAX_VALUE)<a name="line.3910"></a>
-<span class="sourceLineNo">3911</span>        .setBloomFilterType(BloomType.ROWCOL);<a name="line.3911"></a>
-<span class="sourceLineNo">3912</span><a name="line.3912"></a>
-<span class="sourceLineNo">3913</span>    HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.3913"></a>
-<span class="sourceLineNo">3914</span>    htd.addFamily(hcd);<a name="line.3914"></a>
-<span class="sourceLineNo">3915</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.3915"></a>
-<span class="sourceLineNo">3916</span>    this.region = TEST_UTIL.createLocalHRegion(info, htd);<a name="line.3916"></a>
-<span class="sourceLineNo">3917</span>    int num_unique_rows = 10;<a name="line.3917"></a>
-<span class="sourceLineNo">3918</span>    int duplicate_multiplier = 2;<a name="line.3918"></a>
-<span class="sourceLineNo">3919</span>    int num_storefiles = 4;<a name="line.3919"></a>
-<span class="sourceLineNo">3920</span><a name="line.3920"></a>
-<span class="sourceLineNo">3921</span>    int version = 0;<a name="line.3921"></a>
-<span class="sourceLineNo">3922</span>    for (int f = 0; f &lt; num_storefiles; f++) {<a name="line.3922"></a>
-<span class="sourceLineNo">3923</span>      for (int i = 0; i &lt; duplicate_multiplier; i++) {<a name="line.3923"></a>
-<span class="sourceLineNo">3924</span>        for (int j = 0; j &lt; num_unique_rows; j++) {<a name="line.3924"></a>
-<span class="sourceLineNo">3925</span>          Put put = new Put(Bytes.toBytes("row" + j));<a name="line.3925"></a>
-<span class="sourceLineNo">3926</span>          put.setDurability(Durability.SKIP_WAL);<a name="line.3926"></a>
-<span class="sourceLineNo">3927</span>          long ts = version++;<a name="line.3927"></a>
-<span class="sourceLineNo">3928</span>          put.addColumn(fam1, qf1, ts, val1);<a name="line.3928"></a>
-<span class="sourceLineNo">3929</span>          region.put(put);<a name="line.3929"></a>
-<span class="sourceLineNo">3930</span>        }<a name="line.3930"></a>
-<span class="sourceLineNo">3931</span>      }<a name="line.3931"></a>
-<span class="sourceLineNo">3932</span>      region.flush(true);<a name="line.3932"></a>
-<span class="sourceLineNo">3933</span>    }<a name="line.3933"></a>
-<span class="sourceLineNo">3934</span>    // before compaction<a name="line.3934"></a>
-<span class="sourceLineNo">3935</span>    HStore store = region.getStore(fam1);<a name="line.3935"></a>
-<span class="sourceLineNo">3936</span>    Collection&lt;HStoreFile&gt; storeFiles = store.getStorefiles();<a name="line.3936"></a>
-<span class="sourceLineNo">3937</span>    for (HStoreFile storefile : storeFiles) {<a name="line.3937"></a>
-<span class="sourceLineNo">3938</span>      StoreFileReader reader = storefile.getReader();<a name="line.3938"></a>
-<span class="sourceLineNo">3939</span>      reader.loadFileInfo();<a name="line.3939"></a>
-<span class="sourceLineNo">3940</span>      reader.loadBloomfilter();<a name="line.3940"></a>
-<span class="sourceLineNo">3941</span>      assertEquals(num_unique_rows * duplicate_multiplier, reader.getEntries());<a name="line.3941"></a>
-<span class="sourceLineNo">3942</span>      assertEquals(num_unique_rows, reader.getFilterEntries());<a name="line.3942"></a>
+<span class="sourceLineNo">3877</span>  @Test<a name="line.3877"></a>
+<span class="sourceLineNo">3878</span>  public void testIndexesScanWithOneDeletedRow() throws IOException {<a name="line.3878"></a>
+<span class="sourceLineNo">3879</span>    byte[] family = Bytes.toBytes("family");<a name="line.3879"></a>
+<span class="sourceLineNo">3880</span><a name="line.3880"></a>
+<span class="sourceLineNo">3881</span>    // Setting up region<a name="line.3881"></a>
+<span class="sourceLineNo">3882</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.3882"></a>
+<span class="sourceLineNo">3883</span>    Put put = new Put(Bytes.toBytes(1L));<a name="line.3883"></a>
+<span class="sourceLineNo">3884</span>    put.addColumn(family, qual1, 1L, Bytes.toBytes(1L));<a name="line.3884"></a>
+<span class="sourceLineNo">3885</span>    region.put(put);<a name="line.3885"></a>
+<span class="sourceLineNo">3886</span><a name="line.3886"></a>
+<span class="sourceLineNo">3887</span>    region.flush(true);<a name="line.3887"></a>
+<span class="sourceLineNo">3888</span><a name="line.3888"></a>
+<span class="sourceLineNo">3889</span>    Delete delete = new Delete(Bytes.toBytes(1L), 1L);<a name="line.3889"></a>
+<span class="sourceLineNo">3890</span>    region.delete(delete);<a name="line.3890"></a>
+<span class="sourceLineNo">3891</span><a name="line.3891"></a>
+<span class="sourceLineNo">3892</span>    put = new Put(Bytes.toBytes(2L));<a name="line.3892"></a>
+<span class="sourceLineNo">3893</span>    put.addColumn(family, qual1, 2L, Bytes.toBytes(2L));<a name="line.3893"></a>
+<span class="sourceLineNo">3894</span>    region.put(put);<a name="line.3894"></a>
+<span class="sourceLineNo">3895</span><a name="line.3895"></a>
+<span class="sourceLineNo">3896</span>    Scan idxScan = new Scan();<a name="line.3896"></a>
+<span class="sourceLineNo">3897</span>    idxScan.addFamily(family);<a name="line.3897"></a>
+<span class="sourceLineNo">3898</span>    idxScan.setFilter(new FilterList(FilterList.Operator.MUST_PASS_ALL, Arrays.&lt;Filter&gt; asList(<a name="line.3898"></a>
+<span class="sourceLineNo">3899</span>        new SingleColumnValueFilter(family, qual1, CompareOperator.GREATER_OR_EQUAL,<a name="line.3899"></a>
+<span class="sourceLineNo">3900</span>            new BinaryComparator(Bytes.toBytes(0L))), new SingleColumnValueFilter(family, qual1,<a name="line.3900"></a>
+<span class="sourceLineNo">3901</span>                    CompareOperator.LESS_OR_EQUAL, new BinaryComparator(Bytes.toBytes(3L))))));<a name="line.3901"></a>
+<span class="sourceLineNo">3902</span>    InternalScanner scanner = region.getScanner(idxScan);<a name="line.3902"></a>
+<span class="sourceLineNo">3903</span>    List&lt;Cell&gt; res = new ArrayList&lt;&gt;();<a name="line.3903"></a>
+<span class="sourceLineNo">3904</span><a name="line.3904"></a>
+<span class="sourceLineNo">3905</span>    while (scanner.next(res)) {<a name="line.3905"></a>
+<span class="sourceLineNo">3906</span>      // Ignore res value.<a name="line.3906"></a>
+<span class="sourceLineNo">3907</span>    }<a name="line.3907"></a>
+<span class="sourceLineNo">3908</span>    assertEquals(1L, res.size());<a name="line.3908"></a>
+<span class="sourceLineNo">3909</span>  }<a name="line.3909"></a>
+<span class="sourceLineNo">3910</span><a name="line.3910"></a>
+<span class="sourceLineNo">3911</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.3911"></a>
+<span class="sourceLineNo">3912</span>  // Bloom filter test<a name="line.3912"></a>
+<span class="sourceLineNo">3913</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.3913"></a>
+<span class="sourceLineNo">3914</span>  @Test<a name="line.3914"></a>
+<span class="sourceLineNo">3915</span>  public void testBloomFilterSize() throws IOException {<a name="line.3915"></a>
+<span class="sourceLineNo">3916</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.3916"></a>
+<span class="sourceLineNo">3917</span>    byte[] qf1 = Bytes.toBytes("col");<a name="line.3917"></a>
+<span class="sourceLineNo">3918</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.3918"></a>
+<span class="sourceLineNo">3919</span>    // Create Table<a name="line.3919"></a>
+<span class="sourceLineNo">3920</span>    HColumnDescriptor hcd = new HColumnDescriptor(fam1).setMaxVersions(Integer.MAX_VALUE)<a name="line.3920"></a>
+<span class="sourceLineNo">3921</span>        .setBloomFilterType(BloomType.ROWCOL);<a name="line.3921"></a>
+<span class="sourceLineNo">3922</span><a name="line.3922"></a>
+<span class="sourceLineNo">3923</span>    HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.3923"></a>
+<span class="sourceLineNo">3924</span>    htd.addFamily(hcd);<a name="line.3924"></a>
+<span class="sourceLineNo">3925</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.3925"></a>
+<span class="sourceLineNo">3926</span>    this.region = TEST_UTIL.createLocalHRegion(info, htd);<a name="line.3926"></a>
+<span class="sourceLineNo">3927</span>    int num_unique_rows = 10;<a name="line.3927"></a>
+<span class="sourceLineNo">3928</span>    int duplicate_multiplier = 2;<a name="line.3928"></a>
+<span class="sourceLineNo">3929</span>    int num_storefiles = 4;<a name="line.3929"></a>
+<span class="sourceLineNo">3930</span><a name="line.3930"></a>
+<span class="sourceLineNo">3931</span>    int version = 0;<a name="line.3931"></a>
+<span class="sourceLineNo">3932</span>    for (int f = 0; f &lt; num_storefiles; f++) {<a name="line.3932"></a>
+<span class="sourceLineNo">3933</span>      for (int i = 0; i &lt; duplicate_multiplier; i++) {<a name="line.3933"></a>
+<span class="sourceLineNo">3934</span>        for (int j = 0; j &lt; num_unique_rows; j++) {<a name="line.3934"></a>
+<span class="sourceLineNo">3935</span>          Put put = new Put(Bytes.toBytes("row" + j));<a name="line.3935"></a>
+<span class="sourceLineNo">3936</span>          put.setDurability(Durability.SKIP_WAL);<a name="line.3936"></a>
+<span class="sourceLineNo">3937</span>          long ts = version++;<a name="line.3937"></a>
+<span class="sourceLineNo">3938</span>          put.addColumn(fam1, qf1, ts, val1);<a name="line.3938"></a>
+<span class="sourceLineNo">3939</span>          region.put(put);<a name="line.3939"></a>
+<span class="sourceLineNo">3940</span>        }<a name="line.3940"></a>
+<span class="sourceLineNo">3941</span>      }<a name="line.3941"></a>
+<span class="sourceLineNo">3942</span>      region.flush(true);<a name="line.3942"></a>
 <span class="sourceLineNo">3943</span>    }<a name="line.3943"></a>
-<span class="sourceLineNo">3944</span><a name="line.3944"></a>
-<span class="sourceLineNo">3945</span>    region.compact(true);<a name="line.3945"></a>
-<span class="sourceLineNo">3946</span><a name="line.3946"></a>
-<span class="sourceLineNo">3947</span>    // after compaction<a name="line.3947"></a>
-<span class="sourceLineNo">3948</span>    storeFiles = store.getStorefiles();<a name="line.3948"></a>
-<span class="sourceLineNo">3949</span>    for (HStoreFile storefile : storeFiles) {<a name="line.3949"></a>
-<span class="sourceLineNo">3950</span>      StoreFileReader reader = storefile.getReader();<a name="line.3950"></a>
-<span class="sourceLineNo">3951</span>      reader.loadFileInfo();<a name="line.3951"></a>
-<span class="sourceLineNo">3952</span>      reader.loadBloomfilter();<a name="line.3952"></a>
-<span class="sourceLineNo">3953</span>      assertEquals(num_unique_rows * duplicate_multiplier * num_storefiles, reader.getEntries());<a name="line.3953"></a>
-<span class="sourceLineNo">3954</span>      assertEquals(num_unique_rows, reader.getFilterEntries());<a name="line.3954"></a>
-<span class="sourceLineNo">3955</span>    }<a name="line.3955"></a>
-<span class="sourceLineNo">3956</span>  }<a name="line.3956"></a>
-<span class="sourceLineNo">3957</span><a name="line.3957"></a>
-<span class="sourceLineNo">3958</span>  @Test<a name="line.3958"></a>
-<span class="sourceLineNo">3959</span>  public void testAllColumnsWithBloomFilter() throws IOException {<a name="line.3959"></a>
-<span class="sourceLineNo">3960</span>    byte[] TABLE = Bytes.toBytes(name.getMethodName());<a name="line.3960"></a>
-<span class="sourceLineNo">3961</span>    byte[] FAMILY = Bytes.toBytes("family");<a name="line.3961"></a>
-<span class="sourceLineNo">3962</span><a name="line.3962"></a>
-<span class="sourceLineNo">3963</span>    // Create table<a name="line.3963"></a>
-<span class="sourceLineNo">3964</span>    HColumnDescriptor hcd = new HColumnDescriptor(FAMILY).setMaxVersions(Integer.MAX_VALUE)<a name="line.3964"></a>
-<span class="sourceLineNo">3965</span>        .setBloomFilterType(BloomType.ROWCOL);<a name="line.3965"></a>
-<span class="sourceLineNo">3966</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(TABLE));<a name="line.3966"></a>
-<span class="sourceLineNo">3967</span>    htd.addFamily(hcd);<a name="line.3967"></a>
-<span class="sourceLineNo">3968</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.3968"></a>
-<span class="sourceLineNo">3969</span>    this.region = TEST_UTIL.createLocalHRegion(info, htd);<a name="line.3969"></a>
-<span class="sourceLineNo">3970</span>    // For row:0, col:0: insert versions 1 through 5.<a name="line.3970"></a>
-<span class="sourceLineNo">3971</span>    byte[] row = Bytes.toBytes("row:" + 0);<a name="line.3971"></a>
-<span class="sourceLineNo">3972</span>    byte[] column = Bytes.toBytes("column:" + 0);<a name="line.3972"></a>
-<span class="sourceLineNo">3973</span>    Put put = new Put(row);<a name="line.3973"></a>
-<span class="sourceLineNo">3974</span>    put.setDurability(Durability.SKIP_WAL);<a name="line.3974"></a>
-<span class="sourceLineNo">3975</span>    for (long idx = 1; idx &lt;= 4; idx++) {<a name="line.3975"></a>
-<span class="sourceLineNo">3976</span>      put.addColumn(FAMILY, column, idx, Bytes.toBytes("value-version-" + idx));<a name="line.3976"></a>
-<span class="sourceLineNo">3977</span>    }<a name="line.3977"></a>
-<span class="sourceLineNo">3978</span>    region.put(put);<a name="line.3978"></a>
-<span class="sourceLineNo">3979</span><a name="line.3979"></a>
-<span class="sourceLineNo">3980</span>    // Flush<a name="line.3980"></a>
-<span class="sourceLineNo">3981</span>    region.flush(true);<a name="line.3981"></a>
-<span class="sourceLineNo">3982</span><a name="line.3982"></a>
-<span class="sourceLineNo">3983</span>    // Get rows<a name="line.3983"></a>
-<span class="sourceLineNo">3984</span>    Get get = new Get(row);<a name="line.3984"></a>
-<span class="sourceLineNo">3985</span>    get.readAllVersions();<a name="line.3985"></a>
-<span class="sourceLineNo">3986</span>    Cell[] kvs = region.get(get).rawCells();<a name="line.3986"></a>
-<span class="sourceLineNo">3987</span><a name="line.3987"></a>
-<span class="sourceLineNo">3988</span>    // Check if rows are correct<a name="line.3988"></a>
-<span class="sourceLineNo">3989</span>    assertEquals(4, kvs.length);<a name="line.3989"></a>
-<span class="sourceLineNo">3990</span>    checkOneCell(kvs[0], FAMILY, 0, 0, 4);<a name="line.3990"></a>
-<span class="sourceLineNo">3991</span>    checkOneCell(kvs[1], FAMILY, 0, 0, 3);<a name="line.3991"></a>
-<span class="sourceLineNo">3992</span>    checkOneCell(kvs[2], FAMILY, 0, 0, 2);<a name="line.3992"></a>
-<span class="sourceLineNo">3993</span>    checkOneCell(kvs[3], FAMILY, 0, 0, 1);<a name="line.3993"></a>
-<span class="sourceLineNo">3994</span>  }<a name="line.3994"></a>
-<span class="sourceLineNo">3995</span><a name="line.3995"></a>
-<span class="sourceLineNo">3996</span>  /**<a name="line.3996"></a>
-<span class="sourceLineNo">3997</span>   * Testcase to cover bug-fix for HBASE-2823 Ensures correct delete when<a name="line.3997"></a>
-<span class="sourceLineNo">3998</span>   * issuing delete row on columns with bloom filter set to row+col<a name="line.3998"></a>
-<span class="sourceLineNo">3999</span>   * (BloomType.ROWCOL)<a name="line.3999"></a>
-<span class="sourceLineNo">4000</span>   */<a name="line.4000"></a>
-<span class="sourceLineNo">4001</span>  @Test<a name="line.4001"></a>
-<span class="sourceLineNo">4002</span>  public void testDeleteRowWithBloomFilter() throws IOException {<a name="line.4002"></a>
-<span class="sourceLineNo">4003</span>    byte[] familyName = Bytes.toBytes("familyName");<a name="line.4003"></a>
-<span class="sourceLineNo">4004</span><a name="line.4004"></a>
-<span class="sourceLineNo">4005</span>    // Create Table<a name="line.4005"></a>
-<span class="sourceLineNo">4006</span>    HColumnDescriptor hcd = new HColumnDescriptor(familyName).setMaxVersions(Integer.MAX_VALUE)<a name="line.4006"></a>
-<span class="sourceLineNo">4007</span>        .setBloomFilterType(BloomType.ROWCOL);<a name="line.4007"></a>
-<span class="sourceLineNo">4008</span><a name="line.4008"></a>
-<span class="sourceLineNo">4009</span>    HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.4009"></a>
-<span class="sourceLineNo">4010</span>    htd.addFamily(hcd);<a name="line.4010"></a>
-<span class="sourceLineNo">4011</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.4011"></a>
-<span class="sourceLineNo">4012</span>    this.region = TEST_UTIL.createLocalHRegion(info, htd);<a name="line.4012"></a>
-<span class="sourceLineNo">4013</span>    // Insert some data<a name="line.4013"></a>
-<span class="sourceLineNo">4014</span>    byte[] row = Bytes.toBytes("row1");<a name="line.4014"></a>
-<span class="sourceLineNo">4015</span>    byte[] col = Bytes.toBytes("col1");<a name="line.4015"></a>
-<span class="sourceLineNo">4016</span><a name="line.4016"></a>
-<span class="sourceLineNo">4017</span>    Put put = new Put(row);<a name="line.4017"></a>
-<span class="sourceLineNo">4018</span>    put.addColumn(familyName, col, 1, Bytes.toBytes("SomeRandomValue"));<a name="line.4018"></a>
-<span class="sourceLineNo">4019</span>    region.put(put);<a name="line.4019"></a>
-<span class="sourceLineNo">4020</span>    region.flush(true);<a name="line.4020"></a>
-<span class="sourceLineNo">4021</span><a name="line.4021"></a>
-<span class="sourceLineNo">4022</span>    Delete del = new Delete(row);<a name="line.4022"></a>
-<span class="sourceLineNo">4023</span>    region.delete(del);<a name="line.4023"></a>
-<span class="sourceLineNo">4024</span>    region.flush(true);<a name="line.4024"></a>
-<span class="sourceLineNo">4025</span><a name="line.4025"></a>
-<span class="sourceLineNo">4026</span>    // Get remaining rows (should have none)<a name="line.4026"></a>
-<span class="sourceLineNo">4027</span>    Get get = new Get(row);<a name="line.4027"></a>
-<span class="sourceLineNo">4028</span>    get.addColumn(familyName, col);<a name="line.4028"></a>
-<span class="sourceLineNo">4029</span><a name="line.4029"></a>
-<span class="sourceLineNo">4030</span>    Cell[] keyValues = region.get(get).rawCells();<a name="line.4030"></a>
-<span class="sourceLineNo">4031</span>    assertEquals(0, keyValues.length);<a name="line.4031"></a>
-<span class="sourceLineNo">4032</span>  }<a name="line.4032"></a>
-<span class="sourceLineNo">4033</span><a name="line.4033"></a>
-<span class="sourceLineNo">4034</span>  @Test<a name="line.4034"></a>
-<span class="sourceLineNo">4035</span>  public void testgetHDFSBlocksDistribution() throws Exception {<a name="line.4035"></a>
-<span class="sourceLineNo">4036</span>    HBaseTestingUtility htu = new HBaseTestingUtility();<a name="line.4036"></a>
-<span class="sourceLineNo">4037</span>    // Why do we set the block size in this test?  If we set it smaller than the kvs, then we'll<a name="line.4037"></a>
-<span class="sourceLineNo">4038</span>    // break up the file in to more pieces that can be distributed across the three nodes and we<a name="line.4038"></a>
-<span class="sourceLineNo">4039</span>    // won't be able to have the condition this test asserts; that at least one node has<a name="line.4039"></a>
-<span class="sourceLineNo">4040</span>    // a copy of all replicas -- if small block size, then blocks are spread evenly across the<a name="line.4040"></a>
-<span class="sourceLineNo">4041</span>    // the three nodes.  hfilev3 with tags seems to put us over the block size.  St.Ack.<a name="line.4041"></a>
-<span class="sourceLineNo">4042</span>    // final int DEFAULT_BLOCK_SIZE = 1024;<a name="line.4042"></a>
-<span class="sourceLineNo">4043</span>    // htu.getConfiguration().setLong("dfs.blocksize", DEFAULT_BLOCK_SIZE);<a name="line.4043"></a>
-<span class="sourceLineNo">4044</span>    htu.getConfiguration().setInt("dfs.replication", 2);<a name="line.4044"></a>
-<span class="sourceLineNo">4045</span><a name="line.4045"></a>
-<span class="sourceLineNo">4046</span>    // set up a cluster with 3 nodes<a name="line.4046"></a>
-<span class="sourceLineNo">4047</span>    MiniHBaseCluster cluster = null;<a name="line.4047"></a>
-<span class="sourceLineNo">4048</span>    String dataNodeHosts[] = new String[] { "host1", "host2", "host3" };<a name="line.4048"></a>
-<span class="sourceLineNo">4049</span>    int regionServersCount = 3;<a name="line.4049"></a>
-<span class="sourceLineNo">4050</span><a name="line.4050"></a>
-<span class="sourceLineNo">4051</span>    try {<a name="line.4051"></a>
-<span class="sourceLineNo">4052</span>      StartMiniClusterOption option = StartMiniClusterOption.builder()<a name="line.4052"></a>
-<span class="sourceLineNo">4053</span>          .numRegionServers(regionServersCount).dataNodeHosts(dataNodeHosts).build();<a name="line.4053"></a>
-<span class="sourceLineNo">4054</span>      cluster = htu.startMiniCluster(option);<a name="line.4054"></a>
-<span class="sourceLineNo">4055</span>      byte[][] families = { fam1, fam2 };<a name="line.4055"></a>
-<span class="sourceLineNo">4056</span>      Table ht = htu.createTable(tableName, families);<a name="line.4056"></a>
-<span class="sourceLineNo">4057</span><a name="line.4057"></a>
-<span class="sourceLineNo">4058</span>      // Setting up region<a name="line.4058"></a>
-<span class="sourceLineNo">4059</span>      byte row[] = Bytes.toBytes("row1");<a name="line.4059"></a>
-<span class="sourceLineNo">4060</span>      byte col[] = Bytes.toBytes("col1");<a name="line.4060"></a>
-<span class="sourceLineNo">4061</span><a name="line.4061"></a>
-<span class="sourceLineNo">4062</span>      Put put = new Put(row);<a name="line.4062"></a>
-<span class="sourceLineNo">4063</span>      put.addColumn(fam1, col, 1, Bytes.toBytes("test1"));<a name="line.4063"></a>
-<span class="sourceLineNo">4064</span>      put.addColumn(fam2, col, 1, Bytes.toBytes("test2"));<a name="line.4064"></a>
-<span class="sourceLineNo">4065</span>      ht.put(put);<a name="line.4065"></a>
-<span class="sourceLineNo">4066</span><a name="line.4066"></a>
-<span class="sourceLineNo">4067</span>      HRegion firstRegion = htu.getHBaseCluster().getRegions(tableName).get(0);<a name="line.4067"></a>
-<span class="sourceLineNo">4068</span>      firstRegion.flush(true);<a name="line.4068"></a>
-<span class="sourceLineNo">4069</span>      HDFSBlocksDistribution blocksDistribution1 = firstRegion.getHDFSBlocksDistribution();<a name="line.4069"></a>
-<span class="sourceLineNo">4070</span><a name="line.4070"></a>
-<span class="sourceLineNo">4071</span>      // Given the default replication factor is 2 and we have 2 HFiles,<a name="line.4071"></a>
-<span class="sourceLineNo">4072</span>      // we will have total of 4 replica of blocks on 3 datanodes; thus there<a name="line.4072"></a>
-<span class="sourceLineNo">4073</span>      // must be at least one host that have replica for 2 HFiles. That host's<a name="line.4073"></a>
-<span class="sourceLineNo">4074</span>      // weight will be equal to the unique block weight.<a name="line.4074"></a>
-<span class="sourceLineNo">4075</span>      long uniqueBlocksWeight1 = blocksDistribution1.getUniqueBlocksTotalWeight();<a name="line.4075"></a>
-<span class="sourceLineNo">4076</span>      StringBuilder sb = new StringBuilder();<a name="line.4076"></a>
-<span class="sourceLineNo">4077</span>      for (String host: blocksDistribution1.getTopHosts()) {<a name="line.4077"></a>
-<span class="sourceLineNo">4078</span>        if (sb.length() &gt; 0) sb.append(", ");<a name="line.4078"></a>
-<span class="sourceLineNo">4079</span>        sb.append(host);<a name="line.4079"></a>
-<span class="sourceLineNo">4080</span>        sb.append("=");<a name="line.4080"></a>
-<span class="sourceLineNo">4081</span>        sb.append(blocksDistribution1.getWeight(host));<a name="line.4081"></a>
-<span class="sourceLineNo">4082</span>      }<a name="line.4082"></a>
-<span class="sourceLineNo">4083</span><a name="line.4083"></a>
-<span class="sourceLineNo">4084</span>      String topHost = blocksDistribution1.getTopHosts().get(0);<a name="line.4084"></a>
-<span class="sourceLineNo">4085</span>      long topHostWeight = blocksDistribution1.getWeight(topHost);<a name="line.4085"></a>
-<span class="sourceLineNo">4086</span>      String msg = "uniqueBlocksWeight=" + uniqueBlocksWeight1 + ", topHostWeight=" +<a name="line.4086"></a>
-<span class="sourceLineNo">4087</span>        topHostWeight + ", topHost=" + topHost + "; " + sb.toString();<a name="line.4087"></a>
-<span class="sourceLineNo">4088</span>      LOG.info(msg);<a name="line.4088"></a>
-<span class="sourceLineNo">4089</span>      assertTrue(msg, uniqueBlocksWeight1 == topHostWeight);<a name="line.4089"></a>
-<span class="sourceLineNo">4090</span><a name="line.4090"></a>
-<span class="sourceLineNo">4091</span>      // use the static method to compute the value, it should be the same.<a name="line.4091"></a>
-<span class="sourceLineNo">4092</span>      // static method is used by load balancer or other components<a name="line.4092"></a>
-<span class="sourceLineNo">4093</span>      HDFSBlocksDistribution blocksDistribution2 = HRegion.computeHDFSBlocksDistribution(<a name="line.4093"></a>
-<span class="sourceLineNo">4094</span>          htu.getConfiguration(), firstRegion.getTableDescriptor(), firstRegion.getRegionInfo());<a name="line.4094"></a>
-<span class="sourceLineNo">4095</span>      long uniqueBlocksWeight2 = blocksDistribution2.getUniqueBlocksTotalWeight();<a name="line.4095"></a>
-<span class="sourceLineNo">4096</span><a name="line.4096"></a>
-<span class="sourceLineNo">4097</span>      assertTrue(uniqueBlocksWeight1 == uniqueBlocksWeight2);<a name="line.4097"></a>
-<span class="sourceLineNo">4098</span><a name="line.4098"></a>
-<span class="sourceLineNo">4099</span>      ht.close();<a name="line.4099"></a>
-<span class="sourceLineNo">4100</span>    } finally {<a name="line.4100"></a>
-<span class="sourceLineNo">4101</span>      if (cluster != null) {<a name="line.4101"></a>
-<span class="sourceLineNo">4102</span>        htu.shutdownMiniCluster();<a name="line.4102"></a>
-<span class="sourceLineNo">4103</span>      }<a name="line.4103"></a>
-<span class="sourceLineNo">4104</span>    }<a name="line.4104"></a>
-<span class="sourceLineNo">4105</span>  }<a name="line.4105"></a>
+<span class="sourceLineNo">3944</span>    // before compaction<a name="line.3944"></a>
+<span class="sourceLineNo">3945</span>    HStore store = region.getStore(fam1);<a name="line.3945"></a>
+<span class="sourceLineNo">3946</span>    Collection&lt;HStoreFile&gt; storeFiles = store.getStorefiles();<a name="line.3946"></a>
+<span class="sourceLineNo">3947</span>    for (HStoreFile storefile : storeFiles) {<a name="line.3947"></a>
+<span class="sourceLineNo">3948</span>      StoreFileReader reader = storefile.getReader();<a name="line.3948"></a>
+<span class="sourceLineNo">3949</span>      reader.loadFileInfo();<a name="line.3949"></a>
+<span class="sourceLineNo">3950</span>      reader.loadBloomfilter();<a name="line.3950"></a>
+<span class="sourceLineNo">3951</span>      assertEquals(num_unique_rows * duplicate_multiplier, reader.getEntries());<a name="line.3951"></a>
+<span class="sourceLineNo">3952</span>      assertEquals(num_unique_rows, reader.getFilterEntries());<a name="line.3952"></a>
+<span class="sourceLineNo">3953</span>    }<a name="line.3953"></a>
+<span class="sourceLineNo">3954</span><a name="line.3954"></a>
+<span class="sourceLineNo">3955</span>    region.compact(true);<a name="line.3955"></a>
+<span class="sourceLineNo">3956</span><a name="line.3956"></a>
+<span class="sourceLineNo">3957</span>    // after compaction<a name="line.3957"></a>
+<span class="sourceLineNo">3958</span>    storeFiles = store.getStorefiles();<a name="line.3958"></a>
+<span class="sourceLineNo">3959</span>    for (HStoreFile storefile : storeFiles) {<a name="line.3959"></a>
+<span class="sourceLineNo">3960</span>      StoreFileReader reader = storefile.getReader();<a name="line.3960"></a>
+<span class="sourceLineNo">3961</span>      reader.loadFileInfo();<a name="line.3961"></a>
+<span class="sourceLineNo">3962</span>      reader.loadBloomfilter();<a name="line.3962"></a>
+<span class="sourceLineNo">3963</span>      assertEquals(num_unique_rows * duplicate_multiplier * num_storefiles, reader.getEntries());<a name="line.3963"></a>
+<span class="sourceLineNo">3964</span>      assertEquals(num_unique_rows, reader.getFilterEntries());<a name="line.3964"></a>
+<span class="sourceLineNo">3965</span>    }<a name="line.3965"></a>
+<span class="sourceLineNo">3966</span>  }<a name="line.3966"></a>
+<span class="sourceLineNo">3967</span><a name="line.3967"></a>
+<span class="sourceLineNo">3968</span>  @Test<a name="line.3968"></a>
+<span class="sourceLineNo">3969</span>  public void testAllColumnsWithBloomFilter() throws IOException {<a name="line.3969"></a>
+<span class="sourceLineNo">3970</span>    byte[] TABLE = Bytes.toBytes(name.getMethodName());<a name="line.3970"></a>
+<span class="sourceLineNo">3971</span>    byte[] FAMILY = Bytes.toBytes("family");<a name="line.3971"></a>
+<span class="sourceLineNo">3972</span><a name="line.3972"></a>
+<span class="sourceLineNo">3973</span>    // Create table<a name="line.3973"></a>
+<span class="sourceLineNo">3974</span>    HColumnDescriptor hcd = new HColumnDescriptor(FAMILY).setMaxVersions(Integer.MAX_VALUE)<a name="line.3974"></a>
+<span class="sourceLineNo">3975</span>        .setBloomFilterType(BloomType.ROWCOL);<a name="line.3975"></a>
+<span class="sourceLineNo">3976</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(TABLE));<a name="line.3976"></a>
+<span class="sourceLineNo">3977</span>    htd.addFamily(hcd);<a name="line.3977"></a>
+<span class="sourceLineNo">3978</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.3978"></a>
+<span class="sourceLineNo">3979</span>    this.region = TEST_UTIL.createLocalHRegion(info, htd);<a name="line.3979"></a>
+<span class="sourceLineNo">3980</span>    // For row:0, col:0: insert versions 1 through 5.<a name="line.3980"></a>
+<span class="sourceLineNo">3981</span>    byte[] row = Bytes.toBytes("row:" + 0);<a name="line.3981"></a>
+<span class="sourceLineNo">3982</span>    byte[] column = Bytes.toBytes("column:" + 0);<a name="line.3982"></a>
+<span class="sourceLineNo">3983</span>    Put put = new Put(row);<a name="line.3983"></a>
+<span class="sourceLineNo">3984</span>    put.setDurability(Durability.SKIP_WAL);<a name="line.3984"></a>
+<span class="sourceLineNo">3985</span>    for (long idx = 1; idx &lt;= 4; idx++) {<a name="line.3985"></a>
+<span class="sourceLineNo">3986</span>      put.addColumn(FAMILY, column, idx, Bytes.toBytes("value-version-" + idx));<a name="line.3986"></a>
+<span class="sourceLineNo">3987</span>    }<a name="line.3987"></a>
+<span class="sourceLineNo">3988</span>    region.put(put);<a name="line.3988"></a>
+<span class="sourceLineNo">3989</span><a name="line.3989"></a>
+<span class="sourceLineNo">3990</span>    // Flush<a name="line.3990"></a>
+<span class="sourceLineNo">3991</span>    region.flush(true);<a name="line.3991"></a>
+<span class="sourceLineNo">3992</span><a name="line.3992"></a>
+<span class="sourceLineNo">3993</span>    // Get rows<a name="line.3993"></a>
+<span class="sourceLineNo">3994</span>    Get get = new Get(row);<a name="line.3994"></a>
+<span class="sourceLineNo">3995</span>    get.readAllVersions();<a name="line.3995"></a>
+<span class="sourceLineNo">3996</span>    Cell[] kvs = region.get(get).rawCells();<a name="line.3996"></a>
+<span class="sourceLineNo">3997</span><a name="line.3997"></a>
+<span class="sourceLineNo">3998</span>    // Check if rows are correct<a name="line.3998"></a>
+<span class="sourceLineNo">3999</span>    assertEquals(4, kvs.length);<a name="line.3999"></a>
+<span class="sourceLineNo">4000</span>    checkOneCell(kvs[0], FAMILY, 0, 0, 4);<a name="line.4000"></a>
+<span class="sourceLineNo">4001</span>    checkOneCell(kvs[1], FAMILY, 0, 0, 3);<a name="line.4001"></a>
+<span class="sourceLineNo">4002</span>    checkOneCell(kvs[2], FAMILY, 0, 0, 2);<a name="line.4002"></a>
+<span class="sourceLineNo">4003</span>    checkOneCell(kvs[3], FAMILY, 0, 0, 1);<a name="line.4003"></a>
+<span class="sourceLineNo">4004</span>  }<a name="line.4004"></a>
+<span class="sourceLineNo">4005</span><a name="line.4005"></a>
+<span class="sourceLineNo">4006</span>  /**<a name="line.4006"></a>
+<span class="sourceLineNo">4007</span>   * Testcase to cover bug-fix for HBASE-2823 Ensures correct delete when<a name="line.4007"></a>
+<span class="sourceLineNo">4008</span>   * issuing delete row on columns with bloom filter set to row+col<a name="line.4008"></a>
+<span class="sourceLineNo">4009</span>   * (BloomType.ROWCOL)<a name="line.4009"></a>
+<span class="sourceLineNo">4010</span>   */<a name="line.4010"></a>
+<span class="sourceLineNo">4011</span>  @Test<a name="line.4011"></a>
+<span class="sourceLineNo">4012</span>  public void testDeleteRowWithBloomFilter() throws IOException {<a name="line.4012"></a>
+<span class="sourceLineNo">4013</span>    byte[] familyName = Bytes.toBytes("familyName");<a name="line.4013"></a>
+<span class="sourceLineNo">4014</span><a name="line.4014"></a>
+<span class="sourceLineNo">4015</span>    // Create Table<a name="line.4015"></a>
+<span class="sourceLineNo">4016</span>    HColumnDescriptor hcd = new HColumnDescriptor(familyName).setMaxVersions(Integer.MAX_VALUE)<a name="line.4016"></a>
+<span class="sourceLineNo">4017</span>        .setBloomFilterType(BloomType.ROWCOL);<a name="line.4017"></a>
+<span class="sourceLineNo">4018</span><a name="line.4018"></a>
+<span class="sourceLineNo">4019</span>    HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.4019"></a>
+<span class="sourceLineNo">4020</span>    htd.addFamily(hcd);<a name="line.4020"></a>
+<span class="sourceLineNo">4021</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.4021"></a>
+<span class="sourceLineNo">4022</span>    this.region = TEST_UTIL.createLocalHRegion(info, htd);<a name="line.4022"></a>
+<span class="sourceLineNo">4023</span>    // Insert some data<a name="line.4023"></a>
+<span class="sourceLineNo">4024</span>    byte[] row = Bytes.toBytes("row1");<a name="line.4024"></a>
+<span class="sourceLineNo">4025</span>    byte[] col = Bytes.toBytes("col1");<a name="line.4025"></a>
+<span class="sourceLineNo">4026</span><a name="line.4026"></a>
+<span class="sourceLineNo">4027</span>    Put put = new Put(row);<a name="line.4027"></a>
+<span class="sourceLineNo">4028</span>    put.addColumn(familyName, col, 1, Bytes.toBytes("SomeRandomValue"));<a name="line.4028"></a>
+<span class="sourceLineNo">4029</span>    region.put(put);<a name="line.4029"></a>
+<span class="sourceLineNo">4030</span>    region.flush(true);<a name="line.4030"></a>
+<span class="sourceLineNo">4031</span><a name="line.4031"></a>
+<span class="sourceLineNo">4032</span>    Delete del = new Delete(row);<a name="line.4032"></a>
+<span class="sourceLineNo">4033</span>    region.delete(del);<a name="line.4033"></a>
+<span class="sourceLineNo">4034</span>    region.flush(true);<a name="line.4034"></a>
+<span class="sourceLineNo">4035</span><a name="line.4035"></a>
+<span class="sourceLineNo">4036</span>    // Get remaining rows (should have none)<a name="line.4036"></a>
+<span class="sourceLineNo">4037</span>    Get get = new Get(row);<a name="line.4037"></a>
+<span class="sourceLineNo">4038</span>    get.addColumn(familyName, col);<a name="line.4038"></a>
+<span class="sourceLineNo">4039</span><a name="line.4039"></a>
+<span class="sourceLineNo">4040</span>    Cell[] keyValues = region.get(get).rawCells();<a name="line.4040"></a>
+<span class="sourceLineNo">4041</span>    assertEquals(0, keyValues.length);<a name="line.4041"></a>
+<span class="sourceLineNo">4042</span>  }<a name="line.4042"></a>
+<span class="sourceLineNo">4043</span><a name="line.4043"></a>
+<span class="sourceLineNo">4044</span>  @Test<a name="line.4044"></a>
+<span class="sourceLineNo">4045</span>  public void testgetHDFSBlocksDistribution() throws Exception {<a name="line.4045"></a>
+<span class="sourceLineNo">4046</span>    HBaseTestingUtility htu = new HBaseTestingUtility();<a name="line.4046"></a>
+<span class="sourceLineNo">4047</span>    // Why do we set the block size in this test?  If we set it smaller than the kvs, then we'll<a name="line.4047"></a>
+<span class="sourceLineNo">4048</span>    // break up the file in to more pieces that can be distributed across the three nodes and we<a name="line.4048"></a>
+<span class="sourceLineNo">4049</span>    // won't be able to have the condition this test asserts; that at least one node has<a name="line.4049"></a>
+<span class="sourceLineNo">4050</span>    // a copy of all replicas -- if small block size, then blocks are spread evenly across the<a name="line.4050"></a>
+<span class="sourceLineNo">4051</span>    // the three nodes.  hfilev3 with tags seems to put us over the block size.  St.Ack.<a name="line.4051"></a>
+<span class="sourceLineNo">4052</span>    // final int DEFAULT_BLOCK_SIZE = 1024;<a name="line.4052"></a>
+<span class="sourceLineNo">4053</span>    // htu.getConfiguration().setLong("dfs.blocksize", DEFAULT_BLOCK_SIZE);<a name="line.4053"></a>
+<span class="sourceLineNo">4054</span>    htu.getConfiguration().setInt("dfs.replication", 2);<a name="line.4054"></a>
+<span class="sourceLineNo">4055</span><a name="line.4055"></a>
+<span class="sourceLineNo">4056</span>    // set up a cluster with 3 nodes<a name="line.4056"></a>
+<span class="sourceLineNo">4057</span>    MiniHBaseCluster cluster = null;<a name="line.4057"></a>
+<span class="sourceLineNo">4058</span>    String dataNodeHosts[] = new String[] { "host1", "host2", "host3" };<a name="line.4058"></a>
+<span class="sourceLineNo">4059</span>    int regionServersCount = 3;<a name="line.4059"></a>
+<span class="sourceLineNo">4060</span><a name="line.4060"></a>
+<span class="sourceLineNo">4061</span>    try {<a name="line.4061"></a>
+<span class="sourceLineNo">4062</span>      StartMiniClusterOption option = StartMiniClusterOption.builder()<a name="line.4062"></a>
+<span class="sourceLineNo">4063</span>          .numRegionServers(regionServersCount).dataNodeHosts(dataNodeHosts).build();<a name="line.4063"></a>
+<span class="sourceLineNo">4064</span>      cluster = htu.startMiniCluster(option);<a name="line.4064"></a>
+<span class="sourceLineNo">4065</span>      byte[][] families = { fam1, fam2 };<a name="line.4065"></a>
+<span class="sourceLineNo">4066</span>      Table ht = htu.createTable(tableName, families);<a name="line.4066"></a>
+<span class="sourceLineNo">4067</span><a name="line.4067"></a>
+<span class="sourceLineNo">4068</span>      // Setting up region<a name="line.4068"></a>
+<span class="sourceLineNo">4069</span>      byte row[] = Bytes.toBytes("row1");<a name="line.4069"></a>
+<span class="sourceLineNo">4070</span>      byte col[] = Bytes.toBytes("col1");<a name="line.4070"></a>
+<span class="sourceLineNo">4071</span><a name="line.4071"></a>
+<span class="sourceLineNo">4072</span>      Put put = new Put(row);<a name="line.4072"></a>
+<span class="sourceLineNo">4073</span>      put.addColumn(fam1, col, 1, Bytes.toBytes("test1"));<a name="line.4073"></a>
+<span class="sourceLineNo">4074</span>      put.addColumn(fam2, col, 1, Bytes.toBytes("test2"));<a name="line.4074"></a>
+<span class="sourceLineNo">4075</span>      ht.put(put);<a name="line.4075"></a>
+<span class="sourceLineNo">4076</span><a name="line.4076"></a>
+<span class="sourceLineNo">4077</span>      HRegion firstRegion = htu.getHBaseCluster().getRegions(tableName).get(0);<a name="line.4077"></a>
+<span class="sourceLineNo">4078</span>      firstRegion.flush(true);<a name="line.4078"></a>
+<span class="sourceLineNo">4079</span>      HDFSBlocksDistribution blocksDistribution1 = firstRegion.getHDFSBlocksDistribution();<a name="line.4079"></a>
+<span class="sourceLineNo">4080</span><a name="line.4080"></a>
+<span class="sourceLineNo">4081</span>      // Given the default replication factor is 2 and we have 2 HFiles,<a name="line.4081"></a>
+<span class="sourceLineNo">4082</span>      // we will have total of 4 replica of blocks on 3 datanodes; thus there<a name="line.4082"></a>
+<span class="sourceLineNo">4083</span>      // must be at least one host that have replica for 2 HFiles. That host's<a name="line.4083"></a>
+<span class="sourceLineNo">4084</span>      // weight will be equal to the unique block weight.<a name="line.4084"></a>
+<span class="sourceLineNo">4085</span>      long uniqueBlocksWeight1 = blocksDistribution1.getUniqueBlocksTotalWeight();<a name="line.4085"></a>
+<span class="sourceLineNo">4086</span>      StringBuilder sb = new StringBuilder();<a name="line.4086"></a>
+<span class="sourceLineNo">4087</span>      for (String host: blocksDistribution1.getTopHosts()) {<a name="line.4087"></a>
+<span class="sourceLineNo">4088</span>        if (sb.length() &gt; 0) sb.append(", ");<a name="line.4088"></a>
+<span class="sourceLineNo">4089</span>        sb.append(host);<a name="line.4089"></a>
+<span class="sourceLineNo">4090</span>        sb.append("=");<a name="line.4090"></a>
+<span class="sourceLineNo">4091</span>        sb.append(blocksDistribution1.getWeight(host));<a name="line.4091"></a>
+<span class="sourceLineNo">4092</span>      }<a name="line.4092"></a>
+<span class="sourceLineNo">4093</span><a name="line.4093"></a>
+<span class="sourceLineNo">4094</span>      String topHost = blocksDistribution1.getTopHosts().get(0);<a name="line.4094"></a>
+<span class="sourceLineNo">4095</span>      long topHostWeight = blocksDistribution1.getWeight(topHost);<a name="line.4095"></a>
+<span class="sourceLineNo">4096</span>      String msg = "uniqueBlocksWeight=" + uniqueBlocksWeight1 + ", topHostWeight=" +<a name="line.4096"></a>
+<span class="sourceLineNo">4097</span>        topHostWeight + ", topHost=" + topHost + "; " + sb.toString();<a name="line.4097"></a>
+<span class="sourceLineNo">4098</span>      LOG.info(msg);<a name="line.4098"></a>
+<span class="sourceLineNo">4099</span>      assertTrue(msg, uniqueBlocksWeight1 == topHostWeight);<a name="line.4099"></a>
+<span class="sourceLineNo">4100</span><a name="line.4100"></a>
+<span class="sourceLineNo">4101</span>      // use the static method to compute the value, it should be the same.<a name="line.4101"></a>
+<span class="sourceLineNo">4102</span>      // static method is used by load balancer or other components<a name="line.4102"></a>
+<span class="sourceLineNo">4103</span>      HDFSBlocksDistribution blocksDistribution2 = HRegion.computeHDFSBlocksDistribution(<a name="line.4103"></a>
+<span class="sourceLineNo">4104</span>          htu.getConfiguration(), firstRegion.getTableDescriptor(), firstRegion.getRegionInfo());<a name="line.4104"></a>
+<span class="sourceLineNo">4105</span>      long uniqueBlocksWeight2 = blocksDistribution2.getUniqueBlocksTotalWeight();<a name="line.4105"></a>
 <span class="sourceLineNo">4106</span><a name="line.4106"></a>
-<span class="sourceLineNo">4107</span>  /**<a name="line.4107"></a>
-<span class="sourceLineNo">4108</span>   * Testcase to check state of region initialization task set to ABORTED or not<a name="line.4108"></a>
-<span class="sourceLineNo">4109</span>   * if any exceptions during initialization<a name="line.4109"></a>
-<span class="sourceLineNo">4110</span>   *<a name="line.4110"></a>
-<span class="sourceLineNo">4111</span>   * @throws Exception<a name="line.4111"></a>
-<span class="sourceLineNo">4112</span>   */<a name="line.4112"></a>
-<span class="sourceLineNo">4113</span>  @Test<a name="line.4113"></a>
-<span class="sourceLineNo">4114</span>  public void testStatusSettingToAbortIfAnyExceptionDuringRegionInitilization() throws Exception {<a name="line.4114"></a>
-<span class="sourceLineNo">4115</span>    HRegionInfo info;<a name="line.4115"></a>
-<span class="sourceLineNo">4116</span>    try {<a name="line.4116"></a>
-<span class="sourceLineNo">4117</span>      FileSystem fs = Mockito.mock(FileSystem.class);<a name="line.4117"></a>
-<span class="sourceLineNo">4118</span>      Mockito.when(fs.exists((Path) Mockito.anyObject())).thenThrow(new IOException());<a name="line.4118"></a>
-<span class="sourceLineNo">4119</span>      HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.4119"></a>
-<span class="sourceLineNo">4120</span>      htd.addFamily(new HColumnDescriptor("cf"));<a name="line.4120"></a>
-<span class="sourceLineNo">4121</span>      info = new HRegionInfo(htd.getTableName(), HConstants.EMPTY_BYTE_ARRAY,<a name="line.4121"></a>
-<span class="sourceLineNo">4122</span>          HConstants.EMPTY_BYTE_ARRAY, false);<a name="line.4122"></a>
-<span class="sourceLineNo">4123</span>      Path path = new Path(dir + "testStatusSettingToAbortIfAnyExceptionDuringRegionInitilization");<a name="line.4123"></a>
-<span class="sourceLineNo">4124</span>      region = HRegion.newHRegion(path, null, fs, CONF, info, htd, null);<a name="line.4124"></a>
-<span class="sourceLineNo">4125</span>      // region initialization throws IOException and set task state to ABORTED.<a name="line.4125"></a>
-<span class="sourceLineNo">4126</span>      region.initialize();<a name="line.4126"></a>
-<span class="sourceLineNo">4127</span>      fail("Region initialization should fail due to IOException");<a name="line.4127"></a>
-<span class="sourceLineNo">4128</span>    } catch (IOException io) {<a name="line.4128"></a>
-<span class="sourceLineNo">4129</span>      List&lt;MonitoredTask&gt; tasks = TaskMonitor.get().getTasks();<a name="line.4129"></a>
-<span class="sourceLineNo">4130</span>      for (MonitoredTask monitoredTask : tasks) {<a name="line.4130"></a>
-<span class="sourceLineNo">4131</span>        if (!(monitoredTask instanceof MonitoredRPCHandler)<a name="line.4131"></a>
-<span class="sourceLineNo">4132</span>            &amp;&amp; monitoredTask.getDescription().contains(region.toString())) {<a name="line.4132"></a>
-<span class="sourceLineNo">4133</span>          assertTrue("Region state should be ABORTED.",<a name="line.4133"></a>
-<span class="sourceLineNo">4134</span>              monitoredTask.getState().equals(MonitoredTask.State.ABORTED));<a name="line.4134"></a>
-<span class="sourceLineNo">4135</span>          break;<a name="line.4135"></a>
-<span class="sourceLineNo">4136</span>        }<a name="line.4136"></a>
-<span class="sourceLineNo">4137</span>      }<a name="line.4137"></a>
-<span class="sourceLineNo">4138</span>    }<a name="line.4138"></a>
-<span class="sourceLineNo">4139</span>  }<a name="line.4139"></a>
-<span class="sourceLineNo">4140</span><a name="line.4140"></a>
-<span class="sourceLineNo">4141</span>  /**<a name="line.4141"></a>
-<span class="sourceLineNo">4142</span>   * Verifies that the .regioninfo file is written on region creation and that<a name="line.4142"></a>
-<span class="sourceLineNo">4143</span>   * is recreated if missing during region opening.<a name="line.4143"></a>
-<span class="sourceLineNo">4144</span>   */<a name="line.4144"></a>
-<span class="sourceLineNo">4145</span>  @Test<a name="line.4145"></a>
-<span class="sourceLineNo">4146</span>  public void testRegionInfoFileCreation() throws IOException {<a name="line.4146"></a>
-<span class="sourceLineNo">4147</span>    Path rootDir = new Path(dir + "testRegionInfoFileCreation");<a name="line.4147"></a>
-<span class="sourceLineNo">4148</span><a name="line.4148"></a>
-<span class="sourceLineNo">4149</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.4149"></a>
-<span class="sourceLineNo">4150</span>    htd.addFamily(new HColumnDescriptor("cf"));<a name="line.4150"></a>
-<span class="sourceLineNo">4151</span><a name="line.4151"></a>
-<span class="sourceLineNo">4152</span>    HRegionInfo hri = new HRegionInfo(htd.getTableName());<a name="line.4152"></a>
-<span class="sourceLineNo">4153</span><a name="line.4153"></a>
-<span class="sourceLineNo">4154</span>    // Create a region and skip the initialization (like CreateTableHandler)<a name="line.4154"></a>
-<span class="sourceLineNo">4155</span>    region = HBaseTestingUtility.createRegionAndWAL(hri, rootDir, CONF, htd, false);<a name="line.4155"></a>
-<span class="sourceLineNo">4156</span>    Path regionDir = region.getRegionFileSystem().getRegionDir();<a name="line.4156"></a>
-<span class="sourceLineNo">4157</span>    FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.4157"></a>
-<span class="sourceLineNo">4158</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.4158"></a>
-<span class="sourceLineNo">4159</span><a name="line.4159"></a>
-<span class="sourceLineNo">4160</span>    Path regionInfoFile = new Path(regionDir, HRegionFileSystem.REGION_INFO_FILE);<a name="line.4160"></a>
+<span class="sourceLineNo">4107</span>      assertTrue(uniqueBlocksWeight1 == uniqueBlocksWeight2);<a name="line.4107"></a>
+<span class="sourceLineNo">4108</span><a name="line.4108"></a>
+<span class="sourceLineNo">4109</span>      ht.close();<a name="line.4109"></a>
+<span class="sourceLineNo">4110</span>    } finally {<a name="line.4110"></a>
+<span class="sourceLineNo">4111</span>      if (cluster != null) {<a name="line.4111"></a>
+<span class="sourceLineNo">4112</span>        htu.shutdownMiniCluster();<a name="line.4112"></a>
+<span class="sourceLineNo">4113</span>      }<a name="line.4113"></a>
+<span class="sourceLineNo">4114</span>    }<a name="line.4114"></a>
+<span class="sourceLineNo">4115</span>  }<a name="line.4115"></a>
+<span class="sourceLineNo">4116</span><a name="line.4116"></a>
+<span class="sourceLineNo">4117</span>  /**<a name="line.4117"></a>
+<span class="sourceLineNo">4118</span>   * Testcase to check state of region initialization task set to ABORTED or not<a name="line.4118"></a>
+<span class="sourceLineNo">4119</span>   * if any exceptions during initialization<a name="line.4119"></a>
+<span class="sourceLineNo">4120</span>   *<a name="line.4120"></a>
+<span class="sourceLineNo">4121</span>   * @throws Exception<a name="line.4121"></a>
+<span class="sourceLineNo">4122</span>   */<a name="line.4122"></a>
+<span class="sourceLineNo">4123</span>  @Test<a name="line.4123"></a>
+<span class="sourceLineNo">4124</span>  public void testStatusSettingToAbortIfAnyExceptionDuringRegionInitilization() throws Exception {<a name="line.4124"></a>
+<span class="sourceLineNo">4125</span>    HRegionInfo info;<a name="line.4125"></a>
+<span class="sourceLineNo">4126</span>    try {<a name="line.4126"></a>
+<span class="sourceLineNo">4127</span>      FileSystem fs = Mockito.mock(FileSystem.class);<a name="line.4127"></a>
+<span class="sourceLineNo">4128</span>      Mockito.when(fs.exists((Path) Mockito.anyObject())).thenThrow(new IOException());<a name="line.4128"></a>
+<span class="sourceLineNo">4129</span>      HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.4129"></a>
+<span class="sourceLineNo">4130</span>      htd.addFamily(new HColumnDescriptor("cf"));<a name="line.4130"></a>
+<span class="sourceLineNo">4131</span>      info = new HRegionInfo(htd.getTableName(), HConstants.EMPTY_BYTE_ARRAY,<a name="line.4131"></a>
+<span class="sourceLineNo">4132</span>          HConstants.EMPTY_BYTE_ARRAY, false);<a name="line.4132"></a>
+<span class="sourceLineNo">4133</span>      Path path = new Path(dir + "testStatusSettingToAbortIfAnyExceptionDuringRegionInitilization");<a name="line.4133"></a>
+<span class="sourceLineNo">4134</span>      region = HRegion.newHRegion(path, null, fs, CONF, info, htd, null);<a name="line.4134"></a>
+<span class="sourceLineNo">4135</span>      // region initialization throws IOException and set task state to ABORTED.<a name="line.4135"></a>
+<span class="sourceLineNo">4136</span>      region.initialize();<a name="line.4136"></a>
+<span class="sourceLineNo">4137</span>      fail("Region initialization should fail due to IOException");<a name="line.4137"></a>
+<span class="sourceLineNo">4138</span>    } catch (IOException io) {<a name="line.4138"></a>
+<span class="sourceLineNo">4139</span>      List&lt;MonitoredTask&gt; tasks = TaskMonitor.get().getTasks();<a name="line.4139"></a>
+<span class="sourceLineNo">4140</span>      for (MonitoredTask monitoredTask : tasks) {<a name="line.4140"></a>
+<span class="sourceLineNo">4141</span>        if (!(monitoredTask instanceof MonitoredRPCHandler)<a name="line.4141"></a>
+<span class="sourceLineNo">4142</span>            &amp;&amp; monitoredTask.getDescription().contains(region.toString())) {<a name="line.4142"></a>
+<span class="sourceLineNo">4143</span>          assertTrue("Region state should be ABORTED.",<a name="line.4143"></a>
+<span class="sourceLineNo">4144</span>              monitoredTask.getState().equals(MonitoredTask.State.ABORTED));<a name="line.4144"></a>
+<span class="sourceLineNo">4145</span>          break;<a name="line.4145"></a>
+<span class="sourceLineNo">4146</span>        }<a name="line.4146"></a>
+<span class="sourceLineNo">4147</span>      }<a name="line.4147"></a>
+<span class="sourceLineNo">4148</span>    }<a name="line.4148"></a>
+<span class="sourceLineNo">4149</span>  }<a name="line.4149"></a>
+<span class="sourceLineNo">4150</span><a name="line.4150"></a>
+<span class="sourceLineNo">4151</span>  /**<a name="line.4151"></a>
+<span class="sourceLineNo">4152</span>   * Verifies that the .regioninfo file is written on region creation and that<a name="line.4152"></a>
+<span class="sourceLineNo">4153</span>   * is recreated if missing during region opening.<a name="line.4153"></a>
+<span class="sourceLineNo">4154</span>   */<a name="line.4154"></a>
+<span class="sourceLineNo">4155</span>  @Test<a name="line.4155"></a>
+<span class="sourceLineNo">4156</span>  public void testRegionInfoFileCreation() throws IOException {<a name="line.4156"></a>
+<span class="sourceLineNo">4157</span>    Path rootDir = new Path(dir + "testRegionInfoFileCreation");<a name="line.4157"></a>
+<span class="sourceLineNo">4158</span><a name="line.4158"></a>
+<span class="sourceLineNo">4159</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.4159"></a>
+<span class="sourceLineNo">4160</span>    htd.addFamily(new HColumnDescriptor("cf"));<a name="line.4160"></a>
 <span class="sourceLineNo">4161</span><a name="line.4161"></a>
-<span class="sourceLineNo">4162</span>    // Verify that the .regioninfo file is present<a name="line.4162"></a>
-<span class="sourceLineNo">4163</span>    assertTrue(HRegionFileSystem.REGION_INFO_FILE + " should be present in the region dir",<a name="line.4163"></a>
-<span class="sourceLineNo">4164</span>        fs.exists(regionInfoFile));<a name="line.4164"></a>
-<span class="sourceLineNo">4165</span><a name="line.4165"></a>
-<span class="sourceLineNo">4166</span>    // Try to open the region<a name="line.4166"></a>
-<span class="sourceLineNo">4167</span>    region = HRegion.openHRegion(rootDir, hri, htd, null, CONF);<a name="line.4167"></a>
-<span class="sourceLineNo">4168</span>    assertEquals(regionDir, region.getRegionFileSystem().getRegionDir());<a name="line.4168"></a>
-<span class="sourceLineNo">4169</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.4169"></a>
-<span class="sourceLineNo">4170</span><a name="line.4170"></a>
-<span class="sourceLineNo">4171</span>    // Verify that the .regioninfo file is still there<a name="line.4171"></a>
-<span class="sourceLineNo">4172</span>    assertTrue(HRegionFileSystem.REGION_INFO_FILE + " should be present in the region dir",<a name="line.4172"></a>
-<span class="sourceLineNo">4173</span>        fs.exists(regionInfoFile));<a name="line.4173"></a>
-<span class="sourceLineNo">4174</span><a name="line.4174"></a>
-<span class="sourceLineNo">4175</span>    // Remove the .regioninfo file and verify is recreated on region open<a name="line.4175"></a>
-<span class="sourceLineNo">4176</span>    fs.delete(regionInfoFile, true);<a name="line.4176"></a>
-<span class="sourceLineNo">4177</span>    assertFalse(HRegionFileSystem.REGION_INFO_FILE + " should be removed from the region dir",<a name="line.4177"></a>
-<span class="sourceLineNo">4178</span>        fs.exists(regionInfoFile));<a name="line.4178"></a>
-<span class="sourceLineNo">4179</span><a name="line.4179"></a>
-<span class="sourceLineNo">4180</span>    region = HRegion.openHRegion(rootDir, hri, htd, null, CONF);<a name="line.4180"></a>
-<span class="sourceLineNo">4181</span>//    region = TEST_UTIL.openHRegion(hri, htd);<a name="line.4181"></a>
-<span class="sourceLineNo">4182</span>    assertEquals(regionDir, region.getRegionFileSystem().getRegionDir());<a name="line.4182"></a>
-<span class="sourceLineNo">4183</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.4183"></a>
+<span class="sourceLineNo">4162</span>    HRegionInfo hri = new HRegionInfo(htd.getTableName());<a name="line.4162"></a>
+<span class="sourceLineNo">4163</span><a name="line.4163"></a>
+<span class="sourceLineNo">4164</span>    // Create a region and skip the initialization (like CreateTableHandler)<a name="line.4164"></a>
+<span class="sourceLineNo">4165</span>    region = HBaseTestingUtility.createRegionAndWAL(hri, rootDir, CONF, htd, false);<a name="line.4165"></a>
+<span class="sourceLineNo">4166</span>    Path regionDir = region.getRegionFileSystem().getRegionDir();<a name="line.4166"></a>
+<span class="sourceLineNo">4167</span>    FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.4167"></a>
+<span class="sourceLineNo">4168</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.4168"></a>
+<span class="sourceLineNo">4169</span><a name="line.4169"></a>
+<span class="sourceLineNo">4170</span>    Path regionInfoFile = new Path(regionDir, HRegionFileSystem.REGION_INFO_FILE);<a name="line.4170"></a>
+<span class="sourceLineNo">4171</span><a name="line.4171"></a>
+<span class="sourceLineNo">4172</span>    // Verify that the .regioninfo file is present<a name="line.4172"></a>
+<span class="sourceLineNo">4173</span>    assertTrue(HRegionFileSystem.REGION_INFO_FILE + " should be present in the region dir",<a name="line.4173"></a>
+<span class="sourceLineNo">4174</span>        fs.exists(regionInfoFile));<a name="line.4174"></a>
+<span class="sourceLineNo">4175</span><a name="line.4175"></a>
+<span class="sourceLineNo">4176</span>    // Try to open the region<a name="line.4176"></a>
+<span class="sourceLineNo">4177</span>    region = HRegion.openHRegion(rootDir, hri, htd, null, CONF);<a name="line.4177"></a>
+<span class="sourceLineNo">4178</span>    assertEquals(regionDir, region.getRegionFileSystem().getRegionDir());<a name="line.4178"></a>
+<span class="sourceLineNo">4179</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.4179"></a>
+<span class="sourceLineNo">4180</span><a name="line.4180"></a>
+<span class="sourceLineNo">4181</span>    // Verify that the .regioninfo file is still there<a name="line.4181"></a>
+<span class="sourceLineNo">4182</span>    assertTrue(HRegionFileSystem.REGION_INFO_FILE + " should be present in the region dir",<a name="line.4182"></a>
+<span class="sourceLineNo">4183</span>        fs.exists(regionInfoFile));<a name="line.4183"></a>
 <span class="sourceLineNo">4184</span><a name="line.4184"></a>
-<span class="sourceLineNo">4185</span>    // Verify that the .regioninfo file is still there<a name="line.4185"></a>
-<span class="sourceLineNo">4186</span>    assertTrue(HRegionFileSystem.REGION_INFO_FILE + " should be present in the region dir",<a name="line.4186"></a>
-<span class="sourceLineNo">4187</span>        fs.exists(new Path(regionDir, HRegionFileSystem.REGION_INFO_FILE)));<a name="line.4187"></a>
-<span class="sourceLineNo">4188</span><a name="line.4188"></a>
-<span class="sourceLineNo">4189</span>    region = null;<a name="line.4189"></a>
-<span class="sourceLineNo">4190</span>  }<a name="line.4190"></a>
-<span class="sourceLineNo">4191</span><a name="line.4191"></a>
-<span class="sourceLineNo">4192</span>  /**<a name="line.4192"></a>
-<span class="sourceLineNo">4193</span>   * TestCase for increment<a name="line.4193"></a>
-<span class="sourceLineNo">4194</span>   */<a name="line.4194"></a>
-<span class="sourceLineNo">4195</span>  private static class Incrementer implements Runnable {<a name="line.4195"></a>
-<span class="sourceLineNo">4196</span>    private HRegion region;<a name="line.4196"></a>
-<span class="sourceLineNo">4197</span>    private final static byte[] incRow = Bytes.toBytes("incRow");<a name="line.4197"></a>
-<span class="sourceLineNo">4198</span>    private final static byte[] family = Bytes.toBytes("family");<a name="line.4198"></a>
-<span class="sourceLineNo">4199</span>    private final static byte[] qualifier = Bytes.toBytes("qualifier");<a name="line.4199"></a>
-<span class="sourceLineNo">4200</span>    private final static long ONE = 1L;<a name="line.4200"></a>
-<span class="sourceLineNo">4201</span>    private int incCounter;<a name="line.4201"></a>
-<span class="sourceLineNo">4202</span><a name="line.4202"></a>
-<span class="sourceLineNo">4203</span>    public Incrementer(HRegion region, int incCounter) {<a name="line.4203"></a>
-<span class="sourceLineNo">4204</span>      this.region = region;<a name="line.4204"></a>
-<span class="sourceLineNo">4205</span>      this.incCounter = incCounter;<a name="line.4205"></a>
-<span class="sourceLineNo">4206</span>    }<a name="line.4206"></a>
-<span class="sourceLineNo">4207</span><a name="line.4207"></a>
-<span class="sourceLineNo">4208</span>    @Override<a name="line.4208"></a>
-<span class="sourceLineNo">4209</span>    public void run() {<a name="line.4209"></a>
-<span class="sourceLineNo">4210</span>      int count = 0;<a name="line.4210"></a>
-<span class="sourceLineNo">4211</span>      while (count &lt; incCounter) {<a name="line.4211"></a>
-<span class="sourceLineNo">4212</span>        Increment inc = new Increment(incRow);<a name="line.4212"></a>
-<span class="sourceLineNo">4213</span>        inc.addColumn(family, qualifier, ONE);<a name="line.4213"></a>
-<span class="sourceLineNo">4214</span>        count++;<a name="line.4214"></a>
-<span class="sourceLineNo">4215</span>        try {<a name="line.4215"></a>
-<span class="sourceLineNo">4216</span>          region.increment(inc);<a name="line.4216"></a>
-<span class="sourceLineNo">4217</span>        } catch (IOException e) {<a name="line.4217"></a>
-<span class="sourceLineNo">4218</span>          LOG.info("Count=" + count + ", " + e);<a name="line.4218"></a>
-<span class="sourceLineNo">4219</span>          break;<a name="line.4219"></a>
-<span class="sourceLineNo">4220</span>        }<a name="line.4220"></a>
-<span class="sourceLineNo">4221</span>      }<a name="line.4221"></a>
-<span class="sourceLineNo">4222</span>    }<a name="line.4222"></a>
-<span class="sourceLineNo">4223</span>  }<a name="line.4223"></a>
-<span class="sourceLineNo">4224</span><a name="line.4224"></a>
-<span class="sourceLineNo">4225</span>  /**<a name="line.4225"></a>
-<span class="sourceLineNo">4226</span>   * Test case to check increment function with memstore flushing<a name="line.4226"></a>
-<span class="sourceLineNo">4227</span>   * @throws Exception<a name="line.4227"></a>
-<span class="sourceLineNo">4228</span>   */<a name="line.4228"></a>
-<span class="sourceLineNo">4229</span>  @Test<a name="line.4229"></a>
-<span class="sourceLineNo">4230</span>  public void testParallelIncrementWithMemStoreFlush() throws Exception {<a name="line.4230"></a>
-<span class="sourceLineNo">4231</span>    byte[] family = Incrementer.family;<a name="line.4231"></a>
-<span class="sourceLineNo">4232</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.4232"></a>
-<span class="sourceLineNo">4233</span>    final HRegion region = this.region;<a name="line.4233"></a>
-<span class="sourceLineNo">4234</span>    final AtomicBoolean incrementDone = new AtomicBoolean(false);<a name="line.4234"></a>
-<span class="sourceLineNo">4235</span>    Runnable flusher = new Runnable() {<a name="line.4235"></a>
-<span class="sourceLineNo">4236</span>      @Override<a name="line.4236"></a>
-<span class="sourceLineNo">4237</span>      public void run() {<a name="line.4237"></a>
-<span class="sourceLineNo">4238</span>        while (!incrementDone.get()) {<a name="line.4238"></a>
-<span class="sourceLineNo">4239</span>          try {<a name="line.4239"></a>
-<span class="sourceLineNo">4240</span>            region.flush(true);<a name="line.4240"></a>
-<span class="sourceLineNo">4241</span>          } catch (Exception e) {<a name="line.4241"></a>
-<span class="sourceLineNo">4242</span>            e.printStackTrace();<a name="line.4242"></a>
-<span class="sourceLineNo">4243</span>          }<a name="line.4243"></a>
-<span class="sourceLineNo">4244</span>        }<a name="line.4244"></a>
-<span class="sourceLineNo">4245</span>      }<a name="line.4245"></a>
-<span class="sourceLineNo">4246</span>    };<a name="line.4246"></a>
-<span class="sourceLineNo">4247</span><a name="line.4247"></a>
-<span class="sourceLineNo">4248</span>    // after all increment finished, the row will increment to 20*100 = 2000<a name="line.4248"></a>
-<span class="sourceLineNo">4249</span>    int threadNum = 20;<a name="line.4249"></a>
-<span class="sourceLineNo">4250</span>    int incCounter = 100;<a name="line.4250"></a>
-<span class="sourceLineNo">4251</span>    long expected = (long) threadNum * incCounter;<a name="line.4251"></a>
-<span class="sourceLineNo">4252</span>    Thread[] incrementers = new Thread[threadNum];<a name="line.4252"></a>
-<span class="sourceLineNo">4253</span>    Thread flushThread = new Thread(flusher);<a name="line.4253"></a>
-<span class="sourceLineNo">4254</span>    for (int i = 0; i &lt; threadNum; i++) {<a name="line.4254"></a>
-<span class="sourceLineNo">4255</span>      incrementers[i] = new Thread(new Incrementer(this.region, incCounter));<a name="line.4255"></a>
-<span class="sourceLineNo">4256</span>      incrementers[i].start();<a name="line.4256"></a>
-<span class="sourceLineNo">4257</span>    }<a name="line.4257"></a>
-<span class="sourceLineNo">4258</span>    flushThread.start();<a name="line.4258"></a>
-<span class="sourceLineNo">4259</span>    for (int i = 0; i &lt; threadNum; i++) {<a name="line.4259"></a>
-<span class="sourceLineNo">4260</span>      incrementers[i].join();<a name="line.4260"></a>
-<span class="sourceLineNo">4261</span>    }<a name="line.4261"></a>
-<span class="sourceLineNo">4262</span><a name="line.4262"></a>
-<span class="sourceLineNo">4263</span>    incrementDone.set(true);<a name="line.4263"></a>
-<span class="sourceLineNo">4264</span>    flushThread.join();<a name="line.4264"></a>
-<span class="sourceLineNo">4265</span><a name="line.4265"></a>
-<span class="sourceLineNo">4266</span>    Get get = new Get(Incrementer.incRow);<a name="line.4266"></a>
-<span class="sourceLineNo">4267</span>    get.addColumn(Incrementer.family, Incrementer.qualifier);<a name="line.4267"></a>
-<span class="sourceLineNo">4268</span>    get.readVersions(1);<a name="line.4268"></a>
-<span class="sourceLineNo">4269</span>    Result res = this.region.get(get);<a name="line.4269"></a>
-<span class="sourceLineNo">4270</span>    List&lt;Cell&gt; kvs = res.getColumnCells(Incrementer.family, Incrementer.qualifier);<a name="line.4270"></a>
-<span class="sourceLineNo">4271</span><a name="line.4271"></a>
-<span class="sourceLineNo">4272</span>    // we just got the latest version<a name="line.4272"></a>
-<span class="sourceLineNo">4273</span>    assertEquals(1, kvs.size());<a name="line.4273"></a>
-<span class="sourceLineNo">4274</span>    Cell kv = kvs.get(0);<a name="line.4274"></a>
-<span class="sourceLineNo">4275</span>    assertEquals(expected, Bytes.toLong(kv.getValueArray(), kv.getValueOffset()));<a name="line.4275"></a>
-<span class="sourceLineNo">4276</span>  }<a name="line.4276"></a>
-<span class="sourceLineNo">4277</span><a name="line.4277"></a>
-<span class="sourceLineNo">4278</span>  /**<a name="line.4278"></a>
-<span class="sourceLineNo">4279</span>   * TestCase for append<a name="line.4279"></a>
-<span class="sourceLineNo">4280</span>   */<a name="line.4280"></a>
-<span class="sourceLineNo">4281</span>  private static class Appender implements Runnable {<a name="line.4281"></a>
-<span class="sourceLineNo">4282</span>    private HRegion region;<a name="line.4282"></a>
-<span class="sourceLineNo">4283</span>    private final static byte[] appendRow = Bytes.toBytes("appendRow");<a name="line.4283"></a>
-<span class="sourceLineNo">4284</span>    private final static byte[] family = Bytes.toBytes("family");<a name="line.4284"></a>
-<span class="sourceLineNo">4285</span>    private final static byte[] qualifier = Bytes.toBytes("qualifier");<a name="line.4285"></a>
-<span class="sourceLineNo">4286</span>    private final static byte[] CHAR = Bytes.toBytes("a");<a name="line.4286"></a>
-<span class="sourceLineNo">4287</span>    private int appendCounter;<a name="line.4287"></a>
-<span class="sourceLineNo">4288</span><a name="line.4288"></a>
-<span class="sourceLineNo">4289</span>    public Appender(HRegion region, int appendCounter) {<a name="line.4289"></a>
-<span class="sourceLineNo">4290</span>      this.region = region;<a name="line.4290"></a>
-<span class="sourceLineNo">4291</span>      this.appendCounter = appendCounter;<a name="line.4291"></a>
-<span class="sourceLineNo">4292</span>    }<a name="line.4292"></a>
-<span class="sourceLineNo">4293</span><a name="line.4293"></a>
-<span class="sourceLineNo">4294</span>    @Override<a name="line.4294"></a>
-<span class="sourceLineNo">4295</span>    public void run() {<a name="line.4295"></a>
-<span class="sourceLineNo">4296</span>      int count = 0;<a name="line.4296"></a>
-<span class="sourceLineNo">4297</span>      while (count &lt; appendCounter) {<a name="line.4297"></a>
-<span class="sourceLineNo">4298</span>        Append app = new Append(appendRow);<a name="line.4298"></a>
-<span class="sourceLineNo">4299</span>        app.addColumn(family, qualifier, CHAR);<a name="line.4299"></a>
-<span class="sourceLineNo">4300</span>        count++;<a name="line.4300"></a>
-<span class="sourceLineNo">4301</span>        try {<a name="line.4301"></a>
-<span class="sourceLineNo">4302</span>          region.append(app);<a name="line.4302"></a>
-<span class="sourceLineNo">4303</span>        } catch (IOException e) {<a name="line.4303"></a>
-<span class="sourceLineNo">4304</span>          LOG.info("Count=" + count + ", max=" + appendCounter + ", " + e);<a name="line.4304"></a>
-<span class="sourceLineNo">4305</span>          break;<a name="line.4305"></a>
-<span class="sourceLineNo">4306</span>        }<a name="line.4306"></a>
-<span class="sourceLineNo">4307</span>      }<a name="line.4307"></a>
-<span class="sourceLineNo">4308</span>    }<a name="line.4308"></a>
-<span class="sourceLineNo">4309</span>  }<a name="line.4309"></a>
-<span class="sourceLineNo">4310</span><a name="line.4310"></a>
-<span class="sourceLineNo">4311</span>  /**<a name="line.4311"></a>
-<span class="sourceLineNo">4312</span>   * Test case to check append function with memstore flushing<a name="line.4312"></a>
-<span class="sourceLineNo">4313</span>   * @throws Exception<a name="line.4313"></a>
-<span class="sourceLineNo">4314</span>   */<a name="line.4314"></a>
-<span class="sourceLineNo">4315</span>  @Test<a name="line.4315"></a>
-<span class="sourceLineNo">4316</span>  public void testParallelAppendWithMemStoreFlush() throws Exception {<a name="line.4316"></a>
-<span class="sourceLineNo">4317</span>    byte[] family = Appender.family;<a name="line.4317"></a>
-<span class="sourceLineNo">4318</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.4318"></a>
-<span class="sourceLineNo">4319</span>    final HRegion region = this.region;<a name="line.4319"></a>
-<span class="sourceLineNo">4320</span>    final AtomicBoolean appendDone = new AtomicBoolean(false);<a name="line.4320"></a>
-<span class="sourceLineNo">4321</span>    Runnable flusher = new Runnable() {<a name="line.4321"></a>
-<span class="sourceLineNo">4322</span>      @Override<a name="line.4322"></a>
-<span class="sourceLineNo">4323</span>      public void run() {<a name="line.4323"></a>
-<span class="sourceLineNo">4324</span>        while (!appendDone.get()) {<a name="line.4324"></a>
-<span class="sourceLineNo">4325</span>          try {<a name="line.4325"></a>
-<span class="sourceLineNo">4326</span>            region.flush(true);<a name="line.4326"></a>
-<span class="sourceLineNo">4327</span>          } catch (Exception e) {<a name="line.4327"></a>
-<span class="sourceLineNo">4328</span>            e.printStackTrace();<a name="line.4328"></a>
-<span class="sourceLineNo">4329</span>          }<a name="line.4329"></a>
-<span class="sourceLineNo">4330</span>        }<a name="line.4330"></a>
-<span class="sourceLineNo">4331</span>      }<a name="line.4331"></a>
-<span class="sourceLineNo">4332</span>    };<a name="line.4332"></a>
-<span class="sourceLineNo">4333</span><a name="line.4333"></a>
-<span class="sourceLineNo">4334</span>    // After all append finished, the value will append to threadNum *<a name="line.4334"></a>
-<span class="sourceLineNo">4335</span>    // appendCounter Appender.CHAR<a name="line.4335"></a>
-<span class="sourceLineNo">4336</span>    int threadNum = 20;<a name="line.4336"></a>
-<span class="sourceLineNo">4337</span>    int appendCounter = 100;<a name="line.4337"></a>
-<span class="sourceLineNo">4338</span>    byte[] expected = new byte[threadNum * appendCounter];<a name="line.4338"></a>
-<span class="sourceLineNo">4339</span>    for (int i = 0; i &lt; threadNum * appendCounter; i++) {<a name="line.4339"></a>
-<span class="sourceLineNo">4340</span>      System.arraycopy(Appender.CHAR, 0, expected, i, 1);<a name="line.4340"></a>
-<span class="sourceLineNo">4341</span>    }<a name="line.4341"></a>
-<span class="sourceLineNo">4342</span>    Thread[] appenders = new Thread[threadNum];<a name="line.4342"></a>
-<span class="sourceLineNo">4343</span>    Thread flushThread = new Thread(flusher);<a name="line.4343"></a>
-<span class="sourceLineNo">4344</span>    for (int i = 0; i &lt; threadNum; i++) {<a name="line.4344"></a>
-<span class="sourceLineNo">4345</span>      appenders[i] = new Thread(new Appender(this.region, appendCounter));<a name="line.4345"></a>
-<span class="sourceLineNo">4346</span>      appenders[i].start();<a name="line.4346"></a>
-<span class="sourceLineNo">4347</span>    }<a name="line.4347"></a>
-<span class="sourceLineNo">4348</span>    flushThread.start();<a name="line.4348"></a>
-<span class="sourceLineNo">4349</span>    for (int i = 0; i &lt; threadNum; i++) {<a name="line.4349"></a>
-<span class="sourceLineNo">4350</span>      appenders[i].join();<a name="line.4350"></a>
+<span class="sourceLineNo">4185</span>    // Remove the .regioninfo file and verify is recreated on region open<a name="line.4185"></a>
+<span class="sourceLineNo">4186</span>    fs.delete(regionInfoFile, true);<a name="line.4186"></a>
+<span class="sourceLineNo">4187</span>    assertFalse(HRegionFileSystem.REGION_INFO_FILE + " should be removed from the region dir",<a name="line.4187"></a>
+<span class="sourceLineNo">4188</span>        fs.exists(regionInfoFile));<a name="line.4188"></a>
+<span class="sourceLineNo">4189</span><a name="line.4189"></a>
+<span class="sourceLineNo">4190</span>    region = HRegion.openHRegion(rootDir, hri, htd, null, CONF);<a name="line.4190"></a>
+<span class="sourceLineNo">4191</span>//    region = TEST_UTIL.openHRegion(hri, htd);<a name="line.4191"></a>
+<span class="sourceLineNo">4192</span>    assertEquals(regionDir, region.getRegionFileSystem().getRegionDir());<a name="line.4192"></a>
+<span class="sourceLineNo">4193</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.4193"></a>
+<span class="sourceLineNo">4194</span><a name="line.4194"></a>
+<span class="sourceLineNo">4195</span>    // Verify that the .regioninfo file is still there<a name="line.4195"></a>
+<span class="sourceLineNo">4196</span>    assertTrue(HRegionFileSystem.REGION_INFO_FILE + " should be present in the region dir",<a name="line.4196"></a>
+<span class="sourceLineNo">4197</span>        fs.exists(new Path(regionDir, HRegionFileSystem.REGION_INFO_FILE)));<a name="line.4197"></a>
+<span class="sourceLineNo">4198</span><a name="line.4198"></a>
+<span class="sourceLineNo">4199</span>    region = null;<a name="line.4199"></a>
+<span class="sourceLineNo">4200</span>  }<a name="line.4200"></a>
+<span class="sourceLineNo">4201</span><a name="line.4201"></a>
+<span class="sourceLineNo">4202</span>  /**<a name="line.4202"></a>
+<span class="sourceLineNo">4203</span>   * TestCase for increment<a name="line.4203"></a>
+<span class="sourceLineNo">4204</span>   */<a name="line.4204"></a>
+<span class="sourceLineNo">4205</span>  private static class Incrementer implements Runnable {<a name="line.4205"></a>
+<span class="sourceLineNo">4206</span>    private HRegion region;<a name="line.4206"></a>
+<span class="sourceLineNo">4207</span>    private final static byte[] incRow = Bytes.toBytes("incRow");<a name="line.4207"></a>
+<span class="sourceLineNo">4208</span>    private final static byte[] family = Bytes.toBytes("family");<a name="line.4208"></a>
+<span class="sourceLineNo">4209</span>    private final static byte[] qualifier = Bytes.toBytes("qualifier");<a name="line.4209"></a>
+<span class="sourceLineNo">4210</span>    private final static long ONE = 1L;<a name="line.4210"></a>
+<span class="sourceLineNo">4211</span>    private int incCounter;<a name="line.4211"></a>
+<span class="sourceLineNo">4212</span><a name="line.4212"></a>
+<span class="sourceLineNo">4213</span>    public Incrementer(HRegion region, int incCounter) {<a name="line.4213"></a>
+<span class="sourceLineNo">4214</span>      this.region = region;<a name="line.4214"></a>
+<span class="sourceLineNo">4215</span>      this.incCounter = incCounter;<a name="line.4215"></a>
+<span class="sourceLineNo">4216</span>    }<a name="line.4216"></a>
+<span class="sourceLineNo">4217</span><a name="line.4217"></a>
+<span class="sourceLineNo">4218</span>    @Override<a name="line.4218"></a>
+<span class="sourceLineNo">4219</span>    public void run() {<a name="line.4219"></a>
+<span class="sourceLineNo">4220</span>      int count = 0;<a name="line.4220"></a>
+<span class="sourceLineNo">4221</span>      while (count &lt; incCounter) {<a name="line.4221"></a>
+<span class="sourceLineNo">4222</span>        Increment inc = new Increment(incRow);<a name="line.4222"></a>
+<span class="sourceLineNo">4223</span>        inc.addColumn(family, qualifier, ONE);<a name="line.4223"></a>
+<span class="sourceLineNo">4224</span>        count++;<a name="line.4224"></a>
+<span class="sourceLineNo">4225</span>        try {<a name="line.4225"></a>
+<span class="sourceLineNo">4226</span>          region.increment(inc);<a name="line.4226"></a>
+<span class="sourceLineNo">4227</span>        } catch (IOException e) {<a name="line.4227"></a>
+<span class="sourceLineNo">4228</span>          LOG.info("Count=" + count + ", " + e);<a name="line.4228"></a>
+<span class="sourceLineNo">4229</span>          break;<a name="line.4229"></a>
+<span class="sourceLineNo">4230</span>        }<a name="line.4230"></a>
+<span class="sourceLineNo">4231</span>      }<a name="line.4231"></a>
+<span class="sourceLineNo">4232</span>    }<a name="line.4232"></a>
+<span class="sourceLineNo">4233</span>  }<a name="line.4233"></a>
+<span class="sourceLineNo">4234</span><a name="line.4234"></a>
+<span class="sourceLineNo">4235</span>  /**<a name="line.4235"></a>
+<span class="sourceLineNo">4236</span>   * Test case to check increment function with memstore flushing<a name="line.4236"></a>
+<span class="sourceLineNo">4237</span>   * @throws Exception<a name="line.4237"></a>
+<span class="sourceLineNo">4238</span>   */<a name="line.4238"></a>
+<span class="sourceLineNo">4239</span>  @Test<a name="line.4239"></a>
+<span class="sourceLineNo">4240</span>  public void testParallelIncrementWithMemStoreFlush() throws Exception {<a name="line.4240"></a>
+<span class="sourceLineNo">4241</span>    byte[] family = Incrementer.family;<a name="line.4241"></a>
+<span class="sourceLineNo">4242</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.4242"></a>
+<span class="sourceLineNo">4243</span>    final HRegion region = this.region;<a name="line.4243"></a>
+<span class="sourceLineNo">4244</span>    final AtomicBoolean incrementDone = new AtomicBoolean(false);<a name="line.4244"></a>
+<span class="sourceLineNo">4245</span>    Runnable flusher = new Runnable() {<a name="line.4245"></a>
+<span class="sourceLineNo">4246</span>      @Override<a name="line.4246"></a>
+<span class="sourceLineNo">4247</span>      public void run() {<a name="line.4247"></a>
+<span class="sourceLineNo">4248</span>        while (!incrementDone.get()) {<a name="line.4248"></a>
+<span class="sourceLineNo">4249</span>          try {<a name="line.4249"></a>
+<span class="sourceLineNo">4250</span>            region.flush(true);<a name="line.4250"></a>
+<span class="sourceLineNo">4251</span>          } catch (Exception e) {<a name="line.4251"></a>
+<span class="sourceLineNo">4252</span>            e.printStackTrace();<a name="line.4252"></a>
+<span class="sourceLineNo">4253</span>          }<a name="line.4253"></a>
+<span class="sourceLineNo">4254</span>        }<a name="line.4254"></a>
+<span class="sourceLineNo">4255</span>      }<a name="line.4255"></a>
+<span class="sourceLineNo">4256</span>    };<a name="line.4256"></a>
+<span class="sourceLineNo">4257</span><a name="line.4257"></a>
+<span class="sourceLineNo">4258</span>    // after all increment finished, the row will increment to 20*100 = 2000<a name="line.4258"></a>
+<span class="sourceLineNo">4259</span>    int threadNum = 20;<a name="line.4259"></a>
+<span class="sourceLineNo">4260</span>    int incCounter = 100;<a name="line.4260"></a>
+<span class="sourceLineNo">4261</span>    long expected = (long) threadNum * incCounter;<a name="line.4261"></a>
+<span class="sourceLineNo">4262</span>    Thread[] incrementers = new Thread[threadNum];<a name="line.4262"></a>
+<span class="sourceLineNo">4263</span>    Thread flushThread = new Thread(flusher);<a name="line.4263"></a>
+<span class="sourceLineNo">4264</span>    for (int i = 0; i &lt; threadNum; i++) {<a name="line.4264"></a>
+<span class="sourceLineNo">4265</span>      incrementers[i] = new Thread(new Incrementer(this.region, incCounter));<a name="line.4265"></a>
+<span class="sourceLineNo">4266</span>      incrementers[i].start();<a name="line.4266"></a>
+<span class="sourceLineNo">4267</span>    }<a name="line.4267"></a>
+<span class="sourceLineNo">4268</span>    flushThread.start();<a name="line.4268"></a>
+<span class="sourceLineNo">4269</span>    for (int i = 0; i &lt; threadNum; i++) {<a name="line.4269"></a>
+<span class="sourceLineNo">4270</span>      incrementers[i].join();<a name="line.4270"></a>
+<span class="sourceLineNo">4271</span>    }<a name="line.4271"></a>
+<span class="sourceLineNo">4272</span><a name="line.4272"></a>
+<span class="sourceLineNo">4273</span>    incrementDone.set(true);<a name="line.4273"></a>
+<span class="sourceLineNo">4274</span>    flushThread.join();<a name="line.4274"></a>
+<span class="sourceLineNo">4275</span><a name="line.4275"></a>
+<span class="sourceLineNo">4276</span>    Get get = new Get(Incrementer.incRow);<a name="line.4276"></a>
+<span class="sourceLineNo">4277</span>    get.addColumn(Incrementer.family, Incrementer.qualifier);<a name="line.4277"></a>
+<span class="sourceLineNo">4278</span>    get.readVersions(1);<a name="line.4278"></a>
+<span class="sourceLineNo">4279</span>    Result res = this.region.get(get);<a name="line.4279"></a>
+<span class="sourceLineNo">4280</span>    List&lt;Cell&gt; kvs = res.getColumnCells(Incrementer.family, Incrementer.qualifier);<a name="line.4280"></a>
+<span class="sourceLineNo">4281</span><a name="line.4281"></a>
+<span class="sourceLineNo">4282</span>    // we just got the latest version<a name="line.4282"></a>
+<span class="sourceLineNo">4283</span>    assertEquals(1, kvs.size());<a name="line.4283"></a>
+<span class="sourceLineNo">4284</span>    Cell kv = kvs.get(0);<a name="line.4284"></a>
+<span class="sourceLineNo">4285</span>    assertEquals(expected, Bytes.toLong(kv.getValueArray(), kv.getValueOffset()));<a name="line.4285"></a>
+<span class="sourceLineNo">4286</span>  }<a name="line.4286"></a>
+<span class="sourceLineNo">4287</span><a name="line.4287"></a>
+<span class="sourceLineNo">4288</span>  /**<a name="line.4288"></a>
+<span class="sourceLineNo">4289</span>   * TestCase for append<a name="line.4289"></a>
+<span class="sourceLineNo">4290</span>   */<a name="line.4290"></a>
+<span class="sourceLineNo">4291</span>  private static class Appender implements Runnable {<a name="line.4291"></a>
+<span class="sourceLineNo">4292</span>    private HRegion region;<a name="line.4292"></a>
+<span class="sourceLineNo">4293</span>    private final static byte[] appendRow = Bytes.toBytes("appendRow");<a name="line.4293"></a>
+<span class="sourceLineNo">4294</span>    private final static byte[] family = Bytes.toBytes("family");<a name="line.4294"></a>
+<span class="sourceLineNo">4295</span>    private final static byte[] qualifier = Bytes.toBytes("qualifier");<a name="line.4295"></a>
+<span class="sourceLineNo">4296</span>    private final static byte[] CHAR = Bytes.toBytes("a");<a name="line.4296"></a>
+<span class="sourceLineNo">4297</span>    private int appendCounter;<a name="line.4297"></a>
+<span class="sourceLineNo">4298</span><a name="line.4298"></a>
+<span class="sourceLineNo">4299</span>    public Appender(HRegion region, int appendCounter) {<a name="line.4299"></a>
+<span class="sourceLineNo">4300</span>      this.region = region;<a name="line.4300"></a>
+<span class="sourceLineNo">4301</span>      this.appendCounter = appendCounter;<a name="line.4301"></a>
+<span class="sourceLineNo">4302</span>    }<a name="line.4302"></a>
+<span class="sourceLineNo">4303</span><a name="line.4303"></a>
+<span class="sourceLineNo">4304</span>    @Override<a name="line.4304"></a>
+<span class="sourceLineNo">4305</span>    public void run() {<a name="line.4305"></a>
+<span class="sourceLineNo">4306</span>      int count = 0;<a name="line.4306"></a>
+<span class="sourceLineNo">4307</span>      while (count &lt; appendCounter) {<a name="line.4307"></a>
+<span class="sourceLineNo">4308</span>        Append app = new Append(appendRow);<a name="line.4308"></a>
+<span class="sourceLineNo">4309</span>        app.addColumn(family, qualifier, CHAR);<a name="line.4309"></a>
+<span class="sourceLineNo">4310</span>        count++;<a name="line.4310"></a>
+<span class="sourceLineNo">4311</span>        try {<a name="line.4311"></a>
+<span class="sourceLineNo">4312</span>          region.append(app);<a name="line.4312"></a>
+<span class="sourceLineNo">4313</span>        } catch (IOException e) {<a name="line.4313"></a>
+<span class="sourceLineNo">4314</span>          LOG.info("Count=" + count + ", max=" + appendCounter + ", " + e);<a name="line.4314"></a>
+<span class="sourceLineNo">4315</span>          break;<a name="line.4315"></a>
+<span class="sourceLineNo">4316</span>        }<a name="line.4316"></a>
+<span class="sourceLineNo">4317</span>      }<a name="line.4317"></a>
+<span class="sourceLineNo">4318</span>    }<a name="line.4318"></a>
+<span class="sourceLineNo">4319</span>  }<a name="line.4319"></a>
+<span class="sourceLineNo">4320</span><a name="line.4320"></a>
+<span class="sourceLineNo">4321</span>  /**<a name="line.4321"></a>
+<span class="sourceLineNo">4322</span>   * Test case to check append function with memstore flushing<a name="line.4322"></a>
+<span class="sourceLineNo">4323</span>   * @throws Exception<a name="line.4323"></a>
+<span class="sourceLineNo">4324</span>   */<a name="line.4324"></a>
+<span class="sourceLineNo">4325</span>  @Test<a name="line.4325"></a>
+<span class="sourceLineNo">4326</span>  public void testParallelAppendWithMemStoreFlush() throws Exception {<a name="line.4326"></a>
+<span class="sourceLineNo">4327</span>    byte[] family = Appender.family;<a name="line.4327"></a>
+<span class="sourceLineNo">4328</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.4328"></a>
+<span class="sourceLineNo">4329</span>    final HRegion region = this.region;<a name="line.4329"></a>
+<span class="sourceLineNo">4330</span>    final AtomicBoolean appendDone = new AtomicBoolean(false);<a name="line.4330"></a>
+<span class="sourceLineNo">4331</span>    Runnable flusher = new Runnable() {<a name="line.4331"></a>
+<span class="sourceLineNo">4332</span>      @Override<a name="line.4332"></a>
+<span class="sourceLineNo">4333</span>      public void run() {<a name="line.4333"></a>
+<span class="sourceLineNo">4334</span>        while (!appendDone.get()) {<a name="line.4334"></a>
+<span class="sourceLineNo">4335</span>          try {<a name="line.4335"></a>
+<span class="sourceLineNo">4336</span>            region.flush(true);<a name="line.4336"></a>
+<span class="sourceLineNo">4337</span>          } catch (Exception e) {<a name="line.4337"></a>
+<span class="sourceLineNo">4338</span>            e.printStackTrace();<a name="line.4338"></a>
+<span class="sourceLineNo">4339</span>          }<a name="line.4339"></a>
+<span class="sourceLineNo">4340</span>        }<a name="line.4340"></a>
+<span class="sourceLineNo">4341</span>      }<a name="line.4341"></a>
+<span class="sourceLineNo">4342</span>    };<a name="line.4342"></a>
+<span class="sourceLineNo">4343</span><a name="line.4343"></a>
+<span class="sourceLineNo">4344</span>    // After all append finished, the value will append to threadNum *<a name="line.4344"></a>
+<span class="sourceLineNo">4345</span>    // appendCounter Appender.CHAR<a name="line.4345"></a>
+<span class="sourceLineNo">4346</span>    int threadNum = 20;<a name="line.4346"></a>
+<span class="sourceLineNo">4347</span>    int appendCounter = 100;<a name="line.4347"></a>
+<span class="sourceLineNo">4348</span>    byte[] expected = new byte[threadNum * appendCounter];<a name="line.4348"></a>
+<span class="sourceLineNo">4349</span>    for (int i = 0; i &lt; threadNum * appendCounter; i++) {<a name="line.4349"></a>
+<span class="sourceLineNo">4350</span>      System.arraycopy(Appender.CHAR, 0, expected, i, 1);<a name="line.4350"></a>
 <span class="sourceLineNo">4351</span>    }<a name="line.4351"></a>
-<span class="sourceLineNo">4352</span><a name="line.4352"></a>
-<span class="sourceLineNo">4353</span>    appendDone.set(true);<a name="line.4353"></a>
-<span class="sourceLineNo">4354</span>    flushThread.join();<a name="line.4354"></a>
-<span class="sourceLineNo">4355</span><a name="line.4355"></a>
-<span class="sourceLineNo">4356</span>    Get get = new Get(Appender.appendRow);<a name="line.4356"></a>
-<span class="sourceLineNo">4357</span>    get.addColumn(Appender.family, Appender.qualifier);<a name="line.4357"></a>
-<span class="sourceLineNo">4358</span>    get.readVersions(1);<a name="line.4358"></a>
-<span class="sourceLineNo">4359</span>    Result res = this.region.get(get);<a name="line.4359"></a>
-<span class="sourceLineNo">4360</span>    List&lt;Cell&gt; kvs = res.getColumnCells(Appender.family, Appender.qualifier);<a name="line.4360"></a>
-<span class="sourceLineNo">4361</span><a name="line.4361"></a>
-<span class="sourceLineNo">4362</span>    // we just got the latest version<a name="line.4362"></a>
-<span class="sourceLineNo">4363</span>    assertEquals(1, kvs.size());<a name="line.4363"></a>
-<span class="sourceLineNo">4364</span>    Cell kv = kvs.get(0);<a name="line.4364"></a>
-<span class="sourceLineNo">4365</span>    byte[] appendResult = new byte[kv.getValueLength()];<a name="line.4365"></a>
-<span class="sourceLineNo">4366</span>    System.arraycopy(kv.getValueArray(), kv.getValueOffset(), appendResult, 0, kv.getValueLength());<a name="line.4366"></a>
-<span class="sourceLineNo">4367</span>    assertArrayEquals(expected, appendResult);<a name="line.4367"></a>
-<span class="sourceLineNo">4368</span>  }<a name="line.4368"></a>
-<span class="sourceLineNo">4369</span><a name="line.4369"></a>
-<span class="sourceLineNo">4370</span>  /**<a name="line.4370"></a>
-<span class="sourceLineNo">4371</span>   * Test case to check put function with memstore flushing for same row, same ts<a name="line.4371"></a>
-<span class="sourceLineNo">4372</span>   * @throws Exception<a name="line.4372"></a>
-<span class="sourceLineNo">4373</span>   */<a name="line.4373"></a>
-<span class="sourceLineNo">4374</span>  @Test<a name="line.4374"></a>
-<span class="sourceLineNo">4375</span>  public void testPutWithMemStoreFlush() throws Exception {<a name="line.4375"></a>
-<span class="sourceLineNo">4376</span>    byte[] family = Bytes.toBytes("family");<a name="line.4376"></a>
-<span class="sourceLineNo">4377</span>    byte[] qualifier = Bytes.toBytes("qualifier");<a name="line.4377"></a>
-<span class="sourceLineNo">4378</span>    byte[] row = Bytes.toBytes("putRow");<a name="line.4378"></a>
-<span class="sourceLineNo">4379</span>    byte[] value = null;<a name="line.4379"></a>
-<span class="sourceLineNo">4380</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.4380"></a>
-<span class="sourceLineNo">4381</span>    Put put = null;<a name="line.4381"></a>
-<span class="sourceLineNo">4382</span>    Get get = null;<a name="line.4382"></a>
-<span class="sourceLineNo">4383</span>    List&lt;Cell&gt; kvs = null;<a name="line.4383"></a>
-<span class="sourceLineNo">4384</span>    Result res = null;<a name="line.4384"></a>
-<span class="sourceLineNo">4385</span><a name="line.4385"></a>
-<span class="sourceLineNo">4386</span>    put = new Put(row);<a name="line.4386"></a>
-<span class="sourceLineNo">4387</span>    value = Bytes.toBytes("value0");<a name="line.4387"></a>
-<span class="sourceLineNo">4388</span>    put.addColumn(family, qualifier, 1234567L, value);<a name="line.4388"></a>
-<span class="sourceLineNo">4389</span>    region.put(put);<a name="line.4389"></a>
-<span class="sourceLineNo">4390</span>    get = new Get(row);<a name="line.4390"></a>
-<span class="sourceLineNo">4391</span>    get.addColumn(family, qualifier);<a name="line.4391"></a>
-<span class="sourceLineNo">4392</span>    get.readAllVersions();<a name="line.4392"></a>
-<span class="sourceLineNo">4393</span>    res = this.region.get(get);<a name="line.4393"></a>
-<span class="sourceLineNo">4394</span>    kvs = res.getColumnCells(family, qualifier);<a name="line.4394"></a>
-<span class="sourceLineNo">4395</span>    assertEquals(1, kvs.size());<a name="line.4395"></a>
-<span class="sourceLineNo">4396</span>    assertArrayEquals(Bytes.toBytes("value0"), CellUtil.cloneValue(kvs.get(0)));<a name="line.4396"></a>
-<span class="sourceLineNo">4397</span><a name="line.4397"></a>
-<span class="sourceLineNo">4398</span>    region.flush(true);<a name="line.4398"></a>
-<span class="sourceLineNo">4399</span>    get = new Get(row);<a name="line.4399"></a>
-<span class="sourceLineNo">4400</span>    get.addColumn(family, qualifier);<a name="line.4400"></a>
-<span class="sourceLineNo">4401</span>    get.readAllVersions();<a name="line.4401"></a>
-<span class="sourceLineNo">4402</span>    res = this.region.get(get);<a name="line.4402"></a>
-<span class="sourceLineNo">4403</span>    kvs = res.getColumnCells(family, qualifier);<a name="line.4403"></a>
-<span class="sourceLineNo">4404</span>    assertEquals(1, kvs.size());<a name="line.4404"></a>
-<span class="sourceLineNo">4405</span>    assertArrayEquals(Bytes.toBytes("value0"), CellUtil.cloneValue(kvs.get(0)));<a name="line.4405"></a>
-<span class="sourceLineNo">4406</span><a name="line.4406"></a>
-<span class="sourceLineNo">4407</span>    put = new Put(row);<a name="line.4407"></a>
-<span class="sourceLineNo">4408</span>    value = Bytes.toBytes("value1");<a name="line.4408"></a>
-<span class="sourceLineNo">4409</span>    put.addColumn(family, qualifier, 1234567L, value);<a name="line.4409"></a>
-<span class="sourceLineNo">4410</span>    region.put(put);<a name="line.4410"></a>
-<span class="sourceLineNo">4411</span>    get = new Get(row);<a name="line.4411"></a>
-<span class="sourceLineNo">4412</span>    get.addColumn(family, qualifier);<a name="line.4412"></a>
-<span class="sourceLineNo">4413</span>    get.readAllVersions();<a name="line.4413"></a>
-<span class="sourceLineNo">4414</span>    res = this.region.get(get);<a name="line.4414"></a>
-<span class="sourceLineNo">4415</span>    kvs = res.getColumnCells(family, qualifier);<a name="line.4415"></a>
-<span class="sourceLineNo">4416</span>    assertEquals(1, kvs.size());<a name="line.4416"></a>
-<span class="sourceLineNo">4417</span>    assertArrayEquals(Bytes.toBytes("value1"), CellUtil.cloneValue(kvs.get(0)));<a name="line.4417"></a>
-<span class="sourceLineNo">4418</span><a name="line.4418"></a>
-<span class="sourceLineNo">4419</span>    region.flush(true);<a name="line.4419"></a>
-<span class="sourceLineNo">4420</span>    get = new Get(row);<a name="line.4420"></a>
-<span class="sourceLineNo">4421</span>    get.addColumn(family, qualifier);<a name="line.4421"></a>
-<span class="sourceLineNo">4422</span>    get.readAllVersions();<a name="line.4422"></a>
-<span class="sourceLineNo">4423</span>    res = this.region.get(get);<a name="line.4423"></a>
-<span class="sourceLineNo">4424</span>    kvs = res.getColumnCells(family, qualifier);<a name="line.4424"></a>
-<span class="sourceLineNo">4425</span>    assertEquals(1, kvs.size());<a name="line.4425"></a>
-<span class="sourceLineNo">4426</span>    assertArrayEquals(Bytes.toBytes("value1"), CellUtil.cloneValue(kvs.get(0)));<a name="line.4426"></a>
-<span class="sourceLineNo">4427</span>  }<a name="line.4427"></a>
+<span class="sourceLineNo">4352</span>    Thread[] appenders = new Thread[threadNum];<a name="line.4352"></a>
+<span class="sourceLineNo">4353</span>    Thread flushThread = new Thread(flusher);<a name="line.4353"></a>
+<span class="sourceLineNo">4354</span>    for (int i = 0; i &lt; threadNum; i++) {<a name="line.4354"></a>
+<span class="sourceLineNo">4355</span>      appenders[i] = new Thread(new Appender(this.region, appendCounter));<a name="line.4355"></a>
+<span class="sourceLineNo">4356</span>      appenders[i].start();<a name="line.4356"></a>
+<span class="sourceLineNo">4357</span>    }<a name="line.4357"></a>
+<span class="sourceLineNo">4358</span>    flushThread.start();<a name="line.4358"></a>
+<span class="sourceLineNo">4359</span>    for (int i = 0; i &lt; threadNum; i++) {<a name="line.4359"></a>
+<span class="sourceLineNo">4360</span>      appenders[i].join();<a name="line.4360"></a>
+<span class="sourceLineNo">4361</span>    }<a name="line.4361"></a>
+<span class="sourceLineNo">4362</span><a name="line.4362"></a>
+<span class="sourceLineNo">4363</span>    appendDone.set(true);<a name="line.4363"></a>
+<span class="sourceLineNo">4364</span>    flushThread.join();<a name="line.4364"></a>
+<span class="sourceLineNo">4365</span><a name="line.4365"></a>
+<span class="sourceLineNo">4366</span>    Get get = new Get(Appender.appendRow);<a name="line.4366"></a>
+<span class="sourceLineNo">4367</span>    get.addColumn(Appender.family, Appender.qualifier);<a name="line.4367"></a>
+<span class="sourceLineNo">4368</span>    get.readVersions(1);<a name="line.4368"></a>
+<span class="sourceLineNo">4369</span>    Result res = this.region.get(get);<a name="line.4369"></a>
+<span class="sourceLineNo">4370</span>    List&lt;Cell&gt; kvs = res.getColumnCells(Appender.family, Appender.qualifier);<a name="line.4370"></a>
+<span class="sourceLineNo">4371</span><a name="line.4371"></a>
+<span class="sourceLineNo">4372</span>    // we just got the latest version<a name="line.4372"></a>
+<span class="sourceLineNo">4373</span>    assertEquals(1, kvs.size());<a name="line.4373"></a>
+<span class="sourceLineNo">4374</span>    Cell kv = kvs.get(0);<a name="line.4374"></a>
+<span class="sourceLineNo">4375</span>    byte[] appendResult = new byte[kv.getValueLength()];<a name="line.4375"></a>
+<span class="sourceLineNo">4376</span>    System.arraycopy(kv.getValueArray(), kv.getValueOffset(), appendResult, 0, kv.getValueLength());<a name="line.4376"></a>
+<span class="sourceLineNo">4377</span>    assertArrayEquals(expected, appendResult);<a name="line.4377"></a>
+<span class="sourceLineNo">4378</span>  }<a name="line.4378"></a>
+<span class="sourceLineNo">4379</span><a name="line.4379"></a>
+<span class="sourceLineNo">4380</span>  /**<a name="line.4380"></a>
+<span class="sourceLineNo">4381</span>   * Test case to check put function with memstore flushing for same row, same ts<a name="line.4381"></a>
+<span class="sourceLineNo">4382</span>   * @throws Exception<a name="line.4382"></a>
+<span class="sourceLineNo">4383</span>   */<a name="line.4383"></a>
+<span class="sourceLineNo">4384</span>  @Test<a name="line.4384"></a>
+<span class="sourceLineNo">4385</span>  public void testPutWithMemStoreFlush() throws Exception {<a name="line.4385"></a>
+<span class="sourceLineNo">4386</span>    byte[] family = Bytes.toBytes("family");<a name="line.4386"></a>
+<span class="sourceLineNo">4387</span>    byte[] qualifier = Bytes.toBytes("qualifier");<a name="line.4387"></a>
+<span class="sourceLineNo">4388</span>    byte[] row = Bytes.toBytes("putRow");<a name="line.4388"></a>
+<span class="sourceLineNo">4389</span>    byte[] value = null;<a name="line.4389"></a>
+<span class="sourceLineNo">4390</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.4390"></a>
+<span class="sourceLineNo">4391</span>    Put put = null;<a name="line.4391"></a>
+<span class="sourceLineNo">4392</span>    Get get = null;<a name="line.4392"></a>
+<span class="sourceLineNo">4393</span>    List&lt;Cell&gt; kvs = null;<a name="line.4393"></a>
+<span class="sourceLineNo">4394</span>    Result res = null;<a name="line.4394"></a>
+<span class="sourceLineNo">4395</span><a name="line.4395"></a>
+<span class="sourceLineNo">4396</span>    put = new Put(row);<a name="line.4396"></a>
+<span class="sourceLineNo">4397</span>    value = Bytes.toBytes("value0");<a name="line.4397"></a>
+<span class="sourceLineNo">4398</span>    put.addColumn(family, qualifier, 1234567L, value);<a name="line.4398"></a>
+<span class="sourceLineNo">4399</span>    region.put(put);<a name="line.4399"></a>
+<span class="sourceLineNo">4400</span>    get = new Get(row);<a name="line.4400"></a>
+<span class="sourceLineNo">4401</span>    get.addColumn(family, qualifier);<a name="line.4401"></a>
+<span class="sourceLineNo">4402</span>    get.readAllVersions();<a name="line.4402"></a>
+<span class="sourceLineNo">4403</span>    res = this.region.get(get);<a name="line.4403"></a>
+<span class="sourceLineNo">4404</span>    kvs = res.getColumnCells(family, qualifier);<a name="line.4404"></a>
+<span class="sourceLineNo">4405</span>    assertEquals(1, kvs.size());<a name="line.4405"></a>
+<span class="sourceLineNo">4406</span>    assertArrayEquals(Bytes.toBytes("value0"), CellUtil.cloneValue(kvs.get(0)));<a name="line.4406"></a>
+<span class="sourceLineNo">4407</span><a name="line.4407"></a>
+<span class="sourceLineNo">4408</span>    region.flush(true);<a name="line.4408"></a>
+<span class="sourceLineNo">4409</span>    get = new Get(row);<a name="line.4409"></a>
+<span class="sourceLineNo">4410</span>    get.addColumn(family, qualifier);<a name="line.4410"></a>
+<span class="sourceLineNo">4411</span>    get.readAllVersions();<a name="line.4411"></a>
+<span class="sourceLineNo">4412</span>    res = this.region.get(get);<a name="line.4412"></a>
+<span class="sourceLineNo">4413</span>    kvs = res.getColumnCells(family, qualifier);<a name="line.4413"></a>
+<span class="sourceLineNo">4414</span>    assertEquals(1, kvs.size());<a name="line.4414"></a>
+<span class="sourceLineNo">4415</span>    assertArrayEquals(Bytes.toBytes("value0"), CellUtil.cloneValue(kvs.get(0)));<a name="line.4415"></a>
+<span class="sourceLineNo">4416</span><a name="line.4416"></a>
+<span class="sourceLineNo">4417</span>    put = new Put(row);<a name="line.4417"></a>
+<span class="sourceLineNo">4418</span>    value = Bytes.toBytes("value1");<a name="line.4418"></a>
+<span class="sourceLineNo">4419</span>    put.addColumn(family, qualifier, 1234567L, value);<a name="line.4419"></a>
+<span class="sourceLineNo">4420</span>    region.put(put);<a name="line.4420"></a>
+<span class="sourceLineNo">4421</span>    get = new Get(row);<a name="line.4421"></a>
+<span class="sourceLineNo">4422</span>    get.addColumn(family, qualifier);<a name="line.4422"></a>
+<span class="sourceLineNo">4423</span>    get.readAllVersions();<a name="line.4423"></a>
+<span class="sourceLineNo">4424</span>    res = this.region.get(get);<a name="line.4424"></a>
+<span class="sourceLineNo">4425</span>    kvs = res.getColumnCells(family, qualifier);<a name="line.4425"></a>
+<span class="sourceLineNo">4426</span>    assertEquals(1, kvs.size());<a name="line.4426"></a>
+<span class="sourceLineNo">4427</span>    assertArrayEquals(Bytes.toBytes("value1"), CellUtil.cloneValue(kvs.get(0)));<a name="line.4427"></a>
 <span class="sourceLineNo">4428</span><a name="line.4428"></a>
-<span class="sourceLineNo">4429</span>  @Test<a name="line.4429"></a>
-<span class="sourceLineNo">4430</span>  public void testDurability() throws Exception {<a name="line.4430"></a>
-<span class="sourceLineNo">4431</span>    // there are 5 x 5 cases:<a name="line.4431"></a>
-<span class="sourceLineNo">4432</span>    // table durability(SYNC,FSYNC,ASYC,SKIP,USE_DEFAULT) x mutation<a name="line.4432"></a>
-<span class="sourceLineNo">4433</span>    // durability(SYNC,FSYNC,ASYC,SKIP,USE_DEFAULT)<a name="line.4433"></a>
-<span class="sourceLineNo">4434</span><a name="line.4434"></a>
-<span class="sourceLineNo">4435</span>    // expected cases for append and sync wal<a name="line.4435"></a>
-<span class="sourceLineNo">4436</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4436"></a>
-<span class="sourceLineNo">4437</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4437"></a>
-<span class="sourceLineNo">4438</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.USE_DEFAULT, 0, true, true, false);<a name="line.4438"></a>
-<span class="sourceLineNo">4439</span><a name="line.4439"></a>
-<span class="sourceLineNo">4440</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4440"></a>
-<span class="sourceLineNo">4441</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4441"></a>
-<span class="sourceLineNo">4442</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.USE_DEFAULT, 0, true, true, false);<a name="line.4442"></a>
-<span class="sourceLineNo">4443</span><a name="line.4443"></a>
-<span class="sourceLineNo">4444</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4444"></a>
-<span class="sourceLineNo">4445</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4445"></a>
-<span class="sourceLineNo">4446</span><a name="line.4446"></a>
-<span class="sourceLineNo">4447</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4447"></a>
-<span class="sourceLineNo">4448</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4448"></a>
+<span class="sourceLineNo">4429</span>    region.flush(true);<a name="line.4429"></a>
+<span class="sourceLineNo">4430</span>    get = new Get(row);<a name="line.4430"></a>
+<span class="sourceLineNo">4431</span>    get.addColumn(family, qualifier);<a name="line.4431"></a>
+<span class="sourceLineNo">4432</span>    get.readAllVersions();<a name="line.4432"></a>
+<span class="sourceLineNo">4433</span>    res = this.region.get(get);<a name="line.4433"></a>
+<span class="sourceLineNo">4434</span>    kvs = res.getColumnCells(family, qualifier);<a name="line.4434"></a>
+<span class="sourceLineNo">4435</span>    assertEquals(1, kvs.size());<a name="line.4435"></a>
+<span class="sourceLineNo">4436</span>    assertArrayEquals(Bytes.toBytes("value1"), CellUtil.cloneValue(kvs.get(0)));<a name="line.4436"></a>
+<span class="sourceLineNo">4437</span>  }<a name="line.4437"></a>
+<span class="sourceLineNo">4438</span><a name="line.4438"></a>
+<span class="sourceLineNo">4439</span>  @Test<a name="line.4439"></a>
+<span class="sourceLineNo">4440</span>  public void testDurability() throws Exception {<a name="line.4440"></a>
+<span class="sourceLineNo">4441</span>    // there are 5 x 5 cases:<a name="line.4441"></a>
+<span class="sourceLineNo">4442</span>    // table durability(SYNC,FSYNC,ASYC,SKIP,USE_DEFAULT) x mutation<a name="line.4442"></a>
+<span class="sourceLineNo">4443</span>    // durability(SYNC,FSYNC,ASYC,SKIP,USE_DEFAULT)<a name="line.4443"></a>
+<span class="sourceLineNo">4444</span><a name="line.4444"></a>
+<span class="sourceLineNo">4445</span>    // expected cases for append and sync wal<a name="line.4445"></a>
+<span class="sourceLineNo">4446</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4446"></a>
+<span class="sourceLineNo">4447</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4447"></a>
+<span class="sourceLineNo">4448</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.USE_DEFAULT, 0, true, true, false);<a name="line.4448"></a>
 <span class="sourceLineNo">4449</span><a name="line.4449"></a>
-<span class="sourceLineNo">4450</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4450"></a>
-<span class="sourceLineNo">4451</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4451"></a>
-<span class="sourceLineNo">4452</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.USE_DEFAULT, 0, true, true, false);<a name="line.4452"></a>
+<span class="sourceLineNo">4450</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4450"></a>
+<span class="sourceLineNo">4451</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4451"></a>
+<span class="sourceLineNo">4452</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.USE_DEFAULT, 0, true, true, false);<a name="line.4452"></a>
 <span class="sourceLineNo">4453</span><a name="line.4453"></a>
-<span class="sourceLineNo">4454</span>    // expected cases for async wal<a name="line.4454"></a>
-<span class="sourceLineNo">4455</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4455"></a>
-<span class="sourceLineNo">4456</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4456"></a>
-<span class="sourceLineNo">4457</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4457"></a>
-<span class="sourceLineNo">4458</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4458"></a>
-<span class="sourceLineNo">4459</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4459"></a>
-<span class="sourceLineNo">4460</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.USE_DEFAULT, 0, true, false, false);<a name="line.4460"></a>
-<span class="sourceLineNo">4461</span><a name="line.4461"></a>
-<span class="sourceLineNo">4462</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4462"></a>
-<span class="sourceLineNo">4463</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4463"></a>
-<span class="sourceLineNo">4464</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4464"></a>
-<span class="sourceLineNo">4465</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4465"></a>
-<span class="sourceLineNo">4466</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4466"></a>
-<span class="sourceLineNo">4467</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.USE_DEFAULT, 5000, true, false, true);<a name="line.4467"></a>
-<span class="sourceLineNo">4468</span><a name="line.4468"></a>
-<span class="sourceLineNo">4469</span>    // expect skip wal cases<a name="line.4469"></a>
-<span class="sourceLineNo">4470</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4470"></a>
-<span class="sourceLineNo">4471</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4471"></a>
-<span class="sourceLineNo">4472</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4472"></a>
-<span class="sourceLineNo">4473</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4473"></a>
-<span class="sourceLineNo">4474</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4474"></a>
-<span class="sourceLineNo">4475</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.USE_DEFAULT, 0, false, false, false);<a name="line.4475"></a>
-<span class="sourceLineNo">4476</span><a name="line.4476"></a>
-<span class="sourceLineNo">4477</span>  }<a name="line.4477"></a>
+<span class="sourceLineNo">4454</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4454"></a>
+<span class="sourceLineNo">4455</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4455"></a>
+<span class="sourceLineNo">4456</span><a name="line.4456"></a>
+<span class="sourceLineNo">4457</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4457"></a>
+<span class="sourceLineNo">4458</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4458"></a>
+<span class="sourceLineNo">4459</span><a name="line.4459"></a>
+<span class="sourceLineNo">4460</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4460"></a>
+<span class="sourceLineNo">4461</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4461"></a>
+<span class="sourceLineNo">4462</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.USE_DEFAULT, 0, true, true, false);<a name="line.4462"></a>
+<span class="sourceLineNo">4463</span><a name="line.4463"></a>
+<span class="sourceLineNo">4464</span>    // expected cases for async wal<a name="line.4464"></a>
+<span class="sourceLineNo">4465</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4465"></a>
+<span class="sourceLineNo">4466</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4466"></a>
+<span class="sourceLineNo">4467</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4467"></a>
+<span class="sourceLineNo">4468</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4468"></a>
+<span class="sourceLineNo">4469</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4469"></a>
+<span class="sourceLineNo">4470</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.USE_DEFAULT, 0, true, false, false);<a name="line.4470"></a>
+<span class="sourceLineNo">4471</span><a name="line.4471"></a>
+<span class="sourceLineNo">4472</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4472"></a>
+<span class="sourceLineNo">4473</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4473"></a>
+<span class="sourceLineNo">4474</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4474"></a>
+<span class="sourceLineNo">4475</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4475"></a>
+<span class="sourceLineNo">4476</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4476"></a>
+<span class="sourceLineNo">4477</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.USE_DEFAULT, 5000, true, false, true);<a name="line.4477"></a>
 <span class="sourceLineNo">4478</span><a name="line.4478"></a>
-<span class="sourceLineNo">4479</span>  private void durabilityTest(String method, Durability tableDurability,<a name="line.4479"></a>
-<span class="sourceLineNo">4480</span>      Durability mutationDurability, long timeout, boolean expectAppend, final boolean expectSync,<a name="line.4480"></a>
-<span class="sourceLineNo">4481</span>      final boolean expectSyncFromLogSyncer) throws Exception {<a name="line.4481"></a>
-<span class="sourceLineNo">4482</span>    Configuration conf = HBaseConfiguration.create(CONF);<a name="line.4482"></a>
-<span class="sourceLineNo">4483</span>    method = method + "_" + tableDurability.name() + "_" + mutationDurability.name();<a name="line.4483"></a>
-<span class="sourceLineNo">4484</span>    byte[] family = Bytes.toBytes("family");<a name="line.4484"></a>
-<span class="sourceLineNo">4485</span>    Path logDir = new Path(new Path(dir + method), "log");<a name="line.4485"></a>
-<span class="sourceLineNo">4486</span>    final Configuration walConf = new Configuration(conf);<a name="line.4486"></a>
-<span class="sourceLineNo">4487</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.4487"></a>
-<span class="sourceLineNo">4488</span>    // XXX: The spied AsyncFSWAL can not work properly because of a Mockito defect that can not<a name="line.4488"></a>
-<span class="sourceLineNo">4489</span>    // deal with classes which have a field of an inner class. See discussions in HBASE-15536.<a name="line.4489"></a>
-<span class="sourceLineNo">4490</span>    walConf.set(WALFactory.WAL_PROVIDER, "filesystem");<a name="line.4490"></a>
-<span class="sourceLineNo">4491</span>    final WALFactory wals = new WALFactory(walConf, TEST_UTIL.getRandomUUID().toString());<a name="line.4491"></a>
-<span class="sourceLineNo">4492</span>    final WAL wal = spy(wals.getWAL(RegionInfoBuilder.newBuilder(tableName).build()));<a name="line.4492"></a>
-<span class="sourceLineNo">4493</span>    this.region = initHRegion(tableName, HConstants.EMPTY_START_ROW,<a name="line.4493"></a>
-<span class="sourceLineNo">4494</span>        HConstants.EMPTY_END_ROW, false, tableDurability, wal,<a name="line.4494"></a>
-<span class="sourceLineNo">4495</span>        new byte[][] { family });<a name="line.4495"></a>
-<span class="sourceLineNo">4496</span><a name="line.4496"></a>
-<span class="sourceLineNo">4497</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.4497"></a>
-<span class="sourceLineNo">4498</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.4498"></a>
-<span class="sourceLineNo">4499</span>    put.setDurability(mutationDurability);<a name="line.4499"></a>
-<span class="sourceLineNo">4500</span>    region.put(put);<a name="line.4500"></a>
-<span class="sourceLineNo">4501</span><a name="line.4501"></a>
-<span class="sourceLineNo">4502</span>    //verify append called or not<a name="line.4502"></a>
-<span class="sourceLineNo">4503</span>    verify(wal, expectAppend ? times(1) : never())<a name="line.4503"></a>
-<span class="sourceLineNo">4504</span>      .append((HRegionInfo)any(), (WALKeyImpl)any(),<a name="line.4504"></a>
-<span class="sourceLineNo">4505</span>          (WALEdit)any(), Mockito.anyBoolean());<a name="line.4505"></a>
+<span class="sourceLineNo">4479</span>    // expect skip wal cases<a name="line.4479"></a>
+<span class="sourceLineNo">4480</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4480"></a>
+<span class="sourceLineNo">4481</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4481"></a>
+<span class="sourceLineNo">4482</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4482"></a>
+<span class="sourceLineNo">4483</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4483"></a>
+<span class="sourceLineNo">4484</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4484"></a>
+<span class="sourceLineNo">4485</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.USE_DEFAULT, 0, false, false, false);<a name="line.4485"></a>
+<span class="sourceLineNo">4486</span><a name="line.4486"></a>
+<span class="sourceLineNo">4487</span>  }<a name="line.4487"></a>
+<span class="sourceLineNo">4488</span><a name="line.4488"></a>
+<span class="sourceLineNo">4489</span>  private void durabilityTest(String method, Durability tableDurability,<a name="line.4489"></a>
+<span class="sourceLineNo">4490</span>      Durability mutationDurability, long timeout, boolean expectAppend, final boolean expectSync,<a name="line.4490"></a>
+<span class="sourceLineNo">4491</span>      final boolean expectSyncFromLogSyncer) throws Exception {<a name="line.4491"></a>
+<span class="sourceLineNo">4492</span>    Configuration conf = HBaseConfiguration.create(CONF);<a name="line.4492"></a>
+<span class="sourceLineNo">4493</span>    method = method + "_" + tableDurability.name() + "_" + mutationDurability.name();<a name="line.4493"></a>
+<span class="sourceLineNo">4494</span>    byte[] family = Bytes.toBytes("family");<a name="line.4494"></a>
+<span class="sourceLineNo">4495</span>    Path logDir = new Path(new Path(dir + method), "log");<a name="line.4495"></a>
+<span class="sourceLineNo">4496</span>    final Configuration walConf = new Configuration(conf);<a name="line.4496"></a>
+<span class="sourceLineNo">4497</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.4497"></a>
+<span class="sourceLineNo">4498</span>    // XXX: The spied AsyncFSWAL can not work properly because of a Mockito defect that can not<a name="line.4498"></a>
+<span class="sourceLineNo">4499</span>    // deal with classes which have a field of an inner class. See discussions in HBASE-15536.<a name="line.4499"></a>
+<span class="sourceLineNo">4500</span>    walConf.set(WALFactory.WAL_PROVIDER, "filesystem");<a name="line.4500"></a>
+<span class="sourceLineNo">4501</span>    final WALFactory wals = new WALFactory(walConf, TEST_UTIL.getRandomUUID().toString());<a name="line.4501"></a>
+<span class="sourceLineNo">4502</span>    final WAL wal = spy(wals.getWAL(RegionInfoBuilder.newBuilder(tableName).build()));<a name="line.4502"></a>
+<span class="sourceLineNo">4503</span>    this.region = initHRegion(tableName, HConstants.EMPTY_START_ROW,<a name="line.4503"></a>
+<span class="sourceLineNo">4504</span>        HConstants.EMPTY_END_ROW, false, tableDurability, wal,<a name="line.4504"></a>
+<span class="sourceLineNo">4505</span>        new byte[][] { family });<a name="line.4505"></a>
 <span class="sourceLineNo">4506</span><a name="line.4506"></a>
-<span class="sourceLineNo">4507</span>    // verify sync called or not<a name="line.4507"></a>
-<span class="sourceLineNo">4508</span>    if (expectSync || expectSyncFromLogSyncer) {<a name="line.4508"></a>
-<span class="sourceLineNo">4509</span>      TEST_UTIL.waitFor(timeout, new Waiter.Predicate&lt;Exception&gt;() {<a name="line.4509"></a>
-<span class="sourceLineNo">4510</span>        @Override<a name="line.4510"></a>
-<span class="sourceLineNo">4511</span>        public boolean evaluate() throws Exception {<a name="line.4511"></a>
-<span class="sourceLineNo">4512</span>          try {<a name="line.4512"></a>
-<span class="sourceLineNo">4513</span>            if (expectSync) {<a name="line.4513"></a>
-<span class="sourceLineNo">4514</span>              verify(wal, times(1)).sync(anyLong()); // Hregion calls this one<a name="line.4514"></a>
-<span class="sourceLineNo">4515</span>            } else if (expectSyncFromLogSyncer) {<a name="line.4515"></a>
-<span class="sourceLineNo">4516</span>              verify(wal, times(1)).sync(); // wal syncer calls this one<a name="line.4516"></a>
-<span class="sourceLineNo">4517</span>            }<a name="line.4517"></a>
-<span class="sourceLineNo">4518</span>          } catch (Throwable ignore) {<a name="line.4518"></a>
-<span class="sourceLineNo">4519</span>          }<a name="line.4519"></a>
-<span class="sourceLineNo">4520</span>          return true;<a name="line.4520"></a>
-<span class="sourceLineNo">4521</span>        }<a name="line.4521"></a>
-<span class="sourceLineNo">4522</span>      });<a name="line.4522"></a>
-<span class="sourceLineNo">4523</span>    } else {<a name="line.4523"></a>
-<span class="sourceLineNo">4524</span>      //verify(wal, never()).sync(anyLong());<a name="line.4524"></a>
-<span class="sourceLineNo">4525</span>      verify(wal, never()).sync();<a name="line.4525"></a>
-<span class="sourceLineNo">4526</span>    }<a name="line.4526"></a>
-<span class="sourceLineNo">4527</span><a name="line.4527"></a>
-<span class="sourceLineNo">4528</span>    HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.4528"></a>
-<span class="sourceLineNo">4529</span>    wals.close();<a name="line.4529"></a>
-<span class="sourceLineNo">4530</span>    this.region = null;<a name="line.4530"></a>
-<span class="sourceLineNo">4531</span>  }<a name="line.4531"></a>
-<span class="sourceLineNo">4532</span><a name="line.4532"></a>
-<span class="sourceLineNo">4533</span>  @Test<a name="line.4533"></a>
-<span class="sourceLineNo">4534</span>  public void testRegionReplicaSecondary() throws IOException {<a name="line.4534"></a>
-<span class="sourceLineNo">4535</span>    // create a primary region, load some data and flush<a name="line.4535"></a>
-<span class="sourceLineNo">4536</span>    // create a secondary region, and do a get against that<a name="line.4536"></a>
-<span class="sourceLineNo">4537</span>    Path rootDir = new Path(dir + name.getMethodName());<a name="line.4537"></a>
-<span class="sourceLineNo">4538</span>    FSUtils.setRootDir(TEST_UTIL.getConfiguration(), rootDir);<a name="line.4538"></a>
-<span class="sourceLineNo">4539</span><a name="line.4539"></a>
-<span class="sourceLineNo">4540</span>    byte[][] families = new byte[][] {<a name="line.4540"></a>
-<span class="sourceLineNo">4541</span>        Bytes.toBytes("cf1"), Bytes.toBytes("cf2"), Bytes.toBytes("cf3")<a name="line.4541"></a>
-<span class="sourceLineNo">4542</span>    };<a name="line.4542"></a>
-<span class="sourceLineNo">4543</span>    byte[] cq = Bytes.toBytes("cq");<a name="line.4543"></a>
-<span class="sourceLineNo">4544</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.4544"></a>
-<span class="sourceLineNo">4545</span>    for (byte[] family : families) {<a name="line.4545"></a>
-<span class="sourceLineNo">4546</span>      htd.addFamily(new HColumnDescriptor(family));<a name="line.4546"></a>
-<span class="sourceLineNo">4547</span>    }<a name="line.4547"></a>
-<span class="sourceLineNo">4548</span><a name="line.4548"></a>
-<span class="sourceLineNo">4549</span>    long time = System.currentTimeMillis();<a name="line.4549"></a>
-<span class="sourceLineNo">4550</span>    HRegionInfo primaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4550"></a>
-<span class="sourceLineNo">4551</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4551"></a>
-<span class="sourceLineNo">4552</span>      false, time, 0);<a name="line.4552"></a>
-<span class="sourceLineNo">4553</span>    HRegionInfo secondaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4553"></a>
-<span class="sourceLineNo">4554</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4554"></a>
-<span class="sourceLineNo">4555</span>      false, time, 1);<a name="line.4555"></a>
-<span class="sourceLineNo">4556</span><a name="line.4556"></a>
-<span class="sourceLineNo">4557</span>    HRegion primaryRegion = null, secondaryRegion = null;<a name="line.4557"></a>
+<span class="sourceLineNo">4507</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.4507"></a>
+<span class="sourceLineNo">4508</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.4508"></a>
+<span class="sourceLineNo">4509</span>    put.setDurability(mutationDurability);<a name="line.4509"></a>
+<span class="sourceLineNo">4510</span>    region.put(put);<a name="line.4510"></a>
+<span class="sourceLineNo">4511</span><a name="line.4511"></a>
+<span class="sourceLineNo">4512</span>    //verify append called or not<a name="line.4512"></a>
+<span class="sourceLineNo">4513</span>    verify(wal, expectAppend ? times(1) : never())<a name="line.4513"></a>
+<span class="sourceLineNo">4514</span>      .append((HRegionInfo)any(), (WALKeyImpl)any(),<a name="line.4514"></a>
+<span class="sourceLineNo">4515</span>          (WALEdit)any(), Mockito.anyBoolean());<a name="line.4515"></a>
+<span class="sourceLineNo">4516</span><a name="line.4516"></a>
+<span class="sourceLineNo">4517</span>    // verify sync called or not<a name="line.4517"></a>
+<span class="sourceLineNo">4518</span>    if (expectSync || expectSyncFromLogSyncer) {<a name="line.4518"></a>
+<span class="sourceLineNo">4519</span>      TEST_UTIL.waitFor(timeout, new Waiter.Predicate&lt;Exception&gt;() {<a name="line.4519"></a>
+<span class="sourceLineNo">4520</span>        @Override<a name="line.4520"></a>
+<span class="sourceLineNo">4521</span>        public boolean evaluate() throws Exception {<a name="line.4521"></a>
+<span class="sourceLineNo">4522</span>          try {<a name="line.4522"></a>
+<span class="sourceLineNo">4523</span>            if (expectSync) {<a name="line.4523"></a>
+<span class="sourceLineNo">4524</span>              verify(wal, times(1)).sync(anyLong()); // Hregion calls this one<a name="line.4524"></a>
+<span class="sourceLineNo">4525</span>            } else if (expectSyncFromLogSyncer) {<a name="line.4525"></a>
+<span class="sourceLineNo">4526</span>              verify(wal, times(1)).sync(); // wal syncer calls this one<a name="line.4526"></a>
+<span class="sourceLineNo">4527</span>            }<a name="line.4527"></a>
+<span class="sourceLineNo">4528</span>          } catch (Throwable ignore) {<a name="line.4528"></a>
+<span class="sourceLineNo">4529</span>          }<a name="line.4529"></a>
+<span class="sourceLineNo">4530</span>          return true;<a name="line.4530"></a>
+<span class="sourceLineNo">4531</span>        }<a name="line.4531"></a>
+<span class="sourceLineNo">4532</span>      });<a name="line.4532"></a>
+<span class="sourceLineNo">4533</span>    } else {<a name="line.4533"></a>
+<span class="sourceLineNo">4534</span>      //verify(wal, never()).sync(anyLong());<a name="line.4534"></a>
+<span class="sourceLineNo">4535</span>      verify(wal, never()).sync();<a name="line.4535"></a>
+<span class="sourceLineNo">4536</span>    }<a name="line.4536"></a>
+<span class="sourceLineNo">4537</span><a name="line.4537"></a>
+<span class="sourceLineNo">4538</span>    HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.4538"></a>
+<span class="sourceLineNo">4539</span>    wals.close();<a name="line.4539"></a>
+<span class="sourceLineNo">4540</span>    this.region = null;<a name="line.4540"></a>
+<span class="sourceLineNo">4541</span>  }<a name="line.4541"></a>
+<span class="sourceLineNo">4542</span><a name="line.4542"></a>
+<span class="sourceLineNo">4543</span>  @Test<a name="line.4543"></a>
+<span class="sourceLineNo">4544</span>  public void testRegionReplicaSecondary() throws IOException {<a name="line.4544"></a>
+<span class="sourceLineNo">4545</span>    // create a primary region, load some data and flush<a name="line.4545"></a>
+<span class="sourceLineNo">4546</span>    // create a secondary region, and do a get against that<a name="line.4546"></a>
+<span class="sourceLineNo">4547</span>    Path rootDir = new Path(dir + name.getMethodName());<a name="line.4547"></a>
+<span class="sourceLineNo">4548</span>    FSUtils.setRootDir(TEST_UTIL.getConfiguration(), rootDir);<a name="line.4548"></a>
+<span class="sourceLineNo">4549</span><a name="line.4549"></a>
+<span class="sourceLineNo">4550</span>    byte[][] families = new byte[][] {<a name="line.4550"></a>
+<span class="sourceLineNo">4551</span>        Bytes.toBytes("cf1"), Bytes.toBytes("cf2"), Bytes.toBytes("cf3")<a name="line.4551"></a>
+<span class="sourceLineNo">4552</span>    };<a name="line.4552"></a>
+<span class="sourceLineNo">4553</span>    byte[] cq = Bytes.toBytes("cq");<a name="line.4553"></a>
+<span class="sourceLineNo">4554</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.4554"></a>
+<span class="sourceLineNo">4555</span>    for (byte[] family : families) {<a name="line.4555"></a>
+<span class="sourceLineNo">4556</span>      htd.addFamily(new HColumnDescriptor(family));<a name="line.4556"></a>
+<span class="sourceLineNo">4557</span>    }<a name="line.4557"></a>
 <span class="sourceLineNo">4558</span><a name="line.4558"></a>
-<span class="sourceLineNo">4559</span>    try {<a name="line.4559"></a>
-<span class="sourceLineNo">4560</span>      primaryRegion = HBaseTestingUtility.createRegionAndWAL(primaryHri,<a name="line.4560"></a>
-<span class="sourceLineNo">4561</span>          rootDir, TEST_UTIL.getConfiguration(), htd);<a name="line.4561"></a>
-<span class="sourceLineNo">4562</span><a name="line.4562"></a>
-<span class="sourceLineNo">4563</span>      // load some data<a name="line.4563"></a>
-<span class="sourceLineNo">4564</span>      putData(primaryRegion, 0, 1000, cq, families);<a name="line.4564"></a>
-<span class="sourceLineNo">4565</span><a name="line.4565"></a>
-<span class="sourceLineNo">4566</span>      // flush region<a name="line.4566"></a>
-<span class="sourceLineNo">4567</span>      primaryRegion.flush(true);<a name="line.4567"></a>
+<span class="sourceLineNo">4559</span>    long time = System.currentTimeMillis();<a name="line.4559"></a>
+<span class="sourceLineNo">4560</span>    HRegionInfo primaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4560"></a>
+<span class="sourceLineNo">4561</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4561"></a>
+<span class="sourceLineNo">4562</span>      false, time, 0);<a name="line.4562"></a>
+<span class="sourceLineNo">4563</span>    HRegionInfo secondaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4563"></a>
+<span class="sourceLineNo">4564</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4564"></a>
+<span class="sourceLineNo">4565</span>      false, time, 1);<a name="line.4565"></a>
+<span class="sourceLineNo">4566</span><a name="line.4566"></a>
+<span class="sourceLineNo">4567</span>    HRegion primaryRegion = null, secondaryRegion = null;<a name="line.4567"></a>
 <span class="sourceLineNo">4568</span><a name="line.4568"></a>
-<span class="sourceLineNo">4569</span>      // open secondary region<a name="line.4569"></a>
-<span class="sourceLineNo">4570</span>      secondaryRegion = HRegion.openHRegion(rootDir, secondaryHri, htd, null, CONF);<a name="line.4570"></a>
-<span class="sourceLineNo">4571</span><a name="line.4571"></a>
-<span class="sourceLineNo">4572</span>      verifyData(secondaryRegion, 0, 1000, cq, families);<a name="line.4572"></a>
-<span class="sourceLineNo">4573</span>    } finally {<a name="line.4573"></a>
-<span class="sourceLineNo">4574</span>      if (primaryRegion != null) {<a name="line.4574"></a>
-<span class="sourceLineNo">4575</span>        HBaseTestingUtility.closeRegionAndWAL(primaryRegion);<a name="line.4575"></a>
-<span class="sourceLineNo">4576</span>      }<a name="line.4576"></a>
-<span class="sourceLineNo">4577</span>      if (secondaryRegion != null) {<a name="line.4577"></a>
-<span class="sourceLineNo">4578</span>        HBaseTestingUtility.closeRegionAndWAL(secondaryRegion);<a name="line.4578"></a>
-<span class="sourceLineNo">4579</span>      }<a name="line.4579"></a>
-<span class="sourceLineNo">4580</span>    }<a name="line.4580"></a>
-<span class="sourceLineNo">4581</span>  }<a name="line.4581"></a>
-<span class="sourceLineNo">4582</span><a name="line.4582"></a>
-<span class="sourceLineNo">4583</span>  @Test<a name="line.4583"></a>
-<span class="sourceLineNo">4584</span>  public void testRegionReplicaSecondaryIsReadOnly() throws IOException {<a name="line.4584"></a>
-<span class="sourceLineNo">4585</span>    // create a primary region, load some data and flush<a name="line.4585"></a>
-<span class="sourceLineNo">4586</span>    // create a secondary region, and do a put against that<a name="line.4586"></a>
-<span class="sourceLineNo">4587</span>    Path rootDir = new Path(dir + name.getMethodName());<a name="line.4587"></a>
-<span class="sourceLineNo">4588</span>    FSUtils.setRootDir(TEST_UTIL.getConfiguration(), rootDir);<a name="line.4588"></a>
-<span class="sourceLineNo">4589</span><a name="line.4589"></a>
-<span class="sourceLineNo">4590</span>    byte[][] families = new byte[][] {<a name="line.4590"></a>
-<span class="sourceLineNo">4591</span>        Bytes.toBytes("cf1"), Bytes.toBytes("cf2"), Bytes.toBytes("cf3")<a name="line.4591"></a>
-<span class="sourceLineNo">4592</span>    };<a name="line.4592"></a>
-<span class="sourceLineNo">4593</span>    byte[] cq = Bytes.toBytes("cq");<a name="line.4593"></a>
-<span class="sourceLineNo">4594</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.4594"></a>
-<span class="sourceLineNo">4595</span>    for (byte[] family : families) {<a name="line.4595"></a>
-<span class="sourceLineNo">4596</span>      htd.addFamily(new HColumnDescriptor(family));<a name="line.4596"></a>
-<span class="sourceLineNo">4597</span>    }<a name="line.4597"></a>
-<span class="sourceLineNo">4598</span><a name="line.4598"></a>
-<span class="sourceLineNo">4599</span>    long time = System.currentTimeMillis();<a name="line.4599"></a>
-<span class="sourceLineNo">4600</span>    HRegionInfo primaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4600"></a>
-<span class="sourceLineNo">4601</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4601"></a>
-<span class="sourceLineNo">4602</span>      false, time, 0);<a name="line.4602"></a>
-<span class="sourceLineNo">4603</span>    HRegionInfo secondaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4603"></a>
-<span class="sourceLineNo">4604</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4604"></a>
-<span class="sourceLineNo">4605</span>      false, time, 1);<a name="line.4605"></a>
-<span class="sourceLineNo">4606</span><a name="line.4606"></a>
-<span class="sourceLineNo">4607</span>    HRegion primaryRegion = null, secondaryRegion = null;<a name="line.4607"></a>
+<span class="sourceLineNo">4569</span>    try {<a name="line.4569"></a>
+<span class="sourceLineNo">4570</span>      primaryRegion = HBaseTestingUtility.createRegionAndWAL(primaryHri,<a name="line.4570"></a>
+<span class="sourceLineNo">4571</span>          rootDir, TEST_UTIL.getConfiguration(), htd);<a name="line.4571"></a>
+<span class="sourceLineNo">4572</span><a name="line.4572"></a>
+<span class="sourceLineNo">4573</span>      // load some data<a name="line.4573"></a>
+<span class="sourceLineNo">4574</span>      putData(primaryRegion, 0, 1000, cq, families);<a name="line.4574"></a>
+<span class="sourceLineNo">4575</span><a name="line.4575"></a>
+<span class="sourceLineNo">4576</span>      // flush region<a name="line.4576"></a>
+<span class="sourceLineNo">4577</span>      primaryRegion.flush(true);<a name="line.4577"></a>
+<span class="sourceLineNo">4578</span><a name="line.4578"></a>
+<span class="sourceLineNo">4579</span>      // open secondary region<a name="line.4579"></a>
+<span class="sourceLineNo">4580</span>      secondaryRegion = HRegion.openHRegion(rootDir, secondaryHri, htd, null, CONF);<a name="line.4580"></a>
+<span class="sourceLineNo">4581</span><a name="line.4581"></a>
+<span class="sourceLineNo">4582</span>      verifyData(secondaryRegion, 0, 1000, cq, families);<a name="line.4582"></a>
+<span class="sourceLineNo">4583</span>    } finally {<a name="line.4583"></a>
+<span class="sourceLineNo">4584</span>      if (primaryRegion != null) {<a name="line.4584"></a>
+<span class="sourceLineNo">4585</span>        HBaseTestingUtility.closeRegionAndWAL(primaryRegion);<a name="line.4585"></a>
+<span class="sourceLineNo">4586</span>      }<a name="line.4586"></a>
+<span class="sourceLineNo">4587</span>      if (secondaryRegion != null) {<a name="line.4587"></a>
+<span class="sourceLineNo">4588</span>        HBaseTestingUtility.closeRegionAndWAL(secondaryRegion);<a name="line.4588"></a>
+<span class="sourceLineNo">4589</span>      }<a name="line.4589"></a>
+<span class="sourceLineNo">4590</span>    }<a name="line.4590"></a>
+<span class="sourceLineNo">4591</span>  }<a name="line.4591"></a>
+<span class="sourceLineNo">4592</span><a name="line.4592"></a>
+<span class="sourceLineNo">4593</span>  @Test<a name="line.4593"></a>
+<span class="sourceLineNo">4594</span>  public void testRegionReplicaSecondaryIsReadOnly() throws IOException {<a name="line.4594"></a>
+<span class="sourceLineNo">4595</span>    // create a primary region, load some data and flush<a name="line.4595"></a>
+<span class="sourceLineNo">4596</span>    // create a secondary region, and do a put against that<a name="line.4596"></a>
+<span class="sourceLineNo">4597</span>    Path rootDir = new Path(dir + name.getMethodName());<a name="line.4597"></a>
+<span class="sourceLineNo">4598</span>    FSUtils.setRootDir(TEST_UTIL.getConfiguration(), rootDir);<a name="line.4598"></a>
+<span class="sourceLineNo">4599</span><a name="line.4599"></a>
+<span class="sourceLineNo">4600</span>    byte[][] families = new byte[][] {<a name="line.4600"></a>
+<span class="sourceLineNo">4601</span>        Bytes.toBytes("cf1"), Bytes.toBytes("cf2"), Bytes.toBytes("cf3")<a name="line.4601"></a>
+<span class="sourceLineNo">4602</span>    };<a name="line.4602"></a>
+<span class="sourceLineNo">4603</span>    byte[] cq = Bytes.toBytes("cq");<a name="line.4603"></a>
+<span class="sourceLineNo">4604</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.4604"></a>
+<span class="sourceLineNo">4605</span>    for (byte[] family : families) {<a name="line.4605"></a>
+<span class="sourceLineNo">4606</span>      htd.addFamily(new HColumnDescriptor(family));<a name="line.4606"></a>
+<span class="sourceLineNo">4607</span>    }<a name="line.4607"></a>
 <span class="sourceLineNo">4608</span><a name="line.4608"></a>
-<span class="sourceLineNo">4609</span>    try {<a name="line.4609"></a>
-<span class="sourceLineNo">4610</span>      primaryRegion = HBaseTestingUtility.createRegionAndWAL(primaryHri,<a name="line.4610"></a>
-<span class="sourceLineNo">4611</span>          rootDir, TEST_UTIL.getConfiguration(), htd);<a name="line.4611"></a>
-<span class="sourceLineNo">4612</span><a name="line.4612"></a>
-<span class="sourceLineNo">4613</span>      // load some data<a name="line.4613"></a>
-<span class="sourceLineNo">4614</span>      putData(primaryRegion, 0, 1000, cq, families);<a name="line.4614"></a>
-<span class="sourceLineNo">4615</span><a name="line.4615"></a>
-<span class="sourceLineNo">4616</span>      // flush region<a name="line.4616"></a>
-<span class="sourceLineNo">4617</span>      primaryRegion.flush(true);<a name="line.4617"></a>
+<span class="sourceLineNo">4609</span>    long time = System.currentTimeMillis();<a name="line.4609"></a>
+<span class="sourceLineNo">4610</span>    HRegionInfo primaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4610"></a>
+<span class="sourceLineNo">4611</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4611"></a>
+<span class="sourceLineNo">4612</span>      false, time, 0);<a name="line.4612"></a>
+<span class="sourceLineNo">4613</span>    HRegionInfo secondaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4613"></a>
+<span class="sourceLineNo">4614</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4614"></a>
+<span class="sourceLineNo">4615</span>      false, time, 1);<a name="line.4615"></a>
+<span class="sourceLineNo">4616</span><a name="line.4616"></a>
+<span class="sourceLineNo">4617</span>    HRegion primaryRegion = null, secondaryRegion = null;<a name="line.4617"></a>
 <span class="sourceLineNo">4618</span><a name="line.4618"></a>
-<span class="sourceLineNo">4619</span>      // open secondary region<a name="line.4619"></a>
-<span class="sourceLineNo">4620</span>      secondaryRegion = HRegion.openHRegion(rootDir, secondaryHri, htd, null, CONF);<a name="line.4620"></a>
-<span class="sourceLineNo">4621</span><a name="line.4621"></a>
-<span class="sourceLineNo">4622</span>      try {<a name="line.4622"></a>
-<span class="sourceLineNo">4623</span>        putData(secondaryRegion, 0, 1000, cq, families);<a name="line.4623"></a>
-<span class="sourceLineNo">4624</span>        fail("Should have thrown exception");<a name="line.4624"></a>
-<span class="sourceLineNo">4625</span>      } catch (IOException ex) {<a name="line.4625"></a>
-<span class="sourceLineNo">4626</span>        // expected<a name="line.4626"></a>
-<span class="sourceLineNo">4627</span>      }<a name="line.4627"></a>
-<span class="sourceLineNo">4628</span>    } finally {<a name="line.4628"></a>
-<span class="sourceLineNo">4629</span>      if (primaryRegion != null) {<a name="line.4629"></a>
-<span class="sourceLineNo">4630</span>        HBaseTestingUtility.closeRegionAndWAL(primaryRegion);<a name="line.4630"></a>
-<span class="sourceLineNo">4631</span>      }<a name="line.4631"></a>
-<span class="sourceLineNo">4632</span>      if (secondaryRegion != null) {<a name="line.4632"></a>
-<span class="sourceLineNo">4633</span>        HBaseTestingUtility.closeRegionAndWAL(secondaryRegion);<a name="line.4633"></a>
-<span class="sourceLineNo">4634</span>      }<a name="line.4634"></a>
-<span class="sourceLineNo">4635</span>    }<a name="line.4635"></a>
-<span class="sourceLineNo">4636</span>  }<a name="line.4636"></a>
-<span class="sourceLineNo">4637</span><a name="line.4637"></a>
-<span class="sourceLineNo">4638</span>  static WALFactory createWALFactory(Configuration conf, Path rootDir) throws IOException {<a name="line.4638"></a>
-<span class="sourceLineNo">4639</span>    Configuration confForWAL = new Configuration(conf);<a name="line.4639"></a>
-<span class="sourceLineNo">4640</span>    confForWAL.set(HConstants.HBASE_DIR, rootDir.toString());<a name="line.4640"></a>
-<span class="sourceLineNo">4641</span>    return new WALFactory(confForWAL, "hregion-" + RandomStringUtils.randomNumeric(8));<a name="line.4641"></a>
-<span class="sourceLineNo">4642</span>  }<a name="line.4642"></a>
-<span class="sourceLineNo">4643</span><a name="line.4643"></a>
-<span class="sourceLineNo">4644</span>  @Test<a name="line.4644"></a>
-<span class="sourceLineNo">4645</span>  public void testCompactionFromPrimary() throws IOException {<a name="line.4645"></a>
-<span class="sourceLineNo">4646</span>    Path rootDir = new Path(dir + name.getMethodName());<a name="line.4646"></a>
-<span class="sourceLineNo">4647</span>    FSUtils.setRootDir(TEST_UTIL.getConfiguration(), rootDir);<a name="line.4647"></a>
-<span class="sourceLineNo">4648</span><a name="line.4648"></a>
-<span class="sourceLineNo">4649</span>    byte[][] families = new byte[][] {<a name="line.4649"></a>
-<span class="sourceLineNo">4650</span>        Bytes.toBytes("cf1"), Bytes.toBytes("cf2"), Bytes.toBytes("cf3")<a name="line.4650"></a>
-<span class="sourceLineNo">4651</span>    };<a name="line.4651"></a>
-<span class="sourceLineNo">4652</span>    byte[] cq = Bytes.toBytes("cq");<a name="line.4652"></a>
-<span class="sourceLineNo">4653</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.4653"></a>
-<span class="sourceLineNo">4654</span>    for (byte[] family : families) {<a name="line.4654"></a>
-<span class="sourceLineNo">4655</span>      htd.addFamily(new HColumnDescriptor(family));<a name="line.4655"></a>
-<span class="sourceLineNo">4656</span>    }<a name="line.4656"></a>
-<span class="sourceLineNo">4657</span><a name="line.4657"></a>
-<span class="sourceLineNo">4658</span>    long time = System.currentTimeMillis();<a name="line.4658"></a>
-<span class="sourceLineNo">4659</span>    HRegionInfo primaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4659"></a>
-<span class="sourceLineNo">4660</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4660"></a>
-<span class="sourceLineNo">4661</span>      false, time, 0);<a name="line.4661"></a>
-<span class="sourceLineNo">4662</span>    HRegionInfo secondaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4662"></a>
-<span class="sourceLineNo">4663</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4663"></a>
-<span class="sourceLineNo">4664</span>      false, time, 1);<a name="line.4664"></a>
-<span class="sourceLineNo">4665</span><a name="line.4665"></a>
-<span class="sourceLineNo">4666</span>    HRegion primaryRegion = null, secondaryRegion = null;<a name="line.4666"></a>
+<span class="sourceLineNo">4619</span>    try {<a name="line.4619"></a>
+<span class="sourceLineNo">4620</span>      primaryRegion = HBaseTestingUtility.createRegionAndWAL(primaryHri,<a name="line.4620"></a>
+<span class="sourceLineNo">4621</span>          rootDir, TEST_UTIL.getConfiguration(), htd);<a name="line.4621"></a>
+<span class="sourceLineNo">4622</span><a name="line.4622"></a>
+<span class="sourceLineNo">4623</span>      // load some data<a name="line.4623"></a>
+<span class="sourceLineNo">4624</span>      putData(primaryRegion, 0, 1000, cq, families);<a name="line.4624"></a>
+<span class="sourceLineNo">4625</span><a name="line.4625"></a>
+<span class="sourceLineNo">4626</span>      // flush region<a name="line.4626"></a>
+<span class="sourceLineNo">4627</span>      primaryRegion.flush(true);<a name="line.4627"></a>
+<span class="sourceLineNo">4628</span><a name="line.4628"></a>
+<span class="sourceLineNo">4629</span>      // open secondary region<a name="line.4629"></a>
+<span class="sourceLineNo">4630</span>      secondaryRegion = HRegion.openHRegion(rootDir, secondaryHri, htd, null, CONF);<a name="line.4630"></a>
+<span class="sourceLineNo">4631</span><a name="line.4631"></a>
+<span class="sourceLineNo">4632</span>      try {<a name="line.4632"></a>
+<span class="sourceLineNo">4633</span>        putData(secondaryRegion, 0, 1000, cq, families);<a name="line.4633"></a>
+<span class="sourceLineNo">4634</span>        fail("Should have thrown exception");<a name="line.4634"></a>
+<span class="sourceLineNo">4635</span>      } catch (IOException ex) {<a name="line.4635"></a>
+<span class="sourceLineNo">4636</span>        // expected<a name="line.4636"></a>
+<span class="sourceLineNo">4637</span>      }<a name="line.4637"></a>
+<span class="sourceLineNo">4638</span>    } finally {<a name="line.4638"></a>
+<span class="sourceLineNo">4639</span>      if (primaryRegion != null) {<a name="line.4639"></a>
+<span class="sourceLineNo">4640</span>        HBaseTestingUtility.closeRegionAndWAL(primaryRegion);<a name="line.4640"></a>
+<span class="sourceLineNo">4641</span>      }<a name="line.4641"></a>
+<span class="sourceLineNo">4642</span>      if (secondaryRegion != null) {<a name="line.4642"></a>
+<span class="sourceLineNo">4643</span>        HBaseTestingUtility.closeRegionAndWAL(secondaryRegion);<a name="line.4643"></a>
+<span class="sourceLineNo">4644</span>      }<a name="line.4644"></a>
+<span class="sourceLineNo">4645</span>    }<a name="line.4645"></a>
+<span class="sourceLineNo">4646</span>  }<a name="line.4646"></a>
+<span class="sourceLineNo">4647</span><a name="line.4647"></a>
+<span class="sourceLineNo">4648</span>  static WALFactory createWALFactory(Configuration conf, Path rootDir) throws IOException {<a name="line.4648"></a>
+<span class="sourceLineNo">4649</span>    Configuration confForWAL = new Configuration(conf);<a name="line.4649"></a>
+<span class="sourceLineNo">4650</span>    confForWAL.set(HConstants.HBASE_DIR, rootDir.toString());<a name="line.4650"></a>
+<span class="sourceLineNo">4651</span>    return new WALFactory(confForWAL, "hregion-" + RandomStringUtils.randomNumeric(8));<a name="line.4651"></a>
+<span class="sourceLineNo">4652</span>  }<a name="line.4652"></a>
+<span class="sourceLineNo">4653</span><a name="line.4653"></a>
+<span class="sourceLineNo">4654</span>  @Test<a name="line.4654"></a>
+<span class="sourceLineNo">4655</span>  public void testCompactionFromPrimary() throws IOException {<a name="line.4655"></a>
+<span class="sourceLineNo">4656</span>    Path rootDir = new Path(dir + name.getMethodName());<a name="line.4656"></a>
+<span class="sourceLineNo">4657</span>    FSUtils.setRootDir(TEST_UTIL.getConfiguration(), rootDir);<a name="line.4657"></a>
+<span class="sourceLineNo">4658</span><a name="line.4658"></a>
+<span class="sourceLineNo">4659</span>    byte[][] families = new byte[][] {<a name="line.4659"></a>
+<span class="sourceLineNo">4660</span>        Bytes.toBytes("cf1"), Bytes.toBytes("cf2"), Bytes.toBytes("cf3")<a name="line.4660"></a>
+<span class="sourceLineNo">4661</span>    };<a name="line.4661"></a>
+<span class="sourceLineNo">4662</span>    byte[] cq = Bytes.toBytes("cq");<a name="line.4662"></a>
+<span class="sourceLineNo">4663</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.4663"></a>
+<span class="sourceLineNo">4664</span>    for (byte[] family : families) {<a name="line.4664"></a>
+<span class="sourceLineNo">4665</span>      htd.addFamily(new HColumnDescriptor(family));<a name="line.4665"></a>
+<span class="sourceLineNo">4666</span>    }<a name="line.4666"></a>
 <span class="sourceLineNo">4667</span><a name="line.4667"></a>
-<span class="sourceLineNo">4668</span>    try {<a name="line.4668"></a>
-<span class="sourceLineNo">4669</span>      primaryRegion = HBaseTestingUtility.createRegionAndWAL(primaryHri,<a name="line.4669"></a>
-<span class="sourceLineNo">4670</span>          rootDir, TEST_UTIL.getConfiguration(), htd);<a name="line.4670"></a>
-<span class="sourceLineNo">4671</span><a name="line.4671"></a>
-<span class="sourceLineNo">4672</span>      // load some data<a name="line.4672"></a>
-<span class="sourceLineNo">4673</span>      putData(primaryRegion, 0, 1000, cq, families);<a name="line.4673"></a>
-<span class="sourceLineNo">4674</span><a name="line.4674"></a>
-<span class="sourceLineNo">4675</span>      // flush region<a name="line.4675"></a>
-<span class="sourceLineNo">4676</span>      primaryRegion.flush(true);<a name="line.4676"></a>
+<span class="sourceLineNo">4668</span>    long time = System.currentTimeMillis();<a name="line.4668"></a>
+<span class="sourceLineNo">4669</span>    HRegionInfo primaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4669"></a>
+<span class="sourceLineNo">4670</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4670"></a>
+<span class="sourceLineNo">4671</span>      false, time, 0);<a name="line.4671"></a>
+<span class="sourceLineNo">4672</span>    HRegionInfo secondaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4672"></a>
+<span class="sourceLineNo">4673</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4673"></a>
+<span class="sourceLineNo">4674</span>      false, time, 1);<a name="line.4674"></a>
+<span class="sourceLineNo">4675</span><a name="line.4675"></a>
+<span class="sourceLineNo">4676</span>    HRegion primaryRegion = null, secondaryRegion = null;<a name="line.4676"></a>
 <span class="sourceLineNo">4677</span><a name="line.4677"></a>
-<span class="sourceLineNo">4678</span>      // open secondary region<a name="line.4678"></a>
-<span class="sourceLineNo">4679</span>      secondaryRegion = HRegion.openHRegion(rootDir, secondaryHri, htd, null, CONF);<a name="line.4679"></a>
-<span class="sourceLineNo">4680</span><a name="line.4680"></a>
-<span class="sourceLineNo">4681</span>      // move the file of the primary region to the archive, simulating a compaction<a name="line.4681"></a>
-<span class="sourceLineNo">4682</span>      Collection&lt;HStoreFile&gt; storeFiles = primaryRegion.getStore(families[0]).getStorefiles();<a name="line.4682"></a>
-<span class="sourceLineNo">4683</span>      primaryRegion.getRegionFileSystem().removeStoreFiles(Bytes.toString(families[0]), storeFiles);<a name="line.4683"></a>
-<span class="sourceLineNo">4684</span>      Collection&lt;StoreFileInfo&gt; storeFileInfos = primaryRegion.getRegionFileSystem()<a name="line.4684"></a>
-<span class="sourceLineNo">4685</span>          .getStoreFiles(families[0]);<a name="line.4685"></a>
-<span class="sourceLineNo">4686</span>      Assert.assertTrue(storeFileInfos == null || storeFileInfos.isEmpty());<a name="line.4686"></a>
+<span class="sourceLineNo">4678</span>    try {<a name="line.4678"></a>
+<span class="sourceLineNo">4679</span>      primaryRegion = HBaseTestingUtility.createRegionAndWAL(primaryHri,<a name="line.4679"></a>
+<span class="sourceLineNo">4680</span>          rootDir, TEST_UTIL.getConfiguration(), htd);<a name="line.4680"></a>
+<span class="sourceLineNo">4681</span><a name="line.4681"></a>
+<span class="sourceLineNo">4682</span>      // load some data<a name="line.4682"></a>
+<span class="sourceLineNo">4683</span>      putData(primaryRegion, 0, 1000, cq, families);<a name="line.4683"></a>
+<span class="sourceLineNo">4684</span><a name="line.4684"></a>
+<span class="sourceLineNo">4685</span>      // flush region<a name="line.4685"></a>
+<span class="sourceLineNo">4686</span>      primaryRegion.flush(true);<a name="line.4686"></a>
 <span class="sourceLineNo">4687</span><a name="line.4687"></a>
-<span class="sourceLineNo">4688</span>      verifyData(secondaryRegion, 0, 1000, cq, families);<a name="line.4688"></a>
-<span class="sourceLineNo">4689</span>    } finally {<a name="line.4689"></a>
-<span class="sourceLineNo">4690</span>      if (primaryRegion != null) {<a name="line.4690"></a>
-<span class="sourceLineNo">4691</span>        HBaseTestingUtility.closeRegionAndWAL(primaryRegion);<a name="line.4691"></a>
-<span class="sourceLineNo">4692</span>      }<a name="line.4692"></a>
-<span class="sourceLineNo">4693</span>      if (secondaryRegion != null) {<a name="line.4693"></a>
-<span class="sourceLineNo">4694</span>        HBaseTestingUtility.closeRegionAndWAL(secondaryRegion);<a name="line.4694"></a>
-<span class="sourceLineNo">4695</span>      }<a name="line.4695"></a>
-<span class="sourceLineNo">4696</span>    }<a name="line.4696"></a>
-<span class="sourceLineNo">4697</span>  }<a name="line.4697"></a>
-<span class="sourceLineNo">4698</span><a name="line.4698"></a>
-<span class="sourceLineNo">4699</span>  private void putData(int startRow, int numRows, byte[] qf, byte[]... families) throws<a name="line.4699"></a>
-<span class="sourceLineNo">4700</span>      IOException {<a name="line.4700"></a>
-<span class="sourceLineNo">4701</span>    putData(this.region, startRow, numRows, qf, families);<a name="line.4701"></a>
-<span class="sourceLineNo">4702</span>  }<a name="line.4702"></a>
-<span class="sourceLineNo">4703</span><a name="line.4703"></a>
-<span class="sourceLineNo">4704</span>  private void putData(HRegion region,<a name="line.4704"></a>
-<span class="sourceLineNo">4705</span>      int startRow, int numRows, byte[] qf, byte[]... families) throws IOException {<a name="line.4705"></a>
-<span class="sourceLineNo">4706</span>    putData(region, Durability.SKIP_WAL, startRow, numRows, qf, families);<a name="line.4706"></a>
+<span class="sourceLineNo">4688</span>      // open secondary region<a name="line.4688"></a>
+<span class="sourceLineNo">4689</span>      secondaryRegion = HRegion.openHRegion(rootDir, secondaryHri, htd, null, CONF);<a name="line.4689"></a>
+<span class="sourceLineNo">4690</span><a name="line.4690"></a>
+<span class="sourceLineNo">4691</span>      // move the file of the primary region to the archive, simulating a compaction<a name="line.4691"></a>
+<span class="sourceLineNo">4692</span>      Collection&lt;HStoreFile&gt; storeFiles = primaryRegion.getStore(families[0]).getStorefiles();<a name="line.4692"></a>
+<span class="sourceLineNo">4693</span>      primaryRegion.getRegionFileSystem().removeStoreFiles(Bytes.toString(families[0]), storeFiles);<a name="line.4693"></a>
+<span class="sourceLineNo">4694</span>      Collection&lt;StoreFileInfo&gt; storeFileInfos = primaryRegion.getRegionFileSystem()<a name="line.4694"></a>
+<span class="sourceLineNo">4695</span>          .getStoreFiles(families[0]);<a name="line.4695"></a>
+<span class="sourceLineNo">4696</span>      Assert.assertTrue(storeFileInfos == null || storeFileInfos.isEmpty());<a name="line.4696"></a>
+<span class="sourceLineNo">4697</span><a name="line.4697"></a>
+<span class="sourceLineNo">4698</span>      verifyData(secondaryRegion, 0, 1000, cq, families);<a name="line.4698"></a>
+<span class="sourceLineNo">4699</span>    } finally {<a name="line.4699"></a>
+<span class="sourceLineNo">4700</span>      if (primaryRegion != null) {<a name="line.4700"></a>
+<span class="sourceLineNo">4701</span>        HBaseTestingUtility.closeRegionAndWAL(primaryRegion);<a name="line.4701"></a>
+<span class="sourceLineNo">4702</span>      }<a name="line.4702"></a>
+<span class="sourceLineNo">4703</span>      if (secondaryRegion != null) {<a name="line.4703"></a>
+<span class="sourceLineNo">4704</span>        HBaseTestingUtility.closeRegionAndWAL(secondaryRegion);<a name="line.4704"></a>
+<span class="sourceLineNo">4705</span>      }<a name="line.4705"></a>
+<span class="sourceLineNo">4706</span>    }<a name="line.4706"></a>
 <span class="sourceLineNo">4707</span>  }<a name="line.4707"></a>
 <span class="sourceLineNo">4708</span><a name="line.4708"></a>
-<span class="sourceLineNo">4709</span>  static void putData(HRegion region, Durability durability,<a name="line.4709"></a>
-<span class="sourceLineNo">4710</span>      int startRow, int numRows, byte[] qf, byte[]... families) throws IOException {<a name="line.4710"></a>
-<span class="sourceLineNo">4711</span>    for (int i = startRow; i &lt; startRow + numRows; i++) {<a name="line.4711"></a>
-<span class="sourceLineNo">4712</span>      Put put = new Put(Bytes.toBytes("" + i));<a name="line.4712"></a>
-<span class="sourceLineNo">4713</span>      put.setDurability(durability);<a name="line.4713"></a>
-<span class="sourceLineNo">4714</span>      for (byte[] family : families) {<a name="line.4714"></a>
-<span class="sourceLineNo">4715</span>        put.addColumn(family, qf, null);<a name="line.4715"></a>
-<span class="sourceLineNo">4716</span>      }<a name="line.4716"></a>
-<span class="sourceLineNo">4717</span>      region.put(put);<a name="line.4717"></a>
-<span class="sourceLineNo">4718</span>      LOG.info(put.toString());<a name="line.4718"></a>
-<span class="sourceLineNo">4719</span>    }<a name="line.4719"></a>
-<span class="sourceLineNo">4720</span>  }<a name="line.4720"></a>
-<span class="sourceLineNo">4721</span><a name="line.4721"></a>
-<span class="sourceLineNo">4722</span>  static void verifyData(HRegion newReg, int startRow, int numRows, byte[] qf, byte[]... families)<a name="line.4722"></a>
-<span class="sourceLineNo">4723</span>      throws IOException {<a name="line.4723"></a>
-<span class="sourceLineNo">4724</span>    for (int i = startRow; i &lt; startRow + numRows; i++) {<a name="line.4724"></a>
-<span class="sourceLineNo">4725</span>      byte[] row = Bytes.toBytes("" + i);<a name="line.4725"></a>
-<span class="sourceLineNo">4726</span>      Get get = new Get(row);<a name="line.4726"></a>
-<span class="sourceLineNo">4727</span>      for (byte[] family : families) {<a name="line.4727"></a>
-<span class="sourceLineNo">4728</span>        get.addColumn(family, qf);<a name="line.4728"></a>
-<span class="sourceLineNo">4729</span>      }<a name="line.4729"></a>
-<span class="sourceLineNo">4730</span>      Result result = newReg.get(get);<a name="line.4730"></a>
-<span class="sourceLineNo">4731</span>      Cell[] raw = result.rawCells();<a name="line.4731"></a>
-<span class="sourceLineNo">4732</span>      assertEquals(families.length, result.size());<a name="line.4732"></a>
-<span class="sourceLineNo">4733</span>      for (int j = 0; j &lt; families.length; j++) {<a name="line.4733"></a>
-<span class="sourceLineNo">4734</span>        assertTrue(CellUtil.matchingRows(raw[j], row));<a name="line.4734"></a>
-<span class="sourceLineNo">4735</span>        assertTrue(CellUtil.matchingFamily(raw[j], families[j]));<a name="line.4735"></a>
-<span class="sourceLineNo">4736</span>        assertTrue(CellUtil.matchingQualifier(raw[j], qf));<a name="line.4736"></a>
-<span class="sourceLineNo">4737</span>      }<a name="line.4737"></a>
-<span class="sourceLineNo">4738</span>    }<a name="line.4738"></a>
-<span class="sourceLineNo">4739</span>  }<a name="line.4739"></a>
-<span class="sourceLineNo">4740</span><a name="line.4740"></a>
-<span class="sourceLineNo">4741</span>  static void assertGet(final HRegion r, final byte[] family, final byte[] k) throws IOException {<a name="line.4741"></a>
-<span class="sourceLineNo">4742</span>    // Now I have k, get values out and assert they are as expected.<a name="line.4742"></a>
-<span class="sourceLineNo">4743</span>    Get get = new Get(k).addFamily(family).readAllVersions();<a name="line.4743"></a>
-<span class="sourceLineNo">4744</span>    Cell[] results = r.get(get).rawCells();<a name="line.4744"></a>
-<span class="sourceLineNo">4745</span>    for (int j = 0; j &lt; results.length; j++) {<a name="line.4745"></a>
-<span class="sourceLineNo">4746</span>      byte[] tmp = CellUtil.cloneValue(results[j]);<a name="line.4746"></a>
-<span class="sourceLineNo">4747</span>      // Row should be equal to value every time.<a name="line.4747"></a>
-<span class="sourceLineNo">4748</span>      assertTrue(Bytes.equals(k, tmp));<a name="line.4748"></a>
-<span class="sourceLineNo">4749</span>    }<a name="line.4749"></a>
-<span class="sourceLineNo">4750</span>  }<a name="line.4750"></a>
-<span class="sourceLineNo">4751</span><a name="line.4751"></a>
-<span class="sourceLineNo">4752</span>  /*<a name="line.4752"></a>
-<span class="sourceLineNo">4753</span>   * Assert first value in the passed region is &lt;code&gt;firstValue&lt;/code&gt;.<a name="line.4753"></a>
-<span class="sourceLineNo">4754</span>   *<a name="line.4754"></a>
-<span class="sourceLineNo">4755</span>   * @param r<a name="line.4755"></a>
-<span class="sourceLineNo">4756</span>   *<a name="line.4756"></a>
-<span class="sourceLineNo">4757</span>   * @param fs<a name="line.4757"></a>
-<span class="sourceLineNo">4758</span>   *<a name="line.4758"></a>
-<span class="sourceLineNo">4759</span>   * @param firstValue<a name="line.4759"></a>
-<span class="sourceLineNo">4760</span>   *<a name="line.4760"></a>
-<span class="sourceLineNo">4761</span>   * @throws IOException<a name="line.4761"></a>
-<span class="sourceLineNo">4762</span>   */<a name="line.4762"></a>
-<span class="sourceLineNo">4763</span>  protected void assertScan(final HRegion r, final byte[] fs, final byte[] firstValue)<a name="line.4763"></a>
-<span class="sourceLineNo">4764</span>      throws IOException {<a name="line.4764"></a>
-<span class="sourceLineNo">4765</span>    byte[][] families = { fs };<a name="line.4765"></a>
-<span class="sourceLineNo">4766</span>    Scan scan = new Scan();<a name="line.4766"></a>
-<span class="sourceLineNo">4767</span>    for (int i = 0; i &lt; families.length; i++)<a name="line.4767"></a>
-<span class="sourceLineNo">4768</span>      scan.addFamily(families[i]);<a name="line.4768"></a>
-<span class="sourceLineNo">4769</span>    InternalScanner s = r.getScanner(scan);<a name="line.4769"></a>
-<span class="sourceLineNo">4770</span>    try {<a name="line.4770"></a>
-<span class="sourceLineNo">4771</span>      List&lt;Cell&gt; curVals = new ArrayList&lt;&gt;();<a name="line.4771"></a>
-<span class="sourceLineNo">4772</span>      boolean first = true;<a name="line.4772"></a>
-<span class="sourceLineNo">4773</span>      OUTER_LOOP: while (s.next(curVals)) {<a name="line.4773"></a>
-<span class="sourceLineNo">4774</span>        for (Cell kv : curVals) {<a name="line.4774"></a>
-<span class="sourceLineNo">4775</span>          byte[] val = CellUtil.cloneValue(kv);<a name="line.4775"></a>
-<span class="sourceLineNo">4776</span>          byte[] curval = val;<a name="line.4776"></a>
-<span class="sourceLineNo">4777</span>          if (first) {<a name="line.4777"></a>
-<span class="sourceLineNo">4778</span>            first = false;<a name="line.4778"></a>
-<span class="sourceLineNo">4779</span>            assertTrue(Bytes.compareTo(curval, firstValue) == 0);<a name="line.4779"></a>
-<span class="sourceLineNo">4780</span>          } else {<a name="line.4780"></a>
-<span class="sourceLineNo">4781</span>            // Not asserting anything. Might as well break.<a name="line.4781"></a>
-<span class="sourceLineNo">4782</span>            break OUTER_LOOP;<a name="line.4782"></a>
-<span class="sourceLineNo">4783</span>          }<a name="line.4783"></a>
-<span class="sourceLineNo">4784</span>        }<a name="line.4784"></a>
-<span class="sourceLineNo">4785</span>      }<a name="line.4785"></a>
-<span class="sourceLineNo">4786</span>    } finally {<a name="line.4786"></a>
-<span class="sourceLineNo">4787</span>      s.close();<a name="line.4787"></a>
-<span class="sourceLineNo">4788</span>    }<a name="line.4788"></a>
-<span class="sourceLineNo">4789</span>  }<a name="line.4789"></a>
-<span class="sourceLineNo">4790</span><a name="line.4790"></a>
-<span class="sourceLineNo">4791</span>  /**<a name="line.4791"></a>
-<span class="sourceLineNo">4792</span>   * Test that we get the expected flush results back<a name="line.4792"></a>
-<span class="sourceLineNo">4793</span>   */<a name="line.4793"></a>
-<span class="sourceLineNo">4794</span>  @Test<a name="line.4794"></a>
-<span class="sourceLineNo">4795</span>  public void testFlushResult() throws IOException {<a name="line.4795"></a>
-<span class="sourceLineNo">4796</span>    byte[] family = Bytes.toBytes("family");<a name="line.4796"></a>
-<span class="sourceLineNo">4797</span><a name="line.4797"></a>
-<span class="sourceLineNo">4798</span>    this.region = initHRegion(tableName, method, family);<a name="line.4798"></a>
-<span class="sourceLineNo">4799</span><a name="line.4799"></a>
-<span class="sourceLineNo">4800</span>    // empty memstore, flush doesn't run<a name="line.4800"></a>
-<span class="sourceLineNo">4801</span>    HRegion.FlushResult fr = region.flush(true);<a name="line.4801"></a>
-<span class="sourceLineNo">4802</span>    assertFalse(fr.isFlushSucceeded());<a name="line.4802"></a>
-<span class="sourceLineNo">4803</span>    assertFalse(fr.isCompactionNeeded());<a name="line.4803"></a>
-<span class="sourceLineNo">4804</span><a name="line.4804"></a>
-<span class="sourceLineNo">4805</span>    // Flush enough files to get up to the threshold, doesn't need compactions<a name="line.4805"></a>
-<span class="sourceLineNo">4806</span>    for (int i = 0; i &lt; 2; i++) {<a name="line.4806"></a>
-<span class="sourceLineNo">4807</span>      Put put = new Put(tableName.toBytes()).addColumn(family, family, tableName.toBytes());<a name="line.4807"></a>
-<span class="sourceLineNo">4808</span>      region.put(put);<a name="line.4808"></a>
-<span class="sourceLineNo">4809</span>      fr = region.flush(true);<a name="line.4809"></a>
-<span class="sourceLineNo">4810</span>      assertTrue(fr.isFlushSucceeded());<a name="line.4810"></a>
-<span class="sourceLineNo">4811</span>      assertFalse(fr.isCompactionNeeded());<a name="line.4811"></a>
-<span class="sourceLineNo">4812</span>    }<a name="line.4812"></a>
-<span class="sourceLineNo">4813</span><a name="line.4813"></a>
-<span class="sourceLineNo">4814</span>    // Two flushes after the threshold, compactions are needed<a name="line.4814"></a>
-<span class="sourceLineNo">4815</span>    for (int i = 0; i &lt; 2; i++) {<a name="line.4815"></a>
-<span class="sourceLineNo">4816</span>      Put put = new Put(tableName.toBytes()).addColumn(family, family, tableName.toBytes());<a name="line.4816"></a>
-<span class="sourceLineNo">4817</span>      region.put(put);<a name="line.4817"></a>
-<span class="sourceLineNo">4818</span>      fr = region.flush(true);<a name="line.4818"></a>
-<span class="sourceLineNo">4819</span>      assertTrue(fr.isFlushSucceeded());<a name="line.4819"></a>
-<span class="sourceLineNo">4820</span>      assertTrue(fr.isCompactionNeeded());<a name="line.4820"></a>
-<span class="sourceLineNo">4821</span>    }<a name="line.4821"></a>
-<span class="sourceLineNo">4822</span>  }<a name="line.4822"></a>
+<span class="sourceLineNo">4709</span>  private void putData(int startRow, int numRows, byte[] qf, byte[]... families) throws<a name="line.4709"></a>
+<span class="sourceLineNo">4710</span>      IOException {<a name="line.4710"></a>
+<span class="sourceLineNo">4711</span>    putData(this.region, startRow, numRows, qf, families);<a name="line.4711"></a>
+<span class="sourceLineNo">4712</span>  }<a name="line.4712"></a>
+<span class="sourceLineNo">4713</span><a name="line.4713"></a>
+<span class="sourceLineNo">4714</span>  private void putData(HRegion region,<a name="line.4714"></a>
+<span class="sourceLineNo">4715</span>      int startRow, int numRows, byte[] qf, byte[]... families) throws IOException {<a name="line.4715"></a>
+<span class="sourceLineNo">4716</span>    putData(region, Durability.SKIP_WAL, startRow, numRows, qf, families);<a name="line.4716"></a>
+<span class="sourceLineNo">4717</span>  }<a name="line.4717"></a>
+<span class="sourceLineNo">4718</span><a name="line.4718"></a>
+<span class="sourceLineNo">4719</span>  static void putData(HRegion region, Durability durability,<a name="line.4719"></a>
+<span class="sourceLineNo">4720</span>      int startRow, int numRows, byte[] qf, byte[]... families) throws IOException {<a name="line.4720"></a>
+<span class="sourceLineNo">4721</span>    for (int i = startRow; i &lt; startRow + numRows; i++) {<a name="line.4721"></a>
+<span class="sourceLineNo">4722</span>      Put put = new Put(Bytes.toBytes("" + i));<a name="line.4722"></a>
+<span class="sourceLineNo">4723</span>      put.setDurability(durability);<a name="line.4723"></a>
+<span class="sourceLineNo">4724</span>      for (byte[] family : families) {<a name="line.4724"></a>
+<span class="sourceLineNo">4725</span>        put.addColumn(family, qf, null);<a name="line.4725"></a>
+<span class="sourceLineNo">4726</span>      }<a name="line.4726"></a>
+<span class="sourceLineNo">4727</span>      region.put(put);<a name="line.4727"></a>
+<span class="sourceLineNo">4728</span>      LOG.info(put.toString());<a name="line.4728"></a>
+<span class="sourceLineNo">4729</span>    }<a name="line.4729"></a>
+<span class="sourceLineNo">4730</span>  }<a name="line.4730"></a>
+<span class="sourceLineNo">4731</span><a name="line.4731"></a>
+<span class="sourceLineNo">4732</span>  static void verifyData(HRegion newReg, int startRow, int numRows, byte[] qf, byte[]... families)<a name="line.4732"></a>
+<span class="sourceLineNo">4733</span>      throws IOException {<a name="line.4733"></a>
+<span class="sourceLineNo">4734</span>    for (int i = startRow; i &lt; startRow + numRows; i++) {<a name="line.4734"></a>
+<span class="sourceLineNo">4735</span>      byte[] row = Bytes.toBytes("" + i);<a name="line.4735"></a>
+<span class="sourceLineNo">4736</span>      Get get = new Get(row);<a name="line.4736"></a>
+<span class="sourceLineNo">4737</span>      for (byte[] family : families) {<a name="line.4737"></a>
+<span class="sourceLineNo">4738</span>        get.addColumn(family, qf);<a name="line.4738"></a>
+<span class="sourceLineNo">4739</span>      }<a name="line.4739"></a>
+<span class="sourceLineNo">4740</span>      Result result = newReg.get(get);<a name="line.4740"></a>
+<span class="sourceLineNo">4741</span>      Cell[] raw = result.rawCells();<a name="line.4741"></a>
+<span class="sourceLineNo">4742</span>      assertEquals(families.length, result.size());<a name="line.4742"></a>
+<span class="sourceLineNo">4743</span>      for (int j = 0; j &lt; families.length; j++) {<a name="line.4743"></a>
+<span class="sourceLineNo">4744</span>        assertTrue(CellUtil.matchingRows(raw[j], row));<a name="line.4744"></a>
+<span class="sourceLineNo">4745</span>        assertTrue(CellUtil.matchingFamily(raw[j], families[j]));<a name="line.4745"></a>
+<span class="sourceLineNo">4746</span>        assertTrue(CellUtil.matchingQualifier(raw[j], qf));<a name="line.4746"></a>
+<span class="sourceLineNo">4747</span>      }<a name="line.4747"></a>
+<span class="sourceLineNo">4748</span>    }<a name="line.4748"></a>
+<span class="sourceLineNo">4749</span>  }<a name="line.4749"></a>
+<span class="sourceLineNo">4750</span><a name="line.4750"></a>
+<span class="sourceLineNo">4751</span>  static void assertGet(final HRegion r, final byte[] family, final byte[] k) throws IOException {<a name="line.4751"></a>
+<span class="sourceLineNo">4752</span>    // Now I have k, get values out and assert they are as expected.<a name="line.4752"></a>
+<span class="sourceLineNo">4753</span>    Get get = new Get(k).addFamily(family).readAllVersions();<a name="line.4753"></a>
+<span class="sourceLineNo">4754</span>    Cell[] results = r.get(get).rawCells();<a name="line.4754"></a>
+<span class="sourceLineNo">4755</span>    for (int j = 0; j &lt; results.length; j++) {<a name="line.4755"></a>
+<span class="sourceLineNo">4756</span>      byte[] tmp = CellUtil.cloneValue(results[j]);<a name="line.4756"></a>
+<span class="sourceLineNo">4757</span>      // Row should be equal to value every time.<a name="line.4757"></a>
+<span class="sourceLineNo">4758</span>      assertTrue(Bytes.equals(k, tmp));<a name="line.4758"></a>
+<span class="sourceLineNo">4759</span>    }<a name="line.4759"></a>
+<span class="sourceLineNo">4760</span>  }<a name="line.4760"></a>
+<span class="sourceLineNo">4761</span><a name="line.4761"></a>
+<span class="sourceLineNo">4762</span>  /*<a name="line.4762"></a>
+<span class="sourceLineNo">4763</span>   * Assert first value in the passed region is &lt;code&gt;firstValue&lt;/code&gt;.<a name="line.4763"></a>
+<span class="sourceLineNo">4764</span>   *<a name="line.4764"></a>
+<span class="sourceLineNo">4765</span>   * @param r<a name="line.4765"></a>
+<span class="sourceLineNo">4766</span>   *<a name="line.4766"></a>
+<span class="sourceLineNo">4767</span>   * @param fs<a name="line.4767"></a>
+<span class="sourceLineNo">4768</span>   *<a name="line.4768"></a>
+<span class="sourceLineNo">4769</span>   * @param firstValue<a name="line.4769"></a>
+<span class="sourceLineNo">4770</span>   *<a name="line.4770"></a>
+<span class="sourceLineNo">4771</span>   * @throws IOException<a name="line.4771"></a>
+<span class="sourceLineNo">4772</span>   */<a name="line.4772"></a>
+<span class="sourceLineNo">4773</span>  protected void assertScan(final HRegion r, final byte[] fs, final byte[] firstValue)<a name="line.4773"></a>
+<span class="sourceLineNo">4774</span>      throws IOException {<a name="line.4774"></a>
+<span class="sourceLineNo">4775</span>    byte[][] families = { fs };<a name="line.4775"></a>
+<span class="sourceLineNo">4776</span>    Scan scan = new Scan();<a name="line.4776"></a>
+<span class="sourceLineNo">4777</span>    for (int i = 0; i &lt; families.length; i++)<a name="line.4777"></a>
+<span class="sourceLineNo">4778</span>      scan.addFamily(families[i]);<a name="line.4778"></a>
+<span class="sourceLineNo">4779</span>    InternalScanner s = r.getScanner(scan);<a name="line.4779"></a>
+<span class="sourceLineNo">4780</span>    try {<a name="line.4780"></a>
+<span class="sourceLineNo">4781</span>      List&lt;Cell&gt; curVals = new ArrayList&lt;&gt;();<a name="line.4781"></a>
+<span class="sourceLineNo">4782</span>      boolean first = true;<a name="line.4782"></a>
+<span class="sourceLineNo">4783</span>      OUTER_LOOP: while (s.next(curVals)) {<a name="line.4783"></a>
+<span class="sourceLineNo">4784</span>        for (Cell kv : curVals) {<a name="line.4784"></a>
+<span class="sourceLineNo">4785</span>          byte[] val = CellUtil.cloneValue(kv);<a name="line.4785"></a>
+<span class="sourceLineNo">4786</span>          byte[] curval = val;<a name="line.4786"></a>
+<span class="sourceLineNo">4787</span>          if (first) {<a name="line.4787"></a>
+<span class="sourceLineNo">4788</span>            first = false;<a name="line.4788"></a>
+<span class="sourceLineNo">4789</span>            assertTrue(Bytes.compareTo(curval, firstValue) == 0);<a name="line.4789"></a>
+<span class="sourceLineNo">4790</span>          } else {<a name="line.4790"></a>
+<span class="sourceLineNo">4791</span>            // Not asserting anything. Might as well break.<a name="line.4791"></a>
+<span class="sourceLineNo">4792</span>            break OUTER_LOOP;<a name="line.4792"></a>
+<span class="sourceLineNo">4793</span>          }<a name="line.4793"></a>
+<span class="sourceLineNo">4794</span>        }<a name="line.4794"></a>
+<span class="sourceLineNo">4795</span>      }<a name="line.4795"></a>
+<span class="sourceLineNo">4796</span>    } finally {<a name="line.4796"></a>
+<span class="sourceLineNo">4797</span>      s.close();<a name="line.4797"></a>
+<span class="sourceLineNo">4798</span>    }<a name="line.4798"></a>
+<span class="sourceLineNo">4799</span>  }<a name="line.4799"></a>
+<span class="sourceLineNo">4800</span><a name="line.4800"></a>
+<span class="sourceLineNo">4801</span>  /**<a name="line.4801"></a>
+<span class="sourceLineNo">4802</span>   * Test that we get the expected flush results back<a name="line.4802"></a>
+<span class="sourceLineNo">4803</span>   */<a name="line.4803"></a>
+<span class="sourceLineNo">4804</span>  @Test<a name="line.4804"></a>
+<span class="sourceLineNo">4805</span>  public void testFlushResult() throws IOException {<a name="line.4805"></a>
+<span class="sourceLineNo">4806</span>    byte[] family = Bytes.toBytes("family");<a name="line.4806"></a>
+<span class="sourceLineNo">4807</span><a name="line.4807"></a>
+<span class="sourceLineNo">4808</span>    this.region = initHRegion(tableName, method, family);<a name="line.4808"></a>
+<span class="sourceLineNo">4809</span><a name="line.4809"></a>
+<span class="sourceLineNo">4810</span>    // empty memstore, flush doesn't run<a name="line.4810"></a>
+<span class="sourceLineNo">4811</span>    HRegion.FlushResult fr = region.flush(true);<a name="line.4811"></a>
+<span class="sourceLineNo">4812</span>    assertFalse(fr.isFlushSucceeded());<a name="line.4812"></a>
+<span class="sourceLineNo">4813</span>    assertFalse(fr.isCompactionNeeded());<a name="line.4813"></a>
+<span class="sourceLineNo">4814</span><a name="line.4814"></a>
+<span class="sourceLineNo">4815</span>    // Flush enough files to get up to the threshold, doesn't need compactions<a name="line.4815"></a>
+<span class="sourceLineNo">4816</span>    for (int i = 0; i &lt; 2; i++) {<a name="line.4816"></a>
+<span class="sourceLineNo">4817</span>      Put put = new Put(tableName.toBytes()).addColumn(family, family, tableName.toBytes());<a name="line.4817"></a>
+<span class="sourceLineNo">4818</span>      region.put(put);<a name="line.4818"></a>
+<span class="sourceLineNo">4819</span>      fr = region.flush(true);<a name="line.4819"></a>
+<span class="sourceLineNo">4820</span>      assertTrue(fr.isFlushSucceeded());<a name="line.4820"></a>
+<span class="sourceLineNo">4821</span>      assertFalse(fr.isCompactionNeeded());<a name="line.4821"></a>
+<span class="sourceLineNo">4822</span>    }<a name="line.4822"></a>
 <span class="sourceLineNo">4823</span><a name="line.4823"></a>
-<span class="sourceLineNo">4824</span>  protected Configuration initSplit() {<a name="line.4824"></a>
-<span class="sourceLineNo">4825</span>    // Always compact if there is more than one store file.<a name="line.4825"></a>
-<span class="sourceLineNo">4826</span>    CONF.setInt("hbase.hstore.compactionThreshold", 2);<a name="line.4826"></a>
-<span class="sourceLineNo">4827</span><a name="line.4827"></a>
-<span class="sourceLineNo">4828</span>    CONF.setInt(HConstants.HBASE_CLIENT_SCANNER_TIMEOUT_PERIOD, 10 * 1000);<a name="line.4828"></a>
-<span class="sourceLineNo">4829</span><a name="line.4829"></a>
-<span class="sourceLineNo">4830</span>    // Increase the amount of time between client retries<a name="line.4830"></a>
-<span class="sourceLineNo">4831</span>    CONF.setLong("hbase.client.pause", 15 * 1000);<a name="line.4831"></a>
-<span class="sourceLineNo">4832</span><a name="line.4832"></a>
-<span class="sourceLineNo">4833</span>    // This size should make it so we always split using the addContent<a name="line.4833"></a>
-<span class="sourceLineNo">4834</span>    // below. After adding all data, the first region is 1.3M<a name="line.4834"></a>
-<span class="sourceLineNo">4835</span>    CONF.setLong(HConstants.HREGION_MAX_FILESIZE, 1024 * 128);<a name="line.4835"></a>
-<span class="sourceLineNo">4836</span>    return CONF;<a name="line.4836"></a>
-<span class="sourceLineNo">4837</span>  }<a name="line.4837"></a>
-<span class="sourceLineNo">4838</span><a name="line.4838"></a>
-<span class="sourceLineNo">4839</span>  /**<a name="line.4839"></a>
-<span class="sourceLineNo">4840</span>   * @return A region on which you must call<a name="line.4840"></a>
-<span class="sourceLineNo">4841</span>   *         {@link HBaseTestingUtility#closeRegionAndWAL(HRegion)} when done.<a name="line.4841"></a>
-<span class="sourceLineNo">4842</span>   */<a name="line.4842"></a>
-<span class="sourceLineNo">4843</span>  protected HRegion initHRegion(TableName tableName, String callingMethod, Configuration conf,<a name="line.4843"></a>
-<span class="sourceLineNo">4844</span>      byte[]... families) throws IOException {<a name="line.4844"></a>
-<span class="sourceLineNo">4845</span>    return initHRegion(tableName, callingMethod, conf, false, families);<a name="line.4845"></a>
-<span class="sourceLineNo">4846</span>  }<a name="line.4846"></a>
-<span class="sourceLineNo">4847</span><a name="line.4847"></a>
-<span class="sourceLineNo">4848</span>  /**<a name="line.4848"></a>
-<span class="sourceLineNo">4849</span>   * @return A region on which you must call<a name="line.4849"></a>
-<span class="sourceLineNo">4850</span>   *         {@link HBaseTestingUtility#closeRegionAndWAL(HRegion)} when done.<a name="line.4850"></a>
-<span class="sourceLineNo">4851</span>   */<a name="line.4851"></a>
-<span class="sourceLineNo">4852</span>  protected HRegion initHRegion(TableName tableName, String callingMethod, Configuration conf,<a name="line.4852"></a>
-<span class="sourceLineNo">4853</span>      boolean isReadOnly, byte[]... families) throws IOException {<a name="line.4853"></a>
-<span class="sourceLineNo">4854</span>    return initHRegion(tableName, null, null, callingMethod, conf, isReadOnly, families);<a name="line.4854"></a>
-<span class="sourceLineNo">4855</span>  }<a name="line.4855"></a>
-<span class="sourceLineNo">4856</span><a name="line.4856"></a>
-<span class="sourceLineNo">4857</span>  protected HRegion initHRegion(TableName tableName, byte[] startKey, byte[] stopKey,<a name="line.4857"></a>
-<span class="sourceLineNo">4858</span>      String callingMethod, Configuration conf, boolean isReadOnly, byte[]... families)<a name="line.4858"></a>
-<span class="sourceLineNo">4859</span>      throws IOException {<a name="line.4859"></a>
-<span class="sourceLineNo">4860</span>    Path logDir = TEST_UTIL.getDataTestDirOnTestFS(callingMethod + ".log");<a name="line.4860"></a>
-<span class="sourceLineNo">4861</span>    ChunkCreator.initialize(MemStoreLABImpl.CHUNK_SIZE_DEFAULT, false, 0, 0, 0, null);<a name="line.4861"></a>
-<span class="sourceLineNo">4862</span>    HRegionInfo hri = new HRegionInfo(tableName, startKey, stopKey);<a name="line.4862"></a>
-<span class="sourceLineNo">4863</span>    final WAL wal = HBaseTestingUtility.createWal(conf, logDir, hri);<a name="line.4863"></a>
-<span class="sourceLineNo">4864</span>    return initHRegion(tableName, startKey, stopKey, isReadOnly,<a name="line.4864"></a>
-<span class="sourceLineNo">4865</span>        Durability.SYNC_WAL, wal, families);<a name="line.4865"></a>
-<span class="sourceLineNo">4866</span>  }<a name="line.4866"></a>
-<span class="sourceLineNo">4867</span><a name="line.4867"></a>
-<span class="sourceLineNo">4868</span>  /**<a name="line.4868"></a>
-<span class="sourceLineNo">4869</span>   * @return A region on which you must call<a name="line.4869"></a>
-<span class="sourceLineNo">4870</span>   *         {@link HBaseTestingUtility#closeRegionAndWAL(HRegion)} when done.<a name="line.4870"></a>
-<span class="sourceLineNo">4871</span>   */<a name="line.4871"></a>
-<span class="sourceLineNo">4872</span>  public HRegion initHRegion(TableName tableName, byte[] startKey, byte[] stopKey,<a name="line.4872"></a>
-<span class="sourceLineNo">4873</span>      boolean isReadOnly, Durability durability, WAL wal, byte[]... families) throws IOException {<a name="line.4873"></a>
-<span class="sourceLineNo">4874</span>    return TEST_UTIL.createLocalHRegion(tableName, startKey, stopKey,<a name="line.4874"></a>
-<span class="sourceLineNo">4875</span>        isReadOnly, durability, wal, families);<a name="line.4875"></a>
+<span class="sourceLineNo">4824</span>    // Two flushes after the threshold, compactions are needed<a name="line.4824"></a>
+<span class="sourceLineNo">4825</span>    for (int i = 0; i &lt; 2; i++) {<a name="line.4825"></a>
+<span class="sourceLineNo">4826</span>      Put put = new Put(tableName.toBytes()).addColumn(family, family, tableName.toBytes());<a name="line.4826"></a>
+<span class="sourceLineNo">4827</span>      region.put(put);<a name="line.4827"></a>
+<span class="sourceLineNo">4828</span>      fr = region.flush(true);<a name="line.4828"></a>
+<span class="sourceLineNo">4829</span>      assertTrue(fr.isFlushSucceeded());<a name="line.4829"></a>
+<span class="sourceLineNo">4830</span>      assertTrue(fr.isCompactionNeeded());<a name="line.4830"></a>
+<span class="sourceLineNo">4831</span>    }<a name="line.4831"></a>
+<span class="sourceLineNo">4832</span>  }<a name="line.4832"></a>
+<span class="sourceLineNo">4833</span><a name="line.4833"></a>
+<span class="sourceLineNo">4834</span>  protected Configuration initSplit() {<a name="line.4834"></a>
+<span class="sourceLineNo">4835</span>    // Always compact if there is more than one store file.<a name="line.4835"></a>
+<span class="sourceLineNo">4836</span>    CONF.setInt("hbase.hstore.compactionThreshold", 2);<a name="line.4836"></a>
+<span class="sourceLineNo">4837</span><a name="line.4837"></a>
+<span class="sourceLineNo">4838</span>    CONF.setInt(HConstants.HBASE_CLIENT_SCANNER_TIMEOUT_PERIOD, 10 * 1000);<a name="line.4838"></a>
+<span class="sourceLineNo">4839</span><a name="line.4839"></a>
+<span class="sourceLineNo">4840</span>    // Increase the amount of time between client retries<a name="line.4840"></a>
+<span class="sourceLineNo">4841</span>    CONF.setLong("hbase.client.pause", 15 * 1000);<a name="line.4841"></a>
+<span class="sourceLineNo">4842</span><a name="line.4842"></a>
+<span class="sourceLineNo">4843</span>    // This size should make it so we always split using the addContent<a name="line.4843"></a>
+<span class="sourceLineNo">4844</span>    // below. After adding all data, the first region is 1.3M<a name="line.4844"></a>
+<span class="sourceLineNo">4845</span>    CONF.setLong(HConstants.HREGION_MAX_FILESIZE, 1024 * 128);<a name="line.4845"></a>
+<span class="sourceLineNo">4846</span>    return CONF;<a name="line.4846"></a>
+<span class="sourceLineNo">4847</span>  }<a name="line.4847"></a>
+<span class="sourceLineNo">4848</span><a name="line.4848"></a>
+<span class="sourceLineNo">4849</span>  /**<a name="line.4849"></a>
+<span class="sourceLineNo">4850</span>   * @return A region on which you must call<a name="line.4850"></a>
+<span class="sourceLineNo">4851</span>   *         {@link HBaseTestingUtility#closeRegionAndWAL(HRegion)} when done.<a name="line.4851"></a>
+<span class="sourceLineNo">4852</span>   */<a name="line.4852"></a>
+<span class="sourceLineNo">4853</span>  protected HRegion initHRegion(TableName tableName, String callingMethod, Configuration conf,<a name="line.4853"></a>
+<span class="sourceLineNo">4854</span>      byte[]... families) throws IOException {<a name="line.4854"></a>
+<span class="sourceLineNo">4855</span>    return initHRegion(tableName, callingMethod, conf, false, families);<a name="line.4855"></a>
+<span class="sourceLineNo">4856</span>  }<a name="line.4856"></a>
+<span class="sourceLineNo">4857</span><a name="line.4857"></a>
+<span class="sourceLineNo">4858</span>  /**<a name="line.4858"></a>
+<span class="sourceLineNo">4859</span>   * @return A region on which you must call<a name="line.4859"></a>
+<span class="sourceLineNo">4860</span>   *         {@link HBaseTestingUtility#closeRegionAndWAL(HRegion)} when done.<a name="line.4860"></a>
+<span class="sourceLineNo">4861</span>   */<a name="line.4861"></a>
+<span class="sourceLineNo">4862</span>  protected HRegion initHRegion(TableName tableName, String callingMethod, Configuration conf,<a name="line.4862"></a>
+<span class="sourceLineNo">4863</span>      boolean isReadOnly, byte[]... families) throws IOException {<a name="line.4863"></a>
+<span class="sourceLineNo">4864</span>    return initHRegion(tableName, null, null, callingMethod, conf, isReadOnly, families);<a name="line.4864"></a>
+<span class="sourceLineNo">4865</span>  }<a name="line.4865"></a>
+<span class="sourceLineNo">4866</span><a name="line.4866"></a>
+<span class="sourceLineNo">4867</span>  protected HRegion initHRegion(TableName tableName, byte[] startKey, byte[] stopKey,<a name="line.4867"></a>
+<span class="sourceLineNo">4868</span>      String callingMethod, Configuration conf, boolean isReadOnly, byte[]... families)<a name="line.4868"></a>
+<span class="sourceLineNo">4869</span>      throws IOException {<a name="line.4869"></a>
+<span class="sourceLineNo">4870</span>    Path logDir = TEST_UTIL.getDataTestDirOnTestFS(callingMethod + ".log");<a name="line.4870"></a>
+<span class="sourceLineNo">4871</span>    ChunkCreator.initialize(MemStoreLABImpl.CHUNK_SIZE_DEFAULT, false, 0, 0, 0, null);<a name="line.4871"></a>
+<span class="sourceLineNo">4872</span>    HRegionInfo hri = new HRegionInfo(tableName, startKey, stopKey);<a name="line.4872"></a>
+<span class="sourceLineNo">4873</span>    final WAL wal = HBaseTestingUtility.createWal(conf, logDir, hri);<a name="line.4873"></a>
+<span class="sourceLineNo">4874</span>    return initHRegion(tableName, startKey, stopKey, isReadOnly,<a name="line.4874"></a>
+<span class="sourceLineNo">4875</span>        Durability.SYNC_WAL, wal, families);<a name="line.4875"></a>
 <span class="sourceLineNo">4876</span>  }<a name="line.4876"></a>
 <span class="sourceLineNo">4877</span><a name="line.4877"></a>
 <span class="sourceLineNo">4878</span>  /**<a name="line.4878"></a>
-<span class="sourceLineNo">4879</span>   * Assert that the passed in Cell has expected contents for the specified row,<a name="line.4879"></a>
-<span class="sourceLineNo">4880</span>   * column &amp; timestamp.<a name="line.4880"></a>
+<span class="sourceLineNo">4879</span>   * @return A region on which you must call<a name="line.4879"></a>
+<span class="sourceLineNo">4880</span>   *         {@link HBaseTestingUtility#closeRegionAndWAL(HRegion)} when done.<a name="line.4880"></a>
 <span class="sourceLineNo">4881</span>   */<a name="line.4881"></a>
-<span class="sourceLineNo">4882</span>  private void checkOneCell(Cell kv, byte[] cf, int rowIdx, int colIdx, long ts) {<a name="line.4882"></a>
-<span class="sourceLineNo">4883</span>    String ctx = "rowIdx=" + rowIdx + "; colIdx=" + colIdx + "; ts=" + ts;<a name="line.4883"></a>
-<span class="sourceLineNo">4884</span>    assertEquals("Row mismatch which checking: " + ctx, "row:" + rowIdx,<a name="line.4884"></a>
-<span class="sourceLineNo">4885</span>        Bytes.toString(CellUtil.cloneRow(kv)));<a name="line.4885"></a>
-<span class="sourceLineNo">4886</span>    assertEquals("ColumnFamily mismatch while checking: " + ctx, Bytes.toString(cf),<a name="line.4886"></a>
-<span class="sourceLineNo">4887</span>        Bytes.toString(CellUtil.cloneFamily(kv)));<a name="line.4887"></a>
-<span class="sourceLineNo">4888</span>    assertEquals("Column qualifier mismatch while checking: " + ctx, "column:" + colIdx,<a name="line.4888"></a>
-<span class="sourceLineNo">4889</span>        Bytes.toString(CellUtil.cloneQualifier(kv)));<a name="line.4889"></a>
-<span class="sourceLineNo">4890</span>    assertEquals("Timestamp mismatch while checking: " + ctx, ts, kv.getTimestamp());<a name="line.4890"></a>
-<span class="sourceLineNo">4891</span>    assertEquals("Value mismatch while checking: " + ctx, "value-version-" + ts,<a name="line.4891"></a>
-<span class="sourceLineNo">4892</span>        Bytes.toString(CellUtil.cloneValue(kv)));<a name="line.4892"></a>
-<span class="sourceLineNo">4893</span>  }<a name="line.4893"></a>
-<span class="sourceLineNo">4894</span><a name="line.4894"></a>
-<span class="sourceLineNo">4895</span>  @Test<a name="line.4895"></a>
-<span class="sourceLineNo">4896</span>  public void testReverseScanner_FromMemStore_SingleCF_Normal()<a name="line.4896"></a>
-<span class="sourceLineNo">4897</span>      throws IOException {<a name="line.4897"></a>
-<span class="sourceLineNo">4898</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.4898"></a>
-<span class="sourceLineNo">4899</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.4899"></a>
-<span class="sourceLineNo">4900</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.4900"></a>
-<span class="sourceLineNo">4901</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.4901"></a>
-<span class="sourceLineNo">4902</span>    byte[][] families = { cf };<a name="line.4902"></a>
-<span class="sourceLineNo">4903</span>    byte[] col = Bytes.toBytes("C");<a name="line.4903"></a>
-<span class="sourceLineNo">4904</span>    long ts = 1;<a name="line.4904"></a>
-<span class="sourceLineNo">4905</span>    this.region = initHRegion(tableName, method, families);<a name="line.4905"></a>
-<span class="sourceLineNo">4906</span>    KeyValue kv1 = new KeyValue(rowC, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4906"></a>
-<span class="sourceLineNo">4907</span>    KeyValue kv11 = new KeyValue(rowC, cf, col, ts + 1, KeyValue.Type.Put,<a name="line.4907"></a>
-<span class="sourceLineNo">4908</span>        null);<a name="line.4908"></a>
-<span class="sourceLineNo">4909</span>    KeyValue kv2 = new KeyValue(rowA, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4909"></a>
-<span class="sourceLineNo">4910</span>    KeyValue kv3 = new KeyValue(rowB, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4910"></a>
-<span class="sourceLineNo">4911</span>    Put put = null;<a name="line.4911"></a>
-<span class="sourceLineNo">4912</span>    put = new Put(rowC);<a name="line.4912"></a>
-<span class="sourceLineNo">4913</span>    put.add(kv1);<a name="line.4913"></a>
-<span class="sourceLineNo">4914</span>    put.add(kv11);<a name="line.4914"></a>
-<span class="sourceLineNo">4915</span>    region.put(put);<a name="line.4915"></a>
-<span class="sourceLineNo">4916</span>    put = new Put(rowA);<a name="line.4916"></a>
-<span class="sourceLineNo">4917</span>    put.add(kv2);<a name="line.4917"></a>
-<span class="sourceLineNo">4918</span>    region.put(put);<a name="line.4918"></a>
-<span class="sourceLineNo">4919</span>    put = new Put(rowB);<a name="line.4919"></a>
-<span class="sourceLineNo">4920</span>    put.add(kv3);<a name="line.4920"></a>
-<span class="sourceLineNo">4921</span>    region.put(put);<a name="line.4921"></a>
-<span class="sourceLineNo">4922</span><a name="line.4922"></a>
-<span class="sourceLineNo">4923</span>    Scan scan = new Scan(rowC);<a name="line.4923"></a>
-<span class="sourceLineNo">4924</span>    scan.setMaxVersions(5);<a name="line.4924"></a>
-<span class="sourceLineNo">4925</span>    scan.setReversed(true);<a name="line.4925"></a>
-<span class="sourceLineNo">4926</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.4926"></a>
-<span class="sourceLineNo">4927</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.4927"></a>
-<span class="sourceLineNo">4928</span>    boolean hasNext = scanner.next(currRow);<a name="line.4928"></a>
-<span class="sourceLineNo">4929</span>    assertEquals(2, currRow.size());<a name="line.4929"></a>
-<span class="sourceLineNo">4930</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4930"></a>
-<span class="sourceLineNo">4931</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.4931"></a>
-<span class="sourceLineNo">4932</span>    assertTrue(hasNext);<a name="line.4932"></a>
-<span class="sourceLineNo">4933</span>    currRow.clear();<a name="line.4933"></a>
-<span class="sourceLineNo">4934</span>    hasNext = scanner.next(currRow);<a name="line.4934"></a>
-<span class="sourceLineNo">4935</span>    assertEquals(1, currRow.size());<a name="line.4935"></a>
-<span class="sourceLineNo">4936</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4936"></a>
-<span class="sourceLineNo">4937</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.4937"></a>
-<span class="sourceLineNo">4938</span>    assertTrue(hasNext);<a name="line.4938"></a>
-<span class="sourceLineNo">4939</span>    currRow.clear();<a name="line.4939"></a>
-<span class="sourceLineNo">4940</span>    hasNext = scanner.next(currRow);<a name="line.4940"></a>
-<span class="sourceLineNo">4941</span>    assertEquals(1, currRow.size());<a name="line.4941"></a>
-<span class="sourceLineNo">4942</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4942"></a>
-<span class="sourceLineNo">4943</span>        .get(0).getRowLength(), rowA, 0, rowA.length));<a name="line.4943"></a>
-<span class="sourceLineNo">4944</span>    assertFalse(hasNext);<a name="line.4944"></a>
-<span class="sourceLineNo">4945</span>    scanner.close();<a name="line.4945"></a>
-<span class="sourceLineNo">4946</span>  }<a name="line.4946"></a>
-<span class="sourceLineNo">4947</span><a name="line.4947"></a>
-<span class="sourceLineNo">4948</span>  @Test<a name="line.4948"></a>
-<span class="sourceLineNo">4949</span>  public void testReverseScanner_FromMemStore_SingleCF_LargerKey()<a name="line.4949"></a>
-<span class="sourceLineNo">4950</span>      throws IOException {<a name="line.4950"></a>
-<span class="sourceLineNo">4951</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.4951"></a>
-<span class="sourceLineNo">4952</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.4952"></a>
-<span class="sourceLineNo">4953</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.4953"></a>
-<span class="sourceLineNo">4954</span>    byte[] rowD = Bytes.toBytes("rowD");<a name="line.4954"></a>
-<span class="sourceLineNo">4955</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.4955"></a>
-<span class="sourceLineNo">4956</span>    byte[][] families = { cf };<a name="line.4956"></a>
-<span class="sourceLineNo">4957</span>    byte[] col = Bytes.toBytes("C");<a name="line.4957"></a>
-<span class="sourceLineNo">4958</span>    long ts = 1;<a name="line.4958"></a>
-<span class="sourceLineNo">4959</span>    this.region = initHRegion(tableName, method, families);<a name="line.4959"></a>
-<span class="sourceLineNo">4960</span>    KeyValue kv1 = new KeyValue(rowC, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4960"></a>
-<span class="sourceLineNo">4961</span>    KeyValue kv11 = new KeyValue(rowC, cf, col, ts + 1, KeyValue.Type.Put,<a name="line.4961"></a>
-<span class="sourceLineNo">4962</span>        null);<a name="line.4962"></a>
-<span class="sourceLineNo">4963</span>    KeyValue kv2 = new KeyValue(rowA, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4963"></a>
-<span class="sourceLineNo">4964</span>    KeyValue kv3 = new KeyValue(rowB, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4964"></a>
-<span class="sourceLineNo">4965</span>    Put put = null;<a name="line.4965"></a>
-<span class="sourceLineNo">4966</span>    put = new Put(rowC);<a name="line.4966"></a>
-<span class="sourceLineNo">4967</span>    put.add(kv1);<a name="line.4967"></a>
-<span class="sourceLineNo">4968</span>    put.add(kv11);<a name="line.4968"></a>
-<span class="sourceLineNo">4969</span>    region.put(put);<a name="line.4969"></a>
-<span class="sourceLineNo">4970</span>    put = new Put(rowA);<a name="line.4970"></a>
-<span class="sourceLineNo">4971</span>    put.add(kv2);<a name="line.4971"></a>
-<span class="sourceLineNo">4972</span>    region.put(put);<a name="line.4972"></a>
-<span class="sourceLineNo">4973</span>    put = new Put(rowB);<a name="line.4973"></a>
-<span class="sourceLineNo">4974</span>    put.add(kv3);<a name="line.4974"></a>
-<span class="sourceLineNo">4975</span>    region.put(put);<a name="line.4975"></a>
-<span class="sourceLineNo">4976</span><a name="line.4976"></a>
-<span class="sourceLineNo">4977</span>    Scan scan = new Scan(rowD);<a name="line.4977"></a>
-<span class="sourceLineNo">4978</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.4978"></a>
-<span class="sourceLineNo">4979</span>    scan.setReversed(true);<a name="line.4979"></a>
-<span class="sourceLineNo">4980</span>    scan.setMaxVersions(5);<a name="line.4980"></a>
-<span class="sourceLineNo">4981</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.4981"></a>
-<span class="sourceLineNo">4982</span>    boolean hasNext = scanner.next(currRow);<a name="line.4982"></a>
-<span class="sourceLineNo">4983</span>    assertEquals(2, currRow.size());<a name="line.4983"></a>
-<span class="sourceLineNo">4984</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4984"></a>
-<span class="sourceLineNo">4985</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.4985"></a>
-<span class="sourceLineNo">4986</span>    assertTrue(hasNext);<a name="line.4986"></a>
-<span class="sourceLineNo">4987</span>    currRow.clear();<a name="line.4987"></a>
-<span class="sourceLineNo">4988</span>    hasNext = scanner.next(currRow);<a name="line.4988"></a>
-<span class="sourceLineNo">4989</span>    assertEquals(1, currRow.size());<a name="line.4989"></a>
-<span class="sourceLineNo">4990</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4990"></a>
-<span class="sourceLineNo">4991</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.4991"></a>
-<span class="sourceLineNo">4992</span>    assertTrue(hasNext);<a name="line.4992"></a>
-<span class="sourceLineNo">4993</span>    currRow.clear();<a name="line.4993"></a>
-<span class="sourceLineNo">4994</span>    hasNext = scanner.next(currRow);<a name="line.4994"></a>
-<span class="sourceLineNo">4995</span>    assertEquals(1, currRow.size());<a name="line.4995"></a>
-<span class="sourceLineNo">4996</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4996"></a>
-<span class="sourceLineNo">4997</span>        .get(0).getRowLength(), rowA, 0, rowA.length));<a name="line.4997"></a>
-<span class="sourceLineNo">4998</span>    assertFalse(hasNext);<a name="line.4998"></a>
-<span class="sourceLineNo">4999</span>    scanner.close();<a name="line.4999"></a>
-<span class="sourceLineNo">5000</span>  }<a name="line.5000"></a>
-<span class="sourceLineNo">5001</span><a name="line.5001"></a>
-<span class="sourceLineNo">5002</span>  @Test<a name="line.5002"></a>
-<span class="sourceLineNo">5003</span>  public void testReverseScanner_FromMemStore_SingleCF_FullScan()<a name="line.5003"></a>
-<span class="sourceLineNo">5004</span>      throws IOException {<a name="line.5004"></a>
-<span class="sourceLineNo">5005</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.5005"></a>
-<span class="sourceLineNo">5006</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.5006"></a>
-<span class="sourceLineNo">5007</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.5007"></a>
-<span class="sourceLineNo">5008</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.5008"></a>
-<span class="sourceLineNo">5009</span>    byte[][] families = { cf };<a name="line.5009"></a>
-<span class="sourceLineNo">5010</span>    byte[] col = Bytes.toBytes("C");<a name="line.5010"></a>
-<span class="sourceLineNo">5011</span>    long ts = 1;<a name="line.5011"></a>
-<span class="sourceLineNo">5012</span>    this.region = initHRegion(tableName, method, families);<a name="line.5012"></a>
-<span class="sourceLineNo">5013</span>    KeyValue kv1 = new KeyValue(rowC, cf, col, ts, KeyValue.Type.Put, null);<a name="line.5013"></a>
-<span class="sourceLineNo">5014</span>    KeyValue kv11 = new KeyValue(rowC, cf, col, ts + 1, KeyValue.Type.Put,<a name="line.5014"></a>
-<span class="sourceLineNo">5015</span>        null);<a name="line.5015"></a>
-<span class="sourceLineNo">5016</span>    KeyValue kv2 = new KeyValue(rowA, cf, col, ts, KeyValue.Type.Put, null);<a name="line.5016"></a>
-<span class="sourceLineNo">5017</span>    KeyValue kv3 = new KeyValue(rowB, cf, col, ts, KeyValue.Type.Put, null);<a name="line.5017"></a>
-<span class="sourceLineNo">5018</span>    Put put = null;<a name="line.5018"></a>
-<span class="sourceLineNo">5019</span>    put = new Put(rowC);<a name="line.5019"></a>
-<span class="sourceLineNo">5020</span>    put.add(kv1);<a name="line.5020"></a>
-<span class="sourceLineNo">5021</span>    put.add(kv11);<a name="line.5021"></a>
-<span class="sourceLineNo">5022</span>    region.put(put);<a name="line.5022"></a>
-<span class="sourceLineNo">5023</span>    put = new Put(rowA);<a name="line.5023"></a>
-<span class="sourceLineNo">5024</span>    put.add(kv2);<a name="line.5024"></a>
-<span class="sourceLineNo">5025</span>    region.put(put);<a name="line.5025"></a>
-<span class="sourceLineNo">5026</span>    put = new Put(rowB);<a name="line.5026"></a>
-<span class="sourceLineNo">5027</span>    put.add(kv3);<a name="line.5027"></a>
-<span class="sourceLineNo">5028</span>    region.put(put);<a name="line.5028"></a>
-<span class="sourceLineNo">5029</span>    Scan scan = new Scan();<a name="line.5029"></a>
-<span class="sourceLineNo">5030</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5030"></a>
-<span class="sourceLineNo">5031</span>    scan.setReversed(true);<a name="line.5031"></a>
-<span class="sourceLineNo">5032</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5032"></a>
-<span class="sourceLineNo">5033</span>    boolean hasNext = scanner.next(currRow);<a name="line.5033"></a>
-<span class="sourceLineNo">5034</span>    assertEquals(1, currRow.size());<a name="line.5034"></a>
-<span class="sourceLineNo">5035</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5035"></a>
-<span class="sourceLineNo">5036</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.5036"></a>
-<span class="sourceLineNo">5037</span>    assertTrue(hasNext);<a name="line.5037"></a>
-<span class="sourceLineNo">5038</span>    currRow.clear();<a name="line.5038"></a>
-<span class="sourceLineNo">5039</span>    hasNext = scanner.next(currRow);<a name="line.5039"></a>
-<span class="sourceLineNo">5040</span>    assertEquals(1, currRow.size());<a name="line.5040"></a>
-<span class="sourceLineNo">5041</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5041"></a>
-<span class="sourceLineNo">5042</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.5042"></a>
-<span class="sourceLineNo">5043</span>    assertTrue(hasNext);<a name="line.5043"></a>
-<span class="sourceLineNo">5044</span>    currRow.clear();<a name="line.5044"></a>
-<span class="sourceLineNo">5045</span>    hasNext = scanner.next(currRow);<a name="line.5045"></a>
-<span class="sourceLineNo">5046</span>    assertEquals(1, currRow.size());<a name="line.5046"></a>
-<span class="sourceLineNo">5047</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5047"></a>
-<span class="sourceLineNo">5048</span>        .get(0).getRowLength(), rowA, 0, rowA.length));<a name="line.5048"></a>
-<span class="sourceLineNo">5049</span>    assertFalse(hasNext);<a name="line.5049"></a>
-<span class="sourceLineNo">5050</span>    scanner.close();<a name="line.5050"></a>
-<span class="sourceLineNo">5051</span>  }<a name="line.5051"></a>
-<span class="sourceLineNo">5052</span><a name="line.5052"></a>
-<span class="sourceLineNo">5053</span>  @Test<a name="line.5053"></a>
-<span class="sourceLineNo">5054</span>  public void testReverseScanner_moreRowsMayExistAfter() throws IOException {<a name="line.5054"></a>
-<span class="sourceLineNo">5055</span>    // case for "INCLUDE_AND_SEEK_NEXT_ROW &amp; SEEK_NEXT_ROW" endless loop<a name="line.5055"></a>
-<span class="sourceLineNo">5056</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.5056"></a>
-<span class="sourceLineNo">5057</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.5057"></a>
-<span class="sourceLineNo">5058</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.5058"></a>
-<span class="sourceLineNo">5059</span>    byte[] rowD = Bytes.toBytes("rowD");<a name="line.5059"></a>
-<span class="sourceLineNo">5060</span>    byte[] rowE = Bytes.toBytes("rowE");<a name="line.5060"></a>
-<span class="sourceLineNo">5061</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.5061"></a>
-<span class="sourceLineNo">5062</span>    byte[][] families = { cf };<a name="line.5062"></a>
-<span class="sourceLineNo">5063</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.5063"></a>
-<span class="sourceLineNo">5064</span>    byte[] col2 = Bytes.toBytes("col2");<a name="line.5064"></a>
-<span class="sourceLineNo">5065</span>    long ts = 1;<a name="line.5065"></a>
-<span class="sourceLineNo">5066</span>    this.region = initHRegion(tableName, method, families);<a name="line.5066"></a>
-<span class="sourceLineNo">5067</span>    KeyValue kv1 = new KeyValue(rowA, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5067"></a>
-<span class="sourceLineNo">5068</span>    KeyValue kv2 = new KeyValue(rowB, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5068"></a>
-<span class="sourceLineNo">5069</span>    KeyValue kv3 = new KeyValue(rowC, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5069"></a>
-<span class="sourceLineNo">5070</span>    KeyValue kv4_1 = new KeyValue(rowD, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5070"></a>
-<span class="sourceLineNo">5071</span>    KeyValue kv4_2 = new KeyValue(rowD, cf, col2, ts, KeyValue.Type.Put, null);<a name="line.5071"></a>
-<span class="sourceLineNo">5072</span>    KeyValue kv5 = new KeyValue(rowE, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5072"></a>
-<span class="sourceLineNo">5073</span>    Put put = null;<a name="line.5073"></a>
-<span class="sourceLineNo">5074</span>    put = new Put(rowA);<a name="line.5074"></a>
-<span class="sourceLineNo">5075</span>    put.add(kv1);<a name="line.5075"></a>
-<span class="sourceLineNo">5076</span>    region.put(put);<a name="line.5076"></a>
-<span class="sourceLineNo">5077</span>    put = new Put(rowB);<a name="line.5077"></a>
-<span class="sourceLineNo">5078</span>    put.add(kv2);<a name="line.5078"></a>
-<span class="sourceLineNo">5079</span>    region.put(put);<a name="line.5079"></a>
-<span class="sourceLineNo">5080</span>    put = new Put(rowC);<a name="line.5080"></a>
-<span class="sourceLineNo">5081</span>    put.add(kv3);<a name="line.5081"></a>
-<span class="sourceLineNo">5082</span>    region.put(put);<a name="line.5082"></a>
-<span class="sourceLineNo">5083</span>    put = new Put(rowD);<a name="line.5083"></a>
-<span class="sourceLineNo">5084</span>    put.add(kv4_1);<a name="line.5084"></a>
-<span class="sourceLineNo">5085</span>    region.put(put);<a name="line.5085"></a>
-<span class="sourceLineNo">5086</span>    put = new Put(rowD);<a name="line.5086"></a>
-<span class="sourceLineNo">5087</span>    put.add(kv4_2);<a name="line.5087"></a>
-<span class="sourceLineNo">5088</span>    region.put(put);<a name="line.5088"></a>
-<span class="sourceLineNo">5089</span>    put = new Put(rowE);<a name="line.5089"></a>
-<span class="sourceLineNo">5090</span>    put.add(kv5);<a name="line.5090"></a>
-<span class="sourceLineNo">5091</span>    region.put(put);<a name="line.5091"></a>
-<span class="sourceLineNo">5092</span>    region.flush(true);<a name="line.5092"></a>
-<span class="sourceLineNo">5093</span>    Scan scan = new Scan(rowD, rowA);<a name="line.5093"></a>
-<span class="sourceLineNo">5094</span>    scan.addColumn(families[0], col1);<a name="line.5094"></a>
-<span class="sourceLineNo">5095</span>    scan.setReversed(true);<a name="line.5095"></a>
-<span class="sourceLineNo">5096</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5096"></a>
-<span class="sourceLineNo">5097</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5097"></a>
-<span class="sourceLineNo">5098</span>    boolean hasNext = scanner.next(currRow);<a name="line.5098"></a>
-<span class="sourceLineNo">5099</span>    assertEquals(1, currRow.size());<a name="line.5099"></a>
-<span class="sourceLineNo">5100</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5100"></a>
-<span class="sourceLineNo">5101</span>        .get(0).getRowLength(), rowD, 0, rowD.length));<a name="line.5101"></a>
-<span class="sourceLineNo">5102</span>    assertTrue(hasNext);<a name="line.5102"></a>
-<span class="sourceLineNo">5103</span>    currRow.clear();<a name="line.5103"></a>
-<span class="sourceLineNo">5104</span>    hasNext = scanner.next(currRow);<a name="line.5104"></a>
-<span class="sourceLineNo">5105</span>    assertEquals(1, currRow.size());<a name="line.5105"></a>
-<span class="sourceLineNo">5106</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5106"></a>
-<span class="sourceLineNo">5107</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.5107"></a>
-<span class="sourceLineNo">5108</span>    assertTrue(hasNext);<a name="line.5108"></a>
-<span class="sourceLineNo">5109</span>    currRow.clear();<a name="line.5109"></a>
-<span class="sourceLineNo">5110</span>    hasNext = scanner.next(currRow);<a name="line.5110"></a>
-<span class="sourceLineNo">5111</span>    assertEquals(1, currRow.size());<a name="line.5111"></a>
-<span class="sourceLineNo">5112</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5112"></a>
-<span class="sourceLineNo">5113</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.5113"></a>
-<span class="sourceLineNo">5114</span>    assertFalse(hasNext);<a name="line.5114"></a>
-<span class="sourceLineNo">5115</span>    scanner.close();<a name="line.5115"></a>
-<span class="sourceLineNo">5116</span><a name="line.5116"></a>
-<span class="sourceLineNo">5117</span>    scan = new Scan(rowD, rowA);<a name="line.5117"></a>
-<span class="sourceLineNo">5118</span>    scan.addColumn(families[0], col2);<a name="line.5118"></a>
-<span class="sourceLineNo">5119</span>    scan.setReversed(true);<a name="line.5119"></a>
-<span class="sourceLineNo">5120</span>    currRow.clear();<a name="line.5120"></a>
-<span class="sourceLineNo">5121</span>    scanner = region.getScanner(scan);<a name="line.5121"></a>
-<span class="sourceLineNo">5122</span>    hasNext = scanner.next(currRow);<a name="line.5122"></a>
-<span class="sourceLineNo">5123</span>    assertEquals(1, currRow.size());<a name="line.5123"></a>
-<span class="sourceLineNo">5124</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5124"></a>
-<span class="sourceLineNo">5125</span>        .get(0).getRowLength(), rowD, 0, rowD.length));<a name="line.5125"></a>
-<span class="sourceLineNo">5126</span>    scanner.close();<a name="line.5126"></a>
-<span class="sourceLineNo">5127</span>  }<a name="line.5127"></a>
-<span class="sourceLineNo">5128</span><a name="line.5128"></a>
-<span class="sourceLineNo">5129</span>  @Test<a name="line.5129"></a>
-<span class="sourceLineNo">5130</span>  public void testReverseScanner_smaller_blocksize() throws IOException {<a name="line.5130"></a>
-<span class="sourceLineNo">5131</span>    // case to ensure no conflict with HFile index optimization<a name="line.5131"></a>
-<span class="sourceLineNo">5132</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.5132"></a>
-<span class="sourceLineNo">5133</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.5133"></a>
-<span class="sourceLineNo">5134</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.5134"></a>
-<span class="sourceLineNo">5135</span>    byte[] rowD = Bytes.toBytes("rowD");<a name="line.5135"></a>
-<span class="sourceLineNo">5136</span>    byte[] rowE = Bytes.toBytes("rowE");<a name="line.5136"></a>
-<span class="sourceLineNo">5137</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.5137"></a>
-<span class="sourceLineNo">5138</span>    byte[][] families = { cf };<a name="line.5138"></a>
-<span class="sourceLineNo">5139</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.5139"></a>
-<span class="sourceLineNo">5140</span>    byte[] col2 = Bytes.toBytes("col2");<a name="line.5140"></a>
-<span class="sourceLineNo">5141</span>    long ts = 1;<a name="line.5141"></a>
-<span class="sourceLineNo">5142</span>    HBaseConfiguration config = new HBaseConfiguration();<a name="line.5142"></a>
-<span class="sourceLineNo">5143</span>    config.setInt("test.block.size", 1);<a name="line.5143"></a>
-<span class="sourceLineNo">5144</span>    this.region = initHRegion(tableName, method, config, families);<a name="line.5144"></a>
-<span class="sourceLineNo">5145</span>    KeyValue kv1 = new KeyValue(rowA, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5145"></a>
-<span class="sourceLineNo">5146</span>    KeyValue kv2 = new KeyValue(rowB, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5146"></a>
-<span class="sourceLineNo">5147</span>    KeyValue kv3 = new KeyValue(rowC, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5147"></a>
-<span class="sourceLineNo">5148</span>    KeyValue kv4_1 = new KeyValue(rowD, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5148"></a>
-<span class="sourceLineNo">5149</span>    KeyValue kv4_2 = new KeyValue(rowD, cf, col2, ts, KeyValue.Type.Put, null);<a name="line.5149"></a>
-<span class="sourceLineNo">5150</span>    KeyValue kv5 = new KeyValue(rowE, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5150"></a>
-<span class="sourceLineNo">5151</span>    Put put = null;<a name="line.5151"></a>
-<span class="sourceLineNo">5152</span>    put = new Put(rowA);<a name="line.5152"></a>
-<span class="sourceLineNo">5153</span>    put.add(kv1);<a name="line.5153"></a>
-<span class="sourceLineNo">5154</span>    region.put(put);<a name="line.5154"></a>
-<span class="sourceLineNo">5155</span>    put = new Put(rowB);<a name="line.5155"></a>
-<span class="sourceLineNo">5156</span>    put.add(kv2);<a name="line.5156"></a>
-<span class="sourceLineNo">5157</span>    region.put(put);<a name="line.5157"></a>
-<span class="sourceLineNo">5158</span>    put = new Put(rowC);<a name="line.5158"></a>
-<span class="sourceLineNo">5159</span>    put.add(kv3);<a name="line.5159"></a>
-<span class="sourceLineNo">5160</span>    region.put(put);<a name="line.5160"></a>
-<span class="sourceLineNo">5161</span>    put = new Put(rowD);<a name="line.5161"></a>
-<span class="sourceLineNo">5162</span>    put.add(kv4_1);<a name="line.5162"></a>
-<span class="sourceLineNo">5163</span>    region.put(put);<a name="line.5163"></a>
-<span class="sourceLineNo">5164</span>    put = new Put(rowD);<a name="line.5164"></a>
-<span class="sourceLineNo">5165</span>    put.add(kv4_2);<a name="line.5165"></a>
-<span class="sourceLineNo">5166</span>    region.put(put);<a name="line.5166"></a>
-<span class="sourceLineNo">5167</span>    put = new Put(rowE);<a name="line.5167"></a>
-<span class="sourceLineNo">5168</span>    put.add(kv5);<a name="line.5168"></a>
-<span class="sourceLineNo">5169</span>    region.put(put);<a name="line.5169"></a>
-<span class="sourceLineNo">5170</span>    region.flush(true);<a name="line.5170"></a>
-<span class="sourceLineNo">5171</span>    Scan scan = new Scan(rowD, rowA);<a name="line.5171"></a>
-<span class="sourceLineNo">5172</span>    scan.addColumn(families[0], col1);<a name="line.5172"></a>
-<span class="sourceLineNo">5173</span>    scan.setReversed(true);<a name="line.5173"></a>
-<span class="sourceLineNo">5174</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5174"></a>
-<span class="sourceLineNo">5175</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5175"></a>
-<span class="sourceLineNo">5176</span>    boolean hasNext = scanner.next(currRow);<a name="line.5176"></a>
-<span class="sourceLineNo">5177</span>    assertEquals(1, currRow.size());<a name="line.5177"></a>
-<span class="sourceLineNo">5178</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5178"></a>
-<span class="sourceLineNo">5179</span>        .get(0).getRowLength(), rowD, 0, rowD.length));<a name="line.5179"></a>
-<span class="sourceLineNo">5180</span>    assertTrue(hasNext);<a name="line.5180"></a>
-<span class="sourceLineNo">5181</span>    currRow.clear();<a name="line.5181"></a>
-<span class="sourceLineNo">5182</span>    hasNext = scanner.next(currRow);<a name="line.5182"></a>
-<span class="sourceLineNo">5183</span>    assertEquals(1, currRow.size());<a name="line.5183"></a>
-<span class="sourceLineNo">5184</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5184"></a>
-<span class="sourceLineNo">5185</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.5185"></a>
-<span class="sourceLineNo">5186</span>    assertTrue(hasNext);<a name="line.5186"></a>
-<span class="sourceLineNo">5187</span>    currRow.clear();<a name="line.5187"></a>
-<span class="sourceLineNo">5188</span>    hasNext = scanner.next(currRow);<a name="line.5188"></a>
-<span class="sourceLineNo">5189</span>    assertEquals(1, currRow.size());<a name="line.5189"></a>
-<span class="sourceLineNo">5190</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5190"></a>
-<span class="sourceLineNo">5191</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.5191"></a>
-<span class="sourceLineNo">5192</span>    assertFalse(hasNext);<a name="line.5192"></a>
-<span class="sourceLineNo">5193</span>    scanner.close();<a name="line.5193"></a>
-<span class="sourceLineNo">5194</span><a name="line.5194"></a>
-<span class="sourceLineNo">5195</span>    scan = new Scan(rowD, rowA);<a name="line.5195"></a>
-<span class="sourceLineNo">5196</span>    scan.addColumn(families[0], col2);<a name="line.5196"></a>
-<span class="sourceLineNo">5197</span>    scan.setReversed(true);<a name="line.5197"></a>
-<span class="sourceLineNo">5198</span>    currRow.clear();<a name="line.5198"></a>
-<span class="sourceLineNo">5199</span>    scanner = region.getScanner(scan);<a name="line.5199"></a>
-<span class="sourceLineNo">5200</span>    hasNext = scanner.next(currRow);<a name="line.5200"></a>
-<span class="sourceLineNo">5201</span>    assertEquals(1, currRow.size());<a name="line.5201"></a>
-<span class="sourceLineNo">5202</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5202"></a>
-<span class="sourceLineNo">5203</span>        .get(0).getRowLength(), rowD, 0, rowD.length));<a name="line.5203"></a>
-<span class="sourceLineNo">5204</span>    scanner.close();<a name="line.5204"></a>
-<span class="sourceLineNo">5205</span>  }<a name="line.5205"></a>
-<span class="sourceLineNo">5206</span><a name="line.5206"></a>
-<span class="sourceLineNo">5207</span>  @Test<a name="line.5207"></a>
-<span class="sourceLineNo">5208</span>  public void testReverseScanner_FromMemStoreAndHFiles_MultiCFs1()<a name="line.5208"></a>
-<span class="sourceLineNo">5209</span>      throws IOException {<a name="line.5209"></a>
-<span class="sourceLineNo">5210</span>    byte[] row0 = Bytes.toBytes("row0"); // 1 kv<a name="line.5210"></a>
-<span class="sourceLineNo">5211</span>    byte[] row1 = Bytes.toBytes("row1"); // 2 kv<a name="line.5211"></a>
-<span class="sourceLineNo">5212</span>    byte[] row2 = Bytes.toBytes("row2"); // 4 kv<a name="line.5212"></a>
-<span class="sourceLineNo">5213</span>    byte[] row3 = Bytes.toBytes("row3"); // 2 kv<a name="line.5213"></a>
-<span class="sourceLineNo">5214</span>    byte[] row4 = Bytes.toBytes("row4"); // 5 kv<a name="line.5214"></a>
-<span class="sourceLineNo">5215</span>    byte[] row5 = Bytes.toBytes("row5"); // 2 kv<a name="line.5215"></a>
-<span class="sourceLineNo">5216</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5216"></a>
-<span class="sourceLineNo">5217</span>    byte[] cf2 = Bytes.toBytes("CF2");<a name="line.5217"></a>
-<span class="sourceLineNo">5218</span>    byte[] cf3 = Bytes.toBytes("CF3");<a name="line.5218"></a>
-<span class="sourceLineNo">5219</span>    byte[][] families = { cf1, cf2, cf3 };<a name="line.5219"></a>
-<span class="sourceLineNo">5220</span>    byte[] col = Bytes.toBytes("C");<a name="line.5220"></a>
-<span class="sourceLineNo">5221</span>    long ts = 1;<a name="line.5221"></a>
-<span class="sourceLineNo">5222</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5222"></a>
-<span class="sourceLineNo">5223</span>    // disable compactions in this test.<a name="line.5223"></a>
-<span class="sourceLineNo">5224</span>    conf.setInt("hbase.hstore.compactionThreshold", 10000);<a name="line.5224"></a>
-<span class="sourceLineNo">5225</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5225"></a>
-<span class="sourceLineNo">5226</span>    // kv naming style: kv(row number) totalKvCountInThisRow seq no<a name="line.5226"></a>
-<span class="sourceLineNo">5227</span>    KeyValue kv0_1_1 = new KeyValue(row0, cf1, col, ts, KeyValue.Type.Put,<a name="line.5227"></a>
-<span class="sourceLineNo">5228</span>        null);<a name="line.5228"></a>
-<span class="sourceLineNo">5229</span>    KeyValue kv1_2_1 = new KeyValue(row1, cf2, col, ts, KeyValue.Type.Put,<a name="line.5229"></a>
-<span class="sourceLineNo">5230</span>        null);<a name="line.5230"></a>
-<span class="sourceLineNo">5231</span>    KeyValue kv1_2_2 = new KeyValue(row1, cf1, col, ts + 1,<a name="line.5231"></a>
-<span class="sourceLineNo">5232</span>        KeyValue.Type.Put, null);<a name="line.5232"></a>
-<span class="sourceLineNo">5233</span>    KeyValue kv2_4_1 = new KeyValue(row2, cf2, col, ts, KeyValue.Type.Put,<a name="line.5233"></a>
-<span class="sourceLineNo">5234</span>        null);<a name="line.5234"></a>
-<span class="sourceLineNo">5235</span>    KeyValue kv2_4_2 = new KeyValue(row2, cf1, col, ts, KeyValue.Type.Put,<a name="line.5235"></a>
-<span class="sourceLineNo">5236</span>        null);<a name="line.5236"></a>
-<span class="sourceLineNo">5237</span>    KeyValue kv2_4_3 = new KeyValue(row2, cf3, col, ts, KeyValue.Type.Put,<a name="line.5237"></a>
+<span class="sourceLineNo">4882</span>  public HRegion initHRegion(TableName tableName, byte[] startKey, byte[] stopKey,<a name="line.4882"></a>
+<span class="sourceLineNo">4883</span>      boolean isReadOnly, Durability durability, WAL wal, byte[]... families) throws IOException {<a name="line.4883"></a>
+<span class="sourceLineNo">4884</span>    return TEST_UTIL.createLocalHRegion(tableName, startKey, stopKey,<a name="line.4884"></a>
+<span class="sourceLineNo">4885</span>        isReadOnly, durability, wal, families);<a name="line.4885"></a>
+<span class="sourceLineNo">4886</span>  }<a name="line.4886"></a>
+<span class="sourceLineNo">4887</span><a name="line.4887"></a>
+<span class="sourceLineNo">4888</span>  /**<a name="line.4888"></a>
+<span class="sourceLineNo">4889</span>   * Assert that the passed in Cell has expected contents for the specified row,<a name="line.4889"></a>
+<span class="sourceLineNo">4890</span>   * column &amp; timestamp.<a name="line.4890"></a>
+<span class="sourceLineNo">4891</span>   */<a name="line.4891"></a>
+<span class="sourceLineNo">4892</span>  private void checkOneCell(Cell kv, byte[] cf, int rowIdx, int colIdx, long ts) {<a name="line.4892"></a>
+<span class="sourceLineNo">4893</span>    String ctx = "rowIdx=" + rowIdx + "; colIdx=" + colIdx + "; ts=" + ts;<a name="line.4893"></a>
+<span class="sourceLineNo">4894</span>    assertEquals("Row mismatch which checking: " + ctx, "row:" + rowIdx,<a name="line.4894"></a>
+<span class="sourceLineNo">4895</span>        Bytes.toString(CellUtil.cloneRow(kv)));<a name="line.4895"></a>
+<span class="sourceLineNo">4896</span>    assertEquals("ColumnFamily mismatch while checking: " + ctx, Bytes.toString(cf),<a name="line.4896"></a>
+<span class="sourceLineNo">4897</span>        Bytes.toString(CellUtil.cloneFamily(kv)));<a name="line.4897"></a>
+<span class="sourceLineNo">4898</span>    assertEquals("Column qualifier mismatch while checking: " + ctx, "column:" + colIdx,<a name="line.4898"></a>
+<span class="sourceLineNo">4899</span>        Bytes.toString(CellUtil.cloneQualifier(kv)));<a name="line.4899"></a>
+<span class="sourceLineNo">4900</span>    assertEquals("Timestamp mismatch while checking: " + ctx, ts, kv.getTimestamp());<a name="line.4900"></a>
+<span class="sourceLineNo">4901</span>    assertEquals("Value mismatch while checking: " + ctx, "value-version-" + ts,<a name="line.4901"></a>
+<span class="sourceLineNo">4902</span>        Bytes.toString(CellUtil.cloneValue(kv)));<a name="line.4902"></a>
+<span class="sourceLineNo">4903</span>  }<a name="line.4903"></a>
+<span class="sourceLineNo">4904</span><a name="line.4904"></a>
+<span class="sourceLineNo">4905</span>  @Test<a name="line.4905"></a>
+<span class="sourceLineNo">4906</span>  public void testReverseScanner_FromMemStore_SingleCF_Normal()<a name="line.4906"></a>
+<span class="sourceLineNo">4907</span>      throws IOException {<a name="line.4907"></a>
+<span class="sourceLineNo">4908</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.4908"></a>
+<span class="sourceLineNo">4909</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.4909"></a>
+<span class="sourceLineNo">4910</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.4910"></a>
+<span class="sourceLineNo">4911</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.4911"></a>
+<span class="sourceLineNo">4912</span>    byte[][] families = { cf };<a name="line.4912"></a>
+<span class="sourceLineNo">4913</span>    byte[] col = Bytes.toBytes("C");<a name="line.4913"></a>
+<span class="sourceLineNo">4914</span>    long ts = 1;<a name="line.4914"></a>
+<span class="sourceLineNo">4915</span>    this.region = initHRegion(tableName, method, families);<a name="line.4915"></a>
+<span class="sourceLineNo">4916</span>    KeyValue kv1 = new KeyValue(rowC, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4916"></a>
+<span class="sourceLineNo">4917</span>    KeyValue kv11 = new KeyValue(rowC, cf, col, ts + 1, KeyValue.Type.Put,<a name="line.4917"></a>
+<span class="sourceLineNo">4918</span>        null);<a name="line.4918"></a>
+<span class="sourceLineNo">4919</span>    KeyValue kv2 = new KeyValue(rowA, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4919"></a>
+<span class="sourceLineNo">4920</span>    KeyValue kv3 = new KeyValue(rowB, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4920"></a>
+<span class="sourceLineNo">4921</span>    Put put = null;<a name="line.4921"></a>
+<span class="sourceLineNo">4922</span>    put = new Put(rowC);<a name="line.4922"></a>
+<span class="sourceLineNo">4923</span>    put.add(kv1);<a name="line.4923"></a>
+<span class="sourceLineNo">4924</span>    put.add(kv11);<a name="line.4924"></a>
+<span class="sourceLineNo">4925</span>    region.put(put);<a name="line.4925"></a>
+<span class="sourceLineNo">4926</span>    put = new Put(rowA);<a name="line.4926"></a>
+<span class="sourceLineNo">4927</span>    put.add(kv2);<a name="line.4927"></a>
+<span class="sourceLineNo">4928</span>    region.put(put);<a name="line.4928"></a>
+<span class="sourceLineNo">4929</span>    put = new Put(rowB);<a name="line.4929"></a>
+<span class="sourceLineNo">4930</span>    put.add(kv3);<a name="line.4930"></a>
+<span class="sourceLineNo">4931</span>    region.put(put);<a name="line.4931"></a>
+<span class="sourceLineNo">4932</span><a name="line.4932"></a>
+<span class="sourceLineNo">4933</span>    Scan scan = new Scan(rowC);<a name="line.4933"></a>
+<span class="sourceLineNo">4934</span>    scan.setMaxVersions(5);<a name="line.4934"></a>
+<span class="sourceLineNo">4935</span>    scan.setReversed(true);<a name="line.4935"></a>
+<span class="sourceLineNo">4936</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.4936"></a>
+<span class="sourceLineNo">4937</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.4937"></a>
+<span class="sourceLineNo">4938</span>    boolean hasNext = scanner.next(currRow);<a name="line.4938"></a>
+<span class="sourceLineNo">4939</span>    assertEquals(2, currRow.size());<a name="line.4939"></a>
+<span class="sourceLineNo">4940</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4940"></a>
+<span class="sourceLineNo">4941</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.4941"></a>
+<span class="sourceLineNo">4942</span>    assertTrue(hasNext);<a name="line.4942"></a>
+<span class="sourceLineNo">4943</span>    currRow.clear();<a name="line.4943"></a>
+<span class="sourceLineNo">4944</span>    hasNext = scanner.next(currRow);<a name="line.4944"></a>
+<span class="sourceLineNo">4945</span>    assertEquals(1, currRow.size());<a name="line.4945"></a>
+<span class="sourceLineNo">4946</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4946"></a>
+<span class="sourceLineNo">4947</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.4947"></a>
+<span class="sourceLineNo">4948</span>    assertTrue(hasNext);<a name="line.4948"></a>
+<span class="sourceLineNo">4949</span>    currRow.clear();<a name="line.4949"></a>
+<span class="sourceLineNo">4950</span>    hasNext = scanner.next(currRow);<a name="line.4950"></a>
+<span class="sourceLineNo">4951</span>    assertEquals(1, currRow.size());<a name="line.4951"></a>
+<span class="sourceLineNo">4952</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4952"></a>
+<span class="sourceLineNo">4953</span>        .get(0).getRowLength(), rowA, 0, rowA.length));<a name="line.4953"></a>
+<span class="sourceLineNo">4954</span>    assertFalse(hasNext);<a name="line.4954"></a>
+<span class="sourceLineNo">4955</span>    scanner.close();<a name="line.4955"></a>
+<span class="sourceLineNo">4956</span>  }<a name="line.4956"></a>
+<span class="sourceLineNo">4957</span><a name="line.4957"></a>
+<span class="sourceLineNo">4958</span>  @Test<a name="line.4958"></a>
+<span class="sourceLineNo">4959</span>  public void testReverseScanner_FromMemStore_SingleCF_LargerKey()<a name="line.4959"></a>
+<span class="sourceLineNo">4960</span>      throws IOException {<a name="line.4960"></a>
+<span class="sourceLineNo">4961</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.4961"></a>
+<span class="sourceLineNo">4962</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.4962"></a>
+<span class="sourceLineNo">4963</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.4963"></a>
+<span class="sourceLineNo">4964</span>    byte[] rowD = Bytes.toBytes("rowD");<a name="line.4964"></a>
+<span class="sourceLineNo">4965</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.4965"></a>
+<span class="sourceLineNo">4966</span>    byte[][] families = { cf };<a name="line.4966"></a>
+<span class="sourceLineNo">4967</span>    byte[] col = Bytes.toBytes("C");<a name="line.4967"></a>
+<span class="sourceLineNo">4968</span>    long ts = 1;<a name="line.4968"></a>
+<span class="sourceLineNo">4969</span>    this.region = initHRegion(tableName, method, families);<a name="line.4969"></a>
+<span class="sourceLineNo">4970</span>    KeyValue kv1 = new KeyValue(rowC, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4970"></a>
+<span class="sourceLineNo">4971</span>    KeyValue kv11 = new KeyValue(rowC, cf, col, ts + 1, KeyValue.Type.Put,<a name="line.4971"></a>
+<span class="sourceLineNo">4972</span>        null);<a name="line.4972"></a>
+<span class="sourceLineNo">4973</span>    KeyValue kv2 = new KeyValue(rowA, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4973"></a>
+<span class="sourceLineNo">4974</span>    KeyValue kv3 = new KeyValue(rowB, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4974"></a>
+<span class="sourceLineNo">4975</span>    Put put = null;<a name="line.4975"></a>
+<span class="sourceLineNo">4976</span>    put = new Put(rowC);<a name="line.4976"></a>
+<span class="sourceLineNo">4977</span>    put.add(kv1);<a name="line.4977"></a>
+<span class="sourceLineNo">4978</span>    put.add(kv11);<a name="line.4978"></a>
+<span class="sourceLineNo">4979</span>    region.put(put);<a name="line.4979"></a>
+<span class="sourceLineNo">4980</span>    put = new Put(rowA);<a name="line.4980"></a>
+<span class="sourceLineNo">4981</span>    put.add(kv2);<a name="line.4981"></a>
+<span class="sourceLineNo">4982</span>    region.put(put);<a name="line.4982"></a>
+<span class="sourceLineNo">4983</span>    put = new Put(rowB);<a name="line.4983"></a>
+<span class="sourceLineNo">4984</span>    put.add(kv3);<a name="line.4984"></a>
+<span class="sourceLineNo">4985</span>    region.put(put);<a name="line.4985"></a>
+<span class="sourceLineNo">4986</span><a name="line.4986"></a>
+<span class="sourceLineNo">4987</span>    Scan scan = new Scan(rowD);<a name="line.4987"></a>
+<span class="sourceLineNo">4988</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.4988"></a>
+<span class="sourceLineNo">4989</span>    scan.setReversed(true);<a name="line.4989"></a>
+<span class="sourceLineNo">4990</span>    scan.setMaxVersions(5);<a name="line.4990"></a>
+<span class="sourceLineNo">4991</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.4991"></a>
+<span class="sourceLineNo">4992</span>    boolean hasNext = scanner.next(currRow);<a name="line.4992"></a>
+<span class="sourceLineNo">4993</span>    assertEquals(2, currRow.size());<a name="line.4993"></a>
+<span class="sourceLineNo">4994</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4994"></a>
+<span class="sourceLineNo">4995</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.4995"></a>
+<span class="sourceLineNo">4996</span>    assertTrue(hasNext);<a name="line.4996"></a>
+<span class="sourceLineNo">4997</span>    currRow.clear();<a name="line.4997"></a>
+<span class="sourceLineNo">4998</span>    hasNext = scanner.next(currRow);<a name="line.4998"></a>
+<span class="sourceLineNo">4999</span>    assertEquals(1, currRow.size());<a name="line.4999"></a>
+<span class="sourceLineNo">5000</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5000"></a>
+<span class="sourceLineNo">5001</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.5001"></a>
+<span class="sourceLineNo">5002</span>    assertTrue(hasNext);<a name="line.5002"></a>
+<span class="sourceLineNo">5003</span>    currRow.clear();<a name="line.5003"></a>
+<span class="sourceLineNo">5004</span>    hasNext = scanner.next(currRow);<a name="line.5004"></a>
+<span class="sourceLineNo">5005</span>    assertEquals(1, currRow.size());<a name="line.5005"></a>
+<span class="sourceLineNo">5006</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5006"></a>
+<span class="sourceLineNo">5007</span>        .get(0).getRowLength(), rowA, 0, rowA.length));<a name="line.5007"></a>
+<span class="sourceLineNo">5008</span>    assertFalse(hasNext);<a name="line.5008"></a>
+<span class="sourceLineNo">5009</span>    scanner.close();<a name="line.5009"></a>
+<span class="sourceLineNo">5010</span>  }<a name="line.5010"></a>
+<span class="sourceLineNo">5011</span><a name="line.5011"></a>
+<span class="sourceLineNo">5012</span>  @Test<a name="line.5012"></a>
+<span class="sourceLineNo">5013</span>  public void testReverseScanner_FromMemStore_SingleCF_FullScan()<a name="line.5013"></a>
+<span class="sourceLineNo">5014</span>      throws IOException {<a name="line.5014"></a>
+<span class="sourceLineNo">5015</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.5015"></a>
+<span class="sourceLineNo">5016</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.5016"></a>
+<span class="sourceLineNo">5017</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.5017"></a>
+<span class="sourceLineNo">5018</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.5018"></a>
+<span class="sourceLineNo">5019</span>    byte[][] families = { cf };<a name="line.5019"></a>
+<span class="sourceLineNo">5020</span>    byte[] col = Bytes.toBytes("C");<a name="line.5020"></a>
+<span class="sourceLineNo">5021</span>    long ts = 1;<a name="line.5021"></a>
+<span class="sourceLineNo">5022</span>    this.region = initHRegion(tableName, method, families);<a name="line.5022"></a>
+<span class="sourceLineNo">5023</span>    KeyValue kv1 = new KeyValue(rowC, cf, col, ts, KeyValue.Type.Put, null);<a name="line.5023"></a>
+<span class="sourceLineNo">5024</span>    KeyValue kv11 = new KeyValue(rowC, cf, col, ts + 1, KeyValue.Type.Put,<a name="line.5024"></a>
+<span class="sourceLineNo">5025</span>        null);<a name="line.5025"></a>
+<span class="sourceLineNo">5026</span>    KeyValue kv2 = new KeyValue(rowA, cf, col, ts, KeyValue.Type.Put, null);<a name="line.5026"></a>
+<span class="sourceLineNo">5027</span>    KeyValue kv3 = new KeyValue(rowB, cf, col, ts, KeyValue.Type.Put, null);<a name="line.5027"></a>
+<span class="sourceLineNo">5028</span>    Put put = null;<a name="line.5028"></a>
+<span class="sourceLineNo">5029</span>    put = new Put(rowC);<a name="line.5029"></a>
+<span class="sourceLineNo">5030</span>    put.add(kv1);<a name="line.5030"></a>
+<span class="sourceLineNo">5031</span>    put.add(kv11);<a name="line.5031"></a>
+<span class="sourceLineNo">5032</span>    region.put(put);<a name="line.5032"></a>
+<span class="sourceLineNo">5033</span>    put = new Put(rowA);<a name="line.5033"></a>
+<span class="sourceLineNo">5034</span>    put.add(kv2);<a name="line.5034"></a>
+<span class="sourceLineNo">5035</span>    region.put(put);<a name="line.5035"></a>
+<span class="sourceLineNo">5036</span>    put = new Put(rowB);<a name="line.5036"></a>
+<span class="sourceLineNo">5037</span>    put.add(kv3);<a name="line.5037"></a>
+<span class="sourceLineNo">5038</span>    region.put(put);<a name="line.5038"></a>
+<span class="sourceLineNo">5039</span>    Scan scan = new Scan();<a name="line.5039"></a>
+<span class="sourceLineNo">5040</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5040"></a>
+<span class="sourceLineNo">5041</span>    scan.setReversed(true);<a name="line.5041"></a>
+<span class="sourceLineNo">5042</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5042"></a>
+<span class="sourceLineNo">5043</span>    boolean hasNext = scanner.next(currRow);<a name="line.5043"></a>
+<span class="sourceLineNo">5044</span>    assertEquals(1, currRow.size());<a name="line.5044"></a>
+<span class="sourceLineNo">5045</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5045"></a>
+<span class="sourceLineNo">5046</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.5046"></a>
+<span class="sourceLineNo">5047</span>    assertTrue(hasNext);<a name="line.5047"></a>
+<span class="sourceLineNo">5048</span>    currRow.clear();<a name="line.5048"></a>
+<span class="sourceLineNo">5049</span>    hasNext = scanner.next(currRow);<a name="line.5049"></a>
+<span class="sourceLineNo">5050</span>    assertEquals(1, currRow.size());<a name="line.5050"></a>
+<span class="sourceLineNo">5051</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5051"></a>
+<span class="sourceLineNo">5052</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.5052"></a>
+<span class="sourceLineNo">5053</span>    assertTrue(hasNext);<a name="line.5053"></a>
+<span class="sourceLineNo">5054</span>    currRow.clear();<a name="line.5054"></a>
+<span class="sourceLineNo">5055</span>    hasNext = scanner.next(currRow);<a name="line.5055"></a>
+<span class="sourceLineNo">5056</span>    assertEquals(1, currRow.size());<a name="line.5056"></a>
+<span class="sourceLineNo">5057</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5057"></a>
+<span class="sourceLineNo">5058</span>        .get(0).getRowLength(), rowA, 0, rowA.length));<a name="line.5058"></a>
+<span class="sourceLineNo">5059</span>    assertFalse(hasNext);<a name="line.5059"></a>
+<span class="sourceLineNo">5060</span>    scanner.close();<a name="line.5060"></a>
+<span class="sourceLineNo">5061</span>  }<a name="line.5061"></a>
+<span class="sourceLineNo">5062</span><a name="line.5062"></a>
+<span class="sourceLineNo">5063</span>  @Test<a name="line.5063"></a>
+<span class="sourceLineNo">5064</span>  public void testReverseScanner_moreRowsMayExistAfter() throws IOException {<a name="line.5064"></a>
+<span class="sourceLineNo">5065</span>    // case for "INCLUDE_AND_SEEK_NEXT_ROW &amp; SEEK_NEXT_ROW" endless loop<a name="line.5065"></a>
+<span class="sourceLineNo">5066</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.5066"></a>
+<span class="sourceLineNo">5067</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.5067"></a>
+<span class="sourceLineNo">5068</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.5068"></a>
+<span class="sourceLineNo">5069</span>    byte[] rowD = Bytes.toBytes("rowD");<a name="line.5069"></a>
+<span class="sourceLineNo">5070</span>    byte[] rowE = Bytes.toBytes("rowE");<a name="line.5070"></a>
+<span class="sourceLineNo">5071</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.5071"></a>
+<span class="sourceLineNo">5072</span>    byte[][] families = { cf };<a name="line.5072"></a>
+<span class="sourceLineNo">5073</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.5073"></a>
+<span class="sourceLineNo">5074</span>    byte[] col2 = Bytes.toBytes("col2");<a name="line.5074"></a>
+<span class="sourceLineNo">5075</span>    long ts = 1;<a name="line.5075"></a>
+<span class="sourceLineNo">5076</span>    this.region = initHRegion(tableName, method, families);<a name="line.5076"></a>
+<span class="sourceLineNo">5077</span>    KeyValue kv1 = new KeyValue(rowA, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5077"></a>
+<span class="sourceLineNo">5078</span>    KeyValue kv2 = new KeyValue(rowB, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5078"></a>
+<span class="sourceLineNo">5079</span>    KeyValue kv3 = new KeyValue(rowC, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5079"></a>
+<span class="sourceLineNo">5080</span>    KeyValue kv4_1 = new KeyValue(rowD, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5080"></a>
+<span class="sourceLineNo">5081</span>    KeyValue kv4_2 = new KeyValue(rowD, cf, col2, ts, KeyValue.Type.Put, null);<a name="line.5081"></a>
+<span class="sourceLineNo">5082</span>    KeyValue kv5 = new KeyValue(rowE, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5082"></a>
+<span class="sourceLineNo">5083</span>    Put put = null;<a name="line.5083"></a>
+<span class="sourceLineNo">5084</span>    put = new Put(rowA);<a name="line.5084"></a>
+<span class="sourceLineNo">5085</span>    put.add(kv1);<a name="line.5085"></a>
+<span class="sourceLineNo">5086</span>    region.put(put);<a name="line.5086"></a>
+<span class="sourceLineNo">5087</span>    put = new Put(rowB);<a name="line.5087"></a>
+<span class="sourceLineNo">5088</span>    put.add(kv2);<a name="line.5088"></a>
+<span class="sourceLineNo">5089</span>    region.put(put);<a name="line.5089"></a>
+<span class="sourceLineNo">5090</span>    put = new Put(rowC);<a name="line.5090"></a>
+<span class="sourceLineNo">5091</span>    put.add(kv3);<a name="line.5091"></a>
+<span class="sourceLineNo">5092</span>    region.put(put);<a name="line.5092"></a>
+<span class="sourceLineNo">5093</span>    put = new Put(rowD);<a name="line.5093"></a>
+<span class="sourceLineNo">5094</span>    put.add(kv4_1);<a name="line.5094"></a>
+<span class="sourceLineNo">5095</span>    region.put(put);<a name="line.5095"></a>
+<span class="sourceLineNo">5096</span>    put = new Put(rowD);<a name="line.5096"></a>
+<span class="sourceLineNo">5097</span>    put.add(kv4_2);<a name="line.5097"></a>
+<span class="sourceLineNo">5098</span>    region.put(put);<a name="line.5098"></a>
+<span class="sourceLineNo">5099</span>    put = new Put(rowE);<a name="line.5099"></a>
+<span class="sourceLineNo">5100</span>    put.add(kv5);<a name="line.5100"></a>
+<span class="sourceLineNo">5101</span>    region.put(put);<a name="line.5101"></a>
+<span class="sourceLineNo">5102</span>    region.flush(true);<a name="line.5102"></a>
+<span class="sourceLineNo">5103</span>    Scan scan = new Scan(rowD, rowA);<a name="line.5103"></a>
+<span class="sourceLineNo">5104</span>    scan.addColumn(families[0], col1);<a name="line.5104"></a>
+<span class="sourceLineNo">5105</span>    scan.setReversed(true);<a name="line.5105"></a>
+<span class="sourceLineNo">5106</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5106"></a>
+<span class="sourceLineNo">5107</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5107"></a>
+<span class="sourceLineNo">5108</span>    boolean hasNext = scanner.next(currRow);<a name="line.5108"></a>
+<span class="sourceLineNo">5109</span>    assertEquals(1, currRow.size());<a name="line.5109"></a>
+<span class="sourceLineNo">5110</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5110"></a>
+<span class="sourceLineNo">5111</span>        .get(0).getRowLength(), rowD, 0, rowD.length));<a name="line.5111"></a>
+<span class="sourceLineNo">5112</span>    assertTrue(hasNext);<a name="line.5112"></a>
+<span class="sourceLineNo">5113</span>    currRow.clear();<a name="line.5113"></a>
+<span class="sourceLineNo">5114</span>    hasNext = scanner.next(currRow);<a name="line.5114"></a>
+<span class="sourceLineNo">5115</span>    assertEquals(1, currRow.size());<a name="line.5115"></a>
+<span class="sourceLineNo">5116</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5116"></a>
+<span class="sourceLineNo">5117</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.5117"></a>
+<span class="sourceLineNo">5118</span>    assertTrue(hasNext);<a name="line.5118"></a>
+<span class="sourceLineNo">5119</span>    currRow.clear();<a name="line.5119"></a>
+<span class="sourceLineNo">5120</span>    hasNext = scanner.next(currRow);<a name="line.5120"></a>
+<span class="sourceLineNo">5121</span>    assertEquals(1, currRow.size());<a name="line.5121"></a>
+<span class="sourceLineNo">5122</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5122"></a>
+<span class="sourceLineNo">5123</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.5123"></a>
+<span class="sourceLineNo">5124</span>    assertFalse(hasNext);<a name="line.5124"></a>
+<span class="sourceLineNo">5125</span>    scanner.close();<a name="line.5125"></a>
+<span class="sourceLineNo">5126</span><a name="line.5126"></a>
+<span class="sourceLineNo">5127</span>    scan = new Scan(rowD, rowA);<a name="line.5127"></a>
+<span class="sourceLineNo">5128</span>    scan.addColumn(families[0], col2);<a name="line.5128"></a>
+<span class="sourceLineNo">5129</span>    scan.setReversed(true);<a name="line.5129"></a>
+<span class="sourceLineNo">5130</span>    currRow.clear();<a name="line.5130"></a>
+<span class="sourceLineNo">5131</span>    scanner = region.getScanner(scan);<a name="line.5131"></a>
+<span class="sourceLineNo">5132</span>    hasNext = scanner.next(currRow);<a name="line.5132"></a>
+<span class="sourceLineNo">5133</span>    assertEquals(1, currRow.size());<a name="line.5133"></a>
+<span class="sourceLineNo">5134</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5134"></a>
+<span class="sourceLineNo">5135</span>        .get(0).getRowLength(), rowD, 0, rowD.length));<a name="line.5135"></a>
+<span class="sourceLineNo">5136</span>    scanner.close();<a name="line.5136"></a>
+<span class="sourceLineNo">5137</span>  }<a name="line.5137"></a>
+<span class="sourceLineNo">5138</span><a name="line.5138"></a>
+<span class="sourceLineNo">5139</span>  @Test<a name="line.5139"></a>
+<span class="sourceLineNo">5140</span>  public void testReverseScanner_smaller_blocksize() throws IOException {<a name="line.5140"></a>
+<span class="sourceLineNo">5141</span>    // case to ensure no conflict with HFile index optimization<a name="line.5141"></a>
+<span class="sourceLineNo">5142</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.5142"></a>
+<span class="sourceLineNo">5143</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.5143"></a>
+<span class="sourceLineNo">5144</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.5144"></a>
+<span class="sourceLineNo">5145</span>    byte[] rowD = Bytes.toBytes("rowD");<a name="line.5145"></a>
+<span class="sourceLineNo">5146</span>    byte[] rowE = Bytes.toBytes("rowE");<a name="line.5146"></a>
+<span class="sourceLineNo">5147</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.5147"></a>
+<span class="sourceLineNo">5148</span>    byte[][] families = { cf };<a name="line.5148"></a>
+<span class="sourceLineNo">5149</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.5149"></a>
+<span class="sourceLineNo">5150</span>    byte[] col2 = Bytes.toBytes("col2");<a name="line.5150"></a>
+<span class="sourceLineNo">5151</span>    long ts = 1;<a name="line.5151"></a>
+<span class="sourceLineNo">5152</span>    HBaseConfiguration config = new HBaseConfiguration();<a name="line.5152"></a>
+<span class="sourceLineNo">5153</span>    config.setInt("test.block.size", 1);<a name="line.5153"></a>
+<span class="sourceLineNo">5154</span>    this.region = initHRegion(tableName, method, config, families);<a name="line.5154"></a>
+<span class="sourceLineNo">5155</span>    KeyValue kv1 = new KeyValue(rowA, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5155"></a>
+<span class="sourceLineNo">5156</span>    KeyValue kv2 = new KeyValue(rowB, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5156"></a>
+<span class="sourceLineNo">5157</span>    KeyValue kv3 = new KeyValue(rowC, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5157"></a>
+<span class="sourceLineNo">5158</span>    KeyValue kv4_1 = new KeyValue(rowD, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5158"></a>
+<span class="sourceLineNo">5159</span>    KeyValue kv4_2 = new KeyValue(rowD, cf, col2, ts, KeyValue.Type.Put, null);<a name="line.5159"></a>
+<span class="sourceLineNo">5160</span>    KeyValue kv5 = new KeyValue(rowE, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5160"></a>
+<span class="sourceLineNo">5161</span>    Put put = null;<a name="line.5161"></a>
+<span class="sourceLineNo">5162</span>    put = new Put(rowA);<a name="line.5162"></a>
+<span class="sourceLineNo">5163</span>    put.add(kv1);<a name="line.5163"></a>
+<span class="sourceLineNo">5164</span>    region.put(put);<a name="line.5164"></a>
+<span class="sourceLineNo">5165</span>    put = new Put(rowB);<a name="line.5165"></a>
+<span class="sourceLineNo">5166</span>    put.add(kv2);<a name="line.5166"></a>
+<span class="sourceLineNo">5167</span>    region.put(put);<a name="line.5167"></a>
+<span class="sourceLineNo">5168</span>    put = new Put(rowC);<a name="line.5168"></a>
+<span class="sourceLineNo">5169</span>    put.add(kv3);<a name="line.5169"></a>
+<span class="sourceLineNo">5170</span>    region.put(put);<a name="line.5170"></a>
+<span class="sourceLineNo">5171</span>    put = new Put(rowD);<a name="line.5171"></a>
+<span class="sourceLineNo">5172</span>    put.add(kv4_1);<a name="line.5172"></a>
+<span class="sourceLineNo">5173</span>    region.put(put);<a name="line.5173"></a>
+<span class="sourceLineNo">5174</span>    put = new Put(rowD);<a name="line.5174"></a>
+<span class="sourceLineNo">5175</span>    put.add(kv4_2);<a name="line.5175"></a>
+<span class="sourceLineNo">5176</span>    region.put(put);<a name="line.5176"></a>
+<span class="sourceLineNo">5177</span>    put = new Put(rowE);<a name="line.5177"></a>
+<span class="sourceLineNo">5178</span>    put.add(kv5);<a name="line.5178"></a>
+<span class="sourceLineNo">5179</span>    region.put(put);<a name="line.5179"></a>
+<span class="sourceLineNo">5180</span>    region.flush(true);<a name="line.5180"></a>
+<span class="sourceLineNo">5181</span>    Scan scan = new Scan(rowD, rowA);<a name="line.5181"></a>
+<span class="sourceLineNo">5182</span>    scan.addColumn(families[0], col1);<a name="line.5182"></a>
+<span class="sourceLineNo">5183</span>    scan.setReversed(true);<a name="line.5183"></a>
+<span class="sourceLineNo">5184</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5184"></a>
+<span class="sourceLineNo">5185</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5185"></a>
+<span class="sourceLineNo">5186</span>    boolean hasNext = scanner.next(currRow);<a name="line.5186"></a>
+<span class="sourceLineNo">5187</span>    assertEquals(1, currRow.size());<a name="line.5187"></a>
+<span class="sourceLineNo">5188</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5188"></a>
+<span class="sourceLineNo">5189</span>        .get(0).getRowLength(), rowD, 0, rowD.length));<a name="line.5189"></a>
+<span class="sourceLineNo">5190</span>    assertTrue(hasNext);<a name="line.5190"></a>
+<span class="sourceLineNo">5191</span>    currRow.clear();<a name="line.5191"></a>
+<span class="sourceLineNo">5192</span>    hasNext = scanner.next(currRow);<a name="line.5192"></a>
+<span class="sourceLineNo">5193</span>    assertEquals(1, currRow.size());<a name="line.5193"></a>
+<span class="sourceLineNo">5194</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5194"></a>
+<span class="sourceLineNo">5195</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.5195"></a>
+<span class="sourceLineNo">5196</span>    assertTrue(hasNext);<a name="line.5196"></a>
+<span class="sourceLineNo">5197</span>    currRow.clear();<a name="line.5197"></a>
+<span class="sourceLineNo">5198</span>    hasNext = scanner.next(currRow);<a name="line.5198"></a>
+<span class="sourceLineNo">5199</span>    assertEquals(1, currRow.size());<a name="line.5199"></a>
+<span class="sourceLineNo">5200</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5200"></a>
+<span class="sourceLineNo">5201</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.5201"></a>
+<span class="sourceLineNo">5202</span>    assertFalse(hasNext);<a name="line.5202"></a>
+<span class="sourceLineNo">5203</span>    scanner.close();<a name="line.5203"></a>
+<span class="sourceLineNo">5204</span><a name="line.5204"></a>
+<span class="sourceLineNo">5205</span>    scan = new Scan(rowD, rowA);<a name="line.5205"></a>
+<span class="sourceLineNo">5206</span>    scan.addColumn(families[0], col2);<a name="line.5206"></a>
+<span class="sourceLineNo">5207</span>    scan.setReversed(true);<a name="line.5207"></a>
+<span class="sourceLineNo">5208</span>    currRow.clear();<a name="line.5208"></a>
+<span class="sourceLineNo">5209</span>    scanner = region.getScanner(scan);<a name="line.5209"></a>
+<span class="sourceLineNo">5210</span>    hasNext = scanner.next(currRow);<a name="line.5210"></a>
+<span class="sourceLineNo">5211</span>    assertEquals(1, currRow.size());<a name="line.5211"></a>
+<span class="sourceLineNo">5212</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5212"></a>
+<span class="sourceLineNo">5213</span>        .get(0).getRowLength(), rowD, 0, rowD.length));<a name="line.5213"></a>
+<span class="sourceLineNo">5214</span>    scanner.close();<a name="line.5214"></a>
+<span class="sourceLineNo">5215</span>  }<a name="line.5215"></a>
+<span class="sourceLineNo">5216</span><a name="line.5216"></a>
+<span class="sourceLineNo">5217</span>  @Test<a name="line.5217"></a>
+<span class="sourceLineNo">5218</span>  public void testReverseScanner_FromMemStoreAndHFiles_MultiCFs1()<a name="line.5218"></a>
+<span class="sourceLineNo">5219</span>      throws IOException {<a name="line.5219"></a>
+<span class="sourceLineNo">5220</span>    byte[] row0 = Bytes.toBytes("row0"); // 1 kv<a name="line.5220"></a>
+<span class="sourceLineNo">5221</span>    byte[] row1 = Bytes.toBytes("row1"); // 2 kv<a name="line.5221"></a>
+<span class="sourceLineNo">5222</span>    byte[] row2 = Bytes.toBytes("row2"); // 4 kv<a name="line.5222"></a>
+<span class="sourceLineNo">5223</span>    byte[] row3 = Bytes.toBytes("row3"); // 2 kv<a name="line.5223"></a>
+<span class="sourceLineNo">5224</span>    byte[] row4 = Bytes.toBytes("row4"); // 5 kv<a name="line.5224"></a>
+<span class="sourceLineNo">5225</span>    byte[] row5 = Bytes.toBytes("row5"); // 2 kv<a name="line.5225"></a>
+<span class="sourceLineNo">5226</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5226"></a>
+<span class="sourceLineNo">5227</span>    byte[] cf2 = Bytes.toBytes("CF2");<a name="line.5227"></a>
+<span class="sourceLineNo">5228</span>    byte[] cf3 = Bytes.toBytes("CF3");<a name="line.5228"></a>
+<span class="sourceLineNo">5229</span>    byte[][] families = { cf1, cf2, cf3 };<a name="line.5229"></a>
+<span class="sourceLineNo">5230</span>    byte[] col = Bytes.toBytes("C");<a name="line.5230"></a>
+<span class="sourceLineNo">5231</span>    long ts = 1;<a name="line.5231"></a>
+<span class="sourceLineNo">5232</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5232"></a>
+<span class="sourceLineNo">5233</span>    // disable compactions in this test.<a name="line.5233"></a>
+<span class="sourceLineNo">5234</span>    conf.setInt("hbase.hstore.compactionThreshold", 10000);<a name="line.5234"></a>
+<span class="sourceLineNo">5235</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5235"></a>
+<span class="sourceLineNo">5236</span>    // kv naming style: kv(row number) totalKvCountInThisRow seq no<a name="line.5236"></a>
+<span class="sourceLineNo">5237</span>    KeyValue kv0_1_1 = new KeyValue(row0, cf1, col, ts, KeyValue.Type.Put,<a name="line.5237"></a>
 <span class="sourceLineNo">5238</span>        null);<a name="line.5238"></a>
-<span class="sourceLineNo">5239</span>    KeyValue kv2_4_4 = new KeyValue(row2, cf1, col, ts + 4,<a name="line.5239"></a>
-<span class="sourceLineNo">5240</span>        KeyValue.Type.Put, null);<a name="line.5240"></a>
-<span class="sourceLineNo">5241</span>    KeyValue kv3_2_1 = new KeyValue(row3, cf2, col, ts, KeyValue.Type.Put,<a name="line.5241"></a>
-<span class="sourceLineNo">5242</span>        null);<a name="line.5242"></a>
-<span class="sourceLineNo">5243</span>    KeyValue kv3_2_2 = new KeyValue(row3, cf1, col, ts + 4,<a name="line.5243"></a>
-<span class="sourceLineNo">5244</span>        KeyValue.Type.Put, null);<a name="line.5244"></a>
-<span class="sourceLineNo">5245</span>    KeyValue kv4_5_1 = new KeyValue(row4, cf1, col, ts, KeyValue.Type.Put,<a name="line.5245"></a>
+<span class="sourceLineNo">5239</span>    KeyValue kv1_2_1 = new KeyValue(row1, cf2, col, ts, KeyValue.Type.Put,<a name="line.5239"></a>
+<span class="sourceLineNo">5240</span>        null);<a name="line.5240"></a>
+<span class="sourceLineNo">5241</span>    KeyValue kv1_2_2 = new KeyValue(row1, cf1, col, ts + 1,<a name="line.5241"></a>
+<span class="sourceLineNo">5242</span>        KeyValue.Type.Put, null);<a name="line.5242"></a>
+<span class="sourceLineNo">5243</span>    KeyValue kv2_4_1 = new KeyValue(row2, cf2, col, ts, KeyValue.Type.Put,<a name="line.5243"></a>
+<span class="sourceLineNo">5244</span>        null);<a name="line.5244"></a>
+<span class="sourceLineNo">5245</span>    KeyValue kv2_4_2 = new KeyValue(row2, cf1, col, ts, KeyValue.Type.Put,<a name="line.5245"></a>
 <span class="sourceLineNo">5246</span>        null);<a name="line.5246"></a>
-<span class="sourceLineNo">5247</span>    KeyValue kv4_5_2 = new KeyValue(row4, cf3, col, ts, KeyValue.Type.Put,<a name="line.5247"></a>
+<span class="sourceLineNo">5247</span>    KeyValue kv2_4_3 = new KeyValue(row2, cf3, col, ts, KeyValue.Type.Put,<a name="line.5247"></a>
 <span class="sourceLineNo">5248</span>        null);<a name="line.5248"></a>
-<span class="sourceLineNo">5249</span>    KeyValue kv4_5_3 = new KeyValue(row4, cf3, col, ts + 5,<a name="line.5249"></a>
+<span class="sourceLineNo">5249</span>    KeyValue kv2_4_4 = new KeyValue(row2, cf1, col, ts + 4,<a name="line.5249"></a>
 <span class="sourceLineNo">5250</span>        KeyValue.Type.Put, null);<a name="line.5250"></a>
-<span class="sourceLineNo">5251</span>    KeyValue kv4_5_4 = new KeyValue(row4, cf2, col, ts, KeyValue.Type.Put,<a name="line.5251"></a>
+<span class="sourceLineNo">5251</span>    KeyValue kv3_2_1 = new KeyValue(row3, cf2, col, ts, KeyValue.Type.Put,<a name="line.5251"></a>
 <span class="sourceLineNo">5252</span>        null);<a name="line.5252"></a>
-<span class="sourceLineNo">5253</span>    KeyValue kv4_5_5 = new KeyValue(row4, cf1, col, ts + 3,<a name="line.5253"></a>
+<span class="sourceLineNo">5253</span>    KeyValue kv3_2_2 = new KeyValue(row3, cf1, col, ts + 4,<a name="line.5253"></a>
 <span class="sourceLineNo">5254</span>        KeyValue.Type.Put, null);<a name="line.5254"></a>
-<span class="sourceLineNo">5255</span>    KeyValue kv5_2_1 = new KeyValue(row5, cf2, col, ts, KeyValue.Type.Put,<a name="line.5255"></a>
+<span class="sourceLineNo">5255</span>    KeyValue kv4_5_1 = new KeyValue(row4, cf1, col, ts, KeyValue.Type.Put,<a name="line.5255"></a>
 <span class="sourceLineNo">5256</span>        null);<a name="line.5256"></a>
-<span class="sourceLineNo">5257</span>    KeyValue kv5_2_2 = new KeyValue(row5, cf3, col, ts, KeyValue.Type.Put,<a name="line.5257"></a>
+<span class="sourceLineNo">5257</span>    KeyValue kv4_5_2 = new KeyValue(row4, cf3, col, ts, KeyValue.Type.Put,<a name="line.5257"></a>
 <span class="sourceLineNo">5258</span>        null);<a name="line.5258"></a>
-<span class="sourceLineNo">5259</span>    // hfiles(cf1/cf2) :"row1"(1 kv) / "row2"(1 kv) / "row4"(2 kv)<a name="line.5259"></a>
-<span class="sourceLineNo">5260</span>    Put put = null;<a name="line.5260"></a>
-<span class="sourceLineNo">5261</span>    put = new Put(row1);<a name="line.5261"></a>
-<span class="sourceLineNo">5262</span>    put.add(kv1_2_1);<a name="line.5262"></a>
-<span class="sourceLineNo">5263</span>    region.put(put);<a name="line.5263"></a>
-<span class="sourceLineNo">5264</span>    put = new Put(row2);<a name="line.5264"></a>
-<span class="sourceLineNo">5265</span>    put.add(kv2_4_1);<a name="line.5265"></a>
-<span class="sourceLineNo">5266</span>    region.put(put);<a name="line.5266"></a>
-<span class="sourceLineNo">5267</span>    put = new Put(row4);<a name="line.5267"></a>
-<span class="sourceLineNo">5268</span>    put.add(kv4_5_4);<a name="line.5268"></a>
-<span class="sourceLineNo">5269</span>    put.add(kv4_5_5);<a name="line.5269"></a>
-<span class="sourceLineNo">5270</span>    region.put(put);<a name="line.5270"></a>
-<span class="sourceLineNo">5271</span>    region.flush(true);<a name="line.5271"></a>
-<span class="sourceLineNo">5272</span>    // hfiles(cf1/cf3) : "row1" (1 kvs) / "row2" (1 kv) / "row4" (2 kv)<a name="line.5272"></a>
-<span class="sourceLineNo">5273</span>    put = new Put(row4);<a name="line.5273"></a>
-<span class="sourceLineNo">5274</span>    put.add(kv4_5_1);<a name="line.5274"></a>
-<span class="sourceLineNo">5275</span>    put.add(kv4_5_3);<a name="line.5275"></a>
+<span class="sourceLineNo">5259</span>    KeyValue kv4_5_3 = new KeyValue(row4, cf3, col, ts + 5,<a name="line.5259"></a>
+<span class="sourceLineNo">5260</span>        KeyValue.Type.Put, null);<a name="line.5260"></a>
+<span class="sourceLineNo">5261</span>    KeyValue kv4_5_4 = new KeyValue(row4, cf2, col, ts, KeyValue.Type.Put,<a name="line.5261"></a>
+<span class="sourceLineNo">5262</span>        null);<a name="line.5262"></a>
+<span class="sourceLineNo">5263</span>    KeyValue kv4_5_5 = new KeyValue(row4, cf1, col, ts + 3,<a name="line.5263"></a>
+<span class="sourceLineNo">5264</span>        KeyValue.Type.Put, null);<a name="line.5264"></a>
+<span class="sourceLineNo">5265</span>    KeyValue kv5_2_1 = new KeyValue(row5, cf2, col, ts, KeyValue.Type.Put,<a name="line.5265"></a>
+<span class="sourceLineNo">5266</span>        null);<a name="line.5266"></a>
+<span class="sourceLineNo">5267</span>    KeyValue kv5_2_2 = new KeyValue(row5, cf3, col, ts, KeyValue.Type.Put,<a name="line.5267"></a>
+<span class="sourceLineNo">5268</span>        null);<a name="line.5268"></a>
+<span class="sourceLineNo">5269</span>    // hfiles(cf1/cf2) :"row1"(1 kv) / "row2"(1 kv) / "row4"(2 kv)<a name="line.5269"></a>
+<span class="sourceLineNo">5270</span>    Put put = null;<a name="line.5270"></a>
+<span class="sourceLineNo">5271</span>    put = new Put(row1);<a name="line.5271"></a>
+<span class="sourceLineNo">5272</span>    put.add(kv1_2_1);<a name="line.5272"></a>
+<span class="sourceLineNo">5273</span>    region.put(put);<a name="line.5273"></a>
+<span class="sourceLineNo">5274</span>    put = new Put(row2);<a name="line.5274"></a>
+<span class="sourceLineNo">5275</span>    put.add(kv2_4_1);<a name="line.5275"></a>
 <span class="sourceLineNo">5276</span>    region.put(put);<a name="line.5276"></a>
-<span class="sourceLineNo">5277</span>    put = new Put(row1);<a name="line.5277"></a>
-<span class="sourceLineNo">5278</span>    put.add(kv1_2_2);<a name="line.5278"></a>
-<span class="sourceLineNo">5279</span>    region.put(put);<a name="line.5279"></a>
-<span class="sourceLineNo">5280</span>    put = new Put(row2);<a name="line.5280"></a>
-<span class="sourceLineNo">5281</span>    put.add(kv2_4_4);<a name="line.5281"></a>
-<span class="sourceLineNo">5282</span>    region.put(put);<a name="line.5282"></a>
-<span class="sourceLineNo">5283</span>    region.flush(true);<a name="line.5283"></a>
-<span class="sourceLineNo">5284</span>    // hfiles(cf1/cf3) : "row2"(2 kv) / "row3"(1 kvs) / "row4" (1 kv)<a name="line.5284"></a>
-<span class="sourceLineNo">5285</span>    put = new Put(row4);<a name="line.5285"></a>
-<span class="sourceLineNo">5286</span>    put.add(kv4_5_2);<a name="line.5286"></a>
-<span class="sourceLineNo">5287</span>    region.put(put);<a name="line.5287"></a>
-<span class="sourceLineNo">5288</span>    put = new Put(row2);<a name="line.5288"></a>
-<span class="sourceLineNo">5289</span>    put.add(kv2_4_2);<a name="line.5289"></a>
-<span class="sourceLineNo">5290</span>    put.add(kv2_4_3);<a name="line.5290"></a>
-<span class="sourceLineNo">5291</span>    region.put(put);<a name="line.5291"></a>
-<span class="sourceLineNo">5292</span>    put = new Put(row3);<a name="line.5292"></a>
-<span class="sourceLineNo">5293</span>    put.add(kv3_2_2);<a name="line.5293"></a>
-<span class="sourceLineNo">5294</span>    region.put(put);<a name="line.5294"></a>
-<span class="sourceLineNo">5295</span>    region.flush(true);<a name="line.5295"></a>
-<span class="sourceLineNo">5296</span>    // memstore(cf1/cf2/cf3) : "row0" (1 kvs) / "row3" ( 1 kv) / "row5" (max)<a name="line.5296"></a>
-<span class="sourceLineNo">5297</span>    // ( 2 kv)<a name="line.5297"></a>
-<span class="sourceLineNo">5298</span>    put = new Put(row0);<a name="line.5298"></a>
-<span class="sourceLineNo">5299</span>    put.add(kv0_1_1);<a name="line.5299"></a>
-<span class="sourceLineNo">5300</span>    region.put(put);<a name="line.5300"></a>
-<span class="sourceLineNo">5301</span>    put = new Put(row3);<a name="line.5301"></a>
-<span class="sourceLineNo">5302</span>    put.add(kv3_2_1);<a name="line.5302"></a>
-<span class="sourceLineNo">5303</span>    region.put(put);<a name="line.5303"></a>
-<span class="sourceLineNo">5304</span>    put = new Put(row5);<a name="line.5304"></a>
-<span class="sourceLineNo">5305</span>    put.add(kv5_2_1);<a name="line.5305"></a>
-<span class="sourceLineNo">5306</span>    put.add(kv5_2_2);<a name="line.5306"></a>
-<span class="sourceLineNo">5307</span>    region.put(put);<a name="line.5307"></a>
-<span class="sourceLineNo">5308</span>    // scan range = ["row4", min), skip the max "row5"<a name="line.5308"></a>
-<span class="sourceLineNo">5309</span>    Scan scan = new Scan(row4);<a name="line.5309"></a>
-<span class="sourceLineNo">5310</span>    scan.setMaxVersions(5);<a name="line.5310"></a>
-<span class="sourceLineNo">5311</span>    scan.setBatch(3);<a name="line.5311"></a>
-<span class="sourceLineNo">5312</span>    scan.setReversed(true);<a name="line.5312"></a>
-<span class="sourceLineNo">5313</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5313"></a>
-<span class="sourceLineNo">5314</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5314"></a>
-<span class="sourceLineNo">5315</span>    boolean hasNext = false;<a name="line.5315"></a>
-<span class="sourceLineNo">5316</span>    // 1. scan out "row4" (5 kvs), "row5" can't be scanned out since not<a name="line.5316"></a>
-<span class="sourceLineNo">5317</span>    // included in scan range<a name="line.5317"></a>
-<span class="sourceLineNo">5318</span>    // "row4" takes 2 next() calls since batch=3<a name="line.5318"></a>
-<span class="sourceLineNo">5319</span>    hasNext = scanner.next(currRow);<a name="line.5319"></a>
-<span class="sourceLineNo">5320</span>    assertEquals(3, currRow.size());<a name="line.5320"></a>
-<span class="sourceLineNo">5321</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5321"></a>
-<span class="sourceLineNo">5322</span>        .get(0).getRowLength(), row4, 0, row4.length));<a name="line.5322"></a>
-<span class="sourceLineNo">5323</span>    assertTrue(hasNext);<a name="line.5323"></a>
-<span class="sourceLineNo">5324</span>    currRow.clear();<a name="line.5324"></a>
-<span class="sourceLineNo">5325</span>    hasNext = scanner.next(currRow);<a name="line.5325"></a>
-<span class="sourceLineNo">5326</span>    assertEquals(2, currRow.size());<a name="line.5326"></a>
-<span class="sourceLineNo">5327</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(),<a name="line.5327"></a>
-<span class="sourceLineNo">5328</span>        currRow.get(0).getRowLength(), row4, 0,<a name="line.5328"></a>
-<span class="sourceLineNo">5329</span>      row4.length));<a name="line.5329"></a>
-<span class="sourceLineNo">5330</span>    assertTrue(hasNext);<a name="line.5330"></a>
-<span class="sourceLineNo">5331</span>    // 2. scan out "row3" (2 kv)<a name="line.5331"></a>
-<span class="sourceLineNo">5332</span>    currRow.clear();<a name="line.5332"></a>
-<span class="sourceLineNo">5333</span>    hasNext = scanner.next(currRow);<a name="line.5333"></a>
-<span class="sourceLineNo">5334</span>    assertEquals(2, currRow.size());<a name="line.5334"></a>
-<span class="sourceLineNo">5335</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5335"></a>
-<span class="sourceLineNo">5336</span>        .get(0).getRowLength(), row3, 0, row3.length));<a name="line.5336"></a>
-<span class="sourceLineNo">5337</span>    assertTrue(hasNext);<a name="line.5337"></a>
-<span class="sourceLineNo">5338</span>    // 3. scan out "row2" (4 kvs)<a name="line.5338"></a>
-<span class="sourceLineNo">5339</span>    // "row2" takes 2 next() calls since batch=3<a name="line.5339"></a>
-<span class="sourceLineNo">5340</span>    currRow.clear();<a name="line.5340"></a>
-<span class="sourceLineNo">5341</span>    hasNext = scanner.next(currRow);<a name="line.5341"></a>
-<span class="sourceLineNo">5342</span>    assertEquals(3, currRow.size());<a name="line.5342"></a>
-<span class="sourceLineNo">5343</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5343"></a>
-<span class="sourceLineNo">5344</span>        .get(0).getRowLength(), row2, 0, row2.length));<a name="line.5344"></a>
-<span class="sourceLineNo">5345</span>    assertTrue(hasNext);<a name="line.5345"></a>
-<span class="sourceLineNo">5346</span>    currRow.clear();<a name="line.5346"></a>
-<span class="sourceLineNo">5347</span>    hasNext = scanner.next(currRow);<a name="line.5347"></a>
-<span class="sourceLineNo">5348</span>    assertEquals(1, currRow.size());<a name="line.5348"></a>
-<span class="sourceLineNo">5349</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5349"></a>
-<span class="sourceLineNo">5350</span>        .get(0).getRowLength(), row2, 0, row2.length));<a name="line.5350"></a>
-<span class="sourceLineNo">5351</span>    assertTrue(hasNext);<a name="line.5351"></a>
-<span class="sourceLineNo">5352</span>    // 4. scan out "row1" (2 kv)<a name="line.5352"></a>
-<span class="sourceLineNo">5353</span>    currRow.clear();<a name="line.5353"></a>
-<span class="sourceLineNo">5354</span>    hasNext = scanner.next(currRow);<a name="line.5354"></a>
-<span class="sourceLineNo">5355</span>    assertEquals(2, currRow.size());<a name="line.5355"></a>
-<span class="sourceLineNo">5356</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5356"></a>
-<span class="sourceLineNo">5357</span>        .get(0).getRowLength(), row1, 0, row1.length));<a name="line.5357"></a>
-<span class="sourceLineNo">5358</span>    assertTrue(hasNext);<a name="line.5358"></a>
-<span class="sourceLineNo">5359</span>    // 5. scan out "row0" (1 kv)<a name="line.5359"></a>
-<span class="sourceLineNo">5360</span>    currRow.clear();<a name="line.5360"></a>
-<span class="sourceLineNo">5361</span>    hasNext = scanner.next(currRow);<a name="line.5361"></a>
-<span class="sourceLineNo">5362</span>    assertEquals(1, currRow.size());<a name="line.5362"></a>
-<span class="sourceLineNo">5363</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5363"></a>
-<span class="sourceLineNo">5364</span>        .get(0).getRowLength(), row0, 0, row0.length));<a name="line.5364"></a>
-<span class="sourceLineNo">5365</span>    assertFalse(hasNext);<a name="line.5365"></a>
-<span class="sourceLineNo">5366</span><a name="line.5366"></a>
-<span class="sourceLineNo">5367</span>    scanner.close();<a name="line.5367"></a>
-<span class="sourceLineNo">5368</span>  }<a name="line.5368"></a>
-<span class="sourceLineNo">5369</span><a name="line.5369"></a>
-<span class="sourceLineNo">5370</span>  @Test<a name="line.5370"></a>
-<span class="sourceLineNo">5371</span>  public void testReverseScanner_FromMemStoreAndHFiles_MultiCFs2()<a name="line.5371"></a>
-<span class="sourceLineNo">5372</span>      throws IOException {<a name="line.5372"></a>
-<span class="sourceLineNo">5373</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.5373"></a>
-<span class="sourceLineNo">5374</span>    byte[] row2 = Bytes.toBytes("row2");<a name="line.5374"></a>
-<span class="sourceLineNo">5375</span>    byte[] row3 = Bytes.toBytes("row3");<a name="line.5375"></a>
-<span class="sourceLineNo">5376</span>    byte[] row4 = Bytes.toBytes("row4");<a name="line.5376"></a>
-<span class="sourceLineNo">5377</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5377"></a>
-<span class="sourceLineNo">5378</span>    byte[] cf2 = Bytes.toBytes("CF2");<a name="line.5378"></a>
-<span class="sourceLineNo">5379</span>    byte[] cf3 = Bytes.toBytes("CF3");<a name="line.5379"></a>
-<span class="sourceLineNo">5380</span>    byte[] cf4 = Bytes.toBytes("CF4");<a name="line.5380"></a>
-<span class="sourceLineNo">5381</span>    byte[][] families = { cf1, cf2, cf3, cf4 };<a name="line.5381"></a>
-<span class="sourceLineNo">5382</span>    byte[] col = Bytes.toBytes("C");<a name="line.5382"></a>
-<span class="sourceLineNo">5383</span>    long ts = 1;<a name="line.5383"></a>
-<span class="sourceLineNo">5384</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5384"></a>
-<span class="sourceLineNo">5385</span>    // disable compactions in this test.<a name="line.5385"></a>
-<span class="sourceLineNo">5386</span>    conf.setInt("hbase.hstore.compactionThreshold", 10000);<a name="line.5386"></a>
-<span class="sourceLineNo">5387</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5387"></a>
-<span class="sourceLineNo">5388</span>    KeyValue kv1 = new KeyValue(row1, cf1, col, ts, KeyValue.Type.Put, null);<a name="line.5388"></a>
-<span class="sourceLineNo">5389</span>    KeyValue kv2 = new KeyValue(row2, cf2, col, ts, KeyValue.Type.Put, null);<a name="line.5389"></a>
-<span class="sourceLineNo">5390</span>    KeyValue kv3 = new KeyValue(row3, cf3, col, ts, KeyValue.Type.Put, null);<a name="line.5390"></a>
-<span class="sourceLineNo">5391</span>    KeyValue kv4 = new KeyValue(row4, cf4, col, ts, KeyValue.Type.Put, null);<a name="line.5391"></a>
-<span class="sourceLineNo">5392</span>    // storefile1<a name="line.5392"></a>
-<span class="sourceLineNo">5393</span>    Put put = new Put(row1);<a name="line.5393"></a>
-<span class="sourceLineNo">5394</span>    put.add(kv1);<a name="line.5394"></a>
-<span class="sourceLineNo">5395</span>    region.put(put);<a name="line.5395"></a>
-<span class="sourceLineNo">5396</span>    region.flush(true);<a name="line.5396"></a>
-<span class="sourceLineNo">5397</span>    // storefile2<a name="line.5397"></a>
-<span class="sourceLineNo">5398</span>    put = new Put(row2);<a name="line.5398"></a>
-<span class="sourceLineNo">5399</span>    put.add(kv2);<a name="line.5399"></a>
-<span class="sourceLineNo">5400</span>    region.put(put);<a name="line.5400"></a>
-<span class="sourceLineNo">5401</span>    region.flush(true);<a name="line.5401"></a>
-<span class="sourceLineNo">5402</span>    // storefile3<a name="line.5402"></a>
-<span class="sourceLineNo">5403</span>    put = new Put(row3);<a name="line.5403"></a>
-<span class="sourceLineNo">5404</span>    put.add(kv3);<a name="line.5404"></a>
+<span class="sourceLineNo">5277</span>    put = new Put(row4);<a name="line.5277"></a>
+<span class="sourceLineNo">5278</span>    put.add(kv4_5_4);<a name="line.5278"></a>
+<span class="sourceLineNo">5279</span>    put.add(kv4_5_5);<a name="line.5279"></a>
+<span class="sourceLineNo">5280</span>    region.put(put);<a name="line.5280"></a>
+<span class="sourceLineNo">5281</span>    region.flush(true);<a name="line.5281"></a>
+<span class="sourceLineNo">5282</span>    // hfiles(cf1/cf3) : "row1" (1 kvs) / "row2" (1 kv) / "row4" (2 kv)<a name="line.5282"></a>
+<span class="sourceLineNo">5283</span>    put = new Put(row4);<a name="line.5283"></a>
+<span class="sourceLineNo">5284</span>    put.add(kv4_5_1);<a name="line.5284"></a>
+<span class="sourceLineNo">5285</span>    put.add(kv4_5_3);<a name="line.5285"></a>
+<span class="sourceLineNo">5286</span>    region.put(put);<a name="line.5286"></a>
+<span class="sourceLineNo">5287</span>    put = new Put(row1);<a name="line.5287"></a>
+<span class="sourceLineNo">5288</span>    put.add(kv1_2_2);<a name="line.5288"></a>
+<span class="sourceLineNo">5289</span>    region.put(put);<a name="line.5289"></a>
+<span class="sourceLineNo">5290</span>    put = new Put(row2);<a name="line.5290"></a>
+<span class="sourceLineNo">5291</span>    put.add(kv2_4_4);<a name="line.5291"></a>
+<span class="sourceLineNo">5292</span>    region.put(put);<a name="line.5292"></a>
+<span class="sourceLineNo">5293</span>    region.flush(true);<a name="line.5293"></a>
+<span class="sourceLineNo">5294</span>    // hfiles(cf1/cf3) : "row2"(2 kv) / "row3"(1 kvs) / "row4" (1 kv)<a name="line.5294"></a>
+<span class="sourceLineNo">5295</span>    put = new Put(row4);<a name="line.5295"></a>
+<span class="sourceLineNo">5296</span>    put.add(kv4_5_2);<a name="line.5296"></a>
+<span class="sourceLineNo">5297</span>    region.put(put);<a name="line.5297"></a>
+<span class="sourceLineNo">5298</span>    put = new Put(row2);<a name="line.5298"></a>
+<span class="sourceLineNo">5299</span>    put.add(kv2_4_2);<a name="line.5299"></a>
+<span class="sourceLineNo">5300</span>    put.add(kv2_4_3);<a name="line.5300"></a>
+<span class="sourceLineNo">5301</span>    region.put(put);<a name="line.5301"></a>
+<span class="sourceLineNo">5302</span>    put = new Put(row3);<a name="line.5302"></a>
+<span class="sourceLineNo">5303</span>    put.add(kv3_2_2);<a name="line.5303"></a>
+<span class="sourceLineNo">5304</span>    region.put(put);<a name="line.5304"></a>
+<span class="sourceLineNo">5305</span>    region.flush(true);<a name="line.5305"></a>
+<span class="sourceLineNo">5306</span>    // memstore(cf1/cf2/cf3) : "row0" (1 kvs) / "row3" ( 1 kv) / "row5" (max)<a name="line.5306"></a>
+<span class="sourceLineNo">5307</span>    // ( 2 kv)<a name="line.5307"></a>
+<span class="sourceLineNo">5308</span>    put = new Put(row0);<a name="line.5308"></a>
+<span class="sourceLineNo">5309</span>    put.add(kv0_1_1);<a name="line.5309"></a>
+<span class="sourceLineNo">5310</span>    region.put(put);<a name="line.5310"></a>
+<span class="sourceLineNo">5311</span>    put = new Put(row3);<a name="line.5311"></a>
+<span class="sourceLineNo">5312</span>    put.add(kv3_2_1);<a name="line.5312"></a>
+<span class="sourceLineNo">5313</span>    region.put(put);<a name="line.5313"></a>
+<span class="sourceLineNo">5314</span>    put = new Put(row5);<a name="line.5314"></a>
+<span class="sourceLineNo">5315</span>    put.add(kv5_2_1);<a name="line.5315"></a>
+<span class="sourceLineNo">5316</span>    put.add(kv5_2_2);<a name="line.5316"></a>
+<span class="sourceLineNo">5317</span>    region.put(put);<a name="line.5317"></a>
+<span class="sourceLineNo">5318</span>    // scan range = ["row4", min), skip the max "row5"<a name="line.5318"></a>
+<span class="sourceLineNo">5319</span>    Scan scan = new Scan(row4);<a name="line.5319"></a>
+<span class="sourceLineNo">5320</span>    scan.setMaxVersions(5);<a name="line.5320"></a>
+<span class="sourceLineNo">5321</span>    scan.setBatch(3);<a name="line.5321"></a>
+<span class="sourceLineNo">5322</span>    scan.setReversed(true);<a name="line.5322"></a>
+<span class="sourceLineNo">5323</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5323"></a>
+<span class="sourceLineNo">5324</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5324"></a>
+<span class="sourceLineNo">5325</span>    boolean hasNext = false;<a name="line.5325"></a>
+<span class="sourceLineNo">5326</span>    // 1. scan out "row4" (5 kvs), "row5" can't be scanned out since not<a name="line.5326"></a>
+<span class="sourceLineNo">5327</span>    // included in scan range<a name="line.5327"></a>
+<span class="sourceLineNo">5328</span>    // "row4" takes 2 next() calls since batch=3<a name="line.5328"></a>
+<span class="sourceLineNo">5329</span>    hasNext = scanner.next(currRow);<a name="line.5329"></a>
+<span class="sourceLineNo">5330</span>    assertEquals(3, currRow.size());<a name="line.5330"></a>
+<span class="sourceLineNo">5331</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5331"></a>
+<span class="sourceLineNo">5332</span>        .get(0).getRowLength(), row4, 0, row4.length));<a name="line.5332"></a>
+<span class="sourceLineNo">5333</span>    assertTrue(hasNext);<a name="line.5333"></a>
+<span class="sourceLineNo">5334</span>    currRow.clear();<a name="line.5334"></a>
+<span class="sourceLineNo">5335</span>    hasNext = scanner.next(currRow);<a name="line.5335"></a>
+<span class="sourceLineNo">5336</span>    assertEquals(2, currRow.size());<a name="line.5336"></a>
+<span class="sourceLineNo">5337</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(),<a name="line.5337"></a>
+<span class="sourceLineNo">5338</span>        currRow.get(0).getRowLength(), row4, 0,<a name="line.5338"></a>
+<span class="sourceLineNo">5339</span>      row4.length));<a name="line.5339"></a>
+<span class="sourceLineNo">5340</span>    assertTrue(hasNext);<a name="line.5340"></a>
+<span class="sourceLineNo">5341</span>    // 2. scan out "row3" (2 kv)<a name="line.5341"></a>
+<span class="sourceLineNo">5342</span>    currRow.clear();<a name="line.5342"></a>
+<span class="sourceLineNo">5343</span>    hasNext = scanner.next(currRow);<a name="line.5343"></a>
+<span class="sourceLineNo">5344</span>    assertEquals(2, currRow.size());<a name="line.5344"></a>
+<span class="sourceLineNo">5345</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5345"></a>
+<span class="sourceLineNo">5346</span>        .get(0).getRowLength(), row3, 0, row3.length));<a name="line.5346"></a>
+<span class="sourceLineNo">5347</span>    assertTrue(hasNext);<a name="line.5347"></a>
+<span class="sourceLineNo">5348</span>    // 3. scan out "row2" (4 kvs)<a name="line.5348"></a>
+<span class="sourceLineNo">5349</span>    // "row2" takes 2 next() calls since batch=3<a name="line.5349"></a>
+<span class="sourceLineNo">5350</span>    currRow.clear();<a name="line.5350"></a>
+<span class="sourceLineNo">5351</span>    hasNext = scanner.next(currRow);<a name="line.5351"></a>
+<span class="sourceLineNo">5352</span>    assertEquals(3, currRow.size());<a name="line.5352"></a>
+<span class="sourceLineNo">5353</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5353"></a>
+<span class="sourceLineNo">5354</span>        .get(0).getRowLength(), row2, 0, row2.length));<a name="line.5354"></a>
+<span class="sourceLineNo">5355</span>    assertTrue(hasNext);<a name="line.5355"></a>
+<span class="sourceLineNo">5356</span>    currRow.clear();<a name="line.5356"></a>
+<span class="sourceLineNo">5357</span>    hasNext = scanner.next(currRow);<a name="line.5357"></a>
+<span class="sourceLineNo">5358</span>    assertEquals(1, currRow.size());<a name="line.5358"></a>
+<span class="sourceLineNo">5359</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5359"></a>
+<span class="sourceLineNo">5360</span>        .get(0).getRowLength(), row2, 0, row2.length));<a name="line.5360"></a>
+<span class="sourceLineNo">5361</span>    assertTrue(hasNext);<a name="line.5361"></a>
+<span class="sourceLineNo">5362</span>    // 4. scan out "row1" (2 kv)<a name="line.5362"></a>
+<span class="sourceLineNo">5363</span>    currRow.clear();<a name="line.5363"></a>
+<span class="sourceLineNo">5364</span>    hasNext = scanner.next(currRow);<a name="line.5364"></a>
+<span class="sourceLineNo">5365</span>    assertEquals(2, currRow.size());<a name="line.5365"></a>
+<span class="sourceLineNo">5366</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5366"></a>
+<span class="sourceLineNo">5367</span>        .get(0).getRowLength(), row1, 0, row1.length));<a name="line.5367"></a>
+<span class="sourceLineNo">5368</span>    assertTrue(hasNext);<a name="line.5368"></a>
+<span class="sourceLineNo">5369</span>    // 5. scan out "row0" (1 kv)<a name="line.5369"></a>
+<span class="sourceLineNo">5370</span>    currRow.clear();<a name="line.5370"></a>
+<span class="sourceLineNo">5371</span>    hasNext = scanner.next(currRow);<a name="line.5371"></a>
+<span class="sourceLineNo">5372</span>    assertEquals(1, currRow.size());<a name="line.5372"></a>
+<span class="sourceLineNo">5373</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5373"></a>
+<span class="sourceLineNo">5374</span>        .get(0).getRowLength(), row0, 0, row0.length));<a name="line.5374"></a>
+<span class="sourceLineNo">5375</span>    assertFalse(hasNext);<a name="line.5375"></a>
+<span class="sourceLineNo">5376</span><a name="line.5376"></a>
+<span class="sourceLineNo">5377</span>    scanner.close();<a name="line.5377"></a>
+<span class="sourceLineNo">5378</span>  }<a name="line.5378"></a>
+<span class="sourceLineNo">5379</span><a name="line.5379"></a>
+<span class="sourceLineNo">5380</span>  @Test<a name="line.5380"></a>
+<span class="sourceLineNo">5381</span>  public void testReverseScanner_FromMemStoreAndHFiles_MultiCFs2()<a name="line.5381"></a>
+<span class="sourceLineNo">5382</span>      throws IOException {<a name="line.5382"></a>
+<span class="sourceLineNo">5383</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.5383"></a>
+<span class="sourceLineNo">5384</span>    byte[] row2 = Bytes.toBytes("row2");<a name="line.5384"></a>
+<span class="sourceLineNo">5385</span>    byte[] row3 = Bytes.toBytes("row3");<a name="line.5385"></a>
+<span class="sourceLineNo">5386</span>    byte[] row4 = Bytes.toBytes("row4");<a name="line.5386"></a>
+<span class="sourceLineNo">5387</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5387"></a>
+<span class="sourceLineNo">5388</span>    byte[] cf2 = Bytes.toBytes("CF2");<a name="line.5388"></a>
+<span class="sourceLineNo">5389</span>    byte[] cf3 = Bytes.toBytes("CF3");<a name="line.5389"></a>
+<span class="sourceLineNo">5390</span>    byte[] cf4 = Bytes.toBytes("CF4");<a name="line.5390"></a>
+<span class="sourceLineNo">5391</span>    byte[][] families = { cf1, cf2, cf3, cf4 };<a name="line.5391"></a>
+<span class="sourceLineNo">5392</span>    byte[] col = Bytes.toBytes("C");<a name="line.5392"></a>
+<span class="sourceLineNo">5393</span>    long ts = 1;<a name="line.5393"></a>
+<span class="sourceLineNo">5394</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5394"></a>
+<span class="sourceLineNo">5395</span>    // disable compactions in this test.<a name="line.5395"></a>
+<span class="sourceLineNo">5396</span>    conf.setInt("hbase.hstore.compactionThreshold", 10000);<a name="line.5396"></a>
+<span class="sourceLineNo">5397</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5397"></a>
+<span class="sourceLineNo">5398</span>    KeyValue kv1 = new KeyValue(row1, cf1, col, ts, KeyValue.Type.Put, null);<a name="line.5398"></a>
+<span class="sourceLineNo">5399</span>    KeyValue kv2 = new KeyValue(row2, cf2, col, ts, KeyValue.Type.Put, null);<a name="line.5399"></a>
+<span class="sourceLineNo">5400</span>    KeyValue kv3 = new KeyValue(row3, cf3, col, ts, KeyValue.Type.Put, null);<a name="line.5400"></a>
+<span class="sourceLineNo">5401</span>    KeyValue kv4 = new KeyValue(row4, cf4, col, ts, KeyValue.Type.Put, null);<a name="line.5401"></a>
+<span class="sourceLineNo">5402</span>    // storefile1<a name="line.5402"></a>
+<span class="sourceLineNo">5403</span>    Put put = new Put(row1);<a name="line.5403"></a>
+<span class="sourceLineNo">5404</span>    put.add(kv1);<a name="line.5404"></a>
 <span class="sourceLineNo">5405</span>    region.put(put);<a name="line.5405"></a>
 <span class="sourceLineNo">5406</span>    region.flush(true);<a name="line.5406"></a>
-<span class="sourceLineNo">5407</span>    // memstore<a name="line.5407"></a>
-<span class="sourceLineNo">5408</span>    put = new Put(row4);<a name="line.5408"></a>
-<span class="sourceLineNo">5409</span>    put.add(kv4);<a name="line.5409"></a>
+<span class="sourceLineNo">5407</span>    // storefile2<a name="line.5407"></a>
+<span class="sourceLineNo">5408</span>    put = new Put(row2);<a name="line.5408"></a>
+<span class="sourceLineNo">5409</span>    put.add(kv2);<a name="line.5409"></a>
 <span class="sourceLineNo">5410</span>    region.put(put);<a name="line.5410"></a>
-<span class="sourceLineNo">5411</span>    // scan range = ["row4", min)<a name="line.5411"></a>
-<span class="sourceLineNo">5412</span>    Scan scan = new Scan(row4);<a name="line.5412"></a>
-<span class="sourceLineNo">5413</span>    scan.setReversed(true);<a name="line.5413"></a>
-<span class="sourceLineNo">5414</span>    scan.setBatch(10);<a name="line.5414"></a>
-<span class="sourceLineNo">5415</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5415"></a>
-<span class="sourceLineNo">5416</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5416"></a>
-<span class="sourceLineNo">5417</span>    boolean hasNext = scanner.next(currRow);<a name="line.5417"></a>
-<span class="sourceLineNo">5418</span>    assertEquals(1, currRow.size());<a name="line.5418"></a>
-<span class="sourceLineNo">5419</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5419"></a>
-<span class="sourceLineNo">5420</span>        .get(0).getRowLength(), row4, 0, row4.length));<a name="line.5420"></a>
-<span class="sourceLineNo">5421</span>    assertTrue(hasNext);<a name="line.5421"></a>
-<span class="sourceLineNo">5422</span>    currRow.clear();<a name="line.5422"></a>
-<span class="sourceLineNo">5423</span>    hasNext = scanner.next(currRow);<a name="line.5423"></a>
-<span class="sourceLineNo">5424</span>    assertEquals(1, currRow.size());<a name="line.5424"></a>
-<span class="sourceLineNo">5425</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5425"></a>
-<span class="sourceLineNo">5426</span>        .get(0).getRowLength(), row3, 0, row3.length));<a name="line.5426"></a>
-<span class="sourceLineNo">5427</span>    assertTrue(hasNext);<a name="line.5427"></a>
-<span class="sourceLineNo">5428</span>    currRow.clear();<a name="line.5428"></a>
-<span class="sourceLineNo">5429</span>    hasNext = scanner.next(currRow);<a name="line.5429"></a>
-<span class="sourceLineNo">5430</span>    assertEquals(1, currRow.size());<a name="line.5430"></a>
-<span class="sourceLineNo">5431</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5431"></a>
-<span class="sourceLineNo">5432</span>        .get(0).getRowLength(), row2, 0, row2.length));<a name="line.5432"></a>
-<span class="sourceLineNo">5433</span>    assertTrue(hasNext);<a name="line.5433"></a>
-<span class="sourceLineNo">5434</span>    currRow.clear();<a name="line.5434"></a>
-<span class="sourceLineNo">5435</span>    hasNext = scanner.next(currRow);<a name="line.5435"></a>
-<span class="sourceLineNo">5436</span>    assertEquals(1, currRow.size());<a name="line.5436"></a>
-<span class="sourceLineNo">5437</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5437"></a>
-<span class="sourceLineNo">5438</span>        .get(0).getRowLength(), row1, 0, row1.length));<a name="line.5438"></a>
-<span class="sourceLineNo">5439</span>    assertFalse(hasNext);<a name="line.5439"></a>
-<span class="sourceLineNo">5440</span>  }<a name="line.5440"></a>
-<span class="sourceLineNo">5441</span><a name="line.5441"></a>
-<span class="sourceLineNo">5442</span>  /**<a name="line.5442"></a>
-<span class="sourceLineNo">5443</span>   * Test for HBASE-14497: Reverse Scan threw StackOverflow caused by readPt checking<a name="line.5443"></a>
-<span class="sourceLineNo">5444</span>   */<a name="line.5444"></a>
-<span class="sourceLineNo">5445</span>  @Test<a name="line.5445"></a>
-<span class="sourceLineNo">5446</span>  public void testReverseScanner_StackOverflow() throws IOException {<a name="line.5446"></a>
-<span class="sourceLineNo">5447</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5447"></a>
-<span class="sourceLineNo">5448</span>    byte[][] families = {cf1};<a name="line.5448"></a>
-<span class="sourceLineNo">5449</span>    byte[] col = Bytes.toBytes("C");<a name="line.5449"></a>
-<span class="sourceLineNo">5450</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5450"></a>
-<span class="sourceLineNo">5451</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5451"></a>
-<span class="sourceLineNo">5452</span>    // setup with one storefile and one memstore, to create scanner and get an earlier readPt<a name="line.5452"></a>
-<span class="sourceLineNo">5453</span>    Put put = new Put(Bytes.toBytes("19998"));<a name="line.5453"></a>
-<span class="sourceLineNo">5454</span>    put.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5454"></a>
-<span class="sourceLineNo">5455</span>    region.put(put);<a name="line.5455"></a>
-<span class="sourceLineNo">5456</span>    region.flushcache(true, true, FlushLifeCycleTracker.DUMMY);<a name="line.5456"></a>
-<span class="sourceLineNo">5457</span>    Put put2 = new Put(Bytes.toBytes("19997"));<a name="line.5457"></a>
-<span class="sourceLineNo">5458</span>    put2.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5458"></a>
-<span class="sourceLineNo">5459</span>    region.put(put2);<a name="line.5459"></a>
-<span class="sourceLineNo">5460</span><a name="line.5460"></a>
-<span class="sourceLineNo">5461</span>    Scan scan = new Scan(Bytes.toBytes("19998"));<a name="line.5461"></a>
-<span class="sourceLineNo">5462</span>    scan.setReversed(true);<a name="line.5462"></a>
-<span class="sourceLineNo">5463</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5463"></a>
-<span class="sourceLineNo">5464</span><a name="line.5464"></a>
-<span class="sourceLineNo">5465</span>    // create one storefile contains many rows will be skipped<a name="line.5465"></a>
-<span class="sourceLineNo">5466</span>    // to check StoreFileScanner.seekToPreviousRow<a name="line.5466"></a>
-<span class="sourceLineNo">5467</span>    for (int i = 10000; i &lt; 20000; i++) {<a name="line.5467"></a>
-<span class="sourceLineNo">5468</span>      Put p = new Put(Bytes.toBytes(""+i));<a name="line.5468"></a>
-<span class="sourceLineNo">5469</span>      p.addColumn(cf1, col, Bytes.toBytes("" + i));<a name="line.5469"></a>
-<span class="sourceLineNo">5470</span>      region.put(p);<a name="line.5470"></a>
-<span class="sourceLineNo">5471</span>    }<a name="line.5471"></a>
-<span class="sourceLineNo">5472</span>    region.flushcache(true, true, FlushLifeCycleTracker.DUMMY);<a name="line.5472"></a>
-<span class="sourceLineNo">5473</span><a name="line.5473"></a>
-<span class="sourceLineNo">5474</span>    // create one memstore contains many rows will be skipped<a name="line.5474"></a>
-<span class="sourceLineNo">5475</span>    // to check MemStoreScanner.seekToPreviousRow<a name="line.5475"></a>
-<span class="sourceLineNo">5476</span>    for (int i = 10000; i &lt; 20000; i++) {<a name="line.5476"></a>
-<span class="sourceLineNo">5477</span>      Put p = new Put(Bytes.toBytes(""+i));<a name="line.5477"></a>
-<span class="sourceLineNo">5478</span>      p.addColumn(cf1, col, Bytes.toBytes("" + i));<a name="line.5478"></a>
-<span class="sourceLineNo">5479</span>      region.put(p);<a name="line.5479"></a>
-<span class="sourceLineNo">5480</span>    }<a name="line.5480"></a>
-<span class="sourceLineNo">5481</span><a name="line.5481"></a>
-<span class="sourceLineNo">5482</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5482"></a>
-<span class="sourceLineNo">5483</span>    boolean hasNext;<a name="line.5483"></a>
-<span class="sourceLineNo">5484</span>    do {<a name="line.5484"></a>
-<span class="sourceLineNo">5485</span>      hasNext = scanner.next(currRow);<a name="line.5485"></a>
-<span class="sourceLineNo">5486</span>    } while (hasNext);<a name="line.5486"></a>
-<span class="sourceLineNo">5487</span>    assertEquals(2, currRow.size());<a name="line.5487"></a>
-<span class="sourceLineNo">5488</span>    assertEquals("19998", Bytes.toString(currRow.get(0).getRowArray(),<a name="line.5488"></a>
-<span class="sourceLineNo">5489</span>      currRow.get(0).getRowOffset(), currRow.get(0).getRowLength()));<a name="line.5489"></a>
-<span class="sourceLineNo">5490</span>    assertEquals("19997", Bytes.toString(currRow.get(1).getRowArray(),<a name="line.5490"></a>
-<span class="sourceLineNo">5491</span>      currRow.get(1).getRowOffset(), currRow.get(1).getRowLength()));<a name="line.5491"></a>
-<span class="sourceLineNo">5492</span>  }<a name="line.5492"></a>
-<span class="sourceLineNo">5493</span><a name="line.5493"></a>
-<span class="sourceLineNo">5494</span>  @Test<a name="line.5494"></a>
-<span class="sourceLineNo">5495</span>  public void testReverseScanShouldNotScanMemstoreIfReadPtLesser() throws Exception {<a name="line.5495"></a>
-<span class="sourceLineNo">5496</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5496"></a>
-<span class="sourceLineNo">5497</span>    byte[][] families = { cf1 };<a name="line.5497"></a>
-<span class="sourceLineNo">5498</span>    byte[] col = Bytes.toBytes("C");<a name="line.5498"></a>
-<span class="sourceLineNo">5499</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5499"></a>
-<span class="sourceLineNo">5500</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5500"></a>
-<span class="sourceLineNo">5501</span>    // setup with one storefile and one memstore, to create scanner and get an earlier readPt<a name="line.5501"></a>
-<span class="sourceLineNo">5502</span>    Put put = new Put(Bytes.toBytes("19996"));<a name="line.5502"></a>
-<span class="sourceLineNo">5503</span>    put.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5503"></a>
-<span class="sourceLineNo">5504</span>    region.put(put);<a name="line.5504"></a>
-<span class="sourceLineNo">5505</span>    Put put2 = new Put(Bytes.toBytes("19995"));<a name="line.5505"></a>
-<span class="sourceLineNo">5506</span>    put2.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5506"></a>
-<span class="sourceLineNo">5507</span>    region.put(put2);<a name="line.5507"></a>
-<span class="sourceLineNo">5508</span>    // create a reverse scan<a name="line.5508"></a>
-<span class="sourceLineNo">5509</span>    Scan scan = new Scan(Bytes.toBytes("19996"));<a name="line.5509"></a>
-<span class="sourceLineNo">5510</span>    scan.setReversed(true);<a name="line.5510"></a>
-<span class="sourceLineNo">5511</span>    RegionScannerImpl scanner = region.getScanner(scan);<a name="line.5511"></a>
-<span class="sourceLineNo">5512</span><a name="line.5512"></a>
-<span class="sourceLineNo">5513</span>    // flush the cache. This will reset the store scanner<a name="line.5513"></a>
-<span class="sourceLineNo">5514</span>    region.flushcache(true, true, FlushLifeCycleTracker.DUMMY);<a name="line.5514"></a>
-<span class="sourceLineNo">5515</span><a name="line.5515"></a>
-<span class="sourceLineNo">5516</span>    // create one memstore contains many rows will be skipped<a name="line.5516"></a>
-<span class="sourceLineNo">5517</span>    // to check MemStoreScanner.seekToPreviousRow<a name="line.5517"></a>
-<span class="sourceLineNo">5518</span>    for (int i = 10000; i &lt; 20000; i++) {<a name="line.5518"></a>
-<span class="sourceLineNo">5519</span>      Put p = new Put(Bytes.toBytes("" + i));<a name="line.5519"></a>
-<span class="sourceLineNo">5520</span>      p.addColumn(cf1, col, Bytes.toBytes("" + i));<a name="line.5520"></a>
-<span class="sourceLineNo">5521</span>      region.put(p);<a name="line.5521"></a>
-<span class="sourceLineNo">5522</span>    }<a name="line.5522"></a>
-<span class="sourceLineNo">5523</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5523"></a>
-<span class="sourceLineNo">5524</span>    boolean hasNext;<a name="line.5524"></a>
-<span class="sourceLineNo">5525</span>    boolean assertDone = false;<a name="line.5525"></a>
-<span class="sourceLineNo">5526</span>    do {<a name="line.5526"></a>
-<span class="sourceLineNo">5527</span>      hasNext = scanner.next(currRow);<a name="line.5527"></a>
-<span class="sourceLineNo">5528</span>      // With HBASE-15871, after the scanner is reset the memstore scanner should not be<a name="line.5528"></a>
-<span class="sourceLineNo">5529</span>      // added here<a name="line.5529"></a>
-<span class="sourceLineNo">5530</span>      if (!assertDone) {<a name="line.5530"></a>
-<span class="sourceLineNo">5531</span>        StoreScanner current =<a name="line.5531"></a>
-<span class="sourceLineNo">5532</span>            (StoreScanner) (scanner.storeHeap).getCurrentForTesting();<a name="line.5532"></a>
-<span class="sourceLineNo">5533</span>        List&lt;KeyValueScanner&gt; scanners = current.getAllScannersForTesting();<a name="line.5533"></a>
-<span class="sourceLineNo">5534</span>        assertEquals("There should be only one scanner the store file scanner", 1,<a name="line.5534"></a>
-<span class="sourceLineNo">5535</span>          scanners.size());<a name="line.5535"></a>
-<span class="sourceLineNo">5536</span>        assertDone = true;<a name="line.5536"></a>
-<span class="sourceLineNo">5537</span>      }<a name="line.5537"></a>
-<span class="sourceLineNo">5538</span>    } while (hasNext);<a name="line.5538"></a>
-<span class="sourceLineNo">5539</span>    assertEquals(2, currRow.size());<a name="line.5539"></a>
-<span class="sourceLineNo">5540</span>    assertEquals("19996", Bytes.toString(currRow.get(0).getRowArray(),<a name="line.5540"></a>
-<span class="sourceLineNo">5541</span>      currRow.get(0).getRowOffset(), currRow.get(0).getRowLength()));<a name="line.5541"></a>
-<span class="sourceLineNo">5542</span>    assertEquals("19995", Bytes.toString(currRow.get(1).getRowArray(),<a name="line.5542"></a>
-<span class="sourceLineNo">5543</span>      currRow.get(1).getRowOffset(), currRow.get(1).getRowLength()));<a name="line.5543"></a>
-<span class="sourceLineNo">5544</span>  }<a name="line.5544"></a>
-<span class="sourceLineNo">5545</span><a name="line.5545"></a>
-<span class="sourceLineNo">5546</span>  @Test<a name="line.5546"></a>
-<span class="sourceLineNo">5547</span>  public void testReverseScanWhenPutCellsAfterOpenReverseScan() throws Exception {<a name="line.5547"></a>
-<span class="sourceLineNo">5548</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5548"></a>
-<span class="sourceLineNo">5549</span>    byte[][] families = { cf1 };<a name="line.5549"></a>
-<span class="sourceLineNo">5550</span>    byte[] col = Bytes.toBytes("C");<a name="line.5550"></a>
-<span class="sourceLineNo">5551</span><a name="line.5551"></a>
-<span class="sourceLineNo">5552</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5552"></a>
-<span class="sourceLineNo">5553</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5553"></a>
-<span class="sourceLineNo">5554</span><a name="line.5554"></a>
-<span class="sourceLineNo">5555</span>    Put put = new Put(Bytes.toBytes("199996"));<a name="line.5555"></a>
-<span class="sourceLineNo">5556</span>    put.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5556"></a>
-<span class="sourceLineNo">5557</span>    region.put(put);<a name="line.5557"></a>
-<span class="sourceLineNo">5558</span>    Put put2 = new Put(Bytes.toBytes("199995"));<a name="line.5558"></a>
-<span class="sourceLineNo">5559</span>    put2.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5559"></a>
-<span class="sourceLineNo">5560</span>    region.put(put2);<a name="line.5560"></a>
+<span class="sourceLineNo">5411</span>    region.flush(true);<a name="line.5411"></a>
+<span class="sourceLineNo">5412</span>    // storefile3<a name="line.5412"></a>
+<span class="sourceLineNo">5413</span>    put = new Put(row3);<a name="line.5413"></a>
+<span class="sourceLineNo">5414</span>    put.add(kv3);<a name="line.5414"></a>
+<span class="sourceLineNo">5415</span>    region.put(put);<a name="line.5415"></a>
+<span class="sourceLineNo">5416</span>    region.flush(true);<a name="line.5416"></a>
+<span class="sourceLineNo">5417</span>    // memstore<a name="line.5417"></a>
+<span class="sourceLineNo">5418</span>    put = new Put(row4);<a name="line.5418"></a>
+<span class="sourceLineNo">5419</span>    put.add(kv4);<a name="line.5419"></a>
+<span class="sourceLineNo">5420</span>    region.put(put);<a name="line.5420"></a>
+<span class="sourceLineNo">5421</span>    // scan range = ["row4", min)<a name="line.5421"></a>
+<span class="sourceLineNo">5422</span>    Scan scan = new Scan(row4);<a name="line.5422"></a>
+<span class="sourceLineNo">5423</span>    scan.setReversed(true);<a name="line.5423"></a>
+<span class="sourceLineNo">5424</span>    scan.setBatch(10);<a name="line.5424"></a>
+<span class="sourceLineNo">5425</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5425"></a>
+<span class="sourceLineNo">5426</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5426"></a>
+<span class="sourceLineNo">5427</span>    boolean hasNext = scanner.next(currRow);<a name="line.5427"></a>
+<span class="sourceLineNo">5428</span>    assertEquals(1, currRow.size());<a name="line.5428"></a>
+<span class="sourceLineNo">5429</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5429"></a>
+<span class="sourceLineNo">5430</span>        .get(0).getRowLength(), row4, 0, row4.length));<a name="line.5430"></a>
+<span class="sourceLineNo">5431</span>    assertTrue(hasNext);<a name="line.5431"></a>
+<span class="sourceLineNo">5432</span>    currRow.clear();<a name="line.5432"></a>
+<span class="sourceLineNo">5433</span>    hasNext = scanner.next(currRow);<a name="line.5433"></a>
+<span class="sourceLineNo">5434</span>    assertEquals(1, currRow.size());<a name="line.5434"></a>
+<span class="sourceLineNo">5435</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5435"></a>
+<span class="sourceLineNo">5436</span>        .get(0).getRowLength(), row3, 0, row3.length));<a name="line.5436"></a>
+<span class="sourceLineNo">5437</span>    assertTrue(hasNext);<a name="line.5437"></a>
+<span class="sourceLineNo">5438</span>    currRow.clear();<a name="line.5438"></a>
+<span class="sourceLineNo">5439</span>    hasNext = scanner.next(currRow);<a name="line.5439"></a>
+<span class="sourceLineNo">5440</span>    assertEquals(1, currRow.size());<a name="line.5440"></a>
+<span class="sourceLineNo">5441</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5441"></a>
+<span class="sourceLineNo">5442</span>        .get(0).getRowLength(), row2, 0, row2.length));<a name="line.5442"></a>
+<span class="sourceLineNo">5443</span>    assertTrue(hasNext);<a name="line.5443"></a>
+<span class="sourceLineNo">5444</span>    currRow.clear();<a name="line.5444"></a>
+<span class="sourceLineNo">5445</span>    hasNext = scanner.next(currRow);<a name="line.5445"></a>
+<span class="sourceLineNo">5446</span>    assertEquals(1, currRow.size());<a name="line.5446"></a>
+<span class="sourceLineNo">5447</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5447"></a>
+<span class="sourceLineNo">5448</span>        .get(0).getRowLength(), row1, 0, row1.length));<a name="line.5448"></a>
+<span class="sourceLineNo">5449</span>    assertFalse(hasNext);<a name="line.5449"></a>
+<span class="sourceLineNo">5450</span>  }<a name="line.5450"></a>
+<span class="sourceLineNo">5451</span><a name="line.5451"></a>
+<span class="sourceLineNo">5452</span>  /**<a name="line.5452"></a>
+<span class="sourceLineNo">5453</span>   * Test for HBASE-14497: Reverse Scan threw StackOverflow caused by readPt checking<a name="line.5453"></a>
+<span class="sourceLineNo">5454</span>   */<a name="line.5454"></a>
+<span class="sourceLineNo">5455</span>  @Test<a name="line.5455"></a>
+<span class="sourceLineNo">5456</span>  public void testReverseScanner_StackOverflow() throws IOException {<a name="line.5456"></a>
+<span class="sourceLineNo">5457</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5457"></a>
+<span class="sourceLineNo">5458</span>    byte[][] families = {cf1};<a name="line.5458"></a>
+<span class="sourceLineNo">5459</span>    byte[] col = Bytes.toBytes("C");<a name="line.5459"></a>
+<span class="sourceLineNo">5460</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5460"></a>
+<span class="sourceLineNo">5461</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5461"></a>
+<span class="sourceLineNo">5462</span>    // setup with one storefile and one memstore, to create scanner and get an earlier readPt<a name="line.5462"></a>
+<span class="sourceLineNo">5463</span>    Put put = new Put(Bytes.toBytes("19998"));<a name="line.5463"></a>
+<span class="sourceLineNo">5464</span>    put.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5464"></a>
+<span class="sourceLineNo">5465</span>    region.put(put);<a name="line.5465"></a>
+<span class="sourceLineNo">5466</span>    region.flushcache(true, true, FlushLifeCycleTracker.DUMMY);<a name="line.5466"></a>
+<span class="sourceLineNo">5467</span>    Put put2 = new Put(Bytes.toBytes("19997"));<a name="line.5467"></a>
+<span class="sourceLineNo">5468</span>    put2.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5468"></a>
+<span class="sourceLineNo">5469</span>    region.put(put2);<a name="line.5469"></a>
+<span class="sourceLineNo">5470</span><a name="line.5470"></a>
+<span class="sourceLineNo">5471</span>    Scan scan = new Scan(Bytes.toBytes("19998"));<a name="line.5471"></a>
+<span class="sourceLineNo">5472</span>    scan.setReversed(true);<a name="line.5472"></a>
+<span class="sourceLineNo">5473</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5473"></a>
+<span class="sourceLineNo">5474</span><a name="line.5474"></a>
+<span class="sourceLineNo">5475</span>    // create one storefile contains many rows will be skipped<a name="line.5475"></a>
+<span class="sourceLineNo">5476</span>    // to check StoreFileScanner.seekToPreviousRow<a name="line.5476"></a>
+<span class="sourceLineNo">5477</span>    for (int i = 10000; i &lt; 20000; i++) {<a name="line.5477"></a>
+<span class="sourceLineNo">5478</span>      Put p = new Put(Bytes.toBytes(""+i));<a name="line.5478"></a>
+<span class="sourceLineNo">5479</span>      p.addColumn(cf1, col, Bytes.toBytes("" + i));<a name="line.5479"></a>
+<span class="sourceLineNo">5480</span>      region.put(p);<a name="line.5480"></a>
+<span class="sourceLineNo">5481</span>    }<a name="line.5481"></a>
+<span class="sourceLineNo">5482</span>    region.flushcache(true, true, FlushLifeCycleTracker.DUMMY);<a name="line.5482"></a>
+<span class="sourceLineNo">5483</span><a name="line.5483"></a>
+<span class="sourceLineNo">5484</span>    // create one memstore contains many rows will be skipped<a name="line.5484"></a>
+<span class="sourceLineNo">5485</span>    // to check MemStoreScanner.seekToPreviousRow<a name="line.5485"></a>
+<span class="sourceLineNo">5486</span>    for (int i = 10000; i &lt; 20000; i++) {<a name="line.5486"></a>
+<span class="sourceLineNo">5487</span>      Put p = new Put(Bytes.toBytes(""+i));<a name="line.5487"></a>
+<span class="sourceLineNo">5488</span>      p.addColumn(cf1, col, Bytes.toBytes("" + i));<a name="line.5488"></a>
+<span class="sourceLineNo">5489</span>      region.put(p);<a name="line.5489"></a>
+<span class="sourceLineNo">5490</span>    }<a name="line.5490"></a>
+<span class="sourceLineNo">5491</span><a name="line.5491"></a>
+<span class="sourceLineNo">5492</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5492"></a>
+<span class="sourceLineNo">5493</span>    boolean hasNext;<a name="line.5493"></a>
+<span class="sourceLineNo">5494</span>    do {<a name="line.5494"></a>
+<span class="sourceLineNo">5495</span>      hasNext = scanner.next(currRow);<a name="line.5495"></a>
+<span class="sourceLineNo">5496</span>    } while (hasNext);<a name="line.5496"></a>
+<span class="sourceLineNo">5497</span>    assertEquals(2, currRow.size());<a name="line.5497"></a>
+<span class="sourceLineNo">5498</span>    assertEquals("19998", Bytes.toString(currRow.get(0).getRowArray(),<a name="line.5498"></a>
+<span class="sourceLineNo">5499</span>      currRow.get(0).getRowOffset(), currRow.get(0).getRowLength()));<a name="line.5499"></a>
+<span class="sourceLineNo">5500</span>    assertEquals("19997", Bytes.toString(currRow.get(1).getRowArray(),<a name="line.5500"></a>
+<span class="sourceLineNo">5501</span>      currRow.get(1).getRowOffset(), currRow.get(1).getRowLength()));<a name="line.5501"></a>
+<span class="sourceLineNo">5502</span>  }<a name="line.5502"></a>
+<span class="sourceLineNo">5503</span><a name="line.5503"></a>
+<span class="sourceLineNo">5504</span>  @Test<a name="line.5504"></a>
+<span class="sourceLineNo">5505</span>  public void testReverseScanShouldNotScanMemstoreIfReadPtLesser() throws Exception {<a name="line.5505"></a>
+<span class="sourceLineNo">5506</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5506"></a>
+<span class="sourceLineNo">5507</span>    byte[][] families = { cf1 };<a name="line.5507"></a>
+<span class="sourceLineNo">5508</span>    byte[] col = Bytes.toBytes("C");<a name="line.5508"></a>
+<span class="sourceLineNo">5509</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5509"></a>
+<span class="sourceLineNo">5510</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5510"></a>
+<span class="sourceLineNo">5511</span>    // setup with one storefile and one memstore, to create scanner and get an earlier readPt<a name="line.5511"></a>
+<span class="sourceLineNo">5512</span>    Put put = new Put(Bytes.toBytes("19996"));<a name="line.5512"></a>
+<span class="sourceLineNo">5513</span>    put.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5513"></a>
+<span class="sourceLineNo">5514</span>    region.put(put);<a name="line.5514"></a>
+<span class="sourceLineNo">5515</span>    Put put2 = new Put(Bytes.toBytes("19995"));<a name="line.5515"></a>
+<span class="sourceLineNo">5516</span>    put2.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5516"></a>
+<span class="sourceLineNo">5517</span>    region.put(put2);<a name="line.5517"></a>
+<span class="sourceLineNo">5518</span>    // create a reverse scan<a name="line.5518"></a>
+<span class="sourceLineNo">5519</span>    Scan scan = new Scan(Bytes.toBytes("19996"));<a name="line.5519"></a>
+<span class="sourceLineNo">5520</span>    scan.setReversed(true);<a name="line.5520"></a>
+<span class="sourceLineNo">5521</span>    RegionScannerImpl scanner = region.getScanner(scan);<a name="line.5521"></a>
+<span class="sourceLineNo">5522</span><a name="line.5522"></a>
+<span class="sourceLineNo">5523</span>    // flush the cache. This will reset the store scanner<a name="line.5523"></a>
+<span class="sourceLineNo">5524</span>    region.flushcache(true, true, FlushLifeCycleTracker.DUMMY);<a name="line.5524"></a>
+<span class="sourceLineNo">5525</span><a name="line.5525"></a>
+<span class="sourceLineNo">5526</span>    // create one memstore contains many rows will be skipped<a name="line.5526"></a>
+<span class="sourceLineNo">5527</span>    // to check MemStoreScanner.seekToPreviousRow<a name="line.5527"></a>
+<span class="sourceLineNo">5528</span>    for (int i = 10000; i &lt; 20000; i++) {<a name="line.5528"></a>
+<span class="sourceLineNo">5529</span>      Put p = new Put(Bytes.toBytes("" + i));<a name="line.5529"></a>
+<span class="sourceLineNo">5530</span>      p.addColumn(cf1, col, Bytes.toBytes("" + i));<a name="line.5530"></a>
+<span class="sourceLineNo">5531</span>      region.put(p);<a name="line.5531"></a>
+<span class="sourceLineNo">5532</span>    }<a name="line.5532"></a>
+<span class="sourceLineNo">5533</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5533"></a>
+<span class="sourceLineNo">5534</span>    boolean hasNext;<a name="line.5534"></a>
+<span class="sourceLineNo">5535</span>    boolean assertDone = false;<a name="line.5535"></a>
+<span class="sourceLineNo">5536</span>    do {<a name="line.5536"></a>
+<span class="sourceLineNo">5537</span>      hasNext = scanner.next(currRow);<a name="line.5537"></a>
+<span class="sourceLineNo">5538</span>      // With HBASE-15871, after the scanner is reset the memstore scanner should not be<a name="line.5538"></a>
+<span class="sourceLineNo">5539</span>      // added here<a name="line.5539"></a>
+<span class="sourceLineNo">5540</span>      if (!assertDone) {<a name="line.5540"></a>
+<span class="sourceLineNo">5541</span>        StoreScanner current =<a name="line.5541"></a>
+<span class="sourceLineNo">5542</span>            (StoreScanner) (scanner.storeHeap).getCurrentForTesting();<a name="line.5542"></a>
+<span class="sourceLineNo">5543</span>        List&lt;KeyValueScanner&gt; scanners = current.getAllScannersForTesting();<a name="line.5543"></a>
+<span class="sourceLineNo">5544</span>        assertEquals("There should be only one scanner the store file scanner", 1,<a name="line.5544"></a>
+<span class="sourceLineNo">5545</span>          scanners.size());<a name="line.5545"></a>
+<span class="sourceLineNo">5546</span>        assertDone = true;<a name="line.5546"></a>
+<span class="sourceLineNo">5547</span>      }<a name="line.5547"></a>
+<span class="sourceLineNo">5548</span>    } while (hasNext);<a name="line.5548"></a>
+<span class="sourceLineNo">5549</span>    assertEquals(2, currRow.size());<a name="line.5549"></a>
+<span class="sourceLineNo">5550</span>    assertEquals("19996", Bytes.toString(currRow.get(0).getRowArray(),<a name="line.5550"></a>
+<span class="sourceLineNo">5551</span>      currRow.get(0).getRowOffset(), currRow.get(0).getRowLength()));<a name="line.5551"></a>
+<span class="sourceLineNo">5552</span>    assertEquals("19995", Bytes.toString(currRow.get(1).getRowArray(),<a name="line.5552"></a>
+<span class="sourceLineNo">5553</span>      currRow.get(1).getRowOffset(), currRow.get(1).getRowLength()));<a name="line.5553"></a>
+<span class="sourceLineNo">5554</span>  }<a name="line.5554"></a>
+<span class="sourceLineNo">5555</span><a name="line.5555"></a>
+<span class="sourceLineNo">5556</span>  @Test<a name="line.5556"></a>
+<span class="sourceLineNo">5557</span>  public void testReverseScanWhenPutCellsAfterOpenReverseScan() throws Exception {<a name="line.5557"></a>
+<span class="sourceLineNo">5558</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5558"></a>
+<span class="sourceLineNo">5559</span>    byte[][] families = { cf1 };<a name="line.5559"></a>
+<span class="sourceLineNo">5560</span>    byte[] col = Bytes.toBytes("C");<a name="line.5560"></a>
 <span class="sourceLineNo">5561</span><a name="line.5561"></a>
-<span class="sourceLineNo">5562</span>    // Create a reverse scan<a name="line.5562"></a>
-<span class="sourceLineNo">5563</span>    Scan scan = new Scan(Bytes.toBytes("199996"));<a name="line.5563"></a>
-<span class="sourceLineNo">5564</span>    scan.setReversed(true);<a name="line.5564"></a>
-<span class="sourceLineNo">5565</span>    RegionScannerImpl scanner = region.getScanner(scan);<a name="line.5565"></a>
-<span class="sourceLineNo">5566</span><a name="line.5566"></a>
-<span class="sourceLineNo">5567</span>    // Put a lot of cells that have sequenceIDs grater than the readPt of the reverse scan<a name="line.5567"></a>
-<span class="sourceLineNo">5568</span>    for (int i = 100000; i &lt; 200000; i++) {<a name="line.5568"></a>
-<span class="sourceLineNo">5569</span>      Put p = new Put(Bytes.toBytes("" + i));<a name="line.5569"></a>
-<span class="sourceLineNo">5570</span>      p.addColumn(cf1, col, Bytes.toBytes("" + i));<a name="line.5570"></a>
-<span class="sourceLineNo">5571</span>      region.put(p);<a name="line.5571"></a>
-<span class="sourceLineNo">5572</span>    }<a name="line.5572"></a>
-<span class="sourceLineNo">5573</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5573"></a>
-<span class="sourceLineNo">5574</span>    boolean hasNext;<a name="line.5574"></a>
-<span class="sourceLineNo">5575</span>    do {<a name="line.5575"></a>
-<span class="sourceLineNo">5576</span>      hasNext = scanner.next(currRow);<a name="line.5576"></a>
-<span class="sourceLineNo">5577</span>    } while (hasNext);<a name="line.5577"></a>
-<span class="sourceLineNo">5578</span><a name="line.5578"></a>
-<span class="sourceLineNo">5579</span>    assertEquals(2, currRow.size());<a name="line.5579"></a>
-<span class="sourceLineNo">5580</span>    assertEquals("199996", Bytes.toString(currRow.get(0).getRowArray(),<a name="line.5580"></a>
-<span class="sourceLineNo">5581</span>      currRow.get(0).getRowOffset(), currRow.get(0).getRowLength()));<a name="line.5581"></a>
-<span class="sourceLineNo">5582</span>    assertEquals("199995", Bytes.toString(currRow.get(1).getRowArray(),<a name="line.5582"></a>
-<span class="sourceLineNo">5583</span>      currRow.get(1).getRowOffset(), currRow.get(1).getRowLength()));<a name="line.5583"></a>
-<span class="sourceLineNo">5584</span>  }<a name="line.5584"></a>
-<span class="sourceLineNo">5585</span><a name="line.5585"></a>
-<span class="sourceLineNo">5586</span>  @Test<a name="line.5586"></a>
-<span class="sourceLineNo">5587</span>  public void testWriteRequestsCounter() throws IOException {<a name="line.5587"></a>
-<span class="sourceLineNo">5588</span>    byte[] fam = Bytes.toBytes("info");<a name="line.5588"></a>
-<span class="sourceLineNo">5589</span>    byte[][] families = { fam };<a name="line.5589"></a>
-<span class="sourceLineNo">5590</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.5590"></a>
-<span class="sourceLineNo">5591</span><a name="line.5591"></a>
-<span class="sourceLineNo">5592</span>    Assert.assertEquals(0L, region.getWriteRequestsCount());<a name="line.5592"></a>
-<span class="sourceLineNo">5593</span><a name="line.5593"></a>
-<span class="sourceLineNo">5594</span>    Put put = new Put(row);<a name="line.5594"></a>
-<span class="sourceLineNo">5595</span>    put.addColumn(fam, fam, fam);<a name="line.5595"></a>
-<span class="sourceLineNo">5596</span><a name="line.5596"></a>
-<span class="sourceLineNo">5597</span>    Assert.assertEquals(0L, region.getWriteRequestsCount());<a name="line.5597"></a>
-<span class="sourceLineNo">5598</span>    region.put(put);<a name="line.5598"></a>
-<span class="sourceLineNo">5599</span>    Assert.assertEquals(1L, region.getWriteRequestsCount());<a name="line.5599"></a>
-<span class="sourceLineNo">5600</span>    region.put(put);<a name="line.5600"></a>
-<span class="sourceLineNo">5601</span>    Assert.assertEquals(2L, region.getWriteRequestsCount());<a name="line.5601"></a>
-<span class="sourceLineNo">5602</span>    region.put(put);<a name="line.5602"></a>
-<span class="sourceLineNo">5603</span>    Assert.assertEquals(3L, region.getWriteRequestsCount());<a name="line.5603"></a>
-<span class="sourceLineNo">5604</span><a name="line.5604"></a>
-<span class="sourceLineNo">5605</span>    region.delete(new Delete(row));<a name="line.5605"></a>
-<span class="sourceLineNo">5606</span>    Assert.assertEquals(4L, region.getWriteRequestsCount());<a name="line.5606"></a>
-<span class="sourceLineNo">5607</span>  }<a name="line.5607"></a>
-<span class="sourceLineNo">5608</span><a name="line.5608"></a>
-<span class="sourceLineNo">5609</span>  @Test<a name="line.5609"></a>
-<span class="sourceLineNo">5610</span>  public void testOpenRegionWrittenToWAL() throws Exception {<a name="line.5610"></a>
-<span class="sourceLineNo">5611</span>    final ServerName serverName = ServerName.valueOf(name.getMethodName(), 100, 42);<a name="line.5611"></a>
-<span class="sourceLineNo">5612</span>    final RegionServerServices rss = spy(TEST_UTIL.createMockRegionServerService(serverName));<a name="line.5612"></a>
-<span class="sourceLineNo">5613</span><a name="line.5613"></a>
-<span class="sourceLineNo">5614</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.5614"></a>
-<span class="sourceLineNo">5615</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.5615"></a>
-<span class="sourceLineNo">5616</span>    htd.addFamily(new HColumnDescriptor(fam2));<a name="line.5616"></a>
-<span class="sourceLineNo">5617</span><a name="line.5617"></a>
-<span class="sourceLineNo">5618</span>    HRegionInfo hri = new HRegionInfo(htd.getTableName(),<a name="line.5618"></a>
-<span class="sourceLineNo">5619</span>      HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY);<a name="line.5619"></a>
-<span class="sourceLineNo">5620</span><a name="line.5620"></a>
-<span class="sourceLineNo">5621</span>    // open the region w/o rss and wal and flush some files<a name="line.5621"></a>
-<span class="sourceLineNo">5622</span>    region =<a name="line.5622"></a>
-<span class="sourceLineNo">5623</span>         HBaseTestingUtility.createRegionAndWAL(hri, TEST_UTIL.getDataTestDir(), TEST_UTIL<a name="line.5623"></a>
-<span class="sourceLineNo">5624</span>             .getConfiguration(), htd);<a name="line.5624"></a>
-<span class="sourceLineNo">5625</span>    assertNotNull(region);<a name="line.5625"></a>
-<span class="sourceLineNo">5626</span><a name="line.5626"></a>
-<span class="sourceLineNo">5627</span>    // create a file in fam1 for the region before opening in OpenRegionHandler<a name="line.5627"></a>
-<span class="sourceLineNo">5628</span>    region.put(new Put(Bytes.toBytes("a")).addColumn(fam1, fam1, fam1));<a name="line.5628"></a>
-<span class="sourceLineNo">5629</span>    region.flush(true);<a name="line.5629"></a>
-<span class="sourceLineNo">5630</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.5630"></a>
-<span class="sourceLineNo">5631</span><a name="line.5631"></a>
-<span class="sourceLineNo">5632</span>    ArgumentCaptor&lt;WALEdit&gt; editCaptor = ArgumentCaptor.forClass(WALEdit.class);<a name="line.5632"></a>
-<span class="sourceLineNo">5633</span><a name="line.5633"></a>
-<span class="sourceLineNo">5634</span>    // capture append() calls<a name="line.5634"></a>
-<span class="sourceLineNo">5635</span>    WAL wal = mockWAL();<a name="line.5635"></a>
-<span class="sourceLineNo">5636</span>    when(rss.getWAL((HRegionInfo) any())).thenReturn(wal);<a name="line.5636"></a>
-<span class="sourceLineNo">5637</span><a name="line.5637"></a>
-<span class="sourceLineNo">5638</span>    region = HRegion.openHRegion(hri, htd, rss.getWAL(hri),<a name="line.5638"></a>
-<span class="sourceLineNo">5639</span>      TEST_UTIL.getConfiguration(), rss, null);<a name="line.5639"></a>
-<span class="sourceLineNo">5640</span><a name="line.5640"></a>
-<span class="sourceLineNo">5641</span>    verify(wal, times(1)).append((HRegionInfo)any(), (WALKeyImpl)any()<a name="line.5641"></a>
-<span class="sourceLineNo">5642</span>      , editCaptor.capture(), anyBoolean());<a name="line.5642"></a>
+<span class="sourceLineNo">5562</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5562"></a>
+<span class="sourceLineNo">5563</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5563"></a>
+<span class="sourceLineNo">5564</span><a name="line.5564"></a>
+<span class="sourceLineNo">5565</span>    Put put = new Put(Bytes.toBytes("199996"));<a name="line.5565"></a>
+<span class="sourceLineNo">5566</span>    put.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5566"></a>
+<span class="sourceLineNo">5567</span>    region.put(put);<a name="line.5567"></a>
+<span class="sourceLineNo">5568</span>    Put put2 = new Put(Bytes.toBytes("199995"));<a name="line.5568"></a>
+<span class="sourceLineNo">5569</span>    put2.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5569"></a>
+<span class="sourceLineNo">5570</span>    region.put(put2);<a name="line.5570"></a>
+<span class="sourceLineNo">5571</span><a name="line.5571"></a>
+<span class="sourceLineNo">5572</span>    // Create a reverse scan<a name="line.5572"></a>
+<span class="sourceLineNo">5573</span>    Scan scan = new Scan(Bytes.toBytes("199996"));<a name="line.5573"></a>
+<span class="sourceLineNo">5574</span>    scan.setReversed(true);<a name="line.5574"></a>
+<span class="sourceLineNo">5575</span>    RegionScannerImpl scanner = region.getScanner(scan);<a name="line.5575"></a>
+<span class="sourceLineNo">5576</span><a name="line.5576"></a>
+<span class="sourceLineNo">5577</span>    // Put a lot of cells that have sequenceIDs grater than the readPt of the reverse scan<a name="line.5577"></a>
+<span class="sourceLineNo">5578</span>    for (int i = 100000; i &lt; 200000; i++) {<a name="line.5578"></a>
+<span class="sourceLineNo">5579</span>      Put p = new Put(Bytes.toBytes("" + i));<a name="line.5579"></a>
+<span class="sourceLineNo">5580</span>      p.addColumn(cf1, col, Bytes.toBytes("" + i));<a name="line.5580"></a>
+<span class="sourceLineNo">5581</span>      region.put(p);<a name="line.5581"></a>
+<span class="sourceLineNo">5582</span>    }<a name="line.5582"></a>
+<span class="sourceLineNo">5583</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5583"></a>
+<span class="sourceLineNo">5584</span>    boolean hasNext;<a name="line.5584"></a>
+<span class="sourceLineNo">5585</span>    do {<a name="line.5585"></a>
+<span class="sourceLineNo">5586</span>      hasNext = scanner.next(currRow);<a name="line.5586"></a>
+<span class="sourceLineNo">5587</span>    } while (hasNext);<a name="line.5587"></a>
+<span class="sourceLineNo">5588</span><a name="line.5588"></a>
+<span class="sourceLineNo">5589</span>    assertEquals(2, currRow.size());<a name="line.5589"></a>
+<span class="sourceLineNo">5590</span>    assertEquals("199996", Bytes.toString(currRow.get(0).getRowArray(),<a name="line.5590"></a>
+<span class="sourceLineNo">5591</span>      currRow.get(0).getRowOffset(), currRow.get(0).getRowLength()));<a name="line.5591"></a>
+<span class="sourceLineNo">5592</span>    assertEquals("199995", Bytes.toString(currRow.get(1).getRowArray(),<a name="line.5592"></a>
+<span class="sourceLineNo">5593</span>      currRow.get(1).getRowOffset(), currRow.get(1).getRowLength()));<a name="line.5593"></a>
+<span class="sourceLineNo">5594</span>  }<a name="line.5594"></a>
+<span class="sourceLineNo">5595</span><a name="line.5595"></a>
+<span class="sourceLineNo">5596</span>  @Test<a name="line.5596"></a>
+<span class="sourceLineNo">5597</span>  public void testWriteRequestsCounter() throws IOException {<a name="line.5597"></a>
+<span class="sourceLineNo">5598</span>    byte[] fam = Bytes.toBytes("info");<a name="line.5598"></a>
+<span class="sourceLineNo">5599</span>    byte[][] families = { fam };<a name="line.5599"></a>
+<span class="sourceLineNo">5600</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.5600"></a>
+<span class="sourceLineNo">5601</span><a name="line.5601"></a>
+<span class="sourceLineNo">5602</span>    Assert.assertEquals(0L, region.getWriteRequestsCount());<a name="line.5602"></a>
+<span class="sourceLineNo">5603</span><a name="line.5603"></a>
+<span class="sourceLineNo">5604</span>    Put put = new Put(row);<a name="line.5604"></a>
+<span class="sourceLineNo">5605</span>    put.addColumn(fam, fam, fam);<a name="line.5605"></a>
+<span class="sourceLineNo">5606</span><a name="line.5606"></a>
+<span class="sourceLineNo">5607</span>    Assert.assertEquals(0L, region.getWriteRequestsCount());<a name="line.5607"></a>
+<span class="sourceLineNo">5608</span>    region.put(put);<a name="line.5608"></a>
+<span class="sourceLineNo">5609</span>    Assert.assertEquals(1L, region.getWriteRequestsCount());<a name="line.5609"></a>
+<span class="sourceLineNo">5610</span>    region.put(put);<a name="line.5610"></a>
+<span class="sourceLineNo">5611</span>    Assert.assertEquals(2L, region.getWriteRequestsCount());<a name="line.5611"></a>
+<span class="sourceLineNo">5612</span>    region.put(put);<a name="line.5612"></a>
+<span class="sourceLineNo">5613</span>    Assert.assertEquals(3L, region.getWriteRequestsCount());<a name="line.5613"></a>
+<span class="sourceLineNo">5614</span><a name="line.5614"></a>
+<span class="sourceLineNo">5615</span>    region.delete(new Delete(row));<a name="line.5615"></a>
+<span class="sourceLineNo">5616</span>    Assert.assertEquals(4L, region.getWriteRequestsCount());<a name="line.5616"></a>
+<span class="sourceLineNo">5617</span>  }<a name="line.5617"></a>
+<span class="sourceLineNo">5618</span><a name="line.5618"></a>
+<span class="sourceLineNo">5619</span>  @Test<a name="line.5619"></a>
+<span class="sourceLineNo">5620</span>  public void testOpenRegionWrittenToWAL() throws Exception {<a name="line.5620"></a>
+<span class="sourceLineNo">5621</span>    final ServerName serverName = ServerName.valueOf(name.getMethodName(), 100, 42);<a name="line.5621"></a>
+<span class="sourceLineNo">5622</span>    final RegionServerServices rss = spy(TEST_UTIL.createMockRegionServerService(serverName));<a name="line.5622"></a>
+<span class="sourceLineNo">5623</span><a name="line.5623"></a>
+<span class="sourceLineNo">5624</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.5624"></a>
+<span class="sourceLineNo">5625</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.5625"></a>
+<span class="sourceLineNo">5626</span>    htd.addFamily(new HColumnDescriptor(fam2));<a name="line.5626"></a>
+<span class="sourceLineNo">5627</span><a name="line.5627"></a>
+<span class="sourceLineNo">5628</span>    HRegionInfo hri = new HRegionInfo(htd.getTableName(),<a name="line.5628"></a>
+<span class="sourceLineNo">5629</span>      HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY);<a name="line.5629"></a>
+<span class="sourceLineNo">5630</span><a name="line.5630"></a>
+<span class="sourceLineNo">5631</span>    // open the region w/o rss and wal and flush some files<a name="line.5631"></a>
+<span class="sourceLineNo">5632</span>    region =<a name="line.5632"></a>
+<span class="sourceLineNo">5633</span>         HBaseTestingUtility.createRegionAndWAL(hri, TEST_UTIL.getDataTestDir(), TEST_UTIL<a name="line.5633"></a>
+<span class="sourceLineNo">5634</span>             .getConfiguration(), htd);<a name="line.5634"></a>
+<span class="sourceLineNo">5635</span>    assertNotNull(region);<a name="line.5635"></a>
+<span class="sourceLineNo">5636</span><a name="line.5636"></a>
+<span class="sourceLineNo">5637</span>    // create a file in fam1 for the region before opening in OpenRegionHandler<a name="line.5637"></a>
+<span class="sourceLineNo">5638</span>    region.put(new Put(Bytes.toBytes("a")).addColumn(fam1, fam1, fam1));<a name="line.5638"></a>
+<span class="sourceLineNo">5639</span>    region.flush(true);<a name="line.5639"></a>
+<span class="sourceLineNo">5640</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.5640"></a>
+<span class="sourceLineNo">5641</span><a name="line.5641"></a>
+<span class="sourceLineNo">5642</span>    ArgumentCaptor&lt;WALEdit&gt; editCaptor = ArgumentCaptor.forClass(WALEdit.class);<a name="line.5642"></a>
 <span class="sourceLineNo">5643</span><a name="line.5643"></a>
-<span class="sourceLineNo">5644</span>    WALEdit edit = editCaptor.getValue();<a name="line.5644"></a>
-<span class="sourceLineNo">5645</span>    assertNotNull(edit);<a name="line.5645"></a>
-<span class="sourceLineNo">5646</span>    assertNotNull(edit.getCells());<a name="line.5646"></a>
-<span class="sourceLineNo">5647</span>    assertEquals(1, edit.getCells().size());<a name="line.5647"></a>
-<span class="sourceLineNo">5648</span>    RegionEventDescriptor desc = WALEdit.getRegionEventDescriptor(edit.getCells().get(0));<a name="line.5648"></a>
-<span class="sourceLineNo">5649</span>    assertNotNull(desc);<a name="line.5649"></a>
+<span class="sourceLineNo">5644</span>    // capture append() calls<a name="line.5644"></a>
+<span class="sourceLineNo">5645</span>    WAL wal = mockWAL();<a name="line.5645"></a>
+<span class="sourceLineNo">5646</span>    when(rss.getWAL((HRegionInfo) any())).thenReturn(wal);<a name="line.5646"></a>
+<span class="sourceLineNo">5647</span><a name="line.5647"></a>
+<span class="sourceLineNo">5648</span>    region = HRegion.openHRegion(hri, htd, rss.getWAL(hri),<a name="line.5648"></a>
+<span class="sourceLineNo">5649</span>      TEST_UTIL.getConfiguration(), rss, null);<a name="line.5649"></a>
 <span class="sourceLineNo">5650</span><a name="line.5650"></a>
-<span class="sourceLineNo">5651</span>    LOG.info("RegionEventDescriptor from WAL: " + desc);<a name="line.5651"></a>
-<span class="sourceLineNo">5652</span><a name="line.5652"></a>
-<span class="sourceLineNo">5653</span>    assertEquals(RegionEventDescriptor.EventType.REGION_OPEN, desc.getEventType());<a name="line.5653"></a>
-<span class="sourceLineNo">5654</span>    assertTrue(Bytes.equals(desc.getTableName().toByteArray(), htd.getTableName().toBytes()));<a name="line.5654"></a>
-<span class="sourceLineNo">5655</span>    assertTrue(Bytes.equals(desc.getEncodedRegionName().toByteArray(),<a name="line.5655"></a>
-<span class="sourceLineNo">5656</span>      hri.getEncodedNameAsBytes()));<a name="line.5656"></a>
-<span class="sourceLineNo">5657</span>    assertTrue(desc.getLogSequenceNumber() &gt; 0);<a name="line.5657"></a>
-<span class="sourceLineNo">5658</span>    assertEquals(serverName, ProtobufUtil.toServerName(desc.getServer()));<a name="line.5658"></a>
-<span class="sourceLineNo">5659</span>    assertEquals(2, desc.getStoresCount());<a name="line.5659"></a>
+<span class="sourceLineNo">5651</span>    verify(wal, times(1)).append((HRegionInfo)any(), (WALKeyImpl)any()<a name="line.5651"></a>
+<span class="sourceLineNo">5652</span>      , editCaptor.capture(), anyBoolean());<a name="line.5652"></a>
+<span class="sourceLineNo">5653</span><a name="line.5653"></a>
+<span class="sourceLineNo">5654</span>    WALEdit edit = editCaptor.getValue();<a name="line.5654"></a>
+<span class="sourceLineNo">5655</span>    assertNotNull(edit);<a name="line.5655"></a>
+<span class="sourceLineNo">5656</span>    assertNotNull(edit.getCells());<a name="line.5656"></a>
+<span class="sourceLineNo">5657</span>    assertEquals(1, edit.getCells().size());<a name="line.5657"></a>
+<span class="sourceLineNo">5658</span>    RegionEventDescriptor desc = WALEdit.getRegionEventDescriptor(edit.getCells().get(0));<a name="line.5658"></a>
+<span class="sourceLineNo">5659</span>    assertNotNull(desc);<a name="line.5659"></a>
 <span class="sourceLineNo">5660</span><a name="line.5660"></a>
-<span class="sourceLineNo">5661</span>    StoreDescriptor store = desc.getStores(0);<a name="line.5661"></a>
-<span class="sourceLineNo">5662</span>    assertTrue(Bytes.equals(store.getFamilyName().toByteArray(), fam1));<a name="line.5662"></a>
-<span class="sourceLineNo">5663</span>    assertEquals(store.getStoreHomeDir(), Bytes.toString(fam1));<a name="line.5663"></a>
-<span class="sourceLineNo">5664</span>    assertEquals(1, store.getStoreFileCount()); // 1store file<a name="line.5664"></a>
-<span class="sourceLineNo">5665</span>    assertFalse(store.getStoreFile(0).contains("/")); // ensure path is relative<a name="line.5665"></a>
-<span class="sourceLineNo">5666</span><a name="line.5666"></a>
-<span class="sourceLineNo">5667</span>    store = desc.getStores(1);<a name="line.5667"></a>
-<span class="sourceLineNo">5668</span>    assertTrue(Bytes.equals(store.getFamilyName().toByteArray(), fam2));<a name="line.5668"></a>
-<span class="sourceLineNo">5669</span>    assertEquals(store.getStoreHomeDir(), Bytes.toString(fam2));<a name="line.5669"></a>
-<span class="sourceLineNo">5670</span>    assertEquals(0, store.getStoreFileCount()); // no store files<a name="line.5670"></a>
-<span class="sourceLineNo">5671</span>  }<a name="line.5671"></a>
-<span class="sourceLineNo">5672</span><a name="line.5672"></a>
-<span class="sourceLineNo">5673</span>  // Helper for test testOpenRegionWrittenToWALForLogReplay<a name="line.5673"></a>
-<span class="sourceLineNo">5674</span>  static class HRegionWithSeqId extends HRegion {<a name="line.5674"></a>
-<span class="sourceLineNo">5675</span>    public HRegionWithSeqId(final Path tableDir, final WAL wal, final FileSystem fs,<a name="line.5675"></a>
-<span class="sourceLineNo">5676</span>        final Configuration confParam, final RegionInfo regionInfo,<a name="line.5676"></a>
-<span class="sourceLineNo">5677</span>        final TableDescriptor htd, final RegionServerServices rsServices) {<a name="line.5677"></a>
-<span class="sourceLineNo">5678</span>      super(tableDir, wal, fs, confParam, regionInfo, htd, rsServices);<a name="line.5678"></a>
-<span class="sourceLineNo">5679</span>    }<a name="line.5679"></a>
-<span class="sourceLineNo">5680</span>    @Override<a name="line.5680"></a>
-<span class="sourceLineNo">5681</span>    protected long getNextSequenceId(WAL wal) throws IOException {<a name="line.5681"></a>
-<span class="sourceLineNo">5682</span>      return 42;<a name="line.5682"></a>
-<span class="sourceLineNo">5683</span>    }<a name="line.5683"></a>
-<span class="sourceLineNo">5684</span>  }<a name="line.5684"></a>
-<span class="sourceLineNo">5685</span><a name="line.5685"></a>
-<span class="sourceLineNo">5686</span>  @Test<a name="line.5686"></a>
-<span class="sourceLineNo">5687</span>  public void testFlushedFileWithNoTags() throws Exception {<a name="line.5687"></a>
-<span class="sourceLineNo">5688</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.5688"></a>
-<span class="sourceLineNo">5689</span>    HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.5689"></a>
-<span class="sourceLineNo">5690</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.5690"></a>
-<span class="sourceLineNo">5691</span>    HRegionInfo info = new HRegionInfo(tableName, null, null, false);<a name="line.5691"></a>
-<span class="sourceLineNo">5692</span>    Path path = TEST_UTIL.getDataTestDir(getClass().getSimpleName());<a name="line.5692"></a>
-<span class="sourceLineNo">5693</span>    region = HBaseTestingUtility.createRegionAndWAL(info, path, TEST_UTIL.getConfiguration(), htd);<a name="line.5693"></a>
-<span class="sourceLineNo">5694</span>    Put put = new Put(Bytes.toBytes("a-b-0-0"));<a name="line.5694"></a>
-<span class="sourceLineNo">5695</span>    put.addColumn(fam1, qual1, Bytes.toBytes("c1-value"));<a name="line.5695"></a>
-<span class="sourceLineNo">5696</span>    region.put(put);<a name="line.5696"></a>
-<span class="sourceLineNo">5697</span>    region.flush(true);<a name="line.5697"></a>
-<span class="sourceLineNo">5698</span>    HStore store = region.getStore(fam1);<a name="line.5698"></a>
-<span class="sourceLineNo">5699</span>    Collection&lt;HStoreFile&gt; storefiles = store.getStorefiles();<a name="line.5699"></a>
-<span class="sourceLineNo">5700</span>    for (HStoreFile sf : storefiles) {<a name="line.5700"></a>
-<span class="sourceLineNo">5701</span>      assertFalse("Tags should not be present "<a name="line.5701"></a>
-<span class="sourceLineNo">5702</span>          ,sf.getReader().getHFileReader().getFileContext().isIncludesTags());<a name="line.5702"></a>
-<span class="sourceLineNo">5703</span>    }<a name="line.5703"></a>
-<span class="sourceLineNo">5704</span>  }<a name="line.5704"></a>
-<span class="sourceLineNo">5705</span><a name="line.5705"></a>
-<span class="sourceLineNo">5706</span>  /**<a name="line.5706"></a>
-<span class="sourceLineNo">5707</span>   * Utility method to setup a WAL mock.<a name="line.5707"></a>
-<span class="sourceLineNo">5708</span>   * Needs to do the bit where we close latch on the WALKeyImpl on append else test hangs.<a name="line.5708"></a>
-<span class="sourceLineNo">5709</span>   * @return a mock WAL<a name="line.5709"></a>
-<span class="sourceLineNo">5710</span>   * @throws IOException<a name="line.5710"></a>
-<span class="sourceLineNo">5711</span>   */<a name="line.5711"></a>
-<span class="sourceLineNo">5712</span>  private WAL mockWAL() throws IOException {<a name="line.5712"></a>
-<span class="sourceLineNo">5713</span>    WAL wal = mock(WAL.class);<a name="line.5713"></a>
-<span class="sourceLineNo">5714</span>    Mockito.when(wal.append((HRegionInfo)Mockito.any(),<a name="line.5714"></a>
-<span class="sourceLineNo">5715</span>        (WALKeyImpl)Mockito.any(), (WALEdit)Mockito.any(), Mockito.anyBoolean())).<a name="line.5715"></a>
-<span class="sourceLineNo">5716</span>      thenAnswer(new Answer&lt;Long&gt;() {<a name="line.5716"></a>
-<span class="sourceLineNo">5717</span>        @Override<a name="line.5717"></a>
-<span class="sourceLineNo">5718</span>        public Long answer(InvocationOnMock invocation) throws Throwable {<a name="line.5718"></a>
-<span class="sourceLineNo">5719</span>          WALKeyImpl key = invocation.getArgument(1);<a name="line.5719"></a>
-<span class="sourceLineNo">5720</span>          MultiVersionConcurrencyControl.WriteEntry we = key.getMvcc().begin();<a name="line.5720"></a>
-<span class="sourceLineNo">5721</span>          key.setWriteEntry(we);<a name="line.5721"></a>
-<span class="sourceLineNo">5722</span>          return 1L;<a name="line.5722"></a>
-<span class="sourceLineNo">5723</span>        }<a name="line.5723"></a>
-<span class="sourceLineNo">5724</span><a name="line.5724"></a>
-<span class="sourceLineNo">5725</span>    });<a name="line.5725"></a>
-<span class="sourceLineNo">5726</span>    return wal;<a name="line.5726"></a>
-<span class="sourceLineNo">5727</span>  }<a name="line.5727"></a>
-<span class="sourceLineNo">5728</span><a name="line.5728"></a>
-<span class="sourceLineNo">5729</span>  @Test<a name="line.5729"></a>
-<span class="sourceLineNo">5730</span>  public void testCloseRegionWrittenToWAL() throws Exception {<a name="line.5730"></a>
-<span class="sourceLineNo">5731</span><a name="line.5731"></a>
-<span class="sourceLineNo">5732</span>    Path rootDir = new Path(dir + name.getMethodName());<a name="line.5732"></a>
-<span class="sourceLineNo">5733</span>    FSUtils.setRootDir(TEST_UTIL.getConfiguration(), rootDir);<a name="line.5733"></a>
+<span class="sourceLineNo">5661</span>    LOG.info("RegionEventDescriptor from WAL: " + desc);<a name="line.5661"></a>
+<span class="sourceLineNo">5662</span><a name="line.5662"></a>
+<span class="sourceLineNo">5663</span>    assertEquals(RegionEventDescriptor.EventType.REGION_OPEN, desc.getEventType());<a name="line.5663"></a>
+<span class="sourceLineNo">5664</span>    assertTrue(Bytes.equals(desc.getTableName().toByteArray(), htd.getTableName().toBytes()));<a name="line.5664"></a>
+<span class="sourceLineNo">5665</span>    assertTrue(Bytes.equals(desc.getEncodedRegionName().toByteArray(),<a name="line.5665"></a>
+<span class="sourceLineNo">5666</span>      hri.getEncodedNameAsBytes()));<a name="line.5666"></a>
+<span class="sourceLineNo">5667</span>    assertTrue(desc.getLogSequenceNumber() &gt; 0);<a name="line.5667"></a>
+<span class="sourceLineNo">5668</span>    assertEquals(serverName, ProtobufUtil.toServerName(desc.getServer()));<a name="line.5668"></a>
+<span class="sourceLineNo">5669</span>    assertEquals(2, desc.getStoresCount());<a name="line.5669"></a>
+<span class="sourceLineNo">5670</span><a name="line.5670"></a>
+<span class="sourceLineNo">5671</span>    StoreDescriptor store = desc.getStores(0);<a name="line.5671"></a>
+<span class="sourceLineNo">5672</span>    assertTrue(Bytes.equals(store.getFamilyName().toByteArray(), fam1));<a name="line.5672"></a>
+<span class="sourceLineNo">5673</span>    assertEquals(store.getStoreHomeDir(), Bytes.toString(fam1));<a name="line.5673"></a>
+<span class="sourceLineNo">5674</span>    assertEquals(1, store.getStoreFileCount()); // 1store file<a name="line.5674"></a>
+<span class="sourceLineNo">5675</span>    assertFalse(store.getStoreFile(0).contains("/")); // ensure path is relative<a name="line.5675"></a>
+<span class="sourceLineNo">5676</span><a name="line.5676"></a>
+<span class="sourceLineNo">5677</span>    store = desc.getStores(1);<a name="line.5677"></a>
+<span class="sourceLineNo">5678</span>    assertTrue(Bytes.equals(store.getFamilyName().toByteArray(), fam2));<a name="line.5678"></a>
+<span class="sourceLineNo">5679</span>    assertEquals(store.getStoreHomeDir(), Bytes.toString(fam2));<a name="line.5679"></a>
+<span class="sourceLineNo">5680</span>    assertEquals(0, store.getStoreFileCount()); // no store files<a name="line.5680"></a>
+<span class="sourceLineNo">5681</span>  }<a name="line.5681"></a>
+<span class="sourceLineNo">5682</span><a name="line.5682"></a>
+<span class="sourceLineNo">5683</span>  // Helper for test testOpenRegionWrittenToWALForLogReplay<a name="line.5683"></a>
+<span class="sourceLineNo">5684</span>  static class HRegionWithSeqId extends HRegion {<a name="line.5684"></a>
+<span class="sourceLineNo">5685</span>    public HRegionWithSeqId(final Path tableDir, final WAL wal, final FileSystem fs,<a name="line.5685"></a>
+<span class="sourceLineNo">5686</span>        final Configuration confParam, final RegionInfo regionInfo,<a name="line.5686"></a>
+<span class="sourceLineNo">5687</span>        final TableDescriptor htd, final RegionServerServices rsServices) {<a name="line.5687"></a>
+<span class="sourceLineNo">5688</span>      super(tableDir, wal, fs, confParam, regionInfo, htd, rsServices);<a name="line.5688"></a>
+<span class="sourceLineNo">5689</span>    }<a name="line.5689"></a>
+<span class="sourceLineNo">5690</span>    @Override<a name="line.5690"></a>
+<span class="sourceLineNo">5691</span>    protected long getNextSequenceId(WAL wal) throws IOException {<a name="line.5691"></a>
+<span class="sourceLineNo">5692</span>      return 42;<a name="line.5692"></a>
+<span class="sourceLineNo">5693</span>    }<a name="line.5693"></a>
+<span class="sourceLineNo">5694</span>  }<a name="line.5694"></a>
+<span class="sourceLineNo">5695</span><a name="line.5695"></a>
+<span class="sourceLineNo">5696</span>  @Test<a name="line.5696"></a>
+<span class="sourceLineNo">5697</span>  public void testFlushedFileWithNoTags() throws Exception {<a name="line.5697"></a>
+<span class="sourceLineNo">5698</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.5698"></a>
+<span class="sourceLineNo">5699</span>    HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.5699"></a>
+<span class="sourceLineNo">5700</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.5700"></a>
+<span class="sourceLineNo">5701</span>    HRegionInfo info = new HRegionInfo(tableName, null, null, false);<a name="line.5701"></a>
+<span class="sourceLineNo">5702</span>    Path path = TEST_UTIL.getDataTestDir(getClass().getSimpleName());<a name="line.5702"></a>
+<span class="sourceLineNo">5703</span>    region = HBaseTestingUtility.createRegionAndWAL(info, path, TEST_UTIL.getConfiguration(), htd);<a name="line.5703"></a>
+<span class="sourceLineNo">5704</span>    Put put = new Put(Bytes.toBytes("a-b-0-0"));<a name="line.5704"></a>
+<span class="sourceLineNo">5705</span>    put.addColumn(fam1, qual1, Bytes.toBytes("c1-value"));<a name="line.5705"></a>
+<span class="sourceLineNo">5706</span>    region.put(put);<a name="line.5706"></a>
+<span class="sourceLineNo">5707</span>    region.flush(true);<a name="line.5707"></a>
+<span class="sourceLineNo">5708</span>    HStore store = region.getStore(fam1);<a name="line.5708"></a>
+<span class="sourceLineNo">5709</span>    Collection&lt;HStoreFile&gt; storefiles = store.getStorefiles();<a name="line.5709"></a>
+<span class="sourceLineNo">5710</span>    for (HStoreFile sf : storefiles) {<a name="line.5710"></a>
+<span class="sourceLineNo">5711</span>      assertFalse("Tags should not be present "<a name="line.5711"></a>
+<span class="sourceLineNo">5712</span>          ,sf.getReader().getHFileReader().getFileContext().isIncludesTags());<a name="line.5712"></a>
+<span class="sourceLineNo">5713</span>    }<a name="line.5713"></a>
+<span class="sourceLineNo">5714</span>  }<a name="line.5714"></a>
+<span class="sourceLineNo">5715</span><a name="line.5715"></a>
+<span class="sourceLineNo">5716</span>  /**<a name="line.5716"></a>
+<span class="sourceLineNo">5717</span>   * Utility method to setup a WAL mock.<a name="line.5717"></a>
+<span class="sourceLineNo">5718</span>   * Needs to do the bit where we close latch on the WALKeyImpl on append else test hangs.<a name="line.5718"></a>
+<span class="sourceLineNo">5719</span>   * @return a mock WAL<a name="line.5719"></a>
+<span class="sourceLineNo">5720</span>   * @throws IOException<a name="line.5720"></a>
+<span class="sourceLineNo">5721</span>   */<a name="line.5721"></a>
+<span class="sourceLineNo">5722</span>  private WAL mockWAL() throws IOException {<a name="line.5722"></a>
+<span class="sourceLineNo">5723</span>    WAL wal = mock(WAL.class);<a name="line.5723"></a>
+<span class="sourceLineNo">5724</span>    Mockito.when(wal.append((HRegionInfo)Mockito.any(),<a name="line.5724"></a>
+<span class="sourceLineNo">5725</span>        (WALKeyImpl)Mockito.any(), (WALEdit)Mockito.any(), Mockito.anyBoolean())).<a name="line.5725"></a>
+<span class="sourceLineNo">5726</span>      thenAnswer(new Answer&lt;Long&gt;() {<a name="line.5726"></a>
+<span class="sourceLineNo">5727</span>        @Override<a name="line.5727"></a>
+<span class="sourceLineNo">5728</span>        public Long answer(InvocationOnMock invocation) throws Throwable {<a name="line.5728"></a>
+<span class="sourceLineNo">5729</span>          WALKeyImpl key = invocation.getArgument(1);<a name="line.5729"></a>
+<span class="sourceLineNo">5730</span>          MultiVersionConcurrencyControl.WriteEntry we = key.getMvcc().begin();<a name="line.5730"></a>
+<span class="sourceLineNo">5731</span>          key.setWriteEntry(we);<a name="line.5731"></a>
+<span class="sourceLineNo">5732</span>          return 1L;<a name="line.5732"></a>
+<span class="sourceLineNo">5733</span>        }<a name="line.5733"></a>
 <span class="sourceLineNo">5734</span><a name="line.5734"></a>
-<span class="sourceLineNo">5735</span>    final ServerName serverName = ServerName.valueOf("testCloseRegionWrittenToWAL", 100, 42);<a name="line.5735"></a>
-<span class="sourceLineNo">5736</span>    final RegionServerServices rss = spy(TEST_UTIL.createMockRegionServerService(serverName));<a name="line.5736"></a>
-<span class="sourceLineNo">5737</span><a name="line.5737"></a>
-<span class="sourceLineNo">5738</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.5738"></a>
-<span class="sourceLineNo">5739</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.5739"></a>
-<span class="sourceLineNo">5740</span>    htd.addFamily(new HColumnDescriptor(fam2));<a name="line.5740"></a>
+<span class="sourceLineNo">5735</span>    });<a name="line.5735"></a>
+<span class="sourceLineNo">5736</span>    return wal;<a name="line.5736"></a>
+<span class="sourceLineNo">5737</span>  }<a name="line.5737"></a>
+<span class="sourceLineNo">5738</span><a name="line.5738"></a>
+<span class="sourceLineNo">5739</span>  @Test<a name="line.5739"></a>
+<span class="sourceLineNo">5740</span>  public void testCloseRegionWrittenToWAL() throws Exception {<a name="line.5740"></a>
 <span class="sourceLineNo">5741</span><a name="line.5741"></a>
-<span class="sourceLineNo">5742</span>    final HRegionInfo hri = new HRegionInfo(htd.getTableName(),<a name="line.5742"></a>
-<span class="sourceLineNo">5743</span>      HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY);<a name="line.5743"></a>
+<span class="sourceLineNo">5742</span>    Path rootDir = new Path(dir + name.getMethodName());<a name="line.5742"></a>
+<span class="sourceLineNo">5743</span>    FSUtils.setRootDir(TEST_UTIL.getConfiguration(), rootDir);<a name="line.5743"></a>
 <span class="sourceLineNo">5744</span><a name="line.5744"></a>
-<span class="sourceLineNo">5745</span>    ArgumentCaptor&lt;WALEdit&gt; editCaptor = ArgumentCaptor.forClass(WALEdit.class);<a name="line.5745"></a>
-<span class="sourceLineNo">5746</span><a name="line.5746"></a>
-<span class="sourceLineNo">5747</span>    // capture append() calls<a name="line.5747"></a>
-<span class="sourceLineNo">5748</span>    WAL wal = mockWAL();<a name="line.5748"></a>
-<span class="sourceLineNo">5749</span>    when(rss.getWAL((HRegionInfo) any())).thenReturn(wal);<a name="line.5749"></a>
-<span class="sourceLineNo">5750</span><a name="line.5750"></a>
+<span class="sourceLineNo">5745</span>    final ServerName serverName = ServerName.valueOf("testCloseRegionWrittenToWAL", 100, 42);<a name="line.5745"></a>
+<span class="sourceLineNo">5746</span>    final RegionServerServices rss = spy(TEST_UTIL.createMockRegionServerService(serverName));<a name="line.5746"></a>
+<span class="sourceLineNo">5747</span><a name="line.5747"></a>
+<span class="sourceLineNo">5748</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.5748"></a>
+<span class="sourceLineNo">5749</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.5749"></a>
+<span class="sourceLineNo">5750</span>    htd.addFamily(new HColumnDescriptor(fam2));<a name="line.5750"></a>
 <span class="sourceLineNo">5751</span><a name="line.5751"></a>
-<span class="sourceLineNo">5752</span>    // create and then open a region first so that it can be closed later<a name="line.5752"></a>
-<span class="sourceLineNo">5753</span>    region = HRegion.createHRegion(hri, rootDir, TEST_UTIL.getConfiguration(), htd, rss.getWAL(hri));<a name="line.5753"></a>
-<span class="sourceLineNo">5754</span>    region = HRegion.openHRegion(hri, htd, rss.getWAL(hri),<a name="line.5754"></a>
-<span class="sourceLineNo">5755</span>      TEST_UTIL.getConfiguration(), rss, null);<a name="line.5755"></a>
+<span class="sourceLineNo">5752</span>    final HRegionInfo hri = new HRegionInfo(htd.getTableName(),<a name="line.5752"></a>
+<span class="sourceLineNo">5753</span>      HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY);<a name="line.5753"></a>
+<span class="sourceLineNo">5754</span><a name="line.5754"></a>
+<span class="sourceLineNo">5755</span>    ArgumentCaptor&lt;WALEdit&gt; editCaptor = ArgumentCaptor.forClass(WALEdit.class);<a name="line.5755"></a>
 <span class="sourceLineNo">5756</span><a name="line.5756"></a>
-<span class="sourceLineNo">5757</span>    // close the region<a name="line.5757"></a>
-<span class="sourceLineNo">5758</span>    region.close(false);<a name="line.5758"></a>
-<span class="sourceLineNo">5759</span><a name="line.5759"></a>
-<span class="sourceLineNo">5760</span>    // 2 times, one for region open, the other close region<a name="line.5760"></a>
-<span class="sourceLineNo">5761</span>    verify(wal, times(2)).append((HRegionInfo)any(), (WALKeyImpl)any(),<a name="line.5761"></a>
-<span class="sourceLineNo">5762</span>      editCaptor.capture(), anyBoolean());<a name="line.5762"></a>
-<span class="sourceLineNo">5763</span><a name="line.5763"></a>
-<span class="sourceLineNo">5764</span>    WALEdit edit = editCaptor.getAllValues().get(1);<a name="line.5764"></a>
-<span class="sourceLineNo">5765</span>    assertNotNull(edit);<a name="line.5765"></a>
-<span class="sourceLineNo">5766</span>    assertNotNull(edit.getCells());<a name="line.5766"></a>
-<span class="sourceLineNo">5767</span>    assertEquals(1, edit.getCells().size());<a name="line.5767"></a>
-<span class="sourceLineNo">5768</span>    RegionEventDescriptor desc = WALEdit.getRegionEventDescriptor(edit.getCells().get(0));<a name="line.5768"></a>
-<span class="sourceLineNo">5769</span>    assertNotNull(desc);<a name="line.5769"></a>
-<span class="sourceLineNo">5770</span><a name="line.5770"></a>
-<span class="sourceLineNo">5771</span>    LOG.info("RegionEventDescriptor from WAL: " + desc);<a name="line.5771"></a>
-<span class="sourceLineNo">5772</span><a name="line.5772"></a>
-<span class="sourceLineNo">5773</span>    assertEquals(RegionEventDescriptor.EventType.REGION_CLOSE, desc.getEventType());<a name="line.5773"></a>
-<span class="sourceLineNo">5774</span>    assertTrue(Bytes.equals(desc.getTableName().toByteArray(), htd.getTableName().toBytes()));<a name="line.5774"></a>
-<span class="sourceLineNo">5775</span>    assertTrue(Bytes.equals(desc.getEncodedRegionName().toByteArray(),<a name="line.5775"></a>
-<span class="sourceLineNo">5776</span>      hri.getEncodedNameAsBytes()));<a name="line.5776"></a>
-<span class="sourceLineNo">5777</span>    assertTrue(desc.getLogSequenceNumber() &gt; 0);<a name="line.5777"></a>
-<span class="sourceLineNo">5778</span>    assertEquals(serverName, ProtobufUtil.toServerName(desc.getServer()));<a name="line.5778"></a>
-<span class="sourceLineNo">5779</span>    assertEquals(2, desc.getStoresCount());<a name="line.5779"></a>
+<span class="sourceLineNo">5757</span>    // capture append() calls<a name="line.5757"></a>
+<span class="sourceLineNo">5758</span>    WAL wal = mockWAL();<a name="line.5758"></a>
+<span class="sourceLineNo">5759</span>    when(rss.getWAL((HRegionInfo) any())).thenReturn(wal);<a name="line.5759"></a>
+<span class="sourceLineNo">5760</span><a name="line.5760"></a>
+<span class="sourceLineNo">5761</span><a name="line.5761"></a>
+<span class="sourceLineNo">5762</span>    // create and then open a region first so that it can be closed later<a name="line.5762"></a>
+<span class="sourceLineNo">5763</span>    region = HRegion.createHRegion(hri, rootDir, TEST_UTIL.getConfiguration(), htd, rss.getWAL(hri));<a name="line.5763"></a>
+<span class="sourceLineNo">5764</span>    region = HRegion.openHRegion(hri, htd, rss.getWAL(hri),<a name="line.5764"></a>
+<span class="sourceLineNo">5765</span>      TEST_UTIL.getConfiguration(), rss, null);<a name="line.5765"></a>
+<span class="sourceLineNo">5766</span><a name="line.5766"></a>
+<span class="sourceLineNo">5767</span>    // close the region<a name="line.5767"></a>
+<span class="sourceLineNo">5768</span>    region.close(false);<a name="line.5768"></a>
+<span class="sourceLineNo">5769</span><a name="line.5769"></a>
+<span class="sourceLineNo">5770</span>    // 2 times, one for region open, the other close region<a name="line.5770"></a>
+<span class="sourceLineNo">5771</span>    verify(wal, times(2)).append((HRegionInfo)any(), (WALKeyImpl)any(),<a name="line.5771"></a>
+<span class="sourceLineNo">5772</span>      editCaptor.capture(), anyBoolean());<a name="line.5772"></a>
+<span class="sourceLineNo">5773</span><a name="line.5773"></a>
+<span class="sourceLineNo">5774</span>    WALEdit edit = editCaptor.getAllValues().get(1);<a name="line.5774"></a>
+<span class="sourceLineNo">5775</span>    assertNotNull(edit);<a name="line.5775"></a>
+<span class="sourceLineNo">5776</span>    assertNotNull(edit.getCells());<a name="line.5776"></a>
+<span class="sourceLineNo">5777</span>    assertEquals(1, edit.getCells().size());<a name="line.5777"></a>
+<span class="sourceLineNo">5778</span>    RegionEventDescriptor desc = WALEdit.getRegionEventDescriptor(edit.getCells().get(0));<a name="line.5778"></a>
+<span class="sourceLineNo">5779</span>    assertNotNull(desc);<a name="line.5779"></a>
 <span class="sourceLineNo">5780</span><a name="line.5780"></a>
-<span class="sourceLineNo">5781</span>    StoreDescriptor store = desc.getStores(0);<a name="line.5781"></a>
-<span class="sourceLineNo">5782</span>    assertTrue(Bytes.equals(store.getFamilyName().toByteArray(), fam1));<a name="line.5782"></a>
-<span class="sourceLineNo">5783</span>    assertEquals(store.getStoreHomeDir(), Bytes.toString(fam1));<a name="line.5783"></a>
-<span class="sourceLineNo">5784</span>    assertEquals(0, store.getStoreFileCount()); // no store files<a name="line.5784"></a>
-<span class="sourceLineNo">5785</span><a name="line.5785"></a>
-<span class="sourceLineNo">5786</span>    store = desc.getStores(1);<a name="line.5786"></a>
-<span class="sourceLineNo">5787</span>    assertTrue(Bytes.equals(store.getFamilyName().toByteArray(), fam2));<a name="line.5787"></a>
-<span class="sourceLineNo">5788</span>    assertEquals(store.getStoreHomeDir(), Bytes.toString(fam2));<a name="line.5788"></a>
-<span class="sourceLineNo">5789</span>    assertEquals(0, store.getStoreFileCount()); // no store files<a name="line.5789"></a>
-<span class="sourceLineNo">5790</span>  }<a name="line.5790"></a>
-<span class="sourceLineNo">5791</span><a name="line.5791"></a>
-<span class="sourceLineNo">5792</span>  /**<a name="line.5792"></a>
-<span class="sourceLineNo">5793</span>   * Test RegionTooBusyException thrown when region is busy<a name="line.5793"></a>
-<span class="sourceLineNo">5794</span>   */<a name="line.5794"></a>
-<span class="sourceLineNo">5795</span>  @Test<a name="line.5795"></a>
-<span class="sourceLineNo">5796</span>  public void testRegionTooBusy() throws IOException {<a name="line.5796"></a>
-<span class="sourceLineNo">5797</span>    byte[] family = Bytes.toBytes("family");<a name="line.5797"></a>
-<span class="sourceLineNo">5798</span>    long defaultBusyWaitDuration = CONF.getLong("hbase.busy.wait.duration",<a name="line.5798"></a>
-<span class="sourceLineNo">5799</span>      HRegion.DEFAULT_BUSY_WAIT_DURATION);<a name="line.5799"></a>
-<span class="sourceLineNo">5800</span>    CONF.setLong("hbase.busy.wait.duration", 1000);<a name="line.5800"></a>
-<span class="sourceLineNo">5801</span>    region = initHRegion(tableName, method, CONF, family);<a name="line.5801"></a>
-<span class="sourceLineNo">5802</span>    final AtomicBoolean stopped = new AtomicBoolean(true);<a name="line.5802"></a>
-<span class="sourceLineNo">5803</span>    Thread t = new Thread(new Runnable() {<a name="line.5803"></a>
-<span class="sourceLineNo">5804</span>      @Override<a name="line.5804"></a>
-<span class="sourceLineNo">5805</span>      public void run() {<a name="line.5805"></a>
-<span class="sourceLineNo">5806</span>        try {<a name="line.5806"></a>
-<span class="sourceLineNo">5807</span>          region.lock.writeLock().lock();<a name="line.5807"></a>
-<span class="sourceLineNo">5808</span>          stopped.set(false);<a name="line.5808"></a>
-<span class="sourceLineNo">5809</span>          while (!stopped.get()) {<a name="line.5809"></a>
-<span class="sourceLineNo">5810</span>            Thread.sleep(100);<a name="line.5810"></a>
-<span class="sourceLineNo">5811</span>          }<a name="line.5811"></a>
-<span class="sourceLineNo">5812</span>        } catch (InterruptedException ie) {<a name="line.5812"></a>
-<span class="sourceLineNo">5813</span>        } finally {<a name="line.5813"></a>
-<span class="sourceLineNo">5814</span>          region.lock.writeLock().unlock();<a name="line.5814"></a>
-<span class="sourceLineNo">5815</span>        }<a name="line.5815"></a>
-<span class="sourceLineNo">5816</span>      }<a name="line.5816"></a>
-<span class="sourceLineNo">5817</span>    });<a name="line.5817"></a>
-<span class="sourceLineNo">5818</span>    t.start();<a name="line.5818"></a>
-<span class="sourceLineNo">5819</span>    Get get = new Get(row);<a name="line.5819"></a>
-<span class="sourceLineNo">5820</span>    try {<a name="line.5820"></a>
-<span class="sourceLineNo">5821</span>      while (stopped.get()) {<a name="line.5821"></a>
-<span class="sourceLineNo">5822</span>        Thread.sleep(100);<a name="line.5822"></a>
-<span class="sourceLineNo">5823</span>      }<a name="line.5823"></a>
-<span class="sourceLineNo">5824</span>      region.get(get);<a name="line.5824"></a>
-<span class="sourceLineNo">5825</span>      fail("Should throw RegionTooBusyException");<a name="line.5825"></a>
-<span class="sourceLineNo">5826</span>    } catch (InterruptedException ie) {<a name="line.5826"></a>
-<span class="sourceLineNo">5827</span>      fail("test interrupted");<a name="line.5827"></a>
-<span class="sourceLineNo">5828</span>    } catch (RegionTooBusyException e) {<a name="line.5828"></a>
-<span class="sourceLineNo">5829</span>      // Good, expected<a name="line.5829"></a>
-<span class="sourceLineNo">5830</span>    } finally {<a name="line.5830"></a>
-<span class="sourceLineNo">5831</span>      stopped.set(true);<a name="line.5831"></a>
-<span class="sourceLineNo">5832</span>      try {<a name="line.5832"></a>
-<span class="sourceLineNo">5833</span>        t.join();<a name="line.5833"></a>
-<span class="sourceLineNo">5834</span>      } catch (Throwable e) {<a name="line.5834"></a>
-<span class="sourceLineNo">5835</span>      }<a name="line.5835"></a>
-<span class="sourceLineNo">5836</span><a name="line.5836"></a>
-<span class="sourceLineNo">5837</span>      HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.5837"></a>
-<span class="sourceLineNo">5838</span>      region = null;<a name="line.5838"></a>
-<span class="sourceLineNo">5839</span>      CONF.setLong("hbase.busy.wait.duration", defaultBusyWaitDuration);<a name="line.5839"></a>
-<span class="sourceLineNo">5840</span>    }<a name="line.5840"></a>
-<span class="sourceLineNo">5841</span>  }<a name="line.5841"></a>
-<span class="sourceLineNo">5842</span><a name="line.5842"></a>
-<span class="sourceLineNo">5843</span>  @Test<a name="line.5843"></a>
-<span class="sourceLineNo">5844</span>  public void testCellTTLs() throws IOException {<a name="line.5844"></a>
-<span class="sourceLineNo">5845</span>    IncrementingEnvironmentEdge edge = new IncrementingEnvironmentEdge();<a name="line.5845"></a>
-<span class="sourceLineNo">5846</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.5846"></a>
-<span class="sourceLineNo">5847</span><a name="line.5847"></a>
-<span class="sourceLineNo">5848</span>    final byte[] row = Bytes.toBytes("testRow");<a name="line.5848"></a>
-<span class="sourceLineNo">5849</span>    final byte[] q1 = Bytes.toBytes("q1");<a name="line.5849"></a>
-<span class="sourceLineNo">5850</span>    final byte[] q2 = Bytes.toBytes("q2");<a name="line.5850"></a>
-<span class="sourceLineNo">5851</span>    final byte[] q3 = Bytes.toBytes("q3");<a name="line.5851"></a>
-<span class="sourceLineNo">5852</span>    final byte[] q4 = Bytes.toBytes("q4");<a name="line.5852"></a>
-<span class="sourceLineNo">5853</span><a name="line.5853"></a>
-<span class="sourceLineNo">5854</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.5854"></a>
-<span class="sourceLineNo">5855</span>    HColumnDescriptor hcd = new HColumnDescriptor(fam1);<a name="line.5855"></a>
-<span class="sourceLineNo">5856</span>    hcd.setTimeToLive(10); // 10 seconds<a name="line.5856"></a>
-<span class="sourceLineNo">5857</span>    htd.addFamily(hcd);<a name="line.5857"></a>
-<span class="sourceLineNo">5858</span><a name="line.5858"></a>
-<span class="sourceLineNo">5859</span>    Configuration conf = new Configuration(TEST_UTIL.getConfiguration());<a name="line.5859"></a>
-<span class="sourceLineNo">5860</span>    conf.setInt(HFile.FORMAT_VERSION_KEY, HFile.MIN_FORMAT_VERSION_WITH_TAGS);<a name="line.5860"></a>
-<span class="sourceLineNo">5861</span><a name="line.5861"></a>
-<span class="sourceLineNo">5862</span>    region = HBaseTestingUtility.createRegionAndWAL(new HRegionInfo(htd.getTableName(),<a name="line.5862"></a>
-<span class="sourceLineNo">5863</span>            HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY),<a name="line.5863"></a>
-<span class="sourceLineNo">5864</span>        TEST_UTIL.getDataTestDir(), conf, htd);<a name="line.5864"></a>
-<span class="sourceLineNo">5865</span>    assertNotNull(region);<a name="line.5865"></a>
-<span class="sourceLineNo">5866</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.5866"></a>
-<span class="sourceLineNo">5867</span>    // Add a cell that will expire in 5 seconds via cell TTL<a name="line.5867"></a>
-<span class="sourceLineNo">5868</span>    region.put(new Put(row).add(new KeyValue(row, fam1, q1, now,<a name="line.5868"></a>
-<span class="sourceLineNo">5869</span>      HConstants.EMPTY_BYTE_ARRAY, new ArrayBackedTag[] {<a name="line.5869"></a>
-<span class="sourceLineNo">5870</span>        // TTL tags specify ts in milliseconds<a name="line.5870"></a>
-<span class="sourceLineNo">5871</span>        new ArrayBackedTag(TagType.TTL_TAG_TYPE, Bytes.toBytes(5000L)) })));<a name="line.5871"></a>
-<span class="sourceLineNo">5872</span>    // Add a cell that will expire after 10 seconds via family setting<a name="line.5872"></a>
-<span class="sourceLineNo">5873</span>    region.put(new Put(row).addColumn(fam1, q2, now, HConstants.EMPTY_BYTE_ARRAY));<a name="line.5873"></a>
-<span class="sourceLineNo">5874</span>    // Add a cell that will expire in 15 seconds via cell TTL<a name="line.5874"></a>
-<span class="sourceLineNo">5875</span>    region.put(new Put(row).add(new KeyValue(row, fam1, q3, now + 10000 - 1,<a name="line.5875"></a>
-<span class="sourceLineNo">5876</span>      HConstants.EMPTY_BYTE_ARRAY, new ArrayBackedTag[] {<a name="line.5876"></a>
-<span class="sourceLineNo">5877</span>        // TTL tags specify ts in milliseconds<a name="line.5877"></a>
-<span class="sourceLineNo">5878</span>        new ArrayBackedTag(TagType.TTL_TAG_TYPE, Bytes.toBytes(5000L)) })));<a name="line.5878"></a>
-<span class="sourceLineNo">5879</span>    // Add a cell that will expire in 20 seconds via family setting<a name="line.5879"></a>
-<span class="sourceLineNo">5880</span>    region.put(new Put(row).addColumn(fam1, q4, now + 10000 - 1, HConstants.EMPTY_BYTE_ARRAY));<a name="line.5880"></a>
-<span class="sourceLineNo">5881</span><a name="line.5881"></a>
-<span class="sourceLineNo">5882</span>    // Flush so we are sure store scanning gets this right<a name="line.5882"></a>
-<span class="sourceLineNo">5883</span>    region.flush(true);<a name="line.5883"></a>
-<span class="sourceLineNo">5884</span><a name="line.5884"></a>
-<span class="sourceLineNo">5885</span>    // A query at time T+0 should return all cells<a name="line.5885"></a>
-<span class="sourceLineNo">5886</span>    Result r = region.get(new Get(row));<a name="line.5886"></a>
-<span class="sourceLineNo">5887</span>    assertNotNull(r.getValue(fam1, q1));<a name="line.5887"></a>
-<span class="sourceLineNo">5888</span>    assertNotNull(r.getValue(fam1, q2));<a name="line.5888"></a>
-<span class="sourceLineNo">5889</span>    assertNotNull(r.getValue(fam1, q3));<a name="line.5889"></a>
-<span class="sourceLineNo">5890</span>    assertNotNull(r.getValue(fam1, q4));<a name="line.5890"></a>
+<span class="sourceLineNo">5781</span>    LOG.info("RegionEventDescriptor from WAL: " + desc);<a name="line.5781"></a>
+<span class="sourceLineNo">5782</span><a name="line.5782"></a>
+<span class="sourceLineNo">5783</span>    assertEquals(RegionEventDescriptor.EventType.REGION_CLOSE, desc.getEventType());<a name="line.5783"></a>
+<span class="sourceLineNo">5784</span>    assertTrue(Bytes.equals(desc.getTableName().toByteArray(), htd.getTableName().toBytes()));<a name="line.5784"></a>
+<span class="sourceLineNo">5785</span>    assertTrue(Bytes.equals(desc.getEncodedRegionName().toByteArray(),<a name="line.5785"></a>
+<span class="sourceLineNo">5786</span>      hri.getEncodedNameAsBytes()));<a name="line.5786"></a>
+<span class="sourceLineNo">5787</span>    assertTrue(desc.getLogSequenceNumber() &gt; 0);<a name="line.5787"></a>
+<span class="sourceLineNo">5788</span>    assertEquals(serverName, ProtobufUtil.toServerName(desc.getServer()));<a name="line.5788"></a>
+<span class="sourceLineNo">5789</span>    assertEquals(2, desc.getStoresCount());<a name="line.5789"></a>
+<span class="sourceLineNo">5790</span><a name="line.5790"></a>
+<span class="sourceLineNo">5791</span>    StoreDescriptor store = desc.getStores(0);<a name="line.5791"></a>
+<span class="sourceLineNo">5792</span>    assertTrue(Bytes.equals(store.getFamilyName().toByteArray(), fam1));<a name="line.5792"></a>
+<span class="sourceLineNo">5793</span>    assertEquals(store.getStoreHomeDir(), Bytes.toString(fam1));<a name="line.5793"></a>
+<span class="sourceLineNo">5794</span>    assertEquals(0, store.getStoreFileCount()); // no store files<a name="line.5794"></a>
+<span class="sourceLineNo">5795</span><a name="line.5795"></a>
+<span class="sourceLineNo">5796</span>    store = desc.getStores(1);<a name="line.5796"></a>
+<span class="sourceLineNo">5797</span>    assertTrue(Bytes.equals(store.getFamilyName().toByteArray(), fam2));<a name="line.5797"></a>
+<span class="sourceLineNo">5798</span>    assertEquals(store.getStoreHomeDir(), Bytes.toString(fam2));<a name="line.5798"></a>
+<span class="sourceLineNo">5799</span>    assertEquals(0, store.getStoreFileCount()); // no store files<a name="line.5799"></a>
+<span class="sourceLineNo">5800</span>  }<a name="line.5800"></a>
+<span class="sourceLineNo">5801</span><a name="line.5801"></a>
+<span class="sourceLineNo">5802</span>  /**<a name="line.5802"></a>
+<span class="sourceLineNo">5803</span>   * Test RegionTooBusyException thrown when region is busy<a name="line.5803"></a>
+<span class="sourceLineNo">5804</span>   */<a name="line.5804"></a>
+<span class="sourceLineNo">5805</span>  @Test<a name="line.5805"></a>
+<span class="sourceLineNo">5806</span>  public void testRegionTooBusy() throws IOException {<a name="line.5806"></a>
+<span class="sourceLineNo">5807</span>    byte[] family = Bytes.toBytes("family");<a name="line.5807"></a>
+<span class="sourceLineNo">5808</span>    long defaultBusyWaitDuration = CONF.getLong("hbase.busy.wait.duration",<a name="line.5808"></a>
+<span class="sourceLineNo">5809</span>      HRegion.DEFAULT_BUSY_WAIT_DURATION);<a name="line.5809"></a>
+<span class="sourceLineNo">5810</span>    CONF.setLong("hbase.busy.wait.duration", 1000);<a name="line.5810"></a>
+<span class="sourceLineNo">5811</span>    region = initHRegion(tableName, method, CONF, family);<a name="line.5811"></a>
+<span class="sourceLineNo">5812</span>    final AtomicBoolean stopped = new AtomicBoolean(true);<a name="line.5812"></a>
+<span class="sourceLineNo">5813</span>    Thread t = new Thread(new Runnable() {<a name="line.5813"></a>
+<span class="sourceLineNo">5814</span>      @Override<a name="line.5814"></a>
+<span class="sourceLineNo">5815</span>      public void run() {<a name="line.5815"></a>
+<span class="sourceLineNo">5816</span>        try {<a name="line.5816"></a>
+<span class="sourceLineNo">5817</span>          region.lock.writeLock().lock();<a name="line.5817"></a>
+<span class="sourceLineNo">5818</span>          stopped.set(false);<a name="line.5818"></a>
+<span class="sourceLineNo">5819</span>          while (!stopped.get()) {<a name="line.5819"></a>
+<span class="sourceLineNo">5820</span>            Thread.sleep(100);<a name="line.5820"></a>
+<span class="sourceLineNo">5821</span>          }<a name="line.5821"></a>
+<span class="sourceLineNo">5822</span>        } catch (InterruptedException ie) {<a name="line.5822"></a>
+<span class="sourceLineNo">5823</span>        } finally {<a name="line.5823"></a>
+<span class="sourceLineNo">5824</span>          region.lock.writeLock().unlock();<a name="line.5824"></a>
+<span class="sourceLineNo">5825</span>        }<a name="line.5825"></a>
+<span class="sourceLineNo">5826</span>      }<a name="line.5826"></a>
+<span class="sourceLineNo">5827</span>    });<a name="line.5827"></a>
+<span class="sourceLineNo">5828</span>    t.start();<a name="line.5828"></a>
+<span class="sourceLineNo">5829</span>    Get get = new Get(row);<a name="line.5829"></a>
+<span class="sourceLineNo">5830</span>    try {<a name="line.5830"></a>
+<span class="sourceLineNo">5831</span>      while (stopped.get()) {<a name="line.5831"></a>
+<span class="sourceLineNo">5832</span>        Thread.sleep(100);<a name="line.5832"></a>
+<span class="sourceLineNo">5833</span>      }<a name="line.5833"></a>
+<span class="sourceLineNo">5834</span>      region.get(get);<a name="line.5834"></a>
+<span class="sourceLineNo">5835</span>      fail("Should throw RegionTooBusyException");<a name="line.5835"></a>
+<span class="sourceLineNo">5836</span>    } catch (InterruptedException ie) {<a name="line.5836"></a>
+<span class="sourceLineNo">5837</span>      fail("test interrupted");<a name="line.5837"></a>
+<span class="sourceLineNo">5838</span>    } catch (RegionTooBusyException e) {<a name="line.5838"></a>
+<span class="sourceLineNo">5839</span>      // Good, expected<a name="line.5839"></a>
+<span class="sourceLineNo">5840</span>    } finally {<a name="line.5840"></a>
+<span class="sourceLineNo">5841</span>      stopped.set(true);<a name="line.5841"></a>
+<span class="sourceLineNo">5842</span>      try {<a name="line.5842"></a>
+<span class="sourceLineNo">5843</span>        t.join();<a name="line.5843"></a>
+<span class="sourceLineNo">5844</span>      } catch (Throwable e) {<a name="line.5844"></a>
+<span class="sourceLineNo">5845</span>      }<a name="line.5845"></a>
+<span class="sourceLineNo">5846</span><a name="line.5846"></a>
+<span class="sourceLineNo">5847</span>      HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.5847"></a>
+<span class="sourceLineNo">5848</span>      region = null;<a name="line.5848"></a>
+<span class="sourceLineNo">5849</span>      CONF.setLong("hbase.busy.wait.duration", defaultBusyWaitDuration);<a name="line.5849"></a>
+<span class="sourceLineNo">5850</span>    }<a name="line.5850"></a>
+<span class="sourceLineNo">5851</span>  }<a name="line.5851"></a>
+<span class="sourceLineNo">5852</span><a name="line.5852"></a>
+<span class="sourceLineNo">5853</span>  @Test<a name="line.5853"></a>
+<span class="sourceLineNo">5854</span>  public void testCellTTLs() throws IOException {<a name="line.5854"></a>
+<span class="sourceLineNo">5855</span>    IncrementingEnvironmentEdge edge = new IncrementingEnvironmentEdge();<a name="line.5855"></a>
+<span class="sourceLineNo">5856</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.5856"></a>
+<span class="sourceLineNo">5857</span><a name="line.5857"></a>
+<span class="sourceLineNo">5858</span>    final byte[] row = Bytes.toBytes("testRow");<a name="line.5858"></a>
+<span class="sourceLineNo">5859</span>    final byte[] q1 = Bytes.toBytes("q1");<a name="line.5859"></a>
+<span class="sourceLineNo">5860</span>    final byte[] q2 = Bytes.toBytes("q2");<a name="line.5860"></a>
+<span class="sourceLineNo">5861</span>    final byte[] q3 = Bytes.toBytes("q3");<a name="line.5861"></a>
+<span class="sourceLineNo">5862</span>    final byte[] q4 = Bytes.toBytes("q4");<a name="line.5862"></a>
+<span class="sourceLineNo">5863</span><a name="line.5863"></a>
+<span class="sourceLineNo">5864</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.5864"></a>
+<span class="sourceLineNo">5865</span>    HColumnDescriptor hcd = new HColumnDescriptor(fam1);<a name="line.5865"></a>
+<span class="sourceLineNo">5866</span>    hcd.setTimeToLive(10); // 10 seconds<a name="line.5866"></a>
+<span class="sourceLineNo">5867</span>    htd.addFamily(hcd);<a name="line.5867"></a>
+<span class="sourceLineNo">5868</span><a name="line.5868"></a>
+<span class="sourceLineNo">5869</span>    Configuration conf = new Configuration(TEST_UTIL.getConfiguration());<a name="line.5869"></a>
+<span class="sourceLineNo">5870</span>    conf.setInt(HFile.FORMAT_VERSION_KEY, HFile.MIN_FORMAT_VERSION_WITH_TAGS);<a name="line.5870"></a>
+<span class="sourceLineNo">5871</span><a name="line.5871"></a>
+<span class="sourceLineNo">5872</span>    region = HBaseTestingUtility.createRegionAndWAL(new HRegionInfo(htd.getTableName(),<a name="line.5872"></a>
+<span class="sourceLineNo">5873</span>            HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY),<a name="line.5873"></a>
+<span class="sourceLineNo">5874</span>        TEST_UTIL.getDataTestDir(), conf, htd);<a name="line.5874"></a>
+<span class="sourceLineNo">5875</span>    assertNotNull(region);<a name="line.5875"></a>
+<span class="sourceLineNo">5876</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.5876"></a>
+<span class="sourceLineNo">5877</span>    // Add a cell that will expire in 5 seconds via cell TTL<a name="line.5877"></a>
+<span class="sourceLineNo">5878</span>    region.put(new Put(row).add(new KeyValue(row, fam1, q1, now,<a name="line.5878"></a>
+<span class="sourceLineNo">5879</span>      HConstants.EMPTY_BYTE_ARRAY, new ArrayBackedTag[] {<a name="line.5879"></a>
+<span class="sourceLineNo">5880</span>        // TTL tags specify ts in milliseconds<a name="line.5880"></a>
+<span class="sourceLineNo">5881</span>        new ArrayBackedTag(TagType.TTL_TAG_TYPE, Bytes.toBytes(5000L)) })));<a name="line.5881"></a>
+<span class="sourceLineNo">5882</span>    // Add a cell that will expire after 10 seconds via family setting<a name="line.5882"></a>
+<span class="sourceLineNo">5883</span>    region.put(new Put(row).addColumn(fam1, q2, now, HConstants.EMPTY_BYTE_ARRAY));<a name="line.5883"></a>
+<span class="sourceLineNo">5884</span>    // Add a cell that will expire in 15 seconds via cell TTL<a name="line.5884"></a>
+<span class="sourceLineNo">5885</span>    region.put(new Put(row).add(new KeyValue(row, fam1, q3, now + 10000 - 1,<a name="line.5885"></a>
+<span class="sourceLineNo">5886</span>      HConstants.EMPTY_BYTE_ARRAY, new ArrayBackedTag[] {<a name="line.5886"></a>
+<span class="sourceLineNo">5887</span>        // TTL tags specify ts in milliseconds<a name="line.5887"></a>
+<span class="sourceLineNo">5888</span>        new ArrayBackedTag(TagType.TTL_TAG_TYPE, Bytes.toBytes(5000L)) })));<a name="line.5888"></a>
+<span class="sourceLineNo">5889</span>    // Add a cell that will expire in 20 seconds via family setting<a name="line.5889"></a>
+<span class="sourceLineNo">5890</span>    region.put(new Put(row).addColumn(fam1, q4, now + 10000 - 1, HConstants.EMPTY_BYTE_ARRAY));<a name="line.5890"></a>
 <span class="sourceLineNo">5891</span><a name="line.5891"></a>
-<span class="sourceLineNo">5892</span>    // Increment time to T+5 seconds<a name="line.5892"></a>
-<span class="sourceLineNo">5893</span>    edge.incrementTime(5000);<a name="line.5893"></a>
+<span class="sourceLineNo">5892</span>    // Flush so we are sure store scanning gets this right<a name="line.5892"></a>
+<span class="sourceLineNo">5893</span>    region.flush(true);<a name="line.5893"></a>
 <span class="sourceLineNo">5894</span><a name="line.5894"></a>
-<span class="sourceLineNo">5895</span>    r = region.get(new Get(row));<a name="line.5895"></a>
-<span class="sourceLineNo">5896</span>    assertNull(r.getValue(fam1, q1));<a name="line.5896"></a>
-<span class="sourceLineNo">5897</span>    assertNotNull(r.getValue(fam1, q2));<a name="line.5897"></a>
-<span class="sourceLineNo">5898</span>    assertNotNull(r.getValue(fam1, q3));<a name="line.5898"></a>
-<span class="sourceLineNo">5899</span>    assertNotNull(r.getValue(fam1, q4));<a name="line.5899"></a>
-<span class="sourceLineNo">5900</span><a name="line.5900"></a>
-<span class="sourceLineNo">5901</span>    // Increment time to T+10 seconds<a name="line.5901"></a>
-<span class="sourceLineNo">5902</span>    edge.incrementTime(5000);<a name="line.5902"></a>
-<span class="sourceLineNo">5903</span><a name="line.5903"></a>
-<span class="sourceLineNo">5904</span>    r = region.get(new Get(row));<a name="line.5904"></a>
-<span class="sourceLineNo">5905</span>    assertNull(r.getValue(fam1, q1));<a name="line.5905"></a>
-<span class="sourceLineNo">5906</span>    assertNull(r.getValue(fam1, q2));<a name="line.5906"></a>
-<span class="sourceLineNo">5907</span>    assertNotNull(r.getValue(fam1, q3));<a name="line.5907"></a>
-<span class="sourceLineNo">5908</span>    assertNotNull(r.getValue(fam1, q4));<a name="line.5908"></a>
-<span class="sourceLineNo">5909</span><a name="line.5909"></a>
-<span class="sourceLineNo">5910</span>    // Increment time to T+15 seconds<a name="line.5910"></a>
-<span class="sourceLineNo">5911</span>    edge.incrementTime(5000);<a name="line.5911"></a>
-<span class="sourceLineNo">5912</span><a name="line.5912"></a>
-<span class="sourceLineNo">5913</span>    r = region.get(new Get(row));<a name="line.5913"></a>
-<span class="sourceLineNo">5914</span>    assertNull(r.getValue(fam1, q1));<a name="line.5914"></a>
-<span class="sourceLineNo">5915</span>    assertNull(r.getValue(fam1, q2));<a name="line.5915"></a>
-<span class="sourceLineNo">5916</span>    assertNull(r.getValue(fam1, q3));<a name="line.5916"></a>
-<span class="sourceLineNo">5917</span>    assertNotNull(r.getValue(fam1, q4));<a name="line.5917"></a>
-<span class="sourceLineNo">5918</span><a name="line.5918"></a>
-<span class="sourceLineNo">5919</span>    // Increment time to T+20 seconds<a name="line.5919"></a>
-<span class="sourceLineNo">5920</span>    edge.incrementTime(10000);<a name="line.5920"></a>
-<span class="sourceLineNo">5921</span><a name="line.5921"></a>
-<span class="sourceLineNo">5922</span>    r = region.get(new Get(row));<a name="line.5922"></a>
-<span class="sourceLineNo">5923</span>    assertNull(r.getValue(fam1, q1));<a name="line.5923"></a>
-<span class="sourceLineNo">5924</span>    assertNull(r.getValue(fam1, q2));<a name="line.5924"></a>
-<span class="sourceLineNo">5925</span>    assertNull(r.getValue(fam1, q3));<a name="line.5925"></a>
-<span class="sourceLineNo">5926</span>    assertNull(r.getValue(fam1, q4));<a name="line.5926"></a>
-<span class="sourceLineNo">5927</span><a name="line.5927"></a>
-<span class="sourceLineNo">5928</span>    // Fun with disappearing increments<a name="line.5928"></a>
-<span class="sourceLineNo">5929</span><a name="line.5929"></a>
-<span class="sourceLineNo">5930</span>    // Start at 1<a name="line.5930"></a>
-<span class="sourceLineNo">5931</span>    region.put(new Put(row).addColumn(fam1, q1, Bytes.toBytes(1L)));<a name="line.5931"></a>
+<span class="sourceLineNo">5895</span>    // A query at time T+0 should return all cells<a name="line.5895"></a>
+<span class="sourceLineNo">5896</span>    Result r = region.get(new Get(row));<a name="line.5896"></a>
+<span class="sourceLineNo">5897</span>    assertNotNull(r.getValue(fam1, q1));<a name="line.5897"></a>
+<span class="sourceLineNo">5898</span>    assertNotNull(r.getValue(fam1, q2));<a name="line.5898"></a>
+<span class="sourceLineNo">5899</span>    assertNotNull(r.getValue(fam1, q3));<a name="line.5899"></a>
+<span class="sourceLineNo">5900</span>    assertNotNull(r.getValue(fam1, q4));<a name="line.5900"></a>
+<span class="sourceLineNo">5901</span><a name="line.5901"></a>
+<span class="sourceLineNo">5902</span>    // Increment time to T+5 seconds<a name="line.5902"></a>
+<span class="sourceLineNo">5903</span>    edge.incrementTime(5000);<a name="line.5903"></a>
+<span class="sourceLineNo">5904</span><a name="line.5904"></a>
+<span class="sourceLineNo">5905</span>    r = region.get(new Get(row));<a name="line.5905"></a>
+<span class="sourceLineNo">5906</span>    assertNull(r.getValue(fam1, q1));<a name="line.5906"></a>
+<span class="sourceLineNo">5907</span>    assertNotNull(r.getValue(fam1, q2));<a name="line.5907"></a>
+<span class="sourceLineNo">5908</span>    assertNotNull(r.getValue(fam1, q3));<a name="line.5908"></a>
+<span class="sourceLineNo">5909</span>    assertNotNull(r.getValue(fam1, q4));<a name="line.5909"></a>
+<span class="sourceLineNo">5910</span><a name="line.5910"></a>
+<span class="sourceLineNo">5911</span>    // Increment time to T+10 seconds<a name="line.5911"></a>
+<span class="sourceLineNo">5912</span>    edge.incrementTime(5000);<a name="line.5912"></a>
+<span class="sourceLineNo">5913</span><a name="line.5913"></a>
+<span class="sourceLineNo">5914</span>    r = region.get(new Get(row));<a name="line.5914"></a>
+<span class="sourceLineNo">5915</span>    assertNull(r.getValue(fam1, q1));<a name="line.5915"></a>
+<span class="sourceLineNo">5916</span>    assertNull(r.getValue(fam1, q2));<a name="line.5916"></a>
+<span class="sourceLineNo">5917</span>    assertNotNull(r.getValue(fam1, q3));<a name="line.5917"></a>
+<span class="sourceLineNo">5918</span>    assertNotNull(r.getValue(fam1, q4));<a name="line.5918"></a>
+<span class="sourceLineNo">5919</span><a name="line.5919"></a>
+<span class="sourceLineNo">5920</span>    // Increment time to T+15 seconds<a name="line.5920"></a>
+<span class="sourceLineNo">5921</span>    edge.incrementTime(5000);<a name="line.5921"></a>
+<span class="sourceLineNo">5922</span><a name="line.5922"></a>
+<span class="sourceLineNo">5923</span>    r = region.get(new Get(row));<a name="line.5923"></a>
+<span class="sourceLineNo">5924</span>    assertNull(r.getValue(fam1, q1));<a name="line.5924"></a>
+<span class="sourceLineNo">5925</span>    assertNull(r.getValue(fam1, q2));<a name="line.5925"></a>
+<span class="sourceLineNo">5926</span>    assertNull(r.getValue(fam1, q3));<a name="line.5926"></a>
+<span class="sourceLineNo">5927</span>    assertNotNull(r.getValue(fam1, q4));<a name="line.5927"></a>
+<span class="sourceLineNo">5928</span><a name="line.5928"></a>
+<span class="sourceLineNo">5929</span>    // Increment time to T+20 seconds<a name="line.5929"></a>
+<span class="sourceLineNo">5930</span>    edge.incrementTime(10000);<a name="line.5930"></a>
+<span class="sourceLineNo">5931</span><a name="line.5931"></a>
 <span class="sourceLineNo">5932</span>    r = region.get(new Get(row));<a name="line.5932"></a>
-<span class="sourceLineNo">5933</span>    byte[] val = r.getValue(fam1, q1);<a name="line.5933"></a>
-<span class="sourceLineNo">5934</span>    assertNotNull(val);<a name="line.5934"></a>
-<span class="sourceLineNo">5935</span>    assertEquals(1L, Bytes.toLong(val));<a name="line.5935"></a>
-<span class="sourceLineNo">5936</span><a name="line.5936"></a>
-<span class="sourceLineNo">5937</span>    // Increment with a TTL of 5 seconds<a name="line.5937"></a>
-<span class="sourceLineNo">5938</span>    Increment incr = new Increment(row).addColumn(fam1, q1, 1L);<a name="line.5938"></a>
-<span class="sourceLineNo">5939</span>    incr.setTTL(5000);<a name="line.5939"></a>
-<span class="sourceLineNo">5940</span>    region.increment(incr); // 2<a name="line.5940"></a>
-<span class="sourceLineNo">5941</span><a name="line.5941"></a>
-<span class="sourceLineNo">5942</span>    // New value should be 2<a name="line.5942"></a>
-<span class="sourceLineNo">5943</span>    r = region.get(new Get(row));<a name="line.5943"></a>
-<span class="sourceLineNo">5944</span>    val = r.getValue(fam1, q1);<a name="line.5944"></a>
-<span class="sourceLineNo">5945</span>    assertNotNull(val);<a name="line.5945"></a>
-<span class="sourceLineNo">5946</span>    assertEquals(2L, Bytes.toLong(val));<a name="line.5946"></a>
-<span class="sourceLineNo">5947</span><a name="line.5947"></a>
-<span class="sourceLineNo">5948</span>    // Increment time to T+25 seconds<a name="line.5948"></a>
-<span class="sourceLineNo">5949</span>    edge.incrementTime(5000);<a name="line.5949"></a>
-<span class="sourceLineNo">5950</span><a name="line.5950"></a>
-<span class="sourceLineNo">5951</span>    // Value should be back to 1<a name="line.5951"></a>
-<span class="sourceLineNo">5952</span>    r = region.get(new Get(row));<a name="line.5952"></a>
-<span class="sourceLineNo">5953</span>    val = r.getValue(fam1, q1);<a name="line.5953"></a>
-<span class="sourceLineNo">5954</span>    assertNotNull(val);<a name="line.5954"></a>
-<span class="sourceLineNo">5955</span>    assertEquals(1L, Bytes.toLong(val));<a name="line.5955"></a>
-<span class="sourceLineNo">5956</span><a name="line.5956"></a>
-<span class="sourceLineNo">5957</span>    // Increment time to T+30 seconds<a name="line.5957"></a>
-<span class="sourceLineNo">5958</span>    edge.incrementTime(5000);<a name="line.5958"></a>
-<span class="sourceLineNo">5959</span><a name="line.5959"></a>
-<span class="sourceLineNo">5960</span>    // Original value written at T+20 should be gone now via family TTL<a name="line.5960"></a>
-<span class="sourceLineNo">5961</span>    r = region.get(new Get(row));<a name="line.5961"></a>
-<span class="sourceLineNo">5962</span>    assertNull(r.getValue(fam1, q1));<a name="line.5962"></a>
-<span class="sourceLineNo">5963</span>  }<a name="line.5963"></a>
-<span class="sourceLineNo">5964</span><a name="line.5964"></a>
-<span class="sourceLineNo">5965</span>  @Test<a name="line.5965"></a>
-<span class="sourceLineNo">5966</span>  public void testIncrementTimestampsAreMonotonic() throws IOException {<a name="line.5966"></a>
-<span class="sourceLineNo">5967</span>    region = initHRegion(tableName, method, CONF, fam1);<a name="line.5967"></a>
-<span class="sourceLineNo">5968</span>    ManualEnvironmentEdge edge = new ManualEnvironmentEdge();<a name="line.5968"></a>
-<span class="sourceLineNo">5969</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.5969"></a>
-<span class="sourceLineNo">5970</span><a name="line.5970"></a>
-<span class="sourceLineNo">5971</span>    edge.setValue(10);<a name="line.5971"></a>
-<span class="sourceLineNo">5972</span>    Increment inc = new Increment(row);<a name="line.5972"></a>
-<span class="sourceLineNo">5973</span>    inc.setDurability(Durability.SKIP_WAL);<a name="line.5973"></a>
-<span class="sourceLineNo">5974</span>    inc.addColumn(fam1, qual1, 1L);<a name="line.5974"></a>
-<span class="sourceLineNo">5975</span>    region.increment(inc);<a name="line.5975"></a>
-<span class="sourceLineNo">5976</span><a name="line.5976"></a>
-<span class="sourceLineNo">5977</span>    Result result = region.get(new Get(row));<a name="line.5977"></a>
-<span class="sourceLineNo">5978</span>    Cell c = result.getColumnLatestCell(fam1, qual1);<a name="line.5978"></a>
-<span class="sourceLineNo">5979</span>    assertNotNull(c);<a name="line.5979"></a>
-<span class="sourceLineNo">5980</span>    assertEquals(10L, c.getTimestamp());<a name="line.5980"></a>
-<span class="sourceLineNo">5981</span><a name="line.5981"></a>
-<span class="sourceLineNo">5982</span>    edge.setValue(1); // clock goes back<a name="line.5982"></a>
-<span class="sourceLineNo">5983</span>    region.increment(inc);<a name="line.5983"></a>
-<span class="sourceLineNo">5984</span>    result = region.get(new Get(row));<a name="line.5984"></a>
-<span class="sourceLineNo">5985</span>    c = result.getColumnLatestCell(fam1, qual1);<a name="line.5985"></a>
-<span class="sourceLineNo">5986</span>    assertEquals(11L, c.getTimestamp());<a name="line.5986"></a>
-<span class="sourceLineNo">5987</span>    assertEquals(2L, Bytes.toLong(c.getValueArray(), c.getValueOffset(), c.getValueLength()));<a name="line.5987"></a>
-<span class="sourceLineNo">5988</span>  }<a name="line.5988"></a>
-<span class="sourceLineNo">5989</span><a name="line.5989"></a>
-<span class="sourceLineNo">5990</span>  @Test<a name="line.5990"></a>
-<span class="sourceLineNo">5991</span>  public void testAppendTimestampsAreMonotonic() throws IOException {<a name="line.5991"></a>
-<span class="sourceLineNo">5992</span>    region = initHRegion(tableName, method, CONF, fam1);<a name="line.5992"></a>
-<span class="sourceLineNo">5993</span>    ManualEnvironmentEdge edge = new ManualEnvironmentEdge();<a name="line.5993"></a>
-<span class="sourceLineNo">5994</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.5994"></a>
-<span class="sourceLineNo">5995</span><a name="line.5995"></a>
-<span class="sourceLineNo">5996</span>    edge.setValue(10);<a name="line.5996"></a>
-<span class="sourceLineNo">5997</span>    Append a = new Append(row);<a name="line.5997"></a>
-<span class="sourceLineNo">5998</span>    a.setDurability(Durability.SKIP_WAL);<a name="line.5998"></a>
-<span class="sourceLineNo">5999</span>    a.addColumn(fam1, qual1, qual1);<a name="line.5999"></a>
-<span class="sourceLineNo">6000</span>    region.append(a);<a name="line.6000"></a>
-<span class="sourceLineNo">6001</span><a name="line.6001"></a>
-<span class="sourceLineNo">6002</span>    Result result = region.get(new Get(row));<a name="line.6002"></a>
-<span class="sourceLineNo">6003</span>    Cell c = result.getColumnLatestCell(fam1, qual1);<a name="line.6003"></a>
-<span class="sourceLineNo">6004</span>    assertNotNull(c);<a name="line.6004"></a>
-<span class="sourceLineNo">6005</span>    assertEquals(10L, c.getTimestamp());<a name="line.6005"></a>
-<span class="sourceLineNo">6006</span><a name="line.6006"></a>
-<span class="sourceLineNo">6007</span>    edge.setValue(1); // clock goes back<a name="line.6007"></a>
-<span class="sourceLineNo">6008</span>    region.append(a);<a name="line.6008"></a>
-<span class="sourceLineNo">6009</span>    result = region.get(new Get(row));<a name="line.6009"></a>
-<span class="sourceLineNo">6010</span>    c = result.getColumnLatestCell(fam1, qual1);<a name="line.6010"></a>
-<span class="sourceLineNo">6011</span>    assertEquals(11L, c.getTimestamp());<a name="line.6011"></a>
-<span class="sourceLineNo">6012</span><a name="line.6012"></a>
-<span class="sourceLineNo">6013</span>    byte[] expected = new byte[qual1.length*2];<a name="line.6013"></a>
-<span class="sourceLineNo">6014</span>    System.arraycopy(qual1, 0, expected, 0, qual1.length);<a name="line.6014"></a>
-<span class="sourceLineNo">6015</span>    System.arraycopy(qual1, 0, expected, qual1.length, qual1.length);<a name="line.6015"></a>
+<span class="sourceLineNo">5933</span>    assertNull(r.getValue(fam1, q1));<a name="line.5933"></a>
+<span class="sourceLineNo">5934</span>    assertNull(r.getValue(fam1, q2));<a name="line.5934"></a>
+<span class="sourceLineNo">5935</span>    assertNull(r.getValue(fam1, q3));<a name="line.5935"></a>
+<span class="sourceLineNo">5936</span>    assertNull(r.getValue(fam1, q4));<a name="line.5936"></a>
+<span class="sourceLineNo">5937</span><a name="line.5937"></a>
+<span class="sourceLineNo">5938</span>    // Fun with disappearing increments<a name="line.5938"></a>
+<span class="sourceLineNo">5939</span><a name="line.5939"></a>
+<span class="sourceLineNo">5940</span>    // Start at 1<a name="line.5940"></a>
+<span class="sourceLineNo">5941</span>    region.put(new Put(row).addColumn(fam1, q1, Bytes.toBytes(1L)));<a name="line.5941"></a>
+<span class="sourceLineNo">5942</span>    r = region.get(new Get(row));<a name="line.5942"></a>
+<span class="sourceLineNo">5943</span>    byte[] val = r.getValue(fam1, q1);<a name="line.5943"></a>
+<span class="sourceLineNo">5944</span>    assertNotNull(val);<a name="line.5944"></a>
+<span class="sourceLineNo">5945</span>    assertEquals(1L, Bytes.toLong(val));<a name="line.5945"></a>
+<span class="sourceLineNo">5946</span><a name="line.5946"></a>
+<span class="sourceLineNo">5947</span>    // Increment with a TTL of 5 seconds<a name="line.5947"></a>
+<span class="sourceLineNo">5948</span>    Increment incr = new Increment(row).addColumn(fam1, q1, 1L);<a name="line.5948"></a>
+<span class="sourceLineNo">5949</span>    incr.setTTL(5000);<a name="line.5949"></a>
+<span class="sourceLineNo">5950</span>    region.increment(incr); // 2<a name="line.5950"></a>
+<span class="sourceLineNo">5951</span><a name="line.5951"></a>
+<span class="sourceLineNo">5952</span>    // New value should be 2<a name="line.5952"></a>
+<span class="sourceLineNo">5953</span>    r = region.get(new Get(row));<a name="line.5953"></a>
+<span class="sourceLineNo">5954</span>    val = r.getValue(fam1, q1);<a name="line.5954"></a>
+<span class="sourceLineNo">5955</span>    assertNotNull(val);<a name="line.5955"></a>
+<span class="sourceLineNo">5956</span>    assertEquals(2L, Bytes.toLong(val));<a name="line.5956"></a>
+<span class="sourceLineNo">5957</span><a name="line.5957"></a>
+<span class="sourceLineNo">5958</span>    // Increment time to T+25 seconds<a name="line.5958"></a>
+<span class="sourceLineNo">5959</span>    edge.incrementTime(5000);<a name="line.5959"></a>
+<span class="sourceLineNo">5960</span><a name="line.5960"></a>
+<span class="sourceLineNo">5961</span>    // Value should be back to 1<a name="line.5961"></a>
+<span class="sourceLineNo">5962</span>    r = region.get(new Get(row));<a name="line.5962"></a>
+<span class="sourceLineNo">5963</span>    val = r.getValue(fam1, q1);<a name="line.5963"></a>
+<span class="sourceLineNo">5964</span>    assertNotNull(val);<a name="line.5964"></a>
+<span class="sourceLineNo">5965</span>    assertEquals(1L, Bytes.toLong(val));<a name="line.5965"></a>
+<span class="sourceLineNo">5966</span><a name="line.5966"></a>
+<span class="sourceLineNo">5967</span>    // Increment time to T+30 seconds<a name="line.5967"></a>
+<span class="sourceLineNo">5968</span>    edge.incrementTime(5000);<a name="line.5968"></a>
+<span class="sourceLineNo">5969</span><a name="line.5969"></a>
+<span class="sourceLineNo">5970</span>    // Original value written at T+20 should be gone now via family TTL<a name="line.5970"></a>
+<span class="sourceLineNo">5971</span>    r = region.get(new Get(row));<a name="line.5971"></a>
+<span class="sourceLineNo">5972</span>    assertNull(r.getValue(fam1, q1));<a name="line.5972"></a>
+<span class="sourceLineNo">5973</span>  }<a name="line.5973"></a>
+<span class="sourceLineNo">5974</span><a name="line.5974"></a>
+<span class="sourceLineNo">5975</span>  @Test<a name="line.5975"></a>
+<span class="sourceLineNo">5976</span>  public void testIncrementTimestampsAreMonotonic() throws IOException {<a name="line.5976"></a>
+<span class="sourceLineNo">5977</span>    region = initHRegion(tableName, method, CONF, fam1);<a name="line.5977"></a>
+<span class="sourceLineNo">5978</span>    ManualEnvironmentEdge edge = new ManualEnvironmentEdge();<a name="line.5978"></a>
+<span class="sourceLineNo">5979</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.5979"></a>
+<span class="sourceLineNo">5980</span><a name="line.5980"></a>
+<span class="sourceLineNo">5981</span>    edge.setValue(10);<a name="line.5981"></a>
+<span class="sourceLineNo">5982</span>    Increment inc = new Increment(row);<a name="line.5982"></a>
+<span class="sourceLineNo">5983</span>    inc.setDurability(Durability.SKIP_WAL);<a name="line.5983"></a>
+<span class="sourceLineNo">5984</span>    inc.addColumn(fam1, qual1, 1L);<a name="line.5984"></a>
+<span class="sourceLineNo">5985</span>    region.increment(inc);<a name="line.5985"></a>
+<span class="sourceLineNo">5986</span><a name="line.5986"></a>
+<span class="sourceLineNo">5987</span>    Result result = region.get(new Get(row));<a name="line.5987"></a>
+<span class="sourceLineNo">5988</span>    Cell c = result.getColumnLatestCell(fam1, qual1);<a name="line.5988"></a>
+<span class="sourceLineNo">5989</span>    assertNotNull(c);<a name="line.5989"></a>
+<span class="sourceLineNo">5990</span>    assertEquals(10L, c.getTimestamp());<a name="line.5990"></a>
+<span class="sourceLineNo">5991</span><a name="line.5991"></a>
+<span class="sourceLineNo">5992</span>    edge.setValue(1); // clock goes back<a name="line.5992"></a>
+<span class="sourceLineNo">5993</span>    region.increment(inc);<a name="line.5993"></a>
+<span class="sourceLineNo">5994</span>    result = region.get(new Get(row));<a name="line.5994"></a>
+<span class="sourceLineNo">5995</span>    c = result.getColumnLatestCell(fam1, qual1);<a name="line.5995"></a>
+<span class="sourceLineNo">5996</span>    assertEquals(11L, c.getTimestamp());<a name="line.5996"></a>
+<span class="sourceLineNo">5997</span>    assertEquals(2L, Bytes.toLong(c.getValueArray(), c.getValueOffset(), c.getValueLength()));<a name="line.5997"></a>
+<span class="sourceLineNo">5998</span>  }<a name="line.5998"></a>
+<span class="sourceLineNo">5999</span><a name="line.5999"></a>
+<span class="sourceLineNo">6000</span>  @Test<a name="line.6000"></a>
+<span class="sourceLineNo">6001</span>  public void testAppendTimestampsAreMonotonic() throws IOException {<a name="line.6001"></a>
+<span class="sourceLineNo">6002</span>    region = initHRegion(tableName, method, CONF, fam1);<a name="line.6002"></a>
+<span class="sourceLineNo">6003</span>    ManualEnvironmentEdge edge = new ManualEnvironmentEdge();<a name="line.6003"></a>
+<span class="sourceLineNo">6004</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.6004"></a>
+<span class="sourceLineNo">6005</span><a name="line.6005"></a>
+<span class="sourceLineNo">6006</span>    edge.setValue(10);<a name="line.6006"></a>
+<span class="sourceLineNo">6007</span>    Append a = new Append(row);<a name="line.6007"></a>
+<span class="sourceLineNo">6008</span>    a.setDurability(Durability.SKIP_WAL);<a name="line.6008"></a>
+<span class="sourceLineNo">6009</span>    a.addColumn(fam1, qual1, qual1);<a name="line.6009"></a>
+<span class="sourceLineNo">6010</span>    region.append(a);<a name="line.6010"></a>
+<span class="sourceLineNo">6011</span><a name="line.6011"></a>
+<span class="sourceLineNo">6012</span>    Result result = region.get(new Get(row));<a name="line.6012"></a>
+<span class="sourceLineNo">6013</span>    Cell c = result.getColumnLatestCell(fam1, qual1);<a name="line.6013"></a>
+<span class="sourceLineNo">6014</span>    assertNotNull(c);<a name="line.6014"></a>
+<span class="sourceLineNo">6015</span>    assertEquals(10L, c.getTimestamp());<a name="line.6015"></a>
 <span class="sourceLineNo">6016</span><a name="line.6016"></a>
-<span class="sourceLineNo">6017</span>    assertTrue(Bytes.equals(c.getValueArray(), c.getValueOffset(), c.getValueLength(),<a name="line.6017"></a>
-<span class="sourceLineNo">6018</span>      expected, 0, expected.length));<a name="line.6018"></a>
-<span class="sourceLineNo">6019</span>  }<a name="line.6019"></a>
-<span class="sourceLineNo">6020</span><a name="line.6020"></a>
-<span class="sourceLineNo">6021</span>  @Test<a name="line.6021"></a>
-<span class="sourceLineNo">6022</span>  public void testCheckAndMutateTimestampsAreMonotonic() throws IOException {<a name="line.6022"></a>
-<span class="sourceLineNo">6023</span>    region = initHRegion(tableName, method, CONF, fam1);<a name="line.6023"></a>
-<span class="sourceLineNo">6024</span>    ManualEnvironmentEdge edge = new ManualEnvironmentEdge();<a name="line.6024"></a>
-<span class="sourceLineNo">6025</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.6025"></a>
+<span class="sourceLineNo">6017</span>    edge.setValue(1); // clock goes back<a name="line.6017"></a>
+<span class="sourceLineNo">6018</span>    region.append(a);<a name="line.6018"></a>
+<span class="sourceLineNo">6019</span>    result = region.get(new Get(row));<a name="line.6019"></a>
+<span class="sourceLineNo">6020</span>    c = result.getColumnLatestCell(fam1, qual1);<a name="line.6020"></a>
+<span class="sourceLineNo">6021</span>    assertEquals(11L, c.getTimestamp());<a name="line.6021"></a>
+<span class="sourceLineNo">6022</span><a name="line.6022"></a>
+<span class="sourceLineNo">6023</span>    byte[] expected = new byte[qual1.length*2];<a name="line.6023"></a>
+<span class="sourceLineNo">6024</span>    System.arraycopy(qual1, 0, expected, 0, qual1.length);<a name="line.6024"></a>
+<span class="sourceLineNo">6025</span>    System.arraycopy(qual1, 0, expected, qual1.length, qual1.length);<a name="line.6025"></a>
 <span class="sourceLineNo">6026</span><a name="line.6026"></a>
-<span class="sourceLineNo">6027</span>    edge.setValue(10);<a name="line.6027"></a>
-<span class="sourceLineNo">6028</span>    Put p = new Put(row);<a name="line.6028"></a>
-<span class="sourceLineNo">6029</span>    p.setDurability(Durability.SKIP_WAL);<a name="line.6029"></a>
-<span class="sourceLineNo">6030</span>    p.addColumn(fam1, qual1, qual1);<a name="line.6030"></a>
-<span class="sourceLineNo">6031</span>    region.put(p);<a name="line.6031"></a>
-<span class="sourceLineNo">6032</span><a name="line.6032"></a>
-<span class="sourceLineNo">6033</span>    Result result = region.get(new Get(row));<a name="line.6033"></a>
-<span class="sourceLineNo">6034</span>    Cell c = result.getColumnLatestCell(fam1, qual1);<a name="line.6034"></a>
-<span class="sourceLineNo">6035</span>    assertNotNull(c);<a name="line.6035"></a>
-<span class="sourceLineNo">6036</span>    assertEquals(10L, c.getTimestamp());<a name="line.6036"></a>
-<span class="sourceLineNo">6037</span><a name="line.6037"></a>
-<span class="sourceLineNo">6038</span>    edge.setValue(1); // clock goes back<a name="line.6038"></a>
-<span class="sourceLineNo">6039</span>    p = new Put(row);<a name="line.6039"></a>
-<span class="sourceLineNo">6040</span>    p.setDurability(Durability.SKIP_WAL);<a name="line.6040"></a>
-<span class="sourceLineNo">6041</span>    p.addColumn(fam1, qual1, qual2);<a name="line.6041"></a>
-<span class="sourceLineNo">6042</span>    region.checkAndMutate(row, fam1, qual1, CompareOperator.EQUAL, new BinaryComparator(qual1), p);<a name="line.6042"></a>
-<span class="sourceLineNo">6043</span>    result = region.get(new Get(row));<a name="line.6043"></a>
-<span class="sourceLineNo">6044</span>    c = result.getColumnLatestCell(fam1, qual1);<a name="line.6044"></a>
-<span class="sourceLineNo">6045</span>    assertEquals(10L, c.getTimestamp());<a name="line.6045"></a>
-<span class="sourceLineNo">6046</span><a name="line.6046"></a>
-<span class="sourceLineNo">6047</span>    assertTrue(Bytes.equals(c.getValueArray(), c.getValueOffset(), c.getValueLength(),<a name="line.6047"></a>
-<span class="sourceLineNo">6048</span>      qual2, 0, qual2.length));<a name="line.6048"></a>
-<span class="sourceLineNo">6049</span>  }<a name="line.6049"></a>
-<span class="sourceLineNo">6050</span><a name="line.6050"></a>
-<span class="sourceLineNo">6051</span>  @Test<a name="line.6051"></a>
-<span class="sourceLineNo">6052</span>  public void testBatchMutateWithWrongRegionException() throws Exception {<a name="line.6052"></a>
-<span class="sourceLineNo">6053</span>    final byte[] a = Bytes.toBytes("a");<a name="line.6053"></a>
-<span class="sourceLineNo">6054</span>    final byte[] b = Bytes.toBytes("b");<a name="line.6054"></a>
-<span class="sourceLineNo">6055</span>    final byte[] c = Bytes.toBytes("c"); // exclusive<a name="line.6055"></a>
+<span class="sourceLineNo">6027</span>    assertTrue(Bytes.equals(c.getValueArray(), c.getValueOffset(), c.getValueLength(),<a name="line.6027"></a>
+<span class="sourceLineNo">6028</span>      expected, 0, expected.length));<a name="line.6028"></a>
+<span class="sourceLineNo">6029</span>  }<a name="line.6029"></a>
+<span class="sourceLineNo">6030</span><a name="line.6030"></a>
+<span class="sourceLineNo">6031</span>  @Test<a name="line.6031"></a>
+<span class="sourceLineNo">6032</span>  public void testCheckAndMutateTimestampsAreMonotonic() throws IOException {<a name="line.6032"></a>
+<span class="sourceLineNo">6033</span>    region = initHRegion(tableName, method, CONF, fam1);<a name="line.6033"></a>
+<span class="sourceLineNo">6034</span>    ManualEnvironmentEdge edge = new ManualEnvironmentEdge();<a name="line.6034"></a>
+<span class="sourceLineNo">6035</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.6035"></a>
+<span class="sourceLineNo">6036</span><a name="line.6036"></a>
+<span class="sourceLineNo">6037</span>    edge.setValue(10);<a name="line.6037"></a>
+<span class="sourceLineNo">6038</span>    Put p = new Put(row);<a name="line.6038"></a>
+<span class="sourceLineNo">6039</span>    p.setDurability(Durability.SKIP_WAL);<a name="line.6039"></a>
+<span class="sourceLineNo">6040</span>    p.addColumn(fam1, qual1, qual1);<a name="line.6040"></a>
+<span class="sourceLineNo">6041</span>    region.put(p);<a name="line.6041"></a>
+<span class="sourceLineNo">6042</span><a name="line.6042"></a>
+<span class="sourceLineNo">6043</span>    Result result = region.get(new Get(row));<a name="line.6043"></a>
+<span class="sourceLineNo">6044</span>    Cell c = result.getColumnLatestCell(fam1, qual1);<a name="line.6044"></a>
+<span class="sourceLineNo">6045</span>    assertNotNull(c);<a name="line.6045"></a>
+<span class="sourceLineNo">6046</span>    assertEquals(10L, c.getTimestamp());<a name="line.6046"></a>
+<span class="sourceLineNo">6047</span><a name="line.6047"></a>
+<span class="sourceLineNo">6048</span>    edge.setValue(1); // clock goes back<a name="line.6048"></a>
+<span class="sourceLineNo">6049</span>    p = new Put(row);<a name="line.6049"></a>
+<span class="sourceLineNo">6050</span>    p.setDurability(Durability.SKIP_WAL);<a name="line.6050"></a>
+<span class="sourceLineNo">6051</span>    p.addColumn(fam1, qual1, qual2);<a name="line.6051"></a>
+<span class="sourceLineNo">6052</span>    region.checkAndMutate(row, fam1, qual1, CompareOperator.EQUAL, new BinaryComparator(qual1), p);<a name="line.6052"></a>
+<span class="sourceLineNo">6053</span>    result = region.get(new Get(row));<a name="line.6053"></a>
+<span class="sourceLineNo">6054</span>    c = result.getColumnLatestCell(fam1, qual1);<a name="line.6054"></a>
+<span class="sourceLineNo">6055</span>    assertEquals(10L, c.getTimestamp());<a name="line.6055"></a>
 <span class="sourceLineNo">6056</span><a name="line.6056"></a>
-<span class="sourceLineNo">6057</span>    int prevLockTimeout = CONF.getInt("hbase.rowlock.wait.duration", 30000);<a name="line.6057"></a>
-<span class="sourceLineNo">6058</span>    CONF.setInt("hbase.rowlock.wait.duration", 1000);<a name="line.6058"></a>
-<span class="sourceLineNo">6059</span>    region = initHRegion(tableName, a, c, method, CONF, false, fam1);<a name="line.6059"></a>
+<span class="sourceLineNo">6057</span>    assertTrue(Bytes.equals(c.getValueArray(), c.getValueOffset(), c.getValueLength(),<a name="line.6057"></a>
+<span class="sourceLineNo">6058</span>      qual2, 0, qual2.length));<a name="line.6058"></a>
+<span class="sourceLineNo">6059</span>  }<a name="line.6059"></a>
 <span class="sourceLineNo">6060</span><a name="line.6060"></a>
-<span class="sourceLineNo">6061</span>    Mutation[] mutations = new Mutation[] {<a name="line.6061"></a>
-<span class="sourceLineNo">6062</span>        new Put(a)<a name="line.6062"></a>
-<span class="sourceLineNo">6063</span>            .add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6063"></a>
-<span class="sourceLineNo">6064</span>              .setRow(a)<a name="line.6064"></a>
-<span class="sourceLineNo">6065</span>              .setFamily(fam1)<a name="line.6065"></a>
-<span class="sourceLineNo">6066</span>              .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6066"></a>
-<span class="sourceLineNo">6067</span>              .setType(Cell.Type.Put)<a name="line.6067"></a>
-<span class="sourceLineNo">6068</span>              .build()),<a name="line.6068"></a>
-<span class="sourceLineNo">6069</span>        // this is outside the region boundary<a name="line.6069"></a>
-<span class="sourceLineNo">6070</span>        new Put(c).add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6070"></a>
-<span class="sourceLineNo">6071</span>              .setRow(c)<a name="line.6071"></a>
-<span class="sourceLineNo">6072</span>              .setFamily(fam1)<a name="line.6072"></a>
-<span class="sourceLineNo">6073</span>              .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6073"></a>
-<span class="sourceLineNo">6074</span>              .setType(Type.Put)<a name="line.6074"></a>
-<span class="sourceLineNo">6075</span>              .build()),<a name="line.6075"></a>
-<span class="sourceLineNo">6076</span>        new Put(b).add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6076"></a>
-<span class="sourceLineNo">6077</span>              .setRow(b)<a name="line.6077"></a>
-<span class="sourceLineNo">6078</span>              .setFamily(fam1)<a name="line.6078"></a>
-<span class="sourceLineNo">6079</span>              .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6079"></a>
-<span class="sourceLineNo">6080</span>              .setType(Cell.Type.Put)<a name="line.6080"></a>
-<span class="sourceLineNo">6081</span>              .build())<a name="line.6081"></a>
-<span class="sourceLineNo">6082</span>    };<a name="line.6082"></a>
-<span class="sourceLineNo">6083</span><a name="line.6083"></a>
-<span class="sourceLineNo">6084</span>    OperationStatus[] status = region.batchMutate(mutations);<a name="line.6084"></a>
-<span class="sourceLineNo">6085</span>    assertEquals(OperationStatusCode.SUCCESS, status[0].getOperationStatusCode());<a name="line.6085"></a>
-<span class="sourceLineNo">6086</span>    assertEquals(OperationStatusCode.SANITY_CHECK_FAILURE, status[1].getOperationStatusCode());<a name="line.6086"></a>
-<span class="sourceLineNo">6087</span>    assertEquals(OperationStatusCode.SUCCESS, status[2].getOperationStatusCode());<a name="line.6087"></a>
-<span class="sourceLineNo">6088</span><a name="line.6088"></a>
-<span class="sourceLineNo">6089</span><a name="line.6089"></a>
-<span class="sourceLineNo">6090</span>    // test with a row lock held for a long time<a name="line.6090"></a>
-<span class="sourceLineNo">6091</span>    final CountDownLatch obtainedRowLock = new CountDownLatch(1);<a name="line.6091"></a>
-<span class="sourceLineNo">6092</span>    ExecutorService exec = Executors.newFixedThreadPool(2);<a name="line.6092"></a>
-<span class="sourceLineNo">6093</span>    Future&lt;Void&gt; f1 = exec.submit(new Callable&lt;Void&gt;() {<a name="line.6093"></a>
-<span class="sourceLineNo">6094</span>      @Override<a name="line.6094"></a>
-<span class="sourceLineNo">6095</span>      public Void call() throws Exception {<a name="line.6095"></a>
-<span class="sourceLineNo">6096</span>        LOG.info("Acquiring row lock");<a name="line.6096"></a>
-<span class="sourceLineNo">6097</span>        RowLock rl = region.getRowLock(b);<a name="line.6097"></a>
-<span class="sourceLineNo">6098</span>        obtainedRowLock.countDown();<a name="line.6098"></a>
-<span class="sourceLineNo">6099</span>        LOG.info("Waiting for 5 seconds before releasing lock");<a name="line.6099"></a>
-<span class="sourceLineNo">6100</span>        Threads.sleep(5000);<a name="line.6100"></a>
-<span class="sourceLineNo">6101</span>        LOG.info("Releasing row lock");<a name="line.6101"></a>
-<span class="sourceLineNo">6102</span>        rl.release();<a name="line.6102"></a>
-<span class="sourceLineNo">6103</span>        return null;<a name="line.6103"></a>
-<span class="sourceLineNo">6104</span>      }<a name="line.6104"></a>
-<span class="sourceLineNo">6105</span>    });<a name="line.6105"></a>
-<span class="sourceLineNo">6106</span>    obtainedRowLock.await(30, TimeUnit.SECONDS);<a name="line.6106"></a>
-<span class="sourceLineNo">6107</span><a name="line.6107"></a>
-<span class="sourceLineNo">6108</span>    Future&lt;Void&gt; f2 = exec.submit(new Callable&lt;Void&gt;() {<a name="line.6108"></a>
-<span class="sourceLineNo">6109</span>      @Override<a name="line.6109"></a>
-<span class="sourceLineNo">6110</span>      public Void call() throws Exception {<a name="line.6110"></a>
-<span class="sourceLineNo">6111</span>        Mutation[] mutations = new Mutation[] {<a name="line.6111"></a>
-<span class="sourceLineNo">6112</span>            new Put(a).add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6112"></a>
-<span class="sourceLineNo">6113</span>                .setRow(a)<a name="line.6113"></a>
-<span class="sourceLineNo">6114</span>                .setFamily(fam1)<a name="line.6114"></a>
-<span class="sourceLineNo">6115</span>                .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6115"></a>
-<span class="sourceLineNo">6116</span>                .setType(Cell.Type.Put)<a name="line.6116"></a>
-<span class="sourceLineNo">6117</span>                .build()),<a name="line.6117"></a>
-<span class="sourceLineNo">6118</span>            new Put(b).add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6118"></a>
-<span class="sourceLineNo">6119</span>                .setRow(b)<a name="line.6119"></a>
-<span class="sourceLineNo">6120</span>                .setFamily(fam1)<a name="line.6120"></a>
-<span class="sourceLineNo">6121</span>                .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6121"></a>
-<span class="sourceLineNo">6122</span>                .setType(Cell.Type.Put)<a name="line.6122"></a>
-<span class="sourceLineNo">6123</span>                .build()),<a name="line.6123"></a>
-<span class="sourceLineNo">6124</span>        };<a name="line.6124"></a>
-<span class="sourceLineNo">6125</span><a name="line.6125"></a>
-<span class="sourceLineNo">6126</span>        // this will wait for the row lock, and it will eventually succeed<a name="line.6126"></a>
-<span class="sourceLineNo">6127</span>        OperationStatus[] status = region.batchMutate(mutations);<a name="line.6127"></a>
-<span class="sourceLineNo">6128</span>        assertEquals(OperationStatusCode.SUCCESS, status[0].getOperationStatusCode());<a name="line.6128"></a>
-<span class="sourceLineNo">6129</span>        assertEquals(OperationStatusCode.SUCCESS, status[1].getOperationStatusCode());<a name="line.6129"></a>
-<span class="sourceLineNo">6130</span>        return null;<a name="line.6130"></a>
-<span class="sourceLineNo">6131</span>      }<a name="line.6131"></a>
-<span class="sourceLineNo">6132</span>    });<a name="line.6132"></a>
-<span class="sourceLineNo">6133</span><a name="line.6133"></a>
-<span class="sourceLineNo">6134</span>    f1.get();<a name="line.6134"></a>
-<span class="sourceLineNo">6135</span>    f2.get();<a name="line.6135"></a>
-<span class="sourceLineNo">6136</span><a name="line.6136"></a>
-<span class="sourceLineNo">6137</span>    CONF.setInt("hbase.rowlock.wait.duration", prevLockTimeout);<a name="line.6137"></a>
-<span class="sourceLineNo">6138</span>  }<a name="line.6138"></a>
-<span class="sourceLineNo">6139</span><a name="line.6139"></a>
-<span class="sourceLineNo">6140</span>  @Test<a name="line.6140"></a>
-<span class="sourceLineNo">6141</span>  public void testCheckAndRowMutateTimestampsAreMonotonic() throws IOException {<a name="line.6141"></a>
-<span class="sourceLineNo">6142</span>    region = initHRegion(tableName, method, CONF, fam1);<a name="line.6142"></a>
-<span class="sourceLineNo">6143</span>    ManualEnvironmentEdge edge = new ManualEnvironmentEdge();<a name="line.6143"></a>
-<span class="sourceLineNo">6144</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.6144"></a>
-<span class="sourceLineNo">6145</span><a name="line.6145"></a>
-<span class="sourceLineNo">6146</span>    edge.setValue(10);<a name="line.6146"></a>
-<span class="sourceLineNo">6147</span>    Put p = new Put(row);<a name="line.6147"></a>
-<span class="sourceLineNo">6148</span>    p.setDurability(Durability.SKIP_WAL);<a name="line.6148"></a>
-<span class="sourceLineNo">6149</span>    p.addColumn(fam1, qual1, qual1);<a name="line.6149"></a>
-<span class="sourceLineNo">6150</span>    region.put(p);<a name="line.6150"></a>
-<span class="sourceLineNo">6151</span><a name="line.6151"></a>
-<span class="sourceLineNo">6152</span>    Result result = region.get(new Get(row));<a name="line.6152"></a>
-<span class="sourceLineNo">6153</span>    Cell c = result.getColumnLatestCell(fam1, qual1);<a name="line.6153"></a>
-<span class="sourceLineNo">6154</span>    assertNotNull(c);<a name="line.6154"></a>
-<span class="sourceLineNo">6155</span>    assertEquals(10L, c.getTimestamp());<a name="line.6155"></a>
-<span class="sourceLineNo">6156</span><a name="line.6156"></a>
-<span class="sourceLineNo">6157</span>    edge.setValue(1); // clock goes back<a name="line.6157"></a>
-<span class="sourceLineNo">6158</span>    p = new Put(row);<a name="line.6158"></a>
-<span class="sourceLineNo">6159</span>    p.setDurability(Durability.SKIP_WAL);<a name="line.6159"></a>
-<span class="sourceLineNo">6160</span>    p.addColumn(fam1, qual1, qual2);<a name="line.6160"></a>
-<span class="sourceLineNo">6161</span>    RowMutations rm = new RowMutations(row);<a name="line.6161"></a>
-<span class="sourceLineNo">6162</span>    rm.add(p);<a name="line.6162"></a>
-<span class="sourceLineNo">6163</span>    assertTrue(region.checkAndRowMutate(row, fam1, qual1, CompareOperator.EQUAL,<a name="line.6163"></a>
-<span class="sourceLineNo">6164</span>        new BinaryComparator(qual1), rm));<a name="line.6164"></a>
-<span class="sourceLineNo">6165</span>    result = region.get(new Get(row));<a name="line.6165"></a>
-<span class="sourceLineNo">6166</span>    c = result.getColumnLatestCell(fam1, qual1);<a name="line.6166"></a>
-<span class="sourceLineNo">6167</span>    assertEquals(10L, c.getTimestamp());<a name="line.6167"></a>
-<span class="sourceLineNo">6168</span>    LOG.info("c value " +<a name="line.6168"></a>
-<span class="sourceLineNo">6169</span>      Bytes.toStringBinary(c.getValueArray(), c.getValueOffset(), c.getValueLength()));<a name="line.6169"></a>
-<span class="sourceLineNo">6170</span><a name="line.6170"></a>
-<span class="sourceLineNo">6171</span>    assertTrue(Bytes.equals(c.getValueArray(), c.getValueOffset(), c.getValueLength(),<a name="line.6171"></a>
-<span class="sourceLineNo">6172</span>      qual2, 0, qual2.length));<a name="line.6172"></a>
-<span class="sourceLineNo">6173</span>  }<a name="line.6173"></a>
-<span class="sourceLineNo">6174</span><a name="line.6174"></a>
-<span class="sourceLineNo">6175</span>  HRegion initHRegion(TableName tableName, String callingMethod,<a name="line.6175"></a>
-<span class="sourceLineNo">6176</span>      byte[]... families) throws IOException {<a name="line.6176"></a>
-<span class="sourceLineNo">6177</span>    return initHRegion(tableName, callingMethod, HBaseConfiguration.create(),<a name="line.6177"></a>
-<span class="sourceLineNo">6178</span>        families);<a name="line.6178"></a>
-<span class="sourceLineNo">6179</span>  }<a name="line.6179"></a>
+<span class="sourceLineNo">6061</span>  @Test<a name="line.6061"></a>
+<span class="sourceLineNo">6062</span>  public void testBatchMutateWithWrongRegionException() throws Exception {<a name="line.6062"></a>
+<span class="sourceLineNo">6063</span>    final byte[] a = Bytes.toBytes("a");<a name="line.6063"></a>
+<span class="sourceLineNo">6064</span>    final byte[] b = Bytes.toBytes("b");<a name="line.6064"></a>
+<span class="sourceLineNo">6065</span>    final byte[] c = Bytes.toBytes("c"); // exclusive<a name="line.6065"></a>
+<span class="sourceLineNo">6066</span><a name="line.6066"></a>
+<span class="sourceLineNo">6067</span>    int prevLockTimeout = CONF.getInt("hbase.rowlock.wait.duration", 30000);<a name="line.6067"></a>
+<span class="sourceLineNo">6068</span>    CONF.setInt("hbase.rowlock.wait.duration", 1000);<a name="line.6068"></a>
+<span class="sourceLineNo">6069</span>    region = initHRegion(tableName, a, c, method, CONF, false, fam1);<a name="line.6069"></a>
+<span class="sourceLineNo">6070</span><a name="line.6070"></a>
+<span class="sourceLineNo">6071</span>    Mutation[] mutations = new Mutation[] {<a name="line.6071"></a>
+<span class="sourceLineNo">6072</span>        new Put(a)<a name="line.6072"></a>
+<span class="sourceLineNo">6073</span>            .add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6073"></a>
+<span class="sourceLineNo">6074</span>              .setRow(a)<a name="line.6074"></a>
+<span class="sourceLineNo">6075</span>              .setFamily(fam1)<a name="line.6075"></a>
+<span class="sourceLineNo">6076</span>              .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6076"></a>
+<span class="sourceLineNo">6077</span>              .setType(Cell.Type.Put)<a name="line.6077"></a>
+<span class="sourceLineNo">6078</span>              .build()),<a name="line.6078"></a>
+<span class="sourceLineNo">6079</span>        // this is outside the region boundary<a name="line.6079"></a>
+<span class="sourceLineNo">6080</span>        new Put(c).add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6080"></a>
+<span class="sourceLineNo">6081</span>              .setRow(c)<a name="line.6081"></a>
+<span class="sourceLineNo">6082</span>              .setFamily(fam1)<a name="line.6082"></a>
+<span class="sourceLineNo">6083</span>              .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6083"></a>
+<span class="sourceLineNo">6084</span>              .setType(Type.Put)<a name="line.6084"></a>
+<span class="sourceLineNo">6085</span>              .build()),<a name="line.6085"></a>
+<span class="sourceLineNo">6086</span>        new Put(b).add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6086"></a>
+<span class="sourceLineNo">6087</span>              .setRow(b)<a name="line.6087"></a>
+<span class="sourceLineNo">6088</span>              .setFamily(fam1)<a name="line.6088"></a>
+<span class="sourceLineNo">6089</span>              .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6089"></a>
+<span class="sourceLineNo">6090</span>              .setType(Cell.Type.Put)<a name="line.6090"></a>
+<span class="sourceLineNo">6091</span>              .build())<a name="line.6091"></a>
+<span class="sourceLineNo">6092</span>    };<a name="line.6092"></a>
+<span class="sourceLineNo">6093</span><a name="line.6093"></a>
+<span class="sourceLineNo">6094</span>    OperationStatus[] status = region.batchMutate(mutations);<a name="line.6094"></a>
+<span class="sourceLineNo">6095</span>    assertEquals(OperationStatusCode.SUCCESS, status[0].getOperationStatusCode());<a name="line.6095"></a>
+<span class="sourceLineNo">6096</span>    assertEquals(OperationStatusCode.SANITY_CHECK_FAILURE, status[1].getOperationStatusCode());<a name="line.6096"></a>
+<span class="sourceLineNo">6097</span>    assertEquals(OperationStatusCode.SUCCESS, status[2].getOperationStatusCode());<a name="line.6097"></a>
+<span class="sourceLineNo">6098</span><a name="line.6098"></a>
+<span class="sourceLineNo">6099</span><a name="line.6099"></a>
+<span class="sourceLineNo">6100</span>    // test with a row lock held for a long time<a name="line.6100"></a>
+<span class="sourceLineNo">6101</span>    final CountDownLatch obtainedRowLock = new CountDownLatch(1);<a name="line.6101"></a>
+<span class="sourceLineNo">6102</span>    ExecutorService exec = Executors.newFixedThreadPool(2);<a name="line.6102"></a>
+<span class="sourceLineNo">6103</span>    Future&lt;Void&gt; f1 = exec.submit(new Callable&lt;Void&gt;() {<a name="line.6103"></a>
+<span class="sourceLineNo">6104</span>      @Override<a name="line.6104"></a>
+<span class="sourceLineNo">6105</span>      public Void call() throws Exception {<a name="line.6105"></a>
+<span class="sourceLineNo">6106</span>        LOG.info("Acquiring row lock");<a name="line.6106"></a>
+<span class="sourceLineNo">6107</span>        RowLock rl = region.getRowLock(b);<a name="line.6107"></a>
+<span class="sourceLineNo">6108</span>        obtainedRowLock.countDown();<a name="line.6108"></a>
+<span class="sourceLineNo">6109</span>        LOG.info("Waiting for 5 seconds before releasing lock");<a name="line.6109"></a>
+<span class="sourceLineNo">6110</span>        Threads.sleep(5000);<a name="line.6110"></a>
+<span class="sourceLineNo">6111</span>        LOG.info("Releasing row lock");<a name="line.6111"></a>
+<span class="sourceLineNo">6112</span>        rl.release();<a name="line.6112"></a>
+<span class="sourceLineNo">6113</span>        return null;<a name="line.6113"></a>
+<span class="sourceLineNo">6114</span>      }<a name="line.6114"></a>
+<span class="sourceLineNo">6115</span>    });<a name="line.6115"></a>
+<span class="sourceLineNo">6116</span>    obtainedRowLock.await(30, TimeUnit.SECONDS);<a name="line.6116"></a>
+<span class="sourceLineNo">6117</span><a name="line.6117"></a>
+<span class="sourceLineNo">6118</span>    Future&lt;Void&gt; f2 = exec.submit(new Callable&lt;Void&gt;() {<a name="line.6118"></a>
+<span class="sourceLineNo">6119</span>      @Override<a name="line.6119"></a>
+<span class="sourceLineNo">6120</span>      public Void call() throws Exception {<a name="line.6120"></a>
+<span class="sourceLineNo">6121</span>        Mutation[] mutations = new Mutation[] {<a name="line.6121"></a>
+<span class="sourceLineNo">6122</span>            new Put(a).add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6122"></a>
+<span class="sourceLineNo">6123</span>                .setRow(a)<a name="line.6123"></a>
+<span class="sourceLineNo">6124</span>                .setFamily(fam1)<a name="line.6124"></a>
+<span class="sourceLineNo">6125</span>                .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6125"></a>
+<span class="sourceLineNo">6126</span>                .setType(Cell.Type.Put)<a name="line.6126"></a>
+<span class="sourceLineNo">6127</span>                .build()),<a name="line.6127"></a>
+<span class="sourceLineNo">6128</span>            new Put(b).add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6128"></a>
+<span class="sourceLineNo">6129</span>                .setRow(b)<a name="line.6129"></a>
+<span class="sourceLineNo">6130</span>                .setFamily(fam1)<a name="line.6130"></a>
+<span class="sourceLineNo">6131</span>                .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6131"></a>
+<span class="sourceLineNo">6132</span>                .setType(Cell.Type.Put)<a name="line.6132"></a>
+<span class="sourceLineNo">6133</span>                .build()),<a name="line.6133"></a>
+<span class="sourceLineNo">6134</span>        };<a name="line.6134"></a>
+<span class="sourceLineNo">6135</span><a name="line.6135"></a>
+<span class="sourceLineNo">6136</span>        // this will wait for the row lock, and it will eventually succeed<a name="line.6136"></a>
+<span class="sourceLineNo">6137</span>        OperationStatus[] status = region.batchMutate(mutations);<a name="line.6137"></a>
+<span class="sourceLineNo">6138</span>        assertEquals(OperationStatusCode.SUCCESS, status[0].getOperationStatusCode());<a name="line.6138"></a>
+<span class="sourceLineNo">6139</span>        assertEquals(OperationStatusCode.SUCCESS, status[1].getOperationStatusCode());<a name="line.6139"></a>
+<span class="sourceLineNo">6140</span>        return null;<a name="line.6140"></a>
+<span class="sourceLineNo">6141</span>      }<a name="line.6141"></a>
+<span class="sourceLineNo">6142</span>    });<a name="line.6142"></a>
+<span class="sourceLineNo">6143</span><a name="line.6143"></a>
+<span class="sourceLineNo">6144</span>    f1.get();<a name="line.6144"></a>
+<span class="sourceLineNo">6145</span>    f2.get();<a name="line.6145"></a>
+<span class="sourceLineNo">6146</span><a name="line.6146"></a>
+<span class="sourceLineNo">6147</span>    CONF.setInt("hbase.rowlock.wait.duration", prevLockTimeout);<a name="line.6147"></a>
+<span class="sourceLineNo">6148</span>  }<a name="line.6148"></a>
+<span class="sourceLineNo">6149</span><a name="line.6149"></a>
+<span class="sourceLineNo">6150</span>  @Test<a name="line.6150"></a>
+<span class="sourceLineNo">6151</span>  public void testCheckAndRowMutateTimestampsAreMonotonic() throws IOException {<a name="line.6151"></a>
+<span class="sourceLineNo">6152</span>    region = initHRegion(tableName, method, CONF, fam1);<a name="line.6152"></a>
+<span class="sourceLineNo">6153</span>    ManualEnvironmentEdge edge = new ManualEnvironmentEdge();<a name="line.6153"></a>
+<span class="sourceLineNo">6154</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.6154"></a>
+<span class="sourceLineNo">6155</span><a name="line.6155"></a>
+<span class="sourceLineNo">6156</span>    edge.setValue(10);<a name="line.6156"></a>
+<span class="sourceLineNo">6157</span>    Put p = new Put(row);<a name="line.6157"></a>
+<span class="sourceLineNo">6158</span>    p.setDurability(Durability.SKIP_WAL);<a name="line.6158"></a>
+<span class="sourceLineNo">6159</span>    p.addColumn(fam1, qual1, qual1);<a name="line.6159"></a>
+<span class="sourceLineNo">6160</span>    region.put(p);<a name="line.6160"></a>
+<span class="sourceLineNo">6161</span><a name="line.6161"></a>
+<span class="sourceLineNo">6162</span>    Result result = region.get(new Get(row));<a name="line.6162"></a>
+<span class="sourceLineNo">6163</span>    Cell c = result.getColumnLatestCell(fam1, qual1);<a name="line.6163"></a>
+<span class="sourceLineNo">6164</span>    assertNotNull(c);<a name="line.6164"></a>
+<span class="sourceLineNo">6165</span>    assertEquals(10L, c.getTimestamp());<a name="line.6165"></a>
+<span class="sourceLineNo">6166</span><a name="line.6166"></a>
+<span class="sourceLineNo">6167</span>    edge.setValue(1); // clock goes back<a name="line.6167"></a>
+<span class="sourceLineNo">6168</span>    p = new Put(row);<a name="line.6168"></a>
+<span class="sourceLineNo">6169</span>    p.setDurability(Durability.SKIP_WAL);<a name="line.6169"></a>
+<span class="sourceLineNo">6170</span>    p.addColumn(fam1, qual1, qual2);<a name="line.6170"></a>
+<span class="sourceLineNo">6171</span>    RowMutations rm = new RowMutations(row);<a name="line.6171"></a>
+<span class="sourceLineNo">6172</span>    rm.add(p);<a name="line.6172"></a>
+<span class="sourceLineNo">6173</span>    assertTrue(region.checkAndRowMutate(row, fam1, qual1, CompareOperator.EQUAL,<a name="line.6173"></a>
+<span class="sourceLineNo">6174</span>        new BinaryComparator(qual1), rm));<a name="line.6174"></a>
+<span class="sourceLineNo">6175</span>    result = region.get(new Get(row));<a name="line.6175"></a>
+<span class="sourceLineNo">6176</span>    c = result.getColumnLatestCell(fam1, qual1);<a name="line.6176"></a>
+<span class="sourceLineNo">6177</span>    assertEquals(10L, c.getTimestamp());<a name="line.6177"></a>
+<span class="sourceLineNo">6178</span>    LOG.info("c value " +<a name="line.6178"></a>
+<span class="sourceLineNo">6179</span>      Bytes.toStringBinary(c.getValueArray(), c.getValueOffset(), c.getValueLength()));<a name="line.6179"></a>
 <span class="sourceLineNo">6180</span><a name="line.6180"></a>
-<span class="sourceLineNo">6181</span>  /**<a name="line.6181"></a>
-<span class="sourceLineNo">6182</span>   * HBASE-16429 Make sure no stuck if roll writer when ring buffer is filled with appends<a name="line.6182"></a>
-<span class="sourceLineNo">6183</span>   * @throws IOException if IO error occurred during test<a name="line.6183"></a>
-<span class="sourceLineNo">6184</span>   */<a name="line.6184"></a>
-<span class="sourceLineNo">6185</span>  @Test<a name="line.6185"></a>
-<span class="sourceLineNo">6186</span>  public void testWritesWhileRollWriter() throws IOException {<a name="line.6186"></a>
-<span class="sourceLineNo">6187</span>    int testCount = 10;<a name="line.6187"></a>
-<span class="sourceLineNo">6188</span>    int numRows = 1024;<a name="line.6188"></a>
-<span class="sourceLineNo">6189</span>    int numFamilies = 2;<a name="line.6189"></a>
-<span class="sourceLineNo">6190</span>    int numQualifiers = 2;<a name="line.6190"></a>
-<span class="sourceLineNo">6191</span>    final byte[][] families = new byte[numFamilies][];<a name="line.6191"></a>
-<span class="sourceLineNo">6192</span>    for (int i = 0; i &lt; numFamilies; i++) {<a name="line.6192"></a>
-<span class="sourceLineNo">6193</span>      families[i] = Bytes.toBytes("family" + i);<a name="line.6193"></a>
-<span class="sourceLineNo">6194</span>    }<a name="line.6194"></a>
-<span class="sourceLineNo">6195</span>    final byte[][] qualifiers = new byte[numQualifiers][];<a name="line.6195"></a>
-<span class="sourceLineNo">6196</span>    for (int i = 0; i &lt; numQualifiers; i++) {<a name="line.6196"></a>
-<span class="sourceLineNo">6197</span>      qualifiers[i] = Bytes.toBytes("qual" + i);<a name="line.6197"></a>
-<span class="sourceLineNo">6198</span>    }<a name="line.6198"></a>
-<span class="sourceLineNo">6199</span><a name="line.6199"></a>
-<span class="sourceLineNo">6200</span>    CONF.setInt("hbase.regionserver.wal.disruptor.event.count", 2);<a name="line.6200"></a>
-<span class="sourceLineNo">6201</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.6201"></a>
-<span class="sourceLineNo">6202</span>    try {<a name="line.6202"></a>
-<span class="sourceLineNo">6203</span>      List&lt;Thread&gt; threads = new ArrayList&lt;&gt;();<a name="line.6203"></a>
-<span class="sourceLineNo">6204</span>      for (int i = 0; i &lt; numRows; i++) {<a name="line.6204"></a>
-<span class="sourceLineNo">6205</span>        final int count = i;<a name="line.6205"></a>
-<span class="sourceLineNo">6206</span>        Thread t = new Thread(new Runnable() {<a name="line.6206"></a>
-<span class="sourceLineNo">6207</span><a name="line.6207"></a>
-<span class="sourceLineNo">6208</span>          @Override<a name="line.6208"></a>
-<span class="sourceLineNo">6209</span>          public void run() {<a name="line.6209"></a>
-<span class="sourceLineNo">6210</span>            byte[] row = Bytes.toBytes("row" + count);<a name="line.6210"></a>
-<span class="sourceLineNo">6211</span>            Put put = new Put(row);<a name="line.6211"></a>
-<span class="sourceLineNo">6212</span>            put.setDurability(Durability.SYNC_WAL);<a name="line.6212"></a>
-<span class="sourceLineNo">6213</span>            byte[] value = Bytes.toBytes(String.valueOf(count));<a name="line.6213"></a>
-<span class="sourceLineNo">6214</span>            for (byte[] family : families) {<a name="line.6214"></a>
-<span class="sourceLineNo">6215</span>              for (byte[] qualifier : qualifiers) {<a name="line.6215"></a>
-<span class="sourceLineNo">6216</span>                put.addColumn(family, qualifier, count, value);<a name="line.6216"></a>
-<span class="sourceLineNo">6217</span>              }<a name="line.6217"></a>
-<span class="sourceLineNo">6218</span>            }<a name="line.6218"></a>
-<span class="sourceLineNo">6219</span>            try {<a name="line.6219"></a>
-<span class="sourceLineNo">6220</span>              region.put(put);<a name="line.6220"></a>
-<span class="sourceLineNo">6221</span>            } catch (IOException e) {<a name="line.6221"></a>
-<span class="sourceLineNo">6222</span>              throw new RuntimeException(e);<a name="line.6222"></a>
-<span class="sourceLineNo">6223</span>            }<a name="line.6223"></a>
-<span class="sourceLineNo">6224</span>          }<a name="line.6224"></a>
-<span class="sourceLineNo">6225</span>        });<a name="line.6225"></a>
-<span class="sourceLineNo">6226</span>        threads.add(t);<a name="line.6226"></a>
-<span class="sourceLineNo">6227</span>      }<a name="line.6227"></a>
-<span class="sourceLineNo">6228</span>      for (Thread t : threads) {<a name="line.6228"></a>
-<span class="sourceLineNo">6229</span>        t.start();<a name="line.6229"></a>
-<span class="sourceLineNo">6230</span>      }<a name="line.6230"></a>
-<span class="sourceLineNo">6231</span><a name="line.6231"></a>
-<span class="sourceLineNo">6232</span>      for (int i = 0; i &lt; testCount; i++) {<a name="line.6232"></a>
-<span class="sourceLineNo">6233</span>        region.getWAL().rollWriter();<a name="line.6233"></a>
-<span class="sourceLineNo">6234</span>        Thread.yield();<a name="line.6234"></a>
-<span class="sourceLineNo">6235</span>      }<a name="line.6235"></a>
-<span class="sourceLineNo">6236</span>    } finally {<a name="line.6236"></a>
-<span class="sourceLineNo">6237</span>      try {<a name="line.6237"></a>
-<span class="sourceLineNo">6238</span>        HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.6238"></a>
-<span class="sourceLineNo">6239</span>        CONF.setInt("hbase.regionserver.wal.disruptor.event.count", 16 * 1024);<a name="line.6239"></a>
-<span class="sourceLineNo">6240</span>      } catch (DroppedSnapshotException dse) {<a name="line.6240"></a>
-<span class="sourceLineNo">6241</span>        // We could get this on way out because we interrupt the background flusher and it could<a name="line.6241"></a>
-<span class="sourceLineNo">6242</span>        // fail anywhere causing a DSE over in the background flusher... only it is not properly<a name="line.6242"></a>
-<span class="sourceLineNo">6243</span>        // dealt with so could still be memory hanging out when we get to here -- memory we can't<a name="line.6243"></a>
-<span class="sourceLineNo">6244</span>        // flush because the accounting is 'off' since original DSE.<a name="line.6244"></a>
+<span class="sourceLineNo">6181</span>    assertTrue(Bytes.equals(c.getValueArray(), c.getValueOffset(), c.getValueLength(),<a name="line.6181"></a>
+<span class="sourceLineNo">6182</span>      qual2, 0, qual2.length));<a name="line.6182"></a>
+<span class="sourceLineNo">6183</span>  }<a name="line.6183"></a>
+<span class="sourceLineNo">6184</span><a name="line.6184"></a>
+<span class="sourceLineNo">6185</span>  HRegion initHRegion(TableName tableName, String callingMethod,<a name="line.6185"></a>
+<span class="sourceLineNo">6186</span>      byte[]... families) throws IOException {<a name="line.6186"></a>
+<span class="sourceLineNo">6187</span>    return initHRegion(tableName, callingMethod, HBaseConfiguration.create(),<a name="line.6187"></a>
+<span class="sourceLineNo">6188</span>        families);<a name="line.6188"></a>
+<span class="sourceLineNo">6189</span>  }<a name="line.6189"></a>
+<span class="sourceLineNo">6190</span><a name="line.6190"></a>
+<span class="sourceLineNo">6191</span>  /**<a name="line.6191"></a>
+<span class="sourceLineNo">6192</span>   * HBASE-16429 Make sure no stuck if roll writer when ring buffer is filled with appends<a name="line.6192"></a>
+<span class="sourceLineNo">6193</span>   * @throws IOException if IO error occurred during test<a name="line.6193"></a>
+<span class="sourceLineNo">6194</span>   */<a name="line.6194"></a>
+<span class="sourceLineNo">6195</span>  @Test<a name="line.6195"></a>
+<span class="sourceLineNo">6196</span>  public void testWritesWhileRollWriter() throws IOException {<a name="line.6196"></a>
+<span class="sourceLineNo">6197</span>    int testCount = 10;<a name="line.6197"></a>
+<span class="sourceLineNo">6198</span>    int numRows = 1024;<a name="line.6198"></a>
+<span class="sourceLineNo">6199</span>    int numFamilies = 2;<a name="line.6199"></a>
+<span class="sourceLineNo">6200</span>    int numQualifiers = 2;<a name="line.6200"></a>
+<span class="sourceLineNo">6201</span>    final byte[][] families = new byte[numFamilies][];<a name="line.6201"></a>
+<span class="sourceLineNo">6202</span>    for (int i = 0; i &lt; numFamilies; i++) {<a name="line.6202"></a>
+<span class="sourceLineNo">6203</span>      families[i] = Bytes.toBytes("family" + i);<a name="line.6203"></a>
+<span class="sourceLineNo">6204</span>    }<a name="line.6204"></a>
+<span class="sourceLineNo">6205</span>    final byte[][] qualifiers = new byte[numQualifiers][];<a name="line.6205"></a>
+<span class="sourceLineNo">6206</span>    for (int i = 0; i &lt; numQualifiers; i++) {<a name="line.6206"></a>
+<span class="sourceLineNo">6207</span>      qualifiers[i] = Bytes.toBytes("qual" + i);<a name="line.6207"></a>
+<span class="sourceLineNo">6208</span>    }<a name="line.6208"></a>
+<span class="sourceLineNo">6209</span><a name="line.6209"></a>
+<span class="sourceLineNo">6210</span>    CONF.setInt("hbase.regionserver.wal.disruptor.event.count", 2);<a name="line.6210"></a>
+<span class="sourceLineNo">6211</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.6211"></a>
+<span class="sourceLineNo">6212</span>    try {<a name="line.6212"></a>
+<span class="sourceLineNo">6213</span>      List&lt;Thread&gt; threads = new ArrayList&lt;&gt;();<a name="line.6213"></a>
+<span class="sourceLineNo">6214</span>      for (int i = 0; i &lt; numRows; i++) {<a name="line.6214"></a>
+<span class="sourceLineNo">6215</span>        final int count = i;<a name="line.6215"></a>
+<span class="sourceLineNo">6216</span>        Thread t = new Thread(new Runnable() {<a name="line.6216"></a>
+<span class="sourceLineNo">6217</span><a name="line.6217"></a>
+<span class="sourceLineNo">6218</span>          @Override<a name="line.6218"></a>
+<span class="sourceLineNo">6219</span>          public void run() {<a name="line.6219"></a>
+<span class="sourceLineNo">6220</span>            byte[] row = Bytes.toBytes("row" + count);<a name="line.6220"></a>
+<span class="sourceLineNo">6221</span>            Put put = new Put(row);<a name="line.6221"></a>
+<span class="sourceLineNo">6222</span>            put.setDurability(Durability.SYNC_WAL);<a name="line.6222"></a>
+<span class="sourceLineNo">6223</span>            byte[] value = Bytes.toBytes(String.valueOf(count));<a name="line.6223"></a>
+<span class="sourceLineNo">6224</span>            for (byte[] family : families) {<a name="line.6224"></a>
+<span class="sourceLineNo">6225</span>              for (byte[] qualifier : qualifiers) {<a name="line.6225"></a>
+<span class="sourceLineNo">6226</span>                put.addColumn(family, qualifier, count, value);<a name="line.6226"></a>
+<span class="sourceLineNo">6227</span>              }<a name="line.6227"></a>
+<span class="sourceLineNo">6228</span>            }<a name="line.6228"></a>
+<span class="sourceLineNo">6229</span>            try {<a name="line.6229"></a>
+<span class="sourceLineNo">6230</span>              region.put(put);<a name="line.6230"></a>
+<span class="sourceLineNo">6231</span>            } catch (IOException e) {<a name="line.6231"></a>
+<span class="sourceLineNo">6232</span>              throw new RuntimeException(e);<a name="line.6232"></a>
+<span class="sourceLineNo">6233</span>            }<a name="line.6233"></a>
+<span class="sourceLineNo">6234</span>          }<a name="line.6234"></a>
+<span class="sourceLineNo">6235</span>        });<a name="line.6235"></a>
+<span class="sourceLineNo">6236</span>        threads.add(t);<a name="line.6236"></a>
+<span class="sourceLineNo">6237</span>      }<a name="line.6237"></a>
+<span class="sourceLineNo">6238</span>      for (Thread t : threads) {<a name="line.6238"></a>
+<span class="sourceLineNo">6239</span>        t.start();<a name="line.6239"></a>
+<span class="sourceLineNo">6240</span>      }<a name="line.6240"></a>
+<span class="sourceLineNo">6241</span><a name="line.6241"></a>
+<span class="sourceLineNo">6242</span>      for (int i = 0; i &lt; testCount; i++) {<a name="line.6242"></a>
+<span class="sourceLineNo">6243</span>        region.getWAL().rollWriter();<a name="line.6243"></a>
+<span class="sourceLineNo">6244</span>        Thread.yield();<a name="line.6244"></a>
 <span class="sourceLineNo">6245</span>      }<a name="line.6245"></a>
-<span class="sourceLineNo">6246</span>      this.region = null;<a name="line.6246"></a>
-<span class="sourceLineNo">6247</span>    }<a name="line.6247"></a>
-<span class="sourceLineNo">6248</span>  }<a name="line.6248"></a>
-<span class="sourceLineNo">6249</span><a name="line.6249"></a>
-<span class="sourceLineNo">6250</span>  @Test<a name="line.6250"></a>
-<span class="sourceLineNo">6251</span>  public void testMutateRow_WriteRequestCount() throws Exception {<a name="line.6251"></a>
-<span class="sourceLineNo">6252</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.6252"></a>
-<span class="sourceLineNo">6253</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.6253"></a>
-<span class="sourceLineNo">6254</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.6254"></a>
-<span class="sourceLineNo">6255</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.6255"></a>
-<span class="sourceLineNo">6256</span><a name="line.6256"></a>
-<span class="sourceLineNo">6257</span>    RowMutations rm = new RowMutations(row1);<a name="line.6257"></a>
-<span class="sourceLineNo">6258</span>    Put put = new Put(row1);<a name="line.6258"></a>
-<span class="sourceLineNo">6259</span>    put.addColumn(fam1, qf1, val1);<a name="line.6259"></a>
-<span class="sourceLineNo">6260</span>    rm.add(put);<a name="line.6260"></a>
-<span class="sourceLineNo">6261</span><a name="line.6261"></a>
-<span class="sourceLineNo">6262</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.6262"></a>
-<span class="sourceLineNo">6263</span>    long wrcBeforeMutate = this.region.writeRequestsCount.longValue();<a name="line.6263"></a>
-<span class="sourceLineNo">6264</span>    this.region.mutateRow(rm);<a name="line.6264"></a>
-<span class="sourceLineNo">6265</span>    long wrcAfterMutate = this.region.writeRequestsCount.longValue();<a name="line.6265"></a>
-<span class="sourceLineNo">6266</span>    Assert.assertEquals(wrcBeforeMutate + rm.getMutations().size(), wrcAfterMutate);<a name="line.6266"></a>
-<span class="sourceLineNo">6267</span>  }<a name="line.6267"></a>
-<span class="sourceLineNo">6268</span><a name="line.6268"></a>
-<span class="sourceLineNo">6269</span>  @Test<a name="line.6269"></a>
-<span class="sourceLineNo">6270</span>  public void testBulkLoadReplicationEnabled() throws IOException {<a name="line.6270"></a>
-<span class="sourceLineNo">6271</span>    TEST_UTIL.getConfiguration().setBoolean(HConstants.REPLICATION_BULKLOAD_ENABLE_KEY, true);<a name="line.6271"></a>
-<span class="sourceLineNo">6272</span>    final ServerName serverName = ServerName.valueOf(name.getMethodName(), 100, 42);<a name="line.6272"></a>
-<span class="sourceLineNo">6273</span>    final RegionServerServices rss = spy(TEST_UTIL.createMockRegionServerService(serverName));<a name="line.6273"></a>
-<span class="sourceLineNo">6274</span><a name="line.6274"></a>
-<span class="sourceLineNo">6275</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.6275"></a>
-<span class="sourceLineNo">6276</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.6276"></a>
-<span class="sourceLineNo">6277</span>    HRegionInfo hri = new HRegionInfo(htd.getTableName(),<a name="line.6277"></a>
-<span class="sourceLineNo">6278</span>        HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY);<a name="line.6278"></a>
-<span class="sourceLineNo">6279</span>    region = HRegion.openHRegion(hri, htd, rss.getWAL(hri), TEST_UTIL.getConfiguration(),<a name="line.6279"></a>
-<span class="sourceLineNo">6280</span>        rss, null);<a name="line.6280"></a>
-<span class="sourceLineNo">6281</span><a name="line.6281"></a>
-<span class="sourceLineNo">6282</span>    assertTrue(region.conf.getBoolean(HConstants.REPLICATION_BULKLOAD_ENABLE_KEY, false));<a name="line.6282"></a>
-<span class="sourceLineNo">6283</span>    String plugins = region.conf.get(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY, "");<a name="line.6283"></a>
-<span class="sourceLineNo">6284</span>    String replicationCoprocessorClass = ReplicationObserver.class.getCanonicalName();<a name="line.6284"></a>
-<span class="sourceLineNo">6285</span>    assertTrue(plugins.contains(replicationCoprocessorClass));<a name="line.6285"></a>
-<span class="sourceLineNo">6286</span>    assertTrue(region.getCoprocessorHost().<a name="line.6286"></a>
-<span class="sourceLineNo">6287</span>        getCoprocessors().contains(ReplicationObserver.class.getSimpleName()));<a name="line.6287"></a>
-<span class="sourceLineNo">6288</span>  }<a name="line.6288"></a>
-<span class="sourceLineNo">6289</span><a name="line.6289"></a>
-<span class="sourceLineNo">6290</span>  // make sure region is success close when coprocessor wrong region open failed<a name="line.6290"></a>
-<span class="sourceLineNo">6291</span>  @Test<a name="line.6291"></a>
-<span class="sourceLineNo">6292</span>  public void testOpenRegionFailedMemoryLeak() throws Exception {<a name="line.6292"></a>
-<span class="sourceLineNo">6293</span>    final ServerName serverName = ServerName.valueOf("testOpenRegionFailed", 100, 42);<a name="line.6293"></a>
-<span class="sourceLineNo">6294</span>    final RegionServerServices rss = spy(TEST_UTIL.createMockRegionServerService(serverName));<a name="line.6294"></a>
-<span class="sourceLineNo">6295</span><a name="line.6295"></a>
-<span class="sourceLineNo">6296</span>    HTableDescriptor htd<a name="line.6296"></a>
-<span class="sourceLineNo">6297</span>      = new HTableDescriptor(TableName.valueOf("testOpenRegionFailed"));<a name="line.6297"></a>
-<span class="sourceLineNo">6298</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.6298"></a>
-<span class="sourceLineNo">6299</span>    htd.setValue("COPROCESSOR$1", "hdfs://test/test.jar|test||");<a name="line.6299"></a>
-<span class="sourceLineNo">6300</span><a name="line.6300"></a>
-<span class="sourceLineNo">6301</span>    HRegionInfo hri = new HRegionInfo(htd.getTableName(),<a name="line.6301"></a>
-<span class="sourceLineNo">6302</span>      HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY);<a name="line.6302"></a>
-<span class="sourceLineNo">6303</span>    ScheduledExecutorService executor = CompatibilitySingletonFactory.<a name="line.6303"></a>
-<span class="sourceLineNo">6304</span>      getInstance(MetricsExecutor.class).getExecutor();<a name="line.6304"></a>
-<span class="sourceLineNo">6305</span>    for (int i = 0; i &lt; 20 ; i++) {<a name="line.6305"></a>
-<span class="sourceLineNo">6306</span>      try {<a name="line.6306"></a>
-<span class="sourceLineNo">6307</span>        HRegion.openHRegion(hri, htd, rss.getWAL(hri),<a name="line.6307"></a>
-<span class="sourceLineNo">6308</span>          TEST_UTIL.getConfiguration(), rss, null);<a name="line.6308"></a>
-<span class="sourceLineNo">6309</span>      }catch(Throwable t){<a name="line.6309"></a>
-<span class="sourceLineNo">6310</span>        LOG.info("Expected exception, continue");<a name="line.6310"></a>
-<span class="sourceLineNo">6311</span>      }<a name="line.6311"></a>
-<span class="sourceLineNo">6312</span>    }<a name="line.6312"></a>
-<span class="sourceLineNo">6313</span>    TimeUnit.SECONDS.sleep(MetricsRegionWrapperImpl.PERIOD);<a name="line.6313"></a>
-<span class="sourceLineNo">6314</span>    Field[] fields = ThreadPoolExecutor.class.getDeclaredFields();<a name="line.6314"></a>
-<span class="sourceLineNo">6315</span>    boolean found = false;<a name="line.6315"></a>
-<span class="sourceLineNo">6316</span>    for(Field field : fields){<a name="line.6316"></a>
-<span class="sourceLineNo">6317</span>      if(field.getName().equals("workQueue")){<a name="line.6317"></a>
-<span class="sourceLineNo">6318</span>        field.setAccessible(true);<a name="line.6318"></a>
-<span class="sourceLineNo">6319</span>        BlockingQueue&lt;Runnable&gt; workQueue = (BlockingQueue&lt;Runnable&gt;)field.get(executor);<a name="line.6319"></a>
-<span class="sourceLineNo">6320</span>        //there are still two task not cancel, can not cause to memory lack<a name="line.6320"></a>
-<span class="sourceLineNo">6321</span>        Assert.assertTrue("ScheduledExecutor#workQueue should equals 2, now is " +<a name="line.6321"></a>
-<span class="sourceLineNo">6322</span>          workQueue.size() + ", please check region is close", 2 == workQueue.size());<a name="line.6322"></a>
-<span class="sourceLineNo">6323</span>        found = true;<a name="line.6323"></a>
-<span class="sourceLineNo">6324</span>      }<a name="line.6324"></a>
-<span class="sourceLineNo">6325</span>    }<a name="line.6325"></a>
-<span class="sourceLineNo">6326</span>    Assert.assertTrue("can not find workQueue, test failed", found);<a name="line.6326"></a>
-<span class="sourceLineNo">6327</span>  }<a name="line.6327"></a>
-<span class="sourceLineNo">6328</span><a name="line.6328"></a>
-<span class="sourceLineNo">6329</span>  /**<a name="line.6329"></a>
-<span class="sourceLineNo">6330</span>   * The same as HRegion class, the only difference is that instantiateHStore will<a name="line.6330"></a>
-<span class="sourceLineNo">6331</span>   * create a different HStore - HStoreForTesting. [HBASE-8518]<a name="line.6331"></a>
-<span class="sourceLineNo">6332</span>   */<a name="line.6332"></a>
-<span class="sourceLineNo">6333</span>  public static class HRegionForTesting extends HRegion {<a name="line.6333"></a>
-<span class="sourceLineNo">6334</span><a name="line.6334"></a>
-<span class="sourceLineNo">6335</span>    public HRegionForTesting(final Path tableDir, final WAL wal, final FileSystem fs,<a name="line.6335"></a>
-<span class="sourceLineNo">6336</span>                             final Configuration confParam, final RegionInfo regionInfo,<a name="line.6336"></a>
-<span class="sourceLineNo">6337</span>                             final TableDescriptor htd, final RegionServerServices rsServices) {<a name="line.6337"></a>
-<span class="sourceLineNo">6338</span>      this(new HRegionFileSystem(confParam, fs, tableDir, regionInfo),<a name="line.6338"></a>
-<span class="sourceLineNo">6339</span>          wal, confParam, htd, rsServices);<a name="line.6339"></a>
-<span class="sourceLineNo">6340</span>    }<a name="line.6340"></a>
-<span class="sourceLineNo">6341</span><a name="line.6341"></a>
-<span class="sourceLineNo">6342</span>    public HRegionForTesting(HRegionFileSystem fs, WAL wal,<a name="line.6342"></a>
-<span class="sourceLineNo">6343</span>                             Configuration confParam, TableDescriptor htd,<a name="line.6343"></a>
-<span class="sourceLineNo">6344</span>                             RegionServerServices rsServices) {<a name="line.6344"></a>
-<span class="sourceLineNo">6345</span>      super(fs, wal, confParam, htd, rsServices);<a name="line.6345"></a>
-<span class="sourceLineNo">6346</span>    }<a name="line.6346"></a>
-<span class="sourceLineNo">6347</span><a name="line.6347"></a>
-<span class="sourceLineNo">6348</span>    /**<a name="line.6348"></a>
-<span class="sourceLineNo">6349</span>     * Create HStore instance.<a name="line.6349"></a>
-<span class="sourceLineNo">6350</span>     * @return If Mob is enabled, return HMobStore, otherwise return HStoreForTesting.<a name="line.6350"></a>
-<span class="sourceLineNo">6351</span>     */<a name="line.6351"></a>
-<span class="sourceLineNo">6352</span>    @Override<a name="line.6352"></a>
-<span class="sourceLineNo">6353</span>    protected HStore instantiateHStore(final ColumnFamilyDescriptor family, boolean warmup)<a name="line.6353"></a>
-<span class="sourceLineNo">6354</span>        throws IOException {<a name="line.6354"></a>
-<span class="sourceLineNo">6355</span>      if (family.isMobEnabled()) {<a name="line.6355"></a>
-<span class="sourceLineNo">6356</span>        if (HFile.getFormatVersion(this.conf) &lt; HFile.MIN_FORMAT_VERSION_WITH_TAGS) {<a name="line.6356"></a>
-<span class="sourceLineNo">6357</span>          throw new IOException("A minimum HFile version of " + HFile.MIN_FORMAT_VERSION_WITH_TAGS +<a name="line.6357"></a>
-<span class="sourceLineNo">6358</span>              " is required for MOB feature. Consider setting " + HFile.FORMAT_VERSION_KEY +<a name="line.6358"></a>
-<span class="sourceLineNo">6359</span>              " accordingly.");<a name="line.6359"></a>
-<span class="sourceLineNo">6360</span>        }<a name="line.6360"></a>
-<span class="sourceLineNo">6361</span>        return new HMobStore(this, family, this.conf, warmup);<a name="line.6361"></a>
-<span class="sourceLineNo">6362</span>      }<a name="line.6362"></a>
-<span class="sourceLineNo">6363</span>      return new HStoreForTesting(this, family, this.conf, warmup);<a name="line.6363"></a>
-<span class="sourceLineNo">6364</span>    }<a name="line.6364"></a>
-<span class="sourceLineNo">6365</span>  }<a name="line.6365"></a>
-<span class="sourceLineNo">6366</span><a name="line.6366"></a>
-<span class="sourceLineNo">6367</span>  /**<a name="line.6367"></a>
-<span class="sourceLineNo">6368</span>   * HStoreForTesting is merely the same as HStore, the difference is in the doCompaction method<a name="line.6368"></a>
-<span class="sourceLineNo">6369</span>   * of HStoreForTesting there is a checkpoint "hbase.hstore.compaction.complete" which<a name="line.6369"></a>
-<span class="sourceLineNo">6370</span>   * doesn't let hstore compaction complete. In the former edition, this config is set in<a name="line.6370"></a>
-<span class="sourceLineNo">6371</span>   * HStore class inside compact method, though this is just for testing, otherwise it<a name="line.6371"></a>
-<span class="sourceLineNo">6372</span>   * doesn't do any help. In HBASE-8518, we try to get rid of all "hbase.hstore.compaction.complete"<a name="line.6372"></a>
-<span class="sourceLineNo">6373</span>   * config (except for testing code).<a name="line.6373"></a>
-<span class="sourceLineNo">6374</span>   */<a name="line.6374"></a>
-<span class="sourceLineNo">6375</span>  public static class HStoreForTesting extends HStore {<a name="line.6375"></a>
+<span class="sourceLineNo">6246</span>    } finally {<a name="line.6246"></a>
+<span class="sourceLineNo">6247</span>      try {<a name="line.6247"></a>
+<span class="sourceLineNo">6248</span>        HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.6248"></a>
+<span class="sourceLineNo">6249</span>        CONF.setInt("hbase.regionserver.wal.disruptor.event.count", 16 * 1024);<a name="line.6249"></a>
+<span class="sourceLineNo">6250</span>      } catch (DroppedSnapshotException dse) {<a name="line.6250"></a>
+<span class="sourceLineNo">6251</span>        // We could get this on way out because we interrupt the background flusher and it could<a name="line.6251"></a>
+<span class="sourceLineNo">6252</span>        // fail anywhere causing a DSE over in the background flusher... only it is not properly<a name="line.6252"></a>
+<span class="sourceLineNo">6253</span>        // dealt with so could still be memory hanging out when we get to here -- memory we can't<a name="line.6253"></a>
+<span class="sourceLineNo">6254</span>        // flush because the accounting is 'off' since original DSE.<a name="line.6254"></a>
+<span class="sourceLineNo">6255</span>      }<a name="line.6255"></a>
+<span class="sourceLineNo">6256</span>      this.region = null;<a name="line.6256"></a>
+<span class="sourceLineNo">6257</span>    }<a name="line.6257"></a>
+<span class="sourceLineNo">6258</span>  }<a name="line.6258"></a>
+<span class="sourceLineNo">6259</span><a name="line.6259"></a>
+<span class="sourceLineNo">6260</span>  @Test<a name="line.6260"></a>
+<span class="sourceLineNo">6261</span>  public void testMutateRow_WriteRequestCount() throws Exception {<a name="line.6261"></a>
+<span class="sourceLineNo">6262</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.6262"></a>
+<span class="sourceLineNo">6263</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.6263"></a>
+<span class="sourceLineNo">6264</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.6264"></a>
+<span class="sourceLineNo">6265</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.6265"></a>
+<span class="sourceLineNo">6266</span><a name="line.6266"></a>
+<span class="sourceLineNo">6267</span>    RowMutations rm = new RowMutations(row1);<a name="line.6267"></a>
+<span class="sourceLineNo">6268</span>    Put put = new Put(row1);<a name="line.6268"></a>
+<span class="sourceLineNo">6269</span>    put.addColumn(fam1, qf1, val1);<a name="line.6269"></a>
+<span class="sourceLineNo">6270</span>    rm.add(put);<a name="line.6270"></a>
+<span class="sourceLineNo">6271</span><a name="line.6271"></a>
+<span class="sourceLineNo">6272</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.6272"></a>
+<span class="sourceLineNo">6273</span>    long wrcBeforeMutate = this.region.writeRequestsCount.longValue();<a name="line.6273"></a>
+<span class="sourceLineNo">6274</span>    this.region.mutateRow(rm);<a name="line.6274"></a>
+<span class="sourceLineNo">6275</span>    long wrcAfterMutate = this.region.writeRequestsCount.longValue();<a name="line.6275"></a>
+<span class="sourceLineNo">6276</span>    Assert.assertEquals(wrcBeforeMutate + rm.getMutations().size(), wrcAfterMutate);<a name="line.6276"></a>
+<span class="sourceLineNo">6277</span>  }<a name="line.6277"></a>
+<span class="sourceLineNo">6278</span><a name="line.6278"></a>
+<span class="sourceLineNo">6279</span>  @Test<a name="line.6279"></a>
+<span class="sourceLineNo">6280</span>  public void testBulkLoadReplicationEnabled() throws IOException {<a name="line.6280"></a>
+<span class="sourceLineNo">6281</span>    TEST_UTIL.getConfiguration().setBoolean(HConstants.REPLICATION_BULKLOAD_ENABLE_KEY, true);<a name="line.6281"></a>
+<span class="sourceLineNo">6282</span>    final ServerName serverName = ServerName.valueOf(name.getMethodName(), 100, 42);<a name="line.6282"></a>
+<span class="sourceLineNo">6283</span>    final RegionServerServices rss = spy(TEST_UTIL.createMockRegionServerService(serverName));<a name="line.6283"></a>
+<span class="sourceLineNo">6284</span><a name="line.6284"></a>
+<span class="sourceLineNo">6285</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.6285"></a>
+<span class="sourceLineNo">6286</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.6286"></a>
+<span class="sourceLineNo">6287</span>    HRegionInfo hri = new HRegionInfo(htd.getTableName(),<a name="line.6287"></a>
+<span class="sourceLineNo">6288</span>        HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY);<a name="line.6288"></a>
+<span class="sourceLineNo">6289</span>    region = HRegion.openHRegion(hri, htd, rss.getWAL(hri), TEST_UTIL.getConfiguration(),<a name="line.6289"></a>
+<span class="sourceLineNo">6290</span>        rss, null);<a name="line.6290"></a>
+<span class="sourceLineNo">6291</span><a name="line.6291"></a>
+<span class="sourceLineNo">6292</span>    assertTrue(region.conf.getBoolean(HConstants.REPLICATION_BULKLOAD_ENABLE_KEY, false));<a name="line.6292"></a>
+<span class="sourceLineNo">6293</span>    String plugins = region.conf.get(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY, "");<a name="line.6293"></a>
+<span class="sourceLineNo">6294</span>    String replicationCoprocessorClass = ReplicationObserver.class.getCanonicalName();<a name="line.6294"></a>
+<span class="sourceLineNo">6295</span>    assertTrue(plugins.contains(replicationCoprocessorClass));<a name="line.6295"></a>
+<span class="sourceLineNo">6296</span>    assertTrue(region.getCoprocessorHost().<a name="line.6296"></a>
+<span class="sourceLineNo">6297</span>        getCoprocessors().contains(ReplicationObserver.class.getSimpleName()));<a name="line.6297"></a>
+<span class="sourceLineNo">6298</span>  }<a name="line.6298"></a>
+<span class="sourceLineNo">6299</span><a name="line.6299"></a>
+<span class="sourceLineNo">6300</span>  // make sure region is success close when coprocessor wrong region open failed<a name="line.6300"></a>
+<span class="sourceLineNo">6301</span>  @Test<a name="line.6301"></a>
+<span class="sourceLineNo">6302</span>  public void testOpenRegionFailedMemoryLeak() throws Exception {<a name="line.6302"></a>
+<span class="sourceLineNo">6303</span>    final ServerName serverName = ServerName.valueOf("testOpenRegionFailed", 100, 42);<a name="line.6303"></a>
+<span class="sourceLineNo">6304</span>    final RegionServerServices rss = spy(TEST_UTIL.createMockRegionServerService(serverName));<a name="line.6304"></a>
+<span class="sourceLineNo">6305</span><a name="line.6305"></a>
+<span class="sourceLineNo">6306</span>    HTableDescriptor htd<a name="line.6306"></a>
+<span class="sourceLineNo">6307</span>      = new HTableDescriptor(TableName.valueOf("testOpenRegionFailed"));<a name="line.6307"></a>
+<span class="sourceLineNo">6308</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.6308"></a>
+<span class="sourceLineNo">6309</span>    htd.setValue("COPROCESSOR$1", "hdfs://test/test.jar|test||");<a name="line.6309"></a>
+<span class="sourceLineNo">6310</span><a name="line.6310"></a>
+<span class="sourceLineNo">6311</span>    HRegionInfo hri = new HRegionInfo(htd.getTableName(),<a name="line.6311"></a>
+<span class="sourceLineNo">6312</span>      HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY);<a name="line.6312"></a>
+<span class="sourceLineNo">6313</span>    ScheduledExecutorService executor = CompatibilitySingletonFactory.<a name="line.6313"></a>
+<span class="sourceLineNo">6314</span>      getInstance(MetricsExecutor.class).getExecutor();<a name="line.6314"></a>
+<span class="sourceLineNo">6315</span>    for (int i = 0; i &lt; 20 ; i++) {<a name="line.6315"></a>
+<span class="sourceLineNo">6316</span>      try {<a name="line.6316"></a>
+<span class="sourceLineNo">6317</span>        HRegion.openHRegion(hri, htd, rss.getWAL(hri),<a name="line.6317"></a>
+<span class="sourceLineNo">6318</span>          TEST_UTIL.getConfiguration(), rss, null);<a name="line.6318"></a>
+<span class="sourceLineNo">6319</span>      }catch(Throwable t){<a name="line.6319"></a>
+<span class="sourceLineNo">6320</span>        LOG.info("Expected exception, continue");<a name="line.6320"></a>
+<span class="sourceLineNo">6321</span>      }<a name="line.6321"></a>
+<span class="sourceLineNo">6322</span>    }<a name="line.6322"></a>
+<span class="sourceLineNo">6323</span>    TimeUnit.SECONDS.sleep(MetricsRegionWrapperImpl.PERIOD);<a name="line.6323"></a>
+<span class="sourceLineNo">6324</span>    Field[] fields = ThreadPoolExecutor.class.getDeclaredFields();<a name="line.6324"></a>
+<span class="sourceLineNo">6325</span>    boolean found = false;<a name="line.6325"></a>
+<span class="sourceLineNo">6326</span>    for(Field field : fields){<a name="line.6326"></a>
+<span class="sourceLineNo">6327</span>      if(field.getName().equals("workQueue")){<a name="line.6327"></a>
+<span class="sourceLineNo">6328</span>        field.setAccessible(true);<a name="line.6328"></a>
+<span class="sourceLineNo">6329</span>        BlockingQueue&lt;Runnable&gt; workQueue = (BlockingQueue&lt;Runnable&gt;)field.get(executor);<a name="line.6329"></a>
+<span class="sourceLineNo">6330</span>        //there are still two task not cancel, can not cause to memory lack<a name="line.6330"></a>
+<span class="sourceLineNo">6331</span>        Assert.assertTrue("ScheduledExecutor#workQueue should equals 2, now is " +<a name="line.6331"></a>
+<span class="sourceLineNo">6332</span>          workQueue.size() + ", please check region is close", 2 == workQueue.size());<a name="line.6332"></a>
+<span class="sourceLineNo">6333</span>        found = true;<a name="line.6333"></a>
+<span class="sourceLineNo">6334</span>      }<a name="line.6334"></a>
+<span class="sourceLineNo">6335</span>    }<a name="line.6335"></a>
+<span class="sourceLineNo">6336</span>    Assert.assertTrue("can not find workQueue, test failed", found);<a name="line.6336"></a>
+<span class="sourceLineNo">6337</span>  }<a name="line.6337"></a>
+<span class="sourceLineNo">6338</span><a name="line.6338"></a>
+<span class="sourceLineNo">6339</span>  /**<a name="line.6339"></a>
+<span class="sourceLineNo">6340</span>   * The same as HRegion class, the only difference is that instantiateHStore will<a name="line.6340"></a>
+<span class="sourceLineNo">6341</span>   * create a different HStore - HStoreForTesting. [HBASE-8518]<a name="line.6341"></a>
+<span class="sourceLineNo">6342</span>   */<a name="line.6342"></a>
+<span class="sourceLineNo">6343</span>  public static class HRegionForTesting extends HRegion {<a name="line.6343"></a>
+<span class="sourceLineNo">6344</span><a name="line.6344"></a>
+<span class="sourceLineNo">6345</span>    public HRegionForTesting(final Path tableDir, final WAL wal, final FileSystem fs,<a name="line.6345"></a>
+<span class="sourceLineNo">6346</span>                             final Configuration confParam, final RegionInfo regionInfo,<a name="line.6346"></a>
+<span class="sourceLineNo">6347</span>                             final TableDescriptor htd, final RegionServerServices rsServices) {<a name="line.6347"></a>
+<span class="sourceLineNo">6348</span>      this(new HRegionFileSystem(confParam, fs, tableDir, regionInfo),<a name="line.6348"></a>
+<span class="sourceLineNo">6349</span>          wal, confParam, htd, rsServices);<a name="line.6349"></a>
+<span class="sourceLineNo">6350</span>    }<a name="line.6350"></a>
+<span class="sourceLineNo">6351</span><a name="line.6351"></a>
+<span class="sourceLineNo">6352</span>    public HRegionForTesting(HRegionFileSystem fs, WAL wal,<a name="line.6352"></a>
+<span class="sourceLineNo">6353</span>                             Configuration confParam, TableDescriptor htd,<a name="line.6353"></a>
+<span class="sourceLineNo">6354</span>                             RegionServerServices rsServices) {<a name="line.6354"></a>
+<span class="sourceLineNo">6355</span>      super(fs, wal, confParam, htd, rsServices);<a name="line.6355"></a>
+<span class="sourceLineNo">6356</span>    }<a name="line.6356"></a>
+<span class="sourceLineNo">6357</span><a name="line.6357"></a>
+<span class="sourceLineNo">6358</span>    /**<a name="line.6358"></a>
+<span class="sourceLineNo">6359</span>     * Create HStore instance.<a name="line.6359"></a>
+<span class="sourceLineNo">6360</span>     * @return If Mob is enabled, return HMobStore, otherwise return HStoreForTesting.<a name="line.6360"></a>
+<span class="sourceLineNo">6361</span>     */<a name="line.6361"></a>
+<span class="sourceLineNo">6362</span>    @Override<a name="line.6362"></a>
+<span class="sourceLineNo">6363</span>    protected HStore instantiateHStore(final ColumnFamilyDescriptor family, boolean warmup)<a name="line.6363"></a>
+<span class="sourceLineNo">6364</span>        throws IOException {<a name="line.6364"></a>
+<span class="sourceLineNo">6365</span>      if (family.isMobEnabled()) {<a name="line.6365"></a>
+<span class="sourceLineNo">6366</span>        if (HFile.getFormatVersion(this.conf) &lt; HFile.MIN_FORMAT_VERSION_WITH_TAGS) {<a name="line.6366"></a>
+<span class="sourceLineNo">6367</span>          throw new IOException("A minimum HFile version of " + HFile.MIN_FORMAT_VERSION_WITH_TAGS +<a name="line.6367"></a>
+<span class="sourceLineNo">6368</span>              " is required for MOB feature. Consider setting " + HFile.FORMAT_VERSION_KEY +<a name="line.6368"></a>
+<span class="sourceLineNo">6369</span>              " accordingly.");<a name="line.6369"></a>
+<span class="sourceLineNo">6370</span>        }<a name="line.6370"></a>
+<span class="sourceLineNo">6371</span>        return new HMobStore(this, family, this.conf, warmup);<a name="line.6371"></a>
+<span class="sourceLineNo">6372</span>      }<a name="line.6372"></a>
+<span class="sourceLineNo">6373</span>      return new HStoreForTesting(this, family, this.conf, warmup);<a name="line.6373"></a>
+<span class="sourceLineNo">6374</span>    }<a name="line.6374"></a>
+<span class="sourceLineNo">6375</span>  }<a name="line.6375"></a>
 <span class="sourceLineNo">6376</span><a name="line.6376"></a>
-<span class="sourceLineNo">6377</span>    protected HStoreForTesting(final HRegion region,<a name="line.6377"></a>
-<span class="sourceLineNo">6378</span>        final ColumnFamilyDescriptor family,<a name="line.6378"></a>
-<span class="sourceLineNo">6379</span>        final Configuration confParam, boolean warmup) throws IOException {<a name="line.6379"></a>
-<span class="sourceLineNo">6380</span>      super(region, family, confParam, warmup);<a name="line.6380"></a>
-<span class="sourceLineNo">6381</span>    }<a name="line.6381"></a>
-<span class="sourceLineNo">6382</span><a name="line.6382"></a>
-<span class="sourceLineNo">6383</span>    @Override<a name="line.6383"></a>
-<span class="sourceLineNo">6384</span>    protected List&lt;HStoreFile&gt; doCompaction(CompactionRequestImpl cr,<a name="line.6384"></a>
-<span class="sourceLineNo">6385</span>        Collection&lt;HStoreFile&gt; filesToCompact, User user, long compactionStartTime,<a name="line.6385"></a>
-<span class="sourceLineNo">6386</span>        List&lt;Path&gt; newFiles) throws IOException {<a name="line.6386"></a>
-<span class="sourceLineNo">6387</span>      // let compaction incomplete.<a name="line.6387"></a>
-<span class="sourceLineNo">6388</span>      if (!this.conf.getBoolean("hbase.hstore.compaction.complete", true)) {<a name="line.6388"></a>
-<span class="sourceLineNo">6389</span>        LOG.warn("hbase.hstore.compaction.complete is set to false");<a name="line.6389"></a>
-<span class="sourceLineNo">6390</span>        List&lt;HStoreFile&gt; sfs = new ArrayList&lt;&gt;(newFiles.size());<a name="line.6390"></a>
-<span class="sourceLineNo">6391</span>        final boolean evictOnClose =<a name="line.6391"></a>
-<span class="sourceLineNo">6392</span>            cacheConf != null? cacheConf.shouldEvictOnClose(): true;<a name="line.6392"></a>
-<span class="sourceLineNo">6393</span>        for (Path newFile : newFiles) {<a name="line.6393"></a>
-<span class="sourceLineNo">6394</span>          // Create storefile around what we wrote with a reader on it.<a name="line.6394"></a>
-<span class="sourceLineNo">6395</span>          HStoreFile sf = createStoreFileAndReader(newFile);<a name="line.6395"></a>
-<span class="sourceLineNo">6396</span>          sf.closeStoreFile(evictOnClose);<a name="line.6396"></a>
-<span class="sourceLineNo">6397</span>          sfs.add(sf);<a name="line.6397"></a>
-<span class="sourceLineNo">6398</span>        }<a name="line.6398"></a>
-<span class="sourceLineNo">6399</span>        return sfs;<a name="line.6399"></a>
-<span class="sourceLineNo">6400</span>      }<a name="line.6400"></a>
-<span class="sourceLineNo">6401</span>      return super.doCompaction(cr, filesToCompact, user, compactionStartTime, newFiles);<a name="line.6401"></a>
-<span class="sourceLineNo">6402</span>    }<a name="line.6402"></a>
-<span class="sourceLineNo">6403</span>  }<a name="line.6403"></a>
-<span class="sourceLineNo">6404</span>}<a name="line.6404"></a>
+<span class="sourceLineNo">6377</span>  /**<a name="line.6377"></a>
+<span class="sourceLineNo">6378</span>   * HStoreForTesting is merely the same as HStore, the difference is in the doCompaction method<a name="line.6378"></a>
+<span class="sourceLineNo">6379</span>   * of HStoreForTesting there is a checkpoint "hbase.hstore.compaction.complete" which<a name="line.6379"></a>
+<span class="sourceLineNo">6380</span>   * doesn't let hstore compaction complete. In the former edition, this config is set in<a name="line.6380"></a>
+<span class="sourceLineNo">6381</span>   * HStore class inside compact method, though this is just for testing, otherwise it<a name="line.6381"></a>
+<span class="sourceLineNo">6382</span>   * doesn't do any help. In HBASE-8518, we try to get rid of all "hbase.hstore.compaction.complete"<a name="line.6382"></a>
+<span class="sourceLineNo">6383</span>   * config (except for testing code).<a name="line.6383"></a>
+<span class="sourceLineNo">6384</span>   */<a name="line.6384"></a>
+<span class="sourceLineNo">6385</span>  public static class HStoreForTesting extends HStore {<a name="line.6385"></a>
+<span class="sourceLineNo">6386</span><a name="line.6386"></a>
+<span class="sourceLineNo">6387</span>    protected HStoreForTesting(final HRegion region,<a name="line.6387"></a>
+<span class="sourceLineNo">6388</span>        final ColumnFamilyDescriptor family,<a name="line.6388"></a>
+<span class="sourceLineNo">6389</span>        final Configuration confParam, boolean warmup) throws IOException {<a name="line.6389"></a>
+<span class="sourceLineNo">6390</span>      super(region, family, confParam, warmup);<a name="line.6390"></a>
+<span class="sourceLineNo">6391</span>    }<a name="line.6391"></a>
+<span class="sourceLineNo">6392</span><a name="line.6392"></a>
+<span class="sourceLineNo">6393</span>    @Override<a name="line.6393"></a>
+<span class="sourceLineNo">6394</span>    protected List&lt;HStoreFile&gt; doCompaction(CompactionRequestImpl cr,<a name="line.6394"></a>
+<span class="sourceLineNo">6395</span>        Collection&lt;HStoreFile&gt; filesToCompact, User user, long compactionStartTime,<a name="line.6395"></a>
+<span class="sourceLineNo">6396</span>        List&lt;Path&gt; newFiles) throws IOException {<a name="line.6396"></a>
+<span class="sourceLineNo">6397</span>      // let compaction incomplete.<a name="line.6397"></a>
+<span class="sourceLineNo">6398</span>      if (!this.conf.getBoolean("hbase.hstore.compaction.complete", true)) {<a name="line.6398"></a>
+<span class="sourceLineNo">6399</span>        LOG.warn("hbase.hstore.compaction.complete is set to false");<a name="line.6399"></a>
+<span class="sourceLineNo">6400</span>        List&lt;HStoreFile&gt; sfs = new ArrayList&lt;&gt;(newFiles.size());<a name="line.6400"></a>
+<span class="sourceLineNo">6401</span>        final boolean evictOnClose =<a name="line.6401"></a>
+<span class="sourceLineNo">6402</span>            cacheConf != null? cacheConf.shouldEvictOnClose(): true;<a name="line.6402"></a>
+<span class="sourceLineNo">6403</span>        for (Path newFile : newFiles) {<a name="line.6403"></a>
+<span class="sourceLineNo">6404</span>          // Create storefile around what we wrote with a reader on it.<a name="line.6404"></a>
+<span class="sourceLineNo">6405</span>          HStoreFile sf = createStoreFileAndReader(newFile);<a name="line.6405"></a>
+<span class="sourceLineNo">6406</span>          sf.closeStoreFile(evictOnClose);<a name="line.6406"></a>
+<span class="sourceLineNo">6407</span>          sfs.add(sf);<a name="line.6407"></a>
+<span class="sourceLineNo">6408</span>        }<a name="line.6408"></a>
+<span class="sourceLineNo">6409</span>        return sfs;<a name="line.6409"></a>
+<span class="sourceLineNo">6410</span>      }<a name="line.6410"></a>
+<span class="sourceLineNo">6411</span>      return super.doCompaction(cr, filesToCompact, user, compactionStartTime, newFiles);<a name="line.6411"></a>
+<span class="sourceLineNo">6412</span>    }<a name="line.6412"></a>
+<span class="sourceLineNo">6413</span>  }<a name="line.6413"></a>
+<span class="sourceLineNo">6414</span>}<a name="line.6414"></a>
 
 
 
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.HStoreForTesting.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.HStoreForTesting.html
index ddde350..77be719 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.HStoreForTesting.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.HStoreForTesting.html
@@ -112,68 +112,68 @@
 <span class="sourceLineNo">104</span>import org.apache.hadoop.hbase.Waiter;<a name="line.104"></a>
 <span class="sourceLineNo">105</span>import org.apache.hadoop.hbase.client.Append;<a name="line.105"></a>
 <span class="sourceLineNo">106</span>import org.apache.hadoop.hbase.client.ColumnFamilyDescriptor;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.apache.hadoop.hbase.client.Get;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.110"></a>
-<span class="sourceLineNo">111</span>import org.apache.hadoop.hbase.client.Mutation;<a name="line.111"></a>
-<span class="sourceLineNo">112</span>import org.apache.hadoop.hbase.client.Put;<a name="line.112"></a>
-<span class="sourceLineNo">113</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.113"></a>
-<span class="sourceLineNo">114</span>import org.apache.hadoop.hbase.client.RegionInfoBuilder;<a name="line.114"></a>
-<span class="sourceLineNo">115</span>import org.apache.hadoop.hbase.client.Result;<a name="line.115"></a>
-<span class="sourceLineNo">116</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.116"></a>
-<span class="sourceLineNo">117</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.117"></a>
-<span class="sourceLineNo">118</span>import org.apache.hadoop.hbase.client.Table;<a name="line.118"></a>
-<span class="sourceLineNo">119</span>import org.apache.hadoop.hbase.client.TableDescriptor;<a name="line.119"></a>
-<span class="sourceLineNo">120</span>import org.apache.hadoop.hbase.coprocessor.CoprocessorHost;<a name="line.120"></a>
-<span class="sourceLineNo">121</span>import org.apache.hadoop.hbase.exceptions.FailedSanityCheckException;<a name="line.121"></a>
-<span class="sourceLineNo">122</span>import org.apache.hadoop.hbase.filter.BigDecimalComparator;<a name="line.122"></a>
-<span class="sourceLineNo">123</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.123"></a>
-<span class="sourceLineNo">124</span>import org.apache.hadoop.hbase.filter.ColumnCountGetFilter;<a name="line.124"></a>
-<span class="sourceLineNo">125</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.125"></a>
-<span class="sourceLineNo">126</span>import org.apache.hadoop.hbase.filter.FilterBase;<a name="line.126"></a>
-<span class="sourceLineNo">127</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.127"></a>
-<span class="sourceLineNo">128</span>import org.apache.hadoop.hbase.filter.NullComparator;<a name="line.128"></a>
-<span class="sourceLineNo">129</span>import org.apache.hadoop.hbase.filter.PrefixFilter;<a name="line.129"></a>
-<span class="sourceLineNo">130</span>import org.apache.hadoop.hbase.filter.SingleColumnValueExcludeFilter;<a name="line.130"></a>
-<span class="sourceLineNo">131</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.131"></a>
-<span class="sourceLineNo">132</span>import org.apache.hadoop.hbase.filter.SubstringComparator;<a name="line.132"></a>
-<span class="sourceLineNo">133</span>import org.apache.hadoop.hbase.filter.ValueFilter;<a name="line.133"></a>
-<span class="sourceLineNo">134</span>import org.apache.hadoop.hbase.io.hfile.HFile;<a name="line.134"></a>
-<span class="sourceLineNo">135</span>import org.apache.hadoop.hbase.monitoring.MonitoredRPCHandler;<a name="line.135"></a>
-<span class="sourceLineNo">136</span>import org.apache.hadoop.hbase.monitoring.MonitoredTask;<a name="line.136"></a>
-<span class="sourceLineNo">137</span>import org.apache.hadoop.hbase.monitoring.TaskMonitor;<a name="line.137"></a>
-<span class="sourceLineNo">138</span>import org.apache.hadoop.hbase.regionserver.HRegion.MutationBatchOperation;<a name="line.138"></a>
-<span class="sourceLineNo">139</span>import org.apache.hadoop.hbase.regionserver.HRegion.RegionScannerImpl;<a name="line.139"></a>
-<span class="sourceLineNo">140</span>import org.apache.hadoop.hbase.regionserver.Region.RowLock;<a name="line.140"></a>
-<span class="sourceLineNo">141</span>import org.apache.hadoop.hbase.regionserver.TestHStore.FaultyFileSystem;<a name="line.141"></a>
-<span class="sourceLineNo">142</span>import org.apache.hadoop.hbase.regionserver.compactions.CompactionRequestImpl;<a name="line.142"></a>
-<span class="sourceLineNo">143</span>import org.apache.hadoop.hbase.regionserver.wal.FSHLog;<a name="line.143"></a>
-<span class="sourceLineNo">144</span>import org.apache.hadoop.hbase.regionserver.wal.MetricsWALSource;<a name="line.144"></a>
-<span class="sourceLineNo">145</span>import org.apache.hadoop.hbase.regionserver.wal.WALUtil;<a name="line.145"></a>
-<span class="sourceLineNo">146</span>import org.apache.hadoop.hbase.replication.regionserver.ReplicationObserver;<a name="line.146"></a>
-<span class="sourceLineNo">147</span>import org.apache.hadoop.hbase.security.User;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>import org.apache.hadoop.hbase.test.MetricsAssertHelper;<a name="line.148"></a>
-<span class="sourceLineNo">149</span>import org.apache.hadoop.hbase.testclassification.LargeTests;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>import org.apache.hadoop.hbase.testclassification.VerySlowRegionServerTests;<a name="line.150"></a>
-<span class="sourceLineNo">151</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.151"></a>
-<span class="sourceLineNo">152</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.152"></a>
-<span class="sourceLineNo">153</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManagerTestHelper;<a name="line.153"></a>
-<span class="sourceLineNo">154</span>import org.apache.hadoop.hbase.util.FSUtils;<a name="line.154"></a>
-<span class="sourceLineNo">155</span>import org.apache.hadoop.hbase.util.IncrementingEnvironmentEdge;<a name="line.155"></a>
-<span class="sourceLineNo">156</span>import org.apache.hadoop.hbase.util.ManualEnvironmentEdge;<a name="line.156"></a>
-<span class="sourceLineNo">157</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.157"></a>
-<span class="sourceLineNo">158</span>import org.apache.hadoop.hbase.wal.AbstractFSWALProvider;<a name="line.158"></a>
-<span class="sourceLineNo">159</span>import org.apache.hadoop.hbase.wal.FaultyFSLog;<a name="line.159"></a>
-<span class="sourceLineNo">160</span>import org.apache.hadoop.hbase.wal.NettyAsyncFSWALConfigHelper;<a name="line.160"></a>
-<span class="sourceLineNo">161</span>import org.apache.hadoop.hbase.wal.WAL;<a name="line.161"></a>
-<span class="sourceLineNo">162</span>import org.apache.hadoop.hbase.wal.WALEdit;<a name="line.162"></a>
-<span class="sourceLineNo">163</span>import org.apache.hadoop.hbase.wal.WALFactory;<a name="line.163"></a>
-<span class="sourceLineNo">164</span>import org.apache.hadoop.hbase.wal.WALKeyImpl;<a name="line.164"></a>
-<span class="sourceLineNo">165</span>import org.apache.hadoop.hbase.wal.WALProvider;<a name="line.165"></a>
-<span class="sourceLineNo">166</span>import org.apache.hadoop.hbase.wal.WALProvider.Writer;<a name="line.166"></a>
-<span class="sourceLineNo">167</span>import org.apache.hadoop.hbase.wal.WALSplitUtil;<a name="line.167"></a>
-<span class="sourceLineNo">168</span>import org.apache.hadoop.hbase.wal.WALSplitter;<a name="line.168"></a>
+<span class="sourceLineNo">107</span>import org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>import org.apache.hadoop.hbase.client.Get;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.111"></a>
+<span class="sourceLineNo">112</span>import org.apache.hadoop.hbase.client.Mutation;<a name="line.112"></a>
+<span class="sourceLineNo">113</span>import org.apache.hadoop.hbase.client.Put;<a name="line.113"></a>
+<span class="sourceLineNo">114</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.114"></a>
+<span class="sourceLineNo">115</span>import org.apache.hadoop.hbase.client.RegionInfoBuilder;<a name="line.115"></a>
+<span class="sourceLineNo">116</span>import org.apache.hadoop.hbase.client.Result;<a name="line.116"></a>
+<span class="sourceLineNo">117</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.117"></a>
+<span class="sourceLineNo">118</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.118"></a>
+<span class="sourceLineNo">119</span>import org.apache.hadoop.hbase.client.Table;<a name="line.119"></a>
+<span class="sourceLineNo">120</span>import org.apache.hadoop.hbase.client.TableDescriptor;<a name="line.120"></a>
+<span class="sourceLineNo">121</span>import org.apache.hadoop.hbase.coprocessor.CoprocessorHost;<a name="line.121"></a>
+<span class="sourceLineNo">122</span>import org.apache.hadoop.hbase.exceptions.FailedSanityCheckException;<a name="line.122"></a>
+<span class="sourceLineNo">123</span>import org.apache.hadoop.hbase.filter.BigDecimalComparator;<a name="line.123"></a>
+<span class="sourceLineNo">124</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.124"></a>
+<span class="sourceLineNo">125</span>import org.apache.hadoop.hbase.filter.ColumnCountGetFilter;<a name="line.125"></a>
+<span class="sourceLineNo">126</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.126"></a>
+<span class="sourceLineNo">127</span>import org.apache.hadoop.hbase.filter.FilterBase;<a name="line.127"></a>
+<span class="sourceLineNo">128</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.128"></a>
+<span class="sourceLineNo">129</span>import org.apache.hadoop.hbase.filter.NullComparator;<a name="line.129"></a>
+<span class="sourceLineNo">130</span>import org.apache.hadoop.hbase.filter.PrefixFilter;<a name="line.130"></a>
+<span class="sourceLineNo">131</span>import org.apache.hadoop.hbase.filter.SingleColumnValueExcludeFilter;<a name="line.131"></a>
+<span class="sourceLineNo">132</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.132"></a>
+<span class="sourceLineNo">133</span>import org.apache.hadoop.hbase.filter.SubstringComparator;<a name="line.133"></a>
+<span class="sourceLineNo">134</span>import org.apache.hadoop.hbase.filter.ValueFilter;<a name="line.134"></a>
+<span class="sourceLineNo">135</span>import org.apache.hadoop.hbase.io.hfile.HFile;<a name="line.135"></a>
+<span class="sourceLineNo">136</span>import org.apache.hadoop.hbase.monitoring.MonitoredRPCHandler;<a name="line.136"></a>
+<span class="sourceLineNo">137</span>import org.apache.hadoop.hbase.monitoring.MonitoredTask;<a name="line.137"></a>
+<span class="sourceLineNo">138</span>import org.apache.hadoop.hbase.monitoring.TaskMonitor;<a name="line.138"></a>
+<span class="sourceLineNo">139</span>import org.apache.hadoop.hbase.regionserver.HRegion.MutationBatchOperation;<a name="line.139"></a>
+<span class="sourceLineNo">140</span>import org.apache.hadoop.hbase.regionserver.HRegion.RegionScannerImpl;<a name="line.140"></a>
+<span class="sourceLineNo">141</span>import org.apache.hadoop.hbase.regionserver.Region.RowLock;<a name="line.141"></a>
+<span class="sourceLineNo">142</span>import org.apache.hadoop.hbase.regionserver.TestHStore.FaultyFileSystem;<a name="line.142"></a>
+<span class="sourceLineNo">143</span>import org.apache.hadoop.hbase.regionserver.compactions.CompactionRequestImpl;<a name="line.143"></a>
+<span class="sourceLineNo">144</span>import org.apache.hadoop.hbase.regionserver.wal.FSHLog;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>import org.apache.hadoop.hbase.regionserver.wal.MetricsWALSource;<a name="line.145"></a>
+<span class="sourceLineNo">146</span>import org.apache.hadoop.hbase.regionserver.wal.WALUtil;<a name="line.146"></a>
+<span class="sourceLineNo">147</span>import org.apache.hadoop.hbase.replication.regionserver.ReplicationObserver;<a name="line.147"></a>
+<span class="sourceLineNo">148</span>import org.apache.hadoop.hbase.security.User;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>import org.apache.hadoop.hbase.test.MetricsAssertHelper;<a name="line.149"></a>
+<span class="sourceLineNo">150</span>import org.apache.hadoop.hbase.testclassification.LargeTests;<a name="line.150"></a>
+<span class="sourceLineNo">151</span>import org.apache.hadoop.hbase.testclassification.VerySlowRegionServerTests;<a name="line.151"></a>
+<span class="sourceLineNo">152</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.152"></a>
+<span class="sourceLineNo">153</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.153"></a>
+<span class="sourceLineNo">154</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManagerTestHelper;<a name="line.154"></a>
+<span class="sourceLineNo">155</span>import org.apache.hadoop.hbase.util.FSUtils;<a name="line.155"></a>
+<span class="sourceLineNo">156</span>import org.apache.hadoop.hbase.util.IncrementingEnvironmentEdge;<a name="line.156"></a>
+<span class="sourceLineNo">157</span>import org.apache.hadoop.hbase.util.ManualEnvironmentEdge;<a name="line.157"></a>
+<span class="sourceLineNo">158</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.158"></a>
+<span class="sourceLineNo">159</span>import org.apache.hadoop.hbase.wal.AbstractFSWALProvider;<a name="line.159"></a>
+<span class="sourceLineNo">160</span>import org.apache.hadoop.hbase.wal.FaultyFSLog;<a name="line.160"></a>
+<span class="sourceLineNo">161</span>import org.apache.hadoop.hbase.wal.NettyAsyncFSWALConfigHelper;<a name="line.161"></a>
+<span class="sourceLineNo">162</span>import org.apache.hadoop.hbase.wal.WAL;<a name="line.162"></a>
+<span class="sourceLineNo">163</span>import org.apache.hadoop.hbase.wal.WALEdit;<a name="line.163"></a>
+<span class="sourceLineNo">164</span>import org.apache.hadoop.hbase.wal.WALFactory;<a name="line.164"></a>
+<span class="sourceLineNo">165</span>import org.apache.hadoop.hbase.wal.WALKeyImpl;<a name="line.165"></a>
+<span class="sourceLineNo">166</span>import org.apache.hadoop.hbase.wal.WALProvider;<a name="line.166"></a>
+<span class="sourceLineNo">167</span>import org.apache.hadoop.hbase.wal.WALProvider.Writer;<a name="line.167"></a>
+<span class="sourceLineNo">168</span>import org.apache.hadoop.hbase.wal.WALSplitUtil;<a name="line.168"></a>
 <span class="sourceLineNo">169</span>import org.apache.hadoop.metrics2.MetricsExecutor;<a name="line.169"></a>
 <span class="sourceLineNo">170</span>import org.junit.After;<a name="line.170"></a>
 <span class="sourceLineNo">171</span>import org.junit.Assert;<a name="line.171"></a>
@@ -409,6007 +409,6017 @@
 <span class="sourceLineNo">401</span>    String testName = "testMemstoreSizeAccountingWithFailedPostBatchMutate";<a name="line.401"></a>
 <span class="sourceLineNo">402</span>    FileSystem fs = FileSystem.get(CONF);<a name="line.402"></a>
 <span class="sourceLineNo">403</span>    Path rootDir = new Path(dir + testName);<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    FSHLog hLog = new FSHLog(fs, rootDir, testName, CONF);<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    hLog.init();<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, hLog,<a name="line.406"></a>
-<span class="sourceLineNo">407</span>        COLUMN_FAMILY_BYTES);<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    assertEquals(0, region.getMemStoreDataSize());<a name="line.409"></a>
-<span class="sourceLineNo">410</span><a name="line.410"></a>
-<span class="sourceLineNo">411</span>    // Put one value<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    byte [] value = Bytes.toBytes(method);<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    Put put = new Put(value);<a name="line.413"></a>
-<span class="sourceLineNo">414</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.414"></a>
-<span class="sourceLineNo">415</span>    region.put(put);<a name="line.415"></a>
-<span class="sourceLineNo">416</span>    long onePutSize = region.getMemStoreDataSize();<a name="line.416"></a>
-<span class="sourceLineNo">417</span>    assertTrue(onePutSize &gt; 0);<a name="line.417"></a>
-<span class="sourceLineNo">418</span><a name="line.418"></a>
-<span class="sourceLineNo">419</span>    RegionCoprocessorHost mockedCPHost = Mockito.mock(RegionCoprocessorHost.class);<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    doThrow(new IOException())<a name="line.420"></a>
-<span class="sourceLineNo">421</span>       .when(mockedCPHost).postBatchMutate(Mockito.&lt;MiniBatchOperationInProgress&lt;Mutation&gt;&gt;any());<a name="line.421"></a>
-<span class="sourceLineNo">422</span>    region.setCoprocessorHost(mockedCPHost);<a name="line.422"></a>
-<span class="sourceLineNo">423</span><a name="line.423"></a>
-<span class="sourceLineNo">424</span>    put = new Put(value);<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("dfg"), value);<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    try {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      region.put(put);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>      fail("Should have failed with IOException");<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    } catch (IOException expected) {<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    }<a name="line.430"></a>
-<span class="sourceLineNo">431</span>    long expectedSize = onePutSize * 2;<a name="line.431"></a>
-<span class="sourceLineNo">432</span>    assertEquals("memstoreSize should be incremented",<a name="line.432"></a>
-<span class="sourceLineNo">433</span>        expectedSize, region.getMemStoreDataSize());<a name="line.433"></a>
-<span class="sourceLineNo">434</span>    assertEquals("flushable size should be incremented",<a name="line.434"></a>
-<span class="sourceLineNo">435</span>        expectedSize, store.getFlushableSize().getDataSize());<a name="line.435"></a>
-<span class="sourceLineNo">436</span><a name="line.436"></a>
-<span class="sourceLineNo">437</span>    region.setCoprocessorHost(null);<a name="line.437"></a>
-<span class="sourceLineNo">438</span>  }<a name="line.438"></a>
-<span class="sourceLineNo">439</span><a name="line.439"></a>
-<span class="sourceLineNo">440</span>  /**<a name="line.440"></a>
-<span class="sourceLineNo">441</span>   * A test case of HBASE-21041<a name="line.441"></a>
-<span class="sourceLineNo">442</span>   * @throws Exception Exception<a name="line.442"></a>
-<span class="sourceLineNo">443</span>   */<a name="line.443"></a>
-<span class="sourceLineNo">444</span>  @Test<a name="line.444"></a>
-<span class="sourceLineNo">445</span>  public void testFlushAndMemstoreSizeCounting() throws Exception {<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    byte[] family = Bytes.toBytes("family");<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.447"></a>
-<span class="sourceLineNo">448</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.448"></a>
-<span class="sourceLineNo">449</span>    try {<a name="line.449"></a>
-<span class="sourceLineNo">450</span>      for (byte[] row : HBaseTestingUtility.ROWS) {<a name="line.450"></a>
-<span class="sourceLineNo">451</span>        Put put = new Put(row);<a name="line.451"></a>
-<span class="sourceLineNo">452</span>        put.addColumn(family, family, row);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>        region.put(put);<a name="line.453"></a>
-<span class="sourceLineNo">454</span>      }<a name="line.454"></a>
-<span class="sourceLineNo">455</span>      region.flush(true);<a name="line.455"></a>
-<span class="sourceLineNo">456</span>      // After flush, data size should be zero<a name="line.456"></a>
-<span class="sourceLineNo">457</span>      assertEquals(0, region.getMemStoreDataSize());<a name="line.457"></a>
-<span class="sourceLineNo">458</span>      // After flush, a new active mutable segment is created, so the heap size<a name="line.458"></a>
-<span class="sourceLineNo">459</span>      // should equal to MutableSegment.DEEP_OVERHEAD<a name="line.459"></a>
-<span class="sourceLineNo">460</span>      assertEquals(MutableSegment.DEEP_OVERHEAD, region.getMemStoreHeapSize());<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      // After flush, offheap should be zero<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      assertEquals(0, region.getMemStoreOffHeapSize());<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    } finally {<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.464"></a>
-<span class="sourceLineNo">465</span>      this.region = null;<a name="line.465"></a>
-<span class="sourceLineNo">466</span>      wals.close();<a name="line.466"></a>
-<span class="sourceLineNo">467</span>    }<a name="line.467"></a>
-<span class="sourceLineNo">468</span>  }<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>   * Test we do not lose data if we fail a flush and then close.<a name="line.471"></a>
-<span class="sourceLineNo">472</span>   * Part of HBase-10466.  Tests the following from the issue description:<a name="line.472"></a>
-<span class="sourceLineNo">473</span>   * "Bug 1: Wrong calculation of HRegion.memstoreSize: When a flush fails, data to be flushed is<a name="line.473"></a>
-<span class="sourceLineNo">474</span>   * kept in each MemStore's snapshot and wait for next flush attempt to continue on it. But when<a name="line.474"></a>
-<span class="sourceLineNo">475</span>   * the next flush succeeds, the counter of total memstore size in HRegion is always deduced by<a name="line.475"></a>
-<span class="sourceLineNo">476</span>   * the sum of current memstore sizes instead of snapshots left from previous failed flush. This<a name="line.476"></a>
-<span class="sourceLineNo">477</span>   * calculation is problematic that almost every time there is failed flush, HRegion.memstoreSize<a name="line.477"></a>
-<span class="sourceLineNo">478</span>   * gets reduced by a wrong value. If region flush could not proceed for a couple cycles, the size<a name="line.478"></a>
-<span class="sourceLineNo">479</span>   * in current memstore could be much larger than the snapshot. It's likely to drift memstoreSize<a name="line.479"></a>
-<span class="sourceLineNo">480</span>   * much smaller than expected. In extreme case, if the error accumulates to even bigger than<a name="line.480"></a>
-<span class="sourceLineNo">481</span>   * HRegion's memstore size limit, any further flush is skipped because flush does not do anything<a name="line.481"></a>
-<span class="sourceLineNo">482</span>   * if memstoreSize is not larger than 0."<a name="line.482"></a>
-<span class="sourceLineNo">483</span>   * @throws Exception<a name="line.483"></a>
-<span class="sourceLineNo">484</span>   */<a name="line.484"></a>
-<span class="sourceLineNo">485</span>  @Test<a name="line.485"></a>
-<span class="sourceLineNo">486</span>  public void testFlushSizeAccounting() throws Exception {<a name="line.486"></a>
-<span class="sourceLineNo">487</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    // Only retry once.<a name="line.489"></a>
-<span class="sourceLineNo">490</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.490"></a>
-<span class="sourceLineNo">491</span>    final User user =<a name="line.491"></a>
-<span class="sourceLineNo">492</span>      User.createUserForTesting(conf, method, new String[]{"foo"});<a name="line.492"></a>
-<span class="sourceLineNo">493</span>    // Inject our faulty LocalFileSystem<a name="line.493"></a>
-<span class="sourceLineNo">494</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.494"></a>
-<span class="sourceLineNo">495</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.495"></a>
-<span class="sourceLineNo">496</span>      @Override<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      public Object run() throws Exception {<a name="line.497"></a>
-<span class="sourceLineNo">498</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.498"></a>
-<span class="sourceLineNo">499</span>        FileSystem fs = FileSystem.get(conf);<a name="line.499"></a>
-<span class="sourceLineNo">500</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.500"></a>
-<span class="sourceLineNo">501</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.501"></a>
-<span class="sourceLineNo">502</span>        HRegion region = null;<a name="line.502"></a>
-<span class="sourceLineNo">503</span>        try {<a name="line.503"></a>
-<span class="sourceLineNo">504</span>          // Initialize region<a name="line.504"></a>
-<span class="sourceLineNo">505</span>          region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, wal,<a name="line.505"></a>
-<span class="sourceLineNo">506</span>              COLUMN_FAMILY_BYTES);<a name="line.506"></a>
-<span class="sourceLineNo">507</span>          long size = region.getMemStoreDataSize();<a name="line.507"></a>
-<span class="sourceLineNo">508</span>          Assert.assertEquals(0, size);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.509"></a>
-<span class="sourceLineNo">510</span>          Put p1 = new Put(row);<a name="line.510"></a>
-<span class="sourceLineNo">511</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[]) null));<a name="line.511"></a>
-<span class="sourceLineNo">512</span>          region.put(p1);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>          final long sizeOfOnePut = region.getMemStoreDataSize();<a name="line.513"></a>
-<span class="sourceLineNo">514</span>          // Fail a flush which means the current memstore will hang out as memstore 'snapshot'.<a name="line.514"></a>
-<span class="sourceLineNo">515</span>          try {<a name="line.515"></a>
-<span class="sourceLineNo">516</span>            LOG.info("Flushing");<a name="line.516"></a>
-<span class="sourceLineNo">517</span>            region.flush(true);<a name="line.517"></a>
-<span class="sourceLineNo">518</span>            Assert.fail("Didn't bubble up IOE!");<a name="line.518"></a>
-<span class="sourceLineNo">519</span>          } catch (DroppedSnapshotException dse) {<a name="line.519"></a>
-<span class="sourceLineNo">520</span>            // What we are expecting<a name="line.520"></a>
-<span class="sourceLineNo">521</span>            region.closing.set(false); // this is needed for the rest of the test to work<a name="line.521"></a>
-<span class="sourceLineNo">522</span>          }<a name="line.522"></a>
-<span class="sourceLineNo">523</span>          // Make it so all writes succeed from here on out<a name="line.523"></a>
-<span class="sourceLineNo">524</span>          ffs.fault.set(false);<a name="line.524"></a>
-<span class="sourceLineNo">525</span>          // Check sizes.  Should still be the one entry.<a name="line.525"></a>
-<span class="sourceLineNo">526</span>          Assert.assertEquals(sizeOfOnePut, region.getMemStoreDataSize());<a name="line.526"></a>
-<span class="sourceLineNo">527</span>          // Now add two entries so that on this next flush that fails, we can see if we<a name="line.527"></a>
-<span class="sourceLineNo">528</span>          // subtract the right amount, the snapshot size only.<a name="line.528"></a>
-<span class="sourceLineNo">529</span>          Put p2 = new Put(row);<a name="line.529"></a>
-<span class="sourceLineNo">530</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.530"></a>
-<span class="sourceLineNo">531</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.531"></a>
-<span class="sourceLineNo">532</span>          region.put(p2);<a name="line.532"></a>
-<span class="sourceLineNo">533</span>          long expectedSize = sizeOfOnePut * 3;<a name="line.533"></a>
-<span class="sourceLineNo">534</span>          Assert.assertEquals(expectedSize, region.getMemStoreDataSize());<a name="line.534"></a>
-<span class="sourceLineNo">535</span>          // Do a successful flush.  It will clear the snapshot only.  Thats how flushes work.<a name="line.535"></a>
-<span class="sourceLineNo">536</span>          // If already a snapshot, we clear it else we move the memstore to be snapshot and flush<a name="line.536"></a>
-<span class="sourceLineNo">537</span>          // it<a name="line.537"></a>
-<span class="sourceLineNo">538</span>          region.flush(true);<a name="line.538"></a>
-<span class="sourceLineNo">539</span>          // Make sure our memory accounting is right.<a name="line.539"></a>
-<span class="sourceLineNo">540</span>          Assert.assertEquals(sizeOfOnePut * 2, region.getMemStoreDataSize());<a name="line.540"></a>
-<span class="sourceLineNo">541</span>        } finally {<a name="line.541"></a>
-<span class="sourceLineNo">542</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.542"></a>
-<span class="sourceLineNo">543</span>        }<a name="line.543"></a>
-<span class="sourceLineNo">544</span>        return null;<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>    FileSystem.closeAllForUGI(user.getUGI());<a name="line.547"></a>
-<span class="sourceLineNo">548</span>  }<a name="line.548"></a>
-<span class="sourceLineNo">549</span><a name="line.549"></a>
-<span class="sourceLineNo">550</span>  @Test<a name="line.550"></a>
-<span class="sourceLineNo">551</span>  public void testCloseWithFailingFlush() throws Exception {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    // Only retry once.<a name="line.554"></a>
-<span class="sourceLineNo">555</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.555"></a>
-<span class="sourceLineNo">556</span>    final User user =<a name="line.556"></a>
-<span class="sourceLineNo">557</span>      User.createUserForTesting(conf, this.method, new String[]{"foo"});<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    // Inject our faulty LocalFileSystem<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      @Override<a name="line.561"></a>
-<span class="sourceLineNo">562</span>      public Object run() throws Exception {<a name="line.562"></a>
-<span class="sourceLineNo">563</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.563"></a>
-<span class="sourceLineNo">564</span>        FileSystem fs = FileSystem.get(conf);<a name="line.564"></a>
-<span class="sourceLineNo">565</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.565"></a>
-<span class="sourceLineNo">566</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.566"></a>
-<span class="sourceLineNo">567</span>        HRegion region = null;<a name="line.567"></a>
-<span class="sourceLineNo">568</span>        try {<a name="line.568"></a>
-<span class="sourceLineNo">569</span>          // Initialize region<a name="line.569"></a>
-<span class="sourceLineNo">570</span>          region = initHRegion(tableName, null, null, false,<a name="line.570"></a>
-<span class="sourceLineNo">571</span>              Durability.SYNC_WAL, wal, COLUMN_FAMILY_BYTES);<a name="line.571"></a>
-<span class="sourceLineNo">572</span>          long size = region.getMemStoreDataSize();<a name="line.572"></a>
-<span class="sourceLineNo">573</span>          Assert.assertEquals(0, size);<a name="line.573"></a>
-<span class="sourceLineNo">574</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.574"></a>
-<span class="sourceLineNo">575</span>          Put p1 = new Put(row);<a name="line.575"></a>
-<span class="sourceLineNo">576</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[])null));<a name="line.576"></a>
-<span class="sourceLineNo">577</span>          region.put(p1);<a name="line.577"></a>
-<span class="sourceLineNo">578</span>          // Manufacture an outstanding snapshot -- fake a failed flush by doing prepare step only.<a name="line.578"></a>
-<span class="sourceLineNo">579</span>          HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>          StoreFlushContext storeFlushCtx =<a name="line.580"></a>
-<span class="sourceLineNo">581</span>              store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY);<a name="line.581"></a>
-<span class="sourceLineNo">582</span>          storeFlushCtx.prepare();<a name="line.582"></a>
-<span class="sourceLineNo">583</span>          // Now add two entries to the foreground memstore.<a name="line.583"></a>
-<span class="sourceLineNo">584</span>          Put p2 = new Put(row);<a name="line.584"></a>
-<span class="sourceLineNo">585</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.585"></a>
-<span class="sourceLineNo">586</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.586"></a>
-<span class="sourceLineNo">587</span>          region.put(p2);<a name="line.587"></a>
-<span class="sourceLineNo">588</span>          // Now try close on top of a failing flush.<a name="line.588"></a>
-<span class="sourceLineNo">589</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.589"></a>
-<span class="sourceLineNo">590</span>          region = null;<a name="line.590"></a>
-<span class="sourceLineNo">591</span>          fail();<a name="line.591"></a>
-<span class="sourceLineNo">592</span>        } catch (DroppedSnapshotException dse) {<a name="line.592"></a>
-<span class="sourceLineNo">593</span>          // Expected<a name="line.593"></a>
-<span class="sourceLineNo">594</span>          LOG.info("Expected DroppedSnapshotException");<a name="line.594"></a>
-<span class="sourceLineNo">595</span>        } finally {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>          // Make it so all writes succeed from here on out so can close clean<a name="line.596"></a>
-<span class="sourceLineNo">597</span>          ffs.fault.set(false);<a name="line.597"></a>
-<span class="sourceLineNo">598</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.598"></a>
-<span class="sourceLineNo">599</span>        }<a name="line.599"></a>
-<span class="sourceLineNo">600</span>        return null;<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      }<a name="line.601"></a>
-<span class="sourceLineNo">602</span>    });<a name="line.602"></a>
-<span class="sourceLineNo">603</span>    FileSystem.closeAllForUGI(user.getUGI());<a name="line.603"></a>
-<span class="sourceLineNo">604</span>  }<a name="line.604"></a>
-<span class="sourceLineNo">605</span><a name="line.605"></a>
-<span class="sourceLineNo">606</span>  @Test<a name="line.606"></a>
-<span class="sourceLineNo">607</span>  public void testCompactionAffectedByScanners() throws Exception {<a name="line.607"></a>
-<span class="sourceLineNo">608</span>    byte[] family = Bytes.toBytes("family");<a name="line.608"></a>
-<span class="sourceLineNo">609</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.609"></a>
-<span class="sourceLineNo">610</span><a name="line.610"></a>
-<span class="sourceLineNo">611</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.612"></a>
-<span class="sourceLineNo">613</span>    region.put(put);<a name="line.613"></a>
-<span class="sourceLineNo">614</span>    region.flush(true);<a name="line.614"></a>
-<span class="sourceLineNo">615</span><a name="line.615"></a>
-<span class="sourceLineNo">616</span>    Scan scan = new Scan();<a name="line.616"></a>
-<span class="sourceLineNo">617</span>    scan.setMaxVersions(3);<a name="line.617"></a>
-<span class="sourceLineNo">618</span>    // open the first scanner<a name="line.618"></a>
-<span class="sourceLineNo">619</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.619"></a>
-<span class="sourceLineNo">620</span><a name="line.620"></a>
-<span class="sourceLineNo">621</span>    Delete delete = new Delete(Bytes.toBytes("r1"));<a name="line.621"></a>
-<span class="sourceLineNo">622</span>    region.delete(delete);<a name="line.622"></a>
-<span class="sourceLineNo">623</span>    region.flush(true);<a name="line.623"></a>
-<span class="sourceLineNo">624</span><a name="line.624"></a>
-<span class="sourceLineNo">625</span>    // open the second scanner<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    RegionScanner scanner2 = region.getScanner(scan);<a name="line.626"></a>
-<span class="sourceLineNo">627</span><a name="line.627"></a>
-<span class="sourceLineNo">628</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.628"></a>
-<span class="sourceLineNo">629</span><a name="line.629"></a>
-<span class="sourceLineNo">630</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.630"></a>
-<span class="sourceLineNo">631</span><a name="line.631"></a>
-<span class="sourceLineNo">632</span>    // make a major compaction<a name="line.632"></a>
-<span class="sourceLineNo">633</span>    region.compact(true);<a name="line.633"></a>
-<span class="sourceLineNo">634</span><a name="line.634"></a>
-<span class="sourceLineNo">635</span>    // open the third scanner<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    RegionScanner scanner3 = region.getScanner(scan);<a name="line.636"></a>
-<span class="sourceLineNo">637</span><a name="line.637"></a>
-<span class="sourceLineNo">638</span>    // get data from scanner 1, 2, 3 after major compaction<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    scanner1.next(results);<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    System.out.println(results);<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    assertEquals(1, results.size());<a name="line.641"></a>
-<span class="sourceLineNo">642</span><a name="line.642"></a>
-<span class="sourceLineNo">643</span>    results.clear();<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    scanner2.next(results);<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    System.out.println(results);<a name="line.645"></a>
-<span class="sourceLineNo">646</span>    assertEquals(0, results.size());<a name="line.646"></a>
-<span class="sourceLineNo">647</span><a name="line.647"></a>
-<span class="sourceLineNo">648</span>    results.clear();<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    scanner3.next(results);<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    System.out.println(results);<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    assertEquals(0, results.size());<a name="line.651"></a>
-<span class="sourceLineNo">652</span>  }<a name="line.652"></a>
-<span class="sourceLineNo">653</span><a name="line.653"></a>
-<span class="sourceLineNo">654</span>  @Test<a name="line.654"></a>
-<span class="sourceLineNo">655</span>  public void testToShowNPEOnRegionScannerReseek() throws Exception {<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    byte[] family = Bytes.toBytes("family");<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.657"></a>
-<span class="sourceLineNo">658</span><a name="line.658"></a>
-<span class="sourceLineNo">659</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.659"></a>
-<span class="sourceLineNo">660</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.660"></a>
-<span class="sourceLineNo">661</span>    region.put(put);<a name="line.661"></a>
-<span class="sourceLineNo">662</span>    put = new Put(Bytes.toBytes("r2"));<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.663"></a>
-<span class="sourceLineNo">664</span>    region.put(put);<a name="line.664"></a>
-<span class="sourceLineNo">665</span>    region.flush(true);<a name="line.665"></a>
-<span class="sourceLineNo">666</span><a name="line.666"></a>
-<span class="sourceLineNo">667</span>    Scan scan = new Scan();<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    scan.setMaxVersions(3);<a name="line.668"></a>
-<span class="sourceLineNo">669</span>    // open the first scanner<a name="line.669"></a>
-<span class="sourceLineNo">670</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.670"></a>
-<span class="sourceLineNo">671</span><a name="line.671"></a>
-<span class="sourceLineNo">672</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.672"></a>
-<span class="sourceLineNo">673</span><a name="line.673"></a>
-<span class="sourceLineNo">674</span>    region.compact(true);<a name="line.674"></a>
-<span class="sourceLineNo">675</span><a name="line.675"></a>
-<span class="sourceLineNo">676</span>    scanner1.reseek(Bytes.toBytes("r2"));<a name="line.676"></a>
-<span class="sourceLineNo">677</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.677"></a>
-<span class="sourceLineNo">678</span>    scanner1.next(results);<a name="line.678"></a>
-<span class="sourceLineNo">679</span>    Cell keyValue = results.get(0);<a name="line.679"></a>
-<span class="sourceLineNo">680</span>    Assert.assertTrue(Bytes.compareTo(CellUtil.cloneRow(keyValue), Bytes.toBytes("r2")) == 0);<a name="line.680"></a>
-<span class="sourceLineNo">681</span>    scanner1.close();<a name="line.681"></a>
-<span class="sourceLineNo">682</span>  }<a name="line.682"></a>
-<span class="sourceLineNo">683</span><a name="line.683"></a>
-<span class="sourceLineNo">684</span>  @Test<a name="line.684"></a>
-<span class="sourceLineNo">685</span>  public void testSkipRecoveredEditsReplay() throws Exception {<a name="line.685"></a>
-<span class="sourceLineNo">686</span>    byte[] family = Bytes.toBytes("family");<a name="line.686"></a>
-<span class="sourceLineNo">687</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.687"></a>
-<span class="sourceLineNo">688</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.688"></a>
-<span class="sourceLineNo">689</span>    try {<a name="line.689"></a>
-<span class="sourceLineNo">690</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.690"></a>
-<span class="sourceLineNo">691</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.691"></a>
-<span class="sourceLineNo">692</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.692"></a>
-<span class="sourceLineNo">693</span><a name="line.693"></a>
-<span class="sourceLineNo">694</span>      Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.694"></a>
-<span class="sourceLineNo">695</span><a name="line.695"></a>
-<span class="sourceLineNo">696</span>      long maxSeqId = 1050;<a name="line.696"></a>
-<span class="sourceLineNo">697</span>      long minSeqId = 1000;<a name="line.697"></a>
-<span class="sourceLineNo">698</span><a name="line.698"></a>
-<span class="sourceLineNo">699</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.699"></a>
-<span class="sourceLineNo">700</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.700"></a>
-<span class="sourceLineNo">701</span>        fs.create(recoveredEdits);<a name="line.701"></a>
-<span class="sourceLineNo">702</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.702"></a>
-<span class="sourceLineNo">703</span><a name="line.703"></a>
-<span class="sourceLineNo">704</span>        long time = System.nanoTime();<a name="line.704"></a>
-<span class="sourceLineNo">705</span>        WALEdit edit = new WALEdit();<a name="line.705"></a>
-<span class="sourceLineNo">706</span>        edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.706"></a>
-<span class="sourceLineNo">707</span>            .toBytes(i)));<a name="line.707"></a>
-<span class="sourceLineNo">708</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.708"></a>
-<span class="sourceLineNo">709</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.709"></a>
-<span class="sourceLineNo">710</span><a name="line.710"></a>
-<span class="sourceLineNo">711</span>        writer.close();<a name="line.711"></a>
-<span class="sourceLineNo">712</span>      }<a name="line.712"></a>
-<span class="sourceLineNo">713</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.713"></a>
-<span class="sourceLineNo">714</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.714"></a>
-<span class="sourceLineNo">715</span>      for (HStore store : region.getStores()) {<a name="line.715"></a>
-<span class="sourceLineNo">716</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), minSeqId - 1);<a name="line.716"></a>
-<span class="sourceLineNo">717</span>      }<a name="line.717"></a>
-<span class="sourceLineNo">718</span>      long seqId = region.replayRecoveredEditsIfAny(maxSeqIdInStores, null, status);<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      assertEquals(maxSeqId, seqId);<a name="line.719"></a>
-<span class="sourceLineNo">720</span>      region.getMVCC().advanceTo(seqId);<a name="line.720"></a>
-<span class="sourceLineNo">721</span>      Get get = new Get(row);<a name="line.721"></a>
-<span class="sourceLineNo">722</span>      Result result = region.get(get);<a name="line.722"></a>
-<span class="sourceLineNo">723</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.723"></a>
-<span class="sourceLineNo">724</span>        List&lt;Cell&gt; kvs = result.getColumnCells(family, Bytes.toBytes(i));<a name="line.724"></a>
-<span class="sourceLineNo">725</span>        assertEquals(1, kvs.size());<a name="line.725"></a>
-<span class="sourceLineNo">726</span>        assertArrayEquals(Bytes.toBytes(i), CellUtil.cloneValue(kvs.get(0)));<a name="line.726"></a>
-<span class="sourceLineNo">727</span>      }<a name="line.727"></a>
-<span class="sourceLineNo">728</span>    } finally {<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      this.region = null;<a name="line.730"></a>
-<span class="sourceLineNo">731</span>      wals.close();<a name="line.731"></a>
-<span class="sourceLineNo">732</span>    }<a name="line.732"></a>
-<span class="sourceLineNo">733</span>  }<a name="line.733"></a>
-<span class="sourceLineNo">734</span><a name="line.734"></a>
-<span class="sourceLineNo">735</span>  @Test<a name="line.735"></a>
-<span class="sourceLineNo">736</span>  public void testSkipRecoveredEditsReplaySomeIgnored() throws Exception {<a name="line.736"></a>
-<span class="sourceLineNo">737</span>    byte[] family = Bytes.toBytes("family");<a name="line.737"></a>
-<span class="sourceLineNo">738</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.738"></a>
-<span class="sourceLineNo">739</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.739"></a>
-<span class="sourceLineNo">740</span>    try {<a name="line.740"></a>
-<span class="sourceLineNo">741</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.741"></a>
-<span class="sourceLineNo">742</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.742"></a>
-<span class="sourceLineNo">743</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.743"></a>
-<span class="sourceLineNo">744</span><a name="line.744"></a>
-<span class="sourceLineNo">745</span>      Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.745"></a>
-<span class="sourceLineNo">746</span><a name="line.746"></a>
-<span class="sourceLineNo">747</span>      long maxSeqId = 1050;<a name="line.747"></a>
-<span class="sourceLineNo">748</span>      long minSeqId = 1000;<a name="line.748"></a>
-<span class="sourceLineNo">749</span><a name="line.749"></a>
-<span class="sourceLineNo">750</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.750"></a>
-<span class="sourceLineNo">751</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.751"></a>
-<span class="sourceLineNo">752</span>        fs.create(recoveredEdits);<a name="line.752"></a>
-<span class="sourceLineNo">753</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.753"></a>
-<span class="sourceLineNo">754</span><a name="line.754"></a>
-<span class="sourceLineNo">755</span>        long time = System.nanoTime();<a name="line.755"></a>
-<span class="sourceLineNo">756</span>        WALEdit edit = new WALEdit();<a name="line.756"></a>
-<span class="sourceLineNo">757</span>        edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.757"></a>
-<span class="sourceLineNo">758</span>            .toBytes(i)));<a name="line.758"></a>
-<span class="sourceLineNo">759</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.759"></a>
-<span class="sourceLineNo">760</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.760"></a>
-<span class="sourceLineNo">761</span><a name="line.761"></a>
-<span class="sourceLineNo">762</span>        writer.close();<a name="line.762"></a>
-<span class="sourceLineNo">763</span>      }<a name="line.763"></a>
-<span class="sourceLineNo">764</span>      long recoverSeqId = 1030;<a name="line.764"></a>
-<span class="sourceLineNo">765</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.766"></a>
-<span class="sourceLineNo">767</span>      for (HStore store : region.getStores()) {<a name="line.767"></a>
-<span class="sourceLineNo">768</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), recoverSeqId - 1);<a name="line.768"></a>
-<span class="sourceLineNo">769</span>      }<a name="line.769"></a>
-<span class="sourceLineNo">770</span>      long seqId = region.replayRecoveredEditsIfAny(maxSeqIdInStores, null, status);<a name="line.770"></a>
-<span class="sourceLineNo">771</span>      assertEquals(maxSeqId, seqId);<a name="line.771"></a>
-<span class="sourceLineNo">772</span>      region.getMVCC().advanceTo(seqId);<a name="line.772"></a>
-<span class="sourceLineNo">773</span>      Get get = new Get(row);<a name="line.773"></a>
-<span class="sourceLineNo">774</span>      Result result = region.get(get);<a name="line.774"></a>
-<span class="sourceLineNo">775</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.775"></a>
-<span class="sourceLineNo">776</span>        List&lt;Cell&gt; kvs = result.getColumnCells(family, Bytes.toBytes(i));<a name="line.776"></a>
-<span class="sourceLineNo">777</span>        if (i &lt; recoverSeqId) {<a name="line.777"></a>
-<span class="sourceLineNo">778</span>          assertEquals(0, kvs.size());<a name="line.778"></a>
-<span class="sourceLineNo">779</span>        } else {<a name="line.779"></a>
-<span class="sourceLineNo">780</span>          assertEquals(1, kvs.size());<a name="line.780"></a>
-<span class="sourceLineNo">781</span>          assertArrayEquals(Bytes.toBytes(i), CellUtil.cloneValue(kvs.get(0)));<a name="line.781"></a>
-<span class="sourceLineNo">782</span>        }<a name="line.782"></a>
-<span class="sourceLineNo">783</span>      }<a name="line.783"></a>
-<span class="sourceLineNo">784</span>    } finally {<a name="line.784"></a>
-<span class="sourceLineNo">785</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.785"></a>
-<span class="sourceLineNo">786</span>      this.region = null;<a name="line.786"></a>
-<span class="sourceLineNo">787</span>      wals.close();<a name="line.787"></a>
-<span class="sourceLineNo">788</span>    }<a name="line.788"></a>
-<span class="sourceLineNo">789</span>  }<a name="line.789"></a>
-<span class="sourceLineNo">790</span><a name="line.790"></a>
-<span class="sourceLineNo">791</span>  @Test<a name="line.791"></a>
-<span class="sourceLineNo">792</span>  public void testSkipRecoveredEditsReplayAllIgnored() throws Exception {<a name="line.792"></a>
-<span class="sourceLineNo">793</span>    byte[] family = Bytes.toBytes("family");<a name="line.793"></a>
-<span class="sourceLineNo">794</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.794"></a>
-<span class="sourceLineNo">795</span>    Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.795"></a>
-<span class="sourceLineNo">796</span>    FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.796"></a>
-<span class="sourceLineNo">797</span><a name="line.797"></a>
-<span class="sourceLineNo">798</span>    Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.798"></a>
-<span class="sourceLineNo">799</span>    for (int i = 1000; i &lt; 1050; i += 10) {<a name="line.799"></a>
-<span class="sourceLineNo">800</span>      Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.800"></a>
-<span class="sourceLineNo">801</span>      FSDataOutputStream dos = fs.create(recoveredEdits);<a name="line.801"></a>
-<span class="sourceLineNo">802</span>      dos.writeInt(i);<a name="line.802"></a>
-<span class="sourceLineNo">803</span>      dos.close();<a name="line.803"></a>
-<span class="sourceLineNo">804</span>    }<a name="line.804"></a>
-<span class="sourceLineNo">805</span>    long minSeqId = 2000;<a name="line.805"></a>
-<span class="sourceLineNo">806</span>    Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", minSeqId - 1));<a name="line.806"></a>
-<span class="sourceLineNo">807</span>    FSDataOutputStream dos = fs.create(recoveredEdits);<a name="line.807"></a>
-<span class="sourceLineNo">808</span>    dos.close();<a name="line.808"></a>
-<span class="sourceLineNo">809</span><a name="line.809"></a>
-<span class="sourceLineNo">810</span>    Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.810"></a>
-<span class="sourceLineNo">811</span>    for (HStore store : region.getStores()) {<a name="line.811"></a>
-<span class="sourceLineNo">812</span>      maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), minSeqId);<a name="line.812"></a>
-<span class="sourceLineNo">813</span>    }<a name="line.813"></a>
-<span class="sourceLineNo">814</span>    long seqId = region.replayRecoveredEditsIfAny(maxSeqIdInStores, null, null);<a name="line.814"></a>
-<span class="sourceLineNo">815</span>    assertEquals(minSeqId, seqId);<a name="line.815"></a>
-<span class="sourceLineNo">816</span>  }<a name="line.816"></a>
-<span class="sourceLineNo">817</span><a name="line.817"></a>
-<span class="sourceLineNo">818</span>  @Test<a name="line.818"></a>
-<span class="sourceLineNo">819</span>  public void testSkipRecoveredEditsReplayTheLastFileIgnored() throws Exception {<a name="line.819"></a>
-<span class="sourceLineNo">820</span>    byte[] family = Bytes.toBytes("family");<a name="line.820"></a>
-<span class="sourceLineNo">821</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.821"></a>
-<span class="sourceLineNo">822</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.822"></a>
-<span class="sourceLineNo">823</span>    try {<a name="line.823"></a>
-<span class="sourceLineNo">824</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.824"></a>
-<span class="sourceLineNo">825</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.825"></a>
-<span class="sourceLineNo">826</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.826"></a>
-<span class="sourceLineNo">827</span>      byte[][] columns = region.getTableDescriptor().getColumnFamilyNames().toArray(new byte[0][]);<a name="line.827"></a>
-<span class="sourceLineNo">828</span><a name="line.828"></a>
-<span class="sourceLineNo">829</span>      assertEquals(0, region.getStoreFileList(columns).size());<a name="line.829"></a>
-<span class="sourceLineNo">830</span><a name="line.830"></a>
-<span class="sourceLineNo">831</span>      Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.831"></a>
-<span class="sourceLineNo">832</span><a name="line.832"></a>
-<span class="sourceLineNo">833</span>      long maxSeqId = 1050;<a name="line.833"></a>
-<span class="sourceLineNo">834</span>      long minSeqId = 1000;<a name="line.834"></a>
-<span class="sourceLineNo">835</span><a name="line.835"></a>
-<span class="sourceLineNo">836</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.836"></a>
-<span class="sourceLineNo">837</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.837"></a>
-<span class="sourceLineNo">838</span>        fs.create(recoveredEdits);<a name="line.838"></a>
-<span class="sourceLineNo">839</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.839"></a>
-<span class="sourceLineNo">840</span><a name="line.840"></a>
-<span class="sourceLineNo">841</span>        long time = System.nanoTime();<a name="line.841"></a>
-<span class="sourceLineNo">842</span>        WALEdit edit = null;<a name="line.842"></a>
-<span class="sourceLineNo">843</span>        if (i == maxSeqId) {<a name="line.843"></a>
-<span class="sourceLineNo">844</span>          edit = WALEdit.createCompaction(region.getRegionInfo(),<a name="line.844"></a>
-<span class="sourceLineNo">845</span>          CompactionDescriptor.newBuilder()<a name="line.845"></a>
-<span class="sourceLineNo">846</span>          .setTableName(ByteString.copyFrom(tableName.getName()))<a name="line.846"></a>
-<span class="sourceLineNo">847</span>          .setFamilyName(ByteString.copyFrom(regionName))<a name="line.847"></a>
-<span class="sourceLineNo">848</span>          .setEncodedRegionName(ByteString.copyFrom(regionName))<a name="line.848"></a>
-<span class="sourceLineNo">849</span>          .setStoreHomeDirBytes(ByteString.copyFrom(Bytes.toBytes(regiondir.toString())))<a name="line.849"></a>
-<span class="sourceLineNo">850</span>          .setRegionName(ByteString.copyFrom(region.getRegionInfo().getRegionName()))<a name="line.850"></a>
-<span class="sourceLineNo">851</span>          .build());<a name="line.851"></a>
-<span class="sourceLineNo">852</span>        } else {<a name="line.852"></a>
-<span class="sourceLineNo">853</span>          edit = new WALEdit();<a name="line.853"></a>
-<span class="sourceLineNo">854</span>          edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.854"></a>
-<span class="sourceLineNo">855</span>            .toBytes(i)));<a name="line.855"></a>
-<span class="sourceLineNo">856</span>        }<a name="line.856"></a>
-<span class="sourceLineNo">857</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.857"></a>
-<span class="sourceLineNo">858</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.858"></a>
-<span class="sourceLineNo">859</span>        writer.close();<a name="line.859"></a>
-<span class="sourceLineNo">860</span>      }<a name="line.860"></a>
-<span class="sourceLineNo">861</span><a name="line.861"></a>
-<span class="sourceLineNo">862</span>      long recoverSeqId = 1030;<a name="line.862"></a>
-<span class="sourceLineNo">863</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.863"></a>
-<span class="sourceLineNo">864</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.864"></a>
-<span class="sourceLineNo">865</span>      for (HStore store : region.getStores()) {<a name="line.865"></a>
-<span class="sourceLineNo">866</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), recoverSeqId - 1);<a name="line.866"></a>
-<span class="sourceLineNo">867</span>      }<a name="line.867"></a>
-<span class="sourceLineNo">868</span>      long seqId = region.replayRecoveredEditsIfAny(maxSeqIdInStores, null, status);<a name="line.868"></a>
-<span class="sourceLineNo">869</span>      assertEquals(maxSeqId, seqId);<a name="line.869"></a>
-<span class="sourceLineNo">870</span><a name="line.870"></a>
-<span class="sourceLineNo">871</span>      // assert that the files are flushed<a name="line.871"></a>
-<span class="sourceLineNo">872</span>      assertEquals(1, region.getStoreFileList(columns).size());<a name="line.872"></a>
-<span class="sourceLineNo">873</span><a name="line.873"></a>
-<span class="sourceLineNo">874</span>    } finally {<a name="line.874"></a>
-<span class="sourceLineNo">875</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.875"></a>
-<span class="sourceLineNo">876</span>      this.region = null;<a name="line.876"></a>
-<span class="sourceLineNo">877</span>      wals.close();<a name="line.877"></a>
-<span class="sourceLineNo">878</span>    }<a name="line.878"></a>
-<span class="sourceLineNo">879</span>  }<a name="line.879"></a>
-<span class="sourceLineNo">880</span><a name="line.880"></a>
-<span class="sourceLineNo">881</span>  @Test<a name="line.881"></a>
-<span class="sourceLineNo">882</span>  public void testRecoveredEditsReplayCompaction() throws Exception {<a name="line.882"></a>
-<span class="sourceLineNo">883</span>    testRecoveredEditsReplayCompaction(false);<a name="line.883"></a>
-<span class="sourceLineNo">884</span>    testRecoveredEditsReplayCompaction(true);<a name="line.884"></a>
-<span class="sourceLineNo">885</span>  }<a name="line.885"></a>
-<span class="sourceLineNo">886</span><a name="line.886"></a>
-<span class="sourceLineNo">887</span>  public void testRecoveredEditsReplayCompaction(boolean mismatchedRegionName) throws Exception {<a name="line.887"></a>
-<span class="sourceLineNo">888</span>    CONF.setClass(HConstants.REGION_IMPL, HRegionForTesting.class, Region.class);<a name="line.888"></a>
-<span class="sourceLineNo">889</span>    byte[] family = Bytes.toBytes("family");<a name="line.889"></a>
-<span class="sourceLineNo">890</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.890"></a>
-<span class="sourceLineNo">891</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.891"></a>
-<span class="sourceLineNo">892</span>    try {<a name="line.892"></a>
-<span class="sourceLineNo">893</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.893"></a>
-<span class="sourceLineNo">894</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.894"></a>
-<span class="sourceLineNo">895</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.895"></a>
-<span class="sourceLineNo">896</span><a name="line.896"></a>
-<span class="sourceLineNo">897</span>      long maxSeqId = 3;<a name="line.897"></a>
-<span class="sourceLineNo">898</span>      long minSeqId = 0;<a name="line.898"></a>
-<span class="sourceLineNo">899</span><a name="line.899"></a>
-<span class="sourceLineNo">900</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.900"></a>
-<span class="sourceLineNo">901</span>        Put put = new Put(Bytes.toBytes(i));<a name="line.901"></a>
-<span class="sourceLineNo">902</span>        put.addColumn(family, Bytes.toBytes(i), Bytes.toBytes(i));<a name="line.902"></a>
-<span class="sourceLineNo">903</span>        region.put(put);<a name="line.903"></a>
-<span class="sourceLineNo">904</span>        region.flush(true);<a name="line.904"></a>
-<span class="sourceLineNo">905</span>      }<a name="line.905"></a>
-<span class="sourceLineNo">906</span><a name="line.906"></a>
-<span class="sourceLineNo">907</span>      // this will create a region with 3 files<a name="line.907"></a>
-<span class="sourceLineNo">908</span>      assertEquals(3, region.getStore(family).getStorefilesCount());<a name="line.908"></a>
-<span class="sourceLineNo">909</span>      List&lt;Path&gt; storeFiles = new ArrayList&lt;&gt;(3);<a name="line.909"></a>
-<span class="sourceLineNo">910</span>      for (HStoreFile sf : region.getStore(family).getStorefiles()) {<a name="line.910"></a>
-<span class="sourceLineNo">911</span>        storeFiles.add(sf.getPath());<a name="line.911"></a>
-<span class="sourceLineNo">912</span>      }<a name="line.912"></a>
-<span class="sourceLineNo">913</span><a name="line.913"></a>
-<span class="sourceLineNo">914</span>      // disable compaction completion<a name="line.914"></a>
-<span class="sourceLineNo">915</span>      CONF.setBoolean("hbase.hstore.compaction.complete", false);<a name="line.915"></a>
-<span class="sourceLineNo">916</span>      region.compactStores();<a name="line.916"></a>
-<span class="sourceLineNo">917</span><a name="line.917"></a>
-<span class="sourceLineNo">918</span>      // ensure that nothing changed<a name="line.918"></a>
-<span class="sourceLineNo">919</span>      assertEquals(3, region.getStore(family).getStorefilesCount());<a name="line.919"></a>
-<span class="sourceLineNo">920</span><a name="line.920"></a>
-<span class="sourceLineNo">921</span>      // now find the compacted file, and manually add it to the recovered edits<a name="line.921"></a>
-<span class="sourceLineNo">922</span>      Path tmpDir = new Path(region.getRegionFileSystem().getTempDir(), Bytes.toString(family));<a name="line.922"></a>
-<span class="sourceLineNo">923</span>      FileStatus[] files = FSUtils.listStatus(fs, tmpDir);<a name="line.923"></a>
-<span class="sourceLineNo">924</span>      String errorMsg = "Expected to find 1 file in the region temp directory "<a name="line.924"></a>
-<span class="sourceLineNo">925</span>          + "from the compaction, could not find any";<a name="line.925"></a>
-<span class="sourceLineNo">926</span>      assertNotNull(errorMsg, files);<a name="line.926"></a>
-<span class="sourceLineNo">927</span>      assertEquals(errorMsg, 1, files.length);<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      // move the file inside region dir<a name="line.928"></a>
-<span class="sourceLineNo">929</span>      Path newFile = region.getRegionFileSystem().commitStoreFile(Bytes.toString(family),<a name="line.929"></a>
-<span class="sourceLineNo">930</span>          files[0].getPath());<a name="line.930"></a>
-<span class="sourceLineNo">931</span><a name="line.931"></a>
-<span class="sourceLineNo">932</span>      byte[] encodedNameAsBytes = this.region.getRegionInfo().getEncodedNameAsBytes();<a name="line.932"></a>
-<span class="sourceLineNo">933</span>      byte[] fakeEncodedNameAsBytes = new byte [encodedNameAsBytes.length];<a name="line.933"></a>
-<span class="sourceLineNo">934</span>      for (int i=0; i &lt; encodedNameAsBytes.length; i++) {<a name="line.934"></a>
-<span class="sourceLineNo">935</span>        // Mix the byte array to have a new encodedName<a name="line.935"></a>
-<span class="sourceLineNo">936</span>        fakeEncodedNameAsBytes[i] = (byte) (encodedNameAsBytes[i] + 1);<a name="line.936"></a>
-<span class="sourceLineNo">937</span>      }<a name="line.937"></a>
-<span class="sourceLineNo">938</span><a name="line.938"></a>
-<span class="sourceLineNo">939</span>      CompactionDescriptor compactionDescriptor = ProtobufUtil.toCompactionDescriptor(this.region<a name="line.939"></a>
-<span class="sourceLineNo">940</span>        .getRegionInfo(), mismatchedRegionName ? fakeEncodedNameAsBytes : null, family,<a name="line.940"></a>
-<span class="sourceLineNo">941</span>            storeFiles, Lists.newArrayList(newFile),<a name="line.941"></a>
-<span class="sourceLineNo">942</span>            region.getRegionFileSystem().getStoreDir(Bytes.toString(family)));<a name="line.942"></a>
-<span class="sourceLineNo">943</span><a name="line.943"></a>
-<span class="sourceLineNo">944</span>      WALUtil.writeCompactionMarker(region.getWAL(), this.region.getReplicationScope(),<a name="line.944"></a>
-<span class="sourceLineNo">945</span>          this.region.getRegionInfo(), compactionDescriptor, region.getMVCC());<a name="line.945"></a>
-<span class="sourceLineNo">946</span><a name="line.946"></a>
-<span class="sourceLineNo">947</span>      Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.947"></a>
-<span class="sourceLineNo">948</span><a name="line.948"></a>
-<span class="sourceLineNo">949</span>      Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", 1000));<a name="line.949"></a>
-<span class="sourceLineNo">950</span>      fs.create(recoveredEdits);<a name="line.950"></a>
-<span class="sourceLineNo">951</span>      WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.951"></a>
-<span class="sourceLineNo">952</span><a name="line.952"></a>
-<span class="sourceLineNo">953</span>      long time = System.nanoTime();<a name="line.953"></a>
-<span class="sourceLineNo">954</span><a name="line.954"></a>
-<span class="sourceLineNo">955</span>      writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, 10, time,<a name="line.955"></a>
-<span class="sourceLineNo">956</span>          HConstants.DEFAULT_CLUSTER_ID), WALEdit.createCompaction(region.getRegionInfo(),<a name="line.956"></a>
-<span class="sourceLineNo">957</span>          compactionDescriptor)));<a name="line.957"></a>
-<span class="sourceLineNo">958</span>      writer.close();<a name="line.958"></a>
-<span class="sourceLineNo">959</span><a name="line.959"></a>
-<span class="sourceLineNo">960</span>      // close the region now, and reopen again<a name="line.960"></a>
-<span class="sourceLineNo">961</span>      region.getTableDescriptor();<a name="line.961"></a>
-<span class="sourceLineNo">962</span>      region.getRegionInfo();<a name="line.962"></a>
-<span class="sourceLineNo">963</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.963"></a>
-<span class="sourceLineNo">964</span>      try {<a name="line.964"></a>
-<span class="sourceLineNo">965</span>        region = HRegion.openHRegion(region, null);<a name="line.965"></a>
-<span class="sourceLineNo">966</span>      } catch (WrongRegionException wre) {<a name="line.966"></a>
-<span class="sourceLineNo">967</span>        fail("Matching encoded region name should not have produced WrongRegionException");<a name="line.967"></a>
-<span class="sourceLineNo">968</span>      }<a name="line.968"></a>
-<span class="sourceLineNo">969</span><a name="line.969"></a>
-<span class="sourceLineNo">970</span>      // now check whether we have only one store file, the compacted one<a name="line.970"></a>
-<span class="sourceLineNo">971</span>      Collection&lt;HStoreFile&gt; sfs = region.getStore(family).getStorefiles();<a name="line.971"></a>
-<span class="sourceLineNo">972</span>      for (HStoreFile sf : sfs) {<a name="line.972"></a>
-<span class="sourceLineNo">973</span>        LOG.info(Objects.toString(sf.getPath()));<a name="line.973"></a>
-<span class="sourceLineNo">974</span>      }<a name="line.974"></a>
-<span class="sourceLineNo">975</span>      if (!mismatchedRegionName) {<a name="line.975"></a>
-<span class="sourceLineNo">976</span>        assertEquals(1, region.getStore(family).getStorefilesCount());<a name="line.976"></a>
-<span class="sourceLineNo">977</span>      }<a name="line.977"></a>
-<span class="sourceLineNo">978</span>      files = FSUtils.listStatus(fs, tmpDir);<a name="line.978"></a>
-<span class="sourceLineNo">979</span>      assertTrue("Expected to find 0 files inside " + tmpDir, files == null || files.length == 0);<a name="line.979"></a>
-<span class="sourceLineNo">980</span><a name="line.980"></a>
-<span class="sourceLineNo">981</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.981"></a>
-<span class="sourceLineNo">982</span>        Get get = new Get(Bytes.toBytes(i));<a name="line.982"></a>
-<span class="sourceLineNo">983</span>        Result result = region.get(get);<a name="line.983"></a>
-<span class="sourceLineNo">984</span>        byte[] value = result.getValue(family, Bytes.toBytes(i));<a name="line.984"></a>
-<span class="sourceLineNo">985</span>        assertArrayEquals(Bytes.toBytes(i), value);<a name="line.985"></a>
-<span class="sourceLineNo">986</span>      }<a name="line.986"></a>
-<span class="sourceLineNo">987</span>    } finally {<a name="line.987"></a>
-<span class="sourceLineNo">988</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.988"></a>
-<span class="sourceLineNo">989</span>      this.region = null;<a name="line.989"></a>
-<span class="sourceLineNo">990</span>      wals.close();<a name="line.990"></a>
-<span class="sourceLineNo">991</span>      CONF.setClass(HConstants.REGION_IMPL, HRegion.class, Region.class);<a name="line.991"></a>
-<span class="sourceLineNo">992</span>    }<a name="line.992"></a>
-<span class="sourceLineNo">993</span>  }<a name="line.993"></a>
-<span class="sourceLineNo">994</span><a name="line.994"></a>
-<span class="sourceLineNo">995</span>  @Test<a name="line.995"></a>
-<span class="sourceLineNo">996</span>  public void testFlushMarkers() throws Exception {<a name="line.996"></a>
-<span class="sourceLineNo">997</span>    // tests that flush markers are written to WAL and handled at recovered edits<a name="line.997"></a>
-<span class="sourceLineNo">998</span>    byte[] family = Bytes.toBytes("family");<a name="line.998"></a>
-<span class="sourceLineNo">999</span>    Path logDir = TEST_UTIL.getDataTestDirOnTestFS(method + ".log");<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>    final Configuration walConf = new Configuration(TEST_UTIL.getConfiguration());<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>    final WALFactory wals = new WALFactory(walConf, method);<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>    final WAL wal = wals.getWAL(RegionInfoBuilder.newBuilder(tableName).build());<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span><a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>    this.region = initHRegion(tableName, HConstants.EMPTY_START_ROW,<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>      HConstants.EMPTY_END_ROW, false, Durability.USE_DEFAULT, wal, family);<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>    try {<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span><a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>      long maxSeqId = 3;<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>      long minSeqId = 0;<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span><a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>        Put put = new Put(Bytes.toBytes(i));<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>        put.addColumn(family, Bytes.toBytes(i), Bytes.toBytes(i));<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>        region.put(put);<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>        region.flush(true);<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>      }<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span><a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>      // this will create a region with 3 files from flush<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>      assertEquals(3, region.getStore(family).getStorefilesCount());<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>      List&lt;String&gt; storeFiles = new ArrayList&lt;&gt;(3);<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>      for (HStoreFile sf : region.getStore(family).getStorefiles()) {<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>        storeFiles.add(sf.getPath().getName());<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>      }<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span><a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>      // now verify that the flush markers are written<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>      wal.shutdown();<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>      WAL.Reader reader = WALFactory.createReader(fs, AbstractFSWALProvider.getCurrentFileName(wal),<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>        TEST_UTIL.getConfiguration());<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>      try {<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>        List&lt;WAL.Entry&gt; flushDescriptors = new ArrayList&lt;&gt;();<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>        long lastFlushSeqId = -1;<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>        while (true) {<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>          WAL.Entry entry = reader.next();<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>          if (entry == null) {<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>            break;<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>          }<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>          Cell cell = entry.getEdit().getCells().get(0);<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>          if (WALEdit.isMetaEditFamily(cell)) {<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>            FlushDescriptor flushDesc = WALEdit.getFlushDescriptor(cell);<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>            assertNotNull(flushDesc);<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>            assertArrayEquals(tableName.getName(), flushDesc.getTableName().toByteArray());<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>            if (flushDesc.getAction() == FlushAction.START_FLUSH) {<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>              assertTrue(flushDesc.getFlushSequenceNumber() &gt; lastFlushSeqId);<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>            } else if (flushDesc.getAction() == FlushAction.COMMIT_FLUSH) {<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>              assertTrue(flushDesc.getFlushSequenceNumber() == lastFlushSeqId);<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>            }<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>            lastFlushSeqId = flushDesc.getFlushSequenceNumber();<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>            assertArrayEquals(regionName, flushDesc.getEncodedRegionName().toByteArray());<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>            assertEquals(1, flushDesc.getStoreFlushesCount()); //only one store<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>            StoreFlushDescriptor storeFlushDesc = flushDesc.getStoreFlushes(0);<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>            assertArrayEquals(family, storeFlushDesc.getFamilyName().toByteArray());<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>            assertEquals("family", storeFlushDesc.getStoreHomeDir());<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>            if (flushDesc.getAction() == FlushAction.START_FLUSH) {<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>              assertEquals(0, storeFlushDesc.getFlushOutputCount());<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>            } else {<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>              assertEquals(1, storeFlushDesc.getFlushOutputCount()); //only one file from flush<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>              assertTrue(storeFiles.contains(storeFlushDesc.getFlushOutput(0)));<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>            }<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span><a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>            flushDescriptors.add(entry);<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>          }<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>        }<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span><a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>        assertEquals(3 * 2, flushDescriptors.size()); // START_FLUSH and COMMIT_FLUSH per flush<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span><a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>        // now write those markers to the recovered edits again.<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span><a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>        Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span><a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", 1000));<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>        fs.create(recoveredEdits);<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span><a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>        for (WAL.Entry entry : flushDescriptors) {<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>          writer.append(entry);<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>        }<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>        writer.close();<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      } finally {<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>        if (null != reader) {<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>          try {<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>            reader.close();<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>          } catch (IOException exception) {<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>            LOG.warn("Problem closing wal: " + exception.getMessage());<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>            LOG.debug("exception details", exception);<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>          }<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>        }<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>      }<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span><a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>      // close the region now, and reopen again<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>      region = HRegion.openHRegion(region, null);<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span><a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>      // now check whether we have can read back the data from region<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>        Get get = new Get(Bytes.toBytes(i));<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>        Result result = region.get(get);<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>        byte[] value = result.getValue(family, Bytes.toBytes(i));<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>        assertArrayEquals(Bytes.toBytes(i), value);<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>      }<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>    } finally {<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>      this.region = null;<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>      wals.close();<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>    }<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>  }<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span><a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>  static class IsFlushWALMarker implements ArgumentMatcher&lt;WALEdit&gt; {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>    volatile FlushAction[] actions;<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>    public IsFlushWALMarker(FlushAction... actions) {<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>      this.actions = actions;<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>    }<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>    @Override<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>    public boolean matches(WALEdit edit) {<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>      List&lt;Cell&gt; cells = edit.getCells();<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>      if (cells.isEmpty()) {<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>        return false;<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>      }<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>      if (WALEdit.isMetaEditFamily(cells.get(0))) {<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>        FlushDescriptor desc;<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>        try {<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>          desc = WALEdit.getFlushDescriptor(cells.get(0));<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>        } catch (IOException e) {<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>          LOG.warn(e.toString(), e);<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>          return false;<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>        }<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>        if (desc != null) {<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>          for (FlushAction action : actions) {<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>            if (desc.getAction() == action) {<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>              return true;<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>            }<a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>          }<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>        }<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>      }<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>      return false;<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>    }<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>    public IsFlushWALMarker set(FlushAction... actions) {<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>      this.actions = actions;<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>      return this;<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>    }<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>  }<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span><a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>  @Test<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>  public void testFlushMarkersWALFail() throws Exception {<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>    // test the cases where the WAL append for flush markers fail.<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>    byte[] family = Bytes.toBytes("family");<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span><a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>    // spy an actual WAL implementation to throw exception (was not able to mock)<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>    Path logDir = TEST_UTIL.getDataTestDirOnTestFS(method + "log");<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span><a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>    final Configuration walConf = new Configuration(TEST_UTIL.getConfiguration());<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>    // Make up a WAL that we can manipulate at append time.<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    class FailAppendFlushMarkerWAL extends FSHLog {<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>      volatile FlushAction [] flushActions = null;<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span><a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>      public FailAppendFlushMarkerWAL(FileSystem fs, Path root, String logDir, Configuration conf)<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>      throws IOException {<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>        super(fs, root, logDir, conf);<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>      }<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span><a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>      @Override<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>      protected Writer createWriterInstance(Path path) throws IOException {<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>        final Writer w = super.createWriterInstance(path);<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>        return new Writer() {<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>          @Override<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>          public void close() throws IOException {<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>            w.close();<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>          }<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span><a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>          @Override<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>          public void sync(boolean forceSync) throws IOException {<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>            w.sync(forceSync);<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>          }<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span><a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>          @Override<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>          public void append(Entry entry) throws IOException {<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>            List&lt;Cell&gt; cells = entry.getEdit().getCells();<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>            if (WALEdit.isMetaEditFamily(cells.get(0))) {<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>              FlushDescriptor desc = WALEdit.getFlushDescriptor(cells.get(0));<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>              if (desc != null) {<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>                for (FlushAction flushAction: flushActions) {<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>                  if (desc.getAction().equals(flushAction)) {<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>                    throw new IOException("Failed to append flush marker! " + flushAction);<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>                  }<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>                }<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>              }<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>            }<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>            w.append(entry);<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>          }<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span><a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>          @Override<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>          public long getLength() {<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>            return w.getLength();<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>          }<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>        };<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>      }<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>    }<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>    FailAppendFlushMarkerWAL wal =<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>      new FailAppendFlushMarkerWAL(FileSystem.get(walConf), FSUtils.getRootDir(walConf),<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>        method, walConf);<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>    wal.init();<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>    this.region = initHRegion(tableName, HConstants.EMPTY_START_ROW,<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>      HConstants.EMPTY_END_ROW, false, Durability.USE_DEFAULT, wal, family);<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>    int i = 0;<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>    Put put = new Put(Bytes.toBytes(i));<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>    put.setDurability(Durability.SKIP_WAL); // have to skip mocked wal<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>    put.addColumn(family, Bytes.toBytes(i), Bytes.toBytes(i));<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>    region.put(put);<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span><a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>    // 1. Test case where START_FLUSH throws exception<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>    wal.flushActions = new FlushAction [] {FlushAction.START_FLUSH};<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span><a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>    // start cache flush will throw exception<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>    try {<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>      region.flush(true);<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>      fail("This should have thrown exception");<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>    } catch (DroppedSnapshotException unexpected) {<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>      // this should not be a dropped snapshot exception. Meaning that RS will not abort<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>      throw unexpected;<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>    } catch (IOException expected) {<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>      // expected<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>    }<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>    // The WAL is hosed now. It has two edits appended. We cannot roll the log without it<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>    // throwing a DroppedSnapshotException to force an abort. Just clean up the mess.<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>    region.close(true);<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>    wal.close();<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span><a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>    // 2. Test case where START_FLUSH succeeds but COMMIT_FLUSH will throw exception<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>    wal.flushActions = new FlushAction [] {FlushAction.COMMIT_FLUSH};<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>    wal = new FailAppendFlushMarkerWAL(FileSystem.get(walConf), FSUtils.getRootDir(walConf),<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>          method, walConf);<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>    wal.init();<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>    this.region = initHRegion(tableName, HConstants.EMPTY_START_ROW,<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>      HConstants.EMPTY_END_ROW, false, Durability.USE_DEFAULT, wal, family);<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    region.put(put);<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span><a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>    // 3. Test case where ABORT_FLUSH will throw exception.<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>    // Even if ABORT_FLUSH throws exception, we should not fail with IOE, but continue with<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>    // DroppedSnapshotException. Below COMMMIT_FLUSH will cause flush to abort<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>    wal.flushActions = new FlushAction [] {FlushAction.COMMIT_FLUSH, FlushAction.ABORT_FLUSH};<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span><a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>    try {<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>      region.flush(true);<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>      fail("This should have thrown exception");<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>    } catch (DroppedSnapshotException expected) {<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>      // we expect this exception, since we were able to write the snapshot, but failed to<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span>      // write the flush marker to WAL<a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>    } catch (IOException unexpected) {<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>      throw unexpected;<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>    }<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>  }<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span><a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>  @Test<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>  public void testGetWhileRegionClose() throws IOException {<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>    Configuration hc = initSplit();<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>    int numRows = 100;<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>    byte[][] families = { fam1, fam2, fam3 };<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span><a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>    // Setting up region<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>    this.region = initHRegion(tableName, method, hc, families);<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>    // Put data in region<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>    final int startRow = 100;<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>    putData(startRow, numRows, qual1, families);<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>    putData(startRow, numRows, qual2, families);<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>    putData(startRow, numRows, qual3, families);<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    final AtomicBoolean done = new AtomicBoolean(false);<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>    final AtomicInteger gets = new AtomicInteger(0);<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>    GetTillDoneOrException[] threads = new GetTillDoneOrException[10];<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>    try {<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>      // Set ten threads running concurrently getting from the region.<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>      for (int i = 0; i &lt; threads.length / 2; i++) {<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>        threads[i] = new GetTillDoneOrException(i, Bytes.toBytes("" + startRow), done, gets);<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>        threads[i].setDaemon(true);<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>        threads[i].start();<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span>      }<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>      // Artificially make the condition by setting closing flag explicitly.<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>      // I can't make the issue happen with a call to region.close().<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>      this.region.closing.set(true);<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>      for (int i = threads.length / 2; i &lt; threads.length; i++) {<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>        threads[i] = new GetTillDoneOrException(i, Bytes.toBytes("" + startRow), done, gets);<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>        threads[i].setDaemon(true);<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>        threads[i].start();<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>      }<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>    } finally {<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>      if (this.region != null) {<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>        HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>        this.region = null;<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>      }<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>    }<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>    done.set(true);<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>    for (GetTillDoneOrException t : threads) {<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>      try {<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>        t.join();<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>      } catch (InterruptedException e) {<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>        e.printStackTrace();<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>      }<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>      if (t.e != null) {<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>        LOG.info("Exception=" + t.e);<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>        assertFalse("Found a NPE in " + t.getName(), t.e instanceof NullPointerException);<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>      }<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>    }<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>  }<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span><a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>  /*<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>   * Thread that does get on single row until 'done' flag is flipped. If an<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>   * exception causes us to fail, it records it.<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>   */<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>  class GetTillDoneOrException extends Thread {<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>    private final Get g;<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>    private final AtomicBoolean done;<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>    private final AtomicInteger count;<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>    private Exception e;<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span><a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>    GetTillDoneOrException(final int i, final byte[] r, final AtomicBoolean d,<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>        final AtomicInteger c) {<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>      super("getter." + i);<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>      this.g = new Get(r);<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>      this.done = d;<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>      this.count = c;<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>    }<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span><a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    @Override<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span>    public void run() {<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>      while (!this.done.get()) {<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>        try {<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>          assertTrue(region.get(g).size() &gt; 0);<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>          this.count.incrementAndGet();<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>        } catch (Exception e) {<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>          this.e = e;<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>          break;<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>        }<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>      }<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>    }<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>  }<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span><a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>  /*<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>   * An involved filter test. Has multiple column families and deletes in mix.<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>   */<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>  @Test<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>  public void testWeirdCacheBehaviour() throws Exception {<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>    byte[][] FAMILIES = new byte[][] { Bytes.toBytes("trans-blob"), Bytes.toBytes("trans-type"),<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>        Bytes.toBytes("trans-date"), Bytes.toBytes("trans-tags"), Bytes.toBytes("trans-group") };<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>    this.region = initHRegion(tableName, method, CONF, FAMILIES);<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>    String value = "this is the value";<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>    String value2 = "this is some other value";<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>    String keyPrefix1 = "prefix1";<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>    String keyPrefix2 = "prefix2";<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>    String keyPrefix3 = "prefix3";<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>    putRows(this.region, 3, value, keyPrefix1);<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>    putRows(this.region, 3, value, keyPrefix2);<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>    putRows(this.region, 3, value, keyPrefix3);<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>    putRows(this.region, 3, value2, keyPrefix1);<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>    putRows(this.region, 3, value2, keyPrefix2);<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>    putRows(this.region, 3, value2, keyPrefix3);<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>    System.out.println("Checking values for key: " + keyPrefix1);<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>    assertEquals("Got back incorrect number of rows from scan", 3,<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>        getNumberOfRows(keyPrefix1, value2, this.region));<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>    System.out.println("Checking values for key: " + keyPrefix2);<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>    assertEquals("Got back incorrect number of rows from scan", 3,<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>        getNumberOfRows(keyPrefix2, value2, this.region));<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>    System.out.println("Checking values for key: " + keyPrefix3);<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>    assertEquals("Got back incorrect number of rows from scan", 3,<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>        getNumberOfRows(keyPrefix3, value2, this.region));<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>    deleteColumns(this.region, value2, keyPrefix1);<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>    deleteColumns(this.region, value2, keyPrefix2);<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>    deleteColumns(this.region, value2, keyPrefix3);<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>    System.out.println("Starting important checks.....");<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>    assertEquals("Got back incorrect number of rows from scan: " + keyPrefix1, 0,<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>        getNumberOfRows(keyPrefix1, value2, this.region));<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>    assertEquals("Got back incorrect number of rows from scan: " + keyPrefix2, 0,<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>        getNumberOfRows(keyPrefix2, value2, this.region));<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>    assertEquals("Got back incorrect number of rows from scan: " + keyPrefix3, 0,<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>        getNumberOfRows(keyPrefix3, value2, this.region));<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>  }<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span><a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>  @Test<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>  public void testAppendWithReadOnlyTable() throws Exception {<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>    this.region = initHRegion(tableName, method, CONF, true, Bytes.toBytes("somefamily"));<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span>    boolean exceptionCaught = false;<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>    Append append = new Append(Bytes.toBytes("somerow"));<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>    append.setDurability(Durability.SKIP_WAL);<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>    append.addColumn(Bytes.toBytes("somefamily"), Bytes.toBytes("somequalifier"),<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>        Bytes.toBytes("somevalue"));<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>    try {<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>      region.append(append);<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>    } catch (IOException e) {<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>      exceptionCaught = true;<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>    }<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>    assertTrue(exceptionCaught == true);<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>  }<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span><a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>  @Test<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>  public void testIncrWithReadOnlyTable() throws Exception {<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>    this.region = initHRegion(tableName, method, CONF, true, Bytes.toBytes("somefamily"));<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>    boolean exceptionCaught = false;<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>    Increment inc = new Increment(Bytes.toBytes("somerow"));<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>    inc.setDurability(Durability.SKIP_WAL);<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>    inc.addColumn(Bytes.toBytes("somefamily"), Bytes.toBytes("somequalifier"), 1L);<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>    try {<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>      region.increment(inc);<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>    } catch (IOException e) {<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>      exceptionCaught = true;<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>    }<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>    assertTrue(exceptionCaught == true);<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>  }<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span><a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>  private void deleteColumns(HRegion r, String value, String keyPrefix) throws IOException {<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>    InternalScanner scanner = buildScanner(keyPrefix, value, r);<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>    int count = 0;<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>    boolean more = false;<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>    do {<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>      more = scanner.next(results);<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>      if (results != null &amp;&amp; !results.isEmpty())<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>        count++;<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>      else<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>        break;<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>      Delete delete = new Delete(CellUtil.cloneRow(results.get(0)));<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>      delete.addColumn(Bytes.toBytes("trans-tags"), Bytes.toBytes("qual2"));<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>      r.delete(delete);<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>      results.clear();<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>    } while (more);<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>    assertEquals("Did not perform correct number of deletes", 3, count);<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>  }<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span><a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>  private int getNumberOfRows(String keyPrefix, String value, HRegion r) throws Exception {<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>    InternalScanner resultScanner = buildScanner(keyPrefix, value, r);<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>    int numberOfResults = 0;<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>    boolean more = false;<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>    do {<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>      more = resultScanner.next(results);<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>      if (results != null &amp;&amp; !results.isEmpty())<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>        numberOfResults++;<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>      else<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>        break;<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>      for (Cell kv : results) {<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>        System.out.println("kv=" + kv.toString() + ", " + Bytes.toString(CellUtil.cloneValue(kv)));<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>      }<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>      results.clear();<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>    } while (more);<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>    return numberOfResults;<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>  }<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span><a name="line.1451"></a>
-<span class="sourceLineNo">1452</span>  private InternalScanner buildScanner(String keyPrefix, String value, HRegion r)<a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>      throws IOException {<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>    // Defaults FilterList.Operator.MUST_PASS_ALL.<a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>    FilterList allFilters = new FilterList();<a name="line.1455"></a>
-<span class="sourceLineNo">1456</span>    allFilters.addFilter(new PrefixFilter(Bytes.toBytes(keyPrefix)));<a name="line.1456"></a>
-<span class="sourceLineNo">1457</span>    // Only return rows where this column value exists in the row.<a name="line.1457"></a>
-<span class="sourceLineNo">1458</span>    SingleColumnValueFilter filter = new SingleColumnValueFilter(Bytes.toBytes("trans-tags"),<a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>        Bytes.toBytes("qual2"), CompareOperator.EQUAL, Bytes.toBytes(value));<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>    filter.setFilterIfMissing(true);<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>    allFilters.addFilter(filter);<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span>    Scan scan = new Scan();<a name="line.1462"></a>
-<span class="sourceLineNo">1463</span>    scan.addFamily(Bytes.toBytes("trans-blob"));<a name="line.1463"></a>
-<span class="sourceLineNo">1464</span>    scan.addFamily(Bytes.toBytes("trans-type"));<a name="line.1464"></a>
-<span class="sourceLineNo">1465</span>    scan.addFamily(Bytes.toBytes("trans-date"));<a name="line.1465"></a>
-<span class="sourceLineNo">1466</span>    scan.addFamily(Bytes.toBytes("trans-tags"));<a name="line.1466"></a>
-<span class="sourceLineNo">1467</span>    scan.addFamily(Bytes.toBytes("trans-group"));<a name="line.1467"></a>
-<span class="sourceLineNo">1468</span>    scan.setFilter(allFilters);<a name="line.1468"></a>
-<span class="sourceLineNo">1469</span>    return r.getScanner(scan);<a name="line.1469"></a>
-<span class="sourceLineNo">1470</span>  }<a name="line.1470"></a>
-<span class="sourceLineNo">1471</span><a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>  private void putRows(HRegion r, int numRows, String value, String key) throws IOException {<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span>    for (int i = 0; i &lt; numRows; i++) {<a name="line.1473"></a>
-<span class="sourceLineNo">1474</span>      String row = key + "_" + i/* UUID.randomUUID().toString() */;<a name="line.1474"></a>
-<span class="sourceLineNo">1475</span>      System.out.println(String.format("Saving row: %s, with value %s", row, value));<a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>      Put put = new Put(Bytes.toBytes(row));<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>      put.setDurability(Durability.SKIP_WAL);<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span>      put.addColumn(Bytes.toBytes("trans-blob"), null, Bytes.toBytes("value for blob"));<a name="line.1478"></a>
-<span class="sourceLineNo">1479</span>      put.addColumn(Bytes.toBytes("trans-type"), null, Bytes.toBytes("statement"));<a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>      put.addColumn(Bytes.toBytes("trans-date"), null, Bytes.toBytes("20090921010101999"));<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>      put.addColumn(Bytes.toBytes("trans-tags"), Bytes.toBytes("qual2"), Bytes.toBytes(value));<a name="line.1481"></a>
-<span class="sourceLineNo">1482</span>      put.addColumn(Bytes.toBytes("trans-group"), null, Bytes.toBytes("adhocTransactionGroupId"));<a name="line.1482"></a>
-<span class="sourceLineNo">1483</span>      r.put(put);<a name="line.1483"></a>
-<span class="sourceLineNo">1484</span>    }<a name="line.1484"></a>
-<span class="sourceLineNo">1485</span>  }<a name="line.1485"></a>
-<span class="sourceLineNo">1486</span><a name="line.1486"></a>
-<span class="sourceLineNo">1487</span>  @Test<a name="line.1487"></a>
-<span class="sourceLineNo">1488</span>  public void testFamilyWithAndWithoutColon() throws Exception {<a name="line.1488"></a>
-<span class="sourceLineNo">1489</span>    byte[] cf = Bytes.toBytes(COLUMN_FAMILY);<a name="line.1489"></a>
-<span class="sourceLineNo">1490</span>    this.region = initHRegion(tableName, method, CONF, cf);<a name="line.1490"></a>
-<span class="sourceLineNo">1491</span>    Put p = new Put(tableName.toBytes());<a name="line.1491"></a>
-<span class="sourceLineNo">1492</span>    byte[] cfwithcolon = Bytes.toBytes(COLUMN_FAMILY + ":");<a name="line.1492"></a>
-<span class="sourceLineNo">1493</span>    p.addColumn(cfwithcolon, cfwithcolon, cfwithcolon);<a name="line.1493"></a>
-<span class="sourceLineNo">1494</span>    boolean exception = false;<a name="line.1494"></a>
-<span class="sourceLineNo">1495</span>    try {<a name="line.1495"></a>
-<span class="sourceLineNo">1496</span>      this.region.put(p);<a name="line.1496"></a>
-<span class="sourceLineNo">1497</span>    } catch (NoSuchColumnFamilyException e) {<a name="line.1497"></a>
-<span class="sourceLineNo">1498</span>      exception = true;<a name="line.1498"></a>
-<span class="sourceLineNo">1499</span>    }<a name="line.1499"></a>
-<span class="sourceLineNo">1500</span>    assertTrue(exception);<a name="line.1500"></a>
-<span class="sourceLineNo">1501</span>  }<a name="line.1501"></a>
-<span class="sourceLineNo">1502</span><a name="line.1502"></a>
-<span class="sourceLineNo">1503</span>  @Test<a name="line.1503"></a>
-<span class="sourceLineNo">1504</span>  public void testBatchPut_whileNoRowLocksHeld() throws IOException {<a name="line.1504"></a>
-<span class="sourceLineNo">1505</span>    final Put[] puts = new Put[10];<a name="line.1505"></a>
-<span class="sourceLineNo">1506</span>    MetricsWALSource source = CompatibilitySingletonFactory.getInstance(MetricsWALSource.class);<a name="line.1506"></a>
-<span class="sourceLineNo">1507</span>    long syncs = prepareRegionForBachPut(puts, source, false);<a name="line.1507"></a>
-<span class="sourceLineNo">1508</span><a name="line.1508"></a>
-<span class="sourceLineNo">1509</span>    OperationStatus[] codes = this.region.batchMutate(puts);<a name="line.1509"></a>
-<span class="sourceLineNo">1510</span>    assertEquals(10, codes.length);<a name="line.1510"></a>
-<span class="sourceLineNo">1511</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.1511"></a>
-<span class="sourceLineNo">1512</span>      assertEquals(OperationStatusCode.SUCCESS, codes[i].getOperationStatusCode());<a name="line.1512"></a>
-<span class="sourceLineNo">1513</span>    }<a name="line.1513"></a>
-<span class="sourceLineNo">1514</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs + 1, source);<a name="line.1514"></a>
-<span class="sourceLineNo">1515</span><a name="line.1515"></a>
-<span class="sourceLineNo">1516</span>    LOG.info("Next a batch put with one invalid family");<a name="line.1516"></a>
-<span class="sourceLineNo">1517</span>    puts[5].addColumn(Bytes.toBytes("BAD_CF"), qual, value);<a name="line.1517"></a>
-<span class="sourceLineNo">1518</span>    codes = this.region.batchMutate(puts);<a name="line.1518"></a>
-<span class="sourceLineNo">1519</span>    assertEquals(10, codes.length);<a name="line.1519"></a>
-<span class="sourceLineNo">1520</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.1520"></a>
-<span class="sourceLineNo">1521</span>      assertEquals((i == 5) ? OperationStatusCode.BAD_FAMILY : OperationStatusCode.SUCCESS,<a name="line.1521"></a>
-<span class="sourceLineNo">1522</span>          codes[i].getOperationStatusCode());<a name="line.1522"></a>
-<span class="sourceLineNo">1523</span>    }<a name="line.1523"></a>
-<span class="sourceLineNo">1524</span><a name="line.1524"></a>
-<span class="sourceLineNo">1525</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs + 2, source);<a name="line.1525"></a>
-<span class="sourceLineNo">1526</span>  }<a name="line.1526"></a>
-<span class="sourceLineNo">1527</span><a name="line.1527"></a>
-<span class="sourceLineNo">1528</span>  @Test<a name="line.1528"></a>
-<span class="sourceLineNo">1529</span>  public void testBatchPut_whileMultipleRowLocksHeld() throws Exception {<a name="line.1529"></a>
-<span class="sourceLineNo">1530</span>    final Put[] puts = new Put[10];<a name="line.1530"></a>
-<span class="sourceLineNo">1531</span>    MetricsWALSource source = CompatibilitySingletonFactory.getInstance(MetricsWALSource.class);<a name="line.1531"></a>
-<span class="sourceLineNo">1532</span>    long syncs = prepareRegionForBachPut(puts, source, false);<a name="line.1532"></a>
-<span class="sourceLineNo">1533</span><a name="line.1533"></a>
-<span class="sourceLineNo">1534</span>    puts[5].addColumn(Bytes.toBytes("BAD_CF"), qual, value);<a name="line.1534"></a>
-<span class="sourceLineNo">1535</span><a name="line.1535"></a>
-<span class="sourceLineNo">1536</span>    LOG.info("batchPut will have to break into four batches to avoid row locks");<a name="line.1536"></a>
-<span class="sourceLineNo">1537</span>    RowLock rowLock1 = region.getRowLock(Bytes.toBytes("row_2"));<a name="line.1537"></a>
-<span class="sourceLineNo">1538</span>    RowLock rowLock2 = region.getRowLock(Bytes.toBytes("row_1"));<a name="line.1538"></a>
-<span class="sourceLineNo">1539</span>    RowLock rowLock3 = region.getRowLock(Bytes.toBytes("row_3"));<a name="line.1539"></a>
-<span class="sourceLineNo">1540</span>    RowLock rowLock4 = region.getRowLock(Bytes.toBytes("row_3"), true);<a name="line.1540"></a>
-<span class="sourceLineNo">1541</span><a name="line.1541"></a>
-<span class="sourceLineNo">1542</span>    MultithreadedTestUtil.TestContext ctx = new MultithreadedTestUtil.TestContext(CONF);<a name="line.1542"></a>
-<span class="sourceLineNo">1543</span>    final AtomicReference&lt;OperationStatus[]&gt; retFromThread = new AtomicReference&lt;&gt;();<a name="line.1543"></a>
-<span class="sourceLineNo">1544</span>    final CountDownLatch startingPuts = new CountDownLatch(1);<a name="line.1544"></a>
-<span class="sourceLineNo">1545</span>    final CountDownLatch startingClose = new CountDownLatch(1);<a name="line.1545"></a>
-<span class="sourceLineNo">1546</span>    TestThread putter = new TestThread(ctx) {<a name="line.1546"></a>
-<span class="sourceLineNo">1547</span>      @Override<a name="line.1547"></a>
-<span class="sourceLineNo">1548</span>      public void doWork() throws IOException {<a name="line.1548"></a>
-<span class="sourceLineNo">1549</span>        startingPuts.countDown();<a name="line.1549"></a>
-<span class="sourceLineNo">1550</span>        retFromThread.set(region.batchMutate(puts));<a name="line.1550"></a>
-<span class="sourceLineNo">1551</span>      }<a name="line.1551"></a>
-<span class="sourceLineNo">1552</span>    };<a name="line.1552"></a>
-<span class="sourceLineNo">1553</span>    LOG.info("...starting put thread while holding locks");<a name="line.1553"></a>
-<span class="sourceLineNo">1554</span>    ctx.addThread(putter);<a name="line.1554"></a>
-<span class="sourceLineNo">1555</span>    ctx.startThreads();<a name="line.1555"></a>
-<span class="sourceLineNo">1556</span><a name="line.1556"></a>
-<span class="sourceLineNo">1557</span>    // Now attempt to close the region from another thread.  Prior to HBASE-12565<a name="line.1557"></a>
-<span class="sourceLineNo">1558</span>    // this would cause the in-progress batchMutate operation to to fail with<a name="line.1558"></a>
-<span class="sourceLineNo">1559</span>    // exception because it use to release and re-acquire the close-guard lock<a name="line.1559"></a>
-<span class="sourceLineNo">1560</span>    // between batches.  Caller then didn't get status indicating which writes succeeded.<a name="line.1560"></a>
-<span class="sourceLineNo">1561</span>    // We now expect this thread to block until the batchMutate call finishes.<a name="line.1561"></a>
-<span class="sourceLineNo">1562</span>    Thread regionCloseThread = new TestThread(ctx) {<a name="line.1562"></a>
-<span class="sourceLineNo">1563</span>      @Override<a name="line.1563"></a>
-<span class="sourceLineNo">1564</span>      public void doWork() {<a name="line.1564"></a>
-<span class="sourceLineNo">1565</span>        try {<a name="line.1565"></a>
-<span class="sourceLineNo">1566</span>          startingPuts.await();<a name="line.1566"></a>
-<span class="sourceLineNo">1567</span>          // Give some time for the batch mutate to get in.<a name="line.1567"></a>
-<span class="sourceLineNo">1568</span>          // We don't want to race with the mutate<a name="line.1568"></a>
-<span class="sourceLineNo">1569</span>          Thread.sleep(10);<a name="line.1569"></a>
-<span class="sourceLineNo">1570</span>          startingClose.countDown();<a name="line.1570"></a>
-<span class="sourceLineNo">1571</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.1571"></a>
-<span class="sourceLineNo">1572</span>          region = null;<a name="line.1572"></a>
-<span class="sourceLineNo">1573</span>        } catch (IOException e) {<a name="line.1573"></a>
-<span class="sourceLineNo">1574</span>          throw new RuntimeException(e);<a name="line.1574"></a>
-<span class="sourceLineNo">1575</span>        } catch (InterruptedException e) {<a name="line.1575"></a>
-<span class="sourceLineNo">1576</span>          throw new RuntimeException(e);<a name="line.1576"></a>
-<span class="sourceLineNo">1577</span>        }<a name="line.1577"></a>
-<span class="sourceLineNo">1578</span>      }<a name="line.1578"></a>
-<span class="sourceLineNo">1579</span>    };<a name="line.1579"></a>
-<span class="sourceLineNo">1580</span>    regionCloseThread.start();<a name="line.1580"></a>
-<span class="sourceLineNo">1581</span><a name="line.1581"></a>
-<span class="sourceLineNo">1582</span>    startingClose.await();<a name="line.1582"></a>
-<span class="sourceLineNo">1583</span>    startingPuts.await();<a name="line.1583"></a>
-<span class="sourceLineNo">1584</span>    Thread.sleep(100);<a name="line.1584"></a>
-<span class="sourceLineNo">1585</span>    LOG.info("...releasing row lock 1, which should let put thread continue");<a name="line.1585"></a>
-<span class="sourceLineNo">1586</span>    rowLock1.release();<a name="line.1586"></a>
-<span class="sourceLineNo">1587</span>    rowLock2.release();<a name="line.1587"></a>
-<span class="sourceLineNo">1588</span>    rowLock3.release();<a name="line.1588"></a>
-<span class="sourceLineNo">1589</span>    waitForCounter(source, "syncTimeNumOps", syncs + 1);<a name="line.1589"></a>
-<span class="sourceLineNo">1590</span><a name="line.1590"></a>
-<span class="sourceLineNo">1591</span>    LOG.info("...joining on put thread");<a name="line.1591"></a>
-<span class="sourceLineNo">1592</span>    ctx.stop();<a name="line.1592"></a>
-<span class="sourceLineNo">1593</span>    regionCloseThread.join();<a name="line.1593"></a>
-<span class="sourceLineNo">1594</span><a name="line.1594"></a>
-<span class="sourceLineNo">1595</span>    OperationStatus[] codes = retFromThread.get();<a name="line.1595"></a>
-<span class="sourceLineNo">1596</span>    for (int i = 0; i &lt; codes.length; i++) {<a name="line.1596"></a>
-<span class="sourceLineNo">1597</span>      assertEquals((i == 5) ? OperationStatusCode.BAD_FAMILY : OperationStatusCode.SUCCESS,<a name="line.1597"></a>
-<span class="sourceLineNo">1598</span>          codes[i].getOperationStatusCode());<a name="line.1598"></a>
-<span class="sourceLineNo">1599</span>    }<a name="line.1599"></a>
-<span class="sourceLineNo">1600</span>    rowLock4.release();<a name="line.1600"></a>
-<span class="sourceLineNo">1601</span>  }<a name="line.1601"></a>
-<span class="sourceLineNo">1602</span><a name="line.1602"></a>
-<span class="sourceLineNo">1603</span>  private void waitForCounter(MetricsWALSource source, String metricName, long expectedCount)<a name="line.1603"></a>
-<span class="sourceLineNo">1604</span>      throws InterruptedException {<a name="line.1604"></a>
-<span class="sourceLineNo">1605</span>    long startWait = System.currentTimeMillis();<a name="line.1605"></a>
-<span class="sourceLineNo">1606</span>    long currentCount;<a name="line.1606"></a>
-<span class="sourceLineNo">1607</span>    while ((currentCount = metricsAssertHelper.getCounter(metricName, source)) &lt; expectedCount) {<a name="line.1607"></a>
-<span class="sourceLineNo">1608</span>      Thread.sleep(100);<a name="line.1608"></a>
-<span class="sourceLineNo">1609</span>      if (System.currentTimeMillis() - startWait &gt; 10000) {<a name="line.1609"></a>
-<span class="sourceLineNo">1610</span>        fail(String.format("Timed out waiting for '%s' &gt;= '%s', currentCount=%s", metricName,<a name="line.1610"></a>
-<span class="sourceLineNo">1611</span>            expectedCount, currentCount));<a name="line.1611"></a>
-<span class="sourceLineNo">1612</span>      }<a name="line.1612"></a>
-<span class="sourceLineNo">1613</span>    }<a name="line.1613"></a>
-<span class="sourceLineNo">1614</span>  }<a name="line.1614"></a>
-<span class="sourceLineNo">1615</span><a name="line.1615"></a>
-<span class="sourceLineNo">1616</span>  @Test<a name="line.1616"></a>
-<span class="sourceLineNo">1617</span>  public void testAtomicBatchPut() throws IOException {<a name="line.1617"></a>
-<span class="sourceLineNo">1618</span>    final Put[] puts = new Put[10];<a name="line.1618"></a>
-<span class="sourceLineNo">1619</span>    MetricsWALSource source = CompatibilitySingletonFactory.getInstance(MetricsWALSource.class);<a name="line.1619"></a>
-<span class="sourceLineNo">1620</span>    long syncs = prepareRegionForBachPut(puts, source, false);<a name="line.1620"></a>
-<span class="sourceLineNo">1621</span><a name="line.1621"></a>
-<span class="sourceLineNo">1622</span>    // 1. Straight forward case, should succeed<a name="line.1622"></a>
-<span class="sourceLineNo">1623</span>    MutationBatchOperation batchOp = new MutationBatchOperation(region, puts, true,<a name="line.1623"></a>
-<span class="sourceLineNo">1624</span>        HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.1624"></a>
-<span class="sourceLineNo">1625</span>    OperationStatus[] codes = this.region.batchMutate(batchOp);<a name="line.1625"></a>
-<span class="sourceLineNo">1626</span>    assertEquals(10, codes.length);<a name="line.1626"></a>
-<span class="sourceLineNo">1627</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.1627"></a>
-<span class="sourceLineNo">1628</span>      assertEquals(OperationStatusCode.SUCCESS, codes[i].getOperationStatusCode());<a name="line.1628"></a>
-<span class="sourceLineNo">1629</span>    }<a name="line.1629"></a>
-<span class="sourceLineNo">1630</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs + 1, source);<a name="line.1630"></a>
-<span class="sourceLineNo">1631</span><a name="line.1631"></a>
-<span class="sourceLineNo">1632</span>    // 2. Failed to get lock<a name="line.1632"></a>
-<span class="sourceLineNo">1633</span>    RowLock lock = region.getRowLock(Bytes.toBytes("row_" + 3));<a name="line.1633"></a>
-<span class="sourceLineNo">1634</span>    // Method {@link HRegion#getRowLock(byte[])} is reentrant. As 'row_3' is locked in this<a name="line.1634"></a>
-<span class="sourceLineNo">1635</span>    // thread, need to run {@link HRegion#batchMutate(HRegion.BatchOperation)} in different thread<a name="line.1635"></a>
-<span class="sourceLineNo">1636</span>    MultithreadedTestUtil.TestContext ctx = new MultithreadedTestUtil.TestContext(CONF);<a name="line.1636"></a>
-<span class="sourceLineNo">1637</span>    final AtomicReference&lt;IOException&gt; retFromThread = new AtomicReference&lt;&gt;();<a name="line.1637"></a>
-<span class="sourceLineNo">1638</span>    final CountDownLatch finishedPuts = new CountDownLatch(1);<a name="line.1638"></a>
-<span class="sourceLineNo">1639</span>    final MutationBatchOperation finalBatchOp = new MutationBatchOperation(region, puts, true,<a name="line.1639"></a>
-<span class="sourceLineNo">1640</span>        HConstants<a name="line.1640"></a>
-<span class="sourceLineNo">1641</span>        .NO_NONCE,<a name="line.1641"></a>
-<span class="sourceLineNo">1642</span>        HConstants.NO_NONCE);<a name="line.1642"></a>
-<span class="sourceLineNo">1643</span>    TestThread putter = new TestThread(ctx) {<a name="line.1643"></a>
-<span class="sourceLineNo">1644</span>      @Override<a name="line.1644"></a>
-<span class="sourceLineNo">1645</span>      public void doWork() throws IOException {<a name="line.1645"></a>
-<span class="sourceLineNo">1646</span>        try {<a name="line.1646"></a>
-<span class="sourceLineNo">1647</span>          region.batchMutate(finalBatchOp);<a name="line.1647"></a>
-<span class="sourceLineNo">1648</span>        } catch (IOException ioe) {<a name="line.1648"></a>
-<span class="sourceLineNo">1649</span>          LOG.error("test failed!", ioe);<a name="line.1649"></a>
-<span class="sourceLineNo">1650</span>          retFromThread.set(ioe);<a name="line.1650"></a>
-<span class="sourceLineNo">1651</span>        }<a name="line.1651"></a>
-<span class="sourceLineNo">1652</span>        finishedPuts.countDown();<a name="line.1652"></a>
-<span class="sourceLineNo">1653</span>      }<a name="line.1653"></a>
-<span class="sourceLineNo">1654</span>    };<a name="line.1654"></a>
-<span class="sourceLineNo">1655</span>    LOG.info("...starting put thread while holding locks");<a name="line.1655"></a>
-<span class="sourceLineNo">1656</span>    ctx.addThread(putter);<a name="line.1656"></a>
-<span class="sourceLineNo">1657</span>    ctx.startThreads();<a name="line.1657"></a>
-<span class="sourceLineNo">1658</span>    LOG.info("...waiting for batch puts while holding locks");<a name="line.1658"></a>
-<span class="sourceLineNo">1659</span>    try {<a name="line.1659"></a>
-<span class="sourceLineNo">1660</span>      finishedPuts.await();<a name="line.1660"></a>
-<span class="sourceLineNo">1661</span>    } catch (InterruptedException e) {<a name="line.1661"></a>
-<span class="sourceLineNo">1662</span>      LOG.error("Interrupted!", e);<a name="line.1662"></a>
-<span class="sourceLineNo">1663</span>    } finally {<a name="line.1663"></a>
-<span class="sourceLineNo">1664</span>      if (lock != null) {<a name="line.1664"></a>
-<span class="sourceLineNo">1665</span>        lock.release();<a name="line.1665"></a>
-<span class="sourceLineNo">1666</span>      }<a name="line.1666"></a>
-<span class="sourceLineNo">1667</span>    }<a name="line.1667"></a>
-<span class="sourceLineNo">1668</span>    assertNotNull(retFromThread.get());<a name="line.1668"></a>
-<span class="sourceLineNo">1669</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs + 1, source);<a name="line.1669"></a>
-<span class="sourceLineNo">1670</span><a name="line.1670"></a>
-<span class="sourceLineNo">1671</span>    // 3. Exception thrown in validation<a name="line.1671"></a>
-<span class="sourceLineNo">1672</span>    LOG.info("Next a batch put with one invalid family");<a name="line.1672"></a>
-<span class="sourceLineNo">1673</span>    puts[5].addColumn(Bytes.toBytes("BAD_CF"), qual, value);<a name="line.1673"></a>
-<span class="sourceLineNo">1674</span>    batchOp = new MutationBatchOperation(region, puts, true, HConstants.NO_NONCE,<a name="line.1674"></a>
-<span class="sourceLineNo">1675</span>        HConstants.NO_NONCE);<a name="line.1675"></a>
-<span class="sourceLineNo">1676</span>    thrown.expect(NoSuchColumnFamilyException.class);<a name="line.1676"></a>
-<span class="sourceLineNo">1677</span>    this.region.batchMutate(batchOp);<a name="line.1677"></a>
-<span class="sourceLineNo">1678</span>  }<a name="line.1678"></a>
-<span class="sourceLineNo">1679</span><a name="line.1679"></a>
-<span class="sourceLineNo">1680</span>  @Test<a name="line.1680"></a>
-<span class="sourceLineNo">1681</span>  public void testBatchPutWithTsSlop() throws Exception {<a name="line.1681"></a>
-<span class="sourceLineNo">1682</span>    // add data with a timestamp that is too recent for range. Ensure assert<a name="line.1682"></a>
-<span class="sourceLineNo">1683</span>    CONF.setInt("hbase.hregion.keyvalue.timestamp.slop.millisecs", 1000);<a name="line.1683"></a>
-<span class="sourceLineNo">1684</span>    final Put[] puts = new Put[10];<a name="line.1684"></a>
-<span class="sourceLineNo">1685</span>    MetricsWALSource source = CompatibilitySingletonFactory.getInstance(MetricsWALSource.class);<a name="line.1685"></a>
-<span class="sourceLineNo">1686</span><a name="line.1686"></a>
-<span class="sourceLineNo">1687</span>    long syncs = prepareRegionForBachPut(puts, source, true);<a name="line.1687"></a>
-<span class="sourceLineNo">1688</span><a name="line.1688"></a>
-<span class="sourceLineNo">1689</span>    OperationStatus[] codes = this.region.batchMutate(puts);<a name="line.1689"></a>
-<span class="sourceLineNo">1690</span>    assertEquals(10, codes.length);<a name="line.1690"></a>
-<span class="sourceLineNo">1691</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.1691"></a>
-<span class="sourceLineNo">1692</span>      assertEquals(OperationStatusCode.SANITY_CHECK_FAILURE, codes[i].getOperationStatusCode());<a name="line.1692"></a>
-<span class="sourceLineNo">1693</span>    }<a name="line.1693"></a>
-<span class="sourceLineNo">1694</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs, source);<a name="line.1694"></a>
-<span class="sourceLineNo">1695</span>  }<a name="line.1695"></a>
-<span class="sourceLineNo">1696</span><a name="line.1696"></a>
-<span class="sourceLineNo">1697</span>  /**<a name="line.1697"></a>
-<span class="sourceLineNo">1698</span>   * @return syncs initial syncTimeNumOps<a name="line.1698"></a>
-<span class="sourceLineNo">1699</span>   */<a name="line.1699"></a>
-<span class="sourceLineNo">1700</span>  private long prepareRegionForBachPut(final Put[] puts, final MetricsWALSource source,<a name="line.1700"></a>
-<span class="sourceLineNo">1701</span>      boolean slop) throws IOException {<a name="line.1701"></a>
-<span class="sourceLineNo">1702</span>    this.region = initHRegion(tableName, method, CONF, COLUMN_FAMILY_BYTES);<a name="line.1702"></a>
-<span class="sourceLineNo">1703</span><a name="line.1703"></a>
-<span class="sourceLineNo">1704</span>    LOG.info("First a batch put with all valid puts");<a name="line.1704"></a>
-<span class="sourceLineNo">1705</span>    for (int i = 0; i &lt; puts.length; i++) {<a name="line.1705"></a>
-<span class="sourceLineNo">1706</span>      puts[i] = slop ? new Put(Bytes.toBytes("row_" + i), Long.MAX_VALUE - 100) :<a name="line.1706"></a>
-<span class="sourceLineNo">1707</span>          new Put(Bytes.toBytes("row_" + i));<a name="line.1707"></a>
-<span class="sourceLineNo">1708</span>      puts[i].addColumn(COLUMN_FAMILY_BYTES, qual, value);<a name="line.1708"></a>
-<span class="sourceLineNo">1709</span>    }<a name="line.1709"></a>
-<span class="sourceLineNo">1710</span><a name="line.1710"></a>
-<span class="sourceLineNo">1711</span>    long syncs = metricsAssertHelper.getCounter("syncTimeNumOps", source);<a name="line.1711"></a>
-<span class="sourceLineNo">1712</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs, source);<a name="line.1712"></a>
-<span class="sourceLineNo">1713</span>    return syncs;<a name="line.1713"></a>
-<span class="sourceLineNo">1714</span>  }<a name="line.1714"></a>
-<span class="sourceLineNo">1715</span><a name="line.1715"></a>
-<span class="sourceLineNo">1716</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.1716"></a>
-<span class="sourceLineNo">1717</span>  // checkAndMutate tests<a name="line.1717"></a>
-<span class="sourceLineNo">1718</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.1718"></a>
-<span class="sourceLineNo">1719</span>  @Test<a name="line.1719"></a>
-<span class="sourceLineNo">1720</span>  public void testCheckAndMutate_WithEmptyRowValue() throws IOException {<a name="line.1720"></a>
-<span class="sourceLineNo">1721</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1721"></a>
-<span class="sourceLineNo">1722</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1722"></a>
-<span class="sourceLineNo">1723</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1723"></a>
-<span class="sourceLineNo">1724</span>    byte[] emptyVal = new byte[] {};<a name="line.1724"></a>
-<span class="sourceLineNo">1725</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1725"></a>
-<span class="sourceLineNo">1726</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.1726"></a>
-<span class="sourceLineNo">1727</span><a name="line.1727"></a>
-<span class="sourceLineNo">1728</span>    // Setting up region<a name="line.1728"></a>
-<span class="sourceLineNo">1729</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.1729"></a>
-<span class="sourceLineNo">1730</span>    // Putting empty data in key<a name="line.1730"></a>
-<span class="sourceLineNo">1731</span>    Put put = new Put(row1);<a name="line.1731"></a>
-<span class="sourceLineNo">1732</span>    put.addColumn(fam1, qf1, emptyVal);<a name="line.1732"></a>
-<span class="sourceLineNo">1733</span><a name="line.1733"></a>
-<span class="sourceLineNo">1734</span>    // checkAndPut with empty value<a name="line.1734"></a>
-<span class="sourceLineNo">1735</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1735"></a>
-<span class="sourceLineNo">1736</span>        new BinaryComparator(emptyVal), put);<a name="line.1736"></a>
-<span class="sourceLineNo">1737</span>    assertTrue(res);<a name="line.1737"></a>
-<span class="sourceLineNo">1738</span><a name="line.1738"></a>
-<span class="sourceLineNo">1739</span>    // Putting data in key<a name="line.1739"></a>
-<span class="sourceLineNo">1740</span>    put = new Put(row1);<a name="line.1740"></a>
-<span class="sourceLineNo">1741</span>    put.addColumn(fam1, qf1, val1);<a name="line.1741"></a>
-<span class="sourceLineNo">1742</span><a name="line.1742"></a>
-<span class="sourceLineNo">1743</span>    // checkAndPut with correct value<a name="line.1743"></a>
-<span class="sourceLineNo">1744</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1744"></a>
-<span class="sourceLineNo">1745</span>        new BinaryComparator(emptyVal), put);<a name="line.1745"></a>
-<span class="sourceLineNo">1746</span>    assertTrue(res);<a name="line.1746"></a>
-<span class="sourceLineNo">1747</span><a name="line.1747"></a>
-<span class="sourceLineNo">1748</span>    // not empty anymore<a name="line.1748"></a>
-<span class="sourceLineNo">1749</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1749"></a>
-<span class="sourceLineNo">1750</span>        new BinaryComparator(emptyVal), put);<a name="line.1750"></a>
-<span class="sourceLineNo">1751</span>    assertFalse(res);<a name="line.1751"></a>
-<span class="sourceLineNo">1752</span><a name="line.1752"></a>
-<span class="sourceLineNo">1753</span>    Delete delete = new Delete(row1);<a name="line.1753"></a>
-<span class="sourceLineNo">1754</span>    delete.addColumn(fam1, qf1);<a name="line.1754"></a>
-<span class="sourceLineNo">1755</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1755"></a>
-<span class="sourceLineNo">1756</span>        new BinaryComparator(emptyVal), delete);<a name="line.1756"></a>
-<span class="sourceLineNo">1757</span>    assertFalse(res);<a name="line.1757"></a>
-<span class="sourceLineNo">1758</span><a name="line.1758"></a>
-<span class="sourceLineNo">1759</span>    put = new Put(row1);<a name="line.1759"></a>
-<span class="sourceLineNo">1760</span>    put.addColumn(fam1, qf1, val2);<a name="line.1760"></a>
-<span class="sourceLineNo">1761</span>    // checkAndPut with correct value<a name="line.1761"></a>
-<span class="sourceLineNo">1762</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1762"></a>
-<span class="sourceLineNo">1763</span>        new BinaryComparator(val1), put);<a name="line.1763"></a>
-<span class="sourceLineNo">1764</span>    assertTrue(res);<a name="line.1764"></a>
-<span class="sourceLineNo">1765</span><a name="line.1765"></a>
-<span class="sourceLineNo">1766</span>    // checkAndDelete with correct value<a name="line.1766"></a>
-<span class="sourceLineNo">1767</span>    delete = new Delete(row1);<a name="line.1767"></a>
-<span class="sourceLineNo">1768</span>    delete.addColumn(fam1, qf1);<a name="line.1768"></a>
+<span class="sourceLineNo">404</span>    ChunkCreator.initialize(MemStoreLABImpl.CHUNK_SIZE_DEFAULT, false, 0, 0, 0, null);<a name="line.404"></a>
+<span class="sourceLineNo">405</span>    FSHLog hLog = new FSHLog(fs, rootDir, testName, CONF);<a name="line.405"></a>
+<span class="sourceLineNo">406</span>    hLog.init();<a name="line.406"></a>
+<span class="sourceLineNo">407</span>    region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, hLog,<a name="line.407"></a>
+<span class="sourceLineNo">408</span>        COLUMN_FAMILY_BYTES);<a name="line.408"></a>
+<span class="sourceLineNo">409</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.409"></a>
+<span class="sourceLineNo">410</span>    assertEquals(0, region.getMemStoreDataSize());<a name="line.410"></a>
+<span class="sourceLineNo">411</span><a name="line.411"></a>
+<span class="sourceLineNo">412</span>    // Put one value<a name="line.412"></a>
+<span class="sourceLineNo">413</span>    byte [] value = Bytes.toBytes(method);<a name="line.413"></a>
+<span class="sourceLineNo">414</span>    Put put = new Put(value);<a name="line.414"></a>
+<span class="sourceLineNo">415</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    region.put(put);<a name="line.416"></a>
+<span class="sourceLineNo">417</span>    long onePutSize = region.getMemStoreDataSize();<a name="line.417"></a>
+<span class="sourceLineNo">418</span>    assertTrue(onePutSize &gt; 0);<a name="line.418"></a>
+<span class="sourceLineNo">419</span><a name="line.419"></a>
+<span class="sourceLineNo">420</span>    RegionCoprocessorHost mockedCPHost = Mockito.mock(RegionCoprocessorHost.class);<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    doThrow(new IOException())<a name="line.421"></a>
+<span class="sourceLineNo">422</span>       .when(mockedCPHost).postBatchMutate(Mockito.&lt;MiniBatchOperationInProgress&lt;Mutation&gt;&gt;any());<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    region.setCoprocessorHost(mockedCPHost);<a name="line.423"></a>
+<span class="sourceLineNo">424</span><a name="line.424"></a>
+<span class="sourceLineNo">425</span>    put = new Put(value);<a name="line.425"></a>
+<span class="sourceLineNo">426</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("dfg"), value);<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    try {<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      region.put(put);<a name="line.428"></a>
+<span class="sourceLineNo">429</span>      fail("Should have failed with IOException");<a name="line.429"></a>
+<span class="sourceLineNo">430</span>    } catch (IOException expected) {<a name="line.430"></a>
+<span class="sourceLineNo">431</span>    }<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    long expectedSize = onePutSize * 2;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>    assertEquals("memstoreSize should be incremented",<a name="line.433"></a>
+<span class="sourceLineNo">434</span>        expectedSize, region.getMemStoreDataSize());<a name="line.434"></a>
+<span class="sourceLineNo">435</span>    assertEquals("flushable size should be incremented",<a name="line.435"></a>
+<span class="sourceLineNo">436</span>        expectedSize, store.getFlushableSize().getDataSize());<a name="line.436"></a>
+<span class="sourceLineNo">437</span><a name="line.437"></a>
+<span class="sourceLineNo">438</span>    region.setCoprocessorHost(null);<a name="line.438"></a>
+<span class="sourceLineNo">439</span>  }<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>   * A test case of HBASE-21041<a name="line.442"></a>
+<span class="sourceLineNo">443</span>   * @throws Exception Exception<a name="line.443"></a>
+<span class="sourceLineNo">444</span>   */<a name="line.444"></a>
+<span class="sourceLineNo">445</span>  @Test<a name="line.445"></a>
+<span class="sourceLineNo">446</span>  public void testFlushAndMemstoreSizeCounting() throws Exception {<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    byte[] family = Bytes.toBytes("family");<a name="line.447"></a>
+<span class="sourceLineNo">448</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.448"></a>
+<span class="sourceLineNo">449</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.449"></a>
+<span class="sourceLineNo">450</span>    try {<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      for (byte[] row : HBaseTestingUtility.ROWS) {<a name="line.451"></a>
+<span class="sourceLineNo">452</span>        Put put = new Put(row);<a name="line.452"></a>
+<span class="sourceLineNo">453</span>        put.addColumn(family, family, row);<a name="line.453"></a>
+<span class="sourceLineNo">454</span>        region.put(put);<a name="line.454"></a>
+<span class="sourceLineNo">455</span>      }<a name="line.455"></a>
+<span class="sourceLineNo">456</span>      region.flush(true);<a name="line.456"></a>
+<span class="sourceLineNo">457</span>      // After flush, data size should be zero<a name="line.457"></a>
+<span class="sourceLineNo">458</span>      assertEquals(0, region.getMemStoreDataSize());<a name="line.458"></a>
+<span class="sourceLineNo">459</span>      // After flush, a new active mutable segment is created, so the heap size<a name="line.459"></a>
+<span class="sourceLineNo">460</span>      // should equal to MutableSegment.DEEP_OVERHEAD<a name="line.460"></a>
+<span class="sourceLineNo">461</span>      assertEquals(MutableSegment.DEEP_OVERHEAD, region.getMemStoreHeapSize());<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      // After flush, offheap should be zero<a name="line.462"></a>
+<span class="sourceLineNo">463</span>      assertEquals(0, region.getMemStoreOffHeapSize());<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    } finally {<a name="line.464"></a>
+<span class="sourceLineNo">465</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.465"></a>
+<span class="sourceLineNo">466</span>      this.region = null;<a name="line.466"></a>
+<span class="sourceLineNo">467</span>      wals.close();<a name="line.467"></a>
+<span class="sourceLineNo">468</span>    }<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>  /**<a name="line.471"></a>
+<span class="sourceLineNo">472</span>   * Test we do not lose data if we fail a flush and then close.<a name="line.472"></a>
+<span class="sourceLineNo">473</span>   * Part of HBase-10466.  Tests the following from the issue description:<a name="line.473"></a>
+<span class="sourceLineNo">474</span>   * "Bug 1: Wrong calculation of HRegion.memstoreSize: When a flush fails, data to be flushed is<a name="line.474"></a>
+<span class="sourceLineNo">475</span>   * kept in each MemStore's snapshot and wait for next flush attempt to continue on it. But when<a name="line.475"></a>
+<span class="sourceLineNo">476</span>   * the next flush succeeds, the counter of total memstore size in HRegion is always deduced by<a name="line.476"></a>
+<span class="sourceLineNo">477</span>   * the sum of current memstore sizes instead of snapshots left from previous failed flush. This<a name="line.477"></a>
+<span class="sourceLineNo">478</span>   * calculation is problematic that almost every time there is failed flush, HRegion.memstoreSize<a name="line.478"></a>
+<span class="sourceLineNo">479</span>   * gets reduced by a wrong value. If region flush could not proceed for a couple cycles, the size<a name="line.479"></a>
+<span class="sourceLineNo">480</span>   * in current memstore could be much larger than the snapshot. It's likely to drift memstoreSize<a name="line.480"></a>
+<span class="sourceLineNo">481</span>   * much smaller than expected. In extreme case, if the error accumulates to even bigger than<a name="line.481"></a>
+<span class="sourceLineNo">482</span>   * HRegion's memstore size limit, any further flush is skipped because flush does not do anything<a name="line.482"></a>
+<span class="sourceLineNo">483</span>   * if memstoreSize is not larger than 0."<a name="line.483"></a>
+<span class="sourceLineNo">484</span>   * @throws Exception<a name="line.484"></a>
+<span class="sourceLineNo">485</span>   */<a name="line.485"></a>
+<span class="sourceLineNo">486</span>  @Test<a name="line.486"></a>
+<span class="sourceLineNo">487</span>  public void testFlushSizeAccounting() throws Exception {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.488"></a>
+<span class="sourceLineNo">489</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.489"></a>
+<span class="sourceLineNo">490</span>    // Only retry once.<a name="line.490"></a>
+<span class="sourceLineNo">491</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.491"></a>
+<span class="sourceLineNo">492</span>    final User user =<a name="line.492"></a>
+<span class="sourceLineNo">493</span>      User.createUserForTesting(conf, method, new String[]{"foo"});<a name="line.493"></a>
+<span class="sourceLineNo">494</span>    // Inject our faulty LocalFileSystem<a name="line.494"></a>
+<span class="sourceLineNo">495</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.496"></a>
+<span class="sourceLineNo">497</span>      @Override<a name="line.497"></a>
+<span class="sourceLineNo">498</span>      public Object run() throws Exception {<a name="line.498"></a>
+<span class="sourceLineNo">499</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.499"></a>
+<span class="sourceLineNo">500</span>        FileSystem fs = FileSystem.get(conf);<a name="line.500"></a>
+<span class="sourceLineNo">501</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.501"></a>
+<span class="sourceLineNo">502</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.502"></a>
+<span class="sourceLineNo">503</span>        HRegion region = null;<a name="line.503"></a>
+<span class="sourceLineNo">504</span>        try {<a name="line.504"></a>
+<span class="sourceLineNo">505</span>          // Initialize region<a name="line.505"></a>
+<span class="sourceLineNo">506</span>          region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, wal,<a name="line.506"></a>
+<span class="sourceLineNo">507</span>              COLUMN_FAMILY_BYTES);<a name="line.507"></a>
+<span class="sourceLineNo">508</span>          long size = region.getMemStoreDataSize();<a name="line.508"></a>
+<span class="sourceLineNo">509</span>          Assert.assertEquals(0, size);<a name="line.509"></a>
+<span class="sourceLineNo">510</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.510"></a>
+<span class="sourceLineNo">511</span>          Put p1 = new Put(row);<a name="line.511"></a>
+<span class="sourceLineNo">512</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[]) null));<a name="line.512"></a>
+<span class="sourceLineNo">513</span>          region.put(p1);<a name="line.513"></a>
+<span class="sourceLineNo">514</span>          final long sizeOfOnePut = region.getMemStoreDataSize();<a name="line.514"></a>
+<span class="sourceLineNo">515</span>          // Fail a flush which means the current memstore will hang out as memstore 'snapshot'.<a name="line.515"></a>
+<span class="sourceLineNo">516</span>          try {<a name="line.516"></a>
+<span class="sourceLineNo">517</span>            LOG.info("Flushing");<a name="line.517"></a>
+<span class="sourceLineNo">518</span>            region.flush(true);<a name="line.518"></a>
+<span class="sourceLineNo">519</span>            Assert.fail("Didn't bubble up IOE!");<a name="line.519"></a>
+<span class="sourceLineNo">520</span>          } catch (DroppedSnapshotException dse) {<a name="line.520"></a>
+<span class="sourceLineNo">521</span>            // What we are expecting<a name="line.521"></a>
+<span class="sourceLineNo">522</span>            region.closing.set(false); // this is needed for the rest of the test to work<a name="line.522"></a>
+<span class="sourceLineNo">523</span>          }<a name="line.523"></a>
+<span class="sourceLineNo">524</span>          // Make it so all writes succeed from here on out<a name="line.524"></a>
+<span class="sourceLineNo">525</span>          ffs.fault.set(false);<a name="line.525"></a>
+<span class="sourceLineNo">526</span>          // Check sizes.  Should still be the one entry.<a name="line.526"></a>
+<span class="sourceLineNo">527</span>          Assert.assertEquals(sizeOfOnePut, region.getMemStoreDataSize());<a name="line.527"></a>
+<span class="sourceLineNo">528</span>          // Now add two entries so that on this next flush that fails, we can see if we<a name="line.528"></a>
+<span class="sourceLineNo">529</span>          // subtract the right amount, the snapshot size only.<a name="line.529"></a>
+<span class="sourceLineNo">530</span>          Put p2 = new Put(row);<a name="line.530"></a>
+<span class="sourceLineNo">531</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.531"></a>
+<span class="sourceLineNo">532</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.532"></a>
+<span class="sourceLineNo">533</span>          region.put(p2);<a name="line.533"></a>
+<span class="sourceLineNo">534</span>          long expectedSize = sizeOfOnePut * 3;<a name="line.534"></a>
+<span class="sourceLineNo">535</span>          Assert.assertEquals(expectedSize, region.getMemStoreDataSize());<a name="line.535"></a>
+<span class="sourceLineNo">536</span>          // Do a successful flush.  It will clear the snapshot only.  Thats how flushes work.<a name="line.536"></a>
+<span class="sourceLineNo">537</span>          // If already a snapshot, we clear it else we move the memstore to be snapshot and flush<a name="line.537"></a>
+<span class="sourceLineNo">538</span>          // it<a name="line.538"></a>
+<span class="sourceLineNo">539</span>          region.flush(true);<a name="line.539"></a>
+<span class="sourceLineNo">540</span>          // Make sure our memory accounting is right.<a name="line.540"></a>
+<span class="sourceLineNo">541</span>          Assert.assertEquals(sizeOfOnePut * 2, region.getMemStoreDataSize());<a name="line.541"></a>
+<span class="sourceLineNo">542</span>        } finally {<a name="line.542"></a>
+<span class="sourceLineNo">543</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.543"></a>
+<span class="sourceLineNo">544</span>        }<a name="line.544"></a>
+<span class="sourceLineNo">545</span>        return null;<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>    FileSystem.closeAllForUGI(user.getUGI());<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>  @Test<a name="line.551"></a>
+<span class="sourceLineNo">552</span>  public void testCloseWithFailingFlush() throws Exception {<a name="line.552"></a>
+<span class="sourceLineNo">553</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.553"></a>
+<span class="sourceLineNo">554</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.554"></a>
+<span class="sourceLineNo">555</span>    // Only retry once.<a name="line.555"></a>
+<span class="sourceLineNo">556</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.556"></a>
+<span class="sourceLineNo">557</span>    final User user =<a name="line.557"></a>
+<span class="sourceLineNo">558</span>      User.createUserForTesting(conf, this.method, new String[]{"foo"});<a name="line.558"></a>
+<span class="sourceLineNo">559</span>    // Inject our faulty LocalFileSystem<a name="line.559"></a>
+<span class="sourceLineNo">560</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.560"></a>
+<span class="sourceLineNo">561</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.561"></a>
+<span class="sourceLineNo">562</span>      @Override<a name="line.562"></a>
+<span class="sourceLineNo">563</span>      public Object run() throws Exception {<a name="line.563"></a>
+<span class="sourceLineNo">564</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.564"></a>
+<span class="sourceLineNo">565</span>        FileSystem fs = FileSystem.get(conf);<a name="line.565"></a>
+<span class="sourceLineNo">566</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.566"></a>
+<span class="sourceLineNo">567</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.567"></a>
+<span class="sourceLineNo">568</span>        HRegion region = null;<a name="line.568"></a>
+<span class="sourceLineNo">569</span>        try {<a name="line.569"></a>
+<span class="sourceLineNo">570</span>          // Initialize region<a name="line.570"></a>
+<span class="sourceLineNo">571</span>          region = initHRegion(tableName, null, null, false,<a name="line.571"></a>
+<span class="sourceLineNo">572</span>              Durability.SYNC_WAL, wal, COLUMN_FAMILY_BYTES);<a name="line.572"></a>
+<span class="sourceLineNo">573</span>          long size = region.getMemStoreDataSize();<a name="line.573"></a>
+<span class="sourceLineNo">574</span>          Assert.assertEquals(0, size);<a name="line.574"></a>
+<span class="sourceLineNo">575</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.575"></a>
+<span class="sourceLineNo">576</span>          Put p1 = new Put(row);<a name="line.576"></a>
+<span class="sourceLineNo">577</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[])null));<a name="line.577"></a>
+<span class="sourceLineNo">578</span>          region.put(p1);<a name="line.578"></a>
+<span class="sourceLineNo">579</span>          // Manufacture an outstanding snapshot -- fake a failed flush by doing prepare step only.<a name="line.579"></a>
+<span class="sourceLineNo">580</span>          HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.580"></a>
+<span class="sourceLineNo">581</span>          StoreFlushContext storeFlushCtx =<a name="line.581"></a>
+<span class="sourceLineNo">582</span>              store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY);<a name="line.582"></a>
+<span class="sourceLineNo">583</span>          storeFlushCtx.prepare();<a name="line.583"></a>
+<span class="sourceLineNo">584</span>          // Now add two entries to the foreground memstore.<a name="line.584"></a>
+<span class="sourceLineNo">585</span>          Put p2 = new Put(row);<a name="line.585"></a>
+<span class="sourceLineNo">586</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.586"></a>
+<span class="sourceLineNo">587</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.587"></a>
+<span class="sourceLineNo">588</span>          region.put(p2);<a name="line.588"></a>
+<span class="sourceLineNo">589</span>          // Now try close on top of a failing flush.<a name="line.589"></a>
+<span class="sourceLineNo">590</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.590"></a>
+<span class="sourceLineNo">591</span>          region = null;<a name="line.591"></a>
+<span class="sourceLineNo">592</span>          fail();<a name="line.592"></a>
+<span class="sourceLineNo">593</span>        } catch (DroppedSnapshotException dse) {<a name="line.593"></a>
+<span class="sourceLineNo">594</span>          // Expected<a name="line.594"></a>
+<span class="sourceLineNo">595</span>          LOG.info("Expected DroppedSnapshotException");<a name="line.595"></a>
+<span class="sourceLineNo">596</span>        } finally {<a name="line.596"></a>
+<span class="sourceLineNo">597</span>          // Make it so all writes succeed from here on out so can close clean<a name="line.597"></a>
+<span class="sourceLineNo">598</span>          ffs.fault.set(false);<a name="line.598"></a>
+<span class="sourceLineNo">599</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.599"></a>
+<span class="sourceLineNo">600</span>        }<a name="line.600"></a>
+<span class="sourceLineNo">601</span>        return null;<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>    FileSystem.closeAllForUGI(user.getUGI());<a name="line.604"></a>
+<span class="sourceLineNo">605</span>  }<a name="line.605"></a>
+<span class="sourceLineNo">606</span><a name="line.606"></a>
+<span class="sourceLineNo">607</span>  @Test<a name="line.607"></a>
+<span class="sourceLineNo">608</span>  public void testCompactionAffectedByScanners() throws Exception {<a name="line.608"></a>
+<span class="sourceLineNo">609</span>    byte[] family = Bytes.toBytes("family");<a name="line.609"></a>
+<span class="sourceLineNo">610</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.610"></a>
+<span class="sourceLineNo">611</span><a name="line.611"></a>
+<span class="sourceLineNo">612</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.612"></a>
+<span class="sourceLineNo">613</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.613"></a>
+<span class="sourceLineNo">614</span>    region.put(put);<a name="line.614"></a>
+<span class="sourceLineNo">615</span>    region.flush(true);<a name="line.615"></a>
+<span class="sourceLineNo">616</span><a name="line.616"></a>
+<span class="sourceLineNo">617</span>    Scan scan = new Scan();<a name="line.617"></a>
+<span class="sourceLineNo">618</span>    scan.setMaxVersions(3);<a name="line.618"></a>
+<span class="sourceLineNo">619</span>    // open the first scanner<a name="line.619"></a>
+<span class="sourceLineNo">620</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.620"></a>
+<span class="sourceLineNo">621</span><a name="line.621"></a>
+<span class="sourceLineNo">622</span>    Delete delete = new Delete(Bytes.toBytes("r1"));<a name="line.622"></a>
+<span class="sourceLineNo">623</span>    region.delete(delete);<a name="line.623"></a>
+<span class="sourceLineNo">624</span>    region.flush(true);<a name="line.624"></a>
+<span class="sourceLineNo">625</span><a name="line.625"></a>
+<span class="sourceLineNo">626</span>    // open the second scanner<a name="line.626"></a>
+<span class="sourceLineNo">627</span>    RegionScanner scanner2 = region.getScanner(scan);<a name="line.627"></a>
+<span class="sourceLineNo">628</span><a name="line.628"></a>
+<span class="sourceLineNo">629</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.629"></a>
+<span class="sourceLineNo">630</span><a name="line.630"></a>
+<span class="sourceLineNo">631</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.631"></a>
+<span class="sourceLineNo">632</span><a name="line.632"></a>
+<span class="sourceLineNo">633</span>    // make a major compaction<a name="line.633"></a>
+<span class="sourceLineNo">634</span>    region.compact(true);<a name="line.634"></a>
+<span class="sourceLineNo">635</span><a name="line.635"></a>
+<span class="sourceLineNo">636</span>    // open the third scanner<a name="line.636"></a>
+<span class="sourceLineNo">637</span>    RegionScanner scanner3 = region.getScanner(scan);<a name="line.637"></a>
+<span class="sourceLineNo">638</span><a name="line.638"></a>
+<span class="sourceLineNo">639</span>    // get data from scanner 1, 2, 3 after major compaction<a name="line.639"></a>
+<span class="sourceLineNo">640</span>    scanner1.next(results);<a name="line.640"></a>
+<span class="sourceLineNo">641</span>    System.out.println(results);<a name="line.641"></a>
+<span class="sourceLineNo">642</span>    assertEquals(1, results.size());<a name="line.642"></a>
+<span class="sourceLineNo">643</span><a name="line.643"></a>
+<span class="sourceLineNo">644</span>    results.clear();<a name="line.644"></a>
+<span class="sourceLineNo">645</span>    scanner2.next(results);<a name="line.645"></a>
+<span class="sourceLineNo">646</span>    System.out.println(results);<a name="line.646"></a>
+<span class="sourceLineNo">647</span>    assertEquals(0, results.size());<a name="line.647"></a>
+<span class="sourceLineNo">648</span><a name="line.648"></a>
+<span class="sourceLineNo">649</span>    results.clear();<a name="line.649"></a>
+<span class="sourceLineNo">650</span>    scanner3.next(results);<a name="line.650"></a>
+<span class="sourceLineNo">651</span>    System.out.println(results);<a name="line.651"></a>
+<span class="sourceLineNo">652</span>    assertEquals(0, results.size());<a name="line.652"></a>
+<span class="sourceLineNo">653</span>  }<a name="line.653"></a>
+<span class="sourceLineNo">654</span><a name="line.654"></a>
+<span class="sourceLineNo">655</span>  @Test<a name="line.655"></a>
+<span class="sourceLineNo">656</span>  public void testToShowNPEOnRegionScannerReseek() throws Exception {<a name="line.656"></a>
+<span class="sourceLineNo">657</span>    byte[] family = Bytes.toBytes("family");<a name="line.657"></a>
+<span class="sourceLineNo">658</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.658"></a>
+<span class="sourceLineNo">659</span><a name="line.659"></a>
+<span class="sourceLineNo">660</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.660"></a>
+<span class="sourceLineNo">661</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.661"></a>
+<span class="sourceLineNo">662</span>    region.put(put);<a name="line.662"></a>
+<span class="sourceLineNo">663</span>    put = new Put(Bytes.toBytes("r2"));<a name="line.663"></a>
+<span class="sourceLineNo">664</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.664"></a>
+<span class="sourceLineNo">665</span>    region.put(put);<a name="line.665"></a>
+<span class="sourceLineNo">666</span>    region.flush(true);<a name="line.666"></a>
+<span class="sourceLineNo">667</span><a name="line.667"></a>
+<span class="sourceLineNo">668</span>    Scan scan = new Scan();<a name="line.668"></a>
+<span class="sourceLineNo">669</span>    scan.setMaxVersions(3);<a name="line.669"></a>
+<span class="sourceLineNo">670</span>    // open the first scanner<a name="line.670"></a>
+<span class="sourceLineNo">671</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.671"></a>
+<span class="sourceLineNo">672</span><a name="line.672"></a>
+<span class="sourceLineNo">673</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.673"></a>
+<span class="sourceLineNo">674</span><a name="line.674"></a>
+<span class="sourceLineNo">675</span>    region.compact(true);<a name="line.675"></a>
+<span class="sourceLineNo">676</span><a name="line.676"></a>
+<span class="sourceLineNo">677</span>    scanner1.reseek(Bytes.toBytes("r2"));<a name="line.677"></a>
+<span class="sourceLineNo">678</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.678"></a>
+<span class="sourceLineNo">679</span>    scanner1.next(results);<a name="line.679"></a>
+<span class="sourceLineNo">680</span>    Cell keyValue = results.get(0);<a name="line.680"></a>
+<span class="sourceLineNo">681</span>    Assert.assertTrue(Bytes.compareTo(CellUtil.cloneRow(keyValue), Bytes.toBytes("r2")) == 0);<a name="line.681"></a>
+<span class="sourceLineNo">682</span>    scanner1.close();<a name="line.682"></a>
+<span class="sourceLineNo">683</span>  }<a name="line.683"></a>
+<span class="sourceLineNo">684</span><a name="line.684"></a>
+<span class="sourceLineNo">685</span>  @Test<a name="line.685"></a>
+<span class="sourceLineNo">686</span>  public void testSkipRecoveredEditsReplay() throws Exception {<a name="line.686"></a>
+<span class="sourceLineNo">687</span>    byte[] family = Bytes.toBytes("family");<a name="line.687"></a>
+<span class="sourceLineNo">688</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.688"></a>
+<span class="sourceLineNo">689</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.689"></a>
+<span class="sourceLineNo">690</span>    try {<a name="line.690"></a>
+<span class="sourceLineNo">691</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.691"></a>
+<span class="sourceLineNo">692</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.692"></a>
+<span class="sourceLineNo">693</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.693"></a>
+<span class="sourceLineNo">694</span><a name="line.694"></a>
+<span class="sourceLineNo">695</span>      Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.695"></a>
+<span class="sourceLineNo">696</span><a name="line.696"></a>
+<span class="sourceLineNo">697</span>      long maxSeqId = 1050;<a name="line.697"></a>
+<span class="sourceLineNo">698</span>      long minSeqId = 1000;<a name="line.698"></a>
+<span class="sourceLineNo">699</span><a name="line.699"></a>
+<span class="sourceLineNo">700</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.700"></a>
+<span class="sourceLineNo">701</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.701"></a>
+<span class="sourceLineNo">702</span>        fs.create(recoveredEdits);<a name="line.702"></a>
+<span class="sourceLineNo">703</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.703"></a>
+<span class="sourceLineNo">704</span><a name="line.704"></a>
+<span class="sourceLineNo">705</span>        long time = System.nanoTime();<a name="line.705"></a>
+<span class="sourceLineNo">706</span>        WALEdit edit = new WALEdit();<a name="line.706"></a>
+<span class="sourceLineNo">707</span>        edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.707"></a>
+<span class="sourceLineNo">708</span>            .toBytes(i)));<a name="line.708"></a>
+<span class="sourceLineNo">709</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.709"></a>
+<span class="sourceLineNo">710</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.710"></a>
+<span class="sourceLineNo">711</span><a name="line.711"></a>
+<span class="sourceLineNo">712</span>        writer.close();<a name="line.712"></a>
+<span class="sourceLineNo">713</span>      }<a name="line.713"></a>
+<span class="sourceLineNo">714</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.714"></a>
+<span class="sourceLineNo">715</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.715"></a>
+<span class="sourceLineNo">716</span>      for (HStore store : region.getStores()) {<a name="line.716"></a>
+<span class="sourceLineNo">717</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), minSeqId - 1);<a name="line.717"></a>
+<span class="sourceLineNo">718</span>      }<a name="line.718"></a>
+<span class="sourceLineNo">719</span>      long seqId = region.replayRecoveredEditsIfAny(maxSeqIdInStores, null, status);<a name="line.719"></a>
+<span class="sourceLineNo">720</span>      assertEquals(maxSeqId, seqId);<a name="line.720"></a>
+<span class="sourceLineNo">721</span>      region.getMVCC().advanceTo(seqId);<a name="line.721"></a>
+<span class="sourceLineNo">722</span>      Get get = new Get(row);<a name="line.722"></a>
+<span class="sourceLineNo">723</span>      Result result = region.get(get);<a name="line.723"></a>
+<span class="sourceLineNo">724</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.724"></a>
+<span class="sourceLineNo">725</span>        List&lt;Cell&gt; kvs = result.getColumnCells(family, Bytes.toBytes(i));<a name="line.725"></a>
+<span class="sourceLineNo">726</span>        assertEquals(1, kvs.size());<a name="line.726"></a>
+<span class="sourceLineNo">727</span>        assertArrayEquals(Bytes.toBytes(i), CellUtil.cloneValue(kvs.get(0)));<a name="line.727"></a>
+<span class="sourceLineNo">728</span>      }<a name="line.728"></a>
+<span class="sourceLineNo">729</span>    } finally {<a name="line.729"></a>
+<span class="sourceLineNo">730</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.730"></a>
+<span class="sourceLineNo">731</span>      this.region = null;<a name="line.731"></a>
+<span class="sourceLineNo">732</span>      wals.close();<a name="line.732"></a>
+<span class="sourceLineNo">733</span>    }<a name="line.733"></a>
+<span class="sourceLineNo">734</span>  }<a name="line.734"></a>
+<span class="sourceLineNo">735</span><a name="line.735"></a>
+<span class="sourceLineNo">736</span>  @Test<a name="line.736"></a>
+<span class="sourceLineNo">737</span>  public void testSkipRecoveredEditsReplaySomeIgnored() throws Exception {<a name="line.737"></a>
+<span class="sourceLineNo">738</span>    byte[] family = Bytes.toBytes("family");<a name="line.738"></a>
+<span class="sourceLineNo">739</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.739"></a>
+<span class="sourceLineNo">740</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.740"></a>
+<span class="sourceLineNo">741</span>    try {<a name="line.741"></a>
+<span class="sourceLineNo">742</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.742"></a>
+<span class="sourceLineNo">743</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.743"></a>
+<span class="sourceLineNo">744</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.744"></a>
+<span class="sourceLineNo">745</span><a name="line.745"></a>
+<span class="sourceLineNo">746</span>      Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.746"></a>
+<span class="sourceLineNo">747</span><a name="line.747"></a>
+<span class="sourceLineNo">748</span>      long maxSeqId = 1050;<a name="line.748"></a>
+<span class="sourceLineNo">749</span>      long minSeqId = 1000;<a name="line.749"></a>
+<span class="sourceLineNo">750</span><a name="line.750"></a>
+<span class="sourceLineNo">751</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.751"></a>
+<span class="sourceLineNo">752</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.752"></a>
+<span class="sourceLineNo">753</span>        fs.create(recoveredEdits);<a name="line.753"></a>
+<span class="sourceLineNo">754</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.754"></a>
+<span class="sourceLineNo">755</span><a name="line.755"></a>
+<span class="sourceLineNo">756</span>        long time = System.nanoTime();<a name="line.756"></a>
+<span class="sourceLineNo">757</span>        WALEdit edit = new WALEdit();<a name="line.757"></a>
+<span class="sourceLineNo">758</span>        edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.758"></a>
+<span class="sourceLineNo">759</span>            .toBytes(i)));<a name="line.759"></a>
+<span class="sourceLineNo">760</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.760"></a>
+<span class="sourceLineNo">761</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.761"></a>
+<span class="sourceLineNo">762</span><a name="line.762"></a>
+<span class="sourceLineNo">763</span>        writer.close();<a name="line.763"></a>
+<span class="sourceLineNo">764</span>      }<a name="line.764"></a>
+<span class="sourceLineNo">765</span>      long recoverSeqId = 1030;<a name="line.765"></a>
+<span class="sourceLineNo">766</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.766"></a>
+<span class="sourceLineNo">767</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.767"></a>
+<span class="sourceLineNo">768</span>      for (HStore store : region.getStores()) {<a name="line.768"></a>
+<span class="sourceLineNo">769</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), recoverSeqId - 1);<a name="line.769"></a>
+<span class="sourceLineNo">770</span>      }<a name="line.770"></a>
+<span class="sourceLineNo">771</span>      long seqId = region.replayRecoveredEditsIfAny(maxSeqIdInStores, null, status);<a name="line.771"></a>
+<span class="sourceLineNo">772</span>      assertEquals(maxSeqId, seqId);<a name="line.772"></a>
+<span class="sourceLineNo">773</span>      region.getMVCC().advanceTo(seqId);<a name="line.773"></a>
+<span class="sourceLineNo">774</span>      Get get = new Get(row);<a name="line.774"></a>
+<span class="sourceLineNo">775</span>      Result result = region.get(get);<a name="line.775"></a>
+<span class="sourceLineNo">776</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.776"></a>
+<span class="sourceLineNo">777</span>        List&lt;Cell&gt; kvs = result.getColumnCells(family, Bytes.toBytes(i));<a name="line.777"></a>
+<span class="sourceLineNo">778</span>        if (i &lt; recoverSeqId) {<a name="line.778"></a>
+<span class="sourceLineNo">779</span>          assertEquals(0, kvs.size());<a name="line.779"></a>
+<span class="sourceLineNo">780</span>        } else {<a name="line.780"></a>
+<span class="sourceLineNo">781</span>          assertEquals(1, kvs.size());<a name="line.781"></a>
+<span class="sourceLineNo">782</span>          assertArrayEquals(Bytes.toBytes(i), CellUtil.cloneValue(kvs.get(0)));<a name="line.782"></a>
+<span class="sourceLineNo">783</span>        }<a name="line.783"></a>
+<span class="sourceLineNo">784</span>      }<a name="line.784"></a>
+<span class="sourceLineNo">785</span>    } finally {<a name="line.785"></a>
+<span class="sourceLineNo">786</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.786"></a>
+<span class="sourceLineNo">787</span>      this.region = null;<a name="line.787"></a>
+<span class="sourceLineNo">788</span>      wals.close();<a name="line.788"></a>
+<span class="sourceLineNo">789</span>    }<a name="line.789"></a>
+<span class="sourceLineNo">790</span>  }<a name="line.790"></a>
+<span class="sourceLineNo">791</span><a name="line.791"></a>
+<span class="sourceLineNo">792</span>  @Test<a name="line.792"></a>
+<span class="sourceLineNo">793</span>  public void testSkipRecoveredEditsReplayAllIgnored() throws Exception {<a name="line.793"></a>
+<span class="sourceLineNo">794</span>    byte[] family = Bytes.toBytes("family");<a name="line.794"></a>
+<span class="sourceLineNo">795</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.795"></a>
+<span class="sourceLineNo">796</span>    Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.796"></a>
+<span class="sourceLineNo">797</span>    FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.797"></a>
+<span class="sourceLineNo">798</span><a name="line.798"></a>
+<span class="sourceLineNo">799</span>    Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.799"></a>
+<span class="sourceLineNo">800</span>    for (int i = 1000; i &lt; 1050; i += 10) {<a name="line.800"></a>
+<span class="sourceLineNo">801</span>      Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.801"></a>
+<span class="sourceLineNo">802</span>      FSDataOutputStream dos = fs.create(recoveredEdits);<a name="line.802"></a>
+<span class="sourceLineNo">803</span>      dos.writeInt(i);<a name="line.803"></a>
+<span class="sourceLineNo">804</span>      dos.close();<a name="line.804"></a>
+<span class="sourceLineNo">805</span>    }<a name="line.805"></a>
+<span class="sourceLineNo">806</span>    long minSeqId = 2000;<a name="line.806"></a>
+<span class="sourceLineNo">807</span>    Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", minSeqId - 1));<a name="line.807"></a>
+<span class="sourceLineNo">808</span>    FSDataOutputStream dos = fs.create(recoveredEdits);<a name="line.808"></a>
+<span class="sourceLineNo">809</span>    dos.close();<a name="line.809"></a>
+<span class="sourceLineNo">810</span><a name="line.810"></a>
+<span class="sourceLineNo">811</span>    Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.811"></a>
+<span class="sourceLineNo">812</span>    for (HStore store : region.getStores()) {<a name="line.812"></a>
+<span class="sourceLineNo">813</span>      maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), minSeqId);<a name="line.813"></a>
+<span class="sourceLineNo">814</span>    }<a name="line.814"></a>
+<span class="sourceLineNo">815</span>    long seqId = region.replayRecoveredEditsIfAny(maxSeqIdInStores, null, null);<a name="line.815"></a>
+<span class="sourceLineNo">816</span>    assertEquals(minSeqId, seqId);<a name="line.816"></a>
+<span class="sourceLineNo">817</span>  }<a name="line.817"></a>
+<span class="sourceLineNo">818</span><a name="line.818"></a>
+<span class="sourceLineNo">819</span>  @Test<a name="line.819"></a>
+<span class="sourceLineNo">820</span>  public void testSkipRecoveredEditsReplayTheLastFileIgnored() throws Exception {<a name="line.820"></a>
+<span class="sourceLineNo">821</span>    byte[] family = Bytes.toBytes("family");<a name="line.821"></a>
+<span class="sourceLineNo">822</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.822"></a>
+<span class="sourceLineNo">823</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.823"></a>
+<span class="sourceLineNo">824</span>    try {<a name="line.824"></a>
+<span class="sourceLineNo">825</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.825"></a>
+<span class="sourceLineNo">826</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.826"></a>
+<span class="sourceLineNo">827</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.827"></a>
+<span class="sourceLineNo">828</span>      byte[][] columns = region.getTableDescriptor().getColumnFamilyNames().toArray(new byte[0][]);<a name="line.828"></a>
+<span class="sourceLineNo">829</span><a name="line.829"></a>
+<span class="sourceLineNo">830</span>      assertEquals(0, region.getStoreFileList(columns).size());<a name="line.830"></a>
+<span class="sourceLineNo">831</span><a name="line.831"></a>
+<span class="sourceLineNo">832</span>      Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.832"></a>
+<span class="sourceLineNo">833</span><a name="line.833"></a>
+<span class="sourceLineNo">834</span>      long maxSeqId = 1050;<a name="line.834"></a>
+<span class="sourceLineNo">835</span>      long minSeqId = 1000;<a name="line.835"></a>
+<span class="sourceLineNo">836</span><a name="line.836"></a>
+<span class="sourceLineNo">837</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.837"></a>
+<span class="sourceLineNo">838</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.838"></a>
+<span class="sourceLineNo">839</span>        fs.create(recoveredEdits);<a name="line.839"></a>
+<span class="sourceLineNo">840</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.840"></a>
+<span class="sourceLineNo">841</span><a name="line.841"></a>
+<span class="sourceLineNo">842</span>        long time = System.nanoTime();<a name="line.842"></a>
+<span class="sourceLineNo">843</span>        WALEdit edit = null;<a name="line.843"></a>
+<span class="sourceLineNo">844</span>        if (i == maxSeqId) {<a name="line.844"></a>
+<span class="sourceLineNo">845</span>          edit = WALEdit.createCompaction(region.getRegionInfo(),<a name="line.845"></a>
+<span class="sourceLineNo">846</span>          CompactionDescriptor.newBuilder()<a name="line.846"></a>
+<span class="sourceLineNo">847</span>          .setTableName(ByteString.copyFrom(tableName.getName()))<a name="line.847"></a>
+<span class="sourceLineNo">848</span>          .setFamilyName(ByteString.copyFrom(regionName))<a name="line.848"></a>
+<span class="sourceLineNo">849</span>          .setEncodedRegionName(ByteString.copyFrom(regionName))<a name="line.849"></a>
+<span class="sourceLineNo">850</span>          .setStoreHomeDirBytes(ByteString.copyFrom(Bytes.toBytes(regiondir.toString())))<a name="line.850"></a>
+<span class="sourceLineNo">851</span>          .setRegionName(ByteString.copyFrom(region.getRegionInfo().getRegionName()))<a name="line.851"></a>
+<span class="sourceLineNo">852</span>          .build());<a name="line.852"></a>
+<span class="sourceLineNo">853</span>        } else {<a name="line.853"></a>
+<span class="sourceLineNo">854</span>          edit = new WALEdit();<a name="line.854"></a>
+<span class="sourceLineNo">855</span>          edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.855"></a>
+<span class="sourceLineNo">856</span>            .toBytes(i)));<a name="line.856"></a>
+<span class="sourceLineNo">857</span>        }<a name="line.857"></a>
+<span class="sourceLineNo">858</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.858"></a>
+<span class="sourceLineNo">859</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.859"></a>
+<span class="sourceLineNo">860</span>        writer.close();<a name="line.860"></a>
+<span class="sourceLineNo">861</span>      }<a name="line.861"></a>
+<span class="sourceLineNo">862</span><a name="line.862"></a>
+<span class="sourceLineNo">863</span>      long recoverSeqId = 1030;<a name="line.863"></a>
+<span class="sourceLineNo">864</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.864"></a>
+<span class="sourceLineNo">865</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.865"></a>
+<span class="sourceLineNo">866</span>      for (HStore store : region.getStores()) {<a name="line.866"></a>
+<span class="sourceLineNo">867</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), recoverSeqId - 1);<a name="line.867"></a>
+<span class="sourceLineNo">868</span>      }<a name="line.868"></a>
+<span class="sourceLineNo">869</span>      long seqId = region.replayRecoveredEditsIfAny(maxSeqIdInStores, null, status);<a name="line.869"></a>
+<span class="sourceLineNo">870</span>      assertEquals(maxSeqId, seqId);<a name="line.870"></a>
+<span class="sourceLineNo">871</span><a name="line.871"></a>
+<span class="sourceLineNo">872</span>      // assert that the files are flushed<a name="line.872"></a>
+<span class="sourceLineNo">873</span>      assertEquals(1, region.getStoreFileList(columns).size());<a name="line.873"></a>
+<span class="sourceLineNo">874</span><a name="line.874"></a>
+<span class="sourceLineNo">875</span>    } finally {<a name="line.875"></a>
+<span class="sourceLineNo">876</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.876"></a>
+<span class="sourceLineNo">877</span>      this.region = null;<a name="line.877"></a>
+<span class="sourceLineNo">878</span>      wals.close();<a name="line.878"></a>
+<span class="sourceLineNo">879</span>    }<a name="line.879"></a>
+<span class="sourceLineNo">880</span>  }<a name="line.880"></a>
+<span class="sourceLineNo">881</span><a name="line.881"></a>
+<span class="sourceLineNo">882</span>  @Test<a name="line.882"></a>
+<span class="sourceLineNo">883</span>  public void testRecoveredEditsReplayCompaction() throws Exception {<a name="line.883"></a>
+<span class="sourceLineNo">884</span>    testRecoveredEditsReplayCompaction(false);<a name="line.884"></a>
+<span class="sourceLineNo">885</span>    testRecoveredEditsReplayCompaction(true);<a name="line.885"></a>
+<span class="sourceLineNo">886</span>  }<a name="line.886"></a>
+<span class="sourceLineNo">887</span><a name="line.887"></a>
+<span class="sourceLineNo">888</span>  public void testRecoveredEditsReplayCompaction(boolean mismatchedRegionName) throws Exception {<a name="line.888"></a>
+<span class="sourceLineNo">889</span>    CONF.setClass(HConstants.REGION_IMPL, HRegionForTesting.class, Region.class);<a name="line.889"></a>
+<span class="sourceLineNo">890</span>    byte[] family = Bytes.toBytes("family");<a name="line.890"></a>
+<span class="sourceLineNo">891</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.891"></a>
+<span class="sourceLineNo">892</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.892"></a>
+<span class="sourceLineNo">893</span>    try {<a name="line.893"></a>
+<span class="sourceLineNo">894</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.894"></a>
+<span class="sourceLineNo">895</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.895"></a>
+<span class="sourceLineNo">896</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.896"></a>
+<span class="sourceLineNo">897</span><a name="line.897"></a>
+<span class="sourceLineNo">898</span>      long maxSeqId = 3;<a name="line.898"></a>
+<span class="sourceLineNo">899</span>      long minSeqId = 0;<a name="line.899"></a>
+<span class="sourceLineNo">900</span><a name="line.900"></a>
+<span class="sourceLineNo">901</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.901"></a>
+<span class="sourceLineNo">902</span>        Put put = new Put(Bytes.toBytes(i));<a name="line.902"></a>
+<span class="sourceLineNo">903</span>        put.addColumn(family, Bytes.toBytes(i), Bytes.toBytes(i));<a name="line.903"></a>
+<span class="sourceLineNo">904</span>        region.put(put);<a name="line.904"></a>
+<span class="sourceLineNo">905</span>        region.flush(true);<a name="line.905"></a>
+<span class="sourceLineNo">906</span>      }<a name="line.906"></a>
+<span class="sourceLineNo">907</span><a name="line.907"></a>
+<span class="sourceLineNo">908</span>      // this will create a region with 3 files<a name="line.908"></a>
+<span class="sourceLineNo">909</span>      assertEquals(3, region.getStore(family).getStorefilesCount());<a name="line.909"></a>
+<span class="sourceLineNo">910</span>      List&lt;Path&gt; storeFiles = new ArrayList&lt;&gt;(3);<a name="line.910"></a>
+<span class="sourceLineNo">911</span>      for (HStoreFile sf : region.getStore(family).getStorefiles()) {<a name="line.911"></a>
+<span class="sourceLineNo">912</span>        storeFiles.add(sf.getPath());<a name="line.912"></a>
+<span class="sourceLineNo">913</span>      }<a name="line.913"></a>
+<span class="sourceLineNo">914</span><a name="line.914"></a>
+<span class="sourceLineNo">915</span>      // disable compaction completion<a name="line.915"></a>
+<span class="sourceLineNo">916</span>      CONF.setBoolean("hbase.hstore.compaction.complete", false);<a name="line.916"></a>
+<span class="sourceLineNo">917</span>      region.compactStores();<a name="line.917"></a>
+<span class="sourceLineNo">918</span><a name="line.918"></a>
+<span class="sourceLineNo">919</span>      // ensure that nothing changed<a name="line.919"></a>
+<span class="sourceLineNo">920</span>      assertEquals(3, region.getStore(family).getStorefilesCount());<a name="line.920"></a>
+<span class="sourceLineNo">921</span><a name="line.921"></a>
+<span class="sourceLineNo">922</span>      // now find the compacted file, and manually add it to the recovered edits<a name="line.922"></a>
+<span class="sourceLineNo">923</span>      Path tmpDir = new Path(region.getRegionFileSystem().getTempDir(), Bytes.toString(family));<a name="line.923"></a>
+<span class="sourceLineNo">924</span>      FileStatus[] files = FSUtils.listStatus(fs, tmpDir);<a name="line.924"></a>
+<span class="sourceLineNo">925</span>      String errorMsg = "Expected to find 1 file in the region temp directory "<a name="line.925"></a>
+<span class="sourceLineNo">926</span>          + "from the compaction, could not find any";<a name="line.926"></a>
+<span class="sourceLineNo">927</span>      assertNotNull(errorMsg, files);<a name="line.927"></a>
+<span class="sourceLineNo">928</span>      assertEquals(errorMsg, 1, files.length);<a name="line.928"></a>
+<span class="sourceLineNo">929</span>      // move the file inside region dir<a name="line.929"></a>
+<span class="sourceLineNo">930</span>      Path newFile = region.getRegionFileSystem().commitStoreFile(Bytes.toString(family),<a name="line.930"></a>
+<span class="sourceLineNo">931</span>          files[0].getPath());<a name="line.931"></a>
+<span class="sourceLineNo">932</span><a name="line.932"></a>
+<span class="sourceLineNo">933</span>      byte[] encodedNameAsBytes = this.region.getRegionInfo().getEncodedNameAsBytes();<a name="line.933"></a>
+<span class="sourceLineNo">934</span>      byte[] fakeEncodedNameAsBytes = new byte [encodedNameAsBytes.length];<a name="line.934"></a>
+<span class="sourceLineNo">935</span>      for (int i=0; i &lt; encodedNameAsBytes.length; i++) {<a name="line.935"></a>
+<span class="sourceLineNo">936</span>        // Mix the byte array to have a new encodedName<a name="line.936"></a>
+<span class="sourceLineNo">937</span>        fakeEncodedNameAsBytes[i] = (byte) (encodedNameAsBytes[i] + 1);<a name="line.937"></a>
+<span class="sourceLineNo">938</span>      }<a name="line.938"></a>
+<span class="sourceLineNo">939</span><a name="line.939"></a>
+<span class="sourceLineNo">940</span>      CompactionDescriptor compactionDescriptor = ProtobufUtil.toCompactionDescriptor(this.region<a name="line.940"></a>
+<span class="sourceLineNo">941</span>        .getRegionInfo(), mismatchedRegionName ? fakeEncodedNameAsBytes : null, family,<a name="line.941"></a>
+<span class="sourceLineNo">942</span>            storeFiles, Lists.newArrayList(newFile),<a name="line.942"></a>
+<span class="sourceLineNo">943</span>            region.getRegionFileSystem().getStoreDir(Bytes.toString(family)));<a name="line.943"></a>
+<span class="sourceLineNo">944</span><a name="line.944"></a>
+<span class="sourceLineNo">945</span>      WALUtil.writeCompactionMarker(region.getWAL(), this.region.getReplicationScope(),<a name="line.945"></a>
+<span class="sourceLineNo">946</span>          this.region.getRegionInfo(), compactionDescriptor, region.getMVCC());<a name="line.946"></a>
+<span class="sourceLineNo">947</span><a name="line.947"></a>
+<span class="sourceLineNo">948</span>      Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.948"></a>
+<span class="sourceLineNo">949</span><a name="line.949"></a>
+<span class="sourceLineNo">950</span>      Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", 1000));<a name="line.950"></a>
+<span class="sourceLineNo">951</span>      fs.create(recoveredEdits);<a name="line.951"></a>
+<span class="sourceLineNo">952</span>      WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.952"></a>
+<span class="sourceLineNo">953</span><a name="line.953"></a>
+<span class="sourceLineNo">954</span>      long time = System.nanoTime();<a name="line.954"></a>
+<span class="sourceLineNo">955</span><a name="line.955"></a>
+<span class="sourceLineNo">956</span>      writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, 10, time,<a name="line.956"></a>
+<span class="sourceLineNo">957</span>          HConstants.DEFAULT_CLUSTER_ID), WALEdit.createCompaction(region.getRegionInfo(),<a name="line.957"></a>
+<span class="sourceLineNo">958</span>          compactionDescriptor)));<a name="line.958"></a>
+<span class="sourceLineNo">959</span>      writer.close();<a name="line.959"></a>
+<span class="sourceLineNo">960</span><a name="line.960"></a>
+<span class="sourceLineNo">961</span>      // close the region now, and reopen again<a name="line.961"></a>
+<span class="sourceLineNo">962</span>      region.getTableDescriptor();<a name="line.962"></a>
+<span class="sourceLineNo">963</span>      region.getRegionInfo();<a name="line.963"></a>
+<span class="sourceLineNo">964</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.964"></a>
+<span class="sourceLineNo">965</span>      try {<a name="line.965"></a>
+<span class="sourceLineNo">966</span>        region = HRegion.openHRegion(region, null);<a name="line.966"></a>
+<span class="sourceLineNo">967</span>      } catch (WrongRegionException wre) {<a name="line.967"></a>
+<span class="sourceLineNo">968</span>        fail("Matching encoded region name should not have produced WrongRegionException");<a name="line.968"></a>
+<span class="sourceLineNo">969</span>      }<a name="line.969"></a>
+<span class="sourceLineNo">970</span><a name="line.970"></a>
+<span class="sourceLineNo">971</span>      // now check whether we have only one store file, the compacted one<a name="line.971"></a>
+<span class="sourceLineNo">972</span>      Collection&lt;HStoreFile&gt; sfs = region.getStore(family).getStorefiles();<a name="line.972"></a>
+<span class="sourceLineNo">973</span>      for (HStoreFile sf : sfs) {<a name="line.973"></a>
+<span class="sourceLineNo">974</span>        LOG.info(Objects.toString(sf.getPath()));<a name="line.974"></a>
+<span class="sourceLineNo">975</span>      }<a name="line.975"></a>
+<span class="sourceLineNo">976</span>      if (!mismatchedRegionName) {<a name="line.976"></a>
+<span class="sourceLineNo">977</span>        assertEquals(1, region.getStore(family).getStorefilesCount());<a name="line.977"></a>
+<span class="sourceLineNo">978</span>      }<a name="line.978"></a>
+<span class="sourceLineNo">979</span>      files = FSUtils.listStatus(fs, tmpDir);<a name="line.979"></a>
+<span class="sourceLineNo">980</span>      assertTrue("Expected to find 0 files inside " + tmpDir, files == null || files.length == 0);<a name="line.980"></a>
+<span class="sourceLineNo">981</span><a name="line.981"></a>
+<span class="sourceLineNo">982</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.982"></a>
+<span class="sourceLineNo">983</span>        Get get = new Get(Bytes.toBytes(i));<a name="line.983"></a>
+<span class="sourceLineNo">984</span>        Result result = region.get(get);<a name="line.984"></a>
+<span class="sourceLineNo">985</span>        byte[] value = result.getValue(family, Bytes.toBytes(i));<a name="line.985"></a>
+<span class="sourceLineNo">986</span>        assertArrayEquals(Bytes.toBytes(i), value);<a name="line.986"></a>
+<span class="sourceLineNo">987</span>      }<a name="line.987"></a>
+<span class="sourceLineNo">988</span>    } finally {<a name="line.988"></a>
+<span class="sourceLineNo">989</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.989"></a>
+<span class="sourceLineNo">990</span>      this.region = null;<a name="line.990"></a>
+<span class="sourceLineNo">991</span>      wals.close();<a name="line.991"></a>
+<span class="sourceLineNo">992</span>      CONF.setClass(HConstants.REGION_IMPL, HRegion.class, Region.class);<a name="line.992"></a>
+<span class="sourceLineNo">993</span>    }<a name="line.993"></a>
+<span class="sourceLineNo">994</span>  }<a name="line.994"></a>
+<span class="sourceLineNo">995</span><a name="line.995"></a>
+<span class="sourceLineNo">996</span>  @Test<a name="line.996"></a>
+<span class="sourceLineNo">997</span>  public void testFlushMarkers() throws Exception {<a name="line.997"></a>
+<span class="sourceLineNo">998</span>    // tests that flush markers are written to WAL and handled at recovered edits<a name="line.998"></a>
+<span class="sourceLineNo">999</span>    byte[] family = Bytes.toBytes("family");<a name="line.999"></a>
+<span class="sourceLineNo">1000</span>    Path logDir = TEST_UTIL.getDataTestDirOnTestFS(method + ".log");<a name="line.1000"></a>
+<span class="sourceLineNo">1001</span>    final Configuration walConf = new Configuration(TEST_UTIL.getConfiguration());<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.1002"></a>
+<span class="sourceLineNo">1003</span>    final WALFactory wals = new WALFactory(walConf, method);<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span>    final WAL wal = wals.getWAL(RegionInfoBuilder.newBuilder(tableName).build());<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span><a name="line.1005"></a>
+<span class="sourceLineNo">1006</span>    this.region = initHRegion(tableName, HConstants.EMPTY_START_ROW,<a name="line.1006"></a>
+<span class="sourceLineNo">1007</span>      HConstants.EMPTY_END_ROW, false, Durability.USE_DEFAULT, wal, family);<a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>    try {<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span><a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>      long maxSeqId = 3;<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span>      long minSeqId = 0;<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span><a name="line.1015"></a>
+<span class="sourceLineNo">1016</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>        Put put = new Put(Bytes.toBytes(i));<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span>        put.addColumn(family, Bytes.toBytes(i), Bytes.toBytes(i));<a name="line.1018"></a>
+<span class="sourceLineNo">1019</span>        region.put(put);<a name="line.1019"></a>
+<span class="sourceLineNo">1020</span>        region.flush(true);<a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>      }<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span><a name="line.1022"></a>
+<span class="sourceLineNo">1023</span>      // this will create a region with 3 files from flush<a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>      assertEquals(3, region.getStore(family).getStorefilesCount());<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span>      List&lt;String&gt; storeFiles = new ArrayList&lt;&gt;(3);<a name="line.1025"></a>
+<span class="sourceLineNo">1026</span>      for (HStoreFile sf : region.getStore(family).getStorefiles()) {<a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>        storeFiles.add(sf.getPath().getName());<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span>      }<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span><a name="line.1029"></a>
+<span class="sourceLineNo">1030</span>      // now verify that the flush markers are written<a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>      wal.shutdown();<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>      WAL.Reader reader = WALFactory.createReader(fs, AbstractFSWALProvider.getCurrentFileName(wal),<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>        TEST_UTIL.getConfiguration());<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>      try {<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span>        List&lt;WAL.Entry&gt; flushDescriptors = new ArrayList&lt;&gt;();<a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>        long lastFlushSeqId = -1;<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>        while (true) {<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>          WAL.Entry entry = reader.next();<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>          if (entry == null) {<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>            break;<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span>          }<a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>          Cell cell = entry.getEdit().getCells().get(0);<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>          if (WALEdit.isMetaEditFamily(cell)) {<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>            FlushDescriptor flushDesc = WALEdit.getFlushDescriptor(cell);<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span>            assertNotNull(flushDesc);<a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>            assertArrayEquals(tableName.getName(), flushDesc.getTableName().toByteArray());<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>            if (flushDesc.getAction() == FlushAction.START_FLUSH) {<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span>              assertTrue(flushDesc.getFlushSequenceNumber() &gt; lastFlushSeqId);<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span>            } else if (flushDesc.getAction() == FlushAction.COMMIT_FLUSH) {<a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>              assertTrue(flushDesc.getFlushSequenceNumber() == lastFlushSeqId);<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>            }<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>            lastFlushSeqId = flushDesc.getFlushSequenceNumber();<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>            assertArrayEquals(regionName, flushDesc.getEncodedRegionName().toByteArray());<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>            assertEquals(1, flushDesc.getStoreFlushesCount()); //only one store<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>            StoreFlushDescriptor storeFlushDesc = flushDesc.getStoreFlushes(0);<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>            assertArrayEquals(family, storeFlushDesc.getFamilyName().toByteArray());<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span>            assertEquals("family", storeFlushDesc.getStoreHomeDir());<a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>            if (flushDesc.getAction() == FlushAction.START_FLUSH) {<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>              assertEquals(0, storeFlushDesc.getFlushOutputCount());<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>            } else {<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>              assertEquals(1, storeFlushDesc.getFlushOutputCount()); //only one file from flush<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>              assertTrue(storeFiles.contains(storeFlushDesc.getFlushOutput(0)));<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>            }<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span><a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>            flushDescriptors.add(entry);<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>          }<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>        }<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span><a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>        assertEquals(3 * 2, flushDescriptors.size()); // START_FLUSH and COMMIT_FLUSH per flush<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span><a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>        // now write those markers to the recovered edits again.<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span><a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>        Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span><a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", 1000));<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>        fs.create(recoveredEdits);<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span><a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>        for (WAL.Entry entry : flushDescriptors) {<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>          writer.append(entry);<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>        }<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>        writer.close();<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>      } finally {<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>        if (null != reader) {<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>          try {<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>            reader.close();<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>          } catch (IOException exception) {<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>            LOG.warn("Problem closing wal: " + exception.getMessage());<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>            LOG.debug("exception details", exception);<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>          }<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>        }<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>      }<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span><a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>      // close the region now, and reopen again<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>      region = HRegion.openHRegion(region, null);<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span><a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>      // now check whether we have can read back the data from region<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>        Get get = new Get(Bytes.toBytes(i));<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>        Result result = region.get(get);<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>        byte[] value = result.getValue(family, Bytes.toBytes(i));<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>        assertArrayEquals(Bytes.toBytes(i), value);<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>      }<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>    } finally {<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>      this.region = null;<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>      wals.close();<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>    }<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>  }<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span><a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>  static class IsFlushWALMarker implements ArgumentMatcher&lt;WALEdit&gt; {<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>    volatile FlushAction[] actions;<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>    public IsFlushWALMarker(FlushAction... actions) {<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>      this.actions = actions;<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>    }<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span>    @Override<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>    public boolean matches(WALEdit edit) {<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>      List&lt;Cell&gt; cells = edit.getCells();<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>      if (cells.isEmpty()) {<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span>        return false;<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>      }<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>      if (WALEdit.isMetaEditFamily(cells.get(0))) {<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>        FlushDescriptor desc;<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>        try {<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>          desc = WALEdit.getFlushDescriptor(cells.get(0));<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>        } catch (IOException e) {<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>          LOG.warn(e.toString(), e);<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>          return false;<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>        }<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>        if (desc != null) {<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>          for (FlushAction action : actions) {<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>            if (desc.getAction() == action) {<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>              return true;<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>            }<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>          }<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>        }<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>      }<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span>      return false;<a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>    }<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>    public IsFlushWALMarker set(FlushAction... actions) {<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>      this.actions = actions;<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>      return this;<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>    }<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>  }<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span><a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>  @Test<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span>  public void testFlushMarkersWALFail() throws Exception {<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>    // test the cases where the WAL append for flush markers fail.<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>    byte[] family = Bytes.toBytes("family");<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span><a name="line.1151"></a>
+<span class="sourceLineNo">1152</span>    // spy an actual WAL implementation to throw exception (was not able to mock)<a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>    Path logDir = TEST_UTIL.getDataTestDirOnTestFS(method + "log");<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span><a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>    final Configuration walConf = new Configuration(TEST_UTIL.getConfiguration());<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>    // Make up a WAL that we can manipulate at append time.<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>    class FailAppendFlushMarkerWAL extends FSHLog {<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>      volatile FlushAction [] flushActions = null;<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span><a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>      public FailAppendFlushMarkerWAL(FileSystem fs, Path root, String logDir, Configuration conf)<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>      throws IOException {<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>        super(fs, root, logDir, conf);<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>      }<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span><a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>      @Override<a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>      protected Writer createWriterInstance(Path path) throws IOException {<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>        final Writer w = super.createWriterInstance(path);<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>        return new Writer() {<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>          @Override<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>          public void close() throws IOException {<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>            w.close();<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>          }<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span><a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>          @Override<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>          public void sync(boolean forceSync) throws IOException {<a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>            w.sync(forceSync);<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span>          }<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span><a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>          @Override<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>          public void append(Entry entry) throws IOException {<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>            List&lt;Cell&gt; cells = entry.getEdit().getCells();<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>            if (WALEdit.isMetaEditFamily(cells.get(0))) {<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>              FlushDescriptor desc = WALEdit.getFlushDescriptor(cells.get(0));<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>              if (desc != null) {<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>                for (FlushAction flushAction: flushActions) {<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>                  if (desc.getAction().equals(flushAction)) {<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>                    throw new IOException("Failed to append flush marker! " + flushAction);<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>                  }<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>                }<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>              }<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>            }<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>            w.append(entry);<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>          }<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span><a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>          @Override<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>          public long getLength() {<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>            return w.getLength();<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>          }<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>        };<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>      }<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>    }<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>    FailAppendFlushMarkerWAL wal =<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>      new FailAppendFlushMarkerWAL(FileSystem.get(walConf), FSUtils.getRootDir(walConf),<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>        method, walConf);<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>    wal.init();<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>    this.region = initHRegion(tableName, HConstants.EMPTY_START_ROW,<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>      HConstants.EMPTY_END_ROW, false, Durability.USE_DEFAULT, wal, family);<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>    int i = 0;<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>    Put put = new Put(Bytes.toBytes(i));<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>    put.setDurability(Durability.SKIP_WAL); // have to skip mocked wal<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>    put.addColumn(family, Bytes.toBytes(i), Bytes.toBytes(i));<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>    region.put(put);<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span><a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>    // 1. Test case where START_FLUSH throws exception<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>    wal.flushActions = new FlushAction [] {FlushAction.START_FLUSH};<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span><a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>    // start cache flush will throw exception<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>    try {<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>      region.flush(true);<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>      fail("This should have thrown exception");<a name="line.1221"></a>
+<span class="sourceLineNo">1222</span>    } catch (DroppedSnapshotException unexpected) {<a name="line.1222"></a>
+<span class="sourceLineNo">1223</span>      // this should not be a dropped snapshot exception. Meaning that RS will not abort<a name="line.1223"></a>
+<span class="sourceLineNo">1224</span>      throw unexpected;<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span>    } catch (IOException expected) {<a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>      // expected<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span>    }<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>    // The WAL is hosed now. It has two edits appended. We cannot roll the log without it<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>    // throwing a DroppedSnapshotException to force an abort. Just clean up the mess.<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>    region.close(true);<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>    wal.close();<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span><a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>    // 2. Test case where START_FLUSH succeeds but COMMIT_FLUSH will throw exception<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>    wal.flushActions = new FlushAction [] {FlushAction.COMMIT_FLUSH};<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>    wal = new FailAppendFlushMarkerWAL(FileSystem.get(walConf), FSUtils.getRootDir(walConf),<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>          method, walConf);<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>    wal.init();<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span>    this.region = initHRegion(tableName, HConstants.EMPTY_START_ROW,<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>      HConstants.EMPTY_END_ROW, false, Durability.USE_DEFAULT, wal, family);<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>    region.put(put);<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span><a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>    // 3. Test case where ABORT_FLUSH will throw exception.<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span>    // Even if ABORT_FLUSH throws exception, we should not fail with IOE, but continue with<a name="line.1243"></a>
+<span class="sourceLineNo">1244</span>    // DroppedSnapshotException. Below COMMMIT_FLUSH will cause flush to abort<a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>    wal.flushActions = new FlushAction [] {FlushAction.COMMIT_FLUSH, FlushAction.ABORT_FLUSH};<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span><a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>    try {<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span>      region.flush(true);<a name="line.1248"></a>
+<span class="sourceLineNo">1249</span>      fail("This should have thrown exception");<a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>    } catch (DroppedSnapshotException expected) {<a name="line.1250"></a>
+<span class="sourceLineNo">1251</span>      // we expect this exception, since we were able to write the snapshot, but failed to<a name="line.1251"></a>
+<span class="sourceLineNo">1252</span>      // write the flush marker to WAL<a name="line.1252"></a>
+<span class="sourceLineNo">1253</span>    } catch (IOException unexpected) {<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span>      throw unexpected;<a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>    }<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>  }<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span><a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>  @Test<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>  public void testGetWhileRegionClose() throws IOException {<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span>    Configuration hc = initSplit();<a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>    int numRows = 100;<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>    byte[][] families = { fam1, fam2, fam3 };<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span><a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>    // Setting up region<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span>    this.region = initHRegion(tableName, method, hc, families);<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>    // Put data in region<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span>    final int startRow = 100;<a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>    putData(startRow, numRows, qual1, families);<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>    putData(startRow, numRows, qual2, families);<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>    putData(startRow, numRows, qual3, families);<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span>    final AtomicBoolean done = new AtomicBoolean(false);<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>    final AtomicInteger gets = new AtomicInteger(0);<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>    GetTillDoneOrException[] threads = new GetTillDoneOrException[10];<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>    try {<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>      // Set ten threads running concurrently getting from the region.<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span>      for (int i = 0; i &lt; threads.length / 2; i++) {<a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>        threads[i] = new GetTillDoneOrException(i, Bytes.toBytes("" + startRow), done, gets);<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>        threads[i].setDaemon(true);<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>        threads[i].start();<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>      }<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>      // Artificially make the condition by setting closing flag explicitly.<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span>      // I can't make the issue happen with a call to region.close().<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span>      this.region.closing.set(true);<a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>      for (int i = threads.length / 2; i &lt; threads.length; i++) {<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>        threads[i] = new GetTillDoneOrException(i, Bytes.toBytes("" + startRow), done, gets);<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>        threads[i].setDaemon(true);<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>        threads[i].start();<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span>      }<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>    } finally {<a name="line.1289"></a>
+<span class="sourceLineNo">1290</span>      if (this.region != null) {<a name="line.1290"></a>
+<span class="sourceLineNo">1291</span>        HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>        this.region = null;<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>      }<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>    }<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>    done.set(true);<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>    for (GetTillDoneOrException t : threads) {<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span>      try {<a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>        t.join();<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>      } catch (InterruptedException e) {<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>        e.printStackTrace();<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>      }<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>      if (t.e != null) {<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span>        LOG.info("Exception=" + t.e);<a name="line.1303"></a>
+<span class="sourceLineNo">1304</span>        assertFalse("Found a NPE in " + t.getName(), t.e instanceof NullPointerException);<a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>      }<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>    }<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span>  }<a name="line.1307"></a>
+<span class="sourceLineNo">1308</span><a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>  /*<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>   * Thread that does get on single row until 'done' flag is flipped. If an<a name="line.1310"></a>
+<span class="sourceLineNo">1311</span>   * exception causes us to fail, it records it.<a name="line.1311"></a>
+<span class="sourceLineNo">1312</span>   */<a name="line.1312"></a>
+<span class="sourceLineNo">1313</span>  class GetTillDoneOrException extends Thread {<a name="line.1313"></a>
+<span class="sourceLineNo">1314</span>    private final Get g;<a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>    private final AtomicBoolean done;<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>    private final AtomicInteger count;<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>    private Exception e;<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span><a name="line.1318"></a>
+<span class="sourceLineNo">1319</span>    GetTillDoneOrException(final int i, final byte[] r, final AtomicBoolean d,<a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>        final AtomicInteger c) {<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>      super("getter." + i);<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>      this.g = new Get(r);<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>      this.done = d;<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span>      this.count = c;<a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>    }<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span><a name="line.1326"></a>
+<span class="sourceLineNo">1327</span>    @Override<a name="line.1327"></a>
+<span class="sourceLineNo">1328</span>    public void run() {<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>      while (!this.done.get()) {<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span>        try {<a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>          assertTrue(region.get(g).size() &gt; 0);<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>          this.count.incrementAndGet();<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>        } catch (Exception e) {<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>          this.e = e;<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span>          break;<a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>        }<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>      }<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>    }<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>  }<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span><a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>  /*<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>   * An involved filter test. Has multiple column families and deletes in mix.<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>   */<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>  @Test<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>  public void testWeirdCacheBehaviour() throws Exception {<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.1346"></a>
+<span class="sourceLineNo">1347</span>    byte[][] FAMILIES = new byte[][] { Bytes.toBytes("trans-blob"), Bytes.toBytes("trans-type"),<a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>        Bytes.toBytes("trans-date"), Bytes.toBytes("trans-tags"), Bytes.toBytes("trans-group") };<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span>    this.region = initHRegion(tableName, method, CONF, FAMILIES);<a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>    String value = "this is the value";<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>    String value2 = "this is some other value";<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>    String keyPrefix1 = "prefix1";<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>    String keyPrefix2 = "prefix2";<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span>    String keyPrefix3 = "prefix3";<a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>    putRows(this.region, 3, value, keyPrefix1);<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>    putRows(this.region, 3, value, keyPrefix2);<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span>    putRows(this.region, 3, value, keyPrefix3);<a name="line.1357"></a>
+<span class="sourceLineNo">1358</span>    putRows(this.region, 3, value2, keyPrefix1);<a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>    putRows(this.region, 3, value2, keyPrefix2);<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>    putRows(this.region, 3, value2, keyPrefix3);<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span>    System.out.println("Checking values for key: " + keyPrefix1);<a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>    assertEquals("Got back incorrect number of rows from scan", 3,<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>        getNumberOfRows(keyPrefix1, value2, this.region));<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span>    System.out.println("Checking values for key: " + keyPrefix2);<a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>    assertEquals("Got back incorrect number of rows from scan", 3,<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span>        getNumberOfRows(keyPrefix2, value2, this.region));<a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>    System.out.println("Checking values for key: " + keyPrefix3);<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>    assertEquals("Got back incorrect number of rows from scan", 3,<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>        getNumberOfRows(keyPrefix3, value2, this.region));<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>    deleteColumns(this.region, value2, keyPrefix1);<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>    deleteColumns(this.region, value2, keyPrefix2);<a name="line.1371"></a>
+<span class="sourceLineNo">1372</span>    deleteColumns(this.region, value2, keyPrefix3);<a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>    System.out.println("Starting important checks.....");<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>    assertEquals("Got back incorrect number of rows from scan: " + keyPrefix1, 0,<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span>        getNumberOfRows(keyPrefix1, value2, this.region));<a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>    assertEquals("Got back incorrect number of rows from scan: " + keyPrefix2, 0,<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>        getNumberOfRows(keyPrefix2, value2, this.region));<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>    assertEquals("Got back incorrect number of rows from scan: " + keyPrefix3, 0,<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span>        getNumberOfRows(keyPrefix3, value2, this.region));<a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>  }<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span><a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>  @Test<a name="line.1382"></a>
+<span class="sourceLineNo">1383</span>  public void testAppendWithReadOnlyTable() throws Exception {<a name="line.1383"></a>
+<span class="sourceLineNo">1384</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.1384"></a>
+<span class="sourceLineNo">1385</span>    this.region = initHRegion(tableName, method, CONF, true, Bytes.toBytes("somefamily"));<a name="line.1385"></a>
+<span class="sourceLineNo">1386</span>    boolean exceptionCaught = false;<a name="line.1386"></a>
+<span class="sourceLineNo">1387</span>    Append append = new Append(Bytes.toBytes("somerow"));<a name="line.1387"></a>
+<span class="sourceLineNo">1388</span>    append.setDurability(Durability.SKIP_WAL);<a name="line.1388"></a>
+<span class="sourceLineNo">1389</span>    append.addColumn(Bytes.toBytes("somefamily"), Bytes.toBytes("somequalifier"),<a name="line.1389"></a>
+<span class="sourceLineNo">1390</span>        Bytes.toBytes("somevalue"));<a name="line.1390"></a>
+<span class="sourceLineNo">1391</span>    try {<a name="line.1391"></a>
+<span class="sourceLineNo">1392</span>      region.append(append);<a name="line.1392"></a>
+<span class="sourceLineNo">1393</span>    } catch (IOException e) {<a name="line.1393"></a>
+<span class="sourceLineNo">1394</span>      exceptionCaught = true;<a name="line.1394"></a>
+<span class="sourceLineNo">1395</span>    }<a name="line.1395"></a>
+<span class="sourceLineNo">1396</span>    assertTrue(exceptionCaught == true);<a name="line.1396"></a>
+<span class="sourceLineNo">1397</span>  }<a name="line.1397"></a>
+<span class="sourceLineNo">1398</span><a name="line.1398"></a>
+<span class="sourceLineNo">1399</span>  @Test<a name="line.1399"></a>
+<span class="sourceLineNo">1400</span>  public void testIncrWithReadOnlyTable() throws Exception {<a name="line.1400"></a>
+<span class="sourceLineNo">1401</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.1401"></a>
+<span class="sourceLineNo">1402</span>    this.region = initHRegion(tableName, method, CONF, true, Bytes.toBytes("somefamily"));<a name="line.1402"></a>
+<span class="sourceLineNo">1403</span>    boolean exceptionCaught = false;<a name="line.1403"></a>
+<span class="sourceLineNo">1404</span>    Increment inc = new Increment(Bytes.toBytes("somerow"));<a name="line.1404"></a>
+<span class="sourceLineNo">1405</span>    inc.setDurability(Durability.SKIP_WAL);<a name="line.1405"></a>
+<span class="sourceLineNo">1406</span>    inc.addColumn(Bytes.toBytes("somefamily"), Bytes.toBytes("somequalifier"), 1L);<a name="line.1406"></a>
+<span class="sourceLineNo">1407</span>    try {<a name="line.1407"></a>
+<span class="sourceLineNo">1408</span>      region.increment(inc);<a name="line.1408"></a>
+<span class="sourceLineNo">1409</span>    } catch (IOException e) {<a name="line.1409"></a>
+<span class="sourceLineNo">1410</span>      exceptionCaught = true;<a name="line.1410"></a>
+<span class="sourceLineNo">1411</span>    }<a name="line.1411"></a>
+<span class="sourceLineNo">1412</span>    assertTrue(exceptionCaught == true);<a name="line.1412"></a>
+<span class="sourceLineNo">1413</span>  }<a name="line.1413"></a>
+<span class="sourceLineNo">1414</span><a name="line.1414"></a>
+<span class="sourceLineNo">1415</span>  private void deleteColumns(HRegion r, String value, String keyPrefix) throws IOException {<a name="line.1415"></a>
+<span class="sourceLineNo">1416</span>    InternalScanner scanner = buildScanner(keyPrefix, value, r);<a name="line.1416"></a>
+<span class="sourceLineNo">1417</span>    int count = 0;<a name="line.1417"></a>
+<span class="sourceLineNo">1418</span>    boolean more = false;<a name="line.1418"></a>
+<span class="sourceLineNo">1419</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.1419"></a>
+<span class="sourceLineNo">1420</span>    do {<a name="line.1420"></a>
+<span class="sourceLineNo">1421</span>      more = scanner.next(results);<a name="line.1421"></a>
+<span class="sourceLineNo">1422</span>      if (results != null &amp;&amp; !results.isEmpty())<a name="line.1422"></a>
+<span class="sourceLineNo">1423</span>        count++;<a name="line.1423"></a>
+<span class="sourceLineNo">1424</span>      else<a name="line.1424"></a>
+<span class="sourceLineNo">1425</span>        break;<a name="line.1425"></a>
+<span class="sourceLineNo">1426</span>      Delete delete = new Delete(CellUtil.cloneRow(results.get(0)));<a name="line.1426"></a>
+<span class="sourceLineNo">1427</span>      delete.addColumn(Bytes.toBytes("trans-tags"), Bytes.toBytes("qual2"));<a name="line.1427"></a>
+<span class="sourceLineNo">1428</span>      r.delete(delete);<a name="line.1428"></a>
+<span class="sourceLineNo">1429</span>      results.clear();<a name="line.1429"></a>
+<span class="sourceLineNo">1430</span>    } while (more);<a name="line.1430"></a>
+<span class="sourceLineNo">1431</span>    assertEquals("Did not perform correct number of deletes", 3, count);<a name="line.1431"></a>
+<span class="sourceLineNo">1432</span>  }<a name="line.1432"></a>
+<span class="sourceLineNo">1433</span><a name="line.1433"></a>
+<span class="sourceLineNo">1434</span>  private int getNumberOfRows(String keyPrefix, String value, HRegion r) throws Exception {<a name="line.1434"></a>
+<span class="sourceLineNo">1435</span>    InternalScanner resultScanner = buildScanner(keyPrefix, value, r);<a name="line.1435"></a>
+<span class="sourceLineNo">1436</span>    int numberOfResults = 0;<a name="line.1436"></a>
+<span class="sourceLineNo">1437</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.1437"></a>
+<span class="sourceLineNo">1438</span>    boolean more = false;<a name="line.1438"></a>
+<span class="sourceLineNo">1439</span>    do {<a name="line.1439"></a>
+<span class="sourceLineNo">1440</span>      more = resultScanner.next(results);<a name="line.1440"></a>
+<span class="sourceLineNo">1441</span>      if (results != null &amp;&amp; !results.isEmpty())<a name="line.1441"></a>
+<span class="sourceLineNo">1442</span>        numberOfResults++;<a name="line.1442"></a>
+<span class="sourceLineNo">1443</span>      else<a name="line.1443"></a>
+<span class="sourceLineNo">1444</span>        break;<a name="line.1444"></a>
+<span class="sourceLineNo">1445</span>      for (Cell kv : results) {<a name="line.1445"></a>
+<span class="sourceLineNo">1446</span>        System.out.println("kv=" + kv.toString() + ", " + Bytes.toString(CellUtil.cloneValue(kv)));<a name="line.1446"></a>
+<span class="sourceLineNo">1447</span>      }<a name="line.1447"></a>
+<span class="sourceLineNo">1448</span>      results.clear();<a name="line.1448"></a>
+<span class="sourceLineNo">1449</span>    } while (more);<a name="line.1449"></a>
+<span class="sourceLineNo">1450</span>    return numberOfResults;<a name="line.1450"></a>
+<span class="sourceLineNo">1451</span>  }<a name="line.1451"></a>
+<span class="sourceLineNo">1452</span><a name="line.1452"></a>
+<span class="sourceLineNo">1453</span>  private InternalScanner buildScanner(String keyPrefix, String value, HRegion r)<a name="line.1453"></a>
+<span class="sourceLineNo">1454</span>      throws IOException {<a name="line.1454"></a>
+<span class="sourceLineNo">1455</span>    // Defaults FilterList.Operator.MUST_PASS_ALL.<a name="line.1455"></a>
+<span class="sourceLineNo">1456</span>    FilterList allFilters = new FilterList();<a name="line.1456"></a>
+<span class="sourceLineNo">1457</span>    allFilters.addFilter(new PrefixFilter(Bytes.toBytes(keyPrefix)));<a name="line.1457"></a>
+<span class="sourceLineNo">1458</span>    // Only return rows where this column value exists in the row.<a name="line.1458"></a>
+<span class="sourceLineNo">1459</span>    SingleColumnValueFilter filter = new SingleColumnValueFilter(Bytes.toBytes("trans-tags"),<a name="line.1459"></a>
+<span class="sourceLineNo">1460</span>        Bytes.toBytes("qual2"), CompareOperator.EQUAL, Bytes.toBytes(value));<a name="line.1460"></a>
+<span class="sourceLineNo">1461</span>    filter.setFilterIfMissing(true);<a name="line.1461"></a>
+<span class="sourceLineNo">1462</span>    allFilters.addFilter(filter);<a name="line.1462"></a>
+<span class="sourceLineNo">1463</span>    Scan scan = new Scan();<a name="line.1463"></a>
+<span class="sourceLineNo">1464</span>    scan.addFamily(Bytes.toBytes("trans-blob"));<a name="line.1464"></a>
+<span class="sourceLineNo">1465</span>    scan.addFamily(Bytes.toBytes("trans-type"));<a name="line.1465"></a>
+<span class="sourceLineNo">1466</span>    scan.addFamily(Bytes.toBytes("trans-date"));<a name="line.1466"></a>
+<span class="sourceLineNo">1467</span>    scan.addFamily(Bytes.toBytes("trans-tags"));<a name="line.1467"></a>
+<span class="sourceLineNo">1468</span>    scan.addFamily(Bytes.toBytes("trans-group"));<a name="line.1468"></a>
+<span class="sourceLineNo">1469</span>    scan.setFilter(allFilters);<a name="line.1469"></a>
+<span class="sourceLineNo">1470</span>    return r.getScanner(scan);<a name="line.1470"></a>
+<span class="sourceLineNo">1471</span>  }<a name="line.1471"></a>
+<span class="sourceLineNo">1472</span><a name="line.1472"></a>
+<span class="sourceLineNo">1473</span>  private void putRows(HRegion r, int numRows, String value, String key) throws IOException {<a name="line.1473"></a>
+<span class="sourceLineNo">1474</span>    for (int i = 0; i &lt; numRows; i++) {<a name="line.1474"></a>
+<span class="sourceLineNo">1475</span>      String row = key + "_" + i/* UUID.randomUUID().toString() */;<a name="line.1475"></a>
+<span class="sourceLineNo">1476</span>      System.out.println(String.format("Saving row: %s, with value %s", row, value));<a name="line.1476"></a>
+<span class="sourceLineNo">1477</span>      Put put = new Put(Bytes.toBytes(row));<a name="line.1477"></a>
+<span class="sourceLineNo">1478</span>      put.setDurability(Durability.SKIP_WAL);<a name="line.1478"></a>
+<span class="sourceLineNo">1479</span>      put.addColumn(Bytes.toBytes("trans-blob"), null, Bytes.toBytes("value for blob"));<a name="line.1479"></a>
+<span class="sourceLineNo">1480</span>      put.addColumn(Bytes.toBytes("trans-type"), null, Bytes.toBytes("statement"));<a name="line.1480"></a>
+<span class="sourceLineNo">1481</span>      put.addColumn(Bytes.toBytes("trans-date"), null, Bytes.toBytes("20090921010101999"));<a name="line.1481"></a>
+<span class="sourceLineNo">1482</span>      put.addColumn(Bytes.toBytes("trans-tags"), Bytes.toBytes("qual2"), Bytes.toBytes(value));<a name="line.1482"></a>
+<span class="sourceLineNo">1483</span>      put.addColumn(Bytes.toBytes("trans-group"), null, Bytes.toBytes("adhocTransactionGroupId"));<a name="line.1483"></a>
+<span class="sourceLineNo">1484</span>      r.put(put);<a name="line.1484"></a>
+<span class="sourceLineNo">1485</span>    }<a name="line.1485"></a>
+<span class="sourceLineNo">1486</span>  }<a name="line.1486"></a>
+<span class="sourceLineNo">1487</span><a name="line.1487"></a>
+<span class="sourceLineNo">1488</span>  @Test<a name="line.1488"></a>
+<span class="sourceLineNo">1489</span>  public void testFamilyWithAndWithoutColon() throws Exception {<a name="line.1489"></a>
+<span class="sourceLineNo">1490</span>    byte[] cf = Bytes.toBytes(COLUMN_FAMILY);<a name="line.1490"></a>
+<span class="sourceLineNo">1491</span>    this.region = initHRegion(tableName, method, CONF, cf);<a name="line.1491"></a>
+<span class="sourceLineNo">1492</span>    Put p = new Put(tableName.toBytes());<a name="line.1492"></a>
+<span class="sourceLineNo">1493</span>    byte[] cfwithcolon = Bytes.toBytes(COLUMN_FAMILY + ":");<a name="line.1493"></a>
+<span class="sourceLineNo">1494</span>    p.addColumn(cfwithcolon, cfwithcolon, cfwithcolon);<a name="line.1494"></a>
+<span class="sourceLineNo">1495</span>    boolean exception = false;<a name="line.1495"></a>
+<span class="sourceLineNo">1496</span>    try {<a name="line.1496"></a>
+<span class="sourceLineNo">1497</span>      this.region.put(p);<a name="line.1497"></a>
+<span class="sourceLineNo">1498</span>    } catch (NoSuchColumnFamilyException e) {<a name="line.1498"></a>
+<span class="sourceLineNo">1499</span>      exception = true;<a name="line.1499"></a>
+<span class="sourceLineNo">1500</span>    }<a name="line.1500"></a>
+<span class="sourceLineNo">1501</span>    assertTrue(exception);<a name="line.1501"></a>
+<span class="sourceLineNo">1502</span>  }<a name="line.1502"></a>
+<span class="sourceLineNo">1503</span><a name="line.1503"></a>
+<span class="sourceLineNo">1504</span>  @Test<a name="line.1504"></a>
+<span class="sourceLineNo">1505</span>  public void testBatchPut_whileNoRowLocksHeld() throws IOException {<a name="line.1505"></a>
+<span class="sourceLineNo">1506</span>    final Put[] puts = new Put[10];<a name="line.1506"></a>
+<span class="sourceLineNo">1507</span>    MetricsWALSource source = CompatibilitySingletonFactory.getInstance(MetricsWALSource.class);<a name="line.1507"></a>
+<span class="sourceLineNo">1508</span>    long syncs = prepareRegionForBachPut(puts, source, false);<a name="line.1508"></a>
+<span class="sourceLineNo">1509</span><a name="line.1509"></a>
+<span class="sourceLineNo">1510</span>    OperationStatus[] codes = this.region.batchMutate(puts);<a name="line.1510"></a>
+<span class="sourceLineNo">1511</span>    assertEquals(10, codes.length);<a name="line.1511"></a>
+<span class="sourceLineNo">1512</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.1512"></a>
+<span class="sourceLineNo">1513</span>      assertEquals(OperationStatusCode.SUCCESS, codes[i].getOperationStatusCode());<a name="line.1513"></a>
+<span class="sourceLineNo">1514</span>    }<a name="line.1514"></a>
+<span class="sourceLineNo">1515</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs + 1, source);<a name="line.1515"></a>
+<span class="sourceLineNo">1516</span><a name="line.1516"></a>
+<span class="sourceLineNo">1517</span>    LOG.info("Next a batch put with one invalid family");<a name="line.1517"></a>
+<span class="sourceLineNo">1518</span>    puts[5].addColumn(Bytes.toBytes("BAD_CF"), qual, value);<a name="line.1518"></a>
+<span class="sourceLineNo">1519</span>    codes = this.region.batchMutate(puts);<a name="line.1519"></a>
+<span class="sourceLineNo">1520</span>    assertEquals(10, codes.length);<a name="line.1520"></a>
+<span class="sourceLineNo">1521</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.1521"></a>
+<span class="sourceLineNo">1522</span>      assertEquals((i == 5) ? OperationStatusCode.BAD_FAMILY : OperationStatusCode.SUCCESS,<a name="line.1522"></a>
+<span class="sourceLineNo">1523</span>          codes[i].getOperationStatusCode());<a name="line.1523"></a>
+<span class="sourceLineNo">1524</span>    }<a name="line.1524"></a>
+<span class="sourceLineNo">1525</span><a name="line.1525"></a>
+<span class="sourceLineNo">1526</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs + 2, source);<a name="line.1526"></a>
+<span class="sourceLineNo">1527</span>  }<a name="line.1527"></a>
+<span class="sourceLineNo">1528</span><a name="line.1528"></a>
+<span class="sourceLineNo">1529</span>  @Test<a name="line.1529"></a>
+<span class="sourceLineNo">1530</span>  public void testBatchPut_whileMultipleRowLocksHeld() throws Exception {<a name="line.1530"></a>
+<span class="sourceLineNo">1531</span>    final Put[] puts = new Put[10];<a name="line.1531"></a>
+<span class="sourceLineNo">1532</span>    MetricsWALSource source = CompatibilitySingletonFactory.getInstance(MetricsWALSource.class);<a name="line.1532"></a>
+<span class="sourceLineNo">1533</span>    long syncs = prepareRegionForBachPut(puts, source, false);<a name="line.1533"></a>
+<span class="sourceLineNo">1534</span><a name="line.1534"></a>
+<span class="sourceLineNo">1535</span>    puts[5].addColumn(Bytes.toBytes("BAD_CF"), qual, value);<a name="line.1535"></a>
+<span class="sourceLineNo">1536</span><a name="line.1536"></a>
+<span class="sourceLineNo">1537</span>    LOG.info("batchPut will have to break into four batches to avoid row locks");<a name="line.1537"></a>
+<span class="sourceLineNo">1538</span>    RowLock rowLock1 = region.getRowLock(Bytes.toBytes("row_2"));<a name="line.1538"></a>
+<span class="sourceLineNo">1539</span>    RowLock rowLock2 = region.getRowLock(Bytes.toBytes("row_1"));<a name="line.1539"></a>
+<span class="sourceLineNo">1540</span>    RowLock rowLock3 = region.getRowLock(Bytes.toBytes("row_3"));<a name="line.1540"></a>
+<span class="sourceLineNo">1541</span>    RowLock rowLock4 = region.getRowLock(Bytes.toBytes("row_3"), true);<a name="line.1541"></a>
+<span class="sourceLineNo">1542</span><a name="line.1542"></a>
+<span class="sourceLineNo">1543</span>    MultithreadedTestUtil.TestContext ctx = new MultithreadedTestUtil.TestContext(CONF);<a name="line.1543"></a>
+<span class="sourceLineNo">1544</span>    final AtomicReference&lt;OperationStatus[]&gt; retFromThread = new AtomicReference&lt;&gt;();<a name="line.1544"></a>
+<span class="sourceLineNo">1545</span>    final CountDownLatch startingPuts = new CountDownLatch(1);<a name="line.1545"></a>
+<span class="sourceLineNo">1546</span>    final CountDownLatch startingClose = new CountDownLatch(1);<a name="line.1546"></a>
+<span class="sourceLineNo">1547</span>    TestThread putter = new TestThread(ctx) {<a name="line.1547"></a>
+<span class="sourceLineNo">1548</span>      @Override<a name="line.1548"></a>
+<span class="sourceLineNo">1549</span>      public void doWork() throws IOException {<a name="line.1549"></a>
+<span class="sourceLineNo">1550</span>        startingPuts.countDown();<a name="line.1550"></a>
+<span class="sourceLineNo">1551</span>        retFromThread.set(region.batchMutate(puts));<a name="line.1551"></a>
+<span class="sourceLineNo">1552</span>      }<a name="line.1552"></a>
+<span class="sourceLineNo">1553</span>    };<a name="line.1553"></a>
+<span class="sourceLineNo">1554</span>    LOG.info("...starting put thread while holding locks");<a name="line.1554"></a>
+<span class="sourceLineNo">1555</span>    ctx.addThread(putter);<a name="line.1555"></a>
+<span class="sourceLineNo">1556</span>    ctx.startThreads();<a name="line.1556"></a>
+<span class="sourceLineNo">1557</span><a name="line.1557"></a>
+<span class="sourceLineNo">1558</span>    // Now attempt to close the region from another thread.  Prior to HBASE-12565<a name="line.1558"></a>
+<span class="sourceLineNo">1559</span>    // this would cause the in-progress batchMutate operation to to fail with<a name="line.1559"></a>
+<span class="sourceLineNo">1560</span>    // exception because it use to release and re-acquire the close-guard lock<a name="line.1560"></a>
+<span class="sourceLineNo">1561</span>    // between batches.  Caller then didn't get status indicating which writes succeeded.<a name="line.1561"></a>
+<span class="sourceLineNo">1562</span>    // We now expect this thread to block until the batchMutate call finishes.<a name="line.1562"></a>
+<span class="sourceLineNo">1563</span>    Thread regionCloseThread = new TestThread(ctx) {<a name="line.1563"></a>
+<span class="sourceLineNo">1564</span>      @Override<a name="line.1564"></a>
+<span class="sourceLineNo">1565</span>      public void doWork() {<a name="line.1565"></a>
+<span class="sourceLineNo">1566</span>        try {<a name="line.1566"></a>
+<span class="sourceLineNo">1567</span>          startingPuts.await();<a name="line.1567"></a>
+<span class="sourceLineNo">1568</span>          // Give some time for the batch mutate to get in.<a name="line.1568"></a>
+<span class="sourceLineNo">1569</span>          // We don't want to race with the mutate<a name="line.1569"></a>
+<span class="sourceLineNo">1570</span>          Thread.sleep(10);<a name="line.1570"></a>
+<span class="sourceLineNo">1571</span>          startingClose.countDown();<a name="line.1571"></a>
+<span class="sourceLineNo">1572</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.1572"></a>
+<span class="sourceLineNo">1573</span>          region = null;<a name="line.1573"></a>
+<span class="sourceLineNo">1574</span>        } catch (IOException e) {<a name="line.1574"></a>
+<span class="sourceLineNo">1575</span>          throw new RuntimeException(e);<a name="line.1575"></a>
+<span class="sourceLineNo">1576</span>        } catch (InterruptedException e) {<a name="line.1576"></a>
+<span class="sourceLineNo">1577</span>          throw new RuntimeException(e);<a name="line.1577"></a>
+<span class="sourceLineNo">1578</span>        }<a name="line.1578"></a>
+<span class="sourceLineNo">1579</span>      }<a name="line.1579"></a>
+<span class="sourceLineNo">1580</span>    };<a name="line.1580"></a>
+<span class="sourceLineNo">1581</span>    regionCloseThread.start();<a name="line.1581"></a>
+<span class="sourceLineNo">1582</span><a name="line.1582"></a>
+<span class="sourceLineNo">1583</span>    startingClose.await();<a name="line.1583"></a>
+<span class="sourceLineNo">1584</span>    startingPuts.await();<a name="line.1584"></a>
+<span class="sourceLineNo">1585</span>    Thread.sleep(100);<a name="line.1585"></a>
+<span class="sourceLineNo">1586</span>    LOG.info("...releasing row lock 1, which should let put thread continue");<a name="line.1586"></a>
+<span class="sourceLineNo">1587</span>    rowLock1.release();<a name="line.1587"></a>
+<span class="sourceLineNo">1588</span>    rowLock2.release();<a name="line.1588"></a>
+<span class="sourceLineNo">1589</span>    rowLock3.release();<a name="line.1589"></a>
+<span class="sourceLineNo">1590</span>    waitForCounter(source, "syncTimeNumOps", syncs + 1);<a name="line.1590"></a>
+<span class="sourceLineNo">1591</span><a name="line.1591"></a>
+<span class="sourceLineNo">1592</span>    LOG.info("...joining on put thread");<a name="line.1592"></a>
+<span class="sourceLineNo">1593</span>    ctx.stop();<a name="line.1593"></a>
+<span class="sourceLineNo">1594</span>    regionCloseThread.join();<a name="line.1594"></a>
+<span class="sourceLineNo">1595</span><a name="line.1595"></a>
+<span class="sourceLineNo">1596</span>    OperationStatus[] codes = retFromThread.get();<a name="line.1596"></a>
+<span class="sourceLineNo">1597</span>    for (int i = 0; i &lt; codes.length; i++) {<a name="line.1597"></a>
+<span class="sourceLineNo">1598</span>      assertEquals((i == 5) ? OperationStatusCode.BAD_FAMILY : OperationStatusCode.SUCCESS,<a name="line.1598"></a>
+<span class="sourceLineNo">1599</span>          codes[i].getOperationStatusCode());<a name="line.1599"></a>
+<span class="sourceLineNo">1600</span>    }<a name="line.1600"></a>
+<span class="sourceLineNo">1601</span>    rowLock4.release();<a name="line.1601"></a>
+<span class="sourceLineNo">1602</span>  }<a name="line.1602"></a>
+<span class="sourceLineNo">1603</span><a name="line.1603"></a>
+<span class="sourceLineNo">1604</span>  private void waitForCounter(MetricsWALSource source, String metricName, long expectedCount)<a name="line.1604"></a>
+<span class="sourceLineNo">1605</span>      throws InterruptedException {<a name="line.1605"></a>
+<span class="sourceLineNo">1606</span>    long startWait = System.currentTimeMillis();<a name="line.1606"></a>
+<span class="sourceLineNo">1607</span>    long currentCount;<a name="line.1607"></a>
+<span class="sourceLineNo">1608</span>    while ((currentCount = metricsAssertHelper.getCounter(metricName, source)) &lt; expectedCount) {<a name="line.1608"></a>
+<span class="sourceLineNo">1609</span>      Thread.sleep(100);<a name="line.1609"></a>
+<span class="sourceLineNo">1610</span>      if (System.currentTimeMillis() - startWait &gt; 10000) {<a name="line.1610"></a>
+<span class="sourceLineNo">1611</span>        fail(String.format("Timed out waiting for '%s' &gt;= '%s', currentCount=%s", metricName,<a name="line.1611"></a>
+<span class="sourceLineNo">1612</span>            expectedCount, currentCount));<a name="line.1612"></a>
+<span class="sourceLineNo">1613</span>      }<a name="line.1613"></a>
+<span class="sourceLineNo">1614</span>    }<a name="line.1614"></a>
+<span class="sourceLineNo">1615</span>  }<a name="line.1615"></a>
+<span class="sourceLineNo">1616</span><a name="line.1616"></a>
+<span class="sourceLineNo">1617</span>  @Test<a name="line.1617"></a>
+<span class="sourceLineNo">1618</span>  public void testAtomicBatchPut() throws IOException {<a name="line.1618"></a>
+<span class="sourceLineNo">1619</span>    final Put[] puts = new Put[10];<a name="line.1619"></a>
+<span class="sourceLineNo">1620</span>    MetricsWALSource source = CompatibilitySingletonFactory.getInstance(MetricsWALSource.class);<a name="line.1620"></a>
+<span class="sourceLineNo">1621</span>    long syncs = prepareRegionForBachPut(puts, source, false);<a name="line.1621"></a>
+<span class="sourceLineNo">1622</span><a name="line.1622"></a>
+<span class="sourceLineNo">1623</span>    // 1. Straight forward case, should succeed<a name="line.1623"></a>
+<span class="sourceLineNo">1624</span>    MutationBatchOperation batchOp = new MutationBatchOperation(region, puts, true,<a name="line.1624"></a>
+<span class="sourceLineNo">1625</span>        HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.1625"></a>
+<span class="sourceLineNo">1626</span>    OperationStatus[] codes = this.region.batchMutate(batchOp);<a name="line.1626"></a>
+<span class="sourceLineNo">1627</span>    assertEquals(10, codes.length);<a name="line.1627"></a>
+<span class="sourceLineNo">1628</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.1628"></a>
+<span class="sourceLineNo">1629</span>      assertEquals(OperationStatusCode.SUCCESS, codes[i].getOperationStatusCode());<a name="line.1629"></a>
+<span class="sourceLineNo">1630</span>    }<a name="line.1630"></a>
+<span class="sourceLineNo">1631</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs + 1, source);<a name="line.1631"></a>
+<span class="sourceLineNo">1632</span><a name="line.1632"></a>
+<span class="sourceLineNo">1633</span>    // 2. Failed to get lock<a name="line.1633"></a>
+<span class="sourceLineNo">1634</span>    RowLock lock = region.getRowLock(Bytes.toBytes("row_" + 3));<a name="line.1634"></a>
+<span class="sourceLineNo">1635</span>    // Method {@link HRegion#getRowLock(byte[])} is reentrant. As 'row_3' is locked in this<a name="line.1635"></a>
+<span class="sourceLineNo">1636</span>    // thread, need to run {@link HRegion#batchMutate(HRegion.BatchOperation)} in different thread<a name="line.1636"></a>
+<span class="sourceLineNo">1637</span>    MultithreadedTestUtil.TestContext ctx = new MultithreadedTestUtil.TestContext(CONF);<a name="line.1637"></a>
+<span class="sourceLineNo">1638</span>    final AtomicReference&lt;IOException&gt; retFromThread = new AtomicReference&lt;&gt;();<a name="line.1638"></a>
+<span class="sourceLineNo">1639</span>    final CountDownLatch finishedPuts = new CountDownLatch(1);<a name="line.1639"></a>
+<span class="sourceLineNo">1640</span>    final MutationBatchOperation finalBatchOp = new MutationBatchOperation(region, puts, true,<a name="line.1640"></a>
+<span class="sourceLineNo">1641</span>        HConstants<a name="line.1641"></a>
+<span class="sourceLineNo">1642</span>        .NO_NONCE,<a name="line.1642"></a>
+<span class="sourceLineNo">1643</span>        HConstants.NO_NONCE);<a name="line.1643"></a>
+<span class="sourceLineNo">1644</span>    TestThread putter = new TestThread(ctx) {<a name="line.1644"></a>
+<span class="sourceLineNo">1645</span>      @Override<a name="line.1645"></a>
+<span class="sourceLineNo">1646</span>      public void doWork() throws IOException {<a name="line.1646"></a>
+<span class="sourceLineNo">1647</span>        try {<a name="line.1647"></a>
+<span class="sourceLineNo">1648</span>          region.batchMutate(finalBatchOp);<a name="line.1648"></a>
+<span class="sourceLineNo">1649</span>        } catch (IOException ioe) {<a name="line.1649"></a>
+<span class="sourceLineNo">1650</span>          LOG.error("test failed!", ioe);<a name="line.1650"></a>
+<span class="sourceLineNo">1651</span>          retFromThread.set(ioe);<a name="line.1651"></a>
+<span class="sourceLineNo">1652</span>        }<a name="line.1652"></a>
+<span class="sourceLineNo">1653</span>        finishedPuts.countDown();<a name="line.1653"></a>
+<span class="sourceLineNo">1654</span>      }<a name="line.1654"></a>
+<span class="sourceLineNo">1655</span>    };<a name="line.1655"></a>
+<span class="sourceLineNo">1656</span>    LOG.info("...starting put thread while holding locks");<a name="line.1656"></a>
+<span class="sourceLineNo">1657</span>    ctx.addThread(putter);<a name="line.1657"></a>
+<span class="sourceLineNo">1658</span>    ctx.startThreads();<a name="line.1658"></a>
+<span class="sourceLineNo">1659</span>    LOG.info("...waiting for batch puts while holding locks");<a name="line.1659"></a>
+<span class="sourceLineNo">1660</span>    try {<a name="line.1660"></a>
+<span class="sourceLineNo">1661</span>      finishedPuts.await();<a name="line.1661"></a>
+<span class="sourceLineNo">1662</span>    } catch (InterruptedException e) {<a name="line.1662"></a>
+<span class="sourceLineNo">1663</span>      LOG.error("Interrupted!", e);<a name="line.1663"></a>
+<span class="sourceLineNo">1664</span>    } finally {<a name="line.1664"></a>
+<span class="sourceLineNo">1665</span>      if (lock != null) {<a name="line.1665"></a>
+<span class="sourceLineNo">1666</span>        lock.release();<a name="line.1666"></a>
+<span class="sourceLineNo">1667</span>      }<a name="line.1667"></a>
+<span class="sourceLineNo">1668</span>    }<a name="line.1668"></a>
+<span class="sourceLineNo">1669</span>    assertNotNull(retFromThread.get());<a name="line.1669"></a>
+<span class="sourceLineNo">1670</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs + 1, source);<a name="line.1670"></a>
+<span class="sourceLineNo">1671</span><a name="line.1671"></a>
+<span class="sourceLineNo">1672</span>    // 3. Exception thrown in validation<a name="line.1672"></a>
+<span class="sourceLineNo">1673</span>    LOG.info("Next a batch put with one invalid family");<a name="line.1673"></a>
+<span class="sourceLineNo">1674</span>    puts[5].addColumn(Bytes.toBytes("BAD_CF"), qual, value);<a name="line.1674"></a>
+<span class="sourceLineNo">1675</span>    batchOp = new MutationBatchOperation(region, puts, true, HConstants.NO_NONCE,<a name="line.1675"></a>
+<span class="sourceLineNo">1676</span>        HConstants.NO_NONCE);<a name="line.1676"></a>
+<span class="sourceLineNo">1677</span>    thrown.expect(NoSuchColumnFamilyException.class);<a name="line.1677"></a>
+<span class="sourceLineNo">1678</span>    this.region.batchMutate(batchOp);<a name="line.1678"></a>
+<span class="sourceLineNo">1679</span>  }<a name="line.1679"></a>
+<span class="sourceLineNo">1680</span><a name="line.1680"></a>
+<span class="sourceLineNo">1681</span>  @Test<a name="line.1681"></a>
+<span class="sourceLineNo">1682</span>  public void testBatchPutWithTsSlop() throws Exception {<a name="line.1682"></a>
+<span class="sourceLineNo">1683</span>    // add data with a timestamp that is too recent for range. Ensure assert<a name="line.1683"></a>
+<span class="sourceLineNo">1684</span>    CONF.setInt("hbase.hregion.keyvalue.timestamp.slop.millisecs", 1000);<a name="line.1684"></a>
+<span class="sourceLineNo">1685</span>    final Put[] puts = new Put[10];<a name="line.1685"></a>
+<span class="sourceLineNo">1686</span>    MetricsWALSource source = CompatibilitySingletonFactory.getInstance(MetricsWALSource.class);<a name="line.1686"></a>
+<span class="sourceLineNo">1687</span><a name="line.1687"></a>
+<span class="sourceLineNo">1688</span>    long syncs = prepareRegionForBachPut(puts, source, true);<a name="line.1688"></a>
+<span class="sourceLineNo">1689</span><a name="line.1689"></a>
+<span class="sourceLineNo">1690</span>    OperationStatus[] codes = this.region.batchMutate(puts);<a name="line.1690"></a>
+<span class="sourceLineNo">1691</span>    assertEquals(10, codes.length);<a name="line.1691"></a>
+<span class="sourceLineNo">1692</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.1692"></a>
+<span class="sourceLineNo">1693</span>      assertEquals(OperationStatusCode.SANITY_CHECK_FAILURE, codes[i].getOperationStatusCode());<a name="line.1693"></a>
+<span class="sourceLineNo">1694</span>    }<a name="line.1694"></a>
+<span class="sourceLineNo">1695</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs, source);<a name="line.1695"></a>
+<span class="sourceLineNo">1696</span>  }<a name="line.1696"></a>
+<span class="sourceLineNo">1697</span><a name="line.1697"></a>
+<span class="sourceLineNo">1698</span>  /**<a name="line.1698"></a>
+<span class="sourceLineNo">1699</span>   * @return syncs initial syncTimeNumOps<a name="line.1699"></a>
+<span class="sourceLineNo">1700</span>   */<a name="line.1700"></a>
+<span class="sourceLineNo">1701</span>  private long prepareRegionForBachPut(final Put[] puts, final MetricsWALSource source,<a name="line.1701"></a>
+<span class="sourceLineNo">1702</span>      boolean slop) throws IOException {<a name="line.1702"></a>
+<span class="sourceLineNo">1703</span>    this.region = initHRegion(tableName, method, CONF, COLUMN_FAMILY_BYTES);<a name="line.1703"></a>
+<span class="sourceLineNo">1704</span><a name="line.1704"></a>
+<span class="sourceLineNo">1705</span>    LOG.info("First a batch put with all valid puts");<a name="line.1705"></a>
+<span class="sourceLineNo">1706</span>    for (int i = 0; i &lt; puts.length; i++) {<a name="line.1706"></a>
+<span class="sourceLineNo">1707</span>      puts[i] = slop ? new Put(Bytes.toBytes("row_" + i), Long.MAX_VALUE - 100) :<a name="line.1707"></a>
+<span class="sourceLineNo">1708</span>          new Put(Bytes.toBytes("row_" + i));<a name="line.1708"></a>
+<span class="sourceLineNo">1709</span>      puts[i].addColumn(COLUMN_FAMILY_BYTES, qual, value);<a name="line.1709"></a>
+<span class="sourceLineNo">1710</span>    }<a name="line.1710"></a>
+<span class="sourceLineNo">1711</span><a name="line.1711"></a>
+<span class="sourceLineNo">1712</span>    long syncs = metricsAssertHelper.getCounter("syncTimeNumOps", source);<a name="line.1712"></a>
+<span class="sourceLineNo">1713</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs, source);<a name="line.1713"></a>
+<span class="sourceLineNo">1714</span>    return syncs;<a name="line.1714"></a>
+<span class="sourceLineNo">1715</span>  }<a name="line.1715"></a>
+<span class="sourceLineNo">1716</span><a name="line.1716"></a>
+<span class="sourceLineNo">1717</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.1717"></a>
+<span class="sourceLineNo">1718</span>  // checkAndMutate tests<a name="line.1718"></a>
+<span class="sourceLineNo">1719</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.1719"></a>
+<span class="sourceLineNo">1720</span>  @Test<a name="line.1720"></a>
+<span class="sourceLineNo">1721</span>  public void testCheckAndMutate_WithEmptyRowValue() throws IOException {<a name="line.1721"></a>
+<span class="sourceLineNo">1722</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1722"></a>
+<span class="sourceLineNo">1723</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1723"></a>
+<span class="sourceLineNo">1724</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1724"></a>
+<span class="sourceLineNo">1725</span>    byte[] emptyVal = new byte[] {};<a name="line.1725"></a>
+<span class="sourceLineNo">1726</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1726"></a>
+<span class="sourceLineNo">1727</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.1727"></a>
+<span class="sourceLineNo">1728</span><a name="line.1728"></a>
+<span class="sourceLineNo">1729</span>    // Setting up region<a name="line.1729"></a>
+<span class="sourceLineNo">1730</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.1730"></a>
+<span class="sourceLineNo">1731</span>    // Putting empty data in key<a name="line.1731"></a>
+<span class="sourceLineNo">1732</span>    Put put = new Put(row1);<a name="line.1732"></a>
+<span class="sourceLineNo">1733</span>    put.addColumn(fam1, qf1, emptyVal);<a name="line.1733"></a>
+<span class="sourceLineNo">1734</span><a name="line.1734"></a>
+<span class="sourceLineNo">1735</span>    // checkAndPut with empty value<a name="line.1735"></a>
+<span class="sourceLineNo">1736</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1736"></a>
+<span class="sourceLineNo">1737</span>        new BinaryComparator(emptyVal), put);<a name="line.1737"></a>
+<span class="sourceLineNo">1738</span>    assertTrue(res);<a name="line.1738"></a>
+<span class="sourceLineNo">1739</span><a name="line.1739"></a>
+<span class="sourceLineNo">1740</span>    // Putting data in key<a name="line.1740"></a>
+<span class="sourceLineNo">1741</span>    put = new Put(row1);<a name="line.1741"></a>
+<span class="sourceLineNo">1742</span>    put.addColumn(fam1, qf1, val1);<a name="line.1742"></a>
+<span class="sourceLineNo">1743</span><a name="line.1743"></a>
+<span class="sourceLineNo">1744</span>    // checkAndPut with correct value<a name="line.1744"></a>
+<span class="sourceLineNo">1745</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1745"></a>
+<span class="sourceLineNo">1746</span>        new BinaryComparator(emptyVal), put);<a name="line.1746"></a>
+<span class="sourceLineNo">1747</span>    assertTrue(res);<a name="line.1747"></a>
+<span class="sourceLineNo">1748</span><a name="line.1748"></a>
+<span class="sourceLineNo">1749</span>    // not empty anymore<a name="line.1749"></a>
+<span class="sourceLineNo">1750</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1750"></a>
+<span class="sourceLineNo">1751</span>        new BinaryComparator(emptyVal), put);<a name="line.1751"></a>
+<span class="sourceLineNo">1752</span>    assertFalse(res);<a name="line.1752"></a>
+<span class="sourceLineNo">1753</span><a name="line.1753"></a>
+<span class="sourceLineNo">1754</span>    Delete delete = new Delete(row1);<a name="line.1754"></a>
+<span class="sourceLineNo">1755</span>    delete.addColumn(fam1, qf1);<a name="line.1755"></a>
+<span class="sourceLineNo">1756</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1756"></a>
+<span class="sourceLineNo">1757</span>        new BinaryComparator(emptyVal), delete);<a name="line.1757"></a>
+<span class="sourceLineNo">1758</span>    assertFalse(res);<a name="line.1758"></a>
+<span class="sourceLineNo">1759</span><a name="line.1759"></a>
+<span class="sourceLineNo">1760</span>    put = new Put(row1);<a name="line.1760"></a>
+<span class="sourceLineNo">1761</span>    put.addColumn(fam1, qf1, val2);<a name="line.1761"></a>
+<span class="sourceLineNo">1762</span>    // checkAndPut with correct value<a name="line.1762"></a>
+<span class="sourceLineNo">1763</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1763"></a>
+<span class="sourceLineNo">1764</span>        new BinaryComparator(val1), put);<a name="line.1764"></a>
+<span class="sourceLineNo">1765</span>    assertTrue(res);<a name="line.1765"></a>
+<span class="sourceLineNo">1766</span><a name="line.1766"></a>
+<span class="sourceLineNo">1767</span>    // checkAndDelete with correct value<a name="line.1767"></a>
+<span class="sourceLineNo">1768</span>    delete = new Delete(row1);<a name="line.1768"></a>
 <span class="sourceLineNo">1769</span>    delete.addColumn(fam1, qf1);<a name="line.1769"></a>
-<span class="sourceLineNo">1770</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1770"></a>
-<span class="sourceLineNo">1771</span>        new BinaryComparator(val2), delete);<a name="line.1771"></a>
-<span class="sourceLineNo">1772</span>    assertTrue(res);<a name="line.1772"></a>
-<span class="sourceLineNo">1773</span><a name="line.1773"></a>
-<span class="sourceLineNo">1774</span>    delete = new Delete(row1);<a name="line.1774"></a>
-<span class="sourceLineNo">1775</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1775"></a>
-<span class="sourceLineNo">1776</span>        new BinaryComparator(emptyVal), delete);<a name="line.1776"></a>
-<span class="sourceLineNo">1777</span>    assertTrue(res);<a name="line.1777"></a>
-<span class="sourceLineNo">1778</span><a name="line.1778"></a>
-<span class="sourceLineNo">1779</span>    // checkAndPut looking for a null value<a name="line.1779"></a>
-<span class="sourceLineNo">1780</span>    put = new Put(row1);<a name="line.1780"></a>
-<span class="sourceLineNo">1781</span>    put.addColumn(fam1, qf1, val1);<a name="line.1781"></a>
-<span class="sourceLineNo">1782</span><a name="line.1782"></a>
-<span class="sourceLineNo">1783</span>    res = region<a name="line.1783"></a>
-<span class="sourceLineNo">1784</span>        .checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new NullComparator(), put);<a name="line.1784"></a>
-<span class="sourceLineNo">1785</span>    assertTrue(res);<a name="line.1785"></a>
-<span class="sourceLineNo">1786</span>  }<a name="line.1786"></a>
-<span class="sourceLineNo">1787</span><a name="line.1787"></a>
-<span class="sourceLineNo">1788</span>  @Test<a name="line.1788"></a>
-<span class="sourceLineNo">1789</span>  public void testCheckAndMutate_WithWrongValue() throws IOException {<a name="line.1789"></a>
-<span class="sourceLineNo">1790</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1790"></a>
-<span class="sourceLineNo">1791</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1791"></a>
-<span class="sourceLineNo">1792</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1792"></a>
-<span class="sourceLineNo">1793</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1793"></a>
-<span class="sourceLineNo">1794</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.1794"></a>
-<span class="sourceLineNo">1795</span>    BigDecimal bd1 = new BigDecimal(Double.MAX_VALUE);<a name="line.1795"></a>
-<span class="sourceLineNo">1796</span>    BigDecimal bd2 = new BigDecimal(Double.MIN_VALUE);<a name="line.1796"></a>
-<span class="sourceLineNo">1797</span><a name="line.1797"></a>
-<span class="sourceLineNo">1798</span>    // Setting up region<a name="line.1798"></a>
-<span class="sourceLineNo">1799</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.1799"></a>
-<span class="sourceLineNo">1800</span>    // Putting data in key<a name="line.1800"></a>
-<span class="sourceLineNo">1801</span>    Put put = new Put(row1);<a name="line.1801"></a>
-<span class="sourceLineNo">1802</span>    put.addColumn(fam1, qf1, val1);<a name="line.1802"></a>
-<span class="sourceLineNo">1803</span>    region.put(put);<a name="line.1803"></a>
-<span class="sourceLineNo">1804</span><a name="line.1804"></a>
-<span class="sourceLineNo">1805</span>    // checkAndPut with wrong value<a name="line.1805"></a>
-<span class="sourceLineNo">1806</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1806"></a>
-<span class="sourceLineNo">1807</span>        new BinaryComparator(val2), put);<a name="line.1807"></a>
-<span class="sourceLineNo">1808</span>    assertEquals(false, res);<a name="line.1808"></a>
-<span class="sourceLineNo">1809</span><a name="line.1809"></a>
-<span class="sourceLineNo">1810</span>    // checkAndDelete with wrong value<a name="line.1810"></a>
-<span class="sourceLineNo">1811</span>    Delete delete = new Delete(row1);<a name="line.1811"></a>
-<span class="sourceLineNo">1812</span>    delete.addFamily(fam1);<a name="line.1812"></a>
-<span class="sourceLineNo">1813</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1813"></a>
-<span class="sourceLineNo">1814</span>        new BinaryComparator(val2), put);<a name="line.1814"></a>
-<span class="sourceLineNo">1815</span>    assertEquals(false, res);<a name="line.1815"></a>
-<span class="sourceLineNo">1816</span><a name="line.1816"></a>
-<span class="sourceLineNo">1817</span>    // Putting data in key<a name="line.1817"></a>
-<span class="sourceLineNo">1818</span>    put = new Put(row1);<a name="line.1818"></a>
-<span class="sourceLineNo">1819</span>    put.addColumn(fam1, qf1, Bytes.toBytes(bd1));<a name="line.1819"></a>
-<span class="sourceLineNo">1820</span>    region.put(put);<a name="line.1820"></a>
-<span class="sourceLineNo">1821</span><a name="line.1821"></a>
-<span class="sourceLineNo">1822</span>    // checkAndPut with wrong value<a name="line.1822"></a>
-<span class="sourceLineNo">1823</span>    res =<a name="line.1823"></a>
-<span class="sourceLineNo">1824</span>        region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1824"></a>
-<span class="sourceLineNo">1825</span>            new BigDecimalComparator(bd2), put);<a name="line.1825"></a>
-<span class="sourceLineNo">1826</span>    assertEquals(false, res);<a name="line.1826"></a>
-<span class="sourceLineNo">1827</span><a name="line.1827"></a>
-<span class="sourceLineNo">1828</span>    // checkAndDelete with wrong value<a name="line.1828"></a>
-<span class="sourceLineNo">1829</span>    delete = new Delete(row1);<a name="line.1829"></a>
-<span class="sourceLineNo">1830</span>    delete.addFamily(fam1);<a name="line.1830"></a>
-<span class="sourceLineNo">1831</span>    res =<a name="line.1831"></a>
-<span class="sourceLineNo">1832</span>        region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1832"></a>
-<span class="sourceLineNo">1833</span>            new BigDecimalComparator(bd2), put);<a name="line.1833"></a>
-<span class="sourceLineNo">1834</span>    assertEquals(false, res);<a name="line.1834"></a>
-<span class="sourceLineNo">1835</span>  }<a name="line.1835"></a>
-<span class="sourceLineNo">1836</span><a name="line.1836"></a>
-<span class="sourceLineNo">1837</span>  @Test<a name="line.1837"></a>
-<span class="sourceLineNo">1838</span>  public void testCheckAndMutate_WithCorrectValue() throws IOException {<a name="line.1838"></a>
-<span class="sourceLineNo">1839</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1839"></a>
-<span class="sourceLineNo">1840</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1840"></a>
-<span class="sourceLineNo">1841</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1841"></a>
-<span class="sourceLineNo">1842</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1842"></a>
-<span class="sourceLineNo">1843</span>    BigDecimal bd1 = new BigDecimal(Double.MIN_VALUE);<a name="line.1843"></a>
-<span class="sourceLineNo">1844</span><a name="line.1844"></a>
-<span class="sourceLineNo">1845</span>    // Setting up region<a name="line.1845"></a>
-<span class="sourceLineNo">1846</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.1846"></a>
-<span class="sourceLineNo">1847</span>    // Putting data in key<a name="line.1847"></a>
-<span class="sourceLineNo">1848</span>    Put put = new Put(row1);<a name="line.1848"></a>
-<span class="sourceLineNo">1849</span>    put.addColumn(fam1, qf1, val1);<a name="line.1849"></a>
-<span class="sourceLineNo">1850</span>    region.put(put);<a name="line.1850"></a>
-<span class="sourceLineNo">1851</span><a name="line.1851"></a>
-<span class="sourceLineNo">1852</span>    // checkAndPut with correct value<a name="line.1852"></a>
-<span class="sourceLineNo">1853</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1853"></a>
-<span class="sourceLineNo">1854</span>        new BinaryComparator(val1), put);<a name="line.1854"></a>
-<span class="sourceLineNo">1855</span>    assertEquals(true, res);<a name="line.1855"></a>
-<span class="sourceLineNo">1856</span><a name="line.1856"></a>
-<span class="sourceLineNo">1857</span>    // checkAndDelete with correct value<a name="line.1857"></a>
-<span class="sourceLineNo">1858</span>    Delete delete = new Delete(row1);<a name="line.1858"></a>
-<span class="sourceLineNo">1859</span>    delete.addColumn(fam1, qf1);<a name="line.1859"></a>
-<span class="sourceLineNo">1860</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new BinaryComparator(val1),<a name="line.1860"></a>
-<span class="sourceLineNo">1861</span>        delete);<a name="line.1861"></a>
-<span class="sourceLineNo">1862</span>    assertEquals(true, res);<a name="line.1862"></a>
-<span class="sourceLineNo">1863</span><a name="line.1863"></a>
-<span class="sourceLineNo">1864</span>    // Putting data in key<a name="line.1864"></a>
-<span class="sourceLineNo">1865</span>    put = new Put(row1);<a name="line.1865"></a>
-<span class="sourceLineNo">1866</span>    put.addColumn(fam1, qf1, Bytes.toBytes(bd1));<a name="line.1866"></a>
-<span class="sourceLineNo">1867</span>    region.put(put);<a name="line.1867"></a>
-<span class="sourceLineNo">1868</span><a name="line.1868"></a>
-<span class="sourceLineNo">1869</span>    // checkAndPut with correct value<a name="line.1869"></a>
-<span class="sourceLineNo">1870</span>    res =<a name="line.1870"></a>
-<span class="sourceLineNo">1871</span>        region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new BigDecimalComparator(<a name="line.1871"></a>
-<span class="sourceLineNo">1872</span>            bd1), put);<a name="line.1872"></a>
-<span class="sourceLineNo">1873</span>    assertEquals(true, res);<a name="line.1873"></a>
-<span class="sourceLineNo">1874</span><a name="line.1874"></a>
-<span class="sourceLineNo">1875</span>    // checkAndDelete with correct value<a name="line.1875"></a>
-<span class="sourceLineNo">1876</span>    delete = new Delete(row1);<a name="line.1876"></a>
-<span class="sourceLineNo">1877</span>    delete.addColumn(fam1, qf1);<a name="line.1877"></a>
-<span class="sourceLineNo">1878</span>    res =<a name="line.1878"></a>
-<span class="sourceLineNo">1879</span>        region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new BigDecimalComparator(<a name="line.1879"></a>
-<span class="sourceLineNo">1880</span>            bd1), delete);<a name="line.1880"></a>
-<span class="sourceLineNo">1881</span>    assertEquals(true, res);<a name="line.1881"></a>
-<span class="sourceLineNo">1882</span>  }<a name="line.1882"></a>
-<span class="sourceLineNo">1883</span><a name="line.1883"></a>
-<span class="sourceLineNo">1884</span>  @Test<a name="line.1884"></a>
-<span class="sourceLineNo">1885</span>  public void testCheckAndMutate_WithNonEqualCompareOp() throws IOException {<a name="line.1885"></a>
-<span class="sourceLineNo">1886</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1886"></a>
-<span class="sourceLineNo">1887</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1887"></a>
-<span class="sourceLineNo">1888</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1888"></a>
-<span class="sourceLineNo">1889</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1889"></a>
-<span class="sourceLineNo">1890</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.1890"></a>
-<span class="sourceLineNo">1891</span>    byte[] val3 = Bytes.toBytes("value3");<a name="line.1891"></a>
-<span class="sourceLineNo">1892</span>    byte[] val4 = Bytes.toBytes("value4");<a name="line.1892"></a>
-<span class="sourceLineNo">1893</span><a name="line.1893"></a>
-<span class="sourceLineNo">1894</span>    // Setting up region<a name="line.1894"></a>
-<span class="sourceLineNo">1895</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.1895"></a>
-<span class="sourceLineNo">1896</span>    // Putting val3 in key<a name="line.1896"></a>
-<span class="sourceLineNo">1897</span>    Put put = new Put(row1);<a name="line.1897"></a>
-<span class="sourceLineNo">1898</span>    put.addColumn(fam1, qf1, val3);<a name="line.1898"></a>
-<span class="sourceLineNo">1899</span>    region.put(put);<a name="line.1899"></a>
-<span class="sourceLineNo">1900</span><a name="line.1900"></a>
-<span class="sourceLineNo">1901</span>    // Test CompareOp.LESS: original = val3, compare with val3, fail<a name="line.1901"></a>
-<span class="sourceLineNo">1902</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS,<a name="line.1902"></a>
-<span class="sourceLineNo">1903</span>        new BinaryComparator(val3), put);<a name="line.1903"></a>
-<span class="sourceLineNo">1904</span>    assertEquals(false, res);<a name="line.1904"></a>
-<span class="sourceLineNo">1905</span><a name="line.1905"></a>
-<span class="sourceLineNo">1906</span>    // Test CompareOp.LESS: original = val3, compare with val4, fail<a name="line.1906"></a>
-<span class="sourceLineNo">1907</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS,<a name="line.1907"></a>
-<span class="sourceLineNo">1908</span>        new BinaryComparator(val4), put);<a name="line.1908"></a>
-<span class="sourceLineNo">1909</span>    assertEquals(false, res);<a name="line.1909"></a>
-<span class="sourceLineNo">1910</span><a name="line.1910"></a>
-<span class="sourceLineNo">1911</span>    // Test CompareOp.LESS: original = val3, compare with val2,<a name="line.1911"></a>
-<span class="sourceLineNo">1912</span>    // succeed (now value = val2)<a name="line.1912"></a>
-<span class="sourceLineNo">1913</span>    put = new Put(row1);<a name="line.1913"></a>
-<span class="sourceLineNo">1914</span>    put.addColumn(fam1, qf1, val2);<a name="line.1914"></a>
-<span class="sourceLineNo">1915</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS,<a name="line.1915"></a>
-<span class="sourceLineNo">1916</span>        new BinaryComparator(val2), put);<a name="line.1916"></a>
-<span class="sourceLineNo">1917</span>    assertEquals(true, res);<a name="line.1917"></a>
-<span class="sourceLineNo">1918</span><a name="line.1918"></a>
-<span class="sourceLineNo">1919</span>    // Test CompareOp.LESS_OR_EQUAL: original = val2, compare with val3, fail<a name="line.1919"></a>
-<span class="sourceLineNo">1920</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS_OR_EQUAL,<a name="line.1920"></a>
-<span class="sourceLineNo">1921</span>        new BinaryComparator(val3), put);<a name="line.1921"></a>
-<span class="sourceLineNo">1922</span>    assertEquals(false, res);<a name="line.1922"></a>
-<span class="sourceLineNo">1923</span><a name="line.1923"></a>
-<span class="sourceLineNo">1924</span>    // Test CompareOp.LESS_OR_EQUAL: original = val2, compare with val2,<a name="line.1924"></a>
-<span class="sourceLineNo">1925</span>    // succeed (value still = val2)<a name="line.1925"></a>
-<span class="sourceLineNo">1926</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS_OR_EQUAL,<a name="line.1926"></a>
-<span class="sourceLineNo">1927</span>        new BinaryComparator(val2), put);<a name="line.1927"></a>
-<span class="sourceLineNo">1928</span>    assertEquals(true, res);<a name="line.1928"></a>
-<span class="sourceLineNo">1929</span><a name="line.1929"></a>
-<span class="sourceLineNo">1930</span>    // Test CompareOp.LESS_OR_EQUAL: original = val2, compare with val1,<a name="line.1930"></a>
-<span class="sourceLineNo">1931</span>    // succeed (now value = val3)<a name="line.1931"></a>
-<span class="sourceLineNo">1932</span>    put = new Put(row1);<a name="line.1932"></a>
-<span class="sourceLineNo">1933</span>    put.addColumn(fam1, qf1, val3);<a name="line.1933"></a>
-<span class="sourceLineNo">1934</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS_OR_EQUAL,<a name="line.1934"></a>
-<span class="sourceLineNo">1935</span>        new BinaryComparator(val1), put);<a name="line.1935"></a>
-<span class="sourceLineNo">1936</span>    assertEquals(true, res);<a name="line.1936"></a>
-<span class="sourceLineNo">1937</span><a name="line.1937"></a>
-<span class="sourceLineNo">1938</span>    // Test CompareOp.GREATER: original = val3, compare with val3, fail<a name="line.1938"></a>
-<span class="sourceLineNo">1939</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER,<a name="line.1939"></a>
-<span class="sourceLineNo">1940</span>        new BinaryComparator(val3), put);<a name="line.1940"></a>
-<span class="sourceLineNo">1941</span>    assertEquals(false, res);<a name="line.1941"></a>
-<span class="sourceLineNo">1942</span><a name="line.1942"></a>
-<span class="sourceLineNo">1943</span>    // Test CompareOp.GREATER: original = val3, compare with val2, fail<a name="line.1943"></a>
-<span class="sourceLineNo">1944</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER,<a name="line.1944"></a>
-<span class="sourceLineNo">1945</span>        new BinaryComparator(val2), put);<a name="line.1945"></a>
-<span class="sourceLineNo">1946</span>    assertEquals(false, res);<a name="line.1946"></a>
-<span class="sourceLineNo">1947</span><a name="line.1947"></a>
-<span class="sourceLineNo">1948</span>    // Test CompareOp.GREATER: original = val3, compare with val4,<a name="line.1948"></a>
-<span class="sourceLineNo">1949</span>    // succeed (now value = val2)<a name="line.1949"></a>
-<span class="sourceLineNo">1950</span>    put = new Put(row1);<a name="line.1950"></a>
-<span class="sourceLineNo">1951</span>    put.addColumn(fam1, qf1, val2);<a name="line.1951"></a>
-<span class="sourceLineNo">1952</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER,<a name="line.1952"></a>
-<span class="sourceLineNo">1953</span>        new BinaryComparator(val4), put);<a name="line.1953"></a>
-<span class="sourceLineNo">1954</span>    assertEquals(true, res);<a name="line.1954"></a>
-<span class="sourceLineNo">1955</span><a name="line.1955"></a>
-<span class="sourceLineNo">1956</span>    // Test CompareOp.GREATER_OR_EQUAL: original = val2, compare with val1, fail<a name="line.1956"></a>
-<span class="sourceLineNo">1957</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER_OR_EQUAL,<a name="line.1957"></a>
-<span class="sourceLineNo">1958</span>        new BinaryComparator(val1), put);<a name="line.1958"></a>
-<span class="sourceLineNo">1959</span>    assertEquals(false, res);<a name="line.1959"></a>
-<span class="sourceLineNo">1960</span><a name="line.1960"></a>
-<span class="sourceLineNo">1961</span>    // Test CompareOp.GREATER_OR_EQUAL: original = val2, compare with val2,<a name="line.1961"></a>
-<span class="sourceLineNo">1962</span>    // succeed (value still = val2)<a name="line.1962"></a>
-<span class="sourceLineNo">1963</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER_OR_EQUAL,<a name="line.1963"></a>
-<span class="sourceLineNo">1964</span>        new BinaryComparator(val2), put);<a name="line.1964"></a>
-<span class="sourceLineNo">1965</span>    assertEquals(true, res);<a name="line.1965"></a>
-<span class="sourceLineNo">1966</span><a name="line.1966"></a>
-<span class="sourceLineNo">1967</span>    // Test CompareOp.GREATER_OR_EQUAL: original = val2, compare with val3, succeed<a name="line.1967"></a>
-<span class="sourceLineNo">1968</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER_OR_EQUAL,<a name="line.1968"></a>
-<span class="sourceLineNo">1969</span>        new BinaryComparator(val3), put);<a name="line.1969"></a>
-<span class="sourceLineNo">1970</span>    assertEquals(true, res);<a name="line.1970"></a>
-<span class="sourceLineNo">1971</span>  }<a name="line.1971"></a>
-<span class="sourceLineNo">1972</span><a name="line.1972"></a>
-<span class="sourceLineNo">1973</span>  @Test<a name="line.1973"></a>
-<span class="sourceLineNo">1974</span>  public void testCheckAndPut_ThatPutWasWritten() throws IOException {<a name="line.1974"></a>
-<span class="sourceLineNo">1975</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1975"></a>
-<span class="sourceLineNo">1976</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1976"></a>
-<span class="sourceLineNo">1977</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.1977"></a>
-<span class="sourceLineNo">1978</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1978"></a>
-<span class="sourceLineNo">1979</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1979"></a>
-<span class="sourceLineNo">1980</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.1980"></a>
-<span class="sourceLineNo">1981</span><a name="line.1981"></a>
-<span class="sourceLineNo">1982</span>    byte[][] families = { fam1, fam2 };<a name="line.1982"></a>
-<span class="sourceLineNo">1983</span><a name="line.1983"></a>
-<span class="sourceLineNo">1984</span>    // Setting up region<a name="line.1984"></a>
-<span class="sourceLineNo">1985</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.1985"></a>
-<span class="sourceLineNo">1986</span>    // Putting data in the key to check<a name="line.1986"></a>
-<span class="sourceLineNo">1987</span>    Put put = new Put(row1);<a name="line.1987"></a>
-<span class="sourceLineNo">1988</span>    put.addColumn(fam1, qf1, val1);<a name="line.1988"></a>
-<span class="sourceLineNo">1989</span>    region.put(put);<a name="line.1989"></a>
-<span class="sourceLineNo">1990</span><a name="line.1990"></a>
-<span class="sourceLineNo">1991</span>    // Creating put to add<a name="line.1991"></a>
-<span class="sourceLineNo">1992</span>    long ts = System.currentTimeMillis();<a name="line.1992"></a>
-<span class="sourceLineNo">1993</span>    KeyValue kv = new KeyValue(row1, fam2, qf1, ts, KeyValue.Type.Put, val2);<a name="line.1993"></a>
-<span class="sourceLineNo">1994</span>    put = new Put(row1);<a name="line.1994"></a>
-<span class="sourceLineNo">1995</span>    put.add(kv);<a name="line.1995"></a>
-<span class="sourceLineNo">1996</span><a name="line.1996"></a>
-<span class="sourceLineNo">1997</span>    // checkAndPut with wrong value<a name="line.1997"></a>
-<span class="sourceLineNo">1998</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1998"></a>
-<span class="sourceLineNo">1999</span>        new BinaryComparator(val1), put);<a name="line.1999"></a>
-<span class="sourceLineNo">2000</span>    assertEquals(true, res);<a name="line.2000"></a>
-<span class="sourceLineNo">2001</span><a name="line.2001"></a>
-<span class="sourceLineNo">2002</span>    Get get = new Get(row1);<a name="line.2002"></a>
-<span class="sourceLineNo">2003</span>    get.addColumn(fam2, qf1);<a name="line.2003"></a>
-<span class="sourceLineNo">2004</span>    Cell[] actual = region.get(get).rawCells();<a name="line.2004"></a>
-<span class="sourceLineNo">2005</span><a name="line.2005"></a>
-<span class="sourceLineNo">2006</span>    Cell[] expected = { kv };<a name="line.2006"></a>
-<span class="sourceLineNo">2007</span><a name="line.2007"></a>
-<span class="sourceLineNo">2008</span>    assertEquals(expected.length, actual.length);<a name="line.2008"></a>
-<span class="sourceLineNo">2009</span>    for (int i = 0; i &lt; actual.length; i++) {<a name="line.2009"></a>
-<span class="sourceLineNo">2010</span>      assertEquals(expected[i], actual[i]);<a name="line.2010"></a>
-<span class="sourceLineNo">2011</span>    }<a name="line.2011"></a>
-<span class="sourceLineNo">2012</span>  }<a name="line.2012"></a>
-<span class="sourceLineNo">2013</span><a name="line.2013"></a>
-<span class="sourceLineNo">2014</span>  @Test<a name="line.2014"></a>
-<span class="sourceLineNo">2015</span>  public void testCheckAndPut_wrongRowInPut() throws IOException {<a name="line.2015"></a>
-<span class="sourceLineNo">2016</span>    this.region = initHRegion(tableName, method, CONF, COLUMNS);<a name="line.2016"></a>
-<span class="sourceLineNo">2017</span>    Put put = new Put(row2);<a name="line.2017"></a>
-<span class="sourceLineNo">2018</span>    put.addColumn(fam1, qual1, value1);<a name="line.2018"></a>
-<span class="sourceLineNo">2019</span>    try {<a name="line.2019"></a>
-<span class="sourceLineNo">2020</span>      region.checkAndMutate(row, fam1, qual1, CompareOperator.EQUAL,<a name="line.2020"></a>
-<span class="sourceLineNo">2021</span>          new BinaryComparator(value2), put);<a name="line.2021"></a>
-<span class="sourceLineNo">2022</span>      fail();<a name="line.2022"></a>
-<span class="sourceLineNo">2023</span>    } catch (org.apache.hadoop.hbase.DoNotRetryIOException expected) {<a name="line.2023"></a>
-<span class="sourceLineNo">2024</span>      // expected exception.<a name="line.2024"></a>
-<span class="sourceLineNo">2025</span>    }<a name="line.2025"></a>
-<span class="sourceLineNo">2026</span>  }<a name="line.2026"></a>
-<span class="sourceLineNo">2027</span><a name="line.2027"></a>
-<span class="sourceLineNo">2028</span>  @Test<a name="line.2028"></a>
-<span class="sourceLineNo">2029</span>  public void testCheckAndDelete_ThatDeleteWasWritten() throws IOException {<a name="line.2029"></a>
-<span class="sourceLineNo">2030</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2030"></a>
-<span class="sourceLineNo">2031</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2031"></a>
-<span class="sourceLineNo">2032</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2032"></a>
-<span class="sourceLineNo">2033</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.2033"></a>
-<span class="sourceLineNo">2034</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.2034"></a>
-<span class="sourceLineNo">2035</span>    byte[] qf3 = Bytes.toBytes("qualifier3");<a name="line.2035"></a>
-<span class="sourceLineNo">2036</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.2036"></a>
-<span class="sourceLineNo">2037</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.2037"></a>
-<span class="sourceLineNo">2038</span>    byte[] val3 = Bytes.toBytes("value3");<a name="line.2038"></a>
-<span class="sourceLineNo">2039</span>    byte[] emptyVal = new byte[] {};<a name="line.2039"></a>
-<span class="sourceLineNo">2040</span><a name="line.2040"></a>
-<span class="sourceLineNo">2041</span>    byte[][] families = { fam1, fam2 };<a name="line.2041"></a>
-<span class="sourceLineNo">2042</span><a name="line.2042"></a>
-<span class="sourceLineNo">2043</span>    // Setting up region<a name="line.2043"></a>
-<span class="sourceLineNo">2044</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2044"></a>
-<span class="sourceLineNo">2045</span>    // Put content<a name="line.2045"></a>
-<span class="sourceLineNo">2046</span>    Put put = new Put(row1);<a name="line.2046"></a>
-<span class="sourceLineNo">2047</span>    put.addColumn(fam1, qf1, val1);<a name="line.2047"></a>
-<span class="sourceLineNo">2048</span>    region.put(put);<a name="line.2048"></a>
-<span class="sourceLineNo">2049</span>    Threads.sleep(2);<a name="line.2049"></a>
-<span class="sourceLineNo">2050</span><a name="line.2050"></a>
-<span class="sourceLineNo">2051</span>    put = new Put(row1);<a name="line.2051"></a>
-<span class="sourceLineNo">2052</span>    put.addColumn(fam1, qf1, val2);<a name="line.2052"></a>
-<span class="sourceLineNo">2053</span>    put.addColumn(fam2, qf1, val3);<a name="line.2053"></a>
-<span class="sourceLineNo">2054</span>    put.addColumn(fam2, qf2, val2);<a name="line.2054"></a>
-<span class="sourceLineNo">2055</span>    put.addColumn(fam2, qf3, val1);<a name="line.2055"></a>
-<span class="sourceLineNo">2056</span>    put.addColumn(fam1, qf3, val1);<a name="line.2056"></a>
-<span class="sourceLineNo">2057</span>    region.put(put);<a name="line.2057"></a>
-<span class="sourceLineNo">2058</span><a name="line.2058"></a>
-<span class="sourceLineNo">2059</span>    // Multi-column delete<a name="line.2059"></a>
-<span class="sourceLineNo">2060</span>    Delete delete = new Delete(row1);<a name="line.2060"></a>
-<span class="sourceLineNo">2061</span>    delete.addColumn(fam1, qf1);<a name="line.2061"></a>
-<span class="sourceLineNo">2062</span>    delete.addColumn(fam2, qf1);<a name="line.2062"></a>
-<span class="sourceLineNo">2063</span>    delete.addColumn(fam1, qf3);<a name="line.2063"></a>
-<span class="sourceLineNo">2064</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.2064"></a>
-<span class="sourceLineNo">2065</span>        new BinaryComparator(val2), delete);<a name="line.2065"></a>
-<span class="sourceLineNo">2066</span>    assertEquals(true, res);<a name="line.2066"></a>
-<span class="sourceLineNo">2067</span><a name="line.2067"></a>
-<span class="sourceLineNo">2068</span>    Get get = new Get(row1);<a name="line.2068"></a>
-<span class="sourceLineNo">2069</span>    get.addColumn(fam1, qf1);<a name="line.2069"></a>
-<span class="sourceLineNo">2070</span>    get.addColumn(fam1, qf3);<a name="line.2070"></a>
-<span class="sourceLineNo">2071</span>    get.addColumn(fam2, qf2);<a name="line.2071"></a>
-<span class="sourceLineNo">2072</span>    Result r = region.get(get);<a name="line.2072"></a>
-<span class="sourceLineNo">2073</span>    assertEquals(2, r.size());<a name="line.2073"></a>
-<span class="sourceLineNo">2074</span>    assertArrayEquals(val1, r.getValue(fam1, qf1));<a name="line.2074"></a>
-<span class="sourceLineNo">2075</span>    assertArrayEquals(val2, r.getValue(fam2, qf2));<a name="line.2075"></a>
-<span class="sourceLineNo">2076</span><a name="line.2076"></a>
-<span class="sourceLineNo">2077</span>    // Family delete<a name="line.2077"></a>
-<span class="sourceLineNo">2078</span>    delete = new Delete(row1);<a name="line.2078"></a>
-<span class="sourceLineNo">2079</span>    delete.addFamily(fam2);<a name="line.2079"></a>
-<span class="sourceLineNo">2080</span>    res = region.checkAndMutate(row1, fam2, qf1, CompareOperator.EQUAL,<a name="line.2080"></a>
-<span class="sourceLineNo">2081</span>        new BinaryComparator(emptyVal), delete);<a name="line.2081"></a>
-<span class="sourceLineNo">2082</span>    assertEquals(true, res);<a name="line.2082"></a>
-<span class="sourceLineNo">2083</span><a name="line.2083"></a>
-<span class="sourceLineNo">2084</span>    get = new Get(row1);<a name="line.2084"></a>
-<span class="sourceLineNo">2085</span>    r = region.get(get);<a name="line.2085"></a>
-<span class="sourceLineNo">2086</span>    assertEquals(1, r.size());<a name="line.2086"></a>
-<span class="sourceLineNo">2087</span>    assertArrayEquals(val1, r.getValue(fam1, qf1));<a name="line.2087"></a>
-<span class="sourceLineNo">2088</span><a name="line.2088"></a>
-<span class="sourceLineNo">2089</span>    // Row delete<a name="line.2089"></a>
-<span class="sourceLineNo">2090</span>    delete = new Delete(row1);<a name="line.2090"></a>
-<span class="sourceLineNo">2091</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new BinaryComparator(val1),<a name="line.2091"></a>
-<span class="sourceLineNo">2092</span>        delete);<a name="line.2092"></a>
-<span class="sourceLineNo">2093</span>    assertEquals(true, res);<a name="line.2093"></a>
-<span class="sourceLineNo">2094</span>    get = new Get(row1);<a name="line.2094"></a>
-<span class="sourceLineNo">2095</span>    r = region.get(get);<a name="line.2095"></a>
-<span class="sourceLineNo">2096</span>    assertEquals(0, r.size());<a name="line.2096"></a>
-<span class="sourceLineNo">2097</span>  }<a name="line.2097"></a>
-<span class="sourceLineNo">2098</span><a name="line.2098"></a>
-<span class="sourceLineNo">2099</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2099"></a>
-<span class="sourceLineNo">2100</span>  // Delete tests<a name="line.2100"></a>
-<span class="sourceLineNo">2101</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2101"></a>
-<span class="sourceLineNo">2102</span>  @Test<a name="line.2102"></a>
-<span class="sourceLineNo">2103</span>  public void testDelete_multiDeleteColumn() throws IOException {<a name="line.2103"></a>
-<span class="sourceLineNo">2104</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2104"></a>
-<span class="sourceLineNo">2105</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2105"></a>
-<span class="sourceLineNo">2106</span>    byte[] qual = Bytes.toBytes("qualifier");<a name="line.2106"></a>
-<span class="sourceLineNo">2107</span>    byte[] value = Bytes.toBytes("value");<a name="line.2107"></a>
-<span class="sourceLineNo">2108</span><a name="line.2108"></a>
-<span class="sourceLineNo">2109</span>    Put put = new Put(row1);<a name="line.2109"></a>
-<span class="sourceLineNo">2110</span>    put.addColumn(fam1, qual, 1, value);<a name="line.2110"></a>
-<span class="sourceLineNo">2111</span>    put.addColumn(fam1, qual, 2, value);<a name="line.2111"></a>
-<span class="sourceLineNo">2112</span><a name="line.2112"></a>
-<span class="sourceLineNo">2113</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2113"></a>
-<span class="sourceLineNo">2114</span>    region.put(put);<a name="line.2114"></a>
-<span class="sourceLineNo">2115</span><a name="line.2115"></a>
-<span class="sourceLineNo">2116</span>    // We do support deleting more than 1 'latest' version<a name="line.2116"></a>
-<span class="sourceLineNo">2117</span>    Delete delete = new Delete(row1);<a name="line.2117"></a>
-<span class="sourceLineNo">2118</span>    delete.addColumn(fam1, qual);<a name="line.2118"></a>
+<span class="sourceLineNo">1770</span>    delete.addColumn(fam1, qf1);<a name="line.1770"></a>
+<span class="sourceLineNo">1771</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1771"></a>
+<span class="sourceLineNo">1772</span>        new BinaryComparator(val2), delete);<a name="line.1772"></a>
+<span class="sourceLineNo">1773</span>    assertTrue(res);<a name="line.1773"></a>
+<span class="sourceLineNo">1774</span><a name="line.1774"></a>
+<span class="sourceLineNo">1775</span>    delete = new Delete(row1);<a name="line.1775"></a>
+<span class="sourceLineNo">1776</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1776"></a>
+<span class="sourceLineNo">1777</span>        new BinaryComparator(emptyVal), delete);<a name="line.1777"></a>
+<span class="sourceLineNo">1778</span>    assertTrue(res);<a name="line.1778"></a>
+<span class="sourceLineNo">1779</span><a name="line.1779"></a>
+<span class="sourceLineNo">1780</span>    // checkAndPut looking for a null value<a name="line.1780"></a>
+<span class="sourceLineNo">1781</span>    put = new Put(row1);<a name="line.1781"></a>
+<span class="sourceLineNo">1782</span>    put.addColumn(fam1, qf1, val1);<a name="line.1782"></a>
+<span class="sourceLineNo">1783</span><a name="line.1783"></a>
+<span class="sourceLineNo">1784</span>    res = region<a name="line.1784"></a>
+<span class="sourceLineNo">1785</span>        .checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new NullComparator(), put);<a name="line.1785"></a>
+<span class="sourceLineNo">1786</span>    assertTrue(res);<a name="line.1786"></a>
+<span class="sourceLineNo">1787</span>  }<a name="line.1787"></a>
+<span class="sourceLineNo">1788</span><a name="line.1788"></a>
+<span class="sourceLineNo">1789</span>  @Test<a name="line.1789"></a>
+<span class="sourceLineNo">1790</span>  public void testCheckAndMutate_WithWrongValue() throws IOException {<a name="line.1790"></a>
+<span class="sourceLineNo">1791</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1791"></a>
+<span class="sourceLineNo">1792</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1792"></a>
+<span class="sourceLineNo">1793</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1793"></a>
+<span class="sourceLineNo">1794</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1794"></a>
+<span class="sourceLineNo">1795</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.1795"></a>
+<span class="sourceLineNo">1796</span>    BigDecimal bd1 = new BigDecimal(Double.MAX_VALUE);<a name="line.1796"></a>
+<span class="sourceLineNo">1797</span>    BigDecimal bd2 = new BigDecimal(Double.MIN_VALUE);<a name="line.1797"></a>
+<span class="sourceLineNo">1798</span><a name="line.1798"></a>
+<span class="sourceLineNo">1799</span>    // Setting up region<a name="line.1799"></a>
+<span class="sourceLineNo">1800</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.1800"></a>
+<span class="sourceLineNo">1801</span>    // Putting data in key<a name="line.1801"></a>
+<span class="sourceLineNo">1802</span>    Put put = new Put(row1);<a name="line.1802"></a>
+<span class="sourceLineNo">1803</span>    put.addColumn(fam1, qf1, val1);<a name="line.1803"></a>
+<span class="sourceLineNo">1804</span>    region.put(put);<a name="line.1804"></a>
+<span class="sourceLineNo">1805</span><a name="line.1805"></a>
+<span class="sourceLineNo">1806</span>    // checkAndPut with wrong value<a name="line.1806"></a>
+<span class="sourceLineNo">1807</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1807"></a>
+<span class="sourceLineNo">1808</span>        new BinaryComparator(val2), put);<a name="line.1808"></a>
+<span class="sourceLineNo">1809</span>    assertEquals(false, res);<a name="line.1809"></a>
+<span class="sourceLineNo">1810</span><a name="line.1810"></a>
+<span class="sourceLineNo">1811</span>    // checkAndDelete with wrong value<a name="line.1811"></a>
+<span class="sourceLineNo">1812</span>    Delete delete = new Delete(row1);<a name="line.1812"></a>
+<span class="sourceLineNo">1813</span>    delete.addFamily(fam1);<a name="line.1813"></a>
+<span class="sourceLineNo">1814</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1814"></a>
+<span class="sourceLineNo">1815</span>        new BinaryComparator(val2), put);<a name="line.1815"></a>
+<span class="sourceLineNo">1816</span>    assertEquals(false, res);<a name="line.1816"></a>
+<span class="sourceLineNo">1817</span><a name="line.1817"></a>
+<span class="sourceLineNo">1818</span>    // Putting data in key<a name="line.1818"></a>
+<span class="sourceLineNo">1819</span>    put = new Put(row1);<a name="line.1819"></a>
+<span class="sourceLineNo">1820</span>    put.addColumn(fam1, qf1, Bytes.toBytes(bd1));<a name="line.1820"></a>
+<span class="sourceLineNo">1821</span>    region.put(put);<a name="line.1821"></a>
+<span class="sourceLineNo">1822</span><a name="line.1822"></a>
+<span class="sourceLineNo">1823</span>    // checkAndPut with wrong value<a name="line.1823"></a>
+<span class="sourceLineNo">1824</span>    res =<a name="line.1824"></a>
+<span class="sourceLineNo">1825</span>        region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1825"></a>
+<span class="sourceLineNo">1826</span>            new BigDecimalComparator(bd2), put);<a name="line.1826"></a>
+<span class="sourceLineNo">1827</span>    assertEquals(false, res);<a name="line.1827"></a>
+<span class="sourceLineNo">1828</span><a name="line.1828"></a>
+<span class="sourceLineNo">1829</span>    // checkAndDelete with wrong value<a name="line.1829"></a>
+<span class="sourceLineNo">1830</span>    delete = new Delete(row1);<a name="line.1830"></a>
+<span class="sourceLineNo">1831</span>    delete.addFamily(fam1);<a name="line.1831"></a>
+<span class="sourceLineNo">1832</span>    res =<a name="line.1832"></a>
+<span class="sourceLineNo">1833</span>        region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1833"></a>
+<span class="sourceLineNo">1834</span>            new BigDecimalComparator(bd2), put);<a name="line.1834"></a>
+<span class="sourceLineNo">1835</span>    assertEquals(false, res);<a name="line.1835"></a>
+<span class="sourceLineNo">1836</span>  }<a name="line.1836"></a>
+<span class="sourceLineNo">1837</span><a name="line.1837"></a>
+<span class="sourceLineNo">1838</span>  @Test<a name="line.1838"></a>
+<span class="sourceLineNo">1839</span>  public void testCheckAndMutate_WithCorrectValue() throws IOException {<a name="line.1839"></a>
+<span class="sourceLineNo">1840</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1840"></a>
+<span class="sourceLineNo">1841</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1841"></a>
+<span class="sourceLineNo">1842</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1842"></a>
+<span class="sourceLineNo">1843</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1843"></a>
+<span class="sourceLineNo">1844</span>    BigDecimal bd1 = new BigDecimal(Double.MIN_VALUE);<a name="line.1844"></a>
+<span class="sourceLineNo">1845</span><a name="line.1845"></a>
+<span class="sourceLineNo">1846</span>    // Setting up region<a name="line.1846"></a>
+<span class="sourceLineNo">1847</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.1847"></a>
+<span class="sourceLineNo">1848</span>    // Putting data in key<a name="line.1848"></a>
+<span class="sourceLineNo">1849</span>    Put put = new Put(row1);<a name="line.1849"></a>
+<span class="sourceLineNo">1850</span>    put.addColumn(fam1, qf1, val1);<a name="line.1850"></a>
+<span class="sourceLineNo">1851</span>    region.put(put);<a name="line.1851"></a>
+<span class="sourceLineNo">1852</span><a name="line.1852"></a>
+<span class="sourceLineNo">1853</span>    // checkAndPut with correct value<a name="line.1853"></a>
+<span class="sourceLineNo">1854</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1854"></a>
+<span class="sourceLineNo">1855</span>        new BinaryComparator(val1), put);<a name="line.1855"></a>
+<span class="sourceLineNo">1856</span>    assertEquals(true, res);<a name="line.1856"></a>
+<span class="sourceLineNo">1857</span><a name="line.1857"></a>
+<span class="sourceLineNo">1858</span>    // checkAndDelete with correct value<a name="line.1858"></a>
+<span class="sourceLineNo">1859</span>    Delete delete = new Delete(row1);<a name="line.1859"></a>
+<span class="sourceLineNo">1860</span>    delete.addColumn(fam1, qf1);<a name="line.1860"></a>
+<span class="sourceLineNo">1861</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new BinaryComparator(val1),<a name="line.1861"></a>
+<span class="sourceLineNo">1862</span>        delete);<a name="line.1862"></a>
+<span class="sourceLineNo">1863</span>    assertEquals(true, res);<a name="line.1863"></a>
+<span class="sourceLineNo">1864</span><a name="line.1864"></a>
+<span class="sourceLineNo">1865</span>    // Putting data in key<a name="line.1865"></a>
+<span class="sourceLineNo">1866</span>    put = new Put(row1);<a name="line.1866"></a>
+<span class="sourceLineNo">1867</span>    put.addColumn(fam1, qf1, Bytes.toBytes(bd1));<a name="line.1867"></a>
+<span class="sourceLineNo">1868</span>    region.put(put);<a name="line.1868"></a>
+<span class="sourceLineNo">1869</span><a name="line.1869"></a>
+<span class="sourceLineNo">1870</span>    // checkAndPut with correct value<a name="line.1870"></a>
+<span class="sourceLineNo">1871</span>    res =<a name="line.1871"></a>
+<span class="sourceLineNo">1872</span>        region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new BigDecimalComparator(<a name="line.1872"></a>
+<span class="sourceLineNo">1873</span>            bd1), put);<a name="line.1873"></a>
+<span class="sourceLineNo">1874</span>    assertEquals(true, res);<a name="line.1874"></a>
+<span class="sourceLineNo">1875</span><a name="line.1875"></a>
+<span class="sourceLineNo">1876</span>    // checkAndDelete with correct value<a name="line.1876"></a>
+<span class="sourceLineNo">1877</span>    delete = new Delete(row1);<a name="line.1877"></a>
+<span class="sourceLineNo">1878</span>    delete.addColumn(fam1, qf1);<a name="line.1878"></a>
+<span class="sourceLineNo">1879</span>    res =<a name="line.1879"></a>
+<span class="sourceLineNo">1880</span>        region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new BigDecimalComparator(<a name="line.1880"></a>
+<span class="sourceLineNo">1881</span>            bd1), delete);<a name="line.1881"></a>
+<span class="sourceLineNo">1882</span>    assertEquals(true, res);<a name="line.1882"></a>
+<span class="sourceLineNo">1883</span>  }<a name="line.1883"></a>
+<span class="sourceLineNo">1884</span><a name="line.1884"></a>
+<span class="sourceLineNo">1885</span>  @Test<a name="line.1885"></a>
+<span class="sourceLineNo">1886</span>  public void testCheckAndMutate_WithNonEqualCompareOp() throws IOException {<a name="line.1886"></a>
+<span class="sourceLineNo">1887</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1887"></a>
+<span class="sourceLineNo">1888</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1888"></a>
+<span class="sourceLineNo">1889</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1889"></a>
+<span class="sourceLineNo">1890</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1890"></a>
+<span class="sourceLineNo">1891</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.1891"></a>
+<span class="sourceLineNo">1892</span>    byte[] val3 = Bytes.toBytes("value3");<a name="line.1892"></a>
+<span class="sourceLineNo">1893</span>    byte[] val4 = Bytes.toBytes("value4");<a name="line.1893"></a>
+<span class="sourceLineNo">1894</span><a name="line.1894"></a>
+<span class="sourceLineNo">1895</span>    // Setting up region<a name="line.1895"></a>
+<span class="sourceLineNo">1896</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.1896"></a>
+<span class="sourceLineNo">1897</span>    // Putting val3 in key<a name="line.1897"></a>
+<span class="sourceLineNo">1898</span>    Put put = new Put(row1);<a name="line.1898"></a>
+<span class="sourceLineNo">1899</span>    put.addColumn(fam1, qf1, val3);<a name="line.1899"></a>
+<span class="sourceLineNo">1900</span>    region.put(put);<a name="line.1900"></a>
+<span class="sourceLineNo">1901</span><a name="line.1901"></a>
+<span class="sourceLineNo">1902</span>    // Test CompareOp.LESS: original = val3, compare with val3, fail<a name="line.1902"></a>
+<span class="sourceLineNo">1903</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS,<a name="line.1903"></a>
+<span class="sourceLineNo">1904</span>        new BinaryComparator(val3), put);<a name="line.1904"></a>
+<span class="sourceLineNo">1905</span>    assertEquals(false, res);<a name="line.1905"></a>
+<span class="sourceLineNo">1906</span><a name="line.1906"></a>
+<span class="sourceLineNo">1907</span>    // Test CompareOp.LESS: original = val3, compare with val4, fail<a name="line.1907"></a>
+<span class="sourceLineNo">1908</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS,<a name="line.1908"></a>
+<span class="sourceLineNo">1909</span>        new BinaryComparator(val4), put);<a name="line.1909"></a>
+<span class="sourceLineNo">1910</span>    assertEquals(false, res);<a name="line.1910"></a>
+<span class="sourceLineNo">1911</span><a name="line.1911"></a>
+<span class="sourceLineNo">1912</span>    // Test CompareOp.LESS: original = val3, compare with val2,<a name="line.1912"></a>
+<span class="sourceLineNo">1913</span>    // succeed (now value = val2)<a name="line.1913"></a>
+<span class="sourceLineNo">1914</span>    put = new Put(row1);<a name="line.1914"></a>
+<span class="sourceLineNo">1915</span>    put.addColumn(fam1, qf1, val2);<a name="line.1915"></a>
+<span class="sourceLineNo">1916</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS,<a name="line.1916"></a>
+<span class="sourceLineNo">1917</span>        new BinaryComparator(val2), put);<a name="line.1917"></a>
+<span class="sourceLineNo">1918</span>    assertEquals(true, res);<a name="line.1918"></a>
+<span class="sourceLineNo">1919</span><a name="line.1919"></a>
+<span class="sourceLineNo">1920</span>    // Test CompareOp.LESS_OR_EQUAL: original = val2, compare with val3, fail<a name="line.1920"></a>
+<span class="sourceLineNo">1921</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS_OR_EQUAL,<a name="line.1921"></a>
+<span class="sourceLineNo">1922</span>        new BinaryComparator(val3), put);<a name="line.1922"></a>
+<span class="sourceLineNo">1923</span>    assertEquals(false, res);<a name="line.1923"></a>
+<span class="sourceLineNo">1924</span><a name="line.1924"></a>
+<span class="sourceLineNo">1925</span>    // Test CompareOp.LESS_OR_EQUAL: original = val2, compare with val2,<a name="line.1925"></a>
+<span class="sourceLineNo">1926</span>    // succeed (value still = val2)<a name="line.1926"></a>
+<span class="sourceLineNo">1927</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS_OR_EQUAL,<a name="line.1927"></a>
+<span class="sourceLineNo">1928</span>        new BinaryComparator(val2), put);<a name="line.1928"></a>
+<span class="sourceLineNo">1929</span>    assertEquals(true, res);<a name="line.1929"></a>
+<span class="sourceLineNo">1930</span><a name="line.1930"></a>
+<span class="sourceLineNo">1931</span>    // Test CompareOp.LESS_OR_EQUAL: original = val2, compare with val1,<a name="line.1931"></a>
+<span class="sourceLineNo">1932</span>    // succeed (now value = val3)<a name="line.1932"></a>
+<span class="sourceLineNo">1933</span>    put = new Put(row1);<a name="line.1933"></a>
+<span class="sourceLineNo">1934</span>    put.addColumn(fam1, qf1, val3);<a name="line.1934"></a>
+<span class="sourceLineNo">1935</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS_OR_EQUAL,<a name="line.1935"></a>
+<span class="sourceLineNo">1936</span>        new BinaryComparator(val1), put);<a name="line.1936"></a>
+<span class="sourceLineNo">1937</span>    assertEquals(true, res);<a name="line.1937"></a>
+<span class="sourceLineNo">1938</span><a name="line.1938"></a>
+<span class="sourceLineNo">1939</span>    // Test CompareOp.GREATER: original = val3, compare with val3, fail<a name="line.1939"></a>
+<span class="sourceLineNo">1940</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER,<a name="line.1940"></a>
+<span class="sourceLineNo">1941</span>        new BinaryComparator(val3), put);<a name="line.1941"></a>
+<span class="sourceLineNo">1942</span>    assertEquals(false, res);<a name="line.1942"></a>
+<span class="sourceLineNo">1943</span><a name="line.1943"></a>
+<span class="sourceLineNo">1944</span>    // Test CompareOp.GREATER: original = val3, compare with val2, fail<a name="line.1944"></a>
+<span class="sourceLineNo">1945</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER,<a name="line.1945"></a>
+<span class="sourceLineNo">1946</span>        new BinaryComparator(val2), put);<a name="line.1946"></a>
+<span class="sourceLineNo">1947</span>    assertEquals(false, res);<a name="line.1947"></a>
+<span class="sourceLineNo">1948</span><a name="line.1948"></a>
+<span class="sourceLineNo">1949</span>    // Test CompareOp.GREATER: original = val3, compare with val4,<a name="line.1949"></a>
+<span class="sourceLineNo">1950</span>    // succeed (now value = val2)<a name="line.1950"></a>
+<span class="sourceLineNo">1951</span>    put = new Put(row1);<a name="line.1951"></a>
+<span class="sourceLineNo">1952</span>    put.addColumn(fam1, qf1, val2);<a name="line.1952"></a>
+<span class="sourceLineNo">1953</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER,<a name="line.1953"></a>
+<span class="sourceLineNo">1954</span>        new BinaryComparator(val4), put);<a name="line.1954"></a>
+<span class="sourceLineNo">1955</span>    assertEquals(true, res);<a name="line.1955"></a>
+<span class="sourceLineNo">1956</span><a name="line.1956"></a>
+<span class="sourceLineNo">1957</span>    // Test CompareOp.GREATER_OR_EQUAL: original = val2, compare with val1, fail<a name="line.1957"></a>
+<span class="sourceLineNo">1958</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER_OR_EQUAL,<a name="line.1958"></a>
+<span class="sourceLineNo">1959</span>        new BinaryComparator(val1), put);<a name="line.1959"></a>
+<span class="sourceLineNo">1960</span>    assertEquals(false, res);<a name="line.1960"></a>
+<span class="sourceLineNo">1961</span><a name="line.1961"></a>
+<span class="sourceLineNo">1962</span>    // Test CompareOp.GREATER_OR_EQUAL: original = val2, compare with val2,<a name="line.1962"></a>
+<span class="sourceLineNo">1963</span>    // succeed (value still = val2)<a name="line.1963"></a>
+<span class="sourceLineNo">1964</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER_OR_EQUAL,<a name="line.1964"></a>
+<span class="sourceLineNo">1965</span>        new BinaryComparator(val2), put);<a name="line.1965"></a>
+<span class="sourceLineNo">1966</span>    assertEquals(true, res);<a name="line.1966"></a>
+<span class="sourceLineNo">1967</span><a name="line.1967"></a>
+<span class="sourceLineNo">1968</span>    // Test CompareOp.GREATER_OR_EQUAL: original = val2, compare with val3, succeed<a name="line.1968"></a>
+<span class="sourceLineNo">1969</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER_OR_EQUAL,<a name="line.1969"></a>
+<span class="sourceLineNo">1970</span>        new BinaryComparator(val3), put);<a name="line.1970"></a>
+<span class="sourceLineNo">1971</span>    assertEquals(true, res);<a name="line.1971"></a>
+<span class="sourceLineNo">1972</span>  }<a name="line.1972"></a>
+<span class="sourceLineNo">1973</span><a name="line.1973"></a>
+<span class="sourceLineNo">1974</span>  @Test<a name="line.1974"></a>
+<span class="sourceLineNo">1975</span>  public void testCheckAndPut_ThatPutWasWritten() throws IOException {<a name="line.1975"></a>
+<span class="sourceLineNo">1976</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1976"></a>
+<span class="sourceLineNo">1977</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1977"></a>
+<span class="sourceLineNo">1978</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.1978"></a>
+<span class="sourceLineNo">1979</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1979"></a>
+<span class="sourceLineNo">1980</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1980"></a>
+<span class="sourceLineNo">1981</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.1981"></a>
+<span class="sourceLineNo">1982</span><a name="line.1982"></a>
+<span class="sourceLineNo">1983</span>    byte[][] families = { fam1, fam2 };<a name="line.1983"></a>
+<span class="sourceLineNo">1984</span><a name="line.1984"></a>
+<span class="sourceLineNo">1985</span>    // Setting up region<a name="line.1985"></a>
+<span class="sourceLineNo">1986</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.1986"></a>
+<span class="sourceLineNo">1987</span>    // Putting data in the key to check<a name="line.1987"></a>
+<span class="sourceLineNo">1988</span>    Put put = new Put(row1);<a name="line.1988"></a>
+<span class="sourceLineNo">1989</span>    put.addColumn(fam1, qf1, val1);<a name="line.1989"></a>
+<span class="sourceLineNo">1990</span>    region.put(put);<a name="line.1990"></a>
+<span class="sourceLineNo">1991</span><a name="line.1991"></a>
+<span class="sourceLineNo">1992</span>    // Creating put to add<a name="line.1992"></a>
+<span class="sourceLineNo">1993</span>    long ts = System.currentTimeMillis();<a name="line.1993"></a>
+<span class="sourceLineNo">1994</span>    KeyValue kv = new KeyValue(row1, fam2, qf1, ts, KeyValue.Type.Put, val2);<a name="line.1994"></a>
+<span class="sourceLineNo">1995</span>    put = new Put(row1);<a name="line.1995"></a>
+<span class="sourceLineNo">1996</span>    put.add(kv);<a name="line.1996"></a>
+<span class="sourceLineNo">1997</span><a name="line.1997"></a>
+<span class="sourceLineNo">1998</span>    // checkAndPut with wrong value<a name="line.1998"></a>
+<span class="sourceLineNo">1999</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1999"></a>
+<span class="sourceLineNo">2000</span>        new BinaryComparator(val1), put);<a name="line.2000"></a>
+<span class="sourceLineNo">2001</span>    assertEquals(true, res);<a name="line.2001"></a>
+<span class="sourceLineNo">2002</span><a name="line.2002"></a>
+<span class="sourceLineNo">2003</span>    Get get = new Get(row1);<a name="line.2003"></a>
+<span class="sourceLineNo">2004</span>    get.addColumn(fam2, qf1);<a name="line.2004"></a>
+<span class="sourceLineNo">2005</span>    Cell[] actual = region.get(get).rawCells();<a name="line.2005"></a>
+<span class="sourceLineNo">2006</span><a name="line.2006"></a>
+<span class="sourceLineNo">2007</span>    Cell[] expected = { kv };<a name="line.2007"></a>
+<span class="sourceLineNo">2008</span><a name="line.2008"></a>
+<span class="sourceLineNo">2009</span>    assertEquals(expected.length, actual.length);<a name="line.2009"></a>
+<span class="sourceLineNo">2010</span>    for (int i = 0; i &lt; actual.length; i++) {<a name="line.2010"></a>
+<span class="sourceLineNo">2011</span>      assertEquals(expected[i], actual[i]);<a name="line.2011"></a>
+<span class="sourceLineNo">2012</span>    }<a name="line.2012"></a>
+<span class="sourceLineNo">2013</span>  }<a name="line.2013"></a>
+<span class="sourceLineNo">2014</span><a name="line.2014"></a>
+<span class="sourceLineNo">2015</span>  @Test<a name="line.2015"></a>
+<span class="sourceLineNo">2016</span>  public void testCheckAndPut_wrongRowInPut() throws IOException {<a name="line.2016"></a>
+<span class="sourceLineNo">2017</span>    this.region = initHRegion(tableName, method, CONF, COLUMNS);<a name="line.2017"></a>
+<span class="sourceLineNo">2018</span>    Put put = new Put(row2);<a name="line.2018"></a>
+<span class="sourceLineNo">2019</span>    put.addColumn(fam1, qual1, value1);<a name="line.2019"></a>
+<span class="sourceLineNo">2020</span>    try {<a name="line.2020"></a>
+<span class="sourceLineNo">2021</span>      region.checkAndMutate(row, fam1, qual1, CompareOperator.EQUAL,<a name="line.2021"></a>
+<span class="sourceLineNo">2022</span>          new BinaryComparator(value2), put);<a name="line.2022"></a>
+<span class="sourceLineNo">2023</span>      fail();<a name="line.2023"></a>
+<span class="sourceLineNo">2024</span>    } catch (org.apache.hadoop.hbase.DoNotRetryIOException expected) {<a name="line.2024"></a>
+<span class="sourceLineNo">2025</span>      // expected exception.<a name="line.2025"></a>
+<span class="sourceLineNo">2026</span>    }<a name="line.2026"></a>
+<span class="sourceLineNo">2027</span>  }<a name="line.2027"></a>
+<span class="sourceLineNo">2028</span><a name="line.2028"></a>
+<span class="sourceLineNo">2029</span>  @Test<a name="line.2029"></a>
+<span class="sourceLineNo">2030</span>  public void testCheckAndDelete_ThatDeleteWasWritten() throws IOException {<a name="line.2030"></a>
+<span class="sourceLineNo">2031</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2031"></a>
+<span class="sourceLineNo">2032</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2032"></a>
+<span class="sourceLineNo">2033</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2033"></a>
+<span class="sourceLineNo">2034</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.2034"></a>
+<span class="sourceLineNo">2035</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.2035"></a>
+<span class="sourceLineNo">2036</span>    byte[] qf3 = Bytes.toBytes("qualifier3");<a name="line.2036"></a>
+<span class="sourceLineNo">2037</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.2037"></a>
+<span class="sourceLineNo">2038</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.2038"></a>
+<span class="sourceLineNo">2039</span>    byte[] val3 = Bytes.toBytes("value3");<a name="line.2039"></a>
+<span class="sourceLineNo">2040</span>    byte[] emptyVal = new byte[] {};<a name="line.2040"></a>
+<span class="sourceLineNo">2041</span><a name="line.2041"></a>
+<span class="sourceLineNo">2042</span>    byte[][] families = { fam1, fam2 };<a name="line.2042"></a>
+<span class="sourceLineNo">2043</span><a name="line.2043"></a>
+<span class="sourceLineNo">2044</span>    // Setting up region<a name="line.2044"></a>
+<span class="sourceLineNo">2045</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2045"></a>
+<span class="sourceLineNo">2046</span>    // Put content<a name="line.2046"></a>
+<span class="sourceLineNo">2047</span>    Put put = new Put(row1);<a name="line.2047"></a>
+<span class="sourceLineNo">2048</span>    put.addColumn(fam1, qf1, val1);<a name="line.2048"></a>
+<span class="sourceLineNo">2049</span>    region.put(put);<a name="line.2049"></a>
+<span class="sourceLineNo">2050</span>    Threads.sleep(2);<a name="line.2050"></a>
+<span class="sourceLineNo">2051</span><a name="line.2051"></a>
+<span class="sourceLineNo">2052</span>    put = new Put(row1);<a name="line.2052"></a>
+<span class="sourceLineNo">2053</span>    put.addColumn(fam1, qf1, val2);<a name="line.2053"></a>
+<span class="sourceLineNo">2054</span>    put.addColumn(fam2, qf1, val3);<a name="line.2054"></a>
+<span class="sourceLineNo">2055</span>    put.addColumn(fam2, qf2, val2);<a name="line.2055"></a>
+<span class="sourceLineNo">2056</span>    put.addColumn(fam2, qf3, val1);<a name="line.2056"></a>
+<span class="sourceLineNo">2057</span>    put.addColumn(fam1, qf3, val1);<a name="line.2057"></a>
+<span class="sourceLineNo">2058</span>    region.put(put);<a name="line.2058"></a>
+<span class="sourceLineNo">2059</span><a name="line.2059"></a>
+<span class="sourceLineNo">2060</span>    // Multi-column delete<a name="line.2060"></a>
+<span class="sourceLineNo">2061</span>    Delete delete = new Delete(row1);<a name="line.2061"></a>
+<span class="sourceLineNo">2062</span>    delete.addColumn(fam1, qf1);<a name="line.2062"></a>
+<span class="sourceLineNo">2063</span>    delete.addColumn(fam2, qf1);<a name="line.2063"></a>
+<span class="sourceLineNo">2064</span>    delete.addColumn(fam1, qf3);<a name="line.2064"></a>
+<span class="sourceLineNo">2065</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.2065"></a>
+<span class="sourceLineNo">2066</span>        new BinaryComparator(val2), delete);<a name="line.2066"></a>
+<span class="sourceLineNo">2067</span>    assertEquals(true, res);<a name="line.2067"></a>
+<span class="sourceLineNo">2068</span><a name="line.2068"></a>
+<span class="sourceLineNo">2069</span>    Get get = new Get(row1);<a name="line.2069"></a>
+<span class="sourceLineNo">2070</span>    get.addColumn(fam1, qf1);<a name="line.2070"></a>
+<span class="sourceLineNo">2071</span>    get.addColumn(fam1, qf3);<a name="line.2071"></a>
+<span class="sourceLineNo">2072</span>    get.addColumn(fam2, qf2);<a name="line.2072"></a>
+<span class="sourceLineNo">2073</span>    Result r = region.get(get);<a name="line.2073"></a>
+<span class="sourceLineNo">2074</span>    assertEquals(2, r.size());<a name="line.2074"></a>
+<span class="sourceLineNo">2075</span>    assertArrayEquals(val1, r.getValue(fam1, qf1));<a name="line.2075"></a>
+<span class="sourceLineNo">2076</span>    assertArrayEquals(val2, r.getValue(fam2, qf2));<a name="line.2076"></a>
+<span class="sourceLineNo">2077</span><a name="line.2077"></a>
+<span class="sourceLineNo">2078</span>    // Family delete<a name="line.2078"></a>
+<span class="sourceLineNo">2079</span>    delete = new Delete(row1);<a name="line.2079"></a>
+<span class="sourceLineNo">2080</span>    delete.addFamily(fam2);<a name="line.2080"></a>
+<span class="sourceLineNo">2081</span>    res = region.checkAndMutate(row1, fam2, qf1, CompareOperator.EQUAL,<a name="line.2081"></a>
+<span class="sourceLineNo">2082</span>        new BinaryComparator(emptyVal), delete);<a name="line.2082"></a>
+<span class="sourceLineNo">2083</span>    assertEquals(true, res);<a name="line.2083"></a>
+<span class="sourceLineNo">2084</span><a name="line.2084"></a>
+<span class="sourceLineNo">2085</span>    get = new Get(row1);<a name="line.2085"></a>
+<span class="sourceLineNo">2086</span>    r = region.get(get);<a name="line.2086"></a>
+<span class="sourceLineNo">2087</span>    assertEquals(1, r.size());<a name="line.2087"></a>
+<span class="sourceLineNo">2088</span>    assertArrayEquals(val1, r.getValue(fam1, qf1));<a name="line.2088"></a>
+<span class="sourceLineNo">2089</span><a name="line.2089"></a>
+<span class="sourceLineNo">2090</span>    // Row delete<a name="line.2090"></a>
+<span class="sourceLineNo">2091</span>    delete = new Delete(row1);<a name="line.2091"></a>
+<span class="sourceLineNo">2092</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new BinaryComparator(val1),<a name="line.2092"></a>
+<span class="sourceLineNo">2093</span>        delete);<a name="line.2093"></a>
+<span class="sourceLineNo">2094</span>    assertEquals(true, res);<a name="line.2094"></a>
+<span class="sourceLineNo">2095</span>    get = new Get(row1);<a name="line.2095"></a>
+<span class="sourceLineNo">2096</span>    r = region.get(get);<a name="line.2096"></a>
+<span class="sourceLineNo">2097</span>    assertEquals(0, r.size());<a name="line.2097"></a>
+<span class="sourceLineNo">2098</span>  }<a name="line.2098"></a>
+<span class="sourceLineNo">2099</span><a name="line.2099"></a>
+<span class="sourceLineNo">2100</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2100"></a>
+<span class="sourceLineNo">2101</span>  // Delete tests<a name="line.2101"></a>
+<span class="sourceLineNo">2102</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2102"></a>
+<span class="sourceLineNo">2103</span>  @Test<a name="line.2103"></a>
+<span class="sourceLineNo">2104</span>  public void testDelete_multiDeleteColumn() throws IOException {<a name="line.2104"></a>
+<span class="sourceLineNo">2105</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2105"></a>
+<span class="sourceLineNo">2106</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2106"></a>
+<span class="sourceLineNo">2107</span>    byte[] qual = Bytes.toBytes("qualifier");<a name="line.2107"></a>
+<span class="sourceLineNo">2108</span>    byte[] value = Bytes.toBytes("value");<a name="line.2108"></a>
+<span class="sourceLineNo">2109</span><a name="line.2109"></a>
+<span class="sourceLineNo">2110</span>    Put put = new Put(row1);<a name="line.2110"></a>
+<span class="sourceLineNo">2111</span>    put.addColumn(fam1, qual, 1, value);<a name="line.2111"></a>
+<span class="sourceLineNo">2112</span>    put.addColumn(fam1, qual, 2, value);<a name="line.2112"></a>
+<span class="sourceLineNo">2113</span><a name="line.2113"></a>
+<span class="sourceLineNo">2114</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2114"></a>
+<span class="sourceLineNo">2115</span>    region.put(put);<a name="line.2115"></a>
+<span class="sourceLineNo">2116</span><a name="line.2116"></a>
+<span class="sourceLineNo">2117</span>    // We do support deleting more than 1 'latest' version<a name="line.2117"></a>
+<span class="sourceLineNo">2118</span>    Delete delete = new Delete(row1);<a name="line.2118"></a>
 <span class="sourceLineNo">2119</span>    delete.addColumn(fam1, qual);<a name="line.2119"></a>
-<span class="sourceLineNo">2120</span>    region.delete(delete);<a name="line.2120"></a>
-<span class="sourceLineNo">2121</span><a name="line.2121"></a>
-<span class="sourceLineNo">2122</span>    Get get = new Get(row1);<a name="line.2122"></a>
-<span class="sourceLineNo">2123</span>    get.addFamily(fam1);<a name="line.2123"></a>
-<span class="sourceLineNo">2124</span>    Result r = region.get(get);<a name="line.2124"></a>
-<span class="sourceLineNo">2125</span>    assertEquals(0, r.size());<a name="line.2125"></a>
-<span class="sourceLineNo">2126</span>  }<a name="line.2126"></a>
-<span class="sourceLineNo">2127</span><a name="line.2127"></a>
-<span class="sourceLineNo">2128</span>  @Test<a name="line.2128"></a>
-<span class="sourceLineNo">2129</span>  public void testDelete_CheckFamily() throws IOException {<a name="line.2129"></a>
-<span class="sourceLineNo">2130</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2130"></a>
-<span class="sourceLineNo">2131</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2131"></a>
-<span class="sourceLineNo">2132</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2132"></a>
-<span class="sourceLineNo">2133</span>    byte[] fam3 = Bytes.toBytes("fam3");<a name="line.2133"></a>
-<span class="sourceLineNo">2134</span>    byte[] fam4 = Bytes.toBytes("fam4");<a name="line.2134"></a>
-<span class="sourceLineNo">2135</span><a name="line.2135"></a>
-<span class="sourceLineNo">2136</span>    // Setting up region<a name="line.2136"></a>
-<span class="sourceLineNo">2137</span>    this.region = initHRegion(tableName, method, CONF, fam1, fam2, fam3);<a name="line.2137"></a>
-<span class="sourceLineNo">2138</span>    List&lt;Cell&gt; kvs = new ArrayList&lt;&gt;();<a name="line.2138"></a>
-<span class="sourceLineNo">2139</span>    kvs.add(new KeyValue(row1, fam4, null, null));<a name="line.2139"></a>
-<span class="sourceLineNo">2140</span><a name="line.2140"></a>
-<span class="sourceLineNo">2141</span>    // testing existing family<a name="line.2141"></a>
-<span class="sourceLineNo">2142</span>    byte[] family = fam2;<a name="line.2142"></a>
-<span class="sourceLineNo">2143</span>    NavigableMap&lt;byte[], List&lt;Cell&gt;&gt; deleteMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2143"></a>
-<span class="sourceLineNo">2144</span>    deleteMap.put(family, kvs);<a name="line.2144"></a>
-<span class="sourceLineNo">2145</span>    region.delete(deleteMap, Durability.SYNC_WAL);<a name="line.2145"></a>
-<span class="sourceLineNo">2146</span><a name="line.2146"></a>
-<span class="sourceLineNo">2147</span>    // testing non existing family<a name="line.2147"></a>
-<span class="sourceLineNo">2148</span>    boolean ok = false;<a name="line.2148"></a>
-<span class="sourceLineNo">2149</span>    family = fam4;<a name="line.2149"></a>
-<span class="sourceLineNo">2150</span>    try {<a name="line.2150"></a>
-<span class="sourceLineNo">2151</span>      deleteMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2151"></a>
-<span class="sourceLineNo">2152</span>      deleteMap.put(family, kvs);<a name="line.2152"></a>
-<span class="sourceLineNo">2153</span>      region.delete(deleteMap, Durability.SYNC_WAL);<a name="line.2153"></a>
-<span class="sourceLineNo">2154</span>    } catch (Exception e) {<a name="line.2154"></a>
-<span class="sourceLineNo">2155</span>      ok = true;<a name="line.2155"></a>
-<span class="sourceLineNo">2156</span>    }<a name="line.2156"></a>
-<span class="sourceLineNo">2157</span>    assertTrue("Family " + new String(family, StandardCharsets.UTF_8) + " does exist", ok);<a name="line.2157"></a>
-<span class="sourceLineNo">2158</span>  }<a name="line.2158"></a>
-<span class="sourceLineNo">2159</span><a name="line.2159"></a>
-<span class="sourceLineNo">2160</span>  @Test<a name="line.2160"></a>
-<span class="sourceLineNo">2161</span>  public void testDelete_mixed() throws IOException, InterruptedException {<a name="line.2161"></a>
-<span class="sourceLineNo">2162</span>    byte[] fam = Bytes.toBytes("info");<a name="line.2162"></a>
-<span class="sourceLineNo">2163</span>    byte[][] families = { fam };<a name="line.2163"></a>
-<span class="sourceLineNo">2164</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2164"></a>
-<span class="sourceLineNo">2165</span>    EnvironmentEdgeManagerTestHelper.injectEdge(new IncrementingEnvironmentEdge());<a name="line.2165"></a>
-<span class="sourceLineNo">2166</span><a name="line.2166"></a>
-<span class="sourceLineNo">2167</span>    byte[] row = Bytes.toBytes("table_name");<a name="line.2167"></a>
-<span class="sourceLineNo">2168</span>    // column names<a name="line.2168"></a>
-<span class="sourceLineNo">2169</span>    byte[] serverinfo = Bytes.toBytes("serverinfo");<a name="line.2169"></a>
-<span class="sourceLineNo">2170</span>    byte[] splitA = Bytes.toBytes("splitA");<a name="line.2170"></a>
-<span class="sourceLineNo">2171</span>    byte[] splitB = Bytes.toBytes("splitB");<a name="line.2171"></a>
-<span class="sourceLineNo">2172</span><a name="line.2172"></a>
-<span class="sourceLineNo">2173</span>    // add some data:<a name="line.2173"></a>
-<span class="sourceLineNo">2174</span>    Put put = new Put(row);<a name="line.2174"></a>
-<span class="sourceLineNo">2175</span>    put.addColumn(fam, splitA, Bytes.toBytes("reference_A"));<a name="line.2175"></a>
-<span class="sourceLineNo">2176</span>    region.put(put);<a name="line.2176"></a>
-<span class="sourceLineNo">2177</span><a name="line.2177"></a>
-<span class="sourceLineNo">2178</span>    put = new Put(row);<a name="line.2178"></a>
-<span class="sourceLineNo">2179</span>    put.addColumn(fam, splitB, Bytes.toBytes("reference_B"));<a name="line.2179"></a>
-<span class="sourceLineNo">2180</span>    region.put(put);<a name="line.2180"></a>
-<span class="sourceLineNo">2181</span><a name="line.2181"></a>
-<span class="sourceLineNo">2182</span>    put = new Put(row);<a name="line.2182"></a>
-<span class="sourceLineNo">2183</span>    put.addColumn(fam, serverinfo, Bytes.toBytes("ip_address"));<a name="line.2183"></a>
-<span class="sourceLineNo">2184</span>    region.put(put);<a name="line.2184"></a>
-<span class="sourceLineNo">2185</span><a name="line.2185"></a>
-<span class="sourceLineNo">2186</span>    // ok now delete a split:<a name="line.2186"></a>
-<span class="sourceLineNo">2187</span>    Delete delete = new Delete(row);<a name="line.2187"></a>
-<span class="sourceLineNo">2188</span>    delete.addColumns(fam, splitA);<a name="line.2188"></a>
-<span class="sourceLineNo">2189</span>    region.delete(delete);<a name="line.2189"></a>
-<span class="sourceLineNo">2190</span><a name="line.2190"></a>
-<span class="sourceLineNo">2191</span>    // assert some things:<a name="line.2191"></a>
-<span class="sourceLineNo">2192</span>    Get get = new Get(row).addColumn(fam, serverinfo);<a name="line.2192"></a>
-<span class="sourceLineNo">2193</span>    Result result = region.get(get);<a name="line.2193"></a>
-<span class="sourceLineNo">2194</span>    assertEquals(1, result.size());<a name="line.2194"></a>
-<span class="sourceLineNo">2195</span><a name="line.2195"></a>
-<span class="sourceLineNo">2196</span>    get = new Get(row).addColumn(fam, splitA);<a name="line.2196"></a>
-<span class="sourceLineNo">2197</span>    result = region.get(get);<a name="line.2197"></a>
-<span class="sourceLineNo">2198</span>    assertEquals(0, result.size());<a name="line.2198"></a>
-<span class="sourceLineNo">2199</span><a name="line.2199"></a>
-<span class="sourceLineNo">2200</span>    get = new Get(row).addColumn(fam, splitB);<a name="line.2200"></a>
-<span class="sourceLineNo">2201</span>    result = region.get(get);<a name="line.2201"></a>
-<span class="sourceLineNo">2202</span>    assertEquals(1, result.size());<a name="line.2202"></a>
-<span class="sourceLineNo">2203</span><a name="line.2203"></a>
-<span class="sourceLineNo">2204</span>    // Assert that after a delete, I can put.<a name="line.2204"></a>
-<span class="sourceLineNo">2205</span>    put = new Put(row);<a name="line.2205"></a>
-<span class="sourceLineNo">2206</span>    put.addColumn(fam, splitA, Bytes.toBytes("reference_A"));<a name="line.2206"></a>
-<span class="sourceLineNo">2207</span>    region.put(put);<a name="line.2207"></a>
-<span class="sourceLineNo">2208</span>    get = new Get(row);<a name="line.2208"></a>
-<span class="sourceLineNo">2209</span>    result = region.get(get);<a name="line.2209"></a>
-<span class="sourceLineNo">2210</span>    assertEquals(3, result.size());<a name="line.2210"></a>
-<span class="sourceLineNo">2211</span><a name="line.2211"></a>
-<span class="sourceLineNo">2212</span>    // Now delete all... then test I can add stuff back<a name="line.2212"></a>
-<span class="sourceLineNo">2213</span>    delete = new Delete(row);<a name="line.2213"></a>
-<span class="sourceLineNo">2214</span>    region.delete(delete);<a name="line.2214"></a>
-<span class="sourceLineNo">2215</span>    assertEquals(0, region.get(get).size());<a name="line.2215"></a>
-<span class="sourceLineNo">2216</span><a name="line.2216"></a>
-<span class="sourceLineNo">2217</span>    region.put(new Put(row).addColumn(fam, splitA, Bytes.toBytes("reference_A")));<a name="line.2217"></a>
-<span class="sourceLineNo">2218</span>    result = region.get(get);<a name="line.2218"></a>
-<span class="sourceLineNo">2219</span>    assertEquals(1, result.size());<a name="line.2219"></a>
-<span class="sourceLineNo">2220</span>  }<a name="line.2220"></a>
-<span class="sourceLineNo">2221</span><a name="line.2221"></a>
-<span class="sourceLineNo">2222</span>  @Test<a name="line.2222"></a>
-<span class="sourceLineNo">2223</span>  public void testDeleteRowWithFutureTs() throws IOException {<a name="line.2223"></a>
-<span class="sourceLineNo">2224</span>    byte[] fam = Bytes.toBytes("info");<a name="line.2224"></a>
-<span class="sourceLineNo">2225</span>    byte[][] families = { fam };<a name="line.2225"></a>
-<span class="sourceLineNo">2226</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2226"></a>
-<span class="sourceLineNo">2227</span>    byte[] row = Bytes.toBytes("table_name");<a name="line.2227"></a>
-<span class="sourceLineNo">2228</span>    // column names<a name="line.2228"></a>
-<span class="sourceLineNo">2229</span>    byte[] serverinfo = Bytes.toBytes("serverinfo");<a name="line.2229"></a>
-<span class="sourceLineNo">2230</span><a name="line.2230"></a>
-<span class="sourceLineNo">2231</span>    // add data in the far future<a name="line.2231"></a>
-<span class="sourceLineNo">2232</span>    Put put = new Put(row);<a name="line.2232"></a>
-<span class="sourceLineNo">2233</span>    put.addColumn(fam, serverinfo, HConstants.LATEST_TIMESTAMP - 5, Bytes.toBytes("value"));<a name="line.2233"></a>
-<span class="sourceLineNo">2234</span>    region.put(put);<a name="line.2234"></a>
-<span class="sourceLineNo">2235</span><a name="line.2235"></a>
-<span class="sourceLineNo">2236</span>    // now delete something in the present<a name="line.2236"></a>
-<span class="sourceLineNo">2237</span>    Delete delete = new Delete(row);<a name="line.2237"></a>
-<span class="sourceLineNo">2238</span>    region.delete(delete);<a name="line.2238"></a>
-<span class="sourceLineNo">2239</span><a name="line.2239"></a>
-<span class="sourceLineNo">2240</span>    // make sure we still see our data<a name="line.2240"></a>
-<span class="sourceLineNo">2241</span>    Get get = new Get(row).addColumn(fam, serverinfo);<a name="line.2241"></a>
-<span class="sourceLineNo">2242</span>    Result result = region.get(get);<a name="line.2242"></a>
-<span class="sourceLineNo">2243</span>    assertEquals(1, result.size());<a name="line.2243"></a>
-<span class="sourceLineNo">2244</span><a name="line.2244"></a>
-<span class="sourceLineNo">2245</span>    // delete the future row<a name="line.2245"></a>
-<span class="sourceLineNo">2246</span>    delete = new Delete(row, HConstants.LATEST_TIMESTAMP - 3);<a name="line.2246"></a>
-<span class="sourceLineNo">2247</span>    region.delete(delete);<a name="line.2247"></a>
-<span class="sourceLineNo">2248</span><a name="line.2248"></a>
-<span class="sourceLineNo">2249</span>    // make sure it is gone<a name="line.2249"></a>
-<span class="sourceLineNo">2250</span>    get = new Get(row).addColumn(fam, serverinfo);<a name="line.2250"></a>
-<span class="sourceLineNo">2251</span>    result = region.get(get);<a name="line.2251"></a>
-<span class="sourceLineNo">2252</span>    assertEquals(0, result.size());<a name="line.2252"></a>
-<span class="sourceLineNo">2253</span>  }<a name="line.2253"></a>
-<span class="sourceLineNo">2254</span><a name="line.2254"></a>
-<span class="sourceLineNo">2255</span>  /**<a name="line.2255"></a>
-<span class="sourceLineNo">2256</span>   * Tests that the special LATEST_TIMESTAMP option for puts gets replaced by<a name="line.2256"></a>
-<span class="sourceLineNo">2257</span>   * the actual timestamp<a name="line.2257"></a>
-<span class="sourceLineNo">2258</span>   */<a name="line.2258"></a>
-<span class="sourceLineNo">2259</span>  @Test<a name="line.2259"></a>
-<span class="sourceLineNo">2260</span>  public void testPutWithLatestTS() throws IOException {<a name="line.2260"></a>
-<span class="sourceLineNo">2261</span>    byte[] fam = Bytes.toBytes("info");<a name="line.2261"></a>
-<span class="sourceLineNo">2262</span>    byte[][] families = { fam };<a name="line.2262"></a>
-<span class="sourceLineNo">2263</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2263"></a>
-<span class="sourceLineNo">2264</span>    byte[] row = Bytes.toBytes("row1");<a name="line.2264"></a>
-<span class="sourceLineNo">2265</span>    // column names<a name="line.2265"></a>
-<span class="sourceLineNo">2266</span>    byte[] qual = Bytes.toBytes("qual");<a name="line.2266"></a>
-<span class="sourceLineNo">2267</span><a name="line.2267"></a>
-<span class="sourceLineNo">2268</span>    // add data with LATEST_TIMESTAMP, put without WAL<a name="line.2268"></a>
-<span class="sourceLineNo">2269</span>    Put put = new Put(row);<a name="line.2269"></a>
-<span class="sourceLineNo">2270</span>    put.addColumn(fam, qual, HConstants.LATEST_TIMESTAMP, Bytes.toBytes("value"));<a name="line.2270"></a>
-<span class="sourceLineNo">2271</span>    region.put(put);<a name="line.2271"></a>
-<span class="sourceLineNo">2272</span><a name="line.2272"></a>
-<span class="sourceLineNo">2273</span>    // Make sure it shows up with an actual timestamp<a name="line.2273"></a>
-<span class="sourceLineNo">2274</span>    Get get = new Get(row).addColumn(fam, qual);<a name="line.2274"></a>
-<span class="sourceLineNo">2275</span>    Result result = region.get(get);<a name="line.2275"></a>
-<span class="sourceLineNo">2276</span>    assertEquals(1, result.size());<a name="line.2276"></a>
-<span class="sourceLineNo">2277</span>    Cell kv = result.rawCells()[0];<a name="line.2277"></a>
-<span class="sourceLineNo">2278</span>    LOG.info("Got: " + kv);<a name="line.2278"></a>
-<span class="sourceLineNo">2279</span>    assertTrue("LATEST_TIMESTAMP was not replaced with real timestamp",<a name="line.2279"></a>
-<span class="sourceLineNo">2280</span>        kv.getTimestamp() != HConstants.LATEST_TIMESTAMP);<a name="line.2280"></a>
-<span class="sourceLineNo">2281</span><a name="line.2281"></a>
-<span class="sourceLineNo">2282</span>    // Check same with WAL enabled (historically these took different<a name="line.2282"></a>
-<span class="sourceLineNo">2283</span>    // code paths, so check both)<a name="line.2283"></a>
-<span class="sourceLineNo">2284</span>    row = Bytes.toBytes("row2");<a name="line.2284"></a>
-<span class="sourceLineNo">2285</span>    put = new Put(row);<a name="line.2285"></a>
-<span class="sourceLineNo">2286</span>    put.addColumn(fam, qual, HConstants.LATEST_TIMESTAMP, Bytes.toBytes("value"));<a name="line.2286"></a>
-<span class="sourceLineNo">2287</span>    region.put(put);<a name="line.2287"></a>
-<span class="sourceLineNo">2288</span><a name="line.2288"></a>
-<span class="sourceLineNo">2289</span>    // Make sure it shows up with an actual timestamp<a name="line.2289"></a>
-<span class="sourceLineNo">2290</span>    get = new Get(row).addColumn(fam, qual);<a name="line.2290"></a>
-<span class="sourceLineNo">2291</span>    result = region.get(get);<a name="line.2291"></a>
-<span class="sourceLineNo">2292</span>    assertEquals(1, result.size());<a name="line.2292"></a>
-<span class="sourceLineNo">2293</span>    kv = result.rawCells()[0];<a name="line.2293"></a>
-<span class="sourceLineNo">2294</span>    LOG.info("Got: " + kv);<a name="line.2294"></a>
-<span class="sourceLineNo">2295</span>    assertTrue("LATEST_TIMESTAMP was not replaced with real timestamp",<a name="line.2295"></a>
-<span class="sourceLineNo">2296</span>        kv.getTimestamp() != HConstants.LATEST_TIMESTAMP);<a name="line.2296"></a>
-<span class="sourceLineNo">2297</span>  }<a name="line.2297"></a>
-<span class="sourceLineNo">2298</span><a name="line.2298"></a>
-<span class="sourceLineNo">2299</span>  /**<a name="line.2299"></a>
-<span class="sourceLineNo">2300</span>   * Tests that there is server-side filtering for invalid timestamp upper<a name="line.2300"></a>
-<span class="sourceLineNo">2301</span>   * bound. Note that the timestamp lower bound is automatically handled for us<a name="line.2301"></a>
-<span class="sourceLineNo">2302</span>   * by the TTL field.<a name="line.2302"></a>
-<span class="sourceLineNo">2303</span>   */<a name="line.2303"></a>
-<span class="sourceLineNo">2304</span>  @Test<a name="line.2304"></a>
-<span class="sourceLineNo">2305</span>  public void testPutWithTsSlop() throws IOException {<a name="line.2305"></a>
-<span class="sourceLineNo">2306</span>    byte[] fam = Bytes.toBytes("info");<a name="line.2306"></a>
-<span class="sourceLineNo">2307</span>    byte[][] families = { fam };<a name="line.2307"></a>
-<span class="sourceLineNo">2308</span><a name="line.2308"></a>
-<span class="sourceLineNo">2309</span>    // add data with a timestamp that is too recent for range. Ensure assert<a name="line.2309"></a>
-<span class="sourceLineNo">2310</span>    CONF.setInt("hbase.hregion.keyvalue.timestamp.slop.millisecs", 1000);<a name="line.2310"></a>
-<span class="sourceLineNo">2311</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2311"></a>
-<span class="sourceLineNo">2312</span>    boolean caughtExcep = false;<a name="line.2312"></a>
-<span class="sourceLineNo">2313</span>    try {<a name="line.2313"></a>
-<span class="sourceLineNo">2314</span>      // no TS specified == use latest. should not error<a name="line.2314"></a>
-<span class="sourceLineNo">2315</span>      region.put(new Put(row).addColumn(fam, Bytes.toBytes("qual"), Bytes.toBytes("value")));<a name="line.2315"></a>
-<span class="sourceLineNo">2316</span>      // TS out of range. should error<a name="line.2316"></a>
-<span class="sourceLineNo">2317</span>      region.put(new Put(row).addColumn(fam, Bytes.toBytes("qual"),<a name="line.2317"></a>
-<span class="sourceLineNo">2318</span>          System.currentTimeMillis() + 2000, Bytes.toBytes("value")));<a name="line.2318"></a>
-<span class="sourceLineNo">2319</span>      fail("Expected IOE for TS out of configured timerange");<a name="line.2319"></a>
-<span class="sourceLineNo">2320</span>    } catch (FailedSanityCheckException ioe) {<a name="line.2320"></a>
-<span class="sourceLineNo">2321</span>      LOG.debug("Received expected exception", ioe);<a name="line.2321"></a>
-<span class="sourceLineNo">2322</span>      caughtExcep = true;<a name="line.2322"></a>
-<span class="sourceLineNo">2323</span>    }<a name="line.2323"></a>
-<span class="sourceLineNo">2324</span>    assertTrue("Should catch FailedSanityCheckException", caughtExcep);<a name="line.2324"></a>
-<span class="sourceLineNo">2325</span>  }<a name="line.2325"></a>
-<span class="sourceLineNo">2326</span><a name="line.2326"></a>
-<span class="sourceLineNo">2327</span>  @Test<a name="line.2327"></a>
-<span class="sourceLineNo">2328</span>  public void testScanner_DeleteOneFamilyNotAnother() throws IOException {<a name="line.2328"></a>
-<span class="sourceLineNo">2329</span>    byte[] fam1 = Bytes.toBytes("columnA");<a name="line.2329"></a>
-<span class="sourceLineNo">2330</span>    byte[] fam2 = Bytes.toBytes("columnB");<a name="line.2330"></a>
-<span class="sourceLineNo">2331</span>    this.region = initHRegion(tableName, method, CONF, fam1, fam2);<a name="line.2331"></a>
-<span class="sourceLineNo">2332</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.2332"></a>
-<span class="sourceLineNo">2333</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.2333"></a>
-<span class="sourceLineNo">2334</span><a name="line.2334"></a>
-<span class="sourceLineNo">2335</span>    byte[] value = Bytes.toBytes("value");<a name="line.2335"></a>
-<span class="sourceLineNo">2336</span><a name="line.2336"></a>
-<span class="sourceLineNo">2337</span>    Delete delete = new Delete(rowA);<a name="line.2337"></a>
-<span class="sourceLineNo">2338</span>    delete.addFamily(fam1);<a name="line.2338"></a>
-<span class="sourceLineNo">2339</span><a name="line.2339"></a>
-<span class="sourceLineNo">2340</span>    region.delete(delete);<a name="line.2340"></a>
-<span class="sourceLineNo">2341</span><a name="line.2341"></a>
-<span class="sourceLineNo">2342</span>    // now create data.<a name="line.2342"></a>
-<span class="sourceLineNo">2343</span>    Put put = new Put(rowA);<a name="line.2343"></a>
-<span class="sourceLineNo">2344</span>    put.addColumn(fam2, null, value);<a name="line.2344"></a>
-<span class="sourceLineNo">2345</span>    region.put(put);<a name="line.2345"></a>
-<span class="sourceLineNo">2346</span><a name="line.2346"></a>
-<span class="sourceLineNo">2347</span>    put = new Put(rowB);<a name="line.2347"></a>
-<span class="sourceLineNo">2348</span>    put.addColumn(fam1, null, value);<a name="line.2348"></a>
-<span class="sourceLineNo">2349</span>    put.addColumn(fam2, null, value);<a name="line.2349"></a>
-<span class="sourceLineNo">2350</span>    region.put(put);<a name="line.2350"></a>
-<span class="sourceLineNo">2351</span><a name="line.2351"></a>
-<span class="sourceLineNo">2352</span>    Scan scan = new Scan();<a name="line.2352"></a>
-<span class="sourceLineNo">2353</span>    scan.addFamily(fam1).addFamily(fam2);<a name="line.2353"></a>
-<span class="sourceLineNo">2354</span>    InternalScanner s = region.getScanner(scan);<a name="line.2354"></a>
-<span class="sourceLineNo">2355</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.2355"></a>
-<span class="sourceLineNo">2356</span>    s.next(results);<a name="line.2356"></a>
-<span class="sourceLineNo">2357</span>    assertTrue(CellUtil.matchingRows(results.get(0), rowA));<a name="line.2357"></a>
-<span class="sourceLineNo">2358</span><a name="line.2358"></a>
-<span class="sourceLineNo">2359</span>    results.clear();<a name="line.2359"></a>
-<span class="sourceLineNo">2360</span>    s.next(results);<a name="line.2360"></a>
-<span class="sourceLineNo">2361</span>    assertTrue(CellUtil.matchingRows(results.get(0), rowB));<a name="line.2361"></a>
-<span class="sourceLineNo">2362</span>  }<a name="line.2362"></a>
-<span class="sourceLineNo">2363</span><a name="line.2363"></a>
-<span class="sourceLineNo">2364</span>  @Test<a name="line.2364"></a>
-<span class="sourceLineNo">2365</span>  public void testDataInMemoryWithoutWAL() throws IOException {<a name="line.2365"></a>
-<span class="sourceLineNo">2366</span>    FileSystem fs = FileSystem.get(CONF);<a name="line.2366"></a>
-<span class="sourceLineNo">2367</span>    Path rootDir = new Path(dir + "testDataInMemoryWithoutWAL");<a name="line.2367"></a>
-<span class="sourceLineNo">2368</span>    FSHLog hLog = new FSHLog(fs, rootDir, "testDataInMemoryWithoutWAL", CONF);<a name="line.2368"></a>
-<span class="sourceLineNo">2369</span>    hLog.init();<a name="line.2369"></a>
-<span class="sourceLineNo">2370</span>    // This chunk creation is done throughout the code base. Do we want to move it into core?<a name="line.2370"></a>
-<span class="sourceLineNo">2371</span>    // It is missing from this test. W/o it we NPE.<a name="line.2371"></a>
-<span class="sourceLineNo">2372</span>    ChunkCreator.initialize(MemStoreLABImpl.CHUNK_SIZE_DEFAULT, false, 0, 0, 0, null);<a name="line.2372"></a>
-<span class="sourceLineNo">2373</span>    region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, hLog,<a name="line.2373"></a>
-<span class="sourceLineNo">2374</span>        COLUMN_FAMILY_BYTES);<a name="line.2374"></a>
-<span class="sourceLineNo">2375</span><a name="line.2375"></a>
-<span class="sourceLineNo">2376</span>    Cell originalCell = CellUtil.createCell(row, COLUMN_FAMILY_BYTES, qual1,<a name="line.2376"></a>
-<span class="sourceLineNo">2377</span>      System.currentTimeMillis(), KeyValue.Type.Put.getCode(), value1);<a name="line.2377"></a>
-<span class="sourceLineNo">2378</span>    final long originalSize = originalCell.getSerializedSize();<a name="line.2378"></a>
-<span class="sourceLineNo">2379</span><a name="line.2379"></a>
-<span class="sourceLineNo">2380</span>    Cell addCell = CellUtil.createCell(row, COLUMN_FAMILY_BYTES, qual1,<a name="line.2380"></a>
-<span class="sourceLineNo">2381</span>      System.currentTimeMillis(), KeyValue.Type.Put.getCode(), Bytes.toBytes("xxxxxxxxxx"));<a name="line.2381"></a>
-<span class="sourceLineNo">2382</span>    final long addSize = addCell.getSerializedSize();<a name="line.2382"></a>
-<span class="sourceLineNo">2383</span><a name="line.2383"></a>
-<span class="sourceLineNo">2384</span>    LOG.info("originalSize:" + originalSize<a name="line.2384"></a>
-<span class="sourceLineNo">2385</span>      + ", addSize:" + addSize);<a name="line.2385"></a>
-<span class="sourceLineNo">2386</span>    // start test. We expect that the addPut's durability will be replaced<a name="line.2386"></a>
-<span class="sourceLineNo">2387</span>    // by originalPut's durability.<a name="line.2387"></a>
-<span class="sourceLineNo">2388</span><a name="line.2388"></a>
-<span class="sourceLineNo">2389</span>    // case 1:<a name="line.2389"></a>
-<span class="sourceLineNo">2390</span>    testDataInMemoryWithoutWAL(region,<a name="line.2390"></a>
-<span class="sourceLineNo">2391</span>            new Put(row).add(originalCell).setDurability(Durability.SKIP_WAL),<a name="line.2391"></a>
-<span class="sourceLineNo">2392</span>            new Put(row).add(addCell).setDurability(Durability.SKIP_WAL),<a name="line.2392"></a>
-<span class="sourceLineNo">2393</span>            originalSize + addSize);<a name="line.2393"></a>
-<span class="sourceLineNo">2394</span><a name="line.2394"></a>
-<span class="sourceLineNo">2395</span>    // case 2:<a name="line.2395"></a>
-<span class="sourceLineNo">2396</span>    testDataInMemoryWithoutWAL(region,<a name="line.2396"></a>
-<span class="sourceLineNo">2397</span>            new Put(row).add(originalCell).setDurability(Durability.SKIP_WAL),<a name="line.2397"></a>
-<span class="sourceLineNo">2398</span>            new Put(row).add(addCell).setDurability(Durability.SYNC_WAL),<a name="line.2398"></a>
-<span class="sourceLineNo">2399</span>            originalSize + addSize);<a name="line.2399"></a>
-<span class="sourceLineNo">2400</span><a name="line.2400"></a>
-<span class="sourceLineNo">2401</span>    // case 3:<a name="line.2401"></a>
-<span class="sourceLineNo">2402</span>    testDataInMemoryWithoutWAL(region,<a name="line.2402"></a>
-<span class="sourceLineNo">2403</span>            new Put(row).add(originalCell).setDurability(Durability.SYNC_WAL),<a name="line.2403"></a>
-<span class="sourceLineNo">2404</span>            new Put(row).add(addCell).setDurability(Durability.SKIP_WAL),<a name="line.2404"></a>
-<span class="sourceLineNo">2405</span>            0);<a name="line.2405"></a>
-<span class="sourceLineNo">2406</span><a name="line.2406"></a>
-<span class="sourceLineNo">2407</span>    // case 4:<a name="line.2407"></a>
-<span class="sourceLineNo">2408</span>    testDataInMemoryWithoutWAL(region,<a name="line.2408"></a>
-<span class="sourceLineNo">2409</span>            new Put(row).add(originalCell).setDurability(Durability.SYNC_WAL),<a name="line.2409"></a>
-<span class="sourceLineNo">2410</span>            new Put(row).add(addCell).setDurability(Durability.SYNC_WAL),<a name="line.2410"></a>
-<span class="sourceLineNo">2411</span>            0);<a name="line.2411"></a>
-<span class="sourceLineNo">2412</span>  }<a name="line.2412"></a>
-<span class="sourceLineNo">2413</span><a name="line.2413"></a>
-<span class="sourceLineNo">2414</span>  private static void testDataInMemoryWithoutWAL(HRegion region, Put originalPut,<a name="line.2414"></a>
-<span class="sourceLineNo">2415</span>          final Put addPut, long delta) throws IOException {<a name="line.2415"></a>
-<span class="sourceLineNo">2416</span>    final long initSize = region.getDataInMemoryWithoutWAL();<a name="line.2416"></a>
-<span class="sourceLineNo">2417</span>    // save normalCPHost and replaced by mockedCPHost<a name="line.2417"></a>
-<span class="sourceLineNo">2418</span>    RegionCoprocessorHost normalCPHost = region.getCoprocessorHost();<a name="line.2418"></a>
-<span class="sourceLineNo">2419</span>    RegionCoprocessorHost mockedCPHost = Mockito.mock(RegionCoprocessorHost.class);<a name="line.2419"></a>
-<span class="sourceLineNo">2420</span>    // Because the preBatchMutate returns void, we can't do usual Mockito when...then form. Must<a name="line.2420"></a>
-<span class="sourceLineNo">2421</span>    // do below format (from Mockito doc).<a name="line.2421"></a>
-<span class="sourceLineNo">2422</span>    Mockito.doAnswer(new Answer&lt;Void&gt;() {<a name="line.2422"></a>
-<span class="sourceLineNo">2423</span>      @Override<a name="line.2423"></a>
-<span class="sourceLineNo">2424</span>      public Void answer(InvocationOnMock invocation) throws Throwable {<a name="line.2424"></a>
-<span class="sourceLineNo">2425</span>        MiniBatchOperationInProgress&lt;Mutation&gt; mb = invocation.getArgument(0);<a name="line.2425"></a>
-<span class="sourceLineNo">2426</span>        mb.addOperationsFromCP(0, new Mutation[]{addPut});<a name="line.2426"></a>
-<span class="sourceLineNo">2427</span>        return null;<a name="line.2427"></a>
-<span class="sourceLineNo">2428</span>      }<a name="line.2428"></a>
-<span class="sourceLineNo">2429</span>    }).when(mockedCPHost).preBatchMutate(Mockito.isA(MiniBatchOperationInProgress.class));<a name="line.2429"></a>
-<span class="sourceLineNo">2430</span>    region.setCoprocessorHost(mockedCPHost);<a name="line.2430"></a>
-<span class="sourceLineNo">2431</span>    region.put(originalPut);<a name="line.2431"></a>
-<span class="sourceLineNo">2432</span>    region.setCoprocessorHost(normalCPHost);<a name="line.2432"></a>
-<span class="sourceLineNo">2433</span>    final long finalSize = region.getDataInMemoryWithoutWAL();<a name="line.2433"></a>
-<span class="sourceLineNo">2434</span>    assertEquals("finalSize:" + finalSize + ", initSize:"<a name="line.2434"></a>
-<span class="sourceLineNo">2435</span>      + initSize + ", delta:" + delta,finalSize, initSize + delta);<a name="line.2435"></a>
-<span class="sourceLineNo">2436</span>  }<a name="line.2436"></a>
-<span class="sourceLineNo">2437</span><a name="line.2437"></a>
-<span class="sourceLineNo">2438</span>  @Test<a name="line.2438"></a>
-<span class="sourceLineNo">2439</span>  public void testDeleteColumns_PostInsert() throws IOException, InterruptedException {<a name="line.2439"></a>
-<span class="sourceLineNo">2440</span>    Delete delete = new Delete(row);<a name="line.2440"></a>
-<span class="sourceLineNo">2441</span>    delete.addColumns(fam1, qual1);<a name="line.2441"></a>
-<span class="sourceLineNo">2442</span>    doTestDelete_AndPostInsert(delete);<a name="line.2442"></a>
-<span class="sourceLineNo">2443</span>  }<a name="line.2443"></a>
-<span class="sourceLineNo">2444</span><a name="line.2444"></a>
-<span class="sourceLineNo">2445</span>  @Test<a name="line.2445"></a>
-<span class="sourceLineNo">2446</span>  public void testaddFamily_PostInsert() throws IOException, InterruptedException {<a name="line.2446"></a>
-<span class="sourceLineNo">2447</span>    Delete delete = new Delete(row);<a name="line.2447"></a>
-<span class="sourceLineNo">2448</span>    delete.addFamily(fam1);<a name="line.2448"></a>
-<span class="sourceLineNo">2449</span>    doTestDelete_AndPostInsert(delete);<a name="line.2449"></a>
-<span class="sourceLineNo">2450</span>  }<a name="line.2450"></a>
-<span class="sourceLineNo">2451</span><a name="line.2451"></a>
-<span class="sourceLineNo">2452</span>  public void doTestDelete_AndPostInsert(Delete delete) throws IOException, InterruptedException {<a name="line.2452"></a>
-<span class="sourceLineNo">2453</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2453"></a>
-<span class="sourceLineNo">2454</span>    EnvironmentEdgeManagerTestHelper.injectEdge(new IncrementingEnvironmentEdge());<a name="line.2454"></a>
-<span class="sourceLineNo">2455</span>    Put put = new Put(row);<a name="line.2455"></a>
-<span class="sourceLineNo">2456</span>    put.addColumn(fam1, qual1, value1);<a name="line.2456"></a>
-<span class="sourceLineNo">2457</span>    region.put(put);<a name="line.2457"></a>
-<span class="sourceLineNo">2458</span><a name="line.2458"></a>
-<span class="sourceLineNo">2459</span>    // now delete the value:<a name="line.2459"></a>
-<span class="sourceLineNo">2460</span>    region.delete(delete);<a name="line.2460"></a>
+<span class="sourceLineNo">2120</span>    delete.addColumn(fam1, qual);<a name="line.2120"></a>
+<span class="sourceLineNo">2121</span>    region.delete(delete);<a name="line.2121"></a>
+<span class="sourceLineNo">2122</span><a name="line.2122"></a>
+<span class="sourceLineNo">2123</span>    Get get = new Get(row1);<a name="line.2123"></a>
+<span class="sourceLineNo">2124</span>    get.addFamily(fam1);<a name="line.2124"></a>
+<span class="sourceLineNo">2125</span>    Result r = region.get(get);<a name="line.2125"></a>
+<span class="sourceLineNo">2126</span>    assertEquals(0, r.size());<a name="line.2126"></a>
+<span class="sourceLineNo">2127</span>  }<a name="line.2127"></a>
+<span class="sourceLineNo">2128</span><a name="line.2128"></a>
+<span class="sourceLineNo">2129</span>  @Test<a name="line.2129"></a>
+<span class="sourceLineNo">2130</span>  public void testDelete_CheckFamily() throws IOException {<a name="line.2130"></a>
+<span class="sourceLineNo">2131</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2131"></a>
+<span class="sourceLineNo">2132</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2132"></a>
+<span class="sourceLineNo">2133</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2133"></a>
+<span class="sourceLineNo">2134</span>    byte[] fam3 = Bytes.toBytes("fam3");<a name="line.2134"></a>
+<span class="sourceLineNo">2135</span>    byte[] fam4 = Bytes.toBytes("fam4");<a name="line.2135"></a>
+<span class="sourceLineNo">2136</span><a name="line.2136"></a>
+<span class="sourceLineNo">2137</span>    // Setting up region<a name="line.2137"></a>
+<span class="sourceLineNo">2138</span>    this.region = initHRegion(tableName, method, CONF, fam1, fam2, fam3);<a name="line.2138"></a>
+<span class="sourceLineNo">2139</span>    List&lt;Cell&gt; kvs = new ArrayList&lt;&gt;();<a name="line.2139"></a>
+<span class="sourceLineNo">2140</span>    kvs.add(new KeyValue(row1, fam4, null, null));<a name="line.2140"></a>
+<span class="sourceLineNo">2141</span><a name="line.2141"></a>
+<span class="sourceLineNo">2142</span>    // testing existing family<a name="line.2142"></a>
+<span class="sourceLineNo">2143</span>    byte[] family = fam2;<a name="line.2143"></a>
+<span class="sourceLineNo">2144</span>    NavigableMap&lt;byte[], List&lt;Cell&gt;&gt; deleteMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2144"></a>
+<span class="sourceLineNo">2145</span>    deleteMap.put(family, kvs);<a name="line.2145"></a>
+<span class="sourceLineNo">2146</span>    region.delete(deleteMap, Durability.SYNC_WAL);<a name="line.2146"></a>
+<span class="sourceLineNo">2147</span><a name="line.2147"></a>
+<span class="sourceLineNo">2148</span>    // testing non existing family<a name="line.2148"></a>
+<span class="sourceLineNo">2149</span>    boolean ok = false;<a name="line.2149"></a>
+<span class="sourceLineNo">2150</span>    family = fam4;<a name="line.2150"></a>
+<span class="sourceLineNo">2151</span>    try {<a name="line.2151"></a>
+<span class="sourceLineNo">2152</span>      deleteMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2152"></a>
+<span class="sourceLineNo">2153</span>      deleteMap.put(family, kvs);<a name="line.2153"></a>
+<span class="sourceLineNo">2154</span>      region.delete(deleteMap, Durability.SYNC_WAL);<a name="line.2154"></a>
+<span class="sourceLineNo">2155</span>    } catch (Exception e) {<a name="line.2155"></a>
+<span class="sourceLineNo">2156</span>      ok = true;<a name="line.2156"></a>
+<span class="sourceLineNo">2157</span>    }<a name="line.2157"></a>
+<span class="sourceLineNo">2158</span>    assertTrue("Family " + new String(family, StandardCharsets.UTF_8) + " does exist", ok);<a name="line.2158"></a>
+<span class="sourceLineNo">2159</span>  }<a name="line.2159"></a>
+<span class="sourceLineNo">2160</span><a name="line.2160"></a>
+<span class="sourceLineNo">2161</span>  @Test<a name="line.2161"></a>
+<span class="sourceLineNo">2162</span>  public void testDelete_mixed() throws IOException, InterruptedException {<a name="line.2162"></a>
+<span class="sourceLineNo">2163</span>    byte[] fam = Bytes.toBytes("info");<a name="line.2163"></a>
+<span class="sourceLineNo">2164</span>    byte[][] families = { fam };<a name="line.2164"></a>
+<span class="sourceLineNo">2165</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2165"></a>
+<span class="sourceLineNo">2166</span>    EnvironmentEdgeManagerTestHelper.injectEdge(new IncrementingEnvironmentEdge());<a name="line.2166"></a>
+<span class="sourceLineNo">2167</span><a name="line.2167"></a>
+<span class="sourceLineNo">2168</span>    byte[] row = Bytes.toBytes("table_name");<a name="line.2168"></a>
+<span class="sourceLineNo">2169</span>    // column names<a name="line.2169"></a>
+<span class="sourceLineNo">2170</span>    byte[] serverinfo = Bytes.toBytes("serverinfo");<a name="line.2170"></a>
+<span class="sourceLineNo">2171</span>    byte[] splitA = Bytes.toBytes("splitA");<a name="line.2171"></a>
+<span class="sourceLineNo">2172</span>    byte[] splitB = Bytes.toBytes("splitB");<a name="line.2172"></a>
+<span class="sourceLineNo">2173</span><a name="line.2173"></a>
+<span class="sourceLineNo">2174</span>    // add some data:<a name="line.2174"></a>
+<span class="sourceLineNo">2175</span>    Put put = new Put(row);<a name="line.2175"></a>
+<span class="sourceLineNo">2176</span>    put.addColumn(fam, splitA, Bytes.toBytes("reference_A"));<a name="line.2176"></a>
+<span class="sourceLineNo">2177</span>    region.put(put);<a name="line.2177"></a>
+<span class="sourceLineNo">2178</span><a name="line.2178"></a>
+<span class="sourceLineNo">2179</span>    put = new Put(row);<a name="line.2179"></a>
+<span class="sourceLineNo">2180</span>    put.addColumn(fam, splitB, Bytes.toBytes("reference_B"));<a name="line.2180"></a>
+<span class="sourceLineNo">2181</span>    region.put(put);<a name="line.2181"></a>
+<span class="sourceLineNo">2182</span><a name="line.2182"></a>
+<span class="sourceLineNo">2183</span>    put = new Put(row);<a name="line.2183"></a>
+<span class="sourceLineNo">2184</span>    put.addColumn(fam, serverinfo, Bytes.toBytes("ip_address"));<a name="line.2184"></a>
+<span class="sourceLineNo">2185</span>    region.put(put);<a name="line.2185"></a>
+<span class="sourceLineNo">2186</span><a name="line.2186"></a>
+<span class="sourceLineNo">2187</span>    // ok now delete a split:<a name="line.2187"></a>
+<span class="sourceLineNo">2188</span>    Delete delete = new Delete(row);<a name="line.2188"></a>
+<span class="sourceLineNo">2189</span>    delete.addColumns(fam, splitA);<a name="line.2189"></a>
+<span class="sourceLineNo">2190</span>    region.delete(delete);<a name="line.2190"></a>
+<span class="sourceLineNo">2191</span><a name="line.2191"></a>
+<span class="sourceLineNo">2192</span>    // assert some things:<a name="line.2192"></a>
+<span class="sourceLineNo">2193</span>    Get get = new Get(row).addColumn(fam, serverinfo);<a name="line.2193"></a>
+<span class="sourceLineNo">2194</span>    Result result = region.get(get);<a name="line.2194"></a>
+<span class="sourceLineNo">2195</span>    assertEquals(1, result.size());<a name="line.2195"></a>
+<span class="sourceLineNo">2196</span><a name="line.2196"></a>
+<span class="sourceLineNo">2197</span>    get = new Get(row).addColumn(fam, splitA);<a name="line.2197"></a>
+<span class="sourceLineNo">2198</span>    result = region.get(get);<a name="line.2198"></a>
+<span class="sourceLineNo">2199</span>    assertEquals(0, result.size());<a name="line.2199"></a>
+<span class="sourceLineNo">2200</span><a name="line.2200"></a>
+<span class="sourceLineNo">2201</span>    get = new Get(row).addColumn(fam, splitB);<a name="line.2201"></a>
+<span class="sourceLineNo">2202</span>    result = region.get(get);<a name="line.2202"></a>
+<span class="sourceLineNo">2203</span>    assertEquals(1, result.size());<a name="line.2203"></a>
+<span class="sourceLineNo">2204</span><a name="line.2204"></a>
+<span class="sourceLineNo">2205</span>    // Assert that after a delete, I can put.<a name="line.2205"></a>
+<span class="sourceLineNo">2206</span>    put = new Put(row);<a name="line.2206"></a>
+<span class="sourceLineNo">2207</span>    put.addColumn(fam, splitA, Bytes.toBytes("reference_A"));<a name="line.2207"></a>
+<span class="sourceLineNo">2208</span>    region.put(put);<a name="line.2208"></a>
+<span class="sourceLineNo">2209</span>    get = new Get(row);<a name="line.2209"></a>
+<span class="sourceLineNo">2210</span>    result = region.get(get);<a name="line.2210"></a>
+<span class="sourceLineNo">2211</span>    assertEquals(3, result.size());<a name="line.2211"></a>
+<span class="sourceLineNo">2212</span><a name="line.2212"></a>
+<span class="sourceLineNo">2213</span>    // Now delete all... then test I can add stuff back<a name="line.2213"></a>
+<span class="sourceLineNo">2214</span>    delete = new Delete(row);<a name="line.2214"></a>
+<span class="sourceLineNo">2215</span>    region.delete(delete);<a name="line.2215"></a>
+<span class="sourceLineNo">2216</span>    assertEquals(0, region.get(get).size());<a name="line.2216"></a>
+<span class="sourceLineNo">2217</span><a name="line.2217"></a>
+<span class="sourceLineNo">2218</span>    region.put(new Put(row).addColumn(fam, splitA, Bytes.toBytes("reference_A")));<a name="line.2218"></a>
+<span class="sourceLineNo">2219</span>    result = region.get(get);<a name="line.2219"></a>
+<span class="sourceLineNo">2220</span>    assertEquals(1, result.size());<a name="line.2220"></a>
+<span class="sourceLineNo">2221</span>  }<a name="line.2221"></a>
+<span class="sourceLineNo">2222</span><a name="line.2222"></a>
+<span class="sourceLineNo">2223</span>  @Test<a name="line.2223"></a>
+<span class="sourceLineNo">2224</span>  public void testDeleteRowWithFutureTs() throws IOException {<a name="line.2224"></a>
+<span class="sourceLineNo">2225</span>    byte[] fam = Bytes.toBytes("info");<a name="line.2225"></a>
+<span class="sourceLineNo">2226</span>    byte[][] families = { fam };<a name="line.2226"></a>
+<span class="sourceLineNo">2227</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2227"></a>
+<span class="sourceLineNo">2228</span>    byte[] row = Bytes.toBytes("table_name");<a name="line.2228"></a>
+<span class="sourceLineNo">2229</span>    // column names<a name="line.2229"></a>
+<span class="sourceLineNo">2230</span>    byte[] serverinfo = Bytes.toBytes("serverinfo");<a name="line.2230"></a>
+<span class="sourceLineNo">2231</span><a name="line.2231"></a>
+<span class="sourceLineNo">2232</span>    // add data in the far future<a name="line.2232"></a>
+<span class="sourceLineNo">2233</span>    Put put = new Put(row);<a name="line.2233"></a>
+<span class="sourceLineNo">2234</span>    put.addColumn(fam, serverinfo, HConstants.LATEST_TIMESTAMP - 5, Bytes.toBytes("value"));<a name="line.2234"></a>
+<span class="sourceLineNo">2235</span>    region.put(put);<a name="line.2235"></a>
+<span class="sourceLineNo">2236</span><a name="line.2236"></a>
+<span class="sourceLineNo">2237</span>    // now delete something in the present<a name="line.2237"></a>
+<span class="sourceLineNo">2238</span>    Delete delete = new Delete(row);<a name="line.2238"></a>
+<span class="sourceLineNo">2239</span>    region.delete(delete);<a name="line.2239"></a>
+<span class="sourceLineNo">2240</span><a name="line.2240"></a>
+<span class="sourceLineNo">2241</span>    // make sure we still see our data<a name="line.2241"></a>
+<span class="sourceLineNo">2242</span>    Get get = new Get(row).addColumn(fam, serverinfo);<a name="line.2242"></a>
+<span class="sourceLineNo">2243</span>    Result result = region.get(get);<a name="line.2243"></a>
+<span class="sourceLineNo">2244</span>    assertEquals(1, result.size());<a name="line.2244"></a>
+<span class="sourceLineNo">2245</span><a name="line.2245"></a>
+<span class="sourceLineNo">2246</span>    // delete the future row<a name="line.2246"></a>
+<span class="sourceLineNo">2247</span>    delete = new Delete(row, HConstants.LATEST_TIMESTAMP - 3);<a name="line.2247"></a>
+<span class="sourceLineNo">2248</span>    region.delete(delete);<a name="line.2248"></a>
+<span class="sourceLineNo">2249</span><a name="line.2249"></a>
+<span class="sourceLineNo">2250</span>    // make sure it is gone<a name="line.2250"></a>
+<span class="sourceLineNo">2251</span>    get = new Get(row).addColumn(fam, serverinfo);<a name="line.2251"></a>
+<span class="sourceLineNo">2252</span>    result = region.get(get);<a name="line.2252"></a>
+<span class="sourceLineNo">2253</span>    assertEquals(0, result.size());<a name="line.2253"></a>
+<span class="sourceLineNo">2254</span>  }<a name="line.2254"></a>
+<span class="sourceLineNo">2255</span><a name="line.2255"></a>
+<span class="sourceLineNo">2256</span>  /**<a name="line.2256"></a>
+<span class="sourceLineNo">2257</span>   * Tests that the special LATEST_TIMESTAMP option for puts gets replaced by<a name="line.2257"></a>
+<span class="sourceLineNo">2258</span>   * the actual timestamp<a name="line.2258"></a>
+<span class="sourceLineNo">2259</span>   */<a name="line.2259"></a>
+<span class="sourceLineNo">2260</span>  @Test<a name="line.2260"></a>
+<span class="sourceLineNo">2261</span>  public void testPutWithLatestTS() throws IOException {<a name="line.2261"></a>
+<span class="sourceLineNo">2262</span>    byte[] fam = Bytes.toBytes("info");<a name="line.2262"></a>
+<span class="sourceLineNo">2263</span>    byte[][] families = { fam };<a name="line.2263"></a>
+<span class="sourceLineNo">2264</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2264"></a>
+<span class="sourceLineNo">2265</span>    byte[] row = Bytes.toBytes("row1");<a name="line.2265"></a>
+<span class="sourceLineNo">2266</span>    // column names<a name="line.2266"></a>
+<span class="sourceLineNo">2267</span>    byte[] qual = Bytes.toBytes("qual");<a name="line.2267"></a>
+<span class="sourceLineNo">2268</span><a name="line.2268"></a>
+<span class="sourceLineNo">2269</span>    // add data with LATEST_TIMESTAMP, put without WAL<a name="line.2269"></a>
+<span class="sourceLineNo">2270</span>    Put put = new Put(row);<a name="line.2270"></a>
+<span class="sourceLineNo">2271</span>    put.addColumn(fam, qual, HConstants.LATEST_TIMESTAMP, Bytes.toBytes("value"));<a name="line.2271"></a>
+<span class="sourceLineNo">2272</span>    region.put(put);<a name="line.2272"></a>
+<span class="sourceLineNo">2273</span><a name="line.2273"></a>
+<span class="sourceLineNo">2274</span>    // Make sure it shows up with an actual timestamp<a name="line.2274"></a>
+<span class="sourceLineNo">2275</span>    Get get = new Get(row).addColumn(fam, qual);<a name="line.2275"></a>
+<span class="sourceLineNo">2276</span>    Result result = region.get(get);<a name="line.2276"></a>
+<span class="sourceLineNo">2277</span>    assertEquals(1, result.size());<a name="line.2277"></a>
+<span class="sourceLineNo">2278</span>    Cell kv = result.rawCells()[0];<a name="line.2278"></a>
+<span class="sourceLineNo">2279</span>    LOG.info("Got: " + kv);<a name="line.2279"></a>
+<span class="sourceLineNo">2280</span>    assertTrue("LATEST_TIMESTAMP was not replaced with real timestamp",<a name="line.2280"></a>
+<span class="sourceLineNo">2281</span>        kv.getTimestamp() != HConstants.LATEST_TIMESTAMP);<a name="line.2281"></a>
+<span class="sourceLineNo">2282</span><a name="line.2282"></a>
+<span class="sourceLineNo">2283</span>    // Check same with WAL enabled (historically these took different<a name="line.2283"></a>
+<span class="sourceLineNo">2284</span>    // code paths, so check both)<a name="line.2284"></a>
+<span class="sourceLineNo">2285</span>    row = Bytes.toBytes("row2");<a name="line.2285"></a>
+<span class="sourceLineNo">2286</span>    put = new Put(row);<a name="line.2286"></a>
+<span class="sourceLineNo">2287</span>    put.addColumn(fam, qual, HConstants.LATEST_TIMESTAMP, Bytes.toBytes("value"));<a name="line.2287"></a>
+<span class="sourceLineNo">2288</span>    region.put(put);<a name="line.2288"></a>
+<span class="sourceLineNo">2289</span><a name="line.2289"></a>
+<span class="sourceLineNo">2290</span>    // Make sure it shows up with an actual timestamp<a name="line.2290"></a>
+<span class="sourceLineNo">2291</span>    get = new Get(row).addColumn(fam, qual);<a name="line.2291"></a>
+<span class="sourceLineNo">2292</span>    result = region.get(get);<a name="line.2292"></a>
+<span class="sourceLineNo">2293</span>    assertEquals(1, result.size());<a name="line.2293"></a>
+<span class="sourceLineNo">2294</span>    kv = result.rawCells()[0];<a name="line.2294"></a>
+<span class="sourceLineNo">2295</span>    LOG.info("Got: " + kv);<a name="line.2295"></a>
+<span class="sourceLineNo">2296</span>    assertTrue("LATEST_TIMESTAMP was not replaced with real timestamp",<a name="line.2296"></a>
+<span class="sourceLineNo">2297</span>        kv.getTimestamp() != HConstants.LATEST_TIMESTAMP);<a name="line.2297"></a>
+<span class="sourceLineNo">2298</span>  }<a name="line.2298"></a>
+<span class="sourceLineNo">2299</span><a name="line.2299"></a>
+<span class="sourceLineNo">2300</span>  /**<a name="line.2300"></a>
+<span class="sourceLineNo">2301</span>   * Tests that there is server-side filtering for invalid timestamp upper<a name="line.2301"></a>
+<span class="sourceLineNo">2302</span>   * bound. Note that the timestamp lower bound is automatically handled for us<a name="line.2302"></a>
+<span class="sourceLineNo">2303</span>   * by the TTL field.<a name="line.2303"></a>
+<span class="sourceLineNo">2304</span>   */<a name="line.2304"></a>
+<span class="sourceLineNo">2305</span>  @Test<a name="line.2305"></a>
+<span class="sourceLineNo">2306</span>  public void testPutWithTsSlop() throws IOException {<a name="line.2306"></a>
+<span class="sourceLineNo">2307</span>    byte[] fam = Bytes.toBytes("info");<a name="line.2307"></a>
+<span class="sourceLineNo">2308</span>    byte[][] families = { fam };<a name="line.2308"></a>
+<span class="sourceLineNo">2309</span><a name="line.2309"></a>
+<span class="sourceLineNo">2310</span>    // add data with a timestamp that is too recent for range. Ensure assert<a name="line.2310"></a>
+<span class="sourceLineNo">2311</span>    CONF.setInt("hbase.hregion.keyvalue.timestamp.slop.millisecs", 1000);<a name="line.2311"></a>
+<span class="sourceLineNo">2312</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2312"></a>
+<span class="sourceLineNo">2313</span>    boolean caughtExcep = false;<a name="line.2313"></a>
+<span class="sourceLineNo">2314</span>    try {<a name="line.2314"></a>
+<span class="sourceLineNo">2315</span>      // no TS specified == use latest. should not error<a name="line.2315"></a>
+<span class="sourceLineNo">2316</span>      region.put(new Put(row).addColumn(fam, Bytes.toBytes("qual"), Bytes.toBytes("value")));<a name="line.2316"></a>
+<span class="sourceLineNo">2317</span>      // TS out of range. should error<a name="line.2317"></a>
+<span class="sourceLineNo">2318</span>      region.put(new Put(row).addColumn(fam, Bytes.toBytes("qual"),<a name="line.2318"></a>
+<span class="sourceLineNo">2319</span>          System.currentTimeMillis() + 2000, Bytes.toBytes("value")));<a name="line.2319"></a>
+<span class="sourceLineNo">2320</span>      fail("Expected IOE for TS out of configured timerange");<a name="line.2320"></a>
+<span class="sourceLineNo">2321</span>    } catch (FailedSanityCheckException ioe) {<a name="line.2321"></a>
+<span class="sourceLineNo">2322</span>      LOG.debug("Received expected exception", ioe);<a name="line.2322"></a>
+<span class="sourceLineNo">2323</span>      caughtExcep = true;<a name="line.2323"></a>
+<span class="sourceLineNo">2324</span>    }<a name="line.2324"></a>
+<span class="sourceLineNo">2325</span>    assertTrue("Should catch FailedSanityCheckException", caughtExcep);<a name="line.2325"></a>
+<span class="sourceLineNo">2326</span>  }<a name="line.2326"></a>
+<span class="sourceLineNo">2327</span><a name="line.2327"></a>
+<span class="sourceLineNo">2328</span>  @Test<a name="line.2328"></a>
+<span class="sourceLineNo">2329</span>  public void testScanner_DeleteOneFamilyNotAnother() throws IOException {<a name="line.2329"></a>
+<span class="sourceLineNo">2330</span>    byte[] fam1 = Bytes.toBytes("columnA");<a name="line.2330"></a>
+<span class="sourceLineNo">2331</span>    byte[] fam2 = Bytes.toBytes("columnB");<a name="line.2331"></a>
+<span class="sourceLineNo">2332</span>    this.region = initHRegion(tableName, method, CONF, fam1, fam2);<a name="line.2332"></a>
+<span class="sourceLineNo">2333</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.2333"></a>
+<span class="sourceLineNo">2334</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.2334"></a>
+<span class="sourceLineNo">2335</span><a name="line.2335"></a>
+<span class="sourceLineNo">2336</span>    byte[] value = Bytes.toBytes("value");<a name="line.2336"></a>
+<span class="sourceLineNo">2337</span><a name="line.2337"></a>
+<span class="sourceLineNo">2338</span>    Delete delete = new Delete(rowA);<a name="line.2338"></a>
+<span class="sourceLineNo">2339</span>    delete.addFamily(fam1);<a name="line.2339"></a>
+<span class="sourceLineNo">2340</span><a name="line.2340"></a>
+<span class="sourceLineNo">2341</span>    region.delete(delete);<a name="line.2341"></a>
+<span class="sourceLineNo">2342</span><a name="line.2342"></a>
+<span class="sourceLineNo">2343</span>    // now create data.<a name="line.2343"></a>
+<span class="sourceLineNo">2344</span>    Put put = new Put(rowA);<a name="line.2344"></a>
+<span class="sourceLineNo">2345</span>    put.addColumn(fam2, null, value);<a name="line.2345"></a>
+<span class="sourceLineNo">2346</span>    region.put(put);<a name="line.2346"></a>
+<span class="sourceLineNo">2347</span><a name="line.2347"></a>
+<span class="sourceLineNo">2348</span>    put = new Put(rowB);<a name="line.2348"></a>
+<span class="sourceLineNo">2349</span>    put.addColumn(fam1, null, value);<a name="line.2349"></a>
+<span class="sourceLineNo">2350</span>    put.addColumn(fam2, null, value);<a name="line.2350"></a>
+<span class="sourceLineNo">2351</span>    region.put(put);<a name="line.2351"></a>
+<span class="sourceLineNo">2352</span><a name="line.2352"></a>
+<span class="sourceLineNo">2353</span>    Scan scan = new Scan();<a name="line.2353"></a>
+<span class="sourceLineNo">2354</span>    scan.addFamily(fam1).addFamily(fam2);<a name="line.2354"></a>
+<span class="sourceLineNo">2355</span>    InternalScanner s = region.getScanner(scan);<a name="line.2355"></a>
+<span class="sourceLineNo">2356</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.2356"></a>
+<span class="sourceLineNo">2357</span>    s.next(results);<a name="line.2357"></a>
+<span class="sourceLineNo">2358</span>    assertTrue(CellUtil.matchingRows(results.get(0), rowA));<a name="line.2358"></a>
+<span class="sourceLineNo">2359</span><a name="line.2359"></a>
+<span class="sourceLineNo">2360</span>    results.clear();<a name="line.2360"></a>
+<span class="sourceLineNo">2361</span>    s.next(results);<a name="line.2361"></a>
+<span class="sourceLineNo">2362</span>    assertTrue(CellUtil.matchingRows(results.get(0), rowB));<a name="line.2362"></a>
+<span class="sourceLineNo">2363</span>  }<a name="line.2363"></a>
+<span class="sourceLineNo">2364</span><a name="line.2364"></a>
+<span class="sourceLineNo">2365</span>  @Test<a name="line.2365"></a>
+<span class="sourceLineNo">2366</span>  public void testDataInMemoryWithoutWAL() throws IOException {<a name="line.2366"></a>
+<span class="sourceLineNo">2367</span>    FileSystem fs = FileSystem.get(CONF);<a name="line.2367"></a>
+<span class="sourceLineNo">2368</span>    Path rootDir = new Path(dir + "testDataInMemoryWithoutWAL");<a name="line.2368"></a>
+<span class="sourceLineNo">2369</span>    FSHLog hLog = new FSHLog(fs, rootDir, "testDataInMemoryWithoutWAL", CONF);<a name="line.2369"></a>
+<span class="sourceLineNo">2370</span>    hLog.init();<a name="line.2370"></a>
+<span class="sourceLineNo">2371</span>    // This chunk creation is done throughout the code base. Do we want to move it into core?<a name="line.2371"></a>
+<span class="sourceLineNo">2372</span>    // It is missing from this test. W/o it we NPE.<a name="line.2372"></a>
+<span class="sourceLineNo">2373</span>    ChunkCreator.initialize(MemStoreLABImpl.CHUNK_SIZE_DEFAULT, false, 0, 0, 0, null);<a name="line.2373"></a>
+<span class="sourceLineNo">2374</span>    region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, hLog,<a name="line.2374"></a>
+<span class="sourceLineNo">2375</span>        COLUMN_FAMILY_BYTES);<a name="line.2375"></a>
+<span class="sourceLineNo">2376</span><a name="line.2376"></a>
+<span class="sourceLineNo">2377</span>    Cell originalCell = CellUtil.createCell(row, COLUMN_FAMILY_BYTES, qual1,<a name="line.2377"></a>
+<span class="sourceLineNo">2378</span>      System.currentTimeMillis(), KeyValue.Type.Put.getCode(), value1);<a name="line.2378"></a>
+<span class="sourceLineNo">2379</span>    final long originalSize = originalCell.getSerializedSize();<a name="line.2379"></a>
+<span class="sourceLineNo">2380</span><a name="line.2380"></a>
+<span class="sourceLineNo">2381</span>    Cell addCell = CellUtil.createCell(row, COLUMN_FAMILY_BYTES, qual1,<a name="line.2381"></a>
+<span class="sourceLineNo">2382</span>      System.currentTimeMillis(), KeyValue.Type.Put.getCode(), Bytes.toBytes("xxxxxxxxxx"));<a name="line.2382"></a>
+<span class="sourceLineNo">2383</span>    final long addSize = addCell.getSerializedSize();<a name="line.2383"></a>
+<span class="sourceLineNo">2384</span><a name="line.2384"></a>
+<span class="sourceLineNo">2385</span>    LOG.info("originalSize:" + originalSize<a name="line.2385"></a>
+<span class="sourceLineNo">2386</span>      + ", addSize:" + addSize);<a name="line.2386"></a>
+<span class="sourceLineNo">2387</span>    // start test. We expect that the addPut's durability will be replaced<a name="line.2387"></a>
+<span class="sourceLineNo">2388</span>    // by originalPut's durability.<a name="line.2388"></a>
+<span class="sourceLineNo">2389</span><a name="line.2389"></a>
+<span class="sourceLineNo">2390</span>    // case 1:<a name="line.2390"></a>
+<span class="sourceLineNo">2391</span>    testDataInMemoryWithoutWAL(region,<a name="line.2391"></a>
+<span class="sourceLineNo">2392</span>            new Put(row).add(originalCell).setDurability(Durability.SKIP_WAL),<a name="line.2392"></a>
+<span class="sourceLineNo">2393</span>            new Put(row).add(addCell).setDurability(Durability.SKIP_WAL),<a name="line.2393"></a>
+<span class="sourceLineNo">2394</span>            originalSize + addSize);<a name="line.2394"></a>
+<span class="sourceLineNo">2395</span><a name="line.2395"></a>
+<span class="sourceLineNo">2396</span>    // case 2:<a name="line.2396"></a>
+<span class="sourceLineNo">2397</span>    testDataInMemoryWithoutWAL(region,<a name="line.2397"></a>
+<span class="sourceLineNo">2398</span>            new Put(row).add(originalCell).setDurability(Durability.SKIP_WAL),<a name="line.2398"></a>
+<span class="sourceLineNo">2399</span>            new Put(row).add(addCell).setDurability(Durability.SYNC_WAL),<a name="line.2399"></a>
+<span class="sourceLineNo">2400</span>            originalSize + addSize);<a name="line.2400"></a>
+<span class="sourceLineNo">2401</span><a name="line.2401"></a>
+<span class="sourceLineNo">2402</span>    // case 3:<a name="line.2402"></a>
+<span class="sourceLineNo">2403</span>    testDataInMemoryWithoutWAL(region,<a name="line.2403"></a>
+<span class="sourceLineNo">2404</span>            new Put(row).add(originalCell).setDurability(Durability.SYNC_WAL),<a name="line.2404"></a>
+<span class="sourceLineNo">2405</span>            new Put(row).add(addCell).setDurability(Durability.SKIP_WAL),<a name="line.2405"></a>
+<span class="sourceLineNo">2406</span>            0);<a name="line.2406"></a>
+<span class="sourceLineNo">2407</span><a name="line.2407"></a>
+<span class="sourceLineNo">2408</span>    // case 4:<a name="line.2408"></a>
+<span class="sourceLineNo">2409</span>    testDataInMemoryWithoutWAL(region,<a name="line.2409"></a>
+<span class="sourceLineNo">2410</span>            new Put(row).add(originalCell).setDurability(Durability.SYNC_WAL),<a name="line.2410"></a>
+<span class="sourceLineNo">2411</span>            new Put(row).add(addCell).setDurability(Durability.SYNC_WAL),<a name="line.2411"></a>
+<span class="sourceLineNo">2412</span>            0);<a name="line.2412"></a>
+<span class="sourceLineNo">2413</span>  }<a name="line.2413"></a>
+<span class="sourceLineNo">2414</span><a name="line.2414"></a>
+<span class="sourceLineNo">2415</span>  private static void testDataInMemoryWithoutWAL(HRegion region, Put originalPut,<a name="line.2415"></a>
+<span class="sourceLineNo">2416</span>          final Put addPut, long delta) throws IOException {<a name="line.2416"></a>
+<span class="sourceLineNo">2417</span>    final long initSize = region.getDataInMemoryWithoutWAL();<a name="line.2417"></a>
+<span class="sourceLineNo">2418</span>    // save normalCPHost and replaced by mockedCPHost<a name="line.2418"></a>
+<span class="sourceLineNo">2419</span>    RegionCoprocessorHost normalCPHost = region.getCoprocessorHost();<a name="line.2419"></a>
+<span class="sourceLineNo">2420</span>    RegionCoprocessorHost mockedCPHost = Mockito.mock(RegionCoprocessorHost.class);<a name="line.2420"></a>
+<span class="sourceLineNo">2421</span>    // Because the preBatchMutate returns void, we can't do usual Mockito when...then form. Must<a name="line.2421"></a>
+<span class="sourceLineNo">2422</span>    // do below format (from Mockito doc).<a name="line.2422"></a>
+<span class="sourceLineNo">2423</span>    Mockito.doAnswer(new Answer&lt;Void&gt;() {<a name="line.2423"></a>
+<span class="sourceLineNo">2424</span>      @Override<a name="line.2424"></a>
+<span class="sourceLineNo">2425</span>      public Void answer(InvocationOnMock invocation) throws Throwable {<a name="line.2425"></a>
+<span class="sourceLineNo">2426</span>        MiniBatchOperationInProgress&lt;Mutation&gt; mb = invocation.getArgument(0);<a name="line.2426"></a>
+<span class="sourceLineNo">2427</span>        mb.addOperationsFromCP(0, new Mutation[]{addPut});<a name="line.2427"></a>
+<span class="sourceLineNo">2428</span>        return null;<a name="line.2428"></a>
+<span class="sourceLineNo">2429</span>      }<a name="line.2429"></a>
+<span class="sourceLineNo">2430</span>    }).when(mockedCPHost).preBatchMutate(Mockito.isA(MiniBatchOperationInProgress.class));<a name="line.2430"></a>
+<span class="sourceLineNo">2431</span>    ColumnFamilyDescriptorBuilder builder = ColumnFamilyDescriptorBuilder.<a name="line.2431"></a>
+<span class="sourceLineNo">2432</span>        newBuilder(COLUMN_FAMILY_BYTES);<a name="line.2432"></a>
+<span class="sourceLineNo">2433</span>    ScanInfo info = new ScanInfo(CONF, builder.build(), Long.MAX_VALUE,<a name="line.2433"></a>
+<span class="sourceLineNo">2434</span>        Long.MAX_VALUE, region.getCellComparator());<a name="line.2434"></a>
+<span class="sourceLineNo">2435</span>    Mockito.when(mockedCPHost.preFlushScannerOpen(Mockito.any(HStore.class),<a name="line.2435"></a>
+<span class="sourceLineNo">2436</span>        Mockito.any())).thenReturn(info);<a name="line.2436"></a>
+<span class="sourceLineNo">2437</span>    Mockito.when(mockedCPHost.preFlush(Mockito.any(), Mockito.any(StoreScanner.class),<a name="line.2437"></a>
+<span class="sourceLineNo">2438</span>        Mockito.any())).thenAnswer(i -&gt; i.getArgument(1));<a name="line.2438"></a>
+<span class="sourceLineNo">2439</span>    region.setCoprocessorHost(mockedCPHost);<a name="line.2439"></a>
+<span class="sourceLineNo">2440</span><a name="line.2440"></a>
+<span class="sourceLineNo">2441</span>    region.put(originalPut);<a name="line.2441"></a>
+<span class="sourceLineNo">2442</span>    region.setCoprocessorHost(normalCPHost);<a name="line.2442"></a>
+<span class="sourceLineNo">2443</span>    final long finalSize = region.getDataInMemoryWithoutWAL();<a name="line.2443"></a>
+<span class="sourceLineNo">2444</span>    assertEquals("finalSize:" + finalSize + ", initSize:"<a name="line.2444"></a>
+<span class="sourceLineNo">2445</span>      + initSize + ", delta:" + delta,finalSize, initSize + delta);<a name="line.2445"></a>
+<span class="sourceLineNo">2446</span>  }<a name="line.2446"></a>
+<span class="sourceLineNo">2447</span><a name="line.2447"></a>
+<span class="sourceLineNo">2448</span>  @Test<a name="line.2448"></a>
+<span class="sourceLineNo">2449</span>  public void testDeleteColumns_PostInsert() throws IOException, InterruptedException {<a name="line.2449"></a>
+<span class="sourceLineNo">2450</span>    Delete delete = new Delete(row);<a name="line.2450"></a>
+<span class="sourceLineNo">2451</span>    delete.addColumns(fam1, qual1);<a name="line.2451"></a>
+<span class="sourceLineNo">2452</span>    doTestDelete_AndPostInsert(delete);<a name="line.2452"></a>
+<span class="sourceLineNo">2453</span>  }<a name="line.2453"></a>
+<span class="sourceLineNo">2454</span><a name="line.2454"></a>
+<span class="sourceLineNo">2455</span>  @Test<a name="line.2455"></a>
+<span class="sourceLineNo">2456</span>  public void testaddFamily_PostInsert() throws IOException, InterruptedException {<a name="line.2456"></a>
+<span class="sourceLineNo">2457</span>    Delete delete = new Delete(row);<a name="line.2457"></a>
+<span class="sourceLineNo">2458</span>    delete.addFamily(fam1);<a name="line.2458"></a>
+<span class="sourceLineNo">2459</span>    doTestDelete_AndPostInsert(delete);<a name="line.2459"></a>
+<span class="sourceLineNo">2460</span>  }<a name="line.2460"></a>
 <span class="sourceLineNo">2461</span><a name="line.2461"></a>
-<span class="sourceLineNo">2462</span>    // ok put data:<a name="line.2462"></a>
-<span class="sourceLineNo">2463</span>    put = new Put(row);<a name="line.2463"></a>
-<span class="sourceLineNo">2464</span>    put.addColumn(fam1, qual1, value2);<a name="line.2464"></a>
-<span class="sourceLineNo">2465</span>    region.put(put);<a name="line.2465"></a>
-<span class="sourceLineNo">2466</span><a name="line.2466"></a>
-<span class="sourceLineNo">2467</span>    // ok get:<a name="line.2467"></a>
-<span class="sourceLineNo">2468</span>    Get get = new Get(row);<a name="line.2468"></a>
-<span class="sourceLineNo">2469</span>    get.addColumn(fam1, qual1);<a name="line.2469"></a>
-<span class="sourceLineNo">2470</span><a name="line.2470"></a>
-<span class="sourceLineNo">2471</span>    Result r = region.get(get);<a name="line.2471"></a>
-<span class="sourceLineNo">2472</span>    assertEquals(1, r.size());<a name="line.2472"></a>
-<span class="sourceLineNo">2473</span>    assertArrayEquals(value2, r.getValue(fam1, qual1));<a name="line.2473"></a>
-<span class="sourceLineNo">2474</span><a name="line.2474"></a>
-<span class="sourceLineNo">2475</span>    // next:<a name="line.2475"></a>
-<span class="sourceLineNo">2476</span>    Scan scan = new Scan(row);<a name="line.2476"></a>
-<span class="sourceLineNo">2477</span>    scan.addColumn(fam1, qual1);<a name="line.2477"></a>
-<span class="sourceLineNo">2478</span>    InternalScanner s = region.getScanner(scan);<a name="line.2478"></a>
-<span class="sourceLineNo">2479</span><a name="line.2479"></a>
-<span class="sourceLineNo">2480</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.2480"></a>
-<span class="sourceLineNo">2481</span>    assertEquals(false, s.next(results));<a name="line.2481"></a>
-<span class="sourceLineNo">2482</span>    assertEquals(1, results.size());<a name="line.2482"></a>
-<span class="sourceLineNo">2483</span>    Cell kv = results.get(0);<a name="line.2483"></a>
+<span class="sourceLineNo">2462</span>  public void doTestDelete_AndPostInsert(Delete delete) throws IOException, InterruptedException {<a name="line.2462"></a>
+<span class="sourceLineNo">2463</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2463"></a>
+<span class="sourceLineNo">2464</span>    EnvironmentEdgeManagerTestHelper.injectEdge(new IncrementingEnvironmentEdge());<a name="line.2464"></a>
+<span class="sourceLineNo">2465</span>    Put put = new Put(row);<a name="line.2465"></a>
+<span class="sourceLineNo">2466</span>    put.addColumn(fam1, qual1, value1);<a name="line.2466"></a>
+<span class="sourceLineNo">2467</span>    region.put(put);<a name="line.2467"></a>
+<span class="sourceLineNo">2468</span><a name="line.2468"></a>
+<span class="sourceLineNo">2469</span>    // now delete the value:<a name="line.2469"></a>
+<span class="sourceLineNo">2470</span>    region.delete(delete);<a name="line.2470"></a>
+<span class="sourceLineNo">2471</span><a name="line.2471"></a>
+<span class="sourceLineNo">2472</span>    // ok put data:<a name="line.2472"></a>
+<span class="sourceLineNo">2473</span>    put = new Put(row);<a name="line.2473"></a>
+<span class="sourceLineNo">2474</span>    put.addColumn(fam1, qual1, value2);<a name="line.2474"></a>
+<span class="sourceLineNo">2475</span>    region.put(put);<a name="line.2475"></a>
+<span class="sourceLineNo">2476</span><a name="line.2476"></a>
+<span class="sourceLineNo">2477</span>    // ok get:<a name="line.2477"></a>
+<span class="sourceLineNo">2478</span>    Get get = new Get(row);<a name="line.2478"></a>
+<span class="sourceLineNo">2479</span>    get.addColumn(fam1, qual1);<a name="line.2479"></a>
+<span class="sourceLineNo">2480</span><a name="line.2480"></a>
+<span class="sourceLineNo">2481</span>    Result r = region.get(get);<a name="line.2481"></a>
+<span class="sourceLineNo">2482</span>    assertEquals(1, r.size());<a name="line.2482"></a>
+<span class="sourceLineNo">2483</span>    assertArrayEquals(value2, r.getValue(fam1, qual1));<a name="line.2483"></a>
 <span class="sourceLineNo">2484</span><a name="line.2484"></a>
-<span class="sourceLineNo">2485</span>    assertArrayEquals(value2, CellUtil.cloneValue(kv));<a name="line.2485"></a>
-<span class="sourceLineNo">2486</span>    assertArrayEquals(fam1, CellUtil.cloneFamily(kv));<a name="line.2486"></a>
-<span class="sourceLineNo">2487</span>    assertArrayEquals(qual1, CellUtil.cloneQualifier(kv));<a name="line.2487"></a>
-<span class="sourceLineNo">2488</span>    assertArrayEquals(row, CellUtil.cloneRow(kv));<a name="line.2488"></a>
-<span class="sourceLineNo">2489</span>  }<a name="line.2489"></a>
-<span class="sourceLineNo">2490</span><a name="line.2490"></a>
-<span class="sourceLineNo">2491</span>  @Test<a name="line.2491"></a>
-<span class="sourceLineNo">2492</span>  public void testDelete_CheckTimestampUpdated() throws IOException {<a name="line.2492"></a>
-<span class="sourceLineNo">2493</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2493"></a>
-<span class="sourceLineNo">2494</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.2494"></a>
-<span class="sourceLineNo">2495</span>    byte[] col2 = Bytes.toBytes("col2");<a name="line.2495"></a>
-<span class="sourceLineNo">2496</span>    byte[] col3 = Bytes.toBytes("col3");<a name="line.2496"></a>
-<span class="sourceLineNo">2497</span><a name="line.2497"></a>
-<span class="sourceLineNo">2498</span>    // Setting up region<a name="line.2498"></a>
-<span class="sourceLineNo">2499</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2499"></a>
-<span class="sourceLineNo">2500</span>    // Building checkerList<a name="line.2500"></a>
-<span class="sourceLineNo">2501</span>    List&lt;Cell&gt; kvs = new ArrayList&lt;&gt;();<a name="line.2501"></a>
-<span class="sourceLineNo">2502</span>    kvs.add(new KeyValue(row1, fam1, col1, null));<a name="line.2502"></a>
-<span class="sourceLineNo">2503</span>    kvs.add(new KeyValue(row1, fam1, col2, null));<a name="line.2503"></a>
-<span class="sourceLineNo">2504</span>    kvs.add(new KeyValue(row1, fam1, col3, null));<a name="line.2504"></a>
-<span class="sourceLineNo">2505</span><a name="line.2505"></a>
-<span class="sourceLineNo">2506</span>    NavigableMap&lt;byte[], List&lt;Cell&gt;&gt; deleteMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2506"></a>
-<span class="sourceLineNo">2507</span>    deleteMap.put(fam1, kvs);<a name="line.2507"></a>
-<span class="sourceLineNo">2508</span>    region.delete(deleteMap, Durability.SYNC_WAL);<a name="line.2508"></a>
-<span class="sourceLineNo">2509</span><a name="line.2509"></a>
-<span class="sourceLineNo">2510</span>    // extract the key values out the memstore:<a name="line.2510"></a>
-<span class="sourceLineNo">2511</span>    // This is kinda hacky, but better than nothing...<a name="line.2511"></a>
-<span class="sourceLineNo">2512</span>    long now = System.currentTimeMillis();<a name="line.2512"></a>
-<span class="sourceLineNo">2513</span>    AbstractMemStore memstore = (AbstractMemStore)region.getStore(fam1).memstore;<a name="line.2513"></a>
-<span class="sourceLineNo">2514</span>    Cell firstCell = memstore.getActive().first();<a name="line.2514"></a>
-<span class="sourceLineNo">2515</span>    assertTrue(firstCell.getTimestamp() &lt;= now);<a name="line.2515"></a>
-<span class="sourceLineNo">2516</span>    now = firstCell.getTimestamp();<a name="line.2516"></a>
-<span class="sourceLineNo">2517</span>    for (Cell cell : memstore.getActive().getCellSet()) {<a name="line.2517"></a>
-<span class="sourceLineNo">2518</span>      assertTrue(cell.getTimestamp() &lt;= now);<a name="line.2518"></a>
-<span class="sourceLineNo">2519</span>      now = cell.getTimestamp();<a name="line.2519"></a>
-<span class="sourceLineNo">2520</span>    }<a name="line.2520"></a>
-<span class="sourceLineNo">2521</span>  }<a name="line.2521"></a>
-<span class="sourceLineNo">2522</span><a name="line.2522"></a>
-<span class="sourceLineNo">2523</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2523"></a>
-<span class="sourceLineNo">2524</span>  // Get tests<a name="line.2524"></a>
-<span class="sourceLineNo">2525</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2525"></a>
-<span class="sourceLineNo">2526</span>  @Test<a name="line.2526"></a>
-<span class="sourceLineNo">2527</span>  public void testGet_FamilyChecker() throws IOException {<a name="line.2527"></a>
-<span class="sourceLineNo">2528</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2528"></a>
-<span class="sourceLineNo">2529</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2529"></a>
-<span class="sourceLineNo">2530</span>    byte[] fam2 = Bytes.toBytes("False");<a name="line.2530"></a>
-<span class="sourceLineNo">2531</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.2531"></a>
+<span class="sourceLineNo">2485</span>    // next:<a name="line.2485"></a>
+<span class="sourceLineNo">2486</span>    Scan scan = new Scan(row);<a name="line.2486"></a>
+<span class="sourceLineNo">2487</span>    scan.addColumn(fam1, qual1);<a name="line.2487"></a>
+<span class="sourceLineNo">2488</span>    InternalScanner s = region.getScanner(scan);<a name="line.2488"></a>
+<span class="sourceLineNo">2489</span><a name="line.2489"></a>
+<span class="sourceLineNo">2490</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.2490"></a>
+<span class="sourceLineNo">2491</span>    assertEquals(false, s.next(results));<a name="line.2491"></a>
+<span class="sourceLineNo">2492</span>    assertEquals(1, results.size());<a name="line.2492"></a>
+<span class="sourceLineNo">2493</span>    Cell kv = results.get(0);<a name="line.2493"></a>
+<span class="sourceLineNo">2494</span><a name="line.2494"></a>
+<span class="sourceLineNo">2495</span>    assertArrayEquals(value2, CellUtil.cloneValue(kv));<a name="line.2495"></a>
+<span class="sourceLineNo">2496</span>    assertArrayEquals(fam1, CellUtil.cloneFamily(kv));<a name="line.2496"></a>
+<span class="sourceLineNo">2497</span>    assertArrayEquals(qual1, CellUtil.cloneQualifier(kv));<a name="line.2497"></a>
+<span class="sourceLineNo">2498</span>    assertArrayEquals(row, CellUtil.cloneRow(kv));<a name="line.2498"></a>
+<span class="sourceLineNo">2499</span>  }<a name="line.2499"></a>
+<span class="sourceLineNo">2500</span><a name="line.2500"></a>
+<span class="sourceLineNo">2501</span>  @Test<a name="line.2501"></a>
+<span class="sourceLineNo">2502</span>  public void testDelete_CheckTimestampUpdated() throws IOException {<a name="line.2502"></a>
+<span class="sourceLineNo">2503</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2503"></a>
+<span class="sourceLineNo">2504</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.2504"></a>
+<span class="sourceLineNo">2505</span>    byte[] col2 = Bytes.toBytes("col2");<a name="line.2505"></a>
+<span class="sourceLineNo">2506</span>    byte[] col3 = Bytes.toBytes("col3");<a name="line.2506"></a>
+<span class="sourceLineNo">2507</span><a name="line.2507"></a>
+<span class="sourceLineNo">2508</span>    // Setting up region<a name="line.2508"></a>
+<span class="sourceLineNo">2509</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2509"></a>
+<span class="sourceLineNo">2510</span>    // Building checkerList<a name="line.2510"></a>
+<span class="sourceLineNo">2511</span>    List&lt;Cell&gt; kvs = new ArrayList&lt;&gt;();<a name="line.2511"></a>
+<span class="sourceLineNo">2512</span>    kvs.add(new KeyValue(row1, fam1, col1, null));<a name="line.2512"></a>
+<span class="sourceLineNo">2513</span>    kvs.add(new KeyValue(row1, fam1, col2, null));<a name="line.2513"></a>
+<span class="sourceLineNo">2514</span>    kvs.add(new KeyValue(row1, fam1, col3, null));<a name="line.2514"></a>
+<span class="sourceLineNo">2515</span><a name="line.2515"></a>
+<span class="sourceLineNo">2516</span>    NavigableMap&lt;byte[], List&lt;Cell&gt;&gt; deleteMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2516"></a>
+<span class="sourceLineNo">2517</span>    deleteMap.put(fam1, kvs);<a name="line.2517"></a>
+<span class="sourceLineNo">2518</span>    region.delete(deleteMap, Durability.SYNC_WAL);<a name="line.2518"></a>
+<span class="sourceLineNo">2519</span><a name="line.2519"></a>
+<span class="sourceLineNo">2520</span>    // extract the key values out the memstore:<a name="line.2520"></a>
+<span class="sourceLineNo">2521</span>    // This is kinda hacky, but better than nothing...<a name="line.2521"></a>
+<span class="sourceLineNo">2522</span>    long now = System.currentTimeMillis();<a name="line.2522"></a>
+<span class="sourceLineNo">2523</span>    AbstractMemStore memstore = (AbstractMemStore)region.getStore(fam1).memstore;<a name="line.2523"></a>
+<span class="sourceLineNo">2524</span>    Cell firstCell = memstore.getActive().first();<a name="line.2524"></a>
+<span class="sourceLineNo">2525</span>    assertTrue(firstCell.getTimestamp() &lt;= now);<a name="line.2525"></a>
+<span class="sourceLineNo">2526</span>    now = firstCell.getTimestamp();<a name="line.2526"></a>
+<span class="sourceLineNo">2527</span>    for (Cell cell : memstore.getActive().getCellSet()) {<a name="line.2527"></a>
+<span class="sourceLineNo">2528</span>      assertTrue(cell.getTimestamp() &lt;= now);<a name="line.2528"></a>
+<span class="sourceLineNo">2529</span>      now = cell.getTimestamp();<a name="line.2529"></a>
+<span class="sourceLineNo">2530</span>    }<a name="line.2530"></a>
+<span class="sourceLineNo">2531</span>  }<a name="line.2531"></a>
 <span class="sourceLineNo">2532</span><a name="line.2532"></a>
-<span class="sourceLineNo">2533</span>    // Setting up region<a name="line.2533"></a>
-<span class="sourceLineNo">2534</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2534"></a>
-<span class="sourceLineNo">2535</span>    Get get = new Get(row1);<a name="line.2535"></a>
-<span class="sourceLineNo">2536</span>    get.addColumn(fam2, col1);<a name="line.2536"></a>
-<span class="sourceLineNo">2537</span><a name="line.2537"></a>
-<span class="sourceLineNo">2538</span>    // Test<a name="line.2538"></a>
-<span class="sourceLineNo">2539</span>    try {<a name="line.2539"></a>
-<span class="sourceLineNo">2540</span>      region.get(get);<a name="line.2540"></a>
-<span class="sourceLineNo">2541</span>      fail("Expecting DoNotRetryIOException in get but did not get any");<a name="line.2541"></a>
-<span class="sourceLineNo">2542</span>    } catch (org.apache.hadoop.hbase.DoNotRetryIOException e) {<a name="line.2542"></a>
-<span class="sourceLineNo">2543</span>      LOG.info("Got expected DoNotRetryIOException successfully");<a name="line.2543"></a>
-<span class="sourceLineNo">2544</span>    }<a name="line.2544"></a>
-<span class="sourceLineNo">2545</span>  }<a name="line.2545"></a>
-<span class="sourceLineNo">2546</span><a name="line.2546"></a>
-<span class="sourceLineNo">2547</span>  @Test<a name="line.2547"></a>
-<span class="sourceLineNo">2548</span>  public void testGet_Basic() throws IOException {<a name="line.2548"></a>
-<span class="sourceLineNo">2549</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2549"></a>
-<span class="sourceLineNo">2550</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2550"></a>
-<span class="sourceLineNo">2551</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.2551"></a>
-<span class="sourceLineNo">2552</span>    byte[] col2 = Bytes.toBytes("col2");<a name="line.2552"></a>
-<span class="sourceLineNo">2553</span>    byte[] col3 = Bytes.toBytes("col3");<a name="line.2553"></a>
-<span class="sourceLineNo">2554</span>    byte[] col4 = Bytes.toBytes("col4");<a name="line.2554"></a>
-<span class="sourceLineNo">2555</span>    byte[] col5 = Bytes.toBytes("col5");<a name="line.2555"></a>
+<span class="sourceLineNo">2533</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2533"></a>
+<span class="sourceLineNo">2534</span>  // Get tests<a name="line.2534"></a>
+<span class="sourceLineNo">2535</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2535"></a>
+<span class="sourceLineNo">2536</span>  @Test<a name="line.2536"></a>
+<span class="sourceLineNo">2537</span>  public void testGet_FamilyChecker() throws IOException {<a name="line.2537"></a>
+<span class="sourceLineNo">2538</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2538"></a>
+<span class="sourceLineNo">2539</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2539"></a>
+<span class="sourceLineNo">2540</span>    byte[] fam2 = Bytes.toBytes("False");<a name="line.2540"></a>
+<span class="sourceLineNo">2541</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.2541"></a>
+<span class="sourceLineNo">2542</span><a name="line.2542"></a>
+<span class="sourceLineNo">2543</span>    // Setting up region<a name="line.2543"></a>
+<span class="sourceLineNo">2544</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2544"></a>
+<span class="sourceLineNo">2545</span>    Get get = new Get(row1);<a name="line.2545"></a>
+<span class="sourceLineNo">2546</span>    get.addColumn(fam2, col1);<a name="line.2546"></a>
+<span class="sourceLineNo">2547</span><a name="line.2547"></a>
+<span class="sourceLineNo">2548</span>    // Test<a name="line.2548"></a>
+<span class="sourceLineNo">2549</span>    try {<a name="line.2549"></a>
+<span class="sourceLineNo">2550</span>      region.get(get);<a name="line.2550"></a>
+<span class="sourceLineNo">2551</span>      fail("Expecting DoNotRetryIOException in get but did not get any");<a name="line.2551"></a>
+<span class="sourceLineNo">2552</span>    } catch (org.apache.hadoop.hbase.DoNotRetryIOException e) {<a name="line.2552"></a>
+<span class="sourceLineNo">2553</span>      LOG.info("Got expected DoNotRetryIOException successfully");<a name="line.2553"></a>
+<span class="sourceLineNo">2554</span>    }<a name="line.2554"></a>
+<span class="sourceLineNo">2555</span>  }<a name="line.2555"></a>
 <span class="sourceLineNo">2556</span><a name="line.2556"></a>
-<span class="sourceLineNo">2557</span>    // Setting up region<a name="line.2557"></a>
-<span class="sourceLineNo">2558</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2558"></a>
-<span class="sourceLineNo">2559</span>    // Add to memstore<a name="line.2559"></a>
-<span class="sourceLineNo">2560</span>    Put put = new Put(row1);<a name="line.2560"></a>
-<span class="sourceLineNo">2561</span>    put.addColumn(fam1, col1, null);<a name="line.2561"></a>
-<span class="sourceLineNo">2562</span>    put.addColumn(fam1, col2, null);<a name="line.2562"></a>
-<span class="sourceLineNo">2563</span>    put.addColumn(fam1, col3, null);<a name="line.2563"></a>
-<span class="sourceLineNo">2564</span>    put.addColumn(fam1, col4, null);<a name="line.2564"></a>
-<span class="sourceLineNo">2565</span>    put.addColumn(fam1, col5, null);<a name="line.2565"></a>
-<span class="sourceLineNo">2566</span>    region.put(put);<a name="line.2566"></a>
-<span class="sourceLineNo">2567</span><a name="line.2567"></a>
-<span class="sourceLineNo">2568</span>    Get get = new Get(row1);<a name="line.2568"></a>
-<span class="sourceLineNo">2569</span>    get.addColumn(fam1, col2);<a name="line.2569"></a>
-<span class="sourceLineNo">2570</span>    get.addColumn(fam1, col4);<a name="line.2570"></a>
-<span class="sourceLineNo">2571</span>    // Expected result<a name="line.2571"></a>
-<span class="sourceLineNo">2572</span>    KeyValue kv1 = new KeyValue(row1, fam1, col2);<a name="line.2572"></a>
-<span class="sourceLineNo">2573</span>    KeyValue kv2 = new KeyValue(row1, fam1, col4);<a name="line.2573"></a>
-<span class="sourceLineNo">2574</span>    KeyValue[] expected = { kv1, kv2 };<a name="line.2574"></a>
-<span class="sourceLineNo">2575</span><a name="line.2575"></a>
-<span class="sourceLineNo">2576</span>    // Test<a name="line.2576"></a>
-<span class="sourceLineNo">2577</span>    Result res = region.get(get);<a name="line.2577"></a>
-<span class="sourceLineNo">2578</span>    assertEquals(expected.length, res.size());<a name="line.2578"></a>
-<span class="sourceLineNo">2579</span>    for (int i = 0; i &lt; res.size(); i++) {<a name="line.2579"></a>
-<span class="sourceLineNo">2580</span>      assertTrue(CellUtil.matchingRows(expected[i], res.rawCells()[i]));<a name="line.2580"></a>
-<span class="sourceLineNo">2581</span>      assertTrue(CellUtil.matchingFamily(expected[i], res.rawCells()[i]));<a name="line.2581"></a>
-<span class="sourceLineNo">2582</span>      assertTrue(CellUtil.matchingQualifier(expected[i], res.rawCells()[i]));<a name="line.2582"></a>
-<span class="sourceLineNo">2583</span>    }<a name="line.2583"></a>
-<span class="sourceLineNo">2584</span><a name="line.2584"></a>
-<span class="sourceLineNo">2585</span>    // Test using a filter on a Get<a name="line.2585"></a>
-<span class="sourceLineNo">2586</span>    Get g = new Get(row1);<a name="line.2586"></a>
-<span class="sourceLineNo">2587</span>    final int count = 2;<a name="line.2587"></a>
-<span class="sourceLineNo">2588</span>    g.setFilter(new ColumnCountGetFilter(count));<a name="line.2588"></a>
-<span class="sourceLineNo">2589</span>    res = region.get(g);<a name="line.2589"></a>
-<span class="sourceLineNo">2590</span>    assertEquals(count, res.size());<a name="line.2590"></a>
-<span class="sourceLineNo">2591</span>  }<a name="line.2591"></a>
-<span class="sourceLineNo">2592</span><a name="line.2592"></a>
-<span class="sourceLineNo">2593</span>  @Test<a name="line.2593"></a>
-<span class="sourceLineNo">2594</span>  public void testGet_Empty() throws IOException {<a name="line.2594"></a>
-<span class="sourceLineNo">2595</span>    byte[] row = Bytes.toBytes("row");<a name="line.2595"></a>
-<span class="sourceLineNo">2596</span>    byte[] fam = Bytes.toBytes("fam");<a name="line.2596"></a>
-<span class="sourceLineNo">2597</span><a name="line.2597"></a>
-<span class="sourceLineNo">2598</span>    this.region = initHRegion(tableName, method, CONF, fam);<a name="line.2598"></a>
-<span class="sourceLineNo">2599</span>    Get get = new Get(row);<a name="line.2599"></a>
-<span class="sourceLineNo">2600</span>    get.addFamily(fam);<a name="line.2600"></a>
-<span class="sourceLineNo">2601</span>    Result r = region.get(get);<a name="line.2601"></a>
+<span class="sourceLineNo">2557</span>  @Test<a name="line.2557"></a>
+<span class="sourceLineNo">2558</span>  public void testGet_Basic() throws IOException {<a name="line.2558"></a>
+<span class="sourceLineNo">2559</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2559"></a>
+<span class="sourceLineNo">2560</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2560"></a>
+<span class="sourceLineNo">2561</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.2561"></a>
+<span class="sourceLineNo">2562</span>    byte[] col2 = Bytes.toBytes("col2");<a name="line.2562"></a>
+<span class="sourceLineNo">2563</span>    byte[] col3 = Bytes.toBytes("col3");<a name="line.2563"></a>
+<span class="sourceLineNo">2564</span>    byte[] col4 = Bytes.toBytes("col4");<a name="line.2564"></a>
+<span class="sourceLineNo">2565</span>    byte[] col5 = Bytes.toBytes("col5");<a name="line.2565"></a>
+<span class="sourceLineNo">2566</span><a name="line.2566"></a>
+<span class="sourceLineNo">2567</span>    // Setting up region<a name="line.2567"></a>
+<span class="sourceLineNo">2568</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2568"></a>
+<span class="sourceLineNo">2569</span>    // Add to memstore<a name="line.2569"></a>
+<span class="sourceLineNo">2570</span>    Put put = new Put(row1);<a name="line.2570"></a>
+<span class="sourceLineNo">2571</span>    put.addColumn(fam1, col1, null);<a name="line.2571"></a>
+<span class="sourceLineNo">2572</span>    put.addColumn(fam1, col2, null);<a name="line.2572"></a>
+<span class="sourceLineNo">2573</span>    put.addColumn(fam1, col3, null);<a name="line.2573"></a>
+<span class="sourceLineNo">2574</span>    put.addColumn(fam1, col4, null);<a name="line.2574"></a>
+<span class="sourceLineNo">2575</span>    put.addColumn(fam1, col5, null);<a name="line.2575"></a>
+<span class="sourceLineNo">2576</span>    region.put(put);<a name="line.2576"></a>
+<span class="sourceLineNo">2577</span><a name="line.2577"></a>
+<span class="sourceLineNo">2578</span>    Get get = new Get(row1);<a name="line.2578"></a>
+<span class="sourceLineNo">2579</span>    get.addColumn(fam1, col2);<a name="line.2579"></a>
+<span class="sourceLineNo">2580</span>    get.addColumn(fam1, col4);<a name="line.2580"></a>
+<span class="sourceLineNo">2581</span>    // Expected result<a name="line.2581"></a>
+<span class="sourceLineNo">2582</span>    KeyValue kv1 = new KeyValue(row1, fam1, col2);<a name="line.2582"></a>
+<span class="sourceLineNo">2583</span>    KeyValue kv2 = new KeyValue(row1, fam1, col4);<a name="line.2583"></a>
+<span class="sourceLineNo">2584</span>    KeyValue[] expected = { kv1, kv2 };<a name="line.2584"></a>
+<span class="sourceLineNo">2585</span><a name="line.2585"></a>
+<span class="sourceLineNo">2586</span>    // Test<a name="line.2586"></a>
+<span class="sourceLineNo">2587</span>    Result res = region.get(get);<a name="line.2587"></a>
+<span class="sourceLineNo">2588</span>    assertEquals(expected.length, res.size());<a name="line.2588"></a>
+<span class="sourceLineNo">2589</span>    for (int i = 0; i &lt; res.size(); i++) {<a name="line.2589"></a>
+<span class="sourceLineNo">2590</span>      assertTrue(CellUtil.matchingRows(expected[i], res.rawCells()[i]));<a name="line.2590"></a>
+<span class="sourceLineNo">2591</span>      assertTrue(CellUtil.matchingFamily(expected[i], res.rawCells()[i]));<a name="line.2591"></a>
+<span class="sourceLineNo">2592</span>      assertTrue(CellUtil.matchingQualifier(expected[i], res.rawCells()[i]));<a name="line.2592"></a>
+<span class="sourceLineNo">2593</span>    }<a name="line.2593"></a>
+<span class="sourceLineNo">2594</span><a name="line.2594"></a>
+<span class="sourceLineNo">2595</span>    // Test using a filter on a Get<a name="line.2595"></a>
+<span class="sourceLineNo">2596</span>    Get g = new Get(row1);<a name="line.2596"></a>
+<span class="sourceLineNo">2597</span>    final int count = 2;<a name="line.2597"></a>
+<span class="sourceLineNo">2598</span>    g.setFilter(new ColumnCountGetFilter(count));<a name="line.2598"></a>
+<span class="sourceLineNo">2599</span>    res = region.get(g);<a name="line.2599"></a>
+<span class="sourceLineNo">2600</span>    assertEquals(count, res.size());<a name="line.2600"></a>
+<span class="sourceLineNo">2601</span>  }<a name="line.2601"></a>
 <span class="sourceLineNo">2602</span><a name="line.2602"></a>
-<span class="sourceLineNo">2603</span>    assertTrue(r.isEmpty());<a name="line.2603"></a>
-<span class="sourceLineNo">2604</span>  }<a name="line.2604"></a>
-<span class="sourceLineNo">2605</span><a name="line.2605"></a>
-<span class="sourceLineNo">2606</span>  @Test<a name="line.2606"></a>
-<span class="sourceLineNo">2607</span>  public void testGetWithFilter() throws IOException, InterruptedException {<a name="line.2607"></a>
-<span class="sourceLineNo">2608</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2608"></a>
-<span class="sourceLineNo">2609</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2609"></a>
-<span class="sourceLineNo">2610</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.2610"></a>
-<span class="sourceLineNo">2611</span>    byte[] value1 = Bytes.toBytes("value1");<a name="line.2611"></a>
-<span class="sourceLineNo">2612</span>    byte[] value2 = Bytes.toBytes("value2");<a name="line.2612"></a>
-<span class="sourceLineNo">2613</span><a name="line.2613"></a>
-<span class="sourceLineNo">2614</span>    final int maxVersions = 3;<a name="line.2614"></a>
-<span class="sourceLineNo">2615</span>    HColumnDescriptor hcd = new HColumnDescriptor(fam1);<a name="line.2615"></a>
-<span class="sourceLineNo">2616</span>    hcd.setMaxVersions(maxVersions);<a name="line.2616"></a>
-<span class="sourceLineNo">2617</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf("testFilterAndColumnTracker"));<a name="line.2617"></a>
-<span class="sourceLineNo">2618</span>    htd.addFamily(hcd);<a name="line.2618"></a>
-<span class="sourceLineNo">2619</span>    ChunkCreator.initialize(MemStoreLABImpl.CHUNK_SIZE_DEFAULT, false, 0, 0, 0, null);<a name="line.2619"></a>
-<span class="sourceLineNo">2620</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.2620"></a>
-<span class="sourceLineNo">2621</span>    Path logDir = TEST_UTIL.getDataTestDirOnTestFS(method + ".log");<a name="line.2621"></a>
-<span class="sourceLineNo">2622</span>    final WAL wal = HBaseTestingUtility.createWal(TEST_UTIL.getConfiguration(), logDir, info);<a name="line.2622"></a>
-<span class="sourceLineNo">2623</span>    this.region = TEST_UTIL.createLocalHRegion(info, htd, wal);<a name="line.2623"></a>
-<span class="sourceLineNo">2624</span><a name="line.2624"></a>
-<span class="sourceLineNo">2625</span>    // Put 4 version to memstore<a name="line.2625"></a>
-<span class="sourceLineNo">2626</span>    long ts = 0;<a name="line.2626"></a>
-<span class="sourceLineNo">2627</span>    Put put = new Put(row1, ts);<a name="line.2627"></a>
-<span class="sourceLineNo">2628</span>    put.addColumn(fam1, col1, value1);<a name="line.2628"></a>
-<span class="sourceLineNo">2629</span>    region.put(put);<a name="line.2629"></a>
-<span class="sourceLineNo">2630</span>    put = new Put(row1, ts + 1);<a name="line.2630"></a>
-<span class="sourceLineNo">2631</span>    put.addColumn(fam1, col1, Bytes.toBytes("filter1"));<a name="line.2631"></a>
-<span class="sourceLineNo">2632</span>    region.put(put);<a name="line.2632"></a>
-<span class="sourceLineNo">2633</span>    put = new Put(row1, ts + 2);<a name="line.2633"></a>
-<span class="sourceLineNo">2634</span>    put.addColumn(fam1, col1, Bytes.toBytes("filter2"));<a name="line.2634"></a>
-<span class="sourceLineNo">2635</span>    region.put(put);<a name="line.2635"></a>
-<span class="sourceLineNo">2636</span>    put = new Put(row1, ts + 3);<a name="line.2636"></a>
-<span class="sourceLineNo">2637</span>    put.addColumn(fam1, col1, value2);<a name="line.2637"></a>
-<span class="sourceLineNo">2638</span>    region.put(put);<a name="line.2638"></a>
-<span class="sourceLineNo">2639</span><a name="line.2639"></a>
-<span class="sourceLineNo">2640</span>    Get get = new Get(row1);<a name="line.2640"></a>
-<span class="sourceLineNo">2641</span>    get.readAllVersions();<a name="line.2641"></a>
-<span class="sourceLineNo">2642</span>    Result res = region.get(get);<a name="line.2642"></a>
-<span class="sourceLineNo">2643</span>    // Get 3 versions, the oldest version has gone from user view<a name="line.2643"></a>
-<span class="sourceLineNo">2644</span>    assertEquals(maxVersions, res.size());<a name="line.2644"></a>
-<span class="sourceLineNo">2645</span><a name="line.2645"></a>
-<span class="sourceLineNo">2646</span>    get.setFilter(new ValueFilter(CompareOperator.EQUAL, new SubstringComparator("value")));<a name="line.2646"></a>
-<span class="sourceLineNo">2647</span>    res = region.get(get);<a name="line.2647"></a>
-<span class="sourceLineNo">2648</span>    // When use value filter, the oldest version should still gone from user view and it<a name="line.2648"></a>
-<span class="sourceLineNo">2649</span>    // should only return one key vaule<a name="line.2649"></a>
-<span class="sourceLineNo">2650</span>    assertEquals(1, res.size());<a name="line.2650"></a>
-<span class="sourceLineNo">2651</span>    assertTrue(CellUtil.matchingValue(new KeyValue(row1, fam1, col1, value2), res.rawCells()[0]));<a name="line.2651"></a>
-<span class="sourceLineNo">2652</span>    assertEquals(ts + 3, res.rawCells()[0].getTimestamp());<a name="line.2652"></a>
-<span class="sourceLineNo">2653</span><a name="line.2653"></a>
-<span class="sourceLineNo">2654</span>    region.flush(true);<a name="line.2654"></a>
-<span class="sourceLineNo">2655</span>    region.compact(true);<a name="line.2655"></a>
-<span class="sourceLineNo">2656</span>    Thread.sleep(1000);<a name="line.2656"></a>
+<span class="sourceLineNo">2603</span>  @Test<a name="line.2603"></a>
+<span class="sourceLineNo">2604</span>  public void testGet_Empty() throws IOException {<a name="line.2604"></a>
+<span class="sourceLineNo">2605</span>    byte[] row = Bytes.toBytes("row");<a name="line.2605"></a>
+<span class="sourceLineNo">2606</span>    byte[] fam = Bytes.toBytes("fam");<a name="line.2606"></a>
+<span class="sourceLineNo">2607</span><a name="line.2607"></a>
+<span class="sourceLineNo">2608</span>    this.region = initHRegion(tableName, method, CONF, fam);<a name="line.2608"></a>
+<span class="sourceLineNo">2609</span>    Get get = new Get(row);<a name="line.2609"></a>
+<span class="sourceLineNo">2610</span>    get.addFamily(fam);<a name="line.2610"></a>
+<span class="sourceLineNo">2611</span>    Result r = region.get(get);<a name="line.2611"></a>
+<span class="sourceLineNo">2612</span><a name="line.2612"></a>
+<span class="sourceLineNo">2613</span>    assertTrue(r.isEmpty());<a name="line.2613"></a>
+<span class="sourceLineNo">2614</span>  }<a name="line.2614"></a>
+<span class="sourceLineNo">2615</span><a name="line.2615"></a>
+<span class="sourceLineNo">2616</span>  @Test<a name="line.2616"></a>
+<span class="sourceLineNo">2617</span>  public void testGetWithFilter() throws IOException, InterruptedException {<a name="line.2617"></a>
+<span class="sourceLineNo">2618</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2618"></a>
+<span class="sourceLineNo">2619</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2619"></a>
+<span class="sourceLineNo">2620</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.2620"></a>
+<span class="sourceLineNo">2621</span>    byte[] value1 = Bytes.toBytes("value1");<a name="line.2621"></a>
+<span class="sourceLineNo">2622</span>    byte[] value2 = Bytes.toBytes("value2");<a name="line.2622"></a>
+<span class="sourceLineNo">2623</span><a name="line.2623"></a>
+<span class="sourceLineNo">2624</span>    final int maxVersions = 3;<a name="line.2624"></a>
+<span class="sourceLineNo">2625</span>    HColumnDescriptor hcd = new HColumnDescriptor(fam1);<a name="line.2625"></a>
+<span class="sourceLineNo">2626</span>    hcd.setMaxVersions(maxVersions);<a name="line.2626"></a>
+<span class="sourceLineNo">2627</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf("testFilterAndColumnTracker"));<a name="line.2627"></a>
+<span class="sourceLineNo">2628</span>    htd.addFamily(hcd);<a name="line.2628"></a>
+<span class="sourceLineNo">2629</span>    ChunkCreator.initialize(MemStoreLABImpl.CHUNK_SIZE_DEFAULT, false, 0, 0, 0, null);<a name="line.2629"></a>
+<span class="sourceLineNo">2630</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.2630"></a>
+<span class="sourceLineNo">2631</span>    Path logDir = TEST_UTIL.getDataTestDirOnTestFS(method + ".log");<a name="line.2631"></a>
+<span class="sourceLineNo">2632</span>    final WAL wal = HBaseTestingUtility.createWal(TEST_UTIL.getConfiguration(), logDir, info);<a name="line.2632"></a>
+<span class="sourceLineNo">2633</span>    this.region = TEST_UTIL.createLocalHRegion(info, htd, wal);<a name="line.2633"></a>
+<span class="sourceLineNo">2634</span><a name="line.2634"></a>
+<span class="sourceLineNo">2635</span>    // Put 4 version to memstore<a name="line.2635"></a>
+<span class="sourceLineNo">2636</span>    long ts = 0;<a name="line.2636"></a>
+<span class="sourceLineNo">2637</span>    Put put = new Put(row1, ts);<a name="line.2637"></a>
+<span class="sourceLineNo">2638</span>    put.addColumn(fam1, col1, value1);<a name="line.2638"></a>
+<span class="sourceLineNo">2639</span>    region.put(put);<a name="line.2639"></a>
+<span class="sourceLineNo">2640</span>    put = new Put(row1, ts + 1);<a name="line.2640"></a>
+<span class="sourceLineNo">2641</span>    put.addColumn(fam1, col1, Bytes.toBytes("filter1"));<a name="line.2641"></a>
+<span class="sourceLineNo">2642</span>    region.put(put);<a name="line.2642"></a>
+<span class="sourceLineNo">2643</span>    put = new Put(row1, ts + 2);<a name="line.2643"></a>
+<span class="sourceLineNo">2644</span>    put.addColumn(fam1, col1, Bytes.toBytes("filter2"));<a name="line.2644"></a>
+<span class="sourceLineNo">2645</span>    region.put(put);<a name="line.2645"></a>
+<span class="sourceLineNo">2646</span>    put = new Put(row1, ts + 3);<a name="line.2646"></a>
+<span class="sourceLineNo">2647</span>    put.addColumn(fam1, col1, value2);<a name="line.2647"></a>
+<span class="sourceLineNo">2648</span>    region.put(put);<a name="line.2648"></a>
+<span class="sourceLineNo">2649</span><a name="line.2649"></a>
+<span class="sourceLineNo">2650</span>    Get get = new Get(row1);<a name="line.2650"></a>
+<span class="sourceLineNo">2651</span>    get.readAllVersions();<a name="line.2651"></a>
+<span class="sourceLineNo">2652</span>    Result res = region.get(get);<a name="line.2652"></a>
+<span class="sourceLineNo">2653</span>    // Get 3 versions, the oldest version has gone from user view<a name="line.2653"></a>
+<span class="sourceLineNo">2654</span>    assertEquals(maxVersions, res.size());<a name="line.2654"></a>
+<span class="sourceLineNo">2655</span><a name="line.2655"></a>
+<span class="sourceLineNo">2656</span>    get.setFilter(new ValueFilter(CompareOperator.EQUAL, new SubstringComparator("value")));<a name="line.2656"></a>
 <span class="sourceLineNo">2657</span>    res = region.get(get);<a name="line.2657"></a>
-<span class="sourceLineNo">2658</span>    // After flush and compact, the result should be consistent with previous result<a name="line.2658"></a>
-<span class="sourceLineNo">2659</span>    assertEquals(1, res.size());<a name="line.2659"></a>
-<span class="sourceLineNo">2660</span>    assertTrue(CellUtil.matchingValue(new KeyValue(row1, fam1, col1, value2), res.rawCells()[0]));<a name="line.2660"></a>
-<span class="sourceLineNo">2661</span>  }<a name="line.2661"></a>
-<span class="sourceLineNo">2662</span><a name="line.2662"></a>
-<span class="sourceLineNo">2663</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2663"></a>
-<span class="sourceLineNo">2664</span>  // Scanner tests<a name="line.2664"></a>
-<span class="sourceLineNo">2665</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2665"></a>
-<span class="sourceLineNo">2666</span>  @Test<a name="line.2666"></a>
-<span class="sourceLineNo">2667</span>  public void testGetScanner_WithOkFamilies() throws IOException {<a name="line.2667"></a>
-<span class="sourceLineNo">2668</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2668"></a>
-<span class="sourceLineNo">2669</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2669"></a>
-<span class="sourceLineNo">2670</span><a name="line.2670"></a>
-<span class="sourceLineNo">2671</span>    byte[][] families = { fam1, fam2 };<a name="line.2671"></a>
+<span class="sourceLineNo">2658</span>    // When use value filter, the oldest version should still gone from user view and it<a name="line.2658"></a>
+<span class="sourceLineNo">2659</span>    // should only return one key vaule<a name="line.2659"></a>
+<span class="sourceLineNo">2660</span>    assertEquals(1, res.size());<a name="line.2660"></a>
+<span class="sourceLineNo">2661</span>    assertTrue(CellUtil.matchingValue(new KeyValue(row1, fam1, col1, value2), res.rawCells()[0]));<a name="line.2661"></a>
+<span class="sourceLineNo">2662</span>    assertEquals(ts + 3, res.rawCells()[0].getTimestamp());<a name="line.2662"></a>
+<span class="sourceLineNo">2663</span><a name="line.2663"></a>
+<span class="sourceLineNo">2664</span>    region.flush(true);<a name="line.2664"></a>
+<span class="sourceLineNo">2665</span>    region.compact(true);<a name="line.2665"></a>
+<span class="sourceLineNo">2666</span>    Thread.sleep(1000);<a name="line.2666"></a>
+<span class="sourceLineNo">2667</span>    res = region.get(get);<a name="line.2667"></a>
+<span class="sourceLineNo">2668</span>    // After flush and compact, the result should be consistent with previous result<a name="line.2668"></a>
+<span class="sourceLineNo">2669</span>    assertEquals(1, res.size());<a name="line.2669"></a>
+<span class="sourceLineNo">2670</span>    assertTrue(CellUtil.matchingValue(new KeyValue(row1, fam1, col1, value2), res.rawCells()[0]));<a name="line.2670"></a>
+<span class="sourceLineNo">2671</span>  }<a name="line.2671"></a>
 <span class="sourceLineNo">2672</span><a name="line.2672"></a>
-<span class="sourceLineNo">2673</span>    // Setting up region<a name="line.2673"></a>
-<span class="sourceLineNo">2674</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2674"></a>
-<span class="sourceLineNo">2675</span>    Scan scan = new Scan();<a name="line.2675"></a>
-<span class="sourceLineNo">2676</span>    scan.addFamily(fam1);<a name="line.2676"></a>
-<span class="sourceLineNo">2677</span>    scan.addFamily(fam2);<a name="line.2677"></a>
-<span class="sourceLineNo">2678</span>    try {<a name="line.2678"></a>
-<span class="sourceLineNo">2679</span>      region.getScanner(scan);<a name="line.2679"></a>
-<span class="sourceLineNo">2680</span>    } catch (Exception e) {<a name="line.2680"></a>
-<span class="sourceLineNo">2681</span>      assertTrue("Families could not be found in Region", false);<a name="line.2681"></a>
-<span class="sourceLineNo">2682</span>    }<a name="line.2682"></a>
-<span class="sourceLineNo">2683</span>  }<a name="line.2683"></a>
-<span class="sourceLineNo">2684</span><a name="line.2684"></a>
-<span class="sourceLineNo">2685</span>  @Test<a name="line.2685"></a>
-<span class="sourceLineNo">2686</span>  public void testGetScanner_WithNotOkFamilies() throws IOException {<a name="line.2686"></a>
-<span class="sourceLineNo">2687</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2687"></a>
-<span class="sourceLineNo">2688</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2688"></a>
-<span class="sourceLineNo">2689</span><a name="line.2689"></a>
-<span class="sourceLineNo">2690</span>    byte[][] families = { fam1 };<a name="line.2690"></a>
-<span class="sourceLineNo">2691</span><a name="line.2691"></a>
-<span class="sourceLineNo">2692</span>    // Setting up region<a name="line.2692"></a>
-<span class="sourceLineNo">2693</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2693"></a>
-<span class="sourceLineNo">2694</span>    Scan scan = new Scan();<a name="line.2694"></a>
-<span class="sourceLineNo">2695</span>    scan.addFamily(fam2);<a name="line.2695"></a>
-<span class="sourceLineNo">2696</span>    boolean ok = false;<a name="line.2696"></a>
-<span class="sourceLineNo">2697</span>    try {<a name="line.2697"></a>
-<span class="sourceLineNo">2698</span>      region.getScanner(scan);<a name="line.2698"></a>
-<span class="sourceLineNo">2699</span>    } catch (Exception e) {<a name="line.2699"></a>
-<span class="sourceLineNo">2700</span>      ok = true;<a name="line.2700"></a>
-<span class="sourceLineNo">2701</span>    }<a name="line.2701"></a>
-<span class="sourceLineNo">2702</span>    assertTrue("Families could not be found in Region", ok);<a name="line.2702"></a>
-<span class="sourceLineNo">2703</span>  }<a name="line.2703"></a>
-<span class="sourceLineNo">2704</span><a name="line.2704"></a>
-<span class="sourceLineNo">2705</span>  @Test<a name="line.2705"></a>
-<span class="sourceLineNo">2706</span>  public void testGetScanner_WithNoFamilies() throws IOException {<a name="line.2706"></a>
-<span class="sourceLineNo">2707</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2707"></a>
-<span class="sourceLineNo">2708</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2708"></a>
-<span class="sourceLineNo">2709</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2709"></a>
-<span class="sourceLineNo">2710</span>    byte[] fam3 = Bytes.toBytes("fam3");<a name="line.2710"></a>
-<span class="sourceLineNo">2711</span>    byte[] fam4 = Bytes.toBytes("fam4");<a name="line.2711"></a>
-<span class="sourceLineNo">2712</span><a name="line.2712"></a>
-<span class="sourceLineNo">2713</span>    byte[][] families = { fam1, fam2, fam3, fam4 };<a name="line.2713"></a>
+<span class="sourceLineNo">2673</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2673"></a>
+<span class="sourceLineNo">2674</span>  // Scanner tests<a name="line.2674"></a>
+<span class="sourceLineNo">2675</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2675"></a>
+<span class="sourceLineNo">2676</span>  @Test<a name="line.2676"></a>
+<span class="sourceLineNo">2677</span>  public void testGetScanner_WithOkFamilies() throws IOException {<a name="line.2677"></a>
+<span class="sourceLineNo">2678</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2678"></a>
+<span class="sourceLineNo">2679</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2679"></a>
+<span class="sourceLineNo">2680</span><a name="line.2680"></a>
+<span class="sourceLineNo">2681</span>    byte[][] families = { fam1, fam2 };<a name="line.2681"></a>
+<span class="sourceLineNo">2682</span><a name="line.2682"></a>
+<span class="sourceLineNo">2683</span>    // Setting up region<a name="line.2683"></a>
+<span class="sourceLineNo">2684</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2684"></a>
+<span class="sourceLineNo">2685</span>    Scan scan = new Scan();<a name="line.2685"></a>
+<span class="sourceLineNo">2686</span>    scan.addFamily(fam1);<a name="line.2686"></a>
+<span class="sourceLineNo">2687</span>    scan.addFamily(fam2);<a name="line.2687"></a>
+<span class="sourceLineNo">2688</span>    try {<a name="line.2688"></a>
+<span class="sourceLineNo">2689</span>      region.getScanner(scan);<a name="line.2689"></a>
+<span class="sourceLineNo">2690</span>    } catch (Exception e) {<a name="line.2690"></a>
+<span class="sourceLineNo">2691</span>      assertTrue("Families could not be found in Region", false);<a name="line.2691"></a>
+<span class="sourceLineNo">2692</span>    }<a name="line.2692"></a>
+<span class="sourceLineNo">2693</span>  }<a name="line.2693"></a>
+<span class="sourceLineNo">2694</span><a name="line.2694"></a>
+<span class="sourceLineNo">2695</span>  @Test<a name="line.2695"></a>
+<span class="sourceLineNo">2696</span>  public void testGetScanner_WithNotOkFamilies() throws IOException {<a name="line.2696"></a>
+<span class="sourceLineNo">2697</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2697"></a>
+<span class="sourceLineNo">2698</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2698"></a>
+<span class="sourceLineNo">2699</span><a name="line.2699"></a>
+<span class="sourceLineNo">2700</span>    byte[][] families = { fam1 };<a name="line.2700"></a>
+<span class="sourceLineNo">2701</span><a name="line.2701"></a>
+<span class="sourceLineNo">2702</span>    // Setting up region<a name="line.2702"></a>
+<span class="sourceLineNo">2703</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2703"></a>
+<span class="sourceLineNo">2704</span>    Scan scan = new Scan();<a name="line.2704"></a>
+<span class="sourceLineNo">2705</span>    scan.addFamily(fam2);<a name="line.2705"></a>
+<span class="sourceLineNo">2706</span>    boolean ok = false;<a name="line.2706"></a>
+<span class="sourceLineNo">2707</span>    try {<a name="line.2707"></a>
+<span class="sourceLineNo">2708</span>      region.getScanner(scan);<a name="line.2708"></a>
+<span class="sourceLineNo">2709</span>    } catch (Exception e) {<a name="line.2709"></a>
+<span class="sourceLineNo">2710</span>      ok = true;<a name="line.2710"></a>
+<span class="sourceLineNo">2711</span>    }<a name="line.2711"></a>
+<span class="sourceLineNo">2712</span>    assertTrue("Families could not be found in Region", ok);<a name="line.2712"></a>
+<span class="sourceLineNo">2713</span>  }<a name="line.2713"></a>
 <span class="sourceLineNo">2714</span><a name="line.2714"></a>
-<span class="sourceLineNo">2715</span>    // Setting up region<a name="line.2715"></a>
-<span class="sourceLineNo">2716</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2716"></a>
-<span class="sourceLineNo">2717</span>    // Putting data in Region<a name="line.2717"></a>
-<span class="sourceLineNo">2718</span>    Put put = new Put(row1);<a name="line.2718"></a>
-<span class="sourceLineNo">2719</span>    put.addColumn(fam1, null, null);<a name="line.2719"></a>
-<span class="sourceLineNo">2720</span>    put.addColumn(fam2, null, null);<a name="line.2720"></a>
-<span class="sourceLineNo">2721</span>    put.addColumn(fam3, null, null);<a name="line.2721"></a>
-<span class="sourceLineNo">2722</span>    put.addColumn(fam4, null, null);<a name="line.2722"></a>
-<span class="sourceLineNo">2723</span>    region.put(put);<a name="line.2723"></a>
+<span class="sourceLineNo">2715</span>  @Test<a name="line.2715"></a>
+<span class="sourceLineNo">2716</span>  public void testGetScanner_WithNoFamilies() throws IOException {<a name="line.2716"></a>
+<span class="sourceLineNo">2717</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2717"></a>
+<span class="sourceLineNo">2718</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2718"></a>
+<span class="sourceLineNo">2719</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2719"></a>
+<span class="sourceLineNo">2720</span>    byte[] fam3 = Bytes.toBytes("fam3");<a name="line.2720"></a>
+<span class="sourceLineNo">2721</span>    byte[] fam4 = Bytes.toBytes("fam4");<a name="line.2721"></a>
+<span class="sourceLineNo">2722</span><a name="line.2722"></a>
+<span class="sourceLineNo">2723</span>    byte[][] families = { fam1, fam2, fam3, fam4 };<a name="line.2723"></a>
 <span class="sourceLineNo">2724</span><a name="line.2724"></a>
-<span class="sourceLineNo">2725</span>    Scan scan = null;<a name="line.2725"></a>
-<span class="sourceLineNo">2726</span>    HRegion.RegionScannerImpl is = null;<a name="line.2726"></a>
-<span class="sourceLineNo">2727</span><a name="line.2727"></a>
-<span class="sourceLineNo">2728</span>    // Testing to see how many scanners that is produced by getScanner,<a name="line.2728"></a>
-<span class="sourceLineNo">2729</span>    // starting<a name="line.2729"></a>
-<span class="sourceLineNo">2730</span>    // with known number, 2 - current = 1<a name="line.2730"></a>
-<span class="sourceLineNo">2731</span>    scan = new Scan();<a name="line.2731"></a>
-<span class="sourceLineNo">2732</span>    scan.addFamily(fam2);<a name="line.2732"></a>
-<span class="sourceLineNo">2733</span>    scan.addFamily(fam4);<a name="line.2733"></a>
-<span class="sourceLineNo">2734</span>    is = region.getScanner(scan);<a name="line.2734"></a>
-<span class="sourceLineNo">2735</span>    assertEquals(1, is.storeHeap.getHeap().size());<a name="line.2735"></a>
-<span class="sourceLineNo">2736</span><a name="line.2736"></a>
-<span class="sourceLineNo">2737</span>    scan = new Scan();<a name="line.2737"></a>
-<span class="sourceLineNo">2738</span>    is = region.getScanner(scan);<a name="line.2738"></a>
-<span class="sourceLineNo">2739</span>    assertEquals(families.length - 1, is.storeHeap.getHeap().size());<a name="line.2739"></a>
-<span class="sourceLineNo">2740</span>  }<a name="line.2740"></a>
-<span class="sourceLineNo">2741</span><a name="line.2741"></a>
-<span class="sourceLineNo">2742</span>  /**<a name="line.2742"></a>
-<span class="sourceLineNo">2743</span>   * This method tests https://issues.apache.org/jira/browse/HBASE-2516.<a name="line.2743"></a>
-<span class="sourceLineNo">2744</span>   *<a name="line.2744"></a>
-<span class="sourceLineNo">2745</span>   * @throws IOException<a name="line.2745"></a>
-<span class="sourceLineNo">2746</span>   */<a name="line.2746"></a>
-<span class="sourceLineNo">2747</span>  @Test<a name="line.2747"></a>
-<span class="sourceLineNo">2748</span>  public void testGetScanner_WithRegionClosed() throws IOException {<a name="line.2748"></a>
-<span class="sourceLineNo">2749</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2749"></a>
-<span class="sourceLineNo">2750</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2750"></a>
+<span class="sourceLineNo">2725</span>    // Setting up region<a name="line.2725"></a>
+<span class="sourceLineNo">2726</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2726"></a>
+<span class="sourceLineNo">2727</span>    // Putting data in Region<a name="line.2727"></a>
+<span class="sourceLineNo">2728</span>    Put put = new Put(row1);<a name="line.2728"></a>
+<span class="sourceLineNo">2729</span>    put.addColumn(fam1, null, null);<a name="line.2729"></a>
+<span class="sourceLineNo">2730</span>    put.addColumn(fam2, null, null);<a name="line.2730"></a>
+<span class="sourceLineNo">2731</span>    put.addColumn(fam3, null, null);<a name="line.2731"></a>
+<span class="sourceLineNo">2732</span>    put.addColumn(fam4, null, null);<a name="line.2732"></a>
+<span class="sourceLineNo">2733</span>    region.put(put);<a name="line.2733"></a>
+<span class="sourceLineNo">2734</span><a name="line.2734"></a>
+<span class="sourceLineNo">2735</span>    Scan scan = null;<a name="line.2735"></a>
+<span class="sourceLineNo">2736</span>    HRegion.RegionScannerImpl is = null;<a name="line.2736"></a>
+<span class="sourceLineNo">2737</span><a name="line.2737"></a>
+<span class="sourceLineNo">2738</span>    // Testing to see how many scanners that is produced by getScanner,<a name="line.2738"></a>
+<span class="sourceLineNo">2739</span>    // starting<a name="line.2739"></a>
+<span class="sourceLineNo">2740</span>    // with known number, 2 - current = 1<a name="line.2740"></a>
+<span class="sourceLineNo">2741</span>    scan = new Scan();<a name="line.2741"></a>
+<span class="sourceLineNo">2742</span>    scan.addFamily(fam2);<a name="line.2742"></a>
+<span class="sourceLineNo">2743</span>    scan.addFamily(fam4);<a name="line.2743"></a>
+<span class="sourceLineNo">2744</span>    is = region.getScanner(scan);<a name="line.2744"></a>
+<span class="sourceLineNo">2745</span>    assertEquals(1, is.storeHeap.getHeap().size());<a name="line.2745"></a>
+<span class="sourceLineNo">2746</span><a name="line.2746"></a>
+<span class="sourceLineNo">2747</span>    scan = new Scan();<a name="line.2747"></a>
+<span class="sourceLineNo">2748</span>    is = region.getScanner(scan);<a name="line.2748"></a>
+<span class="sourceLineNo">2749</span>    assertEquals(families.length - 1, is.storeHeap.getHeap().size());<a name="line.2749"></a>
+<span class="sourceLineNo">2750</span>  }<a name="line.2750"></a>
 <span class="sourceLineNo">2751</span><a name="line.2751"></a>
-<span class="sourceLineNo">2752</span>    byte[][] families = { fam1, fam2 };<a name="line.2752"></a>
-<span class="sourceLineNo">2753</span><a name="line.2753"></a>
-<span class="sourceLineNo">2754</span>    // Setting up region<a name="line.2754"></a>
-<span class="sourceLineNo">2755</span>    try {<a name="line.2755"></a>
-<span class="sourceLineNo">2756</span>      this.region = initHRegion(tableName, method, CONF, families);<a name="line.2756"></a>
-<span class="sourceLineNo">2757</span>    } catch (IOException e) {<a name="line.2757"></a>
-<span class="sourceLineNo">2758</span>      e.printStackTrace();<a name="line.2758"></a>
-<span class="sourceLineNo">2759</span>      fail("Got IOException during initHRegion, " + e.getMessage());<a name="line.2759"></a>
-<span class="sourceLineNo">2760</span>    }<a name="line.2760"></a>
-<span class="sourceLineNo">2761</span>    region.closed.set(true);<a name="line.2761"></a>
-<span class="sourceLineNo">2762</span>    try {<a name="line.2762"></a>
-<span class="sourceLineNo">2763</span>      region.getScanner(null);<a name="line.2763"></a>
-<span class="sourceLineNo">2764</span>      fail("Expected to get an exception during getScanner on a region that is closed");<a name="line.2764"></a>
-<span class="sourceLineNo">2765</span>    } catch (NotServingRegionException e) {<a name="line.2765"></a>
-<span class="sourceLineNo">2766</span>      // this is the correct exception that is expected<a name="line.2766"></a>
+<span class="sourceLineNo">2752</span>  /**<a name="line.2752"></a>
+<span class="sourceLineNo">2753</span>   * This method tests https://issues.apache.org/jira/browse/HBASE-2516.<a name="line.2753"></a>
+<span class="sourceLineNo">2754</span>   *<a name="line.2754"></a>
+<span class="sourceLineNo">2755</span>   * @throws IOException<a name="line.2755"></a>
+<span class="sourceLineNo">2756</span>   */<a name="line.2756"></a>
+<span class="sourceLineNo">2757</span>  @Test<a name="line.2757"></a>
+<span class="sourceLineNo">2758</span>  public void testGetScanner_WithRegionClosed() throws IOException {<a name="line.2758"></a>
+<span class="sourceLineNo">2759</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2759"></a>
+<span class="sourceLineNo">2760</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2760"></a>
+<span class="sourceLineNo">2761</span><a name="line.2761"></a>
+<span class="sourceLineNo">2762</span>    byte[][] families = { fam1, fam2 };<a name="line.2762"></a>
+<span class="sourceLineNo">2763</span><a name="line.2763"></a>
+<span class="sourceLineNo">2764</span>    // Setting up region<a name="line.2764"></a>
+<span class="sourceLineNo">2765</span>    try {<a name="line.2765"></a>
+<span class="sourceLineNo">2766</span>      this.region = initHRegion(tableName, method, CONF, families);<a name="line.2766"></a>
 <span class="sourceLineNo">2767</span>    } catch (IOException e) {<a name="line.2767"></a>
-<span class="sourceLineNo">2768</span>      fail("Got wrong type of exception - should be a NotServingRegionException, " +<a name="line.2768"></a>
-<span class="sourceLineNo">2769</span>          "but was an IOException: "<a name="line.2769"></a>
-<span class="sourceLineNo">2770</span>          + e.getMessage());<a name="line.2770"></a>
-<span class="sourceLineNo">2771</span>    }<a name="line.2771"></a>
-<span class="sourceLineNo">2772</span>  }<a name="line.2772"></a>
-<span class="sourceLineNo">2773</span><a name="line.2773"></a>
-<span class="sourceLineNo">2774</span>  @Test<a name="line.2774"></a>
-<span class="sourceLineNo">2775</span>  public void testRegionScanner_Next() throws IOException {<a name="line.2775"></a>
-<span class="sourceLineNo">2776</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2776"></a>
-<span class="sourceLineNo">2777</span>    byte[] row2 = Bytes.toBytes("row2");<a name="line.2777"></a>
-<span class="sourceLineNo">2778</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2778"></a>
-<span class="sourceLineNo">2779</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2779"></a>
-<span class="sourceLineNo">2780</span>    byte[] fam3 = Bytes.toBytes("fam3");<a name="line.2780"></a>
-<span class="sourceLineNo">2781</span>    byte[] fam4 = Bytes.toBytes("fam4");<a name="line.2781"></a>
-<span class="sourceLineNo">2782</span><a name="line.2782"></a>
-<span class="sourceLineNo">2783</span>    byte[][] families = { fam1, fam2, fam3, fam4 };<a name="line.2783"></a>
-<span class="sourceLineNo">2784</span>    long ts = System.currentTimeMillis();<a name="line.2784"></a>
-<span class="sourceLineNo">2785</span><a name="line.2785"></a>
-<span class="sourceLineNo">2786</span>    // Setting up region<a name="line.2786"></a>
-<span class="sourceLineNo">2787</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2787"></a>
-<span class="sourceLineNo">2788</span>    // Putting data in Region<a name="line.2788"></a>
-<span class="sourceLineNo">2789</span>    Put put = null;<a name="line.2789"></a>
-<span class="sourceLineNo">2790</span>    put = new Put(row1);<a name="line.2790"></a>
-<span class="sourceLineNo">2791</span>    put.addColumn(fam1, (byte[]) null, ts, null);<a name="line.2791"></a>
-<span class="sourceLineNo">2792</span>    put.addColumn(fam2, (byte[]) null, ts, null);<a name="line.2792"></a>
-<span class="sourceLineNo">2793</span>    put.addColumn(fam3, (byte[]) null, ts, null);<a name="line.2793"></a>
-<span class="sourceLineNo">2794</span>    put.addColumn(fam4, (byte[]) null, ts, null);<a name="line.2794"></a>
-<span class="sourceLineNo">2795</span>    region.put(put);<a name="line.2795"></a>
-<span class="sourceLineNo">2796</span><a name="line.2796"></a>
-<span class="sourceLineNo">2797</span>    put = new Put(row2);<a name="line.2797"></a>
-<span class="sourceLineNo">2798</span>    put.addColumn(fam1, (byte[]) null, ts, null);<a name="line.2798"></a>
-<span class="sourceLineNo">2799</span>    put.addColumn(fam2, (byte[]) null, ts, null);<a name="line.2799"></a>
-<span class="sourceLineNo">2800</span>    put.addColumn(fam3, (byte[]) null, ts, null);<a name="line.2800"></a>
-<span class="sourceLineNo">2801</span>    put.addColumn(fam4, (byte[]) null, ts, null);<a name="line.2801"></a>
-<span class="sourceLineNo">2802</span>    region.put(put);<a name="line.2802"></a>
-<span class="sourceLineNo">2803</span><a name="line.2803"></a>
-<span class="sourceLineNo">2804</span>    Scan scan = new Scan();<a name="line.2804"></a>
-<span class="sourceLineNo">2805</span>    scan.addFamily(fam2);<a name="line.2805"></a>
-<span class="sourceLineNo">2806</span>    scan.addFamily(fam4);<a name="line.2806"></a>
-<span class="sourceLineNo">2807</span>    InternalScanner is = region.getScanner(scan);<a name="line.2807"></a>
-<span class="sourceLineNo">2808</span><a name="line.2808"></a>
-<span class="sourceLineNo">2809</span>    List&lt;Cell&gt; res = null;<a name="line.2809"></a>
-<span class="sourceLineNo">2810</span><a name="line.2810"></a>
-<span class="sourceLineNo">2811</span>    // Result 1<a name="line.2811"></a>
-<span class="sourceLineNo">2812</span>    List&lt;Cell&gt; expected1 = new ArrayList&lt;&gt;();<a name="line.2812"></a>
-<span class="sourceLineNo">2813</span>    expected1.add(new KeyValue(row1, fam2, null, ts, KeyValue.Type.Put, null));<a name="line.2813"></a>
-<span class="sourceLineNo">2814</span>    expected1.add(new KeyValue(row1, fam4, null, ts, KeyValue.Type.Put, null));<a name="line.2814"></a>
-<span class="sourceLineNo">2815</span><a name="line.2815"></a>
-<span class="sourceLineNo">2816</span>    res = new ArrayList&lt;&gt;();<a name="line.2816"></a>
-<span class="sourceLineNo">2817</span>    is.next(res);<a name="line.2817"></a>
-<span class="sourceLineNo">2818</span>    for (int i = 0; i &lt; res.size(); i++) {<a name="line.2818"></a>
-<span class="sourceLineNo">2819</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected1.get(i), res.get(i)));<a name="line.2819"></a>
-<span class="sourceLineNo">2820</span>    }<a name="line.2820"></a>
-<span class="sourceLineNo">2821</span><a name="line.2821"></a>
-<span class="sourceLineNo">2822</span>    // Result 2<a name="line.2822"></a>
-<span class="sourceLineNo">2823</span>    List&lt;Cell&gt; expected2 = new ArrayList&lt;&gt;();<a name="line.2823"></a>
-<span class="sourceLineNo">2824</span>    expected2.add(new KeyValue(row2, fam2, null, ts, KeyValue.Type.Put, null));<a name="line.2824"></a>
-<span class="sourceLineNo">2825</span>    expected2.add(new KeyValue(row2, fam4, null, ts, KeyValue.Type.Put, null));<a name="line.2825"></a>
-<span class="sourceLineNo">2826</span><a name="line.2826"></a>
-<span class="sourceLineNo">2827</span>    res = new ArrayList&lt;&gt;();<a name="line.2827"></a>
-<span class="sourceLineNo">2828</span>    is.next(res);<a name="line.2828"></a>
-<span class="sourceLineNo">2829</span>    for (int i = 0; i &lt; res.size(); i++) {<a name="line.2829"></a>
-<span class="sourceLineNo">2830</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected2.get(i), res.get(i)));<a name="line.2830"></a>
-<span class="sourceLineNo">2831</span>    }<a name="line.2831"></a>
-<span class="sourceLineNo">2832</span>  }<a name="line.2832"></a>
-<span class="sourceLineNo">2833</span><a name="line.2833"></a>
-<span class="sourceLineNo">2834</span>  @Test<a name="line.2834"></a>
-<span class="sourceLineNo">2835</span>  public void testScanner_ExplicitColumns_FromMemStore_EnforceVersions() throws IOException {<a name="line.2835"></a>
-<span class="sourceLineNo">2836</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2836"></a>
-<span class="sourceLineNo">2837</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.2837"></a>
-<span class="sourceLineNo">2838</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.2838"></a>
-<span class="sourceLineNo">2839</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2839"></a>
-<span class="sourceLineNo">2840</span>    byte[][] families = { fam1 };<a name="line.2840"></a>
-<span class="sourceLineNo">2841</span><a name="line.2841"></a>
-<span class="sourceLineNo">2842</span>    long ts1 = System.currentTimeMillis();<a name="line.2842"></a>
-<span class="sourceLineNo">2843</span>    long ts2 = ts1 + 1;<a name="line.2843"></a>
-<span class="sourceLineNo">2844</span>    long ts3 = ts1 + 2;<a name="line.2844"></a>
-<span class="sourceLineNo">2845</span><a name="line.2845"></a>
-<span class="sourceLineNo">2846</span>    // Setting up region<a name="line.2846"></a>
-<span class="sourceLineNo">2847</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2847"></a>
-<span class="sourceLineNo">2848</span>    // Putting data in Region<a name="line.2848"></a>
-<span class="sourceLineNo">2849</span>    Put put = null;<a name="line.2849"></a>
-<span class="sourceLineNo">2850</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.2850"></a>
-<span class="sourceLineNo">2851</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.2851"></a>
-<span class="sourceLineNo">2852</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.2852"></a>
-<span class="sourceLineNo">2853</span><a name="line.2853"></a>
-<span class="sourceLineNo">2854</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.2854"></a>
-<span class="sourceLineNo">2855</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.2855"></a>
-<span class="sourceLineNo">2856</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.2856"></a>
-<span class="sourceLineNo">2857</span><a name="line.2857"></a>
-<span class="sourceLineNo">2858</span>    put = new Put(row1);<a name="line.2858"></a>
-<span class="sourceLineNo">2859</span>    put.add(kv13);<a name="line.2859"></a>
-<span class="sourceLineNo">2860</span>    put.add(kv12);<a name="line.2860"></a>
-<span class="sourceLineNo">2861</span>    put.add(kv11);<a name="line.2861"></a>
-<span class="sourceLineNo">2862</span>    put.add(kv23);<a name="line.2862"></a>
-<span class="sourceLineNo">2863</span>    put.add(kv22);<a name="line.2863"></a>
-<span class="sourceLineNo">2864</span>    put.add(kv21);<a name="line.2864"></a>
-<span class="sourceLineNo">2865</span>    region.put(put);<a name="line.2865"></a>
-<span class="sourceLineNo">2866</span><a name="line.2866"></a>
-<span class="sourceLineNo">2867</span>    // Expected<a name="line.2867"></a>
-<span class="sourceLineNo">2868</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.2868"></a>
-<span class="sourceLineNo">2869</span>    expected.add(kv13);<a name="line.2869"></a>
-<span class="sourceLineNo">2870</span>    expected.add(kv12);<a name="line.2870"></a>
-<span class="sourceLineNo">2871</span><a name="line.2871"></a>
-<span class="sourceLineNo">2872</span>    Scan scan = new Scan(row1);<a name="line.2872"></a>
-<span class="sourceLineNo">2873</span>    scan.addColumn(fam1, qf1);<a name="line.2873"></a>
-<span class="sourceLineNo">2874</span>    scan.setMaxVersions(MAX_VERSIONS);<a name="line.2874"></a>
-<span class="sourceLineNo">2875</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.2875"></a>
-<span class="sourceLineNo">2876</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.2876"></a>
-<span class="sourceLineNo">2877</span><a name="line.2877"></a>
-<span class="sourceLineNo">2878</span>    boolean hasNext = scanner.next(actual);<a name="line.2878"></a>
-<span class="sourceLineNo">2879</span>    assertEquals(false, hasNext);<a name="line.2879"></a>
-<span class="sourceLineNo">2880</span><a name="line.2880"></a>
-<span class="sourceLineNo">2881</span>    // Verify result<a name="line.2881"></a>
-<span class="sourceLineNo">2882</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.2882"></a>
-<span class="sourceLineNo">2883</span>      assertEquals(expected.get(i), actual.get(i));<a name="line.2883"></a>
-<span class="sourceLineNo">2884</span>    }<a name="line.2884"></a>
-<span class="sourceLineNo">2885</span>  }<a name="line.2885"></a>
-<span class="sourceLineNo">2886</span><a name="line.2886"></a>
-<span class="sourceLineNo">2887</span>  @Test<a name="line.2887"></a>
-<span class="sourceLineNo">2888</span>  public void testScanner_ExplicitColumns_FromFilesOnly_EnforceVersions() throws IOException {<a name="line.2888"></a>
-<span class="sourceLineNo">2889</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2889"></a>
-<span class="sourceLineNo">2890</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.2890"></a>
-<span class="sourceLineNo">2891</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.2891"></a>
-<span class="sourceLineNo">2892</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2892"></a>
-<span class="sourceLineNo">2893</span>    byte[][] families = { fam1 };<a name="line.2893"></a>
-<span class="sourceLineNo">2894</span><a name="line.2894"></a>
-<span class="sourceLineNo">2895</span>    long ts1 = 1; // System.currentTimeMillis();<a name="line.2895"></a>
-<span class="sourceLineNo">2896</span>    long ts2 = ts1 + 1;<a name="line.2896"></a>
-<span class="sourceLineNo">2897</span>    long ts3 = ts1 + 2;<a name="line.2897"></a>
-<span class="sourceLineNo">2898</span><a name="line.2898"></a>
-<span class="sourceLineNo">2899</span>    // Setting up region<a name="line.2899"></a>
-<span class="sourceLineNo">2900</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2900"></a>
-<span class="sourceLineNo">2901</span>    // Putting data in Region<a name="line.2901"></a>
-<span class="sourceLineNo">2902</span>    Put put = null;<a name="line.2902"></a>
-<span class="sourceLineNo">2903</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.2903"></a>
-<span class="sourceLineNo">2904</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.2904"></a>
-<span class="sourceLineNo">2905</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.2905"></a>
-<span class="sourceLineNo">2906</span><a name="line.2906"></a>
-<span class="sourceLineNo">2907</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.2907"></a>
-<span class="sourceLineNo">2908</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.2908"></a>
-<span class="sourceLineNo">2909</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.2909"></a>
-<span class="sourceLineNo">2910</span><a name="line.2910"></a>
-<span class="sourceLineNo">2911</span>    put = new Put(row1);<a name="line.2911"></a>
-<span class="sourceLineNo">2912</span>    put.add(kv13);<a name="line.2912"></a>
-<span class="sourceLineNo">2913</span>    put.add(kv12);<a name="line.2913"></a>
-<span class="sourceLineNo">2914</span>    put.add(kv11);<a name="line.2914"></a>
-<span class="sourceLineNo">2915</span>    put.add(kv23);<a name="line.2915"></a>
-<span class="sourceLineNo">2916</span>    put.add(kv22);<a name="line.2916"></a>
-<span class="sourceLineNo">2917</span>    put.add(kv21);<a name="line.2917"></a>
-<span class="sourceLineNo">2918</span>    region.put(put);<a name="line.2918"></a>
-<span class="sourceLineNo">2919</span>    region.flush(true);<a name="line.2919"></a>
+<span class="sourceLineNo">2768</span>      e.printStackTrace();<a name="line.2768"></a>
+<span class="sourceLineNo">2769</span>      fail("Got IOException during initHRegion, " + e.getMessage());<a name="line.2769"></a>
+<span class="sourceLineNo">2770</span>    }<a name="line.2770"></a>
+<span class="sourceLineNo">2771</span>    region.closed.set(true);<a name="line.2771"></a>
+<span class="sourceLineNo">2772</span>    try {<a name="line.2772"></a>
+<span class="sourceLineNo">2773</span>      region.getScanner(null);<a name="line.2773"></a>
+<span class="sourceLineNo">2774</span>      fail("Expected to get an exception during getScanner on a region that is closed");<a name="line.2774"></a>
+<span class="sourceLineNo">2775</span>    } catch (NotServingRegionException e) {<a name="line.2775"></a>
+<span class="sourceLineNo">2776</span>      // this is the correct exception that is expected<a name="line.2776"></a>
+<span class="sourceLineNo">2777</span>    } catch (IOException e) {<a name="line.2777"></a>
+<span class="sourceLineNo">2778</span>      fail("Got wrong type of exception - should be a NotServingRegionException, " +<a name="line.2778"></a>
+<span class="sourceLineNo">2779</span>          "but was an IOException: "<a name="line.2779"></a>
+<span class="sourceLineNo">2780</span>          + e.getMessage());<a name="line.2780"></a>
+<span class="sourceLineNo">2781</span>    }<a name="line.2781"></a>
+<span class="sourceLineNo">2782</span>  }<a name="line.2782"></a>
+<span class="sourceLineNo">2783</span><a name="line.2783"></a>
+<span class="sourceLineNo">2784</span>  @Test<a name="line.2784"></a>
+<span class="sourceLineNo">2785</span>  public void testRegionScanner_Next() throws IOException {<a name="line.2785"></a>
+<span class="sourceLineNo">2786</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2786"></a>
+<span class="sourceLineNo">2787</span>    byte[] row2 = Bytes.toBytes("row2");<a name="line.2787"></a>
+<span class="sourceLineNo">2788</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2788"></a>
+<span class="sourceLineNo">2789</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2789"></a>
+<span class="sourceLineNo">2790</span>    byte[] fam3 = Bytes.toBytes("fam3");<a name="line.2790"></a>
+<span class="sourceLineNo">2791</span>    byte[] fam4 = Bytes.toBytes("fam4");<a name="line.2791"></a>
+<span class="sourceLineNo">2792</span><a name="line.2792"></a>
+<span class="sourceLineNo">2793</span>    byte[][] families = { fam1, fam2, fam3, fam4 };<a name="line.2793"></a>
+<span class="sourceLineNo">2794</span>    long ts = System.currentTimeMillis();<a name="line.2794"></a>
+<span class="sourceLineNo">2795</span><a name="line.2795"></a>
+<span class="sourceLineNo">2796</span>    // Setting up region<a name="line.2796"></a>
+<span class="sourceLineNo">2797</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2797"></a>
+<span class="sourceLineNo">2798</span>    // Putting data in Region<a name="line.2798"></a>
+<span class="sourceLineNo">2799</span>    Put put = null;<a name="line.2799"></a>
+<span class="sourceLineNo">2800</span>    put = new Put(row1);<a name="line.2800"></a>
+<span class="sourceLineNo">2801</span>    put.addColumn(fam1, (byte[]) null, ts, null);<a name="line.2801"></a>
+<span class="sourceLineNo">2802</span>    put.addColumn(fam2, (byte[]) null, ts, null);<a name="line.2802"></a>
+<span class="sourceLineNo">2803</span>    put.addColumn(fam3, (byte[]) null, ts, null);<a name="line.2803"></a>
+<span class="sourceLineNo">2804</span>    put.addColumn(fam4, (byte[]) null, ts, null);<a name="line.2804"></a>
+<span class="sourceLineNo">2805</span>    region.put(put);<a name="line.2805"></a>
+<span class="sourceLineNo">2806</span><a name="line.2806"></a>
+<span class="sourceLineNo">2807</span>    put = new Put(row2);<a name="line.2807"></a>
+<span class="sourceLineNo">2808</span>    put.addColumn(fam1, (byte[]) null, ts, null);<a name="line.2808"></a>
+<span class="sourceLineNo">2809</span>    put.addColumn(fam2, (byte[]) null, ts, null);<a name="line.2809"></a>
+<span class="sourceLineNo">2810</span>    put.addColumn(fam3, (byte[]) null, ts, null);<a name="line.2810"></a>
+<span class="sourceLineNo">2811</span>    put.addColumn(fam4, (byte[]) null, ts, null);<a name="line.2811"></a>
+<span class="sourceLineNo">2812</span>    region.put(put);<a name="line.2812"></a>
+<span class="sourceLineNo">2813</span><a name="line.2813"></a>
+<span class="sourceLineNo">2814</span>    Scan scan = new Scan();<a name="line.2814"></a>
+<span class="sourceLineNo">2815</span>    scan.addFamily(fam2);<a name="line.2815"></a>
+<span class="sourceLineNo">2816</span>    scan.addFamily(fam4);<a name="line.2816"></a>
+<span class="sourceLineNo">2817</span>    InternalScanner is = region.getScanner(scan);<a name="line.2817"></a>
+<span class="sourceLineNo">2818</span><a name="line.2818"></a>
+<span class="sourceLineNo">2819</span>    List&lt;Cell&gt; res = null;<a name="line.2819"></a>
+<span class="sourceLineNo">2820</span><a name="line.2820"></a>
+<span class="sourceLineNo">2821</span>    // Result 1<a name="line.2821"></a>
+<span class="sourceLineNo">2822</span>    List&lt;Cell&gt; expected1 = new ArrayList&lt;&gt;();<a name="line.2822"></a>
+<span class="sourceLineNo">2823</span>    expected1.add(new KeyValue(row1, fam2, null, ts, KeyValue.Type.Put, null));<a name="line.2823"></a>
+<span class="sourceLineNo">2824</span>    expected1.add(new KeyValue(row1, fam4, null, ts, KeyValue.Type.Put, null));<a name="line.2824"></a>
+<span class="sourceLineNo">2825</span><a name="line.2825"></a>
+<span class="sourceLineNo">2826</span>    res = new ArrayList&lt;&gt;();<a name="line.2826"></a>
+<span class="sourceLineNo">2827</span>    is.next(res);<a name="line.2827"></a>
+<span class="sourceLineNo">2828</span>    for (int i = 0; i &lt; res.size(); i++) {<a name="line.2828"></a>
+<span class="sourceLineNo">2829</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected1.get(i), res.get(i)));<a name="line.2829"></a>
+<span class="sourceLineNo">2830</span>    }<a name="line.2830"></a>
+<span class="sourceLineNo">2831</span><a name="line.2831"></a>
+<span class="sourceLineNo">2832</span>    // Result 2<a name="line.2832"></a>
+<span class="sourceLineNo">2833</span>    List&lt;Cell&gt; expected2 = new ArrayList&lt;&gt;();<a name="line.2833"></a>
+<span class="sourceLineNo">2834</span>    expected2.add(new KeyValue(row2, fam2, null, ts, KeyValue.Type.Put, null));<a name="line.2834"></a>
+<span class="sourceLineNo">2835</span>    expected2.add(new KeyValue(row2, fam4, null, ts, KeyValue.Type.Put, null));<a name="line.2835"></a>
+<span class="sourceLineNo">2836</span><a name="line.2836"></a>
+<span class="sourceLineNo">2837</span>    res = new ArrayList&lt;&gt;();<a name="line.2837"></a>
+<span class="sourceLineNo">2838</span>    is.next(res);<a name="line.2838"></a>
+<span class="sourceLineNo">2839</span>    for (int i = 0; i &lt; res.size(); i++) {<a name="line.2839"></a>
+<span class="sourceLineNo">2840</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected2.get(i), res.get(i)));<a name="line.2840"></a>
+<span class="sourceLineNo">2841</span>    }<a name="line.2841"></a>
+<span class="sourceLineNo">2842</span>  }<a name="line.2842"></a>
+<span class="sourceLineNo">2843</span><a name="line.2843"></a>
+<span class="sourceLineNo">2844</span>  @Test<a name="line.2844"></a>
+<span class="sourceLineNo">2845</span>  public void testScanner_ExplicitColumns_FromMemStore_EnforceVersions() throws IOException {<a name="line.2845"></a>
+<span class="sourceLineNo">2846</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2846"></a>
+<span class="sourceLineNo">2847</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.2847"></a>
+<span class="sourceLineNo">2848</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.2848"></a>
+<span class="sourceLineNo">2849</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2849"></a>
+<span class="sourceLineNo">2850</span>    byte[][] families = { fam1 };<a name="line.2850"></a>
+<span class="sourceLineNo">2851</span><a name="line.2851"></a>
+<span class="sourceLineNo">2852</span>    long ts1 = System.currentTimeMillis();<a name="line.2852"></a>
+<span class="sourceLineNo">2853</span>    long ts2 = ts1 + 1;<a name="line.2853"></a>
+<span class="sourceLineNo">2854</span>    long ts3 = ts1 + 2;<a name="line.2854"></a>
+<span class="sourceLineNo">2855</span><a name="line.2855"></a>
+<span class="sourceLineNo">2856</span>    // Setting up region<a name="line.2856"></a>
+<span class="sourceLineNo">2857</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2857"></a>
+<span class="sourceLineNo">2858</span>    // Putting data in Region<a name="line.2858"></a>
+<span class="sourceLineNo">2859</span>    Put put = null;<a name="line.2859"></a>
+<span class="sourceLineNo">2860</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.2860"></a>
+<span class="sourceLineNo">2861</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.2861"></a>
+<span class="sourceLineNo">2862</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.2862"></a>
+<span class="sourceLineNo">2863</span><a name="line.2863"></a>
+<span class="sourceLineNo">2864</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.2864"></a>
+<span class="sourceLineNo">2865</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.2865"></a>
+<span class="sourceLineNo">2866</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.2866"></a>
+<span class="sourceLineNo">2867</span><a name="line.2867"></a>
+<span class="sourceLineNo">2868</span>    put = new Put(row1);<a name="line.2868"></a>
+<span class="sourceLineNo">2869</span>    put.add(kv13);<a name="line.2869"></a>
+<span class="sourceLineNo">2870</span>    put.add(kv12);<a name="line.2870"></a>
+<span class="sourceLineNo">2871</span>    put.add(kv11);<a name="line.2871"></a>
+<span class="sourceLineNo">2872</span>    put.add(kv23);<a name="line.2872"></a>
+<span class="sourceLineNo">2873</span>    put.add(kv22);<a name="line.2873"></a>
+<span class="sourceLineNo">2874</span>    put.add(kv21);<a name="line.2874"></a>
+<span class="sourceLineNo">2875</span>    region.put(put);<a name="line.2875"></a>
+<span class="sourceLineNo">2876</span><a name="line.2876"></a>
+<span class="sourceLineNo">2877</span>    // Expected<a name="line.2877"></a>
+<span class="sourceLineNo">2878</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.2878"></a>
+<span class="sourceLineNo">2879</span>    expected.add(kv13);<a name="line.2879"></a>
+<span class="sourceLineNo">2880</span>    expected.add(kv12);<a name="line.2880"></a>
+<span class="sourceLineNo">2881</span><a name="line.2881"></a>
+<span class="sourceLineNo">2882</span>    Scan scan = new Scan(row1);<a name="line.2882"></a>
+<span class="sourceLineNo">2883</span>    scan.addColumn(fam1, qf1);<a name="line.2883"></a>
+<span class="sourceLineNo">2884</span>    scan.setMaxVersions(MAX_VERSIONS);<a name="line.2884"></a>
+<span class="sourceLineNo">2885</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.2885"></a>
+<span class="sourceLineNo">2886</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.2886"></a>
+<span class="sourceLineNo">2887</span><a name="line.2887"></a>
+<span class="sourceLineNo">2888</span>    boolean hasNext = scanner.next(actual);<a name="line.2888"></a>
+<span class="sourceLineNo">2889</span>    assertEquals(false, hasNext);<a name="line.2889"></a>
+<span class="sourceLineNo">2890</span><a name="line.2890"></a>
+<span class="sourceLineNo">2891</span>    // Verify result<a name="line.2891"></a>
+<span class="sourceLineNo">2892</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.2892"></a>
+<span class="sourceLineNo">2893</span>      assertEquals(expected.get(i), actual.get(i));<a name="line.2893"></a>
+<span class="sourceLineNo">2894</span>    }<a name="line.2894"></a>
+<span class="sourceLineNo">2895</span>  }<a name="line.2895"></a>
+<span class="sourceLineNo">2896</span><a name="line.2896"></a>
+<span class="sourceLineNo">2897</span>  @Test<a name="line.2897"></a>
+<span class="sourceLineNo">2898</span>  public void testScanner_ExplicitColumns_FromFilesOnly_EnforceVersions() throws IOException {<a name="line.2898"></a>
+<span class="sourceLineNo">2899</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2899"></a>
+<span class="sourceLineNo">2900</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.2900"></a>
+<span class="sourceLineNo">2901</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.2901"></a>
+<span class="sourceLineNo">2902</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2902"></a>
+<span class="sourceLineNo">2903</span>    byte[][] families = { fam1 };<a name="line.2903"></a>
+<span class="sourceLineNo">2904</span><a name="line.2904"></a>
+<span class="sourceLineNo">2905</span>    long ts1 = 1; // System.currentTimeMillis();<a name="line.2905"></a>
+<span class="sourceLineNo">2906</span>    long ts2 = ts1 + 1;<a name="line.2906"></a>
+<span class="sourceLineNo">2907</span>    long ts3 = ts1 + 2;<a name="line.2907"></a>
+<span class="sourceLineNo">2908</span><a name="line.2908"></a>
+<span class="sourceLineNo">2909</span>    // Setting up region<a name="line.2909"></a>
+<span class="sourceLineNo">2910</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2910"></a>
+<span class="sourceLineNo">2911</span>    // Putting data in Region<a name="line.2911"></a>
+<span class="sourceLineNo">2912</span>    Put put = null;<a name="line.2912"></a>
+<span class="sourceLineNo">2913</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.2913"></a>
+<span class="sourceLineNo">2914</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.2914"></a>
+<span class="sourceLineNo">2915</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.2915"></a>
+<span class="sourceLineNo">2916</span><a name="line.2916"></a>
+<span class="sourceLineNo">2917</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.2917"></a>
+<span class="sourceLineNo">2918</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.2918"></a>
+<span class="sourceLineNo">2919</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.2919"></a>
 <span class="sourceLineNo">2920</span><a name="line.2920"></a>
-<span class="sourceLineNo">2921</span>    // Expected<a name="line.2921"></a>
-<span class="sourceLineNo">2922</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.2922"></a>
-<span class="sourceLineNo">2923</span>    expected.add(kv13);<a name="line.2923"></a>
-<span class="sourceLineNo">2924</span>    expected.add(kv12);<a name="line.2924"></a>
-<span class="sourceLineNo">2925</span>    expected.add(kv23);<a name="line.2925"></a>
-<span class="sourceLineNo">2926</span>    expected.add(kv22);<a name="line.2926"></a>
-<span class="sourceLineNo">2927</span><a name="line.2927"></a>
-<span class="sourceLineNo">2928</span>    Scan scan = new Scan(row1);<a name="line.2928"></a>
-<span class="sourceLineNo">2929</span>    scan.addColumn(fam1, qf1);<a name="line.2929"></a>
-<span class="sourceLineNo">2930</span>    scan.addColumn(fam1, qf2);<a name="line.2930"></a>
-<span class="sourceLineNo">2931</span>    scan.setMaxVersions(MAX_VERSIONS);<a name="line.2931"></a>
-<span class="sourceLineNo">2932</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.2932"></a>
-<span class="sourceLineNo">2933</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.2933"></a>
-<span class="sourceLineNo">2934</span><a name="line.2934"></a>
-<span class="sourceLineNo">2935</span>    boolean hasNext = scanner.next(actual);<a name="line.2935"></a>
-<span class="sourceLineNo">2936</span>    assertEquals(false, hasNext);<a name="line.2936"></a>
+<span class="sourceLineNo">2921</span>    put = new Put(row1);<a name="line.2921"></a>
+<span class="sourceLineNo">2922</span>    put.add(kv13);<a name="line.2922"></a>
+<span class="sourceLineNo">2923</span>    put.add(kv12);<a name="line.2923"></a>
+<span class="sourceLineNo">2924</span>    put.add(kv11);<a name="line.2924"></a>
+<span class="sourceLineNo">2925</span>    put.add(kv23);<a name="line.2925"></a>
+<span class="sourceLineNo">2926</span>    put.add(kv22);<a name="line.2926"></a>
+<span class="sourceLineNo">2927</span>    put.add(kv21);<a name="line.2927"></a>
+<span class="sourceLineNo">2928</span>    region.put(put);<a name="line.2928"></a>
+<span class="sourceLineNo">2929</span>    region.flush(true);<a name="line.2929"></a>
+<span class="sourceLineNo">2930</span><a name="line.2930"></a>
+<span class="sourceLineNo">2931</span>    // Expected<a name="line.2931"></a>
+<span class="sourceLineNo">2932</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.2932"></a>
+<span class="sourceLineNo">2933</span>    expected.add(kv13);<a name="line.2933"></a>
+<span class="sourceLineNo">2934</span>    expected.add(kv12);<a name="line.2934"></a>
+<span class="sourceLineNo">2935</span>    expected.add(kv23);<a name="line.2935"></a>
+<span class="sourceLineNo">2936</span>    expected.add(kv22);<a name="line.2936"></a>
 <span class="sourceLineNo">2937</span><a name="line.2937"></a>
-<span class="sourceLineNo">2938</span>    // Verify result<a name="line.2938"></a>
-<span class="sourceLineNo">2939</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.2939"></a>
-<span class="sourceLineNo">2940</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected.get(i), actual.get(i)));<a name="line.2940"></a>
-<span class="sourceLineNo">2941</span>    }<a name="line.2941"></a>
-<span class="sourceLineNo">2942</span>  }<a name="line.2942"></a>
-<span class="sourceLineNo">2943</span><a name="line.2943"></a>
-<span class="sourceLineNo">2944</span>  @Test<a name="line.2944"></a>
-<span class="sourceLineNo">2945</span>  public void testScanner_ExplicitColumns_FromMemStoreAndFiles_EnforceVersions() throws<a name="line.2945"></a>
-<span class="sourceLineNo">2946</span>      IOException {<a name="line.2946"></a>
-<span class="sourceLineNo">2947</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2947"></a>
-<span class="sourceLineNo">2948</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2948"></a>
-<span class="sourceLineNo">2949</span>    byte[][] families = { fam1 };<a name="line.2949"></a>
-<span class="sourceLineNo">2950</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.2950"></a>
-<span class="sourceLineNo">2951</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.2951"></a>
-<span class="sourceLineNo">2952</span><a name="line.2952"></a>
-<span class="sourceLineNo">2953</span>    long ts1 = 1;<a name="line.2953"></a>
-<span class="sourceLineNo">2954</span>    long ts2 = ts1 + 1;<a name="line.2954"></a>
-<span class="sourceLineNo">2955</span>    long ts3 = ts1 + 2;<a name="line.2955"></a>
-<span class="sourceLineNo">2956</span>    long ts4 = ts1 + 3;<a name="line.2956"></a>
-<span class="sourceLineNo">2957</span><a name="line.2957"></a>
-<span class="sourceLineNo">2958</span>    // Setting up region<a name="line.2958"></a>
-<span class="sourceLineNo">2959</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2959"></a>
-<span class="sourceLineNo">2960</span>    // Putting data in Region<a name="line.2960"></a>
-<span class="sourceLineNo">2961</span>    KeyValue kv14 = new KeyValue(row1, fam1, qf1, ts4, KeyValue.Type.Put, null);<a name="line.2961"></a>
-<span class="sourceLineNo">2962</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.2962"></a>
-<span class="sourceLineNo">2963</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.2963"></a>
-<span class="sourceLineNo">2964</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.2964"></a>
-<span class="sourceLineNo">2965</span><a name="line.2965"></a>
-<span class="sourceLineNo">2966</span>    KeyValue kv24 = new KeyValue(row1, fam1, qf2, ts4, KeyValue.Type.Put, null);<a name="line.2966"></a>
-<span class="sourceLineNo">2967</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.2967"></a>
-<span class="sourceLineNo">2968</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.2968"></a>
-<span class="sourceLineNo">2969</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.2969"></a>
-<span class="sourceLineNo">2970</span><a name="line.2970"></a>
-<span class="sourceLineNo">2971</span>    Put put = null;<a name="line.2971"></a>
-<span class="sourceLineNo">2972</span>    put = new Put(row1);<a name="line.2972"></a>
-<span class="sourceLineNo">2973</span>    put.add(kv14);<a name="line.2973"></a>
-<span class="sourceLineNo">2974</span>    put.add(kv24);<a name="line.2974"></a>
-<span class="sourceLineNo">2975</span>    region.put(put);<a name="line.2975"></a>
-<span class="sourceLineNo">2976</span>    region.flush(true);<a name="line.2976"></a>
-<span class="sourceLineNo">2977</span><a name="line.2977"></a>
-<span class="sourceLineNo">2978</span>    put = new Put(row1);<a name="line.2978"></a>
-<span class="sourceLineNo">2979</span>    put.add(kv23);<a name="line.2979"></a>
-<span class="sourceLineNo">2980</span>    put.add(kv13);<a name="line.2980"></a>
-<span class="sourceLineNo">2981</span>    region.put(put);<a name="line.2981"></a>
-<span class="sourceLineNo">2982</span>    region.flush(true);<a name="line.2982"></a>
-<span class="sourceLineNo">2983</span><a name="line.2983"></a>
-<span class="sourceLineNo">2984</span>    put = new Put(row1);<a name="line.2984"></a>
-<span class="sourceLineNo">2985</span>    put.add(kv22);<a name="line.2985"></a>
-<span class="sourceLineNo">2986</span>    put.add(kv12);<a name="line.2986"></a>
-<span class="sourceLineNo">2987</span>    region.put(put);<a name="line.2987"></a>
-<span class="sourceLineNo">2988</span>    region.flush(true);<a name="line.2988"></a>
-<span class="sourceLineNo">2989</span><a name="line.2989"></a>
-<span class="sourceLineNo">2990</span>    put = new Put(row1);<a name="line.2990"></a>
-<span class="sourceLineNo">2991</span>    put.add(kv21);<a name="line.2991"></a>
-<span class="sourceLineNo">2992</span>    put.add(kv11);<a name="line.2992"></a>
-<span class="sourceLineNo">2993</span>    region.put(put);<a name="line.2993"></a>
-<span class="sourceLineNo">2994</span><a name="line.2994"></a>
-<span class="sourceLineNo">2995</span>    // Expected<a name="line.2995"></a>
-<span class="sourceLineNo">2996</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.2996"></a>
-<span class="sourceLineNo">2997</span>    expected.add(kv14);<a name="line.2997"></a>
-<span class="sourceLineNo">2998</span>    expected.add(kv13);<a name="line.2998"></a>
-<span class="sourceLineNo">2999</span>    expected.add(kv12);<a name="line.2999"></a>
-<span class="sourceLineNo">3000</span>    expected.add(kv24);<a name="line.3000"></a>
-<span class="sourceLineNo">3001</span>    expected.add(kv23);<a name="line.3001"></a>
-<span class="sourceLineNo">3002</span>    expected.add(kv22);<a name="line.3002"></a>
-<span class="sourceLineNo">3003</span><a name="line.3003"></a>
-<span class="sourceLineNo">3004</span>    Scan scan = new Scan(row1);<a name="line.3004"></a>
-<span class="sourceLineNo">3005</span>    scan.addColumn(fam1, qf1);<a name="line.3005"></a>
-<span class="sourceLineNo">3006</span>    scan.addColumn(fam1, qf2);<a name="line.3006"></a>
-<span class="sourceLineNo">3007</span>    int versions = 3;<a name="line.3007"></a>
-<span class="sourceLineNo">3008</span>    scan.setMaxVersions(versions);<a name="line.3008"></a>
-<span class="sourceLineNo">3009</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.3009"></a>
-<span class="sourceLineNo">3010</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.3010"></a>
-<span class="sourceLineNo">3011</span><a name="line.3011"></a>
-<span class="sourceLineNo">3012</span>    boolean hasNext = scanner.next(actual);<a name="line.3012"></a>
-<span class="sourceLineNo">3013</span>    assertEquals(false, hasNext);<a name="line.3013"></a>
-<span class="sourceLineNo">3014</span><a name="line.3014"></a>
-<span class="sourceLineNo">3015</span>    // Verify result<a name="line.3015"></a>
-<span class="sourceLineNo">3016</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.3016"></a>
-<span class="sourceLineNo">3017</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected.get(i), actual.get(i)));<a name="line.3017"></a>
-<span class="sourceLineNo">3018</span>    }<a name="line.3018"></a>
-<span class="sourceLineNo">3019</span>  }<a name="line.3019"></a>
-<span class="sourceLineNo">3020</span><a name="line.3020"></a>
-<span class="sourceLineNo">3021</span>  @Test<a name="line.3021"></a>
-<span class="sourceLineNo">3022</span>  public void testScanner_Wildcard_FromMemStore_EnforceVersions() throws IOException {<a name="line.3022"></a>
-<span class="sourceLineNo">3023</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.3023"></a>
-<span class="sourceLineNo">3024</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.3024"></a>
-<span class="sourceLineNo">3025</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.3025"></a>
-<span class="sourceLineNo">3026</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.3026"></a>
-<span class="sourceLineNo">3027</span>    byte[][] families = { fam1 };<a name="line.3027"></a>
-<span class="sourceLineNo">3028</span><a name="line.3028"></a>
-<span class="sourceLineNo">3029</span>    long ts1 = System.currentTimeMillis();<a name="line.3029"></a>
-<span class="sourceLineNo">3030</span>    long ts2 = ts1 + 1;<a name="line.3030"></a>
-<span class="sourceLineNo">3031</span>    long ts3 = ts1 + 2;<a name="line.3031"></a>
-<span class="sourceLineNo">3032</span><a name="line.3032"></a>
-<span class="sourceLineNo">3033</span>    // Setting up region<a name="line.3033"></a>
-<span class="sourceLineNo">3034</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.3034"></a>
-<span class="sourceLineNo">3035</span>    // Putting data in Region<a name="line.3035"></a>
-<span class="sourceLineNo">3036</span>    Put put = null;<a name="line.3036"></a>
-<span class="sourceLineNo">3037</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.3037"></a>
-<span class="sourceLineNo">3038</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.3038"></a>
-<span class="sourceLineNo">3039</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.3039"></a>
-<span class="sourceLineNo">3040</span><a name="line.3040"></a>
-<span class="sourceLineNo">3041</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.3041"></a>
-<span class="sourceLineNo">3042</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.3042"></a>
-<span class="sourceLineNo">3043</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.3043"></a>
-<span class="sourceLineNo">3044</span><a name="line.3044"></a>
-<span class="sourceLineNo">3045</span>    put = new Put(row1);<a name="line.3045"></a>
-<span class="sourceLineNo">3046</span>    put.add(kv13);<a name="line.3046"></a>
-<span class="sourceLineNo">3047</span>    put.add(kv12);<a name="line.3047"></a>
-<span class="sourceLineNo">3048</span>    put.add(kv11);<a name="line.3048"></a>
-<span class="sourceLineNo">3049</span>    put.add(kv23);<a name="line.3049"></a>
-<span class="sourceLineNo">3050</span>    put.add(kv22);<a name="line.3050"></a>
-<span class="sourceLineNo">3051</span>    put.add(kv21);<a name="line.3051"></a>
-<span class="sourceLineNo">3052</span>    region.put(put);<a name="line.3052"></a>
-<span class="sourceLineNo">3053</span><a name="line.3053"></a>
-<span class="sourceLineNo">3054</span>    // Expected<a name="line.3054"></a>
-<span class="sourceLineNo">3055</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.3055"></a>
-<span class="sourceLineNo">3056</span>    expected.add(kv13);<a name="line.3056"></a>
-<span class="sourceLineNo">3057</span>    expected.add(kv12);<a name="line.3057"></a>
-<span class="sourceLineNo">3058</span>    expected.add(kv23);<a name="line.3058"></a>
-<span class="sourceLineNo">3059</span>    expected.add(kv22);<a name="line.3059"></a>
-<span class="sourceLineNo">3060</span><a name="line.3060"></a>
-<span class="sourceLineNo">3061</span>    Scan scan = new Scan(row1);<a name="line.3061"></a>
-<span class="sourceLineNo">3062</span>    scan.addFamily(fam1);<a name="line.3062"></a>
-<span class="sourceLineNo">3063</span>    scan.setMaxVersions(MAX_VERSIONS);<a name="line.3063"></a>
-<span class="sourceLineNo">3064</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.3064"></a>
-<span class="sourceLineNo">3065</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.3065"></a>
-<span class="sourceLineNo">3066</span><a name="line.3066"></a>
-<span class="sourceLineNo">3067</span>    boolean hasNext = scanner.next(actual);<a name="line.3067"></a>
-<span class="sourceLineNo">3068</span>    assertEquals(false, hasNext);<a name="line.3068"></a>
-<span class="sourceLineNo">3069</span><a name="line.3069"></a>
-<span class="sourceLineNo">3070</span>    // Verify result<a name="line.3070"></a>
-<span class="sourceLineNo">3071</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.3071"></a>
-<span class="sourceLineNo">3072</span>      assertEquals(expected.get(i), actual.get(i));<a name="line.3072"></a>
-<span class="sourceLineNo">3073</span>    }<a name="line.3073"></a>
-<span class="sourceLineNo">3074</span>  }<a name="line.3074"></a>
-<span class="sourceLineNo">3075</span><a name="line.3075"></a>
-<span class="sourceLineNo">3076</span>  @Test<a name="line.3076"></a>
-<span class="sourceLineNo">3077</span>  public void testScanner_Wildcard_FromFilesOnly_EnforceVersions() throws IOException {<a name="line.3077"></a>
-<span class="sourceLineNo">3078</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.3078"></a>
-<span class="sourceLineNo">3079</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.3079"></a>
-<span class="sourceLineNo">3080</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.3080"></a>
-<span class="sourceLineNo">3081</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.3081"></a>
-<span class="sourceLineNo">3082</span><a name="line.3082"></a>
-<span class="sourceLineNo">3083</span>    long ts1 = 1; // System.currentTimeMillis();<a name="line.3083"></a>
-<span class="sourceLineNo">3084</span>    long ts2 = ts1 + 1;<a name="line.3084"></a>
-<span class="sourceLineNo">3085</span>    long ts3 = ts1 + 2;<a name="line.3085"></a>
-<span class="sourceLineNo">3086</span><a name="line.3086"></a>
-<span class="sourceLineNo">3087</span>    // Setting up region<a name="line.3087"></a>
-<span class="sourceLineNo">3088</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.3088"></a>
-<span class="sourceLineNo">3089</span>    // Putting data in Region<a name="line.3089"></a>
-<span class="sourceLineNo">3090</span>    Put put = null;<a name="line.3090"></a>
-<span class="sourceLineNo">3091</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.3091"></a>
-<span class="sourceLineNo">3092</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.3092"></a>
-<span class="sourceLineNo">3093</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.3093"></a>
-<span class="sourceLineNo">3094</span><a name="line.3094"></a>
-<span class="sourceLineNo">3095</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.3095"></a>
-<span class="sourceLineNo">3096</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.3096"></a>
-<span class="sourceLineNo">3097</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.3097"></a>
-<span class="sourceLineNo">3098</span><a name="line.3098"></a>
-<span class="sourceLineNo">3099</span>    put = new Put(row1);<a name="line.3099"></a>
-<span class="sourceLineNo">3100</span>    put.add(kv13);<a name="line.3100"></a>
-<span class="sourceLineNo">3101</span>    put.add(kv12);<a name="line.3101"></a>
-<span class="sourceLineNo">3102</span>    put.add(kv11);<a name="line.3102"></a>
-<span class="sourceLineNo">3103</span>    put.add(kv23);<a name="line.3103"></a>
-<span class="sourceLineNo">3104</span>    put.add(kv22);<a name="line.3104"></a>
-<span class="sourceLineNo">3105</span>    put.add(kv21);<a name="line.3105"></a>
-<span class="sourceLineNo">3106</span>    region.put(put);<a name="line.3106"></a>
-<span class="sourceLineNo">3107</span>    region.flush(true);<a name="line.3107"></a>
+<span class="sourceLineNo">2938</span>    Scan scan = new Scan(row1);<a name="line.2938"></a>
+<span class="sourceLineNo">2939</span>    scan.addColumn(fam1, qf1);<a name="line.2939"></a>
+<span class="sourceLineNo">2940</span>    scan.addColumn(fam1, qf2);<a name="line.2940"></a>
+<span class="sourceLineNo">2941</span>    scan.setMaxVersions(MAX_VERSIONS);<a name="line.2941"></a>
+<span class="sourceLineNo">2942</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.2942"></a>
+<span class="sourceLineNo">2943</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.2943"></a>
+<span class="sourceLineNo">2944</span><a name="line.2944"></a>
+<span class="sourceLineNo">2945</span>    boolean hasNext = scanner.next(actual);<a name="line.2945"></a>
+<span class="sourceLineNo">2946</span>    assertEquals(false, hasNext);<a name="line.2946"></a>
+<span class="sourceLineNo">2947</span><a name="line.2947"></a>
+<span class="sourceLineNo">2948</span>    // Verify result<a name="line.2948"></a>
+<span class="sourceLineNo">2949</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.2949"></a>
+<span class="sourceLineNo">2950</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected.get(i), actual.get(i)));<a name="line.2950"></a>
+<span class="sourceLineNo">2951</span>    }<a name="line.2951"></a>
+<span class="sourceLineNo">2952</span>  }<a name="line.2952"></a>
+<span class="sourceLineNo">2953</span><a name="line.2953"></a>
+<span class="sourceLineNo">2954</span>  @Test<a name="line.2954"></a>
+<span class="sourceLineNo">2955</span>  public void testScanner_ExplicitColumns_FromMemStoreAndFiles_EnforceVersions() throws<a name="line.2955"></a>
+<span class="sourceLineNo">2956</span>      IOException {<a name="line.2956"></a>
+<span class="sourceLineNo">2957</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2957"></a>
+<span class="sourceLineNo">2958</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2958"></a>
+<span class="sourceLineNo">2959</span>    byte[][] families = { fam1 };<a name="line.2959"></a>
+<span class="sourceLineNo">2960</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.2960"></a>
+<span class="sourceLineNo">2961</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.2961"></a>
+<span class="sourceLineNo">2962</span><a name="line.2962"></a>
+<span class="sourceLineNo">2963</span>    long ts1 = 1;<a name="line.2963"></a>
+<span class="sourceLineNo">2964</span>    long ts2 = ts1 + 1;<a name="line.2964"></a>
+<span class="sourceLineNo">2965</span>    long ts3 = ts1 + 2;<a name="line.2965"></a>
+<span class="sourceLineNo">2966</span>    long ts4 = ts1 + 3;<a name="line.2966"></a>
+<span class="sourceLineNo">2967</span><a name="line.2967"></a>
+<span class="sourceLineNo">2968</span>    // Setting up region<a name="line.2968"></a>
+<span class="sourceLineNo">2969</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2969"></a>
+<span class="sourceLineNo">2970</span>    // Putting data in Region<a name="line.2970"></a>
+<span class="sourceLineNo">2971</span>    KeyValue kv14 = new KeyValue(row1, fam1, qf1, ts4, KeyValue.Type.Put, null);<a name="line.2971"></a>
+<span class="sourceLineNo">2972</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.2972"></a>
+<span class="sourceLineNo">2973</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.2973"></a>
+<span class="sourceLineNo">2974</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.2974"></a>
+<span class="sourceLineNo">2975</span><a name="line.2975"></a>
+<span class="sourceLineNo">2976</span>    KeyValue kv24 = new KeyValue(row1, fam1, qf2, ts4, KeyValue.Type.Put, null);<a name="line.2976"></a>
+<span class="sourceLineNo">2977</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.2977"></a>
+<span class="sourceLineNo">2978</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.2978"></a>
+<span class="sourceLineNo">2979</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.2979"></a>
+<span class="sourceLineNo">2980</span><a name="line.2980"></a>
+<span class="sourceLineNo">2981</span>    Put put = null;<a name="line.2981"></a>
+<span class="sourceLineNo">2982</span>    put = new Put(row1);<a name="line.2982"></a>
+<span class="sourceLineNo">2983</span>    put.add(kv14);<a name="line.2983"></a>
+<span class="sourceLineNo">2984</span>    put.add(kv24);<a name="line.2984"></a>
+<span class="sourceLineNo">2985</span>    region.put(put);<a name="line.2985"></a>
+<span class="sourceLineNo">2986</span>    region.flush(true);<a name="line.2986"></a>
+<span class="sourceLineNo">2987</span><a name="line.2987"></a>
+<span class="sourceLineNo">2988</span>    put = new Put(row1);<a name="line.2988"></a>
+<span class="sourceLineNo">2989</span>    put.add(kv23);<a name="line.2989"></a>
+<span class="sourceLineNo">2990</span>    put.add(kv13);<a name="line.2990"></a>
+<span class="sourceLineNo">2991</span>    region.put(put);<a name="line.2991"></a>
+<span class="sourceLineNo">2992</span>    region.flush(true);<a name="line.2992"></a>
+<span class="sourceLineNo">2993</span><a name="line.2993"></a>
+<span class="sourceLineNo">2994</span>    put = new Put(row1);<a name="line.2994"></a>
+<span class="sourceLineNo">2995</span>    put.add(kv22);<a name="line.2995"></a>
+<span class="sourceLineNo">2996</span>    put.add(kv12);<a name="line.2996"></a>
+<span class="sourceLineNo">2997</span>    region.put(put);<a name="line.2997"></a>
+<span class="sourceLineNo">2998</span>    region.flush(true);<a name="line.2998"></a>
+<span class="sourceLineNo">2999</span><a name="line.2999"></a>
+<span class="sourceLineNo">3000</span>    put = new Put(row1);<a name="line.3000"></a>
+<span class="sourceLineNo">3001</span>    put.add(kv21);<a name="line.3001"></a>
+<span class="sourceLineNo">3002</span>    put.add(kv11);<a name="line.3002"></a>
+<span class="sourceLineNo">3003</span>    region.put(put);<a name="line.3003"></a>
+<span class="sourceLineNo">3004</span><a name="line.3004"></a>
+<span class="sourceLineNo">3005</span>    // Expected<a name="line.3005"></a>
+<span class="sourceLineNo">3006</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.3006"></a>
+<span class="sourceLineNo">3007</span>    expected.add(kv14);<a name="line.3007"></a>
+<span class="sourceLineNo">3008</span>    expected.add(kv13);<a name="line.3008"></a>
+<span class="sourceLineNo">3009</span>    expected.add(kv12);<a name="line.3009"></a>
+<span class="sourceLineNo">3010</span>    expected.add(kv24);<a name="line.3010"></a>
+<span class="sourceLineNo">3011</span>    expected.add(kv23);<a name="line.3011"></a>
+<span class="sourceLineNo">3012</span>    expected.add(kv22);<a name="line.3012"></a>
+<span class="sourceLineNo">3013</span><a name="line.3013"></a>
+<span class="sourceLineNo">3014</span>    Scan scan = new Scan(row1);<a name="line.3014"></a>
+<span class="sourceLineNo">3015</span>    scan.addColumn(fam1, qf1);<a name="line.3015"></a>
+<span class="sourceLineNo">3016</span>    scan.addColumn(fam1, qf2);<a name="line.3016"></a>
+<span class="sourceLineNo">3017</span>    int versions = 3;<a name="line.3017"></a>
+<span class="sourceLineNo">3018</span>    scan.setMaxVersions(versions);<a name="line.3018"></a>
+<span class="sourceLineNo">3019</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.3019"></a>
+<span class="sourceLineNo">3020</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.3020"></a>
+<span class="sourceLineNo">3021</span><a name="line.3021"></a>
+<span class="sourceLineNo">3022</span>    boolean hasNext = scanner.next(actual);<a name="line.3022"></a>
+<span class="sourceLineNo">3023</span>    assertEquals(false, hasNext);<a name="line.3023"></a>
+<span class="sourceLineNo">3024</span><a name="line.3024"></a>
+<span class="sourceLineNo">3025</span>    // Verify result<a name="line.3025"></a>
+<span class="sourceLineNo">3026</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.3026"></a>
+<span class="sourceLineNo">3027</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected.get(i), actual.get(i)));<a name="line.3027"></a>
+<span class="sourceLineNo">3028</span>    }<a name="line.3028"></a>
+<span class="sourceLineNo">3029</span>  }<a name="line.3029"></a>
+<span class="sourceLineNo">3030</span><a name="line.3030"></a>
+<span class="sourceLineNo">3031</span>  @Test<a name="line.3031"></a>
+<span class="sourceLineNo">3032</span>  public void testScanner_Wildcard_FromMemStore_EnforceVersions() throws IOException {<a name="line.3032"></a>
+<span class="sourceLineNo">3033</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.3033"></a>
+<span class="sourceLineNo">3034</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.3034"></a>
+<span class="sourceLineNo">3035</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.3035"></a>
+<span class="sourceLineNo">3036</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.3036"></a>
+<span class="sourceLineNo">3037</span>    byte[][] families = { fam1 };<a name="line.3037"></a>
+<span class="sourceLineNo">3038</span><a name="line.3038"></a>
+<span class="sourceLineNo">3039</span>    long ts1 = System.currentTimeMillis();<a name="line.3039"></a>
+<span class="sourceLineNo">3040</span>    long ts2 = ts1 + 1;<a name="line.3040"></a>
+<span class="sourceLineNo">3041</span>    long ts3 = ts1 + 2;<a name="line.3041"></a>
+<span class="sourceLineNo">3042</span><a name="line.3042"></a>
+<span class="sourceLineNo">3043</span>    // Setting up region<a name="line.3043"></a>
+<span class="sourceLineNo">3044</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.3044"></a>
+<span class="sourceLineNo">3045</span>    // Putting data in Region<a name="line.3045"></a>
+<span class="sourceLineNo">3046</span>    Put put = null;<a name="line.3046"></a>
+<span class="sourceLineNo">3047</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.3047"></a>
+<span class="sourceLineNo">3048</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.3048"></a>
+<span class="sourceLineNo">3049</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.3049"></a>
+<span class="sourceLineNo">3050</span><a name="line.3050"></a>
+<span class="sourceLineNo">3051</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.3051"></a>
+<span class="sourceLineNo">3052</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.3052"></a>
+<span class="sourceLineNo">3053</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.3053"></a>
+<span class="sourceLineNo">3054</span><a name="line.3054"></a>
+<span class="sourceLineNo">3055</span>    put = new Put(row1);<a name="line.3055"></a>
+<span class="sourceLineNo">3056</span>    put.add(kv13);<a name="line.3056"></a>
+<span class="sourceLineNo">3057</span>    put.add(kv12);<a name="line.3057"></a>
+<span class="sourceLineNo">3058</span>    put.add(kv11);<a name="line.3058"></a>
+<span class="sourceLineNo">3059</span>    put.add(kv23);<a name="line.3059"></a>
+<span class="sourceLineNo">3060</span>    put.add(kv22);<a name="line.3060"></a>
+<span class="sourceLineNo">3061</span>    put.add(kv21);<a name="line.3061"></a>
+<span class="sourceLineNo">3062</span>    region.put(put);<a name="line.3062"></a>
+<span class="sourceLineNo">3063</span><a name="line.3063"></a>
+<span class="sourceLineNo">3064</span>    // Expected<a name="line.3064"></a>
+<span class="sourceLineNo">3065</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.3065"></a>
+<span class="sourceLineNo">3066</span>    expected.add(kv13);<a name="line.3066"></a>
+<span class="sourceLineNo">3067</span>    expected.add(kv12);<a name="line.3067"></a>
+<span class="sourceLineNo">3068</span>    expected.add(kv23);<a name="line.3068"></a>
+<span class="sourceLineNo">3069</span>    expected.add(kv22);<a name="line.3069"></a>
+<span class="sourceLineNo">3070</span><a name="line.3070"></a>
+<span class="sourceLineNo">3071</span>    Scan scan = new Scan(row1);<a name="line.3071"></a>
+<span class="sourceLineNo">3072</span>    scan.addFamily(fam1);<a name="line.3072"></a>
+<span class="sourceLineNo">3073</span>    scan.setMaxVersions(MAX_VERSIONS);<a name="line.3073"></a>
+<span class="sourceLineNo">3074</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.3074"></a>
+<span class="sourceLineNo">3075</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.3075"></a>
+<span class="sourceLineNo">3076</span><a name="line.3076"></a>
+<span class="sourceLineNo">3077</span>    boolean hasNext = scanner.next(actual);<a name="line.3077"></a>
+<span class="sourceLineNo">3078</span>    assertEquals(false, hasNext);<a name="line.3078"></a>
+<span class="sourceLineNo">3079</span><a name="line.3079"></a>
+<span class="sourceLineNo">3080</span>    // Verify result<a name="line.3080"></a>
+<span class="sourceLineNo">3081</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.3081"></a>
+<span class="sourceLineNo">3082</span>      assertEquals(expected.get(i), actual.get(i));<a name="line.3082"></a>
+<span class="sourceLineNo">3083</span>    }<a name="line.3083"></a>
+<span class="sourceLineNo">3084</span>  }<a name="line.3084"></a>
+<span class="sourceLineNo">3085</span><a name="line.3085"></a>
+<span class="sourceLineNo">3086</span>  @Test<a name="line.3086"></a>
+<span class="sourceLineNo">3087</span>  public void testScanner_Wildcard_FromFilesOnly_EnforceVersions() throws IOException {<a name="line.3087"></a>
+<span class="sourceLineNo">3088</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.3088"></a>
+<span class="sourceLineNo">3089</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.3089"></a>
+<span class="sourceLineNo">3090</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.3090"></a>
+<span class="sourceLineNo">3091</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.3091"></a>
+<span class="sourceLineNo">3092</span><a name="line.3092"></a>
+<span class="sourceLineNo">3093</span>    long ts1 = 1; // System.currentTimeMillis();<a name="line.3093"></a>
+<span class="sourceLineNo">3094</span>    long ts2 = ts1 + 1;<a name="line.3094"></a>
+<span class="sourceLineNo">3095</span>    long ts3 = ts1 + 2;<a name="line.3095"></a>
+<span class="sourceLineNo">3096</span><a name="line.3096"></a>
+<span class="sourceLineNo">3097</span>    // Setting up region<a name="line.3097"></a>
+<span class="sourceLineNo">3098</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.3098"></a>
+<span class="sourceLineNo">3099</span>    // Putting data in Region<a name="line.3099"></a>
+<span class="sourceLineNo">3100</span>    Put put = null;<a name="line.3100"></a>
+<span class="sourceLineNo">3101</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.3101"></a>
+<span class="sourceLineNo">3102</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.3102"></a>
+<span class="sourceLineNo">3103</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.3103"></a>
+<span class="sourceLineNo">3104</span><a name="line.3104"></a>
+<span class="sourceLineNo">3105</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.3105"></a>
+<span class="sourceLineNo">3106</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.3106"></a>
+<span class="sourceLineNo">3107</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.3107"></a>
 <span class="sourceLineNo">3108</span><a name="line.3108"></a>
-<span class="sourceLineNo">3109</span>    // Expected<a name="line.3109"></a>
-<span class="sourceLineNo">3110</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.3110"></a>
-<span class="sourceLineNo">3111</span>    expected.add(kv13);<a name="line.3111"></a>
-<span class="sourceLineNo">3112</span>    expected.add(kv12);<a name="line.3112"></a>
-<span class="sourceLineNo">3113</span>    expected.add(kv23);<a name="line.3113"></a>
-<span class="sourceLineNo">3114</span>    expected.add(kv22);<a name="line.3114"></a>
-<span class="sourceLineNo">3115</span><a name="line.3115"></a>
-<span class="sourceLineNo">3116</span>    Scan scan = new Scan(row1);<a name="line.3116"></a>
-<span class="sourceLineNo">3117</span>    scan.addFamily(fam1);<a name="line.3117"></a>
-<span class="sourceLineNo">3118</span>    scan.setMaxVersions(MAX_VERSIONS);<a name="line.3118"></a>
-<span class="sourceLineNo">3119</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.3119"></a>
-<span class="sourceLineNo">3120</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.3120"></a>
-<span class="sourceLineNo">3121</span><a name="line.3121"></a>
-<span class="sourceLineNo">3122</span>    boolean hasNext = scanner.next(actual);<a name="line.3122"></a>
-<span class="sourceLineNo">3123</span>    assertEquals(false, hasNext);<a name="line.3123"></a>
-<span class="sourceLineNo">3124</span><a name="line.3124"></a>
-<span class="sourceLineNo">3125</span>    // Verify result<a name="line.3125"></a>
-<span class="sourceLineNo">3126</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.3126"></a>
-<span class="sourceLineNo">3127</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected.get(i), actual.get(i)));<a name="line.3127"></a>
-<span class="sourceLineNo">3128</span>    }<a name="line.3128"></a>
-<span class="sourceLineNo">3129</span>  }<a name="line.3129"></a>
-<span class="sourceLineNo">3130</span><a name="line.3130"></a>
-<span class="sourceLineNo">3131</span>  @Test<a name="line.3131"></a>
-<span class="sourceLineNo">3132</span>  public void testScanner_StopRow1542() throws IOException {<a name="line.3132"></a>
-<span class="sourceLineNo">3133</span>    byte[] family = Bytes.toBytes("testFamily");<a name="line.3133"></a>
-<span class="sourceLineNo">3134</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.3134"></a>
-<span class="sourceLineNo">3135</span>    byte[] row1 = Bytes.toBytes("row111");<a name="line.3135"></a>
-<span class="sourceLineNo">3136</span>    byte[] row2 = Bytes.toBytes("row222");<a name="line.3136"></a>
-<span class="sourceLineNo">3137</span>    byte[] row3 = Bytes.toBytes("row333");<a name="line.3137"></a>
-<span class="sourceLineNo">3138</span>    byte[] row4 = Bytes.toBytes("row444");<a name="line.3138"></a>
-<span class="sourceLineNo">3139</span>    byte[] row5 = Bytes.toBytes("row555");<a name="line.3139"></a>
+<span class="sourceLineNo">3109</span>    put = new Put(row1);<a name="line.3109"></a>
+<span class="sourceLineNo">3110</span>    put.add(kv13);<a name="line.3110"></a>
+<span class="sourceLineNo">3111</span>    put.add(kv12);<a name="line.3111"></a>
+<span class="sourceLineNo">3112</span>    put.add(kv11);<a name="line.3112"></a>
+<span class="sourceLineNo">3113</span>    put.add(kv23);<a name="line.3113"></a>
+<span class="sourceLineNo">3114</span>    put.add(kv22);<a name="line.3114"></a>
+<span class="sourceLineNo">3115</span>    put.add(kv21);<a name="line.3115"></a>
+<span class="sourceLineNo">3116</span>    region.put(put);<a name="line.3116"></a>
+<span class="sourceLineNo">3117</span>    region.flush(true);<a name="line.3117"></a>
+<span class="sourceLineNo">3118</span><a name="line.3118"></a>
+<span class="sourceLineNo">3119</span>    // Expected<a name="line.3119"></a>
+<span class="sourceLineNo">3120</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.3120"></a>
+<span class="sourceLineNo">3121</span>    expected.add(kv13);<a name="line.3121"></a>
+<span class="sourceLineNo">3122</span>    expected.add(kv12);<a name="line.3122"></a>
+<span class="sourceLineNo">3123</span>    expected.add(kv23);<a name="line.3123"></a>
+<span class="sourceLineNo">3124</span>    expected.add(kv22);<a name="line.3124"></a>
+<span class="sourceLineNo">3125</span><a name="line.3125"></a>
+<span class="sourceLineNo">3126</span>    Scan scan = new Scan(row1);<a name="line.3126"></a>
+<span class="sourceLineNo">3127</span>    scan.addFamily(fam1);<a name="line.3127"></a>
+<span class="sourceLineNo">3128</span>    scan.setMaxVersions(MAX_VERSIONS);<a name="line.3128"></a>
+<span class="sourceLineNo">3129</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.3129"></a>
+<span class="sourceLineNo">3130</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.3130"></a>
+<span class="sourceLineNo">3131</span><a name="line.3131"></a>
+<span class="sourceLineNo">3132</span>    boolean hasNext = scanner.next(actual);<a name="line.3132"></a>
+<span class="sourceLineNo">3133</span>    assertEquals(false, hasNext);<a name="line.3133"></a>
+<span class="sourceLineNo">3134</span><a name="line.3134"></a>
+<span class="sourceLineNo">3135</span>    // Verify result<a name="line.3135"></a>
+<span class="sourceLineNo">3136</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.3136"></a>
+<span class="sourceLineNo">3137</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected.get(i), actual.get(i)));<a name="line.3137"></a>
+<span class="sourceLineNo">3138</span>    }<a name="line.3138"></a>
+<span class="sourceLineNo">3139</span>  }<a name="line.3139"></a>
 <span class="sourceLineNo">3140</span><a name="line.3140"></a>
-<span class="sourceLineNo">3141</span>    byte[] col1 = Bytes.toBytes("Pub111");<a name="line.3141"></a>
-<span class="sourceLineNo">3142</span>    byte[] col2 = Bytes.toBytes("Pub222");<a name="line.3142"></a>
-<span class="sourceLineNo">3143</span><a name="line.3143"></a>
-<span class="sourceLineNo">3144</span>    Put put = new Put(row1);<a name="line.3144"></a>
-<span class="sourceLineNo">3145</span>    put.addColumn(family, col1, Bytes.toBytes(10L));<a name="line.3145"></a>
-<span class="sourceLineNo">3146</span>    region.put(put);<a name="line.3146"></a>
-<span class="sourceLineNo">3147</span><a name="line.3147"></a>
-<span class="sourceLineNo">3148</span>    put = new Put(row2);<a name="line.3148"></a>
-<span class="sourceLineNo">3149</span>    put.addColumn(family, col1, Bytes.toBytes(15L));<a name="line.3149"></a>
-<span class="sourceLineNo">3150</span>    region.put(put);<a name="line.3150"></a>
-<span class="sourceLineNo">3151</span><a name="line.3151"></a>
-<span class="sourceLineNo">3152</span>    put = new Put(row3);<a name="line.3152"></a>
-<span class="sourceLineNo">3153</span>    put.addColumn(family, col2, Bytes.toBytes(20L));<a name="line.3153"></a>
-<span class="sourceLineNo">3154</span>    region.put(put);<a name="line.3154"></a>
-<span class="sourceLineNo">3155</span><a name="line.3155"></a>
-<span class="sourceLineNo">3156</span>    put = new Put(row4);<a name="line.3156"></a>
-<span class="sourceLineNo">3157</span>    put.addColumn(family, col2, Bytes.toBytes(30L));<a name="line.3157"></a>
-<span class="sourceLineNo">3158</span>    region.put(put);<a name="line.3158"></a>
-<span class="sourceLineNo">3159</span><a name="line.3159"></a>
-<span class="sourceLineNo">3160</span>    put = new Put(row5);<a name="line.3160"></a>
-<span class="sourceLineNo">3161</span>    put.addColumn(family, col1, Bytes.toBytes(40L));<a name="line.3161"></a>
-<span class="sourceLineNo">3162</span>    region.put(put);<a name="line.3162"></a>
-<span class="sourceLineNo">3163</span><a name="line.3163"></a>
-<span class="sourceLineNo">3164</span>    Scan scan = new Scan(row3, row4);<a name="line.3164"></a>
-<span class="sourceLineNo">3165</span>    scan.setMaxVersions();<a name="line.3165"></a>
-<span class="sourceLineNo">3166</span>    scan.addColumn(family, col1);<a name="line.3166"></a>
-<span class="sourceLineNo">3167</span>    InternalScanner s = region.getScanner(scan);<a name="line.3167"></a>
-<span class="sourceLineNo">3168</span><a name="line.3168"></a>
-<span class="sourceLineNo">3169</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.3169"></a>
-<span class="sourceLineNo">3170</span>    assertEquals(false, s.next(results));<a name="line.3170"></a>
-<span class="sourceLineNo">3171</span>    assertEquals(0, results.size());<a name="line.3171"></a>
-<span class="sourceLineNo">3172</span>  }<a name="line.3172"></a>
+<span class="sourceLineNo">3141</span>  @Test<a name="line.3141"></a>
+<span class="sourceLineNo">3142</span>  public void testScanner_StopRow1542() throws IOException {<a name="line.3142"></a>
+<span class="sourceLineNo">3143</span>    byte[] family = Bytes.toBytes("testFamily");<a name="line.3143"></a>
+<span class="sourceLineNo">3144</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.3144"></a>
+<span class="sourceLineNo">3145</span>    byte[] row1 = Bytes.toBytes("row111");<a name="line.3145"></a>
+<span class="sourceLineNo">3146</span>    byte[] row2 = Bytes.toBytes("row222");<a name="line.3146"></a>
+<span class="sourceLineNo">3147</span>    byte[] row3 = Bytes.toBytes("row333");<a name="line.3147"></a>
+<span class="sourceLineNo">3148</span>    byte[] row4 = Bytes.toBytes("row444");<a name="line.3148"></a>
+<span class="sourceLineNo">3149</span>    byte[] row5 = Bytes.toBytes("row555");<a name="line.3149"></a>
+<span class="sourceLineNo">3150</span><a name="line.3150"></a>
+<span class="sourceLineNo">3151</span>    byte[] col1 = Bytes.toBytes("Pub111");<a name="line.3151"></a>
+<span class="sourceLineNo">3152</span>    byte[] col2 = Bytes.toBytes("Pub222");<a name="line.3152"></a>
+<span class="sourceLineNo">3153</span><a name="line.3153"></a>
+<span class="sourceLineNo">3154</span>    Put put = new Put(row1);<a name="line.3154"></a>
+<span class="sourceLineNo">3155</span>    put.addColumn(family, col1, Bytes.toBytes(10L));<a name="line.3155"></a>
+<span class="sourceLineNo">3156</span>    region.put(put);<a name="line.3156"></a>
+<span class="sourceLineNo">3157</span><a name="line.3157"></a>
+<span class="sourceLineNo">3158</span>    put = new Put(row2);<a name="line.3158"></a>
+<span class="sourceLineNo">3159</span>    put.addColumn(family, col1, Bytes.toBytes(15L));<a name="line.3159"></a>
+<span class="sourceLineNo">3160</span>    region.put(put);<a name="line.3160"></a>
+<span class="sourceLineNo">3161</span><a name="line.3161"></a>
+<span class="sourceLineNo">3162</span>    put = new Put(row3);<a name="line.3162"></a>
+<span class="sourceLineNo">3163</span>    put.addColumn(family, col2, Bytes.toBytes(20L));<a name="line.3163"></a>
+<span class="sourceLineNo">3164</span>    region.put(put);<a name="line.3164"></a>
+<span class="sourceLineNo">3165</span><a name="line.3165"></a>
+<span class="sourceLineNo">3166</span>    put = new Put(row4);<a name="line.3166"></a>
+<span class="sourceLineNo">3167</span>    put.addColumn(family, col2, Bytes.toBytes(30L));<a name="line.3167"></a>
+<span class="sourceLineNo">3168</span>    region.put(put);<a name="line.3168"></a>
+<span class="sourceLineNo">3169</span><a name="line.3169"></a>
+<span class="sourceLineNo">3170</span>    put = new Put(row5);<a name="line.3170"></a>
+<span class="sourceLineNo">3171</span>    put.addColumn(family, col1, Bytes.toBytes(40L));<a name="line.3171"></a>
+<span class="sourceLineNo">3172</span>    region.put(put);<a name="line.3172"></a>
 <span class="sourceLineNo">3173</span><a name="line.3173"></a>
-<span class="sourceLineNo">3174</span>  @Test<a name="line.3174"></a>
-<span class="sourceLineNo">3175</span>  public void testScanner_Wildcard_FromMemStoreAndFiles_EnforceVersions() throws IOException {<a name="line.3175"></a>
-<span class="sourceLineNo">3176</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.3176"></a>
-<span class="sourceLineNo">3177</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.3177"></a>
-<span class="sourceLineNo">3178</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.3178"></a>
-<span class="sourceLineNo">3179</span>    byte[] qf2 = Bytes.toBytes("quateslifier2");<a name="line.3179"></a>
-<span class="sourceLineNo">3180</span><a name="line.3180"></a>
-<span class="sourceLineNo">3181</span>    long ts1 = 1;<a name="line.3181"></a>
-<span class="sourceLineNo">3182</span>    long ts2 = ts1 + 1;<a name="line.3182"></a>
-<span class="sourceLineNo">3183</span>    long ts3 = ts1 + 2;<a name="line.3183"></a>
-<span class="sourceLineNo">3184</span>    long ts4 = ts1 + 3;<a name="line.3184"></a>
-<span class="sourceLineNo">3185</span><a name="line.3185"></a>
-<span class="sourceLineNo">3186</span>    // Setting up region<a name="line.3186"></a>
-<span class="sourceLineNo">3187</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.3187"></a>
-<span class="sourceLineNo">3188</span>    // Putting data in Region<a name="line.3188"></a>
-<span class="sourceLineNo">3189</span>    KeyValue kv14 = new KeyValue(row1, fam1, qf1, ts4, KeyValue.Type.Put, null);<a name="line.3189"></a>
-<span class="sourceLineNo">3190</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.3190"></a>
-<span class="sourceLineNo">3191</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.3191"></a>
-<span class="sourceLineNo">3192</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.3192"></a>
-<span class="sourceLineNo">3193</span><a name="line.3193"></a>
-<span class="sourceLineNo">3194</span>    KeyValue kv24 = new KeyValue(row1, fam1, qf2, ts4, KeyValue.Type.Put, null);<a name="line.3194"></a>
-<span class="sourceLineNo">3195</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.3195"></a>
-<span class="sourceLineNo">3196</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.3196"></a>
-<span class="sourceLineNo">3197</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.3197"></a>
-<span class="sourceLineNo">3198</span><a name="line.3198"></a>
-<span class="sourceLineNo">3199</span>    Put put = null;<a name="line.3199"></a>
-<span class="sourceLineNo">3200</span>    put = new Put(row1);<a name="line.3200"></a>
-<span class="sourceLineNo">3201</span>    put.add(kv14);<a name="line.3201"></a>
-<span class="sourceLineNo">3202</span>    put.add(kv24);<a name="line.3202"></a>
-<span class="sourceLineNo">3203</span>    region.put(put);<a name="line.3203"></a>
-<span class="sourceLineNo">3204</span>    region.flush(true);<a name="line.3204"></a>
-<span class="sourceLineNo">3205</span><a name="line.3205"></a>
-<span class="sourceLineNo">3206</span>    put = new Put(row1);<a name="line.3206"></a>
-<span class="sourceLineNo">3207</span>    put.add(kv23);<a name="line.3207"></a>
-<span class="sourceLineNo">3208</span>    put.add(kv13);<a name="line.3208"></a>
-<span class="sourceLineNo">3209</span>    region.put(put);<a name="line.3209"></a>
-<span class="sourceLineNo">3210</span>    region.flush(true);<a name="line.3210"></a>
-<span class="sourceLineNo">3211</span><a name="line.3211"></a>
-<span class="sourceLineNo">3212</span>    put = new Put(row1);<a name="line.3212"></a>
-<span class="sourceLineNo">3213</span>    put.add(kv22);<a name="line.3213"></a>
-<span class="sourceLineNo">3214</span>    put.add(kv12);<a name="line.3214"></a>
-<span class="sourceLineNo">3215</span>    region.put(put);<a name="line.3215"></a>
-<span class="sourceLineNo">3216</span>    region.flush(true);<a name="line.3216"></a>
-<span class="sourceLineNo">3217</span><a name="line.3217"></a>
-<span class="sourceLineNo">3218</span>    put = new Put(row1);<a name="line.3218"></a>
-<span class="sourceLineNo">3219</span>    put.add(kv21);<a name="line.3219"></a>
-<span class="sourceLineNo">3220</span>    put.add(kv11);<a name="line.3220"></a>
-<span class="sourceLineNo">3221</span>    region.put(put);<a name="line.3221"></a>
-<span class="sourceLineNo">3222</span><a name="line.3222"></a>
-<span class="sourceLineNo">3223</span>    // Expected<a name="line.3223"></a>
-<span class="sourceLineNo">3224</span>    List&lt;KeyValue&gt; expected = new ArrayList&lt;&gt;();<a name="line.3224"></a>
-<span class="sourceLineNo">3225</span>    expected.add(kv14);<a name="line.3225"></a>
-<span class="sourceLineNo">3226</span>    expected.add(kv13);<a name="line.3226"></a>
-<span class="sourceLineNo">3227</span>    expected.add(kv12);<a name="line.3227"></a>
-<span class="sourceLineNo">3228</span>    expected.add(kv24);<a name="line.3228"></a>
-<span class="sourceLineNo">3229</span>    expected.add(kv23);<a name="line.3229"></a>
-<span class="sourceLineNo">3230</span>    expected.add(kv22);<a name="line.3230"></a>
-<span class="sourceLineNo">3231</span><a name="line.3231"></a>
-<span class="sourceLineNo">3232</span>    Scan scan = new Scan(row1);<a name="line.3232"></a>
-<span class="sourceLineNo">3233</span>    int versions = 3;<a name="line.3233"></a>
-<span class="sourceLineNo">3234</span>    scan.setMaxVersions(versions);<a name="line.3234"></a>
-<span class="sourceLineNo">3235</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.3235"></a>
-<span class="sourceLineNo">3236</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.3236"></a>
-<span class="sourceLineNo">3237</span><a name="line.3237"></a>
-<span class="sourceLineNo">3238</span>    boolean hasNext = scanner.next(actual);<a name="line.3238"></a>
-<span class="sourceLineNo">3239</span>    assertEquals(false, hasNext);<a name="line.3239"></a>
-<span class="sourceLineNo">3240</span><a name="line.3240"></a>
-<span class="sourceLineNo">3241</span>    // Verify result<a name="line.3241"></a>
-<span class="sourceLineNo">3242</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.3242"></a>
-<span class="sourceLineNo">3243</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected.get(i), actual.get(i)));<a name="line.3243"></a>
-<span class="sourceLineNo">3244</span>    }<a name="line.3244"></a>
-<span class="sourceLineNo">3245</span>  }<a name="line.3245"></a>
-<span class="sourceLineNo">3246</span><a name="line.3246"></a>
-<span class="sourceLineNo">3247</span>  /**<a name="line.3247"></a>
-<span class="sourceLineNo">3248</span>   * Added for HBASE-5416<a name="line.3248"></a>
-<span class="sourceLineNo">3249</span>   *<a name="line.3249"></a>
-<span class="sourceLineNo">3250</span>   * Here we test scan optimization when only subset of CFs are used in filter<a name="line.3250"></a>
-<span class="sourceLineNo">3251</span>   * conditions.<a name="line.3251"></a>
-<span class="sourceLineNo">3252</span>   */<a name="line.3252"></a>
-<span class="sourceLineNo">3253</span>  @Test<a name="line.3253"></a>
-<span class="sourceLineNo">3254</span>  public void testScanner_JoinedScanners() throws IOException {<a name="line.3254"></a>
-<span class="sourceLineNo">3255</span>    byte[] cf_essential = Bytes.toBytes("essential");<a name="line.3255"></a>
-<span class="sourceLineNo">3256</span>    byte[] cf_joined = Bytes.toBytes("joined");<a name="line.3256"></a>
-<span class="sourceLineNo">3257</span>    byte[] cf_alpha = Bytes.toBytes("alpha");<a name="line.3257"></a>
-<span class="sourceLineNo">3258</span>    this.region = initHRegion(tableName, method, CONF, cf_essential, cf_joined, cf_alpha);<a name="line.3258"></a>
-<span class="sourceLineNo">3259</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.3259"></a>
-<span class="sourceLineNo">3260</span>    byte[] row2 = Bytes.toBytes("row2");<a name="line.3260"></a>
-<span class="sourceLineNo">3261</span>    byte[] row3 = Bytes.toBytes("row3");<a name="line.3261"></a>
-<span class="sourceLineNo">3262</span><a name="line.3262"></a>
-<span class="sourceLineNo">3263</span>    byte[] col_normal = Bytes.toBytes("d");<a name="line.3263"></a>
-<span class="sourceLineNo">3264</span>    byte[] col_alpha = Bytes.toBytes("a");<a name="line.3264"></a>
-<span class="sourceLineNo">3265</span><a name="line.3265"></a>
-<span class="sourceLineNo">3266</span>    byte[] filtered_val = Bytes.toBytes(3);<a name="line.3266"></a>
-<span class="sourceLineNo">3267</span><a name="line.3267"></a>
-<span class="sourceLineNo">3268</span>    Put put = new Put(row1);<a name="line.3268"></a>
-<span class="sourceLineNo">3269</span>    put.addColumn(cf_essential, col_normal, Bytes.toBytes(1));<a name="line.3269"></a>
-<span class="sourceLineNo">3270</span>    put.addColumn(cf_joined, col_alpha, Bytes.toBytes(1));<a name="line.3270"></a>
-<span class="sourceLineNo">3271</span>    region.put(put);<a name="line.3271"></a>
+<span class="sourceLineNo">3174</span>    Scan scan = new Scan(row3, row4);<a name="line.3174"></a>
+<span class="sourceLineNo">3175</span>    scan.setMaxVersions();<a name="line.3175"></a>
+<span class="sourceLineNo">3176</span>    scan.addColumn(family, col1);<a name="line.3176"></a>
+<span class="sourceLineNo">3177</span>    InternalScanner s = region.getScanner(scan);<a name="line.3177"></a>
+<span class="sourceLineNo">3178</span><a name="line.3178"></a>
+<span class="sourceLineNo">3179</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.3179"></a>
+<span class="sourceLineNo">3180</span>    assertEquals(false, s.next(results));<a name="line.3180"></a>
+<span class="sourceLineNo">3181</span>    assertEquals(0, results.size());<a name="line.3181"></a>
+<span class="sourceLineNo">3182</span>  }<a name="line.3182"></a>
+<span class="sourceLineNo">3183</span><a name="line.3183"></a>
+<span class="sourceLineNo">3184</span>  @Test<a name="line.3184"></a>
+<span class="sourceLineNo">3185</span>  public void testScanner_Wildcard_FromMemStoreAndFiles_EnforceVersions() throws IOException {<a name="line.3185"></a>
+<span class="sourceLineNo">3186</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.3186"></a>
+<span class="sourceLineNo">3187</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.3187"></a>
+<span class="sourceLineNo">3188</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.3188"></a>
+<span class="sourceLineNo">3189</span>    byte[] qf2 = Bytes.toBytes("quateslifier2");<a name="line.3189"></a>
+<span class="sourceLineNo">3190</span><a name="line.3190"></a>
+<span class="sourceLineNo">3191</span>    long ts1 = 1;<a name="line.3191"></a>
+<span class="sourceLineNo">3192</span>    long ts2 = ts1 + 1;<a name="line.3192"></a>
+<span class="sourceLineNo">3193</span>    long ts3 = ts1 + 2;<a name="line.3193"></a>
+<span class="sourceLineNo">3194</span>    long ts4 = ts1 + 3;<a name="line.3194"></a>
+<span class="sourceLineNo">3195</span><a name="line.3195"></a>
+<span class="sourceLineNo">3196</span>    // Setting up region<a name="line.3196"></a>
+<span class="sourceLineNo">3197</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.3197"></a>
+<span class="sourceLineNo">3198</span>    // Putting data in Region<a name="line.3198"></a>
+<span class="sourceLineNo">3199</span>    KeyValue kv14 = new KeyValue(row1, fam1, qf1, ts4, KeyValue.Type.Put, null);<a name="line.3199"></a>
+<span class="sourceLineNo">3200</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.3200"></a>
+<span class="sourceLineNo">3201</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.3201"></a>
+<span class="sourceLineNo">3202</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.3202"></a>
+<span class="sourceLineNo">3203</span><a name="line.3203"></a>
+<span class="sourceLineNo">3204</span>    KeyValue kv24 = new KeyValue(row1, fam1, qf2, ts4, KeyValue.Type.Put, null);<a name="line.3204"></a>
+<span class="sourceLineNo">3205</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.3205"></a>
+<span class="sourceLineNo">3206</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.3206"></a>
+<span class="sourceLineNo">3207</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.3207"></a>
+<span class="sourceLineNo">3208</span><a name="line.3208"></a>
+<span class="sourceLineNo">3209</span>    Put put = null;<a name="line.3209"></a>
+<span class="sourceLineNo">3210</span>    put = new Put(row1);<a name="line.3210"></a>
+<span class="sourceLineNo">3211</span>    put.add(kv14);<a name="line.3211"></a>
+<span class="sourceLineNo">3212</span>    put.add(kv24);<a name="line.3212"></a>
+<span class="sourceLineNo">3213</span>    region.put(put);<a name="line.3213"></a>
+<span class="sourceLineNo">3214</span>    region.flush(true);<a name="line.3214"></a>
+<span class="sourceLineNo">3215</span><a name="line.3215"></a>
+<span class="sourceLineNo">3216</span>    put = new Put(row1);<a name="line.3216"></a>
+<span class="sourceLineNo">3217</span>    put.add(kv23);<a name="line.3217"></a>
+<span class="sourceLineNo">3218</span>    put.add(kv13);<a name="line.3218"></a>
+<span class="sourceLineNo">3219</span>    region.put(put);<a name="line.3219"></a>
+<span class="sourceLineNo">3220</span>    region.flush(true);<a name="line.3220"></a>
+<span class="sourceLineNo">3221</span><a name="line.3221"></a>
+<span class="sourceLineNo">3222</span>    put = new Put(row1);<a name="line.3222"></a>
+<span class="sourceLineNo">3223</span>    put.add(kv22);<a name="line.3223"></a>
+<span class="sourceLineNo">3224</span>    put.add(kv12);<a name="line.3224"></a>
+<span class="sourceLineNo">3225</span>    region.put(put);<a name="line.3225"></a>
+<span class="sourceLineNo">3226</span>    region.flush(true);<a name="line.3226"></a>
+<span class="sourceLineNo">3227</span><a name="line.3227"></a>
+<span class="sourceLineNo">3228</span>    put = new Put(row1);<a name="line.3228"></a>
+<span class="sourceLineNo">3229</span>    put.add(kv21);<a name="line.3229"></a>
+<span class="sourceLineNo">3230</span>    put.add(kv11);<a name="line.3230"></a>
+<span class="sourceLineNo">3231</span>    region.put(put);<a name="line.3231"></a>
+<span class="sourceLineNo">3232</span><a name="line.3232"></a>
+<span class="sourceLineNo">3233</span>    // Expected<a name="line.3233"></a>
+<span class="sourceLineNo">3234</span>    List&lt;KeyValue&gt; expected = new ArrayList&lt;&gt;();<a name="line.3234"></a>
+<span class="sourceLineNo">3235</span>    expected.add(kv14);<a name="line.3235"></a>
+<span class="sourceLineNo">3236</span>    expected.add(kv13);<a name="line.3236"></a>
+<span class="sourceLineNo">3237</span>    expected.add(kv12);<a name="line.3237"></a>
+<span class="sourceLineNo">3238</span>    expected.add(kv24);<a name="line.3238"></a>
+<span class="sourceLineNo">3239</span>    expected.add(kv23);<a name="line.3239"></a>
+<span class="sourceLineNo">3240</span>    expected.add(kv22);<a name="line.3240"></a>
+<span class="sourceLineNo">3241</span><a name="line.3241"></a>
+<span class="sourceLineNo">3242</span>    Scan scan = new Scan(row1);<a name="line.3242"></a>
+<span class="sourceLineNo">3243</span>    int versions = 3;<a name="line.3243"></a>
+<span class="sourceLineNo">3244</span>    scan.setMaxVersions(versions);<a name="line.3244"></a>
+<span class="sourceLineNo">3245</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.3245"></a>
+<span class="sourceLineNo">3246</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.3246"></a>
+<span class="sourceLineNo">3247</span><a name="line.3247"></a>
+<span class="sourceLineNo">3248</span>    boolean hasNext = scanner.next(actual);<a name="line.3248"></a>
+<span class="sourceLineNo">3249</span>    assertEquals(false, hasNext);<a name="line.3249"></a>
+<span class="sourceLineNo">3250</span><a name="line.3250"></a>
+<span class="sourceLineNo">3251</span>    // Verify result<a name="line.3251"></a>
+<span class="sourceLineNo">3252</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.3252"></a>
+<span class="sourceLineNo">3253</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected.get(i), actual.get(i)));<a name="line.3253"></a>
+<span class="sourceLineNo">3254</span>    }<a name="line.3254"></a>
+<span class="sourceLineNo">3255</span>  }<a name="line.3255"></a>
+<span class="sourceLineNo">3256</span><a name="line.3256"></a>
+<span class="sourceLineNo">3257</span>  /**<a name="line.3257"></a>
+<span class="sourceLineNo">3258</span>   * Added for HBASE-5416<a name="line.3258"></a>
+<span class="sourceLineNo">3259</span>   *<a name="line.3259"></a>
+<span class="sourceLineNo">3260</span>   * Here we test scan optimization when only subset of CFs are used in filter<a name="line.3260"></a>
+<span class="sourceLineNo">3261</span>   * conditions.<a name="line.3261"></a>
+<span class="sourceLineNo">3262</span>   */<a name="line.3262"></a>
+<span class="sourceLineNo">3263</span>  @Test<a name="line.3263"></a>
+<span class="sourceLineNo">3264</span>  public void testScanner_JoinedScanners() throws IOException {<a name="line.3264"></a>
+<span class="sourceLineNo">3265</span>    byte[] cf_essential = Bytes.toBytes("essential");<a name="line.3265"></a>
+<span class="sourceLineNo">3266</span>    byte[] cf_joined = Bytes.toBytes("joined");<a name="line.3266"></a>
+<span class="sourceLineNo">3267</span>    byte[] cf_alpha = Bytes.toBytes("alpha");<a name="line.3267"></a>
+<span class="sourceLineNo">3268</span>    this.region = initHRegion(tableName, method, CONF, cf_essential, cf_joined, cf_alpha);<a name="line.3268"></a>
+<span class="sourceLineNo">3269</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.3269"></a>
+<span class="sourceLineNo">3270</span>    byte[] row2 = Bytes.toBytes("row2");<a name="line.3270"></a>
+<span class="sourceLineNo">3271</span>    byte[] row3 = Bytes.toBytes("row3");<a name="line.3271"></a>
 <span class="sourceLineNo">3272</span><a name="line.3272"></a>
-<span class="sourceLineNo">3273</span>    put = new Put(row2);<a name="line.3273"></a>
-<span class="sourceLineNo">3274</span>    put.addColumn(cf_essential, col_alpha, Bytes.toBytes(2));<a name="line.3274"></a>
-<span class="sourceLineNo">3275</span>    put.addColumn(cf_joined, col_normal, Bytes.toBytes(2));<a name="line.3275"></a>
-<span class="sourceLineNo">3276</span>    put.addColumn(cf_alpha, col_alpha, Bytes.toBytes(2));<a name="line.3276"></a>
-<span class="sourceLineNo">3277</span>    region.put(put);<a name="line.3277"></a>
-<span class="sourceLineNo">3278</span><a name="line.3278"></a>
-<span class="sourceLineNo">3279</span>    put = new Put(row3);<a name="line.3279"></a>
-<span class="sourceLineNo">3280</span>    put.addColumn(cf_essential, col_normal, filtered_val);<a name="line.3280"></a>
-<span class="sourceLineNo">3281</span>    put.addColumn(cf_joined, col_normal, filtered_val);<a name="line.3281"></a>
-<span class="sourceLineNo">3282</span>    region.put(put);<a name="line.3282"></a>
-<span class="sourceLineNo">3283</span><a name="line.3283"></a>
-<span class="sourceLineNo">3284</span>    // Check two things:<a name="line.3284"></a>
-<span class="sourceLineNo">3285</span>    // 1. result list contains expected values<a name="line.3285"></a>
-<span class="sourceLineNo">3286</span>    // 2. result list is sorted properly<a name="line.3286"></a>
-<span class="sourceLineNo">3287</span><a name="line.3287"></a>
-<span class="sourceLineNo">3288</span>    Scan scan = new Scan();<a name="line.3288"></a>
-<span class="sourceLineNo">3289</span>    Filter filter = new SingleColumnValueExcludeFilter(cf_essential, col_normal,<a name="line.3289"></a>
-<span class="sourceLineNo">3290</span>            CompareOperator.NOT_EQUAL, filtered_val);<a name="line.3290"></a>
-<span class="sourceLineNo">3291</span>    scan.setFilter(filter);<a name="line.3291"></a>
-<span class="sourceLineNo">3292</span>    scan.setLoadColumnFamiliesOnDemand(true);<a name="line.3292"></a>
-<span class="sourceLineNo">3293</span>    InternalScanner s = region.getScanner(scan);<a name="line.3293"></a>
-<span class="sourceLineNo">3294</span><a name="line.3294"></a>
-<span class="sourceLineNo">3295</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.3295"></a>
-<span class="sourceLineNo">3296</span>    assertTrue(s.next(results));<a name="line.3296"></a>
-<span class="sourceLineNo">3297</span>    assertEquals(1, results.size());<a name="line.3297"></a>
-<span class="sourceLineNo">3298</span>    results.clear();<a name="line.3298"></a>
-<span class="sourceLineNo">3299</span><a name="line.3299"></a>
-<span class="sourceLineNo">3300</span>    assertTrue(s.next(results));<a name="line.3300"></a>
-<span class="sourceLineNo">3301</span>    assertEquals(3, results.size());<a name="line.3301"></a>
-<span class="sourceLineNo">3302</span>    assertTrue("orderCheck", CellUtil.matchingFamily(results.get(0), cf_alpha));<a name="line.3302"></a>
-<span class="sourceLineNo">3303</span>    assertTrue("orderCheck", CellUtil.matchingFamily(results.get(1), cf_essential));<a name="line.3303"></a>
-<span class="sourceLineNo">3304</span>    assertTrue("orderCheck", CellUtil.matchingFamily(results.get(2), cf_joined));<a name="line.3304"></a>
-<span class="sourceLineNo">3305</span>    results.clear();<a name="line.3305"></a>
-<span class="sourceLineNo">3306</span><a name="line.3306"></a>
-<span class="sourceLineNo">3307</span>    assertFalse(s.next(results));<a name="line.3307"></a>
-<span class="sourceLineNo">3308</span>    assertEquals(0, results.size());<a name="line.3308"></a>
-<span class="sourceLineNo">3309</span>  }<a name="line.3309"></a>
-<span class="sourceLineNo">3310</span><a name="line.3310"></a>
-<span class="sourceLineNo">3311</span>  /**<a name="line.3311"></a>
-<span class="sourceLineNo">3312</span>   * HBASE-5416<a name="line.3312"></a>
-<span class="sourceLineNo">3313</span>   *<a name="line.3313"></a>
-<span class="sourceLineNo">3314</span>   * Test case when scan limits amount of KVs returned on each next() call.<a name="line.3314"></a>
-<span class="sourceLineNo">3315</span>   */<a name="line.3315"></a>
-<span class="sourceLineNo">3316</span>  @Test<a name="line.3316"></a>
-<span class="sourceLineNo">3317</span>  public void testScanner_JoinedScannersWithLimits() throws IOException {<a name="line.3317"></a>
-<span class="sourceLineNo">3318</span>    final byte[] cf_first = Bytes.toBytes("first");<a name="line.3318"></a>
-<span class="sourceLineNo">3319</span>    final byte[] cf_second = Bytes.toBytes("second");<a name="line.3319"></a>
+<span class="sourceLineNo">3273</span>    byte[] col_normal = Bytes.toBytes("d");<a name="line.3273"></a>
+<span class="sourceLineNo">3274</span>    byte[] col_alpha = Bytes.toBytes("a");<a name="line.3274"></a>
+<span class="sourceLineNo">3275</span><a name="line.3275"></a>
+<span class="sourceLineNo">3276</span>    byte[] filtered_val = Bytes.toBytes(3);<a name="line.3276"></a>
+<span class="sourceLineNo">3277</span><a name="line.3277"></a>
+<span class="sourceLineNo">3278</span>    Put put = new Put(row1);<a name="line.3278"></a>
+<span class="sourceLineNo">3279</span>    put.addColumn(cf_essential, col_normal, Bytes.toBytes(1));<a name="line.3279"></a>
+<span class="sourceLineNo">3280</span>    put.addColumn(cf_joined, col_alpha, Bytes.toBytes(1));<a name="line.3280"></a>
+<span class="sourceLineNo">3281</span>    region.put(put);<a name="line.3281"></a>
+<span class="sourceLineNo">3282</span><a name="line.3282"></a>
+<span class="sourceLineNo">3283</span>    put = new Put(row2);<a name="line.3283"></a>
+<span class="sourceLineNo">3284</span>    put.addColumn(cf_essential, col_alpha, Bytes.toBytes(2));<a name="line.3284"></a>
+<span class="sourceLineNo">3285</span>    put.addColumn(cf_joined, col_normal, Bytes.toBytes(2));<a name="line.3285"></a>
+<span class="sourceLineNo">3286</span>    put.addColumn(cf_alpha, col_alpha, Bytes.toBytes(2));<a name="line.3286"></a>
+<span class="sourceLineNo">3287</span>    region.put(put);<a name="line.3287"></a>
+<span class="sourceLineNo">3288</span><a name="line.3288"></a>
+<span class="sourceLineNo">3289</span>    put = new Put(row3);<a name="line.3289"></a>
+<span class="sourceLineNo">3290</span>    put.addColumn(cf_essential, col_normal, filtered_val);<a name="line.3290"></a>
+<span class="sourceLineNo">3291</span>    put.addColumn(cf_joined, col_normal, filtered_val);<a name="line.3291"></a>
+<span class="sourceLineNo">3292</span>    region.put(put);<a name="line.3292"></a>
+<span class="sourceLineNo">3293</span><a name="line.3293"></a>
+<span class="sourceLineNo">3294</span>    // Check two things:<a name="line.3294"></a>
+<span class="sourceLineNo">3295</span>    // 1. result list contains expected values<a name="line.3295"></a>
+<span class="sourceLineNo">3296</span>    // 2. result list is sorted properly<a name="line.3296"></a>
+<span class="sourceLineNo">3297</span><a name="line.3297"></a>
+<span class="sourceLineNo">3298</span>    Scan scan = new Scan();<a name="line.3298"></a>
+<span class="sourceLineNo">3299</span>    Filter filter = new SingleColumnValueExcludeFilter(cf_essential, col_normal,<a name="line.3299"></a>
+<span class="sourceLineNo">3300</span>            CompareOperator.NOT_EQUAL, filtered_val);<a name="line.3300"></a>
+<span class="sourceLineNo">3301</span>    scan.setFilter(filter);<a name="line.3301"></a>
+<span class="sourceLineNo">3302</span>    scan.setLoadColumnFamiliesOnDemand(true);<a name="line.3302"></a>
+<span class="sourceLineNo">3303</span>    InternalScanner s = region.getScanner(scan);<a name="line.3303"></a>
+<span class="sourceLineNo">3304</span><a name="line.3304"></a>
+<span class="sourceLineNo">3305</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.3305"></a>
+<span class="sourceLineNo">3306</span>    assertTrue(s.next(results));<a name="line.3306"></a>
+<span class="sourceLineNo">3307</span>    assertEquals(1, results.size());<a name="line.3307"></a>
+<span class="sourceLineNo">3308</span>    results.clear();<a name="line.3308"></a>
+<span class="sourceLineNo">3309</span><a name="line.3309"></a>
+<span class="sourceLineNo">3310</span>    assertTrue(s.next(results));<a name="line.3310"></a>
+<span class="sourceLineNo">3311</span>    assertEquals(3, results.size());<a name="line.3311"></a>
+<span class="sourceLineNo">3312</span>    assertTrue("orderCheck", CellUtil.matchingFamily(results.get(0), cf_alpha));<a name="line.3312"></a>
+<span class="sourceLineNo">3313</span>    assertTrue("orderCheck", CellUtil.matchingFamily(results.get(1), cf_essential));<a name="line.3313"></a>
+<span class="sourceLineNo">3314</span>    assertTrue("orderCheck", CellUtil.matchingFamily(results.get(2), cf_joined));<a name="line.3314"></a>
+<span class="sourceLineNo">3315</span>    results.clear();<a name="line.3315"></a>
+<span class="sourceLineNo">3316</span><a name="line.3316"></a>
+<span class="sourceLineNo">3317</span>    assertFalse(s.next(results));<a name="line.3317"></a>
+<span class="sourceLineNo">3318</span>    assertEquals(0, results.size());<a name="line.3318"></a>
+<span class="sourceLineNo">3319</span>  }<a name="line.3319"></a>
 <span class="sourceLineNo">3320</span><a name="line.3320"></a>
-<span class="sourceLineNo">3321</span>    this.region = initHRegion(tableName, method, CONF, cf_first, cf_second);<a name="line.3321"></a>
-<span class="sourceLineNo">3322</span>    final byte[] col_a = Bytes.toBytes("a");<a name="line.3322"></a>
-<span class="sourceLineNo">3323</span>    final byte[] col_b = Bytes.toBytes("b");<a name="line.3323"></a>
-<span class="sourceLineNo">3324</span><a name="line.3324"></a>
-<span class="sourceLineNo">3325</span>    Put put;<a name="line.3325"></a>
-<span class="sourceLineNo">3326</span><a name="line.3326"></a>
-<span class="sourceLineNo">3327</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.3327"></a>
-<span class="sourceLineNo">3328</span>      put = new Put(Bytes.toBytes("r" + Integer.toString(i)));<a name="line.3328"></a>
-<span class="sourceLineNo">3329</span>      put.addColumn(cf_first, col_a, Bytes.toBytes(i));<a name="line.3329"></a>
-<span class="sourceLineNo">3330</span>      if (i &lt; 5) {<a name="line.3330"></a>
-<span class="sourceLineNo">3331</span>        put.addColumn(cf_first, col_b, Bytes.toBytes(i));<a name="line.3331"></a>
-<span class="sourceLineNo">3332</span>        put.addColumn(cf_second, col_a, Bytes.toBytes(i));<a name="line.3332"></a>
-<span class="sourceLineNo">3333</span>        put.addColumn(cf_second, col_b, Bytes.toBytes(i));<a name="line.3333"></a>
-<span class="sourceLineNo">3334</span>      }<a name="line.3334"></a>
-<span class="sourceLineNo">3335</span>      region.put(put);<a name="line.3335"></a>
-<span class="sourceLineNo">3336</span>    }<a name="line.3336"></a>
-<span class="sourceLineNo">3337</span><a name="line.3337"></a>
-<span class="sourceLineNo">3338</span>    Scan scan = new Scan();<a name="line.3338"></a>
-<span class="sourceLineNo">3339</span>    scan.setLoadColumnFamiliesOnDemand(true);<a name="line.3339"></a>
-<span class="sourceLineNo">3340</span>    Filter bogusFilter = new FilterBase() {<a name="line.3340"></a>
-<span class="sourceLineNo">3341</span>      @Override<a name="line.3341"></a>
-<span class="sourceLineNo">3342</span>      public ReturnCode filterCell(final Cell ignored) throws IOException {<a name="line.3342"></a>
-<span class="sourceLineNo">3343</span>        return ReturnCode.INCLUDE;<a name="line.3343"></a>
+<span class="sourceLineNo">3321</span>  /**<a name="line.3321"></a>
+<span class="sourceLineNo">3322</span>   * HBASE-5416<a name="line.3322"></a>
+<span class="sourceLineNo">3323</span>   *<a name="line.3323"></a>
+<span class="sourceLineNo">3324</span>   * Test case when scan limits amount of KVs returned on each next() call.<a name="line.3324"></a>
+<span class="sourceLineNo">3325</span>   */<a name="line.3325"></a>
+<span class="sourceLineNo">3326</span>  @Test<a name="line.3326"></a>
+<span class="sourceLineNo">3327</span>  public void testScanner_JoinedScannersWithLimits() throws IOException {<a name="line.3327"></a>
+<span class="sourceLineNo">3328</span>    final byte[] cf_first = Bytes.toBytes("first");<a name="line.3328"></a>
+<span class="sourceLineNo">3329</span>    final byte[] cf_second = Bytes.toBytes("second");<a name="line.3329"></a>
+<span class="sourceLineNo">3330</span><a name="line.3330"></a>
+<span class="sourceLineNo">3331</span>    this.region = initHRegion(tableName, method, CONF, cf_first, cf_second);<a name="line.3331"></a>
+<span class="sourceLineNo">3332</span>    final byte[] col_a = Bytes.toBytes("a");<a name="line.3332"></a>
+<span class="sourceLineNo">3333</span>    final byte[] col_b = Bytes.toBytes("b");<a name="line.3333"></a>
+<span class="sourceLineNo">3334</span><a name="line.3334"></a>
+<span class="sourceLineNo">3335</span>    Put put;<a name="line.3335"></a>
+<span class="sourceLineNo">3336</span><a name="line.3336"></a>
+<span class="sourceLineNo">3337</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.3337"></a>
+<span class="sourceLineNo">3338</span>      put = new Put(Bytes.toBytes("r" + Integer.toString(i)));<a name="line.3338"></a>
+<span class="sourceLineNo">3339</span>      put.addColumn(cf_first, col_a, Bytes.toBytes(i));<a name="line.3339"></a>
+<span class="sourceLineNo">3340</span>      if (i &lt; 5) {<a name="line.3340"></a>
+<span class="sourceLineNo">3341</span>        put.addColumn(cf_first, col_b, Bytes.toBytes(i));<a name="line.3341"></a>
+<span class="sourceLineNo">3342</span>        put.addColumn(cf_second, col_a, Bytes.toBytes(i));<a name="line.3342"></a>
+<span class="sourceLineNo">3343</span>        put.addColumn(cf_second, col_b, Bytes.toBytes(i));<a name="line.3343"></a>
 <span class="sourceLineNo">3344</span>      }<a name="line.3344"></a>
-<span class="sourceLineNo">3345</span>      @Override<a name="line.3345"></a>
-<span class="sourceLineNo">3346</span>      public boolean isFamilyEssential(byte[] name) {<a name="line.3346"></a>
-<span class="sourceLineNo">3347</span>        return Bytes.equals(name, cf_first);<a name="line.3347"></a>
-<span class="sourceLineNo">3348</span>      }<a name="line.3348"></a>
-<span class="sourceLineNo">3349</span>    };<a name="line.3349"></a>
-<span class="sourceLineNo">3350</span><a name="line.3350"></a>
-<span class="sourceLineNo">3351</span>    scan.setFilter(bogusFilter);<a name="line.3351"></a>
-<span class="sourceLineNo">3352</span>    InternalScanner s = region.getScanner(scan);<a name="line.3352"></a>
-<span class="sourceLineNo">3353</span><a name="line.3353"></a>
-<span class="sourceLineNo">3354</span>    // Our data looks like this:<a name="line.3354"></a>
-<span class="sourceLineNo">3355</span>    // r0: first:a, first:b, second:a, second:b<a name="line.3355"></a>
-<span class="sourceLineNo">3356</span>    // r1: first:a, first:b, second:a, second:b<a name="line.3356"></a>
-<span class="sourceLineNo">3357</span>    // r2: first:a, first:b, second:a, second:b<a name="line.3357"></a>
-<span class="sourceLineNo">3358</span>    // r3: first:a, first:b, second:a, second:b<a name="line.3358"></a>
-<span class="sourceLineNo">3359</span>    // r4: first:a, first:b, second:a, second:b<a name="line.3359"></a>
-<span class="sourceLineNo">3360</span>    // r5: first:a<a name="line.3360"></a>
-<span class="sourceLineNo">3361</span>    // r6: first:a<a name="line.3361"></a>
-<span class="sourceLineNo">3362</span>    // r7: first:a<a name="line.3362"></a>
-<span class="sourceLineNo">3363</span>    // r8: first:a<a name="line.3363"></a>
-<span class="sourceLineNo">3364</span>    // r9: first:a<a name="line.3364"></a>
-<span class="sourceLineNo">3365</span><a name="line.3365"></a>
-<span class="sourceLineNo">3366</span>    // But due to next's limit set to 3, we should get this:<a name="line.3366"></a>
-<span class="sourceLineNo">3367</span>    // r0: first:a, first:b, second:a<a name="line.3367"></a>
-<span class="sourceLineNo">3368</span>    // r0: second:b<a name="line.3368"></a>
-<span class="sourceLineNo">3369</span>    // r1: first:a, first:b, second:a<a name="line.3369"></a>
-<span class="sourceLineNo">3370</span>    // r1: second:b<a name="line.3370"></a>
-<span class="sourceLineNo">3371</span>    // r2: first:a, first:b, second:a<a name="line.3371"></a>
-<span class="sourceLineNo">3372</span>    // r2: second:b<a name="line.3372"></a>
-<span class="sourceLineNo">3373</span>    // r3: first:a, first:b, second:a<a name="line.3373"></a>
-<span class="sourceLineNo">3374</span>    // r3: second:b<a name="line.3374"></a>
-<span class="sourceLineNo">3375</span>    // r4: first:a, first:b, second:a<a name="line.3375"></a>
-<span class="sourceLineNo">3376</span>    // r4: second:b<a name="line.3376"></a>
-<span class="sourceLineNo">3377</span>    // r5: first:a<a name="line.3377"></a>
-<span class="sourceLineNo">3378</span>    // r6: first:a<a name="line.3378"></a>
-<span class="sourceLineNo">3379</span>    // r7: first:a<a name="line.3379"></a>
-<span class="sourceLineNo">3380</span>    // r8: first:a<a name="line.3380"></a>
-<span class="sourceLineNo">3381</span>    // r9: first:a<a name="line.3381"></a>
-<span class="sourceLineNo">3382</span><a name="line.3382"></a>
-<span class="sourceLineNo">3383</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.3383"></a>
-<span class="sourceLineNo">3384</span>    int index = 0;<a name="line.3384"></a>
-<span class="sourceLineNo">3385</span>    ScannerContext scannerContext = ScannerContext.newBuilder().setBatchLimit(3).build();<a name="line.3385"></a>
-<span class="sourceLineNo">3386</span>    while (true) {<a name="line.3386"></a>
-<span class="sourceLineNo">3387</span>      boolean more = s.next(results, scannerContext);<a name="line.3387"></a>
-<span class="sourceLineNo">3388</span>      if ((index &gt;&gt; 1) &lt; 5) {<a name="line.3388"></a>
-<span class="sourceLineNo">3389</span>        if (index % 2 == 0) {<a name="line.3389"></a>
-<span class="sourceLineNo">3390</span>          assertEquals(3, results.size());<a name="line.3390"></a>
-<span class="sourceLineNo">3391</span>        } else {<a name="line.3391"></a>
-<span class="sourceLineNo">3392</span>          assertEquals(1, results.size());<a name="line.3392"></a>
-<span class="sourceLineNo">3393</span>        }<a name="line.3393"></a>
-<span class="sourceLineNo">3394</span>      } else {<a name="line.3394"></a>
-<span class="sourceLineNo">3395</span>        assertEquals(1, results.size());<a name="line.3395"></a>
-<span class="sourceLineNo">3396</span>      }<a name="line.3396"></a>
-<span class="sourceLineNo">3397</span>      results.clear();<a name="line.3397"></a>
-<span class="sourceLineNo">3398</span>      index++;<a name="line.3398"></a>
-<span class="sourceLineNo">3399</span>      if (!more) {<a name="line.3399"></a>
-<span class="sourceLineNo">3400</span>        break;<a name="line.3400"></a>
-<span class="sourceLineNo">3401</span>      }<a name="line.3401"></a>
-<span class="sourceLineNo">3402</span>    }<a name="line.3402"></a>
-<span class="sourceLineNo">3403</span>  }<a name="line.3403"></a>
-<span class="sourceLineNo">3404</span><a name="line.3404"></a>
-<span class="sourceLineNo">3405</span>  /**<a name="line.3405"></a>
-<span class="sourceLineNo">3406</span>   * Write an HFile block full with Cells whose qualifier that are identical between<a name="line.3406"></a>
-<span class="sourceLineNo">3407</span>   * 0 and Short.MAX_VALUE. See HBASE-13329.<a name="line.3407"></a>
-<span class="sourceLineNo">3408</span>   * @throws Exception<a name="line.3408"></a>
-<span class="sourceLineNo">3409</span>   */<a name="line.3409"></a>
-<span class="sourceLineNo">3410</span>  @Test<a name="line.3410"></a>
-<span class="sourceLineNo">3411</span>  public void testLongQualifier() throws Exception {<a name="line.3411"></a>
-<span class="sourceLineNo">3412</span>    byte[] family = Bytes.toBytes("family");<a name="line.3412"></a>
-<span class="sourceLineNo">3413</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.3413"></a>
-<span class="sourceLineNo">3414</span>    byte[] q = new byte[Short.MAX_VALUE+2];<a name="line.3414"></a>
-<span class="sourceLineNo">3415</span>    Arrays.fill(q, 0, q.length-1, (byte)42);<a name="line.3415"></a>
-<span class="sourceLineNo">3416</span>    for (byte i=0; i&lt;10; i++) {<a name="line.3416"></a>
-<span class="sourceLineNo">3417</span>      Put p = new Put(Bytes.toBytes("row"));<a name="line.3417"></a>
-<span class="sourceLineNo">3418</span>      // qualifiers that differ past Short.MAX_VALUE<a name="line.3418"></a>
-<span class="sourceLineNo">3419</span>      q[q.length-1]=i;<a name="line.3419"></a>
-<span class="sourceLineNo">3420</span>      p.addColumn(family, q, q);<a name="line.3420"></a>
-<span class="sourceLineNo">3421</span>      region.put(p);<a name="line.3421"></a>
-<span class="sourceLineNo">3422</span>    }<a name="line.3422"></a>
-<span class="sourceLineNo">3423</span>    region.flush(false);<a name="line.3423"></a>
-<span class="sourceLineNo">3424</span>  }<a name="line.3424"></a>
-<span class="sourceLineNo">3425</span><a name="line.3425"></a>
-<span class="sourceLineNo">3426</span>  /**<a name="line.3426"></a>
-<span class="sourceLineNo">3427</span>   * Flushes the cache in a thread while scanning. The tests verify that the<a name="line.3427"></a>
-<span class="sourceLineNo">3428</span>   * scan is coherent - e.g. the returned results are always of the same or<a name="line.3428"></a>
-<span class="sourceLineNo">3429</span>   * later update as the previous results.<a name="line.3429"></a>
-<span class="sourceLineNo">3430</span>   *<a name="line.3430"></a>
-<span class="sourceLineNo">3431</span>   * @throws IOException<a name="line.3431"></a>
-<span class="sourceLineNo">3432</span>   *           scan / compact<a name="line.3432"></a>
-<span class="sourceLineNo">3433</span>   * @throws InterruptedException<a name="line.3433"></a>
-<span class="sourceLineNo">3434</span>   *           thread join<a name="line.3434"></a>
-<span class="sourceLineNo">3435</span>   */<a name="line.3435"></a>
-<span class="sourceLineNo">3436</span>  @Test<a name="line.3436"></a>
-<span class="sourceLineNo">3437</span>  public void testFlushCacheWhileScanning() throws IOException, InterruptedException {<a name="line.3437"></a>
-<span class="sourceLineNo">3438</span>    byte[] family = Bytes.toBytes("family");<a name="line.3438"></a>
-<span class="sourceLineNo">3439</span>    int numRows = 1000;<a name="line.3439"></a>
-<span class="sourceLineNo">3440</span>    int flushAndScanInterval = 10;<a name="line.3440"></a>
-<span class="sourceLineNo">3441</span>    int compactInterval = 10 * flushAndScanInterval;<a name="line.3441"></a>
-<span class="sourceLineNo">3442</span><a name="line.3442"></a>
-<span class="sourceLineNo">3443</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.3443"></a>
-<span class="sourceLineNo">3444</span>    FlushThread flushThread = new FlushThread();<a name="line.3444"></a>
-<span class="sourceLineNo">3445</span>    try {<a name="line.3445"></a>
-<span class="sourceLineNo">3446</span>      flushThread.start();<a name="line.3446"></a>
-<span class="sourceLineNo">3447</span><a name="line.3447"></a>
-<span class="sourceLineNo">3448</span>      Scan scan = new Scan();<a name="line.3448"></a>
-<span class="sourceLineNo">3449</span>      scan.addFamily(family);<a name="line.3449"></a>
-<span class="sourceLineNo">3450</span>      scan.setFilter(new SingleColumnValueFilter(family, qual1, CompareOperator.EQUAL,<a name="line.3450"></a>
-<span class="sourceLineNo">3451</span>          new BinaryComparator(Bytes.toBytes(5L))));<a name="line.3451"></a>
+<span class="sourceLineNo">3345</span>      region.put(put);<a name="line.3345"></a>
+<span class="sourceLineNo">3346</span>    }<a name="line.3346"></a>
+<span class="sourceLineNo">3347</span><a name="line.3347"></a>
+<span class="sourceLineNo">3348</span>    Scan scan = new Scan();<a name="line.3348"></a>
+<span class="sourceLineNo">3349</span>    scan.setLoadColumnFamiliesOnDemand(true);<a name="line.3349"></a>
+<span class="sourceLineNo">3350</span>    Filter bogusFilter = new FilterBase() {<a name="line.3350"></a>
+<span class="sourceLineNo">3351</span>      @Override<a name="line.3351"></a>
+<span class="sourceLineNo">3352</span>      public ReturnCode filterCell(final Cell ignored) throws IOException {<a name="line.3352"></a>
+<span class="sourceLineNo">3353</span>        return ReturnCode.INCLUDE;<a name="line.3353"></a>
+<span class="sourceLineNo">3354</span>      }<a name="line.3354"></a>
+<span class="sourceLineNo">3355</span>      @Override<a name="line.3355"></a>
+<span class="sourceLineNo">3356</span>      public boolean isFamilyEssential(byte[] name) {<a name="line.3356"></a>
+<span class="sourceLineNo">3357</span>        return Bytes.equals(name, cf_first);<a name="line.3357"></a>
+<span class="sourceLineNo">3358</span>      }<a name="line.3358"></a>
+<span class="sourceLineNo">3359</span>    };<a name="line.3359"></a>
+<span class="sourceLineNo">3360</span><a name="line.3360"></a>
+<span class="sourceLineNo">3361</span>    scan.setFilter(bogusFilter);<a name="line.3361"></a>
+<span class="sourceLineNo">3362</span>    InternalScanner s = region.getScanner(scan);<a name="line.3362"></a>
+<span class="sourceLineNo">3363</span><a name="line.3363"></a>
+<span class="sourceLineNo">3364</span>    // Our data looks like this:<a name="line.3364"></a>
+<span class="sourceLineNo">3365</span>    // r0: first:a, first:b, second:a, second:b<a name="line.3365"></a>
+<span class="sourceLineNo">3366</span>    // r1: first:a, first:b, second:a, second:b<a name="line.3366"></a>
+<span class="sourceLineNo">3367</span>    // r2: first:a, first:b, second:a, second:b<a name="line.3367"></a>
+<span class="sourceLineNo">3368</span>    // r3: first:a, first:b, second:a, second:b<a name="line.3368"></a>
+<span class="sourceLineNo">3369</span>    // r4: first:a, first:b, second:a, second:b<a name="line.3369"></a>
+<span class="sourceLineNo">3370</span>    // r5: first:a<a name="line.3370"></a>
+<span class="sourceLineNo">3371</span>    // r6: first:a<a name="line.3371"></a>
+<span class="sourceLineNo">3372</span>    // r7: first:a<a name="line.3372"></a>
+<span class="sourceLineNo">3373</span>    // r8: first:a<a name="line.3373"></a>
+<span class="sourceLineNo">3374</span>    // r9: first:a<a name="line.3374"></a>
+<span class="sourceLineNo">3375</span><a name="line.3375"></a>
+<span class="sourceLineNo">3376</span>    // But due to next's limit set to 3, we should get this:<a name="line.3376"></a>
+<span class="sourceLineNo">3377</span>    // r0: first:a, first:b, second:a<a name="line.3377"></a>
+<span class="sourceLineNo">3378</span>    // r0: second:b<a name="line.3378"></a>
+<span class="sourceLineNo">3379</span>    // r1: first:a, first:b, second:a<a name="line.3379"></a>
+<span class="sourceLineNo">3380</span>    // r1: second:b<a name="line.3380"></a>
+<span class="sourceLineNo">3381</span>    // r2: first:a, first:b, second:a<a name="line.3381"></a>
+<span class="sourceLineNo">3382</span>    // r2: second:b<a name="line.3382"></a>
+<span class="sourceLineNo">3383</span>    // r3: first:a, first:b, second:a<a name="line.3383"></a>
+<span class="sourceLineNo">3384</span>    // r3: second:b<a name="line.3384"></a>
+<span class="sourceLineNo">3385</span>    // r4: first:a, first:b, second:a<a name="line.3385"></a>
+<span class="sourceLineNo">3386</span>    // r4: second:b<a name="line.3386"></a>
+<span class="sourceLineNo">3387</span>    // r5: first:a<a name="line.3387"></a>
+<span class="sourceLineNo">3388</span>    // r6: first:a<a name="line.3388"></a>
+<span class="sourceLineNo">3389</span>    // r7: first:a<a name="line.3389"></a>
+<span class="sourceLineNo">3390</span>    // r8: first:a<a name="line.3390"></a>
+<span class="sourceLineNo">3391</span>    // r9: first:a<a name="line.3391"></a>
+<span class="sourceLineNo">3392</span><a name="line.3392"></a>
+<span class="sourceLineNo">3393</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.3393"></a>
+<span class="sourceLineNo">3394</span>    int index = 0;<a name="line.3394"></a>
+<span class="sourceLineNo">3395</span>    ScannerContext scannerContext = ScannerContext.newBuilder().setBatchLimit(3).build();<a name="line.3395"></a>
+<span class="sourceLineNo">3396</span>    while (true) {<a name="line.3396"></a>
+<span class="sourceLineNo">3397</span>      boolean more = s.next(results, scannerContext);<a name="line.3397"></a>
+<span class="sourceLineNo">3398</span>      if ((index &gt;&gt; 1) &lt; 5) {<a name="line.3398"></a>
+<span class="sourceLineNo">3399</span>        if (index % 2 == 0) {<a name="line.3399"></a>
+<span class="sourceLineNo">3400</span>          assertEquals(3, results.size());<a name="line.3400"></a>
+<span class="sourceLineNo">3401</span>        } else {<a name="line.3401"></a>
+<span class="sourceLineNo">3402</span>          assertEquals(1, results.size());<a name="line.3402"></a>
+<span class="sourceLineNo">3403</span>        }<a name="line.3403"></a>
+<span class="sourceLineNo">3404</span>      } else {<a name="line.3404"></a>
+<span class="sourceLineNo">3405</span>        assertEquals(1, results.size());<a name="line.3405"></a>
+<span class="sourceLineNo">3406</span>      }<a name="line.3406"></a>
+<span class="sourceLineNo">3407</span>      results.clear();<a name="line.3407"></a>
+<span class="sourceLineNo">3408</span>      index++;<a name="line.3408"></a>
+<span class="sourceLineNo">3409</span>      if (!more) {<a name="line.3409"></a>
+<span class="sourceLineNo">3410</span>        break;<a name="line.3410"></a>
+<span class="sourceLineNo">3411</span>      }<a name="line.3411"></a>
+<span class="sourceLineNo">3412</span>    }<a name="line.3412"></a>
+<span class="sourceLineNo">3413</span>  }<a name="line.3413"></a>
+<span class="sourceLineNo">3414</span><a name="line.3414"></a>
+<span class="sourceLineNo">3415</span>  /**<a name="line.3415"></a>
+<span class="sourceLineNo">3416</span>   * Write an HFile block full with Cells whose qualifier that are identical between<a name="line.3416"></a>
+<span class="sourceLineNo">3417</span>   * 0 and Short.MAX_VALUE. See HBASE-13329.<a name="line.3417"></a>
+<span class="sourceLineNo">3418</span>   * @throws Exception<a name="line.3418"></a>
+<span class="sourceLineNo">3419</span>   */<a name="line.3419"></a>
+<span class="sourceLineNo">3420</span>  @Test<a name="line.3420"></a>
+<span class="sourceLineNo">3421</span>  public void testLongQualifier() throws Exception {<a name="line.3421"></a>
+<span class="sourceLineNo">3422</span>    byte[] family = Bytes.toBytes("family");<a name="line.3422"></a>
+<span class="sourceLineNo">3423</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.3423"></a>
+<span class="sourceLineNo">3424</span>    byte[] q = new byte[Short.MAX_VALUE+2];<a name="line.3424"></a>
+<span class="sourceLineNo">3425</span>    Arrays.fill(q, 0, q.length-1, (byte)42);<a name="line.3425"></a>
+<span class="sourceLineNo">3426</span>    for (byte i=0; i&lt;10; i++) {<a name="line.3426"></a>
+<span class="sourceLineNo">3427</span>      Put p = new Put(Bytes.toBytes("row"));<a name="line.3427"></a>
+<span class="sourceLineNo">3428</span>      // qualifiers that differ past Short.MAX_VALUE<a name="line.3428"></a>
+<span class="sourceLineNo">3429</span>      q[q.length-1]=i;<a name="line.3429"></a>
+<span class="sourceLineNo">3430</span>      p.addColumn(family, q, q);<a name="line.3430"></a>
+<span class="sourceLineNo">3431</span>      region.put(p);<a name="line.3431"></a>
+<span class="sourceLineNo">3432</span>    }<a name="line.3432"></a>
+<span class="sourceLineNo">3433</span>    region.flush(false);<a name="line.3433"></a>
+<span class="sourceLineNo">3434</span>  }<a name="line.3434"></a>
+<span class="sourceLineNo">3435</span><a name="line.3435"></a>
+<span class="sourceLineNo">3436</span>  /**<a name="line.3436"></a>
+<span class="sourceLineNo">3437</span>   * Flushes the cache in a thread while scanning. The tests verify that the<a name="line.3437"></a>
+<span class="sourceLineNo">3438</span>   * scan is coherent - e.g. the returned results are always of the same or<a name="line.3438"></a>
+<span class="sourceLineNo">3439</span>   * later update as the previous results.<a name="line.3439"></a>
+<span class="sourceLineNo">3440</span>   *<a name="line.3440"></a>
+<span class="sourceLineNo">3441</span>   * @throws IOException<a name="line.3441"></a>
+<span class="sourceLineNo">3442</span>   *           scan / compact<a name="line.3442"></a>
+<span class="sourceLineNo">3443</span>   * @throws InterruptedException<a name="line.3443"></a>
+<span class="sourceLineNo">3444</span>   *           thread join<a name="line.3444"></a>
+<span class="sourceLineNo">3445</span>   */<a name="line.3445"></a>
+<span class="sourceLineNo">3446</span>  @Test<a name="line.3446"></a>
+<span class="sourceLineNo">3447</span>  public void testFlushCacheWhileScanning() throws IOException, InterruptedException {<a name="line.3447"></a>
+<span class="sourceLineNo">3448</span>    byte[] family = Bytes.toBytes("family");<a name="line.3448"></a>
+<span class="sourceLineNo">3449</span>    int numRows = 1000;<a name="line.3449"></a>
+<span class="sourceLineNo">3450</span>    int flushAndScanInterval = 10;<a name="line.3450"></a>
+<span class="sourceLineNo">3451</span>    int compactInterval = 10 * flushAndScanInterval;<a name="line.3451"></a>
 <span class="sourceLineNo">3452</span><a name="line.3452"></a>
-<span class="sourceLineNo">3453</span>      int expectedCount = 0;<a name="line.3453"></a>
-<span class="sourceLineNo">3454</span>      List&lt;Cell&gt; res = new ArrayList&lt;&gt;();<a name="line.3454"></a>
-<span class="sourceLineNo">3455</span><a name="line.3455"></a>
-<span class="sourceLineNo">3456</span>      boolean toggle = true;<a name="line.3456"></a>
-<span class="sourceLineNo">3457</span>      for (long i = 0; i &lt; numRows; i++) {<a name="line.3457"></a>
-<span class="sourceLineNo">3458</span>        Put put = new Put(Bytes.toBytes(i));<a name="line.3458"></a>
-<span class="sourceLineNo">3459</span>        put.setDurability(Durability.SKIP_WAL);<a name="line.3459"></a>
-<span class="sourceLineNo">3460</span>        put.addColumn(family, qual1, Bytes.toBytes(i % 10));<a name="line.3460"></a>
-<span class="sourceLineNo">3461</span>        region.put(put);<a name="line.3461"></a>
+<span class="sourceLineNo">3453</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.3453"></a>
+<span class="sourceLineNo">3454</span>    FlushThread flushThread = new FlushThread();<a name="line.3454"></a>
+<span class="sourceLineNo">3455</span>    try {<a name="line.3455"></a>
+<span class="sourceLineNo">3456</span>      flushThread.start();<a name="line.3456"></a>
+<span class="sourceLineNo">3457</span><a name="line.3457"></a>
+<span class="sourceLineNo">3458</span>      Scan scan = new Scan();<a name="line.3458"></a>
+<span class="sourceLineNo">3459</span>      scan.addFamily(family);<a name="line.3459"></a>
+<span class="sourceLineNo">3460</span>      scan.setFilter(new SingleColumnValueFilter(family, qual1, CompareOperator.EQUAL,<a name="line.3460"></a>
+<span class="sourceLineNo">3461</span>          new BinaryComparator(Bytes.toBytes(5L))));<a name="line.3461"></a>
 <span class="sourceLineNo">3462</span><a name="line.3462"></a>
-<span class="sourceLineNo">3463</span>        if (i != 0 &amp;&amp; i % compactInterval == 0) {<a name="line.3463"></a>
-<span class="sourceLineNo">3464</span>          LOG.debug("iteration = " + i+ " ts="+System.currentTimeMillis());<a name="line.3464"></a>
-<span class="sourceLineNo">3465</span>          region.compact(true);<a name="line.3465"></a>
-<span class="sourceLineNo">3466</span>        }<a name="line.3466"></a>
-<span class="sourceLineNo">3467</span><a name="line.3467"></a>
-<span class="sourceLineNo">3468</span>        if (i % 10 == 5L) {<a name="line.3468"></a>
-<span class="sourceLineNo">3469</span>          expectedCount++;<a name="line.3469"></a>
-<span class="sourceLineNo">3470</span>        }<a name="line.3470"></a>
-<span class="sourceLineNo">3471</span><a name="line.3471"></a>
-<span class="sourceLineNo">3472</span>        if (i != 0 &amp;&amp; i % flushAndScanInterval == 0) {<a name="line.3472"></a>
-<span class="sourceLineNo">3473</span>          res.clear();<a name="line.3473"></a>
-<span class="sourceLineNo">3474</span>          InternalScanner scanner = region.getScanner(scan);<a name="line.3474"></a>
-<span class="sourceLineNo">3475</span>          if (toggle) {<a name="line.3475"></a>
-<span class="sourceLineNo">3476</span>            flushThread.flush();<a name="line.3476"></a>
-<span class="sourceLineNo">3477</span>          }<a name="line.3477"></a>
-<span class="sourceLineNo">3478</span>          while (scanner.next(res))<a name="line.3478"></a>
-<span class="sourceLineNo">3479</span>            ;<a name="line.3479"></a>
-<span class="sourceLineNo">3480</span>          if (!toggle) {<a name="line.3480"></a>
-<span class="sourceLineNo">3481</span>            flushThread.flush();<a name="line.3481"></a>
-<span class="sourceLineNo">3482</span>          }<a name="line.3482"></a>
-<span class="sourceLineNo">3483</span>          assertEquals("toggle="+toggle+"i=" + i + " ts="+System.currentTimeMillis(),<a name="line.3483"></a>
-<span class="sourceLineNo">3484</span>              expectedCount, res.size());<a name="line.3484"></a>
-<span class="sourceLineNo">3485</span>          toggle = !toggle;<a name="line.3485"></a>
-<span class="sourceLineNo">3486</span>        }<a name="line.3486"></a>
-<span class="sourceLineNo">3487</span>      }<a name="line.3487"></a>
-<span class="sourceLineNo">3488</span><a name="line.3488"></a>
-<span class="sourceLineNo">3489</span>    } finally {<a name="line.3489"></a>
-<span class="sourceLineNo">3490</span>      try {<a name="line.3490"></a>
-<span class="sourceLineNo">3491</span>        flushThread.done();<a name="line.3491"></a>
-<span class="sourceLineNo">3492</span>        flushThread.join();<a name="line.3492"></a>
-<span class="sourceLineNo">3493</span>        flushThread.checkNoError();<a name="line.3493"></a>
-<span class="sourceLineNo">3494</span>      } catch (InterruptedException ie) {<a name="line.3494"></a>
-<span class="sourceLineNo">3495</span>        LOG.warn("Caught exception when joining with flushThread", ie);<a name="line.3495"></a>
-<span class="sourceLineNo">3496</span>      }<a name="line.3496"></a>
-<span class="sourceLineNo">3497</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.3497"></a>
-<span class="sourceLineNo">3498</span>      this.region = null;<a name="line.3498"></a>
-<span class="sourceLineNo">3499</span>    }<a name="line.3499"></a>
-<span class="sourceLineNo">3500</span>  }<a name="line.3500"></a>
-<span class="sourceLineNo">3501</span><a name="line.3501"></a>
-<span class="sourceLineNo">3502</span>  protected class FlushThread extends Thread {<a name="line.3502"></a>
-<span class="sourceLineNo">3503</span>    private volatile boolean done;<a name="line.3503"></a>
-<span class="sourceLineNo">3504</span>    private Throwable error = null;<a name="line.3504"></a>
-<span class="sourceLineNo">3505</span><a name="line.3505"></a>
-<span class="sourceLineNo">3506</span>    FlushThread() {<a name="line.3506"></a>
-<span class="sourceLineNo">3507</span>      super("FlushThread");<a name="line.3507"></a>
-<span class="sourceLineNo">3508</span>    }<a name="line.3508"></a>
-<span class="sourceLineNo">3509</span><a name="line.3509"></a>
-<span class="sourceLineNo">3510</span>    public void done() {<a name="line.3510"></a>
-<span class="sourceLineNo">3511</span>      done = true;<a name="line.3511"></a>
-<span class="sourceLineNo">3512</span>      synchronized (this) {<a name="line.3512"></a>
-<span class="sourceLineNo">3513</span>        interrupt();<a name="line.3513"></a>
-<span class="sourceLineNo">3514</span>      }<a name="line.3514"></a>
-<span class="sourceLineNo">3515</span>    }<a name="line.3515"></a>
-<span class="sourceLineNo">3516</span><a name="line.3516"></a>
-<span class="sourceLineNo">3517</span>    public void checkNoError() {<a name="line.3517"></a>
-<span class="sourceLineNo">3518</span>      if (error != null) {<a name="line.3518"></a>
-<span class="sourceLineNo">3519</span>        assertNull(error);<a name="line.3519"></a>
-<span class="sourceLineNo">3520</span>      }<a name="line.3520"></a>
-<span class="sourceLineNo">3521</span>    }<a name="line.3521"></a>
-<span class="sourceLineNo">3522</span><a name="line.3522"></a>
-<span class="sourceLineNo">3523</span>    @Override<a name="line.3523"></a>
-<span class="sourceLineNo">3524</span>    public void run() {<a name="line.3524"></a>
-<span class="sourceLineNo">3525</span>      done = false;<a name="line.3525"></a>
-<span class="sourceLineNo">3526</span>      while (!done) {<a name="line.3526"></a>
-<span class="sourceLineNo">3527</span>        synchronized (this) {<a name="line.3527"></a>
-<span class="sourceLineNo">3528</span>          try {<a name="line.3528"></a>
-<span class="sourceLineNo">3529</span>            wait();<a name="line.3529"></a>
-<span class="sourceLineNo">3530</span>          } catch (InterruptedException ignored) {<a name="line.3530"></a>
-<span class="sourceLineNo">3531</span>            if (done) {<a name="line.3531"></a>
-<span class="sourceLineNo">3532</span>              break;<a name="line.3532"></a>
-<span class="sourceLineNo">3533</span>            }<a name="line.3533"></a>
-<span class="sourceLineNo">3534</span>          }<a name="line.3534"></a>
-<span class="sourceLineNo">3535</span>        }<a name="line.3535"></a>
-<span class="sourceLineNo">3536</span>        try {<a name="line.3536"></a>
-<span class="sourceLineNo">3537</span>          region.flush(true);<a name="line.3537"></a>
-<span class="sourceLineNo">3538</span>        } catch (IOException e) {<a name="line.3538"></a>
-<span class="sourceLineNo">3539</span>          if (!done) {<a name="line.3539"></a>
-<span class="sourceLineNo">3540</span>            LOG.error("Error while flushing cache", e);<a name="line.3540"></a>
-<span class="sourceLineNo">3541</span>            error = e;<a name="line.3541"></a>
-<span class="sourceLineNo">3542</span>          }<a name="line.3542"></a>
-<span class="sourceLineNo">3543</span>          break;<a name="line.3543"></a>
-<span class="sourceLineNo">3544</span>        } catch (Throwable t) {<a name="line.3544"></a>
-<span class="sourceLineNo">3545</span>          LOG.error("Uncaught exception", t);<a name="line.3545"></a>
-<span class="sourceLineNo">3546</span>          throw t;<a name="line.3546"></a>
-<span class="sourceLineNo">3547</span>        }<a name="line.3547"></a>
-<span class="sourceLineNo">3548</span>      }<a name="line.3548"></a>
-<span class="sourceLineNo">3549</span>    }<a name="line.3549"></a>
-<span class="sourceLineNo">3550</span><a name="line.3550"></a>
-<span class="sourceLineNo">3551</span>    public void flush() {<a name="line.3551"></a>
-<span class="sourceLineNo">3552</span>      synchronized (this) {<a name="line.3552"></a>
-<span class="sourceLineNo">3553</span>        notify();<a name="line.3553"></a>
-<span class="sourceLineNo">3554</span>      }<a name="line.3554"></a>
-<span class="sourceLineNo">3555</span>    }<a name="line.3555"></a>
-<span class="sourceLineNo">3556</span>  }<a name="line.3556"></a>
-<span class="sourceLineNo">3557</span><a name="line.3557"></a>
-<span class="sourceLineNo">3558</span>  /**<a name="line.3558"></a>
-<span class="sourceLineNo">3559</span>   * Writes very wide records and scans for the latest every time.. Flushes and<a name="line.3559"></a>
-<span class="sourceLineNo">3560</span>   * compacts the region every now and then to keep things realistic.<a name="line.3560"></a>
-<span class="sourceLineNo">3561</span>   *<a name="line.3561"></a>
-<span class="sourceLineNo">3562</span>   * @throws IOException<a name="line.3562"></a>
-<span class="sourceLineNo">3563</span>   *           by flush / scan / compaction<a name="line.3563"></a>
-<span class="sourceLineNo">3564</span>   * @throws InterruptedException<a name="line.3564"></a>
-<span class="sourceLineNo">3565</span>   *           when joining threads<a name="line.3565"></a>
-<span class="sourceLineNo">3566</span>   */<a name="line.3566"></a>
-<span class="sourceLineNo">3567</span>  @Test<a name="line.3567"></a>
-<span class="sourceLineNo">3568</span>  public void testWritesWhileScanning() throws IOException, InterruptedException {<a name="line.3568"></a>
-<span class="sourceLineNo">3569</span>    int testCount = 100;<a name="line.3569"></a>
-<span class="sourceLineNo">3570</span>    int numRows = 1;<a name="line.3570"></a>
-<span class="sourceLineNo">3571</span>    int numFamilies = 10;<a name="line.3571"></a>
-<span class="sourceLineNo">3572</span>    int numQualifiers = 100;<a name="line.3572"></a>
-<span class="sourceLineNo">3573</span>    int flushInterval = 7;<a name="line.3573"></a>
-<span class="sourceLineNo">3574</span>    int compactInterval = 5 * flushInterval;<a name="line.3574"></a>
-<span class="sourceLineNo">3575</span>    byte[][] families = new byte[numFamilies][];<a name="line.3575"></a>
-<span class="sourceLineNo">3576</span>    for (int i = 0; i &lt; numFamilies; i++) {<a name="line.3576"></a>
-<span class="sourceLineNo">3577</span>      families[i] = Bytes.toBytes("family" + i);<a name="line.3577"></a>
-<span class="sourceLineNo">3578</span>    }<a name="line.3578"></a>
-<span class="sourceLineNo">3579</span>    byte[][] qualifiers = new byte[numQualifiers][];<a name="line.3579"></a>
-<span class="sourceLineNo">3580</span>    for (int i = 0; i &lt; numQualifiers; i++) {<a name="line.3580"></a>
-<span class="sourceLineNo">3581</span>      qualifiers[i] = Bytes.toBytes("qual" + i);<a name="line.3581"></a>
-<span class="sourceLineNo">3582</span>    }<a name="line.3582"></a>
-<span class="sourceLineNo">3583</span><a name="line.3583"></a>
-<span class="sourceLineNo">3584</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.3584"></a>
-<span class="sourceLineNo">3585</span>    FlushThread flushThread = new FlushThread();<a name="line.3585"></a>
-<span class="sourceLineNo">3586</span>    PutThread putThread = new PutThread(numRows, families, qualifiers);<a name="line.3586"></a>
-<span class="sourceLineNo">3587</span>    try {<a name="line.3587"></a>
-<span class="sourceLineNo">3588</span>      putThread.start();<a name="line.3588"></a>
-<span class="sourceLineNo">3589</span>      putThread.waitForFirstPut();<a name="line.3589"></a>
-<span class="sourceLineNo">3590</span><a name="line.3590"></a>
-<span class="sourceLineNo">3591</span>      flushThread.start();<a name="line.3591"></a>
-<span class="sourceLineNo">3592</span><a name="line.3592"></a>
-<span class="sourceLineNo">3593</span>      Scan scan = new Scan(Bytes.toBytes("row0"), Bytes.toBytes("row1"));<a name="line.3593"></a>
-<span class="sourceLineNo">3594</span><a name="line.3594"></a>
-<span class="sourceLineNo">3595</span>      int expectedCount = numFamilies * numQualifiers;<a name="line.3595"></a>
-<span class="sourceLineNo">3596</span>      List&lt;Cell&gt; res = new ArrayList&lt;&gt;();<a name="line.3596"></a>
-<span class="sourceLineNo">3597</span><a name="line.3597"></a>
-<span class="sourceLineNo">3598</span>      long prevTimestamp = 0L;<a name="line.3598"></a>
-<span class="sourceLineNo">3599</span>      for (int i = 0; i &lt; testCount; i++) {<a name="line.3599"></a>
+<span class="sourceLineNo">3463</span>      int expectedCount = 0;<a name="line.3463"></a>
+<span class="sourceLineNo">3464</span>      List&lt;Cell&gt; res = new ArrayList&lt;&gt;();<a name="line.3464"></a>
+<span class="sourceLineNo">3465</span><a name="line.3465"></a>
+<span class="sourceLineNo">3466</span>      boolean toggle = true;<a name="line.3466"></a>
+<span class="sourceLineNo">3467</span>      for (long i = 0; i &lt; numRows; i++) {<a name="line.3467"></a>
+<span class="sourceLineNo">3468</span>        Put put = new Put(Bytes.toBytes(i));<a name="line.3468"></a>
+<span class="sourceLineNo">3469</span>        put.setDurability(Durability.SKIP_WAL);<a name="line.3469"></a>
+<span class="sourceLineNo">3470</span>        put.addColumn(family, qual1, Bytes.toBytes(i % 10));<a name="line.3470"></a>
+<span class="sourceLineNo">3471</span>        region.put(put);<a name="line.3471"></a>
+<span class="sourceLineNo">3472</span><a name="line.3472"></a>
+<span class="sourceLineNo">3473</span>        if (i != 0 &amp;&amp; i % compactInterval == 0) {<a name="line.3473"></a>
+<span class="sourceLineNo">3474</span>          LOG.debug("iteration = " + i+ " ts="+System.currentTimeMillis());<a name="line.3474"></a>
+<span class="sourceLineNo">3475</span>          region.compact(true);<a name="line.3475"></a>
+<span class="sourceLineNo">3476</span>        }<a name="line.3476"></a>
+<span class="sourceLineNo">3477</span><a name="line.3477"></a>
+<span class="sourceLineNo">3478</span>        if (i % 10 == 5L) {<a name="line.3478"></a>
+<span class="sourceLineNo">3479</span>          expectedCount++;<a name="line.3479"></a>
+<span class="sourceLineNo">3480</span>        }<a name="line.3480"></a>
+<span class="sourceLineNo">3481</span><a name="line.3481"></a>
+<span class="sourceLineNo">3482</span>        if (i != 0 &amp;&amp; i % flushAndScanInterval == 0) {<a name="line.3482"></a>
+<span class="sourceLineNo">3483</span>          res.clear();<a name="line.3483"></a>
+<span class="sourceLineNo">3484</span>          InternalScanner scanner = region.getScanner(scan);<a name="line.3484"></a>
+<span class="sourceLineNo">3485</span>          if (toggle) {<a name="line.3485"></a>
+<span class="sourceLineNo">3486</span>            flushThread.flush();<a name="line.3486"></a>
+<span class="sourceLineNo">3487</span>          }<a name="line.3487"></a>
+<span class="sourceLineNo">3488</span>          while (scanner.next(res))<a name="line.3488"></a>
+<span class="sourceLineNo">3489</span>            ;<a name="line.3489"></a>
+<span class="sourceLineNo">3490</span>          if (!toggle) {<a name="line.3490"></a>
+<span class="sourceLineNo">3491</span>            flushThread.flush();<a name="line.3491"></a>
+<span class="sourceLineNo">3492</span>          }<a name="line.3492"></a>
+<span class="sourceLineNo">3493</span>          assertEquals("toggle="+toggle+"i=" + i + " ts="+System.currentTimeMillis(),<a name="line.3493"></a>
+<span class="sourceLineNo">3494</span>              expectedCount, res.size());<a name="line.3494"></a>
+<span class="sourceLineNo">3495</span>          toggle = !toggle;<a name="line.3495"></a>
+<span class="sourceLineNo">3496</span>        }<a name="line.3496"></a>
+<span class="sourceLineNo">3497</span>      }<a name="line.3497"></a>
+<span class="sourceLineNo">3498</span><a name="line.3498"></a>
+<span class="sourceLineNo">3499</span>    } finally {<a name="line.3499"></a>
+<span class="sourceLineNo">3500</span>      try {<a name="line.3500"></a>
+<span class="sourceLineNo">3501</span>        flushThread.done();<a name="line.3501"></a>
+<span class="sourceLineNo">3502</span>        flushThread.join();<a name="line.3502"></a>
+<span class="sourceLineNo">3503</span>        flushThread.checkNoError();<a name="line.3503"></a>
+<span class="sourceLineNo">3504</span>      } catch (InterruptedException ie) {<a name="line.3504"></a>
+<span class="sourceLineNo">3505</span>        LOG.warn("Caught exception when joining with flushThread", ie);<a name="line.3505"></a>
+<span class="sourceLineNo">3506</span>      }<a name="line.3506"></a>
+<span class="sourceLineNo">3507</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.3507"></a>
+<span class="sourceLineNo">3508</span>      this.region = null;<a name="line.3508"></a>
+<span class="sourceLineNo">3509</span>    }<a name="line.3509"></a>
+<span class="sourceLineNo">3510</span>  }<a name="line.3510"></a>
+<span class="sourceLineNo">3511</span><a name="line.3511"></a>
+<span class="sourceLineNo">3512</span>  protected class FlushThread extends Thread {<a name="line.3512"></a>
+<span class="sourceLineNo">3513</span>    private volatile boolean done;<a name="line.3513"></a>
+<span class="sourceLineNo">3514</span>    private Throwable error = null;<a name="line.3514"></a>
+<span class="sourceLineNo">3515</span><a name="line.3515"></a>
+<span class="sourceLineNo">3516</span>    FlushThread() {<a name="line.3516"></a>
+<span class="sourceLineNo">3517</span>      super("FlushThread");<a name="line.3517"></a>
+<span class="sourceLineNo">3518</span>    }<a name="line.3518"></a>
+<span class="sourceLineNo">3519</span><a name="line.3519"></a>
+<span class="sourceLineNo">3520</span>    public void done() {<a name="line.3520"></a>
+<span class="sourceLineNo">3521</span>      done = true;<a name="line.3521"></a>
+<span class="sourceLineNo">3522</span>      synchronized (this) {<a name="line.3522"></a>
+<span class="sourceLineNo">3523</span>        interrupt();<a name="line.3523"></a>
+<span class="sourceLineNo">3524</span>      }<a name="line.3524"></a>
+<span class="sourceLineNo">3525</span>    }<a name="line.3525"></a>
+<span class="sourceLineNo">3526</span><a name="line.3526"></a>
+<span class="sourceLineNo">3527</span>    public void checkNoError() {<a name="line.3527"></a>
+<span class="sourceLineNo">3528</span>      if (error != null) {<a name="line.3528"></a>
+<span class="sourceLineNo">3529</span>        assertNull(error);<a name="line.3529"></a>
+<span class="sourceLineNo">3530</span>      }<a name="line.3530"></a>
+<span class="sourceLineNo">3531</span>    }<a name="line.3531"></a>
+<span class="sourceLineNo">3532</span><a name="line.3532"></a>
+<span class="sourceLineNo">3533</span>    @Override<a name="line.3533"></a>
+<span class="sourceLineNo">3534</span>    public void run() {<a name="line.3534"></a>
+<span class="sourceLineNo">3535</span>      done = false;<a name="line.3535"></a>
+<span class="sourceLineNo">3536</span>      while (!done) {<a name="line.3536"></a>
+<span class="sourceLineNo">3537</span>        synchronized (this) {<a name="line.3537"></a>
+<span class="sourceLineNo">3538</span>          try {<a name="line.3538"></a>
+<span class="sourceLineNo">3539</span>            wait();<a name="line.3539"></a>
+<span class="sourceLineNo">3540</span>          } catch (InterruptedException ignored) {<a name="line.3540"></a>
+<span class="sourceLineNo">3541</span>            if (done) {<a name="line.3541"></a>
+<span class="sourceLineNo">3542</span>              break;<a name="line.3542"></a>
+<span class="sourceLineNo">3543</span>            }<a name="line.3543"></a>
+<span class="sourceLineNo">3544</span>          }<a name="line.3544"></a>
+<span class="sourceLineNo">3545</span>        }<a name="line.3545"></a>
+<span class="sourceLineNo">3546</span>        try {<a name="line.3546"></a>
+<span class="sourceLineNo">3547</span>          region.flush(true);<a name="line.3547"></a>
+<span class="sourceLineNo">3548</span>        } catch (IOException e) {<a name="line.3548"></a>
+<span class="sourceLineNo">3549</span>          if (!done) {<a name="line.3549"></a>
+<span class="sourceLineNo">3550</span>            LOG.error("Error while flushing cache", e);<a name="line.3550"></a>
+<span class="sourceLineNo">3551</span>            error = e;<a name="line.3551"></a>
+<span class="sourceLineNo">3552</span>          }<a name="line.3552"></a>
+<span class="sourceLineNo">3553</span>          break;<a name="line.3553"></a>
+<span class="sourceLineNo">3554</span>        } catch (Throwable t) {<a name="line.3554"></a>
+<span class="sourceLineNo">3555</span>          LOG.error("Uncaught exception", t);<a name="line.3555"></a>
+<span class="sourceLineNo">3556</span>          throw t;<a name="line.3556"></a>
+<span class="sourceLineNo">3557</span>        }<a name="line.3557"></a>
+<span class="sourceLineNo">3558</span>      }<a name="line.3558"></a>
+<span class="sourceLineNo">3559</span>    }<a name="line.3559"></a>
+<span class="sourceLineNo">3560</span><a name="line.3560"></a>
+<span class="sourceLineNo">3561</span>    public void flush() {<a name="line.3561"></a>
+<span class="sourceLineNo">3562</span>      synchronized (this) {<a name="line.3562"></a>
+<span class="sourceLineNo">3563</span>        notify();<a name="line.3563"></a>
+<span class="sourceLineNo">3564</span>      }<a name="line.3564"></a>
+<span class="sourceLineNo">3565</span>    }<a name="line.3565"></a>
+<span class="sourceLineNo">3566</span>  }<a name="line.3566"></a>
+<span class="sourceLineNo">3567</span><a name="line.3567"></a>
+<span class="sourceLineNo">3568</span>  /**<a name="line.3568"></a>
+<span class="sourceLineNo">3569</span>   * Writes very wide records and scans for the latest every time.. Flushes and<a name="line.3569"></a>
+<span class="sourceLineNo">3570</span>   * compacts the region every now and then to keep things realistic.<a name="line.3570"></a>
+<span class="sourceLineNo">3571</span>   *<a name="line.3571"></a>
+<span class="sourceLineNo">3572</span>   * @throws IOException<a name="line.3572"></a>
+<span class="sourceLineNo">3573</span>   *           by flush / scan / compaction<a name="line.3573"></a>
+<span class="sourceLineNo">3574</span>   * @throws InterruptedException<a name="line.3574"></a>
+<span class="sourceLineNo">3575</span>   *           when joining threads<a name="line.3575"></a>
+<span class="sourceLineNo">3576</span>   */<a name="line.3576"></a>
+<span class="sourceLineNo">3577</span>  @Test<a name="line.3577"></a>
+<span class="sourceLineNo">3578</span>  public void testWritesWhileScanning() throws IOException, InterruptedException {<a name="line.3578"></a>
+<span class="sourceLineNo">3579</span>    int testCount = 100;<a name="line.3579"></a>
+<span class="sourceLineNo">3580</span>    int numRows = 1;<a name="line.3580"></a>
+<span class="sourceLineNo">3581</span>    int numFamilies = 10;<a name="line.3581"></a>
+<span class="sourceLineNo">3582</span>    int numQualifiers = 100;<a name="line.3582"></a>
+<span class="sourceLineNo">3583</span>    int flushInterval = 7;<a name="line.3583"></a>
+<span class="sourceLineNo">3584</span>    int compactInterval = 5 * flushInterval;<a name="line.3584"></a>
+<span class="sourceLineNo">3585</span>    byte[][] families = new byte[numFamilies][];<a name="line.3585"></a>
+<span class="sourceLineNo">3586</span>    for (int i = 0; i &lt; numFamilies; i++) {<a name="line.3586"></a>
+<span class="sourceLineNo">3587</span>      families[i] = Bytes.toBytes("family" + i);<a name="line.3587"></a>
+<span class="sourceLineNo">3588</span>    }<a name="line.3588"></a>
+<span class="sourceLineNo">3589</span>    byte[][] qualifiers = new byte[numQualifiers][];<a name="line.3589"></a>
+<span class="sourceLineNo">3590</span>    for (int i = 0; i &lt; numQualifiers; i++) {<a name="line.3590"></a>
+<span class="sourceLineNo">3591</span>      qualifiers[i] = Bytes.toBytes("qual" + i);<a name="line.3591"></a>
+<span class="sourceLineNo">3592</span>    }<a name="line.3592"></a>
+<span class="sourceLineNo">3593</span><a name="line.3593"></a>
+<span class="sourceLineNo">3594</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.3594"></a>
+<span class="sourceLineNo">3595</span>    FlushThread flushThread = new FlushThread();<a name="line.3595"></a>
+<span class="sourceLineNo">3596</span>    PutThread putThread = new PutThread(numRows, families, qualifiers);<a name="line.3596"></a>
+<span class="sourceLineNo">3597</span>    try {<a name="line.3597"></a>
+<span class="sourceLineNo">3598</span>      putThread.start();<a name="line.3598"></a>
+<span class="sourceLineNo">3599</span>      putThread.waitForFirstPut();<a name="line.3599"></a>
 <span class="sourceLineNo">3600</span><a name="line.3600"></a>
-<span class="sourceLineNo">3601</span>        if (i != 0 &amp;&amp; i % compactInterval == 0) {<a name="line.3601"></a>
-<span class="sourceLineNo">3602</span>          region.compact(true);<a name="line.3602"></a>
-<span class="sourceLineNo">3603</span>          for (HStore store : region.getStores()) {<a name="line.3603"></a>
-<span class="sourceLineNo">3604</span>            store.closeAndArchiveCompactedFiles();<a name="line.3604"></a>
-<span class="sourceLineNo">3605</span>          }<a name="line.3605"></a>
-<span class="sourceLineNo">3606</span>        }<a name="line.3606"></a>
+<span class="sourceLineNo">3601</span>      flushThread.start();<a name="line.3601"></a>
+<span class="sourceLineNo">3602</span><a name="line.3602"></a>
+<span class="sourceLineNo">3603</span>      Scan scan = new Scan(Bytes.toBytes("row0"), Bytes.toBytes("row1"));<a name="line.3603"></a>
+<span class="sourceLineNo">3604</span><a name="line.3604"></a>
+<span class="sourceLineNo">3605</span>      int expectedCount = numFamilies * numQualifiers;<a name="line.3605"></a>
+<span class="sourceLineNo">3606</span>      List&lt;Cell&gt; res = new ArrayList&lt;&gt;();<a name="line.3606"></a>
 <span class="sourceLineNo">3607</span><a name="line.3607"></a>
-<span class="sourceLineNo">3608</span>        if (i != 0 &amp;&amp; i % flushInterval == 0) {<a name="line.3608"></a>
-<span class="sourceLineNo">3609</span>          flushThread.flush();<a name="line.3609"></a>
-<span class="sourceLineNo">3610</span>        }<a name="line.3610"></a>
-<span class="sourceLineNo">3611</span><a name="line.3611"></a>
-<span class="sourceLineNo">3612</span>        boolean previousEmpty = res.isEmpty();<a name="line.3612"></a>
-<span class="sourceLineNo">3613</span>        res.clear();<a name="line.3613"></a>
-<span class="sourceLineNo">3614</span>        try (InternalScanner scanner = region.getScanner(scan)) {<a name="line.3614"></a>
-<span class="sourceLineNo">3615</span>          boolean moreRows;<a name="line.3615"></a>
-<span class="sourceLineNo">3616</span>          do {<a name="line.3616"></a>
-<span class="sourceLineNo">3617</span>            moreRows = scanner.next(res);<a name="line.3617"></a>
-<span class="sourceLineNo">3618</span>          } while (moreRows);<a name="line.3618"></a>
-<span class="sourceLineNo">3619</span>        }<a name="line.3619"></a>
-<span class="sourceLineNo">3620</span>        if (!res.isEmpty() || !previousEmpty || i &gt; compactInterval) {<a name="line.3620"></a>
-<span class="sourceLineNo">3621</span>          assertEquals("i=" + i, expectedCount, res.size());<a name="line.3621"></a>
-<span class="sourceLineNo">3622</span>          long timestamp = res.get(0).getTimestamp();<a name="line.3622"></a>
-<span class="sourceLineNo">3623</span>          assertTrue("Timestamps were broke: " + timestamp + " prev: " + prevTimestamp,<a name="line.3623"></a>
-<span class="sourceLineNo">3624</span>              timestamp &gt;= prevTimestamp);<a name="line.3624"></a>
-<span class="sourceLineNo">3625</span>          prevTimestamp = timestamp;<a name="line.3625"></a>
-<span class="sourceLineNo">3626</span>        }<a name="line.3626"></a>
-<span class="sourceLineNo">3627</span>      }<a name="line.3627"></a>
-<span class="sourceLineNo">3628</span><a name="line.3628"></a>
-<span class="sourceLineNo">3629</span>      putThread.done();<a name="line.3629"></a>
-<span class="sourceLineNo">3630</span><a name="line.3630"></a>
-<span class="sourceLineNo">3631</span>      region.flush(true);<a name="line.3631"></a>
-<span class="sourceLineNo">3632</span><a name="line.3632"></a>
-<span class="sourceLineNo">3633</span>    } finally {<a name="line.3633"></a>
-<span class="sourceLineNo">3634</span>      try {<a name="line.3634"></a>
-<span class="sourceLineNo">3635</span>        flushThread.done();<a name="line.3635"></a>
-<span class="sourceLineNo">3636</span>        flushThread.join();<a name="line.3636"></a>
-<span class="sourceLineNo">3637</span>        flushThread.checkNoError();<a name="line.3637"></a>
+<span class="sourceLineNo">3608</span>      long prevTimestamp = 0L;<a name="line.3608"></a>
+<span class="sourceLineNo">3609</span>      for (int i = 0; i &lt; testCount; i++) {<a name="line.3609"></a>
+<span class="sourceLineNo">3610</span><a name="line.3610"></a>
+<span class="sourceLineNo">3611</span>        if (i != 0 &amp;&amp; i % compactInterval == 0) {<a name="line.3611"></a>
+<span class="sourceLineNo">3612</span>          region.compact(true);<a name="line.3612"></a>
+<span class="sourceLineNo">3613</span>          for (HStore store : region.getStores()) {<a name="line.3613"></a>
+<span class="sourceLineNo">3614</span>            store.closeAndArchiveCompactedFiles();<a name="line.3614"></a>
+<span class="sourceLineNo">3615</span>          }<a name="line.3615"></a>
+<span class="sourceLineNo">3616</span>        }<a name="line.3616"></a>
+<span class="sourceLineNo">3617</span><a name="line.3617"></a>
+<span class="sourceLineNo">3618</span>        if (i != 0 &amp;&amp; i % flushInterval == 0) {<a name="line.3618"></a>
+<span class="sourceLineNo">3619</span>          flushThread.flush();<a name="line.3619"></a>
+<span class="sourceLineNo">3620</span>        }<a name="line.3620"></a>
+<span class="sourceLineNo">3621</span><a name="line.3621"></a>
+<span class="sourceLineNo">3622</span>        boolean previousEmpty = res.isEmpty();<a name="line.3622"></a>
+<span class="sourceLineNo">3623</span>        res.clear();<a name="line.3623"></a>
+<span class="sourceLineNo">3624</span>        try (InternalScanner scanner = region.getScanner(scan)) {<a name="line.3624"></a>
+<span class="sourceLineNo">3625</span>          boolean moreRows;<a name="line.3625"></a>
+<span class="sourceLineNo">3626</span>          do {<a name="line.3626"></a>
+<span class="sourceLineNo">3627</span>            moreRows = scanner.next(res);<a name="line.3627"></a>
+<span class="sourceLineNo">3628</span>          } while (moreRows);<a name="line.3628"></a>
+<span class="sourceLineNo">3629</span>        }<a name="line.3629"></a>
+<span class="sourceLineNo">3630</span>        if (!res.isEmpty() || !previousEmpty || i &gt; compactInterval) {<a name="line.3630"></a>
+<span class="sourceLineNo">3631</span>          assertEquals("i=" + i, expectedCount, res.size());<a name="line.3631"></a>
+<span class="sourceLineNo">3632</span>          long timestamp = res.get(0).getTimestamp();<a name="line.3632"></a>
+<span class="sourceLineNo">3633</span>          assertTrue("Timestamps were broke: " + timestamp + " prev: " + prevTimestamp,<a name="line.3633"></a>
+<span class="sourceLineNo">3634</span>              timestamp &gt;= prevTimestamp);<a name="line.3634"></a>
+<span class="sourceLineNo">3635</span>          prevTimestamp = timestamp;<a name="line.3635"></a>
+<span class="sourceLineNo">3636</span>        }<a name="line.3636"></a>
+<span class="sourceLineNo">3637</span>      }<a name="line.3637"></a>
 <span class="sourceLineNo">3638</span><a name="line.3638"></a>
-<span class="sourceLineNo">3639</span>        putThread.join();<a name="line.3639"></a>
-<span class="sourceLineNo">3640</span>        putThread.checkNoError();<a name="line.3640"></a>
-<span class="sourceLineNo">3641</span>      } catch (InterruptedException ie) {<a name="line.3641"></a>
-<span class="sourceLineNo">3642</span>        LOG.warn("Caught exception when joining with flushThread", ie);<a name="line.3642"></a>
-<span class="sourceLineNo">3643</span>      }<a name="line.3643"></a>
-<span class="sourceLineNo">3644</span><a name="line.3644"></a>
-<span class="sourceLineNo">3645</span>      try {<a name="line.3645"></a>
-<span class="sourceLineNo">3646</span>          HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.3646"></a>
-<span class="sourceLineNo">3647</span>      } catch (DroppedSnapshotException dse) {<a name="line.3647"></a>
-<span class="sourceLineNo">3648</span>        // We could get this on way out because we interrupt the background flusher and it could<a name="line.3648"></a>
-<span class="sourceLineNo">3649</span>        // fail anywhere causing a DSE over in the background flusher... only it is not properly<a name="line.3649"></a>
-<span class="sourceLineNo">3650</span>        // dealt with so could still be memory hanging out when we get to here -- memory we can't<a name="line.3650"></a>
-<span class="sourceLineNo">3651</span>        // flush because the accounting is 'off' since original DSE.<a name="line.3651"></a>
-<span class="sourceLineNo">3652</span>      }<a name="line.3652"></a>
-<span class="sourceLineNo">3653</span>      this.region = null;<a name="line.3653"></a>
-<span class="sourceLineNo">3654</span>    }<a name="line.3654"></a>
-<span class="sourceLineNo">3655</span>  }<a name="line.3655"></a>
-<span class="sourceLineNo">3656</span><a name="line.3656"></a>
-<span class="sourceLineNo">3657</span>  protected class PutThread extends Thread {<a name="line.3657"></a>
-<span class="sourceLineNo">3658</span>    private volatile boolean done;<a name="line.3658"></a>
-<span class="sourceLineNo">3659</span>    private volatile int numPutsFinished = 0;<a name="line.3659"></a>
-<span class="sourceLineNo">3660</span><a name="line.3660"></a>
-<span class="sourceLineNo">3661</span>    private Throwable error = null;<a name="line.3661"></a>
-<span class="sourceLineNo">3662</span>    private int numRows;<a name="line.3662"></a>
-<span class="sourceLineNo">3663</span>    private byte[][] families;<a name="line.3663"></a>
-<span class="sourceLineNo">3664</span>    private byte[][] qualifiers;<a name="line.3664"></a>
-<span class="sourceLineNo">3665</span><a name="line.3665"></a>
-<span class="sourceLineNo">3666</span>    private PutThread(int numRows, byte[][] families, byte[][] qualifiers) {<a name="line.3666"></a>
-<span class="sourceLineNo">3667</span>      super("PutThread");<a name="line.3667"></a>
-<span class="sourceLineNo">3668</span>      this.numRows = numRows;<a name="line.3668"></a>
-<span class="sourceLineNo">3669</span>      this.families = families;<a name="line.3669"></a>
-<span class="sourceLineNo">3670</span>      this.qualifiers = qualifiers;<a name="line.3670"></a>
-<span class="sourceLineNo">3671</span>    }<a name="line.3671"></a>
-<span class="sourceLineNo">3672</span><a name="line.3672"></a>
-<span class="sourceLineNo">3673</span>    /**<a name="line.3673"></a>
-<span class="sourceLineNo">3674</span>     * Block calling thread until this instance of PutThread has put at least one row.<a name="line.3674"></a>
-<span class="sourceLineNo">3675</span>     */<a name="line.3675"></a>
-<span class="sourceLineNo">3676</span>    public void waitForFirstPut() throws InterruptedException {<a name="line.3676"></a>
-<span class="sourceLineNo">3677</span>      // wait until put thread actually puts some data<a name="line.3677"></a>
-<span class="sourceLineNo">3678</span>      while (isAlive() &amp;&amp; numPutsFinished == 0) {<a name="line.3678"></a>
-<span class="sourceLineNo">3679</span>        checkNoError();<a name="line.3679"></a>
-<span class="sourceLineNo">3680</span>        Thread.sleep(50);<a name="line.3680"></a>
-<span class="sourceLineNo">3681</span>      }<a name="line.3681"></a>
-<span class="sourceLineNo">3682</span>    }<a name="line.3682"></a>
-<span class="sourceLineNo">3683</span><a name="line.3683"></a>
-<span class="sourceLineNo">3684</span>    public void done() {<a name="line.3684"></a>
-<span class="sourceLineNo">3685</span>      done = true;<a name="line.3685"></a>
-<span class="sourceLineNo">3686</span>      synchronized (this) {<a name="line.3686"></a>
-<span class="sourceLineNo">3687</span>        interrupt();<a name="line.3687"></a>
-<span class="sourceLineNo">3688</span>      }<a name="line.3688"></a>
-<span class="sourceLineNo">3689</span>    }<a name="line.3689"></a>
-<span class="sourceLineNo">3690</span><a name="line.3690"></a>
-<span class="sourceLineNo">3691</span>    public void checkNoError() {<a name="line.3691"></a>
-<span class="sourceLineNo">3692</span>      if (error != null) {<a name="line.3692"></a>
-<span class="sourceLineNo">3693</span>        assertNull(error);<a name="line.3693"></a>
-<span class="sourceLineNo">3694</span>      }<a name="line.3694"></a>
-<span class="sourceLineNo">3695</span>    }<a name="line.3695"></a>
-<span class="sourceLineNo">3696</span><a name="line.3696"></a>
-<span class="sourceLineNo">3697</span>    @Override<a name="line.3697"></a>
-<span class="sourceLineNo">3698</span>    public void run() {<a name="line.3698"></a>
-<span class="sourceLineNo">3699</span>      done = false;<a name="line.3699"></a>
-<span class="sourceLineNo">3700</span>      while (!done) {<a name="line.3700"></a>
-<span class="sourceLineNo">3701</span>        try {<a name="line.3701"></a>
-<span class="sourceLineNo">3702</span>          for (int r = 0; r &lt; numRows; r++) {<a name="line.3702"></a>
-<span class="sourceLineNo">3703</span>            byte[] row = Bytes.toBytes("row" + r);<a name="line.3703"></a>
-<span class="sourceLineNo">3704</span>            Put put = new Put(row);<a name="line.3704"></a>
-<span class="sourceLineNo">3705</span>            put.setDurability(Durability.SKIP_WAL);<a name="line.3705"></a>
-<span class="sourceLineNo">3706</span>            byte[] value = Bytes.toBytes(String.valueOf(numPutsFinished));<a name="line.3706"></a>
-<span class="sourceLineNo">3707</span>            for (byte[] family : families) {<a name="line.3707"></a>
-<span class="sourceLineNo">3708</span>              for (byte[] qualifier : qualifiers) {<a name="line.3708"></a>
-<span class="sourceLineNo">3709</span>                put.addColumn(family, qualifier, numPutsFinished, value);<a name="line.3709"></a>
-<span class="sourceLineNo">3710</span>              }<a name="line.3710"></a>
-<span class="sourceLineNo">3711</span>            }<a name="line.3711"></a>
-<span class="sourceLineNo">3712</span>            region.put(put);<a name="line.3712"></a>
-<span class="sourceLineNo">3713</span>            numPutsFinished++;<a name="line.3713"></a>
-<span class="sourceLineNo">3714</span>            if (numPutsFinished &gt; 0 &amp;&amp; numPutsFinished % 47 == 0) {<a name="line.3714"></a>
-<span class="sourceLineNo">3715</span>              LOG.debug("put iteration = {}", numPutsFinished);<a name="line.3715"></a>
-<span class="sourceLineNo">3716</span>              Delete delete = new Delete(row, (long) numPutsFinished - 30);<a name="line.3716"></a>
-<span class="sourceLineNo">3717</span>              region.delete(delete);<a name="line.3717"></a>
-<span class="sourceLineNo">3718</span>            }<a name="line.3718"></a>
-<span class="sourceLineNo">3719</span>            numPutsFinished++;<a name="line.3719"></a>
-<span class="sourceLineNo">3720</span>          }<a name="line.3720"></a>
-<span class="sourceLineNo">3721</span>        } catch (InterruptedIOException e) {<a name="line.3721"></a>
-<span class="sourceLineNo">3722</span>          // This is fine. It means we are done, or didn't get the lock on time<a name="line.3722"></a>
-<span class="sourceLineNo">3723</span>          LOG.info("Interrupted", e);<a name="line.3723"></a>
-<span class="sourceLineNo">3724</span>        } catch (IOException e) {<a name="line.3724"></a>
-<span class="sourceLineNo">3725</span>          LOG.error("Error while putting records", e);<a name="line.3725"></a>
-<span class="sourceLineNo">3726</span>          error = e;<a name="line.3726"></a>
-<span class="sourceLineNo">3727</span>          break;<a name="line.3727"></a>
-<span class="sourceLineNo">3728</span>        }<a name="line.3728"></a>
-<span class="sourceLineNo">3729</span>      }<a name="line.3729"></a>
-<span class="sourceLineNo">3730</span><a name="line.3730"></a>
-<span class="sourceLineNo">3731</span>    }<a name="line.3731"></a>
-<span class="sourceLineNo">3732</span><a name="line.3732"></a>
-<span class="sourceLineNo">3733</span>  }<a name="line.3733"></a>
-<span class="sourceLineNo">3734</span><a name="line.3734"></a>
-<span class="sourceLineNo">3735</span>  /**<a name="line.3735"></a>
-<span class="sourceLineNo">3736</span>   * Writes very wide records and gets the latest row every time.. Flushes and<a name="line.3736"></a>
-<span class="sourceLineNo">3737</span>   * compacts the region aggressivly to catch issues.<a name="line.3737"></a>
-<span class="sourceLineNo">3738</span>   *<a name="line.3738"></a>
-<span class="sourceLineNo">3739</span>   * @throws IOException<a name="line.3739"></a>
-<span class="sourceLineNo">3740</span>   *           by flush / scan / compaction<a name="line.3740"></a>
-<span class="sourceLineNo">3741</span>   * @throws InterruptedException<a name="line.3741"></a>
-<span class="sourceLineNo">3742</span>   *           when joining threads<a name="line.3742"></a>
-<span class="sourceLineNo">3743</span>   */<a name="line.3743"></a>
-<span class="sourceLineNo">3744</span>  @Test<a name="line.3744"></a>
-<span class="sourceLineNo">3745</span>  public void testWritesWhileGetting() throws Exception {<a name="line.3745"></a>
-<span class="sourceLineNo">3746</span>    int testCount = 50;<a name="line.3746"></a>
-<span class="sourceLineNo">3747</span>    int numRows = 1;<a name="line.3747"></a>
-<span class="sourceLineNo">3748</span>    int numFamilies = 10;<a name="line.3748"></a>
-<span class="sourceLineNo">3749</span>    int numQualifiers = 100;<a name="line.3749"></a>
-<span class="sourceLineNo">3750</span>    int compactInterval = 100;<a name="line.3750"></a>
-<span class="sourceLineNo">3751</span>    byte[][] families = new byte[numFamilies][];<a name="line.3751"></a>
-<span class="sourceLineNo">3752</span>    for (int i = 0; i &lt; numFamilies; i++) {<a name="line.3752"></a>
-<span class="sourceLineNo">3753</span>      families[i] = Bytes.toBytes("family" + i);<a name="line.3753"></a>
-<span class="sourceLineNo">3754</span>    }<a name="line.3754"></a>
-<span class="sourceLineNo">3755</span>    byte[][] qualifiers = new byte[numQualifiers][];<a name="line.3755"></a>
-<span class="sourceLineNo">3756</span>    for (int i = 0; i &lt; numQualifiers; i++) {<a name="line.3756"></a>
-<span class="sourceLineNo">3757</span>      qualifiers[i] = Bytes.toBytes("qual" + i);<a name="line.3757"></a>
-<span class="sourceLineNo">3758</span>    }<a name="line.3758"></a>
-<span class="sourceLineNo">3759</span><a name="line.3759"></a>
-<span class="sourceLineNo">3760</span><a name="line.3760"></a>
-<span class="sourceLineNo">3761</span>    // This test flushes constantly and can cause many files to be created,<a name="line.3761"></a>
-<span class="sourceLineNo">3762</span>    // possibly<a name="line.3762"></a>
-<span class="sourceLineNo">3763</span>    // extending over the ulimit. Make sure compactions are aggressive in<a name="line.3763"></a>
-<span class="sourceLineNo">3764</span>    // reducing<a name="line.3764"></a>
-<span class="sourceLineNo">3765</span>    // the number of HFiles created.<a name="line.3765"></a>
-<span class="sourceLineNo">3766</span>    Configuration conf = HBaseConfiguration.create(CONF);<a name="line.3766"></a>
-<span class="sourceLineNo">3767</span>    conf.setInt("hbase.hstore.compaction.min", 1);<a name="line.3767"></a>
-<span class="sourceLineNo">3768</span>    conf.setInt("hbase.hstore.compaction.max", 1000);<a name="line.3768"></a>
-<span class="sourceLineNo">3769</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.3769"></a>
-<span class="sourceLineNo">3770</span>    PutThread putThread = null;<a name="line.3770"></a>
-<span class="sourceLineNo">3771</span>    MultithreadedTestUtil.TestContext ctx = new MultithreadedTestUtil.TestContext(conf);<a name="line.3771"></a>
-<span class="sourceLineNo">3772</span>    try {<a name="line.3772"></a>
-<span class="sourceLineNo">3773</span>      putThread = new PutThread(numRows, families, qualifiers);<a name="line.3773"></a>
-<span class="sourceLineNo">3774</span>      putThread.start();<a name="line.3774"></a>
-<span class="sourceLineNo">3775</span>      putThread.waitForFirstPut();<a name="line.3775"></a>
-<span class="sourceLineNo">3776</span><a name="line.3776"></a>
-<span class="sourceLineNo">3777</span>      // Add a thread that flushes as fast as possible<a name="line.3777"></a>
-<span class="sourceLineNo">3778</span>      ctx.addThread(new RepeatingTestThread(ctx) {<a name="line.3778"></a>
-<span class="sourceLineNo">3779</span><a name="line.3779"></a>
-<span class="sourceLineNo">3780</span>        @Override<a name="line.3780"></a>
-<span class="sourceLineNo">3781</span>        public void doAnAction() throws Exception {<a name="line.3781"></a>
-<span class="sourceLineNo">3782</span>          region.flush(true);<a name="line.3782"></a>
-<span class="sourceLineNo">3783</span>          // Compact regularly to avoid creating too many files and exceeding<a name="line.3783"></a>
-<span class="sourceLineNo">3784</span>          // the ulimit.<a name="line.3784"></a>
-<span class="sourceLineNo">3785</span>          region.compact(false);<a name="line.3785"></a>
-<span class="sourceLineNo">3786</span>          for (HStore store : region.getStores()) {<a name="line.3786"></a>
-<span class="sourceLineNo">3787</span>            store.closeAndArchiveCompactedFiles();<a name="line.3787"></a>
-<span class="sourceLineNo">3788</span>          }<a name="line.3788"></a>
-<span class="sourceLineNo">3789</span>        }<a name="line.3789"></a>
-<span class="sourceLineNo">3790</span>      });<a name="line.3790"></a>
-<span class="sourceLineNo">3791</span>      ctx.startThreads();<a name="line.3791"></a>
-<span class="sourceLineNo">3792</span><a name="line.3792"></a>
-<span class="sourceLineNo">3793</span>      Get get = new Get(Bytes.toBytes("row0"));<a name="line.3793"></a>
-<span class="sourceLineNo">3794</span>      Result result = null;<a name="line.3794"></a>
-<span class="sourceLineNo">3795</span><a name="line.3795"></a>
-<span class="sourceLineNo">3796</span>      int expectedCount = numFamilies * numQualifiers;<a name="line.3796"></a>
-<span class="sourceLineNo">3797</span><a name="line.3797"></a>
-<span class="sourceLineNo">3798</span>      long prevTimestamp = 0L;<a name="line.3798"></a>
-<span class="sourceLineNo">3799</span>      for (int i = 0; i &lt; testCount; i++) {<a name="line.3799"></a>
-<span class="sourceLineNo">3800</span>        LOG.info("testWritesWhileGetting verify turn " + i);<a name="line.3800"></a>
-<span class="sourceLineNo">3801</span>        boolean previousEmpty = result == null || result.isEmpty();<a name="line.3801"></a>
-<span class="sourceLineNo">3802</span>        result = region.get(get);<a name="line.3802"></a>
-<span class="sourceLineNo">3803</span>        if (!result.isEmpty() || !previousEmpty || i &gt; compactInterval) {<a name="line.3803"></a>
-<span class="sourceLineNo">3804</span>          assertEquals("i=" + i, expectedCount, result.size());<a name="line.3804"></a>
-<span class="sourceLineNo">3805</span>          // TODO this was removed, now what dangit?!<a name="line.3805"></a>
-<span class="sourceLineNo">3806</span>          // search looking for the qualifier in question?<a name="line.3806"></a>
-<span class="sourceLineNo">3807</span>          long timestamp = 0;<a name="line.3807"></a>
-<span class="sourceLineNo">3808</span>          for (Cell kv : result.rawCells()) {<a name="line.3808"></a>
-<span class="sourceLineNo">3809</span>            if (CellUtil.matchingFamily(kv, families[0])<a name="line.3809"></a>
-<span class="sourceLineNo">3810</span>                &amp;&amp; CellUtil.matchingQualifier(kv, qualifiers[0])) {<a name="line.3810"></a>
-<span class="sourceLineNo">3811</span>              timestamp = kv.getTimestamp();<a name="line.3811"></a>
-<span class="sourceLineNo">3812</span>            }<a name="line.3812"></a>
-<span class="sourceLineNo">3813</span>          }<a name="line.3813"></a>
-<span class="sourceLineNo">3814</span>          assertTrue(timestamp &gt;= prevTimestamp);<a name="line.3814"></a>
-<span class="sourceLineNo">3815</span>          prevTimestamp = timestamp;<a name="line.3815"></a>
-<span class="sourceLineNo">3816</span>          Cell previousKV = null;<a name="line.3816"></a>
-<span class="sourceLineNo">3817</span><a name="line.3817"></a>
+<span class="sourceLineNo">3639</span>      putThread.done();<a name="line.3639"></a>
+<span class="sourceLineNo">3640</span><a name="line.3640"></a>
+<span class="sourceLineNo">3641</span>      region.flush(true);<a name="line.3641"></a>
+<span class="sourceLineNo">3642</span><a name="line.3642"></a>
+<span class="sourceLineNo">3643</span>    } finally {<a name="line.3643"></a>
+<span class="sourceLineNo">3644</span>      try {<a name="line.3644"></a>
+<span class="sourceLineNo">3645</span>        flushThread.done();<a name="line.3645"></a>
+<span class="sourceLineNo">3646</span>        flushThread.join();<a name="line.3646"></a>
+<span class="sourceLineNo">3647</span>        flushThread.checkNoError();<a name="line.3647"></a>
+<span class="sourceLineNo">3648</span><a name="line.3648"></a>
+<span class="sourceLineNo">3649</span>        putThread.join();<a name="line.3649"></a>
+<span class="sourceLineNo">3650</span>        putThread.checkNoError();<a name="line.3650"></a>
+<span class="sourceLineNo">3651</span>      } catch (InterruptedException ie) {<a name="line.3651"></a>
+<span class="sourceLineNo">3652</span>        LOG.warn("Caught exception when joining with flushThread", ie);<a name="line.3652"></a>
+<span class="sourceLineNo">3653</span>      }<a name="line.3653"></a>
+<span class="sourceLineNo">3654</span><a name="line.3654"></a>
+<span class="sourceLineNo">3655</span>      try {<a name="line.3655"></a>
+<span class="sourceLineNo">3656</span>          HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.3656"></a>
+<span class="sourceLineNo">3657</span>      } catch (DroppedSnapshotException dse) {<a name="line.3657"></a>
+<span class="sourceLineNo">3658</span>        // We could get this on way out because we interrupt the background flusher and it could<a name="line.3658"></a>
+<span class="sourceLineNo">3659</span>        // fail anywhere causing a DSE over in the background flusher... only it is not properly<a name="line.3659"></a>
+<span class="sourceLineNo">3660</span>        // dealt with so could still be memory hanging out when we get to here -- memory we can't<a name="line.3660"></a>
+<span class="sourceLineNo">3661</span>        // flush because the accounting is 'off' since original DSE.<a name="line.3661"></a>
+<span class="sourceLineNo">3662</span>      }<a name="line.3662"></a>
+<span class="sourceLineNo">3663</span>      this.region = null;<a name="line.3663"></a>
+<span class="sourceLineNo">3664</span>    }<a name="line.3664"></a>
+<span class="sourceLineNo">3665</span>  }<a name="line.3665"></a>
+<span class="sourceLineNo">3666</span><a name="line.3666"></a>
+<span class="sourceLineNo">3667</span>  protected class PutThread extends Thread {<a name="line.3667"></a>
+<span class="sourceLineNo">3668</span>    private volatile boolean done;<a name="line.3668"></a>
+<span class="sourceLineNo">3669</span>    private volatile int numPutsFinished = 0;<a name="line.3669"></a>
+<span class="sourceLineNo">3670</span><a name="line.3670"></a>
+<span class="sourceLineNo">3671</span>    private Throwable error = null;<a name="line.3671"></a>
+<span class="sourceLineNo">3672</span>    private int numRows;<a name="line.3672"></a>
+<span class="sourceLineNo">3673</span>    private byte[][] families;<a name="line.3673"></a>
+<span class="sourceLineNo">3674</span>    private byte[][] qualifiers;<a name="line.3674"></a>
+<span class="sourceLineNo">3675</span><a name="line.3675"></a>
+<span class="sourceLineNo">3676</span>    private PutThread(int numRows, byte[][] families, byte[][] qualifiers) {<a name="line.3676"></a>
+<span class="sourceLineNo">3677</span>      super("PutThread");<a name="line.3677"></a>
+<span class="sourceLineNo">3678</span>      this.numRows = numRows;<a name="line.3678"></a>
+<span class="sourceLineNo">3679</span>      this.families = families;<a name="line.3679"></a>
+<span class="sourceLineNo">3680</span>      this.qualifiers = qualifiers;<a name="line.3680"></a>
+<span class="sourceLineNo">3681</span>    }<a name="line.3681"></a>
+<span class="sourceLineNo">3682</span><a name="line.3682"></a>
+<span class="sourceLineNo">3683</span>    /**<a name="line.3683"></a>
+<span class="sourceLineNo">3684</span>     * Block calling thread until this instance of PutThread has put at least one row.<a name="line.3684"></a>
+<span class="sourceLineNo">3685</span>     */<a name="line.3685"></a>
+<span class="sourceLineNo">3686</span>    public void waitForFirstPut() throws InterruptedException {<a name="line.3686"></a>
+<span class="sourceLineNo">3687</span>      // wait until put thread actually puts some data<a name="line.3687"></a>
+<span class="sourceLineNo">3688</span>      while (isAlive() &amp;&amp; numPutsFinished == 0) {<a name="line.3688"></a>
+<span class="sourceLineNo">3689</span>        checkNoError();<a name="line.3689"></a>
+<span class="sourceLineNo">3690</span>        Thread.sleep(50);<a name="line.3690"></a>
+<span class="sourceLineNo">3691</span>      }<a name="line.3691"></a>
+<span class="sourceLineNo">3692</span>    }<a name="line.3692"></a>
+<span class="sourceLineNo">3693</span><a name="line.3693"></a>
+<span class="sourceLineNo">3694</span>    public void done() {<a name="line.3694"></a>
+<span class="sourceLineNo">3695</span>      done = true;<a name="line.3695"></a>
+<span class="sourceLineNo">3696</span>      synchronized (this) {<a name="line.3696"></a>
+<span class="sourceLineNo">3697</span>        interrupt();<a name="line.3697"></a>
+<span class="sourceLineNo">3698</span>      }<a name="line.3698"></a>
+<span class="sourceLineNo">3699</span>    }<a name="line.3699"></a>
+<span class="sourceLineNo">3700</span><a name="line.3700"></a>
+<span class="sourceLineNo">3701</span>    public void checkNoError() {<a name="line.3701"></a>
+<span class="sourceLineNo">3702</span>      if (error != null) {<a name="line.3702"></a>
+<span class="sourceLineNo">3703</span>        assertNull(error);<a name="line.3703"></a>
+<span class="sourceLineNo">3704</span>      }<a name="line.3704"></a>
+<span class="sourceLineNo">3705</span>    }<a name="line.3705"></a>
+<span class="sourceLineNo">3706</span><a name="line.3706"></a>
+<span class="sourceLineNo">3707</span>    @Override<a name="line.3707"></a>
+<span class="sourceLineNo">3708</span>    public void run() {<a name="line.3708"></a>
+<span class="sourceLineNo">3709</span>      done = false;<a name="line.3709"></a>
+<span class="sourceLineNo">3710</span>      while (!done) {<a name="line.3710"></a>
+<span class="sourceLineNo">3711</span>        try {<a name="line.3711"></a>
+<span class="sourceLineNo">3712</span>          for (int r = 0; r &lt; numRows; r++) {<a name="line.3712"></a>
+<span class="sourceLineNo">3713</span>            byte[] row = Bytes.toBytes("row" + r);<a name="line.3713"></a>
+<span class="sourceLineNo">3714</span>            Put put = new Put(row);<a name="line.3714"></a>
+<span class="sourceLineNo">3715</span>            put.setDurability(Durability.SKIP_WAL);<a name="line.3715"></a>
+<span class="sourceLineNo">3716</span>            byte[] value = Bytes.toBytes(String.valueOf(numPutsFinished));<a name="line.3716"></a>
+<span class="sourceLineNo">3717</span>            for (byte[] family : families) {<a name="line.3717"></a>
+<span class="sourceLineNo">3718</span>              for (byte[] qualifier : qualifiers) {<a name="line.3718"></a>
+<span class="sourceLineNo">3719</span>                put.addColumn(family, qualifier, numPutsFinished, value);<a name="line.3719"></a>
+<span class="sourceLineNo">3720</span>              }<a name="line.3720"></a>
+<span class="sourceLineNo">3721</span>            }<a name="line.3721"></a>
+<span class="sourceLineNo">3722</span>            region.put(put);<a name="line.3722"></a>
+<span class="sourceLineNo">3723</span>            numPutsFinished++;<a name="line.3723"></a>
+<span class="sourceLineNo">3724</span>            if (numPutsFinished &gt; 0 &amp;&amp; numPutsFinished % 47 == 0) {<a name="line.3724"></a>
+<span class="sourceLineNo">3725</span>              LOG.debug("put iteration = {}", numPutsFinished);<a name="line.3725"></a>
+<span class="sourceLineNo">3726</span>              Delete delete = new Delete(row, (long) numPutsFinished - 30);<a name="line.3726"></a>
+<span class="sourceLineNo">3727</span>              region.delete(delete);<a name="line.3727"></a>
+<span class="sourceLineNo">3728</span>            }<a name="line.3728"></a>
+<span class="sourceLineNo">3729</span>            numPutsFinished++;<a name="line.3729"></a>
+<span class="sourceLineNo">3730</span>          }<a name="line.3730"></a>
+<span class="sourceLineNo">3731</span>        } catch (InterruptedIOException e) {<a name="line.3731"></a>
+<span class="sourceLineNo">3732</span>          // This is fine. It means we are done, or didn't get the lock on time<a name="line.3732"></a>
+<span class="sourceLineNo">3733</span>          LOG.info("Interrupted", e);<a name="line.3733"></a>
+<span class="sourceLineNo">3734</span>        } catch (IOException e) {<a name="line.3734"></a>
+<span class="sourceLineNo">3735</span>          LOG.error("Error while putting records", e);<a name="line.3735"></a>
+<span class="sourceLineNo">3736</span>          error = e;<a name="line.3736"></a>
+<span class="sourceLineNo">3737</span>          break;<a name="line.3737"></a>
+<span class="sourceLineNo">3738</span>        }<a name="line.3738"></a>
+<span class="sourceLineNo">3739</span>      }<a name="line.3739"></a>
+<span class="sourceLineNo">3740</span><a name="line.3740"></a>
+<span class="sourceLineNo">3741</span>    }<a name="line.3741"></a>
+<span class="sourceLineNo">3742</span><a name="line.3742"></a>
+<span class="sourceLineNo">3743</span>  }<a name="line.3743"></a>
+<span class="sourceLineNo">3744</span><a name="line.3744"></a>
+<span class="sourceLineNo">3745</span>  /**<a name="line.3745"></a>
+<span class="sourceLineNo">3746</span>   * Writes very wide records and gets the latest row every time.. Flushes and<a name="line.3746"></a>
+<span class="sourceLineNo">3747</span>   * compacts the region aggressivly to catch issues.<a name="line.3747"></a>
+<span class="sourceLineNo">3748</span>   *<a name="line.3748"></a>
+<span class="sourceLineNo">3749</span>   * @throws IOException<a name="line.3749"></a>
+<span class="sourceLineNo">3750</span>   *           by flush / scan / compaction<a name="line.3750"></a>
+<span class="sourceLineNo">3751</span>   * @throws InterruptedException<a name="line.3751"></a>
+<span class="sourceLineNo">3752</span>   *           when joining threads<a name="line.3752"></a>
+<span class="sourceLineNo">3753</span>   */<a name="line.3753"></a>
+<span class="sourceLineNo">3754</span>  @Test<a name="line.3754"></a>
+<span class="sourceLineNo">3755</span>  public void testWritesWhileGetting() throws Exception {<a name="line.3755"></a>
+<span class="sourceLineNo">3756</span>    int testCount = 50;<a name="line.3756"></a>
+<span class="sourceLineNo">3757</span>    int numRows = 1;<a name="line.3757"></a>
+<span class="sourceLineNo">3758</span>    int numFamilies = 10;<a name="line.3758"></a>
+<span class="sourceLineNo">3759</span>    int numQualifiers = 100;<a name="line.3759"></a>
+<span class="sourceLineNo">3760</span>    int compactInterval = 100;<a name="line.3760"></a>
+<span class="sourceLineNo">3761</span>    byte[][] families = new byte[numFamilies][];<a name="line.3761"></a>
+<span class="sourceLineNo">3762</span>    for (int i = 0; i &lt; numFamilies; i++) {<a name="line.3762"></a>
+<span class="sourceLineNo">3763</span>      families[i] = Bytes.toBytes("family" + i);<a name="line.3763"></a>
+<span class="sourceLineNo">3764</span>    }<a name="line.3764"></a>
+<span class="sourceLineNo">3765</span>    byte[][] qualifiers = new byte[numQualifiers][];<a name="line.3765"></a>
+<span class="sourceLineNo">3766</span>    for (int i = 0; i &lt; numQualifiers; i++) {<a name="line.3766"></a>
+<span class="sourceLineNo">3767</span>      qualifiers[i] = Bytes.toBytes("qual" + i);<a name="line.3767"></a>
+<span class="sourceLineNo">3768</span>    }<a name="line.3768"></a>
+<span class="sourceLineNo">3769</span><a name="line.3769"></a>
+<span class="sourceLineNo">3770</span><a name="line.3770"></a>
+<span class="sourceLineNo">3771</span>    // This test flushes constantly and can cause many files to be created,<a name="line.3771"></a>
+<span class="sourceLineNo">3772</span>    // possibly<a name="line.3772"></a>
+<span class="sourceLineNo">3773</span>    // extending over the ulimit. Make sure compactions are aggressive in<a name="line.3773"></a>
+<span class="sourceLineNo">3774</span>    // reducing<a name="line.3774"></a>
+<span class="sourceLineNo">3775</span>    // the number of HFiles created.<a name="line.3775"></a>
+<span class="sourceLineNo">3776</span>    Configuration conf = HBaseConfiguration.create(CONF);<a name="line.3776"></a>
+<span class="sourceLineNo">3777</span>    conf.setInt("hbase.hstore.compaction.min", 1);<a name="line.3777"></a>
+<span class="sourceLineNo">3778</span>    conf.setInt("hbase.hstore.compaction.max", 1000);<a name="line.3778"></a>
+<span class="sourceLineNo">3779</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.3779"></a>
+<span class="sourceLineNo">3780</span>    PutThread putThread = null;<a name="line.3780"></a>
+<span class="sourceLineNo">3781</span>    MultithreadedTestUtil.TestContext ctx = new MultithreadedTestUtil.TestContext(conf);<a name="line.3781"></a>
+<span class="sourceLineNo">3782</span>    try {<a name="line.3782"></a>
+<span class="sourceLineNo">3783</span>      putThread = new PutThread(numRows, families, qualifiers);<a name="line.3783"></a>
+<span class="sourceLineNo">3784</span>      putThread.start();<a name="line.3784"></a>
+<span class="sourceLineNo">3785</span>      putThread.waitForFirstPut();<a name="line.3785"></a>
+<span class="sourceLineNo">3786</span><a name="line.3786"></a>
+<span class="sourceLineNo">3787</span>      // Add a thread that flushes as fast as possible<a name="line.3787"></a>
+<span class="sourceLineNo">3788</span>      ctx.addThread(new RepeatingTestThread(ctx) {<a name="line.3788"></a>
+<span class="sourceLineNo">3789</span><a name="line.3789"></a>
+<span class="sourceLineNo">3790</span>        @Override<a name="line.3790"></a>
+<span class="sourceLineNo">3791</span>        public void doAnAction() throws Exception {<a name="line.3791"></a>
+<span class="sourceLineNo">3792</span>          region.flush(true);<a name="line.3792"></a>
+<span class="sourceLineNo">3793</span>          // Compact regularly to avoid creating too many files and exceeding<a name="line.3793"></a>
+<span class="sourceLineNo">3794</span>          // the ulimit.<a name="line.3794"></a>
+<span class="sourceLineNo">3795</span>          region.compact(false);<a name="line.3795"></a>
+<span class="sourceLineNo">3796</span>          for (HStore store : region.getStores()) {<a name="line.3796"></a>
+<span class="sourceLineNo">3797</span>            store.closeAndArchiveCompactedFiles();<a name="line.3797"></a>
+<span class="sourceLineNo">3798</span>          }<a name="line.3798"></a>
+<span class="sourceLineNo">3799</span>        }<a name="line.3799"></a>
+<span class="sourceLineNo">3800</span>      });<a name="line.3800"></a>
+<span class="sourceLineNo">3801</span>      ctx.startThreads();<a name="line.3801"></a>
+<span class="sourceLineNo">3802</span><a name="line.3802"></a>
+<span class="sourceLineNo">3803</span>      Get get = new Get(Bytes.toBytes("row0"));<a name="line.3803"></a>
+<span class="sourceLineNo">3804</span>      Result result = null;<a name="line.3804"></a>
+<span class="sourceLineNo">3805</span><a name="line.3805"></a>
+<span class="sourceLineNo">3806</span>      int expectedCount = numFamilies * numQualifiers;<a name="line.3806"></a>
+<span class="sourceLineNo">3807</span><a name="line.3807"></a>
+<span class="sourceLineNo">3808</span>      long prevTimestamp = 0L;<a name="line.3808"></a>
+<span class="sourceLineNo">3809</span>      for (int i = 0; i &lt; testCount; i++) {<a name="line.3809"></a>
+<span class="sourceLineNo">3810</span>        LOG.info("testWritesWhileGetting verify turn " + i);<a name="line.3810"></a>
+<span class="sourceLineNo">3811</span>        boolean previousEmpty = result == null || result.isEmpty();<a name="line.3811"></a>
+<span class="sourceLineNo">3812</span>        result = region.get(get);<a name="line.3812"></a>
+<span class="sourceLineNo">3813</span>        if (!result.isEmpty() || !previousEmpty || i &gt; compactInterval) {<a name="line.3813"></a>
+<span class="sourceLineNo">3814</span>          assertEquals("i=" + i, expectedCount, result.size());<a name="line.3814"></a>
+<span class="sourceLineNo">3815</span>          // TODO this was removed, now what dangit?!<a name="line.3815"></a>
+<span class="sourceLineNo">3816</span>          // search looking for the qualifier in question?<a name="line.3816"></a>
+<span class="sourceLineNo">3817</span>          long timestamp = 0;<a name="line.3817"></a>
 <span class="sourceLineNo">3818</span>          for (Cell kv : result.rawCells()) {<a name="line.3818"></a>
-<span class="sourceLineNo">3819</span>            byte[] thisValue = CellUtil.cloneValue(kv);<a name="line.3819"></a>
-<span class="sourceLineNo">3820</span>            if (previousKV != null) {<a name="line.3820"></a>
-<span class="sourceLineNo">3821</span>              if (Bytes.compareTo(CellUtil.cloneValue(previousKV), thisValue) != 0) {<a name="line.3821"></a>
-<span class="sourceLineNo">3822</span>                LOG.warn("These two KV should have the same value." + " Previous KV:" + previousKV<a name="line.3822"></a>
-<span class="sourceLineNo">3823</span>                    + "(memStoreTS:" + previousKV.getSequenceId() + ")" + ", New KV: " + kv<a name="line.3823"></a>
-<span class="sourceLineNo">3824</span>                    + "(memStoreTS:" + kv.getSequenceId() + ")");<a name="line.3824"></a>
-<span class="sourceLineNo">3825</span>                assertEquals(0, Bytes.compareTo(CellUtil.cloneValue(previousKV), thisValue));<a name="line.3825"></a>
-<span class="sourceLineNo">3826</span>              }<a name="line.3826"></a>
-<span class="sourceLineNo">3827</span>            }<a name="line.3827"></a>
-<span class="sourceLineNo">3828</span>            previousKV = kv;<a name="line.3828"></a>
-<span class="sourceLineNo">3829</span>          }<a name="line.3829"></a>
-<span class="sourceLineNo">3830</span>        }<a name="line.3830"></a>
-<span class="sourceLineNo">3831</span>      }<a name="line.3831"></a>
-<span class="sourceLineNo">3832</span>    } finally {<a name="line.3832"></a>
-<span class="sourceLineNo">3833</span>      if (putThread != null)<a name="line.3833"></a>
-<span class="sourceLineNo">3834</span>        putThread.done();<a name="line.3834"></a>
-<span class="sourceLineNo">3835</span><a name="line.3835"></a>
-<span class="sourceLineNo">3836</span>      region.flush(true);<a name="line.3836"></a>
-<span class="sourceLineNo">3837</span><a name="line.3837"></a>
-<span class="sourceLineNo">3838</span>      if (putThread != null) {<a name="line.3838"></a>
-<span class="sourceLineNo">3839</span>        putThread.join();<a name="line.3839"></a>
-<span class="sourceLineNo">3840</span>        putThread.checkNoError();<a name="line.3840"></a>
+<span class="sourceLineNo">3819</span>            if (CellUtil.matchingFamily(kv, families[0])<a name="line.3819"></a>
+<span class="sourceLineNo">3820</span>                &amp;&amp; CellUtil.matchingQualifier(kv, qualifiers[0])) {<a name="line.3820"></a>
+<span class="sourceLineNo">3821</span>              timestamp = kv.getTimestamp();<a name="line.3821"></a>
+<span class="sourceLineNo">3822</span>            }<a name="line.3822"></a>
+<span class="sourceLineNo">3823</span>          }<a name="line.3823"></a>
+<span class="sourceLineNo">3824</span>          assertTrue(timestamp &gt;= prevTimestamp);<a name="line.3824"></a>
+<span class="sourceLineNo">3825</span>          prevTimestamp = timestamp;<a name="line.3825"></a>
+<span class="sourceLineNo">3826</span>          Cell previousKV = null;<a name="line.3826"></a>
+<span class="sourceLineNo">3827</span><a name="line.3827"></a>
+<span class="sourceLineNo">3828</span>          for (Cell kv : result.rawCells()) {<a name="line.3828"></a>
+<span class="sourceLineNo">3829</span>            byte[] thisValue = CellUtil.cloneValue(kv);<a name="line.3829"></a>
+<span class="sourceLineNo">3830</span>            if (previousKV != null) {<a name="line.3830"></a>
+<span class="sourceLineNo">3831</span>              if (Bytes.compareTo(CellUtil.cloneValue(previousKV), thisValue) != 0) {<a name="line.3831"></a>
+<span class="sourceLineNo">3832</span>                LOG.warn("These two KV should have the same value." + " Previous KV:" + previousKV<a name="line.3832"></a>
+<span class="sourceLineNo">3833</span>                    + "(memStoreTS:" + previousKV.getSequenceId() + ")" + ", New KV: " + kv<a name="line.3833"></a>
+<span class="sourceLineNo">3834</span>                    + "(memStoreTS:" + kv.getSequenceId() + ")");<a name="line.3834"></a>
+<span class="sourceLineNo">3835</span>                assertEquals(0, Bytes.compareTo(CellUtil.cloneValue(previousKV), thisValue));<a name="line.3835"></a>
+<span class="sourceLineNo">3836</span>              }<a name="line.3836"></a>
+<span class="sourceLineNo">3837</span>            }<a name="line.3837"></a>
+<span class="sourceLineNo">3838</span>            previousKV = kv;<a name="line.3838"></a>
+<span class="sourceLineNo">3839</span>          }<a name="line.3839"></a>
+<span class="sourceLineNo">3840</span>        }<a name="line.3840"></a>
 <span class="sourceLineNo">3841</span>      }<a name="line.3841"></a>
-<span class="sourceLineNo">3842</span><a name="line.3842"></a>
-<span class="sourceLineNo">3843</span>      ctx.stop();<a name="line.3843"></a>
-<span class="sourceLineNo">3844</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.3844"></a>
-<span class="sourceLineNo">3845</span>      this.region = null;<a name="line.3845"></a>
-<span class="sourceLineNo">3846</span>    }<a name="line.3846"></a>
-<span class="sourceLineNo">3847</span>  }<a name="line.3847"></a>
-<span class="sourceLineNo">3848</span><a name="line.3848"></a>
-<span class="sourceLineNo">3849</span>  @Test<a name="line.3849"></a>
-<span class="sourceLineNo">3850</span>  public void testHolesInMeta() throws Exception {<a name="line.3850"></a>
-<span class="sourceLineNo">3851</span>    byte[] family = Bytes.toBytes("family");<a name="line.3851"></a>
-<span class="sourceLineNo">3852</span>    this.region = initHRegion(tableName, Bytes.toBytes("x"), Bytes.toBytes("z"), method, CONF,<a name="line.3852"></a>
-<span class="sourceLineNo">3853</span>        false, family);<a name="line.3853"></a>
-<span class="sourceLineNo">3854</span>    byte[] rowNotServed = Bytes.toBytes("a");<a name="line.3854"></a>
-<span class="sourceLineNo">3855</span>    Get g = new Get(rowNotServed);<a name="line.3855"></a>
-<span class="sourceLineNo">3856</span>    try {<a name="line.3856"></a>
-<span class="sourceLineNo">3857</span>      region.get(g);<a name="line.3857"></a>
-<span class="sourceLineNo">3858</span>      fail();<a name="line.3858"></a>
-<span class="sourceLineNo">3859</span>    } catch (WrongRegionException x) {<a name="line.3859"></a>
-<span class="sourceLineNo">3860</span>      // OK<a name="line.3860"></a>
-<span class="sourceLineNo">3861</span>    }<a name="line.3861"></a>
-<span class="sourceLineNo">3862</span>    byte[] row = Bytes.toBytes("y");<a name="line.3862"></a>
-<span class="sourceLineNo">3863</span>    g = new Get(row);<a name="line.3863"></a>
-<span class="sourceLineNo">3864</span>    region.get(g);<a name="line.3864"></a>
-<span class="sourceLineNo">3865</span>  }<a name="line.3865"></a>
-<span class="sourceLineNo">3866</span><a name="line.3866"></a>
-<span class="sourceLineNo">3867</span>  @Test<a name="line.3867"></a>
-<span class="sourceLineNo">3868</span>  public void testIndexesScanWithOneDeletedRow() throws IOException {<a name="line.3868"></a>
-<span class="sourceLineNo">3869</span>    byte[] family = Bytes.toBytes("family");<a name="line.3869"></a>
-<span class="sourceLineNo">3870</span><a name="line.3870"></a>
-<span class="sourceLineNo">3871</span>    // Setting up region<a name="line.3871"></a>
-<span class="sourceLineNo">3872</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.3872"></a>
-<span class="sourceLineNo">3873</span>    Put put = new Put(Bytes.toBytes(1L));<a name="line.3873"></a>
-<span class="sourceLineNo">3874</span>    put.addColumn(family, qual1, 1L, Bytes.toBytes(1L));<a name="line.3874"></a>
-<span class="sourceLineNo">3875</span>    region.put(put);<a name="line.3875"></a>
+<span class="sourceLineNo">3842</span>    } finally {<a name="line.3842"></a>
+<span class="sourceLineNo">3843</span>      if (putThread != null)<a name="line.3843"></a>
+<span class="sourceLineNo">3844</span>        putThread.done();<a name="line.3844"></a>
+<span class="sourceLineNo">3845</span><a name="line.3845"></a>
+<span class="sourceLineNo">3846</span>      region.flush(true);<a name="line.3846"></a>
+<span class="sourceLineNo">3847</span><a name="line.3847"></a>
+<span class="sourceLineNo">3848</span>      if (putThread != null) {<a name="line.3848"></a>
+<span class="sourceLineNo">3849</span>        putThread.join();<a name="line.3849"></a>
+<span class="sourceLineNo">3850</span>        putThread.checkNoError();<a name="line.3850"></a>
+<span class="sourceLineNo">3851</span>      }<a name="line.3851"></a>
+<span class="sourceLineNo">3852</span><a name="line.3852"></a>
+<span class="sourceLineNo">3853</span>      ctx.stop();<a name="line.3853"></a>
+<span class="sourceLineNo">3854</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.3854"></a>
+<span class="sourceLineNo">3855</span>      this.region = null;<a name="line.3855"></a>
+<span class="sourceLineNo">3856</span>    }<a name="line.3856"></a>
+<span class="sourceLineNo">3857</span>  }<a name="line.3857"></a>
+<span class="sourceLineNo">3858</span><a name="line.3858"></a>
+<span class="sourceLineNo">3859</span>  @Test<a name="line.3859"></a>
+<span class="sourceLineNo">3860</span>  public void testHolesInMeta() throws Exception {<a name="line.3860"></a>
+<span class="sourceLineNo">3861</span>    byte[] family = Bytes.toBytes("family");<a name="line.3861"></a>
+<span class="sourceLineNo">3862</span>    this.region = initHRegion(tableName, Bytes.toBytes("x"), Bytes.toBytes("z"), method, CONF,<a name="line.3862"></a>
+<span class="sourceLineNo">3863</span>        false, family);<a name="line.3863"></a>
+<span class="sourceLineNo">3864</span>    byte[] rowNotServed = Bytes.toBytes("a");<a name="line.3864"></a>
+<span class="sourceLineNo">3865</span>    Get g = new Get(rowNotServed);<a name="line.3865"></a>
+<span class="sourceLineNo">3866</span>    try {<a name="line.3866"></a>
+<span class="sourceLineNo">3867</span>      region.get(g);<a name="line.3867"></a>
+<span class="sourceLineNo">3868</span>      fail();<a name="line.3868"></a>
+<span class="sourceLineNo">3869</span>    } catch (WrongRegionException x) {<a name="line.3869"></a>
+<span class="sourceLineNo">3870</span>      // OK<a name="line.3870"></a>
+<span class="sourceLineNo">3871</span>    }<a name="line.3871"></a>
+<span class="sourceLineNo">3872</span>    byte[] row = Bytes.toBytes("y");<a name="line.3872"></a>
+<span class="sourceLineNo">3873</span>    g = new Get(row);<a name="line.3873"></a>
+<span class="sourceLineNo">3874</span>    region.get(g);<a name="line.3874"></a>
+<span class="sourceLineNo">3875</span>  }<a name="line.3875"></a>
 <span class="sourceLineNo">3876</span><a name="line.3876"></a>
-<span class="sourceLineNo">3877</span>    region.flush(true);<a name="line.3877"></a>
-<span class="sourceLineNo">3878</span><a name="line.3878"></a>
-<span class="sourceLineNo">3879</span>    Delete delete = new Delete(Bytes.toBytes(1L), 1L);<a name="line.3879"></a>
-<span class="sourceLineNo">3880</span>    region.delete(delete);<a name="line.3880"></a>
-<span class="sourceLineNo">3881</span><a name="line.3881"></a>
-<span class="sourceLineNo">3882</span>    put = new Put(Bytes.toBytes(2L));<a name="line.3882"></a>
-<span class="sourceLineNo">3883</span>    put.addColumn(family, qual1, 2L, Bytes.toBytes(2L));<a name="line.3883"></a>
-<span class="sourceLineNo">3884</span>    region.put(put);<a name="line.3884"></a>
-<span class="sourceLineNo">3885</span><a name="line.3885"></a>
-<span class="sourceLineNo">3886</span>    Scan idxScan = new Scan();<a name="line.3886"></a>
-<span class="sourceLineNo">3887</span>    idxScan.addFamily(family);<a name="line.3887"></a>
-<span class="sourceLineNo">3888</span>    idxScan.setFilter(new FilterList(FilterList.Operator.MUST_PASS_ALL, Arrays.&lt;Filter&gt; asList(<a name="line.3888"></a>
-<span class="sourceLineNo">3889</span>        new SingleColumnValueFilter(family, qual1, CompareOperator.GREATER_OR_EQUAL,<a name="line.3889"></a>
-<span class="sourceLineNo">3890</span>            new BinaryComparator(Bytes.toBytes(0L))), new SingleColumnValueFilter(family, qual1,<a name="line.3890"></a>
-<span class="sourceLineNo">3891</span>                    CompareOperator.LESS_OR_EQUAL, new BinaryComparator(Bytes.toBytes(3L))))));<a name="line.3891"></a>
-<span class="sourceLineNo">3892</span>    InternalScanner scanner = region.getScanner(idxScan);<a name="line.3892"></a>
-<span class="sourceLineNo">3893</span>    List&lt;Cell&gt; res = new ArrayList&lt;&gt;();<a name="line.3893"></a>
-<span class="sourceLineNo">3894</span><a name="line.3894"></a>
-<span class="sourceLineNo">3895</span>    while (scanner.next(res)) {<a name="line.3895"></a>
-<span class="sourceLineNo">3896</span>      // Ignore res value.<a name="line.3896"></a>
-<span class="sourceLineNo">3897</span>    }<a name="line.3897"></a>
-<span class="sourceLineNo">3898</span>    assertEquals(1L, res.size());<a name="line.3898"></a>
-<span class="sourceLineNo">3899</span>  }<a name="line.3899"></a>
-<span class="sourceLineNo">3900</span><a name="line.3900"></a>
-<span class="sourceLineNo">3901</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.3901"></a>
-<span class="sourceLineNo">3902</span>  // Bloom filter test<a name="line.3902"></a>
-<span class="sourceLineNo">3903</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.3903"></a>
-<span class="sourceLineNo">3904</span>  @Test<a name="line.3904"></a>
-<span class="sourceLineNo">3905</span>  public void testBloomFilterSize() throws IOException {<a name="line.3905"></a>
-<span class="sourceLineNo">3906</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.3906"></a>
-<span class="sourceLineNo">3907</span>    byte[] qf1 = Bytes.toBytes("col");<a name="line.3907"></a>
-<span class="sourceLineNo">3908</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.3908"></a>
-<span class="sourceLineNo">3909</span>    // Create Table<a name="line.3909"></a>
-<span class="sourceLineNo">3910</span>    HColumnDescriptor hcd = new HColumnDescriptor(fam1).setMaxVersions(Integer.MAX_VALUE)<a name="line.3910"></a>
-<span class="sourceLineNo">3911</span>        .setBloomFilterType(BloomType.ROWCOL);<a name="line.3911"></a>
-<span class="sourceLineNo">3912</span><a name="line.3912"></a>
-<span class="sourceLineNo">3913</span>    HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.3913"></a>
-<span class="sourceLineNo">3914</span>    htd.addFamily(hcd);<a name="line.3914"></a>
-<span class="sourceLineNo">3915</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.3915"></a>
-<span class="sourceLineNo">3916</span>    this.region = TEST_UTIL.createLocalHRegion(info, htd);<a name="line.3916"></a>
-<span class="sourceLineNo">3917</span>    int num_unique_rows = 10;<a name="line.3917"></a>
-<span class="sourceLineNo">3918</span>    int duplicate_multiplier = 2;<a name="line.3918"></a>
-<span class="sourceLineNo">3919</span>    int num_storefiles = 4;<a name="line.3919"></a>
-<span class="sourceLineNo">3920</span><a name="line.3920"></a>
-<span class="sourceLineNo">3921</span>    int version = 0;<a name="line.3921"></a>
-<span class="sourceLineNo">3922</span>    for (int f = 0; f &lt; num_storefiles; f++) {<a name="line.3922"></a>
-<span class="sourceLineNo">3923</span>      for (int i = 0; i &lt; duplicate_multiplier; i++) {<a name="line.3923"></a>
-<span class="sourceLineNo">3924</span>        for (int j = 0; j &lt; num_unique_rows; j++) {<a name="line.3924"></a>
-<span class="sourceLineNo">3925</span>          Put put = new Put(Bytes.toBytes("row" + j));<a name="line.3925"></a>
-<span class="sourceLineNo">3926</span>          put.setDurability(Durability.SKIP_WAL);<a name="line.3926"></a>
-<span class="sourceLineNo">3927</span>          long ts = version++;<a name="line.3927"></a>
-<span class="sourceLineNo">3928</span>          put.addColumn(fam1, qf1, ts, val1);<a name="line.3928"></a>
-<span class="sourceLineNo">3929</span>          region.put(put);<a name="line.3929"></a>
-<span class="sourceLineNo">3930</span>        }<a name="line.3930"></a>
-<span class="sourceLineNo">3931</span>      }<a name="line.3931"></a>
-<span class="sourceLineNo">3932</span>      region.flush(true);<a name="line.3932"></a>
-<span class="sourceLineNo">3933</span>    }<a name="line.3933"></a>
-<span class="sourceLineNo">3934</span>    // before compaction<a name="line.3934"></a>
-<span class="sourceLineNo">3935</span>    HStore store = region.getStore(fam1);<a name="line.3935"></a>
-<span class="sourceLineNo">3936</span>    Collection&lt;HStoreFile&gt; storeFiles = store.getStorefiles();<a name="line.3936"></a>
-<span class="sourceLineNo">3937</span>    for (HStoreFile storefile : storeFiles) {<a name="line.3937"></a>
-<span class="sourceLineNo">3938</span>      StoreFileReader reader = storefile.getReader();<a name="line.3938"></a>
-<span class="sourceLineNo">3939</span>      reader.loadFileInfo();<a name="line.3939"></a>
-<span class="sourceLineNo">3940</span>      reader.loadBloomfilter();<a name="line.3940"></a>
-<span class="sourceLineNo">3941</span>      assertEquals(num_unique_rows * duplicate_multiplier, reader.getEntries());<a name="line.3941"></a>
-<span class="sourceLineNo">3942</span>      assertEquals(num_unique_rows, reader.getFilterEntries());<a name="line.3942"></a>
+<span class="sourceLineNo">3877</span>  @Test<a name="line.3877"></a>
+<span class="sourceLineNo">3878</span>  public void testIndexesScanWithOneDeletedRow() throws IOException {<a name="line.3878"></a>
+<span class="sourceLineNo">3879</span>    byte[] family = Bytes.toBytes("family");<a name="line.3879"></a>
+<span class="sourceLineNo">3880</span><a name="line.3880"></a>
+<span class="sourceLineNo">3881</span>    // Setting up region<a name="line.3881"></a>
+<span class="sourceLineNo">3882</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.3882"></a>
+<span class="sourceLineNo">3883</span>    Put put = new Put(Bytes.toBytes(1L));<a name="line.3883"></a>
+<span class="sourceLineNo">3884</span>    put.addColumn(family, qual1, 1L, Bytes.toBytes(1L));<a name="line.3884"></a>
+<span class="sourceLineNo">3885</span>    region.put(put);<a name="line.3885"></a>
+<span class="sourceLineNo">3886</span><a name="line.3886"></a>
+<span class="sourceLineNo">3887</span>    region.flush(true);<a name="line.3887"></a>
+<span class="sourceLineNo">3888</span><a name="line.3888"></a>
+<span class="sourceLineNo">3889</span>    Delete delete = new Delete(Bytes.toBytes(1L), 1L);<a name="line.3889"></a>
+<span class="sourceLineNo">3890</span>    region.delete(delete);<a name="line.3890"></a>
+<span class="sourceLineNo">3891</span><a name="line.3891"></a>
+<span class="sourceLineNo">3892</span>    put = new Put(Bytes.toBytes(2L));<a name="line.3892"></a>
+<span class="sourceLineNo">3893</span>    put.addColumn(family, qual1, 2L, Bytes.toBytes(2L));<a name="line.3893"></a>
+<span class="sourceLineNo">3894</span>    region.put(put);<a name="line.3894"></a>
+<span class="sourceLineNo">3895</span><a name="line.3895"></a>
+<span class="sourceLineNo">3896</span>    Scan idxScan = new Scan();<a name="line.3896"></a>
+<span class="sourceLineNo">3897</span>    idxScan.addFamily(family);<a name="line.3897"></a>
+<span class="sourceLineNo">3898</span>    idxScan.setFilter(new FilterList(FilterList.Operator.MUST_PASS_ALL, Arrays.&lt;Filter&gt; asList(<a name="line.3898"></a>
+<span class="sourceLineNo">3899</span>        new SingleColumnValueFilter(family, qual1, CompareOperator.GREATER_OR_EQUAL,<a name="line.3899"></a>
+<span class="sourceLineNo">3900</span>            new BinaryComparator(Bytes.toBytes(0L))), new SingleColumnValueFilter(family, qual1,<a name="line.3900"></a>
+<span class="sourceLineNo">3901</span>                    CompareOperator.LESS_OR_EQUAL, new BinaryComparator(Bytes.toBytes(3L))))));<a name="line.3901"></a>
+<span class="sourceLineNo">3902</span>    InternalScanner scanner = region.getScanner(idxScan);<a name="line.3902"></a>
+<span class="sourceLineNo">3903</span>    List&lt;Cell&gt; res = new ArrayList&lt;&gt;();<a name="line.3903"></a>
+<span class="sourceLineNo">3904</span><a name="line.3904"></a>
+<span class="sourceLineNo">3905</span>    while (scanner.next(res)) {<a name="line.3905"></a>
+<span class="sourceLineNo">3906</span>      // Ignore res value.<a name="line.3906"></a>
+<span class="sourceLineNo">3907</span>    }<a name="line.3907"></a>
+<span class="sourceLineNo">3908</span>    assertEquals(1L, res.size());<a name="line.3908"></a>
+<span class="sourceLineNo">3909</span>  }<a name="line.3909"></a>
+<span class="sourceLineNo">3910</span><a name="line.3910"></a>
+<span class="sourceLineNo">3911</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.3911"></a>
+<span class="sourceLineNo">3912</span>  // Bloom filter test<a name="line.3912"></a>
+<span class="sourceLineNo">3913</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.3913"></a>
+<span class="sourceLineNo">3914</span>  @Test<a name="line.3914"></a>
+<span class="sourceLineNo">3915</span>  public void testBloomFilterSize() throws IOException {<a name="line.3915"></a>
+<span class="sourceLineNo">3916</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.3916"></a>
+<span class="sourceLineNo">3917</span>    byte[] qf1 = Bytes.toBytes("col");<a name="line.3917"></a>
+<span class="sourceLineNo">3918</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.3918"></a>
+<span class="sourceLineNo">3919</span>    // Create Table<a name="line.3919"></a>
+<span class="sourceLineNo">3920</span>    HColumnDescriptor hcd = new HColumnDescriptor(fam1).setMaxVersions(Integer.MAX_VALUE)<a name="line.3920"></a>
+<span class="sourceLineNo">3921</span>        .setBloomFilterType(BloomType.ROWCOL);<a name="line.3921"></a>
+<span class="sourceLineNo">3922</span><a name="line.3922"></a>
+<span class="sourceLineNo">3923</span>    HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.3923"></a>
+<span class="sourceLineNo">3924</span>    htd.addFamily(hcd);<a name="line.3924"></a>
+<span class="sourceLineNo">3925</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.3925"></a>
+<span class="sourceLineNo">3926</span>    this.region = TEST_UTIL.createLocalHRegion(info, htd);<a name="line.3926"></a>
+<span class="sourceLineNo">3927</span>    int num_unique_rows = 10;<a name="line.3927"></a>
+<span class="sourceLineNo">3928</span>    int duplicate_multiplier = 2;<a name="line.3928"></a>
+<span class="sourceLineNo">3929</span>    int num_storefiles = 4;<a name="line.3929"></a>
+<span class="sourceLineNo">3930</span><a name="line.3930"></a>
+<span class="sourceLineNo">3931</span>    int version = 0;<a name="line.3931"></a>
+<span class="sourceLineNo">3932</span>    for (int f = 0; f &lt; num_storefiles; f++) {<a name="line.3932"></a>
+<span class="sourceLineNo">3933</span>      for (int i = 0; i &lt; duplicate_multiplier; i++) {<a name="line.3933"></a>
+<span class="sourceLineNo">3934</span>        for (int j = 0; j &lt; num_unique_rows; j++) {<a name="line.3934"></a>
+<span class="sourceLineNo">3935</span>          Put put = new Put(Bytes.toBytes("row" + j));<a name="line.3935"></a>
+<span class="sourceLineNo">3936</span>          put.setDurability(Durability.SKIP_WAL);<a name="line.3936"></a>
+<span class="sourceLineNo">3937</span>          long ts = version++;<a name="line.3937"></a>
+<span class="sourceLineNo">3938</span>          put.addColumn(fam1, qf1, ts, val1);<a name="line.3938"></a>
+<span class="sourceLineNo">3939</span>          region.put(put);<a name="line.3939"></a>
+<span class="sourceLineNo">3940</span>        }<a name="line.3940"></a>
+<span class="sourceLineNo">3941</span>      }<a name="line.3941"></a>
+<span class="sourceLineNo">3942</span>      region.flush(true);<a name="line.3942"></a>
 <span class="sourceLineNo">3943</span>    }<a name="line.3943"></a>
-<span class="sourceLineNo">3944</span><a name="line.3944"></a>
-<span class="sourceLineNo">3945</span>    region.compact(true);<a name="line.3945"></a>
-<span class="sourceLineNo">3946</span><a name="line.3946"></a>
-<span class="sourceLineNo">3947</span>    // after compaction<a name="line.3947"></a>
-<span class="sourceLineNo">3948</span>    storeFiles = store.getStorefiles();<a name="line.3948"></a>
-<span class="sourceLineNo">3949</span>    for (HStoreFile storefile : storeFiles) {<a name="line.3949"></a>
-<span class="sourceLineNo">3950</span>      StoreFileReader reader = storefile.getReader();<a name="line.3950"></a>
-<span class="sourceLineNo">3951</span>      reader.loadFileInfo();<a name="line.3951"></a>
-<span class="sourceLineNo">3952</span>      reader.loadBloomfilter();<a name="line.3952"></a>
-<span class="sourceLineNo">3953</span>      assertEquals(num_unique_rows * duplicate_multiplier * num_storefiles, reader.getEntries());<a name="line.3953"></a>
-<span class="sourceLineNo">3954</span>      assertEquals(num_unique_rows, reader.getFilterEntries());<a name="line.3954"></a>
-<span class="sourceLineNo">3955</span>    }<a name="line.3955"></a>
-<span class="sourceLineNo">3956</span>  }<a name="line.3956"></a>
-<span class="sourceLineNo">3957</span><a name="line.3957"></a>
-<span class="sourceLineNo">3958</span>  @Test<a name="line.3958"></a>
-<span class="sourceLineNo">3959</span>  public void testAllColumnsWithBloomFilter() throws IOException {<a name="line.3959"></a>
-<span class="sourceLineNo">3960</span>    byte[] TABLE = Bytes.toBytes(name.getMethodName());<a name="line.3960"></a>
-<span class="sourceLineNo">3961</span>    byte[] FAMILY = Bytes.toBytes("family");<a name="line.3961"></a>
-<span class="sourceLineNo">3962</span><a name="line.3962"></a>
-<span class="sourceLineNo">3963</span>    // Create table<a name="line.3963"></a>
-<span class="sourceLineNo">3964</span>    HColumnDescriptor hcd = new HColumnDescriptor(FAMILY).setMaxVersions(Integer.MAX_VALUE)<a name="line.3964"></a>
-<span class="sourceLineNo">3965</span>        .setBloomFilterType(BloomType.ROWCOL);<a name="line.3965"></a>
-<span class="sourceLineNo">3966</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(TABLE));<a name="line.3966"></a>
-<span class="sourceLineNo">3967</span>    htd.addFamily(hcd);<a name="line.3967"></a>
-<span class="sourceLineNo">3968</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.3968"></a>
-<span class="sourceLineNo">3969</span>    this.region = TEST_UTIL.createLocalHRegion(info, htd);<a name="line.3969"></a>
-<span class="sourceLineNo">3970</span>    // For row:0, col:0: insert versions 1 through 5.<a name="line.3970"></a>
-<span class="sourceLineNo">3971</span>    byte[] row = Bytes.toBytes("row:" + 0);<a name="line.3971"></a>
-<span class="sourceLineNo">3972</span>    byte[] column = Bytes.toBytes("column:" + 0);<a name="line.3972"></a>
-<span class="sourceLineNo">3973</span>    Put put = new Put(row);<a name="line.3973"></a>
-<span class="sourceLineNo">3974</span>    put.setDurability(Durability.SKIP_WAL);<a name="line.3974"></a>
-<span class="sourceLineNo">3975</span>    for (long idx = 1; idx &lt;= 4; idx++) {<a name="line.3975"></a>
-<span class="sourceLineNo">3976</span>      put.addColumn(FAMILY, column, idx, Bytes.toBytes("value-version-" + idx));<a name="line.3976"></a>
-<span class="sourceLineNo">3977</span>    }<a name="line.3977"></a>
-<span class="sourceLineNo">3978</span>    region.put(put);<a name="line.3978"></a>
-<span class="sourceLineNo">3979</span><a name="line.3979"></a>
-<span class="sourceLineNo">3980</span>    // Flush<a name="line.3980"></a>
-<span class="sourceLineNo">3981</span>    region.flush(true);<a name="line.3981"></a>
-<span class="sourceLineNo">3982</span><a name="line.3982"></a>
-<span class="sourceLineNo">3983</span>    // Get rows<a name="line.3983"></a>
-<span class="sourceLineNo">3984</span>    Get get = new Get(row);<a name="line.3984"></a>
-<span class="sourceLineNo">3985</span>    get.readAllVersions();<a name="line.3985"></a>
-<span class="sourceLineNo">3986</span>    Cell[] kvs = region.get(get).rawCells();<a name="line.3986"></a>
-<span class="sourceLineNo">3987</span><a name="line.3987"></a>
-<span class="sourceLineNo">3988</span>    // Check if rows are correct<a name="line.3988"></a>
-<span class="sourceLineNo">3989</span>    assertEquals(4, kvs.length);<a name="line.3989"></a>
-<span class="sourceLineNo">3990</span>    checkOneCell(kvs[0], FAMILY, 0, 0, 4);<a name="line.3990"></a>
-<span class="sourceLineNo">3991</span>    checkOneCell(kvs[1], FAMILY, 0, 0, 3);<a name="line.3991"></a>
-<span class="sourceLineNo">3992</span>    checkOneCell(kvs[2], FAMILY, 0, 0, 2);<a name="line.3992"></a>
-<span class="sourceLineNo">3993</span>    checkOneCell(kvs[3], FAMILY, 0, 0, 1);<a name="line.3993"></a>
-<span class="sourceLineNo">3994</span>  }<a name="line.3994"></a>
-<span class="sourceLineNo">3995</span><a name="line.3995"></a>
-<span class="sourceLineNo">3996</span>  /**<a name="line.3996"></a>
-<span class="sourceLineNo">3997</span>   * Testcase to cover bug-fix for HBASE-2823 Ensures correct delete when<a name="line.3997"></a>
-<span class="sourceLineNo">3998</span>   * issuing delete row on columns with bloom filter set to row+col<a name="line.3998"></a>
-<span class="sourceLineNo">3999</span>   * (BloomType.ROWCOL)<a name="line.3999"></a>
-<span class="sourceLineNo">4000</span>   */<a name="line.4000"></a>
-<span class="sourceLineNo">4001</span>  @Test<a name="line.4001"></a>
-<span class="sourceLineNo">4002</span>  public void testDeleteRowWithBloomFilter() throws IOException {<a name="line.4002"></a>
-<span class="sourceLineNo">4003</span>    byte[] familyName = Bytes.toBytes("familyName");<a name="line.4003"></a>
-<span class="sourceLineNo">4004</span><a name="line.4004"></a>
-<span class="sourceLineNo">4005</span>    // Create Table<a name="line.4005"></a>
-<span class="sourceLineNo">4006</span>    HColumnDescriptor hcd = new HColumnDescriptor(familyName).setMaxVersions(Integer.MAX_VALUE)<a name="line.4006"></a>
-<span class="sourceLineNo">4007</span>        .setBloomFilterType(BloomType.ROWCOL);<a name="line.4007"></a>
-<span class="sourceLineNo">4008</span><a name="line.4008"></a>
-<span class="sourceLineNo">4009</span>    HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.4009"></a>
-<span class="sourceLineNo">4010</span>    htd.addFamily(hcd);<a name="line.4010"></a>
-<span class="sourceLineNo">4011</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.4011"></a>
-<span class="sourceLineNo">4012</span>    this.region = TEST_UTIL.createLocalHRegion(info, htd);<a name="line.4012"></a>
-<span class="sourceLineNo">4013</span>    // Insert some data<a name="line.4013"></a>
-<span class="sourceLineNo">4014</span>    byte[] row = Bytes.toBytes("row1");<a name="line.4014"></a>
-<span class="sourceLineNo">4015</span>    byte[] col = Bytes.toBytes("col1");<a name="line.4015"></a>
-<span class="sourceLineNo">4016</span><a name="line.4016"></a>
-<span class="sourceLineNo">4017</span>    Put put = new Put(row);<a name="line.4017"></a>
-<span class="sourceLineNo">4018</span>    put.addColumn(familyName, col, 1, Bytes.toBytes("SomeRandomValue"));<a name="line.4018"></a>
-<span class="sourceLineNo">4019</span>    region.put(put);<a name="line.4019"></a>
-<span class="sourceLineNo">4020</span>    region.flush(true);<a name="line.4020"></a>
-<span class="sourceLineNo">4021</span><a name="line.4021"></a>
-<span class="sourceLineNo">4022</span>    Delete del = new Delete(row);<a name="line.4022"></a>
-<span class="sourceLineNo">4023</span>    region.delete(del);<a name="line.4023"></a>
-<span class="sourceLineNo">4024</span>    region.flush(true);<a name="line.4024"></a>
-<span class="sourceLineNo">4025</span><a name="line.4025"></a>
-<span class="sourceLineNo">4026</span>    // Get remaining rows (should have none)<a name="line.4026"></a>
-<span class="sourceLineNo">4027</span>    Get get = new Get(row);<a name="line.4027"></a>
-<span class="sourceLineNo">4028</span>    get.addColumn(familyName, col);<a name="line.4028"></a>
-<span class="sourceLineNo">4029</span><a name="line.4029"></a>
-<span class="sourceLineNo">4030</span>    Cell[] keyValues = region.get(get).rawCells();<a name="line.4030"></a>
-<span class="sourceLineNo">4031</span>    assertEquals(0, keyValues.length);<a name="line.4031"></a>
-<span class="sourceLineNo">4032</span>  }<a name="line.4032"></a>
-<span class="sourceLineNo">4033</span><a name="line.4033"></a>
-<span class="sourceLineNo">4034</span>  @Test<a name="line.4034"></a>
-<span class="sourceLineNo">4035</span>  public void testgetHDFSBlocksDistribution() throws Exception {<a name="line.4035"></a>
-<span class="sourceLineNo">4036</span>    HBaseTestingUtility htu = new HBaseTestingUtility();<a name="line.4036"></a>
-<span class="sourceLineNo">4037</span>    // Why do we set the block size in this test?  If we set it smaller than the kvs, then we'll<a name="line.4037"></a>
-<span class="sourceLineNo">4038</span>    // break up the file in to more pieces that can be distributed across the three nodes and we<a name="line.4038"></a>
-<span class="sourceLineNo">4039</span>    // won't be able to have the condition this test asserts; that at least one node has<a name="line.4039"></a>
-<span class="sourceLineNo">4040</span>    // a copy of all replicas -- if small block size, then blocks are spread evenly across the<a name="line.4040"></a>
-<span class="sourceLineNo">4041</span>    // the three nodes.  hfilev3 with tags seems to put us over the block size.  St.Ack.<a name="line.4041"></a>
-<span class="sourceLineNo">4042</span>    // final int DEFAULT_BLOCK_SIZE = 1024;<a name="line.4042"></a>
-<span class="sourceLineNo">4043</span>    // htu.getConfiguration().setLong("dfs.blocksize", DEFAULT_BLOCK_SIZE);<a name="line.4043"></a>
-<span class="sourceLineNo">4044</span>    htu.getConfiguration().setInt("dfs.replication", 2);<a name="line.4044"></a>
-<span class="sourceLineNo">4045</span><a name="line.4045"></a>
-<span class="sourceLineNo">4046</span>    // set up a cluster with 3 nodes<a name="line.4046"></a>
-<span class="sourceLineNo">4047</span>    MiniHBaseCluster cluster = null;<a name="line.4047"></a>
-<span class="sourceLineNo">4048</span>    String dataNodeHosts[] = new String[] { "host1", "host2", "host3" };<a name="line.4048"></a>
-<span class="sourceLineNo">4049</span>    int regionServersCount = 3;<a name="line.4049"></a>
-<span class="sourceLineNo">4050</span><a name="line.4050"></a>
-<span class="sourceLineNo">4051</span>    try {<a name="line.4051"></a>
-<span class="sourceLineNo">4052</span>      StartMiniClusterOption option = StartMiniClusterOption.builder()<a name="line.4052"></a>
-<span class="sourceLineNo">4053</span>          .numRegionServers(regionServersCount).dataNodeHosts(dataNodeHosts).build();<a name="line.4053"></a>
-<span class="sourceLineNo">4054</span>      cluster = htu.startMiniCluster(option);<a name="line.4054"></a>
-<span class="sourceLineNo">4055</span>      byte[][] families = { fam1, fam2 };<a name="line.4055"></a>
-<span class="sourceLineNo">4056</span>      Table ht = htu.createTable(tableName, families);<a name="line.4056"></a>
-<span class="sourceLineNo">4057</span><a name="line.4057"></a>
-<span class="sourceLineNo">4058</span>      // Setting up region<a name="line.4058"></a>
-<span class="sourceLineNo">4059</span>      byte row[] = Bytes.toBytes("row1");<a name="line.4059"></a>
-<span class="sourceLineNo">4060</span>      byte col[] = Bytes.toBytes("col1");<a name="line.4060"></a>
-<span class="sourceLineNo">4061</span><a name="line.4061"></a>
-<span class="sourceLineNo">4062</span>      Put put = new Put(row);<a name="line.4062"></a>
-<span class="sourceLineNo">4063</span>      put.addColumn(fam1, col, 1, Bytes.toBytes("test1"));<a name="line.4063"></a>
-<span class="sourceLineNo">4064</span>      put.addColumn(fam2, col, 1, Bytes.toBytes("test2"));<a name="line.4064"></a>
-<span class="sourceLineNo">4065</span>      ht.put(put);<a name="line.4065"></a>
-<span class="sourceLineNo">4066</span><a name="line.4066"></a>
-<span class="sourceLineNo">4067</span>      HRegion firstRegion = htu.getHBaseCluster().getRegions(tableName).get(0);<a name="line.4067"></a>
-<span class="sourceLineNo">4068</span>      firstRegion.flush(true);<a name="line.4068"></a>
-<span class="sourceLineNo">4069</span>      HDFSBlocksDistribution blocksDistribution1 = firstRegion.getHDFSBlocksDistribution();<a name="line.4069"></a>
-<span class="sourceLineNo">4070</span><a name="line.4070"></a>
-<span class="sourceLineNo">4071</span>      // Given the default replication factor is 2 and we have 2 HFiles,<a name="line.4071"></a>
-<span class="sourceLineNo">4072</span>      // we will have total of 4 replica of blocks on 3 datanodes; thus there<a name="line.4072"></a>
-<span class="sourceLineNo">4073</span>      // must be at least one host that have replica for 2 HFiles. That host's<a name="line.4073"></a>
-<span class="sourceLineNo">4074</span>      // weight will be equal to the unique block weight.<a name="line.4074"></a>
-<span class="sourceLineNo">4075</span>      long uniqueBlocksWeight1 = blocksDistribution1.getUniqueBlocksTotalWeight();<a name="line.4075"></a>
-<span class="sourceLineNo">4076</span>      StringBuilder sb = new StringBuilder();<a name="line.4076"></a>
-<span class="sourceLineNo">4077</span>      for (String host: blocksDistribution1.getTopHosts()) {<a name="line.4077"></a>
-<span class="sourceLineNo">4078</span>        if (sb.length() &gt; 0) sb.append(", ");<a name="line.4078"></a>
-<span class="sourceLineNo">4079</span>        sb.append(host);<a name="line.4079"></a>
-<span class="sourceLineNo">4080</span>        sb.append("=");<a name="line.4080"></a>
-<span class="sourceLineNo">4081</span>        sb.append(blocksDistribution1.getWeight(host));<a name="line.4081"></a>
-<span class="sourceLineNo">4082</span>      }<a name="line.4082"></a>
-<span class="sourceLineNo">4083</span><a name="line.4083"></a>
-<span class="sourceLineNo">4084</span>      String topHost = blocksDistribution1.getTopHosts().get(0);<a name="line.4084"></a>
-<span class="sourceLineNo">4085</span>      long topHostWeight = blocksDistribution1.getWeight(topHost);<a name="line.4085"></a>
-<span class="sourceLineNo">4086</span>      String msg = "uniqueBlocksWeight=" + uniqueBlocksWeight1 + ", topHostWeight=" +<a name="line.4086"></a>
-<span class="sourceLineNo">4087</span>        topHostWeight + ", topHost=" + topHost + "; " + sb.toString();<a name="line.4087"></a>
-<span class="sourceLineNo">4088</span>      LOG.info(msg);<a name="line.4088"></a>
-<span class="sourceLineNo">4089</span>      assertTrue(msg, uniqueBlocksWeight1 == topHostWeight);<a name="line.4089"></a>
-<span class="sourceLineNo">4090</span><a name="line.4090"></a>
-<span class="sourceLineNo">4091</span>      // use the static method to compute the value, it should be the same.<a name="line.4091"></a>
-<span class="sourceLineNo">4092</span>      // static method is used by load balancer or other components<a name="line.4092"></a>
-<span class="sourceLineNo">4093</span>      HDFSBlocksDistribution blocksDistribution2 = HRegion.computeHDFSBlocksDistribution(<a name="line.4093"></a>
-<span class="sourceLineNo">4094</span>          htu.getConfiguration(), firstRegion.getTableDescriptor(), firstRegion.getRegionInfo());<a name="line.4094"></a>
-<span class="sourceLineNo">4095</span>      long uniqueBlocksWeight2 = blocksDistribution2.getUniqueBlocksTotalWeight();<a name="line.4095"></a>
-<span class="sourceLineNo">4096</span><a name="line.4096"></a>
-<span class="sourceLineNo">4097</span>      assertTrue(uniqueBlocksWeight1 == uniqueBlocksWeight2);<a name="line.4097"></a>
-<span class="sourceLineNo">4098</span><a name="line.4098"></a>
-<span class="sourceLineNo">4099</span>      ht.close();<a name="line.4099"></a>
-<span class="sourceLineNo">4100</span>    } finally {<a name="line.4100"></a>
-<span class="sourceLineNo">4101</span>      if (cluster != null) {<a name="line.4101"></a>
-<span class="sourceLineNo">4102</span>        htu.shutdownMiniCluster();<a name="line.4102"></a>
-<span class="sourceLineNo">4103</span>      }<a name="line.4103"></a>
-<span class="sourceLineNo">4104</span>    }<a name="line.4104"></a>
-<span class="sourceLineNo">4105</span>  }<a name="line.4105"></a>
+<span class="sourceLineNo">3944</span>    // before compaction<a name="line.3944"></a>
+<span class="sourceLineNo">3945</span>    HStore store = region.getStore(fam1);<a name="line.3945"></a>
+<span class="sourceLineNo">3946</span>    Collection&lt;HStoreFile&gt; storeFiles = store.getStorefiles();<a name="line.3946"></a>
+<span class="sourceLineNo">3947</span>    for (HStoreFile storefile : storeFiles) {<a name="line.3947"></a>
+<span class="sourceLineNo">3948</span>      StoreFileReader reader = storefile.getReader();<a name="line.3948"></a>
+<span class="sourceLineNo">3949</span>      reader.loadFileInfo();<a name="line.3949"></a>
+<span class="sourceLineNo">3950</span>      reader.loadBloomfilter();<a name="line.3950"></a>
+<span class="sourceLineNo">3951</span>      assertEquals(num_unique_rows * duplicate_multiplier, reader.getEntries());<a name="line.3951"></a>
+<span class="sourceLineNo">3952</span>      assertEquals(num_unique_rows, reader.getFilterEntries());<a name="line.3952"></a>
+<span class="sourceLineNo">3953</span>    }<a name="line.3953"></a>
+<span class="sourceLineNo">3954</span><a name="line.3954"></a>
+<span class="sourceLineNo">3955</span>    region.compact(true);<a name="line.3955"></a>
+<span class="sourceLineNo">3956</span><a name="line.3956"></a>
+<span class="sourceLineNo">3957</span>    // after compaction<a name="line.3957"></a>
+<span class="sourceLineNo">3958</span>    storeFiles = store.getStorefiles();<a name="line.3958"></a>
+<span class="sourceLineNo">3959</span>    for (HStoreFile storefile : storeFiles) {<a name="line.3959"></a>
+<span class="sourceLineNo">3960</span>      StoreFileReader reader = storefile.getReader();<a name="line.3960"></a>
+<span class="sourceLineNo">3961</span>      reader.loadFileInfo();<a name="line.3961"></a>
+<span class="sourceLineNo">3962</span>      reader.loadBloomfilter();<a name="line.3962"></a>
+<span class="sourceLineNo">3963</span>      assertEquals(num_unique_rows * duplicate_multiplier * num_storefiles, reader.getEntries());<a name="line.3963"></a>
+<span class="sourceLineNo">3964</span>      assertEquals(num_unique_rows, reader.getFilterEntries());<a name="line.3964"></a>
+<span class="sourceLineNo">3965</span>    }<a name="line.3965"></a>
+<span class="sourceLineNo">3966</span>  }<a name="line.3966"></a>
+<span class="sourceLineNo">3967</span><a name="line.3967"></a>
+<span class="sourceLineNo">3968</span>  @Test<a name="line.3968"></a>
+<span class="sourceLineNo">3969</span>  public void testAllColumnsWithBloomFilter() throws IOException {<a name="line.3969"></a>
+<span class="sourceLineNo">3970</span>    byte[] TABLE = Bytes.toBytes(name.getMethodName());<a name="line.3970"></a>
+<span class="sourceLineNo">3971</span>    byte[] FAMILY = Bytes.toBytes("family");<a name="line.3971"></a>
+<span class="sourceLineNo">3972</span><a name="line.3972"></a>
+<span class="sourceLineNo">3973</span>    // Create table<a name="line.3973"></a>
+<span class="sourceLineNo">3974</span>    HColumnDescriptor hcd = new HColumnDescriptor(FAMILY).setMaxVersions(Integer.MAX_VALUE)<a name="line.3974"></a>
+<span class="sourceLineNo">3975</span>        .setBloomFilterType(BloomType.ROWCOL);<a name="line.3975"></a>
+<span class="sourceLineNo">3976</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(TABLE));<a name="line.3976"></a>
+<span class="sourceLineNo">3977</span>    htd.addFamily(hcd);<a name="line.3977"></a>
+<span class="sourceLineNo">3978</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.3978"></a>
+<span class="sourceLineNo">3979</span>    this.region = TEST_UTIL.createLocalHRegion(info, htd);<a name="line.3979"></a>
+<span class="sourceLineNo">3980</span>    // For row:0, col:0: insert versions 1 through 5.<a name="line.3980"></a>
+<span class="sourceLineNo">3981</span>    byte[] row = Bytes.toBytes("row:" + 0);<a name="line.3981"></a>
+<span class="sourceLineNo">3982</span>    byte[] column = Bytes.toBytes("column:" + 0);<a name="line.3982"></a>
+<span class="sourceLineNo">3983</span>    Put put = new Put(row);<a name="line.3983"></a>
+<span class="sourceLineNo">3984</span>    put.setDurability(Durability.SKIP_WAL);<a name="line.3984"></a>
+<span class="sourceLineNo">3985</span>    for (long idx = 1; idx &lt;= 4; idx++) {<a name="line.3985"></a>
+<span class="sourceLineNo">3986</span>      put.addColumn(FAMILY, column, idx, Bytes.toBytes("value-version-" + idx));<a name="line.3986"></a>
+<span class="sourceLineNo">3987</span>    }<a name="line.3987"></a>
+<span class="sourceLineNo">3988</span>    region.put(put);<a name="line.3988"></a>
+<span class="sourceLineNo">3989</span><a name="line.3989"></a>
+<span class="sourceLineNo">3990</span>    // Flush<a name="line.3990"></a>
+<span class="sourceLineNo">3991</span>    region.flush(true);<a name="line.3991"></a>
+<span class="sourceLineNo">3992</span><a name="line.3992"></a>
+<span class="sourceLineNo">3993</span>    // Get rows<a name="line.3993"></a>
+<span class="sourceLineNo">3994</span>    Get get = new Get(row);<a name="line.3994"></a>
+<span class="sourceLineNo">3995</span>    get.readAllVersions();<a name="line.3995"></a>
+<span class="sourceLineNo">3996</span>    Cell[] kvs = region.get(get).rawCells();<a name="line.3996"></a>
+<span class="sourceLineNo">3997</span><a name="line.3997"></a>
+<span class="sourceLineNo">3998</span>    // Check if rows are correct<a name="line.3998"></a>
+<span class="sourceLineNo">3999</span>    assertEquals(4, kvs.length);<a name="line.3999"></a>
+<span class="sourceLineNo">4000</span>    checkOneCell(kvs[0], FAMILY, 0, 0, 4);<a name="line.4000"></a>
+<span class="sourceLineNo">4001</span>    checkOneCell(kvs[1], FAMILY, 0, 0, 3);<a name="line.4001"></a>
+<span class="sourceLineNo">4002</span>    checkOneCell(kvs[2], FAMILY, 0, 0, 2);<a name="line.4002"></a>
+<span class="sourceLineNo">4003</span>    checkOneCell(kvs[3], FAMILY, 0, 0, 1);<a name="line.4003"></a>
+<span class="sourceLineNo">4004</span>  }<a name="line.4004"></a>
+<span class="sourceLineNo">4005</span><a name="line.4005"></a>
+<span class="sourceLineNo">4006</span>  /**<a name="line.4006"></a>
+<span class="sourceLineNo">4007</span>   * Testcase to cover bug-fix for HBASE-2823 Ensures correct delete when<a name="line.4007"></a>
+<span class="sourceLineNo">4008</span>   * issuing delete row on columns with bloom filter set to row+col<a name="line.4008"></a>
+<span class="sourceLineNo">4009</span>   * (BloomType.ROWCOL)<a name="line.4009"></a>
+<span class="sourceLineNo">4010</span>   */<a name="line.4010"></a>
+<span class="sourceLineNo">4011</span>  @Test<a name="line.4011"></a>
+<span class="sourceLineNo">4012</span>  public void testDeleteRowWithBloomFilter() throws IOException {<a name="line.4012"></a>
+<span class="sourceLineNo">4013</span>    byte[] familyName = Bytes.toBytes("familyName");<a name="line.4013"></a>
+<span class="sourceLineNo">4014</span><a name="line.4014"></a>
+<span class="sourceLineNo">4015</span>    // Create Table<a name="line.4015"></a>
+<span class="sourceLineNo">4016</span>    HColumnDescriptor hcd = new HColumnDescriptor(familyName).setMaxVersions(Integer.MAX_VALUE)<a name="line.4016"></a>
+<span class="sourceLineNo">4017</span>        .setBloomFilterType(BloomType.ROWCOL);<a name="line.4017"></a>
+<span class="sourceLineNo">4018</span><a name="line.4018"></a>
+<span class="sourceLineNo">4019</span>    HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.4019"></a>
+<span class="sourceLineNo">4020</span>    htd.addFamily(hcd);<a name="line.4020"></a>
+<span class="sourceLineNo">4021</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.4021"></a>
+<span class="sourceLineNo">4022</span>    this.region = TEST_UTIL.createLocalHRegion(info, htd);<a name="line.4022"></a>
+<span class="sourceLineNo">4023</span>    // Insert some data<a name="line.4023"></a>
+<span class="sourceLineNo">4024</span>    byte[] row = Bytes.toBytes("row1");<a name="line.4024"></a>
+<span class="sourceLineNo">4025</span>    byte[] col = Bytes.toBytes("col1");<a name="line.4025"></a>
+<span class="sourceLineNo">4026</span><a name="line.4026"></a>
+<span class="sourceLineNo">4027</span>    Put put = new Put(row);<a name="line.4027"></a>
+<span class="sourceLineNo">4028</span>    put.addColumn(familyName, col, 1, Bytes.toBytes("SomeRandomValue"));<a name="line.4028"></a>
+<span class="sourceLineNo">4029</span>    region.put(put);<a name="line.4029"></a>
+<span class="sourceLineNo">4030</span>    region.flush(true);<a name="line.4030"></a>
+<span class="sourceLineNo">4031</span><a name="line.4031"></a>
+<span class="sourceLineNo">4032</span>    Delete del = new Delete(row);<a name="line.4032"></a>
+<span class="sourceLineNo">4033</span>    region.delete(del);<a name="line.4033"></a>
+<span class="sourceLineNo">4034</span>    region.flush(true);<a name="line.4034"></a>
+<span class="sourceLineNo">4035</span><a name="line.4035"></a>
+<span class="sourceLineNo">4036</span>    // Get remaining rows (should have none)<a name="line.4036"></a>
+<span class="sourceLineNo">4037</span>    Get get = new Get(row);<a name="line.4037"></a>
+<span class="sourceLineNo">4038</span>    get.addColumn(familyName, col);<a name="line.4038"></a>
+<span class="sourceLineNo">4039</span><a name="line.4039"></a>
+<span class="sourceLineNo">4040</span>    Cell[] keyValues = region.get(get).rawCells();<a name="line.4040"></a>
+<span class="sourceLineNo">4041</span>    assertEquals(0, keyValues.length);<a name="line.4041"></a>
+<span class="sourceLineNo">4042</span>  }<a name="line.4042"></a>
+<span class="sourceLineNo">4043</span><a name="line.4043"></a>
+<span class="sourceLineNo">4044</span>  @Test<a name="line.4044"></a>
+<span class="sourceLineNo">4045</span>  public void testgetHDFSBlocksDistribution() throws Exception {<a name="line.4045"></a>
+<span class="sourceLineNo">4046</span>    HBaseTestingUtility htu = new HBaseTestingUtility();<a name="line.4046"></a>
+<span class="sourceLineNo">4047</span>    // Why do we set the block size in this test?  If we set it smaller than the kvs, then we'll<a name="line.4047"></a>
+<span class="sourceLineNo">4048</span>    // break up the file in to more pieces that can be distributed across the three nodes and we<a name="line.4048"></a>
+<span class="sourceLineNo">4049</span>    // won't be able to have the condition this test asserts; that at least one node has<a name="line.4049"></a>
+<span class="sourceLineNo">4050</span>    // a copy of all replicas -- if small block size, then blocks are spread evenly across the<a name="line.4050"></a>
+<span class="sourceLineNo">4051</span>    // the three nodes.  hfilev3 with tags seems to put us over the block size.  St.Ack.<a name="line.4051"></a>
+<span class="sourceLineNo">4052</span>    // final int DEFAULT_BLOCK_SIZE = 1024;<a name="line.4052"></a>
+<span class="sourceLineNo">4053</span>    // htu.getConfiguration().setLong("dfs.blocksize", DEFAULT_BLOCK_SIZE);<a name="line.4053"></a>
+<span class="sourceLineNo">4054</span>    htu.getConfiguration().setInt("dfs.replication", 2);<a name="line.4054"></a>
+<span class="sourceLineNo">4055</span><a name="line.4055"></a>
+<span class="sourceLineNo">4056</span>    // set up a cluster with 3 nodes<a name="line.4056"></a>
+<span class="sourceLineNo">4057</span>    MiniHBaseCluster cluster = null;<a name="line.4057"></a>
+<span class="sourceLineNo">4058</span>    String dataNodeHosts[] = new String[] { "host1", "host2", "host3" };<a name="line.4058"></a>
+<span class="sourceLineNo">4059</span>    int regionServersCount = 3;<a name="line.4059"></a>
+<span class="sourceLineNo">4060</span><a name="line.4060"></a>
+<span class="sourceLineNo">4061</span>    try {<a name="line.4061"></a>
+<span class="sourceLineNo">4062</span>      StartMiniClusterOption option = StartMiniClusterOption.builder()<a name="line.4062"></a>
+<span class="sourceLineNo">4063</span>          .numRegionServers(regionServersCount).dataNodeHosts(dataNodeHosts).build();<a name="line.4063"></a>
+<span class="sourceLineNo">4064</span>      cluster = htu.startMiniCluster(option);<a name="line.4064"></a>
+<span class="sourceLineNo">4065</span>      byte[][] families = { fam1, fam2 };<a name="line.4065"></a>
+<span class="sourceLineNo">4066</span>      Table ht = htu.createTable(tableName, families);<a name="line.4066"></a>
+<span class="sourceLineNo">4067</span><a name="line.4067"></a>
+<span class="sourceLineNo">4068</span>      // Setting up region<a name="line.4068"></a>
+<span class="sourceLineNo">4069</span>      byte row[] = Bytes.toBytes("row1");<a name="line.4069"></a>
+<span class="sourceLineNo">4070</span>      byte col[] = Bytes.toBytes("col1");<a name="line.4070"></a>
+<span class="sourceLineNo">4071</span><a name="line.4071"></a>
+<span class="sourceLineNo">4072</span>      Put put = new Put(row);<a name="line.4072"></a>
+<span class="sourceLineNo">4073</span>      put.addColumn(fam1, col, 1, Bytes.toBytes("test1"));<a name="line.4073"></a>
+<span class="sourceLineNo">4074</span>      put.addColumn(fam2, col, 1, Bytes.toBytes("test2"));<a name="line.4074"></a>
+<span class="sourceLineNo">4075</span>      ht.put(put);<a name="line.4075"></a>
+<span class="sourceLineNo">4076</span><a name="line.4076"></a>
+<span class="sourceLineNo">4077</span>      HRegion firstRegion = htu.getHBaseCluster().getRegions(tableName).get(0);<a name="line.4077"></a>
+<span class="sourceLineNo">4078</span>      firstRegion.flush(true);<a name="line.4078"></a>
+<span class="sourceLineNo">4079</span>      HDFSBlocksDistribution blocksDistribution1 = firstRegion.getHDFSBlocksDistribution();<a name="line.4079"></a>
+<span class="sourceLineNo">4080</span><a name="line.4080"></a>
+<span class="sourceLineNo">4081</span>      // Given the default replication factor is 2 and we have 2 HFiles,<a name="line.4081"></a>
+<span class="sourceLineNo">4082</span>      // we will have total of 4 replica of blocks on 3 datanodes; thus there<a name="line.4082"></a>
+<span class="sourceLineNo">4083</span>      // must be at least one host that have replica for 2 HFiles. That host's<a name="line.4083"></a>
+<span class="sourceLineNo">4084</span>      // weight will be equal to the unique block weight.<a name="line.4084"></a>
+<span class="sourceLineNo">4085</span>      long uniqueBlocksWeight1 = blocksDistribution1.getUniqueBlocksTotalWeight();<a name="line.4085"></a>
+<span class="sourceLineNo">4086</span>      StringBuilder sb = new StringBuilder();<a name="line.4086"></a>
+<span class="sourceLineNo">4087</span>      for (String host: blocksDistribution1.getTopHosts()) {<a name="line.4087"></a>
+<span class="sourceLineNo">4088</span>        if (sb.length() &gt; 0) sb.append(", ");<a name="line.4088"></a>
+<span class="sourceLineNo">4089</span>        sb.append(host);<a name="line.4089"></a>
+<span class="sourceLineNo">4090</span>        sb.append("=");<a name="line.4090"></a>
+<span class="sourceLineNo">4091</span>        sb.append(blocksDistribution1.getWeight(host));<a name="line.4091"></a>
+<span class="sourceLineNo">4092</span>      }<a name="line.4092"></a>
+<span class="sourceLineNo">4093</span><a name="line.4093"></a>
+<span class="sourceLineNo">4094</span>      String topHost = blocksDistribution1.getTopHosts().get(0);<a name="line.4094"></a>
+<span class="sourceLineNo">4095</span>      long topHostWeight = blocksDistribution1.getWeight(topHost);<a name="line.4095"></a>
+<span class="sourceLineNo">4096</span>      String msg = "uniqueBlocksWeight=" + uniqueBlocksWeight1 + ", topHostWeight=" +<a name="line.4096"></a>
+<span class="sourceLineNo">4097</span>        topHostWeight + ", topHost=" + topHost + "; " + sb.toString();<a name="line.4097"></a>
+<span class="sourceLineNo">4098</span>      LOG.info(msg);<a name="line.4098"></a>
+<span class="sourceLineNo">4099</span>      assertTrue(msg, uniqueBlocksWeight1 == topHostWeight);<a name="line.4099"></a>
+<span class="sourceLineNo">4100</span><a name="line.4100"></a>
+<span class="sourceLineNo">4101</span>      // use the static method to compute the value, it should be the same.<a name="line.4101"></a>
+<span class="sourceLineNo">4102</span>      // static method is used by load balancer or other components<a name="line.4102"></a>
+<span class="sourceLineNo">4103</span>      HDFSBlocksDistribution blocksDistribution2 = HRegion.computeHDFSBlocksDistribution(<a name="line.4103"></a>
+<span class="sourceLineNo">4104</span>          htu.getConfiguration(), firstRegion.getTableDescriptor(), firstRegion.getRegionInfo());<a name="line.4104"></a>
+<span class="sourceLineNo">4105</span>      long uniqueBlocksWeight2 = blocksDistribution2.getUniqueBlocksTotalWeight();<a name="line.4105"></a>
 <span class="sourceLineNo">4106</span><a name="line.4106"></a>
-<span class="sourceLineNo">4107</span>  /**<a name="line.4107"></a>
-<span class="sourceLineNo">4108</span>   * Testcase to check state of region initialization task set to ABORTED or not<a name="line.4108"></a>
-<span class="sourceLineNo">4109</span>   * if any exceptions during initialization<a name="line.4109"></a>
-<span class="sourceLineNo">4110</span>   *<a name="line.4110"></a>
-<span class="sourceLineNo">4111</span>   * @throws Exception<a name="line.4111"></a>
-<span class="sourceLineNo">4112</span>   */<a name="line.4112"></a>
-<span class="sourceLineNo">4113</span>  @Test<a name="line.4113"></a>
-<span class="sourceLineNo">4114</span>  public void testStatusSettingToAbortIfAnyExceptionDuringRegionInitilization() throws Exception {<a name="line.4114"></a>
-<span class="sourceLineNo">4115</span>    HRegionInfo info;<a name="line.4115"></a>
-<span class="sourceLineNo">4116</span>    try {<a name="line.4116"></a>
-<span class="sourceLineNo">4117</span>      FileSystem fs = Mockito.mock(FileSystem.class);<a name="line.4117"></a>
-<span class="sourceLineNo">4118</span>      Mockito.when(fs.exists((Path) Mockito.anyObject())).thenThrow(new IOException());<a name="line.4118"></a>
-<span class="sourceLineNo">4119</span>      HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.4119"></a>
-<span class="sourceLineNo">4120</span>      htd.addFamily(new HColumnDescriptor("cf"));<a name="line.4120"></a>
-<span class="sourceLineNo">4121</span>      info = new HRegionInfo(htd.getTableName(), HConstants.EMPTY_BYTE_ARRAY,<a name="line.4121"></a>
-<span class="sourceLineNo">4122</span>          HConstants.EMPTY_BYTE_ARRAY, false);<a name="line.4122"></a>
-<span class="sourceLineNo">4123</span>      Path path = new Path(dir + "testStatusSettingToAbortIfAnyExceptionDuringRegionInitilization");<a name="line.4123"></a>
-<span class="sourceLineNo">4124</span>      region = HRegion.newHRegion(path, null, fs, CONF, info, htd, null);<a name="line.4124"></a>
-<span class="sourceLineNo">4125</span>      // region initialization throws IOException and set task state to ABORTED.<a name="line.4125"></a>
-<span class="sourceLineNo">4126</span>      region.initialize();<a name="line.4126"></a>
-<span class="sourceLineNo">4127</span>      fail("Region initialization should fail due to IOException");<a name="line.4127"></a>
-<span class="sourceLineNo">4128</span>    } catch (IOException io) {<a name="line.4128"></a>
-<span class="sourceLineNo">4129</span>      List&lt;MonitoredTask&gt; tasks = TaskMonitor.get().getTasks();<a name="line.4129"></a>
-<span class="sourceLineNo">4130</span>      for (MonitoredTask monitoredTask : tasks) {<a name="line.4130"></a>
-<span class="sourceLineNo">4131</span>        if (!(monitoredTask instanceof MonitoredRPCHandler)<a name="line.4131"></a>
-<span class="sourceLineNo">4132</span>            &amp;&amp; monitoredTask.getDescription().contains(region.toString())) {<a name="line.4132"></a>
-<span class="sourceLineNo">4133</span>          assertTrue("Region state should be ABORTED.",<a name="line.4133"></a>
-<span class="sourceLineNo">4134</span>              monitoredTask.getState().equals(MonitoredTask.State.ABORTED));<a name="line.4134"></a>
-<span class="sourceLineNo">4135</span>          break;<a name="line.4135"></a>
-<span class="sourceLineNo">4136</span>        }<a name="line.4136"></a>
-<span class="sourceLineNo">4137</span>      }<a name="line.4137"></a>
-<span class="sourceLineNo">4138</span>    }<a name="line.4138"></a>
-<span class="sourceLineNo">4139</span>  }<a name="line.4139"></a>
-<span class="sourceLineNo">4140</span><a name="line.4140"></a>
-<span class="sourceLineNo">4141</span>  /**<a name="line.4141"></a>
-<span class="sourceLineNo">4142</span>   * Verifies that the .regioninfo file is written on region creation and that<a name="line.4142"></a>
-<span class="sourceLineNo">4143</span>   * is recreated if missing during region opening.<a name="line.4143"></a>
-<span class="sourceLineNo">4144</span>   */<a name="line.4144"></a>
-<span class="sourceLineNo">4145</span>  @Test<a name="line.4145"></a>
-<span class="sourceLineNo">4146</span>  public void testRegionInfoFileCreation() throws IOException {<a name="line.4146"></a>
-<span class="sourceLineNo">4147</span>    Path rootDir = new Path(dir + "testRegionInfoFileCreation");<a name="line.4147"></a>
-<span class="sourceLineNo">4148</span><a name="line.4148"></a>
-<span class="sourceLineNo">4149</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.4149"></a>
-<span class="sourceLineNo">4150</span>    htd.addFamily(new HColumnDescriptor("cf"));<a name="line.4150"></a>
-<span class="sourceLineNo">4151</span><a name="line.4151"></a>
-<span class="sourceLineNo">4152</span>    HRegionInfo hri = new HRegionInfo(htd.getTableName());<a name="line.4152"></a>
-<span class="sourceLineNo">4153</span><a name="line.4153"></a>
-<span class="sourceLineNo">4154</span>    // Create a region and skip the initialization (like CreateTableHandler)<a name="line.4154"></a>
-<span class="sourceLineNo">4155</span>    region = HBaseTestingUtility.createRegionAndWAL(hri, rootDir, CONF, htd, false);<a name="line.4155"></a>
-<span class="sourceLineNo">4156</span>    Path regionDir = region.getRegionFileSystem().getRegionDir();<a name="line.4156"></a>
-<span class="sourceLineNo">4157</span>    FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.4157"></a>
-<span class="sourceLineNo">4158</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.4158"></a>
-<span class="sourceLineNo">4159</span><a name="line.4159"></a>
-<span class="sourceLineNo">4160</span>    Path regionInfoFile = new Path(regionDir, HRegionFileSystem.REGION_INFO_FILE);<a name="line.4160"></a>
+<span class="sourceLineNo">4107</span>      assertTrue(uniqueBlocksWeight1 == uniqueBlocksWeight2);<a name="line.4107"></a>
+<span class="sourceLineNo">4108</span><a name="line.4108"></a>
+<span class="sourceLineNo">4109</span>      ht.close();<a name="line.4109"></a>
+<span class="sourceLineNo">4110</span>    } finally {<a name="line.4110"></a>
+<span class="sourceLineNo">4111</span>      if (cluster != null) {<a name="line.4111"></a>
+<span class="sourceLineNo">4112</span>        htu.shutdownMiniCluster();<a name="line.4112"></a>
+<span class="sourceLineNo">4113</span>      }<a name="line.4113"></a>
+<span class="sourceLineNo">4114</span>    }<a name="line.4114"></a>
+<span class="sourceLineNo">4115</span>  }<a name="line.4115"></a>
+<span class="sourceLineNo">4116</span><a name="line.4116"></a>
+<span class="sourceLineNo">4117</span>  /**<a name="line.4117"></a>
+<span class="sourceLineNo">4118</span>   * Testcase to check state of region initialization task set to ABORTED or not<a name="line.4118"></a>
+<span class="sourceLineNo">4119</span>   * if any exceptions during initialization<a name="line.4119"></a>
+<span class="sourceLineNo">4120</span>   *<a name="line.4120"></a>
+<span class="sourceLineNo">4121</span>   * @throws Exception<a name="line.4121"></a>
+<span class="sourceLineNo">4122</span>   */<a name="line.4122"></a>
+<span class="sourceLineNo">4123</span>  @Test<a name="line.4123"></a>
+<span class="sourceLineNo">4124</span>  public void testStatusSettingToAbortIfAnyExceptionDuringRegionInitilization() throws Exception {<a name="line.4124"></a>
+<span class="sourceLineNo">4125</span>    HRegionInfo info;<a name="line.4125"></a>
+<span class="sourceLineNo">4126</span>    try {<a name="line.4126"></a>
+<span class="sourceLineNo">4127</span>      FileSystem fs = Mockito.mock(FileSystem.class);<a name="line.4127"></a>
+<span class="sourceLineNo">4128</span>      Mockito.when(fs.exists((Path) Mockito.anyObject())).thenThrow(new IOException());<a name="line.4128"></a>
+<span class="sourceLineNo">4129</span>      HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.4129"></a>
+<span class="sourceLineNo">4130</span>      htd.addFamily(new HColumnDescriptor("cf"));<a name="line.4130"></a>
+<span class="sourceLineNo">4131</span>      info = new HRegionInfo(htd.getTableName(), HConstants.EMPTY_BYTE_ARRAY,<a name="line.4131"></a>
+<span class="sourceLineNo">4132</span>          HConstants.EMPTY_BYTE_ARRAY, false);<a name="line.4132"></a>
+<span class="sourceLineNo">4133</span>      Path path = new Path(dir + "testStatusSettingToAbortIfAnyExceptionDuringRegionInitilization");<a name="line.4133"></a>
+<span class="sourceLineNo">4134</span>      region = HRegion.newHRegion(path, null, fs, CONF, info, htd, null);<a name="line.4134"></a>
+<span class="sourceLineNo">4135</span>      // region initialization throws IOException and set task state to ABORTED.<a name="line.4135"></a>
+<span class="sourceLineNo">4136</span>      region.initialize();<a name="line.4136"></a>
+<span class="sourceLineNo">4137</span>      fail("Region initialization should fail due to IOException");<a name="line.4137"></a>
+<span class="sourceLineNo">4138</span>    } catch (IOException io) {<a name="line.4138"></a>
+<span class="sourceLineNo">4139</span>      List&lt;MonitoredTask&gt; tasks = TaskMonitor.get().getTasks();<a name="line.4139"></a>
+<span class="sourceLineNo">4140</span>      for (MonitoredTask monitoredTask : tasks) {<a name="line.4140"></a>
+<span class="sourceLineNo">4141</span>        if (!(monitoredTask instanceof MonitoredRPCHandler)<a name="line.4141"></a>
+<span class="sourceLineNo">4142</span>            &amp;&amp; monitoredTask.getDescription().contains(region.toString())) {<a name="line.4142"></a>
+<span class="sourceLineNo">4143</span>          assertTrue("Region state should be ABORTED.",<a name="line.4143"></a>
+<span class="sourceLineNo">4144</span>              monitoredTask.getState().equals(MonitoredTask.State.ABORTED));<a name="line.4144"></a>
+<span class="sourceLineNo">4145</span>          break;<a name="line.4145"></a>
+<span class="sourceLineNo">4146</span>        }<a name="line.4146"></a>
+<span class="sourceLineNo">4147</span>      }<a name="line.4147"></a>
+<span class="sourceLineNo">4148</span>    }<a name="line.4148"></a>
+<span class="sourceLineNo">4149</span>  }<a name="line.4149"></a>
+<span class="sourceLineNo">4150</span><a name="line.4150"></a>
+<span class="sourceLineNo">4151</span>  /**<a name="line.4151"></a>
+<span class="sourceLineNo">4152</span>   * Verifies that the .regioninfo file is written on region creation and that<a name="line.4152"></a>
+<span class="sourceLineNo">4153</span>   * is recreated if missing during region opening.<a name="line.4153"></a>
+<span class="sourceLineNo">4154</span>   */<a name="line.4154"></a>
+<span class="sourceLineNo">4155</span>  @Test<a name="line.4155"></a>
+<span class="sourceLineNo">4156</span>  public void testRegionInfoFileCreation() throws IOException {<a name="line.4156"></a>
+<span class="sourceLineNo">4157</span>    Path rootDir = new Path(dir + "testRegionInfoFileCreation");<a name="line.4157"></a>
+<span class="sourceLineNo">4158</span><a name="line.4158"></a>
+<span class="sourceLineNo">4159</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.4159"></a>
+<span class="sourceLineNo">4160</span>    htd.addFamily(new HColumnDescriptor("cf"));<a name="line.4160"></a>
 <span class="sourceLineNo">4161</span><a name="line.4161"></a>
-<span class="sourceLineNo">4162</span>    // Verify that the .regioninfo file is present<a name="line.4162"></a>
-<span class="sourceLineNo">4163</span>    assertTrue(HRegionFileSystem.REGION_INFO_FILE + " should be present in the region dir",<a name="line.4163"></a>
-<span class="sourceLineNo">4164</span>        fs.exists(regionInfoFile));<a name="line.4164"></a>
-<span class="sourceLineNo">4165</span><a name="line.4165"></a>
-<span class="sourceLineNo">4166</span>    // Try to open the region<a name="line.4166"></a>
-<span class="sourceLineNo">4167</span>    region = HRegion.openHRegion(rootDir, hri, htd, null, CONF);<a name="line.4167"></a>
-<span class="sourceLineNo">4168</span>    assertEquals(regionDir, region.getRegionFileSystem().getRegionDir());<a name="line.4168"></a>
-<span class="sourceLineNo">4169</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.4169"></a>
-<span class="sourceLineNo">4170</span><a name="line.4170"></a>
-<span class="sourceLineNo">4171</span>    // Verify that the .regioninfo file is still there<a name="line.4171"></a>
-<span class="sourceLineNo">4172</span>    assertTrue(HRegionFileSystem.REGION_INFO_FILE + " should be present in the region dir",<a name="line.4172"></a>
-<span class="sourceLineNo">4173</span>        fs.exists(regionInfoFile));<a name="line.4173"></a>
-<span class="sourceLineNo">4174</span><a name="line.4174"></a>
-<span class="sourceLineNo">4175</span>    // Remove the .regioninfo file and verify is recreated on region open<a name="line.4175"></a>
-<span class="sourceLineNo">4176</span>    fs.delete(regionInfoFile, true);<a name="line.4176"></a>
-<span class="sourceLineNo">4177</span>    assertFalse(HRegionFileSystem.REGION_INFO_FILE + " should be removed from the region dir",<a name="line.4177"></a>
-<span class="sourceLineNo">4178</span>        fs.exists(regionInfoFile));<a name="line.4178"></a>
-<span class="sourceLineNo">4179</span><a name="line.4179"></a>
-<span class="sourceLineNo">4180</span>    region = HRegion.openHRegion(rootDir, hri, htd, null, CONF);<a name="line.4180"></a>
-<span class="sourceLineNo">4181</span>//    region = TEST_UTIL.openHRegion(hri, htd);<a name="line.4181"></a>
-<span class="sourceLineNo">4182</span>    assertEquals(regionDir, region.getRegionFileSystem().getRegionDir());<a name="line.4182"></a>
-<span class="sourceLineNo">4183</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.4183"></a>
+<span class="sourceLineNo">4162</span>    HRegionInfo hri = new HRegionInfo(htd.getTableName());<a name="line.4162"></a>
+<span class="sourceLineNo">4163</span><a name="line.4163"></a>
+<span class="sourceLineNo">4164</span>    // Create a region and skip the initialization (like CreateTableHandler)<a name="line.4164"></a>
+<span class="sourceLineNo">4165</span>    region = HBaseTestingUtility.createRegionAndWAL(hri, rootDir, CONF, htd, false);<a name="line.4165"></a>
+<span class="sourceLineNo">4166</span>    Path regionDir = region.getRegionFileSystem().getRegionDir();<a name="line.4166"></a>
+<span class="sourceLineNo">4167</span>    FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.4167"></a>
+<span class="sourceLineNo">4168</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.4168"></a>
+<span class="sourceLineNo">4169</span><a name="line.4169"></a>
+<span class="sourceLineNo">4170</span>    Path regionInfoFile = new Path(regionDir, HRegionFileSystem.REGION_INFO_FILE);<a name="line.4170"></a>
+<span class="sourceLineNo">4171</span><a name="line.4171"></a>
+<span class="sourceLineNo">4172</span>    // Verify that the .regioninfo file is present<a name="line.4172"></a>
+<span class="sourceLineNo">4173</span>    assertTrue(HRegionFileSystem.REGION_INFO_FILE + " should be present in the region dir",<a name="line.4173"></a>
+<span class="sourceLineNo">4174</span>        fs.exists(regionInfoFile));<a name="line.4174"></a>
+<span class="sourceLineNo">4175</span><a name="line.4175"></a>
+<span class="sourceLineNo">4176</span>    // Try to open the region<a name="line.4176"></a>
+<span class="sourceLineNo">4177</span>    region = HRegion.openHRegion(rootDir, hri, htd, null, CONF);<a name="line.4177"></a>
+<span class="sourceLineNo">4178</span>    assertEquals(regionDir, region.getRegionFileSystem().getRegionDir());<a name="line.4178"></a>
+<span class="sourceLineNo">4179</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.4179"></a>
+<span class="sourceLineNo">4180</span><a name="line.4180"></a>
+<span class="sourceLineNo">4181</span>    // Verify that the .regioninfo file is still there<a name="line.4181"></a>
+<span class="sourceLineNo">4182</span>    assertTrue(HRegionFileSystem.REGION_INFO_FILE + " should be present in the region dir",<a name="line.4182"></a>
+<span class="sourceLineNo">4183</span>        fs.exists(regionInfoFile));<a name="line.4183"></a>
 <span class="sourceLineNo">4184</span><a name="line.4184"></a>
-<span class="sourceLineNo">4185</span>    // Verify that the .regioninfo file is still there<a name="line.4185"></a>
-<span class="sourceLineNo">4186</span>    assertTrue(HRegionFileSystem.REGION_INFO_FILE + " should be present in the region dir",<a name="line.4186"></a>
-<span class="sourceLineNo">4187</span>        fs.exists(new Path(regionDir, HRegionFileSystem.REGION_INFO_FILE)));<a name="line.4187"></a>
-<span class="sourceLineNo">4188</span><a name="line.4188"></a>
-<span class="sourceLineNo">4189</span>    region = null;<a name="line.4189"></a>
-<span class="sourceLineNo">4190</span>  }<a name="line.4190"></a>
-<span class="sourceLineNo">4191</span><a name="line.4191"></a>
-<span class="sourceLineNo">4192</span>  /**<a name="line.4192"></a>
-<span class="sourceLineNo">4193</span>   * TestCase for increment<a name="line.4193"></a>
-<span class="sourceLineNo">4194</span>   */<a name="line.4194"></a>
-<span class="sourceLineNo">4195</span>  private static class Incrementer implements Runnable {<a name="line.4195"></a>
-<span class="sourceLineNo">4196</span>    private HRegion region;<a name="line.4196"></a>
-<span class="sourceLineNo">4197</span>    private final static byte[] incRow = Bytes.toBytes("incRow");<a name="line.4197"></a>
-<span class="sourceLineNo">4198</span>    private final static byte[] family = Bytes.toBytes("family");<a name="line.4198"></a>
-<span class="sourceLineNo">4199</span>    private final static byte[] qualifier = Bytes.toBytes("qualifier");<a name="line.4199"></a>
-<span class="sourceLineNo">4200</span>    private final static long ONE = 1L;<a name="line.4200"></a>
-<span class="sourceLineNo">4201</span>    private int incCounter;<a name="line.4201"></a>
-<span class="sourceLineNo">4202</span><a name="line.4202"></a>
-<span class="sourceLineNo">4203</span>    public Incrementer(HRegion region, int incCounter) {<a name="line.4203"></a>
-<span class="sourceLineNo">4204</span>      this.region = region;<a name="line.4204"></a>
-<span class="sourceLineNo">4205</span>      this.incCounter = incCounter;<a name="line.4205"></a>
-<span class="sourceLineNo">4206</span>    }<a name="line.4206"></a>
-<span class="sourceLineNo">4207</span><a name="line.4207"></a>
-<span class="sourceLineNo">4208</span>    @Override<a name="line.4208"></a>
-<span class="sourceLineNo">4209</span>    public void run() {<a name="line.4209"></a>
-<span class="sourceLineNo">4210</span>      int count = 0;<a name="line.4210"></a>
-<span class="sourceLineNo">4211</span>      while (count &lt; incCounter) {<a name="line.4211"></a>
-<span class="sourceLineNo">4212</span>        Increment inc = new Increment(incRow);<a name="line.4212"></a>
-<span class="sourceLineNo">4213</span>        inc.addColumn(family, qualifier, ONE);<a name="line.4213"></a>
-<span class="sourceLineNo">4214</span>        count++;<a name="line.4214"></a>
-<span class="sourceLineNo">4215</span>        try {<a name="line.4215"></a>
-<span class="sourceLineNo">4216</span>          region.increment(inc);<a name="line.4216"></a>
-<span class="sourceLineNo">4217</span>        } catch (IOException e) {<a name="line.4217"></a>
-<span class="sourceLineNo">4218</span>          LOG.info("Count=" + count + ", " + e);<a name="line.4218"></a>
-<span class="sourceLineNo">4219</span>          break;<a name="line.4219"></a>
-<span class="sourceLineNo">4220</span>        }<a name="line.4220"></a>
-<span class="sourceLineNo">4221</span>      }<a name="line.4221"></a>
-<span class="sourceLineNo">4222</span>    }<a name="line.4222"></a>
-<span class="sourceLineNo">4223</span>  }<a name="line.4223"></a>
-<span class="sourceLineNo">4224</span><a name="line.4224"></a>
-<span class="sourceLineNo">4225</span>  /**<a name="line.4225"></a>
-<span class="sourceLineNo">4226</span>   * Test case to check increment function with memstore flushing<a name="line.4226"></a>
-<span class="sourceLineNo">4227</span>   * @throws Exception<a name="line.4227"></a>
-<span class="sourceLineNo">4228</span>   */<a name="line.4228"></a>
-<span class="sourceLineNo">4229</span>  @Test<a name="line.4229"></a>
-<span class="sourceLineNo">4230</span>  public void testParallelIncrementWithMemStoreFlush() throws Exception {<a name="line.4230"></a>
-<span class="sourceLineNo">4231</span>    byte[] family = Incrementer.family;<a name="line.4231"></a>
-<span class="sourceLineNo">4232</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.4232"></a>
-<span class="sourceLineNo">4233</span>    final HRegion region = this.region;<a name="line.4233"></a>
-<span class="sourceLineNo">4234</span>    final AtomicBoolean incrementDone = new AtomicBoolean(false);<a name="line.4234"></a>
-<span class="sourceLineNo">4235</span>    Runnable flusher = new Runnable() {<a name="line.4235"></a>
-<span class="sourceLineNo">4236</span>      @Override<a name="line.4236"></a>
-<span class="sourceLineNo">4237</span>      public void run() {<a name="line.4237"></a>
-<span class="sourceLineNo">4238</span>        while (!incrementDone.get()) {<a name="line.4238"></a>
-<span class="sourceLineNo">4239</span>          try {<a name="line.4239"></a>
-<span class="sourceLineNo">4240</span>            region.flush(true);<a name="line.4240"></a>
-<span class="sourceLineNo">4241</span>          } catch (Exception e) {<a name="line.4241"></a>
-<span class="sourceLineNo">4242</span>            e.printStackTrace();<a name="line.4242"></a>
-<span class="sourceLineNo">4243</span>          }<a name="line.4243"></a>
-<span class="sourceLineNo">4244</span>        }<a name="line.4244"></a>
-<span class="sourceLineNo">4245</span>      }<a name="line.4245"></a>
-<span class="sourceLineNo">4246</span>    };<a name="line.4246"></a>
-<span class="sourceLineNo">4247</span><a name="line.4247"></a>
-<span class="sourceLineNo">4248</span>    // after all increment finished, the row will increment to 20*100 = 2000<a name="line.4248"></a>
-<span class="sourceLineNo">4249</span>    int threadNum = 20;<a name="line.4249"></a>
-<span class="sourceLineNo">4250</span>    int incCounter = 100;<a name="line.4250"></a>
-<span class="sourceLineNo">4251</span>    long expected = (long) threadNum * incCounter;<a name="line.4251"></a>
-<span class="sourceLineNo">4252</span>    Thread[] incrementers = new Thread[threadNum];<a name="line.4252"></a>
-<span class="sourceLineNo">4253</span>    Thread flushThread = new Thread(flusher);<a name="line.4253"></a>
-<span class="sourceLineNo">4254</span>    for (int i = 0; i &lt; threadNum; i++) {<a name="line.4254"></a>
-<span class="sourceLineNo">4255</span>      incrementers[i] = new Thread(new Incrementer(this.region, incCounter));<a name="line.4255"></a>
-<span class="sourceLineNo">4256</span>      incrementers[i].start();<a name="line.4256"></a>
-<span class="sourceLineNo">4257</span>    }<a name="line.4257"></a>
-<span class="sourceLineNo">4258</span>    flushThread.start();<a name="line.4258"></a>
-<span class="sourceLineNo">4259</span>    for (int i = 0; i &lt; threadNum; i++) {<a name="line.4259"></a>
-<span class="sourceLineNo">4260</span>      incrementers[i].join();<a name="line.4260"></a>
-<span class="sourceLineNo">4261</span>    }<a name="line.4261"></a>
-<span class="sourceLineNo">4262</span><a name="line.4262"></a>
-<span class="sourceLineNo">4263</span>    incrementDone.set(true);<a name="line.4263"></a>
-<span class="sourceLineNo">4264</span>    flushThread.join();<a name="line.4264"></a>
-<span class="sourceLineNo">4265</span><a name="line.4265"></a>
-<span class="sourceLineNo">4266</span>    Get get = new Get(Incrementer.incRow);<a name="line.4266"></a>
-<span class="sourceLineNo">4267</span>    get.addColumn(Incrementer.family, Incrementer.qualifier);<a name="line.4267"></a>
-<span class="sourceLineNo">4268</span>    get.readVersions(1);<a name="line.4268"></a>
-<span class="sourceLineNo">4269</span>    Result res = this.region.get(get);<a name="line.4269"></a>
-<span class="sourceLineNo">4270</span>    List&lt;Cell&gt; kvs = res.getColumnCells(Incrementer.family, Incrementer.qualifier);<a name="line.4270"></a>
-<span class="sourceLineNo">4271</span><a name="line.4271"></a>
-<span class="sourceLineNo">4272</span>    // we just got the latest version<a name="line.4272"></a>
-<span class="sourceLineNo">4273</span>    assertEquals(1, kvs.size());<a name="line.4273"></a>
-<span class="sourceLineNo">4274</span>    Cell kv = kvs.get(0);<a name="line.4274"></a>
-<span class="sourceLineNo">4275</span>    assertEquals(expected, Bytes.toLong(kv.getValueArray(), kv.getValueOffset()));<a name="line.4275"></a>
-<span class="sourceLineNo">4276</span>  }<a name="line.4276"></a>
-<span class="sourceLineNo">4277</span><a name="line.4277"></a>
-<span class="sourceLineNo">4278</span>  /**<a name="line.4278"></a>
-<span class="sourceLineNo">4279</span>   * TestCase for append<a name="line.4279"></a>
-<span class="sourceLineNo">4280</span>   */<a name="line.4280"></a>
-<span class="sourceLineNo">4281</span>  private static class Appender implements Runnable {<a name="line.4281"></a>
-<span class="sourceLineNo">4282</span>    private HRegion region;<a name="line.4282"></a>
-<span class="sourceLineNo">4283</span>    private final static byte[] appendRow = Bytes.toBytes("appendRow");<a name="line.4283"></a>
-<span class="sourceLineNo">4284</span>    private final static byte[] family = Bytes.toBytes("family");<a name="line.4284"></a>
-<span class="sourceLineNo">4285</span>    private final static byte[] qualifier = Bytes.toBytes("qualifier");<a name="line.4285"></a>
-<span class="sourceLineNo">4286</span>    private final static byte[] CHAR = Bytes.toBytes("a");<a name="line.4286"></a>
-<span class="sourceLineNo">4287</span>    private int appendCounter;<a name="line.4287"></a>
-<span class="sourceLineNo">4288</span><a name="line.4288"></a>
-<span class="sourceLineNo">4289</span>    public Appender(HRegion region, int appendCounter) {<a name="line.4289"></a>
-<span class="sourceLineNo">4290</span>      this.region = region;<a name="line.4290"></a>
-<span class="sourceLineNo">4291</span>      this.appendCounter = appendCounter;<a name="line.4291"></a>
-<span class="sourceLineNo">4292</span>    }<a name="line.4292"></a>
-<span class="sourceLineNo">4293</span><a name="line.4293"></a>
-<span class="sourceLineNo">4294</span>    @Override<a name="line.4294"></a>
-<span class="sourceLineNo">4295</span>    public void run() {<a name="line.4295"></a>
-<span class="sourceLineNo">4296</span>      int count = 0;<a name="line.4296"></a>
-<span class="sourceLineNo">4297</span>      while (count &lt; appendCounter) {<a name="line.4297"></a>
-<span class="sourceLineNo">4298</span>        Append app = new Append(appendRow);<a name="line.4298"></a>
-<span class="sourceLineNo">4299</span>        app.addColumn(family, qualifier, CHAR);<a name="line.4299"></a>
-<span class="sourceLineNo">4300</span>        count++;<a name="line.4300"></a>
-<span class="sourceLineNo">4301</span>        try {<a name="line.4301"></a>
-<span class="sourceLineNo">4302</span>          region.append(app);<a name="line.4302"></a>
-<span class="sourceLineNo">4303</span>        } catch (IOException e) {<a name="line.4303"></a>
-<span class="sourceLineNo">4304</span>          LOG.info("Count=" + count + ", max=" + appendCounter + ", " + e);<a name="line.4304"></a>
-<span class="sourceLineNo">4305</span>          break;<a name="line.4305"></a>
-<span class="sourceLineNo">4306</span>        }<a name="line.4306"></a>
-<span class="sourceLineNo">4307</span>      }<a name="line.4307"></a>
-<span class="sourceLineNo">4308</span>    }<a name="line.4308"></a>
-<span class="sourceLineNo">4309</span>  }<a name="line.4309"></a>
-<span class="sourceLineNo">4310</span><a name="line.4310"></a>
-<span class="sourceLineNo">4311</span>  /**<a name="line.4311"></a>
-<span class="sourceLineNo">4312</span>   * Test case to check append function with memstore flushing<a name="line.4312"></a>
-<span class="sourceLineNo">4313</span>   * @throws Exception<a name="line.4313"></a>
-<span class="sourceLineNo">4314</span>   */<a name="line.4314"></a>
-<span class="sourceLineNo">4315</span>  @Test<a name="line.4315"></a>
-<span class="sourceLineNo">4316</span>  public void testParallelAppendWithMemStoreFlush() throws Exception {<a name="line.4316"></a>
-<span class="sourceLineNo">4317</span>    byte[] family = Appender.family;<a name="line.4317"></a>
-<span class="sourceLineNo">4318</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.4318"></a>
-<span class="sourceLineNo">4319</span>    final HRegion region = this.region;<a name="line.4319"></a>
-<span class="sourceLineNo">4320</span>    final AtomicBoolean appendDone = new AtomicBoolean(false);<a name="line.4320"></a>
-<span class="sourceLineNo">4321</span>    Runnable flusher = new Runnable() {<a name="line.4321"></a>
-<span class="sourceLineNo">4322</span>      @Override<a name="line.4322"></a>
-<span class="sourceLineNo">4323</span>      public void run() {<a name="line.4323"></a>
-<span class="sourceLineNo">4324</span>        while (!appendDone.get()) {<a name="line.4324"></a>
-<span class="sourceLineNo">4325</span>          try {<a name="line.4325"></a>
-<span class="sourceLineNo">4326</span>            region.flush(true);<a name="line.4326"></a>
-<span class="sourceLineNo">4327</span>          } catch (Exception e) {<a name="line.4327"></a>
-<span class="sourceLineNo">4328</span>            e.printStackTrace();<a name="line.4328"></a>
-<span class="sourceLineNo">4329</span>          }<a name="line.4329"></a>
-<span class="sourceLineNo">4330</span>        }<a name="line.4330"></a>
-<span class="sourceLineNo">4331</span>      }<a name="line.4331"></a>
-<span class="sourceLineNo">4332</span>    };<a name="line.4332"></a>
-<span class="sourceLineNo">4333</span><a name="line.4333"></a>
-<span class="sourceLineNo">4334</span>    // After all append finished, the value will append to threadNum *<a name="line.4334"></a>
-<span class="sourceLineNo">4335</span>    // appendCounter Appender.CHAR<a name="line.4335"></a>
-<span class="sourceLineNo">4336</span>    int threadNum = 20;<a name="line.4336"></a>
-<span class="sourceLineNo">4337</span>    int appendCounter = 100;<a name="line.4337"></a>
-<span class="sourceLineNo">4338</span>    byte[] expected = new byte[threadNum * appendCounter];<a name="line.4338"></a>
-<span class="sourceLineNo">4339</span>    for (int i = 0; i &lt; threadNum * appendCounter; i++) {<a name="line.4339"></a>
-<span class="sourceLineNo">4340</span>      System.arraycopy(Appender.CHAR, 0, expected, i, 1);<a name="line.4340"></a>
-<span class="sourceLineNo">4341</span>    }<a name="line.4341"></a>
-<span class="sourceLineNo">4342</span>    Thread[] appenders = new Thread[threadNum];<a name="line.4342"></a>
-<span class="sourceLineNo">4343</span>    Thread flushThread = new Thread(flusher);<a name="line.4343"></a>
-<span class="sourceLineNo">4344</span>    for (int i = 0; i &lt; threadNum; i++) {<a name="line.4344"></a>
-<span class="sourceLineNo">4345</span>      appenders[i] = new Thread(new Appender(this.region, appendCounter));<a name="line.4345"></a>
-<span class="sourceLineNo">4346</span>      appenders[i].start();<a name="line.4346"></a>
-<span class="sourceLineNo">4347</span>    }<a name="line.4347"></a>
-<span class="sourceLineNo">4348</span>    flushThread.start();<a name="line.4348"></a>
-<span class="sourceLineNo">4349</span>    for (int i = 0; i &lt; threadNum; i++) {<a name="line.4349"></a>
-<span class="sourceLineNo">4350</span>      appenders[i].join();<a name="line.4350"></a>
+<span class="sourceLineNo">4185</span>    // Remove the .regioninfo file and verify is recreated on region open<a name="line.4185"></a>
+<span class="sourceLineNo">4186</span>    fs.delete(regionInfoFile, true);<a name="line.4186"></a>
+<span class="sourceLineNo">4187</span>    assertFalse(HRegionFileSystem.REGION_INFO_FILE + " should be removed from the region dir",<a name="line.4187"></a>
+<span class="sourceLineNo">4188</span>        fs.exists(regionInfoFile));<a name="line.4188"></a>
+<span class="sourceLineNo">4189</span><a name="line.4189"></a>
+<span class="sourceLineNo">4190</span>    region = HRegion.openHRegion(rootDir, hri, htd, null, CONF);<a name="line.4190"></a>
+<span class="sourceLineNo">4191</span>//    region = TEST_UTIL.openHRegion(hri, htd);<a name="line.4191"></a>
+<span class="sourceLineNo">4192</span>    assertEquals(regionDir, region.getRegionFileSystem().getRegionDir());<a name="line.4192"></a>
+<span class="sourceLineNo">4193</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.4193"></a>
+<span class="sourceLineNo">4194</span><a name="line.4194"></a>
+<span class="sourceLineNo">4195</span>    // Verify that the .regioninfo file is still there<a name="line.4195"></a>
+<span class="sourceLineNo">4196</span>    assertTrue(HRegionFileSystem.REGION_INFO_FILE + " should be present in the region dir",<a name="line.4196"></a>
+<span class="sourceLineNo">4197</span>        fs.exists(new Path(regionDir, HRegionFileSystem.REGION_INFO_FILE)));<a name="line.4197"></a>
+<span class="sourceLineNo">4198</span><a name="line.4198"></a>
+<span class="sourceLineNo">4199</span>    region = null;<a name="line.4199"></a>
+<span class="sourceLineNo">4200</span>  }<a name="line.4200"></a>
+<span class="sourceLineNo">4201</span><a name="line.4201"></a>
+<span class="sourceLineNo">4202</span>  /**<a name="line.4202"></a>
+<span class="sourceLineNo">4203</span>   * TestCase for increment<a name="line.4203"></a>
+<span class="sourceLineNo">4204</span>   */<a name="line.4204"></a>
+<span class="sourceLineNo">4205</span>  private static class Incrementer implements Runnable {<a name="line.4205"></a>
+<span class="sourceLineNo">4206</span>    private HRegion region;<a name="line.4206"></a>
+<span class="sourceLineNo">4207</span>    private final static byte[] incRow = Bytes.toBytes("incRow");<a name="line.4207"></a>
+<span class="sourceLineNo">4208</span>    private final static byte[] family = Bytes.toBytes("family");<a name="line.4208"></a>
+<span class="sourceLineNo">4209</span>    private final static byte[] qualifier = Bytes.toBytes("qualifier");<a name="line.4209"></a>
+<span class="sourceLineNo">4210</span>    private final static long ONE = 1L;<a name="line.4210"></a>
+<span class="sourceLineNo">4211</span>    private int incCounter;<a name="line.4211"></a>
+<span class="sourceLineNo">4212</span><a name="line.4212"></a>
+<span class="sourceLineNo">4213</span>    public Incrementer(HRegion region, int incCounter) {<a name="line.4213"></a>
+<span class="sourceLineNo">4214</span>      this.region = region;<a name="line.4214"></a>
+<span class="sourceLineNo">4215</span>      this.incCounter = incCounter;<a name="line.4215"></a>
+<span class="sourceLineNo">4216</span>    }<a name="line.4216"></a>
+<span class="sourceLineNo">4217</span><a name="line.4217"></a>
+<span class="sourceLineNo">4218</span>    @Override<a name="line.4218"></a>
+<span class="sourceLineNo">4219</span>    public void run() {<a name="line.4219"></a>
+<span class="sourceLineNo">4220</span>      int count = 0;<a name="line.4220"></a>
+<span class="sourceLineNo">4221</span>      while (count &lt; incCounter) {<a name="line.4221"></a>
+<span class="sourceLineNo">4222</span>        Increment inc = new Increment(incRow);<a name="line.4222"></a>
+<span class="sourceLineNo">4223</span>        inc.addColumn(family, qualifier, ONE);<a name="line.4223"></a>
+<span class="sourceLineNo">4224</span>        count++;<a name="line.4224"></a>
+<span class="sourceLineNo">4225</span>        try {<a name="line.4225"></a>
+<span class="sourceLineNo">4226</span>          region.increment(inc);<a name="line.4226"></a>
+<span class="sourceLineNo">4227</span>        } catch (IOException e) {<a name="line.4227"></a>
+<span class="sourceLineNo">4228</span>          LOG.info("Count=" + count + ", " + e);<a name="line.4228"></a>
+<span class="sourceLineNo">4229</span>          break;<a name="line.4229"></a>
+<span class="sourceLineNo">4230</span>        }<a name="line.4230"></a>
+<span class="sourceLineNo">4231</span>      }<a name="line.4231"></a>
+<span class="sourceLineNo">4232</span>    }<a name="line.4232"></a>
+<span class="sourceLineNo">4233</span>  }<a name="line.4233"></a>
+<span class="sourceLineNo">4234</span><a name="line.4234"></a>
+<span class="sourceLineNo">4235</span>  /**<a name="line.4235"></a>
+<span class="sourceLineNo">4236</span>   * Test case to check increment function with memstore flushing<a name="line.4236"></a>
+<span class="sourceLineNo">4237</span>   * @throws Exception<a name="line.4237"></a>
+<span class="sourceLineNo">4238</span>   */<a name="line.4238"></a>
+<span class="sourceLineNo">4239</span>  @Test<a name="line.4239"></a>
+<span class="sourceLineNo">4240</span>  public void testParallelIncrementWithMemStoreFlush() throws Exception {<a name="line.4240"></a>
+<span class="sourceLineNo">4241</span>    byte[] family = Incrementer.family;<a name="line.4241"></a>
+<span class="sourceLineNo">4242</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.4242"></a>
+<span class="sourceLineNo">4243</span>    final HRegion region = this.region;<a name="line.4243"></a>
+<span class="sourceLineNo">4244</span>    final AtomicBoolean incrementDone = new AtomicBoolean(false);<a name="line.4244"></a>
+<span class="sourceLineNo">4245</span>    Runnable flusher = new Runnable() {<a name="line.4245"></a>
+<span class="sourceLineNo">4246</span>      @Override<a name="line.4246"></a>
+<span class="sourceLineNo">4247</span>      public void run() {<a name="line.4247"></a>
+<span class="sourceLineNo">4248</span>        while (!incrementDone.get()) {<a name="line.4248"></a>
+<span class="sourceLineNo">4249</span>          try {<a name="line.4249"></a>
+<span class="sourceLineNo">4250</span>            region.flush(true);<a name="line.4250"></a>
+<span class="sourceLineNo">4251</span>          } catch (Exception e) {<a name="line.4251"></a>
+<span class="sourceLineNo">4252</span>            e.printStackTrace();<a name="line.4252"></a>
+<span class="sourceLineNo">4253</span>          }<a name="line.4253"></a>
+<span class="sourceLineNo">4254</span>        }<a name="line.4254"></a>
+<span class="sourceLineNo">4255</span>      }<a name="line.4255"></a>
+<span class="sourceLineNo">4256</span>    };<a name="line.4256"></a>
+<span class="sourceLineNo">4257</span><a name="line.4257"></a>
+<span class="sourceLineNo">4258</span>    // after all increment finished, the row will increment to 20*100 = 2000<a name="line.4258"></a>
+<span class="sourceLineNo">4259</span>    int threadNum = 20;<a name="line.4259"></a>
+<span class="sourceLineNo">4260</span>    int incCounter = 100;<a name="line.4260"></a>
+<span class="sourceLineNo">4261</span>    long expected = (long) threadNum * incCounter;<a name="line.4261"></a>
+<span class="sourceLineNo">4262</span>    Thread[] incrementers = new Thread[threadNum];<a name="line.4262"></a>
+<span class="sourceLineNo">4263</span>    Thread flushThread = new Thread(flusher);<a name="line.4263"></a>
+<span class="sourceLineNo">4264</span>    for (int i = 0; i &lt; threadNum; i++) {<a name="line.4264"></a>
+<span class="sourceLineNo">4265</span>      incrementers[i] = new Thread(new Incrementer(this.region, incCounter));<a name="line.4265"></a>
+<span class="sourceLineNo">4266</span>      incrementers[i].start();<a name="line.4266"></a>
+<span class="sourceLineNo">4267</span>    }<a name="line.4267"></a>
+<span class="sourceLineNo">4268</span>    flushThread.start();<a name="line.4268"></a>
+<span class="sourceLineNo">4269</span>    for (int i = 0; i &lt; threadNum; i++) {<a name="line.4269"></a>
+<span class="sourceLineNo">4270</span>      incrementers[i].join();<a name="line.4270"></a>
+<span class="sourceLineNo">4271</span>    }<a name="line.4271"></a>
+<span class="sourceLineNo">4272</span><a name="line.4272"></a>
+<span class="sourceLineNo">4273</span>    incrementDone.set(true);<a name="line.4273"></a>
+<span class="sourceLineNo">4274</span>    flushThread.join();<a name="line.4274"></a>
+<span class="sourceLineNo">4275</span><a name="line.4275"></a>
+<span class="sourceLineNo">4276</span>    Get get = new Get(Incrementer.incRow);<a name="line.4276"></a>
+<span class="sourceLineNo">4277</span>    get.addColumn(Incrementer.family, Incrementer.qualifier);<a name="line.4277"></a>
+<span class="sourceLineNo">4278</span>    get.readVersions(1);<a name="line.4278"></a>
+<span class="sourceLineNo">4279</span>    Result res = this.region.get(get);<a name="line.4279"></a>
+<span class="sourceLineNo">4280</span>    List&lt;Cell&gt; kvs = res.getColumnCells(Incrementer.family, Incrementer.qualifier);<a name="line.4280"></a>
+<span class="sourceLineNo">4281</span><a name="line.4281"></a>
+<span class="sourceLineNo">4282</span>    // we just got the latest version<a name="line.4282"></a>
+<span class="sourceLineNo">4283</span>    assertEquals(1, kvs.size());<a name="line.4283"></a>
+<span class="sourceLineNo">4284</span>    Cell kv = kvs.get(0);<a name="line.4284"></a>
+<span class="sourceLineNo">4285</span>    assertEquals(expected, Bytes.toLong(kv.getValueArray(), kv.getValueOffset()));<a name="line.4285"></a>
+<span class="sourceLineNo">4286</span>  }<a name="line.4286"></a>
+<span class="sourceLineNo">4287</span><a name="line.4287"></a>
+<span class="sourceLineNo">4288</span>  /**<a name="line.4288"></a>
+<span class="sourceLineNo">4289</span>   * TestCase for append<a name="line.4289"></a>
+<span class="sourceLineNo">4290</span>   */<a name="line.4290"></a>
+<span class="sourceLineNo">4291</span>  private static class Appender implements Runnable {<a name="line.4291"></a>
+<span class="sourceLineNo">4292</span>    private HRegion region;<a name="line.4292"></a>
+<span class="sourceLineNo">4293</span>    private final static byte[] appendRow = Bytes.toBytes("appendRow");<a name="line.4293"></a>
+<span class="sourceLineNo">4294</span>    private final static byte[] family = Bytes.toBytes("family");<a name="line.4294"></a>
+<span class="sourceLineNo">4295</span>    private final static byte[] qualifier = Bytes.toBytes("qualifier");<a name="line.4295"></a>
+<span class="sourceLineNo">4296</span>    private final static byte[] CHAR = Bytes.toBytes("a");<a name="line.4296"></a>
+<span class="sourceLineNo">4297</span>    private int appendCounter;<a name="line.4297"></a>
+<span class="sourceLineNo">4298</span><a name="line.4298"></a>
+<span class="sourceLineNo">4299</span>    public Appender(HRegion region, int appendCounter) {<a name="line.4299"></a>
+<span class="sourceLineNo">4300</span>      this.region = region;<a name="line.4300"></a>
+<span class="sourceLineNo">4301</span>      this.appendCounter = appendCounter;<a name="line.4301"></a>
+<span class="sourceLineNo">4302</span>    }<a name="line.4302"></a>
+<span class="sourceLineNo">4303</span><a name="line.4303"></a>
+<span class="sourceLineNo">4304</span>    @Override<a name="line.4304"></a>
+<span class="sourceLineNo">4305</span>    public void run() {<a name="line.4305"></a>
+<span class="sourceLineNo">4306</span>      int count = 0;<a name="line.4306"></a>
+<span class="sourceLineNo">4307</span>      while (count &lt; appendCounter) {<a name="line.4307"></a>
+<span class="sourceLineNo">4308</span>        Append app = new Append(appendRow);<a name="line.4308"></a>
+<span class="sourceLineNo">4309</span>        app.addColumn(family, qualifier, CHAR);<a name="line.4309"></a>
+<span class="sourceLineNo">4310</span>        count++;<a name="line.4310"></a>
+<span class="sourceLineNo">4311</span>        try {<a name="line.4311"></a>
+<span class="sourceLineNo">4312</span>          region.append(app);<a name="line.4312"></a>
+<span class="sourceLineNo">4313</span>        } catch (IOException e) {<a name="line.4313"></a>
+<span class="sourceLineNo">4314</span>          LOG.info("Count=" + count + ", max=" + appendCounter + ", " + e);<a name="line.4314"></a>
+<span class="sourceLineNo">4315</span>          break;<a name="line.4315"></a>
+<span class="sourceLineNo">4316</span>        }<a name="line.4316"></a>
+<span class="sourceLineNo">4317</span>      }<a name="line.4317"></a>
+<span class="sourceLineNo">4318</span>    }<a name="line.4318"></a>
+<span class="sourceLineNo">4319</span>  }<a name="line.4319"></a>
+<span class="sourceLineNo">4320</span><a name="line.4320"></a>
+<span class="sourceLineNo">4321</span>  /**<a name="line.4321"></a>
+<span class="sourceLineNo">4322</span>   * Test case to check append function with memstore flushing<a name="line.4322"></a>
+<span class="sourceLineNo">4323</span>   * @throws Exception<a name="line.4323"></a>
+<span class="sourceLineNo">4324</span>   */<a name="line.4324"></a>
+<span class="sourceLineNo">4325</span>  @Test<a name="line.4325"></a>
+<span class="sourceLineNo">4326</span>  public void testParallelAppendWithMemStoreFlush() throws Exception {<a name="line.4326"></a>
+<span class="sourceLineNo">4327</span>    byte[] family = Appender.family;<a name="line.4327"></a>
+<span class="sourceLineNo">4328</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.4328"></a>
+<span class="sourceLineNo">4329</span>    final HRegion region = this.region;<a name="line.4329"></a>
+<span class="sourceLineNo">4330</span>    final AtomicBoolean appendDone = new AtomicBoolean(false);<a name="line.4330"></a>
+<span class="sourceLineNo">4331</span>    Runnable flusher = new Runnable() {<a name="line.4331"></a>
+<span class="sourceLineNo">4332</span>      @Override<a name="line.4332"></a>
+<span class="sourceLineNo">4333</span>      public void run() {<a name="line.4333"></a>
+<span class="sourceLineNo">4334</span>        while (!appendDone.get()) {<a name="line.4334"></a>
+<span class="sourceLineNo">4335</span>          try {<a name="line.4335"></a>
+<span class="sourceLineNo">4336</span>            region.flush(true);<a name="line.4336"></a>
+<span class="sourceLineNo">4337</span>          } catch (Exception e) {<a name="line.4337"></a>
+<span class="sourceLineNo">4338</span>            e.printStackTrace();<a name="line.4338"></a>
+<span class="sourceLineNo">4339</span>          }<a name="line.4339"></a>
+<span class="sourceLineNo">4340</span>        }<a name="line.4340"></a>
+<span class="sourceLineNo">4341</span>      }<a name="line.4341"></a>
+<span class="sourceLineNo">4342</span>    };<a name="line.4342"></a>
+<span class="sourceLineNo">4343</span><a name="line.4343"></a>
+<span class="sourceLineNo">4344</span>    // After all append finished, the value will append to threadNum *<a name="line.4344"></a>
+<span class="sourceLineNo">4345</span>    // appendCounter Appender.CHAR<a name="line.4345"></a>
+<span class="sourceLineNo">4346</span>    int threadNum = 20;<a name="line.4346"></a>
+<span class="sourceLineNo">4347</span>    int appendCounter = 100;<a name="line.4347"></a>
+<span class="sourceLineNo">4348</span>    byte[] expected = new byte[threadNum * appendCounter];<a name="line.4348"></a>
+<span class="sourceLineNo">4349</span>    for (int i = 0; i &lt; threadNum * appendCounter; i++) {<a name="line.4349"></a>
+<span class="sourceLineNo">4350</span>      System.arraycopy(Appender.CHAR, 0, expected, i, 1);<a name="line.4350"></a>
 <span class="sourceLineNo">4351</span>    }<a name="line.4351"></a>
-<span class="sourceLineNo">4352</span><a name="line.4352"></a>
-<span class="sourceLineNo">4353</span>    appendDone.set(true);<a name="line.4353"></a>
-<span class="sourceLineNo">4354</span>    flushThread.join();<a name="line.4354"></a>
-<span class="sourceLineNo">4355</span><a name="line.4355"></a>
-<span class="sourceLineNo">4356</span>    Get get = new Get(Appender.appendRow);<a name="line.4356"></a>
-<span class="sourceLineNo">4357</span>    get.addColumn(Appender.family, Appender.qualifier);<a name="line.4357"></a>
-<span class="sourceLineNo">4358</span>    get.readVersions(1);<a name="line.4358"></a>
-<span class="sourceLineNo">4359</span>    Result res = this.region.get(get);<a name="line.4359"></a>
-<span class="sourceLineNo">4360</span>    List&lt;Cell&gt; kvs = res.getColumnCells(Appender.family, Appender.qualifier);<a name="line.4360"></a>
-<span class="sourceLineNo">4361</span><a name="line.4361"></a>
-<span class="sourceLineNo">4362</span>    // we just got the latest version<a name="line.4362"></a>
-<span class="sourceLineNo">4363</span>    assertEquals(1, kvs.size());<a name="line.4363"></a>
-<span class="sourceLineNo">4364</span>    Cell kv = kvs.get(0);<a name="line.4364"></a>
-<span class="sourceLineNo">4365</span>    byte[] appendResult = new byte[kv.getValueLength()];<a name="line.4365"></a>
-<span class="sourceLineNo">4366</span>    System.arraycopy(kv.getValueArray(), kv.getValueOffset(), appendResult, 0, kv.getValueLength());<a name="line.4366"></a>
-<span class="sourceLineNo">4367</span>    assertArrayEquals(expected, appendResult);<a name="line.4367"></a>
-<span class="sourceLineNo">4368</span>  }<a name="line.4368"></a>
-<span class="sourceLineNo">4369</span><a name="line.4369"></a>
-<span class="sourceLineNo">4370</span>  /**<a name="line.4370"></a>
-<span class="sourceLineNo">4371</span>   * Test case to check put function with memstore flushing for same row, same ts<a name="line.4371"></a>
-<span class="sourceLineNo">4372</span>   * @throws Exception<a name="line.4372"></a>
-<span class="sourceLineNo">4373</span>   */<a name="line.4373"></a>
-<span class="sourceLineNo">4374</span>  @Test<a name="line.4374"></a>
-<span class="sourceLineNo">4375</span>  public void testPutWithMemStoreFlush() throws Exception {<a name="line.4375"></a>
-<span class="sourceLineNo">4376</span>    byte[] family = Bytes.toBytes("family");<a name="line.4376"></a>
-<span class="sourceLineNo">4377</span>    byte[] qualifier = Bytes.toBytes("qualifier");<a name="line.4377"></a>
-<span class="sourceLineNo">4378</span>    byte[] row = Bytes.toBytes("putRow");<a name="line.4378"></a>
-<span class="sourceLineNo">4379</span>    byte[] value = null;<a name="line.4379"></a>
-<span class="sourceLineNo">4380</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.4380"></a>
-<span class="sourceLineNo">4381</span>    Put put = null;<a name="line.4381"></a>
-<span class="sourceLineNo">4382</span>    Get get = null;<a name="line.4382"></a>
-<span class="sourceLineNo">4383</span>    List&lt;Cell&gt; kvs = null;<a name="line.4383"></a>
-<span class="sourceLineNo">4384</span>    Result res = null;<a name="line.4384"></a>
-<span class="sourceLineNo">4385</span><a name="line.4385"></a>
-<span class="sourceLineNo">4386</span>    put = new Put(row);<a name="line.4386"></a>
-<span class="sourceLineNo">4387</span>    value = Bytes.toBytes("value0");<a name="line.4387"></a>
-<span class="sourceLineNo">4388</span>    put.addColumn(family, qualifier, 1234567L, value);<a name="line.4388"></a>
-<span class="sourceLineNo">4389</span>    region.put(put);<a name="line.4389"></a>
-<span class="sourceLineNo">4390</span>    get = new Get(row);<a name="line.4390"></a>
-<span class="sourceLineNo">4391</span>    get.addColumn(family, qualifier);<a name="line.4391"></a>
-<span class="sourceLineNo">4392</span>    get.readAllVersions();<a name="line.4392"></a>
-<span class="sourceLineNo">4393</span>    res = this.region.get(get);<a name="line.4393"></a>
-<span class="sourceLineNo">4394</span>    kvs = res.getColumnCells(family, qualifier);<a name="line.4394"></a>
-<span class="sourceLineNo">4395</span>    assertEquals(1, kvs.size());<a name="line.4395"></a>
-<span class="sourceLineNo">4396</span>    assertArrayEquals(Bytes.toBytes("value0"), CellUtil.cloneValue(kvs.get(0)));<a name="line.4396"></a>
-<span class="sourceLineNo">4397</span><a name="line.4397"></a>
-<span class="sourceLineNo">4398</span>    region.flush(true);<a name="line.4398"></a>
-<span class="sourceLineNo">4399</span>    get = new Get(row);<a name="line.4399"></a>
-<span class="sourceLineNo">4400</span>    get.addColumn(family, qualifier);<a name="line.4400"></a>
-<span class="sourceLineNo">4401</span>    get.readAllVersions();<a name="line.4401"></a>
-<span class="sourceLineNo">4402</span>    res = this.region.get(get);<a name="line.4402"></a>
-<span class="sourceLineNo">4403</span>    kvs = res.getColumnCells(family, qualifier);<a name="line.4403"></a>
-<span class="sourceLineNo">4404</span>    assertEquals(1, kvs.size());<a name="line.4404"></a>
-<span class="sourceLineNo">4405</span>    assertArrayEquals(Bytes.toBytes("value0"), CellUtil.cloneValue(kvs.get(0)));<a name="line.4405"></a>
-<span class="sourceLineNo">4406</span><a name="line.4406"></a>
-<span class="sourceLineNo">4407</span>    put = new Put(row);<a name="line.4407"></a>
-<span class="sourceLineNo">4408</span>    value = Bytes.toBytes("value1");<a name="line.4408"></a>
-<span class="sourceLineNo">4409</span>    put.addColumn(family, qualifier, 1234567L, value);<a name="line.4409"></a>
-<span class="sourceLineNo">4410</span>    region.put(put);<a name="line.4410"></a>
-<span class="sourceLineNo">4411</span>    get = new Get(row);<a name="line.4411"></a>
-<span class="sourceLineNo">4412</span>    get.addColumn(family, qualifier);<a name="line.4412"></a>
-<span class="sourceLineNo">4413</span>    get.readAllVersions();<a name="line.4413"></a>
-<span class="sourceLineNo">4414</span>    res = this.region.get(get);<a name="line.4414"></a>
-<span class="sourceLineNo">4415</span>    kvs = res.getColumnCells(family, qualifier);<a name="line.4415"></a>
-<span class="sourceLineNo">4416</span>    assertEquals(1, kvs.size());<a name="line.4416"></a>
-<span class="sourceLineNo">4417</span>    assertArrayEquals(Bytes.toBytes("value1"), CellUtil.cloneValue(kvs.get(0)));<a name="line.4417"></a>
-<span class="sourceLineNo">4418</span><a name="line.4418"></a>
-<span class="sourceLineNo">4419</span>    region.flush(true);<a name="line.4419"></a>
-<span class="sourceLineNo">4420</span>    get = new Get(row);<a name="line.4420"></a>
-<span class="sourceLineNo">4421</span>    get.addColumn(family, qualifier);<a name="line.4421"></a>
-<span class="sourceLineNo">4422</span>    get.readAllVersions();<a name="line.4422"></a>
-<span class="sourceLineNo">4423</span>    res = this.region.get(get);<a name="line.4423"></a>
-<span class="sourceLineNo">4424</span>    kvs = res.getColumnCells(family, qualifier);<a name="line.4424"></a>
-<span class="sourceLineNo">4425</span>    assertEquals(1, kvs.size());<a name="line.4425"></a>
-<span class="sourceLineNo">4426</span>    assertArrayEquals(Bytes.toBytes("value1"), CellUtil.cloneValue(kvs.get(0)));<a name="line.4426"></a>
-<span class="sourceLineNo">4427</span>  }<a name="line.4427"></a>
+<span class="sourceLineNo">4352</span>    Thread[] appenders = new Thread[threadNum];<a name="line.4352"></a>
+<span class="sourceLineNo">4353</span>    Thread flushThread = new Thread(flusher);<a name="line.4353"></a>
+<span class="sourceLineNo">4354</span>    for (int i = 0; i &lt; threadNum; i++) {<a name="line.4354"></a>
+<span class="sourceLineNo">4355</span>      appenders[i] = new Thread(new Appender(this.region, appendCounter));<a name="line.4355"></a>
+<span class="sourceLineNo">4356</span>      appenders[i].start();<a name="line.4356"></a>
+<span class="sourceLineNo">4357</span>    }<a name="line.4357"></a>
+<span class="sourceLineNo">4358</span>    flushThread.start();<a name="line.4358"></a>
+<span class="sourceLineNo">4359</span>    for (int i = 0; i &lt; threadNum; i++) {<a name="line.4359"></a>
+<span class="sourceLineNo">4360</span>      appenders[i].join();<a name="line.4360"></a>
+<span class="sourceLineNo">4361</span>    }<a name="line.4361"></a>
+<span class="sourceLineNo">4362</span><a name="line.4362"></a>
+<span class="sourceLineNo">4363</span>    appendDone.set(true);<a name="line.4363"></a>
+<span class="sourceLineNo">4364</span>    flushThread.join();<a name="line.4364"></a>
+<span class="sourceLineNo">4365</span><a name="line.4365"></a>
+<span class="sourceLineNo">4366</span>    Get get = new Get(Appender.appendRow);<a name="line.4366"></a>
+<span class="sourceLineNo">4367</span>    get.addColumn(Appender.family, Appender.qualifier);<a name="line.4367"></a>
+<span class="sourceLineNo">4368</span>    get.readVersions(1);<a name="line.4368"></a>
+<span class="sourceLineNo">4369</span>    Result res = this.region.get(get);<a name="line.4369"></a>
+<span class="sourceLineNo">4370</span>    List&lt;Cell&gt; kvs = res.getColumnCells(Appender.family, Appender.qualifier);<a name="line.4370"></a>
+<span class="sourceLineNo">4371</span><a name="line.4371"></a>
+<span class="sourceLineNo">4372</span>    // we just got the latest version<a name="line.4372"></a>
+<span class="sourceLineNo">4373</span>    assertEquals(1, kvs.size());<a name="line.4373"></a>
+<span class="sourceLineNo">4374</span>    Cell kv = kvs.get(0);<a name="line.4374"></a>
+<span class="sourceLineNo">4375</span>    byte[] appendResult = new byte[kv.getValueLength()];<a name="line.4375"></a>
+<span class="sourceLineNo">4376</span>    System.arraycopy(kv.getValueArray(), kv.getValueOffset(), appendResult, 0, kv.getValueLength());<a name="line.4376"></a>
+<span class="sourceLineNo">4377</span>    assertArrayEquals(expected, appendResult);<a name="line.4377"></a>
+<span class="sourceLineNo">4378</span>  }<a name="line.4378"></a>
+<span class="sourceLineNo">4379</span><a name="line.4379"></a>
+<span class="sourceLineNo">4380</span>  /**<a name="line.4380"></a>
+<span class="sourceLineNo">4381</span>   * Test case to check put function with memstore flushing for same row, same ts<a name="line.4381"></a>
+<span class="sourceLineNo">4382</span>   * @throws Exception<a name="line.4382"></a>
+<span class="sourceLineNo">4383</span>   */<a name="line.4383"></a>
+<span class="sourceLineNo">4384</span>  @Test<a name="line.4384"></a>
+<span class="sourceLineNo">4385</span>  public void testPutWithMemStoreFlush() throws Exception {<a name="line.4385"></a>
+<span class="sourceLineNo">4386</span>    byte[] family = Bytes.toBytes("family");<a name="line.4386"></a>
+<span class="sourceLineNo">4387</span>    byte[] qualifier = Bytes.toBytes("qualifier");<a name="line.4387"></a>
+<span class="sourceLineNo">4388</span>    byte[] row = Bytes.toBytes("putRow");<a name="line.4388"></a>
+<span class="sourceLineNo">4389</span>    byte[] value = null;<a name="line.4389"></a>
+<span class="sourceLineNo">4390</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.4390"></a>
+<span class="sourceLineNo">4391</span>    Put put = null;<a name="line.4391"></a>
+<span class="sourceLineNo">4392</span>    Get get = null;<a name="line.4392"></a>
+<span class="sourceLineNo">4393</span>    List&lt;Cell&gt; kvs = null;<a name="line.4393"></a>
+<span class="sourceLineNo">4394</span>    Result res = null;<a name="line.4394"></a>
+<span class="sourceLineNo">4395</span><a name="line.4395"></a>
+<span class="sourceLineNo">4396</span>    put = new Put(row);<a name="line.4396"></a>
+<span class="sourceLineNo">4397</span>    value = Bytes.toBytes("value0");<a name="line.4397"></a>
+<span class="sourceLineNo">4398</span>    put.addColumn(family, qualifier, 1234567L, value);<a name="line.4398"></a>
+<span class="sourceLineNo">4399</span>    region.put(put);<a name="line.4399"></a>
+<span class="sourceLineNo">4400</span>    get = new Get(row);<a name="line.4400"></a>
+<span class="sourceLineNo">4401</span>    get.addColumn(family, qualifier);<a name="line.4401"></a>
+<span class="sourceLineNo">4402</span>    get.readAllVersions();<a name="line.4402"></a>
+<span class="sourceLineNo">4403</span>    res = this.region.get(get);<a name="line.4403"></a>
+<span class="sourceLineNo">4404</span>    kvs = res.getColumnCells(family, qualifier);<a name="line.4404"></a>
+<span class="sourceLineNo">4405</span>    assertEquals(1, kvs.size());<a name="line.4405"></a>
+<span class="sourceLineNo">4406</span>    assertArrayEquals(Bytes.toBytes("value0"), CellUtil.cloneValue(kvs.get(0)));<a name="line.4406"></a>
+<span class="sourceLineNo">4407</span><a name="line.4407"></a>
+<span class="sourceLineNo">4408</span>    region.flush(true);<a name="line.4408"></a>
+<span class="sourceLineNo">4409</span>    get = new Get(row);<a name="line.4409"></a>
+<span class="sourceLineNo">4410</span>    get.addColumn(family, qualifier);<a name="line.4410"></a>
+<span class="sourceLineNo">4411</span>    get.readAllVersions();<a name="line.4411"></a>
+<span class="sourceLineNo">4412</span>    res = this.region.get(get);<a name="line.4412"></a>
+<span class="sourceLineNo">4413</span>    kvs = res.getColumnCells(family, qualifier);<a name="line.4413"></a>
+<span class="sourceLineNo">4414</span>    assertEquals(1, kvs.size());<a name="line.4414"></a>
+<span class="sourceLineNo">4415</span>    assertArrayEquals(Bytes.toBytes("value0"), CellUtil.cloneValue(kvs.get(0)));<a name="line.4415"></a>
+<span class="sourceLineNo">4416</span><a name="line.4416"></a>
+<span class="sourceLineNo">4417</span>    put = new Put(row);<a name="line.4417"></a>
+<span class="sourceLineNo">4418</span>    value = Bytes.toBytes("value1");<a name="line.4418"></a>
+<span class="sourceLineNo">4419</span>    put.addColumn(family, qualifier, 1234567L, value);<a name="line.4419"></a>
+<span class="sourceLineNo">4420</span>    region.put(put);<a name="line.4420"></a>
+<span class="sourceLineNo">4421</span>    get = new Get(row);<a name="line.4421"></a>
+<span class="sourceLineNo">4422</span>    get.addColumn(family, qualifier);<a name="line.4422"></a>
+<span class="sourceLineNo">4423</span>    get.readAllVersions();<a name="line.4423"></a>
+<span class="sourceLineNo">4424</span>    res = this.region.get(get);<a name="line.4424"></a>
+<span class="sourceLineNo">4425</span>    kvs = res.getColumnCells(family, qualifier);<a name="line.4425"></a>
+<span class="sourceLineNo">4426</span>    assertEquals(1, kvs.size());<a name="line.4426"></a>
+<span class="sourceLineNo">4427</span>    assertArrayEquals(Bytes.toBytes("value1"), CellUtil.cloneValue(kvs.get(0)));<a name="line.4427"></a>
 <span class="sourceLineNo">4428</span><a name="line.4428"></a>
-<span class="sourceLineNo">4429</span>  @Test<a name="line.4429"></a>
-<span class="sourceLineNo">4430</span>  public void testDurability() throws Exception {<a name="line.4430"></a>
-<span class="sourceLineNo">4431</span>    // there are 5 x 5 cases:<a name="line.4431"></a>
-<span class="sourceLineNo">4432</span>    // table durability(SYNC,FSYNC,ASYC,SKIP,USE_DEFAULT) x mutation<a name="line.4432"></a>
-<span class="sourceLineNo">4433</span>    // durability(SYNC,FSYNC,ASYC,SKIP,USE_DEFAULT)<a name="line.4433"></a>
-<span class="sourceLineNo">4434</span><a name="line.4434"></a>
-<span class="sourceLineNo">4435</span>    // expected cases for append and sync wal<a name="line.4435"></a>
-<span class="sourceLineNo">4436</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4436"></a>
-<span class="sourceLineNo">4437</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4437"></a>
-<span class="sourceLineNo">4438</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.USE_DEFAULT, 0, true, true, false);<a name="line.4438"></a>
-<span class="sourceLineNo">4439</span><a name="line.4439"></a>
-<span class="sourceLineNo">4440</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4440"></a>
-<span class="sourceLineNo">4441</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4441"></a>
-<span class="sourceLineNo">4442</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.USE_DEFAULT, 0, true, true, false);<a name="line.4442"></a>
-<span class="sourceLineNo">4443</span><a name="line.4443"></a>
-<span class="sourceLineNo">4444</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4444"></a>
-<span class="sourceLineNo">4445</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4445"></a>
-<span class="sourceLineNo">4446</span><a name="line.4446"></a>
-<span class="sourceLineNo">4447</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4447"></a>
-<span class="sourceLineNo">4448</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4448"></a>
+<span class="sourceLineNo">4429</span>    region.flush(true);<a name="line.4429"></a>
+<span class="sourceLineNo">4430</span>    get = new Get(row);<a name="line.4430"></a>
+<span class="sourceLineNo">4431</span>    get.addColumn(family, qualifier);<a name="line.4431"></a>
+<span class="sourceLineNo">4432</span>    get.readAllVersions();<a name="line.4432"></a>
+<span class="sourceLineNo">4433</span>    res = this.region.get(get);<a name="line.4433"></a>
+<span class="sourceLineNo">4434</span>    kvs = res.getColumnCells(family, qualifier);<a name="line.4434"></a>
+<span class="sourceLineNo">4435</span>    assertEquals(1, kvs.size());<a name="line.4435"></a>
+<span class="sourceLineNo">4436</span>    assertArrayEquals(Bytes.toBytes("value1"), CellUtil.cloneValue(kvs.get(0)));<a name="line.4436"></a>
+<span class="sourceLineNo">4437</span>  }<a name="line.4437"></a>
+<span class="sourceLineNo">4438</span><a name="line.4438"></a>
+<span class="sourceLineNo">4439</span>  @Test<a name="line.4439"></a>
+<span class="sourceLineNo">4440</span>  public void testDurability() throws Exception {<a name="line.4440"></a>
+<span class="sourceLineNo">4441</span>    // there are 5 x 5 cases:<a name="line.4441"></a>
+<span class="sourceLineNo">4442</span>    // table durability(SYNC,FSYNC,ASYC,SKIP,USE_DEFAULT) x mutation<a name="line.4442"></a>
+<span class="sourceLineNo">4443</span>    // durability(SYNC,FSYNC,ASYC,SKIP,USE_DEFAULT)<a name="line.4443"></a>
+<span class="sourceLineNo">4444</span><a name="line.4444"></a>
+<span class="sourceLineNo">4445</span>    // expected cases for append and sync wal<a name="line.4445"></a>
+<span class="sourceLineNo">4446</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4446"></a>
+<span class="sourceLineNo">4447</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4447"></a>
+<span class="sourceLineNo">4448</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.USE_DEFAULT, 0, true, true, false);<a name="line.4448"></a>
 <span class="sourceLineNo">4449</span><a name="line.4449"></a>
-<span class="sourceLineNo">4450</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4450"></a>
-<span class="sourceLineNo">4451</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4451"></a>
-<span class="sourceLineNo">4452</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.USE_DEFAULT, 0, true, true, false);<a name="line.4452"></a>
+<span class="sourceLineNo">4450</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4450"></a>
+<span class="sourceLineNo">4451</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4451"></a>
+<span class="sourceLineNo">4452</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.USE_DEFAULT, 0, true, true, false);<a name="line.4452"></a>
 <span class="sourceLineNo">4453</span><a name="line.4453"></a>
-<span class="sourceLineNo">4454</span>    // expected cases for async wal<a name="line.4454"></a>
-<span class="sourceLineNo">4455</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4455"></a>
-<span class="sourceLineNo">4456</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4456"></a>
-<span class="sourceLineNo">4457</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4457"></a>
-<span class="sourceLineNo">4458</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4458"></a>
-<span class="sourceLineNo">4459</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4459"></a>
-<span class="sourceLineNo">4460</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.USE_DEFAULT, 0, true, false, false);<a name="line.4460"></a>
-<span class="sourceLineNo">4461</span><a name="line.4461"></a>
-<span class="sourceLineNo">4462</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4462"></a>
-<span class="sourceLineNo">4463</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4463"></a>
-<span class="sourceLineNo">4464</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4464"></a>
-<span class="sourceLineNo">4465</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4465"></a>
-<span class="sourceLineNo">4466</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4466"></a>
-<span class="sourceLineNo">4467</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.USE_DEFAULT, 5000, true, false, true);<a name="line.4467"></a>
-<span class="sourceLineNo">4468</span><a name="line.4468"></a>
-<span class="sourceLineNo">4469</span>    // expect skip wal cases<a name="line.4469"></a>
-<span class="sourceLineNo">4470</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4470"></a>
-<span class="sourceLineNo">4471</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4471"></a>
-<span class="sourceLineNo">4472</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4472"></a>
-<span class="sourceLineNo">4473</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4473"></a>
-<span class="sourceLineNo">4474</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4474"></a>
-<span class="sourceLineNo">4475</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.USE_DEFAULT, 0, false, false, false);<a name="line.4475"></a>
-<span class="sourceLineNo">4476</span><a name="line.4476"></a>
-<span class="sourceLineNo">4477</span>  }<a name="line.4477"></a>
+<span class="sourceLineNo">4454</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4454"></a>
+<span class="sourceLineNo">4455</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4455"></a>
+<span class="sourceLineNo">4456</span><a name="line.4456"></a>
+<span class="sourceLineNo">4457</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4457"></a>
+<span class="sourceLineNo">4458</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4458"></a>
+<span class="sourceLineNo">4459</span><a name="line.4459"></a>
+<span class="sourceLineNo">4460</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4460"></a>
+<span class="sourceLineNo">4461</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4461"></a>
+<span class="sourceLineNo">4462</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.USE_DEFAULT, 0, true, true, false);<a name="line.4462"></a>
+<span class="sourceLineNo">4463</span><a name="line.4463"></a>
+<span class="sourceLineNo">4464</span>    // expected cases for async wal<a name="line.4464"></a>
+<span class="sourceLineNo">4465</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4465"></a>
+<span class="sourceLineNo">4466</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4466"></a>
+<span class="sourceLineNo">4467</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4467"></a>
+<span class="sourceLineNo">4468</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4468"></a>
+<span class="sourceLineNo">4469</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4469"></a>
+<span class="sourceLineNo">4470</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.USE_DEFAULT, 0, true, false, false);<a name="line.4470"></a>
+<span class="sourceLineNo">4471</span><a name="line.4471"></a>
+<span class="sourceLineNo">4472</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4472"></a>
+<span class="sourceLineNo">4473</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4473"></a>
+<span class="sourceLineNo">4474</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4474"></a>
+<span class="sourceLineNo">4475</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4475"></a>
+<span class="sourceLineNo">4476</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4476"></a>
+<span class="sourceLineNo">4477</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.USE_DEFAULT, 5000, true, false, true);<a name="line.4477"></a>
 <span class="sourceLineNo">4478</span><a name="line.4478"></a>
-<span class="sourceLineNo">4479</span>  private void durabilityTest(String method, Durability tableDurability,<a name="line.4479"></a>
-<span class="sourceLineNo">4480</span>      Durability mutationDurability, long timeout, boolean expectAppend, final boolean expectSync,<a name="line.4480"></a>
-<span class="sourceLineNo">4481</span>      final boolean expectSyncFromLogSyncer) throws Exception {<a name="line.4481"></a>
-<span class="sourceLineNo">4482</span>    Configuration conf = HBaseConfiguration.create(CONF);<a name="line.4482"></a>
-<span class="sourceLineNo">4483</span>    method = method + "_" + tableDurability.name() + "_" + mutationDurability.name();<a name="line.4483"></a>
-<span class="sourceLineNo">4484</span>    byte[] family = Bytes.toBytes("family");<a name="line.4484"></a>
-<span class="sourceLineNo">4485</span>    Path logDir = new Path(new Path(dir + method), "log");<a name="line.4485"></a>
-<span class="sourceLineNo">4486</span>    final Configuration walConf = new Configuration(conf);<a name="line.4486"></a>
-<span class="sourceLineNo">4487</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.4487"></a>
-<span class="sourceLineNo">4488</span>    // XXX: The spied AsyncFSWAL can not work properly because of a Mockito defect that can not<a name="line.4488"></a>
-<span class="sourceLineNo">4489</span>    // deal with classes which have a field of an inner class. See discussions in HBASE-15536.<a name="line.4489"></a>
-<span class="sourceLineNo">4490</span>    walConf.set(WALFactory.WAL_PROVIDER, "filesystem");<a name="line.4490"></a>
-<span class="sourceLineNo">4491</span>    final WALFactory wals = new WALFactory(walConf, TEST_UTIL.getRandomUUID().toString());<a name="line.4491"></a>
-<span class="sourceLineNo">4492</span>    final WAL wal = spy(wals.getWAL(RegionInfoBuilder.newBuilder(tableName).build()));<a name="line.4492"></a>
-<span class="sourceLineNo">4493</span>    this.region = initHRegion(tableName, HConstants.EMPTY_START_ROW,<a name="line.4493"></a>
-<span class="sourceLineNo">4494</span>        HConstants.EMPTY_END_ROW, false, tableDurability, wal,<a name="line.4494"></a>
-<span class="sourceLineNo">4495</span>        new byte[][] { family });<a name="line.4495"></a>
-<span class="sourceLineNo">4496</span><a name="line.4496"></a>
-<span class="sourceLineNo">4497</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.4497"></a>
-<span class="sourceLineNo">4498</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.4498"></a>
-<span class="sourceLineNo">4499</span>    put.setDurability(mutationDurability);<a name="line.4499"></a>
-<span class="sourceLineNo">4500</span>    region.put(put);<a name="line.4500"></a>
-<span class="sourceLineNo">4501</span><a name="line.4501"></a>
-<span class="sourceLineNo">4502</span>    //verify append called or not<a name="line.4502"></a>
-<span class="sourceLineNo">4503</span>    verify(wal, expectAppend ? times(1) : never())<a name="line.4503"></a>
-<span class="sourceLineNo">4504</span>      .append((HRegionInfo)any(), (WALKeyImpl)any(),<a name="line.4504"></a>
-<span class="sourceLineNo">4505</span>          (WALEdit)any(), Mockito.anyBoolean());<a name="line.4505"></a>
+<span class="sourceLineNo">4479</span>    // expect skip wal cases<a name="line.4479"></a>
+<span class="sourceLineNo">4480</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4480"></a>
+<span class="sourceLineNo">4481</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4481"></a>
+<span class="sourceLineNo">4482</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4482"></a>
+<span class="sourceLineNo">4483</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4483"></a>
+<span class="sourceLineNo">4484</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4484"></a>
+<span class="sourceLineNo">4485</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.USE_DEFAULT, 0, false, false, false);<a name="line.4485"></a>
+<span class="sourceLineNo">4486</span><a name="line.4486"></a>
+<span class="sourceLineNo">4487</span>  }<a name="line.4487"></a>
+<span class="sourceLineNo">4488</span><a name="line.4488"></a>
+<span class="sourceLineNo">4489</span>  private void durabilityTest(String method, Durability tableDurability,<a name="line.4489"></a>
+<span class="sourceLineNo">4490</span>      Durability mutationDurability, long timeout, boolean expectAppend, final boolean expectSync,<a name="line.4490"></a>
+<span class="sourceLineNo">4491</span>      final boolean expectSyncFromLogSyncer) throws Exception {<a name="line.4491"></a>
+<span class="sourceLineNo">4492</span>    Configuration conf = HBaseConfiguration.create(CONF);<a name="line.4492"></a>
+<span class="sourceLineNo">4493</span>    method = method + "_" + tableDurability.name() + "_" + mutationDurability.name();<a name="line.4493"></a>
+<span class="sourceLineNo">4494</span>    byte[] family = Bytes.toBytes("family");<a name="line.4494"></a>
+<span class="sourceLineNo">4495</span>    Path logDir = new Path(new Path(dir + method), "log");<a name="line.4495"></a>
+<span class="sourceLineNo">4496</span>    final Configuration walConf = new Configuration(conf);<a name="line.4496"></a>
+<span class="sourceLineNo">4497</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.4497"></a>
+<span class="sourceLineNo">4498</span>    // XXX: The spied AsyncFSWAL can not work properly because of a Mockito defect that can not<a name="line.4498"></a>
+<span class="sourceLineNo">4499</span>    // deal with classes which have a field of an inner class. See discussions in HBASE-15536.<a name="line.4499"></a>
+<span class="sourceLineNo">4500</span>    walConf.set(WALFactory.WAL_PROVIDER, "filesystem");<a name="line.4500"></a>
+<span class="sourceLineNo">4501</span>    final WALFactory wals = new WALFactory(walConf, TEST_UTIL.getRandomUUID().toString());<a name="line.4501"></a>
+<span class="sourceLineNo">4502</span>    final WAL wal = spy(wals.getWAL(RegionInfoBuilder.newBuilder(tableName).build()));<a name="line.4502"></a>
+<span class="sourceLineNo">4503</span>    this.region = initHRegion(tableName, HConstants.EMPTY_START_ROW,<a name="line.4503"></a>
+<span class="sourceLineNo">4504</span>        HConstants.EMPTY_END_ROW, false, tableDurability, wal,<a name="line.4504"></a>
+<span class="sourceLineNo">4505</span>        new byte[][] { family });<a name="line.4505"></a>
 <span class="sourceLineNo">4506</span><a name="line.4506"></a>
-<span class="sourceLineNo">4507</span>    // verify sync called or not<a name="line.4507"></a>
-<span class="sourceLineNo">4508</span>    if (expectSync || expectSyncFromLogSyncer) {<a name="line.4508"></a>
-<span class="sourceLineNo">4509</span>      TEST_UTIL.waitFor(timeout, new Waiter.Predicate&lt;Exception&gt;() {<a name="line.4509"></a>
-<span class="sourceLineNo">4510</span>        @Override<a name="line.4510"></a>
-<span class="sourceLineNo">4511</span>        public boolean evaluate() throws Exception {<a name="line.4511"></a>
-<span class="sourceLineNo">4512</span>          try {<a name="line.4512"></a>
-<span class="sourceLineNo">4513</span>            if (expectSync) {<a name="line.4513"></a>
-<span class="sourceLineNo">4514</span>              verify(wal, times(1)).sync(anyLong()); // Hregion calls this one<a name="line.4514"></a>
-<span class="sourceLineNo">4515</span>            } else if (expectSyncFromLogSyncer) {<a name="line.4515"></a>
-<span class="sourceLineNo">4516</span>              verify(wal, times(1)).sync(); // wal syncer calls this one<a name="line.4516"></a>
-<span class="sourceLineNo">4517</span>            }<a name="line.4517"></a>
-<span class="sourceLineNo">4518</span>          } catch (Throwable ignore) {<a name="line.4518"></a>
-<span class="sourceLineNo">4519</span>          }<a name="line.4519"></a>
-<span class="sourceLineNo">4520</span>          return true;<a name="line.4520"></a>
-<span class="sourceLineNo">4521</span>        }<a name="line.4521"></a>
-<span class="sourceLineNo">4522</span>      });<a name="line.4522"></a>
-<span class="sourceLineNo">4523</span>    } else {<a name="line.4523"></a>
-<span class="sourceLineNo">4524</span>      //verify(wal, never()).sync(anyLong());<a name="line.4524"></a>
-<span class="sourceLineNo">4525</span>      verify(wal, never()).sync();<a name="line.4525"></a>
-<span class="sourceLineNo">4526</span>    }<a name="line.4526"></a>
-<span class="sourceLineNo">4527</span><a name="line.4527"></a>
-<span class="sourceLineNo">4528</span>    HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.4528"></a>
-<span class="sourceLineNo">4529</span>    wals.close();<a name="line.4529"></a>
-<span class="sourceLineNo">4530</span>    this.region = null;<a name="line.4530"></a>
-<span class="sourceLineNo">4531</span>  }<a name="line.4531"></a>
-<span class="sourceLineNo">4532</span><a name="line.4532"></a>
-<span class="sourceLineNo">4533</span>  @Test<a name="line.4533"></a>
-<span class="sourceLineNo">4534</span>  public void testRegionReplicaSecondary() throws IOException {<a name="line.4534"></a>
-<span class="sourceLineNo">4535</span>    // create a primary region, load some data and flush<a name="line.4535"></a>
-<span class="sourceLineNo">4536</span>    // create a secondary region, and do a get against that<a name="line.4536"></a>
-<span class="sourceLineNo">4537</span>    Path rootDir = new Path(dir + name.getMethodName());<a name="line.4537"></a>
-<span class="sourceLineNo">4538</span>    FSUtils.setRootDir(TEST_UTIL.getConfiguration(), rootDir);<a name="line.4538"></a>
-<span class="sourceLineNo">4539</span><a name="line.4539"></a>
-<span class="sourceLineNo">4540</span>    byte[][] families = new byte[][] {<a name="line.4540"></a>
-<span class="sourceLineNo">4541</span>        Bytes.toBytes("cf1"), Bytes.toBytes("cf2"), Bytes.toBytes("cf3")<a name="line.4541"></a>
-<span class="sourceLineNo">4542</span>    };<a name="line.4542"></a>
-<span class="sourceLineNo">4543</span>    byte[] cq = Bytes.toBytes("cq");<a name="line.4543"></a>
-<span class="sourceLineNo">4544</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.4544"></a>
-<span class="sourceLineNo">4545</span>    for (byte[] family : families) {<a name="line.4545"></a>
-<span class="sourceLineNo">4546</span>      htd.addFamily(new HColumnDescriptor(family));<a name="line.4546"></a>
-<span class="sourceLineNo">4547</span>    }<a name="line.4547"></a>
-<span class="sourceLineNo">4548</span><a name="line.4548"></a>
-<span class="sourceLineNo">4549</span>    long time = System.currentTimeMillis();<a name="line.4549"></a>
-<span class="sourceLineNo">4550</span>    HRegionInfo primaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4550"></a>
-<span class="sourceLineNo">4551</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4551"></a>
-<span class="sourceLineNo">4552</span>      false, time, 0);<a name="line.4552"></a>
-<span class="sourceLineNo">4553</span>    HRegionInfo secondaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4553"></a>
-<span class="sourceLineNo">4554</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4554"></a>
-<span class="sourceLineNo">4555</span>      false, time, 1);<a name="line.4555"></a>
-<span class="sourceLineNo">4556</span><a name="line.4556"></a>
-<span class="sourceLineNo">4557</span>    HRegion primaryRegion = null, secondaryRegion = null;<a name="line.4557"></a>
+<span class="sourceLineNo">4507</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.4507"></a>
+<span class="sourceLineNo">4508</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.4508"></a>
+<span class="sourceLineNo">4509</span>    put.setDurability(mutationDurability);<a name="line.4509"></a>
+<span class="sourceLineNo">4510</span>    region.put(put);<a name="line.4510"></a>
+<span class="sourceLineNo">4511</span><a name="line.4511"></a>
+<span class="sourceLineNo">4512</span>    //verify append called or not<a name="line.4512"></a>
+<span class="sourceLineNo">4513</span>    verify(wal, expectAppend ? times(1) : never())<a name="line.4513"></a>
+<span class="sourceLineNo">4514</span>      .append((HRegionInfo)any(), (WALKeyImpl)any(),<a name="line.4514"></a>
+<span class="sourceLineNo">4515</span>          (WALEdit)any(), Mockito.anyBoolean());<a name="line.4515"></a>
+<span class="sourceLineNo">4516</span><a name="line.4516"></a>
+<span class="sourceLineNo">4517</span>    // verify sync called or not<a name="line.4517"></a>
+<span class="sourceLineNo">4518</span>    if (expectSync || expectSyncFromLogSyncer) {<a name="line.4518"></a>
+<span class="sourceLineNo">4519</span>      TEST_UTIL.waitFor(timeout, new Waiter.Predicate&lt;Exception&gt;() {<a name="line.4519"></a>
+<span class="sourceLineNo">4520</span>        @Override<a name="line.4520"></a>
+<span class="sourceLineNo">4521</span>        public boolean evaluate() throws Exception {<a name="line.4521"></a>
+<span class="sourceLineNo">4522</span>          try {<a name="line.4522"></a>
+<span class="sourceLineNo">4523</span>            if (expectSync) {<a name="line.4523"></a>
+<span class="sourceLineNo">4524</span>              verify(wal, times(1)).sync(anyLong()); // Hregion calls this one<a name="line.4524"></a>
+<span class="sourceLineNo">4525</span>            } else if (expectSyncFromLogSyncer) {<a name="line.4525"></a>
+<span class="sourceLineNo">4526</span>              verify(wal, times(1)).sync(); // wal syncer calls this one<a name="line.4526"></a>
+<span class="sourceLineNo">4527</span>            }<a name="line.4527"></a>
+<span class="sourceLineNo">4528</span>          } catch (Throwable ignore) {<a name="line.4528"></a>
+<span class="sourceLineNo">4529</span>          }<a name="line.4529"></a>
+<span class="sourceLineNo">4530</span>          return true;<a name="line.4530"></a>
+<span class="sourceLineNo">4531</span>        }<a name="line.4531"></a>
+<span class="sourceLineNo">4532</span>      });<a name="line.4532"></a>
+<span class="sourceLineNo">4533</span>    } else {<a name="line.4533"></a>
+<span class="sourceLineNo">4534</span>      //verify(wal, never()).sync(anyLong());<a name="line.4534"></a>
+<span class="sourceLineNo">4535</span>      verify(wal, never()).sync();<a name="line.4535"></a>
+<span class="sourceLineNo">4536</span>    }<a name="line.4536"></a>
+<span class="sourceLineNo">4537</span><a name="line.4537"></a>
+<span class="sourceLineNo">4538</span>    HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.4538"></a>
+<span class="sourceLineNo">4539</span>    wals.close();<a name="line.4539"></a>
+<span class="sourceLineNo">4540</span>    this.region = null;<a name="line.4540"></a>
+<span class="sourceLineNo">4541</span>  }<a name="line.4541"></a>
+<span class="sourceLineNo">4542</span><a name="line.4542"></a>
+<span class="sourceLineNo">4543</span>  @Test<a name="line.4543"></a>
+<span class="sourceLineNo">4544</span>  public void testRegionReplicaSecondary() throws IOException {<a name="line.4544"></a>
+<span class="sourceLineNo">4545</span>    // create a primary region, load some data and flush<a name="line.4545"></a>
+<span class="sourceLineNo">4546</span>    // create a secondary region, and do a get against that<a name="line.4546"></a>
+<span class="sourceLineNo">4547</span>    Path rootDir = new Path(dir + name.getMethodName());<a name="line.4547"></a>
+<span class="sourceLineNo">4548</span>    FSUtils.setRootDir(TEST_UTIL.getConfiguration(), rootDir);<a name="line.4548"></a>
+<span class="sourceLineNo">4549</span><a name="line.4549"></a>
+<span class="sourceLineNo">4550</span>    byte[][] families = new byte[][] {<a name="line.4550"></a>
+<span class="sourceLineNo">4551</span>        Bytes.toBytes("cf1"), Bytes.toBytes("cf2"), Bytes.toBytes("cf3")<a name="line.4551"></a>
+<span class="sourceLineNo">4552</span>    };<a name="line.4552"></a>
+<span class="sourceLineNo">4553</span>    byte[] cq = Bytes.toBytes("cq");<a name="line.4553"></a>
+<span class="sourceLineNo">4554</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.4554"></a>
+<span class="sourceLineNo">4555</span>    for (byte[] family : families) {<a name="line.4555"></a>
+<span class="sourceLineNo">4556</span>      htd.addFamily(new HColumnDescriptor(family));<a name="line.4556"></a>
+<span class="sourceLineNo">4557</span>    }<a name="line.4557"></a>
 <span class="sourceLineNo">4558</span><a name="line.4558"></a>
-<span class="sourceLineNo">4559</span>    try {<a name="line.4559"></a>
-<span class="sourceLineNo">4560</span>      primaryRegion = HBaseTestingUtility.createRegionAndWAL(primaryHri,<a name="line.4560"></a>
-<span class="sourceLineNo">4561</span>          rootDir, TEST_UTIL.getConfiguration(), htd);<a name="line.4561"></a>
-<span class="sourceLineNo">4562</span><a name="line.4562"></a>
-<span class="sourceLineNo">4563</span>      // load some data<a name="line.4563"></a>
-<span class="sourceLineNo">4564</span>      putData(primaryRegion, 0, 1000, cq, families);<a name="line.4564"></a>
-<span class="sourceLineNo">4565</span><a name="line.4565"></a>
-<span class="sourceLineNo">4566</span>      // flush region<a name="line.4566"></a>
-<span class="sourceLineNo">4567</span>      primaryRegion.flush(true);<a name="line.4567"></a>
+<span class="sourceLineNo">4559</span>    long time = System.currentTimeMillis();<a name="line.4559"></a>
+<span class="sourceLineNo">4560</span>    HRegionInfo primaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4560"></a>
+<span class="sourceLineNo">4561</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4561"></a>
+<span class="sourceLineNo">4562</span>      false, time, 0);<a name="line.4562"></a>
+<span class="sourceLineNo">4563</span>    HRegionInfo secondaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4563"></a>
+<span class="sourceLineNo">4564</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4564"></a>
+<span class="sourceLineNo">4565</span>      false, time, 1);<a name="line.4565"></a>
+<span class="sourceLineNo">4566</span><a name="line.4566"></a>
+<span class="sourceLineNo">4567</span>    HRegion primaryRegion = null, secondaryRegion = null;<a name="line.4567"></a>
 <span class="sourceLineNo">4568</span><a name="line.4568"></a>
-<span class="sourceLineNo">4569</span>      // open secondary region<a name="line.4569"></a>
-<span class="sourceLineNo">4570</span>      secondaryRegion = HRegion.openHRegion(rootDir, secondaryHri, htd, null, CONF);<a name="line.4570"></a>
-<span class="sourceLineNo">4571</span><a name="line.4571"></a>
-<span class="sourceLineNo">4572</span>      verifyData(secondaryRegion, 0, 1000, cq, families);<a name="line.4572"></a>
-<span class="sourceLineNo">4573</span>    } finally {<a name="line.4573"></a>
-<span class="sourceLineNo">4574</span>      if (primaryRegion != null) {<a name="line.4574"></a>
-<span class="sourceLineNo">4575</span>        HBaseTestingUtility.closeRegionAndWAL(primaryRegion);<a name="line.4575"></a>
-<span class="sourceLineNo">4576</span>      }<a name="line.4576"></a>
-<span class="sourceLineNo">4577</span>      if (secondaryRegion != null) {<a name="line.4577"></a>
-<span class="sourceLineNo">4578</span>        HBaseTestingUtility.closeRegionAndWAL(secondaryRegion);<a name="line.4578"></a>
-<span class="sourceLineNo">4579</span>      }<a name="line.4579"></a>
-<span class="sourceLineNo">4580</span>    }<a name="line.4580"></a>
-<span class="sourceLineNo">4581</span>  }<a name="line.4581"></a>
-<span class="sourceLineNo">4582</span><a name="line.4582"></a>
-<span class="sourceLineNo">4583</span>  @Test<a name="line.4583"></a>
-<span class="sourceLineNo">4584</span>  public void testRegionReplicaSecondaryIsReadOnly() throws IOException {<a name="line.4584"></a>
-<span class="sourceLineNo">4585</span>    // create a primary region, load some data and flush<a name="line.4585"></a>
-<span class="sourceLineNo">4586</span>    // create a secondary region, and do a put against that<a name="line.4586"></a>
-<span class="sourceLineNo">4587</span>    Path rootDir = new Path(dir + name.getMethodName());<a name="line.4587"></a>
-<span class="sourceLineNo">4588</span>    FSUtils.setRootDir(TEST_UTIL.getConfiguration(), rootDir);<a name="line.4588"></a>
-<span class="sourceLineNo">4589</span><a name="line.4589"></a>
-<span class="sourceLineNo">4590</span>    byte[][] families = new byte[][] {<a name="line.4590"></a>
-<span class="sourceLineNo">4591</span>        Bytes.toBytes("cf1"), Bytes.toBytes("cf2"), Bytes.toBytes("cf3")<a name="line.4591"></a>
-<span class="sourceLineNo">4592</span>    };<a name="line.4592"></a>
-<span class="sourceLineNo">4593</span>    byte[] cq = Bytes.toBytes("cq");<a name="line.4593"></a>
-<span class="sourceLineNo">4594</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.4594"></a>
-<span class="sourceLineNo">4595</span>    for (byte[] family : families) {<a name="line.4595"></a>
-<span class="sourceLineNo">4596</span>      htd.addFamily(new HColumnDescriptor(family));<a name="line.4596"></a>
-<span class="sourceLineNo">4597</span>    }<a name="line.4597"></a>
-<span class="sourceLineNo">4598</span><a name="line.4598"></a>
-<span class="sourceLineNo">4599</span>    long time = System.currentTimeMillis();<a name="line.4599"></a>
-<span class="sourceLineNo">4600</span>    HRegionInfo primaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4600"></a>
-<span class="sourceLineNo">4601</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4601"></a>
-<span class="sourceLineNo">4602</span>      false, time, 0);<a name="line.4602"></a>
-<span class="sourceLineNo">4603</span>    HRegionInfo secondaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4603"></a>
-<span class="sourceLineNo">4604</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4604"></a>
-<span class="sourceLineNo">4605</span>      false, time, 1);<a name="line.4605"></a>
-<span class="sourceLineNo">4606</span><a name="line.4606"></a>
-<span class="sourceLineNo">4607</span>    HRegion primaryRegion = null, secondaryRegion = null;<a name="line.4607"></a>
+<span class="sourceLineNo">4569</span>    try {<a name="line.4569"></a>
+<span class="sourceLineNo">4570</span>      primaryRegion = HBaseTestingUtility.createRegionAndWAL(primaryHri,<a name="line.4570"></a>
+<span class="sourceLineNo">4571</span>          rootDir, TEST_UTIL.getConfiguration(), htd);<a name="line.4571"></a>
+<span class="sourceLineNo">4572</span><a name="line.4572"></a>
+<span class="sourceLineNo">4573</span>      // load some data<a name="line.4573"></a>
+<span class="sourceLineNo">4574</span>      putData(primaryRegion, 0, 1000, cq, families);<a name="line.4574"></a>
+<span class="sourceLineNo">4575</span><a name="line.4575"></a>
+<span class="sourceLineNo">4576</span>      // flush region<a name="line.4576"></a>
+<span class="sourceLineNo">4577</span>      primaryRegion.flush(true);<a name="line.4577"></a>
+<span class="sourceLineNo">4578</span><a name="line.4578"></a>
+<span class="sourceLineNo">4579</span>      // open secondary region<a name="line.4579"></a>
+<span class="sourceLineNo">4580</span>      secondaryRegion = HRegion.openHRegion(rootDir, secondaryHri, htd, null, CONF);<a name="line.4580"></a>
+<span class="sourceLineNo">4581</span><a name="line.4581"></a>
+<span class="sourceLineNo">4582</span>      verifyData(secondaryRegion, 0, 1000, cq, families);<a name="line.4582"></a>
+<span class="sourceLineNo">4583</span>    } finally {<a name="line.4583"></a>
+<span class="sourceLineNo">4584</span>      if (primaryRegion != null) {<a name="line.4584"></a>
+<span class="sourceLineNo">4585</span>        HBaseTestingUtility.closeRegionAndWAL(primaryRegion);<a name="line.4585"></a>
+<span class="sourceLineNo">4586</span>      }<a name="line.4586"></a>
+<span class="sourceLineNo">4587</span>      if (secondaryRegion != null) {<a name="line.4587"></a>
+<span class="sourceLineNo">4588</span>        HBaseTestingUtility.closeRegionAndWAL(secondaryRegion);<a name="line.4588"></a>
+<span class="sourceLineNo">4589</span>      }<a name="line.4589"></a>
+<span class="sourceLineNo">4590</span>    }<a name="line.4590"></a>
+<span class="sourceLineNo">4591</span>  }<a name="line.4591"></a>
+<span class="sourceLineNo">4592</span><a name="line.4592"></a>
+<span class="sourceLineNo">4593</span>  @Test<a name="line.4593"></a>
+<span class="sourceLineNo">4594</span>  public void testRegionReplicaSecondaryIsReadOnly() throws IOException {<a name="line.4594"></a>
+<span class="sourceLineNo">4595</span>    // create a primary region, load some data and flush<a name="line.4595"></a>
+<span class="sourceLineNo">4596</span>    // create a secondary region, and do a put against that<a name="line.4596"></a>
+<span class="sourceLineNo">4597</span>    Path rootDir = new Path(dir + name.getMethodName());<a name="line.4597"></a>
+<span class="sourceLineNo">4598</span>    FSUtils.setRootDir(TEST_UTIL.getConfiguration(), rootDir);<a name="line.4598"></a>
+<span class="sourceLineNo">4599</span><a name="line.4599"></a>
+<span class="sourceLineNo">4600</span>    byte[][] families = new byte[][] {<a name="line.4600"></a>
+<span class="sourceLineNo">4601</span>        Bytes.toBytes("cf1"), Bytes.toBytes("cf2"), Bytes.toBytes("cf3")<a name="line.4601"></a>
+<span class="sourceLineNo">4602</span>    };<a name="line.4602"></a>
+<span class="sourceLineNo">4603</span>    byte[] cq = Bytes.toBytes("cq");<a name="line.4603"></a>
+<span class="sourceLineNo">4604</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.4604"></a>
+<span class="sourceLineNo">4605</span>    for (byte[] family : families) {<a name="line.4605"></a>
+<span class="sourceLineNo">4606</span>      htd.addFamily(new HColumnDescriptor(family));<a name="line.4606"></a>
+<span class="sourceLineNo">4607</span>    }<a name="line.4607"></a>
 <span class="sourceLineNo">4608</span><a name="line.4608"></a>
-<span class="sourceLineNo">4609</span>    try {<a name="line.4609"></a>
-<span class="sourceLineNo">4610</span>      primaryRegion = HBaseTestingUtility.createRegionAndWAL(primaryHri,<a name="line.4610"></a>
-<span class="sourceLineNo">4611</span>          rootDir, TEST_UTIL.getConfiguration(), htd);<a name="line.4611"></a>
-<span class="sourceLineNo">4612</span><a name="line.4612"></a>
-<span class="sourceLineNo">4613</span>      // load some data<a name="line.4613"></a>
-<span class="sourceLineNo">4614</span>      putData(primaryRegion, 0, 1000, cq, families);<a name="line.4614"></a>
-<span class="sourceLineNo">4615</span><a name="line.4615"></a>
-<span class="sourceLineNo">4616</span>      // flush region<a name="line.4616"></a>
-<span class="sourceLineNo">4617</span>      primaryRegion.flush(true);<a name="line.4617"></a>
+<span class="sourceLineNo">4609</span>    long time = System.currentTimeMillis();<a name="line.4609"></a>
+<span class="sourceLineNo">4610</span>    HRegionInfo primaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4610"></a>
+<span class="sourceLineNo">4611</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4611"></a>
+<span class="sourceLineNo">4612</span>      false, time, 0);<a name="line.4612"></a>
+<span class="sourceLineNo">4613</span>    HRegionInfo secondaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4613"></a>
+<span class="sourceLineNo">4614</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4614"></a>
+<span class="sourceLineNo">4615</span>      false, time, 1);<a name="line.4615"></a>
+<span class="sourceLineNo">4616</span><a name="line.4616"></a>
+<span class="sourceLineNo">4617</span>    HRegion primaryRegion = null, secondaryRegion = null;<a name="line.4617"></a>
 <span class="sourceLineNo">4618</span><a name="line.4618"></a>
-<span class="sourceLineNo">4619</span>      // open secondary region<a name="line.4619"></a>
-<span class="sourceLineNo">4620</span>      secondaryRegion = HRegion.openHRegion(rootDir, secondaryHri, htd, null, CONF);<a name="line.4620"></a>
-<span class="sourceLineNo">4621</span><a name="line.4621"></a>
-<span class="sourceLineNo">4622</span>      try {<a name="line.4622"></a>
-<span class="sourceLineNo">4623</span>        putData(secondaryRegion, 0, 1000, cq, families);<a name="line.4623"></a>
-<span class="sourceLineNo">4624</span>        fail("Should have thrown exception");<a name="line.4624"></a>
-<span class="sourceLineNo">4625</span>      } catch (IOException ex) {<a name="line.4625"></a>
-<span class="sourceLineNo">4626</span>        // expected<a name="line.4626"></a>
-<span class="sourceLineNo">4627</span>      }<a name="line.4627"></a>
-<span class="sourceLineNo">4628</span>    } finally {<a name="line.4628"></a>
-<span class="sourceLineNo">4629</span>      if (primaryRegion != null) {<a name="line.4629"></a>
-<span class="sourceLineNo">4630</span>        HBaseTestingUtility.closeRegionAndWAL(primaryRegion);<a name="line.4630"></a>
-<span class="sourceLineNo">4631</span>      }<a name="line.4631"></a>
-<span class="sourceLineNo">4632</span>      if (secondaryRegion != null) {<a name="line.4632"></a>
-<span class="sourceLineNo">4633</span>        HBaseTestingUtility.closeRegionAndWAL(secondaryRegion);<a name="line.4633"></a>
-<span class="sourceLineNo">4634</span>      }<a name="line.4634"></a>
-<span class="sourceLineNo">4635</span>    }<a name="line.4635"></a>
-<span class="sourceLineNo">4636</span>  }<a name="line.4636"></a>
-<span class="sourceLineNo">4637</span><a name="line.4637"></a>
-<span class="sourceLineNo">4638</span>  static WALFactory createWALFactory(Configuration conf, Path rootDir) throws IOException {<a name="line.4638"></a>
-<span class="sourceLineNo">4639</span>    Configuration confForWAL = new Configuration(conf);<a name="line.4639"></a>
-<span class="sourceLineNo">4640</span>    confForWAL.set(HConstants.HBASE_DIR, rootDir.toString());<a name="line.4640"></a>
-<span class="sourceLineNo">4641</span>    return new WALFactory(confForWAL, "hregion-" + RandomStringUtils.randomNumeric(8));<a name="line.4641"></a>
-<span class="sourceLineNo">4642</span>  }<a name="line.4642"></a>
-<span class="sourceLineNo">4643</span><a name="line.4643"></a>
-<span class="sourceLineNo">4644</span>  @Test<a name="line.4644"></a>
-<span class="sourceLineNo">4645</span>  public void testCompactionFromPrimary() throws IOException {<a name="line.4645"></a>
-<span class="sourceLineNo">4646</span>    Path rootDir = new Path(dir + name.getMethodName());<a name="line.4646"></a>
-<span class="sourceLineNo">4647</span>    FSUtils.setRootDir(TEST_UTIL.getConfiguration(), rootDir);<a name="line.4647"></a>
-<span class="sourceLineNo">4648</span><a name="line.4648"></a>
-<span class="sourceLineNo">4649</span>    byte[][] families = new byte[][] {<a name="line.4649"></a>
-<span class="sourceLineNo">4650</span>        Bytes.toBytes("cf1"), Bytes.toBytes("cf2"), Bytes.toBytes("cf3")<a name="line.4650"></a>
-<span class="sourceLineNo">4651</span>    };<a name="line.4651"></a>
-<span class="sourceLineNo">4652</span>    byte[] cq = Bytes.toBytes("cq");<a name="line.4652"></a>
-<span class="sourceLineNo">4653</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.4653"></a>
-<span class="sourceLineNo">4654</span>    for (byte[] family : families) {<a name="line.4654"></a>
-<span class="sourceLineNo">4655</span>      htd.addFamily(new HColumnDescriptor(family));<a name="line.4655"></a>
-<span class="sourceLineNo">4656</span>    }<a name="line.4656"></a>
-<span class="sourceLineNo">4657</span><a name="line.4657"></a>
-<span class="sourceLineNo">4658</span>    long time = System.currentTimeMillis();<a name="line.4658"></a>
-<span class="sourceLineNo">4659</span>    HRegionInfo primaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4659"></a>
-<span class="sourceLineNo">4660</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4660"></a>
-<span class="sourceLineNo">4661</span>      false, time, 0);<a name="line.4661"></a>
-<span class="sourceLineNo">4662</span>    HRegionInfo secondaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4662"></a>
-<span class="sourceLineNo">4663</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4663"></a>
-<span class="sourceLineNo">4664</span>      false, time, 1);<a name="line.4664"></a>
-<span class="sourceLineNo">4665</span><a name="line.4665"></a>
-<span class="sourceLineNo">4666</span>    HRegion primaryRegion = null, secondaryRegion = null;<a name="line.4666"></a>
+<span class="sourceLineNo">4619</span>    try {<a name="line.4619"></a>
+<span class="sourceLineNo">4620</span>      primaryRegion = HBaseTestingUtility.createRegionAndWAL(primaryHri,<a name="line.4620"></a>
+<span class="sourceLineNo">4621</span>          rootDir, TEST_UTIL.getConfiguration(), htd);<a name="line.4621"></a>
+<span class="sourceLineNo">4622</span><a name="line.4622"></a>
+<span class="sourceLineNo">4623</span>      // load some data<a name="line.4623"></a>
+<span class="sourceLineNo">4624</span>      putData(primaryRegion, 0, 1000, cq, families);<a name="line.4624"></a>
+<span class="sourceLineNo">4625</span><a name="line.4625"></a>
+<span class="sourceLineNo">4626</span>      // flush region<a name="line.4626"></a>
+<span class="sourceLineNo">4627</span>      primaryRegion.flush(true);<a name="line.4627"></a>
+<span class="sourceLineNo">4628</span><a name="line.4628"></a>
+<span class="sourceLineNo">4629</span>      // open secondary region<a name="line.4629"></a>
+<span class="sourceLineNo">4630</span>      secondaryRegion = HRegion.openHRegion(rootDir, secondaryHri, htd, null, CONF);<a name="line.4630"></a>
+<span class="sourceLineNo">4631</span><a name="line.4631"></a>
+<span class="sourceLineNo">4632</span>      try {<a name="line.4632"></a>
+<span class="sourceLineNo">4633</span>        putData(secondaryRegion, 0, 1000, cq, families);<a name="line.4633"></a>
+<span class="sourceLineNo">4634</span>        fail("Should have thrown exception");<a name="line.4634"></a>
+<span class="sourceLineNo">4635</span>      } catch (IOException ex) {<a name="line.4635"></a>
+<span class="sourceLineNo">4636</span>        // expected<a name="line.4636"></a>
+<span class="sourceLineNo">4637</span>      }<a name="line.4637"></a>
+<span class="sourceLineNo">4638</span>    } finally {<a name="line.4638"></a>
+<span class="sourceLineNo">4639</span>      if (primaryRegion != null) {<a name="line.4639"></a>
+<span class="sourceLineNo">4640</span>        HBaseTestingUtility.closeRegionAndWAL(primaryRegion);<a name="line.4640"></a>
+<span class="sourceLineNo">4641</span>      }<a name="line.4641"></a>
+<span class="sourceLineNo">4642</span>      if (secondaryRegion != null) {<a name="line.4642"></a>
+<span class="sourceLineNo">4643</span>        HBaseTestingUtility.closeRegionAndWAL(secondaryRegion);<a name="line.4643"></a>
+<span class="sourceLineNo">4644</span>      }<a name="line.4644"></a>
+<span class="sourceLineNo">4645</span>    }<a name="line.4645"></a>
+<span class="sourceLineNo">4646</span>  }<a name="line.4646"></a>
+<span class="sourceLineNo">4647</span><a name="line.4647"></a>
+<span class="sourceLineNo">4648</span>  static WALFactory createWALFactory(Configuration conf, Path rootDir) throws IOException {<a name="line.4648"></a>
+<span class="sourceLineNo">4649</span>    Configuration confForWAL = new Configuration(conf);<a name="line.4649"></a>
+<span class="sourceLineNo">4650</span>    confForWAL.set(HConstants.HBASE_DIR, rootDir.toString());<a name="line.4650"></a>
+<span class="sourceLineNo">4651</span>    return new WALFactory(confForWAL, "hregion-" + RandomStringUtils.randomNumeric(8));<a name="line.4651"></a>
+<span class="sourceLineNo">4652</span>  }<a name="line.4652"></a>
+<span class="sourceLineNo">4653</span><a name="line.4653"></a>
+<span class="sourceLineNo">4654</span>  @Test<a name="line.4654"></a>
+<span class="sourceLineNo">4655</span>  public void testCompactionFromPrimary() throws IOException {<a name="line.4655"></a>
+<span class="sourceLineNo">4656</span>    Path rootDir = new Path(dir + name.getMethodName());<a name="line.4656"></a>
+<span class="sourceLineNo">4657</span>    FSUtils.setRootDir(TEST_UTIL.getConfiguration(), rootDir);<a name="line.4657"></a>
+<span class="sourceLineNo">4658</span><a name="line.4658"></a>
+<span class="sourceLineNo">4659</span>    byte[][] families = new byte[][] {<a name="line.4659"></a>
+<span class="sourceLineNo">4660</span>        Bytes.toBytes("cf1"), Bytes.toBytes("cf2"), Bytes.toBytes("cf3")<a name="line.4660"></a>
+<span class="sourceLineNo">4661</span>    };<a name="line.4661"></a>
+<span class="sourceLineNo">4662</span>    byte[] cq = Bytes.toBytes("cq");<a name="line.4662"></a>
+<span class="sourceLineNo">4663</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.4663"></a>
+<span class="sourceLineNo">4664</span>    for (byte[] family : families) {<a name="line.4664"></a>
+<span class="sourceLineNo">4665</span>      htd.addFamily(new HColumnDescriptor(family));<a name="line.4665"></a>
+<span class="sourceLineNo">4666</span>    }<a name="line.4666"></a>
 <span class="sourceLineNo">4667</span><a name="line.4667"></a>
-<span class="sourceLineNo">4668</span>    try {<a name="line.4668"></a>
-<span class="sourceLineNo">4669</span>      primaryRegion = HBaseTestingUtility.createRegionAndWAL(primaryHri,<a name="line.4669"></a>
-<span class="sourceLineNo">4670</span>          rootDir, TEST_UTIL.getConfiguration(), htd);<a name="line.4670"></a>
-<span class="sourceLineNo">4671</span><a name="line.4671"></a>
-<span class="sourceLineNo">4672</span>      // load some data<a name="line.4672"></a>
-<span class="sourceLineNo">4673</span>      putData(primaryRegion, 0, 1000, cq, families);<a name="line.4673"></a>
-<span class="sourceLineNo">4674</span><a name="line.4674"></a>
-<span class="sourceLineNo">4675</span>      // flush region<a name="line.4675"></a>
-<span class="sourceLineNo">4676</span>      primaryRegion.flush(true);<a name="line.4676"></a>
+<span class="sourceLineNo">4668</span>    long time = System.currentTimeMillis();<a name="line.4668"></a>
+<span class="sourceLineNo">4669</span>    HRegionInfo primaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4669"></a>
+<span class="sourceLineNo">4670</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4670"></a>
+<span class="sourceLineNo">4671</span>      false, time, 0);<a name="line.4671"></a>
+<span class="sourceLineNo">4672</span>    HRegionInfo secondaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4672"></a>
+<span class="sourceLineNo">4673</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4673"></a>
+<span class="sourceLineNo">4674</span>      false, time, 1);<a name="line.4674"></a>
+<span class="sourceLineNo">4675</span><a name="line.4675"></a>
+<span class="sourceLineNo">4676</span>    HRegion primaryRegion = null, secondaryRegion = null;<a name="line.4676"></a>
 <span class="sourceLineNo">4677</span><a name="line.4677"></a>
-<span class="sourceLineNo">4678</span>      // open secondary region<a name="line.4678"></a>
-<span class="sourceLineNo">4679</span>      secondaryRegion = HRegion.openHRegion(rootDir, secondaryHri, htd, null, CONF);<a name="line.4679"></a>
-<span class="sourceLineNo">4680</span><a name="line.4680"></a>
-<span class="sourceLineNo">4681</span>      // move the file of the primary region to the archive, simulating a compaction<a name="line.4681"></a>
-<span class="sourceLineNo">4682</span>      Collection&lt;HStoreFile&gt; storeFiles = primaryRegion.getStore(families[0]).getStorefiles();<a name="line.4682"></a>
-<span class="sourceLineNo">4683</span>      primaryRegion.getRegionFileSystem().removeStoreFiles(Bytes.toString(families[0]), storeFiles);<a name="line.4683"></a>
-<span class="sourceLineNo">4684</span>      Collection&lt;StoreFileInfo&gt; storeFileInfos = primaryRegion.getRegionFileSystem()<a name="line.4684"></a>
-<span class="sourceLineNo">4685</span>          .getStoreFiles(families[0]);<a name="line.4685"></a>
-<span class="sourceLineNo">4686</span>      Assert.assertTrue(storeFileInfos == null || storeFileInfos.isEmpty());<a name="line.4686"></a>
+<span class="sourceLineNo">4678</span>    try {<a name="line.4678"></a>
+<span class="sourceLineNo">4679</span>      primaryRegion = HBaseTestingUtility.createRegionAndWAL(primaryHri,<a name="line.4679"></a>
+<span class="sourceLineNo">4680</span>          rootDir, TEST_UTIL.getConfiguration(), htd);<a name="line.4680"></a>
+<span class="sourceLineNo">4681</span><a name="line.4681"></a>
+<span class="sourceLineNo">4682</span>      // load some data<a name="line.4682"></a>
+<span class="sourceLineNo">4683</span>      putData(primaryRegion, 0, 1000, cq, families);<a name="line.4683"></a>
+<span class="sourceLineNo">4684</span><a name="line.4684"></a>
+<span class="sourceLineNo">4685</span>      // flush region<a name="line.4685"></a>
+<span class="sourceLineNo">4686</span>      primaryRegion.flush(true);<a name="line.4686"></a>
 <span class="sourceLineNo">4687</span><a name="line.4687"></a>
-<span class="sourceLineNo">4688</span>      verifyData(secondaryRegion, 0, 1000, cq, families);<a name="line.4688"></a>
-<span class="sourceLineNo">4689</span>    } finally {<a name="line.4689"></a>
-<span class="sourceLineNo">4690</span>      if (primaryRegion != null) {<a name="line.4690"></a>
-<span class="sourceLineNo">4691</span>        HBaseTestingUtility.closeRegionAndWAL(primaryRegion);<a name="line.4691"></a>
-<span class="sourceLineNo">4692</span>      }<a name="line.4692"></a>
-<span class="sourceLineNo">4693</span>      if (secondaryRegion != null) {<a name="line.4693"></a>
-<span class="sourceLineNo">4694</span>        HBaseTestingUtility.closeRegionAndWAL(secondaryRegion);<a name="line.4694"></a>
-<span class="sourceLineNo">4695</span>      }<a name="line.4695"></a>
-<span class="sourceLineNo">4696</span>    }<a name="line.4696"></a>
-<span class="sourceLineNo">4697</span>  }<a name="line.4697"></a>
-<span class="sourceLineNo">4698</span><a name="line.4698"></a>
-<span class="sourceLineNo">4699</span>  private void putData(int startRow, int numRows, byte[] qf, byte[]... families) throws<a name="line.4699"></a>
-<span class="sourceLineNo">4700</span>      IOException {<a name="line.4700"></a>
-<span class="sourceLineNo">4701</span>    putData(this.region, startRow, numRows, qf, families);<a name="line.4701"></a>
-<span class="sourceLineNo">4702</span>  }<a name="line.4702"></a>
-<span class="sourceLineNo">4703</span><a name="line.4703"></a>
-<span class="sourceLineNo">4704</span>  private void putData(HRegion region,<a name="line.4704"></a>
-<span class="sourceLineNo">4705</span>      int startRow, int numRows, byte[] qf, byte[]... families) throws IOException {<a name="line.4705"></a>
-<span class="sourceLineNo">4706</span>    putData(region, Durability.SKIP_WAL, startRow, numRows, qf, families);<a name="line.4706"></a>
+<span class="sourceLineNo">4688</span>      // open secondary region<a name="line.4688"></a>
+<span class="sourceLineNo">4689</span>      secondaryRegion = HRegion.openHRegion(rootDir, secondaryHri, htd, null, CONF);<a name="line.4689"></a>
+<span class="sourceLineNo">4690</span><a name="line.4690"></a>
+<span class="sourceLineNo">4691</span>      // move the file of the primary region to the archive, simulating a compaction<a name="line.4691"></a>
+<span class="sourceLineNo">4692</span>      Collection&lt;HStoreFile&gt; storeFiles = primaryRegion.getStore(families[0]).getStorefiles();<a name="line.4692"></a>
+<span class="sourceLineNo">4693</span>      primaryRegion.getRegionFileSystem().removeStoreFiles(Bytes.toString(families[0]), storeFiles);<a name="line.4693"></a>
+<span class="sourceLineNo">4694</span>      Collection&lt;StoreFileInfo&gt; storeFileInfos = primaryRegion.getRegionFileSystem()<a name="line.4694"></a>
+<span class="sourceLineNo">4695</span>          .getStoreFiles(families[0]);<a name="line.4695"></a>
+<span class="sourceLineNo">4696</span>      Assert.assertTrue(storeFileInfos == null || storeFileInfos.isEmpty());<a name="line.4696"></a>
+<span class="sourceLineNo">4697</span><a name="line.4697"></a>
+<span class="sourceLineNo">4698</span>      verifyData(secondaryRegion, 0, 1000, cq, families);<a name="line.4698"></a>
+<span class="sourceLineNo">4699</span>    } finally {<a name="line.4699"></a>
+<span class="sourceLineNo">4700</span>      if (primaryRegion != null) {<a name="line.4700"></a>
+<span class="sourceLineNo">4701</span>        HBaseTestingUtility.closeRegionAndWAL(primaryRegion);<a name="line.4701"></a>
+<span class="sourceLineNo">4702</span>      }<a name="line.4702"></a>
+<span class="sourceLineNo">4703</span>      if (secondaryRegion != null) {<a name="line.4703"></a>
+<span class="sourceLineNo">4704</span>        HBaseTestingUtility.closeRegionAndWAL(secondaryRegion);<a name="line.4704"></a>
+<span class="sourceLineNo">4705</span>      }<a name="line.4705"></a>
+<span class="sourceLineNo">4706</span>    }<a name="line.4706"></a>
 <span class="sourceLineNo">4707</span>  }<a name="line.4707"></a>
 <span class="sourceLineNo">4708</span><a name="line.4708"></a>
-<span class="sourceLineNo">4709</span>  static void putData(HRegion region, Durability durability,<a name="line.4709"></a>
-<span class="sourceLineNo">4710</span>      int startRow, int numRows, byte[] qf, byte[]... families) throws IOException {<a name="line.4710"></a>
-<span class="sourceLineNo">4711</span>    for (int i = startRow; i &lt; startRow + numRows; i++) {<a name="line.4711"></a>
-<span class="sourceLineNo">4712</span>      Put put = new Put(Bytes.toBytes("" + i));<a name="line.4712"></a>
-<span class="sourceLineNo">4713</span>      put.setDurability(durability);<a name="line.4713"></a>
-<span class="sourceLineNo">4714</span>      for (byte[] family : families) {<a name="line.4714"></a>
-<span class="sourceLineNo">4715</span>        put.addColumn(family, qf, null);<a name="line.4715"></a>
-<span class="sourceLineNo">4716</span>      }<a name="line.4716"></a>
-<span class="sourceLineNo">4717</span>      region.put(put);<a name="line.4717"></a>
-<span class="sourceLineNo">4718</span>      LOG.info(put.toString());<a name="line.4718"></a>
-<span class="sourceLineNo">4719</span>    }<a name="line.4719"></a>
-<span class="sourceLineNo">4720</span>  }<a name="line.4720"></a>
-<span class="sourceLineNo">4721</span><a name="line.4721"></a>
-<span class="sourceLineNo">4722</span>  static void verifyData(HRegion newReg, int startRow, int numRows, byte[] qf, byte[]... families)<a name="line.4722"></a>
-<span class="sourceLineNo">4723</span>      throws IOException {<a name="line.4723"></a>
-<span class="sourceLineNo">4724</span>    for (int i = startRow; i &lt; startRow + numRows; i++) {<a name="line.4724"></a>
-<span class="sourceLineNo">4725</span>      byte[] row = Bytes.toBytes("" + i);<a name="line.4725"></a>
-<span class="sourceLineNo">4726</span>      Get get = new Get(row);<a name="line.4726"></a>
-<span class="sourceLineNo">4727</span>      for (byte[] family : families) {<a name="line.4727"></a>
-<span class="sourceLineNo">4728</span>        get.addColumn(family, qf);<a name="line.4728"></a>
-<span class="sourceLineNo">4729</span>      }<a name="line.4729"></a>
-<span class="sourceLineNo">4730</span>      Result result = newReg.get(get);<a name="line.4730"></a>
-<span class="sourceLineNo">4731</span>      Cell[] raw = result.rawCells();<a name="line.4731"></a>
-<span class="sourceLineNo">4732</span>      assertEquals(families.length, result.size());<a name="line.4732"></a>
-<span class="sourceLineNo">4733</span>      for (int j = 0; j &lt; families.length; j++) {<a name="line.4733"></a>
-<span class="sourceLineNo">4734</span>        assertTrue(CellUtil.matchingRows(raw[j], row));<a name="line.4734"></a>
-<span class="sourceLineNo">4735</span>        assertTrue(CellUtil.matchingFamily(raw[j], families[j]));<a name="line.4735"></a>
-<span class="sourceLineNo">4736</span>        assertTrue(CellUtil.matchingQualifier(raw[j], qf));<a name="line.4736"></a>
-<span class="sourceLineNo">4737</span>      }<a name="line.4737"></a>
-<span class="sourceLineNo">4738</span>    }<a name="line.4738"></a>
-<span class="sourceLineNo">4739</span>  }<a name="line.4739"></a>
-<span class="sourceLineNo">4740</span><a name="line.4740"></a>
-<span class="sourceLineNo">4741</span>  static void assertGet(final HRegion r, final byte[] family, final byte[] k) throws IOException {<a name="line.4741"></a>
-<span class="sourceLineNo">4742</span>    // Now I have k, get values out and assert they are as expected.<a name="line.4742"></a>
-<span class="sourceLineNo">4743</span>    Get get = new Get(k).addFamily(family).readAllVersions();<a name="line.4743"></a>
-<span class="sourceLineNo">4744</span>    Cell[] results = r.get(get).rawCells();<a name="line.4744"></a>
-<span class="sourceLineNo">4745</span>    for (int j = 0; j &lt; results.length; j++) {<a name="line.4745"></a>
-<span class="sourceLineNo">4746</span>      byte[] tmp = CellUtil.cloneValue(results[j]);<a name="line.4746"></a>
-<span class="sourceLineNo">4747</span>      // Row should be equal to value every time.<a name="line.4747"></a>
-<span class="sourceLineNo">4748</span>      assertTrue(Bytes.equals(k, tmp));<a name="line.4748"></a>
-<span class="sourceLineNo">4749</span>    }<a name="line.4749"></a>
-<span class="sourceLineNo">4750</span>  }<a name="line.4750"></a>
-<span class="sourceLineNo">4751</span><a name="line.4751"></a>
-<span class="sourceLineNo">4752</span>  /*<a name="line.4752"></a>
-<span class="sourceLineNo">4753</span>   * Assert first value in the passed region is &lt;code&gt;firstValue&lt;/code&gt;.<a name="line.4753"></a>
-<span class="sourceLineNo">4754</span>   *<a name="line.4754"></a>
-<span class="sourceLineNo">4755</span>   * @param r<a name="line.4755"></a>
-<span class="sourceLineNo">4756</span>   *<a name="line.4756"></a>
-<span class="sourceLineNo">4757</span>   * @param fs<a name="line.4757"></a>
-<span class="sourceLineNo">4758</span>   *<a name="line.4758"></a>
-<span class="sourceLineNo">4759</span>   * @param firstValue<a name="line.4759"></a>
-<span class="sourceLineNo">4760</span>   *<a name="line.4760"></a>
-<span class="sourceLineNo">4761</span>   * @throws IOException<a name="line.4761"></a>
-<span class="sourceLineNo">4762</span>   */<a name="line.4762"></a>
-<span class="sourceLineNo">4763</span>  protected void assertScan(final HRegion r, final byte[] fs, final byte[] firstValue)<a name="line.4763"></a>
-<span class="sourceLineNo">4764</span>      throws IOException {<a name="line.4764"></a>
-<span class="sourceLineNo">4765</span>    byte[][] families = { fs };<a name="line.4765"></a>
-<span class="sourceLineNo">4766</span>    Scan scan = new Scan();<a name="line.4766"></a>
-<span class="sourceLineNo">4767</span>    for (int i = 0; i &lt; families.length; i++)<a name="line.4767"></a>
-<span class="sourceLineNo">4768</span>      scan.addFamily(families[i]);<a name="line.4768"></a>
-<span class="sourceLineNo">4769</span>    InternalScanner s = r.getScanner(scan);<a name="line.4769"></a>
-<span class="sourceLineNo">4770</span>    try {<a name="line.4770"></a>
-<span class="sourceLineNo">4771</span>      List&lt;Cell&gt; curVals = new ArrayList&lt;&gt;();<a name="line.4771"></a>
-<span class="sourceLineNo">4772</span>      boolean first = true;<a name="line.4772"></a>
-<span class="sourceLineNo">4773</span>      OUTER_LOOP: while (s.next(curVals)) {<a name="line.4773"></a>
-<span class="sourceLineNo">4774</span>        for (Cell kv : curVals) {<a name="line.4774"></a>
-<span class="sourceLineNo">4775</span>          byte[] val = CellUtil.cloneValue(kv);<a name="line.4775"></a>
-<span class="sourceLineNo">4776</span>          byte[] curval = val;<a name="line.4776"></a>
-<span class="sourceLineNo">4777</span>          if (first) {<a name="line.4777"></a>
-<span class="sourceLineNo">4778</span>            first = false;<a name="line.4778"></a>
-<span class="sourceLineNo">4779</span>            assertTrue(Bytes.compareTo(curval, firstValue) == 0);<a name="line.4779"></a>
-<span class="sourceLineNo">4780</span>          } else {<a name="line.4780"></a>
-<span class="sourceLineNo">4781</span>            // Not asserting anything. Might as well break.<a name="line.4781"></a>
-<span class="sourceLineNo">4782</span>            break OUTER_LOOP;<a name="line.4782"></a>
-<span class="sourceLineNo">4783</span>          }<a name="line.4783"></a>
-<span class="sourceLineNo">4784</span>        }<a name="line.4784"></a>
-<span class="sourceLineNo">4785</span>      }<a name="line.4785"></a>
-<span class="sourceLineNo">4786</span>    } finally {<a name="line.4786"></a>
-<span class="sourceLineNo">4787</span>      s.close();<a name="line.4787"></a>
-<span class="sourceLineNo">4788</span>    }<a name="line.4788"></a>
-<span class="sourceLineNo">4789</span>  }<a name="line.4789"></a>
-<span class="sourceLineNo">4790</span><a name="line.4790"></a>
-<span class="sourceLineNo">4791</span>  /**<a name="line.4791"></a>
-<span class="sourceLineNo">4792</span>   * Test that we get the expected flush results back<a name="line.4792"></a>
-<span class="sourceLineNo">4793</span>   */<a name="line.4793"></a>
-<span class="sourceLineNo">4794</span>  @Test<a name="line.4794"></a>
-<span class="sourceLineNo">4795</span>  public void testFlushResult() throws IOException {<a name="line.4795"></a>
-<span class="sourceLineNo">4796</span>    byte[] family = Bytes.toBytes("family");<a name="line.4796"></a>
-<span class="sourceLineNo">4797</span><a name="line.4797"></a>
-<span class="sourceLineNo">4798</span>    this.region = initHRegion(tableName, method, family);<a name="line.4798"></a>
-<span class="sourceLineNo">4799</span><a name="line.4799"></a>
-<span class="sourceLineNo">4800</span>    // empty memstore, flush doesn't run<a name="line.4800"></a>
-<span class="sourceLineNo">4801</span>    HRegion.FlushResult fr = region.flush(true);<a name="line.4801"></a>
-<span class="sourceLineNo">4802</span>    assertFalse(fr.isFlushSucceeded());<a name="line.4802"></a>
-<span class="sourceLineNo">4803</span>    assertFalse(fr.isCompactionNeeded());<a name="line.4803"></a>
-<span class="sourceLineNo">4804</span><a name="line.4804"></a>
-<span class="sourceLineNo">4805</span>    // Flush enough files to get up to the threshold, doesn't need compactions<a name="line.4805"></a>
-<span class="sourceLineNo">4806</span>    for (int i = 0; i &lt; 2; i++) {<a name="line.4806"></a>
-<span class="sourceLineNo">4807</span>      Put put = new Put(tableName.toBytes()).addColumn(family, family, tableName.toBytes());<a name="line.4807"></a>
-<span class="sourceLineNo">4808</span>      region.put(put);<a name="line.4808"></a>
-<span class="sourceLineNo">4809</span>      fr = region.flush(true);<a name="line.4809"></a>
-<span class="sourceLineNo">4810</span>      assertTrue(fr.isFlushSucceeded());<a name="line.4810"></a>
-<span class="sourceLineNo">4811</span>      assertFalse(fr.isCompactionNeeded());<a name="line.4811"></a>
-<span class="sourceLineNo">4812</span>    }<a name="line.4812"></a>
-<span class="sourceLineNo">4813</span><a name="line.4813"></a>
-<span class="sourceLineNo">4814</span>    // Two flushes after the threshold, compactions are needed<a name="line.4814"></a>
-<span class="sourceLineNo">4815</span>    for (int i = 0; i &lt; 2; i++) {<a name="line.4815"></a>
-<span class="sourceLineNo">4816</span>      Put put = new Put(tableName.toBytes()).addColumn(family, family, tableName.toBytes());<a name="line.4816"></a>
-<span class="sourceLineNo">4817</span>      region.put(put);<a name="line.4817"></a>
-<span class="sourceLineNo">4818</span>      fr = region.flush(true);<a name="line.4818"></a>
-<span class="sourceLineNo">4819</span>      assertTrue(fr.isFlushSucceeded());<a name="line.4819"></a>
-<span class="sourceLineNo">4820</span>      assertTrue(fr.isCompactionNeeded());<a name="line.4820"></a>
-<span class="sourceLineNo">4821</span>    }<a name="line.4821"></a>
-<span class="sourceLineNo">4822</span>  }<a name="line.4822"></a>
+<span class="sourceLineNo">4709</span>  private void putData(int startRow, int numRows, byte[] qf, byte[]... families) throws<a name="line.4709"></a>
+<span class="sourceLineNo">4710</span>      IOException {<a name="line.4710"></a>
+<span class="sourceLineNo">4711</span>    putData(this.region, startRow, numRows, qf, families);<a name="line.4711"></a>
+<span class="sourceLineNo">4712</span>  }<a name="line.4712"></a>
+<span class="sourceLineNo">4713</span><a name="line.4713"></a>
+<span class="sourceLineNo">4714</span>  private void putData(HRegion region,<a name="line.4714"></a>
+<span class="sourceLineNo">4715</span>      int startRow, int numRows, byte[] qf, byte[]... families) throws IOException {<a name="line.4715"></a>
+<span class="sourceLineNo">4716</span>    putData(region, Durability.SKIP_WAL, startRow, numRows, qf, families);<a name="line.4716"></a>
+<span class="sourceLineNo">4717</span>  }<a name="line.4717"></a>
+<span class="sourceLineNo">4718</span><a name="line.4718"></a>
+<span class="sourceLineNo">4719</span>  static void putData(HRegion region, Durability durability,<a name="line.4719"></a>
+<span class="sourceLineNo">4720</span>      int startRow, int numRows, byte[] qf, byte[]... families) throws IOException {<a name="line.4720"></a>
+<span class="sourceLineNo">4721</span>    for (int i = startRow; i &lt; startRow + numRows; i++) {<a name="line.4721"></a>
+<span class="sourceLineNo">4722</span>      Put put = new Put(Bytes.toBytes("" + i));<a name="line.4722"></a>
+<span class="sourceLineNo">4723</span>      put.setDurability(durability);<a name="line.4723"></a>
+<span class="sourceLineNo">4724</span>      for (byte[] family : families) {<a name="line.4724"></a>
+<span class="sourceLineNo">4725</span>        put.addColumn(family, qf, null);<a name="line.4725"></a>
+<span class="sourceLineNo">4726</span>      }<a name="line.4726"></a>
+<span class="sourceLineNo">4727</span>      region.put(put);<a name="line.4727"></a>
+<span class="sourceLineNo">4728</span>      LOG.info(put.toString());<a name="line.4728"></a>
+<span class="sourceLineNo">4729</span>    }<a name="line.4729"></a>
+<span class="sourceLineNo">4730</span>  }<a name="line.4730"></a>
+<span class="sourceLineNo">4731</span><a name="line.4731"></a>
+<span class="sourceLineNo">4732</span>  static void verifyData(HRegion newReg, int startRow, int numRows, byte[] qf, byte[]... families)<a name="line.4732"></a>
+<span class="sourceLineNo">4733</span>      throws IOException {<a name="line.4733"></a>
+<span class="sourceLineNo">4734</span>    for (int i = startRow; i &lt; startRow + numRows; i++) {<a name="line.4734"></a>
+<span class="sourceLineNo">4735</span>      byte[] row = Bytes.toBytes("" + i);<a name="line.4735"></a>
+<span class="sourceLineNo">4736</span>      Get get = new Get(row);<a name="line.4736"></a>
+<span class="sourceLineNo">4737</span>      for (byte[] family : families) {<a name="line.4737"></a>
+<span class="sourceLineNo">4738</span>        get.addColumn(family, qf);<a name="line.4738"></a>
+<span class="sourceLineNo">4739</span>      }<a name="line.4739"></a>
+<span class="sourceLineNo">4740</span>      Result result = newReg.get(get);<a name="line.4740"></a>
+<span class="sourceLineNo">4741</span>      Cell[] raw = result.rawCells();<a name="line.4741"></a>
+<span class="sourceLineNo">4742</span>      assertEquals(families.length, result.size());<a name="line.4742"></a>
+<span class="sourceLineNo">4743</span>      for (int j = 0; j &lt; families.length; j++) {<a name="line.4743"></a>
+<span class="sourceLineNo">4744</span>        assertTrue(CellUtil.matchingRows(raw[j], row));<a name="line.4744"></a>
+<span class="sourceLineNo">4745</span>        assertTrue(CellUtil.matchingFamily(raw[j], families[j]));<a name="line.4745"></a>
+<span class="sourceLineNo">4746</span>        assertTrue(CellUtil.matchingQualifier(raw[j], qf));<a name="line.4746"></a>
+<span class="sourceLineNo">4747</span>      }<a name="line.4747"></a>
+<span class="sourceLineNo">4748</span>    }<a name="line.4748"></a>
+<span class="sourceLineNo">4749</span>  }<a name="line.4749"></a>
+<span class="sourceLineNo">4750</span><a name="line.4750"></a>
+<span class="sourceLineNo">4751</span>  static void assertGet(final HRegion r, final byte[] family, final byte[] k) throws IOException {<a name="line.4751"></a>
+<span class="sourceLineNo">4752</span>    // Now I have k, get values out and assert they are as expected.<a name="line.4752"></a>
+<span class="sourceLineNo">4753</span>    Get get = new Get(k).addFamily(family).readAllVersions();<a name="line.4753"></a>
+<span class="sourceLineNo">4754</span>    Cell[] results = r.get(get).rawCells();<a name="line.4754"></a>
+<span class="sourceLineNo">4755</span>    for (int j = 0; j &lt; results.length; j++) {<a name="line.4755"></a>
+<span class="sourceLineNo">4756</span>      byte[] tmp = CellUtil.cloneValue(results[j]);<a name="line.4756"></a>
+<span class="sourceLineNo">4757</span>      // Row should be equal to value every time.<a name="line.4757"></a>
+<span class="sourceLineNo">4758</span>      assertTrue(Bytes.equals(k, tmp));<a name="line.4758"></a>
+<span class="sourceLineNo">4759</span>    }<a name="line.4759"></a>
+<span class="sourceLineNo">4760</span>  }<a name="line.4760"></a>
+<span class="sourceLineNo">4761</span><a name="line.4761"></a>
+<span class="sourceLineNo">4762</span>  /*<a name="line.4762"></a>
+<span class="sourceLineNo">4763</span>   * Assert first value in the passed region is &lt;code&gt;firstValue&lt;/code&gt;.<a name="line.4763"></a>
+<span class="sourceLineNo">4764</span>   *<a name="line.4764"></a>
+<span class="sourceLineNo">4765</span>   * @param r<a name="line.4765"></a>
+<span class="sourceLineNo">4766</span>   *<a name="line.4766"></a>
+<span class="sourceLineNo">4767</span>   * @param fs<a name="line.4767"></a>
+<span class="sourceLineNo">4768</span>   *<a name="line.4768"></a>
+<span class="sourceLineNo">4769</span>   * @param firstValue<a name="line.4769"></a>
+<span class="sourceLineNo">4770</span>   *<a name="line.4770"></a>
+<span class="sourceLineNo">4771</span>   * @throws IOException<a name="line.4771"></a>
+<span class="sourceLineNo">4772</span>   */<a name="line.4772"></a>
+<span class="sourceLineNo">4773</span>  protected void assertScan(final HRegion r, final byte[] fs, final byte[] firstValue)<a name="line.4773"></a>
+<span class="sourceLineNo">4774</span>      throws IOException {<a name="line.4774"></a>
+<span class="sourceLineNo">4775</span>    byte[][] families = { fs };<a name="line.4775"></a>
+<span class="sourceLineNo">4776</span>    Scan scan = new Scan();<a name="line.4776"></a>
+<span class="sourceLineNo">4777</span>    for (int i = 0; i &lt; families.length; i++)<a name="line.4777"></a>
+<span class="sourceLineNo">4778</span>      scan.addFamily(families[i]);<a name="line.4778"></a>
+<span class="sourceLineNo">4779</span>    InternalScanner s = r.getScanner(scan);<a name="line.4779"></a>
+<span class="sourceLineNo">4780</span>    try {<a name="line.4780"></a>
+<span class="sourceLineNo">4781</span>      List&lt;Cell&gt; curVals = new ArrayList&lt;&gt;();<a name="line.4781"></a>
+<span class="sourceLineNo">4782</span>      boolean first = true;<a name="line.4782"></a>
+<span class="sourceLineNo">4783</span>      OUTER_LOOP: while (s.next(curVals)) {<a name="line.4783"></a>
+<span class="sourceLineNo">4784</span>        for (Cell kv : curVals) {<a name="line.4784"></a>
+<span class="sourceLineNo">4785</span>          byte[] val = CellUtil.cloneValue(kv);<a name="line.4785"></a>
+<span class="sourceLineNo">4786</span>          byte[] curval = val;<a name="line.4786"></a>
+<span class="sourceLineNo">4787</span>          if (first) {<a name="line.4787"></a>
+<span class="sourceLineNo">4788</span>            first = false;<a name="line.4788"></a>
+<span class="sourceLineNo">4789</span>            assertTrue(Bytes.compareTo(curval, firstValue) == 0);<a name="line.4789"></a>
+<span class="sourceLineNo">4790</span>          } else {<a name="line.4790"></a>
+<span class="sourceLineNo">4791</span>            // Not asserting anything. Might as well break.<a name="line.4791"></a>
+<span class="sourceLineNo">4792</span>            break OUTER_LOOP;<a name="line.4792"></a>
+<span class="sourceLineNo">4793</span>          }<a name="line.4793"></a>
+<span class="sourceLineNo">4794</span>        }<a name="line.4794"></a>
+<span class="sourceLineNo">4795</span>      }<a name="line.4795"></a>
+<span class="sourceLineNo">4796</span>    } finally {<a name="line.4796"></a>
+<span class="sourceLineNo">4797</span>      s.close();<a name="line.4797"></a>
+<span class="sourceLineNo">4798</span>    }<a name="line.4798"></a>
+<span class="sourceLineNo">4799</span>  }<a name="line.4799"></a>
+<span class="sourceLineNo">4800</span><a name="line.4800"></a>
+<span class="sourceLineNo">4801</span>  /**<a name="line.4801"></a>
+<span class="sourceLineNo">4802</span>   * Test that we get the expected flush results back<a name="line.4802"></a>
+<span class="sourceLineNo">4803</span>   */<a name="line.4803"></a>
+<span class="sourceLineNo">4804</span>  @Test<a name="line.4804"></a>
+<span class="sourceLineNo">4805</span>  public void testFlushResult() throws IOException {<a name="line.4805"></a>
+<span class="sourceLineNo">4806</span>    byte[] family = Bytes.toBytes("family");<a name="line.4806"></a>
+<span class="sourceLineNo">4807</span><a name="line.4807"></a>
+<span class="sourceLineNo">4808</span>    this.region = initHRegion(tableName, method, family);<a name="line.4808"></a>
+<span class="sourceLineNo">4809</span><a name="line.4809"></a>
+<span class="sourceLineNo">4810</span>    // empty memstore, flush doesn't run<a name="line.4810"></a>
+<span class="sourceLineNo">4811</span>    HRegion.FlushResult fr = region.flush(true);<a name="line.4811"></a>
+<span class="sourceLineNo">4812</span>    assertFalse(fr.isFlushSucceeded());<a name="line.4812"></a>
+<span class="sourceLineNo">4813</span>    assertFalse(fr.isCompactionNeeded());<a name="line.4813"></a>
+<span class="sourceLineNo">4814</span><a name="line.4814"></a>
+<span class="sourceLineNo">4815</span>    // Flush enough files to get up to the threshold, doesn't need compactions<a name="line.4815"></a>
+<span class="sourceLineNo">4816</span>    for (int i = 0; i &lt; 2; i++) {<a name="line.4816"></a>
+<span class="sourceLineNo">4817</span>      Put put = new Put(tableName.toBytes()).addColumn(family, family, tableName.toBytes());<a name="line.4817"></a>
+<span class="sourceLineNo">4818</span>      region.put(put);<a name="line.4818"></a>
+<span class="sourceLineNo">4819</span>      fr = region.flush(true);<a name="line.4819"></a>
+<span class="sourceLineNo">4820</span>      assertTrue(fr.isFlushSucceeded());<a name="line.4820"></a>
+<span class="sourceLineNo">4821</span>      assertFalse(fr.isCompactionNeeded());<a name="line.4821"></a>
+<span class="sourceLineNo">4822</span>    }<a name="line.4822"></a>
 <span class="sourceLineNo">4823</span><a name="line.4823"></a>
-<span class="sourceLineNo">4824</span>  protected Configuration initSplit() {<a name="line.4824"></a>
-<span class="sourceLineNo">4825</span>    // Always compact if there is more than one store file.<a name="line.4825"></a>
-<span class="sourceLineNo">4826</span>    CONF.setInt("hbase.hstore.compactionThreshold", 2);<a name="line.4826"></a>
-<span class="sourceLineNo">4827</span><a name="line.4827"></a>
-<span class="sourceLineNo">4828</span>    CONF.setInt(HConstants.HBASE_CLIENT_SCANNER_TIMEOUT_PERIOD, 10 * 1000);<a name="line.4828"></a>
-<span class="sourceLineNo">4829</span><a name="line.4829"></a>
-<span class="sourceLineNo">4830</span>    // Increase the amount of time between client retries<a name="line.4830"></a>
-<span class="sourceLineNo">4831</span>    CONF.setLong("hbase.client.pause", 15 * 1000);<a name="line.4831"></a>
-<span class="sourceLineNo">4832</span><a name="line.4832"></a>
-<span class="sourceLineNo">4833</span>    // This size should make it so we always split using the addContent<a name="line.4833"></a>
-<span class="sourceLineNo">4834</span>    // below. After adding all data, the first region is 1.3M<a name="line.4834"></a>
-<span class="sourceLineNo">4835</span>    CONF.setLong(HConstants.HREGION_MAX_FILESIZE, 1024 * 128);<a name="line.4835"></a>
-<span class="sourceLineNo">4836</span>    return CONF;<a name="line.4836"></a>
-<span class="sourceLineNo">4837</span>  }<a name="line.4837"></a>
-<span class="sourceLineNo">4838</span><a name="line.4838"></a>
-<span class="sourceLineNo">4839</span>  /**<a name="line.4839"></a>
-<span class="sourceLineNo">4840</span>   * @return A region on which you must call<a name="line.4840"></a>
-<span class="sourceLineNo">4841</span>   *         {@link HBaseTestingUtility#closeRegionAndWAL(HRegion)} when done.<a name="line.4841"></a>
-<span class="sourceLineNo">4842</span>   */<a name="line.4842"></a>
-<span class="sourceLineNo">4843</span>  protected HRegion initHRegion(TableName tableName, String callingMethod, Configuration conf,<a name="line.4843"></a>
-<span class="sourceLineNo">4844</span>      byte[]... families) throws IOException {<a name="line.4844"></a>
-<span class="sourceLineNo">4845</span>    return initHRegion(tableName, callingMethod, conf, false, families);<a name="line.4845"></a>
-<span class="sourceLineNo">4846</span>  }<a name="line.4846"></a>
-<span class="sourceLineNo">4847</span><a name="line.4847"></a>
-<span class="sourceLineNo">4848</span>  /**<a name="line.4848"></a>
-<span class="sourceLineNo">4849</span>   * @return A region on which you must call<a name="line.4849"></a>
-<span class="sourceLineNo">4850</span>   *         {@link HBaseTestingUtility#closeRegionAndWAL(HRegion)} when done.<a name="line.4850"></a>
-<span class="sourceLineNo">4851</span>   */<a name="line.4851"></a>
-<span class="sourceLineNo">4852</span>  protected HRegion initHRegion(TableName tableName, String callingMethod, Configuration conf,<a name="line.4852"></a>
-<span class="sourceLineNo">4853</span>      boolean isReadOnly, byte[]... families) throws IOException {<a name="line.4853"></a>
-<span class="sourceLineNo">4854</span>    return initHRegion(tableName, null, null, callingMethod, conf, isReadOnly, families);<a name="line.4854"></a>
-<span class="sourceLineNo">4855</span>  }<a name="line.4855"></a>
-<span class="sourceLineNo">4856</span><a name="line.4856"></a>
-<span class="sourceLineNo">4857</span>  protected HRegion initHRegion(TableName tableName, byte[] startKey, byte[] stopKey,<a name="line.4857"></a>
-<span class="sourceLineNo">4858</span>      String callingMethod, Configuration conf, boolean isReadOnly, byte[]... families)<a name="line.4858"></a>
-<span class="sourceLineNo">4859</span>      throws IOException {<a name="line.4859"></a>
-<span class="sourceLineNo">4860</span>    Path logDir = TEST_UTIL.getDataTestDirOnTestFS(callingMethod + ".log");<a name="line.4860"></a>
-<span class="sourceLineNo">4861</span>    ChunkCreator.initialize(MemStoreLABImpl.CHUNK_SIZE_DEFAULT, false, 0, 0, 0, null);<a name="line.4861"></a>
-<span class="sourceLineNo">4862</span>    HRegionInfo hri = new HRegionInfo(tableName, startKey, stopKey);<a name="line.4862"></a>
-<span class="sourceLineNo">4863</span>    final WAL wal = HBaseTestingUtility.createWal(conf, logDir, hri);<a name="line.4863"></a>
-<span class="sourceLineNo">4864</span>    return initHRegion(tableName, startKey, stopKey, isReadOnly,<a name="line.4864"></a>
-<span class="sourceLineNo">4865</span>        Durability.SYNC_WAL, wal, families);<a name="line.4865"></a>
-<span class="sourceLineNo">4866</span>  }<a name="line.4866"></a>
-<span class="sourceLineNo">4867</span><a name="line.4867"></a>
-<span class="sourceLineNo">4868</span>  /**<a name="line.4868"></a>
-<span class="sourceLineNo">4869</span>   * @return A region on which you must call<a name="line.4869"></a>
-<span class="sourceLineNo">4870</span>   *         {@link HBaseTestingUtility#closeRegionAndWAL(HRegion)} when done.<a name="line.4870"></a>
-<span class="sourceLineNo">4871</span>   */<a name="line.4871"></a>
-<span class="sourceLineNo">4872</span>  public HRegion initHRegion(TableName tableName, byte[] startKey, byte[] stopKey,<a name="line.4872"></a>
-<span class="sourceLineNo">4873</span>      boolean isReadOnly, Durability durability, WAL wal, byte[]... families) throws IOException {<a name="line.4873"></a>
-<span class="sourceLineNo">4874</span>    return TEST_UTIL.createLocalHRegion(tableName, startKey, stopKey,<a name="line.4874"></a>
-<span class="sourceLineNo">4875</span>        isReadOnly, durability, wal, families);<a name="line.4875"></a>
+<span class="sourceLineNo">4824</span>    // Two flushes after the threshold, compactions are needed<a name="line.4824"></a>
+<span class="sourceLineNo">4825</span>    for (int i = 0; i &lt; 2; i++) {<a name="line.4825"></a>
+<span class="sourceLineNo">4826</span>      Put put = new Put(tableName.toBytes()).addColumn(family, family, tableName.toBytes());<a name="line.4826"></a>
+<span class="sourceLineNo">4827</span>      region.put(put);<a name="line.4827"></a>
+<span class="sourceLineNo">4828</span>      fr = region.flush(true);<a name="line.4828"></a>
+<span class="sourceLineNo">4829</span>      assertTrue(fr.isFlushSucceeded());<a name="line.4829"></a>
+<span class="sourceLineNo">4830</span>      assertTrue(fr.isCompactionNeeded());<a name="line.4830"></a>
+<span class="sourceLineNo">4831</span>    }<a name="line.4831"></a>
+<span class="sourceLineNo">4832</span>  }<a name="line.4832"></a>
+<span class="sourceLineNo">4833</span><a name="line.4833"></a>
+<span class="sourceLineNo">4834</span>  protected Configuration initSplit() {<a name="line.4834"></a>
+<span class="sourceLineNo">4835</span>    // Always compact if there is more than one store file.<a name="line.4835"></a>
+<span class="sourceLineNo">4836</span>    CONF.setInt("hbase.hstore.compactionThreshold", 2);<a name="line.4836"></a>
+<span class="sourceLineNo">4837</span><a name="line.4837"></a>
+<span class="sourceLineNo">4838</span>    CONF.setInt(HConstants.HBASE_CLIENT_SCANNER_TIMEOUT_PERIOD, 10 * 1000);<a name="line.4838"></a>
+<span class="sourceLineNo">4839</span><a name="line.4839"></a>
+<span class="sourceLineNo">4840</span>    // Increase the amount of time between client retries<a name="line.4840"></a>
+<span class="sourceLineNo">4841</span>    CONF.setLong("hbase.client.pause", 15 * 1000);<a name="line.4841"></a>
+<span class="sourceLineNo">4842</span><a name="line.4842"></a>
+<span class="sourceLineNo">4843</span>    // This size should make it so we always split using the addContent<a name="line.4843"></a>
+<span class="sourceLineNo">4844</span>    // below. After adding all data, the first region is 1.3M<a name="line.4844"></a>
+<span class="sourceLineNo">4845</span>    CONF.setLong(HConstants.HREGION_MAX_FILESIZE, 1024 * 128);<a name="line.4845"></a>
+<span class="sourceLineNo">4846</span>    return CONF;<a name="line.4846"></a>
+<span class="sourceLineNo">4847</span>  }<a name="line.4847"></a>
+<span class="sourceLineNo">4848</span><a name="line.4848"></a>
+<span class="sourceLineNo">4849</span>  /**<a name="line.4849"></a>
+<span class="sourceLineNo">4850</span>   * @return A region on which you must call<a name="line.4850"></a>
+<span class="sourceLineNo">4851</span>   *         {@link HBaseTestingUtility#closeRegionAndWAL(HRegion)} when done.<a name="line.4851"></a>
+<span class="sourceLineNo">4852</span>   */<a name="line.4852"></a>
+<span class="sourceLineNo">4853</span>  protected HRegion initHRegion(TableName tableName, String callingMethod, Configuration conf,<a name="line.4853"></a>
+<span class="sourceLineNo">4854</span>      byte[]... families) throws IOException {<a name="line.4854"></a>
+<span class="sourceLineNo">4855</span>    return initHRegion(tableName, callingMethod, conf, false, families);<a name="line.4855"></a>
+<span class="sourceLineNo">4856</span>  }<a name="line.4856"></a>
+<span class="sourceLineNo">4857</span><a name="line.4857"></a>
+<span class="sourceLineNo">4858</span>  /**<a name="line.4858"></a>
+<span class="sourceLineNo">4859</span>   * @return A region on which you must call<a name="line.4859"></a>
+<span class="sourceLineNo">4860</span>   *         {@link HBaseTestingUtility#closeRegionAndWAL(HRegion)} when done.<a name="line.4860"></a>
+<span class="sourceLineNo">4861</span>   */<a name="line.4861"></a>
+<span class="sourceLineNo">4862</span>  protected HRegion initHRegion(TableName tableName, String callingMethod, Configuration conf,<a name="line.4862"></a>
+<span class="sourceLineNo">4863</span>      boolean isReadOnly, byte[]... families) throws IOException {<a name="line.4863"></a>
+<span class="sourceLineNo">4864</span>    return initHRegion(tableName, null, null, callingMethod, conf, isReadOnly, families);<a name="line.4864"></a>
+<span class="sourceLineNo">4865</span>  }<a name="line.4865"></a>
+<span class="sourceLineNo">4866</span><a name="line.4866"></a>
+<span class="sourceLineNo">4867</span>  protected HRegion initHRegion(TableName tableName, byte[] startKey, byte[] stopKey,<a name="line.4867"></a>
+<span class="sourceLineNo">4868</span>      String callingMethod, Configuration conf, boolean isReadOnly, byte[]... families)<a name="line.4868"></a>
+<span class="sourceLineNo">4869</span>      throws IOException {<a name="line.4869"></a>
+<span class="sourceLineNo">4870</span>    Path logDir = TEST_UTIL.getDataTestDirOnTestFS(callingMethod + ".log");<a name="line.4870"></a>
+<span class="sourceLineNo">4871</span>    ChunkCreator.initialize(MemStoreLABImpl.CHUNK_SIZE_DEFAULT, false, 0, 0, 0, null);<a name="line.4871"></a>
+<span class="sourceLineNo">4872</span>    HRegionInfo hri = new HRegionInfo(tableName, startKey, stopKey);<a name="line.4872"></a>
+<span class="sourceLineNo">4873</span>    final WAL wal = HBaseTestingUtility.createWal(conf, logDir, hri);<a name="line.4873"></a>
+<span class="sourceLineNo">4874</span>    return initHRegion(tableName, startKey, stopKey, isReadOnly,<a name="line.4874"></a>
+<span class="sourceLineNo">4875</span>        Durability.SYNC_WAL, wal, families);<a name="line.4875"></a>
 <span class="sourceLineNo">4876</span>  }<a name="line.4876"></a>
 <span class="sourceLineNo">4877</span><a name="line.4877"></a>
 <span class="sourceLineNo">4878</span>  /**<a name="line.4878"></a>
-<span class="sourceLineNo">4879</span>   * Assert that the passed in Cell has expected contents for the specified row,<a name="line.4879"></a>
-<span class="sourceLineNo">4880</span>   * column &amp; timestamp.<a name="line.4880"></a>
+<span class="sourceLineNo">4879</span>   * @return A region on which you must call<a name="line.4879"></a>
+<span class="sourceLineNo">4880</span>   *         {@link HBaseTestingUtility#closeRegionAndWAL(HRegion)} when done.<a name="line.4880"></a>
 <span class="sourceLineNo">4881</span>   */<a name="line.4881"></a>
-<span class="sourceLineNo">4882</span>  private void checkOneCell(Cell kv, byte[] cf, int rowIdx, int colIdx, long ts) {<a name="line.4882"></a>
-<span class="sourceLineNo">4883</span>    String ctx = "rowIdx=" + rowIdx + "; colIdx=" + colIdx + "; ts=" + ts;<a name="line.4883"></a>
-<span class="sourceLineNo">4884</span>    assertEquals("Row mismatch which checking: " + ctx, "row:" + rowIdx,<a name="line.4884"></a>
-<span class="sourceLineNo">4885</span>        Bytes.toString(CellUtil.cloneRow(kv)));<a name="line.4885"></a>
-<span class="sourceLineNo">4886</span>    assertEquals("ColumnFamily mismatch while checking: " + ctx, Bytes.toString(cf),<a name="line.4886"></a>
-<span class="sourceLineNo">4887</span>        Bytes.toString(CellUtil.cloneFamily(kv)));<a name="line.4887"></a>
-<span class="sourceLineNo">4888</span>    assertEquals("Column qualifier mismatch while checking: " + ctx, "column:" + colIdx,<a name="line.4888"></a>
-<span class="sourceLineNo">4889</span>        Bytes.toString(CellUtil.cloneQualifier(kv)));<a name="line.4889"></a>
-<span class="sourceLineNo">4890</span>    assertEquals("Timestamp mismatch while checking: " + ctx, ts, kv.getTimestamp());<a name="line.4890"></a>
-<span class="sourceLineNo">4891</span>    assertEquals("Value mismatch while checking: " + ctx, "value-version-" + ts,<a name="line.4891"></a>
-<span class="sourceLineNo">4892</span>        Bytes.toString(CellUtil.cloneValue(kv)));<a name="line.4892"></a>
-<span class="sourceLineNo">4893</span>  }<a name="line.4893"></a>
-<span class="sourceLineNo">4894</span><a name="line.4894"></a>
-<span class="sourceLineNo">4895</span>  @Test<a name="line.4895"></a>
-<span class="sourceLineNo">4896</span>  public void testReverseScanner_FromMemStore_SingleCF_Normal()<a name="line.4896"></a>
-<span class="sourceLineNo">4897</span>      throws IOException {<a name="line.4897"></a>
-<span class="sourceLineNo">4898</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.4898"></a>
-<span class="sourceLineNo">4899</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.4899"></a>
-<span class="sourceLineNo">4900</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.4900"></a>
-<span class="sourceLineNo">4901</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.4901"></a>
-<span class="sourceLineNo">4902</span>    byte[][] families = { cf };<a name="line.4902"></a>
-<span class="sourceLineNo">4903</span>    byte[] col = Bytes.toBytes("C");<a name="line.4903"></a>
-<span class="sourceLineNo">4904</span>    long ts = 1;<a name="line.4904"></a>
-<span class="sourceLineNo">4905</span>    this.region = initHRegion(tableName, method, families);<a name="line.4905"></a>
-<span class="sourceLineNo">4906</span>    KeyValue kv1 = new KeyValue(rowC, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4906"></a>
-<span class="sourceLineNo">4907</span>    KeyValue kv11 = new KeyValue(rowC, cf, col, ts + 1, KeyValue.Type.Put,<a name="line.4907"></a>
-<span class="sourceLineNo">4908</span>        null);<a name="line.4908"></a>
-<span class="sourceLineNo">4909</span>    KeyValue kv2 = new KeyValue(rowA, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4909"></a>
-<span class="sourceLineNo">4910</span>    KeyValue kv3 = new KeyValue(rowB, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4910"></a>
-<span class="sourceLineNo">4911</span>    Put put = null;<a name="line.4911"></a>
-<span class="sourceLineNo">4912</span>    put = new Put(rowC);<a name="line.4912"></a>
-<span class="sourceLineNo">4913</span>    put.add(kv1);<a name="line.4913"></a>
-<span class="sourceLineNo">4914</span>    put.add(kv11);<a name="line.4914"></a>
-<span class="sourceLineNo">4915</span>    region.put(put);<a name="line.4915"></a>
-<span class="sourceLineNo">4916</span>    put = new Put(rowA);<a name="line.4916"></a>
-<span class="sourceLineNo">4917</span>    put.add(kv2);<a name="line.4917"></a>
-<span class="sourceLineNo">4918</span>    region.put(put);<a name="line.4918"></a>
-<span class="sourceLineNo">4919</span>    put = new Put(rowB);<a name="line.4919"></a>
-<span class="sourceLineNo">4920</span>    put.add(kv3);<a name="line.4920"></a>
-<span class="sourceLineNo">4921</span>    region.put(put);<a name="line.4921"></a>
-<span class="sourceLineNo">4922</span><a name="line.4922"></a>
-<span class="sourceLineNo">4923</span>    Scan scan = new Scan(rowC);<a name="line.4923"></a>
-<span class="sourceLineNo">4924</span>    scan.setMaxVersions(5);<a name="line.4924"></a>
-<span class="sourceLineNo">4925</span>    scan.setReversed(true);<a name="line.4925"></a>
-<span class="sourceLineNo">4926</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.4926"></a>
-<span class="sourceLineNo">4927</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.4927"></a>
-<span class="sourceLineNo">4928</span>    boolean hasNext = scanner.next(currRow);<a name="line.4928"></a>
-<span class="sourceLineNo">4929</span>    assertEquals(2, currRow.size());<a name="line.4929"></a>
-<span class="sourceLineNo">4930</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4930"></a>
-<span class="sourceLineNo">4931</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.4931"></a>
-<span class="sourceLineNo">4932</span>    assertTrue(hasNext);<a name="line.4932"></a>
-<span class="sourceLineNo">4933</span>    currRow.clear();<a name="line.4933"></a>
-<span class="sourceLineNo">4934</span>    hasNext = scanner.next(currRow);<a name="line.4934"></a>
-<span class="sourceLineNo">4935</span>    assertEquals(1, currRow.size());<a name="line.4935"></a>
-<span class="sourceLineNo">4936</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4936"></a>
-<span class="sourceLineNo">4937</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.4937"></a>
-<span class="sourceLineNo">4938</span>    assertTrue(hasNext);<a name="line.4938"></a>
-<span class="sourceLineNo">4939</span>    currRow.clear();<a name="line.4939"></a>
-<span class="sourceLineNo">4940</span>    hasNext = scanner.next(currRow);<a name="line.4940"></a>
-<span class="sourceLineNo">4941</span>    assertEquals(1, currRow.size());<a name="line.4941"></a>
-<span class="sourceLineNo">4942</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4942"></a>
-<span class="sourceLineNo">4943</span>        .get(0).getRowLength(), rowA, 0, rowA.length));<a name="line.4943"></a>
-<span class="sourceLineNo">4944</span>    assertFalse(hasNext);<a name="line.4944"></a>
-<span class="sourceLineNo">4945</span>    scanner.close();<a name="line.4945"></a>
-<span class="sourceLineNo">4946</span>  }<a name="line.4946"></a>
-<span class="sourceLineNo">4947</span><a name="line.4947"></a>
-<span class="sourceLineNo">4948</span>  @Test<a name="line.4948"></a>
-<span class="sourceLineNo">4949</span>  public void testReverseScanner_FromMemStore_SingleCF_LargerKey()<a name="line.4949"></a>
-<span class="sourceLineNo">4950</span>      throws IOException {<a name="line.4950"></a>
-<span class="sourceLineNo">4951</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.4951"></a>
-<span class="sourceLineNo">4952</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.4952"></a>
-<span class="sourceLineNo">4953</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.4953"></a>
-<span class="sourceLineNo">4954</span>    byte[] rowD = Bytes.toBytes("rowD");<a name="line.4954"></a>
-<span class="sourceLineNo">4955</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.4955"></a>
-<span class="sourceLineNo">4956</span>    byte[][] families = { cf };<a name="line.4956"></a>
-<span class="sourceLineNo">4957</span>    byte[] col = Bytes.toBytes("C");<a name="line.4957"></a>
-<span class="sourceLineNo">4958</span>    long ts = 1;<a name="line.4958"></a>
-<span class="sourceLineNo">4959</span>    this.region = initHRegion(tableName, method, families);<a name="line.4959"></a>
-<span class="sourceLineNo">4960</span>    KeyValue kv1 = new KeyValue(rowC, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4960"></a>
-<span class="sourceLineNo">4961</span>    KeyValue kv11 = new KeyValue(rowC, cf, col, ts + 1, KeyValue.Type.Put,<a name="line.4961"></a>
-<span class="sourceLineNo">4962</span>        null);<a name="line.4962"></a>
-<span class="sourceLineNo">4963</span>    KeyValue kv2 = new KeyValue(rowA, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4963"></a>
-<span class="sourceLineNo">4964</span>    KeyValue kv3 = new KeyValue(rowB, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4964"></a>
-<span class="sourceLineNo">4965</span>    Put put = null;<a name="line.4965"></a>
-<span class="sourceLineNo">4966</span>    put = new Put(rowC);<a name="line.4966"></a>
-<span class="sourceLineNo">4967</span>    put.add(kv1);<a name="line.4967"></a>
-<span class="sourceLineNo">4968</span>    put.add(kv11);<a name="line.4968"></a>
-<span class="sourceLineNo">4969</span>    region.put(put);<a name="line.4969"></a>
-<span class="sourceLineNo">4970</span>    put = new Put(rowA);<a name="line.4970"></a>
-<span class="sourceLineNo">4971</span>    put.add(kv2);<a name="line.4971"></a>
-<span class="sourceLineNo">4972</span>    region.put(put);<a name="line.4972"></a>
-<span class="sourceLineNo">4973</span>    put = new Put(rowB);<a name="line.4973"></a>
-<span class="sourceLineNo">4974</span>    put.add(kv3);<a name="line.4974"></a>
-<span class="sourceLineNo">4975</span>    region.put(put);<a name="line.4975"></a>
-<span class="sourceLineNo">4976</span><a name="line.4976"></a>
-<span class="sourceLineNo">4977</span>    Scan scan = new Scan(rowD);<a name="line.4977"></a>
-<span class="sourceLineNo">4978</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.4978"></a>
-<span class="sourceLineNo">4979</span>    scan.setReversed(true);<a name="line.4979"></a>
-<span class="sourceLineNo">4980</span>    scan.setMaxVersions(5);<a name="line.4980"></a>
-<span class="sourceLineNo">4981</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.4981"></a>
-<span class="sourceLineNo">4982</span>    boolean hasNext = scanner.next(currRow);<a name="line.4982"></a>
-<span class="sourceLineNo">4983</span>    assertEquals(2, currRow.size());<a name="line.4983"></a>
-<span class="sourceLineNo">4984</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4984"></a>
-<span class="sourceLineNo">4985</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.4985"></a>
-<span class="sourceLineNo">4986</span>    assertTrue(hasNext);<a name="line.4986"></a>
-<span class="sourceLineNo">4987</span>    currRow.clear();<a name="line.4987"></a>
-<span class="sourceLineNo">4988</span>    hasNext = scanner.next(currRow);<a name="line.4988"></a>
-<span class="sourceLineNo">4989</span>    assertEquals(1, currRow.size());<a name="line.4989"></a>
-<span class="sourceLineNo">4990</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4990"></a>
-<span class="sourceLineNo">4991</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.4991"></a>
-<span class="sourceLineNo">4992</span>    assertTrue(hasNext);<a name="line.4992"></a>
-<span class="sourceLineNo">4993</span>    currRow.clear();<a name="line.4993"></a>
-<span class="sourceLineNo">4994</span>    hasNext = scanner.next(currRow);<a name="line.4994"></a>
-<span class="sourceLineNo">4995</span>    assertEquals(1, currRow.size());<a name="line.4995"></a>
-<span class="sourceLineNo">4996</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4996"></a>
-<span class="sourceLineNo">4997</span>        .get(0).getRowLength(), rowA, 0, rowA.length));<a name="line.4997"></a>
-<span class="sourceLineNo">4998</span>    assertFalse(hasNext);<a name="line.4998"></a>
-<span class="sourceLineNo">4999</span>    scanner.close();<a name="line.4999"></a>
-<span class="sourceLineNo">5000</span>  }<a name="line.5000"></a>
-<span class="sourceLineNo">5001</span><a name="line.5001"></a>
-<span class="sourceLineNo">5002</span>  @Test<a name="line.5002"></a>
-<span class="sourceLineNo">5003</span>  public void testReverseScanner_FromMemStore_SingleCF_FullScan()<a name="line.5003"></a>
-<span class="sourceLineNo">5004</span>      throws IOException {<a name="line.5004"></a>
-<span class="sourceLineNo">5005</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.5005"></a>
-<span class="sourceLineNo">5006</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.5006"></a>
-<span class="sourceLineNo">5007</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.5007"></a>
-<span class="sourceLineNo">5008</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.5008"></a>
-<span class="sourceLineNo">5009</span>    byte[][] families = { cf };<a name="line.5009"></a>
-<span class="sourceLineNo">5010</span>    byte[] col = Bytes.toBytes("C");<a name="line.5010"></a>
-<span class="sourceLineNo">5011</span>    long ts = 1;<a name="line.5011"></a>
-<span class="sourceLineNo">5012</span>    this.region = initHRegion(tableName, method, families);<a name="line.5012"></a>
-<span class="sourceLineNo">5013</span>    KeyValue kv1 = new KeyValue(rowC, cf, col, ts, KeyValue.Type.Put, null);<a name="line.5013"></a>
-<span class="sourceLineNo">5014</span>    KeyValue kv11 = new KeyValue(rowC, cf, col, ts + 1, KeyValue.Type.Put,<a name="line.5014"></a>
-<span class="sourceLineNo">5015</span>        null);<a name="line.5015"></a>
-<span class="sourceLineNo">5016</span>    KeyValue kv2 = new KeyValue(rowA, cf, col, ts, KeyValue.Type.Put, null);<a name="line.5016"></a>
-<span class="sourceLineNo">5017</span>    KeyValue kv3 = new KeyValue(rowB, cf, col, ts, KeyValue.Type.Put, null);<a name="line.5017"></a>
-<span class="sourceLineNo">5018</span>    Put put = null;<a name="line.5018"></a>
-<span class="sourceLineNo">5019</span>    put = new Put(rowC);<a name="line.5019"></a>
-<span class="sourceLineNo">5020</span>    put.add(kv1);<a name="line.5020"></a>
-<span class="sourceLineNo">5021</span>    put.add(kv11);<a name="line.5021"></a>
-<span class="sourceLineNo">5022</span>    region.put(put);<a name="line.5022"></a>
-<span class="sourceLineNo">5023</span>    put = new Put(rowA);<a name="line.5023"></a>
-<span class="sourceLineNo">5024</span>    put.add(kv2);<a name="line.5024"></a>
-<span class="sourceLineNo">5025</span>    region.put(put);<a name="line.5025"></a>
-<span class="sourceLineNo">5026</span>    put = new Put(rowB);<a name="line.5026"></a>
-<span class="sourceLineNo">5027</span>    put.add(kv3);<a name="line.5027"></a>
-<span class="sourceLineNo">5028</span>    region.put(put);<a name="line.5028"></a>
-<span class="sourceLineNo">5029</span>    Scan scan = new Scan();<a name="line.5029"></a>
-<span class="sourceLineNo">5030</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5030"></a>
-<span class="sourceLineNo">5031</span>    scan.setReversed(true);<a name="line.5031"></a>
-<span class="sourceLineNo">5032</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5032"></a>
-<span class="sourceLineNo">5033</span>    boolean hasNext = scanner.next(currRow);<a name="line.5033"></a>
-<span class="sourceLineNo">5034</span>    assertEquals(1, currRow.size());<a name="line.5034"></a>
-<span class="sourceLineNo">5035</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5035"></a>
-<span class="sourceLineNo">5036</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.5036"></a>
-<span class="sourceLineNo">5037</span>    assertTrue(hasNext);<a name="line.5037"></a>
-<span class="sourceLineNo">5038</span>    currRow.clear();<a name="line.5038"></a>
-<span class="sourceLineNo">5039</span>    hasNext = scanner.next(currRow);<a name="line.5039"></a>
-<span class="sourceLineNo">5040</span>    assertEquals(1, currRow.size());<a name="line.5040"></a>
-<span class="sourceLineNo">5041</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5041"></a>
-<span class="sourceLineNo">5042</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.5042"></a>
-<span class="sourceLineNo">5043</span>    assertTrue(hasNext);<a name="line.5043"></a>
-<span class="sourceLineNo">5044</span>    currRow.clear();<a name="line.5044"></a>
-<span class="sourceLineNo">5045</span>    hasNext = scanner.next(currRow);<a name="line.5045"></a>
-<span class="sourceLineNo">5046</span>    assertEquals(1, currRow.size());<a name="line.5046"></a>
-<span class="sourceLineNo">5047</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5047"></a>
-<span class="sourceLineNo">5048</span>        .get(0).getRowLength(), rowA, 0, rowA.length));<a name="line.5048"></a>
-<span class="sourceLineNo">5049</span>    assertFalse(hasNext);<a name="line.5049"></a>
-<span class="sourceLineNo">5050</span>    scanner.close();<a name="line.5050"></a>
-<span class="sourceLineNo">5051</span>  }<a name="line.5051"></a>
-<span class="sourceLineNo">5052</span><a name="line.5052"></a>
-<span class="sourceLineNo">5053</span>  @Test<a name="line.5053"></a>
-<span class="sourceLineNo">5054</span>  public void testReverseScanner_moreRowsMayExistAfter() throws IOException {<a name="line.5054"></a>
-<span class="sourceLineNo">5055</span>    // case for "INCLUDE_AND_SEEK_NEXT_ROW &amp; SEEK_NEXT_ROW" endless loop<a name="line.5055"></a>
-<span class="sourceLineNo">5056</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.5056"></a>
-<span class="sourceLineNo">5057</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.5057"></a>
-<span class="sourceLineNo">5058</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.5058"></a>
-<span class="sourceLineNo">5059</span>    byte[] rowD = Bytes.toBytes("rowD");<a name="line.5059"></a>
-<span class="sourceLineNo">5060</span>    byte[] rowE = Bytes.toBytes("rowE");<a name="line.5060"></a>
-<span class="sourceLineNo">5061</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.5061"></a>
-<span class="sourceLineNo">5062</span>    byte[][] families = { cf };<a name="line.5062"></a>
-<span class="sourceLineNo">5063</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.5063"></a>
-<span class="sourceLineNo">5064</span>    byte[] col2 = Bytes.toBytes("col2");<a name="line.5064"></a>
-<span class="sourceLineNo">5065</span>    long ts = 1;<a name="line.5065"></a>
-<span class="sourceLineNo">5066</span>    this.region = initHRegion(tableName, method, families);<a name="line.5066"></a>
-<span class="sourceLineNo">5067</span>    KeyValue kv1 = new KeyValue(rowA, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5067"></a>
-<span class="sourceLineNo">5068</span>    KeyValue kv2 = new KeyValue(rowB, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5068"></a>
-<span class="sourceLineNo">5069</span>    KeyValue kv3 = new KeyValue(rowC, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5069"></a>
-<span class="sourceLineNo">5070</span>    KeyValue kv4_1 = new KeyValue(rowD, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5070"></a>
-<span class="sourceLineNo">5071</span>    KeyValue kv4_2 = new KeyValue(rowD, cf, col2, ts, KeyValue.Type.Put, null);<a name="line.5071"></a>
-<span class="sourceLineNo">5072</span>    KeyValue kv5 = new KeyValue(rowE, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5072"></a>
-<span class="sourceLineNo">5073</span>    Put put = null;<a name="line.5073"></a>
-<span class="sourceLineNo">5074</span>    put = new Put(rowA);<a name="line.5074"></a>
-<span class="sourceLineNo">5075</span>    put.add(kv1);<a name="line.5075"></a>
-<span class="sourceLineNo">5076</span>    region.put(put);<a name="line.5076"></a>
-<span class="sourceLineNo">5077</span>    put = new Put(rowB);<a name="line.5077"></a>
-<span class="sourceLineNo">5078</span>    put.add(kv2);<a name="line.5078"></a>
-<span class="sourceLineNo">5079</span>    region.put(put);<a name="line.5079"></a>
-<span class="sourceLineNo">5080</span>    put = new Put(rowC);<a name="line.5080"></a>
-<span class="sourceLineNo">5081</span>    put.add(kv3);<a name="line.5081"></a>
-<span class="sourceLineNo">5082</span>    region.put(put);<a name="line.5082"></a>
-<span class="sourceLineNo">5083</span>    put = new Put(rowD);<a name="line.5083"></a>
-<span class="sourceLineNo">5084</span>    put.add(kv4_1);<a name="line.5084"></a>
-<span class="sourceLineNo">5085</span>    region.put(put);<a name="line.5085"></a>
-<span class="sourceLineNo">5086</span>    put = new Put(rowD);<a name="line.5086"></a>
-<span class="sourceLineNo">5087</span>    put.add(kv4_2);<a name="line.5087"></a>
-<span class="sourceLineNo">5088</span>    region.put(put);<a name="line.5088"></a>
-<span class="sourceLineNo">5089</span>    put = new Put(rowE);<a name="line.5089"></a>
-<span class="sourceLineNo">5090</span>    put.add(kv5);<a name="line.5090"></a>
-<span class="sourceLineNo">5091</span>    region.put(put);<a name="line.5091"></a>
-<span class="sourceLineNo">5092</span>    region.flush(true);<a name="line.5092"></a>
-<span class="sourceLineNo">5093</span>    Scan scan = new Scan(rowD, rowA);<a name="line.5093"></a>
-<span class="sourceLineNo">5094</span>    scan.addColumn(families[0], col1);<a name="line.5094"></a>
-<span class="sourceLineNo">5095</span>    scan.setReversed(true);<a name="line.5095"></a>
-<span class="sourceLineNo">5096</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5096"></a>
-<span class="sourceLineNo">5097</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5097"></a>
-<span class="sourceLineNo">5098</span>    boolean hasNext = scanner.next(currRow);<a name="line.5098"></a>
-<span class="sourceLineNo">5099</span>    assertEquals(1, currRow.size());<a name="line.5099"></a>
-<span class="sourceLineNo">5100</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5100"></a>
-<span class="sourceLineNo">5101</span>        .get(0).getRowLength(), rowD, 0, rowD.length));<a name="line.5101"></a>
-<span class="sourceLineNo">5102</span>    assertTrue(hasNext);<a name="line.5102"></a>
-<span class="sourceLineNo">5103</span>    currRow.clear();<a name="line.5103"></a>
-<span class="sourceLineNo">5104</span>    hasNext = scanner.next(currRow);<a name="line.5104"></a>
-<span class="sourceLineNo">5105</span>    assertEquals(1, currRow.size());<a name="line.5105"></a>
-<span class="sourceLineNo">5106</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5106"></a>
-<span class="sourceLineNo">5107</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.5107"></a>
-<span class="sourceLineNo">5108</span>    assertTrue(hasNext);<a name="line.5108"></a>
-<span class="sourceLineNo">5109</span>    currRow.clear();<a name="line.5109"></a>
-<span class="sourceLineNo">5110</span>    hasNext = scanner.next(currRow);<a name="line.5110"></a>
-<span class="sourceLineNo">5111</span>    assertEquals(1, currRow.size());<a name="line.5111"></a>
-<span class="sourceLineNo">5112</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5112"></a>
-<span class="sourceLineNo">5113</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.5113"></a>
-<span class="sourceLineNo">5114</span>    assertFalse(hasNext);<a name="line.5114"></a>
-<span class="sourceLineNo">5115</span>    scanner.close();<a name="line.5115"></a>
-<span class="sourceLineNo">5116</span><a name="line.5116"></a>
-<span class="sourceLineNo">5117</span>    scan = new Scan(rowD, rowA);<a name="line.5117"></a>
-<span class="sourceLineNo">5118</span>    scan.addColumn(families[0], col2);<a name="line.5118"></a>
-<span class="sourceLineNo">5119</span>    scan.setReversed(true);<a name="line.5119"></a>
-<span class="sourceLineNo">5120</span>    currRow.clear();<a name="line.5120"></a>
-<span class="sourceLineNo">5121</span>    scanner = region.getScanner(scan);<a name="line.5121"></a>
-<span class="sourceLineNo">5122</span>    hasNext = scanner.next(currRow);<a name="line.5122"></a>
-<span class="sourceLineNo">5123</span>    assertEquals(1, currRow.size());<a name="line.5123"></a>
-<span class="sourceLineNo">5124</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5124"></a>
-<span class="sourceLineNo">5125</span>        .get(0).getRowLength(), rowD, 0, rowD.length));<a name="line.5125"></a>
-<span class="sourceLineNo">5126</span>    scanner.close();<a name="line.5126"></a>
-<span class="sourceLineNo">5127</span>  }<a name="line.5127"></a>
-<span class="sourceLineNo">5128</span><a name="line.5128"></a>
-<span class="sourceLineNo">5129</span>  @Test<a name="line.5129"></a>
-<span class="sourceLineNo">5130</span>  public void testReverseScanner_smaller_blocksize() throws IOException {<a name="line.5130"></a>
-<span class="sourceLineNo">5131</span>    // case to ensure no conflict with HFile index optimization<a name="line.5131"></a>
-<span class="sourceLineNo">5132</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.5132"></a>
-<span class="sourceLineNo">5133</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.5133"></a>
-<span class="sourceLineNo">5134</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.5134"></a>
-<span class="sourceLineNo">5135</span>    byte[] rowD = Bytes.toBytes("rowD");<a name="line.5135"></a>
-<span class="sourceLineNo">5136</span>    byte[] rowE = Bytes.toBytes("rowE");<a name="line.5136"></a>
-<span class="sourceLineNo">5137</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.5137"></a>
-<span class="sourceLineNo">5138</span>    byte[][] families = { cf };<a name="line.5138"></a>
-<span class="sourceLineNo">5139</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.5139"></a>
-<span class="sourceLineNo">5140</span>    byte[] col2 = Bytes.toBytes("col2");<a name="line.5140"></a>
-<span class="sourceLineNo">5141</span>    long ts = 1;<a name="line.5141"></a>
-<span class="sourceLineNo">5142</span>    HBaseConfiguration config = new HBaseConfiguration();<a name="line.5142"></a>
-<span class="sourceLineNo">5143</span>    config.setInt("test.block.size", 1);<a name="line.5143"></a>
-<span class="sourceLineNo">5144</span>    this.region = initHRegion(tableName, method, config, families);<a name="line.5144"></a>
-<span class="sourceLineNo">5145</span>    KeyValue kv1 = new KeyValue(rowA, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5145"></a>
-<span class="sourceLineNo">5146</span>    KeyValue kv2 = new KeyValue(rowB, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5146"></a>
-<span class="sourceLineNo">5147</span>    KeyValue kv3 = new KeyValue(rowC, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5147"></a>
-<span class="sourceLineNo">5148</span>    KeyValue kv4_1 = new KeyValue(rowD, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5148"></a>
-<span class="sourceLineNo">5149</span>    KeyValue kv4_2 = new KeyValue(rowD, cf, col2, ts, KeyValue.Type.Put, null);<a name="line.5149"></a>
-<span class="sourceLineNo">5150</span>    KeyValue kv5 = new KeyValue(rowE, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5150"></a>
-<span class="sourceLineNo">5151</span>    Put put = null;<a name="line.5151"></a>
-<span class="sourceLineNo">5152</span>    put = new Put(rowA);<a name="line.5152"></a>
-<span class="sourceLineNo">5153</span>    put.add(kv1);<a name="line.5153"></a>
-<span class="sourceLineNo">5154</span>    region.put(put);<a name="line.5154"></a>
-<span class="sourceLineNo">5155</span>    put = new Put(rowB);<a name="line.5155"></a>
-<span class="sourceLineNo">5156</span>    put.add(kv2);<a name="line.5156"></a>
-<span class="sourceLineNo">5157</span>    region.put(put);<a name="line.5157"></a>
-<span class="sourceLineNo">5158</span>    put = new Put(rowC);<a name="line.5158"></a>
-<span class="sourceLineNo">5159</span>    put.add(kv3);<a name="line.5159"></a>
-<span class="sourceLineNo">5160</span>    region.put(put);<a name="line.5160"></a>
-<span class="sourceLineNo">5161</span>    put = new Put(rowD);<a name="line.5161"></a>
-<span class="sourceLineNo">5162</span>    put.add(kv4_1);<a name="line.5162"></a>
-<span class="sourceLineNo">5163</span>    region.put(put);<a name="line.5163"></a>
-<span class="sourceLineNo">5164</span>    put = new Put(rowD);<a name="line.5164"></a>
-<span class="sourceLineNo">5165</span>    put.add(kv4_2);<a name="line.5165"></a>
-<span class="sourceLineNo">5166</span>    region.put(put);<a name="line.5166"></a>
-<span class="sourceLineNo">5167</span>    put = new Put(rowE);<a name="line.5167"></a>
-<span class="sourceLineNo">5168</span>    put.add(kv5);<a name="line.5168"></a>
-<span class="sourceLineNo">5169</span>    region.put(put);<a name="line.5169"></a>
-<span class="sourceLineNo">5170</span>    region.flush(true);<a name="line.5170"></a>
-<span class="sourceLineNo">5171</span>    Scan scan = new Scan(rowD, rowA);<a name="line.5171"></a>
-<span class="sourceLineNo">5172</span>    scan.addColumn(families[0], col1);<a name="line.5172"></a>
-<span class="sourceLineNo">5173</span>    scan.setReversed(true);<a name="line.5173"></a>
-<span class="sourceLineNo">5174</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5174"></a>
-<span class="sourceLineNo">5175</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5175"></a>
-<span class="sourceLineNo">5176</span>    boolean hasNext = scanner.next(currRow);<a name="line.5176"></a>
-<span class="sourceLineNo">5177</span>    assertEquals(1, currRow.size());<a name="line.5177"></a>
-<span class="sourceLineNo">5178</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5178"></a>
-<span class="sourceLineNo">5179</span>        .get(0).getRowLength(), rowD, 0, rowD.length));<a name="line.5179"></a>
-<span class="sourceLineNo">5180</span>    assertTrue(hasNext);<a name="line.5180"></a>
-<span class="sourceLineNo">5181</span>    currRow.clear();<a name="line.5181"></a>
-<span class="sourceLineNo">5182</span>    hasNext = scanner.next(currRow);<a name="line.5182"></a>
-<span class="sourceLineNo">5183</span>    assertEquals(1, currRow.size());<a name="line.5183"></a>
-<span class="sourceLineNo">5184</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5184"></a>
-<span class="sourceLineNo">5185</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.5185"></a>
-<span class="sourceLineNo">5186</span>    assertTrue(hasNext);<a name="line.5186"></a>
-<span class="sourceLineNo">5187</span>    currRow.clear();<a name="line.5187"></a>
-<span class="sourceLineNo">5188</span>    hasNext = scanner.next(currRow);<a name="line.5188"></a>
-<span class="sourceLineNo">5189</span>    assertEquals(1, currRow.size());<a name="line.5189"></a>
-<span class="sourceLineNo">5190</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5190"></a>
-<span class="sourceLineNo">5191</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.5191"></a>
-<span class="sourceLineNo">5192</span>    assertFalse(hasNext);<a name="line.5192"></a>
-<span class="sourceLineNo">5193</span>    scanner.close();<a name="line.5193"></a>
-<span class="sourceLineNo">5194</span><a name="line.5194"></a>
-<span class="sourceLineNo">5195</span>    scan = new Scan(rowD, rowA);<a name="line.5195"></a>
-<span class="sourceLineNo">5196</span>    scan.addColumn(families[0], col2);<a name="line.5196"></a>
-<span class="sourceLineNo">5197</span>    scan.setReversed(true);<a name="line.5197"></a>
-<span class="sourceLineNo">5198</span>    currRow.clear();<a name="line.5198"></a>
-<span class="sourceLineNo">5199</span>    scanner = region.getScanner(scan);<a name="line.5199"></a>
-<span class="sourceLineNo">5200</span>    hasNext = scanner.next(currRow);<a name="line.5200"></a>
-<span class="sourceLineNo">5201</span>    assertEquals(1, currRow.size());<a name="line.5201"></a>
-<span class="sourceLineNo">5202</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5202"></a>
-<span class="sourceLineNo">5203</span>        .get(0).getRowLength(), rowD, 0, rowD.length));<a name="line.5203"></a>
-<span class="sourceLineNo">5204</span>    scanner.close();<a name="line.5204"></a>
-<span class="sourceLineNo">5205</span>  }<a name="line.5205"></a>
-<span class="sourceLineNo">5206</span><a name="line.5206"></a>
-<span class="sourceLineNo">5207</span>  @Test<a name="line.5207"></a>
-<span class="sourceLineNo">5208</span>  public void testReverseScanner_FromMemStoreAndHFiles_MultiCFs1()<a name="line.5208"></a>
-<span class="sourceLineNo">5209</span>      throws IOException {<a name="line.5209"></a>
-<span class="sourceLineNo">5210</span>    byte[] row0 = Bytes.toBytes("row0"); // 1 kv<a name="line.5210"></a>
-<span class="sourceLineNo">5211</span>    byte[] row1 = Bytes.toBytes("row1"); // 2 kv<a name="line.5211"></a>
-<span class="sourceLineNo">5212</span>    byte[] row2 = Bytes.toBytes("row2"); // 4 kv<a name="line.5212"></a>
-<span class="sourceLineNo">5213</span>    byte[] row3 = Bytes.toBytes("row3"); // 2 kv<a name="line.5213"></a>
-<span class="sourceLineNo">5214</span>    byte[] row4 = Bytes.toBytes("row4"); // 5 kv<a name="line.5214"></a>
-<span class="sourceLineNo">5215</span>    byte[] row5 = Bytes.toBytes("row5"); // 2 kv<a name="line.5215"></a>
-<span class="sourceLineNo">5216</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5216"></a>
-<span class="sourceLineNo">5217</span>    byte[] cf2 = Bytes.toBytes("CF2");<a name="line.5217"></a>
-<span class="sourceLineNo">5218</span>    byte[] cf3 = Bytes.toBytes("CF3");<a name="line.5218"></a>
-<span class="sourceLineNo">5219</span>    byte[][] families = { cf1, cf2, cf3 };<a name="line.5219"></a>
-<span class="sourceLineNo">5220</span>    byte[] col = Bytes.toBytes("C");<a name="line.5220"></a>
-<span class="sourceLineNo">5221</span>    long ts = 1;<a name="line.5221"></a>
-<span class="sourceLineNo">5222</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5222"></a>
-<span class="sourceLineNo">5223</span>    // disable compactions in this test.<a name="line.5223"></a>
-<span class="sourceLineNo">5224</span>    conf.setInt("hbase.hstore.compactionThreshold", 10000);<a name="line.5224"></a>
-<span class="sourceLineNo">5225</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5225"></a>
-<span class="sourceLineNo">5226</span>    // kv naming style: kv(row number) totalKvCountInThisRow seq no<a name="line.5226"></a>
-<span class="sourceLineNo">5227</span>    KeyValue kv0_1_1 = new KeyValue(row0, cf1, col, ts, KeyValue.Type.Put,<a name="line.5227"></a>
-<span class="sourceLineNo">5228</span>        null);<a name="line.5228"></a>
-<span class="sourceLineNo">5229</span>    KeyValue kv1_2_1 = new KeyValue(row1, cf2, col, ts, KeyValue.Type.Put,<a name="line.5229"></a>
-<span class="sourceLineNo">5230</span>        null);<a name="line.5230"></a>
-<span class="sourceLineNo">5231</span>    KeyValue kv1_2_2 = new KeyValue(row1, cf1, col, ts + 1,<a name="line.5231"></a>
-<span class="sourceLineNo">5232</span>        KeyValue.Type.Put, null);<a name="line.5232"></a>
-<span class="sourceLineNo">5233</span>    KeyValue kv2_4_1 = new KeyValue(row2, cf2, col, ts, KeyValue.Type.Put,<a name="line.5233"></a>
-<span class="sourceLineNo">5234</span>        null);<a name="line.5234"></a>
-<span class="sourceLineNo">5235</span>    KeyValue kv2_4_2 = new KeyValue(row2, cf1, col, ts, KeyValue.Type.Put,<a name="line.5235"></a>
-<span class="sourceLineNo">5236</span>        null);<a name="line.5236"></a>
-<span class="sourceLineNo">5237</span>    KeyValue kv2_4_3 = new KeyValue(row2, cf3, col, ts, KeyValue.Type.Put,<a name="line.5237"></a>
+<span class="sourceLineNo">4882</span>  public HRegion initHRegion(TableName tableName, byte[] startKey, byte[] stopKey,<a name="line.4882"></a>
+<span class="sourceLineNo">4883</span>      boolean isReadOnly, Durability durability, WAL wal, byte[]... families) throws IOException {<a name="line.4883"></a>
+<span class="sourceLineNo">4884</span>    return TEST_UTIL.createLocalHRegion(tableName, startKey, stopKey,<a name="line.4884"></a>
+<span class="sourceLineNo">4885</span>        isReadOnly, durability, wal, families);<a name="line.4885"></a>
+<span class="sourceLineNo">4886</span>  }<a name="line.4886"></a>
+<span class="sourceLineNo">4887</span><a name="line.4887"></a>
+<span class="sourceLineNo">4888</span>  /**<a name="line.4888"></a>
+<span class="sourceLineNo">4889</span>   * Assert that the passed in Cell has expected contents for the specified row,<a name="line.4889"></a>
+<span class="sourceLineNo">4890</span>   * column &amp; timestamp.<a name="line.4890"></a>
+<span class="sourceLineNo">4891</span>   */<a name="line.4891"></a>
+<span class="sourceLineNo">4892</span>  private void checkOneCell(Cell kv, byte[] cf, int rowIdx, int colIdx, long ts) {<a name="line.4892"></a>
+<span class="sourceLineNo">4893</span>    String ctx = "rowIdx=" + rowIdx + "; colIdx=" + colIdx + "; ts=" + ts;<a name="line.4893"></a>
+<span class="sourceLineNo">4894</span>    assertEquals("Row mismatch which checking: " + ctx, "row:" + rowIdx,<a name="line.4894"></a>
+<span class="sourceLineNo">4895</span>        Bytes.toString(CellUtil.cloneRow(kv)));<a name="line.4895"></a>
+<span class="sourceLineNo">4896</span>    assertEquals("ColumnFamily mismatch while checking: " + ctx, Bytes.toString(cf),<a name="line.4896"></a>
+<span class="sourceLineNo">4897</span>        Bytes.toString(CellUtil.cloneFamily(kv)));<a name="line.4897"></a>
+<span class="sourceLineNo">4898</span>    assertEquals("Column qualifier mismatch while checking: " + ctx, "column:" + colIdx,<a name="line.4898"></a>
+<span class="sourceLineNo">4899</span>        Bytes.toString(CellUtil.cloneQualifier(kv)));<a name="line.4899"></a>
+<span class="sourceLineNo">4900</span>    assertEquals("Timestamp mismatch while checking: " + ctx, ts, kv.getTimestamp());<a name="line.4900"></a>
+<span class="sourceLineNo">4901</span>    assertEquals("Value mismatch while checking: " + ctx, "value-version-" + ts,<a name="line.4901"></a>
+<span class="sourceLineNo">4902</span>        Bytes.toString(CellUtil.cloneValue(kv)));<a name="line.4902"></a>
+<span class="sourceLineNo">4903</span>  }<a name="line.4903"></a>
+<span class="sourceLineNo">4904</span><a name="line.4904"></a>
+<span class="sourceLineNo">4905</span>  @Test<a name="line.4905"></a>
+<span class="sourceLineNo">4906</span>  public void testReverseScanner_FromMemStore_SingleCF_Normal()<a name="line.4906"></a>
+<span class="sourceLineNo">4907</span>      throws IOException {<a name="line.4907"></a>
+<span class="sourceLineNo">4908</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.4908"></a>
+<span class="sourceLineNo">4909</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.4909"></a>
+<span class="sourceLineNo">4910</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.4910"></a>
+<span class="sourceLineNo">4911</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.4911"></a>
+<span class="sourceLineNo">4912</span>    byte[][] families = { cf };<a name="line.4912"></a>
+<span class="sourceLineNo">4913</span>    byte[] col = Bytes.toBytes("C");<a name="line.4913"></a>
+<span class="sourceLineNo">4914</span>    long ts = 1;<a name="line.4914"></a>
+<span class="sourceLineNo">4915</span>    this.region = initHRegion(tableName, method, families);<a name="line.4915"></a>
+<span class="sourceLineNo">4916</span>    KeyValue kv1 = new KeyValue(rowC, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4916"></a>
+<span class="sourceLineNo">4917</span>    KeyValue kv11 = new KeyValue(rowC, cf, col, ts + 1, KeyValue.Type.Put,<a name="line.4917"></a>
+<span class="sourceLineNo">4918</span>        null);<a name="line.4918"></a>
+<span class="sourceLineNo">4919</span>    KeyValue kv2 = new KeyValue(rowA, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4919"></a>
+<span class="sourceLineNo">4920</span>    KeyValue kv3 = new KeyValue(rowB, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4920"></a>
+<span class="sourceLineNo">4921</span>    Put put = null;<a name="line.4921"></a>
+<span class="sourceLineNo">4922</span>    put = new Put(rowC);<a name="line.4922"></a>
+<span class="sourceLineNo">4923</span>    put.add(kv1);<a name="line.4923"></a>
+<span class="sourceLineNo">4924</span>    put.add(kv11);<a name="line.4924"></a>
+<span class="sourceLineNo">4925</span>    region.put(put);<a name="line.4925"></a>
+<span class="sourceLineNo">4926</span>    put = new Put(rowA);<a name="line.4926"></a>
+<span class="sourceLineNo">4927</span>    put.add(kv2);<a name="line.4927"></a>
+<span class="sourceLineNo">4928</span>    region.put(put);<a name="line.4928"></a>
+<span class="sourceLineNo">4929</span>    put = new Put(rowB);<a name="line.4929"></a>
+<span class="sourceLineNo">4930</span>    put.add(kv3);<a name="line.4930"></a>
+<span class="sourceLineNo">4931</span>    region.put(put);<a name="line.4931"></a>
+<span class="sourceLineNo">4932</span><a name="line.4932"></a>
+<span class="sourceLineNo">4933</span>    Scan scan = new Scan(rowC);<a name="line.4933"></a>
+<span class="sourceLineNo">4934</span>    scan.setMaxVersions(5);<a name="line.4934"></a>
+<span class="sourceLineNo">4935</span>    scan.setReversed(true);<a name="line.4935"></a>
+<span class="sourceLineNo">4936</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.4936"></a>
+<span class="sourceLineNo">4937</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.4937"></a>
+<span class="sourceLineNo">4938</span>    boolean hasNext = scanner.next(currRow);<a name="line.4938"></a>
+<span class="sourceLineNo">4939</span>    assertEquals(2, currRow.size());<a name="line.4939"></a>
+<span class="sourceLineNo">4940</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4940"></a>
+<span class="sourceLineNo">4941</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.4941"></a>
+<span class="sourceLineNo">4942</span>    assertTrue(hasNext);<a name="line.4942"></a>
+<span class="sourceLineNo">4943</span>    currRow.clear();<a name="line.4943"></a>
+<span class="sourceLineNo">4944</span>    hasNext = scanner.next(currRow);<a name="line.4944"></a>
+<span class="sourceLineNo">4945</span>    assertEquals(1, currRow.size());<a name="line.4945"></a>
+<span class="sourceLineNo">4946</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4946"></a>
+<span class="sourceLineNo">4947</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.4947"></a>
+<span class="sourceLineNo">4948</span>    assertTrue(hasNext);<a name="line.4948"></a>
+<span class="sourceLineNo">4949</span>    currRow.clear();<a name="line.4949"></a>
+<span class="sourceLineNo">4950</span>    hasNext = scanner.next(currRow);<a name="line.4950"></a>
+<span class="sourceLineNo">4951</span>    assertEquals(1, currRow.size());<a name="line.4951"></a>
+<span class="sourceLineNo">4952</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4952"></a>
+<span class="sourceLineNo">4953</span>        .get(0).getRowLength(), rowA, 0, rowA.length));<a name="line.4953"></a>
+<span class="sourceLineNo">4954</span>    assertFalse(hasNext);<a name="line.4954"></a>
+<span class="sourceLineNo">4955</span>    scanner.close();<a name="line.4955"></a>
+<span class="sourceLineNo">4956</span>  }<a name="line.4956"></a>
+<span class="sourceLineNo">4957</span><a name="line.4957"></a>
+<span class="sourceLineNo">4958</span>  @Test<a name="line.4958"></a>
+<span class="sourceLineNo">4959</span>  public void testReverseScanner_FromMemStore_SingleCF_LargerKey()<a name="line.4959"></a>
+<span class="sourceLineNo">4960</span>      throws IOException {<a name="line.4960"></a>
+<span class="sourceLineNo">4961</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.4961"></a>
+<span class="sourceLineNo">4962</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.4962"></a>
+<span class="sourceLineNo">4963</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.4963"></a>
+<span class="sourceLineNo">4964</span>    byte[] rowD = Bytes.toBytes("rowD");<a name="line.4964"></a>
+<span class="sourceLineNo">4965</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.4965"></a>
+<span class="sourceLineNo">4966</span>    byte[][] families = { cf };<a name="line.4966"></a>
+<span class="sourceLineNo">4967</span>    byte[] col = Bytes.toBytes("C");<a name="line.4967"></a>
+<span class="sourceLineNo">4968</span>    long ts = 1;<a name="line.4968"></a>
+<span class="sourceLineNo">4969</span>    this.region = initHRegion(tableName, method, families);<a name="line.4969"></a>
+<span class="sourceLineNo">4970</span>    KeyValue kv1 = new KeyValue(rowC, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4970"></a>
+<span class="sourceLineNo">4971</span>    KeyValue kv11 = new KeyValue(rowC, cf, col, ts + 1, KeyValue.Type.Put,<a name="line.4971"></a>
+<span class="sourceLineNo">4972</span>        null);<a name="line.4972"></a>
+<span class="sourceLineNo">4973</span>    KeyValue kv2 = new KeyValue(rowA, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4973"></a>
+<span class="sourceLineNo">4974</span>    KeyValue kv3 = new KeyValue(rowB, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4974"></a>
+<span class="sourceLineNo">4975</span>    Put put = null;<a name="line.4975"></a>
+<span class="sourceLineNo">4976</span>    put = new Put(rowC);<a name="line.4976"></a>
+<span class="sourceLineNo">4977</span>    put.add(kv1);<a name="line.4977"></a>
+<span class="sourceLineNo">4978</span>    put.add(kv11);<a name="line.4978"></a>
+<span class="sourceLineNo">4979</span>    region.put(put);<a name="line.4979"></a>
+<span class="sourceLineNo">4980</span>    put = new Put(rowA);<a name="line.4980"></a>
+<span class="sourceLineNo">4981</span>    put.add(kv2);<a name="line.4981"></a>
+<span class="sourceLineNo">4982</span>    region.put(put);<a name="line.4982"></a>
+<span class="sourceLineNo">4983</span>    put = new Put(rowB);<a name="line.4983"></a>
+<span class="sourceLineNo">4984</span>    put.add(kv3);<a name="line.4984"></a>
+<span class="sourceLineNo">4985</span>    region.put(put);<a name="line.4985"></a>
+<span class="sourceLineNo">4986</span><a name="line.4986"></a>
+<span class="sourceLineNo">4987</span>    Scan scan = new Scan(rowD);<a name="line.4987"></a>
+<span class="sourceLineNo">4988</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.4988"></a>
+<span class="sourceLineNo">4989</span>    scan.setReversed(true);<a name="line.4989"></a>
+<span class="sourceLineNo">4990</span>    scan.setMaxVersions(5);<a name="line.4990"></a>
+<span class="sourceLineNo">4991</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.4991"></a>
+<span class="sourceLineNo">4992</span>    boolean hasNext = scanner.next(currRow);<a name="line.4992"></a>
+<span class="sourceLineNo">4993</span>    assertEquals(2, currRow.size());<a name="line.4993"></a>
+<span class="sourceLineNo">4994</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4994"></a>
+<span class="sourceLineNo">4995</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.4995"></a>
+<span class="sourceLineNo">4996</span>    assertTrue(hasNext);<a name="line.4996"></a>
+<span class="sourceLineNo">4997</span>    currRow.clear();<a name="line.4997"></a>
+<span class="sourceLineNo">4998</span>    hasNext = scanner.next(currRow);<a name="line.4998"></a>
+<span class="sourceLineNo">4999</span>    assertEquals(1, currRow.size());<a name="line.4999"></a>
+<span class="sourceLineNo">5000</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5000"></a>
+<span class="sourceLineNo">5001</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.5001"></a>
+<span class="sourceLineNo">5002</span>    assertTrue(hasNext);<a name="line.5002"></a>
+<span class="sourceLineNo">5003</span>    currRow.clear();<a name="line.5003"></a>
+<span class="sourceLineNo">5004</span>    hasNext = scanner.next(currRow);<a name="line.5004"></a>
+<span class="sourceLineNo">5005</span>    assertEquals(1, currRow.size());<a name="line.5005"></a>
+<span class="sourceLineNo">5006</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5006"></a>
+<span class="sourceLineNo">5007</span>        .get(0).getRowLength(), rowA, 0, rowA.length));<a name="line.5007"></a>
+<span class="sourceLineNo">5008</span>    assertFalse(hasNext);<a name="line.5008"></a>
+<span class="sourceLineNo">5009</span>    scanner.close();<a name="line.5009"></a>
+<span class="sourceLineNo">5010</span>  }<a name="line.5010"></a>
+<span class="sourceLineNo">5011</span><a name="line.5011"></a>
+<span class="sourceLineNo">5012</span>  @Test<a name="line.5012"></a>
+<span class="sourceLineNo">5013</span>  public void testReverseScanner_FromMemStore_SingleCF_FullScan()<a name="line.5013"></a>
+<span class="sourceLineNo">5014</span>      throws IOException {<a name="line.5014"></a>
+<span class="sourceLineNo">5015</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.5015"></a>
+<span class="sourceLineNo">5016</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.5016"></a>
+<span class="sourceLineNo">5017</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.5017"></a>
+<span class="sourceLineNo">5018</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.5018"></a>
+<span class="sourceLineNo">5019</span>    byte[][] families = { cf };<a name="line.5019"></a>
+<span class="sourceLineNo">5020</span>    byte[] col = Bytes.toBytes("C");<a name="line.5020"></a>
+<span class="sourceLineNo">5021</span>    long ts = 1;<a name="line.5021"></a>
+<span class="sourceLineNo">5022</span>    this.region = initHRegion(tableName, method, families);<a name="line.5022"></a>
+<span class="sourceLineNo">5023</span>    KeyValue kv1 = new KeyValue(rowC, cf, col, ts, KeyValue.Type.Put, null);<a name="line.5023"></a>
+<span class="sourceLineNo">5024</span>    KeyValue kv11 = new KeyValue(rowC, cf, col, ts + 1, KeyValue.Type.Put,<a name="line.5024"></a>
+<span class="sourceLineNo">5025</span>        null);<a name="line.5025"></a>
+<span class="sourceLineNo">5026</span>    KeyValue kv2 = new KeyValue(rowA, cf, col, ts, KeyValue.Type.Put, null);<a name="line.5026"></a>
+<span class="sourceLineNo">5027</span>    KeyValue kv3 = new KeyValue(rowB, cf, col, ts, KeyValue.Type.Put, null);<a name="line.5027"></a>
+<span class="sourceLineNo">5028</span>    Put put = null;<a name="line.5028"></a>
+<span class="sourceLineNo">5029</span>    put = new Put(rowC);<a name="line.5029"></a>
+<span class="sourceLineNo">5030</span>    put.add(kv1);<a name="line.5030"></a>
+<span class="sourceLineNo">5031</span>    put.add(kv11);<a name="line.5031"></a>
+<span class="sourceLineNo">5032</span>    region.put(put);<a name="line.5032"></a>
+<span class="sourceLineNo">5033</span>    put = new Put(rowA);<a name="line.5033"></a>
+<span class="sourceLineNo">5034</span>    put.add(kv2);<a name="line.5034"></a>
+<span class="sourceLineNo">5035</span>    region.put(put);<a name="line.5035"></a>
+<span class="sourceLineNo">5036</span>    put = new Put(rowB);<a name="line.5036"></a>
+<span class="sourceLineNo">5037</span>    put.add(kv3);<a name="line.5037"></a>
+<span class="sourceLineNo">5038</span>    region.put(put);<a name="line.5038"></a>
+<span class="sourceLineNo">5039</span>    Scan scan = new Scan();<a name="line.5039"></a>
+<span class="sourceLineNo">5040</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5040"></a>
+<span class="sourceLineNo">5041</span>    scan.setReversed(true);<a name="line.5041"></a>
+<span class="sourceLineNo">5042</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5042"></a>
+<span class="sourceLineNo">5043</span>    boolean hasNext = scanner.next(currRow);<a name="line.5043"></a>
+<span class="sourceLineNo">5044</span>    assertEquals(1, currRow.size());<a name="line.5044"></a>
+<span class="sourceLineNo">5045</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5045"></a>
+<span class="sourceLineNo">5046</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.5046"></a>
+<span class="sourceLineNo">5047</span>    assertTrue(hasNext);<a name="line.5047"></a>
+<span class="sourceLineNo">5048</span>    currRow.clear();<a name="line.5048"></a>
+<span class="sourceLineNo">5049</span>    hasNext = scanner.next(currRow);<a name="line.5049"></a>
+<span class="sourceLineNo">5050</span>    assertEquals(1, currRow.size());<a name="line.5050"></a>
+<span class="sourceLineNo">5051</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5051"></a>
+<span class="sourceLineNo">5052</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.5052"></a>
+<span class="sourceLineNo">5053</span>    assertTrue(hasNext);<a name="line.5053"></a>
+<span class="sourceLineNo">5054</span>    currRow.clear();<a name="line.5054"></a>
+<span class="sourceLineNo">5055</span>    hasNext = scanner.next(currRow);<a name="line.5055"></a>
+<span class="sourceLineNo">5056</span>    assertEquals(1, currRow.size());<a name="line.5056"></a>
+<span class="sourceLineNo">5057</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5057"></a>
+<span class="sourceLineNo">5058</span>        .get(0).getRowLength(), rowA, 0, rowA.length));<a name="line.5058"></a>
+<span class="sourceLineNo">5059</span>    assertFalse(hasNext);<a name="line.5059"></a>
+<span class="sourceLineNo">5060</span>    scanner.close();<a name="line.5060"></a>
+<span class="sourceLineNo">5061</span>  }<a name="line.5061"></a>
+<span class="sourceLineNo">5062</span><a name="line.5062"></a>
+<span class="sourceLineNo">5063</span>  @Test<a name="line.5063"></a>
+<span class="sourceLineNo">5064</span>  public void testReverseScanner_moreRowsMayExistAfter() throws IOException {<a name="line.5064"></a>
+<span class="sourceLineNo">5065</span>    // case for "INCLUDE_AND_SEEK_NEXT_ROW &amp; SEEK_NEXT_ROW" endless loop<a name="line.5065"></a>
+<span class="sourceLineNo">5066</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.5066"></a>
+<span class="sourceLineNo">5067</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.5067"></a>
+<span class="sourceLineNo">5068</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.5068"></a>
+<span class="sourceLineNo">5069</span>    byte[] rowD = Bytes.toBytes("rowD");<a name="line.5069"></a>
+<span class="sourceLineNo">5070</span>    byte[] rowE = Bytes.toBytes("rowE");<a name="line.5070"></a>
+<span class="sourceLineNo">5071</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.5071"></a>
+<span class="sourceLineNo">5072</span>    byte[][] families = { cf };<a name="line.5072"></a>
+<span class="sourceLineNo">5073</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.5073"></a>
+<span class="sourceLineNo">5074</span>    byte[] col2 = Bytes.toBytes("col2");<a name="line.5074"></a>
+<span class="sourceLineNo">5075</span>    long ts = 1;<a name="line.5075"></a>
+<span class="sourceLineNo">5076</span>    this.region = initHRegion(tableName, method, families);<a name="line.5076"></a>
+<span class="sourceLineNo">5077</span>    KeyValue kv1 = new KeyValue(rowA, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5077"></a>
+<span class="sourceLineNo">5078</span>    KeyValue kv2 = new KeyValue(rowB, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5078"></a>
+<span class="sourceLineNo">5079</span>    KeyValue kv3 = new KeyValue(rowC, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5079"></a>
+<span class="sourceLineNo">5080</span>    KeyValue kv4_1 = new KeyValue(rowD, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5080"></a>
+<span class="sourceLineNo">5081</span>    KeyValue kv4_2 = new KeyValue(rowD, cf, col2, ts, KeyValue.Type.Put, null);<a name="line.5081"></a>
+<span class="sourceLineNo">5082</span>    KeyValue kv5 = new KeyValue(rowE, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5082"></a>
+<span class="sourceLineNo">5083</span>    Put put = null;<a name="line.5083"></a>
+<span class="sourceLineNo">5084</span>    put = new Put(rowA);<a name="line.5084"></a>
+<span class="sourceLineNo">5085</span>    put.add(kv1);<a name="line.5085"></a>
+<span class="sourceLineNo">5086</span>    region.put(put);<a name="line.5086"></a>
+<span class="sourceLineNo">5087</span>    put = new Put(rowB);<a name="line.5087"></a>
+<span class="sourceLineNo">5088</span>    put.add(kv2);<a name="line.5088"></a>
+<span class="sourceLineNo">5089</span>    region.put(put);<a name="line.5089"></a>
+<span class="sourceLineNo">5090</span>    put = new Put(rowC);<a name="line.5090"></a>
+<span class="sourceLineNo">5091</span>    put.add(kv3);<a name="line.5091"></a>
+<span class="sourceLineNo">5092</span>    region.put(put);<a name="line.5092"></a>
+<span class="sourceLineNo">5093</span>    put = new Put(rowD);<a name="line.5093"></a>
+<span class="sourceLineNo">5094</span>    put.add(kv4_1);<a name="line.5094"></a>
+<span class="sourceLineNo">5095</span>    region.put(put);<a name="line.5095"></a>
+<span class="sourceLineNo">5096</span>    put = new Put(rowD);<a name="line.5096"></a>
+<span class="sourceLineNo">5097</span>    put.add(kv4_2);<a name="line.5097"></a>
+<span class="sourceLineNo">5098</span>    region.put(put);<a name="line.5098"></a>
+<span class="sourceLineNo">5099</span>    put = new Put(rowE);<a name="line.5099"></a>
+<span class="sourceLineNo">5100</span>    put.add(kv5);<a name="line.5100"></a>
+<span class="sourceLineNo">5101</span>    region.put(put);<a name="line.5101"></a>
+<span class="sourceLineNo">5102</span>    region.flush(true);<a name="line.5102"></a>
+<span class="sourceLineNo">5103</span>    Scan scan = new Scan(rowD, rowA);<a name="line.5103"></a>
+<span class="sourceLineNo">5104</span>    scan.addColumn(families[0], col1);<a name="line.5104"></a>
+<span class="sourceLineNo">5105</span>    scan.setReversed(true);<a name="line.5105"></a>
+<span class="sourceLineNo">5106</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5106"></a>
+<span class="sourceLineNo">5107</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5107"></a>
+<span class="sourceLineNo">5108</span>    boolean hasNext = scanner.next(currRow);<a name="line.5108"></a>
+<span class="sourceLineNo">5109</span>    assertEquals(1, currRow.size());<a name="line.5109"></a>
+<span class="sourceLineNo">5110</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5110"></a>
+<span class="sourceLineNo">5111</span>        .get(0).getRowLength(), rowD, 0, rowD.length));<a name="line.5111"></a>
+<span class="sourceLineNo">5112</span>    assertTrue(hasNext);<a name="line.5112"></a>
+<span class="sourceLineNo">5113</span>    currRow.clear();<a name="line.5113"></a>
+<span class="sourceLineNo">5114</span>    hasNext = scanner.next(currRow);<a name="line.5114"></a>
+<span class="sourceLineNo">5115</span>    assertEquals(1, currRow.size());<a name="line.5115"></a>
+<span class="sourceLineNo">5116</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5116"></a>
+<span class="sourceLineNo">5117</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.5117"></a>
+<span class="sourceLineNo">5118</span>    assertTrue(hasNext);<a name="line.5118"></a>
+<span class="sourceLineNo">5119</span>    currRow.clear();<a name="line.5119"></a>
+<span class="sourceLineNo">5120</span>    hasNext = scanner.next(currRow);<a name="line.5120"></a>
+<span class="sourceLineNo">5121</span>    assertEquals(1, currRow.size());<a name="line.5121"></a>
+<span class="sourceLineNo">5122</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5122"></a>
+<span class="sourceLineNo">5123</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.5123"></a>
+<span class="sourceLineNo">5124</span>    assertFalse(hasNext);<a name="line.5124"></a>
+<span class="sourceLineNo">5125</span>    scanner.close();<a name="line.5125"></a>
+<span class="sourceLineNo">5126</span><a name="line.5126"></a>
+<span class="sourceLineNo">5127</span>    scan = new Scan(rowD, rowA);<a name="line.5127"></a>
+<span class="sourceLineNo">5128</span>    scan.addColumn(families[0], col2);<a name="line.5128"></a>
+<span class="sourceLineNo">5129</span>    scan.setReversed(true);<a name="line.5129"></a>
+<span class="sourceLineNo">5130</span>    currRow.clear();<a name="line.5130"></a>
+<span class="sourceLineNo">5131</span>    scanner = region.getScanner(scan);<a name="line.5131"></a>
+<span class="sourceLineNo">5132</span>    hasNext = scanner.next(currRow);<a name="line.5132"></a>
+<span class="sourceLineNo">5133</span>    assertEquals(1, currRow.size());<a name="line.5133"></a>
+<span class="sourceLineNo">5134</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5134"></a>
+<span class="sourceLineNo">5135</span>        .get(0).getRowLength(), rowD, 0, rowD.length));<a name="line.5135"></a>
+<span class="sourceLineNo">5136</span>    scanner.close();<a name="line.5136"></a>
+<span class="sourceLineNo">5137</span>  }<a name="line.5137"></a>
+<span class="sourceLineNo">5138</span><a name="line.5138"></a>
+<span class="sourceLineNo">5139</span>  @Test<a name="line.5139"></a>
+<span class="sourceLineNo">5140</span>  public void testReverseScanner_smaller_blocksize() throws IOException {<a name="line.5140"></a>
+<span class="sourceLineNo">5141</span>    // case to ensure no conflict with HFile index optimization<a name="line.5141"></a>
+<span class="sourceLineNo">5142</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.5142"></a>
+<span class="sourceLineNo">5143</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.5143"></a>
+<span class="sourceLineNo">5144</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.5144"></a>
+<span class="sourceLineNo">5145</span>    byte[] rowD = Bytes.toBytes("rowD");<a name="line.5145"></a>
+<span class="sourceLineNo">5146</span>    byte[] rowE = Bytes.toBytes("rowE");<a name="line.5146"></a>
+<span class="sourceLineNo">5147</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.5147"></a>
+<span class="sourceLineNo">5148</span>    byte[][] families = { cf };<a name="line.5148"></a>
+<span class="sourceLineNo">5149</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.5149"></a>
+<span class="sourceLineNo">5150</span>    byte[] col2 = Bytes.toBytes("col2");<a name="line.5150"></a>
+<span class="sourceLineNo">5151</span>    long ts = 1;<a name="line.5151"></a>
+<span class="sourceLineNo">5152</span>    HBaseConfiguration config = new HBaseConfiguration();<a name="line.5152"></a>
+<span class="sourceLineNo">5153</span>    config.setInt("test.block.size", 1);<a name="line.5153"></a>
+<span class="sourceLineNo">5154</span>    this.region = initHRegion(tableName, method, config, families);<a name="line.5154"></a>
+<span class="sourceLineNo">5155</span>    KeyValue kv1 = new KeyValue(rowA, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5155"></a>
+<span class="sourceLineNo">5156</span>    KeyValue kv2 = new KeyValue(rowB, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5156"></a>
+<span class="sourceLineNo">5157</span>    KeyValue kv3 = new KeyValue(rowC, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5157"></a>
+<span class="sourceLineNo">5158</span>    KeyValue kv4_1 = new KeyValue(rowD, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5158"></a>
+<span class="sourceLineNo">5159</span>    KeyValue kv4_2 = new KeyValue(rowD, cf, col2, ts, KeyValue.Type.Put, null);<a name="line.5159"></a>
+<span class="sourceLineNo">5160</span>    KeyValue kv5 = new KeyValue(rowE, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5160"></a>
+<span class="sourceLineNo">5161</span>    Put put = null;<a name="line.5161"></a>
+<span class="sourceLineNo">5162</span>    put = new Put(rowA);<a name="line.5162"></a>
+<span class="sourceLineNo">5163</span>    put.add(kv1);<a name="line.5163"></a>
+<span class="sourceLineNo">5164</span>    region.put(put);<a name="line.5164"></a>
+<span class="sourceLineNo">5165</span>    put = new Put(rowB);<a name="line.5165"></a>
+<span class="sourceLineNo">5166</span>    put.add(kv2);<a name="line.5166"></a>
+<span class="sourceLineNo">5167</span>    region.put(put);<a name="line.5167"></a>
+<span class="sourceLineNo">5168</span>    put = new Put(rowC);<a name="line.5168"></a>
+<span class="sourceLineNo">5169</span>    put.add(kv3);<a name="line.5169"></a>
+<span class="sourceLineNo">5170</span>    region.put(put);<a name="line.5170"></a>
+<span class="sourceLineNo">5171</span>    put = new Put(rowD);<a name="line.5171"></a>
+<span class="sourceLineNo">5172</span>    put.add(kv4_1);<a name="line.5172"></a>
+<span class="sourceLineNo">5173</span>    region.put(put);<a name="line.5173"></a>
+<span class="sourceLineNo">5174</span>    put = new Put(rowD);<a name="line.5174"></a>
+<span class="sourceLineNo">5175</span>    put.add(kv4_2);<a name="line.5175"></a>
+<span class="sourceLineNo">5176</span>    region.put(put);<a name="line.5176"></a>
+<span class="sourceLineNo">5177</span>    put = new Put(rowE);<a name="line.5177"></a>
+<span class="sourceLineNo">5178</span>    put.add(kv5);<a name="line.5178"></a>
+<span class="sourceLineNo">5179</span>    region.put(put);<a name="line.5179"></a>
+<span class="sourceLineNo">5180</span>    region.flush(true);<a name="line.5180"></a>
+<span class="sourceLineNo">5181</span>    Scan scan = new Scan(rowD, rowA);<a name="line.5181"></a>
+<span class="sourceLineNo">5182</span>    scan.addColumn(families[0], col1);<a name="line.5182"></a>
+<span class="sourceLineNo">5183</span>    scan.setReversed(true);<a name="line.5183"></a>
+<span class="sourceLineNo">5184</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5184"></a>
+<span class="sourceLineNo">5185</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5185"></a>
+<span class="sourceLineNo">5186</span>    boolean hasNext = scanner.next(currRow);<a name="line.5186"></a>
+<span class="sourceLineNo">5187</span>    assertEquals(1, currRow.size());<a name="line.5187"></a>
+<span class="sourceLineNo">5188</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5188"></a>
+<span class="sourceLineNo">5189</span>        .get(0).getRowLength(), rowD, 0, rowD.length));<a name="line.5189"></a>
+<span class="sourceLineNo">5190</span>    assertTrue(hasNext);<a name="line.5190"></a>
+<span class="sourceLineNo">5191</span>    currRow.clear();<a name="line.5191"></a>
+<span class="sourceLineNo">5192</span>    hasNext = scanner.next(currRow);<a name="line.5192"></a>
+<span class="sourceLineNo">5193</span>    assertEquals(1, currRow.size());<a name="line.5193"></a>
+<span class="sourceLineNo">5194</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5194"></a>
+<span class="sourceLineNo">5195</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.5195"></a>
+<span class="sourceLineNo">5196</span>    assertTrue(hasNext);<a name="line.5196"></a>
+<span class="sourceLineNo">5197</span>    currRow.clear();<a name="line.5197"></a>
+<span class="sourceLineNo">5198</span>    hasNext = scanner.next(currRow);<a name="line.5198"></a>
+<span class="sourceLineNo">5199</span>    assertEquals(1, currRow.size());<a name="line.5199"></a>
+<span class="sourceLineNo">5200</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5200"></a>
+<span class="sourceLineNo">5201</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.5201"></a>
+<span class="sourceLineNo">5202</span>    assertFalse(hasNext);<a name="line.5202"></a>
+<span class="sourceLineNo">5203</span>    scanner.close();<a name="line.5203"></a>
+<span class="sourceLineNo">5204</span><a name="line.5204"></a>
+<span class="sourceLineNo">5205</span>    scan = new Scan(rowD, rowA);<a name="line.5205"></a>
+<span class="sourceLineNo">5206</span>    scan.addColumn(families[0], col2);<a name="line.5206"></a>
+<span class="sourceLineNo">5207</span>    scan.setReversed(true);<a name="line.5207"></a>
+<span class="sourceLineNo">5208</span>    currRow.clear();<a name="line.5208"></a>
+<span class="sourceLineNo">5209</span>    scanner = region.getScanner(scan);<a name="line.5209"></a>
+<span class="sourceLineNo">5210</span>    hasNext = scanner.next(currRow);<a name="line.5210"></a>
+<span class="sourceLineNo">5211</span>    assertEquals(1, currRow.size());<a name="line.5211"></a>
+<span class="sourceLineNo">5212</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5212"></a>
+<span class="sourceLineNo">5213</span>        .get(0).getRowLength(), rowD, 0, rowD.length));<a name="line.5213"></a>
+<span class="sourceLineNo">5214</span>    scanner.close();<a name="line.5214"></a>
+<span class="sourceLineNo">5215</span>  }<a name="line.5215"></a>
+<span class="sourceLineNo">5216</span><a name="line.5216"></a>
+<span class="sourceLineNo">5217</span>  @Test<a name="line.5217"></a>
+<span class="sourceLineNo">5218</span>  public void testReverseScanner_FromMemStoreAndHFiles_MultiCFs1()<a name="line.5218"></a>
+<span class="sourceLineNo">5219</span>      throws IOException {<a name="line.5219"></a>
+<span class="sourceLineNo">5220</span>    byte[] row0 = Bytes.toBytes("row0"); // 1 kv<a name="line.5220"></a>
+<span class="sourceLineNo">5221</span>    byte[] row1 = Bytes.toBytes("row1"); // 2 kv<a name="line.5221"></a>
+<span class="sourceLineNo">5222</span>    byte[] row2 = Bytes.toBytes("row2"); // 4 kv<a name="line.5222"></a>
+<span class="sourceLineNo">5223</span>    byte[] row3 = Bytes.toBytes("row3"); // 2 kv<a name="line.5223"></a>
+<span class="sourceLineNo">5224</span>    byte[] row4 = Bytes.toBytes("row4"); // 5 kv<a name="line.5224"></a>
+<span class="sourceLineNo">5225</span>    byte[] row5 = Bytes.toBytes("row5"); // 2 kv<a name="line.5225"></a>
+<span class="sourceLineNo">5226</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5226"></a>
+<span class="sourceLineNo">5227</span>    byte[] cf2 = Bytes.toBytes("CF2");<a name="line.5227"></a>
+<span class="sourceLineNo">5228</span>    byte[] cf3 = Bytes.toBytes("CF3");<a name="line.5228"></a>
+<span class="sourceLineNo">5229</span>    byte[][] families = { cf1, cf2, cf3 };<a name="line.5229"></a>
+<span class="sourceLineNo">5230</span>    byte[] col = Bytes.toBytes("C");<a name="line.5230"></a>
+<span class="sourceLineNo">5231</span>    long ts = 1;<a name="line.5231"></a>
+<span class="sourceLineNo">5232</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5232"></a>
+<span class="sourceLineNo">5233</span>    // disable compactions in this test.<a name="line.5233"></a>
+<span class="sourceLineNo">5234</span>    conf.setInt("hbase.hstore.compactionThreshold", 10000);<a name="line.5234"></a>
+<span class="sourceLineNo">5235</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5235"></a>
+<span class="sourceLineNo">5236</span>    // kv naming style: kv(row number) totalKvCountInThisRow seq no<a name="line.5236"></a>
+<span class="sourceLineNo">5237</span>    KeyValue kv0_1_1 = new KeyValue(row0, cf1, col, ts, KeyValue.Type.Put,<a name="line.5237"></a>
 <span class="sourceLineNo">5238</span>        null);<a name="line.5238"></a>
-<span class="sourceLineNo">5239</span>    KeyValue kv2_4_4 = new KeyValue(row2, cf1, col, ts + 4,<a name="line.5239"></a>
-<span class="sourceLineNo">5240</span>        KeyValue.Type.Put, null);<a name="line.5240"></a>
-<span class="sourceLineNo">5241</span>    KeyValue kv3_2_1 = new KeyValue(row3, cf2, col, ts, KeyValue.Type.Put,<a name="line.5241"></a>
-<span class="sourceLineNo">5242</span>        null);<a name="line.5242"></a>
-<span class="sourceLineNo">5243</span>    KeyValue kv3_2_2 = new KeyValue(row3, cf1, col, ts + 4,<a name="line.5243"></a>
-<span class="sourceLineNo">5244</span>        KeyValue.Type.Put, null);<a name="line.5244"></a>
-<span class="sourceLineNo">5245</span>    KeyValue kv4_5_1 = new KeyValue(row4, cf1, col, ts, KeyValue.Type.Put,<a name="line.5245"></a>
+<span class="sourceLineNo">5239</span>    KeyValue kv1_2_1 = new KeyValue(row1, cf2, col, ts, KeyValue.Type.Put,<a name="line.5239"></a>
+<span class="sourceLineNo">5240</span>        null);<a name="line.5240"></a>
+<span class="sourceLineNo">5241</span>    KeyValue kv1_2_2 = new KeyValue(row1, cf1, col, ts + 1,<a name="line.5241"></a>
+<span class="sourceLineNo">5242</span>        KeyValue.Type.Put, null);<a name="line.5242"></a>
+<span class="sourceLineNo">5243</span>    KeyValue kv2_4_1 = new KeyValue(row2, cf2, col, ts, KeyValue.Type.Put,<a name="line.5243"></a>
+<span class="sourceLineNo">5244</span>        null);<a name="line.5244"></a>
+<span class="sourceLineNo">5245</span>    KeyValue kv2_4_2 = new KeyValue(row2, cf1, col, ts, KeyValue.Type.Put,<a name="line.5245"></a>
 <span class="sourceLineNo">5246</span>        null);<a name="line.5246"></a>
-<span class="sourceLineNo">5247</span>    KeyValue kv4_5_2 = new KeyValue(row4, cf3, col, ts, KeyValue.Type.Put,<a name="line.5247"></a>
+<span class="sourceLineNo">5247</span>    KeyValue kv2_4_3 = new KeyValue(row2, cf3, col, ts, KeyValue.Type.Put,<a name="line.5247"></a>
 <span class="sourceLineNo">5248</span>        null);<a name="line.5248"></a>
-<span class="sourceLineNo">5249</span>    KeyValue kv4_5_3 = new KeyValue(row4, cf3, col, ts + 5,<a name="line.5249"></a>
+<span class="sourceLineNo">5249</span>    KeyValue kv2_4_4 = new KeyValue(row2, cf1, col, ts + 4,<a name="line.5249"></a>
 <span class="sourceLineNo">5250</span>        KeyValue.Type.Put, null);<a name="line.5250"></a>
-<span class="sourceLineNo">5251</span>    KeyValue kv4_5_4 = new KeyValue(row4, cf2, col, ts, KeyValue.Type.Put,<a name="line.5251"></a>
+<span class="sourceLineNo">5251</span>    KeyValue kv3_2_1 = new KeyValue(row3, cf2, col, ts, KeyValue.Type.Put,<a name="line.5251"></a>
 <span class="sourceLineNo">5252</span>        null);<a name="line.5252"></a>
-<span class="sourceLineNo">5253</span>    KeyValue kv4_5_5 = new KeyValue(row4, cf1, col, ts + 3,<a name="line.5253"></a>
+<span class="sourceLineNo">5253</span>    KeyValue kv3_2_2 = new KeyValue(row3, cf1, col, ts + 4,<a name="line.5253"></a>
 <span class="sourceLineNo">5254</span>        KeyValue.Type.Put, null);<a name="line.5254"></a>
-<span class="sourceLineNo">5255</span>    KeyValue kv5_2_1 = new KeyValue(row5, cf2, col, ts, KeyValue.Type.Put,<a name="line.5255"></a>
+<span class="sourceLineNo">5255</span>    KeyValue kv4_5_1 = new KeyValue(row4, cf1, col, ts, KeyValue.Type.Put,<a name="line.5255"></a>
 <span class="sourceLineNo">5256</span>        null);<a name="line.5256"></a>
-<span class="sourceLineNo">5257</span>    KeyValue kv5_2_2 = new KeyValue(row5, cf3, col, ts, KeyValue.Type.Put,<a name="line.5257"></a>
+<span class="sourceLineNo">5257</span>    KeyValue kv4_5_2 = new KeyValue(row4, cf3, col, ts, KeyValue.Type.Put,<a name="line.5257"></a>
 <span class="sourceLineNo">5258</span>        null);<a name="line.5258"></a>
-<span class="sourceLineNo">5259</span>    // hfiles(cf1/cf2) :"row1"(1 kv) / "row2"(1 kv) / "row4"(2 kv)<a name="line.5259"></a>
-<span class="sourceLineNo">5260</span>    Put put = null;<a name="line.5260"></a>
-<span class="sourceLineNo">5261</span>    put = new Put(row1);<a name="line.5261"></a>
-<span class="sourceLineNo">5262</span>    put.add(kv1_2_1);<a name="line.5262"></a>
-<span class="sourceLineNo">5263</span>    region.put(put);<a name="line.5263"></a>
-<span class="sourceLineNo">5264</span>    put = new Put(row2);<a name="line.5264"></a>
-<span class="sourceLineNo">5265</span>    put.add(kv2_4_1);<a name="line.5265"></a>
-<span class="sourceLineNo">5266</span>    region.put(put);<a name="line.5266"></a>
-<span class="sourceLineNo">5267</span>    put = new Put(row4);<a name="line.5267"></a>
-<span class="sourceLineNo">5268</span>    put.add(kv4_5_4);<a name="line.5268"></a>
-<span class="sourceLineNo">5269</span>    put.add(kv4_5_5);<a name="line.5269"></a>
-<span class="sourceLineNo">5270</span>    region.put(put);<a name="line.5270"></a>
-<span class="sourceLineNo">5271</span>    region.flush(true);<a name="line.5271"></a>
-<span class="sourceLineNo">5272</span>    // hfiles(cf1/cf3) : "row1" (1 kvs) / "row2" (1 kv) / "row4" (2 kv)<a name="line.5272"></a>
-<span class="sourceLineNo">5273</span>    put = new Put(row4);<a name="line.5273"></a>
-<span class="sourceLineNo">5274</span>    put.add(kv4_5_1);<a name="line.5274"></a>
-<span class="sourceLineNo">5275</span>    put.add(kv4_5_3);<a name="line.5275"></a>
+<span class="sourceLineNo">5259</span>    KeyValue kv4_5_3 = new KeyValue(row4, cf3, col, ts + 5,<a name="line.5259"></a>
+<span class="sourceLineNo">5260</span>        KeyValue.Type.Put, null);<a name="line.5260"></a>
+<span class="sourceLineNo">5261</span>    KeyValue kv4_5_4 = new KeyValue(row4, cf2, col, ts, KeyValue.Type.Put,<a name="line.5261"></a>
+<span class="sourceLineNo">5262</span>        null);<a name="line.5262"></a>
+<span class="sourceLineNo">5263</span>    KeyValue kv4_5_5 = new KeyValue(row4, cf1, col, ts + 3,<a name="line.5263"></a>
+<span class="sourceLineNo">5264</span>        KeyValue.Type.Put, null);<a name="line.5264"></a>
+<span class="sourceLineNo">5265</span>    KeyValue kv5_2_1 = new KeyValue(row5, cf2, col, ts, KeyValue.Type.Put,<a name="line.5265"></a>
+<span class="sourceLineNo">5266</span>        null);<a name="line.5266"></a>
+<span class="sourceLineNo">5267</span>    KeyValue kv5_2_2 = new KeyValue(row5, cf3, col, ts, KeyValue.Type.Put,<a name="line.5267"></a>
+<span class="sourceLineNo">5268</span>        null);<a name="line.5268"></a>
+<span class="sourceLineNo">5269</span>    // hfiles(cf1/cf2) :"row1"(1 kv) / "row2"(1 kv) / "row4"(2 kv)<a name="line.5269"></a>
+<span class="sourceLineNo">5270</span>    Put put = null;<a name="line.5270"></a>
+<span class="sourceLineNo">5271</span>    put = new Put(row1);<a name="line.5271"></a>
+<span class="sourceLineNo">5272</span>    put.add(kv1_2_1);<a name="line.5272"></a>
+<span class="sourceLineNo">5273</span>    region.put(put);<a name="line.5273"></a>
+<span class="sourceLineNo">5274</span>    put = new Put(row2);<a name="line.5274"></a>
+<span class="sourceLineNo">5275</span>    put.add(kv2_4_1);<a name="line.5275"></a>
 <span class="sourceLineNo">5276</span>    region.put(put);<a name="line.5276"></a>
-<span class="sourceLineNo">5277</span>    put = new Put(row1);<a name="line.5277"></a>
-<span class="sourceLineNo">5278</span>    put.add(kv1_2_2);<a name="line.5278"></a>
-<span class="sourceLineNo">5279</span>    region.put(put);<a name="line.5279"></a>
-<span class="sourceLineNo">5280</span>    put = new Put(row2);<a name="line.5280"></a>
-<span class="sourceLineNo">5281</span>    put.add(kv2_4_4);<a name="line.5281"></a>
-<span class="sourceLineNo">5282</span>    region.put(put);<a name="line.5282"></a>
-<span class="sourceLineNo">5283</span>    region.flush(true);<a name="line.5283"></a>
-<span class="sourceLineNo">5284</span>    // hfiles(cf1/cf3) : "row2"(2 kv) / "row3"(1 kvs) / "row4" (1 kv)<a name="line.5284"></a>
-<span class="sourceLineNo">5285</span>    put = new Put(row4);<a name="line.5285"></a>
-<span class="sourceLineNo">5286</span>    put.add(kv4_5_2);<a name="line.5286"></a>
-<span class="sourceLineNo">5287</span>    region.put(put);<a name="line.5287"></a>
-<span class="sourceLineNo">5288</span>    put = new Put(row2);<a name="line.5288"></a>
-<span class="sourceLineNo">5289</span>    put.add(kv2_4_2);<a name="line.5289"></a>
-<span class="sourceLineNo">5290</span>    put.add(kv2_4_3);<a name="line.5290"></a>
-<span class="sourceLineNo">5291</span>    region.put(put);<a name="line.5291"></a>
-<span class="sourceLineNo">5292</span>    put = new Put(row3);<a name="line.5292"></a>
-<span class="sourceLineNo">5293</span>    put.add(kv3_2_2);<a name="line.5293"></a>
-<span class="sourceLineNo">5294</span>    region.put(put);<a name="line.5294"></a>
-<span class="sourceLineNo">5295</span>    region.flush(true);<a name="line.5295"></a>
-<span class="sourceLineNo">5296</span>    // memstore(cf1/cf2/cf3) : "row0" (1 kvs) / "row3" ( 1 kv) / "row5" (max)<a name="line.5296"></a>
-<span class="sourceLineNo">5297</span>    // ( 2 kv)<a name="line.5297"></a>
-<span class="sourceLineNo">5298</span>    put = new Put(row0);<a name="line.5298"></a>
-<span class="sourceLineNo">5299</span>    put.add(kv0_1_1);<a name="line.5299"></a>
-<span class="sourceLineNo">5300</span>    region.put(put);<a name="line.5300"></a>
-<span class="sourceLineNo">5301</span>    put = new Put(row3);<a name="line.5301"></a>
-<span class="sourceLineNo">5302</span>    put.add(kv3_2_1);<a name="line.5302"></a>
-<span class="sourceLineNo">5303</span>    region.put(put);<a name="line.5303"></a>
-<span class="sourceLineNo">5304</span>    put = new Put(row5);<a name="line.5304"></a>
-<span class="sourceLineNo">5305</span>    put.add(kv5_2_1);<a name="line.5305"></a>
-<span class="sourceLineNo">5306</span>    put.add(kv5_2_2);<a name="line.5306"></a>
-<span class="sourceLineNo">5307</span>    region.put(put);<a name="line.5307"></a>
-<span class="sourceLineNo">5308</span>    // scan range = ["row4", min), skip the max "row5"<a name="line.5308"></a>
-<span class="sourceLineNo">5309</span>    Scan scan = new Scan(row4);<a name="line.5309"></a>
-<span class="sourceLineNo">5310</span>    scan.setMaxVersions(5);<a name="line.5310"></a>
-<span class="sourceLineNo">5311</span>    scan.setBatch(3);<a name="line.5311"></a>
-<span class="sourceLineNo">5312</span>    scan.setReversed(true);<a name="line.5312"></a>
-<span class="sourceLineNo">5313</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5313"></a>
-<span class="sourceLineNo">5314</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5314"></a>
-<span class="sourceLineNo">5315</span>    boolean hasNext = false;<a name="line.5315"></a>
-<span class="sourceLineNo">5316</span>    // 1. scan out "row4" (5 kvs), "row5" can't be scanned out since not<a name="line.5316"></a>
-<span class="sourceLineNo">5317</span>    // included in scan range<a name="line.5317"></a>
-<span class="sourceLineNo">5318</span>    // "row4" takes 2 next() calls since batch=3<a name="line.5318"></a>
-<span class="sourceLineNo">5319</span>    hasNext = scanner.next(currRow);<a name="line.5319"></a>
-<span class="sourceLineNo">5320</span>    assertEquals(3, currRow.size());<a name="line.5320"></a>
-<span class="sourceLineNo">5321</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5321"></a>
-<span class="sourceLineNo">5322</span>        .get(0).getRowLength(), row4, 0, row4.length));<a name="line.5322"></a>
-<span class="sourceLineNo">5323</span>    assertTrue(hasNext);<a name="line.5323"></a>
-<span class="sourceLineNo">5324</span>    currRow.clear();<a name="line.5324"></a>
-<span class="sourceLineNo">5325</span>    hasNext = scanner.next(currRow);<a name="line.5325"></a>
-<span class="sourceLineNo">5326</span>    assertEquals(2, currRow.size());<a name="line.5326"></a>
-<span class="sourceLineNo">5327</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(),<a name="line.5327"></a>
-<span class="sourceLineNo">5328</span>        currRow.get(0).getRowLength(), row4, 0,<a name="line.5328"></a>
-<span class="sourceLineNo">5329</span>      row4.length));<a name="line.5329"></a>
-<span class="sourceLineNo">5330</span>    assertTrue(hasNext);<a name="line.5330"></a>
-<span class="sourceLineNo">5331</span>    // 2. scan out "row3" (2 kv)<a name="line.5331"></a>
-<span class="sourceLineNo">5332</span>    currRow.clear();<a name="line.5332"></a>
-<span class="sourceLineNo">5333</span>    hasNext = scanner.next(currRow);<a name="line.5333"></a>
-<span class="sourceLineNo">5334</span>    assertEquals(2, currRow.size());<a name="line.5334"></a>
-<span class="sourceLineNo">5335</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5335"></a>
-<span class="sourceLineNo">5336</span>        .get(0).getRowLength(), row3, 0, row3.length));<a name="line.5336"></a>
-<span class="sourceLineNo">5337</span>    assertTrue(hasNext);<a name="line.5337"></a>
-<span class="sourceLineNo">5338</span>    // 3. scan out "row2" (4 kvs)<a name="line.5338"></a>
-<span class="sourceLineNo">5339</span>    // "row2" takes 2 next() calls since batch=3<a name="line.5339"></a>
-<span class="sourceLineNo">5340</span>    currRow.clear();<a name="line.5340"></a>
-<span class="sourceLineNo">5341</span>    hasNext = scanner.next(currRow);<a name="line.5341"></a>
-<span class="sourceLineNo">5342</span>    assertEquals(3, currRow.size());<a name="line.5342"></a>
-<span class="sourceLineNo">5343</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5343"></a>
-<span class="sourceLineNo">5344</span>        .get(0).getRowLength(), row2, 0, row2.length));<a name="line.5344"></a>
-<span class="sourceLineNo">5345</span>    assertTrue(hasNext);<a name="line.5345"></a>
-<span class="sourceLineNo">5346</span>    currRow.clear();<a name="line.5346"></a>
-<span class="sourceLineNo">5347</span>    hasNext = scanner.next(currRow);<a name="line.5347"></a>
-<span class="sourceLineNo">5348</span>    assertEquals(1, currRow.size());<a name="line.5348"></a>
-<span class="sourceLineNo">5349</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5349"></a>
-<span class="sourceLineNo">5350</span>        .get(0).getRowLength(), row2, 0, row2.length));<a name="line.5350"></a>
-<span class="sourceLineNo">5351</span>    assertTrue(hasNext);<a name="line.5351"></a>
-<span class="sourceLineNo">5352</span>    // 4. scan out "row1" (2 kv)<a name="line.5352"></a>
-<span class="sourceLineNo">5353</span>    currRow.clear();<a name="line.5353"></a>
-<span class="sourceLineNo">5354</span>    hasNext = scanner.next(currRow);<a name="line.5354"></a>
-<span class="sourceLineNo">5355</span>    assertEquals(2, currRow.size());<a name="line.5355"></a>
-<span class="sourceLineNo">5356</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5356"></a>
-<span class="sourceLineNo">5357</span>        .get(0).getRowLength(), row1, 0, row1.length));<a name="line.5357"></a>
-<span class="sourceLineNo">5358</span>    assertTrue(hasNext);<a name="line.5358"></a>
-<span class="sourceLineNo">5359</span>    // 5. scan out "row0" (1 kv)<a name="line.5359"></a>
-<span class="sourceLineNo">5360</span>    currRow.clear();<a name="line.5360"></a>
-<span class="sourceLineNo">5361</span>    hasNext = scanner.next(currRow);<a name="line.5361"></a>
-<span class="sourceLineNo">5362</span>    assertEquals(1, currRow.size());<a name="line.5362"></a>
-<span class="sourceLineNo">5363</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5363"></a>
-<span class="sourceLineNo">5364</span>        .get(0).getRowLength(), row0, 0, row0.length));<a name="line.5364"></a>
-<span class="sourceLineNo">5365</span>    assertFalse(hasNext);<a name="line.5365"></a>
-<span class="sourceLineNo">5366</span><a name="line.5366"></a>
-<span class="sourceLineNo">5367</span>    scanner.close();<a name="line.5367"></a>
-<span class="sourceLineNo">5368</span>  }<a name="line.5368"></a>
-<span class="sourceLineNo">5369</span><a name="line.5369"></a>
-<span class="sourceLineNo">5370</span>  @Test<a name="line.5370"></a>
-<span class="sourceLineNo">5371</span>  public void testReverseScanner_FromMemStoreAndHFiles_MultiCFs2()<a name="line.5371"></a>
-<span class="sourceLineNo">5372</span>      throws IOException {<a name="line.5372"></a>
-<span class="sourceLineNo">5373</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.5373"></a>
-<span class="sourceLineNo">5374</span>    byte[] row2 = Bytes.toBytes("row2");<a name="line.5374"></a>
-<span class="sourceLineNo">5375</span>    byte[] row3 = Bytes.toBytes("row3");<a name="line.5375"></a>
-<span class="sourceLineNo">5376</span>    byte[] row4 = Bytes.toBytes("row4");<a name="line.5376"></a>
-<span class="sourceLineNo">5377</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5377"></a>
-<span class="sourceLineNo">5378</span>    byte[] cf2 = Bytes.toBytes("CF2");<a name="line.5378"></a>
-<span class="sourceLineNo">5379</span>    byte[] cf3 = Bytes.toBytes("CF3");<a name="line.5379"></a>
-<span class="sourceLineNo">5380</span>    byte[] cf4 = Bytes.toBytes("CF4");<a name="line.5380"></a>
-<span class="sourceLineNo">5381</span>    byte[][] families = { cf1, cf2, cf3, cf4 };<a name="line.5381"></a>
-<span class="sourceLineNo">5382</span>    byte[] col = Bytes.toBytes("C");<a name="line.5382"></a>
-<span class="sourceLineNo">5383</span>    long ts = 1;<a name="line.5383"></a>
-<span class="sourceLineNo">5384</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5384"></a>
-<span class="sourceLineNo">5385</span>    // disable compactions in this test.<a name="line.5385"></a>
-<span class="sourceLineNo">5386</span>    conf.setInt("hbase.hstore.compactionThreshold", 10000);<a name="line.5386"></a>
-<span class="sourceLineNo">5387</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5387"></a>
-<span class="sourceLineNo">5388</span>    KeyValue kv1 = new KeyValue(row1, cf1, col, ts, KeyValue.Type.Put, null);<a name="line.5388"></a>
-<span class="sourceLineNo">5389</span>    KeyValue kv2 = new KeyValue(row2, cf2, col, ts, KeyValue.Type.Put, null);<a name="line.5389"></a>
-<span class="sourceLineNo">5390</span>    KeyValue kv3 = new KeyValue(row3, cf3, col, ts, KeyValue.Type.Put, null);<a name="line.5390"></a>
-<span class="sourceLineNo">5391</span>    KeyValue kv4 = new KeyValue(row4, cf4, col, ts, KeyValue.Type.Put, null);<a name="line.5391"></a>
-<span class="sourceLineNo">5392</span>    // storefile1<a name="line.5392"></a>
-<span class="sourceLineNo">5393</span>    Put put = new Put(row1);<a name="line.5393"></a>
-<span class="sourceLineNo">5394</span>    put.add(kv1);<a name="line.5394"></a>
-<span class="sourceLineNo">5395</span>    region.put(put);<a name="line.5395"></a>
-<span class="sourceLineNo">5396</span>    region.flush(true);<a name="line.5396"></a>
-<span class="sourceLineNo">5397</span>    // storefile2<a name="line.5397"></a>
-<span class="sourceLineNo">5398</span>    put = new Put(row2);<a name="line.5398"></a>
-<span class="sourceLineNo">5399</span>    put.add(kv2);<a name="line.5399"></a>
-<span class="sourceLineNo">5400</span>    region.put(put);<a name="line.5400"></a>
-<span class="sourceLineNo">5401</span>    region.flush(true);<a name="line.5401"></a>
-<span class="sourceLineNo">5402</span>    // storefile3<a name="line.5402"></a>
-<span class="sourceLineNo">5403</span>    put = new Put(row3);<a name="line.5403"></a>
-<span class="sourceLineNo">5404</span>    put.add(kv3);<a name="line.5404"></a>
+<span class="sourceLineNo">5277</span>    put = new Put(row4);<a name="line.5277"></a>
+<span class="sourceLineNo">5278</span>    put.add(kv4_5_4);<a name="line.5278"></a>
+<span class="sourceLineNo">5279</span>    put.add(kv4_5_5);<a name="line.5279"></a>
+<span class="sourceLineNo">5280</span>    region.put(put);<a name="line.5280"></a>
+<span class="sourceLineNo">5281</span>    region.flush(true);<a name="line.5281"></a>
+<span class="sourceLineNo">5282</span>    // hfiles(cf1/cf3) : "row1" (1 kvs) / "row2" (1 kv) / "row4" (2 kv)<a name="line.5282"></a>
+<span class="sourceLineNo">5283</span>    put = new Put(row4);<a name="line.5283"></a>
+<span class="sourceLineNo">5284</span>    put.add(kv4_5_1);<a name="line.5284"></a>
+<span class="sourceLineNo">5285</span>    put.add(kv4_5_3);<a name="line.5285"></a>
+<span class="sourceLineNo">5286</span>    region.put(put);<a name="line.5286"></a>
+<span class="sourceLineNo">5287</span>    put = new Put(row1);<a name="line.5287"></a>
+<span class="sourceLineNo">5288</span>    put.add(kv1_2_2);<a name="line.5288"></a>
+<span class="sourceLineNo">5289</span>    region.put(put);<a name="line.5289"></a>
+<span class="sourceLineNo">5290</span>    put = new Put(row2);<a name="line.5290"></a>
+<span class="sourceLineNo">5291</span>    put.add(kv2_4_4);<a name="line.5291"></a>
+<span class="sourceLineNo">5292</span>    region.put(put);<a name="line.5292"></a>
+<span class="sourceLineNo">5293</span>    region.flush(true);<a name="line.5293"></a>
+<span class="sourceLineNo">5294</span>    // hfiles(cf1/cf3) : "row2"(2 kv) / "row3"(1 kvs) / "row4" (1 kv)<a name="line.5294"></a>
+<span class="sourceLineNo">5295</span>    put = new Put(row4);<a name="line.5295"></a>
+<span class="sourceLineNo">5296</span>    put.add(kv4_5_2);<a name="line.5296"></a>
+<span class="sourceLineNo">5297</span>    region.put(put);<a name="line.5297"></a>
+<span class="sourceLineNo">5298</span>    put = new Put(row2);<a name="line.5298"></a>
+<span class="sourceLineNo">5299</span>    put.add(kv2_4_2);<a name="line.5299"></a>
+<span class="sourceLineNo">5300</span>    put.add(kv2_4_3);<a name="line.5300"></a>
+<span class="sourceLineNo">5301</span>    region.put(put);<a name="line.5301"></a>
+<span class="sourceLineNo">5302</span>    put = new Put(row3);<a name="line.5302"></a>
+<span class="sourceLineNo">5303</span>    put.add(kv3_2_2);<a name="line.5303"></a>
+<span class="sourceLineNo">5304</span>    region.put(put);<a name="line.5304"></a>
+<span class="sourceLineNo">5305</span>    region.flush(true);<a name="line.5305"></a>
+<span class="sourceLineNo">5306</span>    // memstore(cf1/cf2/cf3) : "row0" (1 kvs) / "row3" ( 1 kv) / "row5" (max)<a name="line.5306"></a>
+<span class="sourceLineNo">5307</span>    // ( 2 kv)<a name="line.5307"></a>
+<span class="sourceLineNo">5308</span>    put = new Put(row0);<a name="line.5308"></a>
+<span class="sourceLineNo">5309</span>    put.add(kv0_1_1);<a name="line.5309"></a>
+<span class="sourceLineNo">5310</span>    region.put(put);<a name="line.5310"></a>
+<span class="sourceLineNo">5311</span>    put = new Put(row3);<a name="line.5311"></a>
+<span class="sourceLineNo">5312</span>    put.add(kv3_2_1);<a name="line.5312"></a>
+<span class="sourceLineNo">5313</span>    region.put(put);<a name="line.5313"></a>
+<span class="sourceLineNo">5314</span>    put = new Put(row5);<a name="line.5314"></a>
+<span class="sourceLineNo">5315</span>    put.add(kv5_2_1);<a name="line.5315"></a>
+<span class="sourceLineNo">5316</span>    put.add(kv5_2_2);<a name="line.5316"></a>
+<span class="sourceLineNo">5317</span>    region.put(put);<a name="line.5317"></a>
+<span class="sourceLineNo">5318</span>    // scan range = ["row4", min), skip the max "row5"<a name="line.5318"></a>
+<span class="sourceLineNo">5319</span>    Scan scan = new Scan(row4);<a name="line.5319"></a>
+<span class="sourceLineNo">5320</span>    scan.setMaxVersions(5);<a name="line.5320"></a>
+<span class="sourceLineNo">5321</span>    scan.setBatch(3);<a name="line.5321"></a>
+<span class="sourceLineNo">5322</span>    scan.setReversed(true);<a name="line.5322"></a>
+<span class="sourceLineNo">5323</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5323"></a>
+<span class="sourceLineNo">5324</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5324"></a>
+<span class="sourceLineNo">5325</span>    boolean hasNext = false;<a name="line.5325"></a>
+<span class="sourceLineNo">5326</span>    // 1. scan out "row4" (5 kvs), "row5" can't be scanned out since not<a name="line.5326"></a>
+<span class="sourceLineNo">5327</span>    // included in scan range<a name="line.5327"></a>
+<span class="sourceLineNo">5328</span>    // "row4" takes 2 next() calls since batch=3<a name="line.5328"></a>
+<span class="sourceLineNo">5329</span>    hasNext = scanner.next(currRow);<a name="line.5329"></a>
+<span class="sourceLineNo">5330</span>    assertEquals(3, currRow.size());<a name="line.5330"></a>
+<span class="sourceLineNo">5331</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5331"></a>
+<span class="sourceLineNo">5332</span>        .get(0).getRowLength(), row4, 0, row4.length));<a name="line.5332"></a>
+<span class="sourceLineNo">5333</span>    assertTrue(hasNext);<a name="line.5333"></a>
+<span class="sourceLineNo">5334</span>    currRow.clear();<a name="line.5334"></a>
+<span class="sourceLineNo">5335</span>    hasNext = scanner.next(currRow);<a name="line.5335"></a>
+<span class="sourceLineNo">5336</span>    assertEquals(2, currRow.size());<a name="line.5336"></a>
+<span class="sourceLineNo">5337</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(),<a name="line.5337"></a>
+<span class="sourceLineNo">5338</span>        currRow.get(0).getRowLength(), row4, 0,<a name="line.5338"></a>
+<span class="sourceLineNo">5339</span>      row4.length));<a name="line.5339"></a>
+<span class="sourceLineNo">5340</span>    assertTrue(hasNext);<a name="line.5340"></a>
+<span class="sourceLineNo">5341</span>    // 2. scan out "row3" (2 kv)<a name="line.5341"></a>
+<span class="sourceLineNo">5342</span>    currRow.clear();<a name="line.5342"></a>
+<span class="sourceLineNo">5343</span>    hasNext = scanner.next(currRow);<a name="line.5343"></a>
+<span class="sourceLineNo">5344</span>    assertEquals(2, currRow.size());<a name="line.5344"></a>
+<span class="sourceLineNo">5345</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5345"></a>
+<span class="sourceLineNo">5346</span>        .get(0).getRowLength(), row3, 0, row3.length));<a name="line.5346"></a>
+<span class="sourceLineNo">5347</span>    assertTrue(hasNext);<a name="line.5347"></a>
+<span class="sourceLineNo">5348</span>    // 3. scan out "row2" (4 kvs)<a name="line.5348"></a>
+<span class="sourceLineNo">5349</span>    // "row2" takes 2 next() calls since batch=3<a name="line.5349"></a>
+<span class="sourceLineNo">5350</span>    currRow.clear();<a name="line.5350"></a>
+<span class="sourceLineNo">5351</span>    hasNext = scanner.next(currRow);<a name="line.5351"></a>
+<span class="sourceLineNo">5352</span>    assertEquals(3, currRow.size());<a name="line.5352"></a>
+<span class="sourceLineNo">5353</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5353"></a>
+<span class="sourceLineNo">5354</span>        .get(0).getRowLength(), row2, 0, row2.length));<a name="line.5354"></a>
+<span class="sourceLineNo">5355</span>    assertTrue(hasNext);<a name="line.5355"></a>
+<span class="sourceLineNo">5356</span>    currRow.clear();<a name="line.5356"></a>
+<span class="sourceLineNo">5357</span>    hasNext = scanner.next(currRow);<a name="line.5357"></a>
+<span class="sourceLineNo">5358</span>    assertEquals(1, currRow.size());<a name="line.5358"></a>
+<span class="sourceLineNo">5359</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5359"></a>
+<span class="sourceLineNo">5360</span>        .get(0).getRowLength(), row2, 0, row2.length));<a name="line.5360"></a>
+<span class="sourceLineNo">5361</span>    assertTrue(hasNext);<a name="line.5361"></a>
+<span class="sourceLineNo">5362</span>    // 4. scan out "row1" (2 kv)<a name="line.5362"></a>
+<span class="sourceLineNo">5363</span>    currRow.clear();<a name="line.5363"></a>
+<span class="sourceLineNo">5364</span>    hasNext = scanner.next(currRow);<a name="line.5364"></a>
+<span class="sourceLineNo">5365</span>    assertEquals(2, currRow.size());<a name="line.5365"></a>
+<span class="sourceLineNo">5366</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5366"></a>
+<span class="sourceLineNo">5367</span>        .get(0).getRowLength(), row1, 0, row1.length));<a name="line.5367"></a>
+<span class="sourceLineNo">5368</span>    assertTrue(hasNext);<a name="line.5368"></a>
+<span class="sourceLineNo">5369</span>    // 5. scan out "row0" (1 kv)<a name="line.5369"></a>
+<span class="sourceLineNo">5370</span>    currRow.clear();<a name="line.5370"></a>
+<span class="sourceLineNo">5371</span>    hasNext = scanner.next(currRow);<a name="line.5371"></a>
+<span class="sourceLineNo">5372</span>    assertEquals(1, currRow.size());<a name="line.5372"></a>
+<span class="sourceLineNo">5373</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5373"></a>
+<span class="sourceLineNo">5374</span>        .get(0).getRowLength(), row0, 0, row0.length));<a name="line.5374"></a>
+<span class="sourceLineNo">5375</span>    assertFalse(hasNext);<a name="line.5375"></a>
+<span class="sourceLineNo">5376</span><a name="line.5376"></a>
+<span class="sourceLineNo">5377</span>    scanner.close();<a name="line.5377"></a>
+<span class="sourceLineNo">5378</span>  }<a name="line.5378"></a>
+<span class="sourceLineNo">5379</span><a name="line.5379"></a>
+<span class="sourceLineNo">5380</span>  @Test<a name="line.5380"></a>
+<span class="sourceLineNo">5381</span>  public void testReverseScanner_FromMemStoreAndHFiles_MultiCFs2()<a name="line.5381"></a>
+<span class="sourceLineNo">5382</span>      throws IOException {<a name="line.5382"></a>
+<span class="sourceLineNo">5383</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.5383"></a>
+<span class="sourceLineNo">5384</span>    byte[] row2 = Bytes.toBytes("row2");<a name="line.5384"></a>
+<span class="sourceLineNo">5385</span>    byte[] row3 = Bytes.toBytes("row3");<a name="line.5385"></a>
+<span class="sourceLineNo">5386</span>    byte[] row4 = Bytes.toBytes("row4");<a name="line.5386"></a>
+<span class="sourceLineNo">5387</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5387"></a>
+<span class="sourceLineNo">5388</span>    byte[] cf2 = Bytes.toBytes("CF2");<a name="line.5388"></a>
+<span class="sourceLineNo">5389</span>    byte[] cf3 = Bytes.toBytes("CF3");<a name="line.5389"></a>
+<span class="sourceLineNo">5390</span>    byte[] cf4 = Bytes.toBytes("CF4");<a name="line.5390"></a>
+<span class="sourceLineNo">5391</span>    byte[][] families = { cf1, cf2, cf3, cf4 };<a name="line.5391"></a>
+<span class="sourceLineNo">5392</span>    byte[] col = Bytes.toBytes("C");<a name="line.5392"></a>
+<span class="sourceLineNo">5393</span>    long ts = 1;<a name="line.5393"></a>
+<span class="sourceLineNo">5394</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5394"></a>
+<span class="sourceLineNo">5395</span>    // disable compactions in this test.<a name="line.5395"></a>
+<span class="sourceLineNo">5396</span>    conf.setInt("hbase.hstore.compactionThreshold", 10000);<a name="line.5396"></a>
+<span class="sourceLineNo">5397</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5397"></a>
+<span class="sourceLineNo">5398</span>    KeyValue kv1 = new KeyValue(row1, cf1, col, ts, KeyValue.Type.Put, null);<a name="line.5398"></a>
+<span class="sourceLineNo">5399</span>    KeyValue kv2 = new KeyValue(row2, cf2, col, ts, KeyValue.Type.Put, null);<a name="line.5399"></a>
+<span class="sourceLineNo">5400</span>    KeyValue kv3 = new KeyValue(row3, cf3, col, ts, KeyValue.Type.Put, null);<a name="line.5400"></a>
+<span class="sourceLineNo">5401</span>    KeyValue kv4 = new KeyValue(row4, cf4, col, ts, KeyValue.Type.Put, null);<a name="line.5401"></a>
+<span class="sourceLineNo">5402</span>    // storefile1<a name="line.5402"></a>
+<span class="sourceLineNo">5403</span>    Put put = new Put(row1);<a name="line.5403"></a>
+<span class="sourceLineNo">5404</span>    put.add(kv1);<a name="line.5404"></a>
 <span class="sourceLineNo">5405</span>    region.put(put);<a name="line.5405"></a>
 <span class="sourceLineNo">5406</span>    region.flush(true);<a name="line.5406"></a>
-<span class="sourceLineNo">5407</span>    // memstore<a name="line.5407"></a>
-<span class="sourceLineNo">5408</span>    put = new Put(row4);<a name="line.5408"></a>
-<span class="sourceLineNo">5409</span>    put.add(kv4);<a name="line.5409"></a>
+<span class="sourceLineNo">5407</span>    // storefile2<a name="line.5407"></a>
+<span class="sourceLineNo">5408</span>    put = new Put(row2);<a name="line.5408"></a>
+<span class="sourceLineNo">5409</span>    put.add(kv2);<a name="line.5409"></a>
 <span class="sourceLineNo">5410</span>    region.put(put);<a name="line.5410"></a>
-<span class="sourceLineNo">5411</span>    // scan range = ["row4", min)<a name="line.5411"></a>
-<span class="sourceLineNo">5412</span>    Scan scan = new Scan(row4);<a name="line.5412"></a>
-<span class="sourceLineNo">5413</span>    scan.setReversed(true);<a name="line.5413"></a>
-<span class="sourceLineNo">5414</span>    scan.setBatch(10);<a name="line.5414"></a>
-<span class="sourceLineNo">5415</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5415"></a>
-<span class="sourceLineNo">5416</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5416"></a>
-<span class="sourceLineNo">5417</span>    boolean hasNext = scanner.next(currRow);<a name="line.5417"></a>
-<span class="sourceLineNo">5418</span>    assertEquals(1, currRow.size());<a name="line.5418"></a>
-<span class="sourceLineNo">5419</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5419"></a>
-<span class="sourceLineNo">5420</span>        .get(0).getRowLength(), row4, 0, row4.length));<a name="line.5420"></a>
-<span class="sourceLineNo">5421</span>    assertTrue(hasNext);<a name="line.5421"></a>
-<span class="sourceLineNo">5422</span>    currRow.clear();<a name="line.5422"></a>
-<span class="sourceLineNo">5423</span>    hasNext = scanner.next(currRow);<a name="line.5423"></a>
-<span class="sourceLineNo">5424</span>    assertEquals(1, currRow.size());<a name="line.5424"></a>
-<span class="sourceLineNo">5425</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5425"></a>
-<span class="sourceLineNo">5426</span>        .get(0).getRowLength(), row3, 0, row3.length));<a name="line.5426"></a>
-<span class="sourceLineNo">5427</span>    assertTrue(hasNext);<a name="line.5427"></a>
-<span class="sourceLineNo">5428</span>    currRow.clear();<a name="line.5428"></a>
-<span class="sourceLineNo">5429</span>    hasNext = scanner.next(currRow);<a name="line.5429"></a>
-<span class="sourceLineNo">5430</span>    assertEquals(1, currRow.size());<a name="line.5430"></a>
-<span class="sourceLineNo">5431</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5431"></a>
-<span class="sourceLineNo">5432</span>        .get(0).getRowLength(), row2, 0, row2.length));<a name="line.5432"></a>
-<span class="sourceLineNo">5433</span>    assertTrue(hasNext);<a name="line.5433"></a>
-<span class="sourceLineNo">5434</span>    currRow.clear();<a name="line.5434"></a>
-<span class="sourceLineNo">5435</span>    hasNext = scanner.next(currRow);<a name="line.5435"></a>
-<span class="sourceLineNo">5436</span>    assertEquals(1, currRow.size());<a name="line.5436"></a>
-<span class="sourceLineNo">5437</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5437"></a>
-<span class="sourceLineNo">5438</span>        .get(0).getRowLength(), row1, 0, row1.length));<a name="line.5438"></a>
-<span class="sourceLineNo">5439</span>    assertFalse(hasNext);<a name="line.5439"></a>
-<span class="sourceLineNo">5440</span>  }<a name="line.5440"></a>
-<span class="sourceLineNo">5441</span><a name="line.5441"></a>
-<span class="sourceLineNo">5442</span>  /**<a name="line.5442"></a>
-<span class="sourceLineNo">5443</span>   * Test for HBASE-14497: Reverse Scan threw StackOverflow caused by readPt checking<a name="line.5443"></a>
-<span class="sourceLineNo">5444</span>   */<a name="line.5444"></a>
-<span class="sourceLineNo">5445</span>  @Test<a name="line.5445"></a>
-<span class="sourceLineNo">5446</span>  public void testReverseScanner_StackOverflow() throws IOException {<a name="line.5446"></a>
-<span class="sourceLineNo">5447</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5447"></a>
-<span class="sourceLineNo">5448</span>    byte[][] families = {cf1};<a name="line.5448"></a>
-<span class="sourceLineNo">5449</span>    byte[] col = Bytes.toBytes("C");<a name="line.5449"></a>
-<span class="sourceLineNo">5450</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5450"></a>
-<span class="sourceLineNo">5451</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5451"></a>
-<span class="sourceLineNo">5452</span>    // setup with one storefile and one memstore, to create scanner and get an earlier readPt<a name="line.5452"></a>
-<span class="sourceLineNo">5453</span>    Put put = new Put(Bytes.toBytes("19998"));<a name="line.5453"></a>
-<span class="sourceLineNo">5454</span>    put.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5454"></a>
-<span class="sourceLineNo">5455</span>    region.put(put);<a name="line.5455"></a>
-<span class="sourceLineNo">5456</span>    region.flushcache(true, true, FlushLifeCycleTracker.DUMMY);<a name="line.5456"></a>
-<span class="sourceLineNo">5457</span>    Put put2 = new Put(Bytes.toBytes("19997"));<a name="line.5457"></a>
-<span class="sourceLineNo">5458</span>    put2.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5458"></a>
-<span class="sourceLineNo">5459</span>    region.put(put2);<a name="line.5459"></a>
-<span class="sourceLineNo">5460</span><a name="line.5460"></a>
-<span class="sourceLineNo">5461</span>    Scan scan = new Scan(Bytes.toBytes("19998"));<a name="line.5461"></a>
-<span class="sourceLineNo">5462</span>    scan.setReversed(true);<a name="line.5462"></a>
-<span class="sourceLineNo">5463</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5463"></a>
-<span class="sourceLineNo">5464</span><a name="line.5464"></a>
-<span class="sourceLineNo">5465</span>    // create one storefile contains many rows will be skipped<a name="line.5465"></a>
-<span class="sourceLineNo">5466</span>    // to check StoreFileScanner.seekToPreviousRow<a name="line.5466"></a>
-<span class="sourceLineNo">5467</span>    for (int i = 10000; i &lt; 20000; i++) {<a name="line.5467"></a>
-<span class="sourceLineNo">5468</span>      Put p = new Put(Bytes.toBytes(""+i));<a name="line.5468"></a>
-<span class="sourceLineNo">5469</span>      p.addColumn(cf1, col, Bytes.toBytes("" + i));<a name="line.5469"></a>
-<span class="sourceLineNo">5470</span>      region.put(p);<a name="line.5470"></a>
-<span class="sourceLineNo">5471</span>    }<a name="line.5471"></a>
-<span class="sourceLineNo">5472</span>    region.flushcache(true, true, FlushLifeCycleTracker.DUMMY);<a name="line.5472"></a>
-<span class="sourceLineNo">5473</span><a name="line.5473"></a>
-<span class="sourceLineNo">5474</span>    // create one memstore contains many rows will be skipped<a name="line.5474"></a>
-<span class="sourceLineNo">5475</span>    // to check MemStoreScanner.seekToPreviousRow<a name="line.5475"></a>
-<span class="sourceLineNo">5476</span>    for (int i = 10000; i &lt; 20000; i++) {<a name="line.5476"></a>
-<span class="sourceLineNo">5477</span>      Put p = new Put(Bytes.toBytes(""+i));<a name="line.5477"></a>
-<span class="sourceLineNo">5478</span>      p.addColumn(cf1, col, Bytes.toBytes("" + i));<a name="line.5478"></a>
-<span class="sourceLineNo">5479</span>      region.put(p);<a name="line.5479"></a>
-<span class="sourceLineNo">5480</span>    }<a name="line.5480"></a>
-<span class="sourceLineNo">5481</span><a name="line.5481"></a>
-<span class="sourceLineNo">5482</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5482"></a>
-<span class="sourceLineNo">5483</span>    boolean hasNext;<a name="line.5483"></a>
-<span class="sourceLineNo">5484</span>    do {<a name="line.5484"></a>
-<span class="sourceLineNo">5485</span>      hasNext = scanner.next(currRow);<a name="line.5485"></a>
-<span class="sourceLineNo">5486</span>    } while (hasNext);<a name="line.5486"></a>
-<span class="sourceLineNo">5487</span>    assertEquals(2, currRow.size());<a name="line.5487"></a>
-<span class="sourceLineNo">5488</span>    assertEquals("19998", Bytes.toString(currRow.get(0).getRowArray(),<a name="line.5488"></a>
-<span class="sourceLineNo">5489</span>      currRow.get(0).getRowOffset(), currRow.get(0).getRowLength()));<a name="line.5489"></a>
-<span class="sourceLineNo">5490</span>    assertEquals("19997", Bytes.toString(currRow.get(1).getRowArray(),<a name="line.5490"></a>
-<span class="sourceLineNo">5491</span>      currRow.get(1).getRowOffset(), currRow.get(1).getRowLength()));<a name="line.5491"></a>
-<span class="sourceLineNo">5492</span>  }<a name="line.5492"></a>
-<span class="sourceLineNo">5493</span><a name="line.5493"></a>
-<span class="sourceLineNo">5494</span>  @Test<a name="line.5494"></a>
-<span class="sourceLineNo">5495</span>  public void testReverseScanShouldNotScanMemstoreIfReadPtLesser() throws Exception {<a name="line.5495"></a>
-<span class="sourceLineNo">5496</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5496"></a>
-<span class="sourceLineNo">5497</span>    byte[][] families = { cf1 };<a name="line.5497"></a>
-<span class="sourceLineNo">5498</span>    byte[] col = Bytes.toBytes("C");<a name="line.5498"></a>
-<span class="sourceLineNo">5499</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5499"></a>
-<span class="sourceLineNo">5500</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5500"></a>
-<span class="sourceLineNo">5501</span>    // setup with one storefile and one memstore, to create scanner and get an earlier readPt<a name="line.5501"></a>
-<span class="sourceLineNo">5502</span>    Put put = new Put(Bytes.toBytes("19996"));<a name="line.5502"></a>
-<span class="sourceLineNo">5503</span>    put.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5503"></a>
-<span class="sourceLineNo">5504</span>    region.put(put);<a name="line.5504"></a>
-<span class="sourceLineNo">5505</span>    Put put2 = new Put(Bytes.toBytes("19995"));<a name="line.5505"></a>
-<span class="sourceLineNo">5506</span>    put2.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5506"></a>
-<span class="sourceLineNo">5507</span>    region.put(put2);<a name="line.5507"></a>
-<span class="sourceLineNo">5508</span>    // create a reverse scan<a name="line.5508"></a>
-<span class="sourceLineNo">5509</span>    Scan scan = new Scan(Bytes.toBytes("19996"));<a name="line.5509"></a>
-<span class="sourceLineNo">5510</span>    scan.setReversed(true);<a name="line.5510"></a>
-<span class="sourceLineNo">5511</span>    RegionScannerImpl scanner = region.getScanner(scan);<a name="line.5511"></a>
-<span class="sourceLineNo">5512</span><a name="line.5512"></a>
-<span class="sourceLineNo">5513</span>    // flush the cache. This will reset the store scanner<a name="line.5513"></a>
-<span class="sourceLineNo">5514</span>    region.flushcache(true, true, FlushLifeCycleTracker.DUMMY);<a name="line.5514"></a>
-<span class="sourceLineNo">5515</span><a name="line.5515"></a>
-<span class="sourceLineNo">5516</span>    // create one memstore contains many rows will be skipped<a name="line.5516"></a>
-<span class="sourceLineNo">5517</span>    // to check MemStoreScanner.seekToPreviousRow<a name="line.5517"></a>
-<span class="sourceLineNo">5518</span>    for (int i = 10000; i &lt; 20000; i++) {<a name="line.5518"></a>
-<span class="sourceLineNo">5519</span>      Put p = new Put(Bytes.toBytes("" + i));<a name="line.5519"></a>
-<span class="sourceLineNo">5520</span>      p.addColumn(cf1, col, Bytes.toBytes("" + i));<a name="line.5520"></a>
-<span class="sourceLineNo">5521</span>      region.put(p);<a name="line.5521"></a>
-<span class="sourceLineNo">5522</span>    }<a name="line.5522"></a>
-<span class="sourceLineNo">5523</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5523"></a>
-<span class="sourceLineNo">5524</span>    boolean hasNext;<a name="line.5524"></a>
-<span class="sourceLineNo">5525</span>    boolean assertDone = false;<a name="line.5525"></a>
-<span class="sourceLineNo">5526</span>    do {<a name="line.5526"></a>
-<span class="sourceLineNo">5527</span>      hasNext = scanner.next(currRow);<a name="line.5527"></a>
-<span class="sourceLineNo">5528</span>      // With HBASE-15871, after the scanner is reset the memstore scanner should not be<a name="line.5528"></a>
-<span class="sourceLineNo">5529</span>      // added here<a name="line.5529"></a>
-<span class="sourceLineNo">5530</span>      if (!assertDone) {<a name="line.5530"></a>
-<span class="sourceLineNo">5531</span>        StoreScanner current =<a name="line.5531"></a>
-<span class="sourceLineNo">5532</span>            (StoreScanner) (scanner.storeHeap).getCurrentForTesting();<a name="line.5532"></a>
-<span class="sourceLineNo">5533</span>        List&lt;KeyValueScanner&gt; scanners = current.getAllScannersForTesting();<a name="line.5533"></a>
-<span class="sourceLineNo">5534</span>        assertEquals("There should be only one scanner the store file scanner", 1,<a name="line.5534"></a>
-<span class="sourceLineNo">5535</span>          scanners.size());<a name="line.5535"></a>
-<span class="sourceLineNo">5536</span>        assertDone = true;<a name="line.5536"></a>
-<span class="sourceLineNo">5537</span>      }<a name="line.5537"></a>
-<span class="sourceLineNo">5538</span>    } while (hasNext);<a name="line.5538"></a>
-<span class="sourceLineNo">5539</span>    assertEquals(2, currRow.size());<a name="line.5539"></a>
-<span class="sourceLineNo">5540</span>    assertEquals("19996", Bytes.toString(currRow.get(0).getRowArray(),<a name="line.5540"></a>
-<span class="sourceLineNo">5541</span>      currRow.get(0).getRowOffset(), currRow.get(0).getRowLength()));<a name="line.5541"></a>
-<span class="sourceLineNo">5542</span>    assertEquals("19995", Bytes.toString(currRow.get(1).getRowArray(),<a name="line.5542"></a>
-<span class="sourceLineNo">5543</span>      currRow.get(1).getRowOffset(), currRow.get(1).getRowLength()));<a name="line.5543"></a>
-<span class="sourceLineNo">5544</span>  }<a name="line.5544"></a>
-<span class="sourceLineNo">5545</span><a name="line.5545"></a>
-<span class="sourceLineNo">5546</span>  @Test<a name="line.5546"></a>
-<span class="sourceLineNo">5547</span>  public void testReverseScanWhenPutCellsAfterOpenReverseScan() throws Exception {<a name="line.5547"></a>
-<span class="sourceLineNo">5548</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5548"></a>
-<span class="sourceLineNo">5549</span>    byte[][] families = { cf1 };<a name="line.5549"></a>
-<span class="sourceLineNo">5550</span>    byte[] col = Bytes.toBytes("C");<a name="line.5550"></a>
-<span class="sourceLineNo">5551</span><a name="line.5551"></a>
-<span class="sourceLineNo">5552</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5552"></a>
-<span class="sourceLineNo">5553</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5553"></a>
-<span class="sourceLineNo">5554</span><a name="line.5554"></a>
-<span class="sourceLineNo">5555</span>    Put put = new Put(Bytes.toBytes("199996"));<a name="line.5555"></a>
-<span class="sourceLineNo">5556</span>    put.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5556"></a>
-<span class="sourceLineNo">5557</span>    region.put(put);<a name="line.5557"></a>
-<span class="sourceLineNo">5558</span>    Put put2 = new Put(Bytes.toBytes("199995"));<a name="line.5558"></a>
-<span class="sourceLineNo">5559</span>    put2.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5559"></a>
-<span class="sourceLineNo">5560</span>    region.put(put2);<a name="line.5560"></a>
+<span class="sourceLineNo">5411</span>    region.flush(true);<a name="line.5411"></a>
+<span class="sourceLineNo">5412</span>    // storefile3<a name="line.5412"></a>
+<span class="sourceLineNo">5413</span>    put = new Put(row3);<a name="line.5413"></a>
+<span class="sourceLineNo">5414</span>    put.add(kv3);<a name="line.5414"></a>
+<span class="sourceLineNo">5415</span>    region.put(put);<a name="line.5415"></a>
+<span class="sourceLineNo">5416</span>    region.flush(true);<a name="line.5416"></a>
+<span class="sourceLineNo">5417</span>    // memstore<a name="line.5417"></a>
+<span class="sourceLineNo">5418</span>    put = new Put(row4);<a name="line.5418"></a>
+<span class="sourceLineNo">5419</span>    put.add(kv4);<a name="line.5419"></a>
+<span class="sourceLineNo">5420</span>    region.put(put);<a name="line.5420"></a>
+<span class="sourceLineNo">5421</span>    // scan range = ["row4", min)<a name="line.5421"></a>
+<span class="sourceLineNo">5422</span>    Scan scan = new Scan(row4);<a name="line.5422"></a>
+<span class="sourceLineNo">5423</span>    scan.setReversed(true);<a name="line.5423"></a>
+<span class="sourceLineNo">5424</span>    scan.setBatch(10);<a name="line.5424"></a>
+<span class="sourceLineNo">5425</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5425"></a>
+<span class="sourceLineNo">5426</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5426"></a>
+<span class="sourceLineNo">5427</span>    boolean hasNext = scanner.next(currRow);<a name="line.5427"></a>
+<span class="sourceLineNo">5428</span>    assertEquals(1, currRow.size());<a name="line.5428"></a>
+<span class="sourceLineNo">5429</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5429"></a>
+<span class="sourceLineNo">5430</span>        .get(0).getRowLength(), row4, 0, row4.length));<a name="line.5430"></a>
+<span class="sourceLineNo">5431</span>    assertTrue(hasNext);<a name="line.5431"></a>
+<span class="sourceLineNo">5432</span>    currRow.clear();<a name="line.5432"></a>
+<span class="sourceLineNo">5433</span>    hasNext = scanner.next(currRow);<a name="line.5433"></a>
+<span class="sourceLineNo">5434</span>    assertEquals(1, currRow.size());<a name="line.5434"></a>
+<span class="sourceLineNo">5435</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5435"></a>
+<span class="sourceLineNo">5436</span>        .get(0).getRowLength(), row3, 0, row3.length));<a name="line.5436"></a>
+<span class="sourceLineNo">5437</span>    assertTrue(hasNext);<a name="line.5437"></a>
+<span class="sourceLineNo">5438</span>    currRow.clear();<a name="line.5438"></a>
+<span class="sourceLineNo">5439</span>    hasNext = scanner.next(currRow);<a name="line.5439"></a>
+<span class="sourceLineNo">5440</span>    assertEquals(1, currRow.size());<a name="line.5440"></a>
+<span class="sourceLineNo">5441</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5441"></a>
+<span class="sourceLineNo">5442</span>        .get(0).getRowLength(), row2, 0, row2.length));<a name="line.5442"></a>
+<span class="sourceLineNo">5443</span>    assertTrue(hasNext);<a name="line.5443"></a>
+<span class="sourceLineNo">5444</span>    currRow.clear();<a name="line.5444"></a>
+<span class="sourceLineNo">5445</span>    hasNext = scanner.next(currRow);<a name="line.5445"></a>
+<span class="sourceLineNo">5446</span>    assertEquals(1, currRow.size());<a name="line.5446"></a>
+<span class="sourceLineNo">5447</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5447"></a>
+<span class="sourceLineNo">5448</span>        .get(0).getRowLength(), row1, 0, row1.length));<a name="line.5448"></a>
+<span class="sourceLineNo">5449</span>    assertFalse(hasNext);<a name="line.5449"></a>
+<span class="sourceLineNo">5450</span>  }<a name="line.5450"></a>
+<span class="sourceLineNo">5451</span><a name="line.5451"></a>
+<span class="sourceLineNo">5452</span>  /**<a name="line.5452"></a>
+<span class="sourceLineNo">5453</span>   * Test for HBASE-14497: Reverse Scan threw StackOverflow caused by readPt checking<a name="line.5453"></a>
+<span class="sourceLineNo">5454</span>   */<a name="line.5454"></a>
+<span class="sourceLineNo">5455</span>  @Test<a name="line.5455"></a>
+<span class="sourceLineNo">5456</span>  public void testReverseScanner_StackOverflow() throws IOException {<a name="line.5456"></a>
+<span class="sourceLineNo">5457</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5457"></a>
+<span class="sourceLineNo">5458</span>    byte[][] families = {cf1};<a name="line.5458"></a>
+<span class="sourceLineNo">5459</span>    byte[] col = Bytes.toBytes("C");<a name="line.5459"></a>
+<span class="sourceLineNo">5460</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5460"></a>
+<span class="sourceLineNo">5461</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5461"></a>
+<span class="sourceLineNo">5462</span>    // setup with one storefile and one memstore, to create scanner and get an earlier readPt<a name="line.5462"></a>
+<span class="sourceLineNo">5463</span>    Put put = new Put(Bytes.toBytes("19998"));<a name="line.5463"></a>
+<span class="sourceLineNo">5464</span>    put.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5464"></a>
+<span class="sourceLineNo">5465</span>    region.put(put);<a name="line.5465"></a>
+<span class="sourceLineNo">5466</span>    region.flushcache(true, true, FlushLifeCycleTracker.DUMMY);<a name="line.5466"></a>
+<span class="sourceLineNo">5467</span>    Put put2 = new Put(Bytes.toBytes("19997"));<a name="line.5467"></a>
+<span class="sourceLineNo">5468</span>    put2.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5468"></a>
+<span class="sourceLineNo">5469</span>    region.put(put2);<a name="line.5469"></a>
+<span class="sourceLineNo">5470</span><a name="line.5470"></a>
+<span class="sourceLineNo">5471</span>    Scan scan = new Scan(Bytes.toBytes("19998"));<a name="line.5471"></a>
+<span class="sourceLineNo">5472</span>    scan.setReversed(true);<a name="line.5472"></a>
+<span class="sourceLineNo">5473</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5473"></a>
+<span class="sourceLineNo">5474</span><a name="line.5474"></a>
+<span class="sourceLineNo">5475</span>    // create one storefile contains many rows will be skipped<a name="line.5475"></a>
+<span class="sourceLineNo">5476</span>    // to check StoreFileScanner.seekToPreviousRow<a name="line.5476"></a>
+<span class="sourceLineNo">5477</span>    for (int i = 10000; i &lt; 20000; i++) {<a name="line.5477"></a>
+<span class="sourceLineNo">5478</span>      Put p = new Put(Bytes.toBytes(""+i));<a name="line.5478"></a>
+<span class="sourceLineNo">5479</span>      p.addColumn(cf1, col, Bytes.toBytes("" + i));<a name="line.5479"></a>
+<span class="sourceLineNo">5480</span>      region.put(p);<a name="line.5480"></a>
+<span class="sourceLineNo">5481</span>    }<a name="line.5481"></a>
+<span class="sourceLineNo">5482</span>    region.flushcache(true, true, FlushLifeCycleTracker.DUMMY);<a name="line.5482"></a>
+<span class="sourceLineNo">5483</span><a name="line.5483"></a>
+<span class="sourceLineNo">5484</span>    // create one memstore contains many rows will be skipped<a name="line.5484"></a>
+<span class="sourceLineNo">5485</span>    // to check MemStoreScanner.seekToPreviousRow<a name="line.5485"></a>
+<span class="sourceLineNo">5486</span>    for (int i = 10000; i &lt; 20000; i++) {<a name="line.5486"></a>
+<span class="sourceLineNo">5487</span>      Put p = new Put(Bytes.toBytes(""+i));<a name="line.5487"></a>
+<span class="sourceLineNo">5488</span>      p.addColumn(cf1, col, Bytes.toBytes("" + i));<a name="line.5488"></a>
+<span class="sourceLineNo">5489</span>      region.put(p);<a name="line.5489"></a>
+<span class="sourceLineNo">5490</span>    }<a name="line.5490"></a>
+<span class="sourceLineNo">5491</span><a name="line.5491"></a>
+<span class="sourceLineNo">5492</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5492"></a>
+<span class="sourceLineNo">5493</span>    boolean hasNext;<a name="line.5493"></a>
+<span class="sourceLineNo">5494</span>    do {<a name="line.5494"></a>
+<span class="sourceLineNo">5495</span>      hasNext = scanner.next(currRow);<a name="line.5495"></a>
+<span class="sourceLineNo">5496</span>    } while (hasNext);<a name="line.5496"></a>
+<span class="sourceLineNo">5497</span>    assertEquals(2, currRow.size());<a name="line.5497"></a>
+<span class="sourceLineNo">5498</span>    assertEquals("19998", Bytes.toString(currRow.get(0).getRowArray(),<a name="line.5498"></a>
+<span class="sourceLineNo">5499</span>      currRow.get(0).getRowOffset(), currRow.get(0).getRowLength()));<a name="line.5499"></a>
+<span class="sourceLineNo">5500</span>    assertEquals("19997", Bytes.toString(currRow.get(1).getRowArray(),<a name="line.5500"></a>
+<span class="sourceLineNo">5501</span>      currRow.get(1).getRowOffset(), currRow.get(1).getRowLength()));<a name="line.5501"></a>
+<span class="sourceLineNo">5502</span>  }<a name="line.5502"></a>
+<span class="sourceLineNo">5503</span><a name="line.5503"></a>
+<span class="sourceLineNo">5504</span>  @Test<a name="line.5504"></a>
+<span class="sourceLineNo">5505</span>  public void testReverseScanShouldNotScanMemstoreIfReadPtLesser() throws Exception {<a name="line.5505"></a>
+<span class="sourceLineNo">5506</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5506"></a>
+<span class="sourceLineNo">5507</span>    byte[][] families = { cf1 };<a name="line.5507"></a>
+<span class="sourceLineNo">5508</span>    byte[] col = Bytes.toBytes("C");<a name="line.5508"></a>
+<span class="sourceLineNo">5509</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5509"></a>
+<span class="sourceLineNo">5510</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5510"></a>
+<span class="sourceLineNo">5511</span>    // setup with one storefile and one memstore, to create scanner and get an earlier readPt<a name="line.5511"></a>
+<span class="sourceLineNo">5512</span>    Put put = new Put(Bytes.toBytes("19996"));<a name="line.5512"></a>
+<span class="sourceLineNo">5513</span>    put.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5513"></a>
+<span class="sourceLineNo">5514</span>    region.put(put);<a name="line.5514"></a>
+<span class="sourceLineNo">5515</span>    Put put2 = new Put(Bytes.toBytes("19995"));<a name="line.5515"></a>
+<span class="sourceLineNo">5516</span>    put2.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5516"></a>
+<span class="sourceLineNo">5517</span>    region.put(put2);<a name="line.5517"></a>
+<span class="sourceLineNo">5518</span>    // create a reverse scan<a name="line.5518"></a>
+<span class="sourceLineNo">5519</span>    Scan scan = new Scan(Bytes.toBytes("19996"));<a name="line.5519"></a>
+<span class="sourceLineNo">5520</span>    scan.setReversed(true);<a name="line.5520"></a>
+<span class="sourceLineNo">5521</span>    RegionScannerImpl scanner = region.getScanner(scan);<a name="line.5521"></a>
+<span class="sourceLineNo">5522</span><a name="line.5522"></a>
+<span class="sourceLineNo">5523</span>    // flush the cache. This will reset the store scanner<a name="line.5523"></a>
+<span class="sourceLineNo">5524</span>    region.flushcache(true, true, FlushLifeCycleTracker.DUMMY);<a name="line.5524"></a>
+<span class="sourceLineNo">5525</span><a name="line.5525"></a>
+<span class="sourceLineNo">5526</span>    // create one memstore contains many rows will be skipped<a name="line.5526"></a>
+<span class="sourceLineNo">5527</span>    // to check MemStoreScanner.seekToPreviousRow<a name="line.5527"></a>
+<span class="sourceLineNo">5528</span>    for (int i = 10000; i &lt; 20000; i++) {<a name="line.5528"></a>
+<span class="sourceLineNo">5529</span>      Put p = new Put(Bytes.toBytes("" + i));<a name="line.5529"></a>
+<span class="sourceLineNo">5530</span>      p.addColumn(cf1, col, Bytes.toBytes("" + i));<a name="line.5530"></a>
+<span class="sourceLineNo">5531</span>      region.put(p);<a name="line.5531"></a>
+<span class="sourceLineNo">5532</span>    }<a name="line.5532"></a>
+<span class="sourceLineNo">5533</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5533"></a>
+<span class="sourceLineNo">5534</span>    boolean hasNext;<a name="line.5534"></a>
+<span class="sourceLineNo">5535</span>    boolean assertDone = false;<a name="line.5535"></a>
+<span class="sourceLineNo">5536</span>    do {<a name="line.5536"></a>
+<span class="sourceLineNo">5537</span>      hasNext = scanner.next(currRow);<a name="line.5537"></a>
+<span class="sourceLineNo">5538</span>      // With HBASE-15871, after the scanner is reset the memstore scanner should not be<a name="line.5538"></a>
+<span class="sourceLineNo">5539</span>      // added here<a name="line.5539"></a>
+<span class="sourceLineNo">5540</span>      if (!assertDone) {<a name="line.5540"></a>
+<span class="sourceLineNo">5541</span>        StoreScanner current =<a name="line.5541"></a>
+<span class="sourceLineNo">5542</span>            (StoreScanner) (scanner.storeHeap).getCurrentForTesting();<a name="line.5542"></a>
+<span class="sourceLineNo">5543</span>        List&lt;KeyValueScanner&gt; scanners = current.getAllScannersForTesting();<a name="line.5543"></a>
+<span class="sourceLineNo">5544</span>        assertEquals("There should be only one scanner the store file scanner", 1,<a name="line.5544"></a>
+<span class="sourceLineNo">5545</span>          scanners.size());<a name="line.5545"></a>
+<span class="sourceLineNo">5546</span>        assertDone = true;<a name="line.5546"></a>
+<span class="sourceLineNo">5547</span>      }<a name="line.5547"></a>
+<span class="sourceLineNo">5548</span>    } while (hasNext);<a name="line.5548"></a>
+<span class="sourceLineNo">5549</span>    assertEquals(2, currRow.size());<a name="line.5549"></a>
+<span class="sourceLineNo">5550</span>    assertEquals("19996", Bytes.toString(currRow.get(0).getRowArray(),<a name="line.5550"></a>
+<span class="sourceLineNo">5551</span>      currRow.get(0).getRowOffset(), currRow.get(0).getRowLength()));<a name="line.5551"></a>
+<span class="sourceLineNo">5552</span>    assertEquals("19995", Bytes.toString(currRow.get(1).getRowArray(),<a name="line.5552"></a>
+<span class="sourceLineNo">5553</span>      currRow.get(1).getRowOffset(), currRow.get(1).getRowLength()));<a name="line.5553"></a>
+<span class="sourceLineNo">5554</span>  }<a name="line.5554"></a>
+<span class="sourceLineNo">5555</span><a name="line.5555"></a>
+<span class="sourceLineNo">5556</span>  @Test<a name="line.5556"></a>
+<span class="sourceLineNo">5557</span>  public void testReverseScanWhenPutCellsAfterOpenReverseScan() throws Exception {<a name="line.5557"></a>
+<span class="sourceLineNo">5558</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5558"></a>
+<span class="sourceLineNo">5559</span>    byte[][] families = { cf1 };<a name="line.5559"></a>
+<span class="sourceLineNo">5560</span>    byte[] col = Bytes.toBytes("C");<a name="line.5560"></a>
 <span class="sourceLineNo">5561</span><a name="line.5561"></a>
-<span class="sourceLineNo">5562</span>    // Create a reverse scan<a name="line.5562"></a>
-<span class="sourceLineNo">5563</span>    Scan scan = new Scan(Bytes.toBytes("199996"));<a name="line.5563"></a>
-<span class="sourceLineNo">5564</span>    scan.setReversed(true);<a name="line.5564"></a>
-<span class="sourceLineNo">5565</span>    RegionScannerImpl scanner = region.getScanner(scan);<a name="line.5565"></a>
-<span class="sourceLineNo">5566</span><a name="line.5566"></a>
-<span class="sourceLineNo">5567</span>    // Put a lot of cells that have sequenceIDs grater than the readPt of the reverse scan<a name="line.5567"></a>
-<span class="sourceLineNo">5568</span>    for (int i = 100000; i &lt; 200000; i++) {<a name="line.5568"></a>
-<span class="sourceLineNo">5569</span>      Put p = new Put(Bytes.toBytes("" + i));<a name="line.5569"></a>
-<span class="sourceLineNo">5570</span>      p.addColumn(cf1, col, Bytes.toBytes("" + i));<a name="line.5570"></a>
-<span class="sourceLineNo">5571</span>      region.put(p);<a name="line.5571"></a>
-<span class="sourceLineNo">5572</span>    }<a name="line.5572"></a>
-<span class="sourceLineNo">5573</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5573"></a>
-<span class="sourceLineNo">5574</span>    boolean hasNext;<a name="line.5574"></a>
-<span class="sourceLineNo">5575</span>    do {<a name="line.5575"></a>
-<span class="sourceLineNo">5576</span>      hasNext = scanner.next(currRow);<a name="line.5576"></a>
-<span class="sourceLineNo">5577</span>    } while (hasNext);<a name="line.5577"></a>
-<span class="sourceLineNo">5578</span><a name="line.5578"></a>
-<span class="sourceLineNo">5579</span>    assertEquals(2, currRow.size());<a name="line.5579"></a>
-<span class="sourceLineNo">5580</span>    assertEquals("199996", Bytes.toString(currRow.get(0).getRowArray(),<a name="line.5580"></a>
-<span class="sourceLineNo">5581</span>      currRow.get(0).getRowOffset(), currRow.get(0).getRowLength()));<a name="line.5581"></a>
-<span class="sourceLineNo">5582</span>    assertEquals("199995", Bytes.toString(currRow.get(1).getRowArray(),<a name="line.5582"></a>
-<span class="sourceLineNo">5583</span>      currRow.get(1).getRowOffset(), currRow.get(1).getRowLength()));<a name="line.5583"></a>
-<span class="sourceLineNo">5584</span>  }<a name="line.5584"></a>
-<span class="sourceLineNo">5585</span><a name="line.5585"></a>
-<span class="sourceLineNo">5586</span>  @Test<a name="line.5586"></a>
-<span class="sourceLineNo">5587</span>  public void testWriteRequestsCounter() throws IOException {<a name="line.5587"></a>
-<span class="sourceLineNo">5588</span>    byte[] fam = Bytes.toBytes("info");<a name="line.5588"></a>
-<span class="sourceLineNo">5589</span>    byte[][] families = { fam };<a name="line.5589"></a>
-<span class="sourceLineNo">5590</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.5590"></a>
-<span class="sourceLineNo">5591</span><a name="line.5591"></a>
-<span class="sourceLineNo">5592</span>    Assert.assertEquals(0L, region.getWriteRequestsCount());<a name="line.5592"></a>
-<span class="sourceLineNo">5593</span><a name="line.5593"></a>
-<span class="sourceLineNo">5594</span>    Put put = new Put(row);<a name="line.5594"></a>
-<span class="sourceLineNo">5595</span>    put.addColumn(fam, fam, fam);<a name="line.5595"></a>
-<span class="sourceLineNo">5596</span><a name="line.5596"></a>
-<span class="sourceLineNo">5597</span>    Assert.assertEquals(0L, region.getWriteRequestsCount());<a name="line.5597"></a>
-<span class="sourceLineNo">5598</span>    region.put(put);<a name="line.5598"></a>
-<span class="sourceLineNo">5599</span>    Assert.assertEquals(1L, region.getWriteRequestsCount());<a name="line.5599"></a>
-<span class="sourceLineNo">5600</span>    region.put(put);<a name="line.5600"></a>
-<span class="sourceLineNo">5601</span>    Assert.assertEquals(2L, region.getWriteRequestsCount());<a name="line.5601"></a>
-<span class="sourceLineNo">5602</span>    region.put(put);<a name="line.5602"></a>
-<span class="sourceLineNo">5603</span>    Assert.assertEquals(3L, region.getWriteRequestsCount());<a name="line.5603"></a>
-<span class="sourceLineNo">5604</span><a name="line.5604"></a>
-<span class="sourceLineNo">5605</span>    region.delete(new Delete(row));<a name="line.5605"></a>
-<span class="sourceLineNo">5606</span>    Assert.assertEquals(4L, region.getWriteRequestsCount());<a name="line.5606"></a>
-<span class="sourceLineNo">5607</span>  }<a name="line.5607"></a>
-<span class="sourceLineNo">5608</span><a name="line.5608"></a>
-<span class="sourceLineNo">5609</span>  @Test<a name="line.5609"></a>
-<span class="sourceLineNo">5610</span>  public void testOpenRegionWrittenToWAL() throws Exception {<a name="line.5610"></a>
-<span class="sourceLineNo">5611</span>    final ServerName serverName = ServerName.valueOf(name.getMethodName(), 100, 42);<a name="line.5611"></a>
-<span class="sourceLineNo">5612</span>    final RegionServerServices rss = spy(TEST_UTIL.createMockRegionServerService(serverName));<a name="line.5612"></a>
-<span class="sourceLineNo">5613</span><a name="line.5613"></a>
-<span class="sourceLineNo">5614</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.5614"></a>
-<span class="sourceLineNo">5615</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.5615"></a>
-<span class="sourceLineNo">5616</span>    htd.addFamily(new HColumnDescriptor(fam2));<a name="line.5616"></a>
-<span class="sourceLineNo">5617</span><a name="line.5617"></a>
-<span class="sourceLineNo">5618</span>    HRegionInfo hri = new HRegionInfo(htd.getTableName(),<a name="line.5618"></a>
-<span class="sourceLineNo">5619</span>      HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY);<a name="line.5619"></a>
-<span class="sourceLineNo">5620</span><a name="line.5620"></a>
-<span class="sourceLineNo">5621</span>    // open the region w/o rss and wal and flush some files<a name="line.5621"></a>
-<span class="sourceLineNo">5622</span>    region =<a name="line.5622"></a>
-<span class="sourceLineNo">5623</span>         HBaseTestingUtility.createRegionAndWAL(hri, TEST_UTIL.getDataTestDir(), TEST_UTIL<a name="line.5623"></a>
-<span class="sourceLineNo">5624</span>             .getConfiguration(), htd);<a name="line.5624"></a>
-<span class="sourceLineNo">5625</span>    assertNotNull(region);<a name="line.5625"></a>
-<span class="sourceLineNo">5626</span><a name="line.5626"></a>
-<span class="sourceLineNo">5627</span>    // create a file in fam1 for the region before opening in OpenRegionHandler<a name="line.5627"></a>
-<span class="sourceLineNo">5628</span>    region.put(new Put(Bytes.toBytes("a")).addColumn(fam1, fam1, fam1));<a name="line.5628"></a>
-<span class="sourceLineNo">5629</span>    region.flush(true);<a name="line.5629"></a>
-<span class="sourceLineNo">5630</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.5630"></a>
-<span class="sourceLineNo">5631</span><a name="line.5631"></a>
-<span class="sourceLineNo">5632</span>    ArgumentCaptor&lt;WALEdit&gt; editCaptor = ArgumentCaptor.forClass(WALEdit.class);<a name="line.5632"></a>
-<span class="sourceLineNo">5633</span><a name="line.5633"></a>
-<span class="sourceLineNo">5634</span>    // capture append() calls<a name="line.5634"></a>
-<span class="sourceLineNo">5635</span>    WAL wal = mockWAL();<a name="line.5635"></a>
-<span class="sourceLineNo">5636</span>    when(rss.getWAL((HRegionInfo) any())).thenReturn(wal);<a name="line.5636"></a>
-<span class="sourceLineNo">5637</span><a name="line.5637"></a>
-<span class="sourceLineNo">5638</span>    region = HRegion.openHRegion(hri, htd, rss.getWAL(hri),<a name="line.5638"></a>
-<span class="sourceLineNo">5639</span>      TEST_UTIL.getConfiguration(), rss, null);<a name="line.5639"></a>
-<span class="sourceLineNo">5640</span><a name="line.5640"></a>
-<span class="sourceLineNo">5641</span>    verify(wal, times(1)).append((HRegionInfo)any(), (WALKeyImpl)any()<a name="line.5641"></a>
-<span class="sourceLineNo">5642</span>      , editCaptor.capture(), anyBoolean());<a name="line.5642"></a>
+<span class="sourceLineNo">5562</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5562"></a>
+<span class="sourceLineNo">5563</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5563"></a>
+<span class="sourceLineNo">5564</span><a name="line.5564"></a>
+<span class="sourceLineNo">5565</span>    Put put = new Put(Bytes.toBytes("199996"));<a name="line.5565"></a>
+<span class="sourceLineNo">5566</span>    put.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5566"></a>
+<span class="sourceLineNo">5567</span>    region.put(put);<a name="line.5567"></a>
+<span class="sourceLineNo">5568</span>    Put put2 = new Put(Bytes.toBytes("199995"));<a name="line.5568"></a>
+<span class="sourceLineNo">5569</span>    put2.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5569"></a>
+<span class="sourceLineNo">5570</span>    region.put(put2);<a name="line.5570"></a>
+<span class="sourceLineNo">5571</span><a name="line.5571"></a>
+<span class="sourceLineNo">5572</span>    // Create a reverse scan<a name="line.5572"></a>
+<span class="sourceLineNo">5573</span>    Scan scan = new Scan(Bytes.toBytes("199996"));<a name="line.5573"></a>
+<span class="sourceLineNo">5574</span>    scan.setReversed(true);<a name="line.5574"></a>
+<span class="sourceLineNo">5575</span>    RegionScannerImpl scanner = region.getScanner(scan);<a name="line.5575"></a>
+<span class="sourceLineNo">5576</span><a name="line.5576"></a>
+<span class="sourceLineNo">5577</span>    // Put a lot of cells that have sequenceIDs grater than the readPt of the reverse scan<a name="line.5577"></a>
+<span class="sourceLineNo">5578</span>    for (int i = 100000; i &lt; 200000; i++) {<a name="line.5578"></a>
+<span class="sourceLineNo">5579</span>      Put p = new Put(Bytes.toBytes("" + i));<a name="line.5579"></a>
+<span class="sourceLineNo">5580</span>      p.addColumn(cf1, col, Bytes.toBytes("" + i));<a name="line.5580"></a>
+<span class="sourceLineNo">5581</span>      region.put(p);<a name="line.5581"></a>
+<span class="sourceLineNo">5582</span>    }<a name="line.5582"></a>
+<span class="sourceLineNo">5583</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5583"></a>
+<span class="sourceLineNo">5584</span>    boolean hasNext;<a name="line.5584"></a>
+<span class="sourceLineNo">5585</span>    do {<a name="line.5585"></a>
+<span class="sourceLineNo">5586</span>      hasNext = scanner.next(currRow);<a name="line.5586"></a>
+<span class="sourceLineNo">5587</span>    } while (hasNext);<a name="line.5587"></a>
+<span class="sourceLineNo">5588</span><a name="line.5588"></a>
+<span class="sourceLineNo">5589</span>    assertEquals(2, currRow.size());<a name="line.5589"></a>
+<span class="sourceLineNo">5590</span>    assertEquals("199996", Bytes.toString(currRow.get(0).getRowArray(),<a name="line.5590"></a>
+<span class="sourceLineNo">5591</span>      currRow.get(0).getRowOffset(), currRow.get(0).getRowLength()));<a name="line.5591"></a>
+<span class="sourceLineNo">5592</span>    assertEquals("199995", Bytes.toString(currRow.get(1).getRowArray(),<a name="line.5592"></a>
+<span class="sourceLineNo">5593</span>      currRow.get(1).getRowOffset(), currRow.get(1).getRowLength()));<a name="line.5593"></a>
+<span class="sourceLineNo">5594</span>  }<a name="line.5594"></a>
+<span class="sourceLineNo">5595</span><a name="line.5595"></a>
+<span class="sourceLineNo">5596</span>  @Test<a name="line.5596"></a>
+<span class="sourceLineNo">5597</span>  public void testWriteRequestsCounter() throws IOException {<a name="line.5597"></a>
+<span class="sourceLineNo">5598</span>    byte[] fam = Bytes.toBytes("info");<a name="line.5598"></a>
+<span class="sourceLineNo">5599</span>    byte[][] families = { fam };<a name="line.5599"></a>
+<span class="sourceLineNo">5600</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.5600"></a>
+<span class="sourceLineNo">5601</span><a name="line.5601"></a>
+<span class="sourceLineNo">5602</span>    Assert.assertEquals(0L, region.getWriteRequestsCount());<a name="line.5602"></a>
+<span class="sourceLineNo">5603</span><a name="line.5603"></a>
+<span class="sourceLineNo">5604</span>    Put put = new Put(row);<a name="line.5604"></a>
+<span class="sourceLineNo">5605</span>    put.addColumn(fam, fam, fam);<a name="line.5605"></a>
+<span class="sourceLineNo">5606</span><a name="line.5606"></a>
+<span class="sourceLineNo">5607</span>    Assert.assertEquals(0L, region.getWriteRequestsCount());<a name="line.5607"></a>
+<span class="sourceLineNo">5608</span>    region.put(put);<a name="line.5608"></a>
+<span class="sourceLineNo">5609</span>    Assert.assertEquals(1L, region.getWriteRequestsCount());<a name="line.5609"></a>
+<span class="sourceLineNo">5610</span>    region.put(put);<a name="line.5610"></a>
+<span class="sourceLineNo">5611</span>    Assert.assertEquals(2L, region.getWriteRequestsCount());<a name="line.5611"></a>
+<span class="sourceLineNo">5612</span>    region.put(put);<a name="line.5612"></a>
+<span class="sourceLineNo">5613</span>    Assert.assertEquals(3L, region.getWriteRequestsCount());<a name="line.5613"></a>
+<span class="sourceLineNo">5614</span><a name="line.5614"></a>
+<span class="sourceLineNo">5615</span>    region.delete(new Delete(row));<a name="line.5615"></a>
+<span class="sourceLineNo">5616</span>    Assert.assertEquals(4L, region.getWriteRequestsCount());<a name="line.5616"></a>
+<span class="sourceLineNo">5617</span>  }<a name="line.5617"></a>
+<span class="sourceLineNo">5618</span><a name="line.5618"></a>
+<span class="sourceLineNo">5619</span>  @Test<a name="line.5619"></a>
+<span class="sourceLineNo">5620</span>  public void testOpenRegionWrittenToWAL() throws Exception {<a name="line.5620"></a>
+<span class="sourceLineNo">5621</span>    final ServerName serverName = ServerName.valueOf(name.getMethodName(), 100, 42);<a name="line.5621"></a>
+<span class="sourceLineNo">5622</span>    final RegionServerServices rss = spy(TEST_UTIL.createMockRegionServerService(serverName));<a name="line.5622"></a>
+<span class="sourceLineNo">5623</span><a name="line.5623"></a>
+<span class="sourceLineNo">5624</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.5624"></a>
+<span class="sourceLineNo">5625</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.5625"></a>
+<span class="sourceLineNo">5626</span>    htd.addFamily(new HColumnDescriptor(fam2));<a name="line.5626"></a>
+<span class="sourceLineNo">5627</span><a name="line.5627"></a>
+<span class="sourceLineNo">5628</span>    HRegionInfo hri = new HRegionInfo(htd.getTableName(),<a name="line.5628"></a>
+<span class="sourceLineNo">5629</span>      HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY);<a name="line.5629"></a>
+<span class="sourceLineNo">5630</span><a name="line.5630"></a>
+<span class="sourceLineNo">5631</span>    // open the region w/o rss and wal and flush some files<a name="line.5631"></a>
+<span class="sourceLineNo">5632</span>    region =<a name="line.5632"></a>
+<span class="sourceLineNo">5633</span>         HBaseTestingUtility.createRegionAndWAL(hri, TEST_UTIL.getDataTestDir(), TEST_UTIL<a name="line.5633"></a>
+<span class="sourceLineNo">5634</span>             .getConfiguration(), htd);<a name="line.5634"></a>
+<span class="sourceLineNo">5635</span>    assertNotNull(region);<a name="line.5635"></a>
+<span class="sourceLineNo">5636</span><a name="line.5636"></a>
+<span class="sourceLineNo">5637</span>    // create a file in fam1 for the region before opening in OpenRegionHandler<a name="line.5637"></a>
+<span class="sourceLineNo">5638</span>    region.put(new Put(Bytes.toBytes("a")).addColumn(fam1, fam1, fam1));<a name="line.5638"></a>
+<span class="sourceLineNo">5639</span>    region.flush(true);<a name="line.5639"></a>
+<span class="sourceLineNo">5640</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.5640"></a>
+<span class="sourceLineNo">5641</span><a name="line.5641"></a>
+<span class="sourceLineNo">5642</span>    ArgumentCaptor&lt;WALEdit&gt; editCaptor = ArgumentCaptor.forClass(WALEdit.class);<a name="line.5642"></a>
 <span class="sourceLineNo">5643</span><a name="line.5643"></a>
-<span class="sourceLineNo">5644</span>    WALEdit edit = editCaptor.getValue();<a name="line.5644"></a>
-<span class="sourceLineNo">5645</span>    assertNotNull(edit);<a name="line.5645"></a>
-<span class="sourceLineNo">5646</span>    assertNotNull(edit.getCells());<a name="line.5646"></a>
-<span class="sourceLineNo">5647</span>    assertEquals(1, edit.getCells().size());<a name="line.5647"></a>
-<span class="sourceLineNo">5648</span>    RegionEventDescriptor desc = WALEdit.getRegionEventDescriptor(edit.getCells().get(0));<a name="line.5648"></a>
-<span class="sourceLineNo">5649</span>    assertNotNull(desc);<a name="line.5649"></a>
+<span class="sourceLineNo">5644</span>    // capture append() calls<a name="line.5644"></a>
+<span class="sourceLineNo">5645</span>    WAL wal = mockWAL();<a name="line.5645"></a>
+<span class="sourceLineNo">5646</span>    when(rss.getWAL((HRegionInfo) any())).thenReturn(wal);<a name="line.5646"></a>
+<span class="sourceLineNo">5647</span><a name="line.5647"></a>
+<span class="sourceLineNo">5648</span>    region = HRegion.openHRegion(hri, htd, rss.getWAL(hri),<a name="line.5648"></a>
+<span class="sourceLineNo">5649</span>      TEST_UTIL.getConfiguration(), rss, null);<a name="line.5649"></a>
 <span class="sourceLineNo">5650</span><a name="line.5650"></a>
-<span class="sourceLineNo">5651</span>    LOG.info("RegionEventDescriptor from WAL: " + desc);<a name="line.5651"></a>
-<span class="sourceLineNo">5652</span><a name="line.5652"></a>
-<span class="sourceLineNo">5653</span>    assertEquals(RegionEventDescriptor.EventType.REGION_OPEN, desc.getEventType());<a name="line.5653"></a>
-<span class="sourceLineNo">5654</span>    assertTrue(Bytes.equals(desc.getTableName().toByteArray(), htd.getTableName().toBytes()));<a name="line.5654"></a>
-<span class="sourceLineNo">5655</span>    assertTrue(Bytes.equals(desc.getEncodedRegionName().toByteArray(),<a name="line.5655"></a>
-<span class="sourceLineNo">5656</span>      hri.getEncodedNameAsBytes()));<a name="line.5656"></a>
-<span class="sourceLineNo">5657</span>    assertTrue(desc.getLogSequenceNumber() &gt; 0);<a name="line.5657"></a>
-<span class="sourceLineNo">5658</span>    assertEquals(serverName, ProtobufUtil.toServerName(desc.getServer()));<a name="line.5658"></a>
-<span class="sourceLineNo">5659</span>    assertEquals(2, desc.getStoresCount());<a name="line.5659"></a>
+<span class="sourceLineNo">5651</span>    verify(wal, times(1)).append((HRegionInfo)any(), (WALKeyImpl)any()<a name="line.5651"></a>
+<span class="sourceLineNo">5652</span>      , editCaptor.capture(), anyBoolean());<a name="line.5652"></a>
+<span class="sourceLineNo">5653</span><a name="line.5653"></a>
+<span class="sourceLineNo">5654</span>    WALEdit edit = editCaptor.getValue();<a name="line.5654"></a>
+<span class="sourceLineNo">5655</span>    assertNotNull(edit);<a name="line.5655"></a>
+<span class="sourceLineNo">5656</span>    assertNotNull(edit.getCells());<a name="line.5656"></a>
+<span class="sourceLineNo">5657</span>    assertEquals(1, edit.getCells().size());<a name="line.5657"></a>
+<span class="sourceLineNo">5658</span>    RegionEventDescriptor desc = WALEdit.getRegionEventDescriptor(edit.getCells().get(0));<a name="line.5658"></a>
+<span class="sourceLineNo">5659</span>    assertNotNull(desc);<a name="line.5659"></a>
 <span class="sourceLineNo">5660</span><a name="line.5660"></a>
-<span class="sourceLineNo">5661</span>    StoreDescriptor store = desc.getStores(0);<a name="line.5661"></a>
-<span class="sourceLineNo">5662</span>    assertTrue(Bytes.equals(store.getFamilyName().toByteArray(), fam1));<a name="line.5662"></a>
-<span class="sourceLineNo">5663</span>    assertEquals(store.getStoreHomeDir(), Bytes.toString(fam1));<a name="line.5663"></a>
-<span class="sourceLineNo">5664</span>    assertEquals(1, store.getStoreFileCount()); // 1store file<a name="line.5664"></a>
-<span class="sourceLineNo">5665</span>    assertFalse(store.getStoreFile(0).contains("/")); // ensure path is relative<a name="line.5665"></a>
-<span class="sourceLineNo">5666</span><a name="line.5666"></a>
-<span class="sourceLineNo">5667</span>    store = desc.getStores(1);<a name="line.5667"></a>
-<span class="sourceLineNo">5668</span>    assertTrue(Bytes.equals(store.getFamilyName().toByteArray(), fam2));<a name="line.5668"></a>
-<span class="sourceLineNo">5669</span>    assertEquals(store.getStoreHomeDir(), Bytes.toString(fam2));<a name="line.5669"></a>
-<span class="sourceLineNo">5670</span>    assertEquals(0, store.getStoreFileCount()); // no store files<a name="line.5670"></a>
-<span class="sourceLineNo">5671</span>  }<a name="line.5671"></a>
-<span class="sourceLineNo">5672</span><a name="line.5672"></a>
-<span class="sourceLineNo">5673</span>  // Helper for test testOpenRegionWrittenToWALForLogReplay<a name="line.5673"></a>
-<span class="sourceLineNo">5674</span>  static class HRegionWithSeqId extends HRegion {<a name="line.5674"></a>
-<span class="sourceLineNo">5675</span>    public HRegionWithSeqId(final Path tableDir, final WAL wal, final FileSystem fs,<a name="line.5675"></a>
-<span class="sourceLineNo">5676</span>        final Configuration confParam, final RegionInfo regionInfo,<a name="line.5676"></a>
-<span class="sourceLineNo">5677</span>        final TableDescriptor htd, final RegionServerServices rsServices) {<a name="line.5677"></a>
-<span class="sourceLineNo">5678</span>      super(tableDir, wal, fs, confParam, regionInfo, htd, rsServices);<a name="line.5678"></a>
-<span class="sourceLineNo">5679</span>    }<a name="line.5679"></a>
-<span class="sourceLineNo">5680</span>    @Override<a name="line.5680"></a>
-<span class="sourceLineNo">5681</span>    protected long getNextSequenceId(WAL wal) throws IOException {<a name="line.5681"></a>
-<span class="sourceLineNo">5682</span>      return 42;<a name="line.5682"></a>
-<span class="sourceLineNo">5683</span>    }<a name="line.5683"></a>
-<span class="sourceLineNo">5684</span>  }<a name="line.5684"></a>
-<span class="sourceLineNo">5685</span><a name="line.5685"></a>
-<span class="sourceLineNo">5686</span>  @Test<a name="line.5686"></a>
-<span class="sourceLineNo">5687</span>  public void testFlushedFileWithNoTags() throws Exception {<a name="line.5687"></a>
-<span class="sourceLineNo">5688</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.5688"></a>
-<span class="sourceLineNo">5689</span>    HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.5689"></a>
-<span class="sourceLineNo">5690</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.5690"></a>
-<span class="sourceLineNo">5691</span>    HRegionInfo info = new HRegionInfo(tableName, null, null, false);<a name="line.5691"></a>
-<span class="sourceLineNo">5692</span>    Path path = TEST_UTIL.getDataTestDir(getClass().getSimpleName());<a name="line.5692"></a>
-<span class="sourceLineNo">5693</span>    region = HBaseTestingUtility.createRegionAndWAL(info, path, TEST_UTIL.getConfiguration(), htd);<a name="line.5693"></a>
-<span class="sourceLineNo">5694</span>    Put put = new Put(Bytes.toBytes("a-b-0-0"));<a name="line.5694"></a>
-<span class="sourceLineNo">5695</span>    put.addColumn(fam1, qual1, Bytes.toBytes("c1-value"));<a name="line.5695"></a>
-<span class="sourceLineNo">5696</span>    region.put(put);<a name="line.5696"></a>
-<span class="sourceLineNo">5697</span>    region.flush(true);<a name="line.5697"></a>
-<span class="sourceLineNo">5698</span>    HStore store = region.getStore(fam1);<a name="line.5698"></a>
-<span class="sourceLineNo">5699</span>    Collection&lt;HStoreFile&gt; storefiles = store.getStorefiles();<a name="line.5699"></a>
-<span class="sourceLineNo">5700</span>    for (HStoreFile sf : storefiles) {<a name="line.5700"></a>
-<span class="sourceLineNo">5701</span>      assertFalse("Tags should not be present "<a name="line.5701"></a>
-<span class="sourceLineNo">5702</span>          ,sf.getReader().getHFileReader().getFileContext().isIncludesTags());<a name="line.5702"></a>
-<span class="sourceLineNo">5703</span>    }<a name="line.5703"></a>
-<span class="sourceLineNo">5704</span>  }<a name="line.5704"></a>
-<span class="sourceLineNo">5705</span><a name="line.5705"></a>
-<span class="sourceLineNo">5706</span>  /**<a name="line.5706"></a>
-<span class="sourceLineNo">5707</span>   * Utility method to setup a WAL mock.<a name="line.5707"></a>
-<span class="sourceLineNo">5708</span>   * Needs to do the bit where we close latch on the WALKeyImpl on append else test hangs.<a name="line.5708"></a>
-<span class="sourceLineNo">5709</span>   * @return a mock WAL<a name="line.5709"></a>
-<span class="sourceLineNo">5710</span>   * @throws IOException<a name="line.5710"></a>
-<span class="sourceLineNo">5711</span>   */<a name="line.5711"></a>
-<span class="sourceLineNo">5712</span>  private WAL mockWAL() throws IOException {<a name="line.5712"></a>
-<span class="sourceLineNo">5713</span>    WAL wal = mock(WAL.class);<a name="line.5713"></a>
-<span class="sourceLineNo">5714</span>    Mockito.when(wal.append((HRegionInfo)Mockito.any(),<a name="line.5714"></a>
-<span class="sourceLineNo">5715</span>        (WALKeyImpl)Mockito.any(), (WALEdit)Mockito.any(), Mockito.anyBoolean())).<a name="line.5715"></a>
-<span class="sourceLineNo">5716</span>      thenAnswer(new Answer&lt;Long&gt;() {<a name="line.5716"></a>
-<span class="sourceLineNo">5717</span>        @Override<a name="line.5717"></a>
-<span class="sourceLineNo">5718</span>        public Long answer(InvocationOnMock invocation) throws Throwable {<a name="line.5718"></a>
-<span class="sourceLineNo">5719</span>          WALKeyImpl key = invocation.getArgument(1);<a name="line.5719"></a>
-<span class="sourceLineNo">5720</span>          MultiVersionConcurrencyControl.WriteEntry we = key.getMvcc().begin();<a name="line.5720"></a>
-<span class="sourceLineNo">5721</span>          key.setWriteEntry(we);<a name="line.5721"></a>
-<span class="sourceLineNo">5722</span>          return 1L;<a name="line.5722"></a>
-<span class="sourceLineNo">5723</span>        }<a name="line.5723"></a>
-<span class="sourceLineNo">5724</span><a name="line.5724"></a>
-<span class="sourceLineNo">5725</span>    });<a name="line.5725"></a>
-<span class="sourceLineNo">5726</span>    return wal;<a name="line.5726"></a>
-<span class="sourceLineNo">5727</span>  }<a name="line.5727"></a>
-<span class="sourceLineNo">5728</span><a name="line.5728"></a>
-<span class="sourceLineNo">5729</span>  @Test<a name="line.5729"></a>
-<span class="sourceLineNo">5730</span>  public void testCloseRegionWrittenToWAL() throws Exception {<a name="line.5730"></a>
-<span class="sourceLineNo">5731</span><a name="line.5731"></a>
-<span class="sourceLineNo">5732</span>    Path rootDir = new Path(dir + name.getMethodName());<a name="line.5732"></a>
-<span class="sourceLineNo">5733</span>    FSUtils.setRootDir(TEST_UTIL.getConfiguration(), rootDir);<a name="line.5733"></a>
+<span class="sourceLineNo">5661</span>    LOG.info("RegionEventDescriptor from WAL: " + desc);<a name="line.5661"></a>
+<span class="sourceLineNo">5662</span><a name="line.5662"></a>
+<span class="sourceLineNo">5663</span>    assertEquals(RegionEventDescriptor.EventType.REGION_OPEN, desc.getEventType());<a name="line.5663"></a>
+<span class="sourceLineNo">5664</span>    assertTrue(Bytes.equals(desc.getTableName().toByteArray(), htd.getTableName().toBytes()));<a name="line.5664"></a>
+<span class="sourceLineNo">5665</span>    assertTrue(Bytes.equals(desc.getEncodedRegionName().toByteArray(),<a name="line.5665"></a>
+<span class="sourceLineNo">5666</span>      hri.getEncodedNameAsBytes()));<a name="line.5666"></a>
+<span class="sourceLineNo">5667</span>    assertTrue(desc.getLogSequenceNumber() &gt; 0);<a name="line.5667"></a>
+<span class="sourceLineNo">5668</span>    assertEquals(serverName, ProtobufUtil.toServerName(desc.getServer()));<a name="line.5668"></a>
+<span class="sourceLineNo">5669</span>    assertEquals(2, desc.getStoresCount());<a name="line.5669"></a>
+<span class="sourceLineNo">5670</span><a name="line.5670"></a>
+<span class="sourceLineNo">5671</span>    StoreDescriptor store = desc.getStores(0);<a name="line.5671"></a>
+<span class="sourceLineNo">5672</span>    assertTrue(Bytes.equals(store.getFamilyName().toByteArray(), fam1));<a name="line.5672"></a>
+<span class="sourceLineNo">5673</span>    assertEquals(store.getStoreHomeDir(), Bytes.toString(fam1));<a name="line.5673"></a>
+<span class="sourceLineNo">5674</span>    assertEquals(1, store.getStoreFileCount()); // 1store file<a name="line.5674"></a>
+<span class="sourceLineNo">5675</span>    assertFalse(store.getStoreFile(0).contains("/")); // ensure path is relative<a name="line.5675"></a>
+<span class="sourceLineNo">5676</span><a name="line.5676"></a>
+<span class="sourceLineNo">5677</span>    store = desc.getStores(1);<a name="line.5677"></a>
+<span class="sourceLineNo">5678</span>    assertTrue(Bytes.equals(store.getFamilyName().toByteArray(), fam2));<a name="line.5678"></a>
+<span class="sourceLineNo">5679</span>    assertEquals(store.getStoreHomeDir(), Bytes.toString(fam2));<a name="line.5679"></a>
+<span class="sourceLineNo">5680</span>    assertEquals(0, store.getStoreFileCount()); // no store files<a name="line.5680"></a>
+<span class="sourceLineNo">5681</span>  }<a name="line.5681"></a>
+<span class="sourceLineNo">5682</span><a name="line.5682"></a>
+<span class="sourceLineNo">5683</span>  // Helper for test testOpenRegionWrittenToWALForLogReplay<a name="line.5683"></a>
+<span class="sourceLineNo">5684</span>  static class HRegionWithSeqId extends HRegion {<a name="line.5684"></a>
+<span class="sourceLineNo">5685</span>    public HRegionWithSeqId(final Path tableDir, final WAL wal, final FileSystem fs,<a name="line.5685"></a>
+<span class="sourceLineNo">5686</span>        final Configuration confParam, final RegionInfo regionInfo,<a name="line.5686"></a>
+<span class="sourceLineNo">5687</span>        final TableDescriptor htd, final RegionServerServices rsServices) {<a name="line.5687"></a>
+<span class="sourceLineNo">5688</span>      super(tableDir, wal, fs, confParam, regionInfo, htd, rsServices);<a name="line.5688"></a>
+<span class="sourceLineNo">5689</span>    }<a name="line.5689"></a>
+<span class="sourceLineNo">5690</span>    @Override<a name="line.5690"></a>
+<span class="sourceLineNo">5691</span>    protected long getNextSequenceId(WAL wal) throws IOException {<a name="line.5691"></a>
+<span class="sourceLineNo">5692</span>      return 42;<a name="line.5692"></a>
+<span class="sourceLineNo">5693</span>    }<a name="line.5693"></a>
+<span class="sourceLineNo">5694</span>  }<a name="line.5694"></a>
+<span class="sourceLineNo">5695</span><a name="line.5695"></a>
+<span class="sourceLineNo">5696</span>  @Test<a name="line.5696"></a>
+<span class="sourceLineNo">5697</span>  public void testFlushedFileWithNoTags() throws Exception {<a name="line.5697"></a>
+<span class="sourceLineNo">5698</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.5698"></a>
+<span class="sourceLineNo">5699</span>    HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.5699"></a>
+<span class="sourceLineNo">5700</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.5700"></a>
+<span class="sourceLineNo">5701</span>    HRegionInfo info = new HRegionInfo(tableName, null, null, false);<a name="line.5701"></a>
+<span class="sourceLineNo">5702</span>    Path path = TEST_UTIL.getDataTestDir(getClass().getSimpleName());<a name="line.5702"></a>
+<span class="sourceLineNo">5703</span>    region = HBaseTestingUtility.createRegionAndWAL(info, path, TEST_UTIL.getConfiguration(), htd);<a name="line.5703"></a>
+<span class="sourceLineNo">5704</span>    Put put = new Put(Bytes.toBytes("a-b-0-0"));<a name="line.5704"></a>
+<span class="sourceLineNo">5705</span>    put.addColumn(fam1, qual1, Bytes.toBytes("c1-value"));<a name="line.5705"></a>
+<span class="sourceLineNo">5706</span>    region.put(put);<a name="line.5706"></a>
+<span class="sourceLineNo">5707</span>    region.flush(true);<a name="line.5707"></a>
+<span class="sourceLineNo">5708</span>    HStore store = region.getStore(fam1);<a name="line.5708"></a>
+<span class="sourceLineNo">5709</span>    Collection&lt;HStoreFile&gt; storefiles = store.getStorefiles();<a name="line.5709"></a>
+<span class="sourceLineNo">5710</span>    for (HStoreFile sf : storefiles) {<a name="line.5710"></a>
+<span class="sourceLineNo">5711</span>      assertFalse("Tags should not be present "<a name="line.5711"></a>
+<span class="sourceLineNo">5712</span>          ,sf.getReader().getHFileReader().getFileContext().isIncludesTags());<a name="line.5712"></a>
+<span class="sourceLineNo">5713</span>    }<a name="line.5713"></a>
+<span class="sourceLineNo">5714</span>  }<a name="line.5714"></a>
+<span class="sourceLineNo">5715</span><a name="line.5715"></a>
+<span class="sourceLineNo">5716</span>  /**<a name="line.5716"></a>
+<span class="sourceLineNo">5717</span>   * Utility method to setup a WAL mock.<a name="line.5717"></a>
+<span class="sourceLineNo">5718</span>   * Needs to do the bit where we close latch on the WALKeyImpl on append else test hangs.<a name="line.5718"></a>
+<span class="sourceLineNo">5719</span>   * @return a mock WAL<a name="line.5719"></a>
+<span class="sourceLineNo">5720</span>   * @throws IOException<a name="line.5720"></a>
+<span class="sourceLineNo">5721</span>   */<a name="line.5721"></a>
+<span class="sourceLineNo">5722</span>  private WAL mockWAL() throws IOException {<a name="line.5722"></a>
+<span class="sourceLineNo">5723</span>    WAL wal = mock(WAL.class);<a name="line.5723"></a>
+<span class="sourceLineNo">5724</span>    Mockito.when(wal.append((HRegionInfo)Mockito.any(),<a name="line.5724"></a>
+<span class="sourceLineNo">5725</span>        (WALKeyImpl)Mockito.any(), (WALEdit)Mockito.any(), Mockito.anyBoolean())).<a name="line.5725"></a>
+<span class="sourceLineNo">5726</span>      thenAnswer(new Answer&lt;Long&gt;() {<a name="line.5726"></a>
+<span class="sourceLineNo">5727</span>        @Override<a name="line.5727"></a>
+<span class="sourceLineNo">5728</span>        public Long answer(InvocationOnMock invocation) throws Throwable {<a name="line.5728"></a>
+<span class="sourceLineNo">5729</span>          WALKeyImpl key = invocation.getArgument(1);<a name="line.5729"></a>
+<span class="sourceLineNo">5730</span>          MultiVersionConcurrencyControl.WriteEntry we = key.getMvcc().begin();<a name="line.5730"></a>
+<span class="sourceLineNo">5731</span>          key.setWriteEntry(we);<a name="line.5731"></a>
+<span class="sourceLineNo">5732</span>          return 1L;<a name="line.5732"></a>
+<span class="sourceLineNo">5733</span>        }<a name="line.5733"></a>
 <span class="sourceLineNo">5734</span><a name="line.5734"></a>
-<span class="sourceLineNo">5735</span>    final ServerName serverName = ServerName.valueOf("testCloseRegionWrittenToWAL", 100, 42);<a name="line.5735"></a>
-<span class="sourceLineNo">5736</span>    final RegionServerServices rss = spy(TEST_UTIL.createMockRegionServerService(serverName));<a name="line.5736"></a>
-<span class="sourceLineNo">5737</span><a name="line.5737"></a>
-<span class="sourceLineNo">5738</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.5738"></a>
-<span class="sourceLineNo">5739</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.5739"></a>
-<span class="sourceLineNo">5740</span>    htd.addFamily(new HColumnDescriptor(fam2));<a name="line.5740"></a>
+<span class="sourceLineNo">5735</span>    });<a name="line.5735"></a>
+<span class="sourceLineNo">5736</span>    return wal;<a name="line.5736"></a>
+<span class="sourceLineNo">5737</span>  }<a name="line.5737"></a>
+<span class="sourceLineNo">5738</span><a name="line.5738"></a>
+<span class="sourceLineNo">5739</span>  @Test<a name="line.5739"></a>
+<span class="sourceLineNo">5740</span>  public void testCloseRegionWrittenToWAL() throws Exception {<a name="line.5740"></a>
 <span class="sourceLineNo">5741</span><a name="line.5741"></a>
-<span class="sourceLineNo">5742</span>    final HRegionInfo hri = new HRegionInfo(htd.getTableName(),<a name="line.5742"></a>
-<span class="sourceLineNo">5743</span>      HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY);<a name="line.5743"></a>
+<span class="sourceLineNo">5742</span>    Path rootDir = new Path(dir + name.getMethodName());<a name="line.5742"></a>
+<span class="sourceLineNo">5743</span>    FSUtils.setRootDir(TEST_UTIL.getConfiguration(), rootDir);<a name="line.5743"></a>
 <span class="sourceLineNo">5744</span><a name="line.5744"></a>
-<span class="sourceLineNo">5745</span>    ArgumentCaptor&lt;WALEdit&gt; editCaptor = ArgumentCaptor.forClass(WALEdit.class);<a name="line.5745"></a>
-<span class="sourceLineNo">5746</span><a name="line.5746"></a>
-<span class="sourceLineNo">5747</span>    // capture append() calls<a name="line.5747"></a>
-<span class="sourceLineNo">5748</span>    WAL wal = mockWAL();<a name="line.5748"></a>
-<span class="sourceLineNo">5749</span>    when(rss.getWAL((HRegionInfo) any())).thenReturn(wal);<a name="line.5749"></a>
-<span class="sourceLineNo">5750</span><a name="line.5750"></a>
+<span class="sourceLineNo">5745</span>    final ServerName serverName = ServerName.valueOf("testCloseRegionWrittenToWAL", 100, 42);<a name="line.5745"></a>
+<span class="sourceLineNo">5746</span>    final RegionServerServices rss = spy(TEST_UTIL.createMockRegionServerService(serverName));<a name="line.5746"></a>
+<span class="sourceLineNo">5747</span><a name="line.5747"></a>
+<span class="sourceLineNo">5748</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.5748"></a>
+<span class="sourceLineNo">5749</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.5749"></a>
+<span class="sourceLineNo">5750</span>    htd.addFamily(new HColumnDescriptor(fam2));<a name="line.5750"></a>
 <span class="sourceLineNo">5751</span><a name="line.5751"></a>
-<span class="sourceLineNo">5752</span>    // create and then open a region first so that it can be closed later<a name="line.5752"></a>
-<span class="sourceLineNo">5753</span>    region = HRegion.createHRegion(hri, rootDir, TEST_UTIL.getConfiguration(), htd, rss.getWAL(hri));<a name="line.5753"></a>
-<span class="sourceLineNo">5754</span>    region = HRegion.openHRegion(hri, htd, rss.getWAL(hri),<a name="line.5754"></a>
-<span class="sourceLineNo">5755</span>      TEST_UTIL.getConfiguration(), rss, null);<a name="line.5755"></a>
+<span class="sourceLineNo">5752</span>    final HRegionInfo hri = new HRegionInfo(htd.getTableName(),<a name="line.5752"></a>
+<span class="sourceLineNo">5753</span>      HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY);<a name="line.5753"></a>
+<span class="sourceLineNo">5754</span><a name="line.5754"></a>
+<span class="sourceLineNo">5755</span>    ArgumentCaptor&lt;WALEdit&gt; editCaptor = ArgumentCaptor.forClass(WALEdit.class);<a name="line.5755"></a>
 <span class="sourceLineNo">5756</span><a name="line.5756"></a>
-<span class="sourceLineNo">5757</span>    // close the region<a name="line.5757"></a>
-<span class="sourceLineNo">5758</span>    region.close(false);<a name="line.5758"></a>
-<span class="sourceLineNo">5759</span><a name="line.5759"></a>
-<span class="sourceLineNo">5760</span>    // 2 times, one for region open, the other close region<a name="line.5760"></a>
-<span class="sourceLineNo">5761</span>    verify(wal, times(2)).append((HRegionInfo)any(), (WALKeyImpl)any(),<a name="line.5761"></a>
-<span class="sourceLineNo">5762</span>      editCaptor.capture(), anyBoolean());<a name="line.5762"></a>
-<span class="sourceLineNo">5763</span><a name="line.5763"></a>
-<span class="sourceLineNo">5764</span>    WALEdit edit = editCaptor.getAllValues().get(1);<a name="line.5764"></a>
-<span class="sourceLineNo">5765</span>    assertNotNull(edit);<a name="line.5765"></a>
-<span class="sourceLineNo">5766</span>    assertNotNull(edit.getCells());<a name="line.5766"></a>
-<span class="sourceLineNo">5767</span>    assertEquals(1, edit.getCells().size());<a name="line.5767"></a>
-<span class="sourceLineNo">5768</span>    RegionEventDescriptor desc = WALEdit.getRegionEventDescriptor(edit.getCells().get(0));<a name="line.5768"></a>
-<span class="sourceLineNo">5769</span>    assertNotNull(desc);<a name="line.5769"></a>
-<span class="sourceLineNo">5770</span><a name="line.5770"></a>
-<span class="sourceLineNo">5771</span>    LOG.info("RegionEventDescriptor from WAL: " + desc);<a name="line.5771"></a>
-<span class="sourceLineNo">5772</span><a name="line.5772"></a>
-<span class="sourceLineNo">5773</span>    assertEquals(RegionEventDescriptor.EventType.REGION_CLOSE, desc.getEventType());<a name="line.5773"></a>
-<span class="sourceLineNo">5774</span>    assertTrue(Bytes.equals(desc.getTableName().toByteArray(), htd.getTableName().toBytes()));<a name="line.5774"></a>
-<span class="sourceLineNo">5775</span>    assertTrue(Bytes.equals(desc.getEncodedRegionName().toByteArray(),<a name="line.5775"></a>
-<span class="sourceLineNo">5776</span>      hri.getEncodedNameAsBytes()));<a name="line.5776"></a>
-<span class="sourceLineNo">5777</span>    assertTrue(desc.getLogSequenceNumber() &gt; 0);<a name="line.5777"></a>
-<span class="sourceLineNo">5778</span>    assertEquals(serverName, ProtobufUtil.toServerName(desc.getServer()));<a name="line.5778"></a>
-<span class="sourceLineNo">5779</span>    assertEquals(2, desc.getStoresCount());<a name="line.5779"></a>
+<span class="sourceLineNo">5757</span>    // capture append() calls<a name="line.5757"></a>
+<span class="sourceLineNo">5758</span>    WAL wal = mockWAL();<a name="line.5758"></a>
+<span class="sourceLineNo">5759</span>    when(rss.getWAL((HRegionInfo) any())).thenReturn(wal);<a name="line.5759"></a>
+<span class="sourceLineNo">5760</span><a name="line.5760"></a>
+<span class="sourceLineNo">5761</span><a name="line.5761"></a>
+<span class="sourceLineNo">5762</span>    // create and then open a region first so that it can be closed later<a name="line.5762"></a>
+<span class="sourceLineNo">5763</span>    region = HRegion.createHRegion(hri, rootDir, TEST_UTIL.getConfiguration(), htd, rss.getWAL(hri));<a name="line.5763"></a>
+<span class="sourceLineNo">5764</span>    region = HRegion.openHRegion(hri, htd, rss.getWAL(hri),<a name="line.5764"></a>
+<span class="sourceLineNo">5765</span>      TEST_UTIL.getConfiguration(), rss, null);<a name="line.5765"></a>
+<span class="sourceLineNo">5766</span><a name="line.5766"></a>
+<span class="sourceLineNo">5767</span>    // close the region<a name="line.5767"></a>
+<span class="sourceLineNo">5768</span>    region.close(false);<a name="line.5768"></a>
+<span class="sourceLineNo">5769</span><a name="line.5769"></a>
+<span class="sourceLineNo">5770</span>    // 2 times, one for region open, the other close region<a name="line.5770"></a>
+<span class="sourceLineNo">5771</span>    verify(wal, times(2)).append((HRegionInfo)any(), (WALKeyImpl)any(),<a name="line.5771"></a>
+<span class="sourceLineNo">5772</span>      editCaptor.capture(), anyBoolean());<a name="line.5772"></a>
+<span class="sourceLineNo">5773</span><a name="line.5773"></a>
+<span class="sourceLineNo">5774</span>    WALEdit edit = editCaptor.getAllValues().get(1);<a name="line.5774"></a>
+<span class="sourceLineNo">5775</span>    assertNotNull(edit);<a name="line.5775"></a>
+<span class="sourceLineNo">5776</span>    assertNotNull(edit.getCells());<a name="line.5776"></a>
+<span class="sourceLineNo">5777</span>    assertEquals(1, edit.getCells().size());<a name="line.5777"></a>
+<span class="sourceLineNo">5778</span>    RegionEventDescriptor desc = WALEdit.getRegionEventDescriptor(edit.getCells().get(0));<a name="line.5778"></a>
+<span class="sourceLineNo">5779</span>    assertNotNull(desc);<a name="line.5779"></a>
 <span class="sourceLineNo">5780</span><a name="line.5780"></a>
-<span class="sourceLineNo">5781</span>    StoreDescriptor store = desc.getStores(0);<a name="line.5781"></a>
-<span class="sourceLineNo">5782</span>    assertTrue(Bytes.equals(store.getFamilyName().toByteArray(), fam1));<a name="line.5782"></a>
-<span class="sourceLineNo">5783</span>    assertEquals(store.getStoreHomeDir(), Bytes.toString(fam1));<a name="line.5783"></a>
-<span class="sourceLineNo">5784</span>    assertEquals(0, store.getStoreFileCount()); // no store files<a name="line.5784"></a>
-<span class="sourceLineNo">5785</span><a name="line.5785"></a>
-<span class="sourceLineNo">5786</span>    store = desc.getStores(1);<a name="line.5786"></a>
-<span class="sourceLineNo">5787</span>    assertTrue(Bytes.equals(store.getFamilyName().toByteArray(), fam2));<a name="line.5787"></a>
-<span class="sourceLineNo">5788</span>    assertEquals(store.getStoreHomeDir(), Bytes.toString(fam2));<a name="line.5788"></a>
-<span class="sourceLineNo">5789</span>    assertEquals(0, store.getStoreFileCount()); // no store files<a name="line.5789"></a>
-<span class="sourceLineNo">5790</span>  }<a name="line.5790"></a>
-<span class="sourceLineNo">5791</span><a name="line.5791"></a>
-<span class="sourceLineNo">5792</span>  /**<a name="line.5792"></a>
-<span class="sourceLineNo">5793</span>   * Test RegionTooBusyException thrown when region is busy<a name="line.5793"></a>
-<span class="sourceLineNo">5794</span>   */<a name="line.5794"></a>
-<span class="sourceLineNo">5795</span>  @Test<a name="line.5795"></a>
-<span class="sourceLineNo">5796</span>  public void testRegionTooBusy() throws IOException {<a name="line.5796"></a>
-<span class="sourceLineNo">5797</span>    byte[] family = Bytes.toBytes("family");<a name="line.5797"></a>
-<span class="sourceLineNo">5798</span>    long defaultBusyWaitDuration = CONF.getLong("hbase.busy.wait.duration",<a name="line.5798"></a>
-<span class="sourceLineNo">5799</span>      HRegion.DEFAULT_BUSY_WAIT_DURATION);<a name="line.5799"></a>
-<span class="sourceLineNo">5800</span>    CONF.setLong("hbase.busy.wait.duration", 1000);<a name="line.5800"></a>
-<span class="sourceLineNo">5801</span>    region = initHRegion(tableName, method, CONF, family);<a name="line.5801"></a>
-<span class="sourceLineNo">5802</span>    final AtomicBoolean stopped = new AtomicBoolean(true);<a name="line.5802"></a>
-<span class="sourceLineNo">5803</span>    Thread t = new Thread(new Runnable() {<a name="line.5803"></a>
-<span class="sourceLineNo">5804</span>      @Override<a name="line.5804"></a>
-<span class="sourceLineNo">5805</span>      public void run() {<a name="line.5805"></a>
-<span class="sourceLineNo">5806</span>        try {<a name="line.5806"></a>
-<span class="sourceLineNo">5807</span>          region.lock.writeLock().lock();<a name="line.5807"></a>
-<span class="sourceLineNo">5808</span>          stopped.set(false);<a name="line.5808"></a>
-<span class="sourceLineNo">5809</span>          while (!stopped.get()) {<a name="line.5809"></a>
-<span class="sourceLineNo">5810</span>            Thread.sleep(100);<a name="line.5810"></a>
-<span class="sourceLineNo">5811</span>          }<a name="line.5811"></a>
-<span class="sourceLineNo">5812</span>        } catch (InterruptedException ie) {<a name="line.5812"></a>
-<span class="sourceLineNo">5813</span>        } finally {<a name="line.5813"></a>
-<span class="sourceLineNo">5814</span>          region.lock.writeLock().unlock();<a name="line.5814"></a>
-<span class="sourceLineNo">5815</span>        }<a name="line.5815"></a>
-<span class="sourceLineNo">5816</span>      }<a name="line.5816"></a>
-<span class="sourceLineNo">5817</span>    });<a name="line.5817"></a>
-<span class="sourceLineNo">5818</span>    t.start();<a name="line.5818"></a>
-<span class="sourceLineNo">5819</span>    Get get = new Get(row);<a name="line.5819"></a>
-<span class="sourceLineNo">5820</span>    try {<a name="line.5820"></a>
-<span class="sourceLineNo">5821</span>      while (stopped.get()) {<a name="line.5821"></a>
-<span class="sourceLineNo">5822</span>        Thread.sleep(100);<a name="line.5822"></a>
-<span class="sourceLineNo">5823</span>      }<a name="line.5823"></a>
-<span class="sourceLineNo">5824</span>      region.get(get);<a name="line.5824"></a>
-<span class="sourceLineNo">5825</span>      fail("Should throw RegionTooBusyException");<a name="line.5825"></a>
-<span class="sourceLineNo">5826</span>    } catch (InterruptedException ie) {<a name="line.5826"></a>
-<span class="sourceLineNo">5827</span>      fail("test interrupted");<a name="line.5827"></a>
-<span class="sourceLineNo">5828</span>    } catch (RegionTooBusyException e) {<a name="line.5828"></a>
-<span class="sourceLineNo">5829</span>      // Good, expected<a name="line.5829"></a>
-<span class="sourceLineNo">5830</span>    } finally {<a name="line.5830"></a>
-<span class="sourceLineNo">5831</span>      stopped.set(true);<a name="line.5831"></a>
-<span class="sourceLineNo">5832</span>      try {<a name="line.5832"></a>
-<span class="sourceLineNo">5833</span>        t.join();<a name="line.5833"></a>
-<span class="sourceLineNo">5834</span>      } catch (Throwable e) {<a name="line.5834"></a>
-<span class="sourceLineNo">5835</span>      }<a name="line.5835"></a>
-<span class="sourceLineNo">5836</span><a name="line.5836"></a>
-<span class="sourceLineNo">5837</span>      HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.5837"></a>
-<span class="sourceLineNo">5838</span>      region = null;<a name="line.5838"></a>
-<span class="sourceLineNo">5839</span>      CONF.setLong("hbase.busy.wait.duration", defaultBusyWaitDuration);<a name="line.5839"></a>
-<span class="sourceLineNo">5840</span>    }<a name="line.5840"></a>
-<span class="sourceLineNo">5841</span>  }<a name="line.5841"></a>
-<span class="sourceLineNo">5842</span><a name="line.5842"></a>
-<span class="sourceLineNo">5843</span>  @Test<a name="line.5843"></a>
-<span class="sourceLineNo">5844</span>  public void testCellTTLs() throws IOException {<a name="line.5844"></a>
-<span class="sourceLineNo">5845</span>    IncrementingEnvironmentEdge edge = new IncrementingEnvironmentEdge();<a name="line.5845"></a>
-<span class="sourceLineNo">5846</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.5846"></a>
-<span class="sourceLineNo">5847</span><a name="line.5847"></a>
-<span class="sourceLineNo">5848</span>    final byte[] row = Bytes.toBytes("testRow");<a name="line.5848"></a>
-<span class="sourceLineNo">5849</span>    final byte[] q1 = Bytes.toBytes("q1");<a name="line.5849"></a>
-<span class="sourceLineNo">5850</span>    final byte[] q2 = Bytes.toBytes("q2");<a name="line.5850"></a>
-<span class="sourceLineNo">5851</span>    final byte[] q3 = Bytes.toBytes("q3");<a name="line.5851"></a>
-<span class="sourceLineNo">5852</span>    final byte[] q4 = Bytes.toBytes("q4");<a name="line.5852"></a>
-<span class="sourceLineNo">5853</span><a name="line.5853"></a>
-<span class="sourceLineNo">5854</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.5854"></a>
-<span class="sourceLineNo">5855</span>    HColumnDescriptor hcd = new HColumnDescriptor(fam1);<a name="line.5855"></a>
-<span class="sourceLineNo">5856</span>    hcd.setTimeToLive(10); // 10 seconds<a name="line.5856"></a>
-<span class="sourceLineNo">5857</span>    htd.addFamily(hcd);<a name="line.5857"></a>
-<span class="sourceLineNo">5858</span><a name="line.5858"></a>
-<span class="sourceLineNo">5859</span>    Configuration conf = new Configuration(TEST_UTIL.getConfiguration());<a name="line.5859"></a>
-<span class="sourceLineNo">5860</span>    conf.setInt(HFile.FORMAT_VERSION_KEY, HFile.MIN_FORMAT_VERSION_WITH_TAGS);<a name="line.5860"></a>
-<span class="sourceLineNo">5861</span><a name="line.5861"></a>
-<span class="sourceLineNo">5862</span>    region = HBaseTestingUtility.createRegionAndWAL(new HRegionInfo(htd.getTableName(),<a name="line.5862"></a>
-<span class="sourceLineNo">5863</span>            HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY),<a name="line.5863"></a>
-<span class="sourceLineNo">5864</span>        TEST_UTIL.getDataTestDir(), conf, htd);<a name="line.5864"></a>
-<span class="sourceLineNo">5865</span>    assertNotNull(region);<a name="line.5865"></a>
-<span class="sourceLineNo">5866</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.5866"></a>
-<span class="sourceLineNo">5867</span>    // Add a cell that will expire in 5 seconds via cell TTL<a name="line.5867"></a>
-<span class="sourceLineNo">5868</span>    region.put(new Put(row).add(new KeyValue(row, fam1, q1, now,<a name="line.5868"></a>
-<span class="sourceLineNo">5869</span>      HConstants.EMPTY_BYTE_ARRAY, new ArrayBackedTag[] {<a name="line.5869"></a>
-<span class="sourceLineNo">5870</span>        // TTL tags specify ts in milliseconds<a name="line.5870"></a>
-<span class="sourceLineNo">5871</span>        new ArrayBackedTag(TagType.TTL_TAG_TYPE, Bytes.toBytes(5000L)) })));<a name="line.5871"></a>
-<span class="sourceLineNo">5872</span>    // Add a cell that will expire after 10 seconds via family setting<a name="line.5872"></a>
-<span class="sourceLineNo">5873</span>    region.put(new Put(row).addColumn(fam1, q2, now, HConstants.EMPTY_BYTE_ARRAY));<a name="line.5873"></a>
-<span class="sourceLineNo">5874</span>    // Add a cell that will expire in 15 seconds via cell TTL<a name="line.5874"></a>
-<span class="sourceLineNo">5875</span>    region.put(new Put(row).add(new KeyValue(row, fam1, q3, now + 10000 - 1,<a name="line.5875"></a>
-<span class="sourceLineNo">5876</span>      HConstants.EMPTY_BYTE_ARRAY, new ArrayBackedTag[] {<a name="line.5876"></a>
-<span class="sourceLineNo">5877</span>        // TTL tags specify ts in milliseconds<a name="line.5877"></a>
-<span class="sourceLineNo">5878</span>        new ArrayBackedTag(TagType.TTL_TAG_TYPE, Bytes.toBytes(5000L)) })));<a name="line.5878"></a>
-<span class="sourceLineNo">5879</span>    // Add a cell that will expire in 20 seconds via family setting<a name="line.5879"></a>
-<span class="sourceLineNo">5880</span>    region.put(new Put(row).addColumn(fam1, q4, now + 10000 - 1, HConstants.EMPTY_BYTE_ARRAY));<a name="line.5880"></a>
-<span class="sourceLineNo">5881</span><a name="line.5881"></a>
-<span class="sourceLineNo">5882</span>    // Flush so we are sure store scanning gets this right<a name="line.5882"></a>
-<span class="sourceLineNo">5883</span>    region.flush(true);<a name="line.5883"></a>
-<span class="sourceLineNo">5884</span><a name="line.5884"></a>
-<span class="sourceLineNo">5885</span>    // A query at time T+0 should return all cells<a name="line.5885"></a>
-<span class="sourceLineNo">5886</span>    Result r = region.get(new Get(row));<a name="line.5886"></a>
-<span class="sourceLineNo">5887</span>    assertNotNull(r.getValue(fam1, q1));<a name="line.5887"></a>
-<span class="sourceLineNo">5888</span>    assertNotNull(r.getValue(fam1, q2));<a name="line.5888"></a>
-<span class="sourceLineNo">5889</span>    assertNotNull(r.getValue(fam1, q3));<a name="line.5889"></a>
-<span class="sourceLineNo">5890</span>    assertNotNull(r.getValue(fam1, q4));<a name="line.5890"></a>
+<span class="sourceLineNo">5781</span>    LOG.info("RegionEventDescriptor from WAL: " + desc);<a name="line.5781"></a>
+<span class="sourceLineNo">5782</span><a name="line.5782"></a>
+<span class="sourceLineNo">5783</span>    assertEquals(RegionEventDescriptor.EventType.REGION_CLOSE, desc.getEventType());<a name="line.5783"></a>
+<span class="sourceLineNo">5784</span>    assertTrue(Bytes.equals(desc.getTableName().toByteArray(), htd.getTableName().toBytes()));<a name="line.5784"></a>
+<span class="sourceLineNo">5785</span>    assertTrue(Bytes.equals(desc.getEncodedRegionName().toByteArray(),<a name="line.5785"></a>
+<span class="sourceLineNo">5786</span>      hri.getEncodedNameAsBytes()));<a name="line.5786"></a>
+<span class="sourceLineNo">5787</span>    assertTrue(desc.getLogSequenceNumber() &gt; 0);<a name="line.5787"></a>
+<span class="sourceLineNo">5788</span>    assertEquals(serverName, ProtobufUtil.toServerName(desc.getServer()));<a name="line.5788"></a>
+<span class="sourceLineNo">5789</span>    assertEquals(2, desc.getStoresCount());<a name="line.5789"></a>
+<span class="sourceLineNo">5790</span><a name="line.5790"></a>
+<span class="sourceLineNo">5791</span>    StoreDescriptor store = desc.getStores(0);<a name="line.5791"></a>
+<span class="sourceLineNo">5792</span>    assertTrue(Bytes.equals(store.getFamilyName().toByteArray(), fam1));<a name="line.5792"></a>
+<span class="sourceLineNo">5793</span>    assertEquals(store.getStoreHomeDir(), Bytes.toString(fam1));<a name="line.5793"></a>
+<span class="sourceLineNo">5794</span>    assertEquals(0, store.getStoreFileCount()); // no store files<a name="line.5794"></a>
+<span class="sourceLineNo">5795</span><a name="line.5795"></a>
+<span class="sourceLineNo">5796</span>    store = desc.getStores(1);<a name="line.5796"></a>
+<span class="sourceLineNo">5797</span>    assertTrue(Bytes.equals(store.getFamilyName().toByteArray(), fam2));<a name="line.5797"></a>
+<span class="sourceLineNo">5798</span>    assertEquals(store.getStoreHomeDir(), Bytes.toString(fam2));<a name="line.5798"></a>
+<span class="sourceLineNo">5799</span>    assertEquals(0, store.getStoreFileCount()); // no store files<a name="line.5799"></a>
+<span class="sourceLineNo">5800</span>  }<a name="line.5800"></a>
+<span class="sourceLineNo">5801</span><a name="line.5801"></a>
+<span class="sourceLineNo">5802</span>  /**<a name="line.5802"></a>
+<span class="sourceLineNo">5803</span>   * Test RegionTooBusyException thrown when region is busy<a name="line.5803"></a>
+<span class="sourceLineNo">5804</span>   */<a name="line.5804"></a>
+<span class="sourceLineNo">5805</span>  @Test<a name="line.5805"></a>
+<span class="sourceLineNo">5806</span>  public void testRegionTooBusy() throws IOException {<a name="line.5806"></a>
+<span class="sourceLineNo">5807</span>    byte[] family = Bytes.toBytes("family");<a name="line.5807"></a>
+<span class="sourceLineNo">5808</span>    long defaultBusyWaitDuration = CONF.getLong("hbase.busy.wait.duration",<a name="line.5808"></a>
+<span class="sourceLineNo">5809</span>      HRegion.DEFAULT_BUSY_WAIT_DURATION);<a name="line.5809"></a>
+<span class="sourceLineNo">5810</span>    CONF.setLong("hbase.busy.wait.duration", 1000);<a name="line.5810"></a>
+<span class="sourceLineNo">5811</span>    region = initHRegion(tableName, method, CONF, family);<a name="line.5811"></a>
+<span class="sourceLineNo">5812</span>    final AtomicBoolean stopped = new AtomicBoolean(true);<a name="line.5812"></a>
+<span class="sourceLineNo">5813</span>    Thread t = new Thread(new Runnable() {<a name="line.5813"></a>
+<span class="sourceLineNo">5814</span>      @Override<a name="line.5814"></a>
+<span class="sourceLineNo">5815</span>      public void run() {<a name="line.5815"></a>
+<span class="sourceLineNo">5816</span>        try {<a name="line.5816"></a>
+<span class="sourceLineNo">5817</span>          region.lock.writeLock().lock();<a name="line.5817"></a>
+<span class="sourceLineNo">5818</span>          stopped.set(false);<a name="line.5818"></a>
+<span class="sourceLineNo">5819</span>          while (!stopped.get()) {<a name="line.5819"></a>
+<span class="sourceLineNo">5820</span>            Thread.sleep(100);<a name="line.5820"></a>
+<span class="sourceLineNo">5821</span>          }<a name="line.5821"></a>
+<span class="sourceLineNo">5822</span>        } catch (InterruptedException ie) {<a name="line.5822"></a>
+<span class="sourceLineNo">5823</span>        } finally {<a name="line.5823"></a>
+<span class="sourceLineNo">5824</span>          region.lock.writeLock().unlock();<a name="line.5824"></a>
+<span class="sourceLineNo">5825</span>        }<a name="line.5825"></a>
+<span class="sourceLineNo">5826</span>      }<a name="line.5826"></a>
+<span class="sourceLineNo">5827</span>    });<a name="line.5827"></a>
+<span class="sourceLineNo">5828</span>    t.start();<a name="line.5828"></a>
+<span class="sourceLineNo">5829</span>    Get get = new Get(row);<a name="line.5829"></a>
+<span class="sourceLineNo">5830</span>    try {<a name="line.5830"></a>
+<span class="sourceLineNo">5831</span>      while (stopped.get()) {<a name="line.5831"></a>
+<span class="sourceLineNo">5832</span>        Thread.sleep(100);<a name="line.5832"></a>
+<span class="sourceLineNo">5833</span>      }<a name="line.5833"></a>
+<span class="sourceLineNo">5834</span>      region.get(get);<a name="line.5834"></a>
+<span class="sourceLineNo">5835</span>      fail("Should throw RegionTooBusyException");<a name="line.5835"></a>
+<span class="sourceLineNo">5836</span>    } catch (InterruptedException ie) {<a name="line.5836"></a>
+<span class="sourceLineNo">5837</span>      fail("test interrupted");<a name="line.5837"></a>
+<span class="sourceLineNo">5838</span>    } catch (RegionTooBusyException e) {<a name="line.5838"></a>
+<span class="sourceLineNo">5839</span>      // Good, expected<a name="line.5839"></a>
+<span class="sourceLineNo">5840</span>    } finally {<a name="line.5840"></a>
+<span class="sourceLineNo">5841</span>      stopped.set(true);<a name="line.5841"></a>
+<span class="sourceLineNo">5842</span>      try {<a name="line.5842"></a>
+<span class="sourceLineNo">5843</span>        t.join();<a name="line.5843"></a>
+<span class="sourceLineNo">5844</span>      } catch (Throwable e) {<a name="line.5844"></a>
+<span class="sourceLineNo">5845</span>      }<a name="line.5845"></a>
+<span class="sourceLineNo">5846</span><a name="line.5846"></a>
+<span class="sourceLineNo">5847</span>      HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.5847"></a>
+<span class="sourceLineNo">5848</span>      region = null;<a name="line.5848"></a>
+<span class="sourceLineNo">5849</span>      CONF.setLong("hbase.busy.wait.duration", defaultBusyWaitDuration);<a name="line.5849"></a>
+<span class="sourceLineNo">5850</span>    }<a name="line.5850"></a>
+<span class="sourceLineNo">5851</span>  }<a name="line.5851"></a>
+<span class="sourceLineNo">5852</span><a name="line.5852"></a>
+<span class="sourceLineNo">5853</span>  @Test<a name="line.5853"></a>
+<span class="sourceLineNo">5854</span>  public void testCellTTLs() throws IOException {<a name="line.5854"></a>
+<span class="sourceLineNo">5855</span>    IncrementingEnvironmentEdge edge = new IncrementingEnvironmentEdge();<a name="line.5855"></a>
+<span class="sourceLineNo">5856</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.5856"></a>
+<span class="sourceLineNo">5857</span><a name="line.5857"></a>
+<span class="sourceLineNo">5858</span>    final byte[] row = Bytes.toBytes("testRow");<a name="line.5858"></a>
+<span class="sourceLineNo">5859</span>    final byte[] q1 = Bytes.toBytes("q1");<a name="line.5859"></a>
+<span class="sourceLineNo">5860</span>    final byte[] q2 = Bytes.toBytes("q2");<a name="line.5860"></a>
+<span class="sourceLineNo">5861</span>    final byte[] q3 = Bytes.toBytes("q3");<a name="line.5861"></a>
+<span class="sourceLineNo">5862</span>    final byte[] q4 = Bytes.toBytes("q4");<a name="line.5862"></a>
+<span class="sourceLineNo">5863</span><a name="line.5863"></a>
+<span class="sourceLineNo">5864</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.5864"></a>
+<span class="sourceLineNo">5865</span>    HColumnDescriptor hcd = new HColumnDescriptor(fam1);<a name="line.5865"></a>
+<span class="sourceLineNo">5866</span>    hcd.setTimeToLive(10); // 10 seconds<a name="line.5866"></a>
+<span class="sourceLineNo">5867</span>    htd.addFamily(hcd);<a name="line.5867"></a>
+<span class="sourceLineNo">5868</span><a name="line.5868"></a>
+<span class="sourceLineNo">5869</span>    Configuration conf = new Configuration(TEST_UTIL.getConfiguration());<a name="line.5869"></a>
+<span class="sourceLineNo">5870</span>    conf.setInt(HFile.FORMAT_VERSION_KEY, HFile.MIN_FORMAT_VERSION_WITH_TAGS);<a name="line.5870"></a>
+<span class="sourceLineNo">5871</span><a name="line.5871"></a>
+<span class="sourceLineNo">5872</span>    region = HBaseTestingUtility.createRegionAndWAL(new HRegionInfo(htd.getTableName(),<a name="line.5872"></a>
+<span class="sourceLineNo">5873</span>            HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY),<a name="line.5873"></a>
+<span class="sourceLineNo">5874</span>        TEST_UTIL.getDataTestDir(), conf, htd);<a name="line.5874"></a>
+<span class="sourceLineNo">5875</span>    assertNotNull(region);<a name="line.5875"></a>
+<span class="sourceLineNo">5876</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.5876"></a>
+<span class="sourceLineNo">5877</span>    // Add a cell that will expire in 5 seconds via cell TTL<a name="line.5877"></a>
+<span class="sourceLineNo">5878</span>    region.put(new Put(row).add(new KeyValue(row, fam1, q1, now,<a name="line.5878"></a>
+<span class="sourceLineNo">5879</span>      HConstants.EMPTY_BYTE_ARRAY, new ArrayBackedTag[] {<a name="line.5879"></a>
+<span class="sourceLineNo">5880</span>        // TTL tags specify ts in milliseconds<a name="line.5880"></a>
+<span class="sourceLineNo">5881</span>        new ArrayBackedTag(TagType.TTL_TAG_TYPE, Bytes.toBytes(5000L)) })));<a name="line.5881"></a>
+<span class="sourceLineNo">5882</span>    // Add a cell that will expire after 10 seconds via family setting<a name="line.5882"></a>
+<span class="sourceLineNo">5883</span>    region.put(new Put(row).addColumn(fam1, q2, now, HConstants.EMPTY_BYTE_ARRAY));<a name="line.5883"></a>
+<span class="sourceLineNo">5884</span>    // Add a cell that will expire in 15 seconds via cell TTL<a name="line.5884"></a>
+<span class="sourceLineNo">5885</span>    region.put(new Put(row).add(new KeyValue(row, fam1, q3, now + 10000 - 1,<a name="line.5885"></a>
+<span class="sourceLineNo">5886</span>      HConstants.EMPTY_BYTE_ARRAY, new ArrayBackedTag[] {<a name="line.5886"></a>
+<span class="sourceLineNo">5887</span>        // TTL tags specify ts in milliseconds<a name="line.5887"></a>
+<span class="sourceLineNo">5888</span>        new ArrayBackedTag(TagType.TTL_TAG_TYPE, Bytes.toBytes(5000L)) })));<a name="line.5888"></a>
+<span class="sourceLineNo">5889</span>    // Add a cell that will expire in 20 seconds via family setting<a name="line.5889"></a>
+<span class="sourceLineNo">5890</span>    region.put(new Put(row).addColumn(fam1, q4, now + 10000 - 1, HConstants.EMPTY_BYTE_ARRAY));<a name="line.5890"></a>
 <span class="sourceLineNo">5891</span><a name="line.5891"></a>
-<span class="sourceLineNo">5892</span>    // Increment time to T+5 seconds<a name="line.5892"></a>
-<span class="sourceLineNo">5893</span>    edge.incrementTime(5000);<a name="line.5893"></a>
+<span class="sourceLineNo">5892</span>    // Flush so we are sure store scanning gets this right<a name="line.5892"></a>
+<span class="sourceLineNo">5893</span>    region.flush(true);<a name="line.5893"></a>
 <span class="sourceLineNo">5894</span><a name="line.5894"></a>
-<span class="sourceLineNo">5895</span>    r = region.get(new Get(row));<a name="line.5895"></a>
-<span class="sourceLineNo">5896</span>    assertNull(r.getValue(fam1, q1));<a name="line.5896"></a>
-<span class="sourceLineNo">5897</span>    assertNotNull(r.getValue(fam1, q2));<a name="line.5897"></a>
-<span class="sourceLineNo">5898</span>    assertNotNull(r.getValue(fam1, q3));<a name="line.5898"></a>
-<span class="sourceLineNo">5899</span>    assertNotNull(r.getValue(fam1, q4));<a name="line.5899"></a>
-<span class="sourceLineNo">5900</span><a name="line.5900"></a>
-<span class="sourceLineNo">5901</span>    // Increment time to T+10 seconds<a name="line.5901"></a>
-<span class="sourceLineNo">5902</span>    edge.incrementTime(5000);<a name="line.5902"></a>
-<span class="sourceLineNo">5903</span><a name="line.5903"></a>
-<span class="sourceLineNo">5904</span>    r = region.get(new Get(row));<a name="line.5904"></a>
-<span class="sourceLineNo">5905</span>    assertNull(r.getValue(fam1, q1));<a name="line.5905"></a>
-<span class="sourceLineNo">5906</span>    assertNull(r.getValue(fam1, q2));<a name="line.5906"></a>
-<span class="sourceLineNo">5907</span>    assertNotNull(r.getValue(fam1, q3));<a name="line.5907"></a>
-<span class="sourceLineNo">5908</span>    assertNotNull(r.getValue(fam1, q4));<a name="line.5908"></a>
-<span class="sourceLineNo">5909</span><a name="line.5909"></a>
-<span class="sourceLineNo">5910</span>    // Increment time to T+15 seconds<a name="line.5910"></a>
-<span class="sourceLineNo">5911</span>    edge.incrementTime(5000);<a name="line.5911"></a>
-<span class="sourceLineNo">5912</span><a name="line.5912"></a>
-<span class="sourceLineNo">5913</span>    r = region.get(new Get(row));<a name="line.5913"></a>
-<span class="sourceLineNo">5914</span>    assertNull(r.getValue(fam1, q1));<a name="line.5914"></a>
-<span class="sourceLineNo">5915</span>    assertNull(r.getValue(fam1, q2));<a name="line.5915"></a>
-<span class="sourceLineNo">5916</span>    assertNull(r.getValue(fam1, q3));<a name="line.5916"></a>
-<span class="sourceLineNo">5917</span>    assertNotNull(r.getValue(fam1, q4));<a name="line.5917"></a>
-<span class="sourceLineNo">5918</span><a name="line.5918"></a>
-<span class="sourceLineNo">5919</span>    // Increment time to T+20 seconds<a name="line.5919"></a>
-<span class="sourceLineNo">5920</span>    edge.incrementTime(10000);<a name="line.5920"></a>
-<span class="sourceLineNo">5921</span><a name="line.5921"></a>
-<span class="sourceLineNo">5922</span>    r = region.get(new Get(row));<a name="line.5922"></a>
-<span class="sourceLineNo">5923</span>    assertNull(r.getValue(fam1, q1));<a name="line.5923"></a>
-<span class="sourceLineNo">5924</span>    assertNull(r.getValue(fam1, q2));<a name="line.5924"></a>
-<span class="sourceLineNo">5925</span>    assertNull(r.getValue(fam1, q3));<a name="line.5925"></a>
-<span class="sourceLineNo">5926</span>    assertNull(r.getValue(fam1, q4));<a name="line.5926"></a>
-<span class="sourceLineNo">5927</span><a name="line.5927"></a>
-<span class="sourceLineNo">5928</span>    // Fun with disappearing increments<a name="line.5928"></a>
-<span class="sourceLineNo">5929</span><a name="line.5929"></a>
-<span class="sourceLineNo">5930</span>    // Start at 1<a name="line.5930"></a>
-<span class="sourceLineNo">5931</span>    region.put(new Put(row).addColumn(fam1, q1, Bytes.toBytes(1L)));<a name="line.5931"></a>
+<span class="sourceLineNo">5895</span>    // A query at time T+0 should return all cells<a name="line.5895"></a>
+<span class="sourceLineNo">5896</span>    Result r = region.get(new Get(row));<a name="line.5896"></a>
+<span class="sourceLineNo">5897</span>    assertNotNull(r.getValue(fam1, q1));<a name="line.5897"></a>
+<span class="sourceLineNo">5898</span>    assertNotNull(r.getValue(fam1, q2));<a name="line.5898"></a>
+<span class="sourceLineNo">5899</span>    assertNotNull(r.getValue(fam1, q3));<a name="line.5899"></a>
+<span class="sourceLineNo">5900</span>    assertNotNull(r.getValue(fam1, q4));<a name="line.5900"></a>
+<span class="sourceLineNo">5901</span><a name="line.5901"></a>
+<span class="sourceLineNo">5902</span>    // Increment time to T+5 seconds<a name="line.5902"></a>
+<span class="sourceLineNo">5903</span>    edge.incrementTime(5000);<a name="line.5903"></a>
+<span class="sourceLineNo">5904</span><a name="line.5904"></a>
+<span class="sourceLineNo">5905</span>    r = region.get(new Get(row));<a name="line.5905"></a>
+<span class="sourceLineNo">5906</span>    assertNull(r.getValue(fam1, q1));<a name="line.5906"></a>
+<span class="sourceLineNo">5907</span>    assertNotNull(r.getValue(fam1, q2));<a name="line.5907"></a>
+<span class="sourceLineNo">5908</span>    assertNotNull(r.getValue(fam1, q3));<a name="line.5908"></a>
+<span class="sourceLineNo">5909</span>    assertNotNull(r.getValue(fam1, q4));<a name="line.5909"></a>
+<span class="sourceLineNo">5910</span><a name="line.5910"></a>
+<span class="sourceLineNo">5911</span>    // Increment time to T+10 seconds<a name="line.5911"></a>
+<span class="sourceLineNo">5912</span>    edge.incrementTime(5000);<a name="line.5912"></a>
+<span class="sourceLineNo">5913</span><a name="line.5913"></a>
+<span class="sourceLineNo">5914</span>    r = region.get(new Get(row));<a name="line.5914"></a>
+<span class="sourceLineNo">5915</span>    assertNull(r.getValue(fam1, q1));<a name="line.5915"></a>
+<span class="sourceLineNo">5916</span>    assertNull(r.getValue(fam1, q2));<a name="line.5916"></a>
+<span class="sourceLineNo">5917</span>    assertNotNull(r.getValue(fam1, q3));<a name="line.5917"></a>
+<span class="sourceLineNo">5918</span>    assertNotNull(r.getValue(fam1, q4));<a name="line.5918"></a>
+<span class="sourceLineNo">5919</span><a name="line.5919"></a>
+<span class="sourceLineNo">5920</span>    // Increment time to T+15 seconds<a name="line.5920"></a>
+<span class="sourceLineNo">5921</span>    edge.incrementTime(5000);<a name="line.5921"></a>
+<span class="sourceLineNo">5922</span><a name="line.5922"></a>
+<span class="sourceLineNo">5923</span>    r = region.get(new Get(row));<a name="line.5923"></a>
+<span class="sourceLineNo">5924</span>    assertNull(r.getValue(fam1, q1));<a name="line.5924"></a>
+<span class="sourceLineNo">5925</span>    assertNull(r.getValue(fam1, q2));<a name="line.5925"></a>
+<span class="sourceLineNo">5926</span>    assertNull(r.getValue(fam1, q3));<a name="line.5926"></a>
+<span class="sourceLineNo">5927</span>    assertNotNull(r.getValue(fam1, q4));<a name="line.5927"></a>
+<span class="sourceLineNo">5928</span><a name="line.5928"></a>
+<span class="sourceLineNo">5929</span>    // Increment time to T+20 seconds<a name="line.5929"></a>
+<span class="sourceLineNo">5930</span>    edge.incrementTime(10000);<a name="line.5930"></a>
+<span class="sourceLineNo">5931</span><a name="line.5931"></a>
 <span class="sourceLineNo">5932</span>    r = region.get(new Get(row));<a name="line.5932"></a>
-<span class="sourceLineNo">5933</span>    byte[] val = r.getValue(fam1, q1);<a name="line.5933"></a>
-<span class="sourceLineNo">5934</span>    assertNotNull(val);<a name="line.5934"></a>
-<span class="sourceLineNo">5935</span>    assertEquals(1L, Bytes.toLong(val));<a name="line.5935"></a>
-<span class="sourceLineNo">5936</span><a name="line.5936"></a>
-<span class="sourceLineNo">5937</span>    // Increment with a TTL of 5 seconds<a name="line.5937"></a>
-<span class="sourceLineNo">5938</span>    Increment incr = new Increment(row).addColumn(fam1, q1, 1L);<a name="line.5938"></a>
-<span class="sourceLineNo">5939</span>    incr.setTTL(5000);<a name="line.5939"></a>
-<span class="sourceLineNo">5940</span>    region.increment(incr); // 2<a name="line.5940"></a>
-<span class="sourceLineNo">5941</span><a name="line.5941"></a>
-<span class="sourceLineNo">5942</span>    // New value should be 2<a name="line.5942"></a>
-<span class="sourceLineNo">5943</span>    r = region.get(new Get(row));<a name="line.5943"></a>
-<span class="sourceLineNo">5944</span>    val = r.getValue(fam1, q1);<a name="line.5944"></a>
-<span class="sourceLineNo">5945</span>    assertNotNull(val);<a name="line.5945"></a>
-<span class="sourceLineNo">5946</span>    assertEquals(2L, Bytes.toLong(val));<a name="line.5946"></a>
-<span class="sourceLineNo">5947</span><a name="line.5947"></a>
-<span class="sourceLineNo">5948</span>    // Increment time to T+25 seconds<a name="line.5948"></a>
-<span class="sourceLineNo">5949</span>    edge.incrementTime(5000);<a name="line.5949"></a>
-<span class="sourceLineNo">5950</span><a name="line.5950"></a>
-<span class="sourceLineNo">5951</span>    // Value should be back to 1<a name="line.5951"></a>
-<span class="sourceLineNo">5952</span>    r = region.get(new Get(row));<a name="line.5952"></a>
-<span class="sourceLineNo">5953</span>    val = r.getValue(fam1, q1);<a name="line.5953"></a>
-<span class="sourceLineNo">5954</span>    assertNotNull(val);<a name="line.5954"></a>
-<span class="sourceLineNo">5955</span>    assertEquals(1L, Bytes.toLong(val));<a name="line.5955"></a>
-<span class="sourceLineNo">5956</span><a name="line.5956"></a>
-<span class="sourceLineNo">5957</span>    // Increment time to T+30 seconds<a name="line.5957"></a>
-<span class="sourceLineNo">5958</span>    edge.incrementTime(5000);<a name="line.5958"></a>
-<span class="sourceLineNo">5959</span><a name="line.5959"></a>
-<span class="sourceLineNo">5960</span>    // Original value written at T+20 should be gone now via family TTL<a name="line.5960"></a>
-<span class="sourceLineNo">5961</span>    r = region.get(new Get(row));<a name="line.5961"></a>
-<span class="sourceLineNo">5962</span>    assertNull(r.getValue(fam1, q1));<a name="line.5962"></a>
-<span class="sourceLineNo">5963</span>  }<a name="line.5963"></a>
-<span class="sourceLineNo">5964</span><a name="line.5964"></a>
-<span class="sourceLineNo">5965</span>  @Test<a name="line.5965"></a>
-<span class="sourceLineNo">5966</span>  public void testIncrementTimestampsAreMonotonic() throws IOException {<a name="line.5966"></a>
-<span class="sourceLineNo">5967</span>    region = initHRegion(tableName, method, CONF, fam1);<a name="line.5967"></a>
-<span class="sourceLineNo">5968</span>    ManualEnvironmentEdge edge = new ManualEnvironmentEdge();<a name="line.5968"></a>
-<span class="sourceLineNo">5969</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.5969"></a>
-<span class="sourceLineNo">5970</span><a name="line.5970"></a>
-<span class="sourceLineNo">5971</span>    edge.setValue(10);<a name="line.5971"></a>
-<span class="sourceLineNo">5972</span>    Increment inc = new Increment(row);<a name="line.5972"></a>
-<span class="sourceLineNo">5973</span>    inc.setDurability(Durability.SKIP_WAL);<a name="line.5973"></a>
-<span class="sourceLineNo">5974</span>    inc.addColumn(fam1, qual1, 1L);<a name="line.5974"></a>
-<span class="sourceLineNo">5975</span>    region.increment(inc);<a name="line.5975"></a>
-<span class="sourceLineNo">5976</span><a name="line.5976"></a>
-<span class="sourceLineNo">5977</span>    Result result = region.get(new Get(row));<a name="line.5977"></a>
-<span class="sourceLineNo">5978</span>    Cell c = result.getColumnLatestCell(fam1, qual1);<a name="line.5978"></a>
-<span class="sourceLineNo">5979</span>    assertNotNull(c);<a name="line.5979"></a>
-<span class="sourceLineNo">5980</span>    assertEquals(10L, c.getTimestamp());<a name="line.5980"></a>
-<span class="sourceLineNo">5981</span><a name="line.5981"></a>
-<span class="sourceLineNo">5982</span>    edge.setValue(1); // clock goes back<a name="line.5982"></a>
-<span class="sourceLineNo">5983</span>    region.increment(inc);<a name="line.5983"></a>
-<span class="sourceLineNo">5984</span>    result = region.get(new Get(row));<a name="line.5984"></a>
-<span class="sourceLineNo">5985</span>    c = result.getColumnLatestCell(fam1, qual1);<a name="line.5985"></a>
-<span class="sourceLineNo">5986</span>    assertEquals(11L, c.getTimestamp());<a name="line.5986"></a>
-<span class="sourceLineNo">5987</span>    assertEquals(2L, Bytes.toLong(c.getValueArray(), c.getValueOffset(), c.getValueLength()));<a name="line.5987"></a>
-<span class="sourceLineNo">5988</span>  }<a name="line.5988"></a>
-<span class="sourceLineNo">5989</span><a name="line.5989"></a>
-<span class="sourceLineNo">5990</span>  @Test<a name="line.5990"></a>
-<span class="sourceLineNo">5991</span>  public void testAppendTimestampsAreMonotonic() throws IOException {<a name="line.5991"></a>
-<span class="sourceLineNo">5992</span>    region = initHRegion(tableName, method, CONF, fam1);<a name="line.5992"></a>
-<span class="sourceLineNo">5993</span>    ManualEnvironmentEdge edge = new ManualEnvironmentEdge();<a name="line.5993"></a>
-<span class="sourceLineNo">5994</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.5994"></a>
-<span class="sourceLineNo">5995</span><a name="line.5995"></a>
-<span class="sourceLineNo">5996</span>    edge.setValue(10);<a name="line.5996"></a>
-<span class="sourceLineNo">5997</span>    Append a = new Append(row);<a name="line.5997"></a>
-<span class="sourceLineNo">5998</span>    a.setDurability(Durability.SKIP_WAL);<a name="line.5998"></a>
-<span class="sourceLineNo">5999</span>    a.addColumn(fam1, qual1, qual1);<a name="line.5999"></a>
-<span class="sourceLineNo">6000</span>    region.append(a);<a name="line.6000"></a>
-<span class="sourceLineNo">6001</span><a name="line.6001"></a>
-<span class="sourceLineNo">6002</span>    Result result = region.get(new Get(row));<a name="line.6002"></a>
-<span class="sourceLineNo">6003</span>    Cell c = result.getColumnLatestCell(fam1, qual1);<a name="line.6003"></a>
-<span class="sourceLineNo">6004</span>    assertNotNull(c);<a name="line.6004"></a>
-<span class="sourceLineNo">6005</span>    assertEquals(10L, c.getTimestamp());<a name="line.6005"></a>
-<span class="sourceLineNo">6006</span><a name="line.6006"></a>
-<span class="sourceLineNo">6007</span>    edge.setValue(1); // clock goes back<a name="line.6007"></a>
-<span class="sourceLineNo">6008</span>    region.append(a);<a name="line.6008"></a>
-<span class="sourceLineNo">6009</span>    result = region.get(new Get(row));<a name="line.6009"></a>
-<span class="sourceLineNo">6010</span>    c = result.getColumnLatestCell(fam1, qual1);<a name="line.6010"></a>
-<span class="sourceLineNo">6011</span>    assertEquals(11L, c.getTimestamp());<a name="line.6011"></a>
-<span class="sourceLineNo">6012</span><a name="line.6012"></a>
-<span class="sourceLineNo">6013</span>    byte[] expected = new byte[qual1.length*2];<a name="line.6013"></a>
-<span class="sourceLineNo">6014</span>    System.arraycopy(qual1, 0, expected, 0, qual1.length);<a name="line.6014"></a>
-<span class="sourceLineNo">6015</span>    System.arraycopy(qual1, 0, expected, qual1.length, qual1.length);<a name="line.6015"></a>
+<span class="sourceLineNo">5933</span>    assertNull(r.getValue(fam1, q1));<a name="line.5933"></a>
+<span class="sourceLineNo">5934</span>    assertNull(r.getValue(fam1, q2));<a name="line.5934"></a>
+<span class="sourceLineNo">5935</span>    assertNull(r.getValue(fam1, q3));<a name="line.5935"></a>
+<span class="sourceLineNo">5936</span>    assertNull(r.getValue(fam1, q4));<a name="line.5936"></a>
+<span class="sourceLineNo">5937</span><a name="line.5937"></a>
+<span class="sourceLineNo">5938</span>    // Fun with disappearing increments<a name="line.5938"></a>
+<span class="sourceLineNo">5939</span><a name="line.5939"></a>
+<span class="sourceLineNo">5940</span>    // Start at 1<a name="line.5940"></a>
+<span class="sourceLineNo">5941</span>    region.put(new Put(row).addColumn(fam1, q1, Bytes.toBytes(1L)));<a name="line.5941"></a>
+<span class="sourceLineNo">5942</span>    r = region.get(new Get(row));<a name="line.5942"></a>
+<span class="sourceLineNo">5943</span>    byte[] val = r.getValue(fam1, q1);<a name="line.5943"></a>
+<span class="sourceLineNo">5944</span>    assertNotNull(val);<a name="line.5944"></a>
+<span class="sourceLineNo">5945</span>    assertEquals(1L, Bytes.toLong(val));<a name="line.5945"></a>
+<span class="sourceLineNo">5946</span><a name="line.5946"></a>
+<span class="sourceLineNo">5947</span>    // Increment with a TTL of 5 seconds<a name="line.5947"></a>
+<span class="sourceLineNo">5948</span>    Increment incr = new Increment(row).addColumn(fam1, q1, 1L);<a name="line.5948"></a>
+<span class="sourceLineNo">5949</span>    incr.setTTL(5000);<a name="line.5949"></a>
+<span class="sourceLineNo">5950</span>    region.increment(incr); // 2<a name="line.5950"></a>
+<span class="sourceLineNo">5951</span><a name="line.5951"></a>
+<span class="sourceLineNo">5952</span>    // New value should be 2<a name="line.5952"></a>
+<span class="sourceLineNo">5953</span>    r = region.get(new Get(row));<a name="line.5953"></a>
+<span class="sourceLineNo">5954</span>    val = r.getValue(fam1, q1);<a name="line.5954"></a>
+<span class="sourceLineNo">5955</span>    assertNotNull(val);<a name="line.5955"></a>
+<span class="sourceLineNo">5956</span>    assertEquals(2L, Bytes.toLong(val));<a name="line.5956"></a>
+<span class="sourceLineNo">5957</span><a name="line.5957"></a>
+<span class="sourceLineNo">5958</span>    // Increment time to T+25 seconds<a name="line.5958"></a>
+<span class="sourceLineNo">5959</span>    edge.incrementTime(5000);<a name="line.5959"></a>
+<span class="sourceLineNo">5960</span><a name="line.5960"></a>
+<span class="sourceLineNo">5961</span>    // Value should be back to 1<a name="line.5961"></a>
+<span class="sourceLineNo">5962</span>    r = region.get(new Get(row));<a name="line.5962"></a>
+<span class="sourceLineNo">5963</span>    val = r.getValue(fam1, q1);<a name="line.5963"></a>
+<span class="sourceLineNo">5964</span>    assertNotNull(val);<a name="line.5964"></a>
+<span class="sourceLineNo">5965</span>    assertEquals(1L, Bytes.toLong(val));<a name="line.5965"></a>
+<span class="sourceLineNo">5966</span><a name="line.5966"></a>
+<span class="sourceLineNo">5967</span>    // Increment time to T+30 seconds<a name="line.5967"></a>
+<span class="sourceLineNo">5968</span>    edge.incrementTime(5000);<a name="line.5968"></a>
+<span class="sourceLineNo">5969</span><a name="line.5969"></a>
+<span class="sourceLineNo">5970</span>    // Original value written at T+20 should be gone now via family TTL<a name="line.5970"></a>
+<span class="sourceLineNo">5971</span>    r = region.get(new Get(row));<a name="line.5971"></a>
+<span class="sourceLineNo">5972</span>    assertNull(r.getValue(fam1, q1));<a name="line.5972"></a>
+<span class="sourceLineNo">5973</span>  }<a name="line.5973"></a>
+<span class="sourceLineNo">5974</span><a name="line.5974"></a>
+<span class="sourceLineNo">5975</span>  @Test<a name="line.5975"></a>
+<span class="sourceLineNo">5976</span>  public void testIncrementTimestampsAreMonotonic() throws IOException {<a name="line.5976"></a>
+<span class="sourceLineNo">5977</span>    region = initHRegion(tableName, method, CONF, fam1);<a name="line.5977"></a>
+<span class="sourceLineNo">5978</span>    ManualEnvironmentEdge edge = new ManualEnvironmentEdge();<a name="line.5978"></a>
+<span class="sourceLineNo">5979</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.5979"></a>
+<span class="sourceLineNo">5980</span><a name="line.5980"></a>
+<span class="sourceLineNo">5981</span>    edge.setValue(10);<a name="line.5981"></a>
+<span class="sourceLineNo">5982</span>    Increment inc = new Increment(row);<a name="line.5982"></a>
+<span class="sourceLineNo">5983</span>    inc.setDurability(Durability.SKIP_WAL);<a name="line.5983"></a>
+<span class="sourceLineNo">5984</span>    inc.addColumn(fam1, qual1, 1L);<a name="line.5984"></a>
+<span class="sourceLineNo">5985</span>    region.increment(inc);<a name="line.5985"></a>
+<span class="sourceLineNo">5986</span><a name="line.5986"></a>
+<span class="sourceLineNo">5987</span>    Result result = region.get(new Get(row));<a name="line.5987"></a>
+<span class="sourceLineNo">5988</span>    Cell c = result.getColumnLatestCell(fam1, qual1);<a name="line.5988"></a>
+<span class="sourceLineNo">5989</span>    assertNotNull(c);<a name="line.5989"></a>
+<span class="sourceLineNo">5990</span>    assertEquals(10L, c.getTimestamp());<a name="line.5990"></a>
+<span class="sourceLineNo">5991</span><a name="line.5991"></a>
+<span class="sourceLineNo">5992</span>    edge.setValue(1); // clock goes back<a name="line.5992"></a>
+<span class="sourceLineNo">5993</span>    region.increment(inc);<a name="line.5993"></a>
+<span class="sourceLineNo">5994</span>    result = region.get(new Get(row));<a name="line.5994"></a>
+<span class="sourceLineNo">5995</span>    c = result.getColumnLatestCell(fam1, qual1);<a name="line.5995"></a>
+<span class="sourceLineNo">5996</span>    assertEquals(11L, c.getTimestamp());<a name="line.5996"></a>
+<span class="sourceLineNo">5997</span>    assertEquals(2L, Bytes.toLong(c.getValueArray(), c.getValueOffset(), c.getValueLength()));<a name="line.5997"></a>
+<span class="sourceLineNo">5998</span>  }<a name="line.5998"></a>
+<span class="sourceLineNo">5999</span><a name="line.5999"></a>
+<span class="sourceLineNo">6000</span>  @Test<a name="line.6000"></a>
+<span class="sourceLineNo">6001</span>  public void testAppendTimestampsAreMonotonic() throws IOException {<a name="line.6001"></a>
+<span class="sourceLineNo">6002</span>    region = initHRegion(tableName, method, CONF, fam1);<a name="line.6002"></a>
+<span class="sourceLineNo">6003</span>    ManualEnvironmentEdge edge = new ManualEnvironmentEdge();<a name="line.6003"></a>
+<span class="sourceLineNo">6004</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.6004"></a>
+<span class="sourceLineNo">6005</span><a name="line.6005"></a>
+<span class="sourceLineNo">6006</span>    edge.setValue(10);<a name="line.6006"></a>
+<span class="sourceLineNo">6007</span>    Append a = new Append(row);<a name="line.6007"></a>
+<span class="sourceLineNo">6008</span>    a.setDurability(Durability.SKIP_WAL);<a name="line.6008"></a>
+<span class="sourceLineNo">6009</span>    a.addColumn(fam1, qual1, qual1);<a name="line.6009"></a>
+<span class="sourceLineNo">6010</span>    region.append(a);<a name="line.6010"></a>
+<span class="sourceLineNo">6011</span><a name="line.6011"></a>
+<span class="sourceLineNo">6012</span>    Result result = region.get(new Get(row));<a name="line.6012"></a>
+<span class="sourceLineNo">6013</span>    Cell c = result.getColumnLatestCell(fam1, qual1);<a name="line.6013"></a>
+<span class="sourceLineNo">6014</span>    assertNotNull(c);<a name="line.6014"></a>
+<span class="sourceLineNo">6015</span>    assertEquals(10L, c.getTimestamp());<a name="line.6015"></a>
 <span class="sourceLineNo">6016</span><a name="line.6016"></a>
-<span class="sourceLineNo">6017</span>    assertTrue(Bytes.equals(c.getValueArray(), c.getValueOffset(), c.getValueLength(),<a name="line.6017"></a>
-<span class="sourceLineNo">6018</span>      expected, 0, expected.length));<a name="line.6018"></a>
-<span class="sourceLineNo">6019</span>  }<a name="line.6019"></a>
-<span class="sourceLineNo">6020</span><a name="line.6020"></a>
-<span class="sourceLineNo">6021</span>  @Test<a name="line.6021"></a>
-<span class="sourceLineNo">6022</span>  public void testCheckAndMutateTimestampsAreMonotonic() throws IOException {<a name="line.6022"></a>
-<span class="sourceLineNo">6023</span>    region = initHRegion(tableName, method, CONF, fam1);<a name="line.6023"></a>
-<span class="sourceLineNo">6024</span>    ManualEnvironmentEdge edge = new ManualEnvironmentEdge();<a name="line.6024"></a>
-<span class="sourceLineNo">6025</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.6025"></a>
+<span class="sourceLineNo">6017</span>    edge.setValue(1); // clock goes back<a name="line.6017"></a>
+<span class="sourceLineNo">6018</span>    region.append(a);<a name="line.6018"></a>
+<span class="sourceLineNo">6019</span>    result = region.get(new Get(row));<a name="line.6019"></a>
+<span class="sourceLineNo">6020</span>    c = result.getColumnLatestCell(fam1, qual1);<a name="line.6020"></a>
+<span class="sourceLineNo">6021</span>    assertEquals(11L, c.getTimestamp());<a name="line.6021"></a>
+<span class="sourceLineNo">6022</span><a name="line.6022"></a>
+<span class="sourceLineNo">6023</span>    byte[] expected = new byte[qual1.length*2];<a name="line.6023"></a>
+<span class="sourceLineNo">6024</span>    System.arraycopy(qual1, 0, expected, 0, qual1.length);<a name="line.6024"></a>
+<span class="sourceLineNo">6025</span>    System.arraycopy(qual1, 0, expected, qual1.length, qual1.length);<a name="line.6025"></a>
 <span class="sourceLineNo">6026</span><a name="line.6026"></a>
-<span class="sourceLineNo">6027</span>    edge.setValue(10);<a name="line.6027"></a>
-<span class="sourceLineNo">6028</span>    Put p = new Put(row);<a name="line.6028"></a>
-<span class="sourceLineNo">6029</span>    p.setDurability(Durability.SKIP_WAL);<a name="line.6029"></a>
-<span class="sourceLineNo">6030</span>    p.addColumn(fam1, qual1, qual1);<a name="line.6030"></a>
-<span class="sourceLineNo">6031</span>    region.put(p);<a name="line.6031"></a>
-<span class="sourceLineNo">6032</span><a name="line.6032"></a>
-<span class="sourceLineNo">6033</span>    Result result = region.get(new Get(row));<a name="line.6033"></a>
-<span class="sourceLineNo">6034</span>    Cell c = result.getColumnLatestCell(fam1, qual1);<a name="line.6034"></a>
-<span class="sourceLineNo">6035</span>    assertNotNull(c);<a name="line.6035"></a>
-<span class="sourceLineNo">6036</span>    assertEquals(10L, c.getTimestamp());<a name="line.6036"></a>
-<span class="sourceLineNo">6037</span><a name="line.6037"></a>
-<span class="sourceLineNo">6038</span>    edge.setValue(1); // clock goes back<a name="line.6038"></a>
-<span class="sourceLineNo">6039</span>    p = new Put(row);<a name="line.6039"></a>
-<span class="sourceLineNo">6040</span>    p.setDurability(Durability.SKIP_WAL);<a name="line.6040"></a>
-<span class="sourceLineNo">6041</span>    p.addColumn(fam1, qual1, qual2);<a name="line.6041"></a>
-<span class="sourceLineNo">6042</span>    region.checkAndMutate(row, fam1, qual1, CompareOperator.EQUAL, new BinaryComparator(qual1), p);<a name="line.6042"></a>
-<span class="sourceLineNo">6043</span>    result = region.get(new Get(row));<a name="line.6043"></a>
-<span class="sourceLineNo">6044</span>    c = result.getColumnLatestCell(fam1, qual1);<a name="line.6044"></a>
-<span class="sourceLineNo">6045</span>    assertEquals(10L, c.getTimestamp());<a name="line.6045"></a>
-<span class="sourceLineNo">6046</span><a name="line.6046"></a>
-<span class="sourceLineNo">6047</span>    assertTrue(Bytes.equals(c.getValueArray(), c.getValueOffset(), c.getValueLength(),<a name="line.6047"></a>
-<span class="sourceLineNo">6048</span>      qual2, 0, qual2.length));<a name="line.6048"></a>
-<span class="sourceLineNo">6049</span>  }<a name="line.6049"></a>
-<span class="sourceLineNo">6050</span><a name="line.6050"></a>
-<span class="sourceLineNo">6051</span>  @Test<a name="line.6051"></a>
-<span class="sourceLineNo">6052</span>  public void testBatchMutateWithWrongRegionException() throws Exception {<a name="line.6052"></a>
-<span class="sourceLineNo">6053</span>    final byte[] a = Bytes.toBytes("a");<a name="line.6053"></a>
-<span class="sourceLineNo">6054</span>    final byte[] b = Bytes.toBytes("b");<a name="line.6054"></a>
-<span class="sourceLineNo">6055</span>    final byte[] c = Bytes.toBytes("c"); // exclusive<a name="line.6055"></a>
+<span class="sourceLineNo">6027</span>    assertTrue(Bytes.equals(c.getValueArray(), c.getValueOffset(), c.getValueLength(),<a name="line.6027"></a>
+<span class="sourceLineNo">6028</span>      expected, 0, expected.length));<a name="line.6028"></a>
+<span class="sourceLineNo">6029</span>  }<a name="line.6029"></a>
+<span class="sourceLineNo">6030</span><a name="line.6030"></a>
+<span class="sourceLineNo">6031</span>  @Test<a name="line.6031"></a>
+<span class="sourceLineNo">6032</span>  public void testCheckAndMutateTimestampsAreMonotonic() throws IOException {<a name="line.6032"></a>
+<span class="sourceLineNo">6033</span>    region = initHRegion(tableName, method, CONF, fam1);<a name="line.6033"></a>
+<span class="sourceLineNo">6034</span>    ManualEnvironmentEdge edge = new ManualEnvironmentEdge();<a name="line.6034"></a>
+<span class="sourceLineNo">6035</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.6035"></a>
+<span class="sourceLineNo">6036</span><a name="line.6036"></a>
+<span class="sourceLineNo">6037</span>    edge.setValue(10);<a name="line.6037"></a>
+<span class="sourceLineNo">6038</span>    Put p = new Put(row);<a name="line.6038"></a>
+<span class="sourceLineNo">6039</span>    p.setDurability(Durability.SKIP_WAL);<a name="line.6039"></a>
+<span class="sourceLineNo">6040</span>    p.addColumn(fam1, qual1, qual1);<a name="line.6040"></a>
+<span class="sourceLineNo">6041</span>    region.put(p);<a name="line.6041"></a>
+<span class="sourceLineNo">6042</span><a name="line.6042"></a>
+<span class="sourceLineNo">6043</span>    Result result = region.get(new Get(row));<a name="line.6043"></a>
+<span class="sourceLineNo">6044</span>    Cell c = result.getColumnLatestCell(fam1, qual1);<a name="line.6044"></a>
+<span class="sourceLineNo">6045</span>    assertNotNull(c);<a name="line.6045"></a>
+<span class="sourceLineNo">6046</span>    assertEquals(10L, c.getTimestamp());<a name="line.6046"></a>
+<span class="sourceLineNo">6047</span><a name="line.6047"></a>
+<span class="sourceLineNo">6048</span>    edge.setValue(1); // clock goes back<a name="line.6048"></a>
+<span class="sourceLineNo">6049</span>    p = new Put(row);<a name="line.6049"></a>
+<span class="sourceLineNo">6050</span>    p.setDurability(Durability.SKIP_WAL);<a name="line.6050"></a>
+<span class="sourceLineNo">6051</span>    p.addColumn(fam1, qual1, qual2);<a name="line.6051"></a>
+<span class="sourceLineNo">6052</span>    region.checkAndMutate(row, fam1, qual1, CompareOperator.EQUAL, new BinaryComparator(qual1), p);<a name="line.6052"></a>
+<span class="sourceLineNo">6053</span>    result = region.get(new Get(row));<a name="line.6053"></a>
+<span class="sourceLineNo">6054</span>    c = result.getColumnLatestCell(fam1, qual1);<a name="line.6054"></a>
+<span class="sourceLineNo">6055</span>    assertEquals(10L, c.getTimestamp());<a name="line.6055"></a>
 <span class="sourceLineNo">6056</span><a name="line.6056"></a>
-<span class="sourceLineNo">6057</span>    int prevLockTimeout = CONF.getInt("hbase.rowlock.wait.duration", 30000);<a name="line.6057"></a>
-<span class="sourceLineNo">6058</span>    CONF.setInt("hbase.rowlock.wait.duration", 1000);<a name="line.6058"></a>
-<span class="sourceLineNo">6059</span>    region = initHRegion(tableName, a, c, method, CONF, false, fam1);<a name="line.6059"></a>
+<span class="sourceLineNo">6057</span>    assertTrue(Bytes.equals(c.getValueArray(), c.getValueOffset(), c.getValueLength(),<a name="line.6057"></a>
+<span class="sourceLineNo">6058</span>      qual2, 0, qual2.length));<a name="line.6058"></a>
+<span class="sourceLineNo">6059</span>  }<a name="line.6059"></a>
 <span class="sourceLineNo">6060</span><a name="line.6060"></a>
-<span class="sourceLineNo">6061</span>    Mutation[] mutations = new Mutation[] {<a name="line.6061"></a>
-<span class="sourceLineNo">6062</span>        new Put(a)<a name="line.6062"></a>
-<span class="sourceLineNo">6063</span>            .add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6063"></a>
-<span class="sourceLineNo">6064</span>              .setRow(a)<a name="line.6064"></a>
-<span class="sourceLineNo">6065</span>              .setFamily(fam1)<a name="line.6065"></a>
-<span class="sourceLineNo">6066</span>              .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6066"></a>
-<span class="sourceLineNo">6067</span>              .setType(Cell.Type.Put)<a name="line.6067"></a>
-<span class="sourceLineNo">6068</span>              .build()),<a name="line.6068"></a>
-<span class="sourceLineNo">6069</span>        // this is outside the region boundary<a name="line.6069"></a>
-<span class="sourceLineNo">6070</span>        new Put(c).add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6070"></a>
-<span class="sourceLineNo">6071</span>              .setRow(c)<a name="line.6071"></a>
-<span class="sourceLineNo">6072</span>              .setFamily(fam1)<a name="line.6072"></a>
-<span class="sourceLineNo">6073</span>              .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6073"></a>
-<span class="sourceLineNo">6074</span>              .setType(Type.Put)<a name="line.6074"></a>
-<span class="sourceLineNo">6075</span>              .build()),<a name="line.6075"></a>
-<span class="sourceLineNo">6076</span>        new Put(b).add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6076"></a>
-<span class="sourceLineNo">6077</span>              .setRow(b)<a name="line.6077"></a>
-<span class="sourceLineNo">6078</span>              .setFamily(fam1)<a name="line.6078"></a>
-<span class="sourceLineNo">6079</span>              .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6079"></a>
-<span class="sourceLineNo">6080</span>              .setType(Cell.Type.Put)<a name="line.6080"></a>
-<span class="sourceLineNo">6081</span>              .build())<a name="line.6081"></a>
-<span class="sourceLineNo">6082</span>    };<a name="line.6082"></a>
-<span class="sourceLineNo">6083</span><a name="line.6083"></a>
-<span class="sourceLineNo">6084</span>    OperationStatus[] status = region.batchMutate(mutations);<a name="line.6084"></a>
-<span class="sourceLineNo">6085</span>    assertEquals(OperationStatusCode.SUCCESS, status[0].getOperationStatusCode());<a name="line.6085"></a>
-<span class="sourceLineNo">6086</span>    assertEquals(OperationStatusCode.SANITY_CHECK_FAILURE, status[1].getOperationStatusCode());<a name="line.6086"></a>
-<span class="sourceLineNo">6087</span>    assertEquals(OperationStatusCode.SUCCESS, status[2].getOperationStatusCode());<a name="line.6087"></a>
-<span class="sourceLineNo">6088</span><a name="line.6088"></a>
-<span class="sourceLineNo">6089</span><a name="line.6089"></a>
-<span class="sourceLineNo">6090</span>    // test with a row lock held for a long time<a name="line.6090"></a>
-<span class="sourceLineNo">6091</span>    final CountDownLatch obtainedRowLock = new CountDownLatch(1);<a name="line.6091"></a>
-<span class="sourceLineNo">6092</span>    ExecutorService exec = Executors.newFixedThreadPool(2);<a name="line.6092"></a>
-<span class="sourceLineNo">6093</span>    Future&lt;Void&gt; f1 = exec.submit(new Callable&lt;Void&gt;() {<a name="line.6093"></a>
-<span class="sourceLineNo">6094</span>      @Override<a name="line.6094"></a>
-<span class="sourceLineNo">6095</span>      public Void call() throws Exception {<a name="line.6095"></a>
-<span class="sourceLineNo">6096</span>        LOG.info("Acquiring row lock");<a name="line.6096"></a>
-<span class="sourceLineNo">6097</span>        RowLock rl = region.getRowLock(b);<a name="line.6097"></a>
-<span class="sourceLineNo">6098</span>        obtainedRowLock.countDown();<a name="line.6098"></a>
-<span class="sourceLineNo">6099</span>        LOG.info("Waiting for 5 seconds before releasing lock");<a name="line.6099"></a>
-<span class="sourceLineNo">6100</span>        Threads.sleep(5000);<a name="line.6100"></a>
-<span class="sourceLineNo">6101</span>        LOG.info("Releasing row lock");<a name="line.6101"></a>
-<span class="sourceLineNo">6102</span>        rl.release();<a name="line.6102"></a>
-<span class="sourceLineNo">6103</span>        return null;<a name="line.6103"></a>
-<span class="sourceLineNo">6104</span>      }<a name="line.6104"></a>
-<span class="sourceLineNo">6105</span>    });<a name="line.6105"></a>
-<span class="sourceLineNo">6106</span>    obtainedRowLock.await(30, TimeUnit.SECONDS);<a name="line.6106"></a>
-<span class="sourceLineNo">6107</span><a name="line.6107"></a>
-<span class="sourceLineNo">6108</span>    Future&lt;Void&gt; f2 = exec.submit(new Callable&lt;Void&gt;() {<a name="line.6108"></a>
-<span class="sourceLineNo">6109</span>      @Override<a name="line.6109"></a>
-<span class="sourceLineNo">6110</span>      public Void call() throws Exception {<a name="line.6110"></a>
-<span class="sourceLineNo">6111</span>        Mutation[] mutations = new Mutation[] {<a name="line.6111"></a>
-<span class="sourceLineNo">6112</span>            new Put(a).add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6112"></a>
-<span class="sourceLineNo">6113</span>                .setRow(a)<a name="line.6113"></a>
-<span class="sourceLineNo">6114</span>                .setFamily(fam1)<a name="line.6114"></a>
-<span class="sourceLineNo">6115</span>                .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6115"></a>
-<span class="sourceLineNo">6116</span>                .setType(Cell.Type.Put)<a name="line.6116"></a>
-<span class="sourceLineNo">6117</span>                .build()),<a name="line.6117"></a>
-<span class="sourceLineNo">6118</span>            new Put(b).add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6118"></a>
-<span class="sourceLineNo">6119</span>                .setRow(b)<a name="line.6119"></a>
-<span class="sourceLineNo">6120</span>                .setFamily(fam1)<a name="line.6120"></a>
-<span class="sourceLineNo">6121</span>                .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6121"></a>
-<span class="sourceLineNo">6122</span>                .setType(Cell.Type.Put)<a name="line.6122"></a>
-<span class="sourceLineNo">6123</span>                .build()),<a name="line.6123"></a>
-<span class="sourceLineNo">6124</span>        };<a name="line.6124"></a>
-<span class="sourceLineNo">6125</span><a name="line.6125"></a>
-<span class="sourceLineNo">6126</span>        // this will wait for the row lock, and it will eventually succeed<a name="line.6126"></a>
-<span class="sourceLineNo">6127</span>        OperationStatus[] status = region.batchMutate(mutations);<a name="line.6127"></a>
-<span class="sourceLineNo">6128</span>        assertEquals(OperationStatusCode.SUCCESS, status[0].getOperationStatusCode());<a name="line.6128"></a>
-<span class="sourceLineNo">6129</span>        assertEquals(OperationStatusCode.SUCCESS, status[1].getOperationStatusCode());<a name="line.6129"></a>
-<span class="sourceLineNo">6130</span>        return null;<a name="line.6130"></a>
-<span class="sourceLineNo">6131</span>      }<a name="line.6131"></a>
-<span class="sourceLineNo">6132</span>    });<a name="line.6132"></a>
-<span class="sourceLineNo">6133</span><a name="line.6133"></a>
-<span class="sourceLineNo">6134</span>    f1.get();<a name="line.6134"></a>
-<span class="sourceLineNo">6135</span>    f2.get();<a name="line.6135"></a>
-<span class="sourceLineNo">6136</span><a name="line.6136"></a>
-<span class="sourceLineNo">6137</span>    CONF.setInt("hbase.rowlock.wait.duration", prevLockTimeout);<a name="line.6137"></a>
-<span class="sourceLineNo">6138</span>  }<a name="line.6138"></a>
-<span class="sourceLineNo">6139</span><a name="line.6139"></a>
-<span class="sourceLineNo">6140</span>  @Test<a name="line.6140"></a>
-<span class="sourceLineNo">6141</span>  public void testCheckAndRowMutateTimestampsAreMonotonic() throws IOException {<a name="line.6141"></a>
-<span class="sourceLineNo">6142</span>    region = initHRegion(tableName, method, CONF, fam1);<a name="line.6142"></a>
-<span class="sourceLineNo">6143</span>    ManualEnvironmentEdge edge = new ManualEnvironmentEdge();<a name="line.6143"></a>
-<span class="sourceLineNo">6144</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.6144"></a>
-<span class="sourceLineNo">6145</span><a name="line.6145"></a>
-<span class="sourceLineNo">6146</span>    edge.setValue(10);<a name="line.6146"></a>
-<span class="sourceLineNo">6147</span>    Put p = new Put(row);<a name="line.6147"></a>
-<span class="sourceLineNo">6148</span>    p.setDurability(Durability.SKIP_WAL);<a name="line.6148"></a>
-<span class="sourceLineNo">6149</span>    p.addColumn(fam1, qual1, qual1);<a name="line.6149"></a>
-<span class="sourceLineNo">6150</span>    region.put(p);<a name="line.6150"></a>
-<span class="sourceLineNo">6151</span><a name="line.6151"></a>
-<span class="sourceLineNo">6152</span>    Result result = region.get(new Get(row));<a name="line.6152"></a>
-<span class="sourceLineNo">6153</span>    Cell c = result.getColumnLatestCell(fam1, qual1);<a name="line.6153"></a>
-<span class="sourceLineNo">6154</span>    assertNotNull(c);<a name="line.6154"></a>
-<span class="sourceLineNo">6155</span>    assertEquals(10L, c.getTimestamp());<a name="line.6155"></a>
-<span class="sourceLineNo">6156</span><a name="line.6156"></a>
-<span class="sourceLineNo">6157</span>    edge.setValue(1); // clock goes back<a name="line.6157"></a>
-<span class="sourceLineNo">6158</span>    p = new Put(row);<a name="line.6158"></a>
-<span class="sourceLineNo">6159</span>    p.setDurability(Durability.SKIP_WAL);<a name="line.6159"></a>
-<span class="sourceLineNo">6160</span>    p.addColumn(fam1, qual1, qual2);<a name="line.6160"></a>
-<span class="sourceLineNo">6161</span>    RowMutations rm = new RowMutations(row);<a name="line.6161"></a>
-<span class="sourceLineNo">6162</span>    rm.add(p);<a name="line.6162"></a>
-<span class="sourceLineNo">6163</span>    assertTrue(region.checkAndRowMutate(row, fam1, qual1, CompareOperator.EQUAL,<a name="line.6163"></a>
-<span class="sourceLineNo">6164</span>        new BinaryComparator(qual1), rm));<a name="line.6164"></a>
-<span class="sourceLineNo">6165</span>    result = region.get(new Get(row));<a name="line.6165"></a>
-<span class="sourceLineNo">6166</span>    c = result.getColumnLatestCell(fam1, qual1);<a name="line.6166"></a>
-<span class="sourceLineNo">6167</span>    assertEquals(10L, c.getTimestamp());<a name="line.6167"></a>
-<span class="sourceLineNo">6168</span>    LOG.info("c value " +<a name="line.6168"></a>
-<span class="sourceLineNo">6169</span>      Bytes.toStringBinary(c.getValueArray(), c.getValueOffset(), c.getValueLength()));<a name="line.6169"></a>
-<span class="sourceLineNo">6170</span><a name="line.6170"></a>
-<span class="sourceLineNo">6171</span>    assertTrue(Bytes.equals(c.getValueArray(), c.getValueOffset(), c.getValueLength(),<a name="line.6171"></a>
-<span class="sourceLineNo">6172</span>      qual2, 0, qual2.length));<a name="line.6172"></a>
-<span class="sourceLineNo">6173</span>  }<a name="line.6173"></a>
-<span class="sourceLineNo">6174</span><a name="line.6174"></a>
-<span class="sourceLineNo">6175</span>  HRegion initHRegion(TableName tableName, String callingMethod,<a name="line.6175"></a>
-<span class="sourceLineNo">6176</span>      byte[]... families) throws IOException {<a name="line.6176"></a>
-<span class="sourceLineNo">6177</span>    return initHRegion(tableName, callingMethod, HBaseConfiguration.create(),<a name="line.6177"></a>
-<span class="sourceLineNo">6178</span>        families);<a name="line.6178"></a>
-<span class="sourceLineNo">6179</span>  }<a name="line.6179"></a>
+<span class="sourceLineNo">6061</span>  @Test<a name="line.6061"></a>
+<span class="sourceLineNo">6062</span>  public void testBatchMutateWithWrongRegionException() throws Exception {<a name="line.6062"></a>
+<span class="sourceLineNo">6063</span>    final byte[] a = Bytes.toBytes("a");<a name="line.6063"></a>
+<span class="sourceLineNo">6064</span>    final byte[] b = Bytes.toBytes("b");<a name="line.6064"></a>
+<span class="sourceLineNo">6065</span>    final byte[] c = Bytes.toBytes("c"); // exclusive<a name="line.6065"></a>
+<span class="sourceLineNo">6066</span><a name="line.6066"></a>
+<span class="sourceLineNo">6067</span>    int prevLockTimeout = CONF.getInt("hbase.rowlock.wait.duration", 30000);<a name="line.6067"></a>
+<span class="sourceLineNo">6068</span>    CONF.setInt("hbase.rowlock.wait.duration", 1000);<a name="line.6068"></a>
+<span class="sourceLineNo">6069</span>    region = initHRegion(tableName, a, c, method, CONF, false, fam1);<a name="line.6069"></a>
+<span class="sourceLineNo">6070</span><a name="line.6070"></a>
+<span class="sourceLineNo">6071</span>    Mutation[] mutations = new Mutation[] {<a name="line.6071"></a>
+<span class="sourceLineNo">6072</span>        new Put(a)<a name="line.6072"></a>
+<span class="sourceLineNo">6073</span>            .add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6073"></a>
+<span class="sourceLineNo">6074</span>              .setRow(a)<a name="line.6074"></a>
+<span class="sourceLineNo">6075</span>              .setFamily(fam1)<a name="line.6075"></a>
+<span class="sourceLineNo">6076</span>              .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6076"></a>
+<span class="sourceLineNo">6077</span>              .setType(Cell.Type.Put)<a name="line.6077"></a>
+<span class="sourceLineNo">6078</span>              .build()),<a name="line.6078"></a>
+<span class="sourceLineNo">6079</span>        // this is outside the region boundary<a name="line.6079"></a>
+<span class="sourceLineNo">6080</span>        new Put(c).add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6080"></a>
+<span class="sourceLineNo">6081</span>              .setRow(c)<a name="line.6081"></a>
+<span class="sourceLineNo">6082</span>              .setFamily(fam1)<a name="line.6082"></a>
+<span class="sourceLineNo">6083</span>              .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6083"></a>
+<span class="sourceLineNo">6084</span>              .setType(Type.Put)<a name="line.6084"></a>
+<span class="sourceLineNo">6085</span>              .build()),<a name="line.6085"></a>
+<span class="sourceLineNo">6086</span>        new Put(b).add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6086"></a>
+<span class="sourceLineNo">6087</span>              .setRow(b)<a name="line.6087"></a>
+<span class="sourceLineNo">6088</span>              .setFamily(fam1)<a name="line.6088"></a>
+<span class="sourceLineNo">6089</span>              .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6089"></a>
+<span class="sourceLineNo">6090</span>              .setType(Cell.Type.Put)<a name="line.6090"></a>
+<span class="sourceLineNo">6091</span>              .build())<a name="line.6091"></a>
+<span class="sourceLineNo">6092</span>    };<a name="line.6092"></a>
+<span class="sourceLineNo">6093</span><a name="line.6093"></a>
+<span class="sourceLineNo">6094</span>    OperationStatus[] status = region.batchMutate(mutations);<a name="line.6094"></a>
+<span class="sourceLineNo">6095</span>    assertEquals(OperationStatusCode.SUCCESS, status[0].getOperationStatusCode());<a name="line.6095"></a>
+<span class="sourceLineNo">6096</span>    assertEquals(OperationStatusCode.SANITY_CHECK_FAILURE, status[1].getOperationStatusCode());<a name="line.6096"></a>
+<span class="sourceLineNo">6097</span>    assertEquals(OperationStatusCode.SUCCESS, status[2].getOperationStatusCode());<a name="line.6097"></a>
+<span class="sourceLineNo">6098</span><a name="line.6098"></a>
+<span class="sourceLineNo">6099</span><a name="line.6099"></a>
+<span class="sourceLineNo">6100</span>    // test with a row lock held for a long time<a name="line.6100"></a>
+<span class="sourceLineNo">6101</span>    final CountDownLatch obtainedRowLock = new CountDownLatch(1);<a name="line.6101"></a>
+<span class="sourceLineNo">6102</span>    ExecutorService exec = Executors.newFixedThreadPool(2);<a name="line.6102"></a>
+<span class="sourceLineNo">6103</span>    Future&lt;Void&gt; f1 = exec.submit(new Callable&lt;Void&gt;() {<a name="line.6103"></a>
+<span class="sourceLineNo">6104</span>      @Override<a name="line.6104"></a>
+<span class="sourceLineNo">6105</span>      public Void call() throws Exception {<a name="line.6105"></a>
+<span class="sourceLineNo">6106</span>        LOG.info("Acquiring row lock");<a name="line.6106"></a>
+<span class="sourceLineNo">6107</span>        RowLock rl = region.getRowLock(b);<a name="line.6107"></a>
+<span class="sourceLineNo">6108</span>        obtainedRowLock.countDown();<a name="line.6108"></a>
+<span class="sourceLineNo">6109</span>        LOG.info("Waiting for 5 seconds before releasing lock");<a name="line.6109"></a>
+<span class="sourceLineNo">6110</span>        Threads.sleep(5000);<a name="line.6110"></a>
+<span class="sourceLineNo">6111</span>        LOG.info("Releasing row lock");<a name="line.6111"></a>
+<span class="sourceLineNo">6112</span>        rl.release();<a name="line.6112"></a>
+<span class="sourceLineNo">6113</span>        return null;<a name="line.6113"></a>
+<span class="sourceLineNo">6114</span>      }<a name="line.6114"></a>
+<span class="sourceLineNo">6115</span>    });<a name="line.6115"></a>
+<span class="sourceLineNo">6116</span>    obtainedRowLock.await(30, TimeUnit.SECONDS);<a name="line.6116"></a>
+<span class="sourceLineNo">6117</span><a name="line.6117"></a>
+<span class="sourceLineNo">6118</span>    Future&lt;Void&gt; f2 = exec.submit(new Callable&lt;Void&gt;() {<a name="line.6118"></a>
+<span class="sourceLineNo">6119</span>      @Override<a name="line.6119"></a>
+<span class="sourceLineNo">6120</span>      public Void call() throws Exception {<a name="line.6120"></a>
+<span class="sourceLineNo">6121</span>        Mutation[] mutations = new Mutation[] {<a name="line.6121"></a>
+<span class="sourceLineNo">6122</span>            new Put(a).add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6122"></a>
+<span class="sourceLineNo">6123</span>                .setRow(a)<a name="line.6123"></a>
+<span class="sourceLineNo">6124</span>                .setFamily(fam1)<a name="line.6124"></a>
+<span class="sourceLineNo">6125</span>                .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6125"></a>
+<span class="sourceLineNo">6126</span>                .setType(Cell.Type.Put)<a name="line.6126"></a>
+<span class="sourceLineNo">6127</span>                .build()),<a name="line.6127"></a>
+<span class="sourceLineNo">6128</span>            new Put(b).add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6128"></a>
+<span class="sourceLineNo">6129</span>                .setRow(b)<a name="line.6129"></a>
+<span class="sourceLineNo">6130</span>                .setFamily(fam1)<a name="line.6130"></a>
+<span class="sourceLineNo">6131</span>                .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6131"></a>
+<span class="sourceLineNo">6132</span>                .setType(Cell.Type.Put)<a name="line.6132"></a>
+<span class="sourceLineNo">6133</span>                .build()),<a name="line.6133"></a>
+<span class="sourceLineNo">6134</span>        };<a name="line.6134"></a>
+<span class="sourceLineNo">6135</span><a name="line.6135"></a>
+<span class="sourceLineNo">6136</span>        // this will wait for the row lock, and it will eventually succeed<a name="line.6136"></a>
+<span class="sourceLineNo">6137</span>        OperationStatus[] status = region.batchMutate(mutations);<a name="line.6137"></a>
+<span class="sourceLineNo">6138</span>        assertEquals(OperationStatusCode.SUCCESS, status[0].getOperationStatusCode());<a name="line.6138"></a>
+<span class="sourceLineNo">6139</span>        assertEquals(OperationStatusCode.SUCCESS, status[1].getOperationStatusCode());<a name="line.6139"></a>
+<span class="sourceLineNo">6140</span>        return null;<a name="line.6140"></a>
+<span class="sourceLineNo">6141</span>      }<a name="line.6141"></a>
+<span class="sourceLineNo">6142</span>    });<a name="line.6142"></a>
+<span class="sourceLineNo">6143</span><a name="line.6143"></a>
+<span class="sourceLineNo">6144</span>    f1.get();<a name="line.6144"></a>
+<span class="sourceLineNo">6145</span>    f2.get();<a name="line.6145"></a>
+<span class="sourceLineNo">6146</span><a name="line.6146"></a>
+<span class="sourceLineNo">6147</span>    CONF.setInt("hbase.rowlock.wait.duration", prevLockTimeout);<a name="line.6147"></a>
+<span class="sourceLineNo">6148</span>  }<a name="line.6148"></a>
+<span class="sourceLineNo">6149</span><a name="line.6149"></a>
+<span class="sourceLineNo">6150</span>  @Test<a name="line.6150"></a>
+<span class="sourceLineNo">6151</span>  public void testCheckAndRowMutateTimestampsAreMonotonic() throws IOException {<a name="line.6151"></a>
+<span class="sourceLineNo">6152</span>    region = initHRegion(tableName, method, CONF, fam1);<a name="line.6152"></a>
+<span class="sourceLineNo">6153</span>    ManualEnvironmentEdge edge = new ManualEnvironmentEdge();<a name="line.6153"></a>
+<span class="sourceLineNo">6154</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.6154"></a>
+<span class="sourceLineNo">6155</span><a name="line.6155"></a>
+<span class="sourceLineNo">6156</span>    edge.setValue(10);<a name="line.6156"></a>
+<span class="sourceLineNo">6157</span>    Put p = new Put(row);<a name="line.6157"></a>
+<span class="sourceLineNo">6158</span>    p.setDurability(Durability.SKIP_WAL);<a name="line.6158"></a>
+<span class="sourceLineNo">6159</span>    p.addColumn(fam1, qual1, qual1);<a name="line.6159"></a>
+<span class="sourceLineNo">6160</span>    region.put(p);<a name="line.6160"></a>
+<span class="sourceLineNo">6161</span><a name="line.6161"></a>
+<span class="sourceLineNo">6162</span>    Result result = region.get(new Get(row));<a name="line.6162"></a>
+<span class="sourceLineNo">6163</span>    Cell c = result.getColumnLatestCell(fam1, qual1);<a name="line.6163"></a>
+<span class="sourceLineNo">6164</span>    assertNotNull(c);<a name="line.6164"></a>
+<span class="sourceLineNo">6165</span>    assertEquals(10L, c.getTimestamp());<a name="line.6165"></a>
+<span class="sourceLineNo">6166</span><a name="line.6166"></a>
+<span class="sourceLineNo">6167</span>    edge.setValue(1); // clock goes back<a name="line.6167"></a>
+<span class="sourceLineNo">6168</span>    p = new Put(row);<a name="line.6168"></a>
+<span class="sourceLineNo">6169</span>    p.setDurability(Durability.SKIP_WAL);<a name="line.6169"></a>
+<span class="sourceLineNo">6170</span>    p.addColumn(fam1, qual1, qual2);<a name="line.6170"></a>
+<span class="sourceLineNo">6171</span>    RowMutations rm = new RowMutations(row);<a name="line.6171"></a>
+<span class="sourceLineNo">6172</span>    rm.add(p);<a name="line.6172"></a>
+<span class="sourceLineNo">6173</span>    assertTrue(region.checkAndRowMutate(row, fam1, qual1, CompareOperator.EQUAL,<a name="line.6173"></a>
+<span class="sourceLineNo">6174</span>        new BinaryComparator(qual1), rm));<a name="line.6174"></a>
+<span class="sourceLineNo">6175</span>    result = region.get(new Get(row));<a name="line.6175"></a>
+<span class="sourceLineNo">6176</span>    c = result.getColumnLatestCell(fam1, qual1);<a name="line.6176"></a>
+<span class="sourceLineNo">6177</span>    assertEquals(10L, c.getTimestamp());<a name="line.6177"></a>
+<span class="sourceLineNo">6178</span>    LOG.info("c value " +<a name="line.6178"></a>
+<span class="sourceLineNo">6179</span>      Bytes.toStringBinary(c.getValueArray(), c.getValueOffset(), c.getValueLength()));<a name="line.6179"></a>
 <span class="sourceLineNo">6180</span><a name="line.6180"></a>
-<span class="sourceLineNo">6181</span>  /**<a name="line.6181"></a>
-<span class="sourceLineNo">6182</span>   * HBASE-16429 Make sure no stuck if roll writer when ring buffer is filled with appends<a name="line.6182"></a>
-<span class="sourceLineNo">6183</span>   * @throws IOException if IO error occurred during test<a name="line.6183"></a>
-<span class="sourceLineNo">6184</span>   */<a name="line.6184"></a>
-<span class="sourceLineNo">6185</span>  @Test<a name="line.6185"></a>
-<span class="sourceLineNo">6186</span>  public void testWritesWhileRollWriter() throws IOException {<a name="line.6186"></a>
-<span class="sourceLineNo">6187</span>    int testCount = 10;<a name="line.6187"></a>
-<span class="sourceLineNo">6188</span>    int numRows = 1024;<a name="line.6188"></a>
-<span class="sourceLineNo">6189</span>    int numFamilies = 2;<a name="line.6189"></a>
-<span class="sourceLineNo">6190</span>    int numQualifiers = 2;<a name="line.6190"></a>
-<span class="sourceLineNo">6191</span>    final byte[][] families = new byte[numFamilies][];<a name="line.6191"></a>
-<span class="sourceLineNo">6192</span>    for (int i = 0; i &lt; numFamilies; i++) {<a name="line.6192"></a>
-<span class="sourceLineNo">6193</span>      families[i] = Bytes.toBytes("family" + i);<a name="line.6193"></a>
-<span class="sourceLineNo">6194</span>    }<a name="line.6194"></a>
-<span class="sourceLineNo">6195</span>    final byte[][] qualifiers = new byte[numQualifiers][];<a name="line.6195"></a>
-<span class="sourceLineNo">6196</span>    for (int i = 0; i &lt; numQualifiers; i++) {<a name="line.6196"></a>
-<span class="sourceLineNo">6197</span>      qualifiers[i] = Bytes.toBytes("qual" + i);<a name="line.6197"></a>
-<span class="sourceLineNo">6198</span>    }<a name="line.6198"></a>
-<span class="sourceLineNo">6199</span><a name="line.6199"></a>
-<span class="sourceLineNo">6200</span>    CONF.setInt("hbase.regionserver.wal.disruptor.event.count", 2);<a name="line.6200"></a>
-<span class="sourceLineNo">6201</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.6201"></a>
-<span class="sourceLineNo">6202</span>    try {<a name="line.6202"></a>
-<span class="sourceLineNo">6203</span>      List&lt;Thread&gt; threads = new ArrayList&lt;&gt;();<a name="line.6203"></a>
-<span class="sourceLineNo">6204</span>      for (int i = 0; i &lt; numRows; i++) {<a name="line.6204"></a>
-<span class="sourceLineNo">6205</span>        final int count = i;<a name="line.6205"></a>
-<span class="sourceLineNo">6206</span>        Thread t = new Thread(new Runnable() {<a name="line.6206"></a>
-<span class="sourceLineNo">6207</span><a name="line.6207"></a>
-<span class="sourceLineNo">6208</span>          @Override<a name="line.6208"></a>
-<span class="sourceLineNo">6209</span>          public void run() {<a name="line.6209"></a>
-<span class="sourceLineNo">6210</span>            byte[] row = Bytes.toBytes("row" + count);<a name="line.6210"></a>
-<span class="sourceLineNo">6211</span>            Put put = new Put(row);<a name="line.6211"></a>
-<span class="sourceLineNo">6212</span>            put.setDurability(Durability.SYNC_WAL);<a name="line.6212"></a>
-<span class="sourceLineNo">6213</span>            byte[] value = Bytes.toBytes(String.valueOf(count));<a name="line.6213"></a>
-<span class="sourceLineNo">6214</span>            for (byte[] family : families) {<a name="line.6214"></a>
-<span class="sourceLineNo">6215</span>              for (byte[] qualifier : qualifiers) {<a name="line.6215"></a>
-<span class="sourceLineNo">6216</span>                put.addColumn(family, qualifier, count, value);<a name="line.6216"></a>
-<span class="sourceLineNo">6217</span>              }<a name="line.6217"></a>
-<span class="sourceLineNo">6218</span>            }<a name="line.6218"></a>
-<span class="sourceLineNo">6219</span>            try {<a name="line.6219"></a>
-<span class="sourceLineNo">6220</span>              region.put(put);<a name="line.6220"></a>
-<span class="sourceLineNo">6221</span>            } catch (IOException e) {<a name="line.6221"></a>
-<span class="sourceLineNo">6222</span>              throw new RuntimeException(e);<a name="line.6222"></a>
-<span class="sourceLineNo">6223</span>            }<a name="line.6223"></a>
-<span class="sourceLineNo">6224</span>          }<a name="line.6224"></a>
-<span class="sourceLineNo">6225</span>        });<a name="line.6225"></a>
-<span class="sourceLineNo">6226</span>        threads.add(t);<a name="line.6226"></a>
-<span class="sourceLineNo">6227</span>      }<a name="line.6227"></a>
-<span class="sourceLineNo">6228</span>      for (Thread t : threads) {<a name="line.6228"></a>
-<span class="sourceLineNo">6229</span>        t.start();<a name="line.6229"></a>
-<span class="sourceLineNo">6230</span>      }<a name="line.6230"></a>
-<span class="sourceLineNo">6231</span><a name="line.6231"></a>
-<span class="sourceLineNo">6232</span>      for (int i = 0; i &lt; testCount; i++) {<a name="line.6232"></a>
-<span class="sourceLineNo">6233</span>        region.getWAL().rollWriter();<a name="line.6233"></a>
-<span class="sourceLineNo">6234</span>        Thread.yield();<a name="line.6234"></a>
-<span class="sourceLineNo">6235</span>      }<a name="line.6235"></a>
-<span class="sourceLineNo">6236</span>    } finally {<a name="line.6236"></a>
-<span class="sourceLineNo">6237</span>      try {<a name="line.6237"></a>
-<span class="sourceLineNo">6238</span>        HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.6238"></a>
-<span class="sourceLineNo">6239</span>        CONF.setInt("hbase.regionserver.wal.disruptor.event.count", 16 * 1024);<a name="line.6239"></a>
-<span class="sourceLineNo">6240</span>      } catch (DroppedSnapshotException dse) {<a name="line.6240"></a>
-<span class="sourceLineNo">6241</span>        // We could get this on way out because we interrupt the background flusher and it could<a name="line.6241"></a>
-<span class="sourceLineNo">6242</span>        // fail anywhere causing a DSE over in the background flusher... only it is not properly<a name="line.6242"></a>
-<span class="sourceLineNo">6243</span>        // dealt with so could still be memory hanging out when we get to here -- memory we can't<a name="line.6243"></a>
-<span class="sourceLineNo">6244</span>        // flush because the accounting is 'off' since original DSE.<a name="line.6244"></a>
+<span class="sourceLineNo">6181</span>    assertTrue(Bytes.equals(c.getValueArray(), c.getValueOffset(), c.getValueLength(),<a name="line.6181"></a>
+<span class="sourceLineNo">6182</span>      qual2, 0, qual2.length));<a name="line.6182"></a>
+<span class="sourceLineNo">6183</span>  }<a name="line.6183"></a>
+<span class="sourceLineNo">6184</span><a name="line.6184"></a>
+<span class="sourceLineNo">6185</span>  HRegion initHRegion(TableName tableName, String callingMethod,<a name="line.6185"></a>
+<span class="sourceLineNo">6186</span>      byte[]... families) throws IOException {<a name="line.6186"></a>
+<span class="sourceLineNo">6187</span>    return initHRegion(tableName, callingMethod, HBaseConfiguration.create(),<a name="line.6187"></a>
+<span class="sourceLineNo">6188</span>        families);<a name="line.6188"></a>
+<span class="sourceLineNo">6189</span>  }<a name="line.6189"></a>
+<span class="sourceLineNo">6190</span><a name="line.6190"></a>
+<span class="sourceLineNo">6191</span>  /**<a name="line.6191"></a>
+<span class="sourceLineNo">6192</span>   * HBASE-16429 Make sure no stuck if roll writer when ring buffer is filled with appends<a name="line.6192"></a>
+<span class="sourceLineNo">6193</span>   * @throws IOException if IO error occurred during test<a name="line.6193"></a>
+<span class="sourceLineNo">6194</span>   */<a name="line.6194"></a>
+<span class="sourceLineNo">6195</span>  @Test<a name="line.6195"></a>
+<span class="sourceLineNo">6196</span>  public void testWritesWhileRollWriter() throws IOException {<a name="line.6196"></a>
+<span class="sourceLineNo">6197</span>    int testCount = 10;<a name="line.6197"></a>
+<span class="sourceLineNo">6198</span>    int numRows = 1024;<a name="line.6198"></a>
+<span class="sourceLineNo">6199</span>    int numFamilies = 2;<a name="line.6199"></a>
+<span class="sourceLineNo">6200</span>    int numQualifiers = 2;<a name="line.6200"></a>
+<span class="sourceLineNo">6201</span>    final byte[][] families = new byte[numFamilies][];<a name="line.6201"></a>
+<span class="sourceLineNo">6202</span>    for (int i = 0; i &lt; numFamilies; i++) {<a name="line.6202"></a>
+<span class="sourceLineNo">6203</span>      families[i] = Bytes.toBytes("family" + i);<a name="line.6203"></a>
+<span class="sourceLineNo">6204</span>    }<a name="line.6204"></a>
+<span class="sourceLineNo">6205</span>    final byte[][] qualifiers = new byte[numQualifiers][];<a name="line.6205"></a>
+<span class="sourceLineNo">6206</span>    for (int i = 0; i &lt; numQualifiers; i++) {<a name="line.6206"></a>
+<span class="sourceLineNo">6207</span>      qualifiers[i] = Bytes.toBytes("qual" + i);<a name="line.6207"></a>
+<span class="sourceLineNo">6208</span>    }<a name="line.6208"></a>
+<span class="sourceLineNo">6209</span><a name="line.6209"></a>
+<span class="sourceLineNo">6210</span>    CONF.setInt("hbase.regionserver.wal.disruptor.event.count", 2);<a name="line.6210"></a>
+<span class="sourceLineNo">6211</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.6211"></a>
+<span class="sourceLineNo">6212</span>    try {<a name="line.6212"></a>
+<span class="sourceLineNo">6213</span>      List&lt;Thread&gt; threads = new ArrayList&lt;&gt;();<a name="line.6213"></a>
+<span class="sourceLineNo">6214</span>      for (int i = 0; i &lt; numRows; i++) {<a name="line.6214"></a>
+<span class="sourceLineNo">6215</span>        final int count = i;<a name="line.6215"></a>
+<span class="sourceLineNo">6216</span>        Thread t = new Thread(new Runnable() {<a name="line.6216"></a>
+<span class="sourceLineNo">6217</span><a name="line.6217"></a>
+<span class="sourceLineNo">6218</span>          @Override<a name="line.6218"></a>
+<span class="sourceLineNo">6219</span>          public void run() {<a name="line.6219"></a>
+<span class="sourceLineNo">6220</span>            byte[] row = Bytes.toBytes("row" + count);<a name="line.6220"></a>
+<span class="sourceLineNo">6221</span>            Put put = new Put(row);<a name="line.6221"></a>
+<span class="sourceLineNo">6222</span>            put.setDurability(Durability.SYNC_WAL);<a name="line.6222"></a>
+<span class="sourceLineNo">6223</span>            byte[] value = Bytes.toBytes(String.valueOf(count));<a name="line.6223"></a>
+<span class="sourceLineNo">6224</span>            for (byte[] family : families) {<a name="line.6224"></a>
+<span class="sourceLineNo">6225</span>              for (byte[] qualifier : qualifiers) {<a name="line.6225"></a>
+<span class="sourceLineNo">6226</span>                put.addColumn(family, qualifier, count, value);<a name="line.6226"></a>
+<span class="sourceLineNo">6227</span>              }<a name="line.6227"></a>
+<span class="sourceLineNo">6228</span>            }<a name="line.6228"></a>
+<span class="sourceLineNo">6229</span>            try {<a name="line.6229"></a>
+<span class="sourceLineNo">6230</span>              region.put(put);<a name="line.6230"></a>
+<span class="sourceLineNo">6231</span>            } catch (IOException e) {<a name="line.6231"></a>
+<span class="sourceLineNo">6232</span>              throw new RuntimeException(e);<a name="line.6232"></a>
+<span class="sourceLineNo">6233</span>            }<a name="line.6233"></a>
+<span class="sourceLineNo">6234</span>          }<a name="line.6234"></a>
+<span class="sourceLineNo">6235</span>        });<a name="line.6235"></a>
+<span class="sourceLineNo">6236</span>        threads.add(t);<a name="line.6236"></a>
+<span class="sourceLineNo">6237</span>      }<a name="line.6237"></a>
+<span class="sourceLineNo">6238</span>      for (Thread t : threads) {<a name="line.6238"></a>
+<span class="sourceLineNo">6239</span>        t.start();<a name="line.6239"></a>
+<span class="sourceLineNo">6240</span>      }<a name="line.6240"></a>
+<span class="sourceLineNo">6241</span><a name="line.6241"></a>
+<span class="sourceLineNo">6242</span>      for (int i = 0; i &lt; testCount; i++) {<a name="line.6242"></a>
+<span class="sourceLineNo">6243</span>        region.getWAL().rollWriter();<a name="line.6243"></a>
+<span class="sourceLineNo">6244</span>        Thread.yield();<a name="line.6244"></a>
 <span class="sourceLineNo">6245</span>      }<a name="line.6245"></a>
-<span class="sourceLineNo">6246</span>      this.region = null;<a name="line.6246"></a>
-<span class="sourceLineNo">6247</span>    }<a name="line.6247"></a>
-<span class="sourceLineNo">6248</span>  }<a name="line.6248"></a>
-<span class="sourceLineNo">6249</span><a name="line.6249"></a>
-<span class="sourceLineNo">6250</span>  @Test<a name="line.6250"></a>
-<span class="sourceLineNo">6251</span>  public void testMutateRow_WriteRequestCount() throws Exception {<a name="line.6251"></a>
-<span class="sourceLineNo">6252</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.6252"></a>
-<span class="sourceLineNo">6253</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.6253"></a>
-<span class="sourceLineNo">6254</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.6254"></a>
-<span class="sourceLineNo">6255</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.6255"></a>
-<span class="sourceLineNo">6256</span><a name="line.6256"></a>
-<span class="sourceLineNo">6257</span>    RowMutations rm = new RowMutations(row1);<a name="line.6257"></a>
-<span class="sourceLineNo">6258</span>    Put put = new Put(row1);<a name="line.6258"></a>
-<span class="sourceLineNo">6259</span>    put.addColumn(fam1, qf1, val1);<a name="line.6259"></a>
-<span class="sourceLineNo">6260</span>    rm.add(put);<a name="line.6260"></a>
-<span class="sourceLineNo">6261</span><a name="line.6261"></a>
-<span class="sourceLineNo">6262</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.6262"></a>
-<span class="sourceLineNo">6263</span>    long wrcBeforeMutate = this.region.writeRequestsCount.longValue();<a name="line.6263"></a>
-<span class="sourceLineNo">6264</span>    this.region.mutateRow(rm);<a name="line.6264"></a>
-<span class="sourceLineNo">6265</span>    long wrcAfterMutate = this.region.writeRequestsCount.longValue();<a name="line.6265"></a>
-<span class="sourceLineNo">6266</span>    Assert.assertEquals(wrcBeforeMutate + rm.getMutations().size(), wrcAfterMutate);<a name="line.6266"></a>
-<span class="sourceLineNo">6267</span>  }<a name="line.6267"></a>
-<span class="sourceLineNo">6268</span><a name="line.6268"></a>
-<span class="sourceLineNo">6269</span>  @Test<a name="line.6269"></a>
-<span class="sourceLineNo">6270</span>  public void testBulkLoadReplicationEnabled() throws IOException {<a name="line.6270"></a>
-<span class="sourceLineNo">6271</span>    TEST_UTIL.getConfiguration().setBoolean(HConstants.REPLICATION_BULKLOAD_ENABLE_KEY, true);<a name="line.6271"></a>
-<span class="sourceLineNo">6272</span>    final ServerName serverName = ServerName.valueOf(name.getMethodName(), 100, 42);<a name="line.6272"></a>
-<span class="sourceLineNo">6273</span>    final RegionServerServices rss = spy(TEST_UTIL.createMockRegionServerService(serverName));<a name="line.6273"></a>
-<span class="sourceLineNo">6274</span><a name="line.6274"></a>
-<span class="sourceLineNo">6275</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.6275"></a>
-<span class="sourceLineNo">6276</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.6276"></a>
-<span class="sourceLineNo">6277</span>    HRegionInfo hri = new HRegionInfo(htd.getTableName(),<a name="line.6277"></a>
-<span class="sourceLineNo">6278</span>        HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY);<a name="line.6278"></a>
-<span class="sourceLineNo">6279</span>    region = HRegion.openHRegion(hri, htd, rss.getWAL(hri), TEST_UTIL.getConfiguration(),<a name="line.6279"></a>
-<span class="sourceLineNo">6280</span>        rss, null);<a name="line.6280"></a>
-<span class="sourceLineNo">6281</span><a name="line.6281"></a>
-<span class="sourceLineNo">6282</span>    assertTrue(region.conf.getBoolean(HConstants.REPLICATION_BULKLOAD_ENABLE_KEY, false));<a name="line.6282"></a>
-<span class="sourceLineNo">6283</span>    String plugins = region.conf.get(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY, "");<a name="line.6283"></a>
-<span class="sourceLineNo">6284</span>    String replicationCoprocessorClass = ReplicationObserver.class.getCanonicalName();<a name="line.6284"></a>
-<span class="sourceLineNo">6285</span>    assertTrue(plugins.contains(replicationCoprocessorClass));<a name="line.6285"></a>
-<span class="sourceLineNo">6286</span>    assertTrue(region.getCoprocessorHost().<a name="line.6286"></a>
-<span class="sourceLineNo">6287</span>        getCoprocessors().contains(ReplicationObserver.class.getSimpleName()));<a name="line.6287"></a>
-<span class="sourceLineNo">6288</span>  }<a name="line.6288"></a>
-<span class="sourceLineNo">6289</span><a name="line.6289"></a>
-<span class="sourceLineNo">6290</span>  // make sure region is success close when coprocessor wrong region open failed<a name="line.6290"></a>
-<span class="sourceLineNo">6291</span>  @Test<a name="line.6291"></a>
-<span class="sourceLineNo">6292</span>  public void testOpenRegionFailedMemoryLeak() throws Exception {<a name="line.6292"></a>
-<span class="sourceLineNo">6293</span>    final ServerName serverName = ServerName.valueOf("testOpenRegionFailed", 100, 42);<a name="line.6293"></a>
-<span class="sourceLineNo">6294</span>    final RegionServerServices rss = spy(TEST_UTIL.createMockRegionServerService(serverName));<a name="line.6294"></a>
-<span class="sourceLineNo">6295</span><a name="line.6295"></a>
-<span class="sourceLineNo">6296</span>    HTableDescriptor htd<a name="line.6296"></a>
-<span class="sourceLineNo">6297</span>      = new HTableDescriptor(TableName.valueOf("testOpenRegionFailed"));<a name="line.6297"></a>
-<span class="sourceLineNo">6298</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.6298"></a>
-<span class="sourceLineNo">6299</span>    htd.setValue("COPROCESSOR$1", "hdfs://test/test.jar|test||");<a name="line.6299"></a>
-<span class="sourceLineNo">6300</span><a name="line.6300"></a>
-<span class="sourceLineNo">6301</span>    HRegionInfo hri = new HRegionInfo(htd.getTableName(),<a name="line.6301"></a>
-<span class="sourceLineNo">6302</span>      HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY);<a name="line.6302"></a>
-<span class="sourceLineNo">6303</span>    ScheduledExecutorService executor = CompatibilitySingletonFactory.<a name="line.6303"></a>
-<span class="sourceLineNo">6304</span>      getInstance(MetricsExecutor.class).getExecutor();<a name="line.6304"></a>
-<span class="sourceLineNo">6305</span>    for (int i = 0; i &lt; 20 ; i++) {<a name="line.6305"></a>
-<span class="sourceLineNo">6306</span>      try {<a name="line.6306"></a>
-<span class="sourceLineNo">6307</span>        HRegion.openHRegion(hri, htd, rss.getWAL(hri),<a name="line.6307"></a>
-<span class="sourceLineNo">6308</span>          TEST_UTIL.getConfiguration(), rss, null);<a name="line.6308"></a>
-<span class="sourceLineNo">6309</span>      }catch(Throwable t){<a name="line.6309"></a>
-<span class="sourceLineNo">6310</span>        LOG.info("Expected exception, continue");<a name="line.6310"></a>
-<span class="sourceLineNo">6311</span>      }<a name="line.6311"></a>
-<span class="sourceLineNo">6312</span>    }<a name="line.6312"></a>
-<span class="sourceLineNo">6313</span>    TimeUnit.SECONDS.sleep(MetricsRegionWrapperImpl.PERIOD);<a name="line.6313"></a>
-<span class="sourceLineNo">6314</span>    Field[] fields = ThreadPoolExecutor.class.getDeclaredFields();<a name="line.6314"></a>
-<span class="sourceLineNo">6315</span>    boolean found = false;<a name="line.6315"></a>
-<span class="sourceLineNo">6316</span>    for(Field field : fields){<a name="line.6316"></a>
-<span class="sourceLineNo">6317</span>      if(field.getName().equals("workQueue")){<a name="line.6317"></a>
-<span class="sourceLineNo">6318</span>        field.setAccessible(true);<a name="line.6318"></a>
-<span class="sourceLineNo">6319</span>        BlockingQueue&lt;Runnable&gt; workQueue = (BlockingQueue&lt;Runnable&gt;)field.get(executor);<a name="line.6319"></a>
-<span class="sourceLineNo">6320</span>        //there are still two task not cancel, can not cause to memory lack<a name="line.6320"></a>
-<span class="sourceLineNo">6321</span>        Assert.assertTrue("ScheduledExecutor#workQueue should equals 2, now is " +<a name="line.6321"></a>
-<span class="sourceLineNo">6322</span>          workQueue.size() + ", please check region is close", 2 == workQueue.size());<a name="line.6322"></a>
-<span class="sourceLineNo">6323</span>        found = true;<a name="line.6323"></a>
-<span class="sourceLineNo">6324</span>      }<a name="line.6324"></a>
-<span class="sourceLineNo">6325</span>    }<a name="line.6325"></a>
-<span class="sourceLineNo">6326</span>    Assert.assertTrue("can not find workQueue, test failed", found);<a name="line.6326"></a>
-<span class="sourceLineNo">6327</span>  }<a name="line.6327"></a>
-<span class="sourceLineNo">6328</span><a name="line.6328"></a>
-<span class="sourceLineNo">6329</span>  /**<a name="line.6329"></a>
-<span class="sourceLineNo">6330</span>   * The same as HRegion class, the only difference is that instantiateHStore will<a name="line.6330"></a>
-<span class="sourceLineNo">6331</span>   * create a different HStore - HStoreForTesting. [HBASE-8518]<a name="line.6331"></a>
-<span class="sourceLineNo">6332</span>   */<a name="line.6332"></a>
-<span class="sourceLineNo">6333</span>  public static class HRegionForTesting extends HRegion {<a name="line.6333"></a>
-<span class="sourceLineNo">6334</span><a name="line.6334"></a>
-<span class="sourceLineNo">6335</span>    public HRegionForTesting(final Path tableDir, final WAL wal, final FileSystem fs,<a name="line.6335"></a>
-<span class="sourceLineNo">6336</span>                             final Configuration confParam, final RegionInfo regionInfo,<a name="line.6336"></a>
-<span class="sourceLineNo">6337</span>                             final TableDescriptor htd, final RegionServerServices rsServices) {<a name="line.6337"></a>
-<span class="sourceLineNo">6338</span>      this(new HRegionFileSystem(confParam, fs, tableDir, regionInfo),<a name="line.6338"></a>
-<span class="sourceLineNo">6339</span>          wal, confParam, htd, rsServices);<a name="line.6339"></a>
-<span class="sourceLineNo">6340</span>    }<a name="line.6340"></a>
-<span class="sourceLineNo">6341</span><a name="line.6341"></a>
-<span class="sourceLineNo">6342</span>    public HRegionForTesting(HRegionFileSystem fs, WAL wal,<a name="line.6342"></a>
-<span class="sourceLineNo">6343</span>                             Configuration confParam, TableDescriptor htd,<a name="line.6343"></a>
-<span class="sourceLineNo">6344</span>                             RegionServerServices rsServices) {<a name="line.6344"></a>
-<span class="sourceLineNo">6345</span>      super(fs, wal, confParam, htd, rsServices);<a name="line.6345"></a>
-<span class="sourceLineNo">6346</span>    }<a name="line.6346"></a>
-<span class="sourceLineNo">6347</span><a name="line.6347"></a>
-<span class="sourceLineNo">6348</span>    /**<a name="line.6348"></a>
-<span class="sourceLineNo">6349</span>     * Create HStore instance.<a name="line.6349"></a>
-<span class="sourceLineNo">6350</span>     * @return If Mob is enabled, return HMobStore, otherwise return HStoreForTesting.<a name="line.6350"></a>
-<span class="sourceLineNo">6351</span>     */<a name="line.6351"></a>
-<span class="sourceLineNo">6352</span>    @Override<a name="line.6352"></a>
-<span class="sourceLineNo">6353</span>    protected HStore instantiateHStore(final ColumnFamilyDescriptor family, boolean warmup)<a name="line.6353"></a>
-<span class="sourceLineNo">6354</span>        throws IOException {<a name="line.6354"></a>
-<span class="sourceLineNo">6355</span>      if (family.isMobEnabled()) {<a name="line.6355"></a>
-<span class="sourceLineNo">6356</span>        if (HFile.getFormatVersion(this.conf) &lt; HFile.MIN_FORMAT_VERSION_WITH_TAGS) {<a name="line.6356"></a>
-<span class="sourceLineNo">6357</span>          throw new IOException("A minimum HFile version of " + HFile.MIN_FORMAT_VERSION_WITH_TAGS +<a name="line.6357"></a>
-<span class="sourceLineNo">6358</span>              " is required for MOB feature. Consider setting " + HFile.FORMAT_VERSION_KEY +<a name="line.6358"></a>
-<span class="sourceLineNo">6359</span>              " accordingly.");<a name="line.6359"></a>
-<span class="sourceLineNo">6360</span>        }<a name="line.6360"></a>
-<span class="sourceLineNo">6361</span>        return new HMobStore(this, family, this.conf, warmup);<a name="line.6361"></a>
-<span class="sourceLineNo">6362</span>      }<a name="line.6362"></a>
-<span class="sourceLineNo">6363</span>      return new HStoreForTesting(this, family, this.conf, warmup);<a name="line.6363"></a>
-<span class="sourceLineNo">6364</span>    }<a name="line.6364"></a>
-<span class="sourceLineNo">6365</span>  }<a name="line.6365"></a>
-<span class="sourceLineNo">6366</span><a name="line.6366"></a>
-<span class="sourceLineNo">6367</span>  /**<a name="line.6367"></a>
-<span class="sourceLineNo">6368</span>   * HStoreForTesting is merely the same as HStore, the difference is in the doCompaction method<a name="line.6368"></a>
-<span class="sourceLineNo">6369</span>   * of HStoreForTesting there is a checkpoint "hbase.hstore.compaction.complete" which<a name="line.6369"></a>
-<span class="sourceLineNo">6370</span>   * doesn't let hstore compaction complete. In the former edition, this config is set in<a name="line.6370"></a>
-<span class="sourceLineNo">6371</span>   * HStore class inside compact method, though this is just for testing, otherwise it<a name="line.6371"></a>
-<span class="sourceLineNo">6372</span>   * doesn't do any help. In HBASE-8518, we try to get rid of all "hbase.hstore.compaction.complete"<a name="line.6372"></a>
-<span class="sourceLineNo">6373</span>   * config (except for testing code).<a name="line.6373"></a>
-<span class="sourceLineNo">6374</span>   */<a name="line.6374"></a>
-<span class="sourceLineNo">6375</span>  public static class HStoreForTesting extends HStore {<a name="line.6375"></a>
+<span class="sourceLineNo">6246</span>    } finally {<a name="line.6246"></a>
+<span class="sourceLineNo">6247</span>      try {<a name="line.6247"></a>
+<span class="sourceLineNo">6248</span>        HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.6248"></a>
+<span class="sourceLineNo">6249</span>        CONF.setInt("hbase.regionserver.wal.disruptor.event.count", 16 * 1024);<a name="line.6249"></a>
+<span class="sourceLineNo">6250</span>      } catch (DroppedSnapshotException dse) {<a name="line.6250"></a>
+<span class="sourceLineNo">6251</span>        // We could get this on way out because we interrupt the background flusher and it could<a name="line.6251"></a>
+<span class="sourceLineNo">6252</span>        // fail anywhere causing a DSE over in the background flusher... only it is not properly<a name="line.6252"></a>
+<span class="sourceLineNo">6253</span>        // dealt with so could still be memory hanging out when we get to here -- memory we can't<a name="line.6253"></a>
+<span class="sourceLineNo">6254</span>        // flush because the accounting is 'off' since original DSE.<a name="line.6254"></a>
+<span class="sourceLineNo">6255</span>      }<a name="line.6255"></a>
+<span class="sourceLineNo">6256</span>      this.region = null;<a name="line.6256"></a>
+<span class="sourceLineNo">6257</span>    }<a name="line.6257"></a>
+<span class="sourceLineNo">6258</span>  }<a name="line.6258"></a>
+<span class="sourceLineNo">6259</span><a name="line.6259"></a>
+<span class="sourceLineNo">6260</span>  @Test<a name="line.6260"></a>
+<span class="sourceLineNo">6261</span>  public void testMutateRow_WriteRequestCount() throws Exception {<a name="line.6261"></a>
+<span class="sourceLineNo">6262</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.6262"></a>
+<span class="sourceLineNo">6263</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.6263"></a>
+<span class="sourceLineNo">6264</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.6264"></a>
+<span class="sourceLineNo">6265</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.6265"></a>
+<span class="sourceLineNo">6266</span><a name="line.6266"></a>
+<span class="sourceLineNo">6267</span>    RowMutations rm = new RowMutations(row1);<a name="line.6267"></a>
+<span class="sourceLineNo">6268</span>    Put put = new Put(row1);<a name="line.6268"></a>
+<span class="sourceLineNo">6269</span>    put.addColumn(fam1, qf1, val1);<a name="line.6269"></a>
+<span class="sourceLineNo">6270</span>    rm.add(put);<a name="line.6270"></a>
+<span class="sourceLineNo">6271</span><a name="line.6271"></a>
+<span class="sourceLineNo">6272</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.6272"></a>
+<span class="sourceLineNo">6273</span>    long wrcBeforeMutate = this.region.writeRequestsCount.longValue();<a name="line.6273"></a>
+<span class="sourceLineNo">6274</span>    this.region.mutateRow(rm);<a name="line.6274"></a>
+<span class="sourceLineNo">6275</span>    long wrcAfterMutate = this.region.writeRequestsCount.longValue();<a name="line.6275"></a>
+<span class="sourceLineNo">6276</span>    Assert.assertEquals(wrcBeforeMutate + rm.getMutations().size(), wrcAfterMutate);<a name="line.6276"></a>
+<span class="sourceLineNo">6277</span>  }<a name="line.6277"></a>
+<span class="sourceLineNo">6278</span><a name="line.6278"></a>
+<span class="sourceLineNo">6279</span>  @Test<a name="line.6279"></a>
+<span class="sourceLineNo">6280</span>  public void testBulkLoadReplicationEnabled() throws IOException {<a name="line.6280"></a>
+<span class="sourceLineNo">6281</span>    TEST_UTIL.getConfiguration().setBoolean(HConstants.REPLICATION_BULKLOAD_ENABLE_KEY, true);<a name="line.6281"></a>
+<span class="sourceLineNo">6282</span>    final ServerName serverName = ServerName.valueOf(name.getMethodName(), 100, 42);<a name="line.6282"></a>
+<span class="sourceLineNo">6283</span>    final RegionServerServices rss = spy(TEST_UTIL.createMockRegionServerService(serverName));<a name="line.6283"></a>
+<span class="sourceLineNo">6284</span><a name="line.6284"></a>
+<span class="sourceLineNo">6285</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.6285"></a>
+<span class="sourceLineNo">6286</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.6286"></a>
+<span class="sourceLineNo">6287</span>    HRegionInfo hri = new HRegionInfo(htd.getTableName(),<a name="line.6287"></a>
+<span class="sourceLineNo">6288</span>        HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY);<a name="line.6288"></a>
+<span class="sourceLineNo">6289</span>    region = HRegion.openHRegion(hri, htd, rss.getWAL(hri), TEST_UTIL.getConfiguration(),<a name="line.6289"></a>
+<span class="sourceLineNo">6290</span>        rss, null);<a name="line.6290"></a>
+<span class="sourceLineNo">6291</span><a name="line.6291"></a>
+<span class="sourceLineNo">6292</span>    assertTrue(region.conf.getBoolean(HConstants.REPLICATION_BULKLOAD_ENABLE_KEY, false));<a name="line.6292"></a>
+<span class="sourceLineNo">6293</span>    String plugins = region.conf.get(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY, "");<a name="line.6293"></a>
+<span class="sourceLineNo">6294</span>    String replicationCoprocessorClass = ReplicationObserver.class.getCanonicalName();<a name="line.6294"></a>
+<span class="sourceLineNo">6295</span>    assertTrue(plugins.contains(replicationCoprocessorClass));<a name="line.6295"></a>
+<span class="sourceLineNo">6296</span>    assertTrue(region.getCoprocessorHost().<a name="line.6296"></a>
+<span class="sourceLineNo">6297</span>        getCoprocessors().contains(ReplicationObserver.class.getSimpleName()));<a name="line.6297"></a>
+<span class="sourceLineNo">6298</span>  }<a name="line.6298"></a>
+<span class="sourceLineNo">6299</span><a name="line.6299"></a>
+<span class="sourceLineNo">6300</span>  // make sure region is success close when coprocessor wrong region open failed<a name="line.6300"></a>
+<span class="sourceLineNo">6301</span>  @Test<a name="line.6301"></a>
+<span class="sourceLineNo">6302</span>  public void testOpenRegionFailedMemoryLeak() throws Exception {<a name="line.6302"></a>
+<span class="sourceLineNo">6303</span>    final ServerName serverName = ServerName.valueOf("testOpenRegionFailed", 100, 42);<a name="line.6303"></a>
+<span class="sourceLineNo">6304</span>    final RegionServerServices rss = spy(TEST_UTIL.createMockRegionServerService(serverName));<a name="line.6304"></a>
+<span class="sourceLineNo">6305</span><a name="line.6305"></a>
+<span class="sourceLineNo">6306</span>    HTableDescriptor htd<a name="line.6306"></a>
+<span class="sourceLineNo">6307</span>      = new HTableDescriptor(TableName.valueOf("testOpenRegionFailed"));<a name="line.6307"></a>
+<span class="sourceLineNo">6308</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.6308"></a>
+<span class="sourceLineNo">6309</span>    htd.setValue("COPROCESSOR$1", "hdfs://test/test.jar|test||");<a name="line.6309"></a>
+<span class="sourceLineNo">6310</span><a name="line.6310"></a>
+<span class="sourceLineNo">6311</span>    HRegionInfo hri = new HRegionInfo(htd.getTableName(),<a name="line.6311"></a>
+<span class="sourceLineNo">6312</span>      HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY);<a name="line.6312"></a>
+<span class="sourceLineNo">6313</span>    ScheduledExecutorService executor = CompatibilitySingletonFactory.<a name="line.6313"></a>
+<span class="sourceLineNo">6314</span>      getInstance(MetricsExecutor.class).getExecutor();<a name="line.6314"></a>
+<span class="sourceLineNo">6315</span>    for (int i = 0; i &lt; 20 ; i++) {<a name="line.6315"></a>
+<span class="sourceLineNo">6316</span>      try {<a name="line.6316"></a>
+<span class="sourceLineNo">6317</span>        HRegion.openHRegion(hri, htd, rss.getWAL(hri),<a name="line.6317"></a>
+<span class="sourceLineNo">6318</span>          TEST_UTIL.getConfiguration(), rss, null);<a name="line.6318"></a>
+<span class="sourceLineNo">6319</span>      }catch(Throwable t){<a name="line.6319"></a>
+<span class="sourceLineNo">6320</span>        LOG.info("Expected exception, continue");<a name="line.6320"></a>
+<span class="sourceLineNo">6321</span>      }<a name="line.6321"></a>
+<span class="sourceLineNo">6322</span>    }<a name="line.6322"></a>
+<span class="sourceLineNo">6323</span>    TimeUnit.SECONDS.sleep(MetricsRegionWrapperImpl.PERIOD);<a name="line.6323"></a>
+<span class="sourceLineNo">6324</span>    Field[] fields = ThreadPoolExecutor.class.getDeclaredFields();<a name="line.6324"></a>
+<span class="sourceLineNo">6325</span>    boolean found = false;<a name="line.6325"></a>
+<span class="sourceLineNo">6326</span>    for(Field field : fields){<a name="line.6326"></a>
+<span class="sourceLineNo">6327</span>      if(field.getName().equals("workQueue")){<a name="line.6327"></a>
+<span class="sourceLineNo">6328</span>        field.setAccessible(true);<a name="line.6328"></a>
+<span class="sourceLineNo">6329</span>        BlockingQueue&lt;Runnable&gt; workQueue = (BlockingQueue&lt;Runnable&gt;)field.get(executor);<a name="line.6329"></a>
+<span class="sourceLineNo">6330</span>        //there are still two task not cancel, can not cause to memory lack<a name="line.6330"></a>
+<span class="sourceLineNo">6331</span>        Assert.assertTrue("ScheduledExecutor#workQueue should equals 2, now is " +<a name="line.6331"></a>
+<span class="sourceLineNo">6332</span>          workQueue.size() + ", please check region is close", 2 == workQueue.size());<a name="line.6332"></a>
+<span class="sourceLineNo">6333</span>        found = true;<a name="line.6333"></a>
+<span class="sourceLineNo">6334</span>      }<a name="line.6334"></a>
+<span class="sourceLineNo">6335</span>    }<a name="line.6335"></a>
+<span class="sourceLineNo">6336</span>    Assert.assertTrue("can not find workQueue, test failed", found);<a name="line.6336"></a>
+<span class="sourceLineNo">6337</span>  }<a name="line.6337"></a>
+<span class="sourceLineNo">6338</span><a name="line.6338"></a>
+<span class="sourceLineNo">6339</span>  /**<a name="line.6339"></a>
+<span class="sourceLineNo">6340</span>   * The same as HRegion class, the only difference is that instantiateHStore will<a name="line.6340"></a>
+<span class="sourceLineNo">6341</span>   * create a different HStore - HStoreForTesting. [HBASE-8518]<a name="line.6341"></a>
+<span class="sourceLineNo">6342</span>   */<a name="line.6342"></a>
+<span class="sourceLineNo">6343</span>  public static class HRegionForTesting extends HRegion {<a name="line.6343"></a>
+<span class="sourceLineNo">6344</span><a name="line.6344"></a>
+<span class="sourceLineNo">6345</span>    public HRegionForTesting(final Path tableDir, final WAL wal, final FileSystem fs,<a name="line.6345"></a>
+<span class="sourceLineNo">6346</span>                             final Configuration confParam, final RegionInfo regionInfo,<a name="line.6346"></a>
+<span class="sourceLineNo">6347</span>                             final TableDescriptor htd, final RegionServerServices rsServices) {<a name="line.6347"></a>
+<span class="sourceLineNo">6348</span>      this(new HRegionFileSystem(confParam, fs, tableDir, regionInfo),<a name="line.6348"></a>
+<span class="sourceLineNo">6349</span>          wal, confParam, htd, rsServices);<a name="line.6349"></a>
+<span class="sourceLineNo">6350</span>    }<a name="line.6350"></a>
+<span class="sourceLineNo">6351</span><a name="line.6351"></a>
+<span class="sourceLineNo">6352</span>    public HRegionForTesting(HRegionFileSystem fs, WAL wal,<a name="line.6352"></a>
+<span class="sourceLineNo">6353</span>                             Configuration confParam, TableDescriptor htd,<a name="line.6353"></a>
+<span class="sourceLineNo">6354</span>                             RegionServerServices rsServices) {<a name="line.6354"></a>
+<span class="sourceLineNo">6355</span>      super(fs, wal, confParam, htd, rsServices);<a name="line.6355"></a>
+<span class="sourceLineNo">6356</span>    }<a name="line.6356"></a>
+<span class="sourceLineNo">6357</span><a name="line.6357"></a>
+<span class="sourceLineNo">6358</span>    /**<a name="line.6358"></a>
+<span class="sourceLineNo">6359</span>     * Create HStore instance.<a name="line.6359"></a>
+<span class="sourceLineNo">6360</span>     * @return If Mob is enabled, return HMobStore, otherwise return HStoreForTesting.<a name="line.6360"></a>
+<span class="sourceLineNo">6361</span>     */<a name="line.6361"></a>
+<span class="sourceLineNo">6362</span>    @Override<a name="line.6362"></a>
+<span class="sourceLineNo">6363</span>    protected HStore instantiateHStore(final ColumnFamilyDescriptor family, boolean warmup)<a name="line.6363"></a>
+<span class="sourceLineNo">6364</span>        throws IOException {<a name="line.6364"></a>
+<span class="sourceLineNo">6365</span>      if (family.isMobEnabled()) {<a name="line.6365"></a>
+<span class="sourceLineNo">6366</span>        if (HFile.getFormatVersion(this.conf) &lt; HFile.MIN_FORMAT_VERSION_WITH_TAGS) {<a name="line.6366"></a>
+<span class="sourceLineNo">6367</span>          throw new IOException("A minimum HFile version of " + HFile.MIN_FORMAT_VERSION_WITH_TAGS +<a name="line.6367"></a>
+<span class="sourceLineNo">6368</span>              " is required for MOB feature. Consider setting " + HFile.FORMAT_VERSION_KEY +<a name="line.6368"></a>
+<span class="sourceLineNo">6369</span>              " accordingly.");<a name="line.6369"></a>
+<span class="sourceLineNo">6370</span>        }<a name="line.6370"></a>
+<span class="sourceLineNo">6371</span>        return new HMobStore(this, family, this.conf, warmup);<a name="line.6371"></a>
+<span class="sourceLineNo">6372</span>      }<a name="line.6372"></a>
+<span class="sourceLineNo">6373</span>      return new HStoreForTesting(this, family, this.conf, warmup);<a name="line.6373"></a>
+<span class="sourceLineNo">6374</span>    }<a name="line.6374"></a>
+<span class="sourceLineNo">6375</span>  }<a name="line.6375"></a>
 <span class="sourceLineNo">6376</span><a name="line.6376"></a>
-<span class="sourceLineNo">6377</span>    protected HStoreForTesting(final HRegion region,<a name="line.6377"></a>
-<span class="sourceLineNo">6378</span>        final ColumnFamilyDescriptor family,<a name="line.6378"></a>
-<span class="sourceLineNo">6379</span>        final Configuration confParam, boolean warmup) throws IOException {<a name="line.6379"></a>
-<span class="sourceLineNo">6380</span>      super(region, family, confParam, warmup);<a name="line.6380"></a>
-<span class="sourceLineNo">6381</span>    }<a name="line.6381"></a>
-<span class="sourceLineNo">6382</span><a name="line.6382"></a>
-<span class="sourceLineNo">6383</span>    @Override<a name="line.6383"></a>
-<span class="sourceLineNo">6384</span>    protected List&lt;HStoreFile&gt; doCompaction(CompactionRequestImpl cr,<a name="line.6384"></a>
-<span class="sourceLineNo">6385</span>        Collection&lt;HStoreFile&gt; filesToCompact, User user, long compactionStartTime,<a name="line.6385"></a>
-<span class="sourceLineNo">6386</span>        List&lt;Path&gt; newFiles) throws IOException {<a name="line.6386"></a>
-<span class="sourceLineNo">6387</span>      // let compaction incomplete.<a name="line.6387"></a>
-<span class="sourceLineNo">6388</span>      if (!this.conf.getBoolean("hbase.hstore.compaction.complete", true)) {<a name="line.6388"></a>
-<span class="sourceLineNo">6389</span>        LOG.warn("hbase.hstore.compaction.complete is set to false");<a name="line.6389"></a>
-<span class="sourceLineNo">6390</span>        List&lt;HStoreFile&gt; sfs = new ArrayList&lt;&gt;(newFiles.size());<a name="line.6390"></a>
-<span class="sourceLineNo">6391</span>        final boolean evictOnClose =<a name="line.6391"></a>
-<span class="sourceLineNo">6392</span>            cacheConf != null? cacheConf.shouldEvictOnClose(): true;<a name="line.6392"></a>
-<span class="sourceLineNo">6393</span>        for (Path newFile : newFiles) {<a name="line.6393"></a>
-<span class="sourceLineNo">6394</span>          // Create storefile around what we wrote with a reader on it.<a name="line.6394"></a>
-<span class="sourceLineNo">6395</span>          HStoreFile sf = createStoreFileAndReader(newFile);<a name="line.6395"></a>
-<span class="sourceLineNo">6396</span>          sf.closeStoreFile(evictOnClose);<a name="line.6396"></a>
-<span class="sourceLineNo">6397</span>          sfs.add(sf);<a name="line.6397"></a>
-<span class="sourceLineNo">6398</span>        }<a name="line.6398"></a>
-<span class="sourceLineNo">6399</span>        return sfs;<a name="line.6399"></a>
-<span class="sourceLineNo">6400</span>      }<a name="line.6400"></a>
-<span class="sourceLineNo">6401</span>      return super.doCompaction(cr, filesToCompact, user, compactionStartTime, newFiles);<a name="line.6401"></a>
-<span class="sourceLineNo">6402</span>    }<a name="line.6402"></a>
-<span class="sourceLineNo">6403</span>  }<a name="line.6403"></a>
-<span class="sourceLineNo">6404</span>}<a name="line.6404"></a>
+<span class="sourceLineNo">6377</span>  /**<a name="line.6377"></a>
+<span class="sourceLineNo">6378</span>   * HStoreForTesting is merely the same as HStore, the difference is in the doCompaction method<a name="line.6378"></a>
+<span class="sourceLineNo">6379</span>   * of HStoreForTesting there is a checkpoint "hbase.hstore.compaction.complete" which<a name="line.6379"></a>
+<span class="sourceLineNo">6380</span>   * doesn't let hstore compaction complete. In the former edition, this config is set in<a name="line.6380"></a>
+<span class="sourceLineNo">6381</span>   * HStore class inside compact method, though this is just for testing, otherwise it<a name="line.6381"></a>
+<span class="sourceLineNo">6382</span>   * doesn't do any help. In HBASE-8518, we try to get rid of all "hbase.hstore.compaction.complete"<a name="line.6382"></a>
+<span class="sourceLineNo">6383</span>   * config (except for testing code).<a name="line.6383"></a>
+<span class="sourceLineNo">6384</span>   */<a name="line.6384"></a>
+<span class="sourceLineNo">6385</span>  public static class HStoreForTesting extends HStore {<a name="line.6385"></a>
+<span class="sourceLineNo">6386</span><a name="line.6386"></a>
+<span class="sourceLineNo">6387</span>    protected HStoreForTesting(final HRegion region,<a name="line.6387"></a>
+<span class="sourceLineNo">6388</span>        final ColumnFamilyDescriptor family,<a name="line.6388"></a>
+<span class="sourceLineNo">6389</span>        final Configuration confParam, boolean warmup) throws IOException {<a name="line.6389"></a>
+<span class="sourceLineNo">6390</span>      super(region, family, confParam, warmup);<a name="line.6390"></a>
+<span class="sourceLineNo">6391</span>    }<a name="line.6391"></a>
+<span class="sourceLineNo">6392</span><a name="line.6392"></a>
+<span class="sourceLineNo">6393</span>    @Override<a name="line.6393"></a>
+<span class="sourceLineNo">6394</span>    protected List&lt;HStoreFile&gt; doCompaction(CompactionRequestImpl cr,<a name="line.6394"></a>
+<span class="sourceLineNo">6395</span>        Collection&lt;HStoreFile&gt; filesToCompact, User user, long compactionStartTime,<a name="line.6395"></a>
+<span class="sourceLineNo">6396</span>        List&lt;Path&gt; newFiles) throws IOException {<a name="line.6396"></a>
+<span class="sourceLineNo">6397</span>      // let compaction incomplete.<a name="line.6397"></a>
+<span class="sourceLineNo">6398</span>      if (!this.conf.getBoolean("hbase.hstore.compaction.complete", true)) {<a name="line.6398"></a>
+<span class="sourceLineNo">6399</span>        LOG.warn("hbase.hstore.compaction.complete is set to false");<a name="line.6399"></a>
+<span class="sourceLineNo">6400</span>        List&lt;HStoreFile&gt; sfs = new ArrayList&lt;&gt;(newFiles.size());<a name="line.6400"></a>
+<span class="sourceLineNo">6401</span>        final boolean evictOnClose =<a name="line.6401"></a>
+<span class="sourceLineNo">6402</span>            cacheConf != null? cacheConf.shouldEvictOnClose(): true;<a name="line.6402"></a>
+<span class="sourceLineNo">6403</span>        for (Path newFile : newFiles) {<a name="line.6403"></a>
+<span class="sourceLineNo">6404</span>          // Create storefile around what we wrote with a reader on it.<a name="line.6404"></a>
+<span class="sourceLineNo">6405</span>          HStoreFile sf = createStoreFileAndReader(newFile);<a name="line.6405"></a>
+<span class="sourceLineNo">6406</span>          sf.closeStoreFile(evictOnClose);<a name="line.6406"></a>
+<span class="sourceLineNo">6407</span>          sfs.add(sf);<a name="line.6407"></a>
+<span class="sourceLineNo">6408</span>        }<a name="line.6408"></a>
+<span class="sourceLineNo">6409</span>        return sfs;<a name="line.6409"></a>
+<span class="sourceLineNo">6410</span>      }<a name="line.6410"></a>
+<span class="sourceLineNo">6411</span>      return super.doCompaction(cr, filesToCompact, user, compactionStartTime, newFiles);<a name="line.6411"></a>
+<span class="sourceLineNo">6412</span>    }<a name="line.6412"></a>
+<span class="sourceLineNo">6413</span>  }<a name="line.6413"></a>
+<span class="sourceLineNo">6414</span>}<a name="line.6414"></a>
 
 
 
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Incrementer.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Incrementer.html
index ddde350..77be719 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Incrementer.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.Incrementer.html
@@ -112,68 +112,68 @@
 <span class="sourceLineNo">104</span>import org.apache.hadoop.hbase.Waiter;<a name="line.104"></a>
 <span class="sourceLineNo">105</span>import org.apache.hadoop.hbase.client.Append;<a name="line.105"></a>
 <span class="sourceLineNo">106</span>import org.apache.hadoop.hbase.client.ColumnFamilyDescriptor;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.apache.hadoop.hbase.client.Get;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.110"></a>
-<span class="sourceLineNo">111</span>import org.apache.hadoop.hbase.client.Mutation;<a name="line.111"></a>
-<span class="sourceLineNo">112</span>import org.apache.hadoop.hbase.client.Put;<a name="line.112"></a>
-<span class="sourceLineNo">113</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.113"></a>
-<span class="sourceLineNo">114</span>import org.apache.hadoop.hbase.client.RegionInfoBuilder;<a name="line.114"></a>
-<span class="sourceLineNo">115</span>import org.apache.hadoop.hbase.client.Result;<a name="line.115"></a>
-<span class="sourceLineNo">116</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.116"></a>
-<span class="sourceLineNo">117</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.117"></a>
-<span class="sourceLineNo">118</span>import org.apache.hadoop.hbase.client.Table;<a name="line.118"></a>
-<span class="sourceLineNo">119</span>import org.apache.hadoop.hbase.client.TableDescriptor;<a name="line.119"></a>
-<span class="sourceLineNo">120</span>import org.apache.hadoop.hbase.coprocessor.CoprocessorHost;<a name="line.120"></a>
-<span class="sourceLineNo">121</span>import org.apache.hadoop.hbase.exceptions.FailedSanityCheckException;<a name="line.121"></a>
-<span class="sourceLineNo">122</span>import org.apache.hadoop.hbase.filter.BigDecimalComparator;<a name="line.122"></a>
-<span class="sourceLineNo">123</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.123"></a>
-<span class="sourceLineNo">124</span>import org.apache.hadoop.hbase.filter.ColumnCountGetFilter;<a name="line.124"></a>
-<span class="sourceLineNo">125</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.125"></a>
-<span class="sourceLineNo">126</span>import org.apache.hadoop.hbase.filter.FilterBase;<a name="line.126"></a>
-<span class="sourceLineNo">127</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.127"></a>
-<span class="sourceLineNo">128</span>import org.apache.hadoop.hbase.filter.NullComparator;<a name="line.128"></a>
-<span class="sourceLineNo">129</span>import org.apache.hadoop.hbase.filter.PrefixFilter;<a name="line.129"></a>
-<span class="sourceLineNo">130</span>import org.apache.hadoop.hbase.filter.SingleColumnValueExcludeFilter;<a name="line.130"></a>
-<span class="sourceLineNo">131</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.131"></a>
-<span class="sourceLineNo">132</span>import org.apache.hadoop.hbase.filter.SubstringComparator;<a name="line.132"></a>
-<span class="sourceLineNo">133</span>import org.apache.hadoop.hbase.filter.ValueFilter;<a name="line.133"></a>
-<span class="sourceLineNo">134</span>import org.apache.hadoop.hbase.io.hfile.HFile;<a name="line.134"></a>
-<span class="sourceLineNo">135</span>import org.apache.hadoop.hbase.monitoring.MonitoredRPCHandler;<a name="line.135"></a>
-<span class="sourceLineNo">136</span>import org.apache.hadoop.hbase.monitoring.MonitoredTask;<a name="line.136"></a>
-<span class="sourceLineNo">137</span>import org.apache.hadoop.hbase.monitoring.TaskMonitor;<a name="line.137"></a>
-<span class="sourceLineNo">138</span>import org.apache.hadoop.hbase.regionserver.HRegion.MutationBatchOperation;<a name="line.138"></a>
-<span class="sourceLineNo">139</span>import org.apache.hadoop.hbase.regionserver.HRegion.RegionScannerImpl;<a name="line.139"></a>
-<span class="sourceLineNo">140</span>import org.apache.hadoop.hbase.regionserver.Region.RowLock;<a name="line.140"></a>
-<span class="sourceLineNo">141</span>import org.apache.hadoop.hbase.regionserver.TestHStore.FaultyFileSystem;<a name="line.141"></a>
-<span class="sourceLineNo">142</span>import org.apache.hadoop.hbase.regionserver.compactions.CompactionRequestImpl;<a name="line.142"></a>
-<span class="sourceLineNo">143</span>import org.apache.hadoop.hbase.regionserver.wal.FSHLog;<a name="line.143"></a>
-<span class="sourceLineNo">144</span>import org.apache.hadoop.hbase.regionserver.wal.MetricsWALSource;<a name="line.144"></a>
-<span class="sourceLineNo">145</span>import org.apache.hadoop.hbase.regionserver.wal.WALUtil;<a name="line.145"></a>
-<span class="sourceLineNo">146</span>import org.apache.hadoop.hbase.replication.regionserver.ReplicationObserver;<a name="line.146"></a>
-<span class="sourceLineNo">147</span>import org.apache.hadoop.hbase.security.User;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>import org.apache.hadoop.hbase.test.MetricsAssertHelper;<a name="line.148"></a>
-<span class="sourceLineNo">149</span>import org.apache.hadoop.hbase.testclassification.LargeTests;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>import org.apache.hadoop.hbase.testclassification.VerySlowRegionServerTests;<a name="line.150"></a>
-<span class="sourceLineNo">151</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.151"></a>
-<span class="sourceLineNo">152</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.152"></a>
-<span class="sourceLineNo">153</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManagerTestHelper;<a name="line.153"></a>
-<span class="sourceLineNo">154</span>import org.apache.hadoop.hbase.util.FSUtils;<a name="line.154"></a>
-<span class="sourceLineNo">155</span>import org.apache.hadoop.hbase.util.IncrementingEnvironmentEdge;<a name="line.155"></a>
-<span class="sourceLineNo">156</span>import org.apache.hadoop.hbase.util.ManualEnvironmentEdge;<a name="line.156"></a>
-<span class="sourceLineNo">157</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.157"></a>
-<span class="sourceLineNo">158</span>import org.apache.hadoop.hbase.wal.AbstractFSWALProvider;<a name="line.158"></a>
-<span class="sourceLineNo">159</span>import org.apache.hadoop.hbase.wal.FaultyFSLog;<a name="line.159"></a>
-<span class="sourceLineNo">160</span>import org.apache.hadoop.hbase.wal.NettyAsyncFSWALConfigHelper;<a name="line.160"></a>
-<span class="sourceLineNo">161</span>import org.apache.hadoop.hbase.wal.WAL;<a name="line.161"></a>
-<span class="sourceLineNo">162</span>import org.apache.hadoop.hbase.wal.WALEdit;<a name="line.162"></a>
-<span class="sourceLineNo">163</span>import org.apache.hadoop.hbase.wal.WALFactory;<a name="line.163"></a>
-<span class="sourceLineNo">164</span>import org.apache.hadoop.hbase.wal.WALKeyImpl;<a name="line.164"></a>
-<span class="sourceLineNo">165</span>import org.apache.hadoop.hbase.wal.WALProvider;<a name="line.165"></a>
-<span class="sourceLineNo">166</span>import org.apache.hadoop.hbase.wal.WALProvider.Writer;<a name="line.166"></a>
-<span class="sourceLineNo">167</span>import org.apache.hadoop.hbase.wal.WALSplitUtil;<a name="line.167"></a>
-<span class="sourceLineNo">168</span>import org.apache.hadoop.hbase.wal.WALSplitter;<a name="line.168"></a>
+<span class="sourceLineNo">107</span>import org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>import org.apache.hadoop.hbase.client.Get;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.111"></a>
+<span class="sourceLineNo">112</span>import org.apache.hadoop.hbase.client.Mutation;<a name="line.112"></a>
+<span class="sourceLineNo">113</span>import org.apache.hadoop.hbase.client.Put;<a name="line.113"></a>
+<span class="sourceLineNo">114</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.114"></a>
+<span class="sourceLineNo">115</span>import org.apache.hadoop.hbase.client.RegionInfoBuilder;<a name="line.115"></a>
+<span class="sourceLineNo">116</span>import org.apache.hadoop.hbase.client.Result;<a name="line.116"></a>
+<span class="sourceLineNo">117</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.117"></a>
+<span class="sourceLineNo">118</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.118"></a>
+<span class="sourceLineNo">119</span>import org.apache.hadoop.hbase.client.Table;<a name="line.119"></a>
+<span class="sourceLineNo">120</span>import org.apache.hadoop.hbase.client.TableDescriptor;<a name="line.120"></a>
+<span class="sourceLineNo">121</span>import org.apache.hadoop.hbase.coprocessor.CoprocessorHost;<a name="line.121"></a>
+<span class="sourceLineNo">122</span>import org.apache.hadoop.hbase.exceptions.FailedSanityCheckException;<a name="line.122"></a>
+<span class="sourceLineNo">123</span>import org.apache.hadoop.hbase.filter.BigDecimalComparator;<a name="line.123"></a>
+<span class="sourceLineNo">124</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.124"></a>
+<span class="sourceLineNo">125</span>import org.apache.hadoop.hbase.filter.ColumnCountGetFilter;<a name="line.125"></a>
+<span class="sourceLineNo">126</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.126"></a>
+<span class="sourceLineNo">127</span>import org.apache.hadoop.hbase.filter.FilterBase;<a name="line.127"></a>
+<span class="sourceLineNo">128</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.128"></a>
+<span class="sourceLineNo">129</span>import org.apache.hadoop.hbase.filter.NullComparator;<a name="line.129"></a>
+<span class="sourceLineNo">130</span>import org.apache.hadoop.hbase.filter.PrefixFilter;<a name="line.130"></a>
+<span class="sourceLineNo">131</span>import org.apache.hadoop.hbase.filter.SingleColumnValueExcludeFilter;<a name="line.131"></a>
+<span class="sourceLineNo">132</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.132"></a>
+<span class="sourceLineNo">133</span>import org.apache.hadoop.hbase.filter.SubstringComparator;<a name="line.133"></a>
+<span class="sourceLineNo">134</span>import org.apache.hadoop.hbase.filter.ValueFilter;<a name="line.134"></a>
+<span class="sourceLineNo">135</span>import org.apache.hadoop.hbase.io.hfile.HFile;<a name="line.135"></a>
+<span class="sourceLineNo">136</span>import org.apache.hadoop.hbase.monitoring.MonitoredRPCHandler;<a name="line.136"></a>
+<span class="sourceLineNo">137</span>import org.apache.hadoop.hbase.monitoring.MonitoredTask;<a name="line.137"></a>
+<span class="sourceLineNo">138</span>import org.apache.hadoop.hbase.monitoring.TaskMonitor;<a name="line.138"></a>
+<span class="sourceLineNo">139</span>import org.apache.hadoop.hbase.regionserver.HRegion.MutationBatchOperation;<a name="line.139"></a>
+<span class="sourceLineNo">140</span>import org.apache.hadoop.hbase.regionserver.HRegion.RegionScannerImpl;<a name="line.140"></a>
+<span class="sourceLineNo">141</span>import org.apache.hadoop.hbase.regionserver.Region.RowLock;<a name="line.141"></a>
+<span class="sourceLineNo">142</span>import org.apache.hadoop.hbase.regionserver.TestHStore.FaultyFileSystem;<a name="line.142"></a>
+<span class="sourceLineNo">143</span>import org.apache.hadoop.hbase.regionserver.compactions.CompactionRequestImpl;<a name="line.143"></a>
+<span class="sourceLineNo">144</span>import org.apache.hadoop.hbase.regionserver.wal.FSHLog;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>import org.apache.hadoop.hbase.regionserver.wal.MetricsWALSource;<a name="line.145"></a>
+<span class="sourceLineNo">146</span>import org.apache.hadoop.hbase.regionserver.wal.WALUtil;<a name="line.146"></a>
+<span class="sourceLineNo">147</span>import org.apache.hadoop.hbase.replication.regionserver.ReplicationObserver;<a name="line.147"></a>
+<span class="sourceLineNo">148</span>import org.apache.hadoop.hbase.security.User;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>import org.apache.hadoop.hbase.test.MetricsAssertHelper;<a name="line.149"></a>
+<span class="sourceLineNo">150</span>import org.apache.hadoop.hbase.testclassification.LargeTests;<a name="line.150"></a>
+<span class="sourceLineNo">151</span>import org.apache.hadoop.hbase.testclassification.VerySlowRegionServerTests;<a name="line.151"></a>
+<span class="sourceLineNo">152</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.152"></a>
+<span class="sourceLineNo">153</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.153"></a>
+<span class="sourceLineNo">154</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManagerTestHelper;<a name="line.154"></a>
+<span class="sourceLineNo">155</span>import org.apache.hadoop.hbase.util.FSUtils;<a name="line.155"></a>
+<span class="sourceLineNo">156</span>import org.apache.hadoop.hbase.util.IncrementingEnvironmentEdge;<a name="line.156"></a>
+<span class="sourceLineNo">157</span>import org.apache.hadoop.hbase.util.ManualEnvironmentEdge;<a name="line.157"></a>
+<span class="sourceLineNo">158</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.158"></a>
+<span class="sourceLineNo">159</span>import org.apache.hadoop.hbase.wal.AbstractFSWALProvider;<a name="line.159"></a>
+<span class="sourceLineNo">160</span>import org.apache.hadoop.hbase.wal.FaultyFSLog;<a name="line.160"></a>
+<span class="sourceLineNo">161</span>import org.apache.hadoop.hbase.wal.NettyAsyncFSWALConfigHelper;<a name="line.161"></a>
+<span class="sourceLineNo">162</span>import org.apache.hadoop.hbase.wal.WAL;<a name="line.162"></a>
+<span class="sourceLineNo">163</span>import org.apache.hadoop.hbase.wal.WALEdit;<a name="line.163"></a>
+<span class="sourceLineNo">164</span>import org.apache.hadoop.hbase.wal.WALFactory;<a name="line.164"></a>
+<span class="sourceLineNo">165</span>import org.apache.hadoop.hbase.wal.WALKeyImpl;<a name="line.165"></a>
+<span class="sourceLineNo">166</span>import org.apache.hadoop.hbase.wal.WALProvider;<a name="line.166"></a>
+<span class="sourceLineNo">167</span>import org.apache.hadoop.hbase.wal.WALProvider.Writer;<a name="line.167"></a>
+<span class="sourceLineNo">168</span>import org.apache.hadoop.hbase.wal.WALSplitUtil;<a name="line.168"></a>
 <span class="sourceLineNo">169</span>import org.apache.hadoop.metrics2.MetricsExecutor;<a name="line.169"></a>
 <span class="sourceLineNo">170</span>import org.junit.After;<a name="line.170"></a>
 <span class="sourceLineNo">171</span>import org.junit.Assert;<a name="line.171"></a>
@@ -409,6007 +409,6017 @@
 <span class="sourceLineNo">401</span>    String testName = "testMemstoreSizeAccountingWithFailedPostBatchMutate";<a name="line.401"></a>
 <span class="sourceLineNo">402</span>    FileSystem fs = FileSystem.get(CONF);<a name="line.402"></a>
 <span class="sourceLineNo">403</span>    Path rootDir = new Path(dir + testName);<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    FSHLog hLog = new FSHLog(fs, rootDir, testName, CONF);<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    hLog.init();<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, hLog,<a name="line.406"></a>
-<span class="sourceLineNo">407</span>        COLUMN_FAMILY_BYTES);<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    assertEquals(0, region.getMemStoreDataSize());<a name="line.409"></a>
-<span class="sourceLineNo">410</span><a name="line.410"></a>
-<span class="sourceLineNo">411</span>    // Put one value<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    byte [] value = Bytes.toBytes(method);<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    Put put = new Put(value);<a name="line.413"></a>
-<span class="sourceLineNo">414</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.414"></a>
-<span class="sourceLineNo">415</span>    region.put(put);<a name="line.415"></a>
-<span class="sourceLineNo">416</span>    long onePutSize = region.getMemStoreDataSize();<a name="line.416"></a>
-<span class="sourceLineNo">417</span>    assertTrue(onePutSize &gt; 0);<a name="line.417"></a>
-<span class="sourceLineNo">418</span><a name="line.418"></a>
-<span class="sourceLineNo">419</span>    RegionCoprocessorHost mockedCPHost = Mockito.mock(RegionCoprocessorHost.class);<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    doThrow(new IOException())<a name="line.420"></a>
-<span class="sourceLineNo">421</span>       .when(mockedCPHost).postBatchMutate(Mockito.&lt;MiniBatchOperationInProgress&lt;Mutation&gt;&gt;any());<a name="line.421"></a>
-<span class="sourceLineNo">422</span>    region.setCoprocessorHost(mockedCPHost);<a name="line.422"></a>
-<span class="sourceLineNo">423</span><a name="line.423"></a>
-<span class="sourceLineNo">424</span>    put = new Put(value);<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("dfg"), value);<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    try {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      region.put(put);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>      fail("Should have failed with IOException");<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    } catch (IOException expected) {<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    }<a name="line.430"></a>
-<span class="sourceLineNo">431</span>    long expectedSize = onePutSize * 2;<a name="line.431"></a>
-<span class="sourceLineNo">432</span>    assertEquals("memstoreSize should be incremented",<a name="line.432"></a>
-<span class="sourceLineNo">433</span>        expectedSize, region.getMemStoreDataSize());<a name="line.433"></a>
-<span class="sourceLineNo">434</span>    assertEquals("flushable size should be incremented",<a name="line.434"></a>
-<span class="sourceLineNo">435</span>        expectedSize, store.getFlushableSize().getDataSize());<a name="line.435"></a>
-<span class="sourceLineNo">436</span><a name="line.436"></a>
-<span class="sourceLineNo">437</span>    region.setCoprocessorHost(null);<a name="line.437"></a>
-<span class="sourceLineNo">438</span>  }<a name="line.438"></a>
-<span class="sourceLineNo">439</span><a name="line.439"></a>
-<span class="sourceLineNo">440</span>  /**<a name="line.440"></a>
-<span class="sourceLineNo">441</span>   * A test case of HBASE-21041<a name="line.441"></a>
-<span class="sourceLineNo">442</span>   * @throws Exception Exception<a name="line.442"></a>
-<span class="sourceLineNo">443</span>   */<a name="line.443"></a>
-<span class="sourceLineNo">444</span>  @Test<a name="line.444"></a>
-<span class="sourceLineNo">445</span>  public void testFlushAndMemstoreSizeCounting() throws Exception {<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    byte[] family = Bytes.toBytes("family");<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.447"></a>
-<span class="sourceLineNo">448</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.448"></a>
-<span class="sourceLineNo">449</span>    try {<a name="line.449"></a>
-<span class="sourceLineNo">450</span>      for (byte[] row : HBaseTestingUtility.ROWS) {<a name="line.450"></a>
-<span class="sourceLineNo">451</span>        Put put = new Put(row);<a name="line.451"></a>
-<span class="sourceLineNo">452</span>        put.addColumn(family, family, row);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>        region.put(put);<a name="line.453"></a>
-<span class="sourceLineNo">454</span>      }<a name="line.454"></a>
-<span class="sourceLineNo">455</span>      region.flush(true);<a name="line.455"></a>
-<span class="sourceLineNo">456</span>      // After flush, data size should be zero<a name="line.456"></a>
-<span class="sourceLineNo">457</span>      assertEquals(0, region.getMemStoreDataSize());<a name="line.457"></a>
-<span class="sourceLineNo">458</span>      // After flush, a new active mutable segment is created, so the heap size<a name="line.458"></a>
-<span class="sourceLineNo">459</span>      // should equal to MutableSegment.DEEP_OVERHEAD<a name="line.459"></a>
-<span class="sourceLineNo">460</span>      assertEquals(MutableSegment.DEEP_OVERHEAD, region.getMemStoreHeapSize());<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      // After flush, offheap should be zero<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      assertEquals(0, region.getMemStoreOffHeapSize());<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    } finally {<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.464"></a>
-<span class="sourceLineNo">465</span>      this.region = null;<a name="line.465"></a>
-<span class="sourceLineNo">466</span>      wals.close();<a name="line.466"></a>
-<span class="sourceLineNo">467</span>    }<a name="line.467"></a>
-<span class="sourceLineNo">468</span>  }<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>   * Test we do not lose data if we fail a flush and then close.<a name="line.471"></a>
-<span class="sourceLineNo">472</span>   * Part of HBase-10466.  Tests the following from the issue description:<a name="line.472"></a>
-<span class="sourceLineNo">473</span>   * "Bug 1: Wrong calculation of HRegion.memstoreSize: When a flush fails, data to be flushed is<a name="line.473"></a>
-<span class="sourceLineNo">474</span>   * kept in each MemStore's snapshot and wait for next flush attempt to continue on it. But when<a name="line.474"></a>
-<span class="sourceLineNo">475</span>   * the next flush succeeds, the counter of total memstore size in HRegion is always deduced by<a name="line.475"></a>
-<span class="sourceLineNo">476</span>   * the sum of current memstore sizes instead of snapshots left from previous failed flush. This<a name="line.476"></a>
-<span class="sourceLineNo">477</span>   * calculation is problematic that almost every time there is failed flush, HRegion.memstoreSize<a name="line.477"></a>
-<span class="sourceLineNo">478</span>   * gets reduced by a wrong value. If region flush could not proceed for a couple cycles, the size<a name="line.478"></a>
-<span class="sourceLineNo">479</span>   * in current memstore could be much larger than the snapshot. It's likely to drift memstoreSize<a name="line.479"></a>
-<span class="sourceLineNo">480</span>   * much smaller than expected. In extreme case, if the error accumulates to even bigger than<a name="line.480"></a>
-<span class="sourceLineNo">481</span>   * HRegion's memstore size limit, any further flush is skipped because flush does not do anything<a name="line.481"></a>
-<span class="sourceLineNo">482</span>   * if memstoreSize is not larger than 0."<a name="line.482"></a>
-<span class="sourceLineNo">483</span>   * @throws Exception<a name="line.483"></a>
-<span class="sourceLineNo">484</span>   */<a name="line.484"></a>
-<span class="sourceLineNo">485</span>  @Test<a name="line.485"></a>
-<span class="sourceLineNo">486</span>  public void testFlushSizeAccounting() throws Exception {<a name="line.486"></a>
-<span class="sourceLineNo">487</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    // Only retry once.<a name="line.489"></a>
-<span class="sourceLineNo">490</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.490"></a>
-<span class="sourceLineNo">491</span>    final User user =<a name="line.491"></a>
-<span class="sourceLineNo">492</span>      User.createUserForTesting(conf, method, new String[]{"foo"});<a name="line.492"></a>
-<span class="sourceLineNo">493</span>    // Inject our faulty LocalFileSystem<a name="line.493"></a>
-<span class="sourceLineNo">494</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.494"></a>
-<span class="sourceLineNo">495</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.495"></a>
-<span class="sourceLineNo">496</span>      @Override<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      public Object run() throws Exception {<a name="line.497"></a>
-<span class="sourceLineNo">498</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.498"></a>
-<span class="sourceLineNo">499</span>        FileSystem fs = FileSystem.get(conf);<a name="line.499"></a>
-<span class="sourceLineNo">500</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.500"></a>
-<span class="sourceLineNo">501</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.501"></a>
-<span class="sourceLineNo">502</span>        HRegion region = null;<a name="line.502"></a>
-<span class="sourceLineNo">503</span>        try {<a name="line.503"></a>
-<span class="sourceLineNo">504</span>          // Initialize region<a name="line.504"></a>
-<span class="sourceLineNo">505</span>          region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, wal,<a name="line.505"></a>
-<span class="sourceLineNo">506</span>              COLUMN_FAMILY_BYTES);<a name="line.506"></a>
-<span class="sourceLineNo">507</span>          long size = region.getMemStoreDataSize();<a name="line.507"></a>
-<span class="sourceLineNo">508</span>          Assert.assertEquals(0, size);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.509"></a>
-<span class="sourceLineNo">510</span>          Put p1 = new Put(row);<a name="line.510"></a>
-<span class="sourceLineNo">511</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[]) null));<a name="line.511"></a>
-<span class="sourceLineNo">512</span>          region.put(p1);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>          final long sizeOfOnePut = region.getMemStoreDataSize();<a name="line.513"></a>
-<span class="sourceLineNo">514</span>          // Fail a flush which means the current memstore will hang out as memstore 'snapshot'.<a name="line.514"></a>
-<span class="sourceLineNo">515</span>          try {<a name="line.515"></a>
-<span class="sourceLineNo">516</span>            LOG.info("Flushing");<a name="line.516"></a>
-<span class="sourceLineNo">517</span>            region.flush(true);<a name="line.517"></a>
-<span class="sourceLineNo">518</span>            Assert.fail("Didn't bubble up IOE!");<a name="line.518"></a>
-<span class="sourceLineNo">519</span>          } catch (DroppedSnapshotException dse) {<a name="line.519"></a>
-<span class="sourceLineNo">520</span>            // What we are expecting<a name="line.520"></a>
-<span class="sourceLineNo">521</span>            region.closing.set(false); // this is needed for the rest of the test to work<a name="line.521"></a>
-<span class="sourceLineNo">522</span>          }<a name="line.522"></a>
-<span class="sourceLineNo">523</span>          // Make it so all writes succeed from here on out<a name="line.523"></a>
-<span class="sourceLineNo">524</span>          ffs.fault.set(false);<a name="line.524"></a>
-<span class="sourceLineNo">525</span>          // Check sizes.  Should still be the one entry.<a name="line.525"></a>
-<span class="sourceLineNo">526</span>          Assert.assertEquals(sizeOfOnePut, region.getMemStoreDataSize());<a name="line.526"></a>
-<span class="sourceLineNo">527</span>          // Now add two entries so that on this next flush that fails, we can see if we<a name="line.527"></a>
-<span class="sourceLineNo">528</span>          // subtract the right amount, the snapshot size only.<a name="line.528"></a>
-<span class="sourceLineNo">529</span>          Put p2 = new Put(row);<a name="line.529"></a>
-<span class="sourceLineNo">530</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.530"></a>
-<span class="sourceLineNo">531</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.531"></a>
-<span class="sourceLineNo">532</span>          region.put(p2);<a name="line.532"></a>
-<span class="sourceLineNo">533</span>          long expectedSize = sizeOfOnePut * 3;<a name="line.533"></a>
-<span class="sourceLineNo">534</span>          Assert.assertEquals(expectedSize, region.getMemStoreDataSize());<a name="line.534"></a>
-<span class="sourceLineNo">535</span>          // Do a successful flush.  It will clear the snapshot only.  Thats how flushes work.<a name="line.535"></a>
-<span class="sourceLineNo">536</span>          // If already a snapshot, we clear it else we move the memstore to be snapshot and flush<a name="line.536"></a>
-<span class="sourceLineNo">537</span>          // it<a name="line.537"></a>
-<span class="sourceLineNo">538</span>          region.flush(true);<a name="line.538"></a>
-<span class="sourceLineNo">539</span>          // Make sure our memory accounting is right.<a name="line.539"></a>
-<span class="sourceLineNo">540</span>          Assert.assertEquals(sizeOfOnePut * 2, region.getMemStoreDataSize());<a name="line.540"></a>
-<span class="sourceLineNo">541</span>        } finally {<a name="line.541"></a>
-<span class="sourceLineNo">542</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.542"></a>
-<span class="sourceLineNo">543</span>        }<a name="line.543"></a>
-<span class="sourceLineNo">544</span>        return null;<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>    FileSystem.closeAllForUGI(user.getUGI());<a name="line.547"></a>
-<span class="sourceLineNo">548</span>  }<a name="line.548"></a>
-<span class="sourceLineNo">549</span><a name="line.549"></a>
-<span class="sourceLineNo">550</span>  @Test<a name="line.550"></a>
-<span class="sourceLineNo">551</span>  public void testCloseWithFailingFlush() throws Exception {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    // Only retry once.<a name="line.554"></a>
-<span class="sourceLineNo">555</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.555"></a>
-<span class="sourceLineNo">556</span>    final User user =<a name="line.556"></a>
-<span class="sourceLineNo">557</span>      User.createUserForTesting(conf, this.method, new String[]{"foo"});<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    // Inject our faulty LocalFileSystem<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      @Override<a name="line.561"></a>
-<span class="sourceLineNo">562</span>      public Object run() throws Exception {<a name="line.562"></a>
-<span class="sourceLineNo">563</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.563"></a>
-<span class="sourceLineNo">564</span>        FileSystem fs = FileSystem.get(conf);<a name="line.564"></a>
-<span class="sourceLineNo">565</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.565"></a>
-<span class="sourceLineNo">566</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.566"></a>
-<span class="sourceLineNo">567</span>        HRegion region = null;<a name="line.567"></a>
-<span class="sourceLineNo">568</span>        try {<a name="line.568"></a>
-<span class="sourceLineNo">569</span>          // Initialize region<a name="line.569"></a>
-<span class="sourceLineNo">570</span>          region = initHRegion(tableName, null, null, false,<a name="line.570"></a>
-<span class="sourceLineNo">571</span>              Durability.SYNC_WAL, wal, COLUMN_FAMILY_BYTES);<a name="line.571"></a>
-<span class="sourceLineNo">572</span>          long size = region.getMemStoreDataSize();<a name="line.572"></a>
-<span class="sourceLineNo">573</span>          Assert.assertEquals(0, size);<a name="line.573"></a>
-<span class="sourceLineNo">574</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.574"></a>
-<span class="sourceLineNo">575</span>          Put p1 = new Put(row);<a name="line.575"></a>
-<span class="sourceLineNo">576</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[])null));<a name="line.576"></a>
-<span class="sourceLineNo">577</span>          region.put(p1);<a name="line.577"></a>
-<span class="sourceLineNo">578</span>          // Manufacture an outstanding snapshot -- fake a failed flush by doing prepare step only.<a name="line.578"></a>
-<span class="sourceLineNo">579</span>          HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>          StoreFlushContext storeFlushCtx =<a name="line.580"></a>
-<span class="sourceLineNo">581</span>              store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY);<a name="line.581"></a>
-<span class="sourceLineNo">582</span>          storeFlushCtx.prepare();<a name="line.582"></a>
-<span class="sourceLineNo">583</span>          // Now add two entries to the foreground memstore.<a name="line.583"></a>
-<span class="sourceLineNo">584</span>          Put p2 = new Put(row);<a name="line.584"></a>
-<span class="sourceLineNo">585</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.585"></a>
-<span class="sourceLineNo">586</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.586"></a>
-<span class="sourceLineNo">587</span>          region.put(p2);<a name="line.587"></a>
-<span class="sourceLineNo">588</span>          // Now try close on top of a failing flush.<a name="line.588"></a>
-<span class="sourceLineNo">589</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.589"></a>
-<span class="sourceLineNo">590</span>          region = null;<a name="line.590"></a>
-<span class="sourceLineNo">591</span>          fail();<a name="line.591"></a>
-<span class="sourceLineNo">592</span>        } catch (DroppedSnapshotException dse) {<a name="line.592"></a>
-<span class="sourceLineNo">593</span>          // Expected<a name="line.593"></a>
-<span class="sourceLineNo">594</span>          LOG.info("Expected DroppedSnapshotException");<a name="line.594"></a>
-<span class="sourceLineNo">595</span>        } finally {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>          // Make it so all writes succeed from here on out so can close clean<a name="line.596"></a>
-<span class="sourceLineNo">597</span>          ffs.fault.set(false);<a name="line.597"></a>
-<span class="sourceLineNo">598</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.598"></a>
-<span class="sourceLineNo">599</span>        }<a name="line.599"></a>
-<span class="sourceLineNo">600</span>        return null;<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      }<a name="line.601"></a>
-<span class="sourceLineNo">602</span>    });<a name="line.602"></a>
-<span class="sourceLineNo">603</span>    FileSystem.closeAllForUGI(user.getUGI());<a name="line.603"></a>
-<span class="sourceLineNo">604</span>  }<a name="line.604"></a>
-<span class="sourceLineNo">605</span><a name="line.605"></a>
-<span class="sourceLineNo">606</span>  @Test<a name="line.606"></a>
-<span class="sourceLineNo">607</span>  public void testCompactionAffectedByScanners() throws Exception {<a name="line.607"></a>
-<span class="sourceLineNo">608</span>    byte[] family = Bytes.toBytes("family");<a name="line.608"></a>
-<span class="sourceLineNo">609</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.609"></a>
-<span class="sourceLineNo">610</span><a name="line.610"></a>
-<span class="sourceLineNo">611</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.612"></a>
-<span class="sourceLineNo">613</span>    region.put(put);<a name="line.613"></a>
-<span class="sourceLineNo">614</span>    region.flush(true);<a name="line.614"></a>
-<span class="sourceLineNo">615</span><a name="line.615"></a>
-<span class="sourceLineNo">616</span>    Scan scan = new Scan();<a name="line.616"></a>
-<span class="sourceLineNo">617</span>    scan.setMaxVersions(3);<a name="line.617"></a>
-<span class="sourceLineNo">618</span>    // open the first scanner<a name="line.618"></a>
-<span class="sourceLineNo">619</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.619"></a>
-<span class="sourceLineNo">620</span><a name="line.620"></a>
-<span class="sourceLineNo">621</span>    Delete delete = new Delete(Bytes.toBytes("r1"));<a name="line.621"></a>
-<span class="sourceLineNo">622</span>    region.delete(delete);<a name="line.622"></a>
-<span class="sourceLineNo">623</span>    region.flush(true);<a name="line.623"></a>
-<span class="sourceLineNo">624</span><a name="line.624"></a>
-<span class="sourceLineNo">625</span>    // open the second scanner<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    RegionScanner scanner2 = region.getScanner(scan);<a name="line.626"></a>
-<span class="sourceLineNo">627</span><a name="line.627"></a>
-<span class="sourceLineNo">628</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.628"></a>
-<span class="sourceLineNo">629</span><a name="line.629"></a>
-<span class="sourceLineNo">630</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.630"></a>
-<span class="sourceLineNo">631</span><a name="line.631"></a>
-<span class="sourceLineNo">632</span>    // make a major compaction<a name="line.632"></a>
-<span class="sourceLineNo">633</span>    region.compact(true);<a name="line.633"></a>
-<span class="sourceLineNo">634</span><a name="line.634"></a>
-<span class="sourceLineNo">635</span>    // open the third scanner<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    RegionScanner scanner3 = region.getScanner(scan);<a name="line.636"></a>
-<span class="sourceLineNo">637</span><a name="line.637"></a>
-<span class="sourceLineNo">638</span>    // get data from scanner 1, 2, 3 after major compaction<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    scanner1.next(results);<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    System.out.println(results);<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    assertEquals(1, results.size());<a name="line.641"></a>
-<span class="sourceLineNo">642</span><a name="line.642"></a>
-<span class="sourceLineNo">643</span>    results.clear();<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    scanner2.next(results);<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    System.out.println(results);<a name="line.645"></a>
-<span class="sourceLineNo">646</span>    assertEquals(0, results.size());<a name="line.646"></a>
-<span class="sourceLineNo">647</span><a name="line.647"></a>
-<span class="sourceLineNo">648</span>    results.clear();<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    scanner3.next(results);<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    System.out.println(results);<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    assertEquals(0, results.size());<a name="line.651"></a>
-<span class="sourceLineNo">652</span>  }<a name="line.652"></a>
-<span class="sourceLineNo">653</span><a name="line.653"></a>
-<span class="sourceLineNo">654</span>  @Test<a name="line.654"></a>
-<span class="sourceLineNo">655</span>  public void testToShowNPEOnRegionScannerReseek() throws Exception {<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    byte[] family = Bytes.toBytes("family");<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.657"></a>
-<span class="sourceLineNo">658</span><a name="line.658"></a>
-<span class="sourceLineNo">659</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.659"></a>
-<span class="sourceLineNo">660</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.660"></a>
-<span class="sourceLineNo">661</span>    region.put(put);<a name="line.661"></a>
-<span class="sourceLineNo">662</span>    put = new Put(Bytes.toBytes("r2"));<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.663"></a>
-<span class="sourceLineNo">664</span>    region.put(put);<a name="line.664"></a>
-<span class="sourceLineNo">665</span>    region.flush(true);<a name="line.665"></a>
-<span class="sourceLineNo">666</span><a name="line.666"></a>
-<span class="sourceLineNo">667</span>    Scan scan = new Scan();<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    scan.setMaxVersions(3);<a name="line.668"></a>
-<span class="sourceLineNo">669</span>    // open the first scanner<a name="line.669"></a>
-<span class="sourceLineNo">670</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.670"></a>
-<span class="sourceLineNo">671</span><a name="line.671"></a>
-<span class="sourceLineNo">672</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.672"></a>
-<span class="sourceLineNo">673</span><a name="line.673"></a>
-<span class="sourceLineNo">674</span>    region.compact(true);<a name="line.674"></a>
-<span class="sourceLineNo">675</span><a name="line.675"></a>
-<span class="sourceLineNo">676</span>    scanner1.reseek(Bytes.toBytes("r2"));<a name="line.676"></a>
-<span class="sourceLineNo">677</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.677"></a>
-<span class="sourceLineNo">678</span>    scanner1.next(results);<a name="line.678"></a>
-<span class="sourceLineNo">679</span>    Cell keyValue = results.get(0);<a name="line.679"></a>
-<span class="sourceLineNo">680</span>    Assert.assertTrue(Bytes.compareTo(CellUtil.cloneRow(keyValue), Bytes.toBytes("r2")) == 0);<a name="line.680"></a>
-<span class="sourceLineNo">681</span>    scanner1.close();<a name="line.681"></a>
-<span class="sourceLineNo">682</span>  }<a name="line.682"></a>
-<span class="sourceLineNo">683</span><a name="line.683"></a>
-<span class="sourceLineNo">684</span>  @Test<a name="line.684"></a>
-<span class="sourceLineNo">685</span>  public void testSkipRecoveredEditsReplay() throws Exception {<a name="line.685"></a>
-<span class="sourceLineNo">686</span>    byte[] family = Bytes.toBytes("family");<a name="line.686"></a>
-<span class="sourceLineNo">687</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.687"></a>
-<span class="sourceLineNo">688</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.688"></a>
-<span class="sourceLineNo">689</span>    try {<a name="line.689"></a>
-<span class="sourceLineNo">690</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.690"></a>
-<span class="sourceLineNo">691</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.691"></a>
-<span class="sourceLineNo">692</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.692"></a>
-<span class="sourceLineNo">693</span><a name="line.693"></a>
-<span class="sourceLineNo">694</span>      Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.694"></a>
-<span class="sourceLineNo">695</span><a name="line.695"></a>
-<span class="sourceLineNo">696</span>      long maxSeqId = 1050;<a name="line.696"></a>
-<span class="sourceLineNo">697</span>      long minSeqId = 1000;<a name="line.697"></a>
-<span class="sourceLineNo">698</span><a name="line.698"></a>
-<span class="sourceLineNo">699</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.699"></a>
-<span class="sourceLineNo">700</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.700"></a>
-<span class="sourceLineNo">701</span>        fs.create(recoveredEdits);<a name="line.701"></a>
-<span class="sourceLineNo">702</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.702"></a>
-<span class="sourceLineNo">703</span><a name="line.703"></a>
-<span class="sourceLineNo">704</span>        long time = System.nanoTime();<a name="line.704"></a>
-<span class="sourceLineNo">705</span>        WALEdit edit = new WALEdit();<a name="line.705"></a>
-<span class="sourceLineNo">706</span>        edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.706"></a>
-<span class="sourceLineNo">707</span>            .toBytes(i)));<a name="line.707"></a>
-<span class="sourceLineNo">708</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.708"></a>
-<span class="sourceLineNo">709</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.709"></a>
-<span class="sourceLineNo">710</span><a name="line.710"></a>
-<span class="sourceLineNo">711</span>        writer.close();<a name="line.711"></a>
-<span class="sourceLineNo">712</span>      }<a name="line.712"></a>
-<span class="sourceLineNo">713</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.713"></a>
-<span class="sourceLineNo">714</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.714"></a>
-<span class="sourceLineNo">715</span>      for (HStore store : region.getStores()) {<a name="line.715"></a>
-<span class="sourceLineNo">716</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), minSeqId - 1);<a name="line.716"></a>
-<span class="sourceLineNo">717</span>      }<a name="line.717"></a>
-<span class="sourceLineNo">718</span>      long seqId = region.replayRecoveredEditsIfAny(maxSeqIdInStores, null, status);<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      assertEquals(maxSeqId, seqId);<a name="line.719"></a>
-<span class="sourceLineNo">720</span>      region.getMVCC().advanceTo(seqId);<a name="line.720"></a>
-<span class="sourceLineNo">721</span>      Get get = new Get(row);<a name="line.721"></a>
-<span class="sourceLineNo">722</span>      Result result = region.get(get);<a name="line.722"></a>
-<span class="sourceLineNo">723</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.723"></a>
-<span class="sourceLineNo">724</span>        List&lt;Cell&gt; kvs = result.getColumnCells(family, Bytes.toBytes(i));<a name="line.724"></a>
-<span class="sourceLineNo">725</span>        assertEquals(1, kvs.size());<a name="line.725"></a>
-<span class="sourceLineNo">726</span>        assertArrayEquals(Bytes.toBytes(i), CellUtil.cloneValue(kvs.get(0)));<a name="line.726"></a>
-<span class="sourceLineNo">727</span>      }<a name="line.727"></a>
-<span class="sourceLineNo">728</span>    } finally {<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      this.region = null;<a name="line.730"></a>
-<span class="sourceLineNo">731</span>      wals.close();<a name="line.731"></a>
-<span class="sourceLineNo">732</span>    }<a name="line.732"></a>
-<span class="sourceLineNo">733</span>  }<a name="line.733"></a>
-<span class="sourceLineNo">734</span><a name="line.734"></a>
-<span class="sourceLineNo">735</span>  @Test<a name="line.735"></a>
-<span class="sourceLineNo">736</span>  public void testSkipRecoveredEditsReplaySomeIgnored() throws Exception {<a name="line.736"></a>
-<span class="sourceLineNo">737</span>    byte[] family = Bytes.toBytes("family");<a name="line.737"></a>
-<span class="sourceLineNo">738</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.738"></a>
-<span class="sourceLineNo">739</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.739"></a>
-<span class="sourceLineNo">740</span>    try {<a name="line.740"></a>
-<span class="sourceLineNo">741</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.741"></a>
-<span class="sourceLineNo">742</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.742"></a>
-<span class="sourceLineNo">743</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.743"></a>
-<span class="sourceLineNo">744</span><a name="line.744"></a>
-<span class="sourceLineNo">745</span>      Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.745"></a>
-<span class="sourceLineNo">746</span><a name="line.746"></a>
-<span class="sourceLineNo">747</span>      long maxSeqId = 1050;<a name="line.747"></a>
-<span class="sourceLineNo">748</span>      long minSeqId = 1000;<a name="line.748"></a>
-<span class="sourceLineNo">749</span><a name="line.749"></a>
-<span class="sourceLineNo">750</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.750"></a>
-<span class="sourceLineNo">751</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.751"></a>
-<span class="sourceLineNo">752</span>        fs.create(recoveredEdits);<a name="line.752"></a>
-<span class="sourceLineNo">753</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.753"></a>
-<span class="sourceLineNo">754</span><a name="line.754"></a>
-<span class="sourceLineNo">755</span>        long time = System.nanoTime();<a name="line.755"></a>
-<span class="sourceLineNo">756</span>        WALEdit edit = new WALEdit();<a name="line.756"></a>
-<span class="sourceLineNo">757</span>        edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.757"></a>
-<span class="sourceLineNo">758</span>            .toBytes(i)));<a name="line.758"></a>
-<span class="sourceLineNo">759</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.759"></a>
-<span class="sourceLineNo">760</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.760"></a>
-<span class="sourceLineNo">761</span><a name="line.761"></a>
-<span class="sourceLineNo">762</span>        writer.close();<a name="line.762"></a>
-<span class="sourceLineNo">763</span>      }<a name="line.763"></a>
-<span class="sourceLineNo">764</span>      long recoverSeqId = 1030;<a name="line.764"></a>
-<span class="sourceLineNo">765</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.766"></a>
-<span class="sourceLineNo">767</span>      for (HStore store : region.getStores()) {<a name="line.767"></a>
-<span class="sourceLineNo">768</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), recoverSeqId - 1);<a name="line.768"></a>
-<span class="sourceLineNo">769</span>      }<a name="line.769"></a>
-<span class="sourceLineNo">770</span>      long seqId = region.replayRecoveredEditsIfAny(maxSeqIdInStores, null, status);<a name="line.770"></a>
-<span class="sourceLineNo">771</span>      assertEquals(maxSeqId, seqId);<a name="line.771"></a>
-<span class="sourceLineNo">772</span>      region.getMVCC().advanceTo(seqId);<a name="line.772"></a>
-<span class="sourceLineNo">773</span>      Get get = new Get(row);<a name="line.773"></a>
-<span class="sourceLineNo">774</span>      Result result = region.get(get);<a name="line.774"></a>
-<span class="sourceLineNo">775</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.775"></a>
-<span class="sourceLineNo">776</span>        List&lt;Cell&gt; kvs = result.getColumnCells(family, Bytes.toBytes(i));<a name="line.776"></a>
-<span class="sourceLineNo">777</span>        if (i &lt; recoverSeqId) {<a name="line.777"></a>
-<span class="sourceLineNo">778</span>          assertEquals(0, kvs.size());<a name="line.778"></a>
-<span class="sourceLineNo">779</span>        } else {<a name="line.779"></a>
-<span class="sourceLineNo">780</span>          assertEquals(1, kvs.size());<a name="line.780"></a>
-<span class="sourceLineNo">781</span>          assertArrayEquals(Bytes.toBytes(i), CellUtil.cloneValue(kvs.get(0)));<a name="line.781"></a>
-<span class="sourceLineNo">782</span>        }<a name="line.782"></a>
-<span class="sourceLineNo">783</span>      }<a name="line.783"></a>
-<span class="sourceLineNo">784</span>    } finally {<a name="line.784"></a>
-<span class="sourceLineNo">785</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.785"></a>
-<span class="sourceLineNo">786</span>      this.region = null;<a name="line.786"></a>
-<span class="sourceLineNo">787</span>      wals.close();<a name="line.787"></a>
-<span class="sourceLineNo">788</span>    }<a name="line.788"></a>
-<span class="sourceLineNo">789</span>  }<a name="line.789"></a>
-<span class="sourceLineNo">790</span><a name="line.790"></a>
-<span class="sourceLineNo">791</span>  @Test<a name="line.791"></a>
-<span class="sourceLineNo">792</span>  public void testSkipRecoveredEditsReplayAllIgnored() throws Exception {<a name="line.792"></a>
-<span class="sourceLineNo">793</span>    byte[] family = Bytes.toBytes("family");<a name="line.793"></a>
-<span class="sourceLineNo">794</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.794"></a>
-<span class="sourceLineNo">795</span>    Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.795"></a>
-<span class="sourceLineNo">796</span>    FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.796"></a>
-<span class="sourceLineNo">797</span><a name="line.797"></a>
-<span class="sourceLineNo">798</span>    Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.798"></a>
-<span class="sourceLineNo">799</span>    for (int i = 1000; i &lt; 1050; i += 10) {<a name="line.799"></a>
-<span class="sourceLineNo">800</span>      Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.800"></a>
-<span class="sourceLineNo">801</span>      FSDataOutputStream dos = fs.create(recoveredEdits);<a name="line.801"></a>
-<span class="sourceLineNo">802</span>      dos.writeInt(i);<a name="line.802"></a>
-<span class="sourceLineNo">803</span>      dos.close();<a name="line.803"></a>
-<span class="sourceLineNo">804</span>    }<a name="line.804"></a>
-<span class="sourceLineNo">805</span>    long minSeqId = 2000;<a name="line.805"></a>
-<span class="sourceLineNo">806</span>    Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", minSeqId - 1));<a name="line.806"></a>
-<span class="sourceLineNo">807</span>    FSDataOutputStream dos = fs.create(recoveredEdits);<a name="line.807"></a>
-<span class="sourceLineNo">808</span>    dos.close();<a name="line.808"></a>
-<span class="sourceLineNo">809</span><a name="line.809"></a>
-<span class="sourceLineNo">810</span>    Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.810"></a>
-<span class="sourceLineNo">811</span>    for (HStore store : region.getStores()) {<a name="line.811"></a>
-<span class="sourceLineNo">812</span>      maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), minSeqId);<a name="line.812"></a>
-<span class="sourceLineNo">813</span>    }<a name="line.813"></a>
-<span class="sourceLineNo">814</span>    long seqId = region.replayRecoveredEditsIfAny(maxSeqIdInStores, null, null);<a name="line.814"></a>
-<span class="sourceLineNo">815</span>    assertEquals(minSeqId, seqId);<a name="line.815"></a>
-<span class="sourceLineNo">816</span>  }<a name="line.816"></a>
-<span class="sourceLineNo">817</span><a name="line.817"></a>
-<span class="sourceLineNo">818</span>  @Test<a name="line.818"></a>
-<span class="sourceLineNo">819</span>  public void testSkipRecoveredEditsReplayTheLastFileIgnored() throws Exception {<a name="line.819"></a>
-<span class="sourceLineNo">820</span>    byte[] family = Bytes.toBytes("family");<a name="line.820"></a>
-<span class="sourceLineNo">821</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.821"></a>
-<span class="sourceLineNo">822</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.822"></a>
-<span class="sourceLineNo">823</span>    try {<a name="line.823"></a>
-<span class="sourceLineNo">824</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.824"></a>
-<span class="sourceLineNo">825</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.825"></a>
-<span class="sourceLineNo">826</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.826"></a>
-<span class="sourceLineNo">827</span>      byte[][] columns = region.getTableDescriptor().getColumnFamilyNames().toArray(new byte[0][]);<a name="line.827"></a>
-<span class="sourceLineNo">828</span><a name="line.828"></a>
-<span class="sourceLineNo">829</span>      assertEquals(0, region.getStoreFileList(columns).size());<a name="line.829"></a>
-<span class="sourceLineNo">830</span><a name="line.830"></a>
-<span class="sourceLineNo">831</span>      Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.831"></a>
-<span class="sourceLineNo">832</span><a name="line.832"></a>
-<span class="sourceLineNo">833</span>      long maxSeqId = 1050;<a name="line.833"></a>
-<span class="sourceLineNo">834</span>      long minSeqId = 1000;<a name="line.834"></a>
-<span class="sourceLineNo">835</span><a name="line.835"></a>
-<span class="sourceLineNo">836</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.836"></a>
-<span class="sourceLineNo">837</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.837"></a>
-<span class="sourceLineNo">838</span>        fs.create(recoveredEdits);<a name="line.838"></a>
-<span class="sourceLineNo">839</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.839"></a>
-<span class="sourceLineNo">840</span><a name="line.840"></a>
-<span class="sourceLineNo">841</span>        long time = System.nanoTime();<a name="line.841"></a>
-<span class="sourceLineNo">842</span>        WALEdit edit = null;<a name="line.842"></a>
-<span class="sourceLineNo">843</span>        if (i == maxSeqId) {<a name="line.843"></a>
-<span class="sourceLineNo">844</span>          edit = WALEdit.createCompaction(region.getRegionInfo(),<a name="line.844"></a>
-<span class="sourceLineNo">845</span>          CompactionDescriptor.newBuilder()<a name="line.845"></a>
-<span class="sourceLineNo">846</span>          .setTableName(ByteString.copyFrom(tableName.getName()))<a name="line.846"></a>
-<span class="sourceLineNo">847</span>          .setFamilyName(ByteString.copyFrom(regionName))<a name="line.847"></a>
-<span class="sourceLineNo">848</span>          .setEncodedRegionName(ByteString.copyFrom(regionName))<a name="line.848"></a>
-<span class="sourceLineNo">849</span>          .setStoreHomeDirBytes(ByteString.copyFrom(Bytes.toBytes(regiondir.toString())))<a name="line.849"></a>
-<span class="sourceLineNo">850</span>          .setRegionName(ByteString.copyFrom(region.getRegionInfo().getRegionName()))<a name="line.850"></a>
-<span class="sourceLineNo">851</span>          .build());<a name="line.851"></a>
-<span class="sourceLineNo">852</span>        } else {<a name="line.852"></a>
-<span class="sourceLineNo">853</span>          edit = new WALEdit();<a name="line.853"></a>
-<span class="sourceLineNo">854</span>          edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.854"></a>
-<span class="sourceLineNo">855</span>            .toBytes(i)));<a name="line.855"></a>
-<span class="sourceLineNo">856</span>        }<a name="line.856"></a>
-<span class="sourceLineNo">857</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.857"></a>
-<span class="sourceLineNo">858</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.858"></a>
-<span class="sourceLineNo">859</span>        writer.close();<a name="line.859"></a>
-<span class="sourceLineNo">860</span>      }<a name="line.860"></a>
-<span class="sourceLineNo">861</span><a name="line.861"></a>
-<span class="sourceLineNo">862</span>      long recoverSeqId = 1030;<a name="line.862"></a>
-<span class="sourceLineNo">863</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.863"></a>
-<span class="sourceLineNo">864</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.864"></a>
-<span class="sourceLineNo">865</span>      for (HStore store : region.getStores()) {<a name="line.865"></a>
-<span class="sourceLineNo">866</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), recoverSeqId - 1);<a name="line.866"></a>
-<span class="sourceLineNo">867</span>      }<a name="line.867"></a>
-<span class="sourceLineNo">868</span>      long seqId = region.replayRecoveredEditsIfAny(maxSeqIdInStores, null, status);<a name="line.868"></a>
-<span class="sourceLineNo">869</span>      assertEquals(maxSeqId, seqId);<a name="line.869"></a>
-<span class="sourceLineNo">870</span><a name="line.870"></a>
-<span class="sourceLineNo">871</span>      // assert that the files are flushed<a name="line.871"></a>
-<span class="sourceLineNo">872</span>      assertEquals(1, region.getStoreFileList(columns).size());<a name="line.872"></a>
-<span class="sourceLineNo">873</span><a name="line.873"></a>
-<span class="sourceLineNo">874</span>    } finally {<a name="line.874"></a>
-<span class="sourceLineNo">875</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.875"></a>
-<span class="sourceLineNo">876</span>      this.region = null;<a name="line.876"></a>
-<span class="sourceLineNo">877</span>      wals.close();<a name="line.877"></a>
-<span class="sourceLineNo">878</span>    }<a name="line.878"></a>
-<span class="sourceLineNo">879</span>  }<a name="line.879"></a>
-<span class="sourceLineNo">880</span><a name="line.880"></a>
-<span class="sourceLineNo">881</span>  @Test<a name="line.881"></a>
-<span class="sourceLineNo">882</span>  public void testRecoveredEditsReplayCompaction() throws Exception {<a name="line.882"></a>
-<span class="sourceLineNo">883</span>    testRecoveredEditsReplayCompaction(false);<a name="line.883"></a>
-<span class="sourceLineNo">884</span>    testRecoveredEditsReplayCompaction(true);<a name="line.884"></a>
-<span class="sourceLineNo">885</span>  }<a name="line.885"></a>
-<span class="sourceLineNo">886</span><a name="line.886"></a>
-<span class="sourceLineNo">887</span>  public void testRecoveredEditsReplayCompaction(boolean mismatchedRegionName) throws Exception {<a name="line.887"></a>
-<span class="sourceLineNo">888</span>    CONF.setClass(HConstants.REGION_IMPL, HRegionForTesting.class, Region.class);<a name="line.888"></a>
-<span class="sourceLineNo">889</span>    byte[] family = Bytes.toBytes("family");<a name="line.889"></a>
-<span class="sourceLineNo">890</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.890"></a>
-<span class="sourceLineNo">891</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.891"></a>
-<span class="sourceLineNo">892</span>    try {<a name="line.892"></a>
-<span class="sourceLineNo">893</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.893"></a>
-<span class="sourceLineNo">894</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.894"></a>
-<span class="sourceLineNo">895</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.895"></a>
-<span class="sourceLineNo">896</span><a name="line.896"></a>
-<span class="sourceLineNo">897</span>      long maxSeqId = 3;<a name="line.897"></a>
-<span class="sourceLineNo">898</span>      long minSeqId = 0;<a name="line.898"></a>
-<span class="sourceLineNo">899</span><a name="line.899"></a>
-<span class="sourceLineNo">900</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.900"></a>
-<span class="sourceLineNo">901</span>        Put put = new Put(Bytes.toBytes(i));<a name="line.901"></a>
-<span class="sourceLineNo">902</span>        put.addColumn(family, Bytes.toBytes(i), Bytes.toBytes(i));<a name="line.902"></a>
-<span class="sourceLineNo">903</span>        region.put(put);<a name="line.903"></a>
-<span class="sourceLineNo">904</span>        region.flush(true);<a name="line.904"></a>
-<span class="sourceLineNo">905</span>      }<a name="line.905"></a>
-<span class="sourceLineNo">906</span><a name="line.906"></a>
-<span class="sourceLineNo">907</span>      // this will create a region with 3 files<a name="line.907"></a>
-<span class="sourceLineNo">908</span>      assertEquals(3, region.getStore(family).getStorefilesCount());<a name="line.908"></a>
-<span class="sourceLineNo">909</span>      List&lt;Path&gt; storeFiles = new ArrayList&lt;&gt;(3);<a name="line.909"></a>
-<span class="sourceLineNo">910</span>      for (HStoreFile sf : region.getStore(family).getStorefiles()) {<a name="line.910"></a>
-<span class="sourceLineNo">911</span>        storeFiles.add(sf.getPath());<a name="line.911"></a>
-<span class="sourceLineNo">912</span>      }<a name="line.912"></a>
-<span class="sourceLineNo">913</span><a name="line.913"></a>
-<span class="sourceLineNo">914</span>      // disable compaction completion<a name="line.914"></a>
-<span class="sourceLineNo">915</span>      CONF.setBoolean("hbase.hstore.compaction.complete", false);<a name="line.915"></a>
-<span class="sourceLineNo">916</span>      region.compactStores();<a name="line.916"></a>
-<span class="sourceLineNo">917</span><a name="line.917"></a>
-<span class="sourceLineNo">918</span>      // ensure that nothing changed<a name="line.918"></a>
-<span class="sourceLineNo">919</span>      assertEquals(3, region.getStore(family).getStorefilesCount());<a name="line.919"></a>
-<span class="sourceLineNo">920</span><a name="line.920"></a>
-<span class="sourceLineNo">921</span>      // now find the compacted file, and manually add it to the recovered edits<a name="line.921"></a>
-<span class="sourceLineNo">922</span>      Path tmpDir = new Path(region.getRegionFileSystem().getTempDir(), Bytes.toString(family));<a name="line.922"></a>
-<span class="sourceLineNo">923</span>      FileStatus[] files = FSUtils.listStatus(fs, tmpDir);<a name="line.923"></a>
-<span class="sourceLineNo">924</span>      String errorMsg = "Expected to find 1 file in the region temp directory "<a name="line.924"></a>
-<span class="sourceLineNo">925</span>          + "from the compaction, could not find any";<a name="line.925"></a>
-<span class="sourceLineNo">926</span>      assertNotNull(errorMsg, files);<a name="line.926"></a>
-<span class="sourceLineNo">927</span>      assertEquals(errorMsg, 1, files.length);<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      // move the file inside region dir<a name="line.928"></a>
-<span class="sourceLineNo">929</span>      Path newFile = region.getRegionFileSystem().commitStoreFile(Bytes.toString(family),<a name="line.929"></a>
-<span class="sourceLineNo">930</span>          files[0].getPath());<a name="line.930"></a>
-<span class="sourceLineNo">931</span><a name="line.931"></a>
-<span class="sourceLineNo">932</span>      byte[] encodedNameAsBytes = this.region.getRegionInfo().getEncodedNameAsBytes();<a name="line.932"></a>
-<span class="sourceLineNo">933</span>      byte[] fakeEncodedNameAsBytes = new byte [encodedNameAsBytes.length];<a name="line.933"></a>
-<span class="sourceLineNo">934</span>      for (int i=0; i &lt; encodedNameAsBytes.length; i++) {<a name="line.934"></a>
-<span class="sourceLineNo">935</span>        // Mix the byte array to have a new encodedName<a name="line.935"></a>
-<span class="sourceLineNo">936</span>        fakeEncodedNameAsBytes[i] = (byte) (encodedNameAsBytes[i] + 1);<a name="line.936"></a>
-<span class="sourceLineNo">937</span>      }<a name="line.937"></a>
-<span class="sourceLineNo">938</span><a name="line.938"></a>
-<span class="sourceLineNo">939</span>      CompactionDescriptor compactionDescriptor = ProtobufUtil.toCompactionDescriptor(this.region<a name="line.939"></a>
-<span class="sourceLineNo">940</span>        .getRegionInfo(), mismatchedRegionName ? fakeEncodedNameAsBytes : null, family,<a name="line.940"></a>
-<span class="sourceLineNo">941</span>            storeFiles, Lists.newArrayList(newFile),<a name="line.941"></a>
-<span class="sourceLineNo">942</span>            region.getRegionFileSystem().getStoreDir(Bytes.toString(family)));<a name="line.942"></a>
-<span class="sourceLineNo">943</span><a name="line.943"></a>
-<span class="sourceLineNo">944</span>      WALUtil.writeCompactionMarker(region.getWAL(), this.region.getReplicationScope(),<a name="line.944"></a>
-<span class="sourceLineNo">945</span>          this.region.getRegionInfo(), compactionDescriptor, region.getMVCC());<a name="line.945"></a>
-<span class="sourceLineNo">946</span><a name="line.946"></a>
-<span class="sourceLineNo">947</span>      Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.947"></a>
-<span class="sourceLineNo">948</span><a name="line.948"></a>
-<span class="sourceLineNo">949</span>      Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", 1000));<a name="line.949"></a>
-<span class="sourceLineNo">950</span>      fs.create(recoveredEdits);<a name="line.950"></a>
-<span class="sourceLineNo">951</span>      WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.951"></a>
-<span class="sourceLineNo">952</span><a name="line.952"></a>
-<span class="sourceLineNo">953</span>      long time = System.nanoTime();<a name="line.953"></a>
-<span class="sourceLineNo">954</span><a name="line.954"></a>
-<span class="sourceLineNo">955</span>      writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, 10, time,<a name="line.955"></a>
-<span class="sourceLineNo">956</span>          HConstants.DEFAULT_CLUSTER_ID), WALEdit.createCompaction(region.getRegionInfo(),<a name="line.956"></a>
-<span class="sourceLineNo">957</span>          compactionDescriptor)));<a name="line.957"></a>
-<span class="sourceLineNo">958</span>      writer.close();<a name="line.958"></a>
-<span class="sourceLineNo">959</span><a name="line.959"></a>
-<span class="sourceLineNo">960</span>      // close the region now, and reopen again<a name="line.960"></a>
-<span class="sourceLineNo">961</span>      region.getTableDescriptor();<a name="line.961"></a>
-<span class="sourceLineNo">962</span>      region.getRegionInfo();<a name="line.962"></a>
-<span class="sourceLineNo">963</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.963"></a>
-<span class="sourceLineNo">964</span>      try {<a name="line.964"></a>
-<span class="sourceLineNo">965</span>        region = HRegion.openHRegion(region, null);<a name="line.965"></a>
-<span class="sourceLineNo">966</span>      } catch (WrongRegionException wre) {<a name="line.966"></a>
-<span class="sourceLineNo">967</span>        fail("Matching encoded region name should not have produced WrongRegionException");<a name="line.967"></a>
-<span class="sourceLineNo">968</span>      }<a name="line.968"></a>
-<span class="sourceLineNo">969</span><a name="line.969"></a>
-<span class="sourceLineNo">970</span>      // now check whether we have only one store file, the compacted one<a name="line.970"></a>
-<span class="sourceLineNo">971</span>      Collection&lt;HStoreFile&gt; sfs = region.getStore(family).getStorefiles();<a name="line.971"></a>
-<span class="sourceLineNo">972</span>      for (HStoreFile sf : sfs) {<a name="line.972"></a>
-<span class="sourceLineNo">973</span>        LOG.info(Objects.toString(sf.getPath()));<a name="line.973"></a>
-<span class="sourceLineNo">974</span>      }<a name="line.974"></a>
-<span class="sourceLineNo">975</span>      if (!mismatchedRegionName) {<a name="line.975"></a>
-<span class="sourceLineNo">976</span>        assertEquals(1, region.getStore(family).getStorefilesCount());<a name="line.976"></a>
-<span class="sourceLineNo">977</span>      }<a name="line.977"></a>
-<span class="sourceLineNo">978</span>      files = FSUtils.listStatus(fs, tmpDir);<a name="line.978"></a>
-<span class="sourceLineNo">979</span>      assertTrue("Expected to find 0 files inside " + tmpDir, files == null || files.length == 0);<a name="line.979"></a>
-<span class="sourceLineNo">980</span><a name="line.980"></a>
-<span class="sourceLineNo">981</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.981"></a>
-<span class="sourceLineNo">982</span>        Get get = new Get(Bytes.toBytes(i));<a name="line.982"></a>
-<span class="sourceLineNo">983</span>        Result result = region.get(get);<a name="line.983"></a>
-<span class="sourceLineNo">984</span>        byte[] value = result.getValue(family, Bytes.toBytes(i));<a name="line.984"></a>
-<span class="sourceLineNo">985</span>        assertArrayEquals(Bytes.toBytes(i), value);<a name="line.985"></a>
-<span class="sourceLineNo">986</span>      }<a name="line.986"></a>
-<span class="sourceLineNo">987</span>    } finally {<a name="line.987"></a>
-<span class="sourceLineNo">988</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.988"></a>
-<span class="sourceLineNo">989</span>      this.region = null;<a name="line.989"></a>
-<span class="sourceLineNo">990</span>      wals.close();<a name="line.990"></a>
-<span class="sourceLineNo">991</span>      CONF.setClass(HConstants.REGION_IMPL, HRegion.class, Region.class);<a name="line.991"></a>
-<span class="sourceLineNo">992</span>    }<a name="line.992"></a>
-<span class="sourceLineNo">993</span>  }<a name="line.993"></a>
-<span class="sourceLineNo">994</span><a name="line.994"></a>
-<span class="sourceLineNo">995</span>  @Test<a name="line.995"></a>
-<span class="sourceLineNo">996</span>  public void testFlushMarkers() throws Exception {<a name="line.996"></a>
-<span class="sourceLineNo">997</span>    // tests that flush markers are written to WAL and handled at recovered edits<a name="line.997"></a>
-<span class="sourceLineNo">998</span>    byte[] family = Bytes.toBytes("family");<a name="line.998"></a>
-<span class="sourceLineNo">999</span>    Path logDir = TEST_UTIL.getDataTestDirOnTestFS(method + ".log");<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>    final Configuration walConf = new Configuration(TEST_UTIL.getConfiguration());<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>    final WALFactory wals = new WALFactory(walConf, method);<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>    final WAL wal = wals.getWAL(RegionInfoBuilder.newBuilder(tableName).build());<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span><a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>    this.region = initHRegion(tableName, HConstants.EMPTY_START_ROW,<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>      HConstants.EMPTY_END_ROW, false, Durability.USE_DEFAULT, wal, family);<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>    try {<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span><a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>      long maxSeqId = 3;<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>      long minSeqId = 0;<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span><a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>        Put put = new Put(Bytes.toBytes(i));<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>        put.addColumn(family, Bytes.toBytes(i), Bytes.toBytes(i));<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>        region.put(put);<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>        region.flush(true);<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>      }<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span><a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>      // this will create a region with 3 files from flush<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>      assertEquals(3, region.getStore(family).getStorefilesCount());<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>      List&lt;String&gt; storeFiles = new ArrayList&lt;&gt;(3);<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>      for (HStoreFile sf : region.getStore(family).getStorefiles()) {<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>        storeFiles.add(sf.getPath().getName());<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>      }<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span><a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>      // now verify that the flush markers are written<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>      wal.shutdown();<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>      WAL.Reader reader = WALFactory.createReader(fs, AbstractFSWALProvider.getCurrentFileName(wal),<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>        TEST_UTIL.getConfiguration());<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>      try {<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>        List&lt;WAL.Entry&gt; flushDescriptors = new ArrayList&lt;&gt;();<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>        long lastFlushSeqId = -1;<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>        while (true) {<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>          WAL.Entry entry = reader.next();<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>          if (entry == null) {<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>            break;<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>          }<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>          Cell cell = entry.getEdit().getCells().get(0);<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>          if (WALEdit.isMetaEditFamily(cell)) {<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>            FlushDescriptor flushDesc = WALEdit.getFlushDescriptor(cell);<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>            assertNotNull(flushDesc);<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>            assertArrayEquals(tableName.getName(), flushDesc.getTableName().toByteArray());<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>            if (flushDesc.getAction() == FlushAction.START_FLUSH) {<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>              assertTrue(flushDesc.getFlushSequenceNumber() &gt; lastFlushSeqId);<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>            } else if (flushDesc.getAction() == FlushAction.COMMIT_FLUSH) {<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>              assertTrue(flushDesc.getFlushSequenceNumber() == lastFlushSeqId);<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>            }<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>            lastFlushSeqId = flushDesc.getFlushSequenceNumber();<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>            assertArrayEquals(regionName, flushDesc.getEncodedRegionName().toByteArray());<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>            assertEquals(1, flushDesc.getStoreFlushesCount()); //only one store<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>            StoreFlushDescriptor storeFlushDesc = flushDesc.getStoreFlushes(0);<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>            assertArrayEquals(family, storeFlushDesc.getFamilyName().toByteArray());<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>            assertEquals("family", storeFlushDesc.getStoreHomeDir());<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>            if (flushDesc.getAction() == FlushAction.START_FLUSH) {<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>              assertEquals(0, storeFlushDesc.getFlushOutputCount());<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>            } else {<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>              assertEquals(1, storeFlushDesc.getFlushOutputCount()); //only one file from flush<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>              assertTrue(storeFiles.contains(storeFlushDesc.getFlushOutput(0)));<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>            }<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span><a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>            flushDescriptors.add(entry);<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>          }<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>        }<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span><a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>        assertEquals(3 * 2, flushDescriptors.size()); // START_FLUSH and COMMIT_FLUSH per flush<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span><a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>        // now write those markers to the recovered edits again.<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span><a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>        Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span><a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", 1000));<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>        fs.create(recoveredEdits);<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span><a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>        for (WAL.Entry entry : flushDescriptors) {<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>          writer.append(entry);<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>        }<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>        writer.close();<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      } finally {<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>        if (null != reader) {<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>          try {<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>            reader.close();<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>          } catch (IOException exception) {<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>            LOG.warn("Problem closing wal: " + exception.getMessage());<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>            LOG.debug("exception details", exception);<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>          }<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>        }<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>      }<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span><a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>      // close the region now, and reopen again<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>      region = HRegion.openHRegion(region, null);<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span><a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>      // now check whether we have can read back the data from region<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>        Get get = new Get(Bytes.toBytes(i));<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>        Result result = region.get(get);<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>        byte[] value = result.getValue(family, Bytes.toBytes(i));<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>        assertArrayEquals(Bytes.toBytes(i), value);<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>      }<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>    } finally {<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>      this.region = null;<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>      wals.close();<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>    }<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>  }<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span><a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>  static class IsFlushWALMarker implements ArgumentMatcher&lt;WALEdit&gt; {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>    volatile FlushAction[] actions;<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>    public IsFlushWALMarker(FlushAction... actions) {<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>      this.actions = actions;<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>    }<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>    @Override<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>    public boolean matches(WALEdit edit) {<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>      List&lt;Cell&gt; cells = edit.getCells();<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>      if (cells.isEmpty()) {<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>        return false;<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>      }<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>      if (WALEdit.isMetaEditFamily(cells.get(0))) {<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>        FlushDescriptor desc;<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>        try {<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>          desc = WALEdit.getFlushDescriptor(cells.get(0));<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>        } catch (IOException e) {<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>          LOG.warn(e.toString(), e);<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>          return false;<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>        }<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>        if (desc != null) {<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>          for (FlushAction action : actions) {<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>            if (desc.getAction() == action) {<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>              return true;<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>            }<a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>          }<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>        }<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>      }<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>      return false;<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>    }<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>    public IsFlushWALMarker set(FlushAction... actions) {<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>      this.actions = actions;<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>      return this;<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>    }<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>  }<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span><a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>  @Test<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>  public void testFlushMarkersWALFail() throws Exception {<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>    // test the cases where the WAL append for flush markers fail.<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>    byte[] family = Bytes.toBytes("family");<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span><a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>    // spy an actual WAL implementation to throw exception (was not able to mock)<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>    Path logDir = TEST_UTIL.getDataTestDirOnTestFS(method + "log");<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span><a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>    final Configuration walConf = new Configuration(TEST_UTIL.getConfiguration());<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>    // Make up a WAL that we can manipulate at append time.<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    class FailAppendFlushMarkerWAL extends FSHLog {<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>      volatile FlushAction [] flushActions = null;<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span><a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>      public FailAppendFlushMarkerWAL(FileSystem fs, Path root, String logDir, Configuration conf)<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>      throws IOException {<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>        super(fs, root, logDir, conf);<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>      }<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span><a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>      @Override<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>      protected Writer createWriterInstance(Path path) throws IOException {<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>        final Writer w = super.createWriterInstance(path);<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>        return new Writer() {<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>          @Override<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>          public void close() throws IOException {<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>            w.close();<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>          }<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span><a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>          @Override<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>          public void sync(boolean forceSync) throws IOException {<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>            w.sync(forceSync);<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>          }<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span><a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>          @Override<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>          public void append(Entry entry) throws IOException {<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>            List&lt;Cell&gt; cells = entry.getEdit().getCells();<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>            if (WALEdit.isMetaEditFamily(cells.get(0))) {<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>              FlushDescriptor desc = WALEdit.getFlushDescriptor(cells.get(0));<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>              if (desc != null) {<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>                for (FlushAction flushAction: flushActions) {<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>                  if (desc.getAction().equals(flushAction)) {<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>                    throw new IOException("Failed to append flush marker! " + flushAction);<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>                  }<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>                }<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>              }<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>            }<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>            w.append(entry);<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>          }<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span><a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>          @Override<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>          public long getLength() {<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>            return w.getLength();<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>          }<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>        };<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>      }<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>    }<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>    FailAppendFlushMarkerWAL wal =<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>      new FailAppendFlushMarkerWAL(FileSystem.get(walConf), FSUtils.getRootDir(walConf),<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>        method, walConf);<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>    wal.init();<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>    this.region = initHRegion(tableName, HConstants.EMPTY_START_ROW,<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>      HConstants.EMPTY_END_ROW, false, Durability.USE_DEFAULT, wal, family);<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>    int i = 0;<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>    Put put = new Put(Bytes.toBytes(i));<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>    put.setDurability(Durability.SKIP_WAL); // have to skip mocked wal<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>    put.addColumn(family, Bytes.toBytes(i), Bytes.toBytes(i));<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>    region.put(put);<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span><a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>    // 1. Test case where START_FLUSH throws exception<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>    wal.flushActions = new FlushAction [] {FlushAction.START_FLUSH};<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span><a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>    // start cache flush will throw exception<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>    try {<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>      region.flush(true);<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>      fail("This should have thrown exception");<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>    } catch (DroppedSnapshotException unexpected) {<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>      // this should not be a dropped snapshot exception. Meaning that RS will not abort<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>      throw unexpected;<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>    } catch (IOException expected) {<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>      // expected<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>    }<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>    // The WAL is hosed now. It has two edits appended. We cannot roll the log without it<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>    // throwing a DroppedSnapshotException to force an abort. Just clean up the mess.<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>    region.close(true);<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>    wal.close();<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span><a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>    // 2. Test case where START_FLUSH succeeds but COMMIT_FLUSH will throw exception<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>    wal.flushActions = new FlushAction [] {FlushAction.COMMIT_FLUSH};<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>    wal = new FailAppendFlushMarkerWAL(FileSystem.get(walConf), FSUtils.getRootDir(walConf),<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>          method, walConf);<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>    wal.init();<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>    this.region = initHRegion(tableName, HConstants.EMPTY_START_ROW,<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>      HConstants.EMPTY_END_ROW, false, Durability.USE_DEFAULT, wal, family);<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    region.put(put);<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span><a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>    // 3. Test case where ABORT_FLUSH will throw exception.<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>    // Even if ABORT_FLUSH throws exception, we should not fail with IOE, but continue with<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>    // DroppedSnapshotException. Below COMMMIT_FLUSH will cause flush to abort<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>    wal.flushActions = new FlushAction [] {FlushAction.COMMIT_FLUSH, FlushAction.ABORT_FLUSH};<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span><a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>    try {<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>      region.flush(true);<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>      fail("This should have thrown exception");<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>    } catch (DroppedSnapshotException expected) {<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>      // we expect this exception, since we were able to write the snapshot, but failed to<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span>      // write the flush marker to WAL<a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>    } catch (IOException unexpected) {<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>      throw unexpected;<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>    }<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>  }<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span><a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>  @Test<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>  public void testGetWhileRegionClose() throws IOException {<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>    Configuration hc = initSplit();<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>    int numRows = 100;<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>    byte[][] families = { fam1, fam2, fam3 };<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span><a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>    // Setting up region<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>    this.region = initHRegion(tableName, method, hc, families);<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>    // Put data in region<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>    final int startRow = 100;<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>    putData(startRow, numRows, qual1, families);<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>    putData(startRow, numRows, qual2, families);<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>    putData(startRow, numRows, qual3, families);<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    final AtomicBoolean done = new AtomicBoolean(false);<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>    final AtomicInteger gets = new AtomicInteger(0);<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>    GetTillDoneOrException[] threads = new GetTillDoneOrException[10];<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>    try {<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>      // Set ten threads running concurrently getting from the region.<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>      for (int i = 0; i &lt; threads.length / 2; i++) {<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>        threads[i] = new GetTillDoneOrException(i, Bytes.toBytes("" + startRow), done, gets);<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>        threads[i].setDaemon(true);<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>        threads[i].start();<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span>      }<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>      // Artificially make the condition by setting closing flag explicitly.<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>      // I can't make the issue happen with a call to region.close().<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>      this.region.closing.set(true);<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>      for (int i = threads.length / 2; i &lt; threads.length; i++) {<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>        threads[i] = new GetTillDoneOrException(i, Bytes.toBytes("" + startRow), done, gets);<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>        threads[i].setDaemon(true);<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>        threads[i].start();<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>      }<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>    } finally {<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>      if (this.region != null) {<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>        HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>        this.region = null;<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>      }<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>    }<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>    done.set(true);<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>    for (GetTillDoneOrException t : threads) {<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>      try {<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>        t.join();<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>      } catch (InterruptedException e) {<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>        e.printStackTrace();<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>      }<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>      if (t.e != null) {<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>        LOG.info("Exception=" + t.e);<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>        assertFalse("Found a NPE in " + t.getName(), t.e instanceof NullPointerException);<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>      }<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>    }<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>  }<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span><a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>  /*<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>   * Thread that does get on single row until 'done' flag is flipped. If an<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>   * exception causes us to fail, it records it.<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>   */<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>  class GetTillDoneOrException extends Thread {<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>    private final Get g;<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>    private final AtomicBoolean done;<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>    private final AtomicInteger count;<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>    private Exception e;<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span><a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>    GetTillDoneOrException(final int i, final byte[] r, final AtomicBoolean d,<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>        final AtomicInteger c) {<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>      super("getter." + i);<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>      this.g = new Get(r);<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>      this.done = d;<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>      this.count = c;<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>    }<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span><a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    @Override<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span>    public void run() {<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>      while (!this.done.get()) {<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>        try {<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>          assertTrue(region.get(g).size() &gt; 0);<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>          this.count.incrementAndGet();<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>        } catch (Exception e) {<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>          this.e = e;<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>          break;<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>        }<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>      }<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>    }<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>  }<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span><a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>  /*<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>   * An involved filter test. Has multiple column families and deletes in mix.<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>   */<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>  @Test<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>  public void testWeirdCacheBehaviour() throws Exception {<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>    byte[][] FAMILIES = new byte[][] { Bytes.toBytes("trans-blob"), Bytes.toBytes("trans-type"),<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>        Bytes.toBytes("trans-date"), Bytes.toBytes("trans-tags"), Bytes.toBytes("trans-group") };<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>    this.region = initHRegion(tableName, method, CONF, FAMILIES);<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>    String value = "this is the value";<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>    String value2 = "this is some other value";<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>    String keyPrefix1 = "prefix1";<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>    String keyPrefix2 = "prefix2";<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>    String keyPrefix3 = "prefix3";<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>    putRows(this.region, 3, value, keyPrefix1);<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>    putRows(this.region, 3, value, keyPrefix2);<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>    putRows(this.region, 3, value, keyPrefix3);<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>    putRows(this.region, 3, value2, keyPrefix1);<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>    putRows(this.region, 3, value2, keyPrefix2);<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>    putRows(this.region, 3, value2, keyPrefix3);<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>    System.out.println("Checking values for key: " + keyPrefix1);<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>    assertEquals("Got back incorrect number of rows from scan", 3,<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>        getNumberOfRows(keyPrefix1, value2, this.region));<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>    System.out.println("Checking values for key: " + keyPrefix2);<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>    assertEquals("Got back incorrect number of rows from scan", 3,<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>        getNumberOfRows(keyPrefix2, value2, this.region));<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>    System.out.println("Checking values for key: " + keyPrefix3);<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>    assertEquals("Got back incorrect number of rows from scan", 3,<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>        getNumberOfRows(keyPrefix3, value2, this.region));<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>    deleteColumns(this.region, value2, keyPrefix1);<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>    deleteColumns(this.region, value2, keyPrefix2);<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>    deleteColumns(this.region, value2, keyPrefix3);<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>    System.out.println("Starting important checks.....");<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>    assertEquals("Got back incorrect number of rows from scan: " + keyPrefix1, 0,<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>        getNumberOfRows(keyPrefix1, value2, this.region));<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>    assertEquals("Got back incorrect number of rows from scan: " + keyPrefix2, 0,<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>        getNumberOfRows(keyPrefix2, value2, this.region));<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>    assertEquals("Got back incorrect number of rows from scan: " + keyPrefix3, 0,<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>        getNumberOfRows(keyPrefix3, value2, this.region));<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>  }<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span><a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>  @Test<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>  public void testAppendWithReadOnlyTable() throws Exception {<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>    this.region = initHRegion(tableName, method, CONF, true, Bytes.toBytes("somefamily"));<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span>    boolean exceptionCaught = false;<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>    Append append = new Append(Bytes.toBytes("somerow"));<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>    append.setDurability(Durability.SKIP_WAL);<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>    append.addColumn(Bytes.toBytes("somefamily"), Bytes.toBytes("somequalifier"),<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>        Bytes.toBytes("somevalue"));<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>    try {<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>      region.append(append);<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>    } catch (IOException e) {<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>      exceptionCaught = true;<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>    }<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>    assertTrue(exceptionCaught == true);<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>  }<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span><a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>  @Test<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>  public void testIncrWithReadOnlyTable() throws Exception {<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>    this.region = initHRegion(tableName, method, CONF, true, Bytes.toBytes("somefamily"));<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>    boolean exceptionCaught = false;<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>    Increment inc = new Increment(Bytes.toBytes("somerow"));<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>    inc.setDurability(Durability.SKIP_WAL);<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>    inc.addColumn(Bytes.toBytes("somefamily"), Bytes.toBytes("somequalifier"), 1L);<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>    try {<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>      region.increment(inc);<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>    } catch (IOException e) {<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>      exceptionCaught = true;<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>    }<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>    assertTrue(exceptionCaught == true);<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>  }<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span><a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>  private void deleteColumns(HRegion r, String value, String keyPrefix) throws IOException {<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>    InternalScanner scanner = buildScanner(keyPrefix, value, r);<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>    int count = 0;<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>    boolean more = false;<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>    do {<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>      more = scanner.next(results);<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>      if (results != null &amp;&amp; !results.isEmpty())<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>        count++;<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>      else<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>        break;<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>      Delete delete = new Delete(CellUtil.cloneRow(results.get(0)));<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>      delete.addColumn(Bytes.toBytes("trans-tags"), Bytes.toBytes("qual2"));<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>      r.delete(delete);<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>      results.clear();<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>    } while (more);<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>    assertEquals("Did not perform correct number of deletes", 3, count);<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>  }<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span><a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>  private int getNumberOfRows(String keyPrefix, String value, HRegion r) throws Exception {<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>    InternalScanner resultScanner = buildScanner(keyPrefix, value, r);<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>    int numberOfResults = 0;<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>    boolean more = false;<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>    do {<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>      more = resultScanner.next(results);<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>      if (results != null &amp;&amp; !results.isEmpty())<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>        numberOfResults++;<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>      else<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>        break;<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>      for (Cell kv : results) {<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>        System.out.println("kv=" + kv.toString() + ", " + Bytes.toString(CellUtil.cloneValue(kv)));<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>      }<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>      results.clear();<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>    } while (more);<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>    return numberOfResults;<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>  }<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span><a name="line.1451"></a>
-<span class="sourceLineNo">1452</span>  private InternalScanner buildScanner(String keyPrefix, String value, HRegion r)<a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>      throws IOException {<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>    // Defaults FilterList.Operator.MUST_PASS_ALL.<a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>    FilterList allFilters = new FilterList();<a name="line.1455"></a>
-<span class="sourceLineNo">1456</span>    allFilters.addFilter(new PrefixFilter(Bytes.toBytes(keyPrefix)));<a name="line.1456"></a>
-<span class="sourceLineNo">1457</span>    // Only return rows where this column value exists in the row.<a name="line.1457"></a>
-<span class="sourceLineNo">1458</span>    SingleColumnValueFilter filter = new SingleColumnValueFilter(Bytes.toBytes("trans-tags"),<a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>        Bytes.toBytes("qual2"), CompareOperator.EQUAL, Bytes.toBytes(value));<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>    filter.setFilterIfMissing(true);<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>    allFilters.addFilter(filter);<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span>    Scan scan = new Scan();<a name="line.1462"></a>
-<span class="sourceLineNo">1463</span>    scan.addFamily(Bytes.toBytes("trans-blob"));<a name="line.1463"></a>
-<span class="sourceLineNo">1464</span>    scan.addFamily(Bytes.toBytes("trans-type"));<a name="line.1464"></a>
-<span class="sourceLineNo">1465</span>    scan.addFamily(Bytes.toBytes("trans-date"));<a name="line.1465"></a>
-<span class="sourceLineNo">1466</span>    scan.addFamily(Bytes.toBytes("trans-tags"));<a name="line.1466"></a>
-<span class="sourceLineNo">1467</span>    scan.addFamily(Bytes.toBytes("trans-group"));<a name="line.1467"></a>
-<span class="sourceLineNo">1468</span>    scan.setFilter(allFilters);<a name="line.1468"></a>
-<span class="sourceLineNo">1469</span>    return r.getScanner(scan);<a name="line.1469"></a>
-<span class="sourceLineNo">1470</span>  }<a name="line.1470"></a>
-<span class="sourceLineNo">1471</span><a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>  private void putRows(HRegion r, int numRows, String value, String key) throws IOException {<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span>    for (int i = 0; i &lt; numRows; i++) {<a name="line.1473"></a>
-<span class="sourceLineNo">1474</span>      String row = key + "_" + i/* UUID.randomUUID().toString() */;<a name="line.1474"></a>
-<span class="sourceLineNo">1475</span>      System.out.println(String.format("Saving row: %s, with value %s", row, value));<a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>      Put put = new Put(Bytes.toBytes(row));<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>      put.setDurability(Durability.SKIP_WAL);<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span>      put.addColumn(Bytes.toBytes("trans-blob"), null, Bytes.toBytes("value for blob"));<a name="line.1478"></a>
-<span class="sourceLineNo">1479</span>      put.addColumn(Bytes.toBytes("trans-type"), null, Bytes.toBytes("statement"));<a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>      put.addColumn(Bytes.toBytes("trans-date"), null, Bytes.toBytes("20090921010101999"));<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>      put.addColumn(Bytes.toBytes("trans-tags"), Bytes.toBytes("qual2"), Bytes.toBytes(value));<a name="line.1481"></a>
-<span class="sourceLineNo">1482</span>      put.addColumn(Bytes.toBytes("trans-group"), null, Bytes.toBytes("adhocTransactionGroupId"));<a name="line.1482"></a>
-<span class="sourceLineNo">1483</span>      r.put(put);<a name="line.1483"></a>
-<span class="sourceLineNo">1484</span>    }<a name="line.1484"></a>
-<span class="sourceLineNo">1485</span>  }<a name="line.1485"></a>
-<span class="sourceLineNo">1486</span><a name="line.1486"></a>
-<span class="sourceLineNo">1487</span>  @Test<a name="line.1487"></a>
-<span class="sourceLineNo">1488</span>  public void testFamilyWithAndWithoutColon() throws Exception {<a name="line.1488"></a>
-<span class="sourceLineNo">1489</span>    byte[] cf = Bytes.toBytes(COLUMN_FAMILY);<a name="line.1489"></a>
-<span class="sourceLineNo">1490</span>    this.region = initHRegion(tableName, method, CONF, cf);<a name="line.1490"></a>
-<span class="sourceLineNo">1491</span>    Put p = new Put(tableName.toBytes());<a name="line.1491"></a>
-<span class="sourceLineNo">1492</span>    byte[] cfwithcolon = Bytes.toBytes(COLUMN_FAMILY + ":");<a name="line.1492"></a>
-<span class="sourceLineNo">1493</span>    p.addColumn(cfwithcolon, cfwithcolon, cfwithcolon);<a name="line.1493"></a>
-<span class="sourceLineNo">1494</span>    boolean exception = false;<a name="line.1494"></a>
-<span class="sourceLineNo">1495</span>    try {<a name="line.1495"></a>
-<span class="sourceLineNo">1496</span>      this.region.put(p);<a name="line.1496"></a>
-<span class="sourceLineNo">1497</span>    } catch (NoSuchColumnFamilyException e) {<a name="line.1497"></a>
-<span class="sourceLineNo">1498</span>      exception = true;<a name="line.1498"></a>
-<span class="sourceLineNo">1499</span>    }<a name="line.1499"></a>
-<span class="sourceLineNo">1500</span>    assertTrue(exception);<a name="line.1500"></a>
-<span class="sourceLineNo">1501</span>  }<a name="line.1501"></a>
-<span class="sourceLineNo">1502</span><a name="line.1502"></a>
-<span class="sourceLineNo">1503</span>  @Test<a name="line.1503"></a>
-<span class="sourceLineNo">1504</span>  public void testBatchPut_whileNoRowLocksHeld() throws IOException {<a name="line.1504"></a>
-<span class="sourceLineNo">1505</span>    final Put[] puts = new Put[10];<a name="line.1505"></a>
-<span class="sourceLineNo">1506</span>    MetricsWALSource source = CompatibilitySingletonFactory.getInstance(MetricsWALSource.class);<a name="line.1506"></a>
-<span class="sourceLineNo">1507</span>    long syncs = prepareRegionForBachPut(puts, source, false);<a name="line.1507"></a>
-<span class="sourceLineNo">1508</span><a name="line.1508"></a>
-<span class="sourceLineNo">1509</span>    OperationStatus[] codes = this.region.batchMutate(puts);<a name="line.1509"></a>
-<span class="sourceLineNo">1510</span>    assertEquals(10, codes.length);<a name="line.1510"></a>
-<span class="sourceLineNo">1511</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.1511"></a>
-<span class="sourceLineNo">1512</span>      assertEquals(OperationStatusCode.SUCCESS, codes[i].getOperationStatusCode());<a name="line.1512"></a>
-<span class="sourceLineNo">1513</span>    }<a name="line.1513"></a>
-<span class="sourceLineNo">1514</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs + 1, source);<a name="line.1514"></a>
-<span class="sourceLineNo">1515</span><a name="line.1515"></a>
-<span class="sourceLineNo">1516</span>    LOG.info("Next a batch put with one invalid family");<a name="line.1516"></a>
-<span class="sourceLineNo">1517</span>    puts[5].addColumn(Bytes.toBytes("BAD_CF"), qual, value);<a name="line.1517"></a>
-<span class="sourceLineNo">1518</span>    codes = this.region.batchMutate(puts);<a name="line.1518"></a>
-<span class="sourceLineNo">1519</span>    assertEquals(10, codes.length);<a name="line.1519"></a>
-<span class="sourceLineNo">1520</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.1520"></a>
-<span class="sourceLineNo">1521</span>      assertEquals((i == 5) ? OperationStatusCode.BAD_FAMILY : OperationStatusCode.SUCCESS,<a name="line.1521"></a>
-<span class="sourceLineNo">1522</span>          codes[i].getOperationStatusCode());<a name="line.1522"></a>
-<span class="sourceLineNo">1523</span>    }<a name="line.1523"></a>
-<span class="sourceLineNo">1524</span><a name="line.1524"></a>
-<span class="sourceLineNo">1525</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs + 2, source);<a name="line.1525"></a>
-<span class="sourceLineNo">1526</span>  }<a name="line.1526"></a>
-<span class="sourceLineNo">1527</span><a name="line.1527"></a>
-<span class="sourceLineNo">1528</span>  @Test<a name="line.1528"></a>
-<span class="sourceLineNo">1529</span>  public void testBatchPut_whileMultipleRowLocksHeld() throws Exception {<a name="line.1529"></a>
-<span class="sourceLineNo">1530</span>    final Put[] puts = new Put[10];<a name="line.1530"></a>
-<span class="sourceLineNo">1531</span>    MetricsWALSource source = CompatibilitySingletonFactory.getInstance(MetricsWALSource.class);<a name="line.1531"></a>
-<span class="sourceLineNo">1532</span>    long syncs = prepareRegionForBachPut(puts, source, false);<a name="line.1532"></a>
-<span class="sourceLineNo">1533</span><a name="line.1533"></a>
-<span class="sourceLineNo">1534</span>    puts[5].addColumn(Bytes.toBytes("BAD_CF"), qual, value);<a name="line.1534"></a>
-<span class="sourceLineNo">1535</span><a name="line.1535"></a>
-<span class="sourceLineNo">1536</span>    LOG.info("batchPut will have to break into four batches to avoid row locks");<a name="line.1536"></a>
-<span class="sourceLineNo">1537</span>    RowLock rowLock1 = region.getRowLock(Bytes.toBytes("row_2"));<a name="line.1537"></a>
-<span class="sourceLineNo">1538</span>    RowLock rowLock2 = region.getRowLock(Bytes.toBytes("row_1"));<a name="line.1538"></a>
-<span class="sourceLineNo">1539</span>    RowLock rowLock3 = region.getRowLock(Bytes.toBytes("row_3"));<a name="line.1539"></a>
-<span class="sourceLineNo">1540</span>    RowLock rowLock4 = region.getRowLock(Bytes.toBytes("row_3"), true);<a name="line.1540"></a>
-<span class="sourceLineNo">1541</span><a name="line.1541"></a>
-<span class="sourceLineNo">1542</span>    MultithreadedTestUtil.TestContext ctx = new MultithreadedTestUtil.TestContext(CONF);<a name="line.1542"></a>
-<span class="sourceLineNo">1543</span>    final AtomicReference&lt;OperationStatus[]&gt; retFromThread = new AtomicReference&lt;&gt;();<a name="line.1543"></a>
-<span class="sourceLineNo">1544</span>    final CountDownLatch startingPuts = new CountDownLatch(1);<a name="line.1544"></a>
-<span class="sourceLineNo">1545</span>    final CountDownLatch startingClose = new CountDownLatch(1);<a name="line.1545"></a>
-<span class="sourceLineNo">1546</span>    TestThread putter = new TestThread(ctx) {<a name="line.1546"></a>
-<span class="sourceLineNo">1547</span>      @Override<a name="line.1547"></a>
-<span class="sourceLineNo">1548</span>      public void doWork() throws IOException {<a name="line.1548"></a>
-<span class="sourceLineNo">1549</span>        startingPuts.countDown();<a name="line.1549"></a>
-<span class="sourceLineNo">1550</span>        retFromThread.set(region.batchMutate(puts));<a name="line.1550"></a>
-<span class="sourceLineNo">1551</span>      }<a name="line.1551"></a>
-<span class="sourceLineNo">1552</span>    };<a name="line.1552"></a>
-<span class="sourceLineNo">1553</span>    LOG.info("...starting put thread while holding locks");<a name="line.1553"></a>
-<span class="sourceLineNo">1554</span>    ctx.addThread(putter);<a name="line.1554"></a>
-<span class="sourceLineNo">1555</span>    ctx.startThreads();<a name="line.1555"></a>
-<span class="sourceLineNo">1556</span><a name="line.1556"></a>
-<span class="sourceLineNo">1557</span>    // Now attempt to close the region from another thread.  Prior to HBASE-12565<a name="line.1557"></a>
-<span class="sourceLineNo">1558</span>    // this would cause the in-progress batchMutate operation to to fail with<a name="line.1558"></a>
-<span class="sourceLineNo">1559</span>    // exception because it use to release and re-acquire the close-guard lock<a name="line.1559"></a>
-<span class="sourceLineNo">1560</span>    // between batches.  Caller then didn't get status indicating which writes succeeded.<a name="line.1560"></a>
-<span class="sourceLineNo">1561</span>    // We now expect this thread to block until the batchMutate call finishes.<a name="line.1561"></a>
-<span class="sourceLineNo">1562</span>    Thread regionCloseThread = new TestThread(ctx) {<a name="line.1562"></a>
-<span class="sourceLineNo">1563</span>      @Override<a name="line.1563"></a>
-<span class="sourceLineNo">1564</span>      public void doWork() {<a name="line.1564"></a>
-<span class="sourceLineNo">1565</span>        try {<a name="line.1565"></a>
-<span class="sourceLineNo">1566</span>          startingPuts.await();<a name="line.1566"></a>
-<span class="sourceLineNo">1567</span>          // Give some time for the batch mutate to get in.<a name="line.1567"></a>
-<span class="sourceLineNo">1568</span>          // We don't want to race with the mutate<a name="line.1568"></a>
-<span class="sourceLineNo">1569</span>          Thread.sleep(10);<a name="line.1569"></a>
-<span class="sourceLineNo">1570</span>          startingClose.countDown();<a name="line.1570"></a>
-<span class="sourceLineNo">1571</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.1571"></a>
-<span class="sourceLineNo">1572</span>          region = null;<a name="line.1572"></a>
-<span class="sourceLineNo">1573</span>        } catch (IOException e) {<a name="line.1573"></a>
-<span class="sourceLineNo">1574</span>          throw new RuntimeException(e);<a name="line.1574"></a>
-<span class="sourceLineNo">1575</span>        } catch (InterruptedException e) {<a name="line.1575"></a>
-<span class="sourceLineNo">1576</span>          throw new RuntimeException(e);<a name="line.1576"></a>
-<span class="sourceLineNo">1577</span>        }<a name="line.1577"></a>
-<span class="sourceLineNo">1578</span>      }<a name="line.1578"></a>
-<span class="sourceLineNo">1579</span>    };<a name="line.1579"></a>
-<span class="sourceLineNo">1580</span>    regionCloseThread.start();<a name="line.1580"></a>
-<span class="sourceLineNo">1581</span><a name="line.1581"></a>
-<span class="sourceLineNo">1582</span>    startingClose.await();<a name="line.1582"></a>
-<span class="sourceLineNo">1583</span>    startingPuts.await();<a name="line.1583"></a>
-<span class="sourceLineNo">1584</span>    Thread.sleep(100);<a name="line.1584"></a>
-<span class="sourceLineNo">1585</span>    LOG.info("...releasing row lock 1, which should let put thread continue");<a name="line.1585"></a>
-<span class="sourceLineNo">1586</span>    rowLock1.release();<a name="line.1586"></a>
-<span class="sourceLineNo">1587</span>    rowLock2.release();<a name="line.1587"></a>
-<span class="sourceLineNo">1588</span>    rowLock3.release();<a name="line.1588"></a>
-<span class="sourceLineNo">1589</span>    waitForCounter(source, "syncTimeNumOps", syncs + 1);<a name="line.1589"></a>
-<span class="sourceLineNo">1590</span><a name="line.1590"></a>
-<span class="sourceLineNo">1591</span>    LOG.info("...joining on put thread");<a name="line.1591"></a>
-<span class="sourceLineNo">1592</span>    ctx.stop();<a name="line.1592"></a>
-<span class="sourceLineNo">1593</span>    regionCloseThread.join();<a name="line.1593"></a>
-<span class="sourceLineNo">1594</span><a name="line.1594"></a>
-<span class="sourceLineNo">1595</span>    OperationStatus[] codes = retFromThread.get();<a name="line.1595"></a>
-<span class="sourceLineNo">1596</span>    for (int i = 0; i &lt; codes.length; i++) {<a name="line.1596"></a>
-<span class="sourceLineNo">1597</span>      assertEquals((i == 5) ? OperationStatusCode.BAD_FAMILY : OperationStatusCode.SUCCESS,<a name="line.1597"></a>
-<span class="sourceLineNo">1598</span>          codes[i].getOperationStatusCode());<a name="line.1598"></a>
-<span class="sourceLineNo">1599</span>    }<a name="line.1599"></a>
-<span class="sourceLineNo">1600</span>    rowLock4.release();<a name="line.1600"></a>
-<span class="sourceLineNo">1601</span>  }<a name="line.1601"></a>
-<span class="sourceLineNo">1602</span><a name="line.1602"></a>
-<span class="sourceLineNo">1603</span>  private void waitForCounter(MetricsWALSource source, String metricName, long expectedCount)<a name="line.1603"></a>
-<span class="sourceLineNo">1604</span>      throws InterruptedException {<a name="line.1604"></a>
-<span class="sourceLineNo">1605</span>    long startWait = System.currentTimeMillis();<a name="line.1605"></a>
-<span class="sourceLineNo">1606</span>    long currentCount;<a name="line.1606"></a>
-<span class="sourceLineNo">1607</span>    while ((currentCount = metricsAssertHelper.getCounter(metricName, source)) &lt; expectedCount) {<a name="line.1607"></a>
-<span class="sourceLineNo">1608</span>      Thread.sleep(100);<a name="line.1608"></a>
-<span class="sourceLineNo">1609</span>      if (System.currentTimeMillis() - startWait &gt; 10000) {<a name="line.1609"></a>
-<span class="sourceLineNo">1610</span>        fail(String.format("Timed out waiting for '%s' &gt;= '%s', currentCount=%s", metricName,<a name="line.1610"></a>
-<span class="sourceLineNo">1611</span>            expectedCount, currentCount));<a name="line.1611"></a>
-<span class="sourceLineNo">1612</span>      }<a name="line.1612"></a>
-<span class="sourceLineNo">1613</span>    }<a name="line.1613"></a>
-<span class="sourceLineNo">1614</span>  }<a name="line.1614"></a>
-<span class="sourceLineNo">1615</span><a name="line.1615"></a>
-<span class="sourceLineNo">1616</span>  @Test<a name="line.1616"></a>
-<span class="sourceLineNo">1617</span>  public void testAtomicBatchPut() throws IOException {<a name="line.1617"></a>
-<span class="sourceLineNo">1618</span>    final Put[] puts = new Put[10];<a name="line.1618"></a>
-<span class="sourceLineNo">1619</span>    MetricsWALSource source = CompatibilitySingletonFactory.getInstance(MetricsWALSource.class);<a name="line.1619"></a>
-<span class="sourceLineNo">1620</span>    long syncs = prepareRegionForBachPut(puts, source, false);<a name="line.1620"></a>
-<span class="sourceLineNo">1621</span><a name="line.1621"></a>
-<span class="sourceLineNo">1622</span>    // 1. Straight forward case, should succeed<a name="line.1622"></a>
-<span class="sourceLineNo">1623</span>    MutationBatchOperation batchOp = new MutationBatchOperation(region, puts, true,<a name="line.1623"></a>
-<span class="sourceLineNo">1624</span>        HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.1624"></a>
-<span class="sourceLineNo">1625</span>    OperationStatus[] codes = this.region.batchMutate(batchOp);<a name="line.1625"></a>
-<span class="sourceLineNo">1626</span>    assertEquals(10, codes.length);<a name="line.1626"></a>
-<span class="sourceLineNo">1627</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.1627"></a>
-<span class="sourceLineNo">1628</span>      assertEquals(OperationStatusCode.SUCCESS, codes[i].getOperationStatusCode());<a name="line.1628"></a>
-<span class="sourceLineNo">1629</span>    }<a name="line.1629"></a>
-<span class="sourceLineNo">1630</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs + 1, source);<a name="line.1630"></a>
-<span class="sourceLineNo">1631</span><a name="line.1631"></a>
-<span class="sourceLineNo">1632</span>    // 2. Failed to get lock<a name="line.1632"></a>
-<span class="sourceLineNo">1633</span>    RowLock lock = region.getRowLock(Bytes.toBytes("row_" + 3));<a name="line.1633"></a>
-<span class="sourceLineNo">1634</span>    // Method {@link HRegion#getRowLock(byte[])} is reentrant. As 'row_3' is locked in this<a name="line.1634"></a>
-<span class="sourceLineNo">1635</span>    // thread, need to run {@link HRegion#batchMutate(HRegion.BatchOperation)} in different thread<a name="line.1635"></a>
-<span class="sourceLineNo">1636</span>    MultithreadedTestUtil.TestContext ctx = new MultithreadedTestUtil.TestContext(CONF);<a name="line.1636"></a>
-<span class="sourceLineNo">1637</span>    final AtomicReference&lt;IOException&gt; retFromThread = new AtomicReference&lt;&gt;();<a name="line.1637"></a>
-<span class="sourceLineNo">1638</span>    final CountDownLatch finishedPuts = new CountDownLatch(1);<a name="line.1638"></a>
-<span class="sourceLineNo">1639</span>    final MutationBatchOperation finalBatchOp = new MutationBatchOperation(region, puts, true,<a name="line.1639"></a>
-<span class="sourceLineNo">1640</span>        HConstants<a name="line.1640"></a>
-<span class="sourceLineNo">1641</span>        .NO_NONCE,<a name="line.1641"></a>
-<span class="sourceLineNo">1642</span>        HConstants.NO_NONCE);<a name="line.1642"></a>
-<span class="sourceLineNo">1643</span>    TestThread putter = new TestThread(ctx) {<a name="line.1643"></a>
-<span class="sourceLineNo">1644</span>      @Override<a name="line.1644"></a>
-<span class="sourceLineNo">1645</span>      public void doWork() throws IOException {<a name="line.1645"></a>
-<span class="sourceLineNo">1646</span>        try {<a name="line.1646"></a>
-<span class="sourceLineNo">1647</span>          region.batchMutate(finalBatchOp);<a name="line.1647"></a>
-<span class="sourceLineNo">1648</span>        } catch (IOException ioe) {<a name="line.1648"></a>
-<span class="sourceLineNo">1649</span>          LOG.error("test failed!", ioe);<a name="line.1649"></a>
-<span class="sourceLineNo">1650</span>          retFromThread.set(ioe);<a name="line.1650"></a>
-<span class="sourceLineNo">1651</span>        }<a name="line.1651"></a>
-<span class="sourceLineNo">1652</span>        finishedPuts.countDown();<a name="line.1652"></a>
-<span class="sourceLineNo">1653</span>      }<a name="line.1653"></a>
-<span class="sourceLineNo">1654</span>    };<a name="line.1654"></a>
-<span class="sourceLineNo">1655</span>    LOG.info("...starting put thread while holding locks");<a name="line.1655"></a>
-<span class="sourceLineNo">1656</span>    ctx.addThread(putter);<a name="line.1656"></a>
-<span class="sourceLineNo">1657</span>    ctx.startThreads();<a name="line.1657"></a>
-<span class="sourceLineNo">1658</span>    LOG.info("...waiting for batch puts while holding locks");<a name="line.1658"></a>
-<span class="sourceLineNo">1659</span>    try {<a name="line.1659"></a>
-<span class="sourceLineNo">1660</span>      finishedPuts.await();<a name="line.1660"></a>
-<span class="sourceLineNo">1661</span>    } catch (InterruptedException e) {<a name="line.1661"></a>
-<span class="sourceLineNo">1662</span>      LOG.error("Interrupted!", e);<a name="line.1662"></a>
-<span class="sourceLineNo">1663</span>    } finally {<a name="line.1663"></a>
-<span class="sourceLineNo">1664</span>      if (lock != null) {<a name="line.1664"></a>
-<span class="sourceLineNo">1665</span>        lock.release();<a name="line.1665"></a>
-<span class="sourceLineNo">1666</span>      }<a name="line.1666"></a>
-<span class="sourceLineNo">1667</span>    }<a name="line.1667"></a>
-<span class="sourceLineNo">1668</span>    assertNotNull(retFromThread.get());<a name="line.1668"></a>
-<span class="sourceLineNo">1669</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs + 1, source);<a name="line.1669"></a>
-<span class="sourceLineNo">1670</span><a name="line.1670"></a>
-<span class="sourceLineNo">1671</span>    // 3. Exception thrown in validation<a name="line.1671"></a>
-<span class="sourceLineNo">1672</span>    LOG.info("Next a batch put with one invalid family");<a name="line.1672"></a>
-<span class="sourceLineNo">1673</span>    puts[5].addColumn(Bytes.toBytes("BAD_CF"), qual, value);<a name="line.1673"></a>
-<span class="sourceLineNo">1674</span>    batchOp = new MutationBatchOperation(region, puts, true, HConstants.NO_NONCE,<a name="line.1674"></a>
-<span class="sourceLineNo">1675</span>        HConstants.NO_NONCE);<a name="line.1675"></a>
-<span class="sourceLineNo">1676</span>    thrown.expect(NoSuchColumnFamilyException.class);<a name="line.1676"></a>
-<span class="sourceLineNo">1677</span>    this.region.batchMutate(batchOp);<a name="line.1677"></a>
-<span class="sourceLineNo">1678</span>  }<a name="line.1678"></a>
-<span class="sourceLineNo">1679</span><a name="line.1679"></a>
-<span class="sourceLineNo">1680</span>  @Test<a name="line.1680"></a>
-<span class="sourceLineNo">1681</span>  public void testBatchPutWithTsSlop() throws Exception {<a name="line.1681"></a>
-<span class="sourceLineNo">1682</span>    // add data with a timestamp that is too recent for range. Ensure assert<a name="line.1682"></a>
-<span class="sourceLineNo">1683</span>    CONF.setInt("hbase.hregion.keyvalue.timestamp.slop.millisecs", 1000);<a name="line.1683"></a>
-<span class="sourceLineNo">1684</span>    final Put[] puts = new Put[10];<a name="line.1684"></a>
-<span class="sourceLineNo">1685</span>    MetricsWALSource source = CompatibilitySingletonFactory.getInstance(MetricsWALSource.class);<a name="line.1685"></a>
-<span class="sourceLineNo">1686</span><a name="line.1686"></a>
-<span class="sourceLineNo">1687</span>    long syncs = prepareRegionForBachPut(puts, source, true);<a name="line.1687"></a>
-<span class="sourceLineNo">1688</span><a name="line.1688"></a>
-<span class="sourceLineNo">1689</span>    OperationStatus[] codes = this.region.batchMutate(puts);<a name="line.1689"></a>
-<span class="sourceLineNo">1690</span>    assertEquals(10, codes.length);<a name="line.1690"></a>
-<span class="sourceLineNo">1691</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.1691"></a>
-<span class="sourceLineNo">1692</span>      assertEquals(OperationStatusCode.SANITY_CHECK_FAILURE, codes[i].getOperationStatusCode());<a name="line.1692"></a>
-<span class="sourceLineNo">1693</span>    }<a name="line.1693"></a>
-<span class="sourceLineNo">1694</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs, source);<a name="line.1694"></a>
-<span class="sourceLineNo">1695</span>  }<a name="line.1695"></a>
-<span class="sourceLineNo">1696</span><a name="line.1696"></a>
-<span class="sourceLineNo">1697</span>  /**<a name="line.1697"></a>
-<span class="sourceLineNo">1698</span>   * @return syncs initial syncTimeNumOps<a name="line.1698"></a>
-<span class="sourceLineNo">1699</span>   */<a name="line.1699"></a>
-<span class="sourceLineNo">1700</span>  private long prepareRegionForBachPut(final Put[] puts, final MetricsWALSource source,<a name="line.1700"></a>
-<span class="sourceLineNo">1701</span>      boolean slop) throws IOException {<a name="line.1701"></a>
-<span class="sourceLineNo">1702</span>    this.region = initHRegion(tableName, method, CONF, COLUMN_FAMILY_BYTES);<a name="line.1702"></a>
-<span class="sourceLineNo">1703</span><a name="line.1703"></a>
-<span class="sourceLineNo">1704</span>    LOG.info("First a batch put with all valid puts");<a name="line.1704"></a>
-<span class="sourceLineNo">1705</span>    for (int i = 0; i &lt; puts.length; i++) {<a name="line.1705"></a>
-<span class="sourceLineNo">1706</span>      puts[i] = slop ? new Put(Bytes.toBytes("row_" + i), Long.MAX_VALUE - 100) :<a name="line.1706"></a>
-<span class="sourceLineNo">1707</span>          new Put(Bytes.toBytes("row_" + i));<a name="line.1707"></a>
-<span class="sourceLineNo">1708</span>      puts[i].addColumn(COLUMN_FAMILY_BYTES, qual, value);<a name="line.1708"></a>
-<span class="sourceLineNo">1709</span>    }<a name="line.1709"></a>
-<span class="sourceLineNo">1710</span><a name="line.1710"></a>
-<span class="sourceLineNo">1711</span>    long syncs = metricsAssertHelper.getCounter("syncTimeNumOps", source);<a name="line.1711"></a>
-<span class="sourceLineNo">1712</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs, source);<a name="line.1712"></a>
-<span class="sourceLineNo">1713</span>    return syncs;<a name="line.1713"></a>
-<span class="sourceLineNo">1714</span>  }<a name="line.1714"></a>
-<span class="sourceLineNo">1715</span><a name="line.1715"></a>
-<span class="sourceLineNo">1716</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.1716"></a>
-<span class="sourceLineNo">1717</span>  // checkAndMutate tests<a name="line.1717"></a>
-<span class="sourceLineNo">1718</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.1718"></a>
-<span class="sourceLineNo">1719</span>  @Test<a name="line.1719"></a>
-<span class="sourceLineNo">1720</span>  public void testCheckAndMutate_WithEmptyRowValue() throws IOException {<a name="line.1720"></a>
-<span class="sourceLineNo">1721</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1721"></a>
-<span class="sourceLineNo">1722</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1722"></a>
-<span class="sourceLineNo">1723</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1723"></a>
-<span class="sourceLineNo">1724</span>    byte[] emptyVal = new byte[] {};<a name="line.1724"></a>
-<span class="sourceLineNo">1725</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1725"></a>
-<span class="sourceLineNo">1726</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.1726"></a>
-<span class="sourceLineNo">1727</span><a name="line.1727"></a>
-<span class="sourceLineNo">1728</span>    // Setting up region<a name="line.1728"></a>
-<span class="sourceLineNo">1729</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.1729"></a>
-<span class="sourceLineNo">1730</span>    // Putting empty data in key<a name="line.1730"></a>
-<span class="sourceLineNo">1731</span>    Put put = new Put(row1);<a name="line.1731"></a>
-<span class="sourceLineNo">1732</span>    put.addColumn(fam1, qf1, emptyVal);<a name="line.1732"></a>
-<span class="sourceLineNo">1733</span><a name="line.1733"></a>
-<span class="sourceLineNo">1734</span>    // checkAndPut with empty value<a name="line.1734"></a>
-<span class="sourceLineNo">1735</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1735"></a>
-<span class="sourceLineNo">1736</span>        new BinaryComparator(emptyVal), put);<a name="line.1736"></a>
-<span class="sourceLineNo">1737</span>    assertTrue(res);<a name="line.1737"></a>
-<span class="sourceLineNo">1738</span><a name="line.1738"></a>
-<span class="sourceLineNo">1739</span>    // Putting data in key<a name="line.1739"></a>
-<span class="sourceLineNo">1740</span>    put = new Put(row1);<a name="line.1740"></a>
-<span class="sourceLineNo">1741</span>    put.addColumn(fam1, qf1, val1);<a name="line.1741"></a>
-<span class="sourceLineNo">1742</span><a name="line.1742"></a>
-<span class="sourceLineNo">1743</span>    // checkAndPut with correct value<a name="line.1743"></a>
-<span class="sourceLineNo">1744</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1744"></a>
-<span class="sourceLineNo">1745</span>        new BinaryComparator(emptyVal), put);<a name="line.1745"></a>
-<span class="sourceLineNo">1746</span>    assertTrue(res);<a name="line.1746"></a>
-<span class="sourceLineNo">1747</span><a name="line.1747"></a>
-<span class="sourceLineNo">1748</span>    // not empty anymore<a name="line.1748"></a>
-<span class="sourceLineNo">1749</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1749"></a>
-<span class="sourceLineNo">1750</span>        new BinaryComparator(emptyVal), put);<a name="line.1750"></a>
-<span class="sourceLineNo">1751</span>    assertFalse(res);<a name="line.1751"></a>
-<span class="sourceLineNo">1752</span><a name="line.1752"></a>
-<span class="sourceLineNo">1753</span>    Delete delete = new Delete(row1);<a name="line.1753"></a>
-<span class="sourceLineNo">1754</span>    delete.addColumn(fam1, qf1);<a name="line.1754"></a>
-<span class="sourceLineNo">1755</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1755"></a>
-<span class="sourceLineNo">1756</span>        new BinaryComparator(emptyVal), delete);<a name="line.1756"></a>
-<span class="sourceLineNo">1757</span>    assertFalse(res);<a name="line.1757"></a>
-<span class="sourceLineNo">1758</span><a name="line.1758"></a>
-<span class="sourceLineNo">1759</span>    put = new Put(row1);<a name="line.1759"></a>
-<span class="sourceLineNo">1760</span>    put.addColumn(fam1, qf1, val2);<a name="line.1760"></a>
-<span class="sourceLineNo">1761</span>    // checkAndPut with correct value<a name="line.1761"></a>
-<span class="sourceLineNo">1762</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1762"></a>
-<span class="sourceLineNo">1763</span>        new BinaryComparator(val1), put);<a name="line.1763"></a>
-<span class="sourceLineNo">1764</span>    assertTrue(res);<a name="line.1764"></a>
-<span class="sourceLineNo">1765</span><a name="line.1765"></a>
-<span class="sourceLineNo">1766</span>    // checkAndDelete with correct value<a name="line.1766"></a>
-<span class="sourceLineNo">1767</span>    delete = new Delete(row1);<a name="line.1767"></a>
-<span class="sourceLineNo">1768</span>    delete.addColumn(fam1, qf1);<a name="line.1768"></a>
+<span class="sourceLineNo">404</span>    ChunkCreator.initialize(MemStoreLABImpl.CHUNK_SIZE_DEFAULT, false, 0, 0, 0, null);<a name="line.404"></a>
+<span class="sourceLineNo">405</span>    FSHLog hLog = new FSHLog(fs, rootDir, testName, CONF);<a name="line.405"></a>
+<span class="sourceLineNo">406</span>    hLog.init();<a name="line.406"></a>
+<span class="sourceLineNo">407</span>    region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, hLog,<a name="line.407"></a>
+<span class="sourceLineNo">408</span>        COLUMN_FAMILY_BYTES);<a name="line.408"></a>
+<span class="sourceLineNo">409</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.409"></a>
+<span class="sourceLineNo">410</span>    assertEquals(0, region.getMemStoreDataSize());<a name="line.410"></a>
+<span class="sourceLineNo">411</span><a name="line.411"></a>
+<span class="sourceLineNo">412</span>    // Put one value<a name="line.412"></a>
+<span class="sourceLineNo">413</span>    byte [] value = Bytes.toBytes(method);<a name="line.413"></a>
+<span class="sourceLineNo">414</span>    Put put = new Put(value);<a name="line.414"></a>
+<span class="sourceLineNo">415</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    region.put(put);<a name="line.416"></a>
+<span class="sourceLineNo">417</span>    long onePutSize = region.getMemStoreDataSize();<a name="line.417"></a>
+<span class="sourceLineNo">418</span>    assertTrue(onePutSize &gt; 0);<a name="line.418"></a>
+<span class="sourceLineNo">419</span><a name="line.419"></a>
+<span class="sourceLineNo">420</span>    RegionCoprocessorHost mockedCPHost = Mockito.mock(RegionCoprocessorHost.class);<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    doThrow(new IOException())<a name="line.421"></a>
+<span class="sourceLineNo">422</span>       .when(mockedCPHost).postBatchMutate(Mockito.&lt;MiniBatchOperationInProgress&lt;Mutation&gt;&gt;any());<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    region.setCoprocessorHost(mockedCPHost);<a name="line.423"></a>
+<span class="sourceLineNo">424</span><a name="line.424"></a>
+<span class="sourceLineNo">425</span>    put = new Put(value);<a name="line.425"></a>
+<span class="sourceLineNo">426</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("dfg"), value);<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    try {<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      region.put(put);<a name="line.428"></a>
+<span class="sourceLineNo">429</span>      fail("Should have failed with IOException");<a name="line.429"></a>
+<span class="sourceLineNo">430</span>    } catch (IOException expected) {<a name="line.430"></a>
+<span class="sourceLineNo">431</span>    }<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    long expectedSize = onePutSize * 2;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>    assertEquals("memstoreSize should be incremented",<a name="line.433"></a>
+<span class="sourceLineNo">434</span>        expectedSize, region.getMemStoreDataSize());<a name="line.434"></a>
+<span class="sourceLineNo">435</span>    assertEquals("flushable size should be incremented",<a name="line.435"></a>
+<span class="sourceLineNo">436</span>        expectedSize, store.getFlushableSize().getDataSize());<a name="line.436"></a>
+<span class="sourceLineNo">437</span><a name="line.437"></a>
+<span class="sourceLineNo">438</span>    region.setCoprocessorHost(null);<a name="line.438"></a>
+<span class="sourceLineNo">439</span>  }<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>   * A test case of HBASE-21041<a name="line.442"></a>
+<span class="sourceLineNo">443</span>   * @throws Exception Exception<a name="line.443"></a>
+<span class="sourceLineNo">444</span>   */<a name="line.444"></a>
+<span class="sourceLineNo">445</span>  @Test<a name="line.445"></a>
+<span class="sourceLineNo">446</span>  public void testFlushAndMemstoreSizeCounting() throws Exception {<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    byte[] family = Bytes.toBytes("family");<a name="line.447"></a>
+<span class="sourceLineNo">448</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.448"></a>
+<span class="sourceLineNo">449</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.449"></a>
+<span class="sourceLineNo">450</span>    try {<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      for (byte[] row : HBaseTestingUtility.ROWS) {<a name="line.451"></a>
+<span class="sourceLineNo">452</span>        Put put = new Put(row);<a name="line.452"></a>
+<span class="sourceLineNo">453</span>        put.addColumn(family, family, row);<a name="line.453"></a>
+<span class="sourceLineNo">454</span>        region.put(put);<a name="line.454"></a>
+<span class="sourceLineNo">455</span>      }<a name="line.455"></a>
+<span class="sourceLineNo">456</span>      region.flush(true);<a name="line.456"></a>
+<span class="sourceLineNo">457</span>      // After flush, data size should be zero<a name="line.457"></a>
+<span class="sourceLineNo">458</span>      assertEquals(0, region.getMemStoreDataSize());<a name="line.458"></a>
+<span class="sourceLineNo">459</span>      // After flush, a new active mutable segment is created, so the heap size<a name="line.459"></a>
+<span class="sourceLineNo">460</span>      // should equal to MutableSegment.DEEP_OVERHEAD<a name="line.460"></a>
+<span class="sourceLineNo">461</span>      assertEquals(MutableSegment.DEEP_OVERHEAD, region.getMemStoreHeapSize());<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      // After flush, offheap should be zero<a name="line.462"></a>
+<span class="sourceLineNo">463</span>      assertEquals(0, region.getMemStoreOffHeapSize());<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    } finally {<a name="line.464"></a>
+<span class="sourceLineNo">465</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.465"></a>
+<span class="sourceLineNo">466</span>      this.region = null;<a name="line.466"></a>
+<span class="sourceLineNo">467</span>      wals.close();<a name="line.467"></a>
+<span class="sourceLineNo">468</span>    }<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>  /**<a name="line.471"></a>
+<span class="sourceLineNo">472</span>   * Test we do not lose data if we fail a flush and then close.<a name="line.472"></a>
+<span class="sourceLineNo">473</span>   * Part of HBase-10466.  Tests the following from the issue description:<a name="line.473"></a>
+<span class="sourceLineNo">474</span>   * "Bug 1: Wrong calculation of HRegion.memstoreSize: When a flush fails, data to be flushed is<a name="line.474"></a>
+<span class="sourceLineNo">475</span>   * kept in each MemStore's snapshot and wait for next flush attempt to continue on it. But when<a name="line.475"></a>
+<span class="sourceLineNo">476</span>   * the next flush succeeds, the counter of total memstore size in HRegion is always deduced by<a name="line.476"></a>
+<span class="sourceLineNo">477</span>   * the sum of current memstore sizes instead of snapshots left from previous failed flush. This<a name="line.477"></a>
+<span class="sourceLineNo">478</span>   * calculation is problematic that almost every time there is failed flush, HRegion.memstoreSize<a name="line.478"></a>
+<span class="sourceLineNo">479</span>   * gets reduced by a wrong value. If region flush could not proceed for a couple cycles, the size<a name="line.479"></a>
+<span class="sourceLineNo">480</span>   * in current memstore could be much larger than the snapshot. It's likely to drift memstoreSize<a name="line.480"></a>
+<span class="sourceLineNo">481</span>   * much smaller than expected. In extreme case, if the error accumulates to even bigger than<a name="line.481"></a>
+<span class="sourceLineNo">482</span>   * HRegion's memstore size limit, any further flush is skipped because flush does not do anything<a name="line.482"></a>
+<span class="sourceLineNo">483</span>   * if memstoreSize is not larger than 0."<a name="line.483"></a>
+<span class="sourceLineNo">484</span>   * @throws Exception<a name="line.484"></a>
+<span class="sourceLineNo">485</span>   */<a name="line.485"></a>
+<span class="sourceLineNo">486</span>  @Test<a name="line.486"></a>
+<span class="sourceLineNo">487</span>  public void testFlushSizeAccounting() throws Exception {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.488"></a>
+<span class="sourceLineNo">489</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.489"></a>
+<span class="sourceLineNo">490</span>    // Only retry once.<a name="line.490"></a>
+<span class="sourceLineNo">491</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.491"></a>
+<span class="sourceLineNo">492</span>    final User user =<a name="line.492"></a>
+<span class="sourceLineNo">493</span>      User.createUserForTesting(conf, method, new String[]{"foo"});<a name="line.493"></a>
+<span class="sourceLineNo">494</span>    // Inject our faulty LocalFileSystem<a name="line.494"></a>
+<span class="sourceLineNo">495</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.496"></a>
+<span class="sourceLineNo">497</span>      @Override<a name="line.497"></a>
+<span class="sourceLineNo">498</span>      public Object run() throws Exception {<a name="line.498"></a>
+<span class="sourceLineNo">499</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.499"></a>
+<span class="sourceLineNo">500</span>        FileSystem fs = FileSystem.get(conf);<a name="line.500"></a>
+<span class="sourceLineNo">501</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.501"></a>
+<span class="sourceLineNo">502</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.502"></a>
+<span class="sourceLineNo">503</span>        HRegion region = null;<a name="line.503"></a>
+<span class="sourceLineNo">504</span>        try {<a name="line.504"></a>
+<span class="sourceLineNo">505</span>          // Initialize region<a name="line.505"></a>
+<span class="sourceLineNo">506</span>          region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, wal,<a name="line.506"></a>
+<span class="sourceLineNo">507</span>              COLUMN_FAMILY_BYTES);<a name="line.507"></a>
+<span class="sourceLineNo">508</span>          long size = region.getMemStoreDataSize();<a name="line.508"></a>
+<span class="sourceLineNo">509</span>          Assert.assertEquals(0, size);<a name="line.509"></a>
+<span class="sourceLineNo">510</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.510"></a>
+<span class="sourceLineNo">511</span>          Put p1 = new Put(row);<a name="line.511"></a>
+<span class="sourceLineNo">512</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[]) null));<a name="line.512"></a>
+<span class="sourceLineNo">513</span>          region.put(p1);<a name="line.513"></a>
+<span class="sourceLineNo">514</span>          final long sizeOfOnePut = region.getMemStoreDataSize();<a name="line.514"></a>
+<span class="sourceLineNo">515</span>          // Fail a flush which means the current memstore will hang out as memstore 'snapshot'.<a name="line.515"></a>
+<span class="sourceLineNo">516</span>          try {<a name="line.516"></a>
+<span class="sourceLineNo">517</span>            LOG.info("Flushing");<a name="line.517"></a>
+<span class="sourceLineNo">518</span>            region.flush(true);<a name="line.518"></a>
+<span class="sourceLineNo">519</span>            Assert.fail("Didn't bubble up IOE!");<a name="line.519"></a>
+<span class="sourceLineNo">520</span>          } catch (DroppedSnapshotException dse) {<a name="line.520"></a>
+<span class="sourceLineNo">521</span>            // What we are expecting<a name="line.521"></a>
+<span class="sourceLineNo">522</span>            region.closing.set(false); // this is needed for the rest of the test to work<a name="line.522"></a>
+<span class="sourceLineNo">523</span>          }<a name="line.523"></a>
+<span class="sourceLineNo">524</span>          // Make it so all writes succeed from here on out<a name="line.524"></a>
+<span class="sourceLineNo">525</span>          ffs.fault.set(false);<a name="line.525"></a>
+<span class="sourceLineNo">526</span>          // Check sizes.  Should still be the one entry.<a name="line.526"></a>
+<span class="sourceLineNo">527</span>          Assert.assertEquals(sizeOfOnePut, region.getMemStoreDataSize());<a name="line.527"></a>
+<span class="sourceLineNo">528</span>          // Now add two entries so that on this next flush that fails, we can see if we<a name="line.528"></a>
+<span class="sourceLineNo">529</span>          // subtract the right amount, the snapshot size only.<a name="line.529"></a>
+<span class="sourceLineNo">530</span>          Put p2 = new Put(row);<a name="line.530"></a>
+<span class="sourceLineNo">531</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.531"></a>
+<span class="sourceLineNo">532</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.532"></a>
+<span class="sourceLineNo">533</span>          region.put(p2);<a name="line.533"></a>
+<span class="sourceLineNo">534</span>          long expectedSize = sizeOfOnePut * 3;<a name="line.534"></a>
+<span class="sourceLineNo">535</span>          Assert.assertEquals(expectedSize, region.getMemStoreDataSize());<a name="line.535"></a>
+<span class="sourceLineNo">536</span>          // Do a successful flush.  It will clear the snapshot only.  Thats how flushes work.<a name="line.536"></a>
+<span class="sourceLineNo">537</span>          // If already a snapshot, we clear it else we move the memstore to be snapshot and flush<a name="line.537"></a>
+<span class="sourceLineNo">538</span>          // it<a name="line.538"></a>
+<span class="sourceLineNo">539</span>          region.flush(true);<a name="line.539"></a>
+<span class="sourceLineNo">540</span>          // Make sure our memory accounting is right.<a name="line.540"></a>
+<span class="sourceLineNo">541</span>          Assert.assertEquals(sizeOfOnePut * 2, region.getMemStoreDataSize());<a name="line.541"></a>
+<span class="sourceLineNo">542</span>        } finally {<a name="line.542"></a>
+<span class="sourceLineNo">543</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.543"></a>
+<span class="sourceLineNo">544</span>        }<a name="line.544"></a>
+<span class="sourceLineNo">545</span>        return null;<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>    FileSystem.closeAllForUGI(user.getUGI());<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>  @Test<a name="line.551"></a>
+<span class="sourceLineNo">552</span>  public void testCloseWithFailingFlush() throws Exception {<a name="line.552"></a>
+<span class="sourceLineNo">553</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.553"></a>
+<span class="sourceLineNo">554</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.554"></a>
+<span class="sourceLineNo">555</span>    // Only retry once.<a name="line.555"></a>
+<span class="sourceLineNo">556</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.556"></a>
+<span class="sourceLineNo">557</span>    final User user =<a name="line.557"></a>
+<span class="sourceLineNo">558</span>      User.createUserForTesting(conf, this.method, new String[]{"foo"});<a name="line.558"></a>
+<span class="sourceLineNo">559</span>    // Inject our faulty LocalFileSystem<a name="line.559"></a>
+<span class="sourceLineNo">560</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.560"></a>
+<span class="sourceLineNo">561</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.561"></a>
+<span class="sourceLineNo">562</span>      @Override<a name="line.562"></a>
+<span class="sourceLineNo">563</span>      public Object run() throws Exception {<a name="line.563"></a>
+<span class="sourceLineNo">564</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.564"></a>
+<span class="sourceLineNo">565</span>        FileSystem fs = FileSystem.get(conf);<a name="line.565"></a>
+<span class="sourceLineNo">566</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.566"></a>
+<span class="sourceLineNo">567</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.567"></a>
+<span class="sourceLineNo">568</span>        HRegion region = null;<a name="line.568"></a>
+<span class="sourceLineNo">569</span>        try {<a name="line.569"></a>
+<span class="sourceLineNo">570</span>          // Initialize region<a name="line.570"></a>
+<span class="sourceLineNo">571</span>          region = initHRegion(tableName, null, null, false,<a name="line.571"></a>
+<span class="sourceLineNo">572</span>              Durability.SYNC_WAL, wal, COLUMN_FAMILY_BYTES);<a name="line.572"></a>
+<span class="sourceLineNo">573</span>          long size = region.getMemStoreDataSize();<a name="line.573"></a>
+<span class="sourceLineNo">574</span>          Assert.assertEquals(0, size);<a name="line.574"></a>
+<span class="sourceLineNo">575</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.575"></a>
+<span class="sourceLineNo">576</span>          Put p1 = new Put(row);<a name="line.576"></a>
+<span class="sourceLineNo">577</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[])null));<a name="line.577"></a>
+<span class="sourceLineNo">578</span>          region.put(p1);<a name="line.578"></a>
+<span class="sourceLineNo">579</span>          // Manufacture an outstanding snapshot -- fake a failed flush by doing prepare step only.<a name="line.579"></a>
+<span class="sourceLineNo">580</span>          HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.580"></a>
+<span class="sourceLineNo">581</span>          StoreFlushContext storeFlushCtx =<a name="line.581"></a>
+<span class="sourceLineNo">582</span>              store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY);<a name="line.582"></a>
+<span class="sourceLineNo">583</span>          storeFlushCtx.prepare();<a name="line.583"></a>
+<span class="sourceLineNo">584</span>          // Now add two entries to the foreground memstore.<a name="line.584"></a>
+<span class="sourceLineNo">585</span>          Put p2 = new Put(row);<a name="line.585"></a>
+<span class="sourceLineNo">586</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.586"></a>
+<span class="sourceLineNo">587</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.587"></a>
+<span class="sourceLineNo">588</span>          region.put(p2);<a name="line.588"></a>
+<span class="sourceLineNo">589</span>          // Now try close on top of a failing flush.<a name="line.589"></a>
+<span class="sourceLineNo">590</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.590"></a>
+<span class="sourceLineNo">591</span>          region = null;<a name="line.591"></a>
+<span class="sourceLineNo">592</span>          fail();<a name="line.592"></a>
+<span class="sourceLineNo">593</span>        } catch (DroppedSnapshotException dse) {<a name="line.593"></a>
+<span class="sourceLineNo">594</span>          // Expected<a name="line.594"></a>
+<span class="sourceLineNo">595</span>          LOG.info("Expected DroppedSnapshotException");<a name="line.595"></a>
+<span class="sourceLineNo">596</span>        } finally {<a name="line.596"></a>
+<span class="sourceLineNo">597</span>          // Make it so all writes succeed from here on out so can close clean<a name="line.597"></a>
+<span class="sourceLineNo">598</span>          ffs.fault.set(false);<a name="line.598"></a>
+<span class="sourceLineNo">599</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.599"></a>
+<span class="sourceLineNo">600</span>        }<a name="line.600"></a>
+<span class="sourceLineNo">601</span>        return null;<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>    FileSystem.closeAllForUGI(user.getUGI());<a name="line.604"></a>
+<span class="sourceLineNo">605</span>  }<a name="line.605"></a>
+<span class="sourceLineNo">606</span><a name="line.606"></a>
+<span class="sourceLineNo">607</span>  @Test<a name="line.607"></a>
+<span class="sourceLineNo">608</span>  public void testCompactionAffectedByScanners() throws Exception {<a name="line.608"></a>
+<span class="sourceLineNo">609</span>    byte[] family = Bytes.toBytes("family");<a name="line.609"></a>
+<span class="sourceLineNo">610</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.610"></a>
+<span class="sourceLineNo">611</span><a name="line.611"></a>
+<span class="sourceLineNo">612</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.612"></a>
+<span class="sourceLineNo">613</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.613"></a>
+<span class="sourceLineNo">614</span>    region.put(put);<a name="line.614"></a>
+<span class="sourceLineNo">615</span>    region.flush(true);<a name="line.615"></a>
+<span class="sourceLineNo">616</span><a name="line.616"></a>
+<span class="sourceLineNo">617</span>    Scan scan = new Scan();<a name="line.617"></a>
+<span class="sourceLineNo">618</span>    scan.setMaxVersions(3);<a name="line.618"></a>
+<span class="sourceLineNo">619</span>    // open the first scanner<a name="line.619"></a>
+<span class="sourceLineNo">620</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.620"></a>
+<span class="sourceLineNo">621</span><a name="line.621"></a>
+<span class="sourceLineNo">622</span>    Delete delete = new Delete(Bytes.toBytes("r1"));<a name="line.622"></a>
+<span class="sourceLineNo">623</span>    region.delete(delete);<a name="line.623"></a>
+<span class="sourceLineNo">624</span>    region.flush(true);<a name="line.624"></a>
+<span class="sourceLineNo">625</span><a name="line.625"></a>
+<span class="sourceLineNo">626</span>    // open the second scanner<a name="line.626"></a>
+<span class="sourceLineNo">627</span>    RegionScanner scanner2 = region.getScanner(scan);<a name="line.627"></a>
+<span class="sourceLineNo">628</span><a name="line.628"></a>
+<span class="sourceLineNo">629</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.629"></a>
+<span class="sourceLineNo">630</span><a name="line.630"></a>
+<span class="sourceLineNo">631</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.631"></a>
+<span class="sourceLineNo">632</span><a name="line.632"></a>
+<span class="sourceLineNo">633</span>    // make a major compaction<a name="line.633"></a>
+<span class="sourceLineNo">634</span>    region.compact(true);<a name="line.634"></a>
+<span class="sourceLineNo">635</span><a name="line.635"></a>
+<span class="sourceLineNo">636</span>    // open the third scanner<a name="line.636"></a>
+<span class="sourceLineNo">637</span>    RegionScanner scanner3 = region.getScanner(scan);<a name="line.637"></a>
+<span class="sourceLineNo">638</span><a name="line.638"></a>
+<span class="sourceLineNo">639</span>    // get data from scanner 1, 2, 3 after major compaction<a name="line.639"></a>
+<span class="sourceLineNo">640</span>    scanner1.next(results);<a name="line.640"></a>
+<span class="sourceLineNo">641</span>    System.out.println(results);<a name="line.641"></a>
+<span class="sourceLineNo">642</span>    assertEquals(1, results.size());<a name="line.642"></a>
+<span class="sourceLineNo">643</span><a name="line.643"></a>
+<span class="sourceLineNo">644</span>    results.clear();<a name="line.644"></a>
+<span class="sourceLineNo">645</span>    scanner2.next(results);<a name="line.645"></a>
+<span class="sourceLineNo">646</span>    System.out.println(results);<a name="line.646"></a>
+<span class="sourceLineNo">647</span>    assertEquals(0, results.size());<a name="line.647"></a>
+<span class="sourceLineNo">648</span><a name="line.648"></a>
+<span class="sourceLineNo">649</span>    results.clear();<a name="line.649"></a>
+<span class="sourceLineNo">650</span>    scanner3.next(results);<a name="line.650"></a>
+<span class="sourceLineNo">651</span>    System.out.println(results);<a name="line.651"></a>
+<span class="sourceLineNo">652</span>    assertEquals(0, results.size());<a name="line.652"></a>
+<span class="sourceLineNo">653</span>  }<a name="line.653"></a>
+<span class="sourceLineNo">654</span><a name="line.654"></a>
+<span class="sourceLineNo">655</span>  @Test<a name="line.655"></a>
+<span class="sourceLineNo">656</span>  public void testToShowNPEOnRegionScannerReseek() throws Exception {<a name="line.656"></a>
+<span class="sourceLineNo">657</span>    byte[] family = Bytes.toBytes("family");<a name="line.657"></a>
+<span class="sourceLineNo">658</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.658"></a>
+<span class="sourceLineNo">659</span><a name="line.659"></a>
+<span class="sourceLineNo">660</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.660"></a>
+<span class="sourceLineNo">661</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.661"></a>
+<span class="sourceLineNo">662</span>    region.put(put);<a name="line.662"></a>
+<span class="sourceLineNo">663</span>    put = new Put(Bytes.toBytes("r2"));<a name="line.663"></a>
+<span class="sourceLineNo">664</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.664"></a>
+<span class="sourceLineNo">665</span>    region.put(put);<a name="line.665"></a>
+<span class="sourceLineNo">666</span>    region.flush(true);<a name="line.666"></a>
+<span class="sourceLineNo">667</span><a name="line.667"></a>
+<span class="sourceLineNo">668</span>    Scan scan = new Scan();<a name="line.668"></a>
+<span class="sourceLineNo">669</span>    scan.setMaxVersions(3);<a name="line.669"></a>
+<span class="sourceLineNo">670</span>    // open the first scanner<a name="line.670"></a>
+<span class="sourceLineNo">671</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.671"></a>
+<span class="sourceLineNo">672</span><a name="line.672"></a>
+<span class="sourceLineNo">673</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.673"></a>
+<span class="sourceLineNo">674</span><a name="line.674"></a>
+<span class="sourceLineNo">675</span>    region.compact(true);<a name="line.675"></a>
+<span class="sourceLineNo">676</span><a name="line.676"></a>
+<span class="sourceLineNo">677</span>    scanner1.reseek(Bytes.toBytes("r2"));<a name="line.677"></a>
+<span class="sourceLineNo">678</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.678"></a>
+<span class="sourceLineNo">679</span>    scanner1.next(results);<a name="line.679"></a>
+<span class="sourceLineNo">680</span>    Cell keyValue = results.get(0);<a name="line.680"></a>
+<span class="sourceLineNo">681</span>    Assert.assertTrue(Bytes.compareTo(CellUtil.cloneRow(keyValue), Bytes.toBytes("r2")) == 0);<a name="line.681"></a>
+<span class="sourceLineNo">682</span>    scanner1.close();<a name="line.682"></a>
+<span class="sourceLineNo">683</span>  }<a name="line.683"></a>
+<span class="sourceLineNo">684</span><a name="line.684"></a>
+<span class="sourceLineNo">685</span>  @Test<a name="line.685"></a>
+<span class="sourceLineNo">686</span>  public void testSkipRecoveredEditsReplay() throws Exception {<a name="line.686"></a>
+<span class="sourceLineNo">687</span>    byte[] family = Bytes.toBytes("family");<a name="line.687"></a>
+<span class="sourceLineNo">688</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.688"></a>
+<span class="sourceLineNo">689</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.689"></a>
+<span class="sourceLineNo">690</span>    try {<a name="line.690"></a>
+<span class="sourceLineNo">691</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.691"></a>
+<span class="sourceLineNo">692</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.692"></a>
+<span class="sourceLineNo">693</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.693"></a>
+<span class="sourceLineNo">694</span><a name="line.694"></a>
+<span class="sourceLineNo">695</span>      Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.695"></a>
+<span class="sourceLineNo">696</span><a name="line.696"></a>
+<span class="sourceLineNo">697</span>      long maxSeqId = 1050;<a name="line.697"></a>
+<span class="sourceLineNo">698</span>      long minSeqId = 1000;<a name="line.698"></a>
+<span class="sourceLineNo">699</span><a name="line.699"></a>
+<span class="sourceLineNo">700</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.700"></a>
+<span class="sourceLineNo">701</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.701"></a>
+<span class="sourceLineNo">702</span>        fs.create(recoveredEdits);<a name="line.702"></a>
+<span class="sourceLineNo">703</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.703"></a>
+<span class="sourceLineNo">704</span><a name="line.704"></a>
+<span class="sourceLineNo">705</span>        long time = System.nanoTime();<a name="line.705"></a>
+<span class="sourceLineNo">706</span>        WALEdit edit = new WALEdit();<a name="line.706"></a>
+<span class="sourceLineNo">707</span>        edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.707"></a>
+<span class="sourceLineNo">708</span>            .toBytes(i)));<a name="line.708"></a>
+<span class="sourceLineNo">709</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.709"></a>
+<span class="sourceLineNo">710</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.710"></a>
+<span class="sourceLineNo">711</span><a name="line.711"></a>
+<span class="sourceLineNo">712</span>        writer.close();<a name="line.712"></a>
+<span class="sourceLineNo">713</span>      }<a name="line.713"></a>
+<span class="sourceLineNo">714</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.714"></a>
+<span class="sourceLineNo">715</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.715"></a>
+<span class="sourceLineNo">716</span>      for (HStore store : region.getStores()) {<a name="line.716"></a>
+<span class="sourceLineNo">717</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), minSeqId - 1);<a name="line.717"></a>
+<span class="sourceLineNo">718</span>      }<a name="line.718"></a>
+<span class="sourceLineNo">719</span>      long seqId = region.replayRecoveredEditsIfAny(maxSeqIdInStores, null, status);<a name="line.719"></a>
+<span class="sourceLineNo">720</span>      assertEquals(maxSeqId, seqId);<a name="line.720"></a>
+<span class="sourceLineNo">721</span>      region.getMVCC().advanceTo(seqId);<a name="line.721"></a>
+<span class="sourceLineNo">722</span>      Get get = new Get(row);<a name="line.722"></a>
+<span class="sourceLineNo">723</span>      Result result = region.get(get);<a name="line.723"></a>
+<span class="sourceLineNo">724</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.724"></a>
+<span class="sourceLineNo">725</span>        List&lt;Cell&gt; kvs = result.getColumnCells(family, Bytes.toBytes(i));<a name="line.725"></a>
+<span class="sourceLineNo">726</span>        assertEquals(1, kvs.size());<a name="line.726"></a>
+<span class="sourceLineNo">727</span>        assertArrayEquals(Bytes.toBytes(i), CellUtil.cloneValue(kvs.get(0)));<a name="line.727"></a>
+<span class="sourceLineNo">728</span>      }<a name="line.728"></a>
+<span class="sourceLineNo">729</span>    } finally {<a name="line.729"></a>
+<span class="sourceLineNo">730</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.730"></a>
+<span class="sourceLineNo">731</span>      this.region = null;<a name="line.731"></a>
+<span class="sourceLineNo">732</span>      wals.close();<a name="line.732"></a>
+<span class="sourceLineNo">733</span>    }<a name="line.733"></a>
+<span class="sourceLineNo">734</span>  }<a name="line.734"></a>
+<span class="sourceLineNo">735</span><a name="line.735"></a>
+<span class="sourceLineNo">736</span>  @Test<a name="line.736"></a>
+<span class="sourceLineNo">737</span>  public void testSkipRecoveredEditsReplaySomeIgnored() throws Exception {<a name="line.737"></a>
+<span class="sourceLineNo">738</span>    byte[] family = Bytes.toBytes("family");<a name="line.738"></a>
+<span class="sourceLineNo">739</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.739"></a>
+<span class="sourceLineNo">740</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.740"></a>
+<span class="sourceLineNo">741</span>    try {<a name="line.741"></a>
+<span class="sourceLineNo">742</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.742"></a>
+<span class="sourceLineNo">743</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.743"></a>
+<span class="sourceLineNo">744</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.744"></a>
+<span class="sourceLineNo">745</span><a name="line.745"></a>
+<span class="sourceLineNo">746</span>      Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.746"></a>
+<span class="sourceLineNo">747</span><a name="line.747"></a>
+<span class="sourceLineNo">748</span>      long maxSeqId = 1050;<a name="line.748"></a>
+<span class="sourceLineNo">749</span>      long minSeqId = 1000;<a name="line.749"></a>
+<span class="sourceLineNo">750</span><a name="line.750"></a>
+<span class="sourceLineNo">751</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.751"></a>
+<span class="sourceLineNo">752</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.752"></a>
+<span class="sourceLineNo">753</span>        fs.create(recoveredEdits);<a name="line.753"></a>
+<span class="sourceLineNo">754</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.754"></a>
+<span class="sourceLineNo">755</span><a name="line.755"></a>
+<span class="sourceLineNo">756</span>        long time = System.nanoTime();<a name="line.756"></a>
+<span class="sourceLineNo">757</span>        WALEdit edit = new WALEdit();<a name="line.757"></a>
+<span class="sourceLineNo">758</span>        edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.758"></a>
+<span class="sourceLineNo">759</span>            .toBytes(i)));<a name="line.759"></a>
+<span class="sourceLineNo">760</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.760"></a>
+<span class="sourceLineNo">761</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.761"></a>
+<span class="sourceLineNo">762</span><a name="line.762"></a>
+<span class="sourceLineNo">763</span>        writer.close();<a name="line.763"></a>
+<span class="sourceLineNo">764</span>      }<a name="line.764"></a>
+<span class="sourceLineNo">765</span>      long recoverSeqId = 1030;<a name="line.765"></a>
+<span class="sourceLineNo">766</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.766"></a>
+<span class="sourceLineNo">767</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.767"></a>
+<span class="sourceLineNo">768</span>      for (HStore store : region.getStores()) {<a name="line.768"></a>
+<span class="sourceLineNo">769</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), recoverSeqId - 1);<a name="line.769"></a>
+<span class="sourceLineNo">770</span>      }<a name="line.770"></a>
+<span class="sourceLineNo">771</span>      long seqId = region.replayRecoveredEditsIfAny(maxSeqIdInStores, null, status);<a name="line.771"></a>
+<span class="sourceLineNo">772</span>      assertEquals(maxSeqId, seqId);<a name="line.772"></a>
+<span class="sourceLineNo">773</span>      region.getMVCC().advanceTo(seqId);<a name="line.773"></a>
+<span class="sourceLineNo">774</span>      Get get = new Get(row);<a name="line.774"></a>
+<span class="sourceLineNo">775</span>      Result result = region.get(get);<a name="line.775"></a>
+<span class="sourceLineNo">776</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.776"></a>
+<span class="sourceLineNo">777</span>        List&lt;Cell&gt; kvs = result.getColumnCells(family, Bytes.toBytes(i));<a name="line.777"></a>
+<span class="sourceLineNo">778</span>        if (i &lt; recoverSeqId) {<a name="line.778"></a>
+<span class="sourceLineNo">779</span>          assertEquals(0, kvs.size());<a name="line.779"></a>
+<span class="sourceLineNo">780</span>        } else {<a name="line.780"></a>
+<span class="sourceLineNo">781</span>          assertEquals(1, kvs.size());<a name="line.781"></a>
+<span class="sourceLineNo">782</span>          assertArrayEquals(Bytes.toBytes(i), CellUtil.cloneValue(kvs.get(0)));<a name="line.782"></a>
+<span class="sourceLineNo">783</span>        }<a name="line.783"></a>
+<span class="sourceLineNo">784</span>      }<a name="line.784"></a>
+<span class="sourceLineNo">785</span>    } finally {<a name="line.785"></a>
+<span class="sourceLineNo">786</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.786"></a>
+<span class="sourceLineNo">787</span>      this.region = null;<a name="line.787"></a>
+<span class="sourceLineNo">788</span>      wals.close();<a name="line.788"></a>
+<span class="sourceLineNo">789</span>    }<a name="line.789"></a>
+<span class="sourceLineNo">790</span>  }<a name="line.790"></a>
+<span class="sourceLineNo">791</span><a name="line.791"></a>
+<span class="sourceLineNo">792</span>  @Test<a name="line.792"></a>
+<span class="sourceLineNo">793</span>  public void testSkipRecoveredEditsReplayAllIgnored() throws Exception {<a name="line.793"></a>
+<span class="sourceLineNo">794</span>    byte[] family = Bytes.toBytes("family");<a name="line.794"></a>
+<span class="sourceLineNo">795</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.795"></a>
+<span class="sourceLineNo">796</span>    Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.796"></a>
+<span class="sourceLineNo">797</span>    FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.797"></a>
+<span class="sourceLineNo">798</span><a name="line.798"></a>
+<span class="sourceLineNo">799</span>    Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.799"></a>
+<span class="sourceLineNo">800</span>    for (int i = 1000; i &lt; 1050; i += 10) {<a name="line.800"></a>
+<span class="sourceLineNo">801</span>      Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.801"></a>
+<span class="sourceLineNo">802</span>      FSDataOutputStream dos = fs.create(recoveredEdits);<a name="line.802"></a>
+<span class="sourceLineNo">803</span>      dos.writeInt(i);<a name="line.803"></a>
+<span class="sourceLineNo">804</span>      dos.close();<a name="line.804"></a>
+<span class="sourceLineNo">805</span>    }<a name="line.805"></a>
+<span class="sourceLineNo">806</span>    long minSeqId = 2000;<a name="line.806"></a>
+<span class="sourceLineNo">807</span>    Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", minSeqId - 1));<a name="line.807"></a>
+<span class="sourceLineNo">808</span>    FSDataOutputStream dos = fs.create(recoveredEdits);<a name="line.808"></a>
+<span class="sourceLineNo">809</span>    dos.close();<a name="line.809"></a>
+<span class="sourceLineNo">810</span><a name="line.810"></a>
+<span class="sourceLineNo">811</span>    Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.811"></a>
+<span class="sourceLineNo">812</span>    for (HStore store : region.getStores()) {<a name="line.812"></a>
+<span class="sourceLineNo">813</span>      maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), minSeqId);<a name="line.813"></a>
+<span class="sourceLineNo">814</span>    }<a name="line.814"></a>
+<span class="sourceLineNo">815</span>    long seqId = region.replayRecoveredEditsIfAny(maxSeqIdInStores, null, null);<a name="line.815"></a>
+<span class="sourceLineNo">816</span>    assertEquals(minSeqId, seqId);<a name="line.816"></a>
+<span class="sourceLineNo">817</span>  }<a name="line.817"></a>
+<span class="sourceLineNo">818</span><a name="line.818"></a>
+<span class="sourceLineNo">819</span>  @Test<a name="line.819"></a>
+<span class="sourceLineNo">820</span>  public void testSkipRecoveredEditsReplayTheLastFileIgnored() throws Exception {<a name="line.820"></a>
+<span class="sourceLineNo">821</span>    byte[] family = Bytes.toBytes("family");<a name="line.821"></a>
+<span class="sourceLineNo">822</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.822"></a>
+<span class="sourceLineNo">823</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.823"></a>
+<span class="sourceLineNo">824</span>    try {<a name="line.824"></a>
+<span class="sourceLineNo">825</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.825"></a>
+<span class="sourceLineNo">826</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.826"></a>
+<span class="sourceLineNo">827</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.827"></a>
+<span class="sourceLineNo">828</span>      byte[][] columns = region.getTableDescriptor().getColumnFamilyNames().toArray(new byte[0][]);<a name="line.828"></a>
+<span class="sourceLineNo">829</span><a name="line.829"></a>
+<span class="sourceLineNo">830</span>      assertEquals(0, region.getStoreFileList(columns).size());<a name="line.830"></a>
+<span class="sourceLineNo">831</span><a name="line.831"></a>
+<span class="sourceLineNo">832</span>      Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.832"></a>
+<span class="sourceLineNo">833</span><a name="line.833"></a>
+<span class="sourceLineNo">834</span>      long maxSeqId = 1050;<a name="line.834"></a>
+<span class="sourceLineNo">835</span>      long minSeqId = 1000;<a name="line.835"></a>
+<span class="sourceLineNo">836</span><a name="line.836"></a>
+<span class="sourceLineNo">837</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.837"></a>
+<span class="sourceLineNo">838</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.838"></a>
+<span class="sourceLineNo">839</span>        fs.create(recoveredEdits);<a name="line.839"></a>
+<span class="sourceLineNo">840</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.840"></a>
+<span class="sourceLineNo">841</span><a name="line.841"></a>
+<span class="sourceLineNo">842</span>        long time = System.nanoTime();<a name="line.842"></a>
+<span class="sourceLineNo">843</span>        WALEdit edit = null;<a name="line.843"></a>
+<span class="sourceLineNo">844</span>        if (i == maxSeqId) {<a name="line.844"></a>
+<span class="sourceLineNo">845</span>          edit = WALEdit.createCompaction(region.getRegionInfo(),<a name="line.845"></a>
+<span class="sourceLineNo">846</span>          CompactionDescriptor.newBuilder()<a name="line.846"></a>
+<span class="sourceLineNo">847</span>          .setTableName(ByteString.copyFrom(tableName.getName()))<a name="line.847"></a>
+<span class="sourceLineNo">848</span>          .setFamilyName(ByteString.copyFrom(regionName))<a name="line.848"></a>
+<span class="sourceLineNo">849</span>          .setEncodedRegionName(ByteString.copyFrom(regionName))<a name="line.849"></a>
+<span class="sourceLineNo">850</span>          .setStoreHomeDirBytes(ByteString.copyFrom(Bytes.toBytes(regiondir.toString())))<a name="line.850"></a>
+<span class="sourceLineNo">851</span>          .setRegionName(ByteString.copyFrom(region.getRegionInfo().getRegionName()))<a name="line.851"></a>
+<span class="sourceLineNo">852</span>          .build());<a name="line.852"></a>
+<span class="sourceLineNo">853</span>        } else {<a name="line.853"></a>
+<span class="sourceLineNo">854</span>          edit = new WALEdit();<a name="line.854"></a>
+<span class="sourceLineNo">855</span>          edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.855"></a>
+<span class="sourceLineNo">856</span>            .toBytes(i)));<a name="line.856"></a>
+<span class="sourceLineNo">857</span>        }<a name="line.857"></a>
+<span class="sourceLineNo">858</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.858"></a>
+<span class="sourceLineNo">859</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.859"></a>
+<span class="sourceLineNo">860</span>        writer.close();<a name="line.860"></a>
+<span class="sourceLineNo">861</span>      }<a name="line.861"></a>
+<span class="sourceLineNo">862</span><a name="line.862"></a>
+<span class="sourceLineNo">863</span>      long recoverSeqId = 1030;<a name="line.863"></a>
+<span class="sourceLineNo">864</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.864"></a>
+<span class="sourceLineNo">865</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.865"></a>
+<span class="sourceLineNo">866</span>      for (HStore store : region.getStores()) {<a name="line.866"></a>
+<span class="sourceLineNo">867</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), recoverSeqId - 1);<a name="line.867"></a>
+<span class="sourceLineNo">868</span>      }<a name="line.868"></a>
+<span class="sourceLineNo">869</span>      long seqId = region.replayRecoveredEditsIfAny(maxSeqIdInStores, null, status);<a name="line.869"></a>
+<span class="sourceLineNo">870</span>      assertEquals(maxSeqId, seqId);<a name="line.870"></a>
+<span class="sourceLineNo">871</span><a name="line.871"></a>
+<span class="sourceLineNo">872</span>      // assert that the files are flushed<a name="line.872"></a>
+<span class="sourceLineNo">873</span>      assertEquals(1, region.getStoreFileList(columns).size());<a name="line.873"></a>
+<span class="sourceLineNo">874</span><a name="line.874"></a>
+<span class="sourceLineNo">875</span>    } finally {<a name="line.875"></a>
+<span class="sourceLineNo">876</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.876"></a>
+<span class="sourceLineNo">877</span>      this.region = null;<a name="line.877"></a>
+<span class="sourceLineNo">878</span>      wals.close();<a name="line.878"></a>
+<span class="sourceLineNo">879</span>    }<a name="line.879"></a>
+<span class="sourceLineNo">880</span>  }<a name="line.880"></a>
+<span class="sourceLineNo">881</span><a name="line.881"></a>
+<span class="sourceLineNo">882</span>  @Test<a name="line.882"></a>
+<span class="sourceLineNo">883</span>  public void testRecoveredEditsReplayCompaction() throws Exception {<a name="line.883"></a>
+<span class="sourceLineNo">884</span>    testRecoveredEditsReplayCompaction(false);<a name="line.884"></a>
+<span class="sourceLineNo">885</span>    testRecoveredEditsReplayCompaction(true);<a name="line.885"></a>
+<span class="sourceLineNo">886</span>  }<a name="line.886"></a>
+<span class="sourceLineNo">887</span><a name="line.887"></a>
+<span class="sourceLineNo">888</span>  public void testRecoveredEditsReplayCompaction(boolean mismatchedRegionName) throws Exception {<a name="line.888"></a>
+<span class="sourceLineNo">889</span>    CONF.setClass(HConstants.REGION_IMPL, HRegionForTesting.class, Region.class);<a name="line.889"></a>
+<span class="sourceLineNo">890</span>    byte[] family = Bytes.toBytes("family");<a name="line.890"></a>
+<span class="sourceLineNo">891</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.891"></a>
+<span class="sourceLineNo">892</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.892"></a>
+<span class="sourceLineNo">893</span>    try {<a name="line.893"></a>
+<span class="sourceLineNo">894</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.894"></a>
+<span class="sourceLineNo">895</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.895"></a>
+<span class="sourceLineNo">896</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.896"></a>
+<span class="sourceLineNo">897</span><a name="line.897"></a>
+<span class="sourceLineNo">898</span>      long maxSeqId = 3;<a name="line.898"></a>
+<span class="sourceLineNo">899</span>      long minSeqId = 0;<a name="line.899"></a>
+<span class="sourceLineNo">900</span><a name="line.900"></a>
+<span class="sourceLineNo">901</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.901"></a>
+<span class="sourceLineNo">902</span>        Put put = new Put(Bytes.toBytes(i));<a name="line.902"></a>
+<span class="sourceLineNo">903</span>        put.addColumn(family, Bytes.toBytes(i), Bytes.toBytes(i));<a name="line.903"></a>
+<span class="sourceLineNo">904</span>        region.put(put);<a name="line.904"></a>
+<span class="sourceLineNo">905</span>        region.flush(true);<a name="line.905"></a>
+<span class="sourceLineNo">906</span>      }<a name="line.906"></a>
+<span class="sourceLineNo">907</span><a name="line.907"></a>
+<span class="sourceLineNo">908</span>      // this will create a region with 3 files<a name="line.908"></a>
+<span class="sourceLineNo">909</span>      assertEquals(3, region.getStore(family).getStorefilesCount());<a name="line.909"></a>
+<span class="sourceLineNo">910</span>      List&lt;Path&gt; storeFiles = new ArrayList&lt;&gt;(3);<a name="line.910"></a>
+<span class="sourceLineNo">911</span>      for (HStoreFile sf : region.getStore(family).getStorefiles()) {<a name="line.911"></a>
+<span class="sourceLineNo">912</span>        storeFiles.add(sf.getPath());<a name="line.912"></a>
+<span class="sourceLineNo">913</span>      }<a name="line.913"></a>
+<span class="sourceLineNo">914</span><a name="line.914"></a>
+<span class="sourceLineNo">915</span>      // disable compaction completion<a name="line.915"></a>
+<span class="sourceLineNo">916</span>      CONF.setBoolean("hbase.hstore.compaction.complete", false);<a name="line.916"></a>
+<span class="sourceLineNo">917</span>      region.compactStores();<a name="line.917"></a>
+<span class="sourceLineNo">918</span><a name="line.918"></a>
+<span class="sourceLineNo">919</span>      // ensure that nothing changed<a name="line.919"></a>
+<span class="sourceLineNo">920</span>      assertEquals(3, region.getStore(family).getStorefilesCount());<a name="line.920"></a>
+<span class="sourceLineNo">921</span><a name="line.921"></a>
+<span class="sourceLineNo">922</span>      // now find the compacted file, and manually add it to the recovered edits<a name="line.922"></a>
+<span class="sourceLineNo">923</span>      Path tmpDir = new Path(region.getRegionFileSystem().getTempDir(), Bytes.toString(family));<a name="line.923"></a>
+<span class="sourceLineNo">924</span>      FileStatus[] files = FSUtils.listStatus(fs, tmpDir);<a name="line.924"></a>
+<span class="sourceLineNo">925</span>      String errorMsg = "Expected to find 1 file in the region temp directory "<a name="line.925"></a>
+<span class="sourceLineNo">926</span>          + "from the compaction, could not find any";<a name="line.926"></a>
+<span class="sourceLineNo">927</span>      assertNotNull(errorMsg, files);<a name="line.927"></a>
+<span class="sourceLineNo">928</span>      assertEquals(errorMsg, 1, files.length);<a name="line.928"></a>
+<span class="sourceLineNo">929</span>      // move the file inside region dir<a name="line.929"></a>
+<span class="sourceLineNo">930</span>      Path newFile = region.getRegionFileSystem().commitStoreFile(Bytes.toString(family),<a name="line.930"></a>
+<span class="sourceLineNo">931</span>          files[0].getPath());<a name="line.931"></a>
+<span class="sourceLineNo">932</span><a name="line.932"></a>
+<span class="sourceLineNo">933</span>      byte[] encodedNameAsBytes = this.region.getRegionInfo().getEncodedNameAsBytes();<a name="line.933"></a>
+<span class="sourceLineNo">934</span>      byte[] fakeEncodedNameAsBytes = new byte [encodedNameAsBytes.length];<a name="line.934"></a>
+<span class="sourceLineNo">935</span>      for (int i=0; i &lt; encodedNameAsBytes.length; i++) {<a name="line.935"></a>
+<span class="sourceLineNo">936</span>        // Mix the byte array to have a new encodedName<a name="line.936"></a>
+<span class="sourceLineNo">937</span>        fakeEncodedNameAsBytes[i] = (byte) (encodedNameAsBytes[i] + 1);<a name="line.937"></a>
+<span class="sourceLineNo">938</span>      }<a name="line.938"></a>
+<span class="sourceLineNo">939</span><a name="line.939"></a>
+<span class="sourceLineNo">940</span>      CompactionDescriptor compactionDescriptor = ProtobufUtil.toCompactionDescriptor(this.region<a name="line.940"></a>
+<span class="sourceLineNo">941</span>        .getRegionInfo(), mismatchedRegionName ? fakeEncodedNameAsBytes : null, family,<a name="line.941"></a>
+<span class="sourceLineNo">942</span>            storeFiles, Lists.newArrayList(newFile),<a name="line.942"></a>
+<span class="sourceLineNo">943</span>            region.getRegionFileSystem().getStoreDir(Bytes.toString(family)));<a name="line.943"></a>
+<span class="sourceLineNo">944</span><a name="line.944"></a>
+<span class="sourceLineNo">945</span>      WALUtil.writeCompactionMarker(region.getWAL(), this.region.getReplicationScope(),<a name="line.945"></a>
+<span class="sourceLineNo">946</span>          this.region.getRegionInfo(), compactionDescriptor, region.getMVCC());<a name="line.946"></a>
+<span class="sourceLineNo">947</span><a name="line.947"></a>
+<span class="sourceLineNo">948</span>      Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.948"></a>
+<span class="sourceLineNo">949</span><a name="line.949"></a>
+<span class="sourceLineNo">950</span>      Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", 1000));<a name="line.950"></a>
+<span class="sourceLineNo">951</span>      fs.create(recoveredEdits);<a name="line.951"></a>
+<span class="sourceLineNo">952</span>      WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.952"></a>
+<span class="sourceLineNo">953</span><a name="line.953"></a>
+<span class="sourceLineNo">954</span>      long time = System.nanoTime();<a name="line.954"></a>
+<span class="sourceLineNo">955</span><a name="line.955"></a>
+<span class="sourceLineNo">956</span>      writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, 10, time,<a name="line.956"></a>
+<span class="sourceLineNo">957</span>          HConstants.DEFAULT_CLUSTER_ID), WALEdit.createCompaction(region.getRegionInfo(),<a name="line.957"></a>
+<span class="sourceLineNo">958</span>          compactionDescriptor)));<a name="line.958"></a>
+<span class="sourceLineNo">959</span>      writer.close();<a name="line.959"></a>
+<span class="sourceLineNo">960</span><a name="line.960"></a>
+<span class="sourceLineNo">961</span>      // close the region now, and reopen again<a name="line.961"></a>
+<span class="sourceLineNo">962</span>      region.getTableDescriptor();<a name="line.962"></a>
+<span class="sourceLineNo">963</span>      region.getRegionInfo();<a name="line.963"></a>
+<span class="sourceLineNo">964</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.964"></a>
+<span class="sourceLineNo">965</span>      try {<a name="line.965"></a>
+<span class="sourceLineNo">966</span>        region = HRegion.openHRegion(region, null);<a name="line.966"></a>
+<span class="sourceLineNo">967</span>      } catch (WrongRegionException wre) {<a name="line.967"></a>
+<span class="sourceLineNo">968</span>        fail("Matching encoded region name should not have produced WrongRegionException");<a name="line.968"></a>
+<span class="sourceLineNo">969</span>      }<a name="line.969"></a>
+<span class="sourceLineNo">970</span><a name="line.970"></a>
+<span class="sourceLineNo">971</span>      // now check whether we have only one store file, the compacted one<a name="line.971"></a>
+<span class="sourceLineNo">972</span>      Collection&lt;HStoreFile&gt; sfs = region.getStore(family).getStorefiles();<a name="line.972"></a>
+<span class="sourceLineNo">973</span>      for (HStoreFile sf : sfs) {<a name="line.973"></a>
+<span class="sourceLineNo">974</span>        LOG.info(Objects.toString(sf.getPath()));<a name="line.974"></a>
+<span class="sourceLineNo">975</span>      }<a name="line.975"></a>
+<span class="sourceLineNo">976</span>      if (!mismatchedRegionName) {<a name="line.976"></a>
+<span class="sourceLineNo">977</span>        assertEquals(1, region.getStore(family).getStorefilesCount());<a name="line.977"></a>
+<span class="sourceLineNo">978</span>      }<a name="line.978"></a>
+<span class="sourceLineNo">979</span>      files = FSUtils.listStatus(fs, tmpDir);<a name="line.979"></a>
+<span class="sourceLineNo">980</span>      assertTrue("Expected to find 0 files inside " + tmpDir, files == null || files.length == 0);<a name="line.980"></a>
+<span class="sourceLineNo">981</span><a name="line.981"></a>
+<span class="sourceLineNo">982</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.982"></a>
+<span class="sourceLineNo">983</span>        Get get = new Get(Bytes.toBytes(i));<a name="line.983"></a>
+<span class="sourceLineNo">984</span>        Result result = region.get(get);<a name="line.984"></a>
+<span class="sourceLineNo">985</span>        byte[] value = result.getValue(family, Bytes.toBytes(i));<a name="line.985"></a>
+<span class="sourceLineNo">986</span>        assertArrayEquals(Bytes.toBytes(i), value);<a name="line.986"></a>
+<span class="sourceLineNo">987</span>      }<a name="line.987"></a>
+<span class="sourceLineNo">988</span>    } finally {<a name="line.988"></a>
+<span class="sourceLineNo">989</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.989"></a>
+<span class="sourceLineNo">990</span>      this.region = null;<a name="line.990"></a>
+<span class="sourceLineNo">991</span>      wals.close();<a name="line.991"></a>
+<span class="sourceLineNo">992</span>      CONF.setClass(HConstants.REGION_IMPL, HRegion.class, Region.class);<a name="line.992"></a>
+<span class="sourceLineNo">993</span>    }<a name="line.993"></a>
+<span class="sourceLineNo">994</span>  }<a name="line.994"></a>
+<span class="sourceLineNo">995</span><a name="line.995"></a>
+<span class="sourceLineNo">996</span>  @Test<a name="line.996"></a>
+<span class="sourceLineNo">997</span>  public void testFlushMarkers() throws Exception {<a name="line.997"></a>
+<span class="sourceLineNo">998</span>    // tests that flush markers are written to WAL and handled at recovered edits<a name="line.998"></a>
+<span class="sourceLineNo">999</span>    byte[] family = Bytes.toBytes("family");<a name="line.999"></a>
+<span class="sourceLineNo">1000</span>    Path logDir = TEST_UTIL.getDataTestDirOnTestFS(method + ".log");<a name="line.1000"></a>
+<span class="sourceLineNo">1001</span>    final Configuration walConf = new Configuration(TEST_UTIL.getConfiguration());<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.1002"></a>
+<span class="sourceLineNo">1003</span>    final WALFactory wals = new WALFactory(walConf, method);<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span>    final WAL wal = wals.getWAL(RegionInfoBuilder.newBuilder(tableName).build());<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span><a name="line.1005"></a>
+<span class="sourceLineNo">1006</span>    this.region = initHRegion(tableName, HConstants.EMPTY_START_ROW,<a name="line.1006"></a>
+<span class="sourceLineNo">1007</span>      HConstants.EMPTY_END_ROW, false, Durability.USE_DEFAULT, wal, family);<a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>    try {<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span><a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>      long maxSeqId = 3;<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span>      long minSeqId = 0;<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span><a name="line.1015"></a>
+<span class="sourceLineNo">1016</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>        Put put = new Put(Bytes.toBytes(i));<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span>        put.addColumn(family, Bytes.toBytes(i), Bytes.toBytes(i));<a name="line.1018"></a>
+<span class="sourceLineNo">1019</span>        region.put(put);<a name="line.1019"></a>
+<span class="sourceLineNo">1020</span>        region.flush(true);<a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>      }<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span><a name="line.1022"></a>
+<span class="sourceLineNo">1023</span>      // this will create a region with 3 files from flush<a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>      assertEquals(3, region.getStore(family).getStorefilesCount());<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span>      List&lt;String&gt; storeFiles = new ArrayList&lt;&gt;(3);<a name="line.1025"></a>
+<span class="sourceLineNo">1026</span>      for (HStoreFile sf : region.getStore(family).getStorefiles()) {<a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>        storeFiles.add(sf.getPath().getName());<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span>      }<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span><a name="line.1029"></a>
+<span class="sourceLineNo">1030</span>      // now verify that the flush markers are written<a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>      wal.shutdown();<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>      WAL.Reader reader = WALFactory.createReader(fs, AbstractFSWALProvider.getCurrentFileName(wal),<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>        TEST_UTIL.getConfiguration());<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>      try {<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span>        List&lt;WAL.Entry&gt; flushDescriptors = new ArrayList&lt;&gt;();<a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>        long lastFlushSeqId = -1;<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>        while (true) {<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>          WAL.Entry entry = reader.next();<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>          if (entry == null) {<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>            break;<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span>          }<a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>          Cell cell = entry.getEdit().getCells().get(0);<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>          if (WALEdit.isMetaEditFamily(cell)) {<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>            FlushDescriptor flushDesc = WALEdit.getFlushDescriptor(cell);<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span>            assertNotNull(flushDesc);<a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>            assertArrayEquals(tableName.getName(), flushDesc.getTableName().toByteArray());<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>            if (flushDesc.getAction() == FlushAction.START_FLUSH) {<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span>              assertTrue(flushDesc.getFlushSequenceNumber() &gt; lastFlushSeqId);<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span>            } else if (flushDesc.getAction() == FlushAction.COMMIT_FLUSH) {<a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>              assertTrue(flushDesc.getFlushSequenceNumber() == lastFlushSeqId);<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>            }<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>            lastFlushSeqId = flushDesc.getFlushSequenceNumber();<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>            assertArrayEquals(regionName, flushDesc.getEncodedRegionName().toByteArray());<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>            assertEquals(1, flushDesc.getStoreFlushesCount()); //only one store<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>            StoreFlushDescriptor storeFlushDesc = flushDesc.getStoreFlushes(0);<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>            assertArrayEquals(family, storeFlushDesc.getFamilyName().toByteArray());<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span>            assertEquals("family", storeFlushDesc.getStoreHomeDir());<a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>            if (flushDesc.getAction() == FlushAction.START_FLUSH) {<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>              assertEquals(0, storeFlushDesc.getFlushOutputCount());<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>            } else {<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>              assertEquals(1, storeFlushDesc.getFlushOutputCount()); //only one file from flush<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>              assertTrue(storeFiles.contains(storeFlushDesc.getFlushOutput(0)));<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>            }<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span><a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>            flushDescriptors.add(entry);<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>          }<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>        }<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span><a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>        assertEquals(3 * 2, flushDescriptors.size()); // START_FLUSH and COMMIT_FLUSH per flush<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span><a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>        // now write those markers to the recovered edits again.<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span><a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>        Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span><a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", 1000));<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>        fs.create(recoveredEdits);<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span><a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>        for (WAL.Entry entry : flushDescriptors) {<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>          writer.append(entry);<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>        }<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>        writer.close();<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>      } finally {<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>        if (null != reader) {<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>          try {<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>            reader.close();<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>          } catch (IOException exception) {<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>            LOG.warn("Problem closing wal: " + exception.getMessage());<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>            LOG.debug("exception details", exception);<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>          }<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>        }<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>      }<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span><a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>      // close the region now, and reopen again<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>      region = HRegion.openHRegion(region, null);<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span><a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>      // now check whether we have can read back the data from region<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>        Get get = new Get(Bytes.toBytes(i));<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>        Result result = region.get(get);<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>        byte[] value = result.getValue(family, Bytes.toBytes(i));<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>        assertArrayEquals(Bytes.toBytes(i), value);<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>      }<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>    } finally {<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>      this.region = null;<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>      wals.close();<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>    }<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>  }<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span><a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>  static class IsFlushWALMarker implements ArgumentMatcher&lt;WALEdit&gt; {<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>    volatile FlushAction[] actions;<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>    public IsFlushWALMarker(FlushAction... actions) {<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>      this.actions = actions;<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>    }<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span>    @Override<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>    public boolean matches(WALEdit edit) {<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>      List&lt;Cell&gt; cells = edit.getCells();<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>      if (cells.isEmpty()) {<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span>        return false;<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>      }<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>      if (WALEdit.isMetaEditFamily(cells.get(0))) {<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>        FlushDescriptor desc;<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>        try {<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>          desc = WALEdit.getFlushDescriptor(cells.get(0));<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>        } catch (IOException e) {<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>          LOG.warn(e.toString(), e);<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>          return false;<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>        }<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>        if (desc != null) {<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>          for (FlushAction action : actions) {<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>            if (desc.getAction() == action) {<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>              return true;<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>            }<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>          }<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>        }<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>      }<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span>      return false;<a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>    }<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>    public IsFlushWALMarker set(FlushAction... actions) {<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>      this.actions = actions;<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>      return this;<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>    }<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>  }<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span><a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>  @Test<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span>  public void testFlushMarkersWALFail() throws Exception {<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>    // test the cases where the WAL append for flush markers fail.<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>    byte[] family = Bytes.toBytes("family");<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span><a name="line.1151"></a>
+<span class="sourceLineNo">1152</span>    // spy an actual WAL implementation to throw exception (was not able to mock)<a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>    Path logDir = TEST_UTIL.getDataTestDirOnTestFS(method + "log");<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span><a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>    final Configuration walConf = new Configuration(TEST_UTIL.getConfiguration());<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>    // Make up a WAL that we can manipulate at append time.<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>    class FailAppendFlushMarkerWAL extends FSHLog {<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>      volatile FlushAction [] flushActions = null;<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span><a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>      public FailAppendFlushMarkerWAL(FileSystem fs, Path root, String logDir, Configuration conf)<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>      throws IOException {<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>        super(fs, root, logDir, conf);<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>      }<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span><a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>      @Override<a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>      protected Writer createWriterInstance(Path path) throws IOException {<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>        final Writer w = super.createWriterInstance(path);<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>        return new Writer() {<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>          @Override<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>          public void close() throws IOException {<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>            w.close();<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>          }<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span><a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>          @Override<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>          public void sync(boolean forceSync) throws IOException {<a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>            w.sync(forceSync);<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span>          }<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span><a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>          @Override<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>          public void append(Entry entry) throws IOException {<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>            List&lt;Cell&gt; cells = entry.getEdit().getCells();<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>            if (WALEdit.isMetaEditFamily(cells.get(0))) {<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>              FlushDescriptor desc = WALEdit.getFlushDescriptor(cells.get(0));<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>              if (desc != null) {<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>                for (FlushAction flushAction: flushActions) {<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>                  if (desc.getAction().equals(flushAction)) {<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>                    throw new IOException("Failed to append flush marker! " + flushAction);<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>                  }<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>                }<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>              }<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>            }<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>            w.append(entry);<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>          }<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span><a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>          @Override<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>          public long getLength() {<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>            return w.getLength();<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>          }<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>        };<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>      }<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>    }<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>    FailAppendFlushMarkerWAL wal =<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>      new FailAppendFlushMarkerWAL(FileSystem.get(walConf), FSUtils.getRootDir(walConf),<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>        method, walConf);<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>    wal.init();<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>    this.region = initHRegion(tableName, HConstants.EMPTY_START_ROW,<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>      HConstants.EMPTY_END_ROW, false, Durability.USE_DEFAULT, wal, family);<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>    int i = 0;<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>    Put put = new Put(Bytes.toBytes(i));<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>    put.setDurability(Durability.SKIP_WAL); // have to skip mocked wal<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>    put.addColumn(family, Bytes.toBytes(i), Bytes.toBytes(i));<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>    region.put(put);<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span><a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>    // 1. Test case where START_FLUSH throws exception<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>    wal.flushActions = new FlushAction [] {FlushAction.START_FLUSH};<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span><a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>    // start cache flush will throw exception<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>    try {<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>      region.flush(true);<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>      fail("This should have thrown exception");<a name="line.1221"></a>
+<span class="sourceLineNo">1222</span>    } catch (DroppedSnapshotException unexpected) {<a name="line.1222"></a>
+<span class="sourceLineNo">1223</span>      // this should not be a dropped snapshot exception. Meaning that RS will not abort<a name="line.1223"></a>
+<span class="sourceLineNo">1224</span>      throw unexpected;<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span>    } catch (IOException expected) {<a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>      // expected<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span>    }<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>    // The WAL is hosed now. It has two edits appended. We cannot roll the log without it<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>    // throwing a DroppedSnapshotException to force an abort. Just clean up the mess.<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>    region.close(true);<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>    wal.close();<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span><a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>    // 2. Test case where START_FLUSH succeeds but COMMIT_FLUSH will throw exception<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>    wal.flushActions = new FlushAction [] {FlushAction.COMMIT_FLUSH};<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>    wal = new FailAppendFlushMarkerWAL(FileSystem.get(walConf), FSUtils.getRootDir(walConf),<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>          method, walConf);<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>    wal.init();<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span>    this.region = initHRegion(tableName, HConstants.EMPTY_START_ROW,<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>      HConstants.EMPTY_END_ROW, false, Durability.USE_DEFAULT, wal, family);<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>    region.put(put);<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span><a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>    // 3. Test case where ABORT_FLUSH will throw exception.<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span>    // Even if ABORT_FLUSH throws exception, we should not fail with IOE, but continue with<a name="line.1243"></a>
+<span class="sourceLineNo">1244</span>    // DroppedSnapshotException. Below COMMMIT_FLUSH will cause flush to abort<a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>    wal.flushActions = new FlushAction [] {FlushAction.COMMIT_FLUSH, FlushAction.ABORT_FLUSH};<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span><a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>    try {<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span>      region.flush(true);<a name="line.1248"></a>
+<span class="sourceLineNo">1249</span>      fail("This should have thrown exception");<a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>    } catch (DroppedSnapshotException expected) {<a name="line.1250"></a>
+<span class="sourceLineNo">1251</span>      // we expect this exception, since we were able to write the snapshot, but failed to<a name="line.1251"></a>
+<span class="sourceLineNo">1252</span>      // write the flush marker to WAL<a name="line.1252"></a>
+<span class="sourceLineNo">1253</span>    } catch (IOException unexpected) {<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span>      throw unexpected;<a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>    }<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>  }<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span><a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>  @Test<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>  public void testGetWhileRegionClose() throws IOException {<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span>    Configuration hc = initSplit();<a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>    int numRows = 100;<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>    byte[][] families = { fam1, fam2, fam3 };<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span><a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>    // Setting up region<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span>    this.region = initHRegion(tableName, method, hc, families);<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>    // Put data in region<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span>    final int startRow = 100;<a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>    putData(startRow, numRows, qual1, families);<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>    putData(startRow, numRows, qual2, families);<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>    putData(startRow, numRows, qual3, families);<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span>    final AtomicBoolean done = new AtomicBoolean(false);<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>    final AtomicInteger gets = new AtomicInteger(0);<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>    GetTillDoneOrException[] threads = new GetTillDoneOrException[10];<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>    try {<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>      // Set ten threads running concurrently getting from the region.<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span>      for (int i = 0; i &lt; threads.length / 2; i++) {<a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>        threads[i] = new GetTillDoneOrException(i, Bytes.toBytes("" + startRow), done, gets);<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>        threads[i].setDaemon(true);<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>        threads[i].start();<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>      }<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>      // Artificially make the condition by setting closing flag explicitly.<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span>      // I can't make the issue happen with a call to region.close().<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span>      this.region.closing.set(true);<a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>      for (int i = threads.length / 2; i &lt; threads.length; i++) {<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>        threads[i] = new GetTillDoneOrException(i, Bytes.toBytes("" + startRow), done, gets);<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>        threads[i].setDaemon(true);<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>        threads[i].start();<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span>      }<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>    } finally {<a name="line.1289"></a>
+<span class="sourceLineNo">1290</span>      if (this.region != null) {<a name="line.1290"></a>
+<span class="sourceLineNo">1291</span>        HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>        this.region = null;<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>      }<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>    }<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>    done.set(true);<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>    for (GetTillDoneOrException t : threads) {<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span>      try {<a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>        t.join();<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>      } catch (InterruptedException e) {<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>        e.printStackTrace();<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>      }<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>      if (t.e != null) {<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span>        LOG.info("Exception=" + t.e);<a name="line.1303"></a>
+<span class="sourceLineNo">1304</span>        assertFalse("Found a NPE in " + t.getName(), t.e instanceof NullPointerException);<a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>      }<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>    }<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span>  }<a name="line.1307"></a>
+<span class="sourceLineNo">1308</span><a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>  /*<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>   * Thread that does get on single row until 'done' flag is flipped. If an<a name="line.1310"></a>
+<span class="sourceLineNo">1311</span>   * exception causes us to fail, it records it.<a name="line.1311"></a>
+<span class="sourceLineNo">1312</span>   */<a name="line.1312"></a>
+<span class="sourceLineNo">1313</span>  class GetTillDoneOrException extends Thread {<a name="line.1313"></a>
+<span class="sourceLineNo">1314</span>    private final Get g;<a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>    private final AtomicBoolean done;<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>    private final AtomicInteger count;<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>    private Exception e;<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span><a name="line.1318"></a>
+<span class="sourceLineNo">1319</span>    GetTillDoneOrException(final int i, final byte[] r, final AtomicBoolean d,<a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>        final AtomicInteger c) {<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>      super("getter." + i);<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>      this.g = new Get(r);<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>      this.done = d;<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span>      this.count = c;<a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>    }<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span><a name="line.1326"></a>
+<span class="sourceLineNo">1327</span>    @Override<a name="line.1327"></a>
+<span class="sourceLineNo">1328</span>    public void run() {<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>      while (!this.done.get()) {<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span>        try {<a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>          assertTrue(region.get(g).size() &gt; 0);<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>          this.count.incrementAndGet();<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>        } catch (Exception e) {<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>          this.e = e;<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span>          break;<a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>        }<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>      }<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>    }<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>  }<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span><a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>  /*<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>   * An involved filter test. Has multiple column families and deletes in mix.<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>   */<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>  @Test<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>  public void testWeirdCacheBehaviour() throws Exception {<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.1346"></a>
+<span class="sourceLineNo">1347</span>    byte[][] FAMILIES = new byte[][] { Bytes.toBytes("trans-blob"), Bytes.toBytes("trans-type"),<a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>        Bytes.toBytes("trans-date"), Bytes.toBytes("trans-tags"), Bytes.toBytes("trans-group") };<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span>    this.region = initHRegion(tableName, method, CONF, FAMILIES);<a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>    String value = "this is the value";<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>    String value2 = "this is some other value";<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>    String keyPrefix1 = "prefix1";<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>    String keyPrefix2 = "prefix2";<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span>    String keyPrefix3 = "prefix3";<a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>    putRows(this.region, 3, value, keyPrefix1);<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>    putRows(this.region, 3, value, keyPrefix2);<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span>    putRows(this.region, 3, value, keyPrefix3);<a name="line.1357"></a>
+<span class="sourceLineNo">1358</span>    putRows(this.region, 3, value2, keyPrefix1);<a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>    putRows(this.region, 3, value2, keyPrefix2);<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>    putRows(this.region, 3, value2, keyPrefix3);<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span>    System.out.println("Checking values for key: " + keyPrefix1);<a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>    assertEquals("Got back incorrect number of rows from scan", 3,<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>        getNumberOfRows(keyPrefix1, value2, this.region));<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span>    System.out.println("Checking values for key: " + keyPrefix2);<a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>    assertEquals("Got back incorrect number of rows from scan", 3,<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span>        getNumberOfRows(keyPrefix2, value2, this.region));<a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>    System.out.println("Checking values for key: " + keyPrefix3);<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>    assertEquals("Got back incorrect number of rows from scan", 3,<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>        getNumberOfRows(keyPrefix3, value2, this.region));<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>    deleteColumns(this.region, value2, keyPrefix1);<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>    deleteColumns(this.region, value2, keyPrefix2);<a name="line.1371"></a>
+<span class="sourceLineNo">1372</span>    deleteColumns(this.region, value2, keyPrefix3);<a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>    System.out.println("Starting important checks.....");<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>    assertEquals("Got back incorrect number of rows from scan: " + keyPrefix1, 0,<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span>        getNumberOfRows(keyPrefix1, value2, this.region));<a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>    assertEquals("Got back incorrect number of rows from scan: " + keyPrefix2, 0,<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>        getNumberOfRows(keyPrefix2, value2, this.region));<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>    assertEquals("Got back incorrect number of rows from scan: " + keyPrefix3, 0,<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span>        getNumberOfRows(keyPrefix3, value2, this.region));<a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>  }<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span><a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>  @Test<a name="line.1382"></a>
+<span class="sourceLineNo">1383</span>  public void testAppendWithReadOnlyTable() throws Exception {<a name="line.1383"></a>
+<span class="sourceLineNo">1384</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.1384"></a>
+<span class="sourceLineNo">1385</span>    this.region = initHRegion(tableName, method, CONF, true, Bytes.toBytes("somefamily"));<a name="line.1385"></a>
+<span class="sourceLineNo">1386</span>    boolean exceptionCaught = false;<a name="line.1386"></a>
+<span class="sourceLineNo">1387</span>    Append append = new Append(Bytes.toBytes("somerow"));<a name="line.1387"></a>
+<span class="sourceLineNo">1388</span>    append.setDurability(Durability.SKIP_WAL);<a name="line.1388"></a>
+<span class="sourceLineNo">1389</span>    append.addColumn(Bytes.toBytes("somefamily"), Bytes.toBytes("somequalifier"),<a name="line.1389"></a>
+<span class="sourceLineNo">1390</span>        Bytes.toBytes("somevalue"));<a name="line.1390"></a>
+<span class="sourceLineNo">1391</span>    try {<a name="line.1391"></a>
+<span class="sourceLineNo">1392</span>      region.append(append);<a name="line.1392"></a>
+<span class="sourceLineNo">1393</span>    } catch (IOException e) {<a name="line.1393"></a>
+<span class="sourceLineNo">1394</span>      exceptionCaught = true;<a name="line.1394"></a>
+<span class="sourceLineNo">1395</span>    }<a name="line.1395"></a>
+<span class="sourceLineNo">1396</span>    assertTrue(exceptionCaught == true);<a name="line.1396"></a>
+<span class="sourceLineNo">1397</span>  }<a name="line.1397"></a>
+<span class="sourceLineNo">1398</span><a name="line.1398"></a>
+<span class="sourceLineNo">1399</span>  @Test<a name="line.1399"></a>
+<span class="sourceLineNo">1400</span>  public void testIncrWithReadOnlyTable() throws Exception {<a name="line.1400"></a>
+<span class="sourceLineNo">1401</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.1401"></a>
+<span class="sourceLineNo">1402</span>    this.region = initHRegion(tableName, method, CONF, true, Bytes.toBytes("somefamily"));<a name="line.1402"></a>
+<span class="sourceLineNo">1403</span>    boolean exceptionCaught = false;<a name="line.1403"></a>
+<span class="sourceLineNo">1404</span>    Increment inc = new Increment(Bytes.toBytes("somerow"));<a name="line.1404"></a>
+<span class="sourceLineNo">1405</span>    inc.setDurability(Durability.SKIP_WAL);<a name="line.1405"></a>
+<span class="sourceLineNo">1406</span>    inc.addColumn(Bytes.toBytes("somefamily"), Bytes.toBytes("somequalifier"), 1L);<a name="line.1406"></a>
+<span class="sourceLineNo">1407</span>    try {<a name="line.1407"></a>
+<span class="sourceLineNo">1408</span>      region.increment(inc);<a name="line.1408"></a>
+<span class="sourceLineNo">1409</span>    } catch (IOException e) {<a name="line.1409"></a>
+<span class="sourceLineNo">1410</span>      exceptionCaught = true;<a name="line.1410"></a>
+<span class="sourceLineNo">1411</span>    }<a name="line.1411"></a>
+<span class="sourceLineNo">1412</span>    assertTrue(exceptionCaught == true);<a name="line.1412"></a>
+<span class="sourceLineNo">1413</span>  }<a name="line.1413"></a>
+<span class="sourceLineNo">1414</span><a name="line.1414"></a>
+<span class="sourceLineNo">1415</span>  private void deleteColumns(HRegion r, String value, String keyPrefix) throws IOException {<a name="line.1415"></a>
+<span class="sourceLineNo">1416</span>    InternalScanner scanner = buildScanner(keyPrefix, value, r);<a name="line.1416"></a>
+<span class="sourceLineNo">1417</span>    int count = 0;<a name="line.1417"></a>
+<span class="sourceLineNo">1418</span>    boolean more = false;<a name="line.1418"></a>
+<span class="sourceLineNo">1419</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.1419"></a>
+<span class="sourceLineNo">1420</span>    do {<a name="line.1420"></a>
+<span class="sourceLineNo">1421</span>      more = scanner.next(results);<a name="line.1421"></a>
+<span class="sourceLineNo">1422</span>      if (results != null &amp;&amp; !results.isEmpty())<a name="line.1422"></a>
+<span class="sourceLineNo">1423</span>        count++;<a name="line.1423"></a>
+<span class="sourceLineNo">1424</span>      else<a name="line.1424"></a>
+<span class="sourceLineNo">1425</span>        break;<a name="line.1425"></a>
+<span class="sourceLineNo">1426</span>      Delete delete = new Delete(CellUtil.cloneRow(results.get(0)));<a name="line.1426"></a>
+<span class="sourceLineNo">1427</span>      delete.addColumn(Bytes.toBytes("trans-tags"), Bytes.toBytes("qual2"));<a name="line.1427"></a>
+<span class="sourceLineNo">1428</span>      r.delete(delete);<a name="line.1428"></a>
+<span class="sourceLineNo">1429</span>      results.clear();<a name="line.1429"></a>
+<span class="sourceLineNo">1430</span>    } while (more);<a name="line.1430"></a>
+<span class="sourceLineNo">1431</span>    assertEquals("Did not perform correct number of deletes", 3, count);<a name="line.1431"></a>
+<span class="sourceLineNo">1432</span>  }<a name="line.1432"></a>
+<span class="sourceLineNo">1433</span><a name="line.1433"></a>
+<span class="sourceLineNo">1434</span>  private int getNumberOfRows(String keyPrefix, String value, HRegion r) throws Exception {<a name="line.1434"></a>
+<span class="sourceLineNo">1435</span>    InternalScanner resultScanner = buildScanner(keyPrefix, value, r);<a name="line.1435"></a>
+<span class="sourceLineNo">1436</span>    int numberOfResults = 0;<a name="line.1436"></a>
+<span class="sourceLineNo">1437</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.1437"></a>
+<span class="sourceLineNo">1438</span>    boolean more = false;<a name="line.1438"></a>
+<span class="sourceLineNo">1439</span>    do {<a name="line.1439"></a>
+<span class="sourceLineNo">1440</span>      more = resultScanner.next(results);<a name="line.1440"></a>
+<span class="sourceLineNo">1441</span>      if (results != null &amp;&amp; !results.isEmpty())<a name="line.1441"></a>
+<span class="sourceLineNo">1442</span>        numberOfResults++;<a name="line.1442"></a>
+<span class="sourceLineNo">1443</span>      else<a name="line.1443"></a>
+<span class="sourceLineNo">1444</span>        break;<a name="line.1444"></a>
+<span class="sourceLineNo">1445</span>      for (Cell kv : results) {<a name="line.1445"></a>
+<span class="sourceLineNo">1446</span>        System.out.println("kv=" + kv.toString() + ", " + Bytes.toString(CellUtil.cloneValue(kv)));<a name="line.1446"></a>
+<span class="sourceLineNo">1447</span>      }<a name="line.1447"></a>
+<span class="sourceLineNo">1448</span>      results.clear();<a name="line.1448"></a>
+<span class="sourceLineNo">1449</span>    } while (more);<a name="line.1449"></a>
+<span class="sourceLineNo">1450</span>    return numberOfResults;<a name="line.1450"></a>
+<span class="sourceLineNo">1451</span>  }<a name="line.1451"></a>
+<span class="sourceLineNo">1452</span><a name="line.1452"></a>
+<span class="sourceLineNo">1453</span>  private InternalScanner buildScanner(String keyPrefix, String value, HRegion r)<a name="line.1453"></a>
+<span class="sourceLineNo">1454</span>      throws IOException {<a name="line.1454"></a>
+<span class="sourceLineNo">1455</span>    // Defaults FilterList.Operator.MUST_PASS_ALL.<a name="line.1455"></a>
+<span class="sourceLineNo">1456</span>    FilterList allFilters = new FilterList();<a name="line.1456"></a>
+<span class="sourceLineNo">1457</span>    allFilters.addFilter(new PrefixFilter(Bytes.toBytes(keyPrefix)));<a name="line.1457"></a>
+<span class="sourceLineNo">1458</span>    // Only return rows where this column value exists in the row.<a name="line.1458"></a>
+<span class="sourceLineNo">1459</span>    SingleColumnValueFilter filter = new SingleColumnValueFilter(Bytes.toBytes("trans-tags"),<a name="line.1459"></a>
+<span class="sourceLineNo">1460</span>        Bytes.toBytes("qual2"), CompareOperator.EQUAL, Bytes.toBytes(value));<a name="line.1460"></a>
+<span class="sourceLineNo">1461</span>    filter.setFilterIfMissing(true);<a name="line.1461"></a>
+<span class="sourceLineNo">1462</span>    allFilters.addFilter(filter);<a name="line.1462"></a>
+<span class="sourceLineNo">1463</span>    Scan scan = new Scan();<a name="line.1463"></a>
+<span class="sourceLineNo">1464</span>    scan.addFamily(Bytes.toBytes("trans-blob"));<a name="line.1464"></a>
+<span class="sourceLineNo">1465</span>    scan.addFamily(Bytes.toBytes("trans-type"));<a name="line.1465"></a>
+<span class="sourceLineNo">1466</span>    scan.addFamily(Bytes.toBytes("trans-date"));<a name="line.1466"></a>
+<span class="sourceLineNo">1467</span>    scan.addFamily(Bytes.toBytes("trans-tags"));<a name="line.1467"></a>
+<span class="sourceLineNo">1468</span>    scan.addFamily(Bytes.toBytes("trans-group"));<a name="line.1468"></a>
+<span class="sourceLineNo">1469</span>    scan.setFilter(allFilters);<a name="line.1469"></a>
+<span class="sourceLineNo">1470</span>    return r.getScanner(scan);<a name="line.1470"></a>
+<span class="sourceLineNo">1471</span>  }<a name="line.1471"></a>
+<span class="sourceLineNo">1472</span><a name="line.1472"></a>
+<span class="sourceLineNo">1473</span>  private void putRows(HRegion r, int numRows, String value, String key) throws IOException {<a name="line.1473"></a>
+<span class="sourceLineNo">1474</span>    for (int i = 0; i &lt; numRows; i++) {<a name="line.1474"></a>
+<span class="sourceLineNo">1475</span>      String row = key + "_" + i/* UUID.randomUUID().toString() */;<a name="line.1475"></a>
+<span class="sourceLineNo">1476</span>      System.out.println(String.format("Saving row: %s, with value %s", row, value));<a name="line.1476"></a>
+<span class="sourceLineNo">1477</span>      Put put = new Put(Bytes.toBytes(row));<a name="line.1477"></a>
+<span class="sourceLineNo">1478</span>      put.setDurability(Durability.SKIP_WAL);<a name="line.1478"></a>
+<span class="sourceLineNo">1479</span>      put.addColumn(Bytes.toBytes("trans-blob"), null, Bytes.toBytes("value for blob"));<a name="line.1479"></a>
+<span class="sourceLineNo">1480</span>      put.addColumn(Bytes.toBytes("trans-type"), null, Bytes.toBytes("statement"));<a name="line.1480"></a>
+<span class="sourceLineNo">1481</span>      put.addColumn(Bytes.toBytes("trans-date"), null, Bytes.toBytes("20090921010101999"));<a name="line.1481"></a>
+<span class="sourceLineNo">1482</span>      put.addColumn(Bytes.toBytes("trans-tags"), Bytes.toBytes("qual2"), Bytes.toBytes(value));<a name="line.1482"></a>
+<span class="sourceLineNo">1483</span>      put.addColumn(Bytes.toBytes("trans-group"), null, Bytes.toBytes("adhocTransactionGroupId"));<a name="line.1483"></a>
+<span class="sourceLineNo">1484</span>      r.put(put);<a name="line.1484"></a>
+<span class="sourceLineNo">1485</span>    }<a name="line.1485"></a>
+<span class="sourceLineNo">1486</span>  }<a name="line.1486"></a>
+<span class="sourceLineNo">1487</span><a name="line.1487"></a>
+<span class="sourceLineNo">1488</span>  @Test<a name="line.1488"></a>
+<span class="sourceLineNo">1489</span>  public void testFamilyWithAndWithoutColon() throws Exception {<a name="line.1489"></a>
+<span class="sourceLineNo">1490</span>    byte[] cf = Bytes.toBytes(COLUMN_FAMILY);<a name="line.1490"></a>
+<span class="sourceLineNo">1491</span>    this.region = initHRegion(tableName, method, CONF, cf);<a name="line.1491"></a>
+<span class="sourceLineNo">1492</span>    Put p = new Put(tableName.toBytes());<a name="line.1492"></a>
+<span class="sourceLineNo">1493</span>    byte[] cfwithcolon = Bytes.toBytes(COLUMN_FAMILY + ":");<a name="line.1493"></a>
+<span class="sourceLineNo">1494</span>    p.addColumn(cfwithcolon, cfwithcolon, cfwithcolon);<a name="line.1494"></a>
+<span class="sourceLineNo">1495</span>    boolean exception = false;<a name="line.1495"></a>
+<span class="sourceLineNo">1496</span>    try {<a name="line.1496"></a>
+<span class="sourceLineNo">1497</span>      this.region.put(p);<a name="line.1497"></a>
+<span class="sourceLineNo">1498</span>    } catch (NoSuchColumnFamilyException e) {<a name="line.1498"></a>
+<span class="sourceLineNo">1499</span>      exception = true;<a name="line.1499"></a>
+<span class="sourceLineNo">1500</span>    }<a name="line.1500"></a>
+<span class="sourceLineNo">1501</span>    assertTrue(exception);<a name="line.1501"></a>
+<span class="sourceLineNo">1502</span>  }<a name="line.1502"></a>
+<span class="sourceLineNo">1503</span><a name="line.1503"></a>
+<span class="sourceLineNo">1504</span>  @Test<a name="line.1504"></a>
+<span class="sourceLineNo">1505</span>  public void testBatchPut_whileNoRowLocksHeld() throws IOException {<a name="line.1505"></a>
+<span class="sourceLineNo">1506</span>    final Put[] puts = new Put[10];<a name="line.1506"></a>
+<span class="sourceLineNo">1507</span>    MetricsWALSource source = CompatibilitySingletonFactory.getInstance(MetricsWALSource.class);<a name="line.1507"></a>
+<span class="sourceLineNo">1508</span>    long syncs = prepareRegionForBachPut(puts, source, false);<a name="line.1508"></a>
+<span class="sourceLineNo">1509</span><a name="line.1509"></a>
+<span class="sourceLineNo">1510</span>    OperationStatus[] codes = this.region.batchMutate(puts);<a name="line.1510"></a>
+<span class="sourceLineNo">1511</span>    assertEquals(10, codes.length);<a name="line.1511"></a>
+<span class="sourceLineNo">1512</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.1512"></a>
+<span class="sourceLineNo">1513</span>      assertEquals(OperationStatusCode.SUCCESS, codes[i].getOperationStatusCode());<a name="line.1513"></a>
+<span class="sourceLineNo">1514</span>    }<a name="line.1514"></a>
+<span class="sourceLineNo">1515</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs + 1, source);<a name="line.1515"></a>
+<span class="sourceLineNo">1516</span><a name="line.1516"></a>
+<span class="sourceLineNo">1517</span>    LOG.info("Next a batch put with one invalid family");<a name="line.1517"></a>
+<span class="sourceLineNo">1518</span>    puts[5].addColumn(Bytes.toBytes("BAD_CF"), qual, value);<a name="line.1518"></a>
+<span class="sourceLineNo">1519</span>    codes = this.region.batchMutate(puts);<a name="line.1519"></a>
+<span class="sourceLineNo">1520</span>    assertEquals(10, codes.length);<a name="line.1520"></a>
+<span class="sourceLineNo">1521</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.1521"></a>
+<span class="sourceLineNo">1522</span>      assertEquals((i == 5) ? OperationStatusCode.BAD_FAMILY : OperationStatusCode.SUCCESS,<a name="line.1522"></a>
+<span class="sourceLineNo">1523</span>          codes[i].getOperationStatusCode());<a name="line.1523"></a>
+<span class="sourceLineNo">1524</span>    }<a name="line.1524"></a>
+<span class="sourceLineNo">1525</span><a name="line.1525"></a>
+<span class="sourceLineNo">1526</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs + 2, source);<a name="line.1526"></a>
+<span class="sourceLineNo">1527</span>  }<a name="line.1527"></a>
+<span class="sourceLineNo">1528</span><a name="line.1528"></a>
+<span class="sourceLineNo">1529</span>  @Test<a name="line.1529"></a>
+<span class="sourceLineNo">1530</span>  public void testBatchPut_whileMultipleRowLocksHeld() throws Exception {<a name="line.1530"></a>
+<span class="sourceLineNo">1531</span>    final Put[] puts = new Put[10];<a name="line.1531"></a>
+<span class="sourceLineNo">1532</span>    MetricsWALSource source = CompatibilitySingletonFactory.getInstance(MetricsWALSource.class);<a name="line.1532"></a>
+<span class="sourceLineNo">1533</span>    long syncs = prepareRegionForBachPut(puts, source, false);<a name="line.1533"></a>
+<span class="sourceLineNo">1534</span><a name="line.1534"></a>
+<span class="sourceLineNo">1535</span>    puts[5].addColumn(Bytes.toBytes("BAD_CF"), qual, value);<a name="line.1535"></a>
+<span class="sourceLineNo">1536</span><a name="line.1536"></a>
+<span class="sourceLineNo">1537</span>    LOG.info("batchPut will have to break into four batches to avoid row locks");<a name="line.1537"></a>
+<span class="sourceLineNo">1538</span>    RowLock rowLock1 = region.getRowLock(Bytes.toBytes("row_2"));<a name="line.1538"></a>
+<span class="sourceLineNo">1539</span>    RowLock rowLock2 = region.getRowLock(Bytes.toBytes("row_1"));<a name="line.1539"></a>
+<span class="sourceLineNo">1540</span>    RowLock rowLock3 = region.getRowLock(Bytes.toBytes("row_3"));<a name="line.1540"></a>
+<span class="sourceLineNo">1541</span>    RowLock rowLock4 = region.getRowLock(Bytes.toBytes("row_3"), true);<a name="line.1541"></a>
+<span class="sourceLineNo">1542</span><a name="line.1542"></a>
+<span class="sourceLineNo">1543</span>    MultithreadedTestUtil.TestContext ctx = new MultithreadedTestUtil.TestContext(CONF);<a name="line.1543"></a>
+<span class="sourceLineNo">1544</span>    final AtomicReference&lt;OperationStatus[]&gt; retFromThread = new AtomicReference&lt;&gt;();<a name="line.1544"></a>
+<span class="sourceLineNo">1545</span>    final CountDownLatch startingPuts = new CountDownLatch(1);<a name="line.1545"></a>
+<span class="sourceLineNo">1546</span>    final CountDownLatch startingClose = new CountDownLatch(1);<a name="line.1546"></a>
+<span class="sourceLineNo">1547</span>    TestThread putter = new TestThread(ctx) {<a name="line.1547"></a>
+<span class="sourceLineNo">1548</span>      @Override<a name="line.1548"></a>
+<span class="sourceLineNo">1549</span>      public void doWork() throws IOException {<a name="line.1549"></a>
+<span class="sourceLineNo">1550</span>        startingPuts.countDown();<a name="line.1550"></a>
+<span class="sourceLineNo">1551</span>        retFromThread.set(region.batchMutate(puts));<a name="line.1551"></a>
+<span class="sourceLineNo">1552</span>      }<a name="line.1552"></a>
+<span class="sourceLineNo">1553</span>    };<a name="line.1553"></a>
+<span class="sourceLineNo">1554</span>    LOG.info("...starting put thread while holding locks");<a name="line.1554"></a>
+<span class="sourceLineNo">1555</span>    ctx.addThread(putter);<a name="line.1555"></a>
+<span class="sourceLineNo">1556</span>    ctx.startThreads();<a name="line.1556"></a>
+<span class="sourceLineNo">1557</span><a name="line.1557"></a>
+<span class="sourceLineNo">1558</span>    // Now attempt to close the region from another thread.  Prior to HBASE-12565<a name="line.1558"></a>
+<span class="sourceLineNo">1559</span>    // this would cause the in-progress batchMutate operation to to fail with<a name="line.1559"></a>
+<span class="sourceLineNo">1560</span>    // exception because it use to release and re-acquire the close-guard lock<a name="line.1560"></a>
+<span class="sourceLineNo">1561</span>    // between batches.  Caller then didn't get status indicating which writes succeeded.<a name="line.1561"></a>
+<span class="sourceLineNo">1562</span>    // We now expect this thread to block until the batchMutate call finishes.<a name="line.1562"></a>
+<span class="sourceLineNo">1563</span>    Thread regionCloseThread = new TestThread(ctx) {<a name="line.1563"></a>
+<span class="sourceLineNo">1564</span>      @Override<a name="line.1564"></a>
+<span class="sourceLineNo">1565</span>      public void doWork() {<a name="line.1565"></a>
+<span class="sourceLineNo">1566</span>        try {<a name="line.1566"></a>
+<span class="sourceLineNo">1567</span>          startingPuts.await();<a name="line.1567"></a>
+<span class="sourceLineNo">1568</span>          // Give some time for the batch mutate to get in.<a name="line.1568"></a>
+<span class="sourceLineNo">1569</span>          // We don't want to race with the mutate<a name="line.1569"></a>
+<span class="sourceLineNo">1570</span>          Thread.sleep(10);<a name="line.1570"></a>
+<span class="sourceLineNo">1571</span>          startingClose.countDown();<a name="line.1571"></a>
+<span class="sourceLineNo">1572</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.1572"></a>
+<span class="sourceLineNo">1573</span>          region = null;<a name="line.1573"></a>
+<span class="sourceLineNo">1574</span>        } catch (IOException e) {<a name="line.1574"></a>
+<span class="sourceLineNo">1575</span>          throw new RuntimeException(e);<a name="line.1575"></a>
+<span class="sourceLineNo">1576</span>        } catch (InterruptedException e) {<a name="line.1576"></a>
+<span class="sourceLineNo">1577</span>          throw new RuntimeException(e);<a name="line.1577"></a>
+<span class="sourceLineNo">1578</span>        }<a name="line.1578"></a>
+<span class="sourceLineNo">1579</span>      }<a name="line.1579"></a>
+<span class="sourceLineNo">1580</span>    };<a name="line.1580"></a>
+<span class="sourceLineNo">1581</span>    regionCloseThread.start();<a name="line.1581"></a>
+<span class="sourceLineNo">1582</span><a name="line.1582"></a>
+<span class="sourceLineNo">1583</span>    startingClose.await();<a name="line.1583"></a>
+<span class="sourceLineNo">1584</span>    startingPuts.await();<a name="line.1584"></a>
+<span class="sourceLineNo">1585</span>    Thread.sleep(100);<a name="line.1585"></a>
+<span class="sourceLineNo">1586</span>    LOG.info("...releasing row lock 1, which should let put thread continue");<a name="line.1586"></a>
+<span class="sourceLineNo">1587</span>    rowLock1.release();<a name="line.1587"></a>
+<span class="sourceLineNo">1588</span>    rowLock2.release();<a name="line.1588"></a>
+<span class="sourceLineNo">1589</span>    rowLock3.release();<a name="line.1589"></a>
+<span class="sourceLineNo">1590</span>    waitForCounter(source, "syncTimeNumOps", syncs + 1);<a name="line.1590"></a>
+<span class="sourceLineNo">1591</span><a name="line.1591"></a>
+<span class="sourceLineNo">1592</span>    LOG.info("...joining on put thread");<a name="line.1592"></a>
+<span class="sourceLineNo">1593</span>    ctx.stop();<a name="line.1593"></a>
+<span class="sourceLineNo">1594</span>    regionCloseThread.join();<a name="line.1594"></a>
+<span class="sourceLineNo">1595</span><a name="line.1595"></a>
+<span class="sourceLineNo">1596</span>    OperationStatus[] codes = retFromThread.get();<a name="line.1596"></a>
+<span class="sourceLineNo">1597</span>    for (int i = 0; i &lt; codes.length; i++) {<a name="line.1597"></a>
+<span class="sourceLineNo">1598</span>      assertEquals((i == 5) ? OperationStatusCode.BAD_FAMILY : OperationStatusCode.SUCCESS,<a name="line.1598"></a>
+<span class="sourceLineNo">1599</span>          codes[i].getOperationStatusCode());<a name="line.1599"></a>
+<span class="sourceLineNo">1600</span>    }<a name="line.1600"></a>
+<span class="sourceLineNo">1601</span>    rowLock4.release();<a name="line.1601"></a>
+<span class="sourceLineNo">1602</span>  }<a name="line.1602"></a>
+<span class="sourceLineNo">1603</span><a name="line.1603"></a>
+<span class="sourceLineNo">1604</span>  private void waitForCounter(MetricsWALSource source, String metricName, long expectedCount)<a name="line.1604"></a>
+<span class="sourceLineNo">1605</span>      throws InterruptedException {<a name="line.1605"></a>
+<span class="sourceLineNo">1606</span>    long startWait = System.currentTimeMillis();<a name="line.1606"></a>
+<span class="sourceLineNo">1607</span>    long currentCount;<a name="line.1607"></a>
+<span class="sourceLineNo">1608</span>    while ((currentCount = metricsAssertHelper.getCounter(metricName, source)) &lt; expectedCount) {<a name="line.1608"></a>
+<span class="sourceLineNo">1609</span>      Thread.sleep(100);<a name="line.1609"></a>
+<span class="sourceLineNo">1610</span>      if (System.currentTimeMillis() - startWait &gt; 10000) {<a name="line.1610"></a>
+<span class="sourceLineNo">1611</span>        fail(String.format("Timed out waiting for '%s' &gt;= '%s', currentCount=%s", metricName,<a name="line.1611"></a>
+<span class="sourceLineNo">1612</span>            expectedCount, currentCount));<a name="line.1612"></a>
+<span class="sourceLineNo">1613</span>      }<a name="line.1613"></a>
+<span class="sourceLineNo">1614</span>    }<a name="line.1614"></a>
+<span class="sourceLineNo">1615</span>  }<a name="line.1615"></a>
+<span class="sourceLineNo">1616</span><a name="line.1616"></a>
+<span class="sourceLineNo">1617</span>  @Test<a name="line.1617"></a>
+<span class="sourceLineNo">1618</span>  public void testAtomicBatchPut() throws IOException {<a name="line.1618"></a>
+<span class="sourceLineNo">1619</span>    final Put[] puts = new Put[10];<a name="line.1619"></a>
+<span class="sourceLineNo">1620</span>    MetricsWALSource source = CompatibilitySingletonFactory.getInstance(MetricsWALSource.class);<a name="line.1620"></a>
+<span class="sourceLineNo">1621</span>    long syncs = prepareRegionForBachPut(puts, source, false);<a name="line.1621"></a>
+<span class="sourceLineNo">1622</span><a name="line.1622"></a>
+<span class="sourceLineNo">1623</span>    // 1. Straight forward case, should succeed<a name="line.1623"></a>
+<span class="sourceLineNo">1624</span>    MutationBatchOperation batchOp = new MutationBatchOperation(region, puts, true,<a name="line.1624"></a>
+<span class="sourceLineNo">1625</span>        HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.1625"></a>
+<span class="sourceLineNo">1626</span>    OperationStatus[] codes = this.region.batchMutate(batchOp);<a name="line.1626"></a>
+<span class="sourceLineNo">1627</span>    assertEquals(10, codes.length);<a name="line.1627"></a>
+<span class="sourceLineNo">1628</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.1628"></a>
+<span class="sourceLineNo">1629</span>      assertEquals(OperationStatusCode.SUCCESS, codes[i].getOperationStatusCode());<a name="line.1629"></a>
+<span class="sourceLineNo">1630</span>    }<a name="line.1630"></a>
+<span class="sourceLineNo">1631</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs + 1, source);<a name="line.1631"></a>
+<span class="sourceLineNo">1632</span><a name="line.1632"></a>
+<span class="sourceLineNo">1633</span>    // 2. Failed to get lock<a name="line.1633"></a>
+<span class="sourceLineNo">1634</span>    RowLock lock = region.getRowLock(Bytes.toBytes("row_" + 3));<a name="line.1634"></a>
+<span class="sourceLineNo">1635</span>    // Method {@link HRegion#getRowLock(byte[])} is reentrant. As 'row_3' is locked in this<a name="line.1635"></a>
+<span class="sourceLineNo">1636</span>    // thread, need to run {@link HRegion#batchMutate(HRegion.BatchOperation)} in different thread<a name="line.1636"></a>
+<span class="sourceLineNo">1637</span>    MultithreadedTestUtil.TestContext ctx = new MultithreadedTestUtil.TestContext(CONF);<a name="line.1637"></a>
+<span class="sourceLineNo">1638</span>    final AtomicReference&lt;IOException&gt; retFromThread = new AtomicReference&lt;&gt;();<a name="line.1638"></a>
+<span class="sourceLineNo">1639</span>    final CountDownLatch finishedPuts = new CountDownLatch(1);<a name="line.1639"></a>
+<span class="sourceLineNo">1640</span>    final MutationBatchOperation finalBatchOp = new MutationBatchOperation(region, puts, true,<a name="line.1640"></a>
+<span class="sourceLineNo">1641</span>        HConstants<a name="line.1641"></a>
+<span class="sourceLineNo">1642</span>        .NO_NONCE,<a name="line.1642"></a>
+<span class="sourceLineNo">1643</span>        HConstants.NO_NONCE);<a name="line.1643"></a>
+<span class="sourceLineNo">1644</span>    TestThread putter = new TestThread(ctx) {<a name="line.1644"></a>
+<span class="sourceLineNo">1645</span>      @Override<a name="line.1645"></a>
+<span class="sourceLineNo">1646</span>      public void doWork() throws IOException {<a name="line.1646"></a>
+<span class="sourceLineNo">1647</span>        try {<a name="line.1647"></a>
+<span class="sourceLineNo">1648</span>          region.batchMutate(finalBatchOp);<a name="line.1648"></a>
+<span class="sourceLineNo">1649</span>        } catch (IOException ioe) {<a name="line.1649"></a>
+<span class="sourceLineNo">1650</span>          LOG.error("test failed!", ioe);<a name="line.1650"></a>
+<span class="sourceLineNo">1651</span>          retFromThread.set(ioe);<a name="line.1651"></a>
+<span class="sourceLineNo">1652</span>        }<a name="line.1652"></a>
+<span class="sourceLineNo">1653</span>        finishedPuts.countDown();<a name="line.1653"></a>
+<span class="sourceLineNo">1654</span>      }<a name="line.1654"></a>
+<span class="sourceLineNo">1655</span>    };<a name="line.1655"></a>
+<span class="sourceLineNo">1656</span>    LOG.info("...starting put thread while holding locks");<a name="line.1656"></a>
+<span class="sourceLineNo">1657</span>    ctx.addThread(putter);<a name="line.1657"></a>
+<span class="sourceLineNo">1658</span>    ctx.startThreads();<a name="line.1658"></a>
+<span class="sourceLineNo">1659</span>    LOG.info("...waiting for batch puts while holding locks");<a name="line.1659"></a>
+<span class="sourceLineNo">1660</span>    try {<a name="line.1660"></a>
+<span class="sourceLineNo">1661</span>      finishedPuts.await();<a name="line.1661"></a>
+<span class="sourceLineNo">1662</span>    } catch (InterruptedException e) {<a name="line.1662"></a>
+<span class="sourceLineNo">1663</span>      LOG.error("Interrupted!", e);<a name="line.1663"></a>
+<span class="sourceLineNo">1664</span>    } finally {<a name="line.1664"></a>
+<span class="sourceLineNo">1665</span>      if (lock != null) {<a name="line.1665"></a>
+<span class="sourceLineNo">1666</span>        lock.release();<a name="line.1666"></a>
+<span class="sourceLineNo">1667</span>      }<a name="line.1667"></a>
+<span class="sourceLineNo">1668</span>    }<a name="line.1668"></a>
+<span class="sourceLineNo">1669</span>    assertNotNull(retFromThread.get());<a name="line.1669"></a>
+<span class="sourceLineNo">1670</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs + 1, source);<a name="line.1670"></a>
+<span class="sourceLineNo">1671</span><a name="line.1671"></a>
+<span class="sourceLineNo">1672</span>    // 3. Exception thrown in validation<a name="line.1672"></a>
+<span class="sourceLineNo">1673</span>    LOG.info("Next a batch put with one invalid family");<a name="line.1673"></a>
+<span class="sourceLineNo">1674</span>    puts[5].addColumn(Bytes.toBytes("BAD_CF"), qual, value);<a name="line.1674"></a>
+<span class="sourceLineNo">1675</span>    batchOp = new MutationBatchOperation(region, puts, true, HConstants.NO_NONCE,<a name="line.1675"></a>
+<span class="sourceLineNo">1676</span>        HConstants.NO_NONCE);<a name="line.1676"></a>
+<span class="sourceLineNo">1677</span>    thrown.expect(NoSuchColumnFamilyException.class);<a name="line.1677"></a>
+<span class="sourceLineNo">1678</span>    this.region.batchMutate(batchOp);<a name="line.1678"></a>
+<span class="sourceLineNo">1679</span>  }<a name="line.1679"></a>
+<span class="sourceLineNo">1680</span><a name="line.1680"></a>
+<span class="sourceLineNo">1681</span>  @Test<a name="line.1681"></a>
+<span class="sourceLineNo">1682</span>  public void testBatchPutWithTsSlop() throws Exception {<a name="line.1682"></a>
+<span class="sourceLineNo">1683</span>    // add data with a timestamp that is too recent for range. Ensure assert<a name="line.1683"></a>
+<span class="sourceLineNo">1684</span>    CONF.setInt("hbase.hregion.keyvalue.timestamp.slop.millisecs", 1000);<a name="line.1684"></a>
+<span class="sourceLineNo">1685</span>    final Put[] puts = new Put[10];<a name="line.1685"></a>
+<span class="sourceLineNo">1686</span>    MetricsWALSource source = CompatibilitySingletonFactory.getInstance(MetricsWALSource.class);<a name="line.1686"></a>
+<span class="sourceLineNo">1687</span><a name="line.1687"></a>
+<span class="sourceLineNo">1688</span>    long syncs = prepareRegionForBachPut(puts, source, true);<a name="line.1688"></a>
+<span class="sourceLineNo">1689</span><a name="line.1689"></a>
+<span class="sourceLineNo">1690</span>    OperationStatus[] codes = this.region.batchMutate(puts);<a name="line.1690"></a>
+<span class="sourceLineNo">1691</span>    assertEquals(10, codes.length);<a name="line.1691"></a>
+<span class="sourceLineNo">1692</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.1692"></a>
+<span class="sourceLineNo">1693</span>      assertEquals(OperationStatusCode.SANITY_CHECK_FAILURE, codes[i].getOperationStatusCode());<a name="line.1693"></a>
+<span class="sourceLineNo">1694</span>    }<a name="line.1694"></a>
+<span class="sourceLineNo">1695</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs, source);<a name="line.1695"></a>
+<span class="sourceLineNo">1696</span>  }<a name="line.1696"></a>
+<span class="sourceLineNo">1697</span><a name="line.1697"></a>
+<span class="sourceLineNo">1698</span>  /**<a name="line.1698"></a>
+<span class="sourceLineNo">1699</span>   * @return syncs initial syncTimeNumOps<a name="line.1699"></a>
+<span class="sourceLineNo">1700</span>   */<a name="line.1700"></a>
+<span class="sourceLineNo">1701</span>  private long prepareRegionForBachPut(final Put[] puts, final MetricsWALSource source,<a name="line.1701"></a>
+<span class="sourceLineNo">1702</span>      boolean slop) throws IOException {<a name="line.1702"></a>
+<span class="sourceLineNo">1703</span>    this.region = initHRegion(tableName, method, CONF, COLUMN_FAMILY_BYTES);<a name="line.1703"></a>
+<span class="sourceLineNo">1704</span><a name="line.1704"></a>
+<span class="sourceLineNo">1705</span>    LOG.info("First a batch put with all valid puts");<a name="line.1705"></a>
+<span class="sourceLineNo">1706</span>    for (int i = 0; i &lt; puts.length; i++) {<a name="line.1706"></a>
+<span class="sourceLineNo">1707</span>      puts[i] = slop ? new Put(Bytes.toBytes("row_" + i), Long.MAX_VALUE - 100) :<a name="line.1707"></a>
+<span class="sourceLineNo">1708</span>          new Put(Bytes.toBytes("row_" + i));<a name="line.1708"></a>
+<span class="sourceLineNo">1709</span>      puts[i].addColumn(COLUMN_FAMILY_BYTES, qual, value);<a name="line.1709"></a>
+<span class="sourceLineNo">1710</span>    }<a name="line.1710"></a>
+<span class="sourceLineNo">1711</span><a name="line.1711"></a>
+<span class="sourceLineNo">1712</span>    long syncs = metricsAssertHelper.getCounter("syncTimeNumOps", source);<a name="line.1712"></a>
+<span class="sourceLineNo">1713</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs, source);<a name="line.1713"></a>
+<span class="sourceLineNo">1714</span>    return syncs;<a name="line.1714"></a>
+<span class="sourceLineNo">1715</span>  }<a name="line.1715"></a>
+<span class="sourceLineNo">1716</span><a name="line.1716"></a>
+<span class="sourceLineNo">1717</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.1717"></a>
+<span class="sourceLineNo">1718</span>  // checkAndMutate tests<a name="line.1718"></a>
+<span class="sourceLineNo">1719</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.1719"></a>
+<span class="sourceLineNo">1720</span>  @Test<a name="line.1720"></a>
+<span class="sourceLineNo">1721</span>  public void testCheckAndMutate_WithEmptyRowValue() throws IOException {<a name="line.1721"></a>
+<span class="sourceLineNo">1722</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1722"></a>
+<span class="sourceLineNo">1723</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1723"></a>
+<span class="sourceLineNo">1724</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1724"></a>
+<span class="sourceLineNo">1725</span>    byte[] emptyVal = new byte[] {};<a name="line.1725"></a>
+<span class="sourceLineNo">1726</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1726"></a>
+<span class="sourceLineNo">1727</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.1727"></a>
+<span class="sourceLineNo">1728</span><a name="line.1728"></a>
+<span class="sourceLineNo">1729</span>    // Setting up region<a name="line.1729"></a>
+<span class="sourceLineNo">1730</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.1730"></a>
+<span class="sourceLineNo">1731</span>    // Putting empty data in key<a name="line.1731"></a>
+<span class="sourceLineNo">1732</span>    Put put = new Put(row1);<a name="line.1732"></a>
+<span class="sourceLineNo">1733</span>    put.addColumn(fam1, qf1, emptyVal);<a name="line.1733"></a>
+<span class="sourceLineNo">1734</span><a name="line.1734"></a>
+<span class="sourceLineNo">1735</span>    // checkAndPut with empty value<a name="line.1735"></a>
+<span class="sourceLineNo">1736</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1736"></a>
+<span class="sourceLineNo">1737</span>        new BinaryComparator(emptyVal), put);<a name="line.1737"></a>
+<span class="sourceLineNo">1738</span>    assertTrue(res);<a name="line.1738"></a>
+<span class="sourceLineNo">1739</span><a name="line.1739"></a>
+<span class="sourceLineNo">1740</span>    // Putting data in key<a name="line.1740"></a>
+<span class="sourceLineNo">1741</span>    put = new Put(row1);<a name="line.1741"></a>
+<span class="sourceLineNo">1742</span>    put.addColumn(fam1, qf1, val1);<a name="line.1742"></a>
+<span class="sourceLineNo">1743</span><a name="line.1743"></a>
+<span class="sourceLineNo">1744</span>    // checkAndPut with correct value<a name="line.1744"></a>
+<span class="sourceLineNo">1745</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1745"></a>
+<span class="sourceLineNo">1746</span>        new BinaryComparator(emptyVal), put);<a name="line.1746"></a>
+<span class="sourceLineNo">1747</span>    assertTrue(res);<a name="line.1747"></a>
+<span class="sourceLineNo">1748</span><a name="line.1748"></a>
+<span class="sourceLineNo">1749</span>    // not empty anymore<a name="line.1749"></a>
+<span class="sourceLineNo">1750</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1750"></a>
+<span class="sourceLineNo">1751</span>        new BinaryComparator(emptyVal), put);<a name="line.1751"></a>
+<span class="sourceLineNo">1752</span>    assertFalse(res);<a name="line.1752"></a>
+<span class="sourceLineNo">1753</span><a name="line.1753"></a>
+<span class="sourceLineNo">1754</span>    Delete delete = new Delete(row1);<a name="line.1754"></a>
+<span class="sourceLineNo">1755</span>    delete.addColumn(fam1, qf1);<a name="line.1755"></a>
+<span class="sourceLineNo">1756</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1756"></a>
+<span class="sourceLineNo">1757</span>        new BinaryComparator(emptyVal), delete);<a name="line.1757"></a>
+<span class="sourceLineNo">1758</span>    assertFalse(res);<a name="line.1758"></a>
+<span class="sourceLineNo">1759</span><a name="line.1759"></a>
+<span class="sourceLineNo">1760</span>    put = new Put(row1);<a name="line.1760"></a>
+<span class="sourceLineNo">1761</span>    put.addColumn(fam1, qf1, val2);<a name="line.1761"></a>
+<span class="sourceLineNo">1762</span>    // checkAndPut with correct value<a name="line.1762"></a>
+<span class="sourceLineNo">1763</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1763"></a>
+<span class="sourceLineNo">1764</span>        new BinaryComparator(val1), put);<a name="line.1764"></a>
+<span class="sourceLineNo">1765</span>    assertTrue(res);<a name="line.1765"></a>
+<span class="sourceLineNo">1766</span><a name="line.1766"></a>
+<span class="sourceLineNo">1767</span>    // checkAndDelete with correct value<a name="line.1767"></a>
+<span class="sourceLineNo">1768</span>    delete = new Delete(row1);<a name="line.1768"></a>
 <span class="sourceLineNo">1769</span>    delete.addColumn(fam1, qf1);<a name="line.1769"></a>
-<span class="sourceLineNo">1770</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1770"></a>
-<span class="sourceLineNo">1771</span>        new BinaryComparator(val2), delete);<a name="line.1771"></a>
-<span class="sourceLineNo">1772</span>    assertTrue(res);<a name="line.1772"></a>
-<span class="sourceLineNo">1773</span><a name="line.1773"></a>
-<span class="sourceLineNo">1774</span>    delete = new Delete(row1);<a name="line.1774"></a>
-<span class="sourceLineNo">1775</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1775"></a>
-<span class="sourceLineNo">1776</span>        new BinaryComparator(emptyVal), delete);<a name="line.1776"></a>
-<span class="sourceLineNo">1777</span>    assertTrue(res);<a name="line.1777"></a>
-<span class="sourceLineNo">1778</span><a name="line.1778"></a>
-<span class="sourceLineNo">1779</span>    // checkAndPut looking for a null value<a name="line.1779"></a>
-<span class="sourceLineNo">1780</span>    put = new Put(row1);<a name="line.1780"></a>
-<span class="sourceLineNo">1781</span>    put.addColumn(fam1, qf1, val1);<a name="line.1781"></a>
-<span class="sourceLineNo">1782</span><a name="line.1782"></a>
-<span class="sourceLineNo">1783</span>    res = region<a name="line.1783"></a>
-<span class="sourceLineNo">1784</span>        .checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new NullComparator(), put);<a name="line.1784"></a>
-<span class="sourceLineNo">1785</span>    assertTrue(res);<a name="line.1785"></a>
-<span class="sourceLineNo">1786</span>  }<a name="line.1786"></a>
-<span class="sourceLineNo">1787</span><a name="line.1787"></a>
-<span class="sourceLineNo">1788</span>  @Test<a name="line.1788"></a>
-<span class="sourceLineNo">1789</span>  public void testCheckAndMutate_WithWrongValue() throws IOException {<a name="line.1789"></a>
-<span class="sourceLineNo">1790</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1790"></a>
-<span class="sourceLineNo">1791</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1791"></a>
-<span class="sourceLineNo">1792</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1792"></a>
-<span class="sourceLineNo">1793</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1793"></a>
-<span class="sourceLineNo">1794</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.1794"></a>
-<span class="sourceLineNo">1795</span>    BigDecimal bd1 = new BigDecimal(Double.MAX_VALUE);<a name="line.1795"></a>
-<span class="sourceLineNo">1796</span>    BigDecimal bd2 = new BigDecimal(Double.MIN_VALUE);<a name="line.1796"></a>
-<span class="sourceLineNo">1797</span><a name="line.1797"></a>
-<span class="sourceLineNo">1798</span>    // Setting up region<a name="line.1798"></a>
-<span class="sourceLineNo">1799</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.1799"></a>
-<span class="sourceLineNo">1800</span>    // Putting data in key<a name="line.1800"></a>
-<span class="sourceLineNo">1801</span>    Put put = new Put(row1);<a name="line.1801"></a>
-<span class="sourceLineNo">1802</span>    put.addColumn(fam1, qf1, val1);<a name="line.1802"></a>
-<span class="sourceLineNo">1803</span>    region.put(put);<a name="line.1803"></a>
-<span class="sourceLineNo">1804</span><a name="line.1804"></a>
-<span class="sourceLineNo">1805</span>    // checkAndPut with wrong value<a name="line.1805"></a>
-<span class="sourceLineNo">1806</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1806"></a>
-<span class="sourceLineNo">1807</span>        new BinaryComparator(val2), put);<a name="line.1807"></a>
-<span class="sourceLineNo">1808</span>    assertEquals(false, res);<a name="line.1808"></a>
-<span class="sourceLineNo">1809</span><a name="line.1809"></a>
-<span class="sourceLineNo">1810</span>    // checkAndDelete with wrong value<a name="line.1810"></a>
-<span class="sourceLineNo">1811</span>    Delete delete = new Delete(row1);<a name="line.1811"></a>
-<span class="sourceLineNo">1812</span>    delete.addFamily(fam1);<a name="line.1812"></a>
-<span class="sourceLineNo">1813</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1813"></a>
-<span class="sourceLineNo">1814</span>        new BinaryComparator(val2), put);<a name="line.1814"></a>
-<span class="sourceLineNo">1815</span>    assertEquals(false, res);<a name="line.1815"></a>
-<span class="sourceLineNo">1816</span><a name="line.1816"></a>
-<span class="sourceLineNo">1817</span>    // Putting data in key<a name="line.1817"></a>
-<span class="sourceLineNo">1818</span>    put = new Put(row1);<a name="line.1818"></a>
-<span class="sourceLineNo">1819</span>    put.addColumn(fam1, qf1, Bytes.toBytes(bd1));<a name="line.1819"></a>
-<span class="sourceLineNo">1820</span>    region.put(put);<a name="line.1820"></a>
-<span class="sourceLineNo">1821</span><a name="line.1821"></a>
-<span class="sourceLineNo">1822</span>    // checkAndPut with wrong value<a name="line.1822"></a>
-<span class="sourceLineNo">1823</span>    res =<a name="line.1823"></a>
-<span class="sourceLineNo">1824</span>        region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1824"></a>
-<span class="sourceLineNo">1825</span>            new BigDecimalComparator(bd2), put);<a name="line.1825"></a>
-<span class="sourceLineNo">1826</span>    assertEquals(false, res);<a name="line.1826"></a>
-<span class="sourceLineNo">1827</span><a name="line.1827"></a>
-<span class="sourceLineNo">1828</span>    // checkAndDelete with wrong value<a name="line.1828"></a>
-<span class="sourceLineNo">1829</span>    delete = new Delete(row1);<a name="line.1829"></a>
-<span class="sourceLineNo">1830</span>    delete.addFamily(fam1);<a name="line.1830"></a>
-<span class="sourceLineNo">1831</span>    res =<a name="line.1831"></a>
-<span class="sourceLineNo">1832</span>        region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1832"></a>
-<span class="sourceLineNo">1833</span>            new BigDecimalComparator(bd2), put);<a name="line.1833"></a>
-<span class="sourceLineNo">1834</span>    assertEquals(false, res);<a name="line.1834"></a>
-<span class="sourceLineNo">1835</span>  }<a name="line.1835"></a>
-<span class="sourceLineNo">1836</span><a name="line.1836"></a>
-<span class="sourceLineNo">1837</span>  @Test<a name="line.1837"></a>
-<span class="sourceLineNo">1838</span>  public void testCheckAndMutate_WithCorrectValue() throws IOException {<a name="line.1838"></a>
-<span class="sourceLineNo">1839</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1839"></a>
-<span class="sourceLineNo">1840</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1840"></a>
-<span class="sourceLineNo">1841</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1841"></a>
-<span class="sourceLineNo">1842</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1842"></a>
-<span class="sourceLineNo">1843</span>    BigDecimal bd1 = new BigDecimal(Double.MIN_VALUE);<a name="line.1843"></a>
-<span class="sourceLineNo">1844</span><a name="line.1844"></a>
-<span class="sourceLineNo">1845</span>    // Setting up region<a name="line.1845"></a>
-<span class="sourceLineNo">1846</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.1846"></a>
-<span class="sourceLineNo">1847</span>    // Putting data in key<a name="line.1847"></a>
-<span class="sourceLineNo">1848</span>    Put put = new Put(row1);<a name="line.1848"></a>
-<span class="sourceLineNo">1849</span>    put.addColumn(fam1, qf1, val1);<a name="line.1849"></a>
-<span class="sourceLineNo">1850</span>    region.put(put);<a name="line.1850"></a>
-<span class="sourceLineNo">1851</span><a name="line.1851"></a>
-<span class="sourceLineNo">1852</span>    // checkAndPut with correct value<a name="line.1852"></a>
-<span class="sourceLineNo">1853</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1853"></a>
-<span class="sourceLineNo">1854</span>        new BinaryComparator(val1), put);<a name="line.1854"></a>
-<span class="sourceLineNo">1855</span>    assertEquals(true, res);<a name="line.1855"></a>
-<span class="sourceLineNo">1856</span><a name="line.1856"></a>
-<span class="sourceLineNo">1857</span>    // checkAndDelete with correct value<a name="line.1857"></a>
-<span class="sourceLineNo">1858</span>    Delete delete = new Delete(row1);<a name="line.1858"></a>
-<span class="sourceLineNo">1859</span>    delete.addColumn(fam1, qf1);<a name="line.1859"></a>
-<span class="sourceLineNo">1860</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new BinaryComparator(val1),<a name="line.1860"></a>
-<span class="sourceLineNo">1861</span>        delete);<a name="line.1861"></a>
-<span class="sourceLineNo">1862</span>    assertEquals(true, res);<a name="line.1862"></a>
-<span class="sourceLineNo">1863</span><a name="line.1863"></a>
-<span class="sourceLineNo">1864</span>    // Putting data in key<a name="line.1864"></a>
-<span class="sourceLineNo">1865</span>    put = new Put(row1);<a name="line.1865"></a>
-<span class="sourceLineNo">1866</span>    put.addColumn(fam1, qf1, Bytes.toBytes(bd1));<a name="line.1866"></a>
-<span class="sourceLineNo">1867</span>    region.put(put);<a name="line.1867"></a>
-<span class="sourceLineNo">1868</span><a name="line.1868"></a>
-<span class="sourceLineNo">1869</span>    // checkAndPut with correct value<a name="line.1869"></a>
-<span class="sourceLineNo">1870</span>    res =<a name="line.1870"></a>
-<span class="sourceLineNo">1871</span>        region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new BigDecimalComparator(<a name="line.1871"></a>
-<span class="sourceLineNo">1872</span>            bd1), put);<a name="line.1872"></a>
-<span class="sourceLineNo">1873</span>    assertEquals(true, res);<a name="line.1873"></a>
-<span class="sourceLineNo">1874</span><a name="line.1874"></a>
-<span class="sourceLineNo">1875</span>    // checkAndDelete with correct value<a name="line.1875"></a>
-<span class="sourceLineNo">1876</span>    delete = new Delete(row1);<a name="line.1876"></a>
-<span class="sourceLineNo">1877</span>    delete.addColumn(fam1, qf1);<a name="line.1877"></a>
-<span class="sourceLineNo">1878</span>    res =<a name="line.1878"></a>
-<span class="sourceLineNo">1879</span>        region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new BigDecimalComparator(<a name="line.1879"></a>
-<span class="sourceLineNo">1880</span>            bd1), delete);<a name="line.1880"></a>
-<span class="sourceLineNo">1881</span>    assertEquals(true, res);<a name="line.1881"></a>
-<span class="sourceLineNo">1882</span>  }<a name="line.1882"></a>
-<span class="sourceLineNo">1883</span><a name="line.1883"></a>
-<span class="sourceLineNo">1884</span>  @Test<a name="line.1884"></a>
-<span class="sourceLineNo">1885</span>  public void testCheckAndMutate_WithNonEqualCompareOp() throws IOException {<a name="line.1885"></a>
-<span class="sourceLineNo">1886</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1886"></a>
-<span class="sourceLineNo">1887</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1887"></a>
-<span class="sourceLineNo">1888</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1888"></a>
-<span class="sourceLineNo">1889</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1889"></a>
-<span class="sourceLineNo">1890</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.1890"></a>
-<span class="sourceLineNo">1891</span>    byte[] val3 = Bytes.toBytes("value3");<a name="line.1891"></a>
-<span class="sourceLineNo">1892</span>    byte[] val4 = Bytes.toBytes("value4");<a name="line.1892"></a>
-<span class="sourceLineNo">1893</span><a name="line.1893"></a>
-<span class="sourceLineNo">1894</span>    // Setting up region<a name="line.1894"></a>
-<span class="sourceLineNo">1895</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.1895"></a>
-<span class="sourceLineNo">1896</span>    // Putting val3 in key<a name="line.1896"></a>
-<span class="sourceLineNo">1897</span>    Put put = new Put(row1);<a name="line.1897"></a>
-<span class="sourceLineNo">1898</span>    put.addColumn(fam1, qf1, val3);<a name="line.1898"></a>
-<span class="sourceLineNo">1899</span>    region.put(put);<a name="line.1899"></a>
-<span class="sourceLineNo">1900</span><a name="line.1900"></a>
-<span class="sourceLineNo">1901</span>    // Test CompareOp.LESS: original = val3, compare with val3, fail<a name="line.1901"></a>
-<span class="sourceLineNo">1902</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS,<a name="line.1902"></a>
-<span class="sourceLineNo">1903</span>        new BinaryComparator(val3), put);<a name="line.1903"></a>
-<span class="sourceLineNo">1904</span>    assertEquals(false, res);<a name="line.1904"></a>
-<span class="sourceLineNo">1905</span><a name="line.1905"></a>
-<span class="sourceLineNo">1906</span>    // Test CompareOp.LESS: original = val3, compare with val4, fail<a name="line.1906"></a>
-<span class="sourceLineNo">1907</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS,<a name="line.1907"></a>
-<span class="sourceLineNo">1908</span>        new BinaryComparator(val4), put);<a name="line.1908"></a>
-<span class="sourceLineNo">1909</span>    assertEquals(false, res);<a name="line.1909"></a>
-<span class="sourceLineNo">1910</span><a name="line.1910"></a>
-<span class="sourceLineNo">1911</span>    // Test CompareOp.LESS: original = val3, compare with val2,<a name="line.1911"></a>
-<span class="sourceLineNo">1912</span>    // succeed (now value = val2)<a name="line.1912"></a>
-<span class="sourceLineNo">1913</span>    put = new Put(row1);<a name="line.1913"></a>
-<span class="sourceLineNo">1914</span>    put.addColumn(fam1, qf1, val2);<a name="line.1914"></a>
-<span class="sourceLineNo">1915</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS,<a name="line.1915"></a>
-<span class="sourceLineNo">1916</span>        new BinaryComparator(val2), put);<a name="line.1916"></a>
-<span class="sourceLineNo">1917</span>    assertEquals(true, res);<a name="line.1917"></a>
-<span class="sourceLineNo">1918</span><a name="line.1918"></a>
-<span class="sourceLineNo">1919</span>    // Test CompareOp.LESS_OR_EQUAL: original = val2, compare with val3, fail<a name="line.1919"></a>
-<span class="sourceLineNo">1920</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS_OR_EQUAL,<a name="line.1920"></a>
-<span class="sourceLineNo">1921</span>        new BinaryComparator(val3), put);<a name="line.1921"></a>
-<span class="sourceLineNo">1922</span>    assertEquals(false, res);<a name="line.1922"></a>
-<span class="sourceLineNo">1923</span><a name="line.1923"></a>
-<span class="sourceLineNo">1924</span>    // Test CompareOp.LESS_OR_EQUAL: original = val2, compare with val2,<a name="line.1924"></a>
-<span class="sourceLineNo">1925</span>    // succeed (value still = val2)<a name="line.1925"></a>
-<span class="sourceLineNo">1926</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS_OR_EQUAL,<a name="line.1926"></a>
-<span class="sourceLineNo">1927</span>        new BinaryComparator(val2), put);<a name="line.1927"></a>
-<span class="sourceLineNo">1928</span>    assertEquals(true, res);<a name="line.1928"></a>
-<span class="sourceLineNo">1929</span><a name="line.1929"></a>
-<span class="sourceLineNo">1930</span>    // Test CompareOp.LESS_OR_EQUAL: original = val2, compare with val1,<a name="line.1930"></a>
-<span class="sourceLineNo">1931</span>    // succeed (now value = val3)<a name="line.1931"></a>
-<span class="sourceLineNo">1932</span>    put = new Put(row1);<a name="line.1932"></a>
-<span class="sourceLineNo">1933</span>    put.addColumn(fam1, qf1, val3);<a name="line.1933"></a>
-<span class="sourceLineNo">1934</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS_OR_EQUAL,<a name="line.1934"></a>
-<span class="sourceLineNo">1935</span>        new BinaryComparator(val1), put);<a name="line.1935"></a>
-<span class="sourceLineNo">1936</span>    assertEquals(true, res);<a name="line.1936"></a>
-<span class="sourceLineNo">1937</span><a name="line.1937"></a>
-<span class="sourceLineNo">1938</span>    // Test CompareOp.GREATER: original = val3, compare with val3, fail<a name="line.1938"></a>
-<span class="sourceLineNo">1939</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER,<a name="line.1939"></a>
-<span class="sourceLineNo">1940</span>        new BinaryComparator(val3), put);<a name="line.1940"></a>
-<span class="sourceLineNo">1941</span>    assertEquals(false, res);<a name="line.1941"></a>
-<span class="sourceLineNo">1942</span><a name="line.1942"></a>
-<span class="sourceLineNo">1943</span>    // Test CompareOp.GREATER: original = val3, compare with val2, fail<a name="line.1943"></a>
-<span class="sourceLineNo">1944</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER,<a name="line.1944"></a>
-<span class="sourceLineNo">1945</span>        new BinaryComparator(val2), put);<a name="line.1945"></a>
-<span class="sourceLineNo">1946</span>    assertEquals(false, res);<a name="line.1946"></a>
-<span class="sourceLineNo">1947</span><a name="line.1947"></a>
-<span class="sourceLineNo">1948</span>    // Test CompareOp.GREATER: original = val3, compare with val4,<a name="line.1948"></a>
-<span class="sourceLineNo">1949</span>    // succeed (now value = val2)<a name="line.1949"></a>
-<span class="sourceLineNo">1950</span>    put = new Put(row1);<a name="line.1950"></a>
-<span class="sourceLineNo">1951</span>    put.addColumn(fam1, qf1, val2);<a name="line.1951"></a>
-<span class="sourceLineNo">1952</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER,<a name="line.1952"></a>
-<span class="sourceLineNo">1953</span>        new BinaryComparator(val4), put);<a name="line.1953"></a>
-<span class="sourceLineNo">1954</span>    assertEquals(true, res);<a name="line.1954"></a>
-<span class="sourceLineNo">1955</span><a name="line.1955"></a>
-<span class="sourceLineNo">1956</span>    // Test CompareOp.GREATER_OR_EQUAL: original = val2, compare with val1, fail<a name="line.1956"></a>
-<span class="sourceLineNo">1957</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER_OR_EQUAL,<a name="line.1957"></a>
-<span class="sourceLineNo">1958</span>        new BinaryComparator(val1), put);<a name="line.1958"></a>
-<span class="sourceLineNo">1959</span>    assertEquals(false, res);<a name="line.1959"></a>
-<span class="sourceLineNo">1960</span><a name="line.1960"></a>
-<span class="sourceLineNo">1961</span>    // Test CompareOp.GREATER_OR_EQUAL: original = val2, compare with val2,<a name="line.1961"></a>
-<span class="sourceLineNo">1962</span>    // succeed (value still = val2)<a name="line.1962"></a>
-<span class="sourceLineNo">1963</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER_OR_EQUAL,<a name="line.1963"></a>
-<span class="sourceLineNo">1964</span>        new BinaryComparator(val2), put);<a name="line.1964"></a>
-<span class="sourceLineNo">1965</span>    assertEquals(true, res);<a name="line.1965"></a>
-<span class="sourceLineNo">1966</span><a name="line.1966"></a>
-<span class="sourceLineNo">1967</span>    // Test CompareOp.GREATER_OR_EQUAL: original = val2, compare with val3, succeed<a name="line.1967"></a>
-<span class="sourceLineNo">1968</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER_OR_EQUAL,<a name="line.1968"></a>
-<span class="sourceLineNo">1969</span>        new BinaryComparator(val3), put);<a name="line.1969"></a>
-<span class="sourceLineNo">1970</span>    assertEquals(true, res);<a name="line.1970"></a>
-<span class="sourceLineNo">1971</span>  }<a name="line.1971"></a>
-<span class="sourceLineNo">1972</span><a name="line.1972"></a>
-<span class="sourceLineNo">1973</span>  @Test<a name="line.1973"></a>
-<span class="sourceLineNo">1974</span>  public void testCheckAndPut_ThatPutWasWritten() throws IOException {<a name="line.1974"></a>
-<span class="sourceLineNo">1975</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1975"></a>
-<span class="sourceLineNo">1976</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1976"></a>
-<span class="sourceLineNo">1977</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.1977"></a>
-<span class="sourceLineNo">1978</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1978"></a>
-<span class="sourceLineNo">1979</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1979"></a>
-<span class="sourceLineNo">1980</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.1980"></a>
-<span class="sourceLineNo">1981</span><a name="line.1981"></a>
-<span class="sourceLineNo">1982</span>    byte[][] families = { fam1, fam2 };<a name="line.1982"></a>
-<span class="sourceLineNo">1983</span><a name="line.1983"></a>
-<span class="sourceLineNo">1984</span>    // Setting up region<a name="line.1984"></a>
-<span class="sourceLineNo">1985</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.1985"></a>
-<span class="sourceLineNo">1986</span>    // Putting data in the key to check<a name="line.1986"></a>
-<span class="sourceLineNo">1987</span>    Put put = new Put(row1);<a name="line.1987"></a>
-<span class="sourceLineNo">1988</span>    put.addColumn(fam1, qf1, val1);<a name="line.1988"></a>
-<span class="sourceLineNo">1989</span>    region.put(put);<a name="line.1989"></a>
-<span class="sourceLineNo">1990</span><a name="line.1990"></a>
-<span class="sourceLineNo">1991</span>    // Creating put to add<a name="line.1991"></a>
-<span class="sourceLineNo">1992</span>    long ts = System.currentTimeMillis();<a name="line.1992"></a>
-<span class="sourceLineNo">1993</span>    KeyValue kv = new KeyValue(row1, fam2, qf1, ts, KeyValue.Type.Put, val2);<a name="line.1993"></a>
-<span class="sourceLineNo">1994</span>    put = new Put(row1);<a name="line.1994"></a>
-<span class="sourceLineNo">1995</span>    put.add(kv);<a name="line.1995"></a>
-<span class="sourceLineNo">1996</span><a name="line.1996"></a>
-<span class="sourceLineNo">1997</span>    // checkAndPut with wrong value<a name="line.1997"></a>
-<span class="sourceLineNo">1998</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1998"></a>
-<span class="sourceLineNo">1999</span>        new BinaryComparator(val1), put);<a name="line.1999"></a>
-<span class="sourceLineNo">2000</span>    assertEquals(true, res);<a name="line.2000"></a>
-<span class="sourceLineNo">2001</span><a name="line.2001"></a>
-<span class="sourceLineNo">2002</span>    Get get = new Get(row1);<a name="line.2002"></a>
-<span class="sourceLineNo">2003</span>    get.addColumn(fam2, qf1);<a name="line.2003"></a>
-<span class="sourceLineNo">2004</span>    Cell[] actual = region.get(get).rawCells();<a name="line.2004"></a>
-<span class="sourceLineNo">2005</span><a name="line.2005"></a>
-<span class="sourceLineNo">2006</span>    Cell[] expected = { kv };<a name="line.2006"></a>
-<span class="sourceLineNo">2007</span><a name="line.2007"></a>
-<span class="sourceLineNo">2008</span>    assertEquals(expected.length, actual.length);<a name="line.2008"></a>
-<span class="sourceLineNo">2009</span>    for (int i = 0; i &lt; actual.length; i++) {<a name="line.2009"></a>
-<span class="sourceLineNo">2010</span>      assertEquals(expected[i], actual[i]);<a name="line.2010"></a>
-<span class="sourceLineNo">2011</span>    }<a name="line.2011"></a>
-<span class="sourceLineNo">2012</span>  }<a name="line.2012"></a>
-<span class="sourceLineNo">2013</span><a name="line.2013"></a>
-<span class="sourceLineNo">2014</span>  @Test<a name="line.2014"></a>
-<span class="sourceLineNo">2015</span>  public void testCheckAndPut_wrongRowInPut() throws IOException {<a name="line.2015"></a>
-<span class="sourceLineNo">2016</span>    this.region = initHRegion(tableName, method, CONF, COLUMNS);<a name="line.2016"></a>
-<span class="sourceLineNo">2017</span>    Put put = new Put(row2);<a name="line.2017"></a>
-<span class="sourceLineNo">2018</span>    put.addColumn(fam1, qual1, value1);<a name="line.2018"></a>
-<span class="sourceLineNo">2019</span>    try {<a name="line.2019"></a>
-<span class="sourceLineNo">2020</span>      region.checkAndMutate(row, fam1, qual1, CompareOperator.EQUAL,<a name="line.2020"></a>
-<span class="sourceLineNo">2021</span>          new BinaryComparator(value2), put);<a name="line.2021"></a>
-<span class="sourceLineNo">2022</span>      fail();<a name="line.2022"></a>
-<span class="sourceLineNo">2023</span>    } catch (org.apache.hadoop.hbase.DoNotRetryIOException expected) {<a name="line.2023"></a>
-<span class="sourceLineNo">2024</span>      // expected exception.<a name="line.2024"></a>
-<span class="sourceLineNo">2025</span>    }<a name="line.2025"></a>
-<span class="sourceLineNo">2026</span>  }<a name="line.2026"></a>
-<span class="sourceLineNo">2027</span><a name="line.2027"></a>
-<span class="sourceLineNo">2028</span>  @Test<a name="line.2028"></a>
-<span class="sourceLineNo">2029</span>  public void testCheckAndDelete_ThatDeleteWasWritten() throws IOException {<a name="line.2029"></a>
-<span class="sourceLineNo">2030</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2030"></a>
-<span class="sourceLineNo">2031</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2031"></a>
-<span class="sourceLineNo">2032</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2032"></a>
-<span class="sourceLineNo">2033</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.2033"></a>
-<span class="sourceLineNo">2034</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.2034"></a>
-<span class="sourceLineNo">2035</span>    byte[] qf3 = Bytes.toBytes("qualifier3");<a name="line.2035"></a>
-<span class="sourceLineNo">2036</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.2036"></a>
-<span class="sourceLineNo">2037</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.2037"></a>
-<span class="sourceLineNo">2038</span>    byte[] val3 = Bytes.toBytes("value3");<a name="line.2038"></a>
-<span class="sourceLineNo">2039</span>    byte[] emptyVal = new byte[] {};<a name="line.2039"></a>
-<span class="sourceLineNo">2040</span><a name="line.2040"></a>
-<span class="sourceLineNo">2041</span>    byte[][] families = { fam1, fam2 };<a name="line.2041"></a>
-<span class="sourceLineNo">2042</span><a name="line.2042"></a>
-<span class="sourceLineNo">2043</span>    // Setting up region<a name="line.2043"></a>
-<span class="sourceLineNo">2044</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2044"></a>
-<span class="sourceLineNo">2045</span>    // Put content<a name="line.2045"></a>
-<span class="sourceLineNo">2046</span>    Put put = new Put(row1);<a name="line.2046"></a>
-<span class="sourceLineNo">2047</span>    put.addColumn(fam1, qf1, val1);<a name="line.2047"></a>
-<span class="sourceLineNo">2048</span>    region.put(put);<a name="line.2048"></a>
-<span class="sourceLineNo">2049</span>    Threads.sleep(2);<a name="line.2049"></a>
-<span class="sourceLineNo">2050</span><a name="line.2050"></a>
-<span class="sourceLineNo">2051</span>    put = new Put(row1);<a name="line.2051"></a>
-<span class="sourceLineNo">2052</span>    put.addColumn(fam1, qf1, val2);<a name="line.2052"></a>
-<span class="sourceLineNo">2053</span>    put.addColumn(fam2, qf1, val3);<a name="line.2053"></a>
-<span class="sourceLineNo">2054</span>    put.addColumn(fam2, qf2, val2);<a name="line.2054"></a>
-<span class="sourceLineNo">2055</span>    put.addColumn(fam2, qf3, val1);<a name="line.2055"></a>
-<span class="sourceLineNo">2056</span>    put.addColumn(fam1, qf3, val1);<a name="line.2056"></a>
-<span class="sourceLineNo">2057</span>    region.put(put);<a name="line.2057"></a>
-<span class="sourceLineNo">2058</span><a name="line.2058"></a>
-<span class="sourceLineNo">2059</span>    // Multi-column delete<a name="line.2059"></a>
-<span class="sourceLineNo">2060</span>    Delete delete = new Delete(row1);<a name="line.2060"></a>
-<span class="sourceLineNo">2061</span>    delete.addColumn(fam1, qf1);<a name="line.2061"></a>
-<span class="sourceLineNo">2062</span>    delete.addColumn(fam2, qf1);<a name="line.2062"></a>
-<span class="sourceLineNo">2063</span>    delete.addColumn(fam1, qf3);<a name="line.2063"></a>
-<span class="sourceLineNo">2064</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.2064"></a>
-<span class="sourceLineNo">2065</span>        new BinaryComparator(val2), delete);<a name="line.2065"></a>
-<span class="sourceLineNo">2066</span>    assertEquals(true, res);<a name="line.2066"></a>
-<span class="sourceLineNo">2067</span><a name="line.2067"></a>
-<span class="sourceLineNo">2068</span>    Get get = new Get(row1);<a name="line.2068"></a>
-<span class="sourceLineNo">2069</span>    get.addColumn(fam1, qf1);<a name="line.2069"></a>
-<span class="sourceLineNo">2070</span>    get.addColumn(fam1, qf3);<a name="line.2070"></a>
-<span class="sourceLineNo">2071</span>    get.addColumn(fam2, qf2);<a name="line.2071"></a>
-<span class="sourceLineNo">2072</span>    Result r = region.get(get);<a name="line.2072"></a>
-<span class="sourceLineNo">2073</span>    assertEquals(2, r.size());<a name="line.2073"></a>
-<span class="sourceLineNo">2074</span>    assertArrayEquals(val1, r.getValue(fam1, qf1));<a name="line.2074"></a>
-<span class="sourceLineNo">2075</span>    assertArrayEquals(val2, r.getValue(fam2, qf2));<a name="line.2075"></a>
-<span class="sourceLineNo">2076</span><a name="line.2076"></a>
-<span class="sourceLineNo">2077</span>    // Family delete<a name="line.2077"></a>
-<span class="sourceLineNo">2078</span>    delete = new Delete(row1);<a name="line.2078"></a>
-<span class="sourceLineNo">2079</span>    delete.addFamily(fam2);<a name="line.2079"></a>
-<span class="sourceLineNo">2080</span>    res = region.checkAndMutate(row1, fam2, qf1, CompareOperator.EQUAL,<a name="line.2080"></a>
-<span class="sourceLineNo">2081</span>        new BinaryComparator(emptyVal), delete);<a name="line.2081"></a>
-<span class="sourceLineNo">2082</span>    assertEquals(true, res);<a name="line.2082"></a>
-<span class="sourceLineNo">2083</span><a name="line.2083"></a>
-<span class="sourceLineNo">2084</span>    get = new Get(row1);<a name="line.2084"></a>
-<span class="sourceLineNo">2085</span>    r = region.get(get);<a name="line.2085"></a>
-<span class="sourceLineNo">2086</span>    assertEquals(1, r.size());<a name="line.2086"></a>
-<span class="sourceLineNo">2087</span>    assertArrayEquals(val1, r.getValue(fam1, qf1));<a name="line.2087"></a>
-<span class="sourceLineNo">2088</span><a name="line.2088"></a>
-<span class="sourceLineNo">2089</span>    // Row delete<a name="line.2089"></a>
-<span class="sourceLineNo">2090</span>    delete = new Delete(row1);<a name="line.2090"></a>
-<span class="sourceLineNo">2091</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new BinaryComparator(val1),<a name="line.2091"></a>
-<span class="sourceLineNo">2092</span>        delete);<a name="line.2092"></a>
-<span class="sourceLineNo">2093</span>    assertEquals(true, res);<a name="line.2093"></a>
-<span class="sourceLineNo">2094</span>    get = new Get(row1);<a name="line.2094"></a>
-<span class="sourceLineNo">2095</span>    r = region.get(get);<a name="line.2095"></a>
-<span class="sourceLineNo">2096</span>    assertEquals(0, r.size());<a name="line.2096"></a>
-<span class="sourceLineNo">2097</span>  }<a name="line.2097"></a>
-<span class="sourceLineNo">2098</span><a name="line.2098"></a>
-<span class="sourceLineNo">2099</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2099"></a>
-<span class="sourceLineNo">2100</span>  // Delete tests<a name="line.2100"></a>
-<span class="sourceLineNo">2101</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2101"></a>
-<span class="sourceLineNo">2102</span>  @Test<a name="line.2102"></a>
-<span class="sourceLineNo">2103</span>  public void testDelete_multiDeleteColumn() throws IOException {<a name="line.2103"></a>
-<span class="sourceLineNo">2104</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2104"></a>
-<span class="sourceLineNo">2105</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2105"></a>
-<span class="sourceLineNo">2106</span>    byte[] qual = Bytes.toBytes("qualifier");<a name="line.2106"></a>
-<span class="sourceLineNo">2107</span>    byte[] value = Bytes.toBytes("value");<a name="line.2107"></a>
-<span class="sourceLineNo">2108</span><a name="line.2108"></a>
-<span class="sourceLineNo">2109</span>    Put put = new Put(row1);<a name="line.2109"></a>
-<span class="sourceLineNo">2110</span>    put.addColumn(fam1, qual, 1, value);<a name="line.2110"></a>
-<span class="sourceLineNo">2111</span>    put.addColumn(fam1, qual, 2, value);<a name="line.2111"></a>
-<span class="sourceLineNo">2112</span><a name="line.2112"></a>
-<span class="sourceLineNo">2113</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2113"></a>
-<span class="sourceLineNo">2114</span>    region.put(put);<a name="line.2114"></a>
-<span class="sourceLineNo">2115</span><a name="line.2115"></a>
-<span class="sourceLineNo">2116</span>    // We do support deleting more than 1 'latest' version<a name="line.2116"></a>
-<span class="sourceLineNo">2117</span>    Delete delete = new Delete(row1);<a name="line.2117"></a>
-<span class="sourceLineNo">2118</span>    delete.addColumn(fam1, qual);<a name="line.2118"></a>
+<span class="sourceLineNo">1770</span>    delete.addColumn(fam1, qf1);<a name="line.1770"></a>
+<span class="sourceLineNo">1771</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1771"></a>
+<span class="sourceLineNo">1772</span>        new BinaryComparator(val2), delete);<a name="line.1772"></a>
+<span class="sourceLineNo">1773</span>    assertTrue(res);<a name="line.1773"></a>
+<span class="sourceLineNo">1774</span><a name="line.1774"></a>
+<span class="sourceLineNo">1775</span>    delete = new Delete(row1);<a name="line.1775"></a>
+<span class="sourceLineNo">1776</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1776"></a>
+<span class="sourceLineNo">1777</span>        new BinaryComparator(emptyVal), delete);<a name="line.1777"></a>
+<span class="sourceLineNo">1778</span>    assertTrue(res);<a name="line.1778"></a>
+<span class="sourceLineNo">1779</span><a name="line.1779"></a>
+<span class="sourceLineNo">1780</span>    // checkAndPut looking for a null value<a name="line.1780"></a>
+<span class="sourceLineNo">1781</span>    put = new Put(row1);<a name="line.1781"></a>
+<span class="sourceLineNo">1782</span>    put.addColumn(fam1, qf1, val1);<a name="line.1782"></a>
+<span class="sourceLineNo">1783</span><a name="line.1783"></a>
+<span class="sourceLineNo">1784</span>    res = region<a name="line.1784"></a>
+<span class="sourceLineNo">1785</span>        .checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new NullComparator(), put);<a name="line.1785"></a>
+<span class="sourceLineNo">1786</span>    assertTrue(res);<a name="line.1786"></a>
+<span class="sourceLineNo">1787</span>  }<a name="line.1787"></a>
+<span class="sourceLineNo">1788</span><a name="line.1788"></a>
+<span class="sourceLineNo">1789</span>  @Test<a name="line.1789"></a>
+<span class="sourceLineNo">1790</span>  public void testCheckAndMutate_WithWrongValue() throws IOException {<a name="line.1790"></a>
+<span class="sourceLineNo">1791</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1791"></a>
+<span class="sourceLineNo">1792</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1792"></a>
+<span class="sourceLineNo">1793</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1793"></a>
+<span class="sourceLineNo">1794</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1794"></a>
+<span class="sourceLineNo">1795</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.1795"></a>
+<span class="sourceLineNo">1796</span>    BigDecimal bd1 = new BigDecimal(Double.MAX_VALUE);<a name="line.1796"></a>
+<span class="sourceLineNo">1797</span>    BigDecimal bd2 = new BigDecimal(Double.MIN_VALUE);<a name="line.1797"></a>
+<span class="sourceLineNo">1798</span><a name="line.1798"></a>
+<span class="sourceLineNo">1799</span>    // Setting up region<a name="line.1799"></a>
+<span class="sourceLineNo">1800</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.1800"></a>
+<span class="sourceLineNo">1801</span>    // Putting data in key<a name="line.1801"></a>
+<span class="sourceLineNo">1802</span>    Put put = new Put(row1);<a name="line.1802"></a>
+<span class="sourceLineNo">1803</span>    put.addColumn(fam1, qf1, val1);<a name="line.1803"></a>
+<span class="sourceLineNo">1804</span>    region.put(put);<a name="line.1804"></a>
+<span class="sourceLineNo">1805</span><a name="line.1805"></a>
+<span class="sourceLineNo">1806</span>    // checkAndPut with wrong value<a name="line.1806"></a>
+<span class="sourceLineNo">1807</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1807"></a>
+<span class="sourceLineNo">1808</span>        new BinaryComparator(val2), put);<a name="line.1808"></a>
+<span class="sourceLineNo">1809</span>    assertEquals(false, res);<a name="line.1809"></a>
+<span class="sourceLineNo">1810</span><a name="line.1810"></a>
+<span class="sourceLineNo">1811</span>    // checkAndDelete with wrong value<a name="line.1811"></a>
+<span class="sourceLineNo">1812</span>    Delete delete = new Delete(row1);<a name="line.1812"></a>
+<span class="sourceLineNo">1813</span>    delete.addFamily(fam1);<a name="line.1813"></a>
+<span class="sourceLineNo">1814</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1814"></a>
+<span class="sourceLineNo">1815</span>        new BinaryComparator(val2), put);<a name="line.1815"></a>
+<span class="sourceLineNo">1816</span>    assertEquals(false, res);<a name="line.1816"></a>
+<span class="sourceLineNo">1817</span><a name="line.1817"></a>
+<span class="sourceLineNo">1818</span>    // Putting data in key<a name="line.1818"></a>
+<span class="sourceLineNo">1819</span>    put = new Put(row1);<a name="line.1819"></a>
+<span class="sourceLineNo">1820</span>    put.addColumn(fam1, qf1, Bytes.toBytes(bd1));<a name="line.1820"></a>
+<span class="sourceLineNo">1821</span>    region.put(put);<a name="line.1821"></a>
+<span class="sourceLineNo">1822</span><a name="line.1822"></a>
+<span class="sourceLineNo">1823</span>    // checkAndPut with wrong value<a name="line.1823"></a>
+<span class="sourceLineNo">1824</span>    res =<a name="line.1824"></a>
+<span class="sourceLineNo">1825</span>        region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1825"></a>
+<span class="sourceLineNo">1826</span>            new BigDecimalComparator(bd2), put);<a name="line.1826"></a>
+<span class="sourceLineNo">1827</span>    assertEquals(false, res);<a name="line.1827"></a>
+<span class="sourceLineNo">1828</span><a name="line.1828"></a>
+<span class="sourceLineNo">1829</span>    // checkAndDelete with wrong value<a name="line.1829"></a>
+<span class="sourceLineNo">1830</span>    delete = new Delete(row1);<a name="line.1830"></a>
+<span class="sourceLineNo">1831</span>    delete.addFamily(fam1);<a name="line.1831"></a>
+<span class="sourceLineNo">1832</span>    res =<a name="line.1832"></a>
+<span class="sourceLineNo">1833</span>        region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1833"></a>
+<span class="sourceLineNo">1834</span>            new BigDecimalComparator(bd2), put);<a name="line.1834"></a>
+<span class="sourceLineNo">1835</span>    assertEquals(false, res);<a name="line.1835"></a>
+<span class="sourceLineNo">1836</span>  }<a name="line.1836"></a>
+<span class="sourceLineNo">1837</span><a name="line.1837"></a>
+<span class="sourceLineNo">1838</span>  @Test<a name="line.1838"></a>
+<span class="sourceLineNo">1839</span>  public void testCheckAndMutate_WithCorrectValue() throws IOException {<a name="line.1839"></a>
+<span class="sourceLineNo">1840</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1840"></a>
+<span class="sourceLineNo">1841</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1841"></a>
+<span class="sourceLineNo">1842</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1842"></a>
+<span class="sourceLineNo">1843</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1843"></a>
+<span class="sourceLineNo">1844</span>    BigDecimal bd1 = new BigDecimal(Double.MIN_VALUE);<a name="line.1844"></a>
+<span class="sourceLineNo">1845</span><a name="line.1845"></a>
+<span class="sourceLineNo">1846</span>    // Setting up region<a name="line.1846"></a>
+<span class="sourceLineNo">1847</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.1847"></a>
+<span class="sourceLineNo">1848</span>    // Putting data in key<a name="line.1848"></a>
+<span class="sourceLineNo">1849</span>    Put put = new Put(row1);<a name="line.1849"></a>
+<span class="sourceLineNo">1850</span>    put.addColumn(fam1, qf1, val1);<a name="line.1850"></a>
+<span class="sourceLineNo">1851</span>    region.put(put);<a name="line.1851"></a>
+<span class="sourceLineNo">1852</span><a name="line.1852"></a>
+<span class="sourceLineNo">1853</span>    // checkAndPut with correct value<a name="line.1853"></a>
+<span class="sourceLineNo">1854</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1854"></a>
+<span class="sourceLineNo">1855</span>        new BinaryComparator(val1), put);<a name="line.1855"></a>
+<span class="sourceLineNo">1856</span>    assertEquals(true, res);<a name="line.1856"></a>
+<span class="sourceLineNo">1857</span><a name="line.1857"></a>
+<span class="sourceLineNo">1858</span>    // checkAndDelete with correct value<a name="line.1858"></a>
+<span class="sourceLineNo">1859</span>    Delete delete = new Delete(row1);<a name="line.1859"></a>
+<span class="sourceLineNo">1860</span>    delete.addColumn(fam1, qf1);<a name="line.1860"></a>
+<span class="sourceLineNo">1861</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new BinaryComparator(val1),<a name="line.1861"></a>
+<span class="sourceLineNo">1862</span>        delete);<a name="line.1862"></a>
+<span class="sourceLineNo">1863</span>    assertEquals(true, res);<a name="line.1863"></a>
+<span class="sourceLineNo">1864</span><a name="line.1864"></a>
+<span class="sourceLineNo">1865</span>    // Putting data in key<a name="line.1865"></a>
+<span class="sourceLineNo">1866</span>    put = new Put(row1);<a name="line.1866"></a>
+<span class="sourceLineNo">1867</span>    put.addColumn(fam1, qf1, Bytes.toBytes(bd1));<a name="line.1867"></a>
+<span class="sourceLineNo">1868</span>    region.put(put);<a name="line.1868"></a>
+<span class="sourceLineNo">1869</span><a name="line.1869"></a>
+<span class="sourceLineNo">1870</span>    // checkAndPut with correct value<a name="line.1870"></a>
+<span class="sourceLineNo">1871</span>    res =<a name="line.1871"></a>
+<span class="sourceLineNo">1872</span>        region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new BigDecimalComparator(<a name="line.1872"></a>
+<span class="sourceLineNo">1873</span>            bd1), put);<a name="line.1873"></a>
+<span class="sourceLineNo">1874</span>    assertEquals(true, res);<a name="line.1874"></a>
+<span class="sourceLineNo">1875</span><a name="line.1875"></a>
+<span class="sourceLineNo">1876</span>    // checkAndDelete with correct value<a name="line.1876"></a>
+<span class="sourceLineNo">1877</span>    delete = new Delete(row1);<a name="line.1877"></a>
+<span class="sourceLineNo">1878</span>    delete.addColumn(fam1, qf1);<a name="line.1878"></a>
+<span class="sourceLineNo">1879</span>    res =<a name="line.1879"></a>
+<span class="sourceLineNo">1880</span>        region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new BigDecimalComparator(<a name="line.1880"></a>
+<span class="sourceLineNo">1881</span>            bd1), delete);<a name="line.1881"></a>
+<span class="sourceLineNo">1882</span>    assertEquals(true, res);<a name="line.1882"></a>
+<span class="sourceLineNo">1883</span>  }<a name="line.1883"></a>
+<span class="sourceLineNo">1884</span><a name="line.1884"></a>
+<span class="sourceLineNo">1885</span>  @Test<a name="line.1885"></a>
+<span class="sourceLineNo">1886</span>  public void testCheckAndMutate_WithNonEqualCompareOp() throws IOException {<a name="line.1886"></a>
+<span class="sourceLineNo">1887</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1887"></a>
+<span class="sourceLineNo">1888</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1888"></a>
+<span class="sourceLineNo">1889</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1889"></a>
+<span class="sourceLineNo">1890</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1890"></a>
+<span class="sourceLineNo">1891</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.1891"></a>
+<span class="sourceLineNo">1892</span>    byte[] val3 = Bytes.toBytes("value3");<a name="line.1892"></a>
+<span class="sourceLineNo">1893</span>    byte[] val4 = Bytes.toBytes("value4");<a name="line.1893"></a>
+<span class="sourceLineNo">1894</span><a name="line.1894"></a>
+<span class="sourceLineNo">1895</span>    // Setting up region<a name="line.1895"></a>
+<span class="sourceLineNo">1896</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.1896"></a>
+<span class="sourceLineNo">1897</span>    // Putting val3 in key<a name="line.1897"></a>
+<span class="sourceLineNo">1898</span>    Put put = new Put(row1);<a name="line.1898"></a>
+<span class="sourceLineNo">1899</span>    put.addColumn(fam1, qf1, val3);<a name="line.1899"></a>
+<span class="sourceLineNo">1900</span>    region.put(put);<a name="line.1900"></a>
+<span class="sourceLineNo">1901</span><a name="line.1901"></a>
+<span class="sourceLineNo">1902</span>    // Test CompareOp.LESS: original = val3, compare with val3, fail<a name="line.1902"></a>
+<span class="sourceLineNo">1903</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS,<a name="line.1903"></a>
+<span class="sourceLineNo">1904</span>        new BinaryComparator(val3), put);<a name="line.1904"></a>
+<span class="sourceLineNo">1905</span>    assertEquals(false, res);<a name="line.1905"></a>
+<span class="sourceLineNo">1906</span><a name="line.1906"></a>
+<span class="sourceLineNo">1907</span>    // Test CompareOp.LESS: original = val3, compare with val4, fail<a name="line.1907"></a>
+<span class="sourceLineNo">1908</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS,<a name="line.1908"></a>
+<span class="sourceLineNo">1909</span>        new BinaryComparator(val4), put);<a name="line.1909"></a>
+<span class="sourceLineNo">1910</span>    assertEquals(false, res);<a name="line.1910"></a>
+<span class="sourceLineNo">1911</span><a name="line.1911"></a>
+<span class="sourceLineNo">1912</span>    // Test CompareOp.LESS: original = val3, compare with val2,<a name="line.1912"></a>
+<span class="sourceLineNo">1913</span>    // succeed (now value = val2)<a name="line.1913"></a>
+<span class="sourceLineNo">1914</span>    put = new Put(row1);<a name="line.1914"></a>
+<span class="sourceLineNo">1915</span>    put.addColumn(fam1, qf1, val2);<a name="line.1915"></a>
+<span class="sourceLineNo">1916</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS,<a name="line.1916"></a>
+<span class="sourceLineNo">1917</span>        new BinaryComparator(val2), put);<a name="line.1917"></a>
+<span class="sourceLineNo">1918</span>    assertEquals(true, res);<a name="line.1918"></a>
+<span class="sourceLineNo">1919</span><a name="line.1919"></a>
+<span class="sourceLineNo">1920</span>    // Test CompareOp.LESS_OR_EQUAL: original = val2, compare with val3, fail<a name="line.1920"></a>
+<span class="sourceLineNo">1921</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS_OR_EQUAL,<a name="line.1921"></a>
+<span class="sourceLineNo">1922</span>        new BinaryComparator(val3), put);<a name="line.1922"></a>
+<span class="sourceLineNo">1923</span>    assertEquals(false, res);<a name="line.1923"></a>
+<span class="sourceLineNo">1924</span><a name="line.1924"></a>
+<span class="sourceLineNo">1925</span>    // Test CompareOp.LESS_OR_EQUAL: original = val2, compare with val2,<a name="line.1925"></a>
+<span class="sourceLineNo">1926</span>    // succeed (value still = val2)<a name="line.1926"></a>
+<span class="sourceLineNo">1927</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS_OR_EQUAL,<a name="line.1927"></a>
+<span class="sourceLineNo">1928</span>        new BinaryComparator(val2), put);<a name="line.1928"></a>
+<span class="sourceLineNo">1929</span>    assertEquals(true, res);<a name="line.1929"></a>
+<span class="sourceLineNo">1930</span><a name="line.1930"></a>
+<span class="sourceLineNo">1931</span>    // Test CompareOp.LESS_OR_EQUAL: original = val2, compare with val1,<a name="line.1931"></a>
+<span class="sourceLineNo">1932</span>    // succeed (now value = val3)<a name="line.1932"></a>
+<span class="sourceLineNo">1933</span>    put = new Put(row1);<a name="line.1933"></a>
+<span class="sourceLineNo">1934</span>    put.addColumn(fam1, qf1, val3);<a name="line.1934"></a>
+<span class="sourceLineNo">1935</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS_OR_EQUAL,<a name="line.1935"></a>
+<span class="sourceLineNo">1936</span>        new BinaryComparator(val1), put);<a name="line.1936"></a>
+<span class="sourceLineNo">1937</span>    assertEquals(true, res);<a name="line.1937"></a>
+<span class="sourceLineNo">1938</span><a name="line.1938"></a>
+<span class="sourceLineNo">1939</span>    // Test CompareOp.GREATER: original = val3, compare with val3, fail<a name="line.1939"></a>
+<span class="sourceLineNo">1940</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER,<a name="line.1940"></a>
+<span class="sourceLineNo">1941</span>        new BinaryComparator(val3), put);<a name="line.1941"></a>
+<span class="sourceLineNo">1942</span>    assertEquals(false, res);<a name="line.1942"></a>
+<span class="sourceLineNo">1943</span><a name="line.1943"></a>
+<span class="sourceLineNo">1944</span>    // Test CompareOp.GREATER: original = val3, compare with val2, fail<a name="line.1944"></a>
+<span class="sourceLineNo">1945</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER,<a name="line.1945"></a>
+<span class="sourceLineNo">1946</span>        new BinaryComparator(val2), put);<a name="line.1946"></a>
+<span class="sourceLineNo">1947</span>    assertEquals(false, res);<a name="line.1947"></a>
+<span class="sourceLineNo">1948</span><a name="line.1948"></a>
+<span class="sourceLineNo">1949</span>    // Test CompareOp.GREATER: original = val3, compare with val4,<a name="line.1949"></a>
+<span class="sourceLineNo">1950</span>    // succeed (now value = val2)<a name="line.1950"></a>
+<span class="sourceLineNo">1951</span>    put = new Put(row1);<a name="line.1951"></a>
+<span class="sourceLineNo">1952</span>    put.addColumn(fam1, qf1, val2);<a name="line.1952"></a>
+<span class="sourceLineNo">1953</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER,<a name="line.1953"></a>
+<span class="sourceLineNo">1954</span>        new BinaryComparator(val4), put);<a name="line.1954"></a>
+<span class="sourceLineNo">1955</span>    assertEquals(true, res);<a name="line.1955"></a>
+<span class="sourceLineNo">1956</span><a name="line.1956"></a>
+<span class="sourceLineNo">1957</span>    // Test CompareOp.GREATER_OR_EQUAL: original = val2, compare with val1, fail<a name="line.1957"></a>
+<span class="sourceLineNo">1958</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER_OR_EQUAL,<a name="line.1958"></a>
+<span class="sourceLineNo">1959</span>        new BinaryComparator(val1), put);<a name="line.1959"></a>
+<span class="sourceLineNo">1960</span>    assertEquals(false, res);<a name="line.1960"></a>
+<span class="sourceLineNo">1961</span><a name="line.1961"></a>
+<span class="sourceLineNo">1962</span>    // Test CompareOp.GREATER_OR_EQUAL: original = val2, compare with val2,<a name="line.1962"></a>
+<span class="sourceLineNo">1963</span>    // succeed (value still = val2)<a name="line.1963"></a>
+<span class="sourceLineNo">1964</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER_OR_EQUAL,<a name="line.1964"></a>
+<span class="sourceLineNo">1965</span>        new BinaryComparator(val2), put);<a name="line.1965"></a>
+<span class="sourceLineNo">1966</span>    assertEquals(true, res);<a name="line.1966"></a>
+<span class="sourceLineNo">1967</span><a name="line.1967"></a>
+<span class="sourceLineNo">1968</span>    // Test CompareOp.GREATER_OR_EQUAL: original = val2, compare with val3, succeed<a name="line.1968"></a>
+<span class="sourceLineNo">1969</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER_OR_EQUAL,<a name="line.1969"></a>
+<span class="sourceLineNo">1970</span>        new BinaryComparator(val3), put);<a name="line.1970"></a>
+<span class="sourceLineNo">1971</span>    assertEquals(true, res);<a name="line.1971"></a>
+<span class="sourceLineNo">1972</span>  }<a name="line.1972"></a>
+<span class="sourceLineNo">1973</span><a name="line.1973"></a>
+<span class="sourceLineNo">1974</span>  @Test<a name="line.1974"></a>
+<span class="sourceLineNo">1975</span>  public void testCheckAndPut_ThatPutWasWritten() throws IOException {<a name="line.1975"></a>
+<span class="sourceLineNo">1976</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1976"></a>
+<span class="sourceLineNo">1977</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1977"></a>
+<span class="sourceLineNo">1978</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.1978"></a>
+<span class="sourceLineNo">1979</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1979"></a>
+<span class="sourceLineNo">1980</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1980"></a>
+<span class="sourceLineNo">1981</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.1981"></a>
+<span class="sourceLineNo">1982</span><a name="line.1982"></a>
+<span class="sourceLineNo">1983</span>    byte[][] families = { fam1, fam2 };<a name="line.1983"></a>
+<span class="sourceLineNo">1984</span><a name="line.1984"></a>
+<span class="sourceLineNo">1985</span>    // Setting up region<a name="line.1985"></a>
+<span class="sourceLineNo">1986</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.1986"></a>
+<span class="sourceLineNo">1987</span>    // Putting data in the key to check<a name="line.1987"></a>
+<span class="sourceLineNo">1988</span>    Put put = new Put(row1);<a name="line.1988"></a>
+<span class="sourceLineNo">1989</span>    put.addColumn(fam1, qf1, val1);<a name="line.1989"></a>
+<span class="sourceLineNo">1990</span>    region.put(put);<a name="line.1990"></a>
+<span class="sourceLineNo">1991</span><a name="line.1991"></a>
+<span class="sourceLineNo">1992</span>    // Creating put to add<a name="line.1992"></a>
+<span class="sourceLineNo">1993</span>    long ts = System.currentTimeMillis();<a name="line.1993"></a>
+<span class="sourceLineNo">1994</span>    KeyValue kv = new KeyValue(row1, fam2, qf1, ts, KeyValue.Type.Put, val2);<a name="line.1994"></a>
+<span class="sourceLineNo">1995</span>    put = new Put(row1);<a name="line.1995"></a>
+<span class="sourceLineNo">1996</span>    put.add(kv);<a name="line.1996"></a>
+<span class="sourceLineNo">1997</span><a name="line.1997"></a>
+<span class="sourceLineNo">1998</span>    // checkAndPut with wrong value<a name="line.1998"></a>
+<span class="sourceLineNo">1999</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1999"></a>
+<span class="sourceLineNo">2000</span>        new BinaryComparator(val1), put);<a name="line.2000"></a>
+<span class="sourceLineNo">2001</span>    assertEquals(true, res);<a name="line.2001"></a>
+<span class="sourceLineNo">2002</span><a name="line.2002"></a>
+<span class="sourceLineNo">2003</span>    Get get = new Get(row1);<a name="line.2003"></a>
+<span class="sourceLineNo">2004</span>    get.addColumn(fam2, qf1);<a name="line.2004"></a>
+<span class="sourceLineNo">2005</span>    Cell[] actual = region.get(get).rawCells();<a name="line.2005"></a>
+<span class="sourceLineNo">2006</span><a name="line.2006"></a>
+<span class="sourceLineNo">2007</span>    Cell[] expected = { kv };<a name="line.2007"></a>
+<span class="sourceLineNo">2008</span><a name="line.2008"></a>
+<span class="sourceLineNo">2009</span>    assertEquals(expected.length, actual.length);<a name="line.2009"></a>
+<span class="sourceLineNo">2010</span>    for (int i = 0; i &lt; actual.length; i++) {<a name="line.2010"></a>
+<span class="sourceLineNo">2011</span>      assertEquals(expected[i], actual[i]);<a name="line.2011"></a>
+<span class="sourceLineNo">2012</span>    }<a name="line.2012"></a>
+<span class="sourceLineNo">2013</span>  }<a name="line.2013"></a>
+<span class="sourceLineNo">2014</span><a name="line.2014"></a>
+<span class="sourceLineNo">2015</span>  @Test<a name="line.2015"></a>
+<span class="sourceLineNo">2016</span>  public void testCheckAndPut_wrongRowInPut() throws IOException {<a name="line.2016"></a>
+<span class="sourceLineNo">2017</span>    this.region = initHRegion(tableName, method, CONF, COLUMNS);<a name="line.2017"></a>
+<span class="sourceLineNo">2018</span>    Put put = new Put(row2);<a name="line.2018"></a>
+<span class="sourceLineNo">2019</span>    put.addColumn(fam1, qual1, value1);<a name="line.2019"></a>
+<span class="sourceLineNo">2020</span>    try {<a name="line.2020"></a>
+<span class="sourceLineNo">2021</span>      region.checkAndMutate(row, fam1, qual1, CompareOperator.EQUAL,<a name="line.2021"></a>
+<span class="sourceLineNo">2022</span>          new BinaryComparator(value2), put);<a name="line.2022"></a>
+<span class="sourceLineNo">2023</span>      fail();<a name="line.2023"></a>
+<span class="sourceLineNo">2024</span>    } catch (org.apache.hadoop.hbase.DoNotRetryIOException expected) {<a name="line.2024"></a>
+<span class="sourceLineNo">2025</span>      // expected exception.<a name="line.2025"></a>
+<span class="sourceLineNo">2026</span>    }<a name="line.2026"></a>
+<span class="sourceLineNo">2027</span>  }<a name="line.2027"></a>
+<span class="sourceLineNo">2028</span><a name="line.2028"></a>
+<span class="sourceLineNo">2029</span>  @Test<a name="line.2029"></a>
+<span class="sourceLineNo">2030</span>  public void testCheckAndDelete_ThatDeleteWasWritten() throws IOException {<a name="line.2030"></a>
+<span class="sourceLineNo">2031</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2031"></a>
+<span class="sourceLineNo">2032</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2032"></a>
+<span class="sourceLineNo">2033</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2033"></a>
+<span class="sourceLineNo">2034</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.2034"></a>
+<span class="sourceLineNo">2035</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.2035"></a>
+<span class="sourceLineNo">2036</span>    byte[] qf3 = Bytes.toBytes("qualifier3");<a name="line.2036"></a>
+<span class="sourceLineNo">2037</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.2037"></a>
+<span class="sourceLineNo">2038</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.2038"></a>
+<span class="sourceLineNo">2039</span>    byte[] val3 = Bytes.toBytes("value3");<a name="line.2039"></a>
+<span class="sourceLineNo">2040</span>    byte[] emptyVal = new byte[] {};<a name="line.2040"></a>
+<span class="sourceLineNo">2041</span><a name="line.2041"></a>
+<span class="sourceLineNo">2042</span>    byte[][] families = { fam1, fam2 };<a name="line.2042"></a>
+<span class="sourceLineNo">2043</span><a name="line.2043"></a>
+<span class="sourceLineNo">2044</span>    // Setting up region<a name="line.2044"></a>
+<span class="sourceLineNo">2045</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2045"></a>
+<span class="sourceLineNo">2046</span>    // Put content<a name="line.2046"></a>
+<span class="sourceLineNo">2047</span>    Put put = new Put(row1);<a name="line.2047"></a>
+<span class="sourceLineNo">2048</span>    put.addColumn(fam1, qf1, val1);<a name="line.2048"></a>
+<span class="sourceLineNo">2049</span>    region.put(put);<a name="line.2049"></a>
+<span class="sourceLineNo">2050</span>    Threads.sleep(2);<a name="line.2050"></a>
+<span class="sourceLineNo">2051</span><a name="line.2051"></a>
+<span class="sourceLineNo">2052</span>    put = new Put(row1);<a name="line.2052"></a>
+<span class="sourceLineNo">2053</span>    put.addColumn(fam1, qf1, val2);<a name="line.2053"></a>
+<span class="sourceLineNo">2054</span>    put.addColumn(fam2, qf1, val3);<a name="line.2054"></a>
+<span class="sourceLineNo">2055</span>    put.addColumn(fam2, qf2, val2);<a name="line.2055"></a>
+<span class="sourceLineNo">2056</span>    put.addColumn(fam2, qf3, val1);<a name="line.2056"></a>
+<span class="sourceLineNo">2057</span>    put.addColumn(fam1, qf3, val1);<a name="line.2057"></a>
+<span class="sourceLineNo">2058</span>    region.put(put);<a name="line.2058"></a>
+<span class="sourceLineNo">2059</span><a name="line.2059"></a>
+<span class="sourceLineNo">2060</span>    // Multi-column delete<a name="line.2060"></a>
+<span class="sourceLineNo">2061</span>    Delete delete = new Delete(row1);<a name="line.2061"></a>
+<span class="sourceLineNo">2062</span>    delete.addColumn(fam1, qf1);<a name="line.2062"></a>
+<span class="sourceLineNo">2063</span>    delete.addColumn(fam2, qf1);<a name="line.2063"></a>
+<span class="sourceLineNo">2064</span>    delete.addColumn(fam1, qf3);<a name="line.2064"></a>
+<span class="sourceLineNo">2065</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.2065"></a>
+<span class="sourceLineNo">2066</span>        new BinaryComparator(val2), delete);<a name="line.2066"></a>
+<span class="sourceLineNo">2067</span>    assertEquals(true, res);<a name="line.2067"></a>
+<span class="sourceLineNo">2068</span><a name="line.2068"></a>
+<span class="sourceLineNo">2069</span>    Get get = new Get(row1);<a name="line.2069"></a>
+<span class="sourceLineNo">2070</span>    get.addColumn(fam1, qf1);<a name="line.2070"></a>
+<span class="sourceLineNo">2071</span>    get.addColumn(fam1, qf3);<a name="line.2071"></a>
+<span class="sourceLineNo">2072</span>    get.addColumn(fam2, qf2);<a name="line.2072"></a>
+<span class="sourceLineNo">2073</span>    Result r = region.get(get);<a name="line.2073"></a>
+<span class="sourceLineNo">2074</span>    assertEquals(2, r.size());<a name="line.2074"></a>
+<span class="sourceLineNo">2075</span>    assertArrayEquals(val1, r.getValue(fam1, qf1));<a name="line.2075"></a>
+<span class="sourceLineNo">2076</span>    assertArrayEquals(val2, r.getValue(fam2, qf2));<a name="line.2076"></a>
+<span class="sourceLineNo">2077</span><a name="line.2077"></a>
+<span class="sourceLineNo">2078</span>    // Family delete<a name="line.2078"></a>
+<span class="sourceLineNo">2079</span>    delete = new Delete(row1);<a name="line.2079"></a>
+<span class="sourceLineNo">2080</span>    delete.addFamily(fam2);<a name="line.2080"></a>
+<span class="sourceLineNo">2081</span>    res = region.checkAndMutate(row1, fam2, qf1, CompareOperator.EQUAL,<a name="line.2081"></a>
+<span class="sourceLineNo">2082</span>        new BinaryComparator(emptyVal), delete);<a name="line.2082"></a>
+<span class="sourceLineNo">2083</span>    assertEquals(true, res);<a name="line.2083"></a>
+<span class="sourceLineNo">2084</span><a name="line.2084"></a>
+<span class="sourceLineNo">2085</span>    get = new Get(row1);<a name="line.2085"></a>
+<span class="sourceLineNo">2086</span>    r = region.get(get);<a name="line.2086"></a>
+<span class="sourceLineNo">2087</span>    assertEquals(1, r.size());<a name="line.2087"></a>
+<span class="sourceLineNo">2088</span>    assertArrayEquals(val1, r.getValue(fam1, qf1));<a name="line.2088"></a>
+<span class="sourceLineNo">2089</span><a name="line.2089"></a>
+<span class="sourceLineNo">2090</span>    // Row delete<a name="line.2090"></a>
+<span class="sourceLineNo">2091</span>    delete = new Delete(row1);<a name="line.2091"></a>
+<span class="sourceLineNo">2092</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new BinaryComparator(val1),<a name="line.2092"></a>
+<span class="sourceLineNo">2093</span>        delete);<a name="line.2093"></a>
+<span class="sourceLineNo">2094</span>    assertEquals(true, res);<a name="line.2094"></a>
+<span class="sourceLineNo">2095</span>    get = new Get(row1);<a name="line.2095"></a>
+<span class="sourceLineNo">2096</span>    r = region.get(get);<a name="line.2096"></a>
+<span class="sourceLineNo">2097</span>    assertEquals(0, r.size());<a name="line.2097"></a>
+<span class="sourceLineNo">2098</span>  }<a name="line.2098"></a>
+<span class="sourceLineNo">2099</span><a name="line.2099"></a>
+<span class="sourceLineNo">2100</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2100"></a>
+<span class="sourceLineNo">2101</span>  // Delete tests<a name="line.2101"></a>
+<span class="sourceLineNo">2102</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2102"></a>
+<span class="sourceLineNo">2103</span>  @Test<a name="line.2103"></a>
+<span class="sourceLineNo">2104</span>  public void testDelete_multiDeleteColumn() throws IOException {<a name="line.2104"></a>
+<span class="sourceLineNo">2105</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2105"></a>
+<span class="sourceLineNo">2106</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2106"></a>
+<span class="sourceLineNo">2107</span>    byte[] qual = Bytes.toBytes("qualifier");<a name="line.2107"></a>
+<span class="sourceLineNo">2108</span>    byte[] value = Bytes.toBytes("value");<a name="line.2108"></a>
+<span class="sourceLineNo">2109</span><a name="line.2109"></a>
+<span class="sourceLineNo">2110</span>    Put put = new Put(row1);<a name="line.2110"></a>
+<span class="sourceLineNo">2111</span>    put.addColumn(fam1, qual, 1, value);<a name="line.2111"></a>
+<span class="sourceLineNo">2112</span>    put.addColumn(fam1, qual, 2, value);<a name="line.2112"></a>
+<span class="sourceLineNo">2113</span><a name="line.2113"></a>
+<span class="sourceLineNo">2114</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2114"></a>
+<span class="sourceLineNo">2115</span>    region.put(put);<a name="line.2115"></a>
+<span class="sourceLineNo">2116</span><a name="line.2116"></a>
+<span class="sourceLineNo">2117</span>    // We do support deleting more than 1 'latest' version<a name="line.2117"></a>
+<span class="sourceLineNo">2118</span>    Delete delete = new Delete(row1);<a name="line.2118"></a>
 <span class="sourceLineNo">2119</span>    delete.addColumn(fam1, qual);<a name="line.2119"></a>
-<span class="sourceLineNo">2120</span>    region.delete(delete);<a name="line.2120"></a>
-<span class="sourceLineNo">2121</span><a name="line.2121"></a>
-<span class="sourceLineNo">2122</span>    Get get = new Get(row1);<a name="line.2122"></a>
-<span class="sourceLineNo">2123</span>    get.addFamily(fam1);<a name="line.2123"></a>
-<span class="sourceLineNo">2124</span>    Result r = region.get(get);<a name="line.2124"></a>
-<span class="sourceLineNo">2125</span>    assertEquals(0, r.size());<a name="line.2125"></a>
-<span class="sourceLineNo">2126</span>  }<a name="line.2126"></a>
-<span class="sourceLineNo">2127</span><a name="line.2127"></a>
-<span class="sourceLineNo">2128</span>  @Test<a name="line.2128"></a>
-<span class="sourceLineNo">2129</span>  public void testDelete_CheckFamily() throws IOException {<a name="line.2129"></a>
-<span class="sourceLineNo">2130</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2130"></a>
-<span class="sourceLineNo">2131</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2131"></a>
-<span class="sourceLineNo">2132</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2132"></a>
-<span class="sourceLineNo">2133</span>    byte[] fam3 = Bytes.toBytes("fam3");<a name="line.2133"></a>
-<span class="sourceLineNo">2134</span>    byte[] fam4 = Bytes.toBytes("fam4");<a name="line.2134"></a>
-<span class="sourceLineNo">2135</span><a name="line.2135"></a>
-<span class="sourceLineNo">2136</span>    // Setting up region<a name="line.2136"></a>
-<span class="sourceLineNo">2137</span>    this.region = initHRegion(tableName, method, CONF, fam1, fam2, fam3);<a name="line.2137"></a>
-<span class="sourceLineNo">2138</span>    List&lt;Cell&gt; kvs = new ArrayList&lt;&gt;();<a name="line.2138"></a>
-<span class="sourceLineNo">2139</span>    kvs.add(new KeyValue(row1, fam4, null, null));<a name="line.2139"></a>
-<span class="sourceLineNo">2140</span><a name="line.2140"></a>
-<span class="sourceLineNo">2141</span>    // testing existing family<a name="line.2141"></a>
-<span class="sourceLineNo">2142</span>    byte[] family = fam2;<a name="line.2142"></a>
-<span class="sourceLineNo">2143</span>    NavigableMap&lt;byte[], List&lt;Cell&gt;&gt; deleteMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2143"></a>
-<span class="sourceLineNo">2144</span>    deleteMap.put(family, kvs);<a name="line.2144"></a>
-<span class="sourceLineNo">2145</span>    region.delete(deleteMap, Durability.SYNC_WAL);<a name="line.2145"></a>
-<span class="sourceLineNo">2146</span><a name="line.2146"></a>
-<span class="sourceLineNo">2147</span>    // testing non existing family<a name="line.2147"></a>
-<span class="sourceLineNo">2148</span>    boolean ok = false;<a name="line.2148"></a>
-<span class="sourceLineNo">2149</span>    family = fam4;<a name="line.2149"></a>
-<span class="sourceLineNo">2150</span>    try {<a name="line.2150"></a>
-<span class="sourceLineNo">2151</span>      deleteMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2151"></a>
-<span class="sourceLineNo">2152</span>      deleteMap.put(family, kvs);<a name="line.2152"></a>
-<span class="sourceLineNo">2153</span>      region.delete(deleteMap, Durability.SYNC_WAL);<a name="line.2153"></a>
-<span class="sourceLineNo">2154</span>    } catch (Exception e) {<a name="line.2154"></a>
-<span class="sourceLineNo">2155</span>      ok = true;<a name="line.2155"></a>
-<span class="sourceLineNo">2156</span>    }<a name="line.2156"></a>
-<span class="sourceLineNo">2157</span>    assertTrue("Family " + new String(family, StandardCharsets.UTF_8) + " does exist", ok);<a name="line.2157"></a>
-<span class="sourceLineNo">2158</span>  }<a name="line.2158"></a>
-<span class="sourceLineNo">2159</span><a name="line.2159"></a>
-<span class="sourceLineNo">2160</span>  @Test<a name="line.2160"></a>
-<span class="sourceLineNo">2161</span>  public void testDelete_mixed() throws IOException, InterruptedException {<a name="line.2161"></a>
-<span class="sourceLineNo">2162</span>    byte[] fam = Bytes.toBytes("info");<a name="line.2162"></a>
-<span class="sourceLineNo">2163</span>    byte[][] families = { fam };<a name="line.2163"></a>
-<span class="sourceLineNo">2164</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2164"></a>
-<span class="sourceLineNo">2165</span>    EnvironmentEdgeManagerTestHelper.injectEdge(new IncrementingEnvironmentEdge());<a name="line.2165"></a>
-<span class="sourceLineNo">2166</span><a name="line.2166"></a>
-<span class="sourceLineNo">2167</span>    byte[] row = Bytes.toBytes("table_name");<a name="line.2167"></a>
-<span class="sourceLineNo">2168</span>    // column names<a name="line.2168"></a>
-<span class="sourceLineNo">2169</span>    byte[] serverinfo = Bytes.toBytes("serverinfo");<a name="line.2169"></a>
-<span class="sourceLineNo">2170</span>    byte[] splitA = Bytes.toBytes("splitA");<a name="line.2170"></a>
-<span class="sourceLineNo">2171</span>    byte[] splitB = Bytes.toBytes("splitB");<a name="line.2171"></a>
-<span class="sourceLineNo">2172</span><a name="line.2172"></a>
-<span class="sourceLineNo">2173</span>    // add some data:<a name="line.2173"></a>
-<span class="sourceLineNo">2174</span>    Put put = new Put(row);<a name="line.2174"></a>
-<span class="sourceLineNo">2175</span>    put.addColumn(fam, splitA, Bytes.toBytes("reference_A"));<a name="line.2175"></a>
-<span class="sourceLineNo">2176</span>    region.put(put);<a name="line.2176"></a>
-<span class="sourceLineNo">2177</span><a name="line.2177"></a>
-<span class="sourceLineNo">2178</span>    put = new Put(row);<a name="line.2178"></a>
-<span class="sourceLineNo">2179</span>    put.addColumn(fam, splitB, Bytes.toBytes("reference_B"));<a name="line.2179"></a>
-<span class="sourceLineNo">2180</span>    region.put(put);<a name="line.2180"></a>
-<span class="sourceLineNo">2181</span><a name="line.2181"></a>
-<span class="sourceLineNo">2182</span>    put = new Put(row);<a name="line.2182"></a>
-<span class="sourceLineNo">2183</span>    put.addColumn(fam, serverinfo, Bytes.toBytes("ip_address"));<a name="line.2183"></a>
-<span class="sourceLineNo">2184</span>    region.put(put);<a name="line.2184"></a>
-<span class="sourceLineNo">2185</span><a name="line.2185"></a>
-<span class="sourceLineNo">2186</span>    // ok now delete a split:<a name="line.2186"></a>
-<span class="sourceLineNo">2187</span>    Delete delete = new Delete(row);<a name="line.2187"></a>
-<span class="sourceLineNo">2188</span>    delete.addColumns(fam, splitA);<a name="line.2188"></a>
-<span class="sourceLineNo">2189</span>    region.delete(delete);<a name="line.2189"></a>
-<span class="sourceLineNo">2190</span><a name="line.2190"></a>
-<span class="sourceLineNo">2191</span>    // assert some things:<a name="line.2191"></a>
-<span class="sourceLineNo">2192</span>    Get get = new Get(row).addColumn(fam, serverinfo);<a name="line.2192"></a>
-<span class="sourceLineNo">2193</span>    Result result = region.get(get);<a name="line.2193"></a>
-<span class="sourceLineNo">2194</span>    assertEquals(1, result.size());<a name="line.2194"></a>
-<span class="sourceLineNo">2195</span><a name="line.2195"></a>
-<span class="sourceLineNo">2196</span>    get = new Get(row).addColumn(fam, splitA);<a name="line.2196"></a>
-<span class="sourceLineNo">2197</span>    result = region.get(get);<a name="line.2197"></a>
-<span class="sourceLineNo">2198</span>    assertEquals(0, result.size());<a name="line.2198"></a>
-<span class="sourceLineNo">2199</span><a name="line.2199"></a>
-<span class="sourceLineNo">2200</span>    get = new Get(row).addColumn(fam, splitB);<a name="line.2200"></a>
-<span class="sourceLineNo">2201</span>    result = region.get(get);<a name="line.2201"></a>
-<span class="sourceLineNo">2202</span>    assertEquals(1, result.size());<a name="line.2202"></a>
-<span class="sourceLineNo">2203</span><a name="line.2203"></a>
-<span class="sourceLineNo">2204</span>    // Assert that after a delete, I can put.<a name="line.2204"></a>
-<span class="sourceLineNo">2205</span>    put = new Put(row);<a name="line.2205"></a>
-<span class="sourceLineNo">2206</span>    put.addColumn(fam, splitA, Bytes.toBytes("reference_A"));<a name="line.2206"></a>
-<span class="sourceLineNo">2207</span>    region.put(put);<a name="line.2207"></a>
-<span class="sourceLineNo">2208</span>    get = new Get(row);<a name="line.2208"></a>
-<span class="sourceLineNo">2209</span>    result = region.get(get);<a name="line.2209"></a>
-<span class="sourceLineNo">2210</span>    assertEquals(3, result.size());<a name="line.2210"></a>
-<span class="sourceLineNo">2211</span><a name="line.2211"></a>
-<span class="sourceLineNo">2212</span>    // Now delete all... then test I can add stuff back<a name="line.2212"></a>
-<span class="sourceLineNo">2213</span>    delete = new Delete(row);<a name="line.2213"></a>
-<span class="sourceLineNo">2214</span>    region.delete(delete);<a name="line.2214"></a>
-<span class="sourceLineNo">2215</span>    assertEquals(0, region.get(get).size());<a name="line.2215"></a>
-<span class="sourceLineNo">2216</span><a name="line.2216"></a>
-<span class="sourceLineNo">2217</span>    region.put(new Put(row).addColumn(fam, splitA, Bytes.toBytes("reference_A")));<a name="line.2217"></a>
-<span class="sourceLineNo">2218</span>    result = region.get(get);<a name="line.2218"></a>
-<span class="sourceLineNo">2219</span>    assertEquals(1, result.size());<a name="line.2219"></a>
-<span class="sourceLineNo">2220</span>  }<a name="line.2220"></a>
-<span class="sourceLineNo">2221</span><a name="line.2221"></a>
-<span class="sourceLineNo">2222</span>  @Test<a name="line.2222"></a>
-<span class="sourceLineNo">2223</span>  public void testDeleteRowWithFutureTs() throws IOException {<a name="line.2223"></a>
-<span class="sourceLineNo">2224</span>    byte[] fam = Bytes.toBytes("info");<a name="line.2224"></a>
-<span class="sourceLineNo">2225</span>    byte[][] families = { fam };<a name="line.2225"></a>
-<span class="sourceLineNo">2226</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2226"></a>
-<span class="sourceLineNo">2227</span>    byte[] row = Bytes.toBytes("table_name");<a name="line.2227"></a>
-<span class="sourceLineNo">2228</span>    // column names<a name="line.2228"></a>
-<span class="sourceLineNo">2229</span>    byte[] serverinfo = Bytes.toBytes("serverinfo");<a name="line.2229"></a>
-<span class="sourceLineNo">2230</span><a name="line.2230"></a>
-<span class="sourceLineNo">2231</span>    // add data in the far future<a name="line.2231"></a>
-<span class="sourceLineNo">2232</span>    Put put = new Put(row);<a name="line.2232"></a>
-<span class="sourceLineNo">2233</span>    put.addColumn(fam, serverinfo, HConstants.LATEST_TIMESTAMP - 5, Bytes.toBytes("value"));<a name="line.2233"></a>
-<span class="sourceLineNo">2234</span>    region.put(put);<a name="line.2234"></a>
-<span class="sourceLineNo">2235</span><a name="line.2235"></a>
-<span class="sourceLineNo">2236</span>    // now delete something in the present<a name="line.2236"></a>
-<span class="sourceLineNo">2237</span>    Delete delete = new Delete(row);<a name="line.2237"></a>
-<span class="sourceLineNo">2238</span>    region.delete(delete);<a name="line.2238"></a>
-<span class="sourceLineNo">2239</span><a name="line.2239"></a>
-<span class="sourceLineNo">2240</span>    // make sure we still see our data<a name="line.2240"></a>
-<span class="sourceLineNo">2241</span>    Get get = new Get(row).addColumn(fam, serverinfo);<a name="line.2241"></a>
-<span class="sourceLineNo">2242</span>    Result result = region.get(get);<a name="line.2242"></a>
-<span class="sourceLineNo">2243</span>    assertEquals(1, result.size());<a name="line.2243"></a>
-<span class="sourceLineNo">2244</span><a name="line.2244"></a>
-<span class="sourceLineNo">2245</span>    // delete the future row<a name="line.2245"></a>
-<span class="sourceLineNo">2246</span>    delete = new Delete(row, HConstants.LATEST_TIMESTAMP - 3);<a name="line.2246"></a>
-<span class="sourceLineNo">2247</span>    region.delete(delete);<a name="line.2247"></a>
-<span class="sourceLineNo">2248</span><a name="line.2248"></a>
-<span class="sourceLineNo">2249</span>    // make sure it is gone<a name="line.2249"></a>
-<span class="sourceLineNo">2250</span>    get = new Get(row).addColumn(fam, serverinfo);<a name="line.2250"></a>
-<span class="sourceLineNo">2251</span>    result = region.get(get);<a name="line.2251"></a>
-<span class="sourceLineNo">2252</span>    assertEquals(0, result.size());<a name="line.2252"></a>
-<span class="sourceLineNo">2253</span>  }<a name="line.2253"></a>
-<span class="sourceLineNo">2254</span><a name="line.2254"></a>
-<span class="sourceLineNo">2255</span>  /**<a name="line.2255"></a>
-<span class="sourceLineNo">2256</span>   * Tests that the special LATEST_TIMESTAMP option for puts gets replaced by<a name="line.2256"></a>
-<span class="sourceLineNo">2257</span>   * the actual timestamp<a name="line.2257"></a>
-<span class="sourceLineNo">2258</span>   */<a name="line.2258"></a>
-<span class="sourceLineNo">2259</span>  @Test<a name="line.2259"></a>
-<span class="sourceLineNo">2260</span>  public void testPutWithLatestTS() throws IOException {<a name="line.2260"></a>
-<span class="sourceLineNo">2261</span>    byte[] fam = Bytes.toBytes("info");<a name="line.2261"></a>
-<span class="sourceLineNo">2262</span>    byte[][] families = { fam };<a name="line.2262"></a>
-<span class="sourceLineNo">2263</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2263"></a>
-<span class="sourceLineNo">2264</span>    byte[] row = Bytes.toBytes("row1");<a name="line.2264"></a>
-<span class="sourceLineNo">2265</span>    // column names<a name="line.2265"></a>
-<span class="sourceLineNo">2266</span>    byte[] qual = Bytes.toBytes("qual");<a name="line.2266"></a>
-<span class="sourceLineNo">2267</span><a name="line.2267"></a>
-<span class="sourceLineNo">2268</span>    // add data with LATEST_TIMESTAMP, put without WAL<a name="line.2268"></a>
-<span class="sourceLineNo">2269</span>    Put put = new Put(row);<a name="line.2269"></a>
-<span class="sourceLineNo">2270</span>    put.addColumn(fam, qual, HConstants.LATEST_TIMESTAMP, Bytes.toBytes("value"));<a name="line.2270"></a>
-<span class="sourceLineNo">2271</span>    region.put(put);<a name="line.2271"></a>
-<span class="sourceLineNo">2272</span><a name="line.2272"></a>
-<span class="sourceLineNo">2273</span>    // Make sure it shows up with an actual timestamp<a name="line.2273"></a>
-<span class="sourceLineNo">2274</span>    Get get = new Get(row).addColumn(fam, qual);<a name="line.2274"></a>
-<span class="sourceLineNo">2275</span>    Result result = region.get(get);<a name="line.2275"></a>
-<span class="sourceLineNo">2276</span>    assertEquals(1, result.size());<a name="line.2276"></a>
-<span class="sourceLineNo">2277</span>    Cell kv = result.rawCells()[0];<a name="line.2277"></a>
-<span class="sourceLineNo">2278</span>    LOG.info("Got: " + kv);<a name="line.2278"></a>
-<span class="sourceLineNo">2279</span>    assertTrue("LATEST_TIMESTAMP was not replaced with real timestamp",<a name="line.2279"></a>
-<span class="sourceLineNo">2280</span>        kv.getTimestamp() != HConstants.LATEST_TIMESTAMP);<a name="line.2280"></a>
-<span class="sourceLineNo">2281</span><a name="line.2281"></a>
-<span class="sourceLineNo">2282</span>    // Check same with WAL enabled (historically these took different<a name="line.2282"></a>
-<span class="sourceLineNo">2283</span>    // code paths, so check both)<a name="line.2283"></a>
-<span class="sourceLineNo">2284</span>    row = Bytes.toBytes("row2");<a name="line.2284"></a>
-<span class="sourceLineNo">2285</span>    put = new Put(row);<a name="line.2285"></a>
-<span class="sourceLineNo">2286</span>    put.addColumn(fam, qual, HConstants.LATEST_TIMESTAMP, Bytes.toBytes("value"));<a name="line.2286"></a>
-<span class="sourceLineNo">2287</span>    region.put(put);<a name="line.2287"></a>
-<span class="sourceLineNo">2288</span><a name="line.2288"></a>
-<span class="sourceLineNo">2289</span>    // Make sure it shows up with an actual timestamp<a name="line.2289"></a>
-<span class="sourceLineNo">2290</span>    get = new Get(row).addColumn(fam, qual);<a name="line.2290"></a>
-<span class="sourceLineNo">2291</span>    result = region.get(get);<a name="line.2291"></a>
-<span class="sourceLineNo">2292</span>    assertEquals(1, result.size());<a name="line.2292"></a>
-<span class="sourceLineNo">2293</span>    kv = result.rawCells()[0];<a name="line.2293"></a>
-<span class="sourceLineNo">2294</span>    LOG.info("Got: " + kv);<a name="line.2294"></a>
-<span class="sourceLineNo">2295</span>    assertTrue("LATEST_TIMESTAMP was not replaced with real timestamp",<a name="line.2295"></a>
-<span class="sourceLineNo">2296</span>        kv.getTimestamp() != HConstants.LATEST_TIMESTAMP);<a name="line.2296"></a>
-<span class="sourceLineNo">2297</span>  }<a name="line.2297"></a>
-<span class="sourceLineNo">2298</span><a name="line.2298"></a>
-<span class="sourceLineNo">2299</span>  /**<a name="line.2299"></a>
-<span class="sourceLineNo">2300</span>   * Tests that there is server-side filtering for invalid timestamp upper<a name="line.2300"></a>
-<span class="sourceLineNo">2301</span>   * bound. Note that the timestamp lower bound is automatically handled for us<a name="line.2301"></a>
-<span class="sourceLineNo">2302</span>   * by the TTL field.<a name="line.2302"></a>
-<span class="sourceLineNo">2303</span>   */<a name="line.2303"></a>
-<span class="sourceLineNo">2304</span>  @Test<a name="line.2304"></a>
-<span class="sourceLineNo">2305</span>  public void testPutWithTsSlop() throws IOException {<a name="line.2305"></a>
-<span class="sourceLineNo">2306</span>    byte[] fam = Bytes.toBytes("info");<a name="line.2306"></a>
-<span class="sourceLineNo">2307</span>    byte[][] families = { fam };<a name="line.2307"></a>
-<span class="sourceLineNo">2308</span><a name="line.2308"></a>
-<span class="sourceLineNo">2309</span>    // add data with a timestamp that is too recent for range. Ensure assert<a name="line.2309"></a>
-<span class="sourceLineNo">2310</span>    CONF.setInt("hbase.hregion.keyvalue.timestamp.slop.millisecs", 1000);<a name="line.2310"></a>
-<span class="sourceLineNo">2311</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2311"></a>
-<span class="sourceLineNo">2312</span>    boolean caughtExcep = false;<a name="line.2312"></a>
-<span class="sourceLineNo">2313</span>    try {<a name="line.2313"></a>
-<span class="sourceLineNo">2314</span>      // no TS specified == use latest. should not error<a name="line.2314"></a>
-<span class="sourceLineNo">2315</span>      region.put(new Put(row).addColumn(fam, Bytes.toBytes("qual"), Bytes.toBytes("value")));<a name="line.2315"></a>
-<span class="sourceLineNo">2316</span>      // TS out of range. should error<a name="line.2316"></a>
-<span class="sourceLineNo">2317</span>      region.put(new Put(row).addColumn(fam, Bytes.toBytes("qual"),<a name="line.2317"></a>
-<span class="sourceLineNo">2318</span>          System.currentTimeMillis() + 2000, Bytes.toBytes("value")));<a name="line.2318"></a>
-<span class="sourceLineNo">2319</span>      fail("Expected IOE for TS out of configured timerange");<a name="line.2319"></a>
-<span class="sourceLineNo">2320</span>    } catch (FailedSanityCheckException ioe) {<a name="line.2320"></a>
-<span class="sourceLineNo">2321</span>      LOG.debug("Received expected exception", ioe);<a name="line.2321"></a>
-<span class="sourceLineNo">2322</span>      caughtExcep = true;<a name="line.2322"></a>
-<span class="sourceLineNo">2323</span>    }<a name="line.2323"></a>
-<span class="sourceLineNo">2324</span>    assertTrue("Should catch FailedSanityCheckException", caughtExcep);<a name="line.2324"></a>
-<span class="sourceLineNo">2325</span>  }<a name="line.2325"></a>
-<span class="sourceLineNo">2326</span><a name="line.2326"></a>
-<span class="sourceLineNo">2327</span>  @Test<a name="line.2327"></a>
-<span class="sourceLineNo">2328</span>  public void testScanner_DeleteOneFamilyNotAnother() throws IOException {<a name="line.2328"></a>
-<span class="sourceLineNo">2329</span>    byte[] fam1 = Bytes.toBytes("columnA");<a name="line.2329"></a>
-<span class="sourceLineNo">2330</span>    byte[] fam2 = Bytes.toBytes("columnB");<a name="line.2330"></a>
-<span class="sourceLineNo">2331</span>    this.region = initHRegion(tableName, method, CONF, fam1, fam2);<a name="line.2331"></a>
-<span class="sourceLineNo">2332</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.2332"></a>
-<span class="sourceLineNo">2333</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.2333"></a>
-<span class="sourceLineNo">2334</span><a name="line.2334"></a>
-<span class="sourceLineNo">2335</span>    byte[] value = Bytes.toBytes("value");<a name="line.2335"></a>
-<span class="sourceLineNo">2336</span><a name="line.2336"></a>
-<span class="sourceLineNo">2337</span>    Delete delete = new Delete(rowA);<a name="line.2337"></a>
-<span class="sourceLineNo">2338</span>    delete.addFamily(fam1);<a name="line.2338"></a>
-<span class="sourceLineNo">2339</span><a name="line.2339"></a>
-<span class="sourceLineNo">2340</span>    region.delete(delete);<a name="line.2340"></a>
-<span class="sourceLineNo">2341</span><a name="line.2341"></a>
-<span class="sourceLineNo">2342</span>    // now create data.<a name="line.2342"></a>
-<span class="sourceLineNo">2343</span>    Put put = new Put(rowA);<a name="line.2343"></a>
-<span class="sourceLineNo">2344</span>    put.addColumn(fam2, null, value);<a name="line.2344"></a>
-<span class="sourceLineNo">2345</span>    region.put(put);<a name="line.2345"></a>
-<span class="sourceLineNo">2346</span><a name="line.2346"></a>
-<span class="sourceLineNo">2347</span>    put = new Put(rowB);<a name="line.2347"></a>
-<span class="sourceLineNo">2348</span>    put.addColumn(fam1, null, value);<a name="line.2348"></a>
-<span class="sourceLineNo">2349</span>    put.addColumn(fam2, null, value);<a name="line.2349"></a>
-<span class="sourceLineNo">2350</span>    region.put(put);<a name="line.2350"></a>
-<span class="sourceLineNo">2351</span><a name="line.2351"></a>
-<span class="sourceLineNo">2352</span>    Scan scan = new Scan();<a name="line.2352"></a>
-<span class="sourceLineNo">2353</span>    scan.addFamily(fam1).addFamily(fam2);<a name="line.2353"></a>
-<span class="sourceLineNo">2354</span>    InternalScanner s = region.getScanner(scan);<a name="line.2354"></a>
-<span class="sourceLineNo">2355</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.2355"></a>
-<span class="sourceLineNo">2356</span>    s.next(results);<a name="line.2356"></a>
-<span class="sourceLineNo">2357</span>    assertTrue(CellUtil.matchingRows(results.get(0), rowA));<a name="line.2357"></a>
-<span class="sourceLineNo">2358</span><a name="line.2358"></a>
-<span class="sourceLineNo">2359</span>    results.clear();<a name="line.2359"></a>
-<span class="sourceLineNo">2360</span>    s.next(results);<a name="line.2360"></a>
-<span class="sourceLineNo">2361</span>    assertTrue(CellUtil.matchingRows(results.get(0), rowB));<a name="line.2361"></a>
-<span class="sourceLineNo">2362</span>  }<a name="line.2362"></a>
-<span class="sourceLineNo">2363</span><a name="line.2363"></a>
-<span class="sourceLineNo">2364</span>  @Test<a name="line.2364"></a>
-<span class="sourceLineNo">2365</span>  public void testDataInMemoryWithoutWAL() throws IOException {<a name="line.2365"></a>
-<span class="sourceLineNo">2366</span>    FileSystem fs = FileSystem.get(CONF);<a name="line.2366"></a>
-<span class="sourceLineNo">2367</span>    Path rootDir = new Path(dir + "testDataInMemoryWithoutWAL");<a name="line.2367"></a>
-<span class="sourceLineNo">2368</span>    FSHLog hLog = new FSHLog(fs, rootDir, "testDataInMemoryWithoutWAL", CONF);<a name="line.2368"></a>
-<span class="sourceLineNo">2369</span>    hLog.init();<a name="line.2369"></a>
-<span class="sourceLineNo">2370</span>    // This chunk creation is done throughout the code base. Do we want to move it into core?<a name="line.2370"></a>
-<span class="sourceLineNo">2371</span>    // It is missing from this test. W/o it we NPE.<a name="line.2371"></a>
-<span class="sourceLineNo">2372</span>    ChunkCreator.initialize(MemStoreLABImpl.CHUNK_SIZE_DEFAULT, false, 0, 0, 0, null);<a name="line.2372"></a>
-<span class="sourceLineNo">2373</span>    region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, hLog,<a name="line.2373"></a>
-<span class="sourceLineNo">2374</span>        COLUMN_FAMILY_BYTES);<a name="line.2374"></a>
-<span class="sourceLineNo">2375</span><a name="line.2375"></a>
-<span class="sourceLineNo">2376</span>    Cell originalCell = CellUtil.createCell(row, COLUMN_FAMILY_BYTES, qual1,<a name="line.2376"></a>
-<span class="sourceLineNo">2377</span>      System.currentTimeMillis(), KeyValue.Type.Put.getCode(), value1);<a name="line.2377"></a>
-<span class="sourceLineNo">2378</span>    final long originalSize = originalCell.getSerializedSize();<a name="line.2378"></a>
-<span class="sourceLineNo">2379</span><a name="line.2379"></a>
-<span class="sourceLineNo">2380</span>    Cell addCell = CellUtil.createCell(row, COLUMN_FAMILY_BYTES, qual1,<a name="line.2380"></a>
-<span class="sourceLineNo">2381</span>      System.currentTimeMillis(), KeyValue.Type.Put.getCode(), Bytes.toBytes("xxxxxxxxxx"));<a name="line.2381"></a>
-<span class="sourceLineNo">2382</span>    final long addSize = addCell.getSerializedSize();<a name="line.2382"></a>
-<span class="sourceLineNo">2383</span><a name="line.2383"></a>
-<span class="sourceLineNo">2384</span>    LOG.info("originalSize:" + originalSize<a name="line.2384"></a>
-<span class="sourceLineNo">2385</span>      + ", addSize:" + addSize);<a name="line.2385"></a>
-<span class="sourceLineNo">2386</span>    // start test. We expect that the addPut's durability will be replaced<a name="line.2386"></a>
-<span class="sourceLineNo">2387</span>    // by originalPut's durability.<a name="line.2387"></a>
-<span class="sourceLineNo">2388</span><a name="line.2388"></a>
-<span class="sourceLineNo">2389</span>    // case 1:<a name="line.2389"></a>
-<span class="sourceLineNo">2390</span>    testDataInMemoryWithoutWAL(region,<a name="line.2390"></a>
-<span class="sourceLineNo">2391</span>            new Put(row).add(originalCell).setDurability(Durability.SKIP_WAL),<a name="line.2391"></a>
-<span class="sourceLineNo">2392</span>            new Put(row).add(addCell).setDurability(Durability.SKIP_WAL),<a name="line.2392"></a>
-<span class="sourceLineNo">2393</span>            originalSize + addSize);<a name="line.2393"></a>
-<span class="sourceLineNo">2394</span><a name="line.2394"></a>
-<span class="sourceLineNo">2395</span>    // case 2:<a name="line.2395"></a>
-<span class="sourceLineNo">2396</span>    testDataInMemoryWithoutWAL(region,<a name="line.2396"></a>
-<span class="sourceLineNo">2397</span>            new Put(row).add(originalCell).setDurability(Durability.SKIP_WAL),<a name="line.2397"></a>
-<span class="sourceLineNo">2398</span>            new Put(row).add(addCell).setDurability(Durability.SYNC_WAL),<a name="line.2398"></a>
-<span class="sourceLineNo">2399</span>            originalSize + addSize);<a name="line.2399"></a>
-<span class="sourceLineNo">2400</span><a name="line.2400"></a>
-<span class="sourceLineNo">2401</span>    // case 3:<a name="line.2401"></a>
-<span class="sourceLineNo">2402</span>    testDataInMemoryWithoutWAL(region,<a name="line.2402"></a>
-<span class="sourceLineNo">2403</span>            new Put(row).add(originalCell).setDurability(Durability.SYNC_WAL),<a name="line.2403"></a>
-<span class="sourceLineNo">2404</span>            new Put(row).add(addCell).setDurability(Durability.SKIP_WAL),<a name="line.2404"></a>
-<span class="sourceLineNo">2405</span>            0);<a name="line.2405"></a>
-<span class="sourceLineNo">2406</span><a name="line.2406"></a>
-<span class="sourceLineNo">2407</span>    // case 4:<a name="line.2407"></a>
-<span class="sourceLineNo">2408</span>    testDataInMemoryWithoutWAL(region,<a name="line.2408"></a>
-<span class="sourceLineNo">2409</span>            new Put(row).add(originalCell).setDurability(Durability.SYNC_WAL),<a name="line.2409"></a>
-<span class="sourceLineNo">2410</span>            new Put(row).add(addCell).setDurability(Durability.SYNC_WAL),<a name="line.2410"></a>
-<span class="sourceLineNo">2411</span>            0);<a name="line.2411"></a>
-<span class="sourceLineNo">2412</span>  }<a name="line.2412"></a>
-<span class="sourceLineNo">2413</span><a name="line.2413"></a>
-<span class="sourceLineNo">2414</span>  private static void testDataInMemoryWithoutWAL(HRegion region, Put originalPut,<a name="line.2414"></a>
-<span class="sourceLineNo">2415</span>          final Put addPut, long delta) throws IOException {<a name="line.2415"></a>
-<span class="sourceLineNo">2416</span>    final long initSize = region.getDataInMemoryWithoutWAL();<a name="line.2416"></a>
-<span class="sourceLineNo">2417</span>    // save normalCPHost and replaced by mockedCPHost<a name="line.2417"></a>
-<span class="sourceLineNo">2418</span>    RegionCoprocessorHost normalCPHost = region.getCoprocessorHost();<a name="line.2418"></a>
-<span class="sourceLineNo">2419</span>    RegionCoprocessorHost mockedCPHost = Mockito.mock(RegionCoprocessorHost.class);<a name="line.2419"></a>
-<span class="sourceLineNo">2420</span>    // Because the preBatchMutate returns void, we can't do usual Mockito when...then form. Must<a name="line.2420"></a>
-<span class="sourceLineNo">2421</span>    // do below format (from Mockito doc).<a name="line.2421"></a>
-<span class="sourceLineNo">2422</span>    Mockito.doAnswer(new Answer&lt;Void&gt;() {<a name="line.2422"></a>
-<span class="sourceLineNo">2423</span>      @Override<a name="line.2423"></a>
-<span class="sourceLineNo">2424</span>      public Void answer(InvocationOnMock invocation) throws Throwable {<a name="line.2424"></a>
-<span class="sourceLineNo">2425</span>        MiniBatchOperationInProgress&lt;Mutation&gt; mb = invocation.getArgument(0);<a name="line.2425"></a>
-<span class="sourceLineNo">2426</span>        mb.addOperationsFromCP(0, new Mutation[]{addPut});<a name="line.2426"></a>
-<span class="sourceLineNo">2427</span>        return null;<a name="line.2427"></a>
-<span class="sourceLineNo">2428</span>      }<a name="line.2428"></a>
-<span class="sourceLineNo">2429</span>    }).when(mockedCPHost).preBatchMutate(Mockito.isA(MiniBatchOperationInProgress.class));<a name="line.2429"></a>
-<span class="sourceLineNo">2430</span>    region.setCoprocessorHost(mockedCPHost);<a name="line.2430"></a>
-<span class="sourceLineNo">2431</span>    region.put(originalPut);<a name="line.2431"></a>
-<span class="sourceLineNo">2432</span>    region.setCoprocessorHost(normalCPHost);<a name="line.2432"></a>
-<span class="sourceLineNo">2433</span>    final long finalSize = region.getDataInMemoryWithoutWAL();<a name="line.2433"></a>
-<span class="sourceLineNo">2434</span>    assertEquals("finalSize:" + finalSize + ", initSize:"<a name="line.2434"></a>
-<span class="sourceLineNo">2435</span>      + initSize + ", delta:" + delta,finalSize, initSize + delta);<a name="line.2435"></a>
-<span class="sourceLineNo">2436</span>  }<a name="line.2436"></a>
-<span class="sourceLineNo">2437</span><a name="line.2437"></a>
-<span class="sourceLineNo">2438</span>  @Test<a name="line.2438"></a>
-<span class="sourceLineNo">2439</span>  public void testDeleteColumns_PostInsert() throws IOException, InterruptedException {<a name="line.2439"></a>
-<span class="sourceLineNo">2440</span>    Delete delete = new Delete(row);<a name="line.2440"></a>
-<span class="sourceLineNo">2441</span>    delete.addColumns(fam1, qual1);<a name="line.2441"></a>
-<span class="sourceLineNo">2442</span>    doTestDelete_AndPostInsert(delete);<a name="line.2442"></a>
-<span class="sourceLineNo">2443</span>  }<a name="line.2443"></a>
-<span class="sourceLineNo">2444</span><a name="line.2444"></a>
-<span class="sourceLineNo">2445</span>  @Test<a name="line.2445"></a>
-<span class="sourceLineNo">2446</span>  public void testaddFamily_PostInsert() throws IOException, InterruptedException {<a name="line.2446"></a>
-<span class="sourceLineNo">2447</span>    Delete delete = new Delete(row);<a name="line.2447"></a>
-<span class="sourceLineNo">2448</span>    delete.addFamily(fam1);<a name="line.2448"></a>
-<span class="sourceLineNo">2449</span>    doTestDelete_AndPostInsert(delete);<a name="line.2449"></a>
-<span class="sourceLineNo">2450</span>  }<a name="line.2450"></a>
-<span class="sourceLineNo">2451</span><a name="line.2451"></a>
-<span class="sourceLineNo">2452</span>  public void doTestDelete_AndPostInsert(Delete delete) throws IOException, InterruptedException {<a name="line.2452"></a>
-<span class="sourceLineNo">2453</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2453"></a>
-<span class="sourceLineNo">2454</span>    EnvironmentEdgeManagerTestHelper.injectEdge(new IncrementingEnvironmentEdge());<a name="line.2454"></a>
-<span class="sourceLineNo">2455</span>    Put put = new Put(row);<a name="line.2455"></a>
-<span class="sourceLineNo">2456</span>    put.addColumn(fam1, qual1, value1);<a name="line.2456"></a>
-<span class="sourceLineNo">2457</span>    region.put(put);<a name="line.2457"></a>
-<span class="sourceLineNo">2458</span><a name="line.2458"></a>
-<span class="sourceLineNo">2459</span>    // now delete the value:<a name="line.2459"></a>
-<span class="sourceLineNo">2460</span>    region.delete(delete);<a name="line.2460"></a>
+<span class="sourceLineNo">2120</span>    delete.addColumn(fam1, qual);<a name="line.2120"></a>
+<span class="sourceLineNo">2121</span>    region.delete(delete);<a name="line.2121"></a>
+<span class="sourceLineNo">2122</span><a name="line.2122"></a>
+<span class="sourceLineNo">2123</span>    Get get = new Get(row1);<a name="line.2123"></a>
+<span class="sourceLineNo">2124</span>    get.addFamily(fam1);<a name="line.2124"></a>
+<span class="sourceLineNo">2125</span>    Result r = region.get(get);<a name="line.2125"></a>
+<span class="sourceLineNo">2126</span>    assertEquals(0, r.size());<a name="line.2126"></a>
+<span class="sourceLineNo">2127</span>  }<a name="line.2127"></a>
+<span class="sourceLineNo">2128</span><a name="line.2128"></a>
+<span class="sourceLineNo">2129</span>  @Test<a name="line.2129"></a>
+<span class="sourceLineNo">2130</span>  public void testDelete_CheckFamily() throws IOException {<a name="line.2130"></a>
+<span class="sourceLineNo">2131</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2131"></a>
+<span class="sourceLineNo">2132</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2132"></a>
+<span class="sourceLineNo">2133</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2133"></a>
+<span class="sourceLineNo">2134</span>    byte[] fam3 = Bytes.toBytes("fam3");<a name="line.2134"></a>
+<span class="sourceLineNo">2135</span>    byte[] fam4 = Bytes.toBytes("fam4");<a name="line.2135"></a>
+<span class="sourceLineNo">2136</span><a name="line.2136"></a>
+<span class="sourceLineNo">2137</span>    // Setting up region<a name="line.2137"></a>
+<span class="sourceLineNo">2138</span>    this.region = initHRegion(tableName, method, CONF, fam1, fam2, fam3);<a name="line.2138"></a>
+<span class="sourceLineNo">2139</span>    List&lt;Cell&gt; kvs = new ArrayList&lt;&gt;();<a name="line.2139"></a>
+<span class="sourceLineNo">2140</span>    kvs.add(new KeyValue(row1, fam4, null, null));<a name="line.2140"></a>
+<span class="sourceLineNo">2141</span><a name="line.2141"></a>
+<span class="sourceLineNo">2142</span>    // testing existing family<a name="line.2142"></a>
+<span class="sourceLineNo">2143</span>    byte[] family = fam2;<a name="line.2143"></a>
+<span class="sourceLineNo">2144</span>    NavigableMap&lt;byte[], List&lt;Cell&gt;&gt; deleteMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2144"></a>
+<span class="sourceLineNo">2145</span>    deleteMap.put(family, kvs);<a name="line.2145"></a>
+<span class="sourceLineNo">2146</span>    region.delete(deleteMap, Durability.SYNC_WAL);<a name="line.2146"></a>
+<span class="sourceLineNo">2147</span><a name="line.2147"></a>
+<span class="sourceLineNo">2148</span>    // testing non existing family<a name="line.2148"></a>
+<span class="sourceLineNo">2149</span>    boolean ok = false;<a name="line.2149"></a>
+<span class="sourceLineNo">2150</span>    family = fam4;<a name="line.2150"></a>
+<span class="sourceLineNo">2151</span>    try {<a name="line.2151"></a>
+<span class="sourceLineNo">2152</span>      deleteMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2152"></a>
+<span class="sourceLineNo">2153</span>      deleteMap.put(family, kvs);<a name="line.2153"></a>
+<span class="sourceLineNo">2154</span>      region.delete(deleteMap, Durability.SYNC_WAL);<a name="line.2154"></a>
+<span class="sourceLineNo">2155</span>    } catch (Exception e) {<a name="line.2155"></a>
+<span class="sourceLineNo">2156</span>      ok = true;<a name="line.2156"></a>
+<span class="sourceLineNo">2157</span>    }<a name="line.2157"></a>
+<span class="sourceLineNo">2158</span>    assertTrue("Family " + new String(family, StandardCharsets.UTF_8) + " does exist", ok);<a name="line.2158"></a>
+<span class="sourceLineNo">2159</span>  }<a name="line.2159"></a>
+<span class="sourceLineNo">2160</span><a name="line.2160"></a>
+<span class="sourceLineNo">2161</span>  @Test<a name="line.2161"></a>
+<span class="sourceLineNo">2162</span>  public void testDelete_mixed() throws IOException, InterruptedException {<a name="line.2162"></a>
+<span class="sourceLineNo">2163</span>    byte[] fam = Bytes.toBytes("info");<a name="line.2163"></a>
+<span class="sourceLineNo">2164</span>    byte[][] families = { fam };<a name="line.2164"></a>
+<span class="sourceLineNo">2165</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2165"></a>
+<span class="sourceLineNo">2166</span>    EnvironmentEdgeManagerTestHelper.injectEdge(new IncrementingEnvironmentEdge());<a name="line.2166"></a>
+<span class="sourceLineNo">2167</span><a name="line.2167"></a>
+<span class="sourceLineNo">2168</span>    byte[] row = Bytes.toBytes("table_name");<a name="line.2168"></a>
+<span class="sourceLineNo">2169</span>    // column names<a name="line.2169"></a>
+<span class="sourceLineNo">2170</span>    byte[] serverinfo = Bytes.toBytes("serverinfo");<a name="line.2170"></a>
+<span class="sourceLineNo">2171</span>    byte[] splitA = Bytes.toBytes("splitA");<a name="line.2171"></a>
+<span class="sourceLineNo">2172</span>    byte[] splitB = Bytes.toBytes("splitB");<a name="line.2172"></a>
+<span class="sourceLineNo">2173</span><a name="line.2173"></a>
+<span class="sourceLineNo">2174</span>    // add some data:<a name="line.2174"></a>
+<span class="sourceLineNo">2175</span>    Put put = new Put(row);<a name="line.2175"></a>
+<span class="sourceLineNo">2176</span>    put.addColumn(fam, splitA, Bytes.toBytes("reference_A"));<a name="line.2176"></a>
+<span class="sourceLineNo">2177</span>    region.put(put);<a name="line.2177"></a>
+<span class="sourceLineNo">2178</span><a name="line.2178"></a>
+<span class="sourceLineNo">2179</span>    put = new Put(row);<a name="line.2179"></a>
+<span class="sourceLineNo">2180</span>    put.addColumn(fam, splitB, Bytes.toBytes("reference_B"));<a name="line.2180"></a>
+<span class="sourceLineNo">2181</span>    region.put(put);<a name="line.2181"></a>
+<span class="sourceLineNo">2182</span><a name="line.2182"></a>
+<span class="sourceLineNo">2183</span>    put = new Put(row);<a name="line.2183"></a>
+<span class="sourceLineNo">2184</span>    put.addColumn(fam, serverinfo, Bytes.toBytes("ip_address"));<a name="line.2184"></a>
+<span class="sourceLineNo">2185</span>    region.put(put);<a name="line.2185"></a>
+<span class="sourceLineNo">2186</span><a name="line.2186"></a>
+<span class="sourceLineNo">2187</span>    // ok now delete a split:<a name="line.2187"></a>
+<span class="sourceLineNo">2188</span>    Delete delete = new Delete(row);<a name="line.2188"></a>
+<span class="sourceLineNo">2189</span>    delete.addColumns(fam, splitA);<a name="line.2189"></a>
+<span class="sourceLineNo">2190</span>    region.delete(delete);<a name="line.2190"></a>
+<span class="sourceLineNo">2191</span><a name="line.2191"></a>
+<span class="sourceLineNo">2192</span>    // assert some things:<a name="line.2192"></a>
+<span class="sourceLineNo">2193</span>    Get get = new Get(row).addColumn(fam, serverinfo);<a name="line.2193"></a>
+<span class="sourceLineNo">2194</span>    Result result = region.get(get);<a name="line.2194"></a>
+<span class="sourceLineNo">2195</span>    assertEquals(1, result.size());<a name="line.2195"></a>
+<span class="sourceLineNo">2196</span><a name="line.2196"></a>
+<span class="sourceLineNo">2197</span>    get = new Get(row).addColumn(fam, splitA);<a name="line.2197"></a>
+<span class="sourceLineNo">2198</span>    result = region.get(get);<a name="line.2198"></a>
+<span class="sourceLineNo">2199</span>    assertEquals(0, result.size());<a name="line.2199"></a>
+<span class="sourceLineNo">2200</span><a name="line.2200"></a>
+<span class="sourceLineNo">2201</span>    get = new Get(row).addColumn(fam, splitB);<a name="line.2201"></a>
+<span class="sourceLineNo">2202</span>    result = region.get(get);<a name="line.2202"></a>
+<span class="sourceLineNo">2203</span>    assertEquals(1, result.size());<a name="line.2203"></a>
+<span class="sourceLineNo">2204</span><a name="line.2204"></a>
+<span class="sourceLineNo">2205</span>    // Assert that after a delete, I can put.<a name="line.2205"></a>
+<span class="sourceLineNo">2206</span>    put = new Put(row);<a name="line.2206"></a>
+<span class="sourceLineNo">2207</span>    put.addColumn(fam, splitA, Bytes.toBytes("reference_A"));<a name="line.2207"></a>
+<span class="sourceLineNo">2208</span>    region.put(put);<a name="line.2208"></a>
+<span class="sourceLineNo">2209</span>    get = new Get(row);<a name="line.2209"></a>
+<span class="sourceLineNo">2210</span>    result = region.get(get);<a name="line.2210"></a>
+<span class="sourceLineNo">2211</span>    assertEquals(3, result.size());<a name="line.2211"></a>
+<span class="sourceLineNo">2212</span><a name="line.2212"></a>
+<span class="sourceLineNo">2213</span>    // Now delete all... then test I can add stuff back<a name="line.2213"></a>
+<span class="sourceLineNo">2214</span>    delete = new Delete(row);<a name="line.2214"></a>
+<span class="sourceLineNo">2215</span>    region.delete(delete);<a name="line.2215"></a>
+<span class="sourceLineNo">2216</span>    assertEquals(0, region.get(get).size());<a name="line.2216"></a>
+<span class="sourceLineNo">2217</span><a name="line.2217"></a>
+<span class="sourceLineNo">2218</span>    region.put(new Put(row).addColumn(fam, splitA, Bytes.toBytes("reference_A")));<a name="line.2218"></a>
+<span class="sourceLineNo">2219</span>    result = region.get(get);<a name="line.2219"></a>
+<span class="sourceLineNo">2220</span>    assertEquals(1, result.size());<a name="line.2220"></a>
+<span class="sourceLineNo">2221</span>  }<a name="line.2221"></a>
+<span class="sourceLineNo">2222</span><a name="line.2222"></a>
+<span class="sourceLineNo">2223</span>  @Test<a name="line.2223"></a>
+<span class="sourceLineNo">2224</span>  public void testDeleteRowWithFutureTs() throws IOException {<a name="line.2224"></a>
+<span class="sourceLineNo">2225</span>    byte[] fam = Bytes.toBytes("info");<a name="line.2225"></a>
+<span class="sourceLineNo">2226</span>    byte[][] families = { fam };<a name="line.2226"></a>
+<span class="sourceLineNo">2227</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2227"></a>
+<span class="sourceLineNo">2228</span>    byte[] row = Bytes.toBytes("table_name");<a name="line.2228"></a>
+<span class="sourceLineNo">2229</span>    // column names<a name="line.2229"></a>
+<span class="sourceLineNo">2230</span>    byte[] serverinfo = Bytes.toBytes("serverinfo");<a name="line.2230"></a>
+<span class="sourceLineNo">2231</span><a name="line.2231"></a>
+<span class="sourceLineNo">2232</span>    // add data in the far future<a name="line.2232"></a>
+<span class="sourceLineNo">2233</span>    Put put = new Put(row);<a name="line.2233"></a>
+<span class="sourceLineNo">2234</span>    put.addColumn(fam, serverinfo, HConstants.LATEST_TIMESTAMP - 5, Bytes.toBytes("value"));<a name="line.2234"></a>
+<span class="sourceLineNo">2235</span>    region.put(put);<a name="line.2235"></a>
+<span class="sourceLineNo">2236</span><a name="line.2236"></a>
+<span class="sourceLineNo">2237</span>    // now delete something in the present<a name="line.2237"></a>
+<span class="sourceLineNo">2238</span>    Delete delete = new Delete(row);<a name="line.2238"></a>
+<span class="sourceLineNo">2239</span>    region.delete(delete);<a name="line.2239"></a>
+<span class="sourceLineNo">2240</span><a name="line.2240"></a>
+<span class="sourceLineNo">2241</span>    // make sure we still see our data<a name="line.2241"></a>
+<span class="sourceLineNo">2242</span>    Get get = new Get(row).addColumn(fam, serverinfo);<a name="line.2242"></a>
+<span class="sourceLineNo">2243</span>    Result result = region.get(get);<a name="line.2243"></a>
+<span class="sourceLineNo">2244</span>    assertEquals(1, result.size());<a name="line.2244"></a>
+<span class="sourceLineNo">2245</span><a name="line.2245"></a>
+<span class="sourceLineNo">2246</span>    // delete the future row<a name="line.2246"></a>
+<span class="sourceLineNo">2247</span>    delete = new Delete(row, HConstants.LATEST_TIMESTAMP - 3);<a name="line.2247"></a>
+<span class="sourceLineNo">2248</span>    region.delete(delete);<a name="line.2248"></a>
+<span class="sourceLineNo">2249</span><a name="line.2249"></a>
+<span class="sourceLineNo">2250</span>    // make sure it is gone<a name="line.2250"></a>
+<span class="sourceLineNo">2251</span>    get = new Get(row).addColumn(fam, serverinfo);<a name="line.2251"></a>
+<span class="sourceLineNo">2252</span>    result = region.get(get);<a name="line.2252"></a>
+<span class="sourceLineNo">2253</span>    assertEquals(0, result.size());<a name="line.2253"></a>
+<span class="sourceLineNo">2254</span>  }<a name="line.2254"></a>
+<span class="sourceLineNo">2255</span><a name="line.2255"></a>
+<span class="sourceLineNo">2256</span>  /**<a name="line.2256"></a>
+<span class="sourceLineNo">2257</span>   * Tests that the special LATEST_TIMESTAMP option for puts gets replaced by<a name="line.2257"></a>
+<span class="sourceLineNo">2258</span>   * the actual timestamp<a name="line.2258"></a>
+<span class="sourceLineNo">2259</span>   */<a name="line.2259"></a>
+<span class="sourceLineNo">2260</span>  @Test<a name="line.2260"></a>
+<span class="sourceLineNo">2261</span>  public void testPutWithLatestTS() throws IOException {<a name="line.2261"></a>
+<span class="sourceLineNo">2262</span>    byte[] fam = Bytes.toBytes("info");<a name="line.2262"></a>
+<span class="sourceLineNo">2263</span>    byte[][] families = { fam };<a name="line.2263"></a>
+<span class="sourceLineNo">2264</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2264"></a>
+<span class="sourceLineNo">2265</span>    byte[] row = Bytes.toBytes("row1");<a name="line.2265"></a>
+<span class="sourceLineNo">2266</span>    // column names<a name="line.2266"></a>
+<span class="sourceLineNo">2267</span>    byte[] qual = Bytes.toBytes("qual");<a name="line.2267"></a>
+<span class="sourceLineNo">2268</span><a name="line.2268"></a>
+<span class="sourceLineNo">2269</span>    // add data with LATEST_TIMESTAMP, put without WAL<a name="line.2269"></a>
+<span class="sourceLineNo">2270</span>    Put put = new Put(row);<a name="line.2270"></a>
+<span class="sourceLineNo">2271</span>    put.addColumn(fam, qual, HConstants.LATEST_TIMESTAMP, Bytes.toBytes("value"));<a name="line.2271"></a>
+<span class="sourceLineNo">2272</span>    region.put(put);<a name="line.2272"></a>
+<span class="sourceLineNo">2273</span><a name="line.2273"></a>
+<span class="sourceLineNo">2274</span>    // Make sure it shows up with an actual timestamp<a name="line.2274"></a>
+<span class="sourceLineNo">2275</span>    Get get = new Get(row).addColumn(fam, qual);<a name="line.2275"></a>
+<span class="sourceLineNo">2276</span>    Result result = region.get(get);<a name="line.2276"></a>
+<span class="sourceLineNo">2277</span>    assertEquals(1, result.size());<a name="line.2277"></a>
+<span class="sourceLineNo">2278</span>    Cell kv = result.rawCells()[0];<a name="line.2278"></a>
+<span class="sourceLineNo">2279</span>    LOG.info("Got: " + kv);<a name="line.2279"></a>
+<span class="sourceLineNo">2280</span>    assertTrue("LATEST_TIMESTAMP was not replaced with real timestamp",<a name="line.2280"></a>
+<span class="sourceLineNo">2281</span>        kv.getTimestamp() != HConstants.LATEST_TIMESTAMP);<a name="line.2281"></a>
+<span class="sourceLineNo">2282</span><a name="line.2282"></a>
+<span class="sourceLineNo">2283</span>    // Check same with WAL enabled (historically these took different<a name="line.2283"></a>
+<span class="sourceLineNo">2284</span>    // code paths, so check both)<a name="line.2284"></a>
+<span class="sourceLineNo">2285</span>    row = Bytes.toBytes("row2");<a name="line.2285"></a>
+<span class="sourceLineNo">2286</span>    put = new Put(row);<a name="line.2286"></a>
+<span class="sourceLineNo">2287</span>    put.addColumn(fam, qual, HConstants.LATEST_TIMESTAMP, Bytes.toBytes("value"));<a name="line.2287"></a>
+<span class="sourceLineNo">2288</span>    region.put(put);<a name="line.2288"></a>
+<span class="sourceLineNo">2289</span><a name="line.2289"></a>
+<span class="sourceLineNo">2290</span>    // Make sure it shows up with an actual timestamp<a name="line.2290"></a>
+<span class="sourceLineNo">2291</span>    get = new Get(row).addColumn(fam, qual);<a name="line.2291"></a>
+<span class="sourceLineNo">2292</span>    result = region.get(get);<a name="line.2292"></a>
+<span class="sourceLineNo">2293</span>    assertEquals(1, result.size());<a name="line.2293"></a>
+<span class="sourceLineNo">2294</span>    kv = result.rawCells()[0];<a name="line.2294"></a>
+<span class="sourceLineNo">2295</span>    LOG.info("Got: " + kv);<a name="line.2295"></a>
+<span class="sourceLineNo">2296</span>    assertTrue("LATEST_TIMESTAMP was not replaced with real timestamp",<a name="line.2296"></a>
+<span class="sourceLineNo">2297</span>        kv.getTimestamp() != HConstants.LATEST_TIMESTAMP);<a name="line.2297"></a>
+<span class="sourceLineNo">2298</span>  }<a name="line.2298"></a>
+<span class="sourceLineNo">2299</span><a name="line.2299"></a>
+<span class="sourceLineNo">2300</span>  /**<a name="line.2300"></a>
+<span class="sourceLineNo">2301</span>   * Tests that there is server-side filtering for invalid timestamp upper<a name="line.2301"></a>
+<span class="sourceLineNo">2302</span>   * bound. Note that the timestamp lower bound is automatically handled for us<a name="line.2302"></a>
+<span class="sourceLineNo">2303</span>   * by the TTL field.<a name="line.2303"></a>
+<span class="sourceLineNo">2304</span>   */<a name="line.2304"></a>
+<span class="sourceLineNo">2305</span>  @Test<a name="line.2305"></a>
+<span class="sourceLineNo">2306</span>  public void testPutWithTsSlop() throws IOException {<a name="line.2306"></a>
+<span class="sourceLineNo">2307</span>    byte[] fam = Bytes.toBytes("info");<a name="line.2307"></a>
+<span class="sourceLineNo">2308</span>    byte[][] families = { fam };<a name="line.2308"></a>
+<span class="sourceLineNo">2309</span><a name="line.2309"></a>
+<span class="sourceLineNo">2310</span>    // add data with a timestamp that is too recent for range. Ensure assert<a name="line.2310"></a>
+<span class="sourceLineNo">2311</span>    CONF.setInt("hbase.hregion.keyvalue.timestamp.slop.millisecs", 1000);<a name="line.2311"></a>
+<span class="sourceLineNo">2312</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2312"></a>
+<span class="sourceLineNo">2313</span>    boolean caughtExcep = false;<a name="line.2313"></a>
+<span class="sourceLineNo">2314</span>    try {<a name="line.2314"></a>
+<span class="sourceLineNo">2315</span>      // no TS specified == use latest. should not error<a name="line.2315"></a>
+<span class="sourceLineNo">2316</span>      region.put(new Put(row).addColumn(fam, Bytes.toBytes("qual"), Bytes.toBytes("value")));<a name="line.2316"></a>
+<span class="sourceLineNo">2317</span>      // TS out of range. should error<a name="line.2317"></a>
+<span class="sourceLineNo">2318</span>      region.put(new Put(row).addColumn(fam, Bytes.toBytes("qual"),<a name="line.2318"></a>
+<span class="sourceLineNo">2319</span>          System.currentTimeMillis() + 2000, Bytes.toBytes("value")));<a name="line.2319"></a>
+<span class="sourceLineNo">2320</span>      fail("Expected IOE for TS out of configured timerange");<a name="line.2320"></a>
+<span class="sourceLineNo">2321</span>    } catch (FailedSanityCheckException ioe) {<a name="line.2321"></a>
+<span class="sourceLineNo">2322</span>      LOG.debug("Received expected exception", ioe);<a name="line.2322"></a>
+<span class="sourceLineNo">2323</span>      caughtExcep = true;<a name="line.2323"></a>
+<span class="sourceLineNo">2324</span>    }<a name="line.2324"></a>
+<span class="sourceLineNo">2325</span>    assertTrue("Should catch FailedSanityCheckException", caughtExcep);<a name="line.2325"></a>
+<span class="sourceLineNo">2326</span>  }<a name="line.2326"></a>
+<span class="sourceLineNo">2327</span><a name="line.2327"></a>
+<span class="sourceLineNo">2328</span>  @Test<a name="line.2328"></a>
+<span class="sourceLineNo">2329</span>  public void testScanner_DeleteOneFamilyNotAnother() throws IOException {<a name="line.2329"></a>
+<span class="sourceLineNo">2330</span>    byte[] fam1 = Bytes.toBytes("columnA");<a name="line.2330"></a>
+<span class="sourceLineNo">2331</span>    byte[] fam2 = Bytes.toBytes("columnB");<a name="line.2331"></a>
+<span class="sourceLineNo">2332</span>    this.region = initHRegion(tableName, method, CONF, fam1, fam2);<a name="line.2332"></a>
+<span class="sourceLineNo">2333</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.2333"></a>
+<span class="sourceLineNo">2334</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.2334"></a>
+<span class="sourceLineNo">2335</span><a name="line.2335"></a>
+<span class="sourceLineNo">2336</span>    byte[] value = Bytes.toBytes("value");<a name="line.2336"></a>
+<span class="sourceLineNo">2337</span><a name="line.2337"></a>
+<span class="sourceLineNo">2338</span>    Delete delete = new Delete(rowA);<a name="line.2338"></a>
+<span class="sourceLineNo">2339</span>    delete.addFamily(fam1);<a name="line.2339"></a>
+<span class="sourceLineNo">2340</span><a name="line.2340"></a>
+<span class="sourceLineNo">2341</span>    region.delete(delete);<a name="line.2341"></a>
+<span class="sourceLineNo">2342</span><a name="line.2342"></a>
+<span class="sourceLineNo">2343</span>    // now create data.<a name="line.2343"></a>
+<span class="sourceLineNo">2344</span>    Put put = new Put(rowA);<a name="line.2344"></a>
+<span class="sourceLineNo">2345</span>    put.addColumn(fam2, null, value);<a name="line.2345"></a>
+<span class="sourceLineNo">2346</span>    region.put(put);<a name="line.2346"></a>
+<span class="sourceLineNo">2347</span><a name="line.2347"></a>
+<span class="sourceLineNo">2348</span>    put = new Put(rowB);<a name="line.2348"></a>
+<span class="sourceLineNo">2349</span>    put.addColumn(fam1, null, value);<a name="line.2349"></a>
+<span class="sourceLineNo">2350</span>    put.addColumn(fam2, null, value);<a name="line.2350"></a>
+<span class="sourceLineNo">2351</span>    region.put(put);<a name="line.2351"></a>
+<span class="sourceLineNo">2352</span><a name="line.2352"></a>
+<span class="sourceLineNo">2353</span>    Scan scan = new Scan();<a name="line.2353"></a>
+<span class="sourceLineNo">2354</span>    scan.addFamily(fam1).addFamily(fam2);<a name="line.2354"></a>
+<span class="sourceLineNo">2355</span>    InternalScanner s = region.getScanner(scan);<a name="line.2355"></a>
+<span class="sourceLineNo">2356</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.2356"></a>
+<span class="sourceLineNo">2357</span>    s.next(results);<a name="line.2357"></a>
+<span class="sourceLineNo">2358</span>    assertTrue(CellUtil.matchingRows(results.get(0), rowA));<a name="line.2358"></a>
+<span class="sourceLineNo">2359</span><a name="line.2359"></a>
+<span class="sourceLineNo">2360</span>    results.clear();<a name="line.2360"></a>
+<span class="sourceLineNo">2361</span>    s.next(results);<a name="line.2361"></a>
+<span class="sourceLineNo">2362</span>    assertTrue(CellUtil.matchingRows(results.get(0), rowB));<a name="line.2362"></a>
+<span class="sourceLineNo">2363</span>  }<a name="line.2363"></a>
+<span class="sourceLineNo">2364</span><a name="line.2364"></a>
+<span class="sourceLineNo">2365</span>  @Test<a name="line.2365"></a>
+<span class="sourceLineNo">2366</span>  public void testDataInMemoryWithoutWAL() throws IOException {<a name="line.2366"></a>
+<span class="sourceLineNo">2367</span>    FileSystem fs = FileSystem.get(CONF);<a name="line.2367"></a>
+<span class="sourceLineNo">2368</span>    Path rootDir = new Path(dir + "testDataInMemoryWithoutWAL");<a name="line.2368"></a>
+<span class="sourceLineNo">2369</span>    FSHLog hLog = new FSHLog(fs, rootDir, "testDataInMemoryWithoutWAL", CONF);<a name="line.2369"></a>
+<span class="sourceLineNo">2370</span>    hLog.init();<a name="line.2370"></a>
+<span class="sourceLineNo">2371</span>    // This chunk creation is done throughout the code base. Do we want to move it into core?<a name="line.2371"></a>
+<span class="sourceLineNo">2372</span>    // It is missing from this test. W/o it we NPE.<a name="line.2372"></a>
+<span class="sourceLineNo">2373</span>    ChunkCreator.initialize(MemStoreLABImpl.CHUNK_SIZE_DEFAULT, false, 0, 0, 0, null);<a name="line.2373"></a>
+<span class="sourceLineNo">2374</span>    region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, hLog,<a name="line.2374"></a>
+<span class="sourceLineNo">2375</span>        COLUMN_FAMILY_BYTES);<a name="line.2375"></a>
+<span class="sourceLineNo">2376</span><a name="line.2376"></a>
+<span class="sourceLineNo">2377</span>    Cell originalCell = CellUtil.createCell(row, COLUMN_FAMILY_BYTES, qual1,<a name="line.2377"></a>
+<span class="sourceLineNo">2378</span>      System.currentTimeMillis(), KeyValue.Type.Put.getCode(), value1);<a name="line.2378"></a>
+<span class="sourceLineNo">2379</span>    final long originalSize = originalCell.getSerializedSize();<a name="line.2379"></a>
+<span class="sourceLineNo">2380</span><a name="line.2380"></a>
+<span class="sourceLineNo">2381</span>    Cell addCell = CellUtil.createCell(row, COLUMN_FAMILY_BYTES, qual1,<a name="line.2381"></a>
+<span class="sourceLineNo">2382</span>      System.currentTimeMillis(), KeyValue.Type.Put.getCode(), Bytes.toBytes("xxxxxxxxxx"));<a name="line.2382"></a>
+<span class="sourceLineNo">2383</span>    final long addSize = addCell.getSerializedSize();<a name="line.2383"></a>
+<span class="sourceLineNo">2384</span><a name="line.2384"></a>
+<span class="sourceLineNo">2385</span>    LOG.info("originalSize:" + originalSize<a name="line.2385"></a>
+<span class="sourceLineNo">2386</span>      + ", addSize:" + addSize);<a name="line.2386"></a>
+<span class="sourceLineNo">2387</span>    // start test. We expect that the addPut's durability will be replaced<a name="line.2387"></a>
+<span class="sourceLineNo">2388</span>    // by originalPut's durability.<a name="line.2388"></a>
+<span class="sourceLineNo">2389</span><a name="line.2389"></a>
+<span class="sourceLineNo">2390</span>    // case 1:<a name="line.2390"></a>
+<span class="sourceLineNo">2391</span>    testDataInMemoryWithoutWAL(region,<a name="line.2391"></a>
+<span class="sourceLineNo">2392</span>            new Put(row).add(originalCell).setDurability(Durability.SKIP_WAL),<a name="line.2392"></a>
+<span class="sourceLineNo">2393</span>            new Put(row).add(addCell).setDurability(Durability.SKIP_WAL),<a name="line.2393"></a>
+<span class="sourceLineNo">2394</span>            originalSize + addSize);<a name="line.2394"></a>
+<span class="sourceLineNo">2395</span><a name="line.2395"></a>
+<span class="sourceLineNo">2396</span>    // case 2:<a name="line.2396"></a>
+<span class="sourceLineNo">2397</span>    testDataInMemoryWithoutWAL(region,<a name="line.2397"></a>
+<span class="sourceLineNo">2398</span>            new Put(row).add(originalCell).setDurability(Durability.SKIP_WAL),<a name="line.2398"></a>
+<span class="sourceLineNo">2399</span>            new Put(row).add(addCell).setDurability(Durability.SYNC_WAL),<a name="line.2399"></a>
+<span class="sourceLineNo">2400</span>            originalSize + addSize);<a name="line.2400"></a>
+<span class="sourceLineNo">2401</span><a name="line.2401"></a>
+<span class="sourceLineNo">2402</span>    // case 3:<a name="line.2402"></a>
+<span class="sourceLineNo">2403</span>    testDataInMemoryWithoutWAL(region,<a name="line.2403"></a>
+<span class="sourceLineNo">2404</span>            new Put(row).add(originalCell).setDurability(Durability.SYNC_WAL),<a name="line.2404"></a>
+<span class="sourceLineNo">2405</span>            new Put(row).add(addCell).setDurability(Durability.SKIP_WAL),<a name="line.2405"></a>
+<span class="sourceLineNo">2406</span>            0);<a name="line.2406"></a>
+<span class="sourceLineNo">2407</span><a name="line.2407"></a>
+<span class="sourceLineNo">2408</span>    // case 4:<a name="line.2408"></a>
+<span class="sourceLineNo">2409</span>    testDataInMemoryWithoutWAL(region,<a name="line.2409"></a>
+<span class="sourceLineNo">2410</span>            new Put(row).add(originalCell).setDurability(Durability.SYNC_WAL),<a name="line.2410"></a>
+<span class="sourceLineNo">2411</span>            new Put(row).add(addCell).setDurability(Durability.SYNC_WAL),<a name="line.2411"></a>
+<span class="sourceLineNo">2412</span>            0);<a name="line.2412"></a>
+<span class="sourceLineNo">2413</span>  }<a name="line.2413"></a>
+<span class="sourceLineNo">2414</span><a name="line.2414"></a>
+<span class="sourceLineNo">2415</span>  private static void testDataInMemoryWithoutWAL(HRegion region, Put originalPut,<a name="line.2415"></a>
+<span class="sourceLineNo">2416</span>          final Put addPut, long delta) throws IOException {<a name="line.2416"></a>
+<span class="sourceLineNo">2417</span>    final long initSize = region.getDataInMemoryWithoutWAL();<a name="line.2417"></a>
+<span class="sourceLineNo">2418</span>    // save normalCPHost and replaced by mockedCPHost<a name="line.2418"></a>
+<span class="sourceLineNo">2419</span>    RegionCoprocessorHost normalCPHost = region.getCoprocessorHost();<a name="line.2419"></a>
+<span class="sourceLineNo">2420</span>    RegionCoprocessorHost mockedCPHost = Mockito.mock(RegionCoprocessorHost.class);<a name="line.2420"></a>
+<span class="sourceLineNo">2421</span>    // Because the preBatchMutate returns void, we can't do usual Mockito when...then form. Must<a name="line.2421"></a>
+<span class="sourceLineNo">2422</span>    // do below format (from Mockito doc).<a name="line.2422"></a>
+<span class="sourceLineNo">2423</span>    Mockito.doAnswer(new Answer&lt;Void&gt;() {<a name="line.2423"></a>
+<span class="sourceLineNo">2424</span>      @Override<a name="line.2424"></a>
+<span class="sourceLineNo">2425</span>      public Void answer(InvocationOnMock invocation) throws Throwable {<a name="line.2425"></a>
+<span class="sourceLineNo">2426</span>        MiniBatchOperationInProgress&lt;Mutation&gt; mb = invocation.getArgument(0);<a name="line.2426"></a>
+<span class="sourceLineNo">2427</span>        mb.addOperationsFromCP(0, new Mutation[]{addPut});<a name="line.2427"></a>
+<span class="sourceLineNo">2428</span>        return null;<a name="line.2428"></a>
+<span class="sourceLineNo">2429</span>      }<a name="line.2429"></a>
+<span class="sourceLineNo">2430</span>    }).when(mockedCPHost).preBatchMutate(Mockito.isA(MiniBatchOperationInProgress.class));<a name="line.2430"></a>
+<span class="sourceLineNo">2431</span>    ColumnFamilyDescriptorBuilder builder = ColumnFamilyDescriptorBuilder.<a name="line.2431"></a>
+<span class="sourceLineNo">2432</span>        newBuilder(COLUMN_FAMILY_BYTES);<a name="line.2432"></a>
+<span class="sourceLineNo">2433</span>    ScanInfo info = new ScanInfo(CONF, builder.build(), Long.MAX_VALUE,<a name="line.2433"></a>
+<span class="sourceLineNo">2434</span>        Long.MAX_VALUE, region.getCellComparator());<a name="line.2434"></a>
+<span class="sourceLineNo">2435</span>    Mockito.when(mockedCPHost.preFlushScannerOpen(Mockito.any(HStore.class),<a name="line.2435"></a>
+<span class="sourceLineNo">2436</span>        Mockito.any())).thenReturn(info);<a name="line.2436"></a>
+<span class="sourceLineNo">2437</span>    Mockito.when(mockedCPHost.preFlush(Mockito.any(), Mockito.any(StoreScanner.class),<a name="line.2437"></a>
+<span class="sourceLineNo">2438</span>        Mockito.any())).thenAnswer(i -&gt; i.getArgument(1));<a name="line.2438"></a>
+<span class="sourceLineNo">2439</span>    region.setCoprocessorHost(mockedCPHost);<a name="line.2439"></a>
+<span class="sourceLineNo">2440</span><a name="line.2440"></a>
+<span class="sourceLineNo">2441</span>    region.put(originalPut);<a name="line.2441"></a>
+<span class="sourceLineNo">2442</span>    region.setCoprocessorHost(normalCPHost);<a name="line.2442"></a>
+<span class="sourceLineNo">2443</span>    final long finalSize = region.getDataInMemoryWithoutWAL();<a name="line.2443"></a>
+<span class="sourceLineNo">2444</span>    assertEquals("finalSize:" + finalSize + ", initSize:"<a name="line.2444"></a>
+<span class="sourceLineNo">2445</span>      + initSize + ", delta:" + delta,finalSize, initSize + delta);<a name="line.2445"></a>
+<span class="sourceLineNo">2446</span>  }<a name="line.2446"></a>
+<span class="sourceLineNo">2447</span><a name="line.2447"></a>
+<span class="sourceLineNo">2448</span>  @Test<a name="line.2448"></a>
+<span class="sourceLineNo">2449</span>  public void testDeleteColumns_PostInsert() throws IOException, InterruptedException {<a name="line.2449"></a>
+<span class="sourceLineNo">2450</span>    Delete delete = new Delete(row);<a name="line.2450"></a>
+<span class="sourceLineNo">2451</span>    delete.addColumns(fam1, qual1);<a name="line.2451"></a>
+<span class="sourceLineNo">2452</span>    doTestDelete_AndPostInsert(delete);<a name="line.2452"></a>
+<span class="sourceLineNo">2453</span>  }<a name="line.2453"></a>
+<span class="sourceLineNo">2454</span><a name="line.2454"></a>
+<span class="sourceLineNo">2455</span>  @Test<a name="line.2455"></a>
+<span class="sourceLineNo">2456</span>  public void testaddFamily_PostInsert() throws IOException, InterruptedException {<a name="line.2456"></a>
+<span class="sourceLineNo">2457</span>    Delete delete = new Delete(row);<a name="line.2457"></a>
+<span class="sourceLineNo">2458</span>    delete.addFamily(fam1);<a name="line.2458"></a>
+<span class="sourceLineNo">2459</span>    doTestDelete_AndPostInsert(delete);<a name="line.2459"></a>
+<span class="sourceLineNo">2460</span>  }<a name="line.2460"></a>
 <span class="sourceLineNo">2461</span><a name="line.2461"></a>
-<span class="sourceLineNo">2462</span>    // ok put data:<a name="line.2462"></a>
-<span class="sourceLineNo">2463</span>    put = new Put(row);<a name="line.2463"></a>
-<span class="sourceLineNo">2464</span>    put.addColumn(fam1, qual1, value2);<a name="line.2464"></a>
-<span class="sourceLineNo">2465</span>    region.put(put);<a name="line.2465"></a>
-<span class="sourceLineNo">2466</span><a name="line.2466"></a>
-<span class="sourceLineNo">2467</span>    // ok get:<a name="line.2467"></a>
-<span class="sourceLineNo">2468</span>    Get get = new Get(row);<a name="line.2468"></a>
-<span class="sourceLineNo">2469</span>    get.addColumn(fam1, qual1);<a name="line.2469"></a>
-<span class="sourceLineNo">2470</span><a name="line.2470"></a>
-<span class="sourceLineNo">2471</span>    Result r = region.get(get);<a name="line.2471"></a>
-<span class="sourceLineNo">2472</span>    assertEquals(1, r.size());<a name="line.2472"></a>
-<span class="sourceLineNo">2473</span>    assertArrayEquals(value2, r.getValue(fam1, qual1));<a name="line.2473"></a>
-<span class="sourceLineNo">2474</span><a name="line.2474"></a>
-<span class="sourceLineNo">2475</span>    // next:<a name="line.2475"></a>
-<span class="sourceLineNo">2476</span>    Scan scan = new Scan(row);<a name="line.2476"></a>
-<span class="sourceLineNo">2477</span>    scan.addColumn(fam1, qual1);<a name="line.2477"></a>
-<span class="sourceLineNo">2478</span>    InternalScanner s = region.getScanner(scan);<a name="line.2478"></a>
-<span class="sourceLineNo">2479</span><a name="line.2479"></a>
-<span class="sourceLineNo">2480</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.2480"></a>
-<span class="sourceLineNo">2481</span>    assertEquals(false, s.next(results));<a name="line.2481"></a>
-<span class="sourceLineNo">2482</span>    assertEquals(1, results.size());<a name="line.2482"></a>
-<span class="sourceLineNo">2483</span>    Cell kv = results.get(0);<a name="line.2483"></a>
+<span class="sourceLineNo">2462</span>  public void doTestDelete_AndPostInsert(Delete delete) throws IOException, InterruptedException {<a name="line.2462"></a>
+<span class="sourceLineNo">2463</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2463"></a>
+<span class="sourceLineNo">2464</span>    EnvironmentEdgeManagerTestHelper.injectEdge(new IncrementingEnvironmentEdge());<a name="line.2464"></a>
+<span class="sourceLineNo">2465</span>    Put put = new Put(row);<a name="line.2465"></a>
+<span class="sourceLineNo">2466</span>    put.addColumn(fam1, qual1, value1);<a name="line.2466"></a>
+<span class="sourceLineNo">2467</span>    region.put(put);<a name="line.2467"></a>
+<span class="sourceLineNo">2468</span><a name="line.2468"></a>
+<span class="sourceLineNo">2469</span>    // now delete the value:<a name="line.2469"></a>
+<span class="sourceLineNo">2470</span>    region.delete(delete);<a name="line.2470"></a>
+<span class="sourceLineNo">2471</span><a name="line.2471"></a>
+<span class="sourceLineNo">2472</span>    // ok put data:<a name="line.2472"></a>
+<span class="sourceLineNo">2473</span>    put = new Put(row);<a name="line.2473"></a>
+<span class="sourceLineNo">2474</span>    put.addColumn(fam1, qual1, value2);<a name="line.2474"></a>
+<span class="sourceLineNo">2475</span>    region.put(put);<a name="line.2475"></a>
+<span class="sourceLineNo">2476</span><a name="line.2476"></a>
+<span class="sourceLineNo">2477</span>    // ok get:<a name="line.2477"></a>
+<span class="sourceLineNo">2478</span>    Get get = new Get(row);<a name="line.2478"></a>
+<span class="sourceLineNo">2479</span>    get.addColumn(fam1, qual1);<a name="line.2479"></a>
+<span class="sourceLineNo">2480</span><a name="line.2480"></a>
+<span class="sourceLineNo">2481</span>    Result r = region.get(get);<a name="line.2481"></a>
+<span class="sourceLineNo">2482</span>    assertEquals(1, r.size());<a name="line.2482"></a>
+<span class="sourceLineNo">2483</span>    assertArrayEquals(value2, r.getValue(fam1, qual1));<a name="line.2483"></a>
 <span class="sourceLineNo">2484</span><a name="line.2484"></a>
-<span class="sourceLineNo">2485</span>    assertArrayEquals(value2, CellUtil.cloneValue(kv));<a name="line.2485"></a>
-<span class="sourceLineNo">2486</span>    assertArrayEquals(fam1, CellUtil.cloneFamily(kv));<a name="line.2486"></a>
-<span class="sourceLineNo">2487</span>    assertArrayEquals(qual1, CellUtil.cloneQualifier(kv));<a name="line.2487"></a>
-<span class="sourceLineNo">2488</span>    assertArrayEquals(row, CellUtil.cloneRow(kv));<a name="line.2488"></a>
-<span class="sourceLineNo">2489</span>  }<a name="line.2489"></a>
-<span class="sourceLineNo">2490</span><a name="line.2490"></a>
-<span class="sourceLineNo">2491</span>  @Test<a name="line.2491"></a>
-<span class="sourceLineNo">2492</span>  public void testDelete_CheckTimestampUpdated() throws IOException {<a name="line.2492"></a>
-<span class="sourceLineNo">2493</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2493"></a>
-<span class="sourceLineNo">2494</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.2494"></a>
-<span class="sourceLineNo">2495</span>    byte[] col2 = Bytes.toBytes("col2");<a name="line.2495"></a>
-<span class="sourceLineNo">2496</span>    byte[] col3 = Bytes.toBytes("col3");<a name="line.2496"></a>
-<span class="sourceLineNo">2497</span><a name="line.2497"></a>
-<span class="sourceLineNo">2498</span>    // Setting up region<a name="line.2498"></a>
-<span class="sourceLineNo">2499</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2499"></a>
-<span class="sourceLineNo">2500</span>    // Building checkerList<a name="line.2500"></a>
-<span class="sourceLineNo">2501</span>    List&lt;Cell&gt; kvs = new ArrayList&lt;&gt;();<a name="line.2501"></a>
-<span class="sourceLineNo">2502</span>    kvs.add(new KeyValue(row1, fam1, col1, null));<a name="line.2502"></a>
-<span class="sourceLineNo">2503</span>    kvs.add(new KeyValue(row1, fam1, col2, null));<a name="line.2503"></a>
-<span class="sourceLineNo">2504</span>    kvs.add(new KeyValue(row1, fam1, col3, null));<a name="line.2504"></a>
-<span class="sourceLineNo">2505</span><a name="line.2505"></a>
-<span class="sourceLineNo">2506</span>    NavigableMap&lt;byte[], List&lt;Cell&gt;&gt; deleteMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2506"></a>
-<span class="sourceLineNo">2507</span>    deleteMap.put(fam1, kvs);<a name="line.2507"></a>
-<span class="sourceLineNo">2508</span>    region.delete(deleteMap, Durability.SYNC_WAL);<a name="line.2508"></a>
-<span class="sourceLineNo">2509</span><a name="line.2509"></a>
-<span class="sourceLineNo">2510</span>    // extract the key values out the memstore:<a name="line.2510"></a>
-<span class="sourceLineNo">2511</span>    // This is kinda hacky, but better than nothing...<a name="line.2511"></a>
-<span class="sourceLineNo">2512</span>    long now = System.currentTimeMillis();<a name="line.2512"></a>
-<span class="sourceLineNo">2513</span>    AbstractMemStore memstore = (AbstractMemStore)region.getStore(fam1).memstore;<a name="line.2513"></a>
-<span class="sourceLineNo">2514</span>    Cell firstCell = memstore.getActive().first();<a name="line.2514"></a>
-<span class="sourceLineNo">2515</span>    assertTrue(firstCell.getTimestamp() &lt;= now);<a name="line.2515"></a>
-<span class="sourceLineNo">2516</span>    now = firstCell.getTimestamp();<a name="line.2516"></a>
-<span class="sourceLineNo">2517</span>    for (Cell cell : memstore.getActive().getCellSet()) {<a name="line.2517"></a>
-<span class="sourceLineNo">2518</span>      assertTrue(cell.getTimestamp() &lt;= now);<a name="line.2518"></a>
-<span class="sourceLineNo">2519</span>      now = cell.getTimestamp();<a name="line.2519"></a>
-<span class="sourceLineNo">2520</span>    }<a name="line.2520"></a>
-<span class="sourceLineNo">2521</span>  }<a name="line.2521"></a>
-<span class="sourceLineNo">2522</span><a name="line.2522"></a>
-<span class="sourceLineNo">2523</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2523"></a>
-<span class="sourceLineNo">2524</span>  // Get tests<a name="line.2524"></a>
-<span class="sourceLineNo">2525</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2525"></a>
-<span class="sourceLineNo">2526</span>  @Test<a name="line.2526"></a>
-<span class="sourceLineNo">2527</span>  public void testGet_FamilyChecker() throws IOException {<a name="line.2527"></a>
-<span class="sourceLineNo">2528</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2528"></a>
-<span class="sourceLineNo">2529</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2529"></a>
-<span class="sourceLineNo">2530</span>    byte[] fam2 = Bytes.toBytes("False");<a name="line.2530"></a>
-<span class="sourceLineNo">2531</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.2531"></a>
+<span class="sourceLineNo">2485</span>    // next:<a name="line.2485"></a>
+<span class="sourceLineNo">2486</span>    Scan scan = new Scan(row);<a name="line.2486"></a>
+<span class="sourceLineNo">2487</span>    scan.addColumn(fam1, qual1);<a name="line.2487"></a>
+<span class="sourceLineNo">2488</span>    InternalScanner s = region.getScanner(scan);<a name="line.2488"></a>
+<span class="sourceLineNo">2489</span><a name="line.2489"></a>
+<span class="sourceLineNo">2490</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.2490"></a>
+<span class="sourceLineNo">2491</span>    assertEquals(false, s.next(results));<a name="line.2491"></a>
+<span class="sourceLineNo">2492</span>    assertEquals(1, results.size());<a name="line.2492"></a>
+<span class="sourceLineNo">2493</span>    Cell kv = results.get(0);<a name="line.2493"></a>
+<span class="sourceLineNo">2494</span><a name="line.2494"></a>
+<span class="sourceLineNo">2495</span>    assertArrayEquals(value2, CellUtil.cloneValue(kv));<a name="line.2495"></a>
+<span class="sourceLineNo">2496</span>    assertArrayEquals(fam1, CellUtil.cloneFamily(kv));<a name="line.2496"></a>
+<span class="sourceLineNo">2497</span>    assertArrayEquals(qual1, CellUtil.cloneQualifier(kv));<a name="line.2497"></a>
+<span class="sourceLineNo">2498</span>    assertArrayEquals(row, CellUtil.cloneRow(kv));<a name="line.2498"></a>
+<span class="sourceLineNo">2499</span>  }<a name="line.2499"></a>
+<span class="sourceLineNo">2500</span><a name="line.2500"></a>
+<span class="sourceLineNo">2501</span>  @Test<a name="line.2501"></a>
+<span class="sourceLineNo">2502</span>  public void testDelete_CheckTimestampUpdated() throws IOException {<a name="line.2502"></a>
+<span class="sourceLineNo">2503</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2503"></a>
+<span class="sourceLineNo">2504</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.2504"></a>
+<span class="sourceLineNo">2505</span>    byte[] col2 = Bytes.toBytes("col2");<a name="line.2505"></a>
+<span class="sourceLineNo">2506</span>    byte[] col3 = Bytes.toBytes("col3");<a name="line.2506"></a>
+<span class="sourceLineNo">2507</span><a name="line.2507"></a>
+<span class="sourceLineNo">2508</span>    // Setting up region<a name="line.2508"></a>
+<span class="sourceLineNo">2509</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2509"></a>
+<span class="sourceLineNo">2510</span>    // Building checkerList<a name="line.2510"></a>
+<span class="sourceLineNo">2511</span>    List&lt;Cell&gt; kvs = new ArrayList&lt;&gt;();<a name="line.2511"></a>
+<span class="sourceLineNo">2512</span>    kvs.add(new KeyValue(row1, fam1, col1, null));<a name="line.2512"></a>
+<span class="sourceLineNo">2513</span>    kvs.add(new KeyValue(row1, fam1, col2, null));<a name="line.2513"></a>
+<span class="sourceLineNo">2514</span>    kvs.add(new KeyValue(row1, fam1, col3, null));<a name="line.2514"></a>
+<span class="sourceLineNo">2515</span><a name="line.2515"></a>
+<span class="sourceLineNo">2516</span>    NavigableMap&lt;byte[], List&lt;Cell&gt;&gt; deleteMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2516"></a>
+<span class="sourceLineNo">2517</span>    deleteMap.put(fam1, kvs);<a name="line.2517"></a>
+<span class="sourceLineNo">2518</span>    region.delete(deleteMap, Durability.SYNC_WAL);<a name="line.2518"></a>
+<span class="sourceLineNo">2519</span><a name="line.2519"></a>
+<span class="sourceLineNo">2520</span>    // extract the key values out the memstore:<a name="line.2520"></a>
+<span class="sourceLineNo">2521</span>    // This is kinda hacky, but better than nothing...<a name="line.2521"></a>
+<span class="sourceLineNo">2522</span>    long now = System.currentTimeMillis();<a name="line.2522"></a>
+<span class="sourceLineNo">2523</span>    AbstractMemStore memstore = (AbstractMemStore)region.getStore(fam1).memstore;<a name="line.2523"></a>
+<span class="sourceLineNo">2524</span>    Cell firstCell = memstore.getActive().first();<a name="line.2524"></a>
+<span class="sourceLineNo">2525</span>    assertTrue(firstCell.getTimestamp() &lt;= now);<a name="line.2525"></a>
+<span class="sourceLineNo">2526</span>    now = firstCell.getTimestamp();<a name="line.2526"></a>
+<span class="sourceLineNo">2527</span>    for (Cell cell : memstore.getActive().getCellSet()) {<a name="line.2527"></a>
+<span class="sourceLineNo">2528</span>      assertTrue(cell.getTimestamp() &lt;= now);<a name="line.2528"></a>
+<span class="sourceLineNo">2529</span>      now = cell.getTimestamp();<a name="line.2529"></a>
+<span class="sourceLineNo">2530</span>    }<a name="line.2530"></a>
+<span class="sourceLineNo">2531</span>  }<a name="line.2531"></a>
 <span class="sourceLineNo">2532</span><a name="line.2532"></a>
-<span class="sourceLineNo">2533</span>    // Setting up region<a name="line.2533"></a>
-<span class="sourceLineNo">2534</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2534"></a>
-<span class="sourceLineNo">2535</span>    Get get = new Get(row1);<a name="line.2535"></a>
-<span class="sourceLineNo">2536</span>    get.addColumn(fam2, col1);<a name="line.2536"></a>
-<span class="sourceLineNo">2537</span><a name="line.2537"></a>
-<span class="sourceLineNo">2538</span>    // Test<a name="line.2538"></a>
-<span class="sourceLineNo">2539</span>    try {<a name="line.2539"></a>
-<span class="sourceLineNo">2540</span>      region.get(get);<a name="line.2540"></a>
-<span class="sourceLineNo">2541</span>      fail("Expecting DoNotRetryIOException in get but did not get any");<a name="line.2541"></a>
-<span class="sourceLineNo">2542</span>    } catch (org.apache.hadoop.hbase.DoNotRetryIOException e) {<a name="line.2542"></a>
-<span class="sourceLineNo">2543</span>      LOG.info("Got expected DoNotRetryIOException successfully");<a name="line.2543"></a>
-<span class="sourceLineNo">2544</span>    }<a name="line.2544"></a>
-<span class="sourceLineNo">2545</span>  }<a name="line.2545"></a>
-<span class="sourceLineNo">2546</span><a name="line.2546"></a>
-<span class="sourceLineNo">2547</span>  @Test<a name="line.2547"></a>
-<span class="sourceLineNo">2548</span>  public void testGet_Basic() throws IOException {<a name="line.2548"></a>
-<span class="sourceLineNo">2549</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2549"></a>
-<span class="sourceLineNo">2550</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2550"></a>
-<span class="sourceLineNo">2551</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.2551"></a>
-<span class="sourceLineNo">2552</span>    byte[] col2 = Bytes.toBytes("col2");<a name="line.2552"></a>
-<span class="sourceLineNo">2553</span>    byte[] col3 = Bytes.toBytes("col3");<a name="line.2553"></a>
-<span class="sourceLineNo">2554</span>    byte[] col4 = Bytes.toBytes("col4");<a name="line.2554"></a>
-<span class="sourceLineNo">2555</span>    byte[] col5 = Bytes.toBytes("col5");<a name="line.2555"></a>
+<span class="sourceLineNo">2533</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2533"></a>
+<span class="sourceLineNo">2534</span>  // Get tests<a name="line.2534"></a>
+<span class="sourceLineNo">2535</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2535"></a>
+<span class="sourceLineNo">2536</span>  @Test<a name="line.2536"></a>
+<span class="sourceLineNo">2537</span>  public void testGet_FamilyChecker() throws IOException {<a name="line.2537"></a>
+<span class="sourceLineNo">2538</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2538"></a>
+<span class="sourceLineNo">2539</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2539"></a>
+<span class="sourceLineNo">2540</span>    byte[] fam2 = Bytes.toBytes("False");<a name="line.2540"></a>
+<span class="sourceLineNo">2541</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.2541"></a>
+<span class="sourceLineNo">2542</span><a name="line.2542"></a>
+<span class="sourceLineNo">2543</span>    // Setting up region<a name="line.2543"></a>
+<span class="sourceLineNo">2544</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2544"></a>
+<span class="sourceLineNo">2545</span>    Get get = new Get(row1);<a name="line.2545"></a>
+<span class="sourceLineNo">2546</span>    get.addColumn(fam2, col1);<a name="line.2546"></a>
+<span class="sourceLineNo">2547</span><a name="line.2547"></a>
+<span class="sourceLineNo">2548</span>    // Test<a name="line.2548"></a>
+<span class="sourceLineNo">2549</span>    try {<a name="line.2549"></a>
+<span class="sourceLineNo">2550</span>      region.get(get);<a name="line.2550"></a>
+<span class="sourceLineNo">2551</span>      fail("Expecting DoNotRetryIOException in get but did not get any");<a name="line.2551"></a>
+<span class="sourceLineNo">2552</span>    } catch (org.apache.hadoop.hbase.DoNotRetryIOException e) {<a name="line.2552"></a>
+<span class="sourceLineNo">2553</span>      LOG.info("Got expected DoNotRetryIOException successfully");<a name="line.2553"></a>
+<span class="sourceLineNo">2554</span>    }<a name="line.2554"></a>
+<span class="sourceLineNo">2555</span>  }<a name="line.2555"></a>
 <span class="sourceLineNo">2556</span><a name="line.2556"></a>
-<span class="sourceLineNo">2557</span>    // Setting up region<a name="line.2557"></a>
-<span class="sourceLineNo">2558</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2558"></a>
-<span class="sourceLineNo">2559</span>    // Add to memstore<a name="line.2559"></a>
-<span class="sourceLineNo">2560</span>    Put put = new Put(row1);<a name="line.2560"></a>
-<span class="sourceLineNo">2561</span>    put.addColumn(fam1, col1, null);<a name="line.2561"></a>
-<span class="sourceLineNo">2562</span>    put.addColumn(fam1, col2, null);<a name="line.2562"></a>
-<span class="sourceLineNo">2563</span>    put.addColumn(fam1, col3, null);<a name="line.2563"></a>
-<span class="sourceLineNo">2564</span>    put.addColumn(fam1, col4, null);<a name="line.2564"></a>
-<span class="sourceLineNo">2565</span>    put.addColumn(fam1, col5, null);<a name="line.2565"></a>
-<span class="sourceLineNo">2566</span>    region.put(put);<a name="line.2566"></a>
-<span class="sourceLineNo">2567</span><a name="line.2567"></a>
-<span class="sourceLineNo">2568</span>    Get get = new Get(row1);<a name="line.2568"></a>
-<span class="sourceLineNo">2569</span>    get.addColumn(fam1, col2);<a name="line.2569"></a>
-<span class="sourceLineNo">2570</span>    get.addColumn(fam1, col4);<a name="line.2570"></a>
-<span class="sourceLineNo">2571</span>    // Expected result<a name="line.2571"></a>
-<span class="sourceLineNo">2572</span>    KeyValue kv1 = new KeyValue(row1, fam1, col2);<a name="line.2572"></a>
-<span class="sourceLineNo">2573</span>    KeyValue kv2 = new KeyValue(row1, fam1, col4);<a name="line.2573"></a>
-<span class="sourceLineNo">2574</span>    KeyValue[] expected = { kv1, kv2 };<a name="line.2574"></a>
-<span class="sourceLineNo">2575</span><a name="line.2575"></a>
-<span class="sourceLineNo">2576</span>    // Test<a name="line.2576"></a>
-<span class="sourceLineNo">2577</span>    Result res = region.get(get);<a name="line.2577"></a>
-<span class="sourceLineNo">2578</span>    assertEquals(expected.length, res.size());<a name="line.2578"></a>
-<span class="sourceLineNo">2579</span>    for (int i = 0; i &lt; res.size(); i++) {<a name="line.2579"></a>
-<span class="sourceLineNo">2580</span>      assertTrue(CellUtil.matchingRows(expected[i], res.rawCells()[i]));<a name="line.2580"></a>
-<span class="sourceLineNo">2581</span>      assertTrue(CellUtil.matchingFamily(expected[i], res.rawCells()[i]));<a name="line.2581"></a>
-<span class="sourceLineNo">2582</span>      assertTrue(CellUtil.matchingQualifier(expected[i], res.rawCells()[i]));<a name="line.2582"></a>
-<span class="sourceLineNo">2583</span>    }<a name="line.2583"></a>
-<span class="sourceLineNo">2584</span><a name="line.2584"></a>
-<span class="sourceLineNo">2585</span>    // Test using a filter on a Get<a name="line.2585"></a>
-<span class="sourceLineNo">2586</span>    Get g = new Get(row1);<a name="line.2586"></a>
-<span class="sourceLineNo">2587</span>    final int count = 2;<a name="line.2587"></a>
-<span class="sourceLineNo">2588</span>    g.setFilter(new ColumnCountGetFilter(count));<a name="line.2588"></a>
-<span class="sourceLineNo">2589</span>    res = region.get(g);<a name="line.2589"></a>
-<span class="sourceLineNo">2590</span>    assertEquals(count, res.size());<a name="line.2590"></a>
-<span class="sourceLineNo">2591</span>  }<a name="line.2591"></a>
-<span class="sourceLineNo">2592</span><a name="line.2592"></a>
-<span class="sourceLineNo">2593</span>  @Test<a name="line.2593"></a>
-<span class="sourceLineNo">2594</span>  public void testGet_Empty() throws IOException {<a name="line.2594"></a>
-<span class="sourceLineNo">2595</span>    byte[] row = Bytes.toBytes("row");<a name="line.2595"></a>
-<span class="sourceLineNo">2596</span>    byte[] fam = Bytes.toBytes("fam");<a name="line.2596"></a>
-<span class="sourceLineNo">2597</span><a name="line.2597"></a>
-<span class="sourceLineNo">2598</span>    this.region = initHRegion(tableName, method, CONF, fam);<a name="line.2598"></a>
-<span class="sourceLineNo">2599</span>    Get get = new Get(row);<a name="line.2599"></a>
-<span class="sourceLineNo">2600</span>    get.addFamily(fam);<a name="line.2600"></a>
-<span class="sourceLineNo">2601</span>    Result r = region.get(get);<a name="line.2601"></a>
+<span class="sourceLineNo">2557</span>  @Test<a name="line.2557"></a>
+<span class="sourceLineNo">2558</span>  public void testGet_Basic() throws IOException {<a name="line.2558"></a>
+<span class="sourceLineNo">2559</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2559"></a>
+<span class="sourceLineNo">2560</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2560"></a>
+<span class="sourceLineNo">2561</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.2561"></a>
+<span class="sourceLineNo">2562</span>    byte[] col2 = Bytes.toBytes("col2");<a name="line.2562"></a>
+<span class="sourceLineNo">2563</span>    byte[] col3 = Bytes.toBytes("col3");<a name="line.2563"></a>
+<span class="sourceLineNo">2564</span>    byte[] col4 = Bytes.toBytes("col4");<a name="line.2564"></a>
+<span class="sourceLineNo">2565</span>    byte[] col5 = Bytes.toBytes("col5");<a name="line.2565"></a>
+<span class="sourceLineNo">2566</span><a name="line.2566"></a>
+<span class="sourceLineNo">2567</span>    // Setting up region<a name="line.2567"></a>
+<span class="sourceLineNo">2568</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2568"></a>
+<span class="sourceLineNo">2569</span>    // Add to memstore<a name="line.2569"></a>
+<span class="sourceLineNo">2570</span>    Put put = new Put(row1);<a name="line.2570"></a>
+<span class="sourceLineNo">2571</span>    put.addColumn(fam1, col1, null);<a name="line.2571"></a>
+<span class="sourceLineNo">2572</span>    put.addColumn(fam1, col2, null);<a name="line.2572"></a>
+<span class="sourceLineNo">2573</span>    put.addColumn(fam1, col3, null);<a name="line.2573"></a>
+<span class="sourceLineNo">2574</span>    put.addColumn(fam1, col4, null);<a name="line.2574"></a>
+<span class="sourceLineNo">2575</span>    put.addColumn(fam1, col5, null);<a name="line.2575"></a>
+<span class="sourceLineNo">2576</span>    region.put(put);<a name="line.2576"></a>
+<span class="sourceLineNo">2577</span><a name="line.2577"></a>
+<span class="sourceLineNo">2578</span>    Get get = new Get(row1);<a name="line.2578"></a>
+<span class="sourceLineNo">2579</span>    get.addColumn(fam1, col2);<a name="line.2579"></a>
+<span class="sourceLineNo">2580</span>    get.addColumn(fam1, col4);<a name="line.2580"></a>
+<span class="sourceLineNo">2581</span>    // Expected result<a name="line.2581"></a>
+<span class="sourceLineNo">2582</span>    KeyValue kv1 = new KeyValue(row1, fam1, col2);<a name="line.2582"></a>
+<span class="sourceLineNo">2583</span>    KeyValue kv2 = new KeyValue(row1, fam1, col4);<a name="line.2583"></a>
+<span class="sourceLineNo">2584</span>    KeyValue[] expected = { kv1, kv2 };<a name="line.2584"></a>
+<span class="sourceLineNo">2585</span><a name="line.2585"></a>
+<span class="sourceLineNo">2586</span>    // Test<a name="line.2586"></a>
+<span class="sourceLineNo">2587</span>    Result res = region.get(get);<a name="line.2587"></a>
+<span class="sourceLineNo">2588</span>    assertEquals(expected.length, res.size());<a name="line.2588"></a>
+<span class="sourceLineNo">2589</span>    for (int i = 0; i &lt; res.size(); i++) {<a name="line.2589"></a>
+<span class="sourceLineNo">2590</span>      assertTrue(CellUtil.matchingRows(expected[i], res.rawCells()[i]));<a name="line.2590"></a>
+<span class="sourceLineNo">2591</span>      assertTrue(CellUtil.matchingFamily(expected[i], res.rawCells()[i]));<a name="line.2591"></a>
+<span class="sourceLineNo">2592</span>      assertTrue(CellUtil.matchingQualifier(expected[i], res.rawCells()[i]));<a name="line.2592"></a>
+<span class="sourceLineNo">2593</span>    }<a name="line.2593"></a>
+<span class="sourceLineNo">2594</span><a name="line.2594"></a>
+<span class="sourceLineNo">2595</span>    // Test using a filter on a Get<a name="line.2595"></a>
+<span class="sourceLineNo">2596</span>    Get g = new Get(row1);<a name="line.2596"></a>
+<span class="sourceLineNo">2597</span>    final int count = 2;<a name="line.2597"></a>
+<span class="sourceLineNo">2598</span>    g.setFilter(new ColumnCountGetFilter(count));<a name="line.2598"></a>
+<span class="sourceLineNo">2599</span>    res = region.get(g);<a name="line.2599"></a>
+<span class="sourceLineNo">2600</span>    assertEquals(count, res.size());<a name="line.2600"></a>
+<span class="sourceLineNo">2601</span>  }<a name="line.2601"></a>
 <span class="sourceLineNo">2602</span><a name="line.2602"></a>
-<span class="sourceLineNo">2603</span>    assertTrue(r.isEmpty());<a name="line.2603"></a>
-<span class="sourceLineNo">2604</span>  }<a name="line.2604"></a>
-<span class="sourceLineNo">2605</span><a name="line.2605"></a>
-<span class="sourceLineNo">2606</span>  @Test<a name="line.2606"></a>
-<span class="sourceLineNo">2607</span>  public void testGetWithFilter() throws IOException, InterruptedException {<a name="line.2607"></a>
-<span class="sourceLineNo">2608</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2608"></a>
-<span class="sourceLineNo">2609</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2609"></a>
-<span class="sourceLineNo">2610</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.2610"></a>
-<span class="sourceLineNo">2611</span>    byte[] value1 = Bytes.toBytes("value1");<a name="line.2611"></a>
-<span class="sourceLineNo">2612</span>    byte[] value2 = Bytes.toBytes("value2");<a name="line.2612"></a>
-<span class="sourceLineNo">2613</span><a name="line.2613"></a>
-<span class="sourceLineNo">2614</span>    final int maxVersions = 3;<a name="line.2614"></a>
-<span class="sourceLineNo">2615</span>    HColumnDescriptor hcd = new HColumnDescriptor(fam1);<a name="line.2615"></a>
-<span class="sourceLineNo">2616</span>    hcd.setMaxVersions(maxVersions);<a name="line.2616"></a>
-<span class="sourceLineNo">2617</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf("testFilterAndColumnTracker"));<a name="line.2617"></a>
-<span class="sourceLineNo">2618</span>    htd.addFamily(hcd);<a name="line.2618"></a>
-<span class="sourceLineNo">2619</span>    ChunkCreator.initialize(MemStoreLABImpl.CHUNK_SIZE_DEFAULT, false, 0, 0, 0, null);<a name="line.2619"></a>
-<span class="sourceLineNo">2620</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.2620"></a>
-<span class="sourceLineNo">2621</span>    Path logDir = TEST_UTIL.getDataTestDirOnTestFS(method + ".log");<a name="line.2621"></a>
-<span class="sourceLineNo">2622</span>    final WAL wal = HBaseTestingUtility.createWal(TEST_UTIL.getConfiguration(), logDir, info);<a name="line.2622"></a>
-<span class="sourceLineNo">2623</span>    this.region = TEST_UTIL.createLocalHRegion(info, htd, wal);<a name="line.2623"></a>
-<span class="sourceLineNo">2624</span><a name="line.2624"></a>
-<span class="sourceLineNo">2625</span>    // Put 4 version to memstore<a name="line.2625"></a>
-<span class="sourceLineNo">2626</span>    long ts = 0;<a name="line.2626"></a>
-<span class="sourceLineNo">2627</span>    Put put = new Put(row1, ts);<a name="line.2627"></a>
-<span class="sourceLineNo">2628</span>    put.addColumn(fam1, col1, value1);<a name="line.2628"></a>
-<span class="sourceLineNo">2629</span>    region.put(put);<a name="line.2629"></a>
-<span class="sourceLineNo">2630</span>    put = new Put(row1, ts + 1);<a name="line.2630"></a>
-<span class="sourceLineNo">2631</span>    put.addColumn(fam1, col1, Bytes.toBytes("filter1"));<a name="line.2631"></a>
-<span class="sourceLineNo">2632</span>    region.put(put);<a name="line.2632"></a>
-<span class="sourceLineNo">2633</span>    put = new Put(row1, ts + 2);<a name="line.2633"></a>
-<span class="sourceLineNo">2634</span>    put.addColumn(fam1, col1, Bytes.toBytes("filter2"));<a name="line.2634"></a>
-<span class="sourceLineNo">2635</span>    region.put(put);<a name="line.2635"></a>
-<span class="sourceLineNo">2636</span>    put = new Put(row1, ts + 3);<a name="line.2636"></a>
-<span class="sourceLineNo">2637</span>    put.addColumn(fam1, col1, value2);<a name="line.2637"></a>
-<span class="sourceLineNo">2638</span>    region.put(put);<a name="line.2638"></a>
-<span class="sourceLineNo">2639</span><a name="line.2639"></a>
-<span class="sourceLineNo">2640</span>    Get get = new Get(row1);<a name="line.2640"></a>
-<span class="sourceLineNo">2641</span>    get.readAllVersions();<a name="line.2641"></a>
-<span class="sourceLineNo">2642</span>    Result res = region.get(get);<a name="line.2642"></a>
-<span class="sourceLineNo">2643</span>    // Get 3 versions, the oldest version has gone from user view<a name="line.2643"></a>
-<span class="sourceLineNo">2644</span>    assertEquals(maxVersions, res.size());<a name="line.2644"></a>
-<span class="sourceLineNo">2645</span><a name="line.2645"></a>
-<span class="sourceLineNo">2646</span>    get.setFilter(new ValueFilter(CompareOperator.EQUAL, new SubstringComparator("value")));<a name="line.2646"></a>
-<span class="sourceLineNo">2647</span>    res = region.get(get);<a name="line.2647"></a>
-<span class="sourceLineNo">2648</span>    // When use value filter, the oldest version should still gone from user view and it<a name="line.2648"></a>
-<span class="sourceLineNo">2649</span>    // should only return one key vaule<a name="line.2649"></a>
-<span class="sourceLineNo">2650</span>    assertEquals(1, res.size());<a name="line.2650"></a>
-<span class="sourceLineNo">2651</span>    assertTrue(CellUtil.matchingValue(new KeyValue(row1, fam1, col1, value2), res.rawCells()[0]));<a name="line.2651"></a>
-<span class="sourceLineNo">2652</span>    assertEquals(ts + 3, res.rawCells()[0].getTimestamp());<a name="line.2652"></a>
-<span class="sourceLineNo">2653</span><a name="line.2653"></a>
-<span class="sourceLineNo">2654</span>    region.flush(true);<a name="line.2654"></a>
-<span class="sourceLineNo">2655</span>    region.compact(true);<a name="line.2655"></a>
-<span class="sourceLineNo">2656</span>    Thread.sleep(1000);<a name="line.2656"></a>
+<span class="sourceLineNo">2603</span>  @Test<a name="line.2603"></a>
+<span class="sourceLineNo">2604</span>  public void testGet_Empty() throws IOException {<a name="line.2604"></a>
+<span class="sourceLineNo">2605</span>    byte[] row = Bytes.toBytes("row");<a name="line.2605"></a>
+<span class="sourceLineNo">2606</span>    byte[] fam = Bytes.toBytes("fam");<a name="line.2606"></a>
+<span class="sourceLineNo">2607</span><a name="line.2607"></a>
+<span class="sourceLineNo">2608</span>    this.region = initHRegion(tableName, method, CONF, fam);<a name="line.2608"></a>
+<span class="sourceLineNo">2609</span>    Get get = new Get(row);<a name="line.2609"></a>
+<span class="sourceLineNo">2610</span>    get.addFamily(fam);<a name="line.2610"></a>
+<span class="sourceLineNo">2611</span>    Result r = region.get(get);<a name="line.2611"></a>
+<span class="sourceLineNo">2612</span><a name="line.2612"></a>
+<span class="sourceLineNo">2613</span>    assertTrue(r.isEmpty());<a name="line.2613"></a>
+<span class="sourceLineNo">2614</span>  }<a name="line.2614"></a>
+<span class="sourceLineNo">2615</span><a name="line.2615"></a>
+<span class="sourceLineNo">2616</span>  @Test<a name="line.2616"></a>
+<span class="sourceLineNo">2617</span>  public void testGetWithFilter() throws IOException, InterruptedException {<a name="line.2617"></a>
+<span class="sourceLineNo">2618</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2618"></a>
+<span class="sourceLineNo">2619</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2619"></a>
+<span class="sourceLineNo">2620</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.2620"></a>
+<span class="sourceLineNo">2621</span>    byte[] value1 = Bytes.toBytes("value1");<a name="line.2621"></a>
+<span class="sourceLineNo">2622</span>    byte[] value2 = Bytes.toBytes("value2");<a name="line.2622"></a>
+<span class="sourceLineNo">2623</span><a name="line.2623"></a>
+<span class="sourceLineNo">2624</span>    final int maxVersions = 3;<a name="line.2624"></a>
+<span class="sourceLineNo">2625</span>    HColumnDescriptor hcd = new HColumnDescriptor(fam1);<a name="line.2625"></a>
+<span class="sourceLineNo">2626</span>    hcd.setMaxVersions(maxVersions);<a name="line.2626"></a>
+<span class="sourceLineNo">2627</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf("testFilterAndColumnTracker"));<a name="line.2627"></a>
+<span class="sourceLineNo">2628</span>    htd.addFamily(hcd);<a name="line.2628"></a>
+<span class="sourceLineNo">2629</span>    ChunkCreator.initialize(MemStoreLABImpl.CHUNK_SIZE_DEFAULT, false, 0, 0, 0, null);<a name="line.2629"></a>
+<span class="sourceLineNo">2630</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.2630"></a>
+<span class="sourceLineNo">2631</span>    Path logDir = TEST_UTIL.getDataTestDirOnTestFS(method + ".log");<a name="line.2631"></a>
+<span class="sourceLineNo">2632</span>    final WAL wal = HBaseTestingUtility.createWal(TEST_UTIL.getConfiguration(), logDir, info);<a name="line.2632"></a>
+<span class="sourceLineNo">2633</span>    this.region = TEST_UTIL.createLocalHRegion(info, htd, wal);<a name="line.2633"></a>
+<span class="sourceLineNo">2634</span><a name="line.2634"></a>
+<span class="sourceLineNo">2635</span>    // Put 4 version to memstore<a name="line.2635"></a>
+<span class="sourceLineNo">2636</span>    long ts = 0;<a name="line.2636"></a>
+<span class="sourceLineNo">2637</span>    Put put = new Put(row1, ts);<a name="line.2637"></a>
+<span class="sourceLineNo">2638</span>    put.addColumn(fam1, col1, value1);<a name="line.2638"></a>
+<span class="sourceLineNo">2639</span>    region.put(put);<a name="line.2639"></a>
+<span class="sourceLineNo">2640</span>    put = new Put(row1, ts + 1);<a name="line.2640"></a>
+<span class="sourceLineNo">2641</span>    put.addColumn(fam1, col1, Bytes.toBytes("filter1"));<a name="line.2641"></a>
+<span class="sourceLineNo">2642</span>    region.put(put);<a name="line.2642"></a>
+<span class="sourceLineNo">2643</span>    put = new Put(row1, ts + 2);<a name="line.2643"></a>
+<span class="sourceLineNo">2644</span>    put.addColumn(fam1, col1, Bytes.toBytes("filter2"));<a name="line.2644"></a>
+<span class="sourceLineNo">2645</span>    region.put(put);<a name="line.2645"></a>
+<span class="sourceLineNo">2646</span>    put = new Put(row1, ts + 3);<a name="line.2646"></a>
+<span class="sourceLineNo">2647</span>    put.addColumn(fam1, col1, value2);<a name="line.2647"></a>
+<span class="sourceLineNo">2648</span>    region.put(put);<a name="line.2648"></a>
+<span class="sourceLineNo">2649</span><a name="line.2649"></a>
+<span class="sourceLineNo">2650</span>    Get get = new Get(row1);<a name="line.2650"></a>
+<span class="sourceLineNo">2651</span>    get.readAllVersions();<a name="line.2651"></a>
+<span class="sourceLineNo">2652</span>    Result res = region.get(get);<a name="line.2652"></a>
+<span class="sourceLineNo">2653</span>    // Get 3 versions, the oldest version has gone from user view<a name="line.2653"></a>
+<span class="sourceLineNo">2654</span>    assertEquals(maxVersions, res.size());<a name="line.2654"></a>
+<span class="sourceLineNo">2655</span><a name="line.2655"></a>
+<span class="sourceLineNo">2656</span>    get.setFilter(new ValueFilter(CompareOperator.EQUAL, new SubstringComparator("value")));<a name="line.2656"></a>
 <span class="sourceLineNo">2657</span>    res = region.get(get);<a name="line.2657"></a>
-<span class="sourceLineNo">2658</span>    // After flush and compact, the result should be consistent with previous result<a name="line.2658"></a>
-<span class="sourceLineNo">2659</span>    assertEquals(1, res.size());<a name="line.2659"></a>
-<span class="sourceLineNo">2660</span>    assertTrue(CellUtil.matchingValue(new KeyValue(row1, fam1, col1, value2), res.rawCells()[0]));<a name="line.2660"></a>
-<span class="sourceLineNo">2661</span>  }<a name="line.2661"></a>
-<span class="sourceLineNo">2662</span><a name="line.2662"></a>
-<span class="sourceLineNo">2663</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2663"></a>
-<span class="sourceLineNo">2664</span>  // Scanner tests<a name="line.2664"></a>
-<span class="sourceLineNo">2665</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2665"></a>
-<span class="sourceLineNo">2666</span>  @Test<a name="line.2666"></a>
-<span class="sourceLineNo">2667</span>  public void testGetScanner_WithOkFamilies() throws IOException {<a name="line.2667"></a>
-<span class="sourceLineNo">2668</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2668"></a>
-<span class="sourceLineNo">2669</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2669"></a>
-<span class="sourceLineNo">2670</span><a name="line.2670"></a>
-<span class="sourceLineNo">2671</span>    byte[][] families = { fam1, fam2 };<a name="line.2671"></a>
+<span class="sourceLineNo">2658</span>    // When use value filter, the oldest version should still gone from user view and it<a name="line.2658"></a>
+<span class="sourceLineNo">2659</span>    // should only return one key vaule<a name="line.2659"></a>
+<span class="sourceLineNo">2660</span>    assertEquals(1, res.size());<a name="line.2660"></a>
+<span class="sourceLineNo">2661</span>    assertTrue(CellUtil.matchingValue(new KeyValue(row1, fam1, col1, value2), res.rawCells()[0]));<a name="line.2661"></a>
+<span class="sourceLineNo">2662</span>    assertEquals(ts + 3, res.rawCells()[0].getTimestamp());<a name="line.2662"></a>
+<span class="sourceLineNo">2663</span><a name="line.2663"></a>
+<span class="sourceLineNo">2664</span>    region.flush(true);<a name="line.2664"></a>
+<span class="sourceLineNo">2665</span>    region.compact(true);<a name="line.2665"></a>
+<span class="sourceLineNo">2666</span>    Thread.sleep(1000);<a name="line.2666"></a>
+<span class="sourceLineNo">2667</span>    res = region.get(get);<a name="line.2667"></a>
+<span class="sourceLineNo">2668</span>    // After flush and compact, the result should be consistent with previous result<a name="line.2668"></a>
+<span class="sourceLineNo">2669</span>    assertEquals(1, res.size());<a name="line.2669"></a>
+<span class="sourceLineNo">2670</span>    assertTrue(CellUtil.matchingValue(new KeyValue(row1, fam1, col1, value2), res.rawCells()[0]));<a name="line.2670"></a>
+<span class="sourceLineNo">2671</span>  }<a name="line.2671"></a>
 <span class="sourceLineNo">2672</span><a name="line.2672"></a>
-<span class="sourceLineNo">2673</span>    // Setting up region<a name="line.2673"></a>
-<span class="sourceLineNo">2674</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2674"></a>
-<span class="sourceLineNo">2675</span>    Scan scan = new Scan();<a name="line.2675"></a>
-<span class="sourceLineNo">2676</span>    scan.addFamily(fam1);<a name="line.2676"></a>
-<span class="sourceLineNo">2677</span>    scan.addFamily(fam2);<a name="line.2677"></a>
-<span class="sourceLineNo">2678</span>    try {<a name="line.2678"></a>
-<span class="sourceLineNo">2679</span>      region.getScanner(scan);<a name="line.2679"></a>
-<span class="sourceLineNo">2680</span>    } catch (Exception e) {<a name="line.2680"></a>
-<span class="sourceLineNo">2681</span>      assertTrue("Families could not be found in Region", false);<a name="line.2681"></a>
-<span class="sourceLineNo">2682</span>    }<a name="line.2682"></a>
-<span class="sourceLineNo">2683</span>  }<a name="line.2683"></a>
-<span class="sourceLineNo">2684</span><a name="line.2684"></a>
-<span class="sourceLineNo">2685</span>  @Test<a name="line.2685"></a>
-<span class="sourceLineNo">2686</span>  public void testGetScanner_WithNotOkFamilies() throws IOException {<a name="line.2686"></a>
-<span class="sourceLineNo">2687</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2687"></a>
-<span class="sourceLineNo">2688</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2688"></a>
-<span class="sourceLineNo">2689</span><a name="line.2689"></a>
-<span class="sourceLineNo">2690</span>    byte[][] families = { fam1 };<a name="line.2690"></a>
-<span class="sourceLineNo">2691</span><a name="line.2691"></a>
-<span class="sourceLineNo">2692</span>    // Setting up region<a name="line.2692"></a>
-<span class="sourceLineNo">2693</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2693"></a>
-<span class="sourceLineNo">2694</span>    Scan scan = new Scan();<a name="line.2694"></a>
-<span class="sourceLineNo">2695</span>    scan.addFamily(fam2);<a name="line.2695"></a>
-<span class="sourceLineNo">2696</span>    boolean ok = false;<a name="line.2696"></a>
-<span class="sourceLineNo">2697</span>    try {<a name="line.2697"></a>
-<span class="sourceLineNo">2698</span>      region.getScanner(scan);<a name="line.2698"></a>
-<span class="sourceLineNo">2699</span>    } catch (Exception e) {<a name="line.2699"></a>
-<span class="sourceLineNo">2700</span>      ok = true;<a name="line.2700"></a>
-<span class="sourceLineNo">2701</span>    }<a name="line.2701"></a>
-<span class="sourceLineNo">2702</span>    assertTrue("Families could not be found in Region", ok);<a name="line.2702"></a>
-<span class="sourceLineNo">2703</span>  }<a name="line.2703"></a>
-<span class="sourceLineNo">2704</span><a name="line.2704"></a>
-<span class="sourceLineNo">2705</span>  @Test<a name="line.2705"></a>
-<span class="sourceLineNo">2706</span>  public void testGetScanner_WithNoFamilies() throws IOException {<a name="line.2706"></a>
-<span class="sourceLineNo">2707</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2707"></a>
-<span class="sourceLineNo">2708</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2708"></a>
-<span class="sourceLineNo">2709</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2709"></a>
-<span class="sourceLineNo">2710</span>    byte[] fam3 = Bytes.toBytes("fam3");<a name="line.2710"></a>
-<span class="sourceLineNo">2711</span>    byte[] fam4 = Bytes.toBytes("fam4");<a name="line.2711"></a>
-<span class="sourceLineNo">2712</span><a name="line.2712"></a>
-<span class="sourceLineNo">2713</span>    byte[][] families = { fam1, fam2, fam3, fam4 };<a name="line.2713"></a>
+<span class="sourceLineNo">2673</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2673"></a>
+<span class="sourceLineNo">2674</span>  // Scanner tests<a name="line.2674"></a>
+<span class="sourceLineNo">2675</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2675"></a>
+<span class="sourceLineNo">2676</span>  @Test<a name="line.2676"></a>
+<span class="sourceLineNo">2677</span>  public void testGetScanner_WithOkFamilies() throws IOException {<a name="line.2677"></a>
+<span class="sourceLineNo">2678</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2678"></a>
+<span class="sourceLineNo">2679</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2679"></a>
+<span class="sourceLineNo">2680</span><a name="line.2680"></a>
+<span class="sourceLineNo">2681</span>    byte[][] families = { fam1, fam2 };<a name="line.2681"></a>
+<span class="sourceLineNo">2682</span><a name="line.2682"></a>
+<span class="sourceLineNo">2683</span>    // Setting up region<a name="line.2683"></a>
+<span class="sourceLineNo">2684</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2684"></a>
+<span class="sourceLineNo">2685</span>    Scan scan = new Scan();<a name="line.2685"></a>
+<span class="sourceLineNo">2686</span>    scan.addFamily(fam1);<a name="line.2686"></a>
+<span class="sourceLineNo">2687</span>    scan.addFamily(fam2);<a name="line.2687"></a>
+<span class="sourceLineNo">2688</span>    try {<a name="line.2688"></a>
+<span class="sourceLineNo">2689</span>      region.getScanner(scan);<a name="line.2689"></a>
+<span class="sourceLineNo">2690</span>    } catch (Exception e) {<a name="line.2690"></a>
+<span class="sourceLineNo">2691</span>      assertTrue("Families could not be found in Region", false);<a name="line.2691"></a>
+<span class="sourceLineNo">2692</span>    }<a name="line.2692"></a>
+<span class="sourceLineNo">2693</span>  }<a name="line.2693"></a>
+<span class="sourceLineNo">2694</span><a name="line.2694"></a>
+<span class="sourceLineNo">2695</span>  @Test<a name="line.2695"></a>
+<span class="sourceLineNo">2696</span>  public void testGetScanner_WithNotOkFamilies() throws IOException {<a name="line.2696"></a>
+<span class="sourceLineNo">2697</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2697"></a>
+<span class="sourceLineNo">2698</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2698"></a>
+<span class="sourceLineNo">2699</span><a name="line.2699"></a>
+<span class="sourceLineNo">2700</span>    byte[][] families = { fam1 };<a name="line.2700"></a>
+<span class="sourceLineNo">2701</span><a name="line.2701"></a>
+<span class="sourceLineNo">2702</span>    // Setting up region<a name="line.2702"></a>
+<span class="sourceLineNo">2703</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2703"></a>
+<span class="sourceLineNo">2704</span>    Scan scan = new Scan();<a name="line.2704"></a>
+<span class="sourceLineNo">2705</span>    scan.addFamily(fam2);<a name="line.2705"></a>
+<span class="sourceLineNo">2706</span>    boolean ok = false;<a name="line.2706"></a>
+<span class="sourceLineNo">2707</span>    try {<a name="line.2707"></a>
+<span class="sourceLineNo">2708</span>      region.getScanner(scan);<a name="line.2708"></a>
+<span class="sourceLineNo">2709</span>    } catch (Exception e) {<a name="line.2709"></a>
+<span class="sourceLineNo">2710</span>      ok = true;<a name="line.2710"></a>
+<span class="sourceLineNo">2711</span>    }<a name="line.2711"></a>
+<span class="sourceLineNo">2712</span>    assertTrue("Families could not be found in Region", ok);<a name="line.2712"></a>
+<span class="sourceLineNo">2713</span>  }<a name="line.2713"></a>
 <span class="sourceLineNo">2714</span><a name="line.2714"></a>
-<span class="sourceLineNo">2715</span>    // Setting up region<a name="line.2715"></a>
-<span class="sourceLineNo">2716</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2716"></a>
-<span class="sourceLineNo">2717</span>    // Putting data in Region<a name="line.2717"></a>
-<span class="sourceLineNo">2718</span>    Put put = new Put(row1);<a name="line.2718"></a>
-<span class="sourceLineNo">2719</span>    put.addColumn(fam1, null, null);<a name="line.2719"></a>
-<span class="sourceLineNo">2720</span>    put.addColumn(fam2, null, null);<a name="line.2720"></a>
-<span class="sourceLineNo">2721</span>    put.addColumn(fam3, null, null);<a name="line.2721"></a>
-<span class="sourceLineNo">2722</span>    put.addColumn(fam4, null, null);<a name="line.2722"></a>
-<span class="sourceLineNo">2723</span>    region.put(put);<a name="line.2723"></a>
+<span class="sourceLineNo">2715</span>  @Test<a name="line.2715"></a>
+<span class="sourceLineNo">2716</span>  public void testGetScanner_WithNoFamilies() throws IOException {<a name="line.2716"></a>
+<span class="sourceLineNo">2717</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2717"></a>
+<span class="sourceLineNo">2718</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2718"></a>
+<span class="sourceLineNo">2719</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2719"></a>
+<span class="sourceLineNo">2720</span>    byte[] fam3 = Bytes.toBytes("fam3");<a name="line.2720"></a>
+<span class="sourceLineNo">2721</span>    byte[] fam4 = Bytes.toBytes("fam4");<a name="line.2721"></a>
+<span class="sourceLineNo">2722</span><a name="line.2722"></a>
+<span class="sourceLineNo">2723</span>    byte[][] families = { fam1, fam2, fam3, fam4 };<a name="line.2723"></a>
 <span class="sourceLineNo">2724</span><a name="line.2724"></a>
-<span class="sourceLineNo">2725</span>    Scan scan = null;<a name="line.2725"></a>
-<span class="sourceLineNo">2726</span>    HRegion.RegionScannerImpl is = null;<a name="line.2726"></a>
-<span class="sourceLineNo">2727</span><a name="line.2727"></a>
-<span class="sourceLineNo">2728</span>    // Testing to see how many scanners that is produced by getScanner,<a name="line.2728"></a>
-<span class="sourceLineNo">2729</span>    // starting<a name="line.2729"></a>
-<span class="sourceLineNo">2730</span>    // with known number, 2 - current = 1<a name="line.2730"></a>
-<span class="sourceLineNo">2731</span>    scan = new Scan();<a name="line.2731"></a>
-<span class="sourceLineNo">2732</span>    scan.addFamily(fam2);<a name="line.2732"></a>
-<span class="sourceLineNo">2733</span>    scan.addFamily(fam4);<a name="line.2733"></a>
-<span class="sourceLineNo">2734</span>    is = region.getScanner(scan);<a name="line.2734"></a>
-<span class="sourceLineNo">2735</span>    assertEquals(1, is.storeHeap.getHeap().size());<a name="line.2735"></a>
-<span class="sourceLineNo">2736</span><a name="line.2736"></a>
-<span class="sourceLineNo">2737</span>    scan = new Scan();<a name="line.2737"></a>
-<span class="sourceLineNo">2738</span>    is = region.getScanner(scan);<a name="line.2738"></a>
-<span class="sourceLineNo">2739</span>    assertEquals(families.length - 1, is.storeHeap.getHeap().size());<a name="line.2739"></a>
-<span class="sourceLineNo">2740</span>  }<a name="line.2740"></a>
-<span class="sourceLineNo">2741</span><a name="line.2741"></a>
-<span class="sourceLineNo">2742</span>  /**<a name="line.2742"></a>
-<span class="sourceLineNo">2743</span>   * This method tests https://issues.apache.org/jira/browse/HBASE-2516.<a name="line.2743"></a>
-<span class="sourceLineNo">2744</span>   *<a name="line.2744"></a>
-<span class="sourceLineNo">2745</span>   * @throws IOException<a name="line.2745"></a>
-<span class="sourceLineNo">2746</span>   */<a name="line.2746"></a>
-<span class="sourceLineNo">2747</span>  @Test<a name="line.2747"></a>
-<span class="sourceLineNo">2748</span>  public void testGetScanner_WithRegionClosed() throws IOException {<a name="line.2748"></a>
-<span class="sourceLineNo">2749</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2749"></a>
-<span class="sourceLineNo">2750</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2750"></a>
+<span class="sourceLineNo">2725</span>    // Setting up region<a name="line.2725"></a>
+<span class="sourceLineNo">2726</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2726"></a>
+<span class="sourceLineNo">2727</span>    // Putting data in Region<a name="line.2727"></a>
+<span class="sourceLineNo">2728</span>    Put put = new Put(row1);<a name="line.2728"></a>
+<span class="sourceLineNo">2729</span>    put.addColumn(fam1, null, null);<a name="line.2729"></a>
+<span class="sourceLineNo">2730</span>    put.addColumn(fam2, null, null);<a name="line.2730"></a>
+<span class="sourceLineNo">2731</span>    put.addColumn(fam3, null, null);<a name="line.2731"></a>
+<span class="sourceLineNo">2732</span>    put.addColumn(fam4, null, null);<a name="line.2732"></a>
+<span class="sourceLineNo">2733</span>    region.put(put);<a name="line.2733"></a>
+<span class="sourceLineNo">2734</span><a name="line.2734"></a>
+<span class="sourceLineNo">2735</span>    Scan scan = null;<a name="line.2735"></a>
+<span class="sourceLineNo">2736</span>    HRegion.RegionScannerImpl is = null;<a name="line.2736"></a>
+<span class="sourceLineNo">2737</span><a name="line.2737"></a>
+<span class="sourceLineNo">2738</span>    // Testing to see how many scanners that is produced by getScanner,<a name="line.2738"></a>
+<span class="sourceLineNo">2739</span>    // starting<a name="line.2739"></a>
+<span class="sourceLineNo">2740</span>    // with known number, 2 - current = 1<a name="line.2740"></a>
+<span class="sourceLineNo">2741</span>    scan = new Scan();<a name="line.2741"></a>
+<span class="sourceLineNo">2742</span>    scan.addFamily(fam2);<a name="line.2742"></a>
+<span class="sourceLineNo">2743</span>    scan.addFamily(fam4);<a name="line.2743"></a>
+<span class="sourceLineNo">2744</span>    is = region.getScanner(scan);<a name="line.2744"></a>
+<span class="sourceLineNo">2745</span>    assertEquals(1, is.storeHeap.getHeap().size());<a name="line.2745"></a>
+<span class="sourceLineNo">2746</span><a name="line.2746"></a>
+<span class="sourceLineNo">2747</span>    scan = new Scan();<a name="line.2747"></a>
+<span class="sourceLineNo">2748</span>    is = region.getScanner(scan);<a name="line.2748"></a>
+<span class="sourceLineNo">2749</span>    assertEquals(families.length - 1, is.storeHeap.getHeap().size());<a name="line.2749"></a>
+<span class="sourceLineNo">2750</span>  }<a name="line.2750"></a>
 <span class="sourceLineNo">2751</span><a name="line.2751"></a>
-<span class="sourceLineNo">2752</span>    byte[][] families = { fam1, fam2 };<a name="line.2752"></a>
-<span class="sourceLineNo">2753</span><a name="line.2753"></a>
-<span class="sourceLineNo">2754</span>    // Setting up region<a name="line.2754"></a>
-<span class="sourceLineNo">2755</span>    try {<a name="line.2755"></a>
-<span class="sourceLineNo">2756</span>      this.region = initHRegion(tableName, method, CONF, families);<a name="line.2756"></a>
-<span class="sourceLineNo">2757</span>    } catch (IOException e) {<a name="line.2757"></a>
-<span class="sourceLineNo">2758</span>      e.printStackTrace();<a name="line.2758"></a>
-<span class="sourceLineNo">2759</span>      fail("Got IOException during initHRegion, " + e.getMessage());<a name="line.2759"></a>
-<span class="sourceLineNo">2760</span>    }<a name="line.2760"></a>
-<span class="sourceLineNo">2761</span>    region.closed.set(true);<a name="line.2761"></a>
-<span class="sourceLineNo">2762</span>    try {<a name="line.2762"></a>
-<span class="sourceLineNo">2763</span>      region.getScanner(null);<a name="line.2763"></a>
-<span class="sourceLineNo">2764</span>      fail("Expected to get an exception during getScanner on a region that is closed");<a name="line.2764"></a>
-<span class="sourceLineNo">2765</span>    } catch (NotServingRegionException e) {<a name="line.2765"></a>
-<span class="sourceLineNo">2766</span>      // this is the correct exception that is expected<a name="line.2766"></a>
+<span class="sourceLineNo">2752</span>  /**<a name="line.2752"></a>
+<span class="sourceLineNo">2753</span>   * This method tests https://issues.apache.org/jira/browse/HBASE-2516.<a name="line.2753"></a>
+<span class="sourceLineNo">2754</span>   *<a name="line.2754"></a>
+<span class="sourceLineNo">2755</span>   * @throws IOException<a name="line.2755"></a>
+<span class="sourceLineNo">2756</span>   */<a name="line.2756"></a>
+<span class="sourceLineNo">2757</span>  @Test<a name="line.2757"></a>
+<span class="sourceLineNo">2758</span>  public void testGetScanner_WithRegionClosed() throws IOException {<a name="line.2758"></a>
+<span class="sourceLineNo">2759</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2759"></a>
+<span class="sourceLineNo">2760</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2760"></a>
+<span class="sourceLineNo">2761</span><a name="line.2761"></a>
+<span class="sourceLineNo">2762</span>    byte[][] families = { fam1, fam2 };<a name="line.2762"></a>
+<span class="sourceLineNo">2763</span><a name="line.2763"></a>
+<span class="sourceLineNo">2764</span>    // Setting up region<a name="line.2764"></a>
+<span class="sourceLineNo">2765</span>    try {<a name="line.2765"></a>
+<span class="sourceLineNo">2766</span>      this.region = initHRegion(tableName, method, CONF, families);<a name="line.2766"></a>
 <span class="sourceLineNo">2767</span>    } catch (IOException e) {<a name="line.2767"></a>
-<span class="sourceLineNo">2768</span>      fail("Got wrong type of exception - should be a NotServingRegionException, " +<a name="line.2768"></a>
-<span class="sourceLineNo">2769</span>          "but was an IOException: "<a name="line.2769"></a>
-<span class="sourceLineNo">2770</span>          + e.getMessage());<a name="line.2770"></a>
-<span class="sourceLineNo">2771</span>    }<a name="line.2771"></a>
-<span class="sourceLineNo">2772</span>  }<a name="line.2772"></a>
-<span class="sourceLineNo">2773</span><a name="line.2773"></a>
-<span class="sourceLineNo">2774</span>  @Test<a name="line.2774"></a>
-<span class="sourceLineNo">2775</span>  public void testRegionScanner_Next() throws IOException {<a name="line.2775"></a>
-<span class="sourceLineNo">2776</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2776"></a>
-<span class="sourceLineNo">2777</span>    byte[] row2 = Bytes.toBytes("row2");<a name="line.2777"></a>
-<span class="sourceLineNo">2778</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2778"></a>
-<span class="sourceLineNo">2779</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2779"></a>
-<span class="sourceLineNo">2780</span>    byte[] fam3 = Bytes.toBytes("fam3");<a name="line.2780"></a>
-<span class="sourceLineNo">2781</span>    byte[] fam4 = Bytes.toBytes("fam4");<a name="line.2781"></a>
-<span class="sourceLineNo">2782</span><a name="line.2782"></a>
-<span class="sourceLineNo">2783</span>    byte[][] families = { fam1, fam2, fam3, fam4 };<a name="line.2783"></a>
-<span class="sourceLineNo">2784</span>    long ts = System.currentTimeMillis();<a name="line.2784"></a>
-<span class="sourceLineNo">2785</span><a name="line.2785"></a>
-<span class="sourceLineNo">2786</span>    // Setting up region<a name="line.2786"></a>
-<span class="sourceLineNo">2787</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2787"></a>
-<span class="sourceLineNo">2788</span>    // Putting data in Region<a name="line.2788"></a>
-<span class="sourceLineNo">2789</span>    Put put = null;<a name="line.2789"></a>
-<span class="sourceLineNo">2790</span>    put = new Put(row1);<a name="line.2790"></a>
-<span class="sourceLineNo">2791</span>    put.addColumn(fam1, (byte[]) null, ts, null);<a name="line.2791"></a>
-<span class="sourceLineNo">2792</span>    put.addColumn(fam2, (byte[]) null, ts, null);<a name="line.2792"></a>
-<span class="sourceLineNo">2793</span>    put.addColumn(fam3, (byte[]) null, ts, null);<a name="line.2793"></a>
-<span class="sourceLineNo">2794</span>    put.addColumn(fam4, (byte[]) null, ts, null);<a name="line.2794"></a>
-<span class="sourceLineNo">2795</span>    region.put(put);<a name="line.2795"></a>
-<span class="sourceLineNo">2796</span><a name="line.2796"></a>
-<span class="sourceLineNo">2797</span>    put = new Put(row2);<a name="line.2797"></a>
-<span class="sourceLineNo">2798</span>    put.addColumn(fam1, (byte[]) null, ts, null);<a name="line.2798"></a>
-<span class="sourceLineNo">2799</span>    put.addColumn(fam2, (byte[]) null, ts, null);<a name="line.2799"></a>
-<span class="sourceLineNo">2800</span>    put.addColumn(fam3, (byte[]) null, ts, null);<a name="line.2800"></a>
-<span class="sourceLineNo">2801</span>    put.addColumn(fam4, (byte[]) null, ts, null);<a name="line.2801"></a>
-<span class="sourceLineNo">2802</span>    region.put(put);<a name="line.2802"></a>
-<span class="sourceLineNo">2803</span><a name="line.2803"></a>
-<span class="sourceLineNo">2804</span>    Scan scan = new Scan();<a name="line.2804"></a>
-<span class="sourceLineNo">2805</span>    scan.addFamily(fam2);<a name="line.2805"></a>
-<span class="sourceLineNo">2806</span>    scan.addFamily(fam4);<a name="line.2806"></a>
-<span class="sourceLineNo">2807</span>    InternalScanner is = region.getScanner(scan);<a name="line.2807"></a>
-<span class="sourceLineNo">2808</span><a name="line.2808"></a>
-<span class="sourceLineNo">2809</span>    List&lt;Cell&gt; res = null;<a name="line.2809"></a>
-<span class="sourceLineNo">2810</span><a name="line.2810"></a>
-<span class="sourceLineNo">2811</span>    // Result 1<a name="line.2811"></a>
-<span class="sourceLineNo">2812</span>    List&lt;Cell&gt; expected1 = new ArrayList&lt;&gt;();<a name="line.2812"></a>
-<span class="sourceLineNo">2813</span>    expected1.add(new KeyValue(row1, fam2, null, ts, KeyValue.Type.Put, null));<a name="line.2813"></a>
-<span class="sourceLineNo">2814</span>    expected1.add(new KeyValue(row1, fam4, null, ts, KeyValue.Type.Put, null));<a name="line.2814"></a>
-<span class="sourceLineNo">2815</span><a name="line.2815"></a>
-<span class="sourceLineNo">2816</span>    res = new ArrayList&lt;&gt;();<a name="line.2816"></a>
-<span class="sourceLineNo">2817</span>    is.next(res);<a name="line.2817"></a>
-<span class="sourceLineNo">2818</span>    for (int i = 0; i &lt; res.size(); i++) {<a name="line.2818"></a>
-<span class="sourceLineNo">2819</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected1.get(i), res.get(i)));<a name="line.2819"></a>
-<span class="sourceLineNo">2820</span>    }<a name="line.2820"></a>
-<span class="sourceLineNo">2821</span><a name="line.2821"></a>
-<span class="sourceLineNo">2822</span>    // Result 2<a name="line.2822"></a>
-<span class="sourceLineNo">2823</span>    List&lt;Cell&gt; expected2 = new ArrayList&lt;&gt;();<a name="line.2823"></a>
-<span class="sourceLineNo">2824</span>    expected2.add(new KeyValue(row2, fam2, null, ts, KeyValue.Type.Put, null));<a name="line.2824"></a>
-<span class="sourceLineNo">2825</span>    expected2.add(new KeyValue(row2, fam4, null, ts, KeyValue.Type.Put, null));<a name="line.2825"></a>
-<span class="sourceLineNo">2826</span><a name="line.2826"></a>
-<span class="sourceLineNo">2827</span>    res = new ArrayList&lt;&gt;();<a name="line.2827"></a>
-<span class="sourceLineNo">2828</span>    is.next(res);<a name="line.2828"></a>
-<span class="sourceLineNo">2829</span>    for (int i = 0; i &lt; res.size(); i++) {<a name="line.2829"></a>
-<span class="sourceLineNo">2830</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected2.get(i), res.get(i)));<a name="line.2830"></a>
-<span class="sourceLineNo">2831</span>    }<a name="line.2831"></a>
-<span class="sourceLineNo">2832</span>  }<a name="line.2832"></a>
-<span class="sourceLineNo">2833</span><a name="line.2833"></a>
-<span class="sourceLineNo">2834</span>  @Test<a name="line.2834"></a>
-<span class="sourceLineNo">2835</span>  public void testScanner_ExplicitColumns_FromMemStore_EnforceVersions() throws IOException {<a name="line.2835"></a>
-<span class="sourceLineNo">2836</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2836"></a>
-<span class="sourceLineNo">2837</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.2837"></a>
-<span class="sourceLineNo">2838</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.2838"></a>
-<span class="sourceLineNo">2839</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2839"></a>
-<span class="sourceLineNo">2840</span>    byte[][] families = { fam1 };<a name="line.2840"></a>
-<span class="sourceLineNo">2841</span><a name="line.2841"></a>
-<span class="sourceLineNo">2842</span>    long ts1 = System.currentTimeMillis();<a name="line.2842"></a>
-<span class="sourceLineNo">2843</span>    long ts2 = ts1 + 1;<a name="line.2843"></a>
-<span class="sourceLineNo">2844</span>    long ts3 = ts1 + 2;<a name="line.2844"></a>
-<span class="sourceLineNo">2845</span><a name="line.2845"></a>
-<span class="sourceLineNo">2846</span>    // Setting up region<a name="line.2846"></a>
-<span class="sourceLineNo">2847</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2847"></a>
-<span class="sourceLineNo">2848</span>    // Putting data in Region<a name="line.2848"></a>
-<span class="sourceLineNo">2849</span>    Put put = null;<a name="line.2849"></a>
-<span class="sourceLineNo">2850</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.2850"></a>
-<span class="sourceLineNo">2851</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.2851"></a>
-<span class="sourceLineNo">2852</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.2852"></a>
-<span class="sourceLineNo">2853</span><a name="line.2853"></a>
-<span class="sourceLineNo">2854</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.2854"></a>
-<span class="sourceLineNo">2855</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.2855"></a>
-<span class="sourceLineNo">2856</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.2856"></a>
-<span class="sourceLineNo">2857</span><a name="line.2857"></a>
-<span class="sourceLineNo">2858</span>    put = new Put(row1);<a name="line.2858"></a>
-<span class="sourceLineNo">2859</span>    put.add(kv13);<a name="line.2859"></a>
-<span class="sourceLineNo">2860</span>    put.add(kv12);<a name="line.2860"></a>
-<span class="sourceLineNo">2861</span>    put.add(kv11);<a name="line.2861"></a>
-<span class="sourceLineNo">2862</span>    put.add(kv23);<a name="line.2862"></a>
-<span class="sourceLineNo">2863</span>    put.add(kv22);<a name="line.2863"></a>
-<span class="sourceLineNo">2864</span>    put.add(kv21);<a name="line.2864"></a>
-<span class="sourceLineNo">2865</span>    region.put(put);<a name="line.2865"></a>
-<span class="sourceLineNo">2866</span><a name="line.2866"></a>
-<span class="sourceLineNo">2867</span>    // Expected<a name="line.2867"></a>
-<span class="sourceLineNo">2868</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.2868"></a>
-<span class="sourceLineNo">2869</span>    expected.add(kv13);<a name="line.2869"></a>
-<span class="sourceLineNo">2870</span>    expected.add(kv12);<a name="line.2870"></a>
-<span class="sourceLineNo">2871</span><a name="line.2871"></a>
-<span class="sourceLineNo">2872</span>    Scan scan = new Scan(row1);<a name="line.2872"></a>
-<span class="sourceLineNo">2873</span>    scan.addColumn(fam1, qf1);<a name="line.2873"></a>
-<span class="sourceLineNo">2874</span>    scan.setMaxVersions(MAX_VERSIONS);<a name="line.2874"></a>
-<span class="sourceLineNo">2875</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.2875"></a>
-<span class="sourceLineNo">2876</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.2876"></a>
-<span class="sourceLineNo">2877</span><a name="line.2877"></a>
-<span class="sourceLineNo">2878</span>    boolean hasNext = scanner.next(actual);<a name="line.2878"></a>
-<span class="sourceLineNo">2879</span>    assertEquals(false, hasNext);<a name="line.2879"></a>
-<span class="sourceLineNo">2880</span><a name="line.2880"></a>
-<span class="sourceLineNo">2881</span>    // Verify result<a name="line.2881"></a>
-<span class="sourceLineNo">2882</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.2882"></a>
-<span class="sourceLineNo">2883</span>      assertEquals(expected.get(i), actual.get(i));<a name="line.2883"></a>
-<span class="sourceLineNo">2884</span>    }<a name="line.2884"></a>
-<span class="sourceLineNo">2885</span>  }<a name="line.2885"></a>
-<span class="sourceLineNo">2886</span><a name="line.2886"></a>
-<span class="sourceLineNo">2887</span>  @Test<a name="line.2887"></a>
-<span class="sourceLineNo">2888</span>  public void testScanner_ExplicitColumns_FromFilesOnly_EnforceVersions() throws IOException {<a name="line.2888"></a>
-<span class="sourceLineNo">2889</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2889"></a>
-<span class="sourceLineNo">2890</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.2890"></a>
-<span class="sourceLineNo">2891</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.2891"></a>
-<span class="sourceLineNo">2892</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2892"></a>
-<span class="sourceLineNo">2893</span>    byte[][] families = { fam1 };<a name="line.2893"></a>
-<span class="sourceLineNo">2894</span><a name="line.2894"></a>
-<span class="sourceLineNo">2895</span>    long ts1 = 1; // System.currentTimeMillis();<a name="line.2895"></a>
-<span class="sourceLineNo">2896</span>    long ts2 = ts1 + 1;<a name="line.2896"></a>
-<span class="sourceLineNo">2897</span>    long ts3 = ts1 + 2;<a name="line.2897"></a>
-<span class="sourceLineNo">2898</span><a name="line.2898"></a>
-<span class="sourceLineNo">2899</span>    // Setting up region<a name="line.2899"></a>
-<span class="sourceLineNo">2900</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2900"></a>
-<span class="sourceLineNo">2901</span>    // Putting data in Region<a name="line.2901"></a>
-<span class="sourceLineNo">2902</span>    Put put = null;<a name="line.2902"></a>
-<span class="sourceLineNo">2903</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.2903"></a>
-<span class="sourceLineNo">2904</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.2904"></a>
-<span class="sourceLineNo">2905</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.2905"></a>
-<span class="sourceLineNo">2906</span><a name="line.2906"></a>
-<span class="sourceLineNo">2907</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.2907"></a>
-<span class="sourceLineNo">2908</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.2908"></a>
-<span class="sourceLineNo">2909</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.2909"></a>
-<span class="sourceLineNo">2910</span><a name="line.2910"></a>
-<span class="sourceLineNo">2911</span>    put = new Put(row1);<a name="line.2911"></a>
-<span class="sourceLineNo">2912</span>    put.add(kv13);<a name="line.2912"></a>
-<span class="sourceLineNo">2913</span>    put.add(kv12);<a name="line.2913"></a>
-<span class="sourceLineNo">2914</span>    put.add(kv11);<a name="line.2914"></a>
-<span class="sourceLineNo">2915</span>    put.add(kv23);<a name="line.2915"></a>
-<span class="sourceLineNo">2916</span>    put.add(kv22);<a name="line.2916"></a>
-<span class="sourceLineNo">2917</span>    put.add(kv21);<a name="line.2917"></a>
-<span class="sourceLineNo">2918</span>    region.put(put);<a name="line.2918"></a>
-<span class="sourceLineNo">2919</span>    region.flush(true);<a name="line.2919"></a>
+<span class="sourceLineNo">2768</span>      e.printStackTrace();<a name="line.2768"></a>
+<span class="sourceLineNo">2769</span>      fail("Got IOException during initHRegion, " + e.getMessage());<a name="line.2769"></a>
+<span class="sourceLineNo">2770</span>    }<a name="line.2770"></a>
+<span class="sourceLineNo">2771</span>    region.closed.set(true);<a name="line.2771"></a>
+<span class="sourceLineNo">2772</span>    try {<a name="line.2772"></a>
+<span class="sourceLineNo">2773</span>      region.getScanner(null);<a name="line.2773"></a>
+<span class="sourceLineNo">2774</span>      fail("Expected to get an exception during getScanner on a region that is closed");<a name="line.2774"></a>
+<span class="sourceLineNo">2775</span>    } catch (NotServingRegionException e) {<a name="line.2775"></a>
+<span class="sourceLineNo">2776</span>      // this is the correct exception that is expected<a name="line.2776"></a>
+<span class="sourceLineNo">2777</span>    } catch (IOException e) {<a name="line.2777"></a>
+<span class="sourceLineNo">2778</span>      fail("Got wrong type of exception - should be a NotServingRegionException, " +<a name="line.2778"></a>
+<span class="sourceLineNo">2779</span>          "but was an IOException: "<a name="line.2779"></a>
+<span class="sourceLineNo">2780</span>          + e.getMessage());<a name="line.2780"></a>
+<span class="sourceLineNo">2781</span>    }<a name="line.2781"></a>
+<span class="sourceLineNo">2782</span>  }<a name="line.2782"></a>
+<span class="sourceLineNo">2783</span><a name="line.2783"></a>
+<span class="sourceLineNo">2784</span>  @Test<a name="line.2784"></a>
+<span class="sourceLineNo">2785</span>  public void testRegionScanner_Next() throws IOException {<a name="line.2785"></a>
+<span class="sourceLineNo">2786</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2786"></a>
+<span class="sourceLineNo">2787</span>    byte[] row2 = Bytes.toBytes("row2");<a name="line.2787"></a>
+<span class="sourceLineNo">2788</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2788"></a>
+<span class="sourceLineNo">2789</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2789"></a>
+<span class="sourceLineNo">2790</span>    byte[] fam3 = Bytes.toBytes("fam3");<a name="line.2790"></a>
+<span class="sourceLineNo">2791</span>    byte[] fam4 = Bytes.toBytes("fam4");<a name="line.2791"></a>
+<span class="sourceLineNo">2792</span><a name="line.2792"></a>
+<span class="sourceLineNo">2793</span>    byte[][] families = { fam1, fam2, fam3, fam4 };<a name="line.2793"></a>
+<span class="sourceLineNo">2794</span>    long ts = System.currentTimeMillis();<a name="line.2794"></a>
+<span class="sourceLineNo">2795</span><a name="line.2795"></a>
+<span class="sourceLineNo">2796</span>    // Setting up region<a name="line.2796"></a>
+<span class="sourceLineNo">2797</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2797"></a>
+<span class="sourceLineNo">2798</span>    // Putting data in Region<a name="line.2798"></a>
+<span class="sourceLineNo">2799</span>    Put put = null;<a name="line.2799"></a>
+<span class="sourceLineNo">2800</span>    put = new Put(row1);<a name="line.2800"></a>
+<span class="sourceLineNo">2801</span>    put.addColumn(fam1, (byte[]) null, ts, null);<a name="line.2801"></a>
+<span class="sourceLineNo">2802</span>    put.addColumn(fam2, (byte[]) null, ts, null);<a name="line.2802"></a>
+<span class="sourceLineNo">2803</span>    put.addColumn(fam3, (byte[]) null, ts, null);<a name="line.2803"></a>
+<span class="sourceLineNo">2804</span>    put.addColumn(fam4, (byte[]) null, ts, null);<a name="line.2804"></a>
+<span class="sourceLineNo">2805</span>    region.put(put);<a name="line.2805"></a>
+<span class="sourceLineNo">2806</span><a name="line.2806"></a>
+<span class="sourceLineNo">2807</span>    put = new Put(row2);<a name="line.2807"></a>
+<span class="sourceLineNo">2808</span>    put.addColumn(fam1, (byte[]) null, ts, null);<a name="line.2808"></a>
+<span class="sourceLineNo">2809</span>    put.addColumn(fam2, (byte[]) null, ts, null);<a name="line.2809"></a>
+<span class="sourceLineNo">2810</span>    put.addColumn(fam3, (byte[]) null, ts, null);<a name="line.2810"></a>
+<span class="sourceLineNo">2811</span>    put.addColumn(fam4, (byte[]) null, ts, null);<a name="line.2811"></a>
+<span class="sourceLineNo">2812</span>    region.put(put);<a name="line.2812"></a>
+<span class="sourceLineNo">2813</span><a name="line.2813"></a>
+<span class="sourceLineNo">2814</span>    Scan scan = new Scan();<a name="line.2814"></a>
+<span class="sourceLineNo">2815</span>    scan.addFamily(fam2);<a name="line.2815"></a>
+<span class="sourceLineNo">2816</span>    scan.addFamily(fam4);<a name="line.2816"></a>
+<span class="sourceLineNo">2817</span>    InternalScanner is = region.getScanner(scan);<a name="line.2817"></a>
+<span class="sourceLineNo">2818</span><a name="line.2818"></a>
+<span class="sourceLineNo">2819</span>    List&lt;Cell&gt; res = null;<a name="line.2819"></a>
+<span class="sourceLineNo">2820</span><a name="line.2820"></a>
+<span class="sourceLineNo">2821</span>    // Result 1<a name="line.2821"></a>
+<span class="sourceLineNo">2822</span>    List&lt;Cell&gt; expected1 = new ArrayList&lt;&gt;();<a name="line.2822"></a>
+<span class="sourceLineNo">2823</span>    expected1.add(new KeyValue(row1, fam2, null, ts, KeyValue.Type.Put, null));<a name="line.2823"></a>
+<span class="sourceLineNo">2824</span>    expected1.add(new KeyValue(row1, fam4, null, ts, KeyValue.Type.Put, null));<a name="line.2824"></a>
+<span class="sourceLineNo">2825</span><a name="line.2825"></a>
+<span class="sourceLineNo">2826</span>    res = new ArrayList&lt;&gt;();<a name="line.2826"></a>
+<span class="sourceLineNo">2827</span>    is.next(res);<a name="line.2827"></a>
+<span class="sourceLineNo">2828</span>    for (int i = 0; i &lt; res.size(); i++) {<a name="line.2828"></a>
+<span class="sourceLineNo">2829</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected1.get(i), res.get(i)));<a name="line.2829"></a>
+<span class="sourceLineNo">2830</span>    }<a name="line.2830"></a>
+<span class="sourceLineNo">2831</span><a name="line.2831"></a>
+<span class="sourceLineNo">2832</span>    // Result 2<a name="line.2832"></a>
+<span class="sourceLineNo">2833</span>    List&lt;Cell&gt; expected2 = new ArrayList&lt;&gt;();<a name="line.2833"></a>
+<span class="sourceLineNo">2834</span>    expected2.add(new KeyValue(row2, fam2, null, ts, KeyValue.Type.Put, null));<a name="line.2834"></a>
+<span class="sourceLineNo">2835</span>    expected2.add(new KeyValue(row2, fam4, null, ts, KeyValue.Type.Put, null));<a name="line.2835"></a>
+<span class="sourceLineNo">2836</span><a name="line.2836"></a>
+<span class="sourceLineNo">2837</span>    res = new ArrayList&lt;&gt;();<a name="line.2837"></a>
+<span class="sourceLineNo">2838</span>    is.next(res);<a name="line.2838"></a>
+<span class="sourceLineNo">2839</span>    for (int i = 0; i &lt; res.size(); i++) {<a name="line.2839"></a>
+<span class="sourceLineNo">2840</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected2.get(i), res.get(i)));<a name="line.2840"></a>
+<span class="sourceLineNo">2841</span>    }<a name="line.2841"></a>
+<span class="sourceLineNo">2842</span>  }<a name="line.2842"></a>
+<span class="sourceLineNo">2843</span><a name="line.2843"></a>
+<span class="sourceLineNo">2844</span>  @Test<a name="line.2844"></a>
+<span class="sourceLineNo">2845</span>  public void testScanner_ExplicitColumns_FromMemStore_EnforceVersions() throws IOException {<a name="line.2845"></a>
+<span class="sourceLineNo">2846</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2846"></a>
+<span class="sourceLineNo">2847</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.2847"></a>
+<span class="sourceLineNo">2848</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.2848"></a>
+<span class="sourceLineNo">2849</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2849"></a>
+<span class="sourceLineNo">2850</span>    byte[][] families = { fam1 };<a name="line.2850"></a>
+<span class="sourceLineNo">2851</span><a name="line.2851"></a>
+<span class="sourceLineNo">2852</span>    long ts1 = System.currentTimeMillis();<a name="line.2852"></a>
+<span class="sourceLineNo">2853</span>    long ts2 = ts1 + 1;<a name="line.2853"></a>
+<span class="sourceLineNo">2854</span>    long ts3 = ts1 + 2;<a name="line.2854"></a>
+<span class="sourceLineNo">2855</span><a name="line.2855"></a>
+<span class="sourceLineNo">2856</span>    // Setting up region<a name="line.2856"></a>
+<span class="sourceLineNo">2857</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2857"></a>
+<span class="sourceLineNo">2858</span>    // Putting data in Region<a name="line.2858"></a>
+<span class="sourceLineNo">2859</span>    Put put = null;<a name="line.2859"></a>
+<span class="sourceLineNo">2860</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.2860"></a>
+<span class="sourceLineNo">2861</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.2861"></a>
+<span class="sourceLineNo">2862</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.2862"></a>
+<span class="sourceLineNo">2863</span><a name="line.2863"></a>
+<span class="sourceLineNo">2864</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.2864"></a>
+<span class="sourceLineNo">2865</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.2865"></a>
+<span class="sourceLineNo">2866</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.2866"></a>
+<span class="sourceLineNo">2867</span><a name="line.2867"></a>
+<span class="sourceLineNo">2868</span>    put = new Put(row1);<a name="line.2868"></a>
+<span class="sourceLineNo">2869</span>    put.add(kv13);<a name="line.2869"></a>
+<span class="sourceLineNo">2870</span>    put.add(kv12);<a name="line.2870"></a>
+<span class="sourceLineNo">2871</span>    put.add(kv11);<a name="line.2871"></a>
+<span class="sourceLineNo">2872</span>    put.add(kv23);<a name="line.2872"></a>
+<span class="sourceLineNo">2873</span>    put.add(kv22);<a name="line.2873"></a>
+<span class="sourceLineNo">2874</span>    put.add(kv21);<a name="line.2874"></a>
+<span class="sourceLineNo">2875</span>    region.put(put);<a name="line.2875"></a>
+<span class="sourceLineNo">2876</span><a name="line.2876"></a>
+<span class="sourceLineNo">2877</span>    // Expected<a name="line.2877"></a>
+<span class="sourceLineNo">2878</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.2878"></a>
+<span class="sourceLineNo">2879</span>    expected.add(kv13);<a name="line.2879"></a>
+<span class="sourceLineNo">2880</span>    expected.add(kv12);<a name="line.2880"></a>
+<span class="sourceLineNo">2881</span><a name="line.2881"></a>
+<span class="sourceLineNo">2882</span>    Scan scan = new Scan(row1);<a name="line.2882"></a>
+<span class="sourceLineNo">2883</span>    scan.addColumn(fam1, qf1);<a name="line.2883"></a>
+<span class="sourceLineNo">2884</span>    scan.setMaxVersions(MAX_VERSIONS);<a name="line.2884"></a>
+<span class="sourceLineNo">2885</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.2885"></a>
+<span class="sourceLineNo">2886</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.2886"></a>
+<span class="sourceLineNo">2887</span><a name="line.2887"></a>
+<span class="sourceLineNo">2888</span>    boolean hasNext = scanner.next(actual);<a name="line.2888"></a>
+<span class="sourceLineNo">2889</span>    assertEquals(false, hasNext);<a name="line.2889"></a>
+<span class="sourceLineNo">2890</span><a name="line.2890"></a>
+<span class="sourceLineNo">2891</span>    // Verify result<a name="line.2891"></a>
+<span class="sourceLineNo">2892</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.2892"></a>
+<span class="sourceLineNo">2893</span>      assertEquals(expected.get(i), actual.get(i));<a name="line.2893"></a>
+<span class="sourceLineNo">2894</span>    }<a name="line.2894"></a>
+<span class="sourceLineNo">2895</span>  }<a name="line.2895"></a>
+<span class="sourceLineNo">2896</span><a name="line.2896"></a>
+<span class="sourceLineNo">2897</span>  @Test<a name="line.2897"></a>
+<span class="sourceLineNo">2898</span>  public void testScanner_ExplicitColumns_FromFilesOnly_EnforceVersions() throws IOException {<a name="line.2898"></a>
+<span class="sourceLineNo">2899</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2899"></a>
+<span class="sourceLineNo">2900</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.2900"></a>
+<span class="sourceLineNo">2901</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.2901"></a>
+<span class="sourceLineNo">2902</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2902"></a>
+<span class="sourceLineNo">2903</span>    byte[][] families = { fam1 };<a name="line.2903"></a>
+<span class="sourceLineNo">2904</span><a name="line.2904"></a>
+<span class="sourceLineNo">2905</span>    long ts1 = 1; // System.currentTimeMillis();<a name="line.2905"></a>
+<span class="sourceLineNo">2906</span>    long ts2 = ts1 + 1;<a name="line.2906"></a>
+<span class="sourceLineNo">2907</span>    long ts3 = ts1 + 2;<a name="line.2907"></a>
+<span class="sourceLineNo">2908</span><a name="line.2908"></a>
+<span class="sourceLineNo">2909</span>    // Setting up region<a name="line.2909"></a>
+<span class="sourceLineNo">2910</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2910"></a>
+<span class="sourceLineNo">2911</span>    // Putting data in Region<a name="line.2911"></a>
+<span class="sourceLineNo">2912</span>    Put put = null;<a name="line.2912"></a>
+<span class="sourceLineNo">2913</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.2913"></a>
+<span class="sourceLineNo">2914</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.2914"></a>
+<span class="sourceLineNo">2915</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.2915"></a>
+<span class="sourceLineNo">2916</span><a name="line.2916"></a>
+<span class="sourceLineNo">2917</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.2917"></a>
+<span class="sourceLineNo">2918</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.2918"></a>
+<span class="sourceLineNo">2919</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.2919"></a>
 <span class="sourceLineNo">2920</span><a name="line.2920"></a>
-<span class="sourceLineNo">2921</span>    // Expected<a name="line.2921"></a>
-<span class="sourceLineNo">2922</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.2922"></a>
-<span class="sourceLineNo">2923</span>    expected.add(kv13);<a name="line.2923"></a>
-<span class="sourceLineNo">2924</span>    expected.add(kv12);<a name="line.2924"></a>
-<span class="sourceLineNo">2925</span>    expected.add(kv23);<a name="line.2925"></a>
-<span class="sourceLineNo">2926</span>    expected.add(kv22);<a name="line.2926"></a>
-<span class="sourceLineNo">2927</span><a name="line.2927"></a>
-<span class="sourceLineNo">2928</span>    Scan scan = new Scan(row1);<a name="line.2928"></a>
-<span class="sourceLineNo">2929</span>    scan.addColumn(fam1, qf1);<a name="line.2929"></a>
-<span class="sourceLineNo">2930</span>    scan.addColumn(fam1, qf2);<a name="line.2930"></a>
-<span class="sourceLineNo">2931</span>    scan.setMaxVersions(MAX_VERSIONS);<a name="line.2931"></a>
-<span class="sourceLineNo">2932</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.2932"></a>
-<span class="sourceLineNo">2933</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.2933"></a>
-<span class="sourceLineNo">2934</span><a name="line.2934"></a>
-<span class="sourceLineNo">2935</span>    boolean hasNext = scanner.next(actual);<a name="line.2935"></a>
-<span class="sourceLineNo">2936</span>    assertEquals(false, hasNext);<a name="line.2936"></a>
+<span class="sourceLineNo">2921</span>    put = new Put(row1);<a name="line.2921"></a>
+<span class="sourceLineNo">2922</span>    put.add(kv13);<a name="line.2922"></a>
+<span class="sourceLineNo">2923</span>    put.add(kv12);<a name="line.2923"></a>
+<span class="sourceLineNo">2924</span>    put.add(kv11);<a name="line.2924"></a>
+<span class="sourceLineNo">2925</span>    put.add(kv23);<a name="line.2925"></a>
+<span class="sourceLineNo">2926</span>    put.add(kv22);<a name="line.2926"></a>
+<span class="sourceLineNo">2927</span>    put.add(kv21);<a name="line.2927"></a>
+<span class="sourceLineNo">2928</span>    region.put(put);<a name="line.2928"></a>
+<span class="sourceLineNo">2929</span>    region.flush(true);<a name="line.2929"></a>
+<span class="sourceLineNo">2930</span><a name="line.2930"></a>
+<span class="sourceLineNo">2931</span>    // Expected<a name="line.2931"></a>
+<span class="sourceLineNo">2932</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.2932"></a>
+<span class="sourceLineNo">2933</span>    expected.add(kv13);<a name="line.2933"></a>
+<span class="sourceLineNo">2934</span>    expected.add(kv12);<a name="line.2934"></a>
+<span class="sourceLineNo">2935</span>    expected.add(kv23);<a name="line.2935"></a>
+<span class="sourceLineNo">2936</span>    expected.add(kv22);<a name="line.2936"></a>
 <span class="sourceLineNo">2937</span><a name="line.2937"></a>
-<span class="sourceLineNo">2938</span>    // Verify result<a name="line.2938"></a>
-<span class="sourceLineNo">2939</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.2939"></a>
-<span class="sourceLineNo">2940</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected.get(i), actual.get(i)));<a name="line.2940"></a>
-<span class="sourceLineNo">2941</span>    }<a name="line.2941"></a>
-<span class="sourceLineNo">2942</span>  }<a name="line.2942"></a>
-<span class="sourceLineNo">2943</span><a name="line.2943"></a>
-<span class="sourceLineNo">2944</span>  @Test<a name="line.2944"></a>
-<span class="sourceLineNo">2945</span>  public void testScanner_ExplicitColumns_FromMemStoreAndFiles_EnforceVersions() throws<a name="line.2945"></a>
-<span class="sourceLineNo">2946</span>      IOException {<a name="line.2946"></a>
-<span class="sourceLineNo">2947</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2947"></a>
-<span class="sourceLineNo">2948</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2948"></a>
-<span class="sourceLineNo">2949</span>    byte[][] families = { fam1 };<a name="line.2949"></a>
-<span class="sourceLineNo">2950</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.2950"></a>
-<span class="sourceLineNo">2951</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.2951"></a>
-<span class="sourceLineNo">2952</span><a name="line.2952"></a>
-<span class="sourceLineNo">2953</span>    long ts1 = 1;<a name="line.2953"></a>
-<span class="sourceLineNo">2954</span>    long ts2 = ts1 + 1;<a name="line.2954"></a>
-<span class="sourceLineNo">2955</span>    long ts3 = ts1 + 2;<a name="line.2955"></a>
-<span class="sourceLineNo">2956</span>    long ts4 = ts1 + 3;<a name="line.2956"></a>
-<span class="sourceLineNo">2957</span><a name="line.2957"></a>
-<span class="sourceLineNo">2958</span>    // Setting up region<a name="line.2958"></a>
-<span class="sourceLineNo">2959</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2959"></a>
-<span class="sourceLineNo">2960</span>    // Putting data in Region<a name="line.2960"></a>
-<span class="sourceLineNo">2961</span>    KeyValue kv14 = new KeyValue(row1, fam1, qf1, ts4, KeyValue.Type.Put, null);<a name="line.2961"></a>
-<span class="sourceLineNo">2962</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.2962"></a>
-<span class="sourceLineNo">2963</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.2963"></a>
-<span class="sourceLineNo">2964</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.2964"></a>
-<span class="sourceLineNo">2965</span><a name="line.2965"></a>
-<span class="sourceLineNo">2966</span>    KeyValue kv24 = new KeyValue(row1, fam1, qf2, ts4, KeyValue.Type.Put, null);<a name="line.2966"></a>
-<span class="sourceLineNo">2967</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.2967"></a>
-<span class="sourceLineNo">2968</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.2968"></a>
-<span class="sourceLineNo">2969</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.2969"></a>
-<span class="sourceLineNo">2970</span><a name="line.2970"></a>
-<span class="sourceLineNo">2971</span>    Put put = null;<a name="line.2971"></a>
-<span class="sourceLineNo">2972</span>    put = new Put(row1);<a name="line.2972"></a>
-<span class="sourceLineNo">2973</span>    put.add(kv14);<a name="line.2973"></a>
-<span class="sourceLineNo">2974</span>    put.add(kv24);<a name="line.2974"></a>
-<span class="sourceLineNo">2975</span>    region.put(put);<a name="line.2975"></a>
-<span class="sourceLineNo">2976</span>    region.flush(true);<a name="line.2976"></a>
-<span class="sourceLineNo">2977</span><a name="line.2977"></a>
-<span class="sourceLineNo">2978</span>    put = new Put(row1);<a name="line.2978"></a>
-<span class="sourceLineNo">2979</span>    put.add(kv23);<a name="line.2979"></a>
-<span class="sourceLineNo">2980</span>    put.add(kv13);<a name="line.2980"></a>
-<span class="sourceLineNo">2981</span>    region.put(put);<a name="line.2981"></a>
-<span class="sourceLineNo">2982</span>    region.flush(true);<a name="line.2982"></a>
-<span class="sourceLineNo">2983</span><a name="line.2983"></a>
-<span class="sourceLineNo">2984</span>    put = new Put(row1);<a name="line.2984"></a>
-<span class="sourceLineNo">2985</span>    put.add(kv22);<a name="line.2985"></a>
-<span class="sourceLineNo">2986</span>    put.add(kv12);<a name="line.2986"></a>
-<span class="sourceLineNo">2987</span>    region.put(put);<a name="line.2987"></a>
-<span class="sourceLineNo">2988</span>    region.flush(true);<a name="line.2988"></a>
-<span class="sourceLineNo">2989</span><a name="line.2989"></a>
-<span class="sourceLineNo">2990</span>    put = new Put(row1);<a name="line.2990"></a>
-<span class="sourceLineNo">2991</span>    put.add(kv21);<a name="line.2991"></a>
-<span class="sourceLineNo">2992</span>    put.add(kv11);<a name="line.2992"></a>
-<span class="sourceLineNo">2993</span>    region.put(put);<a name="line.2993"></a>
-<span class="sourceLineNo">2994</span><a name="line.2994"></a>
-<span class="sourceLineNo">2995</span>    // Expected<a name="line.2995"></a>
-<span class="sourceLineNo">2996</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.2996"></a>
-<span class="sourceLineNo">2997</span>    expected.add(kv14);<a name="line.2997"></a>
-<span class="sourceLineNo">2998</span>    expected.add(kv13);<a name="line.2998"></a>
-<span class="sourceLineNo">2999</span>    expected.add(kv12);<a name="line.2999"></a>
-<span class="sourceLineNo">3000</span>    expected.add(kv24);<a name="line.3000"></a>
-<span class="sourceLineNo">3001</span>    expected.add(kv23);<a name="line.3001"></a>
-<span class="sourceLineNo">3002</span>    expected.add(kv22);<a name="line.3002"></a>
-<span class="sourceLineNo">3003</span><a name="line.3003"></a>
-<span class="sourceLineNo">3004</span>    Scan scan = new Scan(row1);<a name="line.3004"></a>
-<span class="sourceLineNo">3005</span>    scan.addColumn(fam1, qf1);<a name="line.3005"></a>
-<span class="sourceLineNo">3006</span>    scan.addColumn(fam1, qf2);<a name="line.3006"></a>
-<span class="sourceLineNo">3007</span>    int versions = 3;<a name="line.3007"></a>
-<span class="sourceLineNo">3008</span>    scan.setMaxVersions(versions);<a name="line.3008"></a>
-<span class="sourceLineNo">3009</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.3009"></a>
-<span class="sourceLineNo">3010</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.3010"></a>
-<span class="sourceLineNo">3011</span><a name="line.3011"></a>
-<span class="sourceLineNo">3012</span>    boolean hasNext = scanner.next(actual);<a name="line.3012"></a>
-<span class="sourceLineNo">3013</span>    assertEquals(false, hasNext);<a name="line.3013"></a>
-<span class="sourceLineNo">3014</span><a name="line.3014"></a>
-<span class="sourceLineNo">3015</span>    // Verify result<a name="line.3015"></a>
-<span class="sourceLineNo">3016</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.3016"></a>
-<span class="sourceLineNo">3017</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected.get(i), actual.get(i)));<a name="line.3017"></a>
-<span class="sourceLineNo">3018</span>    }<a name="line.3018"></a>
-<span class="sourceLineNo">3019</span>  }<a name="line.3019"></a>
-<span class="sourceLineNo">3020</span><a name="line.3020"></a>
-<span class="sourceLineNo">3021</span>  @Test<a name="line.3021"></a>
-<span class="sourceLineNo">3022</span>  public void testScanner_Wildcard_FromMemStore_EnforceVersions() throws IOException {<a name="line.3022"></a>
-<span class="sourceLineNo">3023</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.3023"></a>
-<span class="sourceLineNo">3024</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.3024"></a>
-<span class="sourceLineNo">3025</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.3025"></a>
-<span class="sourceLineNo">3026</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.3026"></a>
-<span class="sourceLineNo">3027</span>    byte[][] families = { fam1 };<a name="line.3027"></a>
-<span class="sourceLineNo">3028</span><a name="line.3028"></a>
-<span class="sourceLineNo">3029</span>    long ts1 = System.currentTimeMillis();<a name="line.3029"></a>
-<span class="sourceLineNo">3030</span>    long ts2 = ts1 + 1;<a name="line.3030"></a>
-<span class="sourceLineNo">3031</span>    long ts3 = ts1 + 2;<a name="line.3031"></a>
-<span class="sourceLineNo">3032</span><a name="line.3032"></a>
-<span class="sourceLineNo">3033</span>    // Setting up region<a name="line.3033"></a>
-<span class="sourceLineNo">3034</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.3034"></a>
-<span class="sourceLineNo">3035</span>    // Putting data in Region<a name="line.3035"></a>
-<span class="sourceLineNo">3036</span>    Put put = null;<a name="line.3036"></a>
-<span class="sourceLineNo">3037</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.3037"></a>
-<span class="sourceLineNo">3038</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.3038"></a>
-<span class="sourceLineNo">3039</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.3039"></a>
-<span class="sourceLineNo">3040</span><a name="line.3040"></a>
-<span class="sourceLineNo">3041</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.3041"></a>
-<span class="sourceLineNo">3042</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.3042"></a>
-<span class="sourceLineNo">3043</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.3043"></a>
-<span class="sourceLineNo">3044</span><a name="line.3044"></a>
-<span class="sourceLineNo">3045</span>    put = new Put(row1);<a name="line.3045"></a>
-<span class="sourceLineNo">3046</span>    put.add(kv13);<a name="line.3046"></a>
-<span class="sourceLineNo">3047</span>    put.add(kv12);<a name="line.3047"></a>
-<span class="sourceLineNo">3048</span>    put.add(kv11);<a name="line.3048"></a>
-<span class="sourceLineNo">3049</span>    put.add(kv23);<a name="line.3049"></a>
-<span class="sourceLineNo">3050</span>    put.add(kv22);<a name="line.3050"></a>
-<span class="sourceLineNo">3051</span>    put.add(kv21);<a name="line.3051"></a>
-<span class="sourceLineNo">3052</span>    region.put(put);<a name="line.3052"></a>
-<span class="sourceLineNo">3053</span><a name="line.3053"></a>
-<span class="sourceLineNo">3054</span>    // Expected<a name="line.3054"></a>
-<span class="sourceLineNo">3055</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.3055"></a>
-<span class="sourceLineNo">3056</span>    expected.add(kv13);<a name="line.3056"></a>
-<span class="sourceLineNo">3057</span>    expected.add(kv12);<a name="line.3057"></a>
-<span class="sourceLineNo">3058</span>    expected.add(kv23);<a name="line.3058"></a>
-<span class="sourceLineNo">3059</span>    expected.add(kv22);<a name="line.3059"></a>
-<span class="sourceLineNo">3060</span><a name="line.3060"></a>
-<span class="sourceLineNo">3061</span>    Scan scan = new Scan(row1);<a name="line.3061"></a>
-<span class="sourceLineNo">3062</span>    scan.addFamily(fam1);<a name="line.3062"></a>
-<span class="sourceLineNo">3063</span>    scan.setMaxVersions(MAX_VERSIONS);<a name="line.3063"></a>
-<span class="sourceLineNo">3064</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.3064"></a>
-<span class="sourceLineNo">3065</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.3065"></a>
-<span class="sourceLineNo">3066</span><a name="line.3066"></a>
-<span class="sourceLineNo">3067</span>    boolean hasNext = scanner.next(actual);<a name="line.3067"></a>
-<span class="sourceLineNo">3068</span>    assertEquals(false, hasNext);<a name="line.3068"></a>
-<span class="sourceLineNo">3069</span><a name="line.3069"></a>
-<span class="sourceLineNo">3070</span>    // Verify result<a name="line.3070"></a>
-<span class="sourceLineNo">3071</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.3071"></a>
-<span class="sourceLineNo">3072</span>      assertEquals(expected.get(i), actual.get(i));<a name="line.3072"></a>
-<span class="sourceLineNo">3073</span>    }<a name="line.3073"></a>
-<span class="sourceLineNo">3074</span>  }<a name="line.3074"></a>
-<span class="sourceLineNo">3075</span><a name="line.3075"></a>
-<span class="sourceLineNo">3076</span>  @Test<a name="line.3076"></a>
-<span class="sourceLineNo">3077</span>  public void testScanner_Wildcard_FromFilesOnly_EnforceVersions() throws IOException {<a name="line.3077"></a>
-<span class="sourceLineNo">3078</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.3078"></a>
-<span class="sourceLineNo">3079</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.3079"></a>
-<span class="sourceLineNo">3080</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.3080"></a>
-<span class="sourceLineNo">3081</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.3081"></a>
-<span class="sourceLineNo">3082</span><a name="line.3082"></a>
-<span class="sourceLineNo">3083</span>    long ts1 = 1; // System.currentTimeMillis();<a name="line.3083"></a>
-<span class="sourceLineNo">3084</span>    long ts2 = ts1 + 1;<a name="line.3084"></a>
-<span class="sourceLineNo">3085</span>    long ts3 = ts1 + 2;<a name="line.3085"></a>
-<span class="sourceLineNo">3086</span><a name="line.3086"></a>
-<span class="sourceLineNo">3087</span>    // Setting up region<a name="line.3087"></a>
-<span class="sourceLineNo">3088</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.3088"></a>
-<span class="sourceLineNo">3089</span>    // Putting data in Region<a name="line.3089"></a>
-<span class="sourceLineNo">3090</span>    Put put = null;<a name="line.3090"></a>
-<span class="sourceLineNo">3091</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.3091"></a>
-<span class="sourceLineNo">3092</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.3092"></a>
-<span class="sourceLineNo">3093</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.3093"></a>
-<span class="sourceLineNo">3094</span><a name="line.3094"></a>
-<span class="sourceLineNo">3095</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.3095"></a>
-<span class="sourceLineNo">3096</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.3096"></a>
-<span class="sourceLineNo">3097</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.3097"></a>
-<span class="sourceLineNo">3098</span><a name="line.3098"></a>
-<span class="sourceLineNo">3099</span>    put = new Put(row1);<a name="line.3099"></a>
-<span class="sourceLineNo">3100</span>    put.add(kv13);<a name="line.3100"></a>
-<span class="sourceLineNo">3101</span>    put.add(kv12);<a name="line.3101"></a>
-<span class="sourceLineNo">3102</span>    put.add(kv11);<a name="line.3102"></a>
-<span class="sourceLineNo">3103</span>    put.add(kv23);<a name="line.3103"></a>
-<span class="sourceLineNo">3104</span>    put.add(kv22);<a name="line.3104"></a>
-<span class="sourceLineNo">3105</span>    put.add(kv21);<a name="line.3105"></a>
-<span class="sourceLineNo">3106</span>    region.put(put);<a name="line.3106"></a>
-<span class="sourceLineNo">3107</span>    region.flush(true);<a name="line.3107"></a>
+<span class="sourceLineNo">2938</span>    Scan scan = new Scan(row1);<a name="line.2938"></a>
+<span class="sourceLineNo">2939</span>    scan.addColumn(fam1, qf1);<a name="line.2939"></a>
+<span class="sourceLineNo">2940</span>    scan.addColumn(fam1, qf2);<a name="line.2940"></a>
+<span class="sourceLineNo">2941</span>    scan.setMaxVersions(MAX_VERSIONS);<a name="line.2941"></a>
+<span class="sourceLineNo">2942</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.2942"></a>
+<span class="sourceLineNo">2943</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.2943"></a>
+<span class="sourceLineNo">2944</span><a name="line.2944"></a>
+<span class="sourceLineNo">2945</span>    boolean hasNext = scanner.next(actual);<a name="line.2945"></a>
+<span class="sourceLineNo">2946</span>    assertEquals(false, hasNext);<a name="line.2946"></a>
+<span class="sourceLineNo">2947</span><a name="line.2947"></a>
+<span class="sourceLineNo">2948</span>    // Verify result<a name="line.2948"></a>
+<span class="sourceLineNo">2949</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.2949"></a>
+<span class="sourceLineNo">2950</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected.get(i), actual.get(i)));<a name="line.2950"></a>
+<span class="sourceLineNo">2951</span>    }<a name="line.2951"></a>
+<span class="sourceLineNo">2952</span>  }<a name="line.2952"></a>
+<span class="sourceLineNo">2953</span><a name="line.2953"></a>
+<span class="sourceLineNo">2954</span>  @Test<a name="line.2954"></a>
+<span class="sourceLineNo">2955</span>  public void testScanner_ExplicitColumns_FromMemStoreAndFiles_EnforceVersions() throws<a name="line.2955"></a>
+<span class="sourceLineNo">2956</span>      IOException {<a name="line.2956"></a>
+<span class="sourceLineNo">2957</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2957"></a>
+<span class="sourceLineNo">2958</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2958"></a>
+<span class="sourceLineNo">2959</span>    byte[][] families = { fam1 };<a name="line.2959"></a>
+<span class="sourceLineNo">2960</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.2960"></a>
+<span class="sourceLineNo">2961</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.2961"></a>
+<span class="sourceLineNo">2962</span><a name="line.2962"></a>
+<span class="sourceLineNo">2963</span>    long ts1 = 1;<a name="line.2963"></a>
+<span class="sourceLineNo">2964</span>    long ts2 = ts1 + 1;<a name="line.2964"></a>
+<span class="sourceLineNo">2965</span>    long ts3 = ts1 + 2;<a name="line.2965"></a>
+<span class="sourceLineNo">2966</span>    long ts4 = ts1 + 3;<a name="line.2966"></a>
+<span class="sourceLineNo">2967</span><a name="line.2967"></a>
+<span class="sourceLineNo">2968</span>    // Setting up region<a name="line.2968"></a>
+<span class="sourceLineNo">2969</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2969"></a>
+<span class="sourceLineNo">2970</span>    // Putting data in Region<a name="line.2970"></a>
+<span class="sourceLineNo">2971</span>    KeyValue kv14 = new KeyValue(row1, fam1, qf1, ts4, KeyValue.Type.Put, null);<a name="line.2971"></a>
+<span class="sourceLineNo">2972</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.2972"></a>
+<span class="sourceLineNo">2973</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.2973"></a>
+<span class="sourceLineNo">2974</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.2974"></a>
+<span class="sourceLineNo">2975</span><a name="line.2975"></a>
+<span class="sourceLineNo">2976</span>    KeyValue kv24 = new KeyValue(row1, fam1, qf2, ts4, KeyValue.Type.Put, null);<a name="line.2976"></a>
+<span class="sourceLineNo">2977</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.2977"></a>
+<span class="sourceLineNo">2978</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.2978"></a>
+<span class="sourceLineNo">2979</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.2979"></a>
+<span class="sourceLineNo">2980</span><a name="line.2980"></a>
+<span class="sourceLineNo">2981</span>    Put put = null;<a name="line.2981"></a>
+<span class="sourceLineNo">2982</span>    put = new Put(row1);<a name="line.2982"></a>
+<span class="sourceLineNo">2983</span>    put.add(kv14);<a name="line.2983"></a>
+<span class="sourceLineNo">2984</span>    put.add(kv24);<a name="line.2984"></a>
+<span class="sourceLineNo">2985</span>    region.put(put);<a name="line.2985"></a>
+<span class="sourceLineNo">2986</span>    region.flush(true);<a name="line.2986"></a>
+<span class="sourceLineNo">2987</span><a name="line.2987"></a>
+<span class="sourceLineNo">2988</span>    put = new Put(row1);<a name="line.2988"></a>
+<span class="sourceLineNo">2989</span>    put.add(kv23);<a name="line.2989"></a>
+<span class="sourceLineNo">2990</span>    put.add(kv13);<a name="line.2990"></a>
+<span class="sourceLineNo">2991</span>    region.put(put);<a name="line.2991"></a>
+<span class="sourceLineNo">2992</span>    region.flush(true);<a name="line.2992"></a>
+<span class="sourceLineNo">2993</span><a name="line.2993"></a>
+<span class="sourceLineNo">2994</span>    put = new Put(row1);<a name="line.2994"></a>
+<span class="sourceLineNo">2995</span>    put.add(kv22);<a name="line.2995"></a>
+<span class="sourceLineNo">2996</span>    put.add(kv12);<a name="line.2996"></a>
+<span class="sourceLineNo">2997</span>    region.put(put);<a name="line.2997"></a>
+<span class="sourceLineNo">2998</span>    region.flush(true);<a name="line.2998"></a>
+<span class="sourceLineNo">2999</span><a name="line.2999"></a>
+<span class="sourceLineNo">3000</span>    put = new Put(row1);<a name="line.3000"></a>
+<span class="sourceLineNo">3001</span>    put.add(kv21);<a name="line.3001"></a>
+<span class="sourceLineNo">3002</span>    put.add(kv11);<a name="line.3002"></a>
+<span class="sourceLineNo">3003</span>    region.put(put);<a name="line.3003"></a>
+<span class="sourceLineNo">3004</span><a name="line.3004"></a>
+<span class="sourceLineNo">3005</span>    // Expected<a name="line.3005"></a>
+<span class="sourceLineNo">3006</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.3006"></a>
+<span class="sourceLineNo">3007</span>    expected.add(kv14);<a name="line.3007"></a>
+<span class="sourceLineNo">3008</span>    expected.add(kv13);<a name="line.3008"></a>
+<span class="sourceLineNo">3009</span>    expected.add(kv12);<a name="line.3009"></a>
+<span class="sourceLineNo">3010</span>    expected.add(kv24);<a name="line.3010"></a>
+<span class="sourceLineNo">3011</span>    expected.add(kv23);<a name="line.3011"></a>
+<span class="sourceLineNo">3012</span>    expected.add(kv22);<a name="line.3012"></a>
+<span class="sourceLineNo">3013</span><a name="line.3013"></a>
+<span class="sourceLineNo">3014</span>    Scan scan = new Scan(row1);<a name="line.3014"></a>
+<span class="sourceLineNo">3015</span>    scan.addColumn(fam1, qf1);<a name="line.3015"></a>
+<span class="sourceLineNo">3016</span>    scan.addColumn(fam1, qf2);<a name="line.3016"></a>
+<span class="sourceLineNo">3017</span>    int versions = 3;<a name="line.3017"></a>
+<span class="sourceLineNo">3018</span>    scan.setMaxVersions(versions);<a name="line.3018"></a>
+<span class="sourceLineNo">3019</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.3019"></a>
+<span class="sourceLineNo">3020</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.3020"></a>
+<span class="sourceLineNo">3021</span><a name="line.3021"></a>
+<span class="sourceLineNo">3022</span>    boolean hasNext = scanner.next(actual);<a name="line.3022"></a>
+<span class="sourceLineNo">3023</span>    assertEquals(false, hasNext);<a name="line.3023"></a>
+<span class="sourceLineNo">3024</span><a name="line.3024"></a>
+<span class="sourceLineNo">3025</span>    // Verify result<a name="line.3025"></a>
+<span class="sourceLineNo">3026</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.3026"></a>
+<span class="sourceLineNo">3027</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected.get(i), actual.get(i)));<a name="line.3027"></a>
+<span class="sourceLineNo">3028</span>    }<a name="line.3028"></a>
+<span class="sourceLineNo">3029</span>  }<a name="line.3029"></a>
+<span class="sourceLineNo">3030</span><a name="line.3030"></a>
+<span class="sourceLineNo">3031</span>  @Test<a name="line.3031"></a>
+<span class="sourceLineNo">3032</span>  public void testScanner_Wildcard_FromMemStore_EnforceVersions() throws IOException {<a name="line.3032"></a>
+<span class="sourceLineNo">3033</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.3033"></a>
+<span class="sourceLineNo">3034</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.3034"></a>
+<span class="sourceLineNo">3035</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.3035"></a>
+<span class="sourceLineNo">3036</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.3036"></a>
+<span class="sourceLineNo">3037</span>    byte[][] families = { fam1 };<a name="line.3037"></a>
+<span class="sourceLineNo">3038</span><a name="line.3038"></a>
+<span class="sourceLineNo">3039</span>    long ts1 = System.currentTimeMillis();<a name="line.3039"></a>
+<span class="sourceLineNo">3040</span>    long ts2 = ts1 + 1;<a name="line.3040"></a>
+<span class="sourceLineNo">3041</span>    long ts3 = ts1 + 2;<a name="line.3041"></a>
+<span class="sourceLineNo">3042</span><a name="line.3042"></a>
+<span class="sourceLineNo">3043</span>    // Setting up region<a name="line.3043"></a>
+<span class="sourceLineNo">3044</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.3044"></a>
+<span class="sourceLineNo">3045</span>    // Putting data in Region<a name="line.3045"></a>
+<span class="sourceLineNo">3046</span>    Put put = null;<a name="line.3046"></a>
+<span class="sourceLineNo">3047</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.3047"></a>
+<span class="sourceLineNo">3048</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.3048"></a>
+<span class="sourceLineNo">3049</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.3049"></a>
+<span class="sourceLineNo">3050</span><a name="line.3050"></a>
+<span class="sourceLineNo">3051</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.3051"></a>
+<span class="sourceLineNo">3052</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.3052"></a>
+<span class="sourceLineNo">3053</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.3053"></a>
+<span class="sourceLineNo">3054</span><a name="line.3054"></a>
+<span class="sourceLineNo">3055</span>    put = new Put(row1);<a name="line.3055"></a>
+<span class="sourceLineNo">3056</span>    put.add(kv13);<a name="line.3056"></a>
+<span class="sourceLineNo">3057</span>    put.add(kv12);<a name="line.3057"></a>
+<span class="sourceLineNo">3058</span>    put.add(kv11);<a name="line.3058"></a>
+<span class="sourceLineNo">3059</span>    put.add(kv23);<a name="line.3059"></a>
+<span class="sourceLineNo">3060</span>    put.add(kv22);<a name="line.3060"></a>
+<span class="sourceLineNo">3061</span>    put.add(kv21);<a name="line.3061"></a>
+<span class="sourceLineNo">3062</span>    region.put(put);<a name="line.3062"></a>
+<span class="sourceLineNo">3063</span><a name="line.3063"></a>
+<span class="sourceLineNo">3064</span>    // Expected<a name="line.3064"></a>
+<span class="sourceLineNo">3065</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.3065"></a>
+<span class="sourceLineNo">3066</span>    expected.add(kv13);<a name="line.3066"></a>
+<span class="sourceLineNo">3067</span>    expected.add(kv12);<a name="line.3067"></a>
+<span class="sourceLineNo">3068</span>    expected.add(kv23);<a name="line.3068"></a>
+<span class="sourceLineNo">3069</span>    expected.add(kv22);<a name="line.3069"></a>
+<span class="sourceLineNo">3070</span><a name="line.3070"></a>
+<span class="sourceLineNo">3071</span>    Scan scan = new Scan(row1);<a name="line.3071"></a>
+<span class="sourceLineNo">3072</span>    scan.addFamily(fam1);<a name="line.3072"></a>
+<span class="sourceLineNo">3073</span>    scan.setMaxVersions(MAX_VERSIONS);<a name="line.3073"></a>
+<span class="sourceLineNo">3074</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.3074"></a>
+<span class="sourceLineNo">3075</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.3075"></a>
+<span class="sourceLineNo">3076</span><a name="line.3076"></a>
+<span class="sourceLineNo">3077</span>    boolean hasNext = scanner.next(actual);<a name="line.3077"></a>
+<span class="sourceLineNo">3078</span>    assertEquals(false, hasNext);<a name="line.3078"></a>
+<span class="sourceLineNo">3079</span><a name="line.3079"></a>
+<span class="sourceLineNo">3080</span>    // Verify result<a name="line.3080"></a>
+<span class="sourceLineNo">3081</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.3081"></a>
+<span class="sourceLineNo">3082</span>      assertEquals(expected.get(i), actual.get(i));<a name="line.3082"></a>
+<span class="sourceLineNo">3083</span>    }<a name="line.3083"></a>
+<span class="sourceLineNo">3084</span>  }<a name="line.3084"></a>
+<span class="sourceLineNo">3085</span><a name="line.3085"></a>
+<span class="sourceLineNo">3086</span>  @Test<a name="line.3086"></a>
+<span class="sourceLineNo">3087</span>  public void testScanner_Wildcard_FromFilesOnly_EnforceVersions() throws IOException {<a name="line.3087"></a>
+<span class="sourceLineNo">3088</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.3088"></a>
+<span class="sourceLineNo">3089</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.3089"></a>
+<span class="sourceLineNo">3090</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.3090"></a>
+<span class="sourceLineNo">3091</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.3091"></a>
+<span class="sourceLineNo">3092</span><a name="line.3092"></a>
+<span class="sourceLineNo">3093</span>    long ts1 = 1; // System.currentTimeMillis();<a name="line.3093"></a>
+<span class="sourceLineNo">3094</span>    long ts2 = ts1 + 1;<a name="line.3094"></a>
+<span class="sourceLineNo">3095</span>    long ts3 = ts1 + 2;<a name="line.3095"></a>
+<span class="sourceLineNo">3096</span><a name="line.3096"></a>
+<span class="sourceLineNo">3097</span>    // Setting up region<a name="line.3097"></a>
+<span class="sourceLineNo">3098</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.3098"></a>
+<span class="sourceLineNo">3099</span>    // Putting data in Region<a name="line.3099"></a>
+<span class="sourceLineNo">3100</span>    Put put = null;<a name="line.3100"></a>
+<span class="sourceLineNo">3101</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.3101"></a>
+<span class="sourceLineNo">3102</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.3102"></a>
+<span class="sourceLineNo">3103</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.3103"></a>
+<span class="sourceLineNo">3104</span><a name="line.3104"></a>
+<span class="sourceLineNo">3105</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.3105"></a>
+<span class="sourceLineNo">3106</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.3106"></a>
+<span class="sourceLineNo">3107</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.3107"></a>
 <span class="sourceLineNo">3108</span><a name="line.3108"></a>
-<span class="sourceLineNo">3109</span>    // Expected<a name="line.3109"></a>
-<span class="sourceLineNo">3110</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.3110"></a>
-<span class="sourceLineNo">3111</span>    expected.add(kv13);<a name="line.3111"></a>
-<span class="sourceLineNo">3112</span>    expected.add(kv12);<a name="line.3112"></a>
-<span class="sourceLineNo">3113</span>    expected.add(kv23);<a name="line.3113"></a>
-<span class="sourceLineNo">3114</span>    expected.add(kv22);<a name="line.3114"></a>
-<span class="sourceLineNo">3115</span><a name="line.3115"></a>
-<span class="sourceLineNo">3116</span>    Scan scan = new Scan(row1);<a name="line.3116"></a>
-<span class="sourceLineNo">3117</span>    scan.addFamily(fam1);<a name="line.3117"></a>
-<span class="sourceLineNo">3118</span>    scan.setMaxVersions(MAX_VERSIONS);<a name="line.3118"></a>
-<span class="sourceLineNo">3119</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.3119"></a>
-<span class="sourceLineNo">3120</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.3120"></a>
-<span class="sourceLineNo">3121</span><a name="line.3121"></a>
-<span class="sourceLineNo">3122</span>    boolean hasNext = scanner.next(actual);<a name="line.3122"></a>
-<span class="sourceLineNo">3123</span>    assertEquals(false, hasNext);<a name="line.3123"></a>
-<span class="sourceLineNo">3124</span><a name="line.3124"></a>
-<span class="sourceLineNo">3125</span>    // Verify result<a name="line.3125"></a>
-<span class="sourceLineNo">3126</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.3126"></a>
-<span class="sourceLineNo">3127</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected.get(i), actual.get(i)));<a name="line.3127"></a>
-<span class="sourceLineNo">3128</span>    }<a name="line.3128"></a>
-<span class="sourceLineNo">3129</span>  }<a name="line.3129"></a>
-<span class="sourceLineNo">3130</span><a name="line.3130"></a>
-<span class="sourceLineNo">3131</span>  @Test<a name="line.3131"></a>
-<span class="sourceLineNo">3132</span>  public void testScanner_StopRow1542() throws IOException {<a name="line.3132"></a>
-<span class="sourceLineNo">3133</span>    byte[] family = Bytes.toBytes("testFamily");<a name="line.3133"></a>
-<span class="sourceLineNo">3134</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.3134"></a>
-<span class="sourceLineNo">3135</span>    byte[] row1 = Bytes.toBytes("row111");<a name="line.3135"></a>
-<span class="sourceLineNo">3136</span>    byte[] row2 = Bytes.toBytes("row222");<a name="line.3136"></a>
-<span class="sourceLineNo">3137</span>    byte[] row3 = Bytes.toBytes("row333");<a name="line.3137"></a>
-<span class="sourceLineNo">3138</span>    byte[] row4 = Bytes.toBytes("row444");<a name="line.3138"></a>
-<span class="sourceLineNo">3139</span>    byte[] row5 = Bytes.toBytes("row555");<a name="line.3139"></a>
+<span class="sourceLineNo">3109</span>    put = new Put(row1);<a name="line.3109"></a>
+<span class="sourceLineNo">3110</span>    put.add(kv13);<a name="line.3110"></a>
+<span class="sourceLineNo">3111</span>    put.add(kv12);<a name="line.3111"></a>
+<span class="sourceLineNo">3112</span>    put.add(kv11);<a name="line.3112"></a>
+<span class="sourceLineNo">3113</span>    put.add(kv23);<a name="line.3113"></a>
+<span class="sourceLineNo">3114</span>    put.add(kv22);<a name="line.3114"></a>
+<span class="sourceLineNo">3115</span>    put.add(kv21);<a name="line.3115"></a>
+<span class="sourceLineNo">3116</span>    region.put(put);<a name="line.3116"></a>
+<span class="sourceLineNo">3117</span>    region.flush(true);<a name="line.3117"></a>
+<span class="sourceLineNo">3118</span><a name="line.3118"></a>
+<span class="sourceLineNo">3119</span>    // Expected<a name="line.3119"></a>
+<span class="sourceLineNo">3120</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.3120"></a>
+<span class="sourceLineNo">3121</span>    expected.add(kv13);<a name="line.3121"></a>
+<span class="sourceLineNo">3122</span>    expected.add(kv12);<a name="line.3122"></a>
+<span class="sourceLineNo">3123</span>    expected.add(kv23);<a name="line.3123"></a>
+<span class="sourceLineNo">3124</span>    expected.add(kv22);<a name="line.3124"></a>
+<span class="sourceLineNo">3125</span><a name="line.3125"></a>
+<span class="sourceLineNo">3126</span>    Scan scan = new Scan(row1);<a name="line.3126"></a>
+<span class="sourceLineNo">3127</span>    scan.addFamily(fam1);<a name="line.3127"></a>
+<span class="sourceLineNo">3128</span>    scan.setMaxVersions(MAX_VERSIONS);<a name="line.3128"></a>
+<span class="sourceLineNo">3129</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.3129"></a>
+<span class="sourceLineNo">3130</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.3130"></a>
+<span class="sourceLineNo">3131</span><a name="line.3131"></a>
+<span class="sourceLineNo">3132</span>    boolean hasNext = scanner.next(actual);<a name="line.3132"></a>
+<span class="sourceLineNo">3133</span>    assertEquals(false, hasNext);<a name="line.3133"></a>
+<span class="sourceLineNo">3134</span><a name="line.3134"></a>
+<span class="sourceLineNo">3135</span>    // Verify result<a name="line.3135"></a>
+<span class="sourceLineNo">3136</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.3136"></a>
+<span class="sourceLineNo">3137</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected.get(i), actual.get(i)));<a name="line.3137"></a>
+<span class="sourceLineNo">3138</span>    }<a name="line.3138"></a>
+<span class="sourceLineNo">3139</span>  }<a name="line.3139"></a>
 <span class="sourceLineNo">3140</span><a name="line.3140"></a>
-<span class="sourceLineNo">3141</span>    byte[] col1 = Bytes.toBytes("Pub111");<a name="line.3141"></a>
-<span class="sourceLineNo">3142</span>    byte[] col2 = Bytes.toBytes("Pub222");<a name="line.3142"></a>
-<span class="sourceLineNo">3143</span><a name="line.3143"></a>
-<span class="sourceLineNo">3144</span>    Put put = new Put(row1);<a name="line.3144"></a>
-<span class="sourceLineNo">3145</span>    put.addColumn(family, col1, Bytes.toBytes(10L));<a name="line.3145"></a>
-<span class="sourceLineNo">3146</span>    region.put(put);<a name="line.3146"></a>
-<span class="sourceLineNo">3147</span><a name="line.3147"></a>
-<span class="sourceLineNo">3148</span>    put = new Put(row2);<a name="line.3148"></a>
-<span class="sourceLineNo">3149</span>    put.addColumn(family, col1, Bytes.toBytes(15L));<a name="line.3149"></a>
-<span class="sourceLineNo">3150</span>    region.put(put);<a name="line.3150"></a>
-<span class="sourceLineNo">3151</span><a name="line.3151"></a>
-<span class="sourceLineNo">3152</span>    put = new Put(row3);<a name="line.3152"></a>
-<span class="sourceLineNo">3153</span>    put.addColumn(family, col2, Bytes.toBytes(20L));<a name="line.3153"></a>
-<span class="sourceLineNo">3154</span>    region.put(put);<a name="line.3154"></a>
-<span class="sourceLineNo">3155</span><a name="line.3155"></a>
-<span class="sourceLineNo">3156</span>    put = new Put(row4);<a name="line.3156"></a>
-<span class="sourceLineNo">3157</span>    put.addColumn(family, col2, Bytes.toBytes(30L));<a name="line.3157"></a>
-<span class="sourceLineNo">3158</span>    region.put(put);<a name="line.3158"></a>
-<span class="sourceLineNo">3159</span><a name="line.3159"></a>
-<span class="sourceLineNo">3160</span>    put = new Put(row5);<a name="line.3160"></a>
-<span class="sourceLineNo">3161</span>    put.addColumn(family, col1, Bytes.toBytes(40L));<a name="line.3161"></a>
-<span class="sourceLineNo">3162</span>    region.put(put);<a name="line.3162"></a>
-<span class="sourceLineNo">3163</span><a name="line.3163"></a>
-<span class="sourceLineNo">3164</span>    Scan scan = new Scan(row3, row4);<a name="line.3164"></a>
-<span class="sourceLineNo">3165</span>    scan.setMaxVersions();<a name="line.3165"></a>
-<span class="sourceLineNo">3166</span>    scan.addColumn(family, col1);<a name="line.3166"></a>
-<span class="sourceLineNo">3167</span>    InternalScanner s = region.getScanner(scan);<a name="line.3167"></a>
-<span class="sourceLineNo">3168</span><a name="line.3168"></a>
-<span class="sourceLineNo">3169</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.3169"></a>
-<span class="sourceLineNo">3170</span>    assertEquals(false, s.next(results));<a name="line.3170"></a>
-<span class="sourceLineNo">3171</span>    assertEquals(0, results.size());<a name="line.3171"></a>
-<span class="sourceLineNo">3172</span>  }<a name="line.3172"></a>
+<span class="sourceLineNo">3141</span>  @Test<a name="line.3141"></a>
+<span class="sourceLineNo">3142</span>  public void testScanner_StopRow1542() throws IOException {<a name="line.3142"></a>
+<span class="sourceLineNo">3143</span>    byte[] family = Bytes.toBytes("testFamily");<a name="line.3143"></a>
+<span class="sourceLineNo">3144</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.3144"></a>
+<span class="sourceLineNo">3145</span>    byte[] row1 = Bytes.toBytes("row111");<a name="line.3145"></a>
+<span class="sourceLineNo">3146</span>    byte[] row2 = Bytes.toBytes("row222");<a name="line.3146"></a>
+<span class="sourceLineNo">3147</span>    byte[] row3 = Bytes.toBytes("row333");<a name="line.3147"></a>
+<span class="sourceLineNo">3148</span>    byte[] row4 = Bytes.toBytes("row444");<a name="line.3148"></a>
+<span class="sourceLineNo">3149</span>    byte[] row5 = Bytes.toBytes("row555");<a name="line.3149"></a>
+<span class="sourceLineNo">3150</span><a name="line.3150"></a>
+<span class="sourceLineNo">3151</span>    byte[] col1 = Bytes.toBytes("Pub111");<a name="line.3151"></a>
+<span class="sourceLineNo">3152</span>    byte[] col2 = Bytes.toBytes("Pub222");<a name="line.3152"></a>
+<span class="sourceLineNo">3153</span><a name="line.3153"></a>
+<span class="sourceLineNo">3154</span>    Put put = new Put(row1);<a name="line.3154"></a>
+<span class="sourceLineNo">3155</span>    put.addColumn(family, col1, Bytes.toBytes(10L));<a name="line.3155"></a>
+<span class="sourceLineNo">3156</span>    region.put(put);<a name="line.3156"></a>
+<span class="sourceLineNo">3157</span><a name="line.3157"></a>
+<span class="sourceLineNo">3158</span>    put = new Put(row2);<a name="line.3158"></a>
+<span class="sourceLineNo">3159</span>    put.addColumn(family, col1, Bytes.toBytes(15L));<a name="line.3159"></a>
+<span class="sourceLineNo">3160</span>    region.put(put);<a name="line.3160"></a>
+<span class="sourceLineNo">3161</span><a name="line.3161"></a>
+<span class="sourceLineNo">3162</span>    put = new Put(row3);<a name="line.3162"></a>
+<span class="sourceLineNo">3163</span>    put.addColumn(family, col2, Bytes.toBytes(20L));<a name="line.3163"></a>
+<span class="sourceLineNo">3164</span>    region.put(put);<a name="line.3164"></a>
+<span class="sourceLineNo">3165</span><a name="line.3165"></a>
+<span class="sourceLineNo">3166</span>    put = new Put(row4);<a name="line.3166"></a>
+<span class="sourceLineNo">3167</span>    put.addColumn(family, col2, Bytes.toBytes(30L));<a name="line.3167"></a>
+<span class="sourceLineNo">3168</span>    region.put(put);<a name="line.3168"></a>
+<span class="sourceLineNo">3169</span><a name="line.3169"></a>
+<span class="sourceLineNo">3170</span>    put = new Put(row5);<a name="line.3170"></a>
+<span class="sourceLineNo">3171</span>    put.addColumn(family, col1, Bytes.toBytes(40L));<a name="line.3171"></a>
+<span class="sourceLineNo">3172</span>    region.put(put);<a name="line.3172"></a>
 <span class="sourceLineNo">3173</span><a name="line.3173"></a>
-<span class="sourceLineNo">3174</span>  @Test<a name="line.3174"></a>
-<span class="sourceLineNo">3175</span>  public void testScanner_Wildcard_FromMemStoreAndFiles_EnforceVersions() throws IOException {<a name="line.3175"></a>
-<span class="sourceLineNo">3176</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.3176"></a>
-<span class="sourceLineNo">3177</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.3177"></a>
-<span class="sourceLineNo">3178</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.3178"></a>
-<span class="sourceLineNo">3179</span>    byte[] qf2 = Bytes.toBytes("quateslifier2");<a name="line.3179"></a>
-<span class="sourceLineNo">3180</span><a name="line.3180"></a>
-<span class="sourceLineNo">3181</span>    long ts1 = 1;<a name="line.3181"></a>
-<span class="sourceLineNo">3182</span>    long ts2 = ts1 + 1;<a name="line.3182"></a>
-<span class="sourceLineNo">3183</span>    long ts3 = ts1 + 2;<a name="line.3183"></a>
-<span class="sourceLineNo">3184</span>    long ts4 = ts1 + 3;<a name="line.3184"></a>
-<span class="sourceLineNo">3185</span><a name="line.3185"></a>
-<span class="sourceLineNo">3186</span>    // Setting up region<a name="line.3186"></a>
-<span class="sourceLineNo">3187</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.3187"></a>
-<span class="sourceLineNo">3188</span>    // Putting data in Region<a name="line.3188"></a>
-<span class="sourceLineNo">3189</span>    KeyValue kv14 = new KeyValue(row1, fam1, qf1, ts4, KeyValue.Type.Put, null);<a name="line.3189"></a>
-<span class="sourceLineNo">3190</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.3190"></a>
-<span class="sourceLineNo">3191</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.3191"></a>
-<span class="sourceLineNo">3192</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.3192"></a>
-<span class="sourceLineNo">3193</span><a name="line.3193"></a>
-<span class="sourceLineNo">3194</span>    KeyValue kv24 = new KeyValue(row1, fam1, qf2, ts4, KeyValue.Type.Put, null);<a name="line.3194"></a>
-<span class="sourceLineNo">3195</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.3195"></a>
-<span class="sourceLineNo">3196</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.3196"></a>
-<span class="sourceLineNo">3197</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.3197"></a>
-<span class="sourceLineNo">3198</span><a name="line.3198"></a>
-<span class="sourceLineNo">3199</span>    Put put = null;<a name="line.3199"></a>
-<span class="sourceLineNo">3200</span>    put = new Put(row1);<a name="line.3200"></a>
-<span class="sourceLineNo">3201</span>    put.add(kv14);<a name="line.3201"></a>
-<span class="sourceLineNo">3202</span>    put.add(kv24);<a name="line.3202"></a>
-<span class="sourceLineNo">3203</span>    region.put(put);<a name="line.3203"></a>
-<span class="sourceLineNo">3204</span>    region.flush(true);<a name="line.3204"></a>
-<span class="sourceLineNo">3205</span><a name="line.3205"></a>
-<span class="sourceLineNo">3206</span>    put = new Put(row1);<a name="line.3206"></a>
-<span class="sourceLineNo">3207</span>    put.add(kv23);<a name="line.3207"></a>
-<span class="sourceLineNo">3208</span>    put.add(kv13);<a name="line.3208"></a>
-<span class="sourceLineNo">3209</span>    region.put(put);<a name="line.3209"></a>
-<span class="sourceLineNo">3210</span>    region.flush(true);<a name="line.3210"></a>
-<span class="sourceLineNo">3211</span><a name="line.3211"></a>
-<span class="sourceLineNo">3212</span>    put = new Put(row1);<a name="line.3212"></a>
-<span class="sourceLineNo">3213</span>    put.add(kv22);<a name="line.3213"></a>
-<span class="sourceLineNo">3214</span>    put.add(kv12);<a name="line.3214"></a>
-<span class="sourceLineNo">3215</span>    region.put(put);<a name="line.3215"></a>
-<span class="sourceLineNo">3216</span>    region.flush(true);<a name="line.3216"></a>
-<span class="sourceLineNo">3217</span><a name="line.3217"></a>
-<span class="sourceLineNo">3218</span>    put = new Put(row1);<a name="line.3218"></a>
-<span class="sourceLineNo">3219</span>    put.add(kv21);<a name="line.3219"></a>
-<span class="sourceLineNo">3220</span>    put.add(kv11);<a name="line.3220"></a>
-<span class="sourceLineNo">3221</span>    region.put(put);<a name="line.3221"></a>
-<span class="sourceLineNo">3222</span><a name="line.3222"></a>
-<span class="sourceLineNo">3223</span>    // Expected<a name="line.3223"></a>
-<span class="sourceLineNo">3224</span>    List&lt;KeyValue&gt; expected = new ArrayList&lt;&gt;();<a name="line.3224"></a>
-<span class="sourceLineNo">3225</span>    expected.add(kv14);<a name="line.3225"></a>
-<span class="sourceLineNo">3226</span>    expected.add(kv13);<a name="line.3226"></a>
-<span class="sourceLineNo">3227</span>    expected.add(kv12);<a name="line.3227"></a>
-<span class="sourceLineNo">3228</span>    expected.add(kv24);<a name="line.3228"></a>
-<span class="sourceLineNo">3229</span>    expected.add(kv23);<a name="line.3229"></a>
-<span class="sourceLineNo">3230</span>    expected.add(kv22);<a name="line.3230"></a>
-<span class="sourceLineNo">3231</span><a name="line.3231"></a>
-<span class="sourceLineNo">3232</span>    Scan scan = new Scan(row1);<a name="line.3232"></a>
-<span class="sourceLineNo">3233</span>    int versions = 3;<a name="line.3233"></a>
-<span class="sourceLineNo">3234</span>    scan.setMaxVersions(versions);<a name="line.3234"></a>
-<span class="sourceLineNo">3235</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.3235"></a>
-<span class="sourceLineNo">3236</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.3236"></a>
-<span class="sourceLineNo">3237</span><a name="line.3237"></a>
-<span class="sourceLineNo">3238</span>    boolean hasNext = scanner.next(actual);<a name="line.3238"></a>
-<span class="sourceLineNo">3239</span>    assertEquals(false, hasNext);<a name="line.3239"></a>
-<span class="sourceLineNo">3240</span><a name="line.3240"></a>
-<span class="sourceLineNo">3241</span>    // Verify result<a name="line.3241"></a>
-<span class="sourceLineNo">3242</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.3242"></a>
-<span class="sourceLineNo">3243</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected.get(i), actual.get(i)));<a name="line.3243"></a>
-<span class="sourceLineNo">3244</span>    }<a name="line.3244"></a>
-<span class="sourceLineNo">3245</span>  }<a name="line.3245"></a>
-<span class="sourceLineNo">3246</span><a name="line.3246"></a>
-<span class="sourceLineNo">3247</span>  /**<a name="line.3247"></a>
-<span class="sourceLineNo">3248</span>   * Added for HBASE-5416<a name="line.3248"></a>
-<span class="sourceLineNo">3249</span>   *<a name="line.3249"></a>
-<span class="sourceLineNo">3250</span>   * Here we test scan optimization when only subset of CFs are used in filter<a name="line.3250"></a>
-<span class="sourceLineNo">3251</span>   * conditions.<a name="line.3251"></a>
-<span class="sourceLineNo">3252</span>   */<a name="line.3252"></a>
-<span class="sourceLineNo">3253</span>  @Test<a name="line.3253"></a>
-<span class="sourceLineNo">3254</span>  public void testScanner_JoinedScanners() throws IOException {<a name="line.3254"></a>
-<span class="sourceLineNo">3255</span>    byte[] cf_essential = Bytes.toBytes("essential");<a name="line.3255"></a>
-<span class="sourceLineNo">3256</span>    byte[] cf_joined = Bytes.toBytes("joined");<a name="line.3256"></a>
-<span class="sourceLineNo">3257</span>    byte[] cf_alpha = Bytes.toBytes("alpha");<a name="line.3257"></a>
-<span class="sourceLineNo">3258</span>    this.region = initHRegion(tableName, method, CONF, cf_essential, cf_joined, cf_alpha);<a name="line.3258"></a>
-<span class="sourceLineNo">3259</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.3259"></a>
-<span class="sourceLineNo">3260</span>    byte[] row2 = Bytes.toBytes("row2");<a name="line.3260"></a>
-<span class="sourceLineNo">3261</span>    byte[] row3 = Bytes.toBytes("row3");<a name="line.3261"></a>
-<span class="sourceLineNo">3262</span><a name="line.3262"></a>
-<span class="sourceLineNo">3263</span>    byte[] col_normal = Bytes.toBytes("d");<a name="line.3263"></a>
-<span class="sourceLineNo">3264</span>    byte[] col_alpha = Bytes.toBytes("a");<a name="line.3264"></a>
-<span class="sourceLineNo">3265</span><a name="line.3265"></a>
-<span class="sourceLineNo">3266</span>    byte[] filtered_val = Bytes.toBytes(3);<a name="line.3266"></a>
-<span class="sourceLineNo">3267</span><a name="line.3267"></a>
-<span class="sourceLineNo">3268</span>    Put put = new Put(row1);<a name="line.3268"></a>
-<span class="sourceLineNo">3269</span>    put.addColumn(cf_essential, col_normal, Bytes.toBytes(1));<a name="line.3269"></a>
-<span class="sourceLineNo">3270</span>    put.addColumn(cf_joined, col_alpha, Bytes.toBytes(1));<a name="line.3270"></a>
-<span class="sourceLineNo">3271</span>    region.put(put);<a name="line.3271"></a>
+<span class="sourceLineNo">3174</span>    Scan scan = new Scan(row3, row4);<a name="line.3174"></a>
+<span class="sourceLineNo">3175</span>    scan.setMaxVersions();<a name="line.3175"></a>
+<span class="sourceLineNo">3176</span>    scan.addColumn(family, col1);<a name="line.3176"></a>
+<span class="sourceLineNo">3177</span>    InternalScanner s = region.getScanner(scan);<a name="line.3177"></a>
+<span class="sourceLineNo">3178</span><a name="line.3178"></a>
+<span class="sourceLineNo">3179</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.3179"></a>
+<span class="sourceLineNo">3180</span>    assertEquals(false, s.next(results));<a name="line.3180"></a>
+<span class="sourceLineNo">3181</span>    assertEquals(0, results.size());<a name="line.3181"></a>
+<span class="sourceLineNo">3182</span>  }<a name="line.3182"></a>
+<span class="sourceLineNo">3183</span><a name="line.3183"></a>
+<span class="sourceLineNo">3184</span>  @Test<a name="line.3184"></a>
+<span class="sourceLineNo">3185</span>  public void testScanner_Wildcard_FromMemStoreAndFiles_EnforceVersions() throws IOException {<a name="line.3185"></a>
+<span class="sourceLineNo">3186</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.3186"></a>
+<span class="sourceLineNo">3187</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.3187"></a>
+<span class="sourceLineNo">3188</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.3188"></a>
+<span class="sourceLineNo">3189</span>    byte[] qf2 = Bytes.toBytes("quateslifier2");<a name="line.3189"></a>
+<span class="sourceLineNo">3190</span><a name="line.3190"></a>
+<span class="sourceLineNo">3191</span>    long ts1 = 1;<a name="line.3191"></a>
+<span class="sourceLineNo">3192</span>    long ts2 = ts1 + 1;<a name="line.3192"></a>
+<span class="sourceLineNo">3193</span>    long ts3 = ts1 + 2;<a name="line.3193"></a>
+<span class="sourceLineNo">3194</span>    long ts4 = ts1 + 3;<a name="line.3194"></a>
+<span class="sourceLineNo">3195</span><a name="line.3195"></a>
+<span class="sourceLineNo">3196</span>    // Setting up region<a name="line.3196"></a>
+<span class="sourceLineNo">3197</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.3197"></a>
+<span class="sourceLineNo">3198</span>    // Putting data in Region<a name="line.3198"></a>
+<span class="sourceLineNo">3199</span>    KeyValue kv14 = new KeyValue(row1, fam1, qf1, ts4, KeyValue.Type.Put, null);<a name="line.3199"></a>
+<span class="sourceLineNo">3200</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.3200"></a>
+<span class="sourceLineNo">3201</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.3201"></a>
+<span class="sourceLineNo">3202</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.3202"></a>
+<span class="sourceLineNo">3203</span><a name="line.3203"></a>
+<span class="sourceLineNo">3204</span>    KeyValue kv24 = new KeyValue(row1, fam1, qf2, ts4, KeyValue.Type.Put, null);<a name="line.3204"></a>
+<span class="sourceLineNo">3205</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.3205"></a>
+<span class="sourceLineNo">3206</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.3206"></a>
+<span class="sourceLineNo">3207</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.3207"></a>
+<span class="sourceLineNo">3208</span><a name="line.3208"></a>
+<span class="sourceLineNo">3209</span>    Put put = null;<a name="line.3209"></a>
+<span class="sourceLineNo">3210</span>    put = new Put(row1);<a name="line.3210"></a>
+<span class="sourceLineNo">3211</span>    put.add(kv14);<a name="line.3211"></a>
+<span class="sourceLineNo">3212</span>    put.add(kv24);<a name="line.3212"></a>
+<span class="sourceLineNo">3213</span>    region.put(put);<a name="line.3213"></a>
+<span class="sourceLineNo">3214</span>    region.flush(true);<a name="line.3214"></a>
+<span class="sourceLineNo">3215</span><a name="line.3215"></a>
+<span class="sourceLineNo">3216</span>    put = new Put(row1);<a name="line.3216"></a>
+<span class="sourceLineNo">3217</span>    put.add(kv23);<a name="line.3217"></a>
+<span class="sourceLineNo">3218</span>    put.add(kv13);<a name="line.3218"></a>
+<span class="sourceLineNo">3219</span>    region.put(put);<a name="line.3219"></a>
+<span class="sourceLineNo">3220</span>    region.flush(true);<a name="line.3220"></a>
+<span class="sourceLineNo">3221</span><a name="line.3221"></a>
+<span class="sourceLineNo">3222</span>    put = new Put(row1);<a name="line.3222"></a>
+<span class="sourceLineNo">3223</span>    put.add(kv22);<a name="line.3223"></a>
+<span class="sourceLineNo">3224</span>    put.add(kv12);<a name="line.3224"></a>
+<span class="sourceLineNo">3225</span>    region.put(put);<a name="line.3225"></a>
+<span class="sourceLineNo">3226</span>    region.flush(true);<a name="line.3226"></a>
+<span class="sourceLineNo">3227</span><a name="line.3227"></a>
+<span class="sourceLineNo">3228</span>    put = new Put(row1);<a name="line.3228"></a>
+<span class="sourceLineNo">3229</span>    put.add(kv21);<a name="line.3229"></a>
+<span class="sourceLineNo">3230</span>    put.add(kv11);<a name="line.3230"></a>
+<span class="sourceLineNo">3231</span>    region.put(put);<a name="line.3231"></a>
+<span class="sourceLineNo">3232</span><a name="line.3232"></a>
+<span class="sourceLineNo">3233</span>    // Expected<a name="line.3233"></a>
+<span class="sourceLineNo">3234</span>    List&lt;KeyValue&gt; expected = new ArrayList&lt;&gt;();<a name="line.3234"></a>
+<span class="sourceLineNo">3235</span>    expected.add(kv14);<a name="line.3235"></a>
+<span class="sourceLineNo">3236</span>    expected.add(kv13);<a name="line.3236"></a>
+<span class="sourceLineNo">3237</span>    expected.add(kv12);<a name="line.3237"></a>
+<span class="sourceLineNo">3238</span>    expected.add(kv24);<a name="line.3238"></a>
+<span class="sourceLineNo">3239</span>    expected.add(kv23);<a name="line.3239"></a>
+<span class="sourceLineNo">3240</span>    expected.add(kv22);<a name="line.3240"></a>
+<span class="sourceLineNo">3241</span><a name="line.3241"></a>
+<span class="sourceLineNo">3242</span>    Scan scan = new Scan(row1);<a name="line.3242"></a>
+<span class="sourceLineNo">3243</span>    int versions = 3;<a name="line.3243"></a>
+<span class="sourceLineNo">3244</span>    scan.setMaxVersions(versions);<a name="line.3244"></a>
+<span class="sourceLineNo">3245</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.3245"></a>
+<span class="sourceLineNo">3246</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.3246"></a>
+<span class="sourceLineNo">3247</span><a name="line.3247"></a>
+<span class="sourceLineNo">3248</span>    boolean hasNext = scanner.next(actual);<a name="line.3248"></a>
+<span class="sourceLineNo">3249</span>    assertEquals(false, hasNext);<a name="line.3249"></a>
+<span class="sourceLineNo">3250</span><a name="line.3250"></a>
+<span class="sourceLineNo">3251</span>    // Verify result<a name="line.3251"></a>
+<span class="sourceLineNo">3252</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.3252"></a>
+<span class="sourceLineNo">3253</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected.get(i), actual.get(i)));<a name="line.3253"></a>
+<span class="sourceLineNo">3254</span>    }<a name="line.3254"></a>
+<span class="sourceLineNo">3255</span>  }<a name="line.3255"></a>
+<span class="sourceLineNo">3256</span><a name="line.3256"></a>
+<span class="sourceLineNo">3257</span>  /**<a name="line.3257"></a>
+<span class="sourceLineNo">3258</span>   * Added for HBASE-5416<a name="line.3258"></a>
+<span class="sourceLineNo">3259</span>   *<a name="line.3259"></a>
+<span class="sourceLineNo">3260</span>   * Here we test scan optimization when only subset of CFs are used in filter<a name="line.3260"></a>
+<span class="sourceLineNo">3261</span>   * conditions.<a name="line.3261"></a>
+<span class="sourceLineNo">3262</span>   */<a name="line.3262"></a>
+<span class="sourceLineNo">3263</span>  @Test<a name="line.3263"></a>
+<span class="sourceLineNo">3264</span>  public void testScanner_JoinedScanners() throws IOException {<a name="line.3264"></a>
+<span class="sourceLineNo">3265</span>    byte[] cf_essential = Bytes.toBytes("essential");<a name="line.3265"></a>
+<span class="sourceLineNo">3266</span>    byte[] cf_joined = Bytes.toBytes("joined");<a name="line.3266"></a>
+<span class="sourceLineNo">3267</span>    byte[] cf_alpha = Bytes.toBytes("alpha");<a name="line.3267"></a>
+<span class="sourceLineNo">3268</span>    this.region = initHRegion(tableName, method, CONF, cf_essential, cf_joined, cf_alpha);<a name="line.3268"></a>
+<span class="sourceLineNo">3269</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.3269"></a>
+<span class="sourceLineNo">3270</span>    byte[] row2 = Bytes.toBytes("row2");<a name="line.3270"></a>
+<span class="sourceLineNo">3271</span>    byte[] row3 = Bytes.toBytes("row3");<a name="line.3271"></a>
 <span class="sourceLineNo">3272</span><a name="line.3272"></a>
-<span class="sourceLineNo">3273</span>    put = new Put(row2);<a name="line.3273"></a>
-<span class="sourceLineNo">3274</span>    put.addColumn(cf_essential, col_alpha, Bytes.toBytes(2));<a name="line.3274"></a>
-<span class="sourceLineNo">3275</span>    put.addColumn(cf_joined, col_normal, Bytes.toBytes(2));<a name="line.3275"></a>
-<span class="sourceLineNo">3276</span>    put.addColumn(cf_alpha, col_alpha, Bytes.toBytes(2));<a name="line.3276"></a>
-<span class="sourceLineNo">3277</span>    region.put(put);<a name="line.3277"></a>
-<span class="sourceLineNo">3278</span><a name="line.3278"></a>
-<span class="sourceLineNo">3279</span>    put = new Put(row3);<a name="line.3279"></a>
-<span class="sourceLineNo">3280</span>    put.addColumn(cf_essential, col_normal, filtered_val);<a name="line.3280"></a>
-<span class="sourceLineNo">3281</span>    put.addColumn(cf_joined, col_normal, filtered_val);<a name="line.3281"></a>
-<span class="sourceLineNo">3282</span>    region.put(put);<a name="line.3282"></a>
-<span class="sourceLineNo">3283</span><a name="line.3283"></a>
-<span class="sourceLineNo">3284</span>    // Check two things:<a name="line.3284"></a>
-<span class="sourceLineNo">3285</span>    // 1. result list contains expected values<a name="line.3285"></a>
-<span class="sourceLineNo">3286</span>    // 2. result list is sorted properly<a name="line.3286"></a>
-<span class="sourceLineNo">3287</span><a name="line.3287"></a>
-<span class="sourceLineNo">3288</span>    Scan scan = new Scan();<a name="line.3288"></a>
-<span class="sourceLineNo">3289</span>    Filter filter = new SingleColumnValueExcludeFilter(cf_essential, col_normal,<a name="line.3289"></a>
-<span class="sourceLineNo">3290</span>            CompareOperator.NOT_EQUAL, filtered_val);<a name="line.3290"></a>
-<span class="sourceLineNo">3291</span>    scan.setFilter(filter);<a name="line.3291"></a>
-<span class="sourceLineNo">3292</span>    scan.setLoadColumnFamiliesOnDemand(true);<a name="line.3292"></a>
-<span class="sourceLineNo">3293</span>    InternalScanner s = region.getScanner(scan);<a name="line.3293"></a>
-<span class="sourceLineNo">3294</span><a name="line.3294"></a>
-<span class="sourceLineNo">3295</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.3295"></a>
-<span class="sourceLineNo">3296</span>    assertTrue(s.next(results));<a name="line.3296"></a>
-<span class="sourceLineNo">3297</span>    assertEquals(1, results.size());<a name="line.3297"></a>
-<span class="sourceLineNo">3298</span>    results.clear();<a name="line.3298"></a>
-<span class="sourceLineNo">3299</span><a name="line.3299"></a>
-<span class="sourceLineNo">3300</span>    assertTrue(s.next(results));<a name="line.3300"></a>
-<span class="sourceLineNo">3301</span>    assertEquals(3, results.size());<a name="line.3301"></a>
-<span class="sourceLineNo">3302</span>    assertTrue("orderCheck", CellUtil.matchingFamily(results.get(0), cf_alpha));<a name="line.3302"></a>
-<span class="sourceLineNo">3303</span>    assertTrue("orderCheck", CellUtil.matchingFamily(results.get(1), cf_essential));<a name="line.3303"></a>
-<span class="sourceLineNo">3304</span>    assertTrue("orderCheck", CellUtil.matchingFamily(results.get(2), cf_joined));<a name="line.3304"></a>
-<span class="sourceLineNo">3305</span>    results.clear();<a name="line.3305"></a>
-<span class="sourceLineNo">3306</span><a name="line.3306"></a>
-<span class="sourceLineNo">3307</span>    assertFalse(s.next(results));<a name="line.3307"></a>
-<span class="sourceLineNo">3308</span>    assertEquals(0, results.size());<a name="line.3308"></a>
-<span class="sourceLineNo">3309</span>  }<a name="line.3309"></a>
-<span class="sourceLineNo">3310</span><a name="line.3310"></a>
-<span class="sourceLineNo">3311</span>  /**<a name="line.3311"></a>
-<span class="sourceLineNo">3312</span>   * HBASE-5416<a name="line.3312"></a>
-<span class="sourceLineNo">3313</span>   *<a name="line.3313"></a>
-<span class="sourceLineNo">3314</span>   * Test case when scan limits amount of KVs returned on each next() call.<a name="line.3314"></a>
-<span class="sourceLineNo">3315</span>   */<a name="line.3315"></a>
-<span class="sourceLineNo">3316</span>  @Test<a name="line.3316"></a>
-<span class="sourceLineNo">3317</span>  public void testScanner_JoinedScannersWithLimits() throws IOException {<a name="line.3317"></a>
-<span class="sourceLineNo">3318</span>    final byte[] cf_first = Bytes.toBytes("first");<a name="line.3318"></a>
-<span class="sourceLineNo">3319</span>    final byte[] cf_second = Bytes.toBytes("second");<a name="line.3319"></a>
+<span class="sourceLineNo">3273</span>    byte[] col_normal = Bytes.toBytes("d");<a name="line.3273"></a>
+<span class="sourceLineNo">3274</span>    byte[] col_alpha = Bytes.toBytes("a");<a name="line.3274"></a>
+<span class="sourceLineNo">3275</span><a name="line.3275"></a>
+<span class="sourceLineNo">3276</span>    byte[] filtered_val = Bytes.toBytes(3);<a name="line.3276"></a>
+<span class="sourceLineNo">3277</span><a name="line.3277"></a>
+<span class="sourceLineNo">3278</span>    Put put = new Put(row1);<a name="line.3278"></a>
+<span class="sourceLineNo">3279</span>    put.addColumn(cf_essential, col_normal, Bytes.toBytes(1));<a name="line.3279"></a>
+<span class="sourceLineNo">3280</span>    put.addColumn(cf_joined, col_alpha, Bytes.toBytes(1));<a name="line.3280"></a>
+<span class="sourceLineNo">3281</span>    region.put(put);<a name="line.3281"></a>
+<span class="sourceLineNo">3282</span><a name="line.3282"></a>
+<span class="sourceLineNo">3283</span>    put = new Put(row2);<a name="line.3283"></a>
+<span class="sourceLineNo">3284</span>    put.addColumn(cf_essential, col_alpha, Bytes.toBytes(2));<a name="line.3284"></a>
+<span class="sourceLineNo">3285</span>    put.addColumn(cf_joined, col_normal, Bytes.toBytes(2));<a name="line.3285"></a>
+<span class="sourceLineNo">3286</span>    put.addColumn(cf_alpha, col_alpha, Bytes.toBytes(2));<a name="line.3286"></a>
+<span class="sourceLineNo">3287</span>    region.put(put);<a name="line.3287"></a>
+<span class="sourceLineNo">3288</span><a name="line.3288"></a>
+<span class="sourceLineNo">3289</span>    put = new Put(row3);<a name="line.3289"></a>
+<span class="sourceLineNo">3290</span>    put.addColumn(cf_essential, col_normal, filtered_val);<a name="line.3290"></a>
+<span class="sourceLineNo">3291</span>    put.addColumn(cf_joined, col_normal, filtered_val);<a name="line.3291"></a>
+<span class="sourceLineNo">3292</span>    region.put(put);<a name="line.3292"></a>
+<span class="sourceLineNo">3293</span><a name="line.3293"></a>
+<span class="sourceLineNo">3294</span>    // Check two things:<a name="line.3294"></a>
+<span class="sourceLineNo">3295</span>    // 1. result list contains expected values<a name="line.3295"></a>
+<span class="sourceLineNo">3296</span>    // 2. result list is sorted properly<a name="line.3296"></a>
+<span class="sourceLineNo">3297</span><a name="line.3297"></a>
+<span class="sourceLineNo">3298</span>    Scan scan = new Scan();<a name="line.3298"></a>
+<span class="sourceLineNo">3299</span>    Filter filter = new SingleColumnValueExcludeFilter(cf_essential, col_normal,<a name="line.3299"></a>
+<span class="sourceLineNo">3300</span>            CompareOperator.NOT_EQUAL, filtered_val);<a name="line.3300"></a>
+<span class="sourceLineNo">3301</span>    scan.setFilter(filter);<a name="line.3301"></a>
+<span class="sourceLineNo">3302</span>    scan.setLoadColumnFamiliesOnDemand(true);<a name="line.3302"></a>
+<span class="sourceLineNo">3303</span>    InternalScanner s = region.getScanner(scan);<a name="line.3303"></a>
+<span class="sourceLineNo">3304</span><a name="line.3304"></a>
+<span class="sourceLineNo">3305</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.3305"></a>
+<span class="sourceLineNo">3306</span>    assertTrue(s.next(results));<a name="line.3306"></a>
+<span class="sourceLineNo">3307</span>    assertEquals(1, results.size());<a name="line.3307"></a>
+<span class="sourceLineNo">3308</span>    results.clear();<a name="line.3308"></a>
+<span class="sourceLineNo">3309</span><a name="line.3309"></a>
+<span class="sourceLineNo">3310</span>    assertTrue(s.next(results));<a name="line.3310"></a>
+<span class="sourceLineNo">3311</span>    assertEquals(3, results.size());<a name="line.3311"></a>
+<span class="sourceLineNo">3312</span>    assertTrue("orderCheck", CellUtil.matchingFamily(results.get(0), cf_alpha));<a name="line.3312"></a>
+<span class="sourceLineNo">3313</span>    assertTrue("orderCheck", CellUtil.matchingFamily(results.get(1), cf_essential));<a name="line.3313"></a>
+<span class="sourceLineNo">3314</span>    assertTrue("orderCheck", CellUtil.matchingFamily(results.get(2), cf_joined));<a name="line.3314"></a>
+<span class="sourceLineNo">3315</span>    results.clear();<a name="line.3315"></a>
+<span class="sourceLineNo">3316</span><a name="line.3316"></a>
+<span class="sourceLineNo">3317</span>    assertFalse(s.next(results));<a name="line.3317"></a>
+<span class="sourceLineNo">3318</span>    assertEquals(0, results.size());<a name="line.3318"></a>
+<span class="sourceLineNo">3319</span>  }<a name="line.3319"></a>
 <span class="sourceLineNo">3320</span><a name="line.3320"></a>
-<span class="sourceLineNo">3321</span>    this.region = initHRegion(tableName, method, CONF, cf_first, cf_second);<a name="line.3321"></a>
-<span class="sourceLineNo">3322</span>    final byte[] col_a = Bytes.toBytes("a");<a name="line.3322"></a>
-<span class="sourceLineNo">3323</span>    final byte[] col_b = Bytes.toBytes("b");<a name="line.3323"></a>
-<span class="sourceLineNo">3324</span><a name="line.3324"></a>
-<span class="sourceLineNo">3325</span>    Put put;<a name="line.3325"></a>
-<span class="sourceLineNo">3326</span><a name="line.3326"></a>
-<span class="sourceLineNo">3327</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.3327"></a>
-<span class="sourceLineNo">3328</span>      put = new Put(Bytes.toBytes("r" + Integer.toString(i)));<a name="line.3328"></a>
-<span class="sourceLineNo">3329</span>      put.addColumn(cf_first, col_a, Bytes.toBytes(i));<a name="line.3329"></a>
-<span class="sourceLineNo">3330</span>      if (i &lt; 5) {<a name="line.3330"></a>
-<span class="sourceLineNo">3331</span>        put.addColumn(cf_first, col_b, Bytes.toBytes(i));<a name="line.3331"></a>
-<span class="sourceLineNo">3332</span>        put.addColumn(cf_second, col_a, Bytes.toBytes(i));<a name="line.3332"></a>
-<span class="sourceLineNo">3333</span>        put.addColumn(cf_second, col_b, Bytes.toBytes(i));<a name="line.3333"></a>
-<span class="sourceLineNo">3334</span>      }<a name="line.3334"></a>
-<span class="sourceLineNo">3335</span>      region.put(put);<a name="line.3335"></a>
-<span class="sourceLineNo">3336</span>    }<a name="line.3336"></a>
-<span class="sourceLineNo">3337</span><a name="line.3337"></a>
-<span class="sourceLineNo">3338</span>    Scan scan = new Scan();<a name="line.3338"></a>
-<span class="sourceLineNo">3339</span>    scan.setLoadColumnFamiliesOnDemand(true);<a name="line.3339"></a>
-<span class="sourceLineNo">3340</span>    Filter bogusFilter = new FilterBase() {<a name="line.3340"></a>
-<span class="sourceLineNo">3341</span>      @Override<a name="line.3341"></a>
-<span class="sourceLineNo">3342</span>      public ReturnCode filterCell(final Cell ignored) throws IOException {<a name="line.3342"></a>
-<span class="sourceLineNo">3343</span>        return ReturnCode.INCLUDE;<a name="line.3343"></a>
+<span class="sourceLineNo">3321</span>  /**<a name="line.3321"></a>
+<span class="sourceLineNo">3322</span>   * HBASE-5416<a name="line.3322"></a>
+<span class="sourceLineNo">3323</span>   *<a name="line.3323"></a>
+<span class="sourceLineNo">3324</span>   * Test case when scan limits amount of KVs returned on each next() call.<a name="line.3324"></a>
+<span class="sourceLineNo">3325</span>   */<a name="line.3325"></a>
+<span class="sourceLineNo">3326</span>  @Test<a name="line.3326"></a>
+<span class="sourceLineNo">3327</span>  public void testScanner_JoinedScannersWithLimits() throws IOException {<a name="line.3327"></a>
+<span class="sourceLineNo">3328</span>    final byte[] cf_first = Bytes.toBytes("first");<a name="line.3328"></a>
+<span class="sourceLineNo">3329</span>    final byte[] cf_second = Bytes.toBytes("second");<a name="line.3329"></a>
+<span class="sourceLineNo">3330</span><a name="line.3330"></a>
+<span class="sourceLineNo">3331</span>    this.region = initHRegion(tableName, method, CONF, cf_first, cf_second);<a name="line.3331"></a>
+<span class="sourceLineNo">3332</span>    final byte[] col_a = Bytes.toBytes("a");<a name="line.3332"></a>
+<span class="sourceLineNo">3333</span>    final byte[] col_b = Bytes.toBytes("b");<a name="line.3333"></a>
+<span class="sourceLineNo">3334</span><a name="line.3334"></a>
+<span class="sourceLineNo">3335</span>    Put put;<a name="line.3335"></a>
+<span class="sourceLineNo">3336</span><a name="line.3336"></a>
+<span class="sourceLineNo">3337</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.3337"></a>
+<span class="sourceLineNo">3338</span>      put = new Put(Bytes.toBytes("r" + Integer.toString(i)));<a name="line.3338"></a>
+<span class="sourceLineNo">3339</span>      put.addColumn(cf_first, col_a, Bytes.toBytes(i));<a name="line.3339"></a>
+<span class="sourceLineNo">3340</span>      if (i &lt; 5) {<a name="line.3340"></a>
+<span class="sourceLineNo">3341</span>        put.addColumn(cf_first, col_b, Bytes.toBytes(i));<a name="line.3341"></a>
+<span class="sourceLineNo">3342</span>        put.addColumn(cf_second, col_a, Bytes.toBytes(i));<a name="line.3342"></a>
+<span class="sourceLineNo">3343</span>        put.addColumn(cf_second, col_b, Bytes.toBytes(i));<a name="line.3343"></a>
 <span class="sourceLineNo">3344</span>      }<a name="line.3344"></a>
-<span class="sourceLineNo">3345</span>      @Override<a name="line.3345"></a>
-<span class="sourceLineNo">3346</span>      public boolean isFamilyEssential(byte[] name) {<a name="line.3346"></a>
-<span class="sourceLineNo">3347</span>        return Bytes.equals(name, cf_first);<a name="line.3347"></a>
-<span class="sourceLineNo">3348</span>      }<a name="line.3348"></a>
-<span class="sourceLineNo">3349</span>    };<a name="line.3349"></a>
-<span class="sourceLineNo">3350</span><a name="line.3350"></a>
-<span class="sourceLineNo">3351</span>    scan.setFilter(bogusFilter);<a name="line.3351"></a>
-<span class="sourceLineNo">3352</span>    InternalScanner s = region.getScanner(scan);<a name="line.3352"></a>
-<span class="sourceLineNo">3353</span><a name="line.3353"></a>
-<span class="sourceLineNo">3354</span>    // Our data looks like this:<a name="line.3354"></a>
-<span class="sourceLineNo">3355</span>    // r0: first:a, first:b, second:a, second:b<a name="line.3355"></a>
-<span class="sourceLineNo">3356</span>    // r1: first:a, first:b, second:a, second:b<a name="line.3356"></a>
-<span class="sourceLineNo">3357</span>    // r2: first:a, first:b, second:a, second:b<a name="line.3357"></a>
-<span class="sourceLineNo">3358</span>    // r3: first:a, first:b, second:a, second:b<a name="line.3358"></a>
-<span class="sourceLineNo">3359</span>    // r4: first:a, first:b, second:a, second:b<a name="line.3359"></a>
-<span class="sourceLineNo">3360</span>    // r5: first:a<a name="line.3360"></a>
-<span class="sourceLineNo">3361</span>    // r6: first:a<a name="line.3361"></a>
-<span class="sourceLineNo">3362</span>    // r7: first:a<a name="line.3362"></a>
-<span class="sourceLineNo">3363</span>    // r8: first:a<a name="line.3363"></a>
-<span class="sourceLineNo">3364</span>    // r9: first:a<a name="line.3364"></a>
-<span class="sourceLineNo">3365</span><a name="line.3365"></a>
-<span class="sourceLineNo">3366</span>    // But due to next's limit set to 3, we should get this:<a name="line.3366"></a>
-<span class="sourceLineNo">3367</span>    // r0: first:a, first:b, second:a<a name="line.3367"></a>
-<span class="sourceLineNo">3368</span>    // r0: second:b<a name="line.3368"></a>
-<span class="sourceLineNo">3369</span>    // r1: first:a, first:b, second:a<a name="line.3369"></a>
-<span class="sourceLineNo">3370</span>    // r1: second:b<a name="line.3370"></a>
-<span class="sourceLineNo">3371</span>    // r2: first:a, first:b, second:a<a name="line.3371"></a>
-<span class="sourceLineNo">3372</span>    // r2: second:b<a name="line.3372"></a>
-<span class="sourceLineNo">3373</span>    // r3: first:a, first:b, second:a<a name="line.3373"></a>
-<span class="sourceLineNo">3374</span>    // r3: second:b<a name="line.3374"></a>
-<span class="sourceLineNo">3375</span>    // r4: first:a, first:b, second:a<a name="line.3375"></a>
-<span class="sourceLineNo">3376</span>    // r4: second:b<a name="line.3376"></a>
-<span class="sourceLineNo">3377</span>    // r5: first:a<a name="line.3377"></a>
-<span class="sourceLineNo">3378</span>    // r6: first:a<a name="line.3378"></a>
-<span class="sourceLineNo">3379</span>    // r7: first:a<a name="line.3379"></a>
-<span class="sourceLineNo">3380</span>    // r8: first:a<a name="line.3380"></a>
-<span class="sourceLineNo">3381</span>    // r9: first:a<a name="line.3381"></a>
-<span class="sourceLineNo">3382</span><a name="line.3382"></a>
-<span class="sourceLineNo">3383</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.3383"></a>
-<span class="sourceLineNo">3384</span>    int index = 0;<a name="line.3384"></a>
-<span class="sourceLineNo">3385</span>    ScannerContext scannerContext = ScannerContext.newBuilder().setBatchLimit(3).build();<a name="line.3385"></a>
-<span class="sourceLineNo">3386</span>    while (true) {<a name="line.3386"></a>
-<span class="sourceLineNo">3387</span>      boolean more = s.next(results, scannerContext);<a name="line.3387"></a>
-<span class="sourceLineNo">3388</span>      if ((index &gt;&gt; 1) &lt; 5) {<a name="line.3388"></a>
-<span class="sourceLineNo">3389</span>        if (index % 2 == 0) {<a name="line.3389"></a>
-<span class="sourceLineNo">3390</span>          assertEquals(3, results.size());<a name="line.3390"></a>
-<span class="sourceLineNo">3391</span>        } else {<a name="line.3391"></a>
-<span class="sourceLineNo">3392</span>          assertEquals(1, results.size());<a name="line.3392"></a>
-<span class="sourceLineNo">3393</span>        }<a name="line.3393"></a>
-<span class="sourceLineNo">3394</span>      } else {<a name="line.3394"></a>
-<span class="sourceLineNo">3395</span>        assertEquals(1, results.size());<a name="line.3395"></a>
-<span class="sourceLineNo">3396</span>      }<a name="line.3396"></a>
-<span class="sourceLineNo">3397</span>      results.clear();<a name="line.3397"></a>
-<span class="sourceLineNo">3398</span>      index++;<a name="line.3398"></a>
-<span class="sourceLineNo">3399</span>      if (!more) {<a name="line.3399"></a>
-<span class="sourceLineNo">3400</span>        break;<a name="line.3400"></a>
-<span class="sourceLineNo">3401</span>      }<a name="line.3401"></a>
-<span class="sourceLineNo">3402</span>    }<a name="line.3402"></a>
-<span class="sourceLineNo">3403</span>  }<a name="line.3403"></a>
-<span class="sourceLineNo">3404</span><a name="line.3404"></a>
-<span class="sourceLineNo">3405</span>  /**<a name="line.3405"></a>
-<span class="sourceLineNo">3406</span>   * Write an HFile block full with Cells whose qualifier that are identical between<a name="line.3406"></a>
-<span class="sourceLineNo">3407</span>   * 0 and Short.MAX_VALUE. See HBASE-13329.<a name="line.3407"></a>
-<span class="sourceLineNo">3408</span>   * @throws Exception<a name="line.3408"></a>
-<span class="sourceLineNo">3409</span>   */<a name="line.3409"></a>
-<span class="sourceLineNo">3410</span>  @Test<a name="line.3410"></a>
-<span class="sourceLineNo">3411</span>  public void testLongQualifier() throws Exception {<a name="line.3411"></a>
-<span class="sourceLineNo">3412</span>    byte[] family = Bytes.toBytes("family");<a name="line.3412"></a>
-<span class="sourceLineNo">3413</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.3413"></a>
-<span class="sourceLineNo">3414</span>    byte[] q = new byte[Short.MAX_VALUE+2];<a name="line.3414"></a>
-<span class="sourceLineNo">3415</span>    Arrays.fill(q, 0, q.length-1, (byte)42);<a name="line.3415"></a>
-<span class="sourceLineNo">3416</span>    for (byte i=0; i&lt;10; i++) {<a name="line.3416"></a>
-<span class="sourceLineNo">3417</span>      Put p = new Put(Bytes.toBytes("row"));<a name="line.3417"></a>
-<span class="sourceLineNo">3418</span>      // qualifiers that differ past Short.MAX_VALUE<a name="line.3418"></a>
-<span class="sourceLineNo">3419</span>      q[q.length-1]=i;<a name="line.3419"></a>
-<span class="sourceLineNo">3420</span>      p.addColumn(family, q, q);<a name="line.3420"></a>
-<span class="sourceLineNo">3421</span>      region.put(p);<a name="line.3421"></a>
-<span class="sourceLineNo">3422</span>    }<a name="line.3422"></a>
-<span class="sourceLineNo">3423</span>    region.flush(false);<a name="line.3423"></a>
-<span class="sourceLineNo">3424</span>  }<a name="line.3424"></a>
-<span class="sourceLineNo">3425</span><a name="line.3425"></a>
-<span class="sourceLineNo">3426</span>  /**<a name="line.3426"></a>
-<span class="sourceLineNo">3427</span>   * Flushes the cache in a thread while scanning. The tests verify that the<a name="line.3427"></a>
-<span class="sourceLineNo">3428</span>   * scan is coherent - e.g. the returned results are always of the same or<a name="line.3428"></a>
-<span class="sourceLineNo">3429</span>   * later update as the previous results.<a name="line.3429"></a>
-<span class="sourceLineNo">3430</span>   *<a name="line.3430"></a>
-<span class="sourceLineNo">3431</span>   * @throws IOException<a name="line.3431"></a>
-<span class="sourceLineNo">3432</span>   *           scan / compact<a name="line.3432"></a>
-<span class="sourceLineNo">3433</span>   * @throws InterruptedException<a name="line.3433"></a>
-<span class="sourceLineNo">3434</span>   *           thread join<a name="line.3434"></a>
-<span class="sourceLineNo">3435</span>   */<a name="line.3435"></a>
-<span class="sourceLineNo">3436</span>  @Test<a name="line.3436"></a>
-<span class="sourceLineNo">3437</span>  public void testFlushCacheWhileScanning() throws IOException, InterruptedException {<a name="line.3437"></a>
-<span class="sourceLineNo">3438</span>    byte[] family = Bytes.toBytes("family");<a name="line.3438"></a>
-<span class="sourceLineNo">3439</span>    int numRows = 1000;<a name="line.3439"></a>
-<span class="sourceLineNo">3440</span>    int flushAndScanInterval = 10;<a name="line.3440"></a>
-<span class="sourceLineNo">3441</span>    int compactInterval = 10 * flushAndScanInterval;<a name="line.3441"></a>
-<span class="sourceLineNo">3442</span><a name="line.3442"></a>
-<span class="sourceLineNo">3443</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.3443"></a>
-<span class="sourceLineNo">3444</span>    FlushThread flushThread = new FlushThread();<a name="line.3444"></a>
-<span class="sourceLineNo">3445</span>    try {<a name="line.3445"></a>
-<span class="sourceLineNo">3446</span>      flushThread.start();<a name="line.3446"></a>
-<span class="sourceLineNo">3447</span><a name="line.3447"></a>
-<span class="sourceLineNo">3448</span>      Scan scan = new Scan();<a name="line.3448"></a>
-<span class="sourceLineNo">3449</span>      scan.addFamily(family);<a name="line.3449"></a>
-<span class="sourceLineNo">3450</span>      scan.setFilter(new SingleColumnValueFilter(family, qual1, CompareOperator.EQUAL,<a name="line.3450"></a>
-<span class="sourceLineNo">3451</span>          new BinaryComparator(Bytes.toBytes(5L))));<a name="line.3451"></a>
+<span class="sourceLineNo">3345</span>      region.put(put);<a name="line.3345"></a>
+<span class="sourceLineNo">3346</span>    }<a name="line.3346"></a>
+<span class="sourceLineNo">3347</span><a name="line.3347"></a>
+<span class="sourceLineNo">3348</span>    Scan scan = new Scan();<a name="line.3348"></a>
+<span class="sourceLineNo">3349</span>    scan.setLoadColumnFamiliesOnDemand(true);<a name="line.3349"></a>
+<span class="sourceLineNo">3350</span>    Filter bogusFilter = new FilterBase() {<a name="line.3350"></a>
+<span class="sourceLineNo">3351</span>      @Override<a name="line.3351"></a>
+<span class="sourceLineNo">3352</span>      public ReturnCode filterCell(final Cell ignored) throws IOException {<a name="line.3352"></a>
+<span class="sourceLineNo">3353</span>        return ReturnCode.INCLUDE;<a name="line.3353"></a>
+<span class="sourceLineNo">3354</span>      }<a name="line.3354"></a>
+<span class="sourceLineNo">3355</span>      @Override<a name="line.3355"></a>
+<span class="sourceLineNo">3356</span>      public boolean isFamilyEssential(byte[] name) {<a name="line.3356"></a>
+<span class="sourceLineNo">3357</span>        return Bytes.equals(name, cf_first);<a name="line.3357"></a>
+<span class="sourceLineNo">3358</span>      }<a name="line.3358"></a>
+<span class="sourceLineNo">3359</span>    };<a name="line.3359"></a>
+<span class="sourceLineNo">3360</span><a name="line.3360"></a>
+<span class="sourceLineNo">3361</span>    scan.setFilter(bogusFilter);<a name="line.3361"></a>
+<span class="sourceLineNo">3362</span>    InternalScanner s = region.getScanner(scan);<a name="line.3362"></a>
+<span class="sourceLineNo">3363</span><a name="line.3363"></a>
+<span class="sourceLineNo">3364</span>    // Our data looks like this:<a name="line.3364"></a>
+<span class="sourceLineNo">3365</span>    // r0: first:a, first:b, second:a, second:b<a name="line.3365"></a>
+<span class="sourceLineNo">3366</span>    // r1: first:a, first:b, second:a, second:b<a name="line.3366"></a>
+<span class="sourceLineNo">3367</span>    // r2: first:a, first:b, second:a, second:b<a name="line.3367"></a>
+<span class="sourceLineNo">3368</span>    // r3: first:a, first:b, second:a, second:b<a name="line.3368"></a>
+<span class="sourceLineNo">3369</span>    // r4: first:a, first:b, second:a, second:b<a name="line.3369"></a>
+<span class="sourceLineNo">3370</span>    // r5: first:a<a name="line.3370"></a>
+<span class="sourceLineNo">3371</span>    // r6: first:a<a name="line.3371"></a>
+<span class="sourceLineNo">3372</span>    // r7: first:a<a name="line.3372"></a>
+<span class="sourceLineNo">3373</span>    // r8: first:a<a name="line.3373"></a>
+<span class="sourceLineNo">3374</span>    // r9: first:a<a name="line.3374"></a>
+<span class="sourceLineNo">3375</span><a name="line.3375"></a>
+<span class="sourceLineNo">3376</span>    // But due to next's limit set to 3, we should get this:<a name="line.3376"></a>
+<span class="sourceLineNo">3377</span>    // r0: first:a, first:b, second:a<a name="line.3377"></a>
+<span class="sourceLineNo">3378</span>    // r0: second:b<a name="line.3378"></a>
+<span class="sourceLineNo">3379</span>    // r1: first:a, first:b, second:a<a name="line.3379"></a>
+<span class="sourceLineNo">3380</span>    // r1: second:b<a name="line.3380"></a>
+<span class="sourceLineNo">3381</span>    // r2: first:a, first:b, second:a<a name="line.3381"></a>
+<span class="sourceLineNo">3382</span>    // r2: second:b<a name="line.3382"></a>
+<span class="sourceLineNo">3383</span>    // r3: first:a, first:b, second:a<a name="line.3383"></a>
+<span class="sourceLineNo">3384</span>    // r3: second:b<a name="line.3384"></a>
+<span class="sourceLineNo">3385</span>    // r4: first:a, first:b, second:a<a name="line.3385"></a>
+<span class="sourceLineNo">3386</span>    // r4: second:b<a name="line.3386"></a>
+<span class="sourceLineNo">3387</span>    // r5: first:a<a name="line.3387"></a>
+<span class="sourceLineNo">3388</span>    // r6: first:a<a name="line.3388"></a>
+<span class="sourceLineNo">3389</span>    // r7: first:a<a name="line.3389"></a>
+<span class="sourceLineNo">3390</span>    // r8: first:a<a name="line.3390"></a>
+<span class="sourceLineNo">3391</span>    // r9: first:a<a name="line.3391"></a>
+<span class="sourceLineNo">3392</span><a name="line.3392"></a>
+<span class="sourceLineNo">3393</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.3393"></a>
+<span class="sourceLineNo">3394</span>    int index = 0;<a name="line.3394"></a>
+<span class="sourceLineNo">3395</span>    ScannerContext scannerContext = ScannerContext.newBuilder().setBatchLimit(3).build();<a name="line.3395"></a>
+<span class="sourceLineNo">3396</span>    while (true) {<a name="line.3396"></a>
+<span class="sourceLineNo">3397</span>      boolean more = s.next(results, scannerContext);<a name="line.3397"></a>
+<span class="sourceLineNo">3398</span>      if ((index &gt;&gt; 1) &lt; 5) {<a name="line.3398"></a>
+<span class="sourceLineNo">3399</span>        if (index % 2 == 0) {<a name="line.3399"></a>
+<span class="sourceLineNo">3400</span>          assertEquals(3, results.size());<a name="line.3400"></a>
+<span class="sourceLineNo">3401</span>        } else {<a name="line.3401"></a>
+<span class="sourceLineNo">3402</span>          assertEquals(1, results.size());<a name="line.3402"></a>
+<span class="sourceLineNo">3403</span>        }<a name="line.3403"></a>
+<span class="sourceLineNo">3404</span>      } else {<a name="line.3404"></a>
+<span class="sourceLineNo">3405</span>        assertEquals(1, results.size());<a name="line.3405"></a>
+<span class="sourceLineNo">3406</span>      }<a name="line.3406"></a>
+<span class="sourceLineNo">3407</span>      results.clear();<a name="line.3407"></a>
+<span class="sourceLineNo">3408</span>      index++;<a name="line.3408"></a>
+<span class="sourceLineNo">3409</span>      if (!more) {<a name="line.3409"></a>
+<span class="sourceLineNo">3410</span>        break;<a name="line.3410"></a>
+<span class="sourceLineNo">3411</span>      }<a name="line.3411"></a>
+<span class="sourceLineNo">3412</span>    }<a name="line.3412"></a>
+<span class="sourceLineNo">3413</span>  }<a name="line.3413"></a>
+<span class="sourceLineNo">3414</span><a name="line.3414"></a>
+<span class="sourceLineNo">3415</span>  /**<a name="line.3415"></a>
+<span class="sourceLineNo">3416</span>   * Write an HFile block full with Cells whose qualifier that are identical between<a name="line.3416"></a>
+<span class="sourceLineNo">3417</span>   * 0 and Short.MAX_VALUE. See HBASE-13329.<a name="line.3417"></a>
+<span class="sourceLineNo">3418</span>   * @throws Exception<a name="line.3418"></a>
+<span class="sourceLineNo">3419</span>   */<a name="line.3419"></a>
+<span class="sourceLineNo">3420</span>  @Test<a name="line.3420"></a>
+<span class="sourceLineNo">3421</span>  public void testLongQualifier() throws Exception {<a name="line.3421"></a>
+<span class="sourceLineNo">3422</span>    byte[] family = Bytes.toBytes("family");<a name="line.3422"></a>
+<span class="sourceLineNo">3423</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.3423"></a>
+<span class="sourceLineNo">3424</span>    byte[] q = new byte[Short.MAX_VALUE+2];<a name="line.3424"></a>
+<span class="sourceLineNo">3425</span>    Arrays.fill(q, 0, q.length-1, (byte)42);<a name="line.3425"></a>
+<span class="sourceLineNo">3426</span>    for (byte i=0; i&lt;10; i++) {<a name="line.3426"></a>
+<span class="sourceLineNo">3427</span>      Put p = new Put(Bytes.toBytes("row"));<a name="line.3427"></a>
+<span class="sourceLineNo">3428</span>      // qualifiers that differ past Short.MAX_VALUE<a name="line.3428"></a>
+<span class="sourceLineNo">3429</span>      q[q.length-1]=i;<a name="line.3429"></a>
+<span class="sourceLineNo">3430</span>      p.addColumn(family, q, q);<a name="line.3430"></a>
+<span class="sourceLineNo">3431</span>      region.put(p);<a name="line.3431"></a>
+<span class="sourceLineNo">3432</span>    }<a name="line.3432"></a>
+<span class="sourceLineNo">3433</span>    region.flush(false);<a name="line.3433"></a>
+<span class="sourceLineNo">3434</span>  }<a name="line.3434"></a>
+<span class="sourceLineNo">3435</span><a name="line.3435"></a>
+<span class="sourceLineNo">3436</span>  /**<a name="line.3436"></a>
+<span class="sourceLineNo">3437</span>   * Flushes the cache in a thread while scanning. The tests verify that the<a name="line.3437"></a>
+<span class="sourceLineNo">3438</span>   * scan is coherent - e.g. the returned results are always of the same or<a name="line.3438"></a>
+<span class="sourceLineNo">3439</span>   * later update as the previous results.<a name="line.3439"></a>
+<span class="sourceLineNo">3440</span>   *<a name="line.3440"></a>
+<span class="sourceLineNo">3441</span>   * @throws IOException<a name="line.3441"></a>
+<span class="sourceLineNo">3442</span>   *           scan / compact<a name="line.3442"></a>
+<span class="sourceLineNo">3443</span>   * @throws InterruptedException<a name="line.3443"></a>
+<span class="sourceLineNo">3444</span>   *           thread join<a name="line.3444"></a>
+<span class="sourceLineNo">3445</span>   */<a name="line.3445"></a>
+<span class="sourceLineNo">3446</span>  @Test<a name="line.3446"></a>
+<span class="sourceLineNo">3447</span>  public void testFlushCacheWhileScanning() throws IOException, InterruptedException {<a name="line.3447"></a>
+<span class="sourceLineNo">3448</span>    byte[] family = Bytes.toBytes("family");<a name="line.3448"></a>
+<span class="sourceLineNo">3449</span>    int numRows = 1000;<a name="line.3449"></a>
+<span class="sourceLineNo">3450</span>    int flushAndScanInterval = 10;<a name="line.3450"></a>
+<span class="sourceLineNo">3451</span>    int compactInterval = 10 * flushAndScanInterval;<a name="line.3451"></a>
 <span class="sourceLineNo">3452</span><a name="line.3452"></a>
-<span class="sourceLineNo">3453</span>      int expectedCount = 0;<a name="line.3453"></a>
-<span class="sourceLineNo">3454</span>      List&lt;Cell&gt; res = new ArrayList&lt;&gt;();<a name="line.3454"></a>
-<span class="sourceLineNo">3455</span><a name="line.3455"></a>
-<span class="sourceLineNo">3456</span>      boolean toggle = true;<a name="line.3456"></a>
-<span class="sourceLineNo">3457</span>      for (long i = 0; i &lt; numRows; i++) {<a name="line.3457"></a>
-<span class="sourceLineNo">3458</span>        Put put = new Put(Bytes.toBytes(i));<a name="line.3458"></a>
-<span class="sourceLineNo">3459</span>        put.setDurability(Durability.SKIP_WAL);<a name="line.3459"></a>
-<span class="sourceLineNo">3460</span>        put.addColumn(family, qual1, Bytes.toBytes(i % 10));<a name="line.3460"></a>
-<span class="sourceLineNo">3461</span>        region.put(put);<a name="line.3461"></a>
+<span class="sourceLineNo">3453</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.3453"></a>
+<span class="sourceLineNo">3454</span>    FlushThread flushThread = new FlushThread();<a name="line.3454"></a>
+<span class="sourceLineNo">3455</span>    try {<a name="line.3455"></a>
+<span class="sourceLineNo">3456</span>      flushThread.start();<a name="line.3456"></a>
+<span class="sourceLineNo">3457</span><a name="line.3457"></a>
+<span class="sourceLineNo">3458</span>      Scan scan = new Scan();<a name="line.3458"></a>
+<span class="sourceLineNo">3459</span>      scan.addFamily(family);<a name="line.3459"></a>
+<span class="sourceLineNo">3460</span>      scan.setFilter(new SingleColumnValueFilter(family, qual1, CompareOperator.EQUAL,<a name="line.3460"></a>
+<span class="sourceLineNo">3461</span>          new BinaryComparator(Bytes.toBytes(5L))));<a name="line.3461"></a>
 <span class="sourceLineNo">3462</span><a name="line.3462"></a>
-<span class="sourceLineNo">3463</span>        if (i != 0 &amp;&amp; i % compactInterval == 0) {<a name="line.3463"></a>
-<span class="sourceLineNo">3464</span>          LOG.debug("iteration = " + i+ " ts="+System.currentTimeMillis());<a name="line.3464"></a>
-<span class="sourceLineNo">3465</span>          region.compact(true);<a name="line.3465"></a>
-<span class="sourceLineNo">3466</span>        }<a name="line.3466"></a>
-<span class="sourceLineNo">3467</span><a name="line.3467"></a>
-<span class="sourceLineNo">3468</span>        if (i % 10 == 5L) {<a name="line.3468"></a>
-<span class="sourceLineNo">3469</span>          expectedCount++;<a name="line.3469"></a>
-<span class="sourceLineNo">3470</span>        }<a name="line.3470"></a>
-<span class="sourceLineNo">3471</span><a name="line.3471"></a>
-<span class="sourceLineNo">3472</span>        if (i != 0 &amp;&amp; i % flushAndScanInterval == 0) {<a name="line.3472"></a>
-<span class="sourceLineNo">3473</span>          res.clear();<a name="line.3473"></a>
-<span class="sourceLineNo">3474</span>          InternalScanner scanner = region.getScanner(scan);<a name="line.3474"></a>
-<span class="sourceLineNo">3475</span>          if (toggle) {<a name="line.3475"></a>
-<span class="sourceLineNo">3476</span>            flushThread.flush();<a name="line.3476"></a>
-<span class="sourceLineNo">3477</span>          }<a name="line.3477"></a>
-<span class="sourceLineNo">3478</span>          while (scanner.next(res))<a name="line.3478"></a>
-<span class="sourceLineNo">3479</span>            ;<a name="line.3479"></a>
-<span class="sourceLineNo">3480</span>          if (!toggle) {<a name="line.3480"></a>
-<span class="sourceLineNo">3481</span>            flushThread.flush();<a name="line.3481"></a>
-<span class="sourceLineNo">3482</span>          }<a name="line.3482"></a>
-<span class="sourceLineNo">3483</span>          assertEquals("toggle="+toggle+"i=" + i + " ts="+System.currentTimeMillis(),<a name="line.3483"></a>
-<span class="sourceLineNo">3484</span>              expectedCount, res.size());<a name="line.3484"></a>
-<span class="sourceLineNo">3485</span>          toggle = !toggle;<a name="line.3485"></a>
-<span class="sourceLineNo">3486</span>        }<a name="line.3486"></a>
-<span class="sourceLineNo">3487</span>      }<a name="line.3487"></a>
-<span class="sourceLineNo">3488</span><a name="line.3488"></a>
-<span class="sourceLineNo">3489</span>    } finally {<a name="line.3489"></a>
-<span class="sourceLineNo">3490</span>      try {<a name="line.3490"></a>
-<span class="sourceLineNo">3491</span>        flushThread.done();<a name="line.3491"></a>
-<span class="sourceLineNo">3492</span>        flushThread.join();<a name="line.3492"></a>
-<span class="sourceLineNo">3493</span>        flushThread.checkNoError();<a name="line.3493"></a>
-<span class="sourceLineNo">3494</span>      } catch (InterruptedException ie) {<a name="line.3494"></a>
-<span class="sourceLineNo">3495</span>        LOG.warn("Caught exception when joining with flushThread", ie);<a name="line.3495"></a>
-<span class="sourceLineNo">3496</span>      }<a name="line.3496"></a>
-<span class="sourceLineNo">3497</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.3497"></a>
-<span class="sourceLineNo">3498</span>      this.region = null;<a name="line.3498"></a>
-<span class="sourceLineNo">3499</span>    }<a name="line.3499"></a>
-<span class="sourceLineNo">3500</span>  }<a name="line.3500"></a>
-<span class="sourceLineNo">3501</span><a name="line.3501"></a>
-<span class="sourceLineNo">3502</span>  protected class FlushThread extends Thread {<a name="line.3502"></a>
-<span class="sourceLineNo">3503</span>    private volatile boolean done;<a name="line.3503"></a>
-<span class="sourceLineNo">3504</span>    private Throwable error = null;<a name="line.3504"></a>
-<span class="sourceLineNo">3505</span><a name="line.3505"></a>
-<span class="sourceLineNo">3506</span>    FlushThread() {<a name="line.3506"></a>
-<span class="sourceLineNo">3507</span>      super("FlushThread");<a name="line.3507"></a>
-<span class="sourceLineNo">3508</span>    }<a name="line.3508"></a>
-<span class="sourceLineNo">3509</span><a name="line.3509"></a>
-<span class="sourceLineNo">3510</span>    public void done() {<a name="line.3510"></a>
-<span class="sourceLineNo">3511</span>      done = true;<a name="line.3511"></a>
-<span class="sourceLineNo">3512</span>      synchronized (this) {<a name="line.3512"></a>
-<span class="sourceLineNo">3513</span>        interrupt();<a name="line.3513"></a>
-<span class="sourceLineNo">3514</span>      }<a name="line.3514"></a>
-<span class="sourceLineNo">3515</span>    }<a name="line.3515"></a>
-<span class="sourceLineNo">3516</span><a name="line.3516"></a>
-<span class="sourceLineNo">3517</span>    public void checkNoError() {<a name="line.3517"></a>
-<span class="sourceLineNo">3518</span>      if (error != null) {<a name="line.3518"></a>
-<span class="sourceLineNo">3519</span>        assertNull(error);<a name="line.3519"></a>
-<span class="sourceLineNo">3520</span>      }<a name="line.3520"></a>
-<span class="sourceLineNo">3521</span>    }<a name="line.3521"></a>
-<span class="sourceLineNo">3522</span><a name="line.3522"></a>
-<span class="sourceLineNo">3523</span>    @Override<a name="line.3523"></a>
-<span class="sourceLineNo">3524</span>    public void run() {<a name="line.3524"></a>
-<span class="sourceLineNo">3525</span>      done = false;<a name="line.3525"></a>
-<span class="sourceLineNo">3526</span>      while (!done) {<a name="line.3526"></a>
-<span class="sourceLineNo">3527</span>        synchronized (this) {<a name="line.3527"></a>
-<span class="sourceLineNo">3528</span>          try {<a name="line.3528"></a>
-<span class="sourceLineNo">3529</span>            wait();<a name="line.3529"></a>
-<span class="sourceLineNo">3530</span>          } catch (InterruptedException ignored) {<a name="line.3530"></a>
-<span class="sourceLineNo">3531</span>            if (done) {<a name="line.3531"></a>
-<span class="sourceLineNo">3532</span>              break;<a name="line.3532"></a>
-<span class="sourceLineNo">3533</span>            }<a name="line.3533"></a>
-<span class="sourceLineNo">3534</span>          }<a name="line.3534"></a>
-<span class="sourceLineNo">3535</span>        }<a name="line.3535"></a>
-<span class="sourceLineNo">3536</span>        try {<a name="line.3536"></a>
-<span class="sourceLineNo">3537</span>          region.flush(true);<a name="line.3537"></a>
-<span class="sourceLineNo">3538</span>        } catch (IOException e) {<a name="line.3538"></a>
-<span class="sourceLineNo">3539</span>          if (!done) {<a name="line.3539"></a>
-<span class="sourceLineNo">3540</span>            LOG.error("Error while flushing cache", e);<a name="line.3540"></a>
-<span class="sourceLineNo">3541</span>            error = e;<a name="line.3541"></a>
-<span class="sourceLineNo">3542</span>          }<a name="line.3542"></a>
-<span class="sourceLineNo">3543</span>          break;<a name="line.3543"></a>
-<span class="sourceLineNo">3544</span>        } catch (Throwable t) {<a name="line.3544"></a>
-<span class="sourceLineNo">3545</span>          LOG.error("Uncaught exception", t);<a name="line.3545"></a>
-<span class="sourceLineNo">3546</span>          throw t;<a name="line.3546"></a>
-<span class="sourceLineNo">3547</span>        }<a name="line.3547"></a>
-<span class="sourceLineNo">3548</span>      }<a name="line.3548"></a>
-<span class="sourceLineNo">3549</span>    }<a name="line.3549"></a>
-<span class="sourceLineNo">3550</span><a name="line.3550"></a>
-<span class="sourceLineNo">3551</span>    public void flush() {<a name="line.3551"></a>
-<span class="sourceLineNo">3552</span>      synchronized (this) {<a name="line.3552"></a>
-<span class="sourceLineNo">3553</span>        notify();<a name="line.3553"></a>
-<span class="sourceLineNo">3554</span>      }<a name="line.3554"></a>
-<span class="sourceLineNo">3555</span>    }<a name="line.3555"></a>
-<span class="sourceLineNo">3556</span>  }<a name="line.3556"></a>
-<span class="sourceLineNo">3557</span><a name="line.3557"></a>
-<span class="sourceLineNo">3558</span>  /**<a name="line.3558"></a>
-<span class="sourceLineNo">3559</span>   * Writes very wide records and scans for the latest every time.. Flushes and<a name="line.3559"></a>
-<span class="sourceLineNo">3560</span>   * compacts the region every now and then to keep things realistic.<a name="line.3560"></a>
-<span class="sourceLineNo">3561</span>   *<a name="line.3561"></a>
-<span class="sourceLineNo">3562</span>   * @throws IOException<a name="line.3562"></a>
-<span class="sourceLineNo">3563</span>   *           by flush / scan / compaction<a name="line.3563"></a>
-<span class="sourceLineNo">3564</span>   * @throws InterruptedException<a name="line.3564"></a>
-<span class="sourceLineNo">3565</span>   *           when joining threads<a name="line.3565"></a>
-<span class="sourceLineNo">3566</span>   */<a name="line.3566"></a>
-<span class="sourceLineNo">3567</span>  @Test<a name="line.3567"></a>
-<span class="sourceLineNo">3568</span>  public void testWritesWhileScanning() throws IOException, InterruptedException {<a name="line.3568"></a>
-<span class="sourceLineNo">3569</span>    int testCount = 100;<a name="line.3569"></a>
-<span class="sourceLineNo">3570</span>    int numRows = 1;<a name="line.3570"></a>
-<span class="sourceLineNo">3571</span>    int numFamilies = 10;<a name="line.3571"></a>
-<span class="sourceLineNo">3572</span>    int numQualifiers = 100;<a name="line.3572"></a>
-<span class="sourceLineNo">3573</span>    int flushInterval = 7;<a name="line.3573"></a>
-<span class="sourceLineNo">3574</span>    int compactInterval = 5 * flushInterval;<a name="line.3574"></a>
-<span class="sourceLineNo">3575</span>    byte[][] families = new byte[numFamilies][];<a name="line.3575"></a>
-<span class="sourceLineNo">3576</span>    for (int i = 0; i &lt; numFamilies; i++) {<a name="line.3576"></a>
-<span class="sourceLineNo">3577</span>      families[i] = Bytes.toBytes("family" + i);<a name="line.3577"></a>
-<span class="sourceLineNo">3578</span>    }<a name="line.3578"></a>
-<span class="sourceLineNo">3579</span>    byte[][] qualifiers = new byte[numQualifiers][];<a name="line.3579"></a>
-<span class="sourceLineNo">3580</span>    for (int i = 0; i &lt; numQualifiers; i++) {<a name="line.3580"></a>
-<span class="sourceLineNo">3581</span>      qualifiers[i] = Bytes.toBytes("qual" + i);<a name="line.3581"></a>
-<span class="sourceLineNo">3582</span>    }<a name="line.3582"></a>
-<span class="sourceLineNo">3583</span><a name="line.3583"></a>
-<span class="sourceLineNo">3584</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.3584"></a>
-<span class="sourceLineNo">3585</span>    FlushThread flushThread = new FlushThread();<a name="line.3585"></a>
-<span class="sourceLineNo">3586</span>    PutThread putThread = new PutThread(numRows, families, qualifiers);<a name="line.3586"></a>
-<span class="sourceLineNo">3587</span>    try {<a name="line.3587"></a>
-<span class="sourceLineNo">3588</span>      putThread.start();<a name="line.3588"></a>
-<span class="sourceLineNo">3589</span>      putThread.waitForFirstPut();<a name="line.3589"></a>
-<span class="sourceLineNo">3590</span><a name="line.3590"></a>
-<span class="sourceLineNo">3591</span>      flushThread.start();<a name="line.3591"></a>
-<span class="sourceLineNo">3592</span><a name="line.3592"></a>
-<span class="sourceLineNo">3593</span>      Scan scan = new Scan(Bytes.toBytes("row0"), Bytes.toBytes("row1"));<a name="line.3593"></a>
-<span class="sourceLineNo">3594</span><a name="line.3594"></a>
-<span class="sourceLineNo">3595</span>      int expectedCount = numFamilies * numQualifiers;<a name="line.3595"></a>
-<span class="sourceLineNo">3596</span>      List&lt;Cell&gt; res = new ArrayList&lt;&gt;();<a name="line.3596"></a>
-<span class="sourceLineNo">3597</span><a name="line.3597"></a>
-<span class="sourceLineNo">3598</span>      long prevTimestamp = 0L;<a name="line.3598"></a>
-<span class="sourceLineNo">3599</span>      for (int i = 0; i &lt; testCount; i++) {<a name="line.3599"></a>
+<span class="sourceLineNo">3463</span>      int expectedCount = 0;<a name="line.3463"></a>
+<span class="sourceLineNo">3464</span>      List&lt;Cell&gt; res = new ArrayList&lt;&gt;();<a name="line.3464"></a>
+<span class="sourceLineNo">3465</span><a name="line.3465"></a>
+<span class="sourceLineNo">3466</span>      boolean toggle = true;<a name="line.3466"></a>
+<span class="sourceLineNo">3467</span>      for (long i = 0; i &lt; numRows; i++) {<a name="line.3467"></a>
+<span class="sourceLineNo">3468</span>        Put put = new Put(Bytes.toBytes(i));<a name="line.3468"></a>
+<span class="sourceLineNo">3469</span>        put.setDurability(Durability.SKIP_WAL);<a name="line.3469"></a>
+<span class="sourceLineNo">3470</span>        put.addColumn(family, qual1, Bytes.toBytes(i % 10));<a name="line.3470"></a>
+<span class="sourceLineNo">3471</span>        region.put(put);<a name="line.3471"></a>
+<span class="sourceLineNo">3472</span><a name="line.3472"></a>
+<span class="sourceLineNo">3473</span>        if (i != 0 &amp;&amp; i % compactInterval == 0) {<a name="line.3473"></a>
+<span class="sourceLineNo">3474</span>          LOG.debug("iteration = " + i+ " ts="+System.currentTimeMillis());<a name="line.3474"></a>
+<span class="sourceLineNo">3475</span>          region.compact(true);<a name="line.3475"></a>
+<span class="sourceLineNo">3476</span>        }<a name="line.3476"></a>
+<span class="sourceLineNo">3477</span><a name="line.3477"></a>
+<span class="sourceLineNo">3478</span>        if (i % 10 == 5L) {<a name="line.3478"></a>
+<span class="sourceLineNo">3479</span>          expectedCount++;<a name="line.3479"></a>
+<span class="sourceLineNo">3480</span>        }<a name="line.3480"></a>
+<span class="sourceLineNo">3481</span><a name="line.3481"></a>
+<span class="sourceLineNo">3482</span>        if (i != 0 &amp;&amp; i % flushAndScanInterval == 0) {<a name="line.3482"></a>
+<span class="sourceLineNo">3483</span>          res.clear();<a name="line.3483"></a>
+<span class="sourceLineNo">3484</span>          InternalScanner scanner = region.getScanner(scan);<a name="line.3484"></a>
+<span class="sourceLineNo">3485</span>          if (toggle) {<a name="line.3485"></a>
+<span class="sourceLineNo">3486</span>            flushThread.flush();<a name="line.3486"></a>
+<span class="sourceLineNo">3487</span>          }<a name="line.3487"></a>
+<span class="sourceLineNo">3488</span>          while (scanner.next(res))<a name="line.3488"></a>
+<span class="sourceLineNo">3489</span>            ;<a name="line.3489"></a>
+<span class="sourceLineNo">3490</span>          if (!toggle) {<a name="line.3490"></a>
+<span class="sourceLineNo">3491</span>            flushThread.flush();<a name="line.3491"></a>
+<span class="sourceLineNo">3492</span>          }<a name="line.3492"></a>
+<span class="sourceLineNo">3493</span>          assertEquals("toggle="+toggle+"i=" + i + " ts="+System.currentTimeMillis(),<a name="line.3493"></a>
+<span class="sourceLineNo">3494</span>              expectedCount, res.size());<a name="line.3494"></a>
+<span class="sourceLineNo">3495</span>          toggle = !toggle;<a name="line.3495"></a>
+<span class="sourceLineNo">3496</span>        }<a name="line.3496"></a>
+<span class="sourceLineNo">3497</span>      }<a name="line.3497"></a>
+<span class="sourceLineNo">3498</span><a name="line.3498"></a>
+<span class="sourceLineNo">3499</span>    } finally {<a name="line.3499"></a>
+<span class="sourceLineNo">3500</span>      try {<a name="line.3500"></a>
+<span class="sourceLineNo">3501</span>        flushThread.done();<a name="line.3501"></a>
+<span class="sourceLineNo">3502</span>        flushThread.join();<a name="line.3502"></a>
+<span class="sourceLineNo">3503</span>        flushThread.checkNoError();<a name="line.3503"></a>
+<span class="sourceLineNo">3504</span>      } catch (InterruptedException ie) {<a name="line.3504"></a>
+<span class="sourceLineNo">3505</span>        LOG.warn("Caught exception when joining with flushThread", ie);<a name="line.3505"></a>
+<span class="sourceLineNo">3506</span>      }<a name="line.3506"></a>
+<span class="sourceLineNo">3507</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.3507"></a>
+<span class="sourceLineNo">3508</span>      this.region = null;<a name="line.3508"></a>
+<span class="sourceLineNo">3509</span>    }<a name="line.3509"></a>
+<span class="sourceLineNo">3510</span>  }<a name="line.3510"></a>
+<span class="sourceLineNo">3511</span><a name="line.3511"></a>
+<span class="sourceLineNo">3512</span>  protected class FlushThread extends Thread {<a name="line.3512"></a>
+<span class="sourceLineNo">3513</span>    private volatile boolean done;<a name="line.3513"></a>
+<span class="sourceLineNo">3514</span>    private Throwable error = null;<a name="line.3514"></a>
+<span class="sourceLineNo">3515</span><a name="line.3515"></a>
+<span class="sourceLineNo">3516</span>    FlushThread() {<a name="line.3516"></a>
+<span class="sourceLineNo">3517</span>      super("FlushThread");<a name="line.3517"></a>
+<span class="sourceLineNo">3518</span>    }<a name="line.3518"></a>
+<span class="sourceLineNo">3519</span><a name="line.3519"></a>
+<span class="sourceLineNo">3520</span>    public void done() {<a name="line.3520"></a>
+<span class="sourceLineNo">3521</span>      done = true;<a name="line.3521"></a>
+<span class="sourceLineNo">3522</span>      synchronized (this) {<a name="line.3522"></a>
+<span class="sourceLineNo">3523</span>        interrupt();<a name="line.3523"></a>
+<span class="sourceLineNo">3524</span>      }<a name="line.3524"></a>
+<span class="sourceLineNo">3525</span>    }<a name="line.3525"></a>
+<span class="sourceLineNo">3526</span><a name="line.3526"></a>
+<span class="sourceLineNo">3527</span>    public void checkNoError() {<a name="line.3527"></a>
+<span class="sourceLineNo">3528</span>      if (error != null) {<a name="line.3528"></a>
+<span class="sourceLineNo">3529</span>        assertNull(error);<a name="line.3529"></a>
+<span class="sourceLineNo">3530</span>      }<a name="line.3530"></a>
+<span class="sourceLineNo">3531</span>    }<a name="line.3531"></a>
+<span class="sourceLineNo">3532</span><a name="line.3532"></a>
+<span class="sourceLineNo">3533</span>    @Override<a name="line.3533"></a>
+<span class="sourceLineNo">3534</span>    public void run() {<a name="line.3534"></a>
+<span class="sourceLineNo">3535</span>      done = false;<a name="line.3535"></a>
+<span class="sourceLineNo">3536</span>      while (!done) {<a name="line.3536"></a>
+<span class="sourceLineNo">3537</span>        synchronized (this) {<a name="line.3537"></a>
+<span class="sourceLineNo">3538</span>          try {<a name="line.3538"></a>
+<span class="sourceLineNo">3539</span>            wait();<a name="line.3539"></a>
+<span class="sourceLineNo">3540</span>          } catch (InterruptedException ignored) {<a name="line.3540"></a>
+<span class="sourceLineNo">3541</span>            if (done) {<a name="line.3541"></a>
+<span class="sourceLineNo">3542</span>              break;<a name="line.3542"></a>
+<span class="sourceLineNo">3543</span>            }<a name="line.3543"></a>
+<span class="sourceLineNo">3544</span>          }<a name="line.3544"></a>
+<span class="sourceLineNo">3545</span>        }<a name="line.3545"></a>
+<span class="sourceLineNo">3546</span>        try {<a name="line.3546"></a>
+<span class="sourceLineNo">3547</span>          region.flush(true);<a name="line.3547"></a>
+<span class="sourceLineNo">3548</span>        } catch (IOException e) {<a name="line.3548"></a>
+<span class="sourceLineNo">3549</span>          if (!done) {<a name="line.3549"></a>
+<span class="sourceLineNo">3550</span>            LOG.error("Error while flushing cache", e);<a name="line.3550"></a>
+<span class="sourceLineNo">3551</span>            error = e;<a name="line.3551"></a>
+<span class="sourceLineNo">3552</span>          }<a name="line.3552"></a>
+<span class="sourceLineNo">3553</span>          break;<a name="line.3553"></a>
+<span class="sourceLineNo">3554</span>        } catch (Throwable t) {<a name="line.3554"></a>
+<span class="sourceLineNo">3555</span>          LOG.error("Uncaught exception", t);<a name="line.3555"></a>
+<span class="sourceLineNo">3556</span>          throw t;<a name="line.3556"></a>
+<span class="sourceLineNo">3557</span>        }<a name="line.3557"></a>
+<span class="sourceLineNo">3558</span>      }<a name="line.3558"></a>
+<span class="sourceLineNo">3559</span>    }<a name="line.3559"></a>
+<span class="sourceLineNo">3560</span><a name="line.3560"></a>
+<span class="sourceLineNo">3561</span>    public void flush() {<a name="line.3561"></a>
+<span class="sourceLineNo">3562</span>      synchronized (this) {<a name="line.3562"></a>
+<span class="sourceLineNo">3563</span>        notify();<a name="line.3563"></a>
+<span class="sourceLineNo">3564</span>      }<a name="line.3564"></a>
+<span class="sourceLineNo">3565</span>    }<a name="line.3565"></a>
+<span class="sourceLineNo">3566</span>  }<a name="line.3566"></a>
+<span class="sourceLineNo">3567</span><a name="line.3567"></a>
+<span class="sourceLineNo">3568</span>  /**<a name="line.3568"></a>
+<span class="sourceLineNo">3569</span>   * Writes very wide records and scans for the latest every time.. Flushes and<a name="line.3569"></a>
+<span class="sourceLineNo">3570</span>   * compacts the region every now and then to keep things realistic.<a name="line.3570"></a>
+<span class="sourceLineNo">3571</span>   *<a name="line.3571"></a>
+<span class="sourceLineNo">3572</span>   * @throws IOException<a name="line.3572"></a>
+<span class="sourceLineNo">3573</span>   *           by flush / scan / compaction<a name="line.3573"></a>
+<span class="sourceLineNo">3574</span>   * @throws InterruptedException<a name="line.3574"></a>
+<span class="sourceLineNo">3575</span>   *           when joining threads<a name="line.3575"></a>
+<span class="sourceLineNo">3576</span>   */<a name="line.3576"></a>
+<span class="sourceLineNo">3577</span>  @Test<a name="line.3577"></a>
+<span class="sourceLineNo">3578</span>  public void testWritesWhileScanning() throws IOException, InterruptedException {<a name="line.3578"></a>
+<span class="sourceLineNo">3579</span>    int testCount = 100;<a name="line.3579"></a>
+<span class="sourceLineNo">3580</span>    int numRows = 1;<a name="line.3580"></a>
+<span class="sourceLineNo">3581</span>    int numFamilies = 10;<a name="line.3581"></a>
+<span class="sourceLineNo">3582</span>    int numQualifiers = 100;<a name="line.3582"></a>
+<span class="sourceLineNo">3583</span>    int flushInterval = 7;<a name="line.3583"></a>
+<span class="sourceLineNo">3584</span>    int compactInterval = 5 * flushInterval;<a name="line.3584"></a>
+<span class="sourceLineNo">3585</span>    byte[][] families = new byte[numFamilies][];<a name="line.3585"></a>
+<span class="sourceLineNo">3586</span>    for (int i = 0; i &lt; numFamilies; i++) {<a name="line.3586"></a>
+<span class="sourceLineNo">3587</span>      families[i] = Bytes.toBytes("family" + i);<a name="line.3587"></a>
+<span class="sourceLineNo">3588</span>    }<a name="line.3588"></a>
+<span class="sourceLineNo">3589</span>    byte[][] qualifiers = new byte[numQualifiers][];<a name="line.3589"></a>
+<span class="sourceLineNo">3590</span>    for (int i = 0; i &lt; numQualifiers; i++) {<a name="line.3590"></a>
+<span class="sourceLineNo">3591</span>      qualifiers[i] = Bytes.toBytes("qual" + i);<a name="line.3591"></a>
+<span class="sourceLineNo">3592</span>    }<a name="line.3592"></a>
+<span class="sourceLineNo">3593</span><a name="line.3593"></a>
+<span class="sourceLineNo">3594</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.3594"></a>
+<span class="sourceLineNo">3595</span>    FlushThread flushThread = new FlushThread();<a name="line.3595"></a>
+<span class="sourceLineNo">3596</span>    PutThread putThread = new PutThread(numRows, families, qualifiers);<a name="line.3596"></a>
+<span class="sourceLineNo">3597</span>    try {<a name="line.3597"></a>
+<span class="sourceLineNo">3598</span>      putThread.start();<a name="line.3598"></a>
+<span class="sourceLineNo">3599</span>      putThread.waitForFirstPut();<a name="line.3599"></a>
 <span class="sourceLineNo">3600</span><a name="line.3600"></a>
-<span class="sourceLineNo">3601</span>        if (i != 0 &amp;&amp; i % compactInterval == 0) {<a name="line.3601"></a>
-<span class="sourceLineNo">3602</span>          region.compact(true);<a name="line.3602"></a>
-<span class="sourceLineNo">3603</span>          for (HStore store : region.getStores()) {<a name="line.3603"></a>
-<span class="sourceLineNo">3604</span>            store.closeAndArchiveCompactedFiles();<a name="line.3604"></a>
-<span class="sourceLineNo">3605</span>          }<a name="line.3605"></a>
-<span class="sourceLineNo">3606</span>        }<a name="line.3606"></a>
+<span class="sourceLineNo">3601</span>      flushThread.start();<a name="line.3601"></a>
+<span class="sourceLineNo">3602</span><a name="line.3602"></a>
+<span class="sourceLineNo">3603</span>      Scan scan = new Scan(Bytes.toBytes("row0"), Bytes.toBytes("row1"));<a name="line.3603"></a>
+<span class="sourceLineNo">3604</span><a name="line.3604"></a>
+<span class="sourceLineNo">3605</span>      int expectedCount = numFamilies * numQualifiers;<a name="line.3605"></a>
+<span class="sourceLineNo">3606</span>      List&lt;Cell&gt; res = new ArrayList&lt;&gt;();<a name="line.3606"></a>
 <span class="sourceLineNo">3607</span><a name="line.3607"></a>
-<span class="sourceLineNo">3608</span>        if (i != 0 &amp;&amp; i % flushInterval == 0) {<a name="line.3608"></a>
-<span class="sourceLineNo">3609</span>          flushThread.flush();<a name="line.3609"></a>
-<span class="sourceLineNo">3610</span>        }<a name="line.3610"></a>
-<span class="sourceLineNo">3611</span><a name="line.3611"></a>
-<span class="sourceLineNo">3612</span>        boolean previousEmpty = res.isEmpty();<a name="line.3612"></a>
-<span class="sourceLineNo">3613</span>        res.clear();<a name="line.3613"></a>
-<span class="sourceLineNo">3614</span>        try (InternalScanner scanner = region.getScanner(scan)) {<a name="line.3614"></a>
-<span class="sourceLineNo">3615</span>          boolean moreRows;<a name="line.3615"></a>
-<span class="sourceLineNo">3616</span>          do {<a name="line.3616"></a>
-<span class="sourceLineNo">3617</span>            moreRows = scanner.next(res);<a name="line.3617"></a>
-<span class="sourceLineNo">3618</span>          } while (moreRows);<a name="line.3618"></a>
-<span class="sourceLineNo">3619</span>        }<a name="line.3619"></a>
-<span class="sourceLineNo">3620</span>        if (!res.isEmpty() || !previousEmpty || i &gt; compactInterval) {<a name="line.3620"></a>
-<span class="sourceLineNo">3621</span>          assertEquals("i=" + i, expectedCount, res.size());<a name="line.3621"></a>
-<span class="sourceLineNo">3622</span>          long timestamp = res.get(0).getTimestamp();<a name="line.3622"></a>
-<span class="sourceLineNo">3623</span>          assertTrue("Timestamps were broke: " + timestamp + " prev: " + prevTimestamp,<a name="line.3623"></a>
-<span class="sourceLineNo">3624</span>              timestamp &gt;= prevTimestamp);<a name="line.3624"></a>
-<span class="sourceLineNo">3625</span>          prevTimestamp = timestamp;<a name="line.3625"></a>
-<span class="sourceLineNo">3626</span>        }<a name="line.3626"></a>
-<span class="sourceLineNo">3627</span>      }<a name="line.3627"></a>
-<span class="sourceLineNo">3628</span><a name="line.3628"></a>
-<span class="sourceLineNo">3629</span>      putThread.done();<a name="line.3629"></a>
-<span class="sourceLineNo">3630</span><a name="line.3630"></a>
-<span class="sourceLineNo">3631</span>      region.flush(true);<a name="line.3631"></a>
-<span class="sourceLineNo">3632</span><a name="line.3632"></a>
-<span class="sourceLineNo">3633</span>    } finally {<a name="line.3633"></a>
-<span class="sourceLineNo">3634</span>      try {<a name="line.3634"></a>
-<span class="sourceLineNo">3635</span>        flushThread.done();<a name="line.3635"></a>
-<span class="sourceLineNo">3636</span>        flushThread.join();<a name="line.3636"></a>
-<span class="sourceLineNo">3637</span>        flushThread.checkNoError();<a name="line.3637"></a>
+<span class="sourceLineNo">3608</span>      long prevTimestamp = 0L;<a name="line.3608"></a>
+<span class="sourceLineNo">3609</span>      for (int i = 0; i &lt; testCount; i++) {<a name="line.3609"></a>
+<span class="sourceLineNo">3610</span><a name="line.3610"></a>
+<span class="sourceLineNo">3611</span>        if (i != 0 &amp;&amp; i % compactInterval == 0) {<a name="line.3611"></a>
+<span class="sourceLineNo">3612</span>          region.compact(true);<a name="line.3612"></a>
+<span class="sourceLineNo">3613</span>          for (HStore store : region.getStores()) {<a name="line.3613"></a>
+<span class="sourceLineNo">3614</span>            store.closeAndArchiveCompactedFiles();<a name="line.3614"></a>
+<span class="sourceLineNo">3615</span>          }<a name="line.3615"></a>
+<span class="sourceLineNo">3616</span>        }<a name="line.3616"></a>
+<span class="sourceLineNo">3617</span><a name="line.3617"></a>
+<span class="sourceLineNo">3618</span>        if (i != 0 &amp;&amp; i % flushInterval == 0) {<a name="line.3618"></a>
+<span class="sourceLineNo">3619</span>          flushThread.flush();<a name="line.3619"></a>
+<span class="sourceLineNo">3620</span>        }<a name="line.3620"></a>
+<span class="sourceLineNo">3621</span><a name="line.3621"></a>
+<span class="sourceLineNo">3622</span>        boolean previousEmpty = res.isEmpty();<a name="line.3622"></a>
+<span class="sourceLineNo">3623</span>        res.clear();<a name="line.3623"></a>
+<span class="sourceLineNo">3624</span>        try (InternalScanner scanner = region.getScanner(scan)) {<a name="line.3624"></a>
+<span class="sourceLineNo">3625</span>          boolean moreRows;<a name="line.3625"></a>
+<span class="sourceLineNo">3626</span>          do {<a name="line.3626"></a>
+<span class="sourceLineNo">3627</span>            moreRows = scanner.next(res);<a name="line.3627"></a>
+<span class="sourceLineNo">3628</span>          } while (moreRows);<a name="line.3628"></a>
+<span class="sourceLineNo">3629</span>        }<a name="line.3629"></a>
+<span class="sourceLineNo">3630</span>        if (!res.isEmpty() || !previousEmpty || i &gt; compactInterval) {<a name="line.3630"></a>
+<span class="sourceLineNo">3631</span>          assertEquals("i=" + i, expectedCount, res.size());<a name="line.3631"></a>
+<span class="sourceLineNo">3632</span>          long timestamp = res.get(0).getTimestamp();<a name="line.3632"></a>
+<span class="sourceLineNo">3633</span>          assertTrue("Timestamps were broke: " + timestamp + " prev: " + prevTimestamp,<a name="line.3633"></a>
+<span class="sourceLineNo">3634</span>              timestamp &gt;= prevTimestamp);<a name="line.3634"></a>
+<span class="sourceLineNo">3635</span>          prevTimestamp = timestamp;<a name="line.3635"></a>
+<span class="sourceLineNo">3636</span>        }<a name="line.3636"></a>
+<span class="sourceLineNo">3637</span>      }<a name="line.3637"></a>
 <span class="sourceLineNo">3638</span><a name="line.3638"></a>
-<span class="sourceLineNo">3639</span>        putThread.join();<a name="line.3639"></a>
-<span class="sourceLineNo">3640</span>        putThread.checkNoError();<a name="line.3640"></a>
-<span class="sourceLineNo">3641</span>      } catch (InterruptedException ie) {<a name="line.3641"></a>
-<span class="sourceLineNo">3642</span>        LOG.warn("Caught exception when joining with flushThread", ie);<a name="line.3642"></a>
-<span class="sourceLineNo">3643</span>      }<a name="line.3643"></a>
-<span class="sourceLineNo">3644</span><a name="line.3644"></a>
-<span class="sourceLineNo">3645</span>      try {<a name="line.3645"></a>
-<span class="sourceLineNo">3646</span>          HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.3646"></a>
-<span class="sourceLineNo">3647</span>      } catch (DroppedSnapshotException dse) {<a name="line.3647"></a>
-<span class="sourceLineNo">3648</span>        // We could get this on way out because we interrupt the background flusher and it could<a name="line.3648"></a>
-<span class="sourceLineNo">3649</span>        // fail anywhere causing a DSE over in the background flusher... only it is not properly<a name="line.3649"></a>
-<span class="sourceLineNo">3650</span>        // dealt with so could still be memory hanging out when we get to here -- memory we can't<a name="line.3650"></a>
-<span class="sourceLineNo">3651</span>        // flush because the accounting is 'off' since original DSE.<a name="line.3651"></a>
-<span class="sourceLineNo">3652</span>      }<a name="line.3652"></a>
-<span class="sourceLineNo">3653</span>      this.region = null;<a name="line.3653"></a>
-<span class="sourceLineNo">3654</span>    }<a name="line.3654"></a>
-<span class="sourceLineNo">3655</span>  }<a name="line.3655"></a>
-<span class="sourceLineNo">3656</span><a name="line.3656"></a>
-<span class="sourceLineNo">3657</span>  protected class PutThread extends Thread {<a name="line.3657"></a>
-<span class="sourceLineNo">3658</span>    private volatile boolean done;<a name="line.3658"></a>
-<span class="sourceLineNo">3659</span>    private volatile int numPutsFinished = 0;<a name="line.3659"></a>
-<span class="sourceLineNo">3660</span><a name="line.3660"></a>
-<span class="sourceLineNo">3661</span>    private Throwable error = null;<a name="line.3661"></a>
-<span class="sourceLineNo">3662</span>    private int numRows;<a name="line.3662"></a>
-<span class="sourceLineNo">3663</span>    private byte[][] families;<a name="line.3663"></a>
-<span class="sourceLineNo">3664</span>    private byte[][] qualifiers;<a name="line.3664"></a>
-<span class="sourceLineNo">3665</span><a name="line.3665"></a>
-<span class="sourceLineNo">3666</span>    private PutThread(int numRows, byte[][] families, byte[][] qualifiers) {<a name="line.3666"></a>
-<span class="sourceLineNo">3667</span>      super("PutThread");<a name="line.3667"></a>
-<span class="sourceLineNo">3668</span>      this.numRows = numRows;<a name="line.3668"></a>
-<span class="sourceLineNo">3669</span>      this.families = families;<a name="line.3669"></a>
-<span class="sourceLineNo">3670</span>      this.qualifiers = qualifiers;<a name="line.3670"></a>
-<span class="sourceLineNo">3671</span>    }<a name="line.3671"></a>
-<span class="sourceLineNo">3672</span><a name="line.3672"></a>
-<span class="sourceLineNo">3673</span>    /**<a name="line.3673"></a>
-<span class="sourceLineNo">3674</span>     * Block calling thread until this instance of PutThread has put at least one row.<a name="line.3674"></a>
-<span class="sourceLineNo">3675</span>     */<a name="line.3675"></a>
-<span class="sourceLineNo">3676</span>    public void waitForFirstPut() throws InterruptedException {<a name="line.3676"></a>
-<span class="sourceLineNo">3677</span>      // wait until put thread actually puts some data<a name="line.3677"></a>
-<span class="sourceLineNo">3678</span>      while (isAlive() &amp;&amp; numPutsFinished == 0) {<a name="line.3678"></a>
-<span class="sourceLineNo">3679</span>        checkNoError();<a name="line.3679"></a>
-<span class="sourceLineNo">3680</span>        Thread.sleep(50);<a name="line.3680"></a>
-<span class="sourceLineNo">3681</span>      }<a name="line.3681"></a>
-<span class="sourceLineNo">3682</span>    }<a name="line.3682"></a>
-<span class="sourceLineNo">3683</span><a name="line.3683"></a>
-<span class="sourceLineNo">3684</span>    public void done() {<a name="line.3684"></a>
-<span class="sourceLineNo">3685</span>      done = true;<a name="line.3685"></a>
-<span class="sourceLineNo">3686</span>      synchronized (this) {<a name="line.3686"></a>
-<span class="sourceLineNo">3687</span>        interrupt();<a name="line.3687"></a>
-<span class="sourceLineNo">3688</span>      }<a name="line.3688"></a>
-<span class="sourceLineNo">3689</span>    }<a name="line.3689"></a>
-<span class="sourceLineNo">3690</span><a name="line.3690"></a>
-<span class="sourceLineNo">3691</span>    public void checkNoError() {<a name="line.3691"></a>
-<span class="sourceLineNo">3692</span>      if (error != null) {<a name="line.3692"></a>
-<span class="sourceLineNo">3693</span>        assertNull(error);<a name="line.3693"></a>
-<span class="sourceLineNo">3694</span>      }<a name="line.3694"></a>
-<span class="sourceLineNo">3695</span>    }<a name="line.3695"></a>
-<span class="sourceLineNo">3696</span><a name="line.3696"></a>
-<span class="sourceLineNo">3697</span>    @Override<a name="line.3697"></a>
-<span class="sourceLineNo">3698</span>    public void run() {<a name="line.3698"></a>
-<span class="sourceLineNo">3699</span>      done = false;<a name="line.3699"></a>
-<span class="sourceLineNo">3700</span>      while (!done) {<a name="line.3700"></a>
-<span class="sourceLineNo">3701</span>        try {<a name="line.3701"></a>
-<span class="sourceLineNo">3702</span>          for (int r = 0; r &lt; numRows; r++) {<a name="line.3702"></a>
-<span class="sourceLineNo">3703</span>            byte[] row = Bytes.toBytes("row" + r);<a name="line.3703"></a>
-<span class="sourceLineNo">3704</span>            Put put = new Put(row);<a name="line.3704"></a>
-<span class="sourceLineNo">3705</span>            put.setDurability(Durability.SKIP_WAL);<a name="line.3705"></a>
-<span class="sourceLineNo">3706</span>            byte[] value = Bytes.toBytes(String.valueOf(numPutsFinished));<a name="line.3706"></a>
-<span class="sourceLineNo">3707</span>            for (byte[] family : families) {<a name="line.3707"></a>
-<span class="sourceLineNo">3708</span>              for (byte[] qualifier : qualifiers) {<a name="line.3708"></a>
-<span class="sourceLineNo">3709</span>                put.addColumn(family, qualifier, numPutsFinished, value);<a name="line.3709"></a>
-<span class="sourceLineNo">3710</span>              }<a name="line.3710"></a>
-<span class="sourceLineNo">3711</span>            }<a name="line.3711"></a>
-<span class="sourceLineNo">3712</span>            region.put(put);<a name="line.3712"></a>
-<span class="sourceLineNo">3713</span>            numPutsFinished++;<a name="line.3713"></a>
-<span class="sourceLineNo">3714</span>            if (numPutsFinished &gt; 0 &amp;&amp; numPutsFinished % 47 == 0) {<a name="line.3714"></a>
-<span class="sourceLineNo">3715</span>              LOG.debug("put iteration = {}", numPutsFinished);<a name="line.3715"></a>
-<span class="sourceLineNo">3716</span>              Delete delete = new Delete(row, (long) numPutsFinished - 30);<a name="line.3716"></a>
-<span class="sourceLineNo">3717</span>              region.delete(delete);<a name="line.3717"></a>
-<span class="sourceLineNo">3718</span>            }<a name="line.3718"></a>
-<span class="sourceLineNo">3719</span>            numPutsFinished++;<a name="line.3719"></a>
-<span class="sourceLineNo">3720</span>          }<a name="line.3720"></a>
-<span class="sourceLineNo">3721</span>        } catch (InterruptedIOException e) {<a name="line.3721"></a>
-<span class="sourceLineNo">3722</span>          // This is fine. It means we are done, or didn't get the lock on time<a name="line.3722"></a>
-<span class="sourceLineNo">3723</span>          LOG.info("Interrupted", e);<a name="line.3723"></a>
-<span class="sourceLineNo">3724</span>        } catch (IOException e) {<a name="line.3724"></a>
-<span class="sourceLineNo">3725</span>          LOG.error("Error while putting records", e);<a name="line.3725"></a>
-<span class="sourceLineNo">3726</span>          error = e;<a name="line.3726"></a>
-<span class="sourceLineNo">3727</span>          break;<a name="line.3727"></a>
-<span class="sourceLineNo">3728</span>        }<a name="line.3728"></a>
-<span class="sourceLineNo">3729</span>      }<a name="line.3729"></a>
-<span class="sourceLineNo">3730</span><a name="line.3730"></a>
-<span class="sourceLineNo">3731</span>    }<a name="line.3731"></a>
-<span class="sourceLineNo">3732</span><a name="line.3732"></a>
-<span class="sourceLineNo">3733</span>  }<a name="line.3733"></a>
-<span class="sourceLineNo">3734</span><a name="line.3734"></a>
-<span class="sourceLineNo">3735</span>  /**<a name="line.3735"></a>
-<span class="sourceLineNo">3736</span>   * Writes very wide records and gets the latest row every time.. Flushes and<a name="line.3736"></a>
-<span class="sourceLineNo">3737</span>   * compacts the region aggressivly to catch issues.<a name="line.3737"></a>
-<span class="sourceLineNo">3738</span>   *<a name="line.3738"></a>
-<span class="sourceLineNo">3739</span>   * @throws IOException<a name="line.3739"></a>
-<span class="sourceLineNo">3740</span>   *           by flush / scan / compaction<a name="line.3740"></a>
-<span class="sourceLineNo">3741</span>   * @throws InterruptedException<a name="line.3741"></a>
-<span class="sourceLineNo">3742</span>   *           when joining threads<a name="line.3742"></a>
-<span class="sourceLineNo">3743</span>   */<a name="line.3743"></a>
-<span class="sourceLineNo">3744</span>  @Test<a name="line.3744"></a>
-<span class="sourceLineNo">3745</span>  public void testWritesWhileGetting() throws Exception {<a name="line.3745"></a>
-<span class="sourceLineNo">3746</span>    int testCount = 50;<a name="line.3746"></a>
-<span class="sourceLineNo">3747</span>    int numRows = 1;<a name="line.3747"></a>
-<span class="sourceLineNo">3748</span>    int numFamilies = 10;<a name="line.3748"></a>
-<span class="sourceLineNo">3749</span>    int numQualifiers = 100;<a name="line.3749"></a>
-<span class="sourceLineNo">3750</span>    int compactInterval = 100;<a name="line.3750"></a>
-<span class="sourceLineNo">3751</span>    byte[][] families = new byte[numFamilies][];<a name="line.3751"></a>
-<span class="sourceLineNo">3752</span>    for (int i = 0; i &lt; numFamilies; i++) {<a name="line.3752"></a>
-<span class="sourceLineNo">3753</span>      families[i] = Bytes.toBytes("family" + i);<a name="line.3753"></a>
-<span class="sourceLineNo">3754</span>    }<a name="line.3754"></a>
-<span class="sourceLineNo">3755</span>    byte[][] qualifiers = new byte[numQualifiers][];<a name="line.3755"></a>
-<span class="sourceLineNo">3756</span>    for (int i = 0; i &lt; numQualifiers; i++) {<a name="line.3756"></a>
-<span class="sourceLineNo">3757</span>      qualifiers[i] = Bytes.toBytes("qual" + i);<a name="line.3757"></a>
-<span class="sourceLineNo">3758</span>    }<a name="line.3758"></a>
-<span class="sourceLineNo">3759</span><a name="line.3759"></a>
-<span class="sourceLineNo">3760</span><a name="line.3760"></a>
-<span class="sourceLineNo">3761</span>    // This test flushes constantly and can cause many files to be created,<a name="line.3761"></a>
-<span class="sourceLineNo">3762</span>    // possibly<a name="line.3762"></a>
-<span class="sourceLineNo">3763</span>    // extending over the ulimit. Make sure compactions are aggressive in<a name="line.3763"></a>
-<span class="sourceLineNo">3764</span>    // reducing<a name="line.3764"></a>
-<span class="sourceLineNo">3765</span>    // the number of HFiles created.<a name="line.3765"></a>
-<span class="sourceLineNo">3766</span>    Configuration conf = HBaseConfiguration.create(CONF);<a name="line.3766"></a>
-<span class="sourceLineNo">3767</span>    conf.setInt("hbase.hstore.compaction.min", 1);<a name="line.3767"></a>
-<span class="sourceLineNo">3768</span>    conf.setInt("hbase.hstore.compaction.max", 1000);<a name="line.3768"></a>
-<span class="sourceLineNo">3769</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.3769"></a>
-<span class="sourceLineNo">3770</span>    PutThread putThread = null;<a name="line.3770"></a>
-<span class="sourceLineNo">3771</span>    MultithreadedTestUtil.TestContext ctx = new MultithreadedTestUtil.TestContext(conf);<a name="line.3771"></a>
-<span class="sourceLineNo">3772</span>    try {<a name="line.3772"></a>
-<span class="sourceLineNo">3773</span>      putThread = new PutThread(numRows, families, qualifiers);<a name="line.3773"></a>
-<span class="sourceLineNo">3774</span>      putThread.start();<a name="line.3774"></a>
-<span class="sourceLineNo">3775</span>      putThread.waitForFirstPut();<a name="line.3775"></a>
-<span class="sourceLineNo">3776</span><a name="line.3776"></a>
-<span class="sourceLineNo">3777</span>      // Add a thread that flushes as fast as possible<a name="line.3777"></a>
-<span class="sourceLineNo">3778</span>      ctx.addThread(new RepeatingTestThread(ctx) {<a name="line.3778"></a>
-<span class="sourceLineNo">3779</span><a name="line.3779"></a>
-<span class="sourceLineNo">3780</span>        @Override<a name="line.3780"></a>
-<span class="sourceLineNo">3781</span>        public void doAnAction() throws Exception {<a name="line.3781"></a>
-<span class="sourceLineNo">3782</span>          region.flush(true);<a name="line.3782"></a>
-<span class="sourceLineNo">3783</span>          // Compact regularly to avoid creating too many files and exceeding<a name="line.3783"></a>
-<span class="sourceLineNo">3784</span>          // the ulimit.<a name="line.3784"></a>
-<span class="sourceLineNo">3785</span>          region.compact(false);<a name="line.3785"></a>
-<span class="sourceLineNo">3786</span>          for (HStore store : region.getStores()) {<a name="line.3786"></a>
-<span class="sourceLineNo">3787</span>            store.closeAndArchiveCompactedFiles();<a name="line.3787"></a>
-<span class="sourceLineNo">3788</span>          }<a name="line.3788"></a>
-<span class="sourceLineNo">3789</span>        }<a name="line.3789"></a>
-<span class="sourceLineNo">3790</span>      });<a name="line.3790"></a>
-<span class="sourceLineNo">3791</span>      ctx.startThreads();<a name="line.3791"></a>
-<span class="sourceLineNo">3792</span><a name="line.3792"></a>
-<span class="sourceLineNo">3793</span>      Get get = new Get(Bytes.toBytes("row0"));<a name="line.3793"></a>
-<span class="sourceLineNo">3794</span>      Result result = null;<a name="line.3794"></a>
-<span class="sourceLineNo">3795</span><a name="line.3795"></a>
-<span class="sourceLineNo">3796</span>      int expectedCount = numFamilies * numQualifiers;<a name="line.3796"></a>
-<span class="sourceLineNo">3797</span><a name="line.3797"></a>
-<span class="sourceLineNo">3798</span>      long prevTimestamp = 0L;<a name="line.3798"></a>
-<span class="sourceLineNo">3799</span>      for (int i = 0; i &lt; testCount; i++) {<a name="line.3799"></a>
-<span class="sourceLineNo">3800</span>        LOG.info("testWritesWhileGetting verify turn " + i);<a name="line.3800"></a>
-<span class="sourceLineNo">3801</span>        boolean previousEmpty = result == null || result.isEmpty();<a name="line.3801"></a>
-<span class="sourceLineNo">3802</span>        result = region.get(get);<a name="line.3802"></a>
-<span class="sourceLineNo">3803</span>        if (!result.isEmpty() || !previousEmpty || i &gt; compactInterval) {<a name="line.3803"></a>
-<span class="sourceLineNo">3804</span>          assertEquals("i=" + i, expectedCount, result.size());<a name="line.3804"></a>
-<span class="sourceLineNo">3805</span>          // TODO this was removed, now what dangit?!<a name="line.3805"></a>
-<span class="sourceLineNo">3806</span>          // search looking for the qualifier in question?<a name="line.3806"></a>
-<span class="sourceLineNo">3807</span>          long timestamp = 0;<a name="line.3807"></a>
-<span class="sourceLineNo">3808</span>          for (Cell kv : result.rawCells()) {<a name="line.3808"></a>
-<span class="sourceLineNo">3809</span>            if (CellUtil.matchingFamily(kv, families[0])<a name="line.3809"></a>
-<span class="sourceLineNo">3810</span>                &amp;&amp; CellUtil.matchingQualifier(kv, qualifiers[0])) {<a name="line.3810"></a>
-<span class="sourceLineNo">3811</span>              timestamp = kv.getTimestamp();<a name="line.3811"></a>
-<span class="sourceLineNo">3812</span>            }<a name="line.3812"></a>
-<span class="sourceLineNo">3813</span>          }<a name="line.3813"></a>
-<span class="sourceLineNo">3814</span>          assertTrue(timestamp &gt;= prevTimestamp);<a name="line.3814"></a>
-<span class="sourceLineNo">3815</span>          prevTimestamp = timestamp;<a name="line.3815"></a>
-<span class="sourceLineNo">3816</span>          Cell previousKV = null;<a name="line.3816"></a>
-<span class="sourceLineNo">3817</span><a name="line.3817"></a>
+<span class="sourceLineNo">3639</span>      putThread.done();<a name="line.3639"></a>
+<span class="sourceLineNo">3640</span><a name="line.3640"></a>
+<span class="sourceLineNo">3641</span>      region.flush(true);<a name="line.3641"></a>
+<span class="sourceLineNo">3642</span><a name="line.3642"></a>
+<span class="sourceLineNo">3643</span>    } finally {<a name="line.3643"></a>
+<span class="sourceLineNo">3644</span>      try {<a name="line.3644"></a>
+<span class="sourceLineNo">3645</span>        flushThread.done();<a name="line.3645"></a>
+<span class="sourceLineNo">3646</span>        flushThread.join();<a name="line.3646"></a>
+<span class="sourceLineNo">3647</span>        flushThread.checkNoError();<a name="line.3647"></a>
+<span class="sourceLineNo">3648</span><a name="line.3648"></a>
+<span class="sourceLineNo">3649</span>        putThread.join();<a name="line.3649"></a>
+<span class="sourceLineNo">3650</span>        putThread.checkNoError();<a name="line.3650"></a>
+<span class="sourceLineNo">3651</span>      } catch (InterruptedException ie) {<a name="line.3651"></a>
+<span class="sourceLineNo">3652</span>        LOG.warn("Caught exception when joining with flushThread", ie);<a name="line.3652"></a>
+<span class="sourceLineNo">3653</span>      }<a name="line.3653"></a>
+<span class="sourceLineNo">3654</span><a name="line.3654"></a>
+<span class="sourceLineNo">3655</span>      try {<a name="line.3655"></a>
+<span class="sourceLineNo">3656</span>          HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.3656"></a>
+<span class="sourceLineNo">3657</span>      } catch (DroppedSnapshotException dse) {<a name="line.3657"></a>
+<span class="sourceLineNo">3658</span>        // We could get this on way out because we interrupt the background flusher and it could<a name="line.3658"></a>
+<span class="sourceLineNo">3659</span>        // fail anywhere causing a DSE over in the background flusher... only it is not properly<a name="line.3659"></a>
+<span class="sourceLineNo">3660</span>        // dealt with so could still be memory hanging out when we get to here -- memory we can't<a name="line.3660"></a>
+<span class="sourceLineNo">3661</span>        // flush because the accounting is 'off' since original DSE.<a name="line.3661"></a>
+<span class="sourceLineNo">3662</span>      }<a name="line.3662"></a>
+<span class="sourceLineNo">3663</span>      this.region = null;<a name="line.3663"></a>
+<span class="sourceLineNo">3664</span>    }<a name="line.3664"></a>
+<span class="sourceLineNo">3665</span>  }<a name="line.3665"></a>
+<span class="sourceLineNo">3666</span><a name="line.3666"></a>
+<span class="sourceLineNo">3667</span>  protected class PutThread extends Thread {<a name="line.3667"></a>
+<span class="sourceLineNo">3668</span>    private volatile boolean done;<a name="line.3668"></a>
+<span class="sourceLineNo">3669</span>    private volatile int numPutsFinished = 0;<a name="line.3669"></a>
+<span class="sourceLineNo">3670</span><a name="line.3670"></a>
+<span class="sourceLineNo">3671</span>    private Throwable error = null;<a name="line.3671"></a>
+<span class="sourceLineNo">3672</span>    private int numRows;<a name="line.3672"></a>
+<span class="sourceLineNo">3673</span>    private byte[][] families;<a name="line.3673"></a>
+<span class="sourceLineNo">3674</span>    private byte[][] qualifiers;<a name="line.3674"></a>
+<span class="sourceLineNo">3675</span><a name="line.3675"></a>
+<span class="sourceLineNo">3676</span>    private PutThread(int numRows, byte[][] families, byte[][] qualifiers) {<a name="line.3676"></a>
+<span class="sourceLineNo">3677</span>      super("PutThread");<a name="line.3677"></a>
+<span class="sourceLineNo">3678</span>      this.numRows = numRows;<a name="line.3678"></a>
+<span class="sourceLineNo">3679</span>      this.families = families;<a name="line.3679"></a>
+<span class="sourceLineNo">3680</span>      this.qualifiers = qualifiers;<a name="line.3680"></a>
+<span class="sourceLineNo">3681</span>    }<a name="line.3681"></a>
+<span class="sourceLineNo">3682</span><a name="line.3682"></a>
+<span class="sourceLineNo">3683</span>    /**<a name="line.3683"></a>
+<span class="sourceLineNo">3684</span>     * Block calling thread until this instance of PutThread has put at least one row.<a name="line.3684"></a>
+<span class="sourceLineNo">3685</span>     */<a name="line.3685"></a>
+<span class="sourceLineNo">3686</span>    public void waitForFirstPut() throws InterruptedException {<a name="line.3686"></a>
+<span class="sourceLineNo">3687</span>      // wait until put thread actually puts some data<a name="line.3687"></a>
+<span class="sourceLineNo">3688</span>      while (isAlive() &amp;&amp; numPutsFinished == 0) {<a name="line.3688"></a>
+<span class="sourceLineNo">3689</span>        checkNoError();<a name="line.3689"></a>
+<span class="sourceLineNo">3690</span>        Thread.sleep(50);<a name="line.3690"></a>
+<span class="sourceLineNo">3691</span>      }<a name="line.3691"></a>
+<span class="sourceLineNo">3692</span>    }<a name="line.3692"></a>
+<span class="sourceLineNo">3693</span><a name="line.3693"></a>
+<span class="sourceLineNo">3694</span>    public void done() {<a name="line.3694"></a>
+<span class="sourceLineNo">3695</span>      done = true;<a name="line.3695"></a>
+<span class="sourceLineNo">3696</span>      synchronized (this) {<a name="line.3696"></a>
+<span class="sourceLineNo">3697</span>        interrupt();<a name="line.3697"></a>
+<span class="sourceLineNo">3698</span>      }<a name="line.3698"></a>
+<span class="sourceLineNo">3699</span>    }<a name="line.3699"></a>
+<span class="sourceLineNo">3700</span><a name="line.3700"></a>
+<span class="sourceLineNo">3701</span>    public void checkNoError() {<a name="line.3701"></a>
+<span class="sourceLineNo">3702</span>      if (error != null) {<a name="line.3702"></a>
+<span class="sourceLineNo">3703</span>        assertNull(error);<a name="line.3703"></a>
+<span class="sourceLineNo">3704</span>      }<a name="line.3704"></a>
+<span class="sourceLineNo">3705</span>    }<a name="line.3705"></a>
+<span class="sourceLineNo">3706</span><a name="line.3706"></a>
+<span class="sourceLineNo">3707</span>    @Override<a name="line.3707"></a>
+<span class="sourceLineNo">3708</span>    public void run() {<a name="line.3708"></a>
+<span class="sourceLineNo">3709</span>      done = false;<a name="line.3709"></a>
+<span class="sourceLineNo">3710</span>      while (!done) {<a name="line.3710"></a>
+<span class="sourceLineNo">3711</span>        try {<a name="line.3711"></a>
+<span class="sourceLineNo">3712</span>          for (int r = 0; r &lt; numRows; r++) {<a name="line.3712"></a>
+<span class="sourceLineNo">3713</span>            byte[] row = Bytes.toBytes("row" + r);<a name="line.3713"></a>
+<span class="sourceLineNo">3714</span>            Put put = new Put(row);<a name="line.3714"></a>
+<span class="sourceLineNo">3715</span>            put.setDurability(Durability.SKIP_WAL);<a name="line.3715"></a>
+<span class="sourceLineNo">3716</span>            byte[] value = Bytes.toBytes(String.valueOf(numPutsFinished));<a name="line.3716"></a>
+<span class="sourceLineNo">3717</span>            for (byte[] family : families) {<a name="line.3717"></a>
+<span class="sourceLineNo">3718</span>              for (byte[] qualifier : qualifiers) {<a name="line.3718"></a>
+<span class="sourceLineNo">3719</span>                put.addColumn(family, qualifier, numPutsFinished, value);<a name="line.3719"></a>
+<span class="sourceLineNo">3720</span>              }<a name="line.3720"></a>
+<span class="sourceLineNo">3721</span>            }<a name="line.3721"></a>
+<span class="sourceLineNo">3722</span>            region.put(put);<a name="line.3722"></a>
+<span class="sourceLineNo">3723</span>            numPutsFinished++;<a name="line.3723"></a>
+<span class="sourceLineNo">3724</span>            if (numPutsFinished &gt; 0 &amp;&amp; numPutsFinished % 47 == 0) {<a name="line.3724"></a>
+<span class="sourceLineNo">3725</span>              LOG.debug("put iteration = {}", numPutsFinished);<a name="line.3725"></a>
+<span class="sourceLineNo">3726</span>              Delete delete = new Delete(row, (long) numPutsFinished - 30);<a name="line.3726"></a>
+<span class="sourceLineNo">3727</span>              region.delete(delete);<a name="line.3727"></a>
+<span class="sourceLineNo">3728</span>            }<a name="line.3728"></a>
+<span class="sourceLineNo">3729</span>            numPutsFinished++;<a name="line.3729"></a>
+<span class="sourceLineNo">3730</span>          }<a name="line.3730"></a>
+<span class="sourceLineNo">3731</span>        } catch (InterruptedIOException e) {<a name="line.3731"></a>
+<span class="sourceLineNo">3732</span>          // This is fine. It means we are done, or didn't get the lock on time<a name="line.3732"></a>
+<span class="sourceLineNo">3733</span>          LOG.info("Interrupted", e);<a name="line.3733"></a>
+<span class="sourceLineNo">3734</span>        } catch (IOException e) {<a name="line.3734"></a>
+<span class="sourceLineNo">3735</span>          LOG.error("Error while putting records", e);<a name="line.3735"></a>
+<span class="sourceLineNo">3736</span>          error = e;<a name="line.3736"></a>
+<span class="sourceLineNo">3737</span>          break;<a name="line.3737"></a>
+<span class="sourceLineNo">3738</span>        }<a name="line.3738"></a>
+<span class="sourceLineNo">3739</span>      }<a name="line.3739"></a>
+<span class="sourceLineNo">3740</span><a name="line.3740"></a>
+<span class="sourceLineNo">3741</span>    }<a name="line.3741"></a>
+<span class="sourceLineNo">3742</span><a name="line.3742"></a>
+<span class="sourceLineNo">3743</span>  }<a name="line.3743"></a>
+<span class="sourceLineNo">3744</span><a name="line.3744"></a>
+<span class="sourceLineNo">3745</span>  /**<a name="line.3745"></a>
+<span class="sourceLineNo">3746</span>   * Writes very wide records and gets the latest row every time.. Flushes and<a name="line.3746"></a>
+<span class="sourceLineNo">3747</span>   * compacts the region aggressivly to catch issues.<a name="line.3747"></a>
+<span class="sourceLineNo">3748</span>   *<a name="line.3748"></a>
+<span class="sourceLineNo">3749</span>   * @throws IOException<a name="line.3749"></a>
+<span class="sourceLineNo">3750</span>   *           by flush / scan / compaction<a name="line.3750"></a>
+<span class="sourceLineNo">3751</span>   * @throws InterruptedException<a name="line.3751"></a>
+<span class="sourceLineNo">3752</span>   *           when joining threads<a name="line.3752"></a>
+<span class="sourceLineNo">3753</span>   */<a name="line.3753"></a>
+<span class="sourceLineNo">3754</span>  @Test<a name="line.3754"></a>
+<span class="sourceLineNo">3755</span>  public void testWritesWhileGetting() throws Exception {<a name="line.3755"></a>
+<span class="sourceLineNo">3756</span>    int testCount = 50;<a name="line.3756"></a>
+<span class="sourceLineNo">3757</span>    int numRows = 1;<a name="line.3757"></a>
+<span class="sourceLineNo">3758</span>    int numFamilies = 10;<a name="line.3758"></a>
+<span class="sourceLineNo">3759</span>    int numQualifiers = 100;<a name="line.3759"></a>
+<span class="sourceLineNo">3760</span>    int compactInterval = 100;<a name="line.3760"></a>
+<span class="sourceLineNo">3761</span>    byte[][] families = new byte[numFamilies][];<a name="line.3761"></a>
+<span class="sourceLineNo">3762</span>    for (int i = 0; i &lt; numFamilies; i++) {<a name="line.3762"></a>
+<span class="sourceLineNo">3763</span>      families[i] = Bytes.toBytes("family" + i);<a name="line.3763"></a>
+<span class="sourceLineNo">3764</span>    }<a name="line.3764"></a>
+<span class="sourceLineNo">3765</span>    byte[][] qualifiers = new byte[numQualifiers][];<a name="line.3765"></a>
+<span class="sourceLineNo">3766</span>    for (int i = 0; i &lt; numQualifiers; i++) {<a name="line.3766"></a>
+<span class="sourceLineNo">3767</span>      qualifiers[i] = Bytes.toBytes("qual" + i);<a name="line.3767"></a>
+<span class="sourceLineNo">3768</span>    }<a name="line.3768"></a>
+<span class="sourceLineNo">3769</span><a name="line.3769"></a>
+<span class="sourceLineNo">3770</span><a name="line.3770"></a>
+<span class="sourceLineNo">3771</span>    // This test flushes constantly and can cause many files to be created,<a name="line.3771"></a>
+<span class="sourceLineNo">3772</span>    // possibly<a name="line.3772"></a>
+<span class="sourceLineNo">3773</span>    // extending over the ulimit. Make sure compactions are aggressive in<a name="line.3773"></a>
+<span class="sourceLineNo">3774</span>    // reducing<a name="line.3774"></a>
+<span class="sourceLineNo">3775</span>    // the number of HFiles created.<a name="line.3775"></a>
+<span class="sourceLineNo">3776</span>    Configuration conf = HBaseConfiguration.create(CONF);<a name="line.3776"></a>
+<span class="sourceLineNo">3777</span>    conf.setInt("hbase.hstore.compaction.min", 1);<a name="line.3777"></a>
+<span class="sourceLineNo">3778</span>    conf.setInt("hbase.hstore.compaction.max", 1000);<a name="line.3778"></a>
+<span class="sourceLineNo">3779</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.3779"></a>
+<span class="sourceLineNo">3780</span>    PutThread putThread = null;<a name="line.3780"></a>
+<span class="sourceLineNo">3781</span>    MultithreadedTestUtil.TestContext ctx = new MultithreadedTestUtil.TestContext(conf);<a name="line.3781"></a>
+<span class="sourceLineNo">3782</span>    try {<a name="line.3782"></a>
+<span class="sourceLineNo">3783</span>      putThread = new PutThread(numRows, families, qualifiers);<a name="line.3783"></a>
+<span class="sourceLineNo">3784</span>      putThread.start();<a name="line.3784"></a>
+<span class="sourceLineNo">3785</span>      putThread.waitForFirstPut();<a name="line.3785"></a>
+<span class="sourceLineNo">3786</span><a name="line.3786"></a>
+<span class="sourceLineNo">3787</span>      // Add a thread that flushes as fast as possible<a name="line.3787"></a>
+<span class="sourceLineNo">3788</span>      ctx.addThread(new RepeatingTestThread(ctx) {<a name="line.3788"></a>
+<span class="sourceLineNo">3789</span><a name="line.3789"></a>
+<span class="sourceLineNo">3790</span>        @Override<a name="line.3790"></a>
+<span class="sourceLineNo">3791</span>        public void doAnAction() throws Exception {<a name="line.3791"></a>
+<span class="sourceLineNo">3792</span>          region.flush(true);<a name="line.3792"></a>
+<span class="sourceLineNo">3793</span>          // Compact regularly to avoid creating too many files and exceeding<a name="line.3793"></a>
+<span class="sourceLineNo">3794</span>          // the ulimit.<a name="line.3794"></a>
+<span class="sourceLineNo">3795</span>          region.compact(false);<a name="line.3795"></a>
+<span class="sourceLineNo">3796</span>          for (HStore store : region.getStores()) {<a name="line.3796"></a>
+<span class="sourceLineNo">3797</span>            store.closeAndArchiveCompactedFiles();<a name="line.3797"></a>
+<span class="sourceLineNo">3798</span>          }<a name="line.3798"></a>
+<span class="sourceLineNo">3799</span>        }<a name="line.3799"></a>
+<span class="sourceLineNo">3800</span>      });<a name="line.3800"></a>
+<span class="sourceLineNo">3801</span>      ctx.startThreads();<a name="line.3801"></a>
+<span class="sourceLineNo">3802</span><a name="line.3802"></a>
+<span class="sourceLineNo">3803</span>      Get get = new Get(Bytes.toBytes("row0"));<a name="line.3803"></a>
+<span class="sourceLineNo">3804</span>      Result result = null;<a name="line.3804"></a>
+<span class="sourceLineNo">3805</span><a name="line.3805"></a>
+<span class="sourceLineNo">3806</span>      int expectedCount = numFamilies * numQualifiers;<a name="line.3806"></a>
+<span class="sourceLineNo">3807</span><a name="line.3807"></a>
+<span class="sourceLineNo">3808</span>      long prevTimestamp = 0L;<a name="line.3808"></a>
+<span class="sourceLineNo">3809</span>      for (int i = 0; i &lt; testCount; i++) {<a name="line.3809"></a>
+<span class="sourceLineNo">3810</span>        LOG.info("testWritesWhileGetting verify turn " + i);<a name="line.3810"></a>
+<span class="sourceLineNo">3811</span>        boolean previousEmpty = result == null || result.isEmpty();<a name="line.3811"></a>
+<span class="sourceLineNo">3812</span>        result = region.get(get);<a name="line.3812"></a>
+<span class="sourceLineNo">3813</span>        if (!result.isEmpty() || !previousEmpty || i &gt; compactInterval) {<a name="line.3813"></a>
+<span class="sourceLineNo">3814</span>          assertEquals("i=" + i, expectedCount, result.size());<a name="line.3814"></a>
+<span class="sourceLineNo">3815</span>          // TODO this was removed, now what dangit?!<a name="line.3815"></a>
+<span class="sourceLineNo">3816</span>          // search looking for the qualifier in question?<a name="line.3816"></a>
+<span class="sourceLineNo">3817</span>          long timestamp = 0;<a name="line.3817"></a>
 <span class="sourceLineNo">3818</span>          for (Cell kv : result.rawCells()) {<a name="line.3818"></a>
-<span class="sourceLineNo">3819</span>            byte[] thisValue = CellUtil.cloneValue(kv);<a name="line.3819"></a>
-<span class="sourceLineNo">3820</span>            if (previousKV != null) {<a name="line.3820"></a>
-<span class="sourceLineNo">3821</span>              if (Bytes.compareTo(CellUtil.cloneValue(previousKV), thisValue) != 0) {<a name="line.3821"></a>
-<span class="sourceLineNo">3822</span>                LOG.warn("These two KV should have the same value." + " Previous KV:" + previousKV<a name="line.3822"></a>
-<span class="sourceLineNo">3823</span>                    + "(memStoreTS:" + previousKV.getSequenceId() + ")" + ", New KV: " + kv<a name="line.3823"></a>
-<span class="sourceLineNo">3824</span>                    + "(memStoreTS:" + kv.getSequenceId() + ")");<a name="line.3824"></a>
-<span class="sourceLineNo">3825</span>                assertEquals(0, Bytes.compareTo(CellUtil.cloneValue(previousKV), thisValue));<a name="line.3825"></a>
-<span class="sourceLineNo">3826</span>              }<a name="line.3826"></a>
-<span class="sourceLineNo">3827</span>            }<a name="line.3827"></a>
-<span class="sourceLineNo">3828</span>            previousKV = kv;<a name="line.3828"></a>
-<span class="sourceLineNo">3829</span>          }<a name="line.3829"></a>
-<span class="sourceLineNo">3830</span>        }<a name="line.3830"></a>
-<span class="sourceLineNo">3831</span>      }<a name="line.3831"></a>
-<span class="sourceLineNo">3832</span>    } finally {<a name="line.3832"></a>
-<span class="sourceLineNo">3833</span>      if (putThread != null)<a name="line.3833"></a>
-<span class="sourceLineNo">3834</span>        putThread.done();<a name="line.3834"></a>
-<span class="sourceLineNo">3835</span><a name="line.3835"></a>
-<span class="sourceLineNo">3836</span>      region.flush(true);<a name="line.3836"></a>
-<span class="sourceLineNo">3837</span><a name="line.3837"></a>
-<span class="sourceLineNo">3838</span>      if (putThread != null) {<a name="line.3838"></a>
-<span class="sourceLineNo">3839</span>        putThread.join();<a name="line.3839"></a>
-<span class="sourceLineNo">3840</span>        putThread.checkNoError();<a name="line.3840"></a>
+<span class="sourceLineNo">3819</span>            if (CellUtil.matchingFamily(kv, families[0])<a name="line.3819"></a>
+<span class="sourceLineNo">3820</span>                &amp;&amp; CellUtil.matchingQualifier(kv, qualifiers[0])) {<a name="line.3820"></a>
+<span class="sourceLineNo">3821</span>              timestamp = kv.getTimestamp();<a name="line.3821"></a>
+<span class="sourceLineNo">3822</span>            }<a name="line.3822"></a>
+<span class="sourceLineNo">3823</span>          }<a name="line.3823"></a>
+<span class="sourceLineNo">3824</span>          assertTrue(timestamp &gt;= prevTimestamp);<a name="line.3824"></a>
+<span class="sourceLineNo">3825</span>          prevTimestamp = timestamp;<a name="line.3825"></a>
+<span class="sourceLineNo">3826</span>          Cell previousKV = null;<a name="line.3826"></a>
+<span class="sourceLineNo">3827</span><a name="line.3827"></a>
+<span class="sourceLineNo">3828</span>          for (Cell kv : result.rawCells()) {<a name="line.3828"></a>
+<span class="sourceLineNo">3829</span>            byte[] thisValue = CellUtil.cloneValue(kv);<a name="line.3829"></a>
+<span class="sourceLineNo">3830</span>            if (previousKV != null) {<a name="line.3830"></a>
+<span class="sourceLineNo">3831</span>              if (Bytes.compareTo(CellUtil.cloneValue(previousKV), thisValue) != 0) {<a name="line.3831"></a>
+<span class="sourceLineNo">3832</span>                LOG.warn("These two KV should have the same value." + " Previous KV:" + previousKV<a name="line.3832"></a>
+<span class="sourceLineNo">3833</span>                    + "(memStoreTS:" + previousKV.getSequenceId() + ")" + ", New KV: " + kv<a name="line.3833"></a>
+<span class="sourceLineNo">3834</span>                    + "(memStoreTS:" + kv.getSequenceId() + ")");<a name="line.3834"></a>
+<span class="sourceLineNo">3835</span>                assertEquals(0, Bytes.compareTo(CellUtil.cloneValue(previousKV), thisValue));<a name="line.3835"></a>
+<span class="sourceLineNo">3836</span>              }<a name="line.3836"></a>
+<span class="sourceLineNo">3837</span>            }<a name="line.3837"></a>
+<span class="sourceLineNo">3838</span>            previousKV = kv;<a name="line.3838"></a>
+<span class="sourceLineNo">3839</span>          }<a name="line.3839"></a>
+<span class="sourceLineNo">3840</span>        }<a name="line.3840"></a>
 <span class="sourceLineNo">3841</span>      }<a name="line.3841"></a>
-<span class="sourceLineNo">3842</span><a name="line.3842"></a>
-<span class="sourceLineNo">3843</span>      ctx.stop();<a name="line.3843"></a>
-<span class="sourceLineNo">3844</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.3844"></a>
-<span class="sourceLineNo">3845</span>      this.region = null;<a name="line.3845"></a>
-<span class="sourceLineNo">3846</span>    }<a name="line.3846"></a>
-<span class="sourceLineNo">3847</span>  }<a name="line.3847"></a>
-<span class="sourceLineNo">3848</span><a name="line.3848"></a>
-<span class="sourceLineNo">3849</span>  @Test<a name="line.3849"></a>
-<span class="sourceLineNo">3850</span>  public void testHolesInMeta() throws Exception {<a name="line.3850"></a>
-<span class="sourceLineNo">3851</span>    byte[] family = Bytes.toBytes("family");<a name="line.3851"></a>
-<span class="sourceLineNo">3852</span>    this.region = initHRegion(tableName, Bytes.toBytes("x"), Bytes.toBytes("z"), method, CONF,<a name="line.3852"></a>
-<span class="sourceLineNo">3853</span>        false, family);<a name="line.3853"></a>
-<span class="sourceLineNo">3854</span>    byte[] rowNotServed = Bytes.toBytes("a");<a name="line.3854"></a>
-<span class="sourceLineNo">3855</span>    Get g = new Get(rowNotServed);<a name="line.3855"></a>
-<span class="sourceLineNo">3856</span>    try {<a name="line.3856"></a>
-<span class="sourceLineNo">3857</span>      region.get(g);<a name="line.3857"></a>
-<span class="sourceLineNo">3858</span>      fail();<a name="line.3858"></a>
-<span class="sourceLineNo">3859</span>    } catch (WrongRegionException x) {<a name="line.3859"></a>
-<span class="sourceLineNo">3860</span>      // OK<a name="line.3860"></a>
-<span class="sourceLineNo">3861</span>    }<a name="line.3861"></a>
-<span class="sourceLineNo">3862</span>    byte[] row = Bytes.toBytes("y");<a name="line.3862"></a>
-<span class="sourceLineNo">3863</span>    g = new Get(row);<a name="line.3863"></a>
-<span class="sourceLineNo">3864</span>    region.get(g);<a name="line.3864"></a>
-<span class="sourceLineNo">3865</span>  }<a name="line.3865"></a>
-<span class="sourceLineNo">3866</span><a name="line.3866"></a>
-<span class="sourceLineNo">3867</span>  @Test<a name="line.3867"></a>
-<span class="sourceLineNo">3868</span>  public void testIndexesScanWithOneDeletedRow() throws IOException {<a name="line.3868"></a>
-<span class="sourceLineNo">3869</span>    byte[] family = Bytes.toBytes("family");<a name="line.3869"></a>
-<span class="sourceLineNo">3870</span><a name="line.3870"></a>
-<span class="sourceLineNo">3871</span>    // Setting up region<a name="line.3871"></a>
-<span class="sourceLineNo">3872</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.3872"></a>
-<span class="sourceLineNo">3873</span>    Put put = new Put(Bytes.toBytes(1L));<a name="line.3873"></a>
-<span class="sourceLineNo">3874</span>    put.addColumn(family, qual1, 1L, Bytes.toBytes(1L));<a name="line.3874"></a>
-<span class="sourceLineNo">3875</span>    region.put(put);<a name="line.3875"></a>
+<span class="sourceLineNo">3842</span>    } finally {<a name="line.3842"></a>
+<span class="sourceLineNo">3843</span>      if (putThread != null)<a name="line.3843"></a>
+<span class="sourceLineNo">3844</span>        putThread.done();<a name="line.3844"></a>
+<span class="sourceLineNo">3845</span><a name="line.3845"></a>
+<span class="sourceLineNo">3846</span>      region.flush(true);<a name="line.3846"></a>
+<span class="sourceLineNo">3847</span><a name="line.3847"></a>
+<span class="sourceLineNo">3848</span>      if (putThread != null) {<a name="line.3848"></a>
+<span class="sourceLineNo">3849</span>        putThread.join();<a name="line.3849"></a>
+<span class="sourceLineNo">3850</span>        putThread.checkNoError();<a name="line.3850"></a>
+<span class="sourceLineNo">3851</span>      }<a name="line.3851"></a>
+<span class="sourceLineNo">3852</span><a name="line.3852"></a>
+<span class="sourceLineNo">3853</span>      ctx.stop();<a name="line.3853"></a>
+<span class="sourceLineNo">3854</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.3854"></a>
+<span class="sourceLineNo">3855</span>      this.region = null;<a name="line.3855"></a>
+<span class="sourceLineNo">3856</span>    }<a name="line.3856"></a>
+<span class="sourceLineNo">3857</span>  }<a name="line.3857"></a>
+<span class="sourceLineNo">3858</span><a name="line.3858"></a>
+<span class="sourceLineNo">3859</span>  @Test<a name="line.3859"></a>
+<span class="sourceLineNo">3860</span>  public void testHolesInMeta() throws Exception {<a name="line.3860"></a>
+<span class="sourceLineNo">3861</span>    byte[] family = Bytes.toBytes("family");<a name="line.3861"></a>
+<span class="sourceLineNo">3862</span>    this.region = initHRegion(tableName, Bytes.toBytes("x"), Bytes.toBytes("z"), method, CONF,<a name="line.3862"></a>
+<span class="sourceLineNo">3863</span>        false, family);<a name="line.3863"></a>
+<span class="sourceLineNo">3864</span>    byte[] rowNotServed = Bytes.toBytes("a");<a name="line.3864"></a>
+<span class="sourceLineNo">3865</span>    Get g = new Get(rowNotServed);<a name="line.3865"></a>
+<span class="sourceLineNo">3866</span>    try {<a name="line.3866"></a>
+<span class="sourceLineNo">3867</span>      region.get(g);<a name="line.3867"></a>
+<span class="sourceLineNo">3868</span>      fail();<a name="line.3868"></a>
+<span class="sourceLineNo">3869</span>    } catch (WrongRegionException x) {<a name="line.3869"></a>
+<span class="sourceLineNo">3870</span>      // OK<a name="line.3870"></a>
+<span class="sourceLineNo">3871</span>    }<a name="line.3871"></a>
+<span class="sourceLineNo">3872</span>    byte[] row = Bytes.toBytes("y");<a name="line.3872"></a>
+<span class="sourceLineNo">3873</span>    g = new Get(row);<a name="line.3873"></a>
+<span class="sourceLineNo">3874</span>    region.get(g);<a name="line.3874"></a>
+<span class="sourceLineNo">3875</span>  }<a name="line.3875"></a>
 <span class="sourceLineNo">3876</span><a name="line.3876"></a>
-<span class="sourceLineNo">3877</span>    region.flush(true);<a name="line.3877"></a>
-<span class="sourceLineNo">3878</span><a name="line.3878"></a>
-<span class="sourceLineNo">3879</span>    Delete delete = new Delete(Bytes.toBytes(1L), 1L);<a name="line.3879"></a>
-<span class="sourceLineNo">3880</span>    region.delete(delete);<a name="line.3880"></a>
-<span class="sourceLineNo">3881</span><a name="line.3881"></a>
-<span class="sourceLineNo">3882</span>    put = new Put(Bytes.toBytes(2L));<a name="line.3882"></a>
-<span class="sourceLineNo">3883</span>    put.addColumn(family, qual1, 2L, Bytes.toBytes(2L));<a name="line.3883"></a>
-<span class="sourceLineNo">3884</span>    region.put(put);<a name="line.3884"></a>
-<span class="sourceLineNo">3885</span><a name="line.3885"></a>
-<span class="sourceLineNo">3886</span>    Scan idxScan = new Scan();<a name="line.3886"></a>
-<span class="sourceLineNo">3887</span>    idxScan.addFamily(family);<a name="line.3887"></a>
-<span class="sourceLineNo">3888</span>    idxScan.setFilter(new FilterList(FilterList.Operator.MUST_PASS_ALL, Arrays.&lt;Filter&gt; asList(<a name="line.3888"></a>
-<span class="sourceLineNo">3889</span>        new SingleColumnValueFilter(family, qual1, CompareOperator.GREATER_OR_EQUAL,<a name="line.3889"></a>
-<span class="sourceLineNo">3890</span>            new BinaryComparator(Bytes.toBytes(0L))), new SingleColumnValueFilter(family, qual1,<a name="line.3890"></a>
-<span class="sourceLineNo">3891</span>                    CompareOperator.LESS_OR_EQUAL, new BinaryComparator(Bytes.toBytes(3L))))));<a name="line.3891"></a>
-<span class="sourceLineNo">3892</span>    InternalScanner scanner = region.getScanner(idxScan);<a name="line.3892"></a>
-<span class="sourceLineNo">3893</span>    List&lt;Cell&gt; res = new ArrayList&lt;&gt;();<a name="line.3893"></a>
-<span class="sourceLineNo">3894</span><a name="line.3894"></a>
-<span class="sourceLineNo">3895</span>    while (scanner.next(res)) {<a name="line.3895"></a>
-<span class="sourceLineNo">3896</span>      // Ignore res value.<a name="line.3896"></a>
-<span class="sourceLineNo">3897</span>    }<a name="line.3897"></a>
-<span class="sourceLineNo">3898</span>    assertEquals(1L, res.size());<a name="line.3898"></a>
-<span class="sourceLineNo">3899</span>  }<a name="line.3899"></a>
-<span class="sourceLineNo">3900</span><a name="line.3900"></a>
-<span class="sourceLineNo">3901</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.3901"></a>
-<span class="sourceLineNo">3902</span>  // Bloom filter test<a name="line.3902"></a>
-<span class="sourceLineNo">3903</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.3903"></a>
-<span class="sourceLineNo">3904</span>  @Test<a name="line.3904"></a>
-<span class="sourceLineNo">3905</span>  public void testBloomFilterSize() throws IOException {<a name="line.3905"></a>
-<span class="sourceLineNo">3906</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.3906"></a>
-<span class="sourceLineNo">3907</span>    byte[] qf1 = Bytes.toBytes("col");<a name="line.3907"></a>
-<span class="sourceLineNo">3908</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.3908"></a>
-<span class="sourceLineNo">3909</span>    // Create Table<a name="line.3909"></a>
-<span class="sourceLineNo">3910</span>    HColumnDescriptor hcd = new HColumnDescriptor(fam1).setMaxVersions(Integer.MAX_VALUE)<a name="line.3910"></a>
-<span class="sourceLineNo">3911</span>        .setBloomFilterType(BloomType.ROWCOL);<a name="line.3911"></a>
-<span class="sourceLineNo">3912</span><a name="line.3912"></a>
-<span class="sourceLineNo">3913</span>    HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.3913"></a>
-<span class="sourceLineNo">3914</span>    htd.addFamily(hcd);<a name="line.3914"></a>
-<span class="sourceLineNo">3915</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.3915"></a>
-<span class="sourceLineNo">3916</span>    this.region = TEST_UTIL.createLocalHRegion(info, htd);<a name="line.3916"></a>
-<span class="sourceLineNo">3917</span>    int num_unique_rows = 10;<a name="line.3917"></a>
-<span class="sourceLineNo">3918</span>    int duplicate_multiplier = 2;<a name="line.3918"></a>
-<span class="sourceLineNo">3919</span>    int num_storefiles = 4;<a name="line.3919"></a>
-<span class="sourceLineNo">3920</span><a name="line.3920"></a>
-<span class="sourceLineNo">3921</span>    int version = 0;<a name="line.3921"></a>
-<span class="sourceLineNo">3922</span>    for (int f = 0; f &lt; num_storefiles; f++) {<a name="line.3922"></a>
-<span class="sourceLineNo">3923</span>      for (int i = 0; i &lt; duplicate_multiplier; i++) {<a name="line.3923"></a>
-<span class="sourceLineNo">3924</span>        for (int j = 0; j &lt; num_unique_rows; j++) {<a name="line.3924"></a>
-<span class="sourceLineNo">3925</span>          Put put = new Put(Bytes.toBytes("row" + j));<a name="line.3925"></a>
-<span class="sourceLineNo">3926</span>          put.setDurability(Durability.SKIP_WAL);<a name="line.3926"></a>
-<span class="sourceLineNo">3927</span>          long ts = version++;<a name="line.3927"></a>
-<span class="sourceLineNo">3928</span>          put.addColumn(fam1, qf1, ts, val1);<a name="line.3928"></a>
-<span class="sourceLineNo">3929</span>          region.put(put);<a name="line.3929"></a>
-<span class="sourceLineNo">3930</span>        }<a name="line.3930"></a>
-<span class="sourceLineNo">3931</span>      }<a name="line.3931"></a>
-<span class="sourceLineNo">3932</span>      region.flush(true);<a name="line.3932"></a>
-<span class="sourceLineNo">3933</span>    }<a name="line.3933"></a>
-<span class="sourceLineNo">3934</span>    // before compaction<a name="line.3934"></a>
-<span class="sourceLineNo">3935</span>    HStore store = region.getStore(fam1);<a name="line.3935"></a>
-<span class="sourceLineNo">3936</span>    Collection&lt;HStoreFile&gt; storeFiles = store.getStorefiles();<a name="line.3936"></a>
-<span class="sourceLineNo">3937</span>    for (HStoreFile storefile : storeFiles) {<a name="line.3937"></a>
-<span class="sourceLineNo">3938</span>      StoreFileReader reader = storefile.getReader();<a name="line.3938"></a>
-<span class="sourceLineNo">3939</span>      reader.loadFileInfo();<a name="line.3939"></a>
-<span class="sourceLineNo">3940</span>      reader.loadBloomfilter();<a name="line.3940"></a>
-<span class="sourceLineNo">3941</span>      assertEquals(num_unique_rows * duplicate_multiplier, reader.getEntries());<a name="line.3941"></a>
-<span class="sourceLineNo">3942</span>      assertEquals(num_unique_rows, reader.getFilterEntries());<a name="line.3942"></a>
+<span class="sourceLineNo">3877</span>  @Test<a name="line.3877"></a>
+<span class="sourceLineNo">3878</span>  public void testIndexesScanWithOneDeletedRow() throws IOException {<a name="line.3878"></a>
+<span class="sourceLineNo">3879</span>    byte[] family = Bytes.toBytes("family");<a name="line.3879"></a>
+<span class="sourceLineNo">3880</span><a name="line.3880"></a>
+<span class="sourceLineNo">3881</span>    // Setting up region<a name="line.3881"></a>
+<span class="sourceLineNo">3882</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.3882"></a>
+<span class="sourceLineNo">3883</span>    Put put = new Put(Bytes.toBytes(1L));<a name="line.3883"></a>
+<span class="sourceLineNo">3884</span>    put.addColumn(family, qual1, 1L, Bytes.toBytes(1L));<a name="line.3884"></a>
+<span class="sourceLineNo">3885</span>    region.put(put);<a name="line.3885"></a>
+<span class="sourceLineNo">3886</span><a name="line.3886"></a>
+<span class="sourceLineNo">3887</span>    region.flush(true);<a name="line.3887"></a>
+<span class="sourceLineNo">3888</span><a name="line.3888"></a>
+<span class="sourceLineNo">3889</span>    Delete delete = new Delete(Bytes.toBytes(1L), 1L);<a name="line.3889"></a>
+<span class="sourceLineNo">3890</span>    region.delete(delete);<a name="line.3890"></a>
+<span class="sourceLineNo">3891</span><a name="line.3891"></a>
+<span class="sourceLineNo">3892</span>    put = new Put(Bytes.toBytes(2L));<a name="line.3892"></a>
+<span class="sourceLineNo">3893</span>    put.addColumn(family, qual1, 2L, Bytes.toBytes(2L));<a name="line.3893"></a>
+<span class="sourceLineNo">3894</span>    region.put(put);<a name="line.3894"></a>
+<span class="sourceLineNo">3895</span><a name="line.3895"></a>
+<span class="sourceLineNo">3896</span>    Scan idxScan = new Scan();<a name="line.3896"></a>
+<span class="sourceLineNo">3897</span>    idxScan.addFamily(family);<a name="line.3897"></a>
+<span class="sourceLineNo">3898</span>    idxScan.setFilter(new FilterList(FilterList.Operator.MUST_PASS_ALL, Arrays.&lt;Filter&gt; asList(<a name="line.3898"></a>
+<span class="sourceLineNo">3899</span>        new SingleColumnValueFilter(family, qual1, CompareOperator.GREATER_OR_EQUAL,<a name="line.3899"></a>
+<span class="sourceLineNo">3900</span>            new BinaryComparator(Bytes.toBytes(0L))), new SingleColumnValueFilter(family, qual1,<a name="line.3900"></a>
+<span class="sourceLineNo">3901</span>                    CompareOperator.LESS_OR_EQUAL, new BinaryComparator(Bytes.toBytes(3L))))));<a name="line.3901"></a>
+<span class="sourceLineNo">3902</span>    InternalScanner scanner = region.getScanner(idxScan);<a name="line.3902"></a>
+<span class="sourceLineNo">3903</span>    List&lt;Cell&gt; res = new ArrayList&lt;&gt;();<a name="line.3903"></a>
+<span class="sourceLineNo">3904</span><a name="line.3904"></a>
+<span class="sourceLineNo">3905</span>    while (scanner.next(res)) {<a name="line.3905"></a>
+<span class="sourceLineNo">3906</span>      // Ignore res value.<a name="line.3906"></a>
+<span class="sourceLineNo">3907</span>    }<a name="line.3907"></a>
+<span class="sourceLineNo">3908</span>    assertEquals(1L, res.size());<a name="line.3908"></a>
+<span class="sourceLineNo">3909</span>  }<a name="line.3909"></a>
+<span class="sourceLineNo">3910</span><a name="line.3910"></a>
+<span class="sourceLineNo">3911</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.3911"></a>
+<span class="sourceLineNo">3912</span>  // Bloom filter test<a name="line.3912"></a>
+<span class="sourceLineNo">3913</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.3913"></a>
+<span class="sourceLineNo">3914</span>  @Test<a name="line.3914"></a>
+<span class="sourceLineNo">3915</span>  public void testBloomFilterSize() throws IOException {<a name="line.3915"></a>
+<span class="sourceLineNo">3916</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.3916"></a>
+<span class="sourceLineNo">3917</span>    byte[] qf1 = Bytes.toBytes("col");<a name="line.3917"></a>
+<span class="sourceLineNo">3918</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.3918"></a>
+<span class="sourceLineNo">3919</span>    // Create Table<a name="line.3919"></a>
+<span class="sourceLineNo">3920</span>    HColumnDescriptor hcd = new HColumnDescriptor(fam1).setMaxVersions(Integer.MAX_VALUE)<a name="line.3920"></a>
+<span class="sourceLineNo">3921</span>        .setBloomFilterType(BloomType.ROWCOL);<a name="line.3921"></a>
+<span class="sourceLineNo">3922</span><a name="line.3922"></a>
+<span class="sourceLineNo">3923</span>    HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.3923"></a>
+<span class="sourceLineNo">3924</span>    htd.addFamily(hcd);<a name="line.3924"></a>
+<span class="sourceLineNo">3925</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.3925"></a>
+<span class="sourceLineNo">3926</span>    this.region = TEST_UTIL.createLocalHRegion(info, htd);<a name="line.3926"></a>
+<span class="sourceLineNo">3927</span>    int num_unique_rows = 10;<a name="line.3927"></a>
+<span class="sourceLineNo">3928</span>    int duplicate_multiplier = 2;<a name="line.3928"></a>
+<span class="sourceLineNo">3929</span>    int num_storefiles = 4;<a name="line.3929"></a>
+<span class="sourceLineNo">3930</span><a name="line.3930"></a>
+<span class="sourceLineNo">3931</span>    int version = 0;<a name="line.3931"></a>
+<span class="sourceLineNo">3932</span>    for (int f = 0; f &lt; num_storefiles; f++) {<a name="line.3932"></a>
+<span class="sourceLineNo">3933</span>      for (int i = 0; i &lt; duplicate_multiplier; i++) {<a name="line.3933"></a>
+<span class="sourceLineNo">3934</span>        for (int j = 0; j &lt; num_unique_rows; j++) {<a name="line.3934"></a>
+<span class="sourceLineNo">3935</span>          Put put = new Put(Bytes.toBytes("row" + j));<a name="line.3935"></a>
+<span class="sourceLineNo">3936</span>          put.setDurability(Durability.SKIP_WAL);<a name="line.3936"></a>
+<span class="sourceLineNo">3937</span>          long ts = version++;<a name="line.3937"></a>
+<span class="sourceLineNo">3938</span>          put.addColumn(fam1, qf1, ts, val1);<a name="line.3938"></a>
+<span class="sourceLineNo">3939</span>          region.put(put);<a name="line.3939"></a>
+<span class="sourceLineNo">3940</span>        }<a name="line.3940"></a>
+<span class="sourceLineNo">3941</span>      }<a name="line.3941"></a>
+<span class="sourceLineNo">3942</span>      region.flush(true);<a name="line.3942"></a>
 <span class="sourceLineNo">3943</span>    }<a name="line.3943"></a>
-<span class="sourceLineNo">3944</span><a name="line.3944"></a>
-<span class="sourceLineNo">3945</span>    region.compact(true);<a name="line.3945"></a>
-<span class="sourceLineNo">3946</span><a name="line.3946"></a>
-<span class="sourceLineNo">3947</span>    // after compaction<a name="line.3947"></a>
-<span class="sourceLineNo">3948</span>    storeFiles = store.getStorefiles();<a name="line.3948"></a>
-<span class="sourceLineNo">3949</span>    for (HStoreFile storefile : storeFiles) {<a name="line.3949"></a>
-<span class="sourceLineNo">3950</span>      StoreFileReader reader = storefile.getReader();<a name="line.3950"></a>
-<span class="sourceLineNo">3951</span>      reader.loadFileInfo();<a name="line.3951"></a>
-<span class="sourceLineNo">3952</span>      reader.loadBloomfilter();<a name="line.3952"></a>
-<span class="sourceLineNo">3953</span>      assertEquals(num_unique_rows * duplicate_multiplier * num_storefiles, reader.getEntries());<a name="line.3953"></a>
-<span class="sourceLineNo">3954</span>      assertEquals(num_unique_rows, reader.getFilterEntries());<a name="line.3954"></a>
-<span class="sourceLineNo">3955</span>    }<a name="line.3955"></a>
-<span class="sourceLineNo">3956</span>  }<a name="line.3956"></a>
-<span class="sourceLineNo">3957</span><a name="line.3957"></a>
-<span class="sourceLineNo">3958</span>  @Test<a name="line.3958"></a>
-<span class="sourceLineNo">3959</span>  public void testAllColumnsWithBloomFilter() throws IOException {<a name="line.3959"></a>
-<span class="sourceLineNo">3960</span>    byte[] TABLE = Bytes.toBytes(name.getMethodName());<a name="line.3960"></a>
-<span class="sourceLineNo">3961</span>    byte[] FAMILY = Bytes.toBytes("family");<a name="line.3961"></a>
-<span class="sourceLineNo">3962</span><a name="line.3962"></a>
-<span class="sourceLineNo">3963</span>    // Create table<a name="line.3963"></a>
-<span class="sourceLineNo">3964</span>    HColumnDescriptor hcd = new HColumnDescriptor(FAMILY).setMaxVersions(Integer.MAX_VALUE)<a name="line.3964"></a>
-<span class="sourceLineNo">3965</span>        .setBloomFilterType(BloomType.ROWCOL);<a name="line.3965"></a>
-<span class="sourceLineNo">3966</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(TABLE));<a name="line.3966"></a>
-<span class="sourceLineNo">3967</span>    htd.addFamily(hcd);<a name="line.3967"></a>
-<span class="sourceLineNo">3968</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.3968"></a>
-<span class="sourceLineNo">3969</span>    this.region = TEST_UTIL.createLocalHRegion(info, htd);<a name="line.3969"></a>
-<span class="sourceLineNo">3970</span>    // For row:0, col:0: insert versions 1 through 5.<a name="line.3970"></a>
-<span class="sourceLineNo">3971</span>    byte[] row = Bytes.toBytes("row:" + 0);<a name="line.3971"></a>
-<span class="sourceLineNo">3972</span>    byte[] column = Bytes.toBytes("column:" + 0);<a name="line.3972"></a>
-<span class="sourceLineNo">3973</span>    Put put = new Put(row);<a name="line.3973"></a>
-<span class="sourceLineNo">3974</span>    put.setDurability(Durability.SKIP_WAL);<a name="line.3974"></a>
-<span class="sourceLineNo">3975</span>    for (long idx = 1; idx &lt;= 4; idx++) {<a name="line.3975"></a>
-<span class="sourceLineNo">3976</span>      put.addColumn(FAMILY, column, idx, Bytes.toBytes("value-version-" + idx));<a name="line.3976"></a>
-<span class="sourceLineNo">3977</span>    }<a name="line.3977"></a>
-<span class="sourceLineNo">3978</span>    region.put(put);<a name="line.3978"></a>
-<span class="sourceLineNo">3979</span><a name="line.3979"></a>
-<span class="sourceLineNo">3980</span>    // Flush<a name="line.3980"></a>
-<span class="sourceLineNo">3981</span>    region.flush(true);<a name="line.3981"></a>
-<span class="sourceLineNo">3982</span><a name="line.3982"></a>
-<span class="sourceLineNo">3983</span>    // Get rows<a name="line.3983"></a>
-<span class="sourceLineNo">3984</span>    Get get = new Get(row);<a name="line.3984"></a>
-<span class="sourceLineNo">3985</span>    get.readAllVersions();<a name="line.3985"></a>
-<span class="sourceLineNo">3986</span>    Cell[] kvs = region.get(get).rawCells();<a name="line.3986"></a>
-<span class="sourceLineNo">3987</span><a name="line.3987"></a>
-<span class="sourceLineNo">3988</span>    // Check if rows are correct<a name="line.3988"></a>
-<span class="sourceLineNo">3989</span>    assertEquals(4, kvs.length);<a name="line.3989"></a>
-<span class="sourceLineNo">3990</span>    checkOneCell(kvs[0], FAMILY, 0, 0, 4);<a name="line.3990"></a>
-<span class="sourceLineNo">3991</span>    checkOneCell(kvs[1], FAMILY, 0, 0, 3);<a name="line.3991"></a>
-<span class="sourceLineNo">3992</span>    checkOneCell(kvs[2], FAMILY, 0, 0, 2);<a name="line.3992"></a>
-<span class="sourceLineNo">3993</span>    checkOneCell(kvs[3], FAMILY, 0, 0, 1);<a name="line.3993"></a>
-<span class="sourceLineNo">3994</span>  }<a name="line.3994"></a>
-<span class="sourceLineNo">3995</span><a name="line.3995"></a>
-<span class="sourceLineNo">3996</span>  /**<a name="line.3996"></a>
-<span class="sourceLineNo">3997</span>   * Testcase to cover bug-fix for HBASE-2823 Ensures correct delete when<a name="line.3997"></a>
-<span class="sourceLineNo">3998</span>   * issuing delete row on columns with bloom filter set to row+col<a name="line.3998"></a>
-<span class="sourceLineNo">3999</span>   * (BloomType.ROWCOL)<a name="line.3999"></a>
-<span class="sourceLineNo">4000</span>   */<a name="line.4000"></a>
-<span class="sourceLineNo">4001</span>  @Test<a name="line.4001"></a>
-<span class="sourceLineNo">4002</span>  public void testDeleteRowWithBloomFilter() throws IOException {<a name="line.4002"></a>
-<span class="sourceLineNo">4003</span>    byte[] familyName = Bytes.toBytes("familyName");<a name="line.4003"></a>
-<span class="sourceLineNo">4004</span><a name="line.4004"></a>
-<span class="sourceLineNo">4005</span>    // Create Table<a name="line.4005"></a>
-<span class="sourceLineNo">4006</span>    HColumnDescriptor hcd = new HColumnDescriptor(familyName).setMaxVersions(Integer.MAX_VALUE)<a name="line.4006"></a>
-<span class="sourceLineNo">4007</span>        .setBloomFilterType(BloomType.ROWCOL);<a name="line.4007"></a>
-<span class="sourceLineNo">4008</span><a name="line.4008"></a>
-<span class="sourceLineNo">4009</span>    HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.4009"></a>
-<span class="sourceLineNo">4010</span>    htd.addFamily(hcd);<a name="line.4010"></a>
-<span class="sourceLineNo">4011</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.4011"></a>
-<span class="sourceLineNo">4012</span>    this.region = TEST_UTIL.createLocalHRegion(info, htd);<a name="line.4012"></a>
-<span class="sourceLineNo">4013</span>    // Insert some data<a name="line.4013"></a>
-<span class="sourceLineNo">4014</span>    byte[] row = Bytes.toBytes("row1");<a name="line.4014"></a>
-<span class="sourceLineNo">4015</span>    byte[] col = Bytes.toBytes("col1");<a name="line.4015"></a>
-<span class="sourceLineNo">4016</span><a name="line.4016"></a>
-<span class="sourceLineNo">4017</span>    Put put = new Put(row);<a name="line.4017"></a>
-<span class="sourceLineNo">4018</span>    put.addColumn(familyName, col, 1, Bytes.toBytes("SomeRandomValue"));<a name="line.4018"></a>
-<span class="sourceLineNo">4019</span>    region.put(put);<a name="line.4019"></a>
-<span class="sourceLineNo">4020</span>    region.flush(true);<a name="line.4020"></a>
-<span class="sourceLineNo">4021</span><a name="line.4021"></a>
-<span class="sourceLineNo">4022</span>    Delete del = new Delete(row);<a name="line.4022"></a>
-<span class="sourceLineNo">4023</span>    region.delete(del);<a name="line.4023"></a>
-<span class="sourceLineNo">4024</span>    region.flush(true);<a name="line.4024"></a>
-<span class="sourceLineNo">4025</span><a name="line.4025"></a>
-<span class="sourceLineNo">4026</span>    // Get remaining rows (should have none)<a name="line.4026"></a>
-<span class="sourceLineNo">4027</span>    Get get = new Get(row);<a name="line.4027"></a>
-<span class="sourceLineNo">4028</span>    get.addColumn(familyName, col);<a name="line.4028"></a>
-<span class="sourceLineNo">4029</span><a name="line.4029"></a>
-<span class="sourceLineNo">4030</span>    Cell[] keyValues = region.get(get).rawCells();<a name="line.4030"></a>
-<span class="sourceLineNo">4031</span>    assertEquals(0, keyValues.length);<a name="line.4031"></a>
-<span class="sourceLineNo">4032</span>  }<a name="line.4032"></a>
-<span class="sourceLineNo">4033</span><a name="line.4033"></a>
-<span class="sourceLineNo">4034</span>  @Test<a name="line.4034"></a>
-<span class="sourceLineNo">4035</span>  public void testgetHDFSBlocksDistribution() throws Exception {<a name="line.4035"></a>
-<span class="sourceLineNo">4036</span>    HBaseTestingUtility htu = new HBaseTestingUtility();<a name="line.4036"></a>
-<span class="sourceLineNo">4037</span>    // Why do we set the block size in this test?  If we set it smaller than the kvs, then we'll<a name="line.4037"></a>
-<span class="sourceLineNo">4038</span>    // break up the file in to more pieces that can be distributed across the three nodes and we<a name="line.4038"></a>
-<span class="sourceLineNo">4039</span>    // won't be able to have the condition this test asserts; that at least one node has<a name="line.4039"></a>
-<span class="sourceLineNo">4040</span>    // a copy of all replicas -- if small block size, then blocks are spread evenly across the<a name="line.4040"></a>
-<span class="sourceLineNo">4041</span>    // the three nodes.  hfilev3 with tags seems to put us over the block size.  St.Ack.<a name="line.4041"></a>
-<span class="sourceLineNo">4042</span>    // final int DEFAULT_BLOCK_SIZE = 1024;<a name="line.4042"></a>
-<span class="sourceLineNo">4043</span>    // htu.getConfiguration().setLong("dfs.blocksize", DEFAULT_BLOCK_SIZE);<a name="line.4043"></a>
-<span class="sourceLineNo">4044</span>    htu.getConfiguration().setInt("dfs.replication", 2);<a name="line.4044"></a>
-<span class="sourceLineNo">4045</span><a name="line.4045"></a>
-<span class="sourceLineNo">4046</span>    // set up a cluster with 3 nodes<a name="line.4046"></a>
-<span class="sourceLineNo">4047</span>    MiniHBaseCluster cluster = null;<a name="line.4047"></a>
-<span class="sourceLineNo">4048</span>    String dataNodeHosts[] = new String[] { "host1", "host2", "host3" };<a name="line.4048"></a>
-<span class="sourceLineNo">4049</span>    int regionServersCount = 3;<a name="line.4049"></a>
-<span class="sourceLineNo">4050</span><a name="line.4050"></a>
-<span class="sourceLineNo">4051</span>    try {<a name="line.4051"></a>
-<span class="sourceLineNo">4052</span>      StartMiniClusterOption option = StartMiniClusterOption.builder()<a name="line.4052"></a>
-<span class="sourceLineNo">4053</span>          .numRegionServers(regionServersCount).dataNodeHosts(dataNodeHosts).build();<a name="line.4053"></a>
-<span class="sourceLineNo">4054</span>      cluster = htu.startMiniCluster(option);<a name="line.4054"></a>
-<span class="sourceLineNo">4055</span>      byte[][] families = { fam1, fam2 };<a name="line.4055"></a>
-<span class="sourceLineNo">4056</span>      Table ht = htu.createTable(tableName, families);<a name="line.4056"></a>
-<span class="sourceLineNo">4057</span><a name="line.4057"></a>
-<span class="sourceLineNo">4058</span>      // Setting up region<a name="line.4058"></a>
-<span class="sourceLineNo">4059</span>      byte row[] = Bytes.toBytes("row1");<a name="line.4059"></a>
-<span class="sourceLineNo">4060</span>      byte col[] = Bytes.toBytes("col1");<a name="line.4060"></a>
-<span class="sourceLineNo">4061</span><a name="line.4061"></a>
-<span class="sourceLineNo">4062</span>      Put put = new Put(row);<a name="line.4062"></a>
-<span class="sourceLineNo">4063</span>      put.addColumn(fam1, col, 1, Bytes.toBytes("test1"));<a name="line.4063"></a>
-<span class="sourceLineNo">4064</span>      put.addColumn(fam2, col, 1, Bytes.toBytes("test2"));<a name="line.4064"></a>
-<span class="sourceLineNo">4065</span>      ht.put(put);<a name="line.4065"></a>
-<span class="sourceLineNo">4066</span><a name="line.4066"></a>
-<span class="sourceLineNo">4067</span>      HRegion firstRegion = htu.getHBaseCluster().getRegions(tableName).get(0);<a name="line.4067"></a>
-<span class="sourceLineNo">4068</span>      firstRegion.flush(true);<a name="line.4068"></a>
-<span class="sourceLineNo">4069</span>      HDFSBlocksDistribution blocksDistribution1 = firstRegion.getHDFSBlocksDistribution();<a name="line.4069"></a>
-<span class="sourceLineNo">4070</span><a name="line.4070"></a>
-<span class="sourceLineNo">4071</span>      // Given the default replication factor is 2 and we have 2 HFiles,<a name="line.4071"></a>
-<span class="sourceLineNo">4072</span>      // we will have total of 4 replica of blocks on 3 datanodes; thus there<a name="line.4072"></a>
-<span class="sourceLineNo">4073</span>      // must be at least one host that have replica for 2 HFiles. That host's<a name="line.4073"></a>
-<span class="sourceLineNo">4074</span>      // weight will be equal to the unique block weight.<a name="line.4074"></a>
-<span class="sourceLineNo">4075</span>      long uniqueBlocksWeight1 = blocksDistribution1.getUniqueBlocksTotalWeight();<a name="line.4075"></a>
-<span class="sourceLineNo">4076</span>      StringBuilder sb = new StringBuilder();<a name="line.4076"></a>
-<span class="sourceLineNo">4077</span>      for (String host: blocksDistribution1.getTopHosts()) {<a name="line.4077"></a>
-<span class="sourceLineNo">4078</span>        if (sb.length() &gt; 0) sb.append(", ");<a name="line.4078"></a>
-<span class="sourceLineNo">4079</span>        sb.append(host);<a name="line.4079"></a>
-<span class="sourceLineNo">4080</span>        sb.append("=");<a name="line.4080"></a>
-<span class="sourceLineNo">4081</span>        sb.append(blocksDistribution1.getWeight(host));<a name="line.4081"></a>
-<span class="sourceLineNo">4082</span>      }<a name="line.4082"></a>
-<span class="sourceLineNo">4083</span><a name="line.4083"></a>
-<span class="sourceLineNo">4084</span>      String topHost = blocksDistribution1.getTopHosts().get(0);<a name="line.4084"></a>
-<span class="sourceLineNo">4085</span>      long topHostWeight = blocksDistribution1.getWeight(topHost);<a name="line.4085"></a>
-<span class="sourceLineNo">4086</span>      String msg = "uniqueBlocksWeight=" + uniqueBlocksWeight1 + ", topHostWeight=" +<a name="line.4086"></a>
-<span class="sourceLineNo">4087</span>        topHostWeight + ", topHost=" + topHost + "; " + sb.toString();<a name="line.4087"></a>
-<span class="sourceLineNo">4088</span>      LOG.info(msg);<a name="line.4088"></a>
-<span class="sourceLineNo">4089</span>      assertTrue(msg, uniqueBlocksWeight1 == topHostWeight);<a name="line.4089"></a>
-<span class="sourceLineNo">4090</span><a name="line.4090"></a>
-<span class="sourceLineNo">4091</span>      // use the static method to compute the value, it should be the same.<a name="line.4091"></a>
-<span class="sourceLineNo">4092</span>      // static method is used by load balancer or other components<a name="line.4092"></a>
-<span class="sourceLineNo">4093</span>      HDFSBlocksDistribution blocksDistribution2 = HRegion.computeHDFSBlocksDistribution(<a name="line.4093"></a>
-<span class="sourceLineNo">4094</span>          htu.getConfiguration(), firstRegion.getTableDescriptor(), firstRegion.getRegionInfo());<a name="line.4094"></a>
-<span class="sourceLineNo">4095</span>      long uniqueBlocksWeight2 = blocksDistribution2.getUniqueBlocksTotalWeight();<a name="line.4095"></a>
-<span class="sourceLineNo">4096</span><a name="line.4096"></a>
-<span class="sourceLineNo">4097</span>      assertTrue(uniqueBlocksWeight1 == uniqueBlocksWeight2);<a name="line.4097"></a>
-<span class="sourceLineNo">4098</span><a name="line.4098"></a>
-<span class="sourceLineNo">4099</span>      ht.close();<a name="line.4099"></a>
-<span class="sourceLineNo">4100</span>    } finally {<a name="line.4100"></a>
-<span class="sourceLineNo">4101</span>      if (cluster != null) {<a name="line.4101"></a>
-<span class="sourceLineNo">4102</span>        htu.shutdownMiniCluster();<a name="line.4102"></a>
-<span class="sourceLineNo">4103</span>      }<a name="line.4103"></a>
-<span class="sourceLineNo">4104</span>    }<a name="line.4104"></a>
-<span class="sourceLineNo">4105</span>  }<a name="line.4105"></a>
+<span class="sourceLineNo">3944</span>    // before compaction<a name="line.3944"></a>
+<span class="sourceLineNo">3945</span>    HStore store = region.getStore(fam1);<a name="line.3945"></a>
+<span class="sourceLineNo">3946</span>    Collection&lt;HStoreFile&gt; storeFiles = store.getStorefiles();<a name="line.3946"></a>
+<span class="sourceLineNo">3947</span>    for (HStoreFile storefile : storeFiles) {<a name="line.3947"></a>
+<span class="sourceLineNo">3948</span>      StoreFileReader reader = storefile.getReader();<a name="line.3948"></a>
+<span class="sourceLineNo">3949</span>      reader.loadFileInfo();<a name="line.3949"></a>
+<span class="sourceLineNo">3950</span>      reader.loadBloomfilter();<a name="line.3950"></a>
+<span class="sourceLineNo">3951</span>      assertEquals(num_unique_rows * duplicate_multiplier, reader.getEntries());<a name="line.3951"></a>
+<span class="sourceLineNo">3952</span>      assertEquals(num_unique_rows, reader.getFilterEntries());<a name="line.3952"></a>
+<span class="sourceLineNo">3953</span>    }<a name="line.3953"></a>
+<span class="sourceLineNo">3954</span><a name="line.3954"></a>
+<span class="sourceLineNo">3955</span>    region.compact(true);<a name="line.3955"></a>
+<span class="sourceLineNo">3956</span><a name="line.3956"></a>
+<span class="sourceLineNo">3957</span>    // after compaction<a name="line.3957"></a>
+<span class="sourceLineNo">3958</span>    storeFiles = store.getStorefiles();<a name="line.3958"></a>
+<span class="sourceLineNo">3959</span>    for (HStoreFile storefile : storeFiles) {<a name="line.3959"></a>
+<span class="sourceLineNo">3960</span>      StoreFileReader reader = storefile.getReader();<a name="line.3960"></a>
+<span class="sourceLineNo">3961</span>      reader.loadFileInfo();<a name="line.3961"></a>
+<span class="sourceLineNo">3962</span>      reader.loadBloomfilter();<a name="line.3962"></a>
+<span class="sourceLineNo">3963</span>      assertEquals(num_unique_rows * duplicate_multiplier * num_storefiles, reader.getEntries());<a name="line.3963"></a>
+<span class="sourceLineNo">3964</span>      assertEquals(num_unique_rows, reader.getFilterEntries());<a name="line.3964"></a>
+<span class="sourceLineNo">3965</span>    }<a name="line.3965"></a>
+<span class="sourceLineNo">3966</span>  }<a name="line.3966"></a>
+<span class="sourceLineNo">3967</span><a name="line.3967"></a>
+<span class="sourceLineNo">3968</span>  @Test<a name="line.3968"></a>
+<span class="sourceLineNo">3969</span>  public void testAllColumnsWithBloomFilter() throws IOException {<a name="line.3969"></a>
+<span class="sourceLineNo">3970</span>    byte[] TABLE = Bytes.toBytes(name.getMethodName());<a name="line.3970"></a>
+<span class="sourceLineNo">3971</span>    byte[] FAMILY = Bytes.toBytes("family");<a name="line.3971"></a>
+<span class="sourceLineNo">3972</span><a name="line.3972"></a>
+<span class="sourceLineNo">3973</span>    // Create table<a name="line.3973"></a>
+<span class="sourceLineNo">3974</span>    HColumnDescriptor hcd = new HColumnDescriptor(FAMILY).setMaxVersions(Integer.MAX_VALUE)<a name="line.3974"></a>
+<span class="sourceLineNo">3975</span>        .setBloomFilterType(BloomType.ROWCOL);<a name="line.3975"></a>
+<span class="sourceLineNo">3976</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(TABLE));<a name="line.3976"></a>
+<span class="sourceLineNo">3977</span>    htd.addFamily(hcd);<a name="line.3977"></a>
+<span class="sourceLineNo">3978</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.3978"></a>
+<span class="sourceLineNo">3979</span>    this.region = TEST_UTIL.createLocalHRegion(info, htd);<a name="line.3979"></a>
+<span class="sourceLineNo">3980</span>    // For row:0, col:0: insert versions 1 through 5.<a name="line.3980"></a>
+<span class="sourceLineNo">3981</span>    byte[] row = Bytes.toBytes("row:" + 0);<a name="line.3981"></a>
+<span class="sourceLineNo">3982</span>    byte[] column = Bytes.toBytes("column:" + 0);<a name="line.3982"></a>
+<span class="sourceLineNo">3983</span>    Put put = new Put(row);<a name="line.3983"></a>
+<span class="sourceLineNo">3984</span>    put.setDurability(Durability.SKIP_WAL);<a name="line.3984"></a>
+<span class="sourceLineNo">3985</span>    for (long idx = 1; idx &lt;= 4; idx++) {<a name="line.3985"></a>
+<span class="sourceLineNo">3986</span>      put.addColumn(FAMILY, column, idx, Bytes.toBytes("value-version-" + idx));<a name="line.3986"></a>
+<span class="sourceLineNo">3987</span>    }<a name="line.3987"></a>
+<span class="sourceLineNo">3988</span>    region.put(put);<a name="line.3988"></a>
+<span class="sourceLineNo">3989</span><a name="line.3989"></a>
+<span class="sourceLineNo">3990</span>    // Flush<a name="line.3990"></a>
+<span class="sourceLineNo">3991</span>    region.flush(true);<a name="line.3991"></a>
+<span class="sourceLineNo">3992</span><a name="line.3992"></a>
+<span class="sourceLineNo">3993</span>    // Get rows<a name="line.3993"></a>
+<span class="sourceLineNo">3994</span>    Get get = new Get(row);<a name="line.3994"></a>
+<span class="sourceLineNo">3995</span>    get.readAllVersions();<a name="line.3995"></a>
+<span class="sourceLineNo">3996</span>    Cell[] kvs = region.get(get).rawCells();<a name="line.3996"></a>
+<span class="sourceLineNo">3997</span><a name="line.3997"></a>
+<span class="sourceLineNo">3998</span>    // Check if rows are correct<a name="line.3998"></a>
+<span class="sourceLineNo">3999</span>    assertEquals(4, kvs.length);<a name="line.3999"></a>
+<span class="sourceLineNo">4000</span>    checkOneCell(kvs[0], FAMILY, 0, 0, 4);<a name="line.4000"></a>
+<span class="sourceLineNo">4001</span>    checkOneCell(kvs[1], FAMILY, 0, 0, 3);<a name="line.4001"></a>
+<span class="sourceLineNo">4002</span>    checkOneCell(kvs[2], FAMILY, 0, 0, 2);<a name="line.4002"></a>
+<span class="sourceLineNo">4003</span>    checkOneCell(kvs[3], FAMILY, 0, 0, 1);<a name="line.4003"></a>
+<span class="sourceLineNo">4004</span>  }<a name="line.4004"></a>
+<span class="sourceLineNo">4005</span><a name="line.4005"></a>
+<span class="sourceLineNo">4006</span>  /**<a name="line.4006"></a>
+<span class="sourceLineNo">4007</span>   * Testcase to cover bug-fix for HBASE-2823 Ensures correct delete when<a name="line.4007"></a>
+<span class="sourceLineNo">4008</span>   * issuing delete row on columns with bloom filter set to row+col<a name="line.4008"></a>
+<span class="sourceLineNo">4009</span>   * (BloomType.ROWCOL)<a name="line.4009"></a>
+<span class="sourceLineNo">4010</span>   */<a name="line.4010"></a>
+<span class="sourceLineNo">4011</span>  @Test<a name="line.4011"></a>
+<span class="sourceLineNo">4012</span>  public void testDeleteRowWithBloomFilter() throws IOException {<a name="line.4012"></a>
+<span class="sourceLineNo">4013</span>    byte[] familyName = Bytes.toBytes("familyName");<a name="line.4013"></a>
+<span class="sourceLineNo">4014</span><a name="line.4014"></a>
+<span class="sourceLineNo">4015</span>    // Create Table<a name="line.4015"></a>
+<span class="sourceLineNo">4016</span>    HColumnDescriptor hcd = new HColumnDescriptor(familyName).setMaxVersions(Integer.MAX_VALUE)<a name="line.4016"></a>
+<span class="sourceLineNo">4017</span>        .setBloomFilterType(BloomType.ROWCOL);<a name="line.4017"></a>
+<span class="sourceLineNo">4018</span><a name="line.4018"></a>
+<span class="sourceLineNo">4019</span>    HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.4019"></a>
+<span class="sourceLineNo">4020</span>    htd.addFamily(hcd);<a name="line.4020"></a>
+<span class="sourceLineNo">4021</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.4021"></a>
+<span class="sourceLineNo">4022</span>    this.region = TEST_UTIL.createLocalHRegion(info, htd);<a name="line.4022"></a>
+<span class="sourceLineNo">4023</span>    // Insert some data<a name="line.4023"></a>
+<span class="sourceLineNo">4024</span>    byte[] row = Bytes.toBytes("row1");<a name="line.4024"></a>
+<span class="sourceLineNo">4025</span>    byte[] col = Bytes.toBytes("col1");<a name="line.4025"></a>
+<span class="sourceLineNo">4026</span><a name="line.4026"></a>
+<span class="sourceLineNo">4027</span>    Put put = new Put(row);<a name="line.4027"></a>
+<span class="sourceLineNo">4028</span>    put.addColumn(familyName, col, 1, Bytes.toBytes("SomeRandomValue"));<a name="line.4028"></a>
+<span class="sourceLineNo">4029</span>    region.put(put);<a name="line.4029"></a>
+<span class="sourceLineNo">4030</span>    region.flush(true);<a name="line.4030"></a>
+<span class="sourceLineNo">4031</span><a name="line.4031"></a>
+<span class="sourceLineNo">4032</span>    Delete del = new Delete(row);<a name="line.4032"></a>
+<span class="sourceLineNo">4033</span>    region.delete(del);<a name="line.4033"></a>
+<span class="sourceLineNo">4034</span>    region.flush(true);<a name="line.4034"></a>
+<span class="sourceLineNo">4035</span><a name="line.4035"></a>
+<span class="sourceLineNo">4036</span>    // Get remaining rows (should have none)<a name="line.4036"></a>
+<span class="sourceLineNo">4037</span>    Get get = new Get(row);<a name="line.4037"></a>
+<span class="sourceLineNo">4038</span>    get.addColumn(familyName, col);<a name="line.4038"></a>
+<span class="sourceLineNo">4039</span><a name="line.4039"></a>
+<span class="sourceLineNo">4040</span>    Cell[] keyValues = region.get(get).rawCells();<a name="line.4040"></a>
+<span class="sourceLineNo">4041</span>    assertEquals(0, keyValues.length);<a name="line.4041"></a>
+<span class="sourceLineNo">4042</span>  }<a name="line.4042"></a>
+<span class="sourceLineNo">4043</span><a name="line.4043"></a>
+<span class="sourceLineNo">4044</span>  @Test<a name="line.4044"></a>
+<span class="sourceLineNo">4045</span>  public void testgetHDFSBlocksDistribution() throws Exception {<a name="line.4045"></a>
+<span class="sourceLineNo">4046</span>    HBaseTestingUtility htu = new HBaseTestingUtility();<a name="line.4046"></a>
+<span class="sourceLineNo">4047</span>    // Why do we set the block size in this test?  If we set it smaller than the kvs, then we'll<a name="line.4047"></a>
+<span class="sourceLineNo">4048</span>    // break up the file in to more pieces that can be distributed across the three nodes and we<a name="line.4048"></a>
+<span class="sourceLineNo">4049</span>    // won't be able to have the condition this test asserts; that at least one node has<a name="line.4049"></a>
+<span class="sourceLineNo">4050</span>    // a copy of all replicas -- if small block size, then blocks are spread evenly across the<a name="line.4050"></a>
+<span class="sourceLineNo">4051</span>    // the three nodes.  hfilev3 with tags seems to put us over the block size.  St.Ack.<a name="line.4051"></a>
+<span class="sourceLineNo">4052</span>    // final int DEFAULT_BLOCK_SIZE = 1024;<a name="line.4052"></a>
+<span class="sourceLineNo">4053</span>    // htu.getConfiguration().setLong("dfs.blocksize", DEFAULT_BLOCK_SIZE);<a name="line.4053"></a>
+<span class="sourceLineNo">4054</span>    htu.getConfiguration().setInt("dfs.replication", 2);<a name="line.4054"></a>
+<span class="sourceLineNo">4055</span><a name="line.4055"></a>
+<span class="sourceLineNo">4056</span>    // set up a cluster with 3 nodes<a name="line.4056"></a>
+<span class="sourceLineNo">4057</span>    MiniHBaseCluster cluster = null;<a name="line.4057"></a>
+<span class="sourceLineNo">4058</span>    String dataNodeHosts[] = new String[] { "host1", "host2", "host3" };<a name="line.4058"></a>
+<span class="sourceLineNo">4059</span>    int regionServersCount = 3;<a name="line.4059"></a>
+<span class="sourceLineNo">4060</span><a name="line.4060"></a>
+<span class="sourceLineNo">4061</span>    try {<a name="line.4061"></a>
+<span class="sourceLineNo">4062</span>      StartMiniClusterOption option = StartMiniClusterOption.builder()<a name="line.4062"></a>
+<span class="sourceLineNo">4063</span>          .numRegionServers(regionServersCount).dataNodeHosts(dataNodeHosts).build();<a name="line.4063"></a>
+<span class="sourceLineNo">4064</span>      cluster = htu.startMiniCluster(option);<a name="line.4064"></a>
+<span class="sourceLineNo">4065</span>      byte[][] families = { fam1, fam2 };<a name="line.4065"></a>
+<span class="sourceLineNo">4066</span>      Table ht = htu.createTable(tableName, families);<a name="line.4066"></a>
+<span class="sourceLineNo">4067</span><a name="line.4067"></a>
+<span class="sourceLineNo">4068</span>      // Setting up region<a name="line.4068"></a>
+<span class="sourceLineNo">4069</span>      byte row[] = Bytes.toBytes("row1");<a name="line.4069"></a>
+<span class="sourceLineNo">4070</span>      byte col[] = Bytes.toBytes("col1");<a name="line.4070"></a>
+<span class="sourceLineNo">4071</span><a name="line.4071"></a>
+<span class="sourceLineNo">4072</span>      Put put = new Put(row);<a name="line.4072"></a>
+<span class="sourceLineNo">4073</span>      put.addColumn(fam1, col, 1, Bytes.toBytes("test1"));<a name="line.4073"></a>
+<span class="sourceLineNo">4074</span>      put.addColumn(fam2, col, 1, Bytes.toBytes("test2"));<a name="line.4074"></a>
+<span class="sourceLineNo">4075</span>      ht.put(put);<a name="line.4075"></a>
+<span class="sourceLineNo">4076</span><a name="line.4076"></a>
+<span class="sourceLineNo">4077</span>      HRegion firstRegion = htu.getHBaseCluster().getRegions(tableName).get(0);<a name="line.4077"></a>
+<span class="sourceLineNo">4078</span>      firstRegion.flush(true);<a name="line.4078"></a>
+<span class="sourceLineNo">4079</span>      HDFSBlocksDistribution blocksDistribution1 = firstRegion.getHDFSBlocksDistribution();<a name="line.4079"></a>
+<span class="sourceLineNo">4080</span><a name="line.4080"></a>
+<span class="sourceLineNo">4081</span>      // Given the default replication factor is 2 and we have 2 HFiles,<a name="line.4081"></a>
+<span class="sourceLineNo">4082</span>      // we will have total of 4 replica of blocks on 3 datanodes; thus there<a name="line.4082"></a>
+<span class="sourceLineNo">4083</span>      // must be at least one host that have replica for 2 HFiles. That host's<a name="line.4083"></a>
+<span class="sourceLineNo">4084</span>      // weight will be equal to the unique block weight.<a name="line.4084"></a>
+<span class="sourceLineNo">4085</span>      long uniqueBlocksWeight1 = blocksDistribution1.getUniqueBlocksTotalWeight();<a name="line.4085"></a>
+<span class="sourceLineNo">4086</span>      StringBuilder sb = new StringBuilder();<a name="line.4086"></a>
+<span class="sourceLineNo">4087</span>      for (String host: blocksDistribution1.getTopHosts()) {<a name="line.4087"></a>
+<span class="sourceLineNo">4088</span>        if (sb.length() &gt; 0) sb.append(", ");<a name="line.4088"></a>
+<span class="sourceLineNo">4089</span>        sb.append(host);<a name="line.4089"></a>
+<span class="sourceLineNo">4090</span>        sb.append("=");<a name="line.4090"></a>
+<span class="sourceLineNo">4091</span>        sb.append(blocksDistribution1.getWeight(host));<a name="line.4091"></a>
+<span class="sourceLineNo">4092</span>      }<a name="line.4092"></a>
+<span class="sourceLineNo">4093</span><a name="line.4093"></a>
+<span class="sourceLineNo">4094</span>      String topHost = blocksDistribution1.getTopHosts().get(0);<a name="line.4094"></a>
+<span class="sourceLineNo">4095</span>      long topHostWeight = blocksDistribution1.getWeight(topHost);<a name="line.4095"></a>
+<span class="sourceLineNo">4096</span>      String msg = "uniqueBlocksWeight=" + uniqueBlocksWeight1 + ", topHostWeight=" +<a name="line.4096"></a>
+<span class="sourceLineNo">4097</span>        topHostWeight + ", topHost=" + topHost + "; " + sb.toString();<a name="line.4097"></a>
+<span class="sourceLineNo">4098</span>      LOG.info(msg);<a name="line.4098"></a>
+<span class="sourceLineNo">4099</span>      assertTrue(msg, uniqueBlocksWeight1 == topHostWeight);<a name="line.4099"></a>
+<span class="sourceLineNo">4100</span><a name="line.4100"></a>
+<span class="sourceLineNo">4101</span>      // use the static method to compute the value, it should be the same.<a name="line.4101"></a>
+<span class="sourceLineNo">4102</span>      // static method is used by load balancer or other components<a name="line.4102"></a>
+<span class="sourceLineNo">4103</span>      HDFSBlocksDistribution blocksDistribution2 = HRegion.computeHDFSBlocksDistribution(<a name="line.4103"></a>
+<span class="sourceLineNo">4104</span>          htu.getConfiguration(), firstRegion.getTableDescriptor(), firstRegion.getRegionInfo());<a name="line.4104"></a>
+<span class="sourceLineNo">4105</span>      long uniqueBlocksWeight2 = blocksDistribution2.getUniqueBlocksTotalWeight();<a name="line.4105"></a>
 <span class="sourceLineNo">4106</span><a name="line.4106"></a>
-<span class="sourceLineNo">4107</span>  /**<a name="line.4107"></a>
-<span class="sourceLineNo">4108</span>   * Testcase to check state of region initialization task set to ABORTED or not<a name="line.4108"></a>
-<span class="sourceLineNo">4109</span>   * if any exceptions during initialization<a name="line.4109"></a>
-<span class="sourceLineNo">4110</span>   *<a name="line.4110"></a>
-<span class="sourceLineNo">4111</span>   * @throws Exception<a name="line.4111"></a>
-<span class="sourceLineNo">4112</span>   */<a name="line.4112"></a>
-<span class="sourceLineNo">4113</span>  @Test<a name="line.4113"></a>
-<span class="sourceLineNo">4114</span>  public void testStatusSettingToAbortIfAnyExceptionDuringRegionInitilization() throws Exception {<a name="line.4114"></a>
-<span class="sourceLineNo">4115</span>    HRegionInfo info;<a name="line.4115"></a>
-<span class="sourceLineNo">4116</span>    try {<a name="line.4116"></a>
-<span class="sourceLineNo">4117</span>      FileSystem fs = Mockito.mock(FileSystem.class);<a name="line.4117"></a>
-<span class="sourceLineNo">4118</span>      Mockito.when(fs.exists((Path) Mockito.anyObject())).thenThrow(new IOException());<a name="line.4118"></a>
-<span class="sourceLineNo">4119</span>      HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.4119"></a>
-<span class="sourceLineNo">4120</span>      htd.addFamily(new HColumnDescriptor("cf"));<a name="line.4120"></a>
-<span class="sourceLineNo">4121</span>      info = new HRegionInfo(htd.getTableName(), HConstants.EMPTY_BYTE_ARRAY,<a name="line.4121"></a>
-<span class="sourceLineNo">4122</span>          HConstants.EMPTY_BYTE_ARRAY, false);<a name="line.4122"></a>
-<span class="sourceLineNo">4123</span>      Path path = new Path(dir + "testStatusSettingToAbortIfAnyExceptionDuringRegionInitilization");<a name="line.4123"></a>
-<span class="sourceLineNo">4124</span>      region = HRegion.newHRegion(path, null, fs, CONF, info, htd, null);<a name="line.4124"></a>
-<span class="sourceLineNo">4125</span>      // region initialization throws IOException and set task state to ABORTED.<a name="line.4125"></a>
-<span class="sourceLineNo">4126</span>      region.initialize();<a name="line.4126"></a>
-<span class="sourceLineNo">4127</span>      fail("Region initialization should fail due to IOException");<a name="line.4127"></a>
-<span class="sourceLineNo">4128</span>    } catch (IOException io) {<a name="line.4128"></a>
-<span class="sourceLineNo">4129</span>      List&lt;MonitoredTask&gt; tasks = TaskMonitor.get().getTasks();<a name="line.4129"></a>
-<span class="sourceLineNo">4130</span>      for (MonitoredTask monitoredTask : tasks) {<a name="line.4130"></a>
-<span class="sourceLineNo">4131</span>        if (!(monitoredTask instanceof MonitoredRPCHandler)<a name="line.4131"></a>
-<span class="sourceLineNo">4132</span>            &amp;&amp; monitoredTask.getDescription().contains(region.toString())) {<a name="line.4132"></a>
-<span class="sourceLineNo">4133</span>          assertTrue("Region state should be ABORTED.",<a name="line.4133"></a>
-<span class="sourceLineNo">4134</span>              monitoredTask.getState().equals(MonitoredTask.State.ABORTED));<a name="line.4134"></a>
-<span class="sourceLineNo">4135</span>          break;<a name="line.4135"></a>
-<span class="sourceLineNo">4136</span>        }<a name="line.4136"></a>
-<span class="sourceLineNo">4137</span>      }<a name="line.4137"></a>
-<span class="sourceLineNo">4138</span>    }<a name="line.4138"></a>
-<span class="sourceLineNo">4139</span>  }<a name="line.4139"></a>
-<span class="sourceLineNo">4140</span><a name="line.4140"></a>
-<span class="sourceLineNo">4141</span>  /**<a name="line.4141"></a>
-<span class="sourceLineNo">4142</span>   * Verifies that the .regioninfo file is written on region creation and that<a name="line.4142"></a>
-<span class="sourceLineNo">4143</span>   * is recreated if missing during region opening.<a name="line.4143"></a>
-<span class="sourceLineNo">4144</span>   */<a name="line.4144"></a>
-<span class="sourceLineNo">4145</span>  @Test<a name="line.4145"></a>
-<span class="sourceLineNo">4146</span>  public void testRegionInfoFileCreation() throws IOException {<a name="line.4146"></a>
-<span class="sourceLineNo">4147</span>    Path rootDir = new Path(dir + "testRegionInfoFileCreation");<a name="line.4147"></a>
-<span class="sourceLineNo">4148</span><a name="line.4148"></a>
-<span class="sourceLineNo">4149</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.4149"></a>
-<span class="sourceLineNo">4150</span>    htd.addFamily(new HColumnDescriptor("cf"));<a name="line.4150"></a>
-<span class="sourceLineNo">4151</span><a name="line.4151"></a>
-<span class="sourceLineNo">4152</span>    HRegionInfo hri = new HRegionInfo(htd.getTableName());<a name="line.4152"></a>
-<span class="sourceLineNo">4153</span><a name="line.4153"></a>
-<span class="sourceLineNo">4154</span>    // Create a region and skip the initialization (like CreateTableHandler)<a name="line.4154"></a>
-<span class="sourceLineNo">4155</span>    region = HBaseTestingUtility.createRegionAndWAL(hri, rootDir, CONF, htd, false);<a name="line.4155"></a>
-<span class="sourceLineNo">4156</span>    Path regionDir = region.getRegionFileSystem().getRegionDir();<a name="line.4156"></a>
-<span class="sourceLineNo">4157</span>    FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.4157"></a>
-<span class="sourceLineNo">4158</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.4158"></a>
-<span class="sourceLineNo">4159</span><a name="line.4159"></a>
-<span class="sourceLineNo">4160</span>    Path regionInfoFile = new Path(regionDir, HRegionFileSystem.REGION_INFO_FILE);<a name="line.4160"></a>
+<span class="sourceLineNo">4107</span>      assertTrue(uniqueBlocksWeight1 == uniqueBlocksWeight2);<a name="line.4107"></a>
+<span class="sourceLineNo">4108</span><a name="line.4108"></a>
+<span class="sourceLineNo">4109</span>      ht.close();<a name="line.4109"></a>
+<span class="sourceLineNo">4110</span>    } finally {<a name="line.4110"></a>
+<span class="sourceLineNo">4111</span>      if (cluster != null) {<a name="line.4111"></a>
+<span class="sourceLineNo">4112</span>        htu.shutdownMiniCluster();<a name="line.4112"></a>
+<span class="sourceLineNo">4113</span>      }<a name="line.4113"></a>
+<span class="sourceLineNo">4114</span>    }<a name="line.4114"></a>
+<span class="sourceLineNo">4115</span>  }<a name="line.4115"></a>
+<span class="sourceLineNo">4116</span><a name="line.4116"></a>
+<span class="sourceLineNo">4117</span>  /**<a name="line.4117"></a>
+<span class="sourceLineNo">4118</span>   * Testcase to check state of region initialization task set to ABORTED or not<a name="line.4118"></a>
+<span class="sourceLineNo">4119</span>   * if any exceptions during initialization<a name="line.4119"></a>
+<span class="sourceLineNo">4120</span>   *<a name="line.4120"></a>
+<span class="sourceLineNo">4121</span>   * @throws Exception<a name="line.4121"></a>
+<span class="sourceLineNo">4122</span>   */<a name="line.4122"></a>
+<span class="sourceLineNo">4123</span>  @Test<a name="line.4123"></a>
+<span class="sourceLineNo">4124</span>  public void testStatusSettingToAbortIfAnyExceptionDuringRegionInitilization() throws Exception {<a name="line.4124"></a>
+<span class="sourceLineNo">4125</span>    HRegionInfo info;<a name="line.4125"></a>
+<span class="sourceLineNo">4126</span>    try {<a name="line.4126"></a>
+<span class="sourceLineNo">4127</span>      FileSystem fs = Mockito.mock(FileSystem.class);<a name="line.4127"></a>
+<span class="sourceLineNo">4128</span>      Mockito.when(fs.exists((Path) Mockito.anyObject())).thenThrow(new IOException());<a name="line.4128"></a>
+<span class="sourceLineNo">4129</span>      HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.4129"></a>
+<span class="sourceLineNo">4130</span>      htd.addFamily(new HColumnDescriptor("cf"));<a name="line.4130"></a>
+<span class="sourceLineNo">4131</span>      info = new HRegionInfo(htd.getTableName(), HConstants.EMPTY_BYTE_ARRAY,<a name="line.4131"></a>
+<span class="sourceLineNo">4132</span>          HConstants.EMPTY_BYTE_ARRAY, false);<a name="line.4132"></a>
+<span class="sourceLineNo">4133</span>      Path path = new Path(dir + "testStatusSettingToAbortIfAnyExceptionDuringRegionInitilization");<a name="line.4133"></a>
+<span class="sourceLineNo">4134</span>      region = HRegion.newHRegion(path, null, fs, CONF, info, htd, null);<a name="line.4134"></a>
+<span class="sourceLineNo">4135</span>      // region initialization throws IOException and set task state to ABORTED.<a name="line.4135"></a>
+<span class="sourceLineNo">4136</span>      region.initialize();<a name="line.4136"></a>
+<span class="sourceLineNo">4137</span>      fail("Region initialization should fail due to IOException");<a name="line.4137"></a>
+<span class="sourceLineNo">4138</span>    } catch (IOException io) {<a name="line.4138"></a>
+<span class="sourceLineNo">4139</span>      List&lt;MonitoredTask&gt; tasks = TaskMonitor.get().getTasks();<a name="line.4139"></a>
+<span class="sourceLineNo">4140</span>      for (MonitoredTask monitoredTask : tasks) {<a name="line.4140"></a>
+<span class="sourceLineNo">4141</span>        if (!(monitoredTask instanceof MonitoredRPCHandler)<a name="line.4141"></a>
+<span class="sourceLineNo">4142</span>            &amp;&amp; monitoredTask.getDescription().contains(region.toString())) {<a name="line.4142"></a>
+<span class="sourceLineNo">4143</span>          assertTrue("Region state should be ABORTED.",<a name="line.4143"></a>
+<span class="sourceLineNo">4144</span>              monitoredTask.getState().equals(MonitoredTask.State.ABORTED));<a name="line.4144"></a>
+<span class="sourceLineNo">4145</span>          break;<a name="line.4145"></a>
+<span class="sourceLineNo">4146</span>        }<a name="line.4146"></a>
+<span class="sourceLineNo">4147</span>      }<a name="line.4147"></a>
+<span class="sourceLineNo">4148</span>    }<a name="line.4148"></a>
+<span class="sourceLineNo">4149</span>  }<a name="line.4149"></a>
+<span class="sourceLineNo">4150</span><a name="line.4150"></a>
+<span class="sourceLineNo">4151</span>  /**<a name="line.4151"></a>
+<span class="sourceLineNo">4152</span>   * Verifies that the .regioninfo file is written on region creation and that<a name="line.4152"></a>
+<span class="sourceLineNo">4153</span>   * is recreated if missing during region opening.<a name="line.4153"></a>
+<span class="sourceLineNo">4154</span>   */<a name="line.4154"></a>
+<span class="sourceLineNo">4155</span>  @Test<a name="line.4155"></a>
+<span class="sourceLineNo">4156</span>  public void testRegionInfoFileCreation() throws IOException {<a name="line.4156"></a>
+<span class="sourceLineNo">4157</span>    Path rootDir = new Path(dir + "testRegionInfoFileCreation");<a name="line.4157"></a>
+<span class="sourceLineNo">4158</span><a name="line.4158"></a>
+<span class="sourceLineNo">4159</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.4159"></a>
+<span class="sourceLineNo">4160</span>    htd.addFamily(new HColumnDescriptor("cf"));<a name="line.4160"></a>
 <span class="sourceLineNo">4161</span><a name="line.4161"></a>
-<span class="sourceLineNo">4162</span>    // Verify that the .regioninfo file is present<a name="line.4162"></a>
-<span class="sourceLineNo">4163</span>    assertTrue(HRegionFileSystem.REGION_INFO_FILE + " should be present in the region dir",<a name="line.4163"></a>
-<span class="sourceLineNo">4164</span>        fs.exists(regionInfoFile));<a name="line.4164"></a>
-<span class="sourceLineNo">4165</span><a name="line.4165"></a>
-<span class="sourceLineNo">4166</span>    // Try to open the region<a name="line.4166"></a>
-<span class="sourceLineNo">4167</span>    region = HRegion.openHRegion(rootDir, hri, htd, null, CONF);<a name="line.4167"></a>
-<span class="sourceLineNo">4168</span>    assertEquals(regionDir, region.getRegionFileSystem().getRegionDir());<a name="line.4168"></a>
-<span class="sourceLineNo">4169</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.4169"></a>
-<span class="sourceLineNo">4170</span><a name="line.4170"></a>
-<span class="sourceLineNo">4171</span>    // Verify that the .regioninfo file is still there<a name="line.4171"></a>
-<span class="sourceLineNo">4172</span>    assertTrue(HRegionFileSystem.REGION_INFO_FILE + " should be present in the region dir",<a name="line.4172"></a>
-<span class="sourceLineNo">4173</span>        fs.exists(regionInfoFile));<a name="line.4173"></a>
-<span class="sourceLineNo">4174</span><a name="line.4174"></a>
-<span class="sourceLineNo">4175</span>    // Remove the .regioninfo file and verify is recreated on region open<a name="line.4175"></a>
-<span class="sourceLineNo">4176</span>    fs.delete(regionInfoFile, true);<a name="line.4176"></a>
-<span class="sourceLineNo">4177</span>    assertFalse(HRegionFileSystem.REGION_INFO_FILE + " should be removed from the region dir",<a name="line.4177"></a>
-<span class="sourceLineNo">4178</span>        fs.exists(regionInfoFile));<a name="line.4178"></a>
-<span class="sourceLineNo">4179</span><a name="line.4179"></a>
-<span class="sourceLineNo">4180</span>    region = HRegion.openHRegion(rootDir, hri, htd, null, CONF);<a name="line.4180"></a>
-<span class="sourceLineNo">4181</span>//    region = TEST_UTIL.openHRegion(hri, htd);<a name="line.4181"></a>
-<span class="sourceLineNo">4182</span>    assertEquals(regionDir, region.getRegionFileSystem().getRegionDir());<a name="line.4182"></a>
-<span class="sourceLineNo">4183</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.4183"></a>
+<span class="sourceLineNo">4162</span>    HRegionInfo hri = new HRegionInfo(htd.getTableName());<a name="line.4162"></a>
+<span class="sourceLineNo">4163</span><a name="line.4163"></a>
+<span class="sourceLineNo">4164</span>    // Create a region and skip the initialization (like CreateTableHandler)<a name="line.4164"></a>
+<span class="sourceLineNo">4165</span>    region = HBaseTestingUtility.createRegionAndWAL(hri, rootDir, CONF, htd, false);<a name="line.4165"></a>
+<span class="sourceLineNo">4166</span>    Path regionDir = region.getRegionFileSystem().getRegionDir();<a name="line.4166"></a>
+<span class="sourceLineNo">4167</span>    FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.4167"></a>
+<span class="sourceLineNo">4168</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.4168"></a>
+<span class="sourceLineNo">4169</span><a name="line.4169"></a>
+<span class="sourceLineNo">4170</span>    Path regionInfoFile = new Path(regionDir, HRegionFileSystem.REGION_INFO_FILE);<a name="line.4170"></a>
+<span class="sourceLineNo">4171</span><a name="line.4171"></a>
+<span class="sourceLineNo">4172</span>    // Verify that the .regioninfo file is present<a name="line.4172"></a>
+<span class="sourceLineNo">4173</span>    assertTrue(HRegionFileSystem.REGION_INFO_FILE + " should be present in the region dir",<a name="line.4173"></a>
+<span class="sourceLineNo">4174</span>        fs.exists(regionInfoFile));<a name="line.4174"></a>
+<span class="sourceLineNo">4175</span><a name="line.4175"></a>
+<span class="sourceLineNo">4176</span>    // Try to open the region<a name="line.4176"></a>
+<span class="sourceLineNo">4177</span>    region = HRegion.openHRegion(rootDir, hri, htd, null, CONF);<a name="line.4177"></a>
+<span class="sourceLineNo">4178</span>    assertEquals(regionDir, region.getRegionFileSystem().getRegionDir());<a name="line.4178"></a>
+<span class="sourceLineNo">4179</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.4179"></a>
+<span class="sourceLineNo">4180</span><a name="line.4180"></a>
+<span class="sourceLineNo">4181</span>    // Verify that the .regioninfo file is still there<a name="line.4181"></a>
+<span class="sourceLineNo">4182</span>    assertTrue(HRegionFileSystem.REGION_INFO_FILE + " should be present in the region dir",<a name="line.4182"></a>
+<span class="sourceLineNo">4183</span>        fs.exists(regionInfoFile));<a name="line.4183"></a>
 <span class="sourceLineNo">4184</span><a name="line.4184"></a>
-<span class="sourceLineNo">4185</span>    // Verify that the .regioninfo file is still there<a name="line.4185"></a>
-<span class="sourceLineNo">4186</span>    assertTrue(HRegionFileSystem.REGION_INFO_FILE + " should be present in the region dir",<a name="line.4186"></a>
-<span class="sourceLineNo">4187</span>        fs.exists(new Path(regionDir, HRegionFileSystem.REGION_INFO_FILE)));<a name="line.4187"></a>
-<span class="sourceLineNo">4188</span><a name="line.4188"></a>
-<span class="sourceLineNo">4189</span>    region = null;<a name="line.4189"></a>
-<span class="sourceLineNo">4190</span>  }<a name="line.4190"></a>
-<span class="sourceLineNo">4191</span><a name="line.4191"></a>
-<span class="sourceLineNo">4192</span>  /**<a name="line.4192"></a>
-<span class="sourceLineNo">4193</span>   * TestCase for increment<a name="line.4193"></a>
-<span class="sourceLineNo">4194</span>   */<a name="line.4194"></a>
-<span class="sourceLineNo">4195</span>  private static class Incrementer implements Runnable {<a name="line.4195"></a>
-<span class="sourceLineNo">4196</span>    private HRegion region;<a name="line.4196"></a>
-<span class="sourceLineNo">4197</span>    private final static byte[] incRow = Bytes.toBytes("incRow");<a name="line.4197"></a>
-<span class="sourceLineNo">4198</span>    private final static byte[] family = Bytes.toBytes("family");<a name="line.4198"></a>
-<span class="sourceLineNo">4199</span>    private final static byte[] qualifier = Bytes.toBytes("qualifier");<a name="line.4199"></a>
-<span class="sourceLineNo">4200</span>    private final static long ONE = 1L;<a name="line.4200"></a>
-<span class="sourceLineNo">4201</span>    private int incCounter;<a name="line.4201"></a>
-<span class="sourceLineNo">4202</span><a name="line.4202"></a>
-<span class="sourceLineNo">4203</span>    public Incrementer(HRegion region, int incCounter) {<a name="line.4203"></a>
-<span class="sourceLineNo">4204</span>      this.region = region;<a name="line.4204"></a>
-<span class="sourceLineNo">4205</span>      this.incCounter = incCounter;<a name="line.4205"></a>
-<span class="sourceLineNo">4206</span>    }<a name="line.4206"></a>
-<span class="sourceLineNo">4207</span><a name="line.4207"></a>
-<span class="sourceLineNo">4208</span>    @Override<a name="line.4208"></a>
-<span class="sourceLineNo">4209</span>    public void run() {<a name="line.4209"></a>
-<span class="sourceLineNo">4210</span>      int count = 0;<a name="line.4210"></a>
-<span class="sourceLineNo">4211</span>      while (count &lt; incCounter) {<a name="line.4211"></a>
-<span class="sourceLineNo">4212</span>        Increment inc = new Increment(incRow);<a name="line.4212"></a>
-<span class="sourceLineNo">4213</span>        inc.addColumn(family, qualifier, ONE);<a name="line.4213"></a>
-<span class="sourceLineNo">4214</span>        count++;<a name="line.4214"></a>
-<span class="sourceLineNo">4215</span>        try {<a name="line.4215"></a>
-<span class="sourceLineNo">4216</span>          region.increment(inc);<a name="line.4216"></a>
-<span class="sourceLineNo">4217</span>        } catch (IOException e) {<a name="line.4217"></a>
-<span class="sourceLineNo">4218</span>          LOG.info("Count=" + count + ", " + e);<a name="line.4218"></a>
-<span class="sourceLineNo">4219</span>          break;<a name="line.4219"></a>
-<span class="sourceLineNo">4220</span>        }<a name="line.4220"></a>
-<span class="sourceLineNo">4221</span>      }<a name="line.4221"></a>
-<span class="sourceLineNo">4222</span>    }<a name="line.4222"></a>
-<span class="sourceLineNo">4223</span>  }<a name="line.4223"></a>
-<span class="sourceLineNo">4224</span><a name="line.4224"></a>
-<span class="sourceLineNo">4225</span>  /**<a name="line.4225"></a>
-<span class="sourceLineNo">4226</span>   * Test case to check increment function with memstore flushing<a name="line.4226"></a>
-<span class="sourceLineNo">4227</span>   * @throws Exception<a name="line.4227"></a>
-<span class="sourceLineNo">4228</span>   */<a name="line.4228"></a>
-<span class="sourceLineNo">4229</span>  @Test<a name="line.4229"></a>
-<span class="sourceLineNo">4230</span>  public void testParallelIncrementWithMemStoreFlush() throws Exception {<a name="line.4230"></a>
-<span class="sourceLineNo">4231</span>    byte[] family = Incrementer.family;<a name="line.4231"></a>
-<span class="sourceLineNo">4232</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.4232"></a>
-<span class="sourceLineNo">4233</span>    final HRegion region = this.region;<a name="line.4233"></a>
-<span class="sourceLineNo">4234</span>    final AtomicBoolean incrementDone = new AtomicBoolean(false);<a name="line.4234"></a>
-<span class="sourceLineNo">4235</span>    Runnable flusher = new Runnable() {<a name="line.4235"></a>
-<span class="sourceLineNo">4236</span>      @Override<a name="line.4236"></a>
-<span class="sourceLineNo">4237</span>      public void run() {<a name="line.4237"></a>
-<span class="sourceLineNo">4238</span>        while (!incrementDone.get()) {<a name="line.4238"></a>
-<span class="sourceLineNo">4239</span>          try {<a name="line.4239"></a>
-<span class="sourceLineNo">4240</span>            region.flush(true);<a name="line.4240"></a>
-<span class="sourceLineNo">4241</span>          } catch (Exception e) {<a name="line.4241"></a>
-<span class="sourceLineNo">4242</span>            e.printStackTrace();<a name="line.4242"></a>
-<span class="sourceLineNo">4243</span>          }<a name="line.4243"></a>
-<span class="sourceLineNo">4244</span>        }<a name="line.4244"></a>
-<span class="sourceLineNo">4245</span>      }<a name="line.4245"></a>
-<span class="sourceLineNo">4246</span>    };<a name="line.4246"></a>
-<span class="sourceLineNo">4247</span><a name="line.4247"></a>
-<span class="sourceLineNo">4248</span>    // after all increment finished, the row will increment to 20*100 = 2000<a name="line.4248"></a>
-<span class="sourceLineNo">4249</span>    int threadNum = 20;<a name="line.4249"></a>
-<span class="sourceLineNo">4250</span>    int incCounter = 100;<a name="line.4250"></a>
-<span class="sourceLineNo">4251</span>    long expected = (long) threadNum * incCounter;<a name="line.4251"></a>
-<span class="sourceLineNo">4252</span>    Thread[] incrementers = new Thread[threadNum];<a name="line.4252"></a>
-<span class="sourceLineNo">4253</span>    Thread flushThread = new Thread(flusher);<a name="line.4253"></a>
-<span class="sourceLineNo">4254</span>    for (int i = 0; i &lt; threadNum; i++) {<a name="line.4254"></a>
-<span class="sourceLineNo">4255</span>      incrementers[i] = new Thread(new Incrementer(this.region, incCounter));<a name="line.4255"></a>
-<span class="sourceLineNo">4256</span>      incrementers[i].start();<a name="line.4256"></a>
-<span class="sourceLineNo">4257</span>    }<a name="line.4257"></a>
-<span class="sourceLineNo">4258</span>    flushThread.start();<a name="line.4258"></a>
-<span class="sourceLineNo">4259</span>    for (int i = 0; i &lt; threadNum; i++) {<a name="line.4259"></a>
-<span class="sourceLineNo">4260</span>      incrementers[i].join();<a name="line.4260"></a>
-<span class="sourceLineNo">4261</span>    }<a name="line.4261"></a>
-<span class="sourceLineNo">4262</span><a name="line.4262"></a>
-<span class="sourceLineNo">4263</span>    incrementDone.set(true);<a name="line.4263"></a>
-<span class="sourceLineNo">4264</span>    flushThread.join();<a name="line.4264"></a>
-<span class="sourceLineNo">4265</span><a name="line.4265"></a>
-<span class="sourceLineNo">4266</span>    Get get = new Get(Incrementer.incRow);<a name="line.4266"></a>
-<span class="sourceLineNo">4267</span>    get.addColumn(Incrementer.family, Incrementer.qualifier);<a name="line.4267"></a>
-<span class="sourceLineNo">4268</span>    get.readVersions(1);<a name="line.4268"></a>
-<span class="sourceLineNo">4269</span>    Result res = this.region.get(get);<a name="line.4269"></a>
-<span class="sourceLineNo">4270</span>    List&lt;Cell&gt; kvs = res.getColumnCells(Incrementer.family, Incrementer.qualifier);<a name="line.4270"></a>
-<span class="sourceLineNo">4271</span><a name="line.4271"></a>
-<span class="sourceLineNo">4272</span>    // we just got the latest version<a name="line.4272"></a>
-<span class="sourceLineNo">4273</span>    assertEquals(1, kvs.size());<a name="line.4273"></a>
-<span class="sourceLineNo">4274</span>    Cell kv = kvs.get(0);<a name="line.4274"></a>
-<span class="sourceLineNo">4275</span>    assertEquals(expected, Bytes.toLong(kv.getValueArray(), kv.getValueOffset()));<a name="line.4275"></a>
-<span class="sourceLineNo">4276</span>  }<a name="line.4276"></a>
-<span class="sourceLineNo">4277</span><a name="line.4277"></a>
-<span class="sourceLineNo">4278</span>  /**<a name="line.4278"></a>
-<span class="sourceLineNo">4279</span>   * TestCase for append<a name="line.4279"></a>
-<span class="sourceLineNo">4280</span>   */<a name="line.4280"></a>
-<span class="sourceLineNo">4281</span>  private static class Appender implements Runnable {<a name="line.4281"></a>
-<span class="sourceLineNo">4282</span>    private HRegion region;<a name="line.4282"></a>
-<span class="sourceLineNo">4283</span>    private final static byte[] appendRow = Bytes.toBytes("appendRow");<a name="line.4283"></a>
-<span class="sourceLineNo">4284</span>    private final static byte[] family = Bytes.toBytes("family");<a name="line.4284"></a>
-<span class="sourceLineNo">4285</span>    private final static byte[] qualifier = Bytes.toBytes("qualifier");<a name="line.4285"></a>
-<span class="sourceLineNo">4286</span>    private final static byte[] CHAR = Bytes.toBytes("a");<a name="line.4286"></a>
-<span class="sourceLineNo">4287</span>    private int appendCounter;<a name="line.4287"></a>
-<span class="sourceLineNo">4288</span><a name="line.4288"></a>
-<span class="sourceLineNo">4289</span>    public Appender(HRegion region, int appendCounter) {<a name="line.4289"></a>
-<span class="sourceLineNo">4290</span>      this.region = region;<a name="line.4290"></a>
-<span class="sourceLineNo">4291</span>      this.appendCounter = appendCounter;<a name="line.4291"></a>
-<span class="sourceLineNo">4292</span>    }<a name="line.4292"></a>
-<span class="sourceLineNo">4293</span><a name="line.4293"></a>
-<span class="sourceLineNo">4294</span>    @Override<a name="line.4294"></a>
-<span class="sourceLineNo">4295</span>    public void run() {<a name="line.4295"></a>
-<span class="sourceLineNo">4296</span>      int count = 0;<a name="line.4296"></a>
-<span class="sourceLineNo">4297</span>      while (count &lt; appendCounter) {<a name="line.4297"></a>
-<span class="sourceLineNo">4298</span>        Append app = new Append(appendRow);<a name="line.4298"></a>
-<span class="sourceLineNo">4299</span>        app.addColumn(family, qualifier, CHAR);<a name="line.4299"></a>
-<span class="sourceLineNo">4300</span>        count++;<a name="line.4300"></a>
-<span class="sourceLineNo">4301</span>        try {<a name="line.4301"></a>
-<span class="sourceLineNo">4302</span>          region.append(app);<a name="line.4302"></a>
-<span class="sourceLineNo">4303</span>        } catch (IOException e) {<a name="line.4303"></a>
-<span class="sourceLineNo">4304</span>          LOG.info("Count=" + count + ", max=" + appendCounter + ", " + e);<a name="line.4304"></a>
-<span class="sourceLineNo">4305</span>          break;<a name="line.4305"></a>
-<span class="sourceLineNo">4306</span>        }<a name="line.4306"></a>
-<span class="sourceLineNo">4307</span>      }<a name="line.4307"></a>
-<span class="sourceLineNo">4308</span>    }<a name="line.4308"></a>
-<span class="sourceLineNo">4309</span>  }<a name="line.4309"></a>
-<span class="sourceLineNo">4310</span><a name="line.4310"></a>
-<span class="sourceLineNo">4311</span>  /**<a name="line.4311"></a>
-<span class="sourceLineNo">4312</span>   * Test case to check append function with memstore flushing<a name="line.4312"></a>
-<span class="sourceLineNo">4313</span>   * @throws Exception<a name="line.4313"></a>
-<span class="sourceLineNo">4314</span>   */<a name="line.4314"></a>
-<span class="sourceLineNo">4315</span>  @Test<a name="line.4315"></a>
-<span class="sourceLineNo">4316</span>  public void testParallelAppendWithMemStoreFlush() throws Exception {<a name="line.4316"></a>
-<span class="sourceLineNo">4317</span>    byte[] family = Appender.family;<a name="line.4317"></a>
-<span class="sourceLineNo">4318</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.4318"></a>
-<span class="sourceLineNo">4319</span>    final HRegion region = this.region;<a name="line.4319"></a>
-<span class="sourceLineNo">4320</span>    final AtomicBoolean appendDone = new AtomicBoolean(false);<a name="line.4320"></a>
-<span class="sourceLineNo">4321</span>    Runnable flusher = new Runnable() {<a name="line.4321"></a>
-<span class="sourceLineNo">4322</span>      @Override<a name="line.4322"></a>
-<span class="sourceLineNo">4323</span>      public void run() {<a name="line.4323"></a>
-<span class="sourceLineNo">4324</span>        while (!appendDone.get()) {<a name="line.4324"></a>
-<span class="sourceLineNo">4325</span>          try {<a name="line.4325"></a>
-<span class="sourceLineNo">4326</span>            region.flush(true);<a name="line.4326"></a>
-<span class="sourceLineNo">4327</span>          } catch (Exception e) {<a name="line.4327"></a>
-<span class="sourceLineNo">4328</span>            e.printStackTrace();<a name="line.4328"></a>
-<span class="sourceLineNo">4329</span>          }<a name="line.4329"></a>
-<span class="sourceLineNo">4330</span>        }<a name="line.4330"></a>
-<span class="sourceLineNo">4331</span>      }<a name="line.4331"></a>
-<span class="sourceLineNo">4332</span>    };<a name="line.4332"></a>
-<span class="sourceLineNo">4333</span><a name="line.4333"></a>
-<span class="sourceLineNo">4334</span>    // After all append finished, the value will append to threadNum *<a name="line.4334"></a>
-<span class="sourceLineNo">4335</span>    // appendCounter Appender.CHAR<a name="line.4335"></a>
-<span class="sourceLineNo">4336</span>    int threadNum = 20;<a name="line.4336"></a>
-<span class="sourceLineNo">4337</span>    int appendCounter = 100;<a name="line.4337"></a>
-<span class="sourceLineNo">4338</span>    byte[] expected = new byte[threadNum * appendCounter];<a name="line.4338"></a>
-<span class="sourceLineNo">4339</span>    for (int i = 0; i &lt; threadNum * appendCounter; i++) {<a name="line.4339"></a>
-<span class="sourceLineNo">4340</span>      System.arraycopy(Appender.CHAR, 0, expected, i, 1);<a name="line.4340"></a>
-<span class="sourceLineNo">4341</span>    }<a name="line.4341"></a>
-<span class="sourceLineNo">4342</span>    Thread[] appenders = new Thread[threadNum];<a name="line.4342"></a>
-<span class="sourceLineNo">4343</span>    Thread flushThread = new Thread(flusher);<a name="line.4343"></a>
-<span class="sourceLineNo">4344</span>    for (int i = 0; i &lt; threadNum; i++) {<a name="line.4344"></a>
-<span class="sourceLineNo">4345</span>      appenders[i] = new Thread(new Appender(this.region, appendCounter));<a name="line.4345"></a>
-<span class="sourceLineNo">4346</span>      appenders[i].start();<a name="line.4346"></a>
-<span class="sourceLineNo">4347</span>    }<a name="line.4347"></a>
-<span class="sourceLineNo">4348</span>    flushThread.start();<a name="line.4348"></a>
-<span class="sourceLineNo">4349</span>    for (int i = 0; i &lt; threadNum; i++) {<a name="line.4349"></a>
-<span class="sourceLineNo">4350</span>      appenders[i].join();<a name="line.4350"></a>
+<span class="sourceLineNo">4185</span>    // Remove the .regioninfo file and verify is recreated on region open<a name="line.4185"></a>
+<span class="sourceLineNo">4186</span>    fs.delete(regionInfoFile, true);<a name="line.4186"></a>
+<span class="sourceLineNo">4187</span>    assertFalse(HRegionFileSystem.REGION_INFO_FILE + " should be removed from the region dir",<a name="line.4187"></a>
+<span class="sourceLineNo">4188</span>        fs.exists(regionInfoFile));<a name="line.4188"></a>
+<span class="sourceLineNo">4189</span><a name="line.4189"></a>
+<span class="sourceLineNo">4190</span>    region = HRegion.openHRegion(rootDir, hri, htd, null, CONF);<a name="line.4190"></a>
+<span class="sourceLineNo">4191</span>//    region = TEST_UTIL.openHRegion(hri, htd);<a name="line.4191"></a>
+<span class="sourceLineNo">4192</span>    assertEquals(regionDir, region.getRegionFileSystem().getRegionDir());<a name="line.4192"></a>
+<span class="sourceLineNo">4193</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.4193"></a>
+<span class="sourceLineNo">4194</span><a name="line.4194"></a>
+<span class="sourceLineNo">4195</span>    // Verify that the .regioninfo file is still there<a name="line.4195"></a>
+<span class="sourceLineNo">4196</span>    assertTrue(HRegionFileSystem.REGION_INFO_FILE + " should be present in the region dir",<a name="line.4196"></a>
+<span class="sourceLineNo">4197</span>        fs.exists(new Path(regionDir, HRegionFileSystem.REGION_INFO_FILE)));<a name="line.4197"></a>
+<span class="sourceLineNo">4198</span><a name="line.4198"></a>
+<span class="sourceLineNo">4199</span>    region = null;<a name="line.4199"></a>
+<span class="sourceLineNo">4200</span>  }<a name="line.4200"></a>
+<span class="sourceLineNo">4201</span><a name="line.4201"></a>
+<span class="sourceLineNo">4202</span>  /**<a name="line.4202"></a>
+<span class="sourceLineNo">4203</span>   * TestCase for increment<a name="line.4203"></a>
+<span class="sourceLineNo">4204</span>   */<a name="line.4204"></a>
+<span class="sourceLineNo">4205</span>  private static class Incrementer implements Runnable {<a name="line.4205"></a>
+<span class="sourceLineNo">4206</span>    private HRegion region;<a name="line.4206"></a>
+<span class="sourceLineNo">4207</span>    private final static byte[] incRow = Bytes.toBytes("incRow");<a name="line.4207"></a>
+<span class="sourceLineNo">4208</span>    private final static byte[] family = Bytes.toBytes("family");<a name="line.4208"></a>
+<span class="sourceLineNo">4209</span>    private final static byte[] qualifier = Bytes.toBytes("qualifier");<a name="line.4209"></a>
+<span class="sourceLineNo">4210</span>    private final static long ONE = 1L;<a name="line.4210"></a>
+<span class="sourceLineNo">4211</span>    private int incCounter;<a name="line.4211"></a>
+<span class="sourceLineNo">4212</span><a name="line.4212"></a>
+<span class="sourceLineNo">4213</span>    public Incrementer(HRegion region, int incCounter) {<a name="line.4213"></a>
+<span class="sourceLineNo">4214</span>      this.region = region;<a name="line.4214"></a>
+<span class="sourceLineNo">4215</span>      this.incCounter = incCounter;<a name="line.4215"></a>
+<span class="sourceLineNo">4216</span>    }<a name="line.4216"></a>
+<span class="sourceLineNo">4217</span><a name="line.4217"></a>
+<span class="sourceLineNo">4218</span>    @Override<a name="line.4218"></a>
+<span class="sourceLineNo">4219</span>    public void run() {<a name="line.4219"></a>
+<span class="sourceLineNo">4220</span>      int count = 0;<a name="line.4220"></a>
+<span class="sourceLineNo">4221</span>      while (count &lt; incCounter) {<a name="line.4221"></a>
+<span class="sourceLineNo">4222</span>        Increment inc = new Increment(incRow);<a name="line.4222"></a>
+<span class="sourceLineNo">4223</span>        inc.addColumn(family, qualifier, ONE);<a name="line.4223"></a>
+<span class="sourceLineNo">4224</span>        count++;<a name="line.4224"></a>
+<span class="sourceLineNo">4225</span>        try {<a name="line.4225"></a>
+<span class="sourceLineNo">4226</span>          region.increment(inc);<a name="line.4226"></a>
+<span class="sourceLineNo">4227</span>        } catch (IOException e) {<a name="line.4227"></a>
+<span class="sourceLineNo">4228</span>          LOG.info("Count=" + count + ", " + e);<a name="line.4228"></a>
+<span class="sourceLineNo">4229</span>          break;<a name="line.4229"></a>
+<span class="sourceLineNo">4230</span>        }<a name="line.4230"></a>
+<span class="sourceLineNo">4231</span>      }<a name="line.4231"></a>
+<span class="sourceLineNo">4232</span>    }<a name="line.4232"></a>
+<span class="sourceLineNo">4233</span>  }<a name="line.4233"></a>
+<span class="sourceLineNo">4234</span><a name="line.4234"></a>
+<span class="sourceLineNo">4235</span>  /**<a name="line.4235"></a>
+<span class="sourceLineNo">4236</span>   * Test case to check increment function with memstore flushing<a name="line.4236"></a>
+<span class="sourceLineNo">4237</span>   * @throws Exception<a name="line.4237"></a>
+<span class="sourceLineNo">4238</span>   */<a name="line.4238"></a>
+<span class="sourceLineNo">4239</span>  @Test<a name="line.4239"></a>
+<span class="sourceLineNo">4240</span>  public void testParallelIncrementWithMemStoreFlush() throws Exception {<a name="line.4240"></a>
+<span class="sourceLineNo">4241</span>    byte[] family = Incrementer.family;<a name="line.4241"></a>
+<span class="sourceLineNo">4242</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.4242"></a>
+<span class="sourceLineNo">4243</span>    final HRegion region = this.region;<a name="line.4243"></a>
+<span class="sourceLineNo">4244</span>    final AtomicBoolean incrementDone = new AtomicBoolean(false);<a name="line.4244"></a>
+<span class="sourceLineNo">4245</span>    Runnable flusher = new Runnable() {<a name="line.4245"></a>
+<span class="sourceLineNo">4246</span>      @Override<a name="line.4246"></a>
+<span class="sourceLineNo">4247</span>      public void run() {<a name="line.4247"></a>
+<span class="sourceLineNo">4248</span>        while (!incrementDone.get()) {<a name="line.4248"></a>
+<span class="sourceLineNo">4249</span>          try {<a name="line.4249"></a>
+<span class="sourceLineNo">4250</span>            region.flush(true);<a name="line.4250"></a>
+<span class="sourceLineNo">4251</span>          } catch (Exception e) {<a name="line.4251"></a>
+<span class="sourceLineNo">4252</span>            e.printStackTrace();<a name="line.4252"></a>
+<span class="sourceLineNo">4253</span>          }<a name="line.4253"></a>
+<span class="sourceLineNo">4254</span>        }<a name="line.4254"></a>
+<span class="sourceLineNo">4255</span>      }<a name="line.4255"></a>
+<span class="sourceLineNo">4256</span>    };<a name="line.4256"></a>
+<span class="sourceLineNo">4257</span><a name="line.4257"></a>
+<span class="sourceLineNo">4258</span>    // after all increment finished, the row will increment to 20*100 = 2000<a name="line.4258"></a>
+<span class="sourceLineNo">4259</span>    int threadNum = 20;<a name="line.4259"></a>
+<span class="sourceLineNo">4260</span>    int incCounter = 100;<a name="line.4260"></a>
+<span class="sourceLineNo">4261</span>    long expected = (long) threadNum * incCounter;<a name="line.4261"></a>
+<span class="sourceLineNo">4262</span>    Thread[] incrementers = new Thread[threadNum];<a name="line.4262"></a>
+<span class="sourceLineNo">4263</span>    Thread flushThread = new Thread(flusher);<a name="line.4263"></a>
+<span class="sourceLineNo">4264</span>    for (int i = 0; i &lt; threadNum; i++) {<a name="line.4264"></a>
+<span class="sourceLineNo">4265</span>      incrementers[i] = new Thread(new Incrementer(this.region, incCounter));<a name="line.4265"></a>
+<span class="sourceLineNo">4266</span>      incrementers[i].start();<a name="line.4266"></a>
+<span class="sourceLineNo">4267</span>    }<a name="line.4267"></a>
+<span class="sourceLineNo">4268</span>    flushThread.start();<a name="line.4268"></a>
+<span class="sourceLineNo">4269</span>    for (int i = 0; i &lt; threadNum; i++) {<a name="line.4269"></a>
+<span class="sourceLineNo">4270</span>      incrementers[i].join();<a name="line.4270"></a>
+<span class="sourceLineNo">4271</span>    }<a name="line.4271"></a>
+<span class="sourceLineNo">4272</span><a name="line.4272"></a>
+<span class="sourceLineNo">4273</span>    incrementDone.set(true);<a name="line.4273"></a>
+<span class="sourceLineNo">4274</span>    flushThread.join();<a name="line.4274"></a>
+<span class="sourceLineNo">4275</span><a name="line.4275"></a>
+<span class="sourceLineNo">4276</span>    Get get = new Get(Incrementer.incRow);<a name="line.4276"></a>
+<span class="sourceLineNo">4277</span>    get.addColumn(Incrementer.family, Incrementer.qualifier);<a name="line.4277"></a>
+<span class="sourceLineNo">4278</span>    get.readVersions(1);<a name="line.4278"></a>
+<span class="sourceLineNo">4279</span>    Result res = this.region.get(get);<a name="line.4279"></a>
+<span class="sourceLineNo">4280</span>    List&lt;Cell&gt; kvs = res.getColumnCells(Incrementer.family, Incrementer.qualifier);<a name="line.4280"></a>
+<span class="sourceLineNo">4281</span><a name="line.4281"></a>
+<span class="sourceLineNo">4282</span>    // we just got the latest version<a name="line.4282"></a>
+<span class="sourceLineNo">4283</span>    assertEquals(1, kvs.size());<a name="line.4283"></a>
+<span class="sourceLineNo">4284</span>    Cell kv = kvs.get(0);<a name="line.4284"></a>
+<span class="sourceLineNo">4285</span>    assertEquals(expected, Bytes.toLong(kv.getValueArray(), kv.getValueOffset()));<a name="line.4285"></a>
+<span class="sourceLineNo">4286</span>  }<a name="line.4286"></a>
+<span class="sourceLineNo">4287</span><a name="line.4287"></a>
+<span class="sourceLineNo">4288</span>  /**<a name="line.4288"></a>
+<span class="sourceLineNo">4289</span>   * TestCase for append<a name="line.4289"></a>
+<span class="sourceLineNo">4290</span>   */<a name="line.4290"></a>
+<span class="sourceLineNo">4291</span>  private static class Appender implements Runnable {<a name="line.4291"></a>
+<span class="sourceLineNo">4292</span>    private HRegion region;<a name="line.4292"></a>
+<span class="sourceLineNo">4293</span>    private final static byte[] appendRow = Bytes.toBytes("appendRow");<a name="line.4293"></a>
+<span class="sourceLineNo">4294</span>    private final static byte[] family = Bytes.toBytes("family");<a name="line.4294"></a>
+<span class="sourceLineNo">4295</span>    private final static byte[] qualifier = Bytes.toBytes("qualifier");<a name="line.4295"></a>
+<span class="sourceLineNo">4296</span>    private final static byte[] CHAR = Bytes.toBytes("a");<a name="line.4296"></a>
+<span class="sourceLineNo">4297</span>    private int appendCounter;<a name="line.4297"></a>
+<span class="sourceLineNo">4298</span><a name="line.4298"></a>
+<span class="sourceLineNo">4299</span>    public Appender(HRegion region, int appendCounter) {<a name="line.4299"></a>
+<span class="sourceLineNo">4300</span>      this.region = region;<a name="line.4300"></a>
+<span class="sourceLineNo">4301</span>      this.appendCounter = appendCounter;<a name="line.4301"></a>
+<span class="sourceLineNo">4302</span>    }<a name="line.4302"></a>
+<span class="sourceLineNo">4303</span><a name="line.4303"></a>
+<span class="sourceLineNo">4304</span>    @Override<a name="line.4304"></a>
+<span class="sourceLineNo">4305</span>    public void run() {<a name="line.4305"></a>
+<span class="sourceLineNo">4306</span>      int count = 0;<a name="line.4306"></a>
+<span class="sourceLineNo">4307</span>      while (count &lt; appendCounter) {<a name="line.4307"></a>
+<span class="sourceLineNo">4308</span>        Append app = new Append(appendRow);<a name="line.4308"></a>
+<span class="sourceLineNo">4309</span>        app.addColumn(family, qualifier, CHAR);<a name="line.4309"></a>
+<span class="sourceLineNo">4310</span>        count++;<a name="line.4310"></a>
+<span class="sourceLineNo">4311</span>        try {<a name="line.4311"></a>
+<span class="sourceLineNo">4312</span>          region.append(app);<a name="line.4312"></a>
+<span class="sourceLineNo">4313</span>        } catch (IOException e) {<a name="line.4313"></a>
+<span class="sourceLineNo">4314</span>          LOG.info("Count=" + count + ", max=" + appendCounter + ", " + e);<a name="line.4314"></a>
+<span class="sourceLineNo">4315</span>          break;<a name="line.4315"></a>
+<span class="sourceLineNo">4316</span>        }<a name="line.4316"></a>
+<span class="sourceLineNo">4317</span>      }<a name="line.4317"></a>
+<span class="sourceLineNo">4318</span>    }<a name="line.4318"></a>
+<span class="sourceLineNo">4319</span>  }<a name="line.4319"></a>
+<span class="sourceLineNo">4320</span><a name="line.4320"></a>
+<span class="sourceLineNo">4321</span>  /**<a name="line.4321"></a>
+<span class="sourceLineNo">4322</span>   * Test case to check append function with memstore flushing<a name="line.4322"></a>
+<span class="sourceLineNo">4323</span>   * @throws Exception<a name="line.4323"></a>
+<span class="sourceLineNo">4324</span>   */<a name="line.4324"></a>
+<span class="sourceLineNo">4325</span>  @Test<a name="line.4325"></a>
+<span class="sourceLineNo">4326</span>  public void testParallelAppendWithMemStoreFlush() throws Exception {<a name="line.4326"></a>
+<span class="sourceLineNo">4327</span>    byte[] family = Appender.family;<a name="line.4327"></a>
+<span class="sourceLineNo">4328</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.4328"></a>
+<span class="sourceLineNo">4329</span>    final HRegion region = this.region;<a name="line.4329"></a>
+<span class="sourceLineNo">4330</span>    final AtomicBoolean appendDone = new AtomicBoolean(false);<a name="line.4330"></a>
+<span class="sourceLineNo">4331</span>    Runnable flusher = new Runnable() {<a name="line.4331"></a>
+<span class="sourceLineNo">4332</span>      @Override<a name="line.4332"></a>
+<span class="sourceLineNo">4333</span>      public void run() {<a name="line.4333"></a>
+<span class="sourceLineNo">4334</span>        while (!appendDone.get()) {<a name="line.4334"></a>
+<span class="sourceLineNo">4335</span>          try {<a name="line.4335"></a>
+<span class="sourceLineNo">4336</span>            region.flush(true);<a name="line.4336"></a>
+<span class="sourceLineNo">4337</span>          } catch (Exception e) {<a name="line.4337"></a>
+<span class="sourceLineNo">4338</span>            e.printStackTrace();<a name="line.4338"></a>
+<span class="sourceLineNo">4339</span>          }<a name="line.4339"></a>
+<span class="sourceLineNo">4340</span>        }<a name="line.4340"></a>
+<span class="sourceLineNo">4341</span>      }<a name="line.4341"></a>
+<span class="sourceLineNo">4342</span>    };<a name="line.4342"></a>
+<span class="sourceLineNo">4343</span><a name="line.4343"></a>
+<span class="sourceLineNo">4344</span>    // After all append finished, the value will append to threadNum *<a name="line.4344"></a>
+<span class="sourceLineNo">4345</span>    // appendCounter Appender.CHAR<a name="line.4345"></a>
+<span class="sourceLineNo">4346</span>    int threadNum = 20;<a name="line.4346"></a>
+<span class="sourceLineNo">4347</span>    int appendCounter = 100;<a name="line.4347"></a>
+<span class="sourceLineNo">4348</span>    byte[] expected = new byte[threadNum * appendCounter];<a name="line.4348"></a>
+<span class="sourceLineNo">4349</span>    for (int i = 0; i &lt; threadNum * appendCounter; i++) {<a name="line.4349"></a>
+<span class="sourceLineNo">4350</span>      System.arraycopy(Appender.CHAR, 0, expected, i, 1);<a name="line.4350"></a>
 <span class="sourceLineNo">4351</span>    }<a name="line.4351"></a>
-<span class="sourceLineNo">4352</span><a name="line.4352"></a>
-<span class="sourceLineNo">4353</span>    appendDone.set(true);<a name="line.4353"></a>
-<span class="sourceLineNo">4354</span>    flushThread.join();<a name="line.4354"></a>
-<span class="sourceLineNo">4355</span><a name="line.4355"></a>
-<span class="sourceLineNo">4356</span>    Get get = new Get(Appender.appendRow);<a name="line.4356"></a>
-<span class="sourceLineNo">4357</span>    get.addColumn(Appender.family, Appender.qualifier);<a name="line.4357"></a>
-<span class="sourceLineNo">4358</span>    get.readVersions(1);<a name="line.4358"></a>
-<span class="sourceLineNo">4359</span>    Result res = this.region.get(get);<a name="line.4359"></a>
-<span class="sourceLineNo">4360</span>    List&lt;Cell&gt; kvs = res.getColumnCells(Appender.family, Appender.qualifier);<a name="line.4360"></a>
-<span class="sourceLineNo">4361</span><a name="line.4361"></a>
-<span class="sourceLineNo">4362</span>    // we just got the latest version<a name="line.4362"></a>
-<span class="sourceLineNo">4363</span>    assertEquals(1, kvs.size());<a name="line.4363"></a>
-<span class="sourceLineNo">4364</span>    Cell kv = kvs.get(0);<a name="line.4364"></a>
-<span class="sourceLineNo">4365</span>    byte[] appendResult = new byte[kv.getValueLength()];<a name="line.4365"></a>
-<span class="sourceLineNo">4366</span>    System.arraycopy(kv.getValueArray(), kv.getValueOffset(), appendResult, 0, kv.getValueLength());<a name="line.4366"></a>
-<span class="sourceLineNo">4367</span>    assertArrayEquals(expected, appendResult);<a name="line.4367"></a>
-<span class="sourceLineNo">4368</span>  }<a name="line.4368"></a>
-<span class="sourceLineNo">4369</span><a name="line.4369"></a>
-<span class="sourceLineNo">4370</span>  /**<a name="line.4370"></a>
-<span class="sourceLineNo">4371</span>   * Test case to check put function with memstore flushing for same row, same ts<a name="line.4371"></a>
-<span class="sourceLineNo">4372</span>   * @throws Exception<a name="line.4372"></a>
-<span class="sourceLineNo">4373</span>   */<a name="line.4373"></a>
-<span class="sourceLineNo">4374</span>  @Test<a name="line.4374"></a>
-<span class="sourceLineNo">4375</span>  public void testPutWithMemStoreFlush() throws Exception {<a name="line.4375"></a>
-<span class="sourceLineNo">4376</span>    byte[] family = Bytes.toBytes("family");<a name="line.4376"></a>
-<span class="sourceLineNo">4377</span>    byte[] qualifier = Bytes.toBytes("qualifier");<a name="line.4377"></a>
-<span class="sourceLineNo">4378</span>    byte[] row = Bytes.toBytes("putRow");<a name="line.4378"></a>
-<span class="sourceLineNo">4379</span>    byte[] value = null;<a name="line.4379"></a>
-<span class="sourceLineNo">4380</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.4380"></a>
-<span class="sourceLineNo">4381</span>    Put put = null;<a name="line.4381"></a>
-<span class="sourceLineNo">4382</span>    Get get = null;<a name="line.4382"></a>
-<span class="sourceLineNo">4383</span>    List&lt;Cell&gt; kvs = null;<a name="line.4383"></a>
-<span class="sourceLineNo">4384</span>    Result res = null;<a name="line.4384"></a>
-<span class="sourceLineNo">4385</span><a name="line.4385"></a>
-<span class="sourceLineNo">4386</span>    put = new Put(row);<a name="line.4386"></a>
-<span class="sourceLineNo">4387</span>    value = Bytes.toBytes("value0");<a name="line.4387"></a>
-<span class="sourceLineNo">4388</span>    put.addColumn(family, qualifier, 1234567L, value);<a name="line.4388"></a>
-<span class="sourceLineNo">4389</span>    region.put(put);<a name="line.4389"></a>
-<span class="sourceLineNo">4390</span>    get = new Get(row);<a name="line.4390"></a>
-<span class="sourceLineNo">4391</span>    get.addColumn(family, qualifier);<a name="line.4391"></a>
-<span class="sourceLineNo">4392</span>    get.readAllVersions();<a name="line.4392"></a>
-<span class="sourceLineNo">4393</span>    res = this.region.get(get);<a name="line.4393"></a>
-<span class="sourceLineNo">4394</span>    kvs = res.getColumnCells(family, qualifier);<a name="line.4394"></a>
-<span class="sourceLineNo">4395</span>    assertEquals(1, kvs.size());<a name="line.4395"></a>
-<span class="sourceLineNo">4396</span>    assertArrayEquals(Bytes.toBytes("value0"), CellUtil.cloneValue(kvs.get(0)));<a name="line.4396"></a>
-<span class="sourceLineNo">4397</span><a name="line.4397"></a>
-<span class="sourceLineNo">4398</span>    region.flush(true);<a name="line.4398"></a>
-<span class="sourceLineNo">4399</span>    get = new Get(row);<a name="line.4399"></a>
-<span class="sourceLineNo">4400</span>    get.addColumn(family, qualifier);<a name="line.4400"></a>
-<span class="sourceLineNo">4401</span>    get.readAllVersions();<a name="line.4401"></a>
-<span class="sourceLineNo">4402</span>    res = this.region.get(get);<a name="line.4402"></a>
-<span class="sourceLineNo">4403</span>    kvs = res.getColumnCells(family, qualifier);<a name="line.4403"></a>
-<span class="sourceLineNo">4404</span>    assertEquals(1, kvs.size());<a name="line.4404"></a>
-<span class="sourceLineNo">4405</span>    assertArrayEquals(Bytes.toBytes("value0"), CellUtil.cloneValue(kvs.get(0)));<a name="line.4405"></a>
-<span class="sourceLineNo">4406</span><a name="line.4406"></a>
-<span class="sourceLineNo">4407</span>    put = new Put(row);<a name="line.4407"></a>
-<span class="sourceLineNo">4408</span>    value = Bytes.toBytes("value1");<a name="line.4408"></a>
-<span class="sourceLineNo">4409</span>    put.addColumn(family, qualifier, 1234567L, value);<a name="line.4409"></a>
-<span class="sourceLineNo">4410</span>    region.put(put);<a name="line.4410"></a>
-<span class="sourceLineNo">4411</span>    get = new Get(row);<a name="line.4411"></a>
-<span class="sourceLineNo">4412</span>    get.addColumn(family, qualifier);<a name="line.4412"></a>
-<span class="sourceLineNo">4413</span>    get.readAllVersions();<a name="line.4413"></a>
-<span class="sourceLineNo">4414</span>    res = this.region.get(get);<a name="line.4414"></a>
-<span class="sourceLineNo">4415</span>    kvs = res.getColumnCells(family, qualifier);<a name="line.4415"></a>
-<span class="sourceLineNo">4416</span>    assertEquals(1, kvs.size());<a name="line.4416"></a>
-<span class="sourceLineNo">4417</span>    assertArrayEquals(Bytes.toBytes("value1"), CellUtil.cloneValue(kvs.get(0)));<a name="line.4417"></a>
-<span class="sourceLineNo">4418</span><a name="line.4418"></a>
-<span class="sourceLineNo">4419</span>    region.flush(true);<a name="line.4419"></a>
-<span class="sourceLineNo">4420</span>    get = new Get(row);<a name="line.4420"></a>
-<span class="sourceLineNo">4421</span>    get.addColumn(family, qualifier);<a name="line.4421"></a>
-<span class="sourceLineNo">4422</span>    get.readAllVersions();<a name="line.4422"></a>
-<span class="sourceLineNo">4423</span>    res = this.region.get(get);<a name="line.4423"></a>
-<span class="sourceLineNo">4424</span>    kvs = res.getColumnCells(family, qualifier);<a name="line.4424"></a>
-<span class="sourceLineNo">4425</span>    assertEquals(1, kvs.size());<a name="line.4425"></a>
-<span class="sourceLineNo">4426</span>    assertArrayEquals(Bytes.toBytes("value1"), CellUtil.cloneValue(kvs.get(0)));<a name="line.4426"></a>
-<span class="sourceLineNo">4427</span>  }<a name="line.4427"></a>
+<span class="sourceLineNo">4352</span>    Thread[] appenders = new Thread[threadNum];<a name="line.4352"></a>
+<span class="sourceLineNo">4353</span>    Thread flushThread = new Thread(flusher);<a name="line.4353"></a>
+<span class="sourceLineNo">4354</span>    for (int i = 0; i &lt; threadNum; i++) {<a name="line.4354"></a>
+<span class="sourceLineNo">4355</span>      appenders[i] = new Thread(new Appender(this.region, appendCounter));<a name="line.4355"></a>
+<span class="sourceLineNo">4356</span>      appenders[i].start();<a name="line.4356"></a>
+<span class="sourceLineNo">4357</span>    }<a name="line.4357"></a>
+<span class="sourceLineNo">4358</span>    flushThread.start();<a name="line.4358"></a>
+<span class="sourceLineNo">4359</span>    for (int i = 0; i &lt; threadNum; i++) {<a name="line.4359"></a>
+<span class="sourceLineNo">4360</span>      appenders[i].join();<a name="line.4360"></a>
+<span class="sourceLineNo">4361</span>    }<a name="line.4361"></a>
+<span class="sourceLineNo">4362</span><a name="line.4362"></a>
+<span class="sourceLineNo">4363</span>    appendDone.set(true);<a name="line.4363"></a>
+<span class="sourceLineNo">4364</span>    flushThread.join();<a name="line.4364"></a>
+<span class="sourceLineNo">4365</span><a name="line.4365"></a>
+<span class="sourceLineNo">4366</span>    Get get = new Get(Appender.appendRow);<a name="line.4366"></a>
+<span class="sourceLineNo">4367</span>    get.addColumn(Appender.family, Appender.qualifier);<a name="line.4367"></a>
+<span class="sourceLineNo">4368</span>    get.readVersions(1);<a name="line.4368"></a>
+<span class="sourceLineNo">4369</span>    Result res = this.region.get(get);<a name="line.4369"></a>
+<span class="sourceLineNo">4370</span>    List&lt;Cell&gt; kvs = res.getColumnCells(Appender.family, Appender.qualifier);<a name="line.4370"></a>
+<span class="sourceLineNo">4371</span><a name="line.4371"></a>
+<span class="sourceLineNo">4372</span>    // we just got the latest version<a name="line.4372"></a>
+<span class="sourceLineNo">4373</span>    assertEquals(1, kvs.size());<a name="line.4373"></a>
+<span class="sourceLineNo">4374</span>    Cell kv = kvs.get(0);<a name="line.4374"></a>
+<span class="sourceLineNo">4375</span>    byte[] appendResult = new byte[kv.getValueLength()];<a name="line.4375"></a>
+<span class="sourceLineNo">4376</span>    System.arraycopy(kv.getValueArray(), kv.getValueOffset(), appendResult, 0, kv.getValueLength());<a name="line.4376"></a>
+<span class="sourceLineNo">4377</span>    assertArrayEquals(expected, appendResult);<a name="line.4377"></a>
+<span class="sourceLineNo">4378</span>  }<a name="line.4378"></a>
+<span class="sourceLineNo">4379</span><a name="line.4379"></a>
+<span class="sourceLineNo">4380</span>  /**<a name="line.4380"></a>
+<span class="sourceLineNo">4381</span>   * Test case to check put function with memstore flushing for same row, same ts<a name="line.4381"></a>
+<span class="sourceLineNo">4382</span>   * @throws Exception<a name="line.4382"></a>
+<span class="sourceLineNo">4383</span>   */<a name="line.4383"></a>
+<span class="sourceLineNo">4384</span>  @Test<a name="line.4384"></a>
+<span class="sourceLineNo">4385</span>  public void testPutWithMemStoreFlush() throws Exception {<a name="line.4385"></a>
+<span class="sourceLineNo">4386</span>    byte[] family = Bytes.toBytes("family");<a name="line.4386"></a>
+<span class="sourceLineNo">4387</span>    byte[] qualifier = Bytes.toBytes("qualifier");<a name="line.4387"></a>
+<span class="sourceLineNo">4388</span>    byte[] row = Bytes.toBytes("putRow");<a name="line.4388"></a>
+<span class="sourceLineNo">4389</span>    byte[] value = null;<a name="line.4389"></a>
+<span class="sourceLineNo">4390</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.4390"></a>
+<span class="sourceLineNo">4391</span>    Put put = null;<a name="line.4391"></a>
+<span class="sourceLineNo">4392</span>    Get get = null;<a name="line.4392"></a>
+<span class="sourceLineNo">4393</span>    List&lt;Cell&gt; kvs = null;<a name="line.4393"></a>
+<span class="sourceLineNo">4394</span>    Result res = null;<a name="line.4394"></a>
+<span class="sourceLineNo">4395</span><a name="line.4395"></a>
+<span class="sourceLineNo">4396</span>    put = new Put(row);<a name="line.4396"></a>
+<span class="sourceLineNo">4397</span>    value = Bytes.toBytes("value0");<a name="line.4397"></a>
+<span class="sourceLineNo">4398</span>    put.addColumn(family, qualifier, 1234567L, value);<a name="line.4398"></a>
+<span class="sourceLineNo">4399</span>    region.put(put);<a name="line.4399"></a>
+<span class="sourceLineNo">4400</span>    get = new Get(row);<a name="line.4400"></a>
+<span class="sourceLineNo">4401</span>    get.addColumn(family, qualifier);<a name="line.4401"></a>
+<span class="sourceLineNo">4402</span>    get.readAllVersions();<a name="line.4402"></a>
+<span class="sourceLineNo">4403</span>    res = this.region.get(get);<a name="line.4403"></a>
+<span class="sourceLineNo">4404</span>    kvs = res.getColumnCells(family, qualifier);<a name="line.4404"></a>
+<span class="sourceLineNo">4405</span>    assertEquals(1, kvs.size());<a name="line.4405"></a>
+<span class="sourceLineNo">4406</span>    assertArrayEquals(Bytes.toBytes("value0"), CellUtil.cloneValue(kvs.get(0)));<a name="line.4406"></a>
+<span class="sourceLineNo">4407</span><a name="line.4407"></a>
+<span class="sourceLineNo">4408</span>    region.flush(true);<a name="line.4408"></a>
+<span class="sourceLineNo">4409</span>    get = new Get(row);<a name="line.4409"></a>
+<span class="sourceLineNo">4410</span>    get.addColumn(family, qualifier);<a name="line.4410"></a>
+<span class="sourceLineNo">4411</span>    get.readAllVersions();<a name="line.4411"></a>
+<span class="sourceLineNo">4412</span>    res = this.region.get(get);<a name="line.4412"></a>
+<span class="sourceLineNo">4413</span>    kvs = res.getColumnCells(family, qualifier);<a name="line.4413"></a>
+<span class="sourceLineNo">4414</span>    assertEquals(1, kvs.size());<a name="line.4414"></a>
+<span class="sourceLineNo">4415</span>    assertArrayEquals(Bytes.toBytes("value0"), CellUtil.cloneValue(kvs.get(0)));<a name="line.4415"></a>
+<span class="sourceLineNo">4416</span><a name="line.4416"></a>
+<span class="sourceLineNo">4417</span>    put = new Put(row);<a name="line.4417"></a>
+<span class="sourceLineNo">4418</span>    value = Bytes.toBytes("value1");<a name="line.4418"></a>
+<span class="sourceLineNo">4419</span>    put.addColumn(family, qualifier, 1234567L, value);<a name="line.4419"></a>
+<span class="sourceLineNo">4420</span>    region.put(put);<a name="line.4420"></a>
+<span class="sourceLineNo">4421</span>    get = new Get(row);<a name="line.4421"></a>
+<span class="sourceLineNo">4422</span>    get.addColumn(family, qualifier);<a name="line.4422"></a>
+<span class="sourceLineNo">4423</span>    get.readAllVersions();<a name="line.4423"></a>
+<span class="sourceLineNo">4424</span>    res = this.region.get(get);<a name="line.4424"></a>
+<span class="sourceLineNo">4425</span>    kvs = res.getColumnCells(family, qualifier);<a name="line.4425"></a>
+<span class="sourceLineNo">4426</span>    assertEquals(1, kvs.size());<a name="line.4426"></a>
+<span class="sourceLineNo">4427</span>    assertArrayEquals(Bytes.toBytes("value1"), CellUtil.cloneValue(kvs.get(0)));<a name="line.4427"></a>
 <span class="sourceLineNo">4428</span><a name="line.4428"></a>
-<span class="sourceLineNo">4429</span>  @Test<a name="line.4429"></a>
-<span class="sourceLineNo">4430</span>  public void testDurability() throws Exception {<a name="line.4430"></a>
-<span class="sourceLineNo">4431</span>    // there are 5 x 5 cases:<a name="line.4431"></a>
-<span class="sourceLineNo">4432</span>    // table durability(SYNC,FSYNC,ASYC,SKIP,USE_DEFAULT) x mutation<a name="line.4432"></a>
-<span class="sourceLineNo">4433</span>    // durability(SYNC,FSYNC,ASYC,SKIP,USE_DEFAULT)<a name="line.4433"></a>
-<span class="sourceLineNo">4434</span><a name="line.4434"></a>
-<span class="sourceLineNo">4435</span>    // expected cases for append and sync wal<a name="line.4435"></a>
-<span class="sourceLineNo">4436</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4436"></a>
-<span class="sourceLineNo">4437</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4437"></a>
-<span class="sourceLineNo">4438</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.USE_DEFAULT, 0, true, true, false);<a name="line.4438"></a>
-<span class="sourceLineNo">4439</span><a name="line.4439"></a>
-<span class="sourceLineNo">4440</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4440"></a>
-<span class="sourceLineNo">4441</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4441"></a>
-<span class="sourceLineNo">4442</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.USE_DEFAULT, 0, true, true, false);<a name="line.4442"></a>
-<span class="sourceLineNo">4443</span><a name="line.4443"></a>
-<span class="sourceLineNo">4444</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4444"></a>
-<span class="sourceLineNo">4445</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4445"></a>
-<span class="sourceLineNo">4446</span><a name="line.4446"></a>
-<span class="sourceLineNo">4447</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4447"></a>
-<span class="sourceLineNo">4448</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4448"></a>
+<span class="sourceLineNo">4429</span>    region.flush(true);<a name="line.4429"></a>
+<span class="sourceLineNo">4430</span>    get = new Get(row);<a name="line.4430"></a>
+<span class="sourceLineNo">4431</span>    get.addColumn(family, qualifier);<a name="line.4431"></a>
+<span class="sourceLineNo">4432</span>    get.readAllVersions();<a name="line.4432"></a>
+<span class="sourceLineNo">4433</span>    res = this.region.get(get);<a name="line.4433"></a>
+<span class="sourceLineNo">4434</span>    kvs = res.getColumnCells(family, qualifier);<a name="line.4434"></a>
+<span class="sourceLineNo">4435</span>    assertEquals(1, kvs.size());<a name="line.4435"></a>
+<span class="sourceLineNo">4436</span>    assertArrayEquals(Bytes.toBytes("value1"), CellUtil.cloneValue(kvs.get(0)));<a name="line.4436"></a>
+<span class="sourceLineNo">4437</span>  }<a name="line.4437"></a>
+<span class="sourceLineNo">4438</span><a name="line.4438"></a>
+<span class="sourceLineNo">4439</span>  @Test<a name="line.4439"></a>
+<span class="sourceLineNo">4440</span>  public void testDurability() throws Exception {<a name="line.4440"></a>
+<span class="sourceLineNo">4441</span>    // there are 5 x 5 cases:<a name="line.4441"></a>
+<span class="sourceLineNo">4442</span>    // table durability(SYNC,FSYNC,ASYC,SKIP,USE_DEFAULT) x mutation<a name="line.4442"></a>
+<span class="sourceLineNo">4443</span>    // durability(SYNC,FSYNC,ASYC,SKIP,USE_DEFAULT)<a name="line.4443"></a>
+<span class="sourceLineNo">4444</span><a name="line.4444"></a>
+<span class="sourceLineNo">4445</span>    // expected cases for append and sync wal<a name="line.4445"></a>
+<span class="sourceLineNo">4446</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4446"></a>
+<span class="sourceLineNo">4447</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4447"></a>
+<span class="sourceLineNo">4448</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.USE_DEFAULT, 0, true, true, false);<a name="line.4448"></a>
 <span class="sourceLineNo">4449</span><a name="line.4449"></a>
-<span class="sourceLineNo">4450</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4450"></a>
-<span class="sourceLineNo">4451</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4451"></a>
-<span class="sourceLineNo">4452</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.USE_DEFAULT, 0, true, true, false);<a name="line.4452"></a>
+<span class="sourceLineNo">4450</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4450"></a>
+<span class="sourceLineNo">4451</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4451"></a>
+<span class="sourceLineNo">4452</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.USE_DEFAULT, 0, true, true, false);<a name="line.4452"></a>
 <span class="sourceLineNo">4453</span><a name="line.4453"></a>
-<span class="sourceLineNo">4454</span>    // expected cases for async wal<a name="line.4454"></a>
-<span class="sourceLineNo">4455</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4455"></a>
-<span class="sourceLineNo">4456</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4456"></a>
-<span class="sourceLineNo">4457</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4457"></a>
-<span class="sourceLineNo">4458</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4458"></a>
-<span class="sourceLineNo">4459</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4459"></a>
-<span class="sourceLineNo">4460</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.USE_DEFAULT, 0, true, false, false);<a name="line.4460"></a>
-<span class="sourceLineNo">4461</span><a name="line.4461"></a>
-<span class="sourceLineNo">4462</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4462"></a>
-<span class="sourceLineNo">4463</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4463"></a>
-<span class="sourceLineNo">4464</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4464"></a>
-<span class="sourceLineNo">4465</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4465"></a>
-<span class="sourceLineNo">4466</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4466"></a>
-<span class="sourceLineNo">4467</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.USE_DEFAULT, 5000, true, false, true);<a name="line.4467"></a>
-<span class="sourceLineNo">4468</span><a name="line.4468"></a>
-<span class="sourceLineNo">4469</span>    // expect skip wal cases<a name="line.4469"></a>
-<span class="sourceLineNo">4470</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4470"></a>
-<span class="sourceLineNo">4471</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4471"></a>
-<span class="sourceLineNo">4472</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4472"></a>
-<span class="sourceLineNo">4473</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4473"></a>
-<span class="sourceLineNo">4474</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4474"></a>
-<span class="sourceLineNo">4475</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.USE_DEFAULT, 0, false, false, false);<a name="line.4475"></a>
-<span class="sourceLineNo">4476</span><a name="line.4476"></a>
-<span class="sourceLineNo">4477</span>  }<a name="line.4477"></a>
+<span class="sourceLineNo">4454</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4454"></a>
+<span class="sourceLineNo">4455</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4455"></a>
+<span class="sourceLineNo">4456</span><a name="line.4456"></a>
+<span class="sourceLineNo">4457</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4457"></a>
+<span class="sourceLineNo">4458</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4458"></a>
+<span class="sourceLineNo">4459</span><a name="line.4459"></a>
+<span class="sourceLineNo">4460</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4460"></a>
+<span class="sourceLineNo">4461</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4461"></a>
+<span class="sourceLineNo">4462</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.USE_DEFAULT, 0, true, true, false);<a name="line.4462"></a>
+<span class="sourceLineNo">4463</span><a name="line.4463"></a>
+<span class="sourceLineNo">4464</span>    // expected cases for async wal<a name="line.4464"></a>
+<span class="sourceLineNo">4465</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4465"></a>
+<span class="sourceLineNo">4466</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4466"></a>
+<span class="sourceLineNo">4467</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4467"></a>
+<span class="sourceLineNo">4468</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4468"></a>
+<span class="sourceLineNo">4469</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4469"></a>
+<span class="sourceLineNo">4470</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.USE_DEFAULT, 0, true, false, false);<a name="line.4470"></a>
+<span class="sourceLineNo">4471</span><a name="line.4471"></a>
+<span class="sourceLineNo">4472</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4472"></a>
+<span class="sourceLineNo">4473</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4473"></a>
+<span class="sourceLineNo">4474</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4474"></a>
+<span class="sourceLineNo">4475</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4475"></a>
+<span class="sourceLineNo">4476</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4476"></a>
+<span class="sourceLineNo">4477</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.USE_DEFAULT, 5000, true, false, true);<a name="line.4477"></a>
 <span class="sourceLineNo">4478</span><a name="line.4478"></a>
-<span class="sourceLineNo">4479</span>  private void durabilityTest(String method, Durability tableDurability,<a name="line.4479"></a>
-<span class="sourceLineNo">4480</span>      Durability mutationDurability, long timeout, boolean expectAppend, final boolean expectSync,<a name="line.4480"></a>
-<span class="sourceLineNo">4481</span>      final boolean expectSyncFromLogSyncer) throws Exception {<a name="line.4481"></a>
-<span class="sourceLineNo">4482</span>    Configuration conf = HBaseConfiguration.create(CONF);<a name="line.4482"></a>
-<span class="sourceLineNo">4483</span>    method = method + "_" + tableDurability.name() + "_" + mutationDurability.name();<a name="line.4483"></a>
-<span class="sourceLineNo">4484</span>    byte[] family = Bytes.toBytes("family");<a name="line.4484"></a>
-<span class="sourceLineNo">4485</span>    Path logDir = new Path(new Path(dir + method), "log");<a name="line.4485"></a>
-<span class="sourceLineNo">4486</span>    final Configuration walConf = new Configuration(conf);<a name="line.4486"></a>
-<span class="sourceLineNo">4487</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.4487"></a>
-<span class="sourceLineNo">4488</span>    // XXX: The spied AsyncFSWAL can not work properly because of a Mockito defect that can not<a name="line.4488"></a>
-<span class="sourceLineNo">4489</span>    // deal with classes which have a field of an inner class. See discussions in HBASE-15536.<a name="line.4489"></a>
-<span class="sourceLineNo">4490</span>    walConf.set(WALFactory.WAL_PROVIDER, "filesystem");<a name="line.4490"></a>
-<span class="sourceLineNo">4491</span>    final WALFactory wals = new WALFactory(walConf, TEST_UTIL.getRandomUUID().toString());<a name="line.4491"></a>
-<span class="sourceLineNo">4492</span>    final WAL wal = spy(wals.getWAL(RegionInfoBuilder.newBuilder(tableName).build()));<a name="line.4492"></a>
-<span class="sourceLineNo">4493</span>    this.region = initHRegion(tableName, HConstants.EMPTY_START_ROW,<a name="line.4493"></a>
-<span class="sourceLineNo">4494</span>        HConstants.EMPTY_END_ROW, false, tableDurability, wal,<a name="line.4494"></a>
-<span class="sourceLineNo">4495</span>        new byte[][] { family });<a name="line.4495"></a>
-<span class="sourceLineNo">4496</span><a name="line.4496"></a>
-<span class="sourceLineNo">4497</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.4497"></a>
-<span class="sourceLineNo">4498</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.4498"></a>
-<span class="sourceLineNo">4499</span>    put.setDurability(mutationDurability);<a name="line.4499"></a>
-<span class="sourceLineNo">4500</span>    region.put(put);<a name="line.4500"></a>
-<span class="sourceLineNo">4501</span><a name="line.4501"></a>
-<span class="sourceLineNo">4502</span>    //verify append called or not<a name="line.4502"></a>
-<span class="sourceLineNo">4503</span>    verify(wal, expectAppend ? times(1) : never())<a name="line.4503"></a>
-<span class="sourceLineNo">4504</span>      .append((HRegionInfo)any(), (WALKeyImpl)any(),<a name="line.4504"></a>
-<span class="sourceLineNo">4505</span>          (WALEdit)any(), Mockito.anyBoolean());<a name="line.4505"></a>
+<span class="sourceLineNo">4479</span>    // expect skip wal cases<a name="line.4479"></a>
+<span class="sourceLineNo">4480</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4480"></a>
+<span class="sourceLineNo">4481</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4481"></a>
+<span class="sourceLineNo">4482</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4482"></a>
+<span class="sourceLineNo">4483</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4483"></a>
+<span class="sourceLineNo">4484</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4484"></a>
+<span class="sourceLineNo">4485</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.USE_DEFAULT, 0, false, false, false);<a name="line.4485"></a>
+<span class="sourceLineNo">4486</span><a name="line.4486"></a>
+<span class="sourceLineNo">4487</span>  }<a name="line.4487"></a>
+<span class="sourceLineNo">4488</span><a name="line.4488"></a>
+<span class="sourceLineNo">4489</span>  private void durabilityTest(String method, Durability tableDurability,<a name="line.4489"></a>
+<span class="sourceLineNo">4490</span>      Durability mutationDurability, long timeout, boolean expectAppend, final boolean expectSync,<a name="line.4490"></a>
+<span class="sourceLineNo">4491</span>      final boolean expectSyncFromLogSyncer) throws Exception {<a name="line.4491"></a>
+<span class="sourceLineNo">4492</span>    Configuration conf = HBaseConfiguration.create(CONF);<a name="line.4492"></a>
+<span class="sourceLineNo">4493</span>    method = method + "_" + tableDurability.name() + "_" + mutationDurability.name();<a name="line.4493"></a>
+<span class="sourceLineNo">4494</span>    byte[] family = Bytes.toBytes("family");<a name="line.4494"></a>
+<span class="sourceLineNo">4495</span>    Path logDir = new Path(new Path(dir + method), "log");<a name="line.4495"></a>
+<span class="sourceLineNo">4496</span>    final Configuration walConf = new Configuration(conf);<a name="line.4496"></a>
+<span class="sourceLineNo">4497</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.4497"></a>
+<span class="sourceLineNo">4498</span>    // XXX: The spied AsyncFSWAL can not work properly because of a Mockito defect that can not<a name="line.4498"></a>
+<span class="sourceLineNo">4499</span>    // deal with classes which have a field of an inner class. See discussions in HBASE-15536.<a name="line.4499"></a>
+<span class="sourceLineNo">4500</span>    walConf.set(WALFactory.WAL_PROVIDER, "filesystem");<a name="line.4500"></a>
+<span class="sourceLineNo">4501</span>    final WALFactory wals = new WALFactory(walConf, TEST_UTIL.getRandomUUID().toString());<a name="line.4501"></a>
+<span class="sourceLineNo">4502</span>    final WAL wal = spy(wals.getWAL(RegionInfoBuilder.newBuilder(tableName).build()));<a name="line.4502"></a>
+<span class="sourceLineNo">4503</span>    this.region = initHRegion(tableName, HConstants.EMPTY_START_ROW,<a name="line.4503"></a>
+<span class="sourceLineNo">4504</span>        HConstants.EMPTY_END_ROW, false, tableDurability, wal,<a name="line.4504"></a>
+<span class="sourceLineNo">4505</span>        new byte[][] { family });<a name="line.4505"></a>
 <span class="sourceLineNo">4506</span><a name="line.4506"></a>
-<span class="sourceLineNo">4507</span>    // verify sync called or not<a name="line.4507"></a>
-<span class="sourceLineNo">4508</span>    if (expectSync || expectSyncFromLogSyncer) {<a name="line.4508"></a>
-<span class="sourceLineNo">4509</span>      TEST_UTIL.waitFor(timeout, new Waiter.Predicate&lt;Exception&gt;() {<a name="line.4509"></a>
-<span class="sourceLineNo">4510</span>        @Override<a name="line.4510"></a>
-<span class="sourceLineNo">4511</span>        public boolean evaluate() throws Exception {<a name="line.4511"></a>
-<span class="sourceLineNo">4512</span>          try {<a name="line.4512"></a>
-<span class="sourceLineNo">4513</span>            if (expectSync) {<a name="line.4513"></a>
-<span class="sourceLineNo">4514</span>              verify(wal, times(1)).sync(anyLong()); // Hregion calls this one<a name="line.4514"></a>
-<span class="sourceLineNo">4515</span>            } else if (expectSyncFromLogSyncer) {<a name="line.4515"></a>
-<span class="sourceLineNo">4516</span>              verify(wal, times(1)).sync(); // wal syncer calls this one<a name="line.4516"></a>
-<span class="sourceLineNo">4517</span>            }<a name="line.4517"></a>
-<span class="sourceLineNo">4518</span>          } catch (Throwable ignore) {<a name="line.4518"></a>
-<span class="sourceLineNo">4519</span>          }<a name="line.4519"></a>
-<span class="sourceLineNo">4520</span>          return true;<a name="line.4520"></a>
-<span class="sourceLineNo">4521</span>        }<a name="line.4521"></a>
-<span class="sourceLineNo">4522</span>      });<a name="line.4522"></a>
-<span class="sourceLineNo">4523</span>    } else {<a name="line.4523"></a>
-<span class="sourceLineNo">4524</span>      //verify(wal, never()).sync(anyLong());<a name="line.4524"></a>
-<span class="sourceLineNo">4525</span>      verify(wal, never()).sync();<a name="line.4525"></a>
-<span class="sourceLineNo">4526</span>    }<a name="line.4526"></a>
-<span class="sourceLineNo">4527</span><a name="line.4527"></a>
-<span class="sourceLineNo">4528</span>    HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.4528"></a>
-<span class="sourceLineNo">4529</span>    wals.close();<a name="line.4529"></a>
-<span class="sourceLineNo">4530</span>    this.region = null;<a name="line.4530"></a>
-<span class="sourceLineNo">4531</span>  }<a name="line.4531"></a>
-<span class="sourceLineNo">4532</span><a name="line.4532"></a>
-<span class="sourceLineNo">4533</span>  @Test<a name="line.4533"></a>
-<span class="sourceLineNo">4534</span>  public void testRegionReplicaSecondary() throws IOException {<a name="line.4534"></a>
-<span class="sourceLineNo">4535</span>    // create a primary region, load some data and flush<a name="line.4535"></a>
-<span class="sourceLineNo">4536</span>    // create a secondary region, and do a get against that<a name="line.4536"></a>
-<span class="sourceLineNo">4537</span>    Path rootDir = new Path(dir + name.getMethodName());<a name="line.4537"></a>
-<span class="sourceLineNo">4538</span>    FSUtils.setRootDir(TEST_UTIL.getConfiguration(), rootDir);<a name="line.4538"></a>
-<span class="sourceLineNo">4539</span><a name="line.4539"></a>
-<span class="sourceLineNo">4540</span>    byte[][] families = new byte[][] {<a name="line.4540"></a>
-<span class="sourceLineNo">4541</span>        Bytes.toBytes("cf1"), Bytes.toBytes("cf2"), Bytes.toBytes("cf3")<a name="line.4541"></a>
-<span class="sourceLineNo">4542</span>    };<a name="line.4542"></a>
-<span class="sourceLineNo">4543</span>    byte[] cq = Bytes.toBytes("cq");<a name="line.4543"></a>
-<span class="sourceLineNo">4544</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.4544"></a>
-<span class="sourceLineNo">4545</span>    for (byte[] family : families) {<a name="line.4545"></a>
-<span class="sourceLineNo">4546</span>      htd.addFamily(new HColumnDescriptor(family));<a name="line.4546"></a>
-<span class="sourceLineNo">4547</span>    }<a name="line.4547"></a>
-<span class="sourceLineNo">4548</span><a name="line.4548"></a>
-<span class="sourceLineNo">4549</span>    long time = System.currentTimeMillis();<a name="line.4549"></a>
-<span class="sourceLineNo">4550</span>    HRegionInfo primaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4550"></a>
-<span class="sourceLineNo">4551</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4551"></a>
-<span class="sourceLineNo">4552</span>      false, time, 0);<a name="line.4552"></a>
-<span class="sourceLineNo">4553</span>    HRegionInfo secondaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4553"></a>
-<span class="sourceLineNo">4554</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4554"></a>
-<span class="sourceLineNo">4555</span>      false, time, 1);<a name="line.4555"></a>
-<span class="sourceLineNo">4556</span><a name="line.4556"></a>
-<span class="sourceLineNo">4557</span>    HRegion primaryRegion = null, secondaryRegion = null;<a name="line.4557"></a>
+<span class="sourceLineNo">4507</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.4507"></a>
+<span class="sourceLineNo">4508</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.4508"></a>
+<span class="sourceLineNo">4509</span>    put.setDurability(mutationDurability);<a name="line.4509"></a>
+<span class="sourceLineNo">4510</span>    region.put(put);<a name="line.4510"></a>
+<span class="sourceLineNo">4511</span><a name="line.4511"></a>
+<span class="sourceLineNo">4512</span>    //verify append called or not<a name="line.4512"></a>
+<span class="sourceLineNo">4513</span>    verify(wal, expectAppend ? times(1) : never())<a name="line.4513"></a>
+<span class="sourceLineNo">4514</span>      .append((HRegionInfo)any(), (WALKeyImpl)any(),<a name="line.4514"></a>
+<span class="sourceLineNo">4515</span>          (WALEdit)any(), Mockito.anyBoolean());<a name="line.4515"></a>
+<span class="sourceLineNo">4516</span><a name="line.4516"></a>
+<span class="sourceLineNo">4517</span>    // verify sync called or not<a name="line.4517"></a>
+<span class="sourceLineNo">4518</span>    if (expectSync || expectSyncFromLogSyncer) {<a name="line.4518"></a>
+<span class="sourceLineNo">4519</span>      TEST_UTIL.waitFor(timeout, new Waiter.Predicate&lt;Exception&gt;() {<a name="line.4519"></a>
+<span class="sourceLineNo">4520</span>        @Override<a name="line.4520"></a>
+<span class="sourceLineNo">4521</span>        public boolean evaluate() throws Exception {<a name="line.4521"></a>
+<span class="sourceLineNo">4522</span>          try {<a name="line.4522"></a>
+<span class="sourceLineNo">4523</span>            if (expectSync) {<a name="line.4523"></a>
+<span class="sourceLineNo">4524</span>              verify(wal, times(1)).sync(anyLong()); // Hregion calls this one<a name="line.4524"></a>
+<span class="sourceLineNo">4525</span>            } else if (expectSyncFromLogSyncer) {<a name="line.4525"></a>
+<span class="sourceLineNo">4526</span>              verify(wal, times(1)).sync(); // wal syncer calls this one<a name="line.4526"></a>
+<span class="sourceLineNo">4527</span>            }<a name="line.4527"></a>
+<span class="sourceLineNo">4528</span>          } catch (Throwable ignore) {<a name="line.4528"></a>
+<span class="sourceLineNo">4529</span>          }<a name="line.4529"></a>
+<span class="sourceLineNo">4530</span>          return true;<a name="line.4530"></a>
+<span class="sourceLineNo">4531</span>        }<a name="line.4531"></a>
+<span class="sourceLineNo">4532</span>      });<a name="line.4532"></a>
+<span class="sourceLineNo">4533</span>    } else {<a name="line.4533"></a>
+<span class="sourceLineNo">4534</span>      //verify(wal, never()).sync(anyLong());<a name="line.4534"></a>
+<span class="sourceLineNo">4535</span>      verify(wal, never()).sync();<a name="line.4535"></a>
+<span class="sourceLineNo">4536</span>    }<a name="line.4536"></a>
+<span class="sourceLineNo">4537</span><a name="line.4537"></a>
+<span class="sourceLineNo">4538</span>    HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.4538"></a>
+<span class="sourceLineNo">4539</span>    wals.close();<a name="line.4539"></a>
+<span class="sourceLineNo">4540</span>    this.region = null;<a name="line.4540"></a>
+<span class="sourceLineNo">4541</span>  }<a name="line.4541"></a>
+<span class="sourceLineNo">4542</span><a name="line.4542"></a>
+<span class="sourceLineNo">4543</span>  @Test<a name="line.4543"></a>
+<span class="sourceLineNo">4544</span>  public void testRegionReplicaSecondary() throws IOException {<a name="line.4544"></a>
+<span class="sourceLineNo">4545</span>    // create a primary region, load some data and flush<a name="line.4545"></a>
+<span class="sourceLineNo">4546</span>    // create a secondary region, and do a get against that<a name="line.4546"></a>
+<span class="sourceLineNo">4547</span>    Path rootDir = new Path(dir + name.getMethodName());<a name="line.4547"></a>
+<span class="sourceLineNo">4548</span>    FSUtils.setRootDir(TEST_UTIL.getConfiguration(), rootDir);<a name="line.4548"></a>
+<span class="sourceLineNo">4549</span><a name="line.4549"></a>
+<span class="sourceLineNo">4550</span>    byte[][] families = new byte[][] {<a name="line.4550"></a>
+<span class="sourceLineNo">4551</span>        Bytes.toBytes("cf1"), Bytes.toBytes("cf2"), Bytes.toBytes("cf3")<a name="line.4551"></a>
+<span class="sourceLineNo">4552</span>    };<a name="line.4552"></a>
+<span class="sourceLineNo">4553</span>    byte[] cq = Bytes.toBytes("cq");<a name="line.4553"></a>
+<span class="sourceLineNo">4554</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.4554"></a>
+<span class="sourceLineNo">4555</span>    for (byte[] family : families) {<a name="line.4555"></a>
+<span class="sourceLineNo">4556</span>      htd.addFamily(new HColumnDescriptor(family));<a name="line.4556"></a>
+<span class="sourceLineNo">4557</span>    }<a name="line.4557"></a>
 <span class="sourceLineNo">4558</span><a name="line.4558"></a>
-<span class="sourceLineNo">4559</span>    try {<a name="line.4559"></a>
-<span class="sourceLineNo">4560</span>      primaryRegion = HBaseTestingUtility.createRegionAndWAL(primaryHri,<a name="line.4560"></a>
-<span class="sourceLineNo">4561</span>          rootDir, TEST_UTIL.getConfiguration(), htd);<a name="line.4561"></a>
-<span class="sourceLineNo">4562</span><a name="line.4562"></a>
-<span class="sourceLineNo">4563</span>      // load some data<a name="line.4563"></a>
-<span class="sourceLineNo">4564</span>      putData(primaryRegion, 0, 1000, cq, families);<a name="line.4564"></a>
-<span class="sourceLineNo">4565</span><a name="line.4565"></a>
-<span class="sourceLineNo">4566</span>      // flush region<a name="line.4566"></a>
-<span class="sourceLineNo">4567</span>      primaryRegion.flush(true);<a name="line.4567"></a>
+<span class="sourceLineNo">4559</span>    long time = System.currentTimeMillis();<a name="line.4559"></a>
+<span class="sourceLineNo">4560</span>    HRegionInfo primaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4560"></a>
+<span class="sourceLineNo">4561</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4561"></a>
+<span class="sourceLineNo">4562</span>      false, time, 0);<a name="line.4562"></a>
+<span class="sourceLineNo">4563</span>    HRegionInfo secondaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4563"></a>
+<span class="sourceLineNo">4564</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4564"></a>
+<span class="sourceLineNo">4565</span>      false, time, 1);<a name="line.4565"></a>
+<span class="sourceLineNo">4566</span><a name="line.4566"></a>
+<span class="sourceLineNo">4567</span>    HRegion primaryRegion = null, secondaryRegion = null;<a name="line.4567"></a>
 <span class="sourceLineNo">4568</span><a name="line.4568"></a>
-<span class="sourceLineNo">4569</span>      // open secondary region<a name="line.4569"></a>
-<span class="sourceLineNo">4570</span>      secondaryRegion = HRegion.openHRegion(rootDir, secondaryHri, htd, null, CONF);<a name="line.4570"></a>
-<span class="sourceLineNo">4571</span><a name="line.4571"></a>
-<span class="sourceLineNo">4572</span>      verifyData(secondaryRegion, 0, 1000, cq, families);<a name="line.4572"></a>
-<span class="sourceLineNo">4573</span>    } finally {<a name="line.4573"></a>
-<span class="sourceLineNo">4574</span>      if (primaryRegion != null) {<a name="line.4574"></a>
-<span class="sourceLineNo">4575</span>        HBaseTestingUtility.closeRegionAndWAL(primaryRegion);<a name="line.4575"></a>
-<span class="sourceLineNo">4576</span>      }<a name="line.4576"></a>
-<span class="sourceLineNo">4577</span>      if (secondaryRegion != null) {<a name="line.4577"></a>
-<span class="sourceLineNo">4578</span>        HBaseTestingUtility.closeRegionAndWAL(secondaryRegion);<a name="line.4578"></a>
-<span class="sourceLineNo">4579</span>      }<a name="line.4579"></a>
-<span class="sourceLineNo">4580</span>    }<a name="line.4580"></a>
-<span class="sourceLineNo">4581</span>  }<a name="line.4581"></a>
-<span class="sourceLineNo">4582</span><a name="line.4582"></a>
-<span class="sourceLineNo">4583</span>  @Test<a name="line.4583"></a>
-<span class="sourceLineNo">4584</span>  public void testRegionReplicaSecondaryIsReadOnly() throws IOException {<a name="line.4584"></a>
-<span class="sourceLineNo">4585</span>    // create a primary region, load some data and flush<a name="line.4585"></a>
-<span class="sourceLineNo">4586</span>    // create a secondary region, and do a put against that<a name="line.4586"></a>
-<span class="sourceLineNo">4587</span>    Path rootDir = new Path(dir + name.getMethodName());<a name="line.4587"></a>
-<span class="sourceLineNo">4588</span>    FSUtils.setRootDir(TEST_UTIL.getConfiguration(), rootDir);<a name="line.4588"></a>
-<span class="sourceLineNo">4589</span><a name="line.4589"></a>
-<span class="sourceLineNo">4590</span>    byte[][] families = new byte[][] {<a name="line.4590"></a>
-<span class="sourceLineNo">4591</span>        Bytes.toBytes("cf1"), Bytes.toBytes("cf2"), Bytes.toBytes("cf3")<a name="line.4591"></a>
-<span class="sourceLineNo">4592</span>    };<a name="line.4592"></a>
-<span class="sourceLineNo">4593</span>    byte[] cq = Bytes.toBytes("cq");<a name="line.4593"></a>
-<span class="sourceLineNo">4594</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.4594"></a>
-<span class="sourceLineNo">4595</span>    for (byte[] family : families) {<a name="line.4595"></a>
-<span class="sourceLineNo">4596</span>      htd.addFamily(new HColumnDescriptor(family));<a name="line.4596"></a>
-<span class="sourceLineNo">4597</span>    }<a name="line.4597"></a>
-<span class="sourceLineNo">4598</span><a name="line.4598"></a>
-<span class="sourceLineNo">4599</span>    long time = System.currentTimeMillis();<a name="line.4599"></a>
-<span class="sourceLineNo">4600</span>    HRegionInfo primaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4600"></a>
-<span class="sourceLineNo">4601</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4601"></a>
-<span class="sourceLineNo">4602</span>      false, time, 0);<a name="line.4602"></a>
-<span class="sourceLineNo">4603</span>    HRegionInfo secondaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4603"></a>
-<span class="sourceLineNo">4604</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4604"></a>
-<span class="sourceLineNo">4605</span>      false, time, 1);<a name="line.4605"></a>
-<span class="sourceLineNo">4606</span><a name="line.4606"></a>
-<span class="sourceLineNo">4607</span>    HRegion primaryRegion = null, secondaryRegion = null;<a name="line.4607"></a>
+<span class="sourceLineNo">4569</span>    try {<a name="line.4569"></a>
+<span class="sourceLineNo">4570</span>      primaryRegion = HBaseTestingUtility.createRegionAndWAL(primaryHri,<a name="line.4570"></a>
+<span class="sourceLineNo">4571</span>          rootDir, TEST_UTIL.getConfiguration(), htd);<a name="line.4571"></a>
+<span class="sourceLineNo">4572</span><a name="line.4572"></a>
+<span class="sourceLineNo">4573</span>      // load some data<a name="line.4573"></a>
+<span class="sourceLineNo">4574</span>      putData(primaryRegion, 0, 1000, cq, families);<a name="line.4574"></a>
+<span class="sourceLineNo">4575</span><a name="line.4575"></a>
+<span class="sourceLineNo">4576</span>      // flush region<a name="line.4576"></a>
+<span class="sourceLineNo">4577</span>      primaryRegion.flush(true);<a name="line.4577"></a>
+<span class="sourceLineNo">4578</span><a name="line.4578"></a>
+<span class="sourceLineNo">4579</span>      // open secondary region<a name="line.4579"></a>
+<span class="sourceLineNo">4580</span>      secondaryRegion = HRegion.openHRegion(rootDir, secondaryHri, htd, null, CONF);<a name="line.4580"></a>
+<span class="sourceLineNo">4581</span><a name="line.4581"></a>
+<span class="sourceLineNo">4582</span>      verifyData(secondaryRegion, 0, 1000, cq, families);<a name="line.4582"></a>
+<span class="sourceLineNo">4583</span>    } finally {<a name="line.4583"></a>
+<span class="sourceLineNo">4584</span>      if (primaryRegion != null) {<a name="line.4584"></a>
+<span class="sourceLineNo">4585</span>        HBaseTestingUtility.closeRegionAndWAL(primaryRegion);<a name="line.4585"></a>
+<span class="sourceLineNo">4586</span>      }<a name="line.4586"></a>
+<span class="sourceLineNo">4587</span>      if (secondaryRegion != null) {<a name="line.4587"></a>
+<span class="sourceLineNo">4588</span>        HBaseTestingUtility.closeRegionAndWAL(secondaryRegion);<a name="line.4588"></a>
+<span class="sourceLineNo">4589</span>      }<a name="line.4589"></a>
+<span class="sourceLineNo">4590</span>    }<a name="line.4590"></a>
+<span class="sourceLineNo">4591</span>  }<a name="line.4591"></a>
+<span class="sourceLineNo">4592</span><a name="line.4592"></a>
+<span class="sourceLineNo">4593</span>  @Test<a name="line.4593"></a>
+<span class="sourceLineNo">4594</span>  public void testRegionReplicaSecondaryIsReadOnly() throws IOException {<a name="line.4594"></a>
+<span class="sourceLineNo">4595</span>    // create a primary region, load some data and flush<a name="line.4595"></a>
+<span class="sourceLineNo">4596</span>    // create a secondary region, and do a put against that<a name="line.4596"></a>
+<span class="sourceLineNo">4597</span>    Path rootDir = new Path(dir + name.getMethodName());<a name="line.4597"></a>
+<span class="sourceLineNo">4598</span>    FSUtils.setRootDir(TEST_UTIL.getConfiguration(), rootDir);<a name="line.4598"></a>
+<span class="sourceLineNo">4599</span><a name="line.4599"></a>
+<span class="sourceLineNo">4600</span>    byte[][] families = new byte[][] {<a name="line.4600"></a>
+<span class="sourceLineNo">4601</span>        Bytes.toBytes("cf1"), Bytes.toBytes("cf2"), Bytes.toBytes("cf3")<a name="line.4601"></a>
+<span class="sourceLineNo">4602</span>    };<a name="line.4602"></a>
+<span class="sourceLineNo">4603</span>    byte[] cq = Bytes.toBytes("cq");<a name="line.4603"></a>
+<span class="sourceLineNo">4604</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.4604"></a>
+<span class="sourceLineNo">4605</span>    for (byte[] family : families) {<a name="line.4605"></a>
+<span class="sourceLineNo">4606</span>      htd.addFamily(new HColumnDescriptor(family));<a name="line.4606"></a>
+<span class="sourceLineNo">4607</span>    }<a name="line.4607"></a>
 <span class="sourceLineNo">4608</span><a name="line.4608"></a>
-<span class="sourceLineNo">4609</span>    try {<a name="line.4609"></a>
-<span class="sourceLineNo">4610</span>      primaryRegion = HBaseTestingUtility.createRegionAndWAL(primaryHri,<a name="line.4610"></a>
-<span class="sourceLineNo">4611</span>          rootDir, TEST_UTIL.getConfiguration(), htd);<a name="line.4611"></a>
-<span class="sourceLineNo">4612</span><a name="line.4612"></a>
-<span class="sourceLineNo">4613</span>      // load some data<a name="line.4613"></a>
-<span class="sourceLineNo">4614</span>      putData(primaryRegion, 0, 1000, cq, families);<a name="line.4614"></a>
-<span class="sourceLineNo">4615</span><a name="line.4615"></a>
-<span class="sourceLineNo">4616</span>      // flush region<a name="line.4616"></a>
-<span class="sourceLineNo">4617</span>      primaryRegion.flush(true);<a name="line.4617"></a>
+<span class="sourceLineNo">4609</span>    long time = System.currentTimeMillis();<a name="line.4609"></a>
+<span class="sourceLineNo">4610</span>    HRegionInfo primaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4610"></a>
+<span class="sourceLineNo">4611</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4611"></a>
+<span class="sourceLineNo">4612</span>      false, time, 0);<a name="line.4612"></a>
+<span class="sourceLineNo">4613</span>    HRegionInfo secondaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4613"></a>
+<span class="sourceLineNo">4614</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4614"></a>
+<span class="sourceLineNo">4615</span>      false, time, 1);<a name="line.4615"></a>
+<span class="sourceLineNo">4616</span><a name="line.4616"></a>
+<span class="sourceLineNo">4617</span>    HRegion primaryRegion = null, secondaryRegion = null;<a name="line.4617"></a>
 <span class="sourceLineNo">4618</span><a name="line.4618"></a>
-<span class="sourceLineNo">4619</span>      // open secondary region<a name="line.4619"></a>
-<span class="sourceLineNo">4620</span>      secondaryRegion = HRegion.openHRegion(rootDir, secondaryHri, htd, null, CONF);<a name="line.4620"></a>
-<span class="sourceLineNo">4621</span><a name="line.4621"></a>
-<span class="sourceLineNo">4622</span>      try {<a name="line.4622"></a>
-<span class="sourceLineNo">4623</span>        putData(secondaryRegion, 0, 1000, cq, families);<a name="line.4623"></a>
-<span class="sourceLineNo">4624</span>        fail("Should have thrown exception");<a name="line.4624"></a>
-<span class="sourceLineNo">4625</span>      } catch (IOException ex) {<a name="line.4625"></a>
-<span class="sourceLineNo">4626</span>        // expected<a name="line.4626"></a>
-<span class="sourceLineNo">4627</span>      }<a name="line.4627"></a>
-<span class="sourceLineNo">4628</span>    } finally {<a name="line.4628"></a>
-<span class="sourceLineNo">4629</span>      if (primaryRegion != null) {<a name="line.4629"></a>
-<span class="sourceLineNo">4630</span>        HBaseTestingUtility.closeRegionAndWAL(primaryRegion);<a name="line.4630"></a>
-<span class="sourceLineNo">4631</span>      }<a name="line.4631"></a>
-<span class="sourceLineNo">4632</span>      if (secondaryRegion != null) {<a name="line.4632"></a>
-<span class="sourceLineNo">4633</span>        HBaseTestingUtility.closeRegionAndWAL(secondaryRegion);<a name="line.4633"></a>
-<span class="sourceLineNo">4634</span>      }<a name="line.4634"></a>
-<span class="sourceLineNo">4635</span>    }<a name="line.4635"></a>
-<span class="sourceLineNo">4636</span>  }<a name="line.4636"></a>
-<span class="sourceLineNo">4637</span><a name="line.4637"></a>
-<span class="sourceLineNo">4638</span>  static WALFactory createWALFactory(Configuration conf, Path rootDir) throws IOException {<a name="line.4638"></a>
-<span class="sourceLineNo">4639</span>    Configuration confForWAL = new Configuration(conf);<a name="line.4639"></a>
-<span class="sourceLineNo">4640</span>    confForWAL.set(HConstants.HBASE_DIR, rootDir.toString());<a name="line.4640"></a>
-<span class="sourceLineNo">4641</span>    return new WALFactory(confForWAL, "hregion-" + RandomStringUtils.randomNumeric(8));<a name="line.4641"></a>
-<span class="sourceLineNo">4642</span>  }<a name="line.4642"></a>
-<span class="sourceLineNo">4643</span><a name="line.4643"></a>
-<span class="sourceLineNo">4644</span>  @Test<a name="line.4644"></a>
-<span class="sourceLineNo">4645</span>  public void testCompactionFromPrimary() throws IOException {<a name="line.4645"></a>
-<span class="sourceLineNo">4646</span>    Path rootDir = new Path(dir + name.getMethodName());<a name="line.4646"></a>
-<span class="sourceLineNo">4647</span>    FSUtils.setRootDir(TEST_UTIL.getConfiguration(), rootDir);<a name="line.4647"></a>
-<span class="sourceLineNo">4648</span><a name="line.4648"></a>
-<span class="sourceLineNo">4649</span>    byte[][] families = new byte[][] {<a name="line.4649"></a>
-<span class="sourceLineNo">4650</span>        Bytes.toBytes("cf1"), Bytes.toBytes("cf2"), Bytes.toBytes("cf3")<a name="line.4650"></a>
-<span class="sourceLineNo">4651</span>    };<a name="line.4651"></a>
-<span class="sourceLineNo">4652</span>    byte[] cq = Bytes.toBytes("cq");<a name="line.4652"></a>
-<span class="sourceLineNo">4653</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.4653"></a>
-<span class="sourceLineNo">4654</span>    for (byte[] family : families) {<a name="line.4654"></a>
-<span class="sourceLineNo">4655</span>      htd.addFamily(new HColumnDescriptor(family));<a name="line.4655"></a>
-<span class="sourceLineNo">4656</span>    }<a name="line.4656"></a>
-<span class="sourceLineNo">4657</span><a name="line.4657"></a>
-<span class="sourceLineNo">4658</span>    long time = System.currentTimeMillis();<a name="line.4658"></a>
-<span class="sourceLineNo">4659</span>    HRegionInfo primaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4659"></a>
-<span class="sourceLineNo">4660</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4660"></a>
-<span class="sourceLineNo">4661</span>      false, time, 0);<a name="line.4661"></a>
-<span class="sourceLineNo">4662</span>    HRegionInfo secondaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4662"></a>
-<span class="sourceLineNo">4663</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4663"></a>
-<span class="sourceLineNo">4664</span>      false, time, 1);<a name="line.4664"></a>
-<span class="sourceLineNo">4665</span><a name="line.4665"></a>
-<span class="sourceLineNo">4666</span>    HRegion primaryRegion = null, secondaryRegion = null;<a name="line.4666"></a>
+<span class="sourceLineNo">4619</span>    try {<a name="line.4619"></a>
+<span class="sourceLineNo">4620</span>      primaryRegion = HBaseTestingUtility.createRegionAndWAL(primaryHri,<a name="line.4620"></a>
+<span class="sourceLineNo">4621</span>          rootDir, TEST_UTIL.getConfiguration(), htd);<a name="line.4621"></a>
+<span class="sourceLineNo">4622</span><a name="line.4622"></a>
+<span class="sourceLineNo">4623</span>      // load some data<a name="line.4623"></a>
+<span class="sourceLineNo">4624</span>      putData(primaryRegion, 0, 1000, cq, families);<a name="line.4624"></a>
+<span class="sourceLineNo">4625</span><a name="line.4625"></a>
+<span class="sourceLineNo">4626</span>      // flush region<a name="line.4626"></a>
+<span class="sourceLineNo">4627</span>      primaryRegion.flush(true);<a name="line.4627"></a>
+<span class="sourceLineNo">4628</span><a name="line.4628"></a>
+<span class="sourceLineNo">4629</span>      // open secondary region<a name="line.4629"></a>
+<span class="sourceLineNo">4630</span>      secondaryRegion = HRegion.openHRegion(rootDir, secondaryHri, htd, null, CONF);<a name="line.4630"></a>
+<span class="sourceLineNo">4631</span><a name="line.4631"></a>
+<span class="sourceLineNo">4632</span>      try {<a name="line.4632"></a>
+<span class="sourceLineNo">4633</span>        putData(secondaryRegion, 0, 1000, cq, families);<a name="line.4633"></a>
+<span class="sourceLineNo">4634</span>        fail("Should have thrown exception");<a name="line.4634"></a>
+<span class="sourceLineNo">4635</span>      } catch (IOException ex) {<a name="line.4635"></a>
+<span class="sourceLineNo">4636</span>        // expected<a name="line.4636"></a>
+<span class="sourceLineNo">4637</span>      }<a name="line.4637"></a>
+<span class="sourceLineNo">4638</span>    } finally {<a name="line.4638"></a>
+<span class="sourceLineNo">4639</span>      if (primaryRegion != null) {<a name="line.4639"></a>
+<span class="sourceLineNo">4640</span>        HBaseTestingUtility.closeRegionAndWAL(primaryRegion);<a name="line.4640"></a>
+<span class="sourceLineNo">4641</span>      }<a name="line.4641"></a>
+<span class="sourceLineNo">4642</span>      if (secondaryRegion != null) {<a name="line.4642"></a>
+<span class="sourceLineNo">4643</span>        HBaseTestingUtility.closeRegionAndWAL(secondaryRegion);<a name="line.4643"></a>
+<span class="sourceLineNo">4644</span>      }<a name="line.4644"></a>
+<span class="sourceLineNo">4645</span>    }<a name="line.4645"></a>
+<span class="sourceLineNo">4646</span>  }<a name="line.4646"></a>
+<span class="sourceLineNo">4647</span><a name="line.4647"></a>
+<span class="sourceLineNo">4648</span>  static WALFactory createWALFactory(Configuration conf, Path rootDir) throws IOException {<a name="line.4648"></a>
+<span class="sourceLineNo">4649</span>    Configuration confForWAL = new Configuration(conf);<a name="line.4649"></a>
+<span class="sourceLineNo">4650</span>    confForWAL.set(HConstants.HBASE_DIR, rootDir.toString());<a name="line.4650"></a>
+<span class="sourceLineNo">4651</span>    return new WALFactory(confForWAL, "hregion-" + RandomStringUtils.randomNumeric(8));<a name="line.4651"></a>
+<span class="sourceLineNo">4652</span>  }<a name="line.4652"></a>
+<span class="sourceLineNo">4653</span><a name="line.4653"></a>
+<span class="sourceLineNo">4654</span>  @Test<a name="line.4654"></a>
+<span class="sourceLineNo">4655</span>  public void testCompactionFromPrimary() throws IOException {<a name="line.4655"></a>
+<span class="sourceLineNo">4656</span>    Path rootDir = new Path(dir + name.getMethodName());<a name="line.4656"></a>
+<span class="sourceLineNo">4657</span>    FSUtils.setRootDir(TEST_UTIL.getConfiguration(), rootDir);<a name="line.4657"></a>
+<span class="sourceLineNo">4658</span><a name="line.4658"></a>
+<span class="sourceLineNo">4659</span>    byte[][] families = new byte[][] {<a name="line.4659"></a>
+<span class="sourceLineNo">4660</span>        Bytes.toBytes("cf1"), Bytes.toBytes("cf2"), Bytes.toBytes("cf3")<a name="line.4660"></a>
+<span class="sourceLineNo">4661</span>    };<a name="line.4661"></a>
+<span class="sourceLineNo">4662</span>    byte[] cq = Bytes.toBytes("cq");<a name="line.4662"></a>
+<span class="sourceLineNo">4663</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.4663"></a>
+<span class="sourceLineNo">4664</span>    for (byte[] family : families) {<a name="line.4664"></a>
+<span class="sourceLineNo">4665</span>      htd.addFamily(new HColumnDescriptor(family));<a name="line.4665"></a>
+<span class="sourceLineNo">4666</span>    }<a name="line.4666"></a>
 <span class="sourceLineNo">4667</span><a name="line.4667"></a>
-<span class="sourceLineNo">4668</span>    try {<a name="line.4668"></a>
-<span class="sourceLineNo">4669</span>      primaryRegion = HBaseTestingUtility.createRegionAndWAL(primaryHri,<a name="line.4669"></a>
-<span class="sourceLineNo">4670</span>          rootDir, TEST_UTIL.getConfiguration(), htd);<a name="line.4670"></a>
-<span class="sourceLineNo">4671</span><a name="line.4671"></a>
-<span class="sourceLineNo">4672</span>      // load some data<a name="line.4672"></a>
-<span class="sourceLineNo">4673</span>      putData(primaryRegion, 0, 1000, cq, families);<a name="line.4673"></a>
-<span class="sourceLineNo">4674</span><a name="line.4674"></a>
-<span class="sourceLineNo">4675</span>      // flush region<a name="line.4675"></a>
-<span class="sourceLineNo">4676</span>      primaryRegion.flush(true);<a name="line.4676"></a>
+<span class="sourceLineNo">4668</span>    long time = System.currentTimeMillis();<a name="line.4668"></a>
+<span class="sourceLineNo">4669</span>    HRegionInfo primaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4669"></a>
+<span class="sourceLineNo">4670</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4670"></a>
+<span class="sourceLineNo">4671</span>      false, time, 0);<a name="line.4671"></a>
+<span class="sourceLineNo">4672</span>    HRegionInfo secondaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4672"></a>
+<span class="sourceLineNo">4673</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4673"></a>
+<span class="sourceLineNo">4674</span>      false, time, 1);<a name="line.4674"></a>
+<span class="sourceLineNo">4675</span><a name="line.4675"></a>
+<span class="sourceLineNo">4676</span>    HRegion primaryRegion = null, secondaryRegion = null;<a name="line.4676"></a>
 <span class="sourceLineNo">4677</span><a name="line.4677"></a>
-<span class="sourceLineNo">4678</span>      // open secondary region<a name="line.4678"></a>
-<span class="sourceLineNo">4679</span>      secondaryRegion = HRegion.openHRegion(rootDir, secondaryHri, htd, null, CONF);<a name="line.4679"></a>
-<span class="sourceLineNo">4680</span><a name="line.4680"></a>
-<span class="sourceLineNo">4681</span>      // move the file of the primary region to the archive, simulating a compaction<a name="line.4681"></a>
-<span class="sourceLineNo">4682</span>      Collection&lt;HStoreFile&gt; storeFiles = primaryRegion.getStore(families[0]).getStorefiles();<a name="line.4682"></a>
-<span class="sourceLineNo">4683</span>      primaryRegion.getRegionFileSystem().removeStoreFiles(Bytes.toString(families[0]), storeFiles);<a name="line.4683"></a>
-<span class="sourceLineNo">4684</span>      Collection&lt;StoreFileInfo&gt; storeFileInfos = primaryRegion.getRegionFileSystem()<a name="line.4684"></a>
-<span class="sourceLineNo">4685</span>          .getStoreFiles(families[0]);<a name="line.4685"></a>
-<span class="sourceLineNo">4686</span>      Assert.assertTrue(storeFileInfos == null || storeFileInfos.isEmpty());<a name="line.4686"></a>
+<span class="sourceLineNo">4678</span>    try {<a name="line.4678"></a>
+<span class="sourceLineNo">4679</span>      primaryRegion = HBaseTestingUtility.createRegionAndWAL(primaryHri,<a name="line.4679"></a>
+<span class="sourceLineNo">4680</span>          rootDir, TEST_UTIL.getConfiguration(), htd);<a name="line.4680"></a>
+<span class="sourceLineNo">4681</span><a name="line.4681"></a>
+<span class="sourceLineNo">4682</span>      // load some data<a name="line.4682"></a>
+<span class="sourceLineNo">4683</span>      putData(primaryRegion, 0, 1000, cq, families);<a name="line.4683"></a>
+<span class="sourceLineNo">4684</span><a name="line.4684"></a>
+<span class="sourceLineNo">4685</span>      // flush region<a name="line.4685"></a>
+<span class="sourceLineNo">4686</span>      primaryRegion.flush(true);<a name="line.4686"></a>
 <span class="sourceLineNo">4687</span><a name="line.4687"></a>
-<span class="sourceLineNo">4688</span>      verifyData(secondaryRegion, 0, 1000, cq, families);<a name="line.4688"></a>
-<span class="sourceLineNo">4689</span>    } finally {<a name="line.4689"></a>
-<span class="sourceLineNo">4690</span>      if (primaryRegion != null) {<a name="line.4690"></a>
-<span class="sourceLineNo">4691</span>        HBaseTestingUtility.closeRegionAndWAL(primaryRegion);<a name="line.4691"></a>
-<span class="sourceLineNo">4692</span>      }<a name="line.4692"></a>
-<span class="sourceLineNo">4693</span>      if (secondaryRegion != null) {<a name="line.4693"></a>
-<span class="sourceLineNo">4694</span>        HBaseTestingUtility.closeRegionAndWAL(secondaryRegion);<a name="line.4694"></a>
-<span class="sourceLineNo">4695</span>      }<a name="line.4695"></a>
-<span class="sourceLineNo">4696</span>    }<a name="line.4696"></a>
-<span class="sourceLineNo">4697</span>  }<a name="line.4697"></a>
-<span class="sourceLineNo">4698</span><a name="line.4698"></a>
-<span class="sourceLineNo">4699</span>  private void putData(int startRow, int numRows, byte[] qf, byte[]... families) throws<a name="line.4699"></a>
-<span class="sourceLineNo">4700</span>      IOException {<a name="line.4700"></a>
-<span class="sourceLineNo">4701</span>    putData(this.region, startRow, numRows, qf, families);<a name="line.4701"></a>
-<span class="sourceLineNo">4702</span>  }<a name="line.4702"></a>
-<span class="sourceLineNo">4703</span><a name="line.4703"></a>
-<span class="sourceLineNo">4704</span>  private void putData(HRegion region,<a name="line.4704"></a>
-<span class="sourceLineNo">4705</span>      int startRow, int numRows, byte[] qf, byte[]... families) throws IOException {<a name="line.4705"></a>
-<span class="sourceLineNo">4706</span>    putData(region, Durability.SKIP_WAL, startRow, numRows, qf, families);<a name="line.4706"></a>
+<span class="sourceLineNo">4688</span>      // open secondary region<a name="line.4688"></a>
+<span class="sourceLineNo">4689</span>      secondaryRegion = HRegion.openHRegion(rootDir, secondaryHri, htd, null, CONF);<a name="line.4689"></a>
+<span class="sourceLineNo">4690</span><a name="line.4690"></a>
+<span class="sourceLineNo">4691</span>      // move the file of the primary region to the archive, simulating a compaction<a name="line.4691"></a>
+<span class="sourceLineNo">4692</span>      Collection&lt;HStoreFile&gt; storeFiles = primaryRegion.getStore(families[0]).getStorefiles();<a name="line.4692"></a>
+<span class="sourceLineNo">4693</span>      primaryRegion.getRegionFileSystem().removeStoreFiles(Bytes.toString(families[0]), storeFiles);<a name="line.4693"></a>
+<span class="sourceLineNo">4694</span>      Collection&lt;StoreFileInfo&gt; storeFileInfos = primaryRegion.getRegionFileSystem()<a name="line.4694"></a>
+<span class="sourceLineNo">4695</span>          .getStoreFiles(families[0]);<a name="line.4695"></a>
+<span class="sourceLineNo">4696</span>      Assert.assertTrue(storeFileInfos == null || storeFileInfos.isEmpty());<a name="line.4696"></a>
+<span class="sourceLineNo">4697</span><a name="line.4697"></a>
+<span class="sourceLineNo">4698</span>      verifyData(secondaryRegion, 0, 1000, cq, families);<a name="line.4698"></a>
+<span class="sourceLineNo">4699</span>    } finally {<a name="line.4699"></a>
+<span class="sourceLineNo">4700</span>      if (primaryRegion != null) {<a name="line.4700"></a>
+<span class="sourceLineNo">4701</span>        HBaseTestingUtility.closeRegionAndWAL(primaryRegion);<a name="line.4701"></a>
+<span class="sourceLineNo">4702</span>      }<a name="line.4702"></a>
+<span class="sourceLineNo">4703</span>      if (secondaryRegion != null) {<a name="line.4703"></a>
+<span class="sourceLineNo">4704</span>        HBaseTestingUtility.closeRegionAndWAL(secondaryRegion);<a name="line.4704"></a>
+<span class="sourceLineNo">4705</span>      }<a name="line.4705"></a>
+<span class="sourceLineNo">4706</span>    }<a name="line.4706"></a>
 <span class="sourceLineNo">4707</span>  }<a name="line.4707"></a>
 <span class="sourceLineNo">4708</span><a name="line.4708"></a>
-<span class="sourceLineNo">4709</span>  static void putData(HRegion region, Durability durability,<a name="line.4709"></a>
-<span class="sourceLineNo">4710</span>      int startRow, int numRows, byte[] qf, byte[]... families) throws IOException {<a name="line.4710"></a>
-<span class="sourceLineNo">4711</span>    for (int i = startRow; i &lt; startRow + numRows; i++) {<a name="line.4711"></a>
-<span class="sourceLineNo">4712</span>      Put put = new Put(Bytes.toBytes("" + i));<a name="line.4712"></a>
-<span class="sourceLineNo">4713</span>      put.setDurability(durability);<a name="line.4713"></a>
-<span class="sourceLineNo">4714</span>      for (byte[] family : families) {<a name="line.4714"></a>
-<span class="sourceLineNo">4715</span>        put.addColumn(family, qf, null);<a name="line.4715"></a>
-<span class="sourceLineNo">4716</span>      }<a name="line.4716"></a>
-<span class="sourceLineNo">4717</span>      region.put(put);<a name="line.4717"></a>
-<span class="sourceLineNo">4718</span>      LOG.info(put.toString());<a name="line.4718"></a>
-<span class="sourceLineNo">4719</span>    }<a name="line.4719"></a>
-<span class="sourceLineNo">4720</span>  }<a name="line.4720"></a>
-<span class="sourceLineNo">4721</span><a name="line.4721"></a>
-<span class="sourceLineNo">4722</span>  static void verifyData(HRegion newReg, int startRow, int numRows, byte[] qf, byte[]... families)<a name="line.4722"></a>
-<span class="sourceLineNo">4723</span>      throws IOException {<a name="line.4723"></a>
-<span class="sourceLineNo">4724</span>    for (int i = startRow; i &lt; startRow + numRows; i++) {<a name="line.4724"></a>
-<span class="sourceLineNo">4725</span>      byte[] row = Bytes.toBytes("" + i);<a name="line.4725"></a>
-<span class="sourceLineNo">4726</span>      Get get = new Get(row);<a name="line.4726"></a>
-<span class="sourceLineNo">4727</span>      for (byte[] family : families) {<a name="line.4727"></a>
-<span class="sourceLineNo">4728</span>        get.addColumn(family, qf);<a name="line.4728"></a>
-<span class="sourceLineNo">4729</span>      }<a name="line.4729"></a>
-<span class="sourceLineNo">4730</span>      Result result = newReg.get(get);<a name="line.4730"></a>
-<span class="sourceLineNo">4731</span>      Cell[] raw = result.rawCells();<a name="line.4731"></a>
-<span class="sourceLineNo">4732</span>      assertEquals(families.length, result.size());<a name="line.4732"></a>
-<span class="sourceLineNo">4733</span>      for (int j = 0; j &lt; families.length; j++) {<a name="line.4733"></a>
-<span class="sourceLineNo">4734</span>        assertTrue(CellUtil.matchingRows(raw[j], row));<a name="line.4734"></a>
-<span class="sourceLineNo">4735</span>        assertTrue(CellUtil.matchingFamily(raw[j], families[j]));<a name="line.4735"></a>
-<span class="sourceLineNo">4736</span>        assertTrue(CellUtil.matchingQualifier(raw[j], qf));<a name="line.4736"></a>
-<span class="sourceLineNo">4737</span>      }<a name="line.4737"></a>
-<span class="sourceLineNo">4738</span>    }<a name="line.4738"></a>
-<span class="sourceLineNo">4739</span>  }<a name="line.4739"></a>
-<span class="sourceLineNo">4740</span><a name="line.4740"></a>
-<span class="sourceLineNo">4741</span>  static void assertGet(final HRegion r, final byte[] family, final byte[] k) throws IOException {<a name="line.4741"></a>
-<span class="sourceLineNo">4742</span>    // Now I have k, get values out and assert they are as expected.<a name="line.4742"></a>
-<span class="sourceLineNo">4743</span>    Get get = new Get(k).addFamily(family).readAllVersions();<a name="line.4743"></a>
-<span class="sourceLineNo">4744</span>    Cell[] results = r.get(get).rawCells();<a name="line.4744"></a>
-<span class="sourceLineNo">4745</span>    for (int j = 0; j &lt; results.length; j++) {<a name="line.4745"></a>
-<span class="sourceLineNo">4746</span>      byte[] tmp = CellUtil.cloneValue(results[j]);<a name="line.4746"></a>
-<span class="sourceLineNo">4747</span>      // Row should be equal to value every time.<a name="line.4747"></a>
-<span class="sourceLineNo">4748</span>      assertTrue(Bytes.equals(k, tmp));<a name="line.4748"></a>
-<span class="sourceLineNo">4749</span>    }<a name="line.4749"></a>
-<span class="sourceLineNo">4750</span>  }<a name="line.4750"></a>
-<span class="sourceLineNo">4751</span><a name="line.4751"></a>
-<span class="sourceLineNo">4752</span>  /*<a name="line.4752"></a>
-<span class="sourceLineNo">4753</span>   * Assert first value in the passed region is &lt;code&gt;firstValue&lt;/code&gt;.<a name="line.4753"></a>
-<span class="sourceLineNo">4754</span>   *<a name="line.4754"></a>
-<span class="sourceLineNo">4755</span>   * @param r<a name="line.4755"></a>
-<span class="sourceLineNo">4756</span>   *<a name="line.4756"></a>
-<span class="sourceLineNo">4757</span>   * @param fs<a name="line.4757"></a>
-<span class="sourceLineNo">4758</span>   *<a name="line.4758"></a>
-<span class="sourceLineNo">4759</span>   * @param firstValue<a name="line.4759"></a>
-<span class="sourceLineNo">4760</span>   *<a name="line.4760"></a>
-<span class="sourceLineNo">4761</span>   * @throws IOException<a name="line.4761"></a>
-<span class="sourceLineNo">4762</span>   */<a name="line.4762"></a>
-<span class="sourceLineNo">4763</span>  protected void assertScan(final HRegion r, final byte[] fs, final byte[] firstValue)<a name="line.4763"></a>
-<span class="sourceLineNo">4764</span>      throws IOException {<a name="line.4764"></a>
-<span class="sourceLineNo">4765</span>    byte[][] families = { fs };<a name="line.4765"></a>
-<span class="sourceLineNo">4766</span>    Scan scan = new Scan();<a name="line.4766"></a>
-<span class="sourceLineNo">4767</span>    for (int i = 0; i &lt; families.length; i++)<a name="line.4767"></a>
-<span class="sourceLineNo">4768</span>      scan.addFamily(families[i]);<a name="line.4768"></a>
-<span class="sourceLineNo">4769</span>    InternalScanner s = r.getScanner(scan);<a name="line.4769"></a>
-<span class="sourceLineNo">4770</span>    try {<a name="line.4770"></a>
-<span class="sourceLineNo">4771</span>      List&lt;Cell&gt; curVals = new ArrayList&lt;&gt;();<a name="line.4771"></a>
-<span class="sourceLineNo">4772</span>      boolean first = true;<a name="line.4772"></a>
-<span class="sourceLineNo">4773</span>      OUTER_LOOP: while (s.next(curVals)) {<a name="line.4773"></a>
-<span class="sourceLineNo">4774</span>        for (Cell kv : curVals) {<a name="line.4774"></a>
-<span class="sourceLineNo">4775</span>          byte[] val = CellUtil.cloneValue(kv);<a name="line.4775"></a>
-<span class="sourceLineNo">4776</span>          byte[] curval = val;<a name="line.4776"></a>
-<span class="sourceLineNo">4777</span>          if (first) {<a name="line.4777"></a>
-<span class="sourceLineNo">4778</span>            first = false;<a name="line.4778"></a>
-<span class="sourceLineNo">4779</span>            assertTrue(Bytes.compareTo(curval, firstValue) == 0);<a name="line.4779"></a>
-<span class="sourceLineNo">4780</span>          } else {<a name="line.4780"></a>
-<span class="sourceLineNo">4781</span>            // Not asserting anything. Might as well break.<a name="line.4781"></a>
-<span class="sourceLineNo">4782</span>            break OUTER_LOOP;<a name="line.4782"></a>
-<span class="sourceLineNo">4783</span>          }<a name="line.4783"></a>
-<span class="sourceLineNo">4784</span>        }<a name="line.4784"></a>
-<span class="sourceLineNo">4785</span>      }<a name="line.4785"></a>
-<span class="sourceLineNo">4786</span>    } finally {<a name="line.4786"></a>
-<span class="sourceLineNo">4787</span>      s.close();<a name="line.4787"></a>
-<span class="sourceLineNo">4788</span>    }<a name="line.4788"></a>
-<span class="sourceLineNo">4789</span>  }<a name="line.4789"></a>
-<span class="sourceLineNo">4790</span><a name="line.4790"></a>
-<span class="sourceLineNo">4791</span>  /**<a name="line.4791"></a>
-<span class="sourceLineNo">4792</span>   * Test that we get the expected flush results back<a name="line.4792"></a>
-<span class="sourceLineNo">4793</span>   */<a name="line.4793"></a>
-<span class="sourceLineNo">4794</span>  @Test<a name="line.4794"></a>
-<span class="sourceLineNo">4795</span>  public void testFlushResult() throws IOException {<a name="line.4795"></a>
-<span class="sourceLineNo">4796</span>    byte[] family = Bytes.toBytes("family");<a name="line.4796"></a>
-<span class="sourceLineNo">4797</span><a name="line.4797"></a>
-<span class="sourceLineNo">4798</span>    this.region = initHRegion(tableName, method, family);<a name="line.4798"></a>
-<span class="sourceLineNo">4799</span><a name="line.4799"></a>
-<span class="sourceLineNo">4800</span>    // empty memstore, flush doesn't run<a name="line.4800"></a>
-<span class="sourceLineNo">4801</span>    HRegion.FlushResult fr = region.flush(true);<a name="line.4801"></a>
-<span class="sourceLineNo">4802</span>    assertFalse(fr.isFlushSucceeded());<a name="line.4802"></a>
-<span class="sourceLineNo">4803</span>    assertFalse(fr.isCompactionNeeded());<a name="line.4803"></a>
-<span class="sourceLineNo">4804</span><a name="line.4804"></a>
-<span class="sourceLineNo">4805</span>    // Flush enough files to get up to the threshold, doesn't need compactions<a name="line.4805"></a>
-<span class="sourceLineNo">4806</span>    for (int i = 0; i &lt; 2; i++) {<a name="line.4806"></a>
-<span class="sourceLineNo">4807</span>      Put put = new Put(tableName.toBytes()).addColumn(family, family, tableName.toBytes());<a name="line.4807"></a>
-<span class="sourceLineNo">4808</span>      region.put(put);<a name="line.4808"></a>
-<span class="sourceLineNo">4809</span>      fr = region.flush(true);<a name="line.4809"></a>
-<span class="sourceLineNo">4810</span>      assertTrue(fr.isFlushSucceeded());<a name="line.4810"></a>
-<span class="sourceLineNo">4811</span>      assertFalse(fr.isCompactionNeeded());<a name="line.4811"></a>
-<span class="sourceLineNo">4812</span>    }<a name="line.4812"></a>
-<span class="sourceLineNo">4813</span><a name="line.4813"></a>
-<span class="sourceLineNo">4814</span>    // Two flushes after the threshold, compactions are needed<a name="line.4814"></a>
-<span class="sourceLineNo">4815</span>    for (int i = 0; i &lt; 2; i++) {<a name="line.4815"></a>
-<span class="sourceLineNo">4816</span>      Put put = new Put(tableName.toBytes()).addColumn(family, family, tableName.toBytes());<a name="line.4816"></a>
-<span class="sourceLineNo">4817</span>      region.put(put);<a name="line.4817"></a>
-<span class="sourceLineNo">4818</span>      fr = region.flush(true);<a name="line.4818"></a>
-<span class="sourceLineNo">4819</span>      assertTrue(fr.isFlushSucceeded());<a name="line.4819"></a>
-<span class="sourceLineNo">4820</span>      assertTrue(fr.isCompactionNeeded());<a name="line.4820"></a>
-<span class="sourceLineNo">4821</span>    }<a name="line.4821"></a>
-<span class="sourceLineNo">4822</span>  }<a name="line.4822"></a>
+<span class="sourceLineNo">4709</span>  private void putData(int startRow, int numRows, byte[] qf, byte[]... families) throws<a name="line.4709"></a>
+<span class="sourceLineNo">4710</span>      IOException {<a name="line.4710"></a>
+<span class="sourceLineNo">4711</span>    putData(this.region, startRow, numRows, qf, families);<a name="line.4711"></a>
+<span class="sourceLineNo">4712</span>  }<a name="line.4712"></a>
+<span class="sourceLineNo">4713</span><a name="line.4713"></a>
+<span class="sourceLineNo">4714</span>  private void putData(HRegion region,<a name="line.4714"></a>
+<span class="sourceLineNo">4715</span>      int startRow, int numRows, byte[] qf, byte[]... families) throws IOException {<a name="line.4715"></a>
+<span class="sourceLineNo">4716</span>    putData(region, Durability.SKIP_WAL, startRow, numRows, qf, families);<a name="line.4716"></a>
+<span class="sourceLineNo">4717</span>  }<a name="line.4717"></a>
+<span class="sourceLineNo">4718</span><a name="line.4718"></a>
+<span class="sourceLineNo">4719</span>  static void putData(HRegion region, Durability durability,<a name="line.4719"></a>
+<span class="sourceLineNo">4720</span>      int startRow, int numRows, byte[] qf, byte[]... families) throws IOException {<a name="line.4720"></a>
+<span class="sourceLineNo">4721</span>    for (int i = startRow; i &lt; startRow + numRows; i++) {<a name="line.4721"></a>
+<span class="sourceLineNo">4722</span>      Put put = new Put(Bytes.toBytes("" + i));<a name="line.4722"></a>
+<span class="sourceLineNo">4723</span>      put.setDurability(durability);<a name="line.4723"></a>
+<span class="sourceLineNo">4724</span>      for (byte[] family : families) {<a name="line.4724"></a>
+<span class="sourceLineNo">4725</span>        put.addColumn(family, qf, null);<a name="line.4725"></a>
+<span class="sourceLineNo">4726</span>      }<a name="line.4726"></a>
+<span class="sourceLineNo">4727</span>      region.put(put);<a name="line.4727"></a>
+<span class="sourceLineNo">4728</span>      LOG.info(put.toString());<a name="line.4728"></a>
+<span class="sourceLineNo">4729</span>    }<a name="line.4729"></a>
+<span class="sourceLineNo">4730</span>  }<a name="line.4730"></a>
+<span class="sourceLineNo">4731</span><a name="line.4731"></a>
+<span class="sourceLineNo">4732</span>  static void verifyData(HRegion newReg, int startRow, int numRows, byte[] qf, byte[]... families)<a name="line.4732"></a>
+<span class="sourceLineNo">4733</span>      throws IOException {<a name="line.4733"></a>
+<span class="sourceLineNo">4734</span>    for (int i = startRow; i &lt; startRow + numRows; i++) {<a name="line.4734"></a>
+<span class="sourceLineNo">4735</span>      byte[] row = Bytes.toBytes("" + i);<a name="line.4735"></a>
+<span class="sourceLineNo">4736</span>      Get get = new Get(row);<a name="line.4736"></a>
+<span class="sourceLineNo">4737</span>      for (byte[] family : families) {<a name="line.4737"></a>
+<span class="sourceLineNo">4738</span>        get.addColumn(family, qf);<a name="line.4738"></a>
+<span class="sourceLineNo">4739</span>      }<a name="line.4739"></a>
+<span class="sourceLineNo">4740</span>      Result result = newReg.get(get);<a name="line.4740"></a>
+<span class="sourceLineNo">4741</span>      Cell[] raw = result.rawCells();<a name="line.4741"></a>
+<span class="sourceLineNo">4742</span>      assertEquals(families.length, result.size());<a name="line.4742"></a>
+<span class="sourceLineNo">4743</span>      for (int j = 0; j &lt; families.length; j++) {<a name="line.4743"></a>
+<span class="sourceLineNo">4744</span>        assertTrue(CellUtil.matchingRows(raw[j], row));<a name="line.4744"></a>
+<span class="sourceLineNo">4745</span>        assertTrue(CellUtil.matchingFamily(raw[j], families[j]));<a name="line.4745"></a>
+<span class="sourceLineNo">4746</span>        assertTrue(CellUtil.matchingQualifier(raw[j], qf));<a name="line.4746"></a>
+<span class="sourceLineNo">4747</span>      }<a name="line.4747"></a>
+<span class="sourceLineNo">4748</span>    }<a name="line.4748"></a>
+<span class="sourceLineNo">4749</span>  }<a name="line.4749"></a>
+<span class="sourceLineNo">4750</span><a name="line.4750"></a>
+<span class="sourceLineNo">4751</span>  static void assertGet(final HRegion r, final byte[] family, final byte[] k) throws IOException {<a name="line.4751"></a>
+<span class="sourceLineNo">4752</span>    // Now I have k, get values out and assert they are as expected.<a name="line.4752"></a>
+<span class="sourceLineNo">4753</span>    Get get = new Get(k).addFamily(family).readAllVersions();<a name="line.4753"></a>
+<span class="sourceLineNo">4754</span>    Cell[] results = r.get(get).rawCells();<a name="line.4754"></a>
+<span class="sourceLineNo">4755</span>    for (int j = 0; j &lt; results.length; j++) {<a name="line.4755"></a>
+<span class="sourceLineNo">4756</span>      byte[] tmp = CellUtil.cloneValue(results[j]);<a name="line.4756"></a>
+<span class="sourceLineNo">4757</span>      // Row should be equal to value every time.<a name="line.4757"></a>
+<span class="sourceLineNo">4758</span>      assertTrue(Bytes.equals(k, tmp));<a name="line.4758"></a>
+<span class="sourceLineNo">4759</span>    }<a name="line.4759"></a>
+<span class="sourceLineNo">4760</span>  }<a name="line.4760"></a>
+<span class="sourceLineNo">4761</span><a name="line.4761"></a>
+<span class="sourceLineNo">4762</span>  /*<a name="line.4762"></a>
+<span class="sourceLineNo">4763</span>   * Assert first value in the passed region is &lt;code&gt;firstValue&lt;/code&gt;.<a name="line.4763"></a>
+<span class="sourceLineNo">4764</span>   *<a name="line.4764"></a>
+<span class="sourceLineNo">4765</span>   * @param r<a name="line.4765"></a>
+<span class="sourceLineNo">4766</span>   *<a name="line.4766"></a>
+<span class="sourceLineNo">4767</span>   * @param fs<a name="line.4767"></a>
+<span class="sourceLineNo">4768</span>   *<a name="line.4768"></a>
+<span class="sourceLineNo">4769</span>   * @param firstValue<a name="line.4769"></a>
+<span class="sourceLineNo">4770</span>   *<a name="line.4770"></a>
+<span class="sourceLineNo">4771</span>   * @throws IOException<a name="line.4771"></a>
+<span class="sourceLineNo">4772</span>   */<a name="line.4772"></a>
+<span class="sourceLineNo">4773</span>  protected void assertScan(final HRegion r, final byte[] fs, final byte[] firstValue)<a name="line.4773"></a>
+<span class="sourceLineNo">4774</span>      throws IOException {<a name="line.4774"></a>
+<span class="sourceLineNo">4775</span>    byte[][] families = { fs };<a name="line.4775"></a>
+<span class="sourceLineNo">4776</span>    Scan scan = new Scan();<a name="line.4776"></a>
+<span class="sourceLineNo">4777</span>    for (int i = 0; i &lt; families.length; i++)<a name="line.4777"></a>
+<span class="sourceLineNo">4778</span>      scan.addFamily(families[i]);<a name="line.4778"></a>
+<span class="sourceLineNo">4779</span>    InternalScanner s = r.getScanner(scan);<a name="line.4779"></a>
+<span class="sourceLineNo">4780</span>    try {<a name="line.4780"></a>
+<span class="sourceLineNo">4781</span>      List&lt;Cell&gt; curVals = new ArrayList&lt;&gt;();<a name="line.4781"></a>
+<span class="sourceLineNo">4782</span>      boolean first = true;<a name="line.4782"></a>
+<span class="sourceLineNo">4783</span>      OUTER_LOOP: while (s.next(curVals)) {<a name="line.4783"></a>
+<span class="sourceLineNo">4784</span>        for (Cell kv : curVals) {<a name="line.4784"></a>
+<span class="sourceLineNo">4785</span>          byte[] val = CellUtil.cloneValue(kv);<a name="line.4785"></a>
+<span class="sourceLineNo">4786</span>          byte[] curval = val;<a name="line.4786"></a>
+<span class="sourceLineNo">4787</span>          if (first) {<a name="line.4787"></a>
+<span class="sourceLineNo">4788</span>            first = false;<a name="line.4788"></a>
+<span class="sourceLineNo">4789</span>            assertTrue(Bytes.compareTo(curval, firstValue) == 0);<a name="line.4789"></a>
+<span class="sourceLineNo">4790</span>          } else {<a name="line.4790"></a>
+<span class="sourceLineNo">4791</span>            // Not asserting anything. Might as well break.<a name="line.4791"></a>
+<span class="sourceLineNo">4792</span>            break OUTER_LOOP;<a name="line.4792"></a>
+<span class="sourceLineNo">4793</span>          }<a name="line.4793"></a>
+<span class="sourceLineNo">4794</span>        }<a name="line.4794"></a>
+<span class="sourceLineNo">4795</span>      }<a name="line.4795"></a>
+<span class="sourceLineNo">4796</span>    } finally {<a name="line.4796"></a>
+<span class="sourceLineNo">4797</span>      s.close();<a name="line.4797"></a>
+<span class="sourceLineNo">4798</span>    }<a name="line.4798"></a>
+<span class="sourceLineNo">4799</span>  }<a name="line.4799"></a>
+<span class="sourceLineNo">4800</span><a name="line.4800"></a>
+<span class="sourceLineNo">4801</span>  /**<a name="line.4801"></a>
+<span class="sourceLineNo">4802</span>   * Test that we get the expected flush results back<a name="line.4802"></a>
+<span class="sourceLineNo">4803</span>   */<a name="line.4803"></a>
+<span class="sourceLineNo">4804</span>  @Test<a name="line.4804"></a>
+<span class="sourceLineNo">4805</span>  public void testFlushResult() throws IOException {<a name="line.4805"></a>
+<span class="sourceLineNo">4806</span>    byte[] family = Bytes.toBytes("family");<a name="line.4806"></a>
+<span class="sourceLineNo">4807</span><a name="line.4807"></a>
+<span class="sourceLineNo">4808</span>    this.region = initHRegion(tableName, method, family);<a name="line.4808"></a>
+<span class="sourceLineNo">4809</span><a name="line.4809"></a>
+<span class="sourceLineNo">4810</span>    // empty memstore, flush doesn't run<a name="line.4810"></a>
+<span class="sourceLineNo">4811</span>    HRegion.FlushResult fr = region.flush(true);<a name="line.4811"></a>
+<span class="sourceLineNo">4812</span>    assertFalse(fr.isFlushSucceeded());<a name="line.4812"></a>
+<span class="sourceLineNo">4813</span>    assertFalse(fr.isCompactionNeeded());<a name="line.4813"></a>
+<span class="sourceLineNo">4814</span><a name="line.4814"></a>
+<span class="sourceLineNo">4815</span>    // Flush enough files to get up to the threshold, doesn't need compactions<a name="line.4815"></a>
+<span class="sourceLineNo">4816</span>    for (int i = 0; i &lt; 2; i++) {<a name="line.4816"></a>
+<span class="sourceLineNo">4817</span>      Put put = new Put(tableName.toBytes()).addColumn(family, family, tableName.toBytes());<a name="line.4817"></a>
+<span class="sourceLineNo">4818</span>      region.put(put);<a name="line.4818"></a>
+<span class="sourceLineNo">4819</span>      fr = region.flush(true);<a name="line.4819"></a>
+<span class="sourceLineNo">4820</span>      assertTrue(fr.isFlushSucceeded());<a name="line.4820"></a>
+<span class="sourceLineNo">4821</span>      assertFalse(fr.isCompactionNeeded());<a name="line.4821"></a>
+<span class="sourceLineNo">4822</span>    }<a name="line.4822"></a>
 <span class="sourceLineNo">4823</span><a name="line.4823"></a>
-<span class="sourceLineNo">4824</span>  protected Configuration initSplit() {<a name="line.4824"></a>
-<span class="sourceLineNo">4825</span>    // Always compact if there is more than one store file.<a name="line.4825"></a>
-<span class="sourceLineNo">4826</span>    CONF.setInt("hbase.hstore.compactionThreshold", 2);<a name="line.4826"></a>
-<span class="sourceLineNo">4827</span><a name="line.4827"></a>
-<span class="sourceLineNo">4828</span>    CONF.setInt(HConstants.HBASE_CLIENT_SCANNER_TIMEOUT_PERIOD, 10 * 1000);<a name="line.4828"></a>
-<span class="sourceLineNo">4829</span><a name="line.4829"></a>
-<span class="sourceLineNo">4830</span>    // Increase the amount of time between client retries<a name="line.4830"></a>
-<span class="sourceLineNo">4831</span>    CONF.setLong("hbase.client.pause", 15 * 1000);<a name="line.4831"></a>
-<span class="sourceLineNo">4832</span><a name="line.4832"></a>
-<span class="sourceLineNo">4833</span>    // This size should make it so we always split using the addContent<a name="line.4833"></a>
-<span class="sourceLineNo">4834</span>    // below. After adding all data, the first region is 1.3M<a name="line.4834"></a>
-<span class="sourceLineNo">4835</span>    CONF.setLong(HConstants.HREGION_MAX_FILESIZE, 1024 * 128);<a name="line.4835"></a>
-<span class="sourceLineNo">4836</span>    return CONF;<a name="line.4836"></a>
-<span class="sourceLineNo">4837</span>  }<a name="line.4837"></a>
-<span class="sourceLineNo">4838</span><a name="line.4838"></a>
-<span class="sourceLineNo">4839</span>  /**<a name="line.4839"></a>
-<span class="sourceLineNo">4840</span>   * @return A region on which you must call<a name="line.4840"></a>
-<span class="sourceLineNo">4841</span>   *         {@link HBaseTestingUtility#closeRegionAndWAL(HRegion)} when done.<a name="line.4841"></a>
-<span class="sourceLineNo">4842</span>   */<a name="line.4842"></a>
-<span class="sourceLineNo">4843</span>  protected HRegion initHRegion(TableName tableName, String callingMethod, Configuration conf,<a name="line.4843"></a>
-<span class="sourceLineNo">4844</span>      byte[]... families) throws IOException {<a name="line.4844"></a>
-<span class="sourceLineNo">4845</span>    return initHRegion(tableName, callingMethod, conf, false, families);<a name="line.4845"></a>
-<span class="sourceLineNo">4846</span>  }<a name="line.4846"></a>
-<span class="sourceLineNo">4847</span><a name="line.4847"></a>
-<span class="sourceLineNo">4848</span>  /**<a name="line.4848"></a>
-<span class="sourceLineNo">4849</span>   * @return A region on which you must call<a name="line.4849"></a>
-<span class="sourceLineNo">4850</span>   *         {@link HBaseTestingUtility#closeRegionAndWAL(HRegion)} when done.<a name="line.4850"></a>
-<span class="sourceLineNo">4851</span>   */<a name="line.4851"></a>
-<span class="sourceLineNo">4852</span>  protected HRegion initHRegion(TableName tableName, String callingMethod, Configuration conf,<a name="line.4852"></a>
-<span class="sourceLineNo">4853</span>      boolean isReadOnly, byte[]... families) throws IOException {<a name="line.4853"></a>
-<span class="sourceLineNo">4854</span>    return initHRegion(tableName, null, null, callingMethod, conf, isReadOnly, families);<a name="line.4854"></a>
-<span class="sourceLineNo">4855</span>  }<a name="line.4855"></a>
-<span class="sourceLineNo">4856</span><a name="line.4856"></a>
-<span class="sourceLineNo">4857</span>  protected HRegion initHRegion(TableName tableName, byte[] startKey, byte[] stopKey,<a name="line.4857"></a>
-<span class="sourceLineNo">4858</span>      String callingMethod, Configuration conf, boolean isReadOnly, byte[]... families)<a name="line.4858"></a>
-<span class="sourceLineNo">4859</span>      throws IOException {<a name="line.4859"></a>
-<span class="sourceLineNo">4860</span>    Path logDir = TEST_UTIL.getDataTestDirOnTestFS(callingMethod + ".log");<a name="line.4860"></a>
-<span class="sourceLineNo">4861</span>    ChunkCreator.initialize(MemStoreLABImpl.CHUNK_SIZE_DEFAULT, false, 0, 0, 0, null);<a name="line.4861"></a>
-<span class="sourceLineNo">4862</span>    HRegionInfo hri = new HRegionInfo(tableName, startKey, stopKey);<a name="line.4862"></a>
-<span class="sourceLineNo">4863</span>    final WAL wal = HBaseTestingUtility.createWal(conf, logDir, hri);<a name="line.4863"></a>
-<span class="sourceLineNo">4864</span>    return initHRegion(tableName, startKey, stopKey, isReadOnly,<a name="line.4864"></a>
-<span class="sourceLineNo">4865</span>        Durability.SYNC_WAL, wal, families);<a name="line.4865"></a>
-<span class="sourceLineNo">4866</span>  }<a name="line.4866"></a>
-<span class="sourceLineNo">4867</span><a name="line.4867"></a>
-<span class="sourceLineNo">4868</span>  /**<a name="line.4868"></a>
-<span class="sourceLineNo">4869</span>   * @return A region on which you must call<a name="line.4869"></a>
-<span class="sourceLineNo">4870</span>   *         {@link HBaseTestingUtility#closeRegionAndWAL(HRegion)} when done.<a name="line.4870"></a>
-<span class="sourceLineNo">4871</span>   */<a name="line.4871"></a>
-<span class="sourceLineNo">4872</span>  public HRegion initHRegion(TableName tableName, byte[] startKey, byte[] stopKey,<a name="line.4872"></a>
-<span class="sourceLineNo">4873</span>      boolean isReadOnly, Durability durability, WAL wal, byte[]... families) throws IOException {<a name="line.4873"></a>
-<span class="sourceLineNo">4874</span>    return TEST_UTIL.createLocalHRegion(tableName, startKey, stopKey,<a name="line.4874"></a>
-<span class="sourceLineNo">4875</span>        isReadOnly, durability, wal, families);<a name="line.4875"></a>
+<span class="sourceLineNo">4824</span>    // Two flushes after the threshold, compactions are needed<a name="line.4824"></a>
+<span class="sourceLineNo">4825</span>    for (int i = 0; i &lt; 2; i++) {<a name="line.4825"></a>
+<span class="sourceLineNo">4826</span>      Put put = new Put(tableName.toBytes()).addColumn(family, family, tableName.toBytes());<a name="line.4826"></a>
+<span class="sourceLineNo">4827</span>      region.put(put);<a name="line.4827"></a>
+<span class="sourceLineNo">4828</span>      fr = region.flush(true);<a name="line.4828"></a>
+<span class="sourceLineNo">4829</span>      assertTrue(fr.isFlushSucceeded());<a name="line.4829"></a>
+<span class="sourceLineNo">4830</span>      assertTrue(fr.isCompactionNeeded());<a name="line.4830"></a>
+<span class="sourceLineNo">4831</span>    }<a name="line.4831"></a>
+<span class="sourceLineNo">4832</span>  }<a name="line.4832"></a>
+<span class="sourceLineNo">4833</span><a name="line.4833"></a>
+<span class="sourceLineNo">4834</span>  protected Configuration initSplit() {<a name="line.4834"></a>
+<span class="sourceLineNo">4835</span>    // Always compact if there is more than one store file.<a name="line.4835"></a>
+<span class="sourceLineNo">4836</span>    CONF.setInt("hbase.hstore.compactionThreshold", 2);<a name="line.4836"></a>
+<span class="sourceLineNo">4837</span><a name="line.4837"></a>
+<span class="sourceLineNo">4838</span>    CONF.setInt(HConstants.HBASE_CLIENT_SCANNER_TIMEOUT_PERIOD, 10 * 1000);<a name="line.4838"></a>
+<span class="sourceLineNo">4839</span><a name="line.4839"></a>
+<span class="sourceLineNo">4840</span>    // Increase the amount of time between client retries<a name="line.4840"></a>
+<span class="sourceLineNo">4841</span>    CONF.setLong("hbase.client.pause", 15 * 1000);<a name="line.4841"></a>
+<span class="sourceLineNo">4842</span><a name="line.4842"></a>
+<span class="sourceLineNo">4843</span>    // This size should make it so we always split using the addContent<a name="line.4843"></a>
+<span class="sourceLineNo">4844</span>    // below. After adding all data, the first region is 1.3M<a name="line.4844"></a>
+<span class="sourceLineNo">4845</span>    CONF.setLong(HConstants.HREGION_MAX_FILESIZE, 1024 * 128);<a name="line.4845"></a>
+<span class="sourceLineNo">4846</span>    return CONF;<a name="line.4846"></a>
+<span class="sourceLineNo">4847</span>  }<a name="line.4847"></a>
+<span class="sourceLineNo">4848</span><a name="line.4848"></a>
+<span class="sourceLineNo">4849</span>  /**<a name="line.4849"></a>
+<span class="sourceLineNo">4850</span>   * @return A region on which you must call<a name="line.4850"></a>
+<span class="sourceLineNo">4851</span>   *         {@link HBaseTestingUtility#closeRegionAndWAL(HRegion)} when done.<a name="line.4851"></a>
+<span class="sourceLineNo">4852</span>   */<a name="line.4852"></a>
+<span class="sourceLineNo">4853</span>  protected HRegion initHRegion(TableName tableName, String callingMethod, Configuration conf,<a name="line.4853"></a>
+<span class="sourceLineNo">4854</span>      byte[]... families) throws IOException {<a name="line.4854"></a>
+<span class="sourceLineNo">4855</span>    return initHRegion(tableName, callingMethod, conf, false, families);<a name="line.4855"></a>
+<span class="sourceLineNo">4856</span>  }<a name="line.4856"></a>
+<span class="sourceLineNo">4857</span><a name="line.4857"></a>
+<span class="sourceLineNo">4858</span>  /**<a name="line.4858"></a>
+<span class="sourceLineNo">4859</span>   * @return A region on which you must call<a name="line.4859"></a>
+<span class="sourceLineNo">4860</span>   *         {@link HBaseTestingUtility#closeRegionAndWAL(HRegion)} when done.<a name="line.4860"></a>
+<span class="sourceLineNo">4861</span>   */<a name="line.4861"></a>
+<span class="sourceLineNo">4862</span>  protected HRegion initHRegion(TableName tableName, String callingMethod, Configuration conf,<a name="line.4862"></a>
+<span class="sourceLineNo">4863</span>      boolean isReadOnly, byte[]... families) throws IOException {<a name="line.4863"></a>
+<span class="sourceLineNo">4864</span>    return initHRegion(tableName, null, null, callingMethod, conf, isReadOnly, families);<a name="line.4864"></a>
+<span class="sourceLineNo">4865</span>  }<a name="line.4865"></a>
+<span class="sourceLineNo">4866</span><a name="line.4866"></a>
+<span class="sourceLineNo">4867</span>  protected HRegion initHRegion(TableName tableName, byte[] startKey, byte[] stopKey,<a name="line.4867"></a>
+<span class="sourceLineNo">4868</span>      String callingMethod, Configuration conf, boolean isReadOnly, byte[]... families)<a name="line.4868"></a>
+<span class="sourceLineNo">4869</span>      throws IOException {<a name="line.4869"></a>
+<span class="sourceLineNo">4870</span>    Path logDir = TEST_UTIL.getDataTestDirOnTestFS(callingMethod + ".log");<a name="line.4870"></a>
+<span class="sourceLineNo">4871</span>    ChunkCreator.initialize(MemStoreLABImpl.CHUNK_SIZE_DEFAULT, false, 0, 0, 0, null);<a name="line.4871"></a>
+<span class="sourceLineNo">4872</span>    HRegionInfo hri = new HRegionInfo(tableName, startKey, stopKey);<a name="line.4872"></a>
+<span class="sourceLineNo">4873</span>    final WAL wal = HBaseTestingUtility.createWal(conf, logDir, hri);<a name="line.4873"></a>
+<span class="sourceLineNo">4874</span>    return initHRegion(tableName, startKey, stopKey, isReadOnly,<a name="line.4874"></a>
+<span class="sourceLineNo">4875</span>        Durability.SYNC_WAL, wal, families);<a name="line.4875"></a>
 <span class="sourceLineNo">4876</span>  }<a name="line.4876"></a>
 <span class="sourceLineNo">4877</span><a name="line.4877"></a>
 <span class="sourceLineNo">4878</span>  /**<a name="line.4878"></a>
-<span class="sourceLineNo">4879</span>   * Assert that the passed in Cell has expected contents for the specified row,<a name="line.4879"></a>
-<span class="sourceLineNo">4880</span>   * column &amp; timestamp.<a name="line.4880"></a>
+<span class="sourceLineNo">4879</span>   * @return A region on which you must call<a name="line.4879"></a>
+<span class="sourceLineNo">4880</span>   *         {@link HBaseTestingUtility#closeRegionAndWAL(HRegion)} when done.<a name="line.4880"></a>
 <span class="sourceLineNo">4881</span>   */<a name="line.4881"></a>
-<span class="sourceLineNo">4882</span>  private void checkOneCell(Cell kv, byte[] cf, int rowIdx, int colIdx, long ts) {<a name="line.4882"></a>
-<span class="sourceLineNo">4883</span>    String ctx = "rowIdx=" + rowIdx + "; colIdx=" + colIdx + "; ts=" + ts;<a name="line.4883"></a>
-<span class="sourceLineNo">4884</span>    assertEquals("Row mismatch which checking: " + ctx, "row:" + rowIdx,<a name="line.4884"></a>
-<span class="sourceLineNo">4885</span>        Bytes.toString(CellUtil.cloneRow(kv)));<a name="line.4885"></a>
-<span class="sourceLineNo">4886</span>    assertEquals("ColumnFamily mismatch while checking: " + ctx, Bytes.toString(cf),<a name="line.4886"></a>
-<span class="sourceLineNo">4887</span>        Bytes.toString(CellUtil.cloneFamily(kv)));<a name="line.4887"></a>
-<span class="sourceLineNo">4888</span>    assertEquals("Column qualifier mismatch while checking: " + ctx, "column:" + colIdx,<a name="line.4888"></a>
-<span class="sourceLineNo">4889</span>        Bytes.toString(CellUtil.cloneQualifier(kv)));<a name="line.4889"></a>
-<span class="sourceLineNo">4890</span>    assertEquals("Timestamp mismatch while checking: " + ctx, ts, kv.getTimestamp());<a name="line.4890"></a>
-<span class="sourceLineNo">4891</span>    assertEquals("Value mismatch while checking: " + ctx, "value-version-" + ts,<a name="line.4891"></a>
-<span class="sourceLineNo">4892</span>        Bytes.toString(CellUtil.cloneValue(kv)));<a name="line.4892"></a>
-<span class="sourceLineNo">4893</span>  }<a name="line.4893"></a>
-<span class="sourceLineNo">4894</span><a name="line.4894"></a>
-<span class="sourceLineNo">4895</span>  @Test<a name="line.4895"></a>
-<span class="sourceLineNo">4896</span>  public void testReverseScanner_FromMemStore_SingleCF_Normal()<a name="line.4896"></a>
-<span class="sourceLineNo">4897</span>      throws IOException {<a name="line.4897"></a>
-<span class="sourceLineNo">4898</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.4898"></a>
-<span class="sourceLineNo">4899</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.4899"></a>
-<span class="sourceLineNo">4900</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.4900"></a>
-<span class="sourceLineNo">4901</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.4901"></a>
-<span class="sourceLineNo">4902</span>    byte[][] families = { cf };<a name="line.4902"></a>
-<span class="sourceLineNo">4903</span>    byte[] col = Bytes.toBytes("C");<a name="line.4903"></a>
-<span class="sourceLineNo">4904</span>    long ts = 1;<a name="line.4904"></a>
-<span class="sourceLineNo">4905</span>    this.region = initHRegion(tableName, method, families);<a name="line.4905"></a>
-<span class="sourceLineNo">4906</span>    KeyValue kv1 = new KeyValue(rowC, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4906"></a>
-<span class="sourceLineNo">4907</span>    KeyValue kv11 = new KeyValue(rowC, cf, col, ts + 1, KeyValue.Type.Put,<a name="line.4907"></a>
-<span class="sourceLineNo">4908</span>        null);<a name="line.4908"></a>
-<span class="sourceLineNo">4909</span>    KeyValue kv2 = new KeyValue(rowA, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4909"></a>
-<span class="sourceLineNo">4910</span>    KeyValue kv3 = new KeyValue(rowB, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4910"></a>
-<span class="sourceLineNo">4911</span>    Put put = null;<a name="line.4911"></a>
-<span class="sourceLineNo">4912</span>    put = new Put(rowC);<a name="line.4912"></a>
-<span class="sourceLineNo">4913</span>    put.add(kv1);<a name="line.4913"></a>
-<span class="sourceLineNo">4914</span>    put.add(kv11);<a name="line.4914"></a>
-<span class="sourceLineNo">4915</span>    region.put(put);<a name="line.4915"></a>
-<span class="sourceLineNo">4916</span>    put = new Put(rowA);<a name="line.4916"></a>
-<span class="sourceLineNo">4917</span>    put.add(kv2);<a name="line.4917"></a>
-<span class="sourceLineNo">4918</span>    region.put(put);<a name="line.4918"></a>
-<span class="sourceLineNo">4919</span>    put = new Put(rowB);<a name="line.4919"></a>
-<span class="sourceLineNo">4920</span>    put.add(kv3);<a name="line.4920"></a>
-<span class="sourceLineNo">4921</span>    region.put(put);<a name="line.4921"></a>
-<span class="sourceLineNo">4922</span><a name="line.4922"></a>
-<span class="sourceLineNo">4923</span>    Scan scan = new Scan(rowC);<a name="line.4923"></a>
-<span class="sourceLineNo">4924</span>    scan.setMaxVersions(5);<a name="line.4924"></a>
-<span class="sourceLineNo">4925</span>    scan.setReversed(true);<a name="line.4925"></a>
-<span class="sourceLineNo">4926</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.4926"></a>
-<span class="sourceLineNo">4927</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.4927"></a>
-<span class="sourceLineNo">4928</span>    boolean hasNext = scanner.next(currRow);<a name="line.4928"></a>
-<span class="sourceLineNo">4929</span>    assertEquals(2, currRow.size());<a name="line.4929"></a>
-<span class="sourceLineNo">4930</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4930"></a>
-<span class="sourceLineNo">4931</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.4931"></a>
-<span class="sourceLineNo">4932</span>    assertTrue(hasNext);<a name="line.4932"></a>
-<span class="sourceLineNo">4933</span>    currRow.clear();<a name="line.4933"></a>
-<span class="sourceLineNo">4934</span>    hasNext = scanner.next(currRow);<a name="line.4934"></a>
-<span class="sourceLineNo">4935</span>    assertEquals(1, currRow.size());<a name="line.4935"></a>
-<span class="sourceLineNo">4936</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4936"></a>
-<span class="sourceLineNo">4937</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.4937"></a>
-<span class="sourceLineNo">4938</span>    assertTrue(hasNext);<a name="line.4938"></a>
-<span class="sourceLineNo">4939</span>    currRow.clear();<a name="line.4939"></a>
-<span class="sourceLineNo">4940</span>    hasNext = scanner.next(currRow);<a name="line.4940"></a>
-<span class="sourceLineNo">4941</span>    assertEquals(1, currRow.size());<a name="line.4941"></a>
-<span class="sourceLineNo">4942</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4942"></a>
-<span class="sourceLineNo">4943</span>        .get(0).getRowLength(), rowA, 0, rowA.length));<a name="line.4943"></a>
-<span class="sourceLineNo">4944</span>    assertFalse(hasNext);<a name="line.4944"></a>
-<span class="sourceLineNo">4945</span>    scanner.close();<a name="line.4945"></a>
-<span class="sourceLineNo">4946</span>  }<a name="line.4946"></a>
-<span class="sourceLineNo">4947</span><a name="line.4947"></a>
-<span class="sourceLineNo">4948</span>  @Test<a name="line.4948"></a>
-<span class="sourceLineNo">4949</span>  public void testReverseScanner_FromMemStore_SingleCF_LargerKey()<a name="line.4949"></a>
-<span class="sourceLineNo">4950</span>      throws IOException {<a name="line.4950"></a>
-<span class="sourceLineNo">4951</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.4951"></a>
-<span class="sourceLineNo">4952</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.4952"></a>
-<span class="sourceLineNo">4953</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.4953"></a>
-<span class="sourceLineNo">4954</span>    byte[] rowD = Bytes.toBytes("rowD");<a name="line.4954"></a>
-<span class="sourceLineNo">4955</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.4955"></a>
-<span class="sourceLineNo">4956</span>    byte[][] families = { cf };<a name="line.4956"></a>
-<span class="sourceLineNo">4957</span>    byte[] col = Bytes.toBytes("C");<a name="line.4957"></a>
-<span class="sourceLineNo">4958</span>    long ts = 1;<a name="line.4958"></a>
-<span class="sourceLineNo">4959</span>    this.region = initHRegion(tableName, method, families);<a name="line.4959"></a>
-<span class="sourceLineNo">4960</span>    KeyValue kv1 = new KeyValue(rowC, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4960"></a>
-<span class="sourceLineNo">4961</span>    KeyValue kv11 = new KeyValue(rowC, cf, col, ts + 1, KeyValue.Type.Put,<a name="line.4961"></a>
-<span class="sourceLineNo">4962</span>        null);<a name="line.4962"></a>
-<span class="sourceLineNo">4963</span>    KeyValue kv2 = new KeyValue(rowA, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4963"></a>
-<span class="sourceLineNo">4964</span>    KeyValue kv3 = new KeyValue(rowB, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4964"></a>
-<span class="sourceLineNo">4965</span>    Put put = null;<a name="line.4965"></a>
-<span class="sourceLineNo">4966</span>    put = new Put(rowC);<a name="line.4966"></a>
-<span class="sourceLineNo">4967</span>    put.add(kv1);<a name="line.4967"></a>
-<span class="sourceLineNo">4968</span>    put.add(kv11);<a name="line.4968"></a>
-<span class="sourceLineNo">4969</span>    region.put(put);<a name="line.4969"></a>
-<span class="sourceLineNo">4970</span>    put = new Put(rowA);<a name="line.4970"></a>
-<span class="sourceLineNo">4971</span>    put.add(kv2);<a name="line.4971"></a>
-<span class="sourceLineNo">4972</span>    region.put(put);<a name="line.4972"></a>
-<span class="sourceLineNo">4973</span>    put = new Put(rowB);<a name="line.4973"></a>
-<span class="sourceLineNo">4974</span>    put.add(kv3);<a name="line.4974"></a>
-<span class="sourceLineNo">4975</span>    region.put(put);<a name="line.4975"></a>
-<span class="sourceLineNo">4976</span><a name="line.4976"></a>
-<span class="sourceLineNo">4977</span>    Scan scan = new Scan(rowD);<a name="line.4977"></a>
-<span class="sourceLineNo">4978</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.4978"></a>
-<span class="sourceLineNo">4979</span>    scan.setReversed(true);<a name="line.4979"></a>
-<span class="sourceLineNo">4980</span>    scan.setMaxVersions(5);<a name="line.4980"></a>
-<span class="sourceLineNo">4981</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.4981"></a>
-<span class="sourceLineNo">4982</span>    boolean hasNext = scanner.next(currRow);<a name="line.4982"></a>
-<span class="sourceLineNo">4983</span>    assertEquals(2, currRow.size());<a name="line.4983"></a>
-<span class="sourceLineNo">4984</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4984"></a>
-<span class="sourceLineNo">4985</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.4985"></a>
-<span class="sourceLineNo">4986</span>    assertTrue(hasNext);<a name="line.4986"></a>
-<span class="sourceLineNo">4987</span>    currRow.clear();<a name="line.4987"></a>
-<span class="sourceLineNo">4988</span>    hasNext = scanner.next(currRow);<a name="line.4988"></a>
-<span class="sourceLineNo">4989</span>    assertEquals(1, currRow.size());<a name="line.4989"></a>
-<span class="sourceLineNo">4990</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4990"></a>
-<span class="sourceLineNo">4991</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.4991"></a>
-<span class="sourceLineNo">4992</span>    assertTrue(hasNext);<a name="line.4992"></a>
-<span class="sourceLineNo">4993</span>    currRow.clear();<a name="line.4993"></a>
-<span class="sourceLineNo">4994</span>    hasNext = scanner.next(currRow);<a name="line.4994"></a>
-<span class="sourceLineNo">4995</span>    assertEquals(1, currRow.size());<a name="line.4995"></a>
-<span class="sourceLineNo">4996</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4996"></a>
-<span class="sourceLineNo">4997</span>        .get(0).getRowLength(), rowA, 0, rowA.length));<a name="line.4997"></a>
-<span class="sourceLineNo">4998</span>    assertFalse(hasNext);<a name="line.4998"></a>
-<span class="sourceLineNo">4999</span>    scanner.close();<a name="line.4999"></a>
-<span class="sourceLineNo">5000</span>  }<a name="line.5000"></a>
-<span class="sourceLineNo">5001</span><a name="line.5001"></a>
-<span class="sourceLineNo">5002</span>  @Test<a name="line.5002"></a>
-<span class="sourceLineNo">5003</span>  public void testReverseScanner_FromMemStore_SingleCF_FullScan()<a name="line.5003"></a>
-<span class="sourceLineNo">5004</span>      throws IOException {<a name="line.5004"></a>
-<span class="sourceLineNo">5005</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.5005"></a>
-<span class="sourceLineNo">5006</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.5006"></a>
-<span class="sourceLineNo">5007</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.5007"></a>
-<span class="sourceLineNo">5008</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.5008"></a>
-<span class="sourceLineNo">5009</span>    byte[][] families = { cf };<a name="line.5009"></a>
-<span class="sourceLineNo">5010</span>    byte[] col = Bytes.toBytes("C");<a name="line.5010"></a>
-<span class="sourceLineNo">5011</span>    long ts = 1;<a name="line.5011"></a>
-<span class="sourceLineNo">5012</span>    this.region = initHRegion(tableName, method, families);<a name="line.5012"></a>
-<span class="sourceLineNo">5013</span>    KeyValue kv1 = new KeyValue(rowC, cf, col, ts, KeyValue.Type.Put, null);<a name="line.5013"></a>
-<span class="sourceLineNo">5014</span>    KeyValue kv11 = new KeyValue(rowC, cf, col, ts + 1, KeyValue.Type.Put,<a name="line.5014"></a>
-<span class="sourceLineNo">5015</span>        null);<a name="line.5015"></a>
-<span class="sourceLineNo">5016</span>    KeyValue kv2 = new KeyValue(rowA, cf, col, ts, KeyValue.Type.Put, null);<a name="line.5016"></a>
-<span class="sourceLineNo">5017</span>    KeyValue kv3 = new KeyValue(rowB, cf, col, ts, KeyValue.Type.Put, null);<a name="line.5017"></a>
-<span class="sourceLineNo">5018</span>    Put put = null;<a name="line.5018"></a>
-<span class="sourceLineNo">5019</span>    put = new Put(rowC);<a name="line.5019"></a>
-<span class="sourceLineNo">5020</span>    put.add(kv1);<a name="line.5020"></a>
-<span class="sourceLineNo">5021</span>    put.add(kv11);<a name="line.5021"></a>
-<span class="sourceLineNo">5022</span>    region.put(put);<a name="line.5022"></a>
-<span class="sourceLineNo">5023</span>    put = new Put(rowA);<a name="line.5023"></a>
-<span class="sourceLineNo">5024</span>    put.add(kv2);<a name="line.5024"></a>
-<span class="sourceLineNo">5025</span>    region.put(put);<a name="line.5025"></a>
-<span class="sourceLineNo">5026</span>    put = new Put(rowB);<a name="line.5026"></a>
-<span class="sourceLineNo">5027</span>    put.add(kv3);<a name="line.5027"></a>
-<span class="sourceLineNo">5028</span>    region.put(put);<a name="line.5028"></a>
-<span class="sourceLineNo">5029</span>    Scan scan = new Scan();<a name="line.5029"></a>
-<span class="sourceLineNo">5030</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5030"></a>
-<span class="sourceLineNo">5031</span>    scan.setReversed(true);<a name="line.5031"></a>
-<span class="sourceLineNo">5032</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5032"></a>
-<span class="sourceLineNo">5033</span>    boolean hasNext = scanner.next(currRow);<a name="line.5033"></a>
-<span class="sourceLineNo">5034</span>    assertEquals(1, currRow.size());<a name="line.5034"></a>
-<span class="sourceLineNo">5035</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5035"></a>
-<span class="sourceLineNo">5036</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.5036"></a>
-<span class="sourceLineNo">5037</span>    assertTrue(hasNext);<a name="line.5037"></a>
-<span class="sourceLineNo">5038</span>    currRow.clear();<a name="line.5038"></a>
-<span class="sourceLineNo">5039</span>    hasNext = scanner.next(currRow);<a name="line.5039"></a>
-<span class="sourceLineNo">5040</span>    assertEquals(1, currRow.size());<a name="line.5040"></a>
-<span class="sourceLineNo">5041</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5041"></a>
-<span class="sourceLineNo">5042</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.5042"></a>
-<span class="sourceLineNo">5043</span>    assertTrue(hasNext);<a name="line.5043"></a>
-<span class="sourceLineNo">5044</span>    currRow.clear();<a name="line.5044"></a>
-<span class="sourceLineNo">5045</span>    hasNext = scanner.next(currRow);<a name="line.5045"></a>
-<span class="sourceLineNo">5046</span>    assertEquals(1, currRow.size());<a name="line.5046"></a>
-<span class="sourceLineNo">5047</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5047"></a>
-<span class="sourceLineNo">5048</span>        .get(0).getRowLength(), rowA, 0, rowA.length));<a name="line.5048"></a>
-<span class="sourceLineNo">5049</span>    assertFalse(hasNext);<a name="line.5049"></a>
-<span class="sourceLineNo">5050</span>    scanner.close();<a name="line.5050"></a>
-<span class="sourceLineNo">5051</span>  }<a name="line.5051"></a>
-<span class="sourceLineNo">5052</span><a name="line.5052"></a>
-<span class="sourceLineNo">5053</span>  @Test<a name="line.5053"></a>
-<span class="sourceLineNo">5054</span>  public void testReverseScanner_moreRowsMayExistAfter() throws IOException {<a name="line.5054"></a>
-<span class="sourceLineNo">5055</span>    // case for "INCLUDE_AND_SEEK_NEXT_ROW &amp; SEEK_NEXT_ROW" endless loop<a name="line.5055"></a>
-<span class="sourceLineNo">5056</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.5056"></a>
-<span class="sourceLineNo">5057</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.5057"></a>
-<span class="sourceLineNo">5058</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.5058"></a>
-<span class="sourceLineNo">5059</span>    byte[] rowD = Bytes.toBytes("rowD");<a name="line.5059"></a>
-<span class="sourceLineNo">5060</span>    byte[] rowE = Bytes.toBytes("rowE");<a name="line.5060"></a>
-<span class="sourceLineNo">5061</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.5061"></a>
-<span class="sourceLineNo">5062</span>    byte[][] families = { cf };<a name="line.5062"></a>
-<span class="sourceLineNo">5063</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.5063"></a>
-<span class="sourceLineNo">5064</span>    byte[] col2 = Bytes.toBytes("col2");<a name="line.5064"></a>
-<span class="sourceLineNo">5065</span>    long ts = 1;<a name="line.5065"></a>
-<span class="sourceLineNo">5066</span>    this.region = initHRegion(tableName, method, families);<a name="line.5066"></a>
-<span class="sourceLineNo">5067</span>    KeyValue kv1 = new KeyValue(rowA, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5067"></a>
-<span class="sourceLineNo">5068</span>    KeyValue kv2 = new KeyValue(rowB, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5068"></a>
-<span class="sourceLineNo">5069</span>    KeyValue kv3 = new KeyValue(rowC, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5069"></a>
-<span class="sourceLineNo">5070</span>    KeyValue kv4_1 = new KeyValue(rowD, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5070"></a>
-<span class="sourceLineNo">5071</span>    KeyValue kv4_2 = new KeyValue(rowD, cf, col2, ts, KeyValue.Type.Put, null);<a name="line.5071"></a>
-<span class="sourceLineNo">5072</span>    KeyValue kv5 = new KeyValue(rowE, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5072"></a>
-<span class="sourceLineNo">5073</span>    Put put = null;<a name="line.5073"></a>
-<span class="sourceLineNo">5074</span>    put = new Put(rowA);<a name="line.5074"></a>
-<span class="sourceLineNo">5075</span>    put.add(kv1);<a name="line.5075"></a>
-<span class="sourceLineNo">5076</span>    region.put(put);<a name="line.5076"></a>
-<span class="sourceLineNo">5077</span>    put = new Put(rowB);<a name="line.5077"></a>
-<span class="sourceLineNo">5078</span>    put.add(kv2);<a name="line.5078"></a>
-<span class="sourceLineNo">5079</span>    region.put(put);<a name="line.5079"></a>
-<span class="sourceLineNo">5080</span>    put = new Put(rowC);<a name="line.5080"></a>
-<span class="sourceLineNo">5081</span>    put.add(kv3);<a name="line.5081"></a>
-<span class="sourceLineNo">5082</span>    region.put(put);<a name="line.5082"></a>
-<span class="sourceLineNo">5083</span>    put = new Put(rowD);<a name="line.5083"></a>
-<span class="sourceLineNo">5084</span>    put.add(kv4_1);<a name="line.5084"></a>
-<span class="sourceLineNo">5085</span>    region.put(put);<a name="line.5085"></a>
-<span class="sourceLineNo">5086</span>    put = new Put(rowD);<a name="line.5086"></a>
-<span class="sourceLineNo">5087</span>    put.add(kv4_2);<a name="line.5087"></a>
-<span class="sourceLineNo">5088</span>    region.put(put);<a name="line.5088"></a>
-<span class="sourceLineNo">5089</span>    put = new Put(rowE);<a name="line.5089"></a>
-<span class="sourceLineNo">5090</span>    put.add(kv5);<a name="line.5090"></a>
-<span class="sourceLineNo">5091</span>    region.put(put);<a name="line.5091"></a>
-<span class="sourceLineNo">5092</span>    region.flush(true);<a name="line.5092"></a>
-<span class="sourceLineNo">5093</span>    Scan scan = new Scan(rowD, rowA);<a name="line.5093"></a>
-<span class="sourceLineNo">5094</span>    scan.addColumn(families[0], col1);<a name="line.5094"></a>
-<span class="sourceLineNo">5095</span>    scan.setReversed(true);<a name="line.5095"></a>
-<span class="sourceLineNo">5096</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5096"></a>
-<span class="sourceLineNo">5097</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5097"></a>
-<span class="sourceLineNo">5098</span>    boolean hasNext = scanner.next(currRow);<a name="line.5098"></a>
-<span class="sourceLineNo">5099</span>    assertEquals(1, currRow.size());<a name="line.5099"></a>
-<span class="sourceLineNo">5100</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5100"></a>
-<span class="sourceLineNo">5101</span>        .get(0).getRowLength(), rowD, 0, rowD.length));<a name="line.5101"></a>
-<span class="sourceLineNo">5102</span>    assertTrue(hasNext);<a name="line.5102"></a>
-<span class="sourceLineNo">5103</span>    currRow.clear();<a name="line.5103"></a>
-<span class="sourceLineNo">5104</span>    hasNext = scanner.next(currRow);<a name="line.5104"></a>
-<span class="sourceLineNo">5105</span>    assertEquals(1, currRow.size());<a name="line.5105"></a>
-<span class="sourceLineNo">5106</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5106"></a>
-<span class="sourceLineNo">5107</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.5107"></a>
-<span class="sourceLineNo">5108</span>    assertTrue(hasNext);<a name="line.5108"></a>
-<span class="sourceLineNo">5109</span>    currRow.clear();<a name="line.5109"></a>
-<span class="sourceLineNo">5110</span>    hasNext = scanner.next(currRow);<a name="line.5110"></a>
-<span class="sourceLineNo">5111</span>    assertEquals(1, currRow.size());<a name="line.5111"></a>
-<span class="sourceLineNo">5112</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5112"></a>
-<span class="sourceLineNo">5113</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.5113"></a>
-<span class="sourceLineNo">5114</span>    assertFalse(hasNext);<a name="line.5114"></a>
-<span class="sourceLineNo">5115</span>    scanner.close();<a name="line.5115"></a>
-<span class="sourceLineNo">5116</span><a name="line.5116"></a>
-<span class="sourceLineNo">5117</span>    scan = new Scan(rowD, rowA);<a name="line.5117"></a>
-<span class="sourceLineNo">5118</span>    scan.addColumn(families[0], col2);<a name="line.5118"></a>
-<span class="sourceLineNo">5119</span>    scan.setReversed(true);<a name="line.5119"></a>
-<span class="sourceLineNo">5120</span>    currRow.clear();<a name="line.5120"></a>
-<span class="sourceLineNo">5121</span>    scanner = region.getScanner(scan);<a name="line.5121"></a>
-<span class="sourceLineNo">5122</span>    hasNext = scanner.next(currRow);<a name="line.5122"></a>
-<span class="sourceLineNo">5123</span>    assertEquals(1, currRow.size());<a name="line.5123"></a>
-<span class="sourceLineNo">5124</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5124"></a>
-<span class="sourceLineNo">5125</span>        .get(0).getRowLength(), rowD, 0, rowD.length));<a name="line.5125"></a>
-<span class="sourceLineNo">5126</span>    scanner.close();<a name="line.5126"></a>
-<span class="sourceLineNo">5127</span>  }<a name="line.5127"></a>
-<span class="sourceLineNo">5128</span><a name="line.5128"></a>
-<span class="sourceLineNo">5129</span>  @Test<a name="line.5129"></a>
-<span class="sourceLineNo">5130</span>  public void testReverseScanner_smaller_blocksize() throws IOException {<a name="line.5130"></a>
-<span class="sourceLineNo">5131</span>    // case to ensure no conflict with HFile index optimization<a name="line.5131"></a>
-<span class="sourceLineNo">5132</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.5132"></a>
-<span class="sourceLineNo">5133</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.5133"></a>
-<span class="sourceLineNo">5134</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.5134"></a>
-<span class="sourceLineNo">5135</span>    byte[] rowD = Bytes.toBytes("rowD");<a name="line.5135"></a>
-<span class="sourceLineNo">5136</span>    byte[] rowE = Bytes.toBytes("rowE");<a name="line.5136"></a>
-<span class="sourceLineNo">5137</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.5137"></a>
-<span class="sourceLineNo">5138</span>    byte[][] families = { cf };<a name="line.5138"></a>
-<span class="sourceLineNo">5139</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.5139"></a>
-<span class="sourceLineNo">5140</span>    byte[] col2 = Bytes.toBytes("col2");<a name="line.5140"></a>
-<span class="sourceLineNo">5141</span>    long ts = 1;<a name="line.5141"></a>
-<span class="sourceLineNo">5142</span>    HBaseConfiguration config = new HBaseConfiguration();<a name="line.5142"></a>
-<span class="sourceLineNo">5143</span>    config.setInt("test.block.size", 1);<a name="line.5143"></a>
-<span class="sourceLineNo">5144</span>    this.region = initHRegion(tableName, method, config, families);<a name="line.5144"></a>
-<span class="sourceLineNo">5145</span>    KeyValue kv1 = new KeyValue(rowA, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5145"></a>
-<span class="sourceLineNo">5146</span>    KeyValue kv2 = new KeyValue(rowB, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5146"></a>
-<span class="sourceLineNo">5147</span>    KeyValue kv3 = new KeyValue(rowC, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5147"></a>
-<span class="sourceLineNo">5148</span>    KeyValue kv4_1 = new KeyValue(rowD, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5148"></a>
-<span class="sourceLineNo">5149</span>    KeyValue kv4_2 = new KeyValue(rowD, cf, col2, ts, KeyValue.Type.Put, null);<a name="line.5149"></a>
-<span class="sourceLineNo">5150</span>    KeyValue kv5 = new KeyValue(rowE, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5150"></a>
-<span class="sourceLineNo">5151</span>    Put put = null;<a name="line.5151"></a>
-<span class="sourceLineNo">5152</span>    put = new Put(rowA);<a name="line.5152"></a>
-<span class="sourceLineNo">5153</span>    put.add(kv1);<a name="line.5153"></a>
-<span class="sourceLineNo">5154</span>    region.put(put);<a name="line.5154"></a>
-<span class="sourceLineNo">5155</span>    put = new Put(rowB);<a name="line.5155"></a>
-<span class="sourceLineNo">5156</span>    put.add(kv2);<a name="line.5156"></a>
-<span class="sourceLineNo">5157</span>    region.put(put);<a name="line.5157"></a>
-<span class="sourceLineNo">5158</span>    put = new Put(rowC);<a name="line.5158"></a>
-<span class="sourceLineNo">5159</span>    put.add(kv3);<a name="line.5159"></a>
-<span class="sourceLineNo">5160</span>    region.put(put);<a name="line.5160"></a>
-<span class="sourceLineNo">5161</span>    put = new Put(rowD);<a name="line.5161"></a>
-<span class="sourceLineNo">5162</span>    put.add(kv4_1);<a name="line.5162"></a>
-<span class="sourceLineNo">5163</span>    region.put(put);<a name="line.5163"></a>
-<span class="sourceLineNo">5164</span>    put = new Put(rowD);<a name="line.5164"></a>
-<span class="sourceLineNo">5165</span>    put.add(kv4_2);<a name="line.5165"></a>
-<span class="sourceLineNo">5166</span>    region.put(put);<a name="line.5166"></a>
-<span class="sourceLineNo">5167</span>    put = new Put(rowE);<a name="line.5167"></a>
-<span class="sourceLineNo">5168</span>    put.add(kv5);<a name="line.5168"></a>
-<span class="sourceLineNo">5169</span>    region.put(put);<a name="line.5169"></a>
-<span class="sourceLineNo">5170</span>    region.flush(true);<a name="line.5170"></a>
-<span class="sourceLineNo">5171</span>    Scan scan = new Scan(rowD, rowA);<a name="line.5171"></a>
-<span class="sourceLineNo">5172</span>    scan.addColumn(families[0], col1);<a name="line.5172"></a>
-<span class="sourceLineNo">5173</span>    scan.setReversed(true);<a name="line.5173"></a>
-<span class="sourceLineNo">5174</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5174"></a>
-<span class="sourceLineNo">5175</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5175"></a>
-<span class="sourceLineNo">5176</span>    boolean hasNext = scanner.next(currRow);<a name="line.5176"></a>
-<span class="sourceLineNo">5177</span>    assertEquals(1, currRow.size());<a name="line.5177"></a>
-<span class="sourceLineNo">5178</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5178"></a>
-<span class="sourceLineNo">5179</span>        .get(0).getRowLength(), rowD, 0, rowD.length));<a name="line.5179"></a>
-<span class="sourceLineNo">5180</span>    assertTrue(hasNext);<a name="line.5180"></a>
-<span class="sourceLineNo">5181</span>    currRow.clear();<a name="line.5181"></a>
-<span class="sourceLineNo">5182</span>    hasNext = scanner.next(currRow);<a name="line.5182"></a>
-<span class="sourceLineNo">5183</span>    assertEquals(1, currRow.size());<a name="line.5183"></a>
-<span class="sourceLineNo">5184</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5184"></a>
-<span class="sourceLineNo">5185</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.5185"></a>
-<span class="sourceLineNo">5186</span>    assertTrue(hasNext);<a name="line.5186"></a>
-<span class="sourceLineNo">5187</span>    currRow.clear();<a name="line.5187"></a>
-<span class="sourceLineNo">5188</span>    hasNext = scanner.next(currRow);<a name="line.5188"></a>
-<span class="sourceLineNo">5189</span>    assertEquals(1, currRow.size());<a name="line.5189"></a>
-<span class="sourceLineNo">5190</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5190"></a>
-<span class="sourceLineNo">5191</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.5191"></a>
-<span class="sourceLineNo">5192</span>    assertFalse(hasNext);<a name="line.5192"></a>
-<span class="sourceLineNo">5193</span>    scanner.close();<a name="line.5193"></a>
-<span class="sourceLineNo">5194</span><a name="line.5194"></a>
-<span class="sourceLineNo">5195</span>    scan = new Scan(rowD, rowA);<a name="line.5195"></a>
-<span class="sourceLineNo">5196</span>    scan.addColumn(families[0], col2);<a name="line.5196"></a>
-<span class="sourceLineNo">5197</span>    scan.setReversed(true);<a name="line.5197"></a>
-<span class="sourceLineNo">5198</span>    currRow.clear();<a name="line.5198"></a>
-<span class="sourceLineNo">5199</span>    scanner = region.getScanner(scan);<a name="line.5199"></a>
-<span class="sourceLineNo">5200</span>    hasNext = scanner.next(currRow);<a name="line.5200"></a>
-<span class="sourceLineNo">5201</span>    assertEquals(1, currRow.size());<a name="line.5201"></a>
-<span class="sourceLineNo">5202</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5202"></a>
-<span class="sourceLineNo">5203</span>        .get(0).getRowLength(), rowD, 0, rowD.length));<a name="line.5203"></a>
-<span class="sourceLineNo">5204</span>    scanner.close();<a name="line.5204"></a>
-<span class="sourceLineNo">5205</span>  }<a name="line.5205"></a>
-<span class="sourceLineNo">5206</span><a name="line.5206"></a>
-<span class="sourceLineNo">5207</span>  @Test<a name="line.5207"></a>
-<span class="sourceLineNo">5208</span>  public void testReverseScanner_FromMemStoreAndHFiles_MultiCFs1()<a name="line.5208"></a>
-<span class="sourceLineNo">5209</span>      throws IOException {<a name="line.5209"></a>
-<span class="sourceLineNo">5210</span>    byte[] row0 = Bytes.toBytes("row0"); // 1 kv<a name="line.5210"></a>
-<span class="sourceLineNo">5211</span>    byte[] row1 = Bytes.toBytes("row1"); // 2 kv<a name="line.5211"></a>
-<span class="sourceLineNo">5212</span>    byte[] row2 = Bytes.toBytes("row2"); // 4 kv<a name="line.5212"></a>
-<span class="sourceLineNo">5213</span>    byte[] row3 = Bytes.toBytes("row3"); // 2 kv<a name="line.5213"></a>
-<span class="sourceLineNo">5214</span>    byte[] row4 = Bytes.toBytes("row4"); // 5 kv<a name="line.5214"></a>
-<span class="sourceLineNo">5215</span>    byte[] row5 = Bytes.toBytes("row5"); // 2 kv<a name="line.5215"></a>
-<span class="sourceLineNo">5216</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5216"></a>
-<span class="sourceLineNo">5217</span>    byte[] cf2 = Bytes.toBytes("CF2");<a name="line.5217"></a>
-<span class="sourceLineNo">5218</span>    byte[] cf3 = Bytes.toBytes("CF3");<a name="line.5218"></a>
-<span class="sourceLineNo">5219</span>    byte[][] families = { cf1, cf2, cf3 };<a name="line.5219"></a>
-<span class="sourceLineNo">5220</span>    byte[] col = Bytes.toBytes("C");<a name="line.5220"></a>
-<span class="sourceLineNo">5221</span>    long ts = 1;<a name="line.5221"></a>
-<span class="sourceLineNo">5222</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5222"></a>
-<span class="sourceLineNo">5223</span>    // disable compactions in this test.<a name="line.5223"></a>
-<span class="sourceLineNo">5224</span>    conf.setInt("hbase.hstore.compactionThreshold", 10000);<a name="line.5224"></a>
-<span class="sourceLineNo">5225</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5225"></a>
-<span class="sourceLineNo">5226</span>    // kv naming style: kv(row number) totalKvCountInThisRow seq no<a name="line.5226"></a>
-<span class="sourceLineNo">5227</span>    KeyValue kv0_1_1 = new KeyValue(row0, cf1, col, ts, KeyValue.Type.Put,<a name="line.5227"></a>
-<span class="sourceLineNo">5228</span>        null);<a name="line.5228"></a>
-<span class="sourceLineNo">5229</span>    KeyValue kv1_2_1 = new KeyValue(row1, cf2, col, ts, KeyValue.Type.Put,<a name="line.5229"></a>
-<span class="sourceLineNo">5230</span>        null);<a name="line.5230"></a>
-<span class="sourceLineNo">5231</span>    KeyValue kv1_2_2 = new KeyValue(row1, cf1, col, ts + 1,<a name="line.5231"></a>
-<span class="sourceLineNo">5232</span>        KeyValue.Type.Put, null);<a name="line.5232"></a>
-<span class="sourceLineNo">5233</span>    KeyValue kv2_4_1 = new KeyValue(row2, cf2, col, ts, KeyValue.Type.Put,<a name="line.5233"></a>
-<span class="sourceLineNo">5234</span>        null);<a name="line.5234"></a>
-<span class="sourceLineNo">5235</span>    KeyValue kv2_4_2 = new KeyValue(row2, cf1, col, ts, KeyValue.Type.Put,<a name="line.5235"></a>
-<span class="sourceLineNo">5236</span>        null);<a name="line.5236"></a>
-<span class="sourceLineNo">5237</span>    KeyValue kv2_4_3 = new KeyValue(row2, cf3, col, ts, KeyValue.Type.Put,<a name="line.5237"></a>
+<span class="sourceLineNo">4882</span>  public HRegion initHRegion(TableName tableName, byte[] startKey, byte[] stopKey,<a name="line.4882"></a>
+<span class="sourceLineNo">4883</span>      boolean isReadOnly, Durability durability, WAL wal, byte[]... families) throws IOException {<a name="line.4883"></a>
+<span class="sourceLineNo">4884</span>    return TEST_UTIL.createLocalHRegion(tableName, startKey, stopKey,<a name="line.4884"></a>
+<span class="sourceLineNo">4885</span>        isReadOnly, durability, wal, families);<a name="line.4885"></a>
+<span class="sourceLineNo">4886</span>  }<a name="line.4886"></a>
+<span class="sourceLineNo">4887</span><a name="line.4887"></a>
+<span class="sourceLineNo">4888</span>  /**<a name="line.4888"></a>
+<span class="sourceLineNo">4889</span>   * Assert that the passed in Cell has expected contents for the specified row,<a name="line.4889"></a>
+<span class="sourceLineNo">4890</span>   * column &amp; timestamp.<a name="line.4890"></a>
+<span class="sourceLineNo">4891</span>   */<a name="line.4891"></a>
+<span class="sourceLineNo">4892</span>  private void checkOneCell(Cell kv, byte[] cf, int rowIdx, int colIdx, long ts) {<a name="line.4892"></a>
+<span class="sourceLineNo">4893</span>    String ctx = "rowIdx=" + rowIdx + "; colIdx=" + colIdx + "; ts=" + ts;<a name="line.4893"></a>
+<span class="sourceLineNo">4894</span>    assertEquals("Row mismatch which checking: " + ctx, "row:" + rowIdx,<a name="line.4894"></a>
+<span class="sourceLineNo">4895</span>        Bytes.toString(CellUtil.cloneRow(kv)));<a name="line.4895"></a>
+<span class="sourceLineNo">4896</span>    assertEquals("ColumnFamily mismatch while checking: " + ctx, Bytes.toString(cf),<a name="line.4896"></a>
+<span class="sourceLineNo">4897</span>        Bytes.toString(CellUtil.cloneFamily(kv)));<a name="line.4897"></a>
+<span class="sourceLineNo">4898</span>    assertEquals("Column qualifier mismatch while checking: " + ctx, "column:" + colIdx,<a name="line.4898"></a>
+<span class="sourceLineNo">4899</span>        Bytes.toString(CellUtil.cloneQualifier(kv)));<a name="line.4899"></a>
+<span class="sourceLineNo">4900</span>    assertEquals("Timestamp mismatch while checking: " + ctx, ts, kv.getTimestamp());<a name="line.4900"></a>
+<span class="sourceLineNo">4901</span>    assertEquals("Value mismatch while checking: " + ctx, "value-version-" + ts,<a name="line.4901"></a>
+<span class="sourceLineNo">4902</span>        Bytes.toString(CellUtil.cloneValue(kv)));<a name="line.4902"></a>
+<span class="sourceLineNo">4903</span>  }<a name="line.4903"></a>
+<span class="sourceLineNo">4904</span><a name="line.4904"></a>
+<span class="sourceLineNo">4905</span>  @Test<a name="line.4905"></a>
+<span class="sourceLineNo">4906</span>  public void testReverseScanner_FromMemStore_SingleCF_Normal()<a name="line.4906"></a>
+<span class="sourceLineNo">4907</span>      throws IOException {<a name="line.4907"></a>
+<span class="sourceLineNo">4908</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.4908"></a>
+<span class="sourceLineNo">4909</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.4909"></a>
+<span class="sourceLineNo">4910</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.4910"></a>
+<span class="sourceLineNo">4911</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.4911"></a>
+<span class="sourceLineNo">4912</span>    byte[][] families = { cf };<a name="line.4912"></a>
+<span class="sourceLineNo">4913</span>    byte[] col = Bytes.toBytes("C");<a name="line.4913"></a>
+<span class="sourceLineNo">4914</span>    long ts = 1;<a name="line.4914"></a>
+<span class="sourceLineNo">4915</span>    this.region = initHRegion(tableName, method, families);<a name="line.4915"></a>
+<span class="sourceLineNo">4916</span>    KeyValue kv1 = new KeyValue(rowC, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4916"></a>
+<span class="sourceLineNo">4917</span>    KeyValue kv11 = new KeyValue(rowC, cf, col, ts + 1, KeyValue.Type.Put,<a name="line.4917"></a>
+<span class="sourceLineNo">4918</span>        null);<a name="line.4918"></a>
+<span class="sourceLineNo">4919</span>    KeyValue kv2 = new KeyValue(rowA, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4919"></a>
+<span class="sourceLineNo">4920</span>    KeyValue kv3 = new KeyValue(rowB, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4920"></a>
+<span class="sourceLineNo">4921</span>    Put put = null;<a name="line.4921"></a>
+<span class="sourceLineNo">4922</span>    put = new Put(rowC);<a name="line.4922"></a>
+<span class="sourceLineNo">4923</span>    put.add(kv1);<a name="line.4923"></a>
+<span class="sourceLineNo">4924</span>    put.add(kv11);<a name="line.4924"></a>
+<span class="sourceLineNo">4925</span>    region.put(put);<a name="line.4925"></a>
+<span class="sourceLineNo">4926</span>    put = new Put(rowA);<a name="line.4926"></a>
+<span class="sourceLineNo">4927</span>    put.add(kv2);<a name="line.4927"></a>
+<span class="sourceLineNo">4928</span>    region.put(put);<a name="line.4928"></a>
+<span class="sourceLineNo">4929</span>    put = new Put(rowB);<a name="line.4929"></a>
+<span class="sourceLineNo">4930</span>    put.add(kv3);<a name="line.4930"></a>
+<span class="sourceLineNo">4931</span>    region.put(put);<a name="line.4931"></a>
+<span class="sourceLineNo">4932</span><a name="line.4932"></a>
+<span class="sourceLineNo">4933</span>    Scan scan = new Scan(rowC);<a name="line.4933"></a>
+<span class="sourceLineNo">4934</span>    scan.setMaxVersions(5);<a name="line.4934"></a>
+<span class="sourceLineNo">4935</span>    scan.setReversed(true);<a name="line.4935"></a>
+<span class="sourceLineNo">4936</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.4936"></a>
+<span class="sourceLineNo">4937</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.4937"></a>
+<span class="sourceLineNo">4938</span>    boolean hasNext = scanner.next(currRow);<a name="line.4938"></a>
+<span class="sourceLineNo">4939</span>    assertEquals(2, currRow.size());<a name="line.4939"></a>
+<span class="sourceLineNo">4940</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4940"></a>
+<span class="sourceLineNo">4941</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.4941"></a>
+<span class="sourceLineNo">4942</span>    assertTrue(hasNext);<a name="line.4942"></a>
+<span class="sourceLineNo">4943</span>    currRow.clear();<a name="line.4943"></a>
+<span class="sourceLineNo">4944</span>    hasNext = scanner.next(currRow);<a name="line.4944"></a>
+<span class="sourceLineNo">4945</span>    assertEquals(1, currRow.size());<a name="line.4945"></a>
+<span class="sourceLineNo">4946</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4946"></a>
+<span class="sourceLineNo">4947</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.4947"></a>
+<span class="sourceLineNo">4948</span>    assertTrue(hasNext);<a name="line.4948"></a>
+<span class="sourceLineNo">4949</span>    currRow.clear();<a name="line.4949"></a>
+<span class="sourceLineNo">4950</span>    hasNext = scanner.next(currRow);<a name="line.4950"></a>
+<span class="sourceLineNo">4951</span>    assertEquals(1, currRow.size());<a name="line.4951"></a>
+<span class="sourceLineNo">4952</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4952"></a>
+<span class="sourceLineNo">4953</span>        .get(0).getRowLength(), rowA, 0, rowA.length));<a name="line.4953"></a>
+<span class="sourceLineNo">4954</span>    assertFalse(hasNext);<a name="line.4954"></a>
+<span class="sourceLineNo">4955</span>    scanner.close();<a name="line.4955"></a>
+<span class="sourceLineNo">4956</span>  }<a name="line.4956"></a>
+<span class="sourceLineNo">4957</span><a name="line.4957"></a>
+<span class="sourceLineNo">4958</span>  @Test<a name="line.4958"></a>
+<span class="sourceLineNo">4959</span>  public void testReverseScanner_FromMemStore_SingleCF_LargerKey()<a name="line.4959"></a>
+<span class="sourceLineNo">4960</span>      throws IOException {<a name="line.4960"></a>
+<span class="sourceLineNo">4961</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.4961"></a>
+<span class="sourceLineNo">4962</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.4962"></a>
+<span class="sourceLineNo">4963</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.4963"></a>
+<span class="sourceLineNo">4964</span>    byte[] rowD = Bytes.toBytes("rowD");<a name="line.4964"></a>
+<span class="sourceLineNo">4965</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.4965"></a>
+<span class="sourceLineNo">4966</span>    byte[][] families = { cf };<a name="line.4966"></a>
+<span class="sourceLineNo">4967</span>    byte[] col = Bytes.toBytes("C");<a name="line.4967"></a>
+<span class="sourceLineNo">4968</span>    long ts = 1;<a name="line.4968"></a>
+<span class="sourceLineNo">4969</span>    this.region = initHRegion(tableName, method, families);<a name="line.4969"></a>
+<span class="sourceLineNo">4970</span>    KeyValue kv1 = new KeyValue(rowC, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4970"></a>
+<span class="sourceLineNo">4971</span>    KeyValue kv11 = new KeyValue(rowC, cf, col, ts + 1, KeyValue.Type.Put,<a name="line.4971"></a>
+<span class="sourceLineNo">4972</span>        null);<a name="line.4972"></a>
+<span class="sourceLineNo">4973</span>    KeyValue kv2 = new KeyValue(rowA, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4973"></a>
+<span class="sourceLineNo">4974</span>    KeyValue kv3 = new KeyValue(rowB, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4974"></a>
+<span class="sourceLineNo">4975</span>    Put put = null;<a name="line.4975"></a>
+<span class="sourceLineNo">4976</span>    put = new Put(rowC);<a name="line.4976"></a>
+<span class="sourceLineNo">4977</span>    put.add(kv1);<a name="line.4977"></a>
+<span class="sourceLineNo">4978</span>    put.add(kv11);<a name="line.4978"></a>
+<span class="sourceLineNo">4979</span>    region.put(put);<a name="line.4979"></a>
+<span class="sourceLineNo">4980</span>    put = new Put(rowA);<a name="line.4980"></a>
+<span class="sourceLineNo">4981</span>    put.add(kv2);<a name="line.4981"></a>
+<span class="sourceLineNo">4982</span>    region.put(put);<a name="line.4982"></a>
+<span class="sourceLineNo">4983</span>    put = new Put(rowB);<a name="line.4983"></a>
+<span class="sourceLineNo">4984</span>    put.add(kv3);<a name="line.4984"></a>
+<span class="sourceLineNo">4985</span>    region.put(put);<a name="line.4985"></a>
+<span class="sourceLineNo">4986</span><a name="line.4986"></a>
+<span class="sourceLineNo">4987</span>    Scan scan = new Scan(rowD);<a name="line.4987"></a>
+<span class="sourceLineNo">4988</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.4988"></a>
+<span class="sourceLineNo">4989</span>    scan.setReversed(true);<a name="line.4989"></a>
+<span class="sourceLineNo">4990</span>    scan.setMaxVersions(5);<a name="line.4990"></a>
+<span class="sourceLineNo">4991</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.4991"></a>
+<span class="sourceLineNo">4992</span>    boolean hasNext = scanner.next(currRow);<a name="line.4992"></a>
+<span class="sourceLineNo">4993</span>    assertEquals(2, currRow.size());<a name="line.4993"></a>
+<span class="sourceLineNo">4994</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4994"></a>
+<span class="sourceLineNo">4995</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.4995"></a>
+<span class="sourceLineNo">4996</span>    assertTrue(hasNext);<a name="line.4996"></a>
+<span class="sourceLineNo">4997</span>    currRow.clear();<a name="line.4997"></a>
+<span class="sourceLineNo">4998</span>    hasNext = scanner.next(currRow);<a name="line.4998"></a>
+<span class="sourceLineNo">4999</span>    assertEquals(1, currRow.size());<a name="line.4999"></a>
+<span class="sourceLineNo">5000</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5000"></a>
+<span class="sourceLineNo">5001</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.5001"></a>
+<span class="sourceLineNo">5002</span>    assertTrue(hasNext);<a name="line.5002"></a>
+<span class="sourceLineNo">5003</span>    currRow.clear();<a name="line.5003"></a>
+<span class="sourceLineNo">5004</span>    hasNext = scanner.next(currRow);<a name="line.5004"></a>
+<span class="sourceLineNo">5005</span>    assertEquals(1, currRow.size());<a name="line.5005"></a>
+<span class="sourceLineNo">5006</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5006"></a>
+<span class="sourceLineNo">5007</span>        .get(0).getRowLength(), rowA, 0, rowA.length));<a name="line.5007"></a>
+<span class="sourceLineNo">5008</span>    assertFalse(hasNext);<a name="line.5008"></a>
+<span class="sourceLineNo">5009</span>    scanner.close();<a name="line.5009"></a>
+<span class="sourceLineNo">5010</span>  }<a name="line.5010"></a>
+<span class="sourceLineNo">5011</span><a name="line.5011"></a>
+<span class="sourceLineNo">5012</span>  @Test<a name="line.5012"></a>
+<span class="sourceLineNo">5013</span>  public void testReverseScanner_FromMemStore_SingleCF_FullScan()<a name="line.5013"></a>
+<span class="sourceLineNo">5014</span>      throws IOException {<a name="line.5014"></a>
+<span class="sourceLineNo">5015</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.5015"></a>
+<span class="sourceLineNo">5016</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.5016"></a>
+<span class="sourceLineNo">5017</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.5017"></a>
+<span class="sourceLineNo">5018</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.5018"></a>
+<span class="sourceLineNo">5019</span>    byte[][] families = { cf };<a name="line.5019"></a>
+<span class="sourceLineNo">5020</span>    byte[] col = Bytes.toBytes("C");<a name="line.5020"></a>
+<span class="sourceLineNo">5021</span>    long ts = 1;<a name="line.5021"></a>
+<span class="sourceLineNo">5022</span>    this.region = initHRegion(tableName, method, families);<a name="line.5022"></a>
+<span class="sourceLineNo">5023</span>    KeyValue kv1 = new KeyValue(rowC, cf, col, ts, KeyValue.Type.Put, null);<a name="line.5023"></a>
+<span class="sourceLineNo">5024</span>    KeyValue kv11 = new KeyValue(rowC, cf, col, ts + 1, KeyValue.Type.Put,<a name="line.5024"></a>
+<span class="sourceLineNo">5025</span>        null);<a name="line.5025"></a>
+<span class="sourceLineNo">5026</span>    KeyValue kv2 = new KeyValue(rowA, cf, col, ts, KeyValue.Type.Put, null);<a name="line.5026"></a>
+<span class="sourceLineNo">5027</span>    KeyValue kv3 = new KeyValue(rowB, cf, col, ts, KeyValue.Type.Put, null);<a name="line.5027"></a>
+<span class="sourceLineNo">5028</span>    Put put = null;<a name="line.5028"></a>
+<span class="sourceLineNo">5029</span>    put = new Put(rowC);<a name="line.5029"></a>
+<span class="sourceLineNo">5030</span>    put.add(kv1);<a name="line.5030"></a>
+<span class="sourceLineNo">5031</span>    put.add(kv11);<a name="line.5031"></a>
+<span class="sourceLineNo">5032</span>    region.put(put);<a name="line.5032"></a>
+<span class="sourceLineNo">5033</span>    put = new Put(rowA);<a name="line.5033"></a>
+<span class="sourceLineNo">5034</span>    put.add(kv2);<a name="line.5034"></a>
+<span class="sourceLineNo">5035</span>    region.put(put);<a name="line.5035"></a>
+<span class="sourceLineNo">5036</span>    put = new Put(rowB);<a name="line.5036"></a>
+<span class="sourceLineNo">5037</span>    put.add(kv3);<a name="line.5037"></a>
+<span class="sourceLineNo">5038</span>    region.put(put);<a name="line.5038"></a>
+<span class="sourceLineNo">5039</span>    Scan scan = new Scan();<a name="line.5039"></a>
+<span class="sourceLineNo">5040</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5040"></a>
+<span class="sourceLineNo">5041</span>    scan.setReversed(true);<a name="line.5041"></a>
+<span class="sourceLineNo">5042</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5042"></a>
+<span class="sourceLineNo">5043</span>    boolean hasNext = scanner.next(currRow);<a name="line.5043"></a>
+<span class="sourceLineNo">5044</span>    assertEquals(1, currRow.size());<a name="line.5044"></a>
+<span class="sourceLineNo">5045</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5045"></a>
+<span class="sourceLineNo">5046</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.5046"></a>
+<span class="sourceLineNo">5047</span>    assertTrue(hasNext);<a name="line.5047"></a>
+<span class="sourceLineNo">5048</span>    currRow.clear();<a name="line.5048"></a>
+<span class="sourceLineNo">5049</span>    hasNext = scanner.next(currRow);<a name="line.5049"></a>
+<span class="sourceLineNo">5050</span>    assertEquals(1, currRow.size());<a name="line.5050"></a>
+<span class="sourceLineNo">5051</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5051"></a>
+<span class="sourceLineNo">5052</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.5052"></a>
+<span class="sourceLineNo">5053</span>    assertTrue(hasNext);<a name="line.5053"></a>
+<span class="sourceLineNo">5054</span>    currRow.clear();<a name="line.5054"></a>
+<span class="sourceLineNo">5055</span>    hasNext = scanner.next(currRow);<a name="line.5055"></a>
+<span class="sourceLineNo">5056</span>    assertEquals(1, currRow.size());<a name="line.5056"></a>
+<span class="sourceLineNo">5057</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5057"></a>
+<span class="sourceLineNo">5058</span>        .get(0).getRowLength(), rowA, 0, rowA.length));<a name="line.5058"></a>
+<span class="sourceLineNo">5059</span>    assertFalse(hasNext);<a name="line.5059"></a>
+<span class="sourceLineNo">5060</span>    scanner.close();<a name="line.5060"></a>
+<span class="sourceLineNo">5061</span>  }<a name="line.5061"></a>
+<span class="sourceLineNo">5062</span><a name="line.5062"></a>
+<span class="sourceLineNo">5063</span>  @Test<a name="line.5063"></a>
+<span class="sourceLineNo">5064</span>  public void testReverseScanner_moreRowsMayExistAfter() throws IOException {<a name="line.5064"></a>
+<span class="sourceLineNo">5065</span>    // case for "INCLUDE_AND_SEEK_NEXT_ROW &amp; SEEK_NEXT_ROW" endless loop<a name="line.5065"></a>
+<span class="sourceLineNo">5066</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.5066"></a>
+<span class="sourceLineNo">5067</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.5067"></a>
+<span class="sourceLineNo">5068</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.5068"></a>
+<span class="sourceLineNo">5069</span>    byte[] rowD = Bytes.toBytes("rowD");<a name="line.5069"></a>
+<span class="sourceLineNo">5070</span>    byte[] rowE = Bytes.toBytes("rowE");<a name="line.5070"></a>
+<span class="sourceLineNo">5071</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.5071"></a>
+<span class="sourceLineNo">5072</span>    byte[][] families = { cf };<a name="line.5072"></a>
+<span class="sourceLineNo">5073</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.5073"></a>
+<span class="sourceLineNo">5074</span>    byte[] col2 = Bytes.toBytes("col2");<a name="line.5074"></a>
+<span class="sourceLineNo">5075</span>    long ts = 1;<a name="line.5075"></a>
+<span class="sourceLineNo">5076</span>    this.region = initHRegion(tableName, method, families);<a name="line.5076"></a>
+<span class="sourceLineNo">5077</span>    KeyValue kv1 = new KeyValue(rowA, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5077"></a>
+<span class="sourceLineNo">5078</span>    KeyValue kv2 = new KeyValue(rowB, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5078"></a>
+<span class="sourceLineNo">5079</span>    KeyValue kv3 = new KeyValue(rowC, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5079"></a>
+<span class="sourceLineNo">5080</span>    KeyValue kv4_1 = new KeyValue(rowD, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5080"></a>
+<span class="sourceLineNo">5081</span>    KeyValue kv4_2 = new KeyValue(rowD, cf, col2, ts, KeyValue.Type.Put, null);<a name="line.5081"></a>
+<span class="sourceLineNo">5082</span>    KeyValue kv5 = new KeyValue(rowE, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5082"></a>
+<span class="sourceLineNo">5083</span>    Put put = null;<a name="line.5083"></a>
+<span class="sourceLineNo">5084</span>    put = new Put(rowA);<a name="line.5084"></a>
+<span class="sourceLineNo">5085</span>    put.add(kv1);<a name="line.5085"></a>
+<span class="sourceLineNo">5086</span>    region.put(put);<a name="line.5086"></a>
+<span class="sourceLineNo">5087</span>    put = new Put(rowB);<a name="line.5087"></a>
+<span class="sourceLineNo">5088</span>    put.add(kv2);<a name="line.5088"></a>
+<span class="sourceLineNo">5089</span>    region.put(put);<a name="line.5089"></a>
+<span class="sourceLineNo">5090</span>    put = new Put(rowC);<a name="line.5090"></a>
+<span class="sourceLineNo">5091</span>    put.add(kv3);<a name="line.5091"></a>
+<span class="sourceLineNo">5092</span>    region.put(put);<a name="line.5092"></a>
+<span class="sourceLineNo">5093</span>    put = new Put(rowD);<a name="line.5093"></a>
+<span class="sourceLineNo">5094</span>    put.add(kv4_1);<a name="line.5094"></a>
+<span class="sourceLineNo">5095</span>    region.put(put);<a name="line.5095"></a>
+<span class="sourceLineNo">5096</span>    put = new Put(rowD);<a name="line.5096"></a>
+<span class="sourceLineNo">5097</span>    put.add(kv4_2);<a name="line.5097"></a>
+<span class="sourceLineNo">5098</span>    region.put(put);<a name="line.5098"></a>
+<span class="sourceLineNo">5099</span>    put = new Put(rowE);<a name="line.5099"></a>
+<span class="sourceLineNo">5100</span>    put.add(kv5);<a name="line.5100"></a>
+<span class="sourceLineNo">5101</span>    region.put(put);<a name="line.5101"></a>
+<span class="sourceLineNo">5102</span>    region.flush(true);<a name="line.5102"></a>
+<span class="sourceLineNo">5103</span>    Scan scan = new Scan(rowD, rowA);<a name="line.5103"></a>
+<span class="sourceLineNo">5104</span>    scan.addColumn(families[0], col1);<a name="line.5104"></a>
+<span class="sourceLineNo">5105</span>    scan.setReversed(true);<a name="line.5105"></a>
+<span class="sourceLineNo">5106</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5106"></a>
+<span class="sourceLineNo">5107</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5107"></a>
+<span class="sourceLineNo">5108</span>    boolean hasNext = scanner.next(currRow);<a name="line.5108"></a>
+<span class="sourceLineNo">5109</span>    assertEquals(1, currRow.size());<a name="line.5109"></a>
+<span class="sourceLineNo">5110</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5110"></a>
+<span class="sourceLineNo">5111</span>        .get(0).getRowLength(), rowD, 0, rowD.length));<a name="line.5111"></a>
+<span class="sourceLineNo">5112</span>    assertTrue(hasNext);<a name="line.5112"></a>
+<span class="sourceLineNo">5113</span>    currRow.clear();<a name="line.5113"></a>
+<span class="sourceLineNo">5114</span>    hasNext = scanner.next(currRow);<a name="line.5114"></a>
+<span class="sourceLineNo">5115</span>    assertEquals(1, currRow.size());<a name="line.5115"></a>
+<span class="sourceLineNo">5116</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5116"></a>
+<span class="sourceLineNo">5117</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.5117"></a>
+<span class="sourceLineNo">5118</span>    assertTrue(hasNext);<a name="line.5118"></a>
+<span class="sourceLineNo">5119</span>    currRow.clear();<a name="line.5119"></a>
+<span class="sourceLineNo">5120</span>    hasNext = scanner.next(currRow);<a name="line.5120"></a>
+<span class="sourceLineNo">5121</span>    assertEquals(1, currRow.size());<a name="line.5121"></a>
+<span class="sourceLineNo">5122</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5122"></a>
+<span class="sourceLineNo">5123</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.5123"></a>
+<span class="sourceLineNo">5124</span>    assertFalse(hasNext);<a name="line.5124"></a>
+<span class="sourceLineNo">5125</span>    scanner.close();<a name="line.5125"></a>
+<span class="sourceLineNo">5126</span><a name="line.5126"></a>
+<span class="sourceLineNo">5127</span>    scan = new Scan(rowD, rowA);<a name="line.5127"></a>
+<span class="sourceLineNo">5128</span>    scan.addColumn(families[0], col2);<a name="line.5128"></a>
+<span class="sourceLineNo">5129</span>    scan.setReversed(true);<a name="line.5129"></a>
+<span class="sourceLineNo">5130</span>    currRow.clear();<a name="line.5130"></a>
+<span class="sourceLineNo">5131</span>    scanner = region.getScanner(scan);<a name="line.5131"></a>
+<span class="sourceLineNo">5132</span>    hasNext = scanner.next(currRow);<a name="line.5132"></a>
+<span class="sourceLineNo">5133</span>    assertEquals(1, currRow.size());<a name="line.5133"></a>
+<span class="sourceLineNo">5134</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5134"></a>
+<span class="sourceLineNo">5135</span>        .get(0).getRowLength(), rowD, 0, rowD.length));<a name="line.5135"></a>
+<span class="sourceLineNo">5136</span>    scanner.close();<a name="line.5136"></a>
+<span class="sourceLineNo">5137</span>  }<a name="line.5137"></a>
+<span class="sourceLineNo">5138</span><a name="line.5138"></a>
+<span class="sourceLineNo">5139</span>  @Test<a name="line.5139"></a>
+<span class="sourceLineNo">5140</span>  public void testReverseScanner_smaller_blocksize() throws IOException {<a name="line.5140"></a>
+<span class="sourceLineNo">5141</span>    // case to ensure no conflict with HFile index optimization<a name="line.5141"></a>
+<span class="sourceLineNo">5142</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.5142"></a>
+<span class="sourceLineNo">5143</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.5143"></a>
+<span class="sourceLineNo">5144</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.5144"></a>
+<span class="sourceLineNo">5145</span>    byte[] rowD = Bytes.toBytes("rowD");<a name="line.5145"></a>
+<span class="sourceLineNo">5146</span>    byte[] rowE = Bytes.toBytes("rowE");<a name="line.5146"></a>
+<span class="sourceLineNo">5147</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.5147"></a>
+<span class="sourceLineNo">5148</span>    byte[][] families = { cf };<a name="line.5148"></a>
+<span class="sourceLineNo">5149</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.5149"></a>
+<span class="sourceLineNo">5150</span>    byte[] col2 = Bytes.toBytes("col2");<a name="line.5150"></a>
+<span class="sourceLineNo">5151</span>    long ts = 1;<a name="line.5151"></a>
+<span class="sourceLineNo">5152</span>    HBaseConfiguration config = new HBaseConfiguration();<a name="line.5152"></a>
+<span class="sourceLineNo">5153</span>    config.setInt("test.block.size", 1);<a name="line.5153"></a>
+<span class="sourceLineNo">5154</span>    this.region = initHRegion(tableName, method, config, families);<a name="line.5154"></a>
+<span class="sourceLineNo">5155</span>    KeyValue kv1 = new KeyValue(rowA, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5155"></a>
+<span class="sourceLineNo">5156</span>    KeyValue kv2 = new KeyValue(rowB, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5156"></a>
+<span class="sourceLineNo">5157</span>    KeyValue kv3 = new KeyValue(rowC, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5157"></a>
+<span class="sourceLineNo">5158</span>    KeyValue kv4_1 = new KeyValue(rowD, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5158"></a>
+<span class="sourceLineNo">5159</span>    KeyValue kv4_2 = new KeyValue(rowD, cf, col2, ts, KeyValue.Type.Put, null);<a name="line.5159"></a>
+<span class="sourceLineNo">5160</span>    KeyValue kv5 = new KeyValue(rowE, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5160"></a>
+<span class="sourceLineNo">5161</span>    Put put = null;<a name="line.5161"></a>
+<span class="sourceLineNo">5162</span>    put = new Put(rowA);<a name="line.5162"></a>
+<span class="sourceLineNo">5163</span>    put.add(kv1);<a name="line.5163"></a>
+<span class="sourceLineNo">5164</span>    region.put(put);<a name="line.5164"></a>
+<span class="sourceLineNo">5165</span>    put = new Put(rowB);<a name="line.5165"></a>
+<span class="sourceLineNo">5166</span>    put.add(kv2);<a name="line.5166"></a>
+<span class="sourceLineNo">5167</span>    region.put(put);<a name="line.5167"></a>
+<span class="sourceLineNo">5168</span>    put = new Put(rowC);<a name="line.5168"></a>
+<span class="sourceLineNo">5169</span>    put.add(kv3);<a name="line.5169"></a>
+<span class="sourceLineNo">5170</span>    region.put(put);<a name="line.5170"></a>
+<span class="sourceLineNo">5171</span>    put = new Put(rowD);<a name="line.5171"></a>
+<span class="sourceLineNo">5172</span>    put.add(kv4_1);<a name="line.5172"></a>
+<span class="sourceLineNo">5173</span>    region.put(put);<a name="line.5173"></a>
+<span class="sourceLineNo">5174</span>    put = new Put(rowD);<a name="line.5174"></a>
+<span class="sourceLineNo">5175</span>    put.add(kv4_2);<a name="line.5175"></a>
+<span class="sourceLineNo">5176</span>    region.put(put);<a name="line.5176"></a>
+<span class="sourceLineNo">5177</span>    put = new Put(rowE);<a name="line.5177"></a>
+<span class="sourceLineNo">5178</span>    put.add(kv5);<a name="line.5178"></a>
+<span class="sourceLineNo">5179</span>    region.put(put);<a name="line.5179"></a>
+<span class="sourceLineNo">5180</span>    region.flush(true);<a name="line.5180"></a>
+<span class="sourceLineNo">5181</span>    Scan scan = new Scan(rowD, rowA);<a name="line.5181"></a>
+<span class="sourceLineNo">5182</span>    scan.addColumn(families[0], col1);<a name="line.5182"></a>
+<span class="sourceLineNo">5183</span>    scan.setReversed(true);<a name="line.5183"></a>
+<span class="sourceLineNo">5184</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5184"></a>
+<span class="sourceLineNo">5185</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5185"></a>
+<span class="sourceLineNo">5186</span>    boolean hasNext = scanner.next(currRow);<a name="line.5186"></a>
+<span class="sourceLineNo">5187</span>    assertEquals(1, currRow.size());<a name="line.5187"></a>
+<span class="sourceLineNo">5188</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5188"></a>
+<span class="sourceLineNo">5189</span>        .get(0).getRowLength(), rowD, 0, rowD.length));<a name="line.5189"></a>
+<span class="sourceLineNo">5190</span>    assertTrue(hasNext);<a name="line.5190"></a>
+<span class="sourceLineNo">5191</span>    currRow.clear();<a name="line.5191"></a>
+<span class="sourceLineNo">5192</span>    hasNext = scanner.next(currRow);<a name="line.5192"></a>
+<span class="sourceLineNo">5193</span>    assertEquals(1, currRow.size());<a name="line.5193"></a>
+<span class="sourceLineNo">5194</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5194"></a>
+<span class="sourceLineNo">5195</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.5195"></a>
+<span class="sourceLineNo">5196</span>    assertTrue(hasNext);<a name="line.5196"></a>
+<span class="sourceLineNo">5197</span>    currRow.clear();<a name="line.5197"></a>
+<span class="sourceLineNo">5198</span>    hasNext = scanner.next(currRow);<a name="line.5198"></a>
+<span class="sourceLineNo">5199</span>    assertEquals(1, currRow.size());<a name="line.5199"></a>
+<span class="sourceLineNo">5200</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5200"></a>
+<span class="sourceLineNo">5201</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.5201"></a>
+<span class="sourceLineNo">5202</span>    assertFalse(hasNext);<a name="line.5202"></a>
+<span class="sourceLineNo">5203</span>    scanner.close();<a name="line.5203"></a>
+<span class="sourceLineNo">5204</span><a name="line.5204"></a>
+<span class="sourceLineNo">5205</span>    scan = new Scan(rowD, rowA);<a name="line.5205"></a>
+<span class="sourceLineNo">5206</span>    scan.addColumn(families[0], col2);<a name="line.5206"></a>
+<span class="sourceLineNo">5207</span>    scan.setReversed(true);<a name="line.5207"></a>
+<span class="sourceLineNo">5208</span>    currRow.clear();<a name="line.5208"></a>
+<span class="sourceLineNo">5209</span>    scanner = region.getScanner(scan);<a name="line.5209"></a>
+<span class="sourceLineNo">5210</span>    hasNext = scanner.next(currRow);<a name="line.5210"></a>
+<span class="sourceLineNo">5211</span>    assertEquals(1, currRow.size());<a name="line.5211"></a>
+<span class="sourceLineNo">5212</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5212"></a>
+<span class="sourceLineNo">5213</span>        .get(0).getRowLength(), rowD, 0, rowD.length));<a name="line.5213"></a>
+<span class="sourceLineNo">5214</span>    scanner.close();<a name="line.5214"></a>
+<span class="sourceLineNo">5215</span>  }<a name="line.5215"></a>
+<span class="sourceLineNo">5216</span><a name="line.5216"></a>
+<span class="sourceLineNo">5217</span>  @Test<a name="line.5217"></a>
+<span class="sourceLineNo">5218</span>  public void testReverseScanner_FromMemStoreAndHFiles_MultiCFs1()<a name="line.5218"></a>
+<span class="sourceLineNo">5219</span>      throws IOException {<a name="line.5219"></a>
+<span class="sourceLineNo">5220</span>    byte[] row0 = Bytes.toBytes("row0"); // 1 kv<a name="line.5220"></a>
+<span class="sourceLineNo">5221</span>    byte[] row1 = Bytes.toBytes("row1"); // 2 kv<a name="line.5221"></a>
+<span class="sourceLineNo">5222</span>    byte[] row2 = Bytes.toBytes("row2"); // 4 kv<a name="line.5222"></a>
+<span class="sourceLineNo">5223</span>    byte[] row3 = Bytes.toBytes("row3"); // 2 kv<a name="line.5223"></a>
+<span class="sourceLineNo">5224</span>    byte[] row4 = Bytes.toBytes("row4"); // 5 kv<a name="line.5224"></a>
+<span class="sourceLineNo">5225</span>    byte[] row5 = Bytes.toBytes("row5"); // 2 kv<a name="line.5225"></a>
+<span class="sourceLineNo">5226</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5226"></a>
+<span class="sourceLineNo">5227</span>    byte[] cf2 = Bytes.toBytes("CF2");<a name="line.5227"></a>
+<span class="sourceLineNo">5228</span>    byte[] cf3 = Bytes.toBytes("CF3");<a name="line.5228"></a>
+<span class="sourceLineNo">5229</span>    byte[][] families = { cf1, cf2, cf3 };<a name="line.5229"></a>
+<span class="sourceLineNo">5230</span>    byte[] col = Bytes.toBytes("C");<a name="line.5230"></a>
+<span class="sourceLineNo">5231</span>    long ts = 1;<a name="line.5231"></a>
+<span class="sourceLineNo">5232</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5232"></a>
+<span class="sourceLineNo">5233</span>    // disable compactions in this test.<a name="line.5233"></a>
+<span class="sourceLineNo">5234</span>    conf.setInt("hbase.hstore.compactionThreshold", 10000);<a name="line.5234"></a>
+<span class="sourceLineNo">5235</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5235"></a>
+<span class="sourceLineNo">5236</span>    // kv naming style: kv(row number) totalKvCountInThisRow seq no<a name="line.5236"></a>
+<span class="sourceLineNo">5237</span>    KeyValue kv0_1_1 = new KeyValue(row0, cf1, col, ts, KeyValue.Type.Put,<a name="line.5237"></a>
 <span class="sourceLineNo">5238</span>        null);<a name="line.5238"></a>
-<span class="sourceLineNo">5239</span>    KeyValue kv2_4_4 = new KeyValue(row2, cf1, col, ts + 4,<a name="line.5239"></a>
-<span class="sourceLineNo">5240</span>        KeyValue.Type.Put, null);<a name="line.5240"></a>
-<span class="sourceLineNo">5241</span>    KeyValue kv3_2_1 = new KeyValue(row3, cf2, col, ts, KeyValue.Type.Put,<a name="line.5241"></a>
-<span class="sourceLineNo">5242</span>        null);<a name="line.5242"></a>
-<span class="sourceLineNo">5243</span>    KeyValue kv3_2_2 = new KeyValue(row3, cf1, col, ts + 4,<a name="line.5243"></a>
-<span class="sourceLineNo">5244</span>        KeyValue.Type.Put, null);<a name="line.5244"></a>
-<span class="sourceLineNo">5245</span>    KeyValue kv4_5_1 = new KeyValue(row4, cf1, col, ts, KeyValue.Type.Put,<a name="line.5245"></a>
+<span class="sourceLineNo">5239</span>    KeyValue kv1_2_1 = new KeyValue(row1, cf2, col, ts, KeyValue.Type.Put,<a name="line.5239"></a>
+<span class="sourceLineNo">5240</span>        null);<a name="line.5240"></a>
+<span class="sourceLineNo">5241</span>    KeyValue kv1_2_2 = new KeyValue(row1, cf1, col, ts + 1,<a name="line.5241"></a>
+<span class="sourceLineNo">5242</span>        KeyValue.Type.Put, null);<a name="line.5242"></a>
+<span class="sourceLineNo">5243</span>    KeyValue kv2_4_1 = new KeyValue(row2, cf2, col, ts, KeyValue.Type.Put,<a name="line.5243"></a>
+<span class="sourceLineNo">5244</span>        null);<a name="line.5244"></a>
+<span class="sourceLineNo">5245</span>    KeyValue kv2_4_2 = new KeyValue(row2, cf1, col, ts, KeyValue.Type.Put,<a name="line.5245"></a>
 <span class="sourceLineNo">5246</span>        null);<a name="line.5246"></a>
-<span class="sourceLineNo">5247</span>    KeyValue kv4_5_2 = new KeyValue(row4, cf3, col, ts, KeyValue.Type.Put,<a name="line.5247"></a>
+<span class="sourceLineNo">5247</span>    KeyValue kv2_4_3 = new KeyValue(row2, cf3, col, ts, KeyValue.Type.Put,<a name="line.5247"></a>
 <span class="sourceLineNo">5248</span>        null);<a name="line.5248"></a>
-<span class="sourceLineNo">5249</span>    KeyValue kv4_5_3 = new KeyValue(row4, cf3, col, ts + 5,<a name="line.5249"></a>
+<span class="sourceLineNo">5249</span>    KeyValue kv2_4_4 = new KeyValue(row2, cf1, col, ts + 4,<a name="line.5249"></a>
 <span class="sourceLineNo">5250</span>        KeyValue.Type.Put, null);<a name="line.5250"></a>
-<span class="sourceLineNo">5251</span>    KeyValue kv4_5_4 = new KeyValue(row4, cf2, col, ts, KeyValue.Type.Put,<a name="line.5251"></a>
+<span class="sourceLineNo">5251</span>    KeyValue kv3_2_1 = new KeyValue(row3, cf2, col, ts, KeyValue.Type.Put,<a name="line.5251"></a>
 <span class="sourceLineNo">5252</span>        null);<a name="line.5252"></a>
-<span class="sourceLineNo">5253</span>    KeyValue kv4_5_5 = new KeyValue(row4, cf1, col, ts + 3,<a name="line.5253"></a>
+<span class="sourceLineNo">5253</span>    KeyValue kv3_2_2 = new KeyValue(row3, cf1, col, ts + 4,<a name="line.5253"></a>
 <span class="sourceLineNo">5254</span>        KeyValue.Type.Put, null);<a name="line.5254"></a>
-<span class="sourceLineNo">5255</span>    KeyValue kv5_2_1 = new KeyValue(row5, cf2, col, ts, KeyValue.Type.Put,<a name="line.5255"></a>
+<span class="sourceLineNo">5255</span>    KeyValue kv4_5_1 = new KeyValue(row4, cf1, col, ts, KeyValue.Type.Put,<a name="line.5255"></a>
 <span class="sourceLineNo">5256</span>        null);<a name="line.5256"></a>
-<span class="sourceLineNo">5257</span>    KeyValue kv5_2_2 = new KeyValue(row5, cf3, col, ts, KeyValue.Type.Put,<a name="line.5257"></a>
+<span class="sourceLineNo">5257</span>    KeyValue kv4_5_2 = new KeyValue(row4, cf3, col, ts, KeyValue.Type.Put,<a name="line.5257"></a>
 <span class="sourceLineNo">5258</span>        null);<a name="line.5258"></a>
-<span class="sourceLineNo">5259</span>    // hfiles(cf1/cf2) :"row1"(1 kv) / "row2"(1 kv) / "row4"(2 kv)<a name="line.5259"></a>
-<span class="sourceLineNo">5260</span>    Put put = null;<a name="line.5260"></a>
-<span class="sourceLineNo">5261</span>    put = new Put(row1);<a name="line.5261"></a>
-<span class="sourceLineNo">5262</span>    put.add(kv1_2_1);<a name="line.5262"></a>
-<span class="sourceLineNo">5263</span>    region.put(put);<a name="line.5263"></a>
-<span class="sourceLineNo">5264</span>    put = new Put(row2);<a name="line.5264"></a>
-<span class="sourceLineNo">5265</span>    put.add(kv2_4_1);<a name="line.5265"></a>
-<span class="sourceLineNo">5266</span>    region.put(put);<a name="line.5266"></a>
-<span class="sourceLineNo">5267</span>    put = new Put(row4);<a name="line.5267"></a>
-<span class="sourceLineNo">5268</span>    put.add(kv4_5_4);<a name="line.5268"></a>
-<span class="sourceLineNo">5269</span>    put.add(kv4_5_5);<a name="line.5269"></a>
-<span class="sourceLineNo">5270</span>    region.put(put);<a name="line.5270"></a>
-<span class="sourceLineNo">5271</span>    region.flush(true);<a name="line.5271"></a>
-<span class="sourceLineNo">5272</span>    // hfiles(cf1/cf3) : "row1" (1 kvs) / "row2" (1 kv) / "row4" (2 kv)<a name="line.5272"></a>
-<span class="sourceLineNo">5273</span>    put = new Put(row4);<a name="line.5273"></a>
-<span class="sourceLineNo">5274</span>    put.add(kv4_5_1);<a name="line.5274"></a>
-<span class="sourceLineNo">5275</span>    put.add(kv4_5_3);<a name="line.5275"></a>
+<span class="sourceLineNo">5259</span>    KeyValue kv4_5_3 = new KeyValue(row4, cf3, col, ts + 5,<a name="line.5259"></a>
+<span class="sourceLineNo">5260</span>        KeyValue.Type.Put, null);<a name="line.5260"></a>
+<span class="sourceLineNo">5261</span>    KeyValue kv4_5_4 = new KeyValue(row4, cf2, col, ts, KeyValue.Type.Put,<a name="line.5261"></a>
+<span class="sourceLineNo">5262</span>        null);<a name="line.5262"></a>
+<span class="sourceLineNo">5263</span>    KeyValue kv4_5_5 = new KeyValue(row4, cf1, col, ts + 3,<a name="line.5263"></a>
+<span class="sourceLineNo">5264</span>        KeyValue.Type.Put, null);<a name="line.5264"></a>
+<span class="sourceLineNo">5265</span>    KeyValue kv5_2_1 = new KeyValue(row5, cf2, col, ts, KeyValue.Type.Put,<a name="line.5265"></a>
+<span class="sourceLineNo">5266</span>        null);<a name="line.5266"></a>
+<span class="sourceLineNo">5267</span>    KeyValue kv5_2_2 = new KeyValue(row5, cf3, col, ts, KeyValue.Type.Put,<a name="line.5267"></a>
+<span class="sourceLineNo">5268</span>        null);<a name="line.5268"></a>
+<span class="sourceLineNo">5269</span>    // hfiles(cf1/cf2) :"row1"(1 kv) / "row2"(1 kv) / "row4"(2 kv)<a name="line.5269"></a>
+<span class="sourceLineNo">5270</span>    Put put = null;<a name="line.5270"></a>
+<span class="sourceLineNo">5271</span>    put = new Put(row1);<a name="line.5271"></a>
+<span class="sourceLineNo">5272</span>    put.add(kv1_2_1);<a name="line.5272"></a>
+<span class="sourceLineNo">5273</span>    region.put(put);<a name="line.5273"></a>
+<span class="sourceLineNo">5274</span>    put = new Put(row2);<a name="line.5274"></a>
+<span class="sourceLineNo">5275</span>    put.add(kv2_4_1);<a name="line.5275"></a>
 <span class="sourceLineNo">5276</span>    region.put(put);<a name="line.5276"></a>
-<span class="sourceLineNo">5277</span>    put = new Put(row1);<a name="line.5277"></a>
-<span class="sourceLineNo">5278</span>    put.add(kv1_2_2);<a name="line.5278"></a>
-<span class="sourceLineNo">5279</span>    region.put(put);<a name="line.5279"></a>
-<span class="sourceLineNo">5280</span>    put = new Put(row2);<a name="line.5280"></a>
-<span class="sourceLineNo">5281</span>    put.add(kv2_4_4);<a name="line.5281"></a>
-<span class="sourceLineNo">5282</span>    region.put(put);<a name="line.5282"></a>
-<span class="sourceLineNo">5283</span>    region.flush(true);<a name="line.5283"></a>
-<span class="sourceLineNo">5284</span>    // hfiles(cf1/cf3) : "row2"(2 kv) / "row3"(1 kvs) / "row4" (1 kv)<a name="line.5284"></a>
-<span class="sourceLineNo">5285</span>    put = new Put(row4);<a name="line.5285"></a>
-<span class="sourceLineNo">5286</span>    put.add(kv4_5_2);<a name="line.5286"></a>
-<span class="sourceLineNo">5287</span>    region.put(put);<a name="line.5287"></a>
-<span class="sourceLineNo">5288</span>    put = new Put(row2);<a name="line.5288"></a>
-<span class="sourceLineNo">5289</span>    put.add(kv2_4_2);<a name="line.5289"></a>
-<span class="sourceLineNo">5290</span>    put.add(kv2_4_3);<a name="line.5290"></a>
-<span class="sourceLineNo">5291</span>    region.put(put);<a name="line.5291"></a>
-<span class="sourceLineNo">5292</span>    put = new Put(row3);<a name="line.5292"></a>
-<span class="sourceLineNo">5293</span>    put.add(kv3_2_2);<a name="line.5293"></a>
-<span class="sourceLineNo">5294</span>    region.put(put);<a name="line.5294"></a>
-<span class="sourceLineNo">5295</span>    region.flush(true);<a name="line.5295"></a>
-<span class="sourceLineNo">5296</span>    // memstore(cf1/cf2/cf3) : "row0" (1 kvs) / "row3" ( 1 kv) / "row5" (max)<a name="line.5296"></a>
-<span class="sourceLineNo">5297</span>    // ( 2 kv)<a name="line.5297"></a>
-<span class="sourceLineNo">5298</span>    put = new Put(row0);<a name="line.5298"></a>
-<span class="sourceLineNo">5299</span>    put.add(kv0_1_1);<a name="line.5299"></a>
-<span class="sourceLineNo">5300</span>    region.put(put);<a name="line.5300"></a>
-<span class="sourceLineNo">5301</span>    put = new Put(row3);<a name="line.5301"></a>
-<span class="sourceLineNo">5302</span>    put.add(kv3_2_1);<a name="line.5302"></a>
-<span class="sourceLineNo">5303</span>    region.put(put);<a name="line.5303"></a>
-<span class="sourceLineNo">5304</span>    put = new Put(row5);<a name="line.5304"></a>
-<span class="sourceLineNo">5305</span>    put.add(kv5_2_1);<a name="line.5305"></a>
-<span class="sourceLineNo">5306</span>    put.add(kv5_2_2);<a name="line.5306"></a>
-<span class="sourceLineNo">5307</span>    region.put(put);<a name="line.5307"></a>
-<span class="sourceLineNo">5308</span>    // scan range = ["row4", min), skip the max "row5"<a name="line.5308"></a>
-<span class="sourceLineNo">5309</span>    Scan scan = new Scan(row4);<a name="line.5309"></a>
-<span class="sourceLineNo">5310</span>    scan.setMaxVersions(5);<a name="line.5310"></a>
-<span class="sourceLineNo">5311</span>    scan.setBatch(3);<a name="line.5311"></a>
-<span class="sourceLineNo">5312</span>    scan.setReversed(true);<a name="line.5312"></a>
-<span class="sourceLineNo">5313</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5313"></a>
-<span class="sourceLineNo">5314</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5314"></a>
-<span class="sourceLineNo">5315</span>    boolean hasNext = false;<a name="line.5315"></a>
-<span class="sourceLineNo">5316</span>    // 1. scan out "row4" (5 kvs), "row5" can't be scanned out since not<a name="line.5316"></a>
-<span class="sourceLineNo">5317</span>    // included in scan range<a name="line.5317"></a>
-<span class="sourceLineNo">5318</span>    // "row4" takes 2 next() calls since batch=3<a name="line.5318"></a>
-<span class="sourceLineNo">5319</span>    hasNext = scanner.next(currRow);<a name="line.5319"></a>
-<span class="sourceLineNo">5320</span>    assertEquals(3, currRow.size());<a name="line.5320"></a>
-<span class="sourceLineNo">5321</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5321"></a>
-<span class="sourceLineNo">5322</span>        .get(0).getRowLength(), row4, 0, row4.length));<a name="line.5322"></a>
-<span class="sourceLineNo">5323</span>    assertTrue(hasNext);<a name="line.5323"></a>
-<span class="sourceLineNo">5324</span>    currRow.clear();<a name="line.5324"></a>
-<span class="sourceLineNo">5325</span>    hasNext = scanner.next(currRow);<a name="line.5325"></a>
-<span class="sourceLineNo">5326</span>    assertEquals(2, currRow.size());<a name="line.5326"></a>
-<span class="sourceLineNo">5327</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(),<a name="line.5327"></a>
-<span class="sourceLineNo">5328</span>        currRow.get(0).getRowLength(), row4, 0,<a name="line.5328"></a>
-<span class="sourceLineNo">5329</span>      row4.length));<a name="line.5329"></a>
-<span class="sourceLineNo">5330</span>    assertTrue(hasNext);<a name="line.5330"></a>
-<span class="sourceLineNo">5331</span>    // 2. scan out "row3" (2 kv)<a name="line.5331"></a>
-<span class="sourceLineNo">5332</span>    currRow.clear();<a name="line.5332"></a>
-<span class="sourceLineNo">5333</span>    hasNext = scanner.next(currRow);<a name="line.5333"></a>
-<span class="sourceLineNo">5334</span>    assertEquals(2, currRow.size());<a name="line.5334"></a>
-<span class="sourceLineNo">5335</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5335"></a>
-<span class="sourceLineNo">5336</span>        .get(0).getRowLength(), row3, 0, row3.length));<a name="line.5336"></a>
-<span class="sourceLineNo">5337</span>    assertTrue(hasNext);<a name="line.5337"></a>
-<span class="sourceLineNo">5338</span>    // 3. scan out "row2" (4 kvs)<a name="line.5338"></a>
-<span class="sourceLineNo">5339</span>    // "row2" takes 2 next() calls since batch=3<a name="line.5339"></a>
-<span class="sourceLineNo">5340</span>    currRow.clear();<a name="line.5340"></a>
-<span class="sourceLineNo">5341</span>    hasNext = scanner.next(currRow);<a name="line.5341"></a>
-<span class="sourceLineNo">5342</span>    assertEquals(3, currRow.size());<a name="line.5342"></a>
-<span class="sourceLineNo">5343</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5343"></a>
-<span class="sourceLineNo">5344</span>        .get(0).getRowLength(), row2, 0, row2.length));<a name="line.5344"></a>
-<span class="sourceLineNo">5345</span>    assertTrue(hasNext);<a name="line.5345"></a>
-<span class="sourceLineNo">5346</span>    currRow.clear();<a name="line.5346"></a>
-<span class="sourceLineNo">5347</span>    hasNext = scanner.next(currRow);<a name="line.5347"></a>
-<span class="sourceLineNo">5348</span>    assertEquals(1, currRow.size());<a name="line.5348"></a>
-<span class="sourceLineNo">5349</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5349"></a>
-<span class="sourceLineNo">5350</span>        .get(0).getRowLength(), row2, 0, row2.length));<a name="line.5350"></a>
-<span class="sourceLineNo">5351</span>    assertTrue(hasNext);<a name="line.5351"></a>
-<span class="sourceLineNo">5352</span>    // 4. scan out "row1" (2 kv)<a name="line.5352"></a>
-<span class="sourceLineNo">5353</span>    currRow.clear();<a name="line.5353"></a>
-<span class="sourceLineNo">5354</span>    hasNext = scanner.next(currRow);<a name="line.5354"></a>
-<span class="sourceLineNo">5355</span>    assertEquals(2, currRow.size());<a name="line.5355"></a>
-<span class="sourceLineNo">5356</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5356"></a>
-<span class="sourceLineNo">5357</span>        .get(0).getRowLength(), row1, 0, row1.length));<a name="line.5357"></a>
-<span class="sourceLineNo">5358</span>    assertTrue(hasNext);<a name="line.5358"></a>
-<span class="sourceLineNo">5359</span>    // 5. scan out "row0" (1 kv)<a name="line.5359"></a>
-<span class="sourceLineNo">5360</span>    currRow.clear();<a name="line.5360"></a>
-<span class="sourceLineNo">5361</span>    hasNext = scanner.next(currRow);<a name="line.5361"></a>
-<span class="sourceLineNo">5362</span>    assertEquals(1, currRow.size());<a name="line.5362"></a>
-<span class="sourceLineNo">5363</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5363"></a>
-<span class="sourceLineNo">5364</span>        .get(0).getRowLength(), row0, 0, row0.length));<a name="line.5364"></a>
-<span class="sourceLineNo">5365</span>    assertFalse(hasNext);<a name="line.5365"></a>
-<span class="sourceLineNo">5366</span><a name="line.5366"></a>
-<span class="sourceLineNo">5367</span>    scanner.close();<a name="line.5367"></a>
-<span class="sourceLineNo">5368</span>  }<a name="line.5368"></a>
-<span class="sourceLineNo">5369</span><a name="line.5369"></a>
-<span class="sourceLineNo">5370</span>  @Test<a name="line.5370"></a>
-<span class="sourceLineNo">5371</span>  public void testReverseScanner_FromMemStoreAndHFiles_MultiCFs2()<a name="line.5371"></a>
-<span class="sourceLineNo">5372</span>      throws IOException {<a name="line.5372"></a>
-<span class="sourceLineNo">5373</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.5373"></a>
-<span class="sourceLineNo">5374</span>    byte[] row2 = Bytes.toBytes("row2");<a name="line.5374"></a>
-<span class="sourceLineNo">5375</span>    byte[] row3 = Bytes.toBytes("row3");<a name="line.5375"></a>
-<span class="sourceLineNo">5376</span>    byte[] row4 = Bytes.toBytes("row4");<a name="line.5376"></a>
-<span class="sourceLineNo">5377</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5377"></a>
-<span class="sourceLineNo">5378</span>    byte[] cf2 = Bytes.toBytes("CF2");<a name="line.5378"></a>
-<span class="sourceLineNo">5379</span>    byte[] cf3 = Bytes.toBytes("CF3");<a name="line.5379"></a>
-<span class="sourceLineNo">5380</span>    byte[] cf4 = Bytes.toBytes("CF4");<a name="line.5380"></a>
-<span class="sourceLineNo">5381</span>    byte[][] families = { cf1, cf2, cf3, cf4 };<a name="line.5381"></a>
-<span class="sourceLineNo">5382</span>    byte[] col = Bytes.toBytes("C");<a name="line.5382"></a>
-<span class="sourceLineNo">5383</span>    long ts = 1;<a name="line.5383"></a>
-<span class="sourceLineNo">5384</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5384"></a>
-<span class="sourceLineNo">5385</span>    // disable compactions in this test.<a name="line.5385"></a>
-<span class="sourceLineNo">5386</span>    conf.setInt("hbase.hstore.compactionThreshold", 10000);<a name="line.5386"></a>
-<span class="sourceLineNo">5387</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5387"></a>
-<span class="sourceLineNo">5388</span>    KeyValue kv1 = new KeyValue(row1, cf1, col, ts, KeyValue.Type.Put, null);<a name="line.5388"></a>
-<span class="sourceLineNo">5389</span>    KeyValue kv2 = new KeyValue(row2, cf2, col, ts, KeyValue.Type.Put, null);<a name="line.5389"></a>
-<span class="sourceLineNo">5390</span>    KeyValue kv3 = new KeyValue(row3, cf3, col, ts, KeyValue.Type.Put, null);<a name="line.5390"></a>
-<span class="sourceLineNo">5391</span>    KeyValue kv4 = new KeyValue(row4, cf4, col, ts, KeyValue.Type.Put, null);<a name="line.5391"></a>
-<span class="sourceLineNo">5392</span>    // storefile1<a name="line.5392"></a>
-<span class="sourceLineNo">5393</span>    Put put = new Put(row1);<a name="line.5393"></a>
-<span class="sourceLineNo">5394</span>    put.add(kv1);<a name="line.5394"></a>
-<span class="sourceLineNo">5395</span>    region.put(put);<a name="line.5395"></a>
-<span class="sourceLineNo">5396</span>    region.flush(true);<a name="line.5396"></a>
-<span class="sourceLineNo">5397</span>    // storefile2<a name="line.5397"></a>
-<span class="sourceLineNo">5398</span>    put = new Put(row2);<a name="line.5398"></a>
-<span class="sourceLineNo">5399</span>    put.add(kv2);<a name="line.5399"></a>
-<span class="sourceLineNo">5400</span>    region.put(put);<a name="line.5400"></a>
-<span class="sourceLineNo">5401</span>    region.flush(true);<a name="line.5401"></a>
-<span class="sourceLineNo">5402</span>    // storefile3<a name="line.5402"></a>
-<span class="sourceLineNo">5403</span>    put = new Put(row3);<a name="line.5403"></a>
-<span class="sourceLineNo">5404</span>    put.add(kv3);<a name="line.5404"></a>
+<span class="sourceLineNo">5277</span>    put = new Put(row4);<a name="line.5277"></a>
+<span class="sourceLineNo">5278</span>    put.add(kv4_5_4);<a name="line.5278"></a>
+<span class="sourceLineNo">5279</span>    put.add(kv4_5_5);<a name="line.5279"></a>
+<span class="sourceLineNo">5280</span>    region.put(put);<a name="line.5280"></a>
+<span class="sourceLineNo">5281</span>    region.flush(true);<a name="line.5281"></a>
+<span class="sourceLineNo">5282</span>    // hfiles(cf1/cf3) : "row1" (1 kvs) / "row2" (1 kv) / "row4" (2 kv)<a name="line.5282"></a>
+<span class="sourceLineNo">5283</span>    put = new Put(row4);<a name="line.5283"></a>
+<span class="sourceLineNo">5284</span>    put.add(kv4_5_1);<a name="line.5284"></a>
+<span class="sourceLineNo">5285</span>    put.add(kv4_5_3);<a name="line.5285"></a>
+<span class="sourceLineNo">5286</span>    region.put(put);<a name="line.5286"></a>
+<span class="sourceLineNo">5287</span>    put = new Put(row1);<a name="line.5287"></a>
+<span class="sourceLineNo">5288</span>    put.add(kv1_2_2);<a name="line.5288"></a>
+<span class="sourceLineNo">5289</span>    region.put(put);<a name="line.5289"></a>
+<span class="sourceLineNo">5290</span>    put = new Put(row2);<a name="line.5290"></a>
+<span class="sourceLineNo">5291</span>    put.add(kv2_4_4);<a name="line.5291"></a>
+<span class="sourceLineNo">5292</span>    region.put(put);<a name="line.5292"></a>
+<span class="sourceLineNo">5293</span>    region.flush(true);<a name="line.5293"></a>
+<span class="sourceLineNo">5294</span>    // hfiles(cf1/cf3) : "row2"(2 kv) / "row3"(1 kvs) / "row4" (1 kv)<a name="line.5294"></a>
+<span class="sourceLineNo">5295</span>    put = new Put(row4);<a name="line.5295"></a>
+<span class="sourceLineNo">5296</span>    put.add(kv4_5_2);<a name="line.5296"></a>
+<span class="sourceLineNo">5297</span>    region.put(put);<a name="line.5297"></a>
+<span class="sourceLineNo">5298</span>    put = new Put(row2);<a name="line.5298"></a>
+<span class="sourceLineNo">5299</span>    put.add(kv2_4_2);<a name="line.5299"></a>
+<span class="sourceLineNo">5300</span>    put.add(kv2_4_3);<a name="line.5300"></a>
+<span class="sourceLineNo">5301</span>    region.put(put);<a name="line.5301"></a>
+<span class="sourceLineNo">5302</span>    put = new Put(row3);<a name="line.5302"></a>
+<span class="sourceLineNo">5303</span>    put.add(kv3_2_2);<a name="line.5303"></a>
+<span class="sourceLineNo">5304</span>    region.put(put);<a name="line.5304"></a>
+<span class="sourceLineNo">5305</span>    region.flush(true);<a name="line.5305"></a>
+<span class="sourceLineNo">5306</span>    // memstore(cf1/cf2/cf3) : "row0" (1 kvs) / "row3" ( 1 kv) / "row5" (max)<a name="line.5306"></a>
+<span class="sourceLineNo">5307</span>    // ( 2 kv)<a name="line.5307"></a>
+<span class="sourceLineNo">5308</span>    put = new Put(row0);<a name="line.5308"></a>
+<span class="sourceLineNo">5309</span>    put.add(kv0_1_1);<a name="line.5309"></a>
+<span class="sourceLineNo">5310</span>    region.put(put);<a name="line.5310"></a>
+<span class="sourceLineNo">5311</span>    put = new Put(row3);<a name="line.5311"></a>
+<span class="sourceLineNo">5312</span>    put.add(kv3_2_1);<a name="line.5312"></a>
+<span class="sourceLineNo">5313</span>    region.put(put);<a name="line.5313"></a>
+<span class="sourceLineNo">5314</span>    put = new Put(row5);<a name="line.5314"></a>
+<span class="sourceLineNo">5315</span>    put.add(kv5_2_1);<a name="line.5315"></a>
+<span class="sourceLineNo">5316</span>    put.add(kv5_2_2);<a name="line.5316"></a>
+<span class="sourceLineNo">5317</span>    region.put(put);<a name="line.5317"></a>
+<span class="sourceLineNo">5318</span>    // scan range = ["row4", min), skip the max "row5"<a name="line.5318"></a>
+<span class="sourceLineNo">5319</span>    Scan scan = new Scan(row4);<a name="line.5319"></a>
+<span class="sourceLineNo">5320</span>    scan.setMaxVersions(5);<a name="line.5320"></a>
+<span class="sourceLineNo">5321</span>    scan.setBatch(3);<a name="line.5321"></a>
+<span class="sourceLineNo">5322</span>    scan.setReversed(true);<a name="line.5322"></a>
+<span class="sourceLineNo">5323</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5323"></a>
+<span class="sourceLineNo">5324</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5324"></a>
+<span class="sourceLineNo">5325</span>    boolean hasNext = false;<a name="line.5325"></a>
+<span class="sourceLineNo">5326</span>    // 1. scan out "row4" (5 kvs), "row5" can't be scanned out since not<a name="line.5326"></a>
+<span class="sourceLineNo">5327</span>    // included in scan range<a name="line.5327"></a>
+<span class="sourceLineNo">5328</span>    // "row4" takes 2 next() calls since batch=3<a name="line.5328"></a>
+<span class="sourceLineNo">5329</span>    hasNext = scanner.next(currRow);<a name="line.5329"></a>
+<span class="sourceLineNo">5330</span>    assertEquals(3, currRow.size());<a name="line.5330"></a>
+<span class="sourceLineNo">5331</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5331"></a>
+<span class="sourceLineNo">5332</span>        .get(0).getRowLength(), row4, 0, row4.length));<a name="line.5332"></a>
+<span class="sourceLineNo">5333</span>    assertTrue(hasNext);<a name="line.5333"></a>
+<span class="sourceLineNo">5334</span>    currRow.clear();<a name="line.5334"></a>
+<span class="sourceLineNo">5335</span>    hasNext = scanner.next(currRow);<a name="line.5335"></a>
+<span class="sourceLineNo">5336</span>    assertEquals(2, currRow.size());<a name="line.5336"></a>
+<span class="sourceLineNo">5337</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(),<a name="line.5337"></a>
+<span class="sourceLineNo">5338</span>        currRow.get(0).getRowLength(), row4, 0,<a name="line.5338"></a>
+<span class="sourceLineNo">5339</span>      row4.length));<a name="line.5339"></a>
+<span class="sourceLineNo">5340</span>    assertTrue(hasNext);<a name="line.5340"></a>
+<span class="sourceLineNo">5341</span>    // 2. scan out "row3" (2 kv)<a name="line.5341"></a>
+<span class="sourceLineNo">5342</span>    currRow.clear();<a name="line.5342"></a>
+<span class="sourceLineNo">5343</span>    hasNext = scanner.next(currRow);<a name="line.5343"></a>
+<span class="sourceLineNo">5344</span>    assertEquals(2, currRow.size());<a name="line.5344"></a>
+<span class="sourceLineNo">5345</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5345"></a>
+<span class="sourceLineNo">5346</span>        .get(0).getRowLength(), row3, 0, row3.length));<a name="line.5346"></a>
+<span class="sourceLineNo">5347</span>    assertTrue(hasNext);<a name="line.5347"></a>
+<span class="sourceLineNo">5348</span>    // 3. scan out "row2" (4 kvs)<a name="line.5348"></a>
+<span class="sourceLineNo">5349</span>    // "row2" takes 2 next() calls since batch=3<a name="line.5349"></a>
+<span class="sourceLineNo">5350</span>    currRow.clear();<a name="line.5350"></a>
+<span class="sourceLineNo">5351</span>    hasNext = scanner.next(currRow);<a name="line.5351"></a>
+<span class="sourceLineNo">5352</span>    assertEquals(3, currRow.size());<a name="line.5352"></a>
+<span class="sourceLineNo">5353</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5353"></a>
+<span class="sourceLineNo">5354</span>        .get(0).getRowLength(), row2, 0, row2.length));<a name="line.5354"></a>
+<span class="sourceLineNo">5355</span>    assertTrue(hasNext);<a name="line.5355"></a>
+<span class="sourceLineNo">5356</span>    currRow.clear();<a name="line.5356"></a>
+<span class="sourceLineNo">5357</span>    hasNext = scanner.next(currRow);<a name="line.5357"></a>
+<span class="sourceLineNo">5358</span>    assertEquals(1, currRow.size());<a name="line.5358"></a>
+<span class="sourceLineNo">5359</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5359"></a>
+<span class="sourceLineNo">5360</span>        .get(0).getRowLength(), row2, 0, row2.length));<a name="line.5360"></a>
+<span class="sourceLineNo">5361</span>    assertTrue(hasNext);<a name="line.5361"></a>
+<span class="sourceLineNo">5362</span>    // 4. scan out "row1" (2 kv)<a name="line.5362"></a>
+<span class="sourceLineNo">5363</span>    currRow.clear();<a name="line.5363"></a>
+<span class="sourceLineNo">5364</span>    hasNext = scanner.next(currRow);<a name="line.5364"></a>
+<span class="sourceLineNo">5365</span>    assertEquals(2, currRow.size());<a name="line.5365"></a>
+<span class="sourceLineNo">5366</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5366"></a>
+<span class="sourceLineNo">5367</span>        .get(0).getRowLength(), row1, 0, row1.length));<a name="line.5367"></a>
+<span class="sourceLineNo">5368</span>    assertTrue(hasNext);<a name="line.5368"></a>
+<span class="sourceLineNo">5369</span>    // 5. scan out "row0" (1 kv)<a name="line.5369"></a>
+<span class="sourceLineNo">5370</span>    currRow.clear();<a name="line.5370"></a>
+<span class="sourceLineNo">5371</span>    hasNext = scanner.next(currRow);<a name="line.5371"></a>
+<span class="sourceLineNo">5372</span>    assertEquals(1, currRow.size());<a name="line.5372"></a>
+<span class="sourceLineNo">5373</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5373"></a>
+<span class="sourceLineNo">5374</span>        .get(0).getRowLength(), row0, 0, row0.length));<a name="line.5374"></a>
+<span class="sourceLineNo">5375</span>    assertFalse(hasNext);<a name="line.5375"></a>
+<span class="sourceLineNo">5376</span><a name="line.5376"></a>
+<span class="sourceLineNo">5377</span>    scanner.close();<a name="line.5377"></a>
+<span class="sourceLineNo">5378</span>  }<a name="line.5378"></a>
+<span class="sourceLineNo">5379</span><a name="line.5379"></a>
+<span class="sourceLineNo">5380</span>  @Test<a name="line.5380"></a>
+<span class="sourceLineNo">5381</span>  public void testReverseScanner_FromMemStoreAndHFiles_MultiCFs2()<a name="line.5381"></a>
+<span class="sourceLineNo">5382</span>      throws IOException {<a name="line.5382"></a>
+<span class="sourceLineNo">5383</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.5383"></a>
+<span class="sourceLineNo">5384</span>    byte[] row2 = Bytes.toBytes("row2");<a name="line.5384"></a>
+<span class="sourceLineNo">5385</span>    byte[] row3 = Bytes.toBytes("row3");<a name="line.5385"></a>
+<span class="sourceLineNo">5386</span>    byte[] row4 = Bytes.toBytes("row4");<a name="line.5386"></a>
+<span class="sourceLineNo">5387</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5387"></a>
+<span class="sourceLineNo">5388</span>    byte[] cf2 = Bytes.toBytes("CF2");<a name="line.5388"></a>
+<span class="sourceLineNo">5389</span>    byte[] cf3 = Bytes.toBytes("CF3");<a name="line.5389"></a>
+<span class="sourceLineNo">5390</span>    byte[] cf4 = Bytes.toBytes("CF4");<a name="line.5390"></a>
+<span class="sourceLineNo">5391</span>    byte[][] families = { cf1, cf2, cf3, cf4 };<a name="line.5391"></a>
+<span class="sourceLineNo">5392</span>    byte[] col = Bytes.toBytes("C");<a name="line.5392"></a>
+<span class="sourceLineNo">5393</span>    long ts = 1;<a name="line.5393"></a>
+<span class="sourceLineNo">5394</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5394"></a>
+<span class="sourceLineNo">5395</span>    // disable compactions in this test.<a name="line.5395"></a>
+<span class="sourceLineNo">5396</span>    conf.setInt("hbase.hstore.compactionThreshold", 10000);<a name="line.5396"></a>
+<span class="sourceLineNo">5397</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5397"></a>
+<span class="sourceLineNo">5398</span>    KeyValue kv1 = new KeyValue(row1, cf1, col, ts, KeyValue.Type.Put, null);<a name="line.5398"></a>
+<span class="sourceLineNo">5399</span>    KeyValue kv2 = new KeyValue(row2, cf2, col, ts, KeyValue.Type.Put, null);<a name="line.5399"></a>
+<span class="sourceLineNo">5400</span>    KeyValue kv3 = new KeyValue(row3, cf3, col, ts, KeyValue.Type.Put, null);<a name="line.5400"></a>
+<span class="sourceLineNo">5401</span>    KeyValue kv4 = new KeyValue(row4, cf4, col, ts, KeyValue.Type.Put, null);<a name="line.5401"></a>
+<span class="sourceLineNo">5402</span>    // storefile1<a name="line.5402"></a>
+<span class="sourceLineNo">5403</span>    Put put = new Put(row1);<a name="line.5403"></a>
+<span class="sourceLineNo">5404</span>    put.add(kv1);<a name="line.5404"></a>
 <span class="sourceLineNo">5405</span>    region.put(put);<a name="line.5405"></a>
 <span class="sourceLineNo">5406</span>    region.flush(true);<a name="line.5406"></a>
-<span class="sourceLineNo">5407</span>    // memstore<a name="line.5407"></a>
-<span class="sourceLineNo">5408</span>    put = new Put(row4);<a name="line.5408"></a>
-<span class="sourceLineNo">5409</span>    put.add(kv4);<a name="line.5409"></a>
+<span class="sourceLineNo">5407</span>    // storefile2<a name="line.5407"></a>
+<span class="sourceLineNo">5408</span>    put = new Put(row2);<a name="line.5408"></a>
+<span class="sourceLineNo">5409</span>    put.add(kv2);<a name="line.5409"></a>
 <span class="sourceLineNo">5410</span>    region.put(put);<a name="line.5410"></a>
-<span class="sourceLineNo">5411</span>    // scan range = ["row4", min)<a name="line.5411"></a>
-<span class="sourceLineNo">5412</span>    Scan scan = new Scan(row4);<a name="line.5412"></a>
-<span class="sourceLineNo">5413</span>    scan.setReversed(true);<a name="line.5413"></a>
-<span class="sourceLineNo">5414</span>    scan.setBatch(10);<a name="line.5414"></a>
-<span class="sourceLineNo">5415</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5415"></a>
-<span class="sourceLineNo">5416</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5416"></a>
-<span class="sourceLineNo">5417</span>    boolean hasNext = scanner.next(currRow);<a name="line.5417"></a>
-<span class="sourceLineNo">5418</span>    assertEquals(1, currRow.size());<a name="line.5418"></a>
-<span class="sourceLineNo">5419</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5419"></a>
-<span class="sourceLineNo">5420</span>        .get(0).getRowLength(), row4, 0, row4.length));<a name="line.5420"></a>
-<span class="sourceLineNo">5421</span>    assertTrue(hasNext);<a name="line.5421"></a>
-<span class="sourceLineNo">5422</span>    currRow.clear();<a name="line.5422"></a>
-<span class="sourceLineNo">5423</span>    hasNext = scanner.next(currRow);<a name="line.5423"></a>
-<span class="sourceLineNo">5424</span>    assertEquals(1, currRow.size());<a name="line.5424"></a>
-<span class="sourceLineNo">5425</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5425"></a>
-<span class="sourceLineNo">5426</span>        .get(0).getRowLength(), row3, 0, row3.length));<a name="line.5426"></a>
-<span class="sourceLineNo">5427</span>    assertTrue(hasNext);<a name="line.5427"></a>
-<span class="sourceLineNo">5428</span>    currRow.clear();<a name="line.5428"></a>
-<span class="sourceLineNo">5429</span>    hasNext = scanner.next(currRow);<a name="line.5429"></a>
-<span class="sourceLineNo">5430</span>    assertEquals(1, currRow.size());<a name="line.5430"></a>
-<span class="sourceLineNo">5431</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5431"></a>
-<span class="sourceLineNo">5432</span>        .get(0).getRowLength(), row2, 0, row2.length));<a name="line.5432"></a>
-<span class="sourceLineNo">5433</span>    assertTrue(hasNext);<a name="line.5433"></a>
-<span class="sourceLineNo">5434</span>    currRow.clear();<a name="line.5434"></a>
-<span class="sourceLineNo">5435</span>    hasNext = scanner.next(currRow);<a name="line.5435"></a>
-<span class="sourceLineNo">5436</span>    assertEquals(1, currRow.size());<a name="line.5436"></a>
-<span class="sourceLineNo">5437</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5437"></a>
-<span class="sourceLineNo">5438</span>        .get(0).getRowLength(), row1, 0, row1.length));<a name="line.5438"></a>
-<span class="sourceLineNo">5439</span>    assertFalse(hasNext);<a name="line.5439"></a>
-<span class="sourceLineNo">5440</span>  }<a name="line.5440"></a>
-<span class="sourceLineNo">5441</span><a name="line.5441"></a>
-<span class="sourceLineNo">5442</span>  /**<a name="line.5442"></a>
-<span class="sourceLineNo">5443</span>   * Test for HBASE-14497: Reverse Scan threw StackOverflow caused by readPt checking<a name="line.5443"></a>
-<span class="sourceLineNo">5444</span>   */<a name="line.5444"></a>
-<span class="sourceLineNo">5445</span>  @Test<a name="line.5445"></a>
-<span class="sourceLineNo">5446</span>  public void testReverseScanner_StackOverflow() throws IOException {<a name="line.5446"></a>
-<span class="sourceLineNo">5447</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5447"></a>
-<span class="sourceLineNo">5448</span>    byte[][] families = {cf1};<a name="line.5448"></a>
-<span class="sourceLineNo">5449</span>    byte[] col = Bytes.toBytes("C");<a name="line.5449"></a>
-<span class="sourceLineNo">5450</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5450"></a>
-<span class="sourceLineNo">5451</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5451"></a>
-<span class="sourceLineNo">5452</span>    // setup with one storefile and one memstore, to create scanner and get an earlier readPt<a name="line.5452"></a>
-<span class="sourceLineNo">5453</span>    Put put = new Put(Bytes.toBytes("19998"));<a name="line.5453"></a>
-<span class="sourceLineNo">5454</span>    put.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5454"></a>
-<span class="sourceLineNo">5455</span>    region.put(put);<a name="line.5455"></a>
-<span class="sourceLineNo">5456</span>    region.flushcache(true, true, FlushLifeCycleTracker.DUMMY);<a name="line.5456"></a>
-<span class="sourceLineNo">5457</span>    Put put2 = new Put(Bytes.toBytes("19997"));<a name="line.5457"></a>
-<span class="sourceLineNo">5458</span>    put2.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5458"></a>
-<span class="sourceLineNo">5459</span>    region.put(put2);<a name="line.5459"></a>
-<span class="sourceLineNo">5460</span><a name="line.5460"></a>
-<span class="sourceLineNo">5461</span>    Scan scan = new Scan(Bytes.toBytes("19998"));<a name="line.5461"></a>
-<span class="sourceLineNo">5462</span>    scan.setReversed(true);<a name="line.5462"></a>
-<span class="sourceLineNo">5463</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5463"></a>
-<span class="sourceLineNo">5464</span><a name="line.5464"></a>
-<span class="sourceLineNo">5465</span>    // create one storefile contains many rows will be skipped<a name="line.5465"></a>
-<span class="sourceLineNo">5466</span>    // to check StoreFileScanner.seekToPreviousRow<a name="line.5466"></a>
-<span class="sourceLineNo">5467</span>    for (int i = 10000; i &lt; 20000; i++) {<a name="line.5467"></a>
-<span class="sourceLineNo">5468</span>      Put p = new Put(Bytes.toBytes(""+i));<a name="line.5468"></a>
-<span class="sourceLineNo">5469</span>      p.addColumn(cf1, col, Bytes.toBytes("" + i));<a name="line.5469"></a>
-<span class="sourceLineNo">5470</span>      region.put(p);<a name="line.5470"></a>
-<span class="sourceLineNo">5471</span>    }<a name="line.5471"></a>
-<span class="sourceLineNo">5472</span>    region.flushcache(true, true, FlushLifeCycleTracker.DUMMY);<a name="line.5472"></a>
-<span class="sourceLineNo">5473</span><a name="line.5473"></a>
-<span class="sourceLineNo">5474</span>    // create one memstore contains many rows will be skipped<a name="line.5474"></a>
-<span class="sourceLineNo">5475</span>    // to check MemStoreScanner.seekToPreviousRow<a name="line.5475"></a>
-<span class="sourceLineNo">5476</span>    for (int i = 10000; i &lt; 20000; i++) {<a name="line.5476"></a>
-<span class="sourceLineNo">5477</span>      Put p = new Put(Bytes.toBytes(""+i));<a name="line.5477"></a>
-<span class="sourceLineNo">5478</span>      p.addColumn(cf1, col, Bytes.toBytes("" + i));<a name="line.5478"></a>
-<span class="sourceLineNo">5479</span>      region.put(p);<a name="line.5479"></a>
-<span class="sourceLineNo">5480</span>    }<a name="line.5480"></a>
-<span class="sourceLineNo">5481</span><a name="line.5481"></a>
-<span class="sourceLineNo">5482</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5482"></a>
-<span class="sourceLineNo">5483</span>    boolean hasNext;<a name="line.5483"></a>
-<span class="sourceLineNo">5484</span>    do {<a name="line.5484"></a>
-<span class="sourceLineNo">5485</span>      hasNext = scanner.next(currRow);<a name="line.5485"></a>
-<span class="sourceLineNo">5486</span>    } while (hasNext);<a name="line.5486"></a>
-<span class="sourceLineNo">5487</span>    assertEquals(2, currRow.size());<a name="line.5487"></a>
-<span class="sourceLineNo">5488</span>    assertEquals("19998", Bytes.toString(currRow.get(0).getRowArray(),<a name="line.5488"></a>
-<span class="sourceLineNo">5489</span>      currRow.get(0).getRowOffset(), currRow.get(0).getRowLength()));<a name="line.5489"></a>
-<span class="sourceLineNo">5490</span>    assertEquals("19997", Bytes.toString(currRow.get(1).getRowArray(),<a name="line.5490"></a>
-<span class="sourceLineNo">5491</span>      currRow.get(1).getRowOffset(), currRow.get(1).getRowLength()));<a name="line.5491"></a>
-<span class="sourceLineNo">5492</span>  }<a name="line.5492"></a>
-<span class="sourceLineNo">5493</span><a name="line.5493"></a>
-<span class="sourceLineNo">5494</span>  @Test<a name="line.5494"></a>
-<span class="sourceLineNo">5495</span>  public void testReverseScanShouldNotScanMemstoreIfReadPtLesser() throws Exception {<a name="line.5495"></a>
-<span class="sourceLineNo">5496</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5496"></a>
-<span class="sourceLineNo">5497</span>    byte[][] families = { cf1 };<a name="line.5497"></a>
-<span class="sourceLineNo">5498</span>    byte[] col = Bytes.toBytes("C");<a name="line.5498"></a>
-<span class="sourceLineNo">5499</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5499"></a>
-<span class="sourceLineNo">5500</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5500"></a>
-<span class="sourceLineNo">5501</span>    // setup with one storefile and one memstore, to create scanner and get an earlier readPt<a name="line.5501"></a>
-<span class="sourceLineNo">5502</span>    Put put = new Put(Bytes.toBytes("19996"));<a name="line.5502"></a>
-<span class="sourceLineNo">5503</span>    put.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5503"></a>
-<span class="sourceLineNo">5504</span>    region.put(put);<a name="line.5504"></a>
-<span class="sourceLineNo">5505</span>    Put put2 = new Put(Bytes.toBytes("19995"));<a name="line.5505"></a>
-<span class="sourceLineNo">5506</span>    put2.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5506"></a>
-<span class="sourceLineNo">5507</span>    region.put(put2);<a name="line.5507"></a>
-<span class="sourceLineNo">5508</span>    // create a reverse scan<a name="line.5508"></a>
-<span class="sourceLineNo">5509</span>    Scan scan = new Scan(Bytes.toBytes("19996"));<a name="line.5509"></a>
-<span class="sourceLineNo">5510</span>    scan.setReversed(true);<a name="line.5510"></a>
-<span class="sourceLineNo">5511</span>    RegionScannerImpl scanner = region.getScanner(scan);<a name="line.5511"></a>
-<span class="sourceLineNo">5512</span><a name="line.5512"></a>
-<span class="sourceLineNo">5513</span>    // flush the cache. This will reset the store scanner<a name="line.5513"></a>
-<span class="sourceLineNo">5514</span>    region.flushcache(true, true, FlushLifeCycleTracker.DUMMY);<a name="line.5514"></a>
-<span class="sourceLineNo">5515</span><a name="line.5515"></a>
-<span class="sourceLineNo">5516</span>    // create one memstore contains many rows will be skipped<a name="line.5516"></a>
-<span class="sourceLineNo">5517</span>    // to check MemStoreScanner.seekToPreviousRow<a name="line.5517"></a>
-<span class="sourceLineNo">5518</span>    for (int i = 10000; i &lt; 20000; i++) {<a name="line.5518"></a>
-<span class="sourceLineNo">5519</span>      Put p = new Put(Bytes.toBytes("" + i));<a name="line.5519"></a>
-<span class="sourceLineNo">5520</span>      p.addColumn(cf1, col, Bytes.toBytes("" + i));<a name="line.5520"></a>
-<span class="sourceLineNo">5521</span>      region.put(p);<a name="line.5521"></a>
-<span class="sourceLineNo">5522</span>    }<a name="line.5522"></a>
-<span class="sourceLineNo">5523</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5523"></a>
-<span class="sourceLineNo">5524</span>    boolean hasNext;<a name="line.5524"></a>
-<span class="sourceLineNo">5525</span>    boolean assertDone = false;<a name="line.5525"></a>
-<span class="sourceLineNo">5526</span>    do {<a name="line.5526"></a>
-<span class="sourceLineNo">5527</span>      hasNext = scanner.next(currRow);<a name="line.5527"></a>
-<span class="sourceLineNo">5528</span>      // With HBASE-15871, after the scanner is reset the memstore scanner should not be<a name="line.5528"></a>
-<span class="sourceLineNo">5529</span>      // added here<a name="line.5529"></a>
-<span class="sourceLineNo">5530</span>      if (!assertDone) {<a name="line.5530"></a>
-<span class="sourceLineNo">5531</span>        StoreScanner current =<a name="line.5531"></a>
-<span class="sourceLineNo">5532</span>            (StoreScanner) (scanner.storeHeap).getCurrentForTesting();<a name="line.5532"></a>
-<span class="sourceLineNo">5533</span>        List&lt;KeyValueScanner&gt; scanners = current.getAllScannersForTesting();<a name="line.5533"></a>
-<span class="sourceLineNo">5534</span>        assertEquals("There should be only one scanner the store file scanner", 1,<a name="line.5534"></a>
-<span class="sourceLineNo">5535</span>          scanners.size());<a name="line.5535"></a>
-<span class="sourceLineNo">5536</span>        assertDone = true;<a name="line.5536"></a>
-<span class="sourceLineNo">5537</span>      }<a name="line.5537"></a>
-<span class="sourceLineNo">5538</span>    } while (hasNext);<a name="line.5538"></a>
-<span class="sourceLineNo">5539</span>    assertEquals(2, currRow.size());<a name="line.5539"></a>
-<span class="sourceLineNo">5540</span>    assertEquals("19996", Bytes.toString(currRow.get(0).getRowArray(),<a name="line.5540"></a>
-<span class="sourceLineNo">5541</span>      currRow.get(0).getRowOffset(), currRow.get(0).getRowLength()));<a name="line.5541"></a>
-<span class="sourceLineNo">5542</span>    assertEquals("19995", Bytes.toString(currRow.get(1).getRowArray(),<a name="line.5542"></a>
-<span class="sourceLineNo">5543</span>      currRow.get(1).getRowOffset(), currRow.get(1).getRowLength()));<a name="line.5543"></a>
-<span class="sourceLineNo">5544</span>  }<a name="line.5544"></a>
-<span class="sourceLineNo">5545</span><a name="line.5545"></a>
-<span class="sourceLineNo">5546</span>  @Test<a name="line.5546"></a>
-<span class="sourceLineNo">5547</span>  public void testReverseScanWhenPutCellsAfterOpenReverseScan() throws Exception {<a name="line.5547"></a>
-<span class="sourceLineNo">5548</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5548"></a>
-<span class="sourceLineNo">5549</span>    byte[][] families = { cf1 };<a name="line.5549"></a>
-<span class="sourceLineNo">5550</span>    byte[] col = Bytes.toBytes("C");<a name="line.5550"></a>
-<span class="sourceLineNo">5551</span><a name="line.5551"></a>
-<span class="sourceLineNo">5552</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5552"></a>
-<span class="sourceLineNo">5553</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5553"></a>
-<span class="sourceLineNo">5554</span><a name="line.5554"></a>
-<span class="sourceLineNo">5555</span>    Put put = new Put(Bytes.toBytes("199996"));<a name="line.5555"></a>
-<span class="sourceLineNo">5556</span>    put.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5556"></a>
-<span class="sourceLineNo">5557</span>    region.put(put);<a name="line.5557"></a>
-<span class="sourceLineNo">5558</span>    Put put2 = new Put(Bytes.toBytes("199995"));<a name="line.5558"></a>
-<span class="sourceLineNo">5559</span>    put2.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5559"></a>
-<span class="sourceLineNo">5560</span>    region.put(put2);<a name="line.5560"></a>
+<span class="sourceLineNo">5411</span>    region.flush(true);<a name="line.5411"></a>
+<span class="sourceLineNo">5412</span>    // storefile3<a name="line.5412"></a>
+<span class="sourceLineNo">5413</span>    put = new Put(row3);<a name="line.5413"></a>
+<span class="sourceLineNo">5414</span>    put.add(kv3);<a name="line.5414"></a>
+<span class="sourceLineNo">5415</span>    region.put(put);<a name="line.5415"></a>
+<span class="sourceLineNo">5416</span>    region.flush(true);<a name="line.5416"></a>
+<span class="sourceLineNo">5417</span>    // memstore<a name="line.5417"></a>
+<span class="sourceLineNo">5418</span>    put = new Put(row4);<a name="line.5418"></a>
+<span class="sourceLineNo">5419</span>    put.add(kv4);<a name="line.5419"></a>
+<span class="sourceLineNo">5420</span>    region.put(put);<a name="line.5420"></a>
+<span class="sourceLineNo">5421</span>    // scan range = ["row4", min)<a name="line.5421"></a>
+<span class="sourceLineNo">5422</span>    Scan scan = new Scan(row4);<a name="line.5422"></a>
+<span class="sourceLineNo">5423</span>    scan.setReversed(true);<a name="line.5423"></a>
+<span class="sourceLineNo">5424</span>    scan.setBatch(10);<a name="line.5424"></a>
+<span class="sourceLineNo">5425</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5425"></a>
+<span class="sourceLineNo">5426</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5426"></a>
+<span class="sourceLineNo">5427</span>    boolean hasNext = scanner.next(currRow);<a name="line.5427"></a>
+<span class="sourceLineNo">5428</span>    assertEquals(1, currRow.size());<a name="line.5428"></a>
+<span class="sourceLineNo">5429</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5429"></a>
+<span class="sourceLineNo">5430</span>        .get(0).getRowLength(), row4, 0, row4.length));<a name="line.5430"></a>
+<span class="sourceLineNo">5431</span>    assertTrue(hasNext);<a name="line.5431"></a>
+<span class="sourceLineNo">5432</span>    currRow.clear();<a name="line.5432"></a>
+<span class="sourceLineNo">5433</span>    hasNext = scanner.next(currRow);<a name="line.5433"></a>
+<span class="sourceLineNo">5434</span>    assertEquals(1, currRow.size());<a name="line.5434"></a>
+<span class="sourceLineNo">5435</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5435"></a>
+<span class="sourceLineNo">5436</span>        .get(0).getRowLength(), row3, 0, row3.length));<a name="line.5436"></a>
+<span class="sourceLineNo">5437</span>    assertTrue(hasNext);<a name="line.5437"></a>
+<span class="sourceLineNo">5438</span>    currRow.clear();<a name="line.5438"></a>
+<span class="sourceLineNo">5439</span>    hasNext = scanner.next(currRow);<a name="line.5439"></a>
+<span class="sourceLineNo">5440</span>    assertEquals(1, currRow.size());<a name="line.5440"></a>
+<span class="sourceLineNo">5441</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5441"></a>
+<span class="sourceLineNo">5442</span>        .get(0).getRowLength(), row2, 0, row2.length));<a name="line.5442"></a>
+<span class="sourceLineNo">5443</span>    assertTrue(hasNext);<a name="line.5443"></a>
+<span class="sourceLineNo">5444</span>    currRow.clear();<a name="line.5444"></a>
+<span class="sourceLineNo">5445</span>    hasNext = scanner.next(currRow);<a name="line.5445"></a>
+<span class="sourceLineNo">5446</span>    assertEquals(1, currRow.size());<a name="line.5446"></a>
+<span class="sourceLineNo">5447</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5447"></a>
+<span class="sourceLineNo">5448</span>        .get(0).getRowLength(), row1, 0, row1.length));<a name="line.5448"></a>
+<span class="sourceLineNo">5449</span>    assertFalse(hasNext);<a name="line.5449"></a>
+<span class="sourceLineNo">5450</span>  }<a name="line.5450"></a>
+<span class="sourceLineNo">5451</span><a name="line.5451"></a>
+<span class="sourceLineNo">5452</span>  /**<a name="line.5452"></a>
+<span class="sourceLineNo">5453</span>   * Test for HBASE-14497: Reverse Scan threw StackOverflow caused by readPt checking<a name="line.5453"></a>
+<span class="sourceLineNo">5454</span>   */<a name="line.5454"></a>
+<span class="sourceLineNo">5455</span>  @Test<a name="line.5455"></a>
+<span class="sourceLineNo">5456</span>  public void testReverseScanner_StackOverflow() throws IOException {<a name="line.5456"></a>
+<span class="sourceLineNo">5457</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5457"></a>
+<span class="sourceLineNo">5458</span>    byte[][] families = {cf1};<a name="line.5458"></a>
+<span class="sourceLineNo">5459</span>    byte[] col = Bytes.toBytes("C");<a name="line.5459"></a>
+<span class="sourceLineNo">5460</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5460"></a>
+<span class="sourceLineNo">5461</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5461"></a>
+<span class="sourceLineNo">5462</span>    // setup with one storefile and one memstore, to create scanner and get an earlier readPt<a name="line.5462"></a>
+<span class="sourceLineNo">5463</span>    Put put = new Put(Bytes.toBytes("19998"));<a name="line.5463"></a>
+<span class="sourceLineNo">5464</span>    put.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5464"></a>
+<span class="sourceLineNo">5465</span>    region.put(put);<a name="line.5465"></a>
+<span class="sourceLineNo">5466</span>    region.flushcache(true, true, FlushLifeCycleTracker.DUMMY);<a name="line.5466"></a>
+<span class="sourceLineNo">5467</span>    Put put2 = new Put(Bytes.toBytes("19997"));<a name="line.5467"></a>
+<span class="sourceLineNo">5468</span>    put2.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5468"></a>
+<span class="sourceLineNo">5469</span>    region.put(put2);<a name="line.5469"></a>
+<span class="sourceLineNo">5470</span><a name="line.5470"></a>
+<span class="sourceLineNo">5471</span>    Scan scan = new Scan(Bytes.toBytes("19998"));<a name="line.5471"></a>
+<span class="sourceLineNo">5472</span>    scan.setReversed(true);<a name="line.5472"></a>
+<span class="sourceLineNo">5473</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5473"></a>
+<span class="sourceLineNo">5474</span><a name="line.5474"></a>
+<span class="sourceLineNo">5475</span>    // create one storefile contains many rows will be skipped<a name="line.5475"></a>
+<span class="sourceLineNo">5476</span>    // to check StoreFileScanner.seekToPreviousRow<a name="line.5476"></a>
+<span class="sourceLineNo">5477</span>    for (int i = 10000; i &lt; 20000; i++) {<a name="line.5477"></a>
+<span class="sourceLineNo">5478</span>      Put p = new Put(Bytes.toBytes(""+i));<a name="line.5478"></a>
+<span class="sourceLineNo">5479</span>      p.addColumn(cf1, col, Bytes.toBytes("" + i));<a name="line.5479"></a>
+<span class="sourceLineNo">5480</span>      region.put(p);<a name="line.5480"></a>
+<span class="sourceLineNo">5481</span>    }<a name="line.5481"></a>
+<span class="sourceLineNo">5482</span>    region.flushcache(true, true, FlushLifeCycleTracker.DUMMY);<a name="line.5482"></a>
+<span class="sourceLineNo">5483</span><a name="line.5483"></a>
+<span class="sourceLineNo">5484</span>    // create one memstore contains many rows will be skipped<a name="line.5484"></a>
+<span class="sourceLineNo">5485</span>    // to check MemStoreScanner.seekToPreviousRow<a name="line.5485"></a>
+<span class="sourceLineNo">5486</span>    for (int i = 10000; i &lt; 20000; i++) {<a name="line.5486"></a>
+<span class="sourceLineNo">5487</span>      Put p = new Put(Bytes.toBytes(""+i));<a name="line.5487"></a>
+<span class="sourceLineNo">5488</span>      p.addColumn(cf1, col, Bytes.toBytes("" + i));<a name="line.5488"></a>
+<span class="sourceLineNo">5489</span>      region.put(p);<a name="line.5489"></a>
+<span class="sourceLineNo">5490</span>    }<a name="line.5490"></a>
+<span class="sourceLineNo">5491</span><a name="line.5491"></a>
+<span class="sourceLineNo">5492</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5492"></a>
+<span class="sourceLineNo">5493</span>    boolean hasNext;<a name="line.5493"></a>
+<span class="sourceLineNo">5494</span>    do {<a name="line.5494"></a>
+<span class="sourceLineNo">5495</span>      hasNext = scanner.next(currRow);<a name="line.5495"></a>
+<span class="sourceLineNo">5496</span>    } while (hasNext);<a name="line.5496"></a>
+<span class="sourceLineNo">5497</span>    assertEquals(2, currRow.size());<a name="line.5497"></a>
+<span class="sourceLineNo">5498</span>    assertEquals("19998", Bytes.toString(currRow.get(0).getRowArray(),<a name="line.5498"></a>
+<span class="sourceLineNo">5499</span>      currRow.get(0).getRowOffset(), currRow.get(0).getRowLength()));<a name="line.5499"></a>
+<span class="sourceLineNo">5500</span>    assertEquals("19997", Bytes.toString(currRow.get(1).getRowArray(),<a name="line.5500"></a>
+<span class="sourceLineNo">5501</span>      currRow.get(1).getRowOffset(), currRow.get(1).getRowLength()));<a name="line.5501"></a>
+<span class="sourceLineNo">5502</span>  }<a name="line.5502"></a>
+<span class="sourceLineNo">5503</span><a name="line.5503"></a>
+<span class="sourceLineNo">5504</span>  @Test<a name="line.5504"></a>
+<span class="sourceLineNo">5505</span>  public void testReverseScanShouldNotScanMemstoreIfReadPtLesser() throws Exception {<a name="line.5505"></a>
+<span class="sourceLineNo">5506</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5506"></a>
+<span class="sourceLineNo">5507</span>    byte[][] families = { cf1 };<a name="line.5507"></a>
+<span class="sourceLineNo">5508</span>    byte[] col = Bytes.toBytes("C");<a name="line.5508"></a>
+<span class="sourceLineNo">5509</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5509"></a>
+<span class="sourceLineNo">5510</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5510"></a>
+<span class="sourceLineNo">5511</span>    // setup with one storefile and one memstore, to create scanner and get an earlier readPt<a name="line.5511"></a>
+<span class="sourceLineNo">5512</span>    Put put = new Put(Bytes.toBytes("19996"));<a name="line.5512"></a>
+<span class="sourceLineNo">5513</span>    put.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5513"></a>
+<span class="sourceLineNo">5514</span>    region.put(put);<a name="line.5514"></a>
+<span class="sourceLineNo">5515</span>    Put put2 = new Put(Bytes.toBytes("19995"));<a name="line.5515"></a>
+<span class="sourceLineNo">5516</span>    put2.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5516"></a>
+<span class="sourceLineNo">5517</span>    region.put(put2);<a name="line.5517"></a>
+<span class="sourceLineNo">5518</span>    // create a reverse scan<a name="line.5518"></a>
+<span class="sourceLineNo">5519</span>    Scan scan = new Scan(Bytes.toBytes("19996"));<a name="line.5519"></a>
+<span class="sourceLineNo">5520</span>    scan.setReversed(true);<a name="line.5520"></a>
+<span class="sourceLineNo">5521</span>    RegionScannerImpl scanner = region.getScanner(scan);<a name="line.5521"></a>
+<span class="sourceLineNo">5522</span><a name="line.5522"></a>
+<span class="sourceLineNo">5523</span>    // flush the cache. This will reset the store scanner<a name="line.5523"></a>
+<span class="sourceLineNo">5524</span>    region.flushcache(true, true, FlushLifeCycleTracker.DUMMY);<a name="line.5524"></a>
+<span class="sourceLineNo">5525</span><a name="line.5525"></a>
+<span class="sourceLineNo">5526</span>    // create one memstore contains many rows will be skipped<a name="line.5526"></a>
+<span class="sourceLineNo">5527</span>    // to check MemStoreScanner.seekToPreviousRow<a name="line.5527"></a>
+<span class="sourceLineNo">5528</span>    for (int i = 10000; i &lt; 20000; i++) {<a name="line.5528"></a>
+<span class="sourceLineNo">5529</span>      Put p = new Put(Bytes.toBytes("" + i));<a name="line.5529"></a>
+<span class="sourceLineNo">5530</span>      p.addColumn(cf1, col, Bytes.toBytes("" + i));<a name="line.5530"></a>
+<span class="sourceLineNo">5531</span>      region.put(p);<a name="line.5531"></a>
+<span class="sourceLineNo">5532</span>    }<a name="line.5532"></a>
+<span class="sourceLineNo">5533</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5533"></a>
+<span class="sourceLineNo">5534</span>    boolean hasNext;<a name="line.5534"></a>
+<span class="sourceLineNo">5535</span>    boolean assertDone = false;<a name="line.5535"></a>
+<span class="sourceLineNo">5536</span>    do {<a name="line.5536"></a>
+<span class="sourceLineNo">5537</span>      hasNext = scanner.next(currRow);<a name="line.5537"></a>
+<span class="sourceLineNo">5538</span>      // With HBASE-15871, after the scanner is reset the memstore scanner should not be<a name="line.5538"></a>
+<span class="sourceLineNo">5539</span>      // added here<a name="line.5539"></a>
+<span class="sourceLineNo">5540</span>      if (!assertDone) {<a name="line.5540"></a>
+<span class="sourceLineNo">5541</span>        StoreScanner current =<a name="line.5541"></a>
+<span class="sourceLineNo">5542</span>            (StoreScanner) (scanner.storeHeap).getCurrentForTesting();<a name="line.5542"></a>
+<span class="sourceLineNo">5543</span>        List&lt;KeyValueScanner&gt; scanners = current.getAllScannersForTesting();<a name="line.5543"></a>
+<span class="sourceLineNo">5544</span>        assertEquals("There should be only one scanner the store file scanner", 1,<a name="line.5544"></a>
+<span class="sourceLineNo">5545</span>          scanners.size());<a name="line.5545"></a>
+<span class="sourceLineNo">5546</span>        assertDone = true;<a name="line.5546"></a>
+<span class="sourceLineNo">5547</span>      }<a name="line.5547"></a>
+<span class="sourceLineNo">5548</span>    } while (hasNext);<a name="line.5548"></a>
+<span class="sourceLineNo">5549</span>    assertEquals(2, currRow.size());<a name="line.5549"></a>
+<span class="sourceLineNo">5550</span>    assertEquals("19996", Bytes.toString(currRow.get(0).getRowArray(),<a name="line.5550"></a>
+<span class="sourceLineNo">5551</span>      currRow.get(0).getRowOffset(), currRow.get(0).getRowLength()));<a name="line.5551"></a>
+<span class="sourceLineNo">5552</span>    assertEquals("19995", Bytes.toString(currRow.get(1).getRowArray(),<a name="line.5552"></a>
+<span class="sourceLineNo">5553</span>      currRow.get(1).getRowOffset(), currRow.get(1).getRowLength()));<a name="line.5553"></a>
+<span class="sourceLineNo">5554</span>  }<a name="line.5554"></a>
+<span class="sourceLineNo">5555</span><a name="line.5555"></a>
+<span class="sourceLineNo">5556</span>  @Test<a name="line.5556"></a>
+<span class="sourceLineNo">5557</span>  public void testReverseScanWhenPutCellsAfterOpenReverseScan() throws Exception {<a name="line.5557"></a>
+<span class="sourceLineNo">5558</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5558"></a>
+<span class="sourceLineNo">5559</span>    byte[][] families = { cf1 };<a name="line.5559"></a>
+<span class="sourceLineNo">5560</span>    byte[] col = Bytes.toBytes("C");<a name="line.5560"></a>
 <span class="sourceLineNo">5561</span><a name="line.5561"></a>
-<span class="sourceLineNo">5562</span>    // Create a reverse scan<a name="line.5562"></a>
-<span class="sourceLineNo">5563</span>    Scan scan = new Scan(Bytes.toBytes("199996"));<a name="line.5563"></a>
-<span class="sourceLineNo">5564</span>    scan.setReversed(true);<a name="line.5564"></a>
-<span class="sourceLineNo">5565</span>    RegionScannerImpl scanner = region.getScanner(scan);<a name="line.5565"></a>
-<span class="sourceLineNo">5566</span><a name="line.5566"></a>
-<span class="sourceLineNo">5567</span>    // Put a lot of cells that have sequenceIDs grater than the readPt of the reverse scan<a name="line.5567"></a>
-<span class="sourceLineNo">5568</span>    for (int i = 100000; i &lt; 200000; i++) {<a name="line.5568"></a>
-<span class="sourceLineNo">5569</span>      Put p = new Put(Bytes.toBytes("" + i));<a name="line.5569"></a>
-<span class="sourceLineNo">5570</span>      p.addColumn(cf1, col, Bytes.toBytes("" + i));<a name="line.5570"></a>
-<span class="sourceLineNo">5571</span>      region.put(p);<a name="line.5571"></a>
-<span class="sourceLineNo">5572</span>    }<a name="line.5572"></a>
-<span class="sourceLineNo">5573</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5573"></a>
-<span class="sourceLineNo">5574</span>    boolean hasNext;<a name="line.5574"></a>
-<span class="sourceLineNo">5575</span>    do {<a name="line.5575"></a>
-<span class="sourceLineNo">5576</span>      hasNext = scanner.next(currRow);<a name="line.5576"></a>
-<span class="sourceLineNo">5577</span>    } while (hasNext);<a name="line.5577"></a>
-<span class="sourceLineNo">5578</span><a name="line.5578"></a>
-<span class="sourceLineNo">5579</span>    assertEquals(2, currRow.size());<a name="line.5579"></a>
-<span class="sourceLineNo">5580</span>    assertEquals("199996", Bytes.toString(currRow.get(0).getRowArray(),<a name="line.5580"></a>
-<span class="sourceLineNo">5581</span>      currRow.get(0).getRowOffset(), currRow.get(0).getRowLength()));<a name="line.5581"></a>
-<span class="sourceLineNo">5582</span>    assertEquals("199995", Bytes.toString(currRow.get(1).getRowArray(),<a name="line.5582"></a>
-<span class="sourceLineNo">5583</span>      currRow.get(1).getRowOffset(), currRow.get(1).getRowLength()));<a name="line.5583"></a>
-<span class="sourceLineNo">5584</span>  }<a name="line.5584"></a>
-<span class="sourceLineNo">5585</span><a name="line.5585"></a>
-<span class="sourceLineNo">5586</span>  @Test<a name="line.5586"></a>
-<span class="sourceLineNo">5587</span>  public void testWriteRequestsCounter() throws IOException {<a name="line.5587"></a>
-<span class="sourceLineNo">5588</span>    byte[] fam = Bytes.toBytes("info");<a name="line.5588"></a>
-<span class="sourceLineNo">5589</span>    byte[][] families = { fam };<a name="line.5589"></a>
-<span class="sourceLineNo">5590</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.5590"></a>
-<span class="sourceLineNo">5591</span><a name="line.5591"></a>
-<span class="sourceLineNo">5592</span>    Assert.assertEquals(0L, region.getWriteRequestsCount());<a name="line.5592"></a>
-<span class="sourceLineNo">5593</span><a name="line.5593"></a>
-<span class="sourceLineNo">5594</span>    Put put = new Put(row);<a name="line.5594"></a>
-<span class="sourceLineNo">5595</span>    put.addColumn(fam, fam, fam);<a name="line.5595"></a>
-<span class="sourceLineNo">5596</span><a name="line.5596"></a>
-<span class="sourceLineNo">5597</span>    Assert.assertEquals(0L, region.getWriteRequestsCount());<a name="line.5597"></a>
-<span class="sourceLineNo">5598</span>    region.put(put);<a name="line.5598"></a>
-<span class="sourceLineNo">5599</span>    Assert.assertEquals(1L, region.getWriteRequestsCount());<a name="line.5599"></a>
-<span class="sourceLineNo">5600</span>    region.put(put);<a name="line.5600"></a>
-<span class="sourceLineNo">5601</span>    Assert.assertEquals(2L, region.getWriteRequestsCount());<a name="line.5601"></a>
-<span class="sourceLineNo">5602</span>    region.put(put);<a name="line.5602"></a>
-<span class="sourceLineNo">5603</span>    Assert.assertEquals(3L, region.getWriteRequestsCount());<a name="line.5603"></a>
-<span class="sourceLineNo">5604</span><a name="line.5604"></a>
-<span class="sourceLineNo">5605</span>    region.delete(new Delete(row));<a name="line.5605"></a>
-<span class="sourceLineNo">5606</span>    Assert.assertEquals(4L, region.getWriteRequestsCount());<a name="line.5606"></a>
-<span class="sourceLineNo">5607</span>  }<a name="line.5607"></a>
-<span class="sourceLineNo">5608</span><a name="line.5608"></a>
-<span class="sourceLineNo">5609</span>  @Test<a name="line.5609"></a>
-<span class="sourceLineNo">5610</span>  public void testOpenRegionWrittenToWAL() throws Exception {<a name="line.5610"></a>
-<span class="sourceLineNo">5611</span>    final ServerName serverName = ServerName.valueOf(name.getMethodName(), 100, 42);<a name="line.5611"></a>
-<span class="sourceLineNo">5612</span>    final RegionServerServices rss = spy(TEST_UTIL.createMockRegionServerService(serverName));<a name="line.5612"></a>
-<span class="sourceLineNo">5613</span><a name="line.5613"></a>
-<span class="sourceLineNo">5614</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.5614"></a>
-<span class="sourceLineNo">5615</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.5615"></a>
-<span class="sourceLineNo">5616</span>    htd.addFamily(new HColumnDescriptor(fam2));<a name="line.5616"></a>
-<span class="sourceLineNo">5617</span><a name="line.5617"></a>
-<span class="sourceLineNo">5618</span>    HRegionInfo hri = new HRegionInfo(htd.getTableName(),<a name="line.5618"></a>
-<span class="sourceLineNo">5619</span>      HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY);<a name="line.5619"></a>
-<span class="sourceLineNo">5620</span><a name="line.5620"></a>
-<span class="sourceLineNo">5621</span>    // open the region w/o rss and wal and flush some files<a name="line.5621"></a>
-<span class="sourceLineNo">5622</span>    region =<a name="line.5622"></a>
-<span class="sourceLineNo">5623</span>         HBaseTestingUtility.createRegionAndWAL(hri, TEST_UTIL.getDataTestDir(), TEST_UTIL<a name="line.5623"></a>
-<span class="sourceLineNo">5624</span>             .getConfiguration(), htd);<a name="line.5624"></a>
-<span class="sourceLineNo">5625</span>    assertNotNull(region);<a name="line.5625"></a>
-<span class="sourceLineNo">5626</span><a name="line.5626"></a>
-<span class="sourceLineNo">5627</span>    // create a file in fam1 for the region before opening in OpenRegionHandler<a name="line.5627"></a>
-<span class="sourceLineNo">5628</span>    region.put(new Put(Bytes.toBytes("a")).addColumn(fam1, fam1, fam1));<a name="line.5628"></a>
-<span class="sourceLineNo">5629</span>    region.flush(true);<a name="line.5629"></a>
-<span class="sourceLineNo">5630</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.5630"></a>
-<span class="sourceLineNo">5631</span><a name="line.5631"></a>
-<span class="sourceLineNo">5632</span>    ArgumentCaptor&lt;WALEdit&gt; editCaptor = ArgumentCaptor.forClass(WALEdit.class);<a name="line.5632"></a>
-<span class="sourceLineNo">5633</span><a name="line.5633"></a>
-<span class="sourceLineNo">5634</span>    // capture append() calls<a name="line.5634"></a>
-<span class="sourceLineNo">5635</span>    WAL wal = mockWAL();<a name="line.5635"></a>
-<span class="sourceLineNo">5636</span>    when(rss.getWAL((HRegionInfo) any())).thenReturn(wal);<a name="line.5636"></a>
-<span class="sourceLineNo">5637</span><a name="line.5637"></a>
-<span class="sourceLineNo">5638</span>    region = HRegion.openHRegion(hri, htd, rss.getWAL(hri),<a name="line.5638"></a>
-<span class="sourceLineNo">5639</span>      TEST_UTIL.getConfiguration(), rss, null);<a name="line.5639"></a>
-<span class="sourceLineNo">5640</span><a name="line.5640"></a>
-<span class="sourceLineNo">5641</span>    verify(wal, times(1)).append((HRegionInfo)any(), (WALKeyImpl)any()<a name="line.5641"></a>
-<span class="sourceLineNo">5642</span>      , editCaptor.capture(), anyBoolean());<a name="line.5642"></a>
+<span class="sourceLineNo">5562</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5562"></a>
+<span class="sourceLineNo">5563</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5563"></a>
+<span class="sourceLineNo">5564</span><a name="line.5564"></a>
+<span class="sourceLineNo">5565</span>    Put put = new Put(Bytes.toBytes("199996"));<a name="line.5565"></a>
+<span class="sourceLineNo">5566</span>    put.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5566"></a>
+<span class="sourceLineNo">5567</span>    region.put(put);<a name="line.5567"></a>
+<span class="sourceLineNo">5568</span>    Put put2 = new Put(Bytes.toBytes("199995"));<a name="line.5568"></a>
+<span class="sourceLineNo">5569</span>    put2.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5569"></a>
+<span class="sourceLineNo">5570</span>    region.put(put2);<a name="line.5570"></a>
+<span class="sourceLineNo">5571</span><a name="line.5571"></a>
+<span class="sourceLineNo">5572</span>    // Create a reverse scan<a name="line.5572"></a>
+<span class="sourceLineNo">5573</span>    Scan scan = new Scan(Bytes.toBytes("199996"));<a name="line.5573"></a>
+<span class="sourceLineNo">5574</span>    scan.setReversed(true);<a name="line.5574"></a>
+<span class="sourceLineNo">5575</span>    RegionScannerImpl scanner = region.getScanner(scan);<a name="line.5575"></a>
+<span class="sourceLineNo">5576</span><a name="line.5576"></a>
+<span class="sourceLineNo">5577</span>    // Put a lot of cells that have sequenceIDs grater than the readPt of the reverse scan<a name="line.5577"></a>
+<span class="sourceLineNo">5578</span>    for (int i = 100000; i &lt; 200000; i++) {<a name="line.5578"></a>
+<span class="sourceLineNo">5579</span>      Put p = new Put(Bytes.toBytes("" + i));<a name="line.5579"></a>
+<span class="sourceLineNo">5580</span>      p.addColumn(cf1, col, Bytes.toBytes("" + i));<a name="line.5580"></a>
+<span class="sourceLineNo">5581</span>      region.put(p);<a name="line.5581"></a>
+<span class="sourceLineNo">5582</span>    }<a name="line.5582"></a>
+<span class="sourceLineNo">5583</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5583"></a>
+<span class="sourceLineNo">5584</span>    boolean hasNext;<a name="line.5584"></a>
+<span class="sourceLineNo">5585</span>    do {<a name="line.5585"></a>
+<span class="sourceLineNo">5586</span>      hasNext = scanner.next(currRow);<a name="line.5586"></a>
+<span class="sourceLineNo">5587</span>    } while (hasNext);<a name="line.5587"></a>
+<span class="sourceLineNo">5588</span><a name="line.5588"></a>
+<span class="sourceLineNo">5589</span>    assertEquals(2, currRow.size());<a name="line.5589"></a>
+<span class="sourceLineNo">5590</span>    assertEquals("199996", Bytes.toString(currRow.get(0).getRowArray(),<a name="line.5590"></a>
+<span class="sourceLineNo">5591</span>      currRow.get(0).getRowOffset(), currRow.get(0).getRowLength()));<a name="line.5591"></a>
+<span class="sourceLineNo">5592</span>    assertEquals("199995", Bytes.toString(currRow.get(1).getRowArray(),<a name="line.5592"></a>
+<span class="sourceLineNo">5593</span>      currRow.get(1).getRowOffset(), currRow.get(1).getRowLength()));<a name="line.5593"></a>
+<span class="sourceLineNo">5594</span>  }<a name="line.5594"></a>
+<span class="sourceLineNo">5595</span><a name="line.5595"></a>
+<span class="sourceLineNo">5596</span>  @Test<a name="line.5596"></a>
+<span class="sourceLineNo">5597</span>  public void testWriteRequestsCounter() throws IOException {<a name="line.5597"></a>
+<span class="sourceLineNo">5598</span>    byte[] fam = Bytes.toBytes("info");<a name="line.5598"></a>
+<span class="sourceLineNo">5599</span>    byte[][] families = { fam };<a name="line.5599"></a>
+<span class="sourceLineNo">5600</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.5600"></a>
+<span class="sourceLineNo">5601</span><a name="line.5601"></a>
+<span class="sourceLineNo">5602</span>    Assert.assertEquals(0L, region.getWriteRequestsCount());<a name="line.5602"></a>
+<span class="sourceLineNo">5603</span><a name="line.5603"></a>
+<span class="sourceLineNo">5604</span>    Put put = new Put(row);<a name="line.5604"></a>
+<span class="sourceLineNo">5605</span>    put.addColumn(fam, fam, fam);<a name="line.5605"></a>
+<span class="sourceLineNo">5606</span><a name="line.5606"></a>
+<span class="sourceLineNo">5607</span>    Assert.assertEquals(0L, region.getWriteRequestsCount());<a name="line.5607"></a>
+<span class="sourceLineNo">5608</span>    region.put(put);<a name="line.5608"></a>
+<span class="sourceLineNo">5609</span>    Assert.assertEquals(1L, region.getWriteRequestsCount());<a name="line.5609"></a>
+<span class="sourceLineNo">5610</span>    region.put(put);<a name="line.5610"></a>
+<span class="sourceLineNo">5611</span>    Assert.assertEquals(2L, region.getWriteRequestsCount());<a name="line.5611"></a>
+<span class="sourceLineNo">5612</span>    region.put(put);<a name="line.5612"></a>
+<span class="sourceLineNo">5613</span>    Assert.assertEquals(3L, region.getWriteRequestsCount());<a name="line.5613"></a>
+<span class="sourceLineNo">5614</span><a name="line.5614"></a>
+<span class="sourceLineNo">5615</span>    region.delete(new Delete(row));<a name="line.5615"></a>
+<span class="sourceLineNo">5616</span>    Assert.assertEquals(4L, region.getWriteRequestsCount());<a name="line.5616"></a>
+<span class="sourceLineNo">5617</span>  }<a name="line.5617"></a>
+<span class="sourceLineNo">5618</span><a name="line.5618"></a>
+<span class="sourceLineNo">5619</span>  @Test<a name="line.5619"></a>
+<span class="sourceLineNo">5620</span>  public void testOpenRegionWrittenToWAL() throws Exception {<a name="line.5620"></a>
+<span class="sourceLineNo">5621</span>    final ServerName serverName = ServerName.valueOf(name.getMethodName(), 100, 42);<a name="line.5621"></a>
+<span class="sourceLineNo">5622</span>    final RegionServerServices rss = spy(TEST_UTIL.createMockRegionServerService(serverName));<a name="line.5622"></a>
+<span class="sourceLineNo">5623</span><a name="line.5623"></a>
+<span class="sourceLineNo">5624</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.5624"></a>
+<span class="sourceLineNo">5625</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.5625"></a>
+<span class="sourceLineNo">5626</span>    htd.addFamily(new HColumnDescriptor(fam2));<a name="line.5626"></a>
+<span class="sourceLineNo">5627</span><a name="line.5627"></a>
+<span class="sourceLineNo">5628</span>    HRegionInfo hri = new HRegionInfo(htd.getTableName(),<a name="line.5628"></a>
+<span class="sourceLineNo">5629</span>      HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY);<a name="line.5629"></a>
+<span class="sourceLineNo">5630</span><a name="line.5630"></a>
+<span class="sourceLineNo">5631</span>    // open the region w/o rss and wal and flush some files<a name="line.5631"></a>
+<span class="sourceLineNo">5632</span>    region =<a name="line.5632"></a>
+<span class="sourceLineNo">5633</span>         HBaseTestingUtility.createRegionAndWAL(hri, TEST_UTIL.getDataTestDir(), TEST_UTIL<a name="line.5633"></a>
+<span class="sourceLineNo">5634</span>             .getConfiguration(), htd);<a name="line.5634"></a>
+<span class="sourceLineNo">5635</span>    assertNotNull(region);<a name="line.5635"></a>
+<span class="sourceLineNo">5636</span><a name="line.5636"></a>
+<span class="sourceLineNo">5637</span>    // create a file in fam1 for the region before opening in OpenRegionHandler<a name="line.5637"></a>
+<span class="sourceLineNo">5638</span>    region.put(new Put(Bytes.toBytes("a")).addColumn(fam1, fam1, fam1));<a name="line.5638"></a>
+<span class="sourceLineNo">5639</span>    region.flush(true);<a name="line.5639"></a>
+<span class="sourceLineNo">5640</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.5640"></a>
+<span class="sourceLineNo">5641</span><a name="line.5641"></a>
+<span class="sourceLineNo">5642</span>    ArgumentCaptor&lt;WALEdit&gt; editCaptor = ArgumentCaptor.forClass(WALEdit.class);<a name="line.5642"></a>
 <span class="sourceLineNo">5643</span><a name="line.5643"></a>
-<span class="sourceLineNo">5644</span>    WALEdit edit = editCaptor.getValue();<a name="line.5644"></a>
-<span class="sourceLineNo">5645</span>    assertNotNull(edit);<a name="line.5645"></a>
-<span class="sourceLineNo">5646</span>    assertNotNull(edit.getCells());<a name="line.5646"></a>
-<span class="sourceLineNo">5647</span>    assertEquals(1, edit.getCells().size());<a name="line.5647"></a>
-<span class="sourceLineNo">5648</span>    RegionEventDescriptor desc = WALEdit.getRegionEventDescriptor(edit.getCells().get(0));<a name="line.5648"></a>
-<span class="sourceLineNo">5649</span>    assertNotNull(desc);<a name="line.5649"></a>
+<span class="sourceLineNo">5644</span>    // capture append() calls<a name="line.5644"></a>
+<span class="sourceLineNo">5645</span>    WAL wal = mockWAL();<a name="line.5645"></a>
+<span class="sourceLineNo">5646</span>    when(rss.getWAL((HRegionInfo) any())).thenReturn(wal);<a name="line.5646"></a>
+<span class="sourceLineNo">5647</span><a name="line.5647"></a>
+<span class="sourceLineNo">5648</span>    region = HRegion.openHRegion(hri, htd, rss.getWAL(hri),<a name="line.5648"></a>
+<span class="sourceLineNo">5649</span>      TEST_UTIL.getConfiguration(), rss, null);<a name="line.5649"></a>
 <span class="sourceLineNo">5650</span><a name="line.5650"></a>
-<span class="sourceLineNo">5651</span>    LOG.info("RegionEventDescriptor from WAL: " + desc);<a name="line.5651"></a>
-<span class="sourceLineNo">5652</span><a name="line.5652"></a>
-<span class="sourceLineNo">5653</span>    assertEquals(RegionEventDescriptor.EventType.REGION_OPEN, desc.getEventType());<a name="line.5653"></a>
-<span class="sourceLineNo">5654</span>    assertTrue(Bytes.equals(desc.getTableName().toByteArray(), htd.getTableName().toBytes()));<a name="line.5654"></a>
-<span class="sourceLineNo">5655</span>    assertTrue(Bytes.equals(desc.getEncodedRegionName().toByteArray(),<a name="line.5655"></a>
-<span class="sourceLineNo">5656</span>      hri.getEncodedNameAsBytes()));<a name="line.5656"></a>
-<span class="sourceLineNo">5657</span>    assertTrue(desc.getLogSequenceNumber() &gt; 0);<a name="line.5657"></a>
-<span class="sourceLineNo">5658</span>    assertEquals(serverName, ProtobufUtil.toServerName(desc.getServer()));<a name="line.5658"></a>
-<span class="sourceLineNo">5659</span>    assertEquals(2, desc.getStoresCount());<a name="line.5659"></a>
+<span class="sourceLineNo">5651</span>    verify(wal, times(1)).append((HRegionInfo)any(), (WALKeyImpl)any()<a name="line.5651"></a>
+<span class="sourceLineNo">5652</span>      , editCaptor.capture(), anyBoolean());<a name="line.5652"></a>
+<span class="sourceLineNo">5653</span><a name="line.5653"></a>
+<span class="sourceLineNo">5654</span>    WALEdit edit = editCaptor.getValue();<a name="line.5654"></a>
+<span class="sourceLineNo">5655</span>    assertNotNull(edit);<a name="line.5655"></a>
+<span class="sourceLineNo">5656</span>    assertNotNull(edit.getCells());<a name="line.5656"></a>
+<span class="sourceLineNo">5657</span>    assertEquals(1, edit.getCells().size());<a name="line.5657"></a>
+<span class="sourceLineNo">5658</span>    RegionEventDescriptor desc = WALEdit.getRegionEventDescriptor(edit.getCells().get(0));<a name="line.5658"></a>
+<span class="sourceLineNo">5659</span>    assertNotNull(desc);<a name="line.5659"></a>
 <span class="sourceLineNo">5660</span><a name="line.5660"></a>
-<span class="sourceLineNo">5661</span>    StoreDescriptor store = desc.getStores(0);<a name="line.5661"></a>
-<span class="sourceLineNo">5662</span>    assertTrue(Bytes.equals(store.getFamilyName().toByteArray(), fam1));<a name="line.5662"></a>
-<span class="sourceLineNo">5663</span>    assertEquals(store.getStoreHomeDir(), Bytes.toString(fam1));<a name="line.5663"></a>
-<span class="sourceLineNo">5664</span>    assertEquals(1, store.getStoreFileCount()); // 1store file<a name="line.5664"></a>
-<span class="sourceLineNo">5665</span>    assertFalse(store.getStoreFile(0).contains("/")); // ensure path is relative<a name="line.5665"></a>
-<span class="sourceLineNo">5666</span><a name="line.5666"></a>
-<span class="sourceLineNo">5667</span>    store = desc.getStores(1);<a name="line.5667"></a>
-<span class="sourceLineNo">5668</span>    assertTrue(Bytes.equals(store.getFamilyName().toByteArray(), fam2));<a name="line.5668"></a>
-<span class="sourceLineNo">5669</span>    assertEquals(store.getStoreHomeDir(), Bytes.toString(fam2));<a name="line.5669"></a>
-<span class="sourceLineNo">5670</span>    assertEquals(0, store.getStoreFileCount()); // no store files<a name="line.5670"></a>
-<span class="sourceLineNo">5671</span>  }<a name="line.5671"></a>
-<span class="sourceLineNo">5672</span><a name="line.5672"></a>
-<span class="sourceLineNo">5673</span>  // Helper for test testOpenRegionWrittenToWALForLogReplay<a name="line.5673"></a>
-<span class="sourceLineNo">5674</span>  static class HRegionWithSeqId extends HRegion {<a name="line.5674"></a>
-<span class="sourceLineNo">5675</span>    public HRegionWithSeqId(final Path tableDir, final WAL wal, final FileSystem fs,<a name="line.5675"></a>
-<span class="sourceLineNo">5676</span>        final Configuration confParam, final RegionInfo regionInfo,<a name="line.5676"></a>
-<span class="sourceLineNo">5677</span>        final TableDescriptor htd, final RegionServerServices rsServices) {<a name="line.5677"></a>
-<span class="sourceLineNo">5678</span>      super(tableDir, wal, fs, confParam, regionInfo, htd, rsServices);<a name="line.5678"></a>
-<span class="sourceLineNo">5679</span>    }<a name="line.5679"></a>
-<span class="sourceLineNo">5680</span>    @Override<a name="line.5680"></a>
-<span class="sourceLineNo">5681</span>    protected long getNextSequenceId(WAL wal) throws IOException {<a name="line.5681"></a>
-<span class="sourceLineNo">5682</span>      return 42;<a name="line.5682"></a>
-<span class="sourceLineNo">5683</span>    }<a name="line.5683"></a>
-<span class="sourceLineNo">5684</span>  }<a name="line.5684"></a>
-<span class="sourceLineNo">5685</span><a name="line.5685"></a>
-<span class="sourceLineNo">5686</span>  @Test<a name="line.5686"></a>
-<span class="sourceLineNo">5687</span>  public void testFlushedFileWithNoTags() throws Exception {<a name="line.5687"></a>
-<span class="sourceLineNo">5688</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.5688"></a>
-<span class="sourceLineNo">5689</span>    HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.5689"></a>
-<span class="sourceLineNo">5690</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.5690"></a>
-<span class="sourceLineNo">5691</span>    HRegionInfo info = new HRegionInfo(tableName, null, null, false);<a name="line.5691"></a>
-<span class="sourceLineNo">5692</span>    Path path = TEST_UTIL.getDataTestDir(getClass().getSimpleName());<a name="line.5692"></a>
-<span class="sourceLineNo">5693</span>    region = HBaseTestingUtility.createRegionAndWAL(info, path, TEST_UTIL.getConfiguration(), htd);<a name="line.5693"></a>
-<span class="sourceLineNo">5694</span>    Put put = new Put(Bytes.toBytes("a-b-0-0"));<a name="line.5694"></a>
-<span class="sourceLineNo">5695</span>    put.addColumn(fam1, qual1, Bytes.toBytes("c1-value"));<a name="line.5695"></a>
-<span class="sourceLineNo">5696</span>    region.put(put);<a name="line.5696"></a>
-<span class="sourceLineNo">5697</span>    region.flush(true);<a name="line.5697"></a>
-<span class="sourceLineNo">5698</span>    HStore store = region.getStore(fam1);<a name="line.5698"></a>
-<span class="sourceLineNo">5699</span>    Collection&lt;HStoreFile&gt; storefiles = store.getStorefiles();<a name="line.5699"></a>
-<span class="sourceLineNo">5700</span>    for (HStoreFile sf : storefiles) {<a name="line.5700"></a>
-<span class="sourceLineNo">5701</span>      assertFalse("Tags should not be present "<a name="line.5701"></a>
-<span class="sourceLineNo">5702</span>          ,sf.getReader().getHFileReader().getFileContext().isIncludesTags());<a name="line.5702"></a>
-<span class="sourceLineNo">5703</span>    }<a name="line.5703"></a>
-<span class="sourceLineNo">5704</span>  }<a name="line.5704"></a>
-<span class="sourceLineNo">5705</span><a name="line.5705"></a>
-<span class="sourceLineNo">5706</span>  /**<a name="line.5706"></a>
-<span class="sourceLineNo">5707</span>   * Utility method to setup a WAL mock.<a name="line.5707"></a>
-<span class="sourceLineNo">5708</span>   * Needs to do the bit where we close latch on the WALKeyImpl on append else test hangs.<a name="line.5708"></a>
-<span class="sourceLineNo">5709</span>   * @return a mock WAL<a name="line.5709"></a>
-<span class="sourceLineNo">5710</span>   * @throws IOException<a name="line.5710"></a>
-<span class="sourceLineNo">5711</span>   */<a name="line.5711"></a>
-<span class="sourceLineNo">5712</span>  private WAL mockWAL() throws IOException {<a name="line.5712"></a>
-<span class="sourceLineNo">5713</span>    WAL wal = mock(WAL.class);<a name="line.5713"></a>
-<span class="sourceLineNo">5714</span>    Mockito.when(wal.append((HRegionInfo)Mockito.any(),<a name="line.5714"></a>
-<span class="sourceLineNo">5715</span>        (WALKeyImpl)Mockito.any(), (WALEdit)Mockito.any(), Mockito.anyBoolean())).<a name="line.5715"></a>
-<span class="sourceLineNo">5716</span>      thenAnswer(new Answer&lt;Long&gt;() {<a name="line.5716"></a>
-<span class="sourceLineNo">5717</span>        @Override<a name="line.5717"></a>
-<span class="sourceLineNo">5718</span>        public Long answer(InvocationOnMock invocation) throws Throwable {<a name="line.5718"></a>
-<span class="sourceLineNo">5719</span>          WALKeyImpl key = invocation.getArgument(1);<a name="line.5719"></a>
-<span class="sourceLineNo">5720</span>          MultiVersionConcurrencyControl.WriteEntry we = key.getMvcc().begin();<a name="line.5720"></a>
-<span class="sourceLineNo">5721</span>          key.setWriteEntry(we);<a name="line.5721"></a>
-<span class="sourceLineNo">5722</span>          return 1L;<a name="line.5722"></a>
-<span class="sourceLineNo">5723</span>        }<a name="line.5723"></a>
-<span class="sourceLineNo">5724</span><a name="line.5724"></a>
-<span class="sourceLineNo">5725</span>    });<a name="line.5725"></a>
-<span class="sourceLineNo">5726</span>    return wal;<a name="line.5726"></a>
-<span class="sourceLineNo">5727</span>  }<a name="line.5727"></a>
-<span class="sourceLineNo">5728</span><a name="line.5728"></a>
-<span class="sourceLineNo">5729</span>  @Test<a name="line.5729"></a>
-<span class="sourceLineNo">5730</span>  public void testCloseRegionWrittenToWAL() throws Exception {<a name="line.5730"></a>
-<span class="sourceLineNo">5731</span><a name="line.5731"></a>
-<span class="sourceLineNo">5732</span>    Path rootDir = new Path(dir + name.getMethodName());<a name="line.5732"></a>
-<span class="sourceLineNo">5733</span>    FSUtils.setRootDir(TEST_UTIL.getConfiguration(), rootDir);<a name="line.5733"></a>
+<span class="sourceLineNo">5661</span>    LOG.info("RegionEventDescriptor from WAL: " + desc);<a name="line.5661"></a>
+<span class="sourceLineNo">5662</span><a name="line.5662"></a>
+<span class="sourceLineNo">5663</span>    assertEquals(RegionEventDescriptor.EventType.REGION_OPEN, desc.getEventType());<a name="line.5663"></a>
+<span class="sourceLineNo">5664</span>    assertTrue(Bytes.equals(desc.getTableName().toByteArray(), htd.getTableName().toBytes()));<a name="line.5664"></a>
+<span class="sourceLineNo">5665</span>    assertTrue(Bytes.equals(desc.getEncodedRegionName().toByteArray(),<a name="line.5665"></a>
+<span class="sourceLineNo">5666</span>      hri.getEncodedNameAsBytes()));<a name="line.5666"></a>
+<span class="sourceLineNo">5667</span>    assertTrue(desc.getLogSequenceNumber() &gt; 0);<a name="line.5667"></a>
+<span class="sourceLineNo">5668</span>    assertEquals(serverName, ProtobufUtil.toServerName(desc.getServer()));<a name="line.5668"></a>
+<span class="sourceLineNo">5669</span>    assertEquals(2, desc.getStoresCount());<a name="line.5669"></a>
+<span class="sourceLineNo">5670</span><a name="line.5670"></a>
+<span class="sourceLineNo">5671</span>    StoreDescriptor store = desc.getStores(0);<a name="line.5671"></a>
+<span class="sourceLineNo">5672</span>    assertTrue(Bytes.equals(store.getFamilyName().toByteArray(), fam1));<a name="line.5672"></a>
+<span class="sourceLineNo">5673</span>    assertEquals(store.getStoreHomeDir(), Bytes.toString(fam1));<a name="line.5673"></a>
+<span class="sourceLineNo">5674</span>    assertEquals(1, store.getStoreFileCount()); // 1store file<a name="line.5674"></a>
+<span class="sourceLineNo">5675</span>    assertFalse(store.getStoreFile(0).contains("/")); // ensure path is relative<a name="line.5675"></a>
+<span class="sourceLineNo">5676</span><a name="line.5676"></a>
+<span class="sourceLineNo">5677</span>    store = desc.getStores(1);<a name="line.5677"></a>
+<span class="sourceLineNo">5678</span>    assertTrue(Bytes.equals(store.getFamilyName().toByteArray(), fam2));<a name="line.5678"></a>
+<span class="sourceLineNo">5679</span>    assertEquals(store.getStoreHomeDir(), Bytes.toString(fam2));<a name="line.5679"></a>
+<span class="sourceLineNo">5680</span>    assertEquals(0, store.getStoreFileCount()); // no store files<a name="line.5680"></a>
+<span class="sourceLineNo">5681</span>  }<a name="line.5681"></a>
+<span class="sourceLineNo">5682</span><a name="line.5682"></a>
+<span class="sourceLineNo">5683</span>  // Helper for test testOpenRegionWrittenToWALForLogReplay<a name="line.5683"></a>
+<span class="sourceLineNo">5684</span>  static class HRegionWithSeqId extends HRegion {<a name="line.5684"></a>
+<span class="sourceLineNo">5685</span>    public HRegionWithSeqId(final Path tableDir, final WAL wal, final FileSystem fs,<a name="line.5685"></a>
+<span class="sourceLineNo">5686</span>        final Configuration confParam, final RegionInfo regionInfo,<a name="line.5686"></a>
+<span class="sourceLineNo">5687</span>        final TableDescriptor htd, final RegionServerServices rsServices) {<a name="line.5687"></a>
+<span class="sourceLineNo">5688</span>      super(tableDir, wal, fs, confParam, regionInfo, htd, rsServices);<a name="line.5688"></a>
+<span class="sourceLineNo">5689</span>    }<a name="line.5689"></a>
+<span class="sourceLineNo">5690</span>    @Override<a name="line.5690"></a>
+<span class="sourceLineNo">5691</span>    protected long getNextSequenceId(WAL wal) throws IOException {<a name="line.5691"></a>
+<span class="sourceLineNo">5692</span>      return 42;<a name="line.5692"></a>
+<span class="sourceLineNo">5693</span>    }<a name="line.5693"></a>
+<span class="sourceLineNo">5694</span>  }<a name="line.5694"></a>
+<span class="sourceLineNo">5695</span><a name="line.5695"></a>
+<span class="sourceLineNo">5696</span>  @Test<a name="line.5696"></a>
+<span class="sourceLineNo">5697</span>  public void testFlushedFileWithNoTags() throws Exception {<a name="line.5697"></a>
+<span class="sourceLineNo">5698</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.5698"></a>
+<span class="sourceLineNo">5699</span>    HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.5699"></a>
+<span class="sourceLineNo">5700</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.5700"></a>
+<span class="sourceLineNo">5701</span>    HRegionInfo info = new HRegionInfo(tableName, null, null, false);<a name="line.5701"></a>
+<span class="sourceLineNo">5702</span>    Path path = TEST_UTIL.getDataTestDir(getClass().getSimpleName());<a name="line.5702"></a>
+<span class="sourceLineNo">5703</span>    region = HBaseTestingUtility.createRegionAndWAL(info, path, TEST_UTIL.getConfiguration(), htd);<a name="line.5703"></a>
+<span class="sourceLineNo">5704</span>    Put put = new Put(Bytes.toBytes("a-b-0-0"));<a name="line.5704"></a>
+<span class="sourceLineNo">5705</span>    put.addColumn(fam1, qual1, Bytes.toBytes("c1-value"));<a name="line.5705"></a>
+<span class="sourceLineNo">5706</span>    region.put(put);<a name="line.5706"></a>
+<span class="sourceLineNo">5707</span>    region.flush(true);<a name="line.5707"></a>
+<span class="sourceLineNo">5708</span>    HStore store = region.getStore(fam1);<a name="line.5708"></a>
+<span class="sourceLineNo">5709</span>    Collection&lt;HStoreFile&gt; storefiles = store.getStorefiles();<a name="line.5709"></a>
+<span class="sourceLineNo">5710</span>    for (HStoreFile sf : storefiles) {<a name="line.5710"></a>
+<span class="sourceLineNo">5711</span>      assertFalse("Tags should not be present "<a name="line.5711"></a>
+<span class="sourceLineNo">5712</span>          ,sf.getReader().getHFileReader().getFileContext().isIncludesTags());<a name="line.5712"></a>
+<span class="sourceLineNo">5713</span>    }<a name="line.5713"></a>
+<span class="sourceLineNo">5714</span>  }<a name="line.5714"></a>
+<span class="sourceLineNo">5715</span><a name="line.5715"></a>
+<span class="sourceLineNo">5716</span>  /**<a name="line.5716"></a>
+<span class="sourceLineNo">5717</span>   * Utility method to setup a WAL mock.<a name="line.5717"></a>
+<span class="sourceLineNo">5718</span>   * Needs to do the bit where we close latch on the WALKeyImpl on append else test hangs.<a name="line.5718"></a>
+<span class="sourceLineNo">5719</span>   * @return a mock WAL<a name="line.5719"></a>
+<span class="sourceLineNo">5720</span>   * @throws IOException<a name="line.5720"></a>
+<span class="sourceLineNo">5721</span>   */<a name="line.5721"></a>
+<span class="sourceLineNo">5722</span>  private WAL mockWAL() throws IOException {<a name="line.5722"></a>
+<span class="sourceLineNo">5723</span>    WAL wal = mock(WAL.class);<a name="line.5723"></a>
+<span class="sourceLineNo">5724</span>    Mockito.when(wal.append((HRegionInfo)Mockito.any(),<a name="line.5724"></a>
+<span class="sourceLineNo">5725</span>        (WALKeyImpl)Mockito.any(), (WALEdit)Mockito.any(), Mockito.anyBoolean())).<a name="line.5725"></a>
+<span class="sourceLineNo">5726</span>      thenAnswer(new Answer&lt;Long&gt;() {<a name="line.5726"></a>
+<span class="sourceLineNo">5727</span>        @Override<a name="line.5727"></a>
+<span class="sourceLineNo">5728</span>        public Long answer(InvocationOnMock invocation) throws Throwable {<a name="line.5728"></a>
+<span class="sourceLineNo">5729</span>          WALKeyImpl key = invocation.getArgument(1);<a name="line.5729"></a>
+<span class="sourceLineNo">5730</span>          MultiVersionConcurrencyControl.WriteEntry we = key.getMvcc().begin();<a name="line.5730"></a>
+<span class="sourceLineNo">5731</span>          key.setWriteEntry(we);<a name="line.5731"></a>
+<span class="sourceLineNo">5732</span>          return 1L;<a name="line.5732"></a>
+<span class="sourceLineNo">5733</span>        }<a name="line.5733"></a>
 <span class="sourceLineNo">5734</span><a name="line.5734"></a>
-<span class="sourceLineNo">5735</span>    final ServerName serverName = ServerName.valueOf("testCloseRegionWrittenToWAL", 100, 42);<a name="line.5735"></a>
-<span class="sourceLineNo">5736</span>    final RegionServerServices rss = spy(TEST_UTIL.createMockRegionServerService(serverName));<a name="line.5736"></a>
-<span class="sourceLineNo">5737</span><a name="line.5737"></a>
-<span class="sourceLineNo">5738</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.5738"></a>
-<span class="sourceLineNo">5739</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.5739"></a>
-<span class="sourceLineNo">5740</span>    htd.addFamily(new HColumnDescriptor(fam2));<a name="line.5740"></a>
+<span class="sourceLineNo">5735</span>    });<a name="line.5735"></a>
+<span class="sourceLineNo">5736</span>    return wal;<a name="line.5736"></a>
+<span class="sourceLineNo">5737</span>  }<a name="line.5737"></a>
+<span class="sourceLineNo">5738</span><a name="line.5738"></a>
+<span class="sourceLineNo">5739</span>  @Test<a name="line.5739"></a>
+<span class="sourceLineNo">5740</span>  public void testCloseRegionWrittenToWAL() throws Exception {<a name="line.5740"></a>
 <span class="sourceLineNo">5741</span><a name="line.5741"></a>
-<span class="sourceLineNo">5742</span>    final HRegionInfo hri = new HRegionInfo(htd.getTableName(),<a name="line.5742"></a>
-<span class="sourceLineNo">5743</span>      HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY);<a name="line.5743"></a>
+<span class="sourceLineNo">5742</span>    Path rootDir = new Path(dir + name.getMethodName());<a name="line.5742"></a>
+<span class="sourceLineNo">5743</span>    FSUtils.setRootDir(TEST_UTIL.getConfiguration(), rootDir);<a name="line.5743"></a>
 <span class="sourceLineNo">5744</span><a name="line.5744"></a>
-<span class="sourceLineNo">5745</span>    ArgumentCaptor&lt;WALEdit&gt; editCaptor = ArgumentCaptor.forClass(WALEdit.class);<a name="line.5745"></a>
-<span class="sourceLineNo">5746</span><a name="line.5746"></a>
-<span class="sourceLineNo">5747</span>    // capture append() calls<a name="line.5747"></a>
-<span class="sourceLineNo">5748</span>    WAL wal = mockWAL();<a name="line.5748"></a>
-<span class="sourceLineNo">5749</span>    when(rss.getWAL((HRegionInfo) any())).thenReturn(wal);<a name="line.5749"></a>
-<span class="sourceLineNo">5750</span><a name="line.5750"></a>
+<span class="sourceLineNo">5745</span>    final ServerName serverName = ServerName.valueOf("testCloseRegionWrittenToWAL", 100, 42);<a name="line.5745"></a>
+<span class="sourceLineNo">5746</span>    final RegionServerServices rss = spy(TEST_UTIL.createMockRegionServerService(serverName));<a name="line.5746"></a>
+<span class="sourceLineNo">5747</span><a name="line.5747"></a>
+<span class="sourceLineNo">5748</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.5748"></a>
+<span class="sourceLineNo">5749</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.5749"></a>
+<span class="sourceLineNo">5750</span>    htd.addFamily(new HColumnDescriptor(fam2));<a name="line.5750"></a>
 <span class="sourceLineNo">5751</span><a name="line.5751"></a>
-<span class="sourceLineNo">5752</span>    // create and then open a region first so that it can be closed later<a name="line.5752"></a>
-<span class="sourceLineNo">5753</span>    region = HRegion.createHRegion(hri, rootDir, TEST_UTIL.getConfiguration(), htd, rss.getWAL(hri));<a name="line.5753"></a>
-<span class="sourceLineNo">5754</span>    region = HRegion.openHRegion(hri, htd, rss.getWAL(hri),<a name="line.5754"></a>
-<span class="sourceLineNo">5755</span>      TEST_UTIL.getConfiguration(), rss, null);<a name="line.5755"></a>
+<span class="sourceLineNo">5752</span>    final HRegionInfo hri = new HRegionInfo(htd.getTableName(),<a name="line.5752"></a>
+<span class="sourceLineNo">5753</span>      HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY);<a name="line.5753"></a>
+<span class="sourceLineNo">5754</span><a name="line.5754"></a>
+<span class="sourceLineNo">5755</span>    ArgumentCaptor&lt;WALEdit&gt; editCaptor = ArgumentCaptor.forClass(WALEdit.class);<a name="line.5755"></a>
 <span class="sourceLineNo">5756</span><a name="line.5756"></a>
-<span class="sourceLineNo">5757</span>    // close the region<a name="line.5757"></a>
-<span class="sourceLineNo">5758</span>    region.close(false);<a name="line.5758"></a>
-<span class="sourceLineNo">5759</span><a name="line.5759"></a>
-<span class="sourceLineNo">5760</span>    // 2 times, one for region open, the other close region<a name="line.5760"></a>
-<span class="sourceLineNo">5761</span>    verify(wal, times(2)).append((HRegionInfo)any(), (WALKeyImpl)any(),<a name="line.5761"></a>
-<span class="sourceLineNo">5762</span>      editCaptor.capture(), anyBoolean());<a name="line.5762"></a>
-<span class="sourceLineNo">5763</span><a name="line.5763"></a>
-<span class="sourceLineNo">5764</span>    WALEdit edit = editCaptor.getAllValues().get(1);<a name="line.5764"></a>
-<span class="sourceLineNo">5765</span>    assertNotNull(edit);<a name="line.5765"></a>
-<span class="sourceLineNo">5766</span>    assertNotNull(edit.getCells());<a name="line.5766"></a>
-<span class="sourceLineNo">5767</span>    assertEquals(1, edit.getCells().size());<a name="line.5767"></a>
-<span class="sourceLineNo">5768</span>    RegionEventDescriptor desc = WALEdit.getRegionEventDescriptor(edit.getCells().get(0));<a name="line.5768"></a>
-<span class="sourceLineNo">5769</span>    assertNotNull(desc);<a name="line.5769"></a>
-<span class="sourceLineNo">5770</span><a name="line.5770"></a>
-<span class="sourceLineNo">5771</span>    LOG.info("RegionEventDescriptor from WAL: " + desc);<a name="line.5771"></a>
-<span class="sourceLineNo">5772</span><a name="line.5772"></a>
-<span class="sourceLineNo">5773</span>    assertEquals(RegionEventDescriptor.EventType.REGION_CLOSE, desc.getEventType());<a name="line.5773"></a>
-<span class="sourceLineNo">5774</span>    assertTrue(Bytes.equals(desc.getTableName().toByteArray(), htd.getTableName().toBytes()));<a name="line.5774"></a>
-<span class="sourceLineNo">5775</span>    assertTrue(Bytes.equals(desc.getEncodedRegionName().toByteArray(),<a name="line.5775"></a>
-<span class="sourceLineNo">5776</span>      hri.getEncodedNameAsBytes()));<a name="line.5776"></a>
-<span class="sourceLineNo">5777</span>    assertTrue(desc.getLogSequenceNumber() &gt; 0);<a name="line.5777"></a>
-<span class="sourceLineNo">5778</span>    assertEquals(serverName, ProtobufUtil.toServerName(desc.getServer()));<a name="line.5778"></a>
-<span class="sourceLineNo">5779</span>    assertEquals(2, desc.getStoresCount());<a name="line.5779"></a>
+<span class="sourceLineNo">5757</span>    // capture append() calls<a name="line.5757"></a>
+<span class="sourceLineNo">5758</span>    WAL wal = mockWAL();<a name="line.5758"></a>
+<span class="sourceLineNo">5759</span>    when(rss.getWAL((HRegionInfo) any())).thenReturn(wal);<a name="line.5759"></a>
+<span class="sourceLineNo">5760</span><a name="line.5760"></a>
+<span class="sourceLineNo">5761</span><a name="line.5761"></a>
+<span class="sourceLineNo">5762</span>    // create and then open a region first so that it can be closed later<a name="line.5762"></a>
+<span class="sourceLineNo">5763</span>    region = HRegion.createHRegion(hri, rootDir, TEST_UTIL.getConfiguration(), htd, rss.getWAL(hri));<a name="line.5763"></a>
+<span class="sourceLineNo">5764</span>    region = HRegion.openHRegion(hri, htd, rss.getWAL(hri),<a name="line.5764"></a>
+<span class="sourceLineNo">5765</span>      TEST_UTIL.getConfiguration(), rss, null);<a name="line.5765"></a>
+<span class="sourceLineNo">5766</span><a name="line.5766"></a>
+<span class="sourceLineNo">5767</span>    // close the region<a name="line.5767"></a>
+<span class="sourceLineNo">5768</span>    region.close(false);<a name="line.5768"></a>
+<span class="sourceLineNo">5769</span><a name="line.5769"></a>
+<span class="sourceLineNo">5770</span>    // 2 times, one for region open, the other close region<a name="line.5770"></a>
+<span class="sourceLineNo">5771</span>    verify(wal, times(2)).append((HRegionInfo)any(), (WALKeyImpl)any(),<a name="line.5771"></a>
+<span class="sourceLineNo">5772</span>      editCaptor.capture(), anyBoolean());<a name="line.5772"></a>
+<span class="sourceLineNo">5773</span><a name="line.5773"></a>
+<span class="sourceLineNo">5774</span>    WALEdit edit = editCaptor.getAllValues().get(1);<a name="line.5774"></a>
+<span class="sourceLineNo">5775</span>    assertNotNull(edit);<a name="line.5775"></a>
+<span class="sourceLineNo">5776</span>    assertNotNull(edit.getCells());<a name="line.5776"></a>
+<span class="sourceLineNo">5777</span>    assertEquals(1, edit.getCells().size());<a name="line.5777"></a>
+<span class="sourceLineNo">5778</span>    RegionEventDescriptor desc = WALEdit.getRegionEventDescriptor(edit.getCells().get(0));<a name="line.5778"></a>
+<span class="sourceLineNo">5779</span>    assertNotNull(desc);<a name="line.5779"></a>
 <span class="sourceLineNo">5780</span><a name="line.5780"></a>
-<span class="sourceLineNo">5781</span>    StoreDescriptor store = desc.getStores(0);<a name="line.5781"></a>
-<span class="sourceLineNo">5782</span>    assertTrue(Bytes.equals(store.getFamilyName().toByteArray(), fam1));<a name="line.5782"></a>
-<span class="sourceLineNo">5783</span>    assertEquals(store.getStoreHomeDir(), Bytes.toString(fam1));<a name="line.5783"></a>
-<span class="sourceLineNo">5784</span>    assertEquals(0, store.getStoreFileCount()); // no store files<a name="line.5784"></a>
-<span class="sourceLineNo">5785</span><a name="line.5785"></a>
-<span class="sourceLineNo">5786</span>    store = desc.getStores(1);<a name="line.5786"></a>
-<span class="sourceLineNo">5787</span>    assertTrue(Bytes.equals(store.getFamilyName().toByteArray(), fam2));<a name="line.5787"></a>
-<span class="sourceLineNo">5788</span>    assertEquals(store.getStoreHomeDir(), Bytes.toString(fam2));<a name="line.5788"></a>
-<span class="sourceLineNo">5789</span>    assertEquals(0, store.getStoreFileCount()); // no store files<a name="line.5789"></a>
-<span class="sourceLineNo">5790</span>  }<a name="line.5790"></a>
-<span class="sourceLineNo">5791</span><a name="line.5791"></a>
-<span class="sourceLineNo">5792</span>  /**<a name="line.5792"></a>
-<span class="sourceLineNo">5793</span>   * Test RegionTooBusyException thrown when region is busy<a name="line.5793"></a>
-<span class="sourceLineNo">5794</span>   */<a name="line.5794"></a>
-<span class="sourceLineNo">5795</span>  @Test<a name="line.5795"></a>
-<span class="sourceLineNo">5796</span>  public void testRegionTooBusy() throws IOException {<a name="line.5796"></a>
-<span class="sourceLineNo">5797</span>    byte[] family = Bytes.toBytes("family");<a name="line.5797"></a>
-<span class="sourceLineNo">5798</span>    long defaultBusyWaitDuration = CONF.getLong("hbase.busy.wait.duration",<a name="line.5798"></a>
-<span class="sourceLineNo">5799</span>      HRegion.DEFAULT_BUSY_WAIT_DURATION);<a name="line.5799"></a>
-<span class="sourceLineNo">5800</span>    CONF.setLong("hbase.busy.wait.duration", 1000);<a name="line.5800"></a>
-<span class="sourceLineNo">5801</span>    region = initHRegion(tableName, method, CONF, family);<a name="line.5801"></a>
-<span class="sourceLineNo">5802</span>    final AtomicBoolean stopped = new AtomicBoolean(true);<a name="line.5802"></a>
-<span class="sourceLineNo">5803</span>    Thread t = new Thread(new Runnable() {<a name="line.5803"></a>
-<span class="sourceLineNo">5804</span>      @Override<a name="line.5804"></a>
-<span class="sourceLineNo">5805</span>      public void run() {<a name="line.5805"></a>
-<span class="sourceLineNo">5806</span>        try {<a name="line.5806"></a>
-<span class="sourceLineNo">5807</span>          region.lock.writeLock().lock();<a name="line.5807"></a>
-<span class="sourceLineNo">5808</span>          stopped.set(false);<a name="line.5808"></a>
-<span class="sourceLineNo">5809</span>          while (!stopped.get()) {<a name="line.5809"></a>
-<span class="sourceLineNo">5810</span>            Thread.sleep(100);<a name="line.5810"></a>
-<span class="sourceLineNo">5811</span>          }<a name="line.5811"></a>
-<span class="sourceLineNo">5812</span>        } catch (InterruptedException ie) {<a name="line.5812"></a>
-<span class="sourceLineNo">5813</span>        } finally {<a name="line.5813"></a>
-<span class="sourceLineNo">5814</span>          region.lock.writeLock().unlock();<a name="line.5814"></a>
-<span class="sourceLineNo">5815</span>        }<a name="line.5815"></a>
-<span class="sourceLineNo">5816</span>      }<a name="line.5816"></a>
-<span class="sourceLineNo">5817</span>    });<a name="line.5817"></a>
-<span class="sourceLineNo">5818</span>    t.start();<a name="line.5818"></a>
-<span class="sourceLineNo">5819</span>    Get get = new Get(row);<a name="line.5819"></a>
-<span class="sourceLineNo">5820</span>    try {<a name="line.5820"></a>
-<span class="sourceLineNo">5821</span>      while (stopped.get()) {<a name="line.5821"></a>
-<span class="sourceLineNo">5822</span>        Thread.sleep(100);<a name="line.5822"></a>
-<span class="sourceLineNo">5823</span>      }<a name="line.5823"></a>
-<span class="sourceLineNo">5824</span>      region.get(get);<a name="line.5824"></a>
-<span class="sourceLineNo">5825</span>      fail("Should throw RegionTooBusyException");<a name="line.5825"></a>
-<span class="sourceLineNo">5826</span>    } catch (InterruptedException ie) {<a name="line.5826"></a>
-<span class="sourceLineNo">5827</span>      fail("test interrupted");<a name="line.5827"></a>
-<span class="sourceLineNo">5828</span>    } catch (RegionTooBusyException e) {<a name="line.5828"></a>
-<span class="sourceLineNo">5829</span>      // Good, expected<a name="line.5829"></a>
-<span class="sourceLineNo">5830</span>    } finally {<a name="line.5830"></a>
-<span class="sourceLineNo">5831</span>      stopped.set(true);<a name="line.5831"></a>
-<span class="sourceLineNo">5832</span>      try {<a name="line.5832"></a>
-<span class="sourceLineNo">5833</span>        t.join();<a name="line.5833"></a>
-<span class="sourceLineNo">5834</span>      } catch (Throwable e) {<a name="line.5834"></a>
-<span class="sourceLineNo">5835</span>      }<a name="line.5835"></a>
-<span class="sourceLineNo">5836</span><a name="line.5836"></a>
-<span class="sourceLineNo">5837</span>      HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.5837"></a>
-<span class="sourceLineNo">5838</span>      region = null;<a name="line.5838"></a>
-<span class="sourceLineNo">5839</span>      CONF.setLong("hbase.busy.wait.duration", defaultBusyWaitDuration);<a name="line.5839"></a>
-<span class="sourceLineNo">5840</span>    }<a name="line.5840"></a>
-<span class="sourceLineNo">5841</span>  }<a name="line.5841"></a>
-<span class="sourceLineNo">5842</span><a name="line.5842"></a>
-<span class="sourceLineNo">5843</span>  @Test<a name="line.5843"></a>
-<span class="sourceLineNo">5844</span>  public void testCellTTLs() throws IOException {<a name="line.5844"></a>
-<span class="sourceLineNo">5845</span>    IncrementingEnvironmentEdge edge = new IncrementingEnvironmentEdge();<a name="line.5845"></a>
-<span class="sourceLineNo">5846</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.5846"></a>
-<span class="sourceLineNo">5847</span><a name="line.5847"></a>
-<span class="sourceLineNo">5848</span>    final byte[] row = Bytes.toBytes("testRow");<a name="line.5848"></a>
-<span class="sourceLineNo">5849</span>    final byte[] q1 = Bytes.toBytes("q1");<a name="line.5849"></a>
-<span class="sourceLineNo">5850</span>    final byte[] q2 = Bytes.toBytes("q2");<a name="line.5850"></a>
-<span class="sourceLineNo">5851</span>    final byte[] q3 = Bytes.toBytes("q3");<a name="line.5851"></a>
-<span class="sourceLineNo">5852</span>    final byte[] q4 = Bytes.toBytes("q4");<a name="line.5852"></a>
-<span class="sourceLineNo">5853</span><a name="line.5853"></a>
-<span class="sourceLineNo">5854</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.5854"></a>
-<span class="sourceLineNo">5855</span>    HColumnDescriptor hcd = new HColumnDescriptor(fam1);<a name="line.5855"></a>
-<span class="sourceLineNo">5856</span>    hcd.setTimeToLive(10); // 10 seconds<a name="line.5856"></a>
-<span class="sourceLineNo">5857</span>    htd.addFamily(hcd);<a name="line.5857"></a>
-<span class="sourceLineNo">5858</span><a name="line.5858"></a>
-<span class="sourceLineNo">5859</span>    Configuration conf = new Configuration(TEST_UTIL.getConfiguration());<a name="line.5859"></a>
-<span class="sourceLineNo">5860</span>    conf.setInt(HFile.FORMAT_VERSION_KEY, HFile.MIN_FORMAT_VERSION_WITH_TAGS);<a name="line.5860"></a>
-<span class="sourceLineNo">5861</span><a name="line.5861"></a>
-<span class="sourceLineNo">5862</span>    region = HBaseTestingUtility.createRegionAndWAL(new HRegionInfo(htd.getTableName(),<a name="line.5862"></a>
-<span class="sourceLineNo">5863</span>            HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY),<a name="line.5863"></a>
-<span class="sourceLineNo">5864</span>        TEST_UTIL.getDataTestDir(), conf, htd);<a name="line.5864"></a>
-<span class="sourceLineNo">5865</span>    assertNotNull(region);<a name="line.5865"></a>
-<span class="sourceLineNo">5866</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.5866"></a>
-<span class="sourceLineNo">5867</span>    // Add a cell that will expire in 5 seconds via cell TTL<a name="line.5867"></a>
-<span class="sourceLineNo">5868</span>    region.put(new Put(row).add(new KeyValue(row, fam1, q1, now,<a name="line.5868"></a>
-<span class="sourceLineNo">5869</span>      HConstants.EMPTY_BYTE_ARRAY, new ArrayBackedTag[] {<a name="line.5869"></a>
-<span class="sourceLineNo">5870</span>        // TTL tags specify ts in milliseconds<a name="line.5870"></a>
-<span class="sourceLineNo">5871</span>        new ArrayBackedTag(TagType.TTL_TAG_TYPE, Bytes.toBytes(5000L)) })));<a name="line.5871"></a>
-<span class="sourceLineNo">5872</span>    // Add a cell that will expire after 10 seconds via family setting<a name="line.5872"></a>
-<span class="sourceLineNo">5873</span>    region.put(new Put(row).addColumn(fam1, q2, now, HConstants.EMPTY_BYTE_ARRAY));<a name="line.5873"></a>
-<span class="sourceLineNo">5874</span>    // Add a cell that will expire in 15 seconds via cell TTL<a name="line.5874"></a>
-<span class="sourceLineNo">5875</span>    region.put(new Put(row).add(new KeyValue(row, fam1, q3, now + 10000 - 1,<a name="line.5875"></a>
-<span class="sourceLineNo">5876</span>      HConstants.EMPTY_BYTE_ARRAY, new ArrayBackedTag[] {<a name="line.5876"></a>
-<span class="sourceLineNo">5877</span>        // TTL tags specify ts in milliseconds<a name="line.5877"></a>
-<span class="sourceLineNo">5878</span>        new ArrayBackedTag(TagType.TTL_TAG_TYPE, Bytes.toBytes(5000L)) })));<a name="line.5878"></a>
-<span class="sourceLineNo">5879</span>    // Add a cell that will expire in 20 seconds via family setting<a name="line.5879"></a>
-<span class="sourceLineNo">5880</span>    region.put(new Put(row).addColumn(fam1, q4, now + 10000 - 1, HConstants.EMPTY_BYTE_ARRAY));<a name="line.5880"></a>
-<span class="sourceLineNo">5881</span><a name="line.5881"></a>
-<span class="sourceLineNo">5882</span>    // Flush so we are sure store scanning gets this right<a name="line.5882"></a>
-<span class="sourceLineNo">5883</span>    region.flush(true);<a name="line.5883"></a>
-<span class="sourceLineNo">5884</span><a name="line.5884"></a>
-<span class="sourceLineNo">5885</span>    // A query at time T+0 should return all cells<a name="line.5885"></a>
-<span class="sourceLineNo">5886</span>    Result r = region.get(new Get(row));<a name="line.5886"></a>
-<span class="sourceLineNo">5887</span>    assertNotNull(r.getValue(fam1, q1));<a name="line.5887"></a>
-<span class="sourceLineNo">5888</span>    assertNotNull(r.getValue(fam1, q2));<a name="line.5888"></a>
-<span class="sourceLineNo">5889</span>    assertNotNull(r.getValue(fam1, q3));<a name="line.5889"></a>
-<span class="sourceLineNo">5890</span>    assertNotNull(r.getValue(fam1, q4));<a name="line.5890"></a>
+<span class="sourceLineNo">5781</span>    LOG.info("RegionEventDescriptor from WAL: " + desc);<a name="line.5781"></a>
+<span class="sourceLineNo">5782</span><a name="line.5782"></a>
+<span class="sourceLineNo">5783</span>    assertEquals(RegionEventDescriptor.EventType.REGION_CLOSE, desc.getEventType());<a name="line.5783"></a>
+<span class="sourceLineNo">5784</span>    assertTrue(Bytes.equals(desc.getTableName().toByteArray(), htd.getTableName().toBytes()));<a name="line.5784"></a>
+<span class="sourceLineNo">5785</span>    assertTrue(Bytes.equals(desc.getEncodedRegionName().toByteArray(),<a name="line.5785"></a>
+<span class="sourceLineNo">5786</span>      hri.getEncodedNameAsBytes()));<a name="line.5786"></a>
+<span class="sourceLineNo">5787</span>    assertTrue(desc.getLogSequenceNumber() &gt; 0);<a name="line.5787"></a>
+<span class="sourceLineNo">5788</span>    assertEquals(serverName, ProtobufUtil.toServerName(desc.getServer()));<a name="line.5788"></a>
+<span class="sourceLineNo">5789</span>    assertEquals(2, desc.getStoresCount());<a name="line.5789"></a>
+<span class="sourceLineNo">5790</span><a name="line.5790"></a>
+<span class="sourceLineNo">5791</span>    StoreDescriptor store = desc.getStores(0);<a name="line.5791"></a>
+<span class="sourceLineNo">5792</span>    assertTrue(Bytes.equals(store.getFamilyName().toByteArray(), fam1));<a name="line.5792"></a>
+<span class="sourceLineNo">5793</span>    assertEquals(store.getStoreHomeDir(), Bytes.toString(fam1));<a name="line.5793"></a>
+<span class="sourceLineNo">5794</span>    assertEquals(0, store.getStoreFileCount()); // no store files<a name="line.5794"></a>
+<span class="sourceLineNo">5795</span><a name="line.5795"></a>
+<span class="sourceLineNo">5796</span>    store = desc.getStores(1);<a name="line.5796"></a>
+<span class="sourceLineNo">5797</span>    assertTrue(Bytes.equals(store.getFamilyName().toByteArray(), fam2));<a name="line.5797"></a>
+<span class="sourceLineNo">5798</span>    assertEquals(store.getStoreHomeDir(), Bytes.toString(fam2));<a name="line.5798"></a>
+<span class="sourceLineNo">5799</span>    assertEquals(0, store.getStoreFileCount()); // no store files<a name="line.5799"></a>
+<span class="sourceLineNo">5800</span>  }<a name="line.5800"></a>
+<span class="sourceLineNo">5801</span><a name="line.5801"></a>
+<span class="sourceLineNo">5802</span>  /**<a name="line.5802"></a>
+<span class="sourceLineNo">5803</span>   * Test RegionTooBusyException thrown when region is busy<a name="line.5803"></a>
+<span class="sourceLineNo">5804</span>   */<a name="line.5804"></a>
+<span class="sourceLineNo">5805</span>  @Test<a name="line.5805"></a>
+<span class="sourceLineNo">5806</span>  public void testRegionTooBusy() throws IOException {<a name="line.5806"></a>
+<span class="sourceLineNo">5807</span>    byte[] family = Bytes.toBytes("family");<a name="line.5807"></a>
+<span class="sourceLineNo">5808</span>    long defaultBusyWaitDuration = CONF.getLong("hbase.busy.wait.duration",<a name="line.5808"></a>
+<span class="sourceLineNo">5809</span>      HRegion.DEFAULT_BUSY_WAIT_DURATION);<a name="line.5809"></a>
+<span class="sourceLineNo">5810</span>    CONF.setLong("hbase.busy.wait.duration", 1000);<a name="line.5810"></a>
+<span class="sourceLineNo">5811</span>    region = initHRegion(tableName, method, CONF, family);<a name="line.5811"></a>
+<span class="sourceLineNo">5812</span>    final AtomicBoolean stopped = new AtomicBoolean(true);<a name="line.5812"></a>
+<span class="sourceLineNo">5813</span>    Thread t = new Thread(new Runnable() {<a name="line.5813"></a>
+<span class="sourceLineNo">5814</span>      @Override<a name="line.5814"></a>
+<span class="sourceLineNo">5815</span>      public void run() {<a name="line.5815"></a>
+<span class="sourceLineNo">5816</span>        try {<a name="line.5816"></a>
+<span class="sourceLineNo">5817</span>          region.lock.writeLock().lock();<a name="line.5817"></a>
+<span class="sourceLineNo">5818</span>          stopped.set(false);<a name="line.5818"></a>
+<span class="sourceLineNo">5819</span>          while (!stopped.get()) {<a name="line.5819"></a>
+<span class="sourceLineNo">5820</span>            Thread.sleep(100);<a name="line.5820"></a>
+<span class="sourceLineNo">5821</span>          }<a name="line.5821"></a>
+<span class="sourceLineNo">5822</span>        } catch (InterruptedException ie) {<a name="line.5822"></a>
+<span class="sourceLineNo">5823</span>        } finally {<a name="line.5823"></a>
+<span class="sourceLineNo">5824</span>          region.lock.writeLock().unlock();<a name="line.5824"></a>
+<span class="sourceLineNo">5825</span>        }<a name="line.5825"></a>
+<span class="sourceLineNo">5826</span>      }<a name="line.5826"></a>
+<span class="sourceLineNo">5827</span>    });<a name="line.5827"></a>
+<span class="sourceLineNo">5828</span>    t.start();<a name="line.5828"></a>
+<span class="sourceLineNo">5829</span>    Get get = new Get(row);<a name="line.5829"></a>
+<span class="sourceLineNo">5830</span>    try {<a name="line.5830"></a>
+<span class="sourceLineNo">5831</span>      while (stopped.get()) {<a name="line.5831"></a>
+<span class="sourceLineNo">5832</span>        Thread.sleep(100);<a name="line.5832"></a>
+<span class="sourceLineNo">5833</span>      }<a name="line.5833"></a>
+<span class="sourceLineNo">5834</span>      region.get(get);<a name="line.5834"></a>
+<span class="sourceLineNo">5835</span>      fail("Should throw RegionTooBusyException");<a name="line.5835"></a>
+<span class="sourceLineNo">5836</span>    } catch (InterruptedException ie) {<a name="line.5836"></a>
+<span class="sourceLineNo">5837</span>      fail("test interrupted");<a name="line.5837"></a>
+<span class="sourceLineNo">5838</span>    } catch (RegionTooBusyException e) {<a name="line.5838"></a>
+<span class="sourceLineNo">5839</span>      // Good, expected<a name="line.5839"></a>
+<span class="sourceLineNo">5840</span>    } finally {<a name="line.5840"></a>
+<span class="sourceLineNo">5841</span>      stopped.set(true);<a name="line.5841"></a>
+<span class="sourceLineNo">5842</span>      try {<a name="line.5842"></a>
+<span class="sourceLineNo">5843</span>        t.join();<a name="line.5843"></a>
+<span class="sourceLineNo">5844</span>      } catch (Throwable e) {<a name="line.5844"></a>
+<span class="sourceLineNo">5845</span>      }<a name="line.5845"></a>
+<span class="sourceLineNo">5846</span><a name="line.5846"></a>
+<span class="sourceLineNo">5847</span>      HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.5847"></a>
+<span class="sourceLineNo">5848</span>      region = null;<a name="line.5848"></a>
+<span class="sourceLineNo">5849</span>      CONF.setLong("hbase.busy.wait.duration", defaultBusyWaitDuration);<a name="line.5849"></a>
+<span class="sourceLineNo">5850</span>    }<a name="line.5850"></a>
+<span class="sourceLineNo">5851</span>  }<a name="line.5851"></a>
+<span class="sourceLineNo">5852</span><a name="line.5852"></a>
+<span class="sourceLineNo">5853</span>  @Test<a name="line.5853"></a>
+<span class="sourceLineNo">5854</span>  public void testCellTTLs() throws IOException {<a name="line.5854"></a>
+<span class="sourceLineNo">5855</span>    IncrementingEnvironmentEdge edge = new IncrementingEnvironmentEdge();<a name="line.5855"></a>
+<span class="sourceLineNo">5856</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.5856"></a>
+<span class="sourceLineNo">5857</span><a name="line.5857"></a>
+<span class="sourceLineNo">5858</span>    final byte[] row = Bytes.toBytes("testRow");<a name="line.5858"></a>
+<span class="sourceLineNo">5859</span>    final byte[] q1 = Bytes.toBytes("q1");<a name="line.5859"></a>
+<span class="sourceLineNo">5860</span>    final byte[] q2 = Bytes.toBytes("q2");<a name="line.5860"></a>
+<span class="sourceLineNo">5861</span>    final byte[] q3 = Bytes.toBytes("q3");<a name="line.5861"></a>
+<span class="sourceLineNo">5862</span>    final byte[] q4 = Bytes.toBytes("q4");<a name="line.5862"></a>
+<span class="sourceLineNo">5863</span><a name="line.5863"></a>
+<span class="sourceLineNo">5864</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.5864"></a>
+<span class="sourceLineNo">5865</span>    HColumnDescriptor hcd = new HColumnDescriptor(fam1);<a name="line.5865"></a>
+<span class="sourceLineNo">5866</span>    hcd.setTimeToLive(10); // 10 seconds<a name="line.5866"></a>
+<span class="sourceLineNo">5867</span>    htd.addFamily(hcd);<a name="line.5867"></a>
+<span class="sourceLineNo">5868</span><a name="line.5868"></a>
+<span class="sourceLineNo">5869</span>    Configuration conf = new Configuration(TEST_UTIL.getConfiguration());<a name="line.5869"></a>
+<span class="sourceLineNo">5870</span>    conf.setInt(HFile.FORMAT_VERSION_KEY, HFile.MIN_FORMAT_VERSION_WITH_TAGS);<a name="line.5870"></a>
+<span class="sourceLineNo">5871</span><a name="line.5871"></a>
+<span class="sourceLineNo">5872</span>    region = HBaseTestingUtility.createRegionAndWAL(new HRegionInfo(htd.getTableName(),<a name="line.5872"></a>
+<span class="sourceLineNo">5873</span>            HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY),<a name="line.5873"></a>
+<span class="sourceLineNo">5874</span>        TEST_UTIL.getDataTestDir(), conf, htd);<a name="line.5874"></a>
+<span class="sourceLineNo">5875</span>    assertNotNull(region);<a name="line.5875"></a>
+<span class="sourceLineNo">5876</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.5876"></a>
+<span class="sourceLineNo">5877</span>    // Add a cell that will expire in 5 seconds via cell TTL<a name="line.5877"></a>
+<span class="sourceLineNo">5878</span>    region.put(new Put(row).add(new KeyValue(row, fam1, q1, now,<a name="line.5878"></a>
+<span class="sourceLineNo">5879</span>      HConstants.EMPTY_BYTE_ARRAY, new ArrayBackedTag[] {<a name="line.5879"></a>
+<span class="sourceLineNo">5880</span>        // TTL tags specify ts in milliseconds<a name="line.5880"></a>
+<span class="sourceLineNo">5881</span>        new ArrayBackedTag(TagType.TTL_TAG_TYPE, Bytes.toBytes(5000L)) })));<a name="line.5881"></a>
+<span class="sourceLineNo">5882</span>    // Add a cell that will expire after 10 seconds via family setting<a name="line.5882"></a>
+<span class="sourceLineNo">5883</span>    region.put(new Put(row).addColumn(fam1, q2, now, HConstants.EMPTY_BYTE_ARRAY));<a name="line.5883"></a>
+<span class="sourceLineNo">5884</span>    // Add a cell that will expire in 15 seconds via cell TTL<a name="line.5884"></a>
+<span class="sourceLineNo">5885</span>    region.put(new Put(row).add(new KeyValue(row, fam1, q3, now + 10000 - 1,<a name="line.5885"></a>
+<span class="sourceLineNo">5886</span>      HConstants.EMPTY_BYTE_ARRAY, new ArrayBackedTag[] {<a name="line.5886"></a>
+<span class="sourceLineNo">5887</span>        // TTL tags specify ts in milliseconds<a name="line.5887"></a>
+<span class="sourceLineNo">5888</span>        new ArrayBackedTag(TagType.TTL_TAG_TYPE, Bytes.toBytes(5000L)) })));<a name="line.5888"></a>
+<span class="sourceLineNo">5889</span>    // Add a cell that will expire in 20 seconds via family setting<a name="line.5889"></a>
+<span class="sourceLineNo">5890</span>    region.put(new Put(row).addColumn(fam1, q4, now + 10000 - 1, HConstants.EMPTY_BYTE_ARRAY));<a name="line.5890"></a>
 <span class="sourceLineNo">5891</span><a name="line.5891"></a>
-<span class="sourceLineNo">5892</span>    // Increment time to T+5 seconds<a name="line.5892"></a>
-<span class="sourceLineNo">5893</span>    edge.incrementTime(5000);<a name="line.5893"></a>
+<span class="sourceLineNo">5892</span>    // Flush so we are sure store scanning gets this right<a name="line.5892"></a>
+<span class="sourceLineNo">5893</span>    region.flush(true);<a name="line.5893"></a>
 <span class="sourceLineNo">5894</span><a name="line.5894"></a>
-<span class="sourceLineNo">5895</span>    r = region.get(new Get(row));<a name="line.5895"></a>
-<span class="sourceLineNo">5896</span>    assertNull(r.getValue(fam1, q1));<a name="line.5896"></a>
-<span class="sourceLineNo">5897</span>    assertNotNull(r.getValue(fam1, q2));<a name="line.5897"></a>
-<span class="sourceLineNo">5898</span>    assertNotNull(r.getValue(fam1, q3));<a name="line.5898"></a>
-<span class="sourceLineNo">5899</span>    assertNotNull(r.getValue(fam1, q4));<a name="line.5899"></a>
-<span class="sourceLineNo">5900</span><a name="line.5900"></a>
-<span class="sourceLineNo">5901</span>    // Increment time to T+10 seconds<a name="line.5901"></a>
-<span class="sourceLineNo">5902</span>    edge.incrementTime(5000);<a name="line.5902"></a>
-<span class="sourceLineNo">5903</span><a name="line.5903"></a>
-<span class="sourceLineNo">5904</span>    r = region.get(new Get(row));<a name="line.5904"></a>
-<span class="sourceLineNo">5905</span>    assertNull(r.getValue(fam1, q1));<a name="line.5905"></a>
-<span class="sourceLineNo">5906</span>    assertNull(r.getValue(fam1, q2));<a name="line.5906"></a>
-<span class="sourceLineNo">5907</span>    assertNotNull(r.getValue(fam1, q3));<a name="line.5907"></a>
-<span class="sourceLineNo">5908</span>    assertNotNull(r.getValue(fam1, q4));<a name="line.5908"></a>
-<span class="sourceLineNo">5909</span><a name="line.5909"></a>
-<span class="sourceLineNo">5910</span>    // Increment time to T+15 seconds<a name="line.5910"></a>
-<span class="sourceLineNo">5911</span>    edge.incrementTime(5000);<a name="line.5911"></a>
-<span class="sourceLineNo">5912</span><a name="line.5912"></a>
-<span class="sourceLineNo">5913</span>    r = region.get(new Get(row));<a name="line.5913"></a>
-<span class="sourceLineNo">5914</span>    assertNull(r.getValue(fam1, q1));<a name="line.5914"></a>
-<span class="sourceLineNo">5915</span>    assertNull(r.getValue(fam1, q2));<a name="line.5915"></a>
-<span class="sourceLineNo">5916</span>    assertNull(r.getValue(fam1, q3));<a name="line.5916"></a>
-<span class="sourceLineNo">5917</span>    assertNotNull(r.getValue(fam1, q4));<a name="line.5917"></a>
-<span class="sourceLineNo">5918</span><a name="line.5918"></a>
-<span class="sourceLineNo">5919</span>    // Increment time to T+20 seconds<a name="line.5919"></a>
-<span class="sourceLineNo">5920</span>    edge.incrementTime(10000);<a name="line.5920"></a>
-<span class="sourceLineNo">5921</span><a name="line.5921"></a>
-<span class="sourceLineNo">5922</span>    r = region.get(new Get(row));<a name="line.5922"></a>
-<span class="sourceLineNo">5923</span>    assertNull(r.getValue(fam1, q1));<a name="line.5923"></a>
-<span class="sourceLineNo">5924</span>    assertNull(r.getValue(fam1, q2));<a name="line.5924"></a>
-<span class="sourceLineNo">5925</span>    assertNull(r.getValue(fam1, q3));<a name="line.5925"></a>
-<span class="sourceLineNo">5926</span>    assertNull(r.getValue(fam1, q4));<a name="line.5926"></a>
-<span class="sourceLineNo">5927</span><a name="line.5927"></a>
-<span class="sourceLineNo">5928</span>    // Fun with disappearing increments<a name="line.5928"></a>
-<span class="sourceLineNo">5929</span><a name="line.5929"></a>
-<span class="sourceLineNo">5930</span>    // Start at 1<a name="line.5930"></a>
-<span class="sourceLineNo">5931</span>    region.put(new Put(row).addColumn(fam1, q1, Bytes.toBytes(1L)));<a name="line.5931"></a>
+<span class="sourceLineNo">5895</span>    // A query at time T+0 should return all cells<a name="line.5895"></a>
+<span class="sourceLineNo">5896</span>    Result r = region.get(new Get(row));<a name="line.5896"></a>
+<span class="sourceLineNo">5897</span>    assertNotNull(r.getValue(fam1, q1));<a name="line.5897"></a>
+<span class="sourceLineNo">5898</span>    assertNotNull(r.getValue(fam1, q2));<a name="line.5898"></a>
+<span class="sourceLineNo">5899</span>    assertNotNull(r.getValue(fam1, q3));<a name="line.5899"></a>
+<span class="sourceLineNo">5900</span>    assertNotNull(r.getValue(fam1, q4));<a name="line.5900"></a>
+<span class="sourceLineNo">5901</span><a name="line.5901"></a>
+<span class="sourceLineNo">5902</span>    // Increment time to T+5 seconds<a name="line.5902"></a>
+<span class="sourceLineNo">5903</span>    edge.incrementTime(5000);<a name="line.5903"></a>
+<span class="sourceLineNo">5904</span><a name="line.5904"></a>
+<span class="sourceLineNo">5905</span>    r = region.get(new Get(row));<a name="line.5905"></a>
+<span class="sourceLineNo">5906</span>    assertNull(r.getValue(fam1, q1));<a name="line.5906"></a>
+<span class="sourceLineNo">5907</span>    assertNotNull(r.getValue(fam1, q2));<a name="line.5907"></a>
+<span class="sourceLineNo">5908</span>    assertNotNull(r.getValue(fam1, q3));<a name="line.5908"></a>
+<span class="sourceLineNo">5909</span>    assertNotNull(r.getValue(fam1, q4));<a name="line.5909"></a>
+<span class="sourceLineNo">5910</span><a name="line.5910"></a>
+<span class="sourceLineNo">5911</span>    // Increment time to T+10 seconds<a name="line.5911"></a>
+<span class="sourceLineNo">5912</span>    edge.incrementTime(5000);<a name="line.5912"></a>
+<span class="sourceLineNo">5913</span><a name="line.5913"></a>
+<span class="sourceLineNo">5914</span>    r = region.get(new Get(row));<a name="line.5914"></a>
+<span class="sourceLineNo">5915</span>    assertNull(r.getValue(fam1, q1));<a name="line.5915"></a>
+<span class="sourceLineNo">5916</span>    assertNull(r.getValue(fam1, q2));<a name="line.5916"></a>
+<span class="sourceLineNo">5917</span>    assertNotNull(r.getValue(fam1, q3));<a name="line.5917"></a>
+<span class="sourceLineNo">5918</span>    assertNotNull(r.getValue(fam1, q4));<a name="line.5918"></a>
+<span class="sourceLineNo">5919</span><a name="line.5919"></a>
+<span class="sourceLineNo">5920</span>    // Increment time to T+15 seconds<a name="line.5920"></a>
+<span class="sourceLineNo">5921</span>    edge.incrementTime(5000);<a name="line.5921"></a>
+<span class="sourceLineNo">5922</span><a name="line.5922"></a>
+<span class="sourceLineNo">5923</span>    r = region.get(new Get(row));<a name="line.5923"></a>
+<span class="sourceLineNo">5924</span>    assertNull(r.getValue(fam1, q1));<a name="line.5924"></a>
+<span class="sourceLineNo">5925</span>    assertNull(r.getValue(fam1, q2));<a name="line.5925"></a>
+<span class="sourceLineNo">5926</span>    assertNull(r.getValue(fam1, q3));<a name="line.5926"></a>
+<span class="sourceLineNo">5927</span>    assertNotNull(r.getValue(fam1, q4));<a name="line.5927"></a>
+<span class="sourceLineNo">5928</span><a name="line.5928"></a>
+<span class="sourceLineNo">5929</span>    // Increment time to T+20 seconds<a name="line.5929"></a>
+<span class="sourceLineNo">5930</span>    edge.incrementTime(10000);<a name="line.5930"></a>
+<span class="sourceLineNo">5931</span><a name="line.5931"></a>
 <span class="sourceLineNo">5932</span>    r = region.get(new Get(row));<a name="line.5932"></a>
-<span class="sourceLineNo">5933</span>    byte[] val = r.getValue(fam1, q1);<a name="line.5933"></a>
-<span class="sourceLineNo">5934</span>    assertNotNull(val);<a name="line.5934"></a>
-<span class="sourceLineNo">5935</span>    assertEquals(1L, Bytes.toLong(val));<a name="line.5935"></a>
-<span class="sourceLineNo">5936</span><a name="line.5936"></a>
-<span class="sourceLineNo">5937</span>    // Increment with a TTL of 5 seconds<a name="line.5937"></a>
-<span class="sourceLineNo">5938</span>    Increment incr = new Increment(row).addColumn(fam1, q1, 1L);<a name="line.5938"></a>
-<span class="sourceLineNo">5939</span>    incr.setTTL(5000);<a name="line.5939"></a>
-<span class="sourceLineNo">5940</span>    region.increment(incr); // 2<a name="line.5940"></a>
-<span class="sourceLineNo">5941</span><a name="line.5941"></a>
-<span class="sourceLineNo">5942</span>    // New value should be 2<a name="line.5942"></a>
-<span class="sourceLineNo">5943</span>    r = region.get(new Get(row));<a name="line.5943"></a>
-<span class="sourceLineNo">5944</span>    val = r.getValue(fam1, q1);<a name="line.5944"></a>
-<span class="sourceLineNo">5945</span>    assertNotNull(val);<a name="line.5945"></a>
-<span class="sourceLineNo">5946</span>    assertEquals(2L, Bytes.toLong(val));<a name="line.5946"></a>
-<span class="sourceLineNo">5947</span><a name="line.5947"></a>
-<span class="sourceLineNo">5948</span>    // Increment time to T+25 seconds<a name="line.5948"></a>
-<span class="sourceLineNo">5949</span>    edge.incrementTime(5000);<a name="line.5949"></a>
-<span class="sourceLineNo">5950</span><a name="line.5950"></a>
-<span class="sourceLineNo">5951</span>    // Value should be back to 1<a name="line.5951"></a>
-<span class="sourceLineNo">5952</span>    r = region.get(new Get(row));<a name="line.5952"></a>
-<span class="sourceLineNo">5953</span>    val = r.getValue(fam1, q1);<a name="line.5953"></a>
-<span class="sourceLineNo">5954</span>    assertNotNull(val);<a name="line.5954"></a>
-<span class="sourceLineNo">5955</span>    assertEquals(1L, Bytes.toLong(val));<a name="line.5955"></a>
-<span class="sourceLineNo">5956</span><a name="line.5956"></a>
-<span class="sourceLineNo">5957</span>    // Increment time to T+30 seconds<a name="line.5957"></a>
-<span class="sourceLineNo">5958</span>    edge.incrementTime(5000);<a name="line.5958"></a>
-<span class="sourceLineNo">5959</span><a name="line.5959"></a>
-<span class="sourceLineNo">5960</span>    // Original value written at T+20 should be gone now via family TTL<a name="line.5960"></a>
-<span class="sourceLineNo">5961</span>    r = region.get(new Get(row));<a name="line.5961"></a>
-<span class="sourceLineNo">5962</span>    assertNull(r.getValue(fam1, q1));<a name="line.5962"></a>
-<span class="sourceLineNo">5963</span>  }<a name="line.5963"></a>
-<span class="sourceLineNo">5964</span><a name="line.5964"></a>
-<span class="sourceLineNo">5965</span>  @Test<a name="line.5965"></a>
-<span class="sourceLineNo">5966</span>  public void testIncrementTimestampsAreMonotonic() throws IOException {<a name="line.5966"></a>
-<span class="sourceLineNo">5967</span>    region = initHRegion(tableName, method, CONF, fam1);<a name="line.5967"></a>
-<span class="sourceLineNo">5968</span>    ManualEnvironmentEdge edge = new ManualEnvironmentEdge();<a name="line.5968"></a>
-<span class="sourceLineNo">5969</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.5969"></a>
-<span class="sourceLineNo">5970</span><a name="line.5970"></a>
-<span class="sourceLineNo">5971</span>    edge.setValue(10);<a name="line.5971"></a>
-<span class="sourceLineNo">5972</span>    Increment inc = new Increment(row);<a name="line.5972"></a>
-<span class="sourceLineNo">5973</span>    inc.setDurability(Durability.SKIP_WAL);<a name="line.5973"></a>
-<span class="sourceLineNo">5974</span>    inc.addColumn(fam1, qual1, 1L);<a name="line.5974"></a>
-<span class="sourceLineNo">5975</span>    region.increment(inc);<a name="line.5975"></a>
-<span class="sourceLineNo">5976</span><a name="line.5976"></a>
-<span class="sourceLineNo">5977</span>    Result result = region.get(new Get(row));<a name="line.5977"></a>
-<span class="sourceLineNo">5978</span>    Cell c = result.getColumnLatestCell(fam1, qual1);<a name="line.5978"></a>
-<span class="sourceLineNo">5979</span>    assertNotNull(c);<a name="line.5979"></a>
-<span class="sourceLineNo">5980</span>    assertEquals(10L, c.getTimestamp());<a name="line.5980"></a>
-<span class="sourceLineNo">5981</span><a name="line.5981"></a>
-<span class="sourceLineNo">5982</span>    edge.setValue(1); // clock goes back<a name="line.5982"></a>
-<span class="sourceLineNo">5983</span>    region.increment(inc);<a name="line.5983"></a>
-<span class="sourceLineNo">5984</span>    result = region.get(new Get(row));<a name="line.5984"></a>
-<span class="sourceLineNo">5985</span>    c = result.getColumnLatestCell(fam1, qual1);<a name="line.5985"></a>
-<span class="sourceLineNo">5986</span>    assertEquals(11L, c.getTimestamp());<a name="line.5986"></a>
-<span class="sourceLineNo">5987</span>    assertEquals(2L, Bytes.toLong(c.getValueArray(), c.getValueOffset(), c.getValueLength()));<a name="line.5987"></a>
-<span class="sourceLineNo">5988</span>  }<a name="line.5988"></a>
-<span class="sourceLineNo">5989</span><a name="line.5989"></a>
-<span class="sourceLineNo">5990</span>  @Test<a name="line.5990"></a>
-<span class="sourceLineNo">5991</span>  public void testAppendTimestampsAreMonotonic() throws IOException {<a name="line.5991"></a>
-<span class="sourceLineNo">5992</span>    region = initHRegion(tableName, method, CONF, fam1);<a name="line.5992"></a>
-<span class="sourceLineNo">5993</span>    ManualEnvironmentEdge edge = new ManualEnvironmentEdge();<a name="line.5993"></a>
-<span class="sourceLineNo">5994</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.5994"></a>
-<span class="sourceLineNo">5995</span><a name="line.5995"></a>
-<span class="sourceLineNo">5996</span>    edge.setValue(10);<a name="line.5996"></a>
-<span class="sourceLineNo">5997</span>    Append a = new Append(row);<a name="line.5997"></a>
-<span class="sourceLineNo">5998</span>    a.setDurability(Durability.SKIP_WAL);<a name="line.5998"></a>
-<span class="sourceLineNo">5999</span>    a.addColumn(fam1, qual1, qual1);<a name="line.5999"></a>
-<span class="sourceLineNo">6000</span>    region.append(a);<a name="line.6000"></a>
-<span class="sourceLineNo">6001</span><a name="line.6001"></a>
-<span class="sourceLineNo">6002</span>    Result result = region.get(new Get(row));<a name="line.6002"></a>
-<span class="sourceLineNo">6003</span>    Cell c = result.getColumnLatestCell(fam1, qual1);<a name="line.6003"></a>
-<span class="sourceLineNo">6004</span>    assertNotNull(c);<a name="line.6004"></a>
-<span class="sourceLineNo">6005</span>    assertEquals(10L, c.getTimestamp());<a name="line.6005"></a>
-<span class="sourceLineNo">6006</span><a name="line.6006"></a>
-<span class="sourceLineNo">6007</span>    edge.setValue(1); // clock goes back<a name="line.6007"></a>
-<span class="sourceLineNo">6008</span>    region.append(a);<a name="line.6008"></a>
-<span class="sourceLineNo">6009</span>    result = region.get(new Get(row));<a name="line.6009"></a>
-<span class="sourceLineNo">6010</span>    c = result.getColumnLatestCell(fam1, qual1);<a name="line.6010"></a>
-<span class="sourceLineNo">6011</span>    assertEquals(11L, c.getTimestamp());<a name="line.6011"></a>
-<span class="sourceLineNo">6012</span><a name="line.6012"></a>
-<span class="sourceLineNo">6013</span>    byte[] expected = new byte[qual1.length*2];<a name="line.6013"></a>
-<span class="sourceLineNo">6014</span>    System.arraycopy(qual1, 0, expected, 0, qual1.length);<a name="line.6014"></a>
-<span class="sourceLineNo">6015</span>    System.arraycopy(qual1, 0, expected, qual1.length, qual1.length);<a name="line.6015"></a>
+<span class="sourceLineNo">5933</span>    assertNull(r.getValue(fam1, q1));<a name="line.5933"></a>
+<span class="sourceLineNo">5934</span>    assertNull(r.getValue(fam1, q2));<a name="line.5934"></a>
+<span class="sourceLineNo">5935</span>    assertNull(r.getValue(fam1, q3));<a name="line.5935"></a>
+<span class="sourceLineNo">5936</span>    assertNull(r.getValue(fam1, q4));<a name="line.5936"></a>
+<span class="sourceLineNo">5937</span><a name="line.5937"></a>
+<span class="sourceLineNo">5938</span>    // Fun with disappearing increments<a name="line.5938"></a>
+<span class="sourceLineNo">5939</span><a name="line.5939"></a>
+<span class="sourceLineNo">5940</span>    // Start at 1<a name="line.5940"></a>
+<span class="sourceLineNo">5941</span>    region.put(new Put(row).addColumn(fam1, q1, Bytes.toBytes(1L)));<a name="line.5941"></a>
+<span class="sourceLineNo">5942</span>    r = region.get(new Get(row));<a name="line.5942"></a>
+<span class="sourceLineNo">5943</span>    byte[] val = r.getValue(fam1, q1);<a name="line.5943"></a>
+<span class="sourceLineNo">5944</span>    assertNotNull(val);<a name="line.5944"></a>
+<span class="sourceLineNo">5945</span>    assertEquals(1L, Bytes.toLong(val));<a name="line.5945"></a>
+<span class="sourceLineNo">5946</span><a name="line.5946"></a>
+<span class="sourceLineNo">5947</span>    // Increment with a TTL of 5 seconds<a name="line.5947"></a>
+<span class="sourceLineNo">5948</span>    Increment incr = new Increment(row).addColumn(fam1, q1, 1L);<a name="line.5948"></a>
+<span class="sourceLineNo">5949</span>    incr.setTTL(5000);<a name="line.5949"></a>
+<span class="sourceLineNo">5950</span>    region.increment(incr); // 2<a name="line.5950"></a>
+<span class="sourceLineNo">5951</span><a name="line.5951"></a>
+<span class="sourceLineNo">5952</span>    // New value should be 2<a name="line.5952"></a>
+<span class="sourceLineNo">5953</span>    r = region.get(new Get(row));<a name="line.5953"></a>
+<span class="sourceLineNo">5954</span>    val = r.getValue(fam1, q1);<a name="line.5954"></a>
+<span class="sourceLineNo">5955</span>    assertNotNull(val);<a name="line.5955"></a>
+<span class="sourceLineNo">5956</span>    assertEquals(2L, Bytes.toLong(val));<a name="line.5956"></a>
+<span class="sourceLineNo">5957</span><a name="line.5957"></a>
+<span class="sourceLineNo">5958</span>    // Increment time to T+25 seconds<a name="line.5958"></a>
+<span class="sourceLineNo">5959</span>    edge.incrementTime(5000);<a name="line.5959"></a>
+<span class="sourceLineNo">5960</span><a name="line.5960"></a>
+<span class="sourceLineNo">5961</span>    // Value should be back to 1<a name="line.5961"></a>
+<span class="sourceLineNo">5962</span>    r = region.get(new Get(row));<a name="line.5962"></a>
+<span class="sourceLineNo">5963</span>    val = r.getValue(fam1, q1);<a name="line.5963"></a>
+<span class="sourceLineNo">5964</span>    assertNotNull(val);<a name="line.5964"></a>
+<span class="sourceLineNo">5965</span>    assertEquals(1L, Bytes.toLong(val));<a name="line.5965"></a>
+<span class="sourceLineNo">5966</span><a name="line.5966"></a>
+<span class="sourceLineNo">5967</span>    // Increment time to T+30 seconds<a name="line.5967"></a>
+<span class="sourceLineNo">5968</span>    edge.incrementTime(5000);<a name="line.5968"></a>
+<span class="sourceLineNo">5969</span><a name="line.5969"></a>
+<span class="sourceLineNo">5970</span>    // Original value written at T+20 should be gone now via family TTL<a name="line.5970"></a>
+<span class="sourceLineNo">5971</span>    r = region.get(new Get(row));<a name="line.5971"></a>
+<span class="sourceLineNo">5972</span>    assertNull(r.getValue(fam1, q1));<a name="line.5972"></a>
+<span class="sourceLineNo">5973</span>  }<a name="line.5973"></a>
+<span class="sourceLineNo">5974</span><a name="line.5974"></a>
+<span class="sourceLineNo">5975</span>  @Test<a name="line.5975"></a>
+<span class="sourceLineNo">5976</span>  public void testIncrementTimestampsAreMonotonic() throws IOException {<a name="line.5976"></a>
+<span class="sourceLineNo">5977</span>    region = initHRegion(tableName, method, CONF, fam1);<a name="line.5977"></a>
+<span class="sourceLineNo">5978</span>    ManualEnvironmentEdge edge = new ManualEnvironmentEdge();<a name="line.5978"></a>
+<span class="sourceLineNo">5979</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.5979"></a>
+<span class="sourceLineNo">5980</span><a name="line.5980"></a>
+<span class="sourceLineNo">5981</span>    edge.setValue(10);<a name="line.5981"></a>
+<span class="sourceLineNo">5982</span>    Increment inc = new Increment(row);<a name="line.5982"></a>
+<span class="sourceLineNo">5983</span>    inc.setDurability(Durability.SKIP_WAL);<a name="line.5983"></a>
+<span class="sourceLineNo">5984</span>    inc.addColumn(fam1, qual1, 1L);<a name="line.5984"></a>
+<span class="sourceLineNo">5985</span>    region.increment(inc);<a name="line.5985"></a>
+<span class="sourceLineNo">5986</span><a name="line.5986"></a>
+<span class="sourceLineNo">5987</span>    Result result = region.get(new Get(row));<a name="line.5987"></a>
+<span class="sourceLineNo">5988</span>    Cell c = result.getColumnLatestCell(fam1, qual1);<a name="line.5988"></a>
+<span class="sourceLineNo">5989</span>    assertNotNull(c);<a name="line.5989"></a>
+<span class="sourceLineNo">5990</span>    assertEquals(10L, c.getTimestamp());<a name="line.5990"></a>
+<span class="sourceLineNo">5991</span><a name="line.5991"></a>
+<span class="sourceLineNo">5992</span>    edge.setValue(1); // clock goes back<a name="line.5992"></a>
+<span class="sourceLineNo">5993</span>    region.increment(inc);<a name="line.5993"></a>
+<span class="sourceLineNo">5994</span>    result = region.get(new Get(row));<a name="line.5994"></a>
+<span class="sourceLineNo">5995</span>    c = result.getColumnLatestCell(fam1, qual1);<a name="line.5995"></a>
+<span class="sourceLineNo">5996</span>    assertEquals(11L, c.getTimestamp());<a name="line.5996"></a>
+<span class="sourceLineNo">5997</span>    assertEquals(2L, Bytes.toLong(c.getValueArray(), c.getValueOffset(), c.getValueLength()));<a name="line.5997"></a>
+<span class="sourceLineNo">5998</span>  }<a name="line.5998"></a>
+<span class="sourceLineNo">5999</span><a name="line.5999"></a>
+<span class="sourceLineNo">6000</span>  @Test<a name="line.6000"></a>
+<span class="sourceLineNo">6001</span>  public void testAppendTimestampsAreMonotonic() throws IOException {<a name="line.6001"></a>
+<span class="sourceLineNo">6002</span>    region = initHRegion(tableName, method, CONF, fam1);<a name="line.6002"></a>
+<span class="sourceLineNo">6003</span>    ManualEnvironmentEdge edge = new ManualEnvironmentEdge();<a name="line.6003"></a>
+<span class="sourceLineNo">6004</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.6004"></a>
+<span class="sourceLineNo">6005</span><a name="line.6005"></a>
+<span class="sourceLineNo">6006</span>    edge.setValue(10);<a name="line.6006"></a>
+<span class="sourceLineNo">6007</span>    Append a = new Append(row);<a name="line.6007"></a>
+<span class="sourceLineNo">6008</span>    a.setDurability(Durability.SKIP_WAL);<a name="line.6008"></a>
+<span class="sourceLineNo">6009</span>    a.addColumn(fam1, qual1, qual1);<a name="line.6009"></a>
+<span class="sourceLineNo">6010</span>    region.append(a);<a name="line.6010"></a>
+<span class="sourceLineNo">6011</span><a name="line.6011"></a>
+<span class="sourceLineNo">6012</span>    Result result = region.get(new Get(row));<a name="line.6012"></a>
+<span class="sourceLineNo">6013</span>    Cell c = result.getColumnLatestCell(fam1, qual1);<a name="line.6013"></a>
+<span class="sourceLineNo">6014</span>    assertNotNull(c);<a name="line.6014"></a>
+<span class="sourceLineNo">6015</span>    assertEquals(10L, c.getTimestamp());<a name="line.6015"></a>
 <span class="sourceLineNo">6016</span><a name="line.6016"></a>
-<span class="sourceLineNo">6017</span>    assertTrue(Bytes.equals(c.getValueArray(), c.getValueOffset(), c.getValueLength(),<a name="line.6017"></a>
-<span class="sourceLineNo">6018</span>      expected, 0, expected.length));<a name="line.6018"></a>
-<span class="sourceLineNo">6019</span>  }<a name="line.6019"></a>
-<span class="sourceLineNo">6020</span><a name="line.6020"></a>
-<span class="sourceLineNo">6021</span>  @Test<a name="line.6021"></a>
-<span class="sourceLineNo">6022</span>  public void testCheckAndMutateTimestampsAreMonotonic() throws IOException {<a name="line.6022"></a>
-<span class="sourceLineNo">6023</span>    region = initHRegion(tableName, method, CONF, fam1);<a name="line.6023"></a>
-<span class="sourceLineNo">6024</span>    ManualEnvironmentEdge edge = new ManualEnvironmentEdge();<a name="line.6024"></a>
-<span class="sourceLineNo">6025</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.6025"></a>
+<span class="sourceLineNo">6017</span>    edge.setValue(1); // clock goes back<a name="line.6017"></a>
+<span class="sourceLineNo">6018</span>    region.append(a);<a name="line.6018"></a>
+<span class="sourceLineNo">6019</span>    result = region.get(new Get(row));<a name="line.6019"></a>
+<span class="sourceLineNo">6020</span>    c = result.getColumnLatestCell(fam1, qual1);<a name="line.6020"></a>
+<span class="sourceLineNo">6021</span>    assertEquals(11L, c.getTimestamp());<a name="line.6021"></a>
+<span class="sourceLineNo">6022</span><a name="line.6022"></a>
+<span class="sourceLineNo">6023</span>    byte[] expected = new byte[qual1.length*2];<a name="line.6023"></a>
+<span class="sourceLineNo">6024</span>    System.arraycopy(qual1, 0, expected, 0, qual1.length);<a name="line.6024"></a>
+<span class="sourceLineNo">6025</span>    System.arraycopy(qual1, 0, expected, qual1.length, qual1.length);<a name="line.6025"></a>
 <span class="sourceLineNo">6026</span><a name="line.6026"></a>
-<span class="sourceLineNo">6027</span>    edge.setValue(10);<a name="line.6027"></a>
-<span class="sourceLineNo">6028</span>    Put p = new Put(row);<a name="line.6028"></a>
-<span class="sourceLineNo">6029</span>    p.setDurability(Durability.SKIP_WAL);<a name="line.6029"></a>
-<span class="sourceLineNo">6030</span>    p.addColumn(fam1, qual1, qual1);<a name="line.6030"></a>
-<span class="sourceLineNo">6031</span>    region.put(p);<a name="line.6031"></a>
-<span class="sourceLineNo">6032</span><a name="line.6032"></a>
-<span class="sourceLineNo">6033</span>    Result result = region.get(new Get(row));<a name="line.6033"></a>
-<span class="sourceLineNo">6034</span>    Cell c = result.getColumnLatestCell(fam1, qual1);<a name="line.6034"></a>
-<span class="sourceLineNo">6035</span>    assertNotNull(c);<a name="line.6035"></a>
-<span class="sourceLineNo">6036</span>    assertEquals(10L, c.getTimestamp());<a name="line.6036"></a>
-<span class="sourceLineNo">6037</span><a name="line.6037"></a>
-<span class="sourceLineNo">6038</span>    edge.setValue(1); // clock goes back<a name="line.6038"></a>
-<span class="sourceLineNo">6039</span>    p = new Put(row);<a name="line.6039"></a>
-<span class="sourceLineNo">6040</span>    p.setDurability(Durability.SKIP_WAL);<a name="line.6040"></a>
-<span class="sourceLineNo">6041</span>    p.addColumn(fam1, qual1, qual2);<a name="line.6041"></a>
-<span class="sourceLineNo">6042</span>    region.checkAndMutate(row, fam1, qual1, CompareOperator.EQUAL, new BinaryComparator(qual1), p);<a name="line.6042"></a>
-<span class="sourceLineNo">6043</span>    result = region.get(new Get(row));<a name="line.6043"></a>
-<span class="sourceLineNo">6044</span>    c = result.getColumnLatestCell(fam1, qual1);<a name="line.6044"></a>
-<span class="sourceLineNo">6045</span>    assertEquals(10L, c.getTimestamp());<a name="line.6045"></a>
-<span class="sourceLineNo">6046</span><a name="line.6046"></a>
-<span class="sourceLineNo">6047</span>    assertTrue(Bytes.equals(c.getValueArray(), c.getValueOffset(), c.getValueLength(),<a name="line.6047"></a>
-<span class="sourceLineNo">6048</span>      qual2, 0, qual2.length));<a name="line.6048"></a>
-<span class="sourceLineNo">6049</span>  }<a name="line.6049"></a>
-<span class="sourceLineNo">6050</span><a name="line.6050"></a>
-<span class="sourceLineNo">6051</span>  @Test<a name="line.6051"></a>
-<span class="sourceLineNo">6052</span>  public void testBatchMutateWithWrongRegionException() throws Exception {<a name="line.6052"></a>
-<span class="sourceLineNo">6053</span>    final byte[] a = Bytes.toBytes("a");<a name="line.6053"></a>
-<span class="sourceLineNo">6054</span>    final byte[] b = Bytes.toBytes("b");<a name="line.6054"></a>
-<span class="sourceLineNo">6055</span>    final byte[] c = Bytes.toBytes("c"); // exclusive<a name="line.6055"></a>
+<span class="sourceLineNo">6027</span>    assertTrue(Bytes.equals(c.getValueArray(), c.getValueOffset(), c.getValueLength(),<a name="line.6027"></a>
+<span class="sourceLineNo">6028</span>      expected, 0, expected.length));<a name="line.6028"></a>
+<span class="sourceLineNo">6029</span>  }<a name="line.6029"></a>
+<span class="sourceLineNo">6030</span><a name="line.6030"></a>
+<span class="sourceLineNo">6031</span>  @Test<a name="line.6031"></a>
+<span class="sourceLineNo">6032</span>  public void testCheckAndMutateTimestampsAreMonotonic() throws IOException {<a name="line.6032"></a>
+<span class="sourceLineNo">6033</span>    region = initHRegion(tableName, method, CONF, fam1);<a name="line.6033"></a>
+<span class="sourceLineNo">6034</span>    ManualEnvironmentEdge edge = new ManualEnvironmentEdge();<a name="line.6034"></a>
+<span class="sourceLineNo">6035</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.6035"></a>
+<span class="sourceLineNo">6036</span><a name="line.6036"></a>
+<span class="sourceLineNo">6037</span>    edge.setValue(10);<a name="line.6037"></a>
+<span class="sourceLineNo">6038</span>    Put p = new Put(row);<a name="line.6038"></a>
+<span class="sourceLineNo">6039</span>    p.setDurability(Durability.SKIP_WAL);<a name="line.6039"></a>
+<span class="sourceLineNo">6040</span>    p.addColumn(fam1, qual1, qual1);<a name="line.6040"></a>
+<span class="sourceLineNo">6041</span>    region.put(p);<a name="line.6041"></a>
+<span class="sourceLineNo">6042</span><a name="line.6042"></a>
+<span class="sourceLineNo">6043</span>    Result result = region.get(new Get(row));<a name="line.6043"></a>
+<span class="sourceLineNo">6044</span>    Cell c = result.getColumnLatestCell(fam1, qual1);<a name="line.6044"></a>
+<span class="sourceLineNo">6045</span>    assertNotNull(c);<a name="line.6045"></a>
+<span class="sourceLineNo">6046</span>    assertEquals(10L, c.getTimestamp());<a name="line.6046"></a>
+<span class="sourceLineNo">6047</span><a name="line.6047"></a>
+<span class="sourceLineNo">6048</span>    edge.setValue(1); // clock goes back<a name="line.6048"></a>
+<span class="sourceLineNo">6049</span>    p = new Put(row);<a name="line.6049"></a>
+<span class="sourceLineNo">6050</span>    p.setDurability(Durability.SKIP_WAL);<a name="line.6050"></a>
+<span class="sourceLineNo">6051</span>    p.addColumn(fam1, qual1, qual2);<a name="line.6051"></a>
+<span class="sourceLineNo">6052</span>    region.checkAndMutate(row, fam1, qual1, CompareOperator.EQUAL, new BinaryComparator(qual1), p);<a name="line.6052"></a>
+<span class="sourceLineNo">6053</span>    result = region.get(new Get(row));<a name="line.6053"></a>
+<span class="sourceLineNo">6054</span>    c = result.getColumnLatestCell(fam1, qual1);<a name="line.6054"></a>
+<span class="sourceLineNo">6055</span>    assertEquals(10L, c.getTimestamp());<a name="line.6055"></a>
 <span class="sourceLineNo">6056</span><a name="line.6056"></a>
-<span class="sourceLineNo">6057</span>    int prevLockTimeout = CONF.getInt("hbase.rowlock.wait.duration", 30000);<a name="line.6057"></a>
-<span class="sourceLineNo">6058</span>    CONF.setInt("hbase.rowlock.wait.duration", 1000);<a name="line.6058"></a>
-<span class="sourceLineNo">6059</span>    region = initHRegion(tableName, a, c, method, CONF, false, fam1);<a name="line.6059"></a>
+<span class="sourceLineNo">6057</span>    assertTrue(Bytes.equals(c.getValueArray(), c.getValueOffset(), c.getValueLength(),<a name="line.6057"></a>
+<span class="sourceLineNo">6058</span>      qual2, 0, qual2.length));<a name="line.6058"></a>
+<span class="sourceLineNo">6059</span>  }<a name="line.6059"></a>
 <span class="sourceLineNo">6060</span><a name="line.6060"></a>
-<span class="sourceLineNo">6061</span>    Mutation[] mutations = new Mutation[] {<a name="line.6061"></a>
-<span class="sourceLineNo">6062</span>        new Put(a)<a name="line.6062"></a>
-<span class="sourceLineNo">6063</span>            .add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6063"></a>
-<span class="sourceLineNo">6064</span>              .setRow(a)<a name="line.6064"></a>
-<span class="sourceLineNo">6065</span>              .setFamily(fam1)<a name="line.6065"></a>
-<span class="sourceLineNo">6066</span>              .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6066"></a>
-<span class="sourceLineNo">6067</span>              .setType(Cell.Type.Put)<a name="line.6067"></a>
-<span class="sourceLineNo">6068</span>              .build()),<a name="line.6068"></a>
-<span class="sourceLineNo">6069</span>        // this is outside the region boundary<a name="line.6069"></a>
-<span class="sourceLineNo">6070</span>        new Put(c).add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6070"></a>
-<span class="sourceLineNo">6071</span>              .setRow(c)<a name="line.6071"></a>
-<span class="sourceLineNo">6072</span>              .setFamily(fam1)<a name="line.6072"></a>
-<span class="sourceLineNo">6073</span>              .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6073"></a>
-<span class="sourceLineNo">6074</span>              .setType(Type.Put)<a name="line.6074"></a>
-<span class="sourceLineNo">6075</span>              .build()),<a name="line.6075"></a>
-<span class="sourceLineNo">6076</span>        new Put(b).add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6076"></a>
-<span class="sourceLineNo">6077</span>              .setRow(b)<a name="line.6077"></a>
-<span class="sourceLineNo">6078</span>              .setFamily(fam1)<a name="line.6078"></a>
-<span class="sourceLineNo">6079</span>              .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6079"></a>
-<span class="sourceLineNo">6080</span>              .setType(Cell.Type.Put)<a name="line.6080"></a>
-<span class="sourceLineNo">6081</span>              .build())<a name="line.6081"></a>
-<span class="sourceLineNo">6082</span>    };<a name="line.6082"></a>
-<span class="sourceLineNo">6083</span><a name="line.6083"></a>
-<span class="sourceLineNo">6084</span>    OperationStatus[] status = region.batchMutate(mutations);<a name="line.6084"></a>
-<span class="sourceLineNo">6085</span>    assertEquals(OperationStatusCode.SUCCESS, status[0].getOperationStatusCode());<a name="line.6085"></a>
-<span class="sourceLineNo">6086</span>    assertEquals(OperationStatusCode.SANITY_CHECK_FAILURE, status[1].getOperationStatusCode());<a name="line.6086"></a>
-<span class="sourceLineNo">6087</span>    assertEquals(OperationStatusCode.SUCCESS, status[2].getOperationStatusCode());<a name="line.6087"></a>
-<span class="sourceLineNo">6088</span><a name="line.6088"></a>
-<span class="sourceLineNo">6089</span><a name="line.6089"></a>
-<span class="sourceLineNo">6090</span>    // test with a row lock held for a long time<a name="line.6090"></a>
-<span class="sourceLineNo">6091</span>    final CountDownLatch obtainedRowLock = new CountDownLatch(1);<a name="line.6091"></a>
-<span class="sourceLineNo">6092</span>    ExecutorService exec = Executors.newFixedThreadPool(2);<a name="line.6092"></a>
-<span class="sourceLineNo">6093</span>    Future&lt;Void&gt; f1 = exec.submit(new Callable&lt;Void&gt;() {<a name="line.6093"></a>
-<span class="sourceLineNo">6094</span>      @Override<a name="line.6094"></a>
-<span class="sourceLineNo">6095</span>      public Void call() throws Exception {<a name="line.6095"></a>
-<span class="sourceLineNo">6096</span>        LOG.info("Acquiring row lock");<a name="line.6096"></a>
-<span class="sourceLineNo">6097</span>        RowLock rl = region.getRowLock(b);<a name="line.6097"></a>
-<span class="sourceLineNo">6098</span>        obtainedRowLock.countDown();<a name="line.6098"></a>
-<span class="sourceLineNo">6099</span>        LOG.info("Waiting for 5 seconds before releasing lock");<a name="line.6099"></a>
-<span class="sourceLineNo">6100</span>        Threads.sleep(5000);<a name="line.6100"></a>
-<span class="sourceLineNo">6101</span>        LOG.info("Releasing row lock");<a name="line.6101"></a>
-<span class="sourceLineNo">6102</span>        rl.release();<a name="line.6102"></a>
-<span class="sourceLineNo">6103</span>        return null;<a name="line.6103"></a>
-<span class="sourceLineNo">6104</span>      }<a name="line.6104"></a>
-<span class="sourceLineNo">6105</span>    });<a name="line.6105"></a>
-<span class="sourceLineNo">6106</span>    obtainedRowLock.await(30, TimeUnit.SECONDS);<a name="line.6106"></a>
-<span class="sourceLineNo">6107</span><a name="line.6107"></a>
-<span class="sourceLineNo">6108</span>    Future&lt;Void&gt; f2 = exec.submit(new Callable&lt;Void&gt;() {<a name="line.6108"></a>
-<span class="sourceLineNo">6109</span>      @Override<a name="line.6109"></a>
-<span class="sourceLineNo">6110</span>      public Void call() throws Exception {<a name="line.6110"></a>
-<span class="sourceLineNo">6111</span>        Mutation[] mutations = new Mutation[] {<a name="line.6111"></a>
-<span class="sourceLineNo">6112</span>            new Put(a).add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6112"></a>
-<span class="sourceLineNo">6113</span>                .setRow(a)<a name="line.6113"></a>
-<span class="sourceLineNo">6114</span>                .setFamily(fam1)<a name="line.6114"></a>
-<span class="sourceLineNo">6115</span>                .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6115"></a>
-<span class="sourceLineNo">6116</span>                .setType(Cell.Type.Put)<a name="line.6116"></a>
-<span class="sourceLineNo">6117</span>                .build()),<a name="line.6117"></a>
-<span class="sourceLineNo">6118</span>            new Put(b).add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6118"></a>
-<span class="sourceLineNo">6119</span>                .setRow(b)<a name="line.6119"></a>
-<span class="sourceLineNo">6120</span>                .setFamily(fam1)<a name="line.6120"></a>
-<span class="sourceLineNo">6121</span>                .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6121"></a>
-<span class="sourceLineNo">6122</span>                .setType(Cell.Type.Put)<a name="line.6122"></a>
-<span class="sourceLineNo">6123</span>                .build()),<a name="line.6123"></a>
-<span class="sourceLineNo">6124</span>        };<a name="line.6124"></a>
-<span class="sourceLineNo">6125</span><a name="line.6125"></a>
-<span class="sourceLineNo">6126</span>        // this will wait for the row lock, and it will eventually succeed<a name="line.6126"></a>
-<span class="sourceLineNo">6127</span>        OperationStatus[] status = region.batchMutate(mutations);<a name="line.6127"></a>
-<span class="sourceLineNo">6128</span>        assertEquals(OperationStatusCode.SUCCESS, status[0].getOperationStatusCode());<a name="line.6128"></a>
-<span class="sourceLineNo">6129</span>        assertEquals(OperationStatusCode.SUCCESS, status[1].getOperationStatusCode());<a name="line.6129"></a>
-<span class="sourceLineNo">6130</span>        return null;<a name="line.6130"></a>
-<span class="sourceLineNo">6131</span>      }<a name="line.6131"></a>
-<span class="sourceLineNo">6132</span>    });<a name="line.6132"></a>
-<span class="sourceLineNo">6133</span><a name="line.6133"></a>
-<span class="sourceLineNo">6134</span>    f1.get();<a name="line.6134"></a>
-<span class="sourceLineNo">6135</span>    f2.get();<a name="line.6135"></a>
-<span class="sourceLineNo">6136</span><a name="line.6136"></a>
-<span class="sourceLineNo">6137</span>    CONF.setInt("hbase.rowlock.wait.duration", prevLockTimeout);<a name="line.6137"></a>
-<span class="sourceLineNo">6138</span>  }<a name="line.6138"></a>
-<span class="sourceLineNo">6139</span><a name="line.6139"></a>
-<span class="sourceLineNo">6140</span>  @Test<a name="line.6140"></a>
-<span class="sourceLineNo">6141</span>  public void testCheckAndRowMutateTimestampsAreMonotonic() throws IOException {<a name="line.6141"></a>
-<span class="sourceLineNo">6142</span>    region = initHRegion(tableName, method, CONF, fam1);<a name="line.6142"></a>
-<span class="sourceLineNo">6143</span>    ManualEnvironmentEdge edge = new ManualEnvironmentEdge();<a name="line.6143"></a>
-<span class="sourceLineNo">6144</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.6144"></a>
-<span class="sourceLineNo">6145</span><a name="line.6145"></a>
-<span class="sourceLineNo">6146</span>    edge.setValue(10);<a name="line.6146"></a>
-<span class="sourceLineNo">6147</span>    Put p = new Put(row);<a name="line.6147"></a>
-<span class="sourceLineNo">6148</span>    p.setDurability(Durability.SKIP_WAL);<a name="line.6148"></a>
-<span class="sourceLineNo">6149</span>    p.addColumn(fam1, qual1, qual1);<a name="line.6149"></a>
-<span class="sourceLineNo">6150</span>    region.put(p);<a name="line.6150"></a>
-<span class="sourceLineNo">6151</span><a name="line.6151"></a>
-<span class="sourceLineNo">6152</span>    Result result = region.get(new Get(row));<a name="line.6152"></a>
-<span class="sourceLineNo">6153</span>    Cell c = result.getColumnLatestCell(fam1, qual1);<a name="line.6153"></a>
-<span class="sourceLineNo">6154</span>    assertNotNull(c);<a name="line.6154"></a>
-<span class="sourceLineNo">6155</span>    assertEquals(10L, c.getTimestamp());<a name="line.6155"></a>
-<span class="sourceLineNo">6156</span><a name="line.6156"></a>
-<span class="sourceLineNo">6157</span>    edge.setValue(1); // clock goes back<a name="line.6157"></a>
-<span class="sourceLineNo">6158</span>    p = new Put(row);<a name="line.6158"></a>
-<span class="sourceLineNo">6159</span>    p.setDurability(Durability.SKIP_WAL);<a name="line.6159"></a>
-<span class="sourceLineNo">6160</span>    p.addColumn(fam1, qual1, qual2);<a name="line.6160"></a>
-<span class="sourceLineNo">6161</span>    RowMutations rm = new RowMutations(row);<a name="line.6161"></a>
-<span class="sourceLineNo">6162</span>    rm.add(p);<a name="line.6162"></a>
-<span class="sourceLineNo">6163</span>    assertTrue(region.checkAndRowMutate(row, fam1, qual1, CompareOperator.EQUAL,<a name="line.6163"></a>
-<span class="sourceLineNo">6164</span>        new BinaryComparator(qual1), rm));<a name="line.6164"></a>
-<span class="sourceLineNo">6165</span>    result = region.get(new Get(row));<a name="line.6165"></a>
-<span class="sourceLineNo">6166</span>    c = result.getColumnLatestCell(fam1, qual1);<a name="line.6166"></a>
-<span class="sourceLineNo">6167</span>    assertEquals(10L, c.getTimestamp());<a name="line.6167"></a>
-<span class="sourceLineNo">6168</span>    LOG.info("c value " +<a name="line.6168"></a>
-<span class="sourceLineNo">6169</span>      Bytes.toStringBinary(c.getValueArray(), c.getValueOffset(), c.getValueLength()));<a name="line.6169"></a>
-<span class="sourceLineNo">6170</span><a name="line.6170"></a>
-<span class="sourceLineNo">6171</span>    assertTrue(Bytes.equals(c.getValueArray(), c.getValueOffset(), c.getValueLength(),<a name="line.6171"></a>
-<span class="sourceLineNo">6172</span>      qual2, 0, qual2.length));<a name="line.6172"></a>
-<span class="sourceLineNo">6173</span>  }<a name="line.6173"></a>
-<span class="sourceLineNo">6174</span><a name="line.6174"></a>
-<span class="sourceLineNo">6175</span>  HRegion initHRegion(TableName tableName, String callingMethod,<a name="line.6175"></a>
-<span class="sourceLineNo">6176</span>      byte[]... families) throws IOException {<a name="line.6176"></a>
-<span class="sourceLineNo">6177</span>    return initHRegion(tableName, callingMethod, HBaseConfiguration.create(),<a name="line.6177"></a>
-<span class="sourceLineNo">6178</span>        families);<a name="line.6178"></a>
-<span class="sourceLineNo">6179</span>  }<a name="line.6179"></a>
+<span class="sourceLineNo">6061</span>  @Test<a name="line.6061"></a>
+<span class="sourceLineNo">6062</span>  public void testBatchMutateWithWrongRegionException() throws Exception {<a name="line.6062"></a>
+<span class="sourceLineNo">6063</span>    final byte[] a = Bytes.toBytes("a");<a name="line.6063"></a>
+<span class="sourceLineNo">6064</span>    final byte[] b = Bytes.toBytes("b");<a name="line.6064"></a>
+<span class="sourceLineNo">6065</span>    final byte[] c = Bytes.toBytes("c"); // exclusive<a name="line.6065"></a>
+<span class="sourceLineNo">6066</span><a name="line.6066"></a>
+<span class="sourceLineNo">6067</span>    int prevLockTimeout = CONF.getInt("hbase.rowlock.wait.duration", 30000);<a name="line.6067"></a>
+<span class="sourceLineNo">6068</span>    CONF.setInt("hbase.rowlock.wait.duration", 1000);<a name="line.6068"></a>
+<span class="sourceLineNo">6069</span>    region = initHRegion(tableName, a, c, method, CONF, false, fam1);<a name="line.6069"></a>
+<span class="sourceLineNo">6070</span><a name="line.6070"></a>
+<span class="sourceLineNo">6071</span>    Mutation[] mutations = new Mutation[] {<a name="line.6071"></a>
+<span class="sourceLineNo">6072</span>        new Put(a)<a name="line.6072"></a>
+<span class="sourceLineNo">6073</span>            .add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6073"></a>
+<span class="sourceLineNo">6074</span>              .setRow(a)<a name="line.6074"></a>
+<span class="sourceLineNo">6075</span>              .setFamily(fam1)<a name="line.6075"></a>
+<span class="sourceLineNo">6076</span>              .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6076"></a>
+<span class="sourceLineNo">6077</span>              .setType(Cell.Type.Put)<a name="line.6077"></a>
+<span class="sourceLineNo">6078</span>              .build()),<a name="line.6078"></a>
+<span class="sourceLineNo">6079</span>        // this is outside the region boundary<a name="line.6079"></a>
+<span class="sourceLineNo">6080</span>        new Put(c).add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6080"></a>
+<span class="sourceLineNo">6081</span>              .setRow(c)<a name="line.6081"></a>
+<span class="sourceLineNo">6082</span>              .setFamily(fam1)<a name="line.6082"></a>
+<span class="sourceLineNo">6083</span>              .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6083"></a>
+<span class="sourceLineNo">6084</span>              .setType(Type.Put)<a name="line.6084"></a>
+<span class="sourceLineNo">6085</span>              .build()),<a name="line.6085"></a>
+<span class="sourceLineNo">6086</span>        new Put(b).add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6086"></a>
+<span class="sourceLineNo">6087</span>              .setRow(b)<a name="line.6087"></a>
+<span class="sourceLineNo">6088</span>              .setFamily(fam1)<a name="line.6088"></a>
+<span class="sourceLineNo">6089</span>              .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6089"></a>
+<span class="sourceLineNo">6090</span>              .setType(Cell.Type.Put)<a name="line.6090"></a>
+<span class="sourceLineNo">6091</span>              .build())<a name="line.6091"></a>
+<span class="sourceLineNo">6092</span>    };<a name="line.6092"></a>
+<span class="sourceLineNo">6093</span><a name="line.6093"></a>
+<span class="sourceLineNo">6094</span>    OperationStatus[] status = region.batchMutate(mutations);<a name="line.6094"></a>
+<span class="sourceLineNo">6095</span>    assertEquals(OperationStatusCode.SUCCESS, status[0].getOperationStatusCode());<a name="line.6095"></a>
+<span class="sourceLineNo">6096</span>    assertEquals(OperationStatusCode.SANITY_CHECK_FAILURE, status[1].getOperationStatusCode());<a name="line.6096"></a>
+<span class="sourceLineNo">6097</span>    assertEquals(OperationStatusCode.SUCCESS, status[2].getOperationStatusCode());<a name="line.6097"></a>
+<span class="sourceLineNo">6098</span><a name="line.6098"></a>
+<span class="sourceLineNo">6099</span><a name="line.6099"></a>
+<span class="sourceLineNo">6100</span>    // test with a row lock held for a long time<a name="line.6100"></a>
+<span class="sourceLineNo">6101</span>    final CountDownLatch obtainedRowLock = new CountDownLatch(1);<a name="line.6101"></a>
+<span class="sourceLineNo">6102</span>    ExecutorService exec = Executors.newFixedThreadPool(2);<a name="line.6102"></a>
+<span class="sourceLineNo">6103</span>    Future&lt;Void&gt; f1 = exec.submit(new Callable&lt;Void&gt;() {<a name="line.6103"></a>
+<span class="sourceLineNo">6104</span>      @Override<a name="line.6104"></a>
+<span class="sourceLineNo">6105</span>      public Void call() throws Exception {<a name="line.6105"></a>
+<span class="sourceLineNo">6106</span>        LOG.info("Acquiring row lock");<a name="line.6106"></a>
+<span class="sourceLineNo">6107</span>        RowLock rl = region.getRowLock(b);<a name="line.6107"></a>
+<span class="sourceLineNo">6108</span>        obtainedRowLock.countDown();<a name="line.6108"></a>
+<span class="sourceLineNo">6109</span>        LOG.info("Waiting for 5 seconds before releasing lock");<a name="line.6109"></a>
+<span class="sourceLineNo">6110</span>        Threads.sleep(5000);<a name="line.6110"></a>
+<span class="sourceLineNo">6111</span>        LOG.info("Releasing row lock");<a name="line.6111"></a>
+<span class="sourceLineNo">6112</span>        rl.release();<a name="line.6112"></a>
+<span class="sourceLineNo">6113</span>        return null;<a name="line.6113"></a>
+<span class="sourceLineNo">6114</span>      }<a name="line.6114"></a>
+<span class="sourceLineNo">6115</span>    });<a name="line.6115"></a>
+<span class="sourceLineNo">6116</span>    obtainedRowLock.await(30, TimeUnit.SECONDS);<a name="line.6116"></a>
+<span class="sourceLineNo">6117</span><a name="line.6117"></a>
+<span class="sourceLineNo">6118</span>    Future&lt;Void&gt; f2 = exec.submit(new Callable&lt;Void&gt;() {<a name="line.6118"></a>
+<span class="sourceLineNo">6119</span>      @Override<a name="line.6119"></a>
+<span class="sourceLineNo">6120</span>      public Void call() throws Exception {<a name="line.6120"></a>
+<span class="sourceLineNo">6121</span>        Mutation[] mutations = new Mutation[] {<a name="line.6121"></a>
+<span class="sourceLineNo">6122</span>            new Put(a).add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6122"></a>
+<span class="sourceLineNo">6123</span>                .setRow(a)<a name="line.6123"></a>
+<span class="sourceLineNo">6124</span>                .setFamily(fam1)<a name="line.6124"></a>
+<span class="sourceLineNo">6125</span>                .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6125"></a>
+<span class="sourceLineNo">6126</span>                .setType(Cell.Type.Put)<a name="line.6126"></a>
+<span class="sourceLineNo">6127</span>                .build()),<a name="line.6127"></a>
+<span class="sourceLineNo">6128</span>            new Put(b).add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6128"></a>
+<span class="sourceLineNo">6129</span>                .setRow(b)<a name="line.6129"></a>
+<span class="sourceLineNo">6130</span>                .setFamily(fam1)<a name="line.6130"></a>
+<span class="sourceLineNo">6131</span>                .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6131"></a>
+<span class="sourceLineNo">6132</span>                .setType(Cell.Type.Put)<a name="line.6132"></a>
+<span class="sourceLineNo">6133</span>                .build()),<a name="line.6133"></a>
+<span class="sourceLineNo">6134</span>        };<a name="line.6134"></a>
+<span class="sourceLineNo">6135</span><a name="line.6135"></a>
+<span class="sourceLineNo">6136</span>        // this will wait for the row lock, and it will eventually succeed<a name="line.6136"></a>
+<span class="sourceLineNo">6137</span>        OperationStatus[] status = region.batchMutate(mutations);<a name="line.6137"></a>
+<span class="sourceLineNo">6138</span>        assertEquals(OperationStatusCode.SUCCESS, status[0].getOperationStatusCode());<a name="line.6138"></a>
+<span class="sourceLineNo">6139</span>        assertEquals(OperationStatusCode.SUCCESS, status[1].getOperationStatusCode());<a name="line.6139"></a>
+<span class="sourceLineNo">6140</span>        return null;<a name="line.6140"></a>
+<span class="sourceLineNo">6141</span>      }<a name="line.6141"></a>
+<span class="sourceLineNo">6142</span>    });<a name="line.6142"></a>
+<span class="sourceLineNo">6143</span><a name="line.6143"></a>
+<span class="sourceLineNo">6144</span>    f1.get();<a name="line.6144"></a>
+<span class="sourceLineNo">6145</span>    f2.get();<a name="line.6145"></a>
+<span class="sourceLineNo">6146</span><a name="line.6146"></a>
+<span class="sourceLineNo">6147</span>    CONF.setInt("hbase.rowlock.wait.duration", prevLockTimeout);<a name="line.6147"></a>
+<span class="sourceLineNo">6148</span>  }<a name="line.6148"></a>
+<span class="sourceLineNo">6149</span><a name="line.6149"></a>
+<span class="sourceLineNo">6150</span>  @Test<a name="line.6150"></a>
+<span class="sourceLineNo">6151</span>  public void testCheckAndRowMutateTimestampsAreMonotonic() throws IOException {<a name="line.6151"></a>
+<span class="sourceLineNo">6152</span>    region = initHRegion(tableName, method, CONF, fam1);<a name="line.6152"></a>
+<span class="sourceLineNo">6153</span>    ManualEnvironmentEdge edge = new ManualEnvironmentEdge();<a name="line.6153"></a>
+<span class="sourceLineNo">6154</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.6154"></a>
+<span class="sourceLineNo">6155</span><a name="line.6155"></a>
+<span class="sourceLineNo">6156</span>    edge.setValue(10);<a name="line.6156"></a>
+<span class="sourceLineNo">6157</span>    Put p = new Put(row);<a name="line.6157"></a>
+<span class="sourceLineNo">6158</span>    p.setDurability(Durability.SKIP_WAL);<a name="line.6158"></a>
+<span class="sourceLineNo">6159</span>    p.addColumn(fam1, qual1, qual1);<a name="line.6159"></a>
+<span class="sourceLineNo">6160</span>    region.put(p);<a name="line.6160"></a>
+<span class="sourceLineNo">6161</span><a name="line.6161"></a>
+<span class="sourceLineNo">6162</span>    Result result = region.get(new Get(row));<a name="line.6162"></a>
+<span class="sourceLineNo">6163</span>    Cell c = result.getColumnLatestCell(fam1, qual1);<a name="line.6163"></a>
+<span class="sourceLineNo">6164</span>    assertNotNull(c);<a name="line.6164"></a>
+<span class="sourceLineNo">6165</span>    assertEquals(10L, c.getTimestamp());<a name="line.6165"></a>
+<span class="sourceLineNo">6166</span><a name="line.6166"></a>
+<span class="sourceLineNo">6167</span>    edge.setValue(1); // clock goes back<a name="line.6167"></a>
+<span class="sourceLineNo">6168</span>    p = new Put(row);<a name="line.6168"></a>
+<span class="sourceLineNo">6169</span>    p.setDurability(Durability.SKIP_WAL);<a name="line.6169"></a>
+<span class="sourceLineNo">6170</span>    p.addColumn(fam1, qual1, qual2);<a name="line.6170"></a>
+<span class="sourceLineNo">6171</span>    RowMutations rm = new RowMutations(row);<a name="line.6171"></a>
+<span class="sourceLineNo">6172</span>    rm.add(p);<a name="line.6172"></a>
+<span class="sourceLineNo">6173</span>    assertTrue(region.checkAndRowMutate(row, fam1, qual1, CompareOperator.EQUAL,<a name="line.6173"></a>
+<span class="sourceLineNo">6174</span>        new BinaryComparator(qual1), rm));<a name="line.6174"></a>
+<span class="sourceLineNo">6175</span>    result = region.get(new Get(row));<a name="line.6175"></a>
+<span class="sourceLineNo">6176</span>    c = result.getColumnLatestCell(fam1, qual1);<a name="line.6176"></a>
+<span class="sourceLineNo">6177</span>    assertEquals(10L, c.getTimestamp());<a name="line.6177"></a>
+<span class="sourceLineNo">6178</span>    LOG.info("c value " +<a name="line.6178"></a>
+<span class="sourceLineNo">6179</span>      Bytes.toStringBinary(c.getValueArray(), c.getValueOffset(), c.getValueLength()));<a name="line.6179"></a>
 <span class="sourceLineNo">6180</span><a name="line.6180"></a>
-<span class="sourceLineNo">6181</span>  /**<a name="line.6181"></a>
-<span class="sourceLineNo">6182</span>   * HBASE-16429 Make sure no stuck if roll writer when ring buffer is filled with appends<a name="line.6182"></a>
-<span class="sourceLineNo">6183</span>   * @throws IOException if IO error occurred during test<a name="line.6183"></a>
-<span class="sourceLineNo">6184</span>   */<a name="line.6184"></a>
-<span class="sourceLineNo">6185</span>  @Test<a name="line.6185"></a>
-<span class="sourceLineNo">6186</span>  public void testWritesWhileRollWriter() throws IOException {<a name="line.6186"></a>
-<span class="sourceLineNo">6187</span>    int testCount = 10;<a name="line.6187"></a>
-<span class="sourceLineNo">6188</span>    int numRows = 1024;<a name="line.6188"></a>
-<span class="sourceLineNo">6189</span>    int numFamilies = 2;<a name="line.6189"></a>
-<span class="sourceLineNo">6190</span>    int numQualifiers = 2;<a name="line.6190"></a>
-<span class="sourceLineNo">6191</span>    final byte[][] families = new byte[numFamilies][];<a name="line.6191"></a>
-<span class="sourceLineNo">6192</span>    for (int i = 0; i &lt; numFamilies; i++) {<a name="line.6192"></a>
-<span class="sourceLineNo">6193</span>      families[i] = Bytes.toBytes("family" + i);<a name="line.6193"></a>
-<span class="sourceLineNo">6194</span>    }<a name="line.6194"></a>
-<span class="sourceLineNo">6195</span>    final byte[][] qualifiers = new byte[numQualifiers][];<a name="line.6195"></a>
-<span class="sourceLineNo">6196</span>    for (int i = 0; i &lt; numQualifiers; i++) {<a name="line.6196"></a>
-<span class="sourceLineNo">6197</span>      qualifiers[i] = Bytes.toBytes("qual" + i);<a name="line.6197"></a>
-<span class="sourceLineNo">6198</span>    }<a name="line.6198"></a>
-<span class="sourceLineNo">6199</span><a name="line.6199"></a>
-<span class="sourceLineNo">6200</span>    CONF.setInt("hbase.regionserver.wal.disruptor.event.count", 2);<a name="line.6200"></a>
-<span class="sourceLineNo">6201</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.6201"></a>
-<span class="sourceLineNo">6202</span>    try {<a name="line.6202"></a>
-<span class="sourceLineNo">6203</span>      List&lt;Thread&gt; threads = new ArrayList&lt;&gt;();<a name="line.6203"></a>
-<span class="sourceLineNo">6204</span>      for (int i = 0; i &lt; numRows; i++) {<a name="line.6204"></a>
-<span class="sourceLineNo">6205</span>        final int count = i;<a name="line.6205"></a>
-<span class="sourceLineNo">6206</span>        Thread t = new Thread(new Runnable() {<a name="line.6206"></a>
-<span class="sourceLineNo">6207</span><a name="line.6207"></a>
-<span class="sourceLineNo">6208</span>          @Override<a name="line.6208"></a>
-<span class="sourceLineNo">6209</span>          public void run() {<a name="line.6209"></a>
-<span class="sourceLineNo">6210</span>            byte[] row = Bytes.toBytes("row" + count);<a name="line.6210"></a>
-<span class="sourceLineNo">6211</span>            Put put = new Put(row);<a name="line.6211"></a>
-<span class="sourceLineNo">6212</span>            put.setDurability(Durability.SYNC_WAL);<a name="line.6212"></a>
-<span class="sourceLineNo">6213</span>            byte[] value = Bytes.toBytes(String.valueOf(count));<a name="line.6213"></a>
-<span class="sourceLineNo">6214</span>            for (byte[] family : families) {<a name="line.6214"></a>
-<span class="sourceLineNo">6215</span>              for (byte[] qualifier : qualifiers) {<a name="line.6215"></a>
-<span class="sourceLineNo">6216</span>                put.addColumn(family, qualifier, count, value);<a name="line.6216"></a>
-<span class="sourceLineNo">6217</span>              }<a name="line.6217"></a>
-<span class="sourceLineNo">6218</span>            }<a name="line.6218"></a>
-<span class="sourceLineNo">6219</span>            try {<a name="line.6219"></a>
-<span class="sourceLineNo">6220</span>              region.put(put);<a name="line.6220"></a>
-<span class="sourceLineNo">6221</span>            } catch (IOException e) {<a name="line.6221"></a>
-<span class="sourceLineNo">6222</span>              throw new RuntimeException(e);<a name="line.6222"></a>
-<span class="sourceLineNo">6223</span>            }<a name="line.6223"></a>
-<span class="sourceLineNo">6224</span>          }<a name="line.6224"></a>
-<span class="sourceLineNo">6225</span>        });<a name="line.6225"></a>
-<span class="sourceLineNo">6226</span>        threads.add(t);<a name="line.6226"></a>
-<span class="sourceLineNo">6227</span>      }<a name="line.6227"></a>
-<span class="sourceLineNo">6228</span>      for (Thread t : threads) {<a name="line.6228"></a>
-<span class="sourceLineNo">6229</span>        t.start();<a name="line.6229"></a>
-<span class="sourceLineNo">6230</span>      }<a name="line.6230"></a>
-<span class="sourceLineNo">6231</span><a name="line.6231"></a>
-<span class="sourceLineNo">6232</span>      for (int i = 0; i &lt; testCount; i++) {<a name="line.6232"></a>
-<span class="sourceLineNo">6233</span>        region.getWAL().rollWriter();<a name="line.6233"></a>
-<span class="sourceLineNo">6234</span>        Thread.yield();<a name="line.6234"></a>
-<span class="sourceLineNo">6235</span>      }<a name="line.6235"></a>
-<span class="sourceLineNo">6236</span>    } finally {<a name="line.6236"></a>
-<span class="sourceLineNo">6237</span>      try {<a name="line.6237"></a>
-<span class="sourceLineNo">6238</span>        HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.6238"></a>
-<span class="sourceLineNo">6239</span>        CONF.setInt("hbase.regionserver.wal.disruptor.event.count", 16 * 1024);<a name="line.6239"></a>
-<span class="sourceLineNo">6240</span>      } catch (DroppedSnapshotException dse) {<a name="line.6240"></a>
-<span class="sourceLineNo">6241</span>        // We could get this on way out because we interrupt the background flusher and it could<a name="line.6241"></a>
-<span class="sourceLineNo">6242</span>        // fail anywhere causing a DSE over in the background flusher... only it is not properly<a name="line.6242"></a>
-<span class="sourceLineNo">6243</span>        // dealt with so could still be memory hanging out when we get to here -- memory we can't<a name="line.6243"></a>
-<span class="sourceLineNo">6244</span>        // flush because the accounting is 'off' since original DSE.<a name="line.6244"></a>
+<span class="sourceLineNo">6181</span>    assertTrue(Bytes.equals(c.getValueArray(), c.getValueOffset(), c.getValueLength(),<a name="line.6181"></a>
+<span class="sourceLineNo">6182</span>      qual2, 0, qual2.length));<a name="line.6182"></a>
+<span class="sourceLineNo">6183</span>  }<a name="line.6183"></a>
+<span class="sourceLineNo">6184</span><a name="line.6184"></a>
+<span class="sourceLineNo">6185</span>  HRegion initHRegion(TableName tableName, String callingMethod,<a name="line.6185"></a>
+<span class="sourceLineNo">6186</span>      byte[]... families) throws IOException {<a name="line.6186"></a>
+<span class="sourceLineNo">6187</span>    return initHRegion(tableName, callingMethod, HBaseConfiguration.create(),<a name="line.6187"></a>
+<span class="sourceLineNo">6188</span>        families);<a name="line.6188"></a>
+<span class="sourceLineNo">6189</span>  }<a name="line.6189"></a>
+<span class="sourceLineNo">6190</span><a name="line.6190"></a>
+<span class="sourceLineNo">6191</span>  /**<a name="line.6191"></a>
+<span class="sourceLineNo">6192</span>   * HBASE-16429 Make sure no stuck if roll writer when ring buffer is filled with appends<a name="line.6192"></a>
+<span class="sourceLineNo">6193</span>   * @throws IOException if IO error occurred during test<a name="line.6193"></a>
+<span class="sourceLineNo">6194</span>   */<a name="line.6194"></a>
+<span class="sourceLineNo">6195</span>  @Test<a name="line.6195"></a>
+<span class="sourceLineNo">6196</span>  public void testWritesWhileRollWriter() throws IOException {<a name="line.6196"></a>
+<span class="sourceLineNo">6197</span>    int testCount = 10;<a name="line.6197"></a>
+<span class="sourceLineNo">6198</span>    int numRows = 1024;<a name="line.6198"></a>
+<span class="sourceLineNo">6199</span>    int numFamilies = 2;<a name="line.6199"></a>
+<span class="sourceLineNo">6200</span>    int numQualifiers = 2;<a name="line.6200"></a>
+<span class="sourceLineNo">6201</span>    final byte[][] families = new byte[numFamilies][];<a name="line.6201"></a>
+<span class="sourceLineNo">6202</span>    for (int i = 0; i &lt; numFamilies; i++) {<a name="line.6202"></a>
+<span class="sourceLineNo">6203</span>      families[i] = Bytes.toBytes("family" + i);<a name="line.6203"></a>
+<span class="sourceLineNo">6204</span>    }<a name="line.6204"></a>
+<span class="sourceLineNo">6205</span>    final byte[][] qualifiers = new byte[numQualifiers][];<a name="line.6205"></a>
+<span class="sourceLineNo">6206</span>    for (int i = 0; i &lt; numQualifiers; i++) {<a name="line.6206"></a>
+<span class="sourceLineNo">6207</span>      qualifiers[i] = Bytes.toBytes("qual" + i);<a name="line.6207"></a>
+<span class="sourceLineNo">6208</span>    }<a name="line.6208"></a>
+<span class="sourceLineNo">6209</span><a name="line.6209"></a>
+<span class="sourceLineNo">6210</span>    CONF.setInt("hbase.regionserver.wal.disruptor.event.count", 2);<a name="line.6210"></a>
+<span class="sourceLineNo">6211</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.6211"></a>
+<span class="sourceLineNo">6212</span>    try {<a name="line.6212"></a>
+<span class="sourceLineNo">6213</span>      List&lt;Thread&gt; threads = new ArrayList&lt;&gt;();<a name="line.6213"></a>
+<span class="sourceLineNo">6214</span>      for (int i = 0; i &lt; numRows; i++) {<a name="line.6214"></a>
+<span class="sourceLineNo">6215</span>        final int count = i;<a name="line.6215"></a>
+<span class="sourceLineNo">6216</span>        Thread t = new Thread(new Runnable() {<a name="line.6216"></a>
+<span class="sourceLineNo">6217</span><a name="line.6217"></a>
+<span class="sourceLineNo">6218</span>          @Override<a name="line.6218"></a>
+<span class="sourceLineNo">6219</span>          public void run() {<a name="line.6219"></a>
+<span class="sourceLineNo">6220</span>            byte[] row = Bytes.toBytes("row" + count);<a name="line.6220"></a>
+<span class="sourceLineNo">6221</span>            Put put = new Put(row);<a name="line.6221"></a>
+<span class="sourceLineNo">6222</span>            put.setDurability(Durability.SYNC_WAL);<a name="line.6222"></a>
+<span class="sourceLineNo">6223</span>            byte[] value = Bytes.toBytes(String.valueOf(count));<a name="line.6223"></a>
+<span class="sourceLineNo">6224</span>            for (byte[] family : families) {<a name="line.6224"></a>
+<span class="sourceLineNo">6225</span>              for (byte[] qualifier : qualifiers) {<a name="line.6225"></a>
+<span class="sourceLineNo">6226</span>                put.addColumn(family, qualifier, count, value);<a name="line.6226"></a>
+<span class="sourceLineNo">6227</span>              }<a name="line.6227"></a>
+<span class="sourceLineNo">6228</span>            }<a name="line.6228"></a>
+<span class="sourceLineNo">6229</span>            try {<a name="line.6229"></a>
+<span class="sourceLineNo">6230</span>              region.put(put);<a name="line.6230"></a>
+<span class="sourceLineNo">6231</span>            } catch (IOException e) {<a name="line.6231"></a>
+<span class="sourceLineNo">6232</span>              throw new RuntimeException(e);<a name="line.6232"></a>
+<span class="sourceLineNo">6233</span>            }<a name="line.6233"></a>
+<span class="sourceLineNo">6234</span>          }<a name="line.6234"></a>
+<span class="sourceLineNo">6235</span>        });<a name="line.6235"></a>
+<span class="sourceLineNo">6236</span>        threads.add(t);<a name="line.6236"></a>
+<span class="sourceLineNo">6237</span>      }<a name="line.6237"></a>
+<span class="sourceLineNo">6238</span>      for (Thread t : threads) {<a name="line.6238"></a>
+<span class="sourceLineNo">6239</span>        t.start();<a name="line.6239"></a>
+<span class="sourceLineNo">6240</span>      }<a name="line.6240"></a>
+<span class="sourceLineNo">6241</span><a name="line.6241"></a>
+<span class="sourceLineNo">6242</span>      for (int i = 0; i &lt; testCount; i++) {<a name="line.6242"></a>
+<span class="sourceLineNo">6243</span>        region.getWAL().rollWriter();<a name="line.6243"></a>
+<span class="sourceLineNo">6244</span>        Thread.yield();<a name="line.6244"></a>
 <span class="sourceLineNo">6245</span>      }<a name="line.6245"></a>
-<span class="sourceLineNo">6246</span>      this.region = null;<a name="line.6246"></a>
-<span class="sourceLineNo">6247</span>    }<a name="line.6247"></a>
-<span class="sourceLineNo">6248</span>  }<a name="line.6248"></a>
-<span class="sourceLineNo">6249</span><a name="line.6249"></a>
-<span class="sourceLineNo">6250</span>  @Test<a name="line.6250"></a>
-<span class="sourceLineNo">6251</span>  public void testMutateRow_WriteRequestCount() throws Exception {<a name="line.6251"></a>
-<span class="sourceLineNo">6252</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.6252"></a>
-<span class="sourceLineNo">6253</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.6253"></a>
-<span class="sourceLineNo">6254</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.6254"></a>
-<span class="sourceLineNo">6255</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.6255"></a>
-<span class="sourceLineNo">6256</span><a name="line.6256"></a>
-<span class="sourceLineNo">6257</span>    RowMutations rm = new RowMutations(row1);<a name="line.6257"></a>
-<span class="sourceLineNo">6258</span>    Put put = new Put(row1);<a name="line.6258"></a>
-<span class="sourceLineNo">6259</span>    put.addColumn(fam1, qf1, val1);<a name="line.6259"></a>
-<span class="sourceLineNo">6260</span>    rm.add(put);<a name="line.6260"></a>
-<span class="sourceLineNo">6261</span><a name="line.6261"></a>
-<span class="sourceLineNo">6262</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.6262"></a>
-<span class="sourceLineNo">6263</span>    long wrcBeforeMutate = this.region.writeRequestsCount.longValue();<a name="line.6263"></a>
-<span class="sourceLineNo">6264</span>    this.region.mutateRow(rm);<a name="line.6264"></a>
-<span class="sourceLineNo">6265</span>    long wrcAfterMutate = this.region.writeRequestsCount.longValue();<a name="line.6265"></a>
-<span class="sourceLineNo">6266</span>    Assert.assertEquals(wrcBeforeMutate + rm.getMutations().size(), wrcAfterMutate);<a name="line.6266"></a>
-<span class="sourceLineNo">6267</span>  }<a name="line.6267"></a>
-<span class="sourceLineNo">6268</span><a name="line.6268"></a>
-<span class="sourceLineNo">6269</span>  @Test<a name="line.6269"></a>
-<span class="sourceLineNo">6270</span>  public void testBulkLoadReplicationEnabled() throws IOException {<a name="line.6270"></a>
-<span class="sourceLineNo">6271</span>    TEST_UTIL.getConfiguration().setBoolean(HConstants.REPLICATION_BULKLOAD_ENABLE_KEY, true);<a name="line.6271"></a>
-<span class="sourceLineNo">6272</span>    final ServerName serverName = ServerName.valueOf(name.getMethodName(), 100, 42);<a name="line.6272"></a>
-<span class="sourceLineNo">6273</span>    final RegionServerServices rss = spy(TEST_UTIL.createMockRegionServerService(serverName));<a name="line.6273"></a>
-<span class="sourceLineNo">6274</span><a name="line.6274"></a>
-<span class="sourceLineNo">6275</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.6275"></a>
-<span class="sourceLineNo">6276</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.6276"></a>
-<span class="sourceLineNo">6277</span>    HRegionInfo hri = new HRegionInfo(htd.getTableName(),<a name="line.6277"></a>
-<span class="sourceLineNo">6278</span>        HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY);<a name="line.6278"></a>
-<span class="sourceLineNo">6279</span>    region = HRegion.openHRegion(hri, htd, rss.getWAL(hri), TEST_UTIL.getConfiguration(),<a name="line.6279"></a>
-<span class="sourceLineNo">6280</span>        rss, null);<a name="line.6280"></a>
-<span class="sourceLineNo">6281</span><a name="line.6281"></a>
-<span class="sourceLineNo">6282</span>    assertTrue(region.conf.getBoolean(HConstants.REPLICATION_BULKLOAD_ENABLE_KEY, false));<a name="line.6282"></a>
-<span class="sourceLineNo">6283</span>    String plugins = region.conf.get(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY, "");<a name="line.6283"></a>
-<span class="sourceLineNo">6284</span>    String replicationCoprocessorClass = ReplicationObserver.class.getCanonicalName();<a name="line.6284"></a>
-<span class="sourceLineNo">6285</span>    assertTrue(plugins.contains(replicationCoprocessorClass));<a name="line.6285"></a>
-<span class="sourceLineNo">6286</span>    assertTrue(region.getCoprocessorHost().<a name="line.6286"></a>
-<span class="sourceLineNo">6287</span>        getCoprocessors().contains(ReplicationObserver.class.getSimpleName()));<a name="line.6287"></a>
-<span class="sourceLineNo">6288</span>  }<a name="line.6288"></a>
-<span class="sourceLineNo">6289</span><a name="line.6289"></a>
-<span class="sourceLineNo">6290</span>  // make sure region is success close when coprocessor wrong region open failed<a name="line.6290"></a>
-<span class="sourceLineNo">6291</span>  @Test<a name="line.6291"></a>
-<span class="sourceLineNo">6292</span>  public void testOpenRegionFailedMemoryLeak() throws Exception {<a name="line.6292"></a>
-<span class="sourceLineNo">6293</span>    final ServerName serverName = ServerName.valueOf("testOpenRegionFailed", 100, 42);<a name="line.6293"></a>
-<span class="sourceLineNo">6294</span>    final RegionServerServices rss = spy(TEST_UTIL.createMockRegionServerService(serverName));<a name="line.6294"></a>
-<span class="sourceLineNo">6295</span><a name="line.6295"></a>
-<span class="sourceLineNo">6296</span>    HTableDescriptor htd<a name="line.6296"></a>
-<span class="sourceLineNo">6297</span>      = new HTableDescriptor(TableName.valueOf("testOpenRegionFailed"));<a name="line.6297"></a>
-<span class="sourceLineNo">6298</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.6298"></a>
-<span class="sourceLineNo">6299</span>    htd.setValue("COPROCESSOR$1", "hdfs://test/test.jar|test||");<a name="line.6299"></a>
-<span class="sourceLineNo">6300</span><a name="line.6300"></a>
-<span class="sourceLineNo">6301</span>    HRegionInfo hri = new HRegionInfo(htd.getTableName(),<a name="line.6301"></a>
-<span class="sourceLineNo">6302</span>      HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY);<a name="line.6302"></a>
-<span class="sourceLineNo">6303</span>    ScheduledExecutorService executor = CompatibilitySingletonFactory.<a name="line.6303"></a>
-<span class="sourceLineNo">6304</span>      getInstance(MetricsExecutor.class).getExecutor();<a name="line.6304"></a>
-<span class="sourceLineNo">6305</span>    for (int i = 0; i &lt; 20 ; i++) {<a name="line.6305"></a>
-<span class="sourceLineNo">6306</span>      try {<a name="line.6306"></a>
-<span class="sourceLineNo">6307</span>        HRegion.openHRegion(hri, htd, rss.getWAL(hri),<a name="line.6307"></a>
-<span class="sourceLineNo">6308</span>          TEST_UTIL.getConfiguration(), rss, null);<a name="line.6308"></a>
-<span class="sourceLineNo">6309</span>      }catch(Throwable t){<a name="line.6309"></a>
-<span class="sourceLineNo">6310</span>        LOG.info("Expected exception, continue");<a name="line.6310"></a>
-<span class="sourceLineNo">6311</span>      }<a name="line.6311"></a>
-<span class="sourceLineNo">6312</span>    }<a name="line.6312"></a>
-<span class="sourceLineNo">6313</span>    TimeUnit.SECONDS.sleep(MetricsRegionWrapperImpl.PERIOD);<a name="line.6313"></a>
-<span class="sourceLineNo">6314</span>    Field[] fields = ThreadPoolExecutor.class.getDeclaredFields();<a name="line.6314"></a>
-<span class="sourceLineNo">6315</span>    boolean found = false;<a name="line.6315"></a>
-<span class="sourceLineNo">6316</span>    for(Field field : fields){<a name="line.6316"></a>
-<span class="sourceLineNo">6317</span>      if(field.getName().equals("workQueue")){<a name="line.6317"></a>
-<span class="sourceLineNo">6318</span>        field.setAccessible(true);<a name="line.6318"></a>
-<span class="sourceLineNo">6319</span>        BlockingQueue&lt;Runnable&gt; workQueue = (BlockingQueue&lt;Runnable&gt;)field.get(executor);<a name="line.6319"></a>
-<span class="sourceLineNo">6320</span>        //there are still two task not cancel, can not cause to memory lack<a name="line.6320"></a>
-<span class="sourceLineNo">6321</span>        Assert.assertTrue("ScheduledExecutor#workQueue should equals 2, now is " +<a name="line.6321"></a>
-<span class="sourceLineNo">6322</span>          workQueue.size() + ", please check region is close", 2 == workQueue.size());<a name="line.6322"></a>
-<span class="sourceLineNo">6323</span>        found = true;<a name="line.6323"></a>
-<span class="sourceLineNo">6324</span>      }<a name="line.6324"></a>
-<span class="sourceLineNo">6325</span>    }<a name="line.6325"></a>
-<span class="sourceLineNo">6326</span>    Assert.assertTrue("can not find workQueue, test failed", found);<a name="line.6326"></a>
-<span class="sourceLineNo">6327</span>  }<a name="line.6327"></a>
-<span class="sourceLineNo">6328</span><a name="line.6328"></a>
-<span class="sourceLineNo">6329</span>  /**<a name="line.6329"></a>
-<span class="sourceLineNo">6330</span>   * The same as HRegion class, the only difference is that instantiateHStore will<a name="line.6330"></a>
-<span class="sourceLineNo">6331</span>   * create a different HStore - HStoreForTesting. [HBASE-8518]<a name="line.6331"></a>
-<span class="sourceLineNo">6332</span>   */<a name="line.6332"></a>
-<span class="sourceLineNo">6333</span>  public static class HRegionForTesting extends HRegion {<a name="line.6333"></a>
-<span class="sourceLineNo">6334</span><a name="line.6334"></a>
-<span class="sourceLineNo">6335</span>    public HRegionForTesting(final Path tableDir, final WAL wal, final FileSystem fs,<a name="line.6335"></a>
-<span class="sourceLineNo">6336</span>                             final Configuration confParam, final RegionInfo regionInfo,<a name="line.6336"></a>
-<span class="sourceLineNo">6337</span>                             final TableDescriptor htd, final RegionServerServices rsServices) {<a name="line.6337"></a>
-<span class="sourceLineNo">6338</span>      this(new HRegionFileSystem(confParam, fs, tableDir, regionInfo),<a name="line.6338"></a>
-<span class="sourceLineNo">6339</span>          wal, confParam, htd, rsServices);<a name="line.6339"></a>
-<span class="sourceLineNo">6340</span>    }<a name="line.6340"></a>
-<span class="sourceLineNo">6341</span><a name="line.6341"></a>
-<span class="sourceLineNo">6342</span>    public HRegionForTesting(HRegionFileSystem fs, WAL wal,<a name="line.6342"></a>
-<span class="sourceLineNo">6343</span>                             Configuration confParam, TableDescriptor htd,<a name="line.6343"></a>
-<span class="sourceLineNo">6344</span>                             RegionServerServices rsServices) {<a name="line.6344"></a>
-<span class="sourceLineNo">6345</span>      super(fs, wal, confParam, htd, rsServices);<a name="line.6345"></a>
-<span class="sourceLineNo">6346</span>    }<a name="line.6346"></a>
-<span class="sourceLineNo">6347</span><a name="line.6347"></a>
-<span class="sourceLineNo">6348</span>    /**<a name="line.6348"></a>
-<span class="sourceLineNo">6349</span>     * Create HStore instance.<a name="line.6349"></a>
-<span class="sourceLineNo">6350</span>     * @return If Mob is enabled, return HMobStore, otherwise return HStoreForTesting.<a name="line.6350"></a>
-<span class="sourceLineNo">6351</span>     */<a name="line.6351"></a>
-<span class="sourceLineNo">6352</span>    @Override<a name="line.6352"></a>
-<span class="sourceLineNo">6353</span>    protected HStore instantiateHStore(final ColumnFamilyDescriptor family, boolean warmup)<a name="line.6353"></a>
-<span class="sourceLineNo">6354</span>        throws IOException {<a name="line.6354"></a>
-<span class="sourceLineNo">6355</span>      if (family.isMobEnabled()) {<a name="line.6355"></a>
-<span class="sourceLineNo">6356</span>        if (HFile.getFormatVersion(this.conf) &lt; HFile.MIN_FORMAT_VERSION_WITH_TAGS) {<a name="line.6356"></a>
-<span class="sourceLineNo">6357</span>          throw new IOException("A minimum HFile version of " + HFile.MIN_FORMAT_VERSION_WITH_TAGS +<a name="line.6357"></a>
-<span class="sourceLineNo">6358</span>              " is required for MOB feature. Consider setting " + HFile.FORMAT_VERSION_KEY +<a name="line.6358"></a>
-<span class="sourceLineNo">6359</span>              " accordingly.");<a name="line.6359"></a>
-<span class="sourceLineNo">6360</span>        }<a name="line.6360"></a>
-<span class="sourceLineNo">6361</span>        return new HMobStore(this, family, this.conf, warmup);<a name="line.6361"></a>
-<span class="sourceLineNo">6362</span>      }<a name="line.6362"></a>
-<span class="sourceLineNo">6363</span>      return new HStoreForTesting(this, family, this.conf, warmup);<a name="line.6363"></a>
-<span class="sourceLineNo">6364</span>    }<a name="line.6364"></a>
-<span class="sourceLineNo">6365</span>  }<a name="line.6365"></a>
-<span class="sourceLineNo">6366</span><a name="line.6366"></a>
-<span class="sourceLineNo">6367</span>  /**<a name="line.6367"></a>
-<span class="sourceLineNo">6368</span>   * HStoreForTesting is merely the same as HStore, the difference is in the doCompaction method<a name="line.6368"></a>
-<span class="sourceLineNo">6369</span>   * of HStoreForTesting there is a checkpoint "hbase.hstore.compaction.complete" which<a name="line.6369"></a>
-<span class="sourceLineNo">6370</span>   * doesn't let hstore compaction complete. In the former edition, this config is set in<a name="line.6370"></a>
-<span class="sourceLineNo">6371</span>   * HStore class inside compact method, though this is just for testing, otherwise it<a name="line.6371"></a>
-<span class="sourceLineNo">6372</span>   * doesn't do any help. In HBASE-8518, we try to get rid of all "hbase.hstore.compaction.complete"<a name="line.6372"></a>
-<span class="sourceLineNo">6373</span>   * config (except for testing code).<a name="line.6373"></a>
-<span class="sourceLineNo">6374</span>   */<a name="line.6374"></a>
-<span class="sourceLineNo">6375</span>  public static class HStoreForTesting extends HStore {<a name="line.6375"></a>
+<span class="sourceLineNo">6246</span>    } finally {<a name="line.6246"></a>
+<span class="sourceLineNo">6247</span>      try {<a name="line.6247"></a>
+<span class="sourceLineNo">6248</span>        HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.6248"></a>
+<span class="sourceLineNo">6249</span>        CONF.setInt("hbase.regionserver.wal.disruptor.event.count", 16 * 1024);<a name="line.6249"></a>
+<span class="sourceLineNo">6250</span>      } catch (DroppedSnapshotException dse) {<a name="line.6250"></a>
+<span class="sourceLineNo">6251</span>        // We could get this on way out because we interrupt the background flusher and it could<a name="line.6251"></a>
+<span class="sourceLineNo">6252</span>        // fail anywhere causing a DSE over in the background flusher... only it is not properly<a name="line.6252"></a>
+<span class="sourceLineNo">6253</span>        // dealt with so could still be memory hanging out when we get to here -- memory we can't<a name="line.6253"></a>
+<span class="sourceLineNo">6254</span>        // flush because the accounting is 'off' since original DSE.<a name="line.6254"></a>
+<span class="sourceLineNo">6255</span>      }<a name="line.6255"></a>
+<span class="sourceLineNo">6256</span>      this.region = null;<a name="line.6256"></a>
+<span class="sourceLineNo">6257</span>    }<a name="line.6257"></a>
+<span class="sourceLineNo">6258</span>  }<a name="line.6258"></a>
+<span class="sourceLineNo">6259</span><a name="line.6259"></a>
+<span class="sourceLineNo">6260</span>  @Test<a name="line.6260"></a>
+<span class="sourceLineNo">6261</span>  public void testMutateRow_WriteRequestCount() throws Exception {<a name="line.6261"></a>
+<span class="sourceLineNo">6262</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.6262"></a>
+<span class="sourceLineNo">6263</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.6263"></a>
+<span class="sourceLineNo">6264</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.6264"></a>
+<span class="sourceLineNo">6265</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.6265"></a>
+<span class="sourceLineNo">6266</span><a name="line.6266"></a>
+<span class="sourceLineNo">6267</span>    RowMutations rm = new RowMutations(row1);<a name="line.6267"></a>
+<span class="sourceLineNo">6268</span>    Put put = new Put(row1);<a name="line.6268"></a>
+<span class="sourceLineNo">6269</span>    put.addColumn(fam1, qf1, val1);<a name="line.6269"></a>
+<span class="sourceLineNo">6270</span>    rm.add(put);<a name="line.6270"></a>
+<span class="sourceLineNo">6271</span><a name="line.6271"></a>
+<span class="sourceLineNo">6272</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.6272"></a>
+<span class="sourceLineNo">6273</span>    long wrcBeforeMutate = this.region.writeRequestsCount.longValue();<a name="line.6273"></a>
+<span class="sourceLineNo">6274</span>    this.region.mutateRow(rm);<a name="line.6274"></a>
+<span class="sourceLineNo">6275</span>    long wrcAfterMutate = this.region.writeRequestsCount.longValue();<a name="line.6275"></a>
+<span class="sourceLineNo">6276</span>    Assert.assertEquals(wrcBeforeMutate + rm.getMutations().size(), wrcAfterMutate);<a name="line.6276"></a>
+<span class="sourceLineNo">6277</span>  }<a name="line.6277"></a>
+<span class="sourceLineNo">6278</span><a name="line.6278"></a>
+<span class="sourceLineNo">6279</span>  @Test<a name="line.6279"></a>
+<span class="sourceLineNo">6280</span>  public void testBulkLoadReplicationEnabled() throws IOException {<a name="line.6280"></a>
+<span class="sourceLineNo">6281</span>    TEST_UTIL.getConfiguration().setBoolean(HConstants.REPLICATION_BULKLOAD_ENABLE_KEY, true);<a name="line.6281"></a>
+<span class="sourceLineNo">6282</span>    final ServerName serverName = ServerName.valueOf(name.getMethodName(), 100, 42);<a name="line.6282"></a>
+<span class="sourceLineNo">6283</span>    final RegionServerServices rss = spy(TEST_UTIL.createMockRegionServerService(serverName));<a name="line.6283"></a>
+<span class="sourceLineNo">6284</span><a name="line.6284"></a>
+<span class="sourceLineNo">6285</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.6285"></a>
+<span class="sourceLineNo">6286</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.6286"></a>
+<span class="sourceLineNo">6287</span>    HRegionInfo hri = new HRegionInfo(htd.getTableName(),<a name="line.6287"></a>
+<span class="sourceLineNo">6288</span>        HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY);<a name="line.6288"></a>
+<span class="sourceLineNo">6289</span>    region = HRegion.openHRegion(hri, htd, rss.getWAL(hri), TEST_UTIL.getConfiguration(),<a name="line.6289"></a>
+<span class="sourceLineNo">6290</span>        rss, null);<a name="line.6290"></a>
+<span class="sourceLineNo">6291</span><a name="line.6291"></a>
+<span class="sourceLineNo">6292</span>    assertTrue(region.conf.getBoolean(HConstants.REPLICATION_BULKLOAD_ENABLE_KEY, false));<a name="line.6292"></a>
+<span class="sourceLineNo">6293</span>    String plugins = region.conf.get(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY, "");<a name="line.6293"></a>
+<span class="sourceLineNo">6294</span>    String replicationCoprocessorClass = ReplicationObserver.class.getCanonicalName();<a name="line.6294"></a>
+<span class="sourceLineNo">6295</span>    assertTrue(plugins.contains(replicationCoprocessorClass));<a name="line.6295"></a>
+<span class="sourceLineNo">6296</span>    assertTrue(region.getCoprocessorHost().<a name="line.6296"></a>
+<span class="sourceLineNo">6297</span>        getCoprocessors().contains(ReplicationObserver.class.getSimpleName()));<a name="line.6297"></a>
+<span class="sourceLineNo">6298</span>  }<a name="line.6298"></a>
+<span class="sourceLineNo">6299</span><a name="line.6299"></a>
+<span class="sourceLineNo">6300</span>  // make sure region is success close when coprocessor wrong region open failed<a name="line.6300"></a>
+<span class="sourceLineNo">6301</span>  @Test<a name="line.6301"></a>
+<span class="sourceLineNo">6302</span>  public void testOpenRegionFailedMemoryLeak() throws Exception {<a name="line.6302"></a>
+<span class="sourceLineNo">6303</span>    final ServerName serverName = ServerName.valueOf("testOpenRegionFailed", 100, 42);<a name="line.6303"></a>
+<span class="sourceLineNo">6304</span>    final RegionServerServices rss = spy(TEST_UTIL.createMockRegionServerService(serverName));<a name="line.6304"></a>
+<span class="sourceLineNo">6305</span><a name="line.6305"></a>
+<span class="sourceLineNo">6306</span>    HTableDescriptor htd<a name="line.6306"></a>
+<span class="sourceLineNo">6307</span>      = new HTableDescriptor(TableName.valueOf("testOpenRegionFailed"));<a name="line.6307"></a>
+<span class="sourceLineNo">6308</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.6308"></a>
+<span class="sourceLineNo">6309</span>    htd.setValue("COPROCESSOR$1", "hdfs://test/test.jar|test||");<a name="line.6309"></a>
+<span class="sourceLineNo">6310</span><a name="line.6310"></a>
+<span class="sourceLineNo">6311</span>    HRegionInfo hri = new HRegionInfo(htd.getTableName(),<a name="line.6311"></a>
+<span class="sourceLineNo">6312</span>      HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY);<a name="line.6312"></a>
+<span class="sourceLineNo">6313</span>    ScheduledExecutorService executor = CompatibilitySingletonFactory.<a name="line.6313"></a>
+<span class="sourceLineNo">6314</span>      getInstance(MetricsExecutor.class).getExecutor();<a name="line.6314"></a>
+<span class="sourceLineNo">6315</span>    for (int i = 0; i &lt; 20 ; i++) {<a name="line.6315"></a>
+<span class="sourceLineNo">6316</span>      try {<a name="line.6316"></a>
+<span class="sourceLineNo">6317</span>        HRegion.openHRegion(hri, htd, rss.getWAL(hri),<a name="line.6317"></a>
+<span class="sourceLineNo">6318</span>          TEST_UTIL.getConfiguration(), rss, null);<a name="line.6318"></a>
+<span class="sourceLineNo">6319</span>      }catch(Throwable t){<a name="line.6319"></a>
+<span class="sourceLineNo">6320</span>        LOG.info("Expected exception, continue");<a name="line.6320"></a>
+<span class="sourceLineNo">6321</span>      }<a name="line.6321"></a>
+<span class="sourceLineNo">6322</span>    }<a name="line.6322"></a>
+<span class="sourceLineNo">6323</span>    TimeUnit.SECONDS.sleep(MetricsRegionWrapperImpl.PERIOD);<a name="line.6323"></a>
+<span class="sourceLineNo">6324</span>    Field[] fields = ThreadPoolExecutor.class.getDeclaredFields();<a name="line.6324"></a>
+<span class="sourceLineNo">6325</span>    boolean found = false;<a name="line.6325"></a>
+<span class="sourceLineNo">6326</span>    for(Field field : fields){<a name="line.6326"></a>
+<span class="sourceLineNo">6327</span>      if(field.getName().equals("workQueue")){<a name="line.6327"></a>
+<span class="sourceLineNo">6328</span>        field.setAccessible(true);<a name="line.6328"></a>
+<span class="sourceLineNo">6329</span>        BlockingQueue&lt;Runnable&gt; workQueue = (BlockingQueue&lt;Runnable&gt;)field.get(executor);<a name="line.6329"></a>
+<span class="sourceLineNo">6330</span>        //there are still two task not cancel, can not cause to memory lack<a name="line.6330"></a>
+<span class="sourceLineNo">6331</span>        Assert.assertTrue("ScheduledExecutor#workQueue should equals 2, now is " +<a name="line.6331"></a>
+<span class="sourceLineNo">6332</span>          workQueue.size() + ", please check region is close", 2 == workQueue.size());<a name="line.6332"></a>
+<span class="sourceLineNo">6333</span>        found = true;<a name="line.6333"></a>
+<span class="sourceLineNo">6334</span>      }<a name="line.6334"></a>
+<span class="sourceLineNo">6335</span>    }<a name="line.6335"></a>
+<span class="sourceLineNo">6336</span>    Assert.assertTrue("can not find workQueue, test failed", found);<a name="line.6336"></a>
+<span class="sourceLineNo">6337</span>  }<a name="line.6337"></a>
+<span class="sourceLineNo">6338</span><a name="line.6338"></a>
+<span class="sourceLineNo">6339</span>  /**<a name="line.6339"></a>
+<span class="sourceLineNo">6340</span>   * The same as HRegion class, the only difference is that instantiateHStore will<a name="line.6340"></a>
+<span class="sourceLineNo">6341</span>   * create a different HStore - HStoreForTesting. [HBASE-8518]<a name="line.6341"></a>
+<span class="sourceLineNo">6342</span>   */<a name="line.6342"></a>
+<span class="sourceLineNo">6343</span>  public static class HRegionForTesting extends HRegion {<a name="line.6343"></a>
+<span class="sourceLineNo">6344</span><a name="line.6344"></a>
+<span class="sourceLineNo">6345</span>    public HRegionForTesting(final Path tableDir, final WAL wal, final FileSystem fs,<a name="line.6345"></a>
+<span class="sourceLineNo">6346</span>                             final Configuration confParam, final RegionInfo regionInfo,<a name="line.6346"></a>
+<span class="sourceLineNo">6347</span>                             final TableDescriptor htd, final RegionServerServices rsServices) {<a name="line.6347"></a>
+<span class="sourceLineNo">6348</span>      this(new HRegionFileSystem(confParam, fs, tableDir, regionInfo),<a name="line.6348"></a>
+<span class="sourceLineNo">6349</span>          wal, confParam, htd, rsServices);<a name="line.6349"></a>
+<span class="sourceLineNo">6350</span>    }<a name="line.6350"></a>
+<span class="sourceLineNo">6351</span><a name="line.6351"></a>
+<span class="sourceLineNo">6352</span>    public HRegionForTesting(HRegionFileSystem fs, WAL wal,<a name="line.6352"></a>
+<span class="sourceLineNo">6353</span>                             Configuration confParam, TableDescriptor htd,<a name="line.6353"></a>
+<span class="sourceLineNo">6354</span>                             RegionServerServices rsServices) {<a name="line.6354"></a>
+<span class="sourceLineNo">6355</span>      super(fs, wal, confParam, htd, rsServices);<a name="line.6355"></a>
+<span class="sourceLineNo">6356</span>    }<a name="line.6356"></a>
+<span class="sourceLineNo">6357</span><a name="line.6357"></a>
+<span class="sourceLineNo">6358</span>    /**<a name="line.6358"></a>
+<span class="sourceLineNo">6359</span>     * Create HStore instance.<a name="line.6359"></a>
+<span class="sourceLineNo">6360</span>     * @return If Mob is enabled, return HMobStore, otherwise return HStoreForTesting.<a name="line.6360"></a>
+<span class="sourceLineNo">6361</span>     */<a name="line.6361"></a>
+<span class="sourceLineNo">6362</span>    @Override<a name="line.6362"></a>
+<span class="sourceLineNo">6363</span>    protected HStore instantiateHStore(final ColumnFamilyDescriptor family, boolean warmup)<a name="line.6363"></a>
+<span class="sourceLineNo">6364</span>        throws IOException {<a name="line.6364"></a>
+<span class="sourceLineNo">6365</span>      if (family.isMobEnabled()) {<a name="line.6365"></a>
+<span class="sourceLineNo">6366</span>        if (HFile.getFormatVersion(this.conf) &lt; HFile.MIN_FORMAT_VERSION_WITH_TAGS) {<a name="line.6366"></a>
+<span class="sourceLineNo">6367</span>          throw new IOException("A minimum HFile version of " + HFile.MIN_FORMAT_VERSION_WITH_TAGS +<a name="line.6367"></a>
+<span class="sourceLineNo">6368</span>              " is required for MOB feature. Consider setting " + HFile.FORMAT_VERSION_KEY +<a name="line.6368"></a>
+<span class="sourceLineNo">6369</span>              " accordingly.");<a name="line.6369"></a>
+<span class="sourceLineNo">6370</span>        }<a name="line.6370"></a>
+<span class="sourceLineNo">6371</span>        return new HMobStore(this, family, this.conf, warmup);<a name="line.6371"></a>
+<span class="sourceLineNo">6372</span>      }<a name="line.6372"></a>
+<span class="sourceLineNo">6373</span>      return new HStoreForTesting(this, family, this.conf, warmup);<a name="line.6373"></a>
+<span class="sourceLineNo">6374</span>    }<a name="line.6374"></a>
+<span class="sourceLineNo">6375</span>  }<a name="line.6375"></a>
 <span class="sourceLineNo">6376</span><a name="line.6376"></a>
-<span class="sourceLineNo">6377</span>    protected HStoreForTesting(final HRegion region,<a name="line.6377"></a>
-<span class="sourceLineNo">6378</span>        final ColumnFamilyDescriptor family,<a name="line.6378"></a>
-<span class="sourceLineNo">6379</span>        final Configuration confParam, boolean warmup) throws IOException {<a name="line.6379"></a>
-<span class="sourceLineNo">6380</span>      super(region, family, confParam, warmup);<a name="line.6380"></a>
-<span class="sourceLineNo">6381</span>    }<a name="line.6381"></a>
-<span class="sourceLineNo">6382</span><a name="line.6382"></a>
-<span class="sourceLineNo">6383</span>    @Override<a name="line.6383"></a>
-<span class="sourceLineNo">6384</span>    protected List&lt;HStoreFile&gt; doCompaction(CompactionRequestImpl cr,<a name="line.6384"></a>
-<span class="sourceLineNo">6385</span>        Collection&lt;HStoreFile&gt; filesToCompact, User user, long compactionStartTime,<a name="line.6385"></a>
-<span class="sourceLineNo">6386</span>        List&lt;Path&gt; newFiles) throws IOException {<a name="line.6386"></a>
-<span class="sourceLineNo">6387</span>      // let compaction incomplete.<a name="line.6387"></a>
-<span class="sourceLineNo">6388</span>      if (!this.conf.getBoolean("hbase.hstore.compaction.complete", true)) {<a name="line.6388"></a>
-<span class="sourceLineNo">6389</span>        LOG.warn("hbase.hstore.compaction.complete is set to false");<a name="line.6389"></a>
-<span class="sourceLineNo">6390</span>        List&lt;HStoreFile&gt; sfs = new ArrayList&lt;&gt;(newFiles.size());<a name="line.6390"></a>
-<span class="sourceLineNo">6391</span>        final boolean evictOnClose =<a name="line.6391"></a>
-<span class="sourceLineNo">6392</span>            cacheConf != null? cacheConf.shouldEvictOnClose(): true;<a name="line.6392"></a>
-<span class="sourceLineNo">6393</span>        for (Path newFile : newFiles) {<a name="line.6393"></a>
-<span class="sourceLineNo">6394</span>          // Create storefile around what we wrote with a reader on it.<a name="line.6394"></a>
-<span class="sourceLineNo">6395</span>          HStoreFile sf = createStoreFileAndReader(newFile);<a name="line.6395"></a>
-<span class="sourceLineNo">6396</span>          sf.closeStoreFile(evictOnClose);<a name="line.6396"></a>
-<span class="sourceLineNo">6397</span>          sfs.add(sf);<a name="line.6397"></a>
-<span class="sourceLineNo">6398</span>        }<a name="line.6398"></a>
-<span class="sourceLineNo">6399</span>        return sfs;<a name="line.6399"></a>
-<span class="sourceLineNo">6400</span>      }<a name="line.6400"></a>
-<span class="sourceLineNo">6401</span>      return super.doCompaction(cr, filesToCompact, user, compactionStartTime, newFiles);<a name="line.6401"></a>
-<span class="sourceLineNo">6402</span>    }<a name="line.6402"></a>
-<span class="sourceLineNo">6403</span>  }<a name="line.6403"></a>
-<span class="sourceLineNo">6404</span>}<a name="line.6404"></a>
+<span class="sourceLineNo">6377</span>  /**<a name="line.6377"></a>
+<span class="sourceLineNo">6378</span>   * HStoreForTesting is merely the same as HStore, the difference is in the doCompaction method<a name="line.6378"></a>
+<span class="sourceLineNo">6379</span>   * of HStoreForTesting there is a checkpoint "hbase.hstore.compaction.complete" which<a name="line.6379"></a>
+<span class="sourceLineNo">6380</span>   * doesn't let hstore compaction complete. In the former edition, this config is set in<a name="line.6380"></a>
+<span class="sourceLineNo">6381</span>   * HStore class inside compact method, though this is just for testing, otherwise it<a name="line.6381"></a>
+<span class="sourceLineNo">6382</span>   * doesn't do any help. In HBASE-8518, we try to get rid of all "hbase.hstore.compaction.complete"<a name="line.6382"></a>
+<span class="sourceLineNo">6383</span>   * config (except for testing code).<a name="line.6383"></a>
+<span class="sourceLineNo">6384</span>   */<a name="line.6384"></a>
+<span class="sourceLineNo">6385</span>  public static class HStoreForTesting extends HStore {<a name="line.6385"></a>
+<span class="sourceLineNo">6386</span><a name="line.6386"></a>
+<span class="sourceLineNo">6387</span>    protected HStoreForTesting(final HRegion region,<a name="line.6387"></a>
+<span class="sourceLineNo">6388</span>        final ColumnFamilyDescriptor family,<a name="line.6388"></a>
+<span class="sourceLineNo">6389</span>        final Configuration confParam, boolean warmup) throws IOException {<a name="line.6389"></a>
+<span class="sourceLineNo">6390</span>      super(region, family, confParam, warmup);<a name="line.6390"></a>
+<span class="sourceLineNo">6391</span>    }<a name="line.6391"></a>
+<span class="sourceLineNo">6392</span><a name="line.6392"></a>
+<span class="sourceLineNo">6393</span>    @Override<a name="line.6393"></a>
+<span class="sourceLineNo">6394</span>    protected List&lt;HStoreFile&gt; doCompaction(CompactionRequestImpl cr,<a name="line.6394"></a>
+<span class="sourceLineNo">6395</span>        Collection&lt;HStoreFile&gt; filesToCompact, User user, long compactionStartTime,<a name="line.6395"></a>
+<span class="sourceLineNo">6396</span>        List&lt;Path&gt; newFiles) throws IOException {<a name="line.6396"></a>
+<span class="sourceLineNo">6397</span>      // let compaction incomplete.<a name="line.6397"></a>
+<span class="sourceLineNo">6398</span>      if (!this.conf.getBoolean("hbase.hstore.compaction.complete", true)) {<a name="line.6398"></a>
+<span class="sourceLineNo">6399</span>        LOG.warn("hbase.hstore.compaction.complete is set to false");<a name="line.6399"></a>
+<span class="sourceLineNo">6400</span>        List&lt;HStoreFile&gt; sfs = new ArrayList&lt;&gt;(newFiles.size());<a name="line.6400"></a>
+<span class="sourceLineNo">6401</span>        final boolean evictOnClose =<a name="line.6401"></a>
+<span class="sourceLineNo">6402</span>            cacheConf != null? cacheConf.shouldEvictOnClose(): true;<a name="line.6402"></a>
+<span class="sourceLineNo">6403</span>        for (Path newFile : newFiles) {<a name="line.6403"></a>
+<span class="sourceLineNo">6404</span>          // Create storefile around what we wrote with a reader on it.<a name="line.6404"></a>
+<span class="sourceLineNo">6405</span>          HStoreFile sf = createStoreFileAndReader(newFile);<a name="line.6405"></a>
+<span class="sourceLineNo">6406</span>          sf.closeStoreFile(evictOnClose);<a name="line.6406"></a>
+<span class="sourceLineNo">6407</span>          sfs.add(sf);<a name="line.6407"></a>
+<span class="sourceLineNo">6408</span>        }<a name="line.6408"></a>
+<span class="sourceLineNo">6409</span>        return sfs;<a name="line.6409"></a>
+<span class="sourceLineNo">6410</span>      }<a name="line.6410"></a>
+<span class="sourceLineNo">6411</span>      return super.doCompaction(cr, filesToCompact, user, compactionStartTime, newFiles);<a name="line.6411"></a>
+<span class="sourceLineNo">6412</span>    }<a name="line.6412"></a>
+<span class="sourceLineNo">6413</span>  }<a name="line.6413"></a>
+<span class="sourceLineNo">6414</span>}<a name="line.6414"></a>
 
 
 
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.IsFlushWALMarker.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.IsFlushWALMarker.html
index ddde350..77be719 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.IsFlushWALMarker.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.IsFlushWALMarker.html
@@ -112,68 +112,68 @@
 <span class="sourceLineNo">104</span>import org.apache.hadoop.hbase.Waiter;<a name="line.104"></a>
 <span class="sourceLineNo">105</span>import org.apache.hadoop.hbase.client.Append;<a name="line.105"></a>
 <span class="sourceLineNo">106</span>import org.apache.hadoop.hbase.client.ColumnFamilyDescriptor;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.apache.hadoop.hbase.client.Get;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.110"></a>
-<span class="sourceLineNo">111</span>import org.apache.hadoop.hbase.client.Mutation;<a name="line.111"></a>
-<span class="sourceLineNo">112</span>import org.apache.hadoop.hbase.client.Put;<a name="line.112"></a>
-<span class="sourceLineNo">113</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.113"></a>
-<span class="sourceLineNo">114</span>import org.apache.hadoop.hbase.client.RegionInfoBuilder;<a name="line.114"></a>
-<span class="sourceLineNo">115</span>import org.apache.hadoop.hbase.client.Result;<a name="line.115"></a>
-<span class="sourceLineNo">116</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.116"></a>
-<span class="sourceLineNo">117</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.117"></a>
-<span class="sourceLineNo">118</span>import org.apache.hadoop.hbase.client.Table;<a name="line.118"></a>
-<span class="sourceLineNo">119</span>import org.apache.hadoop.hbase.client.TableDescriptor;<a name="line.119"></a>
-<span class="sourceLineNo">120</span>import org.apache.hadoop.hbase.coprocessor.CoprocessorHost;<a name="line.120"></a>
-<span class="sourceLineNo">121</span>import org.apache.hadoop.hbase.exceptions.FailedSanityCheckException;<a name="line.121"></a>
-<span class="sourceLineNo">122</span>import org.apache.hadoop.hbase.filter.BigDecimalComparator;<a name="line.122"></a>
-<span class="sourceLineNo">123</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.123"></a>
-<span class="sourceLineNo">124</span>import org.apache.hadoop.hbase.filter.ColumnCountGetFilter;<a name="line.124"></a>
-<span class="sourceLineNo">125</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.125"></a>
-<span class="sourceLineNo">126</span>import org.apache.hadoop.hbase.filter.FilterBase;<a name="line.126"></a>
-<span class="sourceLineNo">127</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.127"></a>
-<span class="sourceLineNo">128</span>import org.apache.hadoop.hbase.filter.NullComparator;<a name="line.128"></a>
-<span class="sourceLineNo">129</span>import org.apache.hadoop.hbase.filter.PrefixFilter;<a name="line.129"></a>
-<span class="sourceLineNo">130</span>import org.apache.hadoop.hbase.filter.SingleColumnValueExcludeFilter;<a name="line.130"></a>
-<span class="sourceLineNo">131</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.131"></a>
-<span class="sourceLineNo">132</span>import org.apache.hadoop.hbase.filter.SubstringComparator;<a name="line.132"></a>
-<span class="sourceLineNo">133</span>import org.apache.hadoop.hbase.filter.ValueFilter;<a name="line.133"></a>
-<span class="sourceLineNo">134</span>import org.apache.hadoop.hbase.io.hfile.HFile;<a name="line.134"></a>
-<span class="sourceLineNo">135</span>import org.apache.hadoop.hbase.monitoring.MonitoredRPCHandler;<a name="line.135"></a>
-<span class="sourceLineNo">136</span>import org.apache.hadoop.hbase.monitoring.MonitoredTask;<a name="line.136"></a>
-<span class="sourceLineNo">137</span>import org.apache.hadoop.hbase.monitoring.TaskMonitor;<a name="line.137"></a>
-<span class="sourceLineNo">138</span>import org.apache.hadoop.hbase.regionserver.HRegion.MutationBatchOperation;<a name="line.138"></a>
-<span class="sourceLineNo">139</span>import org.apache.hadoop.hbase.regionserver.HRegion.RegionScannerImpl;<a name="line.139"></a>
-<span class="sourceLineNo">140</span>import org.apache.hadoop.hbase.regionserver.Region.RowLock;<a name="line.140"></a>
-<span class="sourceLineNo">141</span>import org.apache.hadoop.hbase.regionserver.TestHStore.FaultyFileSystem;<a name="line.141"></a>
-<span class="sourceLineNo">142</span>import org.apache.hadoop.hbase.regionserver.compactions.CompactionRequestImpl;<a name="line.142"></a>
-<span class="sourceLineNo">143</span>import org.apache.hadoop.hbase.regionserver.wal.FSHLog;<a name="line.143"></a>
-<span class="sourceLineNo">144</span>import org.apache.hadoop.hbase.regionserver.wal.MetricsWALSource;<a name="line.144"></a>
-<span class="sourceLineNo">145</span>import org.apache.hadoop.hbase.regionserver.wal.WALUtil;<a name="line.145"></a>
-<span class="sourceLineNo">146</span>import org.apache.hadoop.hbase.replication.regionserver.ReplicationObserver;<a name="line.146"></a>
-<span class="sourceLineNo">147</span>import org.apache.hadoop.hbase.security.User;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>import org.apache.hadoop.hbase.test.MetricsAssertHelper;<a name="line.148"></a>
-<span class="sourceLineNo">149</span>import org.apache.hadoop.hbase.testclassification.LargeTests;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>import org.apache.hadoop.hbase.testclassification.VerySlowRegionServerTests;<a name="line.150"></a>
-<span class="sourceLineNo">151</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.151"></a>
-<span class="sourceLineNo">152</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.152"></a>
-<span class="sourceLineNo">153</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManagerTestHelper;<a name="line.153"></a>
-<span class="sourceLineNo">154</span>import org.apache.hadoop.hbase.util.FSUtils;<a name="line.154"></a>
-<span class="sourceLineNo">155</span>import org.apache.hadoop.hbase.util.IncrementingEnvironmentEdge;<a name="line.155"></a>
-<span class="sourceLineNo">156</span>import org.apache.hadoop.hbase.util.ManualEnvironmentEdge;<a name="line.156"></a>
-<span class="sourceLineNo">157</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.157"></a>
-<span class="sourceLineNo">158</span>import org.apache.hadoop.hbase.wal.AbstractFSWALProvider;<a name="line.158"></a>
-<span class="sourceLineNo">159</span>import org.apache.hadoop.hbase.wal.FaultyFSLog;<a name="line.159"></a>
-<span class="sourceLineNo">160</span>import org.apache.hadoop.hbase.wal.NettyAsyncFSWALConfigHelper;<a name="line.160"></a>
-<span class="sourceLineNo">161</span>import org.apache.hadoop.hbase.wal.WAL;<a name="line.161"></a>
-<span class="sourceLineNo">162</span>import org.apache.hadoop.hbase.wal.WALEdit;<a name="line.162"></a>
-<span class="sourceLineNo">163</span>import org.apache.hadoop.hbase.wal.WALFactory;<a name="line.163"></a>
-<span class="sourceLineNo">164</span>import org.apache.hadoop.hbase.wal.WALKeyImpl;<a name="line.164"></a>
-<span class="sourceLineNo">165</span>import org.apache.hadoop.hbase.wal.WALProvider;<a name="line.165"></a>
-<span class="sourceLineNo">166</span>import org.apache.hadoop.hbase.wal.WALProvider.Writer;<a name="line.166"></a>
-<span class="sourceLineNo">167</span>import org.apache.hadoop.hbase.wal.WALSplitUtil;<a name="line.167"></a>
-<span class="sourceLineNo">168</span>import org.apache.hadoop.hbase.wal.WALSplitter;<a name="line.168"></a>
+<span class="sourceLineNo">107</span>import org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>import org.apache.hadoop.hbase.client.Get;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.111"></a>
+<span class="sourceLineNo">112</span>import org.apache.hadoop.hbase.client.Mutation;<a name="line.112"></a>
+<span class="sourceLineNo">113</span>import org.apache.hadoop.hbase.client.Put;<a name="line.113"></a>
+<span class="sourceLineNo">114</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.114"></a>
+<span class="sourceLineNo">115</span>import org.apache.hadoop.hbase.client.RegionInfoBuilder;<a name="line.115"></a>
+<span class="sourceLineNo">116</span>import org.apache.hadoop.hbase.client.Result;<a name="line.116"></a>
+<span class="sourceLineNo">117</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.117"></a>
+<span class="sourceLineNo">118</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.118"></a>
+<span class="sourceLineNo">119</span>import org.apache.hadoop.hbase.client.Table;<a name="line.119"></a>
+<span class="sourceLineNo">120</span>import org.apache.hadoop.hbase.client.TableDescriptor;<a name="line.120"></a>
+<span class="sourceLineNo">121</span>import org.apache.hadoop.hbase.coprocessor.CoprocessorHost;<a name="line.121"></a>
+<span class="sourceLineNo">122</span>import org.apache.hadoop.hbase.exceptions.FailedSanityCheckException;<a name="line.122"></a>
+<span class="sourceLineNo">123</span>import org.apache.hadoop.hbase.filter.BigDecimalComparator;<a name="line.123"></a>
+<span class="sourceLineNo">124</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.124"></a>
+<span class="sourceLineNo">125</span>import org.apache.hadoop.hbase.filter.ColumnCountGetFilter;<a name="line.125"></a>
+<span class="sourceLineNo">126</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.126"></a>
+<span class="sourceLineNo">127</span>import org.apache.hadoop.hbase.filter.FilterBase;<a name="line.127"></a>
+<span class="sourceLineNo">128</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.128"></a>
+<span class="sourceLineNo">129</span>import org.apache.hadoop.hbase.filter.NullComparator;<a name="line.129"></a>
+<span class="sourceLineNo">130</span>import org.apache.hadoop.hbase.filter.PrefixFilter;<a name="line.130"></a>
+<span class="sourceLineNo">131</span>import org.apache.hadoop.hbase.filter.SingleColumnValueExcludeFilter;<a name="line.131"></a>
+<span class="sourceLineNo">132</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.132"></a>
+<span class="sourceLineNo">133</span>import org.apache.hadoop.hbase.filter.SubstringComparator;<a name="line.133"></a>
+<span class="sourceLineNo">134</span>import org.apache.hadoop.hbase.filter.ValueFilter;<a name="line.134"></a>
+<span class="sourceLineNo">135</span>import org.apache.hadoop.hbase.io.hfile.HFile;<a name="line.135"></a>
+<span class="sourceLineNo">136</span>import org.apache.hadoop.hbase.monitoring.MonitoredRPCHandler;<a name="line.136"></a>
+<span class="sourceLineNo">137</span>import org.apache.hadoop.hbase.monitoring.MonitoredTask;<a name="line.137"></a>
+<span class="sourceLineNo">138</span>import org.apache.hadoop.hbase.monitoring.TaskMonitor;<a name="line.138"></a>
+<span class="sourceLineNo">139</span>import org.apache.hadoop.hbase.regionserver.HRegion.MutationBatchOperation;<a name="line.139"></a>
+<span class="sourceLineNo">140</span>import org.apache.hadoop.hbase.regionserver.HRegion.RegionScannerImpl;<a name="line.140"></a>
+<span class="sourceLineNo">141</span>import org.apache.hadoop.hbase.regionserver.Region.RowLock;<a name="line.141"></a>
+<span class="sourceLineNo">142</span>import org.apache.hadoop.hbase.regionserver.TestHStore.FaultyFileSystem;<a name="line.142"></a>
+<span class="sourceLineNo">143</span>import org.apache.hadoop.hbase.regionserver.compactions.CompactionRequestImpl;<a name="line.143"></a>
+<span class="sourceLineNo">144</span>import org.apache.hadoop.hbase.regionserver.wal.FSHLog;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>import org.apache.hadoop.hbase.regionserver.wal.MetricsWALSource;<a name="line.145"></a>
+<span class="sourceLineNo">146</span>import org.apache.hadoop.hbase.regionserver.wal.WALUtil;<a name="line.146"></a>
+<span class="sourceLineNo">147</span>import org.apache.hadoop.hbase.replication.regionserver.ReplicationObserver;<a name="line.147"></a>
+<span class="sourceLineNo">148</span>import org.apache.hadoop.hbase.security.User;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>import org.apache.hadoop.hbase.test.MetricsAssertHelper;<a name="line.149"></a>
+<span class="sourceLineNo">150</span>import org.apache.hadoop.hbase.testclassification.LargeTests;<a name="line.150"></a>
+<span class="sourceLineNo">151</span>import org.apache.hadoop.hbase.testclassification.VerySlowRegionServerTests;<a name="line.151"></a>
+<span class="sourceLineNo">152</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.152"></a>
+<span class="sourceLineNo">153</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.153"></a>
+<span class="sourceLineNo">154</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManagerTestHelper;<a name="line.154"></a>
+<span class="sourceLineNo">155</span>import org.apache.hadoop.hbase.util.FSUtils;<a name="line.155"></a>
+<span class="sourceLineNo">156</span>import org.apache.hadoop.hbase.util.IncrementingEnvironmentEdge;<a name="line.156"></a>
+<span class="sourceLineNo">157</span>import org.apache.hadoop.hbase.util.ManualEnvironmentEdge;<a name="line.157"></a>
+<span class="sourceLineNo">158</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.158"></a>
+<span class="sourceLineNo">159</span>import org.apache.hadoop.hbase.wal.AbstractFSWALProvider;<a name="line.159"></a>
+<span class="sourceLineNo">160</span>import org.apache.hadoop.hbase.wal.FaultyFSLog;<a name="line.160"></a>
+<span class="sourceLineNo">161</span>import org.apache.hadoop.hbase.wal.NettyAsyncFSWALConfigHelper;<a name="line.161"></a>
+<span class="sourceLineNo">162</span>import org.apache.hadoop.hbase.wal.WAL;<a name="line.162"></a>
+<span class="sourceLineNo">163</span>import org.apache.hadoop.hbase.wal.WALEdit;<a name="line.163"></a>
+<span class="sourceLineNo">164</span>import org.apache.hadoop.hbase.wal.WALFactory;<a name="line.164"></a>
+<span class="sourceLineNo">165</span>import org.apache.hadoop.hbase.wal.WALKeyImpl;<a name="line.165"></a>
+<span class="sourceLineNo">166</span>import org.apache.hadoop.hbase.wal.WALProvider;<a name="line.166"></a>
+<span class="sourceLineNo">167</span>import org.apache.hadoop.hbase.wal.WALProvider.Writer;<a name="line.167"></a>
+<span class="sourceLineNo">168</span>import org.apache.hadoop.hbase.wal.WALSplitUtil;<a name="line.168"></a>
 <span class="sourceLineNo">169</span>import org.apache.hadoop.metrics2.MetricsExecutor;<a name="line.169"></a>
 <span class="sourceLineNo">170</span>import org.junit.After;<a name="line.170"></a>
 <span class="sourceLineNo">171</span>import org.junit.Assert;<a name="line.171"></a>
@@ -409,6007 +409,6017 @@
 <span class="sourceLineNo">401</span>    String testName = "testMemstoreSizeAccountingWithFailedPostBatchMutate";<a name="line.401"></a>
 <span class="sourceLineNo">402</span>    FileSystem fs = FileSystem.get(CONF);<a name="line.402"></a>
 <span class="sourceLineNo">403</span>    Path rootDir = new Path(dir + testName);<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    FSHLog hLog = new FSHLog(fs, rootDir, testName, CONF);<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    hLog.init();<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, hLog,<a name="line.406"></a>
-<span class="sourceLineNo">407</span>        COLUMN_FAMILY_BYTES);<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    assertEquals(0, region.getMemStoreDataSize());<a name="line.409"></a>
-<span class="sourceLineNo">410</span><a name="line.410"></a>
-<span class="sourceLineNo">411</span>    // Put one value<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    byte [] value = Bytes.toBytes(method);<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    Put put = new Put(value);<a name="line.413"></a>
-<span class="sourceLineNo">414</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.414"></a>
-<span class="sourceLineNo">415</span>    region.put(put);<a name="line.415"></a>
-<span class="sourceLineNo">416</span>    long onePutSize = region.getMemStoreDataSize();<a name="line.416"></a>
-<span class="sourceLineNo">417</span>    assertTrue(onePutSize &gt; 0);<a name="line.417"></a>
-<span class="sourceLineNo">418</span><a name="line.418"></a>
-<span class="sourceLineNo">419</span>    RegionCoprocessorHost mockedCPHost = Mockito.mock(RegionCoprocessorHost.class);<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    doThrow(new IOException())<a name="line.420"></a>
-<span class="sourceLineNo">421</span>       .when(mockedCPHost).postBatchMutate(Mockito.&lt;MiniBatchOperationInProgress&lt;Mutation&gt;&gt;any());<a name="line.421"></a>
-<span class="sourceLineNo">422</span>    region.setCoprocessorHost(mockedCPHost);<a name="line.422"></a>
-<span class="sourceLineNo">423</span><a name="line.423"></a>
-<span class="sourceLineNo">424</span>    put = new Put(value);<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("dfg"), value);<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    try {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      region.put(put);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>      fail("Should have failed with IOException");<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    } catch (IOException expected) {<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    }<a name="line.430"></a>
-<span class="sourceLineNo">431</span>    long expectedSize = onePutSize * 2;<a name="line.431"></a>
-<span class="sourceLineNo">432</span>    assertEquals("memstoreSize should be incremented",<a name="line.432"></a>
-<span class="sourceLineNo">433</span>        expectedSize, region.getMemStoreDataSize());<a name="line.433"></a>
-<span class="sourceLineNo">434</span>    assertEquals("flushable size should be incremented",<a name="line.434"></a>
-<span class="sourceLineNo">435</span>        expectedSize, store.getFlushableSize().getDataSize());<a name="line.435"></a>
-<span class="sourceLineNo">436</span><a name="line.436"></a>
-<span class="sourceLineNo">437</span>    region.setCoprocessorHost(null);<a name="line.437"></a>
-<span class="sourceLineNo">438</span>  }<a name="line.438"></a>
-<span class="sourceLineNo">439</span><a name="line.439"></a>
-<span class="sourceLineNo">440</span>  /**<a name="line.440"></a>
-<span class="sourceLineNo">441</span>   * A test case of HBASE-21041<a name="line.441"></a>
-<span class="sourceLineNo">442</span>   * @throws Exception Exception<a name="line.442"></a>
-<span class="sourceLineNo">443</span>   */<a name="line.443"></a>
-<span class="sourceLineNo">444</span>  @Test<a name="line.444"></a>
-<span class="sourceLineNo">445</span>  public void testFlushAndMemstoreSizeCounting() throws Exception {<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    byte[] family = Bytes.toBytes("family");<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.447"></a>
-<span class="sourceLineNo">448</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.448"></a>
-<span class="sourceLineNo">449</span>    try {<a name="line.449"></a>
-<span class="sourceLineNo">450</span>      for (byte[] row : HBaseTestingUtility.ROWS) {<a name="line.450"></a>
-<span class="sourceLineNo">451</span>        Put put = new Put(row);<a name="line.451"></a>
-<span class="sourceLineNo">452</span>        put.addColumn(family, family, row);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>        region.put(put);<a name="line.453"></a>
-<span class="sourceLineNo">454</span>      }<a name="line.454"></a>
-<span class="sourceLineNo">455</span>      region.flush(true);<a name="line.455"></a>
-<span class="sourceLineNo">456</span>      // After flush, data size should be zero<a name="line.456"></a>
-<span class="sourceLineNo">457</span>      assertEquals(0, region.getMemStoreDataSize());<a name="line.457"></a>
-<span class="sourceLineNo">458</span>      // After flush, a new active mutable segment is created, so the heap size<a name="line.458"></a>
-<span class="sourceLineNo">459</span>      // should equal to MutableSegment.DEEP_OVERHEAD<a name="line.459"></a>
-<span class="sourceLineNo">460</span>      assertEquals(MutableSegment.DEEP_OVERHEAD, region.getMemStoreHeapSize());<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      // After flush, offheap should be zero<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      assertEquals(0, region.getMemStoreOffHeapSize());<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    } finally {<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.464"></a>
-<span class="sourceLineNo">465</span>      this.region = null;<a name="line.465"></a>
-<span class="sourceLineNo">466</span>      wals.close();<a name="line.466"></a>
-<span class="sourceLineNo">467</span>    }<a name="line.467"></a>
-<span class="sourceLineNo">468</span>  }<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>   * Test we do not lose data if we fail a flush and then close.<a name="line.471"></a>
-<span class="sourceLineNo">472</span>   * Part of HBase-10466.  Tests the following from the issue description:<a name="line.472"></a>
-<span class="sourceLineNo">473</span>   * "Bug 1: Wrong calculation of HRegion.memstoreSize: When a flush fails, data to be flushed is<a name="line.473"></a>
-<span class="sourceLineNo">474</span>   * kept in each MemStore's snapshot and wait for next flush attempt to continue on it. But when<a name="line.474"></a>
-<span class="sourceLineNo">475</span>   * the next flush succeeds, the counter of total memstore size in HRegion is always deduced by<a name="line.475"></a>
-<span class="sourceLineNo">476</span>   * the sum of current memstore sizes instead of snapshots left from previous failed flush. This<a name="line.476"></a>
-<span class="sourceLineNo">477</span>   * calculation is problematic that almost every time there is failed flush, HRegion.memstoreSize<a name="line.477"></a>
-<span class="sourceLineNo">478</span>   * gets reduced by a wrong value. If region flush could not proceed for a couple cycles, the size<a name="line.478"></a>
-<span class="sourceLineNo">479</span>   * in current memstore could be much larger than the snapshot. It's likely to drift memstoreSize<a name="line.479"></a>
-<span class="sourceLineNo">480</span>   * much smaller than expected. In extreme case, if the error accumulates to even bigger than<a name="line.480"></a>
-<span class="sourceLineNo">481</span>   * HRegion's memstore size limit, any further flush is skipped because flush does not do anything<a name="line.481"></a>
-<span class="sourceLineNo">482</span>   * if memstoreSize is not larger than 0."<a name="line.482"></a>
-<span class="sourceLineNo">483</span>   * @throws Exception<a name="line.483"></a>
-<span class="sourceLineNo">484</span>   */<a name="line.484"></a>
-<span class="sourceLineNo">485</span>  @Test<a name="line.485"></a>
-<span class="sourceLineNo">486</span>  public void testFlushSizeAccounting() throws Exception {<a name="line.486"></a>
-<span class="sourceLineNo">487</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    // Only retry once.<a name="line.489"></a>
-<span class="sourceLineNo">490</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.490"></a>
-<span class="sourceLineNo">491</span>    final User user =<a name="line.491"></a>
-<span class="sourceLineNo">492</span>      User.createUserForTesting(conf, method, new String[]{"foo"});<a name="line.492"></a>
-<span class="sourceLineNo">493</span>    // Inject our faulty LocalFileSystem<a name="line.493"></a>
-<span class="sourceLineNo">494</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.494"></a>
-<span class="sourceLineNo">495</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.495"></a>
-<span class="sourceLineNo">496</span>      @Override<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      public Object run() throws Exception {<a name="line.497"></a>
-<span class="sourceLineNo">498</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.498"></a>
-<span class="sourceLineNo">499</span>        FileSystem fs = FileSystem.get(conf);<a name="line.499"></a>
-<span class="sourceLineNo">500</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.500"></a>
-<span class="sourceLineNo">501</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.501"></a>
-<span class="sourceLineNo">502</span>        HRegion region = null;<a name="line.502"></a>
-<span class="sourceLineNo">503</span>        try {<a name="line.503"></a>
-<span class="sourceLineNo">504</span>          // Initialize region<a name="line.504"></a>
-<span class="sourceLineNo">505</span>          region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, wal,<a name="line.505"></a>
-<span class="sourceLineNo">506</span>              COLUMN_FAMILY_BYTES);<a name="line.506"></a>
-<span class="sourceLineNo">507</span>          long size = region.getMemStoreDataSize();<a name="line.507"></a>
-<span class="sourceLineNo">508</span>          Assert.assertEquals(0, size);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.509"></a>
-<span class="sourceLineNo">510</span>          Put p1 = new Put(row);<a name="line.510"></a>
-<span class="sourceLineNo">511</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[]) null));<a name="line.511"></a>
-<span class="sourceLineNo">512</span>          region.put(p1);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>          final long sizeOfOnePut = region.getMemStoreDataSize();<a name="line.513"></a>
-<span class="sourceLineNo">514</span>          // Fail a flush which means the current memstore will hang out as memstore 'snapshot'.<a name="line.514"></a>
-<span class="sourceLineNo">515</span>          try {<a name="line.515"></a>
-<span class="sourceLineNo">516</span>            LOG.info("Flushing");<a name="line.516"></a>
-<span class="sourceLineNo">517</span>            region.flush(true);<a name="line.517"></a>
-<span class="sourceLineNo">518</span>            Assert.fail("Didn't bubble up IOE!");<a name="line.518"></a>
-<span class="sourceLineNo">519</span>          } catch (DroppedSnapshotException dse) {<a name="line.519"></a>
-<span class="sourceLineNo">520</span>            // What we are expecting<a name="line.520"></a>
-<span class="sourceLineNo">521</span>            region.closing.set(false); // this is needed for the rest of the test to work<a name="line.521"></a>
-<span class="sourceLineNo">522</span>          }<a name="line.522"></a>
-<span class="sourceLineNo">523</span>          // Make it so all writes succeed from here on out<a name="line.523"></a>
-<span class="sourceLineNo">524</span>          ffs.fault.set(false);<a name="line.524"></a>
-<span class="sourceLineNo">525</span>          // Check sizes.  Should still be the one entry.<a name="line.525"></a>
-<span class="sourceLineNo">526</span>          Assert.assertEquals(sizeOfOnePut, region.getMemStoreDataSize());<a name="line.526"></a>
-<span class="sourceLineNo">527</span>          // Now add two entries so that on this next flush that fails, we can see if we<a name="line.527"></a>
-<span class="sourceLineNo">528</span>          // subtract the right amount, the snapshot size only.<a name="line.528"></a>
-<span class="sourceLineNo">529</span>          Put p2 = new Put(row);<a name="line.529"></a>
-<span class="sourceLineNo">530</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.530"></a>
-<span class="sourceLineNo">531</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.531"></a>
-<span class="sourceLineNo">532</span>          region.put(p2);<a name="line.532"></a>
-<span class="sourceLineNo">533</span>          long expectedSize = sizeOfOnePut * 3;<a name="line.533"></a>
-<span class="sourceLineNo">534</span>          Assert.assertEquals(expectedSize, region.getMemStoreDataSize());<a name="line.534"></a>
-<span class="sourceLineNo">535</span>          // Do a successful flush.  It will clear the snapshot only.  Thats how flushes work.<a name="line.535"></a>
-<span class="sourceLineNo">536</span>          // If already a snapshot, we clear it else we move the memstore to be snapshot and flush<a name="line.536"></a>
-<span class="sourceLineNo">537</span>          // it<a name="line.537"></a>
-<span class="sourceLineNo">538</span>          region.flush(true);<a name="line.538"></a>
-<span class="sourceLineNo">539</span>          // Make sure our memory accounting is right.<a name="line.539"></a>
-<span class="sourceLineNo">540</span>          Assert.assertEquals(sizeOfOnePut * 2, region.getMemStoreDataSize());<a name="line.540"></a>
-<span class="sourceLineNo">541</span>        } finally {<a name="line.541"></a>
-<span class="sourceLineNo">542</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.542"></a>
-<span class="sourceLineNo">543</span>        }<a name="line.543"></a>
-<span class="sourceLineNo">544</span>        return null;<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>    FileSystem.closeAllForUGI(user.getUGI());<a name="line.547"></a>
-<span class="sourceLineNo">548</span>  }<a name="line.548"></a>
-<span class="sourceLineNo">549</span><a name="line.549"></a>
-<span class="sourceLineNo">550</span>  @Test<a name="line.550"></a>
-<span class="sourceLineNo">551</span>  public void testCloseWithFailingFlush() throws Exception {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    // Only retry once.<a name="line.554"></a>
-<span class="sourceLineNo">555</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.555"></a>
-<span class="sourceLineNo">556</span>    final User user =<a name="line.556"></a>
-<span class="sourceLineNo">557</span>      User.createUserForTesting(conf, this.method, new String[]{"foo"});<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    // Inject our faulty LocalFileSystem<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      @Override<a name="line.561"></a>
-<span class="sourceLineNo">562</span>      public Object run() throws Exception {<a name="line.562"></a>
-<span class="sourceLineNo">563</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.563"></a>
-<span class="sourceLineNo">564</span>        FileSystem fs = FileSystem.get(conf);<a name="line.564"></a>
-<span class="sourceLineNo">565</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.565"></a>
-<span class="sourceLineNo">566</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.566"></a>
-<span class="sourceLineNo">567</span>        HRegion region = null;<a name="line.567"></a>
-<span class="sourceLineNo">568</span>        try {<a name="line.568"></a>
-<span class="sourceLineNo">569</span>          // Initialize region<a name="line.569"></a>
-<span class="sourceLineNo">570</span>          region = initHRegion(tableName, null, null, false,<a name="line.570"></a>
-<span class="sourceLineNo">571</span>              Durability.SYNC_WAL, wal, COLUMN_FAMILY_BYTES);<a name="line.571"></a>
-<span class="sourceLineNo">572</span>          long size = region.getMemStoreDataSize();<a name="line.572"></a>
-<span class="sourceLineNo">573</span>          Assert.assertEquals(0, size);<a name="line.573"></a>
-<span class="sourceLineNo">574</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.574"></a>
-<span class="sourceLineNo">575</span>          Put p1 = new Put(row);<a name="line.575"></a>
-<span class="sourceLineNo">576</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[])null));<a name="line.576"></a>
-<span class="sourceLineNo">577</span>          region.put(p1);<a name="line.577"></a>
-<span class="sourceLineNo">578</span>          // Manufacture an outstanding snapshot -- fake a failed flush by doing prepare step only.<a name="line.578"></a>
-<span class="sourceLineNo">579</span>          HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>          StoreFlushContext storeFlushCtx =<a name="line.580"></a>
-<span class="sourceLineNo">581</span>              store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY);<a name="line.581"></a>
-<span class="sourceLineNo">582</span>          storeFlushCtx.prepare();<a name="line.582"></a>
-<span class="sourceLineNo">583</span>          // Now add two entries to the foreground memstore.<a name="line.583"></a>
-<span class="sourceLineNo">584</span>          Put p2 = new Put(row);<a name="line.584"></a>
-<span class="sourceLineNo">585</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.585"></a>
-<span class="sourceLineNo">586</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.586"></a>
-<span class="sourceLineNo">587</span>          region.put(p2);<a name="line.587"></a>
-<span class="sourceLineNo">588</span>          // Now try close on top of a failing flush.<a name="line.588"></a>
-<span class="sourceLineNo">589</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.589"></a>
-<span class="sourceLineNo">590</span>          region = null;<a name="line.590"></a>
-<span class="sourceLineNo">591</span>          fail();<a name="line.591"></a>
-<span class="sourceLineNo">592</span>        } catch (DroppedSnapshotException dse) {<a name="line.592"></a>
-<span class="sourceLineNo">593</span>          // Expected<a name="line.593"></a>
-<span class="sourceLineNo">594</span>          LOG.info("Expected DroppedSnapshotException");<a name="line.594"></a>
-<span class="sourceLineNo">595</span>        } finally {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>          // Make it so all writes succeed from here on out so can close clean<a name="line.596"></a>
-<span class="sourceLineNo">597</span>          ffs.fault.set(false);<a name="line.597"></a>
-<span class="sourceLineNo">598</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.598"></a>
-<span class="sourceLineNo">599</span>        }<a name="line.599"></a>
-<span class="sourceLineNo">600</span>        return null;<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      }<a name="line.601"></a>
-<span class="sourceLineNo">602</span>    });<a name="line.602"></a>
-<span class="sourceLineNo">603</span>    FileSystem.closeAllForUGI(user.getUGI());<a name="line.603"></a>
-<span class="sourceLineNo">604</span>  }<a name="line.604"></a>
-<span class="sourceLineNo">605</span><a name="line.605"></a>
-<span class="sourceLineNo">606</span>  @Test<a name="line.606"></a>
-<span class="sourceLineNo">607</span>  public void testCompactionAffectedByScanners() throws Exception {<a name="line.607"></a>
-<span class="sourceLineNo">608</span>    byte[] family = Bytes.toBytes("family");<a name="line.608"></a>
-<span class="sourceLineNo">609</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.609"></a>
-<span class="sourceLineNo">610</span><a name="line.610"></a>
-<span class="sourceLineNo">611</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.612"></a>
-<span class="sourceLineNo">613</span>    region.put(put);<a name="line.613"></a>
-<span class="sourceLineNo">614</span>    region.flush(true);<a name="line.614"></a>
-<span class="sourceLineNo">615</span><a name="line.615"></a>
-<span class="sourceLineNo">616</span>    Scan scan = new Scan();<a name="line.616"></a>
-<span class="sourceLineNo">617</span>    scan.setMaxVersions(3);<a name="line.617"></a>
-<span class="sourceLineNo">618</span>    // open the first scanner<a name="line.618"></a>
-<span class="sourceLineNo">619</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.619"></a>
-<span class="sourceLineNo">620</span><a name="line.620"></a>
-<span class="sourceLineNo">621</span>    Delete delete = new Delete(Bytes.toBytes("r1"));<a name="line.621"></a>
-<span class="sourceLineNo">622</span>    region.delete(delete);<a name="line.622"></a>
-<span class="sourceLineNo">623</span>    region.flush(true);<a name="line.623"></a>
-<span class="sourceLineNo">624</span><a name="line.624"></a>
-<span class="sourceLineNo">625</span>    // open the second scanner<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    RegionScanner scanner2 = region.getScanner(scan);<a name="line.626"></a>
-<span class="sourceLineNo">627</span><a name="line.627"></a>
-<span class="sourceLineNo">628</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.628"></a>
-<span class="sourceLineNo">629</span><a name="line.629"></a>
-<span class="sourceLineNo">630</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.630"></a>
-<span class="sourceLineNo">631</span><a name="line.631"></a>
-<span class="sourceLineNo">632</span>    // make a major compaction<a name="line.632"></a>
-<span class="sourceLineNo">633</span>    region.compact(true);<a name="line.633"></a>
-<span class="sourceLineNo">634</span><a name="line.634"></a>
-<span class="sourceLineNo">635</span>    // open the third scanner<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    RegionScanner scanner3 = region.getScanner(scan);<a name="line.636"></a>
-<span class="sourceLineNo">637</span><a name="line.637"></a>
-<span class="sourceLineNo">638</span>    // get data from scanner 1, 2, 3 after major compaction<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    scanner1.next(results);<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    System.out.println(results);<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    assertEquals(1, results.size());<a name="line.641"></a>
-<span class="sourceLineNo">642</span><a name="line.642"></a>
-<span class="sourceLineNo">643</span>    results.clear();<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    scanner2.next(results);<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    System.out.println(results);<a name="line.645"></a>
-<span class="sourceLineNo">646</span>    assertEquals(0, results.size());<a name="line.646"></a>
-<span class="sourceLineNo">647</span><a name="line.647"></a>
-<span class="sourceLineNo">648</span>    results.clear();<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    scanner3.next(results);<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    System.out.println(results);<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    assertEquals(0, results.size());<a name="line.651"></a>
-<span class="sourceLineNo">652</span>  }<a name="line.652"></a>
-<span class="sourceLineNo">653</span><a name="line.653"></a>
-<span class="sourceLineNo">654</span>  @Test<a name="line.654"></a>
-<span class="sourceLineNo">655</span>  public void testToShowNPEOnRegionScannerReseek() throws Exception {<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    byte[] family = Bytes.toBytes("family");<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.657"></a>
-<span class="sourceLineNo">658</span><a name="line.658"></a>
-<span class="sourceLineNo">659</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.659"></a>
-<span class="sourceLineNo">660</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.660"></a>
-<span class="sourceLineNo">661</span>    region.put(put);<a name="line.661"></a>
-<span class="sourceLineNo">662</span>    put = new Put(Bytes.toBytes("r2"));<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.663"></a>
-<span class="sourceLineNo">664</span>    region.put(put);<a name="line.664"></a>
-<span class="sourceLineNo">665</span>    region.flush(true);<a name="line.665"></a>
-<span class="sourceLineNo">666</span><a name="line.666"></a>
-<span class="sourceLineNo">667</span>    Scan scan = new Scan();<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    scan.setMaxVersions(3);<a name="line.668"></a>
-<span class="sourceLineNo">669</span>    // open the first scanner<a name="line.669"></a>
-<span class="sourceLineNo">670</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.670"></a>
-<span class="sourceLineNo">671</span><a name="line.671"></a>
-<span class="sourceLineNo">672</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.672"></a>
-<span class="sourceLineNo">673</span><a name="line.673"></a>
-<span class="sourceLineNo">674</span>    region.compact(true);<a name="line.674"></a>
-<span class="sourceLineNo">675</span><a name="line.675"></a>
-<span class="sourceLineNo">676</span>    scanner1.reseek(Bytes.toBytes("r2"));<a name="line.676"></a>
-<span class="sourceLineNo">677</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.677"></a>
-<span class="sourceLineNo">678</span>    scanner1.next(results);<a name="line.678"></a>
-<span class="sourceLineNo">679</span>    Cell keyValue = results.get(0);<a name="line.679"></a>
-<span class="sourceLineNo">680</span>    Assert.assertTrue(Bytes.compareTo(CellUtil.cloneRow(keyValue), Bytes.toBytes("r2")) == 0);<a name="line.680"></a>
-<span class="sourceLineNo">681</span>    scanner1.close();<a name="line.681"></a>
-<span class="sourceLineNo">682</span>  }<a name="line.682"></a>
-<span class="sourceLineNo">683</span><a name="line.683"></a>
-<span class="sourceLineNo">684</span>  @Test<a name="line.684"></a>
-<span class="sourceLineNo">685</span>  public void testSkipRecoveredEditsReplay() throws Exception {<a name="line.685"></a>
-<span class="sourceLineNo">686</span>    byte[] family = Bytes.toBytes("family");<a name="line.686"></a>
-<span class="sourceLineNo">687</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.687"></a>
-<span class="sourceLineNo">688</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.688"></a>
-<span class="sourceLineNo">689</span>    try {<a name="line.689"></a>
-<span class="sourceLineNo">690</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.690"></a>
-<span class="sourceLineNo">691</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.691"></a>
-<span class="sourceLineNo">692</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.692"></a>
-<span class="sourceLineNo">693</span><a name="line.693"></a>
-<span class="sourceLineNo">694</span>      Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.694"></a>
-<span class="sourceLineNo">695</span><a name="line.695"></a>
-<span class="sourceLineNo">696</span>      long maxSeqId = 1050;<a name="line.696"></a>
-<span class="sourceLineNo">697</span>      long minSeqId = 1000;<a name="line.697"></a>
-<span class="sourceLineNo">698</span><a name="line.698"></a>
-<span class="sourceLineNo">699</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.699"></a>
-<span class="sourceLineNo">700</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.700"></a>
-<span class="sourceLineNo">701</span>        fs.create(recoveredEdits);<a name="line.701"></a>
-<span class="sourceLineNo">702</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.702"></a>
-<span class="sourceLineNo">703</span><a name="line.703"></a>
-<span class="sourceLineNo">704</span>        long time = System.nanoTime();<a name="line.704"></a>
-<span class="sourceLineNo">705</span>        WALEdit edit = new WALEdit();<a name="line.705"></a>
-<span class="sourceLineNo">706</span>        edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.706"></a>
-<span class="sourceLineNo">707</span>            .toBytes(i)));<a name="line.707"></a>
-<span class="sourceLineNo">708</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.708"></a>
-<span class="sourceLineNo">709</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.709"></a>
-<span class="sourceLineNo">710</span><a name="line.710"></a>
-<span class="sourceLineNo">711</span>        writer.close();<a name="line.711"></a>
-<span class="sourceLineNo">712</span>      }<a name="line.712"></a>
-<span class="sourceLineNo">713</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.713"></a>
-<span class="sourceLineNo">714</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.714"></a>
-<span class="sourceLineNo">715</span>      for (HStore store : region.getStores()) {<a name="line.715"></a>
-<span class="sourceLineNo">716</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), minSeqId - 1);<a name="line.716"></a>
-<span class="sourceLineNo">717</span>      }<a name="line.717"></a>
-<span class="sourceLineNo">718</span>      long seqId = region.replayRecoveredEditsIfAny(maxSeqIdInStores, null, status);<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      assertEquals(maxSeqId, seqId);<a name="line.719"></a>
-<span class="sourceLineNo">720</span>      region.getMVCC().advanceTo(seqId);<a name="line.720"></a>
-<span class="sourceLineNo">721</span>      Get get = new Get(row);<a name="line.721"></a>
-<span class="sourceLineNo">722</span>      Result result = region.get(get);<a name="line.722"></a>
-<span class="sourceLineNo">723</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.723"></a>
-<span class="sourceLineNo">724</span>        List&lt;Cell&gt; kvs = result.getColumnCells(family, Bytes.toBytes(i));<a name="line.724"></a>
-<span class="sourceLineNo">725</span>        assertEquals(1, kvs.size());<a name="line.725"></a>
-<span class="sourceLineNo">726</span>        assertArrayEquals(Bytes.toBytes(i), CellUtil.cloneValue(kvs.get(0)));<a name="line.726"></a>
-<span class="sourceLineNo">727</span>      }<a name="line.727"></a>
-<span class="sourceLineNo">728</span>    } finally {<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      this.region = null;<a name="line.730"></a>
-<span class="sourceLineNo">731</span>      wals.close();<a name="line.731"></a>
-<span class="sourceLineNo">732</span>    }<a name="line.732"></a>
-<span class="sourceLineNo">733</span>  }<a name="line.733"></a>
-<span class="sourceLineNo">734</span><a name="line.734"></a>
-<span class="sourceLineNo">735</span>  @Test<a name="line.735"></a>
-<span class="sourceLineNo">736</span>  public void testSkipRecoveredEditsReplaySomeIgnored() throws Exception {<a name="line.736"></a>
-<span class="sourceLineNo">737</span>    byte[] family = Bytes.toBytes("family");<a name="line.737"></a>
-<span class="sourceLineNo">738</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.738"></a>
-<span class="sourceLineNo">739</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.739"></a>
-<span class="sourceLineNo">740</span>    try {<a name="line.740"></a>
-<span class="sourceLineNo">741</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.741"></a>
-<span class="sourceLineNo">742</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.742"></a>
-<span class="sourceLineNo">743</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.743"></a>
-<span class="sourceLineNo">744</span><a name="line.744"></a>
-<span class="sourceLineNo">745</span>      Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.745"></a>
-<span class="sourceLineNo">746</span><a name="line.746"></a>
-<span class="sourceLineNo">747</span>      long maxSeqId = 1050;<a name="line.747"></a>
-<span class="sourceLineNo">748</span>      long minSeqId = 1000;<a name="line.748"></a>
-<span class="sourceLineNo">749</span><a name="line.749"></a>
-<span class="sourceLineNo">750</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.750"></a>
-<span class="sourceLineNo">751</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.751"></a>
-<span class="sourceLineNo">752</span>        fs.create(recoveredEdits);<a name="line.752"></a>
-<span class="sourceLineNo">753</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.753"></a>
-<span class="sourceLineNo">754</span><a name="line.754"></a>
-<span class="sourceLineNo">755</span>        long time = System.nanoTime();<a name="line.755"></a>
-<span class="sourceLineNo">756</span>        WALEdit edit = new WALEdit();<a name="line.756"></a>
-<span class="sourceLineNo">757</span>        edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.757"></a>
-<span class="sourceLineNo">758</span>            .toBytes(i)));<a name="line.758"></a>
-<span class="sourceLineNo">759</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.759"></a>
-<span class="sourceLineNo">760</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.760"></a>
-<span class="sourceLineNo">761</span><a name="line.761"></a>
-<span class="sourceLineNo">762</span>        writer.close();<a name="line.762"></a>
-<span class="sourceLineNo">763</span>      }<a name="line.763"></a>
-<span class="sourceLineNo">764</span>      long recoverSeqId = 1030;<a name="line.764"></a>
-<span class="sourceLineNo">765</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.766"></a>
-<span class="sourceLineNo">767</span>      for (HStore store : region.getStores()) {<a name="line.767"></a>
-<span class="sourceLineNo">768</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), recoverSeqId - 1);<a name="line.768"></a>
-<span class="sourceLineNo">769</span>      }<a name="line.769"></a>
-<span class="sourceLineNo">770</span>      long seqId = region.replayRecoveredEditsIfAny(maxSeqIdInStores, null, status);<a name="line.770"></a>
-<span class="sourceLineNo">771</span>      assertEquals(maxSeqId, seqId);<a name="line.771"></a>
-<span class="sourceLineNo">772</span>      region.getMVCC().advanceTo(seqId);<a name="line.772"></a>
-<span class="sourceLineNo">773</span>      Get get = new Get(row);<a name="line.773"></a>
-<span class="sourceLineNo">774</span>      Result result = region.get(get);<a name="line.774"></a>
-<span class="sourceLineNo">775</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.775"></a>
-<span class="sourceLineNo">776</span>        List&lt;Cell&gt; kvs = result.getColumnCells(family, Bytes.toBytes(i));<a name="line.776"></a>
-<span class="sourceLineNo">777</span>        if (i &lt; recoverSeqId) {<a name="line.777"></a>
-<span class="sourceLineNo">778</span>          assertEquals(0, kvs.size());<a name="line.778"></a>
-<span class="sourceLineNo">779</span>        } else {<a name="line.779"></a>
-<span class="sourceLineNo">780</span>          assertEquals(1, kvs.size());<a name="line.780"></a>
-<span class="sourceLineNo">781</span>          assertArrayEquals(Bytes.toBytes(i), CellUtil.cloneValue(kvs.get(0)));<a name="line.781"></a>
-<span class="sourceLineNo">782</span>        }<a name="line.782"></a>
-<span class="sourceLineNo">783</span>      }<a name="line.783"></a>
-<span class="sourceLineNo">784</span>    } finally {<a name="line.784"></a>
-<span class="sourceLineNo">785</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.785"></a>
-<span class="sourceLineNo">786</span>      this.region = null;<a name="line.786"></a>
-<span class="sourceLineNo">787</span>      wals.close();<a name="line.787"></a>
-<span class="sourceLineNo">788</span>    }<a name="line.788"></a>
-<span class="sourceLineNo">789</span>  }<a name="line.789"></a>
-<span class="sourceLineNo">790</span><a name="line.790"></a>
-<span class="sourceLineNo">791</span>  @Test<a name="line.791"></a>
-<span class="sourceLineNo">792</span>  public void testSkipRecoveredEditsReplayAllIgnored() throws Exception {<a name="line.792"></a>
-<span class="sourceLineNo">793</span>    byte[] family = Bytes.toBytes("family");<a name="line.793"></a>
-<span class="sourceLineNo">794</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.794"></a>
-<span class="sourceLineNo">795</span>    Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.795"></a>
-<span class="sourceLineNo">796</span>    FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.796"></a>
-<span class="sourceLineNo">797</span><a name="line.797"></a>
-<span class="sourceLineNo">798</span>    Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.798"></a>
-<span class="sourceLineNo">799</span>    for (int i = 1000; i &lt; 1050; i += 10) {<a name="line.799"></a>
-<span class="sourceLineNo">800</span>      Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.800"></a>
-<span class="sourceLineNo">801</span>      FSDataOutputStream dos = fs.create(recoveredEdits);<a name="line.801"></a>
-<span class="sourceLineNo">802</span>      dos.writeInt(i);<a name="line.802"></a>
-<span class="sourceLineNo">803</span>      dos.close();<a name="line.803"></a>
-<span class="sourceLineNo">804</span>    }<a name="line.804"></a>
-<span class="sourceLineNo">805</span>    long minSeqId = 2000;<a name="line.805"></a>
-<span class="sourceLineNo">806</span>    Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", minSeqId - 1));<a name="line.806"></a>
-<span class="sourceLineNo">807</span>    FSDataOutputStream dos = fs.create(recoveredEdits);<a name="line.807"></a>
-<span class="sourceLineNo">808</span>    dos.close();<a name="line.808"></a>
-<span class="sourceLineNo">809</span><a name="line.809"></a>
-<span class="sourceLineNo">810</span>    Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.810"></a>
-<span class="sourceLineNo">811</span>    for (HStore store : region.getStores()) {<a name="line.811"></a>
-<span class="sourceLineNo">812</span>      maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), minSeqId);<a name="line.812"></a>
-<span class="sourceLineNo">813</span>    }<a name="line.813"></a>
-<span class="sourceLineNo">814</span>    long seqId = region.replayRecoveredEditsIfAny(maxSeqIdInStores, null, null);<a name="line.814"></a>
-<span class="sourceLineNo">815</span>    assertEquals(minSeqId, seqId);<a name="line.815"></a>
-<span class="sourceLineNo">816</span>  }<a name="line.816"></a>
-<span class="sourceLineNo">817</span><a name="line.817"></a>
-<span class="sourceLineNo">818</span>  @Test<a name="line.818"></a>
-<span class="sourceLineNo">819</span>  public void testSkipRecoveredEditsReplayTheLastFileIgnored() throws Exception {<a name="line.819"></a>
-<span class="sourceLineNo">820</span>    byte[] family = Bytes.toBytes("family");<a name="line.820"></a>
-<span class="sourceLineNo">821</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.821"></a>
-<span class="sourceLineNo">822</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.822"></a>
-<span class="sourceLineNo">823</span>    try {<a name="line.823"></a>
-<span class="sourceLineNo">824</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.824"></a>
-<span class="sourceLineNo">825</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.825"></a>
-<span class="sourceLineNo">826</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.826"></a>
-<span class="sourceLineNo">827</span>      byte[][] columns = region.getTableDescriptor().getColumnFamilyNames().toArray(new byte[0][]);<a name="line.827"></a>
-<span class="sourceLineNo">828</span><a name="line.828"></a>
-<span class="sourceLineNo">829</span>      assertEquals(0, region.getStoreFileList(columns).size());<a name="line.829"></a>
-<span class="sourceLineNo">830</span><a name="line.830"></a>
-<span class="sourceLineNo">831</span>      Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.831"></a>
-<span class="sourceLineNo">832</span><a name="line.832"></a>
-<span class="sourceLineNo">833</span>      long maxSeqId = 1050;<a name="line.833"></a>
-<span class="sourceLineNo">834</span>      long minSeqId = 1000;<a name="line.834"></a>
-<span class="sourceLineNo">835</span><a name="line.835"></a>
-<span class="sourceLineNo">836</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.836"></a>
-<span class="sourceLineNo">837</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.837"></a>
-<span class="sourceLineNo">838</span>        fs.create(recoveredEdits);<a name="line.838"></a>
-<span class="sourceLineNo">839</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.839"></a>
-<span class="sourceLineNo">840</span><a name="line.840"></a>
-<span class="sourceLineNo">841</span>        long time = System.nanoTime();<a name="line.841"></a>
-<span class="sourceLineNo">842</span>        WALEdit edit = null;<a name="line.842"></a>
-<span class="sourceLineNo">843</span>        if (i == maxSeqId) {<a name="line.843"></a>
-<span class="sourceLineNo">844</span>          edit = WALEdit.createCompaction(region.getRegionInfo(),<a name="line.844"></a>
-<span class="sourceLineNo">845</span>          CompactionDescriptor.newBuilder()<a name="line.845"></a>
-<span class="sourceLineNo">846</span>          .setTableName(ByteString.copyFrom(tableName.getName()))<a name="line.846"></a>
-<span class="sourceLineNo">847</span>          .setFamilyName(ByteString.copyFrom(regionName))<a name="line.847"></a>
-<span class="sourceLineNo">848</span>          .setEncodedRegionName(ByteString.copyFrom(regionName))<a name="line.848"></a>
-<span class="sourceLineNo">849</span>          .setStoreHomeDirBytes(ByteString.copyFrom(Bytes.toBytes(regiondir.toString())))<a name="line.849"></a>
-<span class="sourceLineNo">850</span>          .setRegionName(ByteString.copyFrom(region.getRegionInfo().getRegionName()))<a name="line.850"></a>
-<span class="sourceLineNo">851</span>          .build());<a name="line.851"></a>
-<span class="sourceLineNo">852</span>        } else {<a name="line.852"></a>
-<span class="sourceLineNo">853</span>          edit = new WALEdit();<a name="line.853"></a>
-<span class="sourceLineNo">854</span>          edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.854"></a>
-<span class="sourceLineNo">855</span>            .toBytes(i)));<a name="line.855"></a>
-<span class="sourceLineNo">856</span>        }<a name="line.856"></a>
-<span class="sourceLineNo">857</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.857"></a>
-<span class="sourceLineNo">858</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.858"></a>
-<span class="sourceLineNo">859</span>        writer.close();<a name="line.859"></a>
-<span class="sourceLineNo">860</span>      }<a name="line.860"></a>
-<span class="sourceLineNo">861</span><a name="line.861"></a>
-<span class="sourceLineNo">862</span>      long recoverSeqId = 1030;<a name="line.862"></a>
-<span class="sourceLineNo">863</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.863"></a>
-<span class="sourceLineNo">864</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.864"></a>
-<span class="sourceLineNo">865</span>      for (HStore store : region.getStores()) {<a name="line.865"></a>
-<span class="sourceLineNo">866</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), recoverSeqId - 1);<a name="line.866"></a>
-<span class="sourceLineNo">867</span>      }<a name="line.867"></a>
-<span class="sourceLineNo">868</span>      long seqId = region.replayRecoveredEditsIfAny(maxSeqIdInStores, null, status);<a name="line.868"></a>
-<span class="sourceLineNo">869</span>      assertEquals(maxSeqId, seqId);<a name="line.869"></a>
-<span class="sourceLineNo">870</span><a name="line.870"></a>
-<span class="sourceLineNo">871</span>      // assert that the files are flushed<a name="line.871"></a>
-<span class="sourceLineNo">872</span>      assertEquals(1, region.getStoreFileList(columns).size());<a name="line.872"></a>
-<span class="sourceLineNo">873</span><a name="line.873"></a>
-<span class="sourceLineNo">874</span>    } finally {<a name="line.874"></a>
-<span class="sourceLineNo">875</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.875"></a>
-<span class="sourceLineNo">876</span>      this.region = null;<a name="line.876"></a>
-<span class="sourceLineNo">877</span>      wals.close();<a name="line.877"></a>
-<span class="sourceLineNo">878</span>    }<a name="line.878"></a>
-<span class="sourceLineNo">879</span>  }<a name="line.879"></a>
-<span class="sourceLineNo">880</span><a name="line.880"></a>
-<span class="sourceLineNo">881</span>  @Test<a name="line.881"></a>
-<span class="sourceLineNo">882</span>  public void testRecoveredEditsReplayCompaction() throws Exception {<a name="line.882"></a>
-<span class="sourceLineNo">883</span>    testRecoveredEditsReplayCompaction(false);<a name="line.883"></a>
-<span class="sourceLineNo">884</span>    testRecoveredEditsReplayCompaction(true);<a name="line.884"></a>
-<span class="sourceLineNo">885</span>  }<a name="line.885"></a>
-<span class="sourceLineNo">886</span><a name="line.886"></a>
-<span class="sourceLineNo">887</span>  public void testRecoveredEditsReplayCompaction(boolean mismatchedRegionName) throws Exception {<a name="line.887"></a>
-<span class="sourceLineNo">888</span>    CONF.setClass(HConstants.REGION_IMPL, HRegionForTesting.class, Region.class);<a name="line.888"></a>
-<span class="sourceLineNo">889</span>    byte[] family = Bytes.toBytes("family");<a name="line.889"></a>
-<span class="sourceLineNo">890</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.890"></a>
-<span class="sourceLineNo">891</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.891"></a>
-<span class="sourceLineNo">892</span>    try {<a name="line.892"></a>
-<span class="sourceLineNo">893</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.893"></a>
-<span class="sourceLineNo">894</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.894"></a>
-<span class="sourceLineNo">895</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.895"></a>
-<span class="sourceLineNo">896</span><a name="line.896"></a>
-<span class="sourceLineNo">897</span>      long maxSeqId = 3;<a name="line.897"></a>
-<span class="sourceLineNo">898</span>      long minSeqId = 0;<a name="line.898"></a>
-<span class="sourceLineNo">899</span><a name="line.899"></a>
-<span class="sourceLineNo">900</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.900"></a>
-<span class="sourceLineNo">901</span>        Put put = new Put(Bytes.toBytes(i));<a name="line.901"></a>
-<span class="sourceLineNo">902</span>        put.addColumn(family, Bytes.toBytes(i), Bytes.toBytes(i));<a name="line.902"></a>
-<span class="sourceLineNo">903</span>        region.put(put);<a name="line.903"></a>
-<span class="sourceLineNo">904</span>        region.flush(true);<a name="line.904"></a>
-<span class="sourceLineNo">905</span>      }<a name="line.905"></a>
-<span class="sourceLineNo">906</span><a name="line.906"></a>
-<span class="sourceLineNo">907</span>      // this will create a region with 3 files<a name="line.907"></a>
-<span class="sourceLineNo">908</span>      assertEquals(3, region.getStore(family).getStorefilesCount());<a name="line.908"></a>
-<span class="sourceLineNo">909</span>      List&lt;Path&gt; storeFiles = new ArrayList&lt;&gt;(3);<a name="line.909"></a>
-<span class="sourceLineNo">910</span>      for (HStoreFile sf : region.getStore(family).getStorefiles()) {<a name="line.910"></a>
-<span class="sourceLineNo">911</span>        storeFiles.add(sf.getPath());<a name="line.911"></a>
-<span class="sourceLineNo">912</span>      }<a name="line.912"></a>
-<span class="sourceLineNo">913</span><a name="line.913"></a>
-<span class="sourceLineNo">914</span>      // disable compaction completion<a name="line.914"></a>
-<span class="sourceLineNo">915</span>      CONF.setBoolean("hbase.hstore.compaction.complete", false);<a name="line.915"></a>
-<span class="sourceLineNo">916</span>      region.compactStores();<a name="line.916"></a>
-<span class="sourceLineNo">917</span><a name="line.917"></a>
-<span class="sourceLineNo">918</span>      // ensure that nothing changed<a name="line.918"></a>
-<span class="sourceLineNo">919</span>      assertEquals(3, region.getStore(family).getStorefilesCount());<a name="line.919"></a>
-<span class="sourceLineNo">920</span><a name="line.920"></a>
-<span class="sourceLineNo">921</span>      // now find the compacted file, and manually add it to the recovered edits<a name="line.921"></a>
-<span class="sourceLineNo">922</span>      Path tmpDir = new Path(region.getRegionFileSystem().getTempDir(), Bytes.toString(family));<a name="line.922"></a>
-<span class="sourceLineNo">923</span>      FileStatus[] files = FSUtils.listStatus(fs, tmpDir);<a name="line.923"></a>
-<span class="sourceLineNo">924</span>      String errorMsg = "Expected to find 1 file in the region temp directory "<a name="line.924"></a>
-<span class="sourceLineNo">925</span>          + "from the compaction, could not find any";<a name="line.925"></a>
-<span class="sourceLineNo">926</span>      assertNotNull(errorMsg, files);<a name="line.926"></a>
-<span class="sourceLineNo">927</span>      assertEquals(errorMsg, 1, files.length);<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      // move the file inside region dir<a name="line.928"></a>
-<span class="sourceLineNo">929</span>      Path newFile = region.getRegionFileSystem().commitStoreFile(Bytes.toString(family),<a name="line.929"></a>
-<span class="sourceLineNo">930</span>          files[0].getPath());<a name="line.930"></a>
-<span class="sourceLineNo">931</span><a name="line.931"></a>
-<span class="sourceLineNo">932</span>      byte[] encodedNameAsBytes = this.region.getRegionInfo().getEncodedNameAsBytes();<a name="line.932"></a>
-<span class="sourceLineNo">933</span>      byte[] fakeEncodedNameAsBytes = new byte [encodedNameAsBytes.length];<a name="line.933"></a>
-<span class="sourceLineNo">934</span>      for (int i=0; i &lt; encodedNameAsBytes.length; i++) {<a name="line.934"></a>
-<span class="sourceLineNo">935</span>        // Mix the byte array to have a new encodedName<a name="line.935"></a>
-<span class="sourceLineNo">936</span>        fakeEncodedNameAsBytes[i] = (byte) (encodedNameAsBytes[i] + 1);<a name="line.936"></a>
-<span class="sourceLineNo">937</span>      }<a name="line.937"></a>
-<span class="sourceLineNo">938</span><a name="line.938"></a>
-<span class="sourceLineNo">939</span>      CompactionDescriptor compactionDescriptor = ProtobufUtil.toCompactionDescriptor(this.region<a name="line.939"></a>
-<span class="sourceLineNo">940</span>        .getRegionInfo(), mismatchedRegionName ? fakeEncodedNameAsBytes : null, family,<a name="line.940"></a>
-<span class="sourceLineNo">941</span>            storeFiles, Lists.newArrayList(newFile),<a name="line.941"></a>
-<span class="sourceLineNo">942</span>            region.getRegionFileSystem().getStoreDir(Bytes.toString(family)));<a name="line.942"></a>
-<span class="sourceLineNo">943</span><a name="line.943"></a>
-<span class="sourceLineNo">944</span>      WALUtil.writeCompactionMarker(region.getWAL(), this.region.getReplicationScope(),<a name="line.944"></a>
-<span class="sourceLineNo">945</span>          this.region.getRegionInfo(), compactionDescriptor, region.getMVCC());<a name="line.945"></a>
-<span class="sourceLineNo">946</span><a name="line.946"></a>
-<span class="sourceLineNo">947</span>      Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.947"></a>
-<span class="sourceLineNo">948</span><a name="line.948"></a>
-<span class="sourceLineNo">949</span>      Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", 1000));<a name="line.949"></a>
-<span class="sourceLineNo">950</span>      fs.create(recoveredEdits);<a name="line.950"></a>
-<span class="sourceLineNo">951</span>      WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.951"></a>
-<span class="sourceLineNo">952</span><a name="line.952"></a>
-<span class="sourceLineNo">953</span>      long time = System.nanoTime();<a name="line.953"></a>
-<span class="sourceLineNo">954</span><a name="line.954"></a>
-<span class="sourceLineNo">955</span>      writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, 10, time,<a name="line.955"></a>
-<span class="sourceLineNo">956</span>          HConstants.DEFAULT_CLUSTER_ID), WALEdit.createCompaction(region.getRegionInfo(),<a name="line.956"></a>
-<span class="sourceLineNo">957</span>          compactionDescriptor)));<a name="line.957"></a>
-<span class="sourceLineNo">958</span>      writer.close();<a name="line.958"></a>
-<span class="sourceLineNo">959</span><a name="line.959"></a>
-<span class="sourceLineNo">960</span>      // close the region now, and reopen again<a name="line.960"></a>
-<span class="sourceLineNo">961</span>      region.getTableDescriptor();<a name="line.961"></a>
-<span class="sourceLineNo">962</span>      region.getRegionInfo();<a name="line.962"></a>
-<span class="sourceLineNo">963</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.963"></a>
-<span class="sourceLineNo">964</span>      try {<a name="line.964"></a>
-<span class="sourceLineNo">965</span>        region = HRegion.openHRegion(region, null);<a name="line.965"></a>
-<span class="sourceLineNo">966</span>      } catch (WrongRegionException wre) {<a name="line.966"></a>
-<span class="sourceLineNo">967</span>        fail("Matching encoded region name should not have produced WrongRegionException");<a name="line.967"></a>
-<span class="sourceLineNo">968</span>      }<a name="line.968"></a>
-<span class="sourceLineNo">969</span><a name="line.969"></a>
-<span class="sourceLineNo">970</span>      // now check whether we have only one store file, the compacted one<a name="line.970"></a>
-<span class="sourceLineNo">971</span>      Collection&lt;HStoreFile&gt; sfs = region.getStore(family).getStorefiles();<a name="line.971"></a>
-<span class="sourceLineNo">972</span>      for (HStoreFile sf : sfs) {<a name="line.972"></a>
-<span class="sourceLineNo">973</span>        LOG.info(Objects.toString(sf.getPath()));<a name="line.973"></a>
-<span class="sourceLineNo">974</span>      }<a name="line.974"></a>
-<span class="sourceLineNo">975</span>      if (!mismatchedRegionName) {<a name="line.975"></a>
-<span class="sourceLineNo">976</span>        assertEquals(1, region.getStore(family).getStorefilesCount());<a name="line.976"></a>
-<span class="sourceLineNo">977</span>      }<a name="line.977"></a>
-<span class="sourceLineNo">978</span>      files = FSUtils.listStatus(fs, tmpDir);<a name="line.978"></a>
-<span class="sourceLineNo">979</span>      assertTrue("Expected to find 0 files inside " + tmpDir, files == null || files.length == 0);<a name="line.979"></a>
-<span class="sourceLineNo">980</span><a name="line.980"></a>
-<span class="sourceLineNo">981</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.981"></a>
-<span class="sourceLineNo">982</span>        Get get = new Get(Bytes.toBytes(i));<a name="line.982"></a>
-<span class="sourceLineNo">983</span>        Result result = region.get(get);<a name="line.983"></a>
-<span class="sourceLineNo">984</span>        byte[] value = result.getValue(family, Bytes.toBytes(i));<a name="line.984"></a>
-<span class="sourceLineNo">985</span>        assertArrayEquals(Bytes.toBytes(i), value);<a name="line.985"></a>
-<span class="sourceLineNo">986</span>      }<a name="line.986"></a>
-<span class="sourceLineNo">987</span>    } finally {<a name="line.987"></a>
-<span class="sourceLineNo">988</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.988"></a>
-<span class="sourceLineNo">989</span>      this.region = null;<a name="line.989"></a>
-<span class="sourceLineNo">990</span>      wals.close();<a name="line.990"></a>
-<span class="sourceLineNo">991</span>      CONF.setClass(HConstants.REGION_IMPL, HRegion.class, Region.class);<a name="line.991"></a>
-<span class="sourceLineNo">992</span>    }<a name="line.992"></a>
-<span class="sourceLineNo">993</span>  }<a name="line.993"></a>
-<span class="sourceLineNo">994</span><a name="line.994"></a>
-<span class="sourceLineNo">995</span>  @Test<a name="line.995"></a>
-<span class="sourceLineNo">996</span>  public void testFlushMarkers() throws Exception {<a name="line.996"></a>
-<span class="sourceLineNo">997</span>    // tests that flush markers are written to WAL and handled at recovered edits<a name="line.997"></a>
-<span class="sourceLineNo">998</span>    byte[] family = Bytes.toBytes("family");<a name="line.998"></a>
-<span class="sourceLineNo">999</span>    Path logDir = TEST_UTIL.getDataTestDirOnTestFS(method + ".log");<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>    final Configuration walConf = new Configuration(TEST_UTIL.getConfiguration());<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>    final WALFactory wals = new WALFactory(walConf, method);<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>    final WAL wal = wals.getWAL(RegionInfoBuilder.newBuilder(tableName).build());<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span><a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>    this.region = initHRegion(tableName, HConstants.EMPTY_START_ROW,<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>      HConstants.EMPTY_END_ROW, false, Durability.USE_DEFAULT, wal, family);<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>    try {<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span><a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>      long maxSeqId = 3;<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>      long minSeqId = 0;<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span><a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>        Put put = new Put(Bytes.toBytes(i));<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>        put.addColumn(family, Bytes.toBytes(i), Bytes.toBytes(i));<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>        region.put(put);<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>        region.flush(true);<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>      }<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span><a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>      // this will create a region with 3 files from flush<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>      assertEquals(3, region.getStore(family).getStorefilesCount());<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>      List&lt;String&gt; storeFiles = new ArrayList&lt;&gt;(3);<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>      for (HStoreFile sf : region.getStore(family).getStorefiles()) {<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>        storeFiles.add(sf.getPath().getName());<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>      }<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span><a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>      // now verify that the flush markers are written<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>      wal.shutdown();<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>      WAL.Reader reader = WALFactory.createReader(fs, AbstractFSWALProvider.getCurrentFileName(wal),<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>        TEST_UTIL.getConfiguration());<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>      try {<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>        List&lt;WAL.Entry&gt; flushDescriptors = new ArrayList&lt;&gt;();<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>        long lastFlushSeqId = -1;<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>        while (true) {<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>          WAL.Entry entry = reader.next();<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>          if (entry == null) {<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>            break;<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>          }<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>          Cell cell = entry.getEdit().getCells().get(0);<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>          if (WALEdit.isMetaEditFamily(cell)) {<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>            FlushDescriptor flushDesc = WALEdit.getFlushDescriptor(cell);<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>            assertNotNull(flushDesc);<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>            assertArrayEquals(tableName.getName(), flushDesc.getTableName().toByteArray());<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>            if (flushDesc.getAction() == FlushAction.START_FLUSH) {<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>              assertTrue(flushDesc.getFlushSequenceNumber() &gt; lastFlushSeqId);<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>            } else if (flushDesc.getAction() == FlushAction.COMMIT_FLUSH) {<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>              assertTrue(flushDesc.getFlushSequenceNumber() == lastFlushSeqId);<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>            }<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>            lastFlushSeqId = flushDesc.getFlushSequenceNumber();<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>            assertArrayEquals(regionName, flushDesc.getEncodedRegionName().toByteArray());<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>            assertEquals(1, flushDesc.getStoreFlushesCount()); //only one store<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>            StoreFlushDescriptor storeFlushDesc = flushDesc.getStoreFlushes(0);<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>            assertArrayEquals(family, storeFlushDesc.getFamilyName().toByteArray());<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>            assertEquals("family", storeFlushDesc.getStoreHomeDir());<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>            if (flushDesc.getAction() == FlushAction.START_FLUSH) {<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>              assertEquals(0, storeFlushDesc.getFlushOutputCount());<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>            } else {<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>              assertEquals(1, storeFlushDesc.getFlushOutputCount()); //only one file from flush<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>              assertTrue(storeFiles.contains(storeFlushDesc.getFlushOutput(0)));<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>            }<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span><a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>            flushDescriptors.add(entry);<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>          }<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>        }<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span><a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>        assertEquals(3 * 2, flushDescriptors.size()); // START_FLUSH and COMMIT_FLUSH per flush<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span><a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>        // now write those markers to the recovered edits again.<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span><a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>        Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span><a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", 1000));<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>        fs.create(recoveredEdits);<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span><a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>        for (WAL.Entry entry : flushDescriptors) {<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>          writer.append(entry);<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>        }<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>        writer.close();<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      } finally {<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>        if (null != reader) {<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>          try {<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>            reader.close();<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>          } catch (IOException exception) {<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>            LOG.warn("Problem closing wal: " + exception.getMessage());<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>            LOG.debug("exception details", exception);<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>          }<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>        }<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>      }<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span><a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>      // close the region now, and reopen again<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>      region = HRegion.openHRegion(region, null);<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span><a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>      // now check whether we have can read back the data from region<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>        Get get = new Get(Bytes.toBytes(i));<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>        Result result = region.get(get);<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>        byte[] value = result.getValue(family, Bytes.toBytes(i));<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>        assertArrayEquals(Bytes.toBytes(i), value);<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>      }<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>    } finally {<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>      this.region = null;<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>      wals.close();<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>    }<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>  }<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span><a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>  static class IsFlushWALMarker implements ArgumentMatcher&lt;WALEdit&gt; {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>    volatile FlushAction[] actions;<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>    public IsFlushWALMarker(FlushAction... actions) {<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>      this.actions = actions;<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>    }<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>    @Override<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>    public boolean matches(WALEdit edit) {<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>      List&lt;Cell&gt; cells = edit.getCells();<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>      if (cells.isEmpty()) {<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>        return false;<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>      }<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>      if (WALEdit.isMetaEditFamily(cells.get(0))) {<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>        FlushDescriptor desc;<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>        try {<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>          desc = WALEdit.getFlushDescriptor(cells.get(0));<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>        } catch (IOException e) {<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>          LOG.warn(e.toString(), e);<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>          return false;<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>        }<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>        if (desc != null) {<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>          for (FlushAction action : actions) {<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>            if (desc.getAction() == action) {<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>              return true;<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>            }<a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>          }<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>        }<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>      }<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>      return false;<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>    }<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>    public IsFlushWALMarker set(FlushAction... actions) {<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>      this.actions = actions;<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>      return this;<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>    }<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>  }<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span><a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>  @Test<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>  public void testFlushMarkersWALFail() throws Exception {<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>    // test the cases where the WAL append for flush markers fail.<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>    byte[] family = Bytes.toBytes("family");<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span><a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>    // spy an actual WAL implementation to throw exception (was not able to mock)<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>    Path logDir = TEST_UTIL.getDataTestDirOnTestFS(method + "log");<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span><a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>    final Configuration walConf = new Configuration(TEST_UTIL.getConfiguration());<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>    // Make up a WAL that we can manipulate at append time.<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    class FailAppendFlushMarkerWAL extends FSHLog {<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>      volatile FlushAction [] flushActions = null;<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span><a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>      public FailAppendFlushMarkerWAL(FileSystem fs, Path root, String logDir, Configuration conf)<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>      throws IOException {<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>        super(fs, root, logDir, conf);<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>      }<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span><a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>      @Override<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>      protected Writer createWriterInstance(Path path) throws IOException {<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>        final Writer w = super.createWriterInstance(path);<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>        return new Writer() {<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>          @Override<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>          public void close() throws IOException {<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>            w.close();<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>          }<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span><a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>          @Override<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>          public void sync(boolean forceSync) throws IOException {<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>            w.sync(forceSync);<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>          }<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span><a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>          @Override<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>          public void append(Entry entry) throws IOException {<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>            List&lt;Cell&gt; cells = entry.getEdit().getCells();<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>            if (WALEdit.isMetaEditFamily(cells.get(0))) {<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>              FlushDescriptor desc = WALEdit.getFlushDescriptor(cells.get(0));<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>              if (desc != null) {<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>                for (FlushAction flushAction: flushActions) {<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>                  if (desc.getAction().equals(flushAction)) {<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>                    throw new IOException("Failed to append flush marker! " + flushAction);<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>                  }<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>                }<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>              }<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>            }<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>            w.append(entry);<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>          }<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span><a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>          @Override<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>          public long getLength() {<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>            return w.getLength();<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>          }<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>        };<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>      }<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>    }<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>    FailAppendFlushMarkerWAL wal =<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>      new FailAppendFlushMarkerWAL(FileSystem.get(walConf), FSUtils.getRootDir(walConf),<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>        method, walConf);<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>    wal.init();<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>    this.region = initHRegion(tableName, HConstants.EMPTY_START_ROW,<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>      HConstants.EMPTY_END_ROW, false, Durability.USE_DEFAULT, wal, family);<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>    int i = 0;<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>    Put put = new Put(Bytes.toBytes(i));<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>    put.setDurability(Durability.SKIP_WAL); // have to skip mocked wal<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>    put.addColumn(family, Bytes.toBytes(i), Bytes.toBytes(i));<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>    region.put(put);<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span><a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>    // 1. Test case where START_FLUSH throws exception<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>    wal.flushActions = new FlushAction [] {FlushAction.START_FLUSH};<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span><a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>    // start cache flush will throw exception<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>    try {<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>      region.flush(true);<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>      fail("This should have thrown exception");<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>    } catch (DroppedSnapshotException unexpected) {<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>      // this should not be a dropped snapshot exception. Meaning that RS will not abort<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>      throw unexpected;<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>    } catch (IOException expected) {<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>      // expected<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>    }<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>    // The WAL is hosed now. It has two edits appended. We cannot roll the log without it<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>    // throwing a DroppedSnapshotException to force an abort. Just clean up the mess.<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>    region.close(true);<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>    wal.close();<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span><a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>    // 2. Test case where START_FLUSH succeeds but COMMIT_FLUSH will throw exception<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>    wal.flushActions = new FlushAction [] {FlushAction.COMMIT_FLUSH};<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>    wal = new FailAppendFlushMarkerWAL(FileSystem.get(walConf), FSUtils.getRootDir(walConf),<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>          method, walConf);<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>    wal.init();<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>    this.region = initHRegion(tableName, HConstants.EMPTY_START_ROW,<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>      HConstants.EMPTY_END_ROW, false, Durability.USE_DEFAULT, wal, family);<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    region.put(put);<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span><a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>    // 3. Test case where ABORT_FLUSH will throw exception.<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>    // Even if ABORT_FLUSH throws exception, we should not fail with IOE, but continue with<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>    // DroppedSnapshotException. Below COMMMIT_FLUSH will cause flush to abort<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>    wal.flushActions = new FlushAction [] {FlushAction.COMMIT_FLUSH, FlushAction.ABORT_FLUSH};<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span><a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>    try {<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>      region.flush(true);<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>      fail("This should have thrown exception");<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>    } catch (DroppedSnapshotException expected) {<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>      // we expect this exception, since we were able to write the snapshot, but failed to<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span>      // write the flush marker to WAL<a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>    } catch (IOException unexpected) {<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>      throw unexpected;<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>    }<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>  }<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span><a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>  @Test<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>  public void testGetWhileRegionClose() throws IOException {<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>    Configuration hc = initSplit();<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>    int numRows = 100;<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>    byte[][] families = { fam1, fam2, fam3 };<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span><a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>    // Setting up region<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>    this.region = initHRegion(tableName, method, hc, families);<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>    // Put data in region<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>    final int startRow = 100;<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>    putData(startRow, numRows, qual1, families);<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>    putData(startRow, numRows, qual2, families);<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>    putData(startRow, numRows, qual3, families);<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    final AtomicBoolean done = new AtomicBoolean(false);<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>    final AtomicInteger gets = new AtomicInteger(0);<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>    GetTillDoneOrException[] threads = new GetTillDoneOrException[10];<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>    try {<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>      // Set ten threads running concurrently getting from the region.<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>      for (int i = 0; i &lt; threads.length / 2; i++) {<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>        threads[i] = new GetTillDoneOrException(i, Bytes.toBytes("" + startRow), done, gets);<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>        threads[i].setDaemon(true);<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>        threads[i].start();<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span>      }<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>      // Artificially make the condition by setting closing flag explicitly.<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>      // I can't make the issue happen with a call to region.close().<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>      this.region.closing.set(true);<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>      for (int i = threads.length / 2; i &lt; threads.length; i++) {<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>        threads[i] = new GetTillDoneOrException(i, Bytes.toBytes("" + startRow), done, gets);<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>        threads[i].setDaemon(true);<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>        threads[i].start();<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>      }<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>    } finally {<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>      if (this.region != null) {<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>        HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>        this.region = null;<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>      }<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>    }<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>    done.set(true);<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>    for (GetTillDoneOrException t : threads) {<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>      try {<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>        t.join();<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>      } catch (InterruptedException e) {<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>        e.printStackTrace();<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>      }<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>      if (t.e != null) {<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>        LOG.info("Exception=" + t.e);<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>        assertFalse("Found a NPE in " + t.getName(), t.e instanceof NullPointerException);<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>      }<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>    }<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>  }<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span><a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>  /*<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>   * Thread that does get on single row until 'done' flag is flipped. If an<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>   * exception causes us to fail, it records it.<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>   */<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>  class GetTillDoneOrException extends Thread {<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>    private final Get g;<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>    private final AtomicBoolean done;<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>    private final AtomicInteger count;<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>    private Exception e;<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span><a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>    GetTillDoneOrException(final int i, final byte[] r, final AtomicBoolean d,<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>        final AtomicInteger c) {<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>      super("getter." + i);<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>      this.g = new Get(r);<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>      this.done = d;<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>      this.count = c;<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>    }<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span><a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    @Override<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span>    public void run() {<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>      while (!this.done.get()) {<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>        try {<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>          assertTrue(region.get(g).size() &gt; 0);<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>          this.count.incrementAndGet();<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>        } catch (Exception e) {<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>          this.e = e;<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>          break;<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>        }<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>      }<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>    }<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>  }<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span><a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>  /*<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>   * An involved filter test. Has multiple column families and deletes in mix.<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>   */<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>  @Test<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>  public void testWeirdCacheBehaviour() throws Exception {<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>    byte[][] FAMILIES = new byte[][] { Bytes.toBytes("trans-blob"), Bytes.toBytes("trans-type"),<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>        Bytes.toBytes("trans-date"), Bytes.toBytes("trans-tags"), Bytes.toBytes("trans-group") };<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>    this.region = initHRegion(tableName, method, CONF, FAMILIES);<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>    String value = "this is the value";<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>    String value2 = "this is some other value";<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>    String keyPrefix1 = "prefix1";<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>    String keyPrefix2 = "prefix2";<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>    String keyPrefix3 = "prefix3";<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>    putRows(this.region, 3, value, keyPrefix1);<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>    putRows(this.region, 3, value, keyPrefix2);<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>    putRows(this.region, 3, value, keyPrefix3);<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>    putRows(this.region, 3, value2, keyPrefix1);<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>    putRows(this.region, 3, value2, keyPrefix2);<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>    putRows(this.region, 3, value2, keyPrefix3);<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>    System.out.println("Checking values for key: " + keyPrefix1);<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>    assertEquals("Got back incorrect number of rows from scan", 3,<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>        getNumberOfRows(keyPrefix1, value2, this.region));<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>    System.out.println("Checking values for key: " + keyPrefix2);<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>    assertEquals("Got back incorrect number of rows from scan", 3,<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>        getNumberOfRows(keyPrefix2, value2, this.region));<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>    System.out.println("Checking values for key: " + keyPrefix3);<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>    assertEquals("Got back incorrect number of rows from scan", 3,<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>        getNumberOfRows(keyPrefix3, value2, this.region));<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>    deleteColumns(this.region, value2, keyPrefix1);<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>    deleteColumns(this.region, value2, keyPrefix2);<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>    deleteColumns(this.region, value2, keyPrefix3);<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>    System.out.println("Starting important checks.....");<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>    assertEquals("Got back incorrect number of rows from scan: " + keyPrefix1, 0,<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>        getNumberOfRows(keyPrefix1, value2, this.region));<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>    assertEquals("Got back incorrect number of rows from scan: " + keyPrefix2, 0,<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>        getNumberOfRows(keyPrefix2, value2, this.region));<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>    assertEquals("Got back incorrect number of rows from scan: " + keyPrefix3, 0,<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>        getNumberOfRows(keyPrefix3, value2, this.region));<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>  }<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span><a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>  @Test<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>  public void testAppendWithReadOnlyTable() throws Exception {<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>    this.region = initHRegion(tableName, method, CONF, true, Bytes.toBytes("somefamily"));<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span>    boolean exceptionCaught = false;<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>    Append append = new Append(Bytes.toBytes("somerow"));<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>    append.setDurability(Durability.SKIP_WAL);<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>    append.addColumn(Bytes.toBytes("somefamily"), Bytes.toBytes("somequalifier"),<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>        Bytes.toBytes("somevalue"));<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>    try {<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>      region.append(append);<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>    } catch (IOException e) {<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>      exceptionCaught = true;<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>    }<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>    assertTrue(exceptionCaught == true);<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>  }<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span><a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>  @Test<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>  public void testIncrWithReadOnlyTable() throws Exception {<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>    this.region = initHRegion(tableName, method, CONF, true, Bytes.toBytes("somefamily"));<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>    boolean exceptionCaught = false;<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>    Increment inc = new Increment(Bytes.toBytes("somerow"));<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>    inc.setDurability(Durability.SKIP_WAL);<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>    inc.addColumn(Bytes.toBytes("somefamily"), Bytes.toBytes("somequalifier"), 1L);<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>    try {<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>      region.increment(inc);<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>    } catch (IOException e) {<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>      exceptionCaught = true;<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>    }<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>    assertTrue(exceptionCaught == true);<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>  }<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span><a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>  private void deleteColumns(HRegion r, String value, String keyPrefix) throws IOException {<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>    InternalScanner scanner = buildScanner(keyPrefix, value, r);<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>    int count = 0;<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>    boolean more = false;<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>    do {<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>      more = scanner.next(results);<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>      if (results != null &amp;&amp; !results.isEmpty())<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>        count++;<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>      else<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>        break;<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>      Delete delete = new Delete(CellUtil.cloneRow(results.get(0)));<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>      delete.addColumn(Bytes.toBytes("trans-tags"), Bytes.toBytes("qual2"));<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>      r.delete(delete);<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>      results.clear();<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>    } while (more);<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>    assertEquals("Did not perform correct number of deletes", 3, count);<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>  }<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span><a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>  private int getNumberOfRows(String keyPrefix, String value, HRegion r) throws Exception {<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>    InternalScanner resultScanner = buildScanner(keyPrefix, value, r);<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>    int numberOfResults = 0;<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>    boolean more = false;<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>    do {<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>      more = resultScanner.next(results);<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>      if (results != null &amp;&amp; !results.isEmpty())<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>        numberOfResults++;<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>      else<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>        break;<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>      for (Cell kv : results) {<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>        System.out.println("kv=" + kv.toString() + ", " + Bytes.toString(CellUtil.cloneValue(kv)));<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>      }<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>      results.clear();<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>    } while (more);<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>    return numberOfResults;<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>  }<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span><a name="line.1451"></a>
-<span class="sourceLineNo">1452</span>  private InternalScanner buildScanner(String keyPrefix, String value, HRegion r)<a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>      throws IOException {<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>    // Defaults FilterList.Operator.MUST_PASS_ALL.<a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>    FilterList allFilters = new FilterList();<a name="line.1455"></a>
-<span class="sourceLineNo">1456</span>    allFilters.addFilter(new PrefixFilter(Bytes.toBytes(keyPrefix)));<a name="line.1456"></a>
-<span class="sourceLineNo">1457</span>    // Only return rows where this column value exists in the row.<a name="line.1457"></a>
-<span class="sourceLineNo">1458</span>    SingleColumnValueFilter filter = new SingleColumnValueFilter(Bytes.toBytes("trans-tags"),<a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>        Bytes.toBytes("qual2"), CompareOperator.EQUAL, Bytes.toBytes(value));<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>    filter.setFilterIfMissing(true);<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>    allFilters.addFilter(filter);<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span>    Scan scan = new Scan();<a name="line.1462"></a>
-<span class="sourceLineNo">1463</span>    scan.addFamily(Bytes.toBytes("trans-blob"));<a name="line.1463"></a>
-<span class="sourceLineNo">1464</span>    scan.addFamily(Bytes.toBytes("trans-type"));<a name="line.1464"></a>
-<span class="sourceLineNo">1465</span>    scan.addFamily(Bytes.toBytes("trans-date"));<a name="line.1465"></a>
-<span class="sourceLineNo">1466</span>    scan.addFamily(Bytes.toBytes("trans-tags"));<a name="line.1466"></a>
-<span class="sourceLineNo">1467</span>    scan.addFamily(Bytes.toBytes("trans-group"));<a name="line.1467"></a>
-<span class="sourceLineNo">1468</span>    scan.setFilter(allFilters);<a name="line.1468"></a>
-<span class="sourceLineNo">1469</span>    return r.getScanner(scan);<a name="line.1469"></a>
-<span class="sourceLineNo">1470</span>  }<a name="line.1470"></a>
-<span class="sourceLineNo">1471</span><a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>  private void putRows(HRegion r, int numRows, String value, String key) throws IOException {<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span>    for (int i = 0; i &lt; numRows; i++) {<a name="line.1473"></a>
-<span class="sourceLineNo">1474</span>      String row = key + "_" + i/* UUID.randomUUID().toString() */;<a name="line.1474"></a>
-<span class="sourceLineNo">1475</span>      System.out.println(String.format("Saving row: %s, with value %s", row, value));<a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>      Put put = new Put(Bytes.toBytes(row));<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>      put.setDurability(Durability.SKIP_WAL);<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span>      put.addColumn(Bytes.toBytes("trans-blob"), null, Bytes.toBytes("value for blob"));<a name="line.1478"></a>
-<span class="sourceLineNo">1479</span>      put.addColumn(Bytes.toBytes("trans-type"), null, Bytes.toBytes("statement"));<a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>      put.addColumn(Bytes.toBytes("trans-date"), null, Bytes.toBytes("20090921010101999"));<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>      put.addColumn(Bytes.toBytes("trans-tags"), Bytes.toBytes("qual2"), Bytes.toBytes(value));<a name="line.1481"></a>
-<span class="sourceLineNo">1482</span>      put.addColumn(Bytes.toBytes("trans-group"), null, Bytes.toBytes("adhocTransactionGroupId"));<a name="line.1482"></a>
-<span class="sourceLineNo">1483</span>      r.put(put);<a name="line.1483"></a>
-<span class="sourceLineNo">1484</span>    }<a name="line.1484"></a>
-<span class="sourceLineNo">1485</span>  }<a name="line.1485"></a>
-<span class="sourceLineNo">1486</span><a name="line.1486"></a>
-<span class="sourceLineNo">1487</span>  @Test<a name="line.1487"></a>
-<span class="sourceLineNo">1488</span>  public void testFamilyWithAndWithoutColon() throws Exception {<a name="line.1488"></a>
-<span class="sourceLineNo">1489</span>    byte[] cf = Bytes.toBytes(COLUMN_FAMILY);<a name="line.1489"></a>
-<span class="sourceLineNo">1490</span>    this.region = initHRegion(tableName, method, CONF, cf);<a name="line.1490"></a>
-<span class="sourceLineNo">1491</span>    Put p = new Put(tableName.toBytes());<a name="line.1491"></a>
-<span class="sourceLineNo">1492</span>    byte[] cfwithcolon = Bytes.toBytes(COLUMN_FAMILY + ":");<a name="line.1492"></a>
-<span class="sourceLineNo">1493</span>    p.addColumn(cfwithcolon, cfwithcolon, cfwithcolon);<a name="line.1493"></a>
-<span class="sourceLineNo">1494</span>    boolean exception = false;<a name="line.1494"></a>
-<span class="sourceLineNo">1495</span>    try {<a name="line.1495"></a>
-<span class="sourceLineNo">1496</span>      this.region.put(p);<a name="line.1496"></a>
-<span class="sourceLineNo">1497</span>    } catch (NoSuchColumnFamilyException e) {<a name="line.1497"></a>
-<span class="sourceLineNo">1498</span>      exception = true;<a name="line.1498"></a>
-<span class="sourceLineNo">1499</span>    }<a name="line.1499"></a>
-<span class="sourceLineNo">1500</span>    assertTrue(exception);<a name="line.1500"></a>
-<span class="sourceLineNo">1501</span>  }<a name="line.1501"></a>
-<span class="sourceLineNo">1502</span><a name="line.1502"></a>
-<span class="sourceLineNo">1503</span>  @Test<a name="line.1503"></a>
-<span class="sourceLineNo">1504</span>  public void testBatchPut_whileNoRowLocksHeld() throws IOException {<a name="line.1504"></a>
-<span class="sourceLineNo">1505</span>    final Put[] puts = new Put[10];<a name="line.1505"></a>
-<span class="sourceLineNo">1506</span>    MetricsWALSource source = CompatibilitySingletonFactory.getInstance(MetricsWALSource.class);<a name="line.1506"></a>
-<span class="sourceLineNo">1507</span>    long syncs = prepareRegionForBachPut(puts, source, false);<a name="line.1507"></a>
-<span class="sourceLineNo">1508</span><a name="line.1508"></a>
-<span class="sourceLineNo">1509</span>    OperationStatus[] codes = this.region.batchMutate(puts);<a name="line.1509"></a>
-<span class="sourceLineNo">1510</span>    assertEquals(10, codes.length);<a name="line.1510"></a>
-<span class="sourceLineNo">1511</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.1511"></a>
-<span class="sourceLineNo">1512</span>      assertEquals(OperationStatusCode.SUCCESS, codes[i].getOperationStatusCode());<a name="line.1512"></a>
-<span class="sourceLineNo">1513</span>    }<a name="line.1513"></a>
-<span class="sourceLineNo">1514</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs + 1, source);<a name="line.1514"></a>
-<span class="sourceLineNo">1515</span><a name="line.1515"></a>
-<span class="sourceLineNo">1516</span>    LOG.info("Next a batch put with one invalid family");<a name="line.1516"></a>
-<span class="sourceLineNo">1517</span>    puts[5].addColumn(Bytes.toBytes("BAD_CF"), qual, value);<a name="line.1517"></a>
-<span class="sourceLineNo">1518</span>    codes = this.region.batchMutate(puts);<a name="line.1518"></a>
-<span class="sourceLineNo">1519</span>    assertEquals(10, codes.length);<a name="line.1519"></a>
-<span class="sourceLineNo">1520</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.1520"></a>
-<span class="sourceLineNo">1521</span>      assertEquals((i == 5) ? OperationStatusCode.BAD_FAMILY : OperationStatusCode.SUCCESS,<a name="line.1521"></a>
-<span class="sourceLineNo">1522</span>          codes[i].getOperationStatusCode());<a name="line.1522"></a>
-<span class="sourceLineNo">1523</span>    }<a name="line.1523"></a>
-<span class="sourceLineNo">1524</span><a name="line.1524"></a>
-<span class="sourceLineNo">1525</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs + 2, source);<a name="line.1525"></a>
-<span class="sourceLineNo">1526</span>  }<a name="line.1526"></a>
-<span class="sourceLineNo">1527</span><a name="line.1527"></a>
-<span class="sourceLineNo">1528</span>  @Test<a name="line.1528"></a>
-<span class="sourceLineNo">1529</span>  public void testBatchPut_whileMultipleRowLocksHeld() throws Exception {<a name="line.1529"></a>
-<span class="sourceLineNo">1530</span>    final Put[] puts = new Put[10];<a name="line.1530"></a>
-<span class="sourceLineNo">1531</span>    MetricsWALSource source = CompatibilitySingletonFactory.getInstance(MetricsWALSource.class);<a name="line.1531"></a>
-<span class="sourceLineNo">1532</span>    long syncs = prepareRegionForBachPut(puts, source, false);<a name="line.1532"></a>
-<span class="sourceLineNo">1533</span><a name="line.1533"></a>
-<span class="sourceLineNo">1534</span>    puts[5].addColumn(Bytes.toBytes("BAD_CF"), qual, value);<a name="line.1534"></a>
-<span class="sourceLineNo">1535</span><a name="line.1535"></a>
-<span class="sourceLineNo">1536</span>    LOG.info("batchPut will have to break into four batches to avoid row locks");<a name="line.1536"></a>
-<span class="sourceLineNo">1537</span>    RowLock rowLock1 = region.getRowLock(Bytes.toBytes("row_2"));<a name="line.1537"></a>
-<span class="sourceLineNo">1538</span>    RowLock rowLock2 = region.getRowLock(Bytes.toBytes("row_1"));<a name="line.1538"></a>
-<span class="sourceLineNo">1539</span>    RowLock rowLock3 = region.getRowLock(Bytes.toBytes("row_3"));<a name="line.1539"></a>
-<span class="sourceLineNo">1540</span>    RowLock rowLock4 = region.getRowLock(Bytes.toBytes("row_3"), true);<a name="line.1540"></a>
-<span class="sourceLineNo">1541</span><a name="line.1541"></a>
-<span class="sourceLineNo">1542</span>    MultithreadedTestUtil.TestContext ctx = new MultithreadedTestUtil.TestContext(CONF);<a name="line.1542"></a>
-<span class="sourceLineNo">1543</span>    final AtomicReference&lt;OperationStatus[]&gt; retFromThread = new AtomicReference&lt;&gt;();<a name="line.1543"></a>
-<span class="sourceLineNo">1544</span>    final CountDownLatch startingPuts = new CountDownLatch(1);<a name="line.1544"></a>
-<span class="sourceLineNo">1545</span>    final CountDownLatch startingClose = new CountDownLatch(1);<a name="line.1545"></a>
-<span class="sourceLineNo">1546</span>    TestThread putter = new TestThread(ctx) {<a name="line.1546"></a>
-<span class="sourceLineNo">1547</span>      @Override<a name="line.1547"></a>
-<span class="sourceLineNo">1548</span>      public void doWork() throws IOException {<a name="line.1548"></a>
-<span class="sourceLineNo">1549</span>        startingPuts.countDown();<a name="line.1549"></a>
-<span class="sourceLineNo">1550</span>        retFromThread.set(region.batchMutate(puts));<a name="line.1550"></a>
-<span class="sourceLineNo">1551</span>      }<a name="line.1551"></a>
-<span class="sourceLineNo">1552</span>    };<a name="line.1552"></a>
-<span class="sourceLineNo">1553</span>    LOG.info("...starting put thread while holding locks");<a name="line.1553"></a>
-<span class="sourceLineNo">1554</span>    ctx.addThread(putter);<a name="line.1554"></a>
-<span class="sourceLineNo">1555</span>    ctx.startThreads();<a name="line.1555"></a>
-<span class="sourceLineNo">1556</span><a name="line.1556"></a>
-<span class="sourceLineNo">1557</span>    // Now attempt to close the region from another thread.  Prior to HBASE-12565<a name="line.1557"></a>
-<span class="sourceLineNo">1558</span>    // this would cause the in-progress batchMutate operation to to fail with<a name="line.1558"></a>
-<span class="sourceLineNo">1559</span>    // exception because it use to release and re-acquire the close-guard lock<a name="line.1559"></a>
-<span class="sourceLineNo">1560</span>    // between batches.  Caller then didn't get status indicating which writes succeeded.<a name="line.1560"></a>
-<span class="sourceLineNo">1561</span>    // We now expect this thread to block until the batchMutate call finishes.<a name="line.1561"></a>
-<span class="sourceLineNo">1562</span>    Thread regionCloseThread = new TestThread(ctx) {<a name="line.1562"></a>
-<span class="sourceLineNo">1563</span>      @Override<a name="line.1563"></a>
-<span class="sourceLineNo">1564</span>      public void doWork() {<a name="line.1564"></a>
-<span class="sourceLineNo">1565</span>        try {<a name="line.1565"></a>
-<span class="sourceLineNo">1566</span>          startingPuts.await();<a name="line.1566"></a>
-<span class="sourceLineNo">1567</span>          // Give some time for the batch mutate to get in.<a name="line.1567"></a>
-<span class="sourceLineNo">1568</span>          // We don't want to race with the mutate<a name="line.1568"></a>
-<span class="sourceLineNo">1569</span>          Thread.sleep(10);<a name="line.1569"></a>
-<span class="sourceLineNo">1570</span>          startingClose.countDown();<a name="line.1570"></a>
-<span class="sourceLineNo">1571</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.1571"></a>
-<span class="sourceLineNo">1572</span>          region = null;<a name="line.1572"></a>
-<span class="sourceLineNo">1573</span>        } catch (IOException e) {<a name="line.1573"></a>
-<span class="sourceLineNo">1574</span>          throw new RuntimeException(e);<a name="line.1574"></a>
-<span class="sourceLineNo">1575</span>        } catch (InterruptedException e) {<a name="line.1575"></a>
-<span class="sourceLineNo">1576</span>          throw new RuntimeException(e);<a name="line.1576"></a>
-<span class="sourceLineNo">1577</span>        }<a name="line.1577"></a>
-<span class="sourceLineNo">1578</span>      }<a name="line.1578"></a>
-<span class="sourceLineNo">1579</span>    };<a name="line.1579"></a>
-<span class="sourceLineNo">1580</span>    regionCloseThread.start();<a name="line.1580"></a>
-<span class="sourceLineNo">1581</span><a name="line.1581"></a>
-<span class="sourceLineNo">1582</span>    startingClose.await();<a name="line.1582"></a>
-<span class="sourceLineNo">1583</span>    startingPuts.await();<a name="line.1583"></a>
-<span class="sourceLineNo">1584</span>    Thread.sleep(100);<a name="line.1584"></a>
-<span class="sourceLineNo">1585</span>    LOG.info("...releasing row lock 1, which should let put thread continue");<a name="line.1585"></a>
-<span class="sourceLineNo">1586</span>    rowLock1.release();<a name="line.1586"></a>
-<span class="sourceLineNo">1587</span>    rowLock2.release();<a name="line.1587"></a>
-<span class="sourceLineNo">1588</span>    rowLock3.release();<a name="line.1588"></a>
-<span class="sourceLineNo">1589</span>    waitForCounter(source, "syncTimeNumOps", syncs + 1);<a name="line.1589"></a>
-<span class="sourceLineNo">1590</span><a name="line.1590"></a>
-<span class="sourceLineNo">1591</span>    LOG.info("...joining on put thread");<a name="line.1591"></a>
-<span class="sourceLineNo">1592</span>    ctx.stop();<a name="line.1592"></a>
-<span class="sourceLineNo">1593</span>    regionCloseThread.join();<a name="line.1593"></a>
-<span class="sourceLineNo">1594</span><a name="line.1594"></a>
-<span class="sourceLineNo">1595</span>    OperationStatus[] codes = retFromThread.get();<a name="line.1595"></a>
-<span class="sourceLineNo">1596</span>    for (int i = 0; i &lt; codes.length; i++) {<a name="line.1596"></a>
-<span class="sourceLineNo">1597</span>      assertEquals((i == 5) ? OperationStatusCode.BAD_FAMILY : OperationStatusCode.SUCCESS,<a name="line.1597"></a>
-<span class="sourceLineNo">1598</span>          codes[i].getOperationStatusCode());<a name="line.1598"></a>
-<span class="sourceLineNo">1599</span>    }<a name="line.1599"></a>
-<span class="sourceLineNo">1600</span>    rowLock4.release();<a name="line.1600"></a>
-<span class="sourceLineNo">1601</span>  }<a name="line.1601"></a>
-<span class="sourceLineNo">1602</span><a name="line.1602"></a>
-<span class="sourceLineNo">1603</span>  private void waitForCounter(MetricsWALSource source, String metricName, long expectedCount)<a name="line.1603"></a>
-<span class="sourceLineNo">1604</span>      throws InterruptedException {<a name="line.1604"></a>
-<span class="sourceLineNo">1605</span>    long startWait = System.currentTimeMillis();<a name="line.1605"></a>
-<span class="sourceLineNo">1606</span>    long currentCount;<a name="line.1606"></a>
-<span class="sourceLineNo">1607</span>    while ((currentCount = metricsAssertHelper.getCounter(metricName, source)) &lt; expectedCount) {<a name="line.1607"></a>
-<span class="sourceLineNo">1608</span>      Thread.sleep(100);<a name="line.1608"></a>
-<span class="sourceLineNo">1609</span>      if (System.currentTimeMillis() - startWait &gt; 10000) {<a name="line.1609"></a>
-<span class="sourceLineNo">1610</span>        fail(String.format("Timed out waiting for '%s' &gt;= '%s', currentCount=%s", metricName,<a name="line.1610"></a>
-<span class="sourceLineNo">1611</span>            expectedCount, currentCount));<a name="line.1611"></a>
-<span class="sourceLineNo">1612</span>      }<a name="line.1612"></a>
-<span class="sourceLineNo">1613</span>    }<a name="line.1613"></a>
-<span class="sourceLineNo">1614</span>  }<a name="line.1614"></a>
-<span class="sourceLineNo">1615</span><a name="line.1615"></a>
-<span class="sourceLineNo">1616</span>  @Test<a name="line.1616"></a>
-<span class="sourceLineNo">1617</span>  public void testAtomicBatchPut() throws IOException {<a name="line.1617"></a>
-<span class="sourceLineNo">1618</span>    final Put[] puts = new Put[10];<a name="line.1618"></a>
-<span class="sourceLineNo">1619</span>    MetricsWALSource source = CompatibilitySingletonFactory.getInstance(MetricsWALSource.class);<a name="line.1619"></a>
-<span class="sourceLineNo">1620</span>    long syncs = prepareRegionForBachPut(puts, source, false);<a name="line.1620"></a>
-<span class="sourceLineNo">1621</span><a name="line.1621"></a>
-<span class="sourceLineNo">1622</span>    // 1. Straight forward case, should succeed<a name="line.1622"></a>
-<span class="sourceLineNo">1623</span>    MutationBatchOperation batchOp = new MutationBatchOperation(region, puts, true,<a name="line.1623"></a>
-<span class="sourceLineNo">1624</span>        HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.1624"></a>
-<span class="sourceLineNo">1625</span>    OperationStatus[] codes = this.region.batchMutate(batchOp);<a name="line.1625"></a>
-<span class="sourceLineNo">1626</span>    assertEquals(10, codes.length);<a name="line.1626"></a>
-<span class="sourceLineNo">1627</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.1627"></a>
-<span class="sourceLineNo">1628</span>      assertEquals(OperationStatusCode.SUCCESS, codes[i].getOperationStatusCode());<a name="line.1628"></a>
-<span class="sourceLineNo">1629</span>    }<a name="line.1629"></a>
-<span class="sourceLineNo">1630</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs + 1, source);<a name="line.1630"></a>
-<span class="sourceLineNo">1631</span><a name="line.1631"></a>
-<span class="sourceLineNo">1632</span>    // 2. Failed to get lock<a name="line.1632"></a>
-<span class="sourceLineNo">1633</span>    RowLock lock = region.getRowLock(Bytes.toBytes("row_" + 3));<a name="line.1633"></a>
-<span class="sourceLineNo">1634</span>    // Method {@link HRegion#getRowLock(byte[])} is reentrant. As 'row_3' is locked in this<a name="line.1634"></a>
-<span class="sourceLineNo">1635</span>    // thread, need to run {@link HRegion#batchMutate(HRegion.BatchOperation)} in different thread<a name="line.1635"></a>
-<span class="sourceLineNo">1636</span>    MultithreadedTestUtil.TestContext ctx = new MultithreadedTestUtil.TestContext(CONF);<a name="line.1636"></a>
-<span class="sourceLineNo">1637</span>    final AtomicReference&lt;IOException&gt; retFromThread = new AtomicReference&lt;&gt;();<a name="line.1637"></a>
-<span class="sourceLineNo">1638</span>    final CountDownLatch finishedPuts = new CountDownLatch(1);<a name="line.1638"></a>
-<span class="sourceLineNo">1639</span>    final MutationBatchOperation finalBatchOp = new MutationBatchOperation(region, puts, true,<a name="line.1639"></a>
-<span class="sourceLineNo">1640</span>        HConstants<a name="line.1640"></a>
-<span class="sourceLineNo">1641</span>        .NO_NONCE,<a name="line.1641"></a>
-<span class="sourceLineNo">1642</span>        HConstants.NO_NONCE);<a name="line.1642"></a>
-<span class="sourceLineNo">1643</span>    TestThread putter = new TestThread(ctx) {<a name="line.1643"></a>
-<span class="sourceLineNo">1644</span>      @Override<a name="line.1644"></a>
-<span class="sourceLineNo">1645</span>      public void doWork() throws IOException {<a name="line.1645"></a>
-<span class="sourceLineNo">1646</span>        try {<a name="line.1646"></a>
-<span class="sourceLineNo">1647</span>          region.batchMutate(finalBatchOp);<a name="line.1647"></a>
-<span class="sourceLineNo">1648</span>        } catch (IOException ioe) {<a name="line.1648"></a>
-<span class="sourceLineNo">1649</span>          LOG.error("test failed!", ioe);<a name="line.1649"></a>
-<span class="sourceLineNo">1650</span>          retFromThread.set(ioe);<a name="line.1650"></a>
-<span class="sourceLineNo">1651</span>        }<a name="line.1651"></a>
-<span class="sourceLineNo">1652</span>        finishedPuts.countDown();<a name="line.1652"></a>
-<span class="sourceLineNo">1653</span>      }<a name="line.1653"></a>
-<span class="sourceLineNo">1654</span>    };<a name="line.1654"></a>
-<span class="sourceLineNo">1655</span>    LOG.info("...starting put thread while holding locks");<a name="line.1655"></a>
-<span class="sourceLineNo">1656</span>    ctx.addThread(putter);<a name="line.1656"></a>
-<span class="sourceLineNo">1657</span>    ctx.startThreads();<a name="line.1657"></a>
-<span class="sourceLineNo">1658</span>    LOG.info("...waiting for batch puts while holding locks");<a name="line.1658"></a>
-<span class="sourceLineNo">1659</span>    try {<a name="line.1659"></a>
-<span class="sourceLineNo">1660</span>      finishedPuts.await();<a name="line.1660"></a>
-<span class="sourceLineNo">1661</span>    } catch (InterruptedException e) {<a name="line.1661"></a>
-<span class="sourceLineNo">1662</span>      LOG.error("Interrupted!", e);<a name="line.1662"></a>
-<span class="sourceLineNo">1663</span>    } finally {<a name="line.1663"></a>
-<span class="sourceLineNo">1664</span>      if (lock != null) {<a name="line.1664"></a>
-<span class="sourceLineNo">1665</span>        lock.release();<a name="line.1665"></a>
-<span class="sourceLineNo">1666</span>      }<a name="line.1666"></a>
-<span class="sourceLineNo">1667</span>    }<a name="line.1667"></a>
-<span class="sourceLineNo">1668</span>    assertNotNull(retFromThread.get());<a name="line.1668"></a>
-<span class="sourceLineNo">1669</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs + 1, source);<a name="line.1669"></a>
-<span class="sourceLineNo">1670</span><a name="line.1670"></a>
-<span class="sourceLineNo">1671</span>    // 3. Exception thrown in validation<a name="line.1671"></a>
-<span class="sourceLineNo">1672</span>    LOG.info("Next a batch put with one invalid family");<a name="line.1672"></a>
-<span class="sourceLineNo">1673</span>    puts[5].addColumn(Bytes.toBytes("BAD_CF"), qual, value);<a name="line.1673"></a>
-<span class="sourceLineNo">1674</span>    batchOp = new MutationBatchOperation(region, puts, true, HConstants.NO_NONCE,<a name="line.1674"></a>
-<span class="sourceLineNo">1675</span>        HConstants.NO_NONCE);<a name="line.1675"></a>
-<span class="sourceLineNo">1676</span>    thrown.expect(NoSuchColumnFamilyException.class);<a name="line.1676"></a>
-<span class="sourceLineNo">1677</span>    this.region.batchMutate(batchOp);<a name="line.1677"></a>
-<span class="sourceLineNo">1678</span>  }<a name="line.1678"></a>
-<span class="sourceLineNo">1679</span><a name="line.1679"></a>
-<span class="sourceLineNo">1680</span>  @Test<a name="line.1680"></a>
-<span class="sourceLineNo">1681</span>  public void testBatchPutWithTsSlop() throws Exception {<a name="line.1681"></a>
-<span class="sourceLineNo">1682</span>    // add data with a timestamp that is too recent for range. Ensure assert<a name="line.1682"></a>
-<span class="sourceLineNo">1683</span>    CONF.setInt("hbase.hregion.keyvalue.timestamp.slop.millisecs", 1000);<a name="line.1683"></a>
-<span class="sourceLineNo">1684</span>    final Put[] puts = new Put[10];<a name="line.1684"></a>
-<span class="sourceLineNo">1685</span>    MetricsWALSource source = CompatibilitySingletonFactory.getInstance(MetricsWALSource.class);<a name="line.1685"></a>
-<span class="sourceLineNo">1686</span><a name="line.1686"></a>
-<span class="sourceLineNo">1687</span>    long syncs = prepareRegionForBachPut(puts, source, true);<a name="line.1687"></a>
-<span class="sourceLineNo">1688</span><a name="line.1688"></a>
-<span class="sourceLineNo">1689</span>    OperationStatus[] codes = this.region.batchMutate(puts);<a name="line.1689"></a>
-<span class="sourceLineNo">1690</span>    assertEquals(10, codes.length);<a name="line.1690"></a>
-<span class="sourceLineNo">1691</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.1691"></a>
-<span class="sourceLineNo">1692</span>      assertEquals(OperationStatusCode.SANITY_CHECK_FAILURE, codes[i].getOperationStatusCode());<a name="line.1692"></a>
-<span class="sourceLineNo">1693</span>    }<a name="line.1693"></a>
-<span class="sourceLineNo">1694</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs, source);<a name="line.1694"></a>
-<span class="sourceLineNo">1695</span>  }<a name="line.1695"></a>
-<span class="sourceLineNo">1696</span><a name="line.1696"></a>
-<span class="sourceLineNo">1697</span>  /**<a name="line.1697"></a>
-<span class="sourceLineNo">1698</span>   * @return syncs initial syncTimeNumOps<a name="line.1698"></a>
-<span class="sourceLineNo">1699</span>   */<a name="line.1699"></a>
-<span class="sourceLineNo">1700</span>  private long prepareRegionForBachPut(final Put[] puts, final MetricsWALSource source,<a name="line.1700"></a>
-<span class="sourceLineNo">1701</span>      boolean slop) throws IOException {<a name="line.1701"></a>
-<span class="sourceLineNo">1702</span>    this.region = initHRegion(tableName, method, CONF, COLUMN_FAMILY_BYTES);<a name="line.1702"></a>
-<span class="sourceLineNo">1703</span><a name="line.1703"></a>
-<span class="sourceLineNo">1704</span>    LOG.info("First a batch put with all valid puts");<a name="line.1704"></a>
-<span class="sourceLineNo">1705</span>    for (int i = 0; i &lt; puts.length; i++) {<a name="line.1705"></a>
-<span class="sourceLineNo">1706</span>      puts[i] = slop ? new Put(Bytes.toBytes("row_" + i), Long.MAX_VALUE - 100) :<a name="line.1706"></a>
-<span class="sourceLineNo">1707</span>          new Put(Bytes.toBytes("row_" + i));<a name="line.1707"></a>
-<span class="sourceLineNo">1708</span>      puts[i].addColumn(COLUMN_FAMILY_BYTES, qual, value);<a name="line.1708"></a>
-<span class="sourceLineNo">1709</span>    }<a name="line.1709"></a>
-<span class="sourceLineNo">1710</span><a name="line.1710"></a>
-<span class="sourceLineNo">1711</span>    long syncs = metricsAssertHelper.getCounter("syncTimeNumOps", source);<a name="line.1711"></a>
-<span class="sourceLineNo">1712</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs, source);<a name="line.1712"></a>
-<span class="sourceLineNo">1713</span>    return syncs;<a name="line.1713"></a>
-<span class="sourceLineNo">1714</span>  }<a name="line.1714"></a>
-<span class="sourceLineNo">1715</span><a name="line.1715"></a>
-<span class="sourceLineNo">1716</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.1716"></a>
-<span class="sourceLineNo">1717</span>  // checkAndMutate tests<a name="line.1717"></a>
-<span class="sourceLineNo">1718</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.1718"></a>
-<span class="sourceLineNo">1719</span>  @Test<a name="line.1719"></a>
-<span class="sourceLineNo">1720</span>  public void testCheckAndMutate_WithEmptyRowValue() throws IOException {<a name="line.1720"></a>
-<span class="sourceLineNo">1721</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1721"></a>
-<span class="sourceLineNo">1722</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1722"></a>
-<span class="sourceLineNo">1723</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1723"></a>
-<span class="sourceLineNo">1724</span>    byte[] emptyVal = new byte[] {};<a name="line.1724"></a>
-<span class="sourceLineNo">1725</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1725"></a>
-<span class="sourceLineNo">1726</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.1726"></a>
-<span class="sourceLineNo">1727</span><a name="line.1727"></a>
-<span class="sourceLineNo">1728</span>    // Setting up region<a name="line.1728"></a>
-<span class="sourceLineNo">1729</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.1729"></a>
-<span class="sourceLineNo">1730</span>    // Putting empty data in key<a name="line.1730"></a>
-<span class="sourceLineNo">1731</span>    Put put = new Put(row1);<a name="line.1731"></a>
-<span class="sourceLineNo">1732</span>    put.addColumn(fam1, qf1, emptyVal);<a name="line.1732"></a>
-<span class="sourceLineNo">1733</span><a name="line.1733"></a>
-<span class="sourceLineNo">1734</span>    // checkAndPut with empty value<a name="line.1734"></a>
-<span class="sourceLineNo">1735</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1735"></a>
-<span class="sourceLineNo">1736</span>        new BinaryComparator(emptyVal), put);<a name="line.1736"></a>
-<span class="sourceLineNo">1737</span>    assertTrue(res);<a name="line.1737"></a>
-<span class="sourceLineNo">1738</span><a name="line.1738"></a>
-<span class="sourceLineNo">1739</span>    // Putting data in key<a name="line.1739"></a>
-<span class="sourceLineNo">1740</span>    put = new Put(row1);<a name="line.1740"></a>
-<span class="sourceLineNo">1741</span>    put.addColumn(fam1, qf1, val1);<a name="line.1741"></a>
-<span class="sourceLineNo">1742</span><a name="line.1742"></a>
-<span class="sourceLineNo">1743</span>    // checkAndPut with correct value<a name="line.1743"></a>
-<span class="sourceLineNo">1744</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1744"></a>
-<span class="sourceLineNo">1745</span>        new BinaryComparator(emptyVal), put);<a name="line.1745"></a>
-<span class="sourceLineNo">1746</span>    assertTrue(res);<a name="line.1746"></a>
-<span class="sourceLineNo">1747</span><a name="line.1747"></a>
-<span class="sourceLineNo">1748</span>    // not empty anymore<a name="line.1748"></a>
-<span class="sourceLineNo">1749</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1749"></a>
-<span class="sourceLineNo">1750</span>        new BinaryComparator(emptyVal), put);<a name="line.1750"></a>
-<span class="sourceLineNo">1751</span>    assertFalse(res);<a name="line.1751"></a>
-<span class="sourceLineNo">1752</span><a name="line.1752"></a>
-<span class="sourceLineNo">1753</span>    Delete delete = new Delete(row1);<a name="line.1753"></a>
-<span class="sourceLineNo">1754</span>    delete.addColumn(fam1, qf1);<a name="line.1754"></a>
-<span class="sourceLineNo">1755</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1755"></a>
-<span class="sourceLineNo">1756</span>        new BinaryComparator(emptyVal), delete);<a name="line.1756"></a>
-<span class="sourceLineNo">1757</span>    assertFalse(res);<a name="line.1757"></a>
-<span class="sourceLineNo">1758</span><a name="line.1758"></a>
-<span class="sourceLineNo">1759</span>    put = new Put(row1);<a name="line.1759"></a>
-<span class="sourceLineNo">1760</span>    put.addColumn(fam1, qf1, val2);<a name="line.1760"></a>
-<span class="sourceLineNo">1761</span>    // checkAndPut with correct value<a name="line.1761"></a>
-<span class="sourceLineNo">1762</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1762"></a>
-<span class="sourceLineNo">1763</span>        new BinaryComparator(val1), put);<a name="line.1763"></a>
-<span class="sourceLineNo">1764</span>    assertTrue(res);<a name="line.1764"></a>
-<span class="sourceLineNo">1765</span><a name="line.1765"></a>
-<span class="sourceLineNo">1766</span>    // checkAndDelete with correct value<a name="line.1766"></a>
-<span class="sourceLineNo">1767</span>    delete = new Delete(row1);<a name="line.1767"></a>
-<span class="sourceLineNo">1768</span>    delete.addColumn(fam1, qf1);<a name="line.1768"></a>
+<span class="sourceLineNo">404</span>    ChunkCreator.initialize(MemStoreLABImpl.CHUNK_SIZE_DEFAULT, false, 0, 0, 0, null);<a name="line.404"></a>
+<span class="sourceLineNo">405</span>    FSHLog hLog = new FSHLog(fs, rootDir, testName, CONF);<a name="line.405"></a>
+<span class="sourceLineNo">406</span>    hLog.init();<a name="line.406"></a>
+<span class="sourceLineNo">407</span>    region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, hLog,<a name="line.407"></a>
+<span class="sourceLineNo">408</span>        COLUMN_FAMILY_BYTES);<a name="line.408"></a>
+<span class="sourceLineNo">409</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.409"></a>
+<span class="sourceLineNo">410</span>    assertEquals(0, region.getMemStoreDataSize());<a name="line.410"></a>
+<span class="sourceLineNo">411</span><a name="line.411"></a>
+<span class="sourceLineNo">412</span>    // Put one value<a name="line.412"></a>
+<span class="sourceLineNo">413</span>    byte [] value = Bytes.toBytes(method);<a name="line.413"></a>
+<span class="sourceLineNo">414</span>    Put put = new Put(value);<a name="line.414"></a>
+<span class="sourceLineNo">415</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    region.put(put);<a name="line.416"></a>
+<span class="sourceLineNo">417</span>    long onePutSize = region.getMemStoreDataSize();<a name="line.417"></a>
+<span class="sourceLineNo">418</span>    assertTrue(onePutSize &gt; 0);<a name="line.418"></a>
+<span class="sourceLineNo">419</span><a name="line.419"></a>
+<span class="sourceLineNo">420</span>    RegionCoprocessorHost mockedCPHost = Mockito.mock(RegionCoprocessorHost.class);<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    doThrow(new IOException())<a name="line.421"></a>
+<span class="sourceLineNo">422</span>       .when(mockedCPHost).postBatchMutate(Mockito.&lt;MiniBatchOperationInProgress&lt;Mutation&gt;&gt;any());<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    region.setCoprocessorHost(mockedCPHost);<a name="line.423"></a>
+<span class="sourceLineNo">424</span><a name="line.424"></a>
+<span class="sourceLineNo">425</span>    put = new Put(value);<a name="line.425"></a>
+<span class="sourceLineNo">426</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("dfg"), value);<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    try {<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      region.put(put);<a name="line.428"></a>
+<span class="sourceLineNo">429</span>      fail("Should have failed with IOException");<a name="line.429"></a>
+<span class="sourceLineNo">430</span>    } catch (IOException expected) {<a name="line.430"></a>
+<span class="sourceLineNo">431</span>    }<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    long expectedSize = onePutSize * 2;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>    assertEquals("memstoreSize should be incremented",<a name="line.433"></a>
+<span class="sourceLineNo">434</span>        expectedSize, region.getMemStoreDataSize());<a name="line.434"></a>
+<span class="sourceLineNo">435</span>    assertEquals("flushable size should be incremented",<a name="line.435"></a>
+<span class="sourceLineNo">436</span>        expectedSize, store.getFlushableSize().getDataSize());<a name="line.436"></a>
+<span class="sourceLineNo">437</span><a name="line.437"></a>
+<span class="sourceLineNo">438</span>    region.setCoprocessorHost(null);<a name="line.438"></a>
+<span class="sourceLineNo">439</span>  }<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>   * A test case of HBASE-21041<a name="line.442"></a>
+<span class="sourceLineNo">443</span>   * @throws Exception Exception<a name="line.443"></a>
+<span class="sourceLineNo">444</span>   */<a name="line.444"></a>
+<span class="sourceLineNo">445</span>  @Test<a name="line.445"></a>
+<span class="sourceLineNo">446</span>  public void testFlushAndMemstoreSizeCounting() throws Exception {<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    byte[] family = Bytes.toBytes("family");<a name="line.447"></a>
+<span class="sourceLineNo">448</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.448"></a>
+<span class="sourceLineNo">449</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.449"></a>
+<span class="sourceLineNo">450</span>    try {<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      for (byte[] row : HBaseTestingUtility.ROWS) {<a name="line.451"></a>
+<span class="sourceLineNo">452</span>        Put put = new Put(row);<a name="line.452"></a>
+<span class="sourceLineNo">453</span>        put.addColumn(family, family, row);<a name="line.453"></a>
+<span class="sourceLineNo">454</span>        region.put(put);<a name="line.454"></a>
+<span class="sourceLineNo">455</span>      }<a name="line.455"></a>
+<span class="sourceLineNo">456</span>      region.flush(true);<a name="line.456"></a>
+<span class="sourceLineNo">457</span>      // After flush, data size should be zero<a name="line.457"></a>
+<span class="sourceLineNo">458</span>      assertEquals(0, region.getMemStoreDataSize());<a name="line.458"></a>
+<span class="sourceLineNo">459</span>      // After flush, a new active mutable segment is created, so the heap size<a name="line.459"></a>
+<span class="sourceLineNo">460</span>      // should equal to MutableSegment.DEEP_OVERHEAD<a name="line.460"></a>
+<span class="sourceLineNo">461</span>      assertEquals(MutableSegment.DEEP_OVERHEAD, region.getMemStoreHeapSize());<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      // After flush, offheap should be zero<a name="line.462"></a>
+<span class="sourceLineNo">463</span>      assertEquals(0, region.getMemStoreOffHeapSize());<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    } finally {<a name="line.464"></a>
+<span class="sourceLineNo">465</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.465"></a>
+<span class="sourceLineNo">466</span>      this.region = null;<a name="line.466"></a>
+<span class="sourceLineNo">467</span>      wals.close();<a name="line.467"></a>
+<span class="sourceLineNo">468</span>    }<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>  /**<a name="line.471"></a>
+<span class="sourceLineNo">472</span>   * Test we do not lose data if we fail a flush and then close.<a name="line.472"></a>
+<span class="sourceLineNo">473</span>   * Part of HBase-10466.  Tests the following from the issue description:<a name="line.473"></a>
+<span class="sourceLineNo">474</span>   * "Bug 1: Wrong calculation of HRegion.memstoreSize: When a flush fails, data to be flushed is<a name="line.474"></a>
+<span class="sourceLineNo">475</span>   * kept in each MemStore's snapshot and wait for next flush attempt to continue on it. But when<a name="line.475"></a>
+<span class="sourceLineNo">476</span>   * the next flush succeeds, the counter of total memstore size in HRegion is always deduced by<a name="line.476"></a>
+<span class="sourceLineNo">477</span>   * the sum of current memstore sizes instead of snapshots left from previous failed flush. This<a name="line.477"></a>
+<span class="sourceLineNo">478</span>   * calculation is problematic that almost every time there is failed flush, HRegion.memstoreSize<a name="line.478"></a>
+<span class="sourceLineNo">479</span>   * gets reduced by a wrong value. If region flush could not proceed for a couple cycles, the size<a name="line.479"></a>
+<span class="sourceLineNo">480</span>   * in current memstore could be much larger than the snapshot. It's likely to drift memstoreSize<a name="line.480"></a>
+<span class="sourceLineNo">481</span>   * much smaller than expected. In extreme case, if the error accumulates to even bigger than<a name="line.481"></a>
+<span class="sourceLineNo">482</span>   * HRegion's memstore size limit, any further flush is skipped because flush does not do anything<a name="line.482"></a>
+<span class="sourceLineNo">483</span>   * if memstoreSize is not larger than 0."<a name="line.483"></a>
+<span class="sourceLineNo">484</span>   * @throws Exception<a name="line.484"></a>
+<span class="sourceLineNo">485</span>   */<a name="line.485"></a>
+<span class="sourceLineNo">486</span>  @Test<a name="line.486"></a>
+<span class="sourceLineNo">487</span>  public void testFlushSizeAccounting() throws Exception {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.488"></a>
+<span class="sourceLineNo">489</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.489"></a>
+<span class="sourceLineNo">490</span>    // Only retry once.<a name="line.490"></a>
+<span class="sourceLineNo">491</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.491"></a>
+<span class="sourceLineNo">492</span>    final User user =<a name="line.492"></a>
+<span class="sourceLineNo">493</span>      User.createUserForTesting(conf, method, new String[]{"foo"});<a name="line.493"></a>
+<span class="sourceLineNo">494</span>    // Inject our faulty LocalFileSystem<a name="line.494"></a>
+<span class="sourceLineNo">495</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.496"></a>
+<span class="sourceLineNo">497</span>      @Override<a name="line.497"></a>
+<span class="sourceLineNo">498</span>      public Object run() throws Exception {<a name="line.498"></a>
+<span class="sourceLineNo">499</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.499"></a>
+<span class="sourceLineNo">500</span>        FileSystem fs = FileSystem.get(conf);<a name="line.500"></a>
+<span class="sourceLineNo">501</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.501"></a>
+<span class="sourceLineNo">502</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.502"></a>
+<span class="sourceLineNo">503</span>        HRegion region = null;<a name="line.503"></a>
+<span class="sourceLineNo">504</span>        try {<a name="line.504"></a>
+<span class="sourceLineNo">505</span>          // Initialize region<a name="line.505"></a>
+<span class="sourceLineNo">506</span>          region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, wal,<a name="line.506"></a>
+<span class="sourceLineNo">507</span>              COLUMN_FAMILY_BYTES);<a name="line.507"></a>
+<span class="sourceLineNo">508</span>          long size = region.getMemStoreDataSize();<a name="line.508"></a>
+<span class="sourceLineNo">509</span>          Assert.assertEquals(0, size);<a name="line.509"></a>
+<span class="sourceLineNo">510</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.510"></a>
+<span class="sourceLineNo">511</span>          Put p1 = new Put(row);<a name="line.511"></a>
+<span class="sourceLineNo">512</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[]) null));<a name="line.512"></a>
+<span class="sourceLineNo">513</span>          region.put(p1);<a name="line.513"></a>
+<span class="sourceLineNo">514</span>          final long sizeOfOnePut = region.getMemStoreDataSize();<a name="line.514"></a>
+<span class="sourceLineNo">515</span>          // Fail a flush which means the current memstore will hang out as memstore 'snapshot'.<a name="line.515"></a>
+<span class="sourceLineNo">516</span>          try {<a name="line.516"></a>
+<span class="sourceLineNo">517</span>            LOG.info("Flushing");<a name="line.517"></a>
+<span class="sourceLineNo">518</span>            region.flush(true);<a name="line.518"></a>
+<span class="sourceLineNo">519</span>            Assert.fail("Didn't bubble up IOE!");<a name="line.519"></a>
+<span class="sourceLineNo">520</span>          } catch (DroppedSnapshotException dse) {<a name="line.520"></a>
+<span class="sourceLineNo">521</span>            // What we are expecting<a name="line.521"></a>
+<span class="sourceLineNo">522</span>            region.closing.set(false); // this is needed for the rest of the test to work<a name="line.522"></a>
+<span class="sourceLineNo">523</span>          }<a name="line.523"></a>
+<span class="sourceLineNo">524</span>          // Make it so all writes succeed from here on out<a name="line.524"></a>
+<span class="sourceLineNo">525</span>          ffs.fault.set(false);<a name="line.525"></a>
+<span class="sourceLineNo">526</span>          // Check sizes.  Should still be the one entry.<a name="line.526"></a>
+<span class="sourceLineNo">527</span>          Assert.assertEquals(sizeOfOnePut, region.getMemStoreDataSize());<a name="line.527"></a>
+<span class="sourceLineNo">528</span>          // Now add two entries so that on this next flush that fails, we can see if we<a name="line.528"></a>
+<span class="sourceLineNo">529</span>          // subtract the right amount, the snapshot size only.<a name="line.529"></a>
+<span class="sourceLineNo">530</span>          Put p2 = new Put(row);<a name="line.530"></a>
+<span class="sourceLineNo">531</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.531"></a>
+<span class="sourceLineNo">532</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.532"></a>
+<span class="sourceLineNo">533</span>          region.put(p2);<a name="line.533"></a>
+<span class="sourceLineNo">534</span>          long expectedSize = sizeOfOnePut * 3;<a name="line.534"></a>
+<span class="sourceLineNo">535</span>          Assert.assertEquals(expectedSize, region.getMemStoreDataSize());<a name="line.535"></a>
+<span class="sourceLineNo">536</span>          // Do a successful flush.  It will clear the snapshot only.  Thats how flushes work.<a name="line.536"></a>
+<span class="sourceLineNo">537</span>          // If already a snapshot, we clear it else we move the memstore to be snapshot and flush<a name="line.537"></a>
+<span class="sourceLineNo">538</span>          // it<a name="line.538"></a>
+<span class="sourceLineNo">539</span>          region.flush(true);<a name="line.539"></a>
+<span class="sourceLineNo">540</span>          // Make sure our memory accounting is right.<a name="line.540"></a>
+<span class="sourceLineNo">541</span>          Assert.assertEquals(sizeOfOnePut * 2, region.getMemStoreDataSize());<a name="line.541"></a>
+<span class="sourceLineNo">542</span>        } finally {<a name="line.542"></a>
+<span class="sourceLineNo">543</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.543"></a>
+<span class="sourceLineNo">544</span>        }<a name="line.544"></a>
+<span class="sourceLineNo">545</span>        return null;<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>    FileSystem.closeAllForUGI(user.getUGI());<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>  @Test<a name="line.551"></a>
+<span class="sourceLineNo">552</span>  public void testCloseWithFailingFlush() throws Exception {<a name="line.552"></a>
+<span class="sourceLineNo">553</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.553"></a>
+<span class="sourceLineNo">554</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.554"></a>
+<span class="sourceLineNo">555</span>    // Only retry once.<a name="line.555"></a>
+<span class="sourceLineNo">556</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.556"></a>
+<span class="sourceLineNo">557</span>    final User user =<a name="line.557"></a>
+<span class="sourceLineNo">558</span>      User.createUserForTesting(conf, this.method, new String[]{"foo"});<a name="line.558"></a>
+<span class="sourceLineNo">559</span>    // Inject our faulty LocalFileSystem<a name="line.559"></a>
+<span class="sourceLineNo">560</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.560"></a>
+<span class="sourceLineNo">561</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.561"></a>
+<span class="sourceLineNo">562</span>      @Override<a name="line.562"></a>
+<span class="sourceLineNo">563</span>      public Object run() throws Exception {<a name="line.563"></a>
+<span class="sourceLineNo">564</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.564"></a>
+<span class="sourceLineNo">565</span>        FileSystem fs = FileSystem.get(conf);<a name="line.565"></a>
+<span class="sourceLineNo">566</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.566"></a>
+<span class="sourceLineNo">567</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.567"></a>
+<span class="sourceLineNo">568</span>        HRegion region = null;<a name="line.568"></a>
+<span class="sourceLineNo">569</span>        try {<a name="line.569"></a>
+<span class="sourceLineNo">570</span>          // Initialize region<a name="line.570"></a>
+<span class="sourceLineNo">571</span>          region = initHRegion(tableName, null, null, false,<a name="line.571"></a>
+<span class="sourceLineNo">572</span>              Durability.SYNC_WAL, wal, COLUMN_FAMILY_BYTES);<a name="line.572"></a>
+<span class="sourceLineNo">573</span>          long size = region.getMemStoreDataSize();<a name="line.573"></a>
+<span class="sourceLineNo">574</span>          Assert.assertEquals(0, size);<a name="line.574"></a>
+<span class="sourceLineNo">575</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.575"></a>
+<span class="sourceLineNo">576</span>          Put p1 = new Put(row);<a name="line.576"></a>
+<span class="sourceLineNo">577</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[])null));<a name="line.577"></a>
+<span class="sourceLineNo">578</span>          region.put(p1);<a name="line.578"></a>
+<span class="sourceLineNo">579</span>          // Manufacture an outstanding snapshot -- fake a failed flush by doing prepare step only.<a name="line.579"></a>
+<span class="sourceLineNo">580</span>          HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.580"></a>
+<span class="sourceLineNo">581</span>          StoreFlushContext storeFlushCtx =<a name="line.581"></a>
+<span class="sourceLineNo">582</span>              store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY);<a name="line.582"></a>
+<span class="sourceLineNo">583</span>          storeFlushCtx.prepare();<a name="line.583"></a>
+<span class="sourceLineNo">584</span>          // Now add two entries to the foreground memstore.<a name="line.584"></a>
+<span class="sourceLineNo">585</span>          Put p2 = new Put(row);<a name="line.585"></a>
+<span class="sourceLineNo">586</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.586"></a>
+<span class="sourceLineNo">587</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.587"></a>
+<span class="sourceLineNo">588</span>          region.put(p2);<a name="line.588"></a>
+<span class="sourceLineNo">589</span>          // Now try close on top of a failing flush.<a name="line.589"></a>
+<span class="sourceLineNo">590</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.590"></a>
+<span class="sourceLineNo">591</span>          region = null;<a name="line.591"></a>
+<span class="sourceLineNo">592</span>          fail();<a name="line.592"></a>
+<span class="sourceLineNo">593</span>        } catch (DroppedSnapshotException dse) {<a name="line.593"></a>
+<span class="sourceLineNo">594</span>          // Expected<a name="line.594"></a>
+<span class="sourceLineNo">595</span>          LOG.info("Expected DroppedSnapshotException");<a name="line.595"></a>
+<span class="sourceLineNo">596</span>        } finally {<a name="line.596"></a>
+<span class="sourceLineNo">597</span>          // Make it so all writes succeed from here on out so can close clean<a name="line.597"></a>
+<span class="sourceLineNo">598</span>          ffs.fault.set(false);<a name="line.598"></a>
+<span class="sourceLineNo">599</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.599"></a>
+<span class="sourceLineNo">600</span>        }<a name="line.600"></a>
+<span class="sourceLineNo">601</span>        return null;<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>    FileSystem.closeAllForUGI(user.getUGI());<a name="line.604"></a>
+<span class="sourceLineNo">605</span>  }<a name="line.605"></a>
+<span class="sourceLineNo">606</span><a name="line.606"></a>
+<span class="sourceLineNo">607</span>  @Test<a name="line.607"></a>
+<span class="sourceLineNo">608</span>  public void testCompactionAffectedByScanners() throws Exception {<a name="line.608"></a>
+<span class="sourceLineNo">609</span>    byte[] family = Bytes.toBytes("family");<a name="line.609"></a>
+<span class="sourceLineNo">610</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.610"></a>
+<span class="sourceLineNo">611</span><a name="line.611"></a>
+<span class="sourceLineNo">612</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.612"></a>
+<span class="sourceLineNo">613</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.613"></a>
+<span class="sourceLineNo">614</span>    region.put(put);<a name="line.614"></a>
+<span class="sourceLineNo">615</span>    region.flush(true);<a name="line.615"></a>
+<span class="sourceLineNo">616</span><a name="line.616"></a>
+<span class="sourceLineNo">617</span>    Scan scan = new Scan();<a name="line.617"></a>
+<span class="sourceLineNo">618</span>    scan.setMaxVersions(3);<a name="line.618"></a>
+<span class="sourceLineNo">619</span>    // open the first scanner<a name="line.619"></a>
+<span class="sourceLineNo">620</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.620"></a>
+<span class="sourceLineNo">621</span><a name="line.621"></a>
+<span class="sourceLineNo">622</span>    Delete delete = new Delete(Bytes.toBytes("r1"));<a name="line.622"></a>
+<span class="sourceLineNo">623</span>    region.delete(delete);<a name="line.623"></a>
+<span class="sourceLineNo">624</span>    region.flush(true);<a name="line.624"></a>
+<span class="sourceLineNo">625</span><a name="line.625"></a>
+<span class="sourceLineNo">626</span>    // open the second scanner<a name="line.626"></a>
+<span class="sourceLineNo">627</span>    RegionScanner scanner2 = region.getScanner(scan);<a name="line.627"></a>
+<span class="sourceLineNo">628</span><a name="line.628"></a>
+<span class="sourceLineNo">629</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.629"></a>
+<span class="sourceLineNo">630</span><a name="line.630"></a>
+<span class="sourceLineNo">631</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.631"></a>
+<span class="sourceLineNo">632</span><a name="line.632"></a>
+<span class="sourceLineNo">633</span>    // make a major compaction<a name="line.633"></a>
+<span class="sourceLineNo">634</span>    region.compact(true);<a name="line.634"></a>
+<span class="sourceLineNo">635</span><a name="line.635"></a>
+<span class="sourceLineNo">636</span>    // open the third scanner<a name="line.636"></a>
+<span class="sourceLineNo">637</span>    RegionScanner scanner3 = region.getScanner(scan);<a name="line.637"></a>
+<span class="sourceLineNo">638</span><a name="line.638"></a>
+<span class="sourceLineNo">639</span>    // get data from scanner 1, 2, 3 after major compaction<a name="line.639"></a>
+<span class="sourceLineNo">640</span>    scanner1.next(results);<a name="line.640"></a>
+<span class="sourceLineNo">641</span>    System.out.println(results);<a name="line.641"></a>
+<span class="sourceLineNo">642</span>    assertEquals(1, results.size());<a name="line.642"></a>
+<span class="sourceLineNo">643</span><a name="line.643"></a>
+<span class="sourceLineNo">644</span>    results.clear();<a name="line.644"></a>
+<span class="sourceLineNo">645</span>    scanner2.next(results);<a name="line.645"></a>
+<span class="sourceLineNo">646</span>    System.out.println(results);<a name="line.646"></a>
+<span class="sourceLineNo">647</span>    assertEquals(0, results.size());<a name="line.647"></a>
+<span class="sourceLineNo">648</span><a name="line.648"></a>
+<span class="sourceLineNo">649</span>    results.clear();<a name="line.649"></a>
+<span class="sourceLineNo">650</span>    scanner3.next(results);<a name="line.650"></a>
+<span class="sourceLineNo">651</span>    System.out.println(results);<a name="line.651"></a>
+<span class="sourceLineNo">652</span>    assertEquals(0, results.size());<a name="line.652"></a>
+<span class="sourceLineNo">653</span>  }<a name="line.653"></a>
+<span class="sourceLineNo">654</span><a name="line.654"></a>
+<span class="sourceLineNo">655</span>  @Test<a name="line.655"></a>
+<span class="sourceLineNo">656</span>  public void testToShowNPEOnRegionScannerReseek() throws Exception {<a name="line.656"></a>
+<span class="sourceLineNo">657</span>    byte[] family = Bytes.toBytes("family");<a name="line.657"></a>
+<span class="sourceLineNo">658</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.658"></a>
+<span class="sourceLineNo">659</span><a name="line.659"></a>
+<span class="sourceLineNo">660</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.660"></a>
+<span class="sourceLineNo">661</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.661"></a>
+<span class="sourceLineNo">662</span>    region.put(put);<a name="line.662"></a>
+<span class="sourceLineNo">663</span>    put = new Put(Bytes.toBytes("r2"));<a name="line.663"></a>
+<span class="sourceLineNo">664</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.664"></a>
+<span class="sourceLineNo">665</span>    region.put(put);<a name="line.665"></a>
+<span class="sourceLineNo">666</span>    region.flush(true);<a name="line.666"></a>
+<span class="sourceLineNo">667</span><a name="line.667"></a>
+<span class="sourceLineNo">668</span>    Scan scan = new Scan();<a name="line.668"></a>
+<span class="sourceLineNo">669</span>    scan.setMaxVersions(3);<a name="line.669"></a>
+<span class="sourceLineNo">670</span>    // open the first scanner<a name="line.670"></a>
+<span class="sourceLineNo">671</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.671"></a>
+<span class="sourceLineNo">672</span><a name="line.672"></a>
+<span class="sourceLineNo">673</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.673"></a>
+<span class="sourceLineNo">674</span><a name="line.674"></a>
+<span class="sourceLineNo">675</span>    region.compact(true);<a name="line.675"></a>
+<span class="sourceLineNo">676</span><a name="line.676"></a>
+<span class="sourceLineNo">677</span>    scanner1.reseek(Bytes.toBytes("r2"));<a name="line.677"></a>
+<span class="sourceLineNo">678</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.678"></a>
+<span class="sourceLineNo">679</span>    scanner1.next(results);<a name="line.679"></a>
+<span class="sourceLineNo">680</span>    Cell keyValue = results.get(0);<a name="line.680"></a>
+<span class="sourceLineNo">681</span>    Assert.assertTrue(Bytes.compareTo(CellUtil.cloneRow(keyValue), Bytes.toBytes("r2")) == 0);<a name="line.681"></a>
+<span class="sourceLineNo">682</span>    scanner1.close();<a name="line.682"></a>
+<span class="sourceLineNo">683</span>  }<a name="line.683"></a>
+<span class="sourceLineNo">684</span><a name="line.684"></a>
+<span class="sourceLineNo">685</span>  @Test<a name="line.685"></a>
+<span class="sourceLineNo">686</span>  public void testSkipRecoveredEditsReplay() throws Exception {<a name="line.686"></a>
+<span class="sourceLineNo">687</span>    byte[] family = Bytes.toBytes("family");<a name="line.687"></a>
+<span class="sourceLineNo">688</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.688"></a>
+<span class="sourceLineNo">689</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.689"></a>
+<span class="sourceLineNo">690</span>    try {<a name="line.690"></a>
+<span class="sourceLineNo">691</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.691"></a>
+<span class="sourceLineNo">692</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.692"></a>
+<span class="sourceLineNo">693</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.693"></a>
+<span class="sourceLineNo">694</span><a name="line.694"></a>
+<span class="sourceLineNo">695</span>      Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.695"></a>
+<span class="sourceLineNo">696</span><a name="line.696"></a>
+<span class="sourceLineNo">697</span>      long maxSeqId = 1050;<a name="line.697"></a>
+<span class="sourceLineNo">698</span>      long minSeqId = 1000;<a name="line.698"></a>
+<span class="sourceLineNo">699</span><a name="line.699"></a>
+<span class="sourceLineNo">700</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.700"></a>
+<span class="sourceLineNo">701</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.701"></a>
+<span class="sourceLineNo">702</span>        fs.create(recoveredEdits);<a name="line.702"></a>
+<span class="sourceLineNo">703</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.703"></a>
+<span class="sourceLineNo">704</span><a name="line.704"></a>
+<span class="sourceLineNo">705</span>        long time = System.nanoTime();<a name="line.705"></a>
+<span class="sourceLineNo">706</span>        WALEdit edit = new WALEdit();<a name="line.706"></a>
+<span class="sourceLineNo">707</span>        edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.707"></a>
+<span class="sourceLineNo">708</span>            .toBytes(i)));<a name="line.708"></a>
+<span class="sourceLineNo">709</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.709"></a>
+<span class="sourceLineNo">710</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.710"></a>
+<span class="sourceLineNo">711</span><a name="line.711"></a>
+<span class="sourceLineNo">712</span>        writer.close();<a name="line.712"></a>
+<span class="sourceLineNo">713</span>      }<a name="line.713"></a>
+<span class="sourceLineNo">714</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.714"></a>
+<span class="sourceLineNo">715</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.715"></a>
+<span class="sourceLineNo">716</span>      for (HStore store : region.getStores()) {<a name="line.716"></a>
+<span class="sourceLineNo">717</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), minSeqId - 1);<a name="line.717"></a>
+<span class="sourceLineNo">718</span>      }<a name="line.718"></a>
+<span class="sourceLineNo">719</span>      long seqId = region.replayRecoveredEditsIfAny(maxSeqIdInStores, null, status);<a name="line.719"></a>
+<span class="sourceLineNo">720</span>      assertEquals(maxSeqId, seqId);<a name="line.720"></a>
+<span class="sourceLineNo">721</span>      region.getMVCC().advanceTo(seqId);<a name="line.721"></a>
+<span class="sourceLineNo">722</span>      Get get = new Get(row);<a name="line.722"></a>
+<span class="sourceLineNo">723</span>      Result result = region.get(get);<a name="line.723"></a>
+<span class="sourceLineNo">724</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.724"></a>
+<span class="sourceLineNo">725</span>        List&lt;Cell&gt; kvs = result.getColumnCells(family, Bytes.toBytes(i));<a name="line.725"></a>
+<span class="sourceLineNo">726</span>        assertEquals(1, kvs.size());<a name="line.726"></a>
+<span class="sourceLineNo">727</span>        assertArrayEquals(Bytes.toBytes(i), CellUtil.cloneValue(kvs.get(0)));<a name="line.727"></a>
+<span class="sourceLineNo">728</span>      }<a name="line.728"></a>
+<span class="sourceLineNo">729</span>    } finally {<a name="line.729"></a>
+<span class="sourceLineNo">730</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.730"></a>
+<span class="sourceLineNo">731</span>      this.region = null;<a name="line.731"></a>
+<span class="sourceLineNo">732</span>      wals.close();<a name="line.732"></a>
+<span class="sourceLineNo">733</span>    }<a name="line.733"></a>
+<span class="sourceLineNo">734</span>  }<a name="line.734"></a>
+<span class="sourceLineNo">735</span><a name="line.735"></a>
+<span class="sourceLineNo">736</span>  @Test<a name="line.736"></a>
+<span class="sourceLineNo">737</span>  public void testSkipRecoveredEditsReplaySomeIgnored() throws Exception {<a name="line.737"></a>
+<span class="sourceLineNo">738</span>    byte[] family = Bytes.toBytes("family");<a name="line.738"></a>
+<span class="sourceLineNo">739</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.739"></a>
+<span class="sourceLineNo">740</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.740"></a>
+<span class="sourceLineNo">741</span>    try {<a name="line.741"></a>
+<span class="sourceLineNo">742</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.742"></a>
+<span class="sourceLineNo">743</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.743"></a>
+<span class="sourceLineNo">744</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.744"></a>
+<span class="sourceLineNo">745</span><a name="line.745"></a>
+<span class="sourceLineNo">746</span>      Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.746"></a>
+<span class="sourceLineNo">747</span><a name="line.747"></a>
+<span class="sourceLineNo">748</span>      long maxSeqId = 1050;<a name="line.748"></a>
+<span class="sourceLineNo">749</span>      long minSeqId = 1000;<a name="line.749"></a>
+<span class="sourceLineNo">750</span><a name="line.750"></a>
+<span class="sourceLineNo">751</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.751"></a>
+<span class="sourceLineNo">752</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.752"></a>
+<span class="sourceLineNo">753</span>        fs.create(recoveredEdits);<a name="line.753"></a>
+<span class="sourceLineNo">754</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.754"></a>
+<span class="sourceLineNo">755</span><a name="line.755"></a>
+<span class="sourceLineNo">756</span>        long time = System.nanoTime();<a name="line.756"></a>
+<span class="sourceLineNo">757</span>        WALEdit edit = new WALEdit();<a name="line.757"></a>
+<span class="sourceLineNo">758</span>        edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.758"></a>
+<span class="sourceLineNo">759</span>            .toBytes(i)));<a name="line.759"></a>
+<span class="sourceLineNo">760</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.760"></a>
+<span class="sourceLineNo">761</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.761"></a>
+<span class="sourceLineNo">762</span><a name="line.762"></a>
+<span class="sourceLineNo">763</span>        writer.close();<a name="line.763"></a>
+<span class="sourceLineNo">764</span>      }<a name="line.764"></a>
+<span class="sourceLineNo">765</span>      long recoverSeqId = 1030;<a name="line.765"></a>
+<span class="sourceLineNo">766</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.766"></a>
+<span class="sourceLineNo">767</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.767"></a>
+<span class="sourceLineNo">768</span>      for (HStore store : region.getStores()) {<a name="line.768"></a>
+<span class="sourceLineNo">769</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), recoverSeqId - 1);<a name="line.769"></a>
+<span class="sourceLineNo">770</span>      }<a name="line.770"></a>
+<span class="sourceLineNo">771</span>      long seqId = region.replayRecoveredEditsIfAny(maxSeqIdInStores, null, status);<a name="line.771"></a>
+<span class="sourceLineNo">772</span>      assertEquals(maxSeqId, seqId);<a name="line.772"></a>
+<span class="sourceLineNo">773</span>      region.getMVCC().advanceTo(seqId);<a name="line.773"></a>
+<span class="sourceLineNo">774</span>      Get get = new Get(row);<a name="line.774"></a>
+<span class="sourceLineNo">775</span>      Result result = region.get(get);<a name="line.775"></a>
+<span class="sourceLineNo">776</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.776"></a>
+<span class="sourceLineNo">777</span>        List&lt;Cell&gt; kvs = result.getColumnCells(family, Bytes.toBytes(i));<a name="line.777"></a>
+<span class="sourceLineNo">778</span>        if (i &lt; recoverSeqId) {<a name="line.778"></a>
+<span class="sourceLineNo">779</span>          assertEquals(0, kvs.size());<a name="line.779"></a>
+<span class="sourceLineNo">780</span>        } else {<a name="line.780"></a>
+<span class="sourceLineNo">781</span>          assertEquals(1, kvs.size());<a name="line.781"></a>
+<span class="sourceLineNo">782</span>          assertArrayEquals(Bytes.toBytes(i), CellUtil.cloneValue(kvs.get(0)));<a name="line.782"></a>
+<span class="sourceLineNo">783</span>        }<a name="line.783"></a>
+<span class="sourceLineNo">784</span>      }<a name="line.784"></a>
+<span class="sourceLineNo">785</span>    } finally {<a name="line.785"></a>
+<span class="sourceLineNo">786</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.786"></a>
+<span class="sourceLineNo">787</span>      this.region = null;<a name="line.787"></a>
+<span class="sourceLineNo">788</span>      wals.close();<a name="line.788"></a>
+<span class="sourceLineNo">789</span>    }<a name="line.789"></a>
+<span class="sourceLineNo">790</span>  }<a name="line.790"></a>
+<span class="sourceLineNo">791</span><a name="line.791"></a>
+<span class="sourceLineNo">792</span>  @Test<a name="line.792"></a>
+<span class="sourceLineNo">793</span>  public void testSkipRecoveredEditsReplayAllIgnored() throws Exception {<a name="line.793"></a>
+<span class="sourceLineNo">794</span>    byte[] family = Bytes.toBytes("family");<a name="line.794"></a>
+<span class="sourceLineNo">795</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.795"></a>
+<span class="sourceLineNo">796</span>    Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.796"></a>
+<span class="sourceLineNo">797</span>    FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.797"></a>
+<span class="sourceLineNo">798</span><a name="line.798"></a>
+<span class="sourceLineNo">799</span>    Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.799"></a>
+<span class="sourceLineNo">800</span>    for (int i = 1000; i &lt; 1050; i += 10) {<a name="line.800"></a>
+<span class="sourceLineNo">801</span>      Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.801"></a>
+<span class="sourceLineNo">802</span>      FSDataOutputStream dos = fs.create(recoveredEdits);<a name="line.802"></a>
+<span class="sourceLineNo">803</span>      dos.writeInt(i);<a name="line.803"></a>
+<span class="sourceLineNo">804</span>      dos.close();<a name="line.804"></a>
+<span class="sourceLineNo">805</span>    }<a name="line.805"></a>
+<span class="sourceLineNo">806</span>    long minSeqId = 2000;<a name="line.806"></a>
+<span class="sourceLineNo">807</span>    Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", minSeqId - 1));<a name="line.807"></a>
+<span class="sourceLineNo">808</span>    FSDataOutputStream dos = fs.create(recoveredEdits);<a name="line.808"></a>
+<span class="sourceLineNo">809</span>    dos.close();<a name="line.809"></a>
+<span class="sourceLineNo">810</span><a name="line.810"></a>
+<span class="sourceLineNo">811</span>    Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.811"></a>
+<span class="sourceLineNo">812</span>    for (HStore store : region.getStores()) {<a name="line.812"></a>
+<span class="sourceLineNo">813</span>      maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), minSeqId);<a name="line.813"></a>
+<span class="sourceLineNo">814</span>    }<a name="line.814"></a>
+<span class="sourceLineNo">815</span>    long seqId = region.replayRecoveredEditsIfAny(maxSeqIdInStores, null, null);<a name="line.815"></a>
+<span class="sourceLineNo">816</span>    assertEquals(minSeqId, seqId);<a name="line.816"></a>
+<span class="sourceLineNo">817</span>  }<a name="line.817"></a>
+<span class="sourceLineNo">818</span><a name="line.818"></a>
+<span class="sourceLineNo">819</span>  @Test<a name="line.819"></a>
+<span class="sourceLineNo">820</span>  public void testSkipRecoveredEditsReplayTheLastFileIgnored() throws Exception {<a name="line.820"></a>
+<span class="sourceLineNo">821</span>    byte[] family = Bytes.toBytes("family");<a name="line.821"></a>
+<span class="sourceLineNo">822</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.822"></a>
+<span class="sourceLineNo">823</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.823"></a>
+<span class="sourceLineNo">824</span>    try {<a name="line.824"></a>
+<span class="sourceLineNo">825</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.825"></a>
+<span class="sourceLineNo">826</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.826"></a>
+<span class="sourceLineNo">827</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.827"></a>
+<span class="sourceLineNo">828</span>      byte[][] columns = region.getTableDescriptor().getColumnFamilyNames().toArray(new byte[0][]);<a name="line.828"></a>
+<span class="sourceLineNo">829</span><a name="line.829"></a>
+<span class="sourceLineNo">830</span>      assertEquals(0, region.getStoreFileList(columns).size());<a name="line.830"></a>
+<span class="sourceLineNo">831</span><a name="line.831"></a>
+<span class="sourceLineNo">832</span>      Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.832"></a>
+<span class="sourceLineNo">833</span><a name="line.833"></a>
+<span class="sourceLineNo">834</span>      long maxSeqId = 1050;<a name="line.834"></a>
+<span class="sourceLineNo">835</span>      long minSeqId = 1000;<a name="line.835"></a>
+<span class="sourceLineNo">836</span><a name="line.836"></a>
+<span class="sourceLineNo">837</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.837"></a>
+<span class="sourceLineNo">838</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.838"></a>
+<span class="sourceLineNo">839</span>        fs.create(recoveredEdits);<a name="line.839"></a>
+<span class="sourceLineNo">840</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.840"></a>
+<span class="sourceLineNo">841</span><a name="line.841"></a>
+<span class="sourceLineNo">842</span>        long time = System.nanoTime();<a name="line.842"></a>
+<span class="sourceLineNo">843</span>        WALEdit edit = null;<a name="line.843"></a>
+<span class="sourceLineNo">844</span>        if (i == maxSeqId) {<a name="line.844"></a>
+<span class="sourceLineNo">845</span>          edit = WALEdit.createCompaction(region.getRegionInfo(),<a name="line.845"></a>
+<span class="sourceLineNo">846</span>          CompactionDescriptor.newBuilder()<a name="line.846"></a>
+<span class="sourceLineNo">847</span>          .setTableName(ByteString.copyFrom(tableName.getName()))<a name="line.847"></a>
+<span class="sourceLineNo">848</span>          .setFamilyName(ByteString.copyFrom(regionName))<a name="line.848"></a>
+<span class="sourceLineNo">849</span>          .setEncodedRegionName(ByteString.copyFrom(regionName))<a name="line.849"></a>
+<span class="sourceLineNo">850</span>          .setStoreHomeDirBytes(ByteString.copyFrom(Bytes.toBytes(regiondir.toString())))<a name="line.850"></a>
+<span class="sourceLineNo">851</span>          .setRegionName(ByteString.copyFrom(region.getRegionInfo().getRegionName()))<a name="line.851"></a>
+<span class="sourceLineNo">852</span>          .build());<a name="line.852"></a>
+<span class="sourceLineNo">853</span>        } else {<a name="line.853"></a>
+<span class="sourceLineNo">854</span>          edit = new WALEdit();<a name="line.854"></a>
+<span class="sourceLineNo">855</span>          edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.855"></a>
+<span class="sourceLineNo">856</span>            .toBytes(i)));<a name="line.856"></a>
+<span class="sourceLineNo">857</span>        }<a name="line.857"></a>
+<span class="sourceLineNo">858</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.858"></a>
+<span class="sourceLineNo">859</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.859"></a>
+<span class="sourceLineNo">860</span>        writer.close();<a name="line.860"></a>
+<span class="sourceLineNo">861</span>      }<a name="line.861"></a>
+<span class="sourceLineNo">862</span><a name="line.862"></a>
+<span class="sourceLineNo">863</span>      long recoverSeqId = 1030;<a name="line.863"></a>
+<span class="sourceLineNo">864</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.864"></a>
+<span class="sourceLineNo">865</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.865"></a>
+<span class="sourceLineNo">866</span>      for (HStore store : region.getStores()) {<a name="line.866"></a>
+<span class="sourceLineNo">867</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), recoverSeqId - 1);<a name="line.867"></a>
+<span class="sourceLineNo">868</span>      }<a name="line.868"></a>
+<span class="sourceLineNo">869</span>      long seqId = region.replayRecoveredEditsIfAny(maxSeqIdInStores, null, status);<a name="line.869"></a>
+<span class="sourceLineNo">870</span>      assertEquals(maxSeqId, seqId);<a name="line.870"></a>
+<span class="sourceLineNo">871</span><a name="line.871"></a>
+<span class="sourceLineNo">872</span>      // assert that the files are flushed<a name="line.872"></a>
+<span class="sourceLineNo">873</span>      assertEquals(1, region.getStoreFileList(columns).size());<a name="line.873"></a>
+<span class="sourceLineNo">874</span><a name="line.874"></a>
+<span class="sourceLineNo">875</span>    } finally {<a name="line.875"></a>
+<span class="sourceLineNo">876</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.876"></a>
+<span class="sourceLineNo">877</span>      this.region = null;<a name="line.877"></a>
+<span class="sourceLineNo">878</span>      wals.close();<a name="line.878"></a>
+<span class="sourceLineNo">879</span>    }<a name="line.879"></a>
+<span class="sourceLineNo">880</span>  }<a name="line.880"></a>
+<span class="sourceLineNo">881</span><a name="line.881"></a>
+<span class="sourceLineNo">882</span>  @Test<a name="line.882"></a>
+<span class="sourceLineNo">883</span>  public void testRecoveredEditsReplayCompaction() throws Exception {<a name="line.883"></a>
+<span class="sourceLineNo">884</span>    testRecoveredEditsReplayCompaction(false);<a name="line.884"></a>
+<span class="sourceLineNo">885</span>    testRecoveredEditsReplayCompaction(true);<a name="line.885"></a>
+<span class="sourceLineNo">886</span>  }<a name="line.886"></a>
+<span class="sourceLineNo">887</span><a name="line.887"></a>
+<span class="sourceLineNo">888</span>  public void testRecoveredEditsReplayCompaction(boolean mismatchedRegionName) throws Exception {<a name="line.888"></a>
+<span class="sourceLineNo">889</span>    CONF.setClass(HConstants.REGION_IMPL, HRegionForTesting.class, Region.class);<a name="line.889"></a>
+<span class="sourceLineNo">890</span>    byte[] family = Bytes.toBytes("family");<a name="line.890"></a>
+<span class="sourceLineNo">891</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.891"></a>
+<span class="sourceLineNo">892</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.892"></a>
+<span class="sourceLineNo">893</span>    try {<a name="line.893"></a>
+<span class="sourceLineNo">894</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.894"></a>
+<span class="sourceLineNo">895</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.895"></a>
+<span class="sourceLineNo">896</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.896"></a>
+<span class="sourceLineNo">897</span><a name="line.897"></a>
+<span class="sourceLineNo">898</span>      long maxSeqId = 3;<a name="line.898"></a>
+<span class="sourceLineNo">899</span>      long minSeqId = 0;<a name="line.899"></a>
+<span class="sourceLineNo">900</span><a name="line.900"></a>
+<span class="sourceLineNo">901</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.901"></a>
+<span class="sourceLineNo">902</span>        Put put = new Put(Bytes.toBytes(i));<a name="line.902"></a>
+<span class="sourceLineNo">903</span>        put.addColumn(family, Bytes.toBytes(i), Bytes.toBytes(i));<a name="line.903"></a>
+<span class="sourceLineNo">904</span>        region.put(put);<a name="line.904"></a>
+<span class="sourceLineNo">905</span>        region.flush(true);<a name="line.905"></a>
+<span class="sourceLineNo">906</span>      }<a name="line.906"></a>
+<span class="sourceLineNo">907</span><a name="line.907"></a>
+<span class="sourceLineNo">908</span>      // this will create a region with 3 files<a name="line.908"></a>
+<span class="sourceLineNo">909</span>      assertEquals(3, region.getStore(family).getStorefilesCount());<a name="line.909"></a>
+<span class="sourceLineNo">910</span>      List&lt;Path&gt; storeFiles = new ArrayList&lt;&gt;(3);<a name="line.910"></a>
+<span class="sourceLineNo">911</span>      for (HStoreFile sf : region.getStore(family).getStorefiles()) {<a name="line.911"></a>
+<span class="sourceLineNo">912</span>        storeFiles.add(sf.getPath());<a name="line.912"></a>
+<span class="sourceLineNo">913</span>      }<a name="line.913"></a>
+<span class="sourceLineNo">914</span><a name="line.914"></a>
+<span class="sourceLineNo">915</span>      // disable compaction completion<a name="line.915"></a>
+<span class="sourceLineNo">916</span>      CONF.setBoolean("hbase.hstore.compaction.complete", false);<a name="line.916"></a>
+<span class="sourceLineNo">917</span>      region.compactStores();<a name="line.917"></a>
+<span class="sourceLineNo">918</span><a name="line.918"></a>
+<span class="sourceLineNo">919</span>      // ensure that nothing changed<a name="line.919"></a>
+<span class="sourceLineNo">920</span>      assertEquals(3, region.getStore(family).getStorefilesCount());<a name="line.920"></a>
+<span class="sourceLineNo">921</span><a name="line.921"></a>
+<span class="sourceLineNo">922</span>      // now find the compacted file, and manually add it to the recovered edits<a name="line.922"></a>
+<span class="sourceLineNo">923</span>      Path tmpDir = new Path(region.getRegionFileSystem().getTempDir(), Bytes.toString(family));<a name="line.923"></a>
+<span class="sourceLineNo">924</span>      FileStatus[] files = FSUtils.listStatus(fs, tmpDir);<a name="line.924"></a>
+<span class="sourceLineNo">925</span>      String errorMsg = "Expected to find 1 file in the region temp directory "<a name="line.925"></a>
+<span class="sourceLineNo">926</span>          + "from the compaction, could not find any";<a name="line.926"></a>
+<span class="sourceLineNo">927</span>      assertNotNull(errorMsg, files);<a name="line.927"></a>
+<span class="sourceLineNo">928</span>      assertEquals(errorMsg, 1, files.length);<a name="line.928"></a>
+<span class="sourceLineNo">929</span>      // move the file inside region dir<a name="line.929"></a>
+<span class="sourceLineNo">930</span>      Path newFile = region.getRegionFileSystem().commitStoreFile(Bytes.toString(family),<a name="line.930"></a>
+<span class="sourceLineNo">931</span>          files[0].getPath());<a name="line.931"></a>
+<span class="sourceLineNo">932</span><a name="line.932"></a>
+<span class="sourceLineNo">933</span>      byte[] encodedNameAsBytes = this.region.getRegionInfo().getEncodedNameAsBytes();<a name="line.933"></a>
+<span class="sourceLineNo">934</span>      byte[] fakeEncodedNameAsBytes = new byte [encodedNameAsBytes.length];<a name="line.934"></a>
+<span class="sourceLineNo">935</span>      for (int i=0; i &lt; encodedNameAsBytes.length; i++) {<a name="line.935"></a>
+<span class="sourceLineNo">936</span>        // Mix the byte array to have a new encodedName<a name="line.936"></a>
+<span class="sourceLineNo">937</span>        fakeEncodedNameAsBytes[i] = (byte) (encodedNameAsBytes[i] + 1);<a name="line.937"></a>
+<span class="sourceLineNo">938</span>      }<a name="line.938"></a>
+<span class="sourceLineNo">939</span><a name="line.939"></a>
+<span class="sourceLineNo">940</span>      CompactionDescriptor compactionDescriptor = ProtobufUtil.toCompactionDescriptor(this.region<a name="line.940"></a>
+<span class="sourceLineNo">941</span>        .getRegionInfo(), mismatchedRegionName ? fakeEncodedNameAsBytes : null, family,<a name="line.941"></a>
+<span class="sourceLineNo">942</span>            storeFiles, Lists.newArrayList(newFile),<a name="line.942"></a>
+<span class="sourceLineNo">943</span>            region.getRegionFileSystem().getStoreDir(Bytes.toString(family)));<a name="line.943"></a>
+<span class="sourceLineNo">944</span><a name="line.944"></a>
+<span class="sourceLineNo">945</span>      WALUtil.writeCompactionMarker(region.getWAL(), this.region.getReplicationScope(),<a name="line.945"></a>
+<span class="sourceLineNo">946</span>          this.region.getRegionInfo(), compactionDescriptor, region.getMVCC());<a name="line.946"></a>
+<span class="sourceLineNo">947</span><a name="line.947"></a>
+<span class="sourceLineNo">948</span>      Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.948"></a>
+<span class="sourceLineNo">949</span><a name="line.949"></a>
+<span class="sourceLineNo">950</span>      Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", 1000));<a name="line.950"></a>
+<span class="sourceLineNo">951</span>      fs.create(recoveredEdits);<a name="line.951"></a>
+<span class="sourceLineNo">952</span>      WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.952"></a>
+<span class="sourceLineNo">953</span><a name="line.953"></a>
+<span class="sourceLineNo">954</span>      long time = System.nanoTime();<a name="line.954"></a>
+<span class="sourceLineNo">955</span><a name="line.955"></a>
+<span class="sourceLineNo">956</span>      writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, 10, time,<a name="line.956"></a>
+<span class="sourceLineNo">957</span>          HConstants.DEFAULT_CLUSTER_ID), WALEdit.createCompaction(region.getRegionInfo(),<a name="line.957"></a>
+<span class="sourceLineNo">958</span>          compactionDescriptor)));<a name="line.958"></a>
+<span class="sourceLineNo">959</span>      writer.close();<a name="line.959"></a>
+<span class="sourceLineNo">960</span><a name="line.960"></a>
+<span class="sourceLineNo">961</span>      // close the region now, and reopen again<a name="line.961"></a>
+<span class="sourceLineNo">962</span>      region.getTableDescriptor();<a name="line.962"></a>
+<span class="sourceLineNo">963</span>      region.getRegionInfo();<a name="line.963"></a>
+<span class="sourceLineNo">964</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.964"></a>
+<span class="sourceLineNo">965</span>      try {<a name="line.965"></a>
+<span class="sourceLineNo">966</span>        region = HRegion.openHRegion(region, null);<a name="line.966"></a>
+<span class="sourceLineNo">967</span>      } catch (WrongRegionException wre) {<a name="line.967"></a>
+<span class="sourceLineNo">968</span>        fail("Matching encoded region name should not have produced WrongRegionException");<a name="line.968"></a>
+<span class="sourceLineNo">969</span>      }<a name="line.969"></a>
+<span class="sourceLineNo">970</span><a name="line.970"></a>
+<span class="sourceLineNo">971</span>      // now check whether we have only one store file, the compacted one<a name="line.971"></a>
+<span class="sourceLineNo">972</span>      Collection&lt;HStoreFile&gt; sfs = region.getStore(family).getStorefiles();<a name="line.972"></a>
+<span class="sourceLineNo">973</span>      for (HStoreFile sf : sfs) {<a name="line.973"></a>
+<span class="sourceLineNo">974</span>        LOG.info(Objects.toString(sf.getPath()));<a name="line.974"></a>
+<span class="sourceLineNo">975</span>      }<a name="line.975"></a>
+<span class="sourceLineNo">976</span>      if (!mismatchedRegionName) {<a name="line.976"></a>
+<span class="sourceLineNo">977</span>        assertEquals(1, region.getStore(family).getStorefilesCount());<a name="line.977"></a>
+<span class="sourceLineNo">978</span>      }<a name="line.978"></a>
+<span class="sourceLineNo">979</span>      files = FSUtils.listStatus(fs, tmpDir);<a name="line.979"></a>
+<span class="sourceLineNo">980</span>      assertTrue("Expected to find 0 files inside " + tmpDir, files == null || files.length == 0);<a name="line.980"></a>
+<span class="sourceLineNo">981</span><a name="line.981"></a>
+<span class="sourceLineNo">982</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.982"></a>
+<span class="sourceLineNo">983</span>        Get get = new Get(Bytes.toBytes(i));<a name="line.983"></a>
+<span class="sourceLineNo">984</span>        Result result = region.get(get);<a name="line.984"></a>
+<span class="sourceLineNo">985</span>        byte[] value = result.getValue(family, Bytes.toBytes(i));<a name="line.985"></a>
+<span class="sourceLineNo">986</span>        assertArrayEquals(Bytes.toBytes(i), value);<a name="line.986"></a>
+<span class="sourceLineNo">987</span>      }<a name="line.987"></a>
+<span class="sourceLineNo">988</span>    } finally {<a name="line.988"></a>
+<span class="sourceLineNo">989</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.989"></a>
+<span class="sourceLineNo">990</span>      this.region = null;<a name="line.990"></a>
+<span class="sourceLineNo">991</span>      wals.close();<a name="line.991"></a>
+<span class="sourceLineNo">992</span>      CONF.setClass(HConstants.REGION_IMPL, HRegion.class, Region.class);<a name="line.992"></a>
+<span class="sourceLineNo">993</span>    }<a name="line.993"></a>
+<span class="sourceLineNo">994</span>  }<a name="line.994"></a>
+<span class="sourceLineNo">995</span><a name="line.995"></a>
+<span class="sourceLineNo">996</span>  @Test<a name="line.996"></a>
+<span class="sourceLineNo">997</span>  public void testFlushMarkers() throws Exception {<a name="line.997"></a>
+<span class="sourceLineNo">998</span>    // tests that flush markers are written to WAL and handled at recovered edits<a name="line.998"></a>
+<span class="sourceLineNo">999</span>    byte[] family = Bytes.toBytes("family");<a name="line.999"></a>
+<span class="sourceLineNo">1000</span>    Path logDir = TEST_UTIL.getDataTestDirOnTestFS(method + ".log");<a name="line.1000"></a>
+<span class="sourceLineNo">1001</span>    final Configuration walConf = new Configuration(TEST_UTIL.getConfiguration());<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.1002"></a>
+<span class="sourceLineNo">1003</span>    final WALFactory wals = new WALFactory(walConf, method);<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span>    final WAL wal = wals.getWAL(RegionInfoBuilder.newBuilder(tableName).build());<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span><a name="line.1005"></a>
+<span class="sourceLineNo">1006</span>    this.region = initHRegion(tableName, HConstants.EMPTY_START_ROW,<a name="line.1006"></a>
+<span class="sourceLineNo">1007</span>      HConstants.EMPTY_END_ROW, false, Durability.USE_DEFAULT, wal, family);<a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>    try {<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span><a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>      long maxSeqId = 3;<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span>      long minSeqId = 0;<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span><a name="line.1015"></a>
+<span class="sourceLineNo">1016</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>        Put put = new Put(Bytes.toBytes(i));<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span>        put.addColumn(family, Bytes.toBytes(i), Bytes.toBytes(i));<a name="line.1018"></a>
+<span class="sourceLineNo">1019</span>        region.put(put);<a name="line.1019"></a>
+<span class="sourceLineNo">1020</span>        region.flush(true);<a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>      }<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span><a name="line.1022"></a>
+<span class="sourceLineNo">1023</span>      // this will create a region with 3 files from flush<a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>      assertEquals(3, region.getStore(family).getStorefilesCount());<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span>      List&lt;String&gt; storeFiles = new ArrayList&lt;&gt;(3);<a name="line.1025"></a>
+<span class="sourceLineNo">1026</span>      for (HStoreFile sf : region.getStore(family).getStorefiles()) {<a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>        storeFiles.add(sf.getPath().getName());<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span>      }<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span><a name="line.1029"></a>
+<span class="sourceLineNo">1030</span>      // now verify that the flush markers are written<a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>      wal.shutdown();<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>      WAL.Reader reader = WALFactory.createReader(fs, AbstractFSWALProvider.getCurrentFileName(wal),<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>        TEST_UTIL.getConfiguration());<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>      try {<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span>        List&lt;WAL.Entry&gt; flushDescriptors = new ArrayList&lt;&gt;();<a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>        long lastFlushSeqId = -1;<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>        while (true) {<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>          WAL.Entry entry = reader.next();<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>          if (entry == null) {<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>            break;<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span>          }<a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>          Cell cell = entry.getEdit().getCells().get(0);<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>          if (WALEdit.isMetaEditFamily(cell)) {<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>            FlushDescriptor flushDesc = WALEdit.getFlushDescriptor(cell);<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span>            assertNotNull(flushDesc);<a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>            assertArrayEquals(tableName.getName(), flushDesc.getTableName().toByteArray());<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>            if (flushDesc.getAction() == FlushAction.START_FLUSH) {<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span>              assertTrue(flushDesc.getFlushSequenceNumber() &gt; lastFlushSeqId);<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span>            } else if (flushDesc.getAction() == FlushAction.COMMIT_FLUSH) {<a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>              assertTrue(flushDesc.getFlushSequenceNumber() == lastFlushSeqId);<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>            }<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>            lastFlushSeqId = flushDesc.getFlushSequenceNumber();<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>            assertArrayEquals(regionName, flushDesc.getEncodedRegionName().toByteArray());<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>            assertEquals(1, flushDesc.getStoreFlushesCount()); //only one store<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>            StoreFlushDescriptor storeFlushDesc = flushDesc.getStoreFlushes(0);<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>            assertArrayEquals(family, storeFlushDesc.getFamilyName().toByteArray());<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span>            assertEquals("family", storeFlushDesc.getStoreHomeDir());<a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>            if (flushDesc.getAction() == FlushAction.START_FLUSH) {<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>              assertEquals(0, storeFlushDesc.getFlushOutputCount());<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>            } else {<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>              assertEquals(1, storeFlushDesc.getFlushOutputCount()); //only one file from flush<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>              assertTrue(storeFiles.contains(storeFlushDesc.getFlushOutput(0)));<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>            }<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span><a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>            flushDescriptors.add(entry);<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>          }<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>        }<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span><a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>        assertEquals(3 * 2, flushDescriptors.size()); // START_FLUSH and COMMIT_FLUSH per flush<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span><a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>        // now write those markers to the recovered edits again.<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span><a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>        Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span><a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", 1000));<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>        fs.create(recoveredEdits);<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span><a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>        for (WAL.Entry entry : flushDescriptors) {<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>          writer.append(entry);<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>        }<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>        writer.close();<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>      } finally {<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>        if (null != reader) {<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>          try {<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>            reader.close();<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>          } catch (IOException exception) {<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>            LOG.warn("Problem closing wal: " + exception.getMessage());<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>            LOG.debug("exception details", exception);<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>          }<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>        }<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>      }<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span><a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>      // close the region now, and reopen again<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>      region = HRegion.openHRegion(region, null);<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span><a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>      // now check whether we have can read back the data from region<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>        Get get = new Get(Bytes.toBytes(i));<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>        Result result = region.get(get);<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>        byte[] value = result.getValue(family, Bytes.toBytes(i));<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>        assertArrayEquals(Bytes.toBytes(i), value);<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>      }<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>    } finally {<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>      this.region = null;<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>      wals.close();<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>    }<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>  }<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span><a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>  static class IsFlushWALMarker implements ArgumentMatcher&lt;WALEdit&gt; {<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>    volatile FlushAction[] actions;<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>    public IsFlushWALMarker(FlushAction... actions) {<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>      this.actions = actions;<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>    }<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span>    @Override<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>    public boolean matches(WALEdit edit) {<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>      List&lt;Cell&gt; cells = edit.getCells();<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>      if (cells.isEmpty()) {<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span>        return false;<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>      }<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>      if (WALEdit.isMetaEditFamily(cells.get(0))) {<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>        FlushDescriptor desc;<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>        try {<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>          desc = WALEdit.getFlushDescriptor(cells.get(0));<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>        } catch (IOException e) {<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>          LOG.warn(e.toString(), e);<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>          return false;<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>        }<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>        if (desc != null) {<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>          for (FlushAction action : actions) {<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>            if (desc.getAction() == action) {<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>              return true;<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>            }<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>          }<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>        }<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>      }<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span>      return false;<a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>    }<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>    public IsFlushWALMarker set(FlushAction... actions) {<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>      this.actions = actions;<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>      return this;<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>    }<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>  }<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span><a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>  @Test<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span>  public void testFlushMarkersWALFail() throws Exception {<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>    // test the cases where the WAL append for flush markers fail.<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>    byte[] family = Bytes.toBytes("family");<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span><a name="line.1151"></a>
+<span class="sourceLineNo">1152</span>    // spy an actual WAL implementation to throw exception (was not able to mock)<a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>    Path logDir = TEST_UTIL.getDataTestDirOnTestFS(method + "log");<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span><a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>    final Configuration walConf = new Configuration(TEST_UTIL.getConfiguration());<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>    // Make up a WAL that we can manipulate at append time.<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>    class FailAppendFlushMarkerWAL extends FSHLog {<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>      volatile FlushAction [] flushActions = null;<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span><a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>      public FailAppendFlushMarkerWAL(FileSystem fs, Path root, String logDir, Configuration conf)<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>      throws IOException {<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>        super(fs, root, logDir, conf);<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>      }<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span><a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>      @Override<a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>      protected Writer createWriterInstance(Path path) throws IOException {<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>        final Writer w = super.createWriterInstance(path);<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>        return new Writer() {<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>          @Override<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>          public void close() throws IOException {<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>            w.close();<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>          }<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span><a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>          @Override<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>          public void sync(boolean forceSync) throws IOException {<a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>            w.sync(forceSync);<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span>          }<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span><a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>          @Override<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>          public void append(Entry entry) throws IOException {<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>            List&lt;Cell&gt; cells = entry.getEdit().getCells();<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>            if (WALEdit.isMetaEditFamily(cells.get(0))) {<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>              FlushDescriptor desc = WALEdit.getFlushDescriptor(cells.get(0));<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>              if (desc != null) {<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>                for (FlushAction flushAction: flushActions) {<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>                  if (desc.getAction().equals(flushAction)) {<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>                    throw new IOException("Failed to append flush marker! " + flushAction);<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>                  }<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>                }<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>              }<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>            }<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>            w.append(entry);<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>          }<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span><a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>          @Override<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>          public long getLength() {<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>            return w.getLength();<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>          }<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>        };<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>      }<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>    }<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>    FailAppendFlushMarkerWAL wal =<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>      new FailAppendFlushMarkerWAL(FileSystem.get(walConf), FSUtils.getRootDir(walConf),<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>        method, walConf);<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>    wal.init();<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>    this.region = initHRegion(tableName, HConstants.EMPTY_START_ROW,<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>      HConstants.EMPTY_END_ROW, false, Durability.USE_DEFAULT, wal, family);<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>    int i = 0;<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>    Put put = new Put(Bytes.toBytes(i));<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>    put.setDurability(Durability.SKIP_WAL); // have to skip mocked wal<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>    put.addColumn(family, Bytes.toBytes(i), Bytes.toBytes(i));<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>    region.put(put);<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span><a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>    // 1. Test case where START_FLUSH throws exception<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>    wal.flushActions = new FlushAction [] {FlushAction.START_FLUSH};<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span><a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>    // start cache flush will throw exception<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>    try {<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>      region.flush(true);<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>      fail("This should have thrown exception");<a name="line.1221"></a>
+<span class="sourceLineNo">1222</span>    } catch (DroppedSnapshotException unexpected) {<a name="line.1222"></a>
+<span class="sourceLineNo">1223</span>      // this should not be a dropped snapshot exception. Meaning that RS will not abort<a name="line.1223"></a>
+<span class="sourceLineNo">1224</span>      throw unexpected;<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span>    } catch (IOException expected) {<a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>      // expected<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span>    }<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>    // The WAL is hosed now. It has two edits appended. We cannot roll the log without it<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>    // throwing a DroppedSnapshotException to force an abort. Just clean up the mess.<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>    region.close(true);<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>    wal.close();<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span><a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>    // 2. Test case where START_FLUSH succeeds but COMMIT_FLUSH will throw exception<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>    wal.flushActions = new FlushAction [] {FlushAction.COMMIT_FLUSH};<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>    wal = new FailAppendFlushMarkerWAL(FileSystem.get(walConf), FSUtils.getRootDir(walConf),<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>          method, walConf);<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>    wal.init();<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span>    this.region = initHRegion(tableName, HConstants.EMPTY_START_ROW,<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>      HConstants.EMPTY_END_ROW, false, Durability.USE_DEFAULT, wal, family);<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>    region.put(put);<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span><a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>    // 3. Test case where ABORT_FLUSH will throw exception.<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span>    // Even if ABORT_FLUSH throws exception, we should not fail with IOE, but continue with<a name="line.1243"></a>
+<span class="sourceLineNo">1244</span>    // DroppedSnapshotException. Below COMMMIT_FLUSH will cause flush to abort<a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>    wal.flushActions = new FlushAction [] {FlushAction.COMMIT_FLUSH, FlushAction.ABORT_FLUSH};<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span><a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>    try {<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span>      region.flush(true);<a name="line.1248"></a>
+<span class="sourceLineNo">1249</span>      fail("This should have thrown exception");<a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>    } catch (DroppedSnapshotException expected) {<a name="line.1250"></a>
+<span class="sourceLineNo">1251</span>      // we expect this exception, since we were able to write the snapshot, but failed to<a name="line.1251"></a>
+<span class="sourceLineNo">1252</span>      // write the flush marker to WAL<a name="line.1252"></a>
+<span class="sourceLineNo">1253</span>    } catch (IOException unexpected) {<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span>      throw unexpected;<a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>    }<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>  }<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span><a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>  @Test<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>  public void testGetWhileRegionClose() throws IOException {<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span>    Configuration hc = initSplit();<a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>    int numRows = 100;<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>    byte[][] families = { fam1, fam2, fam3 };<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span><a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>    // Setting up region<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span>    this.region = initHRegion(tableName, method, hc, families);<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>    // Put data in region<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span>    final int startRow = 100;<a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>    putData(startRow, numRows, qual1, families);<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>    putData(startRow, numRows, qual2, families);<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>    putData(startRow, numRows, qual3, families);<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span>    final AtomicBoolean done = new AtomicBoolean(false);<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>    final AtomicInteger gets = new AtomicInteger(0);<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>    GetTillDoneOrException[] threads = new GetTillDoneOrException[10];<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>    try {<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>      // Set ten threads running concurrently getting from the region.<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span>      for (int i = 0; i &lt; threads.length / 2; i++) {<a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>        threads[i] = new GetTillDoneOrException(i, Bytes.toBytes("" + startRow), done, gets);<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>        threads[i].setDaemon(true);<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>        threads[i].start();<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>      }<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>      // Artificially make the condition by setting closing flag explicitly.<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span>      // I can't make the issue happen with a call to region.close().<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span>      this.region.closing.set(true);<a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>      for (int i = threads.length / 2; i &lt; threads.length; i++) {<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>        threads[i] = new GetTillDoneOrException(i, Bytes.toBytes("" + startRow), done, gets);<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>        threads[i].setDaemon(true);<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>        threads[i].start();<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span>      }<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>    } finally {<a name="line.1289"></a>
+<span class="sourceLineNo">1290</span>      if (this.region != null) {<a name="line.1290"></a>
+<span class="sourceLineNo">1291</span>        HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>        this.region = null;<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>      }<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>    }<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>    done.set(true);<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>    for (GetTillDoneOrException t : threads) {<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span>      try {<a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>        t.join();<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>      } catch (InterruptedException e) {<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>        e.printStackTrace();<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>      }<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>      if (t.e != null) {<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span>        LOG.info("Exception=" + t.e);<a name="line.1303"></a>
+<span class="sourceLineNo">1304</span>        assertFalse("Found a NPE in " + t.getName(), t.e instanceof NullPointerException);<a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>      }<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>    }<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span>  }<a name="line.1307"></a>
+<span class="sourceLineNo">1308</span><a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>  /*<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>   * Thread that does get on single row until 'done' flag is flipped. If an<a name="line.1310"></a>
+<span class="sourceLineNo">1311</span>   * exception causes us to fail, it records it.<a name="line.1311"></a>
+<span class="sourceLineNo">1312</span>   */<a name="line.1312"></a>
+<span class="sourceLineNo">1313</span>  class GetTillDoneOrException extends Thread {<a name="line.1313"></a>
+<span class="sourceLineNo">1314</span>    private final Get g;<a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>    private final AtomicBoolean done;<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>    private final AtomicInteger count;<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>    private Exception e;<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span><a name="line.1318"></a>
+<span class="sourceLineNo">1319</span>    GetTillDoneOrException(final int i, final byte[] r, final AtomicBoolean d,<a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>        final AtomicInteger c) {<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>      super("getter." + i);<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>      this.g = new Get(r);<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>      this.done = d;<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span>      this.count = c;<a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>    }<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span><a name="line.1326"></a>
+<span class="sourceLineNo">1327</span>    @Override<a name="line.1327"></a>
+<span class="sourceLineNo">1328</span>    public void run() {<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>      while (!this.done.get()) {<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span>        try {<a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>          assertTrue(region.get(g).size() &gt; 0);<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>          this.count.incrementAndGet();<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>        } catch (Exception e) {<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>          this.e = e;<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span>          break;<a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>        }<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>      }<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>    }<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>  }<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span><a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>  /*<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>   * An involved filter test. Has multiple column families and deletes in mix.<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>   */<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>  @Test<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>  public void testWeirdCacheBehaviour() throws Exception {<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.1346"></a>
+<span class="sourceLineNo">1347</span>    byte[][] FAMILIES = new byte[][] { Bytes.toBytes("trans-blob"), Bytes.toBytes("trans-type"),<a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>        Bytes.toBytes("trans-date"), Bytes.toBytes("trans-tags"), Bytes.toBytes("trans-group") };<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span>    this.region = initHRegion(tableName, method, CONF, FAMILIES);<a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>    String value = "this is the value";<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>    String value2 = "this is some other value";<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>    String keyPrefix1 = "prefix1";<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>    String keyPrefix2 = "prefix2";<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span>    String keyPrefix3 = "prefix3";<a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>    putRows(this.region, 3, value, keyPrefix1);<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>    putRows(this.region, 3, value, keyPrefix2);<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span>    putRows(this.region, 3, value, keyPrefix3);<a name="line.1357"></a>
+<span class="sourceLineNo">1358</span>    putRows(this.region, 3, value2, keyPrefix1);<a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>    putRows(this.region, 3, value2, keyPrefix2);<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>    putRows(this.region, 3, value2, keyPrefix3);<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span>    System.out.println("Checking values for key: " + keyPrefix1);<a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>    assertEquals("Got back incorrect number of rows from scan", 3,<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>        getNumberOfRows(keyPrefix1, value2, this.region));<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span>    System.out.println("Checking values for key: " + keyPrefix2);<a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>    assertEquals("Got back incorrect number of rows from scan", 3,<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span>        getNumberOfRows(keyPrefix2, value2, this.region));<a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>    System.out.println("Checking values for key: " + keyPrefix3);<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>    assertEquals("Got back incorrect number of rows from scan", 3,<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>        getNumberOfRows(keyPrefix3, value2, this.region));<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>    deleteColumns(this.region, value2, keyPrefix1);<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>    deleteColumns(this.region, value2, keyPrefix2);<a name="line.1371"></a>
+<span class="sourceLineNo">1372</span>    deleteColumns(this.region, value2, keyPrefix3);<a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>    System.out.println("Starting important checks.....");<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>    assertEquals("Got back incorrect number of rows from scan: " + keyPrefix1, 0,<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span>        getNumberOfRows(keyPrefix1, value2, this.region));<a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>    assertEquals("Got back incorrect number of rows from scan: " + keyPrefix2, 0,<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>        getNumberOfRows(keyPrefix2, value2, this.region));<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>    assertEquals("Got back incorrect number of rows from scan: " + keyPrefix3, 0,<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span>        getNumberOfRows(keyPrefix3, value2, this.region));<a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>  }<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span><a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>  @Test<a name="line.1382"></a>
+<span class="sourceLineNo">1383</span>  public void testAppendWithReadOnlyTable() throws Exception {<a name="line.1383"></a>
+<span class="sourceLineNo">1384</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.1384"></a>
+<span class="sourceLineNo">1385</span>    this.region = initHRegion(tableName, method, CONF, true, Bytes.toBytes("somefamily"));<a name="line.1385"></a>
+<span class="sourceLineNo">1386</span>    boolean exceptionCaught = false;<a name="line.1386"></a>
+<span class="sourceLineNo">1387</span>    Append append = new Append(Bytes.toBytes("somerow"));<a name="line.1387"></a>
+<span class="sourceLineNo">1388</span>    append.setDurability(Durability.SKIP_WAL);<a name="line.1388"></a>
+<span class="sourceLineNo">1389</span>    append.addColumn(Bytes.toBytes("somefamily"), Bytes.toBytes("somequalifier"),<a name="line.1389"></a>
+<span class="sourceLineNo">1390</span>        Bytes.toBytes("somevalue"));<a name="line.1390"></a>
+<span class="sourceLineNo">1391</span>    try {<a name="line.1391"></a>
+<span class="sourceLineNo">1392</span>      region.append(append);<a name="line.1392"></a>
+<span class="sourceLineNo">1393</span>    } catch (IOException e) {<a name="line.1393"></a>
+<span class="sourceLineNo">1394</span>      exceptionCaught = true;<a name="line.1394"></a>
+<span class="sourceLineNo">1395</span>    }<a name="line.1395"></a>
+<span class="sourceLineNo">1396</span>    assertTrue(exceptionCaught == true);<a name="line.1396"></a>
+<span class="sourceLineNo">1397</span>  }<a name="line.1397"></a>
+<span class="sourceLineNo">1398</span><a name="line.1398"></a>
+<span class="sourceLineNo">1399</span>  @Test<a name="line.1399"></a>
+<span class="sourceLineNo">1400</span>  public void testIncrWithReadOnlyTable() throws Exception {<a name="line.1400"></a>
+<span class="sourceLineNo">1401</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.1401"></a>
+<span class="sourceLineNo">1402</span>    this.region = initHRegion(tableName, method, CONF, true, Bytes.toBytes("somefamily"));<a name="line.1402"></a>
+<span class="sourceLineNo">1403</span>    boolean exceptionCaught = false;<a name="line.1403"></a>
+<span class="sourceLineNo">1404</span>    Increment inc = new Increment(Bytes.toBytes("somerow"));<a name="line.1404"></a>
+<span class="sourceLineNo">1405</span>    inc.setDurability(Durability.SKIP_WAL);<a name="line.1405"></a>
+<span class="sourceLineNo">1406</span>    inc.addColumn(Bytes.toBytes("somefamily"), Bytes.toBytes("somequalifier"), 1L);<a name="line.1406"></a>
+<span class="sourceLineNo">1407</span>    try {<a name="line.1407"></a>
+<span class="sourceLineNo">1408</span>      region.increment(inc);<a name="line.1408"></a>
+<span class="sourceLineNo">1409</span>    } catch (IOException e) {<a name="line.1409"></a>
+<span class="sourceLineNo">1410</span>      exceptionCaught = true;<a name="line.1410"></a>
+<span class="sourceLineNo">1411</span>    }<a name="line.1411"></a>
+<span class="sourceLineNo">1412</span>    assertTrue(exceptionCaught == true);<a name="line.1412"></a>
+<span class="sourceLineNo">1413</span>  }<a name="line.1413"></a>
+<span class="sourceLineNo">1414</span><a name="line.1414"></a>
+<span class="sourceLineNo">1415</span>  private void deleteColumns(HRegion r, String value, String keyPrefix) throws IOException {<a name="line.1415"></a>
+<span class="sourceLineNo">1416</span>    InternalScanner scanner = buildScanner(keyPrefix, value, r);<a name="line.1416"></a>
+<span class="sourceLineNo">1417</span>    int count = 0;<a name="line.1417"></a>
+<span class="sourceLineNo">1418</span>    boolean more = false;<a name="line.1418"></a>
+<span class="sourceLineNo">1419</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.1419"></a>
+<span class="sourceLineNo">1420</span>    do {<a name="line.1420"></a>
+<span class="sourceLineNo">1421</span>      more = scanner.next(results);<a name="line.1421"></a>
+<span class="sourceLineNo">1422</span>      if (results != null &amp;&amp; !results.isEmpty())<a name="line.1422"></a>
+<span class="sourceLineNo">1423</span>        count++;<a name="line.1423"></a>
+<span class="sourceLineNo">1424</span>      else<a name="line.1424"></a>
+<span class="sourceLineNo">1425</span>        break;<a name="line.1425"></a>
+<span class="sourceLineNo">1426</span>      Delete delete = new Delete(CellUtil.cloneRow(results.get(0)));<a name="line.1426"></a>
+<span class="sourceLineNo">1427</span>      delete.addColumn(Bytes.toBytes("trans-tags"), Bytes.toBytes("qual2"));<a name="line.1427"></a>
+<span class="sourceLineNo">1428</span>      r.delete(delete);<a name="line.1428"></a>
+<span class="sourceLineNo">1429</span>      results.clear();<a name="line.1429"></a>
+<span class="sourceLineNo">1430</span>    } while (more);<a name="line.1430"></a>
+<span class="sourceLineNo">1431</span>    assertEquals("Did not perform correct number of deletes", 3, count);<a name="line.1431"></a>
+<span class="sourceLineNo">1432</span>  }<a name="line.1432"></a>
+<span class="sourceLineNo">1433</span><a name="line.1433"></a>
+<span class="sourceLineNo">1434</span>  private int getNumberOfRows(String keyPrefix, String value, HRegion r) throws Exception {<a name="line.1434"></a>
+<span class="sourceLineNo">1435</span>    InternalScanner resultScanner = buildScanner(keyPrefix, value, r);<a name="line.1435"></a>
+<span class="sourceLineNo">1436</span>    int numberOfResults = 0;<a name="line.1436"></a>
+<span class="sourceLineNo">1437</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.1437"></a>
+<span class="sourceLineNo">1438</span>    boolean more = false;<a name="line.1438"></a>
+<span class="sourceLineNo">1439</span>    do {<a name="line.1439"></a>
+<span class="sourceLineNo">1440</span>      more = resultScanner.next(results);<a name="line.1440"></a>
+<span class="sourceLineNo">1441</span>      if (results != null &amp;&amp; !results.isEmpty())<a name="line.1441"></a>
+<span class="sourceLineNo">1442</span>        numberOfResults++;<a name="line.1442"></a>
+<span class="sourceLineNo">1443</span>      else<a name="line.1443"></a>
+<span class="sourceLineNo">1444</span>        break;<a name="line.1444"></a>
+<span class="sourceLineNo">1445</span>      for (Cell kv : results) {<a name="line.1445"></a>
+<span class="sourceLineNo">1446</span>        System.out.println("kv=" + kv.toString() + ", " + Bytes.toString(CellUtil.cloneValue(kv)));<a name="line.1446"></a>
+<span class="sourceLineNo">1447</span>      }<a name="line.1447"></a>
+<span class="sourceLineNo">1448</span>      results.clear();<a name="line.1448"></a>
+<span class="sourceLineNo">1449</span>    } while (more);<a name="line.1449"></a>
+<span class="sourceLineNo">1450</span>    return numberOfResults;<a name="line.1450"></a>
+<span class="sourceLineNo">1451</span>  }<a name="line.1451"></a>
+<span class="sourceLineNo">1452</span><a name="line.1452"></a>
+<span class="sourceLineNo">1453</span>  private InternalScanner buildScanner(String keyPrefix, String value, HRegion r)<a name="line.1453"></a>
+<span class="sourceLineNo">1454</span>      throws IOException {<a name="line.1454"></a>
+<span class="sourceLineNo">1455</span>    // Defaults FilterList.Operator.MUST_PASS_ALL.<a name="line.1455"></a>
+<span class="sourceLineNo">1456</span>    FilterList allFilters = new FilterList();<a name="line.1456"></a>
+<span class="sourceLineNo">1457</span>    allFilters.addFilter(new PrefixFilter(Bytes.toBytes(keyPrefix)));<a name="line.1457"></a>
+<span class="sourceLineNo">1458</span>    // Only return rows where this column value exists in the row.<a name="line.1458"></a>
+<span class="sourceLineNo">1459</span>    SingleColumnValueFilter filter = new SingleColumnValueFilter(Bytes.toBytes("trans-tags"),<a name="line.1459"></a>
+<span class="sourceLineNo">1460</span>        Bytes.toBytes("qual2"), CompareOperator.EQUAL, Bytes.toBytes(value));<a name="line.1460"></a>
+<span class="sourceLineNo">1461</span>    filter.setFilterIfMissing(true);<a name="line.1461"></a>
+<span class="sourceLineNo">1462</span>    allFilters.addFilter(filter);<a name="line.1462"></a>
+<span class="sourceLineNo">1463</span>    Scan scan = new Scan();<a name="line.1463"></a>
+<span class="sourceLineNo">1464</span>    scan.addFamily(Bytes.toBytes("trans-blob"));<a name="line.1464"></a>
+<span class="sourceLineNo">1465</span>    scan.addFamily(Bytes.toBytes("trans-type"));<a name="line.1465"></a>
+<span class="sourceLineNo">1466</span>    scan.addFamily(Bytes.toBytes("trans-date"));<a name="line.1466"></a>
+<span class="sourceLineNo">1467</span>    scan.addFamily(Bytes.toBytes("trans-tags"));<a name="line.1467"></a>
+<span class="sourceLineNo">1468</span>    scan.addFamily(Bytes.toBytes("trans-group"));<a name="line.1468"></a>
+<span class="sourceLineNo">1469</span>    scan.setFilter(allFilters);<a name="line.1469"></a>
+<span class="sourceLineNo">1470</span>    return r.getScanner(scan);<a name="line.1470"></a>
+<span class="sourceLineNo">1471</span>  }<a name="line.1471"></a>
+<span class="sourceLineNo">1472</span><a name="line.1472"></a>
+<span class="sourceLineNo">1473</span>  private void putRows(HRegion r, int numRows, String value, String key) throws IOException {<a name="line.1473"></a>
+<span class="sourceLineNo">1474</span>    for (int i = 0; i &lt; numRows; i++) {<a name="line.1474"></a>
+<span class="sourceLineNo">1475</span>      String row = key + "_" + i/* UUID.randomUUID().toString() */;<a name="line.1475"></a>
+<span class="sourceLineNo">1476</span>      System.out.println(String.format("Saving row: %s, with value %s", row, value));<a name="line.1476"></a>
+<span class="sourceLineNo">1477</span>      Put put = new Put(Bytes.toBytes(row));<a name="line.1477"></a>
+<span class="sourceLineNo">1478</span>      put.setDurability(Durability.SKIP_WAL);<a name="line.1478"></a>
+<span class="sourceLineNo">1479</span>      put.addColumn(Bytes.toBytes("trans-blob"), null, Bytes.toBytes("value for blob"));<a name="line.1479"></a>
+<span class="sourceLineNo">1480</span>      put.addColumn(Bytes.toBytes("trans-type"), null, Bytes.toBytes("statement"));<a name="line.1480"></a>
+<span class="sourceLineNo">1481</span>      put.addColumn(Bytes.toBytes("trans-date"), null, Bytes.toBytes("20090921010101999"));<a name="line.1481"></a>
+<span class="sourceLineNo">1482</span>      put.addColumn(Bytes.toBytes("trans-tags"), Bytes.toBytes("qual2"), Bytes.toBytes(value));<a name="line.1482"></a>
+<span class="sourceLineNo">1483</span>      put.addColumn(Bytes.toBytes("trans-group"), null, Bytes.toBytes("adhocTransactionGroupId"));<a name="line.1483"></a>
+<span class="sourceLineNo">1484</span>      r.put(put);<a name="line.1484"></a>
+<span class="sourceLineNo">1485</span>    }<a name="line.1485"></a>
+<span class="sourceLineNo">1486</span>  }<a name="line.1486"></a>
+<span class="sourceLineNo">1487</span><a name="line.1487"></a>
+<span class="sourceLineNo">1488</span>  @Test<a name="line.1488"></a>
+<span class="sourceLineNo">1489</span>  public void testFamilyWithAndWithoutColon() throws Exception {<a name="line.1489"></a>
+<span class="sourceLineNo">1490</span>    byte[] cf = Bytes.toBytes(COLUMN_FAMILY);<a name="line.1490"></a>
+<span class="sourceLineNo">1491</span>    this.region = initHRegion(tableName, method, CONF, cf);<a name="line.1491"></a>
+<span class="sourceLineNo">1492</span>    Put p = new Put(tableName.toBytes());<a name="line.1492"></a>
+<span class="sourceLineNo">1493</span>    byte[] cfwithcolon = Bytes.toBytes(COLUMN_FAMILY + ":");<a name="line.1493"></a>
+<span class="sourceLineNo">1494</span>    p.addColumn(cfwithcolon, cfwithcolon, cfwithcolon);<a name="line.1494"></a>
+<span class="sourceLineNo">1495</span>    boolean exception = false;<a name="line.1495"></a>
+<span class="sourceLineNo">1496</span>    try {<a name="line.1496"></a>
+<span class="sourceLineNo">1497</span>      this.region.put(p);<a name="line.1497"></a>
+<span class="sourceLineNo">1498</span>    } catch (NoSuchColumnFamilyException e) {<a name="line.1498"></a>
+<span class="sourceLineNo">1499</span>      exception = true;<a name="line.1499"></a>
+<span class="sourceLineNo">1500</span>    }<a name="line.1500"></a>
+<span class="sourceLineNo">1501</span>    assertTrue(exception);<a name="line.1501"></a>
+<span class="sourceLineNo">1502</span>  }<a name="line.1502"></a>
+<span class="sourceLineNo">1503</span><a name="line.1503"></a>
+<span class="sourceLineNo">1504</span>  @Test<a name="line.1504"></a>
+<span class="sourceLineNo">1505</span>  public void testBatchPut_whileNoRowLocksHeld() throws IOException {<a name="line.1505"></a>
+<span class="sourceLineNo">1506</span>    final Put[] puts = new Put[10];<a name="line.1506"></a>
+<span class="sourceLineNo">1507</span>    MetricsWALSource source = CompatibilitySingletonFactory.getInstance(MetricsWALSource.class);<a name="line.1507"></a>
+<span class="sourceLineNo">1508</span>    long syncs = prepareRegionForBachPut(puts, source, false);<a name="line.1508"></a>
+<span class="sourceLineNo">1509</span><a name="line.1509"></a>
+<span class="sourceLineNo">1510</span>    OperationStatus[] codes = this.region.batchMutate(puts);<a name="line.1510"></a>
+<span class="sourceLineNo">1511</span>    assertEquals(10, codes.length);<a name="line.1511"></a>
+<span class="sourceLineNo">1512</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.1512"></a>
+<span class="sourceLineNo">1513</span>      assertEquals(OperationStatusCode.SUCCESS, codes[i].getOperationStatusCode());<a name="line.1513"></a>
+<span class="sourceLineNo">1514</span>    }<a name="line.1514"></a>
+<span class="sourceLineNo">1515</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs + 1, source);<a name="line.1515"></a>
+<span class="sourceLineNo">1516</span><a name="line.1516"></a>
+<span class="sourceLineNo">1517</span>    LOG.info("Next a batch put with one invalid family");<a name="line.1517"></a>
+<span class="sourceLineNo">1518</span>    puts[5].addColumn(Bytes.toBytes("BAD_CF"), qual, value);<a name="line.1518"></a>
+<span class="sourceLineNo">1519</span>    codes = this.region.batchMutate(puts);<a name="line.1519"></a>
+<span class="sourceLineNo">1520</span>    assertEquals(10, codes.length);<a name="line.1520"></a>
+<span class="sourceLineNo">1521</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.1521"></a>
+<span class="sourceLineNo">1522</span>      assertEquals((i == 5) ? OperationStatusCode.BAD_FAMILY : OperationStatusCode.SUCCESS,<a name="line.1522"></a>
+<span class="sourceLineNo">1523</span>          codes[i].getOperationStatusCode());<a name="line.1523"></a>
+<span class="sourceLineNo">1524</span>    }<a name="line.1524"></a>
+<span class="sourceLineNo">1525</span><a name="line.1525"></a>
+<span class="sourceLineNo">1526</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs + 2, source);<a name="line.1526"></a>
+<span class="sourceLineNo">1527</span>  }<a name="line.1527"></a>
+<span class="sourceLineNo">1528</span><a name="line.1528"></a>
+<span class="sourceLineNo">1529</span>  @Test<a name="line.1529"></a>
+<span class="sourceLineNo">1530</span>  public void testBatchPut_whileMultipleRowLocksHeld() throws Exception {<a name="line.1530"></a>
+<span class="sourceLineNo">1531</span>    final Put[] puts = new Put[10];<a name="line.1531"></a>
+<span class="sourceLineNo">1532</span>    MetricsWALSource source = CompatibilitySingletonFactory.getInstance(MetricsWALSource.class);<a name="line.1532"></a>
+<span class="sourceLineNo">1533</span>    long syncs = prepareRegionForBachPut(puts, source, false);<a name="line.1533"></a>
+<span class="sourceLineNo">1534</span><a name="line.1534"></a>
+<span class="sourceLineNo">1535</span>    puts[5].addColumn(Bytes.toBytes("BAD_CF"), qual, value);<a name="line.1535"></a>
+<span class="sourceLineNo">1536</span><a name="line.1536"></a>
+<span class="sourceLineNo">1537</span>    LOG.info("batchPut will have to break into four batches to avoid row locks");<a name="line.1537"></a>
+<span class="sourceLineNo">1538</span>    RowLock rowLock1 = region.getRowLock(Bytes.toBytes("row_2"));<a name="line.1538"></a>
+<span class="sourceLineNo">1539</span>    RowLock rowLock2 = region.getRowLock(Bytes.toBytes("row_1"));<a name="line.1539"></a>
+<span class="sourceLineNo">1540</span>    RowLock rowLock3 = region.getRowLock(Bytes.toBytes("row_3"));<a name="line.1540"></a>
+<span class="sourceLineNo">1541</span>    RowLock rowLock4 = region.getRowLock(Bytes.toBytes("row_3"), true);<a name="line.1541"></a>
+<span class="sourceLineNo">1542</span><a name="line.1542"></a>
+<span class="sourceLineNo">1543</span>    MultithreadedTestUtil.TestContext ctx = new MultithreadedTestUtil.TestContext(CONF);<a name="line.1543"></a>
+<span class="sourceLineNo">1544</span>    final AtomicReference&lt;OperationStatus[]&gt; retFromThread = new AtomicReference&lt;&gt;();<a name="line.1544"></a>
+<span class="sourceLineNo">1545</span>    final CountDownLatch startingPuts = new CountDownLatch(1);<a name="line.1545"></a>
+<span class="sourceLineNo">1546</span>    final CountDownLatch startingClose = new CountDownLatch(1);<a name="line.1546"></a>
+<span class="sourceLineNo">1547</span>    TestThread putter = new TestThread(ctx) {<a name="line.1547"></a>
+<span class="sourceLineNo">1548</span>      @Override<a name="line.1548"></a>
+<span class="sourceLineNo">1549</span>      public void doWork() throws IOException {<a name="line.1549"></a>
+<span class="sourceLineNo">1550</span>        startingPuts.countDown();<a name="line.1550"></a>
+<span class="sourceLineNo">1551</span>        retFromThread.set(region.batchMutate(puts));<a name="line.1551"></a>
+<span class="sourceLineNo">1552</span>      }<a name="line.1552"></a>
+<span class="sourceLineNo">1553</span>    };<a name="line.1553"></a>
+<span class="sourceLineNo">1554</span>    LOG.info("...starting put thread while holding locks");<a name="line.1554"></a>
+<span class="sourceLineNo">1555</span>    ctx.addThread(putter);<a name="line.1555"></a>
+<span class="sourceLineNo">1556</span>    ctx.startThreads();<a name="line.1556"></a>
+<span class="sourceLineNo">1557</span><a name="line.1557"></a>
+<span class="sourceLineNo">1558</span>    // Now attempt to close the region from another thread.  Prior to HBASE-12565<a name="line.1558"></a>
+<span class="sourceLineNo">1559</span>    // this would cause the in-progress batchMutate operation to to fail with<a name="line.1559"></a>
+<span class="sourceLineNo">1560</span>    // exception because it use to release and re-acquire the close-guard lock<a name="line.1560"></a>
+<span class="sourceLineNo">1561</span>    // between batches.  Caller then didn't get status indicating which writes succeeded.<a name="line.1561"></a>
+<span class="sourceLineNo">1562</span>    // We now expect this thread to block until the batchMutate call finishes.<a name="line.1562"></a>
+<span class="sourceLineNo">1563</span>    Thread regionCloseThread = new TestThread(ctx) {<a name="line.1563"></a>
+<span class="sourceLineNo">1564</span>      @Override<a name="line.1564"></a>
+<span class="sourceLineNo">1565</span>      public void doWork() {<a name="line.1565"></a>
+<span class="sourceLineNo">1566</span>        try {<a name="line.1566"></a>
+<span class="sourceLineNo">1567</span>          startingPuts.await();<a name="line.1567"></a>
+<span class="sourceLineNo">1568</span>          // Give some time for the batch mutate to get in.<a name="line.1568"></a>
+<span class="sourceLineNo">1569</span>          // We don't want to race with the mutate<a name="line.1569"></a>
+<span class="sourceLineNo">1570</span>          Thread.sleep(10);<a name="line.1570"></a>
+<span class="sourceLineNo">1571</span>          startingClose.countDown();<a name="line.1571"></a>
+<span class="sourceLineNo">1572</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.1572"></a>
+<span class="sourceLineNo">1573</span>          region = null;<a name="line.1573"></a>
+<span class="sourceLineNo">1574</span>        } catch (IOException e) {<a name="line.1574"></a>
+<span class="sourceLineNo">1575</span>          throw new RuntimeException(e);<a name="line.1575"></a>
+<span class="sourceLineNo">1576</span>        } catch (InterruptedException e) {<a name="line.1576"></a>
+<span class="sourceLineNo">1577</span>          throw new RuntimeException(e);<a name="line.1577"></a>
+<span class="sourceLineNo">1578</span>        }<a name="line.1578"></a>
+<span class="sourceLineNo">1579</span>      }<a name="line.1579"></a>
+<span class="sourceLineNo">1580</span>    };<a name="line.1580"></a>
+<span class="sourceLineNo">1581</span>    regionCloseThread.start();<a name="line.1581"></a>
+<span class="sourceLineNo">1582</span><a name="line.1582"></a>
+<span class="sourceLineNo">1583</span>    startingClose.await();<a name="line.1583"></a>
+<span class="sourceLineNo">1584</span>    startingPuts.await();<a name="line.1584"></a>
+<span class="sourceLineNo">1585</span>    Thread.sleep(100);<a name="line.1585"></a>
+<span class="sourceLineNo">1586</span>    LOG.info("...releasing row lock 1, which should let put thread continue");<a name="line.1586"></a>
+<span class="sourceLineNo">1587</span>    rowLock1.release();<a name="line.1587"></a>
+<span class="sourceLineNo">1588</span>    rowLock2.release();<a name="line.1588"></a>
+<span class="sourceLineNo">1589</span>    rowLock3.release();<a name="line.1589"></a>
+<span class="sourceLineNo">1590</span>    waitForCounter(source, "syncTimeNumOps", syncs + 1);<a name="line.1590"></a>
+<span class="sourceLineNo">1591</span><a name="line.1591"></a>
+<span class="sourceLineNo">1592</span>    LOG.info("...joining on put thread");<a name="line.1592"></a>
+<span class="sourceLineNo">1593</span>    ctx.stop();<a name="line.1593"></a>
+<span class="sourceLineNo">1594</span>    regionCloseThread.join();<a name="line.1594"></a>
+<span class="sourceLineNo">1595</span><a name="line.1595"></a>
+<span class="sourceLineNo">1596</span>    OperationStatus[] codes = retFromThread.get();<a name="line.1596"></a>
+<span class="sourceLineNo">1597</span>    for (int i = 0; i &lt; codes.length; i++) {<a name="line.1597"></a>
+<span class="sourceLineNo">1598</span>      assertEquals((i == 5) ? OperationStatusCode.BAD_FAMILY : OperationStatusCode.SUCCESS,<a name="line.1598"></a>
+<span class="sourceLineNo">1599</span>          codes[i].getOperationStatusCode());<a name="line.1599"></a>
+<span class="sourceLineNo">1600</span>    }<a name="line.1600"></a>
+<span class="sourceLineNo">1601</span>    rowLock4.release();<a name="line.1601"></a>
+<span class="sourceLineNo">1602</span>  }<a name="line.1602"></a>
+<span class="sourceLineNo">1603</span><a name="line.1603"></a>
+<span class="sourceLineNo">1604</span>  private void waitForCounter(MetricsWALSource source, String metricName, long expectedCount)<a name="line.1604"></a>
+<span class="sourceLineNo">1605</span>      throws InterruptedException {<a name="line.1605"></a>
+<span class="sourceLineNo">1606</span>    long startWait = System.currentTimeMillis();<a name="line.1606"></a>
+<span class="sourceLineNo">1607</span>    long currentCount;<a name="line.1607"></a>
+<span class="sourceLineNo">1608</span>    while ((currentCount = metricsAssertHelper.getCounter(metricName, source)) &lt; expectedCount) {<a name="line.1608"></a>
+<span class="sourceLineNo">1609</span>      Thread.sleep(100);<a name="line.1609"></a>
+<span class="sourceLineNo">1610</span>      if (System.currentTimeMillis() - startWait &gt; 10000) {<a name="line.1610"></a>
+<span class="sourceLineNo">1611</span>        fail(String.format("Timed out waiting for '%s' &gt;= '%s', currentCount=%s", metricName,<a name="line.1611"></a>
+<span class="sourceLineNo">1612</span>            expectedCount, currentCount));<a name="line.1612"></a>
+<span class="sourceLineNo">1613</span>      }<a name="line.1613"></a>
+<span class="sourceLineNo">1614</span>    }<a name="line.1614"></a>
+<span class="sourceLineNo">1615</span>  }<a name="line.1615"></a>
+<span class="sourceLineNo">1616</span><a name="line.1616"></a>
+<span class="sourceLineNo">1617</span>  @Test<a name="line.1617"></a>
+<span class="sourceLineNo">1618</span>  public void testAtomicBatchPut() throws IOException {<a name="line.1618"></a>
+<span class="sourceLineNo">1619</span>    final Put[] puts = new Put[10];<a name="line.1619"></a>
+<span class="sourceLineNo">1620</span>    MetricsWALSource source = CompatibilitySingletonFactory.getInstance(MetricsWALSource.class);<a name="line.1620"></a>
+<span class="sourceLineNo">1621</span>    long syncs = prepareRegionForBachPut(puts, source, false);<a name="line.1621"></a>
+<span class="sourceLineNo">1622</span><a name="line.1622"></a>
+<span class="sourceLineNo">1623</span>    // 1. Straight forward case, should succeed<a name="line.1623"></a>
+<span class="sourceLineNo">1624</span>    MutationBatchOperation batchOp = new MutationBatchOperation(region, puts, true,<a name="line.1624"></a>
+<span class="sourceLineNo">1625</span>        HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.1625"></a>
+<span class="sourceLineNo">1626</span>    OperationStatus[] codes = this.region.batchMutate(batchOp);<a name="line.1626"></a>
+<span class="sourceLineNo">1627</span>    assertEquals(10, codes.length);<a name="line.1627"></a>
+<span class="sourceLineNo">1628</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.1628"></a>
+<span class="sourceLineNo">1629</span>      assertEquals(OperationStatusCode.SUCCESS, codes[i].getOperationStatusCode());<a name="line.1629"></a>
+<span class="sourceLineNo">1630</span>    }<a name="line.1630"></a>
+<span class="sourceLineNo">1631</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs + 1, source);<a name="line.1631"></a>
+<span class="sourceLineNo">1632</span><a name="line.1632"></a>
+<span class="sourceLineNo">1633</span>    // 2. Failed to get lock<a name="line.1633"></a>
+<span class="sourceLineNo">1634</span>    RowLock lock = region.getRowLock(Bytes.toBytes("row_" + 3));<a name="line.1634"></a>
+<span class="sourceLineNo">1635</span>    // Method {@link HRegion#getRowLock(byte[])} is reentrant. As 'row_3' is locked in this<a name="line.1635"></a>
+<span class="sourceLineNo">1636</span>    // thread, need to run {@link HRegion#batchMutate(HRegion.BatchOperation)} in different thread<a name="line.1636"></a>
+<span class="sourceLineNo">1637</span>    MultithreadedTestUtil.TestContext ctx = new MultithreadedTestUtil.TestContext(CONF);<a name="line.1637"></a>
+<span class="sourceLineNo">1638</span>    final AtomicReference&lt;IOException&gt; retFromThread = new AtomicReference&lt;&gt;();<a name="line.1638"></a>
+<span class="sourceLineNo">1639</span>    final CountDownLatch finishedPuts = new CountDownLatch(1);<a name="line.1639"></a>
+<span class="sourceLineNo">1640</span>    final MutationBatchOperation finalBatchOp = new MutationBatchOperation(region, puts, true,<a name="line.1640"></a>
+<span class="sourceLineNo">1641</span>        HConstants<a name="line.1641"></a>
+<span class="sourceLineNo">1642</span>        .NO_NONCE,<a name="line.1642"></a>
+<span class="sourceLineNo">1643</span>        HConstants.NO_NONCE);<a name="line.1643"></a>
+<span class="sourceLineNo">1644</span>    TestThread putter = new TestThread(ctx) {<a name="line.1644"></a>
+<span class="sourceLineNo">1645</span>      @Override<a name="line.1645"></a>
+<span class="sourceLineNo">1646</span>      public void doWork() throws IOException {<a name="line.1646"></a>
+<span class="sourceLineNo">1647</span>        try {<a name="line.1647"></a>
+<span class="sourceLineNo">1648</span>          region.batchMutate(finalBatchOp);<a name="line.1648"></a>
+<span class="sourceLineNo">1649</span>        } catch (IOException ioe) {<a name="line.1649"></a>
+<span class="sourceLineNo">1650</span>          LOG.error("test failed!", ioe);<a name="line.1650"></a>
+<span class="sourceLineNo">1651</span>          retFromThread.set(ioe);<a name="line.1651"></a>
+<span class="sourceLineNo">1652</span>        }<a name="line.1652"></a>
+<span class="sourceLineNo">1653</span>        finishedPuts.countDown();<a name="line.1653"></a>
+<span class="sourceLineNo">1654</span>      }<a name="line.1654"></a>
+<span class="sourceLineNo">1655</span>    };<a name="line.1655"></a>
+<span class="sourceLineNo">1656</span>    LOG.info("...starting put thread while holding locks");<a name="line.1656"></a>
+<span class="sourceLineNo">1657</span>    ctx.addThread(putter);<a name="line.1657"></a>
+<span class="sourceLineNo">1658</span>    ctx.startThreads();<a name="line.1658"></a>
+<span class="sourceLineNo">1659</span>    LOG.info("...waiting for batch puts while holding locks");<a name="line.1659"></a>
+<span class="sourceLineNo">1660</span>    try {<a name="line.1660"></a>
+<span class="sourceLineNo">1661</span>      finishedPuts.await();<a name="line.1661"></a>
+<span class="sourceLineNo">1662</span>    } catch (InterruptedException e) {<a name="line.1662"></a>
+<span class="sourceLineNo">1663</span>      LOG.error("Interrupted!", e);<a name="line.1663"></a>
+<span class="sourceLineNo">1664</span>    } finally {<a name="line.1664"></a>
+<span class="sourceLineNo">1665</span>      if (lock != null) {<a name="line.1665"></a>
+<span class="sourceLineNo">1666</span>        lock.release();<a name="line.1666"></a>
+<span class="sourceLineNo">1667</span>      }<a name="line.1667"></a>
+<span class="sourceLineNo">1668</span>    }<a name="line.1668"></a>
+<span class="sourceLineNo">1669</span>    assertNotNull(retFromThread.get());<a name="line.1669"></a>
+<span class="sourceLineNo">1670</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs + 1, source);<a name="line.1670"></a>
+<span class="sourceLineNo">1671</span><a name="line.1671"></a>
+<span class="sourceLineNo">1672</span>    // 3. Exception thrown in validation<a name="line.1672"></a>
+<span class="sourceLineNo">1673</span>    LOG.info("Next a batch put with one invalid family");<a name="line.1673"></a>
+<span class="sourceLineNo">1674</span>    puts[5].addColumn(Bytes.toBytes("BAD_CF"), qual, value);<a name="line.1674"></a>
+<span class="sourceLineNo">1675</span>    batchOp = new MutationBatchOperation(region, puts, true, HConstants.NO_NONCE,<a name="line.1675"></a>
+<span class="sourceLineNo">1676</span>        HConstants.NO_NONCE);<a name="line.1676"></a>
+<span class="sourceLineNo">1677</span>    thrown.expect(NoSuchColumnFamilyException.class);<a name="line.1677"></a>
+<span class="sourceLineNo">1678</span>    this.region.batchMutate(batchOp);<a name="line.1678"></a>
+<span class="sourceLineNo">1679</span>  }<a name="line.1679"></a>
+<span class="sourceLineNo">1680</span><a name="line.1680"></a>
+<span class="sourceLineNo">1681</span>  @Test<a name="line.1681"></a>
+<span class="sourceLineNo">1682</span>  public void testBatchPutWithTsSlop() throws Exception {<a name="line.1682"></a>
+<span class="sourceLineNo">1683</span>    // add data with a timestamp that is too recent for range. Ensure assert<a name="line.1683"></a>
+<span class="sourceLineNo">1684</span>    CONF.setInt("hbase.hregion.keyvalue.timestamp.slop.millisecs", 1000);<a name="line.1684"></a>
+<span class="sourceLineNo">1685</span>    final Put[] puts = new Put[10];<a name="line.1685"></a>
+<span class="sourceLineNo">1686</span>    MetricsWALSource source = CompatibilitySingletonFactory.getInstance(MetricsWALSource.class);<a name="line.1686"></a>
+<span class="sourceLineNo">1687</span><a name="line.1687"></a>
+<span class="sourceLineNo">1688</span>    long syncs = prepareRegionForBachPut(puts, source, true);<a name="line.1688"></a>
+<span class="sourceLineNo">1689</span><a name="line.1689"></a>
+<span class="sourceLineNo">1690</span>    OperationStatus[] codes = this.region.batchMutate(puts);<a name="line.1690"></a>
+<span class="sourceLineNo">1691</span>    assertEquals(10, codes.length);<a name="line.1691"></a>
+<span class="sourceLineNo">1692</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.1692"></a>
+<span class="sourceLineNo">1693</span>      assertEquals(OperationStatusCode.SANITY_CHECK_FAILURE, codes[i].getOperationStatusCode());<a name="line.1693"></a>
+<span class="sourceLineNo">1694</span>    }<a name="line.1694"></a>
+<span class="sourceLineNo">1695</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs, source);<a name="line.1695"></a>
+<span class="sourceLineNo">1696</span>  }<a name="line.1696"></a>
+<span class="sourceLineNo">1697</span><a name="line.1697"></a>
+<span class="sourceLineNo">1698</span>  /**<a name="line.1698"></a>
+<span class="sourceLineNo">1699</span>   * @return syncs initial syncTimeNumOps<a name="line.1699"></a>
+<span class="sourceLineNo">1700</span>   */<a name="line.1700"></a>
+<span class="sourceLineNo">1701</span>  private long prepareRegionForBachPut(final Put[] puts, final MetricsWALSource source,<a name="line.1701"></a>
+<span class="sourceLineNo">1702</span>      boolean slop) throws IOException {<a name="line.1702"></a>
+<span class="sourceLineNo">1703</span>    this.region = initHRegion(tableName, method, CONF, COLUMN_FAMILY_BYTES);<a name="line.1703"></a>
+<span class="sourceLineNo">1704</span><a name="line.1704"></a>
+<span class="sourceLineNo">1705</span>    LOG.info("First a batch put with all valid puts");<a name="line.1705"></a>
+<span class="sourceLineNo">1706</span>    for (int i = 0; i &lt; puts.length; i++) {<a name="line.1706"></a>
+<span class="sourceLineNo">1707</span>      puts[i] = slop ? new Put(Bytes.toBytes("row_" + i), Long.MAX_VALUE - 100) :<a name="line.1707"></a>
+<span class="sourceLineNo">1708</span>          new Put(Bytes.toBytes("row_" + i));<a name="line.1708"></a>
+<span class="sourceLineNo">1709</span>      puts[i].addColumn(COLUMN_FAMILY_BYTES, qual, value);<a name="line.1709"></a>
+<span class="sourceLineNo">1710</span>    }<a name="line.1710"></a>
+<span class="sourceLineNo">1711</span><a name="line.1711"></a>
+<span class="sourceLineNo">1712</span>    long syncs = metricsAssertHelper.getCounter("syncTimeNumOps", source);<a name="line.1712"></a>
+<span class="sourceLineNo">1713</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs, source);<a name="line.1713"></a>
+<span class="sourceLineNo">1714</span>    return syncs;<a name="line.1714"></a>
+<span class="sourceLineNo">1715</span>  }<a name="line.1715"></a>
+<span class="sourceLineNo">1716</span><a name="line.1716"></a>
+<span class="sourceLineNo">1717</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.1717"></a>
+<span class="sourceLineNo">1718</span>  // checkAndMutate tests<a name="line.1718"></a>
+<span class="sourceLineNo">1719</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.1719"></a>
+<span class="sourceLineNo">1720</span>  @Test<a name="line.1720"></a>
+<span class="sourceLineNo">1721</span>  public void testCheckAndMutate_WithEmptyRowValue() throws IOException {<a name="line.1721"></a>
+<span class="sourceLineNo">1722</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1722"></a>
+<span class="sourceLineNo">1723</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1723"></a>
+<span class="sourceLineNo">1724</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1724"></a>
+<span class="sourceLineNo">1725</span>    byte[] emptyVal = new byte[] {};<a name="line.1725"></a>
+<span class="sourceLineNo">1726</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1726"></a>
+<span class="sourceLineNo">1727</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.1727"></a>
+<span class="sourceLineNo">1728</span><a name="line.1728"></a>
+<span class="sourceLineNo">1729</span>    // Setting up region<a name="line.1729"></a>
+<span class="sourceLineNo">1730</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.1730"></a>
+<span class="sourceLineNo">1731</span>    // Putting empty data in key<a name="line.1731"></a>
+<span class="sourceLineNo">1732</span>    Put put = new Put(row1);<a name="line.1732"></a>
+<span class="sourceLineNo">1733</span>    put.addColumn(fam1, qf1, emptyVal);<a name="line.1733"></a>
+<span class="sourceLineNo">1734</span><a name="line.1734"></a>
+<span class="sourceLineNo">1735</span>    // checkAndPut with empty value<a name="line.1735"></a>
+<span class="sourceLineNo">1736</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1736"></a>
+<span class="sourceLineNo">1737</span>        new BinaryComparator(emptyVal), put);<a name="line.1737"></a>
+<span class="sourceLineNo">1738</span>    assertTrue(res);<a name="line.1738"></a>
+<span class="sourceLineNo">1739</span><a name="line.1739"></a>
+<span class="sourceLineNo">1740</span>    // Putting data in key<a name="line.1740"></a>
+<span class="sourceLineNo">1741</span>    put = new Put(row1);<a name="line.1741"></a>
+<span class="sourceLineNo">1742</span>    put.addColumn(fam1, qf1, val1);<a name="line.1742"></a>
+<span class="sourceLineNo">1743</span><a name="line.1743"></a>
+<span class="sourceLineNo">1744</span>    // checkAndPut with correct value<a name="line.1744"></a>
+<span class="sourceLineNo">1745</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1745"></a>
+<span class="sourceLineNo">1746</span>        new BinaryComparator(emptyVal), put);<a name="line.1746"></a>
+<span class="sourceLineNo">1747</span>    assertTrue(res);<a name="line.1747"></a>
+<span class="sourceLineNo">1748</span><a name="line.1748"></a>
+<span class="sourceLineNo">1749</span>    // not empty anymore<a name="line.1749"></a>
+<span class="sourceLineNo">1750</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1750"></a>
+<span class="sourceLineNo">1751</span>        new BinaryComparator(emptyVal), put);<a name="line.1751"></a>
+<span class="sourceLineNo">1752</span>    assertFalse(res);<a name="line.1752"></a>
+<span class="sourceLineNo">1753</span><a name="line.1753"></a>
+<span class="sourceLineNo">1754</span>    Delete delete = new Delete(row1);<a name="line.1754"></a>
+<span class="sourceLineNo">1755</span>    delete.addColumn(fam1, qf1);<a name="line.1755"></a>
+<span class="sourceLineNo">1756</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1756"></a>
+<span class="sourceLineNo">1757</span>        new BinaryComparator(emptyVal), delete);<a name="line.1757"></a>
+<span class="sourceLineNo">1758</span>    assertFalse(res);<a name="line.1758"></a>
+<span class="sourceLineNo">1759</span><a name="line.1759"></a>
+<span class="sourceLineNo">1760</span>    put = new Put(row1);<a name="line.1760"></a>
+<span class="sourceLineNo">1761</span>    put.addColumn(fam1, qf1, val2);<a name="line.1761"></a>
+<span class="sourceLineNo">1762</span>    // checkAndPut with correct value<a name="line.1762"></a>
+<span class="sourceLineNo">1763</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1763"></a>
+<span class="sourceLineNo">1764</span>        new BinaryComparator(val1), put);<a name="line.1764"></a>
+<span class="sourceLineNo">1765</span>    assertTrue(res);<a name="line.1765"></a>
+<span class="sourceLineNo">1766</span><a name="line.1766"></a>
+<span class="sourceLineNo">1767</span>    // checkAndDelete with correct value<a name="line.1767"></a>
+<span class="sourceLineNo">1768</span>    delete = new Delete(row1);<a name="line.1768"></a>
 <span class="sourceLineNo">1769</span>    delete.addColumn(fam1, qf1);<a name="line.1769"></a>
-<span class="sourceLineNo">1770</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1770"></a>
-<span class="sourceLineNo">1771</span>        new BinaryComparator(val2), delete);<a name="line.1771"></a>
-<span class="sourceLineNo">1772</span>    assertTrue(res);<a name="line.1772"></a>
-<span class="sourceLineNo">1773</span><a name="line.1773"></a>
-<span class="sourceLineNo">1774</span>    delete = new Delete(row1);<a name="line.1774"></a>
-<span class="sourceLineNo">1775</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1775"></a>
-<span class="sourceLineNo">1776</span>        new BinaryComparator(emptyVal), delete);<a name="line.1776"></a>
-<span class="sourceLineNo">1777</span>    assertTrue(res);<a name="line.1777"></a>
-<span class="sourceLineNo">1778</span><a name="line.1778"></a>
-<span class="sourceLineNo">1779</span>    // checkAndPut looking for a null value<a name="line.1779"></a>
-<span class="sourceLineNo">1780</span>    put = new Put(row1);<a name="line.1780"></a>
-<span class="sourceLineNo">1781</span>    put.addColumn(fam1, qf1, val1);<a name="line.1781"></a>
-<span class="sourceLineNo">1782</span><a name="line.1782"></a>
-<span class="sourceLineNo">1783</span>    res = region<a name="line.1783"></a>
-<span class="sourceLineNo">1784</span>        .checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new NullComparator(), put);<a name="line.1784"></a>
-<span class="sourceLineNo">1785</span>    assertTrue(res);<a name="line.1785"></a>
-<span class="sourceLineNo">1786</span>  }<a name="line.1786"></a>
-<span class="sourceLineNo">1787</span><a name="line.1787"></a>
-<span class="sourceLineNo">1788</span>  @Test<a name="line.1788"></a>
-<span class="sourceLineNo">1789</span>  public void testCheckAndMutate_WithWrongValue() throws IOException {<a name="line.1789"></a>
-<span class="sourceLineNo">1790</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1790"></a>
-<span class="sourceLineNo">1791</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1791"></a>
-<span class="sourceLineNo">1792</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1792"></a>
-<span class="sourceLineNo">1793</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1793"></a>
-<span class="sourceLineNo">1794</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.1794"></a>
-<span class="sourceLineNo">1795</span>    BigDecimal bd1 = new BigDecimal(Double.MAX_VALUE);<a name="line.1795"></a>
-<span class="sourceLineNo">1796</span>    BigDecimal bd2 = new BigDecimal(Double.MIN_VALUE);<a name="line.1796"></a>
-<span class="sourceLineNo">1797</span><a name="line.1797"></a>
-<span class="sourceLineNo">1798</span>    // Setting up region<a name="line.1798"></a>
-<span class="sourceLineNo">1799</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.1799"></a>
-<span class="sourceLineNo">1800</span>    // Putting data in key<a name="line.1800"></a>
-<span class="sourceLineNo">1801</span>    Put put = new Put(row1);<a name="line.1801"></a>
-<span class="sourceLineNo">1802</span>    put.addColumn(fam1, qf1, val1);<a name="line.1802"></a>
-<span class="sourceLineNo">1803</span>    region.put(put);<a name="line.1803"></a>
-<span class="sourceLineNo">1804</span><a name="line.1804"></a>
-<span class="sourceLineNo">1805</span>    // checkAndPut with wrong value<a name="line.1805"></a>
-<span class="sourceLineNo">1806</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1806"></a>
-<span class="sourceLineNo">1807</span>        new BinaryComparator(val2), put);<a name="line.1807"></a>
-<span class="sourceLineNo">1808</span>    assertEquals(false, res);<a name="line.1808"></a>
-<span class="sourceLineNo">1809</span><a name="line.1809"></a>
-<span class="sourceLineNo">1810</span>    // checkAndDelete with wrong value<a name="line.1810"></a>
-<span class="sourceLineNo">1811</span>    Delete delete = new Delete(row1);<a name="line.1811"></a>
-<span class="sourceLineNo">1812</span>    delete.addFamily(fam1);<a name="line.1812"></a>
-<span class="sourceLineNo">1813</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1813"></a>
-<span class="sourceLineNo">1814</span>        new BinaryComparator(val2), put);<a name="line.1814"></a>
-<span class="sourceLineNo">1815</span>    assertEquals(false, res);<a name="line.1815"></a>
-<span class="sourceLineNo">1816</span><a name="line.1816"></a>
-<span class="sourceLineNo">1817</span>    // Putting data in key<a name="line.1817"></a>
-<span class="sourceLineNo">1818</span>    put = new Put(row1);<a name="line.1818"></a>
-<span class="sourceLineNo">1819</span>    put.addColumn(fam1, qf1, Bytes.toBytes(bd1));<a name="line.1819"></a>
-<span class="sourceLineNo">1820</span>    region.put(put);<a name="line.1820"></a>
-<span class="sourceLineNo">1821</span><a name="line.1821"></a>
-<span class="sourceLineNo">1822</span>    // checkAndPut with wrong value<a name="line.1822"></a>
-<span class="sourceLineNo">1823</span>    res =<a name="line.1823"></a>
-<span class="sourceLineNo">1824</span>        region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1824"></a>
-<span class="sourceLineNo">1825</span>            new BigDecimalComparator(bd2), put);<a name="line.1825"></a>
-<span class="sourceLineNo">1826</span>    assertEquals(false, res);<a name="line.1826"></a>
-<span class="sourceLineNo">1827</span><a name="line.1827"></a>
-<span class="sourceLineNo">1828</span>    // checkAndDelete with wrong value<a name="line.1828"></a>
-<span class="sourceLineNo">1829</span>    delete = new Delete(row1);<a name="line.1829"></a>
-<span class="sourceLineNo">1830</span>    delete.addFamily(fam1);<a name="line.1830"></a>
-<span class="sourceLineNo">1831</span>    res =<a name="line.1831"></a>
-<span class="sourceLineNo">1832</span>        region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1832"></a>
-<span class="sourceLineNo">1833</span>            new BigDecimalComparator(bd2), put);<a name="line.1833"></a>
-<span class="sourceLineNo">1834</span>    assertEquals(false, res);<a name="line.1834"></a>
-<span class="sourceLineNo">1835</span>  }<a name="line.1835"></a>
-<span class="sourceLineNo">1836</span><a name="line.1836"></a>
-<span class="sourceLineNo">1837</span>  @Test<a name="line.1837"></a>
-<span class="sourceLineNo">1838</span>  public void testCheckAndMutate_WithCorrectValue() throws IOException {<a name="line.1838"></a>
-<span class="sourceLineNo">1839</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1839"></a>
-<span class="sourceLineNo">1840</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1840"></a>
-<span class="sourceLineNo">1841</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1841"></a>
-<span class="sourceLineNo">1842</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1842"></a>
-<span class="sourceLineNo">1843</span>    BigDecimal bd1 = new BigDecimal(Double.MIN_VALUE);<a name="line.1843"></a>
-<span class="sourceLineNo">1844</span><a name="line.1844"></a>
-<span class="sourceLineNo">1845</span>    // Setting up region<a name="line.1845"></a>
-<span class="sourceLineNo">1846</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.1846"></a>
-<span class="sourceLineNo">1847</span>    // Putting data in key<a name="line.1847"></a>
-<span class="sourceLineNo">1848</span>    Put put = new Put(row1);<a name="line.1848"></a>
-<span class="sourceLineNo">1849</span>    put.addColumn(fam1, qf1, val1);<a name="line.1849"></a>
-<span class="sourceLineNo">1850</span>    region.put(put);<a name="line.1850"></a>
-<span class="sourceLineNo">1851</span><a name="line.1851"></a>
-<span class="sourceLineNo">1852</span>    // checkAndPut with correct value<a name="line.1852"></a>
-<span class="sourceLineNo">1853</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1853"></a>
-<span class="sourceLineNo">1854</span>        new BinaryComparator(val1), put);<a name="line.1854"></a>
-<span class="sourceLineNo">1855</span>    assertEquals(true, res);<a name="line.1855"></a>
-<span class="sourceLineNo">1856</span><a name="line.1856"></a>
-<span class="sourceLineNo">1857</span>    // checkAndDelete with correct value<a name="line.1857"></a>
-<span class="sourceLineNo">1858</span>    Delete delete = new Delete(row1);<a name="line.1858"></a>
-<span class="sourceLineNo">1859</span>    delete.addColumn(fam1, qf1);<a name="line.1859"></a>
-<span class="sourceLineNo">1860</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new BinaryComparator(val1),<a name="line.1860"></a>
-<span class="sourceLineNo">1861</span>        delete);<a name="line.1861"></a>
-<span class="sourceLineNo">1862</span>    assertEquals(true, res);<a name="line.1862"></a>
-<span class="sourceLineNo">1863</span><a name="line.1863"></a>
-<span class="sourceLineNo">1864</span>    // Putting data in key<a name="line.1864"></a>
-<span class="sourceLineNo">1865</span>    put = new Put(row1);<a name="line.1865"></a>
-<span class="sourceLineNo">1866</span>    put.addColumn(fam1, qf1, Bytes.toBytes(bd1));<a name="line.1866"></a>
-<span class="sourceLineNo">1867</span>    region.put(put);<a name="line.1867"></a>
-<span class="sourceLineNo">1868</span><a name="line.1868"></a>
-<span class="sourceLineNo">1869</span>    // checkAndPut with correct value<a name="line.1869"></a>
-<span class="sourceLineNo">1870</span>    res =<a name="line.1870"></a>
-<span class="sourceLineNo">1871</span>        region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new BigDecimalComparator(<a name="line.1871"></a>
-<span class="sourceLineNo">1872</span>            bd1), put);<a name="line.1872"></a>
-<span class="sourceLineNo">1873</span>    assertEquals(true, res);<a name="line.1873"></a>
-<span class="sourceLineNo">1874</span><a name="line.1874"></a>
-<span class="sourceLineNo">1875</span>    // checkAndDelete with correct value<a name="line.1875"></a>
-<span class="sourceLineNo">1876</span>    delete = new Delete(row1);<a name="line.1876"></a>
-<span class="sourceLineNo">1877</span>    delete.addColumn(fam1, qf1);<a name="line.1877"></a>
-<span class="sourceLineNo">1878</span>    res =<a name="line.1878"></a>
-<span class="sourceLineNo">1879</span>        region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new BigDecimalComparator(<a name="line.1879"></a>
-<span class="sourceLineNo">1880</span>            bd1), delete);<a name="line.1880"></a>
-<span class="sourceLineNo">1881</span>    assertEquals(true, res);<a name="line.1881"></a>
-<span class="sourceLineNo">1882</span>  }<a name="line.1882"></a>
-<span class="sourceLineNo">1883</span><a name="line.1883"></a>
-<span class="sourceLineNo">1884</span>  @Test<a name="line.1884"></a>
-<span class="sourceLineNo">1885</span>  public void testCheckAndMutate_WithNonEqualCompareOp() throws IOException {<a name="line.1885"></a>
-<span class="sourceLineNo">1886</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1886"></a>
-<span class="sourceLineNo">1887</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1887"></a>
-<span class="sourceLineNo">1888</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1888"></a>
-<span class="sourceLineNo">1889</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1889"></a>
-<span class="sourceLineNo">1890</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.1890"></a>
-<span class="sourceLineNo">1891</span>    byte[] val3 = Bytes.toBytes("value3");<a name="line.1891"></a>
-<span class="sourceLineNo">1892</span>    byte[] val4 = Bytes.toBytes("value4");<a name="line.1892"></a>
-<span class="sourceLineNo">1893</span><a name="line.1893"></a>
-<span class="sourceLineNo">1894</span>    // Setting up region<a name="line.1894"></a>
-<span class="sourceLineNo">1895</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.1895"></a>
-<span class="sourceLineNo">1896</span>    // Putting val3 in key<a name="line.1896"></a>
-<span class="sourceLineNo">1897</span>    Put put = new Put(row1);<a name="line.1897"></a>
-<span class="sourceLineNo">1898</span>    put.addColumn(fam1, qf1, val3);<a name="line.1898"></a>
-<span class="sourceLineNo">1899</span>    region.put(put);<a name="line.1899"></a>
-<span class="sourceLineNo">1900</span><a name="line.1900"></a>
-<span class="sourceLineNo">1901</span>    // Test CompareOp.LESS: original = val3, compare with val3, fail<a name="line.1901"></a>
-<span class="sourceLineNo">1902</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS,<a name="line.1902"></a>
-<span class="sourceLineNo">1903</span>        new BinaryComparator(val3), put);<a name="line.1903"></a>
-<span class="sourceLineNo">1904</span>    assertEquals(false, res);<a name="line.1904"></a>
-<span class="sourceLineNo">1905</span><a name="line.1905"></a>
-<span class="sourceLineNo">1906</span>    // Test CompareOp.LESS: original = val3, compare with val4, fail<a name="line.1906"></a>
-<span class="sourceLineNo">1907</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS,<a name="line.1907"></a>
-<span class="sourceLineNo">1908</span>        new BinaryComparator(val4), put);<a name="line.1908"></a>
-<span class="sourceLineNo">1909</span>    assertEquals(false, res);<a name="line.1909"></a>
-<span class="sourceLineNo">1910</span><a name="line.1910"></a>
-<span class="sourceLineNo">1911</span>    // Test CompareOp.LESS: original = val3, compare with val2,<a name="line.1911"></a>
-<span class="sourceLineNo">1912</span>    // succeed (now value = val2)<a name="line.1912"></a>
-<span class="sourceLineNo">1913</span>    put = new Put(row1);<a name="line.1913"></a>
-<span class="sourceLineNo">1914</span>    put.addColumn(fam1, qf1, val2);<a name="line.1914"></a>
-<span class="sourceLineNo">1915</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS,<a name="line.1915"></a>
-<span class="sourceLineNo">1916</span>        new BinaryComparator(val2), put);<a name="line.1916"></a>
-<span class="sourceLineNo">1917</span>    assertEquals(true, res);<a name="line.1917"></a>
-<span class="sourceLineNo">1918</span><a name="line.1918"></a>
-<span class="sourceLineNo">1919</span>    // Test CompareOp.LESS_OR_EQUAL: original = val2, compare with val3, fail<a name="line.1919"></a>
-<span class="sourceLineNo">1920</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS_OR_EQUAL,<a name="line.1920"></a>
-<span class="sourceLineNo">1921</span>        new BinaryComparator(val3), put);<a name="line.1921"></a>
-<span class="sourceLineNo">1922</span>    assertEquals(false, res);<a name="line.1922"></a>
-<span class="sourceLineNo">1923</span><a name="line.1923"></a>
-<span class="sourceLineNo">1924</span>    // Test CompareOp.LESS_OR_EQUAL: original = val2, compare with val2,<a name="line.1924"></a>
-<span class="sourceLineNo">1925</span>    // succeed (value still = val2)<a name="line.1925"></a>
-<span class="sourceLineNo">1926</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS_OR_EQUAL,<a name="line.1926"></a>
-<span class="sourceLineNo">1927</span>        new BinaryComparator(val2), put);<a name="line.1927"></a>
-<span class="sourceLineNo">1928</span>    assertEquals(true, res);<a name="line.1928"></a>
-<span class="sourceLineNo">1929</span><a name="line.1929"></a>
-<span class="sourceLineNo">1930</span>    // Test CompareOp.LESS_OR_EQUAL: original = val2, compare with val1,<a name="line.1930"></a>
-<span class="sourceLineNo">1931</span>    // succeed (now value = val3)<a name="line.1931"></a>
-<span class="sourceLineNo">1932</span>    put = new Put(row1);<a name="line.1932"></a>
-<span class="sourceLineNo">1933</span>    put.addColumn(fam1, qf1, val3);<a name="line.1933"></a>
-<span class="sourceLineNo">1934</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS_OR_EQUAL,<a name="line.1934"></a>
-<span class="sourceLineNo">1935</span>        new BinaryComparator(val1), put);<a name="line.1935"></a>
-<span class="sourceLineNo">1936</span>    assertEquals(true, res);<a name="line.1936"></a>
-<span class="sourceLineNo">1937</span><a name="line.1937"></a>
-<span class="sourceLineNo">1938</span>    // Test CompareOp.GREATER: original = val3, compare with val3, fail<a name="line.1938"></a>
-<span class="sourceLineNo">1939</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER,<a name="line.1939"></a>
-<span class="sourceLineNo">1940</span>        new BinaryComparator(val3), put);<a name="line.1940"></a>
-<span class="sourceLineNo">1941</span>    assertEquals(false, res);<a name="line.1941"></a>
-<span class="sourceLineNo">1942</span><a name="line.1942"></a>
-<span class="sourceLineNo">1943</span>    // Test CompareOp.GREATER: original = val3, compare with val2, fail<a name="line.1943"></a>
-<span class="sourceLineNo">1944</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER,<a name="line.1944"></a>
-<span class="sourceLineNo">1945</span>        new BinaryComparator(val2), put);<a name="line.1945"></a>
-<span class="sourceLineNo">1946</span>    assertEquals(false, res);<a name="line.1946"></a>
-<span class="sourceLineNo">1947</span><a name="line.1947"></a>
-<span class="sourceLineNo">1948</span>    // Test CompareOp.GREATER: original = val3, compare with val4,<a name="line.1948"></a>
-<span class="sourceLineNo">1949</span>    // succeed (now value = val2)<a name="line.1949"></a>
-<span class="sourceLineNo">1950</span>    put = new Put(row1);<a name="line.1950"></a>
-<span class="sourceLineNo">1951</span>    put.addColumn(fam1, qf1, val2);<a name="line.1951"></a>
-<span class="sourceLineNo">1952</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER,<a name="line.1952"></a>
-<span class="sourceLineNo">1953</span>        new BinaryComparator(val4), put);<a name="line.1953"></a>
-<span class="sourceLineNo">1954</span>    assertEquals(true, res);<a name="line.1954"></a>
-<span class="sourceLineNo">1955</span><a name="line.1955"></a>
-<span class="sourceLineNo">1956</span>    // Test CompareOp.GREATER_OR_EQUAL: original = val2, compare with val1, fail<a name="line.1956"></a>
-<span class="sourceLineNo">1957</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER_OR_EQUAL,<a name="line.1957"></a>
-<span class="sourceLineNo">1958</span>        new BinaryComparator(val1), put);<a name="line.1958"></a>
-<span class="sourceLineNo">1959</span>    assertEquals(false, res);<a name="line.1959"></a>
-<span class="sourceLineNo">1960</span><a name="line.1960"></a>
-<span class="sourceLineNo">1961</span>    // Test CompareOp.GREATER_OR_EQUAL: original = val2, compare with val2,<a name="line.1961"></a>
-<span class="sourceLineNo">1962</span>    // succeed (value still = val2)<a name="line.1962"></a>
-<span class="sourceLineNo">1963</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER_OR_EQUAL,<a name="line.1963"></a>
-<span class="sourceLineNo">1964</span>        new BinaryComparator(val2), put);<a name="line.1964"></a>
-<span class="sourceLineNo">1965</span>    assertEquals(true, res);<a name="line.1965"></a>
-<span class="sourceLineNo">1966</span><a name="line.1966"></a>
-<span class="sourceLineNo">1967</span>    // Test CompareOp.GREATER_OR_EQUAL: original = val2, compare with val3, succeed<a name="line.1967"></a>
-<span class="sourceLineNo">1968</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER_OR_EQUAL,<a name="line.1968"></a>
-<span class="sourceLineNo">1969</span>        new BinaryComparator(val3), put);<a name="line.1969"></a>
-<span class="sourceLineNo">1970</span>    assertEquals(true, res);<a name="line.1970"></a>
-<span class="sourceLineNo">1971</span>  }<a name="line.1971"></a>
-<span class="sourceLineNo">1972</span><a name="line.1972"></a>
-<span class="sourceLineNo">1973</span>  @Test<a name="line.1973"></a>
-<span class="sourceLineNo">1974</span>  public void testCheckAndPut_ThatPutWasWritten() throws IOException {<a name="line.1974"></a>
-<span class="sourceLineNo">1975</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1975"></a>
-<span class="sourceLineNo">1976</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1976"></a>
-<span class="sourceLineNo">1977</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.1977"></a>
-<span class="sourceLineNo">1978</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1978"></a>
-<span class="sourceLineNo">1979</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1979"></a>
-<span class="sourceLineNo">1980</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.1980"></a>
-<span class="sourceLineNo">1981</span><a name="line.1981"></a>
-<span class="sourceLineNo">1982</span>    byte[][] families = { fam1, fam2 };<a name="line.1982"></a>
-<span class="sourceLineNo">1983</span><a name="line.1983"></a>
-<span class="sourceLineNo">1984</span>    // Setting up region<a name="line.1984"></a>
-<span class="sourceLineNo">1985</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.1985"></a>
-<span class="sourceLineNo">1986</span>    // Putting data in the key to check<a name="line.1986"></a>
-<span class="sourceLineNo">1987</span>    Put put = new Put(row1);<a name="line.1987"></a>
-<span class="sourceLineNo">1988</span>    put.addColumn(fam1, qf1, val1);<a name="line.1988"></a>
-<span class="sourceLineNo">1989</span>    region.put(put);<a name="line.1989"></a>
-<span class="sourceLineNo">1990</span><a name="line.1990"></a>
-<span class="sourceLineNo">1991</span>    // Creating put to add<a name="line.1991"></a>
-<span class="sourceLineNo">1992</span>    long ts = System.currentTimeMillis();<a name="line.1992"></a>
-<span class="sourceLineNo">1993</span>    KeyValue kv = new KeyValue(row1, fam2, qf1, ts, KeyValue.Type.Put, val2);<a name="line.1993"></a>
-<span class="sourceLineNo">1994</span>    put = new Put(row1);<a name="line.1994"></a>
-<span class="sourceLineNo">1995</span>    put.add(kv);<a name="line.1995"></a>
-<span class="sourceLineNo">1996</span><a name="line.1996"></a>
-<span class="sourceLineNo">1997</span>    // checkAndPut with wrong value<a name="line.1997"></a>
-<span class="sourceLineNo">1998</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1998"></a>
-<span class="sourceLineNo">1999</span>        new BinaryComparator(val1), put);<a name="line.1999"></a>
-<span class="sourceLineNo">2000</span>    assertEquals(true, res);<a name="line.2000"></a>
-<span class="sourceLineNo">2001</span><a name="line.2001"></a>
-<span class="sourceLineNo">2002</span>    Get get = new Get(row1);<a name="line.2002"></a>
-<span class="sourceLineNo">2003</span>    get.addColumn(fam2, qf1);<a name="line.2003"></a>
-<span class="sourceLineNo">2004</span>    Cell[] actual = region.get(get).rawCells();<a name="line.2004"></a>
-<span class="sourceLineNo">2005</span><a name="line.2005"></a>
-<span class="sourceLineNo">2006</span>    Cell[] expected = { kv };<a name="line.2006"></a>
-<span class="sourceLineNo">2007</span><a name="line.2007"></a>
-<span class="sourceLineNo">2008</span>    assertEquals(expected.length, actual.length);<a name="line.2008"></a>
-<span class="sourceLineNo">2009</span>    for (int i = 0; i &lt; actual.length; i++) {<a name="line.2009"></a>
-<span class="sourceLineNo">2010</span>      assertEquals(expected[i], actual[i]);<a name="line.2010"></a>
-<span class="sourceLineNo">2011</span>    }<a name="line.2011"></a>
-<span class="sourceLineNo">2012</span>  }<a name="line.2012"></a>
-<span class="sourceLineNo">2013</span><a name="line.2013"></a>
-<span class="sourceLineNo">2014</span>  @Test<a name="line.2014"></a>
-<span class="sourceLineNo">2015</span>  public void testCheckAndPut_wrongRowInPut() throws IOException {<a name="line.2015"></a>
-<span class="sourceLineNo">2016</span>    this.region = initHRegion(tableName, method, CONF, COLUMNS);<a name="line.2016"></a>
-<span class="sourceLineNo">2017</span>    Put put = new Put(row2);<a name="line.2017"></a>
-<span class="sourceLineNo">2018</span>    put.addColumn(fam1, qual1, value1);<a name="line.2018"></a>
-<span class="sourceLineNo">2019</span>    try {<a name="line.2019"></a>
-<span class="sourceLineNo">2020</span>      region.checkAndMutate(row, fam1, qual1, CompareOperator.EQUAL,<a name="line.2020"></a>
-<span class="sourceLineNo">2021</span>          new BinaryComparator(value2), put);<a name="line.2021"></a>
-<span class="sourceLineNo">2022</span>      fail();<a name="line.2022"></a>
-<span class="sourceLineNo">2023</span>    } catch (org.apache.hadoop.hbase.DoNotRetryIOException expected) {<a name="line.2023"></a>
-<span class="sourceLineNo">2024</span>      // expected exception.<a name="line.2024"></a>
-<span class="sourceLineNo">2025</span>    }<a name="line.2025"></a>
-<span class="sourceLineNo">2026</span>  }<a name="line.2026"></a>
-<span class="sourceLineNo">2027</span><a name="line.2027"></a>
-<span class="sourceLineNo">2028</span>  @Test<a name="line.2028"></a>
-<span class="sourceLineNo">2029</span>  public void testCheckAndDelete_ThatDeleteWasWritten() throws IOException {<a name="line.2029"></a>
-<span class="sourceLineNo">2030</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2030"></a>
-<span class="sourceLineNo">2031</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2031"></a>
-<span class="sourceLineNo">2032</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2032"></a>
-<span class="sourceLineNo">2033</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.2033"></a>
-<span class="sourceLineNo">2034</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.2034"></a>
-<span class="sourceLineNo">2035</span>    byte[] qf3 = Bytes.toBytes("qualifier3");<a name="line.2035"></a>
-<span class="sourceLineNo">2036</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.2036"></a>
-<span class="sourceLineNo">2037</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.2037"></a>
-<span class="sourceLineNo">2038</span>    byte[] val3 = Bytes.toBytes("value3");<a name="line.2038"></a>
-<span class="sourceLineNo">2039</span>    byte[] emptyVal = new byte[] {};<a name="line.2039"></a>
-<span class="sourceLineNo">2040</span><a name="line.2040"></a>
-<span class="sourceLineNo">2041</span>    byte[][] families = { fam1, fam2 };<a name="line.2041"></a>
-<span class="sourceLineNo">2042</span><a name="line.2042"></a>
-<span class="sourceLineNo">2043</span>    // Setting up region<a name="line.2043"></a>
-<span class="sourceLineNo">2044</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2044"></a>
-<span class="sourceLineNo">2045</span>    // Put content<a name="line.2045"></a>
-<span class="sourceLineNo">2046</span>    Put put = new Put(row1);<a name="line.2046"></a>
-<span class="sourceLineNo">2047</span>    put.addColumn(fam1, qf1, val1);<a name="line.2047"></a>
-<span class="sourceLineNo">2048</span>    region.put(put);<a name="line.2048"></a>
-<span class="sourceLineNo">2049</span>    Threads.sleep(2);<a name="line.2049"></a>
-<span class="sourceLineNo">2050</span><a name="line.2050"></a>
-<span class="sourceLineNo">2051</span>    put = new Put(row1);<a name="line.2051"></a>
-<span class="sourceLineNo">2052</span>    put.addColumn(fam1, qf1, val2);<a name="line.2052"></a>
-<span class="sourceLineNo">2053</span>    put.addColumn(fam2, qf1, val3);<a name="line.2053"></a>
-<span class="sourceLineNo">2054</span>    put.addColumn(fam2, qf2, val2);<a name="line.2054"></a>
-<span class="sourceLineNo">2055</span>    put.addColumn(fam2, qf3, val1);<a name="line.2055"></a>
-<span class="sourceLineNo">2056</span>    put.addColumn(fam1, qf3, val1);<a name="line.2056"></a>
-<span class="sourceLineNo">2057</span>    region.put(put);<a name="line.2057"></a>
-<span class="sourceLineNo">2058</span><a name="line.2058"></a>
-<span class="sourceLineNo">2059</span>    // Multi-column delete<a name="line.2059"></a>
-<span class="sourceLineNo">2060</span>    Delete delete = new Delete(row1);<a name="line.2060"></a>
-<span class="sourceLineNo">2061</span>    delete.addColumn(fam1, qf1);<a name="line.2061"></a>
-<span class="sourceLineNo">2062</span>    delete.addColumn(fam2, qf1);<a name="line.2062"></a>
-<span class="sourceLineNo">2063</span>    delete.addColumn(fam1, qf3);<a name="line.2063"></a>
-<span class="sourceLineNo">2064</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.2064"></a>
-<span class="sourceLineNo">2065</span>        new BinaryComparator(val2), delete);<a name="line.2065"></a>
-<span class="sourceLineNo">2066</span>    assertEquals(true, res);<a name="line.2066"></a>
-<span class="sourceLineNo">2067</span><a name="line.2067"></a>
-<span class="sourceLineNo">2068</span>    Get get = new Get(row1);<a name="line.2068"></a>
-<span class="sourceLineNo">2069</span>    get.addColumn(fam1, qf1);<a name="line.2069"></a>
-<span class="sourceLineNo">2070</span>    get.addColumn(fam1, qf3);<a name="line.2070"></a>
-<span class="sourceLineNo">2071</span>    get.addColumn(fam2, qf2);<a name="line.2071"></a>
-<span class="sourceLineNo">2072</span>    Result r = region.get(get);<a name="line.2072"></a>
-<span class="sourceLineNo">2073</span>    assertEquals(2, r.size());<a name="line.2073"></a>
-<span class="sourceLineNo">2074</span>    assertArrayEquals(val1, r.getValue(fam1, qf1));<a name="line.2074"></a>
-<span class="sourceLineNo">2075</span>    assertArrayEquals(val2, r.getValue(fam2, qf2));<a name="line.2075"></a>
-<span class="sourceLineNo">2076</span><a name="line.2076"></a>
-<span class="sourceLineNo">2077</span>    // Family delete<a name="line.2077"></a>
-<span class="sourceLineNo">2078</span>    delete = new Delete(row1);<a name="line.2078"></a>
-<span class="sourceLineNo">2079</span>    delete.addFamily(fam2);<a name="line.2079"></a>
-<span class="sourceLineNo">2080</span>    res = region.checkAndMutate(row1, fam2, qf1, CompareOperator.EQUAL,<a name="line.2080"></a>
-<span class="sourceLineNo">2081</span>        new BinaryComparator(emptyVal), delete);<a name="line.2081"></a>
-<span class="sourceLineNo">2082</span>    assertEquals(true, res);<a name="line.2082"></a>
-<span class="sourceLineNo">2083</span><a name="line.2083"></a>
-<span class="sourceLineNo">2084</span>    get = new Get(row1);<a name="line.2084"></a>
-<span class="sourceLineNo">2085</span>    r = region.get(get);<a name="line.2085"></a>
-<span class="sourceLineNo">2086</span>    assertEquals(1, r.size());<a name="line.2086"></a>
-<span class="sourceLineNo">2087</span>    assertArrayEquals(val1, r.getValue(fam1, qf1));<a name="line.2087"></a>
-<span class="sourceLineNo">2088</span><a name="line.2088"></a>
-<span class="sourceLineNo">2089</span>    // Row delete<a name="line.2089"></a>
-<span class="sourceLineNo">2090</span>    delete = new Delete(row1);<a name="line.2090"></a>
-<span class="sourceLineNo">2091</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new BinaryComparator(val1),<a name="line.2091"></a>
-<span class="sourceLineNo">2092</span>        delete);<a name="line.2092"></a>
-<span class="sourceLineNo">2093</span>    assertEquals(true, res);<a name="line.2093"></a>
-<span class="sourceLineNo">2094</span>    get = new Get(row1);<a name="line.2094"></a>
-<span class="sourceLineNo">2095</span>    r = region.get(get);<a name="line.2095"></a>
-<span class="sourceLineNo">2096</span>    assertEquals(0, r.size());<a name="line.2096"></a>
-<span class="sourceLineNo">2097</span>  }<a name="line.2097"></a>
-<span class="sourceLineNo">2098</span><a name="line.2098"></a>
-<span class="sourceLineNo">2099</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2099"></a>
-<span class="sourceLineNo">2100</span>  // Delete tests<a name="line.2100"></a>
-<span class="sourceLineNo">2101</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2101"></a>
-<span class="sourceLineNo">2102</span>  @Test<a name="line.2102"></a>
-<span class="sourceLineNo">2103</span>  public void testDelete_multiDeleteColumn() throws IOException {<a name="line.2103"></a>
-<span class="sourceLineNo">2104</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2104"></a>
-<span class="sourceLineNo">2105</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2105"></a>
-<span class="sourceLineNo">2106</span>    byte[] qual = Bytes.toBytes("qualifier");<a name="line.2106"></a>
-<span class="sourceLineNo">2107</span>    byte[] value = Bytes.toBytes("value");<a name="line.2107"></a>
-<span class="sourceLineNo">2108</span><a name="line.2108"></a>
-<span class="sourceLineNo">2109</span>    Put put = new Put(row1);<a name="line.2109"></a>
-<span class="sourceLineNo">2110</span>    put.addColumn(fam1, qual, 1, value);<a name="line.2110"></a>
-<span class="sourceLineNo">2111</span>    put.addColumn(fam1, qual, 2, value);<a name="line.2111"></a>
-<span class="sourceLineNo">2112</span><a name="line.2112"></a>
-<span class="sourceLineNo">2113</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2113"></a>
-<span class="sourceLineNo">2114</span>    region.put(put);<a name="line.2114"></a>
-<span class="sourceLineNo">2115</span><a name="line.2115"></a>
-<span class="sourceLineNo">2116</span>    // We do support deleting more than 1 'latest' version<a name="line.2116"></a>
-<span class="sourceLineNo">2117</span>    Delete delete = new Delete(row1);<a name="line.2117"></a>
-<span class="sourceLineNo">2118</span>    delete.addColumn(fam1, qual);<a name="line.2118"></a>
+<span class="sourceLineNo">1770</span>    delete.addColumn(fam1, qf1);<a name="line.1770"></a>
+<span class="sourceLineNo">1771</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1771"></a>
+<span class="sourceLineNo">1772</span>        new BinaryComparator(val2), delete);<a name="line.1772"></a>
+<span class="sourceLineNo">1773</span>    assertTrue(res);<a name="line.1773"></a>
+<span class="sourceLineNo">1774</span><a name="line.1774"></a>
+<span class="sourceLineNo">1775</span>    delete = new Delete(row1);<a name="line.1775"></a>
+<span class="sourceLineNo">1776</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1776"></a>
+<span class="sourceLineNo">1777</span>        new BinaryComparator(emptyVal), delete);<a name="line.1777"></a>
+<span class="sourceLineNo">1778</span>    assertTrue(res);<a name="line.1778"></a>
+<span class="sourceLineNo">1779</span><a name="line.1779"></a>
+<span class="sourceLineNo">1780</span>    // checkAndPut looking for a null value<a name="line.1780"></a>
+<span class="sourceLineNo">1781</span>    put = new Put(row1);<a name="line.1781"></a>
+<span class="sourceLineNo">1782</span>    put.addColumn(fam1, qf1, val1);<a name="line.1782"></a>
+<span class="sourceLineNo">1783</span><a name="line.1783"></a>
+<span class="sourceLineNo">1784</span>    res = region<a name="line.1784"></a>
+<span class="sourceLineNo">1785</span>        .checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new NullComparator(), put);<a name="line.1785"></a>
+<span class="sourceLineNo">1786</span>    assertTrue(res);<a name="line.1786"></a>
+<span class="sourceLineNo">1787</span>  }<a name="line.1787"></a>
+<span class="sourceLineNo">1788</span><a name="line.1788"></a>
+<span class="sourceLineNo">1789</span>  @Test<a name="line.1789"></a>
+<span class="sourceLineNo">1790</span>  public void testCheckAndMutate_WithWrongValue() throws IOException {<a name="line.1790"></a>
+<span class="sourceLineNo">1791</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1791"></a>
+<span class="sourceLineNo">1792</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1792"></a>
+<span class="sourceLineNo">1793</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1793"></a>
+<span class="sourceLineNo">1794</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1794"></a>
+<span class="sourceLineNo">1795</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.1795"></a>
+<span class="sourceLineNo">1796</span>    BigDecimal bd1 = new BigDecimal(Double.MAX_VALUE);<a name="line.1796"></a>
+<span class="sourceLineNo">1797</span>    BigDecimal bd2 = new BigDecimal(Double.MIN_VALUE);<a name="line.1797"></a>
+<span class="sourceLineNo">1798</span><a name="line.1798"></a>
+<span class="sourceLineNo">1799</span>    // Setting up region<a name="line.1799"></a>
+<span class="sourceLineNo">1800</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.1800"></a>
+<span class="sourceLineNo">1801</span>    // Putting data in key<a name="line.1801"></a>
+<span class="sourceLineNo">1802</span>    Put put = new Put(row1);<a name="line.1802"></a>
+<span class="sourceLineNo">1803</span>    put.addColumn(fam1, qf1, val1);<a name="line.1803"></a>
+<span class="sourceLineNo">1804</span>    region.put(put);<a name="line.1804"></a>
+<span class="sourceLineNo">1805</span><a name="line.1805"></a>
+<span class="sourceLineNo">1806</span>    // checkAndPut with wrong value<a name="line.1806"></a>
+<span class="sourceLineNo">1807</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1807"></a>
+<span class="sourceLineNo">1808</span>        new BinaryComparator(val2), put);<a name="line.1808"></a>
+<span class="sourceLineNo">1809</span>    assertEquals(false, res);<a name="line.1809"></a>
+<span class="sourceLineNo">1810</span><a name="line.1810"></a>
+<span class="sourceLineNo">1811</span>    // checkAndDelete with wrong value<a name="line.1811"></a>
+<span class="sourceLineNo">1812</span>    Delete delete = new Delete(row1);<a name="line.1812"></a>
+<span class="sourceLineNo">1813</span>    delete.addFamily(fam1);<a name="line.1813"></a>
+<span class="sourceLineNo">1814</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1814"></a>
+<span class="sourceLineNo">1815</span>        new BinaryComparator(val2), put);<a name="line.1815"></a>
+<span class="sourceLineNo">1816</span>    assertEquals(false, res);<a name="line.1816"></a>
+<span class="sourceLineNo">1817</span><a name="line.1817"></a>
+<span class="sourceLineNo">1818</span>    // Putting data in key<a name="line.1818"></a>
+<span class="sourceLineNo">1819</span>    put = new Put(row1);<a name="line.1819"></a>
+<span class="sourceLineNo">1820</span>    put.addColumn(fam1, qf1, Bytes.toBytes(bd1));<a name="line.1820"></a>
+<span class="sourceLineNo">1821</span>    region.put(put);<a name="line.1821"></a>
+<span class="sourceLineNo">1822</span><a name="line.1822"></a>
+<span class="sourceLineNo">1823</span>    // checkAndPut with wrong value<a name="line.1823"></a>
+<span class="sourceLineNo">1824</span>    res =<a name="line.1824"></a>
+<span class="sourceLineNo">1825</span>        region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1825"></a>
+<span class="sourceLineNo">1826</span>            new BigDecimalComparator(bd2), put);<a name="line.1826"></a>
+<span class="sourceLineNo">1827</span>    assertEquals(false, res);<a name="line.1827"></a>
+<span class="sourceLineNo">1828</span><a name="line.1828"></a>
+<span class="sourceLineNo">1829</span>    // checkAndDelete with wrong value<a name="line.1829"></a>
+<span class="sourceLineNo">1830</span>    delete = new Delete(row1);<a name="line.1830"></a>
+<span class="sourceLineNo">1831</span>    delete.addFamily(fam1);<a name="line.1831"></a>
+<span class="sourceLineNo">1832</span>    res =<a name="line.1832"></a>
+<span class="sourceLineNo">1833</span>        region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1833"></a>
+<span class="sourceLineNo">1834</span>            new BigDecimalComparator(bd2), put);<a name="line.1834"></a>
+<span class="sourceLineNo">1835</span>    assertEquals(false, res);<a name="line.1835"></a>
+<span class="sourceLineNo">1836</span>  }<a name="line.1836"></a>
+<span class="sourceLineNo">1837</span><a name="line.1837"></a>
+<span class="sourceLineNo">1838</span>  @Test<a name="line.1838"></a>
+<span class="sourceLineNo">1839</span>  public void testCheckAndMutate_WithCorrectValue() throws IOException {<a name="line.1839"></a>
+<span class="sourceLineNo">1840</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1840"></a>
+<span class="sourceLineNo">1841</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1841"></a>
+<span class="sourceLineNo">1842</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1842"></a>
+<span class="sourceLineNo">1843</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1843"></a>
+<span class="sourceLineNo">1844</span>    BigDecimal bd1 = new BigDecimal(Double.MIN_VALUE);<a name="line.1844"></a>
+<span class="sourceLineNo">1845</span><a name="line.1845"></a>
+<span class="sourceLineNo">1846</span>    // Setting up region<a name="line.1846"></a>
+<span class="sourceLineNo">1847</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.1847"></a>
+<span class="sourceLineNo">1848</span>    // Putting data in key<a name="line.1848"></a>
+<span class="sourceLineNo">1849</span>    Put put = new Put(row1);<a name="line.1849"></a>
+<span class="sourceLineNo">1850</span>    put.addColumn(fam1, qf1, val1);<a name="line.1850"></a>
+<span class="sourceLineNo">1851</span>    region.put(put);<a name="line.1851"></a>
+<span class="sourceLineNo">1852</span><a name="line.1852"></a>
+<span class="sourceLineNo">1853</span>    // checkAndPut with correct value<a name="line.1853"></a>
+<span class="sourceLineNo">1854</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1854"></a>
+<span class="sourceLineNo">1855</span>        new BinaryComparator(val1), put);<a name="line.1855"></a>
+<span class="sourceLineNo">1856</span>    assertEquals(true, res);<a name="line.1856"></a>
+<span class="sourceLineNo">1857</span><a name="line.1857"></a>
+<span class="sourceLineNo">1858</span>    // checkAndDelete with correct value<a name="line.1858"></a>
+<span class="sourceLineNo">1859</span>    Delete delete = new Delete(row1);<a name="line.1859"></a>
+<span class="sourceLineNo">1860</span>    delete.addColumn(fam1, qf1);<a name="line.1860"></a>
+<span class="sourceLineNo">1861</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new BinaryComparator(val1),<a name="line.1861"></a>
+<span class="sourceLineNo">1862</span>        delete);<a name="line.1862"></a>
+<span class="sourceLineNo">1863</span>    assertEquals(true, res);<a name="line.1863"></a>
+<span class="sourceLineNo">1864</span><a name="line.1864"></a>
+<span class="sourceLineNo">1865</span>    // Putting data in key<a name="line.1865"></a>
+<span class="sourceLineNo">1866</span>    put = new Put(row1);<a name="line.1866"></a>
+<span class="sourceLineNo">1867</span>    put.addColumn(fam1, qf1, Bytes.toBytes(bd1));<a name="line.1867"></a>
+<span class="sourceLineNo">1868</span>    region.put(put);<a name="line.1868"></a>
+<span class="sourceLineNo">1869</span><a name="line.1869"></a>
+<span class="sourceLineNo">1870</span>    // checkAndPut with correct value<a name="line.1870"></a>
+<span class="sourceLineNo">1871</span>    res =<a name="line.1871"></a>
+<span class="sourceLineNo">1872</span>        region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new BigDecimalComparator(<a name="line.1872"></a>
+<span class="sourceLineNo">1873</span>            bd1), put);<a name="line.1873"></a>
+<span class="sourceLineNo">1874</span>    assertEquals(true, res);<a name="line.1874"></a>
+<span class="sourceLineNo">1875</span><a name="line.1875"></a>
+<span class="sourceLineNo">1876</span>    // checkAndDelete with correct value<a name="line.1876"></a>
+<span class="sourceLineNo">1877</span>    delete = new Delete(row1);<a name="line.1877"></a>
+<span class="sourceLineNo">1878</span>    delete.addColumn(fam1, qf1);<a name="line.1878"></a>
+<span class="sourceLineNo">1879</span>    res =<a name="line.1879"></a>
+<span class="sourceLineNo">1880</span>        region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new BigDecimalComparator(<a name="line.1880"></a>
+<span class="sourceLineNo">1881</span>            bd1), delete);<a name="line.1881"></a>
+<span class="sourceLineNo">1882</span>    assertEquals(true, res);<a name="line.1882"></a>
+<span class="sourceLineNo">1883</span>  }<a name="line.1883"></a>
+<span class="sourceLineNo">1884</span><a name="line.1884"></a>
+<span class="sourceLineNo">1885</span>  @Test<a name="line.1885"></a>
+<span class="sourceLineNo">1886</span>  public void testCheckAndMutate_WithNonEqualCompareOp() throws IOException {<a name="line.1886"></a>
+<span class="sourceLineNo">1887</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1887"></a>
+<span class="sourceLineNo">1888</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1888"></a>
+<span class="sourceLineNo">1889</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1889"></a>
+<span class="sourceLineNo">1890</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1890"></a>
+<span class="sourceLineNo">1891</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.1891"></a>
+<span class="sourceLineNo">1892</span>    byte[] val3 = Bytes.toBytes("value3");<a name="line.1892"></a>
+<span class="sourceLineNo">1893</span>    byte[] val4 = Bytes.toBytes("value4");<a name="line.1893"></a>
+<span class="sourceLineNo">1894</span><a name="line.1894"></a>
+<span class="sourceLineNo">1895</span>    // Setting up region<a name="line.1895"></a>
+<span class="sourceLineNo">1896</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.1896"></a>
+<span class="sourceLineNo">1897</span>    // Putting val3 in key<a name="line.1897"></a>
+<span class="sourceLineNo">1898</span>    Put put = new Put(row1);<a name="line.1898"></a>
+<span class="sourceLineNo">1899</span>    put.addColumn(fam1, qf1, val3);<a name="line.1899"></a>
+<span class="sourceLineNo">1900</span>    region.put(put);<a name="line.1900"></a>
+<span class="sourceLineNo">1901</span><a name="line.1901"></a>
+<span class="sourceLineNo">1902</span>    // Test CompareOp.LESS: original = val3, compare with val3, fail<a name="line.1902"></a>
+<span class="sourceLineNo">1903</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS,<a name="line.1903"></a>
+<span class="sourceLineNo">1904</span>        new BinaryComparator(val3), put);<a name="line.1904"></a>
+<span class="sourceLineNo">1905</span>    assertEquals(false, res);<a name="line.1905"></a>
+<span class="sourceLineNo">1906</span><a name="line.1906"></a>
+<span class="sourceLineNo">1907</span>    // Test CompareOp.LESS: original = val3, compare with val4, fail<a name="line.1907"></a>
+<span class="sourceLineNo">1908</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS,<a name="line.1908"></a>
+<span class="sourceLineNo">1909</span>        new BinaryComparator(val4), put);<a name="line.1909"></a>
+<span class="sourceLineNo">1910</span>    assertEquals(false, res);<a name="line.1910"></a>
+<span class="sourceLineNo">1911</span><a name="line.1911"></a>
+<span class="sourceLineNo">1912</span>    // Test CompareOp.LESS: original = val3, compare with val2,<a name="line.1912"></a>
+<span class="sourceLineNo">1913</span>    // succeed (now value = val2)<a name="line.1913"></a>
+<span class="sourceLineNo">1914</span>    put = new Put(row1);<a name="line.1914"></a>
+<span class="sourceLineNo">1915</span>    put.addColumn(fam1, qf1, val2);<a name="line.1915"></a>
+<span class="sourceLineNo">1916</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS,<a name="line.1916"></a>
+<span class="sourceLineNo">1917</span>        new BinaryComparator(val2), put);<a name="line.1917"></a>
+<span class="sourceLineNo">1918</span>    assertEquals(true, res);<a name="line.1918"></a>
+<span class="sourceLineNo">1919</span><a name="line.1919"></a>
+<span class="sourceLineNo">1920</span>    // Test CompareOp.LESS_OR_EQUAL: original = val2, compare with val3, fail<a name="line.1920"></a>
+<span class="sourceLineNo">1921</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS_OR_EQUAL,<a name="line.1921"></a>
+<span class="sourceLineNo">1922</span>        new BinaryComparator(val3), put);<a name="line.1922"></a>
+<span class="sourceLineNo">1923</span>    assertEquals(false, res);<a name="line.1923"></a>
+<span class="sourceLineNo">1924</span><a name="line.1924"></a>
+<span class="sourceLineNo">1925</span>    // Test CompareOp.LESS_OR_EQUAL: original = val2, compare with val2,<a name="line.1925"></a>
+<span class="sourceLineNo">1926</span>    // succeed (value still = val2)<a name="line.1926"></a>
+<span class="sourceLineNo">1927</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS_OR_EQUAL,<a name="line.1927"></a>
+<span class="sourceLineNo">1928</span>        new BinaryComparator(val2), put);<a name="line.1928"></a>
+<span class="sourceLineNo">1929</span>    assertEquals(true, res);<a name="line.1929"></a>
+<span class="sourceLineNo">1930</span><a name="line.1930"></a>
+<span class="sourceLineNo">1931</span>    // Test CompareOp.LESS_OR_EQUAL: original = val2, compare with val1,<a name="line.1931"></a>
+<span class="sourceLineNo">1932</span>    // succeed (now value = val3)<a name="line.1932"></a>
+<span class="sourceLineNo">1933</span>    put = new Put(row1);<a name="line.1933"></a>
+<span class="sourceLineNo">1934</span>    put.addColumn(fam1, qf1, val3);<a name="line.1934"></a>
+<span class="sourceLineNo">1935</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS_OR_EQUAL,<a name="line.1935"></a>
+<span class="sourceLineNo">1936</span>        new BinaryComparator(val1), put);<a name="line.1936"></a>
+<span class="sourceLineNo">1937</span>    assertEquals(true, res);<a name="line.1937"></a>
+<span class="sourceLineNo">1938</span><a name="line.1938"></a>
+<span class="sourceLineNo">1939</span>    // Test CompareOp.GREATER: original = val3, compare with val3, fail<a name="line.1939"></a>
+<span class="sourceLineNo">1940</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER,<a name="line.1940"></a>
+<span class="sourceLineNo">1941</span>        new BinaryComparator(val3), put);<a name="line.1941"></a>
+<span class="sourceLineNo">1942</span>    assertEquals(false, res);<a name="line.1942"></a>
+<span class="sourceLineNo">1943</span><a name="line.1943"></a>
+<span class="sourceLineNo">1944</span>    // Test CompareOp.GREATER: original = val3, compare with val2, fail<a name="line.1944"></a>
+<span class="sourceLineNo">1945</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER,<a name="line.1945"></a>
+<span class="sourceLineNo">1946</span>        new BinaryComparator(val2), put);<a name="line.1946"></a>
+<span class="sourceLineNo">1947</span>    assertEquals(false, res);<a name="line.1947"></a>
+<span class="sourceLineNo">1948</span><a name="line.1948"></a>
+<span class="sourceLineNo">1949</span>    // Test CompareOp.GREATER: original = val3, compare with val4,<a name="line.1949"></a>
+<span class="sourceLineNo">1950</span>    // succeed (now value = val2)<a name="line.1950"></a>
+<span class="sourceLineNo">1951</span>    put = new Put(row1);<a name="line.1951"></a>
+<span class="sourceLineNo">1952</span>    put.addColumn(fam1, qf1, val2);<a name="line.1952"></a>
+<span class="sourceLineNo">1953</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER,<a name="line.1953"></a>
+<span class="sourceLineNo">1954</span>        new BinaryComparator(val4), put);<a name="line.1954"></a>
+<span class="sourceLineNo">1955</span>    assertEquals(true, res);<a name="line.1955"></a>
+<span class="sourceLineNo">1956</span><a name="line.1956"></a>
+<span class="sourceLineNo">1957</span>    // Test CompareOp.GREATER_OR_EQUAL: original = val2, compare with val1, fail<a name="line.1957"></a>
+<span class="sourceLineNo">1958</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER_OR_EQUAL,<a name="line.1958"></a>
+<span class="sourceLineNo">1959</span>        new BinaryComparator(val1), put);<a name="line.1959"></a>
+<span class="sourceLineNo">1960</span>    assertEquals(false, res);<a name="line.1960"></a>
+<span class="sourceLineNo">1961</span><a name="line.1961"></a>
+<span class="sourceLineNo">1962</span>    // Test CompareOp.GREATER_OR_EQUAL: original = val2, compare with val2,<a name="line.1962"></a>
+<span class="sourceLineNo">1963</span>    // succeed (value still = val2)<a name="line.1963"></a>
+<span class="sourceLineNo">1964</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER_OR_EQUAL,<a name="line.1964"></a>
+<span class="sourceLineNo">1965</span>        new BinaryComparator(val2), put);<a name="line.1965"></a>
+<span class="sourceLineNo">1966</span>    assertEquals(true, res);<a name="line.1966"></a>
+<span class="sourceLineNo">1967</span><a name="line.1967"></a>
+<span class="sourceLineNo">1968</span>    // Test CompareOp.GREATER_OR_EQUAL: original = val2, compare with val3, succeed<a name="line.1968"></a>
+<span class="sourceLineNo">1969</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER_OR_EQUAL,<a name="line.1969"></a>
+<span class="sourceLineNo">1970</span>        new BinaryComparator(val3), put);<a name="line.1970"></a>
+<span class="sourceLineNo">1971</span>    assertEquals(true, res);<a name="line.1971"></a>
+<span class="sourceLineNo">1972</span>  }<a name="line.1972"></a>
+<span class="sourceLineNo">1973</span><a name="line.1973"></a>
+<span class="sourceLineNo">1974</span>  @Test<a name="line.1974"></a>
+<span class="sourceLineNo">1975</span>  public void testCheckAndPut_ThatPutWasWritten() throws IOException {<a name="line.1975"></a>
+<span class="sourceLineNo">1976</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1976"></a>
+<span class="sourceLineNo">1977</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1977"></a>
+<span class="sourceLineNo">1978</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.1978"></a>
+<span class="sourceLineNo">1979</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1979"></a>
+<span class="sourceLineNo">1980</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1980"></a>
+<span class="sourceLineNo">1981</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.1981"></a>
+<span class="sourceLineNo">1982</span><a name="line.1982"></a>
+<span class="sourceLineNo">1983</span>    byte[][] families = { fam1, fam2 };<a name="line.1983"></a>
+<span class="sourceLineNo">1984</span><a name="line.1984"></a>
+<span class="sourceLineNo">1985</span>    // Setting up region<a name="line.1985"></a>
+<span class="sourceLineNo">1986</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.1986"></a>
+<span class="sourceLineNo">1987</span>    // Putting data in the key to check<a name="line.1987"></a>
+<span class="sourceLineNo">1988</span>    Put put = new Put(row1);<a name="line.1988"></a>
+<span class="sourceLineNo">1989</span>    put.addColumn(fam1, qf1, val1);<a name="line.1989"></a>
+<span class="sourceLineNo">1990</span>    region.put(put);<a name="line.1990"></a>
+<span class="sourceLineNo">1991</span><a name="line.1991"></a>
+<span class="sourceLineNo">1992</span>    // Creating put to add<a name="line.1992"></a>
+<span class="sourceLineNo">1993</span>    long ts = System.currentTimeMillis();<a name="line.1993"></a>
+<span class="sourceLineNo">1994</span>    KeyValue kv = new KeyValue(row1, fam2, qf1, ts, KeyValue.Type.Put, val2);<a name="line.1994"></a>
+<span class="sourceLineNo">1995</span>    put = new Put(row1);<a name="line.1995"></a>
+<span class="sourceLineNo">1996</span>    put.add(kv);<a name="line.1996"></a>
+<span class="sourceLineNo">1997</span><a name="line.1997"></a>
+<span class="sourceLineNo">1998</span>    // checkAndPut with wrong value<a name="line.1998"></a>
+<span class="sourceLineNo">1999</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1999"></a>
+<span class="sourceLineNo">2000</span>        new BinaryComparator(val1), put);<a name="line.2000"></a>
+<span class="sourceLineNo">2001</span>    assertEquals(true, res);<a name="line.2001"></a>
+<span class="sourceLineNo">2002</span><a name="line.2002"></a>
+<span class="sourceLineNo">2003</span>    Get get = new Get(row1);<a name="line.2003"></a>
+<span class="sourceLineNo">2004</span>    get.addColumn(fam2, qf1);<a name="line.2004"></a>
+<span class="sourceLineNo">2005</span>    Cell[] actual = region.get(get).rawCells();<a name="line.2005"></a>
+<span class="sourceLineNo">2006</span><a name="line.2006"></a>
+<span class="sourceLineNo">2007</span>    Cell[] expected = { kv };<a name="line.2007"></a>
+<span class="sourceLineNo">2008</span><a name="line.2008"></a>
+<span class="sourceLineNo">2009</span>    assertEquals(expected.length, actual.length);<a name="line.2009"></a>
+<span class="sourceLineNo">2010</span>    for (int i = 0; i &lt; actual.length; i++) {<a name="line.2010"></a>
+<span class="sourceLineNo">2011</span>      assertEquals(expected[i], actual[i]);<a name="line.2011"></a>
+<span class="sourceLineNo">2012</span>    }<a name="line.2012"></a>
+<span class="sourceLineNo">2013</span>  }<a name="line.2013"></a>
+<span class="sourceLineNo">2014</span><a name="line.2014"></a>
+<span class="sourceLineNo">2015</span>  @Test<a name="line.2015"></a>
+<span class="sourceLineNo">2016</span>  public void testCheckAndPut_wrongRowInPut() throws IOException {<a name="line.2016"></a>
+<span class="sourceLineNo">2017</span>    this.region = initHRegion(tableName, method, CONF, COLUMNS);<a name="line.2017"></a>
+<span class="sourceLineNo">2018</span>    Put put = new Put(row2);<a name="line.2018"></a>
+<span class="sourceLineNo">2019</span>    put.addColumn(fam1, qual1, value1);<a name="line.2019"></a>
+<span class="sourceLineNo">2020</span>    try {<a name="line.2020"></a>
+<span class="sourceLineNo">2021</span>      region.checkAndMutate(row, fam1, qual1, CompareOperator.EQUAL,<a name="line.2021"></a>
+<span class="sourceLineNo">2022</span>          new BinaryComparator(value2), put);<a name="line.2022"></a>
+<span class="sourceLineNo">2023</span>      fail();<a name="line.2023"></a>
+<span class="sourceLineNo">2024</span>    } catch (org.apache.hadoop.hbase.DoNotRetryIOException expected) {<a name="line.2024"></a>
+<span class="sourceLineNo">2025</span>      // expected exception.<a name="line.2025"></a>
+<span class="sourceLineNo">2026</span>    }<a name="line.2026"></a>
+<span class="sourceLineNo">2027</span>  }<a name="line.2027"></a>
+<span class="sourceLineNo">2028</span><a name="line.2028"></a>
+<span class="sourceLineNo">2029</span>  @Test<a name="line.2029"></a>
+<span class="sourceLineNo">2030</span>  public void testCheckAndDelete_ThatDeleteWasWritten() throws IOException {<a name="line.2030"></a>
+<span class="sourceLineNo">2031</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2031"></a>
+<span class="sourceLineNo">2032</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2032"></a>
+<span class="sourceLineNo">2033</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2033"></a>
+<span class="sourceLineNo">2034</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.2034"></a>
+<span class="sourceLineNo">2035</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.2035"></a>
+<span class="sourceLineNo">2036</span>    byte[] qf3 = Bytes.toBytes("qualifier3");<a name="line.2036"></a>
+<span class="sourceLineNo">2037</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.2037"></a>
+<span class="sourceLineNo">2038</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.2038"></a>
+<span class="sourceLineNo">2039</span>    byte[] val3 = Bytes.toBytes("value3");<a name="line.2039"></a>
+<span class="sourceLineNo">2040</span>    byte[] emptyVal = new byte[] {};<a name="line.2040"></a>
+<span class="sourceLineNo">2041</span><a name="line.2041"></a>
+<span class="sourceLineNo">2042</span>    byte[][] families = { fam1, fam2 };<a name="line.2042"></a>
+<span class="sourceLineNo">2043</span><a name="line.2043"></a>
+<span class="sourceLineNo">2044</span>    // Setting up region<a name="line.2044"></a>
+<span class="sourceLineNo">2045</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2045"></a>
+<span class="sourceLineNo">2046</span>    // Put content<a name="line.2046"></a>
+<span class="sourceLineNo">2047</span>    Put put = new Put(row1);<a name="line.2047"></a>
+<span class="sourceLineNo">2048</span>    put.addColumn(fam1, qf1, val1);<a name="line.2048"></a>
+<span class="sourceLineNo">2049</span>    region.put(put);<a name="line.2049"></a>
+<span class="sourceLineNo">2050</span>    Threads.sleep(2);<a name="line.2050"></a>
+<span class="sourceLineNo">2051</span><a name="line.2051"></a>
+<span class="sourceLineNo">2052</span>    put = new Put(row1);<a name="line.2052"></a>
+<span class="sourceLineNo">2053</span>    put.addColumn(fam1, qf1, val2);<a name="line.2053"></a>
+<span class="sourceLineNo">2054</span>    put.addColumn(fam2, qf1, val3);<a name="line.2054"></a>
+<span class="sourceLineNo">2055</span>    put.addColumn(fam2, qf2, val2);<a name="line.2055"></a>
+<span class="sourceLineNo">2056</span>    put.addColumn(fam2, qf3, val1);<a name="line.2056"></a>
+<span class="sourceLineNo">2057</span>    put.addColumn(fam1, qf3, val1);<a name="line.2057"></a>
+<span class="sourceLineNo">2058</span>    region.put(put);<a name="line.2058"></a>
+<span class="sourceLineNo">2059</span><a name="line.2059"></a>
+<span class="sourceLineNo">2060</span>    // Multi-column delete<a name="line.2060"></a>
+<span class="sourceLineNo">2061</span>    Delete delete = new Delete(row1);<a name="line.2061"></a>
+<span class="sourceLineNo">2062</span>    delete.addColumn(fam1, qf1);<a name="line.2062"></a>
+<span class="sourceLineNo">2063</span>    delete.addColumn(fam2, qf1);<a name="line.2063"></a>
+<span class="sourceLineNo">2064</span>    delete.addColumn(fam1, qf3);<a name="line.2064"></a>
+<span class="sourceLineNo">2065</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.2065"></a>
+<span class="sourceLineNo">2066</span>        new BinaryComparator(val2), delete);<a name="line.2066"></a>
+<span class="sourceLineNo">2067</span>    assertEquals(true, res);<a name="line.2067"></a>
+<span class="sourceLineNo">2068</span><a name="line.2068"></a>
+<span class="sourceLineNo">2069</span>    Get get = new Get(row1);<a name="line.2069"></a>
+<span class="sourceLineNo">2070</span>    get.addColumn(fam1, qf1);<a name="line.2070"></a>
+<span class="sourceLineNo">2071</span>    get.addColumn(fam1, qf3);<a name="line.2071"></a>
+<span class="sourceLineNo">2072</span>    get.addColumn(fam2, qf2);<a name="line.2072"></a>
+<span class="sourceLineNo">2073</span>    Result r = region.get(get);<a name="line.2073"></a>
+<span class="sourceLineNo">2074</span>    assertEquals(2, r.size());<a name="line.2074"></a>
+<span class="sourceLineNo">2075</span>    assertArrayEquals(val1, r.getValue(fam1, qf1));<a name="line.2075"></a>
+<span class="sourceLineNo">2076</span>    assertArrayEquals(val2, r.getValue(fam2, qf2));<a name="line.2076"></a>
+<span class="sourceLineNo">2077</span><a name="line.2077"></a>
+<span class="sourceLineNo">2078</span>    // Family delete<a name="line.2078"></a>
+<span class="sourceLineNo">2079</span>    delete = new Delete(row1);<a name="line.2079"></a>
+<span class="sourceLineNo">2080</span>    delete.addFamily(fam2);<a name="line.2080"></a>
+<span class="sourceLineNo">2081</span>    res = region.checkAndMutate(row1, fam2, qf1, CompareOperator.EQUAL,<a name="line.2081"></a>
+<span class="sourceLineNo">2082</span>        new BinaryComparator(emptyVal), delete);<a name="line.2082"></a>
+<span class="sourceLineNo">2083</span>    assertEquals(true, res);<a name="line.2083"></a>
+<span class="sourceLineNo">2084</span><a name="line.2084"></a>
+<span class="sourceLineNo">2085</span>    get = new Get(row1);<a name="line.2085"></a>
+<span class="sourceLineNo">2086</span>    r = region.get(get);<a name="line.2086"></a>
+<span class="sourceLineNo">2087</span>    assertEquals(1, r.size());<a name="line.2087"></a>
+<span class="sourceLineNo">2088</span>    assertArrayEquals(val1, r.getValue(fam1, qf1));<a name="line.2088"></a>
+<span class="sourceLineNo">2089</span><a name="line.2089"></a>
+<span class="sourceLineNo">2090</span>    // Row delete<a name="line.2090"></a>
+<span class="sourceLineNo">2091</span>    delete = new Delete(row1);<a name="line.2091"></a>
+<span class="sourceLineNo">2092</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new BinaryComparator(val1),<a name="line.2092"></a>
+<span class="sourceLineNo">2093</span>        delete);<a name="line.2093"></a>
+<span class="sourceLineNo">2094</span>    assertEquals(true, res);<a name="line.2094"></a>
+<span class="sourceLineNo">2095</span>    get = new Get(row1);<a name="line.2095"></a>
+<span class="sourceLineNo">2096</span>    r = region.get(get);<a name="line.2096"></a>
+<span class="sourceLineNo">2097</span>    assertEquals(0, r.size());<a name="line.2097"></a>
+<span class="sourceLineNo">2098</span>  }<a name="line.2098"></a>
+<span class="sourceLineNo">2099</span><a name="line.2099"></a>
+<span class="sourceLineNo">2100</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2100"></a>
+<span class="sourceLineNo">2101</span>  // Delete tests<a name="line.2101"></a>
+<span class="sourceLineNo">2102</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2102"></a>
+<span class="sourceLineNo">2103</span>  @Test<a name="line.2103"></a>
+<span class="sourceLineNo">2104</span>  public void testDelete_multiDeleteColumn() throws IOException {<a name="line.2104"></a>
+<span class="sourceLineNo">2105</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2105"></a>
+<span class="sourceLineNo">2106</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2106"></a>
+<span class="sourceLineNo">2107</span>    byte[] qual = Bytes.toBytes("qualifier");<a name="line.2107"></a>
+<span class="sourceLineNo">2108</span>    byte[] value = Bytes.toBytes("value");<a name="line.2108"></a>
+<span class="sourceLineNo">2109</span><a name="line.2109"></a>
+<span class="sourceLineNo">2110</span>    Put put = new Put(row1);<a name="line.2110"></a>
+<span class="sourceLineNo">2111</span>    put.addColumn(fam1, qual, 1, value);<a name="line.2111"></a>
+<span class="sourceLineNo">2112</span>    put.addColumn(fam1, qual, 2, value);<a name="line.2112"></a>
+<span class="sourceLineNo">2113</span><a name="line.2113"></a>
+<span class="sourceLineNo">2114</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2114"></a>
+<span class="sourceLineNo">2115</span>    region.put(put);<a name="line.2115"></a>
+<span class="sourceLineNo">2116</span><a name="line.2116"></a>
+<span class="sourceLineNo">2117</span>    // We do support deleting more than 1 'latest' version<a name="line.2117"></a>
+<span class="sourceLineNo">2118</span>    Delete delete = new Delete(row1);<a name="line.2118"></a>
 <span class="sourceLineNo">2119</span>    delete.addColumn(fam1, qual);<a name="line.2119"></a>
-<span class="sourceLineNo">2120</span>    region.delete(delete);<a name="line.2120"></a>
-<span class="sourceLineNo">2121</span><a name="line.2121"></a>
-<span class="sourceLineNo">2122</span>    Get get = new Get(row1);<a name="line.2122"></a>
-<span class="sourceLineNo">2123</span>    get.addFamily(fam1);<a name="line.2123"></a>
-<span class="sourceLineNo">2124</span>    Result r = region.get(get);<a name="line.2124"></a>
-<span class="sourceLineNo">2125</span>    assertEquals(0, r.size());<a name="line.2125"></a>
-<span class="sourceLineNo">2126</span>  }<a name="line.2126"></a>
-<span class="sourceLineNo">2127</span><a name="line.2127"></a>
-<span class="sourceLineNo">2128</span>  @Test<a name="line.2128"></a>
-<span class="sourceLineNo">2129</span>  public void testDelete_CheckFamily() throws IOException {<a name="line.2129"></a>
-<span class="sourceLineNo">2130</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2130"></a>
-<span class="sourceLineNo">2131</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2131"></a>
-<span class="sourceLineNo">2132</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2132"></a>
-<span class="sourceLineNo">2133</span>    byte[] fam3 = Bytes.toBytes("fam3");<a name="line.2133"></a>
-<span class="sourceLineNo">2134</span>    byte[] fam4 = Bytes.toBytes("fam4");<a name="line.2134"></a>
-<span class="sourceLineNo">2135</span><a name="line.2135"></a>
-<span class="sourceLineNo">2136</span>    // Setting up region<a name="line.2136"></a>
-<span class="sourceLineNo">2137</span>    this.region = initHRegion(tableName, method, CONF, fam1, fam2, fam3);<a name="line.2137"></a>
-<span class="sourceLineNo">2138</span>    List&lt;Cell&gt; kvs = new ArrayList&lt;&gt;();<a name="line.2138"></a>
-<span class="sourceLineNo">2139</span>    kvs.add(new KeyValue(row1, fam4, null, null));<a name="line.2139"></a>
-<span class="sourceLineNo">2140</span><a name="line.2140"></a>
-<span class="sourceLineNo">2141</span>    // testing existing family<a name="line.2141"></a>
-<span class="sourceLineNo">2142</span>    byte[] family = fam2;<a name="line.2142"></a>
-<span class="sourceLineNo">2143</span>    NavigableMap&lt;byte[], List&lt;Cell&gt;&gt; deleteMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2143"></a>
-<span class="sourceLineNo">2144</span>    deleteMap.put(family, kvs);<a name="line.2144"></a>
-<span class="sourceLineNo">2145</span>    region.delete(deleteMap, Durability.SYNC_WAL);<a name="line.2145"></a>
-<span class="sourceLineNo">2146</span><a name="line.2146"></a>
-<span class="sourceLineNo">2147</span>    // testing non existing family<a name="line.2147"></a>
-<span class="sourceLineNo">2148</span>    boolean ok = false;<a name="line.2148"></a>
-<span class="sourceLineNo">2149</span>    family = fam4;<a name="line.2149"></a>
-<span class="sourceLineNo">2150</span>    try {<a name="line.2150"></a>
-<span class="sourceLineNo">2151</span>      deleteMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2151"></a>
-<span class="sourceLineNo">2152</span>      deleteMap.put(family, kvs);<a name="line.2152"></a>
-<span class="sourceLineNo">2153</span>      region.delete(deleteMap, Durability.SYNC_WAL);<a name="line.2153"></a>
-<span class="sourceLineNo">2154</span>    } catch (Exception e) {<a name="line.2154"></a>
-<span class="sourceLineNo">2155</span>      ok = true;<a name="line.2155"></a>
-<span class="sourceLineNo">2156</span>    }<a name="line.2156"></a>
-<span class="sourceLineNo">2157</span>    assertTrue("Family " + new String(family, StandardCharsets.UTF_8) + " does exist", ok);<a name="line.2157"></a>
-<span class="sourceLineNo">2158</span>  }<a name="line.2158"></a>
-<span class="sourceLineNo">2159</span><a name="line.2159"></a>
-<span class="sourceLineNo">2160</span>  @Test<a name="line.2160"></a>
-<span class="sourceLineNo">2161</span>  public void testDelete_mixed() throws IOException, InterruptedException {<a name="line.2161"></a>
-<span class="sourceLineNo">2162</span>    byte[] fam = Bytes.toBytes("info");<a name="line.2162"></a>
-<span class="sourceLineNo">2163</span>    byte[][] families = { fam };<a name="line.2163"></a>
-<span class="sourceLineNo">2164</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2164"></a>
-<span class="sourceLineNo">2165</span>    EnvironmentEdgeManagerTestHelper.injectEdge(new IncrementingEnvironmentEdge());<a name="line.2165"></a>
-<span class="sourceLineNo">2166</span><a name="line.2166"></a>
-<span class="sourceLineNo">2167</span>    byte[] row = Bytes.toBytes("table_name");<a name="line.2167"></a>
-<span class="sourceLineNo">2168</span>    // column names<a name="line.2168"></a>
-<span class="sourceLineNo">2169</span>    byte[] serverinfo = Bytes.toBytes("serverinfo");<a name="line.2169"></a>
-<span class="sourceLineNo">2170</span>    byte[] splitA = Bytes.toBytes("splitA");<a name="line.2170"></a>
-<span class="sourceLineNo">2171</span>    byte[] splitB = Bytes.toBytes("splitB");<a name="line.2171"></a>
-<span class="sourceLineNo">2172</span><a name="line.2172"></a>
-<span class="sourceLineNo">2173</span>    // add some data:<a name="line.2173"></a>
-<span class="sourceLineNo">2174</span>    Put put = new Put(row);<a name="line.2174"></a>
-<span class="sourceLineNo">2175</span>    put.addColumn(fam, splitA, Bytes.toBytes("reference_A"));<a name="line.2175"></a>
-<span class="sourceLineNo">2176</span>    region.put(put);<a name="line.2176"></a>
-<span class="sourceLineNo">2177</span><a name="line.2177"></a>
-<span class="sourceLineNo">2178</span>    put = new Put(row);<a name="line.2178"></a>
-<span class="sourceLineNo">2179</span>    put.addColumn(fam, splitB, Bytes.toBytes("reference_B"));<a name="line.2179"></a>
-<span class="sourceLineNo">2180</span>    region.put(put);<a name="line.2180"></a>
-<span class="sourceLineNo">2181</span><a name="line.2181"></a>
-<span class="sourceLineNo">2182</span>    put = new Put(row);<a name="line.2182"></a>
-<span class="sourceLineNo">2183</span>    put.addColumn(fam, serverinfo, Bytes.toBytes("ip_address"));<a name="line.2183"></a>
-<span class="sourceLineNo">2184</span>    region.put(put);<a name="line.2184"></a>
-<span class="sourceLineNo">2185</span><a name="line.2185"></a>
-<span class="sourceLineNo">2186</span>    // ok now delete a split:<a name="line.2186"></a>
-<span class="sourceLineNo">2187</span>    Delete delete = new Delete(row);<a name="line.2187"></a>
-<span class="sourceLineNo">2188</span>    delete.addColumns(fam, splitA);<a name="line.2188"></a>
-<span class="sourceLineNo">2189</span>    region.delete(delete);<a name="line.2189"></a>
-<span class="sourceLineNo">2190</span><a name="line.2190"></a>
-<span class="sourceLineNo">2191</span>    // assert some things:<a name="line.2191"></a>
-<span class="sourceLineNo">2192</span>    Get get = new Get(row).addColumn(fam, serverinfo);<a name="line.2192"></a>
-<span class="sourceLineNo">2193</span>    Result result = region.get(get);<a name="line.2193"></a>
-<span class="sourceLineNo">2194</span>    assertEquals(1, result.size());<a name="line.2194"></a>
-<span class="sourceLineNo">2195</span><a name="line.2195"></a>
-<span class="sourceLineNo">2196</span>    get = new Get(row).addColumn(fam, splitA);<a name="line.2196"></a>
-<span class="sourceLineNo">2197</span>    result = region.get(get);<a name="line.2197"></a>
-<span class="sourceLineNo">2198</span>    assertEquals(0, result.size());<a name="line.2198"></a>
-<span class="sourceLineNo">2199</span><a name="line.2199"></a>
-<span class="sourceLineNo">2200</span>    get = new Get(row).addColumn(fam, splitB);<a name="line.2200"></a>
-<span class="sourceLineNo">2201</span>    result = region.get(get);<a name="line.2201"></a>
-<span class="sourceLineNo">2202</span>    assertEquals(1, result.size());<a name="line.2202"></a>
-<span class="sourceLineNo">2203</span><a name="line.2203"></a>
-<span class="sourceLineNo">2204</span>    // Assert that after a delete, I can put.<a name="line.2204"></a>
-<span class="sourceLineNo">2205</span>    put = new Put(row);<a name="line.2205"></a>
-<span class="sourceLineNo">2206</span>    put.addColumn(fam, splitA, Bytes.toBytes("reference_A"));<a name="line.2206"></a>
-<span class="sourceLineNo">2207</span>    region.put(put);<a name="line.2207"></a>
-<span class="sourceLineNo">2208</span>    get = new Get(row);<a name="line.2208"></a>
-<span class="sourceLineNo">2209</span>    result = region.get(get);<a name="line.2209"></a>
-<span class="sourceLineNo">2210</span>    assertEquals(3, result.size());<a name="line.2210"></a>
-<span class="sourceLineNo">2211</span><a name="line.2211"></a>
-<span class="sourceLineNo">2212</span>    // Now delete all... then test I can add stuff back<a name="line.2212"></a>
-<span class="sourceLineNo">2213</span>    delete = new Delete(row);<a name="line.2213"></a>
-<span class="sourceLineNo">2214</span>    region.delete(delete);<a name="line.2214"></a>
-<span class="sourceLineNo">2215</span>    assertEquals(0, region.get(get).size());<a name="line.2215"></a>
-<span class="sourceLineNo">2216</span><a name="line.2216"></a>
-<span class="sourceLineNo">2217</span>    region.put(new Put(row).addColumn(fam, splitA, Bytes.toBytes("reference_A")));<a name="line.2217"></a>
-<span class="sourceLineNo">2218</span>    result = region.get(get);<a name="line.2218"></a>
-<span class="sourceLineNo">2219</span>    assertEquals(1, result.size());<a name="line.2219"></a>
-<span class="sourceLineNo">2220</span>  }<a name="line.2220"></a>
-<span class="sourceLineNo">2221</span><a name="line.2221"></a>
-<span class="sourceLineNo">2222</span>  @Test<a name="line.2222"></a>
-<span class="sourceLineNo">2223</span>  public void testDeleteRowWithFutureTs() throws IOException {<a name="line.2223"></a>
-<span class="sourceLineNo">2224</span>    byte[] fam = Bytes.toBytes("info");<a name="line.2224"></a>
-<span class="sourceLineNo">2225</span>    byte[][] families = { fam };<a name="line.2225"></a>
-<span class="sourceLineNo">2226</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2226"></a>
-<span class="sourceLineNo">2227</span>    byte[] row = Bytes.toBytes("table_name");<a name="line.2227"></a>
-<span class="sourceLineNo">2228</span>    // column names<a name="line.2228"></a>
-<span class="sourceLineNo">2229</span>    byte[] serverinfo = Bytes.toBytes("serverinfo");<a name="line.2229"></a>
-<span class="sourceLineNo">2230</span><a name="line.2230"></a>
-<span class="sourceLineNo">2231</span>    // add data in the far future<a name="line.2231"></a>
-<span class="sourceLineNo">2232</span>    Put put = new Put(row);<a name="line.2232"></a>
-<span class="sourceLineNo">2233</span>    put.addColumn(fam, serverinfo, HConstants.LATEST_TIMESTAMP - 5, Bytes.toBytes("value"));<a name="line.2233"></a>
-<span class="sourceLineNo">2234</span>    region.put(put);<a name="line.2234"></a>
-<span class="sourceLineNo">2235</span><a name="line.2235"></a>
-<span class="sourceLineNo">2236</span>    // now delete something in the present<a name="line.2236"></a>
-<span class="sourceLineNo">2237</span>    Delete delete = new Delete(row);<a name="line.2237"></a>
-<span class="sourceLineNo">2238</span>    region.delete(delete);<a name="line.2238"></a>
-<span class="sourceLineNo">2239</span><a name="line.2239"></a>
-<span class="sourceLineNo">2240</span>    // make sure we still see our data<a name="line.2240"></a>
-<span class="sourceLineNo">2241</span>    Get get = new Get(row).addColumn(fam, serverinfo);<a name="line.2241"></a>
-<span class="sourceLineNo">2242</span>    Result result = region.get(get);<a name="line.2242"></a>
-<span class="sourceLineNo">2243</span>    assertEquals(1, result.size());<a name="line.2243"></a>
-<span class="sourceLineNo">2244</span><a name="line.2244"></a>
-<span class="sourceLineNo">2245</span>    // delete the future row<a name="line.2245"></a>
-<span class="sourceLineNo">2246</span>    delete = new Delete(row, HConstants.LATEST_TIMESTAMP - 3);<a name="line.2246"></a>
-<span class="sourceLineNo">2247</span>    region.delete(delete);<a name="line.2247"></a>
-<span class="sourceLineNo">2248</span><a name="line.2248"></a>
-<span class="sourceLineNo">2249</span>    // make sure it is gone<a name="line.2249"></a>
-<span class="sourceLineNo">2250</span>    get = new Get(row).addColumn(fam, serverinfo);<a name="line.2250"></a>
-<span class="sourceLineNo">2251</span>    result = region.get(get);<a name="line.2251"></a>
-<span class="sourceLineNo">2252</span>    assertEquals(0, result.size());<a name="line.2252"></a>
-<span class="sourceLineNo">2253</span>  }<a name="line.2253"></a>
-<span class="sourceLineNo">2254</span><a name="line.2254"></a>
-<span class="sourceLineNo">2255</span>  /**<a name="line.2255"></a>
-<span class="sourceLineNo">2256</span>   * Tests that the special LATEST_TIMESTAMP option for puts gets replaced by<a name="line.2256"></a>
-<span class="sourceLineNo">2257</span>   * the actual timestamp<a name="line.2257"></a>
-<span class="sourceLineNo">2258</span>   */<a name="line.2258"></a>
-<span class="sourceLineNo">2259</span>  @Test<a name="line.2259"></a>
-<span class="sourceLineNo">2260</span>  public void testPutWithLatestTS() throws IOException {<a name="line.2260"></a>
-<span class="sourceLineNo">2261</span>    byte[] fam = Bytes.toBytes("info");<a name="line.2261"></a>
-<span class="sourceLineNo">2262</span>    byte[][] families = { fam };<a name="line.2262"></a>
-<span class="sourceLineNo">2263</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2263"></a>
-<span class="sourceLineNo">2264</span>    byte[] row = Bytes.toBytes("row1");<a name="line.2264"></a>
-<span class="sourceLineNo">2265</span>    // column names<a name="line.2265"></a>
-<span class="sourceLineNo">2266</span>    byte[] qual = Bytes.toBytes("qual");<a name="line.2266"></a>
-<span class="sourceLineNo">2267</span><a name="line.2267"></a>
-<span class="sourceLineNo">2268</span>    // add data with LATEST_TIMESTAMP, put without WAL<a name="line.2268"></a>
-<span class="sourceLineNo">2269</span>    Put put = new Put(row);<a name="line.2269"></a>
-<span class="sourceLineNo">2270</span>    put.addColumn(fam, qual, HConstants.LATEST_TIMESTAMP, Bytes.toBytes("value"));<a name="line.2270"></a>
-<span class="sourceLineNo">2271</span>    region.put(put);<a name="line.2271"></a>
-<span class="sourceLineNo">2272</span><a name="line.2272"></a>
-<span class="sourceLineNo">2273</span>    // Make sure it shows up with an actual timestamp<a name="line.2273"></a>
-<span class="sourceLineNo">2274</span>    Get get = new Get(row).addColumn(fam, qual);<a name="line.2274"></a>
-<span class="sourceLineNo">2275</span>    Result result = region.get(get);<a name="line.2275"></a>
-<span class="sourceLineNo">2276</span>    assertEquals(1, result.size());<a name="line.2276"></a>
-<span class="sourceLineNo">2277</span>    Cell kv = result.rawCells()[0];<a name="line.2277"></a>
-<span class="sourceLineNo">2278</span>    LOG.info("Got: " + kv);<a name="line.2278"></a>
-<span class="sourceLineNo">2279</span>    assertTrue("LATEST_TIMESTAMP was not replaced with real timestamp",<a name="line.2279"></a>
-<span class="sourceLineNo">2280</span>        kv.getTimestamp() != HConstants.LATEST_TIMESTAMP);<a name="line.2280"></a>
-<span class="sourceLineNo">2281</span><a name="line.2281"></a>
-<span class="sourceLineNo">2282</span>    // Check same with WAL enabled (historically these took different<a name="line.2282"></a>
-<span class="sourceLineNo">2283</span>    // code paths, so check both)<a name="line.2283"></a>
-<span class="sourceLineNo">2284</span>    row = Bytes.toBytes("row2");<a name="line.2284"></a>
-<span class="sourceLineNo">2285</span>    put = new Put(row);<a name="line.2285"></a>
-<span class="sourceLineNo">2286</span>    put.addColumn(fam, qual, HConstants.LATEST_TIMESTAMP, Bytes.toBytes("value"));<a name="line.2286"></a>
-<span class="sourceLineNo">2287</span>    region.put(put);<a name="line.2287"></a>
-<span class="sourceLineNo">2288</span><a name="line.2288"></a>
-<span class="sourceLineNo">2289</span>    // Make sure it shows up with an actual timestamp<a name="line.2289"></a>
-<span class="sourceLineNo">2290</span>    get = new Get(row).addColumn(fam, qual);<a name="line.2290"></a>
-<span class="sourceLineNo">2291</span>    result = region.get(get);<a name="line.2291"></a>
-<span class="sourceLineNo">2292</span>    assertEquals(1, result.size());<a name="line.2292"></a>
-<span class="sourceLineNo">2293</span>    kv = result.rawCells()[0];<a name="line.2293"></a>
-<span class="sourceLineNo">2294</span>    LOG.info("Got: " + kv);<a name="line.2294"></a>
-<span class="sourceLineNo">2295</span>    assertTrue("LATEST_TIMESTAMP was not replaced with real timestamp",<a name="line.2295"></a>
-<span class="sourceLineNo">2296</span>        kv.getTimestamp() != HConstants.LATEST_TIMESTAMP);<a name="line.2296"></a>
-<span class="sourceLineNo">2297</span>  }<a name="line.2297"></a>
-<span class="sourceLineNo">2298</span><a name="line.2298"></a>
-<span class="sourceLineNo">2299</span>  /**<a name="line.2299"></a>
-<span class="sourceLineNo">2300</span>   * Tests that there is server-side filtering for invalid timestamp upper<a name="line.2300"></a>
-<span class="sourceLineNo">2301</span>   * bound. Note that the timestamp lower bound is automatically handled for us<a name="line.2301"></a>
-<span class="sourceLineNo">2302</span>   * by the TTL field.<a name="line.2302"></a>
-<span class="sourceLineNo">2303</span>   */<a name="line.2303"></a>
-<span class="sourceLineNo">2304</span>  @Test<a name="line.2304"></a>
-<span class="sourceLineNo">2305</span>  public void testPutWithTsSlop() throws IOException {<a name="line.2305"></a>
-<span class="sourceLineNo">2306</span>    byte[] fam = Bytes.toBytes("info");<a name="line.2306"></a>
-<span class="sourceLineNo">2307</span>    byte[][] families = { fam };<a name="line.2307"></a>
-<span class="sourceLineNo">2308</span><a name="line.2308"></a>
-<span class="sourceLineNo">2309</span>    // add data with a timestamp that is too recent for range. Ensure assert<a name="line.2309"></a>
-<span class="sourceLineNo">2310</span>    CONF.setInt("hbase.hregion.keyvalue.timestamp.slop.millisecs", 1000);<a name="line.2310"></a>
-<span class="sourceLineNo">2311</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2311"></a>
-<span class="sourceLineNo">2312</span>    boolean caughtExcep = false;<a name="line.2312"></a>
-<span class="sourceLineNo">2313</span>    try {<a name="line.2313"></a>
-<span class="sourceLineNo">2314</span>      // no TS specified == use latest. should not error<a name="line.2314"></a>
-<span class="sourceLineNo">2315</span>      region.put(new Put(row).addColumn(fam, Bytes.toBytes("qual"), Bytes.toBytes("value")));<a name="line.2315"></a>
-<span class="sourceLineNo">2316</span>      // TS out of range. should error<a name="line.2316"></a>
-<span class="sourceLineNo">2317</span>      region.put(new Put(row).addColumn(fam, Bytes.toBytes("qual"),<a name="line.2317"></a>
-<span class="sourceLineNo">2318</span>          System.currentTimeMillis() + 2000, Bytes.toBytes("value")));<a name="line.2318"></a>
-<span class="sourceLineNo">2319</span>      fail("Expected IOE for TS out of configured timerange");<a name="line.2319"></a>
-<span class="sourceLineNo">2320</span>    } catch (FailedSanityCheckException ioe) {<a name="line.2320"></a>
-<span class="sourceLineNo">2321</span>      LOG.debug("Received expected exception", ioe);<a name="line.2321"></a>
-<span class="sourceLineNo">2322</span>      caughtExcep = true;<a name="line.2322"></a>
-<span class="sourceLineNo">2323</span>    }<a name="line.2323"></a>
-<span class="sourceLineNo">2324</span>    assertTrue("Should catch FailedSanityCheckException", caughtExcep);<a name="line.2324"></a>
-<span class="sourceLineNo">2325</span>  }<a name="line.2325"></a>
-<span class="sourceLineNo">2326</span><a name="line.2326"></a>
-<span class="sourceLineNo">2327</span>  @Test<a name="line.2327"></a>
-<span class="sourceLineNo">2328</span>  public void testScanner_DeleteOneFamilyNotAnother() throws IOException {<a name="line.2328"></a>
-<span class="sourceLineNo">2329</span>    byte[] fam1 = Bytes.toBytes("columnA");<a name="line.2329"></a>
-<span class="sourceLineNo">2330</span>    byte[] fam2 = Bytes.toBytes("columnB");<a name="line.2330"></a>
-<span class="sourceLineNo">2331</span>    this.region = initHRegion(tableName, method, CONF, fam1, fam2);<a name="line.2331"></a>
-<span class="sourceLineNo">2332</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.2332"></a>
-<span class="sourceLineNo">2333</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.2333"></a>
-<span class="sourceLineNo">2334</span><a name="line.2334"></a>
-<span class="sourceLineNo">2335</span>    byte[] value = Bytes.toBytes("value");<a name="line.2335"></a>
-<span class="sourceLineNo">2336</span><a name="line.2336"></a>
-<span class="sourceLineNo">2337</span>    Delete delete = new Delete(rowA);<a name="line.2337"></a>
-<span class="sourceLineNo">2338</span>    delete.addFamily(fam1);<a name="line.2338"></a>
-<span class="sourceLineNo">2339</span><a name="line.2339"></a>
-<span class="sourceLineNo">2340</span>    region.delete(delete);<a name="line.2340"></a>
-<span class="sourceLineNo">2341</span><a name="line.2341"></a>
-<span class="sourceLineNo">2342</span>    // now create data.<a name="line.2342"></a>
-<span class="sourceLineNo">2343</span>    Put put = new Put(rowA);<a name="line.2343"></a>
-<span class="sourceLineNo">2344</span>    put.addColumn(fam2, null, value);<a name="line.2344"></a>
-<span class="sourceLineNo">2345</span>    region.put(put);<a name="line.2345"></a>
-<span class="sourceLineNo">2346</span><a name="line.2346"></a>
-<span class="sourceLineNo">2347</span>    put = new Put(rowB);<a name="line.2347"></a>
-<span class="sourceLineNo">2348</span>    put.addColumn(fam1, null, value);<a name="line.2348"></a>
-<span class="sourceLineNo">2349</span>    put.addColumn(fam2, null, value);<a name="line.2349"></a>
-<span class="sourceLineNo">2350</span>    region.put(put);<a name="line.2350"></a>
-<span class="sourceLineNo">2351</span><a name="line.2351"></a>
-<span class="sourceLineNo">2352</span>    Scan scan = new Scan();<a name="line.2352"></a>
-<span class="sourceLineNo">2353</span>    scan.addFamily(fam1).addFamily(fam2);<a name="line.2353"></a>
-<span class="sourceLineNo">2354</span>    InternalScanner s = region.getScanner(scan);<a name="line.2354"></a>
-<span class="sourceLineNo">2355</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.2355"></a>
-<span class="sourceLineNo">2356</span>    s.next(results);<a name="line.2356"></a>
-<span class="sourceLineNo">2357</span>    assertTrue(CellUtil.matchingRows(results.get(0), rowA));<a name="line.2357"></a>
-<span class="sourceLineNo">2358</span><a name="line.2358"></a>
-<span class="sourceLineNo">2359</span>    results.clear();<a name="line.2359"></a>
-<span class="sourceLineNo">2360</span>    s.next(results);<a name="line.2360"></a>
-<span class="sourceLineNo">2361</span>    assertTrue(CellUtil.matchingRows(results.get(0), rowB));<a name="line.2361"></a>
-<span class="sourceLineNo">2362</span>  }<a name="line.2362"></a>
-<span class="sourceLineNo">2363</span><a name="line.2363"></a>
-<span class="sourceLineNo">2364</span>  @Test<a name="line.2364"></a>
-<span class="sourceLineNo">2365</span>  public void testDataInMemoryWithoutWAL() throws IOException {<a name="line.2365"></a>
-<span class="sourceLineNo">2366</span>    FileSystem fs = FileSystem.get(CONF);<a name="line.2366"></a>
-<span class="sourceLineNo">2367</span>    Path rootDir = new Path(dir + "testDataInMemoryWithoutWAL");<a name="line.2367"></a>
-<span class="sourceLineNo">2368</span>    FSHLog hLog = new FSHLog(fs, rootDir, "testDataInMemoryWithoutWAL", CONF);<a name="line.2368"></a>
-<span class="sourceLineNo">2369</span>    hLog.init();<a name="line.2369"></a>
-<span class="sourceLineNo">2370</span>    // This chunk creation is done throughout the code base. Do we want to move it into core?<a name="line.2370"></a>
-<span class="sourceLineNo">2371</span>    // It is missing from this test. W/o it we NPE.<a name="line.2371"></a>
-<span class="sourceLineNo">2372</span>    ChunkCreator.initialize(MemStoreLABImpl.CHUNK_SIZE_DEFAULT, false, 0, 0, 0, null);<a name="line.2372"></a>
-<span class="sourceLineNo">2373</span>    region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, hLog,<a name="line.2373"></a>
-<span class="sourceLineNo">2374</span>        COLUMN_FAMILY_BYTES);<a name="line.2374"></a>
-<span class="sourceLineNo">2375</span><a name="line.2375"></a>
-<span class="sourceLineNo">2376</span>    Cell originalCell = CellUtil.createCell(row, COLUMN_FAMILY_BYTES, qual1,<a name="line.2376"></a>
-<span class="sourceLineNo">2377</span>      System.currentTimeMillis(), KeyValue.Type.Put.getCode(), value1);<a name="line.2377"></a>
-<span class="sourceLineNo">2378</span>    final long originalSize = originalCell.getSerializedSize();<a name="line.2378"></a>
-<span class="sourceLineNo">2379</span><a name="line.2379"></a>
-<span class="sourceLineNo">2380</span>    Cell addCell = CellUtil.createCell(row, COLUMN_FAMILY_BYTES, qual1,<a name="line.2380"></a>
-<span class="sourceLineNo">2381</span>      System.currentTimeMillis(), KeyValue.Type.Put.getCode(), Bytes.toBytes("xxxxxxxxxx"));<a name="line.2381"></a>
-<span class="sourceLineNo">2382</span>    final long addSize = addCell.getSerializedSize();<a name="line.2382"></a>
-<span class="sourceLineNo">2383</span><a name="line.2383"></a>
-<span class="sourceLineNo">2384</span>    LOG.info("originalSize:" + originalSize<a name="line.2384"></a>
-<span class="sourceLineNo">2385</span>      + ", addSize:" + addSize);<a name="line.2385"></a>
-<span class="sourceLineNo">2386</span>    // start test. We expect that the addPut's durability will be replaced<a name="line.2386"></a>
-<span class="sourceLineNo">2387</span>    // by originalPut's durability.<a name="line.2387"></a>
-<span class="sourceLineNo">2388</span><a name="line.2388"></a>
-<span class="sourceLineNo">2389</span>    // case 1:<a name="line.2389"></a>
-<span class="sourceLineNo">2390</span>    testDataInMemoryWithoutWAL(region,<a name="line.2390"></a>
-<span class="sourceLineNo">2391</span>            new Put(row).add(originalCell).setDurability(Durability.SKIP_WAL),<a name="line.2391"></a>
-<span class="sourceLineNo">2392</span>            new Put(row).add(addCell).setDurability(Durability.SKIP_WAL),<a name="line.2392"></a>
-<span class="sourceLineNo">2393</span>            originalSize + addSize);<a name="line.2393"></a>
-<span class="sourceLineNo">2394</span><a name="line.2394"></a>
-<span class="sourceLineNo">2395</span>    // case 2:<a name="line.2395"></a>
-<span class="sourceLineNo">2396</span>    testDataInMemoryWithoutWAL(region,<a name="line.2396"></a>
-<span class="sourceLineNo">2397</span>            new Put(row).add(originalCell).setDurability(Durability.SKIP_WAL),<a name="line.2397"></a>
-<span class="sourceLineNo">2398</span>            new Put(row).add(addCell).setDurability(Durability.SYNC_WAL),<a name="line.2398"></a>
-<span class="sourceLineNo">2399</span>            originalSize + addSize);<a name="line.2399"></a>
-<span class="sourceLineNo">2400</span><a name="line.2400"></a>
-<span class="sourceLineNo">2401</span>    // case 3:<a name="line.2401"></a>
-<span class="sourceLineNo">2402</span>    testDataInMemoryWithoutWAL(region,<a name="line.2402"></a>
-<span class="sourceLineNo">2403</span>            new Put(row).add(originalCell).setDurability(Durability.SYNC_WAL),<a name="line.2403"></a>
-<span class="sourceLineNo">2404</span>            new Put(row).add(addCell).setDurability(Durability.SKIP_WAL),<a name="line.2404"></a>
-<span class="sourceLineNo">2405</span>            0);<a name="line.2405"></a>
-<span class="sourceLineNo">2406</span><a name="line.2406"></a>
-<span class="sourceLineNo">2407</span>    // case 4:<a name="line.2407"></a>
-<span class="sourceLineNo">2408</span>    testDataInMemoryWithoutWAL(region,<a name="line.2408"></a>
-<span class="sourceLineNo">2409</span>            new Put(row).add(originalCell).setDurability(Durability.SYNC_WAL),<a name="line.2409"></a>
-<span class="sourceLineNo">2410</span>            new Put(row).add(addCell).setDurability(Durability.SYNC_WAL),<a name="line.2410"></a>
-<span class="sourceLineNo">2411</span>            0);<a name="line.2411"></a>
-<span class="sourceLineNo">2412</span>  }<a name="line.2412"></a>
-<span class="sourceLineNo">2413</span><a name="line.2413"></a>
-<span class="sourceLineNo">2414</span>  private static void testDataInMemoryWithoutWAL(HRegion region, Put originalPut,<a name="line.2414"></a>
-<span class="sourceLineNo">2415</span>          final Put addPut, long delta) throws IOException {<a name="line.2415"></a>
-<span class="sourceLineNo">2416</span>    final long initSize = region.getDataInMemoryWithoutWAL();<a name="line.2416"></a>
-<span class="sourceLineNo">2417</span>    // save normalCPHost and replaced by mockedCPHost<a name="line.2417"></a>
-<span class="sourceLineNo">2418</span>    RegionCoprocessorHost normalCPHost = region.getCoprocessorHost();<a name="line.2418"></a>
-<span class="sourceLineNo">2419</span>    RegionCoprocessorHost mockedCPHost = Mockito.mock(RegionCoprocessorHost.class);<a name="line.2419"></a>
-<span class="sourceLineNo">2420</span>    // Because the preBatchMutate returns void, we can't do usual Mockito when...then form. Must<a name="line.2420"></a>
-<span class="sourceLineNo">2421</span>    // do below format (from Mockito doc).<a name="line.2421"></a>
-<span class="sourceLineNo">2422</span>    Mockito.doAnswer(new Answer&lt;Void&gt;() {<a name="line.2422"></a>
-<span class="sourceLineNo">2423</span>      @Override<a name="line.2423"></a>
-<span class="sourceLineNo">2424</span>      public Void answer(InvocationOnMock invocation) throws Throwable {<a name="line.2424"></a>
-<span class="sourceLineNo">2425</span>        MiniBatchOperationInProgress&lt;Mutation&gt; mb = invocation.getArgument(0);<a name="line.2425"></a>
-<span class="sourceLineNo">2426</span>        mb.addOperationsFromCP(0, new Mutation[]{addPut});<a name="line.2426"></a>
-<span class="sourceLineNo">2427</span>        return null;<a name="line.2427"></a>
-<span class="sourceLineNo">2428</span>      }<a name="line.2428"></a>
-<span class="sourceLineNo">2429</span>    }).when(mockedCPHost).preBatchMutate(Mockito.isA(MiniBatchOperationInProgress.class));<a name="line.2429"></a>
-<span class="sourceLineNo">2430</span>    region.setCoprocessorHost(mockedCPHost);<a name="line.2430"></a>
-<span class="sourceLineNo">2431</span>    region.put(originalPut);<a name="line.2431"></a>
-<span class="sourceLineNo">2432</span>    region.setCoprocessorHost(normalCPHost);<a name="line.2432"></a>
-<span class="sourceLineNo">2433</span>    final long finalSize = region.getDataInMemoryWithoutWAL();<a name="line.2433"></a>
-<span class="sourceLineNo">2434</span>    assertEquals("finalSize:" + finalSize + ", initSize:"<a name="line.2434"></a>
-<span class="sourceLineNo">2435</span>      + initSize + ", delta:" + delta,finalSize, initSize + delta);<a name="line.2435"></a>
-<span class="sourceLineNo">2436</span>  }<a name="line.2436"></a>
-<span class="sourceLineNo">2437</span><a name="line.2437"></a>
-<span class="sourceLineNo">2438</span>  @Test<a name="line.2438"></a>
-<span class="sourceLineNo">2439</span>  public void testDeleteColumns_PostInsert() throws IOException, InterruptedException {<a name="line.2439"></a>
-<span class="sourceLineNo">2440</span>    Delete delete = new Delete(row);<a name="line.2440"></a>
-<span class="sourceLineNo">2441</span>    delete.addColumns(fam1, qual1);<a name="line.2441"></a>
-<span class="sourceLineNo">2442</span>    doTestDelete_AndPostInsert(delete);<a name="line.2442"></a>
-<span class="sourceLineNo">2443</span>  }<a name="line.2443"></a>
-<span class="sourceLineNo">2444</span><a name="line.2444"></a>
-<span class="sourceLineNo">2445</span>  @Test<a name="line.2445"></a>
-<span class="sourceLineNo">2446</span>  public void testaddFamily_PostInsert() throws IOException, InterruptedException {<a name="line.2446"></a>
-<span class="sourceLineNo">2447</span>    Delete delete = new Delete(row);<a name="line.2447"></a>
-<span class="sourceLineNo">2448</span>    delete.addFamily(fam1);<a name="line.2448"></a>
-<span class="sourceLineNo">2449</span>    doTestDelete_AndPostInsert(delete);<a name="line.2449"></a>
-<span class="sourceLineNo">2450</span>  }<a name="line.2450"></a>
-<span class="sourceLineNo">2451</span><a name="line.2451"></a>
-<span class="sourceLineNo">2452</span>  public void doTestDelete_AndPostInsert(Delete delete) throws IOException, InterruptedException {<a name="line.2452"></a>
-<span class="sourceLineNo">2453</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2453"></a>
-<span class="sourceLineNo">2454</span>    EnvironmentEdgeManagerTestHelper.injectEdge(new IncrementingEnvironmentEdge());<a name="line.2454"></a>
-<span class="sourceLineNo">2455</span>    Put put = new Put(row);<a name="line.2455"></a>
-<span class="sourceLineNo">2456</span>    put.addColumn(fam1, qual1, value1);<a name="line.2456"></a>
-<span class="sourceLineNo">2457</span>    region.put(put);<a name="line.2457"></a>
-<span class="sourceLineNo">2458</span><a name="line.2458"></a>
-<span class="sourceLineNo">2459</span>    // now delete the value:<a name="line.2459"></a>
-<span class="sourceLineNo">2460</span>    region.delete(delete);<a name="line.2460"></a>
+<span class="sourceLineNo">2120</span>    delete.addColumn(fam1, qual);<a name="line.2120"></a>
+<span class="sourceLineNo">2121</span>    region.delete(delete);<a name="line.2121"></a>
+<span class="sourceLineNo">2122</span><a name="line.2122"></a>
+<span class="sourceLineNo">2123</span>    Get get = new Get(row1);<a name="line.2123"></a>
+<span class="sourceLineNo">2124</span>    get.addFamily(fam1);<a name="line.2124"></a>
+<span class="sourceLineNo">2125</span>    Result r = region.get(get);<a name="line.2125"></a>
+<span class="sourceLineNo">2126</span>    assertEquals(0, r.size());<a name="line.2126"></a>
+<span class="sourceLineNo">2127</span>  }<a name="line.2127"></a>
+<span class="sourceLineNo">2128</span><a name="line.2128"></a>
+<span class="sourceLineNo">2129</span>  @Test<a name="line.2129"></a>
+<span class="sourceLineNo">2130</span>  public void testDelete_CheckFamily() throws IOException {<a name="line.2130"></a>
+<span class="sourceLineNo">2131</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2131"></a>
+<span class="sourceLineNo">2132</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2132"></a>
+<span class="sourceLineNo">2133</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2133"></a>
+<span class="sourceLineNo">2134</span>    byte[] fam3 = Bytes.toBytes("fam3");<a name="line.2134"></a>
+<span class="sourceLineNo">2135</span>    byte[] fam4 = Bytes.toBytes("fam4");<a name="line.2135"></a>
+<span class="sourceLineNo">2136</span><a name="line.2136"></a>
+<span class="sourceLineNo">2137</span>    // Setting up region<a name="line.2137"></a>
+<span class="sourceLineNo">2138</span>    this.region = initHRegion(tableName, method, CONF, fam1, fam2, fam3);<a name="line.2138"></a>
+<span class="sourceLineNo">2139</span>    List&lt;Cell&gt; kvs = new ArrayList&lt;&gt;();<a name="line.2139"></a>
+<span class="sourceLineNo">2140</span>    kvs.add(new KeyValue(row1, fam4, null, null));<a name="line.2140"></a>
+<span class="sourceLineNo">2141</span><a name="line.2141"></a>
+<span class="sourceLineNo">2142</span>    // testing existing family<a name="line.2142"></a>
+<span class="sourceLineNo">2143</span>    byte[] family = fam2;<a name="line.2143"></a>
+<span class="sourceLineNo">2144</span>    NavigableMap&lt;byte[], List&lt;Cell&gt;&gt; deleteMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2144"></a>
+<span class="sourceLineNo">2145</span>    deleteMap.put(family, kvs);<a name="line.2145"></a>
+<span class="sourceLineNo">2146</span>    region.delete(deleteMap, Durability.SYNC_WAL);<a name="line.2146"></a>
+<span class="sourceLineNo">2147</span><a name="line.2147"></a>
+<span class="sourceLineNo">2148</span>    // testing non existing family<a name="line.2148"></a>
+<span class="sourceLineNo">2149</span>    boolean ok = false;<a name="line.2149"></a>
+<span class="sourceLineNo">2150</span>    family = fam4;<a name="line.2150"></a>
+<span class="sourceLineNo">2151</span>    try {<a name="line.2151"></a>
+<span class="sourceLineNo">2152</span>      deleteMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2152"></a>
+<span class="sourceLineNo">2153</span>      deleteMap.put(family, kvs);<a name="line.2153"></a>
+<span class="sourceLineNo">2154</span>      region.delete(deleteMap, Durability.SYNC_WAL);<a name="line.2154"></a>
+<span class="sourceLineNo">2155</span>    } catch (Exception e) {<a name="line.2155"></a>
+<span class="sourceLineNo">2156</span>      ok = true;<a name="line.2156"></a>
+<span class="sourceLineNo">2157</span>    }<a name="line.2157"></a>
+<span class="sourceLineNo">2158</span>    assertTrue("Family " + new String(family, StandardCharsets.UTF_8) + " does exist", ok);<a name="line.2158"></a>
+<span class="sourceLineNo">2159</span>  }<a name="line.2159"></a>
+<span class="sourceLineNo">2160</span><a name="line.2160"></a>
+<span class="sourceLineNo">2161</span>  @Test<a name="line.2161"></a>
+<span class="sourceLineNo">2162</span>  public void testDelete_mixed() throws IOException, InterruptedException {<a name="line.2162"></a>
+<span class="sourceLineNo">2163</span>    byte[] fam = Bytes.toBytes("info");<a name="line.2163"></a>
+<span class="sourceLineNo">2164</span>    byte[][] families = { fam };<a name="line.2164"></a>
+<span class="sourceLineNo">2165</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2165"></a>
+<span class="sourceLineNo">2166</span>    EnvironmentEdgeManagerTestHelper.injectEdge(new IncrementingEnvironmentEdge());<a name="line.2166"></a>
+<span class="sourceLineNo">2167</span><a name="line.2167"></a>
+<span class="sourceLineNo">2168</span>    byte[] row = Bytes.toBytes("table_name");<a name="line.2168"></a>
+<span class="sourceLineNo">2169</span>    // column names<a name="line.2169"></a>
+<span class="sourceLineNo">2170</span>    byte[] serverinfo = Bytes.toBytes("serverinfo");<a name="line.2170"></a>
+<span class="sourceLineNo">2171</span>    byte[] splitA = Bytes.toBytes("splitA");<a name="line.2171"></a>
+<span class="sourceLineNo">2172</span>    byte[] splitB = Bytes.toBytes("splitB");<a name="line.2172"></a>
+<span class="sourceLineNo">2173</span><a name="line.2173"></a>
+<span class="sourceLineNo">2174</span>    // add some data:<a name="line.2174"></a>
+<span class="sourceLineNo">2175</span>    Put put = new Put(row);<a name="line.2175"></a>
+<span class="sourceLineNo">2176</span>    put.addColumn(fam, splitA, Bytes.toBytes("reference_A"));<a name="line.2176"></a>
+<span class="sourceLineNo">2177</span>    region.put(put);<a name="line.2177"></a>
+<span class="sourceLineNo">2178</span><a name="line.2178"></a>
+<span class="sourceLineNo">2179</span>    put = new Put(row);<a name="line.2179"></a>
+<span class="sourceLineNo">2180</span>    put.addColumn(fam, splitB, Bytes.toBytes("reference_B"));<a name="line.2180"></a>
+<span class="sourceLineNo">2181</span>    region.put(put);<a name="line.2181"></a>
+<span class="sourceLineNo">2182</span><a name="line.2182"></a>
+<span class="sourceLineNo">2183</span>    put = new Put(row);<a name="line.2183"></a>
+<span class="sourceLineNo">2184</span>    put.addColumn(fam, serverinfo, Bytes.toBytes("ip_address"));<a name="line.2184"></a>
+<span class="sourceLineNo">2185</span>    region.put(put);<a name="line.2185"></a>
+<span class="sourceLineNo">2186</span><a name="line.2186"></a>
+<span class="sourceLineNo">2187</span>    // ok now delete a split:<a name="line.2187"></a>
+<span class="sourceLineNo">2188</span>    Delete delete = new Delete(row);<a name="line.2188"></a>
+<span class="sourceLineNo">2189</span>    delete.addColumns(fam, splitA);<a name="line.2189"></a>
+<span class="sourceLineNo">2190</span>    region.delete(delete);<a name="line.2190"></a>
+<span class="sourceLineNo">2191</span><a name="line.2191"></a>
+<span class="sourceLineNo">2192</span>    // assert some things:<a name="line.2192"></a>
+<span class="sourceLineNo">2193</span>    Get get = new Get(row).addColumn(fam, serverinfo);<a name="line.2193"></a>
+<span class="sourceLineNo">2194</span>    Result result = region.get(get);<a name="line.2194"></a>
+<span class="sourceLineNo">2195</span>    assertEquals(1, result.size());<a name="line.2195"></a>
+<span class="sourceLineNo">2196</span><a name="line.2196"></a>
+<span class="sourceLineNo">2197</span>    get = new Get(row).addColumn(fam, splitA);<a name="line.2197"></a>
+<span class="sourceLineNo">2198</span>    result = region.get(get);<a name="line.2198"></a>
+<span class="sourceLineNo">2199</span>    assertEquals(0, result.size());<a name="line.2199"></a>
+<span class="sourceLineNo">2200</span><a name="line.2200"></a>
+<span class="sourceLineNo">2201</span>    get = new Get(row).addColumn(fam, splitB);<a name="line.2201"></a>
+<span class="sourceLineNo">2202</span>    result = region.get(get);<a name="line.2202"></a>
+<span class="sourceLineNo">2203</span>    assertEquals(1, result.size());<a name="line.2203"></a>
+<span class="sourceLineNo">2204</span><a name="line.2204"></a>
+<span class="sourceLineNo">2205</span>    // Assert that after a delete, I can put.<a name="line.2205"></a>
+<span class="sourceLineNo">2206</span>    put = new Put(row);<a name="line.2206"></a>
+<span class="sourceLineNo">2207</span>    put.addColumn(fam, splitA, Bytes.toBytes("reference_A"));<a name="line.2207"></a>
+<span class="sourceLineNo">2208</span>    region.put(put);<a name="line.2208"></a>
+<span class="sourceLineNo">2209</span>    get = new Get(row);<a name="line.2209"></a>
+<span class="sourceLineNo">2210</span>    result = region.get(get);<a name="line.2210"></a>
+<span class="sourceLineNo">2211</span>    assertEquals(3, result.size());<a name="line.2211"></a>
+<span class="sourceLineNo">2212</span><a name="line.2212"></a>
+<span class="sourceLineNo">2213</span>    // Now delete all... then test I can add stuff back<a name="line.2213"></a>
+<span class="sourceLineNo">2214</span>    delete = new Delete(row);<a name="line.2214"></a>
+<span class="sourceLineNo">2215</span>    region.delete(delete);<a name="line.2215"></a>
+<span class="sourceLineNo">2216</span>    assertEquals(0, region.get(get).size());<a name="line.2216"></a>
+<span class="sourceLineNo">2217</span><a name="line.2217"></a>
+<span class="sourceLineNo">2218</span>    region.put(new Put(row).addColumn(fam, splitA, Bytes.toBytes("reference_A")));<a name="line.2218"></a>
+<span class="sourceLineNo">2219</span>    result = region.get(get);<a name="line.2219"></a>
+<span class="sourceLineNo">2220</span>    assertEquals(1, result.size());<a name="line.2220"></a>
+<span class="sourceLineNo">2221</span>  }<a name="line.2221"></a>
+<span class="sourceLineNo">2222</span><a name="line.2222"></a>
+<span class="sourceLineNo">2223</span>  @Test<a name="line.2223"></a>
+<span class="sourceLineNo">2224</span>  public void testDeleteRowWithFutureTs() throws IOException {<a name="line.2224"></a>
+<span class="sourceLineNo">2225</span>    byte[] fam = Bytes.toBytes("info");<a name="line.2225"></a>
+<span class="sourceLineNo">2226</span>    byte[][] families = { fam };<a name="line.2226"></a>
+<span class="sourceLineNo">2227</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2227"></a>
+<span class="sourceLineNo">2228</span>    byte[] row = Bytes.toBytes("table_name");<a name="line.2228"></a>
+<span class="sourceLineNo">2229</span>    // column names<a name="line.2229"></a>
+<span class="sourceLineNo">2230</span>    byte[] serverinfo = Bytes.toBytes("serverinfo");<a name="line.2230"></a>
+<span class="sourceLineNo">2231</span><a name="line.2231"></a>
+<span class="sourceLineNo">2232</span>    // add data in the far future<a name="line.2232"></a>
+<span class="sourceLineNo">2233</span>    Put put = new Put(row);<a name="line.2233"></a>
+<span class="sourceLineNo">2234</span>    put.addColumn(fam, serverinfo, HConstants.LATEST_TIMESTAMP - 5, Bytes.toBytes("value"));<a name="line.2234"></a>
+<span class="sourceLineNo">2235</span>    region.put(put);<a name="line.2235"></a>
+<span class="sourceLineNo">2236</span><a name="line.2236"></a>
+<span class="sourceLineNo">2237</span>    // now delete something in the present<a name="line.2237"></a>
+<span class="sourceLineNo">2238</span>    Delete delete = new Delete(row);<a name="line.2238"></a>
+<span class="sourceLineNo">2239</span>    region.delete(delete);<a name="line.2239"></a>
+<span class="sourceLineNo">2240</span><a name="line.2240"></a>
+<span class="sourceLineNo">2241</span>    // make sure we still see our data<a name="line.2241"></a>
+<span class="sourceLineNo">2242</span>    Get get = new Get(row).addColumn(fam, serverinfo);<a name="line.2242"></a>
+<span class="sourceLineNo">2243</span>    Result result = region.get(get);<a name="line.2243"></a>
+<span class="sourceLineNo">2244</span>    assertEquals(1, result.size());<a name="line.2244"></a>
+<span class="sourceLineNo">2245</span><a name="line.2245"></a>
+<span class="sourceLineNo">2246</span>    // delete the future row<a name="line.2246"></a>
+<span class="sourceLineNo">2247</span>    delete = new Delete(row, HConstants.LATEST_TIMESTAMP - 3);<a name="line.2247"></a>
+<span class="sourceLineNo">2248</span>    region.delete(delete);<a name="line.2248"></a>
+<span class="sourceLineNo">2249</span><a name="line.2249"></a>
+<span class="sourceLineNo">2250</span>    // make sure it is gone<a name="line.2250"></a>
+<span class="sourceLineNo">2251</span>    get = new Get(row).addColumn(fam, serverinfo);<a name="line.2251"></a>
+<span class="sourceLineNo">2252</span>    result = region.get(get);<a name="line.2252"></a>
+<span class="sourceLineNo">2253</span>    assertEquals(0, result.size());<a name="line.2253"></a>
+<span class="sourceLineNo">2254</span>  }<a name="line.2254"></a>
+<span class="sourceLineNo">2255</span><a name="line.2255"></a>
+<span class="sourceLineNo">2256</span>  /**<a name="line.2256"></a>
+<span class="sourceLineNo">2257</span>   * Tests that the special LATEST_TIMESTAMP option for puts gets replaced by<a name="line.2257"></a>
+<span class="sourceLineNo">2258</span>   * the actual timestamp<a name="line.2258"></a>
+<span class="sourceLineNo">2259</span>   */<a name="line.2259"></a>
+<span class="sourceLineNo">2260</span>  @Test<a name="line.2260"></a>
+<span class="sourceLineNo">2261</span>  public void testPutWithLatestTS() throws IOException {<a name="line.2261"></a>
+<span class="sourceLineNo">2262</span>    byte[] fam = Bytes.toBytes("info");<a name="line.2262"></a>
+<span class="sourceLineNo">2263</span>    byte[][] families = { fam };<a name="line.2263"></a>
+<span class="sourceLineNo">2264</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2264"></a>
+<span class="sourceLineNo">2265</span>    byte[] row = Bytes.toBytes("row1");<a name="line.2265"></a>
+<span class="sourceLineNo">2266</span>    // column names<a name="line.2266"></a>
+<span class="sourceLineNo">2267</span>    byte[] qual = Bytes.toBytes("qual");<a name="line.2267"></a>
+<span class="sourceLineNo">2268</span><a name="line.2268"></a>
+<span class="sourceLineNo">2269</span>    // add data with LATEST_TIMESTAMP, put without WAL<a name="line.2269"></a>
+<span class="sourceLineNo">2270</span>    Put put = new Put(row);<a name="line.2270"></a>
+<span class="sourceLineNo">2271</span>    put.addColumn(fam, qual, HConstants.LATEST_TIMESTAMP, Bytes.toBytes("value"));<a name="line.2271"></a>
+<span class="sourceLineNo">2272</span>    region.put(put);<a name="line.2272"></a>
+<span class="sourceLineNo">2273</span><a name="line.2273"></a>
+<span class="sourceLineNo">2274</span>    // Make sure it shows up with an actual timestamp<a name="line.2274"></a>
+<span class="sourceLineNo">2275</span>    Get get = new Get(row).addColumn(fam, qual);<a name="line.2275"></a>
+<span class="sourceLineNo">2276</span>    Result result = region.get(get);<a name="line.2276"></a>
+<span class="sourceLineNo">2277</span>    assertEquals(1, result.size());<a name="line.2277"></a>
+<span class="sourceLineNo">2278</span>    Cell kv = result.rawCells()[0];<a name="line.2278"></a>
+<span class="sourceLineNo">2279</span>    LOG.info("Got: " + kv);<a name="line.2279"></a>
+<span class="sourceLineNo">2280</span>    assertTrue("LATEST_TIMESTAMP was not replaced with real timestamp",<a name="line.2280"></a>
+<span class="sourceLineNo">2281</span>        kv.getTimestamp() != HConstants.LATEST_TIMESTAMP);<a name="line.2281"></a>
+<span class="sourceLineNo">2282</span><a name="line.2282"></a>
+<span class="sourceLineNo">2283</span>    // Check same with WAL enabled (historically these took different<a name="line.2283"></a>
+<span class="sourceLineNo">2284</span>    // code paths, so check both)<a name="line.2284"></a>
+<span class="sourceLineNo">2285</span>    row = Bytes.toBytes("row2");<a name="line.2285"></a>
+<span class="sourceLineNo">2286</span>    put = new Put(row);<a name="line.2286"></a>
+<span class="sourceLineNo">2287</span>    put.addColumn(fam, qual, HConstants.LATEST_TIMESTAMP, Bytes.toBytes("value"));<a name="line.2287"></a>
+<span class="sourceLineNo">2288</span>    region.put(put);<a name="line.2288"></a>
+<span class="sourceLineNo">2289</span><a name="line.2289"></a>
+<span class="sourceLineNo">2290</span>    // Make sure it shows up with an actual timestamp<a name="line.2290"></a>
+<span class="sourceLineNo">2291</span>    get = new Get(row).addColumn(fam, qual);<a name="line.2291"></a>
+<span class="sourceLineNo">2292</span>    result = region.get(get);<a name="line.2292"></a>
+<span class="sourceLineNo">2293</span>    assertEquals(1, result.size());<a name="line.2293"></a>
+<span class="sourceLineNo">2294</span>    kv = result.rawCells()[0];<a name="line.2294"></a>
+<span class="sourceLineNo">2295</span>    LOG.info("Got: " + kv);<a name="line.2295"></a>
+<span class="sourceLineNo">2296</span>    assertTrue("LATEST_TIMESTAMP was not replaced with real timestamp",<a name="line.2296"></a>
+<span class="sourceLineNo">2297</span>        kv.getTimestamp() != HConstants.LATEST_TIMESTAMP);<a name="line.2297"></a>
+<span class="sourceLineNo">2298</span>  }<a name="line.2298"></a>
+<span class="sourceLineNo">2299</span><a name="line.2299"></a>
+<span class="sourceLineNo">2300</span>  /**<a name="line.2300"></a>
+<span class="sourceLineNo">2301</span>   * Tests that there is server-side filtering for invalid timestamp upper<a name="line.2301"></a>
+<span class="sourceLineNo">2302</span>   * bound. Note that the timestamp lower bound is automatically handled for us<a name="line.2302"></a>
+<span class="sourceLineNo">2303</span>   * by the TTL field.<a name="line.2303"></a>
+<span class="sourceLineNo">2304</span>   */<a name="line.2304"></a>
+<span class="sourceLineNo">2305</span>  @Test<a name="line.2305"></a>
+<span class="sourceLineNo">2306</span>  public void testPutWithTsSlop() throws IOException {<a name="line.2306"></a>
+<span class="sourceLineNo">2307</span>    byte[] fam = Bytes.toBytes("info");<a name="line.2307"></a>
+<span class="sourceLineNo">2308</span>    byte[][] families = { fam };<a name="line.2308"></a>
+<span class="sourceLineNo">2309</span><a name="line.2309"></a>
+<span class="sourceLineNo">2310</span>    // add data with a timestamp that is too recent for range. Ensure assert<a name="line.2310"></a>
+<span class="sourceLineNo">2311</span>    CONF.setInt("hbase.hregion.keyvalue.timestamp.slop.millisecs", 1000);<a name="line.2311"></a>
+<span class="sourceLineNo">2312</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2312"></a>
+<span class="sourceLineNo">2313</span>    boolean caughtExcep = false;<a name="line.2313"></a>
+<span class="sourceLineNo">2314</span>    try {<a name="line.2314"></a>
+<span class="sourceLineNo">2315</span>      // no TS specified == use latest. should not error<a name="line.2315"></a>
+<span class="sourceLineNo">2316</span>      region.put(new Put(row).addColumn(fam, Bytes.toBytes("qual"), Bytes.toBytes("value")));<a name="line.2316"></a>
+<span class="sourceLineNo">2317</span>      // TS out of range. should error<a name="line.2317"></a>
+<span class="sourceLineNo">2318</span>      region.put(new Put(row).addColumn(fam, Bytes.toBytes("qual"),<a name="line.2318"></a>
+<span class="sourceLineNo">2319</span>          System.currentTimeMillis() + 2000, Bytes.toBytes("value")));<a name="line.2319"></a>
+<span class="sourceLineNo">2320</span>      fail("Expected IOE for TS out of configured timerange");<a name="line.2320"></a>
+<span class="sourceLineNo">2321</span>    } catch (FailedSanityCheckException ioe) {<a name="line.2321"></a>
+<span class="sourceLineNo">2322</span>      LOG.debug("Received expected exception", ioe);<a name="line.2322"></a>
+<span class="sourceLineNo">2323</span>      caughtExcep = true;<a name="line.2323"></a>
+<span class="sourceLineNo">2324</span>    }<a name="line.2324"></a>
+<span class="sourceLineNo">2325</span>    assertTrue("Should catch FailedSanityCheckException", caughtExcep);<a name="line.2325"></a>
+<span class="sourceLineNo">2326</span>  }<a name="line.2326"></a>
+<span class="sourceLineNo">2327</span><a name="line.2327"></a>
+<span class="sourceLineNo">2328</span>  @Test<a name="line.2328"></a>
+<span class="sourceLineNo">2329</span>  public void testScanner_DeleteOneFamilyNotAnother() throws IOException {<a name="line.2329"></a>
+<span class="sourceLineNo">2330</span>    byte[] fam1 = Bytes.toBytes("columnA");<a name="line.2330"></a>
+<span class="sourceLineNo">2331</span>    byte[] fam2 = Bytes.toBytes("columnB");<a name="line.2331"></a>
+<span class="sourceLineNo">2332</span>    this.region = initHRegion(tableName, method, CONF, fam1, fam2);<a name="line.2332"></a>
+<span class="sourceLineNo">2333</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.2333"></a>
+<span class="sourceLineNo">2334</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.2334"></a>
+<span class="sourceLineNo">2335</span><a name="line.2335"></a>
+<span class="sourceLineNo">2336</span>    byte[] value = Bytes.toBytes("value");<a name="line.2336"></a>
+<span class="sourceLineNo">2337</span><a name="line.2337"></a>
+<span class="sourceLineNo">2338</span>    Delete delete = new Delete(rowA);<a name="line.2338"></a>
+<span class="sourceLineNo">2339</span>    delete.addFamily(fam1);<a name="line.2339"></a>
+<span class="sourceLineNo">2340</span><a name="line.2340"></a>
+<span class="sourceLineNo">2341</span>    region.delete(delete);<a name="line.2341"></a>
+<span class="sourceLineNo">2342</span><a name="line.2342"></a>
+<span class="sourceLineNo">2343</span>    // now create data.<a name="line.2343"></a>
+<span class="sourceLineNo">2344</span>    Put put = new Put(rowA);<a name="line.2344"></a>
+<span class="sourceLineNo">2345</span>    put.addColumn(fam2, null, value);<a name="line.2345"></a>
+<span class="sourceLineNo">2346</span>    region.put(put);<a name="line.2346"></a>
+<span class="sourceLineNo">2347</span><a name="line.2347"></a>
+<span class="sourceLineNo">2348</span>    put = new Put(rowB);<a name="line.2348"></a>
+<span class="sourceLineNo">2349</span>    put.addColumn(fam1, null, value);<a name="line.2349"></a>
+<span class="sourceLineNo">2350</span>    put.addColumn(fam2, null, value);<a name="line.2350"></a>
+<span class="sourceLineNo">2351</span>    region.put(put);<a name="line.2351"></a>
+<span class="sourceLineNo">2352</span><a name="line.2352"></a>
+<span class="sourceLineNo">2353</span>    Scan scan = new Scan();<a name="line.2353"></a>
+<span class="sourceLineNo">2354</span>    scan.addFamily(fam1).addFamily(fam2);<a name="line.2354"></a>
+<span class="sourceLineNo">2355</span>    InternalScanner s = region.getScanner(scan);<a name="line.2355"></a>
+<span class="sourceLineNo">2356</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.2356"></a>
+<span class="sourceLineNo">2357</span>    s.next(results);<a name="line.2357"></a>
+<span class="sourceLineNo">2358</span>    assertTrue(CellUtil.matchingRows(results.get(0), rowA));<a name="line.2358"></a>
+<span class="sourceLineNo">2359</span><a name="line.2359"></a>
+<span class="sourceLineNo">2360</span>    results.clear();<a name="line.2360"></a>
+<span class="sourceLineNo">2361</span>    s.next(results);<a name="line.2361"></a>
+<span class="sourceLineNo">2362</span>    assertTrue(CellUtil.matchingRows(results.get(0), rowB));<a name="line.2362"></a>
+<span class="sourceLineNo">2363</span>  }<a name="line.2363"></a>
+<span class="sourceLineNo">2364</span><a name="line.2364"></a>
+<span class="sourceLineNo">2365</span>  @Test<a name="line.2365"></a>
+<span class="sourceLineNo">2366</span>  public void testDataInMemoryWithoutWAL() throws IOException {<a name="line.2366"></a>
+<span class="sourceLineNo">2367</span>    FileSystem fs = FileSystem.get(CONF);<a name="line.2367"></a>
+<span class="sourceLineNo">2368</span>    Path rootDir = new Path(dir + "testDataInMemoryWithoutWAL");<a name="line.2368"></a>
+<span class="sourceLineNo">2369</span>    FSHLog hLog = new FSHLog(fs, rootDir, "testDataInMemoryWithoutWAL", CONF);<a name="line.2369"></a>
+<span class="sourceLineNo">2370</span>    hLog.init();<a name="line.2370"></a>
+<span class="sourceLineNo">2371</span>    // This chunk creation is done throughout the code base. Do we want to move it into core?<a name="line.2371"></a>
+<span class="sourceLineNo">2372</span>    // It is missing from this test. W/o it we NPE.<a name="line.2372"></a>
+<span class="sourceLineNo">2373</span>    ChunkCreator.initialize(MemStoreLABImpl.CHUNK_SIZE_DEFAULT, false, 0, 0, 0, null);<a name="line.2373"></a>
+<span class="sourceLineNo">2374</span>    region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, hLog,<a name="line.2374"></a>
+<span class="sourceLineNo">2375</span>        COLUMN_FAMILY_BYTES);<a name="line.2375"></a>
+<span class="sourceLineNo">2376</span><a name="line.2376"></a>
+<span class="sourceLineNo">2377</span>    Cell originalCell = CellUtil.createCell(row, COLUMN_FAMILY_BYTES, qual1,<a name="line.2377"></a>
+<span class="sourceLineNo">2378</span>      System.currentTimeMillis(), KeyValue.Type.Put.getCode(), value1);<a name="line.2378"></a>
+<span class="sourceLineNo">2379</span>    final long originalSize = originalCell.getSerializedSize();<a name="line.2379"></a>
+<span class="sourceLineNo">2380</span><a name="line.2380"></a>
+<span class="sourceLineNo">2381</span>    Cell addCell = CellUtil.createCell(row, COLUMN_FAMILY_BYTES, qual1,<a name="line.2381"></a>
+<span class="sourceLineNo">2382</span>      System.currentTimeMillis(), KeyValue.Type.Put.getCode(), Bytes.toBytes("xxxxxxxxxx"));<a name="line.2382"></a>
+<span class="sourceLineNo">2383</span>    final long addSize = addCell.getSerializedSize();<a name="line.2383"></a>
+<span class="sourceLineNo">2384</span><a name="line.2384"></a>
+<span class="sourceLineNo">2385</span>    LOG.info("originalSize:" + originalSize<a name="line.2385"></a>
+<span class="sourceLineNo">2386</span>      + ", addSize:" + addSize);<a name="line.2386"></a>
+<span class="sourceLineNo">2387</span>    // start test. We expect that the addPut's durability will be replaced<a name="line.2387"></a>
+<span class="sourceLineNo">2388</span>    // by originalPut's durability.<a name="line.2388"></a>
+<span class="sourceLineNo">2389</span><a name="line.2389"></a>
+<span class="sourceLineNo">2390</span>    // case 1:<a name="line.2390"></a>
+<span class="sourceLineNo">2391</span>    testDataInMemoryWithoutWAL(region,<a name="line.2391"></a>
+<span class="sourceLineNo">2392</span>            new Put(row).add(originalCell).setDurability(Durability.SKIP_WAL),<a name="line.2392"></a>
+<span class="sourceLineNo">2393</span>            new Put(row).add(addCell).setDurability(Durability.SKIP_WAL),<a name="line.2393"></a>
+<span class="sourceLineNo">2394</span>            originalSize + addSize);<a name="line.2394"></a>
+<span class="sourceLineNo">2395</span><a name="line.2395"></a>
+<span class="sourceLineNo">2396</span>    // case 2:<a name="line.2396"></a>
+<span class="sourceLineNo">2397</span>    testDataInMemoryWithoutWAL(region,<a name="line.2397"></a>
+<span class="sourceLineNo">2398</span>            new Put(row).add(originalCell).setDurability(Durability.SKIP_WAL),<a name="line.2398"></a>
+<span class="sourceLineNo">2399</span>            new Put(row).add(addCell).setDurability(Durability.SYNC_WAL),<a name="line.2399"></a>
+<span class="sourceLineNo">2400</span>            originalSize + addSize);<a name="line.2400"></a>
+<span class="sourceLineNo">2401</span><a name="line.2401"></a>
+<span class="sourceLineNo">2402</span>    // case 3:<a name="line.2402"></a>
+<span class="sourceLineNo">2403</span>    testDataInMemoryWithoutWAL(region,<a name="line.2403"></a>
+<span class="sourceLineNo">2404</span>            new Put(row).add(originalCell).setDurability(Durability.SYNC_WAL),<a name="line.2404"></a>
+<span class="sourceLineNo">2405</span>            new Put(row).add(addCell).setDurability(Durability.SKIP_WAL),<a name="line.2405"></a>
+<span class="sourceLineNo">2406</span>            0);<a name="line.2406"></a>
+<span class="sourceLineNo">2407</span><a name="line.2407"></a>
+<span class="sourceLineNo">2408</span>    // case 4:<a name="line.2408"></a>
+<span class="sourceLineNo">2409</span>    testDataInMemoryWithoutWAL(region,<a name="line.2409"></a>
+<span class="sourceLineNo">2410</span>            new Put(row).add(originalCell).setDurability(Durability.SYNC_WAL),<a name="line.2410"></a>
+<span class="sourceLineNo">2411</span>            new Put(row).add(addCell).setDurability(Durability.SYNC_WAL),<a name="line.2411"></a>
+<span class="sourceLineNo">2412</span>            0);<a name="line.2412"></a>
+<span class="sourceLineNo">2413</span>  }<a name="line.2413"></a>
+<span class="sourceLineNo">2414</span><a name="line.2414"></a>
+<span class="sourceLineNo">2415</span>  private static void testDataInMemoryWithoutWAL(HRegion region, Put originalPut,<a name="line.2415"></a>
+<span class="sourceLineNo">2416</span>          final Put addPut, long delta) throws IOException {<a name="line.2416"></a>
+<span class="sourceLineNo">2417</span>    final long initSize = region.getDataInMemoryWithoutWAL();<a name="line.2417"></a>
+<span class="sourceLineNo">2418</span>    // save normalCPHost and replaced by mockedCPHost<a name="line.2418"></a>
+<span class="sourceLineNo">2419</span>    RegionCoprocessorHost normalCPHost = region.getCoprocessorHost();<a name="line.2419"></a>
+<span class="sourceLineNo">2420</span>    RegionCoprocessorHost mockedCPHost = Mockito.mock(RegionCoprocessorHost.class);<a name="line.2420"></a>
+<span class="sourceLineNo">2421</span>    // Because the preBatchMutate returns void, we can't do usual Mockito when...then form. Must<a name="line.2421"></a>
+<span class="sourceLineNo">2422</span>    // do below format (from Mockito doc).<a name="line.2422"></a>
+<span class="sourceLineNo">2423</span>    Mockito.doAnswer(new Answer&lt;Void&gt;() {<a name="line.2423"></a>
+<span class="sourceLineNo">2424</span>      @Override<a name="line.2424"></a>
+<span class="sourceLineNo">2425</span>      public Void answer(InvocationOnMock invocation) throws Throwable {<a name="line.2425"></a>
+<span class="sourceLineNo">2426</span>        MiniBatchOperationInProgress&lt;Mutation&gt; mb = invocation.getArgument(0);<a name="line.2426"></a>
+<span class="sourceLineNo">2427</span>        mb.addOperationsFromCP(0, new Mutation[]{addPut});<a name="line.2427"></a>
+<span class="sourceLineNo">2428</span>        return null;<a name="line.2428"></a>
+<span class="sourceLineNo">2429</span>      }<a name="line.2429"></a>
+<span class="sourceLineNo">2430</span>    }).when(mockedCPHost).preBatchMutate(Mockito.isA(MiniBatchOperationInProgress.class));<a name="line.2430"></a>
+<span class="sourceLineNo">2431</span>    ColumnFamilyDescriptorBuilder builder = ColumnFamilyDescriptorBuilder.<a name="line.2431"></a>
+<span class="sourceLineNo">2432</span>        newBuilder(COLUMN_FAMILY_BYTES);<a name="line.2432"></a>
+<span class="sourceLineNo">2433</span>    ScanInfo info = new ScanInfo(CONF, builder.build(), Long.MAX_VALUE,<a name="line.2433"></a>
+<span class="sourceLineNo">2434</span>        Long.MAX_VALUE, region.getCellComparator());<a name="line.2434"></a>
+<span class="sourceLineNo">2435</span>    Mockito.when(mockedCPHost.preFlushScannerOpen(Mockito.any(HStore.class),<a name="line.2435"></a>
+<span class="sourceLineNo">2436</span>        Mockito.any())).thenReturn(info);<a name="line.2436"></a>
+<span class="sourceLineNo">2437</span>    Mockito.when(mockedCPHost.preFlush(Mockito.any(), Mockito.any(StoreScanner.class),<a name="line.2437"></a>
+<span class="sourceLineNo">2438</span>        Mockito.any())).thenAnswer(i -&gt; i.getArgument(1));<a name="line.2438"></a>
+<span class="sourceLineNo">2439</span>    region.setCoprocessorHost(mockedCPHost);<a name="line.2439"></a>
+<span class="sourceLineNo">2440</span><a name="line.2440"></a>
+<span class="sourceLineNo">2441</span>    region.put(originalPut);<a name="line.2441"></a>
+<span class="sourceLineNo">2442</span>    region.setCoprocessorHost(normalCPHost);<a name="line.2442"></a>
+<span class="sourceLineNo">2443</span>    final long finalSize = region.getDataInMemoryWithoutWAL();<a name="line.2443"></a>
+<span class="sourceLineNo">2444</span>    assertEquals("finalSize:" + finalSize + ", initSize:"<a name="line.2444"></a>
+<span class="sourceLineNo">2445</span>      + initSize + ", delta:" + delta,finalSize, initSize + delta);<a name="line.2445"></a>
+<span class="sourceLineNo">2446</span>  }<a name="line.2446"></a>
+<span class="sourceLineNo">2447</span><a name="line.2447"></a>
+<span class="sourceLineNo">2448</span>  @Test<a name="line.2448"></a>
+<span class="sourceLineNo">2449</span>  public void testDeleteColumns_PostInsert() throws IOException, InterruptedException {<a name="line.2449"></a>
+<span class="sourceLineNo">2450</span>    Delete delete = new Delete(row);<a name="line.2450"></a>
+<span class="sourceLineNo">2451</span>    delete.addColumns(fam1, qual1);<a name="line.2451"></a>
+<span class="sourceLineNo">2452</span>    doTestDelete_AndPostInsert(delete);<a name="line.2452"></a>
+<span class="sourceLineNo">2453</span>  }<a name="line.2453"></a>
+<span class="sourceLineNo">2454</span><a name="line.2454"></a>
+<span class="sourceLineNo">2455</span>  @Test<a name="line.2455"></a>
+<span class="sourceLineNo">2456</span>  public void testaddFamily_PostInsert() throws IOException, InterruptedException {<a name="line.2456"></a>
+<span class="sourceLineNo">2457</span>    Delete delete = new Delete(row);<a name="line.2457"></a>
+<span class="sourceLineNo">2458</span>    delete.addFamily(fam1);<a name="line.2458"></a>
+<span class="sourceLineNo">2459</span>    doTestDelete_AndPostInsert(delete);<a name="line.2459"></a>
+<span class="sourceLineNo">2460</span>  }<a name="line.2460"></a>
 <span class="sourceLineNo">2461</span><a name="line.2461"></a>
-<span class="sourceLineNo">2462</span>    // ok put data:<a name="line.2462"></a>
-<span class="sourceLineNo">2463</span>    put = new Put(row);<a name="line.2463"></a>
-<span class="sourceLineNo">2464</span>    put.addColumn(fam1, qual1, value2);<a name="line.2464"></a>
-<span class="sourceLineNo">2465</span>    region.put(put);<a name="line.2465"></a>
-<span class="sourceLineNo">2466</span><a name="line.2466"></a>
-<span class="sourceLineNo">2467</span>    // ok get:<a name="line.2467"></a>
-<span class="sourceLineNo">2468</span>    Get get = new Get(row);<a name="line.2468"></a>
-<span class="sourceLineNo">2469</span>    get.addColumn(fam1, qual1);<a name="line.2469"></a>
-<span class="sourceLineNo">2470</span><a name="line.2470"></a>
-<span class="sourceLineNo">2471</span>    Result r = region.get(get);<a name="line.2471"></a>
-<span class="sourceLineNo">2472</span>    assertEquals(1, r.size());<a name="line.2472"></a>
-<span class="sourceLineNo">2473</span>    assertArrayEquals(value2, r.getValue(fam1, qual1));<a name="line.2473"></a>
-<span class="sourceLineNo">2474</span><a name="line.2474"></a>
-<span class="sourceLineNo">2475</span>    // next:<a name="line.2475"></a>
-<span class="sourceLineNo">2476</span>    Scan scan = new Scan(row);<a name="line.2476"></a>
-<span class="sourceLineNo">2477</span>    scan.addColumn(fam1, qual1);<a name="line.2477"></a>
-<span class="sourceLineNo">2478</span>    InternalScanner s = region.getScanner(scan);<a name="line.2478"></a>
-<span class="sourceLineNo">2479</span><a name="line.2479"></a>
-<span class="sourceLineNo">2480</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.2480"></a>
-<span class="sourceLineNo">2481</span>    assertEquals(false, s.next(results));<a name="line.2481"></a>
-<span class="sourceLineNo">2482</span>    assertEquals(1, results.size());<a name="line.2482"></a>
-<span class="sourceLineNo">2483</span>    Cell kv = results.get(0);<a name="line.2483"></a>
+<span class="sourceLineNo">2462</span>  public void doTestDelete_AndPostInsert(Delete delete) throws IOException, InterruptedException {<a name="line.2462"></a>
+<span class="sourceLineNo">2463</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2463"></a>
+<span class="sourceLineNo">2464</span>    EnvironmentEdgeManagerTestHelper.injectEdge(new IncrementingEnvironmentEdge());<a name="line.2464"></a>
+<span class="sourceLineNo">2465</span>    Put put = new Put(row);<a name="line.2465"></a>
+<span class="sourceLineNo">2466</span>    put.addColumn(fam1, qual1, value1);<a name="line.2466"></a>
+<span class="sourceLineNo">2467</span>    region.put(put);<a name="line.2467"></a>
+<span class="sourceLineNo">2468</span><a name="line.2468"></a>
+<span class="sourceLineNo">2469</span>    // now delete the value:<a name="line.2469"></a>
+<span class="sourceLineNo">2470</span>    region.delete(delete);<a name="line.2470"></a>
+<span class="sourceLineNo">2471</span><a name="line.2471"></a>
+<span class="sourceLineNo">2472</span>    // ok put data:<a name="line.2472"></a>
+<span class="sourceLineNo">2473</span>    put = new Put(row);<a name="line.2473"></a>
+<span class="sourceLineNo">2474</span>    put.addColumn(fam1, qual1, value2);<a name="line.2474"></a>
+<span class="sourceLineNo">2475</span>    region.put(put);<a name="line.2475"></a>
+<span class="sourceLineNo">2476</span><a name="line.2476"></a>
+<span class="sourceLineNo">2477</span>    // ok get:<a name="line.2477"></a>
+<span class="sourceLineNo">2478</span>    Get get = new Get(row);<a name="line.2478"></a>
+<span class="sourceLineNo">2479</span>    get.addColumn(fam1, qual1);<a name="line.2479"></a>
+<span class="sourceLineNo">2480</span><a name="line.2480"></a>
+<span class="sourceLineNo">2481</span>    Result r = region.get(get);<a name="line.2481"></a>
+<span class="sourceLineNo">2482</span>    assertEquals(1, r.size());<a name="line.2482"></a>
+<span class="sourceLineNo">2483</span>    assertArrayEquals(value2, r.getValue(fam1, qual1));<a name="line.2483"></a>
 <span class="sourceLineNo">2484</span><a name="line.2484"></a>
-<span class="sourceLineNo">2485</span>    assertArrayEquals(value2, CellUtil.cloneValue(kv));<a name="line.2485"></a>
-<span class="sourceLineNo">2486</span>    assertArrayEquals(fam1, CellUtil.cloneFamily(kv));<a name="line.2486"></a>
-<span class="sourceLineNo">2487</span>    assertArrayEquals(qual1, CellUtil.cloneQualifier(kv));<a name="line.2487"></a>
-<span class="sourceLineNo">2488</span>    assertArrayEquals(row, CellUtil.cloneRow(kv));<a name="line.2488"></a>
-<span class="sourceLineNo">2489</span>  }<a name="line.2489"></a>
-<span class="sourceLineNo">2490</span><a name="line.2490"></a>
-<span class="sourceLineNo">2491</span>  @Test<a name="line.2491"></a>
-<span class="sourceLineNo">2492</span>  public void testDelete_CheckTimestampUpdated() throws IOException {<a name="line.2492"></a>
-<span class="sourceLineNo">2493</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2493"></a>
-<span class="sourceLineNo">2494</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.2494"></a>
-<span class="sourceLineNo">2495</span>    byte[] col2 = Bytes.toBytes("col2");<a name="line.2495"></a>
-<span class="sourceLineNo">2496</span>    byte[] col3 = Bytes.toBytes("col3");<a name="line.2496"></a>
-<span class="sourceLineNo">2497</span><a name="line.2497"></a>
-<span class="sourceLineNo">2498</span>    // Setting up region<a name="line.2498"></a>
-<span class="sourceLineNo">2499</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2499"></a>
-<span class="sourceLineNo">2500</span>    // Building checkerList<a name="line.2500"></a>
-<span class="sourceLineNo">2501</span>    List&lt;Cell&gt; kvs = new ArrayList&lt;&gt;();<a name="line.2501"></a>
-<span class="sourceLineNo">2502</span>    kvs.add(new KeyValue(row1, fam1, col1, null));<a name="line.2502"></a>
-<span class="sourceLineNo">2503</span>    kvs.add(new KeyValue(row1, fam1, col2, null));<a name="line.2503"></a>
-<span class="sourceLineNo">2504</span>    kvs.add(new KeyValue(row1, fam1, col3, null));<a name="line.2504"></a>
-<span class="sourceLineNo">2505</span><a name="line.2505"></a>
-<span class="sourceLineNo">2506</span>    NavigableMap&lt;byte[], List&lt;Cell&gt;&gt; deleteMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2506"></a>
-<span class="sourceLineNo">2507</span>    deleteMap.put(fam1, kvs);<a name="line.2507"></a>
-<span class="sourceLineNo">2508</span>    region.delete(deleteMap, Durability.SYNC_WAL);<a name="line.2508"></a>
-<span class="sourceLineNo">2509</span><a name="line.2509"></a>
-<span class="sourceLineNo">2510</span>    // extract the key values out the memstore:<a name="line.2510"></a>
-<span class="sourceLineNo">2511</span>    // This is kinda hacky, but better than nothing...<a name="line.2511"></a>
-<span class="sourceLineNo">2512</span>    long now = System.currentTimeMillis();<a name="line.2512"></a>
-<span class="sourceLineNo">2513</span>    AbstractMemStore memstore = (AbstractMemStore)region.getStore(fam1).memstore;<a name="line.2513"></a>
-<span class="sourceLineNo">2514</span>    Cell firstCell = memstore.getActive().first();<a name="line.2514"></a>
-<span class="sourceLineNo">2515</span>    assertTrue(firstCell.getTimestamp() &lt;= now);<a name="line.2515"></a>
-<span class="sourceLineNo">2516</span>    now = firstCell.getTimestamp();<a name="line.2516"></a>
-<span class="sourceLineNo">2517</span>    for (Cell cell : memstore.getActive().getCellSet()) {<a name="line.2517"></a>
-<span class="sourceLineNo">2518</span>      assertTrue(cell.getTimestamp() &lt;= now);<a name="line.2518"></a>
-<span class="sourceLineNo">2519</span>      now = cell.getTimestamp();<a name="line.2519"></a>
-<span class="sourceLineNo">2520</span>    }<a name="line.2520"></a>
-<span class="sourceLineNo">2521</span>  }<a name="line.2521"></a>
-<span class="sourceLineNo">2522</span><a name="line.2522"></a>
-<span class="sourceLineNo">2523</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2523"></a>
-<span class="sourceLineNo">2524</span>  // Get tests<a name="line.2524"></a>
-<span class="sourceLineNo">2525</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2525"></a>
-<span class="sourceLineNo">2526</span>  @Test<a name="line.2526"></a>
-<span class="sourceLineNo">2527</span>  public void testGet_FamilyChecker() throws IOException {<a name="line.2527"></a>
-<span class="sourceLineNo">2528</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2528"></a>
-<span class="sourceLineNo">2529</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2529"></a>
-<span class="sourceLineNo">2530</span>    byte[] fam2 = Bytes.toBytes("False");<a name="line.2530"></a>
-<span class="sourceLineNo">2531</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.2531"></a>
+<span class="sourceLineNo">2485</span>    // next:<a name="line.2485"></a>
+<span class="sourceLineNo">2486</span>    Scan scan = new Scan(row);<a name="line.2486"></a>
+<span class="sourceLineNo">2487</span>    scan.addColumn(fam1, qual1);<a name="line.2487"></a>
+<span class="sourceLineNo">2488</span>    InternalScanner s = region.getScanner(scan);<a name="line.2488"></a>
+<span class="sourceLineNo">2489</span><a name="line.2489"></a>
+<span class="sourceLineNo">2490</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.2490"></a>
+<span class="sourceLineNo">2491</span>    assertEquals(false, s.next(results));<a name="line.2491"></a>
+<span class="sourceLineNo">2492</span>    assertEquals(1, results.size());<a name="line.2492"></a>
+<span class="sourceLineNo">2493</span>    Cell kv = results.get(0);<a name="line.2493"></a>
+<span class="sourceLineNo">2494</span><a name="line.2494"></a>
+<span class="sourceLineNo">2495</span>    assertArrayEquals(value2, CellUtil.cloneValue(kv));<a name="line.2495"></a>
+<span class="sourceLineNo">2496</span>    assertArrayEquals(fam1, CellUtil.cloneFamily(kv));<a name="line.2496"></a>
+<span class="sourceLineNo">2497</span>    assertArrayEquals(qual1, CellUtil.cloneQualifier(kv));<a name="line.2497"></a>
+<span class="sourceLineNo">2498</span>    assertArrayEquals(row, CellUtil.cloneRow(kv));<a name="line.2498"></a>
+<span class="sourceLineNo">2499</span>  }<a name="line.2499"></a>
+<span class="sourceLineNo">2500</span><a name="line.2500"></a>
+<span class="sourceLineNo">2501</span>  @Test<a name="line.2501"></a>
+<span class="sourceLineNo">2502</span>  public void testDelete_CheckTimestampUpdated() throws IOException {<a name="line.2502"></a>
+<span class="sourceLineNo">2503</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2503"></a>
+<span class="sourceLineNo">2504</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.2504"></a>
+<span class="sourceLineNo">2505</span>    byte[] col2 = Bytes.toBytes("col2");<a name="line.2505"></a>
+<span class="sourceLineNo">2506</span>    byte[] col3 = Bytes.toBytes("col3");<a name="line.2506"></a>
+<span class="sourceLineNo">2507</span><a name="line.2507"></a>
+<span class="sourceLineNo">2508</span>    // Setting up region<a name="line.2508"></a>
+<span class="sourceLineNo">2509</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2509"></a>
+<span class="sourceLineNo">2510</span>    // Building checkerList<a name="line.2510"></a>
+<span class="sourceLineNo">2511</span>    List&lt;Cell&gt; kvs = new ArrayList&lt;&gt;();<a name="line.2511"></a>
+<span class="sourceLineNo">2512</span>    kvs.add(new KeyValue(row1, fam1, col1, null));<a name="line.2512"></a>
+<span class="sourceLineNo">2513</span>    kvs.add(new KeyValue(row1, fam1, col2, null));<a name="line.2513"></a>
+<span class="sourceLineNo">2514</span>    kvs.add(new KeyValue(row1, fam1, col3, null));<a name="line.2514"></a>
+<span class="sourceLineNo">2515</span><a name="line.2515"></a>
+<span class="sourceLineNo">2516</span>    NavigableMap&lt;byte[], List&lt;Cell&gt;&gt; deleteMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2516"></a>
+<span class="sourceLineNo">2517</span>    deleteMap.put(fam1, kvs);<a name="line.2517"></a>
+<span class="sourceLineNo">2518</span>    region.delete(deleteMap, Durability.SYNC_WAL);<a name="line.2518"></a>
+<span class="sourceLineNo">2519</span><a name="line.2519"></a>
+<span class="sourceLineNo">2520</span>    // extract the key values out the memstore:<a name="line.2520"></a>
+<span class="sourceLineNo">2521</span>    // This is kinda hacky, but better than nothing...<a name="line.2521"></a>
+<span class="sourceLineNo">2522</span>    long now = System.currentTimeMillis();<a name="line.2522"></a>
+<span class="sourceLineNo">2523</span>    AbstractMemStore memstore = (AbstractMemStore)region.getStore(fam1).memstore;<a name="line.2523"></a>
+<span class="sourceLineNo">2524</span>    Cell firstCell = memstore.getActive().first();<a name="line.2524"></a>
+<span class="sourceLineNo">2525</span>    assertTrue(firstCell.getTimestamp() &lt;= now);<a name="line.2525"></a>
+<span class="sourceLineNo">2526</span>    now = firstCell.getTimestamp();<a name="line.2526"></a>
+<span class="sourceLineNo">2527</span>    for (Cell cell : memstore.getActive().getCellSet()) {<a name="line.2527"></a>
+<span class="sourceLineNo">2528</span>      assertTrue(cell.getTimestamp() &lt;= now);<a name="line.2528"></a>
+<span class="sourceLineNo">2529</span>      now = cell.getTimestamp();<a name="line.2529"></a>
+<span class="sourceLineNo">2530</span>    }<a name="line.2530"></a>
+<span class="sourceLineNo">2531</span>  }<a name="line.2531"></a>
 <span class="sourceLineNo">2532</span><a name="line.2532"></a>
-<span class="sourceLineNo">2533</span>    // Setting up region<a name="line.2533"></a>
-<span class="sourceLineNo">2534</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2534"></a>
-<span class="sourceLineNo">2535</span>    Get get = new Get(row1);<a name="line.2535"></a>
-<span class="sourceLineNo">2536</span>    get.addColumn(fam2, col1);<a name="line.2536"></a>
-<span class="sourceLineNo">2537</span><a name="line.2537"></a>
-<span class="sourceLineNo">2538</span>    // Test<a name="line.2538"></a>
-<span class="sourceLineNo">2539</span>    try {<a name="line.2539"></a>
-<span class="sourceLineNo">2540</span>      region.get(get);<a name="line.2540"></a>
-<span class="sourceLineNo">2541</span>      fail("Expecting DoNotRetryIOException in get but did not get any");<a name="line.2541"></a>
-<span class="sourceLineNo">2542</span>    } catch (org.apache.hadoop.hbase.DoNotRetryIOException e) {<a name="line.2542"></a>
-<span class="sourceLineNo">2543</span>      LOG.info("Got expected DoNotRetryIOException successfully");<a name="line.2543"></a>
-<span class="sourceLineNo">2544</span>    }<a name="line.2544"></a>
-<span class="sourceLineNo">2545</span>  }<a name="line.2545"></a>
-<span class="sourceLineNo">2546</span><a name="line.2546"></a>
-<span class="sourceLineNo">2547</span>  @Test<a name="line.2547"></a>
-<span class="sourceLineNo">2548</span>  public void testGet_Basic() throws IOException {<a name="line.2548"></a>
-<span class="sourceLineNo">2549</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2549"></a>
-<span class="sourceLineNo">2550</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2550"></a>
-<span class="sourceLineNo">2551</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.2551"></a>
-<span class="sourceLineNo">2552</span>    byte[] col2 = Bytes.toBytes("col2");<a name="line.2552"></a>
-<span class="sourceLineNo">2553</span>    byte[] col3 = Bytes.toBytes("col3");<a name="line.2553"></a>
-<span class="sourceLineNo">2554</span>    byte[] col4 = Bytes.toBytes("col4");<a name="line.2554"></a>
-<span class="sourceLineNo">2555</span>    byte[] col5 = Bytes.toBytes("col5");<a name="line.2555"></a>
+<span class="sourceLineNo">2533</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2533"></a>
+<span class="sourceLineNo">2534</span>  // Get tests<a name="line.2534"></a>
+<span class="sourceLineNo">2535</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2535"></a>
+<span class="sourceLineNo">2536</span>  @Test<a name="line.2536"></a>
+<span class="sourceLineNo">2537</span>  public void testGet_FamilyChecker() throws IOException {<a name="line.2537"></a>
+<span class="sourceLineNo">2538</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2538"></a>
+<span class="sourceLineNo">2539</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2539"></a>
+<span class="sourceLineNo">2540</span>    byte[] fam2 = Bytes.toBytes("False");<a name="line.2540"></a>
+<span class="sourceLineNo">2541</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.2541"></a>
+<span class="sourceLineNo">2542</span><a name="line.2542"></a>
+<span class="sourceLineNo">2543</span>    // Setting up region<a name="line.2543"></a>
+<span class="sourceLineNo">2544</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2544"></a>
+<span class="sourceLineNo">2545</span>    Get get = new Get(row1);<a name="line.2545"></a>
+<span class="sourceLineNo">2546</span>    get.addColumn(fam2, col1);<a name="line.2546"></a>
+<span class="sourceLineNo">2547</span><a name="line.2547"></a>
+<span class="sourceLineNo">2548</span>    // Test<a name="line.2548"></a>
+<span class="sourceLineNo">2549</span>    try {<a name="line.2549"></a>
+<span class="sourceLineNo">2550</span>      region.get(get);<a name="line.2550"></a>
+<span class="sourceLineNo">2551</span>      fail("Expecting DoNotRetryIOException in get but did not get any");<a name="line.2551"></a>
+<span class="sourceLineNo">2552</span>    } catch (org.apache.hadoop.hbase.DoNotRetryIOException e) {<a name="line.2552"></a>
+<span class="sourceLineNo">2553</span>      LOG.info("Got expected DoNotRetryIOException successfully");<a name="line.2553"></a>
+<span class="sourceLineNo">2554</span>    }<a name="line.2554"></a>
+<span class="sourceLineNo">2555</span>  }<a name="line.2555"></a>
 <span class="sourceLineNo">2556</span><a name="line.2556"></a>
-<span class="sourceLineNo">2557</span>    // Setting up region<a name="line.2557"></a>
-<span class="sourceLineNo">2558</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2558"></a>
-<span class="sourceLineNo">2559</span>    // Add to memstore<a name="line.2559"></a>
-<span class="sourceLineNo">2560</span>    Put put = new Put(row1);<a name="line.2560"></a>
-<span class="sourceLineNo">2561</span>    put.addColumn(fam1, col1, null);<a name="line.2561"></a>
-<span class="sourceLineNo">2562</span>    put.addColumn(fam1, col2, null);<a name="line.2562"></a>
-<span class="sourceLineNo">2563</span>    put.addColumn(fam1, col3, null);<a name="line.2563"></a>
-<span class="sourceLineNo">2564</span>    put.addColumn(fam1, col4, null);<a name="line.2564"></a>
-<span class="sourceLineNo">2565</span>    put.addColumn(fam1, col5, null);<a name="line.2565"></a>
-<span class="sourceLineNo">2566</span>    region.put(put);<a name="line.2566"></a>
-<span class="sourceLineNo">2567</span><a name="line.2567"></a>
-<span class="sourceLineNo">2568</span>    Get get = new Get(row1);<a name="line.2568"></a>
-<span class="sourceLineNo">2569</span>    get.addColumn(fam1, col2);<a name="line.2569"></a>
-<span class="sourceLineNo">2570</span>    get.addColumn(fam1, col4);<a name="line.2570"></a>
-<span class="sourceLineNo">2571</span>    // Expected result<a name="line.2571"></a>
-<span class="sourceLineNo">2572</span>    KeyValue kv1 = new KeyValue(row1, fam1, col2);<a name="line.2572"></a>
-<span class="sourceLineNo">2573</span>    KeyValue kv2 = new KeyValue(row1, fam1, col4);<a name="line.2573"></a>
-<span class="sourceLineNo">2574</span>    KeyValue[] expected = { kv1, kv2 };<a name="line.2574"></a>
-<span class="sourceLineNo">2575</span><a name="line.2575"></a>
-<span class="sourceLineNo">2576</span>    // Test<a name="line.2576"></a>
-<span class="sourceLineNo">2577</span>    Result res = region.get(get);<a name="line.2577"></a>
-<span class="sourceLineNo">2578</span>    assertEquals(expected.length, res.size());<a name="line.2578"></a>
-<span class="sourceLineNo">2579</span>    for (int i = 0; i &lt; res.size(); i++) {<a name="line.2579"></a>
-<span class="sourceLineNo">2580</span>      assertTrue(CellUtil.matchingRows(expected[i], res.rawCells()[i]));<a name="line.2580"></a>
-<span class="sourceLineNo">2581</span>      assertTrue(CellUtil.matchingFamily(expected[i], res.rawCells()[i]));<a name="line.2581"></a>
-<span class="sourceLineNo">2582</span>      assertTrue(CellUtil.matchingQualifier(expected[i], res.rawCells()[i]));<a name="line.2582"></a>
-<span class="sourceLineNo">2583</span>    }<a name="line.2583"></a>
-<span class="sourceLineNo">2584</span><a name="line.2584"></a>
-<span class="sourceLineNo">2585</span>    // Test using a filter on a Get<a name="line.2585"></a>
-<span class="sourceLineNo">2586</span>    Get g = new Get(row1);<a name="line.2586"></a>
-<span class="sourceLineNo">2587</span>    final int count = 2;<a name="line.2587"></a>
-<span class="sourceLineNo">2588</span>    g.setFilter(new ColumnCountGetFilter(count));<a name="line.2588"></a>
-<span class="sourceLineNo">2589</span>    res = region.get(g);<a name="line.2589"></a>
-<span class="sourceLineNo">2590</span>    assertEquals(count, res.size());<a name="line.2590"></a>
-<span class="sourceLineNo">2591</span>  }<a name="line.2591"></a>
-<span class="sourceLineNo">2592</span><a name="line.2592"></a>
-<span class="sourceLineNo">2593</span>  @Test<a name="line.2593"></a>
-<span class="sourceLineNo">2594</span>  public void testGet_Empty() throws IOException {<a name="line.2594"></a>
-<span class="sourceLineNo">2595</span>    byte[] row = Bytes.toBytes("row");<a name="line.2595"></a>
-<span class="sourceLineNo">2596</span>    byte[] fam = Bytes.toBytes("fam");<a name="line.2596"></a>
-<span class="sourceLineNo">2597</span><a name="line.2597"></a>
-<span class="sourceLineNo">2598</span>    this.region = initHRegion(tableName, method, CONF, fam);<a name="line.2598"></a>
-<span class="sourceLineNo">2599</span>    Get get = new Get(row);<a name="line.2599"></a>
-<span class="sourceLineNo">2600</span>    get.addFamily(fam);<a name="line.2600"></a>
-<span class="sourceLineNo">2601</span>    Result r = region.get(get);<a name="line.2601"></a>
+<span class="sourceLineNo">2557</span>  @Test<a name="line.2557"></a>
+<span class="sourceLineNo">2558</span>  public void testGet_Basic() throws IOException {<a name="line.2558"></a>
+<span class="sourceLineNo">2559</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2559"></a>
+<span class="sourceLineNo">2560</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2560"></a>
+<span class="sourceLineNo">2561</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.2561"></a>
+<span class="sourceLineNo">2562</span>    byte[] col2 = Bytes.toBytes("col2");<a name="line.2562"></a>
+<span class="sourceLineNo">2563</span>    byte[] col3 = Bytes.toBytes("col3");<a name="line.2563"></a>
+<span class="sourceLineNo">2564</span>    byte[] col4 = Bytes.toBytes("col4");<a name="line.2564"></a>
+<span class="sourceLineNo">2565</span>    byte[] col5 = Bytes.toBytes("col5");<a name="line.2565"></a>
+<span class="sourceLineNo">2566</span><a name="line.2566"></a>
+<span class="sourceLineNo">2567</span>    // Setting up region<a name="line.2567"></a>
+<span class="sourceLineNo">2568</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2568"></a>
+<span class="sourceLineNo">2569</span>    // Add to memstore<a name="line.2569"></a>
+<span class="sourceLineNo">2570</span>    Put put = new Put(row1);<a name="line.2570"></a>
+<span class="sourceLineNo">2571</span>    put.addColumn(fam1, col1, null);<a name="line.2571"></a>
+<span class="sourceLineNo">2572</span>    put.addColumn(fam1, col2, null);<a name="line.2572"></a>
+<span class="sourceLineNo">2573</span>    put.addColumn(fam1, col3, null);<a name="line.2573"></a>
+<span class="sourceLineNo">2574</span>    put.addColumn(fam1, col4, null);<a name="line.2574"></a>
+<span class="sourceLineNo">2575</span>    put.addColumn(fam1, col5, null);<a name="line.2575"></a>
+<span class="sourceLineNo">2576</span>    region.put(put);<a name="line.2576"></a>
+<span class="sourceLineNo">2577</span><a name="line.2577"></a>
+<span class="sourceLineNo">2578</span>    Get get = new Get(row1);<a name="line.2578"></a>
+<span class="sourceLineNo">2579</span>    get.addColumn(fam1, col2);<a name="line.2579"></a>
+<span class="sourceLineNo">2580</span>    get.addColumn(fam1, col4);<a name="line.2580"></a>
+<span class="sourceLineNo">2581</span>    // Expected result<a name="line.2581"></a>
+<span class="sourceLineNo">2582</span>    KeyValue kv1 = new KeyValue(row1, fam1, col2);<a name="line.2582"></a>
+<span class="sourceLineNo">2583</span>    KeyValue kv2 = new KeyValue(row1, fam1, col4);<a name="line.2583"></a>
+<span class="sourceLineNo">2584</span>    KeyValue[] expected = { kv1, kv2 };<a name="line.2584"></a>
+<span class="sourceLineNo">2585</span><a name="line.2585"></a>
+<span class="sourceLineNo">2586</span>    // Test<a name="line.2586"></a>
+<span class="sourceLineNo">2587</span>    Result res = region.get(get);<a name="line.2587"></a>
+<span class="sourceLineNo">2588</span>    assertEquals(expected.length, res.size());<a name="line.2588"></a>
+<span class="sourceLineNo">2589</span>    for (int i = 0; i &lt; res.size(); i++) {<a name="line.2589"></a>
+<span class="sourceLineNo">2590</span>      assertTrue(CellUtil.matchingRows(expected[i], res.rawCells()[i]));<a name="line.2590"></a>
+<span class="sourceLineNo">2591</span>      assertTrue(CellUtil.matchingFamily(expected[i], res.rawCells()[i]));<a name="line.2591"></a>
+<span class="sourceLineNo">2592</span>      assertTrue(CellUtil.matchingQualifier(expected[i], res.rawCells()[i]));<a name="line.2592"></a>
+<span class="sourceLineNo">2593</span>    }<a name="line.2593"></a>
+<span class="sourceLineNo">2594</span><a name="line.2594"></a>
+<span class="sourceLineNo">2595</span>    // Test using a filter on a Get<a name="line.2595"></a>
+<span class="sourceLineNo">2596</span>    Get g = new Get(row1);<a name="line.2596"></a>
+<span class="sourceLineNo">2597</span>    final int count = 2;<a name="line.2597"></a>
+<span class="sourceLineNo">2598</span>    g.setFilter(new ColumnCountGetFilter(count));<a name="line.2598"></a>
+<span class="sourceLineNo">2599</span>    res = region.get(g);<a name="line.2599"></a>
+<span class="sourceLineNo">2600</span>    assertEquals(count, res.size());<a name="line.2600"></a>
+<span class="sourceLineNo">2601</span>  }<a name="line.2601"></a>
 <span class="sourceLineNo">2602</span><a name="line.2602"></a>
-<span class="sourceLineNo">2603</span>    assertTrue(r.isEmpty());<a name="line.2603"></a>
-<span class="sourceLineNo">2604</span>  }<a name="line.2604"></a>
-<span class="sourceLineNo">2605</span><a name="line.2605"></a>
-<span class="sourceLineNo">2606</span>  @Test<a name="line.2606"></a>
-<span class="sourceLineNo">2607</span>  public void testGetWithFilter() throws IOException, InterruptedException {<a name="line.2607"></a>
-<span class="sourceLineNo">2608</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2608"></a>
-<span class="sourceLineNo">2609</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2609"></a>
-<span class="sourceLineNo">2610</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.2610"></a>
-<span class="sourceLineNo">2611</span>    byte[] value1 = Bytes.toBytes("value1");<a name="line.2611"></a>
-<span class="sourceLineNo">2612</span>    byte[] value2 = Bytes.toBytes("value2");<a name="line.2612"></a>
-<span class="sourceLineNo">2613</span><a name="line.2613"></a>
-<span class="sourceLineNo">2614</span>    final int maxVersions = 3;<a name="line.2614"></a>
-<span class="sourceLineNo">2615</span>    HColumnDescriptor hcd = new HColumnDescriptor(fam1);<a name="line.2615"></a>
-<span class="sourceLineNo">2616</span>    hcd.setMaxVersions(maxVersions);<a name="line.2616"></a>
-<span class="sourceLineNo">2617</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf("testFilterAndColumnTracker"));<a name="line.2617"></a>
-<span class="sourceLineNo">2618</span>    htd.addFamily(hcd);<a name="line.2618"></a>
-<span class="sourceLineNo">2619</span>    ChunkCreator.initialize(MemStoreLABImpl.CHUNK_SIZE_DEFAULT, false, 0, 0, 0, null);<a name="line.2619"></a>
-<span class="sourceLineNo">2620</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.2620"></a>
-<span class="sourceLineNo">2621</span>    Path logDir = TEST_UTIL.getDataTestDirOnTestFS(method + ".log");<a name="line.2621"></a>
-<span class="sourceLineNo">2622</span>    final WAL wal = HBaseTestingUtility.createWal(TEST_UTIL.getConfiguration(), logDir, info);<a name="line.2622"></a>
-<span class="sourceLineNo">2623</span>    this.region = TEST_UTIL.createLocalHRegion(info, htd, wal);<a name="line.2623"></a>
-<span class="sourceLineNo">2624</span><a name="line.2624"></a>
-<span class="sourceLineNo">2625</span>    // Put 4 version to memstore<a name="line.2625"></a>
-<span class="sourceLineNo">2626</span>    long ts = 0;<a name="line.2626"></a>
-<span class="sourceLineNo">2627</span>    Put put = new Put(row1, ts);<a name="line.2627"></a>
-<span class="sourceLineNo">2628</span>    put.addColumn(fam1, col1, value1);<a name="line.2628"></a>
-<span class="sourceLineNo">2629</span>    region.put(put);<a name="line.2629"></a>
-<span class="sourceLineNo">2630</span>    put = new Put(row1, ts + 1);<a name="line.2630"></a>
-<span class="sourceLineNo">2631</span>    put.addColumn(fam1, col1, Bytes.toBytes("filter1"));<a name="line.2631"></a>
-<span class="sourceLineNo">2632</span>    region.put(put);<a name="line.2632"></a>
-<span class="sourceLineNo">2633</span>    put = new Put(row1, ts + 2);<a name="line.2633"></a>
-<span class="sourceLineNo">2634</span>    put.addColumn(fam1, col1, Bytes.toBytes("filter2"));<a name="line.2634"></a>
-<span class="sourceLineNo">2635</span>    region.put(put);<a name="line.2635"></a>
-<span class="sourceLineNo">2636</span>    put = new Put(row1, ts + 3);<a name="line.2636"></a>
-<span class="sourceLineNo">2637</span>    put.addColumn(fam1, col1, value2);<a name="line.2637"></a>
-<span class="sourceLineNo">2638</span>    region.put(put);<a name="line.2638"></a>
-<span class="sourceLineNo">2639</span><a name="line.2639"></a>
-<span class="sourceLineNo">2640</span>    Get get = new Get(row1);<a name="line.2640"></a>
-<span class="sourceLineNo">2641</span>    get.readAllVersions();<a name="line.2641"></a>
-<span class="sourceLineNo">2642</span>    Result res = region.get(get);<a name="line.2642"></a>
-<span class="sourceLineNo">2643</span>    // Get 3 versions, the oldest version has gone from user view<a name="line.2643"></a>
-<span class="sourceLineNo">2644</span>    assertEquals(maxVersions, res.size());<a name="line.2644"></a>
-<span class="sourceLineNo">2645</span><a name="line.2645"></a>
-<span class="sourceLineNo">2646</span>    get.setFilter(new ValueFilter(CompareOperator.EQUAL, new SubstringComparator("value")));<a name="line.2646"></a>
-<span class="sourceLineNo">2647</span>    res = region.get(get);<a name="line.2647"></a>
-<span class="sourceLineNo">2648</span>    // When use value filter, the oldest version should still gone from user view and it<a name="line.2648"></a>
-<span class="sourceLineNo">2649</span>    // should only return one key vaule<a name="line.2649"></a>
-<span class="sourceLineNo">2650</span>    assertEquals(1, res.size());<a name="line.2650"></a>
-<span class="sourceLineNo">2651</span>    assertTrue(CellUtil.matchingValue(new KeyValue(row1, fam1, col1, value2), res.rawCells()[0]));<a name="line.2651"></a>
-<span class="sourceLineNo">2652</span>    assertEquals(ts + 3, res.rawCells()[0].getTimestamp());<a name="line.2652"></a>
-<span class="sourceLineNo">2653</span><a name="line.2653"></a>
-<span class="sourceLineNo">2654</span>    region.flush(true);<a name="line.2654"></a>
-<span class="sourceLineNo">2655</span>    region.compact(true);<a name="line.2655"></a>
-<span class="sourceLineNo">2656</span>    Thread.sleep(1000);<a name="line.2656"></a>
+<span class="sourceLineNo">2603</span>  @Test<a name="line.2603"></a>
+<span class="sourceLineNo">2604</span>  public void testGet_Empty() throws IOException {<a name="line.2604"></a>
+<span class="sourceLineNo">2605</span>    byte[] row = Bytes.toBytes("row");<a name="line.2605"></a>
+<span class="sourceLineNo">2606</span>    byte[] fam = Bytes.toBytes("fam");<a name="line.2606"></a>
+<span class="sourceLineNo">2607</span><a name="line.2607"></a>
+<span class="sourceLineNo">2608</span>    this.region = initHRegion(tableName, method, CONF, fam);<a name="line.2608"></a>
+<span class="sourceLineNo">2609</span>    Get get = new Get(row);<a name="line.2609"></a>
+<span class="sourceLineNo">2610</span>    get.addFamily(fam);<a name="line.2610"></a>
+<span class="sourceLineNo">2611</span>    Result r = region.get(get);<a name="line.2611"></a>
+<span class="sourceLineNo">2612</span><a name="line.2612"></a>
+<span class="sourceLineNo">2613</span>    assertTrue(r.isEmpty());<a name="line.2613"></a>
+<span class="sourceLineNo">2614</span>  }<a name="line.2614"></a>
+<span class="sourceLineNo">2615</span><a name="line.2615"></a>
+<span class="sourceLineNo">2616</span>  @Test<a name="line.2616"></a>
+<span class="sourceLineNo">2617</span>  public void testGetWithFilter() throws IOException, InterruptedException {<a name="line.2617"></a>
+<span class="sourceLineNo">2618</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2618"></a>
+<span class="sourceLineNo">2619</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2619"></a>
+<span class="sourceLineNo">2620</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.2620"></a>
+<span class="sourceLineNo">2621</span>    byte[] value1 = Bytes.toBytes("value1");<a name="line.2621"></a>
+<span class="sourceLineNo">2622</span>    byte[] value2 = Bytes.toBytes("value2");<a name="line.2622"></a>
+<span class="sourceLineNo">2623</span><a name="line.2623"></a>
+<span class="sourceLineNo">2624</span>    final int maxVersions = 3;<a name="line.2624"></a>
+<span class="sourceLineNo">2625</span>    HColumnDescriptor hcd = new HColumnDescriptor(fam1);<a name="line.2625"></a>
+<span class="sourceLineNo">2626</span>    hcd.setMaxVersions(maxVersions);<a name="line.2626"></a>
+<span class="sourceLineNo">2627</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf("testFilterAndColumnTracker"));<a name="line.2627"></a>
+<span class="sourceLineNo">2628</span>    htd.addFamily(hcd);<a name="line.2628"></a>
+<span class="sourceLineNo">2629</span>    ChunkCreator.initialize(MemStoreLABImpl.CHUNK_SIZE_DEFAULT, false, 0, 0, 0, null);<a name="line.2629"></a>
+<span class="sourceLineNo">2630</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.2630"></a>
+<span class="sourceLineNo">2631</span>    Path logDir = TEST_UTIL.getDataTestDirOnTestFS(method + ".log");<a name="line.2631"></a>
+<span class="sourceLineNo">2632</span>    final WAL wal = HBaseTestingUtility.createWal(TEST_UTIL.getConfiguration(), logDir, info);<a name="line.2632"></a>
+<span class="sourceLineNo">2633</span>    this.region = TEST_UTIL.createLocalHRegion(info, htd, wal);<a name="line.2633"></a>
+<span class="sourceLineNo">2634</span><a name="line.2634"></a>
+<span class="sourceLineNo">2635</span>    // Put 4 version to memstore<a name="line.2635"></a>
+<span class="sourceLineNo">2636</span>    long ts = 0;<a name="line.2636"></a>
+<span class="sourceLineNo">2637</span>    Put put = new Put(row1, ts);<a name="line.2637"></a>
+<span class="sourceLineNo">2638</span>    put.addColumn(fam1, col1, value1);<a name="line.2638"></a>
+<span class="sourceLineNo">2639</span>    region.put(put);<a name="line.2639"></a>
+<span class="sourceLineNo">2640</span>    put = new Put(row1, ts + 1);<a name="line.2640"></a>
+<span class="sourceLineNo">2641</span>    put.addColumn(fam1, col1, Bytes.toBytes("filter1"));<a name="line.2641"></a>
+<span class="sourceLineNo">2642</span>    region.put(put);<a name="line.2642"></a>
+<span class="sourceLineNo">2643</span>    put = new Put(row1, ts + 2);<a name="line.2643"></a>
+<span class="sourceLineNo">2644</span>    put.addColumn(fam1, col1, Bytes.toBytes("filter2"));<a name="line.2644"></a>
+<span class="sourceLineNo">2645</span>    region.put(put);<a name="line.2645"></a>
+<span class="sourceLineNo">2646</span>    put = new Put(row1, ts + 3);<a name="line.2646"></a>
+<span class="sourceLineNo">2647</span>    put.addColumn(fam1, col1, value2);<a name="line.2647"></a>
+<span class="sourceLineNo">2648</span>    region.put(put);<a name="line.2648"></a>
+<span class="sourceLineNo">2649</span><a name="line.2649"></a>
+<span class="sourceLineNo">2650</span>    Get get = new Get(row1);<a name="line.2650"></a>
+<span class="sourceLineNo">2651</span>    get.readAllVersions();<a name="line.2651"></a>
+<span class="sourceLineNo">2652</span>    Result res = region.get(get);<a name="line.2652"></a>
+<span class="sourceLineNo">2653</span>    // Get 3 versions, the oldest version has gone from user view<a name="line.2653"></a>
+<span class="sourceLineNo">2654</span>    assertEquals(maxVersions, res.size());<a name="line.2654"></a>
+<span class="sourceLineNo">2655</span><a name="line.2655"></a>
+<span class="sourceLineNo">2656</span>    get.setFilter(new ValueFilter(CompareOperator.EQUAL, new SubstringComparator("value")));<a name="line.2656"></a>
 <span class="sourceLineNo">2657</span>    res = region.get(get);<a name="line.2657"></a>
-<span class="sourceLineNo">2658</span>    // After flush and compact, the result should be consistent with previous result<a name="line.2658"></a>
-<span class="sourceLineNo">2659</span>    assertEquals(1, res.size());<a name="line.2659"></a>
-<span class="sourceLineNo">2660</span>    assertTrue(CellUtil.matchingValue(new KeyValue(row1, fam1, col1, value2), res.rawCells()[0]));<a name="line.2660"></a>
-<span class="sourceLineNo">2661</span>  }<a name="line.2661"></a>
-<span class="sourceLineNo">2662</span><a name="line.2662"></a>
-<span class="sourceLineNo">2663</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2663"></a>
-<span class="sourceLineNo">2664</span>  // Scanner tests<a name="line.2664"></a>
-<span class="sourceLineNo">2665</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2665"></a>
-<span class="sourceLineNo">2666</span>  @Test<a name="line.2666"></a>
-<span class="sourceLineNo">2667</span>  public void testGetScanner_WithOkFamilies() throws IOException {<a name="line.2667"></a>
-<span class="sourceLineNo">2668</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2668"></a>
-<span class="sourceLineNo">2669</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2669"></a>
-<span class="sourceLineNo">2670</span><a name="line.2670"></a>
-<span class="sourceLineNo">2671</span>    byte[][] families = { fam1, fam2 };<a name="line.2671"></a>
+<span class="sourceLineNo">2658</span>    // When use value filter, the oldest version should still gone from user view and it<a name="line.2658"></a>
+<span class="sourceLineNo">2659</span>    // should only return one key vaule<a name="line.2659"></a>
+<span class="sourceLineNo">2660</span>    assertEquals(1, res.size());<a name="line.2660"></a>
+<span class="sourceLineNo">2661</span>    assertTrue(CellUtil.matchingValue(new KeyValue(row1, fam1, col1, value2), res.rawCells()[0]));<a name="line.2661"></a>
+<span class="sourceLineNo">2662</span>    assertEquals(ts + 3, res.rawCells()[0].getTimestamp());<a name="line.2662"></a>
+<span class="sourceLineNo">2663</span><a name="line.2663"></a>
+<span class="sourceLineNo">2664</span>    region.flush(true);<a name="line.2664"></a>
+<span class="sourceLineNo">2665</span>    region.compact(true);<a name="line.2665"></a>
+<span class="sourceLineNo">2666</span>    Thread.sleep(1000);<a name="line.2666"></a>
+<span class="sourceLineNo">2667</span>    res = region.get(get);<a name="line.2667"></a>
+<span class="sourceLineNo">2668</span>    // After flush and compact, the result should be consistent with previous result<a name="line.2668"></a>
+<span class="sourceLineNo">2669</span>    assertEquals(1, res.size());<a name="line.2669"></a>
+<span class="sourceLineNo">2670</span>    assertTrue(CellUtil.matchingValue(new KeyValue(row1, fam1, col1, value2), res.rawCells()[0]));<a name="line.2670"></a>
+<span class="sourceLineNo">2671</span>  }<a name="line.2671"></a>
 <span class="sourceLineNo">2672</span><a name="line.2672"></a>
-<span class="sourceLineNo">2673</span>    // Setting up region<a name="line.2673"></a>
-<span class="sourceLineNo">2674</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2674"></a>
-<span class="sourceLineNo">2675</span>    Scan scan = new Scan();<a name="line.2675"></a>
-<span class="sourceLineNo">2676</span>    scan.addFamily(fam1);<a name="line.2676"></a>
-<span class="sourceLineNo">2677</span>    scan.addFamily(fam2);<a name="line.2677"></a>
-<span class="sourceLineNo">2678</span>    try {<a name="line.2678"></a>
-<span class="sourceLineNo">2679</span>      region.getScanner(scan);<a name="line.2679"></a>
-<span class="sourceLineNo">2680</span>    } catch (Exception e) {<a name="line.2680"></a>
-<span class="sourceLineNo">2681</span>      assertTrue("Families could not be found in Region", false);<a name="line.2681"></a>
-<span class="sourceLineNo">2682</span>    }<a name="line.2682"></a>
-<span class="sourceLineNo">2683</span>  }<a name="line.2683"></a>
-<span class="sourceLineNo">2684</span><a name="line.2684"></a>
-<span class="sourceLineNo">2685</span>  @Test<a name="line.2685"></a>
-<span class="sourceLineNo">2686</span>  public void testGetScanner_WithNotOkFamilies() throws IOException {<a name="line.2686"></a>
-<span class="sourceLineNo">2687</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2687"></a>
-<span class="sourceLineNo">2688</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2688"></a>
-<span class="sourceLineNo">2689</span><a name="line.2689"></a>
-<span class="sourceLineNo">2690</span>    byte[][] families = { fam1 };<a name="line.2690"></a>
-<span class="sourceLineNo">2691</span><a name="line.2691"></a>
-<span class="sourceLineNo">2692</span>    // Setting up region<a name="line.2692"></a>
-<span class="sourceLineNo">2693</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2693"></a>
-<span class="sourceLineNo">2694</span>    Scan scan = new Scan();<a name="line.2694"></a>
-<span class="sourceLineNo">2695</span>    scan.addFamily(fam2);<a name="line.2695"></a>
-<span class="sourceLineNo">2696</span>    boolean ok = false;<a name="line.2696"></a>
-<span class="sourceLineNo">2697</span>    try {<a name="line.2697"></a>
-<span class="sourceLineNo">2698</span>      region.getScanner(scan);<a name="line.2698"></a>
-<span class="sourceLineNo">2699</span>    } catch (Exception e) {<a name="line.2699"></a>
-<span class="sourceLineNo">2700</span>      ok = true;<a name="line.2700"></a>
-<span class="sourceLineNo">2701</span>    }<a name="line.2701"></a>
-<span class="sourceLineNo">2702</span>    assertTrue("Families could not be found in Region", ok);<a name="line.2702"></a>
-<span class="sourceLineNo">2703</span>  }<a name="line.2703"></a>
-<span class="sourceLineNo">2704</span><a name="line.2704"></a>
-<span class="sourceLineNo">2705</span>  @Test<a name="line.2705"></a>
-<span class="sourceLineNo">2706</span>  public void testGetScanner_WithNoFamilies() throws IOException {<a name="line.2706"></a>
-<span class="sourceLineNo">2707</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2707"></a>
-<span class="sourceLineNo">2708</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2708"></a>
-<span class="sourceLineNo">2709</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2709"></a>
-<span class="sourceLineNo">2710</span>    byte[] fam3 = Bytes.toBytes("fam3");<a name="line.2710"></a>
-<span class="sourceLineNo">2711</span>    byte[] fam4 = Bytes.toBytes("fam4");<a name="line.2711"></a>
-<span class="sourceLineNo">2712</span><a name="line.2712"></a>
-<span class="sourceLineNo">2713</span>    byte[][] families = { fam1, fam2, fam3, fam4 };<a name="line.2713"></a>
+<span class="sourceLineNo">2673</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2673"></a>
+<span class="sourceLineNo">2674</span>  // Scanner tests<a name="line.2674"></a>
+<span class="sourceLineNo">2675</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2675"></a>
+<span class="sourceLineNo">2676</span>  @Test<a name="line.2676"></a>
+<span class="sourceLineNo">2677</span>  public void testGetScanner_WithOkFamilies() throws IOException {<a name="line.2677"></a>
+<span class="sourceLineNo">2678</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2678"></a>
+<span class="sourceLineNo">2679</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2679"></a>
+<span class="sourceLineNo">2680</span><a name="line.2680"></a>
+<span class="sourceLineNo">2681</span>    byte[][] families = { fam1, fam2 };<a name="line.2681"></a>
+<span class="sourceLineNo">2682</span><a name="line.2682"></a>
+<span class="sourceLineNo">2683</span>    // Setting up region<a name="line.2683"></a>
+<span class="sourceLineNo">2684</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2684"></a>
+<span class="sourceLineNo">2685</span>    Scan scan = new Scan();<a name="line.2685"></a>
+<span class="sourceLineNo">2686</span>    scan.addFamily(fam1);<a name="line.2686"></a>
+<span class="sourceLineNo">2687</span>    scan.addFamily(fam2);<a name="line.2687"></a>
+<span class="sourceLineNo">2688</span>    try {<a name="line.2688"></a>
+<span class="sourceLineNo">2689</span>      region.getScanner(scan);<a name="line.2689"></a>
+<span class="sourceLineNo">2690</span>    } catch (Exception e) {<a name="line.2690"></a>
+<span class="sourceLineNo">2691</span>      assertTrue("Families could not be found in Region", false);<a name="line.2691"></a>
+<span class="sourceLineNo">2692</span>    }<a name="line.2692"></a>
+<span class="sourceLineNo">2693</span>  }<a name="line.2693"></a>
+<span class="sourceLineNo">2694</span><a name="line.2694"></a>
+<span class="sourceLineNo">2695</span>  @Test<a name="line.2695"></a>
+<span class="sourceLineNo">2696</span>  public void testGetScanner_WithNotOkFamilies() throws IOException {<a name="line.2696"></a>
+<span class="sourceLineNo">2697</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2697"></a>
+<span class="sourceLineNo">2698</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2698"></a>
+<span class="sourceLineNo">2699</span><a name="line.2699"></a>
+<span class="sourceLineNo">2700</span>    byte[][] families = { fam1 };<a name="line.2700"></a>
+<span class="sourceLineNo">2701</span><a name="line.2701"></a>
+<span class="sourceLineNo">2702</span>    // Setting up region<a name="line.2702"></a>
+<span class="sourceLineNo">2703</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2703"></a>
+<span class="sourceLineNo">2704</span>    Scan scan = new Scan();<a name="line.2704"></a>
+<span class="sourceLineNo">2705</span>    scan.addFamily(fam2);<a name="line.2705"></a>
+<span class="sourceLineNo">2706</span>    boolean ok = false;<a name="line.2706"></a>
+<span class="sourceLineNo">2707</span>    try {<a name="line.2707"></a>
+<span class="sourceLineNo">2708</span>      region.getScanner(scan);<a name="line.2708"></a>
+<span class="sourceLineNo">2709</span>    } catch (Exception e) {<a name="line.2709"></a>
+<span class="sourceLineNo">2710</span>      ok = true;<a name="line.2710"></a>
+<span class="sourceLineNo">2711</span>    }<a name="line.2711"></a>
+<span class="sourceLineNo">2712</span>    assertTrue("Families could not be found in Region", ok);<a name="line.2712"></a>
+<span class="sourceLineNo">2713</span>  }<a name="line.2713"></a>
 <span class="sourceLineNo">2714</span><a name="line.2714"></a>
-<span class="sourceLineNo">2715</span>    // Setting up region<a name="line.2715"></a>
-<span class="sourceLineNo">2716</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2716"></a>
-<span class="sourceLineNo">2717</span>    // Putting data in Region<a name="line.2717"></a>
-<span class="sourceLineNo">2718</span>    Put put = new Put(row1);<a name="line.2718"></a>
-<span class="sourceLineNo">2719</span>    put.addColumn(fam1, null, null);<a name="line.2719"></a>
-<span class="sourceLineNo">2720</span>    put.addColumn(fam2, null, null);<a name="line.2720"></a>
-<span class="sourceLineNo">2721</span>    put.addColumn(fam3, null, null);<a name="line.2721"></a>
-<span class="sourceLineNo">2722</span>    put.addColumn(fam4, null, null);<a name="line.2722"></a>
-<span class="sourceLineNo">2723</span>    region.put(put);<a name="line.2723"></a>
+<span class="sourceLineNo">2715</span>  @Test<a name="line.2715"></a>
+<span class="sourceLineNo">2716</span>  public void testGetScanner_WithNoFamilies() throws IOException {<a name="line.2716"></a>
+<span class="sourceLineNo">2717</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2717"></a>
+<span class="sourceLineNo">2718</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2718"></a>
+<span class="sourceLineNo">2719</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2719"></a>
+<span class="sourceLineNo">2720</span>    byte[] fam3 = Bytes.toBytes("fam3");<a name="line.2720"></a>
+<span class="sourceLineNo">2721</span>    byte[] fam4 = Bytes.toBytes("fam4");<a name="line.2721"></a>
+<span class="sourceLineNo">2722</span><a name="line.2722"></a>
+<span class="sourceLineNo">2723</span>    byte[][] families = { fam1, fam2, fam3, fam4 };<a name="line.2723"></a>
 <span class="sourceLineNo">2724</span><a name="line.2724"></a>
-<span class="sourceLineNo">2725</span>    Scan scan = null;<a name="line.2725"></a>
-<span class="sourceLineNo">2726</span>    HRegion.RegionScannerImpl is = null;<a name="line.2726"></a>
-<span class="sourceLineNo">2727</span><a name="line.2727"></a>
-<span class="sourceLineNo">2728</span>    // Testing to see how many scanners that is produced by getScanner,<a name="line.2728"></a>
-<span class="sourceLineNo">2729</span>    // starting<a name="line.2729"></a>
-<span class="sourceLineNo">2730</span>    // with known number, 2 - current = 1<a name="line.2730"></a>
-<span class="sourceLineNo">2731</span>    scan = new Scan();<a name="line.2731"></a>
-<span class="sourceLineNo">2732</span>    scan.addFamily(fam2);<a name="line.2732"></a>
-<span class="sourceLineNo">2733</span>    scan.addFamily(fam4);<a name="line.2733"></a>
-<span class="sourceLineNo">2734</span>    is = region.getScanner(scan);<a name="line.2734"></a>
-<span class="sourceLineNo">2735</span>    assertEquals(1, is.storeHeap.getHeap().size());<a name="line.2735"></a>
-<span class="sourceLineNo">2736</span><a name="line.2736"></a>
-<span class="sourceLineNo">2737</span>    scan = new Scan();<a name="line.2737"></a>
-<span class="sourceLineNo">2738</span>    is = region.getScanner(scan);<a name="line.2738"></a>
-<span class="sourceLineNo">2739</span>    assertEquals(families.length - 1, is.storeHeap.getHeap().size());<a name="line.2739"></a>
-<span class="sourceLineNo">2740</span>  }<a name="line.2740"></a>
-<span class="sourceLineNo">2741</span><a name="line.2741"></a>
-<span class="sourceLineNo">2742</span>  /**<a name="line.2742"></a>
-<span class="sourceLineNo">2743</span>   * This method tests https://issues.apache.org/jira/browse/HBASE-2516.<a name="line.2743"></a>
-<span class="sourceLineNo">2744</span>   *<a name="line.2744"></a>
-<span class="sourceLineNo">2745</span>   * @throws IOException<a name="line.2745"></a>
-<span class="sourceLineNo">2746</span>   */<a name="line.2746"></a>
-<span class="sourceLineNo">2747</span>  @Test<a name="line.2747"></a>
-<span class="sourceLineNo">2748</span>  public void testGetScanner_WithRegionClosed() throws IOException {<a name="line.2748"></a>
-<span class="sourceLineNo">2749</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2749"></a>
-<span class="sourceLineNo">2750</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2750"></a>
+<span class="sourceLineNo">2725</span>    // Setting up region<a name="line.2725"></a>
+<span class="sourceLineNo">2726</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2726"></a>
+<span class="sourceLineNo">2727</span>    // Putting data in Region<a name="line.2727"></a>
+<span class="sourceLineNo">2728</span>    Put put = new Put(row1);<a name="line.2728"></a>
+<span class="sourceLineNo">2729</span>    put.addColumn(fam1, null, null);<a name="line.2729"></a>
+<span class="sourceLineNo">2730</span>    put.addColumn(fam2, null, null);<a name="line.2730"></a>
+<span class="sourceLineNo">2731</span>    put.addColumn(fam3, null, null);<a name="line.2731"></a>
+<span class="sourceLineNo">2732</span>    put.addColumn(fam4, null, null);<a name="line.2732"></a>
+<span class="sourceLineNo">2733</span>    region.put(put);<a name="line.2733"></a>
+<span class="sourceLineNo">2734</span><a name="line.2734"></a>
+<span class="sourceLineNo">2735</span>    Scan scan = null;<a name="line.2735"></a>
+<span class="sourceLineNo">2736</span>    HRegion.RegionScannerImpl is = null;<a name="line.2736"></a>
+<span class="sourceLineNo">2737</span><a name="line.2737"></a>
+<span class="sourceLineNo">2738</span>    // Testing to see how many scanners that is produced by getScanner,<a name="line.2738"></a>
+<span class="sourceLineNo">2739</span>    // starting<a name="line.2739"></a>
+<span class="sourceLineNo">2740</span>    // with known number, 2 - current = 1<a name="line.2740"></a>
+<span class="sourceLineNo">2741</span>    scan = new Scan();<a name="line.2741"></a>
+<span class="sourceLineNo">2742</span>    scan.addFamily(fam2);<a name="line.2742"></a>
+<span class="sourceLineNo">2743</span>    scan.addFamily(fam4);<a name="line.2743"></a>
+<span class="sourceLineNo">2744</span>    is = region.getScanner(scan);<a name="line.2744"></a>
+<span class="sourceLineNo">2745</span>    assertEquals(1, is.storeHeap.getHeap().size());<a name="line.2745"></a>
+<span class="sourceLineNo">2746</span><a name="line.2746"></a>
+<span class="sourceLineNo">2747</span>    scan = new Scan();<a name="line.2747"></a>
+<span class="sourceLineNo">2748</span>    is = region.getScanner(scan);<a name="line.2748"></a>
+<span class="sourceLineNo">2749</span>    assertEquals(families.length - 1, is.storeHeap.getHeap().size());<a name="line.2749"></a>
+<span class="sourceLineNo">2750</span>  }<a name="line.2750"></a>
 <span class="sourceLineNo">2751</span><a name="line.2751"></a>
-<span class="sourceLineNo">2752</span>    byte[][] families = { fam1, fam2 };<a name="line.2752"></a>
-<span class="sourceLineNo">2753</span><a name="line.2753"></a>
-<span class="sourceLineNo">2754</span>    // Setting up region<a name="line.2754"></a>
-<span class="sourceLineNo">2755</span>    try {<a name="line.2755"></a>
-<span class="sourceLineNo">2756</span>      this.region = initHRegion(tableName, method, CONF, families);<a name="line.2756"></a>
-<span class="sourceLineNo">2757</span>    } catch (IOException e) {<a name="line.2757"></a>
-<span class="sourceLineNo">2758</span>      e.printStackTrace();<a name="line.2758"></a>
-<span class="sourceLineNo">2759</span>      fail("Got IOException during initHRegion, " + e.getMessage());<a name="line.2759"></a>
-<span class="sourceLineNo">2760</span>    }<a name="line.2760"></a>
-<span class="sourceLineNo">2761</span>    region.closed.set(true);<a name="line.2761"></a>
-<span class="sourceLineNo">2762</span>    try {<a name="line.2762"></a>
-<span class="sourceLineNo">2763</span>      region.getScanner(null);<a name="line.2763"></a>
-<span class="sourceLineNo">2764</span>      fail("Expected to get an exception during getScanner on a region that is closed");<a name="line.2764"></a>
-<span class="sourceLineNo">2765</span>    } catch (NotServingRegionException e) {<a name="line.2765"></a>
-<span class="sourceLineNo">2766</span>      // this is the correct exception that is expected<a name="line.2766"></a>
+<span class="sourceLineNo">2752</span>  /**<a name="line.2752"></a>
+<span class="sourceLineNo">2753</span>   * This method tests https://issues.apache.org/jira/browse/HBASE-2516.<a name="line.2753"></a>
+<span class="sourceLineNo">2754</span>   *<a name="line.2754"></a>
+<span class="sourceLineNo">2755</span>   * @throws IOException<a name="line.2755"></a>
+<span class="sourceLineNo">2756</span>   */<a name="line.2756"></a>
+<span class="sourceLineNo">2757</span>  @Test<a name="line.2757"></a>
+<span class="sourceLineNo">2758</span>  public void testGetScanner_WithRegionClosed() throws IOException {<a name="line.2758"></a>
+<span class="sourceLineNo">2759</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2759"></a>
+<span class="sourceLineNo">2760</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2760"></a>
+<span class="sourceLineNo">2761</span><a name="line.2761"></a>
+<span class="sourceLineNo">2762</span>    byte[][] families = { fam1, fam2 };<a name="line.2762"></a>
+<span class="sourceLineNo">2763</span><a name="line.2763"></a>
+<span class="sourceLineNo">2764</span>    // Setting up region<a name="line.2764"></a>
+<span class="sourceLineNo">2765</span>    try {<a name="line.2765"></a>
+<span class="sourceLineNo">2766</span>      this.region = initHRegion(tableName, method, CONF, families);<a name="line.2766"></a>
 <span class="sourceLineNo">2767</span>    } catch (IOException e) {<a name="line.2767"></a>
-<span class="sourceLineNo">2768</span>      fail("Got wrong type of exception - should be a NotServingRegionException, " +<a name="line.2768"></a>
-<span class="sourceLineNo">2769</span>          "but was an IOException: "<a name="line.2769"></a>
-<span class="sourceLineNo">2770</span>          + e.getMessage());<a name="line.2770"></a>
-<span class="sourceLineNo">2771</span>    }<a name="line.2771"></a>
-<span class="sourceLineNo">2772</span>  }<a name="line.2772"></a>
-<span class="sourceLineNo">2773</span><a name="line.2773"></a>
-<span class="sourceLineNo">2774</span>  @Test<a name="line.2774"></a>
-<span class="sourceLineNo">2775</span>  public void testRegionScanner_Next() throws IOException {<a name="line.2775"></a>
-<span class="sourceLineNo">2776</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2776"></a>
-<span class="sourceLineNo">2777</span>    byte[] row2 = Bytes.toBytes("row2");<a name="line.2777"></a>
-<span class="sourceLineNo">2778</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2778"></a>
-<span class="sourceLineNo">2779</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2779"></a>
-<span class="sourceLineNo">2780</span>    byte[] fam3 = Bytes.toBytes("fam3");<a name="line.2780"></a>
-<span class="sourceLineNo">2781</span>    byte[] fam4 = Bytes.toBytes("fam4");<a name="line.2781"></a>
-<span class="sourceLineNo">2782</span><a name="line.2782"></a>
-<span class="sourceLineNo">2783</span>    byte[][] families = { fam1, fam2, fam3, fam4 };<a name="line.2783"></a>
-<span class="sourceLineNo">2784</span>    long ts = System.currentTimeMillis();<a name="line.2784"></a>
-<span class="sourceLineNo">2785</span><a name="line.2785"></a>
-<span class="sourceLineNo">2786</span>    // Setting up region<a name="line.2786"></a>
-<span class="sourceLineNo">2787</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2787"></a>
-<span class="sourceLineNo">2788</span>    // Putting data in Region<a name="line.2788"></a>
-<span class="sourceLineNo">2789</span>    Put put = null;<a name="line.2789"></a>
-<span class="sourceLineNo">2790</span>    put = new Put(row1);<a name="line.2790"></a>
-<span class="sourceLineNo">2791</span>    put.addColumn(fam1, (byte[]) null, ts, null);<a name="line.2791"></a>
-<span class="sourceLineNo">2792</span>    put.addColumn(fam2, (byte[]) null, ts, null);<a name="line.2792"></a>
-<span class="sourceLineNo">2793</span>    put.addColumn(fam3, (byte[]) null, ts, null);<a name="line.2793"></a>
-<span class="sourceLineNo">2794</span>    put.addColumn(fam4, (byte[]) null, ts, null);<a name="line.2794"></a>
-<span class="sourceLineNo">2795</span>    region.put(put);<a name="line.2795"></a>
-<span class="sourceLineNo">2796</span><a name="line.2796"></a>
-<span class="sourceLineNo">2797</span>    put = new Put(row2);<a name="line.2797"></a>
-<span class="sourceLineNo">2798</span>    put.addColumn(fam1, (byte[]) null, ts, null);<a name="line.2798"></a>
-<span class="sourceLineNo">2799</span>    put.addColumn(fam2, (byte[]) null, ts, null);<a name="line.2799"></a>
-<span class="sourceLineNo">2800</span>    put.addColumn(fam3, (byte[]) null, ts, null);<a name="line.2800"></a>
-<span class="sourceLineNo">2801</span>    put.addColumn(fam4, (byte[]) null, ts, null);<a name="line.2801"></a>
-<span class="sourceLineNo">2802</span>    region.put(put);<a name="line.2802"></a>
-<span class="sourceLineNo">2803</span><a name="line.2803"></a>
-<span class="sourceLineNo">2804</span>    Scan scan = new Scan();<a name="line.2804"></a>
-<span class="sourceLineNo">2805</span>    scan.addFamily(fam2);<a name="line.2805"></a>
-<span class="sourceLineNo">2806</span>    scan.addFamily(fam4);<a name="line.2806"></a>
-<span class="sourceLineNo">2807</span>    InternalScanner is = region.getScanner(scan);<a name="line.2807"></a>
-<span class="sourceLineNo">2808</span><a name="line.2808"></a>
-<span class="sourceLineNo">2809</span>    List&lt;Cell&gt; res = null;<a name="line.2809"></a>
-<span class="sourceLineNo">2810</span><a name="line.2810"></a>
-<span class="sourceLineNo">2811</span>    // Result 1<a name="line.2811"></a>
-<span class="sourceLineNo">2812</span>    List&lt;Cell&gt; expected1 = new ArrayList&lt;&gt;();<a name="line.2812"></a>
-<span class="sourceLineNo">2813</span>    expected1.add(new KeyValue(row1, fam2, null, ts, KeyValue.Type.Put, null));<a name="line.2813"></a>
-<span class="sourceLineNo">2814</span>    expected1.add(new KeyValue(row1, fam4, null, ts, KeyValue.Type.Put, null));<a name="line.2814"></a>
-<span class="sourceLineNo">2815</span><a name="line.2815"></a>
-<span class="sourceLineNo">2816</span>    res = new ArrayList&lt;&gt;();<a name="line.2816"></a>
-<span class="sourceLineNo">2817</span>    is.next(res);<a name="line.2817"></a>
-<span class="sourceLineNo">2818</span>    for (int i = 0; i &lt; res.size(); i++) {<a name="line.2818"></a>
-<span class="sourceLineNo">2819</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected1.get(i), res.get(i)));<a name="line.2819"></a>
-<span class="sourceLineNo">2820</span>    }<a name="line.2820"></a>
-<span class="sourceLineNo">2821</span><a name="line.2821"></a>
-<span class="sourceLineNo">2822</span>    // Result 2<a name="line.2822"></a>
-<span class="sourceLineNo">2823</span>    List&lt;Cell&gt; expected2 = new ArrayList&lt;&gt;();<a name="line.2823"></a>
-<span class="sourceLineNo">2824</span>    expected2.add(new KeyValue(row2, fam2, null, ts, KeyValue.Type.Put, null));<a name="line.2824"></a>
-<span class="sourceLineNo">2825</span>    expected2.add(new KeyValue(row2, fam4, null, ts, KeyValue.Type.Put, null));<a name="line.2825"></a>
-<span class="sourceLineNo">2826</span><a name="line.2826"></a>
-<span class="sourceLineNo">2827</span>    res = new ArrayList&lt;&gt;();<a name="line.2827"></a>
-<span class="sourceLineNo">2828</span>    is.next(res);<a name="line.2828"></a>
-<span class="sourceLineNo">2829</span>    for (int i = 0; i &lt; res.size(); i++) {<a name="line.2829"></a>
-<span class="sourceLineNo">2830</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected2.get(i), res.get(i)));<a name="line.2830"></a>
-<span class="sourceLineNo">2831</span>    }<a name="line.2831"></a>
-<span class="sourceLineNo">2832</span>  }<a name="line.2832"></a>
-<span class="sourceLineNo">2833</span><a name="line.2833"></a>
-<span class="sourceLineNo">2834</span>  @Test<a name="line.2834"></a>
-<span class="sourceLineNo">2835</span>  public void testScanner_ExplicitColumns_FromMemStore_EnforceVersions() throws IOException {<a name="line.2835"></a>
-<span class="sourceLineNo">2836</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2836"></a>
-<span class="sourceLineNo">2837</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.2837"></a>
-<span class="sourceLineNo">2838</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.2838"></a>
-<span class="sourceLineNo">2839</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2839"></a>
-<span class="sourceLineNo">2840</span>    byte[][] families = { fam1 };<a name="line.2840"></a>
-<span class="sourceLineNo">2841</span><a name="line.2841"></a>
-<span class="sourceLineNo">2842</span>    long ts1 = System.currentTimeMillis();<a name="line.2842"></a>
-<span class="sourceLineNo">2843</span>    long ts2 = ts1 + 1;<a name="line.2843"></a>
-<span class="sourceLineNo">2844</span>    long ts3 = ts1 + 2;<a name="line.2844"></a>
-<span class="sourceLineNo">2845</span><a name="line.2845"></a>
-<span class="sourceLineNo">2846</span>    // Setting up region<a name="line.2846"></a>
-<span class="sourceLineNo">2847</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2847"></a>
-<span class="sourceLineNo">2848</span>    // Putting data in Region<a name="line.2848"></a>
-<span class="sourceLineNo">2849</span>    Put put = null;<a name="line.2849"></a>
-<span class="sourceLineNo">2850</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.2850"></a>
-<span class="sourceLineNo">2851</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.2851"></a>
-<span class="sourceLineNo">2852</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.2852"></a>
-<span class="sourceLineNo">2853</span><a name="line.2853"></a>
-<span class="sourceLineNo">2854</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.2854"></a>
-<span class="sourceLineNo">2855</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.2855"></a>
-<span class="sourceLineNo">2856</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.2856"></a>
-<span class="sourceLineNo">2857</span><a name="line.2857"></a>
-<span class="sourceLineNo">2858</span>    put = new Put(row1);<a name="line.2858"></a>
-<span class="sourceLineNo">2859</span>    put.add(kv13);<a name="line.2859"></a>
-<span class="sourceLineNo">2860</span>    put.add(kv12);<a name="line.2860"></a>
-<span class="sourceLineNo">2861</span>    put.add(kv11);<a name="line.2861"></a>
-<span class="sourceLineNo">2862</span>    put.add(kv23);<a name="line.2862"></a>
-<span class="sourceLineNo">2863</span>    put.add(kv22);<a name="line.2863"></a>
-<span class="sourceLineNo">2864</span>    put.add(kv21);<a name="line.2864"></a>
-<span class="sourceLineNo">2865</span>    region.put(put);<a name="line.2865"></a>
-<span class="sourceLineNo">2866</span><a name="line.2866"></a>
-<span class="sourceLineNo">2867</span>    // Expected<a name="line.2867"></a>
-<span class="sourceLineNo">2868</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.2868"></a>
-<span class="sourceLineNo">2869</span>    expected.add(kv13);<a name="line.2869"></a>
-<span class="sourceLineNo">2870</span>    expected.add(kv12);<a name="line.2870"></a>
-<span class="sourceLineNo">2871</span><a name="line.2871"></a>
-<span class="sourceLineNo">2872</span>    Scan scan = new Scan(row1);<a name="line.2872"></a>
-<span class="sourceLineNo">2873</span>    scan.addColumn(fam1, qf1);<a name="line.2873"></a>
-<span class="sourceLineNo">2874</span>    scan.setMaxVersions(MAX_VERSIONS);<a name="line.2874"></a>
-<span class="sourceLineNo">2875</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.2875"></a>
-<span class="sourceLineNo">2876</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.2876"></a>
-<span class="sourceLineNo">2877</span><a name="line.2877"></a>
-<span class="sourceLineNo">2878</span>    boolean hasNext = scanner.next(actual);<a name="line.2878"></a>
-<span class="sourceLineNo">2879</span>    assertEquals(false, hasNext);<a name="line.2879"></a>
-<span class="sourceLineNo">2880</span><a name="line.2880"></a>
-<span class="sourceLineNo">2881</span>    // Verify result<a name="line.2881"></a>
-<span class="sourceLineNo">2882</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.2882"></a>
-<span class="sourceLineNo">2883</span>      assertEquals(expected.get(i), actual.get(i));<a name="line.2883"></a>
-<span class="sourceLineNo">2884</span>    }<a name="line.2884"></a>
-<span class="sourceLineNo">2885</span>  }<a name="line.2885"></a>
-<span class="sourceLineNo">2886</span><a name="line.2886"></a>
-<span class="sourceLineNo">2887</span>  @Test<a name="line.2887"></a>
-<span class="sourceLineNo">2888</span>  public void testScanner_ExplicitColumns_FromFilesOnly_EnforceVersions() throws IOException {<a name="line.2888"></a>
-<span class="sourceLineNo">2889</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2889"></a>
-<span class="sourceLineNo">2890</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.2890"></a>
-<span class="sourceLineNo">2891</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.2891"></a>
-<span class="sourceLineNo">2892</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2892"></a>
-<span class="sourceLineNo">2893</span>    byte[][] families = { fam1 };<a name="line.2893"></a>
-<span class="sourceLineNo">2894</span><a name="line.2894"></a>
-<span class="sourceLineNo">2895</span>    long ts1 = 1; // System.currentTimeMillis();<a name="line.2895"></a>
-<span class="sourceLineNo">2896</span>    long ts2 = ts1 + 1;<a name="line.2896"></a>
-<span class="sourceLineNo">2897</span>    long ts3 = ts1 + 2;<a name="line.2897"></a>
-<span class="sourceLineNo">2898</span><a name="line.2898"></a>
-<span class="sourceLineNo">2899</span>    // Setting up region<a name="line.2899"></a>
-<span class="sourceLineNo">2900</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2900"></a>
-<span class="sourceLineNo">2901</span>    // Putting data in Region<a name="line.2901"></a>
-<span class="sourceLineNo">2902</span>    Put put = null;<a name="line.2902"></a>
-<span class="sourceLineNo">2903</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.2903"></a>
-<span class="sourceLineNo">2904</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.2904"></a>
-<span class="sourceLineNo">2905</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.2905"></a>
-<span class="sourceLineNo">2906</span><a name="line.2906"></a>
-<span class="sourceLineNo">2907</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.2907"></a>
-<span class="sourceLineNo">2908</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.2908"></a>
-<span class="sourceLineNo">2909</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.2909"></a>
-<span class="sourceLineNo">2910</span><a name="line.2910"></a>
-<span class="sourceLineNo">2911</span>    put = new Put(row1);<a name="line.2911"></a>
-<span class="sourceLineNo">2912</span>    put.add(kv13);<a name="line.2912"></a>
-<span class="sourceLineNo">2913</span>    put.add(kv12);<a name="line.2913"></a>
-<span class="sourceLineNo">2914</span>    put.add(kv11);<a name="line.2914"></a>
-<span class="sourceLineNo">2915</span>    put.add(kv23);<a name="line.2915"></a>
-<span class="sourceLineNo">2916</span>    put.add(kv22);<a name="line.2916"></a>
-<span class="sourceLineNo">2917</span>    put.add(kv21);<a name="line.2917"></a>
-<span class="sourceLineNo">2918</span>    region.put(put);<a name="line.2918"></a>
-<span class="sourceLineNo">2919</span>    region.flush(true);<a name="line.2919"></a>
+<span class="sourceLineNo">2768</span>      e.printStackTrace();<a name="line.2768"></a>
+<span class="sourceLineNo">2769</span>      fail("Got IOException during initHRegion, " + e.getMessage());<a name="line.2769"></a>
+<span class="sourceLineNo">2770</span>    }<a name="line.2770"></a>
+<span class="sourceLineNo">2771</span>    region.closed.set(true);<a name="line.2771"></a>
+<span class="sourceLineNo">2772</span>    try {<a name="line.2772"></a>
+<span class="sourceLineNo">2773</span>      region.getScanner(null);<a name="line.2773"></a>
+<span class="sourceLineNo">2774</span>      fail("Expected to get an exception during getScanner on a region that is closed");<a name="line.2774"></a>
+<span class="sourceLineNo">2775</span>    } catch (NotServingRegionException e) {<a name="line.2775"></a>
+<span class="sourceLineNo">2776</span>      // this is the correct exception that is expected<a name="line.2776"></a>
+<span class="sourceLineNo">2777</span>    } catch (IOException e) {<a name="line.2777"></a>
+<span class="sourceLineNo">2778</span>      fail("Got wrong type of exception - should be a NotServingRegionException, " +<a name="line.2778"></a>
+<span class="sourceLineNo">2779</span>          "but was an IOException: "<a name="line.2779"></a>
+<span class="sourceLineNo">2780</span>          + e.getMessage());<a name="line.2780"></a>
+<span class="sourceLineNo">2781</span>    }<a name="line.2781"></a>
+<span class="sourceLineNo">2782</span>  }<a name="line.2782"></a>
+<span class="sourceLineNo">2783</span><a name="line.2783"></a>
+<span class="sourceLineNo">2784</span>  @Test<a name="line.2784"></a>
+<span class="sourceLineNo">2785</span>  public void testRegionScanner_Next() throws IOException {<a name="line.2785"></a>
+<span class="sourceLineNo">2786</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2786"></a>
+<span class="sourceLineNo">2787</span>    byte[] row2 = Bytes.toBytes("row2");<a name="line.2787"></a>
+<span class="sourceLineNo">2788</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2788"></a>
+<span class="sourceLineNo">2789</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2789"></a>
+<span class="sourceLineNo">2790</span>    byte[] fam3 = Bytes.toBytes("fam3");<a name="line.2790"></a>
+<span class="sourceLineNo">2791</span>    byte[] fam4 = Bytes.toBytes("fam4");<a name="line.2791"></a>
+<span class="sourceLineNo">2792</span><a name="line.2792"></a>
+<span class="sourceLineNo">2793</span>    byte[][] families = { fam1, fam2, fam3, fam4 };<a name="line.2793"></a>
+<span class="sourceLineNo">2794</span>    long ts = System.currentTimeMillis();<a name="line.2794"></a>
+<span class="sourceLineNo">2795</span><a name="line.2795"></a>
+<span class="sourceLineNo">2796</span>    // Setting up region<a name="line.2796"></a>
+<span class="sourceLineNo">2797</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2797"></a>
+<span class="sourceLineNo">2798</span>    // Putting data in Region<a name="line.2798"></a>
+<span class="sourceLineNo">2799</span>    Put put = null;<a name="line.2799"></a>
+<span class="sourceLineNo">2800</span>    put = new Put(row1);<a name="line.2800"></a>
+<span class="sourceLineNo">2801</span>    put.addColumn(fam1, (byte[]) null, ts, null);<a name="line.2801"></a>
+<span class="sourceLineNo">2802</span>    put.addColumn(fam2, (byte[]) null, ts, null);<a name="line.2802"></a>
+<span class="sourceLineNo">2803</span>    put.addColumn(fam3, (byte[]) null, ts, null);<a name="line.2803"></a>
+<span class="sourceLineNo">2804</span>    put.addColumn(fam4, (byte[]) null, ts, null);<a name="line.2804"></a>
+<span class="sourceLineNo">2805</span>    region.put(put);<a name="line.2805"></a>
+<span class="sourceLineNo">2806</span><a name="line.2806"></a>
+<span class="sourceLineNo">2807</span>    put = new Put(row2);<a name="line.2807"></a>
+<span class="sourceLineNo">2808</span>    put.addColumn(fam1, (byte[]) null, ts, null);<a name="line.2808"></a>
+<span class="sourceLineNo">2809</span>    put.addColumn(fam2, (byte[]) null, ts, null);<a name="line.2809"></a>
+<span class="sourceLineNo">2810</span>    put.addColumn(fam3, (byte[]) null, ts, null);<a name="line.2810"></a>
+<span class="sourceLineNo">2811</span>    put.addColumn(fam4, (byte[]) null, ts, null);<a name="line.2811"></a>
+<span class="sourceLineNo">2812</span>    region.put(put);<a name="line.2812"></a>
+<span class="sourceLineNo">2813</span><a name="line.2813"></a>
+<span class="sourceLineNo">2814</span>    Scan scan = new Scan();<a name="line.2814"></a>
+<span class="sourceLineNo">2815</span>    scan.addFamily(fam2);<a name="line.2815"></a>
+<span class="sourceLineNo">2816</span>    scan.addFamily(fam4);<a name="line.2816"></a>
+<span class="sourceLineNo">2817</span>    InternalScanner is = region.getScanner(scan);<a name="line.2817"></a>
+<span class="sourceLineNo">2818</span><a name="line.2818"></a>
+<span class="sourceLineNo">2819</span>    List&lt;Cell&gt; res = null;<a name="line.2819"></a>
+<span class="sourceLineNo">2820</span><a name="line.2820"></a>
+<span class="sourceLineNo">2821</span>    // Result 1<a name="line.2821"></a>
+<span class="sourceLineNo">2822</span>    List&lt;Cell&gt; expected1 = new ArrayList&lt;&gt;();<a name="line.2822"></a>
+<span class="sourceLineNo">2823</span>    expected1.add(new KeyValue(row1, fam2, null, ts, KeyValue.Type.Put, null));<a name="line.2823"></a>
+<span class="sourceLineNo">2824</span>    expected1.add(new KeyValue(row1, fam4, null, ts, KeyValue.Type.Put, null));<a name="line.2824"></a>
+<span class="sourceLineNo">2825</span><a name="line.2825"></a>
+<span class="sourceLineNo">2826</span>    res = new ArrayList&lt;&gt;();<a name="line.2826"></a>
+<span class="sourceLineNo">2827</span>    is.next(res);<a name="line.2827"></a>
+<span class="sourceLineNo">2828</span>    for (int i = 0; i &lt; res.size(); i++) {<a name="line.2828"></a>
+<span class="sourceLineNo">2829</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected1.get(i), res.get(i)));<a name="line.2829"></a>
+<span class="sourceLineNo">2830</span>    }<a name="line.2830"></a>
+<span class="sourceLineNo">2831</span><a name="line.2831"></a>
+<span class="sourceLineNo">2832</span>    // Result 2<a name="line.2832"></a>
+<span class="sourceLineNo">2833</span>    List&lt;Cell&gt; expected2 = new ArrayList&lt;&gt;();<a name="line.2833"></a>
+<span class="sourceLineNo">2834</span>    expected2.add(new KeyValue(row2, fam2, null, ts, KeyValue.Type.Put, null));<a name="line.2834"></a>
+<span class="sourceLineNo">2835</span>    expected2.add(new KeyValue(row2, fam4, null, ts, KeyValue.Type.Put, null));<a name="line.2835"></a>
+<span class="sourceLineNo">2836</span><a name="line.2836"></a>
+<span class="sourceLineNo">2837</span>    res = new ArrayList&lt;&gt;();<a name="line.2837"></a>
+<span class="sourceLineNo">2838</span>    is.next(res);<a name="line.2838"></a>
+<span class="sourceLineNo">2839</span>    for (int i = 0; i &lt; res.size(); i++) {<a name="line.2839"></a>
+<span class="sourceLineNo">2840</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected2.get(i), res.get(i)));<a name="line.2840"></a>
+<span class="sourceLineNo">2841</span>    }<a name="line.2841"></a>
+<span class="sourceLineNo">2842</span>  }<a name="line.2842"></a>
+<span class="sourceLineNo">2843</span><a name="line.2843"></a>
+<span class="sourceLineNo">2844</span>  @Test<a name="line.2844"></a>
+<span class="sourceLineNo">2845</span>  public void testScanner_ExplicitColumns_FromMemStore_EnforceVersions() throws IOException {<a name="line.2845"></a>
+<span class="sourceLineNo">2846</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2846"></a>
+<span class="sourceLineNo">2847</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.2847"></a>
+<span class="sourceLineNo">2848</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.2848"></a>
+<span class="sourceLineNo">2849</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2849"></a>
+<span class="sourceLineNo">2850</span>    byte[][] families = { fam1 };<a name="line.2850"></a>
+<span class="sourceLineNo">2851</span><a name="line.2851"></a>
+<span class="sourceLineNo">2852</span>    long ts1 = System.currentTimeMillis();<a name="line.2852"></a>
+<span class="sourceLineNo">2853</span>    long ts2 = ts1 + 1;<a name="line.2853"></a>
+<span class="sourceLineNo">2854</span>    long ts3 = ts1 + 2;<a name="line.2854"></a>
+<span class="sourceLineNo">2855</span><a name="line.2855"></a>
+<span class="sourceLineNo">2856</span>    // Setting up region<a name="line.2856"></a>
+<span class="sourceLineNo">2857</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2857"></a>
+<span class="sourceLineNo">2858</span>    // Putting data in Region<a name="line.2858"></a>
+<span class="sourceLineNo">2859</span>    Put put = null;<a name="line.2859"></a>
+<span class="sourceLineNo">2860</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.2860"></a>
+<span class="sourceLineNo">2861</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.2861"></a>
+<span class="sourceLineNo">2862</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.2862"></a>
+<span class="sourceLineNo">2863</span><a name="line.2863"></a>
+<span class="sourceLineNo">2864</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.2864"></a>
+<span class="sourceLineNo">2865</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.2865"></a>
+<span class="sourceLineNo">2866</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.2866"></a>
+<span class="sourceLineNo">2867</span><a name="line.2867"></a>
+<span class="sourceLineNo">2868</span>    put = new Put(row1);<a name="line.2868"></a>
+<span class="sourceLineNo">2869</span>    put.add(kv13);<a name="line.2869"></a>
+<span class="sourceLineNo">2870</span>    put.add(kv12);<a name="line.2870"></a>
+<span class="sourceLineNo">2871</span>    put.add(kv11);<a name="line.2871"></a>
+<span class="sourceLineNo">2872</span>    put.add(kv23);<a name="line.2872"></a>
+<span class="sourceLineNo">2873</span>    put.add(kv22);<a name="line.2873"></a>
+<span class="sourceLineNo">2874</span>    put.add(kv21);<a name="line.2874"></a>
+<span class="sourceLineNo">2875</span>    region.put(put);<a name="line.2875"></a>
+<span class="sourceLineNo">2876</span><a name="line.2876"></a>
+<span class="sourceLineNo">2877</span>    // Expected<a name="line.2877"></a>
+<span class="sourceLineNo">2878</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.2878"></a>
+<span class="sourceLineNo">2879</span>    expected.add(kv13);<a name="line.2879"></a>
+<span class="sourceLineNo">2880</span>    expected.add(kv12);<a name="line.2880"></a>
+<span class="sourceLineNo">2881</span><a name="line.2881"></a>
+<span class="sourceLineNo">2882</span>    Scan scan = new Scan(row1);<a name="line.2882"></a>
+<span class="sourceLineNo">2883</span>    scan.addColumn(fam1, qf1);<a name="line.2883"></a>
+<span class="sourceLineNo">2884</span>    scan.setMaxVersions(MAX_VERSIONS);<a name="line.2884"></a>
+<span class="sourceLineNo">2885</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.2885"></a>
+<span class="sourceLineNo">2886</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.2886"></a>
+<span class="sourceLineNo">2887</span><a name="line.2887"></a>
+<span class="sourceLineNo">2888</span>    boolean hasNext = scanner.next(actual);<a name="line.2888"></a>
+<span class="sourceLineNo">2889</span>    assertEquals(false, hasNext);<a name="line.2889"></a>
+<span class="sourceLineNo">2890</span><a name="line.2890"></a>
+<span class="sourceLineNo">2891</span>    // Verify result<a name="line.2891"></a>
+<span class="sourceLineNo">2892</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.2892"></a>
+<span class="sourceLineNo">2893</span>      assertEquals(expected.get(i), actual.get(i));<a name="line.2893"></a>
+<span class="sourceLineNo">2894</span>    }<a name="line.2894"></a>
+<span class="sourceLineNo">2895</span>  }<a name="line.2895"></a>
+<span class="sourceLineNo">2896</span><a name="line.2896"></a>
+<span class="sourceLineNo">2897</span>  @Test<a name="line.2897"></a>
+<span class="sourceLineNo">2898</span>  public void testScanner_ExplicitColumns_FromFilesOnly_EnforceVersions() throws IOException {<a name="line.2898"></a>
+<span class="sourceLineNo">2899</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2899"></a>
+<span class="sourceLineNo">2900</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.2900"></a>
+<span class="sourceLineNo">2901</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.2901"></a>
+<span class="sourceLineNo">2902</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2902"></a>
+<span class="sourceLineNo">2903</span>    byte[][] families = { fam1 };<a name="line.2903"></a>
+<span class="sourceLineNo">2904</span><a name="line.2904"></a>
+<span class="sourceLineNo">2905</span>    long ts1 = 1; // System.currentTimeMillis();<a name="line.2905"></a>
+<span class="sourceLineNo">2906</span>    long ts2 = ts1 + 1;<a name="line.2906"></a>
+<span class="sourceLineNo">2907</span>    long ts3 = ts1 + 2;<a name="line.2907"></a>
+<span class="sourceLineNo">2908</span><a name="line.2908"></a>
+<span class="sourceLineNo">2909</span>    // Setting up region<a name="line.2909"></a>
+<span class="sourceLineNo">2910</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2910"></a>
+<span class="sourceLineNo">2911</span>    // Putting data in Region<a name="line.2911"></a>
+<span class="sourceLineNo">2912</span>    Put put = null;<a name="line.2912"></a>
+<span class="sourceLineNo">2913</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.2913"></a>
+<span class="sourceLineNo">2914</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.2914"></a>
+<span class="sourceLineNo">2915</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.2915"></a>
+<span class="sourceLineNo">2916</span><a name="line.2916"></a>
+<span class="sourceLineNo">2917</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.2917"></a>
+<span class="sourceLineNo">2918</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.2918"></a>
+<span class="sourceLineNo">2919</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.2919"></a>
 <span class="sourceLineNo">2920</span><a name="line.2920"></a>
-<span class="sourceLineNo">2921</span>    // Expected<a name="line.2921"></a>
-<span class="sourceLineNo">2922</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.2922"></a>
-<span class="sourceLineNo">2923</span>    expected.add(kv13);<a name="line.2923"></a>
-<span class="sourceLineNo">2924</span>    expected.add(kv12);<a name="line.2924"></a>
-<span class="sourceLineNo">2925</span>    expected.add(kv23);<a name="line.2925"></a>
-<span class="sourceLineNo">2926</span>    expected.add(kv22);<a name="line.2926"></a>
-<span class="sourceLineNo">2927</span><a name="line.2927"></a>
-<span class="sourceLineNo">2928</span>    Scan scan = new Scan(row1);<a name="line.2928"></a>
-<span class="sourceLineNo">2929</span>    scan.addColumn(fam1, qf1);<a name="line.2929"></a>
-<span class="sourceLineNo">2930</span>    scan.addColumn(fam1, qf2);<a name="line.2930"></a>
-<span class="sourceLineNo">2931</span>    scan.setMaxVersions(MAX_VERSIONS);<a name="line.2931"></a>
-<span class="sourceLineNo">2932</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.2932"></a>
-<span class="sourceLineNo">2933</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.2933"></a>
-<span class="sourceLineNo">2934</span><a name="line.2934"></a>
-<span class="sourceLineNo">2935</span>    boolean hasNext = scanner.next(actual);<a name="line.2935"></a>
-<span class="sourceLineNo">2936</span>    assertEquals(false, hasNext);<a name="line.2936"></a>
+<span class="sourceLineNo">2921</span>    put = new Put(row1);<a name="line.2921"></a>
+<span class="sourceLineNo">2922</span>    put.add(kv13);<a name="line.2922"></a>
+<span class="sourceLineNo">2923</span>    put.add(kv12);<a name="line.2923"></a>
+<span class="sourceLineNo">2924</span>    put.add(kv11);<a name="line.2924"></a>
+<span class="sourceLineNo">2925</span>    put.add(kv23);<a name="line.2925"></a>
+<span class="sourceLineNo">2926</span>    put.add(kv22);<a name="line.2926"></a>
+<span class="sourceLineNo">2927</span>    put.add(kv21);<a name="line.2927"></a>
+<span class="sourceLineNo">2928</span>    region.put(put);<a name="line.2928"></a>
+<span class="sourceLineNo">2929</span>    region.flush(true);<a name="line.2929"></a>
+<span class="sourceLineNo">2930</span><a name="line.2930"></a>
+<span class="sourceLineNo">2931</span>    // Expected<a name="line.2931"></a>
+<span class="sourceLineNo">2932</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.2932"></a>
+<span class="sourceLineNo">2933</span>    expected.add(kv13);<a name="line.2933"></a>
+<span class="sourceLineNo">2934</span>    expected.add(kv12);<a name="line.2934"></a>
+<span class="sourceLineNo">2935</span>    expected.add(kv23);<a name="line.2935"></a>
+<span class="sourceLineNo">2936</span>    expected.add(kv22);<a name="line.2936"></a>
 <span class="sourceLineNo">2937</span><a name="line.2937"></a>
-<span class="sourceLineNo">2938</span>    // Verify result<a name="line.2938"></a>
-<span class="sourceLineNo">2939</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.2939"></a>
-<span class="sourceLineNo">2940</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected.get(i), actual.get(i)));<a name="line.2940"></a>
-<span class="sourceLineNo">2941</span>    }<a name="line.2941"></a>
-<span class="sourceLineNo">2942</span>  }<a name="line.2942"></a>
-<span class="sourceLineNo">2943</span><a name="line.2943"></a>
-<span class="sourceLineNo">2944</span>  @Test<a name="line.2944"></a>
-<span class="sourceLineNo">2945</span>  public void testScanner_ExplicitColumns_FromMemStoreAndFiles_EnforceVersions() throws<a name="line.2945"></a>
-<span class="sourceLineNo">2946</span>      IOException {<a name="line.2946"></a>
-<span class="sourceLineNo">2947</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2947"></a>
-<span class="sourceLineNo">2948</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2948"></a>
-<span class="sourceLineNo">2949</span>    byte[][] families = { fam1 };<a name="line.2949"></a>
-<span class="sourceLineNo">2950</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.2950"></a>
-<span class="sourceLineNo">2951</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.2951"></a>
-<span class="sourceLineNo">2952</span><a name="line.2952"></a>
-<span class="sourceLineNo">2953</span>    long ts1 = 1;<a name="line.2953"></a>
-<span class="sourceLineNo">2954</span>    long ts2 = ts1 + 1;<a name="line.2954"></a>
-<span class="sourceLineNo">2955</span>    long ts3 = ts1 + 2;<a name="line.2955"></a>
-<span class="sourceLineNo">2956</span>    long ts4 = ts1 + 3;<a name="line.2956"></a>
-<span class="sourceLineNo">2957</span><a name="line.2957"></a>
-<span class="sourceLineNo">2958</span>    // Setting up region<a name="line.2958"></a>
-<span class="sourceLineNo">2959</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2959"></a>
-<span class="sourceLineNo">2960</span>    // Putting data in Region<a name="line.2960"></a>
-<span class="sourceLineNo">2961</span>    KeyValue kv14 = new KeyValue(row1, fam1, qf1, ts4, KeyValue.Type.Put, null);<a name="line.2961"></a>
-<span class="sourceLineNo">2962</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.2962"></a>
-<span class="sourceLineNo">2963</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.2963"></a>
-<span class="sourceLineNo">2964</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.2964"></a>
-<span class="sourceLineNo">2965</span><a name="line.2965"></a>
-<span class="sourceLineNo">2966</span>    KeyValue kv24 = new KeyValue(row1, fam1, qf2, ts4, KeyValue.Type.Put, null);<a name="line.2966"></a>
-<span class="sourceLineNo">2967</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.2967"></a>
-<span class="sourceLineNo">2968</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.2968"></a>
-<span class="sourceLineNo">2969</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.2969"></a>
-<span class="sourceLineNo">2970</span><a name="line.2970"></a>
-<span class="sourceLineNo">2971</span>    Put put = null;<a name="line.2971"></a>
-<span class="sourceLineNo">2972</span>    put = new Put(row1);<a name="line.2972"></a>
-<span class="sourceLineNo">2973</span>    put.add(kv14);<a name="line.2973"></a>
-<span class="sourceLineNo">2974</span>    put.add(kv24);<a name="line.2974"></a>
-<span class="sourceLineNo">2975</span>    region.put(put);<a name="line.2975"></a>
-<span class="sourceLineNo">2976</span>    region.flush(true);<a name="line.2976"></a>
-<span class="sourceLineNo">2977</span><a name="line.2977"></a>
-<span class="sourceLineNo">2978</span>    put = new Put(row1);<a name="line.2978"></a>
-<span class="sourceLineNo">2979</span>    put.add(kv23);<a name="line.2979"></a>
-<span class="sourceLineNo">2980</span>    put.add(kv13);<a name="line.2980"></a>
-<span class="sourceLineNo">2981</span>    region.put(put);<a name="line.2981"></a>
-<span class="sourceLineNo">2982</span>    region.flush(true);<a name="line.2982"></a>
-<span class="sourceLineNo">2983</span><a name="line.2983"></a>
-<span class="sourceLineNo">2984</span>    put = new Put(row1);<a name="line.2984"></a>
-<span class="sourceLineNo">2985</span>    put.add(kv22);<a name="line.2985"></a>
-<span class="sourceLineNo">2986</span>    put.add(kv12);<a name="line.2986"></a>
-<span class="sourceLineNo">2987</span>    region.put(put);<a name="line.2987"></a>
-<span class="sourceLineNo">2988</span>    region.flush(true);<a name="line.2988"></a>
-<span class="sourceLineNo">2989</span><a name="line.2989"></a>
-<span class="sourceLineNo">2990</span>    put = new Put(row1);<a name="line.2990"></a>
-<span class="sourceLineNo">2991</span>    put.add(kv21);<a name="line.2991"></a>
-<span class="sourceLineNo">2992</span>    put.add(kv11);<a name="line.2992"></a>
-<span class="sourceLineNo">2993</span>    region.put(put);<a name="line.2993"></a>
-<span class="sourceLineNo">2994</span><a name="line.2994"></a>
-<span class="sourceLineNo">2995</span>    // Expected<a name="line.2995"></a>
-<span class="sourceLineNo">2996</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.2996"></a>
-<span class="sourceLineNo">2997</span>    expected.add(kv14);<a name="line.2997"></a>
-<span class="sourceLineNo">2998</span>    expected.add(kv13);<a name="line.2998"></a>
-<span class="sourceLineNo">2999</span>    expected.add(kv12);<a name="line.2999"></a>
-<span class="sourceLineNo">3000</span>    expected.add(kv24);<a name="line.3000"></a>
-<span class="sourceLineNo">3001</span>    expected.add(kv23);<a name="line.3001"></a>
-<span class="sourceLineNo">3002</span>    expected.add(kv22);<a name="line.3002"></a>
-<span class="sourceLineNo">3003</span><a name="line.3003"></a>
-<span class="sourceLineNo">3004</span>    Scan scan = new Scan(row1);<a name="line.3004"></a>
-<span class="sourceLineNo">3005</span>    scan.addColumn(fam1, qf1);<a name="line.3005"></a>
-<span class="sourceLineNo">3006</span>    scan.addColumn(fam1, qf2);<a name="line.3006"></a>
-<span class="sourceLineNo">3007</span>    int versions = 3;<a name="line.3007"></a>
-<span class="sourceLineNo">3008</span>    scan.setMaxVersions(versions);<a name="line.3008"></a>
-<span class="sourceLineNo">3009</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.3009"></a>
-<span class="sourceLineNo">3010</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.3010"></a>
-<span class="sourceLineNo">3011</span><a name="line.3011"></a>
-<span class="sourceLineNo">3012</span>    boolean hasNext = scanner.next(actual);<a name="line.3012"></a>
-<span class="sourceLineNo">3013</span>    assertEquals(false, hasNext);<a name="line.3013"></a>
-<span class="sourceLineNo">3014</span><a name="line.3014"></a>
-<span class="sourceLineNo">3015</span>    // Verify result<a name="line.3015"></a>
-<span class="sourceLineNo">3016</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.3016"></a>
-<span class="sourceLineNo">3017</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected.get(i), actual.get(i)));<a name="line.3017"></a>
-<span class="sourceLineNo">3018</span>    }<a name="line.3018"></a>
-<span class="sourceLineNo">3019</span>  }<a name="line.3019"></a>
-<span class="sourceLineNo">3020</span><a name="line.3020"></a>
-<span class="sourceLineNo">3021</span>  @Test<a name="line.3021"></a>
-<span class="sourceLineNo">3022</span>  public void testScanner_Wildcard_FromMemStore_EnforceVersions() throws IOException {<a name="line.3022"></a>
-<span class="sourceLineNo">3023</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.3023"></a>
-<span class="sourceLineNo">3024</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.3024"></a>
-<span class="sourceLineNo">3025</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.3025"></a>
-<span class="sourceLineNo">3026</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.3026"></a>
-<span class="sourceLineNo">3027</span>    byte[][] families = { fam1 };<a name="line.3027"></a>
-<span class="sourceLineNo">3028</span><a name="line.3028"></a>
-<span class="sourceLineNo">3029</span>    long ts1 = System.currentTimeMillis();<a name="line.3029"></a>
-<span class="sourceLineNo">3030</span>    long ts2 = ts1 + 1;<a name="line.3030"></a>
-<span class="sourceLineNo">3031</span>    long ts3 = ts1 + 2;<a name="line.3031"></a>
-<span class="sourceLineNo">3032</span><a name="line.3032"></a>
-<span class="sourceLineNo">3033</span>    // Setting up region<a name="line.3033"></a>
-<span class="sourceLineNo">3034</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.3034"></a>
-<span class="sourceLineNo">3035</span>    // Putting data in Region<a name="line.3035"></a>
-<span class="sourceLineNo">3036</span>    Put put = null;<a name="line.3036"></a>
-<span class="sourceLineNo">3037</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.3037"></a>
-<span class="sourceLineNo">3038</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.3038"></a>
-<span class="sourceLineNo">3039</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.3039"></a>
-<span class="sourceLineNo">3040</span><a name="line.3040"></a>
-<span class="sourceLineNo">3041</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.3041"></a>
-<span class="sourceLineNo">3042</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.3042"></a>
-<span class="sourceLineNo">3043</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.3043"></a>
-<span class="sourceLineNo">3044</span><a name="line.3044"></a>
-<span class="sourceLineNo">3045</span>    put = new Put(row1);<a name="line.3045"></a>
-<span class="sourceLineNo">3046</span>    put.add(kv13);<a name="line.3046"></a>
-<span class="sourceLineNo">3047</span>    put.add(kv12);<a name="line.3047"></a>
-<span class="sourceLineNo">3048</span>    put.add(kv11);<a name="line.3048"></a>
-<span class="sourceLineNo">3049</span>    put.add(kv23);<a name="line.3049"></a>
-<span class="sourceLineNo">3050</span>    put.add(kv22);<a name="line.3050"></a>
-<span class="sourceLineNo">3051</span>    put.add(kv21);<a name="line.3051"></a>
-<span class="sourceLineNo">3052</span>    region.put(put);<a name="line.3052"></a>
-<span class="sourceLineNo">3053</span><a name="line.3053"></a>
-<span class="sourceLineNo">3054</span>    // Expected<a name="line.3054"></a>
-<span class="sourceLineNo">3055</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.3055"></a>
-<span class="sourceLineNo">3056</span>    expected.add(kv13);<a name="line.3056"></a>
-<span class="sourceLineNo">3057</span>    expected.add(kv12);<a name="line.3057"></a>
-<span class="sourceLineNo">3058</span>    expected.add(kv23);<a name="line.3058"></a>
-<span class="sourceLineNo">3059</span>    expected.add(kv22);<a name="line.3059"></a>
-<span class="sourceLineNo">3060</span><a name="line.3060"></a>
-<span class="sourceLineNo">3061</span>    Scan scan = new Scan(row1);<a name="line.3061"></a>
-<span class="sourceLineNo">3062</span>    scan.addFamily(fam1);<a name="line.3062"></a>
-<span class="sourceLineNo">3063</span>    scan.setMaxVersions(MAX_VERSIONS);<a name="line.3063"></a>
-<span class="sourceLineNo">3064</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.3064"></a>
-<span class="sourceLineNo">3065</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.3065"></a>
-<span class="sourceLineNo">3066</span><a name="line.3066"></a>
-<span class="sourceLineNo">3067</span>    boolean hasNext = scanner.next(actual);<a name="line.3067"></a>
-<span class="sourceLineNo">3068</span>    assertEquals(false, hasNext);<a name="line.3068"></a>
-<span class="sourceLineNo">3069</span><a name="line.3069"></a>
-<span class="sourceLineNo">3070</span>    // Verify result<a name="line.3070"></a>
-<span class="sourceLineNo">3071</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.3071"></a>
-<span class="sourceLineNo">3072</span>      assertEquals(expected.get(i), actual.get(i));<a name="line.3072"></a>
-<span class="sourceLineNo">3073</span>    }<a name="line.3073"></a>
-<span class="sourceLineNo">3074</span>  }<a name="line.3074"></a>
-<span class="sourceLineNo">3075</span><a name="line.3075"></a>
-<span class="sourceLineNo">3076</span>  @Test<a name="line.3076"></a>
-<span class="sourceLineNo">3077</span>  public void testScanner_Wildcard_FromFilesOnly_EnforceVersions() throws IOException {<a name="line.3077"></a>
-<span class="sourceLineNo">3078</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.3078"></a>
-<span class="sourceLineNo">3079</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.3079"></a>
-<span class="sourceLineNo">3080</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.3080"></a>
-<span class="sourceLineNo">3081</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.3081"></a>
-<span class="sourceLineNo">3082</span><a name="line.3082"></a>
-<span class="sourceLineNo">3083</span>    long ts1 = 1; // System.currentTimeMillis();<a name="line.3083"></a>
-<span class="sourceLineNo">3084</span>    long ts2 = ts1 + 1;<a name="line.3084"></a>
-<span class="sourceLineNo">3085</span>    long ts3 = ts1 + 2;<a name="line.3085"></a>
-<span class="sourceLineNo">3086</span><a name="line.3086"></a>
-<span class="sourceLineNo">3087</span>    // Setting up region<a name="line.3087"></a>
-<span class="sourceLineNo">3088</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.3088"></a>
-<span class="sourceLineNo">3089</span>    // Putting data in Region<a name="line.3089"></a>
-<span class="sourceLineNo">3090</span>    Put put = null;<a name="line.3090"></a>
-<span class="sourceLineNo">3091</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.3091"></a>
-<span class="sourceLineNo">3092</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.3092"></a>
-<span class="sourceLineNo">3093</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.3093"></a>
-<span class="sourceLineNo">3094</span><a name="line.3094"></a>
-<span class="sourceLineNo">3095</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.3095"></a>
-<span class="sourceLineNo">3096</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.3096"></a>
-<span class="sourceLineNo">3097</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.3097"></a>
-<span class="sourceLineNo">3098</span><a name="line.3098"></a>
-<span class="sourceLineNo">3099</span>    put = new Put(row1);<a name="line.3099"></a>
-<span class="sourceLineNo">3100</span>    put.add(kv13);<a name="line.3100"></a>
-<span class="sourceLineNo">3101</span>    put.add(kv12);<a name="line.3101"></a>
-<span class="sourceLineNo">3102</span>    put.add(kv11);<a name="line.3102"></a>
-<span class="sourceLineNo">3103</span>    put.add(kv23);<a name="line.3103"></a>
-<span class="sourceLineNo">3104</span>    put.add(kv22);<a name="line.3104"></a>
-<span class="sourceLineNo">3105</span>    put.add(kv21);<a name="line.3105"></a>
-<span class="sourceLineNo">3106</span>    region.put(put);<a name="line.3106"></a>
-<span class="sourceLineNo">3107</span>    region.flush(true);<a name="line.3107"></a>
+<span class="sourceLineNo">2938</span>    Scan scan = new Scan(row1);<a name="line.2938"></a>
+<span class="sourceLineNo">2939</span>    scan.addColumn(fam1, qf1);<a name="line.2939"></a>
+<span class="sourceLineNo">2940</span>    scan.addColumn(fam1, qf2);<a name="line.2940"></a>
+<span class="sourceLineNo">2941</span>    scan.setMaxVersions(MAX_VERSIONS);<a name="line.2941"></a>
+<span class="sourceLineNo">2942</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.2942"></a>
+<span class="sourceLineNo">2943</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.2943"></a>
+<span class="sourceLineNo">2944</span><a name="line.2944"></a>
+<span class="sourceLineNo">2945</span>    boolean hasNext = scanner.next(actual);<a name="line.2945"></a>
+<span class="sourceLineNo">2946</span>    assertEquals(false, hasNext);<a name="line.2946"></a>
+<span class="sourceLineNo">2947</span><a name="line.2947"></a>
+<span class="sourceLineNo">2948</span>    // Verify result<a name="line.2948"></a>
+<span class="sourceLineNo">2949</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.2949"></a>
+<span class="sourceLineNo">2950</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected.get(i), actual.get(i)));<a name="line.2950"></a>
+<span class="sourceLineNo">2951</span>    }<a name="line.2951"></a>
+<span class="sourceLineNo">2952</span>  }<a name="line.2952"></a>
+<span class="sourceLineNo">2953</span><a name="line.2953"></a>
+<span class="sourceLineNo">2954</span>  @Test<a name="line.2954"></a>
+<span class="sourceLineNo">2955</span>  public void testScanner_ExplicitColumns_FromMemStoreAndFiles_EnforceVersions() throws<a name="line.2955"></a>
+<span class="sourceLineNo">2956</span>      IOException {<a name="line.2956"></a>
+<span class="sourceLineNo">2957</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2957"></a>
+<span class="sourceLineNo">2958</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2958"></a>
+<span class="sourceLineNo">2959</span>    byte[][] families = { fam1 };<a name="line.2959"></a>
+<span class="sourceLineNo">2960</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.2960"></a>
+<span class="sourceLineNo">2961</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.2961"></a>
+<span class="sourceLineNo">2962</span><a name="line.2962"></a>
+<span class="sourceLineNo">2963</span>    long ts1 = 1;<a name="line.2963"></a>
+<span class="sourceLineNo">2964</span>    long ts2 = ts1 + 1;<a name="line.2964"></a>
+<span class="sourceLineNo">2965</span>    long ts3 = ts1 + 2;<a name="line.2965"></a>
+<span class="sourceLineNo">2966</span>    long ts4 = ts1 + 3;<a name="line.2966"></a>
+<span class="sourceLineNo">2967</span><a name="line.2967"></a>
+<span class="sourceLineNo">2968</span>    // Setting up region<a name="line.2968"></a>
+<span class="sourceLineNo">2969</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2969"></a>
+<span class="sourceLineNo">2970</span>    // Putting data in Region<a name="line.2970"></a>
+<span class="sourceLineNo">2971</span>    KeyValue kv14 = new KeyValue(row1, fam1, qf1, ts4, KeyValue.Type.Put, null);<a name="line.2971"></a>
+<span class="sourceLineNo">2972</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.2972"></a>
+<span class="sourceLineNo">2973</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.2973"></a>
+<span class="sourceLineNo">2974</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.2974"></a>
+<span class="sourceLineNo">2975</span><a name="line.2975"></a>
+<span class="sourceLineNo">2976</span>    KeyValue kv24 = new KeyValue(row1, fam1, qf2, ts4, KeyValue.Type.Put, null);<a name="line.2976"></a>
+<span class="sourceLineNo">2977</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.2977"></a>
+<span class="sourceLineNo">2978</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.2978"></a>
+<span class="sourceLineNo">2979</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.2979"></a>
+<span class="sourceLineNo">2980</span><a name="line.2980"></a>
+<span class="sourceLineNo">2981</span>    Put put = null;<a name="line.2981"></a>
+<span class="sourceLineNo">2982</span>    put = new Put(row1);<a name="line.2982"></a>
+<span class="sourceLineNo">2983</span>    put.add(kv14);<a name="line.2983"></a>
+<span class="sourceLineNo">2984</span>    put.add(kv24);<a name="line.2984"></a>
+<span class="sourceLineNo">2985</span>    region.put(put);<a name="line.2985"></a>
+<span class="sourceLineNo">2986</span>    region.flush(true);<a name="line.2986"></a>
+<span class="sourceLineNo">2987</span><a name="line.2987"></a>
+<span class="sourceLineNo">2988</span>    put = new Put(row1);<a name="line.2988"></a>
+<span class="sourceLineNo">2989</span>    put.add(kv23);<a name="line.2989"></a>
+<span class="sourceLineNo">2990</span>    put.add(kv13);<a name="line.2990"></a>
+<span class="sourceLineNo">2991</span>    region.put(put);<a name="line.2991"></a>
+<span class="sourceLineNo">2992</span>    region.flush(true);<a name="line.2992"></a>
+<span class="sourceLineNo">2993</span><a name="line.2993"></a>
+<span class="sourceLineNo">2994</span>    put = new Put(row1);<a name="line.2994"></a>
+<span class="sourceLineNo">2995</span>    put.add(kv22);<a name="line.2995"></a>
+<span class="sourceLineNo">2996</span>    put.add(kv12);<a name="line.2996"></a>
+<span class="sourceLineNo">2997</span>    region.put(put);<a name="line.2997"></a>
+<span class="sourceLineNo">2998</span>    region.flush(true);<a name="line.2998"></a>
+<span class="sourceLineNo">2999</span><a name="line.2999"></a>
+<span class="sourceLineNo">3000</span>    put = new Put(row1);<a name="line.3000"></a>
+<span class="sourceLineNo">3001</span>    put.add(kv21);<a name="line.3001"></a>
+<span class="sourceLineNo">3002</span>    put.add(kv11);<a name="line.3002"></a>
+<span class="sourceLineNo">3003</span>    region.put(put);<a name="line.3003"></a>
+<span class="sourceLineNo">3004</span><a name="line.3004"></a>
+<span class="sourceLineNo">3005</span>    // Expected<a name="line.3005"></a>
+<span class="sourceLineNo">3006</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.3006"></a>
+<span class="sourceLineNo">3007</span>    expected.add(kv14);<a name="line.3007"></a>
+<span class="sourceLineNo">3008</span>    expected.add(kv13);<a name="line.3008"></a>
+<span class="sourceLineNo">3009</span>    expected.add(kv12);<a name="line.3009"></a>
+<span class="sourceLineNo">3010</span>    expected.add(kv24);<a name="line.3010"></a>
+<span class="sourceLineNo">3011</span>    expected.add(kv23);<a name="line.3011"></a>
+<span class="sourceLineNo">3012</span>    expected.add(kv22);<a name="line.3012"></a>
+<span class="sourceLineNo">3013</span><a name="line.3013"></a>
+<span class="sourceLineNo">3014</span>    Scan scan = new Scan(row1);<a name="line.3014"></a>
+<span class="sourceLineNo">3015</span>    scan.addColumn(fam1, qf1);<a name="line.3015"></a>
+<span class="sourceLineNo">3016</span>    scan.addColumn(fam1, qf2);<a name="line.3016"></a>
+<span class="sourceLineNo">3017</span>    int versions = 3;<a name="line.3017"></a>
+<span class="sourceLineNo">3018</span>    scan.setMaxVersions(versions);<a name="line.3018"></a>
+<span class="sourceLineNo">3019</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.3019"></a>
+<span class="sourceLineNo">3020</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.3020"></a>
+<span class="sourceLineNo">3021</span><a name="line.3021"></a>
+<span class="sourceLineNo">3022</span>    boolean hasNext = scanner.next(actual);<a name="line.3022"></a>
+<span class="sourceLineNo">3023</span>    assertEquals(false, hasNext);<a name="line.3023"></a>
+<span class="sourceLineNo">3024</span><a name="line.3024"></a>
+<span class="sourceLineNo">3025</span>    // Verify result<a name="line.3025"></a>
+<span class="sourceLineNo">3026</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.3026"></a>
+<span class="sourceLineNo">3027</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected.get(i), actual.get(i)));<a name="line.3027"></a>
+<span class="sourceLineNo">3028</span>    }<a name="line.3028"></a>
+<span class="sourceLineNo">3029</span>  }<a name="line.3029"></a>
+<span class="sourceLineNo">3030</span><a name="line.3030"></a>
+<span class="sourceLineNo">3031</span>  @Test<a name="line.3031"></a>
+<span class="sourceLineNo">3032</span>  public void testScanner_Wildcard_FromMemStore_EnforceVersions() throws IOException {<a name="line.3032"></a>
+<span class="sourceLineNo">3033</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.3033"></a>
+<span class="sourceLineNo">3034</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.3034"></a>
+<span class="sourceLineNo">3035</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.3035"></a>
+<span class="sourceLineNo">3036</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.3036"></a>
+<span class="sourceLineNo">3037</span>    byte[][] families = { fam1 };<a name="line.3037"></a>
+<span class="sourceLineNo">3038</span><a name="line.3038"></a>
+<span class="sourceLineNo">3039</span>    long ts1 = System.currentTimeMillis();<a name="line.3039"></a>
+<span class="sourceLineNo">3040</span>    long ts2 = ts1 + 1;<a name="line.3040"></a>
+<span class="sourceLineNo">3041</span>    long ts3 = ts1 + 2;<a name="line.3041"></a>
+<span class="sourceLineNo">3042</span><a name="line.3042"></a>
+<span class="sourceLineNo">3043</span>    // Setting up region<a name="line.3043"></a>
+<span class="sourceLineNo">3044</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.3044"></a>
+<span class="sourceLineNo">3045</span>    // Putting data in Region<a name="line.3045"></a>
+<span class="sourceLineNo">3046</span>    Put put = null;<a name="line.3046"></a>
+<span class="sourceLineNo">3047</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.3047"></a>
+<span class="sourceLineNo">3048</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.3048"></a>
+<span class="sourceLineNo">3049</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.3049"></a>
+<span class="sourceLineNo">3050</span><a name="line.3050"></a>
+<span class="sourceLineNo">3051</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.3051"></a>
+<span class="sourceLineNo">3052</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.3052"></a>
+<span class="sourceLineNo">3053</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.3053"></a>
+<span class="sourceLineNo">3054</span><a name="line.3054"></a>
+<span class="sourceLineNo">3055</span>    put = new Put(row1);<a name="line.3055"></a>
+<span class="sourceLineNo">3056</span>    put.add(kv13);<a name="line.3056"></a>
+<span class="sourceLineNo">3057</span>    put.add(kv12);<a name="line.3057"></a>
+<span class="sourceLineNo">3058</span>    put.add(kv11);<a name="line.3058"></a>
+<span class="sourceLineNo">3059</span>    put.add(kv23);<a name="line.3059"></a>
+<span class="sourceLineNo">3060</span>    put.add(kv22);<a name="line.3060"></a>
+<span class="sourceLineNo">3061</span>    put.add(kv21);<a name="line.3061"></a>
+<span class="sourceLineNo">3062</span>    region.put(put);<a name="line.3062"></a>
+<span class="sourceLineNo">3063</span><a name="line.3063"></a>
+<span class="sourceLineNo">3064</span>    // Expected<a name="line.3064"></a>
+<span class="sourceLineNo">3065</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.3065"></a>
+<span class="sourceLineNo">3066</span>    expected.add(kv13);<a name="line.3066"></a>
+<span class="sourceLineNo">3067</span>    expected.add(kv12);<a name="line.3067"></a>
+<span class="sourceLineNo">3068</span>    expected.add(kv23);<a name="line.3068"></a>
+<span class="sourceLineNo">3069</span>    expected.add(kv22);<a name="line.3069"></a>
+<span class="sourceLineNo">3070</span><a name="line.3070"></a>
+<span class="sourceLineNo">3071</span>    Scan scan = new Scan(row1);<a name="line.3071"></a>
+<span class="sourceLineNo">3072</span>    scan.addFamily(fam1);<a name="line.3072"></a>
+<span class="sourceLineNo">3073</span>    scan.setMaxVersions(MAX_VERSIONS);<a name="line.3073"></a>
+<span class="sourceLineNo">3074</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.3074"></a>
+<span class="sourceLineNo">3075</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.3075"></a>
+<span class="sourceLineNo">3076</span><a name="line.3076"></a>
+<span class="sourceLineNo">3077</span>    boolean hasNext = scanner.next(actual);<a name="line.3077"></a>
+<span class="sourceLineNo">3078</span>    assertEquals(false, hasNext);<a name="line.3078"></a>
+<span class="sourceLineNo">3079</span><a name="line.3079"></a>
+<span class="sourceLineNo">3080</span>    // Verify result<a name="line.3080"></a>
+<span class="sourceLineNo">3081</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.3081"></a>
+<span class="sourceLineNo">3082</span>      assertEquals(expected.get(i), actual.get(i));<a name="line.3082"></a>
+<span class="sourceLineNo">3083</span>    }<a name="line.3083"></a>
+<span class="sourceLineNo">3084</span>  }<a name="line.3084"></a>
+<span class="sourceLineNo">3085</span><a name="line.3085"></a>
+<span class="sourceLineNo">3086</span>  @Test<a name="line.3086"></a>
+<span class="sourceLineNo">3087</span>  public void testScanner_Wildcard_FromFilesOnly_EnforceVersions() throws IOException {<a name="line.3087"></a>
+<span class="sourceLineNo">3088</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.3088"></a>
+<span class="sourceLineNo">3089</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.3089"></a>
+<span class="sourceLineNo">3090</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.3090"></a>
+<span class="sourceLineNo">3091</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.3091"></a>
+<span class="sourceLineNo">3092</span><a name="line.3092"></a>
+<span class="sourceLineNo">3093</span>    long ts1 = 1; // System.currentTimeMillis();<a name="line.3093"></a>
+<span class="sourceLineNo">3094</span>    long ts2 = ts1 + 1;<a name="line.3094"></a>
+<span class="sourceLineNo">3095</span>    long ts3 = ts1 + 2;<a name="line.3095"></a>
+<span class="sourceLineNo">3096</span><a name="line.3096"></a>
+<span class="sourceLineNo">3097</span>    // Setting up region<a name="line.3097"></a>
+<span class="sourceLineNo">3098</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.3098"></a>
+<span class="sourceLineNo">3099</span>    // Putting data in Region<a name="line.3099"></a>
+<span class="sourceLineNo">3100</span>    Put put = null;<a name="line.3100"></a>
+<span class="sourceLineNo">3101</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.3101"></a>
+<span class="sourceLineNo">3102</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.3102"></a>
+<span class="sourceLineNo">3103</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.3103"></a>
+<span class="sourceLineNo">3104</span><a name="line.3104"></a>
+<span class="sourceLineNo">3105</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.3105"></a>
+<span class="sourceLineNo">3106</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.3106"></a>
+<span class="sourceLineNo">3107</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.3107"></a>
 <span class="sourceLineNo">3108</span><a name="line.3108"></a>
-<span class="sourceLineNo">3109</span>    // Expected<a name="line.3109"></a>
-<span class="sourceLineNo">3110</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.3110"></a>
-<span class="sourceLineNo">3111</span>    expected.add(kv13);<a name="line.3111"></a>
-<span class="sourceLineNo">3112</span>    expected.add(kv12);<a name="line.3112"></a>
-<span class="sourceLineNo">3113</span>    expected.add(kv23);<a name="line.3113"></a>
-<span class="sourceLineNo">3114</span>    expected.add(kv22);<a name="line.3114"></a>
-<span class="sourceLineNo">3115</span><a name="line.3115"></a>
-<span class="sourceLineNo">3116</span>    Scan scan = new Scan(row1);<a name="line.3116"></a>
-<span class="sourceLineNo">3117</span>    scan.addFamily(fam1);<a name="line.3117"></a>
-<span class="sourceLineNo">3118</span>    scan.setMaxVersions(MAX_VERSIONS);<a name="line.3118"></a>
-<span class="sourceLineNo">3119</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.3119"></a>
-<span class="sourceLineNo">3120</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.3120"></a>
-<span class="sourceLineNo">3121</span><a name="line.3121"></a>
-<span class="sourceLineNo">3122</span>    boolean hasNext = scanner.next(actual);<a name="line.3122"></a>
-<span class="sourceLineNo">3123</span>    assertEquals(false, hasNext);<a name="line.3123"></a>
-<span class="sourceLineNo">3124</span><a name="line.3124"></a>
-<span class="sourceLineNo">3125</span>    // Verify result<a name="line.3125"></a>
-<span class="sourceLineNo">3126</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.3126"></a>
-<span class="sourceLineNo">3127</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected.get(i), actual.get(i)));<a name="line.3127"></a>
-<span class="sourceLineNo">3128</span>    }<a name="line.3128"></a>
-<span class="sourceLineNo">3129</span>  }<a name="line.3129"></a>
-<span class="sourceLineNo">3130</span><a name="line.3130"></a>
-<span class="sourceLineNo">3131</span>  @Test<a name="line.3131"></a>
-<span class="sourceLineNo">3132</span>  public void testScanner_StopRow1542() throws IOException {<a name="line.3132"></a>
-<span class="sourceLineNo">3133</span>    byte[] family = Bytes.toBytes("testFamily");<a name="line.3133"></a>
-<span class="sourceLineNo">3134</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.3134"></a>
-<span class="sourceLineNo">3135</span>    byte[] row1 = Bytes.toBytes("row111");<a name="line.3135"></a>
-<span class="sourceLineNo">3136</span>    byte[] row2 = Bytes.toBytes("row222");<a name="line.3136"></a>
-<span class="sourceLineNo">3137</span>    byte[] row3 = Bytes.toBytes("row333");<a name="line.3137"></a>
-<span class="sourceLineNo">3138</span>    byte[] row4 = Bytes.toBytes("row444");<a name="line.3138"></a>
-<span class="sourceLineNo">3139</span>    byte[] row5 = Bytes.toBytes("row555");<a name="line.3139"></a>
+<span class="sourceLineNo">3109</span>    put = new Put(row1);<a name="line.3109"></a>
+<span class="sourceLineNo">3110</span>    put.add(kv13);<a name="line.3110"></a>
+<span class="sourceLineNo">3111</span>    put.add(kv12);<a name="line.3111"></a>
+<span class="sourceLineNo">3112</span>    put.add(kv11);<a name="line.3112"></a>
+<span class="sourceLineNo">3113</span>    put.add(kv23);<a name="line.3113"></a>
+<span class="sourceLineNo">3114</span>    put.add(kv22);<a name="line.3114"></a>
+<span class="sourceLineNo">3115</span>    put.add(kv21);<a name="line.3115"></a>
+<span class="sourceLineNo">3116</span>    region.put(put);<a name="line.3116"></a>
+<span class="sourceLineNo">3117</span>    region.flush(true);<a name="line.3117"></a>
+<span class="sourceLineNo">3118</span><a name="line.3118"></a>
+<span class="sourceLineNo">3119</span>    // Expected<a name="line.3119"></a>
+<span class="sourceLineNo">3120</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.3120"></a>
+<span class="sourceLineNo">3121</span>    expected.add(kv13);<a name="line.3121"></a>
+<span class="sourceLineNo">3122</span>    expected.add(kv12);<a name="line.3122"></a>
+<span class="sourceLineNo">3123</span>    expected.add(kv23);<a name="line.3123"></a>
+<span class="sourceLineNo">3124</span>    expected.add(kv22);<a name="line.3124"></a>
+<span class="sourceLineNo">3125</span><a name="line.3125"></a>
+<span class="sourceLineNo">3126</span>    Scan scan = new Scan(row1);<a name="line.3126"></a>
+<span class="sourceLineNo">3127</span>    scan.addFamily(fam1);<a name="line.3127"></a>
+<span class="sourceLineNo">3128</span>    scan.setMaxVersions(MAX_VERSIONS);<a name="line.3128"></a>
+<span class="sourceLineNo">3129</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.3129"></a>
+<span class="sourceLineNo">3130</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.3130"></a>
+<span class="sourceLineNo">3131</span><a name="line.3131"></a>
+<span class="sourceLineNo">3132</span>    boolean hasNext = scanner.next(actual);<a name="line.3132"></a>
+<span class="sourceLineNo">3133</span>    assertEquals(false, hasNext);<a name="line.3133"></a>
+<span class="sourceLineNo">3134</span><a name="line.3134"></a>
+<span class="sourceLineNo">3135</span>    // Verify result<a name="line.3135"></a>
+<span class="sourceLineNo">3136</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.3136"></a>
+<span class="sourceLineNo">3137</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected.get(i), actual.get(i)));<a name="line.3137"></a>
+<span class="sourceLineNo">3138</span>    }<a name="line.3138"></a>
+<span class="sourceLineNo">3139</span>  }<a name="line.3139"></a>
 <span class="sourceLineNo">3140</span><a name="line.3140"></a>
-<span class="sourceLineNo">3141</span>    byte[] col1 = Bytes.toBytes("Pub111");<a name="line.3141"></a>
-<span class="sourceLineNo">3142</span>    byte[] col2 = Bytes.toBytes("Pub222");<a name="line.3142"></a>
-<span class="sourceLineNo">3143</span><a name="line.3143"></a>
-<span class="sourceLineNo">3144</span>    Put put = new Put(row1);<a name="line.3144"></a>
-<span class="sourceLineNo">3145</span>    put.addColumn(family, col1, Bytes.toBytes(10L));<a name="line.3145"></a>
-<span class="sourceLineNo">3146</span>    region.put(put);<a name="line.3146"></a>
-<span class="sourceLineNo">3147</span><a name="line.3147"></a>
-<span class="sourceLineNo">3148</span>    put = new Put(row2);<a name="line.3148"></a>
-<span class="sourceLineNo">3149</span>    put.addColumn(family, col1, Bytes.toBytes(15L));<a name="line.3149"></a>
-<span class="sourceLineNo">3150</span>    region.put(put);<a name="line.3150"></a>
-<span class="sourceLineNo">3151</span><a name="line.3151"></a>
-<span class="sourceLineNo">3152</span>    put = new Put(row3);<a name="line.3152"></a>
-<span class="sourceLineNo">3153</span>    put.addColumn(family, col2, Bytes.toBytes(20L));<a name="line.3153"></a>
-<span class="sourceLineNo">3154</span>    region.put(put);<a name="line.3154"></a>
-<span class="sourceLineNo">3155</span><a name="line.3155"></a>
-<span class="sourceLineNo">3156</span>    put = new Put(row4);<a name="line.3156"></a>
-<span class="sourceLineNo">3157</span>    put.addColumn(family, col2, Bytes.toBytes(30L));<a name="line.3157"></a>
-<span class="sourceLineNo">3158</span>    region.put(put);<a name="line.3158"></a>
-<span class="sourceLineNo">3159</span><a name="line.3159"></a>
-<span class="sourceLineNo">3160</span>    put = new Put(row5);<a name="line.3160"></a>
-<span class="sourceLineNo">3161</span>    put.addColumn(family, col1, Bytes.toBytes(40L));<a name="line.3161"></a>
-<span class="sourceLineNo">3162</span>    region.put(put);<a name="line.3162"></a>
-<span class="sourceLineNo">3163</span><a name="line.3163"></a>
-<span class="sourceLineNo">3164</span>    Scan scan = new Scan(row3, row4);<a name="line.3164"></a>
-<span class="sourceLineNo">3165</span>    scan.setMaxVersions();<a name="line.3165"></a>
-<span class="sourceLineNo">3166</span>    scan.addColumn(family, col1);<a name="line.3166"></a>
-<span class="sourceLineNo">3167</span>    InternalScanner s = region.getScanner(scan);<a name="line.3167"></a>
-<span class="sourceLineNo">3168</span><a name="line.3168"></a>
-<span class="sourceLineNo">3169</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.3169"></a>
-<span class="sourceLineNo">3170</span>    assertEquals(false, s.next(results));<a name="line.3170"></a>
-<span class="sourceLineNo">3171</span>    assertEquals(0, results.size());<a name="line.3171"></a>
-<span class="sourceLineNo">3172</span>  }<a name="line.3172"></a>
+<span class="sourceLineNo">3141</span>  @Test<a name="line.3141"></a>
+<span class="sourceLineNo">3142</span>  public void testScanner_StopRow1542() throws IOException {<a name="line.3142"></a>
+<span class="sourceLineNo">3143</span>    byte[] family = Bytes.toBytes("testFamily");<a name="line.3143"></a>
+<span class="sourceLineNo">3144</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.3144"></a>
+<span class="sourceLineNo">3145</span>    byte[] row1 = Bytes.toBytes("row111");<a name="line.3145"></a>
+<span class="sourceLineNo">3146</span>    byte[] row2 = Bytes.toBytes("row222");<a name="line.3146"></a>
+<span class="sourceLineNo">3147</span>    byte[] row3 = Bytes.toBytes("row333");<a name="line.3147"></a>
+<span class="sourceLineNo">3148</span>    byte[] row4 = Bytes.toBytes("row444");<a name="line.3148"></a>
+<span class="sourceLineNo">3149</span>    byte[] row5 = Bytes.toBytes("row555");<a name="line.3149"></a>
+<span class="sourceLineNo">3150</span><a name="line.3150"></a>
+<span class="sourceLineNo">3151</span>    byte[] col1 = Bytes.toBytes("Pub111");<a name="line.3151"></a>
+<span class="sourceLineNo">3152</span>    byte[] col2 = Bytes.toBytes("Pub222");<a name="line.3152"></a>
+<span class="sourceLineNo">3153</span><a name="line.3153"></a>
+<span class="sourceLineNo">3154</span>    Put put = new Put(row1);<a name="line.3154"></a>
+<span class="sourceLineNo">3155</span>    put.addColumn(family, col1, Bytes.toBytes(10L));<a name="line.3155"></a>
+<span class="sourceLineNo">3156</span>    region.put(put);<a name="line.3156"></a>
+<span class="sourceLineNo">3157</span><a name="line.3157"></a>
+<span class="sourceLineNo">3158</span>    put = new Put(row2);<a name="line.3158"></a>
+<span class="sourceLineNo">3159</span>    put.addColumn(family, col1, Bytes.toBytes(15L));<a name="line.3159"></a>
+<span class="sourceLineNo">3160</span>    region.put(put);<a name="line.3160"></a>
+<span class="sourceLineNo">3161</span><a name="line.3161"></a>
+<span class="sourceLineNo">3162</span>    put = new Put(row3);<a name="line.3162"></a>
+<span class="sourceLineNo">3163</span>    put.addColumn(family, col2, Bytes.toBytes(20L));<a name="line.3163"></a>
+<span class="sourceLineNo">3164</span>    region.put(put);<a name="line.3164"></a>
+<span class="sourceLineNo">3165</span><a name="line.3165"></a>
+<span class="sourceLineNo">3166</span>    put = new Put(row4);<a name="line.3166"></a>
+<span class="sourceLineNo">3167</span>    put.addColumn(family, col2, Bytes.toBytes(30L));<a name="line.3167"></a>
+<span class="sourceLineNo">3168</span>    region.put(put);<a name="line.3168"></a>
+<span class="sourceLineNo">3169</span><a name="line.3169"></a>
+<span class="sourceLineNo">3170</span>    put = new Put(row5);<a name="line.3170"></a>
+<span class="sourceLineNo">3171</span>    put.addColumn(family, col1, Bytes.toBytes(40L));<a name="line.3171"></a>
+<span class="sourceLineNo">3172</span>    region.put(put);<a name="line.3172"></a>
 <span class="sourceLineNo">3173</span><a name="line.3173"></a>
-<span class="sourceLineNo">3174</span>  @Test<a name="line.3174"></a>
-<span class="sourceLineNo">3175</span>  public void testScanner_Wildcard_FromMemStoreAndFiles_EnforceVersions() throws IOException {<a name="line.3175"></a>
-<span class="sourceLineNo">3176</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.3176"></a>
-<span class="sourceLineNo">3177</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.3177"></a>
-<span class="sourceLineNo">3178</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.3178"></a>
-<span class="sourceLineNo">3179</span>    byte[] qf2 = Bytes.toBytes("quateslifier2");<a name="line.3179"></a>
-<span class="sourceLineNo">3180</span><a name="line.3180"></a>
-<span class="sourceLineNo">3181</span>    long ts1 = 1;<a name="line.3181"></a>
-<span class="sourceLineNo">3182</span>    long ts2 = ts1 + 1;<a name="line.3182"></a>
-<span class="sourceLineNo">3183</span>    long ts3 = ts1 + 2;<a name="line.3183"></a>
-<span class="sourceLineNo">3184</span>    long ts4 = ts1 + 3;<a name="line.3184"></a>
-<span class="sourceLineNo">3185</span><a name="line.3185"></a>
-<span class="sourceLineNo">3186</span>    // Setting up region<a name="line.3186"></a>
-<span class="sourceLineNo">3187</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.3187"></a>
-<span class="sourceLineNo">3188</span>    // Putting data in Region<a name="line.3188"></a>
-<span class="sourceLineNo">3189</span>    KeyValue kv14 = new KeyValue(row1, fam1, qf1, ts4, KeyValue.Type.Put, null);<a name="line.3189"></a>
-<span class="sourceLineNo">3190</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.3190"></a>
-<span class="sourceLineNo">3191</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.3191"></a>
-<span class="sourceLineNo">3192</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.3192"></a>
-<span class="sourceLineNo">3193</span><a name="line.3193"></a>
-<span class="sourceLineNo">3194</span>    KeyValue kv24 = new KeyValue(row1, fam1, qf2, ts4, KeyValue.Type.Put, null);<a name="line.3194"></a>
-<span class="sourceLineNo">3195</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.3195"></a>
-<span class="sourceLineNo">3196</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.3196"></a>
-<span class="sourceLineNo">3197</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.3197"></a>
-<span class="sourceLineNo">3198</span><a name="line.3198"></a>
-<span class="sourceLineNo">3199</span>    Put put = null;<a name="line.3199"></a>
-<span class="sourceLineNo">3200</span>    put = new Put(row1);<a name="line.3200"></a>
-<span class="sourceLineNo">3201</span>    put.add(kv14);<a name="line.3201"></a>
-<span class="sourceLineNo">3202</span>    put.add(kv24);<a name="line.3202"></a>
-<span class="sourceLineNo">3203</span>    region.put(put);<a name="line.3203"></a>
-<span class="sourceLineNo">3204</span>    region.flush(true);<a name="line.3204"></a>
-<span class="sourceLineNo">3205</span><a name="line.3205"></a>
-<span class="sourceLineNo">3206</span>    put = new Put(row1);<a name="line.3206"></a>
-<span class="sourceLineNo">3207</span>    put.add(kv23);<a name="line.3207"></a>
-<span class="sourceLineNo">3208</span>    put.add(kv13);<a name="line.3208"></a>
-<span class="sourceLineNo">3209</span>    region.put(put);<a name="line.3209"></a>
-<span class="sourceLineNo">3210</span>    region.flush(true);<a name="line.3210"></a>
-<span class="sourceLineNo">3211</span><a name="line.3211"></a>
-<span class="sourceLineNo">3212</span>    put = new Put(row1);<a name="line.3212"></a>
-<span class="sourceLineNo">3213</span>    put.add(kv22);<a name="line.3213"></a>
-<span class="sourceLineNo">3214</span>    put.add(kv12);<a name="line.3214"></a>
-<span class="sourceLineNo">3215</span>    region.put(put);<a name="line.3215"></a>
-<span class="sourceLineNo">3216</span>    region.flush(true);<a name="line.3216"></a>
-<span class="sourceLineNo">3217</span><a name="line.3217"></a>
-<span class="sourceLineNo">3218</span>    put = new Put(row1);<a name="line.3218"></a>
-<span class="sourceLineNo">3219</span>    put.add(kv21);<a name="line.3219"></a>
-<span class="sourceLineNo">3220</span>    put.add(kv11);<a name="line.3220"></a>
-<span class="sourceLineNo">3221</span>    region.put(put);<a name="line.3221"></a>
-<span class="sourceLineNo">3222</span><a name="line.3222"></a>
-<span class="sourceLineNo">3223</span>    // Expected<a name="line.3223"></a>
-<span class="sourceLineNo">3224</span>    List&lt;KeyValue&gt; expected = new ArrayList&lt;&gt;();<a name="line.3224"></a>
-<span class="sourceLineNo">3225</span>    expected.add(kv14);<a name="line.3225"></a>
-<span class="sourceLineNo">3226</span>    expected.add(kv13);<a name="line.3226"></a>
-<span class="sourceLineNo">3227</span>    expected.add(kv12);<a name="line.3227"></a>
-<span class="sourceLineNo">3228</span>    expected.add(kv24);<a name="line.3228"></a>
-<span class="sourceLineNo">3229</span>    expected.add(kv23);<a name="line.3229"></a>
-<span class="sourceLineNo">3230</span>    expected.add(kv22);<a name="line.3230"></a>
-<span class="sourceLineNo">3231</span><a name="line.3231"></a>
-<span class="sourceLineNo">3232</span>    Scan scan = new Scan(row1);<a name="line.3232"></a>
-<span class="sourceLineNo">3233</span>    int versions = 3;<a name="line.3233"></a>
-<span class="sourceLineNo">3234</span>    scan.setMaxVersions(versions);<a name="line.3234"></a>
-<span class="sourceLineNo">3235</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.3235"></a>
-<span class="sourceLineNo">3236</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.3236"></a>
-<span class="sourceLineNo">3237</span><a name="line.3237"></a>
-<span class="sourceLineNo">3238</span>    boolean hasNext = scanner.next(actual);<a name="line.3238"></a>
-<span class="sourceLineNo">3239</span>    assertEquals(false, hasNext);<a name="line.3239"></a>
-<span class="sourceLineNo">3240</span><a name="line.3240"></a>
-<span class="sourceLineNo">3241</span>    // Verify result<a name="line.3241"></a>
-<span class="sourceLineNo">3242</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.3242"></a>
-<span class="sourceLineNo">3243</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected.get(i), actual.get(i)));<a name="line.3243"></a>
-<span class="sourceLineNo">3244</span>    }<a name="line.3244"></a>
-<span class="sourceLineNo">3245</span>  }<a name="line.3245"></a>
-<span class="sourceLineNo">3246</span><a name="line.3246"></a>
-<span class="sourceLineNo">3247</span>  /**<a name="line.3247"></a>
-<span class="sourceLineNo">3248</span>   * Added for HBASE-5416<a name="line.3248"></a>
-<span class="sourceLineNo">3249</span>   *<a name="line.3249"></a>
-<span class="sourceLineNo">3250</span>   * Here we test scan optimization when only subset of CFs are used in filter<a name="line.3250"></a>
-<span class="sourceLineNo">3251</span>   * conditions.<a name="line.3251"></a>
-<span class="sourceLineNo">3252</span>   */<a name="line.3252"></a>
-<span class="sourceLineNo">3253</span>  @Test<a name="line.3253"></a>
-<span class="sourceLineNo">3254</span>  public void testScanner_JoinedScanners() throws IOException {<a name="line.3254"></a>
-<span class="sourceLineNo">3255</span>    byte[] cf_essential = Bytes.toBytes("essential");<a name="line.3255"></a>
-<span class="sourceLineNo">3256</span>    byte[] cf_joined = Bytes.toBytes("joined");<a name="line.3256"></a>
-<span class="sourceLineNo">3257</span>    byte[] cf_alpha = Bytes.toBytes("alpha");<a name="line.3257"></a>
-<span class="sourceLineNo">3258</span>    this.region = initHRegion(tableName, method, CONF, cf_essential, cf_joined, cf_alpha);<a name="line.3258"></a>
-<span class="sourceLineNo">3259</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.3259"></a>
-<span class="sourceLineNo">3260</span>    byte[] row2 = Bytes.toBytes("row2");<a name="line.3260"></a>
-<span class="sourceLineNo">3261</span>    byte[] row3 = Bytes.toBytes("row3");<a name="line.3261"></a>
-<span class="sourceLineNo">3262</span><a name="line.3262"></a>
-<span class="sourceLineNo">3263</span>    byte[] col_normal = Bytes.toBytes("d");<a name="line.3263"></a>
-<span class="sourceLineNo">3264</span>    byte[] col_alpha = Bytes.toBytes("a");<a name="line.3264"></a>
-<span class="sourceLineNo">3265</span><a name="line.3265"></a>
-<span class="sourceLineNo">3266</span>    byte[] filtered_val = Bytes.toBytes(3);<a name="line.3266"></a>
-<span class="sourceLineNo">3267</span><a name="line.3267"></a>
-<span class="sourceLineNo">3268</span>    Put put = new Put(row1);<a name="line.3268"></a>
-<span class="sourceLineNo">3269</span>    put.addColumn(cf_essential, col_normal, Bytes.toBytes(1));<a name="line.3269"></a>
-<span class="sourceLineNo">3270</span>    put.addColumn(cf_joined, col_alpha, Bytes.toBytes(1));<a name="line.3270"></a>
-<span class="sourceLineNo">3271</span>    region.put(put);<a name="line.3271"></a>
+<span class="sourceLineNo">3174</span>    Scan scan = new Scan(row3, row4);<a name="line.3174"></a>
+<span class="sourceLineNo">3175</span>    scan.setMaxVersions();<a name="line.3175"></a>
+<span class="sourceLineNo">3176</span>    scan.addColumn(family, col1);<a name="line.3176"></a>
+<span class="sourceLineNo">3177</span>    InternalScanner s = region.getScanner(scan);<a name="line.3177"></a>
+<span class="sourceLineNo">3178</span><a name="line.3178"></a>
+<span class="sourceLineNo">3179</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.3179"></a>
+<span class="sourceLineNo">3180</span>    assertEquals(false, s.next(results));<a name="line.3180"></a>
+<span class="sourceLineNo">3181</span>    assertEquals(0, results.size());<a name="line.3181"></a>
+<span class="sourceLineNo">3182</span>  }<a name="line.3182"></a>
+<span class="sourceLineNo">3183</span><a name="line.3183"></a>
+<span class="sourceLineNo">3184</span>  @Test<a name="line.3184"></a>
+<span class="sourceLineNo">3185</span>  public void testScanner_Wildcard_FromMemStoreAndFiles_EnforceVersions() throws IOException {<a name="line.3185"></a>
+<span class="sourceLineNo">3186</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.3186"></a>
+<span class="sourceLineNo">3187</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.3187"></a>
+<span class="sourceLineNo">3188</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.3188"></a>
+<span class="sourceLineNo">3189</span>    byte[] qf2 = Bytes.toBytes("quateslifier2");<a name="line.3189"></a>
+<span class="sourceLineNo">3190</span><a name="line.3190"></a>
+<span class="sourceLineNo">3191</span>    long ts1 = 1;<a name="line.3191"></a>
+<span class="sourceLineNo">3192</span>    long ts2 = ts1 + 1;<a name="line.3192"></a>
+<span class="sourceLineNo">3193</span>    long ts3 = ts1 + 2;<a name="line.3193"></a>
+<span class="sourceLineNo">3194</span>    long ts4 = ts1 + 3;<a name="line.3194"></a>
+<span class="sourceLineNo">3195</span><a name="line.3195"></a>
+<span class="sourceLineNo">3196</span>    // Setting up region<a name="line.3196"></a>
+<span class="sourceLineNo">3197</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.3197"></a>
+<span class="sourceLineNo">3198</span>    // Putting data in Region<a name="line.3198"></a>
+<span class="sourceLineNo">3199</span>    KeyValue kv14 = new KeyValue(row1, fam1, qf1, ts4, KeyValue.Type.Put, null);<a name="line.3199"></a>
+<span class="sourceLineNo">3200</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.3200"></a>
+<span class="sourceLineNo">3201</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.3201"></a>
+<span class="sourceLineNo">3202</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.3202"></a>
+<span class="sourceLineNo">3203</span><a name="line.3203"></a>
+<span class="sourceLineNo">3204</span>    KeyValue kv24 = new KeyValue(row1, fam1, qf2, ts4, KeyValue.Type.Put, null);<a name="line.3204"></a>
+<span class="sourceLineNo">3205</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.3205"></a>
+<span class="sourceLineNo">3206</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.3206"></a>
+<span class="sourceLineNo">3207</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.3207"></a>
+<span class="sourceLineNo">3208</span><a name="line.3208"></a>
+<span class="sourceLineNo">3209</span>    Put put = null;<a name="line.3209"></a>
+<span class="sourceLineNo">3210</span>    put = new Put(row1);<a name="line.3210"></a>
+<span class="sourceLineNo">3211</span>    put.add(kv14);<a name="line.3211"></a>
+<span class="sourceLineNo">3212</span>    put.add(kv24);<a name="line.3212"></a>
+<span class="sourceLineNo">3213</span>    region.put(put);<a name="line.3213"></a>
+<span class="sourceLineNo">3214</span>    region.flush(true);<a name="line.3214"></a>
+<span class="sourceLineNo">3215</span><a name="line.3215"></a>
+<span class="sourceLineNo">3216</span>    put = new Put(row1);<a name="line.3216"></a>
+<span class="sourceLineNo">3217</span>    put.add(kv23);<a name="line.3217"></a>
+<span class="sourceLineNo">3218</span>    put.add(kv13);<a name="line.3218"></a>
+<span class="sourceLineNo">3219</span>    region.put(put);<a name="line.3219"></a>
+<span class="sourceLineNo">3220</span>    region.flush(true);<a name="line.3220"></a>
+<span class="sourceLineNo">3221</span><a name="line.3221"></a>
+<span class="sourceLineNo">3222</span>    put = new Put(row1);<a name="line.3222"></a>
+<span class="sourceLineNo">3223</span>    put.add(kv22);<a name="line.3223"></a>
+<span class="sourceLineNo">3224</span>    put.add(kv12);<a name="line.3224"></a>
+<span class="sourceLineNo">3225</span>    region.put(put);<a name="line.3225"></a>
+<span class="sourceLineNo">3226</span>    region.flush(true);<a name="line.3226"></a>
+<span class="sourceLineNo">3227</span><a name="line.3227"></a>
+<span class="sourceLineNo">3228</span>    put = new Put(row1);<a name="line.3228"></a>
+<span class="sourceLineNo">3229</span>    put.add(kv21);<a name="line.3229"></a>
+<span class="sourceLineNo">3230</span>    put.add(kv11);<a name="line.3230"></a>
+<span class="sourceLineNo">3231</span>    region.put(put);<a name="line.3231"></a>
+<span class="sourceLineNo">3232</span><a name="line.3232"></a>
+<span class="sourceLineNo">3233</span>    // Expected<a name="line.3233"></a>
+<span class="sourceLineNo">3234</span>    List&lt;KeyValue&gt; expected = new ArrayList&lt;&gt;();<a name="line.3234"></a>
+<span class="sourceLineNo">3235</span>    expected.add(kv14);<a name="line.3235"></a>
+<span class="sourceLineNo">3236</span>    expected.add(kv13);<a name="line.3236"></a>
+<span class="sourceLineNo">3237</span>    expected.add(kv12);<a name="line.3237"></a>
+<span class="sourceLineNo">3238</span>    expected.add(kv24);<a name="line.3238"></a>
+<span class="sourceLineNo">3239</span>    expected.add(kv23);<a name="line.3239"></a>
+<span class="sourceLineNo">3240</span>    expected.add(kv22);<a name="line.3240"></a>
+<span class="sourceLineNo">3241</span><a name="line.3241"></a>
+<span class="sourceLineNo">3242</span>    Scan scan = new Scan(row1);<a name="line.3242"></a>
+<span class="sourceLineNo">3243</span>    int versions = 3;<a name="line.3243"></a>
+<span class="sourceLineNo">3244</span>    scan.setMaxVersions(versions);<a name="line.3244"></a>
+<span class="sourceLineNo">3245</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.3245"></a>
+<span class="sourceLineNo">3246</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.3246"></a>
+<span class="sourceLineNo">3247</span><a name="line.3247"></a>
+<span class="sourceLineNo">3248</span>    boolean hasNext = scanner.next(actual);<a name="line.3248"></a>
+<span class="sourceLineNo">3249</span>    assertEquals(false, hasNext);<a name="line.3249"></a>
+<span class="sourceLineNo">3250</span><a name="line.3250"></a>
+<span class="sourceLineNo">3251</span>    // Verify result<a name="line.3251"></a>
+<span class="sourceLineNo">3252</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.3252"></a>
+<span class="sourceLineNo">3253</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected.get(i), actual.get(i)));<a name="line.3253"></a>
+<span class="sourceLineNo">3254</span>    }<a name="line.3254"></a>
+<span class="sourceLineNo">3255</span>  }<a name="line.3255"></a>
+<span class="sourceLineNo">3256</span><a name="line.3256"></a>
+<span class="sourceLineNo">3257</span>  /**<a name="line.3257"></a>
+<span class="sourceLineNo">3258</span>   * Added for HBASE-5416<a name="line.3258"></a>
+<span class="sourceLineNo">3259</span>   *<a name="line.3259"></a>
+<span class="sourceLineNo">3260</span>   * Here we test scan optimization when only subset of CFs are used in filter<a name="line.3260"></a>
+<span class="sourceLineNo">3261</span>   * conditions.<a name="line.3261"></a>
+<span class="sourceLineNo">3262</span>   */<a name="line.3262"></a>
+<span class="sourceLineNo">3263</span>  @Test<a name="line.3263"></a>
+<span class="sourceLineNo">3264</span>  public void testScanner_JoinedScanners() throws IOException {<a name="line.3264"></a>
+<span class="sourceLineNo">3265</span>    byte[] cf_essential = Bytes.toBytes("essential");<a name="line.3265"></a>
+<span class="sourceLineNo">3266</span>    byte[] cf_joined = Bytes.toBytes("joined");<a name="line.3266"></a>
+<span class="sourceLineNo">3267</span>    byte[] cf_alpha = Bytes.toBytes("alpha");<a name="line.3267"></a>
+<span class="sourceLineNo">3268</span>    this.region = initHRegion(tableName, method, CONF, cf_essential, cf_joined, cf_alpha);<a name="line.3268"></a>
+<span class="sourceLineNo">3269</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.3269"></a>
+<span class="sourceLineNo">3270</span>    byte[] row2 = Bytes.toBytes("row2");<a name="line.3270"></a>
+<span class="sourceLineNo">3271</span>    byte[] row3 = Bytes.toBytes("row3");<a name="line.3271"></a>
 <span class="sourceLineNo">3272</span><a name="line.3272"></a>
-<span class="sourceLineNo">3273</span>    put = new Put(row2);<a name="line.3273"></a>
-<span class="sourceLineNo">3274</span>    put.addColumn(cf_essential, col_alpha, Bytes.toBytes(2));<a name="line.3274"></a>
-<span class="sourceLineNo">3275</span>    put.addColumn(cf_joined, col_normal, Bytes.toBytes(2));<a name="line.3275"></a>
-<span class="sourceLineNo">3276</span>    put.addColumn(cf_alpha, col_alpha, Bytes.toBytes(2));<a name="line.3276"></a>
-<span class="sourceLineNo">3277</span>    region.put(put);<a name="line.3277"></a>
-<span class="sourceLineNo">3278</span><a name="line.3278"></a>
-<span class="sourceLineNo">3279</span>    put = new Put(row3);<a name="line.3279"></a>
-<span class="sourceLineNo">3280</span>    put.addColumn(cf_essential, col_normal, filtered_val);<a name="line.3280"></a>
-<span class="sourceLineNo">3281</span>    put.addColumn(cf_joined, col_normal, filtered_val);<a name="line.3281"></a>
-<span class="sourceLineNo">3282</span>    region.put(put);<a name="line.3282"></a>
-<span class="sourceLineNo">3283</span><a name="line.3283"></a>
-<span class="sourceLineNo">3284</span>    // Check two things:<a name="line.3284"></a>
-<span class="sourceLineNo">3285</span>    // 1. result list contains expected values<a name="line.3285"></a>
-<span class="sourceLineNo">3286</span>    // 2. result list is sorted properly<a name="line.3286"></a>
-<span class="sourceLineNo">3287</span><a name="line.3287"></a>
-<span class="sourceLineNo">3288</span>    Scan scan = new Scan();<a name="line.3288"></a>
-<span class="sourceLineNo">3289</span>    Filter filter = new SingleColumnValueExcludeFilter(cf_essential, col_normal,<a name="line.3289"></a>
-<span class="sourceLineNo">3290</span>            CompareOperator.NOT_EQUAL, filtered_val);<a name="line.3290"></a>
-<span class="sourceLineNo">3291</span>    scan.setFilter(filter);<a name="line.3291"></a>
-<span class="sourceLineNo">3292</span>    scan.setLoadColumnFamiliesOnDemand(true);<a name="line.3292"></a>
-<span class="sourceLineNo">3293</span>    InternalScanner s = region.getScanner(scan);<a name="line.3293"></a>
-<span class="sourceLineNo">3294</span><a name="line.3294"></a>
-<span class="sourceLineNo">3295</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.3295"></a>
-<span class="sourceLineNo">3296</span>    assertTrue(s.next(results));<a name="line.3296"></a>
-<span class="sourceLineNo">3297</span>    assertEquals(1, results.size());<a name="line.3297"></a>
-<span class="sourceLineNo">3298</span>    results.clear();<a name="line.3298"></a>
-<span class="sourceLineNo">3299</span><a name="line.3299"></a>
-<span class="sourceLineNo">3300</span>    assertTrue(s.next(results));<a name="line.3300"></a>
-<span class="sourceLineNo">3301</span>    assertEquals(3, results.size());<a name="line.3301"></a>
-<span class="sourceLineNo">3302</span>    assertTrue("orderCheck", CellUtil.matchingFamily(results.get(0), cf_alpha));<a name="line.3302"></a>
-<span class="sourceLineNo">3303</span>    assertTrue("orderCheck", CellUtil.matchingFamily(results.get(1), cf_essential));<a name="line.3303"></a>
-<span class="sourceLineNo">3304</span>    assertTrue("orderCheck", CellUtil.matchingFamily(results.get(2), cf_joined));<a name="line.3304"></a>
-<span class="sourceLineNo">3305</span>    results.clear();<a name="line.3305"></a>
-<span class="sourceLineNo">3306</span><a name="line.3306"></a>
-<span class="sourceLineNo">3307</span>    assertFalse(s.next(results));<a name="line.3307"></a>
-<span class="sourceLineNo">3308</span>    assertEquals(0, results.size());<a name="line.3308"></a>
-<span class="sourceLineNo">3309</span>  }<a name="line.3309"></a>
-<span class="sourceLineNo">3310</span><a name="line.3310"></a>
-<span class="sourceLineNo">3311</span>  /**<a name="line.3311"></a>
-<span class="sourceLineNo">3312</span>   * HBASE-5416<a name="line.3312"></a>
-<span class="sourceLineNo">3313</span>   *<a name="line.3313"></a>
-<span class="sourceLineNo">3314</span>   * Test case when scan limits amount of KVs returned on each next() call.<a name="line.3314"></a>
-<span class="sourceLineNo">3315</span>   */<a name="line.3315"></a>
-<span class="sourceLineNo">3316</span>  @Test<a name="line.3316"></a>
-<span class="sourceLineNo">3317</span>  public void testScanner_JoinedScannersWithLimits() throws IOException {<a name="line.3317"></a>
-<span class="sourceLineNo">3318</span>    final byte[] cf_first = Bytes.toBytes("first");<a name="line.3318"></a>
-<span class="sourceLineNo">3319</span>    final byte[] cf_second = Bytes.toBytes("second");<a name="line.3319"></a>
+<span class="sourceLineNo">3273</span>    byte[] col_normal = Bytes.toBytes("d");<a name="line.3273"></a>
+<span class="sourceLineNo">3274</span>    byte[] col_alpha = Bytes.toBytes("a");<a name="line.3274"></a>
+<span class="sourceLineNo">3275</span><a name="line.3275"></a>
+<span class="sourceLineNo">3276</span>    byte[] filtered_val = Bytes.toBytes(3);<a name="line.3276"></a>
+<span class="sourceLineNo">3277</span><a name="line.3277"></a>
+<span class="sourceLineNo">3278</span>    Put put = new Put(row1);<a name="line.3278"></a>
+<span class="sourceLineNo">3279</span>    put.addColumn(cf_essential, col_normal, Bytes.toBytes(1));<a name="line.3279"></a>
+<span class="sourceLineNo">3280</span>    put.addColumn(cf_joined, col_alpha, Bytes.toBytes(1));<a name="line.3280"></a>
+<span class="sourceLineNo">3281</span>    region.put(put);<a name="line.3281"></a>
+<span class="sourceLineNo">3282</span><a name="line.3282"></a>
+<span class="sourceLineNo">3283</span>    put = new Put(row2);<a name="line.3283"></a>
+<span class="sourceLineNo">3284</span>    put.addColumn(cf_essential, col_alpha, Bytes.toBytes(2));<a name="line.3284"></a>
+<span class="sourceLineNo">3285</span>    put.addColumn(cf_joined, col_normal, Bytes.toBytes(2));<a name="line.3285"></a>
+<span class="sourceLineNo">3286</span>    put.addColumn(cf_alpha, col_alpha, Bytes.toBytes(2));<a name="line.3286"></a>
+<span class="sourceLineNo">3287</span>    region.put(put);<a name="line.3287"></a>
+<span class="sourceLineNo">3288</span><a name="line.3288"></a>
+<span class="sourceLineNo">3289</span>    put = new Put(row3);<a name="line.3289"></a>
+<span class="sourceLineNo">3290</span>    put.addColumn(cf_essential, col_normal, filtered_val);<a name="line.3290"></a>
+<span class="sourceLineNo">3291</span>    put.addColumn(cf_joined, col_normal, filtered_val);<a name="line.3291"></a>
+<span class="sourceLineNo">3292</span>    region.put(put);<a name="line.3292"></a>
+<span class="sourceLineNo">3293</span><a name="line.3293"></a>
+<span class="sourceLineNo">3294</span>    // Check two things:<a name="line.3294"></a>
+<span class="sourceLineNo">3295</span>    // 1. result list contains expected values<a name="line.3295"></a>
+<span class="sourceLineNo">3296</span>    // 2. result list is sorted properly<a name="line.3296"></a>
+<span class="sourceLineNo">3297</span><a name="line.3297"></a>
+<span class="sourceLineNo">3298</span>    Scan scan = new Scan();<a name="line.3298"></a>
+<span class="sourceLineNo">3299</span>    Filter filter = new SingleColumnValueExcludeFilter(cf_essential, col_normal,<a name="line.3299"></a>
+<span class="sourceLineNo">3300</span>            CompareOperator.NOT_EQUAL, filtered_val);<a name="line.3300"></a>
+<span class="sourceLineNo">3301</span>    scan.setFilter(filter);<a name="line.3301"></a>
+<span class="sourceLineNo">3302</span>    scan.setLoadColumnFamiliesOnDemand(true);<a name="line.3302"></a>
+<span class="sourceLineNo">3303</span>    InternalScanner s = region.getScanner(scan);<a name="line.3303"></a>
+<span class="sourceLineNo">3304</span><a name="line.3304"></a>
+<span class="sourceLineNo">3305</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.3305"></a>
+<span class="sourceLineNo">3306</span>    assertTrue(s.next(results));<a name="line.3306"></a>
+<span class="sourceLineNo">3307</span>    assertEquals(1, results.size());<a name="line.3307"></a>
+<span class="sourceLineNo">3308</span>    results.clear();<a name="line.3308"></a>
+<span class="sourceLineNo">3309</span><a name="line.3309"></a>
+<span class="sourceLineNo">3310</span>    assertTrue(s.next(results));<a name="line.3310"></a>
+<span class="sourceLineNo">3311</span>    assertEquals(3, results.size());<a name="line.3311"></a>
+<span class="sourceLineNo">3312</span>    assertTrue("orderCheck", CellUtil.matchingFamily(results.get(0), cf_alpha));<a name="line.3312"></a>
+<span class="sourceLineNo">3313</span>    assertTrue("orderCheck", CellUtil.matchingFamily(results.get(1), cf_essential));<a name="line.3313"></a>
+<span class="sourceLineNo">3314</span>    assertTrue("orderCheck", CellUtil.matchingFamily(results.get(2), cf_joined));<a name="line.3314"></a>
+<span class="sourceLineNo">3315</span>    results.clear();<a name="line.3315"></a>
+<span class="sourceLineNo">3316</span><a name="line.3316"></a>
+<span class="sourceLineNo">3317</span>    assertFalse(s.next(results));<a name="line.3317"></a>
+<span class="sourceLineNo">3318</span>    assertEquals(0, results.size());<a name="line.3318"></a>
+<span class="sourceLineNo">3319</span>  }<a name="line.3319"></a>
 <span class="sourceLineNo">3320</span><a name="line.3320"></a>
-<span class="sourceLineNo">3321</span>    this.region = initHRegion(tableName, method, CONF, cf_first, cf_second);<a name="line.3321"></a>
-<span class="sourceLineNo">3322</span>    final byte[] col_a = Bytes.toBytes("a");<a name="line.3322"></a>
-<span class="sourceLineNo">3323</span>    final byte[] col_b = Bytes.toBytes("b");<a name="line.3323"></a>
-<span class="sourceLineNo">3324</span><a name="line.3324"></a>
-<span class="sourceLineNo">3325</span>    Put put;<a name="line.3325"></a>
-<span class="sourceLineNo">3326</span><a name="line.3326"></a>
-<span class="sourceLineNo">3327</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.3327"></a>
-<span class="sourceLineNo">3328</span>      put = new Put(Bytes.toBytes("r" + Integer.toString(i)));<a name="line.3328"></a>
-<span class="sourceLineNo">3329</span>      put.addColumn(cf_first, col_a, Bytes.toBytes(i));<a name="line.3329"></a>
-<span class="sourceLineNo">3330</span>      if (i &lt; 5) {<a name="line.3330"></a>
-<span class="sourceLineNo">3331</span>        put.addColumn(cf_first, col_b, Bytes.toBytes(i));<a name="line.3331"></a>
-<span class="sourceLineNo">3332</span>        put.addColumn(cf_second, col_a, Bytes.toBytes(i));<a name="line.3332"></a>
-<span class="sourceLineNo">3333</span>        put.addColumn(cf_second, col_b, Bytes.toBytes(i));<a name="line.3333"></a>
-<span class="sourceLineNo">3334</span>      }<a name="line.3334"></a>
-<span class="sourceLineNo">3335</span>      region.put(put);<a name="line.3335"></a>
-<span class="sourceLineNo">3336</span>    }<a name="line.3336"></a>
-<span class="sourceLineNo">3337</span><a name="line.3337"></a>
-<span class="sourceLineNo">3338</span>    Scan scan = new Scan();<a name="line.3338"></a>
-<span class="sourceLineNo">3339</span>    scan.setLoadColumnFamiliesOnDemand(true);<a name="line.3339"></a>
-<span class="sourceLineNo">3340</span>    Filter bogusFilter = new FilterBase() {<a name="line.3340"></a>
-<span class="sourceLineNo">3341</span>      @Override<a name="line.3341"></a>
-<span class="sourceLineNo">3342</span>      public ReturnCode filterCell(final Cell ignored) throws IOException {<a name="line.3342"></a>
-<span class="sourceLineNo">3343</span>        return ReturnCode.INCLUDE;<a name="line.3343"></a>
+<span class="sourceLineNo">3321</span>  /**<a name="line.3321"></a>
+<span class="sourceLineNo">3322</span>   * HBASE-5416<a name="line.3322"></a>
+<span class="sourceLineNo">3323</span>   *<a name="line.3323"></a>
+<span class="sourceLineNo">3324</span>   * Test case when scan limits amount of KVs returned on each next() call.<a name="line.3324"></a>
+<span class="sourceLineNo">3325</span>   */<a name="line.3325"></a>
+<span class="sourceLineNo">3326</span>  @Test<a name="line.3326"></a>
+<span class="sourceLineNo">3327</span>  public void testScanner_JoinedScannersWithLimits() throws IOException {<a name="line.3327"></a>
+<span class="sourceLineNo">3328</span>    final byte[] cf_first = Bytes.toBytes("first");<a name="line.3328"></a>
+<span class="sourceLineNo">3329</span>    final byte[] cf_second = Bytes.toBytes("second");<a name="line.3329"></a>
+<span class="sourceLineNo">3330</span><a name="line.3330"></a>
+<span class="sourceLineNo">3331</span>    this.region = initHRegion(tableName, method, CONF, cf_first, cf_second);<a name="line.3331"></a>
+<span class="sourceLineNo">3332</span>    final byte[] col_a = Bytes.toBytes("a");<a name="line.3332"></a>
+<span class="sourceLineNo">3333</span>    final byte[] col_b = Bytes.toBytes("b");<a name="line.3333"></a>
+<span class="sourceLineNo">3334</span><a name="line.3334"></a>
+<span class="sourceLineNo">3335</span>    Put put;<a name="line.3335"></a>
+<span class="sourceLineNo">3336</span><a name="line.3336"></a>
+<span class="sourceLineNo">3337</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.3337"></a>
+<span class="sourceLineNo">3338</span>      put = new Put(Bytes.toBytes("r" + Integer.toString(i)));<a name="line.3338"></a>
+<span class="sourceLineNo">3339</span>      put.addColumn(cf_first, col_a, Bytes.toBytes(i));<a name="line.3339"></a>
+<span class="sourceLineNo">3340</span>      if (i &lt; 5) {<a name="line.3340"></a>
+<span class="sourceLineNo">3341</span>        put.addColumn(cf_first, col_b, Bytes.toBytes(i));<a name="line.3341"></a>
+<span class="sourceLineNo">3342</span>        put.addColumn(cf_second, col_a, Bytes.toBytes(i));<a name="line.3342"></a>
+<span class="sourceLineNo">3343</span>        put.addColumn(cf_second, col_b, Bytes.toBytes(i));<a name="line.3343"></a>
 <span class="sourceLineNo">3344</span>      }<a name="line.3344"></a>
-<span class="sourceLineNo">3345</span>      @Override<a name="line.3345"></a>
-<span class="sourceLineNo">3346</span>      public boolean isFamilyEssential(byte[] name) {<a name="line.3346"></a>
-<span class="sourceLineNo">3347</span>        return Bytes.equals(name, cf_first);<a name="line.3347"></a>
-<span class="sourceLineNo">3348</span>      }<a name="line.3348"></a>
-<span class="sourceLineNo">3349</span>    };<a name="line.3349"></a>
-<span class="sourceLineNo">3350</span><a name="line.3350"></a>
-<span class="sourceLineNo">3351</span>    scan.setFilter(bogusFilter);<a name="line.3351"></a>
-<span class="sourceLineNo">3352</span>    InternalScanner s = region.getScanner(scan);<a name="line.3352"></a>
-<span class="sourceLineNo">3353</span><a name="line.3353"></a>
-<span class="sourceLineNo">3354</span>    // Our data looks like this:<a name="line.3354"></a>
-<span class="sourceLineNo">3355</span>    // r0: first:a, first:b, second:a, second:b<a name="line.3355"></a>
-<span class="sourceLineNo">3356</span>    // r1: first:a, first:b, second:a, second:b<a name="line.3356"></a>
-<span class="sourceLineNo">3357</span>    // r2: first:a, first:b, second:a, second:b<a name="line.3357"></a>
-<span class="sourceLineNo">3358</span>    // r3: first:a, first:b, second:a, second:b<a name="line.3358"></a>
-<span class="sourceLineNo">3359</span>    // r4: first:a, first:b, second:a, second:b<a name="line.3359"></a>
-<span class="sourceLineNo">3360</span>    // r5: first:a<a name="line.3360"></a>
-<span class="sourceLineNo">3361</span>    // r6: first:a<a name="line.3361"></a>
-<span class="sourceLineNo">3362</span>    // r7: first:a<a name="line.3362"></a>
-<span class="sourceLineNo">3363</span>    // r8: first:a<a name="line.3363"></a>
-<span class="sourceLineNo">3364</span>    // r9: first:a<a name="line.3364"></a>
-<span class="sourceLineNo">3365</span><a name="line.3365"></a>
-<span class="sourceLineNo">3366</span>    // But due to next's limit set to 3, we should get this:<a name="line.3366"></a>
-<span class="sourceLineNo">3367</span>    // r0: first:a, first:b, second:a<a name="line.3367"></a>
-<span class="sourceLineNo">3368</span>    // r0: second:b<a name="line.3368"></a>
-<span class="sourceLineNo">3369</span>    // r1: first:a, first:b, second:a<a name="line.3369"></a>
-<span class="sourceLineNo">3370</span>    // r1: second:b<a name="line.3370"></a>
-<span class="sourceLineNo">3371</span>    // r2: first:a, first:b, second:a<a name="line.3371"></a>
-<span class="sourceLineNo">3372</span>    // r2: second:b<a name="line.3372"></a>
-<span class="sourceLineNo">3373</span>    // r3: first:a, first:b, second:a<a name="line.3373"></a>
-<span class="sourceLineNo">3374</span>    // r3: second:b<a name="line.3374"></a>
-<span class="sourceLineNo">3375</span>    // r4: first:a, first:b, second:a<a name="line.3375"></a>
-<span class="sourceLineNo">3376</span>    // r4: second:b<a name="line.3376"></a>
-<span class="sourceLineNo">3377</span>    // r5: first:a<a name="line.3377"></a>
-<span class="sourceLineNo">3378</span>    // r6: first:a<a name="line.3378"></a>
-<span class="sourceLineNo">3379</span>    // r7: first:a<a name="line.3379"></a>
-<span class="sourceLineNo">3380</span>    // r8: first:a<a name="line.3380"></a>
-<span class="sourceLineNo">3381</span>    // r9: first:a<a name="line.3381"></a>
-<span class="sourceLineNo">3382</span><a name="line.3382"></a>
-<span class="sourceLineNo">3383</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.3383"></a>
-<span class="sourceLineNo">3384</span>    int index = 0;<a name="line.3384"></a>
-<span class="sourceLineNo">3385</span>    ScannerContext scannerContext = ScannerContext.newBuilder().setBatchLimit(3).build();<a name="line.3385"></a>
-<span class="sourceLineNo">3386</span>    while (true) {<a name="line.3386"></a>
-<span class="sourceLineNo">3387</span>      boolean more = s.next(results, scannerContext);<a name="line.3387"></a>
-<span class="sourceLineNo">3388</span>      if ((index &gt;&gt; 1) &lt; 5) {<a name="line.3388"></a>
-<span class="sourceLineNo">3389</span>        if (index % 2 == 0) {<a name="line.3389"></a>
-<span class="sourceLineNo">3390</span>          assertEquals(3, results.size());<a name="line.3390"></a>
-<span class="sourceLineNo">3391</span>        } else {<a name="line.3391"></a>
-<span class="sourceLineNo">3392</span>          assertEquals(1, results.size());<a name="line.3392"></a>
-<span class="sourceLineNo">3393</span>        }<a name="line.3393"></a>
-<span class="sourceLineNo">3394</span>      } else {<a name="line.3394"></a>
-<span class="sourceLineNo">3395</span>        assertEquals(1, results.size());<a name="line.3395"></a>
-<span class="sourceLineNo">3396</span>      }<a name="line.3396"></a>
-<span class="sourceLineNo">3397</span>      results.clear();<a name="line.3397"></a>
-<span class="sourceLineNo">3398</span>      index++;<a name="line.3398"></a>
-<span class="sourceLineNo">3399</span>      if (!more) {<a name="line.3399"></a>
-<span class="sourceLineNo">3400</span>        break;<a name="line.3400"></a>
-<span class="sourceLineNo">3401</span>      }<a name="line.3401"></a>
-<span class="sourceLineNo">3402</span>    }<a name="line.3402"></a>
-<span class="sourceLineNo">3403</span>  }<a name="line.3403"></a>
-<span class="sourceLineNo">3404</span><a name="line.3404"></a>
-<span class="sourceLineNo">3405</span>  /**<a name="line.3405"></a>
-<span class="sourceLineNo">3406</span>   * Write an HFile block full with Cells whose qualifier that are identical between<a name="line.3406"></a>
-<span class="sourceLineNo">3407</span>   * 0 and Short.MAX_VALUE. See HBASE-13329.<a name="line.3407"></a>
-<span class="sourceLineNo">3408</span>   * @throws Exception<a name="line.3408"></a>
-<span class="sourceLineNo">3409</span>   */<a name="line.3409"></a>
-<span class="sourceLineNo">3410</span>  @Test<a name="line.3410"></a>
-<span class="sourceLineNo">3411</span>  public void testLongQualifier() throws Exception {<a name="line.3411"></a>
-<span class="sourceLineNo">3412</span>    byte[] family = Bytes.toBytes("family");<a name="line.3412"></a>
-<span class="sourceLineNo">3413</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.3413"></a>
-<span class="sourceLineNo">3414</span>    byte[] q = new byte[Short.MAX_VALUE+2];<a name="line.3414"></a>
-<span class="sourceLineNo">3415</span>    Arrays.fill(q, 0, q.length-1, (byte)42);<a name="line.3415"></a>
-<span class="sourceLineNo">3416</span>    for (byte i=0; i&lt;10; i++) {<a name="line.3416"></a>
-<span class="sourceLineNo">3417</span>      Put p = new Put(Bytes.toBytes("row"));<a name="line.3417"></a>
-<span class="sourceLineNo">3418</span>      // qualifiers that differ past Short.MAX_VALUE<a name="line.3418"></a>
-<span class="sourceLineNo">3419</span>      q[q.length-1]=i;<a name="line.3419"></a>
-<span class="sourceLineNo">3420</span>      p.addColumn(family, q, q);<a name="line.3420"></a>
-<span class="sourceLineNo">3421</span>      region.put(p);<a name="line.3421"></a>
-<span class="sourceLineNo">3422</span>    }<a name="line.3422"></a>
-<span class="sourceLineNo">3423</span>    region.flush(false);<a name="line.3423"></a>
-<span class="sourceLineNo">3424</span>  }<a name="line.3424"></a>
-<span class="sourceLineNo">3425</span><a name="line.3425"></a>
-<span class="sourceLineNo">3426</span>  /**<a name="line.3426"></a>
-<span class="sourceLineNo">3427</span>   * Flushes the cache in a thread while scanning. The tests verify that the<a name="line.3427"></a>
-<span class="sourceLineNo">3428</span>   * scan is coherent - e.g. the returned results are always of the same or<a name="line.3428"></a>
-<span class="sourceLineNo">3429</span>   * later update as the previous results.<a name="line.3429"></a>
-<span class="sourceLineNo">3430</span>   *<a name="line.3430"></a>
-<span class="sourceLineNo">3431</span>   * @throws IOException<a name="line.3431"></a>
-<span class="sourceLineNo">3432</span>   *           scan / compact<a name="line.3432"></a>
-<span class="sourceLineNo">3433</span>   * @throws InterruptedException<a name="line.3433"></a>
-<span class="sourceLineNo">3434</span>   *           thread join<a name="line.3434"></a>
-<span class="sourceLineNo">3435</span>   */<a name="line.3435"></a>
-<span class="sourceLineNo">3436</span>  @Test<a name="line.3436"></a>
-<span class="sourceLineNo">3437</span>  public void testFlushCacheWhileScanning() throws IOException, InterruptedException {<a name="line.3437"></a>
-<span class="sourceLineNo">3438</span>    byte[] family = Bytes.toBytes("family");<a name="line.3438"></a>
-<span class="sourceLineNo">3439</span>    int numRows = 1000;<a name="line.3439"></a>
-<span class="sourceLineNo">3440</span>    int flushAndScanInterval = 10;<a name="line.3440"></a>
-<span class="sourceLineNo">3441</span>    int compactInterval = 10 * flushAndScanInterval;<a name="line.3441"></a>
-<span class="sourceLineNo">3442</span><a name="line.3442"></a>
-<span class="sourceLineNo">3443</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.3443"></a>
-<span class="sourceLineNo">3444</span>    FlushThread flushThread = new FlushThread();<a name="line.3444"></a>
-<span class="sourceLineNo">3445</span>    try {<a name="line.3445"></a>
-<span class="sourceLineNo">3446</span>      flushThread.start();<a name="line.3446"></a>
-<span class="sourceLineNo">3447</span><a name="line.3447"></a>
-<span class="sourceLineNo">3448</span>      Scan scan = new Scan();<a name="line.3448"></a>
-<span class="sourceLineNo">3449</span>      scan.addFamily(family);<a name="line.3449"></a>
-<span class="sourceLineNo">3450</span>      scan.setFilter(new SingleColumnValueFilter(family, qual1, CompareOperator.EQUAL,<a name="line.3450"></a>
-<span class="sourceLineNo">3451</span>          new BinaryComparator(Bytes.toBytes(5L))));<a name="line.3451"></a>
+<span class="sourceLineNo">3345</span>      region.put(put);<a name="line.3345"></a>
+<span class="sourceLineNo">3346</span>    }<a name="line.3346"></a>
+<span class="sourceLineNo">3347</span><a name="line.3347"></a>
+<span class="sourceLineNo">3348</span>    Scan scan = new Scan();<a name="line.3348"></a>
+<span class="sourceLineNo">3349</span>    scan.setLoadColumnFamiliesOnDemand(true);<a name="line.3349"></a>
+<span class="sourceLineNo">3350</span>    Filter bogusFilter = new FilterBase() {<a name="line.3350"></a>
+<span class="sourceLineNo">3351</span>      @Override<a name="line.3351"></a>
+<span class="sourceLineNo">3352</span>      public ReturnCode filterCell(final Cell ignored) throws IOException {<a name="line.3352"></a>
+<span class="sourceLineNo">3353</span>        return ReturnCode.INCLUDE;<a name="line.3353"></a>
+<span class="sourceLineNo">3354</span>      }<a name="line.3354"></a>
+<span class="sourceLineNo">3355</span>      @Override<a name="line.3355"></a>
+<span class="sourceLineNo">3356</span>      public boolean isFamilyEssential(byte[] name) {<a name="line.3356"></a>
+<span class="sourceLineNo">3357</span>        return Bytes.equals(name, cf_first);<a name="line.3357"></a>
+<span class="sourceLineNo">3358</span>      }<a name="line.3358"></a>
+<span class="sourceLineNo">3359</span>    };<a name="line.3359"></a>
+<span class="sourceLineNo">3360</span><a name="line.3360"></a>
+<span class="sourceLineNo">3361</span>    scan.setFilter(bogusFilter);<a name="line.3361"></a>
+<span class="sourceLineNo">3362</span>    InternalScanner s = region.getScanner(scan);<a name="line.3362"></a>
+<span class="sourceLineNo">3363</span><a name="line.3363"></a>
+<span class="sourceLineNo">3364</span>    // Our data looks like this:<a name="line.3364"></a>
+<span class="sourceLineNo">3365</span>    // r0: first:a, first:b, second:a, second:b<a name="line.3365"></a>
+<span class="sourceLineNo">3366</span>    // r1: first:a, first:b, second:a, second:b<a name="line.3366"></a>
+<span class="sourceLineNo">3367</span>    // r2: first:a, first:b, second:a, second:b<a name="line.3367"></a>
+<span class="sourceLineNo">3368</span>    // r3: first:a, first:b, second:a, second:b<a name="line.3368"></a>
+<span class="sourceLineNo">3369</span>    // r4: first:a, first:b, second:a, second:b<a name="line.3369"></a>
+<span class="sourceLineNo">3370</span>    // r5: first:a<a name="line.3370"></a>
+<span class="sourceLineNo">3371</span>    // r6: first:a<a name="line.3371"></a>
+<span class="sourceLineNo">3372</span>    // r7: first:a<a name="line.3372"></a>
+<span class="sourceLineNo">3373</span>    // r8: first:a<a name="line.3373"></a>
+<span class="sourceLineNo">3374</span>    // r9: first:a<a name="line.3374"></a>
+<span class="sourceLineNo">3375</span><a name="line.3375"></a>
+<span class="sourceLineNo">3376</span>    // But due to next's limit set to 3, we should get this:<a name="line.3376"></a>
+<span class="sourceLineNo">3377</span>    // r0: first:a, first:b, second:a<a name="line.3377"></a>
+<span class="sourceLineNo">3378</span>    // r0: second:b<a name="line.3378"></a>
+<span class="sourceLineNo">3379</span>    // r1: first:a, first:b, second:a<a name="line.3379"></a>
+<span class="sourceLineNo">3380</span>    // r1: second:b<a name="line.3380"></a>
+<span class="sourceLineNo">3381</span>    // r2: first:a, first:b, second:a<a name="line.3381"></a>
+<span class="sourceLineNo">3382</span>    // r2: second:b<a name="line.3382"></a>
+<span class="sourceLineNo">3383</span>    // r3: first:a, first:b, second:a<a name="line.3383"></a>
+<span class="sourceLineNo">3384</span>    // r3: second:b<a name="line.3384"></a>
+<span class="sourceLineNo">3385</span>    // r4: first:a, first:b, second:a<a name="line.3385"></a>
+<span class="sourceLineNo">3386</span>    // r4: second:b<a name="line.3386"></a>
+<span class="sourceLineNo">3387</span>    // r5: first:a<a name="line.3387"></a>
+<span class="sourceLineNo">3388</span>    // r6: first:a<a name="line.3388"></a>
+<span class="sourceLineNo">3389</span>    // r7: first:a<a name="line.3389"></a>
+<span class="sourceLineNo">3390</span>    // r8: first:a<a name="line.3390"></a>
+<span class="sourceLineNo">3391</span>    // r9: first:a<a name="line.3391"></a>
+<span class="sourceLineNo">3392</span><a name="line.3392"></a>
+<span class="sourceLineNo">3393</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.3393"></a>
+<span class="sourceLineNo">3394</span>    int index = 0;<a name="line.3394"></a>
+<span class="sourceLineNo">3395</span>    ScannerContext scannerContext = ScannerContext.newBuilder().setBatchLimit(3).build();<a name="line.3395"></a>
+<span class="sourceLineNo">3396</span>    while (true) {<a name="line.3396"></a>
+<span class="sourceLineNo">3397</span>      boolean more = s.next(results, scannerContext);<a name="line.3397"></a>
+<span class="sourceLineNo">3398</span>      if ((index &gt;&gt; 1) &lt; 5) {<a name="line.3398"></a>
+<span class="sourceLineNo">3399</span>        if (index % 2 == 0) {<a name="line.3399"></a>
+<span class="sourceLineNo">3400</span>          assertEquals(3, results.size());<a name="line.3400"></a>
+<span class="sourceLineNo">3401</span>        } else {<a name="line.3401"></a>
+<span class="sourceLineNo">3402</span>          assertEquals(1, results.size());<a name="line.3402"></a>
+<span class="sourceLineNo">3403</span>        }<a name="line.3403"></a>
+<span class="sourceLineNo">3404</span>      } else {<a name="line.3404"></a>
+<span class="sourceLineNo">3405</span>        assertEquals(1, results.size());<a name="line.3405"></a>
+<span class="sourceLineNo">3406</span>      }<a name="line.3406"></a>
+<span class="sourceLineNo">3407</span>      results.clear();<a name="line.3407"></a>
+<span class="sourceLineNo">3408</span>      index++;<a name="line.3408"></a>
+<span class="sourceLineNo">3409</span>      if (!more) {<a name="line.3409"></a>
+<span class="sourceLineNo">3410</span>        break;<a name="line.3410"></a>
+<span class="sourceLineNo">3411</span>      }<a name="line.3411"></a>
+<span class="sourceLineNo">3412</span>    }<a name="line.3412"></a>
+<span class="sourceLineNo">3413</span>  }<a name="line.3413"></a>
+<span class="sourceLineNo">3414</span><a name="line.3414"></a>
+<span class="sourceLineNo">3415</span>  /**<a name="line.3415"></a>
+<span class="sourceLineNo">3416</span>   * Write an HFile block full with Cells whose qualifier that are identical between<a name="line.3416"></a>
+<span class="sourceLineNo">3417</span>   * 0 and Short.MAX_VALUE. See HBASE-13329.<a name="line.3417"></a>
+<span class="sourceLineNo">3418</span>   * @throws Exception<a name="line.3418"></a>
+<span class="sourceLineNo">3419</span>   */<a name="line.3419"></a>
+<span class="sourceLineNo">3420</span>  @Test<a name="line.3420"></a>
+<span class="sourceLineNo">3421</span>  public void testLongQualifier() throws Exception {<a name="line.3421"></a>
+<span class="sourceLineNo">3422</span>    byte[] family = Bytes.toBytes("family");<a name="line.3422"></a>
+<span class="sourceLineNo">3423</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.3423"></a>
+<span class="sourceLineNo">3424</span>    byte[] q = new byte[Short.MAX_VALUE+2];<a name="line.3424"></a>
+<span class="sourceLineNo">3425</span>    Arrays.fill(q, 0, q.length-1, (byte)42);<a name="line.3425"></a>
+<span class="sourceLineNo">3426</span>    for (byte i=0; i&lt;10; i++) {<a name="line.3426"></a>
+<span class="sourceLineNo">3427</span>      Put p = new Put(Bytes.toBytes("row"));<a name="line.3427"></a>
+<span class="sourceLineNo">3428</span>      // qualifiers that differ past Short.MAX_VALUE<a name="line.3428"></a>
+<span class="sourceLineNo">3429</span>      q[q.length-1]=i;<a name="line.3429"></a>
+<span class="sourceLineNo">3430</span>      p.addColumn(family, q, q);<a name="line.3430"></a>
+<span class="sourceLineNo">3431</span>      region.put(p);<a name="line.3431"></a>
+<span class="sourceLineNo">3432</span>    }<a name="line.3432"></a>
+<span class="sourceLineNo">3433</span>    region.flush(false);<a name="line.3433"></a>
+<span class="sourceLineNo">3434</span>  }<a name="line.3434"></a>
+<span class="sourceLineNo">3435</span><a name="line.3435"></a>
+<span class="sourceLineNo">3436</span>  /**<a name="line.3436"></a>
+<span class="sourceLineNo">3437</span>   * Flushes the cache in a thread while scanning. The tests verify that the<a name="line.3437"></a>
+<span class="sourceLineNo">3438</span>   * scan is coherent - e.g. the returned results are always of the same or<a name="line.3438"></a>
+<span class="sourceLineNo">3439</span>   * later update as the previous results.<a name="line.3439"></a>
+<span class="sourceLineNo">3440</span>   *<a name="line.3440"></a>
+<span class="sourceLineNo">3441</span>   * @throws IOException<a name="line.3441"></a>
+<span class="sourceLineNo">3442</span>   *           scan / compact<a name="line.3442"></a>
+<span class="sourceLineNo">3443</span>   * @throws InterruptedException<a name="line.3443"></a>
+<span class="sourceLineNo">3444</span>   *           thread join<a name="line.3444"></a>
+<span class="sourceLineNo">3445</span>   */<a name="line.3445"></a>
+<span class="sourceLineNo">3446</span>  @Test<a name="line.3446"></a>
+<span class="sourceLineNo">3447</span>  public void testFlushCacheWhileScanning() throws IOException, InterruptedException {<a name="line.3447"></a>
+<span class="sourceLineNo">3448</span>    byte[] family = Bytes.toBytes("family");<a name="line.3448"></a>
+<span class="sourceLineNo">3449</span>    int numRows = 1000;<a name="line.3449"></a>
+<span class="sourceLineNo">3450</span>    int flushAndScanInterval = 10;<a name="line.3450"></a>
+<span class="sourceLineNo">3451</span>    int compactInterval = 10 * flushAndScanInterval;<a name="line.3451"></a>
 <span class="sourceLineNo">3452</span><a name="line.3452"></a>
-<span class="sourceLineNo">3453</span>      int expectedCount = 0;<a name="line.3453"></a>
-<span class="sourceLineNo">3454</span>      List&lt;Cell&gt; res = new ArrayList&lt;&gt;();<a name="line.3454"></a>
-<span class="sourceLineNo">3455</span><a name="line.3455"></a>
-<span class="sourceLineNo">3456</span>      boolean toggle = true;<a name="line.3456"></a>
-<span class="sourceLineNo">3457</span>      for (long i = 0; i &lt; numRows; i++) {<a name="line.3457"></a>
-<span class="sourceLineNo">3458</span>        Put put = new Put(Bytes.toBytes(i));<a name="line.3458"></a>
-<span class="sourceLineNo">3459</span>        put.setDurability(Durability.SKIP_WAL);<a name="line.3459"></a>
-<span class="sourceLineNo">3460</span>        put.addColumn(family, qual1, Bytes.toBytes(i % 10));<a name="line.3460"></a>
-<span class="sourceLineNo">3461</span>        region.put(put);<a name="line.3461"></a>
+<span class="sourceLineNo">3453</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.3453"></a>
+<span class="sourceLineNo">3454</span>    FlushThread flushThread = new FlushThread();<a name="line.3454"></a>
+<span class="sourceLineNo">3455</span>    try {<a name="line.3455"></a>
+<span class="sourceLineNo">3456</span>      flushThread.start();<a name="line.3456"></a>
+<span class="sourceLineNo">3457</span><a name="line.3457"></a>
+<span class="sourceLineNo">3458</span>      Scan scan = new Scan();<a name="line.3458"></a>
+<span class="sourceLineNo">3459</span>      scan.addFamily(family);<a name="line.3459"></a>
+<span class="sourceLineNo">3460</span>      scan.setFilter(new SingleColumnValueFilter(family, qual1, CompareOperator.EQUAL,<a name="line.3460"></a>
+<span class="sourceLineNo">3461</span>          new BinaryComparator(Bytes.toBytes(5L))));<a name="line.3461"></a>
 <span class="sourceLineNo">3462</span><a name="line.3462"></a>
-<span class="sourceLineNo">3463</span>        if (i != 0 &amp;&amp; i % compactInterval == 0) {<a name="line.3463"></a>
-<span class="sourceLineNo">3464</span>          LOG.debug("iteration = " + i+ " ts="+System.currentTimeMillis());<a name="line.3464"></a>
-<span class="sourceLineNo">3465</span>          region.compact(true);<a name="line.3465"></a>
-<span class="sourceLineNo">3466</span>        }<a name="line.3466"></a>
-<span class="sourceLineNo">3467</span><a name="line.3467"></a>
-<span class="sourceLineNo">3468</span>        if (i % 10 == 5L) {<a name="line.3468"></a>
-<span class="sourceLineNo">3469</span>          expectedCount++;<a name="line.3469"></a>
-<span class="sourceLineNo">3470</span>        }<a name="line.3470"></a>
-<span class="sourceLineNo">3471</span><a name="line.3471"></a>
-<span class="sourceLineNo">3472</span>        if (i != 0 &amp;&amp; i % flushAndScanInterval == 0) {<a name="line.3472"></a>
-<span class="sourceLineNo">3473</span>          res.clear();<a name="line.3473"></a>
-<span class="sourceLineNo">3474</span>          InternalScanner scanner = region.getScanner(scan);<a name="line.3474"></a>
-<span class="sourceLineNo">3475</span>          if (toggle) {<a name="line.3475"></a>
-<span class="sourceLineNo">3476</span>            flushThread.flush();<a name="line.3476"></a>
-<span class="sourceLineNo">3477</span>          }<a name="line.3477"></a>
-<span class="sourceLineNo">3478</span>          while (scanner.next(res))<a name="line.3478"></a>
-<span class="sourceLineNo">3479</span>            ;<a name="line.3479"></a>
-<span class="sourceLineNo">3480</span>          if (!toggle) {<a name="line.3480"></a>
-<span class="sourceLineNo">3481</span>            flushThread.flush();<a name="line.3481"></a>
-<span class="sourceLineNo">3482</span>          }<a name="line.3482"></a>
-<span class="sourceLineNo">3483</span>          assertEquals("toggle="+toggle+"i=" + i + " ts="+System.currentTimeMillis(),<a name="line.3483"></a>
-<span class="sourceLineNo">3484</span>              expectedCount, res.size());<a name="line.3484"></a>
-<span class="sourceLineNo">3485</span>          toggle = !toggle;<a name="line.3485"></a>
-<span class="sourceLineNo">3486</span>        }<a name="line.3486"></a>
-<span class="sourceLineNo">3487</span>      }<a name="line.3487"></a>
-<span class="sourceLineNo">3488</span><a name="line.3488"></a>
-<span class="sourceLineNo">3489</span>    } finally {<a name="line.3489"></a>
-<span class="sourceLineNo">3490</span>      try {<a name="line.3490"></a>
-<span class="sourceLineNo">3491</span>        flushThread.done();<a name="line.3491"></a>
-<span class="sourceLineNo">3492</span>        flushThread.join();<a name="line.3492"></a>
-<span class="sourceLineNo">3493</span>        flushThread.checkNoError();<a name="line.3493"></a>
-<span class="sourceLineNo">3494</span>      } catch (InterruptedException ie) {<a name="line.3494"></a>
-<span class="sourceLineNo">3495</span>        LOG.warn("Caught exception when joining with flushThread", ie);<a name="line.3495"></a>
-<span class="sourceLineNo">3496</span>      }<a name="line.3496"></a>
-<span class="sourceLineNo">3497</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.3497"></a>
-<span class="sourceLineNo">3498</span>      this.region = null;<a name="line.3498"></a>
-<span class="sourceLineNo">3499</span>    }<a name="line.3499"></a>
-<span class="sourceLineNo">3500</span>  }<a name="line.3500"></a>
-<span class="sourceLineNo">3501</span><a name="line.3501"></a>
-<span class="sourceLineNo">3502</span>  protected class FlushThread extends Thread {<a name="line.3502"></a>
-<span class="sourceLineNo">3503</span>    private volatile boolean done;<a name="line.3503"></a>
-<span class="sourceLineNo">3504</span>    private Throwable error = null;<a name="line.3504"></a>
-<span class="sourceLineNo">3505</span><a name="line.3505"></a>
-<span class="sourceLineNo">3506</span>    FlushThread() {<a name="line.3506"></a>
-<span class="sourceLineNo">3507</span>      super("FlushThread");<a name="line.3507"></a>
-<span class="sourceLineNo">3508</span>    }<a name="line.3508"></a>
-<span class="sourceLineNo">3509</span><a name="line.3509"></a>
-<span class="sourceLineNo">3510</span>    public void done() {<a name="line.3510"></a>
-<span class="sourceLineNo">3511</span>      done = true;<a name="line.3511"></a>
-<span class="sourceLineNo">3512</span>      synchronized (this) {<a name="line.3512"></a>
-<span class="sourceLineNo">3513</span>        interrupt();<a name="line.3513"></a>
-<span class="sourceLineNo">3514</span>      }<a name="line.3514"></a>
-<span class="sourceLineNo">3515</span>    }<a name="line.3515"></a>
-<span class="sourceLineNo">3516</span><a name="line.3516"></a>
-<span class="sourceLineNo">3517</span>    public void checkNoError() {<a name="line.3517"></a>
-<span class="sourceLineNo">3518</span>      if (error != null) {<a name="line.3518"></a>
-<span class="sourceLineNo">3519</span>        assertNull(error);<a name="line.3519"></a>
-<span class="sourceLineNo">3520</span>      }<a name="line.3520"></a>
-<span class="sourceLineNo">3521</span>    }<a name="line.3521"></a>
-<span class="sourceLineNo">3522</span><a name="line.3522"></a>
-<span class="sourceLineNo">3523</span>    @Override<a name="line.3523"></a>
-<span class="sourceLineNo">3524</span>    public void run() {<a name="line.3524"></a>
-<span class="sourceLineNo">3525</span>      done = false;<a name="line.3525"></a>
-<span class="sourceLineNo">3526</span>      while (!done) {<a name="line.3526"></a>
-<span class="sourceLineNo">3527</span>        synchronized (this) {<a name="line.3527"></a>
-<span class="sourceLineNo">3528</span>          try {<a name="line.3528"></a>
-<span class="sourceLineNo">3529</span>            wait();<a name="line.3529"></a>
-<span class="sourceLineNo">3530</span>          } catch (InterruptedException ignored) {<a name="line.3530"></a>
-<span class="sourceLineNo">3531</span>            if (done) {<a name="line.3531"></a>
-<span class="sourceLineNo">3532</span>              break;<a name="line.3532"></a>
-<span class="sourceLineNo">3533</span>            }<a name="line.3533"></a>
-<span class="sourceLineNo">3534</span>          }<a name="line.3534"></a>
-<span class="sourceLineNo">3535</span>        }<a name="line.3535"></a>
-<span class="sourceLineNo">3536</span>        try {<a name="line.3536"></a>
-<span class="sourceLineNo">3537</span>          region.flush(true);<a name="line.3537"></a>
-<span class="sourceLineNo">3538</span>        } catch (IOException e) {<a name="line.3538"></a>
-<span class="sourceLineNo">3539</span>          if (!done) {<a name="line.3539"></a>
-<span class="sourceLineNo">3540</span>            LOG.error("Error while flushing cache", e);<a name="line.3540"></a>
-<span class="sourceLineNo">3541</span>            error = e;<a name="line.3541"></a>
-<span class="sourceLineNo">3542</span>          }<a name="line.3542"></a>
-<span class="sourceLineNo">3543</span>          break;<a name="line.3543"></a>
-<span class="sourceLineNo">3544</span>        } catch (Throwable t) {<a name="line.3544"></a>
-<span class="sourceLineNo">3545</span>          LOG.error("Uncaught exception", t);<a name="line.3545"></a>
-<span class="sourceLineNo">3546</span>          throw t;<a name="line.3546"></a>
-<span class="sourceLineNo">3547</span>        }<a name="line.3547"></a>
-<span class="sourceLineNo">3548</span>      }<a name="line.3548"></a>
-<span class="sourceLineNo">3549</span>    }<a name="line.3549"></a>
-<span class="sourceLineNo">3550</span><a name="line.3550"></a>
-<span class="sourceLineNo">3551</span>    public void flush() {<a name="line.3551"></a>
-<span class="sourceLineNo">3552</span>      synchronized (this) {<a name="line.3552"></a>
-<span class="sourceLineNo">3553</span>        notify();<a name="line.3553"></a>
-<span class="sourceLineNo">3554</span>      }<a name="line.3554"></a>
-<span class="sourceLineNo">3555</span>    }<a name="line.3555"></a>
-<span class="sourceLineNo">3556</span>  }<a name="line.3556"></a>
-<span class="sourceLineNo">3557</span><a name="line.3557"></a>
-<span class="sourceLineNo">3558</span>  /**<a name="line.3558"></a>
-<span class="sourceLineNo">3559</span>   * Writes very wide records and scans for the latest every time.. Flushes and<a name="line.3559"></a>
-<span class="sourceLineNo">3560</span>   * compacts the region every now and then to keep things realistic.<a name="line.3560"></a>
-<span class="sourceLineNo">3561</span>   *<a name="line.3561"></a>
-<span class="sourceLineNo">3562</span>   * @throws IOException<a name="line.3562"></a>
-<span class="sourceLineNo">3563</span>   *           by flush / scan / compaction<a name="line.3563"></a>
-<span class="sourceLineNo">3564</span>   * @throws InterruptedException<a name="line.3564"></a>
-<span class="sourceLineNo">3565</span>   *           when joining threads<a name="line.3565"></a>
-<span class="sourceLineNo">3566</span>   */<a name="line.3566"></a>
-<span class="sourceLineNo">3567</span>  @Test<a name="line.3567"></a>
-<span class="sourceLineNo">3568</span>  public void testWritesWhileScanning() throws IOException, InterruptedException {<a name="line.3568"></a>
-<span class="sourceLineNo">3569</span>    int testCount = 100;<a name="line.3569"></a>
-<span class="sourceLineNo">3570</span>    int numRows = 1;<a name="line.3570"></a>
-<span class="sourceLineNo">3571</span>    int numFamilies = 10;<a name="line.3571"></a>
-<span class="sourceLineNo">3572</span>    int numQualifiers = 100;<a name="line.3572"></a>
-<span class="sourceLineNo">3573</span>    int flushInterval = 7;<a name="line.3573"></a>
-<span class="sourceLineNo">3574</span>    int compactInterval = 5 * flushInterval;<a name="line.3574"></a>
-<span class="sourceLineNo">3575</span>    byte[][] families = new byte[numFamilies][];<a name="line.3575"></a>
-<span class="sourceLineNo">3576</span>    for (int i = 0; i &lt; numFamilies; i++) {<a name="line.3576"></a>
-<span class="sourceLineNo">3577</span>      families[i] = Bytes.toBytes("family" + i);<a name="line.3577"></a>
-<span class="sourceLineNo">3578</span>    }<a name="line.3578"></a>
-<span class="sourceLineNo">3579</span>    byte[][] qualifiers = new byte[numQualifiers][];<a name="line.3579"></a>
-<span class="sourceLineNo">3580</span>    for (int i = 0; i &lt; numQualifiers; i++) {<a name="line.3580"></a>
-<span class="sourceLineNo">3581</span>      qualifiers[i] = Bytes.toBytes("qual" + i);<a name="line.3581"></a>
-<span class="sourceLineNo">3582</span>    }<a name="line.3582"></a>
-<span class="sourceLineNo">3583</span><a name="line.3583"></a>
-<span class="sourceLineNo">3584</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.3584"></a>
-<span class="sourceLineNo">3585</span>    FlushThread flushThread = new FlushThread();<a name="line.3585"></a>
-<span class="sourceLineNo">3586</span>    PutThread putThread = new PutThread(numRows, families, qualifiers);<a name="line.3586"></a>
-<span class="sourceLineNo">3587</span>    try {<a name="line.3587"></a>
-<span class="sourceLineNo">3588</span>      putThread.start();<a name="line.3588"></a>
-<span class="sourceLineNo">3589</span>      putThread.waitForFirstPut();<a name="line.3589"></a>
-<span class="sourceLineNo">3590</span><a name="line.3590"></a>
-<span class="sourceLineNo">3591</span>      flushThread.start();<a name="line.3591"></a>
-<span class="sourceLineNo">3592</span><a name="line.3592"></a>
-<span class="sourceLineNo">3593</span>      Scan scan = new Scan(Bytes.toBytes("row0"), Bytes.toBytes("row1"));<a name="line.3593"></a>
-<span class="sourceLineNo">3594</span><a name="line.3594"></a>
-<span class="sourceLineNo">3595</span>      int expectedCount = numFamilies * numQualifiers;<a name="line.3595"></a>
-<span class="sourceLineNo">3596</span>      List&lt;Cell&gt; res = new ArrayList&lt;&gt;();<a name="line.3596"></a>
-<span class="sourceLineNo">3597</span><a name="line.3597"></a>
-<span class="sourceLineNo">3598</span>      long prevTimestamp = 0L;<a name="line.3598"></a>
-<span class="sourceLineNo">3599</span>      for (int i = 0; i &lt; testCount; i++) {<a name="line.3599"></a>
+<span class="sourceLineNo">3463</span>      int expectedCount = 0;<a name="line.3463"></a>
+<span class="sourceLineNo">3464</span>      List&lt;Cell&gt; res = new ArrayList&lt;&gt;();<a name="line.3464"></a>
+<span class="sourceLineNo">3465</span><a name="line.3465"></a>
+<span class="sourceLineNo">3466</span>      boolean toggle = true;<a name="line.3466"></a>
+<span class="sourceLineNo">3467</span>      for (long i = 0; i &lt; numRows; i++) {<a name="line.3467"></a>
+<span class="sourceLineNo">3468</span>        Put put = new Put(Bytes.toBytes(i));<a name="line.3468"></a>
+<span class="sourceLineNo">3469</span>        put.setDurability(Durability.SKIP_WAL);<a name="line.3469"></a>
+<span class="sourceLineNo">3470</span>        put.addColumn(family, qual1, Bytes.toBytes(i % 10));<a name="line.3470"></a>
+<span class="sourceLineNo">3471</span>        region.put(put);<a name="line.3471"></a>
+<span class="sourceLineNo">3472</span><a name="line.3472"></a>
+<span class="sourceLineNo">3473</span>        if (i != 0 &amp;&amp; i % compactInterval == 0) {<a name="line.3473"></a>
+<span class="sourceLineNo">3474</span>          LOG.debug("iteration = " + i+ " ts="+System.currentTimeMillis());<a name="line.3474"></a>
+<span class="sourceLineNo">3475</span>          region.compact(true);<a name="line.3475"></a>
+<span class="sourceLineNo">3476</span>        }<a name="line.3476"></a>
+<span class="sourceLineNo">3477</span><a name="line.3477"></a>
+<span class="sourceLineNo">3478</span>        if (i % 10 == 5L) {<a name="line.3478"></a>
+<span class="sourceLineNo">3479</span>          expectedCount++;<a name="line.3479"></a>
+<span class="sourceLineNo">3480</span>        }<a name="line.3480"></a>
+<span class="sourceLineNo">3481</span><a name="line.3481"></a>
+<span class="sourceLineNo">3482</span>        if (i != 0 &amp;&amp; i % flushAndScanInterval == 0) {<a name="line.3482"></a>
+<span class="sourceLineNo">3483</span>          res.clear();<a name="line.3483"></a>
+<span class="sourceLineNo">3484</span>          InternalScanner scanner = region.getScanner(scan);<a name="line.3484"></a>
+<span class="sourceLineNo">3485</span>          if (toggle) {<a name="line.3485"></a>
+<span class="sourceLineNo">3486</span>            flushThread.flush();<a name="line.3486"></a>
+<span class="sourceLineNo">3487</span>          }<a name="line.3487"></a>
+<span class="sourceLineNo">3488</span>          while (scanner.next(res))<a name="line.3488"></a>
+<span class="sourceLineNo">3489</span>            ;<a name="line.3489"></a>
+<span class="sourceLineNo">3490</span>          if (!toggle) {<a name="line.3490"></a>
+<span class="sourceLineNo">3491</span>            flushThread.flush();<a name="line.3491"></a>
+<span class="sourceLineNo">3492</span>          }<a name="line.3492"></a>
+<span class="sourceLineNo">3493</span>          assertEquals("toggle="+toggle+"i=" + i + " ts="+System.currentTimeMillis(),<a name="line.3493"></a>
+<span class="sourceLineNo">3494</span>              expectedCount, res.size());<a name="line.3494"></a>
+<span class="sourceLineNo">3495</span>          toggle = !toggle;<a name="line.3495"></a>
+<span class="sourceLineNo">3496</span>        }<a name="line.3496"></a>
+<span class="sourceLineNo">3497</span>      }<a name="line.3497"></a>
+<span class="sourceLineNo">3498</span><a name="line.3498"></a>
+<span class="sourceLineNo">3499</span>    } finally {<a name="line.3499"></a>
+<span class="sourceLineNo">3500</span>      try {<a name="line.3500"></a>
+<span class="sourceLineNo">3501</span>        flushThread.done();<a name="line.3501"></a>
+<span class="sourceLineNo">3502</span>        flushThread.join();<a name="line.3502"></a>
+<span class="sourceLineNo">3503</span>        flushThread.checkNoError();<a name="line.3503"></a>
+<span class="sourceLineNo">3504</span>      } catch (InterruptedException ie) {<a name="line.3504"></a>
+<span class="sourceLineNo">3505</span>        LOG.warn("Caught exception when joining with flushThread", ie);<a name="line.3505"></a>
+<span class="sourceLineNo">3506</span>      }<a name="line.3506"></a>
+<span class="sourceLineNo">3507</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.3507"></a>
+<span class="sourceLineNo">3508</span>      this.region = null;<a name="line.3508"></a>
+<span class="sourceLineNo">3509</span>    }<a name="line.3509"></a>
+<span class="sourceLineNo">3510</span>  }<a name="line.3510"></a>
+<span class="sourceLineNo">3511</span><a name="line.3511"></a>
+<span class="sourceLineNo">3512</span>  protected class FlushThread extends Thread {<a name="line.3512"></a>
+<span class="sourceLineNo">3513</span>    private volatile boolean done;<a name="line.3513"></a>
+<span class="sourceLineNo">3514</span>    private Throwable error = null;<a name="line.3514"></a>
+<span class="sourceLineNo">3515</span><a name="line.3515"></a>
+<span class="sourceLineNo">3516</span>    FlushThread() {<a name="line.3516"></a>
+<span class="sourceLineNo">3517</span>      super("FlushThread");<a name="line.3517"></a>
+<span class="sourceLineNo">3518</span>    }<a name="line.3518"></a>
+<span class="sourceLineNo">3519</span><a name="line.3519"></a>
+<span class="sourceLineNo">3520</span>    public void done() {<a name="line.3520"></a>
+<span class="sourceLineNo">3521</span>      done = true;<a name="line.3521"></a>
+<span class="sourceLineNo">3522</span>      synchronized (this) {<a name="line.3522"></a>
+<span class="sourceLineNo">3523</span>        interrupt();<a name="line.3523"></a>
+<span class="sourceLineNo">3524</span>      }<a name="line.3524"></a>
+<span class="sourceLineNo">3525</span>    }<a name="line.3525"></a>
+<span class="sourceLineNo">3526</span><a name="line.3526"></a>
+<span class="sourceLineNo">3527</span>    public void checkNoError() {<a name="line.3527"></a>
+<span class="sourceLineNo">3528</span>      if (error != null) {<a name="line.3528"></a>
+<span class="sourceLineNo">3529</span>        assertNull(error);<a name="line.3529"></a>
+<span class="sourceLineNo">3530</span>      }<a name="line.3530"></a>
+<span class="sourceLineNo">3531</span>    }<a name="line.3531"></a>
+<span class="sourceLineNo">3532</span><a name="line.3532"></a>
+<span class="sourceLineNo">3533</span>    @Override<a name="line.3533"></a>
+<span class="sourceLineNo">3534</span>    public void run() {<a name="line.3534"></a>
+<span class="sourceLineNo">3535</span>      done = false;<a name="line.3535"></a>
+<span class="sourceLineNo">3536</span>      while (!done) {<a name="line.3536"></a>
+<span class="sourceLineNo">3537</span>        synchronized (this) {<a name="line.3537"></a>
+<span class="sourceLineNo">3538</span>          try {<a name="line.3538"></a>
+<span class="sourceLineNo">3539</span>            wait();<a name="line.3539"></a>
+<span class="sourceLineNo">3540</span>          } catch (InterruptedException ignored) {<a name="line.3540"></a>
+<span class="sourceLineNo">3541</span>            if (done) {<a name="line.3541"></a>
+<span class="sourceLineNo">3542</span>              break;<a name="line.3542"></a>
+<span class="sourceLineNo">3543</span>            }<a name="line.3543"></a>
+<span class="sourceLineNo">3544</span>          }<a name="line.3544"></a>
+<span class="sourceLineNo">3545</span>        }<a name="line.3545"></a>
+<span class="sourceLineNo">3546</span>        try {<a name="line.3546"></a>
+<span class="sourceLineNo">3547</span>          region.flush(true);<a name="line.3547"></a>
+<span class="sourceLineNo">3548</span>        } catch (IOException e) {<a name="line.3548"></a>
+<span class="sourceLineNo">3549</span>          if (!done) {<a name="line.3549"></a>
+<span class="sourceLineNo">3550</span>            LOG.error("Error while flushing cache", e);<a name="line.3550"></a>
+<span class="sourceLineNo">3551</span>            error = e;<a name="line.3551"></a>
+<span class="sourceLineNo">3552</span>          }<a name="line.3552"></a>
+<span class="sourceLineNo">3553</span>          break;<a name="line.3553"></a>
+<span class="sourceLineNo">3554</span>        } catch (Throwable t) {<a name="line.3554"></a>
+<span class="sourceLineNo">3555</span>          LOG.error("Uncaught exception", t);<a name="line.3555"></a>
+<span class="sourceLineNo">3556</span>          throw t;<a name="line.3556"></a>
+<span class="sourceLineNo">3557</span>        }<a name="line.3557"></a>
+<span class="sourceLineNo">3558</span>      }<a name="line.3558"></a>
+<span class="sourceLineNo">3559</span>    }<a name="line.3559"></a>
+<span class="sourceLineNo">3560</span><a name="line.3560"></a>
+<span class="sourceLineNo">3561</span>    public void flush() {<a name="line.3561"></a>
+<span class="sourceLineNo">3562</span>      synchronized (this) {<a name="line.3562"></a>
+<span class="sourceLineNo">3563</span>        notify();<a name="line.3563"></a>
+<span class="sourceLineNo">3564</span>      }<a name="line.3564"></a>
+<span class="sourceLineNo">3565</span>    }<a name="line.3565"></a>
+<span class="sourceLineNo">3566</span>  }<a name="line.3566"></a>
+<span class="sourceLineNo">3567</span><a name="line.3567"></a>
+<span class="sourceLineNo">3568</span>  /**<a name="line.3568"></a>
+<span class="sourceLineNo">3569</span>   * Writes very wide records and scans for the latest every time.. Flushes and<a name="line.3569"></a>
+<span class="sourceLineNo">3570</span>   * compacts the region every now and then to keep things realistic.<a name="line.3570"></a>
+<span class="sourceLineNo">3571</span>   *<a name="line.3571"></a>
+<span class="sourceLineNo">3572</span>   * @throws IOException<a name="line.3572"></a>
+<span class="sourceLineNo">3573</span>   *           by flush / scan / compaction<a name="line.3573"></a>
+<span class="sourceLineNo">3574</span>   * @throws InterruptedException<a name="line.3574"></a>
+<span class="sourceLineNo">3575</span>   *           when joining threads<a name="line.3575"></a>
+<span class="sourceLineNo">3576</span>   */<a name="line.3576"></a>
+<span class="sourceLineNo">3577</span>  @Test<a name="line.3577"></a>
+<span class="sourceLineNo">3578</span>  public void testWritesWhileScanning() throws IOException, InterruptedException {<a name="line.3578"></a>
+<span class="sourceLineNo">3579</span>    int testCount = 100;<a name="line.3579"></a>
+<span class="sourceLineNo">3580</span>    int numRows = 1;<a name="line.3580"></a>
+<span class="sourceLineNo">3581</span>    int numFamilies = 10;<a name="line.3581"></a>
+<span class="sourceLineNo">3582</span>    int numQualifiers = 100;<a name="line.3582"></a>
+<span class="sourceLineNo">3583</span>    int flushInterval = 7;<a name="line.3583"></a>
+<span class="sourceLineNo">3584</span>    int compactInterval = 5 * flushInterval;<a name="line.3584"></a>
+<span class="sourceLineNo">3585</span>    byte[][] families = new byte[numFamilies][];<a name="line.3585"></a>
+<span class="sourceLineNo">3586</span>    for (int i = 0; i &lt; numFamilies; i++) {<a name="line.3586"></a>
+<span class="sourceLineNo">3587</span>      families[i] = Bytes.toBytes("family" + i);<a name="line.3587"></a>
+<span class="sourceLineNo">3588</span>    }<a name="line.3588"></a>
+<span class="sourceLineNo">3589</span>    byte[][] qualifiers = new byte[numQualifiers][];<a name="line.3589"></a>
+<span class="sourceLineNo">3590</span>    for (int i = 0; i &lt; numQualifiers; i++) {<a name="line.3590"></a>
+<span class="sourceLineNo">3591</span>      qualifiers[i] = Bytes.toBytes("qual" + i);<a name="line.3591"></a>
+<span class="sourceLineNo">3592</span>    }<a name="line.3592"></a>
+<span class="sourceLineNo">3593</span><a name="line.3593"></a>
+<span class="sourceLineNo">3594</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.3594"></a>
+<span class="sourceLineNo">3595</span>    FlushThread flushThread = new FlushThread();<a name="line.3595"></a>
+<span class="sourceLineNo">3596</span>    PutThread putThread = new PutThread(numRows, families, qualifiers);<a name="line.3596"></a>
+<span class="sourceLineNo">3597</span>    try {<a name="line.3597"></a>
+<span class="sourceLineNo">3598</span>      putThread.start();<a name="line.3598"></a>
+<span class="sourceLineNo">3599</span>      putThread.waitForFirstPut();<a name="line.3599"></a>
 <span class="sourceLineNo">3600</span><a name="line.3600"></a>
-<span class="sourceLineNo">3601</span>        if (i != 0 &amp;&amp; i % compactInterval == 0) {<a name="line.3601"></a>
-<span class="sourceLineNo">3602</span>          region.compact(true);<a name="line.3602"></a>
-<span class="sourceLineNo">3603</span>          for (HStore store : region.getStores()) {<a name="line.3603"></a>
-<span class="sourceLineNo">3604</span>            store.closeAndArchiveCompactedFiles();<a name="line.3604"></a>
-<span class="sourceLineNo">3605</span>          }<a name="line.3605"></a>
-<span class="sourceLineNo">3606</span>        }<a name="line.3606"></a>
+<span class="sourceLineNo">3601</span>      flushThread.start();<a name="line.3601"></a>
+<span class="sourceLineNo">3602</span><a name="line.3602"></a>
+<span class="sourceLineNo">3603</span>      Scan scan = new Scan(Bytes.toBytes("row0"), Bytes.toBytes("row1"));<a name="line.3603"></a>
+<span class="sourceLineNo">3604</span><a name="line.3604"></a>
+<span class="sourceLineNo">3605</span>      int expectedCount = numFamilies * numQualifiers;<a name="line.3605"></a>
+<span class="sourceLineNo">3606</span>      List&lt;Cell&gt; res = new ArrayList&lt;&gt;();<a name="line.3606"></a>
 <span class="sourceLineNo">3607</span><a name="line.3607"></a>
-<span class="sourceLineNo">3608</span>        if (i != 0 &amp;&amp; i % flushInterval == 0) {<a name="line.3608"></a>
-<span class="sourceLineNo">3609</span>          flushThread.flush();<a name="line.3609"></a>
-<span class="sourceLineNo">3610</span>        }<a name="line.3610"></a>
-<span class="sourceLineNo">3611</span><a name="line.3611"></a>
-<span class="sourceLineNo">3612</span>        boolean previousEmpty = res.isEmpty();<a name="line.3612"></a>
-<span class="sourceLineNo">3613</span>        res.clear();<a name="line.3613"></a>
-<span class="sourceLineNo">3614</span>        try (InternalScanner scanner = region.getScanner(scan)) {<a name="line.3614"></a>
-<span class="sourceLineNo">3615</span>          boolean moreRows;<a name="line.3615"></a>
-<span class="sourceLineNo">3616</span>          do {<a name="line.3616"></a>
-<span class="sourceLineNo">3617</span>            moreRows = scanner.next(res);<a name="line.3617"></a>
-<span class="sourceLineNo">3618</span>          } while (moreRows);<a name="line.3618"></a>
-<span class="sourceLineNo">3619</span>        }<a name="line.3619"></a>
-<span class="sourceLineNo">3620</span>        if (!res.isEmpty() || !previousEmpty || i &gt; compactInterval) {<a name="line.3620"></a>
-<span class="sourceLineNo">3621</span>          assertEquals("i=" + i, expectedCount, res.size());<a name="line.3621"></a>
-<span class="sourceLineNo">3622</span>          long timestamp = res.get(0).getTimestamp();<a name="line.3622"></a>
-<span class="sourceLineNo">3623</span>          assertTrue("Timestamps were broke: " + timestamp + " prev: " + prevTimestamp,<a name="line.3623"></a>
-<span class="sourceLineNo">3624</span>              timestamp &gt;= prevTimestamp);<a name="line.3624"></a>
-<span class="sourceLineNo">3625</span>          prevTimestamp = timestamp;<a name="line.3625"></a>
-<span class="sourceLineNo">3626</span>        }<a name="line.3626"></a>
-<span class="sourceLineNo">3627</span>      }<a name="line.3627"></a>
-<span class="sourceLineNo">3628</span><a name="line.3628"></a>
-<span class="sourceLineNo">3629</span>      putThread.done();<a name="line.3629"></a>
-<span class="sourceLineNo">3630</span><a name="line.3630"></a>
-<span class="sourceLineNo">3631</span>      region.flush(true);<a name="line.3631"></a>
-<span class="sourceLineNo">3632</span><a name="line.3632"></a>
-<span class="sourceLineNo">3633</span>    } finally {<a name="line.3633"></a>
-<span class="sourceLineNo">3634</span>      try {<a name="line.3634"></a>
-<span class="sourceLineNo">3635</span>        flushThread.done();<a name="line.3635"></a>
-<span class="sourceLineNo">3636</span>        flushThread.join();<a name="line.3636"></a>
-<span class="sourceLineNo">3637</span>        flushThread.checkNoError();<a name="line.3637"></a>
+<span class="sourceLineNo">3608</span>      long prevTimestamp = 0L;<a name="line.3608"></a>
+<span class="sourceLineNo">3609</span>      for (int i = 0; i &lt; testCount; i++) {<a name="line.3609"></a>
+<span class="sourceLineNo">3610</span><a name="line.3610"></a>
+<span class="sourceLineNo">3611</span>        if (i != 0 &amp;&amp; i % compactInterval == 0) {<a name="line.3611"></a>
+<span class="sourceLineNo">3612</span>          region.compact(true);<a name="line.3612"></a>
+<span class="sourceLineNo">3613</span>          for (HStore store : region.getStores()) {<a name="line.3613"></a>
+<span class="sourceLineNo">3614</span>            store.closeAndArchiveCompactedFiles();<a name="line.3614"></a>
+<span class="sourceLineNo">3615</span>          }<a name="line.3615"></a>
+<span class="sourceLineNo">3616</span>        }<a name="line.3616"></a>
+<span class="sourceLineNo">3617</span><a name="line.3617"></a>
+<span class="sourceLineNo">3618</span>        if (i != 0 &amp;&amp; i % flushInterval == 0) {<a name="line.3618"></a>
+<span class="sourceLineNo">3619</span>          flushThread.flush();<a name="line.3619"></a>
+<span class="sourceLineNo">3620</span>        }<a name="line.3620"></a>
+<span class="sourceLineNo">3621</span><a name="line.3621"></a>
+<span class="sourceLineNo">3622</span>        boolean previousEmpty = res.isEmpty();<a name="line.3622"></a>
+<span class="sourceLineNo">3623</span>        res.clear();<a name="line.3623"></a>
+<span class="sourceLineNo">3624</span>        try (InternalScanner scanner = region.getScanner(scan)) {<a name="line.3624"></a>
+<span class="sourceLineNo">3625</span>          boolean moreRows;<a name="line.3625"></a>
+<span class="sourceLineNo">3626</span>          do {<a name="line.3626"></a>
+<span class="sourceLineNo">3627</span>            moreRows = scanner.next(res);<a name="line.3627"></a>
+<span class="sourceLineNo">3628</span>          } while (moreRows);<a name="line.3628"></a>
+<span class="sourceLineNo">3629</span>        }<a name="line.3629"></a>
+<span class="sourceLineNo">3630</span>        if (!res.isEmpty() || !previousEmpty || i &gt; compactInterval) {<a name="line.3630"></a>
+<span class="sourceLineNo">3631</span>          assertEquals("i=" + i, expectedCount, res.size());<a name="line.3631"></a>
+<span class="sourceLineNo">3632</span>          long timestamp = res.get(0).getTimestamp();<a name="line.3632"></a>
+<span class="sourceLineNo">3633</span>          assertTrue("Timestamps were broke: " + timestamp + " prev: " + prevTimestamp,<a name="line.3633"></a>
+<span class="sourceLineNo">3634</span>              timestamp &gt;= prevTimestamp);<a name="line.3634"></a>
+<span class="sourceLineNo">3635</span>          prevTimestamp = timestamp;<a name="line.3635"></a>
+<span class="sourceLineNo">3636</span>        }<a name="line.3636"></a>
+<span class="sourceLineNo">3637</span>      }<a name="line.3637"></a>
 <span class="sourceLineNo">3638</span><a name="line.3638"></a>
-<span class="sourceLineNo">3639</span>        putThread.join();<a name="line.3639"></a>
-<span class="sourceLineNo">3640</span>        putThread.checkNoError();<a name="line.3640"></a>
-<span class="sourceLineNo">3641</span>      } catch (InterruptedException ie) {<a name="line.3641"></a>
-<span class="sourceLineNo">3642</span>        LOG.warn("Caught exception when joining with flushThread", ie);<a name="line.3642"></a>
-<span class="sourceLineNo">3643</span>      }<a name="line.3643"></a>
-<span class="sourceLineNo">3644</span><a name="line.3644"></a>
-<span class="sourceLineNo">3645</span>      try {<a name="line.3645"></a>
-<span class="sourceLineNo">3646</span>          HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.3646"></a>
-<span class="sourceLineNo">3647</span>      } catch (DroppedSnapshotException dse) {<a name="line.3647"></a>
-<span class="sourceLineNo">3648</span>        // We could get this on way out because we interrupt the background flusher and it could<a name="line.3648"></a>
-<span class="sourceLineNo">3649</span>        // fail anywhere causing a DSE over in the background flusher... only it is not properly<a name="line.3649"></a>
-<span class="sourceLineNo">3650</span>        // dealt with so could still be memory hanging out when we get to here -- memory we can't<a name="line.3650"></a>
-<span class="sourceLineNo">3651</span>        // flush because the accounting is 'off' since original DSE.<a name="line.3651"></a>
-<span class="sourceLineNo">3652</span>      }<a name="line.3652"></a>
-<span class="sourceLineNo">3653</span>      this.region = null;<a name="line.3653"></a>
-<span class="sourceLineNo">3654</span>    }<a name="line.3654"></a>
-<span class="sourceLineNo">3655</span>  }<a name="line.3655"></a>
-<span class="sourceLineNo">3656</span><a name="line.3656"></a>
-<span class="sourceLineNo">3657</span>  protected class PutThread extends Thread {<a name="line.3657"></a>
-<span class="sourceLineNo">3658</span>    private volatile boolean done;<a name="line.3658"></a>
-<span class="sourceLineNo">3659</span>    private volatile int numPutsFinished = 0;<a name="line.3659"></a>
-<span class="sourceLineNo">3660</span><a name="line.3660"></a>
-<span class="sourceLineNo">3661</span>    private Throwable error = null;<a name="line.3661"></a>
-<span class="sourceLineNo">3662</span>    private int numRows;<a name="line.3662"></a>
-<span class="sourceLineNo">3663</span>    private byte[][] families;<a name="line.3663"></a>
-<span class="sourceLineNo">3664</span>    private byte[][] qualifiers;<a name="line.3664"></a>
-<span class="sourceLineNo">3665</span><a name="line.3665"></a>
-<span class="sourceLineNo">3666</span>    private PutThread(int numRows, byte[][] families, byte[][] qualifiers) {<a name="line.3666"></a>
-<span class="sourceLineNo">3667</span>      super("PutThread");<a name="line.3667"></a>
-<span class="sourceLineNo">3668</span>      this.numRows = numRows;<a name="line.3668"></a>
-<span class="sourceLineNo">3669</span>      this.families = families;<a name="line.3669"></a>
-<span class="sourceLineNo">3670</span>      this.qualifiers = qualifiers;<a name="line.3670"></a>
-<span class="sourceLineNo">3671</span>    }<a name="line.3671"></a>
-<span class="sourceLineNo">3672</span><a name="line.3672"></a>
-<span class="sourceLineNo">3673</span>    /**<a name="line.3673"></a>
-<span class="sourceLineNo">3674</span>     * Block calling thread until this instance of PutThread has put at least one row.<a name="line.3674"></a>
-<span class="sourceLineNo">3675</span>     */<a name="line.3675"></a>
-<span class="sourceLineNo">3676</span>    public void waitForFirstPut() throws InterruptedException {<a name="line.3676"></a>
-<span class="sourceLineNo">3677</span>      // wait until put thread actually puts some data<a name="line.3677"></a>
-<span class="sourceLineNo">3678</span>      while (isAlive() &amp;&amp; numPutsFinished == 0) {<a name="line.3678"></a>
-<span class="sourceLineNo">3679</span>        checkNoError();<a name="line.3679"></a>
-<span class="sourceLineNo">3680</span>        Thread.sleep(50);<a name="line.3680"></a>
-<span class="sourceLineNo">3681</span>      }<a name="line.3681"></a>
-<span class="sourceLineNo">3682</span>    }<a name="line.3682"></a>
-<span class="sourceLineNo">3683</span><a name="line.3683"></a>
-<span class="sourceLineNo">3684</span>    public void done() {<a name="line.3684"></a>
-<span class="sourceLineNo">3685</span>      done = true;<a name="line.3685"></a>
-<span class="sourceLineNo">3686</span>      synchronized (this) {<a name="line.3686"></a>
-<span class="sourceLineNo">3687</span>        interrupt();<a name="line.3687"></a>
-<span class="sourceLineNo">3688</span>      }<a name="line.3688"></a>
-<span class="sourceLineNo">3689</span>    }<a name="line.3689"></a>
-<span class="sourceLineNo">3690</span><a name="line.3690"></a>
-<span class="sourceLineNo">3691</span>    public void checkNoError() {<a name="line.3691"></a>
-<span class="sourceLineNo">3692</span>      if (error != null) {<a name="line.3692"></a>
-<span class="sourceLineNo">3693</span>        assertNull(error);<a name="line.3693"></a>
-<span class="sourceLineNo">3694</span>      }<a name="line.3694"></a>
-<span class="sourceLineNo">3695</span>    }<a name="line.3695"></a>
-<span class="sourceLineNo">3696</span><a name="line.3696"></a>
-<span class="sourceLineNo">3697</span>    @Override<a name="line.3697"></a>
-<span class="sourceLineNo">3698</span>    public void run() {<a name="line.3698"></a>
-<span class="sourceLineNo">3699</span>      done = false;<a name="line.3699"></a>
-<span class="sourceLineNo">3700</span>      while (!done) {<a name="line.3700"></a>
-<span class="sourceLineNo">3701</span>        try {<a name="line.3701"></a>
-<span class="sourceLineNo">3702</span>          for (int r = 0; r &lt; numRows; r++) {<a name="line.3702"></a>
-<span class="sourceLineNo">3703</span>            byte[] row = Bytes.toBytes("row" + r);<a name="line.3703"></a>
-<span class="sourceLineNo">3704</span>            Put put = new Put(row);<a name="line.3704"></a>
-<span class="sourceLineNo">3705</span>            put.setDurability(Durability.SKIP_WAL);<a name="line.3705"></a>
-<span class="sourceLineNo">3706</span>            byte[] value = Bytes.toBytes(String.valueOf(numPutsFinished));<a name="line.3706"></a>
-<span class="sourceLineNo">3707</span>            for (byte[] family : families) {<a name="line.3707"></a>
-<span class="sourceLineNo">3708</span>              for (byte[] qualifier : qualifiers) {<a name="line.3708"></a>
-<span class="sourceLineNo">3709</span>                put.addColumn(family, qualifier, numPutsFinished, value);<a name="line.3709"></a>
-<span class="sourceLineNo">3710</span>              }<a name="line.3710"></a>
-<span class="sourceLineNo">3711</span>            }<a name="line.3711"></a>
-<span class="sourceLineNo">3712</span>            region.put(put);<a name="line.3712"></a>
-<span class="sourceLineNo">3713</span>            numPutsFinished++;<a name="line.3713"></a>
-<span class="sourceLineNo">3714</span>            if (numPutsFinished &gt; 0 &amp;&amp; numPutsFinished % 47 == 0) {<a name="line.3714"></a>
-<span class="sourceLineNo">3715</span>              LOG.debug("put iteration = {}", numPutsFinished);<a name="line.3715"></a>
-<span class="sourceLineNo">3716</span>              Delete delete = new Delete(row, (long) numPutsFinished - 30);<a name="line.3716"></a>
-<span class="sourceLineNo">3717</span>              region.delete(delete);<a name="line.3717"></a>
-<span class="sourceLineNo">3718</span>            }<a name="line.3718"></a>
-<span class="sourceLineNo">3719</span>            numPutsFinished++;<a name="line.3719"></a>
-<span class="sourceLineNo">3720</span>          }<a name="line.3720"></a>
-<span class="sourceLineNo">3721</span>        } catch (InterruptedIOException e) {<a name="line.3721"></a>
-<span class="sourceLineNo">3722</span>          // This is fine. It means we are done, or didn't get the lock on time<a name="line.3722"></a>
-<span class="sourceLineNo">3723</span>          LOG.info("Interrupted", e);<a name="line.3723"></a>
-<span class="sourceLineNo">3724</span>        } catch (IOException e) {<a name="line.3724"></a>
-<span class="sourceLineNo">3725</span>          LOG.error("Error while putting records", e);<a name="line.3725"></a>
-<span class="sourceLineNo">3726</span>          error = e;<a name="line.3726"></a>
-<span class="sourceLineNo">3727</span>          break;<a name="line.3727"></a>
-<span class="sourceLineNo">3728</span>        }<a name="line.3728"></a>
-<span class="sourceLineNo">3729</span>      }<a name="line.3729"></a>
-<span class="sourceLineNo">3730</span><a name="line.3730"></a>
-<span class="sourceLineNo">3731</span>    }<a name="line.3731"></a>
-<span class="sourceLineNo">3732</span><a name="line.3732"></a>
-<span class="sourceLineNo">3733</span>  }<a name="line.3733"></a>
-<span class="sourceLineNo">3734</span><a name="line.3734"></a>
-<span class="sourceLineNo">3735</span>  /**<a name="line.3735"></a>
-<span class="sourceLineNo">3736</span>   * Writes very wide records and gets the latest row every time.. Flushes and<a name="line.3736"></a>
-<span class="sourceLineNo">3737</span>   * compacts the region aggressivly to catch issues.<a name="line.3737"></a>
-<span class="sourceLineNo">3738</span>   *<a name="line.3738"></a>
-<span class="sourceLineNo">3739</span>   * @throws IOException<a name="line.3739"></a>
-<span class="sourceLineNo">3740</span>   *           by flush / scan / compaction<a name="line.3740"></a>
-<span class="sourceLineNo">3741</span>   * @throws InterruptedException<a name="line.3741"></a>
-<span class="sourceLineNo">3742</span>   *           when joining threads<a name="line.3742"></a>
-<span class="sourceLineNo">3743</span>   */<a name="line.3743"></a>
-<span class="sourceLineNo">3744</span>  @Test<a name="line.3744"></a>
-<span class="sourceLineNo">3745</span>  public void testWritesWhileGetting() throws Exception {<a name="line.3745"></a>
-<span class="sourceLineNo">3746</span>    int testCount = 50;<a name="line.3746"></a>
-<span class="sourceLineNo">3747</span>    int numRows = 1;<a name="line.3747"></a>
-<span class="sourceLineNo">3748</span>    int numFamilies = 10;<a name="line.3748"></a>
-<span class="sourceLineNo">3749</span>    int numQualifiers = 100;<a name="line.3749"></a>
-<span class="sourceLineNo">3750</span>    int compactInterval = 100;<a name="line.3750"></a>
-<span class="sourceLineNo">3751</span>    byte[][] families = new byte[numFamilies][];<a name="line.3751"></a>
-<span class="sourceLineNo">3752</span>    for (int i = 0; i &lt; numFamilies; i++) {<a name="line.3752"></a>
-<span class="sourceLineNo">3753</span>      families[i] = Bytes.toBytes("family" + i);<a name="line.3753"></a>
-<span class="sourceLineNo">3754</span>    }<a name="line.3754"></a>
-<span class="sourceLineNo">3755</span>    byte[][] qualifiers = new byte[numQualifiers][];<a name="line.3755"></a>
-<span class="sourceLineNo">3756</span>    for (int i = 0; i &lt; numQualifiers; i++) {<a name="line.3756"></a>
-<span class="sourceLineNo">3757</span>      qualifiers[i] = Bytes.toBytes("qual" + i);<a name="line.3757"></a>
-<span class="sourceLineNo">3758</span>    }<a name="line.3758"></a>
-<span class="sourceLineNo">3759</span><a name="line.3759"></a>
-<span class="sourceLineNo">3760</span><a name="line.3760"></a>
-<span class="sourceLineNo">3761</span>    // This test flushes constantly and can cause many files to be created,<a name="line.3761"></a>
-<span class="sourceLineNo">3762</span>    // possibly<a name="line.3762"></a>
-<span class="sourceLineNo">3763</span>    // extending over the ulimit. Make sure compactions are aggressive in<a name="line.3763"></a>
-<span class="sourceLineNo">3764</span>    // reducing<a name="line.3764"></a>
-<span class="sourceLineNo">3765</span>    // the number of HFiles created.<a name="line.3765"></a>
-<span class="sourceLineNo">3766</span>    Configuration conf = HBaseConfiguration.create(CONF);<a name="line.3766"></a>
-<span class="sourceLineNo">3767</span>    conf.setInt("hbase.hstore.compaction.min", 1);<a name="line.3767"></a>
-<span class="sourceLineNo">3768</span>    conf.setInt("hbase.hstore.compaction.max", 1000);<a name="line.3768"></a>
-<span class="sourceLineNo">3769</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.3769"></a>
-<span class="sourceLineNo">3770</span>    PutThread putThread = null;<a name="line.3770"></a>
-<span class="sourceLineNo">3771</span>    MultithreadedTestUtil.TestContext ctx = new MultithreadedTestUtil.TestContext(conf);<a name="line.3771"></a>
-<span class="sourceLineNo">3772</span>    try {<a name="line.3772"></a>
-<span class="sourceLineNo">3773</span>      putThread = new PutThread(numRows, families, qualifiers);<a name="line.3773"></a>
-<span class="sourceLineNo">3774</span>      putThread.start();<a name="line.3774"></a>
-<span class="sourceLineNo">3775</span>      putThread.waitForFirstPut();<a name="line.3775"></a>
-<span class="sourceLineNo">3776</span><a name="line.3776"></a>
-<span class="sourceLineNo">3777</span>      // Add a thread that flushes as fast as possible<a name="line.3777"></a>
-<span class="sourceLineNo">3778</span>      ctx.addThread(new RepeatingTestThread(ctx) {<a name="line.3778"></a>
-<span class="sourceLineNo">3779</span><a name="line.3779"></a>
-<span class="sourceLineNo">3780</span>        @Override<a name="line.3780"></a>
-<span class="sourceLineNo">3781</span>        public void doAnAction() throws Exception {<a name="line.3781"></a>
-<span class="sourceLineNo">3782</span>          region.flush(true);<a name="line.3782"></a>
-<span class="sourceLineNo">3783</span>          // Compact regularly to avoid creating too many files and exceeding<a name="line.3783"></a>
-<span class="sourceLineNo">3784</span>          // the ulimit.<a name="line.3784"></a>
-<span class="sourceLineNo">3785</span>          region.compact(false);<a name="line.3785"></a>
-<span class="sourceLineNo">3786</span>          for (HStore store : region.getStores()) {<a name="line.3786"></a>
-<span class="sourceLineNo">3787</span>            store.closeAndArchiveCompactedFiles();<a name="line.3787"></a>
-<span class="sourceLineNo">3788</span>          }<a name="line.3788"></a>
-<span class="sourceLineNo">3789</span>        }<a name="line.3789"></a>
-<span class="sourceLineNo">3790</span>      });<a name="line.3790"></a>
-<span class="sourceLineNo">3791</span>      ctx.startThreads();<a name="line.3791"></a>
-<span class="sourceLineNo">3792</span><a name="line.3792"></a>
-<span class="sourceLineNo">3793</span>      Get get = new Get(Bytes.toBytes("row0"));<a name="line.3793"></a>
-<span class="sourceLineNo">3794</span>      Result result = null;<a name="line.3794"></a>
-<span class="sourceLineNo">3795</span><a name="line.3795"></a>
-<span class="sourceLineNo">3796</span>      int expectedCount = numFamilies * numQualifiers;<a name="line.3796"></a>
-<span class="sourceLineNo">3797</span><a name="line.3797"></a>
-<span class="sourceLineNo">3798</span>      long prevTimestamp = 0L;<a name="line.3798"></a>
-<span class="sourceLineNo">3799</span>      for (int i = 0; i &lt; testCount; i++) {<a name="line.3799"></a>
-<span class="sourceLineNo">3800</span>        LOG.info("testWritesWhileGetting verify turn " + i);<a name="line.3800"></a>
-<span class="sourceLineNo">3801</span>        boolean previousEmpty = result == null || result.isEmpty();<a name="line.3801"></a>
-<span class="sourceLineNo">3802</span>        result = region.get(get);<a name="line.3802"></a>
-<span class="sourceLineNo">3803</span>        if (!result.isEmpty() || !previousEmpty || i &gt; compactInterval) {<a name="line.3803"></a>
-<span class="sourceLineNo">3804</span>          assertEquals("i=" + i, expectedCount, result.size());<a name="line.3804"></a>
-<span class="sourceLineNo">3805</span>          // TODO this was removed, now what dangit?!<a name="line.3805"></a>
-<span class="sourceLineNo">3806</span>          // search looking for the qualifier in question?<a name="line.3806"></a>
-<span class="sourceLineNo">3807</span>          long timestamp = 0;<a name="line.3807"></a>
-<span class="sourceLineNo">3808</span>          for (Cell kv : result.rawCells()) {<a name="line.3808"></a>
-<span class="sourceLineNo">3809</span>            if (CellUtil.matchingFamily(kv, families[0])<a name="line.3809"></a>
-<span class="sourceLineNo">3810</span>                &amp;&amp; CellUtil.matchingQualifier(kv, qualifiers[0])) {<a name="line.3810"></a>
-<span class="sourceLineNo">3811</span>              timestamp = kv.getTimestamp();<a name="line.3811"></a>
-<span class="sourceLineNo">3812</span>            }<a name="line.3812"></a>
-<span class="sourceLineNo">3813</span>          }<a name="line.3813"></a>
-<span class="sourceLineNo">3814</span>          assertTrue(timestamp &gt;= prevTimestamp);<a name="line.3814"></a>
-<span class="sourceLineNo">3815</span>          prevTimestamp = timestamp;<a name="line.3815"></a>
-<span class="sourceLineNo">3816</span>          Cell previousKV = null;<a name="line.3816"></a>
-<span class="sourceLineNo">3817</span><a name="line.3817"></a>
+<span class="sourceLineNo">3639</span>      putThread.done();<a name="line.3639"></a>
+<span class="sourceLineNo">3640</span><a name="line.3640"></a>
+<span class="sourceLineNo">3641</span>      region.flush(true);<a name="line.3641"></a>
+<span class="sourceLineNo">3642</span><a name="line.3642"></a>
+<span class="sourceLineNo">3643</span>    } finally {<a name="line.3643"></a>
+<span class="sourceLineNo">3644</span>      try {<a name="line.3644"></a>
+<span class="sourceLineNo">3645</span>        flushThread.done();<a name="line.3645"></a>
+<span class="sourceLineNo">3646</span>        flushThread.join();<a name="line.3646"></a>
+<span class="sourceLineNo">3647</span>        flushThread.checkNoError();<a name="line.3647"></a>
+<span class="sourceLineNo">3648</span><a name="line.3648"></a>
+<span class="sourceLineNo">3649</span>        putThread.join();<a name="line.3649"></a>
+<span class="sourceLineNo">3650</span>        putThread.checkNoError();<a name="line.3650"></a>
+<span class="sourceLineNo">3651</span>      } catch (InterruptedException ie) {<a name="line.3651"></a>
+<span class="sourceLineNo">3652</span>        LOG.warn("Caught exception when joining with flushThread", ie);<a name="line.3652"></a>
+<span class="sourceLineNo">3653</span>      }<a name="line.3653"></a>
+<span class="sourceLineNo">3654</span><a name="line.3654"></a>
+<span class="sourceLineNo">3655</span>      try {<a name="line.3655"></a>
+<span class="sourceLineNo">3656</span>          HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.3656"></a>
+<span class="sourceLineNo">3657</span>      } catch (DroppedSnapshotException dse) {<a name="line.3657"></a>
+<span class="sourceLineNo">3658</span>        // We could get this on way out because we interrupt the background flusher and it could<a name="line.3658"></a>
+<span class="sourceLineNo">3659</span>        // fail anywhere causing a DSE over in the background flusher... only it is not properly<a name="line.3659"></a>
+<span class="sourceLineNo">3660</span>        // dealt with so could still be memory hanging out when we get to here -- memory we can't<a name="line.3660"></a>
+<span class="sourceLineNo">3661</span>        // flush because the accounting is 'off' since original DSE.<a name="line.3661"></a>
+<span class="sourceLineNo">3662</span>      }<a name="line.3662"></a>
+<span class="sourceLineNo">3663</span>      this.region = null;<a name="line.3663"></a>
+<span class="sourceLineNo">3664</span>    }<a name="line.3664"></a>
+<span class="sourceLineNo">3665</span>  }<a name="line.3665"></a>
+<span class="sourceLineNo">3666</span><a name="line.3666"></a>
+<span class="sourceLineNo">3667</span>  protected class PutThread extends Thread {<a name="line.3667"></a>
+<span class="sourceLineNo">3668</span>    private volatile boolean done;<a name="line.3668"></a>
+<span class="sourceLineNo">3669</span>    private volatile int numPutsFinished = 0;<a name="line.3669"></a>
+<span class="sourceLineNo">3670</span><a name="line.3670"></a>
+<span class="sourceLineNo">3671</span>    private Throwable error = null;<a name="line.3671"></a>
+<span class="sourceLineNo">3672</span>    private int numRows;<a name="line.3672"></a>
+<span class="sourceLineNo">3673</span>    private byte[][] families;<a name="line.3673"></a>
+<span class="sourceLineNo">3674</span>    private byte[][] qualifiers;<a name="line.3674"></a>
+<span class="sourceLineNo">3675</span><a name="line.3675"></a>
+<span class="sourceLineNo">3676</span>    private PutThread(int numRows, byte[][] families, byte[][] qualifiers) {<a name="line.3676"></a>
+<span class="sourceLineNo">3677</span>      super("PutThread");<a name="line.3677"></a>
+<span class="sourceLineNo">3678</span>      this.numRows = numRows;<a name="line.3678"></a>
+<span class="sourceLineNo">3679</span>      this.families = families;<a name="line.3679"></a>
+<span class="sourceLineNo">3680</span>      this.qualifiers = qualifiers;<a name="line.3680"></a>
+<span class="sourceLineNo">3681</span>    }<a name="line.3681"></a>
+<span class="sourceLineNo">3682</span><a name="line.3682"></a>
+<span class="sourceLineNo">3683</span>    /**<a name="line.3683"></a>
+<span class="sourceLineNo">3684</span>     * Block calling thread until this instance of PutThread has put at least one row.<a name="line.3684"></a>
+<span class="sourceLineNo">3685</span>     */<a name="line.3685"></a>
+<span class="sourceLineNo">3686</span>    public void waitForFirstPut() throws InterruptedException {<a name="line.3686"></a>
+<span class="sourceLineNo">3687</span>      // wait until put thread actually puts some data<a name="line.3687"></a>
+<span class="sourceLineNo">3688</span>      while (isAlive() &amp;&amp; numPutsFinished == 0) {<a name="line.3688"></a>
+<span class="sourceLineNo">3689</span>        checkNoError();<a name="line.3689"></a>
+<span class="sourceLineNo">3690</span>        Thread.sleep(50);<a name="line.3690"></a>
+<span class="sourceLineNo">3691</span>      }<a name="line.3691"></a>
+<span class="sourceLineNo">3692</span>    }<a name="line.3692"></a>
+<span class="sourceLineNo">3693</span><a name="line.3693"></a>
+<span class="sourceLineNo">3694</span>    public void done() {<a name="line.3694"></a>
+<span class="sourceLineNo">3695</span>      done = true;<a name="line.3695"></a>
+<span class="sourceLineNo">3696</span>      synchronized (this) {<a name="line.3696"></a>
+<span class="sourceLineNo">3697</span>        interrupt();<a name="line.3697"></a>
+<span class="sourceLineNo">3698</span>      }<a name="line.3698"></a>
+<span class="sourceLineNo">3699</span>    }<a name="line.3699"></a>
+<span class="sourceLineNo">3700</span><a name="line.3700"></a>
+<span class="sourceLineNo">3701</span>    public void checkNoError() {<a name="line.3701"></a>
+<span class="sourceLineNo">3702</span>      if (error != null) {<a name="line.3702"></a>
+<span class="sourceLineNo">3703</span>        assertNull(error);<a name="line.3703"></a>
+<span class="sourceLineNo">3704</span>      }<a name="line.3704"></a>
+<span class="sourceLineNo">3705</span>    }<a name="line.3705"></a>
+<span class="sourceLineNo">3706</span><a name="line.3706"></a>
+<span class="sourceLineNo">3707</span>    @Override<a name="line.3707"></a>
+<span class="sourceLineNo">3708</span>    public void run() {<a name="line.3708"></a>
+<span class="sourceLineNo">3709</span>      done = false;<a name="line.3709"></a>
+<span class="sourceLineNo">3710</span>      while (!done) {<a name="line.3710"></a>
+<span class="sourceLineNo">3711</span>        try {<a name="line.3711"></a>
+<span class="sourceLineNo">3712</span>          for (int r = 0; r &lt; numRows; r++) {<a name="line.3712"></a>
+<span class="sourceLineNo">3713</span>            byte[] row = Bytes.toBytes("row" + r);<a name="line.3713"></a>
+<span class="sourceLineNo">3714</span>            Put put = new Put(row);<a name="line.3714"></a>
+<span class="sourceLineNo">3715</span>            put.setDurability(Durability.SKIP_WAL);<a name="line.3715"></a>
+<span class="sourceLineNo">3716</span>            byte[] value = Bytes.toBytes(String.valueOf(numPutsFinished));<a name="line.3716"></a>
+<span class="sourceLineNo">3717</span>            for (byte[] family : families) {<a name="line.3717"></a>
+<span class="sourceLineNo">3718</span>              for (byte[] qualifier : qualifiers) {<a name="line.3718"></a>
+<span class="sourceLineNo">3719</span>                put.addColumn(family, qualifier, numPutsFinished, value);<a name="line.3719"></a>
+<span class="sourceLineNo">3720</span>              }<a name="line.3720"></a>
+<span class="sourceLineNo">3721</span>            }<a name="line.3721"></a>
+<span class="sourceLineNo">3722</span>            region.put(put);<a name="line.3722"></a>
+<span class="sourceLineNo">3723</span>            numPutsFinished++;<a name="line.3723"></a>
+<span class="sourceLineNo">3724</span>            if (numPutsFinished &gt; 0 &amp;&amp; numPutsFinished % 47 == 0) {<a name="line.3724"></a>
+<span class="sourceLineNo">3725</span>              LOG.debug("put iteration = {}", numPutsFinished);<a name="line.3725"></a>
+<span class="sourceLineNo">3726</span>              Delete delete = new Delete(row, (long) numPutsFinished - 30);<a name="line.3726"></a>
+<span class="sourceLineNo">3727</span>              region.delete(delete);<a name="line.3727"></a>
+<span class="sourceLineNo">3728</span>            }<a name="line.3728"></a>
+<span class="sourceLineNo">3729</span>            numPutsFinished++;<a name="line.3729"></a>
+<span class="sourceLineNo">3730</span>          }<a name="line.3730"></a>
+<span class="sourceLineNo">3731</span>        } catch (InterruptedIOException e) {<a name="line.3731"></a>
+<span class="sourceLineNo">3732</span>          // This is fine. It means we are done, or didn't get the lock on time<a name="line.3732"></a>
+<span class="sourceLineNo">3733</span>          LOG.info("Interrupted", e);<a name="line.3733"></a>
+<span class="sourceLineNo">3734</span>        } catch (IOException e) {<a name="line.3734"></a>
+<span class="sourceLineNo">3735</span>          LOG.error("Error while putting records", e);<a name="line.3735"></a>
+<span class="sourceLineNo">3736</span>          error = e;<a name="line.3736"></a>
+<span class="sourceLineNo">3737</span>          break;<a name="line.3737"></a>
+<span class="sourceLineNo">3738</span>        }<a name="line.3738"></a>
+<span class="sourceLineNo">3739</span>      }<a name="line.3739"></a>
+<span class="sourceLineNo">3740</span><a name="line.3740"></a>
+<span class="sourceLineNo">3741</span>    }<a name="line.3741"></a>
+<span class="sourceLineNo">3742</span><a name="line.3742"></a>
+<span class="sourceLineNo">3743</span>  }<a name="line.3743"></a>
+<span class="sourceLineNo">3744</span><a name="line.3744"></a>
+<span class="sourceLineNo">3745</span>  /**<a name="line.3745"></a>
+<span class="sourceLineNo">3746</span>   * Writes very wide records and gets the latest row every time.. Flushes and<a name="line.3746"></a>
+<span class="sourceLineNo">3747</span>   * compacts the region aggressivly to catch issues.<a name="line.3747"></a>
+<span class="sourceLineNo">3748</span>   *<a name="line.3748"></a>
+<span class="sourceLineNo">3749</span>   * @throws IOException<a name="line.3749"></a>
+<span class="sourceLineNo">3750</span>   *           by flush / scan / compaction<a name="line.3750"></a>
+<span class="sourceLineNo">3751</span>   * @throws InterruptedException<a name="line.3751"></a>
+<span class="sourceLineNo">3752</span>   *           when joining threads<a name="line.3752"></a>
+<span class="sourceLineNo">3753</span>   */<a name="line.3753"></a>
+<span class="sourceLineNo">3754</span>  @Test<a name="line.3754"></a>
+<span class="sourceLineNo">3755</span>  public void testWritesWhileGetting() throws Exception {<a name="line.3755"></a>
+<span class="sourceLineNo">3756</span>    int testCount = 50;<a name="line.3756"></a>
+<span class="sourceLineNo">3757</span>    int numRows = 1;<a name="line.3757"></a>
+<span class="sourceLineNo">3758</span>    int numFamilies = 10;<a name="line.3758"></a>
+<span class="sourceLineNo">3759</span>    int numQualifiers = 100;<a name="line.3759"></a>
+<span class="sourceLineNo">3760</span>    int compactInterval = 100;<a name="line.3760"></a>
+<span class="sourceLineNo">3761</span>    byte[][] families = new byte[numFamilies][];<a name="line.3761"></a>
+<span class="sourceLineNo">3762</span>    for (int i = 0; i &lt; numFamilies; i++) {<a name="line.3762"></a>
+<span class="sourceLineNo">3763</span>      families[i] = Bytes.toBytes("family" + i);<a name="line.3763"></a>
+<span class="sourceLineNo">3764</span>    }<a name="line.3764"></a>
+<span class="sourceLineNo">3765</span>    byte[][] qualifiers = new byte[numQualifiers][];<a name="line.3765"></a>
+<span class="sourceLineNo">3766</span>    for (int i = 0; i &lt; numQualifiers; i++) {<a name="line.3766"></a>
+<span class="sourceLineNo">3767</span>      qualifiers[i] = Bytes.toBytes("qual" + i);<a name="line.3767"></a>
+<span class="sourceLineNo">3768</span>    }<a name="line.3768"></a>
+<span class="sourceLineNo">3769</span><a name="line.3769"></a>
+<span class="sourceLineNo">3770</span><a name="line.3770"></a>
+<span class="sourceLineNo">3771</span>    // This test flushes constantly and can cause many files to be created,<a name="line.3771"></a>
+<span class="sourceLineNo">3772</span>    // possibly<a name="line.3772"></a>
+<span class="sourceLineNo">3773</span>    // extending over the ulimit. Make sure compactions are aggressive in<a name="line.3773"></a>
+<span class="sourceLineNo">3774</span>    // reducing<a name="line.3774"></a>
+<span class="sourceLineNo">3775</span>    // the number of HFiles created.<a name="line.3775"></a>
+<span class="sourceLineNo">3776</span>    Configuration conf = HBaseConfiguration.create(CONF);<a name="line.3776"></a>
+<span class="sourceLineNo">3777</span>    conf.setInt("hbase.hstore.compaction.min", 1);<a name="line.3777"></a>
+<span class="sourceLineNo">3778</span>    conf.setInt("hbase.hstore.compaction.max", 1000);<a name="line.3778"></a>
+<span class="sourceLineNo">3779</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.3779"></a>
+<span class="sourceLineNo">3780</span>    PutThread putThread = null;<a name="line.3780"></a>
+<span class="sourceLineNo">3781</span>    MultithreadedTestUtil.TestContext ctx = new MultithreadedTestUtil.TestContext(conf);<a name="line.3781"></a>
+<span class="sourceLineNo">3782</span>    try {<a name="line.3782"></a>
+<span class="sourceLineNo">3783</span>      putThread = new PutThread(numRows, families, qualifiers);<a name="line.3783"></a>
+<span class="sourceLineNo">3784</span>      putThread.start();<a name="line.3784"></a>
+<span class="sourceLineNo">3785</span>      putThread.waitForFirstPut();<a name="line.3785"></a>
+<span class="sourceLineNo">3786</span><a name="line.3786"></a>
+<span class="sourceLineNo">3787</span>      // Add a thread that flushes as fast as possible<a name="line.3787"></a>
+<span class="sourceLineNo">3788</span>      ctx.addThread(new RepeatingTestThread(ctx) {<a name="line.3788"></a>
+<span class="sourceLineNo">3789</span><a name="line.3789"></a>
+<span class="sourceLineNo">3790</span>        @Override<a name="line.3790"></a>
+<span class="sourceLineNo">3791</span>        public void doAnAction() throws Exception {<a name="line.3791"></a>
+<span class="sourceLineNo">3792</span>          region.flush(true);<a name="line.3792"></a>
+<span class="sourceLineNo">3793</span>          // Compact regularly to avoid creating too many files and exceeding<a name="line.3793"></a>
+<span class="sourceLineNo">3794</span>          // the ulimit.<a name="line.3794"></a>
+<span class="sourceLineNo">3795</span>          region.compact(false);<a name="line.3795"></a>
+<span class="sourceLineNo">3796</span>          for (HStore store : region.getStores()) {<a name="line.3796"></a>
+<span class="sourceLineNo">3797</span>            store.closeAndArchiveCompactedFiles();<a name="line.3797"></a>
+<span class="sourceLineNo">3798</span>          }<a name="line.3798"></a>
+<span class="sourceLineNo">3799</span>        }<a name="line.3799"></a>
+<span class="sourceLineNo">3800</span>      });<a name="line.3800"></a>
+<span class="sourceLineNo">3801</span>      ctx.startThreads();<a name="line.3801"></a>
+<span class="sourceLineNo">3802</span><a name="line.3802"></a>
+<span class="sourceLineNo">3803</span>      Get get = new Get(Bytes.toBytes("row0"));<a name="line.3803"></a>
+<span class="sourceLineNo">3804</span>      Result result = null;<a name="line.3804"></a>
+<span class="sourceLineNo">3805</span><a name="line.3805"></a>
+<span class="sourceLineNo">3806</span>      int expectedCount = numFamilies * numQualifiers;<a name="line.3806"></a>
+<span class="sourceLineNo">3807</span><a name="line.3807"></a>
+<span class="sourceLineNo">3808</span>      long prevTimestamp = 0L;<a name="line.3808"></a>
+<span class="sourceLineNo">3809</span>      for (int i = 0; i &lt; testCount; i++) {<a name="line.3809"></a>
+<span class="sourceLineNo">3810</span>        LOG.info("testWritesWhileGetting verify turn " + i);<a name="line.3810"></a>
+<span class="sourceLineNo">3811</span>        boolean previousEmpty = result == null || result.isEmpty();<a name="line.3811"></a>
+<span class="sourceLineNo">3812</span>        result = region.get(get);<a name="line.3812"></a>
+<span class="sourceLineNo">3813</span>        if (!result.isEmpty() || !previousEmpty || i &gt; compactInterval) {<a name="line.3813"></a>
+<span class="sourceLineNo">3814</span>          assertEquals("i=" + i, expectedCount, result.size());<a name="line.3814"></a>
+<span class="sourceLineNo">3815</span>          // TODO this was removed, now what dangit?!<a name="line.3815"></a>
+<span class="sourceLineNo">3816</span>          // search looking for the qualifier in question?<a name="line.3816"></a>
+<span class="sourceLineNo">3817</span>          long timestamp = 0;<a name="line.3817"></a>
 <span class="sourceLineNo">3818</span>          for (Cell kv : result.rawCells()) {<a name="line.3818"></a>
-<span class="sourceLineNo">3819</span>            byte[] thisValue = CellUtil.cloneValue(kv);<a name="line.3819"></a>
-<span class="sourceLineNo">3820</span>            if (previousKV != null) {<a name="line.3820"></a>
-<span class="sourceLineNo">3821</span>              if (Bytes.compareTo(CellUtil.cloneValue(previousKV), thisValue) != 0) {<a name="line.3821"></a>
-<span class="sourceLineNo">3822</span>                LOG.warn("These two KV should have the same value." + " Previous KV:" + previousKV<a name="line.3822"></a>
-<span class="sourceLineNo">3823</span>                    + "(memStoreTS:" + previousKV.getSequenceId() + ")" + ", New KV: " + kv<a name="line.3823"></a>
-<span class="sourceLineNo">3824</span>                    + "(memStoreTS:" + kv.getSequenceId() + ")");<a name="line.3824"></a>
-<span class="sourceLineNo">3825</span>                assertEquals(0, Bytes.compareTo(CellUtil.cloneValue(previousKV), thisValue));<a name="line.3825"></a>
-<span class="sourceLineNo">3826</span>              }<a name="line.3826"></a>
-<span class="sourceLineNo">3827</span>            }<a name="line.3827"></a>
-<span class="sourceLineNo">3828</span>            previousKV = kv;<a name="line.3828"></a>
-<span class="sourceLineNo">3829</span>          }<a name="line.3829"></a>
-<span class="sourceLineNo">3830</span>        }<a name="line.3830"></a>
-<span class="sourceLineNo">3831</span>      }<a name="line.3831"></a>
-<span class="sourceLineNo">3832</span>    } finally {<a name="line.3832"></a>
-<span class="sourceLineNo">3833</span>      if (putThread != null)<a name="line.3833"></a>
-<span class="sourceLineNo">3834</span>        putThread.done();<a name="line.3834"></a>
-<span class="sourceLineNo">3835</span><a name="line.3835"></a>
-<span class="sourceLineNo">3836</span>      region.flush(true);<a name="line.3836"></a>
-<span class="sourceLineNo">3837</span><a name="line.3837"></a>
-<span class="sourceLineNo">3838</span>      if (putThread != null) {<a name="line.3838"></a>
-<span class="sourceLineNo">3839</span>        putThread.join();<a name="line.3839"></a>
-<span class="sourceLineNo">3840</span>        putThread.checkNoError();<a name="line.3840"></a>
+<span class="sourceLineNo">3819</span>            if (CellUtil.matchingFamily(kv, families[0])<a name="line.3819"></a>
+<span class="sourceLineNo">3820</span>                &amp;&amp; CellUtil.matchingQualifier(kv, qualifiers[0])) {<a name="line.3820"></a>
+<span class="sourceLineNo">3821</span>              timestamp = kv.getTimestamp();<a name="line.3821"></a>
+<span class="sourceLineNo">3822</span>            }<a name="line.3822"></a>
+<span class="sourceLineNo">3823</span>          }<a name="line.3823"></a>
+<span class="sourceLineNo">3824</span>          assertTrue(timestamp &gt;= prevTimestamp);<a name="line.3824"></a>
+<span class="sourceLineNo">3825</span>          prevTimestamp = timestamp;<a name="line.3825"></a>
+<span class="sourceLineNo">3826</span>          Cell previousKV = null;<a name="line.3826"></a>
+<span class="sourceLineNo">3827</span><a name="line.3827"></a>
+<span class="sourceLineNo">3828</span>          for (Cell kv : result.rawCells()) {<a name="line.3828"></a>
+<span class="sourceLineNo">3829</span>            byte[] thisValue = CellUtil.cloneValue(kv);<a name="line.3829"></a>
+<span class="sourceLineNo">3830</span>            if (previousKV != null) {<a name="line.3830"></a>
+<span class="sourceLineNo">3831</span>              if (Bytes.compareTo(CellUtil.cloneValue(previousKV), thisValue) != 0) {<a name="line.3831"></a>
+<span class="sourceLineNo">3832</span>                LOG.warn("These two KV should have the same value." + " Previous KV:" + previousKV<a name="line.3832"></a>
+<span class="sourceLineNo">3833</span>                    + "(memStoreTS:" + previousKV.getSequenceId() + ")" + ", New KV: " + kv<a name="line.3833"></a>
+<span class="sourceLineNo">3834</span>                    + "(memStoreTS:" + kv.getSequenceId() + ")");<a name="line.3834"></a>
+<span class="sourceLineNo">3835</span>                assertEquals(0, Bytes.compareTo(CellUtil.cloneValue(previousKV), thisValue));<a name="line.3835"></a>
+<span class="sourceLineNo">3836</span>              }<a name="line.3836"></a>
+<span class="sourceLineNo">3837</span>            }<a name="line.3837"></a>
+<span class="sourceLineNo">3838</span>            previousKV = kv;<a name="line.3838"></a>
+<span class="sourceLineNo">3839</span>          }<a name="line.3839"></a>
+<span class="sourceLineNo">3840</span>        }<a name="line.3840"></a>
 <span class="sourceLineNo">3841</span>      }<a name="line.3841"></a>
-<span class="sourceLineNo">3842</span><a name="line.3842"></a>
-<span class="sourceLineNo">3843</span>      ctx.stop();<a name="line.3843"></a>
-<span class="sourceLineNo">3844</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.3844"></a>
-<span class="sourceLineNo">3845</span>      this.region = null;<a name="line.3845"></a>
-<span class="sourceLineNo">3846</span>    }<a name="line.3846"></a>
-<span class="sourceLineNo">3847</span>  }<a name="line.3847"></a>
-<span class="sourceLineNo">3848</span><a name="line.3848"></a>
-<span class="sourceLineNo">3849</span>  @Test<a name="line.3849"></a>
-<span class="sourceLineNo">3850</span>  public void testHolesInMeta() throws Exception {<a name="line.3850"></a>
-<span class="sourceLineNo">3851</span>    byte[] family = Bytes.toBytes("family");<a name="line.3851"></a>
-<span class="sourceLineNo">3852</span>    this.region = initHRegion(tableName, Bytes.toBytes("x"), Bytes.toBytes("z"), method, CONF,<a name="line.3852"></a>
-<span class="sourceLineNo">3853</span>        false, family);<a name="line.3853"></a>
-<span class="sourceLineNo">3854</span>    byte[] rowNotServed = Bytes.toBytes("a");<a name="line.3854"></a>
-<span class="sourceLineNo">3855</span>    Get g = new Get(rowNotServed);<a name="line.3855"></a>
-<span class="sourceLineNo">3856</span>    try {<a name="line.3856"></a>
-<span class="sourceLineNo">3857</span>      region.get(g);<a name="line.3857"></a>
-<span class="sourceLineNo">3858</span>      fail();<a name="line.3858"></a>
-<span class="sourceLineNo">3859</span>    } catch (WrongRegionException x) {<a name="line.3859"></a>
-<span class="sourceLineNo">3860</span>      // OK<a name="line.3860"></a>
-<span class="sourceLineNo">3861</span>    }<a name="line.3861"></a>
-<span class="sourceLineNo">3862</span>    byte[] row = Bytes.toBytes("y");<a name="line.3862"></a>
-<span class="sourceLineNo">3863</span>    g = new Get(row);<a name="line.3863"></a>
-<span class="sourceLineNo">3864</span>    region.get(g);<a name="line.3864"></a>
-<span class="sourceLineNo">3865</span>  }<a name="line.3865"></a>
-<span class="sourceLineNo">3866</span><a name="line.3866"></a>
-<span class="sourceLineNo">3867</span>  @Test<a name="line.3867"></a>
-<span class="sourceLineNo">3868</span>  public void testIndexesScanWithOneDeletedRow() throws IOException {<a name="line.3868"></a>
-<span class="sourceLineNo">3869</span>    byte[] family = Bytes.toBytes("family");<a name="line.3869"></a>
-<span class="sourceLineNo">3870</span><a name="line.3870"></a>
-<span class="sourceLineNo">3871</span>    // Setting up region<a name="line.3871"></a>
-<span class="sourceLineNo">3872</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.3872"></a>
-<span class="sourceLineNo">3873</span>    Put put = new Put(Bytes.toBytes(1L));<a name="line.3873"></a>
-<span class="sourceLineNo">3874</span>    put.addColumn(family, qual1, 1L, Bytes.toBytes(1L));<a name="line.3874"></a>
-<span class="sourceLineNo">3875</span>    region.put(put);<a name="line.3875"></a>
+<span class="sourceLineNo">3842</span>    } finally {<a name="line.3842"></a>
+<span class="sourceLineNo">3843</span>      if (putThread != null)<a name="line.3843"></a>
+<span class="sourceLineNo">3844</span>        putThread.done();<a name="line.3844"></a>
+<span class="sourceLineNo">3845</span><a name="line.3845"></a>
+<span class="sourceLineNo">3846</span>      region.flush(true);<a name="line.3846"></a>
+<span class="sourceLineNo">3847</span><a name="line.3847"></a>
+<span class="sourceLineNo">3848</span>      if (putThread != null) {<a name="line.3848"></a>
+<span class="sourceLineNo">3849</span>        putThread.join();<a name="line.3849"></a>
+<span class="sourceLineNo">3850</span>        putThread.checkNoError();<a name="line.3850"></a>
+<span class="sourceLineNo">3851</span>      }<a name="line.3851"></a>
+<span class="sourceLineNo">3852</span><a name="line.3852"></a>
+<span class="sourceLineNo">3853</span>      ctx.stop();<a name="line.3853"></a>
+<span class="sourceLineNo">3854</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.3854"></a>
+<span class="sourceLineNo">3855</span>      this.region = null;<a name="line.3855"></a>
+<span class="sourceLineNo">3856</span>    }<a name="line.3856"></a>
+<span class="sourceLineNo">3857</span>  }<a name="line.3857"></a>
+<span class="sourceLineNo">3858</span><a name="line.3858"></a>
+<span class="sourceLineNo">3859</span>  @Test<a name="line.3859"></a>
+<span class="sourceLineNo">3860</span>  public void testHolesInMeta() throws Exception {<a name="line.3860"></a>
+<span class="sourceLineNo">3861</span>    byte[] family = Bytes.toBytes("family");<a name="line.3861"></a>
+<span class="sourceLineNo">3862</span>    this.region = initHRegion(tableName, Bytes.toBytes("x"), Bytes.toBytes("z"), method, CONF,<a name="line.3862"></a>
+<span class="sourceLineNo">3863</span>        false, family);<a name="line.3863"></a>
+<span class="sourceLineNo">3864</span>    byte[] rowNotServed = Bytes.toBytes("a");<a name="line.3864"></a>
+<span class="sourceLineNo">3865</span>    Get g = new Get(rowNotServed);<a name="line.3865"></a>
+<span class="sourceLineNo">3866</span>    try {<a name="line.3866"></a>
+<span class="sourceLineNo">3867</span>      region.get(g);<a name="line.3867"></a>
+<span class="sourceLineNo">3868</span>      fail();<a name="line.3868"></a>
+<span class="sourceLineNo">3869</span>    } catch (WrongRegionException x) {<a name="line.3869"></a>
+<span class="sourceLineNo">3870</span>      // OK<a name="line.3870"></a>
+<span class="sourceLineNo">3871</span>    }<a name="line.3871"></a>
+<span class="sourceLineNo">3872</span>    byte[] row = Bytes.toBytes("y");<a name="line.3872"></a>
+<span class="sourceLineNo">3873</span>    g = new Get(row);<a name="line.3873"></a>
+<span class="sourceLineNo">3874</span>    region.get(g);<a name="line.3874"></a>
+<span class="sourceLineNo">3875</span>  }<a name="line.3875"></a>
 <span class="sourceLineNo">3876</span><a name="line.3876"></a>
-<span class="sourceLineNo">3877</span>    region.flush(true);<a name="line.3877"></a>
-<span class="sourceLineNo">3878</span><a name="line.3878"></a>
-<span class="sourceLineNo">3879</span>    Delete delete = new Delete(Bytes.toBytes(1L), 1L);<a name="line.3879"></a>
-<span class="sourceLineNo">3880</span>    region.delete(delete);<a name="line.3880"></a>
-<span class="sourceLineNo">3881</span><a name="line.3881"></a>
-<span class="sourceLineNo">3882</span>    put = new Put(Bytes.toBytes(2L));<a name="line.3882"></a>
-<span class="sourceLineNo">3883</span>    put.addColumn(family, qual1, 2L, Bytes.toBytes(2L));<a name="line.3883"></a>
-<span class="sourceLineNo">3884</span>    region.put(put);<a name="line.3884"></a>
-<span class="sourceLineNo">3885</span><a name="line.3885"></a>
-<span class="sourceLineNo">3886</span>    Scan idxScan = new Scan();<a name="line.3886"></a>
-<span class="sourceLineNo">3887</span>    idxScan.addFamily(family);<a name="line.3887"></a>
-<span class="sourceLineNo">3888</span>    idxScan.setFilter(new FilterList(FilterList.Operator.MUST_PASS_ALL, Arrays.&lt;Filter&gt; asList(<a name="line.3888"></a>
-<span class="sourceLineNo">3889</span>        new SingleColumnValueFilter(family, qual1, CompareOperator.GREATER_OR_EQUAL,<a name="line.3889"></a>
-<span class="sourceLineNo">3890</span>            new BinaryComparator(Bytes.toBytes(0L))), new SingleColumnValueFilter(family, qual1,<a name="line.3890"></a>
-<span class="sourceLineNo">3891</span>                    CompareOperator.LESS_OR_EQUAL, new BinaryComparator(Bytes.toBytes(3L))))));<a name="line.3891"></a>
-<span class="sourceLineNo">3892</span>    InternalScanner scanner = region.getScanner(idxScan);<a name="line.3892"></a>
-<span class="sourceLineNo">3893</span>    List&lt;Cell&gt; res = new ArrayList&lt;&gt;();<a name="line.3893"></a>
-<span class="sourceLineNo">3894</span><a name="line.3894"></a>
-<span class="sourceLineNo">3895</span>    while (scanner.next(res)) {<a name="line.3895"></a>
-<span class="sourceLineNo">3896</span>      // Ignore res value.<a name="line.3896"></a>
-<span class="sourceLineNo">3897</span>    }<a name="line.3897"></a>
-<span class="sourceLineNo">3898</span>    assertEquals(1L, res.size());<a name="line.3898"></a>
-<span class="sourceLineNo">3899</span>  }<a name="line.3899"></a>
-<span class="sourceLineNo">3900</span><a name="line.3900"></a>
-<span class="sourceLineNo">3901</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.3901"></a>
-<span class="sourceLineNo">3902</span>  // Bloom filter test<a name="line.3902"></a>
-<span class="sourceLineNo">3903</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.3903"></a>
-<span class="sourceLineNo">3904</span>  @Test<a name="line.3904"></a>
-<span class="sourceLineNo">3905</span>  public void testBloomFilterSize() throws IOException {<a name="line.3905"></a>
-<span class="sourceLineNo">3906</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.3906"></a>
-<span class="sourceLineNo">3907</span>    byte[] qf1 = Bytes.toBytes("col");<a name="line.3907"></a>
-<span class="sourceLineNo">3908</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.3908"></a>
-<span class="sourceLineNo">3909</span>    // Create Table<a name="line.3909"></a>
-<span class="sourceLineNo">3910</span>    HColumnDescriptor hcd = new HColumnDescriptor(fam1).setMaxVersions(Integer.MAX_VALUE)<a name="line.3910"></a>
-<span class="sourceLineNo">3911</span>        .setBloomFilterType(BloomType.ROWCOL);<a name="line.3911"></a>
-<span class="sourceLineNo">3912</span><a name="line.3912"></a>
-<span class="sourceLineNo">3913</span>    HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.3913"></a>
-<span class="sourceLineNo">3914</span>    htd.addFamily(hcd);<a name="line.3914"></a>
-<span class="sourceLineNo">3915</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.3915"></a>
-<span class="sourceLineNo">3916</span>    this.region = TEST_UTIL.createLocalHRegion(info, htd);<a name="line.3916"></a>
-<span class="sourceLineNo">3917</span>    int num_unique_rows = 10;<a name="line.3917"></a>
-<span class="sourceLineNo">3918</span>    int duplicate_multiplier = 2;<a name="line.3918"></a>
-<span class="sourceLineNo">3919</span>    int num_storefiles = 4;<a name="line.3919"></a>
-<span class="sourceLineNo">3920</span><a name="line.3920"></a>
-<span class="sourceLineNo">3921</span>    int version = 0;<a name="line.3921"></a>
-<span class="sourceLineNo">3922</span>    for (int f = 0; f &lt; num_storefiles; f++) {<a name="line.3922"></a>
-<span class="sourceLineNo">3923</span>      for (int i = 0; i &lt; duplicate_multiplier; i++) {<a name="line.3923"></a>
-<span class="sourceLineNo">3924</span>        for (int j = 0; j &lt; num_unique_rows; j++) {<a name="line.3924"></a>
-<span class="sourceLineNo">3925</span>          Put put = new Put(Bytes.toBytes("row" + j));<a name="line.3925"></a>
-<span class="sourceLineNo">3926</span>          put.setDurability(Durability.SKIP_WAL);<a name="line.3926"></a>
-<span class="sourceLineNo">3927</span>          long ts = version++;<a name="line.3927"></a>
-<span class="sourceLineNo">3928</span>          put.addColumn(fam1, qf1, ts, val1);<a name="line.3928"></a>
-<span class="sourceLineNo">3929</span>          region.put(put);<a name="line.3929"></a>
-<span class="sourceLineNo">3930</span>        }<a name="line.3930"></a>
-<span class="sourceLineNo">3931</span>      }<a name="line.3931"></a>
-<span class="sourceLineNo">3932</span>      region.flush(true);<a name="line.3932"></a>
-<span class="sourceLineNo">3933</span>    }<a name="line.3933"></a>
-<span class="sourceLineNo">3934</span>    // before compaction<a name="line.3934"></a>
-<span class="sourceLineNo">3935</span>    HStore store = region.getStore(fam1);<a name="line.3935"></a>
-<span class="sourceLineNo">3936</span>    Collection&lt;HStoreFile&gt; storeFiles = store.getStorefiles();<a name="line.3936"></a>
-<span class="sourceLineNo">3937</span>    for (HStoreFile storefile : storeFiles) {<a name="line.3937"></a>
-<span class="sourceLineNo">3938</span>      StoreFileReader reader = storefile.getReader();<a name="line.3938"></a>
-<span class="sourceLineNo">3939</span>      reader.loadFileInfo();<a name="line.3939"></a>
-<span class="sourceLineNo">3940</span>      reader.loadBloomfilter();<a name="line.3940"></a>
-<span class="sourceLineNo">3941</span>      assertEquals(num_unique_rows * duplicate_multiplier, reader.getEntries());<a name="line.3941"></a>
-<span class="sourceLineNo">3942</span>      assertEquals(num_unique_rows, reader.getFilterEntries());<a name="line.3942"></a>
+<span class="sourceLineNo">3877</span>  @Test<a name="line.3877"></a>
+<span class="sourceLineNo">3878</span>  public void testIndexesScanWithOneDeletedRow() throws IOException {<a name="line.3878"></a>
+<span class="sourceLineNo">3879</span>    byte[] family = Bytes.toBytes("family");<a name="line.3879"></a>
+<span class="sourceLineNo">3880</span><a name="line.3880"></a>
+<span class="sourceLineNo">3881</span>    // Setting up region<a name="line.3881"></a>
+<span class="sourceLineNo">3882</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.3882"></a>
+<span class="sourceLineNo">3883</span>    Put put = new Put(Bytes.toBytes(1L));<a name="line.3883"></a>
+<span class="sourceLineNo">3884</span>    put.addColumn(family, qual1, 1L, Bytes.toBytes(1L));<a name="line.3884"></a>
+<span class="sourceLineNo">3885</span>    region.put(put);<a name="line.3885"></a>
+<span class="sourceLineNo">3886</span><a name="line.3886"></a>
+<span class="sourceLineNo">3887</span>    region.flush(true);<a name="line.3887"></a>
+<span class="sourceLineNo">3888</span><a name="line.3888"></a>
+<span class="sourceLineNo">3889</span>    Delete delete = new Delete(Bytes.toBytes(1L), 1L);<a name="line.3889"></a>
+<span class="sourceLineNo">3890</span>    region.delete(delete);<a name="line.3890"></a>
+<span class="sourceLineNo">3891</span><a name="line.3891"></a>
+<span class="sourceLineNo">3892</span>    put = new Put(Bytes.toBytes(2L));<a name="line.3892"></a>
+<span class="sourceLineNo">3893</span>    put.addColumn(family, qual1, 2L, Bytes.toBytes(2L));<a name="line.3893"></a>
+<span class="sourceLineNo">3894</span>    region.put(put);<a name="line.3894"></a>
+<span class="sourceLineNo">3895</span><a name="line.3895"></a>
+<span class="sourceLineNo">3896</span>    Scan idxScan = new Scan();<a name="line.3896"></a>
+<span class="sourceLineNo">3897</span>    idxScan.addFamily(family);<a name="line.3897"></a>
+<span class="sourceLineNo">3898</span>    idxScan.setFilter(new FilterList(FilterList.Operator.MUST_PASS_ALL, Arrays.&lt;Filter&gt; asList(<a name="line.3898"></a>
+<span class="sourceLineNo">3899</span>        new SingleColumnValueFilter(family, qual1, CompareOperator.GREATER_OR_EQUAL,<a name="line.3899"></a>
+<span class="sourceLineNo">3900</span>            new BinaryComparator(Bytes.toBytes(0L))), new SingleColumnValueFilter(family, qual1,<a name="line.3900"></a>
+<span class="sourceLineNo">3901</span>                    CompareOperator.LESS_OR_EQUAL, new BinaryComparator(Bytes.toBytes(3L))))));<a name="line.3901"></a>
+<span class="sourceLineNo">3902</span>    InternalScanner scanner = region.getScanner(idxScan);<a name="line.3902"></a>
+<span class="sourceLineNo">3903</span>    List&lt;Cell&gt; res = new ArrayList&lt;&gt;();<a name="line.3903"></a>
+<span class="sourceLineNo">3904</span><a name="line.3904"></a>
+<span class="sourceLineNo">3905</span>    while (scanner.next(res)) {<a name="line.3905"></a>
+<span class="sourceLineNo">3906</span>      // Ignore res value.<a name="line.3906"></a>
+<span class="sourceLineNo">3907</span>    }<a name="line.3907"></a>
+<span class="sourceLineNo">3908</span>    assertEquals(1L, res.size());<a name="line.3908"></a>
+<span class="sourceLineNo">3909</span>  }<a name="line.3909"></a>
+<span class="sourceLineNo">3910</span><a name="line.3910"></a>
+<span class="sourceLineNo">3911</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.3911"></a>
+<span class="sourceLineNo">3912</span>  // Bloom filter test<a name="line.3912"></a>
+<span class="sourceLineNo">3913</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.3913"></a>
+<span class="sourceLineNo">3914</span>  @Test<a name="line.3914"></a>
+<span class="sourceLineNo">3915</span>  public void testBloomFilterSize() throws IOException {<a name="line.3915"></a>
+<span class="sourceLineNo">3916</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.3916"></a>
+<span class="sourceLineNo">3917</span>    byte[] qf1 = Bytes.toBytes("col");<a name="line.3917"></a>
+<span class="sourceLineNo">3918</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.3918"></a>
+<span class="sourceLineNo">3919</span>    // Create Table<a name="line.3919"></a>
+<span class="sourceLineNo">3920</span>    HColumnDescriptor hcd = new HColumnDescriptor(fam1).setMaxVersions(Integer.MAX_VALUE)<a name="line.3920"></a>
+<span class="sourceLineNo">3921</span>        .setBloomFilterType(BloomType.ROWCOL);<a name="line.3921"></a>
+<span class="sourceLineNo">3922</span><a name="line.3922"></a>
+<span class="sourceLineNo">3923</span>    HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.3923"></a>
+<span class="sourceLineNo">3924</span>    htd.addFamily(hcd);<a name="line.3924"></a>
+<span class="sourceLineNo">3925</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.3925"></a>
+<span class="sourceLineNo">3926</span>    this.region = TEST_UTIL.createLocalHRegion(info, htd);<a name="line.3926"></a>
+<span class="sourceLineNo">3927</span>    int num_unique_rows = 10;<a name="line.3927"></a>
+<span class="sourceLineNo">3928</span>    int duplicate_multiplier = 2;<a name="line.3928"></a>
+<span class="sourceLineNo">3929</span>    int num_storefiles = 4;<a name="line.3929"></a>
+<span class="sourceLineNo">3930</span><a name="line.3930"></a>
+<span class="sourceLineNo">3931</span>    int version = 0;<a name="line.3931"></a>
+<span class="sourceLineNo">3932</span>    for (int f = 0; f &lt; num_storefiles; f++) {<a name="line.3932"></a>
+<span class="sourceLineNo">3933</span>      for (int i = 0; i &lt; duplicate_multiplier; i++) {<a name="line.3933"></a>
+<span class="sourceLineNo">3934</span>        for (int j = 0; j &lt; num_unique_rows; j++) {<a name="line.3934"></a>
+<span class="sourceLineNo">3935</span>          Put put = new Put(Bytes.toBytes("row" + j));<a name="line.3935"></a>
+<span class="sourceLineNo">3936</span>          put.setDurability(Durability.SKIP_WAL);<a name="line.3936"></a>
+<span class="sourceLineNo">3937</span>          long ts = version++;<a name="line.3937"></a>
+<span class="sourceLineNo">3938</span>          put.addColumn(fam1, qf1, ts, val1);<a name="line.3938"></a>
+<span class="sourceLineNo">3939</span>          region.put(put);<a name="line.3939"></a>
+<span class="sourceLineNo">3940</span>        }<a name="line.3940"></a>
+<span class="sourceLineNo">3941</span>      }<a name="line.3941"></a>
+<span class="sourceLineNo">3942</span>      region.flush(true);<a name="line.3942"></a>
 <span class="sourceLineNo">3943</span>    }<a name="line.3943"></a>
-<span class="sourceLineNo">3944</span><a name="line.3944"></a>
-<span class="sourceLineNo">3945</span>    region.compact(true);<a name="line.3945"></a>
-<span class="sourceLineNo">3946</span><a name="line.3946"></a>
-<span class="sourceLineNo">3947</span>    // after compaction<a name="line.3947"></a>
-<span class="sourceLineNo">3948</span>    storeFiles = store.getStorefiles();<a name="line.3948"></a>
-<span class="sourceLineNo">3949</span>    for (HStoreFile storefile : storeFiles) {<a name="line.3949"></a>
-<span class="sourceLineNo">3950</span>      StoreFileReader reader = storefile.getReader();<a name="line.3950"></a>
-<span class="sourceLineNo">3951</span>      reader.loadFileInfo();<a name="line.3951"></a>
-<span class="sourceLineNo">3952</span>      reader.loadBloomfilter();<a name="line.3952"></a>
-<span class="sourceLineNo">3953</span>      assertEquals(num_unique_rows * duplicate_multiplier * num_storefiles, reader.getEntries());<a name="line.3953"></a>
-<span class="sourceLineNo">3954</span>      assertEquals(num_unique_rows, reader.getFilterEntries());<a name="line.3954"></a>
-<span class="sourceLineNo">3955</span>    }<a name="line.3955"></a>
-<span class="sourceLineNo">3956</span>  }<a name="line.3956"></a>
-<span class="sourceLineNo">3957</span><a name="line.3957"></a>
-<span class="sourceLineNo">3958</span>  @Test<a name="line.3958"></a>
-<span class="sourceLineNo">3959</span>  public void testAllColumnsWithBloomFilter() throws IOException {<a name="line.3959"></a>
-<span class="sourceLineNo">3960</span>    byte[] TABLE = Bytes.toBytes(name.getMethodName());<a name="line.3960"></a>
-<span class="sourceLineNo">3961</span>    byte[] FAMILY = Bytes.toBytes("family");<a name="line.3961"></a>
-<span class="sourceLineNo">3962</span><a name="line.3962"></a>
-<span class="sourceLineNo">3963</span>    // Create table<a name="line.3963"></a>
-<span class="sourceLineNo">3964</span>    HColumnDescriptor hcd = new HColumnDescriptor(FAMILY).setMaxVersions(Integer.MAX_VALUE)<a name="line.3964"></a>
-<span class="sourceLineNo">3965</span>        .setBloomFilterType(BloomType.ROWCOL);<a name="line.3965"></a>
-<span class="sourceLineNo">3966</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(TABLE));<a name="line.3966"></a>
-<span class="sourceLineNo">3967</span>    htd.addFamily(hcd);<a name="line.3967"></a>
-<span class="sourceLineNo">3968</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.3968"></a>
-<span class="sourceLineNo">3969</span>    this.region = TEST_UTIL.createLocalHRegion(info, htd);<a name="line.3969"></a>
-<span class="sourceLineNo">3970</span>    // For row:0, col:0: insert versions 1 through 5.<a name="line.3970"></a>
-<span class="sourceLineNo">3971</span>    byte[] row = Bytes.toBytes("row:" + 0);<a name="line.3971"></a>
-<span class="sourceLineNo">3972</span>    byte[] column = Bytes.toBytes("column:" + 0);<a name="line.3972"></a>
-<span class="sourceLineNo">3973</span>    Put put = new Put(row);<a name="line.3973"></a>
-<span class="sourceLineNo">3974</span>    put.setDurability(Durability.SKIP_WAL);<a name="line.3974"></a>
-<span class="sourceLineNo">3975</span>    for (long idx = 1; idx &lt;= 4; idx++) {<a name="line.3975"></a>
-<span class="sourceLineNo">3976</span>      put.addColumn(FAMILY, column, idx, Bytes.toBytes("value-version-" + idx));<a name="line.3976"></a>
-<span class="sourceLineNo">3977</span>    }<a name="line.3977"></a>
-<span class="sourceLineNo">3978</span>    region.put(put);<a name="line.3978"></a>
-<span class="sourceLineNo">3979</span><a name="line.3979"></a>
-<span class="sourceLineNo">3980</span>    // Flush<a name="line.3980"></a>
-<span class="sourceLineNo">3981</span>    region.flush(true);<a name="line.3981"></a>
-<span class="sourceLineNo">3982</span><a name="line.3982"></a>
-<span class="sourceLineNo">3983</span>    // Get rows<a name="line.3983"></a>
-<span class="sourceLineNo">3984</span>    Get get = new Get(row);<a name="line.3984"></a>
-<span class="sourceLineNo">3985</span>    get.readAllVersions();<a name="line.3985"></a>
-<span class="sourceLineNo">3986</span>    Cell[] kvs = region.get(get).rawCells();<a name="line.3986"></a>
-<span class="sourceLineNo">3987</span><a name="line.3987"></a>
-<span class="sourceLineNo">3988</span>    // Check if rows are correct<a name="line.3988"></a>
-<span class="sourceLineNo">3989</span>    assertEquals(4, kvs.length);<a name="line.3989"></a>
-<span class="sourceLineNo">3990</span>    checkOneCell(kvs[0], FAMILY, 0, 0, 4);<a name="line.3990"></a>
-<span class="sourceLineNo">3991</span>    checkOneCell(kvs[1], FAMILY, 0, 0, 3);<a name="line.3991"></a>
-<span class="sourceLineNo">3992</span>    checkOneCell(kvs[2], FAMILY, 0, 0, 2);<a name="line.3992"></a>
-<span class="sourceLineNo">3993</span>    checkOneCell(kvs[3], FAMILY, 0, 0, 1);<a name="line.3993"></a>
-<span class="sourceLineNo">3994</span>  }<a name="line.3994"></a>
-<span class="sourceLineNo">3995</span><a name="line.3995"></a>
-<span class="sourceLineNo">3996</span>  /**<a name="line.3996"></a>
-<span class="sourceLineNo">3997</span>   * Testcase to cover bug-fix for HBASE-2823 Ensures correct delete when<a name="line.3997"></a>
-<span class="sourceLineNo">3998</span>   * issuing delete row on columns with bloom filter set to row+col<a name="line.3998"></a>
-<span class="sourceLineNo">3999</span>   * (BloomType.ROWCOL)<a name="line.3999"></a>
-<span class="sourceLineNo">4000</span>   */<a name="line.4000"></a>
-<span class="sourceLineNo">4001</span>  @Test<a name="line.4001"></a>
-<span class="sourceLineNo">4002</span>  public void testDeleteRowWithBloomFilter() throws IOException {<a name="line.4002"></a>
-<span class="sourceLineNo">4003</span>    byte[] familyName = Bytes.toBytes("familyName");<a name="line.4003"></a>
-<span class="sourceLineNo">4004</span><a name="line.4004"></a>
-<span class="sourceLineNo">4005</span>    // Create Table<a name="line.4005"></a>
-<span class="sourceLineNo">4006</span>    HColumnDescriptor hcd = new HColumnDescriptor(familyName).setMaxVersions(Integer.MAX_VALUE)<a name="line.4006"></a>
-<span class="sourceLineNo">4007</span>        .setBloomFilterType(BloomType.ROWCOL);<a name="line.4007"></a>
-<span class="sourceLineNo">4008</span><a name="line.4008"></a>
-<span class="sourceLineNo">4009</span>    HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.4009"></a>
-<span class="sourceLineNo">4010</span>    htd.addFamily(hcd);<a name="line.4010"></a>
-<span class="sourceLineNo">4011</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.4011"></a>
-<span class="sourceLineNo">4012</span>    this.region = TEST_UTIL.createLocalHRegion(info, htd);<a name="line.4012"></a>
-<span class="sourceLineNo">4013</span>    // Insert some data<a name="line.4013"></a>
-<span class="sourceLineNo">4014</span>    byte[] row = Bytes.toBytes("row1");<a name="line.4014"></a>
-<span class="sourceLineNo">4015</span>    byte[] col = Bytes.toBytes("col1");<a name="line.4015"></a>
-<span class="sourceLineNo">4016</span><a name="line.4016"></a>
-<span class="sourceLineNo">4017</span>    Put put = new Put(row);<a name="line.4017"></a>
-<span class="sourceLineNo">4018</span>    put.addColumn(familyName, col, 1, Bytes.toBytes("SomeRandomValue"));<a name="line.4018"></a>
-<span class="sourceLineNo">4019</span>    region.put(put);<a name="line.4019"></a>
-<span class="sourceLineNo">4020</span>    region.flush(true);<a name="line.4020"></a>
-<span class="sourceLineNo">4021</span><a name="line.4021"></a>
-<span class="sourceLineNo">4022</span>    Delete del = new Delete(row);<a name="line.4022"></a>
-<span class="sourceLineNo">4023</span>    region.delete(del);<a name="line.4023"></a>
-<span class="sourceLineNo">4024</span>    region.flush(true);<a name="line.4024"></a>
-<span class="sourceLineNo">4025</span><a name="line.4025"></a>
-<span class="sourceLineNo">4026</span>    // Get remaining rows (should have none)<a name="line.4026"></a>
-<span class="sourceLineNo">4027</span>    Get get = new Get(row);<a name="line.4027"></a>
-<span class="sourceLineNo">4028</span>    get.addColumn(familyName, col);<a name="line.4028"></a>
-<span class="sourceLineNo">4029</span><a name="line.4029"></a>
-<span class="sourceLineNo">4030</span>    Cell[] keyValues = region.get(get).rawCells();<a name="line.4030"></a>
-<span class="sourceLineNo">4031</span>    assertEquals(0, keyValues.length);<a name="line.4031"></a>
-<span class="sourceLineNo">4032</span>  }<a name="line.4032"></a>
-<span class="sourceLineNo">4033</span><a name="line.4033"></a>
-<span class="sourceLineNo">4034</span>  @Test<a name="line.4034"></a>
-<span class="sourceLineNo">4035</span>  public void testgetHDFSBlocksDistribution() throws Exception {<a name="line.4035"></a>
-<span class="sourceLineNo">4036</span>    HBaseTestingUtility htu = new HBaseTestingUtility();<a name="line.4036"></a>
-<span class="sourceLineNo">4037</span>    // Why do we set the block size in this test?  If we set it smaller than the kvs, then we'll<a name="line.4037"></a>
-<span class="sourceLineNo">4038</span>    // break up the file in to more pieces that can be distributed across the three nodes and we<a name="line.4038"></a>
-<span class="sourceLineNo">4039</span>    // won't be able to have the condition this test asserts; that at least one node has<a name="line.4039"></a>
-<span class="sourceLineNo">4040</span>    // a copy of all replicas -- if small block size, then blocks are spread evenly across the<a name="line.4040"></a>
-<span class="sourceLineNo">4041</span>    // the three nodes.  hfilev3 with tags seems to put us over the block size.  St.Ack.<a name="line.4041"></a>
-<span class="sourceLineNo">4042</span>    // final int DEFAULT_BLOCK_SIZE = 1024;<a name="line.4042"></a>
-<span class="sourceLineNo">4043</span>    // htu.getConfiguration().setLong("dfs.blocksize", DEFAULT_BLOCK_SIZE);<a name="line.4043"></a>
-<span class="sourceLineNo">4044</span>    htu.getConfiguration().setInt("dfs.replication", 2);<a name="line.4044"></a>
-<span class="sourceLineNo">4045</span><a name="line.4045"></a>
-<span class="sourceLineNo">4046</span>    // set up a cluster with 3 nodes<a name="line.4046"></a>
-<span class="sourceLineNo">4047</span>    MiniHBaseCluster cluster = null;<a name="line.4047"></a>
-<span class="sourceLineNo">4048</span>    String dataNodeHosts[] = new String[] { "host1", "host2", "host3" };<a name="line.4048"></a>
-<span class="sourceLineNo">4049</span>    int regionServersCount = 3;<a name="line.4049"></a>
-<span class="sourceLineNo">4050</span><a name="line.4050"></a>
-<span class="sourceLineNo">4051</span>    try {<a name="line.4051"></a>
-<span class="sourceLineNo">4052</span>      StartMiniClusterOption option = StartMiniClusterOption.builder()<a name="line.4052"></a>
-<span class="sourceLineNo">4053</span>          .numRegionServers(regionServersCount).dataNodeHosts(dataNodeHosts).build();<a name="line.4053"></a>
-<span class="sourceLineNo">4054</span>      cluster = htu.startMiniCluster(option);<a name="line.4054"></a>
-<span class="sourceLineNo">4055</span>      byte[][] families = { fam1, fam2 };<a name="line.4055"></a>
-<span class="sourceLineNo">4056</span>      Table ht = htu.createTable(tableName, families);<a name="line.4056"></a>
-<span class="sourceLineNo">4057</span><a name="line.4057"></a>
-<span class="sourceLineNo">4058</span>      // Setting up region<a name="line.4058"></a>
-<span class="sourceLineNo">4059</span>      byte row[] = Bytes.toBytes("row1");<a name="line.4059"></a>
-<span class="sourceLineNo">4060</span>      byte col[] = Bytes.toBytes("col1");<a name="line.4060"></a>
-<span class="sourceLineNo">4061</span><a name="line.4061"></a>
-<span class="sourceLineNo">4062</span>      Put put = new Put(row);<a name="line.4062"></a>
-<span class="sourceLineNo">4063</span>      put.addColumn(fam1, col, 1, Bytes.toBytes("test1"));<a name="line.4063"></a>
-<span class="sourceLineNo">4064</span>      put.addColumn(fam2, col, 1, Bytes.toBytes("test2"));<a name="line.4064"></a>
-<span class="sourceLineNo">4065</span>      ht.put(put);<a name="line.4065"></a>
-<span class="sourceLineNo">4066</span><a name="line.4066"></a>
-<span class="sourceLineNo">4067</span>      HRegion firstRegion = htu.getHBaseCluster().getRegions(tableName).get(0);<a name="line.4067"></a>
-<span class="sourceLineNo">4068</span>      firstRegion.flush(true);<a name="line.4068"></a>
-<span class="sourceLineNo">4069</span>      HDFSBlocksDistribution blocksDistribution1 = firstRegion.getHDFSBlocksDistribution();<a name="line.4069"></a>
-<span class="sourceLineNo">4070</span><a name="line.4070"></a>
-<span class="sourceLineNo">4071</span>      // Given the default replication factor is 2 and we have 2 HFiles,<a name="line.4071"></a>
-<span class="sourceLineNo">4072</span>      // we will have total of 4 replica of blocks on 3 datanodes; thus there<a name="line.4072"></a>
-<span class="sourceLineNo">4073</span>      // must be at least one host that have replica for 2 HFiles. That host's<a name="line.4073"></a>
-<span class="sourceLineNo">4074</span>      // weight will be equal to the unique block weight.<a name="line.4074"></a>
-<span class="sourceLineNo">4075</span>      long uniqueBlocksWeight1 = blocksDistribution1.getUniqueBlocksTotalWeight();<a name="line.4075"></a>
-<span class="sourceLineNo">4076</span>      StringBuilder sb = new StringBuilder();<a name="line.4076"></a>
-<span class="sourceLineNo">4077</span>      for (String host: blocksDistribution1.getTopHosts()) {<a name="line.4077"></a>
-<span class="sourceLineNo">4078</span>        if (sb.length() &gt; 0) sb.append(", ");<a name="line.4078"></a>
-<span class="sourceLineNo">4079</span>        sb.append(host);<a name="line.4079"></a>
-<span class="sourceLineNo">4080</span>        sb.append("=");<a name="line.4080"></a>
-<span class="sourceLineNo">4081</span>        sb.append(blocksDistribution1.getWeight(host));<a name="line.4081"></a>
-<span class="sourceLineNo">4082</span>      }<a name="line.4082"></a>
-<span class="sourceLineNo">4083</span><a name="line.4083"></a>
-<span class="sourceLineNo">4084</span>      String topHost = blocksDistribution1.getTopHosts().get(0);<a name="line.4084"></a>
-<span class="sourceLineNo">4085</span>      long topHostWeight = blocksDistribution1.getWeight(topHost);<a name="line.4085"></a>
-<span class="sourceLineNo">4086</span>      String msg = "uniqueBlocksWeight=" + uniqueBlocksWeight1 + ", topHostWeight=" +<a name="line.4086"></a>
-<span class="sourceLineNo">4087</span>        topHostWeight + ", topHost=" + topHost + "; " + sb.toString();<a name="line.4087"></a>
-<span class="sourceLineNo">4088</span>      LOG.info(msg);<a name="line.4088"></a>
-<span class="sourceLineNo">4089</span>      assertTrue(msg, uniqueBlocksWeight1 == topHostWeight);<a name="line.4089"></a>
-<span class="sourceLineNo">4090</span><a name="line.4090"></a>
-<span class="sourceLineNo">4091</span>      // use the static method to compute the value, it should be the same.<a name="line.4091"></a>
-<span class="sourceLineNo">4092</span>      // static method is used by load balancer or other components<a name="line.4092"></a>
-<span class="sourceLineNo">4093</span>      HDFSBlocksDistribution blocksDistribution2 = HRegion.computeHDFSBlocksDistribution(<a name="line.4093"></a>
-<span class="sourceLineNo">4094</span>          htu.getConfiguration(), firstRegion.getTableDescriptor(), firstRegion.getRegionInfo());<a name="line.4094"></a>
-<span class="sourceLineNo">4095</span>      long uniqueBlocksWeight2 = blocksDistribution2.getUniqueBlocksTotalWeight();<a name="line.4095"></a>
-<span class="sourceLineNo">4096</span><a name="line.4096"></a>
-<span class="sourceLineNo">4097</span>      assertTrue(uniqueBlocksWeight1 == uniqueBlocksWeight2);<a name="line.4097"></a>
-<span class="sourceLineNo">4098</span><a name="line.4098"></a>
-<span class="sourceLineNo">4099</span>      ht.close();<a name="line.4099"></a>
-<span class="sourceLineNo">4100</span>    } finally {<a name="line.4100"></a>
-<span class="sourceLineNo">4101</span>      if (cluster != null) {<a name="line.4101"></a>
-<span class="sourceLineNo">4102</span>        htu.shutdownMiniCluster();<a name="line.4102"></a>
-<span class="sourceLineNo">4103</span>      }<a name="line.4103"></a>
-<span class="sourceLineNo">4104</span>    }<a name="line.4104"></a>
-<span class="sourceLineNo">4105</span>  }<a name="line.4105"></a>
+<span class="sourceLineNo">3944</span>    // before compaction<a name="line.3944"></a>
+<span class="sourceLineNo">3945</span>    HStore store = region.getStore(fam1);<a name="line.3945"></a>
+<span class="sourceLineNo">3946</span>    Collection&lt;HStoreFile&gt; storeFiles = store.getStorefiles();<a name="line.3946"></a>
+<span class="sourceLineNo">3947</span>    for (HStoreFile storefile : storeFiles) {<a name="line.3947"></a>
+<span class="sourceLineNo">3948</span>      StoreFileReader reader = storefile.getReader();<a name="line.3948"></a>
+<span class="sourceLineNo">3949</span>      reader.loadFileInfo();<a name="line.3949"></a>
+<span class="sourceLineNo">3950</span>      reader.loadBloomfilter();<a name="line.3950"></a>
+<span class="sourceLineNo">3951</span>      assertEquals(num_unique_rows * duplicate_multiplier, reader.getEntries());<a name="line.3951"></a>
+<span class="sourceLineNo">3952</span>      assertEquals(num_unique_rows, reader.getFilterEntries());<a name="line.3952"></a>
+<span class="sourceLineNo">3953</span>    }<a name="line.3953"></a>
+<span class="sourceLineNo">3954</span><a name="line.3954"></a>
+<span class="sourceLineNo">3955</span>    region.compact(true);<a name="line.3955"></a>
+<span class="sourceLineNo">3956</span><a name="line.3956"></a>
+<span class="sourceLineNo">3957</span>    // after compaction<a name="line.3957"></a>
+<span class="sourceLineNo">3958</span>    storeFiles = store.getStorefiles();<a name="line.3958"></a>
+<span class="sourceLineNo">3959</span>    for (HStoreFile storefile : storeFiles) {<a name="line.3959"></a>
+<span class="sourceLineNo">3960</span>      StoreFileReader reader = storefile.getReader();<a name="line.3960"></a>
+<span class="sourceLineNo">3961</span>      reader.loadFileInfo();<a name="line.3961"></a>
+<span class="sourceLineNo">3962</span>      reader.loadBloomfilter();<a name="line.3962"></a>
+<span class="sourceLineNo">3963</span>      assertEquals(num_unique_rows * duplicate_multiplier * num_storefiles, reader.getEntries());<a name="line.3963"></a>
+<span class="sourceLineNo">3964</span>      assertEquals(num_unique_rows, reader.getFilterEntries());<a name="line.3964"></a>
+<span class="sourceLineNo">3965</span>    }<a name="line.3965"></a>
+<span class="sourceLineNo">3966</span>  }<a name="line.3966"></a>
+<span class="sourceLineNo">3967</span><a name="line.3967"></a>
+<span class="sourceLineNo">3968</span>  @Test<a name="line.3968"></a>
+<span class="sourceLineNo">3969</span>  public void testAllColumnsWithBloomFilter() throws IOException {<a name="line.3969"></a>
+<span class="sourceLineNo">3970</span>    byte[] TABLE = Bytes.toBytes(name.getMethodName());<a name="line.3970"></a>
+<span class="sourceLineNo">3971</span>    byte[] FAMILY = Bytes.toBytes("family");<a name="line.3971"></a>
+<span class="sourceLineNo">3972</span><a name="line.3972"></a>
+<span class="sourceLineNo">3973</span>    // Create table<a name="line.3973"></a>
+<span class="sourceLineNo">3974</span>    HColumnDescriptor hcd = new HColumnDescriptor(FAMILY).setMaxVersions(Integer.MAX_VALUE)<a name="line.3974"></a>
+<span class="sourceLineNo">3975</span>        .setBloomFilterType(BloomType.ROWCOL);<a name="line.3975"></a>
+<span class="sourceLineNo">3976</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(TABLE));<a name="line.3976"></a>
+<span class="sourceLineNo">3977</span>    htd.addFamily(hcd);<a name="line.3977"></a>
+<span class="sourceLineNo">3978</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.3978"></a>
+<span class="sourceLineNo">3979</span>    this.region = TEST_UTIL.createLocalHRegion(info, htd);<a name="line.3979"></a>
+<span class="sourceLineNo">3980</span>    // For row:0, col:0: insert versions 1 through 5.<a name="line.3980"></a>
+<span class="sourceLineNo">3981</span>    byte[] row = Bytes.toBytes("row:" + 0);<a name="line.3981"></a>
+<span class="sourceLineNo">3982</span>    byte[] column = Bytes.toBytes("column:" + 0);<a name="line.3982"></a>
+<span class="sourceLineNo">3983</span>    Put put = new Put(row);<a name="line.3983"></a>
+<span class="sourceLineNo">3984</span>    put.setDurability(Durability.SKIP_WAL);<a name="line.3984"></a>
+<span class="sourceLineNo">3985</span>    for (long idx = 1; idx &lt;= 4; idx++) {<a name="line.3985"></a>
+<span class="sourceLineNo">3986</span>      put.addColumn(FAMILY, column, idx, Bytes.toBytes("value-version-" + idx));<a name="line.3986"></a>
+<span class="sourceLineNo">3987</span>    }<a name="line.3987"></a>
+<span class="sourceLineNo">3988</span>    region.put(put);<a name="line.3988"></a>
+<span class="sourceLineNo">3989</span><a name="line.3989"></a>
+<span class="sourceLineNo">3990</span>    // Flush<a name="line.3990"></a>
+<span class="sourceLineNo">3991</span>    region.flush(true);<a name="line.3991"></a>
+<span class="sourceLineNo">3992</span><a name="line.3992"></a>
+<span class="sourceLineNo">3993</span>    // Get rows<a name="line.3993"></a>
+<span class="sourceLineNo">3994</span>    Get get = new Get(row);<a name="line.3994"></a>
+<span class="sourceLineNo">3995</span>    get.readAllVersions();<a name="line.3995"></a>
+<span class="sourceLineNo">3996</span>    Cell[] kvs = region.get(get).rawCells();<a name="line.3996"></a>
+<span class="sourceLineNo">3997</span><a name="line.3997"></a>
+<span class="sourceLineNo">3998</span>    // Check if rows are correct<a name="line.3998"></a>
+<span class="sourceLineNo">3999</span>    assertEquals(4, kvs.length);<a name="line.3999"></a>
+<span class="sourceLineNo">4000</span>    checkOneCell(kvs[0], FAMILY, 0, 0, 4);<a name="line.4000"></a>
+<span class="sourceLineNo">4001</span>    checkOneCell(kvs[1], FAMILY, 0, 0, 3);<a name="line.4001"></a>
+<span class="sourceLineNo">4002</span>    checkOneCell(kvs[2], FAMILY, 0, 0, 2);<a name="line.4002"></a>
+<span class="sourceLineNo">4003</span>    checkOneCell(kvs[3], FAMILY, 0, 0, 1);<a name="line.4003"></a>
+<span class="sourceLineNo">4004</span>  }<a name="line.4004"></a>
+<span class="sourceLineNo">4005</span><a name="line.4005"></a>
+<span class="sourceLineNo">4006</span>  /**<a name="line.4006"></a>
+<span class="sourceLineNo">4007</span>   * Testcase to cover bug-fix for HBASE-2823 Ensures correct delete when<a name="line.4007"></a>
+<span class="sourceLineNo">4008</span>   * issuing delete row on columns with bloom filter set to row+col<a name="line.4008"></a>
+<span class="sourceLineNo">4009</span>   * (BloomType.ROWCOL)<a name="line.4009"></a>
+<span class="sourceLineNo">4010</span>   */<a name="line.4010"></a>
+<span class="sourceLineNo">4011</span>  @Test<a name="line.4011"></a>
+<span class="sourceLineNo">4012</span>  public void testDeleteRowWithBloomFilter() throws IOException {<a name="line.4012"></a>
+<span class="sourceLineNo">4013</span>    byte[] familyName = Bytes.toBytes("familyName");<a name="line.4013"></a>
+<span class="sourceLineNo">4014</span><a name="line.4014"></a>
+<span class="sourceLineNo">4015</span>    // Create Table<a name="line.4015"></a>
+<span class="sourceLineNo">4016</span>    HColumnDescriptor hcd = new HColumnDescriptor(familyName).setMaxVersions(Integer.MAX_VALUE)<a name="line.4016"></a>
+<span class="sourceLineNo">4017</span>        .setBloomFilterType(BloomType.ROWCOL);<a name="line.4017"></a>
+<span class="sourceLineNo">4018</span><a name="line.4018"></a>
+<span class="sourceLineNo">4019</span>    HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.4019"></a>
+<span class="sourceLineNo">4020</span>    htd.addFamily(hcd);<a name="line.4020"></a>
+<span class="sourceLineNo">4021</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.4021"></a>
+<span class="sourceLineNo">4022</span>    this.region = TEST_UTIL.createLocalHRegion(info, htd);<a name="line.4022"></a>
+<span class="sourceLineNo">4023</span>    // Insert some data<a name="line.4023"></a>
+<span class="sourceLineNo">4024</span>    byte[] row = Bytes.toBytes("row1");<a name="line.4024"></a>
+<span class="sourceLineNo">4025</span>    byte[] col = Bytes.toBytes("col1");<a name="line.4025"></a>
+<span class="sourceLineNo">4026</span><a name="line.4026"></a>
+<span class="sourceLineNo">4027</span>    Put put = new Put(row);<a name="line.4027"></a>
+<span class="sourceLineNo">4028</span>    put.addColumn(familyName, col, 1, Bytes.toBytes("SomeRandomValue"));<a name="line.4028"></a>
+<span class="sourceLineNo">4029</span>    region.put(put);<a name="line.4029"></a>
+<span class="sourceLineNo">4030</span>    region.flush(true);<a name="line.4030"></a>
+<span class="sourceLineNo">4031</span><a name="line.4031"></a>
+<span class="sourceLineNo">4032</span>    Delete del = new Delete(row);<a name="line.4032"></a>
+<span class="sourceLineNo">4033</span>    region.delete(del);<a name="line.4033"></a>
+<span class="sourceLineNo">4034</span>    region.flush(true);<a name="line.4034"></a>
+<span class="sourceLineNo">4035</span><a name="line.4035"></a>
+<span class="sourceLineNo">4036</span>    // Get remaining rows (should have none)<a name="line.4036"></a>
+<span class="sourceLineNo">4037</span>    Get get = new Get(row);<a name="line.4037"></a>
+<span class="sourceLineNo">4038</span>    get.addColumn(familyName, col);<a name="line.4038"></a>
+<span class="sourceLineNo">4039</span><a name="line.4039"></a>
+<span class="sourceLineNo">4040</span>    Cell[] keyValues = region.get(get).rawCells();<a name="line.4040"></a>
+<span class="sourceLineNo">4041</span>    assertEquals(0, keyValues.length);<a name="line.4041"></a>
+<span class="sourceLineNo">4042</span>  }<a name="line.4042"></a>
+<span class="sourceLineNo">4043</span><a name="line.4043"></a>
+<span class="sourceLineNo">4044</span>  @Test<a name="line.4044"></a>
+<span class="sourceLineNo">4045</span>  public void testgetHDFSBlocksDistribution() throws Exception {<a name="line.4045"></a>
+<span class="sourceLineNo">4046</span>    HBaseTestingUtility htu = new HBaseTestingUtility();<a name="line.4046"></a>
+<span class="sourceLineNo">4047</span>    // Why do we set the block size in this test?  If we set it smaller than the kvs, then we'll<a name="line.4047"></a>
+<span class="sourceLineNo">4048</span>    // break up the file in to more pieces that can be distributed across the three nodes and we<a name="line.4048"></a>
+<span class="sourceLineNo">4049</span>    // won't be able to have the condition this test asserts; that at least one node has<a name="line.4049"></a>
+<span class="sourceLineNo">4050</span>    // a copy of all replicas -- if small block size, then blocks are spread evenly across the<a name="line.4050"></a>
+<span class="sourceLineNo">4051</span>    // the three nodes.  hfilev3 with tags seems to put us over the block size.  St.Ack.<a name="line.4051"></a>
+<span class="sourceLineNo">4052</span>    // final int DEFAULT_BLOCK_SIZE = 1024;<a name="line.4052"></a>
+<span class="sourceLineNo">4053</span>    // htu.getConfiguration().setLong("dfs.blocksize", DEFAULT_BLOCK_SIZE);<a name="line.4053"></a>
+<span class="sourceLineNo">4054</span>    htu.getConfiguration().setInt("dfs.replication", 2);<a name="line.4054"></a>
+<span class="sourceLineNo">4055</span><a name="line.4055"></a>
+<span class="sourceLineNo">4056</span>    // set up a cluster with 3 nodes<a name="line.4056"></a>
+<span class="sourceLineNo">4057</span>    MiniHBaseCluster cluster = null;<a name="line.4057"></a>
+<span class="sourceLineNo">4058</span>    String dataNodeHosts[] = new String[] { "host1", "host2", "host3" };<a name="line.4058"></a>
+<span class="sourceLineNo">4059</span>    int regionServersCount = 3;<a name="line.4059"></a>
+<span class="sourceLineNo">4060</span><a name="line.4060"></a>
+<span class="sourceLineNo">4061</span>    try {<a name="line.4061"></a>
+<span class="sourceLineNo">4062</span>      StartMiniClusterOption option = StartMiniClusterOption.builder()<a name="line.4062"></a>
+<span class="sourceLineNo">4063</span>          .numRegionServers(regionServersCount).dataNodeHosts(dataNodeHosts).build();<a name="line.4063"></a>
+<span class="sourceLineNo">4064</span>      cluster = htu.startMiniCluster(option);<a name="line.4064"></a>
+<span class="sourceLineNo">4065</span>      byte[][] families = { fam1, fam2 };<a name="line.4065"></a>
+<span class="sourceLineNo">4066</span>      Table ht = htu.createTable(tableName, families);<a name="line.4066"></a>
+<span class="sourceLineNo">4067</span><a name="line.4067"></a>
+<span class="sourceLineNo">4068</span>      // Setting up region<a name="line.4068"></a>
+<span class="sourceLineNo">4069</span>      byte row[] = Bytes.toBytes("row1");<a name="line.4069"></a>
+<span class="sourceLineNo">4070</span>      byte col[] = Bytes.toBytes("col1");<a name="line.4070"></a>
+<span class="sourceLineNo">4071</span><a name="line.4071"></a>
+<span class="sourceLineNo">4072</span>      Put put = new Put(row);<a name="line.4072"></a>
+<span class="sourceLineNo">4073</span>      put.addColumn(fam1, col, 1, Bytes.toBytes("test1"));<a name="line.4073"></a>
+<span class="sourceLineNo">4074</span>      put.addColumn(fam2, col, 1, Bytes.toBytes("test2"));<a name="line.4074"></a>
+<span class="sourceLineNo">4075</span>      ht.put(put);<a name="line.4075"></a>
+<span class="sourceLineNo">4076</span><a name="line.4076"></a>
+<span class="sourceLineNo">4077</span>      HRegion firstRegion = htu.getHBaseCluster().getRegions(tableName).get(0);<a name="line.4077"></a>
+<span class="sourceLineNo">4078</span>      firstRegion.flush(true);<a name="line.4078"></a>
+<span class="sourceLineNo">4079</span>      HDFSBlocksDistribution blocksDistribution1 = firstRegion.getHDFSBlocksDistribution();<a name="line.4079"></a>
+<span class="sourceLineNo">4080</span><a name="line.4080"></a>
+<span class="sourceLineNo">4081</span>      // Given the default replication factor is 2 and we have 2 HFiles,<a name="line.4081"></a>
+<span class="sourceLineNo">4082</span>      // we will have total of 4 replica of blocks on 3 datanodes; thus there<a name="line.4082"></a>
+<span class="sourceLineNo">4083</span>      // must be at least one host that have replica for 2 HFiles. That host's<a name="line.4083"></a>
+<span class="sourceLineNo">4084</span>      // weight will be equal to the unique block weight.<a name="line.4084"></a>
+<span class="sourceLineNo">4085</span>      long uniqueBlocksWeight1 = blocksDistribution1.getUniqueBlocksTotalWeight();<a name="line.4085"></a>
+<span class="sourceLineNo">4086</span>      StringBuilder sb = new StringBuilder();<a name="line.4086"></a>
+<span class="sourceLineNo">4087</span>      for (String host: blocksDistribution1.getTopHosts()) {<a name="line.4087"></a>
+<span class="sourceLineNo">4088</span>        if (sb.length() &gt; 0) sb.append(", ");<a name="line.4088"></a>
+<span class="sourceLineNo">4089</span>        sb.append(host);<a name="line.4089"></a>
+<span class="sourceLineNo">4090</span>        sb.append("=");<a name="line.4090"></a>
+<span class="sourceLineNo">4091</span>        sb.append(blocksDistribution1.getWeight(host));<a name="line.4091"></a>
+<span class="sourceLineNo">4092</span>      }<a name="line.4092"></a>
+<span class="sourceLineNo">4093</span><a name="line.4093"></a>
+<span class="sourceLineNo">4094</span>      String topHost = blocksDistribution1.getTopHosts().get(0);<a name="line.4094"></a>
+<span class="sourceLineNo">4095</span>      long topHostWeight = blocksDistribution1.getWeight(topHost);<a name="line.4095"></a>
+<span class="sourceLineNo">4096</span>      String msg = "uniqueBlocksWeight=" + uniqueBlocksWeight1 + ", topHostWeight=" +<a name="line.4096"></a>
+<span class="sourceLineNo">4097</span>        topHostWeight + ", topHost=" + topHost + "; " + sb.toString();<a name="line.4097"></a>
+<span class="sourceLineNo">4098</span>      LOG.info(msg);<a name="line.4098"></a>
+<span class="sourceLineNo">4099</span>      assertTrue(msg, uniqueBlocksWeight1 == topHostWeight);<a name="line.4099"></a>
+<span class="sourceLineNo">4100</span><a name="line.4100"></a>
+<span class="sourceLineNo">4101</span>      // use the static method to compute the value, it should be the same.<a name="line.4101"></a>
+<span class="sourceLineNo">4102</span>      // static method is used by load balancer or other components<a name="line.4102"></a>
+<span class="sourceLineNo">4103</span>      HDFSBlocksDistribution blocksDistribution2 = HRegion.computeHDFSBlocksDistribution(<a name="line.4103"></a>
+<span class="sourceLineNo">4104</span>          htu.getConfiguration(), firstRegion.getTableDescriptor(), firstRegion.getRegionInfo());<a name="line.4104"></a>
+<span class="sourceLineNo">4105</span>      long uniqueBlocksWeight2 = blocksDistribution2.getUniqueBlocksTotalWeight();<a name="line.4105"></a>
 <span class="sourceLineNo">4106</span><a name="line.4106"></a>
-<span class="sourceLineNo">4107</span>  /**<a name="line.4107"></a>
-<span class="sourceLineNo">4108</span>   * Testcase to check state of region initialization task set to ABORTED or not<a name="line.4108"></a>
-<span class="sourceLineNo">4109</span>   * if any exceptions during initialization<a name="line.4109"></a>
-<span class="sourceLineNo">4110</span>   *<a name="line.4110"></a>
-<span class="sourceLineNo">4111</span>   * @throws Exception<a name="line.4111"></a>
-<span class="sourceLineNo">4112</span>   */<a name="line.4112"></a>
-<span class="sourceLineNo">4113</span>  @Test<a name="line.4113"></a>
-<span class="sourceLineNo">4114</span>  public void testStatusSettingToAbortIfAnyExceptionDuringRegionInitilization() throws Exception {<a name="line.4114"></a>
-<span class="sourceLineNo">4115</span>    HRegionInfo info;<a name="line.4115"></a>
-<span class="sourceLineNo">4116</span>    try {<a name="line.4116"></a>
-<span class="sourceLineNo">4117</span>      FileSystem fs = Mockito.mock(FileSystem.class);<a name="line.4117"></a>
-<span class="sourceLineNo">4118</span>      Mockito.when(fs.exists((Path) Mockito.anyObject())).thenThrow(new IOException());<a name="line.4118"></a>
-<span class="sourceLineNo">4119</span>      HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.4119"></a>
-<span class="sourceLineNo">4120</span>      htd.addFamily(new HColumnDescriptor("cf"));<a name="line.4120"></a>
-<span class="sourceLineNo">4121</span>      info = new HRegionInfo(htd.getTableName(), HConstants.EMPTY_BYTE_ARRAY,<a name="line.4121"></a>
-<span class="sourceLineNo">4122</span>          HConstants.EMPTY_BYTE_ARRAY, false);<a name="line.4122"></a>
-<span class="sourceLineNo">4123</span>      Path path = new Path(dir + "testStatusSettingToAbortIfAnyExceptionDuringRegionInitilization");<a name="line.4123"></a>
-<span class="sourceLineNo">4124</span>      region = HRegion.newHRegion(path, null, fs, CONF, info, htd, null);<a name="line.4124"></a>
-<span class="sourceLineNo">4125</span>      // region initialization throws IOException and set task state to ABORTED.<a name="line.4125"></a>
-<span class="sourceLineNo">4126</span>      region.initialize();<a name="line.4126"></a>
-<span class="sourceLineNo">4127</span>      fail("Region initialization should fail due to IOException");<a name="line.4127"></a>
-<span class="sourceLineNo">4128</span>    } catch (IOException io) {<a name="line.4128"></a>
-<span class="sourceLineNo">4129</span>      List&lt;MonitoredTask&gt; tasks = TaskMonitor.get().getTasks();<a name="line.4129"></a>
-<span class="sourceLineNo">4130</span>      for (MonitoredTask monitoredTask : tasks) {<a name="line.4130"></a>
-<span class="sourceLineNo">4131</span>        if (!(monitoredTask instanceof MonitoredRPCHandler)<a name="line.4131"></a>
-<span class="sourceLineNo">4132</span>            &amp;&amp; monitoredTask.getDescription().contains(region.toString())) {<a name="line.4132"></a>
-<span class="sourceLineNo">4133</span>          assertTrue("Region state should be ABORTED.",<a name="line.4133"></a>
-<span class="sourceLineNo">4134</span>              monitoredTask.getState().equals(MonitoredTask.State.ABORTED));<a name="line.4134"></a>
-<span class="sourceLineNo">4135</span>          break;<a name="line.4135"></a>
-<span class="sourceLineNo">4136</span>        }<a name="line.4136"></a>
-<span class="sourceLineNo">4137</span>      }<a name="line.4137"></a>
-<span class="sourceLineNo">4138</span>    }<a name="line.4138"></a>
-<span class="sourceLineNo">4139</span>  }<a name="line.4139"></a>
-<span class="sourceLineNo">4140</span><a name="line.4140"></a>
-<span class="sourceLineNo">4141</span>  /**<a name="line.4141"></a>
-<span class="sourceLineNo">4142</span>   * Verifies that the .regioninfo file is written on region creation and that<a name="line.4142"></a>
-<span class="sourceLineNo">4143</span>   * is recreated if missing during region opening.<a name="line.4143"></a>
-<span class="sourceLineNo">4144</span>   */<a name="line.4144"></a>
-<span class="sourceLineNo">4145</span>  @Test<a name="line.4145"></a>
-<span class="sourceLineNo">4146</span>  public void testRegionInfoFileCreation() throws IOException {<a name="line.4146"></a>
-<span class="sourceLineNo">4147</span>    Path rootDir = new Path(dir + "testRegionInfoFileCreation");<a name="line.4147"></a>
-<span class="sourceLineNo">4148</span><a name="line.4148"></a>
-<span class="sourceLineNo">4149</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.4149"></a>
-<span class="sourceLineNo">4150</span>    htd.addFamily(new HColumnDescriptor("cf"));<a name="line.4150"></a>
-<span class="sourceLineNo">4151</span><a name="line.4151"></a>
-<span class="sourceLineNo">4152</span>    HRegionInfo hri = new HRegionInfo(htd.getTableName());<a name="line.4152"></a>
-<span class="sourceLineNo">4153</span><a name="line.4153"></a>
-<span class="sourceLineNo">4154</span>    // Create a region and skip the initialization (like CreateTableHandler)<a name="line.4154"></a>
-<span class="sourceLineNo">4155</span>    region = HBaseTestingUtility.createRegionAndWAL(hri, rootDir, CONF, htd, false);<a name="line.4155"></a>
-<span class="sourceLineNo">4156</span>    Path regionDir = region.getRegionFileSystem().getRegionDir();<a name="line.4156"></a>
-<span class="sourceLineNo">4157</span>    FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.4157"></a>
-<span class="sourceLineNo">4158</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.4158"></a>
-<span class="sourceLineNo">4159</span><a name="line.4159"></a>
-<span class="sourceLineNo">4160</span>    Path regionInfoFile = new Path(regionDir, HRegionFileSystem.REGION_INFO_FILE);<a name="line.4160"></a>
+<span class="sourceLineNo">4107</span>      assertTrue(uniqueBlocksWeight1 == uniqueBlocksWeight2);<a name="line.4107"></a>
+<span class="sourceLineNo">4108</span><a name="line.4108"></a>
+<span class="sourceLineNo">4109</span>      ht.close();<a name="line.4109"></a>
+<span class="sourceLineNo">4110</span>    } finally {<a name="line.4110"></a>
+<span class="sourceLineNo">4111</span>      if (cluster != null) {<a name="line.4111"></a>
+<span class="sourceLineNo">4112</span>        htu.shutdownMiniCluster();<a name="line.4112"></a>
+<span class="sourceLineNo">4113</span>      }<a name="line.4113"></a>
+<span class="sourceLineNo">4114</span>    }<a name="line.4114"></a>
+<span class="sourceLineNo">4115</span>  }<a name="line.4115"></a>
+<span class="sourceLineNo">4116</span><a name="line.4116"></a>
+<span class="sourceLineNo">4117</span>  /**<a name="line.4117"></a>
+<span class="sourceLineNo">4118</span>   * Testcase to check state of region initialization task set to ABORTED or not<a name="line.4118"></a>
+<span class="sourceLineNo">4119</span>   * if any exceptions during initialization<a name="line.4119"></a>
+<span class="sourceLineNo">4120</span>   *<a name="line.4120"></a>
+<span class="sourceLineNo">4121</span>   * @throws Exception<a name="line.4121"></a>
+<span class="sourceLineNo">4122</span>   */<a name="line.4122"></a>
+<span class="sourceLineNo">4123</span>  @Test<a name="line.4123"></a>
+<span class="sourceLineNo">4124</span>  public void testStatusSettingToAbortIfAnyExceptionDuringRegionInitilization() throws Exception {<a name="line.4124"></a>
+<span class="sourceLineNo">4125</span>    HRegionInfo info;<a name="line.4125"></a>
+<span class="sourceLineNo">4126</span>    try {<a name="line.4126"></a>
+<span class="sourceLineNo">4127</span>      FileSystem fs = Mockito.mock(FileSystem.class);<a name="line.4127"></a>
+<span class="sourceLineNo">4128</span>      Mockito.when(fs.exists((Path) Mockito.anyObject())).thenThrow(new IOException());<a name="line.4128"></a>
+<span class="sourceLineNo">4129</span>      HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.4129"></a>
+<span class="sourceLineNo">4130</span>      htd.addFamily(new HColumnDescriptor("cf"));<a name="line.4130"></a>
+<span class="sourceLineNo">4131</span>      info = new HRegionInfo(htd.getTableName(), HConstants.EMPTY_BYTE_ARRAY,<a name="line.4131"></a>
+<span class="sourceLineNo">4132</span>          HConstants.EMPTY_BYTE_ARRAY, false);<a name="line.4132"></a>
+<span class="sourceLineNo">4133</span>      Path path = new Path(dir + "testStatusSettingToAbortIfAnyExceptionDuringRegionInitilization");<a name="line.4133"></a>
+<span class="sourceLineNo">4134</span>      region = HRegion.newHRegion(path, null, fs, CONF, info, htd, null);<a name="line.4134"></a>
+<span class="sourceLineNo">4135</span>      // region initialization throws IOException and set task state to ABORTED.<a name="line.4135"></a>
+<span class="sourceLineNo">4136</span>      region.initialize();<a name="line.4136"></a>
+<span class="sourceLineNo">4137</span>      fail("Region initialization should fail due to IOException");<a name="line.4137"></a>
+<span class="sourceLineNo">4138</span>    } catch (IOException io) {<a name="line.4138"></a>
+<span class="sourceLineNo">4139</span>      List&lt;MonitoredTask&gt; tasks = TaskMonitor.get().getTasks();<a name="line.4139"></a>
+<span class="sourceLineNo">4140</span>      for (MonitoredTask monitoredTask : tasks) {<a name="line.4140"></a>
+<span class="sourceLineNo">4141</span>        if (!(monitoredTask instanceof MonitoredRPCHandler)<a name="line.4141"></a>
+<span class="sourceLineNo">4142</span>            &amp;&amp; monitoredTask.getDescription().contains(region.toString())) {<a name="line.4142"></a>
+<span class="sourceLineNo">4143</span>          assertTrue("Region state should be ABORTED.",<a name="line.4143"></a>
+<span class="sourceLineNo">4144</span>              monitoredTask.getState().equals(MonitoredTask.State.ABORTED));<a name="line.4144"></a>
+<span class="sourceLineNo">4145</span>          break;<a name="line.4145"></a>
+<span class="sourceLineNo">4146</span>        }<a name="line.4146"></a>
+<span class="sourceLineNo">4147</span>      }<a name="line.4147"></a>
+<span class="sourceLineNo">4148</span>    }<a name="line.4148"></a>
+<span class="sourceLineNo">4149</span>  }<a name="line.4149"></a>
+<span class="sourceLineNo">4150</span><a name="line.4150"></a>
+<span class="sourceLineNo">4151</span>  /**<a name="line.4151"></a>
+<span class="sourceLineNo">4152</span>   * Verifies that the .regioninfo file is written on region creation and that<a name="line.4152"></a>
+<span class="sourceLineNo">4153</span>   * is recreated if missing during region opening.<a name="line.4153"></a>
+<span class="sourceLineNo">4154</span>   */<a name="line.4154"></a>
+<span class="sourceLineNo">4155</span>  @Test<a name="line.4155"></a>
+<span class="sourceLineNo">4156</span>  public void testRegionInfoFileCreation() throws IOException {<a name="line.4156"></a>
+<span class="sourceLineNo">4157</span>    Path rootDir = new Path(dir + "testRegionInfoFileCreation");<a name="line.4157"></a>
+<span class="sourceLineNo">4158</span><a name="line.4158"></a>
+<span class="sourceLineNo">4159</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.4159"></a>
+<span class="sourceLineNo">4160</span>    htd.addFamily(new HColumnDescriptor("cf"));<a name="line.4160"></a>
 <span class="sourceLineNo">4161</span><a name="line.4161"></a>
-<span class="sourceLineNo">4162</span>    // Verify that the .regioninfo file is present<a name="line.4162"></a>
-<span class="sourceLineNo">4163</span>    assertTrue(HRegionFileSystem.REGION_INFO_FILE + " should be present in the region dir",<a name="line.4163"></a>
-<span class="sourceLineNo">4164</span>        fs.exists(regionInfoFile));<a name="line.4164"></a>
-<span class="sourceLineNo">4165</span><a name="line.4165"></a>
-<span class="sourceLineNo">4166</span>    // Try to open the region<a name="line.4166"></a>
-<span class="sourceLineNo">4167</span>    region = HRegion.openHRegion(rootDir, hri, htd, null, CONF);<a name="line.4167"></a>
-<span class="sourceLineNo">4168</span>    assertEquals(regionDir, region.getRegionFileSystem().getRegionDir());<a name="line.4168"></a>
-<span class="sourceLineNo">4169</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.4169"></a>
-<span class="sourceLineNo">4170</span><a name="line.4170"></a>
-<span class="sourceLineNo">4171</span>    // Verify that the .regioninfo file is still there<a name="line.4171"></a>
-<span class="sourceLineNo">4172</span>    assertTrue(HRegionFileSystem.REGION_INFO_FILE + " should be present in the region dir",<a name="line.4172"></a>
-<span class="sourceLineNo">4173</span>        fs.exists(regionInfoFile));<a name="line.4173"></a>
-<span class="sourceLineNo">4174</span><a name="line.4174"></a>
-<span class="sourceLineNo">4175</span>    // Remove the .regioninfo file and verify is recreated on region open<a name="line.4175"></a>
-<span class="sourceLineNo">4176</span>    fs.delete(regionInfoFile, true);<a name="line.4176"></a>
-<span class="sourceLineNo">4177</span>    assertFalse(HRegionFileSystem.REGION_INFO_FILE + " should be removed from the region dir",<a name="line.4177"></a>
-<span class="sourceLineNo">4178</span>        fs.exists(regionInfoFile));<a name="line.4178"></a>
-<span class="sourceLineNo">4179</span><a name="line.4179"></a>
-<span class="sourceLineNo">4180</span>    region = HRegion.openHRegion(rootDir, hri, htd, null, CONF);<a name="line.4180"></a>
-<span class="sourceLineNo">4181</span>//    region = TEST_UTIL.openHRegion(hri, htd);<a name="line.4181"></a>
-<span class="sourceLineNo">4182</span>    assertEquals(regionDir, region.getRegionFileSystem().getRegionDir());<a name="line.4182"></a>
-<span class="sourceLineNo">4183</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.4183"></a>
+<span class="sourceLineNo">4162</span>    HRegionInfo hri = new HRegionInfo(htd.getTableName());<a name="line.4162"></a>
+<span class="sourceLineNo">4163</span><a name="line.4163"></a>
+<span class="sourceLineNo">4164</span>    // Create a region and skip the initialization (like CreateTableHandler)<a name="line.4164"></a>
+<span class="sourceLineNo">4165</span>    region = HBaseTestingUtility.createRegionAndWAL(hri, rootDir, CONF, htd, false);<a name="line.4165"></a>
+<span class="sourceLineNo">4166</span>    Path regionDir = region.getRegionFileSystem().getRegionDir();<a name="line.4166"></a>
+<span class="sourceLineNo">4167</span>    FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.4167"></a>
+<span class="sourceLineNo">4168</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.4168"></a>
+<span class="sourceLineNo">4169</span><a name="line.4169"></a>
+<span class="sourceLineNo">4170</span>    Path regionInfoFile = new Path(regionDir, HRegionFileSystem.REGION_INFO_FILE);<a name="line.4170"></a>
+<span class="sourceLineNo">4171</span><a name="line.4171"></a>
+<span class="sourceLineNo">4172</span>    // Verify that the .regioninfo file is present<a name="line.4172"></a>
+<span class="sourceLineNo">4173</span>    assertTrue(HRegionFileSystem.REGION_INFO_FILE + " should be present in the region dir",<a name="line.4173"></a>
+<span class="sourceLineNo">4174</span>        fs.exists(regionInfoFile));<a name="line.4174"></a>
+<span class="sourceLineNo">4175</span><a name="line.4175"></a>
+<span class="sourceLineNo">4176</span>    // Try to open the region<a name="line.4176"></a>
+<span class="sourceLineNo">4177</span>    region = HRegion.openHRegion(rootDir, hri, htd, null, CONF);<a name="line.4177"></a>
+<span class="sourceLineNo">4178</span>    assertEquals(regionDir, region.getRegionFileSystem().getRegionDir());<a name="line.4178"></a>
+<span class="sourceLineNo">4179</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.4179"></a>
+<span class="sourceLineNo">4180</span><a name="line.4180"></a>
+<span class="sourceLineNo">4181</span>    // Verify that the .regioninfo file is still there<a name="line.4181"></a>
+<span class="sourceLineNo">4182</span>    assertTrue(HRegionFileSystem.REGION_INFO_FILE + " should be present in the region dir",<a name="line.4182"></a>
+<span class="sourceLineNo">4183</span>        fs.exists(regionInfoFile));<a name="line.4183"></a>
 <span class="sourceLineNo">4184</span><a name="line.4184"></a>
-<span class="sourceLineNo">4185</span>    // Verify that the .regioninfo file is still there<a name="line.4185"></a>
-<span class="sourceLineNo">4186</span>    assertTrue(HRegionFileSystem.REGION_INFO_FILE + " should be present in the region dir",<a name="line.4186"></a>
-<span class="sourceLineNo">4187</span>        fs.exists(new Path(regionDir, HRegionFileSystem.REGION_INFO_FILE)));<a name="line.4187"></a>
-<span class="sourceLineNo">4188</span><a name="line.4188"></a>
-<span class="sourceLineNo">4189</span>    region = null;<a name="line.4189"></a>
-<span class="sourceLineNo">4190</span>  }<a name="line.4190"></a>
-<span class="sourceLineNo">4191</span><a name="line.4191"></a>
-<span class="sourceLineNo">4192</span>  /**<a name="line.4192"></a>
-<span class="sourceLineNo">4193</span>   * TestCase for increment<a name="line.4193"></a>
-<span class="sourceLineNo">4194</span>   */<a name="line.4194"></a>
-<span class="sourceLineNo">4195</span>  private static class Incrementer implements Runnable {<a name="line.4195"></a>
-<span class="sourceLineNo">4196</span>    private HRegion region;<a name="line.4196"></a>
-<span class="sourceLineNo">4197</span>    private final static byte[] incRow = Bytes.toBytes("incRow");<a name="line.4197"></a>
-<span class="sourceLineNo">4198</span>    private final static byte[] family = Bytes.toBytes("family");<a name="line.4198"></a>
-<span class="sourceLineNo">4199</span>    private final static byte[] qualifier = Bytes.toBytes("qualifier");<a name="line.4199"></a>
-<span class="sourceLineNo">4200</span>    private final static long ONE = 1L;<a name="line.4200"></a>
-<span class="sourceLineNo">4201</span>    private int incCounter;<a name="line.4201"></a>
-<span class="sourceLineNo">4202</span><a name="line.4202"></a>
-<span class="sourceLineNo">4203</span>    public Incrementer(HRegion region, int incCounter) {<a name="line.4203"></a>
-<span class="sourceLineNo">4204</span>      this.region = region;<a name="line.4204"></a>
-<span class="sourceLineNo">4205</span>      this.incCounter = incCounter;<a name="line.4205"></a>
-<span class="sourceLineNo">4206</span>    }<a name="line.4206"></a>
-<span class="sourceLineNo">4207</span><a name="line.4207"></a>
-<span class="sourceLineNo">4208</span>    @Override<a name="line.4208"></a>
-<span class="sourceLineNo">4209</span>    public void run() {<a name="line.4209"></a>
-<span class="sourceLineNo">4210</span>      int count = 0;<a name="line.4210"></a>
-<span class="sourceLineNo">4211</span>      while (count &lt; incCounter) {<a name="line.4211"></a>
-<span class="sourceLineNo">4212</span>        Increment inc = new Increment(incRow);<a name="line.4212"></a>
-<span class="sourceLineNo">4213</span>        inc.addColumn(family, qualifier, ONE);<a name="line.4213"></a>
-<span class="sourceLineNo">4214</span>        count++;<a name="line.4214"></a>
-<span class="sourceLineNo">4215</span>        try {<a name="line.4215"></a>
-<span class="sourceLineNo">4216</span>          region.increment(inc);<a name="line.4216"></a>
-<span class="sourceLineNo">4217</span>        } catch (IOException e) {<a name="line.4217"></a>
-<span class="sourceLineNo">4218</span>          LOG.info("Count=" + count + ", " + e);<a name="line.4218"></a>
-<span class="sourceLineNo">4219</span>          break;<a name="line.4219"></a>
-<span class="sourceLineNo">4220</span>        }<a name="line.4220"></a>
-<span class="sourceLineNo">4221</span>      }<a name="line.4221"></a>
-<span class="sourceLineNo">4222</span>    }<a name="line.4222"></a>
-<span class="sourceLineNo">4223</span>  }<a name="line.4223"></a>
-<span class="sourceLineNo">4224</span><a name="line.4224"></a>
-<span class="sourceLineNo">4225</span>  /**<a name="line.4225"></a>
-<span class="sourceLineNo">4226</span>   * Test case to check increment function with memstore flushing<a name="line.4226"></a>
-<span class="sourceLineNo">4227</span>   * @throws Exception<a name="line.4227"></a>
-<span class="sourceLineNo">4228</span>   */<a name="line.4228"></a>
-<span class="sourceLineNo">4229</span>  @Test<a name="line.4229"></a>
-<span class="sourceLineNo">4230</span>  public void testParallelIncrementWithMemStoreFlush() throws Exception {<a name="line.4230"></a>
-<span class="sourceLineNo">4231</span>    byte[] family = Incrementer.family;<a name="line.4231"></a>
-<span class="sourceLineNo">4232</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.4232"></a>
-<span class="sourceLineNo">4233</span>    final HRegion region = this.region;<a name="line.4233"></a>
-<span class="sourceLineNo">4234</span>    final AtomicBoolean incrementDone = new AtomicBoolean(false);<a name="line.4234"></a>
-<span class="sourceLineNo">4235</span>    Runnable flusher = new Runnable() {<a name="line.4235"></a>
-<span class="sourceLineNo">4236</span>      @Override<a name="line.4236"></a>
-<span class="sourceLineNo">4237</span>      public void run() {<a name="line.4237"></a>
-<span class="sourceLineNo">4238</span>        while (!incrementDone.get()) {<a name="line.4238"></a>
-<span class="sourceLineNo">4239</span>          try {<a name="line.4239"></a>
-<span class="sourceLineNo">4240</span>            region.flush(true);<a name="line.4240"></a>
-<span class="sourceLineNo">4241</span>          } catch (Exception e) {<a name="line.4241"></a>
-<span class="sourceLineNo">4242</span>            e.printStackTrace();<a name="line.4242"></a>
-<span class="sourceLineNo">4243</span>          }<a name="line.4243"></a>
-<span class="sourceLineNo">4244</span>        }<a name="line.4244"></a>
-<span class="sourceLineNo">4245</span>      }<a name="line.4245"></a>
-<span class="sourceLineNo">4246</span>    };<a name="line.4246"></a>
-<span class="sourceLineNo">4247</span><a name="line.4247"></a>
-<span class="sourceLineNo">4248</span>    // after all increment finished, the row will increment to 20*100 = 2000<a name="line.4248"></a>
-<span class="sourceLineNo">4249</span>    int threadNum = 20;<a name="line.4249"></a>
-<span class="sourceLineNo">4250</span>    int incCounter = 100;<a name="line.4250"></a>
-<span class="sourceLineNo">4251</span>    long expected = (long) threadNum * incCounter;<a name="line.4251"></a>
-<span class="sourceLineNo">4252</span>    Thread[] incrementers = new Thread[threadNum];<a name="line.4252"></a>
-<span class="sourceLineNo">4253</span>    Thread flushThread = new Thread(flusher);<a name="line.4253"></a>
-<span class="sourceLineNo">4254</span>    for (int i = 0; i &lt; threadNum; i++) {<a name="line.4254"></a>
-<span class="sourceLineNo">4255</span>      incrementers[i] = new Thread(new Incrementer(this.region, incCounter));<a name="line.4255"></a>
-<span class="sourceLineNo">4256</span>      incrementers[i].start();<a name="line.4256"></a>
-<span class="sourceLineNo">4257</span>    }<a name="line.4257"></a>
-<span class="sourceLineNo">4258</span>    flushThread.start();<a name="line.4258"></a>
-<span class="sourceLineNo">4259</span>    for (int i = 0; i &lt; threadNum; i++) {<a name="line.4259"></a>
-<span class="sourceLineNo">4260</span>      incrementers[i].join();<a name="line.4260"></a>
-<span class="sourceLineNo">4261</span>    }<a name="line.4261"></a>
-<span class="sourceLineNo">4262</span><a name="line.4262"></a>
-<span class="sourceLineNo">4263</span>    incrementDone.set(true);<a name="line.4263"></a>
-<span class="sourceLineNo">4264</span>    flushThread.join();<a name="line.4264"></a>
-<span class="sourceLineNo">4265</span><a name="line.4265"></a>
-<span class="sourceLineNo">4266</span>    Get get = new Get(Incrementer.incRow);<a name="line.4266"></a>
-<span class="sourceLineNo">4267</span>    get.addColumn(Incrementer.family, Incrementer.qualifier);<a name="line.4267"></a>
-<span class="sourceLineNo">4268</span>    get.readVersions(1);<a name="line.4268"></a>
-<span class="sourceLineNo">4269</span>    Result res = this.region.get(get);<a name="line.4269"></a>
-<span class="sourceLineNo">4270</span>    List&lt;Cell&gt; kvs = res.getColumnCells(Incrementer.family, Incrementer.qualifier);<a name="line.4270"></a>
-<span class="sourceLineNo">4271</span><a name="line.4271"></a>
-<span class="sourceLineNo">4272</span>    // we just got the latest version<a name="line.4272"></a>
-<span class="sourceLineNo">4273</span>    assertEquals(1, kvs.size());<a name="line.4273"></a>
-<span class="sourceLineNo">4274</span>    Cell kv = kvs.get(0);<a name="line.4274"></a>
-<span class="sourceLineNo">4275</span>    assertEquals(expected, Bytes.toLong(kv.getValueArray(), kv.getValueOffset()));<a name="line.4275"></a>
-<span class="sourceLineNo">4276</span>  }<a name="line.4276"></a>
-<span class="sourceLineNo">4277</span><a name="line.4277"></a>
-<span class="sourceLineNo">4278</span>  /**<a name="line.4278"></a>
-<span class="sourceLineNo">4279</span>   * TestCase for append<a name="line.4279"></a>
-<span class="sourceLineNo">4280</span>   */<a name="line.4280"></a>
-<span class="sourceLineNo">4281</span>  private static class Appender implements Runnable {<a name="line.4281"></a>
-<span class="sourceLineNo">4282</span>    private HRegion region;<a name="line.4282"></a>
-<span class="sourceLineNo">4283</span>    private final static byte[] appendRow = Bytes.toBytes("appendRow");<a name="line.4283"></a>
-<span class="sourceLineNo">4284</span>    private final static byte[] family = Bytes.toBytes("family");<a name="line.4284"></a>
-<span class="sourceLineNo">4285</span>    private final static byte[] qualifier = Bytes.toBytes("qualifier");<a name="line.4285"></a>
-<span class="sourceLineNo">4286</span>    private final static byte[] CHAR = Bytes.toBytes("a");<a name="line.4286"></a>
-<span class="sourceLineNo">4287</span>    private int appendCounter;<a name="line.4287"></a>
-<span class="sourceLineNo">4288</span><a name="line.4288"></a>
-<span class="sourceLineNo">4289</span>    public Appender(HRegion region, int appendCounter) {<a name="line.4289"></a>
-<span class="sourceLineNo">4290</span>      this.region = region;<a name="line.4290"></a>
-<span class="sourceLineNo">4291</span>      this.appendCounter = appendCounter;<a name="line.4291"></a>
-<span class="sourceLineNo">4292</span>    }<a name="line.4292"></a>
-<span class="sourceLineNo">4293</span><a name="line.4293"></a>
-<span class="sourceLineNo">4294</span>    @Override<a name="line.4294"></a>
-<span class="sourceLineNo">4295</span>    public void run() {<a name="line.4295"></a>
-<span class="sourceLineNo">4296</span>      int count = 0;<a name="line.4296"></a>
-<span class="sourceLineNo">4297</span>      while (count &lt; appendCounter) {<a name="line.4297"></a>
-<span class="sourceLineNo">4298</span>        Append app = new Append(appendRow);<a name="line.4298"></a>
-<span class="sourceLineNo">4299</span>        app.addColumn(family, qualifier, CHAR);<a name="line.4299"></a>
-<span class="sourceLineNo">4300</span>        count++;<a name="line.4300"></a>
-<span class="sourceLineNo">4301</span>        try {<a name="line.4301"></a>
-<span class="sourceLineNo">4302</span>          region.append(app);<a name="line.4302"></a>
-<span class="sourceLineNo">4303</span>        } catch (IOException e) {<a name="line.4303"></a>
-<span class="sourceLineNo">4304</span>          LOG.info("Count=" + count + ", max=" + appendCounter + ", " + e);<a name="line.4304"></a>
-<span class="sourceLineNo">4305</span>          break;<a name="line.4305"></a>
-<span class="sourceLineNo">4306</span>        }<a name="line.4306"></a>
-<span class="sourceLineNo">4307</span>      }<a name="line.4307"></a>
-<span class="sourceLineNo">4308</span>    }<a name="line.4308"></a>
-<span class="sourceLineNo">4309</span>  }<a name="line.4309"></a>
-<span class="sourceLineNo">4310</span><a name="line.4310"></a>
-<span class="sourceLineNo">4311</span>  /**<a name="line.4311"></a>
-<span class="sourceLineNo">4312</span>   * Test case to check append function with memstore flushing<a name="line.4312"></a>
-<span class="sourceLineNo">4313</span>   * @throws Exception<a name="line.4313"></a>
-<span class="sourceLineNo">4314</span>   */<a name="line.4314"></a>
-<span class="sourceLineNo">4315</span>  @Test<a name="line.4315"></a>
-<span class="sourceLineNo">4316</span>  public void testParallelAppendWithMemStoreFlush() throws Exception {<a name="line.4316"></a>
-<span class="sourceLineNo">4317</span>    byte[] family = Appender.family;<a name="line.4317"></a>
-<span class="sourceLineNo">4318</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.4318"></a>
-<span class="sourceLineNo">4319</span>    final HRegion region = this.region;<a name="line.4319"></a>
-<span class="sourceLineNo">4320</span>    final AtomicBoolean appendDone = new AtomicBoolean(false);<a name="line.4320"></a>
-<span class="sourceLineNo">4321</span>    Runnable flusher = new Runnable() {<a name="line.4321"></a>
-<span class="sourceLineNo">4322</span>      @Override<a name="line.4322"></a>
-<span class="sourceLineNo">4323</span>      public void run() {<a name="line.4323"></a>
-<span class="sourceLineNo">4324</span>        while (!appendDone.get()) {<a name="line.4324"></a>
-<span class="sourceLineNo">4325</span>          try {<a name="line.4325"></a>
-<span class="sourceLineNo">4326</span>            region.flush(true);<a name="line.4326"></a>
-<span class="sourceLineNo">4327</span>          } catch (Exception e) {<a name="line.4327"></a>
-<span class="sourceLineNo">4328</span>            e.printStackTrace();<a name="line.4328"></a>
-<span class="sourceLineNo">4329</span>          }<a name="line.4329"></a>
-<span class="sourceLineNo">4330</span>        }<a name="line.4330"></a>
-<span class="sourceLineNo">4331</span>      }<a name="line.4331"></a>
-<span class="sourceLineNo">4332</span>    };<a name="line.4332"></a>
-<span class="sourceLineNo">4333</span><a name="line.4333"></a>
-<span class="sourceLineNo">4334</span>    // After all append finished, the value will append to threadNum *<a name="line.4334"></a>
-<span class="sourceLineNo">4335</span>    // appendCounter Appender.CHAR<a name="line.4335"></a>
-<span class="sourceLineNo">4336</span>    int threadNum = 20;<a name="line.4336"></a>
-<span class="sourceLineNo">4337</span>    int appendCounter = 100;<a name="line.4337"></a>
-<span class="sourceLineNo">4338</span>    byte[] expected = new byte[threadNum * appendCounter];<a name="line.4338"></a>
-<span class="sourceLineNo">4339</span>    for (int i = 0; i &lt; threadNum * appendCounter; i++) {<a name="line.4339"></a>
-<span class="sourceLineNo">4340</span>      System.arraycopy(Appender.CHAR, 0, expected, i, 1);<a name="line.4340"></a>
-<span class="sourceLineNo">4341</span>    }<a name="line.4341"></a>
-<span class="sourceLineNo">4342</span>    Thread[] appenders = new Thread[threadNum];<a name="line.4342"></a>
-<span class="sourceLineNo">4343</span>    Thread flushThread = new Thread(flusher);<a name="line.4343"></a>
-<span class="sourceLineNo">4344</span>    for (int i = 0; i &lt; threadNum; i++) {<a name="line.4344"></a>
-<span class="sourceLineNo">4345</span>      appenders[i] = new Thread(new Appender(this.region, appendCounter));<a name="line.4345"></a>
-<span class="sourceLineNo">4346</span>      appenders[i].start();<a name="line.4346"></a>
-<span class="sourceLineNo">4347</span>    }<a name="line.4347"></a>
-<span class="sourceLineNo">4348</span>    flushThread.start();<a name="line.4348"></a>
-<span class="sourceLineNo">4349</span>    for (int i = 0; i &lt; threadNum; i++) {<a name="line.4349"></a>
-<span class="sourceLineNo">4350</span>      appenders[i].join();<a name="line.4350"></a>
+<span class="sourceLineNo">4185</span>    // Remove the .regioninfo file and verify is recreated on region open<a name="line.4185"></a>
+<span class="sourceLineNo">4186</span>    fs.delete(regionInfoFile, true);<a name="line.4186"></a>
+<span class="sourceLineNo">4187</span>    assertFalse(HRegionFileSystem.REGION_INFO_FILE + " should be removed from the region dir",<a name="line.4187"></a>
+<span class="sourceLineNo">4188</span>        fs.exists(regionInfoFile));<a name="line.4188"></a>
+<span class="sourceLineNo">4189</span><a name="line.4189"></a>
+<span class="sourceLineNo">4190</span>    region = HRegion.openHRegion(rootDir, hri, htd, null, CONF);<a name="line.4190"></a>
+<span class="sourceLineNo">4191</span>//    region = TEST_UTIL.openHRegion(hri, htd);<a name="line.4191"></a>
+<span class="sourceLineNo">4192</span>    assertEquals(regionDir, region.getRegionFileSystem().getRegionDir());<a name="line.4192"></a>
+<span class="sourceLineNo">4193</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.4193"></a>
+<span class="sourceLineNo">4194</span><a name="line.4194"></a>
+<span class="sourceLineNo">4195</span>    // Verify that the .regioninfo file is still there<a name="line.4195"></a>
+<span class="sourceLineNo">4196</span>    assertTrue(HRegionFileSystem.REGION_INFO_FILE + " should be present in the region dir",<a name="line.4196"></a>
+<span class="sourceLineNo">4197</span>        fs.exists(new Path(regionDir, HRegionFileSystem.REGION_INFO_FILE)));<a name="line.4197"></a>
+<span class="sourceLineNo">4198</span><a name="line.4198"></a>
+<span class="sourceLineNo">4199</span>    region = null;<a name="line.4199"></a>
+<span class="sourceLineNo">4200</span>  }<a name="line.4200"></a>
+<span class="sourceLineNo">4201</span><a name="line.4201"></a>
+<span class="sourceLineNo">4202</span>  /**<a name="line.4202"></a>
+<span class="sourceLineNo">4203</span>   * TestCase for increment<a name="line.4203"></a>
+<span class="sourceLineNo">4204</span>   */<a name="line.4204"></a>
+<span class="sourceLineNo">4205</span>  private static class Incrementer implements Runnable {<a name="line.4205"></a>
+<span class="sourceLineNo">4206</span>    private HRegion region;<a name="line.4206"></a>
+<span class="sourceLineNo">4207</span>    private final static byte[] incRow = Bytes.toBytes("incRow");<a name="line.4207"></a>
+<span class="sourceLineNo">4208</span>    private final static byte[] family = Bytes.toBytes("family");<a name="line.4208"></a>
+<span class="sourceLineNo">4209</span>    private final static byte[] qualifier = Bytes.toBytes("qualifier");<a name="line.4209"></a>
+<span class="sourceLineNo">4210</span>    private final static long ONE = 1L;<a name="line.4210"></a>
+<span class="sourceLineNo">4211</span>    private int incCounter;<a name="line.4211"></a>
+<span class="sourceLineNo">4212</span><a name="line.4212"></a>
+<span class="sourceLineNo">4213</span>    public Incrementer(HRegion region, int incCounter) {<a name="line.4213"></a>
+<span class="sourceLineNo">4214</span>      this.region = region;<a name="line.4214"></a>
+<span class="sourceLineNo">4215</span>      this.incCounter = incCounter;<a name="line.4215"></a>
+<span class="sourceLineNo">4216</span>    }<a name="line.4216"></a>
+<span class="sourceLineNo">4217</span><a name="line.4217"></a>
+<span class="sourceLineNo">4218</span>    @Override<a name="line.4218"></a>
+<span class="sourceLineNo">4219</span>    public void run() {<a name="line.4219"></a>
+<span class="sourceLineNo">4220</span>      int count = 0;<a name="line.4220"></a>
+<span class="sourceLineNo">4221</span>      while (count &lt; incCounter) {<a name="line.4221"></a>
+<span class="sourceLineNo">4222</span>        Increment inc = new Increment(incRow);<a name="line.4222"></a>
+<span class="sourceLineNo">4223</span>        inc.addColumn(family, qualifier, ONE);<a name="line.4223"></a>
+<span class="sourceLineNo">4224</span>        count++;<a name="line.4224"></a>
+<span class="sourceLineNo">4225</span>        try {<a name="line.4225"></a>
+<span class="sourceLineNo">4226</span>          region.increment(inc);<a name="line.4226"></a>
+<span class="sourceLineNo">4227</span>        } catch (IOException e) {<a name="line.4227"></a>
+<span class="sourceLineNo">4228</span>          LOG.info("Count=" + count + ", " + e);<a name="line.4228"></a>
+<span class="sourceLineNo">4229</span>          break;<a name="line.4229"></a>
+<span class="sourceLineNo">4230</span>        }<a name="line.4230"></a>
+<span class="sourceLineNo">4231</span>      }<a name="line.4231"></a>
+<span class="sourceLineNo">4232</span>    }<a name="line.4232"></a>
+<span class="sourceLineNo">4233</span>  }<a name="line.4233"></a>
+<span class="sourceLineNo">4234</span><a name="line.4234"></a>
+<span class="sourceLineNo">4235</span>  /**<a name="line.4235"></a>
+<span class="sourceLineNo">4236</span>   * Test case to check increment function with memstore flushing<a name="line.4236"></a>
+<span class="sourceLineNo">4237</span>   * @throws Exception<a name="line.4237"></a>
+<span class="sourceLineNo">4238</span>   */<a name="line.4238"></a>
+<span class="sourceLineNo">4239</span>  @Test<a name="line.4239"></a>
+<span class="sourceLineNo">4240</span>  public void testParallelIncrementWithMemStoreFlush() throws Exception {<a name="line.4240"></a>
+<span class="sourceLineNo">4241</span>    byte[] family = Incrementer.family;<a name="line.4241"></a>
+<span class="sourceLineNo">4242</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.4242"></a>
+<span class="sourceLineNo">4243</span>    final HRegion region = this.region;<a name="line.4243"></a>
+<span class="sourceLineNo">4244</span>    final AtomicBoolean incrementDone = new AtomicBoolean(false);<a name="line.4244"></a>
+<span class="sourceLineNo">4245</span>    Runnable flusher = new Runnable() {<a name="line.4245"></a>
+<span class="sourceLineNo">4246</span>      @Override<a name="line.4246"></a>
+<span class="sourceLineNo">4247</span>      public void run() {<a name="line.4247"></a>
+<span class="sourceLineNo">4248</span>        while (!incrementDone.get()) {<a name="line.4248"></a>
+<span class="sourceLineNo">4249</span>          try {<a name="line.4249"></a>
+<span class="sourceLineNo">4250</span>            region.flush(true);<a name="line.4250"></a>
+<span class="sourceLineNo">4251</span>          } catch (Exception e) {<a name="line.4251"></a>
+<span class="sourceLineNo">4252</span>            e.printStackTrace();<a name="line.4252"></a>
+<span class="sourceLineNo">4253</span>          }<a name="line.4253"></a>
+<span class="sourceLineNo">4254</span>        }<a name="line.4254"></a>
+<span class="sourceLineNo">4255</span>      }<a name="line.4255"></a>
+<span class="sourceLineNo">4256</span>    };<a name="line.4256"></a>
+<span class="sourceLineNo">4257</span><a name="line.4257"></a>
+<span class="sourceLineNo">4258</span>    // after all increment finished, the row will increment to 20*100 = 2000<a name="line.4258"></a>
+<span class="sourceLineNo">4259</span>    int threadNum = 20;<a name="line.4259"></a>
+<span class="sourceLineNo">4260</span>    int incCounter = 100;<a name="line.4260"></a>
+<span class="sourceLineNo">4261</span>    long expected = (long) threadNum * incCounter;<a name="line.4261"></a>
+<span class="sourceLineNo">4262</span>    Thread[] incrementers = new Thread[threadNum];<a name="line.4262"></a>
+<span class="sourceLineNo">4263</span>    Thread flushThread = new Thread(flusher);<a name="line.4263"></a>
+<span class="sourceLineNo">4264</span>    for (int i = 0; i &lt; threadNum; i++) {<a name="line.4264"></a>
+<span class="sourceLineNo">4265</span>      incrementers[i] = new Thread(new Incrementer(this.region, incCounter));<a name="line.4265"></a>
+<span class="sourceLineNo">4266</span>      incrementers[i].start();<a name="line.4266"></a>
+<span class="sourceLineNo">4267</span>    }<a name="line.4267"></a>
+<span class="sourceLineNo">4268</span>    flushThread.start();<a name="line.4268"></a>
+<span class="sourceLineNo">4269</span>    for (int i = 0; i &lt; threadNum; i++) {<a name="line.4269"></a>
+<span class="sourceLineNo">4270</span>      incrementers[i].join();<a name="line.4270"></a>
+<span class="sourceLineNo">4271</span>    }<a name="line.4271"></a>
+<span class="sourceLineNo">4272</span><a name="line.4272"></a>
+<span class="sourceLineNo">4273</span>    incrementDone.set(true);<a name="line.4273"></a>
+<span class="sourceLineNo">4274</span>    flushThread.join();<a name="line.4274"></a>
+<span class="sourceLineNo">4275</span><a name="line.4275"></a>
+<span class="sourceLineNo">4276</span>    Get get = new Get(Incrementer.incRow);<a name="line.4276"></a>
+<span class="sourceLineNo">4277</span>    get.addColumn(Incrementer.family, Incrementer.qualifier);<a name="line.4277"></a>
+<span class="sourceLineNo">4278</span>    get.readVersions(1);<a name="line.4278"></a>
+<span class="sourceLineNo">4279</span>    Result res = this.region.get(get);<a name="line.4279"></a>
+<span class="sourceLineNo">4280</span>    List&lt;Cell&gt; kvs = res.getColumnCells(Incrementer.family, Incrementer.qualifier);<a name="line.4280"></a>
+<span class="sourceLineNo">4281</span><a name="line.4281"></a>
+<span class="sourceLineNo">4282</span>    // we just got the latest version<a name="line.4282"></a>
+<span class="sourceLineNo">4283</span>    assertEquals(1, kvs.size());<a name="line.4283"></a>
+<span class="sourceLineNo">4284</span>    Cell kv = kvs.get(0);<a name="line.4284"></a>
+<span class="sourceLineNo">4285</span>    assertEquals(expected, Bytes.toLong(kv.getValueArray(), kv.getValueOffset()));<a name="line.4285"></a>
+<span class="sourceLineNo">4286</span>  }<a name="line.4286"></a>
+<span class="sourceLineNo">4287</span><a name="line.4287"></a>
+<span class="sourceLineNo">4288</span>  /**<a name="line.4288"></a>
+<span class="sourceLineNo">4289</span>   * TestCase for append<a name="line.4289"></a>
+<span class="sourceLineNo">4290</span>   */<a name="line.4290"></a>
+<span class="sourceLineNo">4291</span>  private static class Appender implements Runnable {<a name="line.4291"></a>
+<span class="sourceLineNo">4292</span>    private HRegion region;<a name="line.4292"></a>
+<span class="sourceLineNo">4293</span>    private final static byte[] appendRow = Bytes.toBytes("appendRow");<a name="line.4293"></a>
+<span class="sourceLineNo">4294</span>    private final static byte[] family = Bytes.toBytes("family");<a name="line.4294"></a>
+<span class="sourceLineNo">4295</span>    private final static byte[] qualifier = Bytes.toBytes("qualifier");<a name="line.4295"></a>
+<span class="sourceLineNo">4296</span>    private final static byte[] CHAR = Bytes.toBytes("a");<a name="line.4296"></a>
+<span class="sourceLineNo">4297</span>    private int appendCounter;<a name="line.4297"></a>
+<span class="sourceLineNo">4298</span><a name="line.4298"></a>
+<span class="sourceLineNo">4299</span>    public Appender(HRegion region, int appendCounter) {<a name="line.4299"></a>
+<span class="sourceLineNo">4300</span>      this.region = region;<a name="line.4300"></a>
+<span class="sourceLineNo">4301</span>      this.appendCounter = appendCounter;<a name="line.4301"></a>
+<span class="sourceLineNo">4302</span>    }<a name="line.4302"></a>
+<span class="sourceLineNo">4303</span><a name="line.4303"></a>
+<span class="sourceLineNo">4304</span>    @Override<a name="line.4304"></a>
+<span class="sourceLineNo">4305</span>    public void run() {<a name="line.4305"></a>
+<span class="sourceLineNo">4306</span>      int count = 0;<a name="line.4306"></a>
+<span class="sourceLineNo">4307</span>      while (count &lt; appendCounter) {<a name="line.4307"></a>
+<span class="sourceLineNo">4308</span>        Append app = new Append(appendRow);<a name="line.4308"></a>
+<span class="sourceLineNo">4309</span>        app.addColumn(family, qualifier, CHAR);<a name="line.4309"></a>
+<span class="sourceLineNo">4310</span>        count++;<a name="line.4310"></a>
+<span class="sourceLineNo">4311</span>        try {<a name="line.4311"></a>
+<span class="sourceLineNo">4312</span>          region.append(app);<a name="line.4312"></a>
+<span class="sourceLineNo">4313</span>        } catch (IOException e) {<a name="line.4313"></a>
+<span class="sourceLineNo">4314</span>          LOG.info("Count=" + count + ", max=" + appendCounter + ", " + e);<a name="line.4314"></a>
+<span class="sourceLineNo">4315</span>          break;<a name="line.4315"></a>
+<span class="sourceLineNo">4316</span>        }<a name="line.4316"></a>
+<span class="sourceLineNo">4317</span>      }<a name="line.4317"></a>
+<span class="sourceLineNo">4318</span>    }<a name="line.4318"></a>
+<span class="sourceLineNo">4319</span>  }<a name="line.4319"></a>
+<span class="sourceLineNo">4320</span><a name="line.4320"></a>
+<span class="sourceLineNo">4321</span>  /**<a name="line.4321"></a>
+<span class="sourceLineNo">4322</span>   * Test case to check append function with memstore flushing<a name="line.4322"></a>
+<span class="sourceLineNo">4323</span>   * @throws Exception<a name="line.4323"></a>
+<span class="sourceLineNo">4324</span>   */<a name="line.4324"></a>
+<span class="sourceLineNo">4325</span>  @Test<a name="line.4325"></a>
+<span class="sourceLineNo">4326</span>  public void testParallelAppendWithMemStoreFlush() throws Exception {<a name="line.4326"></a>
+<span class="sourceLineNo">4327</span>    byte[] family = Appender.family;<a name="line.4327"></a>
+<span class="sourceLineNo">4328</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.4328"></a>
+<span class="sourceLineNo">4329</span>    final HRegion region = this.region;<a name="line.4329"></a>
+<span class="sourceLineNo">4330</span>    final AtomicBoolean appendDone = new AtomicBoolean(false);<a name="line.4330"></a>
+<span class="sourceLineNo">4331</span>    Runnable flusher = new Runnable() {<a name="line.4331"></a>
+<span class="sourceLineNo">4332</span>      @Override<a name="line.4332"></a>
+<span class="sourceLineNo">4333</span>      public void run() {<a name="line.4333"></a>
+<span class="sourceLineNo">4334</span>        while (!appendDone.get()) {<a name="line.4334"></a>
+<span class="sourceLineNo">4335</span>          try {<a name="line.4335"></a>
+<span class="sourceLineNo">4336</span>            region.flush(true);<a name="line.4336"></a>
+<span class="sourceLineNo">4337</span>          } catch (Exception e) {<a name="line.4337"></a>
+<span class="sourceLineNo">4338</span>            e.printStackTrace();<a name="line.4338"></a>
+<span class="sourceLineNo">4339</span>          }<a name="line.4339"></a>
+<span class="sourceLineNo">4340</span>        }<a name="line.4340"></a>
+<span class="sourceLineNo">4341</span>      }<a name="line.4341"></a>
+<span class="sourceLineNo">4342</span>    };<a name="line.4342"></a>
+<span class="sourceLineNo">4343</span><a name="line.4343"></a>
+<span class="sourceLineNo">4344</span>    // After all append finished, the value will append to threadNum *<a name="line.4344"></a>
+<span class="sourceLineNo">4345</span>    // appendCounter Appender.CHAR<a name="line.4345"></a>
+<span class="sourceLineNo">4346</span>    int threadNum = 20;<a name="line.4346"></a>
+<span class="sourceLineNo">4347</span>    int appendCounter = 100;<a name="line.4347"></a>
+<span class="sourceLineNo">4348</span>    byte[] expected = new byte[threadNum * appendCounter];<a name="line.4348"></a>
+<span class="sourceLineNo">4349</span>    for (int i = 0; i &lt; threadNum * appendCounter; i++) {<a name="line.4349"></a>
+<span class="sourceLineNo">4350</span>      System.arraycopy(Appender.CHAR, 0, expected, i, 1);<a name="line.4350"></a>
 <span class="sourceLineNo">4351</span>    }<a name="line.4351"></a>
-<span class="sourceLineNo">4352</span><a name="line.4352"></a>
-<span class="sourceLineNo">4353</span>    appendDone.set(true);<a name="line.4353"></a>
-<span class="sourceLineNo">4354</span>    flushThread.join();<a name="line.4354"></a>
-<span class="sourceLineNo">4355</span><a name="line.4355"></a>
-<span class="sourceLineNo">4356</span>    Get get = new Get(Appender.appendRow);<a name="line.4356"></a>
-<span class="sourceLineNo">4357</span>    get.addColumn(Appender.family, Appender.qualifier);<a name="line.4357"></a>
-<span class="sourceLineNo">4358</span>    get.readVersions(1);<a name="line.4358"></a>
-<span class="sourceLineNo">4359</span>    Result res = this.region.get(get);<a name="line.4359"></a>
-<span class="sourceLineNo">4360</span>    List&lt;Cell&gt; kvs = res.getColumnCells(Appender.family, Appender.qualifier);<a name="line.4360"></a>
-<span class="sourceLineNo">4361</span><a name="line.4361"></a>
-<span class="sourceLineNo">4362</span>    // we just got the latest version<a name="line.4362"></a>
-<span class="sourceLineNo">4363</span>    assertEquals(1, kvs.size());<a name="line.4363"></a>
-<span class="sourceLineNo">4364</span>    Cell kv = kvs.get(0);<a name="line.4364"></a>
-<span class="sourceLineNo">4365</span>    byte[] appendResult = new byte[kv.getValueLength()];<a name="line.4365"></a>
-<span class="sourceLineNo">4366</span>    System.arraycopy(kv.getValueArray(), kv.getValueOffset(), appendResult, 0, kv.getValueLength());<a name="line.4366"></a>
-<span class="sourceLineNo">4367</span>    assertArrayEquals(expected, appendResult);<a name="line.4367"></a>
-<span class="sourceLineNo">4368</span>  }<a name="line.4368"></a>
-<span class="sourceLineNo">4369</span><a name="line.4369"></a>
-<span class="sourceLineNo">4370</span>  /**<a name="line.4370"></a>
-<span class="sourceLineNo">4371</span>   * Test case to check put function with memstore flushing for same row, same ts<a name="line.4371"></a>
-<span class="sourceLineNo">4372</span>   * @throws Exception<a name="line.4372"></a>
-<span class="sourceLineNo">4373</span>   */<a name="line.4373"></a>
-<span class="sourceLineNo">4374</span>  @Test<a name="line.4374"></a>
-<span class="sourceLineNo">4375</span>  public void testPutWithMemStoreFlush() throws Exception {<a name="line.4375"></a>
-<span class="sourceLineNo">4376</span>    byte[] family = Bytes.toBytes("family");<a name="line.4376"></a>
-<span class="sourceLineNo">4377</span>    byte[] qualifier = Bytes.toBytes("qualifier");<a name="line.4377"></a>
-<span class="sourceLineNo">4378</span>    byte[] row = Bytes.toBytes("putRow");<a name="line.4378"></a>
-<span class="sourceLineNo">4379</span>    byte[] value = null;<a name="line.4379"></a>
-<span class="sourceLineNo">4380</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.4380"></a>
-<span class="sourceLineNo">4381</span>    Put put = null;<a name="line.4381"></a>
-<span class="sourceLineNo">4382</span>    Get get = null;<a name="line.4382"></a>
-<span class="sourceLineNo">4383</span>    List&lt;Cell&gt; kvs = null;<a name="line.4383"></a>
-<span class="sourceLineNo">4384</span>    Result res = null;<a name="line.4384"></a>
-<span class="sourceLineNo">4385</span><a name="line.4385"></a>
-<span class="sourceLineNo">4386</span>    put = new Put(row);<a name="line.4386"></a>
-<span class="sourceLineNo">4387</span>    value = Bytes.toBytes("value0");<a name="line.4387"></a>
-<span class="sourceLineNo">4388</span>    put.addColumn(family, qualifier, 1234567L, value);<a name="line.4388"></a>
-<span class="sourceLineNo">4389</span>    region.put(put);<a name="line.4389"></a>
-<span class="sourceLineNo">4390</span>    get = new Get(row);<a name="line.4390"></a>
-<span class="sourceLineNo">4391</span>    get.addColumn(family, qualifier);<a name="line.4391"></a>
-<span class="sourceLineNo">4392</span>    get.readAllVersions();<a name="line.4392"></a>
-<span class="sourceLineNo">4393</span>    res = this.region.get(get);<a name="line.4393"></a>
-<span class="sourceLineNo">4394</span>    kvs = res.getColumnCells(family, qualifier);<a name="line.4394"></a>
-<span class="sourceLineNo">4395</span>    assertEquals(1, kvs.size());<a name="line.4395"></a>
-<span class="sourceLineNo">4396</span>    assertArrayEquals(Bytes.toBytes("value0"), CellUtil.cloneValue(kvs.get(0)));<a name="line.4396"></a>
-<span class="sourceLineNo">4397</span><a name="line.4397"></a>
-<span class="sourceLineNo">4398</span>    region.flush(true);<a name="line.4398"></a>
-<span class="sourceLineNo">4399</span>    get = new Get(row);<a name="line.4399"></a>
-<span class="sourceLineNo">4400</span>    get.addColumn(family, qualifier);<a name="line.4400"></a>
-<span class="sourceLineNo">4401</span>    get.readAllVersions();<a name="line.4401"></a>
-<span class="sourceLineNo">4402</span>    res = this.region.get(get);<a name="line.4402"></a>
-<span class="sourceLineNo">4403</span>    kvs = res.getColumnCells(family, qualifier);<a name="line.4403"></a>
-<span class="sourceLineNo">4404</span>    assertEquals(1, kvs.size());<a name="line.4404"></a>
-<span class="sourceLineNo">4405</span>    assertArrayEquals(Bytes.toBytes("value0"), CellUtil.cloneValue(kvs.get(0)));<a name="line.4405"></a>
-<span class="sourceLineNo">4406</span><a name="line.4406"></a>
-<span class="sourceLineNo">4407</span>    put = new Put(row);<a name="line.4407"></a>
-<span class="sourceLineNo">4408</span>    value = Bytes.toBytes("value1");<a name="line.4408"></a>
-<span class="sourceLineNo">4409</span>    put.addColumn(family, qualifier, 1234567L, value);<a name="line.4409"></a>
-<span class="sourceLineNo">4410</span>    region.put(put);<a name="line.4410"></a>
-<span class="sourceLineNo">4411</span>    get = new Get(row);<a name="line.4411"></a>
-<span class="sourceLineNo">4412</span>    get.addColumn(family, qualifier);<a name="line.4412"></a>
-<span class="sourceLineNo">4413</span>    get.readAllVersions();<a name="line.4413"></a>
-<span class="sourceLineNo">4414</span>    res = this.region.get(get);<a name="line.4414"></a>
-<span class="sourceLineNo">4415</span>    kvs = res.getColumnCells(family, qualifier);<a name="line.4415"></a>
-<span class="sourceLineNo">4416</span>    assertEquals(1, kvs.size());<a name="line.4416"></a>
-<span class="sourceLineNo">4417</span>    assertArrayEquals(Bytes.toBytes("value1"), CellUtil.cloneValue(kvs.get(0)));<a name="line.4417"></a>
-<span class="sourceLineNo">4418</span><a name="line.4418"></a>
-<span class="sourceLineNo">4419</span>    region.flush(true);<a name="line.4419"></a>
-<span class="sourceLineNo">4420</span>    get = new Get(row);<a name="line.4420"></a>
-<span class="sourceLineNo">4421</span>    get.addColumn(family, qualifier);<a name="line.4421"></a>
-<span class="sourceLineNo">4422</span>    get.readAllVersions();<a name="line.4422"></a>
-<span class="sourceLineNo">4423</span>    res = this.region.get(get);<a name="line.4423"></a>
-<span class="sourceLineNo">4424</span>    kvs = res.getColumnCells(family, qualifier);<a name="line.4424"></a>
-<span class="sourceLineNo">4425</span>    assertEquals(1, kvs.size());<a name="line.4425"></a>
-<span class="sourceLineNo">4426</span>    assertArrayEquals(Bytes.toBytes("value1"), CellUtil.cloneValue(kvs.get(0)));<a name="line.4426"></a>
-<span class="sourceLineNo">4427</span>  }<a name="line.4427"></a>
+<span class="sourceLineNo">4352</span>    Thread[] appenders = new Thread[threadNum];<a name="line.4352"></a>
+<span class="sourceLineNo">4353</span>    Thread flushThread = new Thread(flusher);<a name="line.4353"></a>
+<span class="sourceLineNo">4354</span>    for (int i = 0; i &lt; threadNum; i++) {<a name="line.4354"></a>
+<span class="sourceLineNo">4355</span>      appenders[i] = new Thread(new Appender(this.region, appendCounter));<a name="line.4355"></a>
+<span class="sourceLineNo">4356</span>      appenders[i].start();<a name="line.4356"></a>
+<span class="sourceLineNo">4357</span>    }<a name="line.4357"></a>
+<span class="sourceLineNo">4358</span>    flushThread.start();<a name="line.4358"></a>
+<span class="sourceLineNo">4359</span>    for (int i = 0; i &lt; threadNum; i++) {<a name="line.4359"></a>
+<span class="sourceLineNo">4360</span>      appenders[i].join();<a name="line.4360"></a>
+<span class="sourceLineNo">4361</span>    }<a name="line.4361"></a>
+<span class="sourceLineNo">4362</span><a name="line.4362"></a>
+<span class="sourceLineNo">4363</span>    appendDone.set(true);<a name="line.4363"></a>
+<span class="sourceLineNo">4364</span>    flushThread.join();<a name="line.4364"></a>
+<span class="sourceLineNo">4365</span><a name="line.4365"></a>
+<span class="sourceLineNo">4366</span>    Get get = new Get(Appender.appendRow);<a name="line.4366"></a>
+<span class="sourceLineNo">4367</span>    get.addColumn(Appender.family, Appender.qualifier);<a name="line.4367"></a>
+<span class="sourceLineNo">4368</span>    get.readVersions(1);<a name="line.4368"></a>
+<span class="sourceLineNo">4369</span>    Result res = this.region.get(get);<a name="line.4369"></a>
+<span class="sourceLineNo">4370</span>    List&lt;Cell&gt; kvs = res.getColumnCells(Appender.family, Appender.qualifier);<a name="line.4370"></a>
+<span class="sourceLineNo">4371</span><a name="line.4371"></a>
+<span class="sourceLineNo">4372</span>    // we just got the latest version<a name="line.4372"></a>
+<span class="sourceLineNo">4373</span>    assertEquals(1, kvs.size());<a name="line.4373"></a>
+<span class="sourceLineNo">4374</span>    Cell kv = kvs.get(0);<a name="line.4374"></a>
+<span class="sourceLineNo">4375</span>    byte[] appendResult = new byte[kv.getValueLength()];<a name="line.4375"></a>
+<span class="sourceLineNo">4376</span>    System.arraycopy(kv.getValueArray(), kv.getValueOffset(), appendResult, 0, kv.getValueLength());<a name="line.4376"></a>
+<span class="sourceLineNo">4377</span>    assertArrayEquals(expected, appendResult);<a name="line.4377"></a>
+<span class="sourceLineNo">4378</span>  }<a name="line.4378"></a>
+<span class="sourceLineNo">4379</span><a name="line.4379"></a>
+<span class="sourceLineNo">4380</span>  /**<a name="line.4380"></a>
+<span class="sourceLineNo">4381</span>   * Test case to check put function with memstore flushing for same row, same ts<a name="line.4381"></a>
+<span class="sourceLineNo">4382</span>   * @throws Exception<a name="line.4382"></a>
+<span class="sourceLineNo">4383</span>   */<a name="line.4383"></a>
+<span class="sourceLineNo">4384</span>  @Test<a name="line.4384"></a>
+<span class="sourceLineNo">4385</span>  public void testPutWithMemStoreFlush() throws Exception {<a name="line.4385"></a>
+<span class="sourceLineNo">4386</span>    byte[] family = Bytes.toBytes("family");<a name="line.4386"></a>
+<span class="sourceLineNo">4387</span>    byte[] qualifier = Bytes.toBytes("qualifier");<a name="line.4387"></a>
+<span class="sourceLineNo">4388</span>    byte[] row = Bytes.toBytes("putRow");<a name="line.4388"></a>
+<span class="sourceLineNo">4389</span>    byte[] value = null;<a name="line.4389"></a>
+<span class="sourceLineNo">4390</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.4390"></a>
+<span class="sourceLineNo">4391</span>    Put put = null;<a name="line.4391"></a>
+<span class="sourceLineNo">4392</span>    Get get = null;<a name="line.4392"></a>
+<span class="sourceLineNo">4393</span>    List&lt;Cell&gt; kvs = null;<a name="line.4393"></a>
+<span class="sourceLineNo">4394</span>    Result res = null;<a name="line.4394"></a>
+<span class="sourceLineNo">4395</span><a name="line.4395"></a>
+<span class="sourceLineNo">4396</span>    put = new Put(row);<a name="line.4396"></a>
+<span class="sourceLineNo">4397</span>    value = Bytes.toBytes("value0");<a name="line.4397"></a>
+<span class="sourceLineNo">4398</span>    put.addColumn(family, qualifier, 1234567L, value);<a name="line.4398"></a>
+<span class="sourceLineNo">4399</span>    region.put(put);<a name="line.4399"></a>
+<span class="sourceLineNo">4400</span>    get = new Get(row);<a name="line.4400"></a>
+<span class="sourceLineNo">4401</span>    get.addColumn(family, qualifier);<a name="line.4401"></a>
+<span class="sourceLineNo">4402</span>    get.readAllVersions();<a name="line.4402"></a>
+<span class="sourceLineNo">4403</span>    res = this.region.get(get);<a name="line.4403"></a>
+<span class="sourceLineNo">4404</span>    kvs = res.getColumnCells(family, qualifier);<a name="line.4404"></a>
+<span class="sourceLineNo">4405</span>    assertEquals(1, kvs.size());<a name="line.4405"></a>
+<span class="sourceLineNo">4406</span>    assertArrayEquals(Bytes.toBytes("value0"), CellUtil.cloneValue(kvs.get(0)));<a name="line.4406"></a>
+<span class="sourceLineNo">4407</span><a name="line.4407"></a>
+<span class="sourceLineNo">4408</span>    region.flush(true);<a name="line.4408"></a>
+<span class="sourceLineNo">4409</span>    get = new Get(row);<a name="line.4409"></a>
+<span class="sourceLineNo">4410</span>    get.addColumn(family, qualifier);<a name="line.4410"></a>
+<span class="sourceLineNo">4411</span>    get.readAllVersions();<a name="line.4411"></a>
+<span class="sourceLineNo">4412</span>    res = this.region.get(get);<a name="line.4412"></a>
+<span class="sourceLineNo">4413</span>    kvs = res.getColumnCells(family, qualifier);<a name="line.4413"></a>
+<span class="sourceLineNo">4414</span>    assertEquals(1, kvs.size());<a name="line.4414"></a>
+<span class="sourceLineNo">4415</span>    assertArrayEquals(Bytes.toBytes("value0"), CellUtil.cloneValue(kvs.get(0)));<a name="line.4415"></a>
+<span class="sourceLineNo">4416</span><a name="line.4416"></a>
+<span class="sourceLineNo">4417</span>    put = new Put(row);<a name="line.4417"></a>
+<span class="sourceLineNo">4418</span>    value = Bytes.toBytes("value1");<a name="line.4418"></a>
+<span class="sourceLineNo">4419</span>    put.addColumn(family, qualifier, 1234567L, value);<a name="line.4419"></a>
+<span class="sourceLineNo">4420</span>    region.put(put);<a name="line.4420"></a>
+<span class="sourceLineNo">4421</span>    get = new Get(row);<a name="line.4421"></a>
+<span class="sourceLineNo">4422</span>    get.addColumn(family, qualifier);<a name="line.4422"></a>
+<span class="sourceLineNo">4423</span>    get.readAllVersions();<a name="line.4423"></a>
+<span class="sourceLineNo">4424</span>    res = this.region.get(get);<a name="line.4424"></a>
+<span class="sourceLineNo">4425</span>    kvs = res.getColumnCells(family, qualifier);<a name="line.4425"></a>
+<span class="sourceLineNo">4426</span>    assertEquals(1, kvs.size());<a name="line.4426"></a>
+<span class="sourceLineNo">4427</span>    assertArrayEquals(Bytes.toBytes("value1"), CellUtil.cloneValue(kvs.get(0)));<a name="line.4427"></a>
 <span class="sourceLineNo">4428</span><a name="line.4428"></a>
-<span class="sourceLineNo">4429</span>  @Test<a name="line.4429"></a>
-<span class="sourceLineNo">4430</span>  public void testDurability() throws Exception {<a name="line.4430"></a>
-<span class="sourceLineNo">4431</span>    // there are 5 x 5 cases:<a name="line.4431"></a>
-<span class="sourceLineNo">4432</span>    // table durability(SYNC,FSYNC,ASYC,SKIP,USE_DEFAULT) x mutation<a name="line.4432"></a>
-<span class="sourceLineNo">4433</span>    // durability(SYNC,FSYNC,ASYC,SKIP,USE_DEFAULT)<a name="line.4433"></a>
-<span class="sourceLineNo">4434</span><a name="line.4434"></a>
-<span class="sourceLineNo">4435</span>    // expected cases for append and sync wal<a name="line.4435"></a>
-<span class="sourceLineNo">4436</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4436"></a>
-<span class="sourceLineNo">4437</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4437"></a>
-<span class="sourceLineNo">4438</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.USE_DEFAULT, 0, true, true, false);<a name="line.4438"></a>
-<span class="sourceLineNo">4439</span><a name="line.4439"></a>
-<span class="sourceLineNo">4440</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4440"></a>
-<span class="sourceLineNo">4441</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4441"></a>
-<span class="sourceLineNo">4442</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.USE_DEFAULT, 0, true, true, false);<a name="line.4442"></a>
-<span class="sourceLineNo">4443</span><a name="line.4443"></a>
-<span class="sourceLineNo">4444</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4444"></a>
-<span class="sourceLineNo">4445</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4445"></a>
-<span class="sourceLineNo">4446</span><a name="line.4446"></a>
-<span class="sourceLineNo">4447</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4447"></a>
-<span class="sourceLineNo">4448</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4448"></a>
+<span class="sourceLineNo">4429</span>    region.flush(true);<a name="line.4429"></a>
+<span class="sourceLineNo">4430</span>    get = new Get(row);<a name="line.4430"></a>
+<span class="sourceLineNo">4431</span>    get.addColumn(family, qualifier);<a name="line.4431"></a>
+<span class="sourceLineNo">4432</span>    get.readAllVersions();<a name="line.4432"></a>
+<span class="sourceLineNo">4433</span>    res = this.region.get(get);<a name="line.4433"></a>
+<span class="sourceLineNo">4434</span>    kvs = res.getColumnCells(family, qualifier);<a name="line.4434"></a>
+<span class="sourceLineNo">4435</span>    assertEquals(1, kvs.size());<a name="line.4435"></a>
+<span class="sourceLineNo">4436</span>    assertArrayEquals(Bytes.toBytes("value1"), CellUtil.cloneValue(kvs.get(0)));<a name="line.4436"></a>
+<span class="sourceLineNo">4437</span>  }<a name="line.4437"></a>
+<span class="sourceLineNo">4438</span><a name="line.4438"></a>
+<span class="sourceLineNo">4439</span>  @Test<a name="line.4439"></a>
+<span class="sourceLineNo">4440</span>  public void testDurability() throws Exception {<a name="line.4440"></a>
+<span class="sourceLineNo">4441</span>    // there are 5 x 5 cases:<a name="line.4441"></a>
+<span class="sourceLineNo">4442</span>    // table durability(SYNC,FSYNC,ASYC,SKIP,USE_DEFAULT) x mutation<a name="line.4442"></a>
+<span class="sourceLineNo">4443</span>    // durability(SYNC,FSYNC,ASYC,SKIP,USE_DEFAULT)<a name="line.4443"></a>
+<span class="sourceLineNo">4444</span><a name="line.4444"></a>
+<span class="sourceLineNo">4445</span>    // expected cases for append and sync wal<a name="line.4445"></a>
+<span class="sourceLineNo">4446</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4446"></a>
+<span class="sourceLineNo">4447</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4447"></a>
+<span class="sourceLineNo">4448</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.USE_DEFAULT, 0, true, true, false);<a name="line.4448"></a>
 <span class="sourceLineNo">4449</span><a name="line.4449"></a>
-<span class="sourceLineNo">4450</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4450"></a>
-<span class="sourceLineNo">4451</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4451"></a>
-<span class="sourceLineNo">4452</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.USE_DEFAULT, 0, true, true, false);<a name="line.4452"></a>
+<span class="sourceLineNo">4450</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4450"></a>
+<span class="sourceLineNo">4451</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4451"></a>
+<span class="sourceLineNo">4452</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.USE_DEFAULT, 0, true, true, false);<a name="line.4452"></a>
 <span class="sourceLineNo">4453</span><a name="line.4453"></a>
-<span class="sourceLineNo">4454</span>    // expected cases for async wal<a name="line.4454"></a>
-<span class="sourceLineNo">4455</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4455"></a>
-<span class="sourceLineNo">4456</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4456"></a>
-<span class="sourceLineNo">4457</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4457"></a>
-<span class="sourceLineNo">4458</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4458"></a>
-<span class="sourceLineNo">4459</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4459"></a>
-<span class="sourceLineNo">4460</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.USE_DEFAULT, 0, true, false, false);<a name="line.4460"></a>
-<span class="sourceLineNo">4461</span><a name="line.4461"></a>
-<span class="sourceLineNo">4462</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4462"></a>
-<span class="sourceLineNo">4463</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4463"></a>
-<span class="sourceLineNo">4464</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4464"></a>
-<span class="sourceLineNo">4465</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4465"></a>
-<span class="sourceLineNo">4466</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4466"></a>
-<span class="sourceLineNo">4467</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.USE_DEFAULT, 5000, true, false, true);<a name="line.4467"></a>
-<span class="sourceLineNo">4468</span><a name="line.4468"></a>
-<span class="sourceLineNo">4469</span>    // expect skip wal cases<a name="line.4469"></a>
-<span class="sourceLineNo">4470</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4470"></a>
-<span class="sourceLineNo">4471</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4471"></a>
-<span class="sourceLineNo">4472</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4472"></a>
-<span class="sourceLineNo">4473</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4473"></a>
-<span class="sourceLineNo">4474</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4474"></a>
-<span class="sourceLineNo">4475</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.USE_DEFAULT, 0, false, false, false);<a name="line.4475"></a>
-<span class="sourceLineNo">4476</span><a name="line.4476"></a>
-<span class="sourceLineNo">4477</span>  }<a name="line.4477"></a>
+<span class="sourceLineNo">4454</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4454"></a>
+<span class="sourceLineNo">4455</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4455"></a>
+<span class="sourceLineNo">4456</span><a name="line.4456"></a>
+<span class="sourceLineNo">4457</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4457"></a>
+<span class="sourceLineNo">4458</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4458"></a>
+<span class="sourceLineNo">4459</span><a name="line.4459"></a>
+<span class="sourceLineNo">4460</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4460"></a>
+<span class="sourceLineNo">4461</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4461"></a>
+<span class="sourceLineNo">4462</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.USE_DEFAULT, 0, true, true, false);<a name="line.4462"></a>
+<span class="sourceLineNo">4463</span><a name="line.4463"></a>
+<span class="sourceLineNo">4464</span>    // expected cases for async wal<a name="line.4464"></a>
+<span class="sourceLineNo">4465</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4465"></a>
+<span class="sourceLineNo">4466</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4466"></a>
+<span class="sourceLineNo">4467</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4467"></a>
+<span class="sourceLineNo">4468</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4468"></a>
+<span class="sourceLineNo">4469</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4469"></a>
+<span class="sourceLineNo">4470</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.USE_DEFAULT, 0, true, false, false);<a name="line.4470"></a>
+<span class="sourceLineNo">4471</span><a name="line.4471"></a>
+<span class="sourceLineNo">4472</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4472"></a>
+<span class="sourceLineNo">4473</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4473"></a>
+<span class="sourceLineNo">4474</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4474"></a>
+<span class="sourceLineNo">4475</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4475"></a>
+<span class="sourceLineNo">4476</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4476"></a>
+<span class="sourceLineNo">4477</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.USE_DEFAULT, 5000, true, false, true);<a name="line.4477"></a>
 <span class="sourceLineNo">4478</span><a name="line.4478"></a>
-<span class="sourceLineNo">4479</span>  private void durabilityTest(String method, Durability tableDurability,<a name="line.4479"></a>
-<span class="sourceLineNo">4480</span>      Durability mutationDurability, long timeout, boolean expectAppend, final boolean expectSync,<a name="line.4480"></a>
-<span class="sourceLineNo">4481</span>      final boolean expectSyncFromLogSyncer) throws Exception {<a name="line.4481"></a>
-<span class="sourceLineNo">4482</span>    Configuration conf = HBaseConfiguration.create(CONF);<a name="line.4482"></a>
-<span class="sourceLineNo">4483</span>    method = method + "_" + tableDurability.name() + "_" + mutationDurability.name();<a name="line.4483"></a>
-<span class="sourceLineNo">4484</span>    byte[] family = Bytes.toBytes("family");<a name="line.4484"></a>
-<span class="sourceLineNo">4485</span>    Path logDir = new Path(new Path(dir + method), "log");<a name="line.4485"></a>
-<span class="sourceLineNo">4486</span>    final Configuration walConf = new Configuration(conf);<a name="line.4486"></a>
-<span class="sourceLineNo">4487</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.4487"></a>
-<span class="sourceLineNo">4488</span>    // XXX: The spied AsyncFSWAL can not work properly because of a Mockito defect that can not<a name="line.4488"></a>
-<span class="sourceLineNo">4489</span>    // deal with classes which have a field of an inner class. See discussions in HBASE-15536.<a name="line.4489"></a>
-<span class="sourceLineNo">4490</span>    walConf.set(WALFactory.WAL_PROVIDER, "filesystem");<a name="line.4490"></a>
-<span class="sourceLineNo">4491</span>    final WALFactory wals = new WALFactory(walConf, TEST_UTIL.getRandomUUID().toString());<a name="line.4491"></a>
-<span class="sourceLineNo">4492</span>    final WAL wal = spy(wals.getWAL(RegionInfoBuilder.newBuilder(tableName).build()));<a name="line.4492"></a>
-<span class="sourceLineNo">4493</span>    this.region = initHRegion(tableName, HConstants.EMPTY_START_ROW,<a name="line.4493"></a>
-<span class="sourceLineNo">4494</span>        HConstants.EMPTY_END_ROW, false, tableDurability, wal,<a name="line.4494"></a>
-<span class="sourceLineNo">4495</span>        new byte[][] { family });<a name="line.4495"></a>
-<span class="sourceLineNo">4496</span><a name="line.4496"></a>
-<span class="sourceLineNo">4497</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.4497"></a>
-<span class="sourceLineNo">4498</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.4498"></a>
-<span class="sourceLineNo">4499</span>    put.setDurability(mutationDurability);<a name="line.4499"></a>
-<span class="sourceLineNo">4500</span>    region.put(put);<a name="line.4500"></a>
-<span class="sourceLineNo">4501</span><a name="line.4501"></a>
-<span class="sourceLineNo">4502</span>    //verify append called or not<a name="line.4502"></a>
-<span class="sourceLineNo">4503</span>    verify(wal, expectAppend ? times(1) : never())<a name="line.4503"></a>
-<span class="sourceLineNo">4504</span>      .append((HRegionInfo)any(), (WALKeyImpl)any(),<a name="line.4504"></a>
-<span class="sourceLineNo">4505</span>          (WALEdit)any(), Mockito.anyBoolean());<a name="line.4505"></a>
+<span class="sourceLineNo">4479</span>    // expect skip wal cases<a name="line.4479"></a>
+<span class="sourceLineNo">4480</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4480"></a>
+<span class="sourceLineNo">4481</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4481"></a>
+<span class="sourceLineNo">4482</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4482"></a>
+<span class="sourceLineNo">4483</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4483"></a>
+<span class="sourceLineNo">4484</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4484"></a>
+<span class="sourceLineNo">4485</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.USE_DEFAULT, 0, false, false, false);<a name="line.4485"></a>
+<span class="sourceLineNo">4486</span><a name="line.4486"></a>
+<span class="sourceLineNo">4487</span>  }<a name="line.4487"></a>
+<span class="sourceLineNo">4488</span><a name="line.4488"></a>
+<span class="sourceLineNo">4489</span>  private void durabilityTest(String method, Durability tableDurability,<a name="line.4489"></a>
+<span class="sourceLineNo">4490</span>      Durability mutationDurability, long timeout, boolean expectAppend, final boolean expectSync,<a name="line.4490"></a>
+<span class="sourceLineNo">4491</span>      final boolean expectSyncFromLogSyncer) throws Exception {<a name="line.4491"></a>
+<span class="sourceLineNo">4492</span>    Configuration conf = HBaseConfiguration.create(CONF);<a name="line.4492"></a>
+<span class="sourceLineNo">4493</span>    method = method + "_" + tableDurability.name() + "_" + mutationDurability.name();<a name="line.4493"></a>
+<span class="sourceLineNo">4494</span>    byte[] family = Bytes.toBytes("family");<a name="line.4494"></a>
+<span class="sourceLineNo">4495</span>    Path logDir = new Path(new Path(dir + method), "log");<a name="line.4495"></a>
+<span class="sourceLineNo">4496</span>    final Configuration walConf = new Configuration(conf);<a name="line.4496"></a>
+<span class="sourceLineNo">4497</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.4497"></a>
+<span class="sourceLineNo">4498</span>    // XXX: The spied AsyncFSWAL can not work properly because of a Mockito defect that can not<a name="line.4498"></a>
+<span class="sourceLineNo">4499</span>    // deal with classes which have a field of an inner class. See discussions in HBASE-15536.<a name="line.4499"></a>
+<span class="sourceLineNo">4500</span>    walConf.set(WALFactory.WAL_PROVIDER, "filesystem");<a name="line.4500"></a>
+<span class="sourceLineNo">4501</span>    final WALFactory wals = new WALFactory(walConf, TEST_UTIL.getRandomUUID().toString());<a name="line.4501"></a>
+<span class="sourceLineNo">4502</span>    final WAL wal = spy(wals.getWAL(RegionInfoBuilder.newBuilder(tableName).build()));<a name="line.4502"></a>
+<span class="sourceLineNo">4503</span>    this.region = initHRegion(tableName, HConstants.EMPTY_START_ROW,<a name="line.4503"></a>
+<span class="sourceLineNo">4504</span>        HConstants.EMPTY_END_ROW, false, tableDurability, wal,<a name="line.4504"></a>
+<span class="sourceLineNo">4505</span>        new byte[][] { family });<a name="line.4505"></a>
 <span class="sourceLineNo">4506</span><a name="line.4506"></a>
-<span class="sourceLineNo">4507</span>    // verify sync called or not<a name="line.4507"></a>
-<span class="sourceLineNo">4508</span>    if (expectSync || expectSyncFromLogSyncer) {<a name="line.4508"></a>
-<span class="sourceLineNo">4509</span>      TEST_UTIL.waitFor(timeout, new Waiter.Predicate&lt;Exception&gt;() {<a name="line.4509"></a>
-<span class="sourceLineNo">4510</span>        @Override<a name="line.4510"></a>
-<span class="sourceLineNo">4511</span>        public boolean evaluate() throws Exception {<a name="line.4511"></a>
-<span class="sourceLineNo">4512</span>          try {<a name="line.4512"></a>
-<span class="sourceLineNo">4513</span>            if (expectSync) {<a name="line.4513"></a>
-<span class="sourceLineNo">4514</span>              verify(wal, times(1)).sync(anyLong()); // Hregion calls this one<a name="line.4514"></a>
-<span class="sourceLineNo">4515</span>            } else if (expectSyncFromLogSyncer) {<a name="line.4515"></a>
-<span class="sourceLineNo">4516</span>              verify(wal, times(1)).sync(); // wal syncer calls this one<a name="line.4516"></a>
-<span class="sourceLineNo">4517</span>            }<a name="line.4517"></a>
-<span class="sourceLineNo">4518</span>          } catch (Throwable ignore) {<a name="line.4518"></a>
-<span class="sourceLineNo">4519</span>          }<a name="line.4519"></a>
-<span class="sourceLineNo">4520</span>          return true;<a name="line.4520"></a>
-<span class="sourceLineNo">4521</span>        }<a name="line.4521"></a>
-<span class="sourceLineNo">4522</span>      });<a name="line.4522"></a>
-<span class="sourceLineNo">4523</span>    } else {<a name="line.4523"></a>
-<span class="sourceLineNo">4524</span>      //verify(wal, never()).sync(anyLong());<a name="line.4524"></a>
-<span class="sourceLineNo">4525</span>      verify(wal, never()).sync();<a name="line.4525"></a>
-<span class="sourceLineNo">4526</span>    }<a name="line.4526"></a>
-<span class="sourceLineNo">4527</span><a name="line.4527"></a>
-<span class="sourceLineNo">4528</span>    HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.4528"></a>
-<span class="sourceLineNo">4529</span>    wals.close();<a name="line.4529"></a>
-<span class="sourceLineNo">4530</span>    this.region = null;<a name="line.4530"></a>
-<span class="sourceLineNo">4531</span>  }<a name="line.4531"></a>
-<span class="sourceLineNo">4532</span><a name="line.4532"></a>
-<span class="sourceLineNo">4533</span>  @Test<a name="line.4533"></a>
-<span class="sourceLineNo">4534</span>  public void testRegionReplicaSecondary() throws IOException {<a name="line.4534"></a>
-<span class="sourceLineNo">4535</span>    // create a primary region, load some data and flush<a name="line.4535"></a>
-<span class="sourceLineNo">4536</span>    // create a secondary region, and do a get against that<a name="line.4536"></a>
-<span class="sourceLineNo">4537</span>    Path rootDir = new Path(dir + name.getMethodName());<a name="line.4537"></a>
-<span class="sourceLineNo">4538</span>    FSUtils.setRootDir(TEST_UTIL.getConfiguration(), rootDir);<a name="line.4538"></a>
-<span class="sourceLineNo">4539</span><a name="line.4539"></a>
-<span class="sourceLineNo">4540</span>    byte[][] families = new byte[][] {<a name="line.4540"></a>
-<span class="sourceLineNo">4541</span>        Bytes.toBytes("cf1"), Bytes.toBytes("cf2"), Bytes.toBytes("cf3")<a name="line.4541"></a>
-<span class="sourceLineNo">4542</span>    };<a name="line.4542"></a>
-<span class="sourceLineNo">4543</span>    byte[] cq = Bytes.toBytes("cq");<a name="line.4543"></a>
-<span class="sourceLineNo">4544</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.4544"></a>
-<span class="sourceLineNo">4545</span>    for (byte[] family : families) {<a name="line.4545"></a>
-<span class="sourceLineNo">4546</span>      htd.addFamily(new HColumnDescriptor(family));<a name="line.4546"></a>
-<span class="sourceLineNo">4547</span>    }<a name="line.4547"></a>
-<span class="sourceLineNo">4548</span><a name="line.4548"></a>
-<span class="sourceLineNo">4549</span>    long time = System.currentTimeMillis();<a name="line.4549"></a>
-<span class="sourceLineNo">4550</span>    HRegionInfo primaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4550"></a>
-<span class="sourceLineNo">4551</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4551"></a>
-<span class="sourceLineNo">4552</span>      false, time, 0);<a name="line.4552"></a>
-<span class="sourceLineNo">4553</span>    HRegionInfo secondaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4553"></a>
-<span class="sourceLineNo">4554</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4554"></a>
-<span class="sourceLineNo">4555</span>      false, time, 1);<a name="line.4555"></a>
-<span class="sourceLineNo">4556</span><a name="line.4556"></a>
-<span class="sourceLineNo">4557</span>    HRegion primaryRegion = null, secondaryRegion = null;<a name="line.4557"></a>
+<span class="sourceLineNo">4507</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.4507"></a>
+<span class="sourceLineNo">4508</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.4508"></a>
+<span class="sourceLineNo">4509</span>    put.setDurability(mutationDurability);<a name="line.4509"></a>
+<span class="sourceLineNo">4510</span>    region.put(put);<a name="line.4510"></a>
+<span class="sourceLineNo">4511</span><a name="line.4511"></a>
+<span class="sourceLineNo">4512</span>    //verify append called or not<a name="line.4512"></a>
+<span class="sourceLineNo">4513</span>    verify(wal, expectAppend ? times(1) : never())<a name="line.4513"></a>
+<span class="sourceLineNo">4514</span>      .append((HRegionInfo)any(), (WALKeyImpl)any(),<a name="line.4514"></a>
+<span class="sourceLineNo">4515</span>          (WALEdit)any(), Mockito.anyBoolean());<a name="line.4515"></a>
+<span class="sourceLineNo">4516</span><a name="line.4516"></a>
+<span class="sourceLineNo">4517</span>    // verify sync called or not<a name="line.4517"></a>
+<span class="sourceLineNo">4518</span>    if (expectSync || expectSyncFromLogSyncer) {<a name="line.4518"></a>
+<span class="sourceLineNo">4519</span>      TEST_UTIL.waitFor(timeout, new Waiter.Predicate&lt;Exception&gt;() {<a name="line.4519"></a>
+<span class="sourceLineNo">4520</span>        @Override<a name="line.4520"></a>
+<span class="sourceLineNo">4521</span>        public boolean evaluate() throws Exception {<a name="line.4521"></a>
+<span class="sourceLineNo">4522</span>          try {<a name="line.4522"></a>
+<span class="sourceLineNo">4523</span>            if (expectSync) {<a name="line.4523"></a>
+<span class="sourceLineNo">4524</span>              verify(wal, times(1)).sync(anyLong()); // Hregion calls this one<a name="line.4524"></a>
+<span class="sourceLineNo">4525</span>            } else if (expectSyncFromLogSyncer) {<a name="line.4525"></a>
+<span class="sourceLineNo">4526</span>              verify(wal, times(1)).sync(); // wal syncer calls this one<a name="line.4526"></a>
+<span class="sourceLineNo">4527</span>            }<a name="line.4527"></a>
+<span class="sourceLineNo">4528</span>          } catch (Throwable ignore) {<a name="line.4528"></a>
+<span class="sourceLineNo">4529</span>          }<a name="line.4529"></a>
+<span class="sourceLineNo">4530</span>          return true;<a name="line.4530"></a>
+<span class="sourceLineNo">4531</span>        }<a name="line.4531"></a>
+<span class="sourceLineNo">4532</span>      });<a name="line.4532"></a>
+<span class="sourceLineNo">4533</span>    } else {<a name="line.4533"></a>
+<span class="sourceLineNo">4534</span>      //verify(wal, never()).sync(anyLong());<a name="line.4534"></a>
+<span class="sourceLineNo">4535</span>      verify(wal, never()).sync();<a name="line.4535"></a>
+<span class="sourceLineNo">4536</span>    }<a name="line.4536"></a>
+<span class="sourceLineNo">4537</span><a name="line.4537"></a>
+<span class="sourceLineNo">4538</span>    HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.4538"></a>
+<span class="sourceLineNo">4539</span>    wals.close();<a name="line.4539"></a>
+<span class="sourceLineNo">4540</span>    this.region = null;<a name="line.4540"></a>
+<span class="sourceLineNo">4541</span>  }<a name="line.4541"></a>
+<span class="sourceLineNo">4542</span><a name="line.4542"></a>
+<span class="sourceLineNo">4543</span>  @Test<a name="line.4543"></a>
+<span class="sourceLineNo">4544</span>  public void testRegionReplicaSecondary() throws IOException {<a name="line.4544"></a>
+<span class="sourceLineNo">4545</span>    // create a primary region, load some data and flush<a name="line.4545"></a>
+<span class="sourceLineNo">4546</span>    // create a secondary region, and do a get against that<a name="line.4546"></a>
+<span class="sourceLineNo">4547</span>    Path rootDir = new Path(dir + name.getMethodName());<a name="line.4547"></a>
+<span class="sourceLineNo">4548</span>    FSUtils.setRootDir(TEST_UTIL.getConfiguration(), rootDir);<a name="line.4548"></a>
+<span class="sourceLineNo">4549</span><a name="line.4549"></a>
+<span class="sourceLineNo">4550</span>    byte[][] families = new byte[][] {<a name="line.4550"></a>
+<span class="sourceLineNo">4551</span>        Bytes.toBytes("cf1"), Bytes.toBytes("cf2"), Bytes.toBytes("cf3")<a name="line.4551"></a>
+<span class="sourceLineNo">4552</span>    };<a name="line.4552"></a>
+<span class="sourceLineNo">4553</span>    byte[] cq = Bytes.toBytes("cq");<a name="line.4553"></a>
+<span class="sourceLineNo">4554</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.4554"></a>
+<span class="sourceLineNo">4555</span>    for (byte[] family : families) {<a name="line.4555"></a>
+<span class="sourceLineNo">4556</span>      htd.addFamily(new HColumnDescriptor(family));<a name="line.4556"></a>
+<span class="sourceLineNo">4557</span>    }<a name="line.4557"></a>
 <span class="sourceLineNo">4558</span><a name="line.4558"></a>
-<span class="sourceLineNo">4559</span>    try {<a name="line.4559"></a>
-<span class="sourceLineNo">4560</span>      primaryRegion = HBaseTestingUtility.createRegionAndWAL(primaryHri,<a name="line.4560"></a>
-<span class="sourceLineNo">4561</span>          rootDir, TEST_UTIL.getConfiguration(), htd);<a name="line.4561"></a>
-<span class="sourceLineNo">4562</span><a name="line.4562"></a>
-<span class="sourceLineNo">4563</span>      // load some data<a name="line.4563"></a>
-<span class="sourceLineNo">4564</span>      putData(primaryRegion, 0, 1000, cq, families);<a name="line.4564"></a>
-<span class="sourceLineNo">4565</span><a name="line.4565"></a>
-<span class="sourceLineNo">4566</span>      // flush region<a name="line.4566"></a>
-<span class="sourceLineNo">4567</span>      primaryRegion.flush(true);<a name="line.4567"></a>
+<span class="sourceLineNo">4559</span>    long time = System.currentTimeMillis();<a name="line.4559"></a>
+<span class="sourceLineNo">4560</span>    HRegionInfo primaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4560"></a>
+<span class="sourceLineNo">4561</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4561"></a>
+<span class="sourceLineNo">4562</span>      false, time, 0);<a name="line.4562"></a>
+<span class="sourceLineNo">4563</span>    HRegionInfo secondaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4563"></a>
+<span class="sourceLineNo">4564</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4564"></a>
+<span class="sourceLineNo">4565</span>      false, time, 1);<a name="line.4565"></a>
+<span class="sourceLineNo">4566</span><a name="line.4566"></a>
+<span class="sourceLineNo">4567</span>    HRegion primaryRegion = null, secondaryRegion = null;<a name="line.4567"></a>
 <span class="sourceLineNo">4568</span><a name="line.4568"></a>
-<span class="sourceLineNo">4569</span>      // open secondary region<a name="line.4569"></a>
-<span class="sourceLineNo">4570</span>      secondaryRegion = HRegion.openHRegion(rootDir, secondaryHri, htd, null, CONF);<a name="line.4570"></a>
-<span class="sourceLineNo">4571</span><a name="line.4571"></a>
-<span class="sourceLineNo">4572</span>      verifyData(secondaryRegion, 0, 1000, cq, families);<a name="line.4572"></a>
-<span class="sourceLineNo">4573</span>    } finally {<a name="line.4573"></a>
-<span class="sourceLineNo">4574</span>      if (primaryRegion != null) {<a name="line.4574"></a>
-<span class="sourceLineNo">4575</span>        HBaseTestingUtility.closeRegionAndWAL(primaryRegion);<a name="line.4575"></a>
-<span class="sourceLineNo">4576</span>      }<a name="line.4576"></a>
-<span class="sourceLineNo">4577</span>      if (secondaryRegion != null) {<a name="line.4577"></a>
-<span class="sourceLineNo">4578</span>        HBaseTestingUtility.closeRegionAndWAL(secondaryRegion);<a name="line.4578"></a>
-<span class="sourceLineNo">4579</span>      }<a name="line.4579"></a>
-<span class="sourceLineNo">4580</span>    }<a name="line.4580"></a>
-<span class="sourceLineNo">4581</span>  }<a name="line.4581"></a>
-<span class="sourceLineNo">4582</span><a name="line.4582"></a>
-<span class="sourceLineNo">4583</span>  @Test<a name="line.4583"></a>
-<span class="sourceLineNo">4584</span>  public void testRegionReplicaSecondaryIsReadOnly() throws IOException {<a name="line.4584"></a>
-<span class="sourceLineNo">4585</span>    // create a primary region, load some data and flush<a name="line.4585"></a>
-<span class="sourceLineNo">4586</span>    // create a secondary region, and do a put against that<a name="line.4586"></a>
-<span class="sourceLineNo">4587</span>    Path rootDir = new Path(dir + name.getMethodName());<a name="line.4587"></a>
-<span class="sourceLineNo">4588</span>    FSUtils.setRootDir(TEST_UTIL.getConfiguration(), rootDir);<a name="line.4588"></a>
-<span class="sourceLineNo">4589</span><a name="line.4589"></a>
-<span class="sourceLineNo">4590</span>    byte[][] families = new byte[][] {<a name="line.4590"></a>
-<span class="sourceLineNo">4591</span>        Bytes.toBytes("cf1"), Bytes.toBytes("cf2"), Bytes.toBytes("cf3")<a name="line.4591"></a>
-<span class="sourceLineNo">4592</span>    };<a name="line.4592"></a>
-<span class="sourceLineNo">4593</span>    byte[] cq = Bytes.toBytes("cq");<a name="line.4593"></a>
-<span class="sourceLineNo">4594</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.4594"></a>
-<span class="sourceLineNo">4595</span>    for (byte[] family : families) {<a name="line.4595"></a>
-<span class="sourceLineNo">4596</span>      htd.addFamily(new HColumnDescriptor(family));<a name="line.4596"></a>
-<span class="sourceLineNo">4597</span>    }<a name="line.4597"></a>
-<span class="sourceLineNo">4598</span><a name="line.4598"></a>
-<span class="sourceLineNo">4599</span>    long time = System.currentTimeMillis();<a name="line.4599"></a>
-<span class="sourceLineNo">4600</span>    HRegionInfo primaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4600"></a>
-<span class="sourceLineNo">4601</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4601"></a>
-<span class="sourceLineNo">4602</span>      false, time, 0);<a name="line.4602"></a>
-<span class="sourceLineNo">4603</span>    HRegionInfo secondaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4603"></a>
-<span class="sourceLineNo">4604</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4604"></a>
-<span class="sourceLineNo">4605</span>      false, time, 1);<a name="line.4605"></a>
-<span class="sourceLineNo">4606</span><a name="line.4606"></a>
-<span class="sourceLineNo">4607</span>    HRegion primaryRegion = null, secondaryRegion = null;<a name="line.4607"></a>
+<span class="sourceLineNo">4569</span>    try {<a name="line.4569"></a>
+<span class="sourceLineNo">4570</span>      primaryRegion = HBaseTestingUtility.createRegionAndWAL(primaryHri,<a name="line.4570"></a>
+<span class="sourceLineNo">4571</span>          rootDir, TEST_UTIL.getConfiguration(), htd);<a name="line.4571"></a>
+<span class="sourceLineNo">4572</span><a name="line.4572"></a>
+<span class="sourceLineNo">4573</span>      // load some data<a name="line.4573"></a>
+<span class="sourceLineNo">4574</span>      putData(primaryRegion, 0, 1000, cq, families);<a name="line.4574"></a>
+<span class="sourceLineNo">4575</span><a name="line.4575"></a>
+<span class="sourceLineNo">4576</span>      // flush region<a name="line.4576"></a>
+<span class="sourceLineNo">4577</span>      primaryRegion.flush(true);<a name="line.4577"></a>
+<span class="sourceLineNo">4578</span><a name="line.4578"></a>
+<span class="sourceLineNo">4579</span>      // open secondary region<a name="line.4579"></a>
+<span class="sourceLineNo">4580</span>      secondaryRegion = HRegion.openHRegion(rootDir, secondaryHri, htd, null, CONF);<a name="line.4580"></a>
+<span class="sourceLineNo">4581</span><a name="line.4581"></a>
+<span class="sourceLineNo">4582</span>      verifyData(secondaryRegion, 0, 1000, cq, families);<a name="line.4582"></a>
+<span class="sourceLineNo">4583</span>    } finally {<a name="line.4583"></a>
+<span class="sourceLineNo">4584</span>      if (primaryRegion != null) {<a name="line.4584"></a>
+<span class="sourceLineNo">4585</span>        HBaseTestingUtility.closeRegionAndWAL(primaryRegion);<a name="line.4585"></a>
+<span class="sourceLineNo">4586</span>      }<a name="line.4586"></a>
+<span class="sourceLineNo">4587</span>      if (secondaryRegion != null) {<a name="line.4587"></a>
+<span class="sourceLineNo">4588</span>        HBaseTestingUtility.closeRegionAndWAL(secondaryRegion);<a name="line.4588"></a>
+<span class="sourceLineNo">4589</span>      }<a name="line.4589"></a>
+<span class="sourceLineNo">4590</span>    }<a name="line.4590"></a>
+<span class="sourceLineNo">4591</span>  }<a name="line.4591"></a>
+<span class="sourceLineNo">4592</span><a name="line.4592"></a>
+<span class="sourceLineNo">4593</span>  @Test<a name="line.4593"></a>
+<span class="sourceLineNo">4594</span>  public void testRegionReplicaSecondaryIsReadOnly() throws IOException {<a name="line.4594"></a>
+<span class="sourceLineNo">4595</span>    // create a primary region, load some data and flush<a name="line.4595"></a>
+<span class="sourceLineNo">4596</span>    // create a secondary region, and do a put against that<a name="line.4596"></a>
+<span class="sourceLineNo">4597</span>    Path rootDir = new Path(dir + name.getMethodName());<a name="line.4597"></a>
+<span class="sourceLineNo">4598</span>    FSUtils.setRootDir(TEST_UTIL.getConfiguration(), rootDir);<a name="line.4598"></a>
+<span class="sourceLineNo">4599</span><a name="line.4599"></a>
+<span class="sourceLineNo">4600</span>    byte[][] families = new byte[][] {<a name="line.4600"></a>
+<span class="sourceLineNo">4601</span>        Bytes.toBytes("cf1"), Bytes.toBytes("cf2"), Bytes.toBytes("cf3")<a name="line.4601"></a>
+<span class="sourceLineNo">4602</span>    };<a name="line.4602"></a>
+<span class="sourceLineNo">4603</span>    byte[] cq = Bytes.toBytes("cq");<a name="line.4603"></a>
+<span class="sourceLineNo">4604</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.4604"></a>
+<span class="sourceLineNo">4605</span>    for (byte[] family : families) {<a name="line.4605"></a>
+<span class="sourceLineNo">4606</span>      htd.addFamily(new HColumnDescriptor(family));<a name="line.4606"></a>
+<span class="sourceLineNo">4607</span>    }<a name="line.4607"></a>
 <span class="sourceLineNo">4608</span><a name="line.4608"></a>
-<span class="sourceLineNo">4609</span>    try {<a name="line.4609"></a>
-<span class="sourceLineNo">4610</span>      primaryRegion = HBaseTestingUtility.createRegionAndWAL(primaryHri,<a name="line.4610"></a>
-<span class="sourceLineNo">4611</span>          rootDir, TEST_UTIL.getConfiguration(), htd);<a name="line.4611"></a>
-<span class="sourceLineNo">4612</span><a name="line.4612"></a>
-<span class="sourceLineNo">4613</span>      // load some data<a name="line.4613"></a>
-<span class="sourceLineNo">4614</span>      putData(primaryRegion, 0, 1000, cq, families);<a name="line.4614"></a>
-<span class="sourceLineNo">4615</span><a name="line.4615"></a>
-<span class="sourceLineNo">4616</span>      // flush region<a name="line.4616"></a>
-<span class="sourceLineNo">4617</span>      primaryRegion.flush(true);<a name="line.4617"></a>
+<span class="sourceLineNo">4609</span>    long time = System.currentTimeMillis();<a name="line.4609"></a>
+<span class="sourceLineNo">4610</span>    HRegionInfo primaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4610"></a>
+<span class="sourceLineNo">4611</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4611"></a>
+<span class="sourceLineNo">4612</span>      false, time, 0);<a name="line.4612"></a>
+<span class="sourceLineNo">4613</span>    HRegionInfo secondaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4613"></a>
+<span class="sourceLineNo">4614</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4614"></a>
+<span class="sourceLineNo">4615</span>      false, time, 1);<a name="line.4615"></a>
+<span class="sourceLineNo">4616</span><a name="line.4616"></a>
+<span class="sourceLineNo">4617</span>    HRegion primaryRegion = null, secondaryRegion = null;<a name="line.4617"></a>
 <span class="sourceLineNo">4618</span><a name="line.4618"></a>
-<span class="sourceLineNo">4619</span>      // open secondary region<a name="line.4619"></a>
-<span class="sourceLineNo">4620</span>      secondaryRegion = HRegion.openHRegion(rootDir, secondaryHri, htd, null, CONF);<a name="line.4620"></a>
-<span class="sourceLineNo">4621</span><a name="line.4621"></a>
-<span class="sourceLineNo">4622</span>      try {<a name="line.4622"></a>
-<span class="sourceLineNo">4623</span>        putData(secondaryRegion, 0, 1000, cq, families);<a name="line.4623"></a>
-<span class="sourceLineNo">4624</span>        fail("Should have thrown exception");<a name="line.4624"></a>
-<span class="sourceLineNo">4625</span>      } catch (IOException ex) {<a name="line.4625"></a>
-<span class="sourceLineNo">4626</span>        // expected<a name="line.4626"></a>
-<span class="sourceLineNo">4627</span>      }<a name="line.4627"></a>
-<span class="sourceLineNo">4628</span>    } finally {<a name="line.4628"></a>
-<span class="sourceLineNo">4629</span>      if (primaryRegion != null) {<a name="line.4629"></a>
-<span class="sourceLineNo">4630</span>        HBaseTestingUtility.closeRegionAndWAL(primaryRegion);<a name="line.4630"></a>
-<span class="sourceLineNo">4631</span>      }<a name="line.4631"></a>
-<span class="sourceLineNo">4632</span>      if (secondaryRegion != null) {<a name="line.4632"></a>
-<span class="sourceLineNo">4633</span>        HBaseTestingUtility.closeRegionAndWAL(secondaryRegion);<a name="line.4633"></a>
-<span class="sourceLineNo">4634</span>      }<a name="line.4634"></a>
-<span class="sourceLineNo">4635</span>    }<a name="line.4635"></a>
-<span class="sourceLineNo">4636</span>  }<a name="line.4636"></a>
-<span class="sourceLineNo">4637</span><a name="line.4637"></a>
-<span class="sourceLineNo">4638</span>  static WALFactory createWALFactory(Configuration conf, Path rootDir) throws IOException {<a name="line.4638"></a>
-<span class="sourceLineNo">4639</span>    Configuration confForWAL = new Configuration(conf);<a name="line.4639"></a>
-<span class="sourceLineNo">4640</span>    confForWAL.set(HConstants.HBASE_DIR, rootDir.toString());<a name="line.4640"></a>
-<span class="sourceLineNo">4641</span>    return new WALFactory(confForWAL, "hregion-" + RandomStringUtils.randomNumeric(8));<a name="line.4641"></a>
-<span class="sourceLineNo">4642</span>  }<a name="line.4642"></a>
-<span class="sourceLineNo">4643</span><a name="line.4643"></a>
-<span class="sourceLineNo">4644</span>  @Test<a name="line.4644"></a>
-<span class="sourceLineNo">4645</span>  public void testCompactionFromPrimary() throws IOException {<a name="line.4645"></a>
-<span class="sourceLineNo">4646</span>    Path rootDir = new Path(dir + name.getMethodName());<a name="line.4646"></a>
-<span class="sourceLineNo">4647</span>    FSUtils.setRootDir(TEST_UTIL.getConfiguration(), rootDir);<a name="line.4647"></a>
-<span class="sourceLineNo">4648</span><a name="line.4648"></a>
-<span class="sourceLineNo">4649</span>    byte[][] families = new byte[][] {<a name="line.4649"></a>
-<span class="sourceLineNo">4650</span>        Bytes.toBytes("cf1"), Bytes.toBytes("cf2"), Bytes.toBytes("cf3")<a name="line.4650"></a>
-<span class="sourceLineNo">4651</span>    };<a name="line.4651"></a>
-<span class="sourceLineNo">4652</span>    byte[] cq = Bytes.toBytes("cq");<a name="line.4652"></a>
-<span class="sourceLineNo">4653</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.4653"></a>
-<span class="sourceLineNo">4654</span>    for (byte[] family : families) {<a name="line.4654"></a>
-<span class="sourceLineNo">4655</span>      htd.addFamily(new HColumnDescriptor(family));<a name="line.4655"></a>
-<span class="sourceLineNo">4656</span>    }<a name="line.4656"></a>
-<span class="sourceLineNo">4657</span><a name="line.4657"></a>
-<span class="sourceLineNo">4658</span>    long time = System.currentTimeMillis();<a name="line.4658"></a>
-<span class="sourceLineNo">4659</span>    HRegionInfo primaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4659"></a>
-<span class="sourceLineNo">4660</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4660"></a>
-<span class="sourceLineNo">4661</span>      false, time, 0);<a name="line.4661"></a>
-<span class="sourceLineNo">4662</span>    HRegionInfo secondaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4662"></a>
-<span class="sourceLineNo">4663</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4663"></a>
-<span class="sourceLineNo">4664</span>      false, time, 1);<a name="line.4664"></a>
-<span class="sourceLineNo">4665</span><a name="line.4665"></a>
-<span class="sourceLineNo">4666</span>    HRegion primaryRegion = null, secondaryRegion = null;<a name="line.4666"></a>
+<span class="sourceLineNo">4619</span>    try {<a name="line.4619"></a>
+<span class="sourceLineNo">4620</span>      primaryRegion = HBaseTestingUtility.createRegionAndWAL(primaryHri,<a name="line.4620"></a>
+<span class="sourceLineNo">4621</span>          rootDir, TEST_UTIL.getConfiguration(), htd);<a name="line.4621"></a>
+<span class="sourceLineNo">4622</span><a name="line.4622"></a>
+<span class="sourceLineNo">4623</span>      // load some data<a name="line.4623"></a>
+<span class="sourceLineNo">4624</span>      putData(primaryRegion, 0, 1000, cq, families);<a name="line.4624"></a>
+<span class="sourceLineNo">4625</span><a name="line.4625"></a>
+<span class="sourceLineNo">4626</span>      // flush region<a name="line.4626"></a>
+<span class="sourceLineNo">4627</span>      primaryRegion.flush(true);<a name="line.4627"></a>
+<span class="sourceLineNo">4628</span><a name="line.4628"></a>
+<span class="sourceLineNo">4629</span>      // open secondary region<a name="line.4629"></a>
+<span class="sourceLineNo">4630</span>      secondaryRegion = HRegion.openHRegion(rootDir, secondaryHri, htd, null, CONF);<a name="line.4630"></a>
+<span class="sourceLineNo">4631</span><a name="line.4631"></a>
+<span class="sourceLineNo">4632</span>      try {<a name="line.4632"></a>
+<span class="sourceLineNo">4633</span>        putData(secondaryRegion, 0, 1000, cq, families);<a name="line.4633"></a>
+<span class="sourceLineNo">4634</span>        fail("Should have thrown exception");<a name="line.4634"></a>
+<span class="sourceLineNo">4635</span>      } catch (IOException ex) {<a name="line.4635"></a>
+<span class="sourceLineNo">4636</span>        // expected<a name="line.4636"></a>
+<span class="sourceLineNo">4637</span>      }<a name="line.4637"></a>
+<span class="sourceLineNo">4638</span>    } finally {<a name="line.4638"></a>
+<span class="sourceLineNo">4639</span>      if (primaryRegion != null) {<a name="line.4639"></a>
+<span class="sourceLineNo">4640</span>        HBaseTestingUtility.closeRegionAndWAL(primaryRegion);<a name="line.4640"></a>
+<span class="sourceLineNo">4641</span>      }<a name="line.4641"></a>
+<span class="sourceLineNo">4642</span>      if (secondaryRegion != null) {<a name="line.4642"></a>
+<span class="sourceLineNo">4643</span>        HBaseTestingUtility.closeRegionAndWAL(secondaryRegion);<a name="line.4643"></a>
+<span class="sourceLineNo">4644</span>      }<a name="line.4644"></a>
+<span class="sourceLineNo">4645</span>    }<a name="line.4645"></a>
+<span class="sourceLineNo">4646</span>  }<a name="line.4646"></a>
+<span class="sourceLineNo">4647</span><a name="line.4647"></a>
+<span class="sourceLineNo">4648</span>  static WALFactory createWALFactory(Configuration conf, Path rootDir) throws IOException {<a name="line.4648"></a>
+<span class="sourceLineNo">4649</span>    Configuration confForWAL = new Configuration(conf);<a name="line.4649"></a>
+<span class="sourceLineNo">4650</span>    confForWAL.set(HConstants.HBASE_DIR, rootDir.toString());<a name="line.4650"></a>
+<span class="sourceLineNo">4651</span>    return new WALFactory(confForWAL, "hregion-" + RandomStringUtils.randomNumeric(8));<a name="line.4651"></a>
+<span class="sourceLineNo">4652</span>  }<a name="line.4652"></a>
+<span class="sourceLineNo">4653</span><a name="line.4653"></a>
+<span class="sourceLineNo">4654</span>  @Test<a name="line.4654"></a>
+<span class="sourceLineNo">4655</span>  public void testCompactionFromPrimary() throws IOException {<a name="line.4655"></a>
+<span class="sourceLineNo">4656</span>    Path rootDir = new Path(dir + name.getMethodName());<a name="line.4656"></a>
+<span class="sourceLineNo">4657</span>    FSUtils.setRootDir(TEST_UTIL.getConfiguration(), rootDir);<a name="line.4657"></a>
+<span class="sourceLineNo">4658</span><a name="line.4658"></a>
+<span class="sourceLineNo">4659</span>    byte[][] families = new byte[][] {<a name="line.4659"></a>
+<span class="sourceLineNo">4660</span>        Bytes.toBytes("cf1"), Bytes.toBytes("cf2"), Bytes.toBytes("cf3")<a name="line.4660"></a>
+<span class="sourceLineNo">4661</span>    };<a name="line.4661"></a>
+<span class="sourceLineNo">4662</span>    byte[] cq = Bytes.toBytes("cq");<a name="line.4662"></a>
+<span class="sourceLineNo">4663</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.4663"></a>
+<span class="sourceLineNo">4664</span>    for (byte[] family : families) {<a name="line.4664"></a>
+<span class="sourceLineNo">4665</span>      htd.addFamily(new HColumnDescriptor(family));<a name="line.4665"></a>
+<span class="sourceLineNo">4666</span>    }<a name="line.4666"></a>
 <span class="sourceLineNo">4667</span><a name="line.4667"></a>
-<span class="sourceLineNo">4668</span>    try {<a name="line.4668"></a>
-<span class="sourceLineNo">4669</span>      primaryRegion = HBaseTestingUtility.createRegionAndWAL(primaryHri,<a name="line.4669"></a>
-<span class="sourceLineNo">4670</span>          rootDir, TEST_UTIL.getConfiguration(), htd);<a name="line.4670"></a>
-<span class="sourceLineNo">4671</span><a name="line.4671"></a>
-<span class="sourceLineNo">4672</span>      // load some data<a name="line.4672"></a>
-<span class="sourceLineNo">4673</span>      putData(primaryRegion, 0, 1000, cq, families);<a name="line.4673"></a>
-<span class="sourceLineNo">4674</span><a name="line.4674"></a>
-<span class="sourceLineNo">4675</span>      // flush region<a name="line.4675"></a>
-<span class="sourceLineNo">4676</span>      primaryRegion.flush(true);<a name="line.4676"></a>
+<span class="sourceLineNo">4668</span>    long time = System.currentTimeMillis();<a name="line.4668"></a>
+<span class="sourceLineNo">4669</span>    HRegionInfo primaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4669"></a>
+<span class="sourceLineNo">4670</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4670"></a>
+<span class="sourceLineNo">4671</span>      false, time, 0);<a name="line.4671"></a>
+<span class="sourceLineNo">4672</span>    HRegionInfo secondaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4672"></a>
+<span class="sourceLineNo">4673</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4673"></a>
+<span class="sourceLineNo">4674</span>      false, time, 1);<a name="line.4674"></a>
+<span class="sourceLineNo">4675</span><a name="line.4675"></a>
+<span class="sourceLineNo">4676</span>    HRegion primaryRegion = null, secondaryRegion = null;<a name="line.4676"></a>
 <span class="sourceLineNo">4677</span><a name="line.4677"></a>
-<span class="sourceLineNo">4678</span>      // open secondary region<a name="line.4678"></a>
-<span class="sourceLineNo">4679</span>      secondaryRegion = HRegion.openHRegion(rootDir, secondaryHri, htd, null, CONF);<a name="line.4679"></a>
-<span class="sourceLineNo">4680</span><a name="line.4680"></a>
-<span class="sourceLineNo">4681</span>      // move the file of the primary region to the archive, simulating a compaction<a name="line.4681"></a>
-<span class="sourceLineNo">4682</span>      Collection&lt;HStoreFile&gt; storeFiles = primaryRegion.getStore(families[0]).getStorefiles();<a name="line.4682"></a>
-<span class="sourceLineNo">4683</span>      primaryRegion.getRegionFileSystem().removeStoreFiles(Bytes.toString(families[0]), storeFiles);<a name="line.4683"></a>
-<span class="sourceLineNo">4684</span>      Collection&lt;StoreFileInfo&gt; storeFileInfos = primaryRegion.getRegionFileSystem()<a name="line.4684"></a>
-<span class="sourceLineNo">4685</span>          .getStoreFiles(families[0]);<a name="line.4685"></a>
-<span class="sourceLineNo">4686</span>      Assert.assertTrue(storeFileInfos == null || storeFileInfos.isEmpty());<a name="line.4686"></a>
+<span class="sourceLineNo">4678</span>    try {<a name="line.4678"></a>
+<span class="sourceLineNo">4679</span>      primaryRegion = HBaseTestingUtility.createRegionAndWAL(primaryHri,<a name="line.4679"></a>
+<span class="sourceLineNo">4680</span>          rootDir, TEST_UTIL.getConfiguration(), htd);<a name="line.4680"></a>
+<span class="sourceLineNo">4681</span><a name="line.4681"></a>
+<span class="sourceLineNo">4682</span>      // load some data<a name="line.4682"></a>
+<span class="sourceLineNo">4683</span>      putData(primaryRegion, 0, 1000, cq, families);<a name="line.4683"></a>
+<span class="sourceLineNo">4684</span><a name="line.4684"></a>
+<span class="sourceLineNo">4685</span>      // flush region<a name="line.4685"></a>
+<span class="sourceLineNo">4686</span>      primaryRegion.flush(true);<a name="line.4686"></a>
 <span class="sourceLineNo">4687</span><a name="line.4687"></a>
-<span class="sourceLineNo">4688</span>      verifyData(secondaryRegion, 0, 1000, cq, families);<a name="line.4688"></a>
-<span class="sourceLineNo">4689</span>    } finally {<a name="line.4689"></a>
-<span class="sourceLineNo">4690</span>      if (primaryRegion != null) {<a name="line.4690"></a>
-<span class="sourceLineNo">4691</span>        HBaseTestingUtility.closeRegionAndWAL(primaryRegion);<a name="line.4691"></a>
-<span class="sourceLineNo">4692</span>      }<a name="line.4692"></a>
-<span class="sourceLineNo">4693</span>      if (secondaryRegion != null) {<a name="line.4693"></a>
-<span class="sourceLineNo">4694</span>        HBaseTestingUtility.closeRegionAndWAL(secondaryRegion);<a name="line.4694"></a>
-<span class="sourceLineNo">4695</span>      }<a name="line.4695"></a>
-<span class="sourceLineNo">4696</span>    }<a name="line.4696"></a>
-<span class="sourceLineNo">4697</span>  }<a name="line.4697"></a>
-<span class="sourceLineNo">4698</span><a name="line.4698"></a>
-<span class="sourceLineNo">4699</span>  private void putData(int startRow, int numRows, byte[] qf, byte[]... families) throws<a name="line.4699"></a>
-<span class="sourceLineNo">4700</span>      IOException {<a name="line.4700"></a>
-<span class="sourceLineNo">4701</span>    putData(this.region, startRow, numRows, qf, families);<a name="line.4701"></a>
-<span class="sourceLineNo">4702</span>  }<a name="line.4702"></a>
-<span class="sourceLineNo">4703</span><a name="line.4703"></a>
-<span class="sourceLineNo">4704</span>  private void putData(HRegion region,<a name="line.4704"></a>
-<span class="sourceLineNo">4705</span>      int startRow, int numRows, byte[] qf, byte[]... families) throws IOException {<a name="line.4705"></a>
-<span class="sourceLineNo">4706</span>    putData(region, Durability.SKIP_WAL, startRow, numRows, qf, families);<a name="line.4706"></a>
+<span class="sourceLineNo">4688</span>      // open secondary region<a name="line.4688"></a>
+<span class="sourceLineNo">4689</span>      secondaryRegion = HRegion.openHRegion(rootDir, secondaryHri, htd, null, CONF);<a name="line.4689"></a>
+<span class="sourceLineNo">4690</span><a name="line.4690"></a>
+<span class="sourceLineNo">4691</span>      // move the file of the primary region to the archive, simulating a compaction<a name="line.4691"></a>
+<span class="sourceLineNo">4692</span>      Collection&lt;HStoreFile&gt; storeFiles = primaryRegion.getStore(families[0]).getStorefiles();<a name="line.4692"></a>
+<span class="sourceLineNo">4693</span>      primaryRegion.getRegionFileSystem().removeStoreFiles(Bytes.toString(families[0]), storeFiles);<a name="line.4693"></a>
+<span class="sourceLineNo">4694</span>      Collection&lt;StoreFileInfo&gt; storeFileInfos = primaryRegion.getRegionFileSystem()<a name="line.4694"></a>
+<span class="sourceLineNo">4695</span>          .getStoreFiles(families[0]);<a name="line.4695"></a>
+<span class="sourceLineNo">4696</span>      Assert.assertTrue(storeFileInfos == null || storeFileInfos.isEmpty());<a name="line.4696"></a>
+<span class="sourceLineNo">4697</span><a name="line.4697"></a>
+<span class="sourceLineNo">4698</span>      verifyData(secondaryRegion, 0, 1000, cq, families);<a name="line.4698"></a>
+<span class="sourceLineNo">4699</span>    } finally {<a name="line.4699"></a>
+<span class="sourceLineNo">4700</span>      if (primaryRegion != null) {<a name="line.4700"></a>
+<span class="sourceLineNo">4701</span>        HBaseTestingUtility.closeRegionAndWAL(primaryRegion);<a name="line.4701"></a>
+<span class="sourceLineNo">4702</span>      }<a name="line.4702"></a>
+<span class="sourceLineNo">4703</span>      if (secondaryRegion != null) {<a name="line.4703"></a>
+<span class="sourceLineNo">4704</span>        HBaseTestingUtility.closeRegionAndWAL(secondaryRegion);<a name="line.4704"></a>
+<span class="sourceLineNo">4705</span>      }<a name="line.4705"></a>
+<span class="sourceLineNo">4706</span>    }<a name="line.4706"></a>
 <span class="sourceLineNo">4707</span>  }<a name="line.4707"></a>
 <span class="sourceLineNo">4708</span><a name="line.4708"></a>
-<span class="sourceLineNo">4709</span>  static void putData(HRegion region, Durability durability,<a name="line.4709"></a>
-<span class="sourceLineNo">4710</span>      int startRow, int numRows, byte[] qf, byte[]... families) throws IOException {<a name="line.4710"></a>
-<span class="sourceLineNo">4711</span>    for (int i = startRow; i &lt; startRow + numRows; i++) {<a name="line.4711"></a>
-<span class="sourceLineNo">4712</span>      Put put = new Put(Bytes.toBytes("" + i));<a name="line.4712"></a>
-<span class="sourceLineNo">4713</span>      put.setDurability(durability);<a name="line.4713"></a>
-<span class="sourceLineNo">4714</span>      for (byte[] family : families) {<a name="line.4714"></a>
-<span class="sourceLineNo">4715</span>        put.addColumn(family, qf, null);<a name="line.4715"></a>
-<span class="sourceLineNo">4716</span>      }<a name="line.4716"></a>
-<span class="sourceLineNo">4717</span>      region.put(put);<a name="line.4717"></a>
-<span class="sourceLineNo">4718</span>      LOG.info(put.toString());<a name="line.4718"></a>
-<span class="sourceLineNo">4719</span>    }<a name="line.4719"></a>
-<span class="sourceLineNo">4720</span>  }<a name="line.4720"></a>
-<span class="sourceLineNo">4721</span><a name="line.4721"></a>
-<span class="sourceLineNo">4722</span>  static void verifyData(HRegion newReg, int startRow, int numRows, byte[] qf, byte[]... families)<a name="line.4722"></a>
-<span class="sourceLineNo">4723</span>      throws IOException {<a name="line.4723"></a>
-<span class="sourceLineNo">4724</span>    for (int i = startRow; i &lt; startRow + numRows; i++) {<a name="line.4724"></a>
-<span class="sourceLineNo">4725</span>      byte[] row = Bytes.toBytes("" + i);<a name="line.4725"></a>
-<span class="sourceLineNo">4726</span>      Get get = new Get(row);<a name="line.4726"></a>
-<span class="sourceLineNo">4727</span>      for (byte[] family : families) {<a name="line.4727"></a>
-<span class="sourceLineNo">4728</span>        get.addColumn(family, qf);<a name="line.4728"></a>
-<span class="sourceLineNo">4729</span>      }<a name="line.4729"></a>
-<span class="sourceLineNo">4730</span>      Result result = newReg.get(get);<a name="line.4730"></a>
-<span class="sourceLineNo">4731</span>      Cell[] raw = result.rawCells();<a name="line.4731"></a>
-<span class="sourceLineNo">4732</span>      assertEquals(families.length, result.size());<a name="line.4732"></a>
-<span class="sourceLineNo">4733</span>      for (int j = 0; j &lt; families.length; j++) {<a name="line.4733"></a>
-<span class="sourceLineNo">4734</span>        assertTrue(CellUtil.matchingRows(raw[j], row));<a name="line.4734"></a>
-<span class="sourceLineNo">4735</span>        assertTrue(CellUtil.matchingFamily(raw[j], families[j]));<a name="line.4735"></a>
-<span class="sourceLineNo">4736</span>        assertTrue(CellUtil.matchingQualifier(raw[j], qf));<a name="line.4736"></a>
-<span class="sourceLineNo">4737</span>      }<a name="line.4737"></a>
-<span class="sourceLineNo">4738</span>    }<a name="line.4738"></a>
-<span class="sourceLineNo">4739</span>  }<a name="line.4739"></a>
-<span class="sourceLineNo">4740</span><a name="line.4740"></a>
-<span class="sourceLineNo">4741</span>  static void assertGet(final HRegion r, final byte[] family, final byte[] k) throws IOException {<a name="line.4741"></a>
-<span class="sourceLineNo">4742</span>    // Now I have k, get values out and assert they are as expected.<a name="line.4742"></a>
-<span class="sourceLineNo">4743</span>    Get get = new Get(k).addFamily(family).readAllVersions();<a name="line.4743"></a>
-<span class="sourceLineNo">4744</span>    Cell[] results = r.get(get).rawCells();<a name="line.4744"></a>
-<span class="sourceLineNo">4745</span>    for (int j = 0; j &lt; results.length; j++) {<a name="line.4745"></a>
-<span class="sourceLineNo">4746</span>      byte[] tmp = CellUtil.cloneValue(results[j]);<a name="line.4746"></a>
-<span class="sourceLineNo">4747</span>      // Row should be equal to value every time.<a name="line.4747"></a>
-<span class="sourceLineNo">4748</span>      assertTrue(Bytes.equals(k, tmp));<a name="line.4748"></a>
-<span class="sourceLineNo">4749</span>    }<a name="line.4749"></a>
-<span class="sourceLineNo">4750</span>  }<a name="line.4750"></a>
-<span class="sourceLineNo">4751</span><a name="line.4751"></a>
-<span class="sourceLineNo">4752</span>  /*<a name="line.4752"></a>
-<span class="sourceLineNo">4753</span>   * Assert first value in the passed region is &lt;code&gt;firstValue&lt;/code&gt;.<a name="line.4753"></a>
-<span class="sourceLineNo">4754</span>   *<a name="line.4754"></a>
-<span class="sourceLineNo">4755</span>   * @param r<a name="line.4755"></a>
-<span class="sourceLineNo">4756</span>   *<a name="line.4756"></a>
-<span class="sourceLineNo">4757</span>   * @param fs<a name="line.4757"></a>
-<span class="sourceLineNo">4758</span>   *<a name="line.4758"></a>
-<span class="sourceLineNo">4759</span>   * @param firstValue<a name="line.4759"></a>
-<span class="sourceLineNo">4760</span>   *<a name="line.4760"></a>
-<span class="sourceLineNo">4761</span>   * @throws IOException<a name="line.4761"></a>
-<span class="sourceLineNo">4762</span>   */<a name="line.4762"></a>
-<span class="sourceLineNo">4763</span>  protected void assertScan(final HRegion r, final byte[] fs, final byte[] firstValue)<a name="line.4763"></a>
-<span class="sourceLineNo">4764</span>      throws IOException {<a name="line.4764"></a>
-<span class="sourceLineNo">4765</span>    byte[][] families = { fs };<a name="line.4765"></a>
-<span class="sourceLineNo">4766</span>    Scan scan = new Scan();<a name="line.4766"></a>
-<span class="sourceLineNo">4767</span>    for (int i = 0; i &lt; families.length; i++)<a name="line.4767"></a>
-<span class="sourceLineNo">4768</span>      scan.addFamily(families[i]);<a name="line.4768"></a>
-<span class="sourceLineNo">4769</span>    InternalScanner s = r.getScanner(scan);<a name="line.4769"></a>
-<span class="sourceLineNo">4770</span>    try {<a name="line.4770"></a>
-<span class="sourceLineNo">4771</span>      List&lt;Cell&gt; curVals = new ArrayList&lt;&gt;();<a name="line.4771"></a>
-<span class="sourceLineNo">4772</span>      boolean first = true;<a name="line.4772"></a>
-<span class="sourceLineNo">4773</span>      OUTER_LOOP: while (s.next(curVals)) {<a name="line.4773"></a>
-<span class="sourceLineNo">4774</span>        for (Cell kv : curVals) {<a name="line.4774"></a>
-<span class="sourceLineNo">4775</span>          byte[] val = CellUtil.cloneValue(kv);<a name="line.4775"></a>
-<span class="sourceLineNo">4776</span>          byte[] curval = val;<a name="line.4776"></a>
-<span class="sourceLineNo">4777</span>          if (first) {<a name="line.4777"></a>
-<span class="sourceLineNo">4778</span>            first = false;<a name="line.4778"></a>
-<span class="sourceLineNo">4779</span>            assertTrue(Bytes.compareTo(curval, firstValue) == 0);<a name="line.4779"></a>
-<span class="sourceLineNo">4780</span>          } else {<a name="line.4780"></a>
-<span class="sourceLineNo">4781</span>            // Not asserting anything. Might as well break.<a name="line.4781"></a>
-<span class="sourceLineNo">4782</span>            break OUTER_LOOP;<a name="line.4782"></a>
-<span class="sourceLineNo">4783</span>          }<a name="line.4783"></a>
-<span class="sourceLineNo">4784</span>        }<a name="line.4784"></a>
-<span class="sourceLineNo">4785</span>      }<a name="line.4785"></a>
-<span class="sourceLineNo">4786</span>    } finally {<a name="line.4786"></a>
-<span class="sourceLineNo">4787</span>      s.close();<a name="line.4787"></a>
-<span class="sourceLineNo">4788</span>    }<a name="line.4788"></a>
-<span class="sourceLineNo">4789</span>  }<a name="line.4789"></a>
-<span class="sourceLineNo">4790</span><a name="line.4790"></a>
-<span class="sourceLineNo">4791</span>  /**<a name="line.4791"></a>
-<span class="sourceLineNo">4792</span>   * Test that we get the expected flush results back<a name="line.4792"></a>
-<span class="sourceLineNo">4793</span>   */<a name="line.4793"></a>
-<span class="sourceLineNo">4794</span>  @Test<a name="line.4794"></a>
-<span class="sourceLineNo">4795</span>  public void testFlushResult() throws IOException {<a name="line.4795"></a>
-<span class="sourceLineNo">4796</span>    byte[] family = Bytes.toBytes("family");<a name="line.4796"></a>
-<span class="sourceLineNo">4797</span><a name="line.4797"></a>
-<span class="sourceLineNo">4798</span>    this.region = initHRegion(tableName, method, family);<a name="line.4798"></a>
-<span class="sourceLineNo">4799</span><a name="line.4799"></a>
-<span class="sourceLineNo">4800</span>    // empty memstore, flush doesn't run<a name="line.4800"></a>
-<span class="sourceLineNo">4801</span>    HRegion.FlushResult fr = region.flush(true);<a name="line.4801"></a>
-<span class="sourceLineNo">4802</span>    assertFalse(fr.isFlushSucceeded());<a name="line.4802"></a>
-<span class="sourceLineNo">4803</span>    assertFalse(fr.isCompactionNeeded());<a name="line.4803"></a>
-<span class="sourceLineNo">4804</span><a name="line.4804"></a>
-<span class="sourceLineNo">4805</span>    // Flush enough files to get up to the threshold, doesn't need compactions<a name="line.4805"></a>
-<span class="sourceLineNo">4806</span>    for (int i = 0; i &lt; 2; i++) {<a name="line.4806"></a>
-<span class="sourceLineNo">4807</span>      Put put = new Put(tableName.toBytes()).addColumn(family, family, tableName.toBytes());<a name="line.4807"></a>
-<span class="sourceLineNo">4808</span>      region.put(put);<a name="line.4808"></a>
-<span class="sourceLineNo">4809</span>      fr = region.flush(true);<a name="line.4809"></a>
-<span class="sourceLineNo">4810</span>      assertTrue(fr.isFlushSucceeded());<a name="line.4810"></a>
-<span class="sourceLineNo">4811</span>      assertFalse(fr.isCompactionNeeded());<a name="line.4811"></a>
-<span class="sourceLineNo">4812</span>    }<a name="line.4812"></a>
-<span class="sourceLineNo">4813</span><a name="line.4813"></a>
-<span class="sourceLineNo">4814</span>    // Two flushes after the threshold, compactions are needed<a name="line.4814"></a>
-<span class="sourceLineNo">4815</span>    for (int i = 0; i &lt; 2; i++) {<a name="line.4815"></a>
-<span class="sourceLineNo">4816</span>      Put put = new Put(tableName.toBytes()).addColumn(family, family, tableName.toBytes());<a name="line.4816"></a>
-<span class="sourceLineNo">4817</span>      region.put(put);<a name="line.4817"></a>
-<span class="sourceLineNo">4818</span>      fr = region.flush(true);<a name="line.4818"></a>
-<span class="sourceLineNo">4819</span>      assertTrue(fr.isFlushSucceeded());<a name="line.4819"></a>
-<span class="sourceLineNo">4820</span>      assertTrue(fr.isCompactionNeeded());<a name="line.4820"></a>
-<span class="sourceLineNo">4821</span>    }<a name="line.4821"></a>
-<span class="sourceLineNo">4822</span>  }<a name="line.4822"></a>
+<span class="sourceLineNo">4709</span>  private void putData(int startRow, int numRows, byte[] qf, byte[]... families) throws<a name="line.4709"></a>
+<span class="sourceLineNo">4710</span>      IOException {<a name="line.4710"></a>
+<span class="sourceLineNo">4711</span>    putData(this.region, startRow, numRows, qf, families);<a name="line.4711"></a>
+<span class="sourceLineNo">4712</span>  }<a name="line.4712"></a>
+<span class="sourceLineNo">4713</span><a name="line.4713"></a>
+<span class="sourceLineNo">4714</span>  private void putData(HRegion region,<a name="line.4714"></a>
+<span class="sourceLineNo">4715</span>      int startRow, int numRows, byte[] qf, byte[]... families) throws IOException {<a name="line.4715"></a>
+<span class="sourceLineNo">4716</span>    putData(region, Durability.SKIP_WAL, startRow, numRows, qf, families);<a name="line.4716"></a>
+<span class="sourceLineNo">4717</span>  }<a name="line.4717"></a>
+<span class="sourceLineNo">4718</span><a name="line.4718"></a>
+<span class="sourceLineNo">4719</span>  static void putData(HRegion region, Durability durability,<a name="line.4719"></a>
+<span class="sourceLineNo">4720</span>      int startRow, int numRows, byte[] qf, byte[]... families) throws IOException {<a name="line.4720"></a>
+<span class="sourceLineNo">4721</span>    for (int i = startRow; i &lt; startRow + numRows; i++) {<a name="line.4721"></a>
+<span class="sourceLineNo">4722</span>      Put put = new Put(Bytes.toBytes("" + i));<a name="line.4722"></a>
+<span class="sourceLineNo">4723</span>      put.setDurability(durability);<a name="line.4723"></a>
+<span class="sourceLineNo">4724</span>      for (byte[] family : families) {<a name="line.4724"></a>
+<span class="sourceLineNo">4725</span>        put.addColumn(family, qf, null);<a name="line.4725"></a>
+<span class="sourceLineNo">4726</span>      }<a name="line.4726"></a>
+<span class="sourceLineNo">4727</span>      region.put(put);<a name="line.4727"></a>
+<span class="sourceLineNo">4728</span>      LOG.info(put.toString());<a name="line.4728"></a>
+<span class="sourceLineNo">4729</span>    }<a name="line.4729"></a>
+<span class="sourceLineNo">4730</span>  }<a name="line.4730"></a>
+<span class="sourceLineNo">4731</span><a name="line.4731"></a>
+<span class="sourceLineNo">4732</span>  static void verifyData(HRegion newReg, int startRow, int numRows, byte[] qf, byte[]... families)<a name="line.4732"></a>
+<span class="sourceLineNo">4733</span>      throws IOException {<a name="line.4733"></a>
+<span class="sourceLineNo">4734</span>    for (int i = startRow; i &lt; startRow + numRows; i++) {<a name="line.4734"></a>
+<span class="sourceLineNo">4735</span>      byte[] row = Bytes.toBytes("" + i);<a name="line.4735"></a>
+<span class="sourceLineNo">4736</span>      Get get = new Get(row);<a name="line.4736"></a>
+<span class="sourceLineNo">4737</span>      for (byte[] family : families) {<a name="line.4737"></a>
+<span class="sourceLineNo">4738</span>        get.addColumn(family, qf);<a name="line.4738"></a>
+<span class="sourceLineNo">4739</span>      }<a name="line.4739"></a>
+<span class="sourceLineNo">4740</span>      Result result = newReg.get(get);<a name="line.4740"></a>
+<span class="sourceLineNo">4741</span>      Cell[] raw = result.rawCells();<a name="line.4741"></a>
+<span class="sourceLineNo">4742</span>      assertEquals(families.length, result.size());<a name="line.4742"></a>
+<span class="sourceLineNo">4743</span>      for (int j = 0; j &lt; families.length; j++) {<a name="line.4743"></a>
+<span class="sourceLineNo">4744</span>        assertTrue(CellUtil.matchingRows(raw[j], row));<a name="line.4744"></a>
+<span class="sourceLineNo">4745</span>        assertTrue(CellUtil.matchingFamily(raw[j], families[j]));<a name="line.4745"></a>
+<span class="sourceLineNo">4746</span>        assertTrue(CellUtil.matchingQualifier(raw[j], qf));<a name="line.4746"></a>
+<span class="sourceLineNo">4747</span>      }<a name="line.4747"></a>
+<span class="sourceLineNo">4748</span>    }<a name="line.4748"></a>
+<span class="sourceLineNo">4749</span>  }<a name="line.4749"></a>
+<span class="sourceLineNo">4750</span><a name="line.4750"></a>
+<span class="sourceLineNo">4751</span>  static void assertGet(final HRegion r, final byte[] family, final byte[] k) throws IOException {<a name="line.4751"></a>
+<span class="sourceLineNo">4752</span>    // Now I have k, get values out and assert they are as expected.<a name="line.4752"></a>
+<span class="sourceLineNo">4753</span>    Get get = new Get(k).addFamily(family).readAllVersions();<a name="line.4753"></a>
+<span class="sourceLineNo">4754</span>    Cell[] results = r.get(get).rawCells();<a name="line.4754"></a>
+<span class="sourceLineNo">4755</span>    for (int j = 0; j &lt; results.length; j++) {<a name="line.4755"></a>
+<span class="sourceLineNo">4756</span>      byte[] tmp = CellUtil.cloneValue(results[j]);<a name="line.4756"></a>
+<span class="sourceLineNo">4757</span>      // Row should be equal to value every time.<a name="line.4757"></a>
+<span class="sourceLineNo">4758</span>      assertTrue(Bytes.equals(k, tmp));<a name="line.4758"></a>
+<span class="sourceLineNo">4759</span>    }<a name="line.4759"></a>
+<span class="sourceLineNo">4760</span>  }<a name="line.4760"></a>
+<span class="sourceLineNo">4761</span><a name="line.4761"></a>
+<span class="sourceLineNo">4762</span>  /*<a name="line.4762"></a>
+<span class="sourceLineNo">4763</span>   * Assert first value in the passed region is &lt;code&gt;firstValue&lt;/code&gt;.<a name="line.4763"></a>
+<span class="sourceLineNo">4764</span>   *<a name="line.4764"></a>
+<span class="sourceLineNo">4765</span>   * @param r<a name="line.4765"></a>
+<span class="sourceLineNo">4766</span>   *<a name="line.4766"></a>
+<span class="sourceLineNo">4767</span>   * @param fs<a name="line.4767"></a>
+<span class="sourceLineNo">4768</span>   *<a name="line.4768"></a>
+<span class="sourceLineNo">4769</span>   * @param firstValue<a name="line.4769"></a>
+<span class="sourceLineNo">4770</span>   *<a name="line.4770"></a>
+<span class="sourceLineNo">4771</span>   * @throws IOException<a name="line.4771"></a>
+<span class="sourceLineNo">4772</span>   */<a name="line.4772"></a>
+<span class="sourceLineNo">4773</span>  protected void assertScan(final HRegion r, final byte[] fs, final byte[] firstValue)<a name="line.4773"></a>
+<span class="sourceLineNo">4774</span>      throws IOException {<a name="line.4774"></a>
+<span class="sourceLineNo">4775</span>    byte[][] families = { fs };<a name="line.4775"></a>
+<span class="sourceLineNo">4776</span>    Scan scan = new Scan();<a name="line.4776"></a>
+<span class="sourceLineNo">4777</span>    for (int i = 0; i &lt; families.length; i++)<a name="line.4777"></a>
+<span class="sourceLineNo">4778</span>      scan.addFamily(families[i]);<a name="line.4778"></a>
+<span class="sourceLineNo">4779</span>    InternalScanner s = r.getScanner(scan);<a name="line.4779"></a>
+<span class="sourceLineNo">4780</span>    try {<a name="line.4780"></a>
+<span class="sourceLineNo">4781</span>      List&lt;Cell&gt; curVals = new ArrayList&lt;&gt;();<a name="line.4781"></a>
+<span class="sourceLineNo">4782</span>      boolean first = true;<a name="line.4782"></a>
+<span class="sourceLineNo">4783</span>      OUTER_LOOP: while (s.next(curVals)) {<a name="line.4783"></a>
+<span class="sourceLineNo">4784</span>        for (Cell kv : curVals) {<a name="line.4784"></a>
+<span class="sourceLineNo">4785</span>          byte[] val = CellUtil.cloneValue(kv);<a name="line.4785"></a>
+<span class="sourceLineNo">4786</span>          byte[] curval = val;<a name="line.4786"></a>
+<span class="sourceLineNo">4787</span>          if (first) {<a name="line.4787"></a>
+<span class="sourceLineNo">4788</span>            first = false;<a name="line.4788"></a>
+<span class="sourceLineNo">4789</span>            assertTrue(Bytes.compareTo(curval, firstValue) == 0);<a name="line.4789"></a>
+<span class="sourceLineNo">4790</span>          } else {<a name="line.4790"></a>
+<span class="sourceLineNo">4791</span>            // Not asserting anything. Might as well break.<a name="line.4791"></a>
+<span class="sourceLineNo">4792</span>            break OUTER_LOOP;<a name="line.4792"></a>
+<span class="sourceLineNo">4793</span>          }<a name="line.4793"></a>
+<span class="sourceLineNo">4794</span>        }<a name="line.4794"></a>
+<span class="sourceLineNo">4795</span>      }<a name="line.4795"></a>
+<span class="sourceLineNo">4796</span>    } finally {<a name="line.4796"></a>
+<span class="sourceLineNo">4797</span>      s.close();<a name="line.4797"></a>
+<span class="sourceLineNo">4798</span>    }<a name="line.4798"></a>
+<span class="sourceLineNo">4799</span>  }<a name="line.4799"></a>
+<span class="sourceLineNo">4800</span><a name="line.4800"></a>
+<span class="sourceLineNo">4801</span>  /**<a name="line.4801"></a>
+<span class="sourceLineNo">4802</span>   * Test that we get the expected flush results back<a name="line.4802"></a>
+<span class="sourceLineNo">4803</span>   */<a name="line.4803"></a>
+<span class="sourceLineNo">4804</span>  @Test<a name="line.4804"></a>
+<span class="sourceLineNo">4805</span>  public void testFlushResult() throws IOException {<a name="line.4805"></a>
+<span class="sourceLineNo">4806</span>    byte[] family = Bytes.toBytes("family");<a name="line.4806"></a>
+<span class="sourceLineNo">4807</span><a name="line.4807"></a>
+<span class="sourceLineNo">4808</span>    this.region = initHRegion(tableName, method, family);<a name="line.4808"></a>
+<span class="sourceLineNo">4809</span><a name="line.4809"></a>
+<span class="sourceLineNo">4810</span>    // empty memstore, flush doesn't run<a name="line.4810"></a>
+<span class="sourceLineNo">4811</span>    HRegion.FlushResult fr = region.flush(true);<a name="line.4811"></a>
+<span class="sourceLineNo">4812</span>    assertFalse(fr.isFlushSucceeded());<a name="line.4812"></a>
+<span class="sourceLineNo">4813</span>    assertFalse(fr.isCompactionNeeded());<a name="line.4813"></a>
+<span class="sourceLineNo">4814</span><a name="line.4814"></a>
+<span class="sourceLineNo">4815</span>    // Flush enough files to get up to the threshold, doesn't need compactions<a name="line.4815"></a>
+<span class="sourceLineNo">4816</span>    for (int i = 0; i &lt; 2; i++) {<a name="line.4816"></a>
+<span class="sourceLineNo">4817</span>      Put put = new Put(tableName.toBytes()).addColumn(family, family, tableName.toBytes());<a name="line.4817"></a>
+<span class="sourceLineNo">4818</span>      region.put(put);<a name="line.4818"></a>
+<span class="sourceLineNo">4819</span>      fr = region.flush(true);<a name="line.4819"></a>
+<span class="sourceLineNo">4820</span>      assertTrue(fr.isFlushSucceeded());<a name="line.4820"></a>
+<span class="sourceLineNo">4821</span>      assertFalse(fr.isCompactionNeeded());<a name="line.4821"></a>
+<span class="sourceLineNo">4822</span>    }<a name="line.4822"></a>
 <span class="sourceLineNo">4823</span><a name="line.4823"></a>
-<span class="sourceLineNo">4824</span>  protected Configuration initSplit() {<a name="line.4824"></a>
-<span class="sourceLineNo">4825</span>    // Always compact if there is more than one store file.<a name="line.4825"></a>
-<span class="sourceLineNo">4826</span>    CONF.setInt("hbase.hstore.compactionThreshold", 2);<a name="line.4826"></a>
-<span class="sourceLineNo">4827</span><a name="line.4827"></a>
-<span class="sourceLineNo">4828</span>    CONF.setInt(HConstants.HBASE_CLIENT_SCANNER_TIMEOUT_PERIOD, 10 * 1000);<a name="line.4828"></a>
-<span class="sourceLineNo">4829</span><a name="line.4829"></a>
-<span class="sourceLineNo">4830</span>    // Increase the amount of time between client retries<a name="line.4830"></a>
-<span class="sourceLineNo">4831</span>    CONF.setLong("hbase.client.pause", 15 * 1000);<a name="line.4831"></a>
-<span class="sourceLineNo">4832</span><a name="line.4832"></a>
-<span class="sourceLineNo">4833</span>    // This size should make it so we always split using the addContent<a name="line.4833"></a>
-<span class="sourceLineNo">4834</span>    // below. After adding all data, the first region is 1.3M<a name="line.4834"></a>
-<span class="sourceLineNo">4835</span>    CONF.setLong(HConstants.HREGION_MAX_FILESIZE, 1024 * 128);<a name="line.4835"></a>
-<span class="sourceLineNo">4836</span>    return CONF;<a name="line.4836"></a>
-<span class="sourceLineNo">4837</span>  }<a name="line.4837"></a>
-<span class="sourceLineNo">4838</span><a name="line.4838"></a>
-<span class="sourceLineNo">4839</span>  /**<a name="line.4839"></a>
-<span class="sourceLineNo">4840</span>   * @return A region on which you must call<a name="line.4840"></a>
-<span class="sourceLineNo">4841</span>   *         {@link HBaseTestingUtility#closeRegionAndWAL(HRegion)} when done.<a name="line.4841"></a>
-<span class="sourceLineNo">4842</span>   */<a name="line.4842"></a>
-<span class="sourceLineNo">4843</span>  protected HRegion initHRegion(TableName tableName, String callingMethod, Configuration conf,<a name="line.4843"></a>
-<span class="sourceLineNo">4844</span>      byte[]... families) throws IOException {<a name="line.4844"></a>
-<span class="sourceLineNo">4845</span>    return initHRegion(tableName, callingMethod, conf, false, families);<a name="line.4845"></a>
-<span class="sourceLineNo">4846</span>  }<a name="line.4846"></a>
-<span class="sourceLineNo">4847</span><a name="line.4847"></a>
-<span class="sourceLineNo">4848</span>  /**<a name="line.4848"></a>
-<span class="sourceLineNo">4849</span>   * @return A region on which you must call<a name="line.4849"></a>
-<span class="sourceLineNo">4850</span>   *         {@link HBaseTestingUtility#closeRegionAndWAL(HRegion)} when done.<a name="line.4850"></a>
-<span class="sourceLineNo">4851</span>   */<a name="line.4851"></a>
-<span class="sourceLineNo">4852</span>  protected HRegion initHRegion(TableName tableName, String callingMethod, Configuration conf,<a name="line.4852"></a>
-<span class="sourceLineNo">4853</span>      boolean isReadOnly, byte[]... families) throws IOException {<a name="line.4853"></a>
-<span class="sourceLineNo">4854</span>    return initHRegion(tableName, null, null, callingMethod, conf, isReadOnly, families);<a name="line.4854"></a>
-<span class="sourceLineNo">4855</span>  }<a name="line.4855"></a>
-<span class="sourceLineNo">4856</span><a name="line.4856"></a>
-<span class="sourceLineNo">4857</span>  protected HRegion initHRegion(TableName tableName, byte[] startKey, byte[] stopKey,<a name="line.4857"></a>
-<span class="sourceLineNo">4858</span>      String callingMethod, Configuration conf, boolean isReadOnly, byte[]... families)<a name="line.4858"></a>
-<span class="sourceLineNo">4859</span>      throws IOException {<a name="line.4859"></a>
-<span class="sourceLineNo">4860</span>    Path logDir = TEST_UTIL.getDataTestDirOnTestFS(callingMethod + ".log");<a name="line.4860"></a>
-<span class="sourceLineNo">4861</span>    ChunkCreator.initialize(MemStoreLABImpl.CHUNK_SIZE_DEFAULT, false, 0, 0, 0, null);<a name="line.4861"></a>
-<span class="sourceLineNo">4862</span>    HRegionInfo hri = new HRegionInfo(tableName, startKey, stopKey);<a name="line.4862"></a>
-<span class="sourceLineNo">4863</span>    final WAL wal = HBaseTestingUtility.createWal(conf, logDir, hri);<a name="line.4863"></a>
-<span class="sourceLineNo">4864</span>    return initHRegion(tableName, startKey, stopKey, isReadOnly,<a name="line.4864"></a>
-<span class="sourceLineNo">4865</span>        Durability.SYNC_WAL, wal, families);<a name="line.4865"></a>
-<span class="sourceLineNo">4866</span>  }<a name="line.4866"></a>
-<span class="sourceLineNo">4867</span><a name="line.4867"></a>
-<span class="sourceLineNo">4868</span>  /**<a name="line.4868"></a>
-<span class="sourceLineNo">4869</span>   * @return A region on which you must call<a name="line.4869"></a>
-<span class="sourceLineNo">4870</span>   *         {@link HBaseTestingUtility#closeRegionAndWAL(HRegion)} when done.<a name="line.4870"></a>
-<span class="sourceLineNo">4871</span>   */<a name="line.4871"></a>
-<span class="sourceLineNo">4872</span>  public HRegion initHRegion(TableName tableName, byte[] startKey, byte[] stopKey,<a name="line.4872"></a>
-<span class="sourceLineNo">4873</span>      boolean isReadOnly, Durability durability, WAL wal, byte[]... families) throws IOException {<a name="line.4873"></a>
-<span class="sourceLineNo">4874</span>    return TEST_UTIL.createLocalHRegion(tableName, startKey, stopKey,<a name="line.4874"></a>
-<span class="sourceLineNo">4875</span>        isReadOnly, durability, wal, families);<a name="line.4875"></a>
+<span class="sourceLineNo">4824</span>    // Two flushes after the threshold, compactions are needed<a name="line.4824"></a>
+<span class="sourceLineNo">4825</span>    for (int i = 0; i &lt; 2; i++) {<a name="line.4825"></a>
+<span class="sourceLineNo">4826</span>      Put put = new Put(tableName.toBytes()).addColumn(family, family, tableName.toBytes());<a name="line.4826"></a>
+<span class="sourceLineNo">4827</span>      region.put(put);<a name="line.4827"></a>
+<span class="sourceLineNo">4828</span>      fr = region.flush(true);<a name="line.4828"></a>
+<span class="sourceLineNo">4829</span>      assertTrue(fr.isFlushSucceeded());<a name="line.4829"></a>
+<span class="sourceLineNo">4830</span>      assertTrue(fr.isCompactionNeeded());<a name="line.4830"></a>
+<span class="sourceLineNo">4831</span>    }<a name="line.4831"></a>
+<span class="sourceLineNo">4832</span>  }<a name="line.4832"></a>
+<span class="sourceLineNo">4833</span><a name="line.4833"></a>
+<span class="sourceLineNo">4834</span>  protected Configuration initSplit() {<a name="line.4834"></a>
+<span class="sourceLineNo">4835</span>    // Always compact if there is more than one store file.<a name="line.4835"></a>
+<span class="sourceLineNo">4836</span>    CONF.setInt("hbase.hstore.compactionThreshold", 2);<a name="line.4836"></a>
+<span class="sourceLineNo">4837</span><a name="line.4837"></a>
+<span class="sourceLineNo">4838</span>    CONF.setInt(HConstants.HBASE_CLIENT_SCANNER_TIMEOUT_PERIOD, 10 * 1000);<a name="line.4838"></a>
+<span class="sourceLineNo">4839</span><a name="line.4839"></a>
+<span class="sourceLineNo">4840</span>    // Increase the amount of time between client retries<a name="line.4840"></a>
+<span class="sourceLineNo">4841</span>    CONF.setLong("hbase.client.pause", 15 * 1000);<a name="line.4841"></a>
+<span class="sourceLineNo">4842</span><a name="line.4842"></a>
+<span class="sourceLineNo">4843</span>    // This size should make it so we always split using the addContent<a name="line.4843"></a>
+<span class="sourceLineNo">4844</span>    // below. After adding all data, the first region is 1.3M<a name="line.4844"></a>
+<span class="sourceLineNo">4845</span>    CONF.setLong(HConstants.HREGION_MAX_FILESIZE, 1024 * 128);<a name="line.4845"></a>
+<span class="sourceLineNo">4846</span>    return CONF;<a name="line.4846"></a>
+<span class="sourceLineNo">4847</span>  }<a name="line.4847"></a>
+<span class="sourceLineNo">4848</span><a name="line.4848"></a>
+<span class="sourceLineNo">4849</span>  /**<a name="line.4849"></a>
+<span class="sourceLineNo">4850</span>   * @return A region on which you must call<a name="line.4850"></a>
+<span class="sourceLineNo">4851</span>   *         {@link HBaseTestingUtility#closeRegionAndWAL(HRegion)} when done.<a name="line.4851"></a>
+<span class="sourceLineNo">4852</span>   */<a name="line.4852"></a>
+<span class="sourceLineNo">4853</span>  protected HRegion initHRegion(TableName tableName, String callingMethod, Configuration conf,<a name="line.4853"></a>
+<span class="sourceLineNo">4854</span>      byte[]... families) throws IOException {<a name="line.4854"></a>
+<span class="sourceLineNo">4855</span>    return initHRegion(tableName, callingMethod, conf, false, families);<a name="line.4855"></a>
+<span class="sourceLineNo">4856</span>  }<a name="line.4856"></a>
+<span class="sourceLineNo">4857</span><a name="line.4857"></a>
+<span class="sourceLineNo">4858</span>  /**<a name="line.4858"></a>
+<span class="sourceLineNo">4859</span>   * @return A region on which you must call<a name="line.4859"></a>
+<span class="sourceLineNo">4860</span>   *         {@link HBaseTestingUtility#closeRegionAndWAL(HRegion)} when done.<a name="line.4860"></a>
+<span class="sourceLineNo">4861</span>   */<a name="line.4861"></a>
+<span class="sourceLineNo">4862</span>  protected HRegion initHRegion(TableName tableName, String callingMethod, Configuration conf,<a name="line.4862"></a>
+<span class="sourceLineNo">4863</span>      boolean isReadOnly, byte[]... families) throws IOException {<a name="line.4863"></a>
+<span class="sourceLineNo">4864</span>    return initHRegion(tableName, null, null, callingMethod, conf, isReadOnly, families);<a name="line.4864"></a>
+<span class="sourceLineNo">4865</span>  }<a name="line.4865"></a>
+<span class="sourceLineNo">4866</span><a name="line.4866"></a>
+<span class="sourceLineNo">4867</span>  protected HRegion initHRegion(TableName tableName, byte[] startKey, byte[] stopKey,<a name="line.4867"></a>
+<span class="sourceLineNo">4868</span>      String callingMethod, Configuration conf, boolean isReadOnly, byte[]... families)<a name="line.4868"></a>
+<span class="sourceLineNo">4869</span>      throws IOException {<a name="line.4869"></a>
+<span class="sourceLineNo">4870</span>    Path logDir = TEST_UTIL.getDataTestDirOnTestFS(callingMethod + ".log");<a name="line.4870"></a>
+<span class="sourceLineNo">4871</span>    ChunkCreator.initialize(MemStoreLABImpl.CHUNK_SIZE_DEFAULT, false, 0, 0, 0, null);<a name="line.4871"></a>
+<span class="sourceLineNo">4872</span>    HRegionInfo hri = new HRegionInfo(tableName, startKey, stopKey);<a name="line.4872"></a>
+<span class="sourceLineNo">4873</span>    final WAL wal = HBaseTestingUtility.createWal(conf, logDir, hri);<a name="line.4873"></a>
+<span class="sourceLineNo">4874</span>    return initHRegion(tableName, startKey, stopKey, isReadOnly,<a name="line.4874"></a>
+<span class="sourceLineNo">4875</span>        Durability.SYNC_WAL, wal, families);<a name="line.4875"></a>
 <span class="sourceLineNo">4876</span>  }<a name="line.4876"></a>
 <span class="sourceLineNo">4877</span><a name="line.4877"></a>
 <span class="sourceLineNo">4878</span>  /**<a name="line.4878"></a>
-<span class="sourceLineNo">4879</span>   * Assert that the passed in Cell has expected contents for the specified row,<a name="line.4879"></a>
-<span class="sourceLineNo">4880</span>   * column &amp; timestamp.<a name="line.4880"></a>
+<span class="sourceLineNo">4879</span>   * @return A region on which you must call<a name="line.4879"></a>
+<span class="sourceLineNo">4880</span>   *         {@link HBaseTestingUtility#closeRegionAndWAL(HRegion)} when done.<a name="line.4880"></a>
 <span class="sourceLineNo">4881</span>   */<a name="line.4881"></a>
-<span class="sourceLineNo">4882</span>  private void checkOneCell(Cell kv, byte[] cf, int rowIdx, int colIdx, long ts) {<a name="line.4882"></a>
-<span class="sourceLineNo">4883</span>    String ctx = "rowIdx=" + rowIdx + "; colIdx=" + colIdx + "; ts=" + ts;<a name="line.4883"></a>
-<span class="sourceLineNo">4884</span>    assertEquals("Row mismatch which checking: " + ctx, "row:" + rowIdx,<a name="line.4884"></a>
-<span class="sourceLineNo">4885</span>        Bytes.toString(CellUtil.cloneRow(kv)));<a name="line.4885"></a>
-<span class="sourceLineNo">4886</span>    assertEquals("ColumnFamily mismatch while checking: " + ctx, Bytes.toString(cf),<a name="line.4886"></a>
-<span class="sourceLineNo">4887</span>        Bytes.toString(CellUtil.cloneFamily(kv)));<a name="line.4887"></a>
-<span class="sourceLineNo">4888</span>    assertEquals("Column qualifier mismatch while checking: " + ctx, "column:" + colIdx,<a name="line.4888"></a>
-<span class="sourceLineNo">4889</span>        Bytes.toString(CellUtil.cloneQualifier(kv)));<a name="line.4889"></a>
-<span class="sourceLineNo">4890</span>    assertEquals("Timestamp mismatch while checking: " + ctx, ts, kv.getTimestamp());<a name="line.4890"></a>
-<span class="sourceLineNo">4891</span>    assertEquals("Value mismatch while checking: " + ctx, "value-version-" + ts,<a name="line.4891"></a>
-<span class="sourceLineNo">4892</span>        Bytes.toString(CellUtil.cloneValue(kv)));<a name="line.4892"></a>
-<span class="sourceLineNo">4893</span>  }<a name="line.4893"></a>
-<span class="sourceLineNo">4894</span><a name="line.4894"></a>
-<span class="sourceLineNo">4895</span>  @Test<a name="line.4895"></a>
-<span class="sourceLineNo">4896</span>  public void testReverseScanner_FromMemStore_SingleCF_Normal()<a name="line.4896"></a>
-<span class="sourceLineNo">4897</span>      throws IOException {<a name="line.4897"></a>
-<span class="sourceLineNo">4898</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.4898"></a>
-<span class="sourceLineNo">4899</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.4899"></a>
-<span class="sourceLineNo">4900</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.4900"></a>
-<span class="sourceLineNo">4901</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.4901"></a>
-<span class="sourceLineNo">4902</span>    byte[][] families = { cf };<a name="line.4902"></a>
-<span class="sourceLineNo">4903</span>    byte[] col = Bytes.toBytes("C");<a name="line.4903"></a>
-<span class="sourceLineNo">4904</span>    long ts = 1;<a name="line.4904"></a>
-<span class="sourceLineNo">4905</span>    this.region = initHRegion(tableName, method, families);<a name="line.4905"></a>
-<span class="sourceLineNo">4906</span>    KeyValue kv1 = new KeyValue(rowC, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4906"></a>
-<span class="sourceLineNo">4907</span>    KeyValue kv11 = new KeyValue(rowC, cf, col, ts + 1, KeyValue.Type.Put,<a name="line.4907"></a>
-<span class="sourceLineNo">4908</span>        null);<a name="line.4908"></a>
-<span class="sourceLineNo">4909</span>    KeyValue kv2 = new KeyValue(rowA, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4909"></a>
-<span class="sourceLineNo">4910</span>    KeyValue kv3 = new KeyValue(rowB, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4910"></a>
-<span class="sourceLineNo">4911</span>    Put put = null;<a name="line.4911"></a>
-<span class="sourceLineNo">4912</span>    put = new Put(rowC);<a name="line.4912"></a>
-<span class="sourceLineNo">4913</span>    put.add(kv1);<a name="line.4913"></a>
-<span class="sourceLineNo">4914</span>    put.add(kv11);<a name="line.4914"></a>
-<span class="sourceLineNo">4915</span>    region.put(put);<a name="line.4915"></a>
-<span class="sourceLineNo">4916</span>    put = new Put(rowA);<a name="line.4916"></a>
-<span class="sourceLineNo">4917</span>    put.add(kv2);<a name="line.4917"></a>
-<span class="sourceLineNo">4918</span>    region.put(put);<a name="line.4918"></a>
-<span class="sourceLineNo">4919</span>    put = new Put(rowB);<a name="line.4919"></a>
-<span class="sourceLineNo">4920</span>    put.add(kv3);<a name="line.4920"></a>
-<span class="sourceLineNo">4921</span>    region.put(put);<a name="line.4921"></a>
-<span class="sourceLineNo">4922</span><a name="line.4922"></a>
-<span class="sourceLineNo">4923</span>    Scan scan = new Scan(rowC);<a name="line.4923"></a>
-<span class="sourceLineNo">4924</span>    scan.setMaxVersions(5);<a name="line.4924"></a>
-<span class="sourceLineNo">4925</span>    scan.setReversed(true);<a name="line.4925"></a>
-<span class="sourceLineNo">4926</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.4926"></a>
-<span class="sourceLineNo">4927</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.4927"></a>
-<span class="sourceLineNo">4928</span>    boolean hasNext = scanner.next(currRow);<a name="line.4928"></a>
-<span class="sourceLineNo">4929</span>    assertEquals(2, currRow.size());<a name="line.4929"></a>
-<span class="sourceLineNo">4930</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4930"></a>
-<span class="sourceLineNo">4931</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.4931"></a>
-<span class="sourceLineNo">4932</span>    assertTrue(hasNext);<a name="line.4932"></a>
-<span class="sourceLineNo">4933</span>    currRow.clear();<a name="line.4933"></a>
-<span class="sourceLineNo">4934</span>    hasNext = scanner.next(currRow);<a name="line.4934"></a>
-<span class="sourceLineNo">4935</span>    assertEquals(1, currRow.size());<a name="line.4935"></a>
-<span class="sourceLineNo">4936</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4936"></a>
-<span class="sourceLineNo">4937</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.4937"></a>
-<span class="sourceLineNo">4938</span>    assertTrue(hasNext);<a name="line.4938"></a>
-<span class="sourceLineNo">4939</span>    currRow.clear();<a name="line.4939"></a>
-<span class="sourceLineNo">4940</span>    hasNext = scanner.next(currRow);<a name="line.4940"></a>
-<span class="sourceLineNo">4941</span>    assertEquals(1, currRow.size());<a name="line.4941"></a>
-<span class="sourceLineNo">4942</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4942"></a>
-<span class="sourceLineNo">4943</span>        .get(0).getRowLength(), rowA, 0, rowA.length));<a name="line.4943"></a>
-<span class="sourceLineNo">4944</span>    assertFalse(hasNext);<a name="line.4944"></a>
-<span class="sourceLineNo">4945</span>    scanner.close();<a name="line.4945"></a>
-<span class="sourceLineNo">4946</span>  }<a name="line.4946"></a>
-<span class="sourceLineNo">4947</span><a name="line.4947"></a>
-<span class="sourceLineNo">4948</span>  @Test<a name="line.4948"></a>
-<span class="sourceLineNo">4949</span>  public void testReverseScanner_FromMemStore_SingleCF_LargerKey()<a name="line.4949"></a>
-<span class="sourceLineNo">4950</span>      throws IOException {<a name="line.4950"></a>
-<span class="sourceLineNo">4951</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.4951"></a>
-<span class="sourceLineNo">4952</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.4952"></a>
-<span class="sourceLineNo">4953</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.4953"></a>
-<span class="sourceLineNo">4954</span>    byte[] rowD = Bytes.toBytes("rowD");<a name="line.4954"></a>
-<span class="sourceLineNo">4955</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.4955"></a>
-<span class="sourceLineNo">4956</span>    byte[][] families = { cf };<a name="line.4956"></a>
-<span class="sourceLineNo">4957</span>    byte[] col = Bytes.toBytes("C");<a name="line.4957"></a>
-<span class="sourceLineNo">4958</span>    long ts = 1;<a name="line.4958"></a>
-<span class="sourceLineNo">4959</span>    this.region = initHRegion(tableName, method, families);<a name="line.4959"></a>
-<span class="sourceLineNo">4960</span>    KeyValue kv1 = new KeyValue(rowC, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4960"></a>
-<span class="sourceLineNo">4961</span>    KeyValue kv11 = new KeyValue(rowC, cf, col, ts + 1, KeyValue.Type.Put,<a name="line.4961"></a>
-<span class="sourceLineNo">4962</span>        null);<a name="line.4962"></a>
-<span class="sourceLineNo">4963</span>    KeyValue kv2 = new KeyValue(rowA, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4963"></a>
-<span class="sourceLineNo">4964</span>    KeyValue kv3 = new KeyValue(rowB, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4964"></a>
-<span class="sourceLineNo">4965</span>    Put put = null;<a name="line.4965"></a>
-<span class="sourceLineNo">4966</span>    put = new Put(rowC);<a name="line.4966"></a>
-<span class="sourceLineNo">4967</span>    put.add(kv1);<a name="line.4967"></a>
-<span class="sourceLineNo">4968</span>    put.add(kv11);<a name="line.4968"></a>
-<span class="sourceLineNo">4969</span>    region.put(put);<a name="line.4969"></a>
-<span class="sourceLineNo">4970</span>    put = new Put(rowA);<a name="line.4970"></a>
-<span class="sourceLineNo">4971</span>    put.add(kv2);<a name="line.4971"></a>
-<span class="sourceLineNo">4972</span>    region.put(put);<a name="line.4972"></a>
-<span class="sourceLineNo">4973</span>    put = new Put(rowB);<a name="line.4973"></a>
-<span class="sourceLineNo">4974</span>    put.add(kv3);<a name="line.4974"></a>
-<span class="sourceLineNo">4975</span>    region.put(put);<a name="line.4975"></a>
-<span class="sourceLineNo">4976</span><a name="line.4976"></a>
-<span class="sourceLineNo">4977</span>    Scan scan = new Scan(rowD);<a name="line.4977"></a>
-<span class="sourceLineNo">4978</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.4978"></a>
-<span class="sourceLineNo">4979</span>    scan.setReversed(true);<a name="line.4979"></a>
-<span class="sourceLineNo">4980</span>    scan.setMaxVersions(5);<a name="line.4980"></a>
-<span class="sourceLineNo">4981</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.4981"></a>
-<span class="sourceLineNo">4982</span>    boolean hasNext = scanner.next(currRow);<a name="line.4982"></a>
-<span class="sourceLineNo">4983</span>    assertEquals(2, currRow.size());<a name="line.4983"></a>
-<span class="sourceLineNo">4984</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4984"></a>
-<span class="sourceLineNo">4985</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.4985"></a>
-<span class="sourceLineNo">4986</span>    assertTrue(hasNext);<a name="line.4986"></a>
-<span class="sourceLineNo">4987</span>    currRow.clear();<a name="line.4987"></a>
-<span class="sourceLineNo">4988</span>    hasNext = scanner.next(currRow);<a name="line.4988"></a>
-<span class="sourceLineNo">4989</span>    assertEquals(1, currRow.size());<a name="line.4989"></a>
-<span class="sourceLineNo">4990</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4990"></a>
-<span class="sourceLineNo">4991</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.4991"></a>
-<span class="sourceLineNo">4992</span>    assertTrue(hasNext);<a name="line.4992"></a>
-<span class="sourceLineNo">4993</span>    currRow.clear();<a name="line.4993"></a>
-<span class="sourceLineNo">4994</span>    hasNext = scanner.next(currRow);<a name="line.4994"></a>
-<span class="sourceLineNo">4995</span>    assertEquals(1, currRow.size());<a name="line.4995"></a>
-<span class="sourceLineNo">4996</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4996"></a>
-<span class="sourceLineNo">4997</span>        .get(0).getRowLength(), rowA, 0, rowA.length));<a name="line.4997"></a>
-<span class="sourceLineNo">4998</span>    assertFalse(hasNext);<a name="line.4998"></a>
-<span class="sourceLineNo">4999</span>    scanner.close();<a name="line.4999"></a>
-<span class="sourceLineNo">5000</span>  }<a name="line.5000"></a>
-<span class="sourceLineNo">5001</span><a name="line.5001"></a>
-<span class="sourceLineNo">5002</span>  @Test<a name="line.5002"></a>
-<span class="sourceLineNo">5003</span>  public void testReverseScanner_FromMemStore_SingleCF_FullScan()<a name="line.5003"></a>
-<span class="sourceLineNo">5004</span>      throws IOException {<a name="line.5004"></a>
-<span class="sourceLineNo">5005</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.5005"></a>
-<span class="sourceLineNo">5006</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.5006"></a>
-<span class="sourceLineNo">5007</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.5007"></a>
-<span class="sourceLineNo">5008</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.5008"></a>
-<span class="sourceLineNo">5009</span>    byte[][] families = { cf };<a name="line.5009"></a>
-<span class="sourceLineNo">5010</span>    byte[] col = Bytes.toBytes("C");<a name="line.5010"></a>
-<span class="sourceLineNo">5011</span>    long ts = 1;<a name="line.5011"></a>
-<span class="sourceLineNo">5012</span>    this.region = initHRegion(tableName, method, families);<a name="line.5012"></a>
-<span class="sourceLineNo">5013</span>    KeyValue kv1 = new KeyValue(rowC, cf, col, ts, KeyValue.Type.Put, null);<a name="line.5013"></a>
-<span class="sourceLineNo">5014</span>    KeyValue kv11 = new KeyValue(rowC, cf, col, ts + 1, KeyValue.Type.Put,<a name="line.5014"></a>
-<span class="sourceLineNo">5015</span>        null);<a name="line.5015"></a>
-<span class="sourceLineNo">5016</span>    KeyValue kv2 = new KeyValue(rowA, cf, col, ts, KeyValue.Type.Put, null);<a name="line.5016"></a>
-<span class="sourceLineNo">5017</span>    KeyValue kv3 = new KeyValue(rowB, cf, col, ts, KeyValue.Type.Put, null);<a name="line.5017"></a>
-<span class="sourceLineNo">5018</span>    Put put = null;<a name="line.5018"></a>
-<span class="sourceLineNo">5019</span>    put = new Put(rowC);<a name="line.5019"></a>
-<span class="sourceLineNo">5020</span>    put.add(kv1);<a name="line.5020"></a>
-<span class="sourceLineNo">5021</span>    put.add(kv11);<a name="line.5021"></a>
-<span class="sourceLineNo">5022</span>    region.put(put);<a name="line.5022"></a>
-<span class="sourceLineNo">5023</span>    put = new Put(rowA);<a name="line.5023"></a>
-<span class="sourceLineNo">5024</span>    put.add(kv2);<a name="line.5024"></a>
-<span class="sourceLineNo">5025</span>    region.put(put);<a name="line.5025"></a>
-<span class="sourceLineNo">5026</span>    put = new Put(rowB);<a name="line.5026"></a>
-<span class="sourceLineNo">5027</span>    put.add(kv3);<a name="line.5027"></a>
-<span class="sourceLineNo">5028</span>    region.put(put);<a name="line.5028"></a>
-<span class="sourceLineNo">5029</span>    Scan scan = new Scan();<a name="line.5029"></a>
-<span class="sourceLineNo">5030</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5030"></a>
-<span class="sourceLineNo">5031</span>    scan.setReversed(true);<a name="line.5031"></a>
-<span class="sourceLineNo">5032</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5032"></a>
-<span class="sourceLineNo">5033</span>    boolean hasNext = scanner.next(currRow);<a name="line.5033"></a>
-<span class="sourceLineNo">5034</span>    assertEquals(1, currRow.size());<a name="line.5034"></a>
-<span class="sourceLineNo">5035</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5035"></a>
-<span class="sourceLineNo">5036</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.5036"></a>
-<span class="sourceLineNo">5037</span>    assertTrue(hasNext);<a name="line.5037"></a>
-<span class="sourceLineNo">5038</span>    currRow.clear();<a name="line.5038"></a>
-<span class="sourceLineNo">5039</span>    hasNext = scanner.next(currRow);<a name="line.5039"></a>
-<span class="sourceLineNo">5040</span>    assertEquals(1, currRow.size());<a name="line.5040"></a>
-<span class="sourceLineNo">5041</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5041"></a>
-<span class="sourceLineNo">5042</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.5042"></a>
-<span class="sourceLineNo">5043</span>    assertTrue(hasNext);<a name="line.5043"></a>
-<span class="sourceLineNo">5044</span>    currRow.clear();<a name="line.5044"></a>
-<span class="sourceLineNo">5045</span>    hasNext = scanner.next(currRow);<a name="line.5045"></a>
-<span class="sourceLineNo">5046</span>    assertEquals(1, currRow.size());<a name="line.5046"></a>
-<span class="sourceLineNo">5047</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5047"></a>
-<span class="sourceLineNo">5048</span>        .get(0).getRowLength(), rowA, 0, rowA.length));<a name="line.5048"></a>
-<span class="sourceLineNo">5049</span>    assertFalse(hasNext);<a name="line.5049"></a>
-<span class="sourceLineNo">5050</span>    scanner.close();<a name="line.5050"></a>
-<span class="sourceLineNo">5051</span>  }<a name="line.5051"></a>
-<span class="sourceLineNo">5052</span><a name="line.5052"></a>
-<span class="sourceLineNo">5053</span>  @Test<a name="line.5053"></a>
-<span class="sourceLineNo">5054</span>  public void testReverseScanner_moreRowsMayExistAfter() throws IOException {<a name="line.5054"></a>
-<span class="sourceLineNo">5055</span>    // case for "INCLUDE_AND_SEEK_NEXT_ROW &amp; SEEK_NEXT_ROW" endless loop<a name="line.5055"></a>
-<span class="sourceLineNo">5056</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.5056"></a>
-<span class="sourceLineNo">5057</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.5057"></a>
-<span class="sourceLineNo">5058</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.5058"></a>
-<span class="sourceLineNo">5059</span>    byte[] rowD = Bytes.toBytes("rowD");<a name="line.5059"></a>
-<span class="sourceLineNo">5060</span>    byte[] rowE = Bytes.toBytes("rowE");<a name="line.5060"></a>
-<span class="sourceLineNo">5061</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.5061"></a>
-<span class="sourceLineNo">5062</span>    byte[][] families = { cf };<a name="line.5062"></a>
-<span class="sourceLineNo">5063</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.5063"></a>
-<span class="sourceLineNo">5064</span>    byte[] col2 = Bytes.toBytes("col2");<a name="line.5064"></a>
-<span class="sourceLineNo">5065</span>    long ts = 1;<a name="line.5065"></a>
-<span class="sourceLineNo">5066</span>    this.region = initHRegion(tableName, method, families);<a name="line.5066"></a>
-<span class="sourceLineNo">5067</span>    KeyValue kv1 = new KeyValue(rowA, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5067"></a>
-<span class="sourceLineNo">5068</span>    KeyValue kv2 = new KeyValue(rowB, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5068"></a>
-<span class="sourceLineNo">5069</span>    KeyValue kv3 = new KeyValue(rowC, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5069"></a>
-<span class="sourceLineNo">5070</span>    KeyValue kv4_1 = new KeyValue(rowD, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5070"></a>
-<span class="sourceLineNo">5071</span>    KeyValue kv4_2 = new KeyValue(rowD, cf, col2, ts, KeyValue.Type.Put, null);<a name="line.5071"></a>
-<span class="sourceLineNo">5072</span>    KeyValue kv5 = new KeyValue(rowE, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5072"></a>
-<span class="sourceLineNo">5073</span>    Put put = null;<a name="line.5073"></a>
-<span class="sourceLineNo">5074</span>    put = new Put(rowA);<a name="line.5074"></a>
-<span class="sourceLineNo">5075</span>    put.add(kv1);<a name="line.5075"></a>
-<span class="sourceLineNo">5076</span>    region.put(put);<a name="line.5076"></a>
-<span class="sourceLineNo">5077</span>    put = new Put(rowB);<a name="line.5077"></a>
-<span class="sourceLineNo">5078</span>    put.add(kv2);<a name="line.5078"></a>
-<span class="sourceLineNo">5079</span>    region.put(put);<a name="line.5079"></a>
-<span class="sourceLineNo">5080</span>    put = new Put(rowC);<a name="line.5080"></a>
-<span class="sourceLineNo">5081</span>    put.add(kv3);<a name="line.5081"></a>
-<span class="sourceLineNo">5082</span>    region.put(put);<a name="line.5082"></a>
-<span class="sourceLineNo">5083</span>    put = new Put(rowD);<a name="line.5083"></a>
-<span class="sourceLineNo">5084</span>    put.add(kv4_1);<a name="line.5084"></a>
-<span class="sourceLineNo">5085</span>    region.put(put);<a name="line.5085"></a>
-<span class="sourceLineNo">5086</span>    put = new Put(rowD);<a name="line.5086"></a>
-<span class="sourceLineNo">5087</span>    put.add(kv4_2);<a name="line.5087"></a>
-<span class="sourceLineNo">5088</span>    region.put(put);<a name="line.5088"></a>
-<span class="sourceLineNo">5089</span>    put = new Put(rowE);<a name="line.5089"></a>
-<span class="sourceLineNo">5090</span>    put.add(kv5);<a name="line.5090"></a>
-<span class="sourceLineNo">5091</span>    region.put(put);<a name="line.5091"></a>
-<span class="sourceLineNo">5092</span>    region.flush(true);<a name="line.5092"></a>
-<span class="sourceLineNo">5093</span>    Scan scan = new Scan(rowD, rowA);<a name="line.5093"></a>
-<span class="sourceLineNo">5094</span>    scan.addColumn(families[0], col1);<a name="line.5094"></a>
-<span class="sourceLineNo">5095</span>    scan.setReversed(true);<a name="line.5095"></a>
-<span class="sourceLineNo">5096</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5096"></a>
-<span class="sourceLineNo">5097</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5097"></a>
-<span class="sourceLineNo">5098</span>    boolean hasNext = scanner.next(currRow);<a name="line.5098"></a>
-<span class="sourceLineNo">5099</span>    assertEquals(1, currRow.size());<a name="line.5099"></a>
-<span class="sourceLineNo">5100</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5100"></a>
-<span class="sourceLineNo">5101</span>        .get(0).getRowLength(), rowD, 0, rowD.length));<a name="line.5101"></a>
-<span class="sourceLineNo">5102</span>    assertTrue(hasNext);<a name="line.5102"></a>
-<span class="sourceLineNo">5103</span>    currRow.clear();<a name="line.5103"></a>
-<span class="sourceLineNo">5104</span>    hasNext = scanner.next(currRow);<a name="line.5104"></a>
-<span class="sourceLineNo">5105</span>    assertEquals(1, currRow.size());<a name="line.5105"></a>
-<span class="sourceLineNo">5106</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5106"></a>
-<span class="sourceLineNo">5107</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.5107"></a>
-<span class="sourceLineNo">5108</span>    assertTrue(hasNext);<a name="line.5108"></a>
-<span class="sourceLineNo">5109</span>    currRow.clear();<a name="line.5109"></a>
-<span class="sourceLineNo">5110</span>    hasNext = scanner.next(currRow);<a name="line.5110"></a>
-<span class="sourceLineNo">5111</span>    assertEquals(1, currRow.size());<a name="line.5111"></a>
-<span class="sourceLineNo">5112</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5112"></a>
-<span class="sourceLineNo">5113</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.5113"></a>
-<span class="sourceLineNo">5114</span>    assertFalse(hasNext);<a name="line.5114"></a>
-<span class="sourceLineNo">5115</span>    scanner.close();<a name="line.5115"></a>
-<span class="sourceLineNo">5116</span><a name="line.5116"></a>
-<span class="sourceLineNo">5117</span>    scan = new Scan(rowD, rowA);<a name="line.5117"></a>
-<span class="sourceLineNo">5118</span>    scan.addColumn(families[0], col2);<a name="line.5118"></a>
-<span class="sourceLineNo">5119</span>    scan.setReversed(true);<a name="line.5119"></a>
-<span class="sourceLineNo">5120</span>    currRow.clear();<a name="line.5120"></a>
-<span class="sourceLineNo">5121</span>    scanner = region.getScanner(scan);<a name="line.5121"></a>
-<span class="sourceLineNo">5122</span>    hasNext = scanner.next(currRow);<a name="line.5122"></a>
-<span class="sourceLineNo">5123</span>    assertEquals(1, currRow.size());<a name="line.5123"></a>
-<span class="sourceLineNo">5124</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5124"></a>
-<span class="sourceLineNo">5125</span>        .get(0).getRowLength(), rowD, 0, rowD.length));<a name="line.5125"></a>
-<span class="sourceLineNo">5126</span>    scanner.close();<a name="line.5126"></a>
-<span class="sourceLineNo">5127</span>  }<a name="line.5127"></a>
-<span class="sourceLineNo">5128</span><a name="line.5128"></a>
-<span class="sourceLineNo">5129</span>  @Test<a name="line.5129"></a>
-<span class="sourceLineNo">5130</span>  public void testReverseScanner_smaller_blocksize() throws IOException {<a name="line.5130"></a>
-<span class="sourceLineNo">5131</span>    // case to ensure no conflict with HFile index optimization<a name="line.5131"></a>
-<span class="sourceLineNo">5132</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.5132"></a>
-<span class="sourceLineNo">5133</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.5133"></a>
-<span class="sourceLineNo">5134</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.5134"></a>
-<span class="sourceLineNo">5135</span>    byte[] rowD = Bytes.toBytes("rowD");<a name="line.5135"></a>
-<span class="sourceLineNo">5136</span>    byte[] rowE = Bytes.toBytes("rowE");<a name="line.5136"></a>
-<span class="sourceLineNo">5137</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.5137"></a>
-<span class="sourceLineNo">5138</span>    byte[][] families = { cf };<a name="line.5138"></a>
-<span class="sourceLineNo">5139</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.5139"></a>
-<span class="sourceLineNo">5140</span>    byte[] col2 = Bytes.toBytes("col2");<a name="line.5140"></a>
-<span class="sourceLineNo">5141</span>    long ts = 1;<a name="line.5141"></a>
-<span class="sourceLineNo">5142</span>    HBaseConfiguration config = new HBaseConfiguration();<a name="line.5142"></a>
-<span class="sourceLineNo">5143</span>    config.setInt("test.block.size", 1);<a name="line.5143"></a>
-<span class="sourceLineNo">5144</span>    this.region = initHRegion(tableName, method, config, families);<a name="line.5144"></a>
-<span class="sourceLineNo">5145</span>    KeyValue kv1 = new KeyValue(rowA, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5145"></a>
-<span class="sourceLineNo">5146</span>    KeyValue kv2 = new KeyValue(rowB, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5146"></a>
-<span class="sourceLineNo">5147</span>    KeyValue kv3 = new KeyValue(rowC, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5147"></a>
-<span class="sourceLineNo">5148</span>    KeyValue kv4_1 = new KeyValue(rowD, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5148"></a>
-<span class="sourceLineNo">5149</span>    KeyValue kv4_2 = new KeyValue(rowD, cf, col2, ts, KeyValue.Type.Put, null);<a name="line.5149"></a>
-<span class="sourceLineNo">5150</span>    KeyValue kv5 = new KeyValue(rowE, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5150"></a>
-<span class="sourceLineNo">5151</span>    Put put = null;<a name="line.5151"></a>
-<span class="sourceLineNo">5152</span>    put = new Put(rowA);<a name="line.5152"></a>
-<span class="sourceLineNo">5153</span>    put.add(kv1);<a name="line.5153"></a>
-<span class="sourceLineNo">5154</span>    region.put(put);<a name="line.5154"></a>
-<span class="sourceLineNo">5155</span>    put = new Put(rowB);<a name="line.5155"></a>
-<span class="sourceLineNo">5156</span>    put.add(kv2);<a name="line.5156"></a>
-<span class="sourceLineNo">5157</span>    region.put(put);<a name="line.5157"></a>
-<span class="sourceLineNo">5158</span>    put = new Put(rowC);<a name="line.5158"></a>
-<span class="sourceLineNo">5159</span>    put.add(kv3);<a name="line.5159"></a>
-<span class="sourceLineNo">5160</span>    region.put(put);<a name="line.5160"></a>
-<span class="sourceLineNo">5161</span>    put = new Put(rowD);<a name="line.5161"></a>
-<span class="sourceLineNo">5162</span>    put.add(kv4_1);<a name="line.5162"></a>
-<span class="sourceLineNo">5163</span>    region.put(put);<a name="line.5163"></a>
-<span class="sourceLineNo">5164</span>    put = new Put(rowD);<a name="line.5164"></a>
-<span class="sourceLineNo">5165</span>    put.add(kv4_2);<a name="line.5165"></a>
-<span class="sourceLineNo">5166</span>    region.put(put);<a name="line.5166"></a>
-<span class="sourceLineNo">5167</span>    put = new Put(rowE);<a name="line.5167"></a>
-<span class="sourceLineNo">5168</span>    put.add(kv5);<a name="line.5168"></a>
-<span class="sourceLineNo">5169</span>    region.put(put);<a name="line.5169"></a>
-<span class="sourceLineNo">5170</span>    region.flush(true);<a name="line.5170"></a>
-<span class="sourceLineNo">5171</span>    Scan scan = new Scan(rowD, rowA);<a name="line.5171"></a>
-<span class="sourceLineNo">5172</span>    scan.addColumn(families[0], col1);<a name="line.5172"></a>
-<span class="sourceLineNo">5173</span>    scan.setReversed(true);<a name="line.5173"></a>
-<span class="sourceLineNo">5174</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5174"></a>
-<span class="sourceLineNo">5175</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5175"></a>
-<span class="sourceLineNo">5176</span>    boolean hasNext = scanner.next(currRow);<a name="line.5176"></a>
-<span class="sourceLineNo">5177</span>    assertEquals(1, currRow.size());<a name="line.5177"></a>
-<span class="sourceLineNo">5178</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5178"></a>
-<span class="sourceLineNo">5179</span>        .get(0).getRowLength(), rowD, 0, rowD.length));<a name="line.5179"></a>
-<span class="sourceLineNo">5180</span>    assertTrue(hasNext);<a name="line.5180"></a>
-<span class="sourceLineNo">5181</span>    currRow.clear();<a name="line.5181"></a>
-<span class="sourceLineNo">5182</span>    hasNext = scanner.next(currRow);<a name="line.5182"></a>
-<span class="sourceLineNo">5183</span>    assertEquals(1, currRow.size());<a name="line.5183"></a>
-<span class="sourceLineNo">5184</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5184"></a>
-<span class="sourceLineNo">5185</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.5185"></a>
-<span class="sourceLineNo">5186</span>    assertTrue(hasNext);<a name="line.5186"></a>
-<span class="sourceLineNo">5187</span>    currRow.clear();<a name="line.5187"></a>
-<span class="sourceLineNo">5188</span>    hasNext = scanner.next(currRow);<a name="line.5188"></a>
-<span class="sourceLineNo">5189</span>    assertEquals(1, currRow.size());<a name="line.5189"></a>
-<span class="sourceLineNo">5190</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5190"></a>
-<span class="sourceLineNo">5191</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.5191"></a>
-<span class="sourceLineNo">5192</span>    assertFalse(hasNext);<a name="line.5192"></a>
-<span class="sourceLineNo">5193</span>    scanner.close();<a name="line.5193"></a>
-<span class="sourceLineNo">5194</span><a name="line.5194"></a>
-<span class="sourceLineNo">5195</span>    scan = new Scan(rowD, rowA);<a name="line.5195"></a>
-<span class="sourceLineNo">5196</span>    scan.addColumn(families[0], col2);<a name="line.5196"></a>
-<span class="sourceLineNo">5197</span>    scan.setReversed(true);<a name="line.5197"></a>
-<span class="sourceLineNo">5198</span>    currRow.clear();<a name="line.5198"></a>
-<span class="sourceLineNo">5199</span>    scanner = region.getScanner(scan);<a name="line.5199"></a>
-<span class="sourceLineNo">5200</span>    hasNext = scanner.next(currRow);<a name="line.5200"></a>
-<span class="sourceLineNo">5201</span>    assertEquals(1, currRow.size());<a name="line.5201"></a>
-<span class="sourceLineNo">5202</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5202"></a>
-<span class="sourceLineNo">5203</span>        .get(0).getRowLength(), rowD, 0, rowD.length));<a name="line.5203"></a>
-<span class="sourceLineNo">5204</span>    scanner.close();<a name="line.5204"></a>
-<span class="sourceLineNo">5205</span>  }<a name="line.5205"></a>
-<span class="sourceLineNo">5206</span><a name="line.5206"></a>
-<span class="sourceLineNo">5207</span>  @Test<a name="line.5207"></a>
-<span class="sourceLineNo">5208</span>  public void testReverseScanner_FromMemStoreAndHFiles_MultiCFs1()<a name="line.5208"></a>
-<span class="sourceLineNo">5209</span>      throws IOException {<a name="line.5209"></a>
-<span class="sourceLineNo">5210</span>    byte[] row0 = Bytes.toBytes("row0"); // 1 kv<a name="line.5210"></a>
-<span class="sourceLineNo">5211</span>    byte[] row1 = Bytes.toBytes("row1"); // 2 kv<a name="line.5211"></a>
-<span class="sourceLineNo">5212</span>    byte[] row2 = Bytes.toBytes("row2"); // 4 kv<a name="line.5212"></a>
-<span class="sourceLineNo">5213</span>    byte[] row3 = Bytes.toBytes("row3"); // 2 kv<a name="line.5213"></a>
-<span class="sourceLineNo">5214</span>    byte[] row4 = Bytes.toBytes("row4"); // 5 kv<a name="line.5214"></a>
-<span class="sourceLineNo">5215</span>    byte[] row5 = Bytes.toBytes("row5"); // 2 kv<a name="line.5215"></a>
-<span class="sourceLineNo">5216</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5216"></a>
-<span class="sourceLineNo">5217</span>    byte[] cf2 = Bytes.toBytes("CF2");<a name="line.5217"></a>
-<span class="sourceLineNo">5218</span>    byte[] cf3 = Bytes.toBytes("CF3");<a name="line.5218"></a>
-<span class="sourceLineNo">5219</span>    byte[][] families = { cf1, cf2, cf3 };<a name="line.5219"></a>
-<span class="sourceLineNo">5220</span>    byte[] col = Bytes.toBytes("C");<a name="line.5220"></a>
-<span class="sourceLineNo">5221</span>    long ts = 1;<a name="line.5221"></a>
-<span class="sourceLineNo">5222</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5222"></a>
-<span class="sourceLineNo">5223</span>    // disable compactions in this test.<a name="line.5223"></a>
-<span class="sourceLineNo">5224</span>    conf.setInt("hbase.hstore.compactionThreshold", 10000);<a name="line.5224"></a>
-<span class="sourceLineNo">5225</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5225"></a>
-<span class="sourceLineNo">5226</span>    // kv naming style: kv(row number) totalKvCountInThisRow seq no<a name="line.5226"></a>
-<span class="sourceLineNo">5227</span>    KeyValue kv0_1_1 = new KeyValue(row0, cf1, col, ts, KeyValue.Type.Put,<a name="line.5227"></a>
-<span class="sourceLineNo">5228</span>        null);<a name="line.5228"></a>
-<span class="sourceLineNo">5229</span>    KeyValue kv1_2_1 = new KeyValue(row1, cf2, col, ts, KeyValue.Type.Put,<a name="line.5229"></a>
-<span class="sourceLineNo">5230</span>        null);<a name="line.5230"></a>
-<span class="sourceLineNo">5231</span>    KeyValue kv1_2_2 = new KeyValue(row1, cf1, col, ts + 1,<a name="line.5231"></a>
-<span class="sourceLineNo">5232</span>        KeyValue.Type.Put, null);<a name="line.5232"></a>
-<span class="sourceLineNo">5233</span>    KeyValue kv2_4_1 = new KeyValue(row2, cf2, col, ts, KeyValue.Type.Put,<a name="line.5233"></a>
-<span class="sourceLineNo">5234</span>        null);<a name="line.5234"></a>
-<span class="sourceLineNo">5235</span>    KeyValue kv2_4_2 = new KeyValue(row2, cf1, col, ts, KeyValue.Type.Put,<a name="line.5235"></a>
-<span class="sourceLineNo">5236</span>        null);<a name="line.5236"></a>
-<span class="sourceLineNo">5237</span>    KeyValue kv2_4_3 = new KeyValue(row2, cf3, col, ts, KeyValue.Type.Put,<a name="line.5237"></a>
+<span class="sourceLineNo">4882</span>  public HRegion initHRegion(TableName tableName, byte[] startKey, byte[] stopKey,<a name="line.4882"></a>
+<span class="sourceLineNo">4883</span>      boolean isReadOnly, Durability durability, WAL wal, byte[]... families) throws IOException {<a name="line.4883"></a>
+<span class="sourceLineNo">4884</span>    return TEST_UTIL.createLocalHRegion(tableName, startKey, stopKey,<a name="line.4884"></a>
+<span class="sourceLineNo">4885</span>        isReadOnly, durability, wal, families);<a name="line.4885"></a>
+<span class="sourceLineNo">4886</span>  }<a name="line.4886"></a>
+<span class="sourceLineNo">4887</span><a name="line.4887"></a>
+<span class="sourceLineNo">4888</span>  /**<a name="line.4888"></a>
+<span class="sourceLineNo">4889</span>   * Assert that the passed in Cell has expected contents for the specified row,<a name="line.4889"></a>
+<span class="sourceLineNo">4890</span>   * column &amp; timestamp.<a name="line.4890"></a>
+<span class="sourceLineNo">4891</span>   */<a name="line.4891"></a>
+<span class="sourceLineNo">4892</span>  private void checkOneCell(Cell kv, byte[] cf, int rowIdx, int colIdx, long ts) {<a name="line.4892"></a>
+<span class="sourceLineNo">4893</span>    String ctx = "rowIdx=" + rowIdx + "; colIdx=" + colIdx + "; ts=" + ts;<a name="line.4893"></a>
+<span class="sourceLineNo">4894</span>    assertEquals("Row mismatch which checking: " + ctx, "row:" + rowIdx,<a name="line.4894"></a>
+<span class="sourceLineNo">4895</span>        Bytes.toString(CellUtil.cloneRow(kv)));<a name="line.4895"></a>
+<span class="sourceLineNo">4896</span>    assertEquals("ColumnFamily mismatch while checking: " + ctx, Bytes.toString(cf),<a name="line.4896"></a>
+<span class="sourceLineNo">4897</span>        Bytes.toString(CellUtil.cloneFamily(kv)));<a name="line.4897"></a>
+<span class="sourceLineNo">4898</span>    assertEquals("Column qualifier mismatch while checking: " + ctx, "column:" + colIdx,<a name="line.4898"></a>
+<span class="sourceLineNo">4899</span>        Bytes.toString(CellUtil.cloneQualifier(kv)));<a name="line.4899"></a>
+<span class="sourceLineNo">4900</span>    assertEquals("Timestamp mismatch while checking: " + ctx, ts, kv.getTimestamp());<a name="line.4900"></a>
+<span class="sourceLineNo">4901</span>    assertEquals("Value mismatch while checking: " + ctx, "value-version-" + ts,<a name="line.4901"></a>
+<span class="sourceLineNo">4902</span>        Bytes.toString(CellUtil.cloneValue(kv)));<a name="line.4902"></a>
+<span class="sourceLineNo">4903</span>  }<a name="line.4903"></a>
+<span class="sourceLineNo">4904</span><a name="line.4904"></a>
+<span class="sourceLineNo">4905</span>  @Test<a name="line.4905"></a>
+<span class="sourceLineNo">4906</span>  public void testReverseScanner_FromMemStore_SingleCF_Normal()<a name="line.4906"></a>
+<span class="sourceLineNo">4907</span>      throws IOException {<a name="line.4907"></a>
+<span class="sourceLineNo">4908</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.4908"></a>
+<span class="sourceLineNo">4909</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.4909"></a>
+<span class="sourceLineNo">4910</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.4910"></a>
+<span class="sourceLineNo">4911</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.4911"></a>
+<span class="sourceLineNo">4912</span>    byte[][] families = { cf };<a name="line.4912"></a>
+<span class="sourceLineNo">4913</span>    byte[] col = Bytes.toBytes("C");<a name="line.4913"></a>
+<span class="sourceLineNo">4914</span>    long ts = 1;<a name="line.4914"></a>
+<span class="sourceLineNo">4915</span>    this.region = initHRegion(tableName, method, families);<a name="line.4915"></a>
+<span class="sourceLineNo">4916</span>    KeyValue kv1 = new KeyValue(rowC, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4916"></a>
+<span class="sourceLineNo">4917</span>    KeyValue kv11 = new KeyValue(rowC, cf, col, ts + 1, KeyValue.Type.Put,<a name="line.4917"></a>
+<span class="sourceLineNo">4918</span>        null);<a name="line.4918"></a>
+<span class="sourceLineNo">4919</span>    KeyValue kv2 = new KeyValue(rowA, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4919"></a>
+<span class="sourceLineNo">4920</span>    KeyValue kv3 = new KeyValue(rowB, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4920"></a>
+<span class="sourceLineNo">4921</span>    Put put = null;<a name="line.4921"></a>
+<span class="sourceLineNo">4922</span>    put = new Put(rowC);<a name="line.4922"></a>
+<span class="sourceLineNo">4923</span>    put.add(kv1);<a name="line.4923"></a>
+<span class="sourceLineNo">4924</span>    put.add(kv11);<a name="line.4924"></a>
+<span class="sourceLineNo">4925</span>    region.put(put);<a name="line.4925"></a>
+<span class="sourceLineNo">4926</span>    put = new Put(rowA);<a name="line.4926"></a>
+<span class="sourceLineNo">4927</span>    put.add(kv2);<a name="line.4927"></a>
+<span class="sourceLineNo">4928</span>    region.put(put);<a name="line.4928"></a>
+<span class="sourceLineNo">4929</span>    put = new Put(rowB);<a name="line.4929"></a>
+<span class="sourceLineNo">4930</span>    put.add(kv3);<a name="line.4930"></a>
+<span class="sourceLineNo">4931</span>    region.put(put);<a name="line.4931"></a>
+<span class="sourceLineNo">4932</span><a name="line.4932"></a>
+<span class="sourceLineNo">4933</span>    Scan scan = new Scan(rowC);<a name="line.4933"></a>
+<span class="sourceLineNo">4934</span>    scan.setMaxVersions(5);<a name="line.4934"></a>
+<span class="sourceLineNo">4935</span>    scan.setReversed(true);<a name="line.4935"></a>
+<span class="sourceLineNo">4936</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.4936"></a>
+<span class="sourceLineNo">4937</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.4937"></a>
+<span class="sourceLineNo">4938</span>    boolean hasNext = scanner.next(currRow);<a name="line.4938"></a>
+<span class="sourceLineNo">4939</span>    assertEquals(2, currRow.size());<a name="line.4939"></a>
+<span class="sourceLineNo">4940</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4940"></a>
+<span class="sourceLineNo">4941</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.4941"></a>
+<span class="sourceLineNo">4942</span>    assertTrue(hasNext);<a name="line.4942"></a>
+<span class="sourceLineNo">4943</span>    currRow.clear();<a name="line.4943"></a>
+<span class="sourceLineNo">4944</span>    hasNext = scanner.next(currRow);<a name="line.4944"></a>
+<span class="sourceLineNo">4945</span>    assertEquals(1, currRow.size());<a name="line.4945"></a>
+<span class="sourceLineNo">4946</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4946"></a>
+<span class="sourceLineNo">4947</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.4947"></a>
+<span class="sourceLineNo">4948</span>    assertTrue(hasNext);<a name="line.4948"></a>
+<span class="sourceLineNo">4949</span>    currRow.clear();<a name="line.4949"></a>
+<span class="sourceLineNo">4950</span>    hasNext = scanner.next(currRow);<a name="line.4950"></a>
+<span class="sourceLineNo">4951</span>    assertEquals(1, currRow.size());<a name="line.4951"></a>
+<span class="sourceLineNo">4952</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4952"></a>
+<span class="sourceLineNo">4953</span>        .get(0).getRowLength(), rowA, 0, rowA.length));<a name="line.4953"></a>
+<span class="sourceLineNo">4954</span>    assertFalse(hasNext);<a name="line.4954"></a>
+<span class="sourceLineNo">4955</span>    scanner.close();<a name="line.4955"></a>
+<span class="sourceLineNo">4956</span>  }<a name="line.4956"></a>
+<span class="sourceLineNo">4957</span><a name="line.4957"></a>
+<span class="sourceLineNo">4958</span>  @Test<a name="line.4958"></a>
+<span class="sourceLineNo">4959</span>  public void testReverseScanner_FromMemStore_SingleCF_LargerKey()<a name="line.4959"></a>
+<span class="sourceLineNo">4960</span>      throws IOException {<a name="line.4960"></a>
+<span class="sourceLineNo">4961</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.4961"></a>
+<span class="sourceLineNo">4962</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.4962"></a>
+<span class="sourceLineNo">4963</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.4963"></a>
+<span class="sourceLineNo">4964</span>    byte[] rowD = Bytes.toBytes("rowD");<a name="line.4964"></a>
+<span class="sourceLineNo">4965</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.4965"></a>
+<span class="sourceLineNo">4966</span>    byte[][] families = { cf };<a name="line.4966"></a>
+<span class="sourceLineNo">4967</span>    byte[] col = Bytes.toBytes("C");<a name="line.4967"></a>
+<span class="sourceLineNo">4968</span>    long ts = 1;<a name="line.4968"></a>
+<span class="sourceLineNo">4969</span>    this.region = initHRegion(tableName, method, families);<a name="line.4969"></a>
+<span class="sourceLineNo">4970</span>    KeyValue kv1 = new KeyValue(rowC, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4970"></a>
+<span class="sourceLineNo">4971</span>    KeyValue kv11 = new KeyValue(rowC, cf, col, ts + 1, KeyValue.Type.Put,<a name="line.4971"></a>
+<span class="sourceLineNo">4972</span>        null);<a name="line.4972"></a>
+<span class="sourceLineNo">4973</span>    KeyValue kv2 = new KeyValue(rowA, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4973"></a>
+<span class="sourceLineNo">4974</span>    KeyValue kv3 = new KeyValue(rowB, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4974"></a>
+<span class="sourceLineNo">4975</span>    Put put = null;<a name="line.4975"></a>
+<span class="sourceLineNo">4976</span>    put = new Put(rowC);<a name="line.4976"></a>
+<span class="sourceLineNo">4977</span>    put.add(kv1);<a name="line.4977"></a>
+<span class="sourceLineNo">4978</span>    put.add(kv11);<a name="line.4978"></a>
+<span class="sourceLineNo">4979</span>    region.put(put);<a name="line.4979"></a>
+<span class="sourceLineNo">4980</span>    put = new Put(rowA);<a name="line.4980"></a>
+<span class="sourceLineNo">4981</span>    put.add(kv2);<a name="line.4981"></a>
+<span class="sourceLineNo">4982</span>    region.put(put);<a name="line.4982"></a>
+<span class="sourceLineNo">4983</span>    put = new Put(rowB);<a name="line.4983"></a>
+<span class="sourceLineNo">4984</span>    put.add(kv3);<a name="line.4984"></a>
+<span class="sourceLineNo">4985</span>    region.put(put);<a name="line.4985"></a>
+<span class="sourceLineNo">4986</span><a name="line.4986"></a>
+<span class="sourceLineNo">4987</span>    Scan scan = new Scan(rowD);<a name="line.4987"></a>
+<span class="sourceLineNo">4988</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.4988"></a>
+<span class="sourceLineNo">4989</span>    scan.setReversed(true);<a name="line.4989"></a>
+<span class="sourceLineNo">4990</span>    scan.setMaxVersions(5);<a name="line.4990"></a>
+<span class="sourceLineNo">4991</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.4991"></a>
+<span class="sourceLineNo">4992</span>    boolean hasNext = scanner.next(currRow);<a name="line.4992"></a>
+<span class="sourceLineNo">4993</span>    assertEquals(2, currRow.size());<a name="line.4993"></a>
+<span class="sourceLineNo">4994</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4994"></a>
+<span class="sourceLineNo">4995</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.4995"></a>
+<span class="sourceLineNo">4996</span>    assertTrue(hasNext);<a name="line.4996"></a>
+<span class="sourceLineNo">4997</span>    currRow.clear();<a name="line.4997"></a>
+<span class="sourceLineNo">4998</span>    hasNext = scanner.next(currRow);<a name="line.4998"></a>
+<span class="sourceLineNo">4999</span>    assertEquals(1, currRow.size());<a name="line.4999"></a>
+<span class="sourceLineNo">5000</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5000"></a>
+<span class="sourceLineNo">5001</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.5001"></a>
+<span class="sourceLineNo">5002</span>    assertTrue(hasNext);<a name="line.5002"></a>
+<span class="sourceLineNo">5003</span>    currRow.clear();<a name="line.5003"></a>
+<span class="sourceLineNo">5004</span>    hasNext = scanner.next(currRow);<a name="line.5004"></a>
+<span class="sourceLineNo">5005</span>    assertEquals(1, currRow.size());<a name="line.5005"></a>
+<span class="sourceLineNo">5006</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5006"></a>
+<span class="sourceLineNo">5007</span>        .get(0).getRowLength(), rowA, 0, rowA.length));<a name="line.5007"></a>
+<span class="sourceLineNo">5008</span>    assertFalse(hasNext);<a name="line.5008"></a>
+<span class="sourceLineNo">5009</span>    scanner.close();<a name="line.5009"></a>
+<span class="sourceLineNo">5010</span>  }<a name="line.5010"></a>
+<span class="sourceLineNo">5011</span><a name="line.5011"></a>
+<span class="sourceLineNo">5012</span>  @Test<a name="line.5012"></a>
+<span class="sourceLineNo">5013</span>  public void testReverseScanner_FromMemStore_SingleCF_FullScan()<a name="line.5013"></a>
+<span class="sourceLineNo">5014</span>      throws IOException {<a name="line.5014"></a>
+<span class="sourceLineNo">5015</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.5015"></a>
+<span class="sourceLineNo">5016</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.5016"></a>
+<span class="sourceLineNo">5017</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.5017"></a>
+<span class="sourceLineNo">5018</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.5018"></a>
+<span class="sourceLineNo">5019</span>    byte[][] families = { cf };<a name="line.5019"></a>
+<span class="sourceLineNo">5020</span>    byte[] col = Bytes.toBytes("C");<a name="line.5020"></a>
+<span class="sourceLineNo">5021</span>    long ts = 1;<a name="line.5021"></a>
+<span class="sourceLineNo">5022</span>    this.region = initHRegion(tableName, method, families);<a name="line.5022"></a>
+<span class="sourceLineNo">5023</span>    KeyValue kv1 = new KeyValue(rowC, cf, col, ts, KeyValue.Type.Put, null);<a name="line.5023"></a>
+<span class="sourceLineNo">5024</span>    KeyValue kv11 = new KeyValue(rowC, cf, col, ts + 1, KeyValue.Type.Put,<a name="line.5024"></a>
+<span class="sourceLineNo">5025</span>        null);<a name="line.5025"></a>
+<span class="sourceLineNo">5026</span>    KeyValue kv2 = new KeyValue(rowA, cf, col, ts, KeyValue.Type.Put, null);<a name="line.5026"></a>
+<span class="sourceLineNo">5027</span>    KeyValue kv3 = new KeyValue(rowB, cf, col, ts, KeyValue.Type.Put, null);<a name="line.5027"></a>
+<span class="sourceLineNo">5028</span>    Put put = null;<a name="line.5028"></a>
+<span class="sourceLineNo">5029</span>    put = new Put(rowC);<a name="line.5029"></a>
+<span class="sourceLineNo">5030</span>    put.add(kv1);<a name="line.5030"></a>
+<span class="sourceLineNo">5031</span>    put.add(kv11);<a name="line.5031"></a>
+<span class="sourceLineNo">5032</span>    region.put(put);<a name="line.5032"></a>
+<span class="sourceLineNo">5033</span>    put = new Put(rowA);<a name="line.5033"></a>
+<span class="sourceLineNo">5034</span>    put.add(kv2);<a name="line.5034"></a>
+<span class="sourceLineNo">5035</span>    region.put(put);<a name="line.5035"></a>
+<span class="sourceLineNo">5036</span>    put = new Put(rowB);<a name="line.5036"></a>
+<span class="sourceLineNo">5037</span>    put.add(kv3);<a name="line.5037"></a>
+<span class="sourceLineNo">5038</span>    region.put(put);<a name="line.5038"></a>
+<span class="sourceLineNo">5039</span>    Scan scan = new Scan();<a name="line.5039"></a>
+<span class="sourceLineNo">5040</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5040"></a>
+<span class="sourceLineNo">5041</span>    scan.setReversed(true);<a name="line.5041"></a>
+<span class="sourceLineNo">5042</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5042"></a>
+<span class="sourceLineNo">5043</span>    boolean hasNext = scanner.next(currRow);<a name="line.5043"></a>
+<span class="sourceLineNo">5044</span>    assertEquals(1, currRow.size());<a name="line.5044"></a>
+<span class="sourceLineNo">5045</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5045"></a>
+<span class="sourceLineNo">5046</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.5046"></a>
+<span class="sourceLineNo">5047</span>    assertTrue(hasNext);<a name="line.5047"></a>
+<span class="sourceLineNo">5048</span>    currRow.clear();<a name="line.5048"></a>
+<span class="sourceLineNo">5049</span>    hasNext = scanner.next(currRow);<a name="line.5049"></a>
+<span class="sourceLineNo">5050</span>    assertEquals(1, currRow.size());<a name="line.5050"></a>
+<span class="sourceLineNo">5051</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5051"></a>
+<span class="sourceLineNo">5052</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.5052"></a>
+<span class="sourceLineNo">5053</span>    assertTrue(hasNext);<a name="line.5053"></a>
+<span class="sourceLineNo">5054</span>    currRow.clear();<a name="line.5054"></a>
+<span class="sourceLineNo">5055</span>    hasNext = scanner.next(currRow);<a name="line.5055"></a>
+<span class="sourceLineNo">5056</span>    assertEquals(1, currRow.size());<a name="line.5056"></a>
+<span class="sourceLineNo">5057</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5057"></a>
+<span class="sourceLineNo">5058</span>        .get(0).getRowLength(), rowA, 0, rowA.length));<a name="line.5058"></a>
+<span class="sourceLineNo">5059</span>    assertFalse(hasNext);<a name="line.5059"></a>
+<span class="sourceLineNo">5060</span>    scanner.close();<a name="line.5060"></a>
+<span class="sourceLineNo">5061</span>  }<a name="line.5061"></a>
+<span class="sourceLineNo">5062</span><a name="line.5062"></a>
+<span class="sourceLineNo">5063</span>  @Test<a name="line.5063"></a>
+<span class="sourceLineNo">5064</span>  public void testReverseScanner_moreRowsMayExistAfter() throws IOException {<a name="line.5064"></a>
+<span class="sourceLineNo">5065</span>    // case for "INCLUDE_AND_SEEK_NEXT_ROW &amp; SEEK_NEXT_ROW" endless loop<a name="line.5065"></a>
+<span class="sourceLineNo">5066</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.5066"></a>
+<span class="sourceLineNo">5067</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.5067"></a>
+<span class="sourceLineNo">5068</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.5068"></a>
+<span class="sourceLineNo">5069</span>    byte[] rowD = Bytes.toBytes("rowD");<a name="line.5069"></a>
+<span class="sourceLineNo">5070</span>    byte[] rowE = Bytes.toBytes("rowE");<a name="line.5070"></a>
+<span class="sourceLineNo">5071</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.5071"></a>
+<span class="sourceLineNo">5072</span>    byte[][] families = { cf };<a name="line.5072"></a>
+<span class="sourceLineNo">5073</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.5073"></a>
+<span class="sourceLineNo">5074</span>    byte[] col2 = Bytes.toBytes("col2");<a name="line.5074"></a>
+<span class="sourceLineNo">5075</span>    long ts = 1;<a name="line.5075"></a>
+<span class="sourceLineNo">5076</span>    this.region = initHRegion(tableName, method, families);<a name="line.5076"></a>
+<span class="sourceLineNo">5077</span>    KeyValue kv1 = new KeyValue(rowA, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5077"></a>
+<span class="sourceLineNo">5078</span>    KeyValue kv2 = new KeyValue(rowB, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5078"></a>
+<span class="sourceLineNo">5079</span>    KeyValue kv3 = new KeyValue(rowC, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5079"></a>
+<span class="sourceLineNo">5080</span>    KeyValue kv4_1 = new KeyValue(rowD, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5080"></a>
+<span class="sourceLineNo">5081</span>    KeyValue kv4_2 = new KeyValue(rowD, cf, col2, ts, KeyValue.Type.Put, null);<a name="line.5081"></a>
+<span class="sourceLineNo">5082</span>    KeyValue kv5 = new KeyValue(rowE, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5082"></a>
+<span class="sourceLineNo">5083</span>    Put put = null;<a name="line.5083"></a>
+<span class="sourceLineNo">5084</span>    put = new Put(rowA);<a name="line.5084"></a>
+<span class="sourceLineNo">5085</span>    put.add(kv1);<a name="line.5085"></a>
+<span class="sourceLineNo">5086</span>    region.put(put);<a name="line.5086"></a>
+<span class="sourceLineNo">5087</span>    put = new Put(rowB);<a name="line.5087"></a>
+<span class="sourceLineNo">5088</span>    put.add(kv2);<a name="line.5088"></a>
+<span class="sourceLineNo">5089</span>    region.put(put);<a name="line.5089"></a>
+<span class="sourceLineNo">5090</span>    put = new Put(rowC);<a name="line.5090"></a>
+<span class="sourceLineNo">5091</span>    put.add(kv3);<a name="line.5091"></a>
+<span class="sourceLineNo">5092</span>    region.put(put);<a name="line.5092"></a>
+<span class="sourceLineNo">5093</span>    put = new Put(rowD);<a name="line.5093"></a>
+<span class="sourceLineNo">5094</span>    put.add(kv4_1);<a name="line.5094"></a>
+<span class="sourceLineNo">5095</span>    region.put(put);<a name="line.5095"></a>
+<span class="sourceLineNo">5096</span>    put = new Put(rowD);<a name="line.5096"></a>
+<span class="sourceLineNo">5097</span>    put.add(kv4_2);<a name="line.5097"></a>
+<span class="sourceLineNo">5098</span>    region.put(put);<a name="line.5098"></a>
+<span class="sourceLineNo">5099</span>    put = new Put(rowE);<a name="line.5099"></a>
+<span class="sourceLineNo">5100</span>    put.add(kv5);<a name="line.5100"></a>
+<span class="sourceLineNo">5101</span>    region.put(put);<a name="line.5101"></a>
+<span class="sourceLineNo">5102</span>    region.flush(true);<a name="line.5102"></a>
+<span class="sourceLineNo">5103</span>    Scan scan = new Scan(rowD, rowA);<a name="line.5103"></a>
+<span class="sourceLineNo">5104</span>    scan.addColumn(families[0], col1);<a name="line.5104"></a>
+<span class="sourceLineNo">5105</span>    scan.setReversed(true);<a name="line.5105"></a>
+<span class="sourceLineNo">5106</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5106"></a>
+<span class="sourceLineNo">5107</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5107"></a>
+<span class="sourceLineNo">5108</span>    boolean hasNext = scanner.next(currRow);<a name="line.5108"></a>
+<span class="sourceLineNo">5109</span>    assertEquals(1, currRow.size());<a name="line.5109"></a>
+<span class="sourceLineNo">5110</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5110"></a>
+<span class="sourceLineNo">5111</span>        .get(0).getRowLength(), rowD, 0, rowD.length));<a name="line.5111"></a>
+<span class="sourceLineNo">5112</span>    assertTrue(hasNext);<a name="line.5112"></a>
+<span class="sourceLineNo">5113</span>    currRow.clear();<a name="line.5113"></a>
+<span class="sourceLineNo">5114</span>    hasNext = scanner.next(currRow);<a name="line.5114"></a>
+<span class="sourceLineNo">5115</span>    assertEquals(1, currRow.size());<a name="line.5115"></a>
+<span class="sourceLineNo">5116</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5116"></a>
+<span class="sourceLineNo">5117</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.5117"></a>
+<span class="sourceLineNo">5118</span>    assertTrue(hasNext);<a name="line.5118"></a>
+<span class="sourceLineNo">5119</span>    currRow.clear();<a name="line.5119"></a>
+<span class="sourceLineNo">5120</span>    hasNext = scanner.next(currRow);<a name="line.5120"></a>
+<span class="sourceLineNo">5121</span>    assertEquals(1, currRow.size());<a name="line.5121"></a>
+<span class="sourceLineNo">5122</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5122"></a>
+<span class="sourceLineNo">5123</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.5123"></a>
+<span class="sourceLineNo">5124</span>    assertFalse(hasNext);<a name="line.5124"></a>
+<span class="sourceLineNo">5125</span>    scanner.close();<a name="line.5125"></a>
+<span class="sourceLineNo">5126</span><a name="line.5126"></a>
+<span class="sourceLineNo">5127</span>    scan = new Scan(rowD, rowA);<a name="line.5127"></a>
+<span class="sourceLineNo">5128</span>    scan.addColumn(families[0], col2);<a name="line.5128"></a>
+<span class="sourceLineNo">5129</span>    scan.setReversed(true);<a name="line.5129"></a>
+<span class="sourceLineNo">5130</span>    currRow.clear();<a name="line.5130"></a>
+<span class="sourceLineNo">5131</span>    scanner = region.getScanner(scan);<a name="line.5131"></a>
+<span class="sourceLineNo">5132</span>    hasNext = scanner.next(currRow);<a name="line.5132"></a>
+<span class="sourceLineNo">5133</span>    assertEquals(1, currRow.size());<a name="line.5133"></a>
+<span class="sourceLineNo">5134</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5134"></a>
+<span class="sourceLineNo">5135</span>        .get(0).getRowLength(), rowD, 0, rowD.length));<a name="line.5135"></a>
+<span class="sourceLineNo">5136</span>    scanner.close();<a name="line.5136"></a>
+<span class="sourceLineNo">5137</span>  }<a name="line.5137"></a>
+<span class="sourceLineNo">5138</span><a name="line.5138"></a>
+<span class="sourceLineNo">5139</span>  @Test<a name="line.5139"></a>
+<span class="sourceLineNo">5140</span>  public void testReverseScanner_smaller_blocksize() throws IOException {<a name="line.5140"></a>
+<span class="sourceLineNo">5141</span>    // case to ensure no conflict with HFile index optimization<a name="line.5141"></a>
+<span class="sourceLineNo">5142</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.5142"></a>
+<span class="sourceLineNo">5143</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.5143"></a>
+<span class="sourceLineNo">5144</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.5144"></a>
+<span class="sourceLineNo">5145</span>    byte[] rowD = Bytes.toBytes("rowD");<a name="line.5145"></a>
+<span class="sourceLineNo">5146</span>    byte[] rowE = Bytes.toBytes("rowE");<a name="line.5146"></a>
+<span class="sourceLineNo">5147</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.5147"></a>
+<span class="sourceLineNo">5148</span>    byte[][] families = { cf };<a name="line.5148"></a>
+<span class="sourceLineNo">5149</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.5149"></a>
+<span class="sourceLineNo">5150</span>    byte[] col2 = Bytes.toBytes("col2");<a name="line.5150"></a>
+<span class="sourceLineNo">5151</span>    long ts = 1;<a name="line.5151"></a>
+<span class="sourceLineNo">5152</span>    HBaseConfiguration config = new HBaseConfiguration();<a name="line.5152"></a>
+<span class="sourceLineNo">5153</span>    config.setInt("test.block.size", 1);<a name="line.5153"></a>
+<span class="sourceLineNo">5154</span>    this.region = initHRegion(tableName, method, config, families);<a name="line.5154"></a>
+<span class="sourceLineNo">5155</span>    KeyValue kv1 = new KeyValue(rowA, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5155"></a>
+<span class="sourceLineNo">5156</span>    KeyValue kv2 = new KeyValue(rowB, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5156"></a>
+<span class="sourceLineNo">5157</span>    KeyValue kv3 = new KeyValue(rowC, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5157"></a>
+<span class="sourceLineNo">5158</span>    KeyValue kv4_1 = new KeyValue(rowD, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5158"></a>
+<span class="sourceLineNo">5159</span>    KeyValue kv4_2 = new KeyValue(rowD, cf, col2, ts, KeyValue.Type.Put, null);<a name="line.5159"></a>
+<span class="sourceLineNo">5160</span>    KeyValue kv5 = new KeyValue(rowE, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5160"></a>
+<span class="sourceLineNo">5161</span>    Put put = null;<a name="line.5161"></a>
+<span class="sourceLineNo">5162</span>    put = new Put(rowA);<a name="line.5162"></a>
+<span class="sourceLineNo">5163</span>    put.add(kv1);<a name="line.5163"></a>
+<span class="sourceLineNo">5164</span>    region.put(put);<a name="line.5164"></a>
+<span class="sourceLineNo">5165</span>    put = new Put(rowB);<a name="line.5165"></a>
+<span class="sourceLineNo">5166</span>    put.add(kv2);<a name="line.5166"></a>
+<span class="sourceLineNo">5167</span>    region.put(put);<a name="line.5167"></a>
+<span class="sourceLineNo">5168</span>    put = new Put(rowC);<a name="line.5168"></a>
+<span class="sourceLineNo">5169</span>    put.add(kv3);<a name="line.5169"></a>
+<span class="sourceLineNo">5170</span>    region.put(put);<a name="line.5170"></a>
+<span class="sourceLineNo">5171</span>    put = new Put(rowD);<a name="line.5171"></a>
+<span class="sourceLineNo">5172</span>    put.add(kv4_1);<a name="line.5172"></a>
+<span class="sourceLineNo">5173</span>    region.put(put);<a name="line.5173"></a>
+<span class="sourceLineNo">5174</span>    put = new Put(rowD);<a name="line.5174"></a>
+<span class="sourceLineNo">5175</span>    put.add(kv4_2);<a name="line.5175"></a>
+<span class="sourceLineNo">5176</span>    region.put(put);<a name="line.5176"></a>
+<span class="sourceLineNo">5177</span>    put = new Put(rowE);<a name="line.5177"></a>
+<span class="sourceLineNo">5178</span>    put.add(kv5);<a name="line.5178"></a>
+<span class="sourceLineNo">5179</span>    region.put(put);<a name="line.5179"></a>
+<span class="sourceLineNo">5180</span>    region.flush(true);<a name="line.5180"></a>
+<span class="sourceLineNo">5181</span>    Scan scan = new Scan(rowD, rowA);<a name="line.5181"></a>
+<span class="sourceLineNo">5182</span>    scan.addColumn(families[0], col1);<a name="line.5182"></a>
+<span class="sourceLineNo">5183</span>    scan.setReversed(true);<a name="line.5183"></a>
+<span class="sourceLineNo">5184</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5184"></a>
+<span class="sourceLineNo">5185</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5185"></a>
+<span class="sourceLineNo">5186</span>    boolean hasNext = scanner.next(currRow);<a name="line.5186"></a>
+<span class="sourceLineNo">5187</span>    assertEquals(1, currRow.size());<a name="line.5187"></a>
+<span class="sourceLineNo">5188</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5188"></a>
+<span class="sourceLineNo">5189</span>        .get(0).getRowLength(), rowD, 0, rowD.length));<a name="line.5189"></a>
+<span class="sourceLineNo">5190</span>    assertTrue(hasNext);<a name="line.5190"></a>
+<span class="sourceLineNo">5191</span>    currRow.clear();<a name="line.5191"></a>
+<span class="sourceLineNo">5192</span>    hasNext = scanner.next(currRow);<a name="line.5192"></a>
+<span class="sourceLineNo">5193</span>    assertEquals(1, currRow.size());<a name="line.5193"></a>
+<span class="sourceLineNo">5194</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5194"></a>
+<span class="sourceLineNo">5195</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.5195"></a>
+<span class="sourceLineNo">5196</span>    assertTrue(hasNext);<a name="line.5196"></a>
+<span class="sourceLineNo">5197</span>    currRow.clear();<a name="line.5197"></a>
+<span class="sourceLineNo">5198</span>    hasNext = scanner.next(currRow);<a name="line.5198"></a>
+<span class="sourceLineNo">5199</span>    assertEquals(1, currRow.size());<a name="line.5199"></a>
+<span class="sourceLineNo">5200</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5200"></a>
+<span class="sourceLineNo">5201</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.5201"></a>
+<span class="sourceLineNo">5202</span>    assertFalse(hasNext);<a name="line.5202"></a>
+<span class="sourceLineNo">5203</span>    scanner.close();<a name="line.5203"></a>
+<span class="sourceLineNo">5204</span><a name="line.5204"></a>
+<span class="sourceLineNo">5205</span>    scan = new Scan(rowD, rowA);<a name="line.5205"></a>
+<span class="sourceLineNo">5206</span>    scan.addColumn(families[0], col2);<a name="line.5206"></a>
+<span class="sourceLineNo">5207</span>    scan.setReversed(true);<a name="line.5207"></a>
+<span class="sourceLineNo">5208</span>    currRow.clear();<a name="line.5208"></a>
+<span class="sourceLineNo">5209</span>    scanner = region.getScanner(scan);<a name="line.5209"></a>
+<span class="sourceLineNo">5210</span>    hasNext = scanner.next(currRow);<a name="line.5210"></a>
+<span class="sourceLineNo">5211</span>    assertEquals(1, currRow.size());<a name="line.5211"></a>
+<span class="sourceLineNo">5212</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5212"></a>
+<span class="sourceLineNo">5213</span>        .get(0).getRowLength(), rowD, 0, rowD.length));<a name="line.5213"></a>
+<span class="sourceLineNo">5214</span>    scanner.close();<a name="line.5214"></a>
+<span class="sourceLineNo">5215</span>  }<a name="line.5215"></a>
+<span class="sourceLineNo">5216</span><a name="line.5216"></a>
+<span class="sourceLineNo">5217</span>  @Test<a name="line.5217"></a>
+<span class="sourceLineNo">5218</span>  public void testReverseScanner_FromMemStoreAndHFiles_MultiCFs1()<a name="line.5218"></a>
+<span class="sourceLineNo">5219</span>      throws IOException {<a name="line.5219"></a>
+<span class="sourceLineNo">5220</span>    byte[] row0 = Bytes.toBytes("row0"); // 1 kv<a name="line.5220"></a>
+<span class="sourceLineNo">5221</span>    byte[] row1 = Bytes.toBytes("row1"); // 2 kv<a name="line.5221"></a>
+<span class="sourceLineNo">5222</span>    byte[] row2 = Bytes.toBytes("row2"); // 4 kv<a name="line.5222"></a>
+<span class="sourceLineNo">5223</span>    byte[] row3 = Bytes.toBytes("row3"); // 2 kv<a name="line.5223"></a>
+<span class="sourceLineNo">5224</span>    byte[] row4 = Bytes.toBytes("row4"); // 5 kv<a name="line.5224"></a>
+<span class="sourceLineNo">5225</span>    byte[] row5 = Bytes.toBytes("row5"); // 2 kv<a name="line.5225"></a>
+<span class="sourceLineNo">5226</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5226"></a>
+<span class="sourceLineNo">5227</span>    byte[] cf2 = Bytes.toBytes("CF2");<a name="line.5227"></a>
+<span class="sourceLineNo">5228</span>    byte[] cf3 = Bytes.toBytes("CF3");<a name="line.5228"></a>
+<span class="sourceLineNo">5229</span>    byte[][] families = { cf1, cf2, cf3 };<a name="line.5229"></a>
+<span class="sourceLineNo">5230</span>    byte[] col = Bytes.toBytes("C");<a name="line.5230"></a>
+<span class="sourceLineNo">5231</span>    long ts = 1;<a name="line.5231"></a>
+<span class="sourceLineNo">5232</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5232"></a>
+<span class="sourceLineNo">5233</span>    // disable compactions in this test.<a name="line.5233"></a>
+<span class="sourceLineNo">5234</span>    conf.setInt("hbase.hstore.compactionThreshold", 10000);<a name="line.5234"></a>
+<span class="sourceLineNo">5235</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5235"></a>
+<span class="sourceLineNo">5236</span>    // kv naming style: kv(row number) totalKvCountInThisRow seq no<a name="line.5236"></a>
+<span class="sourceLineNo">5237</span>    KeyValue kv0_1_1 = new KeyValue(row0, cf1, col, ts, KeyValue.Type.Put,<a name="line.5237"></a>
 <span class="sourceLineNo">5238</span>        null);<a name="line.5238"></a>
-<span class="sourceLineNo">5239</span>    KeyValue kv2_4_4 = new KeyValue(row2, cf1, col, ts + 4,<a name="line.5239"></a>
-<span class="sourceLineNo">5240</span>        KeyValue.Type.Put, null);<a name="line.5240"></a>
-<span class="sourceLineNo">5241</span>    KeyValue kv3_2_1 = new KeyValue(row3, cf2, col, ts, KeyValue.Type.Put,<a name="line.5241"></a>
-<span class="sourceLineNo">5242</span>        null);<a name="line.5242"></a>
-<span class="sourceLineNo">5243</span>    KeyValue kv3_2_2 = new KeyValue(row3, cf1, col, ts + 4,<a name="line.5243"></a>
-<span class="sourceLineNo">5244</span>        KeyValue.Type.Put, null);<a name="line.5244"></a>
-<span class="sourceLineNo">5245</span>    KeyValue kv4_5_1 = new KeyValue(row4, cf1, col, ts, KeyValue.Type.Put,<a name="line.5245"></a>
+<span class="sourceLineNo">5239</span>    KeyValue kv1_2_1 = new KeyValue(row1, cf2, col, ts, KeyValue.Type.Put,<a name="line.5239"></a>
+<span class="sourceLineNo">5240</span>        null);<a name="line.5240"></a>
+<span class="sourceLineNo">5241</span>    KeyValue kv1_2_2 = new KeyValue(row1, cf1, col, ts + 1,<a name="line.5241"></a>
+<span class="sourceLineNo">5242</span>        KeyValue.Type.Put, null);<a name="line.5242"></a>
+<span class="sourceLineNo">5243</span>    KeyValue kv2_4_1 = new KeyValue(row2, cf2, col, ts, KeyValue.Type.Put,<a name="line.5243"></a>
+<span class="sourceLineNo">5244</span>        null);<a name="line.5244"></a>
+<span class="sourceLineNo">5245</span>    KeyValue kv2_4_2 = new KeyValue(row2, cf1, col, ts, KeyValue.Type.Put,<a name="line.5245"></a>
 <span class="sourceLineNo">5246</span>        null);<a name="line.5246"></a>
-<span class="sourceLineNo">5247</span>    KeyValue kv4_5_2 = new KeyValue(row4, cf3, col, ts, KeyValue.Type.Put,<a name="line.5247"></a>
+<span class="sourceLineNo">5247</span>    KeyValue kv2_4_3 = new KeyValue(row2, cf3, col, ts, KeyValue.Type.Put,<a name="line.5247"></a>
 <span class="sourceLineNo">5248</span>        null);<a name="line.5248"></a>
-<span class="sourceLineNo">5249</span>    KeyValue kv4_5_3 = new KeyValue(row4, cf3, col, ts + 5,<a name="line.5249"></a>
+<span class="sourceLineNo">5249</span>    KeyValue kv2_4_4 = new KeyValue(row2, cf1, col, ts + 4,<a name="line.5249"></a>
 <span class="sourceLineNo">5250</span>        KeyValue.Type.Put, null);<a name="line.5250"></a>
-<span class="sourceLineNo">5251</span>    KeyValue kv4_5_4 = new KeyValue(row4, cf2, col, ts, KeyValue.Type.Put,<a name="line.5251"></a>
+<span class="sourceLineNo">5251</span>    KeyValue kv3_2_1 = new KeyValue(row3, cf2, col, ts, KeyValue.Type.Put,<a name="line.5251"></a>
 <span class="sourceLineNo">5252</span>        null);<a name="line.5252"></a>
-<span class="sourceLineNo">5253</span>    KeyValue kv4_5_5 = new KeyValue(row4, cf1, col, ts + 3,<a name="line.5253"></a>
+<span class="sourceLineNo">5253</span>    KeyValue kv3_2_2 = new KeyValue(row3, cf1, col, ts + 4,<a name="line.5253"></a>
 <span class="sourceLineNo">5254</span>        KeyValue.Type.Put, null);<a name="line.5254"></a>
-<span class="sourceLineNo">5255</span>    KeyValue kv5_2_1 = new KeyValue(row5, cf2, col, ts, KeyValue.Type.Put,<a name="line.5255"></a>
+<span class="sourceLineNo">5255</span>    KeyValue kv4_5_1 = new KeyValue(row4, cf1, col, ts, KeyValue.Type.Put,<a name="line.5255"></a>
 <span class="sourceLineNo">5256</span>        null);<a name="line.5256"></a>
-<span class="sourceLineNo">5257</span>    KeyValue kv5_2_2 = new KeyValue(row5, cf3, col, ts, KeyValue.Type.Put,<a name="line.5257"></a>
+<span class="sourceLineNo">5257</span>    KeyValue kv4_5_2 = new KeyValue(row4, cf3, col, ts, KeyValue.Type.Put,<a name="line.5257"></a>
 <span class="sourceLineNo">5258</span>        null);<a name="line.5258"></a>
-<span class="sourceLineNo">5259</span>    // hfiles(cf1/cf2) :"row1"(1 kv) / "row2"(1 kv) / "row4"(2 kv)<a name="line.5259"></a>
-<span class="sourceLineNo">5260</span>    Put put = null;<a name="line.5260"></a>
-<span class="sourceLineNo">5261</span>    put = new Put(row1);<a name="line.5261"></a>
-<span class="sourceLineNo">5262</span>    put.add(kv1_2_1);<a name="line.5262"></a>
-<span class="sourceLineNo">5263</span>    region.put(put);<a name="line.5263"></a>
-<span class="sourceLineNo">5264</span>    put = new Put(row2);<a name="line.5264"></a>
-<span class="sourceLineNo">5265</span>    put.add(kv2_4_1);<a name="line.5265"></a>
-<span class="sourceLineNo">5266</span>    region.put(put);<a name="line.5266"></a>
-<span class="sourceLineNo">5267</span>    put = new Put(row4);<a name="line.5267"></a>
-<span class="sourceLineNo">5268</span>    put.add(kv4_5_4);<a name="line.5268"></a>
-<span class="sourceLineNo">5269</span>    put.add(kv4_5_5);<a name="line.5269"></a>
-<span class="sourceLineNo">5270</span>    region.put(put);<a name="line.5270"></a>
-<span class="sourceLineNo">5271</span>    region.flush(true);<a name="line.5271"></a>
-<span class="sourceLineNo">5272</span>    // hfiles(cf1/cf3) : "row1" (1 kvs) / "row2" (1 kv) / "row4" (2 kv)<a name="line.5272"></a>
-<span class="sourceLineNo">5273</span>    put = new Put(row4);<a name="line.5273"></a>
-<span class="sourceLineNo">5274</span>    put.add(kv4_5_1);<a name="line.5274"></a>
-<span class="sourceLineNo">5275</span>    put.add(kv4_5_3);<a name="line.5275"></a>
+<span class="sourceLineNo">5259</span>    KeyValue kv4_5_3 = new KeyValue(row4, cf3, col, ts + 5,<a name="line.5259"></a>
+<span class="sourceLineNo">5260</span>        KeyValue.Type.Put, null);<a name="line.5260"></a>
+<span class="sourceLineNo">5261</span>    KeyValue kv4_5_4 = new KeyValue(row4, cf2, col, ts, KeyValue.Type.Put,<a name="line.5261"></a>
+<span class="sourceLineNo">5262</span>        null);<a name="line.5262"></a>
+<span class="sourceLineNo">5263</span>    KeyValue kv4_5_5 = new KeyValue(row4, cf1, col, ts + 3,<a name="line.5263"></a>
+<span class="sourceLineNo">5264</span>        KeyValue.Type.Put, null);<a name="line.5264"></a>
+<span class="sourceLineNo">5265</span>    KeyValue kv5_2_1 = new KeyValue(row5, cf2, col, ts, KeyValue.Type.Put,<a name="line.5265"></a>
+<span class="sourceLineNo">5266</span>        null);<a name="line.5266"></a>
+<span class="sourceLineNo">5267</span>    KeyValue kv5_2_2 = new KeyValue(row5, cf3, col, ts, KeyValue.Type.Put,<a name="line.5267"></a>
+<span class="sourceLineNo">5268</span>        null);<a name="line.5268"></a>
+<span class="sourceLineNo">5269</span>    // hfiles(cf1/cf2) :"row1"(1 kv) / "row2"(1 kv) / "row4"(2 kv)<a name="line.5269"></a>
+<span class="sourceLineNo">5270</span>    Put put = null;<a name="line.5270"></a>
+<span class="sourceLineNo">5271</span>    put = new Put(row1);<a name="line.5271"></a>
+<span class="sourceLineNo">5272</span>    put.add(kv1_2_1);<a name="line.5272"></a>
+<span class="sourceLineNo">5273</span>    region.put(put);<a name="line.5273"></a>
+<span class="sourceLineNo">5274</span>    put = new Put(row2);<a name="line.5274"></a>
+<span class="sourceLineNo">5275</span>    put.add(kv2_4_1);<a name="line.5275"></a>
 <span class="sourceLineNo">5276</span>    region.put(put);<a name="line.5276"></a>
-<span class="sourceLineNo">5277</span>    put = new Put(row1);<a name="line.5277"></a>
-<span class="sourceLineNo">5278</span>    put.add(kv1_2_2);<a name="line.5278"></a>
-<span class="sourceLineNo">5279</span>    region.put(put);<a name="line.5279"></a>
-<span class="sourceLineNo">5280</span>    put = new Put(row2);<a name="line.5280"></a>
-<span class="sourceLineNo">5281</span>    put.add(kv2_4_4);<a name="line.5281"></a>
-<span class="sourceLineNo">5282</span>    region.put(put);<a name="line.5282"></a>
-<span class="sourceLineNo">5283</span>    region.flush(true);<a name="line.5283"></a>
-<span class="sourceLineNo">5284</span>    // hfiles(cf1/cf3) : "row2"(2 kv) / "row3"(1 kvs) / "row4" (1 kv)<a name="line.5284"></a>
-<span class="sourceLineNo">5285</span>    put = new Put(row4);<a name="line.5285"></a>
-<span class="sourceLineNo">5286</span>    put.add(kv4_5_2);<a name="line.5286"></a>
-<span class="sourceLineNo">5287</span>    region.put(put);<a name="line.5287"></a>
-<span class="sourceLineNo">5288</span>    put = new Put(row2);<a name="line.5288"></a>
-<span class="sourceLineNo">5289</span>    put.add(kv2_4_2);<a name="line.5289"></a>
-<span class="sourceLineNo">5290</span>    put.add(kv2_4_3);<a name="line.5290"></a>
-<span class="sourceLineNo">5291</span>    region.put(put);<a name="line.5291"></a>
-<span class="sourceLineNo">5292</span>    put = new Put(row3);<a name="line.5292"></a>
-<span class="sourceLineNo">5293</span>    put.add(kv3_2_2);<a name="line.5293"></a>
-<span class="sourceLineNo">5294</span>    region.put(put);<a name="line.5294"></a>
-<span class="sourceLineNo">5295</span>    region.flush(true);<a name="line.5295"></a>
-<span class="sourceLineNo">5296</span>    // memstore(cf1/cf2/cf3) : "row0" (1 kvs) / "row3" ( 1 kv) / "row5" (max)<a name="line.5296"></a>
-<span class="sourceLineNo">5297</span>    // ( 2 kv)<a name="line.5297"></a>
-<span class="sourceLineNo">5298</span>    put = new Put(row0);<a name="line.5298"></a>
-<span class="sourceLineNo">5299</span>    put.add(kv0_1_1);<a name="line.5299"></a>
-<span class="sourceLineNo">5300</span>    region.put(put);<a name="line.5300"></a>
-<span class="sourceLineNo">5301</span>    put = new Put(row3);<a name="line.5301"></a>
-<span class="sourceLineNo">5302</span>    put.add(kv3_2_1);<a name="line.5302"></a>
-<span class="sourceLineNo">5303</span>    region.put(put);<a name="line.5303"></a>
-<span class="sourceLineNo">5304</span>    put = new Put(row5);<a name="line.5304"></a>
-<span class="sourceLineNo">5305</span>    put.add(kv5_2_1);<a name="line.5305"></a>
-<span class="sourceLineNo">5306</span>    put.add(kv5_2_2);<a name="line.5306"></a>
-<span class="sourceLineNo">5307</span>    region.put(put);<a name="line.5307"></a>
-<span class="sourceLineNo">5308</span>    // scan range = ["row4", min), skip the max "row5"<a name="line.5308"></a>
-<span class="sourceLineNo">5309</span>    Scan scan = new Scan(row4);<a name="line.5309"></a>
-<span class="sourceLineNo">5310</span>    scan.setMaxVersions(5);<a name="line.5310"></a>
-<span class="sourceLineNo">5311</span>    scan.setBatch(3);<a name="line.5311"></a>
-<span class="sourceLineNo">5312</span>    scan.setReversed(true);<a name="line.5312"></a>
-<span class="sourceLineNo">5313</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5313"></a>
-<span class="sourceLineNo">5314</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5314"></a>
-<span class="sourceLineNo">5315</span>    boolean hasNext = false;<a name="line.5315"></a>
-<span class="sourceLineNo">5316</span>    // 1. scan out "row4" (5 kvs), "row5" can't be scanned out since not<a name="line.5316"></a>
-<span class="sourceLineNo">5317</span>    // included in scan range<a name="line.5317"></a>
-<span class="sourceLineNo">5318</span>    // "row4" takes 2 next() calls since batch=3<a name="line.5318"></a>
-<span class="sourceLineNo">5319</span>    hasNext = scanner.next(currRow);<a name="line.5319"></a>
-<span class="sourceLineNo">5320</span>    assertEquals(3, currRow.size());<a name="line.5320"></a>
-<span class="sourceLineNo">5321</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5321"></a>
-<span class="sourceLineNo">5322</span>        .get(0).getRowLength(), row4, 0, row4.length));<a name="line.5322"></a>
-<span class="sourceLineNo">5323</span>    assertTrue(hasNext);<a name="line.5323"></a>
-<span class="sourceLineNo">5324</span>    currRow.clear();<a name="line.5324"></a>
-<span class="sourceLineNo">5325</span>    hasNext = scanner.next(currRow);<a name="line.5325"></a>
-<span class="sourceLineNo">5326</span>    assertEquals(2, currRow.size());<a name="line.5326"></a>
-<span class="sourceLineNo">5327</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(),<a name="line.5327"></a>
-<span class="sourceLineNo">5328</span>        currRow.get(0).getRowLength(), row4, 0,<a name="line.5328"></a>
-<span class="sourceLineNo">5329</span>      row4.length));<a name="line.5329"></a>
-<span class="sourceLineNo">5330</span>    assertTrue(hasNext);<a name="line.5330"></a>
-<span class="sourceLineNo">5331</span>    // 2. scan out "row3" (2 kv)<a name="line.5331"></a>
-<span class="sourceLineNo">5332</span>    currRow.clear();<a name="line.5332"></a>
-<span class="sourceLineNo">5333</span>    hasNext = scanner.next(currRow);<a name="line.5333"></a>
-<span class="sourceLineNo">5334</span>    assertEquals(2, currRow.size());<a name="line.5334"></a>
-<span class="sourceLineNo">5335</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5335"></a>
-<span class="sourceLineNo">5336</span>        .get(0).getRowLength(), row3, 0, row3.length));<a name="line.5336"></a>
-<span class="sourceLineNo">5337</span>    assertTrue(hasNext);<a name="line.5337"></a>
-<span class="sourceLineNo">5338</span>    // 3. scan out "row2" (4 kvs)<a name="line.5338"></a>
-<span class="sourceLineNo">5339</span>    // "row2" takes 2 next() calls since batch=3<a name="line.5339"></a>
-<span class="sourceLineNo">5340</span>    currRow.clear();<a name="line.5340"></a>
-<span class="sourceLineNo">5341</span>    hasNext = scanner.next(currRow);<a name="line.5341"></a>
-<span class="sourceLineNo">5342</span>    assertEquals(3, currRow.size());<a name="line.5342"></a>
-<span class="sourceLineNo">5343</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5343"></a>
-<span class="sourceLineNo">5344</span>        .get(0).getRowLength(), row2, 0, row2.length));<a name="line.5344"></a>
-<span class="sourceLineNo">5345</span>    assertTrue(hasNext);<a name="line.5345"></a>
-<span class="sourceLineNo">5346</span>    currRow.clear();<a name="line.5346"></a>
-<span class="sourceLineNo">5347</span>    hasNext = scanner.next(currRow);<a name="line.5347"></a>
-<span class="sourceLineNo">5348</span>    assertEquals(1, currRow.size());<a name="line.5348"></a>
-<span class="sourceLineNo">5349</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5349"></a>
-<span class="sourceLineNo">5350</span>        .get(0).getRowLength(), row2, 0, row2.length));<a name="line.5350"></a>
-<span class="sourceLineNo">5351</span>    assertTrue(hasNext);<a name="line.5351"></a>
-<span class="sourceLineNo">5352</span>    // 4. scan out "row1" (2 kv)<a name="line.5352"></a>
-<span class="sourceLineNo">5353</span>    currRow.clear();<a name="line.5353"></a>
-<span class="sourceLineNo">5354</span>    hasNext = scanner.next(currRow);<a name="line.5354"></a>
-<span class="sourceLineNo">5355</span>    assertEquals(2, currRow.size());<a name="line.5355"></a>
-<span class="sourceLineNo">5356</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5356"></a>
-<span class="sourceLineNo">5357</span>        .get(0).getRowLength(), row1, 0, row1.length));<a name="line.5357"></a>
-<span class="sourceLineNo">5358</span>    assertTrue(hasNext);<a name="line.5358"></a>
-<span class="sourceLineNo">5359</span>    // 5. scan out "row0" (1 kv)<a name="line.5359"></a>
-<span class="sourceLineNo">5360</span>    currRow.clear();<a name="line.5360"></a>
-<span class="sourceLineNo">5361</span>    hasNext = scanner.next(currRow);<a name="line.5361"></a>
-<span class="sourceLineNo">5362</span>    assertEquals(1, currRow.size());<a name="line.5362"></a>
-<span class="sourceLineNo">5363</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5363"></a>
-<span class="sourceLineNo">5364</span>        .get(0).getRowLength(), row0, 0, row0.length));<a name="line.5364"></a>
-<span class="sourceLineNo">5365</span>    assertFalse(hasNext);<a name="line.5365"></a>
-<span class="sourceLineNo">5366</span><a name="line.5366"></a>
-<span class="sourceLineNo">5367</span>    scanner.close();<a name="line.5367"></a>
-<span class="sourceLineNo">5368</span>  }<a name="line.5368"></a>
-<span class="sourceLineNo">5369</span><a name="line.5369"></a>
-<span class="sourceLineNo">5370</span>  @Test<a name="line.5370"></a>
-<span class="sourceLineNo">5371</span>  public void testReverseScanner_FromMemStoreAndHFiles_MultiCFs2()<a name="line.5371"></a>
-<span class="sourceLineNo">5372</span>      throws IOException {<a name="line.5372"></a>
-<span class="sourceLineNo">5373</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.5373"></a>
-<span class="sourceLineNo">5374</span>    byte[] row2 = Bytes.toBytes("row2");<a name="line.5374"></a>
-<span class="sourceLineNo">5375</span>    byte[] row3 = Bytes.toBytes("row3");<a name="line.5375"></a>
-<span class="sourceLineNo">5376</span>    byte[] row4 = Bytes.toBytes("row4");<a name="line.5376"></a>
-<span class="sourceLineNo">5377</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5377"></a>
-<span class="sourceLineNo">5378</span>    byte[] cf2 = Bytes.toBytes("CF2");<a name="line.5378"></a>
-<span class="sourceLineNo">5379</span>    byte[] cf3 = Bytes.toBytes("CF3");<a name="line.5379"></a>
-<span class="sourceLineNo">5380</span>    byte[] cf4 = Bytes.toBytes("CF4");<a name="line.5380"></a>
-<span class="sourceLineNo">5381</span>    byte[][] families = { cf1, cf2, cf3, cf4 };<a name="line.5381"></a>
-<span class="sourceLineNo">5382</span>    byte[] col = Bytes.toBytes("C");<a name="line.5382"></a>
-<span class="sourceLineNo">5383</span>    long ts = 1;<a name="line.5383"></a>
-<span class="sourceLineNo">5384</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5384"></a>
-<span class="sourceLineNo">5385</span>    // disable compactions in this test.<a name="line.5385"></a>
-<span class="sourceLineNo">5386</span>    conf.setInt("hbase.hstore.compactionThreshold", 10000);<a name="line.5386"></a>
-<span class="sourceLineNo">5387</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5387"></a>
-<span class="sourceLineNo">5388</span>    KeyValue kv1 = new KeyValue(row1, cf1, col, ts, KeyValue.Type.Put, null);<a name="line.5388"></a>
-<span class="sourceLineNo">5389</span>    KeyValue kv2 = new KeyValue(row2, cf2, col, ts, KeyValue.Type.Put, null);<a name="line.5389"></a>
-<span class="sourceLineNo">5390</span>    KeyValue kv3 = new KeyValue(row3, cf3, col, ts, KeyValue.Type.Put, null);<a name="line.5390"></a>
-<span class="sourceLineNo">5391</span>    KeyValue kv4 = new KeyValue(row4, cf4, col, ts, KeyValue.Type.Put, null);<a name="line.5391"></a>
-<span class="sourceLineNo">5392</span>    // storefile1<a name="line.5392"></a>
-<span class="sourceLineNo">5393</span>    Put put = new Put(row1);<a name="line.5393"></a>
-<span class="sourceLineNo">5394</span>    put.add(kv1);<a name="line.5394"></a>
-<span class="sourceLineNo">5395</span>    region.put(put);<a name="line.5395"></a>
-<span class="sourceLineNo">5396</span>    region.flush(true);<a name="line.5396"></a>
-<span class="sourceLineNo">5397</span>    // storefile2<a name="line.5397"></a>
-<span class="sourceLineNo">5398</span>    put = new Put(row2);<a name="line.5398"></a>
-<span class="sourceLineNo">5399</span>    put.add(kv2);<a name="line.5399"></a>
-<span class="sourceLineNo">5400</span>    region.put(put);<a name="line.5400"></a>
-<span class="sourceLineNo">5401</span>    region.flush(true);<a name="line.5401"></a>
-<span class="sourceLineNo">5402</span>    // storefile3<a name="line.5402"></a>
-<span class="sourceLineNo">5403</span>    put = new Put(row3);<a name="line.5403"></a>
-<span class="sourceLineNo">5404</span>    put.add(kv3);<a name="line.5404"></a>
+<span class="sourceLineNo">5277</span>    put = new Put(row4);<a name="line.5277"></a>
+<span class="sourceLineNo">5278</span>    put.add(kv4_5_4);<a name="line.5278"></a>
+<span class="sourceLineNo">5279</span>    put.add(kv4_5_5);<a name="line.5279"></a>
+<span class="sourceLineNo">5280</span>    region.put(put);<a name="line.5280"></a>
+<span class="sourceLineNo">5281</span>    region.flush(true);<a name="line.5281"></a>
+<span class="sourceLineNo">5282</span>    // hfiles(cf1/cf3) : "row1" (1 kvs) / "row2" (1 kv) / "row4" (2 kv)<a name="line.5282"></a>
+<span class="sourceLineNo">5283</span>    put = new Put(row4);<a name="line.5283"></a>
+<span class="sourceLineNo">5284</span>    put.add(kv4_5_1);<a name="line.5284"></a>
+<span class="sourceLineNo">5285</span>    put.add(kv4_5_3);<a name="line.5285"></a>
+<span class="sourceLineNo">5286</span>    region.put(put);<a name="line.5286"></a>
+<span class="sourceLineNo">5287</span>    put = new Put(row1);<a name="line.5287"></a>
+<span class="sourceLineNo">5288</span>    put.add(kv1_2_2);<a name="line.5288"></a>
+<span class="sourceLineNo">5289</span>    region.put(put);<a name="line.5289"></a>
+<span class="sourceLineNo">5290</span>    put = new Put(row2);<a name="line.5290"></a>
+<span class="sourceLineNo">5291</span>    put.add(kv2_4_4);<a name="line.5291"></a>
+<span class="sourceLineNo">5292</span>    region.put(put);<a name="line.5292"></a>
+<span class="sourceLineNo">5293</span>    region.flush(true);<a name="line.5293"></a>
+<span class="sourceLineNo">5294</span>    // hfiles(cf1/cf3) : "row2"(2 kv) / "row3"(1 kvs) / "row4" (1 kv)<a name="line.5294"></a>
+<span class="sourceLineNo">5295</span>    put = new Put(row4);<a name="line.5295"></a>
+<span class="sourceLineNo">5296</span>    put.add(kv4_5_2);<a name="line.5296"></a>
+<span class="sourceLineNo">5297</span>    region.put(put);<a name="line.5297"></a>
+<span class="sourceLineNo">5298</span>    put = new Put(row2);<a name="line.5298"></a>
+<span class="sourceLineNo">5299</span>    put.add(kv2_4_2);<a name="line.5299"></a>
+<span class="sourceLineNo">5300</span>    put.add(kv2_4_3);<a name="line.5300"></a>
+<span class="sourceLineNo">5301</span>    region.put(put);<a name="line.5301"></a>
+<span class="sourceLineNo">5302</span>    put = new Put(row3);<a name="line.5302"></a>
+<span class="sourceLineNo">5303</span>    put.add(kv3_2_2);<a name="line.5303"></a>
+<span class="sourceLineNo">5304</span>    region.put(put);<a name="line.5304"></a>
+<span class="sourceLineNo">5305</span>    region.flush(true);<a name="line.5305"></a>
+<span class="sourceLineNo">5306</span>    // memstore(cf1/cf2/cf3) : "row0" (1 kvs) / "row3" ( 1 kv) / "row5" (max)<a name="line.5306"></a>
+<span class="sourceLineNo">5307</span>    // ( 2 kv)<a name="line.5307"></a>
+<span class="sourceLineNo">5308</span>    put = new Put(row0);<a name="line.5308"></a>
+<span class="sourceLineNo">5309</span>    put.add(kv0_1_1);<a name="line.5309"></a>
+<span class="sourceLineNo">5310</span>    region.put(put);<a name="line.5310"></a>
+<span class="sourceLineNo">5311</span>    put = new Put(row3);<a name="line.5311"></a>
+<span class="sourceLineNo">5312</span>    put.add(kv3_2_1);<a name="line.5312"></a>
+<span class="sourceLineNo">5313</span>    region.put(put);<a name="line.5313"></a>
+<span class="sourceLineNo">5314</span>    put = new Put(row5);<a name="line.5314"></a>
+<span class="sourceLineNo">5315</span>    put.add(kv5_2_1);<a name="line.5315"></a>
+<span class="sourceLineNo">5316</span>    put.add(kv5_2_2);<a name="line.5316"></a>
+<span class="sourceLineNo">5317</span>    region.put(put);<a name="line.5317"></a>
+<span class="sourceLineNo">5318</span>    // scan range = ["row4", min), skip the max "row5"<a name="line.5318"></a>
+<span class="sourceLineNo">5319</span>    Scan scan = new Scan(row4);<a name="line.5319"></a>
+<span class="sourceLineNo">5320</span>    scan.setMaxVersions(5);<a name="line.5320"></a>
+<span class="sourceLineNo">5321</span>    scan.setBatch(3);<a name="line.5321"></a>
+<span class="sourceLineNo">5322</span>    scan.setReversed(true);<a name="line.5322"></a>
+<span class="sourceLineNo">5323</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5323"></a>
+<span class="sourceLineNo">5324</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5324"></a>
+<span class="sourceLineNo">5325</span>    boolean hasNext = false;<a name="line.5325"></a>
+<span class="sourceLineNo">5326</span>    // 1. scan out "row4" (5 kvs), "row5" can't be scanned out since not<a name="line.5326"></a>
+<span class="sourceLineNo">5327</span>    // included in scan range<a name="line.5327"></a>
+<span class="sourceLineNo">5328</span>    // "row4" takes 2 next() calls since batch=3<a name="line.5328"></a>
+<span class="sourceLineNo">5329</span>    hasNext = scanner.next(currRow);<a name="line.5329"></a>
+<span class="sourceLineNo">5330</span>    assertEquals(3, currRow.size());<a name="line.5330"></a>
+<span class="sourceLineNo">5331</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5331"></a>
+<span class="sourceLineNo">5332</span>        .get(0).getRowLength(), row4, 0, row4.length));<a name="line.5332"></a>
+<span class="sourceLineNo">5333</span>    assertTrue(hasNext);<a name="line.5333"></a>
+<span class="sourceLineNo">5334</span>    currRow.clear();<a name="line.5334"></a>
+<span class="sourceLineNo">5335</span>    hasNext = scanner.next(currRow);<a name="line.5335"></a>
+<span class="sourceLineNo">5336</span>    assertEquals(2, currRow.size());<a name="line.5336"></a>
+<span class="sourceLineNo">5337</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(),<a name="line.5337"></a>
+<span class="sourceLineNo">5338</span>        currRow.get(0).getRowLength(), row4, 0,<a name="line.5338"></a>
+<span class="sourceLineNo">5339</span>      row4.length));<a name="line.5339"></a>
+<span class="sourceLineNo">5340</span>    assertTrue(hasNext);<a name="line.5340"></a>
+<span class="sourceLineNo">5341</span>    // 2. scan out "row3" (2 kv)<a name="line.5341"></a>
+<span class="sourceLineNo">5342</span>    currRow.clear();<a name="line.5342"></a>
+<span class="sourceLineNo">5343</span>    hasNext = scanner.next(currRow);<a name="line.5343"></a>
+<span class="sourceLineNo">5344</span>    assertEquals(2, currRow.size());<a name="line.5344"></a>
+<span class="sourceLineNo">5345</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5345"></a>
+<span class="sourceLineNo">5346</span>        .get(0).getRowLength(), row3, 0, row3.length));<a name="line.5346"></a>
+<span class="sourceLineNo">5347</span>    assertTrue(hasNext);<a name="line.5347"></a>
+<span class="sourceLineNo">5348</span>    // 3. scan out "row2" (4 kvs)<a name="line.5348"></a>
+<span class="sourceLineNo">5349</span>    // "row2" takes 2 next() calls since batch=3<a name="line.5349"></a>
+<span class="sourceLineNo">5350</span>    currRow.clear();<a name="line.5350"></a>
+<span class="sourceLineNo">5351</span>    hasNext = scanner.next(currRow);<a name="line.5351"></a>
+<span class="sourceLineNo">5352</span>    assertEquals(3, currRow.size());<a name="line.5352"></a>
+<span class="sourceLineNo">5353</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5353"></a>
+<span class="sourceLineNo">5354</span>        .get(0).getRowLength(), row2, 0, row2.length));<a name="line.5354"></a>
+<span class="sourceLineNo">5355</span>    assertTrue(hasNext);<a name="line.5355"></a>
+<span class="sourceLineNo">5356</span>    currRow.clear();<a name="line.5356"></a>
+<span class="sourceLineNo">5357</span>    hasNext = scanner.next(currRow);<a name="line.5357"></a>
+<span class="sourceLineNo">5358</span>    assertEquals(1, currRow.size());<a name="line.5358"></a>
+<span class="sourceLineNo">5359</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5359"></a>
+<span class="sourceLineNo">5360</span>        .get(0).getRowLength(), row2, 0, row2.length));<a name="line.5360"></a>
+<span class="sourceLineNo">5361</span>    assertTrue(hasNext);<a name="line.5361"></a>
+<span class="sourceLineNo">5362</span>    // 4. scan out "row1" (2 kv)<a name="line.5362"></a>
+<span class="sourceLineNo">5363</span>    currRow.clear();<a name="line.5363"></a>
+<span class="sourceLineNo">5364</span>    hasNext = scanner.next(currRow);<a name="line.5364"></a>
+<span class="sourceLineNo">5365</span>    assertEquals(2, currRow.size());<a name="line.5365"></a>
+<span class="sourceLineNo">5366</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5366"></a>
+<span class="sourceLineNo">5367</span>        .get(0).getRowLength(), row1, 0, row1.length));<a name="line.5367"></a>
+<span class="sourceLineNo">5368</span>    assertTrue(hasNext);<a name="line.5368"></a>
+<span class="sourceLineNo">5369</span>    // 5. scan out "row0" (1 kv)<a name="line.5369"></a>
+<span class="sourceLineNo">5370</span>    currRow.clear();<a name="line.5370"></a>
+<span class="sourceLineNo">5371</span>    hasNext = scanner.next(currRow);<a name="line.5371"></a>
+<span class="sourceLineNo">5372</span>    assertEquals(1, currRow.size());<a name="line.5372"></a>
+<span class="sourceLineNo">5373</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5373"></a>
+<span class="sourceLineNo">5374</span>        .get(0).getRowLength(), row0, 0, row0.length));<a name="line.5374"></a>
+<span class="sourceLineNo">5375</span>    assertFalse(hasNext);<a name="line.5375"></a>
+<span class="sourceLineNo">5376</span><a name="line.5376"></a>
+<span class="sourceLineNo">5377</span>    scanner.close();<a name="line.5377"></a>
+<span class="sourceLineNo">5378</span>  }<a name="line.5378"></a>
+<span class="sourceLineNo">5379</span><a name="line.5379"></a>
+<span class="sourceLineNo">5380</span>  @Test<a name="line.5380"></a>
+<span class="sourceLineNo">5381</span>  public void testReverseScanner_FromMemStoreAndHFiles_MultiCFs2()<a name="line.5381"></a>
+<span class="sourceLineNo">5382</span>      throws IOException {<a name="line.5382"></a>
+<span class="sourceLineNo">5383</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.5383"></a>
+<span class="sourceLineNo">5384</span>    byte[] row2 = Bytes.toBytes("row2");<a name="line.5384"></a>
+<span class="sourceLineNo">5385</span>    byte[] row3 = Bytes.toBytes("row3");<a name="line.5385"></a>
+<span class="sourceLineNo">5386</span>    byte[] row4 = Bytes.toBytes("row4");<a name="line.5386"></a>
+<span class="sourceLineNo">5387</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5387"></a>
+<span class="sourceLineNo">5388</span>    byte[] cf2 = Bytes.toBytes("CF2");<a name="line.5388"></a>
+<span class="sourceLineNo">5389</span>    byte[] cf3 = Bytes.toBytes("CF3");<a name="line.5389"></a>
+<span class="sourceLineNo">5390</span>    byte[] cf4 = Bytes.toBytes("CF4");<a name="line.5390"></a>
+<span class="sourceLineNo">5391</span>    byte[][] families = { cf1, cf2, cf3, cf4 };<a name="line.5391"></a>
+<span class="sourceLineNo">5392</span>    byte[] col = Bytes.toBytes("C");<a name="line.5392"></a>
+<span class="sourceLineNo">5393</span>    long ts = 1;<a name="line.5393"></a>
+<span class="sourceLineNo">5394</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5394"></a>
+<span class="sourceLineNo">5395</span>    // disable compactions in this test.<a name="line.5395"></a>
+<span class="sourceLineNo">5396</span>    conf.setInt("hbase.hstore.compactionThreshold", 10000);<a name="line.5396"></a>
+<span class="sourceLineNo">5397</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5397"></a>
+<span class="sourceLineNo">5398</span>    KeyValue kv1 = new KeyValue(row1, cf1, col, ts, KeyValue.Type.Put, null);<a name="line.5398"></a>
+<span class="sourceLineNo">5399</span>    KeyValue kv2 = new KeyValue(row2, cf2, col, ts, KeyValue.Type.Put, null);<a name="line.5399"></a>
+<span class="sourceLineNo">5400</span>    KeyValue kv3 = new KeyValue(row3, cf3, col, ts, KeyValue.Type.Put, null);<a name="line.5400"></a>
+<span class="sourceLineNo">5401</span>    KeyValue kv4 = new KeyValue(row4, cf4, col, ts, KeyValue.Type.Put, null);<a name="line.5401"></a>
+<span class="sourceLineNo">5402</span>    // storefile1<a name="line.5402"></a>
+<span class="sourceLineNo">5403</span>    Put put = new Put(row1);<a name="line.5403"></a>
+<span class="sourceLineNo">5404</span>    put.add(kv1);<a name="line.5404"></a>
 <span class="sourceLineNo">5405</span>    region.put(put);<a name="line.5405"></a>
 <span class="sourceLineNo">5406</span>    region.flush(true);<a name="line.5406"></a>
-<span class="sourceLineNo">5407</span>    // memstore<a name="line.5407"></a>
-<span class="sourceLineNo">5408</span>    put = new Put(row4);<a name="line.5408"></a>
-<span class="sourceLineNo">5409</span>    put.add(kv4);<a name="line.5409"></a>
+<span class="sourceLineNo">5407</span>    // storefile2<a name="line.5407"></a>
+<span class="sourceLineNo">5408</span>    put = new Put(row2);<a name="line.5408"></a>
+<span class="sourceLineNo">5409</span>    put.add(kv2);<a name="line.5409"></a>
 <span class="sourceLineNo">5410</span>    region.put(put);<a name="line.5410"></a>
-<span class="sourceLineNo">5411</span>    // scan range = ["row4", min)<a name="line.5411"></a>
-<span class="sourceLineNo">5412</span>    Scan scan = new Scan(row4);<a name="line.5412"></a>
-<span class="sourceLineNo">5413</span>    scan.setReversed(true);<a name="line.5413"></a>
-<span class="sourceLineNo">5414</span>    scan.setBatch(10);<a name="line.5414"></a>
-<span class="sourceLineNo">5415</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5415"></a>
-<span class="sourceLineNo">5416</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5416"></a>
-<span class="sourceLineNo">5417</span>    boolean hasNext = scanner.next(currRow);<a name="line.5417"></a>
-<span class="sourceLineNo">5418</span>    assertEquals(1, currRow.size());<a name="line.5418"></a>
-<span class="sourceLineNo">5419</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5419"></a>
-<span class="sourceLineNo">5420</span>        .get(0).getRowLength(), row4, 0, row4.length));<a name="line.5420"></a>
-<span class="sourceLineNo">5421</span>    assertTrue(hasNext);<a name="line.5421"></a>
-<span class="sourceLineNo">5422</span>    currRow.clear();<a name="line.5422"></a>
-<span class="sourceLineNo">5423</span>    hasNext = scanner.next(currRow);<a name="line.5423"></a>
-<span class="sourceLineNo">5424</span>    assertEquals(1, currRow.size());<a name="line.5424"></a>
-<span class="sourceLineNo">5425</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5425"></a>
-<span class="sourceLineNo">5426</span>        .get(0).getRowLength(), row3, 0, row3.length));<a name="line.5426"></a>
-<span class="sourceLineNo">5427</span>    assertTrue(hasNext);<a name="line.5427"></a>
-<span class="sourceLineNo">5428</span>    currRow.clear();<a name="line.5428"></a>
-<span class="sourceLineNo">5429</span>    hasNext = scanner.next(currRow);<a name="line.5429"></a>
-<span class="sourceLineNo">5430</span>    assertEquals(1, currRow.size());<a name="line.5430"></a>
-<span class="sourceLineNo">5431</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5431"></a>
-<span class="sourceLineNo">5432</span>        .get(0).getRowLength(), row2, 0, row2.length));<a name="line.5432"></a>
-<span class="sourceLineNo">5433</span>    assertTrue(hasNext);<a name="line.5433"></a>
-<span class="sourceLineNo">5434</span>    currRow.clear();<a name="line.5434"></a>
-<span class="sourceLineNo">5435</span>    hasNext = scanner.next(currRow);<a name="line.5435"></a>
-<span class="sourceLineNo">5436</span>    assertEquals(1, currRow.size());<a name="line.5436"></a>
-<span class="sourceLineNo">5437</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5437"></a>
-<span class="sourceLineNo">5438</span>        .get(0).getRowLength(), row1, 0, row1.length));<a name="line.5438"></a>
-<span class="sourceLineNo">5439</span>    assertFalse(hasNext);<a name="line.5439"></a>
-<span class="sourceLineNo">5440</span>  }<a name="line.5440"></a>
-<span class="sourceLineNo">5441</span><a name="line.5441"></a>
-<span class="sourceLineNo">5442</span>  /**<a name="line.5442"></a>
-<span class="sourceLineNo">5443</span>   * Test for HBASE-14497: Reverse Scan threw StackOverflow caused by readPt checking<a name="line.5443"></a>
-<span class="sourceLineNo">5444</span>   */<a name="line.5444"></a>
-<span class="sourceLineNo">5445</span>  @Test<a name="line.5445"></a>
-<span class="sourceLineNo">5446</span>  public void testReverseScanner_StackOverflow() throws IOException {<a name="line.5446"></a>
-<span class="sourceLineNo">5447</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5447"></a>
-<span class="sourceLineNo">5448</span>    byte[][] families = {cf1};<a name="line.5448"></a>
-<span class="sourceLineNo">5449</span>    byte[] col = Bytes.toBytes("C");<a name="line.5449"></a>
-<span class="sourceLineNo">5450</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5450"></a>
-<span class="sourceLineNo">5451</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5451"></a>
-<span class="sourceLineNo">5452</span>    // setup with one storefile and one memstore, to create scanner and get an earlier readPt<a name="line.5452"></a>
-<span class="sourceLineNo">5453</span>    Put put = new Put(Bytes.toBytes("19998"));<a name="line.5453"></a>
-<span class="sourceLineNo">5454</span>    put.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5454"></a>
-<span class="sourceLineNo">5455</span>    region.put(put);<a name="line.5455"></a>
-<span class="sourceLineNo">5456</span>    region.flushcache(true, true, FlushLifeCycleTracker.DUMMY);<a name="line.5456"></a>
-<span class="sourceLineNo">5457</span>    Put put2 = new Put(Bytes.toBytes("19997"));<a name="line.5457"></a>
-<span class="sourceLineNo">5458</span>    put2.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5458"></a>
-<span class="sourceLineNo">5459</span>    region.put(put2);<a name="line.5459"></a>
-<span class="sourceLineNo">5460</span><a name="line.5460"></a>
-<span class="sourceLineNo">5461</span>    Scan scan = new Scan(Bytes.toBytes("19998"));<a name="line.5461"></a>
-<span class="sourceLineNo">5462</span>    scan.setReversed(true);<a name="line.5462"></a>
-<span class="sourceLineNo">5463</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5463"></a>
-<span class="sourceLineNo">5464</span><a name="line.5464"></a>
-<span class="sourceLineNo">5465</span>    // create one storefile contains many rows will be skipped<a name="line.5465"></a>
-<span class="sourceLineNo">5466</span>    // to check StoreFileScanner.seekToPreviousRow<a name="line.5466"></a>
-<span class="sourceLineNo">5467</span>    for (int i = 10000; i &lt; 20000; i++) {<a name="line.5467"></a>
-<span class="sourceLineNo">5468</span>      Put p = new Put(Bytes.toBytes(""+i));<a name="line.5468"></a>
-<span class="sourceLineNo">5469</span>      p.addColumn(cf1, col, Bytes.toBytes("" + i));<a name="line.5469"></a>
-<span class="sourceLineNo">5470</span>      region.put(p);<a name="line.5470"></a>
-<span class="sourceLineNo">5471</span>    }<a name="line.5471"></a>
-<span class="sourceLineNo">5472</span>    region.flushcache(true, true, FlushLifeCycleTracker.DUMMY);<a name="line.5472"></a>
-<span class="sourceLineNo">5473</span><a name="line.5473"></a>
-<span class="sourceLineNo">5474</span>    // create one memstore contains many rows will be skipped<a name="line.5474"></a>
-<span class="sourceLineNo">5475</span>    // to check MemStoreScanner.seekToPreviousRow<a name="line.5475"></a>
-<span class="sourceLineNo">5476</span>    for (int i = 10000; i &lt; 20000; i++) {<a name="line.5476"></a>
-<span class="sourceLineNo">5477</span>      Put p = new Put(Bytes.toBytes(""+i));<a name="line.5477"></a>
-<span class="sourceLineNo">5478</span>      p.addColumn(cf1, col, Bytes.toBytes("" + i));<a name="line.5478"></a>
-<span class="sourceLineNo">5479</span>      region.put(p);<a name="line.5479"></a>
-<span class="sourceLineNo">5480</span>    }<a name="line.5480"></a>
-<span class="sourceLineNo">5481</span><a name="line.5481"></a>
-<span class="sourceLineNo">5482</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5482"></a>
-<span class="sourceLineNo">5483</span>    boolean hasNext;<a name="line.5483"></a>
-<span class="sourceLineNo">5484</span>    do {<a name="line.5484"></a>
-<span class="sourceLineNo">5485</span>      hasNext = scanner.next(currRow);<a name="line.5485"></a>
-<span class="sourceLineNo">5486</span>    } while (hasNext);<a name="line.5486"></a>
-<span class="sourceLineNo">5487</span>    assertEquals(2, currRow.size());<a name="line.5487"></a>
-<span class="sourceLineNo">5488</span>    assertEquals("19998", Bytes.toString(currRow.get(0).getRowArray(),<a name="line.5488"></a>
-<span class="sourceLineNo">5489</span>      currRow.get(0).getRowOffset(), currRow.get(0).getRowLength()));<a name="line.5489"></a>
-<span class="sourceLineNo">5490</span>    assertEquals("19997", Bytes.toString(currRow.get(1).getRowArray(),<a name="line.5490"></a>
-<span class="sourceLineNo">5491</span>      currRow.get(1).getRowOffset(), currRow.get(1).getRowLength()));<a name="line.5491"></a>
-<span class="sourceLineNo">5492</span>  }<a name="line.5492"></a>
-<span class="sourceLineNo">5493</span><a name="line.5493"></a>
-<span class="sourceLineNo">5494</span>  @Test<a name="line.5494"></a>
-<span class="sourceLineNo">5495</span>  public void testReverseScanShouldNotScanMemstoreIfReadPtLesser() throws Exception {<a name="line.5495"></a>
-<span class="sourceLineNo">5496</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5496"></a>
-<span class="sourceLineNo">5497</span>    byte[][] families = { cf1 };<a name="line.5497"></a>
-<span class="sourceLineNo">5498</span>    byte[] col = Bytes.toBytes("C");<a name="line.5498"></a>
-<span class="sourceLineNo">5499</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5499"></a>
-<span class="sourceLineNo">5500</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5500"></a>
-<span class="sourceLineNo">5501</span>    // setup with one storefile and one memstore, to create scanner and get an earlier readPt<a name="line.5501"></a>
-<span class="sourceLineNo">5502</span>    Put put = new Put(Bytes.toBytes("19996"));<a name="line.5502"></a>
-<span class="sourceLineNo">5503</span>    put.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5503"></a>
-<span class="sourceLineNo">5504</span>    region.put(put);<a name="line.5504"></a>
-<span class="sourceLineNo">5505</span>    Put put2 = new Put(Bytes.toBytes("19995"));<a name="line.5505"></a>
-<span class="sourceLineNo">5506</span>    put2.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5506"></a>
-<span class="sourceLineNo">5507</span>    region.put(put2);<a name="line.5507"></a>
-<span class="sourceLineNo">5508</span>    // create a reverse scan<a name="line.5508"></a>
-<span class="sourceLineNo">5509</span>    Scan scan = new Scan(Bytes.toBytes("19996"));<a name="line.5509"></a>
-<span class="sourceLineNo">5510</span>    scan.setReversed(true);<a name="line.5510"></a>
-<span class="sourceLineNo">5511</span>    RegionScannerImpl scanner = region.getScanner(scan);<a name="line.5511"></a>
-<span class="sourceLineNo">5512</span><a name="line.5512"></a>
-<span class="sourceLineNo">5513</span>    // flush the cache. This will reset the store scanner<a name="line.5513"></a>
-<span class="sourceLineNo">5514</span>    region.flushcache(true, true, FlushLifeCycleTracker.DUMMY);<a name="line.5514"></a>
-<span class="sourceLineNo">5515</span><a name="line.5515"></a>
-<span class="sourceLineNo">5516</span>    // create one memstore contains many rows will be skipped<a name="line.5516"></a>
-<span class="sourceLineNo">5517</span>    // to check MemStoreScanner.seekToPreviousRow<a name="line.5517"></a>
-<span class="sourceLineNo">5518</span>    for (int i = 10000; i &lt; 20000; i++) {<a name="line.5518"></a>
-<span class="sourceLineNo">5519</span>      Put p = new Put(Bytes.toBytes("" + i));<a name="line.5519"></a>
-<span class="sourceLineNo">5520</span>      p.addColumn(cf1, col, Bytes.toBytes("" + i));<a name="line.5520"></a>
-<span class="sourceLineNo">5521</span>      region.put(p);<a name="line.5521"></a>
-<span class="sourceLineNo">5522</span>    }<a name="line.5522"></a>
-<span class="sourceLineNo">5523</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5523"></a>
-<span class="sourceLineNo">5524</span>    boolean hasNext;<a name="line.5524"></a>
-<span class="sourceLineNo">5525</span>    boolean assertDone = false;<a name="line.5525"></a>
-<span class="sourceLineNo">5526</span>    do {<a name="line.5526"></a>
-<span class="sourceLineNo">5527</span>      hasNext = scanner.next(currRow);<a name="line.5527"></a>
-<span class="sourceLineNo">5528</span>      // With HBASE-15871, after the scanner is reset the memstore scanner should not be<a name="line.5528"></a>
-<span class="sourceLineNo">5529</span>      // added here<a name="line.5529"></a>
-<span class="sourceLineNo">5530</span>      if (!assertDone) {<a name="line.5530"></a>
-<span class="sourceLineNo">5531</span>        StoreScanner current =<a name="line.5531"></a>
-<span class="sourceLineNo">5532</span>            (StoreScanner) (scanner.storeHeap).getCurrentForTesting();<a name="line.5532"></a>
-<span class="sourceLineNo">5533</span>        List&lt;KeyValueScanner&gt; scanners = current.getAllScannersForTesting();<a name="line.5533"></a>
-<span class="sourceLineNo">5534</span>        assertEquals("There should be only one scanner the store file scanner", 1,<a name="line.5534"></a>
-<span class="sourceLineNo">5535</span>          scanners.size());<a name="line.5535"></a>
-<span class="sourceLineNo">5536</span>        assertDone = true;<a name="line.5536"></a>
-<span class="sourceLineNo">5537</span>      }<a name="line.5537"></a>
-<span class="sourceLineNo">5538</span>    } while (hasNext);<a name="line.5538"></a>
-<span class="sourceLineNo">5539</span>    assertEquals(2, currRow.size());<a name="line.5539"></a>
-<span class="sourceLineNo">5540</span>    assertEquals("19996", Bytes.toString(currRow.get(0).getRowArray(),<a name="line.5540"></a>
-<span class="sourceLineNo">5541</span>      currRow.get(0).getRowOffset(), currRow.get(0).getRowLength()));<a name="line.5541"></a>
-<span class="sourceLineNo">5542</span>    assertEquals("19995", Bytes.toString(currRow.get(1).getRowArray(),<a name="line.5542"></a>
-<span class="sourceLineNo">5543</span>      currRow.get(1).getRowOffset(), currRow.get(1).getRowLength()));<a name="line.5543"></a>
-<span class="sourceLineNo">5544</span>  }<a name="line.5544"></a>
-<span class="sourceLineNo">5545</span><a name="line.5545"></a>
-<span class="sourceLineNo">5546</span>  @Test<a name="line.5546"></a>
-<span class="sourceLineNo">5547</span>  public void testReverseScanWhenPutCellsAfterOpenReverseScan() throws Exception {<a name="line.5547"></a>
-<span class="sourceLineNo">5548</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5548"></a>
-<span class="sourceLineNo">5549</span>    byte[][] families = { cf1 };<a name="line.5549"></a>
-<span class="sourceLineNo">5550</span>    byte[] col = Bytes.toBytes("C");<a name="line.5550"></a>
-<span class="sourceLineNo">5551</span><a name="line.5551"></a>
-<span class="sourceLineNo">5552</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5552"></a>
-<span class="sourceLineNo">5553</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5553"></a>
-<span class="sourceLineNo">5554</span><a name="line.5554"></a>
-<span class="sourceLineNo">5555</span>    Put put = new Put(Bytes.toBytes("199996"));<a name="line.5555"></a>
-<span class="sourceLineNo">5556</span>    put.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5556"></a>
-<span class="sourceLineNo">5557</span>    region.put(put);<a name="line.5557"></a>
-<span class="sourceLineNo">5558</span>    Put put2 = new Put(Bytes.toBytes("199995"));<a name="line.5558"></a>
-<span class="sourceLineNo">5559</span>    put2.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5559"></a>
-<span class="sourceLineNo">5560</span>    region.put(put2);<a name="line.5560"></a>
+<span class="sourceLineNo">5411</span>    region.flush(true);<a name="line.5411"></a>
+<span class="sourceLineNo">5412</span>    // storefile3<a name="line.5412"></a>
+<span class="sourceLineNo">5413</span>    put = new Put(row3);<a name="line.5413"></a>
+<span class="sourceLineNo">5414</span>    put.add(kv3);<a name="line.5414"></a>
+<span class="sourceLineNo">5415</span>    region.put(put);<a name="line.5415"></a>
+<span class="sourceLineNo">5416</span>    region.flush(true);<a name="line.5416"></a>
+<span class="sourceLineNo">5417</span>    // memstore<a name="line.5417"></a>
+<span class="sourceLineNo">5418</span>    put = new Put(row4);<a name="line.5418"></a>
+<span class="sourceLineNo">5419</span>    put.add(kv4);<a name="line.5419"></a>
+<span class="sourceLineNo">5420</span>    region.put(put);<a name="line.5420"></a>
+<span class="sourceLineNo">5421</span>    // scan range = ["row4", min)<a name="line.5421"></a>
+<span class="sourceLineNo">5422</span>    Scan scan = new Scan(row4);<a name="line.5422"></a>
+<span class="sourceLineNo">5423</span>    scan.setReversed(true);<a name="line.5423"></a>
+<span class="sourceLineNo">5424</span>    scan.setBatch(10);<a name="line.5424"></a>
+<span class="sourceLineNo">5425</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5425"></a>
+<span class="sourceLineNo">5426</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5426"></a>
+<span class="sourceLineNo">5427</span>    boolean hasNext = scanner.next(currRow);<a name="line.5427"></a>
+<span class="sourceLineNo">5428</span>    assertEquals(1, currRow.size());<a name="line.5428"></a>
+<span class="sourceLineNo">5429</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5429"></a>
+<span class="sourceLineNo">5430</span>        .get(0).getRowLength(), row4, 0, row4.length));<a name="line.5430"></a>
+<span class="sourceLineNo">5431</span>    assertTrue(hasNext);<a name="line.5431"></a>
+<span class="sourceLineNo">5432</span>    currRow.clear();<a name="line.5432"></a>
+<span class="sourceLineNo">5433</span>    hasNext = scanner.next(currRow);<a name="line.5433"></a>
+<span class="sourceLineNo">5434</span>    assertEquals(1, currRow.size());<a name="line.5434"></a>
+<span class="sourceLineNo">5435</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5435"></a>
+<span class="sourceLineNo">5436</span>        .get(0).getRowLength(), row3, 0, row3.length));<a name="line.5436"></a>
+<span class="sourceLineNo">5437</span>    assertTrue(hasNext);<a name="line.5437"></a>
+<span class="sourceLineNo">5438</span>    currRow.clear();<a name="line.5438"></a>
+<span class="sourceLineNo">5439</span>    hasNext = scanner.next(currRow);<a name="line.5439"></a>
+<span class="sourceLineNo">5440</span>    assertEquals(1, currRow.size());<a name="line.5440"></a>
+<span class="sourceLineNo">5441</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5441"></a>
+<span class="sourceLineNo">5442</span>        .get(0).getRowLength(), row2, 0, row2.length));<a name="line.5442"></a>
+<span class="sourceLineNo">5443</span>    assertTrue(hasNext);<a name="line.5443"></a>
+<span class="sourceLineNo">5444</span>    currRow.clear();<a name="line.5444"></a>
+<span class="sourceLineNo">5445</span>    hasNext = scanner.next(currRow);<a name="line.5445"></a>
+<span class="sourceLineNo">5446</span>    assertEquals(1, currRow.size());<a name="line.5446"></a>
+<span class="sourceLineNo">5447</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5447"></a>
+<span class="sourceLineNo">5448</span>        .get(0).getRowLength(), row1, 0, row1.length));<a name="line.5448"></a>
+<span class="sourceLineNo">5449</span>    assertFalse(hasNext);<a name="line.5449"></a>
+<span class="sourceLineNo">5450</span>  }<a name="line.5450"></a>
+<span class="sourceLineNo">5451</span><a name="line.5451"></a>
+<span class="sourceLineNo">5452</span>  /**<a name="line.5452"></a>
+<span class="sourceLineNo">5453</span>   * Test for HBASE-14497: Reverse Scan threw StackOverflow caused by readPt checking<a name="line.5453"></a>
+<span class="sourceLineNo">5454</span>   */<a name="line.5454"></a>
+<span class="sourceLineNo">5455</span>  @Test<a name="line.5455"></a>
+<span class="sourceLineNo">5456</span>  public void testReverseScanner_StackOverflow() throws IOException {<a name="line.5456"></a>
+<span class="sourceLineNo">5457</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5457"></a>
+<span class="sourceLineNo">5458</span>    byte[][] families = {cf1};<a name="line.5458"></a>
+<span class="sourceLineNo">5459</span>    byte[] col = Bytes.toBytes("C");<a name="line.5459"></a>
+<span class="sourceLineNo">5460</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5460"></a>
+<span class="sourceLineNo">5461</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5461"></a>
+<span class="sourceLineNo">5462</span>    // setup with one storefile and one memstore, to create scanner and get an earlier readPt<a name="line.5462"></a>
+<span class="sourceLineNo">5463</span>    Put put = new Put(Bytes.toBytes("19998"));<a name="line.5463"></a>
+<span class="sourceLineNo">5464</span>    put.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5464"></a>
+<span class="sourceLineNo">5465</span>    region.put(put);<a name="line.5465"></a>
+<span class="sourceLineNo">5466</span>    region.flushcache(true, true, FlushLifeCycleTracker.DUMMY);<a name="line.5466"></a>
+<span class="sourceLineNo">5467</span>    Put put2 = new Put(Bytes.toBytes("19997"));<a name="line.5467"></a>
+<span class="sourceLineNo">5468</span>    put2.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5468"></a>
+<span class="sourceLineNo">5469</span>    region.put(put2);<a name="line.5469"></a>
+<span class="sourceLineNo">5470</span><a name="line.5470"></a>
+<span class="sourceLineNo">5471</span>    Scan scan = new Scan(Bytes.toBytes("19998"));<a name="line.5471"></a>
+<span class="sourceLineNo">5472</span>    scan.setReversed(true);<a name="line.5472"></a>
+<span class="sourceLineNo">5473</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5473"></a>
+<span class="sourceLineNo">5474</span><a name="line.5474"></a>
+<span class="sourceLineNo">5475</span>    // create one storefile contains many rows will be skipped<a name="line.5475"></a>
+<span class="sourceLineNo">5476</span>    // to check StoreFileScanner.seekToPreviousRow<a name="line.5476"></a>
+<span class="sourceLineNo">5477</span>    for (int i = 10000; i &lt; 20000; i++) {<a name="line.5477"></a>
+<span class="sourceLineNo">5478</span>      Put p = new Put(Bytes.toBytes(""+i));<a name="line.5478"></a>
+<span class="sourceLineNo">5479</span>      p.addColumn(cf1, col, Bytes.toBytes("" + i));<a name="line.5479"></a>
+<span class="sourceLineNo">5480</span>      region.put(p);<a name="line.5480"></a>
+<span class="sourceLineNo">5481</span>    }<a name="line.5481"></a>
+<span class="sourceLineNo">5482</span>    region.flushcache(true, true, FlushLifeCycleTracker.DUMMY);<a name="line.5482"></a>
+<span class="sourceLineNo">5483</span><a name="line.5483"></a>
+<span class="sourceLineNo">5484</span>    // create one memstore contains many rows will be skipped<a name="line.5484"></a>
+<span class="sourceLineNo">5485</span>    // to check MemStoreScanner.seekToPreviousRow<a name="line.5485"></a>
+<span class="sourceLineNo">5486</span>    for (int i = 10000; i &lt; 20000; i++) {<a name="line.5486"></a>
+<span class="sourceLineNo">5487</span>      Put p = new Put(Bytes.toBytes(""+i));<a name="line.5487"></a>
+<span class="sourceLineNo">5488</span>      p.addColumn(cf1, col, Bytes.toBytes("" + i));<a name="line.5488"></a>
+<span class="sourceLineNo">5489</span>      region.put(p);<a name="line.5489"></a>
+<span class="sourceLineNo">5490</span>    }<a name="line.5490"></a>
+<span class="sourceLineNo">5491</span><a name="line.5491"></a>
+<span class="sourceLineNo">5492</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5492"></a>
+<span class="sourceLineNo">5493</span>    boolean hasNext;<a name="line.5493"></a>
+<span class="sourceLineNo">5494</span>    do {<a name="line.5494"></a>
+<span class="sourceLineNo">5495</span>      hasNext = scanner.next(currRow);<a name="line.5495"></a>
+<span class="sourceLineNo">5496</span>    } while (hasNext);<a name="line.5496"></a>
+<span class="sourceLineNo">5497</span>    assertEquals(2, currRow.size());<a name="line.5497"></a>
+<span class="sourceLineNo">5498</span>    assertEquals("19998", Bytes.toString(currRow.get(0).getRowArray(),<a name="line.5498"></a>
+<span class="sourceLineNo">5499</span>      currRow.get(0).getRowOffset(), currRow.get(0).getRowLength()));<a name="line.5499"></a>
+<span class="sourceLineNo">5500</span>    assertEquals("19997", Bytes.toString(currRow.get(1).getRowArray(),<a name="line.5500"></a>
+<span class="sourceLineNo">5501</span>      currRow.get(1).getRowOffset(), currRow.get(1).getRowLength()));<a name="line.5501"></a>
+<span class="sourceLineNo">5502</span>  }<a name="line.5502"></a>
+<span class="sourceLineNo">5503</span><a name="line.5503"></a>
+<span class="sourceLineNo">5504</span>  @Test<a name="line.5504"></a>
+<span class="sourceLineNo">5505</span>  public void testReverseScanShouldNotScanMemstoreIfReadPtLesser() throws Exception {<a name="line.5505"></a>
+<span class="sourceLineNo">5506</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5506"></a>
+<span class="sourceLineNo">5507</span>    byte[][] families = { cf1 };<a name="line.5507"></a>
+<span class="sourceLineNo">5508</span>    byte[] col = Bytes.toBytes("C");<a name="line.5508"></a>
+<span class="sourceLineNo">5509</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5509"></a>
+<span class="sourceLineNo">5510</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5510"></a>
+<span class="sourceLineNo">5511</span>    // setup with one storefile and one memstore, to create scanner and get an earlier readPt<a name="line.5511"></a>
+<span class="sourceLineNo">5512</span>    Put put = new Put(Bytes.toBytes("19996"));<a name="line.5512"></a>
+<span class="sourceLineNo">5513</span>    put.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5513"></a>
+<span class="sourceLineNo">5514</span>    region.put(put);<a name="line.5514"></a>
+<span class="sourceLineNo">5515</span>    Put put2 = new Put(Bytes.toBytes("19995"));<a name="line.5515"></a>
+<span class="sourceLineNo">5516</span>    put2.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5516"></a>
+<span class="sourceLineNo">5517</span>    region.put(put2);<a name="line.5517"></a>
+<span class="sourceLineNo">5518</span>    // create a reverse scan<a name="line.5518"></a>
+<span class="sourceLineNo">5519</span>    Scan scan = new Scan(Bytes.toBytes("19996"));<a name="line.5519"></a>
+<span class="sourceLineNo">5520</span>    scan.setReversed(true);<a name="line.5520"></a>
+<span class="sourceLineNo">5521</span>    RegionScannerImpl scanner = region.getScanner(scan);<a name="line.5521"></a>
+<span class="sourceLineNo">5522</span><a name="line.5522"></a>
+<span class="sourceLineNo">5523</span>    // flush the cache. This will reset the store scanner<a name="line.5523"></a>
+<span class="sourceLineNo">5524</span>    region.flushcache(true, true, FlushLifeCycleTracker.DUMMY);<a name="line.5524"></a>
+<span class="sourceLineNo">5525</span><a name="line.5525"></a>
+<span class="sourceLineNo">5526</span>    // create one memstore contains many rows will be skipped<a name="line.5526"></a>
+<span class="sourceLineNo">5527</span>    // to check MemStoreScanner.seekToPreviousRow<a name="line.5527"></a>
+<span class="sourceLineNo">5528</span>    for (int i = 10000; i &lt; 20000; i++) {<a name="line.5528"></a>
+<span class="sourceLineNo">5529</span>      Put p = new Put(Bytes.toBytes("" + i));<a name="line.5529"></a>
+<span class="sourceLineNo">5530</span>      p.addColumn(cf1, col, Bytes.toBytes("" + i));<a name="line.5530"></a>
+<span class="sourceLineNo">5531</span>      region.put(p);<a name="line.5531"></a>
+<span class="sourceLineNo">5532</span>    }<a name="line.5532"></a>
+<span class="sourceLineNo">5533</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5533"></a>
+<span class="sourceLineNo">5534</span>    boolean hasNext;<a name="line.5534"></a>
+<span class="sourceLineNo">5535</span>    boolean assertDone = false;<a name="line.5535"></a>
+<span class="sourceLineNo">5536</span>    do {<a name="line.5536"></a>
+<span class="sourceLineNo">5537</span>      hasNext = scanner.next(currRow);<a name="line.5537"></a>
+<span class="sourceLineNo">5538</span>      // With HBASE-15871, after the scanner is reset the memstore scanner should not be<a name="line.5538"></a>
+<span class="sourceLineNo">5539</span>      // added here<a name="line.5539"></a>
+<span class="sourceLineNo">5540</span>      if (!assertDone) {<a name="line.5540"></a>
+<span class="sourceLineNo">5541</span>        StoreScanner current =<a name="line.5541"></a>
+<span class="sourceLineNo">5542</span>            (StoreScanner) (scanner.storeHeap).getCurrentForTesting();<a name="line.5542"></a>
+<span class="sourceLineNo">5543</span>        List&lt;KeyValueScanner&gt; scanners = current.getAllScannersForTesting();<a name="line.5543"></a>
+<span class="sourceLineNo">5544</span>        assertEquals("There should be only one scanner the store file scanner", 1,<a name="line.5544"></a>
+<span class="sourceLineNo">5545</span>          scanners.size());<a name="line.5545"></a>
+<span class="sourceLineNo">5546</span>        assertDone = true;<a name="line.5546"></a>
+<span class="sourceLineNo">5547</span>      }<a name="line.5547"></a>
+<span class="sourceLineNo">5548</span>    } while (hasNext);<a name="line.5548"></a>
+<span class="sourceLineNo">5549</span>    assertEquals(2, currRow.size());<a name="line.5549"></a>
+<span class="sourceLineNo">5550</span>    assertEquals("19996", Bytes.toString(currRow.get(0).getRowArray(),<a name="line.5550"></a>
+<span class="sourceLineNo">5551</span>      currRow.get(0).getRowOffset(), currRow.get(0).getRowLength()));<a name="line.5551"></a>
+<span class="sourceLineNo">5552</span>    assertEquals("19995", Bytes.toString(currRow.get(1).getRowArray(),<a name="line.5552"></a>
+<span class="sourceLineNo">5553</span>      currRow.get(1).getRowOffset(), currRow.get(1).getRowLength()));<a name="line.5553"></a>
+<span class="sourceLineNo">5554</span>  }<a name="line.5554"></a>
+<span class="sourceLineNo">5555</span><a name="line.5555"></a>
+<span class="sourceLineNo">5556</span>  @Test<a name="line.5556"></a>
+<span class="sourceLineNo">5557</span>  public void testReverseScanWhenPutCellsAfterOpenReverseScan() throws Exception {<a name="line.5557"></a>
+<span class="sourceLineNo">5558</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5558"></a>
+<span class="sourceLineNo">5559</span>    byte[][] families = { cf1 };<a name="line.5559"></a>
+<span class="sourceLineNo">5560</span>    byte[] col = Bytes.toBytes("C");<a name="line.5560"></a>
 <span class="sourceLineNo">5561</span><a name="line.5561"></a>
-<span class="sourceLineNo">5562</span>    // Create a reverse scan<a name="line.5562"></a>
-<span class="sourceLineNo">5563</span>    Scan scan = new Scan(Bytes.toBytes("199996"));<a name="line.5563"></a>
-<span class="sourceLineNo">5564</span>    scan.setReversed(true);<a name="line.5564"></a>
-<span class="sourceLineNo">5565</span>    RegionScannerImpl scanner = region.getScanner(scan);<a name="line.5565"></a>
-<span class="sourceLineNo">5566</span><a name="line.5566"></a>
-<span class="sourceLineNo">5567</span>    // Put a lot of cells that have sequenceIDs grater than the readPt of the reverse scan<a name="line.5567"></a>
-<span class="sourceLineNo">5568</span>    for (int i = 100000; i &lt; 200000; i++) {<a name="line.5568"></a>
-<span class="sourceLineNo">5569</span>      Put p = new Put(Bytes.toBytes("" + i));<a name="line.5569"></a>
-<span class="sourceLineNo">5570</span>      p.addColumn(cf1, col, Bytes.toBytes("" + i));<a name="line.5570"></a>
-<span class="sourceLineNo">5571</span>      region.put(p);<a name="line.5571"></a>
-<span class="sourceLineNo">5572</span>    }<a name="line.5572"></a>
-<span class="sourceLineNo">5573</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5573"></a>
-<span class="sourceLineNo">5574</span>    boolean hasNext;<a name="line.5574"></a>
-<span class="sourceLineNo">5575</span>    do {<a name="line.5575"></a>
-<span class="sourceLineNo">5576</span>      hasNext = scanner.next(currRow);<a name="line.5576"></a>
-<span class="sourceLineNo">5577</span>    } while (hasNext);<a name="line.5577"></a>
-<span class="sourceLineNo">5578</span><a name="line.5578"></a>
-<span class="sourceLineNo">5579</span>    assertEquals(2, currRow.size());<a name="line.5579"></a>
-<span class="sourceLineNo">5580</span>    assertEquals("199996", Bytes.toString(currRow.get(0).getRowArray(),<a name="line.5580"></a>
-<span class="sourceLineNo">5581</span>      currRow.get(0).getRowOffset(), currRow.get(0).getRowLength()));<a name="line.5581"></a>
-<span class="sourceLineNo">5582</span>    assertEquals("199995", Bytes.toString(currRow.get(1).getRowArray(),<a name="line.5582"></a>
-<span class="sourceLineNo">5583</span>      currRow.get(1).getRowOffset(), currRow.get(1).getRowLength()));<a name="line.5583"></a>
-<span class="sourceLineNo">5584</span>  }<a name="line.5584"></a>
-<span class="sourceLineNo">5585</span><a name="line.5585"></a>
-<span class="sourceLineNo">5586</span>  @Test<a name="line.5586"></a>
-<span class="sourceLineNo">5587</span>  public void testWriteRequestsCounter() throws IOException {<a name="line.5587"></a>
-<span class="sourceLineNo">5588</span>    byte[] fam = Bytes.toBytes("info");<a name="line.5588"></a>
-<span class="sourceLineNo">5589</span>    byte[][] families = { fam };<a name="line.5589"></a>
-<span class="sourceLineNo">5590</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.5590"></a>
-<span class="sourceLineNo">5591</span><a name="line.5591"></a>
-<span class="sourceLineNo">5592</span>    Assert.assertEquals(0L, region.getWriteRequestsCount());<a name="line.5592"></a>
-<span class="sourceLineNo">5593</span><a name="line.5593"></a>
-<span class="sourceLineNo">5594</span>    Put put = new Put(row);<a name="line.5594"></a>
-<span class="sourceLineNo">5595</span>    put.addColumn(fam, fam, fam);<a name="line.5595"></a>
-<span class="sourceLineNo">5596</span><a name="line.5596"></a>
-<span class="sourceLineNo">5597</span>    Assert.assertEquals(0L, region.getWriteRequestsCount());<a name="line.5597"></a>
-<span class="sourceLineNo">5598</span>    region.put(put);<a name="line.5598"></a>
-<span class="sourceLineNo">5599</span>    Assert.assertEquals(1L, region.getWriteRequestsCount());<a name="line.5599"></a>
-<span class="sourceLineNo">5600</span>    region.put(put);<a name="line.5600"></a>
-<span class="sourceLineNo">5601</span>    Assert.assertEquals(2L, region.getWriteRequestsCount());<a name="line.5601"></a>
-<span class="sourceLineNo">5602</span>    region.put(put);<a name="line.5602"></a>
-<span class="sourceLineNo">5603</span>    Assert.assertEquals(3L, region.getWriteRequestsCount());<a name="line.5603"></a>
-<span class="sourceLineNo">5604</span><a name="line.5604"></a>
-<span class="sourceLineNo">5605</span>    region.delete(new Delete(row));<a name="line.5605"></a>
-<span class="sourceLineNo">5606</span>    Assert.assertEquals(4L, region.getWriteRequestsCount());<a name="line.5606"></a>
-<span class="sourceLineNo">5607</span>  }<a name="line.5607"></a>
-<span class="sourceLineNo">5608</span><a name="line.5608"></a>
-<span class="sourceLineNo">5609</span>  @Test<a name="line.5609"></a>
-<span class="sourceLineNo">5610</span>  public void testOpenRegionWrittenToWAL() throws Exception {<a name="line.5610"></a>
-<span class="sourceLineNo">5611</span>    final ServerName serverName = ServerName.valueOf(name.getMethodName(), 100, 42);<a name="line.5611"></a>
-<span class="sourceLineNo">5612</span>    final RegionServerServices rss = spy(TEST_UTIL.createMockRegionServerService(serverName));<a name="line.5612"></a>
-<span class="sourceLineNo">5613</span><a name="line.5613"></a>
-<span class="sourceLineNo">5614</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.5614"></a>
-<span class="sourceLineNo">5615</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.5615"></a>
-<span class="sourceLineNo">5616</span>    htd.addFamily(new HColumnDescriptor(fam2));<a name="line.5616"></a>
-<span class="sourceLineNo">5617</span><a name="line.5617"></a>
-<span class="sourceLineNo">5618</span>    HRegionInfo hri = new HRegionInfo(htd.getTableName(),<a name="line.5618"></a>
-<span class="sourceLineNo">5619</span>      HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY);<a name="line.5619"></a>
-<span class="sourceLineNo">5620</span><a name="line.5620"></a>
-<span class="sourceLineNo">5621</span>    // open the region w/o rss and wal and flush some files<a name="line.5621"></a>
-<span class="sourceLineNo">5622</span>    region =<a name="line.5622"></a>
-<span class="sourceLineNo">5623</span>         HBaseTestingUtility.createRegionAndWAL(hri, TEST_UTIL.getDataTestDir(), TEST_UTIL<a name="line.5623"></a>
-<span class="sourceLineNo">5624</span>             .getConfiguration(), htd);<a name="line.5624"></a>
-<span class="sourceLineNo">5625</span>    assertNotNull(region);<a name="line.5625"></a>
-<span class="sourceLineNo">5626</span><a name="line.5626"></a>
-<span class="sourceLineNo">5627</span>    // create a file in fam1 for the region before opening in OpenRegionHandler<a name="line.5627"></a>
-<span class="sourceLineNo">5628</span>    region.put(new Put(Bytes.toBytes("a")).addColumn(fam1, fam1, fam1));<a name="line.5628"></a>
-<span class="sourceLineNo">5629</span>    region.flush(true);<a name="line.5629"></a>
-<span class="sourceLineNo">5630</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.5630"></a>
-<span class="sourceLineNo">5631</span><a name="line.5631"></a>
-<span class="sourceLineNo">5632</span>    ArgumentCaptor&lt;WALEdit&gt; editCaptor = ArgumentCaptor.forClass(WALEdit.class);<a name="line.5632"></a>
-<span class="sourceLineNo">5633</span><a name="line.5633"></a>
-<span class="sourceLineNo">5634</span>    // capture append() calls<a name="line.5634"></a>
-<span class="sourceLineNo">5635</span>    WAL wal = mockWAL();<a name="line.5635"></a>
-<span class="sourceLineNo">5636</span>    when(rss.getWAL((HRegionInfo) any())).thenReturn(wal);<a name="line.5636"></a>
-<span class="sourceLineNo">5637</span><a name="line.5637"></a>
-<span class="sourceLineNo">5638</span>    region = HRegion.openHRegion(hri, htd, rss.getWAL(hri),<a name="line.5638"></a>
-<span class="sourceLineNo">5639</span>      TEST_UTIL.getConfiguration(), rss, null);<a name="line.5639"></a>
-<span class="sourceLineNo">5640</span><a name="line.5640"></a>
-<span class="sourceLineNo">5641</span>    verify(wal, times(1)).append((HRegionInfo)any(), (WALKeyImpl)any()<a name="line.5641"></a>
-<span class="sourceLineNo">5642</span>      , editCaptor.capture(), anyBoolean());<a name="line.5642"></a>
+<span class="sourceLineNo">5562</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5562"></a>
+<span class="sourceLineNo">5563</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5563"></a>
+<span class="sourceLineNo">5564</span><a name="line.5564"></a>
+<span class="sourceLineNo">5565</span>    Put put = new Put(Bytes.toBytes("199996"));<a name="line.5565"></a>
+<span class="sourceLineNo">5566</span>    put.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5566"></a>
+<span class="sourceLineNo">5567</span>    region.put(put);<a name="line.5567"></a>
+<span class="sourceLineNo">5568</span>    Put put2 = new Put(Bytes.toBytes("199995"));<a name="line.5568"></a>
+<span class="sourceLineNo">5569</span>    put2.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5569"></a>
+<span class="sourceLineNo">5570</span>    region.put(put2);<a name="line.5570"></a>
+<span class="sourceLineNo">5571</span><a name="line.5571"></a>
+<span class="sourceLineNo">5572</span>    // Create a reverse scan<a name="line.5572"></a>
+<span class="sourceLineNo">5573</span>    Scan scan = new Scan(Bytes.toBytes("199996"));<a name="line.5573"></a>
+<span class="sourceLineNo">5574</span>    scan.setReversed(true);<a name="line.5574"></a>
+<span class="sourceLineNo">5575</span>    RegionScannerImpl scanner = region.getScanner(scan);<a name="line.5575"></a>
+<span class="sourceLineNo">5576</span><a name="line.5576"></a>
+<span class="sourceLineNo">5577</span>    // Put a lot of cells that have sequenceIDs grater than the readPt of the reverse scan<a name="line.5577"></a>
+<span class="sourceLineNo">5578</span>    for (int i = 100000; i &lt; 200000; i++) {<a name="line.5578"></a>
+<span class="sourceLineNo">5579</span>      Put p = new Put(Bytes.toBytes("" + i));<a name="line.5579"></a>
+<span class="sourceLineNo">5580</span>      p.addColumn(cf1, col, Bytes.toBytes("" + i));<a name="line.5580"></a>
+<span class="sourceLineNo">5581</span>      region.put(p);<a name="line.5581"></a>
+<span class="sourceLineNo">5582</span>    }<a name="line.5582"></a>
+<span class="sourceLineNo">5583</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5583"></a>
+<span class="sourceLineNo">5584</span>    boolean hasNext;<a name="line.5584"></a>
+<span class="sourceLineNo">5585</span>    do {<a name="line.5585"></a>
+<span class="sourceLineNo">5586</span>      hasNext = scanner.next(currRow);<a name="line.5586"></a>
+<span class="sourceLineNo">5587</span>    } while (hasNext);<a name="line.5587"></a>
+<span class="sourceLineNo">5588</span><a name="line.5588"></a>
+<span class="sourceLineNo">5589</span>    assertEquals(2, currRow.size());<a name="line.5589"></a>
+<span class="sourceLineNo">5590</span>    assertEquals("199996", Bytes.toString(currRow.get(0).getRowArray(),<a name="line.5590"></a>
+<span class="sourceLineNo">5591</span>      currRow.get(0).getRowOffset(), currRow.get(0).getRowLength()));<a name="line.5591"></a>
+<span class="sourceLineNo">5592</span>    assertEquals("199995", Bytes.toString(currRow.get(1).getRowArray(),<a name="line.5592"></a>
+<span class="sourceLineNo">5593</span>      currRow.get(1).getRowOffset(), currRow.get(1).getRowLength()));<a name="line.5593"></a>
+<span class="sourceLineNo">5594</span>  }<a name="line.5594"></a>
+<span class="sourceLineNo">5595</span><a name="line.5595"></a>
+<span class="sourceLineNo">5596</span>  @Test<a name="line.5596"></a>
+<span class="sourceLineNo">5597</span>  public void testWriteRequestsCounter() throws IOException {<a name="line.5597"></a>
+<span class="sourceLineNo">5598</span>    byte[] fam = Bytes.toBytes("info");<a name="line.5598"></a>
+<span class="sourceLineNo">5599</span>    byte[][] families = { fam };<a name="line.5599"></a>
+<span class="sourceLineNo">5600</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.5600"></a>
+<span class="sourceLineNo">5601</span><a name="line.5601"></a>
+<span class="sourceLineNo">5602</span>    Assert.assertEquals(0L, region.getWriteRequestsCount());<a name="line.5602"></a>
+<span class="sourceLineNo">5603</span><a name="line.5603"></a>
+<span class="sourceLineNo">5604</span>    Put put = new Put(row);<a name="line.5604"></a>
+<span class="sourceLineNo">5605</span>    put.addColumn(fam, fam, fam);<a name="line.5605"></a>
+<span class="sourceLineNo">5606</span><a name="line.5606"></a>
+<span class="sourceLineNo">5607</span>    Assert.assertEquals(0L, region.getWriteRequestsCount());<a name="line.5607"></a>
+<span class="sourceLineNo">5608</span>    region.put(put);<a name="line.5608"></a>
+<span class="sourceLineNo">5609</span>    Assert.assertEquals(1L, region.getWriteRequestsCount());<a name="line.5609"></a>
+<span class="sourceLineNo">5610</span>    region.put(put);<a name="line.5610"></a>
+<span class="sourceLineNo">5611</span>    Assert.assertEquals(2L, region.getWriteRequestsCount());<a name="line.5611"></a>
+<span class="sourceLineNo">5612</span>    region.put(put);<a name="line.5612"></a>
+<span class="sourceLineNo">5613</span>    Assert.assertEquals(3L, region.getWriteRequestsCount());<a name="line.5613"></a>
+<span class="sourceLineNo">5614</span><a name="line.5614"></a>
+<span class="sourceLineNo">5615</span>    region.delete(new Delete(row));<a name="line.5615"></a>
+<span class="sourceLineNo">5616</span>    Assert.assertEquals(4L, region.getWriteRequestsCount());<a name="line.5616"></a>
+<span class="sourceLineNo">5617</span>  }<a name="line.5617"></a>
+<span class="sourceLineNo">5618</span><a name="line.5618"></a>
+<span class="sourceLineNo">5619</span>  @Test<a name="line.5619"></a>
+<span class="sourceLineNo">5620</span>  public void testOpenRegionWrittenToWAL() throws Exception {<a name="line.5620"></a>
+<span class="sourceLineNo">5621</span>    final ServerName serverName = ServerName.valueOf(name.getMethodName(), 100, 42);<a name="line.5621"></a>
+<span class="sourceLineNo">5622</span>    final RegionServerServices rss = spy(TEST_UTIL.createMockRegionServerService(serverName));<a name="line.5622"></a>
+<span class="sourceLineNo">5623</span><a name="line.5623"></a>
+<span class="sourceLineNo">5624</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.5624"></a>
+<span class="sourceLineNo">5625</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.5625"></a>
+<span class="sourceLineNo">5626</span>    htd.addFamily(new HColumnDescriptor(fam2));<a name="line.5626"></a>
+<span class="sourceLineNo">5627</span><a name="line.5627"></a>
+<span class="sourceLineNo">5628</span>    HRegionInfo hri = new HRegionInfo(htd.getTableName(),<a name="line.5628"></a>
+<span class="sourceLineNo">5629</span>      HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY);<a name="line.5629"></a>
+<span class="sourceLineNo">5630</span><a name="line.5630"></a>
+<span class="sourceLineNo">5631</span>    // open the region w/o rss and wal and flush some files<a name="line.5631"></a>
+<span class="sourceLineNo">5632</span>    region =<a name="line.5632"></a>
+<span class="sourceLineNo">5633</span>         HBaseTestingUtility.createRegionAndWAL(hri, TEST_UTIL.getDataTestDir(), TEST_UTIL<a name="line.5633"></a>
+<span class="sourceLineNo">5634</span>             .getConfiguration(), htd);<a name="line.5634"></a>
+<span class="sourceLineNo">5635</span>    assertNotNull(region);<a name="line.5635"></a>
+<span class="sourceLineNo">5636</span><a name="line.5636"></a>
+<span class="sourceLineNo">5637</span>    // create a file in fam1 for the region before opening in OpenRegionHandler<a name="line.5637"></a>
+<span class="sourceLineNo">5638</span>    region.put(new Put(Bytes.toBytes("a")).addColumn(fam1, fam1, fam1));<a name="line.5638"></a>
+<span class="sourceLineNo">5639</span>    region.flush(true);<a name="line.5639"></a>
+<span class="sourceLineNo">5640</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.5640"></a>
+<span class="sourceLineNo">5641</span><a name="line.5641"></a>
+<span class="sourceLineNo">5642</span>    ArgumentCaptor&lt;WALEdit&gt; editCaptor = ArgumentCaptor.forClass(WALEdit.class);<a name="line.5642"></a>
 <span class="sourceLineNo">5643</span><a name="line.5643"></a>
-<span class="sourceLineNo">5644</span>    WALEdit edit = editCaptor.getValue();<a name="line.5644"></a>
-<span class="sourceLineNo">5645</span>    assertNotNull(edit);<a name="line.5645"></a>
-<span class="sourceLineNo">5646</span>    assertNotNull(edit.getCells());<a name="line.5646"></a>
-<span class="sourceLineNo">5647</span>    assertEquals(1, edit.getCells().size());<a name="line.5647"></a>
-<span class="sourceLineNo">5648</span>    RegionEventDescriptor desc = WALEdit.getRegionEventDescriptor(edit.getCells().get(0));<a name="line.5648"></a>
-<span class="sourceLineNo">5649</span>    assertNotNull(desc);<a name="line.5649"></a>
+<span class="sourceLineNo">5644</span>    // capture append() calls<a name="line.5644"></a>
+<span class="sourceLineNo">5645</span>    WAL wal = mockWAL();<a name="line.5645"></a>
+<span class="sourceLineNo">5646</span>    when(rss.getWAL((HRegionInfo) any())).thenReturn(wal);<a name="line.5646"></a>
+<span class="sourceLineNo">5647</span><a name="line.5647"></a>
+<span class="sourceLineNo">5648</span>    region = HRegion.openHRegion(hri, htd, rss.getWAL(hri),<a name="line.5648"></a>
+<span class="sourceLineNo">5649</span>      TEST_UTIL.getConfiguration(), rss, null);<a name="line.5649"></a>
 <span class="sourceLineNo">5650</span><a name="line.5650"></a>
-<span class="sourceLineNo">5651</span>    LOG.info("RegionEventDescriptor from WAL: " + desc);<a name="line.5651"></a>
-<span class="sourceLineNo">5652</span><a name="line.5652"></a>
-<span class="sourceLineNo">5653</span>    assertEquals(RegionEventDescriptor.EventType.REGION_OPEN, desc.getEventType());<a name="line.5653"></a>
-<span class="sourceLineNo">5654</span>    assertTrue(Bytes.equals(desc.getTableName().toByteArray(), htd.getTableName().toBytes()));<a name="line.5654"></a>
-<span class="sourceLineNo">5655</span>    assertTrue(Bytes.equals(desc.getEncodedRegionName().toByteArray(),<a name="line.5655"></a>
-<span class="sourceLineNo">5656</span>      hri.getEncodedNameAsBytes()));<a name="line.5656"></a>
-<span class="sourceLineNo">5657</span>    assertTrue(desc.getLogSequenceNumber() &gt; 0);<a name="line.5657"></a>
-<span class="sourceLineNo">5658</span>    assertEquals(serverName, ProtobufUtil.toServerName(desc.getServer()));<a name="line.5658"></a>
-<span class="sourceLineNo">5659</span>    assertEquals(2, desc.getStoresCount());<a name="line.5659"></a>
+<span class="sourceLineNo">5651</span>    verify(wal, times(1)).append((HRegionInfo)any(), (WALKeyImpl)any()<a name="line.5651"></a>
+<span class="sourceLineNo">5652</span>      , editCaptor.capture(), anyBoolean());<a name="line.5652"></a>
+<span class="sourceLineNo">5653</span><a name="line.5653"></a>
+<span class="sourceLineNo">5654</span>    WALEdit edit = editCaptor.getValue();<a name="line.5654"></a>
+<span class="sourceLineNo">5655</span>    assertNotNull(edit);<a name="line.5655"></a>
+<span class="sourceLineNo">5656</span>    assertNotNull(edit.getCells());<a name="line.5656"></a>
+<span class="sourceLineNo">5657</span>    assertEquals(1, edit.getCells().size());<a name="line.5657"></a>
+<span class="sourceLineNo">5658</span>    RegionEventDescriptor desc = WALEdit.getRegionEventDescriptor(edit.getCells().get(0));<a name="line.5658"></a>
+<span class="sourceLineNo">5659</span>    assertNotNull(desc);<a name="line.5659"></a>
 <span class="sourceLineNo">5660</span><a name="line.5660"></a>
-<span class="sourceLineNo">5661</span>    StoreDescriptor store = desc.getStores(0);<a name="line.5661"></a>
-<span class="sourceLineNo">5662</span>    assertTrue(Bytes.equals(store.getFamilyName().toByteArray(), fam1));<a name="line.5662"></a>
-<span class="sourceLineNo">5663</span>    assertEquals(store.getStoreHomeDir(), Bytes.toString(fam1));<a name="line.5663"></a>
-<span class="sourceLineNo">5664</span>    assertEquals(1, store.getStoreFileCount()); // 1store file<a name="line.5664"></a>
-<span class="sourceLineNo">5665</span>    assertFalse(store.getStoreFile(0).contains("/")); // ensure path is relative<a name="line.5665"></a>
-<span class="sourceLineNo">5666</span><a name="line.5666"></a>
-<span class="sourceLineNo">5667</span>    store = desc.getStores(1);<a name="line.5667"></a>
-<span class="sourceLineNo">5668</span>    assertTrue(Bytes.equals(store.getFamilyName().toByteArray(), fam2));<a name="line.5668"></a>
-<span class="sourceLineNo">5669</span>    assertEquals(store.getStoreHomeDir(), Bytes.toString(fam2));<a name="line.5669"></a>
-<span class="sourceLineNo">5670</span>    assertEquals(0, store.getStoreFileCount()); // no store files<a name="line.5670"></a>
-<span class="sourceLineNo">5671</span>  }<a name="line.5671"></a>
-<span class="sourceLineNo">5672</span><a name="line.5672"></a>
-<span class="sourceLineNo">5673</span>  // Helper for test testOpenRegionWrittenToWALForLogReplay<a name="line.5673"></a>
-<span class="sourceLineNo">5674</span>  static class HRegionWithSeqId extends HRegion {<a name="line.5674"></a>
-<span class="sourceLineNo">5675</span>    public HRegionWithSeqId(final Path tableDir, final WAL wal, final FileSystem fs,<a name="line.5675"></a>
-<span class="sourceLineNo">5676</span>        final Configuration confParam, final RegionInfo regionInfo,<a name="line.5676"></a>
-<span class="sourceLineNo">5677</span>        final TableDescriptor htd, final RegionServerServices rsServices) {<a name="line.5677"></a>
-<span class="sourceLineNo">5678</span>      super(tableDir, wal, fs, confParam, regionInfo, htd, rsServices);<a name="line.5678"></a>
-<span class="sourceLineNo">5679</span>    }<a name="line.5679"></a>
-<span class="sourceLineNo">5680</span>    @Override<a name="line.5680"></a>
-<span class="sourceLineNo">5681</span>    protected long getNextSequenceId(WAL wal) throws IOException {<a name="line.5681"></a>
-<span class="sourceLineNo">5682</span>      return 42;<a name="line.5682"></a>
-<span class="sourceLineNo">5683</span>    }<a name="line.5683"></a>
-<span class="sourceLineNo">5684</span>  }<a name="line.5684"></a>
-<span class="sourceLineNo">5685</span><a name="line.5685"></a>
-<span class="sourceLineNo">5686</span>  @Test<a name="line.5686"></a>
-<span class="sourceLineNo">5687</span>  public void testFlushedFileWithNoTags() throws Exception {<a name="line.5687"></a>
-<span class="sourceLineNo">5688</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.5688"></a>
-<span class="sourceLineNo">5689</span>    HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.5689"></a>
-<span class="sourceLineNo">5690</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.5690"></a>
-<span class="sourceLineNo">5691</span>    HRegionInfo info = new HRegionInfo(tableName, null, null, false);<a name="line.5691"></a>
-<span class="sourceLineNo">5692</span>    Path path = TEST_UTIL.getDataTestDir(getClass().getSimpleName());<a name="line.5692"></a>
-<span class="sourceLineNo">5693</span>    region = HBaseTestingUtility.createRegionAndWAL(info, path, TEST_UTIL.getConfiguration(), htd);<a name="line.5693"></a>
-<span class="sourceLineNo">5694</span>    Put put = new Put(Bytes.toBytes("a-b-0-0"));<a name="line.5694"></a>
-<span class="sourceLineNo">5695</span>    put.addColumn(fam1, qual1, Bytes.toBytes("c1-value"));<a name="line.5695"></a>
-<span class="sourceLineNo">5696</span>    region.put(put);<a name="line.5696"></a>
-<span class="sourceLineNo">5697</span>    region.flush(true);<a name="line.5697"></a>
-<span class="sourceLineNo">5698</span>    HStore store = region.getStore(fam1);<a name="line.5698"></a>
-<span class="sourceLineNo">5699</span>    Collection&lt;HStoreFile&gt; storefiles = store.getStorefiles();<a name="line.5699"></a>
-<span class="sourceLineNo">5700</span>    for (HStoreFile sf : storefiles) {<a name="line.5700"></a>
-<span class="sourceLineNo">5701</span>      assertFalse("Tags should not be present "<a name="line.5701"></a>
-<span class="sourceLineNo">5702</span>          ,sf.getReader().getHFileReader().getFileContext().isIncludesTags());<a name="line.5702"></a>
-<span class="sourceLineNo">5703</span>    }<a name="line.5703"></a>
-<span class="sourceLineNo">5704</span>  }<a name="line.5704"></a>
-<span class="sourceLineNo">5705</span><a name="line.5705"></a>
-<span class="sourceLineNo">5706</span>  /**<a name="line.5706"></a>
-<span class="sourceLineNo">5707</span>   * Utility method to setup a WAL mock.<a name="line.5707"></a>
-<span class="sourceLineNo">5708</span>   * Needs to do the bit where we close latch on the WALKeyImpl on append else test hangs.<a name="line.5708"></a>
-<span class="sourceLineNo">5709</span>   * @return a mock WAL<a name="line.5709"></a>
-<span class="sourceLineNo">5710</span>   * @throws IOException<a name="line.5710"></a>
-<span class="sourceLineNo">5711</span>   */<a name="line.5711"></a>
-<span class="sourceLineNo">5712</span>  private WAL mockWAL() throws IOException {<a name="line.5712"></a>
-<span class="sourceLineNo">5713</span>    WAL wal = mock(WAL.class);<a name="line.5713"></a>
-<span class="sourceLineNo">5714</span>    Mockito.when(wal.append((HRegionInfo)Mockito.any(),<a name="line.5714"></a>
-<span class="sourceLineNo">5715</span>        (WALKeyImpl)Mockito.any(), (WALEdit)Mockito.any(), Mockito.anyBoolean())).<a name="line.5715"></a>
-<span class="sourceLineNo">5716</span>      thenAnswer(new Answer&lt;Long&gt;() {<a name="line.5716"></a>
-<span class="sourceLineNo">5717</span>        @Override<a name="line.5717"></a>
-<span class="sourceLineNo">5718</span>        public Long answer(InvocationOnMock invocation) throws Throwable {<a name="line.5718"></a>
-<span class="sourceLineNo">5719</span>          WALKeyImpl key = invocation.getArgument(1);<a name="line.5719"></a>
-<span class="sourceLineNo">5720</span>          MultiVersionConcurrencyControl.WriteEntry we = key.getMvcc().begin();<a name="line.5720"></a>
-<span class="sourceLineNo">5721</span>          key.setWriteEntry(we);<a name="line.5721"></a>
-<span class="sourceLineNo">5722</span>          return 1L;<a name="line.5722"></a>
-<span class="sourceLineNo">5723</span>        }<a name="line.5723"></a>
-<span class="sourceLineNo">5724</span><a name="line.5724"></a>
-<span class="sourceLineNo">5725</span>    });<a name="line.5725"></a>
-<span class="sourceLineNo">5726</span>    return wal;<a name="line.5726"></a>
-<span class="sourceLineNo">5727</span>  }<a name="line.5727"></a>
-<span class="sourceLineNo">5728</span><a name="line.5728"></a>
-<span class="sourceLineNo">5729</span>  @Test<a name="line.5729"></a>
-<span class="sourceLineNo">5730</span>  public void testCloseRegionWrittenToWAL() throws Exception {<a name="line.5730"></a>
-<span class="sourceLineNo">5731</span><a name="line.5731"></a>
-<span class="sourceLineNo">5732</span>    Path rootDir = new Path(dir + name.getMethodName());<a name="line.5732"></a>
-<span class="sourceLineNo">5733</span>    FSUtils.setRootDir(TEST_UTIL.getConfiguration(), rootDir);<a name="line.5733"></a>
+<span class="sourceLineNo">5661</span>    LOG.info("RegionEventDescriptor from WAL: " + desc);<a name="line.5661"></a>
+<span class="sourceLineNo">5662</span><a name="line.5662"></a>
+<span class="sourceLineNo">5663</span>    assertEquals(RegionEventDescriptor.EventType.REGION_OPEN, desc.getEventType());<a name="line.5663"></a>
+<span class="sourceLineNo">5664</span>    assertTrue(Bytes.equals(desc.getTableName().toByteArray(), htd.getTableName().toBytes()));<a name="line.5664"></a>
+<span class="sourceLineNo">5665</span>    assertTrue(Bytes.equals(desc.getEncodedRegionName().toByteArray(),<a name="line.5665"></a>
+<span class="sourceLineNo">5666</span>      hri.getEncodedNameAsBytes()));<a name="line.5666"></a>
+<span class="sourceLineNo">5667</span>    assertTrue(desc.getLogSequenceNumber() &gt; 0);<a name="line.5667"></a>
+<span class="sourceLineNo">5668</span>    assertEquals(serverName, ProtobufUtil.toServerName(desc.getServer()));<a name="line.5668"></a>
+<span class="sourceLineNo">5669</span>    assertEquals(2, desc.getStoresCount());<a name="line.5669"></a>
+<span class="sourceLineNo">5670</span><a name="line.5670"></a>
+<span class="sourceLineNo">5671</span>    StoreDescriptor store = desc.getStores(0);<a name="line.5671"></a>
+<span class="sourceLineNo">5672</span>    assertTrue(Bytes.equals(store.getFamilyName().toByteArray(), fam1));<a name="line.5672"></a>
+<span class="sourceLineNo">5673</span>    assertEquals(store.getStoreHomeDir(), Bytes.toString(fam1));<a name="line.5673"></a>
+<span class="sourceLineNo">5674</span>    assertEquals(1, store.getStoreFileCount()); // 1store file<a name="line.5674"></a>
+<span class="sourceLineNo">5675</span>    assertFalse(store.getStoreFile(0).contains("/")); // ensure path is relative<a name="line.5675"></a>
+<span class="sourceLineNo">5676</span><a name="line.5676"></a>
+<span class="sourceLineNo">5677</span>    store = desc.getStores(1);<a name="line.5677"></a>
+<span class="sourceLineNo">5678</span>    assertTrue(Bytes.equals(store.getFamilyName().toByteArray(), fam2));<a name="line.5678"></a>
+<span class="sourceLineNo">5679</span>    assertEquals(store.getStoreHomeDir(), Bytes.toString(fam2));<a name="line.5679"></a>
+<span class="sourceLineNo">5680</span>    assertEquals(0, store.getStoreFileCount()); // no store files<a name="line.5680"></a>
+<span class="sourceLineNo">5681</span>  }<a name="line.5681"></a>
+<span class="sourceLineNo">5682</span><a name="line.5682"></a>
+<span class="sourceLineNo">5683</span>  // Helper for test testOpenRegionWrittenToWALForLogReplay<a name="line.5683"></a>
+<span class="sourceLineNo">5684</span>  static class HRegionWithSeqId extends HRegion {<a name="line.5684"></a>
+<span class="sourceLineNo">5685</span>    public HRegionWithSeqId(final Path tableDir, final WAL wal, final FileSystem fs,<a name="line.5685"></a>
+<span class="sourceLineNo">5686</span>        final Configuration confParam, final RegionInfo regionInfo,<a name="line.5686"></a>
+<span class="sourceLineNo">5687</span>        final TableDescriptor htd, final RegionServerServices rsServices) {<a name="line.5687"></a>
+<span class="sourceLineNo">5688</span>      super(tableDir, wal, fs, confParam, regionInfo, htd, rsServices);<a name="line.5688"></a>
+<span class="sourceLineNo">5689</span>    }<a name="line.5689"></a>
+<span class="sourceLineNo">5690</span>    @Override<a name="line.5690"></a>
+<span class="sourceLineNo">5691</span>    protected long getNextSequenceId(WAL wal) throws IOException {<a name="line.5691"></a>
+<span class="sourceLineNo">5692</span>      return 42;<a name="line.5692"></a>
+<span class="sourceLineNo">5693</span>    }<a name="line.5693"></a>
+<span class="sourceLineNo">5694</span>  }<a name="line.5694"></a>
+<span class="sourceLineNo">5695</span><a name="line.5695"></a>
+<span class="sourceLineNo">5696</span>  @Test<a name="line.5696"></a>
+<span class="sourceLineNo">5697</span>  public void testFlushedFileWithNoTags() throws Exception {<a name="line.5697"></a>
+<span class="sourceLineNo">5698</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.5698"></a>
+<span class="sourceLineNo">5699</span>    HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.5699"></a>
+<span class="sourceLineNo">5700</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.5700"></a>
+<span class="sourceLineNo">5701</span>    HRegionInfo info = new HRegionInfo(tableName, null, null, false);<a name="line.5701"></a>
+<span class="sourceLineNo">5702</span>    Path path = TEST_UTIL.getDataTestDir(getClass().getSimpleName());<a name="line.5702"></a>
+<span class="sourceLineNo">5703</span>    region = HBaseTestingUtility.createRegionAndWAL(info, path, TEST_UTIL.getConfiguration(), htd);<a name="line.5703"></a>
+<span class="sourceLineNo">5704</span>    Put put = new Put(Bytes.toBytes("a-b-0-0"));<a name="line.5704"></a>
+<span class="sourceLineNo">5705</span>    put.addColumn(fam1, qual1, Bytes.toBytes("c1-value"));<a name="line.5705"></a>
+<span class="sourceLineNo">5706</span>    region.put(put);<a name="line.5706"></a>
+<span class="sourceLineNo">5707</span>    region.flush(true);<a name="line.5707"></a>
+<span class="sourceLineNo">5708</span>    HStore store = region.getStore(fam1);<a name="line.5708"></a>
+<span class="sourceLineNo">5709</span>    Collection&lt;HStoreFile&gt; storefiles = store.getStorefiles();<a name="line.5709"></a>
+<span class="sourceLineNo">5710</span>    for (HStoreFile sf : storefiles) {<a name="line.5710"></a>
+<span class="sourceLineNo">5711</span>      assertFalse("Tags should not be present "<a name="line.5711"></a>
+<span class="sourceLineNo">5712</span>          ,sf.getReader().getHFileReader().getFileContext().isIncludesTags());<a name="line.5712"></a>
+<span class="sourceLineNo">5713</span>    }<a name="line.5713"></a>
+<span class="sourceLineNo">5714</span>  }<a name="line.5714"></a>
+<span class="sourceLineNo">5715</span><a name="line.5715"></a>
+<span class="sourceLineNo">5716</span>  /**<a name="line.5716"></a>
+<span class="sourceLineNo">5717</span>   * Utility method to setup a WAL mock.<a name="line.5717"></a>
+<span class="sourceLineNo">5718</span>   * Needs to do the bit where we close latch on the WALKeyImpl on append else test hangs.<a name="line.5718"></a>
+<span class="sourceLineNo">5719</span>   * @return a mock WAL<a name="line.5719"></a>
+<span class="sourceLineNo">5720</span>   * @throws IOException<a name="line.5720"></a>
+<span class="sourceLineNo">5721</span>   */<a name="line.5721"></a>
+<span class="sourceLineNo">5722</span>  private WAL mockWAL() throws IOException {<a name="line.5722"></a>
+<span class="sourceLineNo">5723</span>    WAL wal = mock(WAL.class);<a name="line.5723"></a>
+<span class="sourceLineNo">5724</span>    Mockito.when(wal.append((HRegionInfo)Mockito.any(),<a name="line.5724"></a>
+<span class="sourceLineNo">5725</span>        (WALKeyImpl)Mockito.any(), (WALEdit)Mockito.any(), Mockito.anyBoolean())).<a name="line.5725"></a>
+<span class="sourceLineNo">5726</span>      thenAnswer(new Answer&lt;Long&gt;() {<a name="line.5726"></a>
+<span class="sourceLineNo">5727</span>        @Override<a name="line.5727"></a>
+<span class="sourceLineNo">5728</span>        public Long answer(InvocationOnMock invocation) throws Throwable {<a name="line.5728"></a>
+<span class="sourceLineNo">5729</span>          WALKeyImpl key = invocation.getArgument(1);<a name="line.5729"></a>
+<span class="sourceLineNo">5730</span>          MultiVersionConcurrencyControl.WriteEntry we = key.getMvcc().begin();<a name="line.5730"></a>
+<span class="sourceLineNo">5731</span>          key.setWriteEntry(we);<a name="line.5731"></a>
+<span class="sourceLineNo">5732</span>          return 1L;<a name="line.5732"></a>
+<span class="sourceLineNo">5733</span>        }<a name="line.5733"></a>
 <span class="sourceLineNo">5734</span><a name="line.5734"></a>
-<span class="sourceLineNo">5735</span>    final ServerName serverName = ServerName.valueOf("testCloseRegionWrittenToWAL", 100, 42);<a name="line.5735"></a>
-<span class="sourceLineNo">5736</span>    final RegionServerServices rss = spy(TEST_UTIL.createMockRegionServerService(serverName));<a name="line.5736"></a>
-<span class="sourceLineNo">5737</span><a name="line.5737"></a>
-<span class="sourceLineNo">5738</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.5738"></a>
-<span class="sourceLineNo">5739</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.5739"></a>
-<span class="sourceLineNo">5740</span>    htd.addFamily(new HColumnDescriptor(fam2));<a name="line.5740"></a>
+<span class="sourceLineNo">5735</span>    });<a name="line.5735"></a>
+<span class="sourceLineNo">5736</span>    return wal;<a name="line.5736"></a>
+<span class="sourceLineNo">5737</span>  }<a name="line.5737"></a>
+<span class="sourceLineNo">5738</span><a name="line.5738"></a>
+<span class="sourceLineNo">5739</span>  @Test<a name="line.5739"></a>
+<span class="sourceLineNo">5740</span>  public void testCloseRegionWrittenToWAL() throws Exception {<a name="line.5740"></a>
 <span class="sourceLineNo">5741</span><a name="line.5741"></a>
-<span class="sourceLineNo">5742</span>    final HRegionInfo hri = new HRegionInfo(htd.getTableName(),<a name="line.5742"></a>
-<span class="sourceLineNo">5743</span>      HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY);<a name="line.5743"></a>
+<span class="sourceLineNo">5742</span>    Path rootDir = new Path(dir + name.getMethodName());<a name="line.5742"></a>
+<span class="sourceLineNo">5743</span>    FSUtils.setRootDir(TEST_UTIL.getConfiguration(), rootDir);<a name="line.5743"></a>
 <span class="sourceLineNo">5744</span><a name="line.5744"></a>
-<span class="sourceLineNo">5745</span>    ArgumentCaptor&lt;WALEdit&gt; editCaptor = ArgumentCaptor.forClass(WALEdit.class);<a name="line.5745"></a>
-<span class="sourceLineNo">5746</span><a name="line.5746"></a>
-<span class="sourceLineNo">5747</span>    // capture append() calls<a name="line.5747"></a>
-<span class="sourceLineNo">5748</span>    WAL wal = mockWAL();<a name="line.5748"></a>
-<span class="sourceLineNo">5749</span>    when(rss.getWAL((HRegionInfo) any())).thenReturn(wal);<a name="line.5749"></a>
-<span class="sourceLineNo">5750</span><a name="line.5750"></a>
+<span class="sourceLineNo">5745</span>    final ServerName serverName = ServerName.valueOf("testCloseRegionWrittenToWAL", 100, 42);<a name="line.5745"></a>
+<span class="sourceLineNo">5746</span>    final RegionServerServices rss = spy(TEST_UTIL.createMockRegionServerService(serverName));<a name="line.5746"></a>
+<span class="sourceLineNo">5747</span><a name="line.5747"></a>
+<span class="sourceLineNo">5748</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.5748"></a>
+<span class="sourceLineNo">5749</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.5749"></a>
+<span class="sourceLineNo">5750</span>    htd.addFamily(new HColumnDescriptor(fam2));<a name="line.5750"></a>
 <span class="sourceLineNo">5751</span><a name="line.5751"></a>
-<span class="sourceLineNo">5752</span>    // create and then open a region first so that it can be closed later<a name="line.5752"></a>
-<span class="sourceLineNo">5753</span>    region = HRegion.createHRegion(hri, rootDir, TEST_UTIL.getConfiguration(), htd, rss.getWAL(hri));<a name="line.5753"></a>
-<span class="sourceLineNo">5754</span>    region = HRegion.openHRegion(hri, htd, rss.getWAL(hri),<a name="line.5754"></a>
-<span class="sourceLineNo">5755</span>      TEST_UTIL.getConfiguration(), rss, null);<a name="line.5755"></a>
+<span class="sourceLineNo">5752</span>    final HRegionInfo hri = new HRegionInfo(htd.getTableName(),<a name="line.5752"></a>
+<span class="sourceLineNo">5753</span>      HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY);<a name="line.5753"></a>
+<span class="sourceLineNo">5754</span><a name="line.5754"></a>
+<span class="sourceLineNo">5755</span>    ArgumentCaptor&lt;WALEdit&gt; editCaptor = ArgumentCaptor.forClass(WALEdit.class);<a name="line.5755"></a>
 <span class="sourceLineNo">5756</span><a name="line.5756"></a>
-<span class="sourceLineNo">5757</span>    // close the region<a name="line.5757"></a>
-<span class="sourceLineNo">5758</span>    region.close(false);<a name="line.5758"></a>
-<span class="sourceLineNo">5759</span><a name="line.5759"></a>
-<span class="sourceLineNo">5760</span>    // 2 times, one for region open, the other close region<a name="line.5760"></a>
-<span class="sourceLineNo">5761</span>    verify(wal, times(2)).append((HRegionInfo)any(), (WALKeyImpl)any(),<a name="line.5761"></a>
-<span class="sourceLineNo">5762</span>      editCaptor.capture(), anyBoolean());<a name="line.5762"></a>
-<span class="sourceLineNo">5763</span><a name="line.5763"></a>
-<span class="sourceLineNo">5764</span>    WALEdit edit = editCaptor.getAllValues().get(1);<a name="line.5764"></a>
-<span class="sourceLineNo">5765</span>    assertNotNull(edit);<a name="line.5765"></a>
-<span class="sourceLineNo">5766</span>    assertNotNull(edit.getCells());<a name="line.5766"></a>
-<span class="sourceLineNo">5767</span>    assertEquals(1, edit.getCells().size());<a name="line.5767"></a>
-<span class="sourceLineNo">5768</span>    RegionEventDescriptor desc = WALEdit.getRegionEventDescriptor(edit.getCells().get(0));<a name="line.5768"></a>
-<span class="sourceLineNo">5769</span>    assertNotNull(desc);<a name="line.5769"></a>
-<span class="sourceLineNo">5770</span><a name="line.5770"></a>
-<span class="sourceLineNo">5771</span>    LOG.info("RegionEventDescriptor from WAL: " + desc);<a name="line.5771"></a>
-<span class="sourceLineNo">5772</span><a name="line.5772"></a>
-<span class="sourceLineNo">5773</span>    assertEquals(RegionEventDescriptor.EventType.REGION_CLOSE, desc.getEventType());<a name="line.5773"></a>
-<span class="sourceLineNo">5774</span>    assertTrue(Bytes.equals(desc.getTableName().toByteArray(), htd.getTableName().toBytes()));<a name="line.5774"></a>
-<span class="sourceLineNo">5775</span>    assertTrue(Bytes.equals(desc.getEncodedRegionName().toByteArray(),<a name="line.5775"></a>
-<span class="sourceLineNo">5776</span>      hri.getEncodedNameAsBytes()));<a name="line.5776"></a>
-<span class="sourceLineNo">5777</span>    assertTrue(desc.getLogSequenceNumber() &gt; 0);<a name="line.5777"></a>
-<span class="sourceLineNo">5778</span>    assertEquals(serverName, ProtobufUtil.toServerName(desc.getServer()));<a name="line.5778"></a>
-<span class="sourceLineNo">5779</span>    assertEquals(2, desc.getStoresCount());<a name="line.5779"></a>
+<span class="sourceLineNo">5757</span>    // capture append() calls<a name="line.5757"></a>
+<span class="sourceLineNo">5758</span>    WAL wal = mockWAL();<a name="line.5758"></a>
+<span class="sourceLineNo">5759</span>    when(rss.getWAL((HRegionInfo) any())).thenReturn(wal);<a name="line.5759"></a>
+<span class="sourceLineNo">5760</span><a name="line.5760"></a>
+<span class="sourceLineNo">5761</span><a name="line.5761"></a>
+<span class="sourceLineNo">5762</span>    // create and then open a region first so that it can be closed later<a name="line.5762"></a>
+<span class="sourceLineNo">5763</span>    region = HRegion.createHRegion(hri, rootDir, TEST_UTIL.getConfiguration(), htd, rss.getWAL(hri));<a name="line.5763"></a>
+<span class="sourceLineNo">5764</span>    region = HRegion.openHRegion(hri, htd, rss.getWAL(hri),<a name="line.5764"></a>
+<span class="sourceLineNo">5765</span>      TEST_UTIL.getConfiguration(), rss, null);<a name="line.5765"></a>
+<span class="sourceLineNo">5766</span><a name="line.5766"></a>
+<span class="sourceLineNo">5767</span>    // close the region<a name="line.5767"></a>
+<span class="sourceLineNo">5768</span>    region.close(false);<a name="line.5768"></a>
+<span class="sourceLineNo">5769</span><a name="line.5769"></a>
+<span class="sourceLineNo">5770</span>    // 2 times, one for region open, the other close region<a name="line.5770"></a>
+<span class="sourceLineNo">5771</span>    verify(wal, times(2)).append((HRegionInfo)any(), (WALKeyImpl)any(),<a name="line.5771"></a>
+<span class="sourceLineNo">5772</span>      editCaptor.capture(), anyBoolean());<a name="line.5772"></a>
+<span class="sourceLineNo">5773</span><a name="line.5773"></a>
+<span class="sourceLineNo">5774</span>    WALEdit edit = editCaptor.getAllValues().get(1);<a name="line.5774"></a>
+<span class="sourceLineNo">5775</span>    assertNotNull(edit);<a name="line.5775"></a>
+<span class="sourceLineNo">5776</span>    assertNotNull(edit.getCells());<a name="line.5776"></a>
+<span class="sourceLineNo">5777</span>    assertEquals(1, edit.getCells().size());<a name="line.5777"></a>
+<span class="sourceLineNo">5778</span>    RegionEventDescriptor desc = WALEdit.getRegionEventDescriptor(edit.getCells().get(0));<a name="line.5778"></a>
+<span class="sourceLineNo">5779</span>    assertNotNull(desc);<a name="line.5779"></a>
 <span class="sourceLineNo">5780</span><a name="line.5780"></a>
-<span class="sourceLineNo">5781</span>    StoreDescriptor store = desc.getStores(0);<a name="line.5781"></a>
-<span class="sourceLineNo">5782</span>    assertTrue(Bytes.equals(store.getFamilyName().toByteArray(), fam1));<a name="line.5782"></a>
-<span class="sourceLineNo">5783</span>    assertEquals(store.getStoreHomeDir(), Bytes.toString(fam1));<a name="line.5783"></a>
-<span class="sourceLineNo">5784</span>    assertEquals(0, store.getStoreFileCount()); // no store files<a name="line.5784"></a>
-<span class="sourceLineNo">5785</span><a name="line.5785"></a>
-<span class="sourceLineNo">5786</span>    store = desc.getStores(1);<a name="line.5786"></a>
-<span class="sourceLineNo">5787</span>    assertTrue(Bytes.equals(store.getFamilyName().toByteArray(), fam2));<a name="line.5787"></a>
-<span class="sourceLineNo">5788</span>    assertEquals(store.getStoreHomeDir(), Bytes.toString(fam2));<a name="line.5788"></a>
-<span class="sourceLineNo">5789</span>    assertEquals(0, store.getStoreFileCount()); // no store files<a name="line.5789"></a>
-<span class="sourceLineNo">5790</span>  }<a name="line.5790"></a>
-<span class="sourceLineNo">5791</span><a name="line.5791"></a>
-<span class="sourceLineNo">5792</span>  /**<a name="line.5792"></a>
-<span class="sourceLineNo">5793</span>   * Test RegionTooBusyException thrown when region is busy<a name="line.5793"></a>
-<span class="sourceLineNo">5794</span>   */<a name="line.5794"></a>
-<span class="sourceLineNo">5795</span>  @Test<a name="line.5795"></a>
-<span class="sourceLineNo">5796</span>  public void testRegionTooBusy() throws IOException {<a name="line.5796"></a>
-<span class="sourceLineNo">5797</span>    byte[] family = Bytes.toBytes("family");<a name="line.5797"></a>
-<span class="sourceLineNo">5798</span>    long defaultBusyWaitDuration = CONF.getLong("hbase.busy.wait.duration",<a name="line.5798"></a>
-<span class="sourceLineNo">5799</span>      HRegion.DEFAULT_BUSY_WAIT_DURATION);<a name="line.5799"></a>
-<span class="sourceLineNo">5800</span>    CONF.setLong("hbase.busy.wait.duration", 1000);<a name="line.5800"></a>
-<span class="sourceLineNo">5801</span>    region = initHRegion(tableName, method, CONF, family);<a name="line.5801"></a>
-<span class="sourceLineNo">5802</span>    final AtomicBoolean stopped = new AtomicBoolean(true);<a name="line.5802"></a>
-<span class="sourceLineNo">5803</span>    Thread t = new Thread(new Runnable() {<a name="line.5803"></a>
-<span class="sourceLineNo">5804</span>      @Override<a name="line.5804"></a>
-<span class="sourceLineNo">5805</span>      public void run() {<a name="line.5805"></a>
-<span class="sourceLineNo">5806</span>        try {<a name="line.5806"></a>
-<span class="sourceLineNo">5807</span>          region.lock.writeLock().lock();<a name="line.5807"></a>
-<span class="sourceLineNo">5808</span>          stopped.set(false);<a name="line.5808"></a>
-<span class="sourceLineNo">5809</span>          while (!stopped.get()) {<a name="line.5809"></a>
-<span class="sourceLineNo">5810</span>            Thread.sleep(100);<a name="line.5810"></a>
-<span class="sourceLineNo">5811</span>          }<a name="line.5811"></a>
-<span class="sourceLineNo">5812</span>        } catch (InterruptedException ie) {<a name="line.5812"></a>
-<span class="sourceLineNo">5813</span>        } finally {<a name="line.5813"></a>
-<span class="sourceLineNo">5814</span>          region.lock.writeLock().unlock();<a name="line.5814"></a>
-<span class="sourceLineNo">5815</span>        }<a name="line.5815"></a>
-<span class="sourceLineNo">5816</span>      }<a name="line.5816"></a>
-<span class="sourceLineNo">5817</span>    });<a name="line.5817"></a>
-<span class="sourceLineNo">5818</span>    t.start();<a name="line.5818"></a>
-<span class="sourceLineNo">5819</span>    Get get = new Get(row);<a name="line.5819"></a>
-<span class="sourceLineNo">5820</span>    try {<a name="line.5820"></a>
-<span class="sourceLineNo">5821</span>      while (stopped.get()) {<a name="line.5821"></a>
-<span class="sourceLineNo">5822</span>        Thread.sleep(100);<a name="line.5822"></a>
-<span class="sourceLineNo">5823</span>      }<a name="line.5823"></a>
-<span class="sourceLineNo">5824</span>      region.get(get);<a name="line.5824"></a>
-<span class="sourceLineNo">5825</span>      fail("Should throw RegionTooBusyException");<a name="line.5825"></a>
-<span class="sourceLineNo">5826</span>    } catch (InterruptedException ie) {<a name="line.5826"></a>
-<span class="sourceLineNo">5827</span>      fail("test interrupted");<a name="line.5827"></a>
-<span class="sourceLineNo">5828</span>    } catch (RegionTooBusyException e) {<a name="line.5828"></a>
-<span class="sourceLineNo">5829</span>      // Good, expected<a name="line.5829"></a>
-<span class="sourceLineNo">5830</span>    } finally {<a name="line.5830"></a>
-<span class="sourceLineNo">5831</span>      stopped.set(true);<a name="line.5831"></a>
-<span class="sourceLineNo">5832</span>      try {<a name="line.5832"></a>
-<span class="sourceLineNo">5833</span>        t.join();<a name="line.5833"></a>
-<span class="sourceLineNo">5834</span>      } catch (Throwable e) {<a name="line.5834"></a>
-<span class="sourceLineNo">5835</span>      }<a name="line.5835"></a>
-<span class="sourceLineNo">5836</span><a name="line.5836"></a>
-<span class="sourceLineNo">5837</span>      HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.5837"></a>
-<span class="sourceLineNo">5838</span>      region = null;<a name="line.5838"></a>
-<span class="sourceLineNo">5839</span>      CONF.setLong("hbase.busy.wait.duration", defaultBusyWaitDuration);<a name="line.5839"></a>
-<span class="sourceLineNo">5840</span>    }<a name="line.5840"></a>
-<span class="sourceLineNo">5841</span>  }<a name="line.5841"></a>
-<span class="sourceLineNo">5842</span><a name="line.5842"></a>
-<span class="sourceLineNo">5843</span>  @Test<a name="line.5843"></a>
-<span class="sourceLineNo">5844</span>  public void testCellTTLs() throws IOException {<a name="line.5844"></a>
-<span class="sourceLineNo">5845</span>    IncrementingEnvironmentEdge edge = new IncrementingEnvironmentEdge();<a name="line.5845"></a>
-<span class="sourceLineNo">5846</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.5846"></a>
-<span class="sourceLineNo">5847</span><a name="line.5847"></a>
-<span class="sourceLineNo">5848</span>    final byte[] row = Bytes.toBytes("testRow");<a name="line.5848"></a>
-<span class="sourceLineNo">5849</span>    final byte[] q1 = Bytes.toBytes("q1");<a name="line.5849"></a>
-<span class="sourceLineNo">5850</span>    final byte[] q2 = Bytes.toBytes("q2");<a name="line.5850"></a>
-<span class="sourceLineNo">5851</span>    final byte[] q3 = Bytes.toBytes("q3");<a name="line.5851"></a>
-<span class="sourceLineNo">5852</span>    final byte[] q4 = Bytes.toBytes("q4");<a name="line.5852"></a>
-<span class="sourceLineNo">5853</span><a name="line.5853"></a>
-<span class="sourceLineNo">5854</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.5854"></a>
-<span class="sourceLineNo">5855</span>    HColumnDescriptor hcd = new HColumnDescriptor(fam1);<a name="line.5855"></a>
-<span class="sourceLineNo">5856</span>    hcd.setTimeToLive(10); // 10 seconds<a name="line.5856"></a>
-<span class="sourceLineNo">5857</span>    htd.addFamily(hcd);<a name="line.5857"></a>
-<span class="sourceLineNo">5858</span><a name="line.5858"></a>
-<span class="sourceLineNo">5859</span>    Configuration conf = new Configuration(TEST_UTIL.getConfiguration());<a name="line.5859"></a>
-<span class="sourceLineNo">5860</span>    conf.setInt(HFile.FORMAT_VERSION_KEY, HFile.MIN_FORMAT_VERSION_WITH_TAGS);<a name="line.5860"></a>
-<span class="sourceLineNo">5861</span><a name="line.5861"></a>
-<span class="sourceLineNo">5862</span>    region = HBaseTestingUtility.createRegionAndWAL(new HRegionInfo(htd.getTableName(),<a name="line.5862"></a>
-<span class="sourceLineNo">5863</span>            HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY),<a name="line.5863"></a>
-<span class="sourceLineNo">5864</span>        TEST_UTIL.getDataTestDir(), conf, htd);<a name="line.5864"></a>
-<span class="sourceLineNo">5865</span>    assertNotNull(region);<a name="line.5865"></a>
-<span class="sourceLineNo">5866</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.5866"></a>
-<span class="sourceLineNo">5867</span>    // Add a cell that will expire in 5 seconds via cell TTL<a name="line.5867"></a>
-<span class="sourceLineNo">5868</span>    region.put(new Put(row).add(new KeyValue(row, fam1, q1, now,<a name="line.5868"></a>
-<span class="sourceLineNo">5869</span>      HConstants.EMPTY_BYTE_ARRAY, new ArrayBackedTag[] {<a name="line.5869"></a>
-<span class="sourceLineNo">5870</span>        // TTL tags specify ts in milliseconds<a name="line.5870"></a>
-<span class="sourceLineNo">5871</span>        new ArrayBackedTag(TagType.TTL_TAG_TYPE, Bytes.toBytes(5000L)) })));<a name="line.5871"></a>
-<span class="sourceLineNo">5872</span>    // Add a cell that will expire after 10 seconds via family setting<a name="line.5872"></a>
-<span class="sourceLineNo">5873</span>    region.put(new Put(row).addColumn(fam1, q2, now, HConstants.EMPTY_BYTE_ARRAY));<a name="line.5873"></a>
-<span class="sourceLineNo">5874</span>    // Add a cell that will expire in 15 seconds via cell TTL<a name="line.5874"></a>
-<span class="sourceLineNo">5875</span>    region.put(new Put(row).add(new KeyValue(row, fam1, q3, now + 10000 - 1,<a name="line.5875"></a>
-<span class="sourceLineNo">5876</span>      HConstants.EMPTY_BYTE_ARRAY, new ArrayBackedTag[] {<a name="line.5876"></a>
-<span class="sourceLineNo">5877</span>        // TTL tags specify ts in milliseconds<a name="line.5877"></a>
-<span class="sourceLineNo">5878</span>        new ArrayBackedTag(TagType.TTL_TAG_TYPE, Bytes.toBytes(5000L)) })));<a name="line.5878"></a>
-<span class="sourceLineNo">5879</span>    // Add a cell that will expire in 20 seconds via family setting<a name="line.5879"></a>
-<span class="sourceLineNo">5880</span>    region.put(new Put(row).addColumn(fam1, q4, now + 10000 - 1, HConstants.EMPTY_BYTE_ARRAY));<a name="line.5880"></a>
-<span class="sourceLineNo">5881</span><a name="line.5881"></a>
-<span class="sourceLineNo">5882</span>    // Flush so we are sure store scanning gets this right<a name="line.5882"></a>
-<span class="sourceLineNo">5883</span>    region.flush(true);<a name="line.5883"></a>
-<span class="sourceLineNo">5884</span><a name="line.5884"></a>
-<span class="sourceLineNo">5885</span>    // A query at time T+0 should return all cells<a name="line.5885"></a>
-<span class="sourceLineNo">5886</span>    Result r = region.get(new Get(row));<a name="line.5886"></a>
-<span class="sourceLineNo">5887</span>    assertNotNull(r.getValue(fam1, q1));<a name="line.5887"></a>
-<span class="sourceLineNo">5888</span>    assertNotNull(r.getValue(fam1, q2));<a name="line.5888"></a>
-<span class="sourceLineNo">5889</span>    assertNotNull(r.getValue(fam1, q3));<a name="line.5889"></a>
-<span class="sourceLineNo">5890</span>    assertNotNull(r.getValue(fam1, q4));<a name="line.5890"></a>
+<span class="sourceLineNo">5781</span>    LOG.info("RegionEventDescriptor from WAL: " + desc);<a name="line.5781"></a>
+<span class="sourceLineNo">5782</span><a name="line.5782"></a>
+<span class="sourceLineNo">5783</span>    assertEquals(RegionEventDescriptor.EventType.REGION_CLOSE, desc.getEventType());<a name="line.5783"></a>
+<span class="sourceLineNo">5784</span>    assertTrue(Bytes.equals(desc.getTableName().toByteArray(), htd.getTableName().toBytes()));<a name="line.5784"></a>
+<span class="sourceLineNo">5785</span>    assertTrue(Bytes.equals(desc.getEncodedRegionName().toByteArray(),<a name="line.5785"></a>
+<span class="sourceLineNo">5786</span>      hri.getEncodedNameAsBytes()));<a name="line.5786"></a>
+<span class="sourceLineNo">5787</span>    assertTrue(desc.getLogSequenceNumber() &gt; 0);<a name="line.5787"></a>
+<span class="sourceLineNo">5788</span>    assertEquals(serverName, ProtobufUtil.toServerName(desc.getServer()));<a name="line.5788"></a>
+<span class="sourceLineNo">5789</span>    assertEquals(2, desc.getStoresCount());<a name="line.5789"></a>
+<span class="sourceLineNo">5790</span><a name="line.5790"></a>
+<span class="sourceLineNo">5791</span>    StoreDescriptor store = desc.getStores(0);<a name="line.5791"></a>
+<span class="sourceLineNo">5792</span>    assertTrue(Bytes.equals(store.getFamilyName().toByteArray(), fam1));<a name="line.5792"></a>
+<span class="sourceLineNo">5793</span>    assertEquals(store.getStoreHomeDir(), Bytes.toString(fam1));<a name="line.5793"></a>
+<span class="sourceLineNo">5794</span>    assertEquals(0, store.getStoreFileCount()); // no store files<a name="line.5794"></a>
+<span class="sourceLineNo">5795</span><a name="line.5795"></a>
+<span class="sourceLineNo">5796</span>    store = desc.getStores(1);<a name="line.5796"></a>
+<span class="sourceLineNo">5797</span>    assertTrue(Bytes.equals(store.getFamilyName().toByteArray(), fam2));<a name="line.5797"></a>
+<span class="sourceLineNo">5798</span>    assertEquals(store.getStoreHomeDir(), Bytes.toString(fam2));<a name="line.5798"></a>
+<span class="sourceLineNo">5799</span>    assertEquals(0, store.getStoreFileCount()); // no store files<a name="line.5799"></a>
+<span class="sourceLineNo">5800</span>  }<a name="line.5800"></a>
+<span class="sourceLineNo">5801</span><a name="line.5801"></a>
+<span class="sourceLineNo">5802</span>  /**<a name="line.5802"></a>
+<span class="sourceLineNo">5803</span>   * Test RegionTooBusyException thrown when region is busy<a name="line.5803"></a>
+<span class="sourceLineNo">5804</span>   */<a name="line.5804"></a>
+<span class="sourceLineNo">5805</span>  @Test<a name="line.5805"></a>
+<span class="sourceLineNo">5806</span>  public void testRegionTooBusy() throws IOException {<a name="line.5806"></a>
+<span class="sourceLineNo">5807</span>    byte[] family = Bytes.toBytes("family");<a name="line.5807"></a>
+<span class="sourceLineNo">5808</span>    long defaultBusyWaitDuration = CONF.getLong("hbase.busy.wait.duration",<a name="line.5808"></a>
+<span class="sourceLineNo">5809</span>      HRegion.DEFAULT_BUSY_WAIT_DURATION);<a name="line.5809"></a>
+<span class="sourceLineNo">5810</span>    CONF.setLong("hbase.busy.wait.duration", 1000);<a name="line.5810"></a>
+<span class="sourceLineNo">5811</span>    region = initHRegion(tableName, method, CONF, family);<a name="line.5811"></a>
+<span class="sourceLineNo">5812</span>    final AtomicBoolean stopped = new AtomicBoolean(true);<a name="line.5812"></a>
+<span class="sourceLineNo">5813</span>    Thread t = new Thread(new Runnable() {<a name="line.5813"></a>
+<span class="sourceLineNo">5814</span>      @Override<a name="line.5814"></a>
+<span class="sourceLineNo">5815</span>      public void run() {<a name="line.5815"></a>
+<span class="sourceLineNo">5816</span>        try {<a name="line.5816"></a>
+<span class="sourceLineNo">5817</span>          region.lock.writeLock().lock();<a name="line.5817"></a>
+<span class="sourceLineNo">5818</span>          stopped.set(false);<a name="line.5818"></a>
+<span class="sourceLineNo">5819</span>          while (!stopped.get()) {<a name="line.5819"></a>
+<span class="sourceLineNo">5820</span>            Thread.sleep(100);<a name="line.5820"></a>
+<span class="sourceLineNo">5821</span>          }<a name="line.5821"></a>
+<span class="sourceLineNo">5822</span>        } catch (InterruptedException ie) {<a name="line.5822"></a>
+<span class="sourceLineNo">5823</span>        } finally {<a name="line.5823"></a>
+<span class="sourceLineNo">5824</span>          region.lock.writeLock().unlock();<a name="line.5824"></a>
+<span class="sourceLineNo">5825</span>        }<a name="line.5825"></a>
+<span class="sourceLineNo">5826</span>      }<a name="line.5826"></a>
+<span class="sourceLineNo">5827</span>    });<a name="line.5827"></a>
+<span class="sourceLineNo">5828</span>    t.start();<a name="line.5828"></a>
+<span class="sourceLineNo">5829</span>    Get get = new Get(row);<a name="line.5829"></a>
+<span class="sourceLineNo">5830</span>    try {<a name="line.5830"></a>
+<span class="sourceLineNo">5831</span>      while (stopped.get()) {<a name="line.5831"></a>
+<span class="sourceLineNo">5832</span>        Thread.sleep(100);<a name="line.5832"></a>
+<span class="sourceLineNo">5833</span>      }<a name="line.5833"></a>
+<span class="sourceLineNo">5834</span>      region.get(get);<a name="line.5834"></a>
+<span class="sourceLineNo">5835</span>      fail("Should throw RegionTooBusyException");<a name="line.5835"></a>
+<span class="sourceLineNo">5836</span>    } catch (InterruptedException ie) {<a name="line.5836"></a>
+<span class="sourceLineNo">5837</span>      fail("test interrupted");<a name="line.5837"></a>
+<span class="sourceLineNo">5838</span>    } catch (RegionTooBusyException e) {<a name="line.5838"></a>
+<span class="sourceLineNo">5839</span>      // Good, expected<a name="line.5839"></a>
+<span class="sourceLineNo">5840</span>    } finally {<a name="line.5840"></a>
+<span class="sourceLineNo">5841</span>      stopped.set(true);<a name="line.5841"></a>
+<span class="sourceLineNo">5842</span>      try {<a name="line.5842"></a>
+<span class="sourceLineNo">5843</span>        t.join();<a name="line.5843"></a>
+<span class="sourceLineNo">5844</span>      } catch (Throwable e) {<a name="line.5844"></a>
+<span class="sourceLineNo">5845</span>      }<a name="line.5845"></a>
+<span class="sourceLineNo">5846</span><a name="line.5846"></a>
+<span class="sourceLineNo">5847</span>      HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.5847"></a>
+<span class="sourceLineNo">5848</span>      region = null;<a name="line.5848"></a>
+<span class="sourceLineNo">5849</span>      CONF.setLong("hbase.busy.wait.duration", defaultBusyWaitDuration);<a name="line.5849"></a>
+<span class="sourceLineNo">5850</span>    }<a name="line.5850"></a>
+<span class="sourceLineNo">5851</span>  }<a name="line.5851"></a>
+<span class="sourceLineNo">5852</span><a name="line.5852"></a>
+<span class="sourceLineNo">5853</span>  @Test<a name="line.5853"></a>
+<span class="sourceLineNo">5854</span>  public void testCellTTLs() throws IOException {<a name="line.5854"></a>
+<span class="sourceLineNo">5855</span>    IncrementingEnvironmentEdge edge = new IncrementingEnvironmentEdge();<a name="line.5855"></a>
+<span class="sourceLineNo">5856</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.5856"></a>
+<span class="sourceLineNo">5857</span><a name="line.5857"></a>
+<span class="sourceLineNo">5858</span>    final byte[] row = Bytes.toBytes("testRow");<a name="line.5858"></a>
+<span class="sourceLineNo">5859</span>    final byte[] q1 = Bytes.toBytes("q1");<a name="line.5859"></a>
+<span class="sourceLineNo">5860</span>    final byte[] q2 = Bytes.toBytes("q2");<a name="line.5860"></a>
+<span class="sourceLineNo">5861</span>    final byte[] q3 = Bytes.toBytes("q3");<a name="line.5861"></a>
+<span class="sourceLineNo">5862</span>    final byte[] q4 = Bytes.toBytes("q4");<a name="line.5862"></a>
+<span class="sourceLineNo">5863</span><a name="line.5863"></a>
+<span class="sourceLineNo">5864</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.5864"></a>
+<span class="sourceLineNo">5865</span>    HColumnDescriptor hcd = new HColumnDescriptor(fam1);<a name="line.5865"></a>
+<span class="sourceLineNo">5866</span>    hcd.setTimeToLive(10); // 10 seconds<a name="line.5866"></a>
+<span class="sourceLineNo">5867</span>    htd.addFamily(hcd);<a name="line.5867"></a>
+<span class="sourceLineNo">5868</span><a name="line.5868"></a>
+<span class="sourceLineNo">5869</span>    Configuration conf = new Configuration(TEST_UTIL.getConfiguration());<a name="line.5869"></a>
+<span class="sourceLineNo">5870</span>    conf.setInt(HFile.FORMAT_VERSION_KEY, HFile.MIN_FORMAT_VERSION_WITH_TAGS);<a name="line.5870"></a>
+<span class="sourceLineNo">5871</span><a name="line.5871"></a>
+<span class="sourceLineNo">5872</span>    region = HBaseTestingUtility.createRegionAndWAL(new HRegionInfo(htd.getTableName(),<a name="line.5872"></a>
+<span class="sourceLineNo">5873</span>            HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY),<a name="line.5873"></a>
+<span class="sourceLineNo">5874</span>        TEST_UTIL.getDataTestDir(), conf, htd);<a name="line.5874"></a>
+<span class="sourceLineNo">5875</span>    assertNotNull(region);<a name="line.5875"></a>
+<span class="sourceLineNo">5876</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.5876"></a>
+<span class="sourceLineNo">5877</span>    // Add a cell that will expire in 5 seconds via cell TTL<a name="line.5877"></a>
+<span class="sourceLineNo">5878</span>    region.put(new Put(row).add(new KeyValue(row, fam1, q1, now,<a name="line.5878"></a>
+<span class="sourceLineNo">5879</span>      HConstants.EMPTY_BYTE_ARRAY, new ArrayBackedTag[] {<a name="line.5879"></a>
+<span class="sourceLineNo">5880</span>        // TTL tags specify ts in milliseconds<a name="line.5880"></a>
+<span class="sourceLineNo">5881</span>        new ArrayBackedTag(TagType.TTL_TAG_TYPE, Bytes.toBytes(5000L)) })));<a name="line.5881"></a>
+<span class="sourceLineNo">5882</span>    // Add a cell that will expire after 10 seconds via family setting<a name="line.5882"></a>
+<span class="sourceLineNo">5883</span>    region.put(new Put(row).addColumn(fam1, q2, now, HConstants.EMPTY_BYTE_ARRAY));<a name="line.5883"></a>
+<span class="sourceLineNo">5884</span>    // Add a cell that will expire in 15 seconds via cell TTL<a name="line.5884"></a>
+<span class="sourceLineNo">5885</span>    region.put(new Put(row).add(new KeyValue(row, fam1, q3, now + 10000 - 1,<a name="line.5885"></a>
+<span class="sourceLineNo">5886</span>      HConstants.EMPTY_BYTE_ARRAY, new ArrayBackedTag[] {<a name="line.5886"></a>
+<span class="sourceLineNo">5887</span>        // TTL tags specify ts in milliseconds<a name="line.5887"></a>
+<span class="sourceLineNo">5888</span>        new ArrayBackedTag(TagType.TTL_TAG_TYPE, Bytes.toBytes(5000L)) })));<a name="line.5888"></a>
+<span class="sourceLineNo">5889</span>    // Add a cell that will expire in 20 seconds via family setting<a name="line.5889"></a>
+<span class="sourceLineNo">5890</span>    region.put(new Put(row).addColumn(fam1, q4, now + 10000 - 1, HConstants.EMPTY_BYTE_ARRAY));<a name="line.5890"></a>
 <span class="sourceLineNo">5891</span><a name="line.5891"></a>
-<span class="sourceLineNo">5892</span>    // Increment time to T+5 seconds<a name="line.5892"></a>
-<span class="sourceLineNo">5893</span>    edge.incrementTime(5000);<a name="line.5893"></a>
+<span class="sourceLineNo">5892</span>    // Flush so we are sure store scanning gets this right<a name="line.5892"></a>
+<span class="sourceLineNo">5893</span>    region.flush(true);<a name="line.5893"></a>
 <span class="sourceLineNo">5894</span><a name="line.5894"></a>
-<span class="sourceLineNo">5895</span>    r = region.get(new Get(row));<a name="line.5895"></a>
-<span class="sourceLineNo">5896</span>    assertNull(r.getValue(fam1, q1));<a name="line.5896"></a>
-<span class="sourceLineNo">5897</span>    assertNotNull(r.getValue(fam1, q2));<a name="line.5897"></a>
-<span class="sourceLineNo">5898</span>    assertNotNull(r.getValue(fam1, q3));<a name="line.5898"></a>
-<span class="sourceLineNo">5899</span>    assertNotNull(r.getValue(fam1, q4));<a name="line.5899"></a>
-<span class="sourceLineNo">5900</span><a name="line.5900"></a>
-<span class="sourceLineNo">5901</span>    // Increment time to T+10 seconds<a name="line.5901"></a>
-<span class="sourceLineNo">5902</span>    edge.incrementTime(5000);<a name="line.5902"></a>
-<span class="sourceLineNo">5903</span><a name="line.5903"></a>
-<span class="sourceLineNo">5904</span>    r = region.get(new Get(row));<a name="line.5904"></a>
-<span class="sourceLineNo">5905</span>    assertNull(r.getValue(fam1, q1));<a name="line.5905"></a>
-<span class="sourceLineNo">5906</span>    assertNull(r.getValue(fam1, q2));<a name="line.5906"></a>
-<span class="sourceLineNo">5907</span>    assertNotNull(r.getValue(fam1, q3));<a name="line.5907"></a>
-<span class="sourceLineNo">5908</span>    assertNotNull(r.getValue(fam1, q4));<a name="line.5908"></a>
-<span class="sourceLineNo">5909</span><a name="line.5909"></a>
-<span class="sourceLineNo">5910</span>    // Increment time to T+15 seconds<a name="line.5910"></a>
-<span class="sourceLineNo">5911</span>    edge.incrementTime(5000);<a name="line.5911"></a>
-<span class="sourceLineNo">5912</span><a name="line.5912"></a>
-<span class="sourceLineNo">5913</span>    r = region.get(new Get(row));<a name="line.5913"></a>
-<span class="sourceLineNo">5914</span>    assertNull(r.getValue(fam1, q1));<a name="line.5914"></a>
-<span class="sourceLineNo">5915</span>    assertNull(r.getValue(fam1, q2));<a name="line.5915"></a>
-<span class="sourceLineNo">5916</span>    assertNull(r.getValue(fam1, q3));<a name="line.5916"></a>
-<span class="sourceLineNo">5917</span>    assertNotNull(r.getValue(fam1, q4));<a name="line.5917"></a>
-<span class="sourceLineNo">5918</span><a name="line.5918"></a>
-<span class="sourceLineNo">5919</span>    // Increment time to T+20 seconds<a name="line.5919"></a>
-<span class="sourceLineNo">5920</span>    edge.incrementTime(10000);<a name="line.5920"></a>
-<span class="sourceLineNo">5921</span><a name="line.5921"></a>
-<span class="sourceLineNo">5922</span>    r = region.get(new Get(row));<a name="line.5922"></a>
-<span class="sourceLineNo">5923</span>    assertNull(r.getValue(fam1, q1));<a name="line.5923"></a>
-<span class="sourceLineNo">5924</span>    assertNull(r.getValue(fam1, q2));<a name="line.5924"></a>
-<span class="sourceLineNo">5925</span>    assertNull(r.getValue(fam1, q3));<a name="line.5925"></a>
-<span class="sourceLineNo">5926</span>    assertNull(r.getValue(fam1, q4));<a name="line.5926"></a>
-<span class="sourceLineNo">5927</span><a name="line.5927"></a>
-<span class="sourceLineNo">5928</span>    // Fun with disappearing increments<a name="line.5928"></a>
-<span class="sourceLineNo">5929</span><a name="line.5929"></a>
-<span class="sourceLineNo">5930</span>    // Start at 1<a name="line.5930"></a>
-<span class="sourceLineNo">5931</span>    region.put(new Put(row).addColumn(fam1, q1, Bytes.toBytes(1L)));<a name="line.5931"></a>
+<span class="sourceLineNo">5895</span>    // A query at time T+0 should return all cells<a name="line.5895"></a>
+<span class="sourceLineNo">5896</span>    Result r = region.get(new Get(row));<a name="line.5896"></a>
+<span class="sourceLineNo">5897</span>    assertNotNull(r.getValue(fam1, q1));<a name="line.5897"></a>
+<span class="sourceLineNo">5898</span>    assertNotNull(r.getValue(fam1, q2));<a name="line.5898"></a>
+<span class="sourceLineNo">5899</span>    assertNotNull(r.getValue(fam1, q3));<a name="line.5899"></a>
+<span class="sourceLineNo">5900</span>    assertNotNull(r.getValue(fam1, q4));<a name="line.5900"></a>
+<span class="sourceLineNo">5901</span><a name="line.5901"></a>
+<span class="sourceLineNo">5902</span>    // Increment time to T+5 seconds<a name="line.5902"></a>
+<span class="sourceLineNo">5903</span>    edge.incrementTime(5000);<a name="line.5903"></a>
+<span class="sourceLineNo">5904</span><a name="line.5904"></a>
+<span class="sourceLineNo">5905</span>    r = region.get(new Get(row));<a name="line.5905"></a>
+<span class="sourceLineNo">5906</span>    assertNull(r.getValue(fam1, q1));<a name="line.5906"></a>
+<span class="sourceLineNo">5907</span>    assertNotNull(r.getValue(fam1, q2));<a name="line.5907"></a>
+<span class="sourceLineNo">5908</span>    assertNotNull(r.getValue(fam1, q3));<a name="line.5908"></a>
+<span class="sourceLineNo">5909</span>    assertNotNull(r.getValue(fam1, q4));<a name="line.5909"></a>
+<span class="sourceLineNo">5910</span><a name="line.5910"></a>
+<span class="sourceLineNo">5911</span>    // Increment time to T+10 seconds<a name="line.5911"></a>
+<span class="sourceLineNo">5912</span>    edge.incrementTime(5000);<a name="line.5912"></a>
+<span class="sourceLineNo">5913</span><a name="line.5913"></a>
+<span class="sourceLineNo">5914</span>    r = region.get(new Get(row));<a name="line.5914"></a>
+<span class="sourceLineNo">5915</span>    assertNull(r.getValue(fam1, q1));<a name="line.5915"></a>
+<span class="sourceLineNo">5916</span>    assertNull(r.getValue(fam1, q2));<a name="line.5916"></a>
+<span class="sourceLineNo">5917</span>    assertNotNull(r.getValue(fam1, q3));<a name="line.5917"></a>
+<span class="sourceLineNo">5918</span>    assertNotNull(r.getValue(fam1, q4));<a name="line.5918"></a>
+<span class="sourceLineNo">5919</span><a name="line.5919"></a>
+<span class="sourceLineNo">5920</span>    // Increment time to T+15 seconds<a name="line.5920"></a>
+<span class="sourceLineNo">5921</span>    edge.incrementTime(5000);<a name="line.5921"></a>
+<span class="sourceLineNo">5922</span><a name="line.5922"></a>
+<span class="sourceLineNo">5923</span>    r = region.get(new Get(row));<a name="line.5923"></a>
+<span class="sourceLineNo">5924</span>    assertNull(r.getValue(fam1, q1));<a name="line.5924"></a>
+<span class="sourceLineNo">5925</span>    assertNull(r.getValue(fam1, q2));<a name="line.5925"></a>
+<span class="sourceLineNo">5926</span>    assertNull(r.getValue(fam1, q3));<a name="line.5926"></a>
+<span class="sourceLineNo">5927</span>    assertNotNull(r.getValue(fam1, q4));<a name="line.5927"></a>
+<span class="sourceLineNo">5928</span><a name="line.5928"></a>
+<span class="sourceLineNo">5929</span>    // Increment time to T+20 seconds<a name="line.5929"></a>
+<span class="sourceLineNo">5930</span>    edge.incrementTime(10000);<a name="line.5930"></a>
+<span class="sourceLineNo">5931</span><a name="line.5931"></a>
 <span class="sourceLineNo">5932</span>    r = region.get(new Get(row));<a name="line.5932"></a>
-<span class="sourceLineNo">5933</span>    byte[] val = r.getValue(fam1, q1);<a name="line.5933"></a>
-<span class="sourceLineNo">5934</span>    assertNotNull(val);<a name="line.5934"></a>
-<span class="sourceLineNo">5935</span>    assertEquals(1L, Bytes.toLong(val));<a name="line.5935"></a>
-<span class="sourceLineNo">5936</span><a name="line.5936"></a>
-<span class="sourceLineNo">5937</span>    // Increment with a TTL of 5 seconds<a name="line.5937"></a>
-<span class="sourceLineNo">5938</span>    Increment incr = new Increment(row).addColumn(fam1, q1, 1L);<a name="line.5938"></a>
-<span class="sourceLineNo">5939</span>    incr.setTTL(5000);<a name="line.5939"></a>
-<span class="sourceLineNo">5940</span>    region.increment(incr); // 2<a name="line.5940"></a>
-<span class="sourceLineNo">5941</span><a name="line.5941"></a>
-<span class="sourceLineNo">5942</span>    // New value should be 2<a name="line.5942"></a>
-<span class="sourceLineNo">5943</span>    r = region.get(new Get(row));<a name="line.5943"></a>
-<span class="sourceLineNo">5944</span>    val = r.getValue(fam1, q1);<a name="line.5944"></a>
-<span class="sourceLineNo">5945</span>    assertNotNull(val);<a name="line.5945"></a>
-<span class="sourceLineNo">5946</span>    assertEquals(2L, Bytes.toLong(val));<a name="line.5946"></a>
-<span class="sourceLineNo">5947</span><a name="line.5947"></a>
-<span class="sourceLineNo">5948</span>    // Increment time to T+25 seconds<a name="line.5948"></a>
-<span class="sourceLineNo">5949</span>    edge.incrementTime(5000);<a name="line.5949"></a>
-<span class="sourceLineNo">5950</span><a name="line.5950"></a>
-<span class="sourceLineNo">5951</span>    // Value should be back to 1<a name="line.5951"></a>
-<span class="sourceLineNo">5952</span>    r = region.get(new Get(row));<a name="line.5952"></a>
-<span class="sourceLineNo">5953</span>    val = r.getValue(fam1, q1);<a name="line.5953"></a>
-<span class="sourceLineNo">5954</span>    assertNotNull(val);<a name="line.5954"></a>
-<span class="sourceLineNo">5955</span>    assertEquals(1L, Bytes.toLong(val));<a name="line.5955"></a>
-<span class="sourceLineNo">5956</span><a name="line.5956"></a>
-<span class="sourceLineNo">5957</span>    // Increment time to T+30 seconds<a name="line.5957"></a>
-<span class="sourceLineNo">5958</span>    edge.incrementTime(5000);<a name="line.5958"></a>
-<span class="sourceLineNo">5959</span><a name="line.5959"></a>
-<span class="sourceLineNo">5960</span>    // Original value written at T+20 should be gone now via family TTL<a name="line.5960"></a>
-<span class="sourceLineNo">5961</span>    r = region.get(new Get(row));<a name="line.5961"></a>
-<span class="sourceLineNo">5962</span>    assertNull(r.getValue(fam1, q1));<a name="line.5962"></a>
-<span class="sourceLineNo">5963</span>  }<a name="line.5963"></a>
-<span class="sourceLineNo">5964</span><a name="line.5964"></a>
-<span class="sourceLineNo">5965</span>  @Test<a name="line.5965"></a>
-<span class="sourceLineNo">5966</span>  public void testIncrementTimestampsAreMonotonic() throws IOException {<a name="line.5966"></a>
-<span class="sourceLineNo">5967</span>    region = initHRegion(tableName, method, CONF, fam1);<a name="line.5967"></a>
-<span class="sourceLineNo">5968</span>    ManualEnvironmentEdge edge = new ManualEnvironmentEdge();<a name="line.5968"></a>
-<span class="sourceLineNo">5969</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.5969"></a>
-<span class="sourceLineNo">5970</span><a name="line.5970"></a>
-<span class="sourceLineNo">5971</span>    edge.setValue(10);<a name="line.5971"></a>
-<span class="sourceLineNo">5972</span>    Increment inc = new Increment(row);<a name="line.5972"></a>
-<span class="sourceLineNo">5973</span>    inc.setDurability(Durability.SKIP_WAL);<a name="line.5973"></a>
-<span class="sourceLineNo">5974</span>    inc.addColumn(fam1, qual1, 1L);<a name="line.5974"></a>
-<span class="sourceLineNo">5975</span>    region.increment(inc);<a name="line.5975"></a>
-<span class="sourceLineNo">5976</span><a name="line.5976"></a>
-<span class="sourceLineNo">5977</span>    Result result = region.get(new Get(row));<a name="line.5977"></a>
-<span class="sourceLineNo">5978</span>    Cell c = result.getColumnLatestCell(fam1, qual1);<a name="line.5978"></a>
-<span class="sourceLineNo">5979</span>    assertNotNull(c);<a name="line.5979"></a>
-<span class="sourceLineNo">5980</span>    assertEquals(10L, c.getTimestamp());<a name="line.5980"></a>
-<span class="sourceLineNo">5981</span><a name="line.5981"></a>
-<span class="sourceLineNo">5982</span>    edge.setValue(1); // clock goes back<a name="line.5982"></a>
-<span class="sourceLineNo">5983</span>    region.increment(inc);<a name="line.5983"></a>
-<span class="sourceLineNo">5984</span>    result = region.get(new Get(row));<a name="line.5984"></a>
-<span class="sourceLineNo">5985</span>    c = result.getColumnLatestCell(fam1, qual1);<a name="line.5985"></a>
-<span class="sourceLineNo">5986</span>    assertEquals(11L, c.getTimestamp());<a name="line.5986"></a>
-<span class="sourceLineNo">5987</span>    assertEquals(2L, Bytes.toLong(c.getValueArray(), c.getValueOffset(), c.getValueLength()));<a name="line.5987"></a>
-<span class="sourceLineNo">5988</span>  }<a name="line.5988"></a>
-<span class="sourceLineNo">5989</span><a name="line.5989"></a>
-<span class="sourceLineNo">5990</span>  @Test<a name="line.5990"></a>
-<span class="sourceLineNo">5991</span>  public void testAppendTimestampsAreMonotonic() throws IOException {<a name="line.5991"></a>
-<span class="sourceLineNo">5992</span>    region = initHRegion(tableName, method, CONF, fam1);<a name="line.5992"></a>
-<span class="sourceLineNo">5993</span>    ManualEnvironmentEdge edge = new ManualEnvironmentEdge();<a name="line.5993"></a>
-<span class="sourceLineNo">5994</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.5994"></a>
-<span class="sourceLineNo">5995</span><a name="line.5995"></a>
-<span class="sourceLineNo">5996</span>    edge.setValue(10);<a name="line.5996"></a>
-<span class="sourceLineNo">5997</span>    Append a = new Append(row);<a name="line.5997"></a>
-<span class="sourceLineNo">5998</span>    a.setDurability(Durability.SKIP_WAL);<a name="line.5998"></a>
-<span class="sourceLineNo">5999</span>    a.addColumn(fam1, qual1, qual1);<a name="line.5999"></a>
-<span class="sourceLineNo">6000</span>    region.append(a);<a name="line.6000"></a>
-<span class="sourceLineNo">6001</span><a name="line.6001"></a>
-<span class="sourceLineNo">6002</span>    Result result = region.get(new Get(row));<a name="line.6002"></a>
-<span class="sourceLineNo">6003</span>    Cell c = result.getColumnLatestCell(fam1, qual1);<a name="line.6003"></a>
-<span class="sourceLineNo">6004</span>    assertNotNull(c);<a name="line.6004"></a>
-<span class="sourceLineNo">6005</span>    assertEquals(10L, c.getTimestamp());<a name="line.6005"></a>
-<span class="sourceLineNo">6006</span><a name="line.6006"></a>
-<span class="sourceLineNo">6007</span>    edge.setValue(1); // clock goes back<a name="line.6007"></a>
-<span class="sourceLineNo">6008</span>    region.append(a);<a name="line.6008"></a>
-<span class="sourceLineNo">6009</span>    result = region.get(new Get(row));<a name="line.6009"></a>
-<span class="sourceLineNo">6010</span>    c = result.getColumnLatestCell(fam1, qual1);<a name="line.6010"></a>
-<span class="sourceLineNo">6011</span>    assertEquals(11L, c.getTimestamp());<a name="line.6011"></a>
-<span class="sourceLineNo">6012</span><a name="line.6012"></a>
-<span class="sourceLineNo">6013</span>    byte[] expected = new byte[qual1.length*2];<a name="line.6013"></a>
-<span class="sourceLineNo">6014</span>    System.arraycopy(qual1, 0, expected, 0, qual1.length);<a name="line.6014"></a>
-<span class="sourceLineNo">6015</span>    System.arraycopy(qual1, 0, expected, qual1.length, qual1.length);<a name="line.6015"></a>
+<span class="sourceLineNo">5933</span>    assertNull(r.getValue(fam1, q1));<a name="line.5933"></a>
+<span class="sourceLineNo">5934</span>    assertNull(r.getValue(fam1, q2));<a name="line.5934"></a>
+<span class="sourceLineNo">5935</span>    assertNull(r.getValue(fam1, q3));<a name="line.5935"></a>
+<span class="sourceLineNo">5936</span>    assertNull(r.getValue(fam1, q4));<a name="line.5936"></a>
+<span class="sourceLineNo">5937</span><a name="line.5937"></a>
+<span class="sourceLineNo">5938</span>    // Fun with disappearing increments<a name="line.5938"></a>
+<span class="sourceLineNo">5939</span><a name="line.5939"></a>
+<span class="sourceLineNo">5940</span>    // Start at 1<a name="line.5940"></a>
+<span class="sourceLineNo">5941</span>    region.put(new Put(row).addColumn(fam1, q1, Bytes.toBytes(1L)));<a name="line.5941"></a>
+<span class="sourceLineNo">5942</span>    r = region.get(new Get(row));<a name="line.5942"></a>
+<span class="sourceLineNo">5943</span>    byte[] val = r.getValue(fam1, q1);<a name="line.5943"></a>
+<span class="sourceLineNo">5944</span>    assertNotNull(val);<a name="line.5944"></a>
+<span class="sourceLineNo">5945</span>    assertEquals(1L, Bytes.toLong(val));<a name="line.5945"></a>
+<span class="sourceLineNo">5946</span><a name="line.5946"></a>
+<span class="sourceLineNo">5947</span>    // Increment with a TTL of 5 seconds<a name="line.5947"></a>
+<span class="sourceLineNo">5948</span>    Increment incr = new Increment(row).addColumn(fam1, q1, 1L);<a name="line.5948"></a>
+<span class="sourceLineNo">5949</span>    incr.setTTL(5000);<a name="line.5949"></a>
+<span class="sourceLineNo">5950</span>    region.increment(incr); // 2<a name="line.5950"></a>
+<span class="sourceLineNo">5951</span><a name="line.5951"></a>
+<span class="sourceLineNo">5952</span>    // New value should be 2<a name="line.5952"></a>
+<span class="sourceLineNo">5953</span>    r = region.get(new Get(row));<a name="line.5953"></a>
+<span class="sourceLineNo">5954</span>    val = r.getValue(fam1, q1);<a name="line.5954"></a>
+<span class="sourceLineNo">5955</span>    assertNotNull(val);<a name="line.5955"></a>
+<span class="sourceLineNo">5956</span>    assertEquals(2L, Bytes.toLong(val));<a name="line.5956"></a>
+<span class="sourceLineNo">5957</span><a name="line.5957"></a>
+<span class="sourceLineNo">5958</span>    // Increment time to T+25 seconds<a name="line.5958"></a>
+<span class="sourceLineNo">5959</span>    edge.incrementTime(5000);<a name="line.5959"></a>
+<span class="sourceLineNo">5960</span><a name="line.5960"></a>
+<span class="sourceLineNo">5961</span>    // Value should be back to 1<a name="line.5961"></a>
+<span class="sourceLineNo">5962</span>    r = region.get(new Get(row));<a name="line.5962"></a>
+<span class="sourceLineNo">5963</span>    val = r.getValue(fam1, q1);<a name="line.5963"></a>
+<span class="sourceLineNo">5964</span>    assertNotNull(val);<a name="line.5964"></a>
+<span class="sourceLineNo">5965</span>    assertEquals(1L, Bytes.toLong(val));<a name="line.5965"></a>
+<span class="sourceLineNo">5966</span><a name="line.5966"></a>
+<span class="sourceLineNo">5967</span>    // Increment time to T+30 seconds<a name="line.5967"></a>
+<span class="sourceLineNo">5968</span>    edge.incrementTime(5000);<a name="line.5968"></a>
+<span class="sourceLineNo">5969</span><a name="line.5969"></a>
+<span class="sourceLineNo">5970</span>    // Original value written at T+20 should be gone now via family TTL<a name="line.5970"></a>
+<span class="sourceLineNo">5971</span>    r = region.get(new Get(row));<a name="line.5971"></a>
+<span class="sourceLineNo">5972</span>    assertNull(r.getValue(fam1, q1));<a name="line.5972"></a>
+<span class="sourceLineNo">5973</span>  }<a name="line.5973"></a>
+<span class="sourceLineNo">5974</span><a name="line.5974"></a>
+<span class="sourceLineNo">5975</span>  @Test<a name="line.5975"></a>
+<span class="sourceLineNo">5976</span>  public void testIncrementTimestampsAreMonotonic() throws IOException {<a name="line.5976"></a>
+<span class="sourceLineNo">5977</span>    region = initHRegion(tableName, method, CONF, fam1);<a name="line.5977"></a>
+<span class="sourceLineNo">5978</span>    ManualEnvironmentEdge edge = new ManualEnvironmentEdge();<a name="line.5978"></a>
+<span class="sourceLineNo">5979</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.5979"></a>
+<span class="sourceLineNo">5980</span><a name="line.5980"></a>
+<span class="sourceLineNo">5981</span>    edge.setValue(10);<a name="line.5981"></a>
+<span class="sourceLineNo">5982</span>    Increment inc = new Increment(row);<a name="line.5982"></a>
+<span class="sourceLineNo">5983</span>    inc.setDurability(Durability.SKIP_WAL);<a name="line.5983"></a>
+<span class="sourceLineNo">5984</span>    inc.addColumn(fam1, qual1, 1L);<a name="line.5984"></a>
+<span class="sourceLineNo">5985</span>    region.increment(inc);<a name="line.5985"></a>
+<span class="sourceLineNo">5986</span><a name="line.5986"></a>
+<span class="sourceLineNo">5987</span>    Result result = region.get(new Get(row));<a name="line.5987"></a>
+<span class="sourceLineNo">5988</span>    Cell c = result.getColumnLatestCell(fam1, qual1);<a name="line.5988"></a>
+<span class="sourceLineNo">5989</span>    assertNotNull(c);<a name="line.5989"></a>
+<span class="sourceLineNo">5990</span>    assertEquals(10L, c.getTimestamp());<a name="line.5990"></a>
+<span class="sourceLineNo">5991</span><a name="line.5991"></a>
+<span class="sourceLineNo">5992</span>    edge.setValue(1); // clock goes back<a name="line.5992"></a>
+<span class="sourceLineNo">5993</span>    region.increment(inc);<a name="line.5993"></a>
+<span class="sourceLineNo">5994</span>    result = region.get(new Get(row));<a name="line.5994"></a>
+<span class="sourceLineNo">5995</span>    c = result.getColumnLatestCell(fam1, qual1);<a name="line.5995"></a>
+<span class="sourceLineNo">5996</span>    assertEquals(11L, c.getTimestamp());<a name="line.5996"></a>
+<span class="sourceLineNo">5997</span>    assertEquals(2L, Bytes.toLong(c.getValueArray(), c.getValueOffset(), c.getValueLength()));<a name="line.5997"></a>
+<span class="sourceLineNo">5998</span>  }<a name="line.5998"></a>
+<span class="sourceLineNo">5999</span><a name="line.5999"></a>
+<span class="sourceLineNo">6000</span>  @Test<a name="line.6000"></a>
+<span class="sourceLineNo">6001</span>  public void testAppendTimestampsAreMonotonic() throws IOException {<a name="line.6001"></a>
+<span class="sourceLineNo">6002</span>    region = initHRegion(tableName, method, CONF, fam1);<a name="line.6002"></a>
+<span class="sourceLineNo">6003</span>    ManualEnvironmentEdge edge = new ManualEnvironmentEdge();<a name="line.6003"></a>
+<span class="sourceLineNo">6004</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.6004"></a>
+<span class="sourceLineNo">6005</span><a name="line.6005"></a>
+<span class="sourceLineNo">6006</span>    edge.setValue(10);<a name="line.6006"></a>
+<span class="sourceLineNo">6007</span>    Append a = new Append(row);<a name="line.6007"></a>
+<span class="sourceLineNo">6008</span>    a.setDurability(Durability.SKIP_WAL);<a name="line.6008"></a>
+<span class="sourceLineNo">6009</span>    a.addColumn(fam1, qual1, qual1);<a name="line.6009"></a>
+<span class="sourceLineNo">6010</span>    region.append(a);<a name="line.6010"></a>
+<span class="sourceLineNo">6011</span><a name="line.6011"></a>
+<span class="sourceLineNo">6012</span>    Result result = region.get(new Get(row));<a name="line.6012"></a>
+<span class="sourceLineNo">6013</span>    Cell c = result.getColumnLatestCell(fam1, qual1);<a name="line.6013"></a>
+<span class="sourceLineNo">6014</span>    assertNotNull(c);<a name="line.6014"></a>
+<span class="sourceLineNo">6015</span>    assertEquals(10L, c.getTimestamp());<a name="line.6015"></a>
 <span class="sourceLineNo">6016</span><a name="line.6016"></a>
-<span class="sourceLineNo">6017</span>    assertTrue(Bytes.equals(c.getValueArray(), c.getValueOffset(), c.getValueLength(),<a name="line.6017"></a>
-<span class="sourceLineNo">6018</span>      expected, 0, expected.length));<a name="line.6018"></a>
-<span class="sourceLineNo">6019</span>  }<a name="line.6019"></a>
-<span class="sourceLineNo">6020</span><a name="line.6020"></a>
-<span class="sourceLineNo">6021</span>  @Test<a name="line.6021"></a>
-<span class="sourceLineNo">6022</span>  public void testCheckAndMutateTimestampsAreMonotonic() throws IOException {<a name="line.6022"></a>
-<span class="sourceLineNo">6023</span>    region = initHRegion(tableName, method, CONF, fam1);<a name="line.6023"></a>
-<span class="sourceLineNo">6024</span>    ManualEnvironmentEdge edge = new ManualEnvironmentEdge();<a name="line.6024"></a>
-<span class="sourceLineNo">6025</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.6025"></a>
+<span class="sourceLineNo">6017</span>    edge.setValue(1); // clock goes back<a name="line.6017"></a>
+<span class="sourceLineNo">6018</span>    region.append(a);<a name="line.6018"></a>
+<span class="sourceLineNo">6019</span>    result = region.get(new Get(row));<a name="line.6019"></a>
+<span class="sourceLineNo">6020</span>    c = result.getColumnLatestCell(fam1, qual1);<a name="line.6020"></a>
+<span class="sourceLineNo">6021</span>    assertEquals(11L, c.getTimestamp());<a name="line.6021"></a>
+<span class="sourceLineNo">6022</span><a name="line.6022"></a>
+<span class="sourceLineNo">6023</span>    byte[] expected = new byte[qual1.length*2];<a name="line.6023"></a>
+<span class="sourceLineNo">6024</span>    System.arraycopy(qual1, 0, expected, 0, qual1.length);<a name="line.6024"></a>
+<span class="sourceLineNo">6025</span>    System.arraycopy(qual1, 0, expected, qual1.length, qual1.length);<a name="line.6025"></a>
 <span class="sourceLineNo">6026</span><a name="line.6026"></a>
-<span class="sourceLineNo">6027</span>    edge.setValue(10);<a name="line.6027"></a>
-<span class="sourceLineNo">6028</span>    Put p = new Put(row);<a name="line.6028"></a>
-<span class="sourceLineNo">6029</span>    p.setDurability(Durability.SKIP_WAL);<a name="line.6029"></a>
-<span class="sourceLineNo">6030</span>    p.addColumn(fam1, qual1, qual1);<a name="line.6030"></a>
-<span class="sourceLineNo">6031</span>    region.put(p);<a name="line.6031"></a>
-<span class="sourceLineNo">6032</span><a name="line.6032"></a>
-<span class="sourceLineNo">6033</span>    Result result = region.get(new Get(row));<a name="line.6033"></a>
-<span class="sourceLineNo">6034</span>    Cell c = result.getColumnLatestCell(fam1, qual1);<a name="line.6034"></a>
-<span class="sourceLineNo">6035</span>    assertNotNull(c);<a name="line.6035"></a>
-<span class="sourceLineNo">6036</span>    assertEquals(10L, c.getTimestamp());<a name="line.6036"></a>
-<span class="sourceLineNo">6037</span><a name="line.6037"></a>
-<span class="sourceLineNo">6038</span>    edge.setValue(1); // clock goes back<a name="line.6038"></a>
-<span class="sourceLineNo">6039</span>    p = new Put(row);<a name="line.6039"></a>
-<span class="sourceLineNo">6040</span>    p.setDurability(Durability.SKIP_WAL);<a name="line.6040"></a>
-<span class="sourceLineNo">6041</span>    p.addColumn(fam1, qual1, qual2);<a name="line.6041"></a>
-<span class="sourceLineNo">6042</span>    region.checkAndMutate(row, fam1, qual1, CompareOperator.EQUAL, new BinaryComparator(qual1), p);<a name="line.6042"></a>
-<span class="sourceLineNo">6043</span>    result = region.get(new Get(row));<a name="line.6043"></a>
-<span class="sourceLineNo">6044</span>    c = result.getColumnLatestCell(fam1, qual1);<a name="line.6044"></a>
-<span class="sourceLineNo">6045</span>    assertEquals(10L, c.getTimestamp());<a name="line.6045"></a>
-<span class="sourceLineNo">6046</span><a name="line.6046"></a>
-<span class="sourceLineNo">6047</span>    assertTrue(Bytes.equals(c.getValueArray(), c.getValueOffset(), c.getValueLength(),<a name="line.6047"></a>
-<span class="sourceLineNo">6048</span>      qual2, 0, qual2.length));<a name="line.6048"></a>
-<span class="sourceLineNo">6049</span>  }<a name="line.6049"></a>
-<span class="sourceLineNo">6050</span><a name="line.6050"></a>
-<span class="sourceLineNo">6051</span>  @Test<a name="line.6051"></a>
-<span class="sourceLineNo">6052</span>  public void testBatchMutateWithWrongRegionException() throws Exception {<a name="line.6052"></a>
-<span class="sourceLineNo">6053</span>    final byte[] a = Bytes.toBytes("a");<a name="line.6053"></a>
-<span class="sourceLineNo">6054</span>    final byte[] b = Bytes.toBytes("b");<a name="line.6054"></a>
-<span class="sourceLineNo">6055</span>    final byte[] c = Bytes.toBytes("c"); // exclusive<a name="line.6055"></a>
+<span class="sourceLineNo">6027</span>    assertTrue(Bytes.equals(c.getValueArray(), c.getValueOffset(), c.getValueLength(),<a name="line.6027"></a>
+<span class="sourceLineNo">6028</span>      expected, 0, expected.length));<a name="line.6028"></a>
+<span class="sourceLineNo">6029</span>  }<a name="line.6029"></a>
+<span class="sourceLineNo">6030</span><a name="line.6030"></a>
+<span class="sourceLineNo">6031</span>  @Test<a name="line.6031"></a>
+<span class="sourceLineNo">6032</span>  public void testCheckAndMutateTimestampsAreMonotonic() throws IOException {<a name="line.6032"></a>
+<span class="sourceLineNo">6033</span>    region = initHRegion(tableName, method, CONF, fam1);<a name="line.6033"></a>
+<span class="sourceLineNo">6034</span>    ManualEnvironmentEdge edge = new ManualEnvironmentEdge();<a name="line.6034"></a>
+<span class="sourceLineNo">6035</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.6035"></a>
+<span class="sourceLineNo">6036</span><a name="line.6036"></a>
+<span class="sourceLineNo">6037</span>    edge.setValue(10);<a name="line.6037"></a>
+<span class="sourceLineNo">6038</span>    Put p = new Put(row);<a name="line.6038"></a>
+<span class="sourceLineNo">6039</span>    p.setDurability(Durability.SKIP_WAL);<a name="line.6039"></a>
+<span class="sourceLineNo">6040</span>    p.addColumn(fam1, qual1, qual1);<a name="line.6040"></a>
+<span class="sourceLineNo">6041</span>    region.put(p);<a name="line.6041"></a>
+<span class="sourceLineNo">6042</span><a name="line.6042"></a>
+<span class="sourceLineNo">6043</span>    Result result = region.get(new Get(row));<a name="line.6043"></a>
+<span class="sourceLineNo">6044</span>    Cell c = result.getColumnLatestCell(fam1, qual1);<a name="line.6044"></a>
+<span class="sourceLineNo">6045</span>    assertNotNull(c);<a name="line.6045"></a>
+<span class="sourceLineNo">6046</span>    assertEquals(10L, c.getTimestamp());<a name="line.6046"></a>
+<span class="sourceLineNo">6047</span><a name="line.6047"></a>
+<span class="sourceLineNo">6048</span>    edge.setValue(1); // clock goes back<a name="line.6048"></a>
+<span class="sourceLineNo">6049</span>    p = new Put(row);<a name="line.6049"></a>
+<span class="sourceLineNo">6050</span>    p.setDurability(Durability.SKIP_WAL);<a name="line.6050"></a>
+<span class="sourceLineNo">6051</span>    p.addColumn(fam1, qual1, qual2);<a name="line.6051"></a>
+<span class="sourceLineNo">6052</span>    region.checkAndMutate(row, fam1, qual1, CompareOperator.EQUAL, new BinaryComparator(qual1), p);<a name="line.6052"></a>
+<span class="sourceLineNo">6053</span>    result = region.get(new Get(row));<a name="line.6053"></a>
+<span class="sourceLineNo">6054</span>    c = result.getColumnLatestCell(fam1, qual1);<a name="line.6054"></a>
+<span class="sourceLineNo">6055</span>    assertEquals(10L, c.getTimestamp());<a name="line.6055"></a>
 <span class="sourceLineNo">6056</span><a name="line.6056"></a>
-<span class="sourceLineNo">6057</span>    int prevLockTimeout = CONF.getInt("hbase.rowlock.wait.duration", 30000);<a name="line.6057"></a>
-<span class="sourceLineNo">6058</span>    CONF.setInt("hbase.rowlock.wait.duration", 1000);<a name="line.6058"></a>
-<span class="sourceLineNo">6059</span>    region = initHRegion(tableName, a, c, method, CONF, false, fam1);<a name="line.6059"></a>
+<span class="sourceLineNo">6057</span>    assertTrue(Bytes.equals(c.getValueArray(), c.getValueOffset(), c.getValueLength(),<a name="line.6057"></a>
+<span class="sourceLineNo">6058</span>      qual2, 0, qual2.length));<a name="line.6058"></a>
+<span class="sourceLineNo">6059</span>  }<a name="line.6059"></a>
 <span class="sourceLineNo">6060</span><a name="line.6060"></a>
-<span class="sourceLineNo">6061</span>    Mutation[] mutations = new Mutation[] {<a name="line.6061"></a>
-<span class="sourceLineNo">6062</span>        new Put(a)<a name="line.6062"></a>
-<span class="sourceLineNo">6063</span>            .add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6063"></a>
-<span class="sourceLineNo">6064</span>              .setRow(a)<a name="line.6064"></a>
-<span class="sourceLineNo">6065</span>              .setFamily(fam1)<a name="line.6065"></a>
-<span class="sourceLineNo">6066</span>              .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6066"></a>
-<span class="sourceLineNo">6067</span>              .setType(Cell.Type.Put)<a name="line.6067"></a>
-<span class="sourceLineNo">6068</span>              .build()),<a name="line.6068"></a>
-<span class="sourceLineNo">6069</span>        // this is outside the region boundary<a name="line.6069"></a>
-<span class="sourceLineNo">6070</span>        new Put(c).add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6070"></a>
-<span class="sourceLineNo">6071</span>              .setRow(c)<a name="line.6071"></a>
-<span class="sourceLineNo">6072</span>              .setFamily(fam1)<a name="line.6072"></a>
-<span class="sourceLineNo">6073</span>              .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6073"></a>
-<span class="sourceLineNo">6074</span>              .setType(Type.Put)<a name="line.6074"></a>
-<span class="sourceLineNo">6075</span>              .build()),<a name="line.6075"></a>
-<span class="sourceLineNo">6076</span>        new Put(b).add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6076"></a>
-<span class="sourceLineNo">6077</span>              .setRow(b)<a name="line.6077"></a>
-<span class="sourceLineNo">6078</span>              .setFamily(fam1)<a name="line.6078"></a>
-<span class="sourceLineNo">6079</span>              .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6079"></a>
-<span class="sourceLineNo">6080</span>              .setType(Cell.Type.Put)<a name="line.6080"></a>
-<span class="sourceLineNo">6081</span>              .build())<a name="line.6081"></a>
-<span class="sourceLineNo">6082</span>    };<a name="line.6082"></a>
-<span class="sourceLineNo">6083</span><a name="line.6083"></a>
-<span class="sourceLineNo">6084</span>    OperationStatus[] status = region.batchMutate(mutations);<a name="line.6084"></a>
-<span class="sourceLineNo">6085</span>    assertEquals(OperationStatusCode.SUCCESS, status[0].getOperationStatusCode());<a name="line.6085"></a>
-<span class="sourceLineNo">6086</span>    assertEquals(OperationStatusCode.SANITY_CHECK_FAILURE, status[1].getOperationStatusCode());<a name="line.6086"></a>
-<span class="sourceLineNo">6087</span>    assertEquals(OperationStatusCode.SUCCESS, status[2].getOperationStatusCode());<a name="line.6087"></a>
-<span class="sourceLineNo">6088</span><a name="line.6088"></a>
-<span class="sourceLineNo">6089</span><a name="line.6089"></a>
-<span class="sourceLineNo">6090</span>    // test with a row lock held for a long time<a name="line.6090"></a>
-<span class="sourceLineNo">6091</span>    final CountDownLatch obtainedRowLock = new CountDownLatch(1);<a name="line.6091"></a>
-<span class="sourceLineNo">6092</span>    ExecutorService exec = Executors.newFixedThreadPool(2);<a name="line.6092"></a>
-<span class="sourceLineNo">6093</span>    Future&lt;Void&gt; f1 = exec.submit(new Callable&lt;Void&gt;() {<a name="line.6093"></a>
-<span class="sourceLineNo">6094</span>      @Override<a name="line.6094"></a>
-<span class="sourceLineNo">6095</span>      public Void call() throws Exception {<a name="line.6095"></a>
-<span class="sourceLineNo">6096</span>        LOG.info("Acquiring row lock");<a name="line.6096"></a>
-<span class="sourceLineNo">6097</span>        RowLock rl = region.getRowLock(b);<a name="line.6097"></a>
-<span class="sourceLineNo">6098</span>        obtainedRowLock.countDown();<a name="line.6098"></a>
-<span class="sourceLineNo">6099</span>        LOG.info("Waiting for 5 seconds before releasing lock");<a name="line.6099"></a>
-<span class="sourceLineNo">6100</span>        Threads.sleep(5000);<a name="line.6100"></a>
-<span class="sourceLineNo">6101</span>        LOG.info("Releasing row lock");<a name="line.6101"></a>
-<span class="sourceLineNo">6102</span>        rl.release();<a name="line.6102"></a>
-<span class="sourceLineNo">6103</span>        return null;<a name="line.6103"></a>
-<span class="sourceLineNo">6104</span>      }<a name="line.6104"></a>
-<span class="sourceLineNo">6105</span>    });<a name="line.6105"></a>
-<span class="sourceLineNo">6106</span>    obtainedRowLock.await(30, TimeUnit.SECONDS);<a name="line.6106"></a>
-<span class="sourceLineNo">6107</span><a name="line.6107"></a>
-<span class="sourceLineNo">6108</span>    Future&lt;Void&gt; f2 = exec.submit(new Callable&lt;Void&gt;() {<a name="line.6108"></a>
-<span class="sourceLineNo">6109</span>      @Override<a name="line.6109"></a>
-<span class="sourceLineNo">6110</span>      public Void call() throws Exception {<a name="line.6110"></a>
-<span class="sourceLineNo">6111</span>        Mutation[] mutations = new Mutation[] {<a name="line.6111"></a>
-<span class="sourceLineNo">6112</span>            new Put(a).add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6112"></a>
-<span class="sourceLineNo">6113</span>                .setRow(a)<a name="line.6113"></a>
-<span class="sourceLineNo">6114</span>                .setFamily(fam1)<a name="line.6114"></a>
-<span class="sourceLineNo">6115</span>                .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6115"></a>
-<span class="sourceLineNo">6116</span>                .setType(Cell.Type.Put)<a name="line.6116"></a>
-<span class="sourceLineNo">6117</span>                .build()),<a name="line.6117"></a>
-<span class="sourceLineNo">6118</span>            new Put(b).add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6118"></a>
-<span class="sourceLineNo">6119</span>                .setRow(b)<a name="line.6119"></a>
-<span class="sourceLineNo">6120</span>                .setFamily(fam1)<a name="line.6120"></a>
-<span class="sourceLineNo">6121</span>                .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6121"></a>
-<span class="sourceLineNo">6122</span>                .setType(Cell.Type.Put)<a name="line.6122"></a>
-<span class="sourceLineNo">6123</span>                .build()),<a name="line.6123"></a>
-<span class="sourceLineNo">6124</span>        };<a name="line.6124"></a>
-<span class="sourceLineNo">6125</span><a name="line.6125"></a>
-<span class="sourceLineNo">6126</span>        // this will wait for the row lock, and it will eventually succeed<a name="line.6126"></a>
-<span class="sourceLineNo">6127</span>        OperationStatus[] status = region.batchMutate(mutations);<a name="line.6127"></a>
-<span class="sourceLineNo">6128</span>        assertEquals(OperationStatusCode.SUCCESS, status[0].getOperationStatusCode());<a name="line.6128"></a>
-<span class="sourceLineNo">6129</span>        assertEquals(OperationStatusCode.SUCCESS, status[1].getOperationStatusCode());<a name="line.6129"></a>
-<span class="sourceLineNo">6130</span>        return null;<a name="line.6130"></a>
-<span class="sourceLineNo">6131</span>      }<a name="line.6131"></a>
-<span class="sourceLineNo">6132</span>    });<a name="line.6132"></a>
-<span class="sourceLineNo">6133</span><a name="line.6133"></a>
-<span class="sourceLineNo">6134</span>    f1.get();<a name="line.6134"></a>
-<span class="sourceLineNo">6135</span>    f2.get();<a name="line.6135"></a>
-<span class="sourceLineNo">6136</span><a name="line.6136"></a>
-<span class="sourceLineNo">6137</span>    CONF.setInt("hbase.rowlock.wait.duration", prevLockTimeout);<a name="line.6137"></a>
-<span class="sourceLineNo">6138</span>  }<a name="line.6138"></a>
-<span class="sourceLineNo">6139</span><a name="line.6139"></a>
-<span class="sourceLineNo">6140</span>  @Test<a name="line.6140"></a>
-<span class="sourceLineNo">6141</span>  public void testCheckAndRowMutateTimestampsAreMonotonic() throws IOException {<a name="line.6141"></a>
-<span class="sourceLineNo">6142</span>    region = initHRegion(tableName, method, CONF, fam1);<a name="line.6142"></a>
-<span class="sourceLineNo">6143</span>    ManualEnvironmentEdge edge = new ManualEnvironmentEdge();<a name="line.6143"></a>
-<span class="sourceLineNo">6144</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.6144"></a>
-<span class="sourceLineNo">6145</span><a name="line.6145"></a>
-<span class="sourceLineNo">6146</span>    edge.setValue(10);<a name="line.6146"></a>
-<span class="sourceLineNo">6147</span>    Put p = new Put(row);<a name="line.6147"></a>
-<span class="sourceLineNo">6148</span>    p.setDurability(Durability.SKIP_WAL);<a name="line.6148"></a>
-<span class="sourceLineNo">6149</span>    p.addColumn(fam1, qual1, qual1);<a name="line.6149"></a>
-<span class="sourceLineNo">6150</span>    region.put(p);<a name="line.6150"></a>
-<span class="sourceLineNo">6151</span><a name="line.6151"></a>
-<span class="sourceLineNo">6152</span>    Result result = region.get(new Get(row));<a name="line.6152"></a>
-<span class="sourceLineNo">6153</span>    Cell c = result.getColumnLatestCell(fam1, qual1);<a name="line.6153"></a>
-<span class="sourceLineNo">6154</span>    assertNotNull(c);<a name="line.6154"></a>
-<span class="sourceLineNo">6155</span>    assertEquals(10L, c.getTimestamp());<a name="line.6155"></a>
-<span class="sourceLineNo">6156</span><a name="line.6156"></a>
-<span class="sourceLineNo">6157</span>    edge.setValue(1); // clock goes back<a name="line.6157"></a>
-<span class="sourceLineNo">6158</span>    p = new Put(row);<a name="line.6158"></a>
-<span class="sourceLineNo">6159</span>    p.setDurability(Durability.SKIP_WAL);<a name="line.6159"></a>
-<span class="sourceLineNo">6160</span>    p.addColumn(fam1, qual1, qual2);<a name="line.6160"></a>
-<span class="sourceLineNo">6161</span>    RowMutations rm = new RowMutations(row);<a name="line.6161"></a>
-<span class="sourceLineNo">6162</span>    rm.add(p);<a name="line.6162"></a>
-<span class="sourceLineNo">6163</span>    assertTrue(region.checkAndRowMutate(row, fam1, qual1, CompareOperator.EQUAL,<a name="line.6163"></a>
-<span class="sourceLineNo">6164</span>        new BinaryComparator(qual1), rm));<a name="line.6164"></a>
-<span class="sourceLineNo">6165</span>    result = region.get(new Get(row));<a name="line.6165"></a>
-<span class="sourceLineNo">6166</span>    c = result.getColumnLatestCell(fam1, qual1);<a name="line.6166"></a>
-<span class="sourceLineNo">6167</span>    assertEquals(10L, c.getTimestamp());<a name="line.6167"></a>
-<span class="sourceLineNo">6168</span>    LOG.info("c value " +<a name="line.6168"></a>
-<span class="sourceLineNo">6169</span>      Bytes.toStringBinary(c.getValueArray(), c.getValueOffset(), c.getValueLength()));<a name="line.6169"></a>
-<span class="sourceLineNo">6170</span><a name="line.6170"></a>
-<span class="sourceLineNo">6171</span>    assertTrue(Bytes.equals(c.getValueArray(), c.getValueOffset(), c.getValueLength(),<a name="line.6171"></a>
-<span class="sourceLineNo">6172</span>      qual2, 0, qual2.length));<a name="line.6172"></a>
-<span class="sourceLineNo">6173</span>  }<a name="line.6173"></a>
-<span class="sourceLineNo">6174</span><a name="line.6174"></a>
-<span class="sourceLineNo">6175</span>  HRegion initHRegion(TableName tableName, String callingMethod,<a name="line.6175"></a>
-<span class="sourceLineNo">6176</span>      byte[]... families) throws IOException {<a name="line.6176"></a>
-<span class="sourceLineNo">6177</span>    return initHRegion(tableName, callingMethod, HBaseConfiguration.create(),<a name="line.6177"></a>
-<span class="sourceLineNo">6178</span>        families);<a name="line.6178"></a>
-<span class="sourceLineNo">6179</span>  }<a name="line.6179"></a>
+<span class="sourceLineNo">6061</span>  @Test<a name="line.6061"></a>
+<span class="sourceLineNo">6062</span>  public void testBatchMutateWithWrongRegionException() throws Exception {<a name="line.6062"></a>
+<span class="sourceLineNo">6063</span>    final byte[] a = Bytes.toBytes("a");<a name="line.6063"></a>
+<span class="sourceLineNo">6064</span>    final byte[] b = Bytes.toBytes("b");<a name="line.6064"></a>
+<span class="sourceLineNo">6065</span>    final byte[] c = Bytes.toBytes("c"); // exclusive<a name="line.6065"></a>
+<span class="sourceLineNo">6066</span><a name="line.6066"></a>
+<span class="sourceLineNo">6067</span>    int prevLockTimeout = CONF.getInt("hbase.rowlock.wait.duration", 30000);<a name="line.6067"></a>
+<span class="sourceLineNo">6068</span>    CONF.setInt("hbase.rowlock.wait.duration", 1000);<a name="line.6068"></a>
+<span class="sourceLineNo">6069</span>    region = initHRegion(tableName, a, c, method, CONF, false, fam1);<a name="line.6069"></a>
+<span class="sourceLineNo">6070</span><a name="line.6070"></a>
+<span class="sourceLineNo">6071</span>    Mutation[] mutations = new Mutation[] {<a name="line.6071"></a>
+<span class="sourceLineNo">6072</span>        new Put(a)<a name="line.6072"></a>
+<span class="sourceLineNo">6073</span>            .add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6073"></a>
+<span class="sourceLineNo">6074</span>              .setRow(a)<a name="line.6074"></a>
+<span class="sourceLineNo">6075</span>              .setFamily(fam1)<a name="line.6075"></a>
+<span class="sourceLineNo">6076</span>              .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6076"></a>
+<span class="sourceLineNo">6077</span>              .setType(Cell.Type.Put)<a name="line.6077"></a>
+<span class="sourceLineNo">6078</span>              .build()),<a name="line.6078"></a>
+<span class="sourceLineNo">6079</span>        // this is outside the region boundary<a name="line.6079"></a>
+<span class="sourceLineNo">6080</span>        new Put(c).add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6080"></a>
+<span class="sourceLineNo">6081</span>              .setRow(c)<a name="line.6081"></a>
+<span class="sourceLineNo">6082</span>              .setFamily(fam1)<a name="line.6082"></a>
+<span class="sourceLineNo">6083</span>              .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6083"></a>
+<span class="sourceLineNo">6084</span>              .setType(Type.Put)<a name="line.6084"></a>
+<span class="sourceLineNo">6085</span>              .build()),<a name="line.6085"></a>
+<span class="sourceLineNo">6086</span>        new Put(b).add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6086"></a>
+<span class="sourceLineNo">6087</span>              .setRow(b)<a name="line.6087"></a>
+<span class="sourceLineNo">6088</span>              .setFamily(fam1)<a name="line.6088"></a>
+<span class="sourceLineNo">6089</span>              .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6089"></a>
+<span class="sourceLineNo">6090</span>              .setType(Cell.Type.Put)<a name="line.6090"></a>
+<span class="sourceLineNo">6091</span>              .build())<a name="line.6091"></a>
+<span class="sourceLineNo">6092</span>    };<a name="line.6092"></a>
+<span class="sourceLineNo">6093</span><a name="line.6093"></a>
+<span class="sourceLineNo">6094</span>    OperationStatus[] status = region.batchMutate(mutations);<a name="line.6094"></a>
+<span class="sourceLineNo">6095</span>    assertEquals(OperationStatusCode.SUCCESS, status[0].getOperationStatusCode());<a name="line.6095"></a>
+<span class="sourceLineNo">6096</span>    assertEquals(OperationStatusCode.SANITY_CHECK_FAILURE, status[1].getOperationStatusCode());<a name="line.6096"></a>
+<span class="sourceLineNo">6097</span>    assertEquals(OperationStatusCode.SUCCESS, status[2].getOperationStatusCode());<a name="line.6097"></a>
+<span class="sourceLineNo">6098</span><a name="line.6098"></a>
+<span class="sourceLineNo">6099</span><a name="line.6099"></a>
+<span class="sourceLineNo">6100</span>    // test with a row lock held for a long time<a name="line.6100"></a>
+<span class="sourceLineNo">6101</span>    final CountDownLatch obtainedRowLock = new CountDownLatch(1);<a name="line.6101"></a>
+<span class="sourceLineNo">6102</span>    ExecutorService exec = Executors.newFixedThreadPool(2);<a name="line.6102"></a>
+<span class="sourceLineNo">6103</span>    Future&lt;Void&gt; f1 = exec.submit(new Callable&lt;Void&gt;() {<a name="line.6103"></a>
+<span class="sourceLineNo">6104</span>      @Override<a name="line.6104"></a>
+<span class="sourceLineNo">6105</span>      public Void call() throws Exception {<a name="line.6105"></a>
+<span class="sourceLineNo">6106</span>        LOG.info("Acquiring row lock");<a name="line.6106"></a>
+<span class="sourceLineNo">6107</span>        RowLock rl = region.getRowLock(b);<a name="line.6107"></a>
+<span class="sourceLineNo">6108</span>        obtainedRowLock.countDown();<a name="line.6108"></a>
+<span class="sourceLineNo">6109</span>        LOG.info("Waiting for 5 seconds before releasing lock");<a name="line.6109"></a>
+<span class="sourceLineNo">6110</span>        Threads.sleep(5000);<a name="line.6110"></a>
+<span class="sourceLineNo">6111</span>        LOG.info("Releasing row lock");<a name="line.6111"></a>
+<span class="sourceLineNo">6112</span>        rl.release();<a name="line.6112"></a>
+<span class="sourceLineNo">6113</span>        return null;<a name="line.6113"></a>
+<span class="sourceLineNo">6114</span>      }<a name="line.6114"></a>
+<span class="sourceLineNo">6115</span>    });<a name="line.6115"></a>
+<span class="sourceLineNo">6116</span>    obtainedRowLock.await(30, TimeUnit.SECONDS);<a name="line.6116"></a>
+<span class="sourceLineNo">6117</span><a name="line.6117"></a>
+<span class="sourceLineNo">6118</span>    Future&lt;Void&gt; f2 = exec.submit(new Callable&lt;Void&gt;() {<a name="line.6118"></a>
+<span class="sourceLineNo">6119</span>      @Override<a name="line.6119"></a>
+<span class="sourceLineNo">6120</span>      public Void call() throws Exception {<a name="line.6120"></a>
+<span class="sourceLineNo">6121</span>        Mutation[] mutations = new Mutation[] {<a name="line.6121"></a>
+<span class="sourceLineNo">6122</span>            new Put(a).add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6122"></a>
+<span class="sourceLineNo">6123</span>                .setRow(a)<a name="line.6123"></a>
+<span class="sourceLineNo">6124</span>                .setFamily(fam1)<a name="line.6124"></a>
+<span class="sourceLineNo">6125</span>                .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6125"></a>
+<span class="sourceLineNo">6126</span>                .setType(Cell.Type.Put)<a name="line.6126"></a>
+<span class="sourceLineNo">6127</span>                .build()),<a name="line.6127"></a>
+<span class="sourceLineNo">6128</span>            new Put(b).add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6128"></a>
+<span class="sourceLineNo">6129</span>                .setRow(b)<a name="line.6129"></a>
+<span class="sourceLineNo">6130</span>                .setFamily(fam1)<a name="line.6130"></a>
+<span class="sourceLineNo">6131</span>                .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6131"></a>
+<span class="sourceLineNo">6132</span>                .setType(Cell.Type.Put)<a name="line.6132"></a>
+<span class="sourceLineNo">6133</span>                .build()),<a name="line.6133"></a>
+<span class="sourceLineNo">6134</span>        };<a name="line.6134"></a>
+<span class="sourceLineNo">6135</span><a name="line.6135"></a>
+<span class="sourceLineNo">6136</span>        // this will wait for the row lock, and it will eventually succeed<a name="line.6136"></a>
+<span class="sourceLineNo">6137</span>        OperationStatus[] status = region.batchMutate(mutations);<a name="line.6137"></a>
+<span class="sourceLineNo">6138</span>        assertEquals(OperationStatusCode.SUCCESS, status[0].getOperationStatusCode());<a name="line.6138"></a>
+<span class="sourceLineNo">6139</span>        assertEquals(OperationStatusCode.SUCCESS, status[1].getOperationStatusCode());<a name="line.6139"></a>
+<span class="sourceLineNo">6140</span>        return null;<a name="line.6140"></a>
+<span class="sourceLineNo">6141</span>      }<a name="line.6141"></a>
+<span class="sourceLineNo">6142</span>    });<a name="line.6142"></a>
+<span class="sourceLineNo">6143</span><a name="line.6143"></a>
+<span class="sourceLineNo">6144</span>    f1.get();<a name="line.6144"></a>
+<span class="sourceLineNo">6145</span>    f2.get();<a name="line.6145"></a>
+<span class="sourceLineNo">6146</span><a name="line.6146"></a>
+<span class="sourceLineNo">6147</span>    CONF.setInt("hbase.rowlock.wait.duration", prevLockTimeout);<a name="line.6147"></a>
+<span class="sourceLineNo">6148</span>  }<a name="line.6148"></a>
+<span class="sourceLineNo">6149</span><a name="line.6149"></a>
+<span class="sourceLineNo">6150</span>  @Test<a name="line.6150"></a>
+<span class="sourceLineNo">6151</span>  public void testCheckAndRowMutateTimestampsAreMonotonic() throws IOException {<a name="line.6151"></a>
+<span class="sourceLineNo">6152</span>    region = initHRegion(tableName, method, CONF, fam1);<a name="line.6152"></a>
+<span class="sourceLineNo">6153</span>    ManualEnvironmentEdge edge = new ManualEnvironmentEdge();<a name="line.6153"></a>
+<span class="sourceLineNo">6154</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.6154"></a>
+<span class="sourceLineNo">6155</span><a name="line.6155"></a>
+<span class="sourceLineNo">6156</span>    edge.setValue(10);<a name="line.6156"></a>
+<span class="sourceLineNo">6157</span>    Put p = new Put(row);<a name="line.6157"></a>
+<span class="sourceLineNo">6158</span>    p.setDurability(Durability.SKIP_WAL);<a name="line.6158"></a>
+<span class="sourceLineNo">6159</span>    p.addColumn(fam1, qual1, qual1);<a name="line.6159"></a>
+<span class="sourceLineNo">6160</span>    region.put(p);<a name="line.6160"></a>
+<span class="sourceLineNo">6161</span><a name="line.6161"></a>
+<span class="sourceLineNo">6162</span>    Result result = region.get(new Get(row));<a name="line.6162"></a>
+<span class="sourceLineNo">6163</span>    Cell c = result.getColumnLatestCell(fam1, qual1);<a name="line.6163"></a>
+<span class="sourceLineNo">6164</span>    assertNotNull(c);<a name="line.6164"></a>
+<span class="sourceLineNo">6165</span>    assertEquals(10L, c.getTimestamp());<a name="line.6165"></a>
+<span class="sourceLineNo">6166</span><a name="line.6166"></a>
+<span class="sourceLineNo">6167</span>    edge.setValue(1); // clock goes back<a name="line.6167"></a>
+<span class="sourceLineNo">6168</span>    p = new Put(row);<a name="line.6168"></a>
+<span class="sourceLineNo">6169</span>    p.setDurability(Durability.SKIP_WAL);<a name="line.6169"></a>
+<span class="sourceLineNo">6170</span>    p.addColumn(fam1, qual1, qual2);<a name="line.6170"></a>
+<span class="sourceLineNo">6171</span>    RowMutations rm = new RowMutations(row);<a name="line.6171"></a>
+<span class="sourceLineNo">6172</span>    rm.add(p);<a name="line.6172"></a>
+<span class="sourceLineNo">6173</span>    assertTrue(region.checkAndRowMutate(row, fam1, qual1, CompareOperator.EQUAL,<a name="line.6173"></a>
+<span class="sourceLineNo">6174</span>        new BinaryComparator(qual1), rm));<a name="line.6174"></a>
+<span class="sourceLineNo">6175</span>    result = region.get(new Get(row));<a name="line.6175"></a>
+<span class="sourceLineNo">6176</span>    c = result.getColumnLatestCell(fam1, qual1);<a name="line.6176"></a>
+<span class="sourceLineNo">6177</span>    assertEquals(10L, c.getTimestamp());<a name="line.6177"></a>
+<span class="sourceLineNo">6178</span>    LOG.info("c value " +<a name="line.6178"></a>
+<span class="sourceLineNo">6179</span>      Bytes.toStringBinary(c.getValueArray(), c.getValueOffset(), c.getValueLength()));<a name="line.6179"></a>
 <span class="sourceLineNo">6180</span><a name="line.6180"></a>
-<span class="sourceLineNo">6181</span>  /**<a name="line.6181"></a>
-<span class="sourceLineNo">6182</span>   * HBASE-16429 Make sure no stuck if roll writer when ring buffer is filled with appends<a name="line.6182"></a>
-<span class="sourceLineNo">6183</span>   * @throws IOException if IO error occurred during test<a name="line.6183"></a>
-<span class="sourceLineNo">6184</span>   */<a name="line.6184"></a>
-<span class="sourceLineNo">6185</span>  @Test<a name="line.6185"></a>
-<span class="sourceLineNo">6186</span>  public void testWritesWhileRollWriter() throws IOException {<a name="line.6186"></a>
-<span class="sourceLineNo">6187</span>    int testCount = 10;<a name="line.6187"></a>
-<span class="sourceLineNo">6188</span>    int numRows = 1024;<a name="line.6188"></a>
-<span class="sourceLineNo">6189</span>    int numFamilies = 2;<a name="line.6189"></a>
-<span class="sourceLineNo">6190</span>    int numQualifiers = 2;<a name="line.6190"></a>
-<span class="sourceLineNo">6191</span>    final byte[][] families = new byte[numFamilies][];<a name="line.6191"></a>
-<span class="sourceLineNo">6192</span>    for (int i = 0; i &lt; numFamilies; i++) {<a name="line.6192"></a>
-<span class="sourceLineNo">6193</span>      families[i] = Bytes.toBytes("family" + i);<a name="line.6193"></a>
-<span class="sourceLineNo">6194</span>    }<a name="line.6194"></a>
-<span class="sourceLineNo">6195</span>    final byte[][] qualifiers = new byte[numQualifiers][];<a name="line.6195"></a>
-<span class="sourceLineNo">6196</span>    for (int i = 0; i &lt; numQualifiers; i++) {<a name="line.6196"></a>
-<span class="sourceLineNo">6197</span>      qualifiers[i] = Bytes.toBytes("qual" + i);<a name="line.6197"></a>
-<span class="sourceLineNo">6198</span>    }<a name="line.6198"></a>
-<span class="sourceLineNo">6199</span><a name="line.6199"></a>
-<span class="sourceLineNo">6200</span>    CONF.setInt("hbase.regionserver.wal.disruptor.event.count", 2);<a name="line.6200"></a>
-<span class="sourceLineNo">6201</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.6201"></a>
-<span class="sourceLineNo">6202</span>    try {<a name="line.6202"></a>
-<span class="sourceLineNo">6203</span>      List&lt;Thread&gt; threads = new ArrayList&lt;&gt;();<a name="line.6203"></a>
-<span class="sourceLineNo">6204</span>      for (int i = 0; i &lt; numRows; i++) {<a name="line.6204"></a>
-<span class="sourceLineNo">6205</span>        final int count = i;<a name="line.6205"></a>
-<span class="sourceLineNo">6206</span>        Thread t = new Thread(new Runnable() {<a name="line.6206"></a>
-<span class="sourceLineNo">6207</span><a name="line.6207"></a>
-<span class="sourceLineNo">6208</span>          @Override<a name="line.6208"></a>
-<span class="sourceLineNo">6209</span>          public void run() {<a name="line.6209"></a>
-<span class="sourceLineNo">6210</span>            byte[] row = Bytes.toBytes("row" + count);<a name="line.6210"></a>
-<span class="sourceLineNo">6211</span>            Put put = new Put(row);<a name="line.6211"></a>
-<span class="sourceLineNo">6212</span>            put.setDurability(Durability.SYNC_WAL);<a name="line.6212"></a>
-<span class="sourceLineNo">6213</span>            byte[] value = Bytes.toBytes(String.valueOf(count));<a name="line.6213"></a>
-<span class="sourceLineNo">6214</span>            for (byte[] family : families) {<a name="line.6214"></a>
-<span class="sourceLineNo">6215</span>              for (byte[] qualifier : qualifiers) {<a name="line.6215"></a>
-<span class="sourceLineNo">6216</span>                put.addColumn(family, qualifier, count, value);<a name="line.6216"></a>
-<span class="sourceLineNo">6217</span>              }<a name="line.6217"></a>
-<span class="sourceLineNo">6218</span>            }<a name="line.6218"></a>
-<span class="sourceLineNo">6219</span>            try {<a name="line.6219"></a>
-<span class="sourceLineNo">6220</span>              region.put(put);<a name="line.6220"></a>
-<span class="sourceLineNo">6221</span>            } catch (IOException e) {<a name="line.6221"></a>
-<span class="sourceLineNo">6222</span>              throw new RuntimeException(e);<a name="line.6222"></a>
-<span class="sourceLineNo">6223</span>            }<a name="line.6223"></a>
-<span class="sourceLineNo">6224</span>          }<a name="line.6224"></a>
-<span class="sourceLineNo">6225</span>        });<a name="line.6225"></a>
-<span class="sourceLineNo">6226</span>        threads.add(t);<a name="line.6226"></a>
-<span class="sourceLineNo">6227</span>      }<a name="line.6227"></a>
-<span class="sourceLineNo">6228</span>      for (Thread t : threads) {<a name="line.6228"></a>
-<span class="sourceLineNo">6229</span>        t.start();<a name="line.6229"></a>
-<span class="sourceLineNo">6230</span>      }<a name="line.6230"></a>
-<span class="sourceLineNo">6231</span><a name="line.6231"></a>
-<span class="sourceLineNo">6232</span>      for (int i = 0; i &lt; testCount; i++) {<a name="line.6232"></a>
-<span class="sourceLineNo">6233</span>        region.getWAL().rollWriter();<a name="line.6233"></a>
-<span class="sourceLineNo">6234</span>        Thread.yield();<a name="line.6234"></a>
-<span class="sourceLineNo">6235</span>      }<a name="line.6235"></a>
-<span class="sourceLineNo">6236</span>    } finally {<a name="line.6236"></a>
-<span class="sourceLineNo">6237</span>      try {<a name="line.6237"></a>
-<span class="sourceLineNo">6238</span>        HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.6238"></a>
-<span class="sourceLineNo">6239</span>        CONF.setInt("hbase.regionserver.wal.disruptor.event.count", 16 * 1024);<a name="line.6239"></a>
-<span class="sourceLineNo">6240</span>      } catch (DroppedSnapshotException dse) {<a name="line.6240"></a>
-<span class="sourceLineNo">6241</span>        // We could get this on way out because we interrupt the background flusher and it could<a name="line.6241"></a>
-<span class="sourceLineNo">6242</span>        // fail anywhere causing a DSE over in the background flusher... only it is not properly<a name="line.6242"></a>
-<span class="sourceLineNo">6243</span>        // dealt with so could still be memory hanging out when we get to here -- memory we can't<a name="line.6243"></a>
-<span class="sourceLineNo">6244</span>        // flush because the accounting is 'off' since original DSE.<a name="line.6244"></a>
+<span class="sourceLineNo">6181</span>    assertTrue(Bytes.equals(c.getValueArray(), c.getValueOffset(), c.getValueLength(),<a name="line.6181"></a>
+<span class="sourceLineNo">6182</span>      qual2, 0, qual2.length));<a name="line.6182"></a>
+<span class="sourceLineNo">6183</span>  }<a name="line.6183"></a>
+<span class="sourceLineNo">6184</span><a name="line.6184"></a>
+<span class="sourceLineNo">6185</span>  HRegion initHRegion(TableName tableName, String callingMethod,<a name="line.6185"></a>
+<span class="sourceLineNo">6186</span>      byte[]... families) throws IOException {<a name="line.6186"></a>
+<span class="sourceLineNo">6187</span>    return initHRegion(tableName, callingMethod, HBaseConfiguration.create(),<a name="line.6187"></a>
+<span class="sourceLineNo">6188</span>        families);<a name="line.6188"></a>
+<span class="sourceLineNo">6189</span>  }<a name="line.6189"></a>
+<span class="sourceLineNo">6190</span><a name="line.6190"></a>
+<span class="sourceLineNo">6191</span>  /**<a name="line.6191"></a>
+<span class="sourceLineNo">6192</span>   * HBASE-16429 Make sure no stuck if roll writer when ring buffer is filled with appends<a name="line.6192"></a>
+<span class="sourceLineNo">6193</span>   * @throws IOException if IO error occurred during test<a name="line.6193"></a>
+<span class="sourceLineNo">6194</span>   */<a name="line.6194"></a>
+<span class="sourceLineNo">6195</span>  @Test<a name="line.6195"></a>
+<span class="sourceLineNo">6196</span>  public void testWritesWhileRollWriter() throws IOException {<a name="line.6196"></a>
+<span class="sourceLineNo">6197</span>    int testCount = 10;<a name="line.6197"></a>
+<span class="sourceLineNo">6198</span>    int numRows = 1024;<a name="line.6198"></a>
+<span class="sourceLineNo">6199</span>    int numFamilies = 2;<a name="line.6199"></a>
+<span class="sourceLineNo">6200</span>    int numQualifiers = 2;<a name="line.6200"></a>
+<span class="sourceLineNo">6201</span>    final byte[][] families = new byte[numFamilies][];<a name="line.6201"></a>
+<span class="sourceLineNo">6202</span>    for (int i = 0; i &lt; numFamilies; i++) {<a name="line.6202"></a>
+<span class="sourceLineNo">6203</span>      families[i] = Bytes.toBytes("family" + i);<a name="line.6203"></a>
+<span class="sourceLineNo">6204</span>    }<a name="line.6204"></a>
+<span class="sourceLineNo">6205</span>    final byte[][] qualifiers = new byte[numQualifiers][];<a name="line.6205"></a>
+<span class="sourceLineNo">6206</span>    for (int i = 0; i &lt; numQualifiers; i++) {<a name="line.6206"></a>
+<span class="sourceLineNo">6207</span>      qualifiers[i] = Bytes.toBytes("qual" + i);<a name="line.6207"></a>
+<span class="sourceLineNo">6208</span>    }<a name="line.6208"></a>
+<span class="sourceLineNo">6209</span><a name="line.6209"></a>
+<span class="sourceLineNo">6210</span>    CONF.setInt("hbase.regionserver.wal.disruptor.event.count", 2);<a name="line.6210"></a>
+<span class="sourceLineNo">6211</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.6211"></a>
+<span class="sourceLineNo">6212</span>    try {<a name="line.6212"></a>
+<span class="sourceLineNo">6213</span>      List&lt;Thread&gt; threads = new ArrayList&lt;&gt;();<a name="line.6213"></a>
+<span class="sourceLineNo">6214</span>      for (int i = 0; i &lt; numRows; i++) {<a name="line.6214"></a>
+<span class="sourceLineNo">6215</span>        final int count = i;<a name="line.6215"></a>
+<span class="sourceLineNo">6216</span>        Thread t = new Thread(new Runnable() {<a name="line.6216"></a>
+<span class="sourceLineNo">6217</span><a name="line.6217"></a>
+<span class="sourceLineNo">6218</span>          @Override<a name="line.6218"></a>
+<span class="sourceLineNo">6219</span>          public void run() {<a name="line.6219"></a>
+<span class="sourceLineNo">6220</span>            byte[] row = Bytes.toBytes("row" + count);<a name="line.6220"></a>
+<span class="sourceLineNo">6221</span>            Put put = new Put(row);<a name="line.6221"></a>
+<span class="sourceLineNo">6222</span>            put.setDurability(Durability.SYNC_WAL);<a name="line.6222"></a>
+<span class="sourceLineNo">6223</span>            byte[] value = Bytes.toBytes(String.valueOf(count));<a name="line.6223"></a>
+<span class="sourceLineNo">6224</span>            for (byte[] family : families) {<a name="line.6224"></a>
+<span class="sourceLineNo">6225</span>              for (byte[] qualifier : qualifiers) {<a name="line.6225"></a>
+<span class="sourceLineNo">6226</span>                put.addColumn(family, qualifier, count, value);<a name="line.6226"></a>
+<span class="sourceLineNo">6227</span>              }<a name="line.6227"></a>
+<span class="sourceLineNo">6228</span>            }<a name="line.6228"></a>
+<span class="sourceLineNo">6229</span>            try {<a name="line.6229"></a>
+<span class="sourceLineNo">6230</span>              region.put(put);<a name="line.6230"></a>
+<span class="sourceLineNo">6231</span>            } catch (IOException e) {<a name="line.6231"></a>
+<span class="sourceLineNo">6232</span>              throw new RuntimeException(e);<a name="line.6232"></a>
+<span class="sourceLineNo">6233</span>            }<a name="line.6233"></a>
+<span class="sourceLineNo">6234</span>          }<a name="line.6234"></a>
+<span class="sourceLineNo">6235</span>        });<a name="line.6235"></a>
+<span class="sourceLineNo">6236</span>        threads.add(t);<a name="line.6236"></a>
+<span class="sourceLineNo">6237</span>      }<a name="line.6237"></a>
+<span class="sourceLineNo">6238</span>      for (Thread t : threads) {<a name="line.6238"></a>
+<span class="sourceLineNo">6239</span>        t.start();<a name="line.6239"></a>
+<span class="sourceLineNo">6240</span>      }<a name="line.6240"></a>
+<span class="sourceLineNo">6241</span><a name="line.6241"></a>
+<span class="sourceLineNo">6242</span>      for (int i = 0; i &lt; testCount; i++) {<a name="line.6242"></a>
+<span class="sourceLineNo">6243</span>        region.getWAL().rollWriter();<a name="line.6243"></a>
+<span class="sourceLineNo">6244</span>        Thread.yield();<a name="line.6244"></a>
 <span class="sourceLineNo">6245</span>      }<a name="line.6245"></a>
-<span class="sourceLineNo">6246</span>      this.region = null;<a name="line.6246"></a>
-<span class="sourceLineNo">6247</span>    }<a name="line.6247"></a>
-<span class="sourceLineNo">6248</span>  }<a name="line.6248"></a>
-<span class="sourceLineNo">6249</span><a name="line.6249"></a>
-<span class="sourceLineNo">6250</span>  @Test<a name="line.6250"></a>
-<span class="sourceLineNo">6251</span>  public void testMutateRow_WriteRequestCount() throws Exception {<a name="line.6251"></a>
-<span class="sourceLineNo">6252</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.6252"></a>
-<span class="sourceLineNo">6253</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.6253"></a>
-<span class="sourceLineNo">6254</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.6254"></a>
-<span class="sourceLineNo">6255</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.6255"></a>
-<span class="sourceLineNo">6256</span><a name="line.6256"></a>
-<span class="sourceLineNo">6257</span>    RowMutations rm = new RowMutations(row1);<a name="line.6257"></a>
-<span class="sourceLineNo">6258</span>    Put put = new Put(row1);<a name="line.6258"></a>
-<span class="sourceLineNo">6259</span>    put.addColumn(fam1, qf1, val1);<a name="line.6259"></a>
-<span class="sourceLineNo">6260</span>    rm.add(put);<a name="line.6260"></a>
-<span class="sourceLineNo">6261</span><a name="line.6261"></a>
-<span class="sourceLineNo">6262</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.6262"></a>
-<span class="sourceLineNo">6263</span>    long wrcBeforeMutate = this.region.writeRequestsCount.longValue();<a name="line.6263"></a>
-<span class="sourceLineNo">6264</span>    this.region.mutateRow(rm);<a name="line.6264"></a>
-<span class="sourceLineNo">6265</span>    long wrcAfterMutate = this.region.writeRequestsCount.longValue();<a name="line.6265"></a>
-<span class="sourceLineNo">6266</span>    Assert.assertEquals(wrcBeforeMutate + rm.getMutations().size(), wrcAfterMutate);<a name="line.6266"></a>
-<span class="sourceLineNo">6267</span>  }<a name="line.6267"></a>
-<span class="sourceLineNo">6268</span><a name="line.6268"></a>
-<span class="sourceLineNo">6269</span>  @Test<a name="line.6269"></a>
-<span class="sourceLineNo">6270</span>  public void testBulkLoadReplicationEnabled() throws IOException {<a name="line.6270"></a>
-<span class="sourceLineNo">6271</span>    TEST_UTIL.getConfiguration().setBoolean(HConstants.REPLICATION_BULKLOAD_ENABLE_KEY, true);<a name="line.6271"></a>
-<span class="sourceLineNo">6272</span>    final ServerName serverName = ServerName.valueOf(name.getMethodName(), 100, 42);<a name="line.6272"></a>
-<span class="sourceLineNo">6273</span>    final RegionServerServices rss = spy(TEST_UTIL.createMockRegionServerService(serverName));<a name="line.6273"></a>
-<span class="sourceLineNo">6274</span><a name="line.6274"></a>
-<span class="sourceLineNo">6275</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.6275"></a>
-<span class="sourceLineNo">6276</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.6276"></a>
-<span class="sourceLineNo">6277</span>    HRegionInfo hri = new HRegionInfo(htd.getTableName(),<a name="line.6277"></a>
-<span class="sourceLineNo">6278</span>        HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY);<a name="line.6278"></a>
-<span class="sourceLineNo">6279</span>    region = HRegion.openHRegion(hri, htd, rss.getWAL(hri), TEST_UTIL.getConfiguration(),<a name="line.6279"></a>
-<span class="sourceLineNo">6280</span>        rss, null);<a name="line.6280"></a>
-<span class="sourceLineNo">6281</span><a name="line.6281"></a>
-<span class="sourceLineNo">6282</span>    assertTrue(region.conf.getBoolean(HConstants.REPLICATION_BULKLOAD_ENABLE_KEY, false));<a name="line.6282"></a>
-<span class="sourceLineNo">6283</span>    String plugins = region.conf.get(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY, "");<a name="line.6283"></a>
-<span class="sourceLineNo">6284</span>    String replicationCoprocessorClass = ReplicationObserver.class.getCanonicalName();<a name="line.6284"></a>
-<span class="sourceLineNo">6285</span>    assertTrue(plugins.contains(replicationCoprocessorClass));<a name="line.6285"></a>
-<span class="sourceLineNo">6286</span>    assertTrue(region.getCoprocessorHost().<a name="line.6286"></a>
-<span class="sourceLineNo">6287</span>        getCoprocessors().contains(ReplicationObserver.class.getSimpleName()));<a name="line.6287"></a>
-<span class="sourceLineNo">6288</span>  }<a name="line.6288"></a>
-<span class="sourceLineNo">6289</span><a name="line.6289"></a>
-<span class="sourceLineNo">6290</span>  // make sure region is success close when coprocessor wrong region open failed<a name="line.6290"></a>
-<span class="sourceLineNo">6291</span>  @Test<a name="line.6291"></a>
-<span class="sourceLineNo">6292</span>  public void testOpenRegionFailedMemoryLeak() throws Exception {<a name="line.6292"></a>
-<span class="sourceLineNo">6293</span>    final ServerName serverName = ServerName.valueOf("testOpenRegionFailed", 100, 42);<a name="line.6293"></a>
-<span class="sourceLineNo">6294</span>    final RegionServerServices rss = spy(TEST_UTIL.createMockRegionServerService(serverName));<a name="line.6294"></a>
-<span class="sourceLineNo">6295</span><a name="line.6295"></a>
-<span class="sourceLineNo">6296</span>    HTableDescriptor htd<a name="line.6296"></a>
-<span class="sourceLineNo">6297</span>      = new HTableDescriptor(TableName.valueOf("testOpenRegionFailed"));<a name="line.6297"></a>
-<span class="sourceLineNo">6298</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.6298"></a>
-<span class="sourceLineNo">6299</span>    htd.setValue("COPROCESSOR$1", "hdfs://test/test.jar|test||");<a name="line.6299"></a>
-<span class="sourceLineNo">6300</span><a name="line.6300"></a>
-<span class="sourceLineNo">6301</span>    HRegionInfo hri = new HRegionInfo(htd.getTableName(),<a name="line.6301"></a>
-<span class="sourceLineNo">6302</span>      HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY);<a name="line.6302"></a>
-<span class="sourceLineNo">6303</span>    ScheduledExecutorService executor = CompatibilitySingletonFactory.<a name="line.6303"></a>
-<span class="sourceLineNo">6304</span>      getInstance(MetricsExecutor.class).getExecutor();<a name="line.6304"></a>
-<span class="sourceLineNo">6305</span>    for (int i = 0; i &lt; 20 ; i++) {<a name="line.6305"></a>
-<span class="sourceLineNo">6306</span>      try {<a name="line.6306"></a>
-<span class="sourceLineNo">6307</span>        HRegion.openHRegion(hri, htd, rss.getWAL(hri),<a name="line.6307"></a>
-<span class="sourceLineNo">6308</span>          TEST_UTIL.getConfiguration(), rss, null);<a name="line.6308"></a>
-<span class="sourceLineNo">6309</span>      }catch(Throwable t){<a name="line.6309"></a>
-<span class="sourceLineNo">6310</span>        LOG.info("Expected exception, continue");<a name="line.6310"></a>
-<span class="sourceLineNo">6311</span>      }<a name="line.6311"></a>
-<span class="sourceLineNo">6312</span>    }<a name="line.6312"></a>
-<span class="sourceLineNo">6313</span>    TimeUnit.SECONDS.sleep(MetricsRegionWrapperImpl.PERIOD);<a name="line.6313"></a>
-<span class="sourceLineNo">6314</span>    Field[] fields = ThreadPoolExecutor.class.getDeclaredFields();<a name="line.6314"></a>
-<span class="sourceLineNo">6315</span>    boolean found = false;<a name="line.6315"></a>
-<span class="sourceLineNo">6316</span>    for(Field field : fields){<a name="line.6316"></a>
-<span class="sourceLineNo">6317</span>      if(field.getName().equals("workQueue")){<a name="line.6317"></a>
-<span class="sourceLineNo">6318</span>        field.setAccessible(true);<a name="line.6318"></a>
-<span class="sourceLineNo">6319</span>        BlockingQueue&lt;Runnable&gt; workQueue = (BlockingQueue&lt;Runnable&gt;)field.get(executor);<a name="line.6319"></a>
-<span class="sourceLineNo">6320</span>        //there are still two task not cancel, can not cause to memory lack<a name="line.6320"></a>
-<span class="sourceLineNo">6321</span>        Assert.assertTrue("ScheduledExecutor#workQueue should equals 2, now is " +<a name="line.6321"></a>
-<span class="sourceLineNo">6322</span>          workQueue.size() + ", please check region is close", 2 == workQueue.size());<a name="line.6322"></a>
-<span class="sourceLineNo">6323</span>        found = true;<a name="line.6323"></a>
-<span class="sourceLineNo">6324</span>      }<a name="line.6324"></a>
-<span class="sourceLineNo">6325</span>    }<a name="line.6325"></a>
-<span class="sourceLineNo">6326</span>    Assert.assertTrue("can not find workQueue, test failed", found);<a name="line.6326"></a>
-<span class="sourceLineNo">6327</span>  }<a name="line.6327"></a>
-<span class="sourceLineNo">6328</span><a name="line.6328"></a>
-<span class="sourceLineNo">6329</span>  /**<a name="line.6329"></a>
-<span class="sourceLineNo">6330</span>   * The same as HRegion class, the only difference is that instantiateHStore will<a name="line.6330"></a>
-<span class="sourceLineNo">6331</span>   * create a different HStore - HStoreForTesting. [HBASE-8518]<a name="line.6331"></a>
-<span class="sourceLineNo">6332</span>   */<a name="line.6332"></a>
-<span class="sourceLineNo">6333</span>  public static class HRegionForTesting extends HRegion {<a name="line.6333"></a>
-<span class="sourceLineNo">6334</span><a name="line.6334"></a>
-<span class="sourceLineNo">6335</span>    public HRegionForTesting(final Path tableDir, final WAL wal, final FileSystem fs,<a name="line.6335"></a>
-<span class="sourceLineNo">6336</span>                             final Configuration confParam, final RegionInfo regionInfo,<a name="line.6336"></a>
-<span class="sourceLineNo">6337</span>                             final TableDescriptor htd, final RegionServerServices rsServices) {<a name="line.6337"></a>
-<span class="sourceLineNo">6338</span>      this(new HRegionFileSystem(confParam, fs, tableDir, regionInfo),<a name="line.6338"></a>
-<span class="sourceLineNo">6339</span>          wal, confParam, htd, rsServices);<a name="line.6339"></a>
-<span class="sourceLineNo">6340</span>    }<a name="line.6340"></a>
-<span class="sourceLineNo">6341</span><a name="line.6341"></a>
-<span class="sourceLineNo">6342</span>    public HRegionForTesting(HRegionFileSystem fs, WAL wal,<a name="line.6342"></a>
-<span class="sourceLineNo">6343</span>                             Configuration confParam, TableDescriptor htd,<a name="line.6343"></a>
-<span class="sourceLineNo">6344</span>                             RegionServerServices rsServices) {<a name="line.6344"></a>
-<span class="sourceLineNo">6345</span>      super(fs, wal, confParam, htd, rsServices);<a name="line.6345"></a>
-<span class="sourceLineNo">6346</span>    }<a name="line.6346"></a>
-<span class="sourceLineNo">6347</span><a name="line.6347"></a>
-<span class="sourceLineNo">6348</span>    /**<a name="line.6348"></a>
-<span class="sourceLineNo">6349</span>     * Create HStore instance.<a name="line.6349"></a>
-<span class="sourceLineNo">6350</span>     * @return If Mob is enabled, return HMobStore, otherwise return HStoreForTesting.<a name="line.6350"></a>
-<span class="sourceLineNo">6351</span>     */<a name="line.6351"></a>
-<span class="sourceLineNo">6352</span>    @Override<a name="line.6352"></a>
-<span class="sourceLineNo">6353</span>    protected HStore instantiateHStore(final ColumnFamilyDescriptor family, boolean warmup)<a name="line.6353"></a>
-<span class="sourceLineNo">6354</span>        throws IOException {<a name="line.6354"></a>
-<span class="sourceLineNo">6355</span>      if (family.isMobEnabled()) {<a name="line.6355"></a>
-<span class="sourceLineNo">6356</span>        if (HFile.getFormatVersion(this.conf) &lt; HFile.MIN_FORMAT_VERSION_WITH_TAGS) {<a name="line.6356"></a>
-<span class="sourceLineNo">6357</span>          throw new IOException("A minimum HFile version of " + HFile.MIN_FORMAT_VERSION_WITH_TAGS +<a name="line.6357"></a>
-<span class="sourceLineNo">6358</span>              " is required for MOB feature. Consider setting " + HFile.FORMAT_VERSION_KEY +<a name="line.6358"></a>
-<span class="sourceLineNo">6359</span>              " accordingly.");<a name="line.6359"></a>
-<span class="sourceLineNo">6360</span>        }<a name="line.6360"></a>
-<span class="sourceLineNo">6361</span>        return new HMobStore(this, family, this.conf, warmup);<a name="line.6361"></a>
-<span class="sourceLineNo">6362</span>      }<a name="line.6362"></a>
-<span class="sourceLineNo">6363</span>      return new HStoreForTesting(this, family, this.conf, warmup);<a name="line.6363"></a>
-<span class="sourceLineNo">6364</span>    }<a name="line.6364"></a>
-<span class="sourceLineNo">6365</span>  }<a name="line.6365"></a>
-<span class="sourceLineNo">6366</span><a name="line.6366"></a>
-<span class="sourceLineNo">6367</span>  /**<a name="line.6367"></a>
-<span class="sourceLineNo">6368</span>   * HStoreForTesting is merely the same as HStore, the difference is in the doCompaction method<a name="line.6368"></a>
-<span class="sourceLineNo">6369</span>   * of HStoreForTesting there is a checkpoint "hbase.hstore.compaction.complete" which<a name="line.6369"></a>
-<span class="sourceLineNo">6370</span>   * doesn't let hstore compaction complete. In the former edition, this config is set in<a name="line.6370"></a>
-<span class="sourceLineNo">6371</span>   * HStore class inside compact method, though this is just for testing, otherwise it<a name="line.6371"></a>
-<span class="sourceLineNo">6372</span>   * doesn't do any help. In HBASE-8518, we try to get rid of all "hbase.hstore.compaction.complete"<a name="line.6372"></a>
-<span class="sourceLineNo">6373</span>   * config (except for testing code).<a name="line.6373"></a>
-<span class="sourceLineNo">6374</span>   */<a name="line.6374"></a>
-<span class="sourceLineNo">6375</span>  public static class HStoreForTesting extends HStore {<a name="line.6375"></a>
+<span class="sourceLineNo">6246</span>    } finally {<a name="line.6246"></a>
+<span class="sourceLineNo">6247</span>      try {<a name="line.6247"></a>
+<span class="sourceLineNo">6248</span>        HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.6248"></a>
+<span class="sourceLineNo">6249</span>        CONF.setInt("hbase.regionserver.wal.disruptor.event.count", 16 * 1024);<a name="line.6249"></a>
+<span class="sourceLineNo">6250</span>      } catch (DroppedSnapshotException dse) {<a name="line.6250"></a>
+<span class="sourceLineNo">6251</span>        // We could get this on way out because we interrupt the background flusher and it could<a name="line.6251"></a>
+<span class="sourceLineNo">6252</span>        // fail anywhere causing a DSE over in the background flusher... only it is not properly<a name="line.6252"></a>
+<span class="sourceLineNo">6253</span>        // dealt with so could still be memory hanging out when we get to here -- memory we can't<a name="line.6253"></a>
+<span class="sourceLineNo">6254</span>        // flush because the accounting is 'off' since original DSE.<a name="line.6254"></a>
+<span class="sourceLineNo">6255</span>      }<a name="line.6255"></a>
+<span class="sourceLineNo">6256</span>      this.region = null;<a name="line.6256"></a>
+<span class="sourceLineNo">6257</span>    }<a name="line.6257"></a>
+<span class="sourceLineNo">6258</span>  }<a name="line.6258"></a>
+<span class="sourceLineNo">6259</span><a name="line.6259"></a>
+<span class="sourceLineNo">6260</span>  @Test<a name="line.6260"></a>
+<span class="sourceLineNo">6261</span>  public void testMutateRow_WriteRequestCount() throws Exception {<a name="line.6261"></a>
+<span class="sourceLineNo">6262</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.6262"></a>
+<span class="sourceLineNo">6263</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.6263"></a>
+<span class="sourceLineNo">6264</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.6264"></a>
+<span class="sourceLineNo">6265</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.6265"></a>
+<span class="sourceLineNo">6266</span><a name="line.6266"></a>
+<span class="sourceLineNo">6267</span>    RowMutations rm = new RowMutations(row1);<a name="line.6267"></a>
+<span class="sourceLineNo">6268</span>    Put put = new Put(row1);<a name="line.6268"></a>
+<span class="sourceLineNo">6269</span>    put.addColumn(fam1, qf1, val1);<a name="line.6269"></a>
+<span class="sourceLineNo">6270</span>    rm.add(put);<a name="line.6270"></a>
+<span class="sourceLineNo">6271</span><a name="line.6271"></a>
+<span class="sourceLineNo">6272</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.6272"></a>
+<span class="sourceLineNo">6273</span>    long wrcBeforeMutate = this.region.writeRequestsCount.longValue();<a name="line.6273"></a>
+<span class="sourceLineNo">6274</span>    this.region.mutateRow(rm);<a name="line.6274"></a>
+<span class="sourceLineNo">6275</span>    long wrcAfterMutate = this.region.writeRequestsCount.longValue();<a name="line.6275"></a>
+<span class="sourceLineNo">6276</span>    Assert.assertEquals(wrcBeforeMutate + rm.getMutations().size(), wrcAfterMutate);<a name="line.6276"></a>
+<span class="sourceLineNo">6277</span>  }<a name="line.6277"></a>
+<span class="sourceLineNo">6278</span><a name="line.6278"></a>
+<span class="sourceLineNo">6279</span>  @Test<a name="line.6279"></a>
+<span class="sourceLineNo">6280</span>  public void testBulkLoadReplicationEnabled() throws IOException {<a name="line.6280"></a>
+<span class="sourceLineNo">6281</span>    TEST_UTIL.getConfiguration().setBoolean(HConstants.REPLICATION_BULKLOAD_ENABLE_KEY, true);<a name="line.6281"></a>
+<span class="sourceLineNo">6282</span>    final ServerName serverName = ServerName.valueOf(name.getMethodName(), 100, 42);<a name="line.6282"></a>
+<span class="sourceLineNo">6283</span>    final RegionServerServices rss = spy(TEST_UTIL.createMockRegionServerService(serverName));<a name="line.6283"></a>
+<span class="sourceLineNo">6284</span><a name="line.6284"></a>
+<span class="sourceLineNo">6285</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.6285"></a>
+<span class="sourceLineNo">6286</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.6286"></a>
+<span class="sourceLineNo">6287</span>    HRegionInfo hri = new HRegionInfo(htd.getTableName(),<a name="line.6287"></a>
+<span class="sourceLineNo">6288</span>        HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY);<a name="line.6288"></a>
+<span class="sourceLineNo">6289</span>    region = HRegion.openHRegion(hri, htd, rss.getWAL(hri), TEST_UTIL.getConfiguration(),<a name="line.6289"></a>
+<span class="sourceLineNo">6290</span>        rss, null);<a name="line.6290"></a>
+<span class="sourceLineNo">6291</span><a name="line.6291"></a>
+<span class="sourceLineNo">6292</span>    assertTrue(region.conf.getBoolean(HConstants.REPLICATION_BULKLOAD_ENABLE_KEY, false));<a name="line.6292"></a>
+<span class="sourceLineNo">6293</span>    String plugins = region.conf.get(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY, "");<a name="line.6293"></a>
+<span class="sourceLineNo">6294</span>    String replicationCoprocessorClass = ReplicationObserver.class.getCanonicalName();<a name="line.6294"></a>
+<span class="sourceLineNo">6295</span>    assertTrue(plugins.contains(replicationCoprocessorClass));<a name="line.6295"></a>
+<span class="sourceLineNo">6296</span>    assertTrue(region.getCoprocessorHost().<a name="line.6296"></a>
+<span class="sourceLineNo">6297</span>        getCoprocessors().contains(ReplicationObserver.class.getSimpleName()));<a name="line.6297"></a>
+<span class="sourceLineNo">6298</span>  }<a name="line.6298"></a>
+<span class="sourceLineNo">6299</span><a name="line.6299"></a>
+<span class="sourceLineNo">6300</span>  // make sure region is success close when coprocessor wrong region open failed<a name="line.6300"></a>
+<span class="sourceLineNo">6301</span>  @Test<a name="line.6301"></a>
+<span class="sourceLineNo">6302</span>  public void testOpenRegionFailedMemoryLeak() throws Exception {<a name="line.6302"></a>
+<span class="sourceLineNo">6303</span>    final ServerName serverName = ServerName.valueOf("testOpenRegionFailed", 100, 42);<a name="line.6303"></a>
+<span class="sourceLineNo">6304</span>    final RegionServerServices rss = spy(TEST_UTIL.createMockRegionServerService(serverName));<a name="line.6304"></a>
+<span class="sourceLineNo">6305</span><a name="line.6305"></a>
+<span class="sourceLineNo">6306</span>    HTableDescriptor htd<a name="line.6306"></a>
+<span class="sourceLineNo">6307</span>      = new HTableDescriptor(TableName.valueOf("testOpenRegionFailed"));<a name="line.6307"></a>
+<span class="sourceLineNo">6308</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.6308"></a>
+<span class="sourceLineNo">6309</span>    htd.setValue("COPROCESSOR$1", "hdfs://test/test.jar|test||");<a name="line.6309"></a>
+<span class="sourceLineNo">6310</span><a name="line.6310"></a>
+<span class="sourceLineNo">6311</span>    HRegionInfo hri = new HRegionInfo(htd.getTableName(),<a name="line.6311"></a>
+<span class="sourceLineNo">6312</span>      HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY);<a name="line.6312"></a>
+<span class="sourceLineNo">6313</span>    ScheduledExecutorService executor = CompatibilitySingletonFactory.<a name="line.6313"></a>
+<span class="sourceLineNo">6314</span>      getInstance(MetricsExecutor.class).getExecutor();<a name="line.6314"></a>
+<span class="sourceLineNo">6315</span>    for (int i = 0; i &lt; 20 ; i++) {<a name="line.6315"></a>
+<span class="sourceLineNo">6316</span>      try {<a name="line.6316"></a>
+<span class="sourceLineNo">6317</span>        HRegion.openHRegion(hri, htd, rss.getWAL(hri),<a name="line.6317"></a>
+<span class="sourceLineNo">6318</span>          TEST_UTIL.getConfiguration(), rss, null);<a name="line.6318"></a>
+<span class="sourceLineNo">6319</span>      }catch(Throwable t){<a name="line.6319"></a>
+<span class="sourceLineNo">6320</span>        LOG.info("Expected exception, continue");<a name="line.6320"></a>
+<span class="sourceLineNo">6321</span>      }<a name="line.6321"></a>
+<span class="sourceLineNo">6322</span>    }<a name="line.6322"></a>
+<span class="sourceLineNo">6323</span>    TimeUnit.SECONDS.sleep(MetricsRegionWrapperImpl.PERIOD);<a name="line.6323"></a>
+<span class="sourceLineNo">6324</span>    Field[] fields = ThreadPoolExecutor.class.getDeclaredFields();<a name="line.6324"></a>
+<span class="sourceLineNo">6325</span>    boolean found = false;<a name="line.6325"></a>
+<span class="sourceLineNo">6326</span>    for(Field field : fields){<a name="line.6326"></a>
+<span class="sourceLineNo">6327</span>      if(field.getName().equals("workQueue")){<a name="line.6327"></a>
+<span class="sourceLineNo">6328</span>        field.setAccessible(true);<a name="line.6328"></a>
+<span class="sourceLineNo">6329</span>        BlockingQueue&lt;Runnable&gt; workQueue = (BlockingQueue&lt;Runnable&gt;)field.get(executor);<a name="line.6329"></a>
+<span class="sourceLineNo">6330</span>        //there are still two task not cancel, can not cause to memory lack<a name="line.6330"></a>
+<span class="sourceLineNo">6331</span>        Assert.assertTrue("ScheduledExecutor#workQueue should equals 2, now is " +<a name="line.6331"></a>
+<span class="sourceLineNo">6332</span>          workQueue.size() + ", please check region is close", 2 == workQueue.size());<a name="line.6332"></a>
+<span class="sourceLineNo">6333</span>        found = true;<a name="line.6333"></a>
+<span class="sourceLineNo">6334</span>      }<a name="line.6334"></a>
+<span class="sourceLineNo">6335</span>    }<a name="line.6335"></a>
+<span class="sourceLineNo">6336</span>    Assert.assertTrue("can not find workQueue, test failed", found);<a name="line.6336"></a>
+<span class="sourceLineNo">6337</span>  }<a name="line.6337"></a>
+<span class="sourceLineNo">6338</span><a name="line.6338"></a>
+<span class="sourceLineNo">6339</span>  /**<a name="line.6339"></a>
+<span class="sourceLineNo">6340</span>   * The same as HRegion class, the only difference is that instantiateHStore will<a name="line.6340"></a>
+<span class="sourceLineNo">6341</span>   * create a different HStore - HStoreForTesting. [HBASE-8518]<a name="line.6341"></a>
+<span class="sourceLineNo">6342</span>   */<a name="line.6342"></a>
+<span class="sourceLineNo">6343</span>  public static class HRegionForTesting extends HRegion {<a name="line.6343"></a>
+<span class="sourceLineNo">6344</span><a name="line.6344"></a>
+<span class="sourceLineNo">6345</span>    public HRegionForTesting(final Path tableDir, final WAL wal, final FileSystem fs,<a name="line.6345"></a>
+<span class="sourceLineNo">6346</span>                             final Configuration confParam, final RegionInfo regionInfo,<a name="line.6346"></a>
+<span class="sourceLineNo">6347</span>                             final TableDescriptor htd, final RegionServerServices rsServices) {<a name="line.6347"></a>
+<span class="sourceLineNo">6348</span>      this(new HRegionFileSystem(confParam, fs, tableDir, regionInfo),<a name="line.6348"></a>
+<span class="sourceLineNo">6349</span>          wal, confParam, htd, rsServices);<a name="line.6349"></a>
+<span class="sourceLineNo">6350</span>    }<a name="line.6350"></a>
+<span class="sourceLineNo">6351</span><a name="line.6351"></a>
+<span class="sourceLineNo">6352</span>    public HRegionForTesting(HRegionFileSystem fs, WAL wal,<a name="line.6352"></a>
+<span class="sourceLineNo">6353</span>                             Configuration confParam, TableDescriptor htd,<a name="line.6353"></a>
+<span class="sourceLineNo">6354</span>                             RegionServerServices rsServices) {<a name="line.6354"></a>
+<span class="sourceLineNo">6355</span>      super(fs, wal, confParam, htd, rsServices);<a name="line.6355"></a>
+<span class="sourceLineNo">6356</span>    }<a name="line.6356"></a>
+<span class="sourceLineNo">6357</span><a name="line.6357"></a>
+<span class="sourceLineNo">6358</span>    /**<a name="line.6358"></a>
+<span class="sourceLineNo">6359</span>     * Create HStore instance.<a name="line.6359"></a>
+<span class="sourceLineNo">6360</span>     * @return If Mob is enabled, return HMobStore, otherwise return HStoreForTesting.<a name="line.6360"></a>
+<span class="sourceLineNo">6361</span>     */<a name="line.6361"></a>
+<span class="sourceLineNo">6362</span>    @Override<a name="line.6362"></a>
+<span class="sourceLineNo">6363</span>    protected HStore instantiateHStore(final ColumnFamilyDescriptor family, boolean warmup)<a name="line.6363"></a>
+<span class="sourceLineNo">6364</span>        throws IOException {<a name="line.6364"></a>
+<span class="sourceLineNo">6365</span>      if (family.isMobEnabled()) {<a name="line.6365"></a>
+<span class="sourceLineNo">6366</span>        if (HFile.getFormatVersion(this.conf) &lt; HFile.MIN_FORMAT_VERSION_WITH_TAGS) {<a name="line.6366"></a>
+<span class="sourceLineNo">6367</span>          throw new IOException("A minimum HFile version of " + HFile.MIN_FORMAT_VERSION_WITH_TAGS +<a name="line.6367"></a>
+<span class="sourceLineNo">6368</span>              " is required for MOB feature. Consider setting " + HFile.FORMAT_VERSION_KEY +<a name="line.6368"></a>
+<span class="sourceLineNo">6369</span>              " accordingly.");<a name="line.6369"></a>
+<span class="sourceLineNo">6370</span>        }<a name="line.6370"></a>
+<span class="sourceLineNo">6371</span>        return new HMobStore(this, family, this.conf, warmup);<a name="line.6371"></a>
+<span class="sourceLineNo">6372</span>      }<a name="line.6372"></a>
+<span class="sourceLineNo">6373</span>      return new HStoreForTesting(this, family, this.conf, warmup);<a name="line.6373"></a>
+<span class="sourceLineNo">6374</span>    }<a name="line.6374"></a>
+<span class="sourceLineNo">6375</span>  }<a name="line.6375"></a>
 <span class="sourceLineNo">6376</span><a name="line.6376"></a>
-<span class="sourceLineNo">6377</span>    protected HStoreForTesting(final HRegion region,<a name="line.6377"></a>
-<span class="sourceLineNo">6378</span>        final ColumnFamilyDescriptor family,<a name="line.6378"></a>
-<span class="sourceLineNo">6379</span>        final Configuration confParam, boolean warmup) throws IOException {<a name="line.6379"></a>
-<span class="sourceLineNo">6380</span>      super(region, family, confParam, warmup);<a name="line.6380"></a>
-<span class="sourceLineNo">6381</span>    }<a name="line.6381"></a>
-<span class="sourceLineNo">6382</span><a name="line.6382"></a>
-<span class="sourceLineNo">6383</span>    @Override<a name="line.6383"></a>
-<span class="sourceLineNo">6384</span>    protected List&lt;HStoreFile&gt; doCompaction(CompactionRequestImpl cr,<a name="line.6384"></a>
-<span class="sourceLineNo">6385</span>        Collection&lt;HStoreFile&gt; filesToCompact, User user, long compactionStartTime,<a name="line.6385"></a>
-<span class="sourceLineNo">6386</span>        List&lt;Path&gt; newFiles) throws IOException {<a name="line.6386"></a>
-<span class="sourceLineNo">6387</span>      // let compaction incomplete.<a name="line.6387"></a>
-<span class="sourceLineNo">6388</span>      if (!this.conf.getBoolean("hbase.hstore.compaction.complete", true)) {<a name="line.6388"></a>
-<span class="sourceLineNo">6389</span>        LOG.warn("hbase.hstore.compaction.complete is set to false");<a name="line.6389"></a>
-<span class="sourceLineNo">6390</span>        List&lt;HStoreFile&gt; sfs = new ArrayList&lt;&gt;(newFiles.size());<a name="line.6390"></a>
-<span class="sourceLineNo">6391</span>        final boolean evictOnClose =<a name="line.6391"></a>
-<span class="sourceLineNo">6392</span>            cacheConf != null? cacheConf.shouldEvictOnClose(): true;<a name="line.6392"></a>
-<span class="sourceLineNo">6393</span>        for (Path newFile : newFiles) {<a name="line.6393"></a>
-<span class="sourceLineNo">6394</span>          // Create storefile around what we wrote with a reader on it.<a name="line.6394"></a>
-<span class="sourceLineNo">6395</span>          HStoreFile sf = createStoreFileAndReader(newFile);<a name="line.6395"></a>
-<span class="sourceLineNo">6396</span>          sf.closeStoreFile(evictOnClose);<a name="line.6396"></a>
-<span class="sourceLineNo">6397</span>          sfs.add(sf);<a name="line.6397"></a>
-<span class="sourceLineNo">6398</span>        }<a name="line.6398"></a>
-<span class="sourceLineNo">6399</span>        return sfs;<a name="line.6399"></a>
-<span class="sourceLineNo">6400</span>      }<a name="line.6400"></a>
-<span class="sourceLineNo">6401</span>      return super.doCompaction(cr, filesToCompact, user, compactionStartTime, newFiles);<a name="line.6401"></a>
-<span class="sourceLineNo">6402</span>    }<a name="line.6402"></a>
-<span class="sourceLineNo">6403</span>  }<a name="line.6403"></a>
-<span class="sourceLineNo">6404</span>}<a name="line.6404"></a>
+<span class="sourceLineNo">6377</span>  /**<a name="line.6377"></a>
+<span class="sourceLineNo">6378</span>   * HStoreForTesting is merely the same as HStore, the difference is in the doCompaction method<a name="line.6378"></a>
+<span class="sourceLineNo">6379</span>   * of HStoreForTesting there is a checkpoint "hbase.hstore.compaction.complete" which<a name="line.6379"></a>
+<span class="sourceLineNo">6380</span>   * doesn't let hstore compaction complete. In the former edition, this config is set in<a name="line.6380"></a>
+<span class="sourceLineNo">6381</span>   * HStore class inside compact method, though this is just for testing, otherwise it<a name="line.6381"></a>
+<span class="sourceLineNo">6382</span>   * doesn't do any help. In HBASE-8518, we try to get rid of all "hbase.hstore.compaction.complete"<a name="line.6382"></a>
+<span class="sourceLineNo">6383</span>   * config (except for testing code).<a name="line.6383"></a>
+<span class="sourceLineNo">6384</span>   */<a name="line.6384"></a>
+<span class="sourceLineNo">6385</span>  public static class HStoreForTesting extends HStore {<a name="line.6385"></a>
+<span class="sourceLineNo">6386</span><a name="line.6386"></a>
+<span class="sourceLineNo">6387</span>    protected HStoreForTesting(final HRegion region,<a name="line.6387"></a>
+<span class="sourceLineNo">6388</span>        final ColumnFamilyDescriptor family,<a name="line.6388"></a>
+<span class="sourceLineNo">6389</span>        final Configuration confParam, boolean warmup) throws IOException {<a name="line.6389"></a>
+<span class="sourceLineNo">6390</span>      super(region, family, confParam, warmup);<a name="line.6390"></a>
+<span class="sourceLineNo">6391</span>    }<a name="line.6391"></a>
+<span class="sourceLineNo">6392</span><a name="line.6392"></a>
+<span class="sourceLineNo">6393</span>    @Override<a name="line.6393"></a>
+<span class="sourceLineNo">6394</span>    protected List&lt;HStoreFile&gt; doCompaction(CompactionRequestImpl cr,<a name="line.6394"></a>
+<span class="sourceLineNo">6395</span>        Collection&lt;HStoreFile&gt; filesToCompact, User user, long compactionStartTime,<a name="line.6395"></a>
+<span class="sourceLineNo">6396</span>        List&lt;Path&gt; newFiles) throws IOException {<a name="line.6396"></a>
+<span class="sourceLineNo">6397</span>      // let compaction incomplete.<a name="line.6397"></a>
+<span class="sourceLineNo">6398</span>      if (!this.conf.getBoolean("hbase.hstore.compaction.complete", true)) {<a name="line.6398"></a>
+<span class="sourceLineNo">6399</span>        LOG.warn("hbase.hstore.compaction.complete is set to false");<a name="line.6399"></a>
+<span class="sourceLineNo">6400</span>        List&lt;HStoreFile&gt; sfs = new ArrayList&lt;&gt;(newFiles.size());<a name="line.6400"></a>
+<span class="sourceLineNo">6401</span>        final boolean evictOnClose =<a name="line.6401"></a>
+<span class="sourceLineNo">6402</span>            cacheConf != null? cacheConf.shouldEvictOnClose(): true;<a name="line.6402"></a>
+<span class="sourceLineNo">6403</span>        for (Path newFile : newFiles) {<a name="line.6403"></a>
+<span class="sourceLineNo">6404</span>          // Create storefile around what we wrote with a reader on it.<a name="line.6404"></a>
+<span class="sourceLineNo">6405</span>          HStoreFile sf = createStoreFileAndReader(newFile);<a name="line.6405"></a>
+<span class="sourceLineNo">6406</span>          sf.closeStoreFile(evictOnClose);<a name="line.6406"></a>
+<span class="sourceLineNo">6407</span>          sfs.add(sf);<a name="line.6407"></a>
+<span class="sourceLineNo">6408</span>        }<a name="line.6408"></a>
+<span class="sourceLineNo">6409</span>        return sfs;<a name="line.6409"></a>
+<span class="sourceLineNo">6410</span>      }<a name="line.6410"></a>
+<span class="sourceLineNo">6411</span>      return super.doCompaction(cr, filesToCompact, user, compactionStartTime, newFiles);<a name="line.6411"></a>
+<span class="sourceLineNo">6412</span>    }<a name="line.6412"></a>
+<span class="sourceLineNo">6413</span>  }<a name="line.6413"></a>
+<span class="sourceLineNo">6414</span>}<a name="line.6414"></a>
 
 
 
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html
index ddde350..77be719 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html
@@ -112,68 +112,68 @@
 <span class="sourceLineNo">104</span>import org.apache.hadoop.hbase.Waiter;<a name="line.104"></a>
 <span class="sourceLineNo">105</span>import org.apache.hadoop.hbase.client.Append;<a name="line.105"></a>
 <span class="sourceLineNo">106</span>import org.apache.hadoop.hbase.client.ColumnFamilyDescriptor;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.apache.hadoop.hbase.client.Get;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.110"></a>
-<span class="sourceLineNo">111</span>import org.apache.hadoop.hbase.client.Mutation;<a name="line.111"></a>
-<span class="sourceLineNo">112</span>import org.apache.hadoop.hbase.client.Put;<a name="line.112"></a>
-<span class="sourceLineNo">113</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.113"></a>
-<span class="sourceLineNo">114</span>import org.apache.hadoop.hbase.client.RegionInfoBuilder;<a name="line.114"></a>
-<span class="sourceLineNo">115</span>import org.apache.hadoop.hbase.client.Result;<a name="line.115"></a>
-<span class="sourceLineNo">116</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.116"></a>
-<span class="sourceLineNo">117</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.117"></a>
-<span class="sourceLineNo">118</span>import org.apache.hadoop.hbase.client.Table;<a name="line.118"></a>
-<span class="sourceLineNo">119</span>import org.apache.hadoop.hbase.client.TableDescriptor;<a name="line.119"></a>
-<span class="sourceLineNo">120</span>import org.apache.hadoop.hbase.coprocessor.CoprocessorHost;<a name="line.120"></a>
-<span class="sourceLineNo">121</span>import org.apache.hadoop.hbase.exceptions.FailedSanityCheckException;<a name="line.121"></a>
-<span class="sourceLineNo">122</span>import org.apache.hadoop.hbase.filter.BigDecimalComparator;<a name="line.122"></a>
-<span class="sourceLineNo">123</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.123"></a>
-<span class="sourceLineNo">124</span>import org.apache.hadoop.hbase.filter.ColumnCountGetFilter;<a name="line.124"></a>
-<span class="sourceLineNo">125</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.125"></a>
-<span class="sourceLineNo">126</span>import org.apache.hadoop.hbase.filter.FilterBase;<a name="line.126"></a>
-<span class="sourceLineNo">127</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.127"></a>
-<span class="sourceLineNo">128</span>import org.apache.hadoop.hbase.filter.NullComparator;<a name="line.128"></a>
-<span class="sourceLineNo">129</span>import org.apache.hadoop.hbase.filter.PrefixFilter;<a name="line.129"></a>
-<span class="sourceLineNo">130</span>import org.apache.hadoop.hbase.filter.SingleColumnValueExcludeFilter;<a name="line.130"></a>
-<span class="sourceLineNo">131</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.131"></a>
-<span class="sourceLineNo">132</span>import org.apache.hadoop.hbase.filter.SubstringComparator;<a name="line.132"></a>
-<span class="sourceLineNo">133</span>import org.apache.hadoop.hbase.filter.ValueFilter;<a name="line.133"></a>
-<span class="sourceLineNo">134</span>import org.apache.hadoop.hbase.io.hfile.HFile;<a name="line.134"></a>
-<span class="sourceLineNo">135</span>import org.apache.hadoop.hbase.monitoring.MonitoredRPCHandler;<a name="line.135"></a>
-<span class="sourceLineNo">136</span>import org.apache.hadoop.hbase.monitoring.MonitoredTask;<a name="line.136"></a>
-<span class="sourceLineNo">137</span>import org.apache.hadoop.hbase.monitoring.TaskMonitor;<a name="line.137"></a>
-<span class="sourceLineNo">138</span>import org.apache.hadoop.hbase.regionserver.HRegion.MutationBatchOperation;<a name="line.138"></a>
-<span class="sourceLineNo">139</span>import org.apache.hadoop.hbase.regionserver.HRegion.RegionScannerImpl;<a name="line.139"></a>
-<span class="sourceLineNo">140</span>import org.apache.hadoop.hbase.regionserver.Region.RowLock;<a name="line.140"></a>
-<span class="sourceLineNo">141</span>import org.apache.hadoop.hbase.regionserver.TestHStore.FaultyFileSystem;<a name="line.141"></a>
-<span class="sourceLineNo">142</span>import org.apache.hadoop.hbase.regionserver.compactions.CompactionRequestImpl;<a name="line.142"></a>
-<span class="sourceLineNo">143</span>import org.apache.hadoop.hbase.regionserver.wal.FSHLog;<a name="line.143"></a>
-<span class="sourceLineNo">144</span>import org.apache.hadoop.hbase.regionserver.wal.MetricsWALSource;<a name="line.144"></a>
-<span class="sourceLineNo">145</span>import org.apache.hadoop.hbase.regionserver.wal.WALUtil;<a name="line.145"></a>
-<span class="sourceLineNo">146</span>import org.apache.hadoop.hbase.replication.regionserver.ReplicationObserver;<a name="line.146"></a>
-<span class="sourceLineNo">147</span>import org.apache.hadoop.hbase.security.User;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>import org.apache.hadoop.hbase.test.MetricsAssertHelper;<a name="line.148"></a>
-<span class="sourceLineNo">149</span>import org.apache.hadoop.hbase.testclassification.LargeTests;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>import org.apache.hadoop.hbase.testclassification.VerySlowRegionServerTests;<a name="line.150"></a>
-<span class="sourceLineNo">151</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.151"></a>
-<span class="sourceLineNo">152</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.152"></a>
-<span class="sourceLineNo">153</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManagerTestHelper;<a name="line.153"></a>
-<span class="sourceLineNo">154</span>import org.apache.hadoop.hbase.util.FSUtils;<a name="line.154"></a>
-<span class="sourceLineNo">155</span>import org.apache.hadoop.hbase.util.IncrementingEnvironmentEdge;<a name="line.155"></a>
-<span class="sourceLineNo">156</span>import org.apache.hadoop.hbase.util.ManualEnvironmentEdge;<a name="line.156"></a>
-<span class="sourceLineNo">157</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.157"></a>
-<span class="sourceLineNo">158</span>import org.apache.hadoop.hbase.wal.AbstractFSWALProvider;<a name="line.158"></a>
-<span class="sourceLineNo">159</span>import org.apache.hadoop.hbase.wal.FaultyFSLog;<a name="line.159"></a>
-<span class="sourceLineNo">160</span>import org.apache.hadoop.hbase.wal.NettyAsyncFSWALConfigHelper;<a name="line.160"></a>
-<span class="sourceLineNo">161</span>import org.apache.hadoop.hbase.wal.WAL;<a name="line.161"></a>
-<span class="sourceLineNo">162</span>import org.apache.hadoop.hbase.wal.WALEdit;<a name="line.162"></a>
-<span class="sourceLineNo">163</span>import org.apache.hadoop.hbase.wal.WALFactory;<a name="line.163"></a>
-<span class="sourceLineNo">164</span>import org.apache.hadoop.hbase.wal.WALKeyImpl;<a name="line.164"></a>
-<span class="sourceLineNo">165</span>import org.apache.hadoop.hbase.wal.WALProvider;<a name="line.165"></a>
-<span class="sourceLineNo">166</span>import org.apache.hadoop.hbase.wal.WALProvider.Writer;<a name="line.166"></a>
-<span class="sourceLineNo">167</span>import org.apache.hadoop.hbase.wal.WALSplitUtil;<a name="line.167"></a>
-<span class="sourceLineNo">168</span>import org.apache.hadoop.hbase.wal.WALSplitter;<a name="line.168"></a>
+<span class="sourceLineNo">107</span>import org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>import org.apache.hadoop.hbase.client.Get;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.111"></a>
+<span class="sourceLineNo">112</span>import org.apache.hadoop.hbase.client.Mutation;<a name="line.112"></a>
+<span class="sourceLineNo">113</span>import org.apache.hadoop.hbase.client.Put;<a name="line.113"></a>
+<span class="sourceLineNo">114</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.114"></a>
+<span class="sourceLineNo">115</span>import org.apache.hadoop.hbase.client.RegionInfoBuilder;<a name="line.115"></a>
+<span class="sourceLineNo">116</span>import org.apache.hadoop.hbase.client.Result;<a name="line.116"></a>
+<span class="sourceLineNo">117</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.117"></a>
+<span class="sourceLineNo">118</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.118"></a>
+<span class="sourceLineNo">119</span>import org.apache.hadoop.hbase.client.Table;<a name="line.119"></a>
+<span class="sourceLineNo">120</span>import org.apache.hadoop.hbase.client.TableDescriptor;<a name="line.120"></a>
+<span class="sourceLineNo">121</span>import org.apache.hadoop.hbase.coprocessor.CoprocessorHost;<a name="line.121"></a>
+<span class="sourceLineNo">122</span>import org.apache.hadoop.hbase.exceptions.FailedSanityCheckException;<a name="line.122"></a>
+<span class="sourceLineNo">123</span>import org.apache.hadoop.hbase.filter.BigDecimalComparator;<a name="line.123"></a>
+<span class="sourceLineNo">124</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.124"></a>
+<span class="sourceLineNo">125</span>import org.apache.hadoop.hbase.filter.ColumnCountGetFilter;<a name="line.125"></a>
+<span class="sourceLineNo">126</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.126"></a>
+<span class="sourceLineNo">127</span>import org.apache.hadoop.hbase.filter.FilterBase;<a name="line.127"></a>
+<span class="sourceLineNo">128</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.128"></a>
+<span class="sourceLineNo">129</span>import org.apache.hadoop.hbase.filter.NullComparator;<a name="line.129"></a>
+<span class="sourceLineNo">130</span>import org.apache.hadoop.hbase.filter.PrefixFilter;<a name="line.130"></a>
+<span class="sourceLineNo">131</span>import org.apache.hadoop.hbase.filter.SingleColumnValueExcludeFilter;<a name="line.131"></a>
+<span class="sourceLineNo">132</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.132"></a>
+<span class="sourceLineNo">133</span>import org.apache.hadoop.hbase.filter.SubstringComparator;<a name="line.133"></a>
+<span class="sourceLineNo">134</span>import org.apache.hadoop.hbase.filter.ValueFilter;<a name="line.134"></a>
+<span class="sourceLineNo">135</span>import org.apache.hadoop.hbase.io.hfile.HFile;<a name="line.135"></a>
+<span class="sourceLineNo">136</span>import org.apache.hadoop.hbase.monitoring.MonitoredRPCHandler;<a name="line.136"></a>
+<span class="sourceLineNo">137</span>import org.apache.hadoop.hbase.monitoring.MonitoredTask;<a name="line.137"></a>
+<span class="sourceLineNo">138</span>import org.apache.hadoop.hbase.monitoring.TaskMonitor;<a name="line.138"></a>
+<span class="sourceLineNo">139</span>import org.apache.hadoop.hbase.regionserver.HRegion.MutationBatchOperation;<a name="line.139"></a>
+<span class="sourceLineNo">140</span>import org.apache.hadoop.hbase.regionserver.HRegion.RegionScannerImpl;<a name="line.140"></a>
+<span class="sourceLineNo">141</span>import org.apache.hadoop.hbase.regionserver.Region.RowLock;<a name="line.141"></a>
+<span class="sourceLineNo">142</span>import org.apache.hadoop.hbase.regionserver.TestHStore.FaultyFileSystem;<a name="line.142"></a>
+<span class="sourceLineNo">143</span>import org.apache.hadoop.hbase.regionserver.compactions.CompactionRequestImpl;<a name="line.143"></a>
+<span class="sourceLineNo">144</span>import org.apache.hadoop.hbase.regionserver.wal.FSHLog;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>import org.apache.hadoop.hbase.regionserver.wal.MetricsWALSource;<a name="line.145"></a>
+<span class="sourceLineNo">146</span>import org.apache.hadoop.hbase.regionserver.wal.WALUtil;<a name="line.146"></a>
+<span class="sourceLineNo">147</span>import org.apache.hadoop.hbase.replication.regionserver.ReplicationObserver;<a name="line.147"></a>
+<span class="sourceLineNo">148</span>import org.apache.hadoop.hbase.security.User;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>import org.apache.hadoop.hbase.test.MetricsAssertHelper;<a name="line.149"></a>
+<span class="sourceLineNo">150</span>import org.apache.hadoop.hbase.testclassification.LargeTests;<a name="line.150"></a>
+<span class="sourceLineNo">151</span>import org.apache.hadoop.hbase.testclassification.VerySlowRegionServerTests;<a name="line.151"></a>
+<span class="sourceLineNo">152</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.152"></a>
+<span class="sourceLineNo">153</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.153"></a>
+<span class="sourceLineNo">154</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManagerTestHelper;<a name="line.154"></a>
+<span class="sourceLineNo">155</span>import org.apache.hadoop.hbase.util.FSUtils;<a name="line.155"></a>
+<span class="sourceLineNo">156</span>import org.apache.hadoop.hbase.util.IncrementingEnvironmentEdge;<a name="line.156"></a>
+<span class="sourceLineNo">157</span>import org.apache.hadoop.hbase.util.ManualEnvironmentEdge;<a name="line.157"></a>
+<span class="sourceLineNo">158</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.158"></a>
+<span class="sourceLineNo">159</span>import org.apache.hadoop.hbase.wal.AbstractFSWALProvider;<a name="line.159"></a>
+<span class="sourceLineNo">160</span>import org.apache.hadoop.hbase.wal.FaultyFSLog;<a name="line.160"></a>
+<span class="sourceLineNo">161</span>import org.apache.hadoop.hbase.wal.NettyAsyncFSWALConfigHelper;<a name="line.161"></a>
+<span class="sourceLineNo">162</span>import org.apache.hadoop.hbase.wal.WAL;<a name="line.162"></a>
+<span class="sourceLineNo">163</span>import org.apache.hadoop.hbase.wal.WALEdit;<a name="line.163"></a>
+<span class="sourceLineNo">164</span>import org.apache.hadoop.hbase.wal.WALFactory;<a name="line.164"></a>
+<span class="sourceLineNo">165</span>import org.apache.hadoop.hbase.wal.WALKeyImpl;<a name="line.165"></a>
+<span class="sourceLineNo">166</span>import org.apache.hadoop.hbase.wal.WALProvider;<a name="line.166"></a>
+<span class="sourceLineNo">167</span>import org.apache.hadoop.hbase.wal.WALProvider.Writer;<a name="line.167"></a>
+<span class="sourceLineNo">168</span>import org.apache.hadoop.hbase.wal.WALSplitUtil;<a name="line.168"></a>
 <span class="sourceLineNo">169</span>import org.apache.hadoop.metrics2.MetricsExecutor;<a name="line.169"></a>
 <span class="sourceLineNo">170</span>import org.junit.After;<a name="line.170"></a>
 <span class="sourceLineNo">171</span>import org.junit.Assert;<a name="line.171"></a>
@@ -409,6007 +409,6017 @@
 <span class="sourceLineNo">401</span>    String testName = "testMemstoreSizeAccountingWithFailedPostBatchMutate";<a name="line.401"></a>
 <span class="sourceLineNo">402</span>    FileSystem fs = FileSystem.get(CONF);<a name="line.402"></a>
 <span class="sourceLineNo">403</span>    Path rootDir = new Path(dir + testName);<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    FSHLog hLog = new FSHLog(fs, rootDir, testName, CONF);<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    hLog.init();<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, hLog,<a name="line.406"></a>
-<span class="sourceLineNo">407</span>        COLUMN_FAMILY_BYTES);<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    assertEquals(0, region.getMemStoreDataSize());<a name="line.409"></a>
-<span class="sourceLineNo">410</span><a name="line.410"></a>
-<span class="sourceLineNo">411</span>    // Put one value<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    byte [] value = Bytes.toBytes(method);<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    Put put = new Put(value);<a name="line.413"></a>
-<span class="sourceLineNo">414</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.414"></a>
-<span class="sourceLineNo">415</span>    region.put(put);<a name="line.415"></a>
-<span class="sourceLineNo">416</span>    long onePutSize = region.getMemStoreDataSize();<a name="line.416"></a>
-<span class="sourceLineNo">417</span>    assertTrue(onePutSize &gt; 0);<a name="line.417"></a>
-<span class="sourceLineNo">418</span><a name="line.418"></a>
-<span class="sourceLineNo">419</span>    RegionCoprocessorHost mockedCPHost = Mockito.mock(RegionCoprocessorHost.class);<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    doThrow(new IOException())<a name="line.420"></a>
-<span class="sourceLineNo">421</span>       .when(mockedCPHost).postBatchMutate(Mockito.&lt;MiniBatchOperationInProgress&lt;Mutation&gt;&gt;any());<a name="line.421"></a>
-<span class="sourceLineNo">422</span>    region.setCoprocessorHost(mockedCPHost);<a name="line.422"></a>
-<span class="sourceLineNo">423</span><a name="line.423"></a>
-<span class="sourceLineNo">424</span>    put = new Put(value);<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("dfg"), value);<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    try {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      region.put(put);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>      fail("Should have failed with IOException");<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    } catch (IOException expected) {<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    }<a name="line.430"></a>
-<span class="sourceLineNo">431</span>    long expectedSize = onePutSize * 2;<a name="line.431"></a>
-<span class="sourceLineNo">432</span>    assertEquals("memstoreSize should be incremented",<a name="line.432"></a>
-<span class="sourceLineNo">433</span>        expectedSize, region.getMemStoreDataSize());<a name="line.433"></a>
-<span class="sourceLineNo">434</span>    assertEquals("flushable size should be incremented",<a name="line.434"></a>
-<span class="sourceLineNo">435</span>        expectedSize, store.getFlushableSize().getDataSize());<a name="line.435"></a>
-<span class="sourceLineNo">436</span><a name="line.436"></a>
-<span class="sourceLineNo">437</span>    region.setCoprocessorHost(null);<a name="line.437"></a>
-<span class="sourceLineNo">438</span>  }<a name="line.438"></a>
-<span class="sourceLineNo">439</span><a name="line.439"></a>
-<span class="sourceLineNo">440</span>  /**<a name="line.440"></a>
-<span class="sourceLineNo">441</span>   * A test case of HBASE-21041<a name="line.441"></a>
-<span class="sourceLineNo">442</span>   * @throws Exception Exception<a name="line.442"></a>
-<span class="sourceLineNo">443</span>   */<a name="line.443"></a>
-<span class="sourceLineNo">444</span>  @Test<a name="line.444"></a>
-<span class="sourceLineNo">445</span>  public void testFlushAndMemstoreSizeCounting() throws Exception {<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    byte[] family = Bytes.toBytes("family");<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.447"></a>
-<span class="sourceLineNo">448</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.448"></a>
-<span class="sourceLineNo">449</span>    try {<a name="line.449"></a>
-<span class="sourceLineNo">450</span>      for (byte[] row : HBaseTestingUtility.ROWS) {<a name="line.450"></a>
-<span class="sourceLineNo">451</span>        Put put = new Put(row);<a name="line.451"></a>
-<span class="sourceLineNo">452</span>        put.addColumn(family, family, row);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>        region.put(put);<a name="line.453"></a>
-<span class="sourceLineNo">454</span>      }<a name="line.454"></a>
-<span class="sourceLineNo">455</span>      region.flush(true);<a name="line.455"></a>
-<span class="sourceLineNo">456</span>      // After flush, data size should be zero<a name="line.456"></a>
-<span class="sourceLineNo">457</span>      assertEquals(0, region.getMemStoreDataSize());<a name="line.457"></a>
-<span class="sourceLineNo">458</span>      // After flush, a new active mutable segment is created, so the heap size<a name="line.458"></a>
-<span class="sourceLineNo">459</span>      // should equal to MutableSegment.DEEP_OVERHEAD<a name="line.459"></a>
-<span class="sourceLineNo">460</span>      assertEquals(MutableSegment.DEEP_OVERHEAD, region.getMemStoreHeapSize());<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      // After flush, offheap should be zero<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      assertEquals(0, region.getMemStoreOffHeapSize());<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    } finally {<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.464"></a>
-<span class="sourceLineNo">465</span>      this.region = null;<a name="line.465"></a>
-<span class="sourceLineNo">466</span>      wals.close();<a name="line.466"></a>
-<span class="sourceLineNo">467</span>    }<a name="line.467"></a>
-<span class="sourceLineNo">468</span>  }<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>   * Test we do not lose data if we fail a flush and then close.<a name="line.471"></a>
-<span class="sourceLineNo">472</span>   * Part of HBase-10466.  Tests the following from the issue description:<a name="line.472"></a>
-<span class="sourceLineNo">473</span>   * "Bug 1: Wrong calculation of HRegion.memstoreSize: When a flush fails, data to be flushed is<a name="line.473"></a>
-<span class="sourceLineNo">474</span>   * kept in each MemStore's snapshot and wait for next flush attempt to continue on it. But when<a name="line.474"></a>
-<span class="sourceLineNo">475</span>   * the next flush succeeds, the counter of total memstore size in HRegion is always deduced by<a name="line.475"></a>
-<span class="sourceLineNo">476</span>   * the sum of current memstore sizes instead of snapshots left from previous failed flush. This<a name="line.476"></a>
-<span class="sourceLineNo">477</span>   * calculation is problematic that almost every time there is failed flush, HRegion.memstoreSize<a name="line.477"></a>
-<span class="sourceLineNo">478</span>   * gets reduced by a wrong value. If region flush could not proceed for a couple cycles, the size<a name="line.478"></a>
-<span class="sourceLineNo">479</span>   * in current memstore could be much larger than the snapshot. It's likely to drift memstoreSize<a name="line.479"></a>
-<span class="sourceLineNo">480</span>   * much smaller than expected. In extreme case, if the error accumulates to even bigger than<a name="line.480"></a>
-<span class="sourceLineNo">481</span>   * HRegion's memstore size limit, any further flush is skipped because flush does not do anything<a name="line.481"></a>
-<span class="sourceLineNo">482</span>   * if memstoreSize is not larger than 0."<a name="line.482"></a>
-<span class="sourceLineNo">483</span>   * @throws Exception<a name="line.483"></a>
-<span class="sourceLineNo">484</span>   */<a name="line.484"></a>
-<span class="sourceLineNo">485</span>  @Test<a name="line.485"></a>
-<span class="sourceLineNo">486</span>  public void testFlushSizeAccounting() throws Exception {<a name="line.486"></a>
-<span class="sourceLineNo">487</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    // Only retry once.<a name="line.489"></a>
-<span class="sourceLineNo">490</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.490"></a>
-<span class="sourceLineNo">491</span>    final User user =<a name="line.491"></a>
-<span class="sourceLineNo">492</span>      User.createUserForTesting(conf, method, new String[]{"foo"});<a name="line.492"></a>
-<span class="sourceLineNo">493</span>    // Inject our faulty LocalFileSystem<a name="line.493"></a>
-<span class="sourceLineNo">494</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.494"></a>
-<span class="sourceLineNo">495</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.495"></a>
-<span class="sourceLineNo">496</span>      @Override<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      public Object run() throws Exception {<a name="line.497"></a>
-<span class="sourceLineNo">498</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.498"></a>
-<span class="sourceLineNo">499</span>        FileSystem fs = FileSystem.get(conf);<a name="line.499"></a>
-<span class="sourceLineNo">500</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.500"></a>
-<span class="sourceLineNo">501</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.501"></a>
-<span class="sourceLineNo">502</span>        HRegion region = null;<a name="line.502"></a>
-<span class="sourceLineNo">503</span>        try {<a name="line.503"></a>
-<span class="sourceLineNo">504</span>          // Initialize region<a name="line.504"></a>
-<span class="sourceLineNo">505</span>          region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, wal,<a name="line.505"></a>
-<span class="sourceLineNo">506</span>              COLUMN_FAMILY_BYTES);<a name="line.506"></a>
-<span class="sourceLineNo">507</span>          long size = region.getMemStoreDataSize();<a name="line.507"></a>
-<span class="sourceLineNo">508</span>          Assert.assertEquals(0, size);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.509"></a>
-<span class="sourceLineNo">510</span>          Put p1 = new Put(row);<a name="line.510"></a>
-<span class="sourceLineNo">511</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[]) null));<a name="line.511"></a>
-<span class="sourceLineNo">512</span>          region.put(p1);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>          final long sizeOfOnePut = region.getMemStoreDataSize();<a name="line.513"></a>
-<span class="sourceLineNo">514</span>          // Fail a flush which means the current memstore will hang out as memstore 'snapshot'.<a name="line.514"></a>
-<span class="sourceLineNo">515</span>          try {<a name="line.515"></a>
-<span class="sourceLineNo">516</span>            LOG.info("Flushing");<a name="line.516"></a>
-<span class="sourceLineNo">517</span>            region.flush(true);<a name="line.517"></a>
-<span class="sourceLineNo">518</span>            Assert.fail("Didn't bubble up IOE!");<a name="line.518"></a>
-<span class="sourceLineNo">519</span>          } catch (DroppedSnapshotException dse) {<a name="line.519"></a>
-<span class="sourceLineNo">520</span>            // What we are expecting<a name="line.520"></a>
-<span class="sourceLineNo">521</span>            region.closing.set(false); // this is needed for the rest of the test to work<a name="line.521"></a>
-<span class="sourceLineNo">522</span>          }<a name="line.522"></a>
-<span class="sourceLineNo">523</span>          // Make it so all writes succeed from here on out<a name="line.523"></a>
-<span class="sourceLineNo">524</span>          ffs.fault.set(false);<a name="line.524"></a>
-<span class="sourceLineNo">525</span>          // Check sizes.  Should still be the one entry.<a name="line.525"></a>
-<span class="sourceLineNo">526</span>          Assert.assertEquals(sizeOfOnePut, region.getMemStoreDataSize());<a name="line.526"></a>
-<span class="sourceLineNo">527</span>          // Now add two entries so that on this next flush that fails, we can see if we<a name="line.527"></a>
-<span class="sourceLineNo">528</span>          // subtract the right amount, the snapshot size only.<a name="line.528"></a>
-<span class="sourceLineNo">529</span>          Put p2 = new Put(row);<a name="line.529"></a>
-<span class="sourceLineNo">530</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.530"></a>
-<span class="sourceLineNo">531</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.531"></a>
-<span class="sourceLineNo">532</span>          region.put(p2);<a name="line.532"></a>
-<span class="sourceLineNo">533</span>          long expectedSize = sizeOfOnePut * 3;<a name="line.533"></a>
-<span class="sourceLineNo">534</span>          Assert.assertEquals(expectedSize, region.getMemStoreDataSize());<a name="line.534"></a>
-<span class="sourceLineNo">535</span>          // Do a successful flush.  It will clear the snapshot only.  Thats how flushes work.<a name="line.535"></a>
-<span class="sourceLineNo">536</span>          // If already a snapshot, we clear it else we move the memstore to be snapshot and flush<a name="line.536"></a>
-<span class="sourceLineNo">537</span>          // it<a name="line.537"></a>
-<span class="sourceLineNo">538</span>          region.flush(true);<a name="line.538"></a>
-<span class="sourceLineNo">539</span>          // Make sure our memory accounting is right.<a name="line.539"></a>
-<span class="sourceLineNo">540</span>          Assert.assertEquals(sizeOfOnePut * 2, region.getMemStoreDataSize());<a name="line.540"></a>
-<span class="sourceLineNo">541</span>        } finally {<a name="line.541"></a>
-<span class="sourceLineNo">542</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.542"></a>
-<span class="sourceLineNo">543</span>        }<a name="line.543"></a>
-<span class="sourceLineNo">544</span>        return null;<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>    FileSystem.closeAllForUGI(user.getUGI());<a name="line.547"></a>
-<span class="sourceLineNo">548</span>  }<a name="line.548"></a>
-<span class="sourceLineNo">549</span><a name="line.549"></a>
-<span class="sourceLineNo">550</span>  @Test<a name="line.550"></a>
-<span class="sourceLineNo">551</span>  public void testCloseWithFailingFlush() throws Exception {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    // Only retry once.<a name="line.554"></a>
-<span class="sourceLineNo">555</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.555"></a>
-<span class="sourceLineNo">556</span>    final User user =<a name="line.556"></a>
-<span class="sourceLineNo">557</span>      User.createUserForTesting(conf, this.method, new String[]{"foo"});<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    // Inject our faulty LocalFileSystem<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      @Override<a name="line.561"></a>
-<span class="sourceLineNo">562</span>      public Object run() throws Exception {<a name="line.562"></a>
-<span class="sourceLineNo">563</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.563"></a>
-<span class="sourceLineNo">564</span>        FileSystem fs = FileSystem.get(conf);<a name="line.564"></a>
-<span class="sourceLineNo">565</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.565"></a>
-<span class="sourceLineNo">566</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.566"></a>
-<span class="sourceLineNo">567</span>        HRegion region = null;<a name="line.567"></a>
-<span class="sourceLineNo">568</span>        try {<a name="line.568"></a>
-<span class="sourceLineNo">569</span>          // Initialize region<a name="line.569"></a>
-<span class="sourceLineNo">570</span>          region = initHRegion(tableName, null, null, false,<a name="line.570"></a>
-<span class="sourceLineNo">571</span>              Durability.SYNC_WAL, wal, COLUMN_FAMILY_BYTES);<a name="line.571"></a>
-<span class="sourceLineNo">572</span>          long size = region.getMemStoreDataSize();<a name="line.572"></a>
-<span class="sourceLineNo">573</span>          Assert.assertEquals(0, size);<a name="line.573"></a>
-<span class="sourceLineNo">574</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.574"></a>
-<span class="sourceLineNo">575</span>          Put p1 = new Put(row);<a name="line.575"></a>
-<span class="sourceLineNo">576</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[])null));<a name="line.576"></a>
-<span class="sourceLineNo">577</span>          region.put(p1);<a name="line.577"></a>
-<span class="sourceLineNo">578</span>          // Manufacture an outstanding snapshot -- fake a failed flush by doing prepare step only.<a name="line.578"></a>
-<span class="sourceLineNo">579</span>          HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>          StoreFlushContext storeFlushCtx =<a name="line.580"></a>
-<span class="sourceLineNo">581</span>              store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY);<a name="line.581"></a>
-<span class="sourceLineNo">582</span>          storeFlushCtx.prepare();<a name="line.582"></a>
-<span class="sourceLineNo">583</span>          // Now add two entries to the foreground memstore.<a name="line.583"></a>
-<span class="sourceLineNo">584</span>          Put p2 = new Put(row);<a name="line.584"></a>
-<span class="sourceLineNo">585</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.585"></a>
-<span class="sourceLineNo">586</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.586"></a>
-<span class="sourceLineNo">587</span>          region.put(p2);<a name="line.587"></a>
-<span class="sourceLineNo">588</span>          // Now try close on top of a failing flush.<a name="line.588"></a>
-<span class="sourceLineNo">589</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.589"></a>
-<span class="sourceLineNo">590</span>          region = null;<a name="line.590"></a>
-<span class="sourceLineNo">591</span>          fail();<a name="line.591"></a>
-<span class="sourceLineNo">592</span>        } catch (DroppedSnapshotException dse) {<a name="line.592"></a>
-<span class="sourceLineNo">593</span>          // Expected<a name="line.593"></a>
-<span class="sourceLineNo">594</span>          LOG.info("Expected DroppedSnapshotException");<a name="line.594"></a>
-<span class="sourceLineNo">595</span>        } finally {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>          // Make it so all writes succeed from here on out so can close clean<a name="line.596"></a>
-<span class="sourceLineNo">597</span>          ffs.fault.set(false);<a name="line.597"></a>
-<span class="sourceLineNo">598</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.598"></a>
-<span class="sourceLineNo">599</span>        }<a name="line.599"></a>
-<span class="sourceLineNo">600</span>        return null;<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      }<a name="line.601"></a>
-<span class="sourceLineNo">602</span>    });<a name="line.602"></a>
-<span class="sourceLineNo">603</span>    FileSystem.closeAllForUGI(user.getUGI());<a name="line.603"></a>
-<span class="sourceLineNo">604</span>  }<a name="line.604"></a>
-<span class="sourceLineNo">605</span><a name="line.605"></a>
-<span class="sourceLineNo">606</span>  @Test<a name="line.606"></a>
-<span class="sourceLineNo">607</span>  public void testCompactionAffectedByScanners() throws Exception {<a name="line.607"></a>
-<span class="sourceLineNo">608</span>    byte[] family = Bytes.toBytes("family");<a name="line.608"></a>
-<span class="sourceLineNo">609</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.609"></a>
-<span class="sourceLineNo">610</span><a name="line.610"></a>
-<span class="sourceLineNo">611</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.612"></a>
-<span class="sourceLineNo">613</span>    region.put(put);<a name="line.613"></a>
-<span class="sourceLineNo">614</span>    region.flush(true);<a name="line.614"></a>
-<span class="sourceLineNo">615</span><a name="line.615"></a>
-<span class="sourceLineNo">616</span>    Scan scan = new Scan();<a name="line.616"></a>
-<span class="sourceLineNo">617</span>    scan.setMaxVersions(3);<a name="line.617"></a>
-<span class="sourceLineNo">618</span>    // open the first scanner<a name="line.618"></a>
-<span class="sourceLineNo">619</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.619"></a>
-<span class="sourceLineNo">620</span><a name="line.620"></a>
-<span class="sourceLineNo">621</span>    Delete delete = new Delete(Bytes.toBytes("r1"));<a name="line.621"></a>
-<span class="sourceLineNo">622</span>    region.delete(delete);<a name="line.622"></a>
-<span class="sourceLineNo">623</span>    region.flush(true);<a name="line.623"></a>
-<span class="sourceLineNo">624</span><a name="line.624"></a>
-<span class="sourceLineNo">625</span>    // open the second scanner<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    RegionScanner scanner2 = region.getScanner(scan);<a name="line.626"></a>
-<span class="sourceLineNo">627</span><a name="line.627"></a>
-<span class="sourceLineNo">628</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.628"></a>
-<span class="sourceLineNo">629</span><a name="line.629"></a>
-<span class="sourceLineNo">630</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.630"></a>
-<span class="sourceLineNo">631</span><a name="line.631"></a>
-<span class="sourceLineNo">632</span>    // make a major compaction<a name="line.632"></a>
-<span class="sourceLineNo">633</span>    region.compact(true);<a name="line.633"></a>
-<span class="sourceLineNo">634</span><a name="line.634"></a>
-<span class="sourceLineNo">635</span>    // open the third scanner<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    RegionScanner scanner3 = region.getScanner(scan);<a name="line.636"></a>
-<span class="sourceLineNo">637</span><a name="line.637"></a>
-<span class="sourceLineNo">638</span>    // get data from scanner 1, 2, 3 after major compaction<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    scanner1.next(results);<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    System.out.println(results);<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    assertEquals(1, results.size());<a name="line.641"></a>
-<span class="sourceLineNo">642</span><a name="line.642"></a>
-<span class="sourceLineNo">643</span>    results.clear();<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    scanner2.next(results);<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    System.out.println(results);<a name="line.645"></a>
-<span class="sourceLineNo">646</span>    assertEquals(0, results.size());<a name="line.646"></a>
-<span class="sourceLineNo">647</span><a name="line.647"></a>
-<span class="sourceLineNo">648</span>    results.clear();<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    scanner3.next(results);<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    System.out.println(results);<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    assertEquals(0, results.size());<a name="line.651"></a>
-<span class="sourceLineNo">652</span>  }<a name="line.652"></a>
-<span class="sourceLineNo">653</span><a name="line.653"></a>
-<span class="sourceLineNo">654</span>  @Test<a name="line.654"></a>
-<span class="sourceLineNo">655</span>  public void testToShowNPEOnRegionScannerReseek() throws Exception {<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    byte[] family = Bytes.toBytes("family");<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.657"></a>
-<span class="sourceLineNo">658</span><a name="line.658"></a>
-<span class="sourceLineNo">659</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.659"></a>
-<span class="sourceLineNo">660</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.660"></a>
-<span class="sourceLineNo">661</span>    region.put(put);<a name="line.661"></a>
-<span class="sourceLineNo">662</span>    put = new Put(Bytes.toBytes("r2"));<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.663"></a>
-<span class="sourceLineNo">664</span>    region.put(put);<a name="line.664"></a>
-<span class="sourceLineNo">665</span>    region.flush(true);<a name="line.665"></a>
-<span class="sourceLineNo">666</span><a name="line.666"></a>
-<span class="sourceLineNo">667</span>    Scan scan = new Scan();<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    scan.setMaxVersions(3);<a name="line.668"></a>
-<span class="sourceLineNo">669</span>    // open the first scanner<a name="line.669"></a>
-<span class="sourceLineNo">670</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.670"></a>
-<span class="sourceLineNo">671</span><a name="line.671"></a>
-<span class="sourceLineNo">672</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.672"></a>
-<span class="sourceLineNo">673</span><a name="line.673"></a>
-<span class="sourceLineNo">674</span>    region.compact(true);<a name="line.674"></a>
-<span class="sourceLineNo">675</span><a name="line.675"></a>
-<span class="sourceLineNo">676</span>    scanner1.reseek(Bytes.toBytes("r2"));<a name="line.676"></a>
-<span class="sourceLineNo">677</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.677"></a>
-<span class="sourceLineNo">678</span>    scanner1.next(results);<a name="line.678"></a>
-<span class="sourceLineNo">679</span>    Cell keyValue = results.get(0);<a name="line.679"></a>
-<span class="sourceLineNo">680</span>    Assert.assertTrue(Bytes.compareTo(CellUtil.cloneRow(keyValue), Bytes.toBytes("r2")) == 0);<a name="line.680"></a>
-<span class="sourceLineNo">681</span>    scanner1.close();<a name="line.681"></a>
-<span class="sourceLineNo">682</span>  }<a name="line.682"></a>
-<span class="sourceLineNo">683</span><a name="line.683"></a>
-<span class="sourceLineNo">684</span>  @Test<a name="line.684"></a>
-<span class="sourceLineNo">685</span>  public void testSkipRecoveredEditsReplay() throws Exception {<a name="line.685"></a>
-<span class="sourceLineNo">686</span>    byte[] family = Bytes.toBytes("family");<a name="line.686"></a>
-<span class="sourceLineNo">687</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.687"></a>
-<span class="sourceLineNo">688</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.688"></a>
-<span class="sourceLineNo">689</span>    try {<a name="line.689"></a>
-<span class="sourceLineNo">690</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.690"></a>
-<span class="sourceLineNo">691</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.691"></a>
-<span class="sourceLineNo">692</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.692"></a>
-<span class="sourceLineNo">693</span><a name="line.693"></a>
-<span class="sourceLineNo">694</span>      Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.694"></a>
-<span class="sourceLineNo">695</span><a name="line.695"></a>
-<span class="sourceLineNo">696</span>      long maxSeqId = 1050;<a name="line.696"></a>
-<span class="sourceLineNo">697</span>      long minSeqId = 1000;<a name="line.697"></a>
-<span class="sourceLineNo">698</span><a name="line.698"></a>
-<span class="sourceLineNo">699</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.699"></a>
-<span class="sourceLineNo">700</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.700"></a>
-<span class="sourceLineNo">701</span>        fs.create(recoveredEdits);<a name="line.701"></a>
-<span class="sourceLineNo">702</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.702"></a>
-<span class="sourceLineNo">703</span><a name="line.703"></a>
-<span class="sourceLineNo">704</span>        long time = System.nanoTime();<a name="line.704"></a>
-<span class="sourceLineNo">705</span>        WALEdit edit = new WALEdit();<a name="line.705"></a>
-<span class="sourceLineNo">706</span>        edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.706"></a>
-<span class="sourceLineNo">707</span>            .toBytes(i)));<a name="line.707"></a>
-<span class="sourceLineNo">708</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.708"></a>
-<span class="sourceLineNo">709</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.709"></a>
-<span class="sourceLineNo">710</span><a name="line.710"></a>
-<span class="sourceLineNo">711</span>        writer.close();<a name="line.711"></a>
-<span class="sourceLineNo">712</span>      }<a name="line.712"></a>
-<span class="sourceLineNo">713</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.713"></a>
-<span class="sourceLineNo">714</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.714"></a>
-<span class="sourceLineNo">715</span>      for (HStore store : region.getStores()) {<a name="line.715"></a>
-<span class="sourceLineNo">716</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), minSeqId - 1);<a name="line.716"></a>
-<span class="sourceLineNo">717</span>      }<a name="line.717"></a>
-<span class="sourceLineNo">718</span>      long seqId = region.replayRecoveredEditsIfAny(maxSeqIdInStores, null, status);<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      assertEquals(maxSeqId, seqId);<a name="line.719"></a>
-<span class="sourceLineNo">720</span>      region.getMVCC().advanceTo(seqId);<a name="line.720"></a>
-<span class="sourceLineNo">721</span>      Get get = new Get(row);<a name="line.721"></a>
-<span class="sourceLineNo">722</span>      Result result = region.get(get);<a name="line.722"></a>
-<span class="sourceLineNo">723</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.723"></a>
-<span class="sourceLineNo">724</span>        List&lt;Cell&gt; kvs = result.getColumnCells(family, Bytes.toBytes(i));<a name="line.724"></a>
-<span class="sourceLineNo">725</span>        assertEquals(1, kvs.size());<a name="line.725"></a>
-<span class="sourceLineNo">726</span>        assertArrayEquals(Bytes.toBytes(i), CellUtil.cloneValue(kvs.get(0)));<a name="line.726"></a>
-<span class="sourceLineNo">727</span>      }<a name="line.727"></a>
-<span class="sourceLineNo">728</span>    } finally {<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      this.region = null;<a name="line.730"></a>
-<span class="sourceLineNo">731</span>      wals.close();<a name="line.731"></a>
-<span class="sourceLineNo">732</span>    }<a name="line.732"></a>
-<span class="sourceLineNo">733</span>  }<a name="line.733"></a>
-<span class="sourceLineNo">734</span><a name="line.734"></a>
-<span class="sourceLineNo">735</span>  @Test<a name="line.735"></a>
-<span class="sourceLineNo">736</span>  public void testSkipRecoveredEditsReplaySomeIgnored() throws Exception {<a name="line.736"></a>
-<span class="sourceLineNo">737</span>    byte[] family = Bytes.toBytes("family");<a name="line.737"></a>
-<span class="sourceLineNo">738</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.738"></a>
-<span class="sourceLineNo">739</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.739"></a>
-<span class="sourceLineNo">740</span>    try {<a name="line.740"></a>
-<span class="sourceLineNo">741</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.741"></a>
-<span class="sourceLineNo">742</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.742"></a>
-<span class="sourceLineNo">743</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.743"></a>
-<span class="sourceLineNo">744</span><a name="line.744"></a>
-<span class="sourceLineNo">745</span>      Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.745"></a>
-<span class="sourceLineNo">746</span><a name="line.746"></a>
-<span class="sourceLineNo">747</span>      long maxSeqId = 1050;<a name="line.747"></a>
-<span class="sourceLineNo">748</span>      long minSeqId = 1000;<a name="line.748"></a>
-<span class="sourceLineNo">749</span><a name="line.749"></a>
-<span class="sourceLineNo">750</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.750"></a>
-<span class="sourceLineNo">751</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.751"></a>
-<span class="sourceLineNo">752</span>        fs.create(recoveredEdits);<a name="line.752"></a>
-<span class="sourceLineNo">753</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.753"></a>
-<span class="sourceLineNo">754</span><a name="line.754"></a>
-<span class="sourceLineNo">755</span>        long time = System.nanoTime();<a name="line.755"></a>
-<span class="sourceLineNo">756</span>        WALEdit edit = new WALEdit();<a name="line.756"></a>
-<span class="sourceLineNo">757</span>        edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.757"></a>
-<span class="sourceLineNo">758</span>            .toBytes(i)));<a name="line.758"></a>
-<span class="sourceLineNo">759</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.759"></a>
-<span class="sourceLineNo">760</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.760"></a>
-<span class="sourceLineNo">761</span><a name="line.761"></a>
-<span class="sourceLineNo">762</span>        writer.close();<a name="line.762"></a>
-<span class="sourceLineNo">763</span>      }<a name="line.763"></a>
-<span class="sourceLineNo">764</span>      long recoverSeqId = 1030;<a name="line.764"></a>
-<span class="sourceLineNo">765</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.766"></a>
-<span class="sourceLineNo">767</span>      for (HStore store : region.getStores()) {<a name="line.767"></a>
-<span class="sourceLineNo">768</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), recoverSeqId - 1);<a name="line.768"></a>
-<span class="sourceLineNo">769</span>      }<a name="line.769"></a>
-<span class="sourceLineNo">770</span>      long seqId = region.replayRecoveredEditsIfAny(maxSeqIdInStores, null, status);<a name="line.770"></a>
-<span class="sourceLineNo">771</span>      assertEquals(maxSeqId, seqId);<a name="line.771"></a>
-<span class="sourceLineNo">772</span>      region.getMVCC().advanceTo(seqId);<a name="line.772"></a>
-<span class="sourceLineNo">773</span>      Get get = new Get(row);<a name="line.773"></a>
-<span class="sourceLineNo">774</span>      Result result = region.get(get);<a name="line.774"></a>
-<span class="sourceLineNo">775</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.775"></a>
-<span class="sourceLineNo">776</span>        List&lt;Cell&gt; kvs = result.getColumnCells(family, Bytes.toBytes(i));<a name="line.776"></a>
-<span class="sourceLineNo">777</span>        if (i &lt; recoverSeqId) {<a name="line.777"></a>
-<span class="sourceLineNo">778</span>          assertEquals(0, kvs.size());<a name="line.778"></a>
-<span class="sourceLineNo">779</span>        } else {<a name="line.779"></a>
-<span class="sourceLineNo">780</span>          assertEquals(1, kvs.size());<a name="line.780"></a>
-<span class="sourceLineNo">781</span>          assertArrayEquals(Bytes.toBytes(i), CellUtil.cloneValue(kvs.get(0)));<a name="line.781"></a>
-<span class="sourceLineNo">782</span>        }<a name="line.782"></a>
-<span class="sourceLineNo">783</span>      }<a name="line.783"></a>
-<span class="sourceLineNo">784</span>    } finally {<a name="line.784"></a>
-<span class="sourceLineNo">785</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.785"></a>
-<span class="sourceLineNo">786</span>      this.region = null;<a name="line.786"></a>
-<span class="sourceLineNo">787</span>      wals.close();<a name="line.787"></a>
-<span class="sourceLineNo">788</span>    }<a name="line.788"></a>
-<span class="sourceLineNo">789</span>  }<a name="line.789"></a>
-<span class="sourceLineNo">790</span><a name="line.790"></a>
-<span class="sourceLineNo">791</span>  @Test<a name="line.791"></a>
-<span class="sourceLineNo">792</span>  public void testSkipRecoveredEditsReplayAllIgnored() throws Exception {<a name="line.792"></a>
-<span class="sourceLineNo">793</span>    byte[] family = Bytes.toBytes("family");<a name="line.793"></a>
-<span class="sourceLineNo">794</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.794"></a>
-<span class="sourceLineNo">795</span>    Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.795"></a>
-<span class="sourceLineNo">796</span>    FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.796"></a>
-<span class="sourceLineNo">797</span><a name="line.797"></a>
-<span class="sourceLineNo">798</span>    Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.798"></a>
-<span class="sourceLineNo">799</span>    for (int i = 1000; i &lt; 1050; i += 10) {<a name="line.799"></a>
-<span class="sourceLineNo">800</span>      Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.800"></a>
-<span class="sourceLineNo">801</span>      FSDataOutputStream dos = fs.create(recoveredEdits);<a name="line.801"></a>
-<span class="sourceLineNo">802</span>      dos.writeInt(i);<a name="line.802"></a>
-<span class="sourceLineNo">803</span>      dos.close();<a name="line.803"></a>
-<span class="sourceLineNo">804</span>    }<a name="line.804"></a>
-<span class="sourceLineNo">805</span>    long minSeqId = 2000;<a name="line.805"></a>
-<span class="sourceLineNo">806</span>    Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", minSeqId - 1));<a name="line.806"></a>
-<span class="sourceLineNo">807</span>    FSDataOutputStream dos = fs.create(recoveredEdits);<a name="line.807"></a>
-<span class="sourceLineNo">808</span>    dos.close();<a name="line.808"></a>
-<span class="sourceLineNo">809</span><a name="line.809"></a>
-<span class="sourceLineNo">810</span>    Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.810"></a>
-<span class="sourceLineNo">811</span>    for (HStore store : region.getStores()) {<a name="line.811"></a>
-<span class="sourceLineNo">812</span>      maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), minSeqId);<a name="line.812"></a>
-<span class="sourceLineNo">813</span>    }<a name="line.813"></a>
-<span class="sourceLineNo">814</span>    long seqId = region.replayRecoveredEditsIfAny(maxSeqIdInStores, null, null);<a name="line.814"></a>
-<span class="sourceLineNo">815</span>    assertEquals(minSeqId, seqId);<a name="line.815"></a>
-<span class="sourceLineNo">816</span>  }<a name="line.816"></a>
-<span class="sourceLineNo">817</span><a name="line.817"></a>
-<span class="sourceLineNo">818</span>  @Test<a name="line.818"></a>
-<span class="sourceLineNo">819</span>  public void testSkipRecoveredEditsReplayTheLastFileIgnored() throws Exception {<a name="line.819"></a>
-<span class="sourceLineNo">820</span>    byte[] family = Bytes.toBytes("family");<a name="line.820"></a>
-<span class="sourceLineNo">821</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.821"></a>
-<span class="sourceLineNo">822</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.822"></a>
-<span class="sourceLineNo">823</span>    try {<a name="line.823"></a>
-<span class="sourceLineNo">824</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.824"></a>
-<span class="sourceLineNo">825</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.825"></a>
-<span class="sourceLineNo">826</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.826"></a>
-<span class="sourceLineNo">827</span>      byte[][] columns = region.getTableDescriptor().getColumnFamilyNames().toArray(new byte[0][]);<a name="line.827"></a>
-<span class="sourceLineNo">828</span><a name="line.828"></a>
-<span class="sourceLineNo">829</span>      assertEquals(0, region.getStoreFileList(columns).size());<a name="line.829"></a>
-<span class="sourceLineNo">830</span><a name="line.830"></a>
-<span class="sourceLineNo">831</span>      Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.831"></a>
-<span class="sourceLineNo">832</span><a name="line.832"></a>
-<span class="sourceLineNo">833</span>      long maxSeqId = 1050;<a name="line.833"></a>
-<span class="sourceLineNo">834</span>      long minSeqId = 1000;<a name="line.834"></a>
-<span class="sourceLineNo">835</span><a name="line.835"></a>
-<span class="sourceLineNo">836</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.836"></a>
-<span class="sourceLineNo">837</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.837"></a>
-<span class="sourceLineNo">838</span>        fs.create(recoveredEdits);<a name="line.838"></a>
-<span class="sourceLineNo">839</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.839"></a>
-<span class="sourceLineNo">840</span><a name="line.840"></a>
-<span class="sourceLineNo">841</span>        long time = System.nanoTime();<a name="line.841"></a>
-<span class="sourceLineNo">842</span>        WALEdit edit = null;<a name="line.842"></a>
-<span class="sourceLineNo">843</span>        if (i == maxSeqId) {<a name="line.843"></a>
-<span class="sourceLineNo">844</span>          edit = WALEdit.createCompaction(region.getRegionInfo(),<a name="line.844"></a>
-<span class="sourceLineNo">845</span>          CompactionDescriptor.newBuilder()<a name="line.845"></a>
-<span class="sourceLineNo">846</span>          .setTableName(ByteString.copyFrom(tableName.getName()))<a name="line.846"></a>
-<span class="sourceLineNo">847</span>          .setFamilyName(ByteString.copyFrom(regionName))<a name="line.847"></a>
-<span class="sourceLineNo">848</span>          .setEncodedRegionName(ByteString.copyFrom(regionName))<a name="line.848"></a>
-<span class="sourceLineNo">849</span>          .setStoreHomeDirBytes(ByteString.copyFrom(Bytes.toBytes(regiondir.toString())))<a name="line.849"></a>
-<span class="sourceLineNo">850</span>          .setRegionName(ByteString.copyFrom(region.getRegionInfo().getRegionName()))<a name="line.850"></a>
-<span class="sourceLineNo">851</span>          .build());<a name="line.851"></a>
-<span class="sourceLineNo">852</span>        } else {<a name="line.852"></a>
-<span class="sourceLineNo">853</span>          edit = new WALEdit();<a name="line.853"></a>
-<span class="sourceLineNo">854</span>          edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.854"></a>
-<span class="sourceLineNo">855</span>            .toBytes(i)));<a name="line.855"></a>
-<span class="sourceLineNo">856</span>        }<a name="line.856"></a>
-<span class="sourceLineNo">857</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.857"></a>
-<span class="sourceLineNo">858</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.858"></a>
-<span class="sourceLineNo">859</span>        writer.close();<a name="line.859"></a>
-<span class="sourceLineNo">860</span>      }<a name="line.860"></a>
-<span class="sourceLineNo">861</span><a name="line.861"></a>
-<span class="sourceLineNo">862</span>      long recoverSeqId = 1030;<a name="line.862"></a>
-<span class="sourceLineNo">863</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.863"></a>
-<span class="sourceLineNo">864</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.864"></a>
-<span class="sourceLineNo">865</span>      for (HStore store : region.getStores()) {<a name="line.865"></a>
-<span class="sourceLineNo">866</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), recoverSeqId - 1);<a name="line.866"></a>
-<span class="sourceLineNo">867</span>      }<a name="line.867"></a>
-<span class="sourceLineNo">868</span>      long seqId = region.replayRecoveredEditsIfAny(maxSeqIdInStores, null, status);<a name="line.868"></a>
-<span class="sourceLineNo">869</span>      assertEquals(maxSeqId, seqId);<a name="line.869"></a>
-<span class="sourceLineNo">870</span><a name="line.870"></a>
-<span class="sourceLineNo">871</span>      // assert that the files are flushed<a name="line.871"></a>
-<span class="sourceLineNo">872</span>      assertEquals(1, region.getStoreFileList(columns).size());<a name="line.872"></a>
-<span class="sourceLineNo">873</span><a name="line.873"></a>
-<span class="sourceLineNo">874</span>    } finally {<a name="line.874"></a>
-<span class="sourceLineNo">875</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.875"></a>
-<span class="sourceLineNo">876</span>      this.region = null;<a name="line.876"></a>
-<span class="sourceLineNo">877</span>      wals.close();<a name="line.877"></a>
-<span class="sourceLineNo">878</span>    }<a name="line.878"></a>
-<span class="sourceLineNo">879</span>  }<a name="line.879"></a>
-<span class="sourceLineNo">880</span><a name="line.880"></a>
-<span class="sourceLineNo">881</span>  @Test<a name="line.881"></a>
-<span class="sourceLineNo">882</span>  public void testRecoveredEditsReplayCompaction() throws Exception {<a name="line.882"></a>
-<span class="sourceLineNo">883</span>    testRecoveredEditsReplayCompaction(false);<a name="line.883"></a>
-<span class="sourceLineNo">884</span>    testRecoveredEditsReplayCompaction(true);<a name="line.884"></a>
-<span class="sourceLineNo">885</span>  }<a name="line.885"></a>
-<span class="sourceLineNo">886</span><a name="line.886"></a>
-<span class="sourceLineNo">887</span>  public void testRecoveredEditsReplayCompaction(boolean mismatchedRegionName) throws Exception {<a name="line.887"></a>
-<span class="sourceLineNo">888</span>    CONF.setClass(HConstants.REGION_IMPL, HRegionForTesting.class, Region.class);<a name="line.888"></a>
-<span class="sourceLineNo">889</span>    byte[] family = Bytes.toBytes("family");<a name="line.889"></a>
-<span class="sourceLineNo">890</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.890"></a>
-<span class="sourceLineNo">891</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.891"></a>
-<span class="sourceLineNo">892</span>    try {<a name="line.892"></a>
-<span class="sourceLineNo">893</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.893"></a>
-<span class="sourceLineNo">894</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.894"></a>
-<span class="sourceLineNo">895</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.895"></a>
-<span class="sourceLineNo">896</span><a name="line.896"></a>
-<span class="sourceLineNo">897</span>      long maxSeqId = 3;<a name="line.897"></a>
-<span class="sourceLineNo">898</span>      long minSeqId = 0;<a name="line.898"></a>
-<span class="sourceLineNo">899</span><a name="line.899"></a>
-<span class="sourceLineNo">900</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.900"></a>
-<span class="sourceLineNo">901</span>        Put put = new Put(Bytes.toBytes(i));<a name="line.901"></a>
-<span class="sourceLineNo">902</span>        put.addColumn(family, Bytes.toBytes(i), Bytes.toBytes(i));<a name="line.902"></a>
-<span class="sourceLineNo">903</span>        region.put(put);<a name="line.903"></a>
-<span class="sourceLineNo">904</span>        region.flush(true);<a name="line.904"></a>
-<span class="sourceLineNo">905</span>      }<a name="line.905"></a>
-<span class="sourceLineNo">906</span><a name="line.906"></a>
-<span class="sourceLineNo">907</span>      // this will create a region with 3 files<a name="line.907"></a>
-<span class="sourceLineNo">908</span>      assertEquals(3, region.getStore(family).getStorefilesCount());<a name="line.908"></a>
-<span class="sourceLineNo">909</span>      List&lt;Path&gt; storeFiles = new ArrayList&lt;&gt;(3);<a name="line.909"></a>
-<span class="sourceLineNo">910</span>      for (HStoreFile sf : region.getStore(family).getStorefiles()) {<a name="line.910"></a>
-<span class="sourceLineNo">911</span>        storeFiles.add(sf.getPath());<a name="line.911"></a>
-<span class="sourceLineNo">912</span>      }<a name="line.912"></a>
-<span class="sourceLineNo">913</span><a name="line.913"></a>
-<span class="sourceLineNo">914</span>      // disable compaction completion<a name="line.914"></a>
-<span class="sourceLineNo">915</span>      CONF.setBoolean("hbase.hstore.compaction.complete", false);<a name="line.915"></a>
-<span class="sourceLineNo">916</span>      region.compactStores();<a name="line.916"></a>
-<span class="sourceLineNo">917</span><a name="line.917"></a>
-<span class="sourceLineNo">918</span>      // ensure that nothing changed<a name="line.918"></a>
-<span class="sourceLineNo">919</span>      assertEquals(3, region.getStore(family).getStorefilesCount());<a name="line.919"></a>
-<span class="sourceLineNo">920</span><a name="line.920"></a>
-<span class="sourceLineNo">921</span>      // now find the compacted file, and manually add it to the recovered edits<a name="line.921"></a>
-<span class="sourceLineNo">922</span>      Path tmpDir = new Path(region.getRegionFileSystem().getTempDir(), Bytes.toString(family));<a name="line.922"></a>
-<span class="sourceLineNo">923</span>      FileStatus[] files = FSUtils.listStatus(fs, tmpDir);<a name="line.923"></a>
-<span class="sourceLineNo">924</span>      String errorMsg = "Expected to find 1 file in the region temp directory "<a name="line.924"></a>
-<span class="sourceLineNo">925</span>          + "from the compaction, could not find any";<a name="line.925"></a>
-<span class="sourceLineNo">926</span>      assertNotNull(errorMsg, files);<a name="line.926"></a>
-<span class="sourceLineNo">927</span>      assertEquals(errorMsg, 1, files.length);<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      // move the file inside region dir<a name="line.928"></a>
-<span class="sourceLineNo">929</span>      Path newFile = region.getRegionFileSystem().commitStoreFile(Bytes.toString(family),<a name="line.929"></a>
-<span class="sourceLineNo">930</span>          files[0].getPath());<a name="line.930"></a>
-<span class="sourceLineNo">931</span><a name="line.931"></a>
-<span class="sourceLineNo">932</span>      byte[] encodedNameAsBytes = this.region.getRegionInfo().getEncodedNameAsBytes();<a name="line.932"></a>
-<span class="sourceLineNo">933</span>      byte[] fakeEncodedNameAsBytes = new byte [encodedNameAsBytes.length];<a name="line.933"></a>
-<span class="sourceLineNo">934</span>      for (int i=0; i &lt; encodedNameAsBytes.length; i++) {<a name="line.934"></a>
-<span class="sourceLineNo">935</span>        // Mix the byte array to have a new encodedName<a name="line.935"></a>
-<span class="sourceLineNo">936</span>        fakeEncodedNameAsBytes[i] = (byte) (encodedNameAsBytes[i] + 1);<a name="line.936"></a>
-<span class="sourceLineNo">937</span>      }<a name="line.937"></a>
-<span class="sourceLineNo">938</span><a name="line.938"></a>
-<span class="sourceLineNo">939</span>      CompactionDescriptor compactionDescriptor = ProtobufUtil.toCompactionDescriptor(this.region<a name="line.939"></a>
-<span class="sourceLineNo">940</span>        .getRegionInfo(), mismatchedRegionName ? fakeEncodedNameAsBytes : null, family,<a name="line.940"></a>
-<span class="sourceLineNo">941</span>            storeFiles, Lists.newArrayList(newFile),<a name="line.941"></a>
-<span class="sourceLineNo">942</span>            region.getRegionFileSystem().getStoreDir(Bytes.toString(family)));<a name="line.942"></a>
-<span class="sourceLineNo">943</span><a name="line.943"></a>
-<span class="sourceLineNo">944</span>      WALUtil.writeCompactionMarker(region.getWAL(), this.region.getReplicationScope(),<a name="line.944"></a>
-<span class="sourceLineNo">945</span>          this.region.getRegionInfo(), compactionDescriptor, region.getMVCC());<a name="line.945"></a>
-<span class="sourceLineNo">946</span><a name="line.946"></a>
-<span class="sourceLineNo">947</span>      Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.947"></a>
-<span class="sourceLineNo">948</span><a name="line.948"></a>
-<span class="sourceLineNo">949</span>      Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", 1000));<a name="line.949"></a>
-<span class="sourceLineNo">950</span>      fs.create(recoveredEdits);<a name="line.950"></a>
-<span class="sourceLineNo">951</span>      WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.951"></a>
-<span class="sourceLineNo">952</span><a name="line.952"></a>
-<span class="sourceLineNo">953</span>      long time = System.nanoTime();<a name="line.953"></a>
-<span class="sourceLineNo">954</span><a name="line.954"></a>
-<span class="sourceLineNo">955</span>      writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, 10, time,<a name="line.955"></a>
-<span class="sourceLineNo">956</span>          HConstants.DEFAULT_CLUSTER_ID), WALEdit.createCompaction(region.getRegionInfo(),<a name="line.956"></a>
-<span class="sourceLineNo">957</span>          compactionDescriptor)));<a name="line.957"></a>
-<span class="sourceLineNo">958</span>      writer.close();<a name="line.958"></a>
-<span class="sourceLineNo">959</span><a name="line.959"></a>
-<span class="sourceLineNo">960</span>      // close the region now, and reopen again<a name="line.960"></a>
-<span class="sourceLineNo">961</span>      region.getTableDescriptor();<a name="line.961"></a>
-<span class="sourceLineNo">962</span>      region.getRegionInfo();<a name="line.962"></a>
-<span class="sourceLineNo">963</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.963"></a>
-<span class="sourceLineNo">964</span>      try {<a name="line.964"></a>
-<span class="sourceLineNo">965</span>        region = HRegion.openHRegion(region, null);<a name="line.965"></a>
-<span class="sourceLineNo">966</span>      } catch (WrongRegionException wre) {<a name="line.966"></a>
-<span class="sourceLineNo">967</span>        fail("Matching encoded region name should not have produced WrongRegionException");<a name="line.967"></a>
-<span class="sourceLineNo">968</span>      }<a name="line.968"></a>
-<span class="sourceLineNo">969</span><a name="line.969"></a>
-<span class="sourceLineNo">970</span>      // now check whether we have only one store file, the compacted one<a name="line.970"></a>
-<span class="sourceLineNo">971</span>      Collection&lt;HStoreFile&gt; sfs = region.getStore(family).getStorefiles();<a name="line.971"></a>
-<span class="sourceLineNo">972</span>      for (HStoreFile sf : sfs) {<a name="line.972"></a>
-<span class="sourceLineNo">973</span>        LOG.info(Objects.toString(sf.getPath()));<a name="line.973"></a>
-<span class="sourceLineNo">974</span>      }<a name="line.974"></a>
-<span class="sourceLineNo">975</span>      if (!mismatchedRegionName) {<a name="line.975"></a>
-<span class="sourceLineNo">976</span>        assertEquals(1, region.getStore(family).getStorefilesCount());<a name="line.976"></a>
-<span class="sourceLineNo">977</span>      }<a name="line.977"></a>
-<span class="sourceLineNo">978</span>      files = FSUtils.listStatus(fs, tmpDir);<a name="line.978"></a>
-<span class="sourceLineNo">979</span>      assertTrue("Expected to find 0 files inside " + tmpDir, files == null || files.length == 0);<a name="line.979"></a>
-<span class="sourceLineNo">980</span><a name="line.980"></a>
-<span class="sourceLineNo">981</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.981"></a>
-<span class="sourceLineNo">982</span>        Get get = new Get(Bytes.toBytes(i));<a name="line.982"></a>
-<span class="sourceLineNo">983</span>        Result result = region.get(get);<a name="line.983"></a>
-<span class="sourceLineNo">984</span>        byte[] value = result.getValue(family, Bytes.toBytes(i));<a name="line.984"></a>
-<span class="sourceLineNo">985</span>        assertArrayEquals(Bytes.toBytes(i), value);<a name="line.985"></a>
-<span class="sourceLineNo">986</span>      }<a name="line.986"></a>
-<span class="sourceLineNo">987</span>    } finally {<a name="line.987"></a>
-<span class="sourceLineNo">988</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.988"></a>
-<span class="sourceLineNo">989</span>      this.region = null;<a name="line.989"></a>
-<span class="sourceLineNo">990</span>      wals.close();<a name="line.990"></a>
-<span class="sourceLineNo">991</span>      CONF.setClass(HConstants.REGION_IMPL, HRegion.class, Region.class);<a name="line.991"></a>
-<span class="sourceLineNo">992</span>    }<a name="line.992"></a>
-<span class="sourceLineNo">993</span>  }<a name="line.993"></a>
-<span class="sourceLineNo">994</span><a name="line.994"></a>
-<span class="sourceLineNo">995</span>  @Test<a name="line.995"></a>
-<span class="sourceLineNo">996</span>  public void testFlushMarkers() throws Exception {<a name="line.996"></a>
-<span class="sourceLineNo">997</span>    // tests that flush markers are written to WAL and handled at recovered edits<a name="line.997"></a>
-<span class="sourceLineNo">998</span>    byte[] family = Bytes.toBytes("family");<a name="line.998"></a>
-<span class="sourceLineNo">999</span>    Path logDir = TEST_UTIL.getDataTestDirOnTestFS(method + ".log");<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>    final Configuration walConf = new Configuration(TEST_UTIL.getConfiguration());<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>    final WALFactory wals = new WALFactory(walConf, method);<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>    final WAL wal = wals.getWAL(RegionInfoBuilder.newBuilder(tableName).build());<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span><a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>    this.region = initHRegion(tableName, HConstants.EMPTY_START_ROW,<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>      HConstants.EMPTY_END_ROW, false, Durability.USE_DEFAULT, wal, family);<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>    try {<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span><a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>      long maxSeqId = 3;<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>      long minSeqId = 0;<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span><a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>        Put put = new Put(Bytes.toBytes(i));<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>        put.addColumn(family, Bytes.toBytes(i), Bytes.toBytes(i));<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>        region.put(put);<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>        region.flush(true);<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>      }<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span><a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>      // this will create a region with 3 files from flush<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>      assertEquals(3, region.getStore(family).getStorefilesCount());<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>      List&lt;String&gt; storeFiles = new ArrayList&lt;&gt;(3);<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>      for (HStoreFile sf : region.getStore(family).getStorefiles()) {<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>        storeFiles.add(sf.getPath().getName());<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>      }<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span><a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>      // now verify that the flush markers are written<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>      wal.shutdown();<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>      WAL.Reader reader = WALFactory.createReader(fs, AbstractFSWALProvider.getCurrentFileName(wal),<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>        TEST_UTIL.getConfiguration());<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>      try {<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>        List&lt;WAL.Entry&gt; flushDescriptors = new ArrayList&lt;&gt;();<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>        long lastFlushSeqId = -1;<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>        while (true) {<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>          WAL.Entry entry = reader.next();<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>          if (entry == null) {<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>            break;<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>          }<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>          Cell cell = entry.getEdit().getCells().get(0);<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>          if (WALEdit.isMetaEditFamily(cell)) {<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>            FlushDescriptor flushDesc = WALEdit.getFlushDescriptor(cell);<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>            assertNotNull(flushDesc);<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>            assertArrayEquals(tableName.getName(), flushDesc.getTableName().toByteArray());<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>            if (flushDesc.getAction() == FlushAction.START_FLUSH) {<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>              assertTrue(flushDesc.getFlushSequenceNumber() &gt; lastFlushSeqId);<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>            } else if (flushDesc.getAction() == FlushAction.COMMIT_FLUSH) {<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>              assertTrue(flushDesc.getFlushSequenceNumber() == lastFlushSeqId);<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>            }<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>            lastFlushSeqId = flushDesc.getFlushSequenceNumber();<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>            assertArrayEquals(regionName, flushDesc.getEncodedRegionName().toByteArray());<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>            assertEquals(1, flushDesc.getStoreFlushesCount()); //only one store<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>            StoreFlushDescriptor storeFlushDesc = flushDesc.getStoreFlushes(0);<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>            assertArrayEquals(family, storeFlushDesc.getFamilyName().toByteArray());<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>            assertEquals("family", storeFlushDesc.getStoreHomeDir());<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>            if (flushDesc.getAction() == FlushAction.START_FLUSH) {<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>              assertEquals(0, storeFlushDesc.getFlushOutputCount());<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>            } else {<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>              assertEquals(1, storeFlushDesc.getFlushOutputCount()); //only one file from flush<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>              assertTrue(storeFiles.contains(storeFlushDesc.getFlushOutput(0)));<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>            }<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span><a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>            flushDescriptors.add(entry);<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>          }<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>        }<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span><a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>        assertEquals(3 * 2, flushDescriptors.size()); // START_FLUSH and COMMIT_FLUSH per flush<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span><a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>        // now write those markers to the recovered edits again.<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span><a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>        Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span><a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", 1000));<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>        fs.create(recoveredEdits);<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span><a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>        for (WAL.Entry entry : flushDescriptors) {<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>          writer.append(entry);<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>        }<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>        writer.close();<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      } finally {<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>        if (null != reader) {<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>          try {<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>            reader.close();<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>          } catch (IOException exception) {<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>            LOG.warn("Problem closing wal: " + exception.getMessage());<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>            LOG.debug("exception details", exception);<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>          }<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>        }<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>      }<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span><a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>      // close the region now, and reopen again<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>      region = HRegion.openHRegion(region, null);<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span><a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>      // now check whether we have can read back the data from region<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>        Get get = new Get(Bytes.toBytes(i));<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>        Result result = region.get(get);<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>        byte[] value = result.getValue(family, Bytes.toBytes(i));<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>        assertArrayEquals(Bytes.toBytes(i), value);<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>      }<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>    } finally {<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>      this.region = null;<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>      wals.close();<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>    }<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>  }<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span><a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>  static class IsFlushWALMarker implements ArgumentMatcher&lt;WALEdit&gt; {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>    volatile FlushAction[] actions;<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>    public IsFlushWALMarker(FlushAction... actions) {<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>      this.actions = actions;<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>    }<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>    @Override<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>    public boolean matches(WALEdit edit) {<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>      List&lt;Cell&gt; cells = edit.getCells();<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>      if (cells.isEmpty()) {<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>        return false;<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>      }<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>      if (WALEdit.isMetaEditFamily(cells.get(0))) {<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>        FlushDescriptor desc;<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>        try {<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>          desc = WALEdit.getFlushDescriptor(cells.get(0));<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>        } catch (IOException e) {<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>          LOG.warn(e.toString(), e);<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>          return false;<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>        }<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>        if (desc != null) {<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>          for (FlushAction action : actions) {<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>            if (desc.getAction() == action) {<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>              return true;<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>            }<a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>          }<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>        }<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>      }<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>      return false;<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>    }<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>    public IsFlushWALMarker set(FlushAction... actions) {<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>      this.actions = actions;<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>      return this;<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>    }<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>  }<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span><a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>  @Test<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>  public void testFlushMarkersWALFail() throws Exception {<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>    // test the cases where the WAL append for flush markers fail.<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>    byte[] family = Bytes.toBytes("family");<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span><a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>    // spy an actual WAL implementation to throw exception (was not able to mock)<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>    Path logDir = TEST_UTIL.getDataTestDirOnTestFS(method + "log");<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span><a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>    final Configuration walConf = new Configuration(TEST_UTIL.getConfiguration());<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>    // Make up a WAL that we can manipulate at append time.<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    class FailAppendFlushMarkerWAL extends FSHLog {<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>      volatile FlushAction [] flushActions = null;<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span><a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>      public FailAppendFlushMarkerWAL(FileSystem fs, Path root, String logDir, Configuration conf)<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>      throws IOException {<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>        super(fs, root, logDir, conf);<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>      }<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span><a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>      @Override<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>      protected Writer createWriterInstance(Path path) throws IOException {<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>        final Writer w = super.createWriterInstance(path);<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>        return new Writer() {<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>          @Override<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>          public void close() throws IOException {<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>            w.close();<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>          }<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span><a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>          @Override<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>          public void sync(boolean forceSync) throws IOException {<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>            w.sync(forceSync);<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>          }<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span><a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>          @Override<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>          public void append(Entry entry) throws IOException {<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>            List&lt;Cell&gt; cells = entry.getEdit().getCells();<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>            if (WALEdit.isMetaEditFamily(cells.get(0))) {<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>              FlushDescriptor desc = WALEdit.getFlushDescriptor(cells.get(0));<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>              if (desc != null) {<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>                for (FlushAction flushAction: flushActions) {<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>                  if (desc.getAction().equals(flushAction)) {<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>                    throw new IOException("Failed to append flush marker! " + flushAction);<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>                  }<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>                }<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>              }<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>            }<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>            w.append(entry);<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>          }<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span><a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>          @Override<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>          public long getLength() {<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>            return w.getLength();<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>          }<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>        };<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>      }<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>    }<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>    FailAppendFlushMarkerWAL wal =<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>      new FailAppendFlushMarkerWAL(FileSystem.get(walConf), FSUtils.getRootDir(walConf),<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>        method, walConf);<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>    wal.init();<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>    this.region = initHRegion(tableName, HConstants.EMPTY_START_ROW,<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>      HConstants.EMPTY_END_ROW, false, Durability.USE_DEFAULT, wal, family);<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>    int i = 0;<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>    Put put = new Put(Bytes.toBytes(i));<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>    put.setDurability(Durability.SKIP_WAL); // have to skip mocked wal<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>    put.addColumn(family, Bytes.toBytes(i), Bytes.toBytes(i));<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>    region.put(put);<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span><a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>    // 1. Test case where START_FLUSH throws exception<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>    wal.flushActions = new FlushAction [] {FlushAction.START_FLUSH};<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span><a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>    // start cache flush will throw exception<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>    try {<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>      region.flush(true);<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>      fail("This should have thrown exception");<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>    } catch (DroppedSnapshotException unexpected) {<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>      // this should not be a dropped snapshot exception. Meaning that RS will not abort<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>      throw unexpected;<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>    } catch (IOException expected) {<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>      // expected<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>    }<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>    // The WAL is hosed now. It has two edits appended. We cannot roll the log without it<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>    // throwing a DroppedSnapshotException to force an abort. Just clean up the mess.<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>    region.close(true);<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>    wal.close();<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span><a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>    // 2. Test case where START_FLUSH succeeds but COMMIT_FLUSH will throw exception<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>    wal.flushActions = new FlushAction [] {FlushAction.COMMIT_FLUSH};<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>    wal = new FailAppendFlushMarkerWAL(FileSystem.get(walConf), FSUtils.getRootDir(walConf),<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>          method, walConf);<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>    wal.init();<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>    this.region = initHRegion(tableName, HConstants.EMPTY_START_ROW,<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>      HConstants.EMPTY_END_ROW, false, Durability.USE_DEFAULT, wal, family);<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    region.put(put);<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span><a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>    // 3. Test case where ABORT_FLUSH will throw exception.<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>    // Even if ABORT_FLUSH throws exception, we should not fail with IOE, but continue with<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>    // DroppedSnapshotException. Below COMMMIT_FLUSH will cause flush to abort<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>    wal.flushActions = new FlushAction [] {FlushAction.COMMIT_FLUSH, FlushAction.ABORT_FLUSH};<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span><a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>    try {<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>      region.flush(true);<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>      fail("This should have thrown exception");<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>    } catch (DroppedSnapshotException expected) {<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>      // we expect this exception, since we were able to write the snapshot, but failed to<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span>      // write the flush marker to WAL<a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>    } catch (IOException unexpected) {<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>      throw unexpected;<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>    }<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>  }<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span><a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>  @Test<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>  public void testGetWhileRegionClose() throws IOException {<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>    Configuration hc = initSplit();<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>    int numRows = 100;<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>    byte[][] families = { fam1, fam2, fam3 };<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span><a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>    // Setting up region<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>    this.region = initHRegion(tableName, method, hc, families);<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>    // Put data in region<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>    final int startRow = 100;<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>    putData(startRow, numRows, qual1, families);<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>    putData(startRow, numRows, qual2, families);<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>    putData(startRow, numRows, qual3, families);<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    final AtomicBoolean done = new AtomicBoolean(false);<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>    final AtomicInteger gets = new AtomicInteger(0);<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>    GetTillDoneOrException[] threads = new GetTillDoneOrException[10];<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>    try {<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>      // Set ten threads running concurrently getting from the region.<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>      for (int i = 0; i &lt; threads.length / 2; i++) {<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>        threads[i] = new GetTillDoneOrException(i, Bytes.toBytes("" + startRow), done, gets);<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>        threads[i].setDaemon(true);<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>        threads[i].start();<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span>      }<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>      // Artificially make the condition by setting closing flag explicitly.<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>      // I can't make the issue happen with a call to region.close().<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>      this.region.closing.set(true);<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>      for (int i = threads.length / 2; i &lt; threads.length; i++) {<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>        threads[i] = new GetTillDoneOrException(i, Bytes.toBytes("" + startRow), done, gets);<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>        threads[i].setDaemon(true);<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>        threads[i].start();<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>      }<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>    } finally {<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>      if (this.region != null) {<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>        HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>        this.region = null;<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>      }<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>    }<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>    done.set(true);<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>    for (GetTillDoneOrException t : threads) {<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>      try {<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>        t.join();<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>      } catch (InterruptedException e) {<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>        e.printStackTrace();<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>      }<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>      if (t.e != null) {<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>        LOG.info("Exception=" + t.e);<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>        assertFalse("Found a NPE in " + t.getName(), t.e instanceof NullPointerException);<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>      }<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>    }<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>  }<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span><a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>  /*<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>   * Thread that does get on single row until 'done' flag is flipped. If an<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>   * exception causes us to fail, it records it.<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>   */<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>  class GetTillDoneOrException extends Thread {<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>    private final Get g;<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>    private final AtomicBoolean done;<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>    private final AtomicInteger count;<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>    private Exception e;<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span><a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>    GetTillDoneOrException(final int i, final byte[] r, final AtomicBoolean d,<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>        final AtomicInteger c) {<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>      super("getter." + i);<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>      this.g = new Get(r);<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>      this.done = d;<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>      this.count = c;<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>    }<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span><a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    @Override<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span>    public void run() {<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>      while (!this.done.get()) {<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>        try {<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>          assertTrue(region.get(g).size() &gt; 0);<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>          this.count.incrementAndGet();<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>        } catch (Exception e) {<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>          this.e = e;<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>          break;<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>        }<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>      }<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>    }<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>  }<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span><a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>  /*<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>   * An involved filter test. Has multiple column families and deletes in mix.<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>   */<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>  @Test<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>  public void testWeirdCacheBehaviour() throws Exception {<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>    byte[][] FAMILIES = new byte[][] { Bytes.toBytes("trans-blob"), Bytes.toBytes("trans-type"),<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>        Bytes.toBytes("trans-date"), Bytes.toBytes("trans-tags"), Bytes.toBytes("trans-group") };<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>    this.region = initHRegion(tableName, method, CONF, FAMILIES);<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>    String value = "this is the value";<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>    String value2 = "this is some other value";<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>    String keyPrefix1 = "prefix1";<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>    String keyPrefix2 = "prefix2";<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>    String keyPrefix3 = "prefix3";<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>    putRows(this.region, 3, value, keyPrefix1);<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>    putRows(this.region, 3, value, keyPrefix2);<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>    putRows(this.region, 3, value, keyPrefix3);<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>    putRows(this.region, 3, value2, keyPrefix1);<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>    putRows(this.region, 3, value2, keyPrefix2);<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>    putRows(this.region, 3, value2, keyPrefix3);<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>    System.out.println("Checking values for key: " + keyPrefix1);<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>    assertEquals("Got back incorrect number of rows from scan", 3,<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>        getNumberOfRows(keyPrefix1, value2, this.region));<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>    System.out.println("Checking values for key: " + keyPrefix2);<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>    assertEquals("Got back incorrect number of rows from scan", 3,<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>        getNumberOfRows(keyPrefix2, value2, this.region));<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>    System.out.println("Checking values for key: " + keyPrefix3);<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>    assertEquals("Got back incorrect number of rows from scan", 3,<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>        getNumberOfRows(keyPrefix3, value2, this.region));<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>    deleteColumns(this.region, value2, keyPrefix1);<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>    deleteColumns(this.region, value2, keyPrefix2);<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>    deleteColumns(this.region, value2, keyPrefix3);<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>    System.out.println("Starting important checks.....");<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>    assertEquals("Got back incorrect number of rows from scan: " + keyPrefix1, 0,<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>        getNumberOfRows(keyPrefix1, value2, this.region));<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>    assertEquals("Got back incorrect number of rows from scan: " + keyPrefix2, 0,<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>        getNumberOfRows(keyPrefix2, value2, this.region));<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>    assertEquals("Got back incorrect number of rows from scan: " + keyPrefix3, 0,<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>        getNumberOfRows(keyPrefix3, value2, this.region));<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>  }<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span><a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>  @Test<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>  public void testAppendWithReadOnlyTable() throws Exception {<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>    this.region = initHRegion(tableName, method, CONF, true, Bytes.toBytes("somefamily"));<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span>    boolean exceptionCaught = false;<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>    Append append = new Append(Bytes.toBytes("somerow"));<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>    append.setDurability(Durability.SKIP_WAL);<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>    append.addColumn(Bytes.toBytes("somefamily"), Bytes.toBytes("somequalifier"),<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>        Bytes.toBytes("somevalue"));<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>    try {<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>      region.append(append);<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>    } catch (IOException e) {<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>      exceptionCaught = true;<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>    }<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>    assertTrue(exceptionCaught == true);<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>  }<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span><a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>  @Test<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>  public void testIncrWithReadOnlyTable() throws Exception {<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>    this.region = initHRegion(tableName, method, CONF, true, Bytes.toBytes("somefamily"));<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>    boolean exceptionCaught = false;<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>    Increment inc = new Increment(Bytes.toBytes("somerow"));<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>    inc.setDurability(Durability.SKIP_WAL);<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>    inc.addColumn(Bytes.toBytes("somefamily"), Bytes.toBytes("somequalifier"), 1L);<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>    try {<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>      region.increment(inc);<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>    } catch (IOException e) {<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>      exceptionCaught = true;<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>    }<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>    assertTrue(exceptionCaught == true);<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>  }<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span><a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>  private void deleteColumns(HRegion r, String value, String keyPrefix) throws IOException {<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>    InternalScanner scanner = buildScanner(keyPrefix, value, r);<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>    int count = 0;<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>    boolean more = false;<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>    do {<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>      more = scanner.next(results);<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>      if (results != null &amp;&amp; !results.isEmpty())<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>        count++;<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>      else<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>        break;<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>      Delete delete = new Delete(CellUtil.cloneRow(results.get(0)));<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>      delete.addColumn(Bytes.toBytes("trans-tags"), Bytes.toBytes("qual2"));<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>      r.delete(delete);<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>      results.clear();<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>    } while (more);<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>    assertEquals("Did not perform correct number of deletes", 3, count);<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>  }<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span><a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>  private int getNumberOfRows(String keyPrefix, String value, HRegion r) throws Exception {<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>    InternalScanner resultScanner = buildScanner(keyPrefix, value, r);<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>    int numberOfResults = 0;<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>    boolean more = false;<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>    do {<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>      more = resultScanner.next(results);<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>      if (results != null &amp;&amp; !results.isEmpty())<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>        numberOfResults++;<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>      else<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>        break;<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>      for (Cell kv : results) {<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>        System.out.println("kv=" + kv.toString() + ", " + Bytes.toString(CellUtil.cloneValue(kv)));<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>      }<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>      results.clear();<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>    } while (more);<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>    return numberOfResults;<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>  }<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span><a name="line.1451"></a>
-<span class="sourceLineNo">1452</span>  private InternalScanner buildScanner(String keyPrefix, String value, HRegion r)<a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>      throws IOException {<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>    // Defaults FilterList.Operator.MUST_PASS_ALL.<a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>    FilterList allFilters = new FilterList();<a name="line.1455"></a>
-<span class="sourceLineNo">1456</span>    allFilters.addFilter(new PrefixFilter(Bytes.toBytes(keyPrefix)));<a name="line.1456"></a>
-<span class="sourceLineNo">1457</span>    // Only return rows where this column value exists in the row.<a name="line.1457"></a>
-<span class="sourceLineNo">1458</span>    SingleColumnValueFilter filter = new SingleColumnValueFilter(Bytes.toBytes("trans-tags"),<a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>        Bytes.toBytes("qual2"), CompareOperator.EQUAL, Bytes.toBytes(value));<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>    filter.setFilterIfMissing(true);<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>    allFilters.addFilter(filter);<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span>    Scan scan = new Scan();<a name="line.1462"></a>
-<span class="sourceLineNo">1463</span>    scan.addFamily(Bytes.toBytes("trans-blob"));<a name="line.1463"></a>
-<span class="sourceLineNo">1464</span>    scan.addFamily(Bytes.toBytes("trans-type"));<a name="line.1464"></a>
-<span class="sourceLineNo">1465</span>    scan.addFamily(Bytes.toBytes("trans-date"));<a name="line.1465"></a>
-<span class="sourceLineNo">1466</span>    scan.addFamily(Bytes.toBytes("trans-tags"));<a name="line.1466"></a>
-<span class="sourceLineNo">1467</span>    scan.addFamily(Bytes.toBytes("trans-group"));<a name="line.1467"></a>
-<span class="sourceLineNo">1468</span>    scan.setFilter(allFilters);<a name="line.1468"></a>
-<span class="sourceLineNo">1469</span>    return r.getScanner(scan);<a name="line.1469"></a>
-<span class="sourceLineNo">1470</span>  }<a name="line.1470"></a>
-<span class="sourceLineNo">1471</span><a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>  private void putRows(HRegion r, int numRows, String value, String key) throws IOException {<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span>    for (int i = 0; i &lt; numRows; i++) {<a name="line.1473"></a>
-<span class="sourceLineNo">1474</span>      String row = key + "_" + i/* UUID.randomUUID().toString() */;<a name="line.1474"></a>
-<span class="sourceLineNo">1475</span>      System.out.println(String.format("Saving row: %s, with value %s", row, value));<a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>      Put put = new Put(Bytes.toBytes(row));<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>      put.setDurability(Durability.SKIP_WAL);<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span>      put.addColumn(Bytes.toBytes("trans-blob"), null, Bytes.toBytes("value for blob"));<a name="line.1478"></a>
-<span class="sourceLineNo">1479</span>      put.addColumn(Bytes.toBytes("trans-type"), null, Bytes.toBytes("statement"));<a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>      put.addColumn(Bytes.toBytes("trans-date"), null, Bytes.toBytes("20090921010101999"));<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>      put.addColumn(Bytes.toBytes("trans-tags"), Bytes.toBytes("qual2"), Bytes.toBytes(value));<a name="line.1481"></a>
-<span class="sourceLineNo">1482</span>      put.addColumn(Bytes.toBytes("trans-group"), null, Bytes.toBytes("adhocTransactionGroupId"));<a name="line.1482"></a>
-<span class="sourceLineNo">1483</span>      r.put(put);<a name="line.1483"></a>
-<span class="sourceLineNo">1484</span>    }<a name="line.1484"></a>
-<span class="sourceLineNo">1485</span>  }<a name="line.1485"></a>
-<span class="sourceLineNo">1486</span><a name="line.1486"></a>
-<span class="sourceLineNo">1487</span>  @Test<a name="line.1487"></a>
-<span class="sourceLineNo">1488</span>  public void testFamilyWithAndWithoutColon() throws Exception {<a name="line.1488"></a>
-<span class="sourceLineNo">1489</span>    byte[] cf = Bytes.toBytes(COLUMN_FAMILY);<a name="line.1489"></a>
-<span class="sourceLineNo">1490</span>    this.region = initHRegion(tableName, method, CONF, cf);<a name="line.1490"></a>
-<span class="sourceLineNo">1491</span>    Put p = new Put(tableName.toBytes());<a name="line.1491"></a>
-<span class="sourceLineNo">1492</span>    byte[] cfwithcolon = Bytes.toBytes(COLUMN_FAMILY + ":");<a name="line.1492"></a>
-<span class="sourceLineNo">1493</span>    p.addColumn(cfwithcolon, cfwithcolon, cfwithcolon);<a name="line.1493"></a>
-<span class="sourceLineNo">1494</span>    boolean exception = false;<a name="line.1494"></a>
-<span class="sourceLineNo">1495</span>    try {<a name="line.1495"></a>
-<span class="sourceLineNo">1496</span>      this.region.put(p);<a name="line.1496"></a>
-<span class="sourceLineNo">1497</span>    } catch (NoSuchColumnFamilyException e) {<a name="line.1497"></a>
-<span class="sourceLineNo">1498</span>      exception = true;<a name="line.1498"></a>
-<span class="sourceLineNo">1499</span>    }<a name="line.1499"></a>
-<span class="sourceLineNo">1500</span>    assertTrue(exception);<a name="line.1500"></a>
-<span class="sourceLineNo">1501</span>  }<a name="line.1501"></a>
-<span class="sourceLineNo">1502</span><a name="line.1502"></a>
-<span class="sourceLineNo">1503</span>  @Test<a name="line.1503"></a>
-<span class="sourceLineNo">1504</span>  public void testBatchPut_whileNoRowLocksHeld() throws IOException {<a name="line.1504"></a>
-<span class="sourceLineNo">1505</span>    final Put[] puts = new Put[10];<a name="line.1505"></a>
-<span class="sourceLineNo">1506</span>    MetricsWALSource source = CompatibilitySingletonFactory.getInstance(MetricsWALSource.class);<a name="line.1506"></a>
-<span class="sourceLineNo">1507</span>    long syncs = prepareRegionForBachPut(puts, source, false);<a name="line.1507"></a>
-<span class="sourceLineNo">1508</span><a name="line.1508"></a>
-<span class="sourceLineNo">1509</span>    OperationStatus[] codes = this.region.batchMutate(puts);<a name="line.1509"></a>
-<span class="sourceLineNo">1510</span>    assertEquals(10, codes.length);<a name="line.1510"></a>
-<span class="sourceLineNo">1511</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.1511"></a>
-<span class="sourceLineNo">1512</span>      assertEquals(OperationStatusCode.SUCCESS, codes[i].getOperationStatusCode());<a name="line.1512"></a>
-<span class="sourceLineNo">1513</span>    }<a name="line.1513"></a>
-<span class="sourceLineNo">1514</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs + 1, source);<a name="line.1514"></a>
-<span class="sourceLineNo">1515</span><a name="line.1515"></a>
-<span class="sourceLineNo">1516</span>    LOG.info("Next a batch put with one invalid family");<a name="line.1516"></a>
-<span class="sourceLineNo">1517</span>    puts[5].addColumn(Bytes.toBytes("BAD_CF"), qual, value);<a name="line.1517"></a>
-<span class="sourceLineNo">1518</span>    codes = this.region.batchMutate(puts);<a name="line.1518"></a>
-<span class="sourceLineNo">1519</span>    assertEquals(10, codes.length);<a name="line.1519"></a>
-<span class="sourceLineNo">1520</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.1520"></a>
-<span class="sourceLineNo">1521</span>      assertEquals((i == 5) ? OperationStatusCode.BAD_FAMILY : OperationStatusCode.SUCCESS,<a name="line.1521"></a>
-<span class="sourceLineNo">1522</span>          codes[i].getOperationStatusCode());<a name="line.1522"></a>
-<span class="sourceLineNo">1523</span>    }<a name="line.1523"></a>
-<span class="sourceLineNo">1524</span><a name="line.1524"></a>
-<span class="sourceLineNo">1525</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs + 2, source);<a name="line.1525"></a>
-<span class="sourceLineNo">1526</span>  }<a name="line.1526"></a>
-<span class="sourceLineNo">1527</span><a name="line.1527"></a>
-<span class="sourceLineNo">1528</span>  @Test<a name="line.1528"></a>
-<span class="sourceLineNo">1529</span>  public void testBatchPut_whileMultipleRowLocksHeld() throws Exception {<a name="line.1529"></a>
-<span class="sourceLineNo">1530</span>    final Put[] puts = new Put[10];<a name="line.1530"></a>
-<span class="sourceLineNo">1531</span>    MetricsWALSource source = CompatibilitySingletonFactory.getInstance(MetricsWALSource.class);<a name="line.1531"></a>
-<span class="sourceLineNo">1532</span>    long syncs = prepareRegionForBachPut(puts, source, false);<a name="line.1532"></a>
-<span class="sourceLineNo">1533</span><a name="line.1533"></a>
-<span class="sourceLineNo">1534</span>    puts[5].addColumn(Bytes.toBytes("BAD_CF"), qual, value);<a name="line.1534"></a>
-<span class="sourceLineNo">1535</span><a name="line.1535"></a>
-<span class="sourceLineNo">1536</span>    LOG.info("batchPut will have to break into four batches to avoid row locks");<a name="line.1536"></a>
-<span class="sourceLineNo">1537</span>    RowLock rowLock1 = region.getRowLock(Bytes.toBytes("row_2"));<a name="line.1537"></a>
-<span class="sourceLineNo">1538</span>    RowLock rowLock2 = region.getRowLock(Bytes.toBytes("row_1"));<a name="line.1538"></a>
-<span class="sourceLineNo">1539</span>    RowLock rowLock3 = region.getRowLock(Bytes.toBytes("row_3"));<a name="line.1539"></a>
-<span class="sourceLineNo">1540</span>    RowLock rowLock4 = region.getRowLock(Bytes.toBytes("row_3"), true);<a name="line.1540"></a>
-<span class="sourceLineNo">1541</span><a name="line.1541"></a>
-<span class="sourceLineNo">1542</span>    MultithreadedTestUtil.TestContext ctx = new MultithreadedTestUtil.TestContext(CONF);<a name="line.1542"></a>
-<span class="sourceLineNo">1543</span>    final AtomicReference&lt;OperationStatus[]&gt; retFromThread = new AtomicReference&lt;&gt;();<a name="line.1543"></a>
-<span class="sourceLineNo">1544</span>    final CountDownLatch startingPuts = new CountDownLatch(1);<a name="line.1544"></a>
-<span class="sourceLineNo">1545</span>    final CountDownLatch startingClose = new CountDownLatch(1);<a name="line.1545"></a>
-<span class="sourceLineNo">1546</span>    TestThread putter = new TestThread(ctx) {<a name="line.1546"></a>
-<span class="sourceLineNo">1547</span>      @Override<a name="line.1547"></a>
-<span class="sourceLineNo">1548</span>      public void doWork() throws IOException {<a name="line.1548"></a>
-<span class="sourceLineNo">1549</span>        startingPuts.countDown();<a name="line.1549"></a>
-<span class="sourceLineNo">1550</span>        retFromThread.set(region.batchMutate(puts));<a name="line.1550"></a>
-<span class="sourceLineNo">1551</span>      }<a name="line.1551"></a>
-<span class="sourceLineNo">1552</span>    };<a name="line.1552"></a>
-<span class="sourceLineNo">1553</span>    LOG.info("...starting put thread while holding locks");<a name="line.1553"></a>
-<span class="sourceLineNo">1554</span>    ctx.addThread(putter);<a name="line.1554"></a>
-<span class="sourceLineNo">1555</span>    ctx.startThreads();<a name="line.1555"></a>
-<span class="sourceLineNo">1556</span><a name="line.1556"></a>
-<span class="sourceLineNo">1557</span>    // Now attempt to close the region from another thread.  Prior to HBASE-12565<a name="line.1557"></a>
-<span class="sourceLineNo">1558</span>    // this would cause the in-progress batchMutate operation to to fail with<a name="line.1558"></a>
-<span class="sourceLineNo">1559</span>    // exception because it use to release and re-acquire the close-guard lock<a name="line.1559"></a>
-<span class="sourceLineNo">1560</span>    // between batches.  Caller then didn't get status indicating which writes succeeded.<a name="line.1560"></a>
-<span class="sourceLineNo">1561</span>    // We now expect this thread to block until the batchMutate call finishes.<a name="line.1561"></a>
-<span class="sourceLineNo">1562</span>    Thread regionCloseThread = new TestThread(ctx) {<a name="line.1562"></a>
-<span class="sourceLineNo">1563</span>      @Override<a name="line.1563"></a>
-<span class="sourceLineNo">1564</span>      public void doWork() {<a name="line.1564"></a>
-<span class="sourceLineNo">1565</span>        try {<a name="line.1565"></a>
-<span class="sourceLineNo">1566</span>          startingPuts.await();<a name="line.1566"></a>
-<span class="sourceLineNo">1567</span>          // Give some time for the batch mutate to get in.<a name="line.1567"></a>
-<span class="sourceLineNo">1568</span>          // We don't want to race with the mutate<a name="line.1568"></a>
-<span class="sourceLineNo">1569</span>          Thread.sleep(10);<a name="line.1569"></a>
-<span class="sourceLineNo">1570</span>          startingClose.countDown();<a name="line.1570"></a>
-<span class="sourceLineNo">1571</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.1571"></a>
-<span class="sourceLineNo">1572</span>          region = null;<a name="line.1572"></a>
-<span class="sourceLineNo">1573</span>        } catch (IOException e) {<a name="line.1573"></a>
-<span class="sourceLineNo">1574</span>          throw new RuntimeException(e);<a name="line.1574"></a>
-<span class="sourceLineNo">1575</span>        } catch (InterruptedException e) {<a name="line.1575"></a>
-<span class="sourceLineNo">1576</span>          throw new RuntimeException(e);<a name="line.1576"></a>
-<span class="sourceLineNo">1577</span>        }<a name="line.1577"></a>
-<span class="sourceLineNo">1578</span>      }<a name="line.1578"></a>
-<span class="sourceLineNo">1579</span>    };<a name="line.1579"></a>
-<span class="sourceLineNo">1580</span>    regionCloseThread.start();<a name="line.1580"></a>
-<span class="sourceLineNo">1581</span><a name="line.1581"></a>
-<span class="sourceLineNo">1582</span>    startingClose.await();<a name="line.1582"></a>
-<span class="sourceLineNo">1583</span>    startingPuts.await();<a name="line.1583"></a>
-<span class="sourceLineNo">1584</span>    Thread.sleep(100);<a name="line.1584"></a>
-<span class="sourceLineNo">1585</span>    LOG.info("...releasing row lock 1, which should let put thread continue");<a name="line.1585"></a>
-<span class="sourceLineNo">1586</span>    rowLock1.release();<a name="line.1586"></a>
-<span class="sourceLineNo">1587</span>    rowLock2.release();<a name="line.1587"></a>
-<span class="sourceLineNo">1588</span>    rowLock3.release();<a name="line.1588"></a>
-<span class="sourceLineNo">1589</span>    waitForCounter(source, "syncTimeNumOps", syncs + 1);<a name="line.1589"></a>
-<span class="sourceLineNo">1590</span><a name="line.1590"></a>
-<span class="sourceLineNo">1591</span>    LOG.info("...joining on put thread");<a name="line.1591"></a>
-<span class="sourceLineNo">1592</span>    ctx.stop();<a name="line.1592"></a>
-<span class="sourceLineNo">1593</span>    regionCloseThread.join();<a name="line.1593"></a>
-<span class="sourceLineNo">1594</span><a name="line.1594"></a>
-<span class="sourceLineNo">1595</span>    OperationStatus[] codes = retFromThread.get();<a name="line.1595"></a>
-<span class="sourceLineNo">1596</span>    for (int i = 0; i &lt; codes.length; i++) {<a name="line.1596"></a>
-<span class="sourceLineNo">1597</span>      assertEquals((i == 5) ? OperationStatusCode.BAD_FAMILY : OperationStatusCode.SUCCESS,<a name="line.1597"></a>
-<span class="sourceLineNo">1598</span>          codes[i].getOperationStatusCode());<a name="line.1598"></a>
-<span class="sourceLineNo">1599</span>    }<a name="line.1599"></a>
-<span class="sourceLineNo">1600</span>    rowLock4.release();<a name="line.1600"></a>
-<span class="sourceLineNo">1601</span>  }<a name="line.1601"></a>
-<span class="sourceLineNo">1602</span><a name="line.1602"></a>
-<span class="sourceLineNo">1603</span>  private void waitForCounter(MetricsWALSource source, String metricName, long expectedCount)<a name="line.1603"></a>
-<span class="sourceLineNo">1604</span>      throws InterruptedException {<a name="line.1604"></a>
-<span class="sourceLineNo">1605</span>    long startWait = System.currentTimeMillis();<a name="line.1605"></a>
-<span class="sourceLineNo">1606</span>    long currentCount;<a name="line.1606"></a>
-<span class="sourceLineNo">1607</span>    while ((currentCount = metricsAssertHelper.getCounter(metricName, source)) &lt; expectedCount) {<a name="line.1607"></a>
-<span class="sourceLineNo">1608</span>      Thread.sleep(100);<a name="line.1608"></a>
-<span class="sourceLineNo">1609</span>      if (System.currentTimeMillis() - startWait &gt; 10000) {<a name="line.1609"></a>
-<span class="sourceLineNo">1610</span>        fail(String.format("Timed out waiting for '%s' &gt;= '%s', currentCount=%s", metricName,<a name="line.1610"></a>
-<span class="sourceLineNo">1611</span>            expectedCount, currentCount));<a name="line.1611"></a>
-<span class="sourceLineNo">1612</span>      }<a name="line.1612"></a>
-<span class="sourceLineNo">1613</span>    }<a name="line.1613"></a>
-<span class="sourceLineNo">1614</span>  }<a name="line.1614"></a>
-<span class="sourceLineNo">1615</span><a name="line.1615"></a>
-<span class="sourceLineNo">1616</span>  @Test<a name="line.1616"></a>
-<span class="sourceLineNo">1617</span>  public void testAtomicBatchPut() throws IOException {<a name="line.1617"></a>
-<span class="sourceLineNo">1618</span>    final Put[] puts = new Put[10];<a name="line.1618"></a>
-<span class="sourceLineNo">1619</span>    MetricsWALSource source = CompatibilitySingletonFactory.getInstance(MetricsWALSource.class);<a name="line.1619"></a>
-<span class="sourceLineNo">1620</span>    long syncs = prepareRegionForBachPut(puts, source, false);<a name="line.1620"></a>
-<span class="sourceLineNo">1621</span><a name="line.1621"></a>
-<span class="sourceLineNo">1622</span>    // 1. Straight forward case, should succeed<a name="line.1622"></a>
-<span class="sourceLineNo">1623</span>    MutationBatchOperation batchOp = new MutationBatchOperation(region, puts, true,<a name="line.1623"></a>
-<span class="sourceLineNo">1624</span>        HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.1624"></a>
-<span class="sourceLineNo">1625</span>    OperationStatus[] codes = this.region.batchMutate(batchOp);<a name="line.1625"></a>
-<span class="sourceLineNo">1626</span>    assertEquals(10, codes.length);<a name="line.1626"></a>
-<span class="sourceLineNo">1627</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.1627"></a>
-<span class="sourceLineNo">1628</span>      assertEquals(OperationStatusCode.SUCCESS, codes[i].getOperationStatusCode());<a name="line.1628"></a>
-<span class="sourceLineNo">1629</span>    }<a name="line.1629"></a>
-<span class="sourceLineNo">1630</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs + 1, source);<a name="line.1630"></a>
-<span class="sourceLineNo">1631</span><a name="line.1631"></a>
-<span class="sourceLineNo">1632</span>    // 2. Failed to get lock<a name="line.1632"></a>
-<span class="sourceLineNo">1633</span>    RowLock lock = region.getRowLock(Bytes.toBytes("row_" + 3));<a name="line.1633"></a>
-<span class="sourceLineNo">1634</span>    // Method {@link HRegion#getRowLock(byte[])} is reentrant. As 'row_3' is locked in this<a name="line.1634"></a>
-<span class="sourceLineNo">1635</span>    // thread, need to run {@link HRegion#batchMutate(HRegion.BatchOperation)} in different thread<a name="line.1635"></a>
-<span class="sourceLineNo">1636</span>    MultithreadedTestUtil.TestContext ctx = new MultithreadedTestUtil.TestContext(CONF);<a name="line.1636"></a>
-<span class="sourceLineNo">1637</span>    final AtomicReference&lt;IOException&gt; retFromThread = new AtomicReference&lt;&gt;();<a name="line.1637"></a>
-<span class="sourceLineNo">1638</span>    final CountDownLatch finishedPuts = new CountDownLatch(1);<a name="line.1638"></a>
-<span class="sourceLineNo">1639</span>    final MutationBatchOperation finalBatchOp = new MutationBatchOperation(region, puts, true,<a name="line.1639"></a>
-<span class="sourceLineNo">1640</span>        HConstants<a name="line.1640"></a>
-<span class="sourceLineNo">1641</span>        .NO_NONCE,<a name="line.1641"></a>
-<span class="sourceLineNo">1642</span>        HConstants.NO_NONCE);<a name="line.1642"></a>
-<span class="sourceLineNo">1643</span>    TestThread putter = new TestThread(ctx) {<a name="line.1643"></a>
-<span class="sourceLineNo">1644</span>      @Override<a name="line.1644"></a>
-<span class="sourceLineNo">1645</span>      public void doWork() throws IOException {<a name="line.1645"></a>
-<span class="sourceLineNo">1646</span>        try {<a name="line.1646"></a>
-<span class="sourceLineNo">1647</span>          region.batchMutate(finalBatchOp);<a name="line.1647"></a>
-<span class="sourceLineNo">1648</span>        } catch (IOException ioe) {<a name="line.1648"></a>
-<span class="sourceLineNo">1649</span>          LOG.error("test failed!", ioe);<a name="line.1649"></a>
-<span class="sourceLineNo">1650</span>          retFromThread.set(ioe);<a name="line.1650"></a>
-<span class="sourceLineNo">1651</span>        }<a name="line.1651"></a>
-<span class="sourceLineNo">1652</span>        finishedPuts.countDown();<a name="line.1652"></a>
-<span class="sourceLineNo">1653</span>      }<a name="line.1653"></a>
-<span class="sourceLineNo">1654</span>    };<a name="line.1654"></a>
-<span class="sourceLineNo">1655</span>    LOG.info("...starting put thread while holding locks");<a name="line.1655"></a>
-<span class="sourceLineNo">1656</span>    ctx.addThread(putter);<a name="line.1656"></a>
-<span class="sourceLineNo">1657</span>    ctx.startThreads();<a name="line.1657"></a>
-<span class="sourceLineNo">1658</span>    LOG.info("...waiting for batch puts while holding locks");<a name="line.1658"></a>
-<span class="sourceLineNo">1659</span>    try {<a name="line.1659"></a>
-<span class="sourceLineNo">1660</span>      finishedPuts.await();<a name="line.1660"></a>
-<span class="sourceLineNo">1661</span>    } catch (InterruptedException e) {<a name="line.1661"></a>
-<span class="sourceLineNo">1662</span>      LOG.error("Interrupted!", e);<a name="line.1662"></a>
-<span class="sourceLineNo">1663</span>    } finally {<a name="line.1663"></a>
-<span class="sourceLineNo">1664</span>      if (lock != null) {<a name="line.1664"></a>
-<span class="sourceLineNo">1665</span>        lock.release();<a name="line.1665"></a>
-<span class="sourceLineNo">1666</span>      }<a name="line.1666"></a>
-<span class="sourceLineNo">1667</span>    }<a name="line.1667"></a>
-<span class="sourceLineNo">1668</span>    assertNotNull(retFromThread.get());<a name="line.1668"></a>
-<span class="sourceLineNo">1669</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs + 1, source);<a name="line.1669"></a>
-<span class="sourceLineNo">1670</span><a name="line.1670"></a>
-<span class="sourceLineNo">1671</span>    // 3. Exception thrown in validation<a name="line.1671"></a>
-<span class="sourceLineNo">1672</span>    LOG.info("Next a batch put with one invalid family");<a name="line.1672"></a>
-<span class="sourceLineNo">1673</span>    puts[5].addColumn(Bytes.toBytes("BAD_CF"), qual, value);<a name="line.1673"></a>
-<span class="sourceLineNo">1674</span>    batchOp = new MutationBatchOperation(region, puts, true, HConstants.NO_NONCE,<a name="line.1674"></a>
-<span class="sourceLineNo">1675</span>        HConstants.NO_NONCE);<a name="line.1675"></a>
-<span class="sourceLineNo">1676</span>    thrown.expect(NoSuchColumnFamilyException.class);<a name="line.1676"></a>
-<span class="sourceLineNo">1677</span>    this.region.batchMutate(batchOp);<a name="line.1677"></a>
-<span class="sourceLineNo">1678</span>  }<a name="line.1678"></a>
-<span class="sourceLineNo">1679</span><a name="line.1679"></a>
-<span class="sourceLineNo">1680</span>  @Test<a name="line.1680"></a>
-<span class="sourceLineNo">1681</span>  public void testBatchPutWithTsSlop() throws Exception {<a name="line.1681"></a>
-<span class="sourceLineNo">1682</span>    // add data with a timestamp that is too recent for range. Ensure assert<a name="line.1682"></a>
-<span class="sourceLineNo">1683</span>    CONF.setInt("hbase.hregion.keyvalue.timestamp.slop.millisecs", 1000);<a name="line.1683"></a>
-<span class="sourceLineNo">1684</span>    final Put[] puts = new Put[10];<a name="line.1684"></a>
-<span class="sourceLineNo">1685</span>    MetricsWALSource source = CompatibilitySingletonFactory.getInstance(MetricsWALSource.class);<a name="line.1685"></a>
-<span class="sourceLineNo">1686</span><a name="line.1686"></a>
-<span class="sourceLineNo">1687</span>    long syncs = prepareRegionForBachPut(puts, source, true);<a name="line.1687"></a>
-<span class="sourceLineNo">1688</span><a name="line.1688"></a>
-<span class="sourceLineNo">1689</span>    OperationStatus[] codes = this.region.batchMutate(puts);<a name="line.1689"></a>
-<span class="sourceLineNo">1690</span>    assertEquals(10, codes.length);<a name="line.1690"></a>
-<span class="sourceLineNo">1691</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.1691"></a>
-<span class="sourceLineNo">1692</span>      assertEquals(OperationStatusCode.SANITY_CHECK_FAILURE, codes[i].getOperationStatusCode());<a name="line.1692"></a>
-<span class="sourceLineNo">1693</span>    }<a name="line.1693"></a>
-<span class="sourceLineNo">1694</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs, source);<a name="line.1694"></a>
-<span class="sourceLineNo">1695</span>  }<a name="line.1695"></a>
-<span class="sourceLineNo">1696</span><a name="line.1696"></a>
-<span class="sourceLineNo">1697</span>  /**<a name="line.1697"></a>
-<span class="sourceLineNo">1698</span>   * @return syncs initial syncTimeNumOps<a name="line.1698"></a>
-<span class="sourceLineNo">1699</span>   */<a name="line.1699"></a>
-<span class="sourceLineNo">1700</span>  private long prepareRegionForBachPut(final Put[] puts, final MetricsWALSource source,<a name="line.1700"></a>
-<span class="sourceLineNo">1701</span>      boolean slop) throws IOException {<a name="line.1701"></a>
-<span class="sourceLineNo">1702</span>    this.region = initHRegion(tableName, method, CONF, COLUMN_FAMILY_BYTES);<a name="line.1702"></a>
-<span class="sourceLineNo">1703</span><a name="line.1703"></a>
-<span class="sourceLineNo">1704</span>    LOG.info("First a batch put with all valid puts");<a name="line.1704"></a>
-<span class="sourceLineNo">1705</span>    for (int i = 0; i &lt; puts.length; i++) {<a name="line.1705"></a>
-<span class="sourceLineNo">1706</span>      puts[i] = slop ? new Put(Bytes.toBytes("row_" + i), Long.MAX_VALUE - 100) :<a name="line.1706"></a>
-<span class="sourceLineNo">1707</span>          new Put(Bytes.toBytes("row_" + i));<a name="line.1707"></a>
-<span class="sourceLineNo">1708</span>      puts[i].addColumn(COLUMN_FAMILY_BYTES, qual, value);<a name="line.1708"></a>
-<span class="sourceLineNo">1709</span>    }<a name="line.1709"></a>
-<span class="sourceLineNo">1710</span><a name="line.1710"></a>
-<span class="sourceLineNo">1711</span>    long syncs = metricsAssertHelper.getCounter("syncTimeNumOps", source);<a name="line.1711"></a>
-<span class="sourceLineNo">1712</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs, source);<a name="line.1712"></a>
-<span class="sourceLineNo">1713</span>    return syncs;<a name="line.1713"></a>
-<span class="sourceLineNo">1714</span>  }<a name="line.1714"></a>
-<span class="sourceLineNo">1715</span><a name="line.1715"></a>
-<span class="sourceLineNo">1716</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.1716"></a>
-<span class="sourceLineNo">1717</span>  // checkAndMutate tests<a name="line.1717"></a>
-<span class="sourceLineNo">1718</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.1718"></a>
-<span class="sourceLineNo">1719</span>  @Test<a name="line.1719"></a>
-<span class="sourceLineNo">1720</span>  public void testCheckAndMutate_WithEmptyRowValue() throws IOException {<a name="line.1720"></a>
-<span class="sourceLineNo">1721</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1721"></a>
-<span class="sourceLineNo">1722</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1722"></a>
-<span class="sourceLineNo">1723</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1723"></a>
-<span class="sourceLineNo">1724</span>    byte[] emptyVal = new byte[] {};<a name="line.1724"></a>
-<span class="sourceLineNo">1725</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1725"></a>
-<span class="sourceLineNo">1726</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.1726"></a>
-<span class="sourceLineNo">1727</span><a name="line.1727"></a>
-<span class="sourceLineNo">1728</span>    // Setting up region<a name="line.1728"></a>
-<span class="sourceLineNo">1729</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.1729"></a>
-<span class="sourceLineNo">1730</span>    // Putting empty data in key<a name="line.1730"></a>
-<span class="sourceLineNo">1731</span>    Put put = new Put(row1);<a name="line.1731"></a>
-<span class="sourceLineNo">1732</span>    put.addColumn(fam1, qf1, emptyVal);<a name="line.1732"></a>
-<span class="sourceLineNo">1733</span><a name="line.1733"></a>
-<span class="sourceLineNo">1734</span>    // checkAndPut with empty value<a name="line.1734"></a>
-<span class="sourceLineNo">1735</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1735"></a>
-<span class="sourceLineNo">1736</span>        new BinaryComparator(emptyVal), put);<a name="line.1736"></a>
-<span class="sourceLineNo">1737</span>    assertTrue(res);<a name="line.1737"></a>
-<span class="sourceLineNo">1738</span><a name="line.1738"></a>
-<span class="sourceLineNo">1739</span>    // Putting data in key<a name="line.1739"></a>
-<span class="sourceLineNo">1740</span>    put = new Put(row1);<a name="line.1740"></a>
-<span class="sourceLineNo">1741</span>    put.addColumn(fam1, qf1, val1);<a name="line.1741"></a>
-<span class="sourceLineNo">1742</span><a name="line.1742"></a>
-<span class="sourceLineNo">1743</span>    // checkAndPut with correct value<a name="line.1743"></a>
-<span class="sourceLineNo">1744</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1744"></a>
-<span class="sourceLineNo">1745</span>        new BinaryComparator(emptyVal), put);<a name="line.1745"></a>
-<span class="sourceLineNo">1746</span>    assertTrue(res);<a name="line.1746"></a>
-<span class="sourceLineNo">1747</span><a name="line.1747"></a>
-<span class="sourceLineNo">1748</span>    // not empty anymore<a name="line.1748"></a>
-<span class="sourceLineNo">1749</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1749"></a>
-<span class="sourceLineNo">1750</span>        new BinaryComparator(emptyVal), put);<a name="line.1750"></a>
-<span class="sourceLineNo">1751</span>    assertFalse(res);<a name="line.1751"></a>
-<span class="sourceLineNo">1752</span><a name="line.1752"></a>
-<span class="sourceLineNo">1753</span>    Delete delete = new Delete(row1);<a name="line.1753"></a>
-<span class="sourceLineNo">1754</span>    delete.addColumn(fam1, qf1);<a name="line.1754"></a>
-<span class="sourceLineNo">1755</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1755"></a>
-<span class="sourceLineNo">1756</span>        new BinaryComparator(emptyVal), delete);<a name="line.1756"></a>
-<span class="sourceLineNo">1757</span>    assertFalse(res);<a name="line.1757"></a>
-<span class="sourceLineNo">1758</span><a name="line.1758"></a>
-<span class="sourceLineNo">1759</span>    put = new Put(row1);<a name="line.1759"></a>
-<span class="sourceLineNo">1760</span>    put.addColumn(fam1, qf1, val2);<a name="line.1760"></a>
-<span class="sourceLineNo">1761</span>    // checkAndPut with correct value<a name="line.1761"></a>
-<span class="sourceLineNo">1762</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1762"></a>
-<span class="sourceLineNo">1763</span>        new BinaryComparator(val1), put);<a name="line.1763"></a>
-<span class="sourceLineNo">1764</span>    assertTrue(res);<a name="line.1764"></a>
-<span class="sourceLineNo">1765</span><a name="line.1765"></a>
-<span class="sourceLineNo">1766</span>    // checkAndDelete with correct value<a name="line.1766"></a>
-<span class="sourceLineNo">1767</span>    delete = new Delete(row1);<a name="line.1767"></a>
-<span class="sourceLineNo">1768</span>    delete.addColumn(fam1, qf1);<a name="line.1768"></a>
+<span class="sourceLineNo">404</span>    ChunkCreator.initialize(MemStoreLABImpl.CHUNK_SIZE_DEFAULT, false, 0, 0, 0, null);<a name="line.404"></a>
+<span class="sourceLineNo">405</span>    FSHLog hLog = new FSHLog(fs, rootDir, testName, CONF);<a name="line.405"></a>
+<span class="sourceLineNo">406</span>    hLog.init();<a name="line.406"></a>
+<span class="sourceLineNo">407</span>    region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, hLog,<a name="line.407"></a>
+<span class="sourceLineNo">408</span>        COLUMN_FAMILY_BYTES);<a name="line.408"></a>
+<span class="sourceLineNo">409</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.409"></a>
+<span class="sourceLineNo">410</span>    assertEquals(0, region.getMemStoreDataSize());<a name="line.410"></a>
+<span class="sourceLineNo">411</span><a name="line.411"></a>
+<span class="sourceLineNo">412</span>    // Put one value<a name="line.412"></a>
+<span class="sourceLineNo">413</span>    byte [] value = Bytes.toBytes(method);<a name="line.413"></a>
+<span class="sourceLineNo">414</span>    Put put = new Put(value);<a name="line.414"></a>
+<span class="sourceLineNo">415</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    region.put(put);<a name="line.416"></a>
+<span class="sourceLineNo">417</span>    long onePutSize = region.getMemStoreDataSize();<a name="line.417"></a>
+<span class="sourceLineNo">418</span>    assertTrue(onePutSize &gt; 0);<a name="line.418"></a>
+<span class="sourceLineNo">419</span><a name="line.419"></a>
+<span class="sourceLineNo">420</span>    RegionCoprocessorHost mockedCPHost = Mockito.mock(RegionCoprocessorHost.class);<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    doThrow(new IOException())<a name="line.421"></a>
+<span class="sourceLineNo">422</span>       .when(mockedCPHost).postBatchMutate(Mockito.&lt;MiniBatchOperationInProgress&lt;Mutation&gt;&gt;any());<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    region.setCoprocessorHost(mockedCPHost);<a name="line.423"></a>
+<span class="sourceLineNo">424</span><a name="line.424"></a>
+<span class="sourceLineNo">425</span>    put = new Put(value);<a name="line.425"></a>
+<span class="sourceLineNo">426</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("dfg"), value);<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    try {<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      region.put(put);<a name="line.428"></a>
+<span class="sourceLineNo">429</span>      fail("Should have failed with IOException");<a name="line.429"></a>
+<span class="sourceLineNo">430</span>    } catch (IOException expected) {<a name="line.430"></a>
+<span class="sourceLineNo">431</span>    }<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    long expectedSize = onePutSize * 2;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>    assertEquals("memstoreSize should be incremented",<a name="line.433"></a>
+<span class="sourceLineNo">434</span>        expectedSize, region.getMemStoreDataSize());<a name="line.434"></a>
+<span class="sourceLineNo">435</span>    assertEquals("flushable size should be incremented",<a name="line.435"></a>
+<span class="sourceLineNo">436</span>        expectedSize, store.getFlushableSize().getDataSize());<a name="line.436"></a>
+<span class="sourceLineNo">437</span><a name="line.437"></a>
+<span class="sourceLineNo">438</span>    region.setCoprocessorHost(null);<a name="line.438"></a>
+<span class="sourceLineNo">439</span>  }<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>   * A test case of HBASE-21041<a name="line.442"></a>
+<span class="sourceLineNo">443</span>   * @throws Exception Exception<a name="line.443"></a>
+<span class="sourceLineNo">444</span>   */<a name="line.444"></a>
+<span class="sourceLineNo">445</span>  @Test<a name="line.445"></a>
+<span class="sourceLineNo">446</span>  public void testFlushAndMemstoreSizeCounting() throws Exception {<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    byte[] family = Bytes.toBytes("family");<a name="line.447"></a>
+<span class="sourceLineNo">448</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.448"></a>
+<span class="sourceLineNo">449</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.449"></a>
+<span class="sourceLineNo">450</span>    try {<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      for (byte[] row : HBaseTestingUtility.ROWS) {<a name="line.451"></a>
+<span class="sourceLineNo">452</span>        Put put = new Put(row);<a name="line.452"></a>
+<span class="sourceLineNo">453</span>        put.addColumn(family, family, row);<a name="line.453"></a>
+<span class="sourceLineNo">454</span>        region.put(put);<a name="line.454"></a>
+<span class="sourceLineNo">455</span>      }<a name="line.455"></a>
+<span class="sourceLineNo">456</span>      region.flush(true);<a name="line.456"></a>
+<span class="sourceLineNo">457</span>      // After flush, data size should be zero<a name="line.457"></a>
+<span class="sourceLineNo">458</span>      assertEquals(0, region.getMemStoreDataSize());<a name="line.458"></a>
+<span class="sourceLineNo">459</span>      // After flush, a new active mutable segment is created, so the heap size<a name="line.459"></a>
+<span class="sourceLineNo">460</span>      // should equal to MutableSegment.DEEP_OVERHEAD<a name="line.460"></a>
+<span class="sourceLineNo">461</span>      assertEquals(MutableSegment.DEEP_OVERHEAD, region.getMemStoreHeapSize());<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      // After flush, offheap should be zero<a name="line.462"></a>
+<span class="sourceLineNo">463</span>      assertEquals(0, region.getMemStoreOffHeapSize());<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    } finally {<a name="line.464"></a>
+<span class="sourceLineNo">465</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.465"></a>
+<span class="sourceLineNo">466</span>      this.region = null;<a name="line.466"></a>
+<span class="sourceLineNo">467</span>      wals.close();<a name="line.467"></a>
+<span class="sourceLineNo">468</span>    }<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>  /**<a name="line.471"></a>
+<span class="sourceLineNo">472</span>   * Test we do not lose data if we fail a flush and then close.<a name="line.472"></a>
+<span class="sourceLineNo">473</span>   * Part of HBase-10466.  Tests the following from the issue description:<a name="line.473"></a>
+<span class="sourceLineNo">474</span>   * "Bug 1: Wrong calculation of HRegion.memstoreSize: When a flush fails, data to be flushed is<a name="line.474"></a>
+<span class="sourceLineNo">475</span>   * kept in each MemStore's snapshot and wait for next flush attempt to continue on it. But when<a name="line.475"></a>
+<span class="sourceLineNo">476</span>   * the next flush succeeds, the counter of total memstore size in HRegion is always deduced by<a name="line.476"></a>
+<span class="sourceLineNo">477</span>   * the sum of current memstore sizes instead of snapshots left from previous failed flush. This<a name="line.477"></a>
+<span class="sourceLineNo">478</span>   * calculation is problematic that almost every time there is failed flush, HRegion.memstoreSize<a name="line.478"></a>
+<span class="sourceLineNo">479</span>   * gets reduced by a wrong value. If region flush could not proceed for a couple cycles, the size<a name="line.479"></a>
+<span class="sourceLineNo">480</span>   * in current memstore could be much larger than the snapshot. It's likely to drift memstoreSize<a name="line.480"></a>
+<span class="sourceLineNo">481</span>   * much smaller than expected. In extreme case, if the error accumulates to even bigger than<a name="line.481"></a>
+<span class="sourceLineNo">482</span>   * HRegion's memstore size limit, any further flush is skipped because flush does not do anything<a name="line.482"></a>
+<span class="sourceLineNo">483</span>   * if memstoreSize is not larger than 0."<a name="line.483"></a>
+<span class="sourceLineNo">484</span>   * @throws Exception<a name="line.484"></a>
+<span class="sourceLineNo">485</span>   */<a name="line.485"></a>
+<span class="sourceLineNo">486</span>  @Test<a name="line.486"></a>
+<span class="sourceLineNo">487</span>  public void testFlushSizeAccounting() throws Exception {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.488"></a>
+<span class="sourceLineNo">489</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.489"></a>
+<span class="sourceLineNo">490</span>    // Only retry once.<a name="line.490"></a>
+<span class="sourceLineNo">491</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.491"></a>
+<span class="sourceLineNo">492</span>    final User user =<a name="line.492"></a>
+<span class="sourceLineNo">493</span>      User.createUserForTesting(conf, method, new String[]{"foo"});<a name="line.493"></a>
+<span class="sourceLineNo">494</span>    // Inject our faulty LocalFileSystem<a name="line.494"></a>
+<span class="sourceLineNo">495</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.496"></a>
+<span class="sourceLineNo">497</span>      @Override<a name="line.497"></a>
+<span class="sourceLineNo">498</span>      public Object run() throws Exception {<a name="line.498"></a>
+<span class="sourceLineNo">499</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.499"></a>
+<span class="sourceLineNo">500</span>        FileSystem fs = FileSystem.get(conf);<a name="line.500"></a>
+<span class="sourceLineNo">501</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.501"></a>
+<span class="sourceLineNo">502</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.502"></a>
+<span class="sourceLineNo">503</span>        HRegion region = null;<a name="line.503"></a>
+<span class="sourceLineNo">504</span>        try {<a name="line.504"></a>
+<span class="sourceLineNo">505</span>          // Initialize region<a name="line.505"></a>
+<span class="sourceLineNo">506</span>          region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, wal,<a name="line.506"></a>
+<span class="sourceLineNo">507</span>              COLUMN_FAMILY_BYTES);<a name="line.507"></a>
+<span class="sourceLineNo">508</span>          long size = region.getMemStoreDataSize();<a name="line.508"></a>
+<span class="sourceLineNo">509</span>          Assert.assertEquals(0, size);<a name="line.509"></a>
+<span class="sourceLineNo">510</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.510"></a>
+<span class="sourceLineNo">511</span>          Put p1 = new Put(row);<a name="line.511"></a>
+<span class="sourceLineNo">512</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[]) null));<a name="line.512"></a>
+<span class="sourceLineNo">513</span>          region.put(p1);<a name="line.513"></a>
+<span class="sourceLineNo">514</span>          final long sizeOfOnePut = region.getMemStoreDataSize();<a name="line.514"></a>
+<span class="sourceLineNo">515</span>          // Fail a flush which means the current memstore will hang out as memstore 'snapshot'.<a name="line.515"></a>
+<span class="sourceLineNo">516</span>          try {<a name="line.516"></a>
+<span class="sourceLineNo">517</span>            LOG.info("Flushing");<a name="line.517"></a>
+<span class="sourceLineNo">518</span>            region.flush(true);<a name="line.518"></a>
+<span class="sourceLineNo">519</span>            Assert.fail("Didn't bubble up IOE!");<a name="line.519"></a>
+<span class="sourceLineNo">520</span>          } catch (DroppedSnapshotException dse) {<a name="line.520"></a>
+<span class="sourceLineNo">521</span>            // What we are expecting<a name="line.521"></a>
+<span class="sourceLineNo">522</span>            region.closing.set(false); // this is needed for the rest of the test to work<a name="line.522"></a>
+<span class="sourceLineNo">523</span>          }<a name="line.523"></a>
+<span class="sourceLineNo">524</span>          // Make it so all writes succeed from here on out<a name="line.524"></a>
+<span class="sourceLineNo">525</span>          ffs.fault.set(false);<a name="line.525"></a>
+<span class="sourceLineNo">526</span>          // Check sizes.  Should still be the one entry.<a name="line.526"></a>
+<span class="sourceLineNo">527</span>          Assert.assertEquals(sizeOfOnePut, region.getMemStoreDataSize());<a name="line.527"></a>
+<span class="sourceLineNo">528</span>          // Now add two entries so that on this next flush that fails, we can see if we<a name="line.528"></a>
+<span class="sourceLineNo">529</span>          // subtract the right amount, the snapshot size only.<a name="line.529"></a>
+<span class="sourceLineNo">530</span>          Put p2 = new Put(row);<a name="line.530"></a>
+<span class="sourceLineNo">531</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.531"></a>
+<span class="sourceLineNo">532</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.532"></a>
+<span class="sourceLineNo">533</span>          region.put(p2);<a name="line.533"></a>
+<span class="sourceLineNo">534</span>          long expectedSize = sizeOfOnePut * 3;<a name="line.534"></a>
+<span class="sourceLineNo">535</span>          Assert.assertEquals(expectedSize, region.getMemStoreDataSize());<a name="line.535"></a>
+<span class="sourceLineNo">536</span>          // Do a successful flush.  It will clear the snapshot only.  Thats how flushes work.<a name="line.536"></a>
+<span class="sourceLineNo">537</span>          // If already a snapshot, we clear it else we move the memstore to be snapshot and flush<a name="line.537"></a>
+<span class="sourceLineNo">538</span>          // it<a name="line.538"></a>
+<span class="sourceLineNo">539</span>          region.flush(true);<a name="line.539"></a>
+<span class="sourceLineNo">540</span>          // Make sure our memory accounting is right.<a name="line.540"></a>
+<span class="sourceLineNo">541</span>          Assert.assertEquals(sizeOfOnePut * 2, region.getMemStoreDataSize());<a name="line.541"></a>
+<span class="sourceLineNo">542</span>        } finally {<a name="line.542"></a>
+<span class="sourceLineNo">543</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.543"></a>
+<span class="sourceLineNo">544</span>        }<a name="line.544"></a>
+<span class="sourceLineNo">545</span>        return null;<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>    FileSystem.closeAllForUGI(user.getUGI());<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>  @Test<a name="line.551"></a>
+<span class="sourceLineNo">552</span>  public void testCloseWithFailingFlush() throws Exception {<a name="line.552"></a>
+<span class="sourceLineNo">553</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.553"></a>
+<span class="sourceLineNo">554</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.554"></a>
+<span class="sourceLineNo">555</span>    // Only retry once.<a name="line.555"></a>
+<span class="sourceLineNo">556</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.556"></a>
+<span class="sourceLineNo">557</span>    final User user =<a name="line.557"></a>
+<span class="sourceLineNo">558</span>      User.createUserForTesting(conf, this.method, new String[]{"foo"});<a name="line.558"></a>
+<span class="sourceLineNo">559</span>    // Inject our faulty LocalFileSystem<a name="line.559"></a>
+<span class="sourceLineNo">560</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.560"></a>
+<span class="sourceLineNo">561</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.561"></a>
+<span class="sourceLineNo">562</span>      @Override<a name="line.562"></a>
+<span class="sourceLineNo">563</span>      public Object run() throws Exception {<a name="line.563"></a>
+<span class="sourceLineNo">564</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.564"></a>
+<span class="sourceLineNo">565</span>        FileSystem fs = FileSystem.get(conf);<a name="line.565"></a>
+<span class="sourceLineNo">566</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.566"></a>
+<span class="sourceLineNo">567</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.567"></a>
+<span class="sourceLineNo">568</span>        HRegion region = null;<a name="line.568"></a>
+<span class="sourceLineNo">569</span>        try {<a name="line.569"></a>
+<span class="sourceLineNo">570</span>          // Initialize region<a name="line.570"></a>
+<span class="sourceLineNo">571</span>          region = initHRegion(tableName, null, null, false,<a name="line.571"></a>
+<span class="sourceLineNo">572</span>              Durability.SYNC_WAL, wal, COLUMN_FAMILY_BYTES);<a name="line.572"></a>
+<span class="sourceLineNo">573</span>          long size = region.getMemStoreDataSize();<a name="line.573"></a>
+<span class="sourceLineNo">574</span>          Assert.assertEquals(0, size);<a name="line.574"></a>
+<span class="sourceLineNo">575</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.575"></a>
+<span class="sourceLineNo">576</span>          Put p1 = new Put(row);<a name="line.576"></a>
+<span class="sourceLineNo">577</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[])null));<a name="line.577"></a>
+<span class="sourceLineNo">578</span>          region.put(p1);<a name="line.578"></a>
+<span class="sourceLineNo">579</span>          // Manufacture an outstanding snapshot -- fake a failed flush by doing prepare step only.<a name="line.579"></a>
+<span class="sourceLineNo">580</span>          HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.580"></a>
+<span class="sourceLineNo">581</span>          StoreFlushContext storeFlushCtx =<a name="line.581"></a>
+<span class="sourceLineNo">582</span>              store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY);<a name="line.582"></a>
+<span class="sourceLineNo">583</span>          storeFlushCtx.prepare();<a name="line.583"></a>
+<span class="sourceLineNo">584</span>          // Now add two entries to the foreground memstore.<a name="line.584"></a>
+<span class="sourceLineNo">585</span>          Put p2 = new Put(row);<a name="line.585"></a>
+<span class="sourceLineNo">586</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.586"></a>
+<span class="sourceLineNo">587</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.587"></a>
+<span class="sourceLineNo">588</span>          region.put(p2);<a name="line.588"></a>
+<span class="sourceLineNo">589</span>          // Now try close on top of a failing flush.<a name="line.589"></a>
+<span class="sourceLineNo">590</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.590"></a>
+<span class="sourceLineNo">591</span>          region = null;<a name="line.591"></a>
+<span class="sourceLineNo">592</span>          fail();<a name="line.592"></a>
+<span class="sourceLineNo">593</span>        } catch (DroppedSnapshotException dse) {<a name="line.593"></a>
+<span class="sourceLineNo">594</span>          // Expected<a name="line.594"></a>
+<span class="sourceLineNo">595</span>          LOG.info("Expected DroppedSnapshotException");<a name="line.595"></a>
+<span class="sourceLineNo">596</span>        } finally {<a name="line.596"></a>
+<span class="sourceLineNo">597</span>          // Make it so all writes succeed from here on out so can close clean<a name="line.597"></a>
+<span class="sourceLineNo">598</span>          ffs.fault.set(false);<a name="line.598"></a>
+<span class="sourceLineNo">599</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.599"></a>
+<span class="sourceLineNo">600</span>        }<a name="line.600"></a>
+<span class="sourceLineNo">601</span>        return null;<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>    FileSystem.closeAllForUGI(user.getUGI());<a name="line.604"></a>
+<span class="sourceLineNo">605</span>  }<a name="line.605"></a>
+<span class="sourceLineNo">606</span><a name="line.606"></a>
+<span class="sourceLineNo">607</span>  @Test<a name="line.607"></a>
+<span class="sourceLineNo">608</span>  public void testCompactionAffectedByScanners() throws Exception {<a name="line.608"></a>
+<span class="sourceLineNo">609</span>    byte[] family = Bytes.toBytes("family");<a name="line.609"></a>
+<span class="sourceLineNo">610</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.610"></a>
+<span class="sourceLineNo">611</span><a name="line.611"></a>
+<span class="sourceLineNo">612</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.612"></a>
+<span class="sourceLineNo">613</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.613"></a>
+<span class="sourceLineNo">614</span>    region.put(put);<a name="line.614"></a>
+<span class="sourceLineNo">615</span>    region.flush(true);<a name="line.615"></a>
+<span class="sourceLineNo">616</span><a name="line.616"></a>
+<span class="sourceLineNo">617</span>    Scan scan = new Scan();<a name="line.617"></a>
+<span class="sourceLineNo">618</span>    scan.setMaxVersions(3);<a name="line.618"></a>
+<span class="sourceLineNo">619</span>    // open the first scanner<a name="line.619"></a>
+<span class="sourceLineNo">620</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.620"></a>
+<span class="sourceLineNo">621</span><a name="line.621"></a>
+<span class="sourceLineNo">622</span>    Delete delete = new Delete(Bytes.toBytes("r1"));<a name="line.622"></a>
+<span class="sourceLineNo">623</span>    region.delete(delete);<a name="line.623"></a>
+<span class="sourceLineNo">624</span>    region.flush(true);<a name="line.624"></a>
+<span class="sourceLineNo">625</span><a name="line.625"></a>
+<span class="sourceLineNo">626</span>    // open the second scanner<a name="line.626"></a>
+<span class="sourceLineNo">627</span>    RegionScanner scanner2 = region.getScanner(scan);<a name="line.627"></a>
+<span class="sourceLineNo">628</span><a name="line.628"></a>
+<span class="sourceLineNo">629</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.629"></a>
+<span class="sourceLineNo">630</span><a name="line.630"></a>
+<span class="sourceLineNo">631</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.631"></a>
+<span class="sourceLineNo">632</span><a name="line.632"></a>
+<span class="sourceLineNo">633</span>    // make a major compaction<a name="line.633"></a>
+<span class="sourceLineNo">634</span>    region.compact(true);<a name="line.634"></a>
+<span class="sourceLineNo">635</span><a name="line.635"></a>
+<span class="sourceLineNo">636</span>    // open the third scanner<a name="line.636"></a>
+<span class="sourceLineNo">637</span>    RegionScanner scanner3 = region.getScanner(scan);<a name="line.637"></a>
+<span class="sourceLineNo">638</span><a name="line.638"></a>
+<span class="sourceLineNo">639</span>    // get data from scanner 1, 2, 3 after major compaction<a name="line.639"></a>
+<span class="sourceLineNo">640</span>    scanner1.next(results);<a name="line.640"></a>
+<span class="sourceLineNo">641</span>    System.out.println(results);<a name="line.641"></a>
+<span class="sourceLineNo">642</span>    assertEquals(1, results.size());<a name="line.642"></a>
+<span class="sourceLineNo">643</span><a name="line.643"></a>
+<span class="sourceLineNo">644</span>    results.clear();<a name="line.644"></a>
+<span class="sourceLineNo">645</span>    scanner2.next(results);<a name="line.645"></a>
+<span class="sourceLineNo">646</span>    System.out.println(results);<a name="line.646"></a>
+<span class="sourceLineNo">647</span>    assertEquals(0, results.size());<a name="line.647"></a>
+<span class="sourceLineNo">648</span><a name="line.648"></a>
+<span class="sourceLineNo">649</span>    results.clear();<a name="line.649"></a>
+<span class="sourceLineNo">650</span>    scanner3.next(results);<a name="line.650"></a>
+<span class="sourceLineNo">651</span>    System.out.println(results);<a name="line.651"></a>
+<span class="sourceLineNo">652</span>    assertEquals(0, results.size());<a name="line.652"></a>
+<span class="sourceLineNo">653</span>  }<a name="line.653"></a>
+<span class="sourceLineNo">654</span><a name="line.654"></a>
+<span class="sourceLineNo">655</span>  @Test<a name="line.655"></a>
+<span class="sourceLineNo">656</span>  public void testToShowNPEOnRegionScannerReseek() throws Exception {<a name="line.656"></a>
+<span class="sourceLineNo">657</span>    byte[] family = Bytes.toBytes("family");<a name="line.657"></a>
+<span class="sourceLineNo">658</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.658"></a>
+<span class="sourceLineNo">659</span><a name="line.659"></a>
+<span class="sourceLineNo">660</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.660"></a>
+<span class="sourceLineNo">661</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.661"></a>
+<span class="sourceLineNo">662</span>    region.put(put);<a name="line.662"></a>
+<span class="sourceLineNo">663</span>    put = new Put(Bytes.toBytes("r2"));<a name="line.663"></a>
+<span class="sourceLineNo">664</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.664"></a>
+<span class="sourceLineNo">665</span>    region.put(put);<a name="line.665"></a>
+<span class="sourceLineNo">666</span>    region.flush(true);<a name="line.666"></a>
+<span class="sourceLineNo">667</span><a name="line.667"></a>
+<span class="sourceLineNo">668</span>    Scan scan = new Scan();<a name="line.668"></a>
+<span class="sourceLineNo">669</span>    scan.setMaxVersions(3);<a name="line.669"></a>
+<span class="sourceLineNo">670</span>    // open the first scanner<a name="line.670"></a>
+<span class="sourceLineNo">671</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.671"></a>
+<span class="sourceLineNo">672</span><a name="line.672"></a>
+<span class="sourceLineNo">673</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.673"></a>
+<span class="sourceLineNo">674</span><a name="line.674"></a>
+<span class="sourceLineNo">675</span>    region.compact(true);<a name="line.675"></a>
+<span class="sourceLineNo">676</span><a name="line.676"></a>
+<span class="sourceLineNo">677</span>    scanner1.reseek(Bytes.toBytes("r2"));<a name="line.677"></a>
+<span class="sourceLineNo">678</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.678"></a>
+<span class="sourceLineNo">679</span>    scanner1.next(results);<a name="line.679"></a>
+<span class="sourceLineNo">680</span>    Cell keyValue = results.get(0);<a name="line.680"></a>
+<span class="sourceLineNo">681</span>    Assert.assertTrue(Bytes.compareTo(CellUtil.cloneRow(keyValue), Bytes.toBytes("r2")) == 0);<a name="line.681"></a>
+<span class="sourceLineNo">682</span>    scanner1.close();<a name="line.682"></a>
+<span class="sourceLineNo">683</span>  }<a name="line.683"></a>
+<span class="sourceLineNo">684</span><a name="line.684"></a>
+<span class="sourceLineNo">685</span>  @Test<a name="line.685"></a>
+<span class="sourceLineNo">686</span>  public void testSkipRecoveredEditsReplay() throws Exception {<a name="line.686"></a>
+<span class="sourceLineNo">687</span>    byte[] family = Bytes.toBytes("family");<a name="line.687"></a>
+<span class="sourceLineNo">688</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.688"></a>
+<span class="sourceLineNo">689</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.689"></a>
+<span class="sourceLineNo">690</span>    try {<a name="line.690"></a>
+<span class="sourceLineNo">691</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.691"></a>
+<span class="sourceLineNo">692</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.692"></a>
+<span class="sourceLineNo">693</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.693"></a>
+<span class="sourceLineNo">694</span><a name="line.694"></a>
+<span class="sourceLineNo">695</span>      Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.695"></a>
+<span class="sourceLineNo">696</span><a name="line.696"></a>
+<span class="sourceLineNo">697</span>      long maxSeqId = 1050;<a name="line.697"></a>
+<span class="sourceLineNo">698</span>      long minSeqId = 1000;<a name="line.698"></a>
+<span class="sourceLineNo">699</span><a name="line.699"></a>
+<span class="sourceLineNo">700</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.700"></a>
+<span class="sourceLineNo">701</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.701"></a>
+<span class="sourceLineNo">702</span>        fs.create(recoveredEdits);<a name="line.702"></a>
+<span class="sourceLineNo">703</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.703"></a>
+<span class="sourceLineNo">704</span><a name="line.704"></a>
+<span class="sourceLineNo">705</span>        long time = System.nanoTime();<a name="line.705"></a>
+<span class="sourceLineNo">706</span>        WALEdit edit = new WALEdit();<a name="line.706"></a>
+<span class="sourceLineNo">707</span>        edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.707"></a>
+<span class="sourceLineNo">708</span>            .toBytes(i)));<a name="line.708"></a>
+<span class="sourceLineNo">709</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.709"></a>
+<span class="sourceLineNo">710</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.710"></a>
+<span class="sourceLineNo">711</span><a name="line.711"></a>
+<span class="sourceLineNo">712</span>        writer.close();<a name="line.712"></a>
+<span class="sourceLineNo">713</span>      }<a name="line.713"></a>
+<span class="sourceLineNo">714</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.714"></a>
+<span class="sourceLineNo">715</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.715"></a>
+<span class="sourceLineNo">716</span>      for (HStore store : region.getStores()) {<a name="line.716"></a>
+<span class="sourceLineNo">717</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), minSeqId - 1);<a name="line.717"></a>
+<span class="sourceLineNo">718</span>      }<a name="line.718"></a>
+<span class="sourceLineNo">719</span>      long seqId = region.replayRecoveredEditsIfAny(maxSeqIdInStores, null, status);<a name="line.719"></a>
+<span class="sourceLineNo">720</span>      assertEquals(maxSeqId, seqId);<a name="line.720"></a>
+<span class="sourceLineNo">721</span>      region.getMVCC().advanceTo(seqId);<a name="line.721"></a>
+<span class="sourceLineNo">722</span>      Get get = new Get(row);<a name="line.722"></a>
+<span class="sourceLineNo">723</span>      Result result = region.get(get);<a name="line.723"></a>
+<span class="sourceLineNo">724</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.724"></a>
+<span class="sourceLineNo">725</span>        List&lt;Cell&gt; kvs = result.getColumnCells(family, Bytes.toBytes(i));<a name="line.725"></a>
+<span class="sourceLineNo">726</span>        assertEquals(1, kvs.size());<a name="line.726"></a>
+<span class="sourceLineNo">727</span>        assertArrayEquals(Bytes.toBytes(i), CellUtil.cloneValue(kvs.get(0)));<a name="line.727"></a>
+<span class="sourceLineNo">728</span>      }<a name="line.728"></a>
+<span class="sourceLineNo">729</span>    } finally {<a name="line.729"></a>
+<span class="sourceLineNo">730</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.730"></a>
+<span class="sourceLineNo">731</span>      this.region = null;<a name="line.731"></a>
+<span class="sourceLineNo">732</span>      wals.close();<a name="line.732"></a>
+<span class="sourceLineNo">733</span>    }<a name="line.733"></a>
+<span class="sourceLineNo">734</span>  }<a name="line.734"></a>
+<span class="sourceLineNo">735</span><a name="line.735"></a>
+<span class="sourceLineNo">736</span>  @Test<a name="line.736"></a>
+<span class="sourceLineNo">737</span>  public void testSkipRecoveredEditsReplaySomeIgnored() throws Exception {<a name="line.737"></a>
+<span class="sourceLineNo">738</span>    byte[] family = Bytes.toBytes("family");<a name="line.738"></a>
+<span class="sourceLineNo">739</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.739"></a>
+<span class="sourceLineNo">740</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.740"></a>
+<span class="sourceLineNo">741</span>    try {<a name="line.741"></a>
+<span class="sourceLineNo">742</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.742"></a>
+<span class="sourceLineNo">743</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.743"></a>
+<span class="sourceLineNo">744</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.744"></a>
+<span class="sourceLineNo">745</span><a name="line.745"></a>
+<span class="sourceLineNo">746</span>      Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.746"></a>
+<span class="sourceLineNo">747</span><a name="line.747"></a>
+<span class="sourceLineNo">748</span>      long maxSeqId = 1050;<a name="line.748"></a>
+<span class="sourceLineNo">749</span>      long minSeqId = 1000;<a name="line.749"></a>
+<span class="sourceLineNo">750</span><a name="line.750"></a>
+<span class="sourceLineNo">751</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.751"></a>
+<span class="sourceLineNo">752</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.752"></a>
+<span class="sourceLineNo">753</span>        fs.create(recoveredEdits);<a name="line.753"></a>
+<span class="sourceLineNo">754</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.754"></a>
+<span class="sourceLineNo">755</span><a name="line.755"></a>
+<span class="sourceLineNo">756</span>        long time = System.nanoTime();<a name="line.756"></a>
+<span class="sourceLineNo">757</span>        WALEdit edit = new WALEdit();<a name="line.757"></a>
+<span class="sourceLineNo">758</span>        edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.758"></a>
+<span class="sourceLineNo">759</span>            .toBytes(i)));<a name="line.759"></a>
+<span class="sourceLineNo">760</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.760"></a>
+<span class="sourceLineNo">761</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.761"></a>
+<span class="sourceLineNo">762</span><a name="line.762"></a>
+<span class="sourceLineNo">763</span>        writer.close();<a name="line.763"></a>
+<span class="sourceLineNo">764</span>      }<a name="line.764"></a>
+<span class="sourceLineNo">765</span>      long recoverSeqId = 1030;<a name="line.765"></a>
+<span class="sourceLineNo">766</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.766"></a>
+<span class="sourceLineNo">767</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.767"></a>
+<span class="sourceLineNo">768</span>      for (HStore store : region.getStores()) {<a name="line.768"></a>
+<span class="sourceLineNo">769</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), recoverSeqId - 1);<a name="line.769"></a>
+<span class="sourceLineNo">770</span>      }<a name="line.770"></a>
+<span class="sourceLineNo">771</span>      long seqId = region.replayRecoveredEditsIfAny(maxSeqIdInStores, null, status);<a name="line.771"></a>
+<span class="sourceLineNo">772</span>      assertEquals(maxSeqId, seqId);<a name="line.772"></a>
+<span class="sourceLineNo">773</span>      region.getMVCC().advanceTo(seqId);<a name="line.773"></a>
+<span class="sourceLineNo">774</span>      Get get = new Get(row);<a name="line.774"></a>
+<span class="sourceLineNo">775</span>      Result result = region.get(get);<a name="line.775"></a>
+<span class="sourceLineNo">776</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.776"></a>
+<span class="sourceLineNo">777</span>        List&lt;Cell&gt; kvs = result.getColumnCells(family, Bytes.toBytes(i));<a name="line.777"></a>
+<span class="sourceLineNo">778</span>        if (i &lt; recoverSeqId) {<a name="line.778"></a>
+<span class="sourceLineNo">779</span>          assertEquals(0, kvs.size());<a name="line.779"></a>
+<span class="sourceLineNo">780</span>        } else {<a name="line.780"></a>
+<span class="sourceLineNo">781</span>          assertEquals(1, kvs.size());<a name="line.781"></a>
+<span class="sourceLineNo">782</span>          assertArrayEquals(Bytes.toBytes(i), CellUtil.cloneValue(kvs.get(0)));<a name="line.782"></a>
+<span class="sourceLineNo">783</span>        }<a name="line.783"></a>
+<span class="sourceLineNo">784</span>      }<a name="line.784"></a>
+<span class="sourceLineNo">785</span>    } finally {<a name="line.785"></a>
+<span class="sourceLineNo">786</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.786"></a>
+<span class="sourceLineNo">787</span>      this.region = null;<a name="line.787"></a>
+<span class="sourceLineNo">788</span>      wals.close();<a name="line.788"></a>
+<span class="sourceLineNo">789</span>    }<a name="line.789"></a>
+<span class="sourceLineNo">790</span>  }<a name="line.790"></a>
+<span class="sourceLineNo">791</span><a name="line.791"></a>
+<span class="sourceLineNo">792</span>  @Test<a name="line.792"></a>
+<span class="sourceLineNo">793</span>  public void testSkipRecoveredEditsReplayAllIgnored() throws Exception {<a name="line.793"></a>
+<span class="sourceLineNo">794</span>    byte[] family = Bytes.toBytes("family");<a name="line.794"></a>
+<span class="sourceLineNo">795</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.795"></a>
+<span class="sourceLineNo">796</span>    Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.796"></a>
+<span class="sourceLineNo">797</span>    FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.797"></a>
+<span class="sourceLineNo">798</span><a name="line.798"></a>
+<span class="sourceLineNo">799</span>    Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.799"></a>
+<span class="sourceLineNo">800</span>    for (int i = 1000; i &lt; 1050; i += 10) {<a name="line.800"></a>
+<span class="sourceLineNo">801</span>      Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.801"></a>
+<span class="sourceLineNo">802</span>      FSDataOutputStream dos = fs.create(recoveredEdits);<a name="line.802"></a>
+<span class="sourceLineNo">803</span>      dos.writeInt(i);<a name="line.803"></a>
+<span class="sourceLineNo">804</span>      dos.close();<a name="line.804"></a>
+<span class="sourceLineNo">805</span>    }<a name="line.805"></a>
+<span class="sourceLineNo">806</span>    long minSeqId = 2000;<a name="line.806"></a>
+<span class="sourceLineNo">807</span>    Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", minSeqId - 1));<a name="line.807"></a>
+<span class="sourceLineNo">808</span>    FSDataOutputStream dos = fs.create(recoveredEdits);<a name="line.808"></a>
+<span class="sourceLineNo">809</span>    dos.close();<a name="line.809"></a>
+<span class="sourceLineNo">810</span><a name="line.810"></a>
+<span class="sourceLineNo">811</span>    Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.811"></a>
+<span class="sourceLineNo">812</span>    for (HStore store : region.getStores()) {<a name="line.812"></a>
+<span class="sourceLineNo">813</span>      maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), minSeqId);<a name="line.813"></a>
+<span class="sourceLineNo">814</span>    }<a name="line.814"></a>
+<span class="sourceLineNo">815</span>    long seqId = region.replayRecoveredEditsIfAny(maxSeqIdInStores, null, null);<a name="line.815"></a>
+<span class="sourceLineNo">816</span>    assertEquals(minSeqId, seqId);<a name="line.816"></a>
+<span class="sourceLineNo">817</span>  }<a name="line.817"></a>
+<span class="sourceLineNo">818</span><a name="line.818"></a>
+<span class="sourceLineNo">819</span>  @Test<a name="line.819"></a>
+<span class="sourceLineNo">820</span>  public void testSkipRecoveredEditsReplayTheLastFileIgnored() throws Exception {<a name="line.820"></a>
+<span class="sourceLineNo">821</span>    byte[] family = Bytes.toBytes("family");<a name="line.821"></a>
+<span class="sourceLineNo">822</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.822"></a>
+<span class="sourceLineNo">823</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.823"></a>
+<span class="sourceLineNo">824</span>    try {<a name="line.824"></a>
+<span class="sourceLineNo">825</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.825"></a>
+<span class="sourceLineNo">826</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.826"></a>
+<span class="sourceLineNo">827</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.827"></a>
+<span class="sourceLineNo">828</span>      byte[][] columns = region.getTableDescriptor().getColumnFamilyNames().toArray(new byte[0][]);<a name="line.828"></a>
+<span class="sourceLineNo">829</span><a name="line.829"></a>
+<span class="sourceLineNo">830</span>      assertEquals(0, region.getStoreFileList(columns).size());<a name="line.830"></a>
+<span class="sourceLineNo">831</span><a name="line.831"></a>
+<span class="sourceLineNo">832</span>      Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.832"></a>
+<span class="sourceLineNo">833</span><a name="line.833"></a>
+<span class="sourceLineNo">834</span>      long maxSeqId = 1050;<a name="line.834"></a>
+<span class="sourceLineNo">835</span>      long minSeqId = 1000;<a name="line.835"></a>
+<span class="sourceLineNo">836</span><a name="line.836"></a>
+<span class="sourceLineNo">837</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.837"></a>
+<span class="sourceLineNo">838</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.838"></a>
+<span class="sourceLineNo">839</span>        fs.create(recoveredEdits);<a name="line.839"></a>
+<span class="sourceLineNo">840</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.840"></a>
+<span class="sourceLineNo">841</span><a name="line.841"></a>
+<span class="sourceLineNo">842</span>        long time = System.nanoTime();<a name="line.842"></a>
+<span class="sourceLineNo">843</span>        WALEdit edit = null;<a name="line.843"></a>
+<span class="sourceLineNo">844</span>        if (i == maxSeqId) {<a name="line.844"></a>
+<span class="sourceLineNo">845</span>          edit = WALEdit.createCompaction(region.getRegionInfo(),<a name="line.845"></a>
+<span class="sourceLineNo">846</span>          CompactionDescriptor.newBuilder()<a name="line.846"></a>
+<span class="sourceLineNo">847</span>          .setTableName(ByteString.copyFrom(tableName.getName()))<a name="line.847"></a>
+<span class="sourceLineNo">848</span>          .setFamilyName(ByteString.copyFrom(regionName))<a name="line.848"></a>
+<span class="sourceLineNo">849</span>          .setEncodedRegionName(ByteString.copyFrom(regionName))<a name="line.849"></a>
+<span class="sourceLineNo">850</span>          .setStoreHomeDirBytes(ByteString.copyFrom(Bytes.toBytes(regiondir.toString())))<a name="line.850"></a>
+<span class="sourceLineNo">851</span>          .setRegionName(ByteString.copyFrom(region.getRegionInfo().getRegionName()))<a name="line.851"></a>
+<span class="sourceLineNo">852</span>          .build());<a name="line.852"></a>
+<span class="sourceLineNo">853</span>        } else {<a name="line.853"></a>
+<span class="sourceLineNo">854</span>          edit = new WALEdit();<a name="line.854"></a>
+<span class="sourceLineNo">855</span>          edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.855"></a>
+<span class="sourceLineNo">856</span>            .toBytes(i)));<a name="line.856"></a>
+<span class="sourceLineNo">857</span>        }<a name="line.857"></a>
+<span class="sourceLineNo">858</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.858"></a>
+<span class="sourceLineNo">859</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.859"></a>
+<span class="sourceLineNo">860</span>        writer.close();<a name="line.860"></a>
+<span class="sourceLineNo">861</span>      }<a name="line.861"></a>
+<span class="sourceLineNo">862</span><a name="line.862"></a>
+<span class="sourceLineNo">863</span>      long recoverSeqId = 1030;<a name="line.863"></a>
+<span class="sourceLineNo">864</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.864"></a>
+<span class="sourceLineNo">865</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.865"></a>
+<span class="sourceLineNo">866</span>      for (HStore store : region.getStores()) {<a name="line.866"></a>
+<span class="sourceLineNo">867</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), recoverSeqId - 1);<a name="line.867"></a>
+<span class="sourceLineNo">868</span>      }<a name="line.868"></a>
+<span class="sourceLineNo">869</span>      long seqId = region.replayRecoveredEditsIfAny(maxSeqIdInStores, null, status);<a name="line.869"></a>
+<span class="sourceLineNo">870</span>      assertEquals(maxSeqId, seqId);<a name="line.870"></a>
+<span class="sourceLineNo">871</span><a name="line.871"></a>
+<span class="sourceLineNo">872</span>      // assert that the files are flushed<a name="line.872"></a>
+<span class="sourceLineNo">873</span>      assertEquals(1, region.getStoreFileList(columns).size());<a name="line.873"></a>
+<span class="sourceLineNo">874</span><a name="line.874"></a>
+<span class="sourceLineNo">875</span>    } finally {<a name="line.875"></a>
+<span class="sourceLineNo">876</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.876"></a>
+<span class="sourceLineNo">877</span>      this.region = null;<a name="line.877"></a>
+<span class="sourceLineNo">878</span>      wals.close();<a name="line.878"></a>
+<span class="sourceLineNo">879</span>    }<a name="line.879"></a>
+<span class="sourceLineNo">880</span>  }<a name="line.880"></a>
+<span class="sourceLineNo">881</span><a name="line.881"></a>
+<span class="sourceLineNo">882</span>  @Test<a name="line.882"></a>
+<span class="sourceLineNo">883</span>  public void testRecoveredEditsReplayCompaction() throws Exception {<a name="line.883"></a>
+<span class="sourceLineNo">884</span>    testRecoveredEditsReplayCompaction(false);<a name="line.884"></a>
+<span class="sourceLineNo">885</span>    testRecoveredEditsReplayCompaction(true);<a name="line.885"></a>
+<span class="sourceLineNo">886</span>  }<a name="line.886"></a>
+<span class="sourceLineNo">887</span><a name="line.887"></a>
+<span class="sourceLineNo">888</span>  public void testRecoveredEditsReplayCompaction(boolean mismatchedRegionName) throws Exception {<a name="line.888"></a>
+<span class="sourceLineNo">889</span>    CONF.setClass(HConstants.REGION_IMPL, HRegionForTesting.class, Region.class);<a name="line.889"></a>
+<span class="sourceLineNo">890</span>    byte[] family = Bytes.toBytes("family");<a name="line.890"></a>
+<span class="sourceLineNo">891</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.891"></a>
+<span class="sourceLineNo">892</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.892"></a>
+<span class="sourceLineNo">893</span>    try {<a name="line.893"></a>
+<span class="sourceLineNo">894</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.894"></a>
+<span class="sourceLineNo">895</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.895"></a>
+<span class="sourceLineNo">896</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.896"></a>
+<span class="sourceLineNo">897</span><a name="line.897"></a>
+<span class="sourceLineNo">898</span>      long maxSeqId = 3;<a name="line.898"></a>
+<span class="sourceLineNo">899</span>      long minSeqId = 0;<a name="line.899"></a>
+<span class="sourceLineNo">900</span><a name="line.900"></a>
+<span class="sourceLineNo">901</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.901"></a>
+<span class="sourceLineNo">902</span>        Put put = new Put(Bytes.toBytes(i));<a name="line.902"></a>
+<span class="sourceLineNo">903</span>        put.addColumn(family, Bytes.toBytes(i), Bytes.toBytes(i));<a name="line.903"></a>
+<span class="sourceLineNo">904</span>        region.put(put);<a name="line.904"></a>
+<span class="sourceLineNo">905</span>        region.flush(true);<a name="line.905"></a>
+<span class="sourceLineNo">906</span>      }<a name="line.906"></a>
+<span class="sourceLineNo">907</span><a name="line.907"></a>
+<span class="sourceLineNo">908</span>      // this will create a region with 3 files<a name="line.908"></a>
+<span class="sourceLineNo">909</span>      assertEquals(3, region.getStore(family).getStorefilesCount());<a name="line.909"></a>
+<span class="sourceLineNo">910</span>      List&lt;Path&gt; storeFiles = new ArrayList&lt;&gt;(3);<a name="line.910"></a>
+<span class="sourceLineNo">911</span>      for (HStoreFile sf : region.getStore(family).getStorefiles()) {<a name="line.911"></a>
+<span class="sourceLineNo">912</span>        storeFiles.add(sf.getPath());<a name="line.912"></a>
+<span class="sourceLineNo">913</span>      }<a name="line.913"></a>
+<span class="sourceLineNo">914</span><a name="line.914"></a>
+<span class="sourceLineNo">915</span>      // disable compaction completion<a name="line.915"></a>
+<span class="sourceLineNo">916</span>      CONF.setBoolean("hbase.hstore.compaction.complete", false);<a name="line.916"></a>
+<span class="sourceLineNo">917</span>      region.compactStores();<a name="line.917"></a>
+<span class="sourceLineNo">918</span><a name="line.918"></a>
+<span class="sourceLineNo">919</span>      // ensure that nothing changed<a name="line.919"></a>
+<span class="sourceLineNo">920</span>      assertEquals(3, region.getStore(family).getStorefilesCount());<a name="line.920"></a>
+<span class="sourceLineNo">921</span><a name="line.921"></a>
+<span class="sourceLineNo">922</span>      // now find the compacted file, and manually add it to the recovered edits<a name="line.922"></a>
+<span class="sourceLineNo">923</span>      Path tmpDir = new Path(region.getRegionFileSystem().getTempDir(), Bytes.toString(family));<a name="line.923"></a>
+<span class="sourceLineNo">924</span>      FileStatus[] files = FSUtils.listStatus(fs, tmpDir);<a name="line.924"></a>
+<span class="sourceLineNo">925</span>      String errorMsg = "Expected to find 1 file in the region temp directory "<a name="line.925"></a>
+<span class="sourceLineNo">926</span>          + "from the compaction, could not find any";<a name="line.926"></a>
+<span class="sourceLineNo">927</span>      assertNotNull(errorMsg, files);<a name="line.927"></a>
+<span class="sourceLineNo">928</span>      assertEquals(errorMsg, 1, files.length);<a name="line.928"></a>
+<span class="sourceLineNo">929</span>      // move the file inside region dir<a name="line.929"></a>
+<span class="sourceLineNo">930</span>      Path newFile = region.getRegionFileSystem().commitStoreFile(Bytes.toString(family),<a name="line.930"></a>
+<span class="sourceLineNo">931</span>          files[0].getPath());<a name="line.931"></a>
+<span class="sourceLineNo">932</span><a name="line.932"></a>
+<span class="sourceLineNo">933</span>      byte[] encodedNameAsBytes = this.region.getRegionInfo().getEncodedNameAsBytes();<a name="line.933"></a>
+<span class="sourceLineNo">934</span>      byte[] fakeEncodedNameAsBytes = new byte [encodedNameAsBytes.length];<a name="line.934"></a>
+<span class="sourceLineNo">935</span>      for (int i=0; i &lt; encodedNameAsBytes.length; i++) {<a name="line.935"></a>
+<span class="sourceLineNo">936</span>        // Mix the byte array to have a new encodedName<a name="line.936"></a>
+<span class="sourceLineNo">937</span>        fakeEncodedNameAsBytes[i] = (byte) (encodedNameAsBytes[i] + 1);<a name="line.937"></a>
+<span class="sourceLineNo">938</span>      }<a name="line.938"></a>
+<span class="sourceLineNo">939</span><a name="line.939"></a>
+<span class="sourceLineNo">940</span>      CompactionDescriptor compactionDescriptor = ProtobufUtil.toCompactionDescriptor(this.region<a name="line.940"></a>
+<span class="sourceLineNo">941</span>        .getRegionInfo(), mismatchedRegionName ? fakeEncodedNameAsBytes : null, family,<a name="line.941"></a>
+<span class="sourceLineNo">942</span>            storeFiles, Lists.newArrayList(newFile),<a name="line.942"></a>
+<span class="sourceLineNo">943</span>            region.getRegionFileSystem().getStoreDir(Bytes.toString(family)));<a name="line.943"></a>
+<span class="sourceLineNo">944</span><a name="line.944"></a>
+<span class="sourceLineNo">945</span>      WALUtil.writeCompactionMarker(region.getWAL(), this.region.getReplicationScope(),<a name="line.945"></a>
+<span class="sourceLineNo">946</span>          this.region.getRegionInfo(), compactionDescriptor, region.getMVCC());<a name="line.946"></a>
+<span class="sourceLineNo">947</span><a name="line.947"></a>
+<span class="sourceLineNo">948</span>      Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.948"></a>
+<span class="sourceLineNo">949</span><a name="line.949"></a>
+<span class="sourceLineNo">950</span>      Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", 1000));<a name="line.950"></a>
+<span class="sourceLineNo">951</span>      fs.create(recoveredEdits);<a name="line.951"></a>
+<span class="sourceLineNo">952</span>      WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.952"></a>
+<span class="sourceLineNo">953</span><a name="line.953"></a>
+<span class="sourceLineNo">954</span>      long time = System.nanoTime();<a name="line.954"></a>
+<span class="sourceLineNo">955</span><a name="line.955"></a>
+<span class="sourceLineNo">956</span>      writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, 10, time,<a name="line.956"></a>
+<span class="sourceLineNo">957</span>          HConstants.DEFAULT_CLUSTER_ID), WALEdit.createCompaction(region.getRegionInfo(),<a name="line.957"></a>
+<span class="sourceLineNo">958</span>          compactionDescriptor)));<a name="line.958"></a>
+<span class="sourceLineNo">959</span>      writer.close();<a name="line.959"></a>
+<span class="sourceLineNo">960</span><a name="line.960"></a>
+<span class="sourceLineNo">961</span>      // close the region now, and reopen again<a name="line.961"></a>
+<span class="sourceLineNo">962</span>      region.getTableDescriptor();<a name="line.962"></a>
+<span class="sourceLineNo">963</span>      region.getRegionInfo();<a name="line.963"></a>
+<span class="sourceLineNo">964</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.964"></a>
+<span class="sourceLineNo">965</span>      try {<a name="line.965"></a>
+<span class="sourceLineNo">966</span>        region = HRegion.openHRegion(region, null);<a name="line.966"></a>
+<span class="sourceLineNo">967</span>      } catch (WrongRegionException wre) {<a name="line.967"></a>
+<span class="sourceLineNo">968</span>        fail("Matching encoded region name should not have produced WrongRegionException");<a name="line.968"></a>
+<span class="sourceLineNo">969</span>      }<a name="line.969"></a>
+<span class="sourceLineNo">970</span><a name="line.970"></a>
+<span class="sourceLineNo">971</span>      // now check whether we have only one store file, the compacted one<a name="line.971"></a>
+<span class="sourceLineNo">972</span>      Collection&lt;HStoreFile&gt; sfs = region.getStore(family).getStorefiles();<a name="line.972"></a>
+<span class="sourceLineNo">973</span>      for (HStoreFile sf : sfs) {<a name="line.973"></a>
+<span class="sourceLineNo">974</span>        LOG.info(Objects.toString(sf.getPath()));<a name="line.974"></a>
+<span class="sourceLineNo">975</span>      }<a name="line.975"></a>
+<span class="sourceLineNo">976</span>      if (!mismatchedRegionName) {<a name="line.976"></a>
+<span class="sourceLineNo">977</span>        assertEquals(1, region.getStore(family).getStorefilesCount());<a name="line.977"></a>
+<span class="sourceLineNo">978</span>      }<a name="line.978"></a>
+<span class="sourceLineNo">979</span>      files = FSUtils.listStatus(fs, tmpDir);<a name="line.979"></a>
+<span class="sourceLineNo">980</span>      assertTrue("Expected to find 0 files inside " + tmpDir, files == null || files.length == 0);<a name="line.980"></a>
+<span class="sourceLineNo">981</span><a name="line.981"></a>
+<span class="sourceLineNo">982</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.982"></a>
+<span class="sourceLineNo">983</span>        Get get = new Get(Bytes.toBytes(i));<a name="line.983"></a>
+<span class="sourceLineNo">984</span>        Result result = region.get(get);<a name="line.984"></a>
+<span class="sourceLineNo">985</span>        byte[] value = result.getValue(family, Bytes.toBytes(i));<a name="line.985"></a>
+<span class="sourceLineNo">986</span>        assertArrayEquals(Bytes.toBytes(i), value);<a name="line.986"></a>
+<span class="sourceLineNo">987</span>      }<a name="line.987"></a>
+<span class="sourceLineNo">988</span>    } finally {<a name="line.988"></a>
+<span class="sourceLineNo">989</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.989"></a>
+<span class="sourceLineNo">990</span>      this.region = null;<a name="line.990"></a>
+<span class="sourceLineNo">991</span>      wals.close();<a name="line.991"></a>
+<span class="sourceLineNo">992</span>      CONF.setClass(HConstants.REGION_IMPL, HRegion.class, Region.class);<a name="line.992"></a>
+<span class="sourceLineNo">993</span>    }<a name="line.993"></a>
+<span class="sourceLineNo">994</span>  }<a name="line.994"></a>
+<span class="sourceLineNo">995</span><a name="line.995"></a>
+<span class="sourceLineNo">996</span>  @Test<a name="line.996"></a>
+<span class="sourceLineNo">997</span>  public void testFlushMarkers() throws Exception {<a name="line.997"></a>
+<span class="sourceLineNo">998</span>    // tests that flush markers are written to WAL and handled at recovered edits<a name="line.998"></a>
+<span class="sourceLineNo">999</span>    byte[] family = Bytes.toBytes("family");<a name="line.999"></a>
+<span class="sourceLineNo">1000</span>    Path logDir = TEST_UTIL.getDataTestDirOnTestFS(method + ".log");<a name="line.1000"></a>
+<span class="sourceLineNo">1001</span>    final Configuration walConf = new Configuration(TEST_UTIL.getConfiguration());<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.1002"></a>
+<span class="sourceLineNo">1003</span>    final WALFactory wals = new WALFactory(walConf, method);<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span>    final WAL wal = wals.getWAL(RegionInfoBuilder.newBuilder(tableName).build());<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span><a name="line.1005"></a>
+<span class="sourceLineNo">1006</span>    this.region = initHRegion(tableName, HConstants.EMPTY_START_ROW,<a name="line.1006"></a>
+<span class="sourceLineNo">1007</span>      HConstants.EMPTY_END_ROW, false, Durability.USE_DEFAULT, wal, family);<a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>    try {<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span><a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>      long maxSeqId = 3;<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span>      long minSeqId = 0;<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span><a name="line.1015"></a>
+<span class="sourceLineNo">1016</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>        Put put = new Put(Bytes.toBytes(i));<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span>        put.addColumn(family, Bytes.toBytes(i), Bytes.toBytes(i));<a name="line.1018"></a>
+<span class="sourceLineNo">1019</span>        region.put(put);<a name="line.1019"></a>
+<span class="sourceLineNo">1020</span>        region.flush(true);<a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>      }<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span><a name="line.1022"></a>
+<span class="sourceLineNo">1023</span>      // this will create a region with 3 files from flush<a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>      assertEquals(3, region.getStore(family).getStorefilesCount());<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span>      List&lt;String&gt; storeFiles = new ArrayList&lt;&gt;(3);<a name="line.1025"></a>
+<span class="sourceLineNo">1026</span>      for (HStoreFile sf : region.getStore(family).getStorefiles()) {<a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>        storeFiles.add(sf.getPath().getName());<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span>      }<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span><a name="line.1029"></a>
+<span class="sourceLineNo">1030</span>      // now verify that the flush markers are written<a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>      wal.shutdown();<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>      WAL.Reader reader = WALFactory.createReader(fs, AbstractFSWALProvider.getCurrentFileName(wal),<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>        TEST_UTIL.getConfiguration());<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>      try {<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span>        List&lt;WAL.Entry&gt; flushDescriptors = new ArrayList&lt;&gt;();<a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>        long lastFlushSeqId = -1;<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>        while (true) {<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>          WAL.Entry entry = reader.next();<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>          if (entry == null) {<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>            break;<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span>          }<a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>          Cell cell = entry.getEdit().getCells().get(0);<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>          if (WALEdit.isMetaEditFamily(cell)) {<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>            FlushDescriptor flushDesc = WALEdit.getFlushDescriptor(cell);<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span>            assertNotNull(flushDesc);<a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>            assertArrayEquals(tableName.getName(), flushDesc.getTableName().toByteArray());<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>            if (flushDesc.getAction() == FlushAction.START_FLUSH) {<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span>              assertTrue(flushDesc.getFlushSequenceNumber() &gt; lastFlushSeqId);<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span>            } else if (flushDesc.getAction() == FlushAction.COMMIT_FLUSH) {<a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>              assertTrue(flushDesc.getFlushSequenceNumber() == lastFlushSeqId);<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>            }<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>            lastFlushSeqId = flushDesc.getFlushSequenceNumber();<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>            assertArrayEquals(regionName, flushDesc.getEncodedRegionName().toByteArray());<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>            assertEquals(1, flushDesc.getStoreFlushesCount()); //only one store<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>            StoreFlushDescriptor storeFlushDesc = flushDesc.getStoreFlushes(0);<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>            assertArrayEquals(family, storeFlushDesc.getFamilyName().toByteArray());<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span>            assertEquals("family", storeFlushDesc.getStoreHomeDir());<a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>            if (flushDesc.getAction() == FlushAction.START_FLUSH) {<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>              assertEquals(0, storeFlushDesc.getFlushOutputCount());<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>            } else {<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>              assertEquals(1, storeFlushDesc.getFlushOutputCount()); //only one file from flush<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>              assertTrue(storeFiles.contains(storeFlushDesc.getFlushOutput(0)));<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>            }<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span><a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>            flushDescriptors.add(entry);<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>          }<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>        }<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span><a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>        assertEquals(3 * 2, flushDescriptors.size()); // START_FLUSH and COMMIT_FLUSH per flush<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span><a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>        // now write those markers to the recovered edits again.<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span><a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>        Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span><a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", 1000));<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>        fs.create(recoveredEdits);<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span><a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>        for (WAL.Entry entry : flushDescriptors) {<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>          writer.append(entry);<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>        }<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>        writer.close();<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>      } finally {<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>        if (null != reader) {<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>          try {<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>            reader.close();<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>          } catch (IOException exception) {<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>            LOG.warn("Problem closing wal: " + exception.getMessage());<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>            LOG.debug("exception details", exception);<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>          }<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>        }<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>      }<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span><a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>      // close the region now, and reopen again<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>      region = HRegion.openHRegion(region, null);<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span><a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>      // now check whether we have can read back the data from region<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>        Get get = new Get(Bytes.toBytes(i));<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>        Result result = region.get(get);<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>        byte[] value = result.getValue(family, Bytes.toBytes(i));<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>        assertArrayEquals(Bytes.toBytes(i), value);<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>      }<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>    } finally {<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>      this.region = null;<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>      wals.close();<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>    }<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>  }<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span><a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>  static class IsFlushWALMarker implements ArgumentMatcher&lt;WALEdit&gt; {<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>    volatile FlushAction[] actions;<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>    public IsFlushWALMarker(FlushAction... actions) {<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>      this.actions = actions;<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>    }<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span>    @Override<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>    public boolean matches(WALEdit edit) {<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>      List&lt;Cell&gt; cells = edit.getCells();<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>      if (cells.isEmpty()) {<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span>        return false;<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>      }<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>      if (WALEdit.isMetaEditFamily(cells.get(0))) {<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>        FlushDescriptor desc;<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>        try {<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>          desc = WALEdit.getFlushDescriptor(cells.get(0));<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>        } catch (IOException e) {<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>          LOG.warn(e.toString(), e);<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>          return false;<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>        }<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>        if (desc != null) {<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>          for (FlushAction action : actions) {<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>            if (desc.getAction() == action) {<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>              return true;<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>            }<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>          }<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>        }<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>      }<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span>      return false;<a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>    }<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>    public IsFlushWALMarker set(FlushAction... actions) {<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>      this.actions = actions;<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>      return this;<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>    }<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>  }<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span><a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>  @Test<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span>  public void testFlushMarkersWALFail() throws Exception {<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>    // test the cases where the WAL append for flush markers fail.<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>    byte[] family = Bytes.toBytes("family");<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span><a name="line.1151"></a>
+<span class="sourceLineNo">1152</span>    // spy an actual WAL implementation to throw exception (was not able to mock)<a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>    Path logDir = TEST_UTIL.getDataTestDirOnTestFS(method + "log");<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span><a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>    final Configuration walConf = new Configuration(TEST_UTIL.getConfiguration());<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>    // Make up a WAL that we can manipulate at append time.<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>    class FailAppendFlushMarkerWAL extends FSHLog {<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>      volatile FlushAction [] flushActions = null;<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span><a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>      public FailAppendFlushMarkerWAL(FileSystem fs, Path root, String logDir, Configuration conf)<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>      throws IOException {<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>        super(fs, root, logDir, conf);<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>      }<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span><a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>      @Override<a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>      protected Writer createWriterInstance(Path path) throws IOException {<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>        final Writer w = super.createWriterInstance(path);<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>        return new Writer() {<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>          @Override<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>          public void close() throws IOException {<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>            w.close();<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>          }<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span><a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>          @Override<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>          public void sync(boolean forceSync) throws IOException {<a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>            w.sync(forceSync);<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span>          }<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span><a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>          @Override<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>          public void append(Entry entry) throws IOException {<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>            List&lt;Cell&gt; cells = entry.getEdit().getCells();<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>            if (WALEdit.isMetaEditFamily(cells.get(0))) {<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>              FlushDescriptor desc = WALEdit.getFlushDescriptor(cells.get(0));<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>              if (desc != null) {<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>                for (FlushAction flushAction: flushActions) {<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>                  if (desc.getAction().equals(flushAction)) {<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>                    throw new IOException("Failed to append flush marker! " + flushAction);<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>                  }<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>                }<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>              }<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>            }<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>            w.append(entry);<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>          }<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span><a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>          @Override<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>          public long getLength() {<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>            return w.getLength();<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>          }<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>        };<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>      }<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>    }<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>    FailAppendFlushMarkerWAL wal =<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>      new FailAppendFlushMarkerWAL(FileSystem.get(walConf), FSUtils.getRootDir(walConf),<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>        method, walConf);<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>    wal.init();<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>    this.region = initHRegion(tableName, HConstants.EMPTY_START_ROW,<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>      HConstants.EMPTY_END_ROW, false, Durability.USE_DEFAULT, wal, family);<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>    int i = 0;<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>    Put put = new Put(Bytes.toBytes(i));<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>    put.setDurability(Durability.SKIP_WAL); // have to skip mocked wal<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>    put.addColumn(family, Bytes.toBytes(i), Bytes.toBytes(i));<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>    region.put(put);<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span><a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>    // 1. Test case where START_FLUSH throws exception<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>    wal.flushActions = new FlushAction [] {FlushAction.START_FLUSH};<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span><a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>    // start cache flush will throw exception<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>    try {<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>      region.flush(true);<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>      fail("This should have thrown exception");<a name="line.1221"></a>
+<span class="sourceLineNo">1222</span>    } catch (DroppedSnapshotException unexpected) {<a name="line.1222"></a>
+<span class="sourceLineNo">1223</span>      // this should not be a dropped snapshot exception. Meaning that RS will not abort<a name="line.1223"></a>
+<span class="sourceLineNo">1224</span>      throw unexpected;<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span>    } catch (IOException expected) {<a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>      // expected<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span>    }<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>    // The WAL is hosed now. It has two edits appended. We cannot roll the log without it<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>    // throwing a DroppedSnapshotException to force an abort. Just clean up the mess.<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>    region.close(true);<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>    wal.close();<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span><a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>    // 2. Test case where START_FLUSH succeeds but COMMIT_FLUSH will throw exception<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>    wal.flushActions = new FlushAction [] {FlushAction.COMMIT_FLUSH};<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>    wal = new FailAppendFlushMarkerWAL(FileSystem.get(walConf), FSUtils.getRootDir(walConf),<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>          method, walConf);<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>    wal.init();<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span>    this.region = initHRegion(tableName, HConstants.EMPTY_START_ROW,<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>      HConstants.EMPTY_END_ROW, false, Durability.USE_DEFAULT, wal, family);<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>    region.put(put);<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span><a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>    // 3. Test case where ABORT_FLUSH will throw exception.<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span>    // Even if ABORT_FLUSH throws exception, we should not fail with IOE, but continue with<a name="line.1243"></a>
+<span class="sourceLineNo">1244</span>    // DroppedSnapshotException. Below COMMMIT_FLUSH will cause flush to abort<a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>    wal.flushActions = new FlushAction [] {FlushAction.COMMIT_FLUSH, FlushAction.ABORT_FLUSH};<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span><a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>    try {<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span>      region.flush(true);<a name="line.1248"></a>
+<span class="sourceLineNo">1249</span>      fail("This should have thrown exception");<a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>    } catch (DroppedSnapshotException expected) {<a name="line.1250"></a>
+<span class="sourceLineNo">1251</span>      // we expect this exception, since we were able to write the snapshot, but failed to<a name="line.1251"></a>
+<span class="sourceLineNo">1252</span>      // write the flush marker to WAL<a name="line.1252"></a>
+<span class="sourceLineNo">1253</span>    } catch (IOException unexpected) {<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span>      throw unexpected;<a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>    }<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>  }<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span><a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>  @Test<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>  public void testGetWhileRegionClose() throws IOException {<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span>    Configuration hc = initSplit();<a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>    int numRows = 100;<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>    byte[][] families = { fam1, fam2, fam3 };<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span><a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>    // Setting up region<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span>    this.region = initHRegion(tableName, method, hc, families);<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>    // Put data in region<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span>    final int startRow = 100;<a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>    putData(startRow, numRows, qual1, families);<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>    putData(startRow, numRows, qual2, families);<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>    putData(startRow, numRows, qual3, families);<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span>    final AtomicBoolean done = new AtomicBoolean(false);<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>    final AtomicInteger gets = new AtomicInteger(0);<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>    GetTillDoneOrException[] threads = new GetTillDoneOrException[10];<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>    try {<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>      // Set ten threads running concurrently getting from the region.<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span>      for (int i = 0; i &lt; threads.length / 2; i++) {<a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>        threads[i] = new GetTillDoneOrException(i, Bytes.toBytes("" + startRow), done, gets);<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>        threads[i].setDaemon(true);<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>        threads[i].start();<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>      }<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>      // Artificially make the condition by setting closing flag explicitly.<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span>      // I can't make the issue happen with a call to region.close().<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span>      this.region.closing.set(true);<a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>      for (int i = threads.length / 2; i &lt; threads.length; i++) {<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>        threads[i] = new GetTillDoneOrException(i, Bytes.toBytes("" + startRow), done, gets);<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>        threads[i].setDaemon(true);<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>        threads[i].start();<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span>      }<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>    } finally {<a name="line.1289"></a>
+<span class="sourceLineNo">1290</span>      if (this.region != null) {<a name="line.1290"></a>
+<span class="sourceLineNo">1291</span>        HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>        this.region = null;<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>      }<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>    }<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>    done.set(true);<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>    for (GetTillDoneOrException t : threads) {<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span>      try {<a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>        t.join();<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>      } catch (InterruptedException e) {<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>        e.printStackTrace();<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>      }<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>      if (t.e != null) {<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span>        LOG.info("Exception=" + t.e);<a name="line.1303"></a>
+<span class="sourceLineNo">1304</span>        assertFalse("Found a NPE in " + t.getName(), t.e instanceof NullPointerException);<a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>      }<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>    }<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span>  }<a name="line.1307"></a>
+<span class="sourceLineNo">1308</span><a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>  /*<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>   * Thread that does get on single row until 'done' flag is flipped. If an<a name="line.1310"></a>
+<span class="sourceLineNo">1311</span>   * exception causes us to fail, it records it.<a name="line.1311"></a>
+<span class="sourceLineNo">1312</span>   */<a name="line.1312"></a>
+<span class="sourceLineNo">1313</span>  class GetTillDoneOrException extends Thread {<a name="line.1313"></a>
+<span class="sourceLineNo">1314</span>    private final Get g;<a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>    private final AtomicBoolean done;<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>    private final AtomicInteger count;<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>    private Exception e;<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span><a name="line.1318"></a>
+<span class="sourceLineNo">1319</span>    GetTillDoneOrException(final int i, final byte[] r, final AtomicBoolean d,<a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>        final AtomicInteger c) {<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>      super("getter." + i);<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>      this.g = new Get(r);<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>      this.done = d;<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span>      this.count = c;<a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>    }<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span><a name="line.1326"></a>
+<span class="sourceLineNo">1327</span>    @Override<a name="line.1327"></a>
+<span class="sourceLineNo">1328</span>    public void run() {<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>      while (!this.done.get()) {<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span>        try {<a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>          assertTrue(region.get(g).size() &gt; 0);<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>          this.count.incrementAndGet();<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>        } catch (Exception e) {<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>          this.e = e;<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span>          break;<a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>        }<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>      }<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>    }<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>  }<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span><a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>  /*<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>   * An involved filter test. Has multiple column families and deletes in mix.<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>   */<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>  @Test<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>  public void testWeirdCacheBehaviour() throws Exception {<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.1346"></a>
+<span class="sourceLineNo">1347</span>    byte[][] FAMILIES = new byte[][] { Bytes.toBytes("trans-blob"), Bytes.toBytes("trans-type"),<a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>        Bytes.toBytes("trans-date"), Bytes.toBytes("trans-tags"), Bytes.toBytes("trans-group") };<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span>    this.region = initHRegion(tableName, method, CONF, FAMILIES);<a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>    String value = "this is the value";<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>    String value2 = "this is some other value";<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>    String keyPrefix1 = "prefix1";<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>    String keyPrefix2 = "prefix2";<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span>    String keyPrefix3 = "prefix3";<a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>    putRows(this.region, 3, value, keyPrefix1);<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>    putRows(this.region, 3, value, keyPrefix2);<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span>    putRows(this.region, 3, value, keyPrefix3);<a name="line.1357"></a>
+<span class="sourceLineNo">1358</span>    putRows(this.region, 3, value2, keyPrefix1);<a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>    putRows(this.region, 3, value2, keyPrefix2);<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>    putRows(this.region, 3, value2, keyPrefix3);<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span>    System.out.println("Checking values for key: " + keyPrefix1);<a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>    assertEquals("Got back incorrect number of rows from scan", 3,<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>        getNumberOfRows(keyPrefix1, value2, this.region));<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span>    System.out.println("Checking values for key: " + keyPrefix2);<a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>    assertEquals("Got back incorrect number of rows from scan", 3,<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span>        getNumberOfRows(keyPrefix2, value2, this.region));<a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>    System.out.println("Checking values for key: " + keyPrefix3);<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>    assertEquals("Got back incorrect number of rows from scan", 3,<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>        getNumberOfRows(keyPrefix3, value2, this.region));<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>    deleteColumns(this.region, value2, keyPrefix1);<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>    deleteColumns(this.region, value2, keyPrefix2);<a name="line.1371"></a>
+<span class="sourceLineNo">1372</span>    deleteColumns(this.region, value2, keyPrefix3);<a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>    System.out.println("Starting important checks.....");<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>    assertEquals("Got back incorrect number of rows from scan: " + keyPrefix1, 0,<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span>        getNumberOfRows(keyPrefix1, value2, this.region));<a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>    assertEquals("Got back incorrect number of rows from scan: " + keyPrefix2, 0,<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>        getNumberOfRows(keyPrefix2, value2, this.region));<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>    assertEquals("Got back incorrect number of rows from scan: " + keyPrefix3, 0,<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span>        getNumberOfRows(keyPrefix3, value2, this.region));<a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>  }<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span><a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>  @Test<a name="line.1382"></a>
+<span class="sourceLineNo">1383</span>  public void testAppendWithReadOnlyTable() throws Exception {<a name="line.1383"></a>
+<span class="sourceLineNo">1384</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.1384"></a>
+<span class="sourceLineNo">1385</span>    this.region = initHRegion(tableName, method, CONF, true, Bytes.toBytes("somefamily"));<a name="line.1385"></a>
+<span class="sourceLineNo">1386</span>    boolean exceptionCaught = false;<a name="line.1386"></a>
+<span class="sourceLineNo">1387</span>    Append append = new Append(Bytes.toBytes("somerow"));<a name="line.1387"></a>
+<span class="sourceLineNo">1388</span>    append.setDurability(Durability.SKIP_WAL);<a name="line.1388"></a>
+<span class="sourceLineNo">1389</span>    append.addColumn(Bytes.toBytes("somefamily"), Bytes.toBytes("somequalifier"),<a name="line.1389"></a>
+<span class="sourceLineNo">1390</span>        Bytes.toBytes("somevalue"));<a name="line.1390"></a>
+<span class="sourceLineNo">1391</span>    try {<a name="line.1391"></a>
+<span class="sourceLineNo">1392</span>      region.append(append);<a name="line.1392"></a>
+<span class="sourceLineNo">1393</span>    } catch (IOException e) {<a name="line.1393"></a>
+<span class="sourceLineNo">1394</span>      exceptionCaught = true;<a name="line.1394"></a>
+<span class="sourceLineNo">1395</span>    }<a name="line.1395"></a>
+<span class="sourceLineNo">1396</span>    assertTrue(exceptionCaught == true);<a name="line.1396"></a>
+<span class="sourceLineNo">1397</span>  }<a name="line.1397"></a>
+<span class="sourceLineNo">1398</span><a name="line.1398"></a>
+<span class="sourceLineNo">1399</span>  @Test<a name="line.1399"></a>
+<span class="sourceLineNo">1400</span>  public void testIncrWithReadOnlyTable() throws Exception {<a name="line.1400"></a>
+<span class="sourceLineNo">1401</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.1401"></a>
+<span class="sourceLineNo">1402</span>    this.region = initHRegion(tableName, method, CONF, true, Bytes.toBytes("somefamily"));<a name="line.1402"></a>
+<span class="sourceLineNo">1403</span>    boolean exceptionCaught = false;<a name="line.1403"></a>
+<span class="sourceLineNo">1404</span>    Increment inc = new Increment(Bytes.toBytes("somerow"));<a name="line.1404"></a>
+<span class="sourceLineNo">1405</span>    inc.setDurability(Durability.SKIP_WAL);<a name="line.1405"></a>
+<span class="sourceLineNo">1406</span>    inc.addColumn(Bytes.toBytes("somefamily"), Bytes.toBytes("somequalifier"), 1L);<a name="line.1406"></a>
+<span class="sourceLineNo">1407</span>    try {<a name="line.1407"></a>
+<span class="sourceLineNo">1408</span>      region.increment(inc);<a name="line.1408"></a>
+<span class="sourceLineNo">1409</span>    } catch (IOException e) {<a name="line.1409"></a>
+<span class="sourceLineNo">1410</span>      exceptionCaught = true;<a name="line.1410"></a>
+<span class="sourceLineNo">1411</span>    }<a name="line.1411"></a>
+<span class="sourceLineNo">1412</span>    assertTrue(exceptionCaught == true);<a name="line.1412"></a>
+<span class="sourceLineNo">1413</span>  }<a name="line.1413"></a>
+<span class="sourceLineNo">1414</span><a name="line.1414"></a>
+<span class="sourceLineNo">1415</span>  private void deleteColumns(HRegion r, String value, String keyPrefix) throws IOException {<a name="line.1415"></a>
+<span class="sourceLineNo">1416</span>    InternalScanner scanner = buildScanner(keyPrefix, value, r);<a name="line.1416"></a>
+<span class="sourceLineNo">1417</span>    int count = 0;<a name="line.1417"></a>
+<span class="sourceLineNo">1418</span>    boolean more = false;<a name="line.1418"></a>
+<span class="sourceLineNo">1419</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.1419"></a>
+<span class="sourceLineNo">1420</span>    do {<a name="line.1420"></a>
+<span class="sourceLineNo">1421</span>      more = scanner.next(results);<a name="line.1421"></a>
+<span class="sourceLineNo">1422</span>      if (results != null &amp;&amp; !results.isEmpty())<a name="line.1422"></a>
+<span class="sourceLineNo">1423</span>        count++;<a name="line.1423"></a>
+<span class="sourceLineNo">1424</span>      else<a name="line.1424"></a>
+<span class="sourceLineNo">1425</span>        break;<a name="line.1425"></a>
+<span class="sourceLineNo">1426</span>      Delete delete = new Delete(CellUtil.cloneRow(results.get(0)));<a name="line.1426"></a>
+<span class="sourceLineNo">1427</span>      delete.addColumn(Bytes.toBytes("trans-tags"), Bytes.toBytes("qual2"));<a name="line.1427"></a>
+<span class="sourceLineNo">1428</span>      r.delete(delete);<a name="line.1428"></a>
+<span class="sourceLineNo">1429</span>      results.clear();<a name="line.1429"></a>
+<span class="sourceLineNo">1430</span>    } while (more);<a name="line.1430"></a>
+<span class="sourceLineNo">1431</span>    assertEquals("Did not perform correct number of deletes", 3, count);<a name="line.1431"></a>
+<span class="sourceLineNo">1432</span>  }<a name="line.1432"></a>
+<span class="sourceLineNo">1433</span><a name="line.1433"></a>
+<span class="sourceLineNo">1434</span>  private int getNumberOfRows(String keyPrefix, String value, HRegion r) throws Exception {<a name="line.1434"></a>
+<span class="sourceLineNo">1435</span>    InternalScanner resultScanner = buildScanner(keyPrefix, value, r);<a name="line.1435"></a>
+<span class="sourceLineNo">1436</span>    int numberOfResults = 0;<a name="line.1436"></a>
+<span class="sourceLineNo">1437</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.1437"></a>
+<span class="sourceLineNo">1438</span>    boolean more = false;<a name="line.1438"></a>
+<span class="sourceLineNo">1439</span>    do {<a name="line.1439"></a>
+<span class="sourceLineNo">1440</span>      more = resultScanner.next(results);<a name="line.1440"></a>
+<span class="sourceLineNo">1441</span>      if (results != null &amp;&amp; !results.isEmpty())<a name="line.1441"></a>
+<span class="sourceLineNo">1442</span>        numberOfResults++;<a name="line.1442"></a>
+<span class="sourceLineNo">1443</span>      else<a name="line.1443"></a>
+<span class="sourceLineNo">1444</span>        break;<a name="line.1444"></a>
+<span class="sourceLineNo">1445</span>      for (Cell kv : results) {<a name="line.1445"></a>
+<span class="sourceLineNo">1446</span>        System.out.println("kv=" + kv.toString() + ", " + Bytes.toString(CellUtil.cloneValue(kv)));<a name="line.1446"></a>
+<span class="sourceLineNo">1447</span>      }<a name="line.1447"></a>
+<span class="sourceLineNo">1448</span>      results.clear();<a name="line.1448"></a>
+<span class="sourceLineNo">1449</span>    } while (more);<a name="line.1449"></a>
+<span class="sourceLineNo">1450</span>    return numberOfResults;<a name="line.1450"></a>
+<span class="sourceLineNo">1451</span>  }<a name="line.1451"></a>
+<span class="sourceLineNo">1452</span><a name="line.1452"></a>
+<span class="sourceLineNo">1453</span>  private InternalScanner buildScanner(String keyPrefix, String value, HRegion r)<a name="line.1453"></a>
+<span class="sourceLineNo">1454</span>      throws IOException {<a name="line.1454"></a>
+<span class="sourceLineNo">1455</span>    // Defaults FilterList.Operator.MUST_PASS_ALL.<a name="line.1455"></a>
+<span class="sourceLineNo">1456</span>    FilterList allFilters = new FilterList();<a name="line.1456"></a>
+<span class="sourceLineNo">1457</span>    allFilters.addFilter(new PrefixFilter(Bytes.toBytes(keyPrefix)));<a name="line.1457"></a>
+<span class="sourceLineNo">1458</span>    // Only return rows where this column value exists in the row.<a name="line.1458"></a>
+<span class="sourceLineNo">1459</span>    SingleColumnValueFilter filter = new SingleColumnValueFilter(Bytes.toBytes("trans-tags"),<a name="line.1459"></a>
+<span class="sourceLineNo">1460</span>        Bytes.toBytes("qual2"), CompareOperator.EQUAL, Bytes.toBytes(value));<a name="line.1460"></a>
+<span class="sourceLineNo">1461</span>    filter.setFilterIfMissing(true);<a name="line.1461"></a>
+<span class="sourceLineNo">1462</span>    allFilters.addFilter(filter);<a name="line.1462"></a>
+<span class="sourceLineNo">1463</span>    Scan scan = new Scan();<a name="line.1463"></a>
+<span class="sourceLineNo">1464</span>    scan.addFamily(Bytes.toBytes("trans-blob"));<a name="line.1464"></a>
+<span class="sourceLineNo">1465</span>    scan.addFamily(Bytes.toBytes("trans-type"));<a name="line.1465"></a>
+<span class="sourceLineNo">1466</span>    scan.addFamily(Bytes.toBytes("trans-date"));<a name="line.1466"></a>
+<span class="sourceLineNo">1467</span>    scan.addFamily(Bytes.toBytes("trans-tags"));<a name="line.1467"></a>
+<span class="sourceLineNo">1468</span>    scan.addFamily(Bytes.toBytes("trans-group"));<a name="line.1468"></a>
+<span class="sourceLineNo">1469</span>    scan.setFilter(allFilters);<a name="line.1469"></a>
+<span class="sourceLineNo">1470</span>    return r.getScanner(scan);<a name="line.1470"></a>
+<span class="sourceLineNo">1471</span>  }<a name="line.1471"></a>
+<span class="sourceLineNo">1472</span><a name="line.1472"></a>
+<span class="sourceLineNo">1473</span>  private void putRows(HRegion r, int numRows, String value, String key) throws IOException {<a name="line.1473"></a>
+<span class="sourceLineNo">1474</span>    for (int i = 0; i &lt; numRows; i++) {<a name="line.1474"></a>
+<span class="sourceLineNo">1475</span>      String row = key + "_" + i/* UUID.randomUUID().toString() */;<a name="line.1475"></a>
+<span class="sourceLineNo">1476</span>      System.out.println(String.format("Saving row: %s, with value %s", row, value));<a name="line.1476"></a>
+<span class="sourceLineNo">1477</span>      Put put = new Put(Bytes.toBytes(row));<a name="line.1477"></a>
+<span class="sourceLineNo">1478</span>      put.setDurability(Durability.SKIP_WAL);<a name="line.1478"></a>
+<span class="sourceLineNo">1479</span>      put.addColumn(Bytes.toBytes("trans-blob"), null, Bytes.toBytes("value for blob"));<a name="line.1479"></a>
+<span class="sourceLineNo">1480</span>      put.addColumn(Bytes.toBytes("trans-type"), null, Bytes.toBytes("statement"));<a name="line.1480"></a>
+<span class="sourceLineNo">1481</span>      put.addColumn(Bytes.toBytes("trans-date"), null, Bytes.toBytes("20090921010101999"));<a name="line.1481"></a>
+<span class="sourceLineNo">1482</span>      put.addColumn(Bytes.toBytes("trans-tags"), Bytes.toBytes("qual2"), Bytes.toBytes(value));<a name="line.1482"></a>
+<span class="sourceLineNo">1483</span>      put.addColumn(Bytes.toBytes("trans-group"), null, Bytes.toBytes("adhocTransactionGroupId"));<a name="line.1483"></a>
+<span class="sourceLineNo">1484</span>      r.put(put);<a name="line.1484"></a>
+<span class="sourceLineNo">1485</span>    }<a name="line.1485"></a>
+<span class="sourceLineNo">1486</span>  }<a name="line.1486"></a>
+<span class="sourceLineNo">1487</span><a name="line.1487"></a>
+<span class="sourceLineNo">1488</span>  @Test<a name="line.1488"></a>
+<span class="sourceLineNo">1489</span>  public void testFamilyWithAndWithoutColon() throws Exception {<a name="line.1489"></a>
+<span class="sourceLineNo">1490</span>    byte[] cf = Bytes.toBytes(COLUMN_FAMILY);<a name="line.1490"></a>
+<span class="sourceLineNo">1491</span>    this.region = initHRegion(tableName, method, CONF, cf);<a name="line.1491"></a>
+<span class="sourceLineNo">1492</span>    Put p = new Put(tableName.toBytes());<a name="line.1492"></a>
+<span class="sourceLineNo">1493</span>    byte[] cfwithcolon = Bytes.toBytes(COLUMN_FAMILY + ":");<a name="line.1493"></a>
+<span class="sourceLineNo">1494</span>    p.addColumn(cfwithcolon, cfwithcolon, cfwithcolon);<a name="line.1494"></a>
+<span class="sourceLineNo">1495</span>    boolean exception = false;<a name="line.1495"></a>
+<span class="sourceLineNo">1496</span>    try {<a name="line.1496"></a>
+<span class="sourceLineNo">1497</span>      this.region.put(p);<a name="line.1497"></a>
+<span class="sourceLineNo">1498</span>    } catch (NoSuchColumnFamilyException e) {<a name="line.1498"></a>
+<span class="sourceLineNo">1499</span>      exception = true;<a name="line.1499"></a>
+<span class="sourceLineNo">1500</span>    }<a name="line.1500"></a>
+<span class="sourceLineNo">1501</span>    assertTrue(exception);<a name="line.1501"></a>
+<span class="sourceLineNo">1502</span>  }<a name="line.1502"></a>
+<span class="sourceLineNo">1503</span><a name="line.1503"></a>
+<span class="sourceLineNo">1504</span>  @Test<a name="line.1504"></a>
+<span class="sourceLineNo">1505</span>  public void testBatchPut_whileNoRowLocksHeld() throws IOException {<a name="line.1505"></a>
+<span class="sourceLineNo">1506</span>    final Put[] puts = new Put[10];<a name="line.1506"></a>
+<span class="sourceLineNo">1507</span>    MetricsWALSource source = CompatibilitySingletonFactory.getInstance(MetricsWALSource.class);<a name="line.1507"></a>
+<span class="sourceLineNo">1508</span>    long syncs = prepareRegionForBachPut(puts, source, false);<a name="line.1508"></a>
+<span class="sourceLineNo">1509</span><a name="line.1509"></a>
+<span class="sourceLineNo">1510</span>    OperationStatus[] codes = this.region.batchMutate(puts);<a name="line.1510"></a>
+<span class="sourceLineNo">1511</span>    assertEquals(10, codes.length);<a name="line.1511"></a>
+<span class="sourceLineNo">1512</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.1512"></a>
+<span class="sourceLineNo">1513</span>      assertEquals(OperationStatusCode.SUCCESS, codes[i].getOperationStatusCode());<a name="line.1513"></a>
+<span class="sourceLineNo">1514</span>    }<a name="line.1514"></a>
+<span class="sourceLineNo">1515</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs + 1, source);<a name="line.1515"></a>
+<span class="sourceLineNo">1516</span><a name="line.1516"></a>
+<span class="sourceLineNo">1517</span>    LOG.info("Next a batch put with one invalid family");<a name="line.1517"></a>
+<span class="sourceLineNo">1518</span>    puts[5].addColumn(Bytes.toBytes("BAD_CF"), qual, value);<a name="line.1518"></a>
+<span class="sourceLineNo">1519</span>    codes = this.region.batchMutate(puts);<a name="line.1519"></a>
+<span class="sourceLineNo">1520</span>    assertEquals(10, codes.length);<a name="line.1520"></a>
+<span class="sourceLineNo">1521</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.1521"></a>
+<span class="sourceLineNo">1522</span>      assertEquals((i == 5) ? OperationStatusCode.BAD_FAMILY : OperationStatusCode.SUCCESS,<a name="line.1522"></a>
+<span class="sourceLineNo">1523</span>          codes[i].getOperationStatusCode());<a name="line.1523"></a>
+<span class="sourceLineNo">1524</span>    }<a name="line.1524"></a>
+<span class="sourceLineNo">1525</span><a name="line.1525"></a>
+<span class="sourceLineNo">1526</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs + 2, source);<a name="line.1526"></a>
+<span class="sourceLineNo">1527</span>  }<a name="line.1527"></a>
+<span class="sourceLineNo">1528</span><a name="line.1528"></a>
+<span class="sourceLineNo">1529</span>  @Test<a name="line.1529"></a>
+<span class="sourceLineNo">1530</span>  public void testBatchPut_whileMultipleRowLocksHeld() throws Exception {<a name="line.1530"></a>
+<span class="sourceLineNo">1531</span>    final Put[] puts = new Put[10];<a name="line.1531"></a>
+<span class="sourceLineNo">1532</span>    MetricsWALSource source = CompatibilitySingletonFactory.getInstance(MetricsWALSource.class);<a name="line.1532"></a>
+<span class="sourceLineNo">1533</span>    long syncs = prepareRegionForBachPut(puts, source, false);<a name="line.1533"></a>
+<span class="sourceLineNo">1534</span><a name="line.1534"></a>
+<span class="sourceLineNo">1535</span>    puts[5].addColumn(Bytes.toBytes("BAD_CF"), qual, value);<a name="line.1535"></a>
+<span class="sourceLineNo">1536</span><a name="line.1536"></a>
+<span class="sourceLineNo">1537</span>    LOG.info("batchPut will have to break into four batches to avoid row locks");<a name="line.1537"></a>
+<span class="sourceLineNo">1538</span>    RowLock rowLock1 = region.getRowLock(Bytes.toBytes("row_2"));<a name="line.1538"></a>
+<span class="sourceLineNo">1539</span>    RowLock rowLock2 = region.getRowLock(Bytes.toBytes("row_1"));<a name="line.1539"></a>
+<span class="sourceLineNo">1540</span>    RowLock rowLock3 = region.getRowLock(Bytes.toBytes("row_3"));<a name="line.1540"></a>
+<span class="sourceLineNo">1541</span>    RowLock rowLock4 = region.getRowLock(Bytes.toBytes("row_3"), true);<a name="line.1541"></a>
+<span class="sourceLineNo">1542</span><a name="line.1542"></a>
+<span class="sourceLineNo">1543</span>    MultithreadedTestUtil.TestContext ctx = new MultithreadedTestUtil.TestContext(CONF);<a name="line.1543"></a>
+<span class="sourceLineNo">1544</span>    final AtomicReference&lt;OperationStatus[]&gt; retFromThread = new AtomicReference&lt;&gt;();<a name="line.1544"></a>
+<span class="sourceLineNo">1545</span>    final CountDownLatch startingPuts = new CountDownLatch(1);<a name="line.1545"></a>
+<span class="sourceLineNo">1546</span>    final CountDownLatch startingClose = new CountDownLatch(1);<a name="line.1546"></a>
+<span class="sourceLineNo">1547</span>    TestThread putter = new TestThread(ctx) {<a name="line.1547"></a>
+<span class="sourceLineNo">1548</span>      @Override<a name="line.1548"></a>
+<span class="sourceLineNo">1549</span>      public void doWork() throws IOException {<a name="line.1549"></a>
+<span class="sourceLineNo">1550</span>        startingPuts.countDown();<a name="line.1550"></a>
+<span class="sourceLineNo">1551</span>        retFromThread.set(region.batchMutate(puts));<a name="line.1551"></a>
+<span class="sourceLineNo">1552</span>      }<a name="line.1552"></a>
+<span class="sourceLineNo">1553</span>    };<a name="line.1553"></a>
+<span class="sourceLineNo">1554</span>    LOG.info("...starting put thread while holding locks");<a name="line.1554"></a>
+<span class="sourceLineNo">1555</span>    ctx.addThread(putter);<a name="line.1555"></a>
+<span class="sourceLineNo">1556</span>    ctx.startThreads();<a name="line.1556"></a>
+<span class="sourceLineNo">1557</span><a name="line.1557"></a>
+<span class="sourceLineNo">1558</span>    // Now attempt to close the region from another thread.  Prior to HBASE-12565<a name="line.1558"></a>
+<span class="sourceLineNo">1559</span>    // this would cause the in-progress batchMutate operation to to fail with<a name="line.1559"></a>
+<span class="sourceLineNo">1560</span>    // exception because it use to release and re-acquire the close-guard lock<a name="line.1560"></a>
+<span class="sourceLineNo">1561</span>    // between batches.  Caller then didn't get status indicating which writes succeeded.<a name="line.1561"></a>
+<span class="sourceLineNo">1562</span>    // We now expect this thread to block until the batchMutate call finishes.<a name="line.1562"></a>
+<span class="sourceLineNo">1563</span>    Thread regionCloseThread = new TestThread(ctx) {<a name="line.1563"></a>
+<span class="sourceLineNo">1564</span>      @Override<a name="line.1564"></a>
+<span class="sourceLineNo">1565</span>      public void doWork() {<a name="line.1565"></a>
+<span class="sourceLineNo">1566</span>        try {<a name="line.1566"></a>
+<span class="sourceLineNo">1567</span>          startingPuts.await();<a name="line.1567"></a>
+<span class="sourceLineNo">1568</span>          // Give some time for the batch mutate to get in.<a name="line.1568"></a>
+<span class="sourceLineNo">1569</span>          // We don't want to race with the mutate<a name="line.1569"></a>
+<span class="sourceLineNo">1570</span>          Thread.sleep(10);<a name="line.1570"></a>
+<span class="sourceLineNo">1571</span>          startingClose.countDown();<a name="line.1571"></a>
+<span class="sourceLineNo">1572</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.1572"></a>
+<span class="sourceLineNo">1573</span>          region = null;<a name="line.1573"></a>
+<span class="sourceLineNo">1574</span>        } catch (IOException e) {<a name="line.1574"></a>
+<span class="sourceLineNo">1575</span>          throw new RuntimeException(e);<a name="line.1575"></a>
+<span class="sourceLineNo">1576</span>        } catch (InterruptedException e) {<a name="line.1576"></a>
+<span class="sourceLineNo">1577</span>          throw new RuntimeException(e);<a name="line.1577"></a>
+<span class="sourceLineNo">1578</span>        }<a name="line.1578"></a>
+<span class="sourceLineNo">1579</span>      }<a name="line.1579"></a>
+<span class="sourceLineNo">1580</span>    };<a name="line.1580"></a>
+<span class="sourceLineNo">1581</span>    regionCloseThread.start();<a name="line.1581"></a>
+<span class="sourceLineNo">1582</span><a name="line.1582"></a>
+<span class="sourceLineNo">1583</span>    startingClose.await();<a name="line.1583"></a>
+<span class="sourceLineNo">1584</span>    startingPuts.await();<a name="line.1584"></a>
+<span class="sourceLineNo">1585</span>    Thread.sleep(100);<a name="line.1585"></a>
+<span class="sourceLineNo">1586</span>    LOG.info("...releasing row lock 1, which should let put thread continue");<a name="line.1586"></a>
+<span class="sourceLineNo">1587</span>    rowLock1.release();<a name="line.1587"></a>
+<span class="sourceLineNo">1588</span>    rowLock2.release();<a name="line.1588"></a>
+<span class="sourceLineNo">1589</span>    rowLock3.release();<a name="line.1589"></a>
+<span class="sourceLineNo">1590</span>    waitForCounter(source, "syncTimeNumOps", syncs + 1);<a name="line.1590"></a>
+<span class="sourceLineNo">1591</span><a name="line.1591"></a>
+<span class="sourceLineNo">1592</span>    LOG.info("...joining on put thread");<a name="line.1592"></a>
+<span class="sourceLineNo">1593</span>    ctx.stop();<a name="line.1593"></a>
+<span class="sourceLineNo">1594</span>    regionCloseThread.join();<a name="line.1594"></a>
+<span class="sourceLineNo">1595</span><a name="line.1595"></a>
+<span class="sourceLineNo">1596</span>    OperationStatus[] codes = retFromThread.get();<a name="line.1596"></a>
+<span class="sourceLineNo">1597</span>    for (int i = 0; i &lt; codes.length; i++) {<a name="line.1597"></a>
+<span class="sourceLineNo">1598</span>      assertEquals((i == 5) ? OperationStatusCode.BAD_FAMILY : OperationStatusCode.SUCCESS,<a name="line.1598"></a>
+<span class="sourceLineNo">1599</span>          codes[i].getOperationStatusCode());<a name="line.1599"></a>
+<span class="sourceLineNo">1600</span>    }<a name="line.1600"></a>
+<span class="sourceLineNo">1601</span>    rowLock4.release();<a name="line.1601"></a>
+<span class="sourceLineNo">1602</span>  }<a name="line.1602"></a>
+<span class="sourceLineNo">1603</span><a name="line.1603"></a>
+<span class="sourceLineNo">1604</span>  private void waitForCounter(MetricsWALSource source, String metricName, long expectedCount)<a name="line.1604"></a>
+<span class="sourceLineNo">1605</span>      throws InterruptedException {<a name="line.1605"></a>
+<span class="sourceLineNo">1606</span>    long startWait = System.currentTimeMillis();<a name="line.1606"></a>
+<span class="sourceLineNo">1607</span>    long currentCount;<a name="line.1607"></a>
+<span class="sourceLineNo">1608</span>    while ((currentCount = metricsAssertHelper.getCounter(metricName, source)) &lt; expectedCount) {<a name="line.1608"></a>
+<span class="sourceLineNo">1609</span>      Thread.sleep(100);<a name="line.1609"></a>
+<span class="sourceLineNo">1610</span>      if (System.currentTimeMillis() - startWait &gt; 10000) {<a name="line.1610"></a>
+<span class="sourceLineNo">1611</span>        fail(String.format("Timed out waiting for '%s' &gt;= '%s', currentCount=%s", metricName,<a name="line.1611"></a>
+<span class="sourceLineNo">1612</span>            expectedCount, currentCount));<a name="line.1612"></a>
+<span class="sourceLineNo">1613</span>      }<a name="line.1613"></a>
+<span class="sourceLineNo">1614</span>    }<a name="line.1614"></a>
+<span class="sourceLineNo">1615</span>  }<a name="line.1615"></a>
+<span class="sourceLineNo">1616</span><a name="line.1616"></a>
+<span class="sourceLineNo">1617</span>  @Test<a name="line.1617"></a>
+<span class="sourceLineNo">1618</span>  public void testAtomicBatchPut() throws IOException {<a name="line.1618"></a>
+<span class="sourceLineNo">1619</span>    final Put[] puts = new Put[10];<a name="line.1619"></a>
+<span class="sourceLineNo">1620</span>    MetricsWALSource source = CompatibilitySingletonFactory.getInstance(MetricsWALSource.class);<a name="line.1620"></a>
+<span class="sourceLineNo">1621</span>    long syncs = prepareRegionForBachPut(puts, source, false);<a name="line.1621"></a>
+<span class="sourceLineNo">1622</span><a name="line.1622"></a>
+<span class="sourceLineNo">1623</span>    // 1. Straight forward case, should succeed<a name="line.1623"></a>
+<span class="sourceLineNo">1624</span>    MutationBatchOperation batchOp = new MutationBatchOperation(region, puts, true,<a name="line.1624"></a>
+<span class="sourceLineNo">1625</span>        HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.1625"></a>
+<span class="sourceLineNo">1626</span>    OperationStatus[] codes = this.region.batchMutate(batchOp);<a name="line.1626"></a>
+<span class="sourceLineNo">1627</span>    assertEquals(10, codes.length);<a name="line.1627"></a>
+<span class="sourceLineNo">1628</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.1628"></a>
+<span class="sourceLineNo">1629</span>      assertEquals(OperationStatusCode.SUCCESS, codes[i].getOperationStatusCode());<a name="line.1629"></a>
+<span class="sourceLineNo">1630</span>    }<a name="line.1630"></a>
+<span class="sourceLineNo">1631</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs + 1, source);<a name="line.1631"></a>
+<span class="sourceLineNo">1632</span><a name="line.1632"></a>
+<span class="sourceLineNo">1633</span>    // 2. Failed to get lock<a name="line.1633"></a>
+<span class="sourceLineNo">1634</span>    RowLock lock = region.getRowLock(Bytes.toBytes("row_" + 3));<a name="line.1634"></a>
+<span class="sourceLineNo">1635</span>    // Method {@link HRegion#getRowLock(byte[])} is reentrant. As 'row_3' is locked in this<a name="line.1635"></a>
+<span class="sourceLineNo">1636</span>    // thread, need to run {@link HRegion#batchMutate(HRegion.BatchOperation)} in different thread<a name="line.1636"></a>
+<span class="sourceLineNo">1637</span>    MultithreadedTestUtil.TestContext ctx = new MultithreadedTestUtil.TestContext(CONF);<a name="line.1637"></a>
+<span class="sourceLineNo">1638</span>    final AtomicReference&lt;IOException&gt; retFromThread = new AtomicReference&lt;&gt;();<a name="line.1638"></a>
+<span class="sourceLineNo">1639</span>    final CountDownLatch finishedPuts = new CountDownLatch(1);<a name="line.1639"></a>
+<span class="sourceLineNo">1640</span>    final MutationBatchOperation finalBatchOp = new MutationBatchOperation(region, puts, true,<a name="line.1640"></a>
+<span class="sourceLineNo">1641</span>        HConstants<a name="line.1641"></a>
+<span class="sourceLineNo">1642</span>        .NO_NONCE,<a name="line.1642"></a>
+<span class="sourceLineNo">1643</span>        HConstants.NO_NONCE);<a name="line.1643"></a>
+<span class="sourceLineNo">1644</span>    TestThread putter = new TestThread(ctx) {<a name="line.1644"></a>
+<span class="sourceLineNo">1645</span>      @Override<a name="line.1645"></a>
+<span class="sourceLineNo">1646</span>      public void doWork() throws IOException {<a name="line.1646"></a>
+<span class="sourceLineNo">1647</span>        try {<a name="line.1647"></a>
+<span class="sourceLineNo">1648</span>          region.batchMutate(finalBatchOp);<a name="line.1648"></a>
+<span class="sourceLineNo">1649</span>        } catch (IOException ioe) {<a name="line.1649"></a>
+<span class="sourceLineNo">1650</span>          LOG.error("test failed!", ioe);<a name="line.1650"></a>
+<span class="sourceLineNo">1651</span>          retFromThread.set(ioe);<a name="line.1651"></a>
+<span class="sourceLineNo">1652</span>        }<a name="line.1652"></a>
+<span class="sourceLineNo">1653</span>        finishedPuts.countDown();<a name="line.1653"></a>
+<span class="sourceLineNo">1654</span>      }<a name="line.1654"></a>
+<span class="sourceLineNo">1655</span>    };<a name="line.1655"></a>
+<span class="sourceLineNo">1656</span>    LOG.info("...starting put thread while holding locks");<a name="line.1656"></a>
+<span class="sourceLineNo">1657</span>    ctx.addThread(putter);<a name="line.1657"></a>
+<span class="sourceLineNo">1658</span>    ctx.startThreads();<a name="line.1658"></a>
+<span class="sourceLineNo">1659</span>    LOG.info("...waiting for batch puts while holding locks");<a name="line.1659"></a>
+<span class="sourceLineNo">1660</span>    try {<a name="line.1660"></a>
+<span class="sourceLineNo">1661</span>      finishedPuts.await();<a name="line.1661"></a>
+<span class="sourceLineNo">1662</span>    } catch (InterruptedException e) {<a name="line.1662"></a>
+<span class="sourceLineNo">1663</span>      LOG.error("Interrupted!", e);<a name="line.1663"></a>
+<span class="sourceLineNo">1664</span>    } finally {<a name="line.1664"></a>
+<span class="sourceLineNo">1665</span>      if (lock != null) {<a name="line.1665"></a>
+<span class="sourceLineNo">1666</span>        lock.release();<a name="line.1666"></a>
+<span class="sourceLineNo">1667</span>      }<a name="line.1667"></a>
+<span class="sourceLineNo">1668</span>    }<a name="line.1668"></a>
+<span class="sourceLineNo">1669</span>    assertNotNull(retFromThread.get());<a name="line.1669"></a>
+<span class="sourceLineNo">1670</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs + 1, source);<a name="line.1670"></a>
+<span class="sourceLineNo">1671</span><a name="line.1671"></a>
+<span class="sourceLineNo">1672</span>    // 3. Exception thrown in validation<a name="line.1672"></a>
+<span class="sourceLineNo">1673</span>    LOG.info("Next a batch put with one invalid family");<a name="line.1673"></a>
+<span class="sourceLineNo">1674</span>    puts[5].addColumn(Bytes.toBytes("BAD_CF"), qual, value);<a name="line.1674"></a>
+<span class="sourceLineNo">1675</span>    batchOp = new MutationBatchOperation(region, puts, true, HConstants.NO_NONCE,<a name="line.1675"></a>
+<span class="sourceLineNo">1676</span>        HConstants.NO_NONCE);<a name="line.1676"></a>
+<span class="sourceLineNo">1677</span>    thrown.expect(NoSuchColumnFamilyException.class);<a name="line.1677"></a>
+<span class="sourceLineNo">1678</span>    this.region.batchMutate(batchOp);<a name="line.1678"></a>
+<span class="sourceLineNo">1679</span>  }<a name="line.1679"></a>
+<span class="sourceLineNo">1680</span><a name="line.1680"></a>
+<span class="sourceLineNo">1681</span>  @Test<a name="line.1681"></a>
+<span class="sourceLineNo">1682</span>  public void testBatchPutWithTsSlop() throws Exception {<a name="line.1682"></a>
+<span class="sourceLineNo">1683</span>    // add data with a timestamp that is too recent for range. Ensure assert<a name="line.1683"></a>
+<span class="sourceLineNo">1684</span>    CONF.setInt("hbase.hregion.keyvalue.timestamp.slop.millisecs", 1000);<a name="line.1684"></a>
+<span class="sourceLineNo">1685</span>    final Put[] puts = new Put[10];<a name="line.1685"></a>
+<span class="sourceLineNo">1686</span>    MetricsWALSource source = CompatibilitySingletonFactory.getInstance(MetricsWALSource.class);<a name="line.1686"></a>
+<span class="sourceLineNo">1687</span><a name="line.1687"></a>
+<span class="sourceLineNo">1688</span>    long syncs = prepareRegionForBachPut(puts, source, true);<a name="line.1688"></a>
+<span class="sourceLineNo">1689</span><a name="line.1689"></a>
+<span class="sourceLineNo">1690</span>    OperationStatus[] codes = this.region.batchMutate(puts);<a name="line.1690"></a>
+<span class="sourceLineNo">1691</span>    assertEquals(10, codes.length);<a name="line.1691"></a>
+<span class="sourceLineNo">1692</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.1692"></a>
+<span class="sourceLineNo">1693</span>      assertEquals(OperationStatusCode.SANITY_CHECK_FAILURE, codes[i].getOperationStatusCode());<a name="line.1693"></a>
+<span class="sourceLineNo">1694</span>    }<a name="line.1694"></a>
+<span class="sourceLineNo">1695</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs, source);<a name="line.1695"></a>
+<span class="sourceLineNo">1696</span>  }<a name="line.1696"></a>
+<span class="sourceLineNo">1697</span><a name="line.1697"></a>
+<span class="sourceLineNo">1698</span>  /**<a name="line.1698"></a>
+<span class="sourceLineNo">1699</span>   * @return syncs initial syncTimeNumOps<a name="line.1699"></a>
+<span class="sourceLineNo">1700</span>   */<a name="line.1700"></a>
+<span class="sourceLineNo">1701</span>  private long prepareRegionForBachPut(final Put[] puts, final MetricsWALSource source,<a name="line.1701"></a>
+<span class="sourceLineNo">1702</span>      boolean slop) throws IOException {<a name="line.1702"></a>
+<span class="sourceLineNo">1703</span>    this.region = initHRegion(tableName, method, CONF, COLUMN_FAMILY_BYTES);<a name="line.1703"></a>
+<span class="sourceLineNo">1704</span><a name="line.1704"></a>
+<span class="sourceLineNo">1705</span>    LOG.info("First a batch put with all valid puts");<a name="line.1705"></a>
+<span class="sourceLineNo">1706</span>    for (int i = 0; i &lt; puts.length; i++) {<a name="line.1706"></a>
+<span class="sourceLineNo">1707</span>      puts[i] = slop ? new Put(Bytes.toBytes("row_" + i), Long.MAX_VALUE - 100) :<a name="line.1707"></a>
+<span class="sourceLineNo">1708</span>          new Put(Bytes.toBytes("row_" + i));<a name="line.1708"></a>
+<span class="sourceLineNo">1709</span>      puts[i].addColumn(COLUMN_FAMILY_BYTES, qual, value);<a name="line.1709"></a>
+<span class="sourceLineNo">1710</span>    }<a name="line.1710"></a>
+<span class="sourceLineNo">1711</span><a name="line.1711"></a>
+<span class="sourceLineNo">1712</span>    long syncs = metricsAssertHelper.getCounter("syncTimeNumOps", source);<a name="line.1712"></a>
+<span class="sourceLineNo">1713</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs, source);<a name="line.1713"></a>
+<span class="sourceLineNo">1714</span>    return syncs;<a name="line.1714"></a>
+<span class="sourceLineNo">1715</span>  }<a name="line.1715"></a>
+<span class="sourceLineNo">1716</span><a name="line.1716"></a>
+<span class="sourceLineNo">1717</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.1717"></a>
+<span class="sourceLineNo">1718</span>  // checkAndMutate tests<a name="line.1718"></a>
+<span class="sourceLineNo">1719</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.1719"></a>
+<span class="sourceLineNo">1720</span>  @Test<a name="line.1720"></a>
+<span class="sourceLineNo">1721</span>  public void testCheckAndMutate_WithEmptyRowValue() throws IOException {<a name="line.1721"></a>
+<span class="sourceLineNo">1722</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1722"></a>
+<span class="sourceLineNo">1723</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1723"></a>
+<span class="sourceLineNo">1724</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1724"></a>
+<span class="sourceLineNo">1725</span>    byte[] emptyVal = new byte[] {};<a name="line.1725"></a>
+<span class="sourceLineNo">1726</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1726"></a>
+<span class="sourceLineNo">1727</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.1727"></a>
+<span class="sourceLineNo">1728</span><a name="line.1728"></a>
+<span class="sourceLineNo">1729</span>    // Setting up region<a name="line.1729"></a>
+<span class="sourceLineNo">1730</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.1730"></a>
+<span class="sourceLineNo">1731</span>    // Putting empty data in key<a name="line.1731"></a>
+<span class="sourceLineNo">1732</span>    Put put = new Put(row1);<a name="line.1732"></a>
+<span class="sourceLineNo">1733</span>    put.addColumn(fam1, qf1, emptyVal);<a name="line.1733"></a>
+<span class="sourceLineNo">1734</span><a name="line.1734"></a>
+<span class="sourceLineNo">1735</span>    // checkAndPut with empty value<a name="line.1735"></a>
+<span class="sourceLineNo">1736</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1736"></a>
+<span class="sourceLineNo">1737</span>        new BinaryComparator(emptyVal), put);<a name="line.1737"></a>
+<span class="sourceLineNo">1738</span>    assertTrue(res);<a name="line.1738"></a>
+<span class="sourceLineNo">1739</span><a name="line.1739"></a>
+<span class="sourceLineNo">1740</span>    // Putting data in key<a name="line.1740"></a>
+<span class="sourceLineNo">1741</span>    put = new Put(row1);<a name="line.1741"></a>
+<span class="sourceLineNo">1742</span>    put.addColumn(fam1, qf1, val1);<a name="line.1742"></a>
+<span class="sourceLineNo">1743</span><a name="line.1743"></a>
+<span class="sourceLineNo">1744</span>    // checkAndPut with correct value<a name="line.1744"></a>
+<span class="sourceLineNo">1745</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1745"></a>
+<span class="sourceLineNo">1746</span>        new BinaryComparator(emptyVal), put);<a name="line.1746"></a>
+<span class="sourceLineNo">1747</span>    assertTrue(res);<a name="line.1747"></a>
+<span class="sourceLineNo">1748</span><a name="line.1748"></a>
+<span class="sourceLineNo">1749</span>    // not empty anymore<a name="line.1749"></a>
+<span class="sourceLineNo">1750</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1750"></a>
+<span class="sourceLineNo">1751</span>        new BinaryComparator(emptyVal), put);<a name="line.1751"></a>
+<span class="sourceLineNo">1752</span>    assertFalse(res);<a name="line.1752"></a>
+<span class="sourceLineNo">1753</span><a name="line.1753"></a>
+<span class="sourceLineNo">1754</span>    Delete delete = new Delete(row1);<a name="line.1754"></a>
+<span class="sourceLineNo">1755</span>    delete.addColumn(fam1, qf1);<a name="line.1755"></a>
+<span class="sourceLineNo">1756</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1756"></a>
+<span class="sourceLineNo">1757</span>        new BinaryComparator(emptyVal), delete);<a name="line.1757"></a>
+<span class="sourceLineNo">1758</span>    assertFalse(res);<a name="line.1758"></a>
+<span class="sourceLineNo">1759</span><a name="line.1759"></a>
+<span class="sourceLineNo">1760</span>    put = new Put(row1);<a name="line.1760"></a>
+<span class="sourceLineNo">1761</span>    put.addColumn(fam1, qf1, val2);<a name="line.1761"></a>
+<span class="sourceLineNo">1762</span>    // checkAndPut with correct value<a name="line.1762"></a>
+<span class="sourceLineNo">1763</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1763"></a>
+<span class="sourceLineNo">1764</span>        new BinaryComparator(val1), put);<a name="line.1764"></a>
+<span class="sourceLineNo">1765</span>    assertTrue(res);<a name="line.1765"></a>
+<span class="sourceLineNo">1766</span><a name="line.1766"></a>
+<span class="sourceLineNo">1767</span>    // checkAndDelete with correct value<a name="line.1767"></a>
+<span class="sourceLineNo">1768</span>    delete = new Delete(row1);<a name="line.1768"></a>
 <span class="sourceLineNo">1769</span>    delete.addColumn(fam1, qf1);<a name="line.1769"></a>
-<span class="sourceLineNo">1770</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1770"></a>
-<span class="sourceLineNo">1771</span>        new BinaryComparator(val2), delete);<a name="line.1771"></a>
-<span class="sourceLineNo">1772</span>    assertTrue(res);<a name="line.1772"></a>
-<span class="sourceLineNo">1773</span><a name="line.1773"></a>
-<span class="sourceLineNo">1774</span>    delete = new Delete(row1);<a name="line.1774"></a>
-<span class="sourceLineNo">1775</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1775"></a>
-<span class="sourceLineNo">1776</span>        new BinaryComparator(emptyVal), delete);<a name="line.1776"></a>
-<span class="sourceLineNo">1777</span>    assertTrue(res);<a name="line.1777"></a>
-<span class="sourceLineNo">1778</span><a name="line.1778"></a>
-<span class="sourceLineNo">1779</span>    // checkAndPut looking for a null value<a name="line.1779"></a>
-<span class="sourceLineNo">1780</span>    put = new Put(row1);<a name="line.1780"></a>
-<span class="sourceLineNo">1781</span>    put.addColumn(fam1, qf1, val1);<a name="line.1781"></a>
-<span class="sourceLineNo">1782</span><a name="line.1782"></a>
-<span class="sourceLineNo">1783</span>    res = region<a name="line.1783"></a>
-<span class="sourceLineNo">1784</span>        .checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new NullComparator(), put);<a name="line.1784"></a>
-<span class="sourceLineNo">1785</span>    assertTrue(res);<a name="line.1785"></a>
-<span class="sourceLineNo">1786</span>  }<a name="line.1786"></a>
-<span class="sourceLineNo">1787</span><a name="line.1787"></a>
-<span class="sourceLineNo">1788</span>  @Test<a name="line.1788"></a>
-<span class="sourceLineNo">1789</span>  public void testCheckAndMutate_WithWrongValue() throws IOException {<a name="line.1789"></a>
-<span class="sourceLineNo">1790</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1790"></a>
-<span class="sourceLineNo">1791</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1791"></a>
-<span class="sourceLineNo">1792</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1792"></a>
-<span class="sourceLineNo">1793</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1793"></a>
-<span class="sourceLineNo">1794</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.1794"></a>
-<span class="sourceLineNo">1795</span>    BigDecimal bd1 = new BigDecimal(Double.MAX_VALUE);<a name="line.1795"></a>
-<span class="sourceLineNo">1796</span>    BigDecimal bd2 = new BigDecimal(Double.MIN_VALUE);<a name="line.1796"></a>
-<span class="sourceLineNo">1797</span><a name="line.1797"></a>
-<span class="sourceLineNo">1798</span>    // Setting up region<a name="line.1798"></a>
-<span class="sourceLineNo">1799</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.1799"></a>
-<span class="sourceLineNo">1800</span>    // Putting data in key<a name="line.1800"></a>
-<span class="sourceLineNo">1801</span>    Put put = new Put(row1);<a name="line.1801"></a>
-<span class="sourceLineNo">1802</span>    put.addColumn(fam1, qf1, val1);<a name="line.1802"></a>
-<span class="sourceLineNo">1803</span>    region.put(put);<a name="line.1803"></a>
-<span class="sourceLineNo">1804</span><a name="line.1804"></a>
-<span class="sourceLineNo">1805</span>    // checkAndPut with wrong value<a name="line.1805"></a>
-<span class="sourceLineNo">1806</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1806"></a>
-<span class="sourceLineNo">1807</span>        new BinaryComparator(val2), put);<a name="line.1807"></a>
-<span class="sourceLineNo">1808</span>    assertEquals(false, res);<a name="line.1808"></a>
-<span class="sourceLineNo">1809</span><a name="line.1809"></a>
-<span class="sourceLineNo">1810</span>    // checkAndDelete with wrong value<a name="line.1810"></a>
-<span class="sourceLineNo">1811</span>    Delete delete = new Delete(row1);<a name="line.1811"></a>
-<span class="sourceLineNo">1812</span>    delete.addFamily(fam1);<a name="line.1812"></a>
-<span class="sourceLineNo">1813</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1813"></a>
-<span class="sourceLineNo">1814</span>        new BinaryComparator(val2), put);<a name="line.1814"></a>
-<span class="sourceLineNo">1815</span>    assertEquals(false, res);<a name="line.1815"></a>
-<span class="sourceLineNo">1816</span><a name="line.1816"></a>
-<span class="sourceLineNo">1817</span>    // Putting data in key<a name="line.1817"></a>
-<span class="sourceLineNo">1818</span>    put = new Put(row1);<a name="line.1818"></a>
-<span class="sourceLineNo">1819</span>    put.addColumn(fam1, qf1, Bytes.toBytes(bd1));<a name="line.1819"></a>
-<span class="sourceLineNo">1820</span>    region.put(put);<a name="line.1820"></a>
-<span class="sourceLineNo">1821</span><a name="line.1821"></a>
-<span class="sourceLineNo">1822</span>    // checkAndPut with wrong value<a name="line.1822"></a>
-<span class="sourceLineNo">1823</span>    res =<a name="line.1823"></a>
-<span class="sourceLineNo">1824</span>        region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1824"></a>
-<span class="sourceLineNo">1825</span>            new BigDecimalComparator(bd2), put);<a name="line.1825"></a>
-<span class="sourceLineNo">1826</span>    assertEquals(false, res);<a name="line.1826"></a>
-<span class="sourceLineNo">1827</span><a name="line.1827"></a>
-<span class="sourceLineNo">1828</span>    // checkAndDelete with wrong value<a name="line.1828"></a>
-<span class="sourceLineNo">1829</span>    delete = new Delete(row1);<a name="line.1829"></a>
-<span class="sourceLineNo">1830</span>    delete.addFamily(fam1);<a name="line.1830"></a>
-<span class="sourceLineNo">1831</span>    res =<a name="line.1831"></a>
-<span class="sourceLineNo">1832</span>        region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1832"></a>
-<span class="sourceLineNo">1833</span>            new BigDecimalComparator(bd2), put);<a name="line.1833"></a>
-<span class="sourceLineNo">1834</span>    assertEquals(false, res);<a name="line.1834"></a>
-<span class="sourceLineNo">1835</span>  }<a name="line.1835"></a>
-<span class="sourceLineNo">1836</span><a name="line.1836"></a>
-<span class="sourceLineNo">1837</span>  @Test<a name="line.1837"></a>
-<span class="sourceLineNo">1838</span>  public void testCheckAndMutate_WithCorrectValue() throws IOException {<a name="line.1838"></a>
-<span class="sourceLineNo">1839</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1839"></a>
-<span class="sourceLineNo">1840</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1840"></a>
-<span class="sourceLineNo">1841</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1841"></a>
-<span class="sourceLineNo">1842</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1842"></a>
-<span class="sourceLineNo">1843</span>    BigDecimal bd1 = new BigDecimal(Double.MIN_VALUE);<a name="line.1843"></a>
-<span class="sourceLineNo">1844</span><a name="line.1844"></a>
-<span class="sourceLineNo">1845</span>    // Setting up region<a name="line.1845"></a>
-<span class="sourceLineNo">1846</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.1846"></a>
-<span class="sourceLineNo">1847</span>    // Putting data in key<a name="line.1847"></a>
-<span class="sourceLineNo">1848</span>    Put put = new Put(row1);<a name="line.1848"></a>
-<span class="sourceLineNo">1849</span>    put.addColumn(fam1, qf1, val1);<a name="line.1849"></a>
-<span class="sourceLineNo">1850</span>    region.put(put);<a name="line.1850"></a>
-<span class="sourceLineNo">1851</span><a name="line.1851"></a>
-<span class="sourceLineNo">1852</span>    // checkAndPut with correct value<a name="line.1852"></a>
-<span class="sourceLineNo">1853</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1853"></a>
-<span class="sourceLineNo">1854</span>        new BinaryComparator(val1), put);<a name="line.1854"></a>
-<span class="sourceLineNo">1855</span>    assertEquals(true, res);<a name="line.1855"></a>
-<span class="sourceLineNo">1856</span><a name="line.1856"></a>
-<span class="sourceLineNo">1857</span>    // checkAndDelete with correct value<a name="line.1857"></a>
-<span class="sourceLineNo">1858</span>    Delete delete = new Delete(row1);<a name="line.1858"></a>
-<span class="sourceLineNo">1859</span>    delete.addColumn(fam1, qf1);<a name="line.1859"></a>
-<span class="sourceLineNo">1860</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new BinaryComparator(val1),<a name="line.1860"></a>
-<span class="sourceLineNo">1861</span>        delete);<a name="line.1861"></a>
-<span class="sourceLineNo">1862</span>    assertEquals(true, res);<a name="line.1862"></a>
-<span class="sourceLineNo">1863</span><a name="line.1863"></a>
-<span class="sourceLineNo">1864</span>    // Putting data in key<a name="line.1864"></a>
-<span class="sourceLineNo">1865</span>    put = new Put(row1);<a name="line.1865"></a>
-<span class="sourceLineNo">1866</span>    put.addColumn(fam1, qf1, Bytes.toBytes(bd1));<a name="line.1866"></a>
-<span class="sourceLineNo">1867</span>    region.put(put);<a name="line.1867"></a>
-<span class="sourceLineNo">1868</span><a name="line.1868"></a>
-<span class="sourceLineNo">1869</span>    // checkAndPut with correct value<a name="line.1869"></a>
-<span class="sourceLineNo">1870</span>    res =<a name="line.1870"></a>
-<span class="sourceLineNo">1871</span>        region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new BigDecimalComparator(<a name="line.1871"></a>
-<span class="sourceLineNo">1872</span>            bd1), put);<a name="line.1872"></a>
-<span class="sourceLineNo">1873</span>    assertEquals(true, res);<a name="line.1873"></a>
-<span class="sourceLineNo">1874</span><a name="line.1874"></a>
-<span class="sourceLineNo">1875</span>    // checkAndDelete with correct value<a name="line.1875"></a>
-<span class="sourceLineNo">1876</span>    delete = new Delete(row1);<a name="line.1876"></a>
-<span class="sourceLineNo">1877</span>    delete.addColumn(fam1, qf1);<a name="line.1877"></a>
-<span class="sourceLineNo">1878</span>    res =<a name="line.1878"></a>
-<span class="sourceLineNo">1879</span>        region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new BigDecimalComparator(<a name="line.1879"></a>
-<span class="sourceLineNo">1880</span>            bd1), delete);<a name="line.1880"></a>
-<span class="sourceLineNo">1881</span>    assertEquals(true, res);<a name="line.1881"></a>
-<span class="sourceLineNo">1882</span>  }<a name="line.1882"></a>
-<span class="sourceLineNo">1883</span><a name="line.1883"></a>
-<span class="sourceLineNo">1884</span>  @Test<a name="line.1884"></a>
-<span class="sourceLineNo">1885</span>  public void testCheckAndMutate_WithNonEqualCompareOp() throws IOException {<a name="line.1885"></a>
-<span class="sourceLineNo">1886</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1886"></a>
-<span class="sourceLineNo">1887</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1887"></a>
-<span class="sourceLineNo">1888</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1888"></a>
-<span class="sourceLineNo">1889</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1889"></a>
-<span class="sourceLineNo">1890</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.1890"></a>
-<span class="sourceLineNo">1891</span>    byte[] val3 = Bytes.toBytes("value3");<a name="line.1891"></a>
-<span class="sourceLineNo">1892</span>    byte[] val4 = Bytes.toBytes("value4");<a name="line.1892"></a>
-<span class="sourceLineNo">1893</span><a name="line.1893"></a>
-<span class="sourceLineNo">1894</span>    // Setting up region<a name="line.1894"></a>
-<span class="sourceLineNo">1895</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.1895"></a>
-<span class="sourceLineNo">1896</span>    // Putting val3 in key<a name="line.1896"></a>
-<span class="sourceLineNo">1897</span>    Put put = new Put(row1);<a name="line.1897"></a>
-<span class="sourceLineNo">1898</span>    put.addColumn(fam1, qf1, val3);<a name="line.1898"></a>
-<span class="sourceLineNo">1899</span>    region.put(put);<a name="line.1899"></a>
-<span class="sourceLineNo">1900</span><a name="line.1900"></a>
-<span class="sourceLineNo">1901</span>    // Test CompareOp.LESS: original = val3, compare with val3, fail<a name="line.1901"></a>
-<span class="sourceLineNo">1902</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS,<a name="line.1902"></a>
-<span class="sourceLineNo">1903</span>        new BinaryComparator(val3), put);<a name="line.1903"></a>
-<span class="sourceLineNo">1904</span>    assertEquals(false, res);<a name="line.1904"></a>
-<span class="sourceLineNo">1905</span><a name="line.1905"></a>
-<span class="sourceLineNo">1906</span>    // Test CompareOp.LESS: original = val3, compare with val4, fail<a name="line.1906"></a>
-<span class="sourceLineNo">1907</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS,<a name="line.1907"></a>
-<span class="sourceLineNo">1908</span>        new BinaryComparator(val4), put);<a name="line.1908"></a>
-<span class="sourceLineNo">1909</span>    assertEquals(false, res);<a name="line.1909"></a>
-<span class="sourceLineNo">1910</span><a name="line.1910"></a>
-<span class="sourceLineNo">1911</span>    // Test CompareOp.LESS: original = val3, compare with val2,<a name="line.1911"></a>
-<span class="sourceLineNo">1912</span>    // succeed (now value = val2)<a name="line.1912"></a>
-<span class="sourceLineNo">1913</span>    put = new Put(row1);<a name="line.1913"></a>
-<span class="sourceLineNo">1914</span>    put.addColumn(fam1, qf1, val2);<a name="line.1914"></a>
-<span class="sourceLineNo">1915</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS,<a name="line.1915"></a>
-<span class="sourceLineNo">1916</span>        new BinaryComparator(val2), put);<a name="line.1916"></a>
-<span class="sourceLineNo">1917</span>    assertEquals(true, res);<a name="line.1917"></a>
-<span class="sourceLineNo">1918</span><a name="line.1918"></a>
-<span class="sourceLineNo">1919</span>    // Test CompareOp.LESS_OR_EQUAL: original = val2, compare with val3, fail<a name="line.1919"></a>
-<span class="sourceLineNo">1920</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS_OR_EQUAL,<a name="line.1920"></a>
-<span class="sourceLineNo">1921</span>        new BinaryComparator(val3), put);<a name="line.1921"></a>
-<span class="sourceLineNo">1922</span>    assertEquals(false, res);<a name="line.1922"></a>
-<span class="sourceLineNo">1923</span><a name="line.1923"></a>
-<span class="sourceLineNo">1924</span>    // Test CompareOp.LESS_OR_EQUAL: original = val2, compare with val2,<a name="line.1924"></a>
-<span class="sourceLineNo">1925</span>    // succeed (value still = val2)<a name="line.1925"></a>
-<span class="sourceLineNo">1926</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS_OR_EQUAL,<a name="line.1926"></a>
-<span class="sourceLineNo">1927</span>        new BinaryComparator(val2), put);<a name="line.1927"></a>
-<span class="sourceLineNo">1928</span>    assertEquals(true, res);<a name="line.1928"></a>
-<span class="sourceLineNo">1929</span><a name="line.1929"></a>
-<span class="sourceLineNo">1930</span>    // Test CompareOp.LESS_OR_EQUAL: original = val2, compare with val1,<a name="line.1930"></a>
-<span class="sourceLineNo">1931</span>    // succeed (now value = val3)<a name="line.1931"></a>
-<span class="sourceLineNo">1932</span>    put = new Put(row1);<a name="line.1932"></a>
-<span class="sourceLineNo">1933</span>    put.addColumn(fam1, qf1, val3);<a name="line.1933"></a>
-<span class="sourceLineNo">1934</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS_OR_EQUAL,<a name="line.1934"></a>
-<span class="sourceLineNo">1935</span>        new BinaryComparator(val1), put);<a name="line.1935"></a>
-<span class="sourceLineNo">1936</span>    assertEquals(true, res);<a name="line.1936"></a>
-<span class="sourceLineNo">1937</span><a name="line.1937"></a>
-<span class="sourceLineNo">1938</span>    // Test CompareOp.GREATER: original = val3, compare with val3, fail<a name="line.1938"></a>
-<span class="sourceLineNo">1939</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER,<a name="line.1939"></a>
-<span class="sourceLineNo">1940</span>        new BinaryComparator(val3), put);<a name="line.1940"></a>
-<span class="sourceLineNo">1941</span>    assertEquals(false, res);<a name="line.1941"></a>
-<span class="sourceLineNo">1942</span><a name="line.1942"></a>
-<span class="sourceLineNo">1943</span>    // Test CompareOp.GREATER: original = val3, compare with val2, fail<a name="line.1943"></a>
-<span class="sourceLineNo">1944</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER,<a name="line.1944"></a>
-<span class="sourceLineNo">1945</span>        new BinaryComparator(val2), put);<a name="line.1945"></a>
-<span class="sourceLineNo">1946</span>    assertEquals(false, res);<a name="line.1946"></a>
-<span class="sourceLineNo">1947</span><a name="line.1947"></a>
-<span class="sourceLineNo">1948</span>    // Test CompareOp.GREATER: original = val3, compare with val4,<a name="line.1948"></a>
-<span class="sourceLineNo">1949</span>    // succeed (now value = val2)<a name="line.1949"></a>
-<span class="sourceLineNo">1950</span>    put = new Put(row1);<a name="line.1950"></a>
-<span class="sourceLineNo">1951</span>    put.addColumn(fam1, qf1, val2);<a name="line.1951"></a>
-<span class="sourceLineNo">1952</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER,<a name="line.1952"></a>
-<span class="sourceLineNo">1953</span>        new BinaryComparator(val4), put);<a name="line.1953"></a>
-<span class="sourceLineNo">1954</span>    assertEquals(true, res);<a name="line.1954"></a>
-<span class="sourceLineNo">1955</span><a name="line.1955"></a>
-<span class="sourceLineNo">1956</span>    // Test CompareOp.GREATER_OR_EQUAL: original = val2, compare with val1, fail<a name="line.1956"></a>
-<span class="sourceLineNo">1957</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER_OR_EQUAL,<a name="line.1957"></a>
-<span class="sourceLineNo">1958</span>        new BinaryComparator(val1), put);<a name="line.1958"></a>
-<span class="sourceLineNo">1959</span>    assertEquals(false, res);<a name="line.1959"></a>
-<span class="sourceLineNo">1960</span><a name="line.1960"></a>
-<span class="sourceLineNo">1961</span>    // Test CompareOp.GREATER_OR_EQUAL: original = val2, compare with val2,<a name="line.1961"></a>
-<span class="sourceLineNo">1962</span>    // succeed (value still = val2)<a name="line.1962"></a>
-<span class="sourceLineNo">1963</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER_OR_EQUAL,<a name="line.1963"></a>
-<span class="sourceLineNo">1964</span>        new BinaryComparator(val2), put);<a name="line.1964"></a>
-<span class="sourceLineNo">1965</span>    assertEquals(true, res);<a name="line.1965"></a>
-<span class="sourceLineNo">1966</span><a name="line.1966"></a>
-<span class="sourceLineNo">1967</span>    // Test CompareOp.GREATER_OR_EQUAL: original = val2, compare with val3, succeed<a name="line.1967"></a>
-<span class="sourceLineNo">1968</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER_OR_EQUAL,<a name="line.1968"></a>
-<span class="sourceLineNo">1969</span>        new BinaryComparator(val3), put);<a name="line.1969"></a>
-<span class="sourceLineNo">1970</span>    assertEquals(true, res);<a name="line.1970"></a>
-<span class="sourceLineNo">1971</span>  }<a name="line.1971"></a>
-<span class="sourceLineNo">1972</span><a name="line.1972"></a>
-<span class="sourceLineNo">1973</span>  @Test<a name="line.1973"></a>
-<span class="sourceLineNo">1974</span>  public void testCheckAndPut_ThatPutWasWritten() throws IOException {<a name="line.1974"></a>
-<span class="sourceLineNo">1975</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1975"></a>
-<span class="sourceLineNo">1976</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1976"></a>
-<span class="sourceLineNo">1977</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.1977"></a>
-<span class="sourceLineNo">1978</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1978"></a>
-<span class="sourceLineNo">1979</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1979"></a>
-<span class="sourceLineNo">1980</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.1980"></a>
-<span class="sourceLineNo">1981</span><a name="line.1981"></a>
-<span class="sourceLineNo">1982</span>    byte[][] families = { fam1, fam2 };<a name="line.1982"></a>
-<span class="sourceLineNo">1983</span><a name="line.1983"></a>
-<span class="sourceLineNo">1984</span>    // Setting up region<a name="line.1984"></a>
-<span class="sourceLineNo">1985</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.1985"></a>
-<span class="sourceLineNo">1986</span>    // Putting data in the key to check<a name="line.1986"></a>
-<span class="sourceLineNo">1987</span>    Put put = new Put(row1);<a name="line.1987"></a>
-<span class="sourceLineNo">1988</span>    put.addColumn(fam1, qf1, val1);<a name="line.1988"></a>
-<span class="sourceLineNo">1989</span>    region.put(put);<a name="line.1989"></a>
-<span class="sourceLineNo">1990</span><a name="line.1990"></a>
-<span class="sourceLineNo">1991</span>    // Creating put to add<a name="line.1991"></a>
-<span class="sourceLineNo">1992</span>    long ts = System.currentTimeMillis();<a name="line.1992"></a>
-<span class="sourceLineNo">1993</span>    KeyValue kv = new KeyValue(row1, fam2, qf1, ts, KeyValue.Type.Put, val2);<a name="line.1993"></a>
-<span class="sourceLineNo">1994</span>    put = new Put(row1);<a name="line.1994"></a>
-<span class="sourceLineNo">1995</span>    put.add(kv);<a name="line.1995"></a>
-<span class="sourceLineNo">1996</span><a name="line.1996"></a>
-<span class="sourceLineNo">1997</span>    // checkAndPut with wrong value<a name="line.1997"></a>
-<span class="sourceLineNo">1998</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1998"></a>
-<span class="sourceLineNo">1999</span>        new BinaryComparator(val1), put);<a name="line.1999"></a>
-<span class="sourceLineNo">2000</span>    assertEquals(true, res);<a name="line.2000"></a>
-<span class="sourceLineNo">2001</span><a name="line.2001"></a>
-<span class="sourceLineNo">2002</span>    Get get = new Get(row1);<a name="line.2002"></a>
-<span class="sourceLineNo">2003</span>    get.addColumn(fam2, qf1);<a name="line.2003"></a>
-<span class="sourceLineNo">2004</span>    Cell[] actual = region.get(get).rawCells();<a name="line.2004"></a>
-<span class="sourceLineNo">2005</span><a name="line.2005"></a>
-<span class="sourceLineNo">2006</span>    Cell[] expected = { kv };<a name="line.2006"></a>
-<span class="sourceLineNo">2007</span><a name="line.2007"></a>
-<span class="sourceLineNo">2008</span>    assertEquals(expected.length, actual.length);<a name="line.2008"></a>
-<span class="sourceLineNo">2009</span>    for (int i = 0; i &lt; actual.length; i++) {<a name="line.2009"></a>
-<span class="sourceLineNo">2010</span>      assertEquals(expected[i], actual[i]);<a name="line.2010"></a>
-<span class="sourceLineNo">2011</span>    }<a name="line.2011"></a>
-<span class="sourceLineNo">2012</span>  }<a name="line.2012"></a>
-<span class="sourceLineNo">2013</span><a name="line.2013"></a>
-<span class="sourceLineNo">2014</span>  @Test<a name="line.2014"></a>
-<span class="sourceLineNo">2015</span>  public void testCheckAndPut_wrongRowInPut() throws IOException {<a name="line.2015"></a>
-<span class="sourceLineNo">2016</span>    this.region = initHRegion(tableName, method, CONF, COLUMNS);<a name="line.2016"></a>
-<span class="sourceLineNo">2017</span>    Put put = new Put(row2);<a name="line.2017"></a>
-<span class="sourceLineNo">2018</span>    put.addColumn(fam1, qual1, value1);<a name="line.2018"></a>
-<span class="sourceLineNo">2019</span>    try {<a name="line.2019"></a>
-<span class="sourceLineNo">2020</span>      region.checkAndMutate(row, fam1, qual1, CompareOperator.EQUAL,<a name="line.2020"></a>
-<span class="sourceLineNo">2021</span>          new BinaryComparator(value2), put);<a name="line.2021"></a>
-<span class="sourceLineNo">2022</span>      fail();<a name="line.2022"></a>
-<span class="sourceLineNo">2023</span>    } catch (org.apache.hadoop.hbase.DoNotRetryIOException expected) {<a name="line.2023"></a>
-<span class="sourceLineNo">2024</span>      // expected exception.<a name="line.2024"></a>
-<span class="sourceLineNo">2025</span>    }<a name="line.2025"></a>
-<span class="sourceLineNo">2026</span>  }<a name="line.2026"></a>
-<span class="sourceLineNo">2027</span><a name="line.2027"></a>
-<span class="sourceLineNo">2028</span>  @Test<a name="line.2028"></a>
-<span class="sourceLineNo">2029</span>  public void testCheckAndDelete_ThatDeleteWasWritten() throws IOException {<a name="line.2029"></a>
-<span class="sourceLineNo">2030</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2030"></a>
-<span class="sourceLineNo">2031</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2031"></a>
-<span class="sourceLineNo">2032</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2032"></a>
-<span class="sourceLineNo">2033</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.2033"></a>
-<span class="sourceLineNo">2034</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.2034"></a>
-<span class="sourceLineNo">2035</span>    byte[] qf3 = Bytes.toBytes("qualifier3");<a name="line.2035"></a>
-<span class="sourceLineNo">2036</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.2036"></a>
-<span class="sourceLineNo">2037</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.2037"></a>
-<span class="sourceLineNo">2038</span>    byte[] val3 = Bytes.toBytes("value3");<a name="line.2038"></a>
-<span class="sourceLineNo">2039</span>    byte[] emptyVal = new byte[] {};<a name="line.2039"></a>
-<span class="sourceLineNo">2040</span><a name="line.2040"></a>
-<span class="sourceLineNo">2041</span>    byte[][] families = { fam1, fam2 };<a name="line.2041"></a>
-<span class="sourceLineNo">2042</span><a name="line.2042"></a>
-<span class="sourceLineNo">2043</span>    // Setting up region<a name="line.2043"></a>
-<span class="sourceLineNo">2044</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2044"></a>
-<span class="sourceLineNo">2045</span>    // Put content<a name="line.2045"></a>
-<span class="sourceLineNo">2046</span>    Put put = new Put(row1);<a name="line.2046"></a>
-<span class="sourceLineNo">2047</span>    put.addColumn(fam1, qf1, val1);<a name="line.2047"></a>
-<span class="sourceLineNo">2048</span>    region.put(put);<a name="line.2048"></a>
-<span class="sourceLineNo">2049</span>    Threads.sleep(2);<a name="line.2049"></a>
-<span class="sourceLineNo">2050</span><a name="line.2050"></a>
-<span class="sourceLineNo">2051</span>    put = new Put(row1);<a name="line.2051"></a>
-<span class="sourceLineNo">2052</span>    put.addColumn(fam1, qf1, val2);<a name="line.2052"></a>
-<span class="sourceLineNo">2053</span>    put.addColumn(fam2, qf1, val3);<a name="line.2053"></a>
-<span class="sourceLineNo">2054</span>    put.addColumn(fam2, qf2, val2);<a name="line.2054"></a>
-<span class="sourceLineNo">2055</span>    put.addColumn(fam2, qf3, val1);<a name="line.2055"></a>
-<span class="sourceLineNo">2056</span>    put.addColumn(fam1, qf3, val1);<a name="line.2056"></a>
-<span class="sourceLineNo">2057</span>    region.put(put);<a name="line.2057"></a>
-<span class="sourceLineNo">2058</span><a name="line.2058"></a>
-<span class="sourceLineNo">2059</span>    // Multi-column delete<a name="line.2059"></a>
-<span class="sourceLineNo">2060</span>    Delete delete = new Delete(row1);<a name="line.2060"></a>
-<span class="sourceLineNo">2061</span>    delete.addColumn(fam1, qf1);<a name="line.2061"></a>
-<span class="sourceLineNo">2062</span>    delete.addColumn(fam2, qf1);<a name="line.2062"></a>
-<span class="sourceLineNo">2063</span>    delete.addColumn(fam1, qf3);<a name="line.2063"></a>
-<span class="sourceLineNo">2064</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.2064"></a>
-<span class="sourceLineNo">2065</span>        new BinaryComparator(val2), delete);<a name="line.2065"></a>
-<span class="sourceLineNo">2066</span>    assertEquals(true, res);<a name="line.2066"></a>
-<span class="sourceLineNo">2067</span><a name="line.2067"></a>
-<span class="sourceLineNo">2068</span>    Get get = new Get(row1);<a name="line.2068"></a>
-<span class="sourceLineNo">2069</span>    get.addColumn(fam1, qf1);<a name="line.2069"></a>
-<span class="sourceLineNo">2070</span>    get.addColumn(fam1, qf3);<a name="line.2070"></a>
-<span class="sourceLineNo">2071</span>    get.addColumn(fam2, qf2);<a name="line.2071"></a>
-<span class="sourceLineNo">2072</span>    Result r = region.get(get);<a name="line.2072"></a>
-<span class="sourceLineNo">2073</span>    assertEquals(2, r.size());<a name="line.2073"></a>
-<span class="sourceLineNo">2074</span>    assertArrayEquals(val1, r.getValue(fam1, qf1));<a name="line.2074"></a>
-<span class="sourceLineNo">2075</span>    assertArrayEquals(val2, r.getValue(fam2, qf2));<a name="line.2075"></a>
-<span class="sourceLineNo">2076</span><a name="line.2076"></a>
-<span class="sourceLineNo">2077</span>    // Family delete<a name="line.2077"></a>
-<span class="sourceLineNo">2078</span>    delete = new Delete(row1);<a name="line.2078"></a>
-<span class="sourceLineNo">2079</span>    delete.addFamily(fam2);<a name="line.2079"></a>
-<span class="sourceLineNo">2080</span>    res = region.checkAndMutate(row1, fam2, qf1, CompareOperator.EQUAL,<a name="line.2080"></a>
-<span class="sourceLineNo">2081</span>        new BinaryComparator(emptyVal), delete);<a name="line.2081"></a>
-<span class="sourceLineNo">2082</span>    assertEquals(true, res);<a name="line.2082"></a>
-<span class="sourceLineNo">2083</span><a name="line.2083"></a>
-<span class="sourceLineNo">2084</span>    get = new Get(row1);<a name="line.2084"></a>
-<span class="sourceLineNo">2085</span>    r = region.get(get);<a name="line.2085"></a>
-<span class="sourceLineNo">2086</span>    assertEquals(1, r.size());<a name="line.2086"></a>
-<span class="sourceLineNo">2087</span>    assertArrayEquals(val1, r.getValue(fam1, qf1));<a name="line.2087"></a>
-<span class="sourceLineNo">2088</span><a name="line.2088"></a>
-<span class="sourceLineNo">2089</span>    // Row delete<a name="line.2089"></a>
-<span class="sourceLineNo">2090</span>    delete = new Delete(row1);<a name="line.2090"></a>
-<span class="sourceLineNo">2091</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new BinaryComparator(val1),<a name="line.2091"></a>
-<span class="sourceLineNo">2092</span>        delete);<a name="line.2092"></a>
-<span class="sourceLineNo">2093</span>    assertEquals(true, res);<a name="line.2093"></a>
-<span class="sourceLineNo">2094</span>    get = new Get(row1);<a name="line.2094"></a>
-<span class="sourceLineNo">2095</span>    r = region.get(get);<a name="line.2095"></a>
-<span class="sourceLineNo">2096</span>    assertEquals(0, r.size());<a name="line.2096"></a>
-<span class="sourceLineNo">2097</span>  }<a name="line.2097"></a>
-<span class="sourceLineNo">2098</span><a name="line.2098"></a>
-<span class="sourceLineNo">2099</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2099"></a>
-<span class="sourceLineNo">2100</span>  // Delete tests<a name="line.2100"></a>
-<span class="sourceLineNo">2101</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2101"></a>
-<span class="sourceLineNo">2102</span>  @Test<a name="line.2102"></a>
-<span class="sourceLineNo">2103</span>  public void testDelete_multiDeleteColumn() throws IOException {<a name="line.2103"></a>
-<span class="sourceLineNo">2104</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2104"></a>
-<span class="sourceLineNo">2105</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2105"></a>
-<span class="sourceLineNo">2106</span>    byte[] qual = Bytes.toBytes("qualifier");<a name="line.2106"></a>
-<span class="sourceLineNo">2107</span>    byte[] value = Bytes.toBytes("value");<a name="line.2107"></a>
-<span class="sourceLineNo">2108</span><a name="line.2108"></a>
-<span class="sourceLineNo">2109</span>    Put put = new Put(row1);<a name="line.2109"></a>
-<span class="sourceLineNo">2110</span>    put.addColumn(fam1, qual, 1, value);<a name="line.2110"></a>
-<span class="sourceLineNo">2111</span>    put.addColumn(fam1, qual, 2, value);<a name="line.2111"></a>
-<span class="sourceLineNo">2112</span><a name="line.2112"></a>
-<span class="sourceLineNo">2113</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2113"></a>
-<span class="sourceLineNo">2114</span>    region.put(put);<a name="line.2114"></a>
-<span class="sourceLineNo">2115</span><a name="line.2115"></a>
-<span class="sourceLineNo">2116</span>    // We do support deleting more than 1 'latest' version<a name="line.2116"></a>
-<span class="sourceLineNo">2117</span>    Delete delete = new Delete(row1);<a name="line.2117"></a>
-<span class="sourceLineNo">2118</span>    delete.addColumn(fam1, qual);<a name="line.2118"></a>
+<span class="sourceLineNo">1770</span>    delete.addColumn(fam1, qf1);<a name="line.1770"></a>
+<span class="sourceLineNo">1771</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1771"></a>
+<span class="sourceLineNo">1772</span>        new BinaryComparator(val2), delete);<a name="line.1772"></a>
+<span class="sourceLineNo">1773</span>    assertTrue(res);<a name="line.1773"></a>
+<span class="sourceLineNo">1774</span><a name="line.1774"></a>
+<span class="sourceLineNo">1775</span>    delete = new Delete(row1);<a name="line.1775"></a>
+<span class="sourceLineNo">1776</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1776"></a>
+<span class="sourceLineNo">1777</span>        new BinaryComparator(emptyVal), delete);<a name="line.1777"></a>
+<span class="sourceLineNo">1778</span>    assertTrue(res);<a name="line.1778"></a>
+<span class="sourceLineNo">1779</span><a name="line.1779"></a>
+<span class="sourceLineNo">1780</span>    // checkAndPut looking for a null value<a name="line.1780"></a>
+<span class="sourceLineNo">1781</span>    put = new Put(row1);<a name="line.1781"></a>
+<span class="sourceLineNo">1782</span>    put.addColumn(fam1, qf1, val1);<a name="line.1782"></a>
+<span class="sourceLineNo">1783</span><a name="line.1783"></a>
+<span class="sourceLineNo">1784</span>    res = region<a name="line.1784"></a>
+<span class="sourceLineNo">1785</span>        .checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new NullComparator(), put);<a name="line.1785"></a>
+<span class="sourceLineNo">1786</span>    assertTrue(res);<a name="line.1786"></a>
+<span class="sourceLineNo">1787</span>  }<a name="line.1787"></a>
+<span class="sourceLineNo">1788</span><a name="line.1788"></a>
+<span class="sourceLineNo">1789</span>  @Test<a name="line.1789"></a>
+<span class="sourceLineNo">1790</span>  public void testCheckAndMutate_WithWrongValue() throws IOException {<a name="line.1790"></a>
+<span class="sourceLineNo">1791</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1791"></a>
+<span class="sourceLineNo">1792</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1792"></a>
+<span class="sourceLineNo">1793</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1793"></a>
+<span class="sourceLineNo">1794</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1794"></a>
+<span class="sourceLineNo">1795</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.1795"></a>
+<span class="sourceLineNo">1796</span>    BigDecimal bd1 = new BigDecimal(Double.MAX_VALUE);<a name="line.1796"></a>
+<span class="sourceLineNo">1797</span>    BigDecimal bd2 = new BigDecimal(Double.MIN_VALUE);<a name="line.1797"></a>
+<span class="sourceLineNo">1798</span><a name="line.1798"></a>
+<span class="sourceLineNo">1799</span>    // Setting up region<a name="line.1799"></a>
+<span class="sourceLineNo">1800</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.1800"></a>
+<span class="sourceLineNo">1801</span>    // Putting data in key<a name="line.1801"></a>
+<span class="sourceLineNo">1802</span>    Put put = new Put(row1);<a name="line.1802"></a>
+<span class="sourceLineNo">1803</span>    put.addColumn(fam1, qf1, val1);<a name="line.1803"></a>
+<span class="sourceLineNo">1804</span>    region.put(put);<a name="line.1804"></a>
+<span class="sourceLineNo">1805</span><a name="line.1805"></a>
+<span class="sourceLineNo">1806</span>    // checkAndPut with wrong value<a name="line.1806"></a>
+<span class="sourceLineNo">1807</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1807"></a>
+<span class="sourceLineNo">1808</span>        new BinaryComparator(val2), put);<a name="line.1808"></a>
+<span class="sourceLineNo">1809</span>    assertEquals(false, res);<a name="line.1809"></a>
+<span class="sourceLineNo">1810</span><a name="line.1810"></a>
+<span class="sourceLineNo">1811</span>    // checkAndDelete with wrong value<a name="line.1811"></a>
+<span class="sourceLineNo">1812</span>    Delete delete = new Delete(row1);<a name="line.1812"></a>
+<span class="sourceLineNo">1813</span>    delete.addFamily(fam1);<a name="line.1813"></a>
+<span class="sourceLineNo">1814</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1814"></a>
+<span class="sourceLineNo">1815</span>        new BinaryComparator(val2), put);<a name="line.1815"></a>
+<span class="sourceLineNo">1816</span>    assertEquals(false, res);<a name="line.1816"></a>
+<span class="sourceLineNo">1817</span><a name="line.1817"></a>
+<span class="sourceLineNo">1818</span>    // Putting data in key<a name="line.1818"></a>
+<span class="sourceLineNo">1819</span>    put = new Put(row1);<a name="line.1819"></a>
+<span class="sourceLineNo">1820</span>    put.addColumn(fam1, qf1, Bytes.toBytes(bd1));<a name="line.1820"></a>
+<span class="sourceLineNo">1821</span>    region.put(put);<a name="line.1821"></a>
+<span class="sourceLineNo">1822</span><a name="line.1822"></a>
+<span class="sourceLineNo">1823</span>    // checkAndPut with wrong value<a name="line.1823"></a>
+<span class="sourceLineNo">1824</span>    res =<a name="line.1824"></a>
+<span class="sourceLineNo">1825</span>        region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1825"></a>
+<span class="sourceLineNo">1826</span>            new BigDecimalComparator(bd2), put);<a name="line.1826"></a>
+<span class="sourceLineNo">1827</span>    assertEquals(false, res);<a name="line.1827"></a>
+<span class="sourceLineNo">1828</span><a name="line.1828"></a>
+<span class="sourceLineNo">1829</span>    // checkAndDelete with wrong value<a name="line.1829"></a>
+<span class="sourceLineNo">1830</span>    delete = new Delete(row1);<a name="line.1830"></a>
+<span class="sourceLineNo">1831</span>    delete.addFamily(fam1);<a name="line.1831"></a>
+<span class="sourceLineNo">1832</span>    res =<a name="line.1832"></a>
+<span class="sourceLineNo">1833</span>        region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1833"></a>
+<span class="sourceLineNo">1834</span>            new BigDecimalComparator(bd2), put);<a name="line.1834"></a>
+<span class="sourceLineNo">1835</span>    assertEquals(false, res);<a name="line.1835"></a>
+<span class="sourceLineNo">1836</span>  }<a name="line.1836"></a>
+<span class="sourceLineNo">1837</span><a name="line.1837"></a>
+<span class="sourceLineNo">1838</span>  @Test<a name="line.1838"></a>
+<span class="sourceLineNo">1839</span>  public void testCheckAndMutate_WithCorrectValue() throws IOException {<a name="line.1839"></a>
+<span class="sourceLineNo">1840</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1840"></a>
+<span class="sourceLineNo">1841</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1841"></a>
+<span class="sourceLineNo">1842</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1842"></a>
+<span class="sourceLineNo">1843</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1843"></a>
+<span class="sourceLineNo">1844</span>    BigDecimal bd1 = new BigDecimal(Double.MIN_VALUE);<a name="line.1844"></a>
+<span class="sourceLineNo">1845</span><a name="line.1845"></a>
+<span class="sourceLineNo">1846</span>    // Setting up region<a name="line.1846"></a>
+<span class="sourceLineNo">1847</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.1847"></a>
+<span class="sourceLineNo">1848</span>    // Putting data in key<a name="line.1848"></a>
+<span class="sourceLineNo">1849</span>    Put put = new Put(row1);<a name="line.1849"></a>
+<span class="sourceLineNo">1850</span>    put.addColumn(fam1, qf1, val1);<a name="line.1850"></a>
+<span class="sourceLineNo">1851</span>    region.put(put);<a name="line.1851"></a>
+<span class="sourceLineNo">1852</span><a name="line.1852"></a>
+<span class="sourceLineNo">1853</span>    // checkAndPut with correct value<a name="line.1853"></a>
+<span class="sourceLineNo">1854</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1854"></a>
+<span class="sourceLineNo">1855</span>        new BinaryComparator(val1), put);<a name="line.1855"></a>
+<span class="sourceLineNo">1856</span>    assertEquals(true, res);<a name="line.1856"></a>
+<span class="sourceLineNo">1857</span><a name="line.1857"></a>
+<span class="sourceLineNo">1858</span>    // checkAndDelete with correct value<a name="line.1858"></a>
+<span class="sourceLineNo">1859</span>    Delete delete = new Delete(row1);<a name="line.1859"></a>
+<span class="sourceLineNo">1860</span>    delete.addColumn(fam1, qf1);<a name="line.1860"></a>
+<span class="sourceLineNo">1861</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new BinaryComparator(val1),<a name="line.1861"></a>
+<span class="sourceLineNo">1862</span>        delete);<a name="line.1862"></a>
+<span class="sourceLineNo">1863</span>    assertEquals(true, res);<a name="line.1863"></a>
+<span class="sourceLineNo">1864</span><a name="line.1864"></a>
+<span class="sourceLineNo">1865</span>    // Putting data in key<a name="line.1865"></a>
+<span class="sourceLineNo">1866</span>    put = new Put(row1);<a name="line.1866"></a>
+<span class="sourceLineNo">1867</span>    put.addColumn(fam1, qf1, Bytes.toBytes(bd1));<a name="line.1867"></a>
+<span class="sourceLineNo">1868</span>    region.put(put);<a name="line.1868"></a>
+<span class="sourceLineNo">1869</span><a name="line.1869"></a>
+<span class="sourceLineNo">1870</span>    // checkAndPut with correct value<a name="line.1870"></a>
+<span class="sourceLineNo">1871</span>    res =<a name="line.1871"></a>
+<span class="sourceLineNo">1872</span>        region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new BigDecimalComparator(<a name="line.1872"></a>
+<span class="sourceLineNo">1873</span>            bd1), put);<a name="line.1873"></a>
+<span class="sourceLineNo">1874</span>    assertEquals(true, res);<a name="line.1874"></a>
+<span class="sourceLineNo">1875</span><a name="line.1875"></a>
+<span class="sourceLineNo">1876</span>    // checkAndDelete with correct value<a name="line.1876"></a>
+<span class="sourceLineNo">1877</span>    delete = new Delete(row1);<a name="line.1877"></a>
+<span class="sourceLineNo">1878</span>    delete.addColumn(fam1, qf1);<a name="line.1878"></a>
+<span class="sourceLineNo">1879</span>    res =<a name="line.1879"></a>
+<span class="sourceLineNo">1880</span>        region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new BigDecimalComparator(<a name="line.1880"></a>
+<span class="sourceLineNo">1881</span>            bd1), delete);<a name="line.1881"></a>
+<span class="sourceLineNo">1882</span>    assertEquals(true, res);<a name="line.1882"></a>
+<span class="sourceLineNo">1883</span>  }<a name="line.1883"></a>
+<span class="sourceLineNo">1884</span><a name="line.1884"></a>
+<span class="sourceLineNo">1885</span>  @Test<a name="line.1885"></a>
+<span class="sourceLineNo">1886</span>  public void testCheckAndMutate_WithNonEqualCompareOp() throws IOException {<a name="line.1886"></a>
+<span class="sourceLineNo">1887</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1887"></a>
+<span class="sourceLineNo">1888</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1888"></a>
+<span class="sourceLineNo">1889</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1889"></a>
+<span class="sourceLineNo">1890</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1890"></a>
+<span class="sourceLineNo">1891</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.1891"></a>
+<span class="sourceLineNo">1892</span>    byte[] val3 = Bytes.toBytes("value3");<a name="line.1892"></a>
+<span class="sourceLineNo">1893</span>    byte[] val4 = Bytes.toBytes("value4");<a name="line.1893"></a>
+<span class="sourceLineNo">1894</span><a name="line.1894"></a>
+<span class="sourceLineNo">1895</span>    // Setting up region<a name="line.1895"></a>
+<span class="sourceLineNo">1896</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.1896"></a>
+<span class="sourceLineNo">1897</span>    // Putting val3 in key<a name="line.1897"></a>
+<span class="sourceLineNo">1898</span>    Put put = new Put(row1);<a name="line.1898"></a>
+<span class="sourceLineNo">1899</span>    put.addColumn(fam1, qf1, val3);<a name="line.1899"></a>
+<span class="sourceLineNo">1900</span>    region.put(put);<a name="line.1900"></a>
+<span class="sourceLineNo">1901</span><a name="line.1901"></a>
+<span class="sourceLineNo">1902</span>    // Test CompareOp.LESS: original = val3, compare with val3, fail<a name="line.1902"></a>
+<span class="sourceLineNo">1903</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS,<a name="line.1903"></a>
+<span class="sourceLineNo">1904</span>        new BinaryComparator(val3), put);<a name="line.1904"></a>
+<span class="sourceLineNo">1905</span>    assertEquals(false, res);<a name="line.1905"></a>
+<span class="sourceLineNo">1906</span><a name="line.1906"></a>
+<span class="sourceLineNo">1907</span>    // Test CompareOp.LESS: original = val3, compare with val4, fail<a name="line.1907"></a>
+<span class="sourceLineNo">1908</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS,<a name="line.1908"></a>
+<span class="sourceLineNo">1909</span>        new BinaryComparator(val4), put);<a name="line.1909"></a>
+<span class="sourceLineNo">1910</span>    assertEquals(false, res);<a name="line.1910"></a>
+<span class="sourceLineNo">1911</span><a name="line.1911"></a>
+<span class="sourceLineNo">1912</span>    // Test CompareOp.LESS: original = val3, compare with val2,<a name="line.1912"></a>
+<span class="sourceLineNo">1913</span>    // succeed (now value = val2)<a name="line.1913"></a>
+<span class="sourceLineNo">1914</span>    put = new Put(row1);<a name="line.1914"></a>
+<span class="sourceLineNo">1915</span>    put.addColumn(fam1, qf1, val2);<a name="line.1915"></a>
+<span class="sourceLineNo">1916</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS,<a name="line.1916"></a>
+<span class="sourceLineNo">1917</span>        new BinaryComparator(val2), put);<a name="line.1917"></a>
+<span class="sourceLineNo">1918</span>    assertEquals(true, res);<a name="line.1918"></a>
+<span class="sourceLineNo">1919</span><a name="line.1919"></a>
+<span class="sourceLineNo">1920</span>    // Test CompareOp.LESS_OR_EQUAL: original = val2, compare with val3, fail<a name="line.1920"></a>
+<span class="sourceLineNo">1921</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS_OR_EQUAL,<a name="line.1921"></a>
+<span class="sourceLineNo">1922</span>        new BinaryComparator(val3), put);<a name="line.1922"></a>
+<span class="sourceLineNo">1923</span>    assertEquals(false, res);<a name="line.1923"></a>
+<span class="sourceLineNo">1924</span><a name="line.1924"></a>
+<span class="sourceLineNo">1925</span>    // Test CompareOp.LESS_OR_EQUAL: original = val2, compare with val2,<a name="line.1925"></a>
+<span class="sourceLineNo">1926</span>    // succeed (value still = val2)<a name="line.1926"></a>
+<span class="sourceLineNo">1927</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS_OR_EQUAL,<a name="line.1927"></a>
+<span class="sourceLineNo">1928</span>        new BinaryComparator(val2), put);<a name="line.1928"></a>
+<span class="sourceLineNo">1929</span>    assertEquals(true, res);<a name="line.1929"></a>
+<span class="sourceLineNo">1930</span><a name="line.1930"></a>
+<span class="sourceLineNo">1931</span>    // Test CompareOp.LESS_OR_EQUAL: original = val2, compare with val1,<a name="line.1931"></a>
+<span class="sourceLineNo">1932</span>    // succeed (now value = val3)<a name="line.1932"></a>
+<span class="sourceLineNo">1933</span>    put = new Put(row1);<a name="line.1933"></a>
+<span class="sourceLineNo">1934</span>    put.addColumn(fam1, qf1, val3);<a name="line.1934"></a>
+<span class="sourceLineNo">1935</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS_OR_EQUAL,<a name="line.1935"></a>
+<span class="sourceLineNo">1936</span>        new BinaryComparator(val1), put);<a name="line.1936"></a>
+<span class="sourceLineNo">1937</span>    assertEquals(true, res);<a name="line.1937"></a>
+<span class="sourceLineNo">1938</span><a name="line.1938"></a>
+<span class="sourceLineNo">1939</span>    // Test CompareOp.GREATER: original = val3, compare with val3, fail<a name="line.1939"></a>
+<span class="sourceLineNo">1940</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER,<a name="line.1940"></a>
+<span class="sourceLineNo">1941</span>        new BinaryComparator(val3), put);<a name="line.1941"></a>
+<span class="sourceLineNo">1942</span>    assertEquals(false, res);<a name="line.1942"></a>
+<span class="sourceLineNo">1943</span><a name="line.1943"></a>
+<span class="sourceLineNo">1944</span>    // Test CompareOp.GREATER: original = val3, compare with val2, fail<a name="line.1944"></a>
+<span class="sourceLineNo">1945</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER,<a name="line.1945"></a>
+<span class="sourceLineNo">1946</span>        new BinaryComparator(val2), put);<a name="line.1946"></a>
+<span class="sourceLineNo">1947</span>    assertEquals(false, res);<a name="line.1947"></a>
+<span class="sourceLineNo">1948</span><a name="line.1948"></a>
+<span class="sourceLineNo">1949</span>    // Test CompareOp.GREATER: original = val3, compare with val4,<a name="line.1949"></a>
+<span class="sourceLineNo">1950</span>    // succeed (now value = val2)<a name="line.1950"></a>
+<span class="sourceLineNo">1951</span>    put = new Put(row1);<a name="line.1951"></a>
+<span class="sourceLineNo">1952</span>    put.addColumn(fam1, qf1, val2);<a name="line.1952"></a>
+<span class="sourceLineNo">1953</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER,<a name="line.1953"></a>
+<span class="sourceLineNo">1954</span>        new BinaryComparator(val4), put);<a name="line.1954"></a>
+<span class="sourceLineNo">1955</span>    assertEquals(true, res);<a name="line.1955"></a>
+<span class="sourceLineNo">1956</span><a name="line.1956"></a>
+<span class="sourceLineNo">1957</span>    // Test CompareOp.GREATER_OR_EQUAL: original = val2, compare with val1, fail<a name="line.1957"></a>
+<span class="sourceLineNo">1958</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER_OR_EQUAL,<a name="line.1958"></a>
+<span class="sourceLineNo">1959</span>        new BinaryComparator(val1), put);<a name="line.1959"></a>
+<span class="sourceLineNo">1960</span>    assertEquals(false, res);<a name="line.1960"></a>
+<span class="sourceLineNo">1961</span><a name="line.1961"></a>
+<span class="sourceLineNo">1962</span>    // Test CompareOp.GREATER_OR_EQUAL: original = val2, compare with val2,<a name="line.1962"></a>
+<span class="sourceLineNo">1963</span>    // succeed (value still = val2)<a name="line.1963"></a>
+<span class="sourceLineNo">1964</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER_OR_EQUAL,<a name="line.1964"></a>
+<span class="sourceLineNo">1965</span>        new BinaryComparator(val2), put);<a name="line.1965"></a>
+<span class="sourceLineNo">1966</span>    assertEquals(true, res);<a name="line.1966"></a>
+<span class="sourceLineNo">1967</span><a name="line.1967"></a>
+<span class="sourceLineNo">1968</span>    // Test CompareOp.GREATER_OR_EQUAL: original = val2, compare with val3, succeed<a name="line.1968"></a>
+<span class="sourceLineNo">1969</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER_OR_EQUAL,<a name="line.1969"></a>
+<span class="sourceLineNo">1970</span>        new BinaryComparator(val3), put);<a name="line.1970"></a>
+<span class="sourceLineNo">1971</span>    assertEquals(true, res);<a name="line.1971"></a>
+<span class="sourceLineNo">1972</span>  }<a name="line.1972"></a>
+<span class="sourceLineNo">1973</span><a name="line.1973"></a>
+<span class="sourceLineNo">1974</span>  @Test<a name="line.1974"></a>
+<span class="sourceLineNo">1975</span>  public void testCheckAndPut_ThatPutWasWritten() throws IOException {<a name="line.1975"></a>
+<span class="sourceLineNo">1976</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1976"></a>
+<span class="sourceLineNo">1977</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1977"></a>
+<span class="sourceLineNo">1978</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.1978"></a>
+<span class="sourceLineNo">1979</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1979"></a>
+<span class="sourceLineNo">1980</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1980"></a>
+<span class="sourceLineNo">1981</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.1981"></a>
+<span class="sourceLineNo">1982</span><a name="line.1982"></a>
+<span class="sourceLineNo">1983</span>    byte[][] families = { fam1, fam2 };<a name="line.1983"></a>
+<span class="sourceLineNo">1984</span><a name="line.1984"></a>
+<span class="sourceLineNo">1985</span>    // Setting up region<a name="line.1985"></a>
+<span class="sourceLineNo">1986</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.1986"></a>
+<span class="sourceLineNo">1987</span>    // Putting data in the key to check<a name="line.1987"></a>
+<span class="sourceLineNo">1988</span>    Put put = new Put(row1);<a name="line.1988"></a>
+<span class="sourceLineNo">1989</span>    put.addColumn(fam1, qf1, val1);<a name="line.1989"></a>
+<span class="sourceLineNo">1990</span>    region.put(put);<a name="line.1990"></a>
+<span class="sourceLineNo">1991</span><a name="line.1991"></a>
+<span class="sourceLineNo">1992</span>    // Creating put to add<a name="line.1992"></a>
+<span class="sourceLineNo">1993</span>    long ts = System.currentTimeMillis();<a name="line.1993"></a>
+<span class="sourceLineNo">1994</span>    KeyValue kv = new KeyValue(row1, fam2, qf1, ts, KeyValue.Type.Put, val2);<a name="line.1994"></a>
+<span class="sourceLineNo">1995</span>    put = new Put(row1);<a name="line.1995"></a>
+<span class="sourceLineNo">1996</span>    put.add(kv);<a name="line.1996"></a>
+<span class="sourceLineNo">1997</span><a name="line.1997"></a>
+<span class="sourceLineNo">1998</span>    // checkAndPut with wrong value<a name="line.1998"></a>
+<span class="sourceLineNo">1999</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1999"></a>
+<span class="sourceLineNo">2000</span>        new BinaryComparator(val1), put);<a name="line.2000"></a>
+<span class="sourceLineNo">2001</span>    assertEquals(true, res);<a name="line.2001"></a>
+<span class="sourceLineNo">2002</span><a name="line.2002"></a>
+<span class="sourceLineNo">2003</span>    Get get = new Get(row1);<a name="line.2003"></a>
+<span class="sourceLineNo">2004</span>    get.addColumn(fam2, qf1);<a name="line.2004"></a>
+<span class="sourceLineNo">2005</span>    Cell[] actual = region.get(get).rawCells();<a name="line.2005"></a>
+<span class="sourceLineNo">2006</span><a name="line.2006"></a>
+<span class="sourceLineNo">2007</span>    Cell[] expected = { kv };<a name="line.2007"></a>
+<span class="sourceLineNo">2008</span><a name="line.2008"></a>
+<span class="sourceLineNo">2009</span>    assertEquals(expected.length, actual.length);<a name="line.2009"></a>
+<span class="sourceLineNo">2010</span>    for (int i = 0; i &lt; actual.length; i++) {<a name="line.2010"></a>
+<span class="sourceLineNo">2011</span>      assertEquals(expected[i], actual[i]);<a name="line.2011"></a>
+<span class="sourceLineNo">2012</span>    }<a name="line.2012"></a>
+<span class="sourceLineNo">2013</span>  }<a name="line.2013"></a>
+<span class="sourceLineNo">2014</span><a name="line.2014"></a>
+<span class="sourceLineNo">2015</span>  @Test<a name="line.2015"></a>
+<span class="sourceLineNo">2016</span>  public void testCheckAndPut_wrongRowInPut() throws IOException {<a name="line.2016"></a>
+<span class="sourceLineNo">2017</span>    this.region = initHRegion(tableName, method, CONF, COLUMNS);<a name="line.2017"></a>
+<span class="sourceLineNo">2018</span>    Put put = new Put(row2);<a name="line.2018"></a>
+<span class="sourceLineNo">2019</span>    put.addColumn(fam1, qual1, value1);<a name="line.2019"></a>
+<span class="sourceLineNo">2020</span>    try {<a name="line.2020"></a>
+<span class="sourceLineNo">2021</span>      region.checkAndMutate(row, fam1, qual1, CompareOperator.EQUAL,<a name="line.2021"></a>
+<span class="sourceLineNo">2022</span>          new BinaryComparator(value2), put);<a name="line.2022"></a>
+<span class="sourceLineNo">2023</span>      fail();<a name="line.2023"></a>
+<span class="sourceLineNo">2024</span>    } catch (org.apache.hadoop.hbase.DoNotRetryIOException expected) {<a name="line.2024"></a>
+<span class="sourceLineNo">2025</span>      // expected exception.<a name="line.2025"></a>
+<span class="sourceLineNo">2026</span>    }<a name="line.2026"></a>
+<span class="sourceLineNo">2027</span>  }<a name="line.2027"></a>
+<span class="sourceLineNo">2028</span><a name="line.2028"></a>
+<span class="sourceLineNo">2029</span>  @Test<a name="line.2029"></a>
+<span class="sourceLineNo">2030</span>  public void testCheckAndDelete_ThatDeleteWasWritten() throws IOException {<a name="line.2030"></a>
+<span class="sourceLineNo">2031</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2031"></a>
+<span class="sourceLineNo">2032</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2032"></a>
+<span class="sourceLineNo">2033</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2033"></a>
+<span class="sourceLineNo">2034</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.2034"></a>
+<span class="sourceLineNo">2035</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.2035"></a>
+<span class="sourceLineNo">2036</span>    byte[] qf3 = Bytes.toBytes("qualifier3");<a name="line.2036"></a>
+<span class="sourceLineNo">2037</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.2037"></a>
+<span class="sourceLineNo">2038</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.2038"></a>
+<span class="sourceLineNo">2039</span>    byte[] val3 = Bytes.toBytes("value3");<a name="line.2039"></a>
+<span class="sourceLineNo">2040</span>    byte[] emptyVal = new byte[] {};<a name="line.2040"></a>
+<span class="sourceLineNo">2041</span><a name="line.2041"></a>
+<span class="sourceLineNo">2042</span>    byte[][] families = { fam1, fam2 };<a name="line.2042"></a>
+<span class="sourceLineNo">2043</span><a name="line.2043"></a>
+<span class="sourceLineNo">2044</span>    // Setting up region<a name="line.2044"></a>
+<span class="sourceLineNo">2045</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2045"></a>
+<span class="sourceLineNo">2046</span>    // Put content<a name="line.2046"></a>
+<span class="sourceLineNo">2047</span>    Put put = new Put(row1);<a name="line.2047"></a>
+<span class="sourceLineNo">2048</span>    put.addColumn(fam1, qf1, val1);<a name="line.2048"></a>
+<span class="sourceLineNo">2049</span>    region.put(put);<a name="line.2049"></a>
+<span class="sourceLineNo">2050</span>    Threads.sleep(2);<a name="line.2050"></a>
+<span class="sourceLineNo">2051</span><a name="line.2051"></a>
+<span class="sourceLineNo">2052</span>    put = new Put(row1);<a name="line.2052"></a>
+<span class="sourceLineNo">2053</span>    put.addColumn(fam1, qf1, val2);<a name="line.2053"></a>
+<span class="sourceLineNo">2054</span>    put.addColumn(fam2, qf1, val3);<a name="line.2054"></a>
+<span class="sourceLineNo">2055</span>    put.addColumn(fam2, qf2, val2);<a name="line.2055"></a>
+<span class="sourceLineNo">2056</span>    put.addColumn(fam2, qf3, val1);<a name="line.2056"></a>
+<span class="sourceLineNo">2057</span>    put.addColumn(fam1, qf3, val1);<a name="line.2057"></a>
+<span class="sourceLineNo">2058</span>    region.put(put);<a name="line.2058"></a>
+<span class="sourceLineNo">2059</span><a name="line.2059"></a>
+<span class="sourceLineNo">2060</span>    // Multi-column delete<a name="line.2060"></a>
+<span class="sourceLineNo">2061</span>    Delete delete = new Delete(row1);<a name="line.2061"></a>
+<span class="sourceLineNo">2062</span>    delete.addColumn(fam1, qf1);<a name="line.2062"></a>
+<span class="sourceLineNo">2063</span>    delete.addColumn(fam2, qf1);<a name="line.2063"></a>
+<span class="sourceLineNo">2064</span>    delete.addColumn(fam1, qf3);<a name="line.2064"></a>
+<span class="sourceLineNo">2065</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.2065"></a>
+<span class="sourceLineNo">2066</span>        new BinaryComparator(val2), delete);<a name="line.2066"></a>
+<span class="sourceLineNo">2067</span>    assertEquals(true, res);<a name="line.2067"></a>
+<span class="sourceLineNo">2068</span><a name="line.2068"></a>
+<span class="sourceLineNo">2069</span>    Get get = new Get(row1);<a name="line.2069"></a>
+<span class="sourceLineNo">2070</span>    get.addColumn(fam1, qf1);<a name="line.2070"></a>
+<span class="sourceLineNo">2071</span>    get.addColumn(fam1, qf3);<a name="line.2071"></a>
+<span class="sourceLineNo">2072</span>    get.addColumn(fam2, qf2);<a name="line.2072"></a>
+<span class="sourceLineNo">2073</span>    Result r = region.get(get);<a name="line.2073"></a>
+<span class="sourceLineNo">2074</span>    assertEquals(2, r.size());<a name="line.2074"></a>
+<span class="sourceLineNo">2075</span>    assertArrayEquals(val1, r.getValue(fam1, qf1));<a name="line.2075"></a>
+<span class="sourceLineNo">2076</span>    assertArrayEquals(val2, r.getValue(fam2, qf2));<a name="line.2076"></a>
+<span class="sourceLineNo">2077</span><a name="line.2077"></a>
+<span class="sourceLineNo">2078</span>    // Family delete<a name="line.2078"></a>
+<span class="sourceLineNo">2079</span>    delete = new Delete(row1);<a name="line.2079"></a>
+<span class="sourceLineNo">2080</span>    delete.addFamily(fam2);<a name="line.2080"></a>
+<span class="sourceLineNo">2081</span>    res = region.checkAndMutate(row1, fam2, qf1, CompareOperator.EQUAL,<a name="line.2081"></a>
+<span class="sourceLineNo">2082</span>        new BinaryComparator(emptyVal), delete);<a name="line.2082"></a>
+<span class="sourceLineNo">2083</span>    assertEquals(true, res);<a name="line.2083"></a>
+<span class="sourceLineNo">2084</span><a name="line.2084"></a>
+<span class="sourceLineNo">2085</span>    get = new Get(row1);<a name="line.2085"></a>
+<span class="sourceLineNo">2086</span>    r = region.get(get);<a name="line.2086"></a>
+<span class="sourceLineNo">2087</span>    assertEquals(1, r.size());<a name="line.2087"></a>
+<span class="sourceLineNo">2088</span>    assertArrayEquals(val1, r.getValue(fam1, qf1));<a name="line.2088"></a>
+<span class="sourceLineNo">2089</span><a name="line.2089"></a>
+<span class="sourceLineNo">2090</span>    // Row delete<a name="line.2090"></a>
+<span class="sourceLineNo">2091</span>    delete = new Delete(row1);<a name="line.2091"></a>
+<span class="sourceLineNo">2092</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new BinaryComparator(val1),<a name="line.2092"></a>
+<span class="sourceLineNo">2093</span>        delete);<a name="line.2093"></a>
+<span class="sourceLineNo">2094</span>    assertEquals(true, res);<a name="line.2094"></a>
+<span class="sourceLineNo">2095</span>    get = new Get(row1);<a name="line.2095"></a>
+<span class="sourceLineNo">2096</span>    r = region.get(get);<a name="line.2096"></a>
+<span class="sourceLineNo">2097</span>    assertEquals(0, r.size());<a name="line.2097"></a>
+<span class="sourceLineNo">2098</span>  }<a name="line.2098"></a>
+<span class="sourceLineNo">2099</span><a name="line.2099"></a>
+<span class="sourceLineNo">2100</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2100"></a>
+<span class="sourceLineNo">2101</span>  // Delete tests<a name="line.2101"></a>
+<span class="sourceLineNo">2102</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2102"></a>
+<span class="sourceLineNo">2103</span>  @Test<a name="line.2103"></a>
+<span class="sourceLineNo">2104</span>  public void testDelete_multiDeleteColumn() throws IOException {<a name="line.2104"></a>
+<span class="sourceLineNo">2105</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2105"></a>
+<span class="sourceLineNo">2106</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2106"></a>
+<span class="sourceLineNo">2107</span>    byte[] qual = Bytes.toBytes("qualifier");<a name="line.2107"></a>
+<span class="sourceLineNo">2108</span>    byte[] value = Bytes.toBytes("value");<a name="line.2108"></a>
+<span class="sourceLineNo">2109</span><a name="line.2109"></a>
+<span class="sourceLineNo">2110</span>    Put put = new Put(row1);<a name="line.2110"></a>
+<span class="sourceLineNo">2111</span>    put.addColumn(fam1, qual, 1, value);<a name="line.2111"></a>
+<span class="sourceLineNo">2112</span>    put.addColumn(fam1, qual, 2, value);<a name="line.2112"></a>
+<span class="sourceLineNo">2113</span><a name="line.2113"></a>
+<span class="sourceLineNo">2114</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2114"></a>
+<span class="sourceLineNo">2115</span>    region.put(put);<a name="line.2115"></a>
+<span class="sourceLineNo">2116</span><a name="line.2116"></a>
+<span class="sourceLineNo">2117</span>    // We do support deleting more than 1 'latest' version<a name="line.2117"></a>
+<span class="sourceLineNo">2118</span>    Delete delete = new Delete(row1);<a name="line.2118"></a>
 <span class="sourceLineNo">2119</span>    delete.addColumn(fam1, qual);<a name="line.2119"></a>
-<span class="sourceLineNo">2120</span>    region.delete(delete);<a name="line.2120"></a>
-<span class="sourceLineNo">2121</span><a name="line.2121"></a>
-<span class="sourceLineNo">2122</span>    Get get = new Get(row1);<a name="line.2122"></a>
-<span class="sourceLineNo">2123</span>    get.addFamily(fam1);<a name="line.2123"></a>
-<span class="sourceLineNo">2124</span>    Result r = region.get(get);<a name="line.2124"></a>
-<span class="sourceLineNo">2125</span>    assertEquals(0, r.size());<a name="line.2125"></a>
-<span class="sourceLineNo">2126</span>  }<a name="line.2126"></a>
-<span class="sourceLineNo">2127</span><a name="line.2127"></a>
-<span class="sourceLineNo">2128</span>  @Test<a name="line.2128"></a>
-<span class="sourceLineNo">2129</span>  public void testDelete_CheckFamily() throws IOException {<a name="line.2129"></a>
-<span class="sourceLineNo">2130</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2130"></a>
-<span class="sourceLineNo">2131</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2131"></a>
-<span class="sourceLineNo">2132</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2132"></a>
-<span class="sourceLineNo">2133</span>    byte[] fam3 = Bytes.toBytes("fam3");<a name="line.2133"></a>
-<span class="sourceLineNo">2134</span>    byte[] fam4 = Bytes.toBytes("fam4");<a name="line.2134"></a>
-<span class="sourceLineNo">2135</span><a name="line.2135"></a>
-<span class="sourceLineNo">2136</span>    // Setting up region<a name="line.2136"></a>
-<span class="sourceLineNo">2137</span>    this.region = initHRegion(tableName, method, CONF, fam1, fam2, fam3);<a name="line.2137"></a>
-<span class="sourceLineNo">2138</span>    List&lt;Cell&gt; kvs = new ArrayList&lt;&gt;();<a name="line.2138"></a>
-<span class="sourceLineNo">2139</span>    kvs.add(new KeyValue(row1, fam4, null, null));<a name="line.2139"></a>
-<span class="sourceLineNo">2140</span><a name="line.2140"></a>
-<span class="sourceLineNo">2141</span>    // testing existing family<a name="line.2141"></a>
-<span class="sourceLineNo">2142</span>    byte[] family = fam2;<a name="line.2142"></a>
-<span class="sourceLineNo">2143</span>    NavigableMap&lt;byte[], List&lt;Cell&gt;&gt; deleteMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2143"></a>
-<span class="sourceLineNo">2144</span>    deleteMap.put(family, kvs);<a name="line.2144"></a>
-<span class="sourceLineNo">2145</span>    region.delete(deleteMap, Durability.SYNC_WAL);<a name="line.2145"></a>
-<span class="sourceLineNo">2146</span><a name="line.2146"></a>
-<span class="sourceLineNo">2147</span>    // testing non existing family<a name="line.2147"></a>
-<span class="sourceLineNo">2148</span>    boolean ok = false;<a name="line.2148"></a>
-<span class="sourceLineNo">2149</span>    family = fam4;<a name="line.2149"></a>
-<span class="sourceLineNo">2150</span>    try {<a name="line.2150"></a>
-<span class="sourceLineNo">2151</span>      deleteMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2151"></a>
-<span class="sourceLineNo">2152</span>      deleteMap.put(family, kvs);<a name="line.2152"></a>
-<span class="sourceLineNo">2153</span>      region.delete(deleteMap, Durability.SYNC_WAL);<a name="line.2153"></a>
-<span class="sourceLineNo">2154</span>    } catch (Exception e) {<a name="line.2154"></a>
-<span class="sourceLineNo">2155</span>      ok = true;<a name="line.2155"></a>
-<span class="sourceLineNo">2156</span>    }<a name="line.2156"></a>
-<span class="sourceLineNo">2157</span>    assertTrue("Family " + new String(family, StandardCharsets.UTF_8) + " does exist", ok);<a name="line.2157"></a>
-<span class="sourceLineNo">2158</span>  }<a name="line.2158"></a>
-<span class="sourceLineNo">2159</span><a name="line.2159"></a>
-<span class="sourceLineNo">2160</span>  @Test<a name="line.2160"></a>
-<span class="sourceLineNo">2161</span>  public void testDelete_mixed() throws IOException, InterruptedException {<a name="line.2161"></a>
-<span class="sourceLineNo">2162</span>    byte[] fam = Bytes.toBytes("info");<a name="line.2162"></a>
-<span class="sourceLineNo">2163</span>    byte[][] families = { fam };<a name="line.2163"></a>
-<span class="sourceLineNo">2164</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2164"></a>
-<span class="sourceLineNo">2165</span>    EnvironmentEdgeManagerTestHelper.injectEdge(new IncrementingEnvironmentEdge());<a name="line.2165"></a>
-<span class="sourceLineNo">2166</span><a name="line.2166"></a>
-<span class="sourceLineNo">2167</span>    byte[] row = Bytes.toBytes("table_name");<a name="line.2167"></a>
-<span class="sourceLineNo">2168</span>    // column names<a name="line.2168"></a>
-<span class="sourceLineNo">2169</span>    byte[] serverinfo = Bytes.toBytes("serverinfo");<a name="line.2169"></a>
-<span class="sourceLineNo">2170</span>    byte[] splitA = Bytes.toBytes("splitA");<a name="line.2170"></a>
-<span class="sourceLineNo">2171</span>    byte[] splitB = Bytes.toBytes("splitB");<a name="line.2171"></a>
-<span class="sourceLineNo">2172</span><a name="line.2172"></a>
-<span class="sourceLineNo">2173</span>    // add some data:<a name="line.2173"></a>
-<span class="sourceLineNo">2174</span>    Put put = new Put(row);<a name="line.2174"></a>
-<span class="sourceLineNo">2175</span>    put.addColumn(fam, splitA, Bytes.toBytes("reference_A"));<a name="line.2175"></a>
-<span class="sourceLineNo">2176</span>    region.put(put);<a name="line.2176"></a>
-<span class="sourceLineNo">2177</span><a name="line.2177"></a>
-<span class="sourceLineNo">2178</span>    put = new Put(row);<a name="line.2178"></a>
-<span class="sourceLineNo">2179</span>    put.addColumn(fam, splitB, Bytes.toBytes("reference_B"));<a name="line.2179"></a>
-<span class="sourceLineNo">2180</span>    region.put(put);<a name="line.2180"></a>
-<span class="sourceLineNo">2181</span><a name="line.2181"></a>
-<span class="sourceLineNo">2182</span>    put = new Put(row);<a name="line.2182"></a>
-<span class="sourceLineNo">2183</span>    put.addColumn(fam, serverinfo, Bytes.toBytes("ip_address"));<a name="line.2183"></a>
-<span class="sourceLineNo">2184</span>    region.put(put);<a name="line.2184"></a>
-<span class="sourceLineNo">2185</span><a name="line.2185"></a>
-<span class="sourceLineNo">2186</span>    // ok now delete a split:<a name="line.2186"></a>
-<span class="sourceLineNo">2187</span>    Delete delete = new Delete(row);<a name="line.2187"></a>
-<span class="sourceLineNo">2188</span>    delete.addColumns(fam, splitA);<a name="line.2188"></a>
-<span class="sourceLineNo">2189</span>    region.delete(delete);<a name="line.2189"></a>
-<span class="sourceLineNo">2190</span><a name="line.2190"></a>
-<span class="sourceLineNo">2191</span>    // assert some things:<a name="line.2191"></a>
-<span class="sourceLineNo">2192</span>    Get get = new Get(row).addColumn(fam, serverinfo);<a name="line.2192"></a>
-<span class="sourceLineNo">2193</span>    Result result = region.get(get);<a name="line.2193"></a>
-<span class="sourceLineNo">2194</span>    assertEquals(1, result.size());<a name="line.2194"></a>
-<span class="sourceLineNo">2195</span><a name="line.2195"></a>
-<span class="sourceLineNo">2196</span>    get = new Get(row).addColumn(fam, splitA);<a name="line.2196"></a>
-<span class="sourceLineNo">2197</span>    result = region.get(get);<a name="line.2197"></a>
-<span class="sourceLineNo">2198</span>    assertEquals(0, result.size());<a name="line.2198"></a>
-<span class="sourceLineNo">2199</span><a name="line.2199"></a>
-<span class="sourceLineNo">2200</span>    get = new Get(row).addColumn(fam, splitB);<a name="line.2200"></a>
-<span class="sourceLineNo">2201</span>    result = region.get(get);<a name="line.2201"></a>
-<span class="sourceLineNo">2202</span>    assertEquals(1, result.size());<a name="line.2202"></a>
-<span class="sourceLineNo">2203</span><a name="line.2203"></a>
-<span class="sourceLineNo">2204</span>    // Assert that after a delete, I can put.<a name="line.2204"></a>
-<span class="sourceLineNo">2205</span>    put = new Put(row);<a name="line.2205"></a>
-<span class="sourceLineNo">2206</span>    put.addColumn(fam, splitA, Bytes.toBytes("reference_A"));<a name="line.2206"></a>
-<span class="sourceLineNo">2207</span>    region.put(put);<a name="line.2207"></a>
-<span class="sourceLineNo">2208</span>    get = new Get(row);<a name="line.2208"></a>
-<span class="sourceLineNo">2209</span>    result = region.get(get);<a name="line.2209"></a>
-<span class="sourceLineNo">2210</span>    assertEquals(3, result.size());<a name="line.2210"></a>
-<span class="sourceLineNo">2211</span><a name="line.2211"></a>
-<span class="sourceLineNo">2212</span>    // Now delete all... then test I can add stuff back<a name="line.2212"></a>
-<span class="sourceLineNo">2213</span>    delete = new Delete(row);<a name="line.2213"></a>
-<span class="sourceLineNo">2214</span>    region.delete(delete);<a name="line.2214"></a>
-<span class="sourceLineNo">2215</span>    assertEquals(0, region.get(get).size());<a name="line.2215"></a>
-<span class="sourceLineNo">2216</span><a name="line.2216"></a>
-<span class="sourceLineNo">2217</span>    region.put(new Put(row).addColumn(fam, splitA, Bytes.toBytes("reference_A")));<a name="line.2217"></a>
-<span class="sourceLineNo">2218</span>    result = region.get(get);<a name="line.2218"></a>
-<span class="sourceLineNo">2219</span>    assertEquals(1, result.size());<a name="line.2219"></a>
-<span class="sourceLineNo">2220</span>  }<a name="line.2220"></a>
-<span class="sourceLineNo">2221</span><a name="line.2221"></a>
-<span class="sourceLineNo">2222</span>  @Test<a name="line.2222"></a>
-<span class="sourceLineNo">2223</span>  public void testDeleteRowWithFutureTs() throws IOException {<a name="line.2223"></a>
-<span class="sourceLineNo">2224</span>    byte[] fam = Bytes.toBytes("info");<a name="line.2224"></a>
-<span class="sourceLineNo">2225</span>    byte[][] families = { fam };<a name="line.2225"></a>
-<span class="sourceLineNo">2226</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2226"></a>
-<span class="sourceLineNo">2227</span>    byte[] row = Bytes.toBytes("table_name");<a name="line.2227"></a>
-<span class="sourceLineNo">2228</span>    // column names<a name="line.2228"></a>
-<span class="sourceLineNo">2229</span>    byte[] serverinfo = Bytes.toBytes("serverinfo");<a name="line.2229"></a>
-<span class="sourceLineNo">2230</span><a name="line.2230"></a>
-<span class="sourceLineNo">2231</span>    // add data in the far future<a name="line.2231"></a>
-<span class="sourceLineNo">2232</span>    Put put = new Put(row);<a name="line.2232"></a>
-<span class="sourceLineNo">2233</span>    put.addColumn(fam, serverinfo, HConstants.LATEST_TIMESTAMP - 5, Bytes.toBytes("value"));<a name="line.2233"></a>
-<span class="sourceLineNo">2234</span>    region.put(put);<a name="line.2234"></a>
-<span class="sourceLineNo">2235</span><a name="line.2235"></a>
-<span class="sourceLineNo">2236</span>    // now delete something in the present<a name="line.2236"></a>
-<span class="sourceLineNo">2237</span>    Delete delete = new Delete(row);<a name="line.2237"></a>
-<span class="sourceLineNo">2238</span>    region.delete(delete);<a name="line.2238"></a>
-<span class="sourceLineNo">2239</span><a name="line.2239"></a>
-<span class="sourceLineNo">2240</span>    // make sure we still see our data<a name="line.2240"></a>
-<span class="sourceLineNo">2241</span>    Get get = new Get(row).addColumn(fam, serverinfo);<a name="line.2241"></a>
-<span class="sourceLineNo">2242</span>    Result result = region.get(get);<a name="line.2242"></a>
-<span class="sourceLineNo">2243</span>    assertEquals(1, result.size());<a name="line.2243"></a>
-<span class="sourceLineNo">2244</span><a name="line.2244"></a>
-<span class="sourceLineNo">2245</span>    // delete the future row<a name="line.2245"></a>
-<span class="sourceLineNo">2246</span>    delete = new Delete(row, HConstants.LATEST_TIMESTAMP - 3);<a name="line.2246"></a>
-<span class="sourceLineNo">2247</span>    region.delete(delete);<a name="line.2247"></a>
-<span class="sourceLineNo">2248</span><a name="line.2248"></a>
-<span class="sourceLineNo">2249</span>    // make sure it is gone<a name="line.2249"></a>
-<span class="sourceLineNo">2250</span>    get = new Get(row).addColumn(fam, serverinfo);<a name="line.2250"></a>
-<span class="sourceLineNo">2251</span>    result = region.get(get);<a name="line.2251"></a>
-<span class="sourceLineNo">2252</span>    assertEquals(0, result.size());<a name="line.2252"></a>
-<span class="sourceLineNo">2253</span>  }<a name="line.2253"></a>
-<span class="sourceLineNo">2254</span><a name="line.2254"></a>
-<span class="sourceLineNo">2255</span>  /**<a name="line.2255"></a>
-<span class="sourceLineNo">2256</span>   * Tests that the special LATEST_TIMESTAMP option for puts gets replaced by<a name="line.2256"></a>
-<span class="sourceLineNo">2257</span>   * the actual timestamp<a name="line.2257"></a>
-<span class="sourceLineNo">2258</span>   */<a name="line.2258"></a>
-<span class="sourceLineNo">2259</span>  @Test<a name="line.2259"></a>
-<span class="sourceLineNo">2260</span>  public void testPutWithLatestTS() throws IOException {<a name="line.2260"></a>
-<span class="sourceLineNo">2261</span>    byte[] fam = Bytes.toBytes("info");<a name="line.2261"></a>
-<span class="sourceLineNo">2262</span>    byte[][] families = { fam };<a name="line.2262"></a>
-<span class="sourceLineNo">2263</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2263"></a>
-<span class="sourceLineNo">2264</span>    byte[] row = Bytes.toBytes("row1");<a name="line.2264"></a>
-<span class="sourceLineNo">2265</span>    // column names<a name="line.2265"></a>
-<span class="sourceLineNo">2266</span>    byte[] qual = Bytes.toBytes("qual");<a name="line.2266"></a>
-<span class="sourceLineNo">2267</span><a name="line.2267"></a>
-<span class="sourceLineNo">2268</span>    // add data with LATEST_TIMESTAMP, put without WAL<a name="line.2268"></a>
-<span class="sourceLineNo">2269</span>    Put put = new Put(row);<a name="line.2269"></a>
-<span class="sourceLineNo">2270</span>    put.addColumn(fam, qual, HConstants.LATEST_TIMESTAMP, Bytes.toBytes("value"));<a name="line.2270"></a>
-<span class="sourceLineNo">2271</span>    region.put(put);<a name="line.2271"></a>
-<span class="sourceLineNo">2272</span><a name="line.2272"></a>
-<span class="sourceLineNo">2273</span>    // Make sure it shows up with an actual timestamp<a name="line.2273"></a>
-<span class="sourceLineNo">2274</span>    Get get = new Get(row).addColumn(fam, qual);<a name="line.2274"></a>
-<span class="sourceLineNo">2275</span>    Result result = region.get(get);<a name="line.2275"></a>
-<span class="sourceLineNo">2276</span>    assertEquals(1, result.size());<a name="line.2276"></a>
-<span class="sourceLineNo">2277</span>    Cell kv = result.rawCells()[0];<a name="line.2277"></a>
-<span class="sourceLineNo">2278</span>    LOG.info("Got: " + kv);<a name="line.2278"></a>
-<span class="sourceLineNo">2279</span>    assertTrue("LATEST_TIMESTAMP was not replaced with real timestamp",<a name="line.2279"></a>
-<span class="sourceLineNo">2280</span>        kv.getTimestamp() != HConstants.LATEST_TIMESTAMP);<a name="line.2280"></a>
-<span class="sourceLineNo">2281</span><a name="line.2281"></a>
-<span class="sourceLineNo">2282</span>    // Check same with WAL enabled (historically these took different<a name="line.2282"></a>
-<span class="sourceLineNo">2283</span>    // code paths, so check both)<a name="line.2283"></a>
-<span class="sourceLineNo">2284</span>    row = Bytes.toBytes("row2");<a name="line.2284"></a>
-<span class="sourceLineNo">2285</span>    put = new Put(row);<a name="line.2285"></a>
-<span class="sourceLineNo">2286</span>    put.addColumn(fam, qual, HConstants.LATEST_TIMESTAMP, Bytes.toBytes("value"));<a name="line.2286"></a>
-<span class="sourceLineNo">2287</span>    region.put(put);<a name="line.2287"></a>
-<span class="sourceLineNo">2288</span><a name="line.2288"></a>
-<span class="sourceLineNo">2289</span>    // Make sure it shows up with an actual timestamp<a name="line.2289"></a>
-<span class="sourceLineNo">2290</span>    get = new Get(row).addColumn(fam, qual);<a name="line.2290"></a>
-<span class="sourceLineNo">2291</span>    result = region.get(get);<a name="line.2291"></a>
-<span class="sourceLineNo">2292</span>    assertEquals(1, result.size());<a name="line.2292"></a>
-<span class="sourceLineNo">2293</span>    kv = result.rawCells()[0];<a name="line.2293"></a>
-<span class="sourceLineNo">2294</span>    LOG.info("Got: " + kv);<a name="line.2294"></a>
-<span class="sourceLineNo">2295</span>    assertTrue("LATEST_TIMESTAMP was not replaced with real timestamp",<a name="line.2295"></a>
-<span class="sourceLineNo">2296</span>        kv.getTimestamp() != HConstants.LATEST_TIMESTAMP);<a name="line.2296"></a>
-<span class="sourceLineNo">2297</span>  }<a name="line.2297"></a>
-<span class="sourceLineNo">2298</span><a name="line.2298"></a>
-<span class="sourceLineNo">2299</span>  /**<a name="line.2299"></a>
-<span class="sourceLineNo">2300</span>   * Tests that there is server-side filtering for invalid timestamp upper<a name="line.2300"></a>
-<span class="sourceLineNo">2301</span>   * bound. Note that the timestamp lower bound is automatically handled for us<a name="line.2301"></a>
-<span class="sourceLineNo">2302</span>   * by the TTL field.<a name="line.2302"></a>
-<span class="sourceLineNo">2303</span>   */<a name="line.2303"></a>
-<span class="sourceLineNo">2304</span>  @Test<a name="line.2304"></a>
-<span class="sourceLineNo">2305</span>  public void testPutWithTsSlop() throws IOException {<a name="line.2305"></a>
-<span class="sourceLineNo">2306</span>    byte[] fam = Bytes.toBytes("info");<a name="line.2306"></a>
-<span class="sourceLineNo">2307</span>    byte[][] families = { fam };<a name="line.2307"></a>
-<span class="sourceLineNo">2308</span><a name="line.2308"></a>
-<span class="sourceLineNo">2309</span>    // add data with a timestamp that is too recent for range. Ensure assert<a name="line.2309"></a>
-<span class="sourceLineNo">2310</span>    CONF.setInt("hbase.hregion.keyvalue.timestamp.slop.millisecs", 1000);<a name="line.2310"></a>
-<span class="sourceLineNo">2311</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2311"></a>
-<span class="sourceLineNo">2312</span>    boolean caughtExcep = false;<a name="line.2312"></a>
-<span class="sourceLineNo">2313</span>    try {<a name="line.2313"></a>
-<span class="sourceLineNo">2314</span>      // no TS specified == use latest. should not error<a name="line.2314"></a>
-<span class="sourceLineNo">2315</span>      region.put(new Put(row).addColumn(fam, Bytes.toBytes("qual"), Bytes.toBytes("value")));<a name="line.2315"></a>
-<span class="sourceLineNo">2316</span>      // TS out of range. should error<a name="line.2316"></a>
-<span class="sourceLineNo">2317</span>      region.put(new Put(row).addColumn(fam, Bytes.toBytes("qual"),<a name="line.2317"></a>
-<span class="sourceLineNo">2318</span>          System.currentTimeMillis() + 2000, Bytes.toBytes("value")));<a name="line.2318"></a>
-<span class="sourceLineNo">2319</span>      fail("Expected IOE for TS out of configured timerange");<a name="line.2319"></a>
-<span class="sourceLineNo">2320</span>    } catch (FailedSanityCheckException ioe) {<a name="line.2320"></a>
-<span class="sourceLineNo">2321</span>      LOG.debug("Received expected exception", ioe);<a name="line.2321"></a>
-<span class="sourceLineNo">2322</span>      caughtExcep = true;<a name="line.2322"></a>
-<span class="sourceLineNo">2323</span>    }<a name="line.2323"></a>
-<span class="sourceLineNo">2324</span>    assertTrue("Should catch FailedSanityCheckException", caughtExcep);<a name="line.2324"></a>
-<span class="sourceLineNo">2325</span>  }<a name="line.2325"></a>
-<span class="sourceLineNo">2326</span><a name="line.2326"></a>
-<span class="sourceLineNo">2327</span>  @Test<a name="line.2327"></a>
-<span class="sourceLineNo">2328</span>  public void testScanner_DeleteOneFamilyNotAnother() throws IOException {<a name="line.2328"></a>
-<span class="sourceLineNo">2329</span>    byte[] fam1 = Bytes.toBytes("columnA");<a name="line.2329"></a>
-<span class="sourceLineNo">2330</span>    byte[] fam2 = Bytes.toBytes("columnB");<a name="line.2330"></a>
-<span class="sourceLineNo">2331</span>    this.region = initHRegion(tableName, method, CONF, fam1, fam2);<a name="line.2331"></a>
-<span class="sourceLineNo">2332</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.2332"></a>
-<span class="sourceLineNo">2333</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.2333"></a>
-<span class="sourceLineNo">2334</span><a name="line.2334"></a>
-<span class="sourceLineNo">2335</span>    byte[] value = Bytes.toBytes("value");<a name="line.2335"></a>
-<span class="sourceLineNo">2336</span><a name="line.2336"></a>
-<span class="sourceLineNo">2337</span>    Delete delete = new Delete(rowA);<a name="line.2337"></a>
-<span class="sourceLineNo">2338</span>    delete.addFamily(fam1);<a name="line.2338"></a>
-<span class="sourceLineNo">2339</span><a name="line.2339"></a>
-<span class="sourceLineNo">2340</span>    region.delete(delete);<a name="line.2340"></a>
-<span class="sourceLineNo">2341</span><a name="line.2341"></a>
-<span class="sourceLineNo">2342</span>    // now create data.<a name="line.2342"></a>
-<span class="sourceLineNo">2343</span>    Put put = new Put(rowA);<a name="line.2343"></a>
-<span class="sourceLineNo">2344</span>    put.addColumn(fam2, null, value);<a name="line.2344"></a>
-<span class="sourceLineNo">2345</span>    region.put(put);<a name="line.2345"></a>
-<span class="sourceLineNo">2346</span><a name="line.2346"></a>
-<span class="sourceLineNo">2347</span>    put = new Put(rowB);<a name="line.2347"></a>
-<span class="sourceLineNo">2348</span>    put.addColumn(fam1, null, value);<a name="line.2348"></a>
-<span class="sourceLineNo">2349</span>    put.addColumn(fam2, null, value);<a name="line.2349"></a>
-<span class="sourceLineNo">2350</span>    region.put(put);<a name="line.2350"></a>
-<span class="sourceLineNo">2351</span><a name="line.2351"></a>
-<span class="sourceLineNo">2352</span>    Scan scan = new Scan();<a name="line.2352"></a>
-<span class="sourceLineNo">2353</span>    scan.addFamily(fam1).addFamily(fam2);<a name="line.2353"></a>
-<span class="sourceLineNo">2354</span>    InternalScanner s = region.getScanner(scan);<a name="line.2354"></a>
-<span class="sourceLineNo">2355</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.2355"></a>
-<span class="sourceLineNo">2356</span>    s.next(results);<a name="line.2356"></a>
-<span class="sourceLineNo">2357</span>    assertTrue(CellUtil.matchingRows(results.get(0), rowA));<a name="line.2357"></a>
-<span class="sourceLineNo">2358</span><a name="line.2358"></a>
-<span class="sourceLineNo">2359</span>    results.clear();<a name="line.2359"></a>
-<span class="sourceLineNo">2360</span>    s.next(results);<a name="line.2360"></a>
-<span class="sourceLineNo">2361</span>    assertTrue(CellUtil.matchingRows(results.get(0), rowB));<a name="line.2361"></a>
-<span class="sourceLineNo">2362</span>  }<a name="line.2362"></a>
-<span class="sourceLineNo">2363</span><a name="line.2363"></a>
-<span class="sourceLineNo">2364</span>  @Test<a name="line.2364"></a>
-<span class="sourceLineNo">2365</span>  public void testDataInMemoryWithoutWAL() throws IOException {<a name="line.2365"></a>
-<span class="sourceLineNo">2366</span>    FileSystem fs = FileSystem.get(CONF);<a name="line.2366"></a>
-<span class="sourceLineNo">2367</span>    Path rootDir = new Path(dir + "testDataInMemoryWithoutWAL");<a name="line.2367"></a>
-<span class="sourceLineNo">2368</span>    FSHLog hLog = new FSHLog(fs, rootDir, "testDataInMemoryWithoutWAL", CONF);<a name="line.2368"></a>
-<span class="sourceLineNo">2369</span>    hLog.init();<a name="line.2369"></a>
-<span class="sourceLineNo">2370</span>    // This chunk creation is done throughout the code base. Do we want to move it into core?<a name="line.2370"></a>
-<span class="sourceLineNo">2371</span>    // It is missing from this test. W/o it we NPE.<a name="line.2371"></a>
-<span class="sourceLineNo">2372</span>    ChunkCreator.initialize(MemStoreLABImpl.CHUNK_SIZE_DEFAULT, false, 0, 0, 0, null);<a name="line.2372"></a>
-<span class="sourceLineNo">2373</span>    region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, hLog,<a name="line.2373"></a>
-<span class="sourceLineNo">2374</span>        COLUMN_FAMILY_BYTES);<a name="line.2374"></a>
-<span class="sourceLineNo">2375</span><a name="line.2375"></a>
-<span class="sourceLineNo">2376</span>    Cell originalCell = CellUtil.createCell(row, COLUMN_FAMILY_BYTES, qual1,<a name="line.2376"></a>
-<span class="sourceLineNo">2377</span>      System.currentTimeMillis(), KeyValue.Type.Put.getCode(), value1);<a name="line.2377"></a>
-<span class="sourceLineNo">2378</span>    final long originalSize = originalCell.getSerializedSize();<a name="line.2378"></a>
-<span class="sourceLineNo">2379</span><a name="line.2379"></a>
-<span class="sourceLineNo">2380</span>    Cell addCell = CellUtil.createCell(row, COLUMN_FAMILY_BYTES, qual1,<a name="line.2380"></a>
-<span class="sourceLineNo">2381</span>      System.currentTimeMillis(), KeyValue.Type.Put.getCode(), Bytes.toBytes("xxxxxxxxxx"));<a name="line.2381"></a>
-<span class="sourceLineNo">2382</span>    final long addSize = addCell.getSerializedSize();<a name="line.2382"></a>
-<span class="sourceLineNo">2383</span><a name="line.2383"></a>
-<span class="sourceLineNo">2384</span>    LOG.info("originalSize:" + originalSize<a name="line.2384"></a>
-<span class="sourceLineNo">2385</span>      + ", addSize:" + addSize);<a name="line.2385"></a>
-<span class="sourceLineNo">2386</span>    // start test. We expect that the addPut's durability will be replaced<a name="line.2386"></a>
-<span class="sourceLineNo">2387</span>    // by originalPut's durability.<a name="line.2387"></a>
-<span class="sourceLineNo">2388</span><a name="line.2388"></a>
-<span class="sourceLineNo">2389</span>    // case 1:<a name="line.2389"></a>
-<span class="sourceLineNo">2390</span>    testDataInMemoryWithoutWAL(region,<a name="line.2390"></a>
-<span class="sourceLineNo">2391</span>            new Put(row).add(originalCell).setDurability(Durability.SKIP_WAL),<a name="line.2391"></a>
-<span class="sourceLineNo">2392</span>            new Put(row).add(addCell).setDurability(Durability.SKIP_WAL),<a name="line.2392"></a>
-<span class="sourceLineNo">2393</span>            originalSize + addSize);<a name="line.2393"></a>
-<span class="sourceLineNo">2394</span><a name="line.2394"></a>
-<span class="sourceLineNo">2395</span>    // case 2:<a name="line.2395"></a>
-<span class="sourceLineNo">2396</span>    testDataInMemoryWithoutWAL(region,<a name="line.2396"></a>
-<span class="sourceLineNo">2397</span>            new Put(row).add(originalCell).setDurability(Durability.SKIP_WAL),<a name="line.2397"></a>
-<span class="sourceLineNo">2398</span>            new Put(row).add(addCell).setDurability(Durability.SYNC_WAL),<a name="line.2398"></a>
-<span class="sourceLineNo">2399</span>            originalSize + addSize);<a name="line.2399"></a>
-<span class="sourceLineNo">2400</span><a name="line.2400"></a>
-<span class="sourceLineNo">2401</span>    // case 3:<a name="line.2401"></a>
-<span class="sourceLineNo">2402</span>    testDataInMemoryWithoutWAL(region,<a name="line.2402"></a>
-<span class="sourceLineNo">2403</span>            new Put(row).add(originalCell).setDurability(Durability.SYNC_WAL),<a name="line.2403"></a>
-<span class="sourceLineNo">2404</span>            new Put(row).add(addCell).setDurability(Durability.SKIP_WAL),<a name="line.2404"></a>
-<span class="sourceLineNo">2405</span>            0);<a name="line.2405"></a>
-<span class="sourceLineNo">2406</span><a name="line.2406"></a>
-<span class="sourceLineNo">2407</span>    // case 4:<a name="line.2407"></a>
-<span class="sourceLineNo">2408</span>    testDataInMemoryWithoutWAL(region,<a name="line.2408"></a>
-<span class="sourceLineNo">2409</span>            new Put(row).add(originalCell).setDurability(Durability.SYNC_WAL),<a name="line.2409"></a>
-<span class="sourceLineNo">2410</span>            new Put(row).add(addCell).setDurability(Durability.SYNC_WAL),<a name="line.2410"></a>
-<span class="sourceLineNo">2411</span>            0);<a name="line.2411"></a>
-<span class="sourceLineNo">2412</span>  }<a name="line.2412"></a>
-<span class="sourceLineNo">2413</span><a name="line.2413"></a>
-<span class="sourceLineNo">2414</span>  private static void testDataInMemoryWithoutWAL(HRegion region, Put originalPut,<a name="line.2414"></a>
-<span class="sourceLineNo">2415</span>          final Put addPut, long delta) throws IOException {<a name="line.2415"></a>
-<span class="sourceLineNo">2416</span>    final long initSize = region.getDataInMemoryWithoutWAL();<a name="line.2416"></a>
-<span class="sourceLineNo">2417</span>    // save normalCPHost and replaced by mockedCPHost<a name="line.2417"></a>
-<span class="sourceLineNo">2418</span>    RegionCoprocessorHost normalCPHost = region.getCoprocessorHost();<a name="line.2418"></a>
-<span class="sourceLineNo">2419</span>    RegionCoprocessorHost mockedCPHost = Mockito.mock(RegionCoprocessorHost.class);<a name="line.2419"></a>
-<span class="sourceLineNo">2420</span>    // Because the preBatchMutate returns void, we can't do usual Mockito when...then form. Must<a name="line.2420"></a>
-<span class="sourceLineNo">2421</span>    // do below format (from Mockito doc).<a name="line.2421"></a>
-<span class="sourceLineNo">2422</span>    Mockito.doAnswer(new Answer&lt;Void&gt;() {<a name="line.2422"></a>
-<span class="sourceLineNo">2423</span>      @Override<a name="line.2423"></a>
-<span class="sourceLineNo">2424</span>      public Void answer(InvocationOnMock invocation) throws Throwable {<a name="line.2424"></a>
-<span class="sourceLineNo">2425</span>        MiniBatchOperationInProgress&lt;Mutation&gt; mb = invocation.getArgument(0);<a name="line.2425"></a>
-<span class="sourceLineNo">2426</span>        mb.addOperationsFromCP(0, new Mutation[]{addPut});<a name="line.2426"></a>
-<span class="sourceLineNo">2427</span>        return null;<a name="line.2427"></a>
-<span class="sourceLineNo">2428</span>      }<a name="line.2428"></a>
-<span class="sourceLineNo">2429</span>    }).when(mockedCPHost).preBatchMutate(Mockito.isA(MiniBatchOperationInProgress.class));<a name="line.2429"></a>
-<span class="sourceLineNo">2430</span>    region.setCoprocessorHost(mockedCPHost);<a name="line.2430"></a>
-<span class="sourceLineNo">2431</span>    region.put(originalPut);<a name="line.2431"></a>
-<span class="sourceLineNo">2432</span>    region.setCoprocessorHost(normalCPHost);<a name="line.2432"></a>
-<span class="sourceLineNo">2433</span>    final long finalSize = region.getDataInMemoryWithoutWAL();<a name="line.2433"></a>
-<span class="sourceLineNo">2434</span>    assertEquals("finalSize:" + finalSize + ", initSize:"<a name="line.2434"></a>
-<span class="sourceLineNo">2435</span>      + initSize + ", delta:" + delta,finalSize, initSize + delta);<a name="line.2435"></a>
-<span class="sourceLineNo">2436</span>  }<a name="line.2436"></a>
-<span class="sourceLineNo">2437</span><a name="line.2437"></a>
-<span class="sourceLineNo">2438</span>  @Test<a name="line.2438"></a>
-<span class="sourceLineNo">2439</span>  public void testDeleteColumns_PostInsert() throws IOException, InterruptedException {<a name="line.2439"></a>
-<span class="sourceLineNo">2440</span>    Delete delete = new Delete(row);<a name="line.2440"></a>
-<span class="sourceLineNo">2441</span>    delete.addColumns(fam1, qual1);<a name="line.2441"></a>
-<span class="sourceLineNo">2442</span>    doTestDelete_AndPostInsert(delete);<a name="line.2442"></a>
-<span class="sourceLineNo">2443</span>  }<a name="line.2443"></a>
-<span class="sourceLineNo">2444</span><a name="line.2444"></a>
-<span class="sourceLineNo">2445</span>  @Test<a name="line.2445"></a>
-<span class="sourceLineNo">2446</span>  public void testaddFamily_PostInsert() throws IOException, InterruptedException {<a name="line.2446"></a>
-<span class="sourceLineNo">2447</span>    Delete delete = new Delete(row);<a name="line.2447"></a>
-<span class="sourceLineNo">2448</span>    delete.addFamily(fam1);<a name="line.2448"></a>
-<span class="sourceLineNo">2449</span>    doTestDelete_AndPostInsert(delete);<a name="line.2449"></a>
-<span class="sourceLineNo">2450</span>  }<a name="line.2450"></a>
-<span class="sourceLineNo">2451</span><a name="line.2451"></a>
-<span class="sourceLineNo">2452</span>  public void doTestDelete_AndPostInsert(Delete delete) throws IOException, InterruptedException {<a name="line.2452"></a>
-<span class="sourceLineNo">2453</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2453"></a>
-<span class="sourceLineNo">2454</span>    EnvironmentEdgeManagerTestHelper.injectEdge(new IncrementingEnvironmentEdge());<a name="line.2454"></a>
-<span class="sourceLineNo">2455</span>    Put put = new Put(row);<a name="line.2455"></a>
-<span class="sourceLineNo">2456</span>    put.addColumn(fam1, qual1, value1);<a name="line.2456"></a>
-<span class="sourceLineNo">2457</span>    region.put(put);<a name="line.2457"></a>
-<span class="sourceLineNo">2458</span><a name="line.2458"></a>
-<span class="sourceLineNo">2459</span>    // now delete the value:<a name="line.2459"></a>
-<span class="sourceLineNo">2460</span>    region.delete(delete);<a name="line.2460"></a>
+<span class="sourceLineNo">2120</span>    delete.addColumn(fam1, qual);<a name="line.2120"></a>
+<span class="sourceLineNo">2121</span>    region.delete(delete);<a name="line.2121"></a>
+<span class="sourceLineNo">2122</span><a name="line.2122"></a>
+<span class="sourceLineNo">2123</span>    Get get = new Get(row1);<a name="line.2123"></a>
+<span class="sourceLineNo">2124</span>    get.addFamily(fam1);<a name="line.2124"></a>
+<span class="sourceLineNo">2125</span>    Result r = region.get(get);<a name="line.2125"></a>
+<span class="sourceLineNo">2126</span>    assertEquals(0, r.size());<a name="line.2126"></a>
+<span class="sourceLineNo">2127</span>  }<a name="line.2127"></a>
+<span class="sourceLineNo">2128</span><a name="line.2128"></a>
+<span class="sourceLineNo">2129</span>  @Test<a name="line.2129"></a>
+<span class="sourceLineNo">2130</span>  public void testDelete_CheckFamily() throws IOException {<a name="line.2130"></a>
+<span class="sourceLineNo">2131</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2131"></a>
+<span class="sourceLineNo">2132</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2132"></a>
+<span class="sourceLineNo">2133</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2133"></a>
+<span class="sourceLineNo">2134</span>    byte[] fam3 = Bytes.toBytes("fam3");<a name="line.2134"></a>
+<span class="sourceLineNo">2135</span>    byte[] fam4 = Bytes.toBytes("fam4");<a name="line.2135"></a>
+<span class="sourceLineNo">2136</span><a name="line.2136"></a>
+<span class="sourceLineNo">2137</span>    // Setting up region<a name="line.2137"></a>
+<span class="sourceLineNo">2138</span>    this.region = initHRegion(tableName, method, CONF, fam1, fam2, fam3);<a name="line.2138"></a>
+<span class="sourceLineNo">2139</span>    List&lt;Cell&gt; kvs = new ArrayList&lt;&gt;();<a name="line.2139"></a>
+<span class="sourceLineNo">2140</span>    kvs.add(new KeyValue(row1, fam4, null, null));<a name="line.2140"></a>
+<span class="sourceLineNo">2141</span><a name="line.2141"></a>
+<span class="sourceLineNo">2142</span>    // testing existing family<a name="line.2142"></a>
+<span class="sourceLineNo">2143</span>    byte[] family = fam2;<a name="line.2143"></a>
+<span class="sourceLineNo">2144</span>    NavigableMap&lt;byte[], List&lt;Cell&gt;&gt; deleteMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2144"></a>
+<span class="sourceLineNo">2145</span>    deleteMap.put(family, kvs);<a name="line.2145"></a>
+<span class="sourceLineNo">2146</span>    region.delete(deleteMap, Durability.SYNC_WAL);<a name="line.2146"></a>
+<span class="sourceLineNo">2147</span><a name="line.2147"></a>
+<span class="sourceLineNo">2148</span>    // testing non existing family<a name="line.2148"></a>
+<span class="sourceLineNo">2149</span>    boolean ok = false;<a name="line.2149"></a>
+<span class="sourceLineNo">2150</span>    family = fam4;<a name="line.2150"></a>
+<span class="sourceLineNo">2151</span>    try {<a name="line.2151"></a>
+<span class="sourceLineNo">2152</span>      deleteMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2152"></a>
+<span class="sourceLineNo">2153</span>      deleteMap.put(family, kvs);<a name="line.2153"></a>
+<span class="sourceLineNo">2154</span>      region.delete(deleteMap, Durability.SYNC_WAL);<a name="line.2154"></a>
+<span class="sourceLineNo">2155</span>    } catch (Exception e) {<a name="line.2155"></a>
+<span class="sourceLineNo">2156</span>      ok = true;<a name="line.2156"></a>
+<span class="sourceLineNo">2157</span>    }<a name="line.2157"></a>
+<span class="sourceLineNo">2158</span>    assertTrue("Family " + new String(family, StandardCharsets.UTF_8) + " does exist", ok);<a name="line.2158"></a>
+<span class="sourceLineNo">2159</span>  }<a name="line.2159"></a>
+<span class="sourceLineNo">2160</span><a name="line.2160"></a>
+<span class="sourceLineNo">2161</span>  @Test<a name="line.2161"></a>
+<span class="sourceLineNo">2162</span>  public void testDelete_mixed() throws IOException, InterruptedException {<a name="line.2162"></a>
+<span class="sourceLineNo">2163</span>    byte[] fam = Bytes.toBytes("info");<a name="line.2163"></a>
+<span class="sourceLineNo">2164</span>    byte[][] families = { fam };<a name="line.2164"></a>
+<span class="sourceLineNo">2165</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2165"></a>
+<span class="sourceLineNo">2166</span>    EnvironmentEdgeManagerTestHelper.injectEdge(new IncrementingEnvironmentEdge());<a name="line.2166"></a>
+<span class="sourceLineNo">2167</span><a name="line.2167"></a>
+<span class="sourceLineNo">2168</span>    byte[] row = Bytes.toBytes("table_name");<a name="line.2168"></a>
+<span class="sourceLineNo">2169</span>    // column names<a name="line.2169"></a>
+<span class="sourceLineNo">2170</span>    byte[] serverinfo = Bytes.toBytes("serverinfo");<a name="line.2170"></a>
+<span class="sourceLineNo">2171</span>    byte[] splitA = Bytes.toBytes("splitA");<a name="line.2171"></a>
+<span class="sourceLineNo">2172</span>    byte[] splitB = Bytes.toBytes("splitB");<a name="line.2172"></a>
+<span class="sourceLineNo">2173</span><a name="line.2173"></a>
+<span class="sourceLineNo">2174</span>    // add some data:<a name="line.2174"></a>
+<span class="sourceLineNo">2175</span>    Put put = new Put(row);<a name="line.2175"></a>
+<span class="sourceLineNo">2176</span>    put.addColumn(fam, splitA, Bytes.toBytes("reference_A"));<a name="line.2176"></a>
+<span class="sourceLineNo">2177</span>    region.put(put);<a name="line.2177"></a>
+<span class="sourceLineNo">2178</span><a name="line.2178"></a>
+<span class="sourceLineNo">2179</span>    put = new Put(row);<a name="line.2179"></a>
+<span class="sourceLineNo">2180</span>    put.addColumn(fam, splitB, Bytes.toBytes("reference_B"));<a name="line.2180"></a>
+<span class="sourceLineNo">2181</span>    region.put(put);<a name="line.2181"></a>
+<span class="sourceLineNo">2182</span><a name="line.2182"></a>
+<span class="sourceLineNo">2183</span>    put = new Put(row);<a name="line.2183"></a>
+<span class="sourceLineNo">2184</span>    put.addColumn(fam, serverinfo, Bytes.toBytes("ip_address"));<a name="line.2184"></a>
+<span class="sourceLineNo">2185</span>    region.put(put);<a name="line.2185"></a>
+<span class="sourceLineNo">2186</span><a name="line.2186"></a>
+<span class="sourceLineNo">2187</span>    // ok now delete a split:<a name="line.2187"></a>
+<span class="sourceLineNo">2188</span>    Delete delete = new Delete(row);<a name="line.2188"></a>
+<span class="sourceLineNo">2189</span>    delete.addColumns(fam, splitA);<a name="line.2189"></a>
+<span class="sourceLineNo">2190</span>    region.delete(delete);<a name="line.2190"></a>
+<span class="sourceLineNo">2191</span><a name="line.2191"></a>
+<span class="sourceLineNo">2192</span>    // assert some things:<a name="line.2192"></a>
+<span class="sourceLineNo">2193</span>    Get get = new Get(row).addColumn(fam, serverinfo);<a name="line.2193"></a>
+<span class="sourceLineNo">2194</span>    Result result = region.get(get);<a name="line.2194"></a>
+<span class="sourceLineNo">2195</span>    assertEquals(1, result.size());<a name="line.2195"></a>
+<span class="sourceLineNo">2196</span><a name="line.2196"></a>
+<span class="sourceLineNo">2197</span>    get = new Get(row).addColumn(fam, splitA);<a name="line.2197"></a>
+<span class="sourceLineNo">2198</span>    result = region.get(get);<a name="line.2198"></a>
+<span class="sourceLineNo">2199</span>    assertEquals(0, result.size());<a name="line.2199"></a>
+<span class="sourceLineNo">2200</span><a name="line.2200"></a>
+<span class="sourceLineNo">2201</span>    get = new Get(row).addColumn(fam, splitB);<a name="line.2201"></a>
+<span class="sourceLineNo">2202</span>    result = region.get(get);<a name="line.2202"></a>
+<span class="sourceLineNo">2203</span>    assertEquals(1, result.size());<a name="line.2203"></a>
+<span class="sourceLineNo">2204</span><a name="line.2204"></a>
+<span class="sourceLineNo">2205</span>    // Assert that after a delete, I can put.<a name="line.2205"></a>
+<span class="sourceLineNo">2206</span>    put = new Put(row);<a name="line.2206"></a>
+<span class="sourceLineNo">2207</span>    put.addColumn(fam, splitA, Bytes.toBytes("reference_A"));<a name="line.2207"></a>
+<span class="sourceLineNo">2208</span>    region.put(put);<a name="line.2208"></a>
+<span class="sourceLineNo">2209</span>    get = new Get(row);<a name="line.2209"></a>
+<span class="sourceLineNo">2210</span>    result = region.get(get);<a name="line.2210"></a>
+<span class="sourceLineNo">2211</span>    assertEquals(3, result.size());<a name="line.2211"></a>
+<span class="sourceLineNo">2212</span><a name="line.2212"></a>
+<span class="sourceLineNo">2213</span>    // Now delete all... then test I can add stuff back<a name="line.2213"></a>
+<span class="sourceLineNo">2214</span>    delete = new Delete(row);<a name="line.2214"></a>
+<span class="sourceLineNo">2215</span>    region.delete(delete);<a name="line.2215"></a>
+<span class="sourceLineNo">2216</span>    assertEquals(0, region.get(get).size());<a name="line.2216"></a>
+<span class="sourceLineNo">2217</span><a name="line.2217"></a>
+<span class="sourceLineNo">2218</span>    region.put(new Put(row).addColumn(fam, splitA, Bytes.toBytes("reference_A")));<a name="line.2218"></a>
+<span class="sourceLineNo">2219</span>    result = region.get(get);<a name="line.2219"></a>
+<span class="sourceLineNo">2220</span>    assertEquals(1, result.size());<a name="line.2220"></a>
+<span class="sourceLineNo">2221</span>  }<a name="line.2221"></a>
+<span class="sourceLineNo">2222</span><a name="line.2222"></a>
+<span class="sourceLineNo">2223</span>  @Test<a name="line.2223"></a>
+<span class="sourceLineNo">2224</span>  public void testDeleteRowWithFutureTs() throws IOException {<a name="line.2224"></a>
+<span class="sourceLineNo">2225</span>    byte[] fam = Bytes.toBytes("info");<a name="line.2225"></a>
+<span class="sourceLineNo">2226</span>    byte[][] families = { fam };<a name="line.2226"></a>
+<span class="sourceLineNo">2227</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2227"></a>
+<span class="sourceLineNo">2228</span>    byte[] row = Bytes.toBytes("table_name");<a name="line.2228"></a>
+<span class="sourceLineNo">2229</span>    // column names<a name="line.2229"></a>
+<span class="sourceLineNo">2230</span>    byte[] serverinfo = Bytes.toBytes("serverinfo");<a name="line.2230"></a>
+<span class="sourceLineNo">2231</span><a name="line.2231"></a>
+<span class="sourceLineNo">2232</span>    // add data in the far future<a name="line.2232"></a>
+<span class="sourceLineNo">2233</span>    Put put = new Put(row);<a name="line.2233"></a>
+<span class="sourceLineNo">2234</span>    put.addColumn(fam, serverinfo, HConstants.LATEST_TIMESTAMP - 5, Bytes.toBytes("value"));<a name="line.2234"></a>
+<span class="sourceLineNo">2235</span>    region.put(put);<a name="line.2235"></a>
+<span class="sourceLineNo">2236</span><a name="line.2236"></a>
+<span class="sourceLineNo">2237</span>    // now delete something in the present<a name="line.2237"></a>
+<span class="sourceLineNo">2238</span>    Delete delete = new Delete(row);<a name="line.2238"></a>
+<span class="sourceLineNo">2239</span>    region.delete(delete);<a name="line.2239"></a>
+<span class="sourceLineNo">2240</span><a name="line.2240"></a>
+<span class="sourceLineNo">2241</span>    // make sure we still see our data<a name="line.2241"></a>
+<span class="sourceLineNo">2242</span>    Get get = new Get(row).addColumn(fam, serverinfo);<a name="line.2242"></a>
+<span class="sourceLineNo">2243</span>    Result result = region.get(get);<a name="line.2243"></a>
+<span class="sourceLineNo">2244</span>    assertEquals(1, result.size());<a name="line.2244"></a>
+<span class="sourceLineNo">2245</span><a name="line.2245"></a>
+<span class="sourceLineNo">2246</span>    // delete the future row<a name="line.2246"></a>
+<span class="sourceLineNo">2247</span>    delete = new Delete(row, HConstants.LATEST_TIMESTAMP - 3);<a name="line.2247"></a>
+<span class="sourceLineNo">2248</span>    region.delete(delete);<a name="line.2248"></a>
+<span class="sourceLineNo">2249</span><a name="line.2249"></a>
+<span class="sourceLineNo">2250</span>    // make sure it is gone<a name="line.2250"></a>
+<span class="sourceLineNo">2251</span>    get = new Get(row).addColumn(fam, serverinfo);<a name="line.2251"></a>
+<span class="sourceLineNo">2252</span>    result = region.get(get);<a name="line.2252"></a>
+<span class="sourceLineNo">2253</span>    assertEquals(0, result.size());<a name="line.2253"></a>
+<span class="sourceLineNo">2254</span>  }<a name="line.2254"></a>
+<span class="sourceLineNo">2255</span><a name="line.2255"></a>
+<span class="sourceLineNo">2256</span>  /**<a name="line.2256"></a>
+<span class="sourceLineNo">2257</span>   * Tests that the special LATEST_TIMESTAMP option for puts gets replaced by<a name="line.2257"></a>
+<span class="sourceLineNo">2258</span>   * the actual timestamp<a name="line.2258"></a>
+<span class="sourceLineNo">2259</span>   */<a name="line.2259"></a>
+<span class="sourceLineNo">2260</span>  @Test<a name="line.2260"></a>
+<span class="sourceLineNo">2261</span>  public void testPutWithLatestTS() throws IOException {<a name="line.2261"></a>
+<span class="sourceLineNo">2262</span>    byte[] fam = Bytes.toBytes("info");<a name="line.2262"></a>
+<span class="sourceLineNo">2263</span>    byte[][] families = { fam };<a name="line.2263"></a>
+<span class="sourceLineNo">2264</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2264"></a>
+<span class="sourceLineNo">2265</span>    byte[] row = Bytes.toBytes("row1");<a name="line.2265"></a>
+<span class="sourceLineNo">2266</span>    // column names<a name="line.2266"></a>
+<span class="sourceLineNo">2267</span>    byte[] qual = Bytes.toBytes("qual");<a name="line.2267"></a>
+<span class="sourceLineNo">2268</span><a name="line.2268"></a>
+<span class="sourceLineNo">2269</span>    // add data with LATEST_TIMESTAMP, put without WAL<a name="line.2269"></a>
+<span class="sourceLineNo">2270</span>    Put put = new Put(row);<a name="line.2270"></a>
+<span class="sourceLineNo">2271</span>    put.addColumn(fam, qual, HConstants.LATEST_TIMESTAMP, Bytes.toBytes("value"));<a name="line.2271"></a>
+<span class="sourceLineNo">2272</span>    region.put(put);<a name="line.2272"></a>
+<span class="sourceLineNo">2273</span><a name="line.2273"></a>
+<span class="sourceLineNo">2274</span>    // Make sure it shows up with an actual timestamp<a name="line.2274"></a>
+<span class="sourceLineNo">2275</span>    Get get = new Get(row).addColumn(fam, qual);<a name="line.2275"></a>
+<span class="sourceLineNo">2276</span>    Result result = region.get(get);<a name="line.2276"></a>
+<span class="sourceLineNo">2277</span>    assertEquals(1, result.size());<a name="line.2277"></a>
+<span class="sourceLineNo">2278</span>    Cell kv = result.rawCells()[0];<a name="line.2278"></a>
+<span class="sourceLineNo">2279</span>    LOG.info("Got: " + kv);<a name="line.2279"></a>
+<span class="sourceLineNo">2280</span>    assertTrue("LATEST_TIMESTAMP was not replaced with real timestamp",<a name="line.2280"></a>
+<span class="sourceLineNo">2281</span>        kv.getTimestamp() != HConstants.LATEST_TIMESTAMP);<a name="line.2281"></a>
+<span class="sourceLineNo">2282</span><a name="line.2282"></a>
+<span class="sourceLineNo">2283</span>    // Check same with WAL enabled (historically these took different<a name="line.2283"></a>
+<span class="sourceLineNo">2284</span>    // code paths, so check both)<a name="line.2284"></a>
+<span class="sourceLineNo">2285</span>    row = Bytes.toBytes("row2");<a name="line.2285"></a>
+<span class="sourceLineNo">2286</span>    put = new Put(row);<a name="line.2286"></a>
+<span class="sourceLineNo">2287</span>    put.addColumn(fam, qual, HConstants.LATEST_TIMESTAMP, Bytes.toBytes("value"));<a name="line.2287"></a>
+<span class="sourceLineNo">2288</span>    region.put(put);<a name="line.2288"></a>
+<span class="sourceLineNo">2289</span><a name="line.2289"></a>
+<span class="sourceLineNo">2290</span>    // Make sure it shows up with an actual timestamp<a name="line.2290"></a>
+<span class="sourceLineNo">2291</span>    get = new Get(row).addColumn(fam, qual);<a name="line.2291"></a>
+<span class="sourceLineNo">2292</span>    result = region.get(get);<a name="line.2292"></a>
+<span class="sourceLineNo">2293</span>    assertEquals(1, result.size());<a name="line.2293"></a>
+<span class="sourceLineNo">2294</span>    kv = result.rawCells()[0];<a name="line.2294"></a>
+<span class="sourceLineNo">2295</span>    LOG.info("Got: " + kv);<a name="line.2295"></a>
+<span class="sourceLineNo">2296</span>    assertTrue("LATEST_TIMESTAMP was not replaced with real timestamp",<a name="line.2296"></a>
+<span class="sourceLineNo">2297</span>        kv.getTimestamp() != HConstants.LATEST_TIMESTAMP);<a name="line.2297"></a>
+<span class="sourceLineNo">2298</span>  }<a name="line.2298"></a>
+<span class="sourceLineNo">2299</span><a name="line.2299"></a>
+<span class="sourceLineNo">2300</span>  /**<a name="line.2300"></a>
+<span class="sourceLineNo">2301</span>   * Tests that there is server-side filtering for invalid timestamp upper<a name="line.2301"></a>
+<span class="sourceLineNo">2302</span>   * bound. Note that the timestamp lower bound is automatically handled for us<a name="line.2302"></a>
+<span class="sourceLineNo">2303</span>   * by the TTL field.<a name="line.2303"></a>
+<span class="sourceLineNo">2304</span>   */<a name="line.2304"></a>
+<span class="sourceLineNo">2305</span>  @Test<a name="line.2305"></a>
+<span class="sourceLineNo">2306</span>  public void testPutWithTsSlop() throws IOException {<a name="line.2306"></a>
+<span class="sourceLineNo">2307</span>    byte[] fam = Bytes.toBytes("info");<a name="line.2307"></a>
+<span class="sourceLineNo">2308</span>    byte[][] families = { fam };<a name="line.2308"></a>
+<span class="sourceLineNo">2309</span><a name="line.2309"></a>
+<span class="sourceLineNo">2310</span>    // add data with a timestamp that is too recent for range. Ensure assert<a name="line.2310"></a>
+<span class="sourceLineNo">2311</span>    CONF.setInt("hbase.hregion.keyvalue.timestamp.slop.millisecs", 1000);<a name="line.2311"></a>
+<span class="sourceLineNo">2312</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2312"></a>
+<span class="sourceLineNo">2313</span>    boolean caughtExcep = false;<a name="line.2313"></a>
+<span class="sourceLineNo">2314</span>    try {<a name="line.2314"></a>
+<span class="sourceLineNo">2315</span>      // no TS specified == use latest. should not error<a name="line.2315"></a>
+<span class="sourceLineNo">2316</span>      region.put(new Put(row).addColumn(fam, Bytes.toBytes("qual"), Bytes.toBytes("value")));<a name="line.2316"></a>
+<span class="sourceLineNo">2317</span>      // TS out of range. should error<a name="line.2317"></a>
+<span class="sourceLineNo">2318</span>      region.put(new Put(row).addColumn(fam, Bytes.toBytes("qual"),<a name="line.2318"></a>
+<span class="sourceLineNo">2319</span>          System.currentTimeMillis() + 2000, Bytes.toBytes("value")));<a name="line.2319"></a>
+<span class="sourceLineNo">2320</span>      fail("Expected IOE for TS out of configured timerange");<a name="line.2320"></a>
+<span class="sourceLineNo">2321</span>    } catch (FailedSanityCheckException ioe) {<a name="line.2321"></a>
+<span class="sourceLineNo">2322</span>      LOG.debug("Received expected exception", ioe);<a name="line.2322"></a>
+<span class="sourceLineNo">2323</span>      caughtExcep = true;<a name="line.2323"></a>
+<span class="sourceLineNo">2324</span>    }<a name="line.2324"></a>
+<span class="sourceLineNo">2325</span>    assertTrue("Should catch FailedSanityCheckException", caughtExcep);<a name="line.2325"></a>
+<span class="sourceLineNo">2326</span>  }<a name="line.2326"></a>
+<span class="sourceLineNo">2327</span><a name="line.2327"></a>
+<span class="sourceLineNo">2328</span>  @Test<a name="line.2328"></a>
+<span class="sourceLineNo">2329</span>  public void testScanner_DeleteOneFamilyNotAnother() throws IOException {<a name="line.2329"></a>
+<span class="sourceLineNo">2330</span>    byte[] fam1 = Bytes.toBytes("columnA");<a name="line.2330"></a>
+<span class="sourceLineNo">2331</span>    byte[] fam2 = Bytes.toBytes("columnB");<a name="line.2331"></a>
+<span class="sourceLineNo">2332</span>    this.region = initHRegion(tableName, method, CONF, fam1, fam2);<a name="line.2332"></a>
+<span class="sourceLineNo">2333</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.2333"></a>
+<span class="sourceLineNo">2334</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.2334"></a>
+<span class="sourceLineNo">2335</span><a name="line.2335"></a>
+<span class="sourceLineNo">2336</span>    byte[] value = Bytes.toBytes("value");<a name="line.2336"></a>
+<span class="sourceLineNo">2337</span><a name="line.2337"></a>
+<span class="sourceLineNo">2338</span>    Delete delete = new Delete(rowA);<a name="line.2338"></a>
+<span class="sourceLineNo">2339</span>    delete.addFamily(fam1);<a name="line.2339"></a>
+<span class="sourceLineNo">2340</span><a name="line.2340"></a>
+<span class="sourceLineNo">2341</span>    region.delete(delete);<a name="line.2341"></a>
+<span class="sourceLineNo">2342</span><a name="line.2342"></a>
+<span class="sourceLineNo">2343</span>    // now create data.<a name="line.2343"></a>
+<span class="sourceLineNo">2344</span>    Put put = new Put(rowA);<a name="line.2344"></a>
+<span class="sourceLineNo">2345</span>    put.addColumn(fam2, null, value);<a name="line.2345"></a>
+<span class="sourceLineNo">2346</span>    region.put(put);<a name="line.2346"></a>
+<span class="sourceLineNo">2347</span><a name="line.2347"></a>
+<span class="sourceLineNo">2348</span>    put = new Put(rowB);<a name="line.2348"></a>
+<span class="sourceLineNo">2349</span>    put.addColumn(fam1, null, value);<a name="line.2349"></a>
+<span class="sourceLineNo">2350</span>    put.addColumn(fam2, null, value);<a name="line.2350"></a>
+<span class="sourceLineNo">2351</span>    region.put(put);<a name="line.2351"></a>
+<span class="sourceLineNo">2352</span><a name="line.2352"></a>
+<span class="sourceLineNo">2353</span>    Scan scan = new Scan();<a name="line.2353"></a>
+<span class="sourceLineNo">2354</span>    scan.addFamily(fam1).addFamily(fam2);<a name="line.2354"></a>
+<span class="sourceLineNo">2355</span>    InternalScanner s = region.getScanner(scan);<a name="line.2355"></a>
+<span class="sourceLineNo">2356</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.2356"></a>
+<span class="sourceLineNo">2357</span>    s.next(results);<a name="line.2357"></a>
+<span class="sourceLineNo">2358</span>    assertTrue(CellUtil.matchingRows(results.get(0), rowA));<a name="line.2358"></a>
+<span class="sourceLineNo">2359</span><a name="line.2359"></a>
+<span class="sourceLineNo">2360</span>    results.clear();<a name="line.2360"></a>
+<span class="sourceLineNo">2361</span>    s.next(results);<a name="line.2361"></a>
+<span class="sourceLineNo">2362</span>    assertTrue(CellUtil.matchingRows(results.get(0), rowB));<a name="line.2362"></a>
+<span class="sourceLineNo">2363</span>  }<a name="line.2363"></a>
+<span class="sourceLineNo">2364</span><a name="line.2364"></a>
+<span class="sourceLineNo">2365</span>  @Test<a name="line.2365"></a>
+<span class="sourceLineNo">2366</span>  public void testDataInMemoryWithoutWAL() throws IOException {<a name="line.2366"></a>
+<span class="sourceLineNo">2367</span>    FileSystem fs = FileSystem.get(CONF);<a name="line.2367"></a>
+<span class="sourceLineNo">2368</span>    Path rootDir = new Path(dir + "testDataInMemoryWithoutWAL");<a name="line.2368"></a>
+<span class="sourceLineNo">2369</span>    FSHLog hLog = new FSHLog(fs, rootDir, "testDataInMemoryWithoutWAL", CONF);<a name="line.2369"></a>
+<span class="sourceLineNo">2370</span>    hLog.init();<a name="line.2370"></a>
+<span class="sourceLineNo">2371</span>    // This chunk creation is done throughout the code base. Do we want to move it into core?<a name="line.2371"></a>
+<span class="sourceLineNo">2372</span>    // It is missing from this test. W/o it we NPE.<a name="line.2372"></a>
+<span class="sourceLineNo">2373</span>    ChunkCreator.initialize(MemStoreLABImpl.CHUNK_SIZE_DEFAULT, false, 0, 0, 0, null);<a name="line.2373"></a>
+<span class="sourceLineNo">2374</span>    region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, hLog,<a name="line.2374"></a>
+<span class="sourceLineNo">2375</span>        COLUMN_FAMILY_BYTES);<a name="line.2375"></a>
+<span class="sourceLineNo">2376</span><a name="line.2376"></a>
+<span class="sourceLineNo">2377</span>    Cell originalCell = CellUtil.createCell(row, COLUMN_FAMILY_BYTES, qual1,<a name="line.2377"></a>
+<span class="sourceLineNo">2378</span>      System.currentTimeMillis(), KeyValue.Type.Put.getCode(), value1);<a name="line.2378"></a>
+<span class="sourceLineNo">2379</span>    final long originalSize = originalCell.getSerializedSize();<a name="line.2379"></a>
+<span class="sourceLineNo">2380</span><a name="line.2380"></a>
+<span class="sourceLineNo">2381</span>    Cell addCell = CellUtil.createCell(row, COLUMN_FAMILY_BYTES, qual1,<a name="line.2381"></a>
+<span class="sourceLineNo">2382</span>      System.currentTimeMillis(), KeyValue.Type.Put.getCode(), Bytes.toBytes("xxxxxxxxxx"));<a name="line.2382"></a>
+<span class="sourceLineNo">2383</span>    final long addSize = addCell.getSerializedSize();<a name="line.2383"></a>
+<span class="sourceLineNo">2384</span><a name="line.2384"></a>
+<span class="sourceLineNo">2385</span>    LOG.info("originalSize:" + originalSize<a name="line.2385"></a>
+<span class="sourceLineNo">2386</span>      + ", addSize:" + addSize);<a name="line.2386"></a>
+<span class="sourceLineNo">2387</span>    // start test. We expect that the addPut's durability will be replaced<a name="line.2387"></a>
+<span class="sourceLineNo">2388</span>    // by originalPut's durability.<a name="line.2388"></a>
+<span class="sourceLineNo">2389</span><a name="line.2389"></a>
+<span class="sourceLineNo">2390</span>    // case 1:<a name="line.2390"></a>
+<span class="sourceLineNo">2391</span>    testDataInMemoryWithoutWAL(region,<a name="line.2391"></a>
+<span class="sourceLineNo">2392</span>            new Put(row).add(originalCell).setDurability(Durability.SKIP_WAL),<a name="line.2392"></a>
+<span class="sourceLineNo">2393</span>            new Put(row).add(addCell).setDurability(Durability.SKIP_WAL),<a name="line.2393"></a>
+<span class="sourceLineNo">2394</span>            originalSize + addSize);<a name="line.2394"></a>
+<span class="sourceLineNo">2395</span><a name="line.2395"></a>
+<span class="sourceLineNo">2396</span>    // case 2:<a name="line.2396"></a>
+<span class="sourceLineNo">2397</span>    testDataInMemoryWithoutWAL(region,<a name="line.2397"></a>
+<span class="sourceLineNo">2398</span>            new Put(row).add(originalCell).setDurability(Durability.SKIP_WAL),<a name="line.2398"></a>
+<span class="sourceLineNo">2399</span>            new Put(row).add(addCell).setDurability(Durability.SYNC_WAL),<a name="line.2399"></a>
+<span class="sourceLineNo">2400</span>            originalSize + addSize);<a name="line.2400"></a>
+<span class="sourceLineNo">2401</span><a name="line.2401"></a>
+<span class="sourceLineNo">2402</span>    // case 3:<a name="line.2402"></a>
+<span class="sourceLineNo">2403</span>    testDataInMemoryWithoutWAL(region,<a name="line.2403"></a>
+<span class="sourceLineNo">2404</span>            new Put(row).add(originalCell).setDurability(Durability.SYNC_WAL),<a name="line.2404"></a>
+<span class="sourceLineNo">2405</span>            new Put(row).add(addCell).setDurability(Durability.SKIP_WAL),<a name="line.2405"></a>
+<span class="sourceLineNo">2406</span>            0);<a name="line.2406"></a>
+<span class="sourceLineNo">2407</span><a name="line.2407"></a>
+<span class="sourceLineNo">2408</span>    // case 4:<a name="line.2408"></a>
+<span class="sourceLineNo">2409</span>    testDataInMemoryWithoutWAL(region,<a name="line.2409"></a>
+<span class="sourceLineNo">2410</span>            new Put(row).add(originalCell).setDurability(Durability.SYNC_WAL),<a name="line.2410"></a>
+<span class="sourceLineNo">2411</span>            new Put(row).add(addCell).setDurability(Durability.SYNC_WAL),<a name="line.2411"></a>
+<span class="sourceLineNo">2412</span>            0);<a name="line.2412"></a>
+<span class="sourceLineNo">2413</span>  }<a name="line.2413"></a>
+<span class="sourceLineNo">2414</span><a name="line.2414"></a>
+<span class="sourceLineNo">2415</span>  private static void testDataInMemoryWithoutWAL(HRegion region, Put originalPut,<a name="line.2415"></a>
+<span class="sourceLineNo">2416</span>          final Put addPut, long delta) throws IOException {<a name="line.2416"></a>
+<span class="sourceLineNo">2417</span>    final long initSize = region.getDataInMemoryWithoutWAL();<a name="line.2417"></a>
+<span class="sourceLineNo">2418</span>    // save normalCPHost and replaced by mockedCPHost<a name="line.2418"></a>
+<span class="sourceLineNo">2419</span>    RegionCoprocessorHost normalCPHost = region.getCoprocessorHost();<a name="line.2419"></a>
+<span class="sourceLineNo">2420</span>    RegionCoprocessorHost mockedCPHost = Mockito.mock(RegionCoprocessorHost.class);<a name="line.2420"></a>
+<span class="sourceLineNo">2421</span>    // Because the preBatchMutate returns void, we can't do usual Mockito when...then form. Must<a name="line.2421"></a>
+<span class="sourceLineNo">2422</span>    // do below format (from Mockito doc).<a name="line.2422"></a>
+<span class="sourceLineNo">2423</span>    Mockito.doAnswer(new Answer&lt;Void&gt;() {<a name="line.2423"></a>
+<span class="sourceLineNo">2424</span>      @Override<a name="line.2424"></a>
+<span class="sourceLineNo">2425</span>      public Void answer(InvocationOnMock invocation) throws Throwable {<a name="line.2425"></a>
+<span class="sourceLineNo">2426</span>        MiniBatchOperationInProgress&lt;Mutation&gt; mb = invocation.getArgument(0);<a name="line.2426"></a>
+<span class="sourceLineNo">2427</span>        mb.addOperationsFromCP(0, new Mutation[]{addPut});<a name="line.2427"></a>
+<span class="sourceLineNo">2428</span>        return null;<a name="line.2428"></a>
+<span class="sourceLineNo">2429</span>      }<a name="line.2429"></a>
+<span class="sourceLineNo">2430</span>    }).when(mockedCPHost).preBatchMutate(Mockito.isA(MiniBatchOperationInProgress.class));<a name="line.2430"></a>
+<span class="sourceLineNo">2431</span>    ColumnFamilyDescriptorBuilder builder = ColumnFamilyDescriptorBuilder.<a name="line.2431"></a>
+<span class="sourceLineNo">2432</span>        newBuilder(COLUMN_FAMILY_BYTES);<a name="line.2432"></a>
+<span class="sourceLineNo">2433</span>    ScanInfo info = new ScanInfo(CONF, builder.build(), Long.MAX_VALUE,<a name="line.2433"></a>
+<span class="sourceLineNo">2434</span>        Long.MAX_VALUE, region.getCellComparator());<a name="line.2434"></a>
+<span class="sourceLineNo">2435</span>    Mockito.when(mockedCPHost.preFlushScannerOpen(Mockito.any(HStore.class),<a name="line.2435"></a>
+<span class="sourceLineNo">2436</span>        Mockito.any())).thenReturn(info);<a name="line.2436"></a>
+<span class="sourceLineNo">2437</span>    Mockito.when(mockedCPHost.preFlush(Mockito.any(), Mockito.any(StoreScanner.class),<a name="line.2437"></a>
+<span class="sourceLineNo">2438</span>        Mockito.any())).thenAnswer(i -&gt; i.getArgument(1));<a name="line.2438"></a>
+<span class="sourceLineNo">2439</span>    region.setCoprocessorHost(mockedCPHost);<a name="line.2439"></a>
+<span class="sourceLineNo">2440</span><a name="line.2440"></a>
+<span class="sourceLineNo">2441</span>    region.put(originalPut);<a name="line.2441"></a>
+<span class="sourceLineNo">2442</span>    region.setCoprocessorHost(normalCPHost);<a name="line.2442"></a>
+<span class="sourceLineNo">2443</span>    final long finalSize = region.getDataInMemoryWithoutWAL();<a name="line.2443"></a>
+<span class="sourceLineNo">2444</span>    assertEquals("finalSize:" + finalSize + ", initSize:"<a name="line.2444"></a>
+<span class="sourceLineNo">2445</span>      + initSize + ", delta:" + delta,finalSize, initSize + delta);<a name="line.2445"></a>
+<span class="sourceLineNo">2446</span>  }<a name="line.2446"></a>
+<span class="sourceLineNo">2447</span><a name="line.2447"></a>
+<span class="sourceLineNo">2448</span>  @Test<a name="line.2448"></a>
+<span class="sourceLineNo">2449</span>  public void testDeleteColumns_PostInsert() throws IOException, InterruptedException {<a name="line.2449"></a>
+<span class="sourceLineNo">2450</span>    Delete delete = new Delete(row);<a name="line.2450"></a>
+<span class="sourceLineNo">2451</span>    delete.addColumns(fam1, qual1);<a name="line.2451"></a>
+<span class="sourceLineNo">2452</span>    doTestDelete_AndPostInsert(delete);<a name="line.2452"></a>
+<span class="sourceLineNo">2453</span>  }<a name="line.2453"></a>
+<span class="sourceLineNo">2454</span><a name="line.2454"></a>
+<span class="sourceLineNo">2455</span>  @Test<a name="line.2455"></a>
+<span class="sourceLineNo">2456</span>  public void testaddFamily_PostInsert() throws IOException, InterruptedException {<a name="line.2456"></a>
+<span class="sourceLineNo">2457</span>    Delete delete = new Delete(row);<a name="line.2457"></a>
+<span class="sourceLineNo">2458</span>    delete.addFamily(fam1);<a name="line.2458"></a>
+<span class="sourceLineNo">2459</span>    doTestDelete_AndPostInsert(delete);<a name="line.2459"></a>
+<span class="sourceLineNo">2460</span>  }<a name="line.2460"></a>
 <span class="sourceLineNo">2461</span><a name="line.2461"></a>
-<span class="sourceLineNo">2462</span>    // ok put data:<a name="line.2462"></a>
-<span class="sourceLineNo">2463</span>    put = new Put(row);<a name="line.2463"></a>
-<span class="sourceLineNo">2464</span>    put.addColumn(fam1, qual1, value2);<a name="line.2464"></a>
-<span class="sourceLineNo">2465</span>    region.put(put);<a name="line.2465"></a>
-<span class="sourceLineNo">2466</span><a name="line.2466"></a>
-<span class="sourceLineNo">2467</span>    // ok get:<a name="line.2467"></a>
-<span class="sourceLineNo">2468</span>    Get get = new Get(row);<a name="line.2468"></a>
-<span class="sourceLineNo">2469</span>    get.addColumn(fam1, qual1);<a name="line.2469"></a>
-<span class="sourceLineNo">2470</span><a name="line.2470"></a>
-<span class="sourceLineNo">2471</span>    Result r = region.get(get);<a name="line.2471"></a>
-<span class="sourceLineNo">2472</span>    assertEquals(1, r.size());<a name="line.2472"></a>
-<span class="sourceLineNo">2473</span>    assertArrayEquals(value2, r.getValue(fam1, qual1));<a name="line.2473"></a>
-<span class="sourceLineNo">2474</span><a name="line.2474"></a>
-<span class="sourceLineNo">2475</span>    // next:<a name="line.2475"></a>
-<span class="sourceLineNo">2476</span>    Scan scan = new Scan(row);<a name="line.2476"></a>
-<span class="sourceLineNo">2477</span>    scan.addColumn(fam1, qual1);<a name="line.2477"></a>
-<span class="sourceLineNo">2478</span>    InternalScanner s = region.getScanner(scan);<a name="line.2478"></a>
-<span class="sourceLineNo">2479</span><a name="line.2479"></a>
-<span class="sourceLineNo">2480</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.2480"></a>
-<span class="sourceLineNo">2481</span>    assertEquals(false, s.next(results));<a name="line.2481"></a>
-<span class="sourceLineNo">2482</span>    assertEquals(1, results.size());<a name="line.2482"></a>
-<span class="sourceLineNo">2483</span>    Cell kv = results.get(0);<a name="line.2483"></a>
+<span class="sourceLineNo">2462</span>  public void doTestDelete_AndPostInsert(Delete delete) throws IOException, InterruptedException {<a name="line.2462"></a>
+<span class="sourceLineNo">2463</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2463"></a>
+<span class="sourceLineNo">2464</span>    EnvironmentEdgeManagerTestHelper.injectEdge(new IncrementingEnvironmentEdge());<a name="line.2464"></a>
+<span class="sourceLineNo">2465</span>    Put put = new Put(row);<a name="line.2465"></a>
+<span class="sourceLineNo">2466</span>    put.addColumn(fam1, qual1, value1);<a name="line.2466"></a>
+<span class="sourceLineNo">2467</span>    region.put(put);<a name="line.2467"></a>
+<span class="sourceLineNo">2468</span><a name="line.2468"></a>
+<span class="sourceLineNo">2469</span>    // now delete the value:<a name="line.2469"></a>
+<span class="sourceLineNo">2470</span>    region.delete(delete);<a name="line.2470"></a>
+<span class="sourceLineNo">2471</span><a name="line.2471"></a>
+<span class="sourceLineNo">2472</span>    // ok put data:<a name="line.2472"></a>
+<span class="sourceLineNo">2473</span>    put = new Put(row);<a name="line.2473"></a>
+<span class="sourceLineNo">2474</span>    put.addColumn(fam1, qual1, value2);<a name="line.2474"></a>
+<span class="sourceLineNo">2475</span>    region.put(put);<a name="line.2475"></a>
+<span class="sourceLineNo">2476</span><a name="line.2476"></a>
+<span class="sourceLineNo">2477</span>    // ok get:<a name="line.2477"></a>
+<span class="sourceLineNo">2478</span>    Get get = new Get(row);<a name="line.2478"></a>
+<span class="sourceLineNo">2479</span>    get.addColumn(fam1, qual1);<a name="line.2479"></a>
+<span class="sourceLineNo">2480</span><a name="line.2480"></a>
+<span class="sourceLineNo">2481</span>    Result r = region.get(get);<a name="line.2481"></a>
+<span class="sourceLineNo">2482</span>    assertEquals(1, r.size());<a name="line.2482"></a>
+<span class="sourceLineNo">2483</span>    assertArrayEquals(value2, r.getValue(fam1, qual1));<a name="line.2483"></a>
 <span class="sourceLineNo">2484</span><a name="line.2484"></a>
-<span class="sourceLineNo">2485</span>    assertArrayEquals(value2, CellUtil.cloneValue(kv));<a name="line.2485"></a>
-<span class="sourceLineNo">2486</span>    assertArrayEquals(fam1, CellUtil.cloneFamily(kv));<a name="line.2486"></a>
-<span class="sourceLineNo">2487</span>    assertArrayEquals(qual1, CellUtil.cloneQualifier(kv));<a name="line.2487"></a>
-<span class="sourceLineNo">2488</span>    assertArrayEquals(row, CellUtil.cloneRow(kv));<a name="line.2488"></a>
-<span class="sourceLineNo">2489</span>  }<a name="line.2489"></a>
-<span class="sourceLineNo">2490</span><a name="line.2490"></a>
-<span class="sourceLineNo">2491</span>  @Test<a name="line.2491"></a>
-<span class="sourceLineNo">2492</span>  public void testDelete_CheckTimestampUpdated() throws IOException {<a name="line.2492"></a>
-<span class="sourceLineNo">2493</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2493"></a>
-<span class="sourceLineNo">2494</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.2494"></a>
-<span class="sourceLineNo">2495</span>    byte[] col2 = Bytes.toBytes("col2");<a name="line.2495"></a>
-<span class="sourceLineNo">2496</span>    byte[] col3 = Bytes.toBytes("col3");<a name="line.2496"></a>
-<span class="sourceLineNo">2497</span><a name="line.2497"></a>
-<span class="sourceLineNo">2498</span>    // Setting up region<a name="line.2498"></a>
-<span class="sourceLineNo">2499</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2499"></a>
-<span class="sourceLineNo">2500</span>    // Building checkerList<a name="line.2500"></a>
-<span class="sourceLineNo">2501</span>    List&lt;Cell&gt; kvs = new ArrayList&lt;&gt;();<a name="line.2501"></a>
-<span class="sourceLineNo">2502</span>    kvs.add(new KeyValue(row1, fam1, col1, null));<a name="line.2502"></a>
-<span class="sourceLineNo">2503</span>    kvs.add(new KeyValue(row1, fam1, col2, null));<a name="line.2503"></a>
-<span class="sourceLineNo">2504</span>    kvs.add(new KeyValue(row1, fam1, col3, null));<a name="line.2504"></a>
-<span class="sourceLineNo">2505</span><a name="line.2505"></a>
-<span class="sourceLineNo">2506</span>    NavigableMap&lt;byte[], List&lt;Cell&gt;&gt; deleteMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2506"></a>
-<span class="sourceLineNo">2507</span>    deleteMap.put(fam1, kvs);<a name="line.2507"></a>
-<span class="sourceLineNo">2508</span>    region.delete(deleteMap, Durability.SYNC_WAL);<a name="line.2508"></a>
-<span class="sourceLineNo">2509</span><a name="line.2509"></a>
-<span class="sourceLineNo">2510</span>    // extract the key values out the memstore:<a name="line.2510"></a>
-<span class="sourceLineNo">2511</span>    // This is kinda hacky, but better than nothing...<a name="line.2511"></a>
-<span class="sourceLineNo">2512</span>    long now = System.currentTimeMillis();<a name="line.2512"></a>
-<span class="sourceLineNo">2513</span>    AbstractMemStore memstore = (AbstractMemStore)region.getStore(fam1).memstore;<a name="line.2513"></a>
-<span class="sourceLineNo">2514</span>    Cell firstCell = memstore.getActive().first();<a name="line.2514"></a>
-<span class="sourceLineNo">2515</span>    assertTrue(firstCell.getTimestamp() &lt;= now);<a name="line.2515"></a>
-<span class="sourceLineNo">2516</span>    now = firstCell.getTimestamp();<a name="line.2516"></a>
-<span class="sourceLineNo">2517</span>    for (Cell cell : memstore.getActive().getCellSet()) {<a name="line.2517"></a>
-<span class="sourceLineNo">2518</span>      assertTrue(cell.getTimestamp() &lt;= now);<a name="line.2518"></a>
-<span class="sourceLineNo">2519</span>      now = cell.getTimestamp();<a name="line.2519"></a>
-<span class="sourceLineNo">2520</span>    }<a name="line.2520"></a>
-<span class="sourceLineNo">2521</span>  }<a name="line.2521"></a>
-<span class="sourceLineNo">2522</span><a name="line.2522"></a>
-<span class="sourceLineNo">2523</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2523"></a>
-<span class="sourceLineNo">2524</span>  // Get tests<a name="line.2524"></a>
-<span class="sourceLineNo">2525</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2525"></a>
-<span class="sourceLineNo">2526</span>  @Test<a name="line.2526"></a>
-<span class="sourceLineNo">2527</span>  public void testGet_FamilyChecker() throws IOException {<a name="line.2527"></a>
-<span class="sourceLineNo">2528</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2528"></a>
-<span class="sourceLineNo">2529</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2529"></a>
-<span class="sourceLineNo">2530</span>    byte[] fam2 = Bytes.toBytes("False");<a name="line.2530"></a>
-<span class="sourceLineNo">2531</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.2531"></a>
+<span class="sourceLineNo">2485</span>    // next:<a name="line.2485"></a>
+<span class="sourceLineNo">2486</span>    Scan scan = new Scan(row);<a name="line.2486"></a>
+<span class="sourceLineNo">2487</span>    scan.addColumn(fam1, qual1);<a name="line.2487"></a>
+<span class="sourceLineNo">2488</span>    InternalScanner s = region.getScanner(scan);<a name="line.2488"></a>
+<span class="sourceLineNo">2489</span><a name="line.2489"></a>
+<span class="sourceLineNo">2490</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.2490"></a>
+<span class="sourceLineNo">2491</span>    assertEquals(false, s.next(results));<a name="line.2491"></a>
+<span class="sourceLineNo">2492</span>    assertEquals(1, results.size());<a name="line.2492"></a>
+<span class="sourceLineNo">2493</span>    Cell kv = results.get(0);<a name="line.2493"></a>
+<span class="sourceLineNo">2494</span><a name="line.2494"></a>
+<span class="sourceLineNo">2495</span>    assertArrayEquals(value2, CellUtil.cloneValue(kv));<a name="line.2495"></a>
+<span class="sourceLineNo">2496</span>    assertArrayEquals(fam1, CellUtil.cloneFamily(kv));<a name="line.2496"></a>
+<span class="sourceLineNo">2497</span>    assertArrayEquals(qual1, CellUtil.cloneQualifier(kv));<a name="line.2497"></a>
+<span class="sourceLineNo">2498</span>    assertArrayEquals(row, CellUtil.cloneRow(kv));<a name="line.2498"></a>
+<span class="sourceLineNo">2499</span>  }<a name="line.2499"></a>
+<span class="sourceLineNo">2500</span><a name="line.2500"></a>
+<span class="sourceLineNo">2501</span>  @Test<a name="line.2501"></a>
+<span class="sourceLineNo">2502</span>  public void testDelete_CheckTimestampUpdated() throws IOException {<a name="line.2502"></a>
+<span class="sourceLineNo">2503</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2503"></a>
+<span class="sourceLineNo">2504</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.2504"></a>
+<span class="sourceLineNo">2505</span>    byte[] col2 = Bytes.toBytes("col2");<a name="line.2505"></a>
+<span class="sourceLineNo">2506</span>    byte[] col3 = Bytes.toBytes("col3");<a name="line.2506"></a>
+<span class="sourceLineNo">2507</span><a name="line.2507"></a>
+<span class="sourceLineNo">2508</span>    // Setting up region<a name="line.2508"></a>
+<span class="sourceLineNo">2509</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2509"></a>
+<span class="sourceLineNo">2510</span>    // Building checkerList<a name="line.2510"></a>
+<span class="sourceLineNo">2511</span>    List&lt;Cell&gt; kvs = new ArrayList&lt;&gt;();<a name="line.2511"></a>
+<span class="sourceLineNo">2512</span>    kvs.add(new KeyValue(row1, fam1, col1, null));<a name="line.2512"></a>
+<span class="sourceLineNo">2513</span>    kvs.add(new KeyValue(row1, fam1, col2, null));<a name="line.2513"></a>
+<span class="sourceLineNo">2514</span>    kvs.add(new KeyValue(row1, fam1, col3, null));<a name="line.2514"></a>
+<span class="sourceLineNo">2515</span><a name="line.2515"></a>
+<span class="sourceLineNo">2516</span>    NavigableMap&lt;byte[], List&lt;Cell&gt;&gt; deleteMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2516"></a>
+<span class="sourceLineNo">2517</span>    deleteMap.put(fam1, kvs);<a name="line.2517"></a>
+<span class="sourceLineNo">2518</span>    region.delete(deleteMap, Durability.SYNC_WAL);<a name="line.2518"></a>
+<span class="sourceLineNo">2519</span><a name="line.2519"></a>
+<span class="sourceLineNo">2520</span>    // extract the key values out the memstore:<a name="line.2520"></a>
+<span class="sourceLineNo">2521</span>    // This is kinda hacky, but better than nothing...<a name="line.2521"></a>
+<span class="sourceLineNo">2522</span>    long now = System.currentTimeMillis();<a name="line.2522"></a>
+<span class="sourceLineNo">2523</span>    AbstractMemStore memstore = (AbstractMemStore)region.getStore(fam1).memstore;<a name="line.2523"></a>
+<span class="sourceLineNo">2524</span>    Cell firstCell = memstore.getActive().first();<a name="line.2524"></a>
+<span class="sourceLineNo">2525</span>    assertTrue(firstCell.getTimestamp() &lt;= now);<a name="line.2525"></a>
+<span class="sourceLineNo">2526</span>    now = firstCell.getTimestamp();<a name="line.2526"></a>
+<span class="sourceLineNo">2527</span>    for (Cell cell : memstore.getActive().getCellSet()) {<a name="line.2527"></a>
+<span class="sourceLineNo">2528</span>      assertTrue(cell.getTimestamp() &lt;= now);<a name="line.2528"></a>
+<span class="sourceLineNo">2529</span>      now = cell.getTimestamp();<a name="line.2529"></a>
+<span class="sourceLineNo">2530</span>    }<a name="line.2530"></a>
+<span class="sourceLineNo">2531</span>  }<a name="line.2531"></a>
 <span class="sourceLineNo">2532</span><a name="line.2532"></a>
-<span class="sourceLineNo">2533</span>    // Setting up region<a name="line.2533"></a>
-<span class="sourceLineNo">2534</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2534"></a>
-<span class="sourceLineNo">2535</span>    Get get = new Get(row1);<a name="line.2535"></a>
-<span class="sourceLineNo">2536</span>    get.addColumn(fam2, col1);<a name="line.2536"></a>
-<span class="sourceLineNo">2537</span><a name="line.2537"></a>
-<span class="sourceLineNo">2538</span>    // Test<a name="line.2538"></a>
-<span class="sourceLineNo">2539</span>    try {<a name="line.2539"></a>
-<span class="sourceLineNo">2540</span>      region.get(get);<a name="line.2540"></a>
-<span class="sourceLineNo">2541</span>      fail("Expecting DoNotRetryIOException in get but did not get any");<a name="line.2541"></a>
-<span class="sourceLineNo">2542</span>    } catch (org.apache.hadoop.hbase.DoNotRetryIOException e) {<a name="line.2542"></a>
-<span class="sourceLineNo">2543</span>      LOG.info("Got expected DoNotRetryIOException successfully");<a name="line.2543"></a>
-<span class="sourceLineNo">2544</span>    }<a name="line.2544"></a>
-<span class="sourceLineNo">2545</span>  }<a name="line.2545"></a>
-<span class="sourceLineNo">2546</span><a name="line.2546"></a>
-<span class="sourceLineNo">2547</span>  @Test<a name="line.2547"></a>
-<span class="sourceLineNo">2548</span>  public void testGet_Basic() throws IOException {<a name="line.2548"></a>
-<span class="sourceLineNo">2549</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2549"></a>
-<span class="sourceLineNo">2550</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2550"></a>
-<span class="sourceLineNo">2551</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.2551"></a>
-<span class="sourceLineNo">2552</span>    byte[] col2 = Bytes.toBytes("col2");<a name="line.2552"></a>
-<span class="sourceLineNo">2553</span>    byte[] col3 = Bytes.toBytes("col3");<a name="line.2553"></a>
-<span class="sourceLineNo">2554</span>    byte[] col4 = Bytes.toBytes("col4");<a name="line.2554"></a>
-<span class="sourceLineNo">2555</span>    byte[] col5 = Bytes.toBytes("col5");<a name="line.2555"></a>
+<span class="sourceLineNo">2533</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2533"></a>
+<span class="sourceLineNo">2534</span>  // Get tests<a name="line.2534"></a>
+<span class="sourceLineNo">2535</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2535"></a>
+<span class="sourceLineNo">2536</span>  @Test<a name="line.2536"></a>
+<span class="sourceLineNo">2537</span>  public void testGet_FamilyChecker() throws IOException {<a name="line.2537"></a>
+<span class="sourceLineNo">2538</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2538"></a>
+<span class="sourceLineNo">2539</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2539"></a>
+<span class="sourceLineNo">2540</span>    byte[] fam2 = Bytes.toBytes("False");<a name="line.2540"></a>
+<span class="sourceLineNo">2541</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.2541"></a>
+<span class="sourceLineNo">2542</span><a name="line.2542"></a>
+<span class="sourceLineNo">2543</span>    // Setting up region<a name="line.2543"></a>
+<span class="sourceLineNo">2544</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2544"></a>
+<span class="sourceLineNo">2545</span>    Get get = new Get(row1);<a name="line.2545"></a>
+<span class="sourceLineNo">2546</span>    get.addColumn(fam2, col1);<a name="line.2546"></a>
+<span class="sourceLineNo">2547</span><a name="line.2547"></a>
+<span class="sourceLineNo">2548</span>    // Test<a name="line.2548"></a>
+<span class="sourceLineNo">2549</span>    try {<a name="line.2549"></a>
+<span class="sourceLineNo">2550</span>      region.get(get);<a name="line.2550"></a>
+<span class="sourceLineNo">2551</span>      fail("Expecting DoNotRetryIOException in get but did not get any");<a name="line.2551"></a>
+<span class="sourceLineNo">2552</span>    } catch (org.apache.hadoop.hbase.DoNotRetryIOException e) {<a name="line.2552"></a>
+<span class="sourceLineNo">2553</span>      LOG.info("Got expected DoNotRetryIOException successfully");<a name="line.2553"></a>
+<span class="sourceLineNo">2554</span>    }<a name="line.2554"></a>
+<span class="sourceLineNo">2555</span>  }<a name="line.2555"></a>
 <span class="sourceLineNo">2556</span><a name="line.2556"></a>
-<span class="sourceLineNo">2557</span>    // Setting up region<a name="line.2557"></a>
-<span class="sourceLineNo">2558</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2558"></a>
-<span class="sourceLineNo">2559</span>    // Add to memstore<a name="line.2559"></a>
-<span class="sourceLineNo">2560</span>    Put put = new Put(row1);<a name="line.2560"></a>
-<span class="sourceLineNo">2561</span>    put.addColumn(fam1, col1, null);<a name="line.2561"></a>
-<span class="sourceLineNo">2562</span>    put.addColumn(fam1, col2, null);<a name="line.2562"></a>
-<span class="sourceLineNo">2563</span>    put.addColumn(fam1, col3, null);<a name="line.2563"></a>
-<span class="sourceLineNo">2564</span>    put.addColumn(fam1, col4, null);<a name="line.2564"></a>
-<span class="sourceLineNo">2565</span>    put.addColumn(fam1, col5, null);<a name="line.2565"></a>
-<span class="sourceLineNo">2566</span>    region.put(put);<a name="line.2566"></a>
-<span class="sourceLineNo">2567</span><a name="line.2567"></a>
-<span class="sourceLineNo">2568</span>    Get get = new Get(row1);<a name="line.2568"></a>
-<span class="sourceLineNo">2569</span>    get.addColumn(fam1, col2);<a name="line.2569"></a>
-<span class="sourceLineNo">2570</span>    get.addColumn(fam1, col4);<a name="line.2570"></a>
-<span class="sourceLineNo">2571</span>    // Expected result<a name="line.2571"></a>
-<span class="sourceLineNo">2572</span>    KeyValue kv1 = new KeyValue(row1, fam1, col2);<a name="line.2572"></a>
-<span class="sourceLineNo">2573</span>    KeyValue kv2 = new KeyValue(row1, fam1, col4);<a name="line.2573"></a>
-<span class="sourceLineNo">2574</span>    KeyValue[] expected = { kv1, kv2 };<a name="line.2574"></a>
-<span class="sourceLineNo">2575</span><a name="line.2575"></a>
-<span class="sourceLineNo">2576</span>    // Test<a name="line.2576"></a>
-<span class="sourceLineNo">2577</span>    Result res = region.get(get);<a name="line.2577"></a>
-<span class="sourceLineNo">2578</span>    assertEquals(expected.length, res.size());<a name="line.2578"></a>
-<span class="sourceLineNo">2579</span>    for (int i = 0; i &lt; res.size(); i++) {<a name="line.2579"></a>
-<span class="sourceLineNo">2580</span>      assertTrue(CellUtil.matchingRows(expected[i], res.rawCells()[i]));<a name="line.2580"></a>
-<span class="sourceLineNo">2581</span>      assertTrue(CellUtil.matchingFamily(expected[i], res.rawCells()[i]));<a name="line.2581"></a>
-<span class="sourceLineNo">2582</span>      assertTrue(CellUtil.matchingQualifier(expected[i], res.rawCells()[i]));<a name="line.2582"></a>
-<span class="sourceLineNo">2583</span>    }<a name="line.2583"></a>
-<span class="sourceLineNo">2584</span><a name="line.2584"></a>
-<span class="sourceLineNo">2585</span>    // Test using a filter on a Get<a name="line.2585"></a>
-<span class="sourceLineNo">2586</span>    Get g = new Get(row1);<a name="line.2586"></a>
-<span class="sourceLineNo">2587</span>    final int count = 2;<a name="line.2587"></a>
-<span class="sourceLineNo">2588</span>    g.setFilter(new ColumnCountGetFilter(count));<a name="line.2588"></a>
-<span class="sourceLineNo">2589</span>    res = region.get(g);<a name="line.2589"></a>
-<span class="sourceLineNo">2590</span>    assertEquals(count, res.size());<a name="line.2590"></a>
-<span class="sourceLineNo">2591</span>  }<a name="line.2591"></a>
-<span class="sourceLineNo">2592</span><a name="line.2592"></a>
-<span class="sourceLineNo">2593</span>  @Test<a name="line.2593"></a>
-<span class="sourceLineNo">2594</span>  public void testGet_Empty() throws IOException {<a name="line.2594"></a>
-<span class="sourceLineNo">2595</span>    byte[] row = Bytes.toBytes("row");<a name="line.2595"></a>
-<span class="sourceLineNo">2596</span>    byte[] fam = Bytes.toBytes("fam");<a name="line.2596"></a>
-<span class="sourceLineNo">2597</span><a name="line.2597"></a>
-<span class="sourceLineNo">2598</span>    this.region = initHRegion(tableName, method, CONF, fam);<a name="line.2598"></a>
-<span class="sourceLineNo">2599</span>    Get get = new Get(row);<a name="line.2599"></a>
-<span class="sourceLineNo">2600</span>    get.addFamily(fam);<a name="line.2600"></a>
-<span class="sourceLineNo">2601</span>    Result r = region.get(get);<a name="line.2601"></a>
+<span class="sourceLineNo">2557</span>  @Test<a name="line.2557"></a>
+<span class="sourceLineNo">2558</span>  public void testGet_Basic() throws IOException {<a name="line.2558"></a>
+<span class="sourceLineNo">2559</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2559"></a>
+<span class="sourceLineNo">2560</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2560"></a>
+<span class="sourceLineNo">2561</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.2561"></a>
+<span class="sourceLineNo">2562</span>    byte[] col2 = Bytes.toBytes("col2");<a name="line.2562"></a>
+<span class="sourceLineNo">2563</span>    byte[] col3 = Bytes.toBytes("col3");<a name="line.2563"></a>
+<span class="sourceLineNo">2564</span>    byte[] col4 = Bytes.toBytes("col4");<a name="line.2564"></a>
+<span class="sourceLineNo">2565</span>    byte[] col5 = Bytes.toBytes("col5");<a name="line.2565"></a>
+<span class="sourceLineNo">2566</span><a name="line.2566"></a>
+<span class="sourceLineNo">2567</span>    // Setting up region<a name="line.2567"></a>
+<span class="sourceLineNo">2568</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2568"></a>
+<span class="sourceLineNo">2569</span>    // Add to memstore<a name="line.2569"></a>
+<span class="sourceLineNo">2570</span>    Put put = new Put(row1);<a name="line.2570"></a>
+<span class="sourceLineNo">2571</span>    put.addColumn(fam1, col1, null);<a name="line.2571"></a>
+<span class="sourceLineNo">2572</span>    put.addColumn(fam1, col2, null);<a name="line.2572"></a>
+<span class="sourceLineNo">2573</span>    put.addColumn(fam1, col3, null);<a name="line.2573"></a>
+<span class="sourceLineNo">2574</span>    put.addColumn(fam1, col4, null);<a name="line.2574"></a>
+<span class="sourceLineNo">2575</span>    put.addColumn(fam1, col5, null);<a name="line.2575"></a>
+<span class="sourceLineNo">2576</span>    region.put(put);<a name="line.2576"></a>
+<span class="sourceLineNo">2577</span><a name="line.2577"></a>
+<span class="sourceLineNo">2578</span>    Get get = new Get(row1);<a name="line.2578"></a>
+<span class="sourceLineNo">2579</span>    get.addColumn(fam1, col2);<a name="line.2579"></a>
+<span class="sourceLineNo">2580</span>    get.addColumn(fam1, col4);<a name="line.2580"></a>
+<span class="sourceLineNo">2581</span>    // Expected result<a name="line.2581"></a>
+<span class="sourceLineNo">2582</span>    KeyValue kv1 = new KeyValue(row1, fam1, col2);<a name="line.2582"></a>
+<span class="sourceLineNo">2583</span>    KeyValue kv2 = new KeyValue(row1, fam1, col4);<a name="line.2583"></a>
+<span class="sourceLineNo">2584</span>    KeyValue[] expected = { kv1, kv2 };<a name="line.2584"></a>
+<span class="sourceLineNo">2585</span><a name="line.2585"></a>
+<span class="sourceLineNo">2586</span>    // Test<a name="line.2586"></a>
+<span class="sourceLineNo">2587</span>    Result res = region.get(get);<a name="line.2587"></a>
+<span class="sourceLineNo">2588</span>    assertEquals(expected.length, res.size());<a name="line.2588"></a>
+<span class="sourceLineNo">2589</span>    for (int i = 0; i &lt; res.size(); i++) {<a name="line.2589"></a>
+<span class="sourceLineNo">2590</span>      assertTrue(CellUtil.matchingRows(expected[i], res.rawCells()[i]));<a name="line.2590"></a>
+<span class="sourceLineNo">2591</span>      assertTrue(CellUtil.matchingFamily(expected[i], res.rawCells()[i]));<a name="line.2591"></a>
+<span class="sourceLineNo">2592</span>      assertTrue(CellUtil.matchingQualifier(expected[i], res.rawCells()[i]));<a name="line.2592"></a>
+<span class="sourceLineNo">2593</span>    }<a name="line.2593"></a>
+<span class="sourceLineNo">2594</span><a name="line.2594"></a>
+<span class="sourceLineNo">2595</span>    // Test using a filter on a Get<a name="line.2595"></a>
+<span class="sourceLineNo">2596</span>    Get g = new Get(row1);<a name="line.2596"></a>
+<span class="sourceLineNo">2597</span>    final int count = 2;<a name="line.2597"></a>
+<span class="sourceLineNo">2598</span>    g.setFilter(new ColumnCountGetFilter(count));<a name="line.2598"></a>
+<span class="sourceLineNo">2599</span>    res = region.get(g);<a name="line.2599"></a>
+<span class="sourceLineNo">2600</span>    assertEquals(count, res.size());<a name="line.2600"></a>
+<span class="sourceLineNo">2601</span>  }<a name="line.2601"></a>
 <span class="sourceLineNo">2602</span><a name="line.2602"></a>
-<span class="sourceLineNo">2603</span>    assertTrue(r.isEmpty());<a name="line.2603"></a>
-<span class="sourceLineNo">2604</span>  }<a name="line.2604"></a>
-<span class="sourceLineNo">2605</span><a name="line.2605"></a>
-<span class="sourceLineNo">2606</span>  @Test<a name="line.2606"></a>
-<span class="sourceLineNo">2607</span>  public void testGetWithFilter() throws IOException, InterruptedException {<a name="line.2607"></a>
-<span class="sourceLineNo">2608</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2608"></a>
-<span class="sourceLineNo">2609</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2609"></a>
-<span class="sourceLineNo">2610</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.2610"></a>
-<span class="sourceLineNo">2611</span>    byte[] value1 = Bytes.toBytes("value1");<a name="line.2611"></a>
-<span class="sourceLineNo">2612</span>    byte[] value2 = Bytes.toBytes("value2");<a name="line.2612"></a>
-<span class="sourceLineNo">2613</span><a name="line.2613"></a>
-<span class="sourceLineNo">2614</span>    final int maxVersions = 3;<a name="line.2614"></a>
-<span class="sourceLineNo">2615</span>    HColumnDescriptor hcd = new HColumnDescriptor(fam1);<a name="line.2615"></a>
-<span class="sourceLineNo">2616</span>    hcd.setMaxVersions(maxVersions);<a name="line.2616"></a>
-<span class="sourceLineNo">2617</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf("testFilterAndColumnTracker"));<a name="line.2617"></a>
-<span class="sourceLineNo">2618</span>    htd.addFamily(hcd);<a name="line.2618"></a>
-<span class="sourceLineNo">2619</span>    ChunkCreator.initialize(MemStoreLABImpl.CHUNK_SIZE_DEFAULT, false, 0, 0, 0, null);<a name="line.2619"></a>
-<span class="sourceLineNo">2620</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.2620"></a>
-<span class="sourceLineNo">2621</span>    Path logDir = TEST_UTIL.getDataTestDirOnTestFS(method + ".log");<a name="line.2621"></a>
-<span class="sourceLineNo">2622</span>    final WAL wal = HBaseTestingUtility.createWal(TEST_UTIL.getConfiguration(), logDir, info);<a name="line.2622"></a>
-<span class="sourceLineNo">2623</span>    this.region = TEST_UTIL.createLocalHRegion(info, htd, wal);<a name="line.2623"></a>
-<span class="sourceLineNo">2624</span><a name="line.2624"></a>
-<span class="sourceLineNo">2625</span>    // Put 4 version to memstore<a name="line.2625"></a>
-<span class="sourceLineNo">2626</span>    long ts = 0;<a name="line.2626"></a>
-<span class="sourceLineNo">2627</span>    Put put = new Put(row1, ts);<a name="line.2627"></a>
-<span class="sourceLineNo">2628</span>    put.addColumn(fam1, col1, value1);<a name="line.2628"></a>
-<span class="sourceLineNo">2629</span>    region.put(put);<a name="line.2629"></a>
-<span class="sourceLineNo">2630</span>    put = new Put(row1, ts + 1);<a name="line.2630"></a>
-<span class="sourceLineNo">2631</span>    put.addColumn(fam1, col1, Bytes.toBytes("filter1"));<a name="line.2631"></a>
-<span class="sourceLineNo">2632</span>    region.put(put);<a name="line.2632"></a>
-<span class="sourceLineNo">2633</span>    put = new Put(row1, ts + 2);<a name="line.2633"></a>
-<span class="sourceLineNo">2634</span>    put.addColumn(fam1, col1, Bytes.toBytes("filter2"));<a name="line.2634"></a>
-<span class="sourceLineNo">2635</span>    region.put(put);<a name="line.2635"></a>
-<span class="sourceLineNo">2636</span>    put = new Put(row1, ts + 3);<a name="line.2636"></a>
-<span class="sourceLineNo">2637</span>    put.addColumn(fam1, col1, value2);<a name="line.2637"></a>
-<span class="sourceLineNo">2638</span>    region.put(put);<a name="line.2638"></a>
-<span class="sourceLineNo">2639</span><a name="line.2639"></a>
-<span class="sourceLineNo">2640</span>    Get get = new Get(row1);<a name="line.2640"></a>
-<span class="sourceLineNo">2641</span>    get.readAllVersions();<a name="line.2641"></a>
-<span class="sourceLineNo">2642</span>    Result res = region.get(get);<a name="line.2642"></a>
-<span class="sourceLineNo">2643</span>    // Get 3 versions, the oldest version has gone from user view<a name="line.2643"></a>
-<span class="sourceLineNo">2644</span>    assertEquals(maxVersions, res.size());<a name="line.2644"></a>
-<span class="sourceLineNo">2645</span><a name="line.2645"></a>
-<span class="sourceLineNo">2646</span>    get.setFilter(new ValueFilter(CompareOperator.EQUAL, new SubstringComparator("value")));<a name="line.2646"></a>
-<span class="sourceLineNo">2647</span>    res = region.get(get);<a name="line.2647"></a>
-<span class="sourceLineNo">2648</span>    // When use value filter, the oldest version should still gone from user view and it<a name="line.2648"></a>
-<span class="sourceLineNo">2649</span>    // should only return one key vaule<a name="line.2649"></a>
-<span class="sourceLineNo">2650</span>    assertEquals(1, res.size());<a name="line.2650"></a>
-<span class="sourceLineNo">2651</span>    assertTrue(CellUtil.matchingValue(new KeyValue(row1, fam1, col1, value2), res.rawCells()[0]));<a name="line.2651"></a>
-<span class="sourceLineNo">2652</span>    assertEquals(ts + 3, res.rawCells()[0].getTimestamp());<a name="line.2652"></a>
-<span class="sourceLineNo">2653</span><a name="line.2653"></a>
-<span class="sourceLineNo">2654</span>    region.flush(true);<a name="line.2654"></a>
-<span class="sourceLineNo">2655</span>    region.compact(true);<a name="line.2655"></a>
-<span class="sourceLineNo">2656</span>    Thread.sleep(1000);<a name="line.2656"></a>
+<span class="sourceLineNo">2603</span>  @Test<a name="line.2603"></a>
+<span class="sourceLineNo">2604</span>  public void testGet_Empty() throws IOException {<a name="line.2604"></a>
+<span class="sourceLineNo">2605</span>    byte[] row = Bytes.toBytes("row");<a name="line.2605"></a>
+<span class="sourceLineNo">2606</span>    byte[] fam = Bytes.toBytes("fam");<a name="line.2606"></a>
+<span class="sourceLineNo">2607</span><a name="line.2607"></a>
+<span class="sourceLineNo">2608</span>    this.region = initHRegion(tableName, method, CONF, fam);<a name="line.2608"></a>
+<span class="sourceLineNo">2609</span>    Get get = new Get(row);<a name="line.2609"></a>
+<span class="sourceLineNo">2610</span>    get.addFamily(fam);<a name="line.2610"></a>
+<span class="sourceLineNo">2611</span>    Result r = region.get(get);<a name="line.2611"></a>
+<span class="sourceLineNo">2612</span><a name="line.2612"></a>
+<span class="sourceLineNo">2613</span>    assertTrue(r.isEmpty());<a name="line.2613"></a>
+<span class="sourceLineNo">2614</span>  }<a name="line.2614"></a>
+<span class="sourceLineNo">2615</span><a name="line.2615"></a>
+<span class="sourceLineNo">2616</span>  @Test<a name="line.2616"></a>
+<span class="sourceLineNo">2617</span>  public void testGetWithFilter() throws IOException, InterruptedException {<a name="line.2617"></a>
+<span class="sourceLineNo">2618</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2618"></a>
+<span class="sourceLineNo">2619</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2619"></a>
+<span class="sourceLineNo">2620</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.2620"></a>
+<span class="sourceLineNo">2621</span>    byte[] value1 = Bytes.toBytes("value1");<a name="line.2621"></a>
+<span class="sourceLineNo">2622</span>    byte[] value2 = Bytes.toBytes("value2");<a name="line.2622"></a>
+<span class="sourceLineNo">2623</span><a name="line.2623"></a>
+<span class="sourceLineNo">2624</span>    final int maxVersions = 3;<a name="line.2624"></a>
+<span class="sourceLineNo">2625</span>    HColumnDescriptor hcd = new HColumnDescriptor(fam1);<a name="line.2625"></a>
+<span class="sourceLineNo">2626</span>    hcd.setMaxVersions(maxVersions);<a name="line.2626"></a>
+<span class="sourceLineNo">2627</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf("testFilterAndColumnTracker"));<a name="line.2627"></a>
+<span class="sourceLineNo">2628</span>    htd.addFamily(hcd);<a name="line.2628"></a>
+<span class="sourceLineNo">2629</span>    ChunkCreator.initialize(MemStoreLABImpl.CHUNK_SIZE_DEFAULT, false, 0, 0, 0, null);<a name="line.2629"></a>
+<span class="sourceLineNo">2630</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.2630"></a>
+<span class="sourceLineNo">2631</span>    Path logDir = TEST_UTIL.getDataTestDirOnTestFS(method + ".log");<a name="line.2631"></a>
+<span class="sourceLineNo">2632</span>    final WAL wal = HBaseTestingUtility.createWal(TEST_UTIL.getConfiguration(), logDir, info);<a name="line.2632"></a>
+<span class="sourceLineNo">2633</span>    this.region = TEST_UTIL.createLocalHRegion(info, htd, wal);<a name="line.2633"></a>
+<span class="sourceLineNo">2634</span><a name="line.2634"></a>
+<span class="sourceLineNo">2635</span>    // Put 4 version to memstore<a name="line.2635"></a>
+<span class="sourceLineNo">2636</span>    long ts = 0;<a name="line.2636"></a>
+<span class="sourceLineNo">2637</span>    Put put = new Put(row1, ts);<a name="line.2637"></a>
+<span class="sourceLineNo">2638</span>    put.addColumn(fam1, col1, value1);<a name="line.2638"></a>
+<span class="sourceLineNo">2639</span>    region.put(put);<a name="line.2639"></a>
+<span class="sourceLineNo">2640</span>    put = new Put(row1, ts + 1);<a name="line.2640"></a>
+<span class="sourceLineNo">2641</span>    put.addColumn(fam1, col1, Bytes.toBytes("filter1"));<a name="line.2641"></a>
+<span class="sourceLineNo">2642</span>    region.put(put);<a name="line.2642"></a>
+<span class="sourceLineNo">2643</span>    put = new Put(row1, ts + 2);<a name="line.2643"></a>
+<span class="sourceLineNo">2644</span>    put.addColumn(fam1, col1, Bytes.toBytes("filter2"));<a name="line.2644"></a>
+<span class="sourceLineNo">2645</span>    region.put(put);<a name="line.2645"></a>
+<span class="sourceLineNo">2646</span>    put = new Put(row1, ts + 3);<a name="line.2646"></a>
+<span class="sourceLineNo">2647</span>    put.addColumn(fam1, col1, value2);<a name="line.2647"></a>
+<span class="sourceLineNo">2648</span>    region.put(put);<a name="line.2648"></a>
+<span class="sourceLineNo">2649</span><a name="line.2649"></a>
+<span class="sourceLineNo">2650</span>    Get get = new Get(row1);<a name="line.2650"></a>
+<span class="sourceLineNo">2651</span>    get.readAllVersions();<a name="line.2651"></a>
+<span class="sourceLineNo">2652</span>    Result res = region.get(get);<a name="line.2652"></a>
+<span class="sourceLineNo">2653</span>    // Get 3 versions, the oldest version has gone from user view<a name="line.2653"></a>
+<span class="sourceLineNo">2654</span>    assertEquals(maxVersions, res.size());<a name="line.2654"></a>
+<span class="sourceLineNo">2655</span><a name="line.2655"></a>
+<span class="sourceLineNo">2656</span>    get.setFilter(new ValueFilter(CompareOperator.EQUAL, new SubstringComparator("value")));<a name="line.2656"></a>
 <span class="sourceLineNo">2657</span>    res = region.get(get);<a name="line.2657"></a>
-<span class="sourceLineNo">2658</span>    // After flush and compact, the result should be consistent with previous result<a name="line.2658"></a>
-<span class="sourceLineNo">2659</span>    assertEquals(1, res.size());<a name="line.2659"></a>
-<span class="sourceLineNo">2660</span>    assertTrue(CellUtil.matchingValue(new KeyValue(row1, fam1, col1, value2), res.rawCells()[0]));<a name="line.2660"></a>
-<span class="sourceLineNo">2661</span>  }<a name="line.2661"></a>
-<span class="sourceLineNo">2662</span><a name="line.2662"></a>
-<span class="sourceLineNo">2663</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2663"></a>
-<span class="sourceLineNo">2664</span>  // Scanner tests<a name="line.2664"></a>
-<span class="sourceLineNo">2665</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2665"></a>
-<span class="sourceLineNo">2666</span>  @Test<a name="line.2666"></a>
-<span class="sourceLineNo">2667</span>  public void testGetScanner_WithOkFamilies() throws IOException {<a name="line.2667"></a>
-<span class="sourceLineNo">2668</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2668"></a>
-<span class="sourceLineNo">2669</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2669"></a>
-<span class="sourceLineNo">2670</span><a name="line.2670"></a>
-<span class="sourceLineNo">2671</span>    byte[][] families = { fam1, fam2 };<a name="line.2671"></a>
+<span class="sourceLineNo">2658</span>    // When use value filter, the oldest version should still gone from user view and it<a name="line.2658"></a>
+<span class="sourceLineNo">2659</span>    // should only return one key vaule<a name="line.2659"></a>
+<span class="sourceLineNo">2660</span>    assertEquals(1, res.size());<a name="line.2660"></a>
+<span class="sourceLineNo">2661</span>    assertTrue(CellUtil.matchingValue(new KeyValue(row1, fam1, col1, value2), res.rawCells()[0]));<a name="line.2661"></a>
+<span class="sourceLineNo">2662</span>    assertEquals(ts + 3, res.rawCells()[0].getTimestamp());<a name="line.2662"></a>
+<span class="sourceLineNo">2663</span><a name="line.2663"></a>
+<span class="sourceLineNo">2664</span>    region.flush(true);<a name="line.2664"></a>
+<span class="sourceLineNo">2665</span>    region.compact(true);<a name="line.2665"></a>
+<span class="sourceLineNo">2666</span>    Thread.sleep(1000);<a name="line.2666"></a>
+<span class="sourceLineNo">2667</span>    res = region.get(get);<a name="line.2667"></a>
+<span class="sourceLineNo">2668</span>    // After flush and compact, the result should be consistent with previous result<a name="line.2668"></a>
+<span class="sourceLineNo">2669</span>    assertEquals(1, res.size());<a name="line.2669"></a>
+<span class="sourceLineNo">2670</span>    assertTrue(CellUtil.matchingValue(new KeyValue(row1, fam1, col1, value2), res.rawCells()[0]));<a name="line.2670"></a>
+<span class="sourceLineNo">2671</span>  }<a name="line.2671"></a>
 <span class="sourceLineNo">2672</span><a name="line.2672"></a>
-<span class="sourceLineNo">2673</span>    // Setting up region<a name="line.2673"></a>
-<span class="sourceLineNo">2674</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2674"></a>
-<span class="sourceLineNo">2675</span>    Scan scan = new Scan();<a name="line.2675"></a>
-<span class="sourceLineNo">2676</span>    scan.addFamily(fam1);<a name="line.2676"></a>
-<span class="sourceLineNo">2677</span>    scan.addFamily(fam2);<a name="line.2677"></a>
-<span class="sourceLineNo">2678</span>    try {<a name="line.2678"></a>
-<span class="sourceLineNo">2679</span>      region.getScanner(scan);<a name="line.2679"></a>
-<span class="sourceLineNo">2680</span>    } catch (Exception e) {<a name="line.2680"></a>
-<span class="sourceLineNo">2681</span>      assertTrue("Families could not be found in Region", false);<a name="line.2681"></a>
-<span class="sourceLineNo">2682</span>    }<a name="line.2682"></a>
-<span class="sourceLineNo">2683</span>  }<a name="line.2683"></a>
-<span class="sourceLineNo">2684</span><a name="line.2684"></a>
-<span class="sourceLineNo">2685</span>  @Test<a name="line.2685"></a>
-<span class="sourceLineNo">2686</span>  public void testGetScanner_WithNotOkFamilies() throws IOException {<a name="line.2686"></a>
-<span class="sourceLineNo">2687</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2687"></a>
-<span class="sourceLineNo">2688</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2688"></a>
-<span class="sourceLineNo">2689</span><a name="line.2689"></a>
-<span class="sourceLineNo">2690</span>    byte[][] families = { fam1 };<a name="line.2690"></a>
-<span class="sourceLineNo">2691</span><a name="line.2691"></a>
-<span class="sourceLineNo">2692</span>    // Setting up region<a name="line.2692"></a>
-<span class="sourceLineNo">2693</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2693"></a>
-<span class="sourceLineNo">2694</span>    Scan scan = new Scan();<a name="line.2694"></a>
-<span class="sourceLineNo">2695</span>    scan.addFamily(fam2);<a name="line.2695"></a>
-<span class="sourceLineNo">2696</span>    boolean ok = false;<a name="line.2696"></a>
-<span class="sourceLineNo">2697</span>    try {<a name="line.2697"></a>
-<span class="sourceLineNo">2698</span>      region.getScanner(scan);<a name="line.2698"></a>
-<span class="sourceLineNo">2699</span>    } catch (Exception e) {<a name="line.2699"></a>
-<span class="sourceLineNo">2700</span>      ok = true;<a name="line.2700"></a>
-<span class="sourceLineNo">2701</span>    }<a name="line.2701"></a>
-<span class="sourceLineNo">2702</span>    assertTrue("Families could not be found in Region", ok);<a name="line.2702"></a>
-<span class="sourceLineNo">2703</span>  }<a name="line.2703"></a>
-<span class="sourceLineNo">2704</span><a name="line.2704"></a>
-<span class="sourceLineNo">2705</span>  @Test<a name="line.2705"></a>
-<span class="sourceLineNo">2706</span>  public void testGetScanner_WithNoFamilies() throws IOException {<a name="line.2706"></a>
-<span class="sourceLineNo">2707</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2707"></a>
-<span class="sourceLineNo">2708</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2708"></a>
-<span class="sourceLineNo">2709</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2709"></a>
-<span class="sourceLineNo">2710</span>    byte[] fam3 = Bytes.toBytes("fam3");<a name="line.2710"></a>
-<span class="sourceLineNo">2711</span>    byte[] fam4 = Bytes.toBytes("fam4");<a name="line.2711"></a>
-<span class="sourceLineNo">2712</span><a name="line.2712"></a>
-<span class="sourceLineNo">2713</span>    byte[][] families = { fam1, fam2, fam3, fam4 };<a name="line.2713"></a>
+<span class="sourceLineNo">2673</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2673"></a>
+<span class="sourceLineNo">2674</span>  // Scanner tests<a name="line.2674"></a>
+<span class="sourceLineNo">2675</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2675"></a>
+<span class="sourceLineNo">2676</span>  @Test<a name="line.2676"></a>
+<span class="sourceLineNo">2677</span>  public void testGetScanner_WithOkFamilies() throws IOException {<a name="line.2677"></a>
+<span class="sourceLineNo">2678</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2678"></a>
+<span class="sourceLineNo">2679</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2679"></a>
+<span class="sourceLineNo">2680</span><a name="line.2680"></a>
+<span class="sourceLineNo">2681</span>    byte[][] families = { fam1, fam2 };<a name="line.2681"></a>
+<span class="sourceLineNo">2682</span><a name="line.2682"></a>
+<span class="sourceLineNo">2683</span>    // Setting up region<a name="line.2683"></a>
+<span class="sourceLineNo">2684</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2684"></a>
+<span class="sourceLineNo">2685</span>    Scan scan = new Scan();<a name="line.2685"></a>
+<span class="sourceLineNo">2686</span>    scan.addFamily(fam1);<a name="line.2686"></a>
+<span class="sourceLineNo">2687</span>    scan.addFamily(fam2);<a name="line.2687"></a>
+<span class="sourceLineNo">2688</span>    try {<a name="line.2688"></a>
+<span class="sourceLineNo">2689</span>      region.getScanner(scan);<a name="line.2689"></a>
+<span class="sourceLineNo">2690</span>    } catch (Exception e) {<a name="line.2690"></a>
+<span class="sourceLineNo">2691</span>      assertTrue("Families could not be found in Region", false);<a name="line.2691"></a>
+<span class="sourceLineNo">2692</span>    }<a name="line.2692"></a>
+<span class="sourceLineNo">2693</span>  }<a name="line.2693"></a>
+<span class="sourceLineNo">2694</span><a name="line.2694"></a>
+<span class="sourceLineNo">2695</span>  @Test<a name="line.2695"></a>
+<span class="sourceLineNo">2696</span>  public void testGetScanner_WithNotOkFamilies() throws IOException {<a name="line.2696"></a>
+<span class="sourceLineNo">2697</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2697"></a>
+<span class="sourceLineNo">2698</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2698"></a>
+<span class="sourceLineNo">2699</span><a name="line.2699"></a>
+<span class="sourceLineNo">2700</span>    byte[][] families = { fam1 };<a name="line.2700"></a>
+<span class="sourceLineNo">2701</span><a name="line.2701"></a>
+<span class="sourceLineNo">2702</span>    // Setting up region<a name="line.2702"></a>
+<span class="sourceLineNo">2703</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2703"></a>
+<span class="sourceLineNo">2704</span>    Scan scan = new Scan();<a name="line.2704"></a>
+<span class="sourceLineNo">2705</span>    scan.addFamily(fam2);<a name="line.2705"></a>
+<span class="sourceLineNo">2706</span>    boolean ok = false;<a name="line.2706"></a>
+<span class="sourceLineNo">2707</span>    try {<a name="line.2707"></a>
+<span class="sourceLineNo">2708</span>      region.getScanner(scan);<a name="line.2708"></a>
+<span class="sourceLineNo">2709</span>    } catch (Exception e) {<a name="line.2709"></a>
+<span class="sourceLineNo">2710</span>      ok = true;<a name="line.2710"></a>
+<span class="sourceLineNo">2711</span>    }<a name="line.2711"></a>
+<span class="sourceLineNo">2712</span>    assertTrue("Families could not be found in Region", ok);<a name="line.2712"></a>
+<span class="sourceLineNo">2713</span>  }<a name="line.2713"></a>
 <span class="sourceLineNo">2714</span><a name="line.2714"></a>
-<span class="sourceLineNo">2715</span>    // Setting up region<a name="line.2715"></a>
-<span class="sourceLineNo">2716</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2716"></a>
-<span class="sourceLineNo">2717</span>    // Putting data in Region<a name="line.2717"></a>
-<span class="sourceLineNo">2718</span>    Put put = new Put(row1);<a name="line.2718"></a>
-<span class="sourceLineNo">2719</span>    put.addColumn(fam1, null, null);<a name="line.2719"></a>
-<span class="sourceLineNo">2720</span>    put.addColumn(fam2, null, null);<a name="line.2720"></a>
-<span class="sourceLineNo">2721</span>    put.addColumn(fam3, null, null);<a name="line.2721"></a>
-<span class="sourceLineNo">2722</span>    put.addColumn(fam4, null, null);<a name="line.2722"></a>
-<span class="sourceLineNo">2723</span>    region.put(put);<a name="line.2723"></a>
+<span class="sourceLineNo">2715</span>  @Test<a name="line.2715"></a>
+<span class="sourceLineNo">2716</span>  public void testGetScanner_WithNoFamilies() throws IOException {<a name="line.2716"></a>
+<span class="sourceLineNo">2717</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2717"></a>
+<span class="sourceLineNo">2718</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2718"></a>
+<span class="sourceLineNo">2719</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2719"></a>
+<span class="sourceLineNo">2720</span>    byte[] fam3 = Bytes.toBytes("fam3");<a name="line.2720"></a>
+<span class="sourceLineNo">2721</span>    byte[] fam4 = Bytes.toBytes("fam4");<a name="line.2721"></a>
+<span class="sourceLineNo">2722</span><a name="line.2722"></a>
+<span class="sourceLineNo">2723</span>    byte[][] families = { fam1, fam2, fam3, fam4 };<a name="line.2723"></a>
 <span class="sourceLineNo">2724</span><a name="line.2724"></a>
-<span class="sourceLineNo">2725</span>    Scan scan = null;<a name="line.2725"></a>
-<span class="sourceLineNo">2726</span>    HRegion.RegionScannerImpl is = null;<a name="line.2726"></a>
-<span class="sourceLineNo">2727</span><a name="line.2727"></a>
-<span class="sourceLineNo">2728</span>    // Testing to see how many scanners that is produced by getScanner,<a name="line.2728"></a>
-<span class="sourceLineNo">2729</span>    // starting<a name="line.2729"></a>
-<span class="sourceLineNo">2730</span>    // with known number, 2 - current = 1<a name="line.2730"></a>
-<span class="sourceLineNo">2731</span>    scan = new Scan();<a name="line.2731"></a>
-<span class="sourceLineNo">2732</span>    scan.addFamily(fam2);<a name="line.2732"></a>
-<span class="sourceLineNo">2733</span>    scan.addFamily(fam4);<a name="line.2733"></a>
-<span class="sourceLineNo">2734</span>    is = region.getScanner(scan);<a name="line.2734"></a>
-<span class="sourceLineNo">2735</span>    assertEquals(1, is.storeHeap.getHeap().size());<a name="line.2735"></a>
-<span class="sourceLineNo">2736</span><a name="line.2736"></a>
-<span class="sourceLineNo">2737</span>    scan = new Scan();<a name="line.2737"></a>
-<span class="sourceLineNo">2738</span>    is = region.getScanner(scan);<a name="line.2738"></a>
-<span class="sourceLineNo">2739</span>    assertEquals(families.length - 1, is.storeHeap.getHeap().size());<a name="line.2739"></a>
-<span class="sourceLineNo">2740</span>  }<a name="line.2740"></a>
-<span class="sourceLineNo">2741</span><a name="line.2741"></a>
-<span class="sourceLineNo">2742</span>  /**<a name="line.2742"></a>
-<span class="sourceLineNo">2743</span>   * This method tests https://issues.apache.org/jira/browse/HBASE-2516.<a name="line.2743"></a>
-<span class="sourceLineNo">2744</span>   *<a name="line.2744"></a>
-<span class="sourceLineNo">2745</span>   * @throws IOException<a name="line.2745"></a>
-<span class="sourceLineNo">2746</span>   */<a name="line.2746"></a>
-<span class="sourceLineNo">2747</span>  @Test<a name="line.2747"></a>
-<span class="sourceLineNo">2748</span>  public void testGetScanner_WithRegionClosed() throws IOException {<a name="line.2748"></a>
-<span class="sourceLineNo">2749</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2749"></a>
-<span class="sourceLineNo">2750</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2750"></a>
+<span class="sourceLineNo">2725</span>    // Setting up region<a name="line.2725"></a>
+<span class="sourceLineNo">2726</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2726"></a>
+<span class="sourceLineNo">2727</span>    // Putting data in Region<a name="line.2727"></a>
+<span class="sourceLineNo">2728</span>    Put put = new Put(row1);<a name="line.2728"></a>
+<span class="sourceLineNo">2729</span>    put.addColumn(fam1, null, null);<a name="line.2729"></a>
+<span class="sourceLineNo">2730</span>    put.addColumn(fam2, null, null);<a name="line.2730"></a>
+<span class="sourceLineNo">2731</span>    put.addColumn(fam3, null, null);<a name="line.2731"></a>
+<span class="sourceLineNo">2732</span>    put.addColumn(fam4, null, null);<a name="line.2732"></a>
+<span class="sourceLineNo">2733</span>    region.put(put);<a name="line.2733"></a>
+<span class="sourceLineNo">2734</span><a name="line.2734"></a>
+<span class="sourceLineNo">2735</span>    Scan scan = null;<a name="line.2735"></a>
+<span class="sourceLineNo">2736</span>    HRegion.RegionScannerImpl is = null;<a name="line.2736"></a>
+<span class="sourceLineNo">2737</span><a name="line.2737"></a>
+<span class="sourceLineNo">2738</span>    // Testing to see how many scanners that is produced by getScanner,<a name="line.2738"></a>
+<span class="sourceLineNo">2739</span>    // starting<a name="line.2739"></a>
+<span class="sourceLineNo">2740</span>    // with known number, 2 - current = 1<a name="line.2740"></a>
+<span class="sourceLineNo">2741</span>    scan = new Scan();<a name="line.2741"></a>
+<span class="sourceLineNo">2742</span>    scan.addFamily(fam2);<a name="line.2742"></a>
+<span class="sourceLineNo">2743</span>    scan.addFamily(fam4);<a name="line.2743"></a>
+<span class="sourceLineNo">2744</span>    is = region.getScanner(scan);<a name="line.2744"></a>
+<span class="sourceLineNo">2745</span>    assertEquals(1, is.storeHeap.getHeap().size());<a name="line.2745"></a>
+<span class="sourceLineNo">2746</span><a name="line.2746"></a>
+<span class="sourceLineNo">2747</span>    scan = new Scan();<a name="line.2747"></a>
+<span class="sourceLineNo">2748</span>    is = region.getScanner(scan);<a name="line.2748"></a>
+<span class="sourceLineNo">2749</span>    assertEquals(families.length - 1, is.storeHeap.getHeap().size());<a name="line.2749"></a>
+<span class="sourceLineNo">2750</span>  }<a name="line.2750"></a>
 <span class="sourceLineNo">2751</span><a name="line.2751"></a>
-<span class="sourceLineNo">2752</span>    byte[][] families = { fam1, fam2 };<a name="line.2752"></a>
-<span class="sourceLineNo">2753</span><a name="line.2753"></a>
-<span class="sourceLineNo">2754</span>    // Setting up region<a name="line.2754"></a>
-<span class="sourceLineNo">2755</span>    try {<a name="line.2755"></a>
-<span class="sourceLineNo">2756</span>      this.region = initHRegion(tableName, method, CONF, families);<a name="line.2756"></a>
-<span class="sourceLineNo">2757</span>    } catch (IOException e) {<a name="line.2757"></a>
-<span class="sourceLineNo">2758</span>      e.printStackTrace();<a name="line.2758"></a>
-<span class="sourceLineNo">2759</span>      fail("Got IOException during initHRegion, " + e.getMessage());<a name="line.2759"></a>
-<span class="sourceLineNo">2760</span>    }<a name="line.2760"></a>
-<span class="sourceLineNo">2761</span>    region.closed.set(true);<a name="line.2761"></a>
-<span class="sourceLineNo">2762</span>    try {<a name="line.2762"></a>
-<span class="sourceLineNo">2763</span>      region.getScanner(null);<a name="line.2763"></a>
-<span class="sourceLineNo">2764</span>      fail("Expected to get an exception during getScanner on a region that is closed");<a name="line.2764"></a>
-<span class="sourceLineNo">2765</span>    } catch (NotServingRegionException e) {<a name="line.2765"></a>
-<span class="sourceLineNo">2766</span>      // this is the correct exception that is expected<a name="line.2766"></a>
+<span class="sourceLineNo">2752</span>  /**<a name="line.2752"></a>
+<span class="sourceLineNo">2753</span>   * This method tests https://issues.apache.org/jira/browse/HBASE-2516.<a name="line.2753"></a>
+<span class="sourceLineNo">2754</span>   *<a name="line.2754"></a>
+<span class="sourceLineNo">2755</span>   * @throws IOException<a name="line.2755"></a>
+<span class="sourceLineNo">2756</span>   */<a name="line.2756"></a>
+<span class="sourceLineNo">2757</span>  @Test<a name="line.2757"></a>
+<span class="sourceLineNo">2758</span>  public void testGetScanner_WithRegionClosed() throws IOException {<a name="line.2758"></a>
+<span class="sourceLineNo">2759</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2759"></a>
+<span class="sourceLineNo">2760</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2760"></a>
+<span class="sourceLineNo">2761</span><a name="line.2761"></a>
+<span class="sourceLineNo">2762</span>    byte[][] families = { fam1, fam2 };<a name="line.2762"></a>
+<span class="sourceLineNo">2763</span><a name="line.2763"></a>
+<span class="sourceLineNo">2764</span>    // Setting up region<a name="line.2764"></a>
+<span class="sourceLineNo">2765</span>    try {<a name="line.2765"></a>
+<span class="sourceLineNo">2766</span>      this.region = initHRegion(tableName, method, CONF, families);<a name="line.2766"></a>
 <span class="sourceLineNo">2767</span>    } catch (IOException e) {<a name="line.2767"></a>
-<span class="sourceLineNo">2768</span>      fail("Got wrong type of exception - should be a NotServingRegionException, " +<a name="line.2768"></a>
-<span class="sourceLineNo">2769</span>          "but was an IOException: "<a name="line.2769"></a>
-<span class="sourceLineNo">2770</span>          + e.getMessage());<a name="line.2770"></a>
-<span class="sourceLineNo">2771</span>    }<a name="line.2771"></a>
-<span class="sourceLineNo">2772</span>  }<a name="line.2772"></a>
-<span class="sourceLineNo">2773</span><a name="line.2773"></a>
-<span class="sourceLineNo">2774</span>  @Test<a name="line.2774"></a>
-<span class="sourceLineNo">2775</span>  public void testRegionScanner_Next() throws IOException {<a name="line.2775"></a>
-<span class="sourceLineNo">2776</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2776"></a>
-<span class="sourceLineNo">2777</span>    byte[] row2 = Bytes.toBytes("row2");<a name="line.2777"></a>
-<span class="sourceLineNo">2778</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2778"></a>
-<span class="sourceLineNo">2779</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2779"></a>
-<span class="sourceLineNo">2780</span>    byte[] fam3 = Bytes.toBytes("fam3");<a name="line.2780"></a>
-<span class="sourceLineNo">2781</span>    byte[] fam4 = Bytes.toBytes("fam4");<a name="line.2781"></a>
-<span class="sourceLineNo">2782</span><a name="line.2782"></a>
-<span class="sourceLineNo">2783</span>    byte[][] families = { fam1, fam2, fam3, fam4 };<a name="line.2783"></a>
-<span class="sourceLineNo">2784</span>    long ts = System.currentTimeMillis();<a name="line.2784"></a>
-<span class="sourceLineNo">2785</span><a name="line.2785"></a>
-<span class="sourceLineNo">2786</span>    // Setting up region<a name="line.2786"></a>
-<span class="sourceLineNo">2787</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2787"></a>
-<span class="sourceLineNo">2788</span>    // Putting data in Region<a name="line.2788"></a>
-<span class="sourceLineNo">2789</span>    Put put = null;<a name="line.2789"></a>
-<span class="sourceLineNo">2790</span>    put = new Put(row1);<a name="line.2790"></a>
-<span class="sourceLineNo">2791</span>    put.addColumn(fam1, (byte[]) null, ts, null);<a name="line.2791"></a>
-<span class="sourceLineNo">2792</span>    put.addColumn(fam2, (byte[]) null, ts, null);<a name="line.2792"></a>
-<span class="sourceLineNo">2793</span>    put.addColumn(fam3, (byte[]) null, ts, null);<a name="line.2793"></a>
-<span class="sourceLineNo">2794</span>    put.addColumn(fam4, (byte[]) null, ts, null);<a name="line.2794"></a>
-<span class="sourceLineNo">2795</span>    region.put(put);<a name="line.2795"></a>
-<span class="sourceLineNo">2796</span><a name="line.2796"></a>
-<span class="sourceLineNo">2797</span>    put = new Put(row2);<a name="line.2797"></a>
-<span class="sourceLineNo">2798</span>    put.addColumn(fam1, (byte[]) null, ts, null);<a name="line.2798"></a>
-<span class="sourceLineNo">2799</span>    put.addColumn(fam2, (byte[]) null, ts, null);<a name="line.2799"></a>
-<span class="sourceLineNo">2800</span>    put.addColumn(fam3, (byte[]) null, ts, null);<a name="line.2800"></a>
-<span class="sourceLineNo">2801</span>    put.addColumn(fam4, (byte[]) null, ts, null);<a name="line.2801"></a>
-<span class="sourceLineNo">2802</span>    region.put(put);<a name="line.2802"></a>
-<span class="sourceLineNo">2803</span><a name="line.2803"></a>
-<span class="sourceLineNo">2804</span>    Scan scan = new Scan();<a name="line.2804"></a>
-<span class="sourceLineNo">2805</span>    scan.addFamily(fam2);<a name="line.2805"></a>
-<span class="sourceLineNo">2806</span>    scan.addFamily(fam4);<a name="line.2806"></a>
-<span class="sourceLineNo">2807</span>    InternalScanner is = region.getScanner(scan);<a name="line.2807"></a>
-<span class="sourceLineNo">2808</span><a name="line.2808"></a>
-<span class="sourceLineNo">2809</span>    List&lt;Cell&gt; res = null;<a name="line.2809"></a>
-<span class="sourceLineNo">2810</span><a name="line.2810"></a>
-<span class="sourceLineNo">2811</span>    // Result 1<a name="line.2811"></a>
-<span class="sourceLineNo">2812</span>    List&lt;Cell&gt; expected1 = new ArrayList&lt;&gt;();<a name="line.2812"></a>
-<span class="sourceLineNo">2813</span>    expected1.add(new KeyValue(row1, fam2, null, ts, KeyValue.Type.Put, null));<a name="line.2813"></a>
-<span class="sourceLineNo">2814</span>    expected1.add(new KeyValue(row1, fam4, null, ts, KeyValue.Type.Put, null));<a name="line.2814"></a>
-<span class="sourceLineNo">2815</span><a name="line.2815"></a>
-<span class="sourceLineNo">2816</span>    res = new ArrayList&lt;&gt;();<a name="line.2816"></a>
-<span class="sourceLineNo">2817</span>    is.next(res);<a name="line.2817"></a>
-<span class="sourceLineNo">2818</span>    for (int i = 0; i &lt; res.size(); i++) {<a name="line.2818"></a>
-<span class="sourceLineNo">2819</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected1.get(i), res.get(i)));<a name="line.2819"></a>
-<span class="sourceLineNo">2820</span>    }<a name="line.2820"></a>
-<span class="sourceLineNo">2821</span><a name="line.2821"></a>
-<span class="sourceLineNo">2822</span>    // Result 2<a name="line.2822"></a>
-<span class="sourceLineNo">2823</span>    List&lt;Cell&gt; expected2 = new ArrayList&lt;&gt;();<a name="line.2823"></a>
-<span class="sourceLineNo">2824</span>    expected2.add(new KeyValue(row2, fam2, null, ts, KeyValue.Type.Put, null));<a name="line.2824"></a>
-<span class="sourceLineNo">2825</span>    expected2.add(new KeyValue(row2, fam4, null, ts, KeyValue.Type.Put, null));<a name="line.2825"></a>
-<span class="sourceLineNo">2826</span><a name="line.2826"></a>
-<span class="sourceLineNo">2827</span>    res = new ArrayList&lt;&gt;();<a name="line.2827"></a>
-<span class="sourceLineNo">2828</span>    is.next(res);<a name="line.2828"></a>
-<span class="sourceLineNo">2829</span>    for (int i = 0; i &lt; res.size(); i++) {<a name="line.2829"></a>
-<span class="sourceLineNo">2830</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected2.get(i), res.get(i)));<a name="line.2830"></a>
-<span class="sourceLineNo">2831</span>    }<a name="line.2831"></a>
-<span class="sourceLineNo">2832</span>  }<a name="line.2832"></a>
-<span class="sourceLineNo">2833</span><a name="line.2833"></a>
-<span class="sourceLineNo">2834</span>  @Test<a name="line.2834"></a>
-<span class="sourceLineNo">2835</span>  public void testScanner_ExplicitColumns_FromMemStore_EnforceVersions() throws IOException {<a name="line.2835"></a>
-<span class="sourceLineNo">2836</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2836"></a>
-<span class="sourceLineNo">2837</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.2837"></a>
-<span class="sourceLineNo">2838</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.2838"></a>
-<span class="sourceLineNo">2839</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2839"></a>
-<span class="sourceLineNo">2840</span>    byte[][] families = { fam1 };<a name="line.2840"></a>
-<span class="sourceLineNo">2841</span><a name="line.2841"></a>
-<span class="sourceLineNo">2842</span>    long ts1 = System.currentTimeMillis();<a name="line.2842"></a>
-<span class="sourceLineNo">2843</span>    long ts2 = ts1 + 1;<a name="line.2843"></a>
-<span class="sourceLineNo">2844</span>    long ts3 = ts1 + 2;<a name="line.2844"></a>
-<span class="sourceLineNo">2845</span><a name="line.2845"></a>
-<span class="sourceLineNo">2846</span>    // Setting up region<a name="line.2846"></a>
-<span class="sourceLineNo">2847</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2847"></a>
-<span class="sourceLineNo">2848</span>    // Putting data in Region<a name="line.2848"></a>
-<span class="sourceLineNo">2849</span>    Put put = null;<a name="line.2849"></a>
-<span class="sourceLineNo">2850</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.2850"></a>
-<span class="sourceLineNo">2851</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.2851"></a>
-<span class="sourceLineNo">2852</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.2852"></a>
-<span class="sourceLineNo">2853</span><a name="line.2853"></a>
-<span class="sourceLineNo">2854</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.2854"></a>
-<span class="sourceLineNo">2855</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.2855"></a>
-<span class="sourceLineNo">2856</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.2856"></a>
-<span class="sourceLineNo">2857</span><a name="line.2857"></a>
-<span class="sourceLineNo">2858</span>    put = new Put(row1);<a name="line.2858"></a>
-<span class="sourceLineNo">2859</span>    put.add(kv13);<a name="line.2859"></a>
-<span class="sourceLineNo">2860</span>    put.add(kv12);<a name="line.2860"></a>
-<span class="sourceLineNo">2861</span>    put.add(kv11);<a name="line.2861"></a>
-<span class="sourceLineNo">2862</span>    put.add(kv23);<a name="line.2862"></a>
-<span class="sourceLineNo">2863</span>    put.add(kv22);<a name="line.2863"></a>
-<span class="sourceLineNo">2864</span>    put.add(kv21);<a name="line.2864"></a>
-<span class="sourceLineNo">2865</span>    region.put(put);<a name="line.2865"></a>
-<span class="sourceLineNo">2866</span><a name="line.2866"></a>
-<span class="sourceLineNo">2867</span>    // Expected<a name="line.2867"></a>
-<span class="sourceLineNo">2868</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.2868"></a>
-<span class="sourceLineNo">2869</span>    expected.add(kv13);<a name="line.2869"></a>
-<span class="sourceLineNo">2870</span>    expected.add(kv12);<a name="line.2870"></a>
-<span class="sourceLineNo">2871</span><a name="line.2871"></a>
-<span class="sourceLineNo">2872</span>    Scan scan = new Scan(row1);<a name="line.2872"></a>
-<span class="sourceLineNo">2873</span>    scan.addColumn(fam1, qf1);<a name="line.2873"></a>
-<span class="sourceLineNo">2874</span>    scan.setMaxVersions(MAX_VERSIONS);<a name="line.2874"></a>
-<span class="sourceLineNo">2875</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.2875"></a>
-<span class="sourceLineNo">2876</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.2876"></a>
-<span class="sourceLineNo">2877</span><a name="line.2877"></a>
-<span class="sourceLineNo">2878</span>    boolean hasNext = scanner.next(actual);<a name="line.2878"></a>
-<span class="sourceLineNo">2879</span>    assertEquals(false, hasNext);<a name="line.2879"></a>
-<span class="sourceLineNo">2880</span><a name="line.2880"></a>
-<span class="sourceLineNo">2881</span>    // Verify result<a name="line.2881"></a>
-<span class="sourceLineNo">2882</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.2882"></a>
-<span class="sourceLineNo">2883</span>      assertEquals(expected.get(i), actual.get(i));<a name="line.2883"></a>
-<span class="sourceLineNo">2884</span>    }<a name="line.2884"></a>
-<span class="sourceLineNo">2885</span>  }<a name="line.2885"></a>
-<span class="sourceLineNo">2886</span><a name="line.2886"></a>
-<span class="sourceLineNo">2887</span>  @Test<a name="line.2887"></a>
-<span class="sourceLineNo">2888</span>  public void testScanner_ExplicitColumns_FromFilesOnly_EnforceVersions() throws IOException {<a name="line.2888"></a>
-<span class="sourceLineNo">2889</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2889"></a>
-<span class="sourceLineNo">2890</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.2890"></a>
-<span class="sourceLineNo">2891</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.2891"></a>
-<span class="sourceLineNo">2892</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2892"></a>
-<span class="sourceLineNo">2893</span>    byte[][] families = { fam1 };<a name="line.2893"></a>
-<span class="sourceLineNo">2894</span><a name="line.2894"></a>
-<span class="sourceLineNo">2895</span>    long ts1 = 1; // System.currentTimeMillis();<a name="line.2895"></a>
-<span class="sourceLineNo">2896</span>    long ts2 = ts1 + 1;<a name="line.2896"></a>
-<span class="sourceLineNo">2897</span>    long ts3 = ts1 + 2;<a name="line.2897"></a>
-<span class="sourceLineNo">2898</span><a name="line.2898"></a>
-<span class="sourceLineNo">2899</span>    // Setting up region<a name="line.2899"></a>
-<span class="sourceLineNo">2900</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2900"></a>
-<span class="sourceLineNo">2901</span>    // Putting data in Region<a name="line.2901"></a>
-<span class="sourceLineNo">2902</span>    Put put = null;<a name="line.2902"></a>
-<span class="sourceLineNo">2903</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.2903"></a>
-<span class="sourceLineNo">2904</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.2904"></a>
-<span class="sourceLineNo">2905</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.2905"></a>
-<span class="sourceLineNo">2906</span><a name="line.2906"></a>
-<span class="sourceLineNo">2907</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.2907"></a>
-<span class="sourceLineNo">2908</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.2908"></a>
-<span class="sourceLineNo">2909</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.2909"></a>
-<span class="sourceLineNo">2910</span><a name="line.2910"></a>
-<span class="sourceLineNo">2911</span>    put = new Put(row1);<a name="line.2911"></a>
-<span class="sourceLineNo">2912</span>    put.add(kv13);<a name="line.2912"></a>
-<span class="sourceLineNo">2913</span>    put.add(kv12);<a name="line.2913"></a>
-<span class="sourceLineNo">2914</span>    put.add(kv11);<a name="line.2914"></a>
-<span class="sourceLineNo">2915</span>    put.add(kv23);<a name="line.2915"></a>
-<span class="sourceLineNo">2916</span>    put.add(kv22);<a name="line.2916"></a>
-<span class="sourceLineNo">2917</span>    put.add(kv21);<a name="line.2917"></a>
-<span class="sourceLineNo">2918</span>    region.put(put);<a name="line.2918"></a>
-<span class="sourceLineNo">2919</span>    region.flush(true);<a name="line.2919"></a>
+<span class="sourceLineNo">2768</span>      e.printStackTrace();<a name="line.2768"></a>
+<span class="sourceLineNo">2769</span>      fail("Got IOException during initHRegion, " + e.getMessage());<a name="line.2769"></a>
+<span class="sourceLineNo">2770</span>    }<a name="line.2770"></a>
+<span class="sourceLineNo">2771</span>    region.closed.set(true);<a name="line.2771"></a>
+<span class="sourceLineNo">2772</span>    try {<a name="line.2772"></a>
+<span class="sourceLineNo">2773</span>      region.getScanner(null);<a name="line.2773"></a>
+<span class="sourceLineNo">2774</span>      fail("Expected to get an exception during getScanner on a region that is closed");<a name="line.2774"></a>
+<span class="sourceLineNo">2775</span>    } catch (NotServingRegionException e) {<a name="line.2775"></a>
+<span class="sourceLineNo">2776</span>      // this is the correct exception that is expected<a name="line.2776"></a>
+<span class="sourceLineNo">2777</span>    } catch (IOException e) {<a name="line.2777"></a>
+<span class="sourceLineNo">2778</span>      fail("Got wrong type of exception - should be a NotServingRegionException, " +<a name="line.2778"></a>
+<span class="sourceLineNo">2779</span>          "but was an IOException: "<a name="line.2779"></a>
+<span class="sourceLineNo">2780</span>          + e.getMessage());<a name="line.2780"></a>
+<span class="sourceLineNo">2781</span>    }<a name="line.2781"></a>
+<span class="sourceLineNo">2782</span>  }<a name="line.2782"></a>
+<span class="sourceLineNo">2783</span><a name="line.2783"></a>
+<span class="sourceLineNo">2784</span>  @Test<a name="line.2784"></a>
+<span class="sourceLineNo">2785</span>  public void testRegionScanner_Next() throws IOException {<a name="line.2785"></a>
+<span class="sourceLineNo">2786</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2786"></a>
+<span class="sourceLineNo">2787</span>    byte[] row2 = Bytes.toBytes("row2");<a name="line.2787"></a>
+<span class="sourceLineNo">2788</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2788"></a>
+<span class="sourceLineNo">2789</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2789"></a>
+<span class="sourceLineNo">2790</span>    byte[] fam3 = Bytes.toBytes("fam3");<a name="line.2790"></a>
+<span class="sourceLineNo">2791</span>    byte[] fam4 = Bytes.toBytes("fam4");<a name="line.2791"></a>
+<span class="sourceLineNo">2792</span><a name="line.2792"></a>
+<span class="sourceLineNo">2793</span>    byte[][] families = { fam1, fam2, fam3, fam4 };<a name="line.2793"></a>
+<span class="sourceLineNo">2794</span>    long ts = System.currentTimeMillis();<a name="line.2794"></a>
+<span class="sourceLineNo">2795</span><a name="line.2795"></a>
+<span class="sourceLineNo">2796</span>    // Setting up region<a name="line.2796"></a>
+<span class="sourceLineNo">2797</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2797"></a>
+<span class="sourceLineNo">2798</span>    // Putting data in Region<a name="line.2798"></a>
+<span class="sourceLineNo">2799</span>    Put put = null;<a name="line.2799"></a>
+<span class="sourceLineNo">2800</span>    put = new Put(row1);<a name="line.2800"></a>
+<span class="sourceLineNo">2801</span>    put.addColumn(fam1, (byte[]) null, ts, null);<a name="line.2801"></a>
+<span class="sourceLineNo">2802</span>    put.addColumn(fam2, (byte[]) null, ts, null);<a name="line.2802"></a>
+<span class="sourceLineNo">2803</span>    put.addColumn(fam3, (byte[]) null, ts, null);<a name="line.2803"></a>
+<span class="sourceLineNo">2804</span>    put.addColumn(fam4, (byte[]) null, ts, null);<a name="line.2804"></a>
+<span class="sourceLineNo">2805</span>    region.put(put);<a name="line.2805"></a>
+<span class="sourceLineNo">2806</span><a name="line.2806"></a>
+<span class="sourceLineNo">2807</span>    put = new Put(row2);<a name="line.2807"></a>
+<span class="sourceLineNo">2808</span>    put.addColumn(fam1, (byte[]) null, ts, null);<a name="line.2808"></a>
+<span class="sourceLineNo">2809</span>    put.addColumn(fam2, (byte[]) null, ts, null);<a name="line.2809"></a>
+<span class="sourceLineNo">2810</span>    put.addColumn(fam3, (byte[]) null, ts, null);<a name="line.2810"></a>
+<span class="sourceLineNo">2811</span>    put.addColumn(fam4, (byte[]) null, ts, null);<a name="line.2811"></a>
+<span class="sourceLineNo">2812</span>    region.put(put);<a name="line.2812"></a>
+<span class="sourceLineNo">2813</span><a name="line.2813"></a>
+<span class="sourceLineNo">2814</span>    Scan scan = new Scan();<a name="line.2814"></a>
+<span class="sourceLineNo">2815</span>    scan.addFamily(fam2);<a name="line.2815"></a>
+<span class="sourceLineNo">2816</span>    scan.addFamily(fam4);<a name="line.2816"></a>
+<span class="sourceLineNo">2817</span>    InternalScanner is = region.getScanner(scan);<a name="line.2817"></a>
+<span class="sourceLineNo">2818</span><a name="line.2818"></a>
+<span class="sourceLineNo">2819</span>    List&lt;Cell&gt; res = null;<a name="line.2819"></a>
+<span class="sourceLineNo">2820</span><a name="line.2820"></a>
+<span class="sourceLineNo">2821</span>    // Result 1<a name="line.2821"></a>
+<span class="sourceLineNo">2822</span>    List&lt;Cell&gt; expected1 = new ArrayList&lt;&gt;();<a name="line.2822"></a>
+<span class="sourceLineNo">2823</span>    expected1.add(new KeyValue(row1, fam2, null, ts, KeyValue.Type.Put, null));<a name="line.2823"></a>
+<span class="sourceLineNo">2824</span>    expected1.add(new KeyValue(row1, fam4, null, ts, KeyValue.Type.Put, null));<a name="line.2824"></a>
+<span class="sourceLineNo">2825</span><a name="line.2825"></a>
+<span class="sourceLineNo">2826</span>    res = new ArrayList&lt;&gt;();<a name="line.2826"></a>
+<span class="sourceLineNo">2827</span>    is.next(res);<a name="line.2827"></a>
+<span class="sourceLineNo">2828</span>    for (int i = 0; i &lt; res.size(); i++) {<a name="line.2828"></a>
+<span class="sourceLineNo">2829</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected1.get(i), res.get(i)));<a name="line.2829"></a>
+<span class="sourceLineNo">2830</span>    }<a name="line.2830"></a>
+<span class="sourceLineNo">2831</span><a name="line.2831"></a>
+<span class="sourceLineNo">2832</span>    // Result 2<a name="line.2832"></a>
+<span class="sourceLineNo">2833</span>    List&lt;Cell&gt; expected2 = new ArrayList&lt;&gt;();<a name="line.2833"></a>
+<span class="sourceLineNo">2834</span>    expected2.add(new KeyValue(row2, fam2, null, ts, KeyValue.Type.Put, null));<a name="line.2834"></a>
+<span class="sourceLineNo">2835</span>    expected2.add(new KeyValue(row2, fam4, null, ts, KeyValue.Type.Put, null));<a name="line.2835"></a>
+<span class="sourceLineNo">2836</span><a name="line.2836"></a>
+<span class="sourceLineNo">2837</span>    res = new ArrayList&lt;&gt;();<a name="line.2837"></a>
+<span class="sourceLineNo">2838</span>    is.next(res);<a name="line.2838"></a>
+<span class="sourceLineNo">2839</span>    for (int i = 0; i &lt; res.size(); i++) {<a name="line.2839"></a>
+<span class="sourceLineNo">2840</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected2.get(i), res.get(i)));<a name="line.2840"></a>
+<span class="sourceLineNo">2841</span>    }<a name="line.2841"></a>
+<span class="sourceLineNo">2842</span>  }<a name="line.2842"></a>
+<span class="sourceLineNo">2843</span><a name="line.2843"></a>
+<span class="sourceLineNo">2844</span>  @Test<a name="line.2844"></a>
+<span class="sourceLineNo">2845</span>  public void testScanner_ExplicitColumns_FromMemStore_EnforceVersions() throws IOException {<a name="line.2845"></a>
+<span class="sourceLineNo">2846</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2846"></a>
+<span class="sourceLineNo">2847</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.2847"></a>
+<span class="sourceLineNo">2848</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.2848"></a>
+<span class="sourceLineNo">2849</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2849"></a>
+<span class="sourceLineNo">2850</span>    byte[][] families = { fam1 };<a name="line.2850"></a>
+<span class="sourceLineNo">2851</span><a name="line.2851"></a>
+<span class="sourceLineNo">2852</span>    long ts1 = System.currentTimeMillis();<a name="line.2852"></a>
+<span class="sourceLineNo">2853</span>    long ts2 = ts1 + 1;<a name="line.2853"></a>
+<span class="sourceLineNo">2854</span>    long ts3 = ts1 + 2;<a name="line.2854"></a>
+<span class="sourceLineNo">2855</span><a name="line.2855"></a>
+<span class="sourceLineNo">2856</span>    // Setting up region<a name="line.2856"></a>
+<span class="sourceLineNo">2857</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2857"></a>
+<span class="sourceLineNo">2858</span>    // Putting data in Region<a name="line.2858"></a>
+<span class="sourceLineNo">2859</span>    Put put = null;<a name="line.2859"></a>
+<span class="sourceLineNo">2860</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.2860"></a>
+<span class="sourceLineNo">2861</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.2861"></a>
+<span class="sourceLineNo">2862</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.2862"></a>
+<span class="sourceLineNo">2863</span><a name="line.2863"></a>
+<span class="sourceLineNo">2864</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.2864"></a>
+<span class="sourceLineNo">2865</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.2865"></a>
+<span class="sourceLineNo">2866</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.2866"></a>
+<span class="sourceLineNo">2867</span><a name="line.2867"></a>
+<span class="sourceLineNo">2868</span>    put = new Put(row1);<a name="line.2868"></a>
+<span class="sourceLineNo">2869</span>    put.add(kv13);<a name="line.2869"></a>
+<span class="sourceLineNo">2870</span>    put.add(kv12);<a name="line.2870"></a>
+<span class="sourceLineNo">2871</span>    put.add(kv11);<a name="line.2871"></a>
+<span class="sourceLineNo">2872</span>    put.add(kv23);<a name="line.2872"></a>
+<span class="sourceLineNo">2873</span>    put.add(kv22);<a name="line.2873"></a>
+<span class="sourceLineNo">2874</span>    put.add(kv21);<a name="line.2874"></a>
+<span class="sourceLineNo">2875</span>    region.put(put);<a name="line.2875"></a>
+<span class="sourceLineNo">2876</span><a name="line.2876"></a>
+<span class="sourceLineNo">2877</span>    // Expected<a name="line.2877"></a>
+<span class="sourceLineNo">2878</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.2878"></a>
+<span class="sourceLineNo">2879</span>    expected.add(kv13);<a name="line.2879"></a>
+<span class="sourceLineNo">2880</span>    expected.add(kv12);<a name="line.2880"></a>
+<span class="sourceLineNo">2881</span><a name="line.2881"></a>
+<span class="sourceLineNo">2882</span>    Scan scan = new Scan(row1);<a name="line.2882"></a>
+<span class="sourceLineNo">2883</span>    scan.addColumn(fam1, qf1);<a name="line.2883"></a>
+<span class="sourceLineNo">2884</span>    scan.setMaxVersions(MAX_VERSIONS);<a name="line.2884"></a>
+<span class="sourceLineNo">2885</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.2885"></a>
+<span class="sourceLineNo">2886</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.2886"></a>
+<span class="sourceLineNo">2887</span><a name="line.2887"></a>
+<span class="sourceLineNo">2888</span>    boolean hasNext = scanner.next(actual);<a name="line.2888"></a>
+<span class="sourceLineNo">2889</span>    assertEquals(false, hasNext);<a name="line.2889"></a>
+<span class="sourceLineNo">2890</span><a name="line.2890"></a>
+<span class="sourceLineNo">2891</span>    // Verify result<a name="line.2891"></a>
+<span class="sourceLineNo">2892</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.2892"></a>
+<span class="sourceLineNo">2893</span>      assertEquals(expected.get(i), actual.get(i));<a name="line.2893"></a>
+<span class="sourceLineNo">2894</span>    }<a name="line.2894"></a>
+<span class="sourceLineNo">2895</span>  }<a name="line.2895"></a>
+<span class="sourceLineNo">2896</span><a name="line.2896"></a>
+<span class="sourceLineNo">2897</span>  @Test<a name="line.2897"></a>
+<span class="sourceLineNo">2898</span>  public void testScanner_ExplicitColumns_FromFilesOnly_EnforceVersions() throws IOException {<a name="line.2898"></a>
+<span class="sourceLineNo">2899</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2899"></a>
+<span class="sourceLineNo">2900</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.2900"></a>
+<span class="sourceLineNo">2901</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.2901"></a>
+<span class="sourceLineNo">2902</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2902"></a>
+<span class="sourceLineNo">2903</span>    byte[][] families = { fam1 };<a name="line.2903"></a>
+<span class="sourceLineNo">2904</span><a name="line.2904"></a>
+<span class="sourceLineNo">2905</span>    long ts1 = 1; // System.currentTimeMillis();<a name="line.2905"></a>
+<span class="sourceLineNo">2906</span>    long ts2 = ts1 + 1;<a name="line.2906"></a>
+<span class="sourceLineNo">2907</span>    long ts3 = ts1 + 2;<a name="line.2907"></a>
+<span class="sourceLineNo">2908</span><a name="line.2908"></a>
+<span class="sourceLineNo">2909</span>    // Setting up region<a name="line.2909"></a>
+<span class="sourceLineNo">2910</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2910"></a>
+<span class="sourceLineNo">2911</span>    // Putting data in Region<a name="line.2911"></a>
+<span class="sourceLineNo">2912</span>    Put put = null;<a name="line.2912"></a>
+<span class="sourceLineNo">2913</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.2913"></a>
+<span class="sourceLineNo">2914</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.2914"></a>
+<span class="sourceLineNo">2915</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.2915"></a>
+<span class="sourceLineNo">2916</span><a name="line.2916"></a>
+<span class="sourceLineNo">2917</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.2917"></a>
+<span class="sourceLineNo">2918</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.2918"></a>
+<span class="sourceLineNo">2919</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.2919"></a>
 <span class="sourceLineNo">2920</span><a name="line.2920"></a>
-<span class="sourceLineNo">2921</span>    // Expected<a name="line.2921"></a>
-<span class="sourceLineNo">2922</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.2922"></a>
-<span class="sourceLineNo">2923</span>    expected.add(kv13);<a name="line.2923"></a>
-<span class="sourceLineNo">2924</span>    expected.add(kv12);<a name="line.2924"></a>
-<span class="sourceLineNo">2925</span>    expected.add(kv23);<a name="line.2925"></a>
-<span class="sourceLineNo">2926</span>    expected.add(kv22);<a name="line.2926"></a>
-<span class="sourceLineNo">2927</span><a name="line.2927"></a>
-<span class="sourceLineNo">2928</span>    Scan scan = new Scan(row1);<a name="line.2928"></a>
-<span class="sourceLineNo">2929</span>    scan.addColumn(fam1, qf1);<a name="line.2929"></a>
-<span class="sourceLineNo">2930</span>    scan.addColumn(fam1, qf2);<a name="line.2930"></a>
-<span class="sourceLineNo">2931</span>    scan.setMaxVersions(MAX_VERSIONS);<a name="line.2931"></a>
-<span class="sourceLineNo">2932</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.2932"></a>
-<span class="sourceLineNo">2933</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.2933"></a>
-<span class="sourceLineNo">2934</span><a name="line.2934"></a>
-<span class="sourceLineNo">2935</span>    boolean hasNext = scanner.next(actual);<a name="line.2935"></a>
-<span class="sourceLineNo">2936</span>    assertEquals(false, hasNext);<a name="line.2936"></a>
+<span class="sourceLineNo">2921</span>    put = new Put(row1);<a name="line.2921"></a>
+<span class="sourceLineNo">2922</span>    put.add(kv13);<a name="line.2922"></a>
+<span class="sourceLineNo">2923</span>    put.add(kv12);<a name="line.2923"></a>
+<span class="sourceLineNo">2924</span>    put.add(kv11);<a name="line.2924"></a>
+<span class="sourceLineNo">2925</span>    put.add(kv23);<a name="line.2925"></a>
+<span class="sourceLineNo">2926</span>    put.add(kv22);<a name="line.2926"></a>
+<span class="sourceLineNo">2927</span>    put.add(kv21);<a name="line.2927"></a>
+<span class="sourceLineNo">2928</span>    region.put(put);<a name="line.2928"></a>
+<span class="sourceLineNo">2929</span>    region.flush(true);<a name="line.2929"></a>
+<span class="sourceLineNo">2930</span><a name="line.2930"></a>
+<span class="sourceLineNo">2931</span>    // Expected<a name="line.2931"></a>
+<span class="sourceLineNo">2932</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.2932"></a>
+<span class="sourceLineNo">2933</span>    expected.add(kv13);<a name="line.2933"></a>
+<span class="sourceLineNo">2934</span>    expected.add(kv12);<a name="line.2934"></a>
+<span class="sourceLineNo">2935</span>    expected.add(kv23);<a name="line.2935"></a>
+<span class="sourceLineNo">2936</span>    expected.add(kv22);<a name="line.2936"></a>
 <span class="sourceLineNo">2937</span><a name="line.2937"></a>
-<span class="sourceLineNo">2938</span>    // Verify result<a name="line.2938"></a>
-<span class="sourceLineNo">2939</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.2939"></a>
-<span class="sourceLineNo">2940</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected.get(i), actual.get(i)));<a name="line.2940"></a>
-<span class="sourceLineNo">2941</span>    }<a name="line.2941"></a>
-<span class="sourceLineNo">2942</span>  }<a name="line.2942"></a>
-<span class="sourceLineNo">2943</span><a name="line.2943"></a>
-<span class="sourceLineNo">2944</span>  @Test<a name="line.2944"></a>
-<span class="sourceLineNo">2945</span>  public void testScanner_ExplicitColumns_FromMemStoreAndFiles_EnforceVersions() throws<a name="line.2945"></a>
-<span class="sourceLineNo">2946</span>      IOException {<a name="line.2946"></a>
-<span class="sourceLineNo">2947</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2947"></a>
-<span class="sourceLineNo">2948</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2948"></a>
-<span class="sourceLineNo">2949</span>    byte[][] families = { fam1 };<a name="line.2949"></a>
-<span class="sourceLineNo">2950</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.2950"></a>
-<span class="sourceLineNo">2951</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.2951"></a>
-<span class="sourceLineNo">2952</span><a name="line.2952"></a>
-<span class="sourceLineNo">2953</span>    long ts1 = 1;<a name="line.2953"></a>
-<span class="sourceLineNo">2954</span>    long ts2 = ts1 + 1;<a name="line.2954"></a>
-<span class="sourceLineNo">2955</span>    long ts3 = ts1 + 2;<a name="line.2955"></a>
-<span class="sourceLineNo">2956</span>    long ts4 = ts1 + 3;<a name="line.2956"></a>
-<span class="sourceLineNo">2957</span><a name="line.2957"></a>
-<span class="sourceLineNo">2958</span>    // Setting up region<a name="line.2958"></a>
-<span class="sourceLineNo">2959</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2959"></a>
-<span class="sourceLineNo">2960</span>    // Putting data in Region<a name="line.2960"></a>
-<span class="sourceLineNo">2961</span>    KeyValue kv14 = new KeyValue(row1, fam1, qf1, ts4, KeyValue.Type.Put, null);<a name="line.2961"></a>
-<span class="sourceLineNo">2962</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.2962"></a>
-<span class="sourceLineNo">2963</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.2963"></a>
-<span class="sourceLineNo">2964</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.2964"></a>
-<span class="sourceLineNo">2965</span><a name="line.2965"></a>
-<span class="sourceLineNo">2966</span>    KeyValue kv24 = new KeyValue(row1, fam1, qf2, ts4, KeyValue.Type.Put, null);<a name="line.2966"></a>
-<span class="sourceLineNo">2967</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.2967"></a>
-<span class="sourceLineNo">2968</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.2968"></a>
-<span class="sourceLineNo">2969</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.2969"></a>
-<span class="sourceLineNo">2970</span><a name="line.2970"></a>
-<span class="sourceLineNo">2971</span>    Put put = null;<a name="line.2971"></a>
-<span class="sourceLineNo">2972</span>    put = new Put(row1);<a name="line.2972"></a>
-<span class="sourceLineNo">2973</span>    put.add(kv14);<a name="line.2973"></a>
-<span class="sourceLineNo">2974</span>    put.add(kv24);<a name="line.2974"></a>
-<span class="sourceLineNo">2975</span>    region.put(put);<a name="line.2975"></a>
-<span class="sourceLineNo">2976</span>    region.flush(true);<a name="line.2976"></a>
-<span class="sourceLineNo">2977</span><a name="line.2977"></a>
-<span class="sourceLineNo">2978</span>    put = new Put(row1);<a name="line.2978"></a>
-<span class="sourceLineNo">2979</span>    put.add(kv23);<a name="line.2979"></a>
-<span class="sourceLineNo">2980</span>    put.add(kv13);<a name="line.2980"></a>
-<span class="sourceLineNo">2981</span>    region.put(put);<a name="line.2981"></a>
-<span class="sourceLineNo">2982</span>    region.flush(true);<a name="line.2982"></a>
-<span class="sourceLineNo">2983</span><a name="line.2983"></a>
-<span class="sourceLineNo">2984</span>    put = new Put(row1);<a name="line.2984"></a>
-<span class="sourceLineNo">2985</span>    put.add(kv22);<a name="line.2985"></a>
-<span class="sourceLineNo">2986</span>    put.add(kv12);<a name="line.2986"></a>
-<span class="sourceLineNo">2987</span>    region.put(put);<a name="line.2987"></a>
-<span class="sourceLineNo">2988</span>    region.flush(true);<a name="line.2988"></a>
-<span class="sourceLineNo">2989</span><a name="line.2989"></a>
-<span class="sourceLineNo">2990</span>    put = new Put(row1);<a name="line.2990"></a>
-<span class="sourceLineNo">2991</span>    put.add(kv21);<a name="line.2991"></a>
-<span class="sourceLineNo">2992</span>    put.add(kv11);<a name="line.2992"></a>
-<span class="sourceLineNo">2993</span>    region.put(put);<a name="line.2993"></a>
-<span class="sourceLineNo">2994</span><a name="line.2994"></a>
-<span class="sourceLineNo">2995</span>    // Expected<a name="line.2995"></a>
-<span class="sourceLineNo">2996</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.2996"></a>
-<span class="sourceLineNo">2997</span>    expected.add(kv14);<a name="line.2997"></a>
-<span class="sourceLineNo">2998</span>    expected.add(kv13);<a name="line.2998"></a>
-<span class="sourceLineNo">2999</span>    expected.add(kv12);<a name="line.2999"></a>
-<span class="sourceLineNo">3000</span>    expected.add(kv24);<a name="line.3000"></a>
-<span class="sourceLineNo">3001</span>    expected.add(kv23);<a name="line.3001"></a>
-<span class="sourceLineNo">3002</span>    expected.add(kv22);<a name="line.3002"></a>
-<span class="sourceLineNo">3003</span><a name="line.3003"></a>
-<span class="sourceLineNo">3004</span>    Scan scan = new Scan(row1);<a name="line.3004"></a>
-<span class="sourceLineNo">3005</span>    scan.addColumn(fam1, qf1);<a name="line.3005"></a>
-<span class="sourceLineNo">3006</span>    scan.addColumn(fam1, qf2);<a name="line.3006"></a>
-<span class="sourceLineNo">3007</span>    int versions = 3;<a name="line.3007"></a>
-<span class="sourceLineNo">3008</span>    scan.setMaxVersions(versions);<a name="line.3008"></a>
-<span class="sourceLineNo">3009</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.3009"></a>
-<span class="sourceLineNo">3010</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.3010"></a>
-<span class="sourceLineNo">3011</span><a name="line.3011"></a>
-<span class="sourceLineNo">3012</span>    boolean hasNext = scanner.next(actual);<a name="line.3012"></a>
-<span class="sourceLineNo">3013</span>    assertEquals(false, hasNext);<a name="line.3013"></a>
-<span class="sourceLineNo">3014</span><a name="line.3014"></a>
-<span class="sourceLineNo">3015</span>    // Verify result<a name="line.3015"></a>
-<span class="sourceLineNo">3016</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.3016"></a>
-<span class="sourceLineNo">3017</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected.get(i), actual.get(i)));<a name="line.3017"></a>
-<span class="sourceLineNo">3018</span>    }<a name="line.3018"></a>
-<span class="sourceLineNo">3019</span>  }<a name="line.3019"></a>
-<span class="sourceLineNo">3020</span><a name="line.3020"></a>
-<span class="sourceLineNo">3021</span>  @Test<a name="line.3021"></a>
-<span class="sourceLineNo">3022</span>  public void testScanner_Wildcard_FromMemStore_EnforceVersions() throws IOException {<a name="line.3022"></a>
-<span class="sourceLineNo">3023</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.3023"></a>
-<span class="sourceLineNo">3024</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.3024"></a>
-<span class="sourceLineNo">3025</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.3025"></a>
-<span class="sourceLineNo">3026</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.3026"></a>
-<span class="sourceLineNo">3027</span>    byte[][] families = { fam1 };<a name="line.3027"></a>
-<span class="sourceLineNo">3028</span><a name="line.3028"></a>
-<span class="sourceLineNo">3029</span>    long ts1 = System.currentTimeMillis();<a name="line.3029"></a>
-<span class="sourceLineNo">3030</span>    long ts2 = ts1 + 1;<a name="line.3030"></a>
-<span class="sourceLineNo">3031</span>    long ts3 = ts1 + 2;<a name="line.3031"></a>
-<span class="sourceLineNo">3032</span><a name="line.3032"></a>
-<span class="sourceLineNo">3033</span>    // Setting up region<a name="line.3033"></a>
-<span class="sourceLineNo">3034</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.3034"></a>
-<span class="sourceLineNo">3035</span>    // Putting data in Region<a name="line.3035"></a>
-<span class="sourceLineNo">3036</span>    Put put = null;<a name="line.3036"></a>
-<span class="sourceLineNo">3037</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.3037"></a>
-<span class="sourceLineNo">3038</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.3038"></a>
-<span class="sourceLineNo">3039</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.3039"></a>
-<span class="sourceLineNo">3040</span><a name="line.3040"></a>
-<span class="sourceLineNo">3041</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.3041"></a>
-<span class="sourceLineNo">3042</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.3042"></a>
-<span class="sourceLineNo">3043</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.3043"></a>
-<span class="sourceLineNo">3044</span><a name="line.3044"></a>
-<span class="sourceLineNo">3045</span>    put = new Put(row1);<a name="line.3045"></a>
-<span class="sourceLineNo">3046</span>    put.add(kv13);<a name="line.3046"></a>
-<span class="sourceLineNo">3047</span>    put.add(kv12);<a name="line.3047"></a>
-<span class="sourceLineNo">3048</span>    put.add(kv11);<a name="line.3048"></a>
-<span class="sourceLineNo">3049</span>    put.add(kv23);<a name="line.3049"></a>
-<span class="sourceLineNo">3050</span>    put.add(kv22);<a name="line.3050"></a>
-<span class="sourceLineNo">3051</span>    put.add(kv21);<a name="line.3051"></a>
-<span class="sourceLineNo">3052</span>    region.put(put);<a name="line.3052"></a>
-<span class="sourceLineNo">3053</span><a name="line.3053"></a>
-<span class="sourceLineNo">3054</span>    // Expected<a name="line.3054"></a>
-<span class="sourceLineNo">3055</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.3055"></a>
-<span class="sourceLineNo">3056</span>    expected.add(kv13);<a name="line.3056"></a>
-<span class="sourceLineNo">3057</span>    expected.add(kv12);<a name="line.3057"></a>
-<span class="sourceLineNo">3058</span>    expected.add(kv23);<a name="line.3058"></a>
-<span class="sourceLineNo">3059</span>    expected.add(kv22);<a name="line.3059"></a>
-<span class="sourceLineNo">3060</span><a name="line.3060"></a>
-<span class="sourceLineNo">3061</span>    Scan scan = new Scan(row1);<a name="line.3061"></a>
-<span class="sourceLineNo">3062</span>    scan.addFamily(fam1);<a name="line.3062"></a>
-<span class="sourceLineNo">3063</span>    scan.setMaxVersions(MAX_VERSIONS);<a name="line.3063"></a>
-<span class="sourceLineNo">3064</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.3064"></a>
-<span class="sourceLineNo">3065</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.3065"></a>
-<span class="sourceLineNo">3066</span><a name="line.3066"></a>
-<span class="sourceLineNo">3067</span>    boolean hasNext = scanner.next(actual);<a name="line.3067"></a>
-<span class="sourceLineNo">3068</span>    assertEquals(false, hasNext);<a name="line.3068"></a>
-<span class="sourceLineNo">3069</span><a name="line.3069"></a>
-<span class="sourceLineNo">3070</span>    // Verify result<a name="line.3070"></a>
-<span class="sourceLineNo">3071</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.3071"></a>
-<span class="sourceLineNo">3072</span>      assertEquals(expected.get(i), actual.get(i));<a name="line.3072"></a>
-<span class="sourceLineNo">3073</span>    }<a name="line.3073"></a>
-<span class="sourceLineNo">3074</span>  }<a name="line.3074"></a>
-<span class="sourceLineNo">3075</span><a name="line.3075"></a>
-<span class="sourceLineNo">3076</span>  @Test<a name="line.3076"></a>
-<span class="sourceLineNo">3077</span>  public void testScanner_Wildcard_FromFilesOnly_EnforceVersions() throws IOException {<a name="line.3077"></a>
-<span class="sourceLineNo">3078</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.3078"></a>
-<span class="sourceLineNo">3079</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.3079"></a>
-<span class="sourceLineNo">3080</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.3080"></a>
-<span class="sourceLineNo">3081</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.3081"></a>
-<span class="sourceLineNo">3082</span><a name="line.3082"></a>
-<span class="sourceLineNo">3083</span>    long ts1 = 1; // System.currentTimeMillis();<a name="line.3083"></a>
-<span class="sourceLineNo">3084</span>    long ts2 = ts1 + 1;<a name="line.3084"></a>
-<span class="sourceLineNo">3085</span>    long ts3 = ts1 + 2;<a name="line.3085"></a>
-<span class="sourceLineNo">3086</span><a name="line.3086"></a>
-<span class="sourceLineNo">3087</span>    // Setting up region<a name="line.3087"></a>
-<span class="sourceLineNo">3088</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.3088"></a>
-<span class="sourceLineNo">3089</span>    // Putting data in Region<a name="line.3089"></a>
-<span class="sourceLineNo">3090</span>    Put put = null;<a name="line.3090"></a>
-<span class="sourceLineNo">3091</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.3091"></a>
-<span class="sourceLineNo">3092</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.3092"></a>
-<span class="sourceLineNo">3093</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.3093"></a>
-<span class="sourceLineNo">3094</span><a name="line.3094"></a>
-<span class="sourceLineNo">3095</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.3095"></a>
-<span class="sourceLineNo">3096</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.3096"></a>
-<span class="sourceLineNo">3097</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.3097"></a>
-<span class="sourceLineNo">3098</span><a name="line.3098"></a>
-<span class="sourceLineNo">3099</span>    put = new Put(row1);<a name="line.3099"></a>
-<span class="sourceLineNo">3100</span>    put.add(kv13);<a name="line.3100"></a>
-<span class="sourceLineNo">3101</span>    put.add(kv12);<a name="line.3101"></a>
-<span class="sourceLineNo">3102</span>    put.add(kv11);<a name="line.3102"></a>
-<span class="sourceLineNo">3103</span>    put.add(kv23);<a name="line.3103"></a>
-<span class="sourceLineNo">3104</span>    put.add(kv22);<a name="line.3104"></a>
-<span class="sourceLineNo">3105</span>    put.add(kv21);<a name="line.3105"></a>
-<span class="sourceLineNo">3106</span>    region.put(put);<a name="line.3106"></a>
-<span class="sourceLineNo">3107</span>    region.flush(true);<a name="line.3107"></a>
+<span class="sourceLineNo">2938</span>    Scan scan = new Scan(row1);<a name="line.2938"></a>
+<span class="sourceLineNo">2939</span>    scan.addColumn(fam1, qf1);<a name="line.2939"></a>
+<span class="sourceLineNo">2940</span>    scan.addColumn(fam1, qf2);<a name="line.2940"></a>
+<span class="sourceLineNo">2941</span>    scan.setMaxVersions(MAX_VERSIONS);<a name="line.2941"></a>
+<span class="sourceLineNo">2942</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.2942"></a>
+<span class="sourceLineNo">2943</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.2943"></a>
+<span class="sourceLineNo">2944</span><a name="line.2944"></a>
+<span class="sourceLineNo">2945</span>    boolean hasNext = scanner.next(actual);<a name="line.2945"></a>
+<span class="sourceLineNo">2946</span>    assertEquals(false, hasNext);<a name="line.2946"></a>
+<span class="sourceLineNo">2947</span><a name="line.2947"></a>
+<span class="sourceLineNo">2948</span>    // Verify result<a name="line.2948"></a>
+<span class="sourceLineNo">2949</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.2949"></a>
+<span class="sourceLineNo">2950</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected.get(i), actual.get(i)));<a name="line.2950"></a>
+<span class="sourceLineNo">2951</span>    }<a name="line.2951"></a>
+<span class="sourceLineNo">2952</span>  }<a name="line.2952"></a>
+<span class="sourceLineNo">2953</span><a name="line.2953"></a>
+<span class="sourceLineNo">2954</span>  @Test<a name="line.2954"></a>
+<span class="sourceLineNo">2955</span>  public void testScanner_ExplicitColumns_FromMemStoreAndFiles_EnforceVersions() throws<a name="line.2955"></a>
+<span class="sourceLineNo">2956</span>      IOException {<a name="line.2956"></a>
+<span class="sourceLineNo">2957</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2957"></a>
+<span class="sourceLineNo">2958</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2958"></a>
+<span class="sourceLineNo">2959</span>    byte[][] families = { fam1 };<a name="line.2959"></a>
+<span class="sourceLineNo">2960</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.2960"></a>
+<span class="sourceLineNo">2961</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.2961"></a>
+<span class="sourceLineNo">2962</span><a name="line.2962"></a>
+<span class="sourceLineNo">2963</span>    long ts1 = 1;<a name="line.2963"></a>
+<span class="sourceLineNo">2964</span>    long ts2 = ts1 + 1;<a name="line.2964"></a>
+<span class="sourceLineNo">2965</span>    long ts3 = ts1 + 2;<a name="line.2965"></a>
+<span class="sourceLineNo">2966</span>    long ts4 = ts1 + 3;<a name="line.2966"></a>
+<span class="sourceLineNo">2967</span><a name="line.2967"></a>
+<span class="sourceLineNo">2968</span>    // Setting up region<a name="line.2968"></a>
+<span class="sourceLineNo">2969</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2969"></a>
+<span class="sourceLineNo">2970</span>    // Putting data in Region<a name="line.2970"></a>
+<span class="sourceLineNo">2971</span>    KeyValue kv14 = new KeyValue(row1, fam1, qf1, ts4, KeyValue.Type.Put, null);<a name="line.2971"></a>
+<span class="sourceLineNo">2972</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.2972"></a>
+<span class="sourceLineNo">2973</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.2973"></a>
+<span class="sourceLineNo">2974</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.2974"></a>
+<span class="sourceLineNo">2975</span><a name="line.2975"></a>
+<span class="sourceLineNo">2976</span>    KeyValue kv24 = new KeyValue(row1, fam1, qf2, ts4, KeyValue.Type.Put, null);<a name="line.2976"></a>
+<span class="sourceLineNo">2977</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.2977"></a>
+<span class="sourceLineNo">2978</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.2978"></a>
+<span class="sourceLineNo">2979</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.2979"></a>
+<span class="sourceLineNo">2980</span><a name="line.2980"></a>
+<span class="sourceLineNo">2981</span>    Put put = null;<a name="line.2981"></a>
+<span class="sourceLineNo">2982</span>    put = new Put(row1);<a name="line.2982"></a>
+<span class="sourceLineNo">2983</span>    put.add(kv14);<a name="line.2983"></a>
+<span class="sourceLineNo">2984</span>    put.add(kv24);<a name="line.2984"></a>
+<span class="sourceLineNo">2985</span>    region.put(put);<a name="line.2985"></a>
+<span class="sourceLineNo">2986</span>    region.flush(true);<a name="line.2986"></a>
+<span class="sourceLineNo">2987</span><a name="line.2987"></a>
+<span class="sourceLineNo">2988</span>    put = new Put(row1);<a name="line.2988"></a>
+<span class="sourceLineNo">2989</span>    put.add(kv23);<a name="line.2989"></a>
+<span class="sourceLineNo">2990</span>    put.add(kv13);<a name="line.2990"></a>
+<span class="sourceLineNo">2991</span>    region.put(put);<a name="line.2991"></a>
+<span class="sourceLineNo">2992</span>    region.flush(true);<a name="line.2992"></a>
+<span class="sourceLineNo">2993</span><a name="line.2993"></a>
+<span class="sourceLineNo">2994</span>    put = new Put(row1);<a name="line.2994"></a>
+<span class="sourceLineNo">2995</span>    put.add(kv22);<a name="line.2995"></a>
+<span class="sourceLineNo">2996</span>    put.add(kv12);<a name="line.2996"></a>
+<span class="sourceLineNo">2997</span>    region.put(put);<a name="line.2997"></a>
+<span class="sourceLineNo">2998</span>    region.flush(true);<a name="line.2998"></a>
+<span class="sourceLineNo">2999</span><a name="line.2999"></a>
+<span class="sourceLineNo">3000</span>    put = new Put(row1);<a name="line.3000"></a>
+<span class="sourceLineNo">3001</span>    put.add(kv21);<a name="line.3001"></a>
+<span class="sourceLineNo">3002</span>    put.add(kv11);<a name="line.3002"></a>
+<span class="sourceLineNo">3003</span>    region.put(put);<a name="line.3003"></a>
+<span class="sourceLineNo">3004</span><a name="line.3004"></a>
+<span class="sourceLineNo">3005</span>    // Expected<a name="line.3005"></a>
+<span class="sourceLineNo">3006</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.3006"></a>
+<span class="sourceLineNo">3007</span>    expected.add(kv14);<a name="line.3007"></a>
+<span class="sourceLineNo">3008</span>    expected.add(kv13);<a name="line.3008"></a>
+<span class="sourceLineNo">3009</span>    expected.add(kv12);<a name="line.3009"></a>
+<span class="sourceLineNo">3010</span>    expected.add(kv24);<a name="line.3010"></a>
+<span class="sourceLineNo">3011</span>    expected.add(kv23);<a name="line.3011"></a>
+<span class="sourceLineNo">3012</span>    expected.add(kv22);<a name="line.3012"></a>
+<span class="sourceLineNo">3013</span><a name="line.3013"></a>
+<span class="sourceLineNo">3014</span>    Scan scan = new Scan(row1);<a name="line.3014"></a>
+<span class="sourceLineNo">3015</span>    scan.addColumn(fam1, qf1);<a name="line.3015"></a>
+<span class="sourceLineNo">3016</span>    scan.addColumn(fam1, qf2);<a name="line.3016"></a>
+<span class="sourceLineNo">3017</span>    int versions = 3;<a name="line.3017"></a>
+<span class="sourceLineNo">3018</span>    scan.setMaxVersions(versions);<a name="line.3018"></a>
+<span class="sourceLineNo">3019</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.3019"></a>
+<span class="sourceLineNo">3020</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.3020"></a>
+<span class="sourceLineNo">3021</span><a name="line.3021"></a>
+<span class="sourceLineNo">3022</span>    boolean hasNext = scanner.next(actual);<a name="line.3022"></a>
+<span class="sourceLineNo">3023</span>    assertEquals(false, hasNext);<a name="line.3023"></a>
+<span class="sourceLineNo">3024</span><a name="line.3024"></a>
+<span class="sourceLineNo">3025</span>    // Verify result<a name="line.3025"></a>
+<span class="sourceLineNo">3026</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.3026"></a>
+<span class="sourceLineNo">3027</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected.get(i), actual.get(i)));<a name="line.3027"></a>
+<span class="sourceLineNo">3028</span>    }<a name="line.3028"></a>
+<span class="sourceLineNo">3029</span>  }<a name="line.3029"></a>
+<span class="sourceLineNo">3030</span><a name="line.3030"></a>
+<span class="sourceLineNo">3031</span>  @Test<a name="line.3031"></a>
+<span class="sourceLineNo">3032</span>  public void testScanner_Wildcard_FromMemStore_EnforceVersions() throws IOException {<a name="line.3032"></a>
+<span class="sourceLineNo">3033</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.3033"></a>
+<span class="sourceLineNo">3034</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.3034"></a>
+<span class="sourceLineNo">3035</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.3035"></a>
+<span class="sourceLineNo">3036</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.3036"></a>
+<span class="sourceLineNo">3037</span>    byte[][] families = { fam1 };<a name="line.3037"></a>
+<span class="sourceLineNo">3038</span><a name="line.3038"></a>
+<span class="sourceLineNo">3039</span>    long ts1 = System.currentTimeMillis();<a name="line.3039"></a>
+<span class="sourceLineNo">3040</span>    long ts2 = ts1 + 1;<a name="line.3040"></a>
+<span class="sourceLineNo">3041</span>    long ts3 = ts1 + 2;<a name="line.3041"></a>
+<span class="sourceLineNo">3042</span><a name="line.3042"></a>
+<span class="sourceLineNo">3043</span>    // Setting up region<a name="line.3043"></a>
+<span class="sourceLineNo">3044</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.3044"></a>
+<span class="sourceLineNo">3045</span>    // Putting data in Region<a name="line.3045"></a>
+<span class="sourceLineNo">3046</span>    Put put = null;<a name="line.3046"></a>
+<span class="sourceLineNo">3047</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.3047"></a>
+<span class="sourceLineNo">3048</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.3048"></a>
+<span class="sourceLineNo">3049</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.3049"></a>
+<span class="sourceLineNo">3050</span><a name="line.3050"></a>
+<span class="sourceLineNo">3051</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.3051"></a>
+<span class="sourceLineNo">3052</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.3052"></a>
+<span class="sourceLineNo">3053</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.3053"></a>
+<span class="sourceLineNo">3054</span><a name="line.3054"></a>
+<span class="sourceLineNo">3055</span>    put = new Put(row1);<a name="line.3055"></a>
+<span class="sourceLineNo">3056</span>    put.add(kv13);<a name="line.3056"></a>
+<span class="sourceLineNo">3057</span>    put.add(kv12);<a name="line.3057"></a>
+<span class="sourceLineNo">3058</span>    put.add(kv11);<a name="line.3058"></a>
+<span class="sourceLineNo">3059</span>    put.add(kv23);<a name="line.3059"></a>
+<span class="sourceLineNo">3060</span>    put.add(kv22);<a name="line.3060"></a>
+<span class="sourceLineNo">3061</span>    put.add(kv21);<a name="line.3061"></a>
+<span class="sourceLineNo">3062</span>    region.put(put);<a name="line.3062"></a>
+<span class="sourceLineNo">3063</span><a name="line.3063"></a>
+<span class="sourceLineNo">3064</span>    // Expected<a name="line.3064"></a>
+<span class="sourceLineNo">3065</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.3065"></a>
+<span class="sourceLineNo">3066</span>    expected.add(kv13);<a name="line.3066"></a>
+<span class="sourceLineNo">3067</span>    expected.add(kv12);<a name="line.3067"></a>
+<span class="sourceLineNo">3068</span>    expected.add(kv23);<a name="line.3068"></a>
+<span class="sourceLineNo">3069</span>    expected.add(kv22);<a name="line.3069"></a>
+<span class="sourceLineNo">3070</span><a name="line.3070"></a>
+<span class="sourceLineNo">3071</span>    Scan scan = new Scan(row1);<a name="line.3071"></a>
+<span class="sourceLineNo">3072</span>    scan.addFamily(fam1);<a name="line.3072"></a>
+<span class="sourceLineNo">3073</span>    scan.setMaxVersions(MAX_VERSIONS);<a name="line.3073"></a>
+<span class="sourceLineNo">3074</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.3074"></a>
+<span class="sourceLineNo">3075</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.3075"></a>
+<span class="sourceLineNo">3076</span><a name="line.3076"></a>
+<span class="sourceLineNo">3077</span>    boolean hasNext = scanner.next(actual);<a name="line.3077"></a>
+<span class="sourceLineNo">3078</span>    assertEquals(false, hasNext);<a name="line.3078"></a>
+<span class="sourceLineNo">3079</span><a name="line.3079"></a>
+<span class="sourceLineNo">3080</span>    // Verify result<a name="line.3080"></a>
+<span class="sourceLineNo">3081</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.3081"></a>
+<span class="sourceLineNo">3082</span>      assertEquals(expected.get(i), actual.get(i));<a name="line.3082"></a>
+<span class="sourceLineNo">3083</span>    }<a name="line.3083"></a>
+<span class="sourceLineNo">3084</span>  }<a name="line.3084"></a>
+<span class="sourceLineNo">3085</span><a name="line.3085"></a>
+<span class="sourceLineNo">3086</span>  @Test<a name="line.3086"></a>
+<span class="sourceLineNo">3087</span>  public void testScanner_Wildcard_FromFilesOnly_EnforceVersions() throws IOException {<a name="line.3087"></a>
+<span class="sourceLineNo">3088</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.3088"></a>
+<span class="sourceLineNo">3089</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.3089"></a>
+<span class="sourceLineNo">3090</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.3090"></a>
+<span class="sourceLineNo">3091</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.3091"></a>
+<span class="sourceLineNo">3092</span><a name="line.3092"></a>
+<span class="sourceLineNo">3093</span>    long ts1 = 1; // System.currentTimeMillis();<a name="line.3093"></a>
+<span class="sourceLineNo">3094</span>    long ts2 = ts1 + 1;<a name="line.3094"></a>
+<span class="sourceLineNo">3095</span>    long ts3 = ts1 + 2;<a name="line.3095"></a>
+<span class="sourceLineNo">3096</span><a name="line.3096"></a>
+<span class="sourceLineNo">3097</span>    // Setting up region<a name="line.3097"></a>
+<span class="sourceLineNo">3098</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.3098"></a>
+<span class="sourceLineNo">3099</span>    // Putting data in Region<a name="line.3099"></a>
+<span class="sourceLineNo">3100</span>    Put put = null;<a name="line.3100"></a>
+<span class="sourceLineNo">3101</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.3101"></a>
+<span class="sourceLineNo">3102</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.3102"></a>
+<span class="sourceLineNo">3103</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.3103"></a>
+<span class="sourceLineNo">3104</span><a name="line.3104"></a>
+<span class="sourceLineNo">3105</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.3105"></a>
+<span class="sourceLineNo">3106</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.3106"></a>
+<span class="sourceLineNo">3107</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.3107"></a>
 <span class="sourceLineNo">3108</span><a name="line.3108"></a>
-<span class="sourceLineNo">3109</span>    // Expected<a name="line.3109"></a>
-<span class="sourceLineNo">3110</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.3110"></a>
-<span class="sourceLineNo">3111</span>    expected.add(kv13);<a name="line.3111"></a>
-<span class="sourceLineNo">3112</span>    expected.add(kv12);<a name="line.3112"></a>
-<span class="sourceLineNo">3113</span>    expected.add(kv23);<a name="line.3113"></a>
-<span class="sourceLineNo">3114</span>    expected.add(kv22);<a name="line.3114"></a>
-<span class="sourceLineNo">3115</span><a name="line.3115"></a>
-<span class="sourceLineNo">3116</span>    Scan scan = new Scan(row1);<a name="line.3116"></a>
-<span class="sourceLineNo">3117</span>    scan.addFamily(fam1);<a name="line.3117"></a>
-<span class="sourceLineNo">3118</span>    scan.setMaxVersions(MAX_VERSIONS);<a name="line.3118"></a>
-<span class="sourceLineNo">3119</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.3119"></a>
-<span class="sourceLineNo">3120</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.3120"></a>
-<span class="sourceLineNo">3121</span><a name="line.3121"></a>
-<span class="sourceLineNo">3122</span>    boolean hasNext = scanner.next(actual);<a name="line.3122"></a>
-<span class="sourceLineNo">3123</span>    assertEquals(false, hasNext);<a name="line.3123"></a>
-<span class="sourceLineNo">3124</span><a name="line.3124"></a>
-<span class="sourceLineNo">3125</span>    // Verify result<a name="line.3125"></a>
-<span class="sourceLineNo">3126</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.3126"></a>
-<span class="sourceLineNo">3127</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected.get(i), actual.get(i)));<a name="line.3127"></a>
-<span class="sourceLineNo">3128</span>    }<a name="line.3128"></a>
-<span class="sourceLineNo">3129</span>  }<a name="line.3129"></a>
-<span class="sourceLineNo">3130</span><a name="line.3130"></a>
-<span class="sourceLineNo">3131</span>  @Test<a name="line.3131"></a>
-<span class="sourceLineNo">3132</span>  public void testScanner_StopRow1542() throws IOException {<a name="line.3132"></a>
-<span class="sourceLineNo">3133</span>    byte[] family = Bytes.toBytes("testFamily");<a name="line.3133"></a>
-<span class="sourceLineNo">3134</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.3134"></a>
-<span class="sourceLineNo">3135</span>    byte[] row1 = Bytes.toBytes("row111");<a name="line.3135"></a>
-<span class="sourceLineNo">3136</span>    byte[] row2 = Bytes.toBytes("row222");<a name="line.3136"></a>
-<span class="sourceLineNo">3137</span>    byte[] row3 = Bytes.toBytes("row333");<a name="line.3137"></a>
-<span class="sourceLineNo">3138</span>    byte[] row4 = Bytes.toBytes("row444");<a name="line.3138"></a>
-<span class="sourceLineNo">3139</span>    byte[] row5 = Bytes.toBytes("row555");<a name="line.3139"></a>
+<span class="sourceLineNo">3109</span>    put = new Put(row1);<a name="line.3109"></a>
+<span class="sourceLineNo">3110</span>    put.add(kv13);<a name="line.3110"></a>
+<span class="sourceLineNo">3111</span>    put.add(kv12);<a name="line.3111"></a>
+<span class="sourceLineNo">3112</span>    put.add(kv11);<a name="line.3112"></a>
+<span class="sourceLineNo">3113</span>    put.add(kv23);<a name="line.3113"></a>
+<span class="sourceLineNo">3114</span>    put.add(kv22);<a name="line.3114"></a>
+<span class="sourceLineNo">3115</span>    put.add(kv21);<a name="line.3115"></a>
+<span class="sourceLineNo">3116</span>    region.put(put);<a name="line.3116"></a>
+<span class="sourceLineNo">3117</span>    region.flush(true);<a name="line.3117"></a>
+<span class="sourceLineNo">3118</span><a name="line.3118"></a>
+<span class="sourceLineNo">3119</span>    // Expected<a name="line.3119"></a>
+<span class="sourceLineNo">3120</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.3120"></a>
+<span class="sourceLineNo">3121</span>    expected.add(kv13);<a name="line.3121"></a>
+<span class="sourceLineNo">3122</span>    expected.add(kv12);<a name="line.3122"></a>
+<span class="sourceLineNo">3123</span>    expected.add(kv23);<a name="line.3123"></a>
+<span class="sourceLineNo">3124</span>    expected.add(kv22);<a name="line.3124"></a>
+<span class="sourceLineNo">3125</span><a name="line.3125"></a>
+<span class="sourceLineNo">3126</span>    Scan scan = new Scan(row1);<a name="line.3126"></a>
+<span class="sourceLineNo">3127</span>    scan.addFamily(fam1);<a name="line.3127"></a>
+<span class="sourceLineNo">3128</span>    scan.setMaxVersions(MAX_VERSIONS);<a name="line.3128"></a>
+<span class="sourceLineNo">3129</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.3129"></a>
+<span class="sourceLineNo">3130</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.3130"></a>
+<span class="sourceLineNo">3131</span><a name="line.3131"></a>
+<span class="sourceLineNo">3132</span>    boolean hasNext = scanner.next(actual);<a name="line.3132"></a>
+<span class="sourceLineNo">3133</span>    assertEquals(false, hasNext);<a name="line.3133"></a>
+<span class="sourceLineNo">3134</span><a name="line.3134"></a>
+<span class="sourceLineNo">3135</span>    // Verify result<a name="line.3135"></a>
+<span class="sourceLineNo">3136</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.3136"></a>
+<span class="sourceLineNo">3137</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected.get(i), actual.get(i)));<a name="line.3137"></a>
+<span class="sourceLineNo">3138</span>    }<a name="line.3138"></a>
+<span class="sourceLineNo">3139</span>  }<a name="line.3139"></a>
 <span class="sourceLineNo">3140</span><a name="line.3140"></a>
-<span class="sourceLineNo">3141</span>    byte[] col1 = Bytes.toBytes("Pub111");<a name="line.3141"></a>
-<span class="sourceLineNo">3142</span>    byte[] col2 = Bytes.toBytes("Pub222");<a name="line.3142"></a>
-<span class="sourceLineNo">3143</span><a name="line.3143"></a>
-<span class="sourceLineNo">3144</span>    Put put = new Put(row1);<a name="line.3144"></a>
-<span class="sourceLineNo">3145</span>    put.addColumn(family, col1, Bytes.toBytes(10L));<a name="line.3145"></a>
-<span class="sourceLineNo">3146</span>    region.put(put);<a name="line.3146"></a>
-<span class="sourceLineNo">3147</span><a name="line.3147"></a>
-<span class="sourceLineNo">3148</span>    put = new Put(row2);<a name="line.3148"></a>
-<span class="sourceLineNo">3149</span>    put.addColumn(family, col1, Bytes.toBytes(15L));<a name="line.3149"></a>
-<span class="sourceLineNo">3150</span>    region.put(put);<a name="line.3150"></a>
-<span class="sourceLineNo">3151</span><a name="line.3151"></a>
-<span class="sourceLineNo">3152</span>    put = new Put(row3);<a name="line.3152"></a>
-<span class="sourceLineNo">3153</span>    put.addColumn(family, col2, Bytes.toBytes(20L));<a name="line.3153"></a>
-<span class="sourceLineNo">3154</span>    region.put(put);<a name="line.3154"></a>
-<span class="sourceLineNo">3155</span><a name="line.3155"></a>
-<span class="sourceLineNo">3156</span>    put = new Put(row4);<a name="line.3156"></a>
-<span class="sourceLineNo">3157</span>    put.addColumn(family, col2, Bytes.toBytes(30L));<a name="line.3157"></a>
-<span class="sourceLineNo">3158</span>    region.put(put);<a name="line.3158"></a>
-<span class="sourceLineNo">3159</span><a name="line.3159"></a>
-<span class="sourceLineNo">3160</span>    put = new Put(row5);<a name="line.3160"></a>
-<span class="sourceLineNo">3161</span>    put.addColumn(family, col1, Bytes.toBytes(40L));<a name="line.3161"></a>
-<span class="sourceLineNo">3162</span>    region.put(put);<a name="line.3162"></a>
-<span class="sourceLineNo">3163</span><a name="line.3163"></a>
-<span class="sourceLineNo">3164</span>    Scan scan = new Scan(row3, row4);<a name="line.3164"></a>
-<span class="sourceLineNo">3165</span>    scan.setMaxVersions();<a name="line.3165"></a>
-<span class="sourceLineNo">3166</span>    scan.addColumn(family, col1);<a name="line.3166"></a>
-<span class="sourceLineNo">3167</span>    InternalScanner s = region.getScanner(scan);<a name="line.3167"></a>
-<span class="sourceLineNo">3168</span><a name="line.3168"></a>
-<span class="sourceLineNo">3169</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.3169"></a>
-<span class="sourceLineNo">3170</span>    assertEquals(false, s.next(results));<a name="line.3170"></a>
-<span class="sourceLineNo">3171</span>    assertEquals(0, results.size());<a name="line.3171"></a>
-<span class="sourceLineNo">3172</span>  }<a name="line.3172"></a>
+<span class="sourceLineNo">3141</span>  @Test<a name="line.3141"></a>
+<span class="sourceLineNo">3142</span>  public void testScanner_StopRow1542() throws IOException {<a name="line.3142"></a>
+<span class="sourceLineNo">3143</span>    byte[] family = Bytes.toBytes("testFamily");<a name="line.3143"></a>
+<span class="sourceLineNo">3144</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.3144"></a>
+<span class="sourceLineNo">3145</span>    byte[] row1 = Bytes.toBytes("row111");<a name="line.3145"></a>
+<span class="sourceLineNo">3146</span>    byte[] row2 = Bytes.toBytes("row222");<a name="line.3146"></a>
+<span class="sourceLineNo">3147</span>    byte[] row3 = Bytes.toBytes("row333");<a name="line.3147"></a>
+<span class="sourceLineNo">3148</span>    byte[] row4 = Bytes.toBytes("row444");<a name="line.3148"></a>
+<span class="sourceLineNo">3149</span>    byte[] row5 = Bytes.toBytes("row555");<a name="line.3149"></a>
+<span class="sourceLineNo">3150</span><a name="line.3150"></a>
+<span class="sourceLineNo">3151</span>    byte[] col1 = Bytes.toBytes("Pub111");<a name="line.3151"></a>
+<span class="sourceLineNo">3152</span>    byte[] col2 = Bytes.toBytes("Pub222");<a name="line.3152"></a>
+<span class="sourceLineNo">3153</span><a name="line.3153"></a>
+<span class="sourceLineNo">3154</span>    Put put = new Put(row1);<a name="line.3154"></a>
+<span class="sourceLineNo">3155</span>    put.addColumn(family, col1, Bytes.toBytes(10L));<a name="line.3155"></a>
+<span class="sourceLineNo">3156</span>    region.put(put);<a name="line.3156"></a>
+<span class="sourceLineNo">3157</span><a name="line.3157"></a>
+<span class="sourceLineNo">3158</span>    put = new Put(row2);<a name="line.3158"></a>
+<span class="sourceLineNo">3159</span>    put.addColumn(family, col1, Bytes.toBytes(15L));<a name="line.3159"></a>
+<span class="sourceLineNo">3160</span>    region.put(put);<a name="line.3160"></a>
+<span class="sourceLineNo">3161</span><a name="line.3161"></a>
+<span class="sourceLineNo">3162</span>    put = new Put(row3);<a name="line.3162"></a>
+<span class="sourceLineNo">3163</span>    put.addColumn(family, col2, Bytes.toBytes(20L));<a name="line.3163"></a>
+<span class="sourceLineNo">3164</span>    region.put(put);<a name="line.3164"></a>
+<span class="sourceLineNo">3165</span><a name="line.3165"></a>
+<span class="sourceLineNo">3166</span>    put = new Put(row4);<a name="line.3166"></a>
+<span class="sourceLineNo">3167</span>    put.addColumn(family, col2, Bytes.toBytes(30L));<a name="line.3167"></a>
+<span class="sourceLineNo">3168</span>    region.put(put);<a name="line.3168"></a>
+<span class="sourceLineNo">3169</span><a name="line.3169"></a>
+<span class="sourceLineNo">3170</span>    put = new Put(row5);<a name="line.3170"></a>
+<span class="sourceLineNo">3171</span>    put.addColumn(family, col1, Bytes.toBytes(40L));<a name="line.3171"></a>
+<span class="sourceLineNo">3172</span>    region.put(put);<a name="line.3172"></a>
 <span class="sourceLineNo">3173</span><a name="line.3173"></a>
-<span class="sourceLineNo">3174</span>  @Test<a name="line.3174"></a>
-<span class="sourceLineNo">3175</span>  public void testScanner_Wildcard_FromMemStoreAndFiles_EnforceVersions() throws IOException {<a name="line.3175"></a>
-<span class="sourceLineNo">3176</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.3176"></a>
-<span class="sourceLineNo">3177</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.3177"></a>
-<span class="sourceLineNo">3178</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.3178"></a>
-<span class="sourceLineNo">3179</span>    byte[] qf2 = Bytes.toBytes("quateslifier2");<a name="line.3179"></a>
-<span class="sourceLineNo">3180</span><a name="line.3180"></a>
-<span class="sourceLineNo">3181</span>    long ts1 = 1;<a name="line.3181"></a>
-<span class="sourceLineNo">3182</span>    long ts2 = ts1 + 1;<a name="line.3182"></a>
-<span class="sourceLineNo">3183</span>    long ts3 = ts1 + 2;<a name="line.3183"></a>
-<span class="sourceLineNo">3184</span>    long ts4 = ts1 + 3;<a name="line.3184"></a>
-<span class="sourceLineNo">3185</span><a name="line.3185"></a>
-<span class="sourceLineNo">3186</span>    // Setting up region<a name="line.3186"></a>
-<span class="sourceLineNo">3187</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.3187"></a>
-<span class="sourceLineNo">3188</span>    // Putting data in Region<a name="line.3188"></a>
-<span class="sourceLineNo">3189</span>    KeyValue kv14 = new KeyValue(row1, fam1, qf1, ts4, KeyValue.Type.Put, null);<a name="line.3189"></a>
-<span class="sourceLineNo">3190</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.3190"></a>
-<span class="sourceLineNo">3191</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.3191"></a>
-<span class="sourceLineNo">3192</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.3192"></a>
-<span class="sourceLineNo">3193</span><a name="line.3193"></a>
-<span class="sourceLineNo">3194</span>    KeyValue kv24 = new KeyValue(row1, fam1, qf2, ts4, KeyValue.Type.Put, null);<a name="line.3194"></a>
-<span class="sourceLineNo">3195</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.3195"></a>
-<span class="sourceLineNo">3196</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.3196"></a>
-<span class="sourceLineNo">3197</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.3197"></a>
-<span class="sourceLineNo">3198</span><a name="line.3198"></a>
-<span class="sourceLineNo">3199</span>    Put put = null;<a name="line.3199"></a>
-<span class="sourceLineNo">3200</span>    put = new Put(row1);<a name="line.3200"></a>
-<span class="sourceLineNo">3201</span>    put.add(kv14);<a name="line.3201"></a>
-<span class="sourceLineNo">3202</span>    put.add(kv24);<a name="line.3202"></a>
-<span class="sourceLineNo">3203</span>    region.put(put);<a name="line.3203"></a>
-<span class="sourceLineNo">3204</span>    region.flush(true);<a name="line.3204"></a>
-<span class="sourceLineNo">3205</span><a name="line.3205"></a>
-<span class="sourceLineNo">3206</span>    put = new Put(row1);<a name="line.3206"></a>
-<span class="sourceLineNo">3207</span>    put.add(kv23);<a name="line.3207"></a>
-<span class="sourceLineNo">3208</span>    put.add(kv13);<a name="line.3208"></a>
-<span class="sourceLineNo">3209</span>    region.put(put);<a name="line.3209"></a>
-<span class="sourceLineNo">3210</span>    region.flush(true);<a name="line.3210"></a>
-<span class="sourceLineNo">3211</span><a name="line.3211"></a>
-<span class="sourceLineNo">3212</span>    put = new Put(row1);<a name="line.3212"></a>
-<span class="sourceLineNo">3213</span>    put.add(kv22);<a name="line.3213"></a>
-<span class="sourceLineNo">3214</span>    put.add(kv12);<a name="line.3214"></a>
-<span class="sourceLineNo">3215</span>    region.put(put);<a name="line.3215"></a>
-<span class="sourceLineNo">3216</span>    region.flush(true);<a name="line.3216"></a>
-<span class="sourceLineNo">3217</span><a name="line.3217"></a>
-<span class="sourceLineNo">3218</span>    put = new Put(row1);<a name="line.3218"></a>
-<span class="sourceLineNo">3219</span>    put.add(kv21);<a name="line.3219"></a>
-<span class="sourceLineNo">3220</span>    put.add(kv11);<a name="line.3220"></a>
-<span class="sourceLineNo">3221</span>    region.put(put);<a name="line.3221"></a>
-<span class="sourceLineNo">3222</span><a name="line.3222"></a>
-<span class="sourceLineNo">3223</span>    // Expected<a name="line.3223"></a>
-<span class="sourceLineNo">3224</span>    List&lt;KeyValue&gt; expected = new ArrayList&lt;&gt;();<a name="line.3224"></a>
-<span class="sourceLineNo">3225</span>    expected.add(kv14);<a name="line.3225"></a>
-<span class="sourceLineNo">3226</span>    expected.add(kv13);<a name="line.3226"></a>
-<span class="sourceLineNo">3227</span>    expected.add(kv12);<a name="line.3227"></a>
-<span class="sourceLineNo">3228</span>    expected.add(kv24);<a name="line.3228"></a>
-<span class="sourceLineNo">3229</span>    expected.add(kv23);<a name="line.3229"></a>
-<span class="sourceLineNo">3230</span>    expected.add(kv22);<a name="line.3230"></a>
-<span class="sourceLineNo">3231</span><a name="line.3231"></a>
-<span class="sourceLineNo">3232</span>    Scan scan = new Scan(row1);<a name="line.3232"></a>
-<span class="sourceLineNo">3233</span>    int versions = 3;<a name="line.3233"></a>
-<span class="sourceLineNo">3234</span>    scan.setMaxVersions(versions);<a name="line.3234"></a>
-<span class="sourceLineNo">3235</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.3235"></a>
-<span class="sourceLineNo">3236</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.3236"></a>
-<span class="sourceLineNo">3237</span><a name="line.3237"></a>
-<span class="sourceLineNo">3238</span>    boolean hasNext = scanner.next(actual);<a name="line.3238"></a>
-<span class="sourceLineNo">3239</span>    assertEquals(false, hasNext);<a name="line.3239"></a>
-<span class="sourceLineNo">3240</span><a name="line.3240"></a>
-<span class="sourceLineNo">3241</span>    // Verify result<a name="line.3241"></a>
-<span class="sourceLineNo">3242</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.3242"></a>
-<span class="sourceLineNo">3243</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected.get(i), actual.get(i)));<a name="line.3243"></a>
-<span class="sourceLineNo">3244</span>    }<a name="line.3244"></a>
-<span class="sourceLineNo">3245</span>  }<a name="line.3245"></a>
-<span class="sourceLineNo">3246</span><a name="line.3246"></a>
-<span class="sourceLineNo">3247</span>  /**<a name="line.3247"></a>
-<span class="sourceLineNo">3248</span>   * Added for HBASE-5416<a name="line.3248"></a>
-<span class="sourceLineNo">3249</span>   *<a name="line.3249"></a>
-<span class="sourceLineNo">3250</span>   * Here we test scan optimization when only subset of CFs are used in filter<a name="line.3250"></a>
-<span class="sourceLineNo">3251</span>   * conditions.<a name="line.3251"></a>
-<span class="sourceLineNo">3252</span>   */<a name="line.3252"></a>
-<span class="sourceLineNo">3253</span>  @Test<a name="line.3253"></a>
-<span class="sourceLineNo">3254</span>  public void testScanner_JoinedScanners() throws IOException {<a name="line.3254"></a>
-<span class="sourceLineNo">3255</span>    byte[] cf_essential = Bytes.toBytes("essential");<a name="line.3255"></a>
-<span class="sourceLineNo">3256</span>    byte[] cf_joined = Bytes.toBytes("joined");<a name="line.3256"></a>
-<span class="sourceLineNo">3257</span>    byte[] cf_alpha = Bytes.toBytes("alpha");<a name="line.3257"></a>
-<span class="sourceLineNo">3258</span>    this.region = initHRegion(tableName, method, CONF, cf_essential, cf_joined, cf_alpha);<a name="line.3258"></a>
-<span class="sourceLineNo">3259</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.3259"></a>
-<span class="sourceLineNo">3260</span>    byte[] row2 = Bytes.toBytes("row2");<a name="line.3260"></a>
-<span class="sourceLineNo">3261</span>    byte[] row3 = Bytes.toBytes("row3");<a name="line.3261"></a>
-<span class="sourceLineNo">3262</span><a name="line.3262"></a>
-<span class="sourceLineNo">3263</span>    byte[] col_normal = Bytes.toBytes("d");<a name="line.3263"></a>
-<span class="sourceLineNo">3264</span>    byte[] col_alpha = Bytes.toBytes("a");<a name="line.3264"></a>
-<span class="sourceLineNo">3265</span><a name="line.3265"></a>
-<span class="sourceLineNo">3266</span>    byte[] filtered_val = Bytes.toBytes(3);<a name="line.3266"></a>
-<span class="sourceLineNo">3267</span><a name="line.3267"></a>
-<span class="sourceLineNo">3268</span>    Put put = new Put(row1);<a name="line.3268"></a>
-<span class="sourceLineNo">3269</span>    put.addColumn(cf_essential, col_normal, Bytes.toBytes(1));<a name="line.3269"></a>
-<span class="sourceLineNo">3270</span>    put.addColumn(cf_joined, col_alpha, Bytes.toBytes(1));<a name="line.3270"></a>
-<span class="sourceLineNo">3271</span>    region.put(put);<a name="line.3271"></a>
+<span class="sourceLineNo">3174</span>    Scan scan = new Scan(row3, row4);<a name="line.3174"></a>
+<span class="sourceLineNo">3175</span>    scan.setMaxVersions();<a name="line.3175"></a>
+<span class="sourceLineNo">3176</span>    scan.addColumn(family, col1);<a name="line.3176"></a>
+<span class="sourceLineNo">3177</span>    InternalScanner s = region.getScanner(scan);<a name="line.3177"></a>
+<span class="sourceLineNo">3178</span><a name="line.3178"></a>
+<span class="sourceLineNo">3179</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.3179"></a>
+<span class="sourceLineNo">3180</span>    assertEquals(false, s.next(results));<a name="line.3180"></a>
+<span class="sourceLineNo">3181</span>    assertEquals(0, results.size());<a name="line.3181"></a>
+<span class="sourceLineNo">3182</span>  }<a name="line.3182"></a>
+<span class="sourceLineNo">3183</span><a name="line.3183"></a>
+<span class="sourceLineNo">3184</span>  @Test<a name="line.3184"></a>
+<span class="sourceLineNo">3185</span>  public void testScanner_Wildcard_FromMemStoreAndFiles_EnforceVersions() throws IOException {<a name="line.3185"></a>
+<span class="sourceLineNo">3186</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.3186"></a>
+<span class="sourceLineNo">3187</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.3187"></a>
+<span class="sourceLineNo">3188</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.3188"></a>
+<span class="sourceLineNo">3189</span>    byte[] qf2 = Bytes.toBytes("quateslifier2");<a name="line.3189"></a>
+<span class="sourceLineNo">3190</span><a name="line.3190"></a>
+<span class="sourceLineNo">3191</span>    long ts1 = 1;<a name="line.3191"></a>
+<span class="sourceLineNo">3192</span>    long ts2 = ts1 + 1;<a name="line.3192"></a>
+<span class="sourceLineNo">3193</span>    long ts3 = ts1 + 2;<a name="line.3193"></a>
+<span class="sourceLineNo">3194</span>    long ts4 = ts1 + 3;<a name="line.3194"></a>
+<span class="sourceLineNo">3195</span><a name="line.3195"></a>
+<span class="sourceLineNo">3196</span>    // Setting up region<a name="line.3196"></a>
+<span class="sourceLineNo">3197</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.3197"></a>
+<span class="sourceLineNo">3198</span>    // Putting data in Region<a name="line.3198"></a>
+<span class="sourceLineNo">3199</span>    KeyValue kv14 = new KeyValue(row1, fam1, qf1, ts4, KeyValue.Type.Put, null);<a name="line.3199"></a>
+<span class="sourceLineNo">3200</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.3200"></a>
+<span class="sourceLineNo">3201</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.3201"></a>
+<span class="sourceLineNo">3202</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.3202"></a>
+<span class="sourceLineNo">3203</span><a name="line.3203"></a>
+<span class="sourceLineNo">3204</span>    KeyValue kv24 = new KeyValue(row1, fam1, qf2, ts4, KeyValue.Type.Put, null);<a name="line.3204"></a>
+<span class="sourceLineNo">3205</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.3205"></a>
+<span class="sourceLineNo">3206</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.3206"></a>
+<span class="sourceLineNo">3207</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.3207"></a>
+<span class="sourceLineNo">3208</span><a name="line.3208"></a>
+<span class="sourceLineNo">3209</span>    Put put = null;<a name="line.3209"></a>
+<span class="sourceLineNo">3210</span>    put = new Put(row1);<a name="line.3210"></a>
+<span class="sourceLineNo">3211</span>    put.add(kv14);<a name="line.3211"></a>
+<span class="sourceLineNo">3212</span>    put.add(kv24);<a name="line.3212"></a>
+<span class="sourceLineNo">3213</span>    region.put(put);<a name="line.3213"></a>
+<span class="sourceLineNo">3214</span>    region.flush(true);<a name="line.3214"></a>
+<span class="sourceLineNo">3215</span><a name="line.3215"></a>
+<span class="sourceLineNo">3216</span>    put = new Put(row1);<a name="line.3216"></a>
+<span class="sourceLineNo">3217</span>    put.add(kv23);<a name="line.3217"></a>
+<span class="sourceLineNo">3218</span>    put.add(kv13);<a name="line.3218"></a>
+<span class="sourceLineNo">3219</span>    region.put(put);<a name="line.3219"></a>
+<span class="sourceLineNo">3220</span>    region.flush(true);<a name="line.3220"></a>
+<span class="sourceLineNo">3221</span><a name="line.3221"></a>
+<span class="sourceLineNo">3222</span>    put = new Put(row1);<a name="line.3222"></a>
+<span class="sourceLineNo">3223</span>    put.add(kv22);<a name="line.3223"></a>
+<span class="sourceLineNo">3224</span>    put.add(kv12);<a name="line.3224"></a>
+<span class="sourceLineNo">3225</span>    region.put(put);<a name="line.3225"></a>
+<span class="sourceLineNo">3226</span>    region.flush(true);<a name="line.3226"></a>
+<span class="sourceLineNo">3227</span><a name="line.3227"></a>
+<span class="sourceLineNo">3228</span>    put = new Put(row1);<a name="line.3228"></a>
+<span class="sourceLineNo">3229</span>    put.add(kv21);<a name="line.3229"></a>
+<span class="sourceLineNo">3230</span>    put.add(kv11);<a name="line.3230"></a>
+<span class="sourceLineNo">3231</span>    region.put(put);<a name="line.3231"></a>
+<span class="sourceLineNo">3232</span><a name="line.3232"></a>
+<span class="sourceLineNo">3233</span>    // Expected<a name="line.3233"></a>
+<span class="sourceLineNo">3234</span>    List&lt;KeyValue&gt; expected = new ArrayList&lt;&gt;();<a name="line.3234"></a>
+<span class="sourceLineNo">3235</span>    expected.add(kv14);<a name="line.3235"></a>
+<span class="sourceLineNo">3236</span>    expected.add(kv13);<a name="line.3236"></a>
+<span class="sourceLineNo">3237</span>    expected.add(kv12);<a name="line.3237"></a>
+<span class="sourceLineNo">3238</span>    expected.add(kv24);<a name="line.3238"></a>
+<span class="sourceLineNo">3239</span>    expected.add(kv23);<a name="line.3239"></a>
+<span class="sourceLineNo">3240</span>    expected.add(kv22);<a name="line.3240"></a>
+<span class="sourceLineNo">3241</span><a name="line.3241"></a>
+<span class="sourceLineNo">3242</span>    Scan scan = new Scan(row1);<a name="line.3242"></a>
+<span class="sourceLineNo">3243</span>    int versions = 3;<a name="line.3243"></a>
+<span class="sourceLineNo">3244</span>    scan.setMaxVersions(versions);<a name="line.3244"></a>
+<span class="sourceLineNo">3245</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.3245"></a>
+<span class="sourceLineNo">3246</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.3246"></a>
+<span class="sourceLineNo">3247</span><a name="line.3247"></a>
+<span class="sourceLineNo">3248</span>    boolean hasNext = scanner.next(actual);<a name="line.3248"></a>
+<span class="sourceLineNo">3249</span>    assertEquals(false, hasNext);<a name="line.3249"></a>
+<span class="sourceLineNo">3250</span><a name="line.3250"></a>
+<span class="sourceLineNo">3251</span>    // Verify result<a name="line.3251"></a>
+<span class="sourceLineNo">3252</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.3252"></a>
+<span class="sourceLineNo">3253</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected.get(i), actual.get(i)));<a name="line.3253"></a>
+<span class="sourceLineNo">3254</span>    }<a name="line.3254"></a>
+<span class="sourceLineNo">3255</span>  }<a name="line.3255"></a>
+<span class="sourceLineNo">3256</span><a name="line.3256"></a>
+<span class="sourceLineNo">3257</span>  /**<a name="line.3257"></a>
+<span class="sourceLineNo">3258</span>   * Added for HBASE-5416<a name="line.3258"></a>
+<span class="sourceLineNo">3259</span>   *<a name="line.3259"></a>
+<span class="sourceLineNo">3260</span>   * Here we test scan optimization when only subset of CFs are used in filter<a name="line.3260"></a>
+<span class="sourceLineNo">3261</span>   * conditions.<a name="line.3261"></a>
+<span class="sourceLineNo">3262</span>   */<a name="line.3262"></a>
+<span class="sourceLineNo">3263</span>  @Test<a name="line.3263"></a>
+<span class="sourceLineNo">3264</span>  public void testScanner_JoinedScanners() throws IOException {<a name="line.3264"></a>
+<span class="sourceLineNo">3265</span>    byte[] cf_essential = Bytes.toBytes("essential");<a name="line.3265"></a>
+<span class="sourceLineNo">3266</span>    byte[] cf_joined = Bytes.toBytes("joined");<a name="line.3266"></a>
+<span class="sourceLineNo">3267</span>    byte[] cf_alpha = Bytes.toBytes("alpha");<a name="line.3267"></a>
+<span class="sourceLineNo">3268</span>    this.region = initHRegion(tableName, method, CONF, cf_essential, cf_joined, cf_alpha);<a name="line.3268"></a>
+<span class="sourceLineNo">3269</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.3269"></a>
+<span class="sourceLineNo">3270</span>    byte[] row2 = Bytes.toBytes("row2");<a name="line.3270"></a>
+<span class="sourceLineNo">3271</span>    byte[] row3 = Bytes.toBytes("row3");<a name="line.3271"></a>
 <span class="sourceLineNo">3272</span><a name="line.3272"></a>
-<span class="sourceLineNo">3273</span>    put = new Put(row2);<a name="line.3273"></a>
-<span class="sourceLineNo">3274</span>    put.addColumn(cf_essential, col_alpha, Bytes.toBytes(2));<a name="line.3274"></a>
-<span class="sourceLineNo">3275</span>    put.addColumn(cf_joined, col_normal, Bytes.toBytes(2));<a name="line.3275"></a>
-<span class="sourceLineNo">3276</span>    put.addColumn(cf_alpha, col_alpha, Bytes.toBytes(2));<a name="line.3276"></a>
-<span class="sourceLineNo">3277</span>    region.put(put);<a name="line.3277"></a>
-<span class="sourceLineNo">3278</span><a name="line.3278"></a>
-<span class="sourceLineNo">3279</span>    put = new Put(row3);<a name="line.3279"></a>
-<span class="sourceLineNo">3280</span>    put.addColumn(cf_essential, col_normal, filtered_val);<a name="line.3280"></a>
-<span class="sourceLineNo">3281</span>    put.addColumn(cf_joined, col_normal, filtered_val);<a name="line.3281"></a>
-<span class="sourceLineNo">3282</span>    region.put(put);<a name="line.3282"></a>
-<span class="sourceLineNo">3283</span><a name="line.3283"></a>
-<span class="sourceLineNo">3284</span>    // Check two things:<a name="line.3284"></a>
-<span class="sourceLineNo">3285</span>    // 1. result list contains expected values<a name="line.3285"></a>
-<span class="sourceLineNo">3286</span>    // 2. result list is sorted properly<a name="line.3286"></a>
-<span class="sourceLineNo">3287</span><a name="line.3287"></a>
-<span class="sourceLineNo">3288</span>    Scan scan = new Scan();<a name="line.3288"></a>
-<span class="sourceLineNo">3289</span>    Filter filter = new SingleColumnValueExcludeFilter(cf_essential, col_normal,<a name="line.3289"></a>
-<span class="sourceLineNo">3290</span>            CompareOperator.NOT_EQUAL, filtered_val);<a name="line.3290"></a>
-<span class="sourceLineNo">3291</span>    scan.setFilter(filter);<a name="line.3291"></a>
-<span class="sourceLineNo">3292</span>    scan.setLoadColumnFamiliesOnDemand(true);<a name="line.3292"></a>
-<span class="sourceLineNo">3293</span>    InternalScanner s = region.getScanner(scan);<a name="line.3293"></a>
-<span class="sourceLineNo">3294</span><a name="line.3294"></a>
-<span class="sourceLineNo">3295</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.3295"></a>
-<span class="sourceLineNo">3296</span>    assertTrue(s.next(results));<a name="line.3296"></a>
-<span class="sourceLineNo">3297</span>    assertEquals(1, results.size());<a name="line.3297"></a>
-<span class="sourceLineNo">3298</span>    results.clear();<a name="line.3298"></a>
-<span class="sourceLineNo">3299</span><a name="line.3299"></a>
-<span class="sourceLineNo">3300</span>    assertTrue(s.next(results));<a name="line.3300"></a>
-<span class="sourceLineNo">3301</span>    assertEquals(3, results.size());<a name="line.3301"></a>
-<span class="sourceLineNo">3302</span>    assertTrue("orderCheck", CellUtil.matchingFamily(results.get(0), cf_alpha));<a name="line.3302"></a>
-<span class="sourceLineNo">3303</span>    assertTrue("orderCheck", CellUtil.matchingFamily(results.get(1), cf_essential));<a name="line.3303"></a>
-<span class="sourceLineNo">3304</span>    assertTrue("orderCheck", CellUtil.matchingFamily(results.get(2), cf_joined));<a name="line.3304"></a>
-<span class="sourceLineNo">3305</span>    results.clear();<a name="line.3305"></a>
-<span class="sourceLineNo">3306</span><a name="line.3306"></a>
-<span class="sourceLineNo">3307</span>    assertFalse(s.next(results));<a name="line.3307"></a>
-<span class="sourceLineNo">3308</span>    assertEquals(0, results.size());<a name="line.3308"></a>
-<span class="sourceLineNo">3309</span>  }<a name="line.3309"></a>
-<span class="sourceLineNo">3310</span><a name="line.3310"></a>
-<span class="sourceLineNo">3311</span>  /**<a name="line.3311"></a>
-<span class="sourceLineNo">3312</span>   * HBASE-5416<a name="line.3312"></a>
-<span class="sourceLineNo">3313</span>   *<a name="line.3313"></a>
-<span class="sourceLineNo">3314</span>   * Test case when scan limits amount of KVs returned on each next() call.<a name="line.3314"></a>
-<span class="sourceLineNo">3315</span>   */<a name="line.3315"></a>
-<span class="sourceLineNo">3316</span>  @Test<a name="line.3316"></a>
-<span class="sourceLineNo">3317</span>  public void testScanner_JoinedScannersWithLimits() throws IOException {<a name="line.3317"></a>
-<span class="sourceLineNo">3318</span>    final byte[] cf_first = Bytes.toBytes("first");<a name="line.3318"></a>
-<span class="sourceLineNo">3319</span>    final byte[] cf_second = Bytes.toBytes("second");<a name="line.3319"></a>
+<span class="sourceLineNo">3273</span>    byte[] col_normal = Bytes.toBytes("d");<a name="line.3273"></a>
+<span class="sourceLineNo">3274</span>    byte[] col_alpha = Bytes.toBytes("a");<a name="line.3274"></a>
+<span class="sourceLineNo">3275</span><a name="line.3275"></a>
+<span class="sourceLineNo">3276</span>    byte[] filtered_val = Bytes.toBytes(3);<a name="line.3276"></a>
+<span class="sourceLineNo">3277</span><a name="line.3277"></a>
+<span class="sourceLineNo">3278</span>    Put put = new Put(row1);<a name="line.3278"></a>
+<span class="sourceLineNo">3279</span>    put.addColumn(cf_essential, col_normal, Bytes.toBytes(1));<a name="line.3279"></a>
+<span class="sourceLineNo">3280</span>    put.addColumn(cf_joined, col_alpha, Bytes.toBytes(1));<a name="line.3280"></a>
+<span class="sourceLineNo">3281</span>    region.put(put);<a name="line.3281"></a>
+<span class="sourceLineNo">3282</span><a name="line.3282"></a>
+<span class="sourceLineNo">3283</span>    put = new Put(row2);<a name="line.3283"></a>
+<span class="sourceLineNo">3284</span>    put.addColumn(cf_essential, col_alpha, Bytes.toBytes(2));<a name="line.3284"></a>
+<span class="sourceLineNo">3285</span>    put.addColumn(cf_joined, col_normal, Bytes.toBytes(2));<a name="line.3285"></a>
+<span class="sourceLineNo">3286</span>    put.addColumn(cf_alpha, col_alpha, Bytes.toBytes(2));<a name="line.3286"></a>
+<span class="sourceLineNo">3287</span>    region.put(put);<a name="line.3287"></a>
+<span class="sourceLineNo">3288</span><a name="line.3288"></a>
+<span class="sourceLineNo">3289</span>    put = new Put(row3);<a name="line.3289"></a>
+<span class="sourceLineNo">3290</span>    put.addColumn(cf_essential, col_normal, filtered_val);<a name="line.3290"></a>
+<span class="sourceLineNo">3291</span>    put.addColumn(cf_joined, col_normal, filtered_val);<a name="line.3291"></a>
+<span class="sourceLineNo">3292</span>    region.put(put);<a name="line.3292"></a>
+<span class="sourceLineNo">3293</span><a name="line.3293"></a>
+<span class="sourceLineNo">3294</span>    // Check two things:<a name="line.3294"></a>
+<span class="sourceLineNo">3295</span>    // 1. result list contains expected values<a name="line.3295"></a>
+<span class="sourceLineNo">3296</span>    // 2. result list is sorted properly<a name="line.3296"></a>
+<span class="sourceLineNo">3297</span><a name="line.3297"></a>
+<span class="sourceLineNo">3298</span>    Scan scan = new Scan();<a name="line.3298"></a>
+<span class="sourceLineNo">3299</span>    Filter filter = new SingleColumnValueExcludeFilter(cf_essential, col_normal,<a name="line.3299"></a>
+<span class="sourceLineNo">3300</span>            CompareOperator.NOT_EQUAL, filtered_val);<a name="line.3300"></a>
+<span class="sourceLineNo">3301</span>    scan.setFilter(filter);<a name="line.3301"></a>
+<span class="sourceLineNo">3302</span>    scan.setLoadColumnFamiliesOnDemand(true);<a name="line.3302"></a>
+<span class="sourceLineNo">3303</span>    InternalScanner s = region.getScanner(scan);<a name="line.3303"></a>
+<span class="sourceLineNo">3304</span><a name="line.3304"></a>
+<span class="sourceLineNo">3305</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.3305"></a>
+<span class="sourceLineNo">3306</span>    assertTrue(s.next(results));<a name="line.3306"></a>
+<span class="sourceLineNo">3307</span>    assertEquals(1, results.size());<a name="line.3307"></a>
+<span class="sourceLineNo">3308</span>    results.clear();<a name="line.3308"></a>
+<span class="sourceLineNo">3309</span><a name="line.3309"></a>
+<span class="sourceLineNo">3310</span>    assertTrue(s.next(results));<a name="line.3310"></a>
+<span class="sourceLineNo">3311</span>    assertEquals(3, results.size());<a name="line.3311"></a>
+<span class="sourceLineNo">3312</span>    assertTrue("orderCheck", CellUtil.matchingFamily(results.get(0), cf_alpha));<a name="line.3312"></a>
+<span class="sourceLineNo">3313</span>    assertTrue("orderCheck", CellUtil.matchingFamily(results.get(1), cf_essential));<a name="line.3313"></a>
+<span class="sourceLineNo">3314</span>    assertTrue("orderCheck", CellUtil.matchingFamily(results.get(2), cf_joined));<a name="line.3314"></a>
+<span class="sourceLineNo">3315</span>    results.clear();<a name="line.3315"></a>
+<span class="sourceLineNo">3316</span><a name="line.3316"></a>
+<span class="sourceLineNo">3317</span>    assertFalse(s.next(results));<a name="line.3317"></a>
+<span class="sourceLineNo">3318</span>    assertEquals(0, results.size());<a name="line.3318"></a>
+<span class="sourceLineNo">3319</span>  }<a name="line.3319"></a>
 <span class="sourceLineNo">3320</span><a name="line.3320"></a>
-<span class="sourceLineNo">3321</span>    this.region = initHRegion(tableName, method, CONF, cf_first, cf_second);<a name="line.3321"></a>
-<span class="sourceLineNo">3322</span>    final byte[] col_a = Bytes.toBytes("a");<a name="line.3322"></a>
-<span class="sourceLineNo">3323</span>    final byte[] col_b = Bytes.toBytes("b");<a name="line.3323"></a>
-<span class="sourceLineNo">3324</span><a name="line.3324"></a>
-<span class="sourceLineNo">3325</span>    Put put;<a name="line.3325"></a>
-<span class="sourceLineNo">3326</span><a name="line.3326"></a>
-<span class="sourceLineNo">3327</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.3327"></a>
-<span class="sourceLineNo">3328</span>      put = new Put(Bytes.toBytes("r" + Integer.toString(i)));<a name="line.3328"></a>
-<span class="sourceLineNo">3329</span>      put.addColumn(cf_first, col_a, Bytes.toBytes(i));<a name="line.3329"></a>
-<span class="sourceLineNo">3330</span>      if (i &lt; 5) {<a name="line.3330"></a>
-<span class="sourceLineNo">3331</span>        put.addColumn(cf_first, col_b, Bytes.toBytes(i));<a name="line.3331"></a>
-<span class="sourceLineNo">3332</span>        put.addColumn(cf_second, col_a, Bytes.toBytes(i));<a name="line.3332"></a>
-<span class="sourceLineNo">3333</span>        put.addColumn(cf_second, col_b, Bytes.toBytes(i));<a name="line.3333"></a>
-<span class="sourceLineNo">3334</span>      }<a name="line.3334"></a>
-<span class="sourceLineNo">3335</span>      region.put(put);<a name="line.3335"></a>
-<span class="sourceLineNo">3336</span>    }<a name="line.3336"></a>
-<span class="sourceLineNo">3337</span><a name="line.3337"></a>
-<span class="sourceLineNo">3338</span>    Scan scan = new Scan();<a name="line.3338"></a>
-<span class="sourceLineNo">3339</span>    scan.setLoadColumnFamiliesOnDemand(true);<a name="line.3339"></a>
-<span class="sourceLineNo">3340</span>    Filter bogusFilter = new FilterBase() {<a name="line.3340"></a>
-<span class="sourceLineNo">3341</span>      @Override<a name="line.3341"></a>
-<span class="sourceLineNo">3342</span>      public ReturnCode filterCell(final Cell ignored) throws IOException {<a name="line.3342"></a>
-<span class="sourceLineNo">3343</span>        return ReturnCode.INCLUDE;<a name="line.3343"></a>
+<span class="sourceLineNo">3321</span>  /**<a name="line.3321"></a>
+<span class="sourceLineNo">3322</span>   * HBASE-5416<a name="line.3322"></a>
+<span class="sourceLineNo">3323</span>   *<a name="line.3323"></a>
+<span class="sourceLineNo">3324</span>   * Test case when scan limits amount of KVs returned on each next() call.<a name="line.3324"></a>
+<span class="sourceLineNo">3325</span>   */<a name="line.3325"></a>
+<span class="sourceLineNo">3326</span>  @Test<a name="line.3326"></a>
+<span class="sourceLineNo">3327</span>  public void testScanner_JoinedScannersWithLimits() throws IOException {<a name="line.3327"></a>
+<span class="sourceLineNo">3328</span>    final byte[] cf_first = Bytes.toBytes("first");<a name="line.3328"></a>
+<span class="sourceLineNo">3329</span>    final byte[] cf_second = Bytes.toBytes("second");<a name="line.3329"></a>
+<span class="sourceLineNo">3330</span><a name="line.3330"></a>
+<span class="sourceLineNo">3331</span>    this.region = initHRegion(tableName, method, CONF, cf_first, cf_second);<a name="line.3331"></a>
+<span class="sourceLineNo">3332</span>    final byte[] col_a = Bytes.toBytes("a");<a name="line.3332"></a>
+<span class="sourceLineNo">3333</span>    final byte[] col_b = Bytes.toBytes("b");<a name="line.3333"></a>
+<span class="sourceLineNo">3334</span><a name="line.3334"></a>
+<span class="sourceLineNo">3335</span>    Put put;<a name="line.3335"></a>
+<span class="sourceLineNo">3336</span><a name="line.3336"></a>
+<span class="sourceLineNo">3337</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.3337"></a>
+<span class="sourceLineNo">3338</span>      put = new Put(Bytes.toBytes("r" + Integer.toString(i)));<a name="line.3338"></a>
+<span class="sourceLineNo">3339</span>      put.addColumn(cf_first, col_a, Bytes.toBytes(i));<a name="line.3339"></a>
+<span class="sourceLineNo">3340</span>      if (i &lt; 5) {<a name="line.3340"></a>
+<span class="sourceLineNo">3341</span>        put.addColumn(cf_first, col_b, Bytes.toBytes(i));<a name="line.3341"></a>
+<span class="sourceLineNo">3342</span>        put.addColumn(cf_second, col_a, Bytes.toBytes(i));<a name="line.3342"></a>
+<span class="sourceLineNo">3343</span>        put.addColumn(cf_second, col_b, Bytes.toBytes(i));<a name="line.3343"></a>
 <span class="sourceLineNo">3344</span>      }<a name="line.3344"></a>
-<span class="sourceLineNo">3345</span>      @Override<a name="line.3345"></a>
-<span class="sourceLineNo">3346</span>      public boolean isFamilyEssential(byte[] name) {<a name="line.3346"></a>
-<span class="sourceLineNo">3347</span>        return Bytes.equals(name, cf_first);<a name="line.3347"></a>
-<span class="sourceLineNo">3348</span>      }<a name="line.3348"></a>
-<span class="sourceLineNo">3349</span>    };<a name="line.3349"></a>
-<span class="sourceLineNo">3350</span><a name="line.3350"></a>
-<span class="sourceLineNo">3351</span>    scan.setFilter(bogusFilter);<a name="line.3351"></a>
-<span class="sourceLineNo">3352</span>    InternalScanner s = region.getScanner(scan);<a name="line.3352"></a>
-<span class="sourceLineNo">3353</span><a name="line.3353"></a>
-<span class="sourceLineNo">3354</span>    // Our data looks like this:<a name="line.3354"></a>
-<span class="sourceLineNo">3355</span>    // r0: first:a, first:b, second:a, second:b<a name="line.3355"></a>
-<span class="sourceLineNo">3356</span>    // r1: first:a, first:b, second:a, second:b<a name="line.3356"></a>
-<span class="sourceLineNo">3357</span>    // r2: first:a, first:b, second:a, second:b<a name="line.3357"></a>
-<span class="sourceLineNo">3358</span>    // r3: first:a, first:b, second:a, second:b<a name="line.3358"></a>
-<span class="sourceLineNo">3359</span>    // r4: first:a, first:b, second:a, second:b<a name="line.3359"></a>
-<span class="sourceLineNo">3360</span>    // r5: first:a<a name="line.3360"></a>
-<span class="sourceLineNo">3361</span>    // r6: first:a<a name="line.3361"></a>
-<span class="sourceLineNo">3362</span>    // r7: first:a<a name="line.3362"></a>
-<span class="sourceLineNo">3363</span>    // r8: first:a<a name="line.3363"></a>
-<span class="sourceLineNo">3364</span>    // r9: first:a<a name="line.3364"></a>
-<span class="sourceLineNo">3365</span><a name="line.3365"></a>
-<span class="sourceLineNo">3366</span>    // But due to next's limit set to 3, we should get this:<a name="line.3366"></a>
-<span class="sourceLineNo">3367</span>    // r0: first:a, first:b, second:a<a name="line.3367"></a>
-<span class="sourceLineNo">3368</span>    // r0: second:b<a name="line.3368"></a>
-<span class="sourceLineNo">3369</span>    // r1: first:a, first:b, second:a<a name="line.3369"></a>
-<span class="sourceLineNo">3370</span>    // r1: second:b<a name="line.3370"></a>
-<span class="sourceLineNo">3371</span>    // r2: first:a, first:b, second:a<a name="line.3371"></a>
-<span class="sourceLineNo">3372</span>    // r2: second:b<a name="line.3372"></a>
-<span class="sourceLineNo">3373</span>    // r3: first:a, first:b, second:a<a name="line.3373"></a>
-<span class="sourceLineNo">3374</span>    // r3: second:b<a name="line.3374"></a>
-<span class="sourceLineNo">3375</span>    // r4: first:a, first:b, second:a<a name="line.3375"></a>
-<span class="sourceLineNo">3376</span>    // r4: second:b<a name="line.3376"></a>
-<span class="sourceLineNo">3377</span>    // r5: first:a<a name="line.3377"></a>
-<span class="sourceLineNo">3378</span>    // r6: first:a<a name="line.3378"></a>
-<span class="sourceLineNo">3379</span>    // r7: first:a<a name="line.3379"></a>
-<span class="sourceLineNo">3380</span>    // r8: first:a<a name="line.3380"></a>
-<span class="sourceLineNo">3381</span>    // r9: first:a<a name="line.3381"></a>
-<span class="sourceLineNo">3382</span><a name="line.3382"></a>
-<span class="sourceLineNo">3383</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.3383"></a>
-<span class="sourceLineNo">3384</span>    int index = 0;<a name="line.3384"></a>
-<span class="sourceLineNo">3385</span>    ScannerContext scannerContext = ScannerContext.newBuilder().setBatchLimit(3).build();<a name="line.3385"></a>
-<span class="sourceLineNo">3386</span>    while (true) {<a name="line.3386"></a>
-<span class="sourceLineNo">3387</span>      boolean more = s.next(results, scannerContext);<a name="line.3387"></a>
-<span class="sourceLineNo">3388</span>      if ((index &gt;&gt; 1) &lt; 5) {<a name="line.3388"></a>
-<span class="sourceLineNo">3389</span>        if (index % 2 == 0) {<a name="line.3389"></a>
-<span class="sourceLineNo">3390</span>          assertEquals(3, results.size());<a name="line.3390"></a>
-<span class="sourceLineNo">3391</span>        } else {<a name="line.3391"></a>
-<span class="sourceLineNo">3392</span>          assertEquals(1, results.size());<a name="line.3392"></a>
-<span class="sourceLineNo">3393</span>        }<a name="line.3393"></a>
-<span class="sourceLineNo">3394</span>      } else {<a name="line.3394"></a>
-<span class="sourceLineNo">3395</span>        assertEquals(1, results.size());<a name="line.3395"></a>
-<span class="sourceLineNo">3396</span>      }<a name="line.3396"></a>
-<span class="sourceLineNo">3397</span>      results.clear();<a name="line.3397"></a>
-<span class="sourceLineNo">3398</span>      index++;<a name="line.3398"></a>
-<span class="sourceLineNo">3399</span>      if (!more) {<a name="line.3399"></a>
-<span class="sourceLineNo">3400</span>        break;<a name="line.3400"></a>
-<span class="sourceLineNo">3401</span>      }<a name="line.3401"></a>
-<span class="sourceLineNo">3402</span>    }<a name="line.3402"></a>
-<span class="sourceLineNo">3403</span>  }<a name="line.3403"></a>
-<span class="sourceLineNo">3404</span><a name="line.3404"></a>
-<span class="sourceLineNo">3405</span>  /**<a name="line.3405"></a>
-<span class="sourceLineNo">3406</span>   * Write an HFile block full with Cells whose qualifier that are identical between<a name="line.3406"></a>
-<span class="sourceLineNo">3407</span>   * 0 and Short.MAX_VALUE. See HBASE-13329.<a name="line.3407"></a>
-<span class="sourceLineNo">3408</span>   * @throws Exception<a name="line.3408"></a>
-<span class="sourceLineNo">3409</span>   */<a name="line.3409"></a>
-<span class="sourceLineNo">3410</span>  @Test<a name="line.3410"></a>
-<span class="sourceLineNo">3411</span>  public void testLongQualifier() throws Exception {<a name="line.3411"></a>
-<span class="sourceLineNo">3412</span>    byte[] family = Bytes.toBytes("family");<a name="line.3412"></a>
-<span class="sourceLineNo">3413</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.3413"></a>
-<span class="sourceLineNo">3414</span>    byte[] q = new byte[Short.MAX_VALUE+2];<a name="line.3414"></a>
-<span class="sourceLineNo">3415</span>    Arrays.fill(q, 0, q.length-1, (byte)42);<a name="line.3415"></a>
-<span class="sourceLineNo">3416</span>    for (byte i=0; i&lt;10; i++) {<a name="line.3416"></a>
-<span class="sourceLineNo">3417</span>      Put p = new Put(Bytes.toBytes("row"));<a name="line.3417"></a>
-<span class="sourceLineNo">3418</span>      // qualifiers that differ past Short.MAX_VALUE<a name="line.3418"></a>
-<span class="sourceLineNo">3419</span>      q[q.length-1]=i;<a name="line.3419"></a>
-<span class="sourceLineNo">3420</span>      p.addColumn(family, q, q);<a name="line.3420"></a>
-<span class="sourceLineNo">3421</span>      region.put(p);<a name="line.3421"></a>
-<span class="sourceLineNo">3422</span>    }<a name="line.3422"></a>
-<span class="sourceLineNo">3423</span>    region.flush(false);<a name="line.3423"></a>
-<span class="sourceLineNo">3424</span>  }<a name="line.3424"></a>
-<span class="sourceLineNo">3425</span><a name="line.3425"></a>
-<span class="sourceLineNo">3426</span>  /**<a name="line.3426"></a>
-<span class="sourceLineNo">3427</span>   * Flushes the cache in a thread while scanning. The tests verify that the<a name="line.3427"></a>
-<span class="sourceLineNo">3428</span>   * scan is coherent - e.g. the returned results are always of the same or<a name="line.3428"></a>
-<span class="sourceLineNo">3429</span>   * later update as the previous results.<a name="line.3429"></a>
-<span class="sourceLineNo">3430</span>   *<a name="line.3430"></a>
-<span class="sourceLineNo">3431</span>   * @throws IOException<a name="line.3431"></a>
-<span class="sourceLineNo">3432</span>   *           scan / compact<a name="line.3432"></a>
-<span class="sourceLineNo">3433</span>   * @throws InterruptedException<a name="line.3433"></a>
-<span class="sourceLineNo">3434</span>   *           thread join<a name="line.3434"></a>
-<span class="sourceLineNo">3435</span>   */<a name="line.3435"></a>
-<span class="sourceLineNo">3436</span>  @Test<a name="line.3436"></a>
-<span class="sourceLineNo">3437</span>  public void testFlushCacheWhileScanning() throws IOException, InterruptedException {<a name="line.3437"></a>
-<span class="sourceLineNo">3438</span>    byte[] family = Bytes.toBytes("family");<a name="line.3438"></a>
-<span class="sourceLineNo">3439</span>    int numRows = 1000;<a name="line.3439"></a>
-<span class="sourceLineNo">3440</span>    int flushAndScanInterval = 10;<a name="line.3440"></a>
-<span class="sourceLineNo">3441</span>    int compactInterval = 10 * flushAndScanInterval;<a name="line.3441"></a>
-<span class="sourceLineNo">3442</span><a name="line.3442"></a>
-<span class="sourceLineNo">3443</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.3443"></a>
-<span class="sourceLineNo">3444</span>    FlushThread flushThread = new FlushThread();<a name="line.3444"></a>
-<span class="sourceLineNo">3445</span>    try {<a name="line.3445"></a>
-<span class="sourceLineNo">3446</span>      flushThread.start();<a name="line.3446"></a>
-<span class="sourceLineNo">3447</span><a name="line.3447"></a>
-<span class="sourceLineNo">3448</span>      Scan scan = new Scan();<a name="line.3448"></a>
-<span class="sourceLineNo">3449</span>      scan.addFamily(family);<a name="line.3449"></a>
-<span class="sourceLineNo">3450</span>      scan.setFilter(new SingleColumnValueFilter(family, qual1, CompareOperator.EQUAL,<a name="line.3450"></a>
-<span class="sourceLineNo">3451</span>          new BinaryComparator(Bytes.toBytes(5L))));<a name="line.3451"></a>
+<span class="sourceLineNo">3345</span>      region.put(put);<a name="line.3345"></a>
+<span class="sourceLineNo">3346</span>    }<a name="line.3346"></a>
+<span class="sourceLineNo">3347</span><a name="line.3347"></a>
+<span class="sourceLineNo">3348</span>    Scan scan = new Scan();<a name="line.3348"></a>
+<span class="sourceLineNo">3349</span>    scan.setLoadColumnFamiliesOnDemand(true);<a name="line.3349"></a>
+<span class="sourceLineNo">3350</span>    Filter bogusFilter = new FilterBase() {<a name="line.3350"></a>
+<span class="sourceLineNo">3351</span>      @Override<a name="line.3351"></a>
+<span class="sourceLineNo">3352</span>      public ReturnCode filterCell(final Cell ignored) throws IOException {<a name="line.3352"></a>
+<span class="sourceLineNo">3353</span>        return ReturnCode.INCLUDE;<a name="line.3353"></a>
+<span class="sourceLineNo">3354</span>      }<a name="line.3354"></a>
+<span class="sourceLineNo">3355</span>      @Override<a name="line.3355"></a>
+<span class="sourceLineNo">3356</span>      public boolean isFamilyEssential(byte[] name) {<a name="line.3356"></a>
+<span class="sourceLineNo">3357</span>        return Bytes.equals(name, cf_first);<a name="line.3357"></a>
+<span class="sourceLineNo">3358</span>      }<a name="line.3358"></a>
+<span class="sourceLineNo">3359</span>    };<a name="line.3359"></a>
+<span class="sourceLineNo">3360</span><a name="line.3360"></a>
+<span class="sourceLineNo">3361</span>    scan.setFilter(bogusFilter);<a name="line.3361"></a>
+<span class="sourceLineNo">3362</span>    InternalScanner s = region.getScanner(scan);<a name="line.3362"></a>
+<span class="sourceLineNo">3363</span><a name="line.3363"></a>
+<span class="sourceLineNo">3364</span>    // Our data looks like this:<a name="line.3364"></a>
+<span class="sourceLineNo">3365</span>    // r0: first:a, first:b, second:a, second:b<a name="line.3365"></a>
+<span class="sourceLineNo">3366</span>    // r1: first:a, first:b, second:a, second:b<a name="line.3366"></a>
+<span class="sourceLineNo">3367</span>    // r2: first:a, first:b, second:a, second:b<a name="line.3367"></a>
+<span class="sourceLineNo">3368</span>    // r3: first:a, first:b, second:a, second:b<a name="line.3368"></a>
+<span class="sourceLineNo">3369</span>    // r4: first:a, first:b, second:a, second:b<a name="line.3369"></a>
+<span class="sourceLineNo">3370</span>    // r5: first:a<a name="line.3370"></a>
+<span class="sourceLineNo">3371</span>    // r6: first:a<a name="line.3371"></a>
+<span class="sourceLineNo">3372</span>    // r7: first:a<a name="line.3372"></a>
+<span class="sourceLineNo">3373</span>    // r8: first:a<a name="line.3373"></a>
+<span class="sourceLineNo">3374</span>    // r9: first:a<a name="line.3374"></a>
+<span class="sourceLineNo">3375</span><a name="line.3375"></a>
+<span class="sourceLineNo">3376</span>    // But due to next's limit set to 3, we should get this:<a name="line.3376"></a>
+<span class="sourceLineNo">3377</span>    // r0: first:a, first:b, second:a<a name="line.3377"></a>
+<span class="sourceLineNo">3378</span>    // r0: second:b<a name="line.3378"></a>
+<span class="sourceLineNo">3379</span>    // r1: first:a, first:b, second:a<a name="line.3379"></a>
+<span class="sourceLineNo">3380</span>    // r1: second:b<a name="line.3380"></a>
+<span class="sourceLineNo">3381</span>    // r2: first:a, first:b, second:a<a name="line.3381"></a>
+<span class="sourceLineNo">3382</span>    // r2: second:b<a name="line.3382"></a>
+<span class="sourceLineNo">3383</span>    // r3: first:a, first:b, second:a<a name="line.3383"></a>
+<span class="sourceLineNo">3384</span>    // r3: second:b<a name="line.3384"></a>
+<span class="sourceLineNo">3385</span>    // r4: first:a, first:b, second:a<a name="line.3385"></a>
+<span class="sourceLineNo">3386</span>    // r4: second:b<a name="line.3386"></a>
+<span class="sourceLineNo">3387</span>    // r5: first:a<a name="line.3387"></a>
+<span class="sourceLineNo">3388</span>    // r6: first:a<a name="line.3388"></a>
+<span class="sourceLineNo">3389</span>    // r7: first:a<a name="line.3389"></a>
+<span class="sourceLineNo">3390</span>    // r8: first:a<a name="line.3390"></a>
+<span class="sourceLineNo">3391</span>    // r9: first:a<a name="line.3391"></a>
+<span class="sourceLineNo">3392</span><a name="line.3392"></a>
+<span class="sourceLineNo">3393</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.3393"></a>
+<span class="sourceLineNo">3394</span>    int index = 0;<a name="line.3394"></a>
+<span class="sourceLineNo">3395</span>    ScannerContext scannerContext = ScannerContext.newBuilder().setBatchLimit(3).build();<a name="line.3395"></a>
+<span class="sourceLineNo">3396</span>    while (true) {<a name="line.3396"></a>
+<span class="sourceLineNo">3397</span>      boolean more = s.next(results, scannerContext);<a name="line.3397"></a>
+<span class="sourceLineNo">3398</span>      if ((index &gt;&gt; 1) &lt; 5) {<a name="line.3398"></a>
+<span class="sourceLineNo">3399</span>        if (index % 2 == 0) {<a name="line.3399"></a>
+<span class="sourceLineNo">3400</span>          assertEquals(3, results.size());<a name="line.3400"></a>
+<span class="sourceLineNo">3401</span>        } else {<a name="line.3401"></a>
+<span class="sourceLineNo">3402</span>          assertEquals(1, results.size());<a name="line.3402"></a>
+<span class="sourceLineNo">3403</span>        }<a name="line.3403"></a>
+<span class="sourceLineNo">3404</span>      } else {<a name="line.3404"></a>
+<span class="sourceLineNo">3405</span>        assertEquals(1, results.size());<a name="line.3405"></a>
+<span class="sourceLineNo">3406</span>      }<a name="line.3406"></a>
+<span class="sourceLineNo">3407</span>      results.clear();<a name="line.3407"></a>
+<span class="sourceLineNo">3408</span>      index++;<a name="line.3408"></a>
+<span class="sourceLineNo">3409</span>      if (!more) {<a name="line.3409"></a>
+<span class="sourceLineNo">3410</span>        break;<a name="line.3410"></a>
+<span class="sourceLineNo">3411</span>      }<a name="line.3411"></a>
+<span class="sourceLineNo">3412</span>    }<a name="line.3412"></a>
+<span class="sourceLineNo">3413</span>  }<a name="line.3413"></a>
+<span class="sourceLineNo">3414</span><a name="line.3414"></a>
+<span class="sourceLineNo">3415</span>  /**<a name="line.3415"></a>
+<span class="sourceLineNo">3416</span>   * Write an HFile block full with Cells whose qualifier that are identical between<a name="line.3416"></a>
+<span class="sourceLineNo">3417</span>   * 0 and Short.MAX_VALUE. See HBASE-13329.<a name="line.3417"></a>
+<span class="sourceLineNo">3418</span>   * @throws Exception<a name="line.3418"></a>
+<span class="sourceLineNo">3419</span>   */<a name="line.3419"></a>
+<span class="sourceLineNo">3420</span>  @Test<a name="line.3420"></a>
+<span class="sourceLineNo">3421</span>  public void testLongQualifier() throws Exception {<a name="line.3421"></a>
+<span class="sourceLineNo">3422</span>    byte[] family = Bytes.toBytes("family");<a name="line.3422"></a>
+<span class="sourceLineNo">3423</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.3423"></a>
+<span class="sourceLineNo">3424</span>    byte[] q = new byte[Short.MAX_VALUE+2];<a name="line.3424"></a>
+<span class="sourceLineNo">3425</span>    Arrays.fill(q, 0, q.length-1, (byte)42);<a name="line.3425"></a>
+<span class="sourceLineNo">3426</span>    for (byte i=0; i&lt;10; i++) {<a name="line.3426"></a>
+<span class="sourceLineNo">3427</span>      Put p = new Put(Bytes.toBytes("row"));<a name="line.3427"></a>
+<span class="sourceLineNo">3428</span>      // qualifiers that differ past Short.MAX_VALUE<a name="line.3428"></a>
+<span class="sourceLineNo">3429</span>      q[q.length-1]=i;<a name="line.3429"></a>
+<span class="sourceLineNo">3430</span>      p.addColumn(family, q, q);<a name="line.3430"></a>
+<span class="sourceLineNo">3431</span>      region.put(p);<a name="line.3431"></a>
+<span class="sourceLineNo">3432</span>    }<a name="line.3432"></a>
+<span class="sourceLineNo">3433</span>    region.flush(false);<a name="line.3433"></a>
+<span class="sourceLineNo">3434</span>  }<a name="line.3434"></a>
+<span class="sourceLineNo">3435</span><a name="line.3435"></a>
+<span class="sourceLineNo">3436</span>  /**<a name="line.3436"></a>
+<span class="sourceLineNo">3437</span>   * Flushes the cache in a thread while scanning. The tests verify that the<a name="line.3437"></a>
+<span class="sourceLineNo">3438</span>   * scan is coherent - e.g. the returned results are always of the same or<a name="line.3438"></a>
+<span class="sourceLineNo">3439</span>   * later update as the previous results.<a name="line.3439"></a>
+<span class="sourceLineNo">3440</span>   *<a name="line.3440"></a>
+<span class="sourceLineNo">3441</span>   * @throws IOException<a name="line.3441"></a>
+<span class="sourceLineNo">3442</span>   *           scan / compact<a name="line.3442"></a>
+<span class="sourceLineNo">3443</span>   * @throws InterruptedException<a name="line.3443"></a>
+<span class="sourceLineNo">3444</span>   *           thread join<a name="line.3444"></a>
+<span class="sourceLineNo">3445</span>   */<a name="line.3445"></a>
+<span class="sourceLineNo">3446</span>  @Test<a name="line.3446"></a>
+<span class="sourceLineNo">3447</span>  public void testFlushCacheWhileScanning() throws IOException, InterruptedException {<a name="line.3447"></a>
+<span class="sourceLineNo">3448</span>    byte[] family = Bytes.toBytes("family");<a name="line.3448"></a>
+<span class="sourceLineNo">3449</span>    int numRows = 1000;<a name="line.3449"></a>
+<span class="sourceLineNo">3450</span>    int flushAndScanInterval = 10;<a name="line.3450"></a>
+<span class="sourceLineNo">3451</span>    int compactInterval = 10 * flushAndScanInterval;<a name="line.3451"></a>
 <span class="sourceLineNo">3452</span><a name="line.3452"></a>
-<span class="sourceLineNo">3453</span>      int expectedCount = 0;<a name="line.3453"></a>
-<span class="sourceLineNo">3454</span>      List&lt;Cell&gt; res = new ArrayList&lt;&gt;();<a name="line.3454"></a>
-<span class="sourceLineNo">3455</span><a name="line.3455"></a>
-<span class="sourceLineNo">3456</span>      boolean toggle = true;<a name="line.3456"></a>
-<span class="sourceLineNo">3457</span>      for (long i = 0; i &lt; numRows; i++) {<a name="line.3457"></a>
-<span class="sourceLineNo">3458</span>        Put put = new Put(Bytes.toBytes(i));<a name="line.3458"></a>
-<span class="sourceLineNo">3459</span>        put.setDurability(Durability.SKIP_WAL);<a name="line.3459"></a>
-<span class="sourceLineNo">3460</span>        put.addColumn(family, qual1, Bytes.toBytes(i % 10));<a name="line.3460"></a>
-<span class="sourceLineNo">3461</span>        region.put(put);<a name="line.3461"></a>
+<span class="sourceLineNo">3453</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.3453"></a>
+<span class="sourceLineNo">3454</span>    FlushThread flushThread = new FlushThread();<a name="line.3454"></a>
+<span class="sourceLineNo">3455</span>    try {<a name="line.3455"></a>
+<span class="sourceLineNo">3456</span>      flushThread.start();<a name="line.3456"></a>
+<span class="sourceLineNo">3457</span><a name="line.3457"></a>
+<span class="sourceLineNo">3458</span>      Scan scan = new Scan();<a name="line.3458"></a>
+<span class="sourceLineNo">3459</span>      scan.addFamily(family);<a name="line.3459"></a>
+<span class="sourceLineNo">3460</span>      scan.setFilter(new SingleColumnValueFilter(family, qual1, CompareOperator.EQUAL,<a name="line.3460"></a>
+<span class="sourceLineNo">3461</span>          new BinaryComparator(Bytes.toBytes(5L))));<a name="line.3461"></a>
 <span class="sourceLineNo">3462</span><a name="line.3462"></a>
-<span class="sourceLineNo">3463</span>        if (i != 0 &amp;&amp; i % compactInterval == 0) {<a name="line.3463"></a>
-<span class="sourceLineNo">3464</span>          LOG.debug("iteration = " + i+ " ts="+System.currentTimeMillis());<a name="line.3464"></a>
-<span class="sourceLineNo">3465</span>          region.compact(true);<a name="line.3465"></a>
-<span class="sourceLineNo">3466</span>        }<a name="line.3466"></a>
-<span class="sourceLineNo">3467</span><a name="line.3467"></a>
-<span class="sourceLineNo">3468</span>        if (i % 10 == 5L) {<a name="line.3468"></a>
-<span class="sourceLineNo">3469</span>          expectedCount++;<a name="line.3469"></a>
-<span class="sourceLineNo">3470</span>        }<a name="line.3470"></a>
-<span class="sourceLineNo">3471</span><a name="line.3471"></a>
-<span class="sourceLineNo">3472</span>        if (i != 0 &amp;&amp; i % flushAndScanInterval == 0) {<a name="line.3472"></a>
-<span class="sourceLineNo">3473</span>          res.clear();<a name="line.3473"></a>
-<span class="sourceLineNo">3474</span>          InternalScanner scanner = region.getScanner(scan);<a name="line.3474"></a>
-<span class="sourceLineNo">3475</span>          if (toggle) {<a name="line.3475"></a>
-<span class="sourceLineNo">3476</span>            flushThread.flush();<a name="line.3476"></a>
-<span class="sourceLineNo">3477</span>          }<a name="line.3477"></a>
-<span class="sourceLineNo">3478</span>          while (scanner.next(res))<a name="line.3478"></a>
-<span class="sourceLineNo">3479</span>            ;<a name="line.3479"></a>
-<span class="sourceLineNo">3480</span>          if (!toggle) {<a name="line.3480"></a>
-<span class="sourceLineNo">3481</span>            flushThread.flush();<a name="line.3481"></a>
-<span class="sourceLineNo">3482</span>          }<a name="line.3482"></a>
-<span class="sourceLineNo">3483</span>          assertEquals("toggle="+toggle+"i=" + i + " ts="+System.currentTimeMillis(),<a name="line.3483"></a>
-<span class="sourceLineNo">3484</span>              expectedCount, res.size());<a name="line.3484"></a>
-<span class="sourceLineNo">3485</span>          toggle = !toggle;<a name="line.3485"></a>
-<span class="sourceLineNo">3486</span>        }<a name="line.3486"></a>
-<span class="sourceLineNo">3487</span>      }<a name="line.3487"></a>
-<span class="sourceLineNo">3488</span><a name="line.3488"></a>
-<span class="sourceLineNo">3489</span>    } finally {<a name="line.3489"></a>
-<span class="sourceLineNo">3490</span>      try {<a name="line.3490"></a>
-<span class="sourceLineNo">3491</span>        flushThread.done();<a name="line.3491"></a>
-<span class="sourceLineNo">3492</span>        flushThread.join();<a name="line.3492"></a>
-<span class="sourceLineNo">3493</span>        flushThread.checkNoError();<a name="line.3493"></a>
-<span class="sourceLineNo">3494</span>      } catch (InterruptedException ie) {<a name="line.3494"></a>
-<span class="sourceLineNo">3495</span>        LOG.warn("Caught exception when joining with flushThread", ie);<a name="line.3495"></a>
-<span class="sourceLineNo">3496</span>      }<a name="line.3496"></a>
-<span class="sourceLineNo">3497</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.3497"></a>
-<span class="sourceLineNo">3498</span>      this.region = null;<a name="line.3498"></a>
-<span class="sourceLineNo">3499</span>    }<a name="line.3499"></a>
-<span class="sourceLineNo">3500</span>  }<a name="line.3500"></a>
-<span class="sourceLineNo">3501</span><a name="line.3501"></a>
-<span class="sourceLineNo">3502</span>  protected class FlushThread extends Thread {<a name="line.3502"></a>
-<span class="sourceLineNo">3503</span>    private volatile boolean done;<a name="line.3503"></a>
-<span class="sourceLineNo">3504</span>    private Throwable error = null;<a name="line.3504"></a>
-<span class="sourceLineNo">3505</span><a name="line.3505"></a>
-<span class="sourceLineNo">3506</span>    FlushThread() {<a name="line.3506"></a>
-<span class="sourceLineNo">3507</span>      super("FlushThread");<a name="line.3507"></a>
-<span class="sourceLineNo">3508</span>    }<a name="line.3508"></a>
-<span class="sourceLineNo">3509</span><a name="line.3509"></a>
-<span class="sourceLineNo">3510</span>    public void done() {<a name="line.3510"></a>
-<span class="sourceLineNo">3511</span>      done = true;<a name="line.3511"></a>
-<span class="sourceLineNo">3512</span>      synchronized (this) {<a name="line.3512"></a>
-<span class="sourceLineNo">3513</span>        interrupt();<a name="line.3513"></a>
-<span class="sourceLineNo">3514</span>      }<a name="line.3514"></a>
-<span class="sourceLineNo">3515</span>    }<a name="line.3515"></a>
-<span class="sourceLineNo">3516</span><a name="line.3516"></a>
-<span class="sourceLineNo">3517</span>    public void checkNoError() {<a name="line.3517"></a>
-<span class="sourceLineNo">3518</span>      if (error != null) {<a name="line.3518"></a>
-<span class="sourceLineNo">3519</span>        assertNull(error);<a name="line.3519"></a>
-<span class="sourceLineNo">3520</span>      }<a name="line.3520"></a>
-<span class="sourceLineNo">3521</span>    }<a name="line.3521"></a>
-<span class="sourceLineNo">3522</span><a name="line.3522"></a>
-<span class="sourceLineNo">3523</span>    @Override<a name="line.3523"></a>
-<span class="sourceLineNo">3524</span>    public void run() {<a name="line.3524"></a>
-<span class="sourceLineNo">3525</span>      done = false;<a name="line.3525"></a>
-<span class="sourceLineNo">3526</span>      while (!done) {<a name="line.3526"></a>
-<span class="sourceLineNo">3527</span>        synchronized (this) {<a name="line.3527"></a>
-<span class="sourceLineNo">3528</span>          try {<a name="line.3528"></a>
-<span class="sourceLineNo">3529</span>            wait();<a name="line.3529"></a>
-<span class="sourceLineNo">3530</span>          } catch (InterruptedException ignored) {<a name="line.3530"></a>
-<span class="sourceLineNo">3531</span>            if (done) {<a name="line.3531"></a>
-<span class="sourceLineNo">3532</span>              break;<a name="line.3532"></a>
-<span class="sourceLineNo">3533</span>            }<a name="line.3533"></a>
-<span class="sourceLineNo">3534</span>          }<a name="line.3534"></a>
-<span class="sourceLineNo">3535</span>        }<a name="line.3535"></a>
-<span class="sourceLineNo">3536</span>        try {<a name="line.3536"></a>
-<span class="sourceLineNo">3537</span>          region.flush(true);<a name="line.3537"></a>
-<span class="sourceLineNo">3538</span>        } catch (IOException e) {<a name="line.3538"></a>
-<span class="sourceLineNo">3539</span>          if (!done) {<a name="line.3539"></a>
-<span class="sourceLineNo">3540</span>            LOG.error("Error while flushing cache", e);<a name="line.3540"></a>
-<span class="sourceLineNo">3541</span>            error = e;<a name="line.3541"></a>
-<span class="sourceLineNo">3542</span>          }<a name="line.3542"></a>
-<span class="sourceLineNo">3543</span>          break;<a name="line.3543"></a>
-<span class="sourceLineNo">3544</span>        } catch (Throwable t) {<a name="line.3544"></a>
-<span class="sourceLineNo">3545</span>          LOG.error("Uncaught exception", t);<a name="line.3545"></a>
-<span class="sourceLineNo">3546</span>          throw t;<a name="line.3546"></a>
-<span class="sourceLineNo">3547</span>        }<a name="line.3547"></a>
-<span class="sourceLineNo">3548</span>      }<a name="line.3548"></a>
-<span class="sourceLineNo">3549</span>    }<a name="line.3549"></a>
-<span class="sourceLineNo">3550</span><a name="line.3550"></a>
-<span class="sourceLineNo">3551</span>    public void flush() {<a name="line.3551"></a>
-<span class="sourceLineNo">3552</span>      synchronized (this) {<a name="line.3552"></a>
-<span class="sourceLineNo">3553</span>        notify();<a name="line.3553"></a>
-<span class="sourceLineNo">3554</span>      }<a name="line.3554"></a>
-<span class="sourceLineNo">3555</span>    }<a name="line.3555"></a>
-<span class="sourceLineNo">3556</span>  }<a name="line.3556"></a>
-<span class="sourceLineNo">3557</span><a name="line.3557"></a>
-<span class="sourceLineNo">3558</span>  /**<a name="line.3558"></a>
-<span class="sourceLineNo">3559</span>   * Writes very wide records and scans for the latest every time.. Flushes and<a name="line.3559"></a>
-<span class="sourceLineNo">3560</span>   * compacts the region every now and then to keep things realistic.<a name="line.3560"></a>
-<span class="sourceLineNo">3561</span>   *<a name="line.3561"></a>
-<span class="sourceLineNo">3562</span>   * @throws IOException<a name="line.3562"></a>
-<span class="sourceLineNo">3563</span>   *           by flush / scan / compaction<a name="line.3563"></a>
-<span class="sourceLineNo">3564</span>   * @throws InterruptedException<a name="line.3564"></a>
-<span class="sourceLineNo">3565</span>   *           when joining threads<a name="line.3565"></a>
-<span class="sourceLineNo">3566</span>   */<a name="line.3566"></a>
-<span class="sourceLineNo">3567</span>  @Test<a name="line.3567"></a>
-<span class="sourceLineNo">3568</span>  public void testWritesWhileScanning() throws IOException, InterruptedException {<a name="line.3568"></a>
-<span class="sourceLineNo">3569</span>    int testCount = 100;<a name="line.3569"></a>
-<span class="sourceLineNo">3570</span>    int numRows = 1;<a name="line.3570"></a>
-<span class="sourceLineNo">3571</span>    int numFamilies = 10;<a name="line.3571"></a>
-<span class="sourceLineNo">3572</span>    int numQualifiers = 100;<a name="line.3572"></a>
-<span class="sourceLineNo">3573</span>    int flushInterval = 7;<a name="line.3573"></a>
-<span class="sourceLineNo">3574</span>    int compactInterval = 5 * flushInterval;<a name="line.3574"></a>
-<span class="sourceLineNo">3575</span>    byte[][] families = new byte[numFamilies][];<a name="line.3575"></a>
-<span class="sourceLineNo">3576</span>    for (int i = 0; i &lt; numFamilies; i++) {<a name="line.3576"></a>
-<span class="sourceLineNo">3577</span>      families[i] = Bytes.toBytes("family" + i);<a name="line.3577"></a>
-<span class="sourceLineNo">3578</span>    }<a name="line.3578"></a>
-<span class="sourceLineNo">3579</span>    byte[][] qualifiers = new byte[numQualifiers][];<a name="line.3579"></a>
-<span class="sourceLineNo">3580</span>    for (int i = 0; i &lt; numQualifiers; i++) {<a name="line.3580"></a>
-<span class="sourceLineNo">3581</span>      qualifiers[i] = Bytes.toBytes("qual" + i);<a name="line.3581"></a>
-<span class="sourceLineNo">3582</span>    }<a name="line.3582"></a>
-<span class="sourceLineNo">3583</span><a name="line.3583"></a>
-<span class="sourceLineNo">3584</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.3584"></a>
-<span class="sourceLineNo">3585</span>    FlushThread flushThread = new FlushThread();<a name="line.3585"></a>
-<span class="sourceLineNo">3586</span>    PutThread putThread = new PutThread(numRows, families, qualifiers);<a name="line.3586"></a>
-<span class="sourceLineNo">3587</span>    try {<a name="line.3587"></a>
-<span class="sourceLineNo">3588</span>      putThread.start();<a name="line.3588"></a>
-<span class="sourceLineNo">3589</span>      putThread.waitForFirstPut();<a name="line.3589"></a>
-<span class="sourceLineNo">3590</span><a name="line.3590"></a>
-<span class="sourceLineNo">3591</span>      flushThread.start();<a name="line.3591"></a>
-<span class="sourceLineNo">3592</span><a name="line.3592"></a>
-<span class="sourceLineNo">3593</span>      Scan scan = new Scan(Bytes.toBytes("row0"), Bytes.toBytes("row1"));<a name="line.3593"></a>
-<span class="sourceLineNo">3594</span><a name="line.3594"></a>
-<span class="sourceLineNo">3595</span>      int expectedCount = numFamilies * numQualifiers;<a name="line.3595"></a>
-<span class="sourceLineNo">3596</span>      List&lt;Cell&gt; res = new ArrayList&lt;&gt;();<a name="line.3596"></a>
-<span class="sourceLineNo">3597</span><a name="line.3597"></a>
-<span class="sourceLineNo">3598</span>      long prevTimestamp = 0L;<a name="line.3598"></a>
-<span class="sourceLineNo">3599</span>      for (int i = 0; i &lt; testCount; i++) {<a name="line.3599"></a>
+<span class="sourceLineNo">3463</span>      int expectedCount = 0;<a name="line.3463"></a>
+<span class="sourceLineNo">3464</span>      List&lt;Cell&gt; res = new ArrayList&lt;&gt;();<a name="line.3464"></a>
+<span class="sourceLineNo">3465</span><a name="line.3465"></a>
+<span class="sourceLineNo">3466</span>      boolean toggle = true;<a name="line.3466"></a>
+<span class="sourceLineNo">3467</span>      for (long i = 0; i &lt; numRows; i++) {<a name="line.3467"></a>
+<span class="sourceLineNo">3468</span>        Put put = new Put(Bytes.toBytes(i));<a name="line.3468"></a>
+<span class="sourceLineNo">3469</span>        put.setDurability(Durability.SKIP_WAL);<a name="line.3469"></a>
+<span class="sourceLineNo">3470</span>        put.addColumn(family, qual1, Bytes.toBytes(i % 10));<a name="line.3470"></a>
+<span class="sourceLineNo">3471</span>        region.put(put);<a name="line.3471"></a>
+<span class="sourceLineNo">3472</span><a name="line.3472"></a>
+<span class="sourceLineNo">3473</span>        if (i != 0 &amp;&amp; i % compactInterval == 0) {<a name="line.3473"></a>
+<span class="sourceLineNo">3474</span>          LOG.debug("iteration = " + i+ " ts="+System.currentTimeMillis());<a name="line.3474"></a>
+<span class="sourceLineNo">3475</span>          region.compact(true);<a name="line.3475"></a>
+<span class="sourceLineNo">3476</span>        }<a name="line.3476"></a>
+<span class="sourceLineNo">3477</span><a name="line.3477"></a>
+<span class="sourceLineNo">3478</span>        if (i % 10 == 5L) {<a name="line.3478"></a>
+<span class="sourceLineNo">3479</span>          expectedCount++;<a name="line.3479"></a>
+<span class="sourceLineNo">3480</span>        }<a name="line.3480"></a>
+<span class="sourceLineNo">3481</span><a name="line.3481"></a>
+<span class="sourceLineNo">3482</span>        if (i != 0 &amp;&amp; i % flushAndScanInterval == 0) {<a name="line.3482"></a>
+<span class="sourceLineNo">3483</span>          res.clear();<a name="line.3483"></a>
+<span class="sourceLineNo">3484</span>          InternalScanner scanner = region.getScanner(scan);<a name="line.3484"></a>
+<span class="sourceLineNo">3485</span>          if (toggle) {<a name="line.3485"></a>
+<span class="sourceLineNo">3486</span>            flushThread.flush();<a name="line.3486"></a>
+<span class="sourceLineNo">3487</span>          }<a name="line.3487"></a>
+<span class="sourceLineNo">3488</span>          while (scanner.next(res))<a name="line.3488"></a>
+<span class="sourceLineNo">3489</span>            ;<a name="line.3489"></a>
+<span class="sourceLineNo">3490</span>          if (!toggle) {<a name="line.3490"></a>
+<span class="sourceLineNo">3491</span>            flushThread.flush();<a name="line.3491"></a>
+<span class="sourceLineNo">3492</span>          }<a name="line.3492"></a>
+<span class="sourceLineNo">3493</span>          assertEquals("toggle="+toggle+"i=" + i + " ts="+System.currentTimeMillis(),<a name="line.3493"></a>
+<span class="sourceLineNo">3494</span>              expectedCount, res.size());<a name="line.3494"></a>
+<span class="sourceLineNo">3495</span>          toggle = !toggle;<a name="line.3495"></a>
+<span class="sourceLineNo">3496</span>        }<a name="line.3496"></a>
+<span class="sourceLineNo">3497</span>      }<a name="line.3497"></a>
+<span class="sourceLineNo">3498</span><a name="line.3498"></a>
+<span class="sourceLineNo">3499</span>    } finally {<a name="line.3499"></a>
+<span class="sourceLineNo">3500</span>      try {<a name="line.3500"></a>
+<span class="sourceLineNo">3501</span>        flushThread.done();<a name="line.3501"></a>
+<span class="sourceLineNo">3502</span>        flushThread.join();<a name="line.3502"></a>
+<span class="sourceLineNo">3503</span>        flushThread.checkNoError();<a name="line.3503"></a>
+<span class="sourceLineNo">3504</span>      } catch (InterruptedException ie) {<a name="line.3504"></a>
+<span class="sourceLineNo">3505</span>        LOG.warn("Caught exception when joining with flushThread", ie);<a name="line.3505"></a>
+<span class="sourceLineNo">3506</span>      }<a name="line.3506"></a>
+<span class="sourceLineNo">3507</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.3507"></a>
+<span class="sourceLineNo">3508</span>      this.region = null;<a name="line.3508"></a>
+<span class="sourceLineNo">3509</span>    }<a name="line.3509"></a>
+<span class="sourceLineNo">3510</span>  }<a name="line.3510"></a>
+<span class="sourceLineNo">3511</span><a name="line.3511"></a>
+<span class="sourceLineNo">3512</span>  protected class FlushThread extends Thread {<a name="line.3512"></a>
+<span class="sourceLineNo">3513</span>    private volatile boolean done;<a name="line.3513"></a>
+<span class="sourceLineNo">3514</span>    private Throwable error = null;<a name="line.3514"></a>
+<span class="sourceLineNo">3515</span><a name="line.3515"></a>
+<span class="sourceLineNo">3516</span>    FlushThread() {<a name="line.3516"></a>
+<span class="sourceLineNo">3517</span>      super("FlushThread");<a name="line.3517"></a>
+<span class="sourceLineNo">3518</span>    }<a name="line.3518"></a>
+<span class="sourceLineNo">3519</span><a name="line.3519"></a>
+<span class="sourceLineNo">3520</span>    public void done() {<a name="line.3520"></a>
+<span class="sourceLineNo">3521</span>      done = true;<a name="line.3521"></a>
+<span class="sourceLineNo">3522</span>      synchronized (this) {<a name="line.3522"></a>
+<span class="sourceLineNo">3523</span>        interrupt();<a name="line.3523"></a>
+<span class="sourceLineNo">3524</span>      }<a name="line.3524"></a>
+<span class="sourceLineNo">3525</span>    }<a name="line.3525"></a>
+<span class="sourceLineNo">3526</span><a name="line.3526"></a>
+<span class="sourceLineNo">3527</span>    public void checkNoError() {<a name="line.3527"></a>
+<span class="sourceLineNo">3528</span>      if (error != null) {<a name="line.3528"></a>
+<span class="sourceLineNo">3529</span>        assertNull(error);<a name="line.3529"></a>
+<span class="sourceLineNo">3530</span>      }<a name="line.3530"></a>
+<span class="sourceLineNo">3531</span>    }<a name="line.3531"></a>
+<span class="sourceLineNo">3532</span><a name="line.3532"></a>
+<span class="sourceLineNo">3533</span>    @Override<a name="line.3533"></a>
+<span class="sourceLineNo">3534</span>    public void run() {<a name="line.3534"></a>
+<span class="sourceLineNo">3535</span>      done = false;<a name="line.3535"></a>
+<span class="sourceLineNo">3536</span>      while (!done) {<a name="line.3536"></a>
+<span class="sourceLineNo">3537</span>        synchronized (this) {<a name="line.3537"></a>
+<span class="sourceLineNo">3538</span>          try {<a name="line.3538"></a>
+<span class="sourceLineNo">3539</span>            wait();<a name="line.3539"></a>
+<span class="sourceLineNo">3540</span>          } catch (InterruptedException ignored) {<a name="line.3540"></a>
+<span class="sourceLineNo">3541</span>            if (done) {<a name="line.3541"></a>
+<span class="sourceLineNo">3542</span>              break;<a name="line.3542"></a>
+<span class="sourceLineNo">3543</span>            }<a name="line.3543"></a>
+<span class="sourceLineNo">3544</span>          }<a name="line.3544"></a>
+<span class="sourceLineNo">3545</span>        }<a name="line.3545"></a>
+<span class="sourceLineNo">3546</span>        try {<a name="line.3546"></a>
+<span class="sourceLineNo">3547</span>          region.flush(true);<a name="line.3547"></a>
+<span class="sourceLineNo">3548</span>        } catch (IOException e) {<a name="line.3548"></a>
+<span class="sourceLineNo">3549</span>          if (!done) {<a name="line.3549"></a>
+<span class="sourceLineNo">3550</span>            LOG.error("Error while flushing cache", e);<a name="line.3550"></a>
+<span class="sourceLineNo">3551</span>            error = e;<a name="line.3551"></a>
+<span class="sourceLineNo">3552</span>          }<a name="line.3552"></a>
+<span class="sourceLineNo">3553</span>          break;<a name="line.3553"></a>
+<span class="sourceLineNo">3554</span>        } catch (Throwable t) {<a name="line.3554"></a>
+<span class="sourceLineNo">3555</span>          LOG.error("Uncaught exception", t);<a name="line.3555"></a>
+<span class="sourceLineNo">3556</span>          throw t;<a name="line.3556"></a>
+<span class="sourceLineNo">3557</span>        }<a name="line.3557"></a>
+<span class="sourceLineNo">3558</span>      }<a name="line.3558"></a>
+<span class="sourceLineNo">3559</span>    }<a name="line.3559"></a>
+<span class="sourceLineNo">3560</span><a name="line.3560"></a>
+<span class="sourceLineNo">3561</span>    public void flush() {<a name="line.3561"></a>
+<span class="sourceLineNo">3562</span>      synchronized (this) {<a name="line.3562"></a>
+<span class="sourceLineNo">3563</span>        notify();<a name="line.3563"></a>
+<span class="sourceLineNo">3564</span>      }<a name="line.3564"></a>
+<span class="sourceLineNo">3565</span>    }<a name="line.3565"></a>
+<span class="sourceLineNo">3566</span>  }<a name="line.3566"></a>
+<span class="sourceLineNo">3567</span><a name="line.3567"></a>
+<span class="sourceLineNo">3568</span>  /**<a name="line.3568"></a>
+<span class="sourceLineNo">3569</span>   * Writes very wide records and scans for the latest every time.. Flushes and<a name="line.3569"></a>
+<span class="sourceLineNo">3570</span>   * compacts the region every now and then to keep things realistic.<a name="line.3570"></a>
+<span class="sourceLineNo">3571</span>   *<a name="line.3571"></a>
+<span class="sourceLineNo">3572</span>   * @throws IOException<a name="line.3572"></a>
+<span class="sourceLineNo">3573</span>   *           by flush / scan / compaction<a name="line.3573"></a>
+<span class="sourceLineNo">3574</span>   * @throws InterruptedException<a name="line.3574"></a>
+<span class="sourceLineNo">3575</span>   *           when joining threads<a name="line.3575"></a>
+<span class="sourceLineNo">3576</span>   */<a name="line.3576"></a>
+<span class="sourceLineNo">3577</span>  @Test<a name="line.3577"></a>
+<span class="sourceLineNo">3578</span>  public void testWritesWhileScanning() throws IOException, InterruptedException {<a name="line.3578"></a>
+<span class="sourceLineNo">3579</span>    int testCount = 100;<a name="line.3579"></a>
+<span class="sourceLineNo">3580</span>    int numRows = 1;<a name="line.3580"></a>
+<span class="sourceLineNo">3581</span>    int numFamilies = 10;<a name="line.3581"></a>
+<span class="sourceLineNo">3582</span>    int numQualifiers = 100;<a name="line.3582"></a>
+<span class="sourceLineNo">3583</span>    int flushInterval = 7;<a name="line.3583"></a>
+<span class="sourceLineNo">3584</span>    int compactInterval = 5 * flushInterval;<a name="line.3584"></a>
+<span class="sourceLineNo">3585</span>    byte[][] families = new byte[numFamilies][];<a name="line.3585"></a>
+<span class="sourceLineNo">3586</span>    for (int i = 0; i &lt; numFamilies; i++) {<a name="line.3586"></a>
+<span class="sourceLineNo">3587</span>      families[i] = Bytes.toBytes("family" + i);<a name="line.3587"></a>
+<span class="sourceLineNo">3588</span>    }<a name="line.3588"></a>
+<span class="sourceLineNo">3589</span>    byte[][] qualifiers = new byte[numQualifiers][];<a name="line.3589"></a>
+<span class="sourceLineNo">3590</span>    for (int i = 0; i &lt; numQualifiers; i++) {<a name="line.3590"></a>
+<span class="sourceLineNo">3591</span>      qualifiers[i] = Bytes.toBytes("qual" + i);<a name="line.3591"></a>
+<span class="sourceLineNo">3592</span>    }<a name="line.3592"></a>
+<span class="sourceLineNo">3593</span><a name="line.3593"></a>
+<span class="sourceLineNo">3594</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.3594"></a>
+<span class="sourceLineNo">3595</span>    FlushThread flushThread = new FlushThread();<a name="line.3595"></a>
+<span class="sourceLineNo">3596</span>    PutThread putThread = new PutThread(numRows, families, qualifiers);<a name="line.3596"></a>
+<span class="sourceLineNo">3597</span>    try {<a name="line.3597"></a>
+<span class="sourceLineNo">3598</span>      putThread.start();<a name="line.3598"></a>
+<span class="sourceLineNo">3599</span>      putThread.waitForFirstPut();<a name="line.3599"></a>
 <span class="sourceLineNo">3600</span><a name="line.3600"></a>
-<span class="sourceLineNo">3601</span>        if (i != 0 &amp;&amp; i % compactInterval == 0) {<a name="line.3601"></a>
-<span class="sourceLineNo">3602</span>          region.compact(true);<a name="line.3602"></a>
-<span class="sourceLineNo">3603</span>          for (HStore store : region.getStores()) {<a name="line.3603"></a>
-<span class="sourceLineNo">3604</span>            store.closeAndArchiveCompactedFiles();<a name="line.3604"></a>
-<span class="sourceLineNo">3605</span>          }<a name="line.3605"></a>
-<span class="sourceLineNo">3606</span>        }<a name="line.3606"></a>
+<span class="sourceLineNo">3601</span>      flushThread.start();<a name="line.3601"></a>
+<span class="sourceLineNo">3602</span><a name="line.3602"></a>
+<span class="sourceLineNo">3603</span>      Scan scan = new Scan(Bytes.toBytes("row0"), Bytes.toBytes("row1"));<a name="line.3603"></a>
+<span class="sourceLineNo">3604</span><a name="line.3604"></a>
+<span class="sourceLineNo">3605</span>      int expectedCount = numFamilies * numQualifiers;<a name="line.3605"></a>
+<span class="sourceLineNo">3606</span>      List&lt;Cell&gt; res = new ArrayList&lt;&gt;();<a name="line.3606"></a>
 <span class="sourceLineNo">3607</span><a name="line.3607"></a>
-<span class="sourceLineNo">3608</span>        if (i != 0 &amp;&amp; i % flushInterval == 0) {<a name="line.3608"></a>
-<span class="sourceLineNo">3609</span>          flushThread.flush();<a name="line.3609"></a>
-<span class="sourceLineNo">3610</span>        }<a name="line.3610"></a>
-<span class="sourceLineNo">3611</span><a name="line.3611"></a>
-<span class="sourceLineNo">3612</span>        boolean previousEmpty = res.isEmpty();<a name="line.3612"></a>
-<span class="sourceLineNo">3613</span>        res.clear();<a name="line.3613"></a>
-<span class="sourceLineNo">3614</span>        try (InternalScanner scanner = region.getScanner(scan)) {<a name="line.3614"></a>
-<span class="sourceLineNo">3615</span>          boolean moreRows;<a name="line.3615"></a>
-<span class="sourceLineNo">3616</span>          do {<a name="line.3616"></a>
-<span class="sourceLineNo">3617</span>            moreRows = scanner.next(res);<a name="line.3617"></a>
-<span class="sourceLineNo">3618</span>          } while (moreRows);<a name="line.3618"></a>
-<span class="sourceLineNo">3619</span>        }<a name="line.3619"></a>
-<span class="sourceLineNo">3620</span>        if (!res.isEmpty() || !previousEmpty || i &gt; compactInterval) {<a name="line.3620"></a>
-<span class="sourceLineNo">3621</span>          assertEquals("i=" + i, expectedCount, res.size());<a name="line.3621"></a>
-<span class="sourceLineNo">3622</span>          long timestamp = res.get(0).getTimestamp();<a name="line.3622"></a>
-<span class="sourceLineNo">3623</span>          assertTrue("Timestamps were broke: " + timestamp + " prev: " + prevTimestamp,<a name="line.3623"></a>
-<span class="sourceLineNo">3624</span>              timestamp &gt;= prevTimestamp);<a name="line.3624"></a>
-<span class="sourceLineNo">3625</span>          prevTimestamp = timestamp;<a name="line.3625"></a>
-<span class="sourceLineNo">3626</span>        }<a name="line.3626"></a>
-<span class="sourceLineNo">3627</span>      }<a name="line.3627"></a>
-<span class="sourceLineNo">3628</span><a name="line.3628"></a>
-<span class="sourceLineNo">3629</span>      putThread.done();<a name="line.3629"></a>
-<span class="sourceLineNo">3630</span><a name="line.3630"></a>
-<span class="sourceLineNo">3631</span>      region.flush(true);<a name="line.3631"></a>
-<span class="sourceLineNo">3632</span><a name="line.3632"></a>
-<span class="sourceLineNo">3633</span>    } finally {<a name="line.3633"></a>
-<span class="sourceLineNo">3634</span>      try {<a name="line.3634"></a>
-<span class="sourceLineNo">3635</span>        flushThread.done();<a name="line.3635"></a>
-<span class="sourceLineNo">3636</span>        flushThread.join();<a name="line.3636"></a>
-<span class="sourceLineNo">3637</span>        flushThread.checkNoError();<a name="line.3637"></a>
+<span class="sourceLineNo">3608</span>      long prevTimestamp = 0L;<a name="line.3608"></a>
+<span class="sourceLineNo">3609</span>      for (int i = 0; i &lt; testCount; i++) {<a name="line.3609"></a>
+<span class="sourceLineNo">3610</span><a name="line.3610"></a>
+<span class="sourceLineNo">3611</span>        if (i != 0 &amp;&amp; i % compactInterval == 0) {<a name="line.3611"></a>
+<span class="sourceLineNo">3612</span>          region.compact(true);<a name="line.3612"></a>
+<span class="sourceLineNo">3613</span>          for (HStore store : region.getStores()) {<a name="line.3613"></a>
+<span class="sourceLineNo">3614</span>            store.closeAndArchiveCompactedFiles();<a name="line.3614"></a>
+<span class="sourceLineNo">3615</span>          }<a name="line.3615"></a>
+<span class="sourceLineNo">3616</span>        }<a name="line.3616"></a>
+<span class="sourceLineNo">3617</span><a name="line.3617"></a>
+<span class="sourceLineNo">3618</span>        if (i != 0 &amp;&amp; i % flushInterval == 0) {<a name="line.3618"></a>
+<span class="sourceLineNo">3619</span>          flushThread.flush();<a name="line.3619"></a>
+<span class="sourceLineNo">3620</span>        }<a name="line.3620"></a>
+<span class="sourceLineNo">3621</span><a name="line.3621"></a>
+<span class="sourceLineNo">3622</span>        boolean previousEmpty = res.isEmpty();<a name="line.3622"></a>
+<span class="sourceLineNo">3623</span>        res.clear();<a name="line.3623"></a>
+<span class="sourceLineNo">3624</span>        try (InternalScanner scanner = region.getScanner(scan)) {<a name="line.3624"></a>
+<span class="sourceLineNo">3625</span>          boolean moreRows;<a name="line.3625"></a>
+<span class="sourceLineNo">3626</span>          do {<a name="line.3626"></a>
+<span class="sourceLineNo">3627</span>            moreRows = scanner.next(res);<a name="line.3627"></a>
+<span class="sourceLineNo">3628</span>          } while (moreRows);<a name="line.3628"></a>
+<span class="sourceLineNo">3629</span>        }<a name="line.3629"></a>
+<span class="sourceLineNo">3630</span>        if (!res.isEmpty() || !previousEmpty || i &gt; compactInterval) {<a name="line.3630"></a>
+<span class="sourceLineNo">3631</span>          assertEquals("i=" + i, expectedCount, res.size());<a name="line.3631"></a>
+<span class="sourceLineNo">3632</span>          long timestamp = res.get(0).getTimestamp();<a name="line.3632"></a>
+<span class="sourceLineNo">3633</span>          assertTrue("Timestamps were broke: " + timestamp + " prev: " + prevTimestamp,<a name="line.3633"></a>
+<span class="sourceLineNo">3634</span>              timestamp &gt;= prevTimestamp);<a name="line.3634"></a>
+<span class="sourceLineNo">3635</span>          prevTimestamp = timestamp;<a name="line.3635"></a>
+<span class="sourceLineNo">3636</span>        }<a name="line.3636"></a>
+<span class="sourceLineNo">3637</span>      }<a name="line.3637"></a>
 <span class="sourceLineNo">3638</span><a name="line.3638"></a>
-<span class="sourceLineNo">3639</span>        putThread.join();<a name="line.3639"></a>
-<span class="sourceLineNo">3640</span>        putThread.checkNoError();<a name="line.3640"></a>
-<span class="sourceLineNo">3641</span>      } catch (InterruptedException ie) {<a name="line.3641"></a>
-<span class="sourceLineNo">3642</span>        LOG.warn("Caught exception when joining with flushThread", ie);<a name="line.3642"></a>
-<span class="sourceLineNo">3643</span>      }<a name="line.3643"></a>
-<span class="sourceLineNo">3644</span><a name="line.3644"></a>
-<span class="sourceLineNo">3645</span>      try {<a name="line.3645"></a>
-<span class="sourceLineNo">3646</span>          HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.3646"></a>
-<span class="sourceLineNo">3647</span>      } catch (DroppedSnapshotException dse) {<a name="line.3647"></a>
-<span class="sourceLineNo">3648</span>        // We could get this on way out because we interrupt the background flusher and it could<a name="line.3648"></a>
-<span class="sourceLineNo">3649</span>        // fail anywhere causing a DSE over in the background flusher... only it is not properly<a name="line.3649"></a>
-<span class="sourceLineNo">3650</span>        // dealt with so could still be memory hanging out when we get to here -- memory we can't<a name="line.3650"></a>
-<span class="sourceLineNo">3651</span>        // flush because the accounting is 'off' since original DSE.<a name="line.3651"></a>
-<span class="sourceLineNo">3652</span>      }<a name="line.3652"></a>
-<span class="sourceLineNo">3653</span>      this.region = null;<a name="line.3653"></a>
-<span class="sourceLineNo">3654</span>    }<a name="line.3654"></a>
-<span class="sourceLineNo">3655</span>  }<a name="line.3655"></a>
-<span class="sourceLineNo">3656</span><a name="line.3656"></a>
-<span class="sourceLineNo">3657</span>  protected class PutThread extends Thread {<a name="line.3657"></a>
-<span class="sourceLineNo">3658</span>    private volatile boolean done;<a name="line.3658"></a>
-<span class="sourceLineNo">3659</span>    private volatile int numPutsFinished = 0;<a name="line.3659"></a>
-<span class="sourceLineNo">3660</span><a name="line.3660"></a>
-<span class="sourceLineNo">3661</span>    private Throwable error = null;<a name="line.3661"></a>
-<span class="sourceLineNo">3662</span>    private int numRows;<a name="line.3662"></a>
-<span class="sourceLineNo">3663</span>    private byte[][] families;<a name="line.3663"></a>
-<span class="sourceLineNo">3664</span>    private byte[][] qualifiers;<a name="line.3664"></a>
-<span class="sourceLineNo">3665</span><a name="line.3665"></a>
-<span class="sourceLineNo">3666</span>    private PutThread(int numRows, byte[][] families, byte[][] qualifiers) {<a name="line.3666"></a>
-<span class="sourceLineNo">3667</span>      super("PutThread");<a name="line.3667"></a>
-<span class="sourceLineNo">3668</span>      this.numRows = numRows;<a name="line.3668"></a>
-<span class="sourceLineNo">3669</span>      this.families = families;<a name="line.3669"></a>
-<span class="sourceLineNo">3670</span>      this.qualifiers = qualifiers;<a name="line.3670"></a>
-<span class="sourceLineNo">3671</span>    }<a name="line.3671"></a>
-<span class="sourceLineNo">3672</span><a name="line.3672"></a>
-<span class="sourceLineNo">3673</span>    /**<a name="line.3673"></a>
-<span class="sourceLineNo">3674</span>     * Block calling thread until this instance of PutThread has put at least one row.<a name="line.3674"></a>
-<span class="sourceLineNo">3675</span>     */<a name="line.3675"></a>
-<span class="sourceLineNo">3676</span>    public void waitForFirstPut() throws InterruptedException {<a name="line.3676"></a>
-<span class="sourceLineNo">3677</span>      // wait until put thread actually puts some data<a name="line.3677"></a>
-<span class="sourceLineNo">3678</span>      while (isAlive() &amp;&amp; numPutsFinished == 0) {<a name="line.3678"></a>
-<span class="sourceLineNo">3679</span>        checkNoError();<a name="line.3679"></a>
-<span class="sourceLineNo">3680</span>        Thread.sleep(50);<a name="line.3680"></a>
-<span class="sourceLineNo">3681</span>      }<a name="line.3681"></a>
-<span class="sourceLineNo">3682</span>    }<a name="line.3682"></a>
-<span class="sourceLineNo">3683</span><a name="line.3683"></a>
-<span class="sourceLineNo">3684</span>    public void done() {<a name="line.3684"></a>
-<span class="sourceLineNo">3685</span>      done = true;<a name="line.3685"></a>
-<span class="sourceLineNo">3686</span>      synchronized (this) {<a name="line.3686"></a>
-<span class="sourceLineNo">3687</span>        interrupt();<a name="line.3687"></a>
-<span class="sourceLineNo">3688</span>      }<a name="line.3688"></a>
-<span class="sourceLineNo">3689</span>    }<a name="line.3689"></a>
-<span class="sourceLineNo">3690</span><a name="line.3690"></a>
-<span class="sourceLineNo">3691</span>    public void checkNoError() {<a name="line.3691"></a>
-<span class="sourceLineNo">3692</span>      if (error != null) {<a name="line.3692"></a>
-<span class="sourceLineNo">3693</span>        assertNull(error);<a name="line.3693"></a>
-<span class="sourceLineNo">3694</span>      }<a name="line.3694"></a>
-<span class="sourceLineNo">3695</span>    }<a name="line.3695"></a>
-<span class="sourceLineNo">3696</span><a name="line.3696"></a>
-<span class="sourceLineNo">3697</span>    @Override<a name="line.3697"></a>
-<span class="sourceLineNo">3698</span>    public void run() {<a name="line.3698"></a>
-<span class="sourceLineNo">3699</span>      done = false;<a name="line.3699"></a>
-<span class="sourceLineNo">3700</span>      while (!done) {<a name="line.3700"></a>
-<span class="sourceLineNo">3701</span>        try {<a name="line.3701"></a>
-<span class="sourceLineNo">3702</span>          for (int r = 0; r &lt; numRows; r++) {<a name="line.3702"></a>
-<span class="sourceLineNo">3703</span>            byte[] row = Bytes.toBytes("row" + r);<a name="line.3703"></a>
-<span class="sourceLineNo">3704</span>            Put put = new Put(row);<a name="line.3704"></a>
-<span class="sourceLineNo">3705</span>            put.setDurability(Durability.SKIP_WAL);<a name="line.3705"></a>
-<span class="sourceLineNo">3706</span>            byte[] value = Bytes.toBytes(String.valueOf(numPutsFinished));<a name="line.3706"></a>
-<span class="sourceLineNo">3707</span>            for (byte[] family : families) {<a name="line.3707"></a>
-<span class="sourceLineNo">3708</span>              for (byte[] qualifier : qualifiers) {<a name="line.3708"></a>
-<span class="sourceLineNo">3709</span>                put.addColumn(family, qualifier, numPutsFinished, value);<a name="line.3709"></a>
-<span class="sourceLineNo">3710</span>              }<a name="line.3710"></a>
-<span class="sourceLineNo">3711</span>            }<a name="line.3711"></a>
-<span class="sourceLineNo">3712</span>            region.put(put);<a name="line.3712"></a>
-<span class="sourceLineNo">3713</span>            numPutsFinished++;<a name="line.3713"></a>
-<span class="sourceLineNo">3714</span>            if (numPutsFinished &gt; 0 &amp;&amp; numPutsFinished % 47 == 0) {<a name="line.3714"></a>
-<span class="sourceLineNo">3715</span>              LOG.debug("put iteration = {}", numPutsFinished);<a name="line.3715"></a>
-<span class="sourceLineNo">3716</span>              Delete delete = new Delete(row, (long) numPutsFinished - 30);<a name="line.3716"></a>
-<span class="sourceLineNo">3717</span>              region.delete(delete);<a name="line.3717"></a>
-<span class="sourceLineNo">3718</span>            }<a name="line.3718"></a>
-<span class="sourceLineNo">3719</span>            numPutsFinished++;<a name="line.3719"></a>
-<span class="sourceLineNo">3720</span>          }<a name="line.3720"></a>
-<span class="sourceLineNo">3721</span>        } catch (InterruptedIOException e) {<a name="line.3721"></a>
-<span class="sourceLineNo">3722</span>          // This is fine. It means we are done, or didn't get the lock on time<a name="line.3722"></a>
-<span class="sourceLineNo">3723</span>          LOG.info("Interrupted", e);<a name="line.3723"></a>
-<span class="sourceLineNo">3724</span>        } catch (IOException e) {<a name="line.3724"></a>
-<span class="sourceLineNo">3725</span>          LOG.error("Error while putting records", e);<a name="line.3725"></a>
-<span class="sourceLineNo">3726</span>          error = e;<a name="line.3726"></a>
-<span class="sourceLineNo">3727</span>          break;<a name="line.3727"></a>
-<span class="sourceLineNo">3728</span>        }<a name="line.3728"></a>
-<span class="sourceLineNo">3729</span>      }<a name="line.3729"></a>
-<span class="sourceLineNo">3730</span><a name="line.3730"></a>
-<span class="sourceLineNo">3731</span>    }<a name="line.3731"></a>
-<span class="sourceLineNo">3732</span><a name="line.3732"></a>
-<span class="sourceLineNo">3733</span>  }<a name="line.3733"></a>
-<span class="sourceLineNo">3734</span><a name="line.3734"></a>
-<span class="sourceLineNo">3735</span>  /**<a name="line.3735"></a>
-<span class="sourceLineNo">3736</span>   * Writes very wide records and gets the latest row every time.. Flushes and<a name="line.3736"></a>
-<span class="sourceLineNo">3737</span>   * compacts the region aggressivly to catch issues.<a name="line.3737"></a>
-<span class="sourceLineNo">3738</span>   *<a name="line.3738"></a>
-<span class="sourceLineNo">3739</span>   * @throws IOException<a name="line.3739"></a>
-<span class="sourceLineNo">3740</span>   *           by flush / scan / compaction<a name="line.3740"></a>
-<span class="sourceLineNo">3741</span>   * @throws InterruptedException<a name="line.3741"></a>
-<span class="sourceLineNo">3742</span>   *           when joining threads<a name="line.3742"></a>
-<span class="sourceLineNo">3743</span>   */<a name="line.3743"></a>
-<span class="sourceLineNo">3744</span>  @Test<a name="line.3744"></a>
-<span class="sourceLineNo">3745</span>  public void testWritesWhileGetting() throws Exception {<a name="line.3745"></a>
-<span class="sourceLineNo">3746</span>    int testCount = 50;<a name="line.3746"></a>
-<span class="sourceLineNo">3747</span>    int numRows = 1;<a name="line.3747"></a>
-<span class="sourceLineNo">3748</span>    int numFamilies = 10;<a name="line.3748"></a>
-<span class="sourceLineNo">3749</span>    int numQualifiers = 100;<a name="line.3749"></a>
-<span class="sourceLineNo">3750</span>    int compactInterval = 100;<a name="line.3750"></a>
-<span class="sourceLineNo">3751</span>    byte[][] families = new byte[numFamilies][];<a name="line.3751"></a>
-<span class="sourceLineNo">3752</span>    for (int i = 0; i &lt; numFamilies; i++) {<a name="line.3752"></a>
-<span class="sourceLineNo">3753</span>      families[i] = Bytes.toBytes("family" + i);<a name="line.3753"></a>
-<span class="sourceLineNo">3754</span>    }<a name="line.3754"></a>
-<span class="sourceLineNo">3755</span>    byte[][] qualifiers = new byte[numQualifiers][];<a name="line.3755"></a>
-<span class="sourceLineNo">3756</span>    for (int i = 0; i &lt; numQualifiers; i++) {<a name="line.3756"></a>
-<span class="sourceLineNo">3757</span>      qualifiers[i] = Bytes.toBytes("qual" + i);<a name="line.3757"></a>
-<span class="sourceLineNo">3758</span>    }<a name="line.3758"></a>
-<span class="sourceLineNo">3759</span><a name="line.3759"></a>
-<span class="sourceLineNo">3760</span><a name="line.3760"></a>
-<span class="sourceLineNo">3761</span>    // This test flushes constantly and can cause many files to be created,<a name="line.3761"></a>
-<span class="sourceLineNo">3762</span>    // possibly<a name="line.3762"></a>
-<span class="sourceLineNo">3763</span>    // extending over the ulimit. Make sure compactions are aggressive in<a name="line.3763"></a>
-<span class="sourceLineNo">3764</span>    // reducing<a name="line.3764"></a>
-<span class="sourceLineNo">3765</span>    // the number of HFiles created.<a name="line.3765"></a>
-<span class="sourceLineNo">3766</span>    Configuration conf = HBaseConfiguration.create(CONF);<a name="line.3766"></a>
-<span class="sourceLineNo">3767</span>    conf.setInt("hbase.hstore.compaction.min", 1);<a name="line.3767"></a>
-<span class="sourceLineNo">3768</span>    conf.setInt("hbase.hstore.compaction.max", 1000);<a name="line.3768"></a>
-<span class="sourceLineNo">3769</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.3769"></a>
-<span class="sourceLineNo">3770</span>    PutThread putThread = null;<a name="line.3770"></a>
-<span class="sourceLineNo">3771</span>    MultithreadedTestUtil.TestContext ctx = new MultithreadedTestUtil.TestContext(conf);<a name="line.3771"></a>
-<span class="sourceLineNo">3772</span>    try {<a name="line.3772"></a>
-<span class="sourceLineNo">3773</span>      putThread = new PutThread(numRows, families, qualifiers);<a name="line.3773"></a>
-<span class="sourceLineNo">3774</span>      putThread.start();<a name="line.3774"></a>
-<span class="sourceLineNo">3775</span>      putThread.waitForFirstPut();<a name="line.3775"></a>
-<span class="sourceLineNo">3776</span><a name="line.3776"></a>
-<span class="sourceLineNo">3777</span>      // Add a thread that flushes as fast as possible<a name="line.3777"></a>
-<span class="sourceLineNo">3778</span>      ctx.addThread(new RepeatingTestThread(ctx) {<a name="line.3778"></a>
-<span class="sourceLineNo">3779</span><a name="line.3779"></a>
-<span class="sourceLineNo">3780</span>        @Override<a name="line.3780"></a>
-<span class="sourceLineNo">3781</span>        public void doAnAction() throws Exception {<a name="line.3781"></a>
-<span class="sourceLineNo">3782</span>          region.flush(true);<a name="line.3782"></a>
-<span class="sourceLineNo">3783</span>          // Compact regularly to avoid creating too many files and exceeding<a name="line.3783"></a>
-<span class="sourceLineNo">3784</span>          // the ulimit.<a name="line.3784"></a>
-<span class="sourceLineNo">3785</span>          region.compact(false);<a name="line.3785"></a>
-<span class="sourceLineNo">3786</span>          for (HStore store : region.getStores()) {<a name="line.3786"></a>
-<span class="sourceLineNo">3787</span>            store.closeAndArchiveCompactedFiles();<a name="line.3787"></a>
-<span class="sourceLineNo">3788</span>          }<a name="line.3788"></a>
-<span class="sourceLineNo">3789</span>        }<a name="line.3789"></a>
-<span class="sourceLineNo">3790</span>      });<a name="line.3790"></a>
-<span class="sourceLineNo">3791</span>      ctx.startThreads();<a name="line.3791"></a>
-<span class="sourceLineNo">3792</span><a name="line.3792"></a>
-<span class="sourceLineNo">3793</span>      Get get = new Get(Bytes.toBytes("row0"));<a name="line.3793"></a>
-<span class="sourceLineNo">3794</span>      Result result = null;<a name="line.3794"></a>
-<span class="sourceLineNo">3795</span><a name="line.3795"></a>
-<span class="sourceLineNo">3796</span>      int expectedCount = numFamilies * numQualifiers;<a name="line.3796"></a>
-<span class="sourceLineNo">3797</span><a name="line.3797"></a>
-<span class="sourceLineNo">3798</span>      long prevTimestamp = 0L;<a name="line.3798"></a>
-<span class="sourceLineNo">3799</span>      for (int i = 0; i &lt; testCount; i++) {<a name="line.3799"></a>
-<span class="sourceLineNo">3800</span>        LOG.info("testWritesWhileGetting verify turn " + i);<a name="line.3800"></a>
-<span class="sourceLineNo">3801</span>        boolean previousEmpty = result == null || result.isEmpty();<a name="line.3801"></a>
-<span class="sourceLineNo">3802</span>        result = region.get(get);<a name="line.3802"></a>
-<span class="sourceLineNo">3803</span>        if (!result.isEmpty() || !previousEmpty || i &gt; compactInterval) {<a name="line.3803"></a>
-<span class="sourceLineNo">3804</span>          assertEquals("i=" + i, expectedCount, result.size());<a name="line.3804"></a>
-<span class="sourceLineNo">3805</span>          // TODO this was removed, now what dangit?!<a name="line.3805"></a>
-<span class="sourceLineNo">3806</span>          // search looking for the qualifier in question?<a name="line.3806"></a>
-<span class="sourceLineNo">3807</span>          long timestamp = 0;<a name="line.3807"></a>
-<span class="sourceLineNo">3808</span>          for (Cell kv : result.rawCells()) {<a name="line.3808"></a>
-<span class="sourceLineNo">3809</span>            if (CellUtil.matchingFamily(kv, families[0])<a name="line.3809"></a>
-<span class="sourceLineNo">3810</span>                &amp;&amp; CellUtil.matchingQualifier(kv, qualifiers[0])) {<a name="line.3810"></a>
-<span class="sourceLineNo">3811</span>              timestamp = kv.getTimestamp();<a name="line.3811"></a>
-<span class="sourceLineNo">3812</span>            }<a name="line.3812"></a>
-<span class="sourceLineNo">3813</span>          }<a name="line.3813"></a>
-<span class="sourceLineNo">3814</span>          assertTrue(timestamp &gt;= prevTimestamp);<a name="line.3814"></a>
-<span class="sourceLineNo">3815</span>          prevTimestamp = timestamp;<a name="line.3815"></a>
-<span class="sourceLineNo">3816</span>          Cell previousKV = null;<a name="line.3816"></a>
-<span class="sourceLineNo">3817</span><a name="line.3817"></a>
+<span class="sourceLineNo">3639</span>      putThread.done();<a name="line.3639"></a>
+<span class="sourceLineNo">3640</span><a name="line.3640"></a>
+<span class="sourceLineNo">3641</span>      region.flush(true);<a name="line.3641"></a>
+<span class="sourceLineNo">3642</span><a name="line.3642"></a>
+<span class="sourceLineNo">3643</span>    } finally {<a name="line.3643"></a>
+<span class="sourceLineNo">3644</span>      try {<a name="line.3644"></a>
+<span class="sourceLineNo">3645</span>        flushThread.done();<a name="line.3645"></a>
+<span class="sourceLineNo">3646</span>        flushThread.join();<a name="line.3646"></a>
+<span class="sourceLineNo">3647</span>        flushThread.checkNoError();<a name="line.3647"></a>
+<span class="sourceLineNo">3648</span><a name="line.3648"></a>
+<span class="sourceLineNo">3649</span>        putThread.join();<a name="line.3649"></a>
+<span class="sourceLineNo">3650</span>        putThread.checkNoError();<a name="line.3650"></a>
+<span class="sourceLineNo">3651</span>      } catch (InterruptedException ie) {<a name="line.3651"></a>
+<span class="sourceLineNo">3652</span>        LOG.warn("Caught exception when joining with flushThread", ie);<a name="line.3652"></a>
+<span class="sourceLineNo">3653</span>      }<a name="line.3653"></a>
+<span class="sourceLineNo">3654</span><a name="line.3654"></a>
+<span class="sourceLineNo">3655</span>      try {<a name="line.3655"></a>
+<span class="sourceLineNo">3656</span>          HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.3656"></a>
+<span class="sourceLineNo">3657</span>      } catch (DroppedSnapshotException dse) {<a name="line.3657"></a>
+<span class="sourceLineNo">3658</span>        // We could get this on way out because we interrupt the background flusher and it could<a name="line.3658"></a>
+<span class="sourceLineNo">3659</span>        // fail anywhere causing a DSE over in the background flusher... only it is not properly<a name="line.3659"></a>
+<span class="sourceLineNo">3660</span>        // dealt with so could still be memory hanging out when we get to here -- memory we can't<a name="line.3660"></a>
+<span class="sourceLineNo">3661</span>        // flush because the accounting is 'off' since original DSE.<a name="line.3661"></a>
+<span class="sourceLineNo">3662</span>      }<a name="line.3662"></a>
+<span class="sourceLineNo">3663</span>      this.region = null;<a name="line.3663"></a>
+<span class="sourceLineNo">3664</span>    }<a name="line.3664"></a>
+<span class="sourceLineNo">3665</span>  }<a name="line.3665"></a>
+<span class="sourceLineNo">3666</span><a name="line.3666"></a>
+<span class="sourceLineNo">3667</span>  protected class PutThread extends Thread {<a name="line.3667"></a>
+<span class="sourceLineNo">3668</span>    private volatile boolean done;<a name="line.3668"></a>
+<span class="sourceLineNo">3669</span>    private volatile int numPutsFinished = 0;<a name="line.3669"></a>
+<span class="sourceLineNo">3670</span><a name="line.3670"></a>
+<span class="sourceLineNo">3671</span>    private Throwable error = null;<a name="line.3671"></a>
+<span class="sourceLineNo">3672</span>    private int numRows;<a name="line.3672"></a>
+<span class="sourceLineNo">3673</span>    private byte[][] families;<a name="line.3673"></a>
+<span class="sourceLineNo">3674</span>    private byte[][] qualifiers;<a name="line.3674"></a>
+<span class="sourceLineNo">3675</span><a name="line.3675"></a>
+<span class="sourceLineNo">3676</span>    private PutThread(int numRows, byte[][] families, byte[][] qualifiers) {<a name="line.3676"></a>
+<span class="sourceLineNo">3677</span>      super("PutThread");<a name="line.3677"></a>
+<span class="sourceLineNo">3678</span>      this.numRows = numRows;<a name="line.3678"></a>
+<span class="sourceLineNo">3679</span>      this.families = families;<a name="line.3679"></a>
+<span class="sourceLineNo">3680</span>      this.qualifiers = qualifiers;<a name="line.3680"></a>
+<span class="sourceLineNo">3681</span>    }<a name="line.3681"></a>
+<span class="sourceLineNo">3682</span><a name="line.3682"></a>
+<span class="sourceLineNo">3683</span>    /**<a name="line.3683"></a>
+<span class="sourceLineNo">3684</span>     * Block calling thread until this instance of PutThread has put at least one row.<a name="line.3684"></a>
+<span class="sourceLineNo">3685</span>     */<a name="line.3685"></a>
+<span class="sourceLineNo">3686</span>    public void waitForFirstPut() throws InterruptedException {<a name="line.3686"></a>
+<span class="sourceLineNo">3687</span>      // wait until put thread actually puts some data<a name="line.3687"></a>
+<span class="sourceLineNo">3688</span>      while (isAlive() &amp;&amp; numPutsFinished == 0) {<a name="line.3688"></a>
+<span class="sourceLineNo">3689</span>        checkNoError();<a name="line.3689"></a>
+<span class="sourceLineNo">3690</span>        Thread.sleep(50);<a name="line.3690"></a>
+<span class="sourceLineNo">3691</span>      }<a name="line.3691"></a>
+<span class="sourceLineNo">3692</span>    }<a name="line.3692"></a>
+<span class="sourceLineNo">3693</span><a name="line.3693"></a>
+<span class="sourceLineNo">3694</span>    public void done() {<a name="line.3694"></a>
+<span class="sourceLineNo">3695</span>      done = true;<a name="line.3695"></a>
+<span class="sourceLineNo">3696</span>      synchronized (this) {<a name="line.3696"></a>
+<span class="sourceLineNo">3697</span>        interrupt();<a name="line.3697"></a>
+<span class="sourceLineNo">3698</span>      }<a name="line.3698"></a>
+<span class="sourceLineNo">3699</span>    }<a name="line.3699"></a>
+<span class="sourceLineNo">3700</span><a name="line.3700"></a>
+<span class="sourceLineNo">3701</span>    public void checkNoError() {<a name="line.3701"></a>
+<span class="sourceLineNo">3702</span>      if (error != null) {<a name="line.3702"></a>
+<span class="sourceLineNo">3703</span>        assertNull(error);<a name="line.3703"></a>
+<span class="sourceLineNo">3704</span>      }<a name="line.3704"></a>
+<span class="sourceLineNo">3705</span>    }<a name="line.3705"></a>
+<span class="sourceLineNo">3706</span><a name="line.3706"></a>
+<span class="sourceLineNo">3707</span>    @Override<a name="line.3707"></a>
+<span class="sourceLineNo">3708</span>    public void run() {<a name="line.3708"></a>
+<span class="sourceLineNo">3709</span>      done = false;<a name="line.3709"></a>
+<span class="sourceLineNo">3710</span>      while (!done) {<a name="line.3710"></a>
+<span class="sourceLineNo">3711</span>        try {<a name="line.3711"></a>
+<span class="sourceLineNo">3712</span>          for (int r = 0; r &lt; numRows; r++) {<a name="line.3712"></a>
+<span class="sourceLineNo">3713</span>            byte[] row = Bytes.toBytes("row" + r);<a name="line.3713"></a>
+<span class="sourceLineNo">3714</span>            Put put = new Put(row);<a name="line.3714"></a>
+<span class="sourceLineNo">3715</span>            put.setDurability(Durability.SKIP_WAL);<a name="line.3715"></a>
+<span class="sourceLineNo">3716</span>            byte[] value = Bytes.toBytes(String.valueOf(numPutsFinished));<a name="line.3716"></a>
+<span class="sourceLineNo">3717</span>            for (byte[] family : families) {<a name="line.3717"></a>
+<span class="sourceLineNo">3718</span>              for (byte[] qualifier : qualifiers) {<a name="line.3718"></a>
+<span class="sourceLineNo">3719</span>                put.addColumn(family, qualifier, numPutsFinished, value);<a name="line.3719"></a>
+<span class="sourceLineNo">3720</span>              }<a name="line.3720"></a>
+<span class="sourceLineNo">3721</span>            }<a name="line.3721"></a>
+<span class="sourceLineNo">3722</span>            region.put(put);<a name="line.3722"></a>
+<span class="sourceLineNo">3723</span>            numPutsFinished++;<a name="line.3723"></a>
+<span class="sourceLineNo">3724</span>            if (numPutsFinished &gt; 0 &amp;&amp; numPutsFinished % 47 == 0) {<a name="line.3724"></a>
+<span class="sourceLineNo">3725</span>              LOG.debug("put iteration = {}", numPutsFinished);<a name="line.3725"></a>
+<span class="sourceLineNo">3726</span>              Delete delete = new Delete(row, (long) numPutsFinished - 30);<a name="line.3726"></a>
+<span class="sourceLineNo">3727</span>              region.delete(delete);<a name="line.3727"></a>
+<span class="sourceLineNo">3728</span>            }<a name="line.3728"></a>
+<span class="sourceLineNo">3729</span>            numPutsFinished++;<a name="line.3729"></a>
+<span class="sourceLineNo">3730</span>          }<a name="line.3730"></a>
+<span class="sourceLineNo">3731</span>        } catch (InterruptedIOException e) {<a name="line.3731"></a>
+<span class="sourceLineNo">3732</span>          // This is fine. It means we are done, or didn't get the lock on time<a name="line.3732"></a>
+<span class="sourceLineNo">3733</span>          LOG.info("Interrupted", e);<a name="line.3733"></a>
+<span class="sourceLineNo">3734</span>        } catch (IOException e) {<a name="line.3734"></a>
+<span class="sourceLineNo">3735</span>          LOG.error("Error while putting records", e);<a name="line.3735"></a>
+<span class="sourceLineNo">3736</span>          error = e;<a name="line.3736"></a>
+<span class="sourceLineNo">3737</span>          break;<a name="line.3737"></a>
+<span class="sourceLineNo">3738</span>        }<a name="line.3738"></a>
+<span class="sourceLineNo">3739</span>      }<a name="line.3739"></a>
+<span class="sourceLineNo">3740</span><a name="line.3740"></a>
+<span class="sourceLineNo">3741</span>    }<a name="line.3741"></a>
+<span class="sourceLineNo">3742</span><a name="line.3742"></a>
+<span class="sourceLineNo">3743</span>  }<a name="line.3743"></a>
+<span class="sourceLineNo">3744</span><a name="line.3744"></a>
+<span class="sourceLineNo">3745</span>  /**<a name="line.3745"></a>
+<span class="sourceLineNo">3746</span>   * Writes very wide records and gets the latest row every time.. Flushes and<a name="line.3746"></a>
+<span class="sourceLineNo">3747</span>   * compacts the region aggressivly to catch issues.<a name="line.3747"></a>
+<span class="sourceLineNo">3748</span>   *<a name="line.3748"></a>
+<span class="sourceLineNo">3749</span>   * @throws IOException<a name="line.3749"></a>
+<span class="sourceLineNo">3750</span>   *           by flush / scan / compaction<a name="line.3750"></a>
+<span class="sourceLineNo">3751</span>   * @throws InterruptedException<a name="line.3751"></a>
+<span class="sourceLineNo">3752</span>   *           when joining threads<a name="line.3752"></a>
+<span class="sourceLineNo">3753</span>   */<a name="line.3753"></a>
+<span class="sourceLineNo">3754</span>  @Test<a name="line.3754"></a>
+<span class="sourceLineNo">3755</span>  public void testWritesWhileGetting() throws Exception {<a name="line.3755"></a>
+<span class="sourceLineNo">3756</span>    int testCount = 50;<a name="line.3756"></a>
+<span class="sourceLineNo">3757</span>    int numRows = 1;<a name="line.3757"></a>
+<span class="sourceLineNo">3758</span>    int numFamilies = 10;<a name="line.3758"></a>
+<span class="sourceLineNo">3759</span>    int numQualifiers = 100;<a name="line.3759"></a>
+<span class="sourceLineNo">3760</span>    int compactInterval = 100;<a name="line.3760"></a>
+<span class="sourceLineNo">3761</span>    byte[][] families = new byte[numFamilies][];<a name="line.3761"></a>
+<span class="sourceLineNo">3762</span>    for (int i = 0; i &lt; numFamilies; i++) {<a name="line.3762"></a>
+<span class="sourceLineNo">3763</span>      families[i] = Bytes.toBytes("family" + i);<a name="line.3763"></a>
+<span class="sourceLineNo">3764</span>    }<a name="line.3764"></a>
+<span class="sourceLineNo">3765</span>    byte[][] qualifiers = new byte[numQualifiers][];<a name="line.3765"></a>
+<span class="sourceLineNo">3766</span>    for (int i = 0; i &lt; numQualifiers; i++) {<a name="line.3766"></a>
+<span class="sourceLineNo">3767</span>      qualifiers[i] = Bytes.toBytes("qual" + i);<a name="line.3767"></a>
+<span class="sourceLineNo">3768</span>    }<a name="line.3768"></a>
+<span class="sourceLineNo">3769</span><a name="line.3769"></a>
+<span class="sourceLineNo">3770</span><a name="line.3770"></a>
+<span class="sourceLineNo">3771</span>    // This test flushes constantly and can cause many files to be created,<a name="line.3771"></a>
+<span class="sourceLineNo">3772</span>    // possibly<a name="line.3772"></a>
+<span class="sourceLineNo">3773</span>    // extending over the ulimit. Make sure compactions are aggressive in<a name="line.3773"></a>
+<span class="sourceLineNo">3774</span>    // reducing<a name="line.3774"></a>
+<span class="sourceLineNo">3775</span>    // the number of HFiles created.<a name="line.3775"></a>
+<span class="sourceLineNo">3776</span>    Configuration conf = HBaseConfiguration.create(CONF);<a name="line.3776"></a>
+<span class="sourceLineNo">3777</span>    conf.setInt("hbase.hstore.compaction.min", 1);<a name="line.3777"></a>
+<span class="sourceLineNo">3778</span>    conf.setInt("hbase.hstore.compaction.max", 1000);<a name="line.3778"></a>
+<span class="sourceLineNo">3779</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.3779"></a>
+<span class="sourceLineNo">3780</span>    PutThread putThread = null;<a name="line.3780"></a>
+<span class="sourceLineNo">3781</span>    MultithreadedTestUtil.TestContext ctx = new MultithreadedTestUtil.TestContext(conf);<a name="line.3781"></a>
+<span class="sourceLineNo">3782</span>    try {<a name="line.3782"></a>
+<span class="sourceLineNo">3783</span>      putThread = new PutThread(numRows, families, qualifiers);<a name="line.3783"></a>
+<span class="sourceLineNo">3784</span>      putThread.start();<a name="line.3784"></a>
+<span class="sourceLineNo">3785</span>      putThread.waitForFirstPut();<a name="line.3785"></a>
+<span class="sourceLineNo">3786</span><a name="line.3786"></a>
+<span class="sourceLineNo">3787</span>      // Add a thread that flushes as fast as possible<a name="line.3787"></a>
+<span class="sourceLineNo">3788</span>      ctx.addThread(new RepeatingTestThread(ctx) {<a name="line.3788"></a>
+<span class="sourceLineNo">3789</span><a name="line.3789"></a>
+<span class="sourceLineNo">3790</span>        @Override<a name="line.3790"></a>
+<span class="sourceLineNo">3791</span>        public void doAnAction() throws Exception {<a name="line.3791"></a>
+<span class="sourceLineNo">3792</span>          region.flush(true);<a name="line.3792"></a>
+<span class="sourceLineNo">3793</span>          // Compact regularly to avoid creating too many files and exceeding<a name="line.3793"></a>
+<span class="sourceLineNo">3794</span>          // the ulimit.<a name="line.3794"></a>
+<span class="sourceLineNo">3795</span>          region.compact(false);<a name="line.3795"></a>
+<span class="sourceLineNo">3796</span>          for (HStore store : region.getStores()) {<a name="line.3796"></a>
+<span class="sourceLineNo">3797</span>            store.closeAndArchiveCompactedFiles();<a name="line.3797"></a>
+<span class="sourceLineNo">3798</span>          }<a name="line.3798"></a>
+<span class="sourceLineNo">3799</span>        }<a name="line.3799"></a>
+<span class="sourceLineNo">3800</span>      });<a name="line.3800"></a>
+<span class="sourceLineNo">3801</span>      ctx.startThreads();<a name="line.3801"></a>
+<span class="sourceLineNo">3802</span><a name="line.3802"></a>
+<span class="sourceLineNo">3803</span>      Get get = new Get(Bytes.toBytes("row0"));<a name="line.3803"></a>
+<span class="sourceLineNo">3804</span>      Result result = null;<a name="line.3804"></a>
+<span class="sourceLineNo">3805</span><a name="line.3805"></a>
+<span class="sourceLineNo">3806</span>      int expectedCount = numFamilies * numQualifiers;<a name="line.3806"></a>
+<span class="sourceLineNo">3807</span><a name="line.3807"></a>
+<span class="sourceLineNo">3808</span>      long prevTimestamp = 0L;<a name="line.3808"></a>
+<span class="sourceLineNo">3809</span>      for (int i = 0; i &lt; testCount; i++) {<a name="line.3809"></a>
+<span class="sourceLineNo">3810</span>        LOG.info("testWritesWhileGetting verify turn " + i);<a name="line.3810"></a>
+<span class="sourceLineNo">3811</span>        boolean previousEmpty = result == null || result.isEmpty();<a name="line.3811"></a>
+<span class="sourceLineNo">3812</span>        result = region.get(get);<a name="line.3812"></a>
+<span class="sourceLineNo">3813</span>        if (!result.isEmpty() || !previousEmpty || i &gt; compactInterval) {<a name="line.3813"></a>
+<span class="sourceLineNo">3814</span>          assertEquals("i=" + i, expectedCount, result.size());<a name="line.3814"></a>
+<span class="sourceLineNo">3815</span>          // TODO this was removed, now what dangit?!<a name="line.3815"></a>
+<span class="sourceLineNo">3816</span>          // search looking for the qualifier in question?<a name="line.3816"></a>
+<span class="sourceLineNo">3817</span>          long timestamp = 0;<a name="line.3817"></a>
 <span class="sourceLineNo">3818</span>          for (Cell kv : result.rawCells()) {<a name="line.3818"></a>
-<span class="sourceLineNo">3819</span>            byte[] thisValue = CellUtil.cloneValue(kv);<a name="line.3819"></a>
-<span class="sourceLineNo">3820</span>            if (previousKV != null) {<a name="line.3820"></a>
-<span class="sourceLineNo">3821</span>              if (Bytes.compareTo(CellUtil.cloneValue(previousKV), thisValue) != 0) {<a name="line.3821"></a>
-<span class="sourceLineNo">3822</span>                LOG.warn("These two KV should have the same value." + " Previous KV:" + previousKV<a name="line.3822"></a>
-<span class="sourceLineNo">3823</span>                    + "(memStoreTS:" + previousKV.getSequenceId() + ")" + ", New KV: " + kv<a name="line.3823"></a>
-<span class="sourceLineNo">3824</span>                    + "(memStoreTS:" + kv.getSequenceId() + ")");<a name="line.3824"></a>
-<span class="sourceLineNo">3825</span>                assertEquals(0, Bytes.compareTo(CellUtil.cloneValue(previousKV), thisValue));<a name="line.3825"></a>
-<span class="sourceLineNo">3826</span>              }<a name="line.3826"></a>
-<span class="sourceLineNo">3827</span>            }<a name="line.3827"></a>
-<span class="sourceLineNo">3828</span>            previousKV = kv;<a name="line.3828"></a>
-<span class="sourceLineNo">3829</span>          }<a name="line.3829"></a>
-<span class="sourceLineNo">3830</span>        }<a name="line.3830"></a>
-<span class="sourceLineNo">3831</span>      }<a name="line.3831"></a>
-<span class="sourceLineNo">3832</span>    } finally {<a name="line.3832"></a>
-<span class="sourceLineNo">3833</span>      if (putThread != null)<a name="line.3833"></a>
-<span class="sourceLineNo">3834</span>        putThread.done();<a name="line.3834"></a>
-<span class="sourceLineNo">3835</span><a name="line.3835"></a>
-<span class="sourceLineNo">3836</span>      region.flush(true);<a name="line.3836"></a>
-<span class="sourceLineNo">3837</span><a name="line.3837"></a>
-<span class="sourceLineNo">3838</span>      if (putThread != null) {<a name="line.3838"></a>
-<span class="sourceLineNo">3839</span>        putThread.join();<a name="line.3839"></a>
-<span class="sourceLineNo">3840</span>        putThread.checkNoError();<a name="line.3840"></a>
+<span class="sourceLineNo">3819</span>            if (CellUtil.matchingFamily(kv, families[0])<a name="line.3819"></a>
+<span class="sourceLineNo">3820</span>                &amp;&amp; CellUtil.matchingQualifier(kv, qualifiers[0])) {<a name="line.3820"></a>
+<span class="sourceLineNo">3821</span>              timestamp = kv.getTimestamp();<a name="line.3821"></a>
+<span class="sourceLineNo">3822</span>            }<a name="line.3822"></a>
+<span class="sourceLineNo">3823</span>          }<a name="line.3823"></a>
+<span class="sourceLineNo">3824</span>          assertTrue(timestamp &gt;= prevTimestamp);<a name="line.3824"></a>
+<span class="sourceLineNo">3825</span>          prevTimestamp = timestamp;<a name="line.3825"></a>
+<span class="sourceLineNo">3826</span>          Cell previousKV = null;<a name="line.3826"></a>
+<span class="sourceLineNo">3827</span><a name="line.3827"></a>
+<span class="sourceLineNo">3828</span>          for (Cell kv : result.rawCells()) {<a name="line.3828"></a>
+<span class="sourceLineNo">3829</span>            byte[] thisValue = CellUtil.cloneValue(kv);<a name="line.3829"></a>
+<span class="sourceLineNo">3830</span>            if (previousKV != null) {<a name="line.3830"></a>
+<span class="sourceLineNo">3831</span>              if (Bytes.compareTo(CellUtil.cloneValue(previousKV), thisValue) != 0) {<a name="line.3831"></a>
+<span class="sourceLineNo">3832</span>                LOG.warn("These two KV should have the same value." + " Previous KV:" + previousKV<a name="line.3832"></a>
+<span class="sourceLineNo">3833</span>                    + "(memStoreTS:" + previousKV.getSequenceId() + ")" + ", New KV: " + kv<a name="line.3833"></a>
+<span class="sourceLineNo">3834</span>                    + "(memStoreTS:" + kv.getSequenceId() + ")");<a name="line.3834"></a>
+<span class="sourceLineNo">3835</span>                assertEquals(0, Bytes.compareTo(CellUtil.cloneValue(previousKV), thisValue));<a name="line.3835"></a>
+<span class="sourceLineNo">3836</span>              }<a name="line.3836"></a>
+<span class="sourceLineNo">3837</span>            }<a name="line.3837"></a>
+<span class="sourceLineNo">3838</span>            previousKV = kv;<a name="line.3838"></a>
+<span class="sourceLineNo">3839</span>          }<a name="line.3839"></a>
+<span class="sourceLineNo">3840</span>        }<a name="line.3840"></a>
 <span class="sourceLineNo">3841</span>      }<a name="line.3841"></a>
-<span class="sourceLineNo">3842</span><a name="line.3842"></a>
-<span class="sourceLineNo">3843</span>      ctx.stop();<a name="line.3843"></a>
-<span class="sourceLineNo">3844</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.3844"></a>
-<span class="sourceLineNo">3845</span>      this.region = null;<a name="line.3845"></a>
-<span class="sourceLineNo">3846</span>    }<a name="line.3846"></a>
-<span class="sourceLineNo">3847</span>  }<a name="line.3847"></a>
-<span class="sourceLineNo">3848</span><a name="line.3848"></a>
-<span class="sourceLineNo">3849</span>  @Test<a name="line.3849"></a>
-<span class="sourceLineNo">3850</span>  public void testHolesInMeta() throws Exception {<a name="line.3850"></a>
-<span class="sourceLineNo">3851</span>    byte[] family = Bytes.toBytes("family");<a name="line.3851"></a>
-<span class="sourceLineNo">3852</span>    this.region = initHRegion(tableName, Bytes.toBytes("x"), Bytes.toBytes("z"), method, CONF,<a name="line.3852"></a>
-<span class="sourceLineNo">3853</span>        false, family);<a name="line.3853"></a>
-<span class="sourceLineNo">3854</span>    byte[] rowNotServed = Bytes.toBytes("a");<a name="line.3854"></a>
-<span class="sourceLineNo">3855</span>    Get g = new Get(rowNotServed);<a name="line.3855"></a>
-<span class="sourceLineNo">3856</span>    try {<a name="line.3856"></a>
-<span class="sourceLineNo">3857</span>      region.get(g);<a name="line.3857"></a>
-<span class="sourceLineNo">3858</span>      fail();<a name="line.3858"></a>
-<span class="sourceLineNo">3859</span>    } catch (WrongRegionException x) {<a name="line.3859"></a>
-<span class="sourceLineNo">3860</span>      // OK<a name="line.3860"></a>
-<span class="sourceLineNo">3861</span>    }<a name="line.3861"></a>
-<span class="sourceLineNo">3862</span>    byte[] row = Bytes.toBytes("y");<a name="line.3862"></a>
-<span class="sourceLineNo">3863</span>    g = new Get(row);<a name="line.3863"></a>
-<span class="sourceLineNo">3864</span>    region.get(g);<a name="line.3864"></a>
-<span class="sourceLineNo">3865</span>  }<a name="line.3865"></a>
-<span class="sourceLineNo">3866</span><a name="line.3866"></a>
-<span class="sourceLineNo">3867</span>  @Test<a name="line.3867"></a>
-<span class="sourceLineNo">3868</span>  public void testIndexesScanWithOneDeletedRow() throws IOException {<a name="line.3868"></a>
-<span class="sourceLineNo">3869</span>    byte[] family = Bytes.toBytes("family");<a name="line.3869"></a>
-<span class="sourceLineNo">3870</span><a name="line.3870"></a>
-<span class="sourceLineNo">3871</span>    // Setting up region<a name="line.3871"></a>
-<span class="sourceLineNo">3872</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.3872"></a>
-<span class="sourceLineNo">3873</span>    Put put = new Put(Bytes.toBytes(1L));<a name="line.3873"></a>
-<span class="sourceLineNo">3874</span>    put.addColumn(family, qual1, 1L, Bytes.toBytes(1L));<a name="line.3874"></a>
-<span class="sourceLineNo">3875</span>    region.put(put);<a name="line.3875"></a>
+<span class="sourceLineNo">3842</span>    } finally {<a name="line.3842"></a>
+<span class="sourceLineNo">3843</span>      if (putThread != null)<a name="line.3843"></a>
+<span class="sourceLineNo">3844</span>        putThread.done();<a name="line.3844"></a>
+<span class="sourceLineNo">3845</span><a name="line.3845"></a>
+<span class="sourceLineNo">3846</span>      region.flush(true);<a name="line.3846"></a>
+<span class="sourceLineNo">3847</span><a name="line.3847"></a>
+<span class="sourceLineNo">3848</span>      if (putThread != null) {<a name="line.3848"></a>
+<span class="sourceLineNo">3849</span>        putThread.join();<a name="line.3849"></a>
+<span class="sourceLineNo">3850</span>        putThread.checkNoError();<a name="line.3850"></a>
+<span class="sourceLineNo">3851</span>      }<a name="line.3851"></a>
+<span class="sourceLineNo">3852</span><a name="line.3852"></a>
+<span class="sourceLineNo">3853</span>      ctx.stop();<a name="line.3853"></a>
+<span class="sourceLineNo">3854</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.3854"></a>
+<span class="sourceLineNo">3855</span>      this.region = null;<a name="line.3855"></a>
+<span class="sourceLineNo">3856</span>    }<a name="line.3856"></a>
+<span class="sourceLineNo">3857</span>  }<a name="line.3857"></a>
+<span class="sourceLineNo">3858</span><a name="line.3858"></a>
+<span class="sourceLineNo">3859</span>  @Test<a name="line.3859"></a>
+<span class="sourceLineNo">3860</span>  public void testHolesInMeta() throws Exception {<a name="line.3860"></a>
+<span class="sourceLineNo">3861</span>    byte[] family = Bytes.toBytes("family");<a name="line.3861"></a>
+<span class="sourceLineNo">3862</span>    this.region = initHRegion(tableName, Bytes.toBytes("x"), Bytes.toBytes("z"), method, CONF,<a name="line.3862"></a>
+<span class="sourceLineNo">3863</span>        false, family);<a name="line.3863"></a>
+<span class="sourceLineNo">3864</span>    byte[] rowNotServed = Bytes.toBytes("a");<a name="line.3864"></a>
+<span class="sourceLineNo">3865</span>    Get g = new Get(rowNotServed);<a name="line.3865"></a>
+<span class="sourceLineNo">3866</span>    try {<a name="line.3866"></a>
+<span class="sourceLineNo">3867</span>      region.get(g);<a name="line.3867"></a>
+<span class="sourceLineNo">3868</span>      fail();<a name="line.3868"></a>
+<span class="sourceLineNo">3869</span>    } catch (WrongRegionException x) {<a name="line.3869"></a>
+<span class="sourceLineNo">3870</span>      // OK<a name="line.3870"></a>
+<span class="sourceLineNo">3871</span>    }<a name="line.3871"></a>
+<span class="sourceLineNo">3872</span>    byte[] row = Bytes.toBytes("y");<a name="line.3872"></a>
+<span class="sourceLineNo">3873</span>    g = new Get(row);<a name="line.3873"></a>
+<span class="sourceLineNo">3874</span>    region.get(g);<a name="line.3874"></a>
+<span class="sourceLineNo">3875</span>  }<a name="line.3875"></a>
 <span class="sourceLineNo">3876</span><a name="line.3876"></a>
-<span class="sourceLineNo">3877</span>    region.flush(true);<a name="line.3877"></a>
-<span class="sourceLineNo">3878</span><a name="line.3878"></a>
-<span class="sourceLineNo">3879</span>    Delete delete = new Delete(Bytes.toBytes(1L), 1L);<a name="line.3879"></a>
-<span class="sourceLineNo">3880</span>    region.delete(delete);<a name="line.3880"></a>
-<span class="sourceLineNo">3881</span><a name="line.3881"></a>
-<span class="sourceLineNo">3882</span>    put = new Put(Bytes.toBytes(2L));<a name="line.3882"></a>
-<span class="sourceLineNo">3883</span>    put.addColumn(family, qual1, 2L, Bytes.toBytes(2L));<a name="line.3883"></a>
-<span class="sourceLineNo">3884</span>    region.put(put);<a name="line.3884"></a>
-<span class="sourceLineNo">3885</span><a name="line.3885"></a>
-<span class="sourceLineNo">3886</span>    Scan idxScan = new Scan();<a name="line.3886"></a>
-<span class="sourceLineNo">3887</span>    idxScan.addFamily(family);<a name="line.3887"></a>
-<span class="sourceLineNo">3888</span>    idxScan.setFilter(new FilterList(FilterList.Operator.MUST_PASS_ALL, Arrays.&lt;Filter&gt; asList(<a name="line.3888"></a>
-<span class="sourceLineNo">3889</span>        new SingleColumnValueFilter(family, qual1, CompareOperator.GREATER_OR_EQUAL,<a name="line.3889"></a>
-<span class="sourceLineNo">3890</span>            new BinaryComparator(Bytes.toBytes(0L))), new SingleColumnValueFilter(family, qual1,<a name="line.3890"></a>
-<span class="sourceLineNo">3891</span>                    CompareOperator.LESS_OR_EQUAL, new BinaryComparator(Bytes.toBytes(3L))))));<a name="line.3891"></a>
-<span class="sourceLineNo">3892</span>    InternalScanner scanner = region.getScanner(idxScan);<a name="line.3892"></a>
-<span class="sourceLineNo">3893</span>    List&lt;Cell&gt; res = new ArrayList&lt;&gt;();<a name="line.3893"></a>
-<span class="sourceLineNo">3894</span><a name="line.3894"></a>
-<span class="sourceLineNo">3895</span>    while (scanner.next(res)) {<a name="line.3895"></a>
-<span class="sourceLineNo">3896</span>      // Ignore res value.<a name="line.3896"></a>
-<span class="sourceLineNo">3897</span>    }<a name="line.3897"></a>
-<span class="sourceLineNo">3898</span>    assertEquals(1L, res.size());<a name="line.3898"></a>
-<span class="sourceLineNo">3899</span>  }<a name="line.3899"></a>
-<span class="sourceLineNo">3900</span><a name="line.3900"></a>
-<span class="sourceLineNo">3901</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.3901"></a>
-<span class="sourceLineNo">3902</span>  // Bloom filter test<a name="line.3902"></a>
-<span class="sourceLineNo">3903</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.3903"></a>
-<span class="sourceLineNo">3904</span>  @Test<a name="line.3904"></a>
-<span class="sourceLineNo">3905</span>  public void testBloomFilterSize() throws IOException {<a name="line.3905"></a>
-<span class="sourceLineNo">3906</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.3906"></a>
-<span class="sourceLineNo">3907</span>    byte[] qf1 = Bytes.toBytes("col");<a name="line.3907"></a>
-<span class="sourceLineNo">3908</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.3908"></a>
-<span class="sourceLineNo">3909</span>    // Create Table<a name="line.3909"></a>
-<span class="sourceLineNo">3910</span>    HColumnDescriptor hcd = new HColumnDescriptor(fam1).setMaxVersions(Integer.MAX_VALUE)<a name="line.3910"></a>
-<span class="sourceLineNo">3911</span>        .setBloomFilterType(BloomType.ROWCOL);<a name="line.3911"></a>
-<span class="sourceLineNo">3912</span><a name="line.3912"></a>
-<span class="sourceLineNo">3913</span>    HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.3913"></a>
-<span class="sourceLineNo">3914</span>    htd.addFamily(hcd);<a name="line.3914"></a>
-<span class="sourceLineNo">3915</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.3915"></a>
-<span class="sourceLineNo">3916</span>    this.region = TEST_UTIL.createLocalHRegion(info, htd);<a name="line.3916"></a>
-<span class="sourceLineNo">3917</span>    int num_unique_rows = 10;<a name="line.3917"></a>
-<span class="sourceLineNo">3918</span>    int duplicate_multiplier = 2;<a name="line.3918"></a>
-<span class="sourceLineNo">3919</span>    int num_storefiles = 4;<a name="line.3919"></a>
-<span class="sourceLineNo">3920</span><a name="line.3920"></a>
-<span class="sourceLineNo">3921</span>    int version = 0;<a name="line.3921"></a>
-<span class="sourceLineNo">3922</span>    for (int f = 0; f &lt; num_storefiles; f++) {<a name="line.3922"></a>
-<span class="sourceLineNo">3923</span>      for (int i = 0; i &lt; duplicate_multiplier; i++) {<a name="line.3923"></a>
-<span class="sourceLineNo">3924</span>        for (int j = 0; j &lt; num_unique_rows; j++) {<a name="line.3924"></a>
-<span class="sourceLineNo">3925</span>          Put put = new Put(Bytes.toBytes("row" + j));<a name="line.3925"></a>
-<span class="sourceLineNo">3926</span>          put.setDurability(Durability.SKIP_WAL);<a name="line.3926"></a>
-<span class="sourceLineNo">3927</span>          long ts = version++;<a name="line.3927"></a>
-<span class="sourceLineNo">3928</span>          put.addColumn(fam1, qf1, ts, val1);<a name="line.3928"></a>
-<span class="sourceLineNo">3929</span>          region.put(put);<a name="line.3929"></a>
-<span class="sourceLineNo">3930</span>        }<a name="line.3930"></a>
-<span class="sourceLineNo">3931</span>      }<a name="line.3931"></a>
-<span class="sourceLineNo">3932</span>      region.flush(true);<a name="line.3932"></a>
-<span class="sourceLineNo">3933</span>    }<a name="line.3933"></a>
-<span class="sourceLineNo">3934</span>    // before compaction<a name="line.3934"></a>
-<span class="sourceLineNo">3935</span>    HStore store = region.getStore(fam1);<a name="line.3935"></a>
-<span class="sourceLineNo">3936</span>    Collection&lt;HStoreFile&gt; storeFiles = store.getStorefiles();<a name="line.3936"></a>
-<span class="sourceLineNo">3937</span>    for (HStoreFile storefile : storeFiles) {<a name="line.3937"></a>
-<span class="sourceLineNo">3938</span>      StoreFileReader reader = storefile.getReader();<a name="line.3938"></a>
-<span class="sourceLineNo">3939</span>      reader.loadFileInfo();<a name="line.3939"></a>
-<span class="sourceLineNo">3940</span>      reader.loadBloomfilter();<a name="line.3940"></a>
-<span class="sourceLineNo">3941</span>      assertEquals(num_unique_rows * duplicate_multiplier, reader.getEntries());<a name="line.3941"></a>
-<span class="sourceLineNo">3942</span>      assertEquals(num_unique_rows, reader.getFilterEntries());<a name="line.3942"></a>
+<span class="sourceLineNo">3877</span>  @Test<a name="line.3877"></a>
+<span class="sourceLineNo">3878</span>  public void testIndexesScanWithOneDeletedRow() throws IOException {<a name="line.3878"></a>
+<span class="sourceLineNo">3879</span>    byte[] family = Bytes.toBytes("family");<a name="line.3879"></a>
+<span class="sourceLineNo">3880</span><a name="line.3880"></a>
+<span class="sourceLineNo">3881</span>    // Setting up region<a name="line.3881"></a>
+<span class="sourceLineNo">3882</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.3882"></a>
+<span class="sourceLineNo">3883</span>    Put put = new Put(Bytes.toBytes(1L));<a name="line.3883"></a>
+<span class="sourceLineNo">3884</span>    put.addColumn(family, qual1, 1L, Bytes.toBytes(1L));<a name="line.3884"></a>
+<span class="sourceLineNo">3885</span>    region.put(put);<a name="line.3885"></a>
+<span class="sourceLineNo">3886</span><a name="line.3886"></a>
+<span class="sourceLineNo">3887</span>    region.flush(true);<a name="line.3887"></a>
+<span class="sourceLineNo">3888</span><a name="line.3888"></a>
+<span class="sourceLineNo">3889</span>    Delete delete = new Delete(Bytes.toBytes(1L), 1L);<a name="line.3889"></a>
+<span class="sourceLineNo">3890</span>    region.delete(delete);<a name="line.3890"></a>
+<span class="sourceLineNo">3891</span><a name="line.3891"></a>
+<span class="sourceLineNo">3892</span>    put = new Put(Bytes.toBytes(2L));<a name="line.3892"></a>
+<span class="sourceLineNo">3893</span>    put.addColumn(family, qual1, 2L, Bytes.toBytes(2L));<a name="line.3893"></a>
+<span class="sourceLineNo">3894</span>    region.put(put);<a name="line.3894"></a>
+<span class="sourceLineNo">3895</span><a name="line.3895"></a>
+<span class="sourceLineNo">3896</span>    Scan idxScan = new Scan();<a name="line.3896"></a>
+<span class="sourceLineNo">3897</span>    idxScan.addFamily(family);<a name="line.3897"></a>
+<span class="sourceLineNo">3898</span>    idxScan.setFilter(new FilterList(FilterList.Operator.MUST_PASS_ALL, Arrays.&lt;Filter&gt; asList(<a name="line.3898"></a>
+<span class="sourceLineNo">3899</span>        new SingleColumnValueFilter(family, qual1, CompareOperator.GREATER_OR_EQUAL,<a name="line.3899"></a>
+<span class="sourceLineNo">3900</span>            new BinaryComparator(Bytes.toBytes(0L))), new SingleColumnValueFilter(family, qual1,<a name="line.3900"></a>
+<span class="sourceLineNo">3901</span>                    CompareOperator.LESS_OR_EQUAL, new BinaryComparator(Bytes.toBytes(3L))))));<a name="line.3901"></a>
+<span class="sourceLineNo">3902</span>    InternalScanner scanner = region.getScanner(idxScan);<a name="line.3902"></a>
+<span class="sourceLineNo">3903</span>    List&lt;Cell&gt; res = new ArrayList&lt;&gt;();<a name="line.3903"></a>
+<span class="sourceLineNo">3904</span><a name="line.3904"></a>
+<span class="sourceLineNo">3905</span>    while (scanner.next(res)) {<a name="line.3905"></a>
+<span class="sourceLineNo">3906</span>      // Ignore res value.<a name="line.3906"></a>
+<span class="sourceLineNo">3907</span>    }<a name="line.3907"></a>
+<span class="sourceLineNo">3908</span>    assertEquals(1L, res.size());<a name="line.3908"></a>
+<span class="sourceLineNo">3909</span>  }<a name="line.3909"></a>
+<span class="sourceLineNo">3910</span><a name="line.3910"></a>
+<span class="sourceLineNo">3911</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.3911"></a>
+<span class="sourceLineNo">3912</span>  // Bloom filter test<a name="line.3912"></a>
+<span class="sourceLineNo">3913</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.3913"></a>
+<span class="sourceLineNo">3914</span>  @Test<a name="line.3914"></a>
+<span class="sourceLineNo">3915</span>  public void testBloomFilterSize() throws IOException {<a name="line.3915"></a>
+<span class="sourceLineNo">3916</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.3916"></a>
+<span class="sourceLineNo">3917</span>    byte[] qf1 = Bytes.toBytes("col");<a name="line.3917"></a>
+<span class="sourceLineNo">3918</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.3918"></a>
+<span class="sourceLineNo">3919</span>    // Create Table<a name="line.3919"></a>
+<span class="sourceLineNo">3920</span>    HColumnDescriptor hcd = new HColumnDescriptor(fam1).setMaxVersions(Integer.MAX_VALUE)<a name="line.3920"></a>
+<span class="sourceLineNo">3921</span>        .setBloomFilterType(BloomType.ROWCOL);<a name="line.3921"></a>
+<span class="sourceLineNo">3922</span><a name="line.3922"></a>
+<span class="sourceLineNo">3923</span>    HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.3923"></a>
+<span class="sourceLineNo">3924</span>    htd.addFamily(hcd);<a name="line.3924"></a>
+<span class="sourceLineNo">3925</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.3925"></a>
+<span class="sourceLineNo">3926</span>    this.region = TEST_UTIL.createLocalHRegion(info, htd);<a name="line.3926"></a>
+<span class="sourceLineNo">3927</span>    int num_unique_rows = 10;<a name="line.3927"></a>
+<span class="sourceLineNo">3928</span>    int duplicate_multiplier = 2;<a name="line.3928"></a>
+<span class="sourceLineNo">3929</span>    int num_storefiles = 4;<a name="line.3929"></a>
+<span class="sourceLineNo">3930</span><a name="line.3930"></a>
+<span class="sourceLineNo">3931</span>    int version = 0;<a name="line.3931"></a>
+<span class="sourceLineNo">3932</span>    for (int f = 0; f &lt; num_storefiles; f++) {<a name="line.3932"></a>
+<span class="sourceLineNo">3933</span>      for (int i = 0; i &lt; duplicate_multiplier; i++) {<a name="line.3933"></a>
+<span class="sourceLineNo">3934</span>        for (int j = 0; j &lt; num_unique_rows; j++) {<a name="line.3934"></a>
+<span class="sourceLineNo">3935</span>          Put put = new Put(Bytes.toBytes("row" + j));<a name="line.3935"></a>
+<span class="sourceLineNo">3936</span>          put.setDurability(Durability.SKIP_WAL);<a name="line.3936"></a>
+<span class="sourceLineNo">3937</span>          long ts = version++;<a name="line.3937"></a>
+<span class="sourceLineNo">3938</span>          put.addColumn(fam1, qf1, ts, val1);<a name="line.3938"></a>
+<span class="sourceLineNo">3939</span>          region.put(put);<a name="line.3939"></a>
+<span class="sourceLineNo">3940</span>        }<a name="line.3940"></a>
+<span class="sourceLineNo">3941</span>      }<a name="line.3941"></a>
+<span class="sourceLineNo">3942</span>      region.flush(true);<a name="line.3942"></a>
 <span class="sourceLineNo">3943</span>    }<a name="line.3943"></a>
-<span class="sourceLineNo">3944</span><a name="line.3944"></a>
-<span class="sourceLineNo">3945</span>    region.compact(true);<a name="line.3945"></a>
-<span class="sourceLineNo">3946</span><a name="line.3946"></a>
-<span class="sourceLineNo">3947</span>    // after compaction<a name="line.3947"></a>
-<span class="sourceLineNo">3948</span>    storeFiles = store.getStorefiles();<a name="line.3948"></a>
-<span class="sourceLineNo">3949</span>    for (HStoreFile storefile : storeFiles) {<a name="line.3949"></a>
-<span class="sourceLineNo">3950</span>      StoreFileReader reader = storefile.getReader();<a name="line.3950"></a>
-<span class="sourceLineNo">3951</span>      reader.loadFileInfo();<a name="line.3951"></a>
-<span class="sourceLineNo">3952</span>      reader.loadBloomfilter();<a name="line.3952"></a>
-<span class="sourceLineNo">3953</span>      assertEquals(num_unique_rows * duplicate_multiplier * num_storefiles, reader.getEntries());<a name="line.3953"></a>
-<span class="sourceLineNo">3954</span>      assertEquals(num_unique_rows, reader.getFilterEntries());<a name="line.3954"></a>
-<span class="sourceLineNo">3955</span>    }<a name="line.3955"></a>
-<span class="sourceLineNo">3956</span>  }<a name="line.3956"></a>
-<span class="sourceLineNo">3957</span><a name="line.3957"></a>
-<span class="sourceLineNo">3958</span>  @Test<a name="line.3958"></a>
-<span class="sourceLineNo">3959</span>  public void testAllColumnsWithBloomFilter() throws IOException {<a name="line.3959"></a>
-<span class="sourceLineNo">3960</span>    byte[] TABLE = Bytes.toBytes(name.getMethodName());<a name="line.3960"></a>
-<span class="sourceLineNo">3961</span>    byte[] FAMILY = Bytes.toBytes("family");<a name="line.3961"></a>
-<span class="sourceLineNo">3962</span><a name="line.3962"></a>
-<span class="sourceLineNo">3963</span>    // Create table<a name="line.3963"></a>
-<span class="sourceLineNo">3964</span>    HColumnDescriptor hcd = new HColumnDescriptor(FAMILY).setMaxVersions(Integer.MAX_VALUE)<a name="line.3964"></a>
-<span class="sourceLineNo">3965</span>        .setBloomFilterType(BloomType.ROWCOL);<a name="line.3965"></a>
-<span class="sourceLineNo">3966</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(TABLE));<a name="line.3966"></a>
-<span class="sourceLineNo">3967</span>    htd.addFamily(hcd);<a name="line.3967"></a>
-<span class="sourceLineNo">3968</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.3968"></a>
-<span class="sourceLineNo">3969</span>    this.region = TEST_UTIL.createLocalHRegion(info, htd);<a name="line.3969"></a>
-<span class="sourceLineNo">3970</span>    // For row:0, col:0: insert versions 1 through 5.<a name="line.3970"></a>
-<span class="sourceLineNo">3971</span>    byte[] row = Bytes.toBytes("row:" + 0);<a name="line.3971"></a>
-<span class="sourceLineNo">3972</span>    byte[] column = Bytes.toBytes("column:" + 0);<a name="line.3972"></a>
-<span class="sourceLineNo">3973</span>    Put put = new Put(row);<a name="line.3973"></a>
-<span class="sourceLineNo">3974</span>    put.setDurability(Durability.SKIP_WAL);<a name="line.3974"></a>
-<span class="sourceLineNo">3975</span>    for (long idx = 1; idx &lt;= 4; idx++) {<a name="line.3975"></a>
-<span class="sourceLineNo">3976</span>      put.addColumn(FAMILY, column, idx, Bytes.toBytes("value-version-" + idx));<a name="line.3976"></a>
-<span class="sourceLineNo">3977</span>    }<a name="line.3977"></a>
-<span class="sourceLineNo">3978</span>    region.put(put);<a name="line.3978"></a>
-<span class="sourceLineNo">3979</span><a name="line.3979"></a>
-<span class="sourceLineNo">3980</span>    // Flush<a name="line.3980"></a>
-<span class="sourceLineNo">3981</span>    region.flush(true);<a name="line.3981"></a>
-<span class="sourceLineNo">3982</span><a name="line.3982"></a>
-<span class="sourceLineNo">3983</span>    // Get rows<a name="line.3983"></a>
-<span class="sourceLineNo">3984</span>    Get get = new Get(row);<a name="line.3984"></a>
-<span class="sourceLineNo">3985</span>    get.readAllVersions();<a name="line.3985"></a>
-<span class="sourceLineNo">3986</span>    Cell[] kvs = region.get(get).rawCells();<a name="line.3986"></a>
-<span class="sourceLineNo">3987</span><a name="line.3987"></a>
-<span class="sourceLineNo">3988</span>    // Check if rows are correct<a name="line.3988"></a>
-<span class="sourceLineNo">3989</span>    assertEquals(4, kvs.length);<a name="line.3989"></a>
-<span class="sourceLineNo">3990</span>    checkOneCell(kvs[0], FAMILY, 0, 0, 4);<a name="line.3990"></a>
-<span class="sourceLineNo">3991</span>    checkOneCell(kvs[1], FAMILY, 0, 0, 3);<a name="line.3991"></a>
-<span class="sourceLineNo">3992</span>    checkOneCell(kvs[2], FAMILY, 0, 0, 2);<a name="line.3992"></a>
-<span class="sourceLineNo">3993</span>    checkOneCell(kvs[3], FAMILY, 0, 0, 1);<a name="line.3993"></a>
-<span class="sourceLineNo">3994</span>  }<a name="line.3994"></a>
-<span class="sourceLineNo">3995</span><a name="line.3995"></a>
-<span class="sourceLineNo">3996</span>  /**<a name="line.3996"></a>
-<span class="sourceLineNo">3997</span>   * Testcase to cover bug-fix for HBASE-2823 Ensures correct delete when<a name="line.3997"></a>
-<span class="sourceLineNo">3998</span>   * issuing delete row on columns with bloom filter set to row+col<a name="line.3998"></a>
-<span class="sourceLineNo">3999</span>   * (BloomType.ROWCOL)<a name="line.3999"></a>
-<span class="sourceLineNo">4000</span>   */<a name="line.4000"></a>
-<span class="sourceLineNo">4001</span>  @Test<a name="line.4001"></a>
-<span class="sourceLineNo">4002</span>  public void testDeleteRowWithBloomFilter() throws IOException {<a name="line.4002"></a>
-<span class="sourceLineNo">4003</span>    byte[] familyName = Bytes.toBytes("familyName");<a name="line.4003"></a>
-<span class="sourceLineNo">4004</span><a name="line.4004"></a>
-<span class="sourceLineNo">4005</span>    // Create Table<a name="line.4005"></a>
-<span class="sourceLineNo">4006</span>    HColumnDescriptor hcd = new HColumnDescriptor(familyName).setMaxVersions(Integer.MAX_VALUE)<a name="line.4006"></a>
-<span class="sourceLineNo">4007</span>        .setBloomFilterType(BloomType.ROWCOL);<a name="line.4007"></a>
-<span class="sourceLineNo">4008</span><a name="line.4008"></a>
-<span class="sourceLineNo">4009</span>    HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.4009"></a>
-<span class="sourceLineNo">4010</span>    htd.addFamily(hcd);<a name="line.4010"></a>
-<span class="sourceLineNo">4011</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.4011"></a>
-<span class="sourceLineNo">4012</span>    this.region = TEST_UTIL.createLocalHRegion(info, htd);<a name="line.4012"></a>
-<span class="sourceLineNo">4013</span>    // Insert some data<a name="line.4013"></a>
-<span class="sourceLineNo">4014</span>    byte[] row = Bytes.toBytes("row1");<a name="line.4014"></a>
-<span class="sourceLineNo">4015</span>    byte[] col = Bytes.toBytes("col1");<a name="line.4015"></a>
-<span class="sourceLineNo">4016</span><a name="line.4016"></a>
-<span class="sourceLineNo">4017</span>    Put put = new Put(row);<a name="line.4017"></a>
-<span class="sourceLineNo">4018</span>    put.addColumn(familyName, col, 1, Bytes.toBytes("SomeRandomValue"));<a name="line.4018"></a>
-<span class="sourceLineNo">4019</span>    region.put(put);<a name="line.4019"></a>
-<span class="sourceLineNo">4020</span>    region.flush(true);<a name="line.4020"></a>
-<span class="sourceLineNo">4021</span><a name="line.4021"></a>
-<span class="sourceLineNo">4022</span>    Delete del = new Delete(row);<a name="line.4022"></a>
-<span class="sourceLineNo">4023</span>    region.delete(del);<a name="line.4023"></a>
-<span class="sourceLineNo">4024</span>    region.flush(true);<a name="line.4024"></a>
-<span class="sourceLineNo">4025</span><a name="line.4025"></a>
-<span class="sourceLineNo">4026</span>    // Get remaining rows (should have none)<a name="line.4026"></a>
-<span class="sourceLineNo">4027</span>    Get get = new Get(row);<a name="line.4027"></a>
-<span class="sourceLineNo">4028</span>    get.addColumn(familyName, col);<a name="line.4028"></a>
-<span class="sourceLineNo">4029</span><a name="line.4029"></a>
-<span class="sourceLineNo">4030</span>    Cell[] keyValues = region.get(get).rawCells();<a name="line.4030"></a>
-<span class="sourceLineNo">4031</span>    assertEquals(0, keyValues.length);<a name="line.4031"></a>
-<span class="sourceLineNo">4032</span>  }<a name="line.4032"></a>
-<span class="sourceLineNo">4033</span><a name="line.4033"></a>
-<span class="sourceLineNo">4034</span>  @Test<a name="line.4034"></a>
-<span class="sourceLineNo">4035</span>  public void testgetHDFSBlocksDistribution() throws Exception {<a name="line.4035"></a>
-<span class="sourceLineNo">4036</span>    HBaseTestingUtility htu = new HBaseTestingUtility();<a name="line.4036"></a>
-<span class="sourceLineNo">4037</span>    // Why do we set the block size in this test?  If we set it smaller than the kvs, then we'll<a name="line.4037"></a>
-<span class="sourceLineNo">4038</span>    // break up the file in to more pieces that can be distributed across the three nodes and we<a name="line.4038"></a>
-<span class="sourceLineNo">4039</span>    // won't be able to have the condition this test asserts; that at least one node has<a name="line.4039"></a>
-<span class="sourceLineNo">4040</span>    // a copy of all replicas -- if small block size, then blocks are spread evenly across the<a name="line.4040"></a>
-<span class="sourceLineNo">4041</span>    // the three nodes.  hfilev3 with tags seems to put us over the block size.  St.Ack.<a name="line.4041"></a>
-<span class="sourceLineNo">4042</span>    // final int DEFAULT_BLOCK_SIZE = 1024;<a name="line.4042"></a>
-<span class="sourceLineNo">4043</span>    // htu.getConfiguration().setLong("dfs.blocksize", DEFAULT_BLOCK_SIZE);<a name="line.4043"></a>
-<span class="sourceLineNo">4044</span>    htu.getConfiguration().setInt("dfs.replication", 2);<a name="line.4044"></a>
-<span class="sourceLineNo">4045</span><a name="line.4045"></a>
-<span class="sourceLineNo">4046</span>    // set up a cluster with 3 nodes<a name="line.4046"></a>
-<span class="sourceLineNo">4047</span>    MiniHBaseCluster cluster = null;<a name="line.4047"></a>
-<span class="sourceLineNo">4048</span>    String dataNodeHosts[] = new String[] { "host1", "host2", "host3" };<a name="line.4048"></a>
-<span class="sourceLineNo">4049</span>    int regionServersCount = 3;<a name="line.4049"></a>
-<span class="sourceLineNo">4050</span><a name="line.4050"></a>
-<span class="sourceLineNo">4051</span>    try {<a name="line.4051"></a>
-<span class="sourceLineNo">4052</span>      StartMiniClusterOption option = StartMiniClusterOption.builder()<a name="line.4052"></a>
-<span class="sourceLineNo">4053</span>          .numRegionServers(regionServersCount).dataNodeHosts(dataNodeHosts).build();<a name="line.4053"></a>
-<span class="sourceLineNo">4054</span>      cluster = htu.startMiniCluster(option);<a name="line.4054"></a>
-<span class="sourceLineNo">4055</span>      byte[][] families = { fam1, fam2 };<a name="line.4055"></a>
-<span class="sourceLineNo">4056</span>      Table ht = htu.createTable(tableName, families);<a name="line.4056"></a>
-<span class="sourceLineNo">4057</span><a name="line.4057"></a>
-<span class="sourceLineNo">4058</span>      // Setting up region<a name="line.4058"></a>
-<span class="sourceLineNo">4059</span>      byte row[] = Bytes.toBytes("row1");<a name="line.4059"></a>
-<span class="sourceLineNo">4060</span>      byte col[] = Bytes.toBytes("col1");<a name="line.4060"></a>
-<span class="sourceLineNo">4061</span><a name="line.4061"></a>
-<span class="sourceLineNo">4062</span>      Put put = new Put(row);<a name="line.4062"></a>
-<span class="sourceLineNo">4063</span>      put.addColumn(fam1, col, 1, Bytes.toBytes("test1"));<a name="line.4063"></a>
-<span class="sourceLineNo">4064</span>      put.addColumn(fam2, col, 1, Bytes.toBytes("test2"));<a name="line.4064"></a>
-<span class="sourceLineNo">4065</span>      ht.put(put);<a name="line.4065"></a>
-<span class="sourceLineNo">4066</span><a name="line.4066"></a>
-<span class="sourceLineNo">4067</span>      HRegion firstRegion = htu.getHBaseCluster().getRegions(tableName).get(0);<a name="line.4067"></a>
-<span class="sourceLineNo">4068</span>      firstRegion.flush(true);<a name="line.4068"></a>
-<span class="sourceLineNo">4069</span>      HDFSBlocksDistribution blocksDistribution1 = firstRegion.getHDFSBlocksDistribution();<a name="line.4069"></a>
-<span class="sourceLineNo">4070</span><a name="line.4070"></a>
-<span class="sourceLineNo">4071</span>      // Given the default replication factor is 2 and we have 2 HFiles,<a name="line.4071"></a>
-<span class="sourceLineNo">4072</span>      // we will have total of 4 replica of blocks on 3 datanodes; thus there<a name="line.4072"></a>
-<span class="sourceLineNo">4073</span>      // must be at least one host that have replica for 2 HFiles. That host's<a name="line.4073"></a>
-<span class="sourceLineNo">4074</span>      // weight will be equal to the unique block weight.<a name="line.4074"></a>
-<span class="sourceLineNo">4075</span>      long uniqueBlocksWeight1 = blocksDistribution1.getUniqueBlocksTotalWeight();<a name="line.4075"></a>
-<span class="sourceLineNo">4076</span>      StringBuilder sb = new StringBuilder();<a name="line.4076"></a>
-<span class="sourceLineNo">4077</span>      for (String host: blocksDistribution1.getTopHosts()) {<a name="line.4077"></a>
-<span class="sourceLineNo">4078</span>        if (sb.length() &gt; 0) sb.append(", ");<a name="line.4078"></a>
-<span class="sourceLineNo">4079</span>        sb.append(host);<a name="line.4079"></a>
-<span class="sourceLineNo">4080</span>        sb.append("=");<a name="line.4080"></a>
-<span class="sourceLineNo">4081</span>        sb.append(blocksDistribution1.getWeight(host));<a name="line.4081"></a>
-<span class="sourceLineNo">4082</span>      }<a name="line.4082"></a>
-<span class="sourceLineNo">4083</span><a name="line.4083"></a>
-<span class="sourceLineNo">4084</span>      String topHost = blocksDistribution1.getTopHosts().get(0);<a name="line.4084"></a>
-<span class="sourceLineNo">4085</span>      long topHostWeight = blocksDistribution1.getWeight(topHost);<a name="line.4085"></a>
-<span class="sourceLineNo">4086</span>      String msg = "uniqueBlocksWeight=" + uniqueBlocksWeight1 + ", topHostWeight=" +<a name="line.4086"></a>
-<span class="sourceLineNo">4087</span>        topHostWeight + ", topHost=" + topHost + "; " + sb.toString();<a name="line.4087"></a>
-<span class="sourceLineNo">4088</span>      LOG.info(msg);<a name="line.4088"></a>
-<span class="sourceLineNo">4089</span>      assertTrue(msg, uniqueBlocksWeight1 == topHostWeight);<a name="line.4089"></a>
-<span class="sourceLineNo">4090</span><a name="line.4090"></a>
-<span class="sourceLineNo">4091</span>      // use the static method to compute the value, it should be the same.<a name="line.4091"></a>
-<span class="sourceLineNo">4092</span>      // static method is used by load balancer or other components<a name="line.4092"></a>
-<span class="sourceLineNo">4093</span>      HDFSBlocksDistribution blocksDistribution2 = HRegion.computeHDFSBlocksDistribution(<a name="line.4093"></a>
-<span class="sourceLineNo">4094</span>          htu.getConfiguration(), firstRegion.getTableDescriptor(), firstRegion.getRegionInfo());<a name="line.4094"></a>
-<span class="sourceLineNo">4095</span>      long uniqueBlocksWeight2 = blocksDistribution2.getUniqueBlocksTotalWeight();<a name="line.4095"></a>
-<span class="sourceLineNo">4096</span><a name="line.4096"></a>
-<span class="sourceLineNo">4097</span>      assertTrue(uniqueBlocksWeight1 == uniqueBlocksWeight2);<a name="line.4097"></a>
-<span class="sourceLineNo">4098</span><a name="line.4098"></a>
-<span class="sourceLineNo">4099</span>      ht.close();<a name="line.4099"></a>
-<span class="sourceLineNo">4100</span>    } finally {<a name="line.4100"></a>
-<span class="sourceLineNo">4101</span>      if (cluster != null) {<a name="line.4101"></a>
-<span class="sourceLineNo">4102</span>        htu.shutdownMiniCluster();<a name="line.4102"></a>
-<span class="sourceLineNo">4103</span>      }<a name="line.4103"></a>
-<span class="sourceLineNo">4104</span>    }<a name="line.4104"></a>
-<span class="sourceLineNo">4105</span>  }<a name="line.4105"></a>
+<span class="sourceLineNo">3944</span>    // before compaction<a name="line.3944"></a>
+<span class="sourceLineNo">3945</span>    HStore store = region.getStore(fam1);<a name="line.3945"></a>
+<span class="sourceLineNo">3946</span>    Collection&lt;HStoreFile&gt; storeFiles = store.getStorefiles();<a name="line.3946"></a>
+<span class="sourceLineNo">3947</span>    for (HStoreFile storefile : storeFiles) {<a name="line.3947"></a>
+<span class="sourceLineNo">3948</span>      StoreFileReader reader = storefile.getReader();<a name="line.3948"></a>
+<span class="sourceLineNo">3949</span>      reader.loadFileInfo();<a name="line.3949"></a>
+<span class="sourceLineNo">3950</span>      reader.loadBloomfilter();<a name="line.3950"></a>
+<span class="sourceLineNo">3951</span>      assertEquals(num_unique_rows * duplicate_multiplier, reader.getEntries());<a name="line.3951"></a>
+<span class="sourceLineNo">3952</span>      assertEquals(num_unique_rows, reader.getFilterEntries());<a name="line.3952"></a>
+<span class="sourceLineNo">3953</span>    }<a name="line.3953"></a>
+<span class="sourceLineNo">3954</span><a name="line.3954"></a>
+<span class="sourceLineNo">3955</span>    region.compact(true);<a name="line.3955"></a>
+<span class="sourceLineNo">3956</span><a name="line.3956"></a>
+<span class="sourceLineNo">3957</span>    // after compaction<a name="line.3957"></a>
+<span class="sourceLineNo">3958</span>    storeFiles = store.getStorefiles();<a name="line.3958"></a>
+<span class="sourceLineNo">3959</span>    for (HStoreFile storefile : storeFiles) {<a name="line.3959"></a>
+<span class="sourceLineNo">3960</span>      StoreFileReader reader = storefile.getReader();<a name="line.3960"></a>
+<span class="sourceLineNo">3961</span>      reader.loadFileInfo();<a name="line.3961"></a>
+<span class="sourceLineNo">3962</span>      reader.loadBloomfilter();<a name="line.3962"></a>
+<span class="sourceLineNo">3963</span>      assertEquals(num_unique_rows * duplicate_multiplier * num_storefiles, reader.getEntries());<a name="line.3963"></a>
+<span class="sourceLineNo">3964</span>      assertEquals(num_unique_rows, reader.getFilterEntries());<a name="line.3964"></a>
+<span class="sourceLineNo">3965</span>    }<a name="line.3965"></a>
+<span class="sourceLineNo">3966</span>  }<a name="line.3966"></a>
+<span class="sourceLineNo">3967</span><a name="line.3967"></a>
+<span class="sourceLineNo">3968</span>  @Test<a name="line.3968"></a>
+<span class="sourceLineNo">3969</span>  public void testAllColumnsWithBloomFilter() throws IOException {<a name="line.3969"></a>
+<span class="sourceLineNo">3970</span>    byte[] TABLE = Bytes.toBytes(name.getMethodName());<a name="line.3970"></a>
+<span class="sourceLineNo">3971</span>    byte[] FAMILY = Bytes.toBytes("family");<a name="line.3971"></a>
+<span class="sourceLineNo">3972</span><a name="line.3972"></a>
+<span class="sourceLineNo">3973</span>    // Create table<a name="line.3973"></a>
+<span class="sourceLineNo">3974</span>    HColumnDescriptor hcd = new HColumnDescriptor(FAMILY).setMaxVersions(Integer.MAX_VALUE)<a name="line.3974"></a>
+<span class="sourceLineNo">3975</span>        .setBloomFilterType(BloomType.ROWCOL);<a name="line.3975"></a>
+<span class="sourceLineNo">3976</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(TABLE));<a name="line.3976"></a>
+<span class="sourceLineNo">3977</span>    htd.addFamily(hcd);<a name="line.3977"></a>
+<span class="sourceLineNo">3978</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.3978"></a>
+<span class="sourceLineNo">3979</span>    this.region = TEST_UTIL.createLocalHRegion(info, htd);<a name="line.3979"></a>
+<span class="sourceLineNo">3980</span>    // For row:0, col:0: insert versions 1 through 5.<a name="line.3980"></a>
+<span class="sourceLineNo">3981</span>    byte[] row = Bytes.toBytes("row:" + 0);<a name="line.3981"></a>
+<span class="sourceLineNo">3982</span>    byte[] column = Bytes.toBytes("column:" + 0);<a name="line.3982"></a>
+<span class="sourceLineNo">3983</span>    Put put = new Put(row);<a name="line.3983"></a>
+<span class="sourceLineNo">3984</span>    put.setDurability(Durability.SKIP_WAL);<a name="line.3984"></a>
+<span class="sourceLineNo">3985</span>    for (long idx = 1; idx &lt;= 4; idx++) {<a name="line.3985"></a>
+<span class="sourceLineNo">3986</span>      put.addColumn(FAMILY, column, idx, Bytes.toBytes("value-version-" + idx));<a name="line.3986"></a>
+<span class="sourceLineNo">3987</span>    }<a name="line.3987"></a>
+<span class="sourceLineNo">3988</span>    region.put(put);<a name="line.3988"></a>
+<span class="sourceLineNo">3989</span><a name="line.3989"></a>
+<span class="sourceLineNo">3990</span>    // Flush<a name="line.3990"></a>
+<span class="sourceLineNo">3991</span>    region.flush(true);<a name="line.3991"></a>
+<span class="sourceLineNo">3992</span><a name="line.3992"></a>
+<span class="sourceLineNo">3993</span>    // Get rows<a name="line.3993"></a>
+<span class="sourceLineNo">3994</span>    Get get = new Get(row);<a name="line.3994"></a>
+<span class="sourceLineNo">3995</span>    get.readAllVersions();<a name="line.3995"></a>
+<span class="sourceLineNo">3996</span>    Cell[] kvs = region.get(get).rawCells();<a name="line.3996"></a>
+<span class="sourceLineNo">3997</span><a name="line.3997"></a>
+<span class="sourceLineNo">3998</span>    // Check if rows are correct<a name="line.3998"></a>
+<span class="sourceLineNo">3999</span>    assertEquals(4, kvs.length);<a name="line.3999"></a>
+<span class="sourceLineNo">4000</span>    checkOneCell(kvs[0], FAMILY, 0, 0, 4);<a name="line.4000"></a>
+<span class="sourceLineNo">4001</span>    checkOneCell(kvs[1], FAMILY, 0, 0, 3);<a name="line.4001"></a>
+<span class="sourceLineNo">4002</span>    checkOneCell(kvs[2], FAMILY, 0, 0, 2);<a name="line.4002"></a>
+<span class="sourceLineNo">4003</span>    checkOneCell(kvs[3], FAMILY, 0, 0, 1);<a name="line.4003"></a>
+<span class="sourceLineNo">4004</span>  }<a name="line.4004"></a>
+<span class="sourceLineNo">4005</span><a name="line.4005"></a>
+<span class="sourceLineNo">4006</span>  /**<a name="line.4006"></a>
+<span class="sourceLineNo">4007</span>   * Testcase to cover bug-fix for HBASE-2823 Ensures correct delete when<a name="line.4007"></a>
+<span class="sourceLineNo">4008</span>   * issuing delete row on columns with bloom filter set to row+col<a name="line.4008"></a>
+<span class="sourceLineNo">4009</span>   * (BloomType.ROWCOL)<a name="line.4009"></a>
+<span class="sourceLineNo">4010</span>   */<a name="line.4010"></a>
+<span class="sourceLineNo">4011</span>  @Test<a name="line.4011"></a>
+<span class="sourceLineNo">4012</span>  public void testDeleteRowWithBloomFilter() throws IOException {<a name="line.4012"></a>
+<span class="sourceLineNo">4013</span>    byte[] familyName = Bytes.toBytes("familyName");<a name="line.4013"></a>
+<span class="sourceLineNo">4014</span><a name="line.4014"></a>
+<span class="sourceLineNo">4015</span>    // Create Table<a name="line.4015"></a>
+<span class="sourceLineNo">4016</span>    HColumnDescriptor hcd = new HColumnDescriptor(familyName).setMaxVersions(Integer.MAX_VALUE)<a name="line.4016"></a>
+<span class="sourceLineNo">4017</span>        .setBloomFilterType(BloomType.ROWCOL);<a name="line.4017"></a>
+<span class="sourceLineNo">4018</span><a name="line.4018"></a>
+<span class="sourceLineNo">4019</span>    HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.4019"></a>
+<span class="sourceLineNo">4020</span>    htd.addFamily(hcd);<a name="line.4020"></a>
+<span class="sourceLineNo">4021</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.4021"></a>
+<span class="sourceLineNo">4022</span>    this.region = TEST_UTIL.createLocalHRegion(info, htd);<a name="line.4022"></a>
+<span class="sourceLineNo">4023</span>    // Insert some data<a name="line.4023"></a>
+<span class="sourceLineNo">4024</span>    byte[] row = Bytes.toBytes("row1");<a name="line.4024"></a>
+<span class="sourceLineNo">4025</span>    byte[] col = Bytes.toBytes("col1");<a name="line.4025"></a>
+<span class="sourceLineNo">4026</span><a name="line.4026"></a>
+<span class="sourceLineNo">4027</span>    Put put = new Put(row);<a name="line.4027"></a>
+<span class="sourceLineNo">4028</span>    put.addColumn(familyName, col, 1, Bytes.toBytes("SomeRandomValue"));<a name="line.4028"></a>
+<span class="sourceLineNo">4029</span>    region.put(put);<a name="line.4029"></a>
+<span class="sourceLineNo">4030</span>    region.flush(true);<a name="line.4030"></a>
+<span class="sourceLineNo">4031</span><a name="line.4031"></a>
+<span class="sourceLineNo">4032</span>    Delete del = new Delete(row);<a name="line.4032"></a>
+<span class="sourceLineNo">4033</span>    region.delete(del);<a name="line.4033"></a>
+<span class="sourceLineNo">4034</span>    region.flush(true);<a name="line.4034"></a>
+<span class="sourceLineNo">4035</span><a name="line.4035"></a>
+<span class="sourceLineNo">4036</span>    // Get remaining rows (should have none)<a name="line.4036"></a>
+<span class="sourceLineNo">4037</span>    Get get = new Get(row);<a name="line.4037"></a>
+<span class="sourceLineNo">4038</span>    get.addColumn(familyName, col);<a name="line.4038"></a>
+<span class="sourceLineNo">4039</span><a name="line.4039"></a>
+<span class="sourceLineNo">4040</span>    Cell[] keyValues = region.get(get).rawCells();<a name="line.4040"></a>
+<span class="sourceLineNo">4041</span>    assertEquals(0, keyValues.length);<a name="line.4041"></a>
+<span class="sourceLineNo">4042</span>  }<a name="line.4042"></a>
+<span class="sourceLineNo">4043</span><a name="line.4043"></a>
+<span class="sourceLineNo">4044</span>  @Test<a name="line.4044"></a>
+<span class="sourceLineNo">4045</span>  public void testgetHDFSBlocksDistribution() throws Exception {<a name="line.4045"></a>
+<span class="sourceLineNo">4046</span>    HBaseTestingUtility htu = new HBaseTestingUtility();<a name="line.4046"></a>
+<span class="sourceLineNo">4047</span>    // Why do we set the block size in this test?  If we set it smaller than the kvs, then we'll<a name="line.4047"></a>
+<span class="sourceLineNo">4048</span>    // break up the file in to more pieces that can be distributed across the three nodes and we<a name="line.4048"></a>
+<span class="sourceLineNo">4049</span>    // won't be able to have the condition this test asserts; that at least one node has<a name="line.4049"></a>
+<span class="sourceLineNo">4050</span>    // a copy of all replicas -- if small block size, then blocks are spread evenly across the<a name="line.4050"></a>
+<span class="sourceLineNo">4051</span>    // the three nodes.  hfilev3 with tags seems to put us over the block size.  St.Ack.<a name="line.4051"></a>
+<span class="sourceLineNo">4052</span>    // final int DEFAULT_BLOCK_SIZE = 1024;<a name="line.4052"></a>
+<span class="sourceLineNo">4053</span>    // htu.getConfiguration().setLong("dfs.blocksize", DEFAULT_BLOCK_SIZE);<a name="line.4053"></a>
+<span class="sourceLineNo">4054</span>    htu.getConfiguration().setInt("dfs.replication", 2);<a name="line.4054"></a>
+<span class="sourceLineNo">4055</span><a name="line.4055"></a>
+<span class="sourceLineNo">4056</span>    // set up a cluster with 3 nodes<a name="line.4056"></a>
+<span class="sourceLineNo">4057</span>    MiniHBaseCluster cluster = null;<a name="line.4057"></a>
+<span class="sourceLineNo">4058</span>    String dataNodeHosts[] = new String[] { "host1", "host2", "host3" };<a name="line.4058"></a>
+<span class="sourceLineNo">4059</span>    int regionServersCount = 3;<a name="line.4059"></a>
+<span class="sourceLineNo">4060</span><a name="line.4060"></a>
+<span class="sourceLineNo">4061</span>    try {<a name="line.4061"></a>
+<span class="sourceLineNo">4062</span>      StartMiniClusterOption option = StartMiniClusterOption.builder()<a name="line.4062"></a>
+<span class="sourceLineNo">4063</span>          .numRegionServers(regionServersCount).dataNodeHosts(dataNodeHosts).build();<a name="line.4063"></a>
+<span class="sourceLineNo">4064</span>      cluster = htu.startMiniCluster(option);<a name="line.4064"></a>
+<span class="sourceLineNo">4065</span>      byte[][] families = { fam1, fam2 };<a name="line.4065"></a>
+<span class="sourceLineNo">4066</span>      Table ht = htu.createTable(tableName, families);<a name="line.4066"></a>
+<span class="sourceLineNo">4067</span><a name="line.4067"></a>
+<span class="sourceLineNo">4068</span>      // Setting up region<a name="line.4068"></a>
+<span class="sourceLineNo">4069</span>      byte row[] = Bytes.toBytes("row1");<a name="line.4069"></a>
+<span class="sourceLineNo">4070</span>      byte col[] = Bytes.toBytes("col1");<a name="line.4070"></a>
+<span class="sourceLineNo">4071</span><a name="line.4071"></a>
+<span class="sourceLineNo">4072</span>      Put put = new Put(row);<a name="line.4072"></a>
+<span class="sourceLineNo">4073</span>      put.addColumn(fam1, col, 1, Bytes.toBytes("test1"));<a name="line.4073"></a>
+<span class="sourceLineNo">4074</span>      put.addColumn(fam2, col, 1, Bytes.toBytes("test2"));<a name="line.4074"></a>
+<span class="sourceLineNo">4075</span>      ht.put(put);<a name="line.4075"></a>
+<span class="sourceLineNo">4076</span><a name="line.4076"></a>
+<span class="sourceLineNo">4077</span>      HRegion firstRegion = htu.getHBaseCluster().getRegions(tableName).get(0);<a name="line.4077"></a>
+<span class="sourceLineNo">4078</span>      firstRegion.flush(true);<a name="line.4078"></a>
+<span class="sourceLineNo">4079</span>      HDFSBlocksDistribution blocksDistribution1 = firstRegion.getHDFSBlocksDistribution();<a name="line.4079"></a>
+<span class="sourceLineNo">4080</span><a name="line.4080"></a>
+<span class="sourceLineNo">4081</span>      // Given the default replication factor is 2 and we have 2 HFiles,<a name="line.4081"></a>
+<span class="sourceLineNo">4082</span>      // we will have total of 4 replica of blocks on 3 datanodes; thus there<a name="line.4082"></a>
+<span class="sourceLineNo">4083</span>      // must be at least one host that have replica for 2 HFiles. That host's<a name="line.4083"></a>
+<span class="sourceLineNo">4084</span>      // weight will be equal to the unique block weight.<a name="line.4084"></a>
+<span class="sourceLineNo">4085</span>      long uniqueBlocksWeight1 = blocksDistribution1.getUniqueBlocksTotalWeight();<a name="line.4085"></a>
+<span class="sourceLineNo">4086</span>      StringBuilder sb = new StringBuilder();<a name="line.4086"></a>
+<span class="sourceLineNo">4087</span>      for (String host: blocksDistribution1.getTopHosts()) {<a name="line.4087"></a>
+<span class="sourceLineNo">4088</span>        if (sb.length() &gt; 0) sb.append(", ");<a name="line.4088"></a>
+<span class="sourceLineNo">4089</span>        sb.append(host);<a name="line.4089"></a>
+<span class="sourceLineNo">4090</span>        sb.append("=");<a name="line.4090"></a>
+<span class="sourceLineNo">4091</span>        sb.append(blocksDistribution1.getWeight(host));<a name="line.4091"></a>
+<span class="sourceLineNo">4092</span>      }<a name="line.4092"></a>
+<span class="sourceLineNo">4093</span><a name="line.4093"></a>
+<span class="sourceLineNo">4094</span>      String topHost = blocksDistribution1.getTopHosts().get(0);<a name="line.4094"></a>
+<span class="sourceLineNo">4095</span>      long topHostWeight = blocksDistribution1.getWeight(topHost);<a name="line.4095"></a>
+<span class="sourceLineNo">4096</span>      String msg = "uniqueBlocksWeight=" + uniqueBlocksWeight1 + ", topHostWeight=" +<a name="line.4096"></a>
+<span class="sourceLineNo">4097</span>        topHostWeight + ", topHost=" + topHost + "; " + sb.toString();<a name="line.4097"></a>
+<span class="sourceLineNo">4098</span>      LOG.info(msg);<a name="line.4098"></a>
+<span class="sourceLineNo">4099</span>      assertTrue(msg, uniqueBlocksWeight1 == topHostWeight);<a name="line.4099"></a>
+<span class="sourceLineNo">4100</span><a name="line.4100"></a>
+<span class="sourceLineNo">4101</span>      // use the static method to compute the value, it should be the same.<a name="line.4101"></a>
+<span class="sourceLineNo">4102</span>      // static method is used by load balancer or other components<a name="line.4102"></a>
+<span class="sourceLineNo">4103</span>      HDFSBlocksDistribution blocksDistribution2 = HRegion.computeHDFSBlocksDistribution(<a name="line.4103"></a>
+<span class="sourceLineNo">4104</span>          htu.getConfiguration(), firstRegion.getTableDescriptor(), firstRegion.getRegionInfo());<a name="line.4104"></a>
+<span class="sourceLineNo">4105</span>      long uniqueBlocksWeight2 = blocksDistribution2.getUniqueBlocksTotalWeight();<a name="line.4105"></a>
 <span class="sourceLineNo">4106</span><a name="line.4106"></a>
-<span class="sourceLineNo">4107</span>  /**<a name="line.4107"></a>
-<span class="sourceLineNo">4108</span>   * Testcase to check state of region initialization task set to ABORTED or not<a name="line.4108"></a>
-<span class="sourceLineNo">4109</span>   * if any exceptions during initialization<a name="line.4109"></a>
-<span class="sourceLineNo">4110</span>   *<a name="line.4110"></a>
-<span class="sourceLineNo">4111</span>   * @throws Exception<a name="line.4111"></a>
-<span class="sourceLineNo">4112</span>   */<a name="line.4112"></a>
-<span class="sourceLineNo">4113</span>  @Test<a name="line.4113"></a>
-<span class="sourceLineNo">4114</span>  public void testStatusSettingToAbortIfAnyExceptionDuringRegionInitilization() throws Exception {<a name="line.4114"></a>
-<span class="sourceLineNo">4115</span>    HRegionInfo info;<a name="line.4115"></a>
-<span class="sourceLineNo">4116</span>    try {<a name="line.4116"></a>
-<span class="sourceLineNo">4117</span>      FileSystem fs = Mockito.mock(FileSystem.class);<a name="line.4117"></a>
-<span class="sourceLineNo">4118</span>      Mockito.when(fs.exists((Path) Mockito.anyObject())).thenThrow(new IOException());<a name="line.4118"></a>
-<span class="sourceLineNo">4119</span>      HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.4119"></a>
-<span class="sourceLineNo">4120</span>      htd.addFamily(new HColumnDescriptor("cf"));<a name="line.4120"></a>
-<span class="sourceLineNo">4121</span>      info = new HRegionInfo(htd.getTableName(), HConstants.EMPTY_BYTE_ARRAY,<a name="line.4121"></a>
-<span class="sourceLineNo">4122</span>          HConstants.EMPTY_BYTE_ARRAY, false);<a name="line.4122"></a>
-<span class="sourceLineNo">4123</span>      Path path = new Path(dir + "testStatusSettingToAbortIfAnyExceptionDuringRegionInitilization");<a name="line.4123"></a>
-<span class="sourceLineNo">4124</span>      region = HRegion.newHRegion(path, null, fs, CONF, info, htd, null);<a name="line.4124"></a>
-<span class="sourceLineNo">4125</span>      // region initialization throws IOException and set task state to ABORTED.<a name="line.4125"></a>
-<span class="sourceLineNo">4126</span>      region.initialize();<a name="line.4126"></a>
-<span class="sourceLineNo">4127</span>      fail("Region initialization should fail due to IOException");<a name="line.4127"></a>
-<span class="sourceLineNo">4128</span>    } catch (IOException io) {<a name="line.4128"></a>
-<span class="sourceLineNo">4129</span>      List&lt;MonitoredTask&gt; tasks = TaskMonitor.get().getTasks();<a name="line.4129"></a>
-<span class="sourceLineNo">4130</span>      for (MonitoredTask monitoredTask : tasks) {<a name="line.4130"></a>
-<span class="sourceLineNo">4131</span>        if (!(monitoredTask instanceof MonitoredRPCHandler)<a name="line.4131"></a>
-<span class="sourceLineNo">4132</span>            &amp;&amp; monitoredTask.getDescription().contains(region.toString())) {<a name="line.4132"></a>
-<span class="sourceLineNo">4133</span>          assertTrue("Region state should be ABORTED.",<a name="line.4133"></a>
-<span class="sourceLineNo">4134</span>              monitoredTask.getState().equals(MonitoredTask.State.ABORTED));<a name="line.4134"></a>
-<span class="sourceLineNo">4135</span>          break;<a name="line.4135"></a>
-<span class="sourceLineNo">4136</span>        }<a name="line.4136"></a>
-<span class="sourceLineNo">4137</span>      }<a name="line.4137"></a>
-<span class="sourceLineNo">4138</span>    }<a name="line.4138"></a>
-<span class="sourceLineNo">4139</span>  }<a name="line.4139"></a>
-<span class="sourceLineNo">4140</span><a name="line.4140"></a>
-<span class="sourceLineNo">4141</span>  /**<a name="line.4141"></a>
-<span class="sourceLineNo">4142</span>   * Verifies that the .regioninfo file is written on region creation and that<a name="line.4142"></a>
-<span class="sourceLineNo">4143</span>   * is recreated if missing during region opening.<a name="line.4143"></a>
-<span class="sourceLineNo">4144</span>   */<a name="line.4144"></a>
-<span class="sourceLineNo">4145</span>  @Test<a name="line.4145"></a>
-<span class="sourceLineNo">4146</span>  public void testRegionInfoFileCreation() throws IOException {<a name="line.4146"></a>
-<span class="sourceLineNo">4147</span>    Path rootDir = new Path(dir + "testRegionInfoFileCreation");<a name="line.4147"></a>
-<span class="sourceLineNo">4148</span><a name="line.4148"></a>
-<span class="sourceLineNo">4149</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.4149"></a>
-<span class="sourceLineNo">4150</span>    htd.addFamily(new HColumnDescriptor("cf"));<a name="line.4150"></a>
-<span class="sourceLineNo">4151</span><a name="line.4151"></a>
-<span class="sourceLineNo">4152</span>    HRegionInfo hri = new HRegionInfo(htd.getTableName());<a name="line.4152"></a>
-<span class="sourceLineNo">4153</span><a name="line.4153"></a>
-<span class="sourceLineNo">4154</span>    // Create a region and skip the initialization (like CreateTableHandler)<a name="line.4154"></a>
-<span class="sourceLineNo">4155</span>    region = HBaseTestingUtility.createRegionAndWAL(hri, rootDir, CONF, htd, false);<a name="line.4155"></a>
-<span class="sourceLineNo">4156</span>    Path regionDir = region.getRegionFileSystem().getRegionDir();<a name="line.4156"></a>
-<span class="sourceLineNo">4157</span>    FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.4157"></a>
-<span class="sourceLineNo">4158</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.4158"></a>
-<span class="sourceLineNo">4159</span><a name="line.4159"></a>
-<span class="sourceLineNo">4160</span>    Path regionInfoFile = new Path(regionDir, HRegionFileSystem.REGION_INFO_FILE);<a name="line.4160"></a>
+<span class="sourceLineNo">4107</span>      assertTrue(uniqueBlocksWeight1 == uniqueBlocksWeight2);<a name="line.4107"></a>
+<span class="sourceLineNo">4108</span><a name="line.4108"></a>
+<span class="sourceLineNo">4109</span>      ht.close();<a name="line.4109"></a>
+<span class="sourceLineNo">4110</span>    } finally {<a name="line.4110"></a>
+<span class="sourceLineNo">4111</span>      if (cluster != null) {<a name="line.4111"></a>
+<span class="sourceLineNo">4112</span>        htu.shutdownMiniCluster();<a name="line.4112"></a>
+<span class="sourceLineNo">4113</span>      }<a name="line.4113"></a>
+<span class="sourceLineNo">4114</span>    }<a name="line.4114"></a>
+<span class="sourceLineNo">4115</span>  }<a name="line.4115"></a>
+<span class="sourceLineNo">4116</span><a name="line.4116"></a>
+<span class="sourceLineNo">4117</span>  /**<a name="line.4117"></a>
+<span class="sourceLineNo">4118</span>   * Testcase to check state of region initialization task set to ABORTED or not<a name="line.4118"></a>
+<span class="sourceLineNo">4119</span>   * if any exceptions during initialization<a name="line.4119"></a>
+<span class="sourceLineNo">4120</span>   *<a name="line.4120"></a>
+<span class="sourceLineNo">4121</span>   * @throws Exception<a name="line.4121"></a>
+<span class="sourceLineNo">4122</span>   */<a name="line.4122"></a>
+<span class="sourceLineNo">4123</span>  @Test<a name="line.4123"></a>
+<span class="sourceLineNo">4124</span>  public void testStatusSettingToAbortIfAnyExceptionDuringRegionInitilization() throws Exception {<a name="line.4124"></a>
+<span class="sourceLineNo">4125</span>    HRegionInfo info;<a name="line.4125"></a>
+<span class="sourceLineNo">4126</span>    try {<a name="line.4126"></a>
+<span class="sourceLineNo">4127</span>      FileSystem fs = Mockito.mock(FileSystem.class);<a name="line.4127"></a>
+<span class="sourceLineNo">4128</span>      Mockito.when(fs.exists((Path) Mockito.anyObject())).thenThrow(new IOException());<a name="line.4128"></a>
+<span class="sourceLineNo">4129</span>      HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.4129"></a>
+<span class="sourceLineNo">4130</span>      htd.addFamily(new HColumnDescriptor("cf"));<a name="line.4130"></a>
+<span class="sourceLineNo">4131</span>      info = new HRegionInfo(htd.getTableName(), HConstants.EMPTY_BYTE_ARRAY,<a name="line.4131"></a>
+<span class="sourceLineNo">4132</span>          HConstants.EMPTY_BYTE_ARRAY, false);<a name="line.4132"></a>
+<span class="sourceLineNo">4133</span>      Path path = new Path(dir + "testStatusSettingToAbortIfAnyExceptionDuringRegionInitilization");<a name="line.4133"></a>
+<span class="sourceLineNo">4134</span>      region = HRegion.newHRegion(path, null, fs, CONF, info, htd, null);<a name="line.4134"></a>
+<span class="sourceLineNo">4135</span>      // region initialization throws IOException and set task state to ABORTED.<a name="line.4135"></a>
+<span class="sourceLineNo">4136</span>      region.initialize();<a name="line.4136"></a>
+<span class="sourceLineNo">4137</span>      fail("Region initialization should fail due to IOException");<a name="line.4137"></a>
+<span class="sourceLineNo">4138</span>    } catch (IOException io) {<a name="line.4138"></a>
+<span class="sourceLineNo">4139</span>      List&lt;MonitoredTask&gt; tasks = TaskMonitor.get().getTasks();<a name="line.4139"></a>
+<span class="sourceLineNo">4140</span>      for (MonitoredTask monitoredTask : tasks) {<a name="line.4140"></a>
+<span class="sourceLineNo">4141</span>        if (!(monitoredTask instanceof MonitoredRPCHandler)<a name="line.4141"></a>
+<span class="sourceLineNo">4142</span>            &amp;&amp; monitoredTask.getDescription().contains(region.toString())) {<a name="line.4142"></a>
+<span class="sourceLineNo">4143</span>          assertTrue("Region state should be ABORTED.",<a name="line.4143"></a>
+<span class="sourceLineNo">4144</span>              monitoredTask.getState().equals(MonitoredTask.State.ABORTED));<a name="line.4144"></a>
+<span class="sourceLineNo">4145</span>          break;<a name="line.4145"></a>
+<span class="sourceLineNo">4146</span>        }<a name="line.4146"></a>
+<span class="sourceLineNo">4147</span>      }<a name="line.4147"></a>
+<span class="sourceLineNo">4148</span>    }<a name="line.4148"></a>
+<span class="sourceLineNo">4149</span>  }<a name="line.4149"></a>
+<span class="sourceLineNo">4150</span><a name="line.4150"></a>
+<span class="sourceLineNo">4151</span>  /**<a name="line.4151"></a>
+<span class="sourceLineNo">4152</span>   * Verifies that the .regioninfo file is written on region creation and that<a name="line.4152"></a>
+<span class="sourceLineNo">4153</span>   * is recreated if missing during region opening.<a name="line.4153"></a>
+<span class="sourceLineNo">4154</span>   */<a name="line.4154"></a>
+<span class="sourceLineNo">4155</span>  @Test<a name="line.4155"></a>
+<span class="sourceLineNo">4156</span>  public void testRegionInfoFileCreation() throws IOException {<a name="line.4156"></a>
+<span class="sourceLineNo">4157</span>    Path rootDir = new Path(dir + "testRegionInfoFileCreation");<a name="line.4157"></a>
+<span class="sourceLineNo">4158</span><a name="line.4158"></a>
+<span class="sourceLineNo">4159</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.4159"></a>
+<span class="sourceLineNo">4160</span>    htd.addFamily(new HColumnDescriptor("cf"));<a name="line.4160"></a>
 <span class="sourceLineNo">4161</span><a name="line.4161"></a>
-<span class="sourceLineNo">4162</span>    // Verify that the .regioninfo file is present<a name="line.4162"></a>
-<span class="sourceLineNo">4163</span>    assertTrue(HRegionFileSystem.REGION_INFO_FILE + " should be present in the region dir",<a name="line.4163"></a>
-<span class="sourceLineNo">4164</span>        fs.exists(regionInfoFile));<a name="line.4164"></a>
-<span class="sourceLineNo">4165</span><a name="line.4165"></a>
-<span class="sourceLineNo">4166</span>    // Try to open the region<a name="line.4166"></a>
-<span class="sourceLineNo">4167</span>    region = HRegion.openHRegion(rootDir, hri, htd, null, CONF);<a name="line.4167"></a>
-<span class="sourceLineNo">4168</span>    assertEquals(regionDir, region.getRegionFileSystem().getRegionDir());<a name="line.4168"></a>
-<span class="sourceLineNo">4169</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.4169"></a>
-<span class="sourceLineNo">4170</span><a name="line.4170"></a>
-<span class="sourceLineNo">4171</span>    // Verify that the .regioninfo file is still there<a name="line.4171"></a>
-<span class="sourceLineNo">4172</span>    assertTrue(HRegionFileSystem.REGION_INFO_FILE + " should be present in the region dir",<a name="line.4172"></a>
-<span class="sourceLineNo">4173</span>        fs.exists(regionInfoFile));<a name="line.4173"></a>
-<span class="sourceLineNo">4174</span><a name="line.4174"></a>
-<span class="sourceLineNo">4175</span>    // Remove the .regioninfo file and verify is recreated on region open<a name="line.4175"></a>
-<span class="sourceLineNo">4176</span>    fs.delete(regionInfoFile, true);<a name="line.4176"></a>
-<span class="sourceLineNo">4177</span>    assertFalse(HRegionFileSystem.REGION_INFO_FILE + " should be removed from the region dir",<a name="line.4177"></a>
-<span class="sourceLineNo">4178</span>        fs.exists(regionInfoFile));<a name="line.4178"></a>
-<span class="sourceLineNo">4179</span><a name="line.4179"></a>
-<span class="sourceLineNo">4180</span>    region = HRegion.openHRegion(rootDir, hri, htd, null, CONF);<a name="line.4180"></a>
-<span class="sourceLineNo">4181</span>//    region = TEST_UTIL.openHRegion(hri, htd);<a name="line.4181"></a>
-<span class="sourceLineNo">4182</span>    assertEquals(regionDir, region.getRegionFileSystem().getRegionDir());<a name="line.4182"></a>
-<span class="sourceLineNo">4183</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.4183"></a>
+<span class="sourceLineNo">4162</span>    HRegionInfo hri = new HRegionInfo(htd.getTableName());<a name="line.4162"></a>
+<span class="sourceLineNo">4163</span><a name="line.4163"></a>
+<span class="sourceLineNo">4164</span>    // Create a region and skip the initialization (like CreateTableHandler)<a name="line.4164"></a>
+<span class="sourceLineNo">4165</span>    region = HBaseTestingUtility.createRegionAndWAL(hri, rootDir, CONF, htd, false);<a name="line.4165"></a>
+<span class="sourceLineNo">4166</span>    Path regionDir = region.getRegionFileSystem().getRegionDir();<a name="line.4166"></a>
+<span class="sourceLineNo">4167</span>    FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.4167"></a>
+<span class="sourceLineNo">4168</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.4168"></a>
+<span class="sourceLineNo">4169</span><a name="line.4169"></a>
+<span class="sourceLineNo">4170</span>    Path regionInfoFile = new Path(regionDir, HRegionFileSystem.REGION_INFO_FILE);<a name="line.4170"></a>
+<span class="sourceLineNo">4171</span><a name="line.4171"></a>
+<span class="sourceLineNo">4172</span>    // Verify that the .regioninfo file is present<a name="line.4172"></a>
+<span class="sourceLineNo">4173</span>    assertTrue(HRegionFileSystem.REGION_INFO_FILE + " should be present in the region dir",<a name="line.4173"></a>
+<span class="sourceLineNo">4174</span>        fs.exists(regionInfoFile));<a name="line.4174"></a>
+<span class="sourceLineNo">4175</span><a name="line.4175"></a>
+<span class="sourceLineNo">4176</span>    // Try to open the region<a name="line.4176"></a>
+<span class="sourceLineNo">4177</span>    region = HRegion.openHRegion(rootDir, hri, htd, null, CONF);<a name="line.4177"></a>
+<span class="sourceLineNo">4178</span>    assertEquals(regionDir, region.getRegionFileSystem().getRegionDir());<a name="line.4178"></a>
+<span class="sourceLineNo">4179</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.4179"></a>
+<span class="sourceLineNo">4180</span><a name="line.4180"></a>
+<span class="sourceLineNo">4181</span>    // Verify that the .regioninfo file is still there<a name="line.4181"></a>
+<span class="sourceLineNo">4182</span>    assertTrue(HRegionFileSystem.REGION_INFO_FILE + " should be present in the region dir",<a name="line.4182"></a>
+<span class="sourceLineNo">4183</span>        fs.exists(regionInfoFile));<a name="line.4183"></a>
 <span class="sourceLineNo">4184</span><a name="line.4184"></a>
-<span class="sourceLineNo">4185</span>    // Verify that the .regioninfo file is still there<a name="line.4185"></a>
-<span class="sourceLineNo">4186</span>    assertTrue(HRegionFileSystem.REGION_INFO_FILE + " should be present in the region dir",<a name="line.4186"></a>
-<span class="sourceLineNo">4187</span>        fs.exists(new Path(regionDir, HRegionFileSystem.REGION_INFO_FILE)));<a name="line.4187"></a>
-<span class="sourceLineNo">4188</span><a name="line.4188"></a>
-<span class="sourceLineNo">4189</span>    region = null;<a name="line.4189"></a>
-<span class="sourceLineNo">4190</span>  }<a name="line.4190"></a>
-<span class="sourceLineNo">4191</span><a name="line.4191"></a>
-<span class="sourceLineNo">4192</span>  /**<a name="line.4192"></a>
-<span class="sourceLineNo">4193</span>   * TestCase for increment<a name="line.4193"></a>
-<span class="sourceLineNo">4194</span>   */<a name="line.4194"></a>
-<span class="sourceLineNo">4195</span>  private static class Incrementer implements Runnable {<a name="line.4195"></a>
-<span class="sourceLineNo">4196</span>    private HRegion region;<a name="line.4196"></a>
-<span class="sourceLineNo">4197</span>    private final static byte[] incRow = Bytes.toBytes("incRow");<a name="line.4197"></a>
-<span class="sourceLineNo">4198</span>    private final static byte[] family = Bytes.toBytes("family");<a name="line.4198"></a>
-<span class="sourceLineNo">4199</span>    private final static byte[] qualifier = Bytes.toBytes("qualifier");<a name="line.4199"></a>
-<span class="sourceLineNo">4200</span>    private final static long ONE = 1L;<a name="line.4200"></a>
-<span class="sourceLineNo">4201</span>    private int incCounter;<a name="line.4201"></a>
-<span class="sourceLineNo">4202</span><a name="line.4202"></a>
-<span class="sourceLineNo">4203</span>    public Incrementer(HRegion region, int incCounter) {<a name="line.4203"></a>
-<span class="sourceLineNo">4204</span>      this.region = region;<a name="line.4204"></a>
-<span class="sourceLineNo">4205</span>      this.incCounter = incCounter;<a name="line.4205"></a>
-<span class="sourceLineNo">4206</span>    }<a name="line.4206"></a>
-<span class="sourceLineNo">4207</span><a name="line.4207"></a>
-<span class="sourceLineNo">4208</span>    @Override<a name="line.4208"></a>
-<span class="sourceLineNo">4209</span>    public void run() {<a name="line.4209"></a>
-<span class="sourceLineNo">4210</span>      int count = 0;<a name="line.4210"></a>
-<span class="sourceLineNo">4211</span>      while (count &lt; incCounter) {<a name="line.4211"></a>
-<span class="sourceLineNo">4212</span>        Increment inc = new Increment(incRow);<a name="line.4212"></a>
-<span class="sourceLineNo">4213</span>        inc.addColumn(family, qualifier, ONE);<a name="line.4213"></a>
-<span class="sourceLineNo">4214</span>        count++;<a name="line.4214"></a>
-<span class="sourceLineNo">4215</span>        try {<a name="line.4215"></a>
-<span class="sourceLineNo">4216</span>          region.increment(inc);<a name="line.4216"></a>
-<span class="sourceLineNo">4217</span>        } catch (IOException e) {<a name="line.4217"></a>
-<span class="sourceLineNo">4218</span>          LOG.info("Count=" + count + ", " + e);<a name="line.4218"></a>
-<span class="sourceLineNo">4219</span>          break;<a name="line.4219"></a>
-<span class="sourceLineNo">4220</span>        }<a name="line.4220"></a>
-<span class="sourceLineNo">4221</span>      }<a name="line.4221"></a>
-<span class="sourceLineNo">4222</span>    }<a name="line.4222"></a>
-<span class="sourceLineNo">4223</span>  }<a name="line.4223"></a>
-<span class="sourceLineNo">4224</span><a name="line.4224"></a>
-<span class="sourceLineNo">4225</span>  /**<a name="line.4225"></a>
-<span class="sourceLineNo">4226</span>   * Test case to check increment function with memstore flushing<a name="line.4226"></a>
-<span class="sourceLineNo">4227</span>   * @throws Exception<a name="line.4227"></a>
-<span class="sourceLineNo">4228</span>   */<a name="line.4228"></a>
-<span class="sourceLineNo">4229</span>  @Test<a name="line.4229"></a>
-<span class="sourceLineNo">4230</span>  public void testParallelIncrementWithMemStoreFlush() throws Exception {<a name="line.4230"></a>
-<span class="sourceLineNo">4231</span>    byte[] family = Incrementer.family;<a name="line.4231"></a>
-<span class="sourceLineNo">4232</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.4232"></a>
-<span class="sourceLineNo">4233</span>    final HRegion region = this.region;<a name="line.4233"></a>
-<span class="sourceLineNo">4234</span>    final AtomicBoolean incrementDone = new AtomicBoolean(false);<a name="line.4234"></a>
-<span class="sourceLineNo">4235</span>    Runnable flusher = new Runnable() {<a name="line.4235"></a>
-<span class="sourceLineNo">4236</span>      @Override<a name="line.4236"></a>
-<span class="sourceLineNo">4237</span>      public void run() {<a name="line.4237"></a>
-<span class="sourceLineNo">4238</span>        while (!incrementDone.get()) {<a name="line.4238"></a>
-<span class="sourceLineNo">4239</span>          try {<a name="line.4239"></a>
-<span class="sourceLineNo">4240</span>            region.flush(true);<a name="line.4240"></a>
-<span class="sourceLineNo">4241</span>          } catch (Exception e) {<a name="line.4241"></a>
-<span class="sourceLineNo">4242</span>            e.printStackTrace();<a name="line.4242"></a>
-<span class="sourceLineNo">4243</span>          }<a name="line.4243"></a>
-<span class="sourceLineNo">4244</span>        }<a name="line.4244"></a>
-<span class="sourceLineNo">4245</span>      }<a name="line.4245"></a>
-<span class="sourceLineNo">4246</span>    };<a name="line.4246"></a>
-<span class="sourceLineNo">4247</span><a name="line.4247"></a>
-<span class="sourceLineNo">4248</span>    // after all increment finished, the row will increment to 20*100 = 2000<a name="line.4248"></a>
-<span class="sourceLineNo">4249</span>    int threadNum = 20;<a name="line.4249"></a>
-<span class="sourceLineNo">4250</span>    int incCounter = 100;<a name="line.4250"></a>
-<span class="sourceLineNo">4251</span>    long expected = (long) threadNum * incCounter;<a name="line.4251"></a>
-<span class="sourceLineNo">4252</span>    Thread[] incrementers = new Thread[threadNum];<a name="line.4252"></a>
-<span class="sourceLineNo">4253</span>    Thread flushThread = new Thread(flusher);<a name="line.4253"></a>
-<span class="sourceLineNo">4254</span>    for (int i = 0; i &lt; threadNum; i++) {<a name="line.4254"></a>
-<span class="sourceLineNo">4255</span>      incrementers[i] = new Thread(new Incrementer(this.region, incCounter));<a name="line.4255"></a>
-<span class="sourceLineNo">4256</span>      incrementers[i].start();<a name="line.4256"></a>
-<span class="sourceLineNo">4257</span>    }<a name="line.4257"></a>
-<span class="sourceLineNo">4258</span>    flushThread.start();<a name="line.4258"></a>
-<span class="sourceLineNo">4259</span>    for (int i = 0; i &lt; threadNum; i++) {<a name="line.4259"></a>
-<span class="sourceLineNo">4260</span>      incrementers[i].join();<a name="line.4260"></a>
-<span class="sourceLineNo">4261</span>    }<a name="line.4261"></a>
-<span class="sourceLineNo">4262</span><a name="line.4262"></a>
-<span class="sourceLineNo">4263</span>    incrementDone.set(true);<a name="line.4263"></a>
-<span class="sourceLineNo">4264</span>    flushThread.join();<a name="line.4264"></a>
-<span class="sourceLineNo">4265</span><a name="line.4265"></a>
-<span class="sourceLineNo">4266</span>    Get get = new Get(Incrementer.incRow);<a name="line.4266"></a>
-<span class="sourceLineNo">4267</span>    get.addColumn(Incrementer.family, Incrementer.qualifier);<a name="line.4267"></a>
-<span class="sourceLineNo">4268</span>    get.readVersions(1);<a name="line.4268"></a>
-<span class="sourceLineNo">4269</span>    Result res = this.region.get(get);<a name="line.4269"></a>
-<span class="sourceLineNo">4270</span>    List&lt;Cell&gt; kvs = res.getColumnCells(Incrementer.family, Incrementer.qualifier);<a name="line.4270"></a>
-<span class="sourceLineNo">4271</span><a name="line.4271"></a>
-<span class="sourceLineNo">4272</span>    // we just got the latest version<a name="line.4272"></a>
-<span class="sourceLineNo">4273</span>    assertEquals(1, kvs.size());<a name="line.4273"></a>
-<span class="sourceLineNo">4274</span>    Cell kv = kvs.get(0);<a name="line.4274"></a>
-<span class="sourceLineNo">4275</span>    assertEquals(expected, Bytes.toLong(kv.getValueArray(), kv.getValueOffset()));<a name="line.4275"></a>
-<span class="sourceLineNo">4276</span>  }<a name="line.4276"></a>
-<span class="sourceLineNo">4277</span><a name="line.4277"></a>
-<span class="sourceLineNo">4278</span>  /**<a name="line.4278"></a>
-<span class="sourceLineNo">4279</span>   * TestCase for append<a name="line.4279"></a>
-<span class="sourceLineNo">4280</span>   */<a name="line.4280"></a>
-<span class="sourceLineNo">4281</span>  private static class Appender implements Runnable {<a name="line.4281"></a>
-<span class="sourceLineNo">4282</span>    private HRegion region;<a name="line.4282"></a>
-<span class="sourceLineNo">4283</span>    private final static byte[] appendRow = Bytes.toBytes("appendRow");<a name="line.4283"></a>
-<span class="sourceLineNo">4284</span>    private final static byte[] family = Bytes.toBytes("family");<a name="line.4284"></a>
-<span class="sourceLineNo">4285</span>    private final static byte[] qualifier = Bytes.toBytes("qualifier");<a name="line.4285"></a>
-<span class="sourceLineNo">4286</span>    private final static byte[] CHAR = Bytes.toBytes("a");<a name="line.4286"></a>
-<span class="sourceLineNo">4287</span>    private int appendCounter;<a name="line.4287"></a>
-<span class="sourceLineNo">4288</span><a name="line.4288"></a>
-<span class="sourceLineNo">4289</span>    public Appender(HRegion region, int appendCounter) {<a name="line.4289"></a>
-<span class="sourceLineNo">4290</span>      this.region = region;<a name="line.4290"></a>
-<span class="sourceLineNo">4291</span>      this.appendCounter = appendCounter;<a name="line.4291"></a>
-<span class="sourceLineNo">4292</span>    }<a name="line.4292"></a>
-<span class="sourceLineNo">4293</span><a name="line.4293"></a>
-<span class="sourceLineNo">4294</span>    @Override<a name="line.4294"></a>
-<span class="sourceLineNo">4295</span>    public void run() {<a name="line.4295"></a>
-<span class="sourceLineNo">4296</span>      int count = 0;<a name="line.4296"></a>
-<span class="sourceLineNo">4297</span>      while (count &lt; appendCounter) {<a name="line.4297"></a>
-<span class="sourceLineNo">4298</span>        Append app = new Append(appendRow);<a name="line.4298"></a>
-<span class="sourceLineNo">4299</span>        app.addColumn(family, qualifier, CHAR);<a name="line.4299"></a>
-<span class="sourceLineNo">4300</span>        count++;<a name="line.4300"></a>
-<span class="sourceLineNo">4301</span>        try {<a name="line.4301"></a>
-<span class="sourceLineNo">4302</span>          region.append(app);<a name="line.4302"></a>
-<span class="sourceLineNo">4303</span>        } catch (IOException e) {<a name="line.4303"></a>
-<span class="sourceLineNo">4304</span>          LOG.info("Count=" + count + ", max=" + appendCounter + ", " + e);<a name="line.4304"></a>
-<span class="sourceLineNo">4305</span>          break;<a name="line.4305"></a>
-<span class="sourceLineNo">4306</span>        }<a name="line.4306"></a>
-<span class="sourceLineNo">4307</span>      }<a name="line.4307"></a>
-<span class="sourceLineNo">4308</span>    }<a name="line.4308"></a>
-<span class="sourceLineNo">4309</span>  }<a name="line.4309"></a>
-<span class="sourceLineNo">4310</span><a name="line.4310"></a>
-<span class="sourceLineNo">4311</span>  /**<a name="line.4311"></a>
-<span class="sourceLineNo">4312</span>   * Test case to check append function with memstore flushing<a name="line.4312"></a>
-<span class="sourceLineNo">4313</span>   * @throws Exception<a name="line.4313"></a>
-<span class="sourceLineNo">4314</span>   */<a name="line.4314"></a>
-<span class="sourceLineNo">4315</span>  @Test<a name="line.4315"></a>
-<span class="sourceLineNo">4316</span>  public void testParallelAppendWithMemStoreFlush() throws Exception {<a name="line.4316"></a>
-<span class="sourceLineNo">4317</span>    byte[] family = Appender.family;<a name="line.4317"></a>
-<span class="sourceLineNo">4318</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.4318"></a>
-<span class="sourceLineNo">4319</span>    final HRegion region = this.region;<a name="line.4319"></a>
-<span class="sourceLineNo">4320</span>    final AtomicBoolean appendDone = new AtomicBoolean(false);<a name="line.4320"></a>
-<span class="sourceLineNo">4321</span>    Runnable flusher = new Runnable() {<a name="line.4321"></a>
-<span class="sourceLineNo">4322</span>      @Override<a name="line.4322"></a>
-<span class="sourceLineNo">4323</span>      public void run() {<a name="line.4323"></a>
-<span class="sourceLineNo">4324</span>        while (!appendDone.get()) {<a name="line.4324"></a>
-<span class="sourceLineNo">4325</span>          try {<a name="line.4325"></a>
-<span class="sourceLineNo">4326</span>            region.flush(true);<a name="line.4326"></a>
-<span class="sourceLineNo">4327</span>          } catch (Exception e) {<a name="line.4327"></a>
-<span class="sourceLineNo">4328</span>            e.printStackTrace();<a name="line.4328"></a>
-<span class="sourceLineNo">4329</span>          }<a name="line.4329"></a>
-<span class="sourceLineNo">4330</span>        }<a name="line.4330"></a>
-<span class="sourceLineNo">4331</span>      }<a name="line.4331"></a>
-<span class="sourceLineNo">4332</span>    };<a name="line.4332"></a>
-<span class="sourceLineNo">4333</span><a name="line.4333"></a>
-<span class="sourceLineNo">4334</span>    // After all append finished, the value will append to threadNum *<a name="line.4334"></a>
-<span class="sourceLineNo">4335</span>    // appendCounter Appender.CHAR<a name="line.4335"></a>
-<span class="sourceLineNo">4336</span>    int threadNum = 20;<a name="line.4336"></a>
-<span class="sourceLineNo">4337</span>    int appendCounter = 100;<a name="line.4337"></a>
-<span class="sourceLineNo">4338</span>    byte[] expected = new byte[threadNum * appendCounter];<a name="line.4338"></a>
-<span class="sourceLineNo">4339</span>    for (int i = 0; i &lt; threadNum * appendCounter; i++) {<a name="line.4339"></a>
-<span class="sourceLineNo">4340</span>      System.arraycopy(Appender.CHAR, 0, expected, i, 1);<a name="line.4340"></a>
-<span class="sourceLineNo">4341</span>    }<a name="line.4341"></a>
-<span class="sourceLineNo">4342</span>    Thread[] appenders = new Thread[threadNum];<a name="line.4342"></a>
-<span class="sourceLineNo">4343</span>    Thread flushThread = new Thread(flusher);<a name="line.4343"></a>
-<span class="sourceLineNo">4344</span>    for (int i = 0; i &lt; threadNum; i++) {<a name="line.4344"></a>
-<span class="sourceLineNo">4345</span>      appenders[i] = new Thread(new Appender(this.region, appendCounter));<a name="line.4345"></a>
-<span class="sourceLineNo">4346</span>      appenders[i].start();<a name="line.4346"></a>
-<span class="sourceLineNo">4347</span>    }<a name="line.4347"></a>
-<span class="sourceLineNo">4348</span>    flushThread.start();<a name="line.4348"></a>
-<span class="sourceLineNo">4349</span>    for (int i = 0; i &lt; threadNum; i++) {<a name="line.4349"></a>
-<span class="sourceLineNo">4350</span>      appenders[i].join();<a name="line.4350"></a>
+<span class="sourceLineNo">4185</span>    // Remove the .regioninfo file and verify is recreated on region open<a name="line.4185"></a>
+<span class="sourceLineNo">4186</span>    fs.delete(regionInfoFile, true);<a name="line.4186"></a>
+<span class="sourceLineNo">4187</span>    assertFalse(HRegionFileSystem.REGION_INFO_FILE + " should be removed from the region dir",<a name="line.4187"></a>
+<span class="sourceLineNo">4188</span>        fs.exists(regionInfoFile));<a name="line.4188"></a>
+<span class="sourceLineNo">4189</span><a name="line.4189"></a>
+<span class="sourceLineNo">4190</span>    region = HRegion.openHRegion(rootDir, hri, htd, null, CONF);<a name="line.4190"></a>
+<span class="sourceLineNo">4191</span>//    region = TEST_UTIL.openHRegion(hri, htd);<a name="line.4191"></a>
+<span class="sourceLineNo">4192</span>    assertEquals(regionDir, region.getRegionFileSystem().getRegionDir());<a name="line.4192"></a>
+<span class="sourceLineNo">4193</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.4193"></a>
+<span class="sourceLineNo">4194</span><a name="line.4194"></a>
+<span class="sourceLineNo">4195</span>    // Verify that the .regioninfo file is still there<a name="line.4195"></a>
+<span class="sourceLineNo">4196</span>    assertTrue(HRegionFileSystem.REGION_INFO_FILE + " should be present in the region dir",<a name="line.4196"></a>
+<span class="sourceLineNo">4197</span>        fs.exists(new Path(regionDir, HRegionFileSystem.REGION_INFO_FILE)));<a name="line.4197"></a>
+<span class="sourceLineNo">4198</span><a name="line.4198"></a>
+<span class="sourceLineNo">4199</span>    region = null;<a name="line.4199"></a>
+<span class="sourceLineNo">4200</span>  }<a name="line.4200"></a>
+<span class="sourceLineNo">4201</span><a name="line.4201"></a>
+<span class="sourceLineNo">4202</span>  /**<a name="line.4202"></a>
+<span class="sourceLineNo">4203</span>   * TestCase for increment<a name="line.4203"></a>
+<span class="sourceLineNo">4204</span>   */<a name="line.4204"></a>
+<span class="sourceLineNo">4205</span>  private static class Incrementer implements Runnable {<a name="line.4205"></a>
+<span class="sourceLineNo">4206</span>    private HRegion region;<a name="line.4206"></a>
+<span class="sourceLineNo">4207</span>    private final static byte[] incRow = Bytes.toBytes("incRow");<a name="line.4207"></a>
+<span class="sourceLineNo">4208</span>    private final static byte[] family = Bytes.toBytes("family");<a name="line.4208"></a>
+<span class="sourceLineNo">4209</span>    private final static byte[] qualifier = Bytes.toBytes("qualifier");<a name="line.4209"></a>
+<span class="sourceLineNo">4210</span>    private final static long ONE = 1L;<a name="line.4210"></a>
+<span class="sourceLineNo">4211</span>    private int incCounter;<a name="line.4211"></a>
+<span class="sourceLineNo">4212</span><a name="line.4212"></a>
+<span class="sourceLineNo">4213</span>    public Incrementer(HRegion region, int incCounter) {<a name="line.4213"></a>
+<span class="sourceLineNo">4214</span>      this.region = region;<a name="line.4214"></a>
+<span class="sourceLineNo">4215</span>      this.incCounter = incCounter;<a name="line.4215"></a>
+<span class="sourceLineNo">4216</span>    }<a name="line.4216"></a>
+<span class="sourceLineNo">4217</span><a name="line.4217"></a>
+<span class="sourceLineNo">4218</span>    @Override<a name="line.4218"></a>
+<span class="sourceLineNo">4219</span>    public void run() {<a name="line.4219"></a>
+<span class="sourceLineNo">4220</span>      int count = 0;<a name="line.4220"></a>
+<span class="sourceLineNo">4221</span>      while (count &lt; incCounter) {<a name="line.4221"></a>
+<span class="sourceLineNo">4222</span>        Increment inc = new Increment(incRow);<a name="line.4222"></a>
+<span class="sourceLineNo">4223</span>        inc.addColumn(family, qualifier, ONE);<a name="line.4223"></a>
+<span class="sourceLineNo">4224</span>        count++;<a name="line.4224"></a>
+<span class="sourceLineNo">4225</span>        try {<a name="line.4225"></a>
+<span class="sourceLineNo">4226</span>          region.increment(inc);<a name="line.4226"></a>
+<span class="sourceLineNo">4227</span>        } catch (IOException e) {<a name="line.4227"></a>
+<span class="sourceLineNo">4228</span>          LOG.info("Count=" + count + ", " + e);<a name="line.4228"></a>
+<span class="sourceLineNo">4229</span>          break;<a name="line.4229"></a>
+<span class="sourceLineNo">4230</span>        }<a name="line.4230"></a>
+<span class="sourceLineNo">4231</span>      }<a name="line.4231"></a>
+<span class="sourceLineNo">4232</span>    }<a name="line.4232"></a>
+<span class="sourceLineNo">4233</span>  }<a name="line.4233"></a>
+<span class="sourceLineNo">4234</span><a name="line.4234"></a>
+<span class="sourceLineNo">4235</span>  /**<a name="line.4235"></a>
+<span class="sourceLineNo">4236</span>   * Test case to check increment function with memstore flushing<a name="line.4236"></a>
+<span class="sourceLineNo">4237</span>   * @throws Exception<a name="line.4237"></a>
+<span class="sourceLineNo">4238</span>   */<a name="line.4238"></a>
+<span class="sourceLineNo">4239</span>  @Test<a name="line.4239"></a>
+<span class="sourceLineNo">4240</span>  public void testParallelIncrementWithMemStoreFlush() throws Exception {<a name="line.4240"></a>
+<span class="sourceLineNo">4241</span>    byte[] family = Incrementer.family;<a name="line.4241"></a>
+<span class="sourceLineNo">4242</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.4242"></a>
+<span class="sourceLineNo">4243</span>    final HRegion region = this.region;<a name="line.4243"></a>
+<span class="sourceLineNo">4244</span>    final AtomicBoolean incrementDone = new AtomicBoolean(false);<a name="line.4244"></a>
+<span class="sourceLineNo">4245</span>    Runnable flusher = new Runnable() {<a name="line.4245"></a>
+<span class="sourceLineNo">4246</span>      @Override<a name="line.4246"></a>
+<span class="sourceLineNo">4247</span>      public void run() {<a name="line.4247"></a>
+<span class="sourceLineNo">4248</span>        while (!incrementDone.get()) {<a name="line.4248"></a>
+<span class="sourceLineNo">4249</span>          try {<a name="line.4249"></a>
+<span class="sourceLineNo">4250</span>            region.flush(true);<a name="line.4250"></a>
+<span class="sourceLineNo">4251</span>          } catch (Exception e) {<a name="line.4251"></a>
+<span class="sourceLineNo">4252</span>            e.printStackTrace();<a name="line.4252"></a>
+<span class="sourceLineNo">4253</span>          }<a name="line.4253"></a>
+<span class="sourceLineNo">4254</span>        }<a name="line.4254"></a>
+<span class="sourceLineNo">4255</span>      }<a name="line.4255"></a>
+<span class="sourceLineNo">4256</span>    };<a name="line.4256"></a>
+<span class="sourceLineNo">4257</span><a name="line.4257"></a>
+<span class="sourceLineNo">4258</span>    // after all increment finished, the row will increment to 20*100 = 2000<a name="line.4258"></a>
+<span class="sourceLineNo">4259</span>    int threadNum = 20;<a name="line.4259"></a>
+<span class="sourceLineNo">4260</span>    int incCounter = 100;<a name="line.4260"></a>
+<span class="sourceLineNo">4261</span>    long expected = (long) threadNum * incCounter;<a name="line.4261"></a>
+<span class="sourceLineNo">4262</span>    Thread[] incrementers = new Thread[threadNum];<a name="line.4262"></a>
+<span class="sourceLineNo">4263</span>    Thread flushThread = new Thread(flusher);<a name="line.4263"></a>
+<span class="sourceLineNo">4264</span>    for (int i = 0; i &lt; threadNum; i++) {<a name="line.4264"></a>
+<span class="sourceLineNo">4265</span>      incrementers[i] = new Thread(new Incrementer(this.region, incCounter));<a name="line.4265"></a>
+<span class="sourceLineNo">4266</span>      incrementers[i].start();<a name="line.4266"></a>
+<span class="sourceLineNo">4267</span>    }<a name="line.4267"></a>
+<span class="sourceLineNo">4268</span>    flushThread.start();<a name="line.4268"></a>
+<span class="sourceLineNo">4269</span>    for (int i = 0; i &lt; threadNum; i++) {<a name="line.4269"></a>
+<span class="sourceLineNo">4270</span>      incrementers[i].join();<a name="line.4270"></a>
+<span class="sourceLineNo">4271</span>    }<a name="line.4271"></a>
+<span class="sourceLineNo">4272</span><a name="line.4272"></a>
+<span class="sourceLineNo">4273</span>    incrementDone.set(true);<a name="line.4273"></a>
+<span class="sourceLineNo">4274</span>    flushThread.join();<a name="line.4274"></a>
+<span class="sourceLineNo">4275</span><a name="line.4275"></a>
+<span class="sourceLineNo">4276</span>    Get get = new Get(Incrementer.incRow);<a name="line.4276"></a>
+<span class="sourceLineNo">4277</span>    get.addColumn(Incrementer.family, Incrementer.qualifier);<a name="line.4277"></a>
+<span class="sourceLineNo">4278</span>    get.readVersions(1);<a name="line.4278"></a>
+<span class="sourceLineNo">4279</span>    Result res = this.region.get(get);<a name="line.4279"></a>
+<span class="sourceLineNo">4280</span>    List&lt;Cell&gt; kvs = res.getColumnCells(Incrementer.family, Incrementer.qualifier);<a name="line.4280"></a>
+<span class="sourceLineNo">4281</span><a name="line.4281"></a>
+<span class="sourceLineNo">4282</span>    // we just got the latest version<a name="line.4282"></a>
+<span class="sourceLineNo">4283</span>    assertEquals(1, kvs.size());<a name="line.4283"></a>
+<span class="sourceLineNo">4284</span>    Cell kv = kvs.get(0);<a name="line.4284"></a>
+<span class="sourceLineNo">4285</span>    assertEquals(expected, Bytes.toLong(kv.getValueArray(), kv.getValueOffset()));<a name="line.4285"></a>
+<span class="sourceLineNo">4286</span>  }<a name="line.4286"></a>
+<span class="sourceLineNo">4287</span><a name="line.4287"></a>
+<span class="sourceLineNo">4288</span>  /**<a name="line.4288"></a>
+<span class="sourceLineNo">4289</span>   * TestCase for append<a name="line.4289"></a>
+<span class="sourceLineNo">4290</span>   */<a name="line.4290"></a>
+<span class="sourceLineNo">4291</span>  private static class Appender implements Runnable {<a name="line.4291"></a>
+<span class="sourceLineNo">4292</span>    private HRegion region;<a name="line.4292"></a>
+<span class="sourceLineNo">4293</span>    private final static byte[] appendRow = Bytes.toBytes("appendRow");<a name="line.4293"></a>
+<span class="sourceLineNo">4294</span>    private final static byte[] family = Bytes.toBytes("family");<a name="line.4294"></a>
+<span class="sourceLineNo">4295</span>    private final static byte[] qualifier = Bytes.toBytes("qualifier");<a name="line.4295"></a>
+<span class="sourceLineNo">4296</span>    private final static byte[] CHAR = Bytes.toBytes("a");<a name="line.4296"></a>
+<span class="sourceLineNo">4297</span>    private int appendCounter;<a name="line.4297"></a>
+<span class="sourceLineNo">4298</span><a name="line.4298"></a>
+<span class="sourceLineNo">4299</span>    public Appender(HRegion region, int appendCounter) {<a name="line.4299"></a>
+<span class="sourceLineNo">4300</span>      this.region = region;<a name="line.4300"></a>
+<span class="sourceLineNo">4301</span>      this.appendCounter = appendCounter;<a name="line.4301"></a>
+<span class="sourceLineNo">4302</span>    }<a name="line.4302"></a>
+<span class="sourceLineNo">4303</span><a name="line.4303"></a>
+<span class="sourceLineNo">4304</span>    @Override<a name="line.4304"></a>
+<span class="sourceLineNo">4305</span>    public void run() {<a name="line.4305"></a>
+<span class="sourceLineNo">4306</span>      int count = 0;<a name="line.4306"></a>
+<span class="sourceLineNo">4307</span>      while (count &lt; appendCounter) {<a name="line.4307"></a>
+<span class="sourceLineNo">4308</span>        Append app = new Append(appendRow);<a name="line.4308"></a>
+<span class="sourceLineNo">4309</span>        app.addColumn(family, qualifier, CHAR);<a name="line.4309"></a>
+<span class="sourceLineNo">4310</span>        count++;<a name="line.4310"></a>
+<span class="sourceLineNo">4311</span>        try {<a name="line.4311"></a>
+<span class="sourceLineNo">4312</span>          region.append(app);<a name="line.4312"></a>
+<span class="sourceLineNo">4313</span>        } catch (IOException e) {<a name="line.4313"></a>
+<span class="sourceLineNo">4314</span>          LOG.info("Count=" + count + ", max=" + appendCounter + ", " + e);<a name="line.4314"></a>
+<span class="sourceLineNo">4315</span>          break;<a name="line.4315"></a>
+<span class="sourceLineNo">4316</span>        }<a name="line.4316"></a>
+<span class="sourceLineNo">4317</span>      }<a name="line.4317"></a>
+<span class="sourceLineNo">4318</span>    }<a name="line.4318"></a>
+<span class="sourceLineNo">4319</span>  }<a name="line.4319"></a>
+<span class="sourceLineNo">4320</span><a name="line.4320"></a>
+<span class="sourceLineNo">4321</span>  /**<a name="line.4321"></a>
+<span class="sourceLineNo">4322</span>   * Test case to check append function with memstore flushing<a name="line.4322"></a>
+<span class="sourceLineNo">4323</span>   * @throws Exception<a name="line.4323"></a>
+<span class="sourceLineNo">4324</span>   */<a name="line.4324"></a>
+<span class="sourceLineNo">4325</span>  @Test<a name="line.4325"></a>
+<span class="sourceLineNo">4326</span>  public void testParallelAppendWithMemStoreFlush() throws Exception {<a name="line.4326"></a>
+<span class="sourceLineNo">4327</span>    byte[] family = Appender.family;<a name="line.4327"></a>
+<span class="sourceLineNo">4328</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.4328"></a>
+<span class="sourceLineNo">4329</span>    final HRegion region = this.region;<a name="line.4329"></a>
+<span class="sourceLineNo">4330</span>    final AtomicBoolean appendDone = new AtomicBoolean(false);<a name="line.4330"></a>
+<span class="sourceLineNo">4331</span>    Runnable flusher = new Runnable() {<a name="line.4331"></a>
+<span class="sourceLineNo">4332</span>      @Override<a name="line.4332"></a>
+<span class="sourceLineNo">4333</span>      public void run() {<a name="line.4333"></a>
+<span class="sourceLineNo">4334</span>        while (!appendDone.get()) {<a name="line.4334"></a>
+<span class="sourceLineNo">4335</span>          try {<a name="line.4335"></a>
+<span class="sourceLineNo">4336</span>            region.flush(true);<a name="line.4336"></a>
+<span class="sourceLineNo">4337</span>          } catch (Exception e) {<a name="line.4337"></a>
+<span class="sourceLineNo">4338</span>            e.printStackTrace();<a name="line.4338"></a>
+<span class="sourceLineNo">4339</span>          }<a name="line.4339"></a>
+<span class="sourceLineNo">4340</span>        }<a name="line.4340"></a>
+<span class="sourceLineNo">4341</span>      }<a name="line.4341"></a>
+<span class="sourceLineNo">4342</span>    };<a name="line.4342"></a>
+<span class="sourceLineNo">4343</span><a name="line.4343"></a>
+<span class="sourceLineNo">4344</span>    // After all append finished, the value will append to threadNum *<a name="line.4344"></a>
+<span class="sourceLineNo">4345</span>    // appendCounter Appender.CHAR<a name="line.4345"></a>
+<span class="sourceLineNo">4346</span>    int threadNum = 20;<a name="line.4346"></a>
+<span class="sourceLineNo">4347</span>    int appendCounter = 100;<a name="line.4347"></a>
+<span class="sourceLineNo">4348</span>    byte[] expected = new byte[threadNum * appendCounter];<a name="line.4348"></a>
+<span class="sourceLineNo">4349</span>    for (int i = 0; i &lt; threadNum * appendCounter; i++) {<a name="line.4349"></a>
+<span class="sourceLineNo">4350</span>      System.arraycopy(Appender.CHAR, 0, expected, i, 1);<a name="line.4350"></a>
 <span class="sourceLineNo">4351</span>    }<a name="line.4351"></a>
-<span class="sourceLineNo">4352</span><a name="line.4352"></a>
-<span class="sourceLineNo">4353</span>    appendDone.set(true);<a name="line.4353"></a>
-<span class="sourceLineNo">4354</span>    flushThread.join();<a name="line.4354"></a>
-<span class="sourceLineNo">4355</span><a name="line.4355"></a>
-<span class="sourceLineNo">4356</span>    Get get = new Get(Appender.appendRow);<a name="line.4356"></a>
-<span class="sourceLineNo">4357</span>    get.addColumn(Appender.family, Appender.qualifier);<a name="line.4357"></a>
-<span class="sourceLineNo">4358</span>    get.readVersions(1);<a name="line.4358"></a>
-<span class="sourceLineNo">4359</span>    Result res = this.region.get(get);<a name="line.4359"></a>
-<span class="sourceLineNo">4360</span>    List&lt;Cell&gt; kvs = res.getColumnCells(Appender.family, Appender.qualifier);<a name="line.4360"></a>
-<span class="sourceLineNo">4361</span><a name="line.4361"></a>
-<span class="sourceLineNo">4362</span>    // we just got the latest version<a name="line.4362"></a>
-<span class="sourceLineNo">4363</span>    assertEquals(1, kvs.size());<a name="line.4363"></a>
-<span class="sourceLineNo">4364</span>    Cell kv = kvs.get(0);<a name="line.4364"></a>
-<span class="sourceLineNo">4365</span>    byte[] appendResult = new byte[kv.getValueLength()];<a name="line.4365"></a>
-<span class="sourceLineNo">4366</span>    System.arraycopy(kv.getValueArray(), kv.getValueOffset(), appendResult, 0, kv.getValueLength());<a name="line.4366"></a>
-<span class="sourceLineNo">4367</span>    assertArrayEquals(expected, appendResult);<a name="line.4367"></a>
-<span class="sourceLineNo">4368</span>  }<a name="line.4368"></a>
-<span class="sourceLineNo">4369</span><a name="line.4369"></a>
-<span class="sourceLineNo">4370</span>  /**<a name="line.4370"></a>
-<span class="sourceLineNo">4371</span>   * Test case to check put function with memstore flushing for same row, same ts<a name="line.4371"></a>
-<span class="sourceLineNo">4372</span>   * @throws Exception<a name="line.4372"></a>
-<span class="sourceLineNo">4373</span>   */<a name="line.4373"></a>
-<span class="sourceLineNo">4374</span>  @Test<a name="line.4374"></a>
-<span class="sourceLineNo">4375</span>  public void testPutWithMemStoreFlush() throws Exception {<a name="line.4375"></a>
-<span class="sourceLineNo">4376</span>    byte[] family = Bytes.toBytes("family");<a name="line.4376"></a>
-<span class="sourceLineNo">4377</span>    byte[] qualifier = Bytes.toBytes("qualifier");<a name="line.4377"></a>
-<span class="sourceLineNo">4378</span>    byte[] row = Bytes.toBytes("putRow");<a name="line.4378"></a>
-<span class="sourceLineNo">4379</span>    byte[] value = null;<a name="line.4379"></a>
-<span class="sourceLineNo">4380</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.4380"></a>
-<span class="sourceLineNo">4381</span>    Put put = null;<a name="line.4381"></a>
-<span class="sourceLineNo">4382</span>    Get get = null;<a name="line.4382"></a>
-<span class="sourceLineNo">4383</span>    List&lt;Cell&gt; kvs = null;<a name="line.4383"></a>
-<span class="sourceLineNo">4384</span>    Result res = null;<a name="line.4384"></a>
-<span class="sourceLineNo">4385</span><a name="line.4385"></a>
-<span class="sourceLineNo">4386</span>    put = new Put(row);<a name="line.4386"></a>
-<span class="sourceLineNo">4387</span>    value = Bytes.toBytes("value0");<a name="line.4387"></a>
-<span class="sourceLineNo">4388</span>    put.addColumn(family, qualifier, 1234567L, value);<a name="line.4388"></a>
-<span class="sourceLineNo">4389</span>    region.put(put);<a name="line.4389"></a>
-<span class="sourceLineNo">4390</span>    get = new Get(row);<a name="line.4390"></a>
-<span class="sourceLineNo">4391</span>    get.addColumn(family, qualifier);<a name="line.4391"></a>
-<span class="sourceLineNo">4392</span>    get.readAllVersions();<a name="line.4392"></a>
-<span class="sourceLineNo">4393</span>    res = this.region.get(get);<a name="line.4393"></a>
-<span class="sourceLineNo">4394</span>    kvs = res.getColumnCells(family, qualifier);<a name="line.4394"></a>
-<span class="sourceLineNo">4395</span>    assertEquals(1, kvs.size());<a name="line.4395"></a>
-<span class="sourceLineNo">4396</span>    assertArrayEquals(Bytes.toBytes("value0"), CellUtil.cloneValue(kvs.get(0)));<a name="line.4396"></a>
-<span class="sourceLineNo">4397</span><a name="line.4397"></a>
-<span class="sourceLineNo">4398</span>    region.flush(true);<a name="line.4398"></a>
-<span class="sourceLineNo">4399</span>    get = new Get(row);<a name="line.4399"></a>
-<span class="sourceLineNo">4400</span>    get.addColumn(family, qualifier);<a name="line.4400"></a>
-<span class="sourceLineNo">4401</span>    get.readAllVersions();<a name="line.4401"></a>
-<span class="sourceLineNo">4402</span>    res = this.region.get(get);<a name="line.4402"></a>
-<span class="sourceLineNo">4403</span>    kvs = res.getColumnCells(family, qualifier);<a name="line.4403"></a>
-<span class="sourceLineNo">4404</span>    assertEquals(1, kvs.size());<a name="line.4404"></a>
-<span class="sourceLineNo">4405</span>    assertArrayEquals(Bytes.toBytes("value0"), CellUtil.cloneValue(kvs.get(0)));<a name="line.4405"></a>
-<span class="sourceLineNo">4406</span><a name="line.4406"></a>
-<span class="sourceLineNo">4407</span>    put = new Put(row);<a name="line.4407"></a>
-<span class="sourceLineNo">4408</span>    value = Bytes.toBytes("value1");<a name="line.4408"></a>
-<span class="sourceLineNo">4409</span>    put.addColumn(family, qualifier, 1234567L, value);<a name="line.4409"></a>
-<span class="sourceLineNo">4410</span>    region.put(put);<a name="line.4410"></a>
-<span class="sourceLineNo">4411</span>    get = new Get(row);<a name="line.4411"></a>
-<span class="sourceLineNo">4412</span>    get.addColumn(family, qualifier);<a name="line.4412"></a>
-<span class="sourceLineNo">4413</span>    get.readAllVersions();<a name="line.4413"></a>
-<span class="sourceLineNo">4414</span>    res = this.region.get(get);<a name="line.4414"></a>
-<span class="sourceLineNo">4415</span>    kvs = res.getColumnCells(family, qualifier);<a name="line.4415"></a>
-<span class="sourceLineNo">4416</span>    assertEquals(1, kvs.size());<a name="line.4416"></a>
-<span class="sourceLineNo">4417</span>    assertArrayEquals(Bytes.toBytes("value1"), CellUtil.cloneValue(kvs.get(0)));<a name="line.4417"></a>
-<span class="sourceLineNo">4418</span><a name="line.4418"></a>
-<span class="sourceLineNo">4419</span>    region.flush(true);<a name="line.4419"></a>
-<span class="sourceLineNo">4420</span>    get = new Get(row);<a name="line.4420"></a>
-<span class="sourceLineNo">4421</span>    get.addColumn(family, qualifier);<a name="line.4421"></a>
-<span class="sourceLineNo">4422</span>    get.readAllVersions();<a name="line.4422"></a>
-<span class="sourceLineNo">4423</span>    res = this.region.get(get);<a name="line.4423"></a>
-<span class="sourceLineNo">4424</span>    kvs = res.getColumnCells(family, qualifier);<a name="line.4424"></a>
-<span class="sourceLineNo">4425</span>    assertEquals(1, kvs.size());<a name="line.4425"></a>
-<span class="sourceLineNo">4426</span>    assertArrayEquals(Bytes.toBytes("value1"), CellUtil.cloneValue(kvs.get(0)));<a name="line.4426"></a>
-<span class="sourceLineNo">4427</span>  }<a name="line.4427"></a>
+<span class="sourceLineNo">4352</span>    Thread[] appenders = new Thread[threadNum];<a name="line.4352"></a>
+<span class="sourceLineNo">4353</span>    Thread flushThread = new Thread(flusher);<a name="line.4353"></a>
+<span class="sourceLineNo">4354</span>    for (int i = 0; i &lt; threadNum; i++) {<a name="line.4354"></a>
+<span class="sourceLineNo">4355</span>      appenders[i] = new Thread(new Appender(this.region, appendCounter));<a name="line.4355"></a>
+<span class="sourceLineNo">4356</span>      appenders[i].start();<a name="line.4356"></a>
+<span class="sourceLineNo">4357</span>    }<a name="line.4357"></a>
+<span class="sourceLineNo">4358</span>    flushThread.start();<a name="line.4358"></a>
+<span class="sourceLineNo">4359</span>    for (int i = 0; i &lt; threadNum; i++) {<a name="line.4359"></a>
+<span class="sourceLineNo">4360</span>      appenders[i].join();<a name="line.4360"></a>
+<span class="sourceLineNo">4361</span>    }<a name="line.4361"></a>
+<span class="sourceLineNo">4362</span><a name="line.4362"></a>
+<span class="sourceLineNo">4363</span>    appendDone.set(true);<a name="line.4363"></a>
+<span class="sourceLineNo">4364</span>    flushThread.join();<a name="line.4364"></a>
+<span class="sourceLineNo">4365</span><a name="line.4365"></a>
+<span class="sourceLineNo">4366</span>    Get get = new Get(Appender.appendRow);<a name="line.4366"></a>
+<span class="sourceLineNo">4367</span>    get.addColumn(Appender.family, Appender.qualifier);<a name="line.4367"></a>
+<span class="sourceLineNo">4368</span>    get.readVersions(1);<a name="line.4368"></a>
+<span class="sourceLineNo">4369</span>    Result res = this.region.get(get);<a name="line.4369"></a>
+<span class="sourceLineNo">4370</span>    List&lt;Cell&gt; kvs = res.getColumnCells(Appender.family, Appender.qualifier);<a name="line.4370"></a>
+<span class="sourceLineNo">4371</span><a name="line.4371"></a>
+<span class="sourceLineNo">4372</span>    // we just got the latest version<a name="line.4372"></a>
+<span class="sourceLineNo">4373</span>    assertEquals(1, kvs.size());<a name="line.4373"></a>
+<span class="sourceLineNo">4374</span>    Cell kv = kvs.get(0);<a name="line.4374"></a>
+<span class="sourceLineNo">4375</span>    byte[] appendResult = new byte[kv.getValueLength()];<a name="line.4375"></a>
+<span class="sourceLineNo">4376</span>    System.arraycopy(kv.getValueArray(), kv.getValueOffset(), appendResult, 0, kv.getValueLength());<a name="line.4376"></a>
+<span class="sourceLineNo">4377</span>    assertArrayEquals(expected, appendResult);<a name="line.4377"></a>
+<span class="sourceLineNo">4378</span>  }<a name="line.4378"></a>
+<span class="sourceLineNo">4379</span><a name="line.4379"></a>
+<span class="sourceLineNo">4380</span>  /**<a name="line.4380"></a>
+<span class="sourceLineNo">4381</span>   * Test case to check put function with memstore flushing for same row, same ts<a name="line.4381"></a>
+<span class="sourceLineNo">4382</span>   * @throws Exception<a name="line.4382"></a>
+<span class="sourceLineNo">4383</span>   */<a name="line.4383"></a>
+<span class="sourceLineNo">4384</span>  @Test<a name="line.4384"></a>
+<span class="sourceLineNo">4385</span>  public void testPutWithMemStoreFlush() throws Exception {<a name="line.4385"></a>
+<span class="sourceLineNo">4386</span>    byte[] family = Bytes.toBytes("family");<a name="line.4386"></a>
+<span class="sourceLineNo">4387</span>    byte[] qualifier = Bytes.toBytes("qualifier");<a name="line.4387"></a>
+<span class="sourceLineNo">4388</span>    byte[] row = Bytes.toBytes("putRow");<a name="line.4388"></a>
+<span class="sourceLineNo">4389</span>    byte[] value = null;<a name="line.4389"></a>
+<span class="sourceLineNo">4390</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.4390"></a>
+<span class="sourceLineNo">4391</span>    Put put = null;<a name="line.4391"></a>
+<span class="sourceLineNo">4392</span>    Get get = null;<a name="line.4392"></a>
+<span class="sourceLineNo">4393</span>    List&lt;Cell&gt; kvs = null;<a name="line.4393"></a>
+<span class="sourceLineNo">4394</span>    Result res = null;<a name="line.4394"></a>
+<span class="sourceLineNo">4395</span><a name="line.4395"></a>
+<span class="sourceLineNo">4396</span>    put = new Put(row);<a name="line.4396"></a>
+<span class="sourceLineNo">4397</span>    value = Bytes.toBytes("value0");<a name="line.4397"></a>
+<span class="sourceLineNo">4398</span>    put.addColumn(family, qualifier, 1234567L, value);<a name="line.4398"></a>
+<span class="sourceLineNo">4399</span>    region.put(put);<a name="line.4399"></a>
+<span class="sourceLineNo">4400</span>    get = new Get(row);<a name="line.4400"></a>
+<span class="sourceLineNo">4401</span>    get.addColumn(family, qualifier);<a name="line.4401"></a>
+<span class="sourceLineNo">4402</span>    get.readAllVersions();<a name="line.4402"></a>
+<span class="sourceLineNo">4403</span>    res = this.region.get(get);<a name="line.4403"></a>
+<span class="sourceLineNo">4404</span>    kvs = res.getColumnCells(family, qualifier);<a name="line.4404"></a>
+<span class="sourceLineNo">4405</span>    assertEquals(1, kvs.size());<a name="line.4405"></a>
+<span class="sourceLineNo">4406</span>    assertArrayEquals(Bytes.toBytes("value0"), CellUtil.cloneValue(kvs.get(0)));<a name="line.4406"></a>
+<span class="sourceLineNo">4407</span><a name="line.4407"></a>
+<span class="sourceLineNo">4408</span>    region.flush(true);<a name="line.4408"></a>
+<span class="sourceLineNo">4409</span>    get = new Get(row);<a name="line.4409"></a>
+<span class="sourceLineNo">4410</span>    get.addColumn(family, qualifier);<a name="line.4410"></a>
+<span class="sourceLineNo">4411</span>    get.readAllVersions();<a name="line.4411"></a>
+<span class="sourceLineNo">4412</span>    res = this.region.get(get);<a name="line.4412"></a>
+<span class="sourceLineNo">4413</span>    kvs = res.getColumnCells(family, qualifier);<a name="line.4413"></a>
+<span class="sourceLineNo">4414</span>    assertEquals(1, kvs.size());<a name="line.4414"></a>
+<span class="sourceLineNo">4415</span>    assertArrayEquals(Bytes.toBytes("value0"), CellUtil.cloneValue(kvs.get(0)));<a name="line.4415"></a>
+<span class="sourceLineNo">4416</span><a name="line.4416"></a>
+<span class="sourceLineNo">4417</span>    put = new Put(row);<a name="line.4417"></a>
+<span class="sourceLineNo">4418</span>    value = Bytes.toBytes("value1");<a name="line.4418"></a>
+<span class="sourceLineNo">4419</span>    put.addColumn(family, qualifier, 1234567L, value);<a name="line.4419"></a>
+<span class="sourceLineNo">4420</span>    region.put(put);<a name="line.4420"></a>
+<span class="sourceLineNo">4421</span>    get = new Get(row);<a name="line.4421"></a>
+<span class="sourceLineNo">4422</span>    get.addColumn(family, qualifier);<a name="line.4422"></a>
+<span class="sourceLineNo">4423</span>    get.readAllVersions();<a name="line.4423"></a>
+<span class="sourceLineNo">4424</span>    res = this.region.get(get);<a name="line.4424"></a>
+<span class="sourceLineNo">4425</span>    kvs = res.getColumnCells(family, qualifier);<a name="line.4425"></a>
+<span class="sourceLineNo">4426</span>    assertEquals(1, kvs.size());<a name="line.4426"></a>
+<span class="sourceLineNo">4427</span>    assertArrayEquals(Bytes.toBytes("value1"), CellUtil.cloneValue(kvs.get(0)));<a name="line.4427"></a>
 <span class="sourceLineNo">4428</span><a name="line.4428"></a>
-<span class="sourceLineNo">4429</span>  @Test<a name="line.4429"></a>
-<span class="sourceLineNo">4430</span>  public void testDurability() throws Exception {<a name="line.4430"></a>
-<span class="sourceLineNo">4431</span>    // there are 5 x 5 cases:<a name="line.4431"></a>
-<span class="sourceLineNo">4432</span>    // table durability(SYNC,FSYNC,ASYC,SKIP,USE_DEFAULT) x mutation<a name="line.4432"></a>
-<span class="sourceLineNo">4433</span>    // durability(SYNC,FSYNC,ASYC,SKIP,USE_DEFAULT)<a name="line.4433"></a>
-<span class="sourceLineNo">4434</span><a name="line.4434"></a>
-<span class="sourceLineNo">4435</span>    // expected cases for append and sync wal<a name="line.4435"></a>
-<span class="sourceLineNo">4436</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4436"></a>
-<span class="sourceLineNo">4437</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4437"></a>
-<span class="sourceLineNo">4438</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.USE_DEFAULT, 0, true, true, false);<a name="line.4438"></a>
-<span class="sourceLineNo">4439</span><a name="line.4439"></a>
-<span class="sourceLineNo">4440</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4440"></a>
-<span class="sourceLineNo">4441</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4441"></a>
-<span class="sourceLineNo">4442</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.USE_DEFAULT, 0, true, true, false);<a name="line.4442"></a>
-<span class="sourceLineNo">4443</span><a name="line.4443"></a>
-<span class="sourceLineNo">4444</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4444"></a>
-<span class="sourceLineNo">4445</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4445"></a>
-<span class="sourceLineNo">4446</span><a name="line.4446"></a>
-<span class="sourceLineNo">4447</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4447"></a>
-<span class="sourceLineNo">4448</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4448"></a>
+<span class="sourceLineNo">4429</span>    region.flush(true);<a name="line.4429"></a>
+<span class="sourceLineNo">4430</span>    get = new Get(row);<a name="line.4430"></a>
+<span class="sourceLineNo">4431</span>    get.addColumn(family, qualifier);<a name="line.4431"></a>
+<span class="sourceLineNo">4432</span>    get.readAllVersions();<a name="line.4432"></a>
+<span class="sourceLineNo">4433</span>    res = this.region.get(get);<a name="line.4433"></a>
+<span class="sourceLineNo">4434</span>    kvs = res.getColumnCells(family, qualifier);<a name="line.4434"></a>
+<span class="sourceLineNo">4435</span>    assertEquals(1, kvs.size());<a name="line.4435"></a>
+<span class="sourceLineNo">4436</span>    assertArrayEquals(Bytes.toBytes("value1"), CellUtil.cloneValue(kvs.get(0)));<a name="line.4436"></a>
+<span class="sourceLineNo">4437</span>  }<a name="line.4437"></a>
+<span class="sourceLineNo">4438</span><a name="line.4438"></a>
+<span class="sourceLineNo">4439</span>  @Test<a name="line.4439"></a>
+<span class="sourceLineNo">4440</span>  public void testDurability() throws Exception {<a name="line.4440"></a>
+<span class="sourceLineNo">4441</span>    // there are 5 x 5 cases:<a name="line.4441"></a>
+<span class="sourceLineNo">4442</span>    // table durability(SYNC,FSYNC,ASYC,SKIP,USE_DEFAULT) x mutation<a name="line.4442"></a>
+<span class="sourceLineNo">4443</span>    // durability(SYNC,FSYNC,ASYC,SKIP,USE_DEFAULT)<a name="line.4443"></a>
+<span class="sourceLineNo">4444</span><a name="line.4444"></a>
+<span class="sourceLineNo">4445</span>    // expected cases for append and sync wal<a name="line.4445"></a>
+<span class="sourceLineNo">4446</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4446"></a>
+<span class="sourceLineNo">4447</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4447"></a>
+<span class="sourceLineNo">4448</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.USE_DEFAULT, 0, true, true, false);<a name="line.4448"></a>
 <span class="sourceLineNo">4449</span><a name="line.4449"></a>
-<span class="sourceLineNo">4450</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4450"></a>
-<span class="sourceLineNo">4451</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4451"></a>
-<span class="sourceLineNo">4452</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.USE_DEFAULT, 0, true, true, false);<a name="line.4452"></a>
+<span class="sourceLineNo">4450</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4450"></a>
+<span class="sourceLineNo">4451</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4451"></a>
+<span class="sourceLineNo">4452</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.USE_DEFAULT, 0, true, true, false);<a name="line.4452"></a>
 <span class="sourceLineNo">4453</span><a name="line.4453"></a>
-<span class="sourceLineNo">4454</span>    // expected cases for async wal<a name="line.4454"></a>
-<span class="sourceLineNo">4455</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4455"></a>
-<span class="sourceLineNo">4456</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4456"></a>
-<span class="sourceLineNo">4457</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4457"></a>
-<span class="sourceLineNo">4458</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4458"></a>
-<span class="sourceLineNo">4459</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4459"></a>
-<span class="sourceLineNo">4460</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.USE_DEFAULT, 0, true, false, false);<a name="line.4460"></a>
-<span class="sourceLineNo">4461</span><a name="line.4461"></a>
-<span class="sourceLineNo">4462</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4462"></a>
-<span class="sourceLineNo">4463</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4463"></a>
-<span class="sourceLineNo">4464</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4464"></a>
-<span class="sourceLineNo">4465</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4465"></a>
-<span class="sourceLineNo">4466</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4466"></a>
-<span class="sourceLineNo">4467</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.USE_DEFAULT, 5000, true, false, true);<a name="line.4467"></a>
-<span class="sourceLineNo">4468</span><a name="line.4468"></a>
-<span class="sourceLineNo">4469</span>    // expect skip wal cases<a name="line.4469"></a>
-<span class="sourceLineNo">4470</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4470"></a>
-<span class="sourceLineNo">4471</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4471"></a>
-<span class="sourceLineNo">4472</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4472"></a>
-<span class="sourceLineNo">4473</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4473"></a>
-<span class="sourceLineNo">4474</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4474"></a>
-<span class="sourceLineNo">4475</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.USE_DEFAULT, 0, false, false, false);<a name="line.4475"></a>
-<span class="sourceLineNo">4476</span><a name="line.4476"></a>
-<span class="sourceLineNo">4477</span>  }<a name="line.4477"></a>
+<span class="sourceLineNo">4454</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4454"></a>
+<span class="sourceLineNo">4455</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4455"></a>
+<span class="sourceLineNo">4456</span><a name="line.4456"></a>
+<span class="sourceLineNo">4457</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4457"></a>
+<span class="sourceLineNo">4458</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4458"></a>
+<span class="sourceLineNo">4459</span><a name="line.4459"></a>
+<span class="sourceLineNo">4460</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4460"></a>
+<span class="sourceLineNo">4461</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4461"></a>
+<span class="sourceLineNo">4462</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.USE_DEFAULT, 0, true, true, false);<a name="line.4462"></a>
+<span class="sourceLineNo">4463</span><a name="line.4463"></a>
+<span class="sourceLineNo">4464</span>    // expected cases for async wal<a name="line.4464"></a>
+<span class="sourceLineNo">4465</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4465"></a>
+<span class="sourceLineNo">4466</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4466"></a>
+<span class="sourceLineNo">4467</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4467"></a>
+<span class="sourceLineNo">4468</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4468"></a>
+<span class="sourceLineNo">4469</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4469"></a>
+<span class="sourceLineNo">4470</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.USE_DEFAULT, 0, true, false, false);<a name="line.4470"></a>
+<span class="sourceLineNo">4471</span><a name="line.4471"></a>
+<span class="sourceLineNo">4472</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4472"></a>
+<span class="sourceLineNo">4473</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4473"></a>
+<span class="sourceLineNo">4474</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4474"></a>
+<span class="sourceLineNo">4475</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4475"></a>
+<span class="sourceLineNo">4476</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4476"></a>
+<span class="sourceLineNo">4477</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.USE_DEFAULT, 5000, true, false, true);<a name="line.4477"></a>
 <span class="sourceLineNo">4478</span><a name="line.4478"></a>
-<span class="sourceLineNo">4479</span>  private void durabilityTest(String method, Durability tableDurability,<a name="line.4479"></a>
-<span class="sourceLineNo">4480</span>      Durability mutationDurability, long timeout, boolean expectAppend, final boolean expectSync,<a name="line.4480"></a>
-<span class="sourceLineNo">4481</span>      final boolean expectSyncFromLogSyncer) throws Exception {<a name="line.4481"></a>
-<span class="sourceLineNo">4482</span>    Configuration conf = HBaseConfiguration.create(CONF);<a name="line.4482"></a>
-<span class="sourceLineNo">4483</span>    method = method + "_" + tableDurability.name() + "_" + mutationDurability.name();<a name="line.4483"></a>
-<span class="sourceLineNo">4484</span>    byte[] family = Bytes.toBytes("family");<a name="line.4484"></a>
-<span class="sourceLineNo">4485</span>    Path logDir = new Path(new Path(dir + method), "log");<a name="line.4485"></a>
-<span class="sourceLineNo">4486</span>    final Configuration walConf = new Configuration(conf);<a name="line.4486"></a>
-<span class="sourceLineNo">4487</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.4487"></a>
-<span class="sourceLineNo">4488</span>    // XXX: The spied AsyncFSWAL can not work properly because of a Mockito defect that can not<a name="line.4488"></a>
-<span class="sourceLineNo">4489</span>    // deal with classes which have a field of an inner class. See discussions in HBASE-15536.<a name="line.4489"></a>
-<span class="sourceLineNo">4490</span>    walConf.set(WALFactory.WAL_PROVIDER, "filesystem");<a name="line.4490"></a>
-<span class="sourceLineNo">4491</span>    final WALFactory wals = new WALFactory(walConf, TEST_UTIL.getRandomUUID().toString());<a name="line.4491"></a>
-<span class="sourceLineNo">4492</span>    final WAL wal = spy(wals.getWAL(RegionInfoBuilder.newBuilder(tableName).build()));<a name="line.4492"></a>
-<span class="sourceLineNo">4493</span>    this.region = initHRegion(tableName, HConstants.EMPTY_START_ROW,<a name="line.4493"></a>
-<span class="sourceLineNo">4494</span>        HConstants.EMPTY_END_ROW, false, tableDurability, wal,<a name="line.4494"></a>
-<span class="sourceLineNo">4495</span>        new byte[][] { family });<a name="line.4495"></a>
-<span class="sourceLineNo">4496</span><a name="line.4496"></a>
-<span class="sourceLineNo">4497</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.4497"></a>
-<span class="sourceLineNo">4498</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.4498"></a>
-<span class="sourceLineNo">4499</span>    put.setDurability(mutationDurability);<a name="line.4499"></a>
-<span class="sourceLineNo">4500</span>    region.put(put);<a name="line.4500"></a>
-<span class="sourceLineNo">4501</span><a name="line.4501"></a>
-<span class="sourceLineNo">4502</span>    //verify append called or not<a name="line.4502"></a>
-<span class="sourceLineNo">4503</span>    verify(wal, expectAppend ? times(1) : never())<a name="line.4503"></a>
-<span class="sourceLineNo">4504</span>      .append((HRegionInfo)any(), (WALKeyImpl)any(),<a name="line.4504"></a>
-<span class="sourceLineNo">4505</span>          (WALEdit)any(), Mockito.anyBoolean());<a name="line.4505"></a>
+<span class="sourceLineNo">4479</span>    // expect skip wal cases<a name="line.4479"></a>
+<span class="sourceLineNo">4480</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4480"></a>
+<span class="sourceLineNo">4481</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4481"></a>
+<span class="sourceLineNo">4482</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4482"></a>
+<span class="sourceLineNo">4483</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4483"></a>
+<span class="sourceLineNo">4484</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4484"></a>
+<span class="sourceLineNo">4485</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.USE_DEFAULT, 0, false, false, false);<a name="line.4485"></a>
+<span class="sourceLineNo">4486</span><a name="line.4486"></a>
+<span class="sourceLineNo">4487</span>  }<a name="line.4487"></a>
+<span class="sourceLineNo">4488</span><a name="line.4488"></a>
+<span class="sourceLineNo">4489</span>  private void durabilityTest(String method, Durability tableDurability,<a name="line.4489"></a>
+<span class="sourceLineNo">4490</span>      Durability mutationDurability, long timeout, boolean expectAppend, final boolean expectSync,<a name="line.4490"></a>
+<span class="sourceLineNo">4491</span>      final boolean expectSyncFromLogSyncer) throws Exception {<a name="line.4491"></a>
+<span class="sourceLineNo">4492</span>    Configuration conf = HBaseConfiguration.create(CONF);<a name="line.4492"></a>
+<span class="sourceLineNo">4493</span>    method = method + "_" + tableDurability.name() + "_" + mutationDurability.name();<a name="line.4493"></a>
+<span class="sourceLineNo">4494</span>    byte[] family = Bytes.toBytes("family");<a name="line.4494"></a>
+<span class="sourceLineNo">4495</span>    Path logDir = new Path(new Path(dir + method), "log");<a name="line.4495"></a>
+<span class="sourceLineNo">4496</span>    final Configuration walConf = new Configuration(conf);<a name="line.4496"></a>
+<span class="sourceLineNo">4497</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.4497"></a>
+<span class="sourceLineNo">4498</span>    // XXX: The spied AsyncFSWAL can not work properly because of a Mockito defect that can not<a name="line.4498"></a>
+<span class="sourceLineNo">4499</span>    // deal with classes which have a field of an inner class. See discussions in HBASE-15536.<a name="line.4499"></a>
+<span class="sourceLineNo">4500</span>    walConf.set(WALFactory.WAL_PROVIDER, "filesystem");<a name="line.4500"></a>
+<span class="sourceLineNo">4501</span>    final WALFactory wals = new WALFactory(walConf, TEST_UTIL.getRandomUUID().toString());<a name="line.4501"></a>
+<span class="sourceLineNo">4502</span>    final WAL wal = spy(wals.getWAL(RegionInfoBuilder.newBuilder(tableName).build()));<a name="line.4502"></a>
+<span class="sourceLineNo">4503</span>    this.region = initHRegion(tableName, HConstants.EMPTY_START_ROW,<a name="line.4503"></a>
+<span class="sourceLineNo">4504</span>        HConstants.EMPTY_END_ROW, false, tableDurability, wal,<a name="line.4504"></a>
+<span class="sourceLineNo">4505</span>        new byte[][] { family });<a name="line.4505"></a>
 <span class="sourceLineNo">4506</span><a name="line.4506"></a>
-<span class="sourceLineNo">4507</span>    // verify sync called or not<a name="line.4507"></a>
-<span class="sourceLineNo">4508</span>    if (expectSync || expectSyncFromLogSyncer) {<a name="line.4508"></a>
-<span class="sourceLineNo">4509</span>      TEST_UTIL.waitFor(timeout, new Waiter.Predicate&lt;Exception&gt;() {<a name="line.4509"></a>
-<span class="sourceLineNo">4510</span>        @Override<a name="line.4510"></a>
-<span class="sourceLineNo">4511</span>        public boolean evaluate() throws Exception {<a name="line.4511"></a>
-<span class="sourceLineNo">4512</span>          try {<a name="line.4512"></a>
-<span class="sourceLineNo">4513</span>            if (expectSync) {<a name="line.4513"></a>
-<span class="sourceLineNo">4514</span>              verify(wal, times(1)).sync(anyLong()); // Hregion calls this one<a name="line.4514"></a>
-<span class="sourceLineNo">4515</span>            } else if (expectSyncFromLogSyncer) {<a name="line.4515"></a>
-<span class="sourceLineNo">4516</span>              verify(wal, times(1)).sync(); // wal syncer calls this one<a name="line.4516"></a>
-<span class="sourceLineNo">4517</span>            }<a name="line.4517"></a>
-<span class="sourceLineNo">4518</span>          } catch (Throwable ignore) {<a name="line.4518"></a>
-<span class="sourceLineNo">4519</span>          }<a name="line.4519"></a>
-<span class="sourceLineNo">4520</span>          return true;<a name="line.4520"></a>
-<span class="sourceLineNo">4521</span>        }<a name="line.4521"></a>
-<span class="sourceLineNo">4522</span>      });<a name="line.4522"></a>
-<span class="sourceLineNo">4523</span>    } else {<a name="line.4523"></a>
-<span class="sourceLineNo">4524</span>      //verify(wal, never()).sync(anyLong());<a name="line.4524"></a>
-<span class="sourceLineNo">4525</span>      verify(wal, never()).sync();<a name="line.4525"></a>
-<span class="sourceLineNo">4526</span>    }<a name="line.4526"></a>
-<span class="sourceLineNo">4527</span><a name="line.4527"></a>
-<span class="sourceLineNo">4528</span>    HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.4528"></a>
-<span class="sourceLineNo">4529</span>    wals.close();<a name="line.4529"></a>
-<span class="sourceLineNo">4530</span>    this.region = null;<a name="line.4530"></a>
-<span class="sourceLineNo">4531</span>  }<a name="line.4531"></a>
-<span class="sourceLineNo">4532</span><a name="line.4532"></a>
-<span class="sourceLineNo">4533</span>  @Test<a name="line.4533"></a>
-<span class="sourceLineNo">4534</span>  public void testRegionReplicaSecondary() throws IOException {<a name="line.4534"></a>
-<span class="sourceLineNo">4535</span>    // create a primary region, load some data and flush<a name="line.4535"></a>
-<span class="sourceLineNo">4536</span>    // create a secondary region, and do a get against that<a name="line.4536"></a>
-<span class="sourceLineNo">4537</span>    Path rootDir = new Path(dir + name.getMethodName());<a name="line.4537"></a>
-<span class="sourceLineNo">4538</span>    FSUtils.setRootDir(TEST_UTIL.getConfiguration(), rootDir);<a name="line.4538"></a>
-<span class="sourceLineNo">4539</span><a name="line.4539"></a>
-<span class="sourceLineNo">4540</span>    byte[][] families = new byte[][] {<a name="line.4540"></a>
-<span class="sourceLineNo">4541</span>        Bytes.toBytes("cf1"), Bytes.toBytes("cf2"), Bytes.toBytes("cf3")<a name="line.4541"></a>
-<span class="sourceLineNo">4542</span>    };<a name="line.4542"></a>
-<span class="sourceLineNo">4543</span>    byte[] cq = Bytes.toBytes("cq");<a name="line.4543"></a>
-<span class="sourceLineNo">4544</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.4544"></a>
-<span class="sourceLineNo">4545</span>    for (byte[] family : families) {<a name="line.4545"></a>
-<span class="sourceLineNo">4546</span>      htd.addFamily(new HColumnDescriptor(family));<a name="line.4546"></a>
-<span class="sourceLineNo">4547</span>    }<a name="line.4547"></a>
-<span class="sourceLineNo">4548</span><a name="line.4548"></a>
-<span class="sourceLineNo">4549</span>    long time = System.currentTimeMillis();<a name="line.4549"></a>
-<span class="sourceLineNo">4550</span>    HRegionInfo primaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4550"></a>
-<span class="sourceLineNo">4551</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4551"></a>
-<span class="sourceLineNo">4552</span>      false, time, 0);<a name="line.4552"></a>
-<span class="sourceLineNo">4553</span>    HRegionInfo secondaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4553"></a>
-<span class="sourceLineNo">4554</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4554"></a>
-<span class="sourceLineNo">4555</span>      false, time, 1);<a name="line.4555"></a>
-<span class="sourceLineNo">4556</span><a name="line.4556"></a>
-<span class="sourceLineNo">4557</span>    HRegion primaryRegion = null, secondaryRegion = null;<a name="line.4557"></a>
+<span class="sourceLineNo">4507</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.4507"></a>
+<span class="sourceLineNo">4508</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.4508"></a>
+<span class="sourceLineNo">4509</span>    put.setDurability(mutationDurability);<a name="line.4509"></a>
+<span class="sourceLineNo">4510</span>    region.put(put);<a name="line.4510"></a>
+<span class="sourceLineNo">4511</span><a name="line.4511"></a>
+<span class="sourceLineNo">4512</span>    //verify append called or not<a name="line.4512"></a>
+<span class="sourceLineNo">4513</span>    verify(wal, expectAppend ? times(1) : never())<a name="line.4513"></a>
+<span class="sourceLineNo">4514</span>      .append((HRegionInfo)any(), (WALKeyImpl)any(),<a name="line.4514"></a>
+<span class="sourceLineNo">4515</span>          (WALEdit)any(), Mockito.anyBoolean());<a name="line.4515"></a>
+<span class="sourceLineNo">4516</span><a name="line.4516"></a>
+<span class="sourceLineNo">4517</span>    // verify sync called or not<a name="line.4517"></a>
+<span class="sourceLineNo">4518</span>    if (expectSync || expectSyncFromLogSyncer) {<a name="line.4518"></a>
+<span class="sourceLineNo">4519</span>      TEST_UTIL.waitFor(timeout, new Waiter.Predicate&lt;Exception&gt;() {<a name="line.4519"></a>
+<span class="sourceLineNo">4520</span>        @Override<a name="line.4520"></a>
+<span class="sourceLineNo">4521</span>        public boolean evaluate() throws Exception {<a name="line.4521"></a>
+<span class="sourceLineNo">4522</span>          try {<a name="line.4522"></a>
+<span class="sourceLineNo">4523</span>            if (expectSync) {<a name="line.4523"></a>
+<span class="sourceLineNo">4524</span>              verify(wal, times(1)).sync(anyLong()); // Hregion calls this one<a name="line.4524"></a>
+<span class="sourceLineNo">4525</span>            } else if (expectSyncFromLogSyncer) {<a name="line.4525"></a>
+<span class="sourceLineNo">4526</span>              verify(wal, times(1)).sync(); // wal syncer calls this one<a name="line.4526"></a>
+<span class="sourceLineNo">4527</span>            }<a name="line.4527"></a>
+<span class="sourceLineNo">4528</span>          } catch (Throwable ignore) {<a name="line.4528"></a>
+<span class="sourceLineNo">4529</span>          }<a name="line.4529"></a>
+<span class="sourceLineNo">4530</span>          return true;<a name="line.4530"></a>
+<span class="sourceLineNo">4531</span>        }<a name="line.4531"></a>
+<span class="sourceLineNo">4532</span>      });<a name="line.4532"></a>
+<span class="sourceLineNo">4533</span>    } else {<a name="line.4533"></a>
+<span class="sourceLineNo">4534</span>      //verify(wal, never()).sync(anyLong());<a name="line.4534"></a>
+<span class="sourceLineNo">4535</span>      verify(wal, never()).sync();<a name="line.4535"></a>
+<span class="sourceLineNo">4536</span>    }<a name="line.4536"></a>
+<span class="sourceLineNo">4537</span><a name="line.4537"></a>
+<span class="sourceLineNo">4538</span>    HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.4538"></a>
+<span class="sourceLineNo">4539</span>    wals.close();<a name="line.4539"></a>
+<span class="sourceLineNo">4540</span>    this.region = null;<a name="line.4540"></a>
+<span class="sourceLineNo">4541</span>  }<a name="line.4541"></a>
+<span class="sourceLineNo">4542</span><a name="line.4542"></a>
+<span class="sourceLineNo">4543</span>  @Test<a name="line.4543"></a>
+<span class="sourceLineNo">4544</span>  public void testRegionReplicaSecondary() throws IOException {<a name="line.4544"></a>
+<span class="sourceLineNo">4545</span>    // create a primary region, load some data and flush<a name="line.4545"></a>
+<span class="sourceLineNo">4546</span>    // create a secondary region, and do a get against that<a name="line.4546"></a>
+<span class="sourceLineNo">4547</span>    Path rootDir = new Path(dir + name.getMethodName());<a name="line.4547"></a>
+<span class="sourceLineNo">4548</span>    FSUtils.setRootDir(TEST_UTIL.getConfiguration(), rootDir);<a name="line.4548"></a>
+<span class="sourceLineNo">4549</span><a name="line.4549"></a>
+<span class="sourceLineNo">4550</span>    byte[][] families = new byte[][] {<a name="line.4550"></a>
+<span class="sourceLineNo">4551</span>        Bytes.toBytes("cf1"), Bytes.toBytes("cf2"), Bytes.toBytes("cf3")<a name="line.4551"></a>
+<span class="sourceLineNo">4552</span>    };<a name="line.4552"></a>
+<span class="sourceLineNo">4553</span>    byte[] cq = Bytes.toBytes("cq");<a name="line.4553"></a>
+<span class="sourceLineNo">4554</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.4554"></a>
+<span class="sourceLineNo">4555</span>    for (byte[] family : families) {<a name="line.4555"></a>
+<span class="sourceLineNo">4556</span>      htd.addFamily(new HColumnDescriptor(family));<a name="line.4556"></a>
+<span class="sourceLineNo">4557</span>    }<a name="line.4557"></a>
 <span class="sourceLineNo">4558</span><a name="line.4558"></a>
-<span class="sourceLineNo">4559</span>    try {<a name="line.4559"></a>
-<span class="sourceLineNo">4560</span>      primaryRegion = HBaseTestingUtility.createRegionAndWAL(primaryHri,<a name="line.4560"></a>
-<span class="sourceLineNo">4561</span>          rootDir, TEST_UTIL.getConfiguration(), htd);<a name="line.4561"></a>
-<span class="sourceLineNo">4562</span><a name="line.4562"></a>
-<span class="sourceLineNo">4563</span>      // load some data<a name="line.4563"></a>
-<span class="sourceLineNo">4564</span>      putData(primaryRegion, 0, 1000, cq, families);<a name="line.4564"></a>
-<span class="sourceLineNo">4565</span><a name="line.4565"></a>
-<span class="sourceLineNo">4566</span>      // flush region<a name="line.4566"></a>
-<span class="sourceLineNo">4567</span>      primaryRegion.flush(true);<a name="line.4567"></a>
+<span class="sourceLineNo">4559</span>    long time = System.currentTimeMillis();<a name="line.4559"></a>
+<span class="sourceLineNo">4560</span>    HRegionInfo primaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4560"></a>
+<span class="sourceLineNo">4561</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4561"></a>
+<span class="sourceLineNo">4562</span>      false, time, 0);<a name="line.4562"></a>
+<span class="sourceLineNo">4563</span>    HRegionInfo secondaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4563"></a>
+<span class="sourceLineNo">4564</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4564"></a>
+<span class="sourceLineNo">4565</span>      false, time, 1);<a name="line.4565"></a>
+<span class="sourceLineNo">4566</span><a name="line.4566"></a>
+<span class="sourceLineNo">4567</span>    HRegion primaryRegion = null, secondaryRegion = null;<a name="line.4567"></a>
 <span class="sourceLineNo">4568</span><a name="line.4568"></a>
-<span class="sourceLineNo">4569</span>      // open secondary region<a name="line.4569"></a>
-<span class="sourceLineNo">4570</span>      secondaryRegion = HRegion.openHRegion(rootDir, secondaryHri, htd, null, CONF);<a name="line.4570"></a>
-<span class="sourceLineNo">4571</span><a name="line.4571"></a>
-<span class="sourceLineNo">4572</span>      verifyData(secondaryRegion, 0, 1000, cq, families);<a name="line.4572"></a>
-<span class="sourceLineNo">4573</span>    } finally {<a name="line.4573"></a>
-<span class="sourceLineNo">4574</span>      if (primaryRegion != null) {<a name="line.4574"></a>
-<span class="sourceLineNo">4575</span>        HBaseTestingUtility.closeRegionAndWAL(primaryRegion);<a name="line.4575"></a>
-<span class="sourceLineNo">4576</span>      }<a name="line.4576"></a>
-<span class="sourceLineNo">4577</span>      if (secondaryRegion != null) {<a name="line.4577"></a>
-<span class="sourceLineNo">4578</span>        HBaseTestingUtility.closeRegionAndWAL(secondaryRegion);<a name="line.4578"></a>
-<span class="sourceLineNo">4579</span>      }<a name="line.4579"></a>
-<span class="sourceLineNo">4580</span>    }<a name="line.4580"></a>
-<span class="sourceLineNo">4581</span>  }<a name="line.4581"></a>
-<span class="sourceLineNo">4582</span><a name="line.4582"></a>
-<span class="sourceLineNo">4583</span>  @Test<a name="line.4583"></a>
-<span class="sourceLineNo">4584</span>  public void testRegionReplicaSecondaryIsReadOnly() throws IOException {<a name="line.4584"></a>
-<span class="sourceLineNo">4585</span>    // create a primary region, load some data and flush<a name="line.4585"></a>
-<span class="sourceLineNo">4586</span>    // create a secondary region, and do a put against that<a name="line.4586"></a>
-<span class="sourceLineNo">4587</span>    Path rootDir = new Path(dir + name.getMethodName());<a name="line.4587"></a>
-<span class="sourceLineNo">4588</span>    FSUtils.setRootDir(TEST_UTIL.getConfiguration(), rootDir);<a name="line.4588"></a>
-<span class="sourceLineNo">4589</span><a name="line.4589"></a>
-<span class="sourceLineNo">4590</span>    byte[][] families = new byte[][] {<a name="line.4590"></a>
-<span class="sourceLineNo">4591</span>        Bytes.toBytes("cf1"), Bytes.toBytes("cf2"), Bytes.toBytes("cf3")<a name="line.4591"></a>
-<span class="sourceLineNo">4592</span>    };<a name="line.4592"></a>
-<span class="sourceLineNo">4593</span>    byte[] cq = Bytes.toBytes("cq");<a name="line.4593"></a>
-<span class="sourceLineNo">4594</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.4594"></a>
-<span class="sourceLineNo">4595</span>    for (byte[] family : families) {<a name="line.4595"></a>
-<span class="sourceLineNo">4596</span>      htd.addFamily(new HColumnDescriptor(family));<a name="line.4596"></a>
-<span class="sourceLineNo">4597</span>    }<a name="line.4597"></a>
-<span class="sourceLineNo">4598</span><a name="line.4598"></a>
-<span class="sourceLineNo">4599</span>    long time = System.currentTimeMillis();<a name="line.4599"></a>
-<span class="sourceLineNo">4600</span>    HRegionInfo primaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4600"></a>
-<span class="sourceLineNo">4601</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4601"></a>
-<span class="sourceLineNo">4602</span>      false, time, 0);<a name="line.4602"></a>
-<span class="sourceLineNo">4603</span>    HRegionInfo secondaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4603"></a>
-<span class="sourceLineNo">4604</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4604"></a>
-<span class="sourceLineNo">4605</span>      false, time, 1);<a name="line.4605"></a>
-<span class="sourceLineNo">4606</span><a name="line.4606"></a>
-<span class="sourceLineNo">4607</span>    HRegion primaryRegion = null, secondaryRegion = null;<a name="line.4607"></a>
+<span class="sourceLineNo">4569</span>    try {<a name="line.4569"></a>
+<span class="sourceLineNo">4570</span>      primaryRegion = HBaseTestingUtility.createRegionAndWAL(primaryHri,<a name="line.4570"></a>
+<span class="sourceLineNo">4571</span>          rootDir, TEST_UTIL.getConfiguration(), htd);<a name="line.4571"></a>
+<span class="sourceLineNo">4572</span><a name="line.4572"></a>
+<span class="sourceLineNo">4573</span>      // load some data<a name="line.4573"></a>
+<span class="sourceLineNo">4574</span>      putData(primaryRegion, 0, 1000, cq, families);<a name="line.4574"></a>
+<span class="sourceLineNo">4575</span><a name="line.4575"></a>
+<span class="sourceLineNo">4576</span>      // flush region<a name="line.4576"></a>
+<span class="sourceLineNo">4577</span>      primaryRegion.flush(true);<a name="line.4577"></a>
+<span class="sourceLineNo">4578</span><a name="line.4578"></a>
+<span class="sourceLineNo">4579</span>      // open secondary region<a name="line.4579"></a>
+<span class="sourceLineNo">4580</span>      secondaryRegion = HRegion.openHRegion(rootDir, secondaryHri, htd, null, CONF);<a name="line.4580"></a>
+<span class="sourceLineNo">4581</span><a name="line.4581"></a>
+<span class="sourceLineNo">4582</span>      verifyData(secondaryRegion, 0, 1000, cq, families);<a name="line.4582"></a>
+<span class="sourceLineNo">4583</span>    } finally {<a name="line.4583"></a>
+<span class="sourceLineNo">4584</span>      if (primaryRegion != null) {<a name="line.4584"></a>
+<span class="sourceLineNo">4585</span>        HBaseTestingUtility.closeRegionAndWAL(primaryRegion);<a name="line.4585"></a>
+<span class="sourceLineNo">4586</span>      }<a name="line.4586"></a>
+<span class="sourceLineNo">4587</span>      if (secondaryRegion != null) {<a name="line.4587"></a>
+<span class="sourceLineNo">4588</span>        HBaseTestingUtility.closeRegionAndWAL(secondaryRegion);<a name="line.4588"></a>
+<span class="sourceLineNo">4589</span>      }<a name="line.4589"></a>
+<span class="sourceLineNo">4590</span>    }<a name="line.4590"></a>
+<span class="sourceLineNo">4591</span>  }<a name="line.4591"></a>
+<span class="sourceLineNo">4592</span><a name="line.4592"></a>
+<span class="sourceLineNo">4593</span>  @Test<a name="line.4593"></a>
+<span class="sourceLineNo">4594</span>  public void testRegionReplicaSecondaryIsReadOnly() throws IOException {<a name="line.4594"></a>
+<span class="sourceLineNo">4595</span>    // create a primary region, load some data and flush<a name="line.4595"></a>
+<span class="sourceLineNo">4596</span>    // create a secondary region, and do a put against that<a name="line.4596"></a>
+<span class="sourceLineNo">4597</span>    Path rootDir = new Path(dir + name.getMethodName());<a name="line.4597"></a>
+<span class="sourceLineNo">4598</span>    FSUtils.setRootDir(TEST_UTIL.getConfiguration(), rootDir);<a name="line.4598"></a>
+<span class="sourceLineNo">4599</span><a name="line.4599"></a>
+<span class="sourceLineNo">4600</span>    byte[][] families = new byte[][] {<a name="line.4600"></a>
+<span class="sourceLineNo">4601</span>        Bytes.toBytes("cf1"), Bytes.toBytes("cf2"), Bytes.toBytes("cf3")<a name="line.4601"></a>
+<span class="sourceLineNo">4602</span>    };<a name="line.4602"></a>
+<span class="sourceLineNo">4603</span>    byte[] cq = Bytes.toBytes("cq");<a name="line.4603"></a>
+<span class="sourceLineNo">4604</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.4604"></a>
+<span class="sourceLineNo">4605</span>    for (byte[] family : families) {<a name="line.4605"></a>
+<span class="sourceLineNo">4606</span>      htd.addFamily(new HColumnDescriptor(family));<a name="line.4606"></a>
+<span class="sourceLineNo">4607</span>    }<a name="line.4607"></a>
 <span class="sourceLineNo">4608</span><a name="line.4608"></a>
-<span class="sourceLineNo">4609</span>    try {<a name="line.4609"></a>
-<span class="sourceLineNo">4610</span>      primaryRegion = HBaseTestingUtility.createRegionAndWAL(primaryHri,<a name="line.4610"></a>
-<span class="sourceLineNo">4611</span>          rootDir, TEST_UTIL.getConfiguration(), htd);<a name="line.4611"></a>
-<span class="sourceLineNo">4612</span><a name="line.4612"></a>
-<span class="sourceLineNo">4613</span>      // load some data<a name="line.4613"></a>
-<span class="sourceLineNo">4614</span>      putData(primaryRegion, 0, 1000, cq, families);<a name="line.4614"></a>
-<span class="sourceLineNo">4615</span><a name="line.4615"></a>
-<span class="sourceLineNo">4616</span>      // flush region<a name="line.4616"></a>
-<span class="sourceLineNo">4617</span>      primaryRegion.flush(true);<a name="line.4617"></a>
+<span class="sourceLineNo">4609</span>    long time = System.currentTimeMillis();<a name="line.4609"></a>
+<span class="sourceLineNo">4610</span>    HRegionInfo primaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4610"></a>
+<span class="sourceLineNo">4611</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4611"></a>
+<span class="sourceLineNo">4612</span>      false, time, 0);<a name="line.4612"></a>
+<span class="sourceLineNo">4613</span>    HRegionInfo secondaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4613"></a>
+<span class="sourceLineNo">4614</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4614"></a>
+<span class="sourceLineNo">4615</span>      false, time, 1);<a name="line.4615"></a>
+<span class="sourceLineNo">4616</span><a name="line.4616"></a>
+<span class="sourceLineNo">4617</span>    HRegion primaryRegion = null, secondaryRegion = null;<a name="line.4617"></a>
 <span class="sourceLineNo">4618</span><a name="line.4618"></a>
-<span class="sourceLineNo">4619</span>      // open secondary region<a name="line.4619"></a>
-<span class="sourceLineNo">4620</span>      secondaryRegion = HRegion.openHRegion(rootDir, secondaryHri, htd, null, CONF);<a name="line.4620"></a>
-<span class="sourceLineNo">4621</span><a name="line.4621"></a>
-<span class="sourceLineNo">4622</span>      try {<a name="line.4622"></a>
-<span class="sourceLineNo">4623</span>        putData(secondaryRegion, 0, 1000, cq, families);<a name="line.4623"></a>
-<span class="sourceLineNo">4624</span>        fail("Should have thrown exception");<a name="line.4624"></a>
-<span class="sourceLineNo">4625</span>      } catch (IOException ex) {<a name="line.4625"></a>
-<span class="sourceLineNo">4626</span>        // expected<a name="line.4626"></a>
-<span class="sourceLineNo">4627</span>      }<a name="line.4627"></a>
-<span class="sourceLineNo">4628</span>    } finally {<a name="line.4628"></a>
-<span class="sourceLineNo">4629</span>      if (primaryRegion != null) {<a name="line.4629"></a>
-<span class="sourceLineNo">4630</span>        HBaseTestingUtility.closeRegionAndWAL(primaryRegion);<a name="line.4630"></a>
-<span class="sourceLineNo">4631</span>      }<a name="line.4631"></a>
-<span class="sourceLineNo">4632</span>      if (secondaryRegion != null) {<a name="line.4632"></a>
-<span class="sourceLineNo">4633</span>        HBaseTestingUtility.closeRegionAndWAL(secondaryRegion);<a name="line.4633"></a>
-<span class="sourceLineNo">4634</span>      }<a name="line.4634"></a>
-<span class="sourceLineNo">4635</span>    }<a name="line.4635"></a>
-<span class="sourceLineNo">4636</span>  }<a name="line.4636"></a>
-<span class="sourceLineNo">4637</span><a name="line.4637"></a>
-<span class="sourceLineNo">4638</span>  static WALFactory createWALFactory(Configuration conf, Path rootDir) throws IOException {<a name="line.4638"></a>
-<span class="sourceLineNo">4639</span>    Configuration confForWAL = new Configuration(conf);<a name="line.4639"></a>
-<span class="sourceLineNo">4640</span>    confForWAL.set(HConstants.HBASE_DIR, rootDir.toString());<a name="line.4640"></a>
-<span class="sourceLineNo">4641</span>    return new WALFactory(confForWAL, "hregion-" + RandomStringUtils.randomNumeric(8));<a name="line.4641"></a>
-<span class="sourceLineNo">4642</span>  }<a name="line.4642"></a>
-<span class="sourceLineNo">4643</span><a name="line.4643"></a>
-<span class="sourceLineNo">4644</span>  @Test<a name="line.4644"></a>
-<span class="sourceLineNo">4645</span>  public void testCompactionFromPrimary() throws IOException {<a name="line.4645"></a>
-<span class="sourceLineNo">4646</span>    Path rootDir = new Path(dir + name.getMethodName());<a name="line.4646"></a>
-<span class="sourceLineNo">4647</span>    FSUtils.setRootDir(TEST_UTIL.getConfiguration(), rootDir);<a name="line.4647"></a>
-<span class="sourceLineNo">4648</span><a name="line.4648"></a>
-<span class="sourceLineNo">4649</span>    byte[][] families = new byte[][] {<a name="line.4649"></a>
-<span class="sourceLineNo">4650</span>        Bytes.toBytes("cf1"), Bytes.toBytes("cf2"), Bytes.toBytes("cf3")<a name="line.4650"></a>
-<span class="sourceLineNo">4651</span>    };<a name="line.4651"></a>
-<span class="sourceLineNo">4652</span>    byte[] cq = Bytes.toBytes("cq");<a name="line.4652"></a>
-<span class="sourceLineNo">4653</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.4653"></a>
-<span class="sourceLineNo">4654</span>    for (byte[] family : families) {<a name="line.4654"></a>
-<span class="sourceLineNo">4655</span>      htd.addFamily(new HColumnDescriptor(family));<a name="line.4655"></a>
-<span class="sourceLineNo">4656</span>    }<a name="line.4656"></a>
-<span class="sourceLineNo">4657</span><a name="line.4657"></a>
-<span class="sourceLineNo">4658</span>    long time = System.currentTimeMillis();<a name="line.4658"></a>
-<span class="sourceLineNo">4659</span>    HRegionInfo primaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4659"></a>
-<span class="sourceLineNo">4660</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4660"></a>
-<span class="sourceLineNo">4661</span>      false, time, 0);<a name="line.4661"></a>
-<span class="sourceLineNo">4662</span>    HRegionInfo secondaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4662"></a>
-<span class="sourceLineNo">4663</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4663"></a>
-<span class="sourceLineNo">4664</span>      false, time, 1);<a name="line.4664"></a>
-<span class="sourceLineNo">4665</span><a name="line.4665"></a>
-<span class="sourceLineNo">4666</span>    HRegion primaryRegion = null, secondaryRegion = null;<a name="line.4666"></a>
+<span class="sourceLineNo">4619</span>    try {<a name="line.4619"></a>
+<span class="sourceLineNo">4620</span>      primaryRegion = HBaseTestingUtility.createRegionAndWAL(primaryHri,<a name="line.4620"></a>
+<span class="sourceLineNo">4621</span>          rootDir, TEST_UTIL.getConfiguration(), htd);<a name="line.4621"></a>
+<span class="sourceLineNo">4622</span><a name="line.4622"></a>
+<span class="sourceLineNo">4623</span>      // load some data<a name="line.4623"></a>
+<span class="sourceLineNo">4624</span>      putData(primaryRegion, 0, 1000, cq, families);<a name="line.4624"></a>
+<span class="sourceLineNo">4625</span><a name="line.4625"></a>
+<span class="sourceLineNo">4626</span>      // flush region<a name="line.4626"></a>
+<span class="sourceLineNo">4627</span>      primaryRegion.flush(true);<a name="line.4627"></a>
+<span class="sourceLineNo">4628</span><a name="line.4628"></a>
+<span class="sourceLineNo">4629</span>      // open secondary region<a name="line.4629"></a>
+<span class="sourceLineNo">4630</span>      secondaryRegion = HRegion.openHRegion(rootDir, secondaryHri, htd, null, CONF);<a name="line.4630"></a>
+<span class="sourceLineNo">4631</span><a name="line.4631"></a>
+<span class="sourceLineNo">4632</span>      try {<a name="line.4632"></a>
+<span class="sourceLineNo">4633</span>        putData(secondaryRegion, 0, 1000, cq, families);<a name="line.4633"></a>
+<span class="sourceLineNo">4634</span>        fail("Should have thrown exception");<a name="line.4634"></a>
+<span class="sourceLineNo">4635</span>      } catch (IOException ex) {<a name="line.4635"></a>
+<span class="sourceLineNo">4636</span>        // expected<a name="line.4636"></a>
+<span class="sourceLineNo">4637</span>      }<a name="line.4637"></a>
+<span class="sourceLineNo">4638</span>    } finally {<a name="line.4638"></a>
+<span class="sourceLineNo">4639</span>      if (primaryRegion != null) {<a name="line.4639"></a>
+<span class="sourceLineNo">4640</span>        HBaseTestingUtility.closeRegionAndWAL(primaryRegion);<a name="line.4640"></a>
+<span class="sourceLineNo">4641</span>      }<a name="line.4641"></a>
+<span class="sourceLineNo">4642</span>      if (secondaryRegion != null) {<a name="line.4642"></a>
+<span class="sourceLineNo">4643</span>        HBaseTestingUtility.closeRegionAndWAL(secondaryRegion);<a name="line.4643"></a>
+<span class="sourceLineNo">4644</span>      }<a name="line.4644"></a>
+<span class="sourceLineNo">4645</span>    }<a name="line.4645"></a>
+<span class="sourceLineNo">4646</span>  }<a name="line.4646"></a>
+<span class="sourceLineNo">4647</span><a name="line.4647"></a>
+<span class="sourceLineNo">4648</span>  static WALFactory createWALFactory(Configuration conf, Path rootDir) throws IOException {<a name="line.4648"></a>
+<span class="sourceLineNo">4649</span>    Configuration confForWAL = new Configuration(conf);<a name="line.4649"></a>
+<span class="sourceLineNo">4650</span>    confForWAL.set(HConstants.HBASE_DIR, rootDir.toString());<a name="line.4650"></a>
+<span class="sourceLineNo">4651</span>    return new WALFactory(confForWAL, "hregion-" + RandomStringUtils.randomNumeric(8));<a name="line.4651"></a>
+<span class="sourceLineNo">4652</span>  }<a name="line.4652"></a>
+<span class="sourceLineNo">4653</span><a name="line.4653"></a>
+<span class="sourceLineNo">4654</span>  @Test<a name="line.4654"></a>
+<span class="sourceLineNo">4655</span>  public void testCompactionFromPrimary() throws IOException {<a name="line.4655"></a>
+<span class="sourceLineNo">4656</span>    Path rootDir = new Path(dir + name.getMethodName());<a name="line.4656"></a>
+<span class="sourceLineNo">4657</span>    FSUtils.setRootDir(TEST_UTIL.getConfiguration(), rootDir);<a name="line.4657"></a>
+<span class="sourceLineNo">4658</span><a name="line.4658"></a>
+<span class="sourceLineNo">4659</span>    byte[][] families = new byte[][] {<a name="line.4659"></a>
+<span class="sourceLineNo">4660</span>        Bytes.toBytes("cf1"), Bytes.toBytes("cf2"), Bytes.toBytes("cf3")<a name="line.4660"></a>
+<span class="sourceLineNo">4661</span>    };<a name="line.4661"></a>
+<span class="sourceLineNo">4662</span>    byte[] cq = Bytes.toBytes("cq");<a name="line.4662"></a>
+<span class="sourceLineNo">4663</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.4663"></a>
+<span class="sourceLineNo">4664</span>    for (byte[] family : families) {<a name="line.4664"></a>
+<span class="sourceLineNo">4665</span>      htd.addFamily(new HColumnDescriptor(family));<a name="line.4665"></a>
+<span class="sourceLineNo">4666</span>    }<a name="line.4666"></a>
 <span class="sourceLineNo">4667</span><a name="line.4667"></a>
-<span class="sourceLineNo">4668</span>    try {<a name="line.4668"></a>
-<span class="sourceLineNo">4669</span>      primaryRegion = HBaseTestingUtility.createRegionAndWAL(primaryHri,<a name="line.4669"></a>
-<span class="sourceLineNo">4670</span>          rootDir, TEST_UTIL.getConfiguration(), htd);<a name="line.4670"></a>
-<span class="sourceLineNo">4671</span><a name="line.4671"></a>
-<span class="sourceLineNo">4672</span>      // load some data<a name="line.4672"></a>
-<span class="sourceLineNo">4673</span>      putData(primaryRegion, 0, 1000, cq, families);<a name="line.4673"></a>
-<span class="sourceLineNo">4674</span><a name="line.4674"></a>
-<span class="sourceLineNo">4675</span>      // flush region<a name="line.4675"></a>
-<span class="sourceLineNo">4676</span>      primaryRegion.flush(true);<a name="line.4676"></a>
+<span class="sourceLineNo">4668</span>    long time = System.currentTimeMillis();<a name="line.4668"></a>
+<span class="sourceLineNo">4669</span>    HRegionInfo primaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4669"></a>
+<span class="sourceLineNo">4670</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4670"></a>
+<span class="sourceLineNo">4671</span>      false, time, 0);<a name="line.4671"></a>
+<span class="sourceLineNo">4672</span>    HRegionInfo secondaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4672"></a>
+<span class="sourceLineNo">4673</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4673"></a>
+<span class="sourceLineNo">4674</span>      false, time, 1);<a name="line.4674"></a>
+<span class="sourceLineNo">4675</span><a name="line.4675"></a>
+<span class="sourceLineNo">4676</span>    HRegion primaryRegion = null, secondaryRegion = null;<a name="line.4676"></a>
 <span class="sourceLineNo">4677</span><a name="line.4677"></a>
-<span class="sourceLineNo">4678</span>      // open secondary region<a name="line.4678"></a>
-<span class="sourceLineNo">4679</span>      secondaryRegion = HRegion.openHRegion(rootDir, secondaryHri, htd, null, CONF);<a name="line.4679"></a>
-<span class="sourceLineNo">4680</span><a name="line.4680"></a>
-<span class="sourceLineNo">4681</span>      // move the file of the primary region to the archive, simulating a compaction<a name="line.4681"></a>
-<span class="sourceLineNo">4682</span>      Collection&lt;HStoreFile&gt; storeFiles = primaryRegion.getStore(families[0]).getStorefiles();<a name="line.4682"></a>
-<span class="sourceLineNo">4683</span>      primaryRegion.getRegionFileSystem().removeStoreFiles(Bytes.toString(families[0]), storeFiles);<a name="line.4683"></a>
-<span class="sourceLineNo">4684</span>      Collection&lt;StoreFileInfo&gt; storeFileInfos = primaryRegion.getRegionFileSystem()<a name="line.4684"></a>
-<span class="sourceLineNo">4685</span>          .getStoreFiles(families[0]);<a name="line.4685"></a>
-<span class="sourceLineNo">4686</span>      Assert.assertTrue(storeFileInfos == null || storeFileInfos.isEmpty());<a name="line.4686"></a>
+<span class="sourceLineNo">4678</span>    try {<a name="line.4678"></a>
+<span class="sourceLineNo">4679</span>      primaryRegion = HBaseTestingUtility.createRegionAndWAL(primaryHri,<a name="line.4679"></a>
+<span class="sourceLineNo">4680</span>          rootDir, TEST_UTIL.getConfiguration(), htd);<a name="line.4680"></a>
+<span class="sourceLineNo">4681</span><a name="line.4681"></a>
+<span class="sourceLineNo">4682</span>      // load some data<a name="line.4682"></a>
+<span class="sourceLineNo">4683</span>      putData(primaryRegion, 0, 1000, cq, families);<a name="line.4683"></a>
+<span class="sourceLineNo">4684</span><a name="line.4684"></a>
+<span class="sourceLineNo">4685</span>      // flush region<a name="line.4685"></a>
+<span class="sourceLineNo">4686</span>      primaryRegion.flush(true);<a name="line.4686"></a>
 <span class="sourceLineNo">4687</span><a name="line.4687"></a>
-<span class="sourceLineNo">4688</span>      verifyData(secondaryRegion, 0, 1000, cq, families);<a name="line.4688"></a>
-<span class="sourceLineNo">4689</span>    } finally {<a name="line.4689"></a>
-<span class="sourceLineNo">4690</span>      if (primaryRegion != null) {<a name="line.4690"></a>
-<span class="sourceLineNo">4691</span>        HBaseTestingUtility.closeRegionAndWAL(primaryRegion);<a name="line.4691"></a>
-<span class="sourceLineNo">4692</span>      }<a name="line.4692"></a>
-<span class="sourceLineNo">4693</span>      if (secondaryRegion != null) {<a name="line.4693"></a>
-<span class="sourceLineNo">4694</span>        HBaseTestingUtility.closeRegionAndWAL(secondaryRegion);<a name="line.4694"></a>
-<span class="sourceLineNo">4695</span>      }<a name="line.4695"></a>
-<span class="sourceLineNo">4696</span>    }<a name="line.4696"></a>
-<span class="sourceLineNo">4697</span>  }<a name="line.4697"></a>
-<span class="sourceLineNo">4698</span><a name="line.4698"></a>
-<span class="sourceLineNo">4699</span>  private void putData(int startRow, int numRows, byte[] qf, byte[]... families) throws<a name="line.4699"></a>
-<span class="sourceLineNo">4700</span>      IOException {<a name="line.4700"></a>
-<span class="sourceLineNo">4701</span>    putData(this.region, startRow, numRows, qf, families);<a name="line.4701"></a>
-<span class="sourceLineNo">4702</span>  }<a name="line.4702"></a>
-<span class="sourceLineNo">4703</span><a name="line.4703"></a>
-<span class="sourceLineNo">4704</span>  private void putData(HRegion region,<a name="line.4704"></a>
-<span class="sourceLineNo">4705</span>      int startRow, int numRows, byte[] qf, byte[]... families) throws IOException {<a name="line.4705"></a>
-<span class="sourceLineNo">4706</span>    putData(region, Durability.SKIP_WAL, startRow, numRows, qf, families);<a name="line.4706"></a>
+<span class="sourceLineNo">4688</span>      // open secondary region<a name="line.4688"></a>
+<span class="sourceLineNo">4689</span>      secondaryRegion = HRegion.openHRegion(rootDir, secondaryHri, htd, null, CONF);<a name="line.4689"></a>
+<span class="sourceLineNo">4690</span><a name="line.4690"></a>
+<span class="sourceLineNo">4691</span>      // move the file of the primary region to the archive, simulating a compaction<a name="line.4691"></a>
+<span class="sourceLineNo">4692</span>      Collection&lt;HStoreFile&gt; storeFiles = primaryRegion.getStore(families[0]).getStorefiles();<a name="line.4692"></a>
+<span class="sourceLineNo">4693</span>      primaryRegion.getRegionFileSystem().removeStoreFiles(Bytes.toString(families[0]), storeFiles);<a name="line.4693"></a>
+<span class="sourceLineNo">4694</span>      Collection&lt;StoreFileInfo&gt; storeFileInfos = primaryRegion.getRegionFileSystem()<a name="line.4694"></a>
+<span class="sourceLineNo">4695</span>          .getStoreFiles(families[0]);<a name="line.4695"></a>
+<span class="sourceLineNo">4696</span>      Assert.assertTrue(storeFileInfos == null || storeFileInfos.isEmpty());<a name="line.4696"></a>
+<span class="sourceLineNo">4697</span><a name="line.4697"></a>
+<span class="sourceLineNo">4698</span>      verifyData(secondaryRegion, 0, 1000, cq, families);<a name="line.4698"></a>
+<span class="sourceLineNo">4699</span>    } finally {<a name="line.4699"></a>
+<span class="sourceLineNo">4700</span>      if (primaryRegion != null) {<a name="line.4700"></a>
+<span class="sourceLineNo">4701</span>        HBaseTestingUtility.closeRegionAndWAL(primaryRegion);<a name="line.4701"></a>
+<span class="sourceLineNo">4702</span>      }<a name="line.4702"></a>
+<span class="sourceLineNo">4703</span>      if (secondaryRegion != null) {<a name="line.4703"></a>
+<span class="sourceLineNo">4704</span>        HBaseTestingUtility.closeRegionAndWAL(secondaryRegion);<a name="line.4704"></a>
+<span class="sourceLineNo">4705</span>      }<a name="line.4705"></a>
+<span class="sourceLineNo">4706</span>    }<a name="line.4706"></a>
 <span class="sourceLineNo">4707</span>  }<a name="line.4707"></a>
 <span class="sourceLineNo">4708</span><a name="line.4708"></a>
-<span class="sourceLineNo">4709</span>  static void putData(HRegion region, Durability durability,<a name="line.4709"></a>
-<span class="sourceLineNo">4710</span>      int startRow, int numRows, byte[] qf, byte[]... families) throws IOException {<a name="line.4710"></a>
-<span class="sourceLineNo">4711</span>    for (int i = startRow; i &lt; startRow + numRows; i++) {<a name="line.4711"></a>
-<span class="sourceLineNo">4712</span>      Put put = new Put(Bytes.toBytes("" + i));<a name="line.4712"></a>
-<span class="sourceLineNo">4713</span>      put.setDurability(durability);<a name="line.4713"></a>
-<span class="sourceLineNo">4714</span>      for (byte[] family : families) {<a name="line.4714"></a>
-<span class="sourceLineNo">4715</span>        put.addColumn(family, qf, null);<a name="line.4715"></a>
-<span class="sourceLineNo">4716</span>      }<a name="line.4716"></a>
-<span class="sourceLineNo">4717</span>      region.put(put);<a name="line.4717"></a>
-<span class="sourceLineNo">4718</span>      LOG.info(put.toString());<a name="line.4718"></a>
-<span class="sourceLineNo">4719</span>    }<a name="line.4719"></a>
-<span class="sourceLineNo">4720</span>  }<a name="line.4720"></a>
-<span class="sourceLineNo">4721</span><a name="line.4721"></a>
-<span class="sourceLineNo">4722</span>  static void verifyData(HRegion newReg, int startRow, int numRows, byte[] qf, byte[]... families)<a name="line.4722"></a>
-<span class="sourceLineNo">4723</span>      throws IOException {<a name="line.4723"></a>
-<span class="sourceLineNo">4724</span>    for (int i = startRow; i &lt; startRow + numRows; i++) {<a name="line.4724"></a>
-<span class="sourceLineNo">4725</span>      byte[] row = Bytes.toBytes("" + i);<a name="line.4725"></a>
-<span class="sourceLineNo">4726</span>      Get get = new Get(row);<a name="line.4726"></a>
-<span class="sourceLineNo">4727</span>      for (byte[] family : families) {<a name="line.4727"></a>
-<span class="sourceLineNo">4728</span>        get.addColumn(family, qf);<a name="line.4728"></a>
-<span class="sourceLineNo">4729</span>      }<a name="line.4729"></a>
-<span class="sourceLineNo">4730</span>      Result result = newReg.get(get);<a name="line.4730"></a>
-<span class="sourceLineNo">4731</span>      Cell[] raw = result.rawCells();<a name="line.4731"></a>
-<span class="sourceLineNo">4732</span>      assertEquals(families.length, result.size());<a name="line.4732"></a>
-<span class="sourceLineNo">4733</span>      for (int j = 0; j &lt; families.length; j++) {<a name="line.4733"></a>
-<span class="sourceLineNo">4734</span>        assertTrue(CellUtil.matchingRows(raw[j], row));<a name="line.4734"></a>
-<span class="sourceLineNo">4735</span>        assertTrue(CellUtil.matchingFamily(raw[j], families[j]));<a name="line.4735"></a>
-<span class="sourceLineNo">4736</span>        assertTrue(CellUtil.matchingQualifier(raw[j], qf));<a name="line.4736"></a>
-<span class="sourceLineNo">4737</span>      }<a name="line.4737"></a>
-<span class="sourceLineNo">4738</span>    }<a name="line.4738"></a>
-<span class="sourceLineNo">4739</span>  }<a name="line.4739"></a>
-<span class="sourceLineNo">4740</span><a name="line.4740"></a>
-<span class="sourceLineNo">4741</span>  static void assertGet(final HRegion r, final byte[] family, final byte[] k) throws IOException {<a name="line.4741"></a>
-<span class="sourceLineNo">4742</span>    // Now I have k, get values out and assert they are as expected.<a name="line.4742"></a>
-<span class="sourceLineNo">4743</span>    Get get = new Get(k).addFamily(family).readAllVersions();<a name="line.4743"></a>
-<span class="sourceLineNo">4744</span>    Cell[] results = r.get(get).rawCells();<a name="line.4744"></a>
-<span class="sourceLineNo">4745</span>    for (int j = 0; j &lt; results.length; j++) {<a name="line.4745"></a>
-<span class="sourceLineNo">4746</span>      byte[] tmp = CellUtil.cloneValue(results[j]);<a name="line.4746"></a>
-<span class="sourceLineNo">4747</span>      // Row should be equal to value every time.<a name="line.4747"></a>
-<span class="sourceLineNo">4748</span>      assertTrue(Bytes.equals(k, tmp));<a name="line.4748"></a>
-<span class="sourceLineNo">4749</span>    }<a name="line.4749"></a>
-<span class="sourceLineNo">4750</span>  }<a name="line.4750"></a>
-<span class="sourceLineNo">4751</span><a name="line.4751"></a>
-<span class="sourceLineNo">4752</span>  /*<a name="line.4752"></a>
-<span class="sourceLineNo">4753</span>   * Assert first value in the passed region is &lt;code&gt;firstValue&lt;/code&gt;.<a name="line.4753"></a>
-<span class="sourceLineNo">4754</span>   *<a name="line.4754"></a>
-<span class="sourceLineNo">4755</span>   * @param r<a name="line.4755"></a>
-<span class="sourceLineNo">4756</span>   *<a name="line.4756"></a>
-<span class="sourceLineNo">4757</span>   * @param fs<a name="line.4757"></a>
-<span class="sourceLineNo">4758</span>   *<a name="line.4758"></a>
-<span class="sourceLineNo">4759</span>   * @param firstValue<a name="line.4759"></a>
-<span class="sourceLineNo">4760</span>   *<a name="line.4760"></a>
-<span class="sourceLineNo">4761</span>   * @throws IOException<a name="line.4761"></a>
-<span class="sourceLineNo">4762</span>   */<a name="line.4762"></a>
-<span class="sourceLineNo">4763</span>  protected void assertScan(final HRegion r, final byte[] fs, final byte[] firstValue)<a name="line.4763"></a>
-<span class="sourceLineNo">4764</span>      throws IOException {<a name="line.4764"></a>
-<span class="sourceLineNo">4765</span>    byte[][] families = { fs };<a name="line.4765"></a>
-<span class="sourceLineNo">4766</span>    Scan scan = new Scan();<a name="line.4766"></a>
-<span class="sourceLineNo">4767</span>    for (int i = 0; i &lt; families.length; i++)<a name="line.4767"></a>
-<span class="sourceLineNo">4768</span>      scan.addFamily(families[i]);<a name="line.4768"></a>
-<span class="sourceLineNo">4769</span>    InternalScanner s = r.getScanner(scan);<a name="line.4769"></a>
-<span class="sourceLineNo">4770</span>    try {<a name="line.4770"></a>
-<span class="sourceLineNo">4771</span>      List&lt;Cell&gt; curVals = new ArrayList&lt;&gt;();<a name="line.4771"></a>
-<span class="sourceLineNo">4772</span>      boolean first = true;<a name="line.4772"></a>
-<span class="sourceLineNo">4773</span>      OUTER_LOOP: while (s.next(curVals)) {<a name="line.4773"></a>
-<span class="sourceLineNo">4774</span>        for (Cell kv : curVals) {<a name="line.4774"></a>
-<span class="sourceLineNo">4775</span>          byte[] val = CellUtil.cloneValue(kv);<a name="line.4775"></a>
-<span class="sourceLineNo">4776</span>          byte[] curval = val;<a name="line.4776"></a>
-<span class="sourceLineNo">4777</span>          if (first) {<a name="line.4777"></a>
-<span class="sourceLineNo">4778</span>            first = false;<a name="line.4778"></a>
-<span class="sourceLineNo">4779</span>            assertTrue(Bytes.compareTo(curval, firstValue) == 0);<a name="line.4779"></a>
-<span class="sourceLineNo">4780</span>          } else {<a name="line.4780"></a>
-<span class="sourceLineNo">4781</span>            // Not asserting anything. Might as well break.<a name="line.4781"></a>
-<span class="sourceLineNo">4782</span>            break OUTER_LOOP;<a name="line.4782"></a>
-<span class="sourceLineNo">4783</span>          }<a name="line.4783"></a>
-<span class="sourceLineNo">4784</span>        }<a name="line.4784"></a>
-<span class="sourceLineNo">4785</span>      }<a name="line.4785"></a>
-<span class="sourceLineNo">4786</span>    } finally {<a name="line.4786"></a>
-<span class="sourceLineNo">4787</span>      s.close();<a name="line.4787"></a>
-<span class="sourceLineNo">4788</span>    }<a name="line.4788"></a>
-<span class="sourceLineNo">4789</span>  }<a name="line.4789"></a>
-<span class="sourceLineNo">4790</span><a name="line.4790"></a>
-<span class="sourceLineNo">4791</span>  /**<a name="line.4791"></a>
-<span class="sourceLineNo">4792</span>   * Test that we get the expected flush results back<a name="line.4792"></a>
-<span class="sourceLineNo">4793</span>   */<a name="line.4793"></a>
-<span class="sourceLineNo">4794</span>  @Test<a name="line.4794"></a>
-<span class="sourceLineNo">4795</span>  public void testFlushResult() throws IOException {<a name="line.4795"></a>
-<span class="sourceLineNo">4796</span>    byte[] family = Bytes.toBytes("family");<a name="line.4796"></a>
-<span class="sourceLineNo">4797</span><a name="line.4797"></a>
-<span class="sourceLineNo">4798</span>    this.region = initHRegion(tableName, method, family);<a name="line.4798"></a>
-<span class="sourceLineNo">4799</span><a name="line.4799"></a>
-<span class="sourceLineNo">4800</span>    // empty memstore, flush doesn't run<a name="line.4800"></a>
-<span class="sourceLineNo">4801</span>    HRegion.FlushResult fr = region.flush(true);<a name="line.4801"></a>
-<span class="sourceLineNo">4802</span>    assertFalse(fr.isFlushSucceeded());<a name="line.4802"></a>
-<span class="sourceLineNo">4803</span>    assertFalse(fr.isCompactionNeeded());<a name="line.4803"></a>
-<span class="sourceLineNo">4804</span><a name="line.4804"></a>
-<span class="sourceLineNo">4805</span>    // Flush enough files to get up to the threshold, doesn't need compactions<a name="line.4805"></a>
-<span class="sourceLineNo">4806</span>    for (int i = 0; i &lt; 2; i++) {<a name="line.4806"></a>
-<span class="sourceLineNo">4807</span>      Put put = new Put(tableName.toBytes()).addColumn(family, family, tableName.toBytes());<a name="line.4807"></a>
-<span class="sourceLineNo">4808</span>      region.put(put);<a name="line.4808"></a>
-<span class="sourceLineNo">4809</span>      fr = region.flush(true);<a name="line.4809"></a>
-<span class="sourceLineNo">4810</span>      assertTrue(fr.isFlushSucceeded());<a name="line.4810"></a>
-<span class="sourceLineNo">4811</span>      assertFalse(fr.isCompactionNeeded());<a name="line.4811"></a>
-<span class="sourceLineNo">4812</span>    }<a name="line.4812"></a>
-<span class="sourceLineNo">4813</span><a name="line.4813"></a>
-<span class="sourceLineNo">4814</span>    // Two flushes after the threshold, compactions are needed<a name="line.4814"></a>
-<span class="sourceLineNo">4815</span>    for (int i = 0; i &lt; 2; i++) {<a name="line.4815"></a>
-<span class="sourceLineNo">4816</span>      Put put = new Put(tableName.toBytes()).addColumn(family, family, tableName.toBytes());<a name="line.4816"></a>
-<span class="sourceLineNo">4817</span>      region.put(put);<a name="line.4817"></a>
-<span class="sourceLineNo">4818</span>      fr = region.flush(true);<a name="line.4818"></a>
-<span class="sourceLineNo">4819</span>      assertTrue(fr.isFlushSucceeded());<a name="line.4819"></a>
-<span class="sourceLineNo">4820</span>      assertTrue(fr.isCompactionNeeded());<a name="line.4820"></a>
-<span class="sourceLineNo">4821</span>    }<a name="line.4821"></a>
-<span class="sourceLineNo">4822</span>  }<a name="line.4822"></a>
+<span class="sourceLineNo">4709</span>  private void putData(int startRow, int numRows, byte[] qf, byte[]... families) throws<a name="line.4709"></a>
+<span class="sourceLineNo">4710</span>      IOException {<a name="line.4710"></a>
+<span class="sourceLineNo">4711</span>    putData(this.region, startRow, numRows, qf, families);<a name="line.4711"></a>
+<span class="sourceLineNo">4712</span>  }<a name="line.4712"></a>
+<span class="sourceLineNo">4713</span><a name="line.4713"></a>
+<span class="sourceLineNo">4714</span>  private void putData(HRegion region,<a name="line.4714"></a>
+<span class="sourceLineNo">4715</span>      int startRow, int numRows, byte[] qf, byte[]... families) throws IOException {<a name="line.4715"></a>
+<span class="sourceLineNo">4716</span>    putData(region, Durability.SKIP_WAL, startRow, numRows, qf, families);<a name="line.4716"></a>
+<span class="sourceLineNo">4717</span>  }<a name="line.4717"></a>
+<span class="sourceLineNo">4718</span><a name="line.4718"></a>
+<span class="sourceLineNo">4719</span>  static void putData(HRegion region, Durability durability,<a name="line.4719"></a>
+<span class="sourceLineNo">4720</span>      int startRow, int numRows, byte[] qf, byte[]... families) throws IOException {<a name="line.4720"></a>
+<span class="sourceLineNo">4721</span>    for (int i = startRow; i &lt; startRow + numRows; i++) {<a name="line.4721"></a>
+<span class="sourceLineNo">4722</span>      Put put = new Put(Bytes.toBytes("" + i));<a name="line.4722"></a>
+<span class="sourceLineNo">4723</span>      put.setDurability(durability);<a name="line.4723"></a>
+<span class="sourceLineNo">4724</span>      for (byte[] family : families) {<a name="line.4724"></a>
+<span class="sourceLineNo">4725</span>        put.addColumn(family, qf, null);<a name="line.4725"></a>
+<span class="sourceLineNo">4726</span>      }<a name="line.4726"></a>
+<span class="sourceLineNo">4727</span>      region.put(put);<a name="line.4727"></a>
+<span class="sourceLineNo">4728</span>      LOG.info(put.toString());<a name="line.4728"></a>
+<span class="sourceLineNo">4729</span>    }<a name="line.4729"></a>
+<span class="sourceLineNo">4730</span>  }<a name="line.4730"></a>
+<span class="sourceLineNo">4731</span><a name="line.4731"></a>
+<span class="sourceLineNo">4732</span>  static void verifyData(HRegion newReg, int startRow, int numRows, byte[] qf, byte[]... families)<a name="line.4732"></a>
+<span class="sourceLineNo">4733</span>      throws IOException {<a name="line.4733"></a>
+<span class="sourceLineNo">4734</span>    for (int i = startRow; i &lt; startRow + numRows; i++) {<a name="line.4734"></a>
+<span class="sourceLineNo">4735</span>      byte[] row = Bytes.toBytes("" + i);<a name="line.4735"></a>
+<span class="sourceLineNo">4736</span>      Get get = new Get(row);<a name="line.4736"></a>
+<span class="sourceLineNo">4737</span>      for (byte[] family : families) {<a name="line.4737"></a>
+<span class="sourceLineNo">4738</span>        get.addColumn(family, qf);<a name="line.4738"></a>
+<span class="sourceLineNo">4739</span>      }<a name="line.4739"></a>
+<span class="sourceLineNo">4740</span>      Result result = newReg.get(get);<a name="line.4740"></a>
+<span class="sourceLineNo">4741</span>      Cell[] raw = result.rawCells();<a name="line.4741"></a>
+<span class="sourceLineNo">4742</span>      assertEquals(families.length, result.size());<a name="line.4742"></a>
+<span class="sourceLineNo">4743</span>      for (int j = 0; j &lt; families.length; j++) {<a name="line.4743"></a>
+<span class="sourceLineNo">4744</span>        assertTrue(CellUtil.matchingRows(raw[j], row));<a name="line.4744"></a>
+<span class="sourceLineNo">4745</span>        assertTrue(CellUtil.matchingFamily(raw[j], families[j]));<a name="line.4745"></a>
+<span class="sourceLineNo">4746</span>        assertTrue(CellUtil.matchingQualifier(raw[j], qf));<a name="line.4746"></a>
+<span class="sourceLineNo">4747</span>      }<a name="line.4747"></a>
+<span class="sourceLineNo">4748</span>    }<a name="line.4748"></a>
+<span class="sourceLineNo">4749</span>  }<a name="line.4749"></a>
+<span class="sourceLineNo">4750</span><a name="line.4750"></a>
+<span class="sourceLineNo">4751</span>  static void assertGet(final HRegion r, final byte[] family, final byte[] k) throws IOException {<a name="line.4751"></a>
+<span class="sourceLineNo">4752</span>    // Now I have k, get values out and assert they are as expected.<a name="line.4752"></a>
+<span class="sourceLineNo">4753</span>    Get get = new Get(k).addFamily(family).readAllVersions();<a name="line.4753"></a>
+<span class="sourceLineNo">4754</span>    Cell[] results = r.get(get).rawCells();<a name="line.4754"></a>
+<span class="sourceLineNo">4755</span>    for (int j = 0; j &lt; results.length; j++) {<a name="line.4755"></a>
+<span class="sourceLineNo">4756</span>      byte[] tmp = CellUtil.cloneValue(results[j]);<a name="line.4756"></a>
+<span class="sourceLineNo">4757</span>      // Row should be equal to value every time.<a name="line.4757"></a>
+<span class="sourceLineNo">4758</span>      assertTrue(Bytes.equals(k, tmp));<a name="line.4758"></a>
+<span class="sourceLineNo">4759</span>    }<a name="line.4759"></a>
+<span class="sourceLineNo">4760</span>  }<a name="line.4760"></a>
+<span class="sourceLineNo">4761</span><a name="line.4761"></a>
+<span class="sourceLineNo">4762</span>  /*<a name="line.4762"></a>
+<span class="sourceLineNo">4763</span>   * Assert first value in the passed region is &lt;code&gt;firstValue&lt;/code&gt;.<a name="line.4763"></a>
+<span class="sourceLineNo">4764</span>   *<a name="line.4764"></a>
+<span class="sourceLineNo">4765</span>   * @param r<a name="line.4765"></a>
+<span class="sourceLineNo">4766</span>   *<a name="line.4766"></a>
+<span class="sourceLineNo">4767</span>   * @param fs<a name="line.4767"></a>
+<span class="sourceLineNo">4768</span>   *<a name="line.4768"></a>
+<span class="sourceLineNo">4769</span>   * @param firstValue<a name="line.4769"></a>
+<span class="sourceLineNo">4770</span>   *<a name="line.4770"></a>
+<span class="sourceLineNo">4771</span>   * @throws IOException<a name="line.4771"></a>
+<span class="sourceLineNo">4772</span>   */<a name="line.4772"></a>
+<span class="sourceLineNo">4773</span>  protected void assertScan(final HRegion r, final byte[] fs, final byte[] firstValue)<a name="line.4773"></a>
+<span class="sourceLineNo">4774</span>      throws IOException {<a name="line.4774"></a>
+<span class="sourceLineNo">4775</span>    byte[][] families = { fs };<a name="line.4775"></a>
+<span class="sourceLineNo">4776</span>    Scan scan = new Scan();<a name="line.4776"></a>
+<span class="sourceLineNo">4777</span>    for (int i = 0; i &lt; families.length; i++)<a name="line.4777"></a>
+<span class="sourceLineNo">4778</span>      scan.addFamily(families[i]);<a name="line.4778"></a>
+<span class="sourceLineNo">4779</span>    InternalScanner s = r.getScanner(scan);<a name="line.4779"></a>
+<span class="sourceLineNo">4780</span>    try {<a name="line.4780"></a>
+<span class="sourceLineNo">4781</span>      List&lt;Cell&gt; curVals = new ArrayList&lt;&gt;();<a name="line.4781"></a>
+<span class="sourceLineNo">4782</span>      boolean first = true;<a name="line.4782"></a>
+<span class="sourceLineNo">4783</span>      OUTER_LOOP: while (s.next(curVals)) {<a name="line.4783"></a>
+<span class="sourceLineNo">4784</span>        for (Cell kv : curVals) {<a name="line.4784"></a>
+<span class="sourceLineNo">4785</span>          byte[] val = CellUtil.cloneValue(kv);<a name="line.4785"></a>
+<span class="sourceLineNo">4786</span>          byte[] curval = val;<a name="line.4786"></a>
+<span class="sourceLineNo">4787</span>          if (first) {<a name="line.4787"></a>
+<span class="sourceLineNo">4788</span>            first = false;<a name="line.4788"></a>
+<span class="sourceLineNo">4789</span>            assertTrue(Bytes.compareTo(curval, firstValue) == 0);<a name="line.4789"></a>
+<span class="sourceLineNo">4790</span>          } else {<a name="line.4790"></a>
+<span class="sourceLineNo">4791</span>            // Not asserting anything. Might as well break.<a name="line.4791"></a>
+<span class="sourceLineNo">4792</span>            break OUTER_LOOP;<a name="line.4792"></a>
+<span class="sourceLineNo">4793</span>          }<a name="line.4793"></a>
+<span class="sourceLineNo">4794</span>        }<a name="line.4794"></a>
+<span class="sourceLineNo">4795</span>      }<a name="line.4795"></a>
+<span class="sourceLineNo">4796</span>    } finally {<a name="line.4796"></a>
+<span class="sourceLineNo">4797</span>      s.close();<a name="line.4797"></a>
+<span class="sourceLineNo">4798</span>    }<a name="line.4798"></a>
+<span class="sourceLineNo">4799</span>  }<a name="line.4799"></a>
+<span class="sourceLineNo">4800</span><a name="line.4800"></a>
+<span class="sourceLineNo">4801</span>  /**<a name="line.4801"></a>
+<span class="sourceLineNo">4802</span>   * Test that we get the expected flush results back<a name="line.4802"></a>
+<span class="sourceLineNo">4803</span>   */<a name="line.4803"></a>
+<span class="sourceLineNo">4804</span>  @Test<a name="line.4804"></a>
+<span class="sourceLineNo">4805</span>  public void testFlushResult() throws IOException {<a name="line.4805"></a>
+<span class="sourceLineNo">4806</span>    byte[] family = Bytes.toBytes("family");<a name="line.4806"></a>
+<span class="sourceLineNo">4807</span><a name="line.4807"></a>
+<span class="sourceLineNo">4808</span>    this.region = initHRegion(tableName, method, family);<a name="line.4808"></a>
+<span class="sourceLineNo">4809</span><a name="line.4809"></a>
+<span class="sourceLineNo">4810</span>    // empty memstore, flush doesn't run<a name="line.4810"></a>
+<span class="sourceLineNo">4811</span>    HRegion.FlushResult fr = region.flush(true);<a name="line.4811"></a>
+<span class="sourceLineNo">4812</span>    assertFalse(fr.isFlushSucceeded());<a name="line.4812"></a>
+<span class="sourceLineNo">4813</span>    assertFalse(fr.isCompactionNeeded());<a name="line.4813"></a>
+<span class="sourceLineNo">4814</span><a name="line.4814"></a>
+<span class="sourceLineNo">4815</span>    // Flush enough files to get up to the threshold, doesn't need compactions<a name="line.4815"></a>
+<span class="sourceLineNo">4816</span>    for (int i = 0; i &lt; 2; i++) {<a name="line.4816"></a>
+<span class="sourceLineNo">4817</span>      Put put = new Put(tableName.toBytes()).addColumn(family, family, tableName.toBytes());<a name="line.4817"></a>
+<span class="sourceLineNo">4818</span>      region.put(put);<a name="line.4818"></a>
+<span class="sourceLineNo">4819</span>      fr = region.flush(true);<a name="line.4819"></a>
+<span class="sourceLineNo">4820</span>      assertTrue(fr.isFlushSucceeded());<a name="line.4820"></a>
+<span class="sourceLineNo">4821</span>      assertFalse(fr.isCompactionNeeded());<a name="line.4821"></a>
+<span class="sourceLineNo">4822</span>    }<a name="line.4822"></a>
 <span class="sourceLineNo">4823</span><a name="line.4823"></a>
-<span class="sourceLineNo">4824</span>  protected Configuration initSplit() {<a name="line.4824"></a>
-<span class="sourceLineNo">4825</span>    // Always compact if there is more than one store file.<a name="line.4825"></a>
-<span class="sourceLineNo">4826</span>    CONF.setInt("hbase.hstore.compactionThreshold", 2);<a name="line.4826"></a>
-<span class="sourceLineNo">4827</span><a name="line.4827"></a>
-<span class="sourceLineNo">4828</span>    CONF.setInt(HConstants.HBASE_CLIENT_SCANNER_TIMEOUT_PERIOD, 10 * 1000);<a name="line.4828"></a>
-<span class="sourceLineNo">4829</span><a name="line.4829"></a>
-<span class="sourceLineNo">4830</span>    // Increase the amount of time between client retries<a name="line.4830"></a>
-<span class="sourceLineNo">4831</span>    CONF.setLong("hbase.client.pause", 15 * 1000);<a name="line.4831"></a>
-<span class="sourceLineNo">4832</span><a name="line.4832"></a>
-<span class="sourceLineNo">4833</span>    // This size should make it so we always split using the addContent<a name="line.4833"></a>
-<span class="sourceLineNo">4834</span>    // below. After adding all data, the first region is 1.3M<a name="line.4834"></a>
-<span class="sourceLineNo">4835</span>    CONF.setLong(HConstants.HREGION_MAX_FILESIZE, 1024 * 128);<a name="line.4835"></a>
-<span class="sourceLineNo">4836</span>    return CONF;<a name="line.4836"></a>
-<span class="sourceLineNo">4837</span>  }<a name="line.4837"></a>
-<span class="sourceLineNo">4838</span><a name="line.4838"></a>
-<span class="sourceLineNo">4839</span>  /**<a name="line.4839"></a>
-<span class="sourceLineNo">4840</span>   * @return A region on which you must call<a name="line.4840"></a>
-<span class="sourceLineNo">4841</span>   *         {@link HBaseTestingUtility#closeRegionAndWAL(HRegion)} when done.<a name="line.4841"></a>
-<span class="sourceLineNo">4842</span>   */<a name="line.4842"></a>
-<span class="sourceLineNo">4843</span>  protected HRegion initHRegion(TableName tableName, String callingMethod, Configuration conf,<a name="line.4843"></a>
-<span class="sourceLineNo">4844</span>      byte[]... families) throws IOException {<a name="line.4844"></a>
-<span class="sourceLineNo">4845</span>    return initHRegion(tableName, callingMethod, conf, false, families);<a name="line.4845"></a>
-<span class="sourceLineNo">4846</span>  }<a name="line.4846"></a>
-<span class="sourceLineNo">4847</span><a name="line.4847"></a>
-<span class="sourceLineNo">4848</span>  /**<a name="line.4848"></a>
-<span class="sourceLineNo">4849</span>   * @return A region on which you must call<a name="line.4849"></a>
-<span class="sourceLineNo">4850</span>   *         {@link HBaseTestingUtility#closeRegionAndWAL(HRegion)} when done.<a name="line.4850"></a>
-<span class="sourceLineNo">4851</span>   */<a name="line.4851"></a>
-<span class="sourceLineNo">4852</span>  protected HRegion initHRegion(TableName tableName, String callingMethod, Configuration conf,<a name="line.4852"></a>
-<span class="sourceLineNo">4853</span>      boolean isReadOnly, byte[]... families) throws IOException {<a name="line.4853"></a>
-<span class="sourceLineNo">4854</span>    return initHRegion(tableName, null, null, callingMethod, conf, isReadOnly, families);<a name="line.4854"></a>
-<span class="sourceLineNo">4855</span>  }<a name="line.4855"></a>
-<span class="sourceLineNo">4856</span><a name="line.4856"></a>
-<span class="sourceLineNo">4857</span>  protected HRegion initHRegion(TableName tableName, byte[] startKey, byte[] stopKey,<a name="line.4857"></a>
-<span class="sourceLineNo">4858</span>      String callingMethod, Configuration conf, boolean isReadOnly, byte[]... families)<a name="line.4858"></a>
-<span class="sourceLineNo">4859</span>      throws IOException {<a name="line.4859"></a>
-<span class="sourceLineNo">4860</span>    Path logDir = TEST_UTIL.getDataTestDirOnTestFS(callingMethod + ".log");<a name="line.4860"></a>
-<span class="sourceLineNo">4861</span>    ChunkCreator.initialize(MemStoreLABImpl.CHUNK_SIZE_DEFAULT, false, 0, 0, 0, null);<a name="line.4861"></a>
-<span class="sourceLineNo">4862</span>    HRegionInfo hri = new HRegionInfo(tableName, startKey, stopKey);<a name="line.4862"></a>
-<span class="sourceLineNo">4863</span>    final WAL wal = HBaseTestingUtility.createWal(conf, logDir, hri);<a name="line.4863"></a>
-<span class="sourceLineNo">4864</span>    return initHRegion(tableName, startKey, stopKey, isReadOnly,<a name="line.4864"></a>
-<span class="sourceLineNo">4865</span>        Durability.SYNC_WAL, wal, families);<a name="line.4865"></a>
-<span class="sourceLineNo">4866</span>  }<a name="line.4866"></a>
-<span class="sourceLineNo">4867</span><a name="line.4867"></a>
-<span class="sourceLineNo">4868</span>  /**<a name="line.4868"></a>
-<span class="sourceLineNo">4869</span>   * @return A region on which you must call<a name="line.4869"></a>
-<span class="sourceLineNo">4870</span>   *         {@link HBaseTestingUtility#closeRegionAndWAL(HRegion)} when done.<a name="line.4870"></a>
-<span class="sourceLineNo">4871</span>   */<a name="line.4871"></a>
-<span class="sourceLineNo">4872</span>  public HRegion initHRegion(TableName tableName, byte[] startKey, byte[] stopKey,<a name="line.4872"></a>
-<span class="sourceLineNo">4873</span>      boolean isReadOnly, Durability durability, WAL wal, byte[]... families) throws IOException {<a name="line.4873"></a>
-<span class="sourceLineNo">4874</span>    return TEST_UTIL.createLocalHRegion(tableName, startKey, stopKey,<a name="line.4874"></a>
-<span class="sourceLineNo">4875</span>        isReadOnly, durability, wal, families);<a name="line.4875"></a>
+<span class="sourceLineNo">4824</span>    // Two flushes after the threshold, compactions are needed<a name="line.4824"></a>
+<span class="sourceLineNo">4825</span>    for (int i = 0; i &lt; 2; i++) {<a name="line.4825"></a>
+<span class="sourceLineNo">4826</span>      Put put = new Put(tableName.toBytes()).addColumn(family, family, tableName.toBytes());<a name="line.4826"></a>
+<span class="sourceLineNo">4827</span>      region.put(put);<a name="line.4827"></a>
+<span class="sourceLineNo">4828</span>      fr = region.flush(true);<a name="line.4828"></a>
+<span class="sourceLineNo">4829</span>      assertTrue(fr.isFlushSucceeded());<a name="line.4829"></a>
+<span class="sourceLineNo">4830</span>      assertTrue(fr.isCompactionNeeded());<a name="line.4830"></a>
+<span class="sourceLineNo">4831</span>    }<a name="line.4831"></a>
+<span class="sourceLineNo">4832</span>  }<a name="line.4832"></a>
+<span class="sourceLineNo">4833</span><a name="line.4833"></a>
+<span class="sourceLineNo">4834</span>  protected Configuration initSplit() {<a name="line.4834"></a>
+<span class="sourceLineNo">4835</span>    // Always compact if there is more than one store file.<a name="line.4835"></a>
+<span class="sourceLineNo">4836</span>    CONF.setInt("hbase.hstore.compactionThreshold", 2);<a name="line.4836"></a>
+<span class="sourceLineNo">4837</span><a name="line.4837"></a>
+<span class="sourceLineNo">4838</span>    CONF.setInt(HConstants.HBASE_CLIENT_SCANNER_TIMEOUT_PERIOD, 10 * 1000);<a name="line.4838"></a>
+<span class="sourceLineNo">4839</span><a name="line.4839"></a>
+<span class="sourceLineNo">4840</span>    // Increase the amount of time between client retries<a name="line.4840"></a>
+<span class="sourceLineNo">4841</span>    CONF.setLong("hbase.client.pause", 15 * 1000);<a name="line.4841"></a>
+<span class="sourceLineNo">4842</span><a name="line.4842"></a>
+<span class="sourceLineNo">4843</span>    // This size should make it so we always split using the addContent<a name="line.4843"></a>
+<span class="sourceLineNo">4844</span>    // below. After adding all data, the first region is 1.3M<a name="line.4844"></a>
+<span class="sourceLineNo">4845</span>    CONF.setLong(HConstants.HREGION_MAX_FILESIZE, 1024 * 128);<a name="line.4845"></a>
+<span class="sourceLineNo">4846</span>    return CONF;<a name="line.4846"></a>
+<span class="sourceLineNo">4847</span>  }<a name="line.4847"></a>
+<span class="sourceLineNo">4848</span><a name="line.4848"></a>
+<span class="sourceLineNo">4849</span>  /**<a name="line.4849"></a>
+<span class="sourceLineNo">4850</span>   * @return A region on which you must call<a name="line.4850"></a>
+<span class="sourceLineNo">4851</span>   *         {@link HBaseTestingUtility#closeRegionAndWAL(HRegion)} when done.<a name="line.4851"></a>
+<span class="sourceLineNo">4852</span>   */<a name="line.4852"></a>
+<span class="sourceLineNo">4853</span>  protected HRegion initHRegion(TableName tableName, String callingMethod, Configuration conf,<a name="line.4853"></a>
+<span class="sourceLineNo">4854</span>      byte[]... families) throws IOException {<a name="line.4854"></a>
+<span class="sourceLineNo">4855</span>    return initHRegion(tableName, callingMethod, conf, false, families);<a name="line.4855"></a>
+<span class="sourceLineNo">4856</span>  }<a name="line.4856"></a>
+<span class="sourceLineNo">4857</span><a name="line.4857"></a>
+<span class="sourceLineNo">4858</span>  /**<a name="line.4858"></a>
+<span class="sourceLineNo">4859</span>   * @return A region on which you must call<a name="line.4859"></a>
+<span class="sourceLineNo">4860</span>   *         {@link HBaseTestingUtility#closeRegionAndWAL(HRegion)} when done.<a name="line.4860"></a>
+<span class="sourceLineNo">4861</span>   */<a name="line.4861"></a>
+<span class="sourceLineNo">4862</span>  protected HRegion initHRegion(TableName tableName, String callingMethod, Configuration conf,<a name="line.4862"></a>
+<span class="sourceLineNo">4863</span>      boolean isReadOnly, byte[]... families) throws IOException {<a name="line.4863"></a>
+<span class="sourceLineNo">4864</span>    return initHRegion(tableName, null, null, callingMethod, conf, isReadOnly, families);<a name="line.4864"></a>
+<span class="sourceLineNo">4865</span>  }<a name="line.4865"></a>
+<span class="sourceLineNo">4866</span><a name="line.4866"></a>
+<span class="sourceLineNo">4867</span>  protected HRegion initHRegion(TableName tableName, byte[] startKey, byte[] stopKey,<a name="line.4867"></a>
+<span class="sourceLineNo">4868</span>      String callingMethod, Configuration conf, boolean isReadOnly, byte[]... families)<a name="line.4868"></a>
+<span class="sourceLineNo">4869</span>      throws IOException {<a name="line.4869"></a>
+<span class="sourceLineNo">4870</span>    Path logDir = TEST_UTIL.getDataTestDirOnTestFS(callingMethod + ".log");<a name="line.4870"></a>
+<span class="sourceLineNo">4871</span>    ChunkCreator.initialize(MemStoreLABImpl.CHUNK_SIZE_DEFAULT, false, 0, 0, 0, null);<a name="line.4871"></a>
+<span class="sourceLineNo">4872</span>    HRegionInfo hri = new HRegionInfo(tableName, startKey, stopKey);<a name="line.4872"></a>
+<span class="sourceLineNo">4873</span>    final WAL wal = HBaseTestingUtility.createWal(conf, logDir, hri);<a name="line.4873"></a>
+<span class="sourceLineNo">4874</span>    return initHRegion(tableName, startKey, stopKey, isReadOnly,<a name="line.4874"></a>
+<span class="sourceLineNo">4875</span>        Durability.SYNC_WAL, wal, families);<a name="line.4875"></a>
 <span class="sourceLineNo">4876</span>  }<a name="line.4876"></a>
 <span class="sourceLineNo">4877</span><a name="line.4877"></a>
 <span class="sourceLineNo">4878</span>  /**<a name="line.4878"></a>
-<span class="sourceLineNo">4879</span>   * Assert that the passed in Cell has expected contents for the specified row,<a name="line.4879"></a>
-<span class="sourceLineNo">4880</span>   * column &amp; timestamp.<a name="line.4880"></a>
+<span class="sourceLineNo">4879</span>   * @return A region on which you must call<a name="line.4879"></a>
+<span class="sourceLineNo">4880</span>   *         {@link HBaseTestingUtility#closeRegionAndWAL(HRegion)} when done.<a name="line.4880"></a>
 <span class="sourceLineNo">4881</span>   */<a name="line.4881"></a>
-<span class="sourceLineNo">4882</span>  private void checkOneCell(Cell kv, byte[] cf, int rowIdx, int colIdx, long ts) {<a name="line.4882"></a>
-<span class="sourceLineNo">4883</span>    String ctx = "rowIdx=" + rowIdx + "; colIdx=" + colIdx + "; ts=" + ts;<a name="line.4883"></a>
-<span class="sourceLineNo">4884</span>    assertEquals("Row mismatch which checking: " + ctx, "row:" + rowIdx,<a name="line.4884"></a>
-<span class="sourceLineNo">4885</span>        Bytes.toString(CellUtil.cloneRow(kv)));<a name="line.4885"></a>
-<span class="sourceLineNo">4886</span>    assertEquals("ColumnFamily mismatch while checking: " + ctx, Bytes.toString(cf),<a name="line.4886"></a>
-<span class="sourceLineNo">4887</span>        Bytes.toString(CellUtil.cloneFamily(kv)));<a name="line.4887"></a>
-<span class="sourceLineNo">4888</span>    assertEquals("Column qualifier mismatch while checking: " + ctx, "column:" + colIdx,<a name="line.4888"></a>
-<span class="sourceLineNo">4889</span>        Bytes.toString(CellUtil.cloneQualifier(kv)));<a name="line.4889"></a>
-<span class="sourceLineNo">4890</span>    assertEquals("Timestamp mismatch while checking: " + ctx, ts, kv.getTimestamp());<a name="line.4890"></a>
-<span class="sourceLineNo">4891</span>    assertEquals("Value mismatch while checking: " + ctx, "value-version-" + ts,<a name="line.4891"></a>
-<span class="sourceLineNo">4892</span>        Bytes.toString(CellUtil.cloneValue(kv)));<a name="line.4892"></a>
-<span class="sourceLineNo">4893</span>  }<a name="line.4893"></a>
-<span class="sourceLineNo">4894</span><a name="line.4894"></a>
-<span class="sourceLineNo">4895</span>  @Test<a name="line.4895"></a>
-<span class="sourceLineNo">4896</span>  public void testReverseScanner_FromMemStore_SingleCF_Normal()<a name="line.4896"></a>
-<span class="sourceLineNo">4897</span>      throws IOException {<a name="line.4897"></a>
-<span class="sourceLineNo">4898</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.4898"></a>
-<span class="sourceLineNo">4899</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.4899"></a>
-<span class="sourceLineNo">4900</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.4900"></a>
-<span class="sourceLineNo">4901</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.4901"></a>
-<span class="sourceLineNo">4902</span>    byte[][] families = { cf };<a name="line.4902"></a>
-<span class="sourceLineNo">4903</span>    byte[] col = Bytes.toBytes("C");<a name="line.4903"></a>
-<span class="sourceLineNo">4904</span>    long ts = 1;<a name="line.4904"></a>
-<span class="sourceLineNo">4905</span>    this.region = initHRegion(tableName, method, families);<a name="line.4905"></a>
-<span class="sourceLineNo">4906</span>    KeyValue kv1 = new KeyValue(rowC, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4906"></a>
-<span class="sourceLineNo">4907</span>    KeyValue kv11 = new KeyValue(rowC, cf, col, ts + 1, KeyValue.Type.Put,<a name="line.4907"></a>
-<span class="sourceLineNo">4908</span>        null);<a name="line.4908"></a>
-<span class="sourceLineNo">4909</span>    KeyValue kv2 = new KeyValue(rowA, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4909"></a>
-<span class="sourceLineNo">4910</span>    KeyValue kv3 = new KeyValue(rowB, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4910"></a>
-<span class="sourceLineNo">4911</span>    Put put = null;<a name="line.4911"></a>
-<span class="sourceLineNo">4912</span>    put = new Put(rowC);<a name="line.4912"></a>
-<span class="sourceLineNo">4913</span>    put.add(kv1);<a name="line.4913"></a>
-<span class="sourceLineNo">4914</span>    put.add(kv11);<a name="line.4914"></a>
-<span class="sourceLineNo">4915</span>    region.put(put);<a name="line.4915"></a>
-<span class="sourceLineNo">4916</span>    put = new Put(rowA);<a name="line.4916"></a>
-<span class="sourceLineNo">4917</span>    put.add(kv2);<a name="line.4917"></a>
-<span class="sourceLineNo">4918</span>    region.put(put);<a name="line.4918"></a>
-<span class="sourceLineNo">4919</span>    put = new Put(rowB);<a name="line.4919"></a>
-<span class="sourceLineNo">4920</span>    put.add(kv3);<a name="line.4920"></a>
-<span class="sourceLineNo">4921</span>    region.put(put);<a name="line.4921"></a>
-<span class="sourceLineNo">4922</span><a name="line.4922"></a>
-<span class="sourceLineNo">4923</span>    Scan scan = new Scan(rowC);<a name="line.4923"></a>
-<span class="sourceLineNo">4924</span>    scan.setMaxVersions(5);<a name="line.4924"></a>
-<span class="sourceLineNo">4925</span>    scan.setReversed(true);<a name="line.4925"></a>
-<span class="sourceLineNo">4926</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.4926"></a>
-<span class="sourceLineNo">4927</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.4927"></a>
-<span class="sourceLineNo">4928</span>    boolean hasNext = scanner.next(currRow);<a name="line.4928"></a>
-<span class="sourceLineNo">4929</span>    assertEquals(2, currRow.size());<a name="line.4929"></a>
-<span class="sourceLineNo">4930</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4930"></a>
-<span class="sourceLineNo">4931</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.4931"></a>
-<span class="sourceLineNo">4932</span>    assertTrue(hasNext);<a name="line.4932"></a>
-<span class="sourceLineNo">4933</span>    currRow.clear();<a name="line.4933"></a>
-<span class="sourceLineNo">4934</span>    hasNext = scanner.next(currRow);<a name="line.4934"></a>
-<span class="sourceLineNo">4935</span>    assertEquals(1, currRow.size());<a name="line.4935"></a>
-<span class="sourceLineNo">4936</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4936"></a>
-<span class="sourceLineNo">4937</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.4937"></a>
-<span class="sourceLineNo">4938</span>    assertTrue(hasNext);<a name="line.4938"></a>
-<span class="sourceLineNo">4939</span>    currRow.clear();<a name="line.4939"></a>
-<span class="sourceLineNo">4940</span>    hasNext = scanner.next(currRow);<a name="line.4940"></a>
-<span class="sourceLineNo">4941</span>    assertEquals(1, currRow.size());<a name="line.4941"></a>
-<span class="sourceLineNo">4942</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4942"></a>
-<span class="sourceLineNo">4943</span>        .get(0).getRowLength(), rowA, 0, rowA.length));<a name="line.4943"></a>
-<span class="sourceLineNo">4944</span>    assertFalse(hasNext);<a name="line.4944"></a>
-<span class="sourceLineNo">4945</span>    scanner.close();<a name="line.4945"></a>
-<span class="sourceLineNo">4946</span>  }<a name="line.4946"></a>
-<span class="sourceLineNo">4947</span><a name="line.4947"></a>
-<span class="sourceLineNo">4948</span>  @Test<a name="line.4948"></a>
-<span class="sourceLineNo">4949</span>  public void testReverseScanner_FromMemStore_SingleCF_LargerKey()<a name="line.4949"></a>
-<span class="sourceLineNo">4950</span>      throws IOException {<a name="line.4950"></a>
-<span class="sourceLineNo">4951</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.4951"></a>
-<span class="sourceLineNo">4952</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.4952"></a>
-<span class="sourceLineNo">4953</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.4953"></a>
-<span class="sourceLineNo">4954</span>    byte[] rowD = Bytes.toBytes("rowD");<a name="line.4954"></a>
-<span class="sourceLineNo">4955</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.4955"></a>
-<span class="sourceLineNo">4956</span>    byte[][] families = { cf };<a name="line.4956"></a>
-<span class="sourceLineNo">4957</span>    byte[] col = Bytes.toBytes("C");<a name="line.4957"></a>
-<span class="sourceLineNo">4958</span>    long ts = 1;<a name="line.4958"></a>
-<span class="sourceLineNo">4959</span>    this.region = initHRegion(tableName, method, families);<a name="line.4959"></a>
-<span class="sourceLineNo">4960</span>    KeyValue kv1 = new KeyValue(rowC, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4960"></a>
-<span class="sourceLineNo">4961</span>    KeyValue kv11 = new KeyValue(rowC, cf, col, ts + 1, KeyValue.Type.Put,<a name="line.4961"></a>
-<span class="sourceLineNo">4962</span>        null);<a name="line.4962"></a>
-<span class="sourceLineNo">4963</span>    KeyValue kv2 = new KeyValue(rowA, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4963"></a>
-<span class="sourceLineNo">4964</span>    KeyValue kv3 = new KeyValue(rowB, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4964"></a>
-<span class="sourceLineNo">4965</span>    Put put = null;<a name="line.4965"></a>
-<span class="sourceLineNo">4966</span>    put = new Put(rowC);<a name="line.4966"></a>
-<span class="sourceLineNo">4967</span>    put.add(kv1);<a name="line.4967"></a>
-<span class="sourceLineNo">4968</span>    put.add(kv11);<a name="line.4968"></a>
-<span class="sourceLineNo">4969</span>    region.put(put);<a name="line.4969"></a>
-<span class="sourceLineNo">4970</span>    put = new Put(rowA);<a name="line.4970"></a>
-<span class="sourceLineNo">4971</span>    put.add(kv2);<a name="line.4971"></a>
-<span class="sourceLineNo">4972</span>    region.put(put);<a name="line.4972"></a>
-<span class="sourceLineNo">4973</span>    put = new Put(rowB);<a name="line.4973"></a>
-<span class="sourceLineNo">4974</span>    put.add(kv3);<a name="line.4974"></a>
-<span class="sourceLineNo">4975</span>    region.put(put);<a name="line.4975"></a>
-<span class="sourceLineNo">4976</span><a name="line.4976"></a>
-<span class="sourceLineNo">4977</span>    Scan scan = new Scan(rowD);<a name="line.4977"></a>
-<span class="sourceLineNo">4978</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.4978"></a>
-<span class="sourceLineNo">4979</span>    scan.setReversed(true);<a name="line.4979"></a>
-<span class="sourceLineNo">4980</span>    scan.setMaxVersions(5);<a name="line.4980"></a>
-<span class="sourceLineNo">4981</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.4981"></a>
-<span class="sourceLineNo">4982</span>    boolean hasNext = scanner.next(currRow);<a name="line.4982"></a>
-<span class="sourceLineNo">4983</span>    assertEquals(2, currRow.size());<a name="line.4983"></a>
-<span class="sourceLineNo">4984</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4984"></a>
-<span class="sourceLineNo">4985</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.4985"></a>
-<span class="sourceLineNo">4986</span>    assertTrue(hasNext);<a name="line.4986"></a>
-<span class="sourceLineNo">4987</span>    currRow.clear();<a name="line.4987"></a>
-<span class="sourceLineNo">4988</span>    hasNext = scanner.next(currRow);<a name="line.4988"></a>
-<span class="sourceLineNo">4989</span>    assertEquals(1, currRow.size());<a name="line.4989"></a>
-<span class="sourceLineNo">4990</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4990"></a>
-<span class="sourceLineNo">4991</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.4991"></a>
-<span class="sourceLineNo">4992</span>    assertTrue(hasNext);<a name="line.4992"></a>
-<span class="sourceLineNo">4993</span>    currRow.clear();<a name="line.4993"></a>
-<span class="sourceLineNo">4994</span>    hasNext = scanner.next(currRow);<a name="line.4994"></a>
-<span class="sourceLineNo">4995</span>    assertEquals(1, currRow.size());<a name="line.4995"></a>
-<span class="sourceLineNo">4996</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4996"></a>
-<span class="sourceLineNo">4997</span>        .get(0).getRowLength(), rowA, 0, rowA.length));<a name="line.4997"></a>
-<span class="sourceLineNo">4998</span>    assertFalse(hasNext);<a name="line.4998"></a>
-<span class="sourceLineNo">4999</span>    scanner.close();<a name="line.4999"></a>
-<span class="sourceLineNo">5000</span>  }<a name="line.5000"></a>
-<span class="sourceLineNo">5001</span><a name="line.5001"></a>
-<span class="sourceLineNo">5002</span>  @Test<a name="line.5002"></a>
-<span class="sourceLineNo">5003</span>  public void testReverseScanner_FromMemStore_SingleCF_FullScan()<a name="line.5003"></a>
-<span class="sourceLineNo">5004</span>      throws IOException {<a name="line.5004"></a>
-<span class="sourceLineNo">5005</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.5005"></a>
-<span class="sourceLineNo">5006</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.5006"></a>
-<span class="sourceLineNo">5007</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.5007"></a>
-<span class="sourceLineNo">5008</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.5008"></a>
-<span class="sourceLineNo">5009</span>    byte[][] families = { cf };<a name="line.5009"></a>
-<span class="sourceLineNo">5010</span>    byte[] col = Bytes.toBytes("C");<a name="line.5010"></a>
-<span class="sourceLineNo">5011</span>    long ts = 1;<a name="line.5011"></a>
-<span class="sourceLineNo">5012</span>    this.region = initHRegion(tableName, method, families);<a name="line.5012"></a>
-<span class="sourceLineNo">5013</span>    KeyValue kv1 = new KeyValue(rowC, cf, col, ts, KeyValue.Type.Put, null);<a name="line.5013"></a>
-<span class="sourceLineNo">5014</span>    KeyValue kv11 = new KeyValue(rowC, cf, col, ts + 1, KeyValue.Type.Put,<a name="line.5014"></a>
-<span class="sourceLineNo">5015</span>        null);<a name="line.5015"></a>
-<span class="sourceLineNo">5016</span>    KeyValue kv2 = new KeyValue(rowA, cf, col, ts, KeyValue.Type.Put, null);<a name="line.5016"></a>
-<span class="sourceLineNo">5017</span>    KeyValue kv3 = new KeyValue(rowB, cf, col, ts, KeyValue.Type.Put, null);<a name="line.5017"></a>
-<span class="sourceLineNo">5018</span>    Put put = null;<a name="line.5018"></a>
-<span class="sourceLineNo">5019</span>    put = new Put(rowC);<a name="line.5019"></a>
-<span class="sourceLineNo">5020</span>    put.add(kv1);<a name="line.5020"></a>
-<span class="sourceLineNo">5021</span>    put.add(kv11);<a name="line.5021"></a>
-<span class="sourceLineNo">5022</span>    region.put(put);<a name="line.5022"></a>
-<span class="sourceLineNo">5023</span>    put = new Put(rowA);<a name="line.5023"></a>
-<span class="sourceLineNo">5024</span>    put.add(kv2);<a name="line.5024"></a>
-<span class="sourceLineNo">5025</span>    region.put(put);<a name="line.5025"></a>
-<span class="sourceLineNo">5026</span>    put = new Put(rowB);<a name="line.5026"></a>
-<span class="sourceLineNo">5027</span>    put.add(kv3);<a name="line.5027"></a>
-<span class="sourceLineNo">5028</span>    region.put(put);<a name="line.5028"></a>
-<span class="sourceLineNo">5029</span>    Scan scan = new Scan();<a name="line.5029"></a>
-<span class="sourceLineNo">5030</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5030"></a>
-<span class="sourceLineNo">5031</span>    scan.setReversed(true);<a name="line.5031"></a>
-<span class="sourceLineNo">5032</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5032"></a>
-<span class="sourceLineNo">5033</span>    boolean hasNext = scanner.next(currRow);<a name="line.5033"></a>
-<span class="sourceLineNo">5034</span>    assertEquals(1, currRow.size());<a name="line.5034"></a>
-<span class="sourceLineNo">5035</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5035"></a>
-<span class="sourceLineNo">5036</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.5036"></a>
-<span class="sourceLineNo">5037</span>    assertTrue(hasNext);<a name="line.5037"></a>
-<span class="sourceLineNo">5038</span>    currRow.clear();<a name="line.5038"></a>
-<span class="sourceLineNo">5039</span>    hasNext = scanner.next(currRow);<a name="line.5039"></a>
-<span class="sourceLineNo">5040</span>    assertEquals(1, currRow.size());<a name="line.5040"></a>
-<span class="sourceLineNo">5041</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5041"></a>
-<span class="sourceLineNo">5042</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.5042"></a>
-<span class="sourceLineNo">5043</span>    assertTrue(hasNext);<a name="line.5043"></a>
-<span class="sourceLineNo">5044</span>    currRow.clear();<a name="line.5044"></a>
-<span class="sourceLineNo">5045</span>    hasNext = scanner.next(currRow);<a name="line.5045"></a>
-<span class="sourceLineNo">5046</span>    assertEquals(1, currRow.size());<a name="line.5046"></a>
-<span class="sourceLineNo">5047</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5047"></a>
-<span class="sourceLineNo">5048</span>        .get(0).getRowLength(), rowA, 0, rowA.length));<a name="line.5048"></a>
-<span class="sourceLineNo">5049</span>    assertFalse(hasNext);<a name="line.5049"></a>
-<span class="sourceLineNo">5050</span>    scanner.close();<a name="line.5050"></a>
-<span class="sourceLineNo">5051</span>  }<a name="line.5051"></a>
-<span class="sourceLineNo">5052</span><a name="line.5052"></a>
-<span class="sourceLineNo">5053</span>  @Test<a name="line.5053"></a>
-<span class="sourceLineNo">5054</span>  public void testReverseScanner_moreRowsMayExistAfter() throws IOException {<a name="line.5054"></a>
-<span class="sourceLineNo">5055</span>    // case for "INCLUDE_AND_SEEK_NEXT_ROW &amp; SEEK_NEXT_ROW" endless loop<a name="line.5055"></a>
-<span class="sourceLineNo">5056</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.5056"></a>
-<span class="sourceLineNo">5057</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.5057"></a>
-<span class="sourceLineNo">5058</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.5058"></a>
-<span class="sourceLineNo">5059</span>    byte[] rowD = Bytes.toBytes("rowD");<a name="line.5059"></a>
-<span class="sourceLineNo">5060</span>    byte[] rowE = Bytes.toBytes("rowE");<a name="line.5060"></a>
-<span class="sourceLineNo">5061</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.5061"></a>
-<span class="sourceLineNo">5062</span>    byte[][] families = { cf };<a name="line.5062"></a>
-<span class="sourceLineNo">5063</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.5063"></a>
-<span class="sourceLineNo">5064</span>    byte[] col2 = Bytes.toBytes("col2");<a name="line.5064"></a>
-<span class="sourceLineNo">5065</span>    long ts = 1;<a name="line.5065"></a>
-<span class="sourceLineNo">5066</span>    this.region = initHRegion(tableName, method, families);<a name="line.5066"></a>
-<span class="sourceLineNo">5067</span>    KeyValue kv1 = new KeyValue(rowA, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5067"></a>
-<span class="sourceLineNo">5068</span>    KeyValue kv2 = new KeyValue(rowB, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5068"></a>
-<span class="sourceLineNo">5069</span>    KeyValue kv3 = new KeyValue(rowC, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5069"></a>
-<span class="sourceLineNo">5070</span>    KeyValue kv4_1 = new KeyValue(rowD, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5070"></a>
-<span class="sourceLineNo">5071</span>    KeyValue kv4_2 = new KeyValue(rowD, cf, col2, ts, KeyValue.Type.Put, null);<a name="line.5071"></a>
-<span class="sourceLineNo">5072</span>    KeyValue kv5 = new KeyValue(rowE, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5072"></a>
-<span class="sourceLineNo">5073</span>    Put put = null;<a name="line.5073"></a>
-<span class="sourceLineNo">5074</span>    put = new Put(rowA);<a name="line.5074"></a>
-<span class="sourceLineNo">5075</span>    put.add(kv1);<a name="line.5075"></a>
-<span class="sourceLineNo">5076</span>    region.put(put);<a name="line.5076"></a>
-<span class="sourceLineNo">5077</span>    put = new Put(rowB);<a name="line.5077"></a>
-<span class="sourceLineNo">5078</span>    put.add(kv2);<a name="line.5078"></a>
-<span class="sourceLineNo">5079</span>    region.put(put);<a name="line.5079"></a>
-<span class="sourceLineNo">5080</span>    put = new Put(rowC);<a name="line.5080"></a>
-<span class="sourceLineNo">5081</span>    put.add(kv3);<a name="line.5081"></a>
-<span class="sourceLineNo">5082</span>    region.put(put);<a name="line.5082"></a>
-<span class="sourceLineNo">5083</span>    put = new Put(rowD);<a name="line.5083"></a>
-<span class="sourceLineNo">5084</span>    put.add(kv4_1);<a name="line.5084"></a>
-<span class="sourceLineNo">5085</span>    region.put(put);<a name="line.5085"></a>
-<span class="sourceLineNo">5086</span>    put = new Put(rowD);<a name="line.5086"></a>
-<span class="sourceLineNo">5087</span>    put.add(kv4_2);<a name="line.5087"></a>
-<span class="sourceLineNo">5088</span>    region.put(put);<a name="line.5088"></a>
-<span class="sourceLineNo">5089</span>    put = new Put(rowE);<a name="line.5089"></a>
-<span class="sourceLineNo">5090</span>    put.add(kv5);<a name="line.5090"></a>
-<span class="sourceLineNo">5091</span>    region.put(put);<a name="line.5091"></a>
-<span class="sourceLineNo">5092</span>    region.flush(true);<a name="line.5092"></a>
-<span class="sourceLineNo">5093</span>    Scan scan = new Scan(rowD, rowA);<a name="line.5093"></a>
-<span class="sourceLineNo">5094</span>    scan.addColumn(families[0], col1);<a name="line.5094"></a>
-<span class="sourceLineNo">5095</span>    scan.setReversed(true);<a name="line.5095"></a>
-<span class="sourceLineNo">5096</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5096"></a>
-<span class="sourceLineNo">5097</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5097"></a>
-<span class="sourceLineNo">5098</span>    boolean hasNext = scanner.next(currRow);<a name="line.5098"></a>
-<span class="sourceLineNo">5099</span>    assertEquals(1, currRow.size());<a name="line.5099"></a>
-<span class="sourceLineNo">5100</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5100"></a>
-<span class="sourceLineNo">5101</span>        .get(0).getRowLength(), rowD, 0, rowD.length));<a name="line.5101"></a>
-<span class="sourceLineNo">5102</span>    assertTrue(hasNext);<a name="line.5102"></a>
-<span class="sourceLineNo">5103</span>    currRow.clear();<a name="line.5103"></a>
-<span class="sourceLineNo">5104</span>    hasNext = scanner.next(currRow);<a name="line.5104"></a>
-<span class="sourceLineNo">5105</span>    assertEquals(1, currRow.size());<a name="line.5105"></a>
-<span class="sourceLineNo">5106</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5106"></a>
-<span class="sourceLineNo">5107</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.5107"></a>
-<span class="sourceLineNo">5108</span>    assertTrue(hasNext);<a name="line.5108"></a>
-<span class="sourceLineNo">5109</span>    currRow.clear();<a name="line.5109"></a>
-<span class="sourceLineNo">5110</span>    hasNext = scanner.next(currRow);<a name="line.5110"></a>
-<span class="sourceLineNo">5111</span>    assertEquals(1, currRow.size());<a name="line.5111"></a>
-<span class="sourceLineNo">5112</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5112"></a>
-<span class="sourceLineNo">5113</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.5113"></a>
-<span class="sourceLineNo">5114</span>    assertFalse(hasNext);<a name="line.5114"></a>
-<span class="sourceLineNo">5115</span>    scanner.close();<a name="line.5115"></a>
-<span class="sourceLineNo">5116</span><a name="line.5116"></a>
-<span class="sourceLineNo">5117</span>    scan = new Scan(rowD, rowA);<a name="line.5117"></a>
-<span class="sourceLineNo">5118</span>    scan.addColumn(families[0], col2);<a name="line.5118"></a>
-<span class="sourceLineNo">5119</span>    scan.setReversed(true);<a name="line.5119"></a>
-<span class="sourceLineNo">5120</span>    currRow.clear();<a name="line.5120"></a>
-<span class="sourceLineNo">5121</span>    scanner = region.getScanner(scan);<a name="line.5121"></a>
-<span class="sourceLineNo">5122</span>    hasNext = scanner.next(currRow);<a name="line.5122"></a>
-<span class="sourceLineNo">5123</span>    assertEquals(1, currRow.size());<a name="line.5123"></a>
-<span class="sourceLineNo">5124</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5124"></a>
-<span class="sourceLineNo">5125</span>        .get(0).getRowLength(), rowD, 0, rowD.length));<a name="line.5125"></a>
-<span class="sourceLineNo">5126</span>    scanner.close();<a name="line.5126"></a>
-<span class="sourceLineNo">5127</span>  }<a name="line.5127"></a>
-<span class="sourceLineNo">5128</span><a name="line.5128"></a>
-<span class="sourceLineNo">5129</span>  @Test<a name="line.5129"></a>
-<span class="sourceLineNo">5130</span>  public void testReverseScanner_smaller_blocksize() throws IOException {<a name="line.5130"></a>
-<span class="sourceLineNo">5131</span>    // case to ensure no conflict with HFile index optimization<a name="line.5131"></a>
-<span class="sourceLineNo">5132</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.5132"></a>
-<span class="sourceLineNo">5133</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.5133"></a>
-<span class="sourceLineNo">5134</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.5134"></a>
-<span class="sourceLineNo">5135</span>    byte[] rowD = Bytes.toBytes("rowD");<a name="line.5135"></a>
-<span class="sourceLineNo">5136</span>    byte[] rowE = Bytes.toBytes("rowE");<a name="line.5136"></a>
-<span class="sourceLineNo">5137</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.5137"></a>
-<span class="sourceLineNo">5138</span>    byte[][] families = { cf };<a name="line.5138"></a>
-<span class="sourceLineNo">5139</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.5139"></a>
-<span class="sourceLineNo">5140</span>    byte[] col2 = Bytes.toBytes("col2");<a name="line.5140"></a>
-<span class="sourceLineNo">5141</span>    long ts = 1;<a name="line.5141"></a>
-<span class="sourceLineNo">5142</span>    HBaseConfiguration config = new HBaseConfiguration();<a name="line.5142"></a>
-<span class="sourceLineNo">5143</span>    config.setInt("test.block.size", 1);<a name="line.5143"></a>
-<span class="sourceLineNo">5144</span>    this.region = initHRegion(tableName, method, config, families);<a name="line.5144"></a>
-<span class="sourceLineNo">5145</span>    KeyValue kv1 = new KeyValue(rowA, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5145"></a>
-<span class="sourceLineNo">5146</span>    KeyValue kv2 = new KeyValue(rowB, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5146"></a>
-<span class="sourceLineNo">5147</span>    KeyValue kv3 = new KeyValue(rowC, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5147"></a>
-<span class="sourceLineNo">5148</span>    KeyValue kv4_1 = new KeyValue(rowD, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5148"></a>
-<span class="sourceLineNo">5149</span>    KeyValue kv4_2 = new KeyValue(rowD, cf, col2, ts, KeyValue.Type.Put, null);<a name="line.5149"></a>
-<span class="sourceLineNo">5150</span>    KeyValue kv5 = new KeyValue(rowE, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5150"></a>
-<span class="sourceLineNo">5151</span>    Put put = null;<a name="line.5151"></a>
-<span class="sourceLineNo">5152</span>    put = new Put(rowA);<a name="line.5152"></a>
-<span class="sourceLineNo">5153</span>    put.add(kv1);<a name="line.5153"></a>
-<span class="sourceLineNo">5154</span>    region.put(put);<a name="line.5154"></a>
-<span class="sourceLineNo">5155</span>    put = new Put(rowB);<a name="line.5155"></a>
-<span class="sourceLineNo">5156</span>    put.add(kv2);<a name="line.5156"></a>
-<span class="sourceLineNo">5157</span>    region.put(put);<a name="line.5157"></a>
-<span class="sourceLineNo">5158</span>    put = new Put(rowC);<a name="line.5158"></a>
-<span class="sourceLineNo">5159</span>    put.add(kv3);<a name="line.5159"></a>
-<span class="sourceLineNo">5160</span>    region.put(put);<a name="line.5160"></a>
-<span class="sourceLineNo">5161</span>    put = new Put(rowD);<a name="line.5161"></a>
-<span class="sourceLineNo">5162</span>    put.add(kv4_1);<a name="line.5162"></a>
-<span class="sourceLineNo">5163</span>    region.put(put);<a name="line.5163"></a>
-<span class="sourceLineNo">5164</span>    put = new Put(rowD);<a name="line.5164"></a>
-<span class="sourceLineNo">5165</span>    put.add(kv4_2);<a name="line.5165"></a>
-<span class="sourceLineNo">5166</span>    region.put(put);<a name="line.5166"></a>
-<span class="sourceLineNo">5167</span>    put = new Put(rowE);<a name="line.5167"></a>
-<span class="sourceLineNo">5168</span>    put.add(kv5);<a name="line.5168"></a>
-<span class="sourceLineNo">5169</span>    region.put(put);<a name="line.5169"></a>
-<span class="sourceLineNo">5170</span>    region.flush(true);<a name="line.5170"></a>
-<span class="sourceLineNo">5171</span>    Scan scan = new Scan(rowD, rowA);<a name="line.5171"></a>
-<span class="sourceLineNo">5172</span>    scan.addColumn(families[0], col1);<a name="line.5172"></a>
-<span class="sourceLineNo">5173</span>    scan.setReversed(true);<a name="line.5173"></a>
-<span class="sourceLineNo">5174</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5174"></a>
-<span class="sourceLineNo">5175</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5175"></a>
-<span class="sourceLineNo">5176</span>    boolean hasNext = scanner.next(currRow);<a name="line.5176"></a>
-<span class="sourceLineNo">5177</span>    assertEquals(1, currRow.size());<a name="line.5177"></a>
-<span class="sourceLineNo">5178</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5178"></a>
-<span class="sourceLineNo">5179</span>        .get(0).getRowLength(), rowD, 0, rowD.length));<a name="line.5179"></a>
-<span class="sourceLineNo">5180</span>    assertTrue(hasNext);<a name="line.5180"></a>
-<span class="sourceLineNo">5181</span>    currRow.clear();<a name="line.5181"></a>
-<span class="sourceLineNo">5182</span>    hasNext = scanner.next(currRow);<a name="line.5182"></a>
-<span class="sourceLineNo">5183</span>    assertEquals(1, currRow.size());<a name="line.5183"></a>
-<span class="sourceLineNo">5184</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5184"></a>
-<span class="sourceLineNo">5185</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.5185"></a>
-<span class="sourceLineNo">5186</span>    assertTrue(hasNext);<a name="line.5186"></a>
-<span class="sourceLineNo">5187</span>    currRow.clear();<a name="line.5187"></a>
-<span class="sourceLineNo">5188</span>    hasNext = scanner.next(currRow);<a name="line.5188"></a>
-<span class="sourceLineNo">5189</span>    assertEquals(1, currRow.size());<a name="line.5189"></a>
-<span class="sourceLineNo">5190</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5190"></a>
-<span class="sourceLineNo">5191</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.5191"></a>
-<span class="sourceLineNo">5192</span>    assertFalse(hasNext);<a name="line.5192"></a>
-<span class="sourceLineNo">5193</span>    scanner.close();<a name="line.5193"></a>
-<span class="sourceLineNo">5194</span><a name="line.5194"></a>
-<span class="sourceLineNo">5195</span>    scan = new Scan(rowD, rowA);<a name="line.5195"></a>
-<span class="sourceLineNo">5196</span>    scan.addColumn(families[0], col2);<a name="line.5196"></a>
-<span class="sourceLineNo">5197</span>    scan.setReversed(true);<a name="line.5197"></a>
-<span class="sourceLineNo">5198</span>    currRow.clear();<a name="line.5198"></a>
-<span class="sourceLineNo">5199</span>    scanner = region.getScanner(scan);<a name="line.5199"></a>
-<span class="sourceLineNo">5200</span>    hasNext = scanner.next(currRow);<a name="line.5200"></a>
-<span class="sourceLineNo">5201</span>    assertEquals(1, currRow.size());<a name="line.5201"></a>
-<span class="sourceLineNo">5202</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5202"></a>
-<span class="sourceLineNo">5203</span>        .get(0).getRowLength(), rowD, 0, rowD.length));<a name="line.5203"></a>
-<span class="sourceLineNo">5204</span>    scanner.close();<a name="line.5204"></a>
-<span class="sourceLineNo">5205</span>  }<a name="line.5205"></a>
-<span class="sourceLineNo">5206</span><a name="line.5206"></a>
-<span class="sourceLineNo">5207</span>  @Test<a name="line.5207"></a>
-<span class="sourceLineNo">5208</span>  public void testReverseScanner_FromMemStoreAndHFiles_MultiCFs1()<a name="line.5208"></a>
-<span class="sourceLineNo">5209</span>      throws IOException {<a name="line.5209"></a>
-<span class="sourceLineNo">5210</span>    byte[] row0 = Bytes.toBytes("row0"); // 1 kv<a name="line.5210"></a>
-<span class="sourceLineNo">5211</span>    byte[] row1 = Bytes.toBytes("row1"); // 2 kv<a name="line.5211"></a>
-<span class="sourceLineNo">5212</span>    byte[] row2 = Bytes.toBytes("row2"); // 4 kv<a name="line.5212"></a>
-<span class="sourceLineNo">5213</span>    byte[] row3 = Bytes.toBytes("row3"); // 2 kv<a name="line.5213"></a>
-<span class="sourceLineNo">5214</span>    byte[] row4 = Bytes.toBytes("row4"); // 5 kv<a name="line.5214"></a>
-<span class="sourceLineNo">5215</span>    byte[] row5 = Bytes.toBytes("row5"); // 2 kv<a name="line.5215"></a>
-<span class="sourceLineNo">5216</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5216"></a>
-<span class="sourceLineNo">5217</span>    byte[] cf2 = Bytes.toBytes("CF2");<a name="line.5217"></a>
-<span class="sourceLineNo">5218</span>    byte[] cf3 = Bytes.toBytes("CF3");<a name="line.5218"></a>
-<span class="sourceLineNo">5219</span>    byte[][] families = { cf1, cf2, cf3 };<a name="line.5219"></a>
-<span class="sourceLineNo">5220</span>    byte[] col = Bytes.toBytes("C");<a name="line.5220"></a>
-<span class="sourceLineNo">5221</span>    long ts = 1;<a name="line.5221"></a>
-<span class="sourceLineNo">5222</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5222"></a>
-<span class="sourceLineNo">5223</span>    // disable compactions in this test.<a name="line.5223"></a>
-<span class="sourceLineNo">5224</span>    conf.setInt("hbase.hstore.compactionThreshold", 10000);<a name="line.5224"></a>
-<span class="sourceLineNo">5225</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5225"></a>
-<span class="sourceLineNo">5226</span>    // kv naming style: kv(row number) totalKvCountInThisRow seq no<a name="line.5226"></a>
-<span class="sourceLineNo">5227</span>    KeyValue kv0_1_1 = new KeyValue(row0, cf1, col, ts, KeyValue.Type.Put,<a name="line.5227"></a>
-<span class="sourceLineNo">5228</span>        null);<a name="line.5228"></a>
-<span class="sourceLineNo">5229</span>    KeyValue kv1_2_1 = new KeyValue(row1, cf2, col, ts, KeyValue.Type.Put,<a name="line.5229"></a>
-<span class="sourceLineNo">5230</span>        null);<a name="line.5230"></a>
-<span class="sourceLineNo">5231</span>    KeyValue kv1_2_2 = new KeyValue(row1, cf1, col, ts + 1,<a name="line.5231"></a>
-<span class="sourceLineNo">5232</span>        KeyValue.Type.Put, null);<a name="line.5232"></a>
-<span class="sourceLineNo">5233</span>    KeyValue kv2_4_1 = new KeyValue(row2, cf2, col, ts, KeyValue.Type.Put,<a name="line.5233"></a>
-<span class="sourceLineNo">5234</span>        null);<a name="line.5234"></a>
-<span class="sourceLineNo">5235</span>    KeyValue kv2_4_2 = new KeyValue(row2, cf1, col, ts, KeyValue.Type.Put,<a name="line.5235"></a>
-<span class="sourceLineNo">5236</span>        null);<a name="line.5236"></a>
-<span class="sourceLineNo">5237</span>    KeyValue kv2_4_3 = new KeyValue(row2, cf3, col, ts, KeyValue.Type.Put,<a name="line.5237"></a>
+<span class="sourceLineNo">4882</span>  public HRegion initHRegion(TableName tableName, byte[] startKey, byte[] stopKey,<a name="line.4882"></a>
+<span class="sourceLineNo">4883</span>      boolean isReadOnly, Durability durability, WAL wal, byte[]... families) throws IOException {<a name="line.4883"></a>
+<span class="sourceLineNo">4884</span>    return TEST_UTIL.createLocalHRegion(tableName, startKey, stopKey,<a name="line.4884"></a>
+<span class="sourceLineNo">4885</span>        isReadOnly, durability, wal, families);<a name="line.4885"></a>
+<span class="sourceLineNo">4886</span>  }<a name="line.4886"></a>
+<span class="sourceLineNo">4887</span><a name="line.4887"></a>
+<span class="sourceLineNo">4888</span>  /**<a name="line.4888"></a>
+<span class="sourceLineNo">4889</span>   * Assert that the passed in Cell has expected contents for the specified row,<a name="line.4889"></a>
+<span class="sourceLineNo">4890</span>   * column &amp; timestamp.<a name="line.4890"></a>
+<span class="sourceLineNo">4891</span>   */<a name="line.4891"></a>
+<span class="sourceLineNo">4892</span>  private void checkOneCell(Cell kv, byte[] cf, int rowIdx, int colIdx, long ts) {<a name="line.4892"></a>
+<span class="sourceLineNo">4893</span>    String ctx = "rowIdx=" + rowIdx + "; colIdx=" + colIdx + "; ts=" + ts;<a name="line.4893"></a>
+<span class="sourceLineNo">4894</span>    assertEquals("Row mismatch which checking: " + ctx, "row:" + rowIdx,<a name="line.4894"></a>
+<span class="sourceLineNo">4895</span>        Bytes.toString(CellUtil.cloneRow(kv)));<a name="line.4895"></a>
+<span class="sourceLineNo">4896</span>    assertEquals("ColumnFamily mismatch while checking: " + ctx, Bytes.toString(cf),<a name="line.4896"></a>
+<span class="sourceLineNo">4897</span>        Bytes.toString(CellUtil.cloneFamily(kv)));<a name="line.4897"></a>
+<span class="sourceLineNo">4898</span>    assertEquals("Column qualifier mismatch while checking: " + ctx, "column:" + colIdx,<a name="line.4898"></a>
+<span class="sourceLineNo">4899</span>        Bytes.toString(CellUtil.cloneQualifier(kv)));<a name="line.4899"></a>
+<span class="sourceLineNo">4900</span>    assertEquals("Timestamp mismatch while checking: " + ctx, ts, kv.getTimestamp());<a name="line.4900"></a>
+<span class="sourceLineNo">4901</span>    assertEquals("Value mismatch while checking: " + ctx, "value-version-" + ts,<a name="line.4901"></a>
+<span class="sourceLineNo">4902</span>        Bytes.toString(CellUtil.cloneValue(kv)));<a name="line.4902"></a>
+<span class="sourceLineNo">4903</span>  }<a name="line.4903"></a>
+<span class="sourceLineNo">4904</span><a name="line.4904"></a>
+<span class="sourceLineNo">4905</span>  @Test<a name="line.4905"></a>
+<span class="sourceLineNo">4906</span>  public void testReverseScanner_FromMemStore_SingleCF_Normal()<a name="line.4906"></a>
+<span class="sourceLineNo">4907</span>      throws IOException {<a name="line.4907"></a>
+<span class="sourceLineNo">4908</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.4908"></a>
+<span class="sourceLineNo">4909</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.4909"></a>
+<span class="sourceLineNo">4910</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.4910"></a>
+<span class="sourceLineNo">4911</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.4911"></a>
+<span class="sourceLineNo">4912</span>    byte[][] families = { cf };<a name="line.4912"></a>
+<span class="sourceLineNo">4913</span>    byte[] col = Bytes.toBytes("C");<a name="line.4913"></a>
+<span class="sourceLineNo">4914</span>    long ts = 1;<a name="line.4914"></a>
+<span class="sourceLineNo">4915</span>    this.region = initHRegion(tableName, method, families);<a name="line.4915"></a>
+<span class="sourceLineNo">4916</span>    KeyValue kv1 = new KeyValue(rowC, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4916"></a>
+<span class="sourceLineNo">4917</span>    KeyValue kv11 = new KeyValue(rowC, cf, col, ts + 1, KeyValue.Type.Put,<a name="line.4917"></a>
+<span class="sourceLineNo">4918</span>        null);<a name="line.4918"></a>
+<span class="sourceLineNo">4919</span>    KeyValue kv2 = new KeyValue(rowA, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4919"></a>
+<span class="sourceLineNo">4920</span>    KeyValue kv3 = new KeyValue(rowB, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4920"></a>
+<span class="sourceLineNo">4921</span>    Put put = null;<a name="line.4921"></a>
+<span class="sourceLineNo">4922</span>    put = new Put(rowC);<a name="line.4922"></a>
+<span class="sourceLineNo">4923</span>    put.add(kv1);<a name="line.4923"></a>
+<span class="sourceLineNo">4924</span>    put.add(kv11);<a name="line.4924"></a>
+<span class="sourceLineNo">4925</span>    region.put(put);<a name="line.4925"></a>
+<span class="sourceLineNo">4926</span>    put = new Put(rowA);<a name="line.4926"></a>
+<span class="sourceLineNo">4927</span>    put.add(kv2);<a name="line.4927"></a>
+<span class="sourceLineNo">4928</span>    region.put(put);<a name="line.4928"></a>
+<span class="sourceLineNo">4929</span>    put = new Put(rowB);<a name="line.4929"></a>
+<span class="sourceLineNo">4930</span>    put.add(kv3);<a name="line.4930"></a>
+<span class="sourceLineNo">4931</span>    region.put(put);<a name="line.4931"></a>
+<span class="sourceLineNo">4932</span><a name="line.4932"></a>
+<span class="sourceLineNo">4933</span>    Scan scan = new Scan(rowC);<a name="line.4933"></a>
+<span class="sourceLineNo">4934</span>    scan.setMaxVersions(5);<a name="line.4934"></a>
+<span class="sourceLineNo">4935</span>    scan.setReversed(true);<a name="line.4935"></a>
+<span class="sourceLineNo">4936</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.4936"></a>
+<span class="sourceLineNo">4937</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.4937"></a>
+<span class="sourceLineNo">4938</span>    boolean hasNext = scanner.next(currRow);<a name="line.4938"></a>
+<span class="sourceLineNo">4939</span>    assertEquals(2, currRow.size());<a name="line.4939"></a>
+<span class="sourceLineNo">4940</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4940"></a>
+<span class="sourceLineNo">4941</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.4941"></a>
+<span class="sourceLineNo">4942</span>    assertTrue(hasNext);<a name="line.4942"></a>
+<span class="sourceLineNo">4943</span>    currRow.clear();<a name="line.4943"></a>
+<span class="sourceLineNo">4944</span>    hasNext = scanner.next(currRow);<a name="line.4944"></a>
+<span class="sourceLineNo">4945</span>    assertEquals(1, currRow.size());<a name="line.4945"></a>
+<span class="sourceLineNo">4946</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4946"></a>
+<span class="sourceLineNo">4947</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.4947"></a>
+<span class="sourceLineNo">4948</span>    assertTrue(hasNext);<a name="line.4948"></a>
+<span class="sourceLineNo">4949</span>    currRow.clear();<a name="line.4949"></a>
+<span class="sourceLineNo">4950</span>    hasNext = scanner.next(currRow);<a name="line.4950"></a>
+<span class="sourceLineNo">4951</span>    assertEquals(1, currRow.size());<a name="line.4951"></a>
+<span class="sourceLineNo">4952</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4952"></a>
+<span class="sourceLineNo">4953</span>        .get(0).getRowLength(), rowA, 0, rowA.length));<a name="line.4953"></a>
+<span class="sourceLineNo">4954</span>    assertFalse(hasNext);<a name="line.4954"></a>
+<span class="sourceLineNo">4955</span>    scanner.close();<a name="line.4955"></a>
+<span class="sourceLineNo">4956</span>  }<a name="line.4956"></a>
+<span class="sourceLineNo">4957</span><a name="line.4957"></a>
+<span class="sourceLineNo">4958</span>  @Test<a name="line.4958"></a>
+<span class="sourceLineNo">4959</span>  public void testReverseScanner_FromMemStore_SingleCF_LargerKey()<a name="line.4959"></a>
+<span class="sourceLineNo">4960</span>      throws IOException {<a name="line.4960"></a>
+<span class="sourceLineNo">4961</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.4961"></a>
+<span class="sourceLineNo">4962</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.4962"></a>
+<span class="sourceLineNo">4963</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.4963"></a>
+<span class="sourceLineNo">4964</span>    byte[] rowD = Bytes.toBytes("rowD");<a name="line.4964"></a>
+<span class="sourceLineNo">4965</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.4965"></a>
+<span class="sourceLineNo">4966</span>    byte[][] families = { cf };<a name="line.4966"></a>
+<span class="sourceLineNo">4967</span>    byte[] col = Bytes.toBytes("C");<a name="line.4967"></a>
+<span class="sourceLineNo">4968</span>    long ts = 1;<a name="line.4968"></a>
+<span class="sourceLineNo">4969</span>    this.region = initHRegion(tableName, method, families);<a name="line.4969"></a>
+<span class="sourceLineNo">4970</span>    KeyValue kv1 = new KeyValue(rowC, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4970"></a>
+<span class="sourceLineNo">4971</span>    KeyValue kv11 = new KeyValue(rowC, cf, col, ts + 1, KeyValue.Type.Put,<a name="line.4971"></a>
+<span class="sourceLineNo">4972</span>        null);<a name="line.4972"></a>
+<span class="sourceLineNo">4973</span>    KeyValue kv2 = new KeyValue(rowA, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4973"></a>
+<span class="sourceLineNo">4974</span>    KeyValue kv3 = new KeyValue(rowB, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4974"></a>
+<span class="sourceLineNo">4975</span>    Put put = null;<a name="line.4975"></a>
+<span class="sourceLineNo">4976</span>    put = new Put(rowC);<a name="line.4976"></a>
+<span class="sourceLineNo">4977</span>    put.add(kv1);<a name="line.4977"></a>
+<span class="sourceLineNo">4978</span>    put.add(kv11);<a name="line.4978"></a>
+<span class="sourceLineNo">4979</span>    region.put(put);<a name="line.4979"></a>
+<span class="sourceLineNo">4980</span>    put = new Put(rowA);<a name="line.4980"></a>
+<span class="sourceLineNo">4981</span>    put.add(kv2);<a name="line.4981"></a>
+<span class="sourceLineNo">4982</span>    region.put(put);<a name="line.4982"></a>
+<span class="sourceLineNo">4983</span>    put = new Put(rowB);<a name="line.4983"></a>
+<span class="sourceLineNo">4984</span>    put.add(kv3);<a name="line.4984"></a>
+<span class="sourceLineNo">4985</span>    region.put(put);<a name="line.4985"></a>
+<span class="sourceLineNo">4986</span><a name="line.4986"></a>
+<span class="sourceLineNo">4987</span>    Scan scan = new Scan(rowD);<a name="line.4987"></a>
+<span class="sourceLineNo">4988</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.4988"></a>
+<span class="sourceLineNo">4989</span>    scan.setReversed(true);<a name="line.4989"></a>
+<span class="sourceLineNo">4990</span>    scan.setMaxVersions(5);<a name="line.4990"></a>
+<span class="sourceLineNo">4991</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.4991"></a>
+<span class="sourceLineNo">4992</span>    boolean hasNext = scanner.next(currRow);<a name="line.4992"></a>
+<span class="sourceLineNo">4993</span>    assertEquals(2, currRow.size());<a name="line.4993"></a>
+<span class="sourceLineNo">4994</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4994"></a>
+<span class="sourceLineNo">4995</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.4995"></a>
+<span class="sourceLineNo">4996</span>    assertTrue(hasNext);<a name="line.4996"></a>
+<span class="sourceLineNo">4997</span>    currRow.clear();<a name="line.4997"></a>
+<span class="sourceLineNo">4998</span>    hasNext = scanner.next(currRow);<a name="line.4998"></a>
+<span class="sourceLineNo">4999</span>    assertEquals(1, currRow.size());<a name="line.4999"></a>
+<span class="sourceLineNo">5000</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5000"></a>
+<span class="sourceLineNo">5001</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.5001"></a>
+<span class="sourceLineNo">5002</span>    assertTrue(hasNext);<a name="line.5002"></a>
+<span class="sourceLineNo">5003</span>    currRow.clear();<a name="line.5003"></a>
+<span class="sourceLineNo">5004</span>    hasNext = scanner.next(currRow);<a name="line.5004"></a>
+<span class="sourceLineNo">5005</span>    assertEquals(1, currRow.size());<a name="line.5005"></a>
+<span class="sourceLineNo">5006</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5006"></a>
+<span class="sourceLineNo">5007</span>        .get(0).getRowLength(), rowA, 0, rowA.length));<a name="line.5007"></a>
+<span class="sourceLineNo">5008</span>    assertFalse(hasNext);<a name="line.5008"></a>
+<span class="sourceLineNo">5009</span>    scanner.close();<a name="line.5009"></a>
+<span class="sourceLineNo">5010</span>  }<a name="line.5010"></a>
+<span class="sourceLineNo">5011</span><a name="line.5011"></a>
+<span class="sourceLineNo">5012</span>  @Test<a name="line.5012"></a>
+<span class="sourceLineNo">5013</span>  public void testReverseScanner_FromMemStore_SingleCF_FullScan()<a name="line.5013"></a>
+<span class="sourceLineNo">5014</span>      throws IOException {<a name="line.5014"></a>
+<span class="sourceLineNo">5015</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.5015"></a>
+<span class="sourceLineNo">5016</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.5016"></a>
+<span class="sourceLineNo">5017</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.5017"></a>
+<span class="sourceLineNo">5018</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.5018"></a>
+<span class="sourceLineNo">5019</span>    byte[][] families = { cf };<a name="line.5019"></a>
+<span class="sourceLineNo">5020</span>    byte[] col = Bytes.toBytes("C");<a name="line.5020"></a>
+<span class="sourceLineNo">5021</span>    long ts = 1;<a name="line.5021"></a>
+<span class="sourceLineNo">5022</span>    this.region = initHRegion(tableName, method, families);<a name="line.5022"></a>
+<span class="sourceLineNo">5023</span>    KeyValue kv1 = new KeyValue(rowC, cf, col, ts, KeyValue.Type.Put, null);<a name="line.5023"></a>
+<span class="sourceLineNo">5024</span>    KeyValue kv11 = new KeyValue(rowC, cf, col, ts + 1, KeyValue.Type.Put,<a name="line.5024"></a>
+<span class="sourceLineNo">5025</span>        null);<a name="line.5025"></a>
+<span class="sourceLineNo">5026</span>    KeyValue kv2 = new KeyValue(rowA, cf, col, ts, KeyValue.Type.Put, null);<a name="line.5026"></a>
+<span class="sourceLineNo">5027</span>    KeyValue kv3 = new KeyValue(rowB, cf, col, ts, KeyValue.Type.Put, null);<a name="line.5027"></a>
+<span class="sourceLineNo">5028</span>    Put put = null;<a name="line.5028"></a>
+<span class="sourceLineNo">5029</span>    put = new Put(rowC);<a name="line.5029"></a>
+<span class="sourceLineNo">5030</span>    put.add(kv1);<a name="line.5030"></a>
+<span class="sourceLineNo">5031</span>    put.add(kv11);<a name="line.5031"></a>
+<span class="sourceLineNo">5032</span>    region.put(put);<a name="line.5032"></a>
+<span class="sourceLineNo">5033</span>    put = new Put(rowA);<a name="line.5033"></a>
+<span class="sourceLineNo">5034</span>    put.add(kv2);<a name="line.5034"></a>
+<span class="sourceLineNo">5035</span>    region.put(put);<a name="line.5035"></a>
+<span class="sourceLineNo">5036</span>    put = new Put(rowB);<a name="line.5036"></a>
+<span class="sourceLineNo">5037</span>    put.add(kv3);<a name="line.5037"></a>
+<span class="sourceLineNo">5038</span>    region.put(put);<a name="line.5038"></a>
+<span class="sourceLineNo">5039</span>    Scan scan = new Scan();<a name="line.5039"></a>
+<span class="sourceLineNo">5040</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5040"></a>
+<span class="sourceLineNo">5041</span>    scan.setReversed(true);<a name="line.5041"></a>
+<span class="sourceLineNo">5042</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5042"></a>
+<span class="sourceLineNo">5043</span>    boolean hasNext = scanner.next(currRow);<a name="line.5043"></a>
+<span class="sourceLineNo">5044</span>    assertEquals(1, currRow.size());<a name="line.5044"></a>
+<span class="sourceLineNo">5045</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5045"></a>
+<span class="sourceLineNo">5046</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.5046"></a>
+<span class="sourceLineNo">5047</span>    assertTrue(hasNext);<a name="line.5047"></a>
+<span class="sourceLineNo">5048</span>    currRow.clear();<a name="line.5048"></a>
+<span class="sourceLineNo">5049</span>    hasNext = scanner.next(currRow);<a name="line.5049"></a>
+<span class="sourceLineNo">5050</span>    assertEquals(1, currRow.size());<a name="line.5050"></a>
+<span class="sourceLineNo">5051</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5051"></a>
+<span class="sourceLineNo">5052</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.5052"></a>
+<span class="sourceLineNo">5053</span>    assertTrue(hasNext);<a name="line.5053"></a>
+<span class="sourceLineNo">5054</span>    currRow.clear();<a name="line.5054"></a>
+<span class="sourceLineNo">5055</span>    hasNext = scanner.next(currRow);<a name="line.5055"></a>
+<span class="sourceLineNo">5056</span>    assertEquals(1, currRow.size());<a name="line.5056"></a>
+<span class="sourceLineNo">5057</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5057"></a>
+<span class="sourceLineNo">5058</span>        .get(0).getRowLength(), rowA, 0, rowA.length));<a name="line.5058"></a>
+<span class="sourceLineNo">5059</span>    assertFalse(hasNext);<a name="line.5059"></a>
+<span class="sourceLineNo">5060</span>    scanner.close();<a name="line.5060"></a>
+<span class="sourceLineNo">5061</span>  }<a name="line.5061"></a>
+<span class="sourceLineNo">5062</span><a name="line.5062"></a>
+<span class="sourceLineNo">5063</span>  @Test<a name="line.5063"></a>
+<span class="sourceLineNo">5064</span>  public void testReverseScanner_moreRowsMayExistAfter() throws IOException {<a name="line.5064"></a>
+<span class="sourceLineNo">5065</span>    // case for "INCLUDE_AND_SEEK_NEXT_ROW &amp; SEEK_NEXT_ROW" endless loop<a name="line.5065"></a>
+<span class="sourceLineNo">5066</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.5066"></a>
+<span class="sourceLineNo">5067</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.5067"></a>
+<span class="sourceLineNo">5068</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.5068"></a>
+<span class="sourceLineNo">5069</span>    byte[] rowD = Bytes.toBytes("rowD");<a name="line.5069"></a>
+<span class="sourceLineNo">5070</span>    byte[] rowE = Bytes.toBytes("rowE");<a name="line.5070"></a>
+<span class="sourceLineNo">5071</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.5071"></a>
+<span class="sourceLineNo">5072</span>    byte[][] families = { cf };<a name="line.5072"></a>
+<span class="sourceLineNo">5073</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.5073"></a>
+<span class="sourceLineNo">5074</span>    byte[] col2 = Bytes.toBytes("col2");<a name="line.5074"></a>
+<span class="sourceLineNo">5075</span>    long ts = 1;<a name="line.5075"></a>
+<span class="sourceLineNo">5076</span>    this.region = initHRegion(tableName, method, families);<a name="line.5076"></a>
+<span class="sourceLineNo">5077</span>    KeyValue kv1 = new KeyValue(rowA, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5077"></a>
+<span class="sourceLineNo">5078</span>    KeyValue kv2 = new KeyValue(rowB, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5078"></a>
+<span class="sourceLineNo">5079</span>    KeyValue kv3 = new KeyValue(rowC, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5079"></a>
+<span class="sourceLineNo">5080</span>    KeyValue kv4_1 = new KeyValue(rowD, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5080"></a>
+<span class="sourceLineNo">5081</span>    KeyValue kv4_2 = new KeyValue(rowD, cf, col2, ts, KeyValue.Type.Put, null);<a name="line.5081"></a>
+<span class="sourceLineNo">5082</span>    KeyValue kv5 = new KeyValue(rowE, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5082"></a>
+<span class="sourceLineNo">5083</span>    Put put = null;<a name="line.5083"></a>
+<span class="sourceLineNo">5084</span>    put = new Put(rowA);<a name="line.5084"></a>
+<span class="sourceLineNo">5085</span>    put.add(kv1);<a name="line.5085"></a>
+<span class="sourceLineNo">5086</span>    region.put(put);<a name="line.5086"></a>
+<span class="sourceLineNo">5087</span>    put = new Put(rowB);<a name="line.5087"></a>
+<span class="sourceLineNo">5088</span>    put.add(kv2);<a name="line.5088"></a>
+<span class="sourceLineNo">5089</span>    region.put(put);<a name="line.5089"></a>
+<span class="sourceLineNo">5090</span>    put = new Put(rowC);<a name="line.5090"></a>
+<span class="sourceLineNo">5091</span>    put.add(kv3);<a name="line.5091"></a>
+<span class="sourceLineNo">5092</span>    region.put(put);<a name="line.5092"></a>
+<span class="sourceLineNo">5093</span>    put = new Put(rowD);<a name="line.5093"></a>
+<span class="sourceLineNo">5094</span>    put.add(kv4_1);<a name="line.5094"></a>
+<span class="sourceLineNo">5095</span>    region.put(put);<a name="line.5095"></a>
+<span class="sourceLineNo">5096</span>    put = new Put(rowD);<a name="line.5096"></a>
+<span class="sourceLineNo">5097</span>    put.add(kv4_2);<a name="line.5097"></a>
+<span class="sourceLineNo">5098</span>    region.put(put);<a name="line.5098"></a>
+<span class="sourceLineNo">5099</span>    put = new Put(rowE);<a name="line.5099"></a>
+<span class="sourceLineNo">5100</span>    put.add(kv5);<a name="line.5100"></a>
+<span class="sourceLineNo">5101</span>    region.put(put);<a name="line.5101"></a>
+<span class="sourceLineNo">5102</span>    region.flush(true);<a name="line.5102"></a>
+<span class="sourceLineNo">5103</span>    Scan scan = new Scan(rowD, rowA);<a name="line.5103"></a>
+<span class="sourceLineNo">5104</span>    scan.addColumn(families[0], col1);<a name="line.5104"></a>
+<span class="sourceLineNo">5105</span>    scan.setReversed(true);<a name="line.5105"></a>
+<span class="sourceLineNo">5106</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5106"></a>
+<span class="sourceLineNo">5107</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5107"></a>
+<span class="sourceLineNo">5108</span>    boolean hasNext = scanner.next(currRow);<a name="line.5108"></a>
+<span class="sourceLineNo">5109</span>    assertEquals(1, currRow.size());<a name="line.5109"></a>
+<span class="sourceLineNo">5110</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5110"></a>
+<span class="sourceLineNo">5111</span>        .get(0).getRowLength(), rowD, 0, rowD.length));<a name="line.5111"></a>
+<span class="sourceLineNo">5112</span>    assertTrue(hasNext);<a name="line.5112"></a>
+<span class="sourceLineNo">5113</span>    currRow.clear();<a name="line.5113"></a>
+<span class="sourceLineNo">5114</span>    hasNext = scanner.next(currRow);<a name="line.5114"></a>
+<span class="sourceLineNo">5115</span>    assertEquals(1, currRow.size());<a name="line.5115"></a>
+<span class="sourceLineNo">5116</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5116"></a>
+<span class="sourceLineNo">5117</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.5117"></a>
+<span class="sourceLineNo">5118</span>    assertTrue(hasNext);<a name="line.5118"></a>
+<span class="sourceLineNo">5119</span>    currRow.clear();<a name="line.5119"></a>
+<span class="sourceLineNo">5120</span>    hasNext = scanner.next(currRow);<a name="line.5120"></a>
+<span class="sourceLineNo">5121</span>    assertEquals(1, currRow.size());<a name="line.5121"></a>
+<span class="sourceLineNo">5122</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5122"></a>
+<span class="sourceLineNo">5123</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.5123"></a>
+<span class="sourceLineNo">5124</span>    assertFalse(hasNext);<a name="line.5124"></a>
+<span class="sourceLineNo">5125</span>    scanner.close();<a name="line.5125"></a>
+<span class="sourceLineNo">5126</span><a name="line.5126"></a>
+<span class="sourceLineNo">5127</span>    scan = new Scan(rowD, rowA);<a name="line.5127"></a>
+<span class="sourceLineNo">5128</span>    scan.addColumn(families[0], col2);<a name="line.5128"></a>
+<span class="sourceLineNo">5129</span>    scan.setReversed(true);<a name="line.5129"></a>
+<span class="sourceLineNo">5130</span>    currRow.clear();<a name="line.5130"></a>
+<span class="sourceLineNo">5131</span>    scanner = region.getScanner(scan);<a name="line.5131"></a>
+<span class="sourceLineNo">5132</span>    hasNext = scanner.next(currRow);<a name="line.5132"></a>
+<span class="sourceLineNo">5133</span>    assertEquals(1, currRow.size());<a name="line.5133"></a>
+<span class="sourceLineNo">5134</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5134"></a>
+<span class="sourceLineNo">5135</span>        .get(0).getRowLength(), rowD, 0, rowD.length));<a name="line.5135"></a>
+<span class="sourceLineNo">5136</span>    scanner.close();<a name="line.5136"></a>
+<span class="sourceLineNo">5137</span>  }<a name="line.5137"></a>
+<span class="sourceLineNo">5138</span><a name="line.5138"></a>
+<span class="sourceLineNo">5139</span>  @Test<a name="line.5139"></a>
+<span class="sourceLineNo">5140</span>  public void testReverseScanner_smaller_blocksize() throws IOException {<a name="line.5140"></a>
+<span class="sourceLineNo">5141</span>    // case to ensure no conflict with HFile index optimization<a name="line.5141"></a>
+<span class="sourceLineNo">5142</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.5142"></a>
+<span class="sourceLineNo">5143</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.5143"></a>
+<span class="sourceLineNo">5144</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.5144"></a>
+<span class="sourceLineNo">5145</span>    byte[] rowD = Bytes.toBytes("rowD");<a name="line.5145"></a>
+<span class="sourceLineNo">5146</span>    byte[] rowE = Bytes.toBytes("rowE");<a name="line.5146"></a>
+<span class="sourceLineNo">5147</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.5147"></a>
+<span class="sourceLineNo">5148</span>    byte[][] families = { cf };<a name="line.5148"></a>
+<span class="sourceLineNo">5149</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.5149"></a>
+<span class="sourceLineNo">5150</span>    byte[] col2 = Bytes.toBytes("col2");<a name="line.5150"></a>
+<span class="sourceLineNo">5151</span>    long ts = 1;<a name="line.5151"></a>
+<span class="sourceLineNo">5152</span>    HBaseConfiguration config = new HBaseConfiguration();<a name="line.5152"></a>
+<span class="sourceLineNo">5153</span>    config.setInt("test.block.size", 1);<a name="line.5153"></a>
+<span class="sourceLineNo">5154</span>    this.region = initHRegion(tableName, method, config, families);<a name="line.5154"></a>
+<span class="sourceLineNo">5155</span>    KeyValue kv1 = new KeyValue(rowA, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5155"></a>
+<span class="sourceLineNo">5156</span>    KeyValue kv2 = new KeyValue(rowB, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5156"></a>
+<span class="sourceLineNo">5157</span>    KeyValue kv3 = new KeyValue(rowC, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5157"></a>
+<span class="sourceLineNo">5158</span>    KeyValue kv4_1 = new KeyValue(rowD, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5158"></a>
+<span class="sourceLineNo">5159</span>    KeyValue kv4_2 = new KeyValue(rowD, cf, col2, ts, KeyValue.Type.Put, null);<a name="line.5159"></a>
+<span class="sourceLineNo">5160</span>    KeyValue kv5 = new KeyValue(rowE, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5160"></a>
+<span class="sourceLineNo">5161</span>    Put put = null;<a name="line.5161"></a>
+<span class="sourceLineNo">5162</span>    put = new Put(rowA);<a name="line.5162"></a>
+<span class="sourceLineNo">5163</span>    put.add(kv1);<a name="line.5163"></a>
+<span class="sourceLineNo">5164</span>    region.put(put);<a name="line.5164"></a>
+<span class="sourceLineNo">5165</span>    put = new Put(rowB);<a name="line.5165"></a>
+<span class="sourceLineNo">5166</span>    put.add(kv2);<a name="line.5166"></a>
+<span class="sourceLineNo">5167</span>    region.put(put);<a name="line.5167"></a>
+<span class="sourceLineNo">5168</span>    put = new Put(rowC);<a name="line.5168"></a>
+<span class="sourceLineNo">5169</span>    put.add(kv3);<a name="line.5169"></a>
+<span class="sourceLineNo">5170</span>    region.put(put);<a name="line.5170"></a>
+<span class="sourceLineNo">5171</span>    put = new Put(rowD);<a name="line.5171"></a>
+<span class="sourceLineNo">5172</span>    put.add(kv4_1);<a name="line.5172"></a>
+<span class="sourceLineNo">5173</span>    region.put(put);<a name="line.5173"></a>
+<span class="sourceLineNo">5174</span>    put = new Put(rowD);<a name="line.5174"></a>
+<span class="sourceLineNo">5175</span>    put.add(kv4_2);<a name="line.5175"></a>
+<span class="sourceLineNo">5176</span>    region.put(put);<a name="line.5176"></a>
+<span class="sourceLineNo">5177</span>    put = new Put(rowE);<a name="line.5177"></a>
+<span class="sourceLineNo">5178</span>    put.add(kv5);<a name="line.5178"></a>
+<span class="sourceLineNo">5179</span>    region.put(put);<a name="line.5179"></a>
+<span class="sourceLineNo">5180</span>    region.flush(true);<a name="line.5180"></a>
+<span class="sourceLineNo">5181</span>    Scan scan = new Scan(rowD, rowA);<a name="line.5181"></a>
+<span class="sourceLineNo">5182</span>    scan.addColumn(families[0], col1);<a name="line.5182"></a>
+<span class="sourceLineNo">5183</span>    scan.setReversed(true);<a name="line.5183"></a>
+<span class="sourceLineNo">5184</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5184"></a>
+<span class="sourceLineNo">5185</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5185"></a>
+<span class="sourceLineNo">5186</span>    boolean hasNext = scanner.next(currRow);<a name="line.5186"></a>
+<span class="sourceLineNo">5187</span>    assertEquals(1, currRow.size());<a name="line.5187"></a>
+<span class="sourceLineNo">5188</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5188"></a>
+<span class="sourceLineNo">5189</span>        .get(0).getRowLength(), rowD, 0, rowD.length));<a name="line.5189"></a>
+<span class="sourceLineNo">5190</span>    assertTrue(hasNext);<a name="line.5190"></a>
+<span class="sourceLineNo">5191</span>    currRow.clear();<a name="line.5191"></a>
+<span class="sourceLineNo">5192</span>    hasNext = scanner.next(currRow);<a name="line.5192"></a>
+<span class="sourceLineNo">5193</span>    assertEquals(1, currRow.size());<a name="line.5193"></a>
+<span class="sourceLineNo">5194</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5194"></a>
+<span class="sourceLineNo">5195</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.5195"></a>
+<span class="sourceLineNo">5196</span>    assertTrue(hasNext);<a name="line.5196"></a>
+<span class="sourceLineNo">5197</span>    currRow.clear();<a name="line.5197"></a>
+<span class="sourceLineNo">5198</span>    hasNext = scanner.next(currRow);<a name="line.5198"></a>
+<span class="sourceLineNo">5199</span>    assertEquals(1, currRow.size());<a name="line.5199"></a>
+<span class="sourceLineNo">5200</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5200"></a>
+<span class="sourceLineNo">5201</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.5201"></a>
+<span class="sourceLineNo">5202</span>    assertFalse(hasNext);<a name="line.5202"></a>
+<span class="sourceLineNo">5203</span>    scanner.close();<a name="line.5203"></a>
+<span class="sourceLineNo">5204</span><a name="line.5204"></a>
+<span class="sourceLineNo">5205</span>    scan = new Scan(rowD, rowA);<a name="line.5205"></a>
+<span class="sourceLineNo">5206</span>    scan.addColumn(families[0], col2);<a name="line.5206"></a>
+<span class="sourceLineNo">5207</span>    scan.setReversed(true);<a name="line.5207"></a>
+<span class="sourceLineNo">5208</span>    currRow.clear();<a name="line.5208"></a>
+<span class="sourceLineNo">5209</span>    scanner = region.getScanner(scan);<a name="line.5209"></a>
+<span class="sourceLineNo">5210</span>    hasNext = scanner.next(currRow);<a name="line.5210"></a>
+<span class="sourceLineNo">5211</span>    assertEquals(1, currRow.size());<a name="line.5211"></a>
+<span class="sourceLineNo">5212</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5212"></a>
+<span class="sourceLineNo">5213</span>        .get(0).getRowLength(), rowD, 0, rowD.length));<a name="line.5213"></a>
+<span class="sourceLineNo">5214</span>    scanner.close();<a name="line.5214"></a>
+<span class="sourceLineNo">5215</span>  }<a name="line.5215"></a>
+<span class="sourceLineNo">5216</span><a name="line.5216"></a>
+<span class="sourceLineNo">5217</span>  @Test<a name="line.5217"></a>
+<span class="sourceLineNo">5218</span>  public void testReverseScanner_FromMemStoreAndHFiles_MultiCFs1()<a name="line.5218"></a>
+<span class="sourceLineNo">5219</span>      throws IOException {<a name="line.5219"></a>
+<span class="sourceLineNo">5220</span>    byte[] row0 = Bytes.toBytes("row0"); // 1 kv<a name="line.5220"></a>
+<span class="sourceLineNo">5221</span>    byte[] row1 = Bytes.toBytes("row1"); // 2 kv<a name="line.5221"></a>
+<span class="sourceLineNo">5222</span>    byte[] row2 = Bytes.toBytes("row2"); // 4 kv<a name="line.5222"></a>
+<span class="sourceLineNo">5223</span>    byte[] row3 = Bytes.toBytes("row3"); // 2 kv<a name="line.5223"></a>
+<span class="sourceLineNo">5224</span>    byte[] row4 = Bytes.toBytes("row4"); // 5 kv<a name="line.5224"></a>
+<span class="sourceLineNo">5225</span>    byte[] row5 = Bytes.toBytes("row5"); // 2 kv<a name="line.5225"></a>
+<span class="sourceLineNo">5226</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5226"></a>
+<span class="sourceLineNo">5227</span>    byte[] cf2 = Bytes.toBytes("CF2");<a name="line.5227"></a>
+<span class="sourceLineNo">5228</span>    byte[] cf3 = Bytes.toBytes("CF3");<a name="line.5228"></a>
+<span class="sourceLineNo">5229</span>    byte[][] families = { cf1, cf2, cf3 };<a name="line.5229"></a>
+<span class="sourceLineNo">5230</span>    byte[] col = Bytes.toBytes("C");<a name="line.5230"></a>
+<span class="sourceLineNo">5231</span>    long ts = 1;<a name="line.5231"></a>
+<span class="sourceLineNo">5232</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5232"></a>
+<span class="sourceLineNo">5233</span>    // disable compactions in this test.<a name="line.5233"></a>
+<span class="sourceLineNo">5234</span>    conf.setInt("hbase.hstore.compactionThreshold", 10000);<a name="line.5234"></a>
+<span class="sourceLineNo">5235</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5235"></a>
+<span class="sourceLineNo">5236</span>    // kv naming style: kv(row number) totalKvCountInThisRow seq no<a name="line.5236"></a>
+<span class="sourceLineNo">5237</span>    KeyValue kv0_1_1 = new KeyValue(row0, cf1, col, ts, KeyValue.Type.Put,<a name="line.5237"></a>
 <span class="sourceLineNo">5238</span>        null);<a name="line.5238"></a>
-<span class="sourceLineNo">5239</span>    KeyValue kv2_4_4 = new KeyValue(row2, cf1, col, ts + 4,<a name="line.5239"></a>
-<span class="sourceLineNo">5240</span>        KeyValue.Type.Put, null);<a name="line.5240"></a>
-<span class="sourceLineNo">5241</span>    KeyValue kv3_2_1 = new KeyValue(row3, cf2, col, ts, KeyValue.Type.Put,<a name="line.5241"></a>
-<span class="sourceLineNo">5242</span>        null);<a name="line.5242"></a>
-<span class="sourceLineNo">5243</span>    KeyValue kv3_2_2 = new KeyValue(row3, cf1, col, ts + 4,<a name="line.5243"></a>
-<span class="sourceLineNo">5244</span>        KeyValue.Type.Put, null);<a name="line.5244"></a>
-<span class="sourceLineNo">5245</span>    KeyValue kv4_5_1 = new KeyValue(row4, cf1, col, ts, KeyValue.Type.Put,<a name="line.5245"></a>
+<span class="sourceLineNo">5239</span>    KeyValue kv1_2_1 = new KeyValue(row1, cf2, col, ts, KeyValue.Type.Put,<a name="line.5239"></a>
+<span class="sourceLineNo">5240</span>        null);<a name="line.5240"></a>
+<span class="sourceLineNo">5241</span>    KeyValue kv1_2_2 = new KeyValue(row1, cf1, col, ts + 1,<a name="line.5241"></a>
+<span class="sourceLineNo">5242</span>        KeyValue.Type.Put, null);<a name="line.5242"></a>
+<span class="sourceLineNo">5243</span>    KeyValue kv2_4_1 = new KeyValue(row2, cf2, col, ts, KeyValue.Type.Put,<a name="line.5243"></a>
+<span class="sourceLineNo">5244</span>        null);<a name="line.5244"></a>
+<span class="sourceLineNo">5245</span>    KeyValue kv2_4_2 = new KeyValue(row2, cf1, col, ts, KeyValue.Type.Put,<a name="line.5245"></a>
 <span class="sourceLineNo">5246</span>        null);<a name="line.5246"></a>
-<span class="sourceLineNo">5247</span>    KeyValue kv4_5_2 = new KeyValue(row4, cf3, col, ts, KeyValue.Type.Put,<a name="line.5247"></a>
+<span class="sourceLineNo">5247</span>    KeyValue kv2_4_3 = new KeyValue(row2, cf3, col, ts, KeyValue.Type.Put,<a name="line.5247"></a>
 <span class="sourceLineNo">5248</span>        null);<a name="line.5248"></a>
-<span class="sourceLineNo">5249</span>    KeyValue kv4_5_3 = new KeyValue(row4, cf3, col, ts + 5,<a name="line.5249"></a>
+<span class="sourceLineNo">5249</span>    KeyValue kv2_4_4 = new KeyValue(row2, cf1, col, ts + 4,<a name="line.5249"></a>
 <span class="sourceLineNo">5250</span>        KeyValue.Type.Put, null);<a name="line.5250"></a>
-<span class="sourceLineNo">5251</span>    KeyValue kv4_5_4 = new KeyValue(row4, cf2, col, ts, KeyValue.Type.Put,<a name="line.5251"></a>
+<span class="sourceLineNo">5251</span>    KeyValue kv3_2_1 = new KeyValue(row3, cf2, col, ts, KeyValue.Type.Put,<a name="line.5251"></a>
 <span class="sourceLineNo">5252</span>        null);<a name="line.5252"></a>
-<span class="sourceLineNo">5253</span>    KeyValue kv4_5_5 = new KeyValue(row4, cf1, col, ts + 3,<a name="line.5253"></a>
+<span class="sourceLineNo">5253</span>    KeyValue kv3_2_2 = new KeyValue(row3, cf1, col, ts + 4,<a name="line.5253"></a>
 <span class="sourceLineNo">5254</span>        KeyValue.Type.Put, null);<a name="line.5254"></a>
-<span class="sourceLineNo">5255</span>    KeyValue kv5_2_1 = new KeyValue(row5, cf2, col, ts, KeyValue.Type.Put,<a name="line.5255"></a>
+<span class="sourceLineNo">5255</span>    KeyValue kv4_5_1 = new KeyValue(row4, cf1, col, ts, KeyValue.Type.Put,<a name="line.5255"></a>
 <span class="sourceLineNo">5256</span>        null);<a name="line.5256"></a>
-<span class="sourceLineNo">5257</span>    KeyValue kv5_2_2 = new KeyValue(row5, cf3, col, ts, KeyValue.Type.Put,<a name="line.5257"></a>
+<span class="sourceLineNo">5257</span>    KeyValue kv4_5_2 = new KeyValue(row4, cf3, col, ts, KeyValue.Type.Put,<a name="line.5257"></a>
 <span class="sourceLineNo">5258</span>        null);<a name="line.5258"></a>
-<span class="sourceLineNo">5259</span>    // hfiles(cf1/cf2) :"row1"(1 kv) / "row2"(1 kv) / "row4"(2 kv)<a name="line.5259"></a>
-<span class="sourceLineNo">5260</span>    Put put = null;<a name="line.5260"></a>
-<span class="sourceLineNo">5261</span>    put = new Put(row1);<a name="line.5261"></a>
-<span class="sourceLineNo">5262</span>    put.add(kv1_2_1);<a name="line.5262"></a>
-<span class="sourceLineNo">5263</span>    region.put(put);<a name="line.5263"></a>
-<span class="sourceLineNo">5264</span>    put = new Put(row2);<a name="line.5264"></a>
-<span class="sourceLineNo">5265</span>    put.add(kv2_4_1);<a name="line.5265"></a>
-<span class="sourceLineNo">5266</span>    region.put(put);<a name="line.5266"></a>
-<span class="sourceLineNo">5267</span>    put = new Put(row4);<a name="line.5267"></a>
-<span class="sourceLineNo">5268</span>    put.add(kv4_5_4);<a name="line.5268"></a>
-<span class="sourceLineNo">5269</span>    put.add(kv4_5_5);<a name="line.5269"></a>
-<span class="sourceLineNo">5270</span>    region.put(put);<a name="line.5270"></a>
-<span class="sourceLineNo">5271</span>    region.flush(true);<a name="line.5271"></a>
-<span class="sourceLineNo">5272</span>    // hfiles(cf1/cf3) : "row1" (1 kvs) / "row2" (1 kv) / "row4" (2 kv)<a name="line.5272"></a>
-<span class="sourceLineNo">5273</span>    put = new Put(row4);<a name="line.5273"></a>
-<span class="sourceLineNo">5274</span>    put.add(kv4_5_1);<a name="line.5274"></a>
-<span class="sourceLineNo">5275</span>    put.add(kv4_5_3);<a name="line.5275"></a>
+<span class="sourceLineNo">5259</span>    KeyValue kv4_5_3 = new KeyValue(row4, cf3, col, ts + 5,<a name="line.5259"></a>
+<span class="sourceLineNo">5260</span>        KeyValue.Type.Put, null);<a name="line.5260"></a>
+<span class="sourceLineNo">5261</span>    KeyValue kv4_5_4 = new KeyValue(row4, cf2, col, ts, KeyValue.Type.Put,<a name="line.5261"></a>
+<span class="sourceLineNo">5262</span>        null);<a name="line.5262"></a>
+<span class="sourceLineNo">5263</span>    KeyValue kv4_5_5 = new KeyValue(row4, cf1, col, ts + 3,<a name="line.5263"></a>
+<span class="sourceLineNo">5264</span>        KeyValue.Type.Put, null);<a name="line.5264"></a>
+<span class="sourceLineNo">5265</span>    KeyValue kv5_2_1 = new KeyValue(row5, cf2, col, ts, KeyValue.Type.Put,<a name="line.5265"></a>
+<span class="sourceLineNo">5266</span>        null);<a name="line.5266"></a>
+<span class="sourceLineNo">5267</span>    KeyValue kv5_2_2 = new KeyValue(row5, cf3, col, ts, KeyValue.Type.Put,<a name="line.5267"></a>
+<span class="sourceLineNo">5268</span>        null);<a name="line.5268"></a>
+<span class="sourceLineNo">5269</span>    // hfiles(cf1/cf2) :"row1"(1 kv) / "row2"(1 kv) / "row4"(2 kv)<a name="line.5269"></a>
+<span class="sourceLineNo">5270</span>    Put put = null;<a name="line.5270"></a>
+<span class="sourceLineNo">5271</span>    put = new Put(row1);<a name="line.5271"></a>
+<span class="sourceLineNo">5272</span>    put.add(kv1_2_1);<a name="line.5272"></a>
+<span class="sourceLineNo">5273</span>    region.put(put);<a name="line.5273"></a>
+<span class="sourceLineNo">5274</span>    put = new Put(row2);<a name="line.5274"></a>
+<span class="sourceLineNo">5275</span>    put.add(kv2_4_1);<a name="line.5275"></a>
 <span class="sourceLineNo">5276</span>    region.put(put);<a name="line.5276"></a>
-<span class="sourceLineNo">5277</span>    put = new Put(row1);<a name="line.5277"></a>
-<span class="sourceLineNo">5278</span>    put.add(kv1_2_2);<a name="line.5278"></a>
-<span class="sourceLineNo">5279</span>    region.put(put);<a name="line.5279"></a>
-<span class="sourceLineNo">5280</span>    put = new Put(row2);<a name="line.5280"></a>
-<span class="sourceLineNo">5281</span>    put.add(kv2_4_4);<a name="line.5281"></a>
-<span class="sourceLineNo">5282</span>    region.put(put);<a name="line.5282"></a>
-<span class="sourceLineNo">5283</span>    region.flush(true);<a name="line.5283"></a>
-<span class="sourceLineNo">5284</span>    // hfiles(cf1/cf3) : "row2"(2 kv) / "row3"(1 kvs) / "row4" (1 kv)<a name="line.5284"></a>
-<span class="sourceLineNo">5285</span>    put = new Put(row4);<a name="line.5285"></a>
-<span class="sourceLineNo">5286</span>    put.add(kv4_5_2);<a name="line.5286"></a>
-<span class="sourceLineNo">5287</span>    region.put(put);<a name="line.5287"></a>
-<span class="sourceLineNo">5288</span>    put = new Put(row2);<a name="line.5288"></a>
-<span class="sourceLineNo">5289</span>    put.add(kv2_4_2);<a name="line.5289"></a>
-<span class="sourceLineNo">5290</span>    put.add(kv2_4_3);<a name="line.5290"></a>
-<span class="sourceLineNo">5291</span>    region.put(put);<a name="line.5291"></a>
-<span class="sourceLineNo">5292</span>    put = new Put(row3);<a name="line.5292"></a>
-<span class="sourceLineNo">5293</span>    put.add(kv3_2_2);<a name="line.5293"></a>
-<span class="sourceLineNo">5294</span>    region.put(put);<a name="line.5294"></a>
-<span class="sourceLineNo">5295</span>    region.flush(true);<a name="line.5295"></a>
-<span class="sourceLineNo">5296</span>    // memstore(cf1/cf2/cf3) : "row0" (1 kvs) / "row3" ( 1 kv) / "row5" (max)<a name="line.5296"></a>
-<span class="sourceLineNo">5297</span>    // ( 2 kv)<a name="line.5297"></a>
-<span class="sourceLineNo">5298</span>    put = new Put(row0);<a name="line.5298"></a>
-<span class="sourceLineNo">5299</span>    put.add(kv0_1_1);<a name="line.5299"></a>
-<span class="sourceLineNo">5300</span>    region.put(put);<a name="line.5300"></a>
-<span class="sourceLineNo">5301</span>    put = new Put(row3);<a name="line.5301"></a>
-<span class="sourceLineNo">5302</span>    put.add(kv3_2_1);<a name="line.5302"></a>
-<span class="sourceLineNo">5303</span>    region.put(put);<a name="line.5303"></a>
-<span class="sourceLineNo">5304</span>    put = new Put(row5);<a name="line.5304"></a>
-<span class="sourceLineNo">5305</span>    put.add(kv5_2_1);<a name="line.5305"></a>
-<span class="sourceLineNo">5306</span>    put.add(kv5_2_2);<a name="line.5306"></a>
-<span class="sourceLineNo">5307</span>    region.put(put);<a name="line.5307"></a>
-<span class="sourceLineNo">5308</span>    // scan range = ["row4", min), skip the max "row5"<a name="line.5308"></a>
-<span class="sourceLineNo">5309</span>    Scan scan = new Scan(row4);<a name="line.5309"></a>
-<span class="sourceLineNo">5310</span>    scan.setMaxVersions(5);<a name="line.5310"></a>
-<span class="sourceLineNo">5311</span>    scan.setBatch(3);<a name="line.5311"></a>
-<span class="sourceLineNo">5312</span>    scan.setReversed(true);<a name="line.5312"></a>
-<span class="sourceLineNo">5313</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5313"></a>
-<span class="sourceLineNo">5314</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5314"></a>
-<span class="sourceLineNo">5315</span>    boolean hasNext = false;<a name="line.5315"></a>
-<span class="sourceLineNo">5316</span>    // 1. scan out "row4" (5 kvs), "row5" can't be scanned out since not<a name="line.5316"></a>
-<span class="sourceLineNo">5317</span>    // included in scan range<a name="line.5317"></a>
-<span class="sourceLineNo">5318</span>    // "row4" takes 2 next() calls since batch=3<a name="line.5318"></a>
-<span class="sourceLineNo">5319</span>    hasNext = scanner.next(currRow);<a name="line.5319"></a>
-<span class="sourceLineNo">5320</span>    assertEquals(3, currRow.size());<a name="line.5320"></a>
-<span class="sourceLineNo">5321</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5321"></a>
-<span class="sourceLineNo">5322</span>        .get(0).getRowLength(), row4, 0, row4.length));<a name="line.5322"></a>
-<span class="sourceLineNo">5323</span>    assertTrue(hasNext);<a name="line.5323"></a>
-<span class="sourceLineNo">5324</span>    currRow.clear();<a name="line.5324"></a>
-<span class="sourceLineNo">5325</span>    hasNext = scanner.next(currRow);<a name="line.5325"></a>
-<span class="sourceLineNo">5326</span>    assertEquals(2, currRow.size());<a name="line.5326"></a>
-<span class="sourceLineNo">5327</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(),<a name="line.5327"></a>
-<span class="sourceLineNo">5328</span>        currRow.get(0).getRowLength(), row4, 0,<a name="line.5328"></a>
-<span class="sourceLineNo">5329</span>      row4.length));<a name="line.5329"></a>
-<span class="sourceLineNo">5330</span>    assertTrue(hasNext);<a name="line.5330"></a>
-<span class="sourceLineNo">5331</span>    // 2. scan out "row3" (2 kv)<a name="line.5331"></a>
-<span class="sourceLineNo">5332</span>    currRow.clear();<a name="line.5332"></a>
-<span class="sourceLineNo">5333</span>    hasNext = scanner.next(currRow);<a name="line.5333"></a>
-<span class="sourceLineNo">5334</span>    assertEquals(2, currRow.size());<a name="line.5334"></a>
-<span class="sourceLineNo">5335</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5335"></a>
-<span class="sourceLineNo">5336</span>        .get(0).getRowLength(), row3, 0, row3.length));<a name="line.5336"></a>
-<span class="sourceLineNo">5337</span>    assertTrue(hasNext);<a name="line.5337"></a>
-<span class="sourceLineNo">5338</span>    // 3. scan out "row2" (4 kvs)<a name="line.5338"></a>
-<span class="sourceLineNo">5339</span>    // "row2" takes 2 next() calls since batch=3<a name="line.5339"></a>
-<span class="sourceLineNo">5340</span>    currRow.clear();<a name="line.5340"></a>
-<span class="sourceLineNo">5341</span>    hasNext = scanner.next(currRow);<a name="line.5341"></a>
-<span class="sourceLineNo">5342</span>    assertEquals(3, currRow.size());<a name="line.5342"></a>
-<span class="sourceLineNo">5343</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5343"></a>
-<span class="sourceLineNo">5344</span>        .get(0).getRowLength(), row2, 0, row2.length));<a name="line.5344"></a>
-<span class="sourceLineNo">5345</span>    assertTrue(hasNext);<a name="line.5345"></a>
-<span class="sourceLineNo">5346</span>    currRow.clear();<a name="line.5346"></a>
-<span class="sourceLineNo">5347</span>    hasNext = scanner.next(currRow);<a name="line.5347"></a>
-<span class="sourceLineNo">5348</span>    assertEquals(1, currRow.size());<a name="line.5348"></a>
-<span class="sourceLineNo">5349</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5349"></a>
-<span class="sourceLineNo">5350</span>        .get(0).getRowLength(), row2, 0, row2.length));<a name="line.5350"></a>
-<span class="sourceLineNo">5351</span>    assertTrue(hasNext);<a name="line.5351"></a>
-<span class="sourceLineNo">5352</span>    // 4. scan out "row1" (2 kv)<a name="line.5352"></a>
-<span class="sourceLineNo">5353</span>    currRow.clear();<a name="line.5353"></a>
-<span class="sourceLineNo">5354</span>    hasNext = scanner.next(currRow);<a name="line.5354"></a>
-<span class="sourceLineNo">5355</span>    assertEquals(2, currRow.size());<a name="line.5355"></a>
-<span class="sourceLineNo">5356</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5356"></a>
-<span class="sourceLineNo">5357</span>        .get(0).getRowLength(), row1, 0, row1.length));<a name="line.5357"></a>
-<span class="sourceLineNo">5358</span>    assertTrue(hasNext);<a name="line.5358"></a>
-<span class="sourceLineNo">5359</span>    // 5. scan out "row0" (1 kv)<a name="line.5359"></a>
-<span class="sourceLineNo">5360</span>    currRow.clear();<a name="line.5360"></a>
-<span class="sourceLineNo">5361</span>    hasNext = scanner.next(currRow);<a name="line.5361"></a>
-<span class="sourceLineNo">5362</span>    assertEquals(1, currRow.size());<a name="line.5362"></a>
-<span class="sourceLineNo">5363</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5363"></a>
-<span class="sourceLineNo">5364</span>        .get(0).getRowLength(), row0, 0, row0.length));<a name="line.5364"></a>
-<span class="sourceLineNo">5365</span>    assertFalse(hasNext);<a name="line.5365"></a>
-<span class="sourceLineNo">5366</span><a name="line.5366"></a>
-<span class="sourceLineNo">5367</span>    scanner.close();<a name="line.5367"></a>
-<span class="sourceLineNo">5368</span>  }<a name="line.5368"></a>
-<span class="sourceLineNo">5369</span><a name="line.5369"></a>
-<span class="sourceLineNo">5370</span>  @Test<a name="line.5370"></a>
-<span class="sourceLineNo">5371</span>  public void testReverseScanner_FromMemStoreAndHFiles_MultiCFs2()<a name="line.5371"></a>
-<span class="sourceLineNo">5372</span>      throws IOException {<a name="line.5372"></a>
-<span class="sourceLineNo">5373</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.5373"></a>
-<span class="sourceLineNo">5374</span>    byte[] row2 = Bytes.toBytes("row2");<a name="line.5374"></a>
-<span class="sourceLineNo">5375</span>    byte[] row3 = Bytes.toBytes("row3");<a name="line.5375"></a>
-<span class="sourceLineNo">5376</span>    byte[] row4 = Bytes.toBytes("row4");<a name="line.5376"></a>
-<span class="sourceLineNo">5377</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5377"></a>
-<span class="sourceLineNo">5378</span>    byte[] cf2 = Bytes.toBytes("CF2");<a name="line.5378"></a>
-<span class="sourceLineNo">5379</span>    byte[] cf3 = Bytes.toBytes("CF3");<a name="line.5379"></a>
-<span class="sourceLineNo">5380</span>    byte[] cf4 = Bytes.toBytes("CF4");<a name="line.5380"></a>
-<span class="sourceLineNo">5381</span>    byte[][] families = { cf1, cf2, cf3, cf4 };<a name="line.5381"></a>
-<span class="sourceLineNo">5382</span>    byte[] col = Bytes.toBytes("C");<a name="line.5382"></a>
-<span class="sourceLineNo">5383</span>    long ts = 1;<a name="line.5383"></a>
-<span class="sourceLineNo">5384</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5384"></a>
-<span class="sourceLineNo">5385</span>    // disable compactions in this test.<a name="line.5385"></a>
-<span class="sourceLineNo">5386</span>    conf.setInt("hbase.hstore.compactionThreshold", 10000);<a name="line.5386"></a>
-<span class="sourceLineNo">5387</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5387"></a>
-<span class="sourceLineNo">5388</span>    KeyValue kv1 = new KeyValue(row1, cf1, col, ts, KeyValue.Type.Put, null);<a name="line.5388"></a>
-<span class="sourceLineNo">5389</span>    KeyValue kv2 = new KeyValue(row2, cf2, col, ts, KeyValue.Type.Put, null);<a name="line.5389"></a>
-<span class="sourceLineNo">5390</span>    KeyValue kv3 = new KeyValue(row3, cf3, col, ts, KeyValue.Type.Put, null);<a name="line.5390"></a>
-<span class="sourceLineNo">5391</span>    KeyValue kv4 = new KeyValue(row4, cf4, col, ts, KeyValue.Type.Put, null);<a name="line.5391"></a>
-<span class="sourceLineNo">5392</span>    // storefile1<a name="line.5392"></a>
-<span class="sourceLineNo">5393</span>    Put put = new Put(row1);<a name="line.5393"></a>
-<span class="sourceLineNo">5394</span>    put.add(kv1);<a name="line.5394"></a>
-<span class="sourceLineNo">5395</span>    region.put(put);<a name="line.5395"></a>
-<span class="sourceLineNo">5396</span>    region.flush(true);<a name="line.5396"></a>
-<span class="sourceLineNo">5397</span>    // storefile2<a name="line.5397"></a>
-<span class="sourceLineNo">5398</span>    put = new Put(row2);<a name="line.5398"></a>
-<span class="sourceLineNo">5399</span>    put.add(kv2);<a name="line.5399"></a>
-<span class="sourceLineNo">5400</span>    region.put(put);<a name="line.5400"></a>
-<span class="sourceLineNo">5401</span>    region.flush(true);<a name="line.5401"></a>
-<span class="sourceLineNo">5402</span>    // storefile3<a name="line.5402"></a>
-<span class="sourceLineNo">5403</span>    put = new Put(row3);<a name="line.5403"></a>
-<span class="sourceLineNo">5404</span>    put.add(kv3);<a name="line.5404"></a>
+<span class="sourceLineNo">5277</span>    put = new Put(row4);<a name="line.5277"></a>
+<span class="sourceLineNo">5278</span>    put.add(kv4_5_4);<a name="line.5278"></a>
+<span class="sourceLineNo">5279</span>    put.add(kv4_5_5);<a name="line.5279"></a>
+<span class="sourceLineNo">5280</span>    region.put(put);<a name="line.5280"></a>
+<span class="sourceLineNo">5281</span>    region.flush(true);<a name="line.5281"></a>
+<span class="sourceLineNo">5282</span>    // hfiles(cf1/cf3) : "row1" (1 kvs) / "row2" (1 kv) / "row4" (2 kv)<a name="line.5282"></a>
+<span class="sourceLineNo">5283</span>    put = new Put(row4);<a name="line.5283"></a>
+<span class="sourceLineNo">5284</span>    put.add(kv4_5_1);<a name="line.5284"></a>
+<span class="sourceLineNo">5285</span>    put.add(kv4_5_3);<a name="line.5285"></a>
+<span class="sourceLineNo">5286</span>    region.put(put);<a name="line.5286"></a>
+<span class="sourceLineNo">5287</span>    put = new Put(row1);<a name="line.5287"></a>
+<span class="sourceLineNo">5288</span>    put.add(kv1_2_2);<a name="line.5288"></a>
+<span class="sourceLineNo">5289</span>    region.put(put);<a name="line.5289"></a>
+<span class="sourceLineNo">5290</span>    put = new Put(row2);<a name="line.5290"></a>
+<span class="sourceLineNo">5291</span>    put.add(kv2_4_4);<a name="line.5291"></a>
+<span class="sourceLineNo">5292</span>    region.put(put);<a name="line.5292"></a>
+<span class="sourceLineNo">5293</span>    region.flush(true);<a name="line.5293"></a>
+<span class="sourceLineNo">5294</span>    // hfiles(cf1/cf3) : "row2"(2 kv) / "row3"(1 kvs) / "row4" (1 kv)<a name="line.5294"></a>
+<span class="sourceLineNo">5295</span>    put = new Put(row4);<a name="line.5295"></a>
+<span class="sourceLineNo">5296</span>    put.add(kv4_5_2);<a name="line.5296"></a>
+<span class="sourceLineNo">5297</span>    region.put(put);<a name="line.5297"></a>
+<span class="sourceLineNo">5298</span>    put = new Put(row2);<a name="line.5298"></a>
+<span class="sourceLineNo">5299</span>    put.add(kv2_4_2);<a name="line.5299"></a>
+<span class="sourceLineNo">5300</span>    put.add(kv2_4_3);<a name="line.5300"></a>
+<span class="sourceLineNo">5301</span>    region.put(put);<a name="line.5301"></a>
+<span class="sourceLineNo">5302</span>    put = new Put(row3);<a name="line.5302"></a>
+<span class="sourceLineNo">5303</span>    put.add(kv3_2_2);<a name="line.5303"></a>
+<span class="sourceLineNo">5304</span>    region.put(put);<a name="line.5304"></a>
+<span class="sourceLineNo">5305</span>    region.flush(true);<a name="line.5305"></a>
+<span class="sourceLineNo">5306</span>    // memstore(cf1/cf2/cf3) : "row0" (1 kvs) / "row3" ( 1 kv) / "row5" (max)<a name="line.5306"></a>
+<span class="sourceLineNo">5307</span>    // ( 2 kv)<a name="line.5307"></a>
+<span class="sourceLineNo">5308</span>    put = new Put(row0);<a name="line.5308"></a>
+<span class="sourceLineNo">5309</span>    put.add(kv0_1_1);<a name="line.5309"></a>
+<span class="sourceLineNo">5310</span>    region.put(put);<a name="line.5310"></a>
+<span class="sourceLineNo">5311</span>    put = new Put(row3);<a name="line.5311"></a>
+<span class="sourceLineNo">5312</span>    put.add(kv3_2_1);<a name="line.5312"></a>
+<span class="sourceLineNo">5313</span>    region.put(put);<a name="line.5313"></a>
+<span class="sourceLineNo">5314</span>    put = new Put(row5);<a name="line.5314"></a>
+<span class="sourceLineNo">5315</span>    put.add(kv5_2_1);<a name="line.5315"></a>
+<span class="sourceLineNo">5316</span>    put.add(kv5_2_2);<a name="line.5316"></a>
+<span class="sourceLineNo">5317</span>    region.put(put);<a name="line.5317"></a>
+<span class="sourceLineNo">5318</span>    // scan range = ["row4", min), skip the max "row5"<a name="line.5318"></a>
+<span class="sourceLineNo">5319</span>    Scan scan = new Scan(row4);<a name="line.5319"></a>
+<span class="sourceLineNo">5320</span>    scan.setMaxVersions(5);<a name="line.5320"></a>
+<span class="sourceLineNo">5321</span>    scan.setBatch(3);<a name="line.5321"></a>
+<span class="sourceLineNo">5322</span>    scan.setReversed(true);<a name="line.5322"></a>
+<span class="sourceLineNo">5323</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5323"></a>
+<span class="sourceLineNo">5324</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5324"></a>
+<span class="sourceLineNo">5325</span>    boolean hasNext = false;<a name="line.5325"></a>
+<span class="sourceLineNo">5326</span>    // 1. scan out "row4" (5 kvs), "row5" can't be scanned out since not<a name="line.5326"></a>
+<span class="sourceLineNo">5327</span>    // included in scan range<a name="line.5327"></a>
+<span class="sourceLineNo">5328</span>    // "row4" takes 2 next() calls since batch=3<a name="line.5328"></a>
+<span class="sourceLineNo">5329</span>    hasNext = scanner.next(currRow);<a name="line.5329"></a>
+<span class="sourceLineNo">5330</span>    assertEquals(3, currRow.size());<a name="line.5330"></a>
+<span class="sourceLineNo">5331</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5331"></a>
+<span class="sourceLineNo">5332</span>        .get(0).getRowLength(), row4, 0, row4.length));<a name="line.5332"></a>
+<span class="sourceLineNo">5333</span>    assertTrue(hasNext);<a name="line.5333"></a>
+<span class="sourceLineNo">5334</span>    currRow.clear();<a name="line.5334"></a>
+<span class="sourceLineNo">5335</span>    hasNext = scanner.next(currRow);<a name="line.5335"></a>
+<span class="sourceLineNo">5336</span>    assertEquals(2, currRow.size());<a name="line.5336"></a>
+<span class="sourceLineNo">5337</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(),<a name="line.5337"></a>
+<span class="sourceLineNo">5338</span>        currRow.get(0).getRowLength(), row4, 0,<a name="line.5338"></a>
+<span class="sourceLineNo">5339</span>      row4.length));<a name="line.5339"></a>
+<span class="sourceLineNo">5340</span>    assertTrue(hasNext);<a name="line.5340"></a>
+<span class="sourceLineNo">5341</span>    // 2. scan out "row3" (2 kv)<a name="line.5341"></a>
+<span class="sourceLineNo">5342</span>    currRow.clear();<a name="line.5342"></a>
+<span class="sourceLineNo">5343</span>    hasNext = scanner.next(currRow);<a name="line.5343"></a>
+<span class="sourceLineNo">5344</span>    assertEquals(2, currRow.size());<a name="line.5344"></a>
+<span class="sourceLineNo">5345</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5345"></a>
+<span class="sourceLineNo">5346</span>        .get(0).getRowLength(), row3, 0, row3.length));<a name="line.5346"></a>
+<span class="sourceLineNo">5347</span>    assertTrue(hasNext);<a name="line.5347"></a>
+<span class="sourceLineNo">5348</span>    // 3. scan out "row2" (4 kvs)<a name="line.5348"></a>
+<span class="sourceLineNo">5349</span>    // "row2" takes 2 next() calls since batch=3<a name="line.5349"></a>
+<span class="sourceLineNo">5350</span>    currRow.clear();<a name="line.5350"></a>
+<span class="sourceLineNo">5351</span>    hasNext = scanner.next(currRow);<a name="line.5351"></a>
+<span class="sourceLineNo">5352</span>    assertEquals(3, currRow.size());<a name="line.5352"></a>
+<span class="sourceLineNo">5353</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5353"></a>
+<span class="sourceLineNo">5354</span>        .get(0).getRowLength(), row2, 0, row2.length));<a name="line.5354"></a>
+<span class="sourceLineNo">5355</span>    assertTrue(hasNext);<a name="line.5355"></a>
+<span class="sourceLineNo">5356</span>    currRow.clear();<a name="line.5356"></a>
+<span class="sourceLineNo">5357</span>    hasNext = scanner.next(currRow);<a name="line.5357"></a>
+<span class="sourceLineNo">5358</span>    assertEquals(1, currRow.size());<a name="line.5358"></a>
+<span class="sourceLineNo">5359</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5359"></a>
+<span class="sourceLineNo">5360</span>        .get(0).getRowLength(), row2, 0, row2.length));<a name="line.5360"></a>
+<span class="sourceLineNo">5361</span>    assertTrue(hasNext);<a name="line.5361"></a>
+<span class="sourceLineNo">5362</span>    // 4. scan out "row1" (2 kv)<a name="line.5362"></a>
+<span class="sourceLineNo">5363</span>    currRow.clear();<a name="line.5363"></a>
+<span class="sourceLineNo">5364</span>    hasNext = scanner.next(currRow);<a name="line.5364"></a>
+<span class="sourceLineNo">5365</span>    assertEquals(2, currRow.size());<a name="line.5365"></a>
+<span class="sourceLineNo">5366</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5366"></a>
+<span class="sourceLineNo">5367</span>        .get(0).getRowLength(), row1, 0, row1.length));<a name="line.5367"></a>
+<span class="sourceLineNo">5368</span>    assertTrue(hasNext);<a name="line.5368"></a>
+<span class="sourceLineNo">5369</span>    // 5. scan out "row0" (1 kv)<a name="line.5369"></a>
+<span class="sourceLineNo">5370</span>    currRow.clear();<a name="line.5370"></a>
+<span class="sourceLineNo">5371</span>    hasNext = scanner.next(currRow);<a name="line.5371"></a>
+<span class="sourceLineNo">5372</span>    assertEquals(1, currRow.size());<a name="line.5372"></a>
+<span class="sourceLineNo">5373</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5373"></a>
+<span class="sourceLineNo">5374</span>        .get(0).getRowLength(), row0, 0, row0.length));<a name="line.5374"></a>
+<span class="sourceLineNo">5375</span>    assertFalse(hasNext);<a name="line.5375"></a>
+<span class="sourceLineNo">5376</span><a name="line.5376"></a>
+<span class="sourceLineNo">5377</span>    scanner.close();<a name="line.5377"></a>
+<span class="sourceLineNo">5378</span>  }<a name="line.5378"></a>
+<span class="sourceLineNo">5379</span><a name="line.5379"></a>
+<span class="sourceLineNo">5380</span>  @Test<a name="line.5380"></a>
+<span class="sourceLineNo">5381</span>  public void testReverseScanner_FromMemStoreAndHFiles_MultiCFs2()<a name="line.5381"></a>
+<span class="sourceLineNo">5382</span>      throws IOException {<a name="line.5382"></a>
+<span class="sourceLineNo">5383</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.5383"></a>
+<span class="sourceLineNo">5384</span>    byte[] row2 = Bytes.toBytes("row2");<a name="line.5384"></a>
+<span class="sourceLineNo">5385</span>    byte[] row3 = Bytes.toBytes("row3");<a name="line.5385"></a>
+<span class="sourceLineNo">5386</span>    byte[] row4 = Bytes.toBytes("row4");<a name="line.5386"></a>
+<span class="sourceLineNo">5387</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5387"></a>
+<span class="sourceLineNo">5388</span>    byte[] cf2 = Bytes.toBytes("CF2");<a name="line.5388"></a>
+<span class="sourceLineNo">5389</span>    byte[] cf3 = Bytes.toBytes("CF3");<a name="line.5389"></a>
+<span class="sourceLineNo">5390</span>    byte[] cf4 = Bytes.toBytes("CF4");<a name="line.5390"></a>
+<span class="sourceLineNo">5391</span>    byte[][] families = { cf1, cf2, cf3, cf4 };<a name="line.5391"></a>
+<span class="sourceLineNo">5392</span>    byte[] col = Bytes.toBytes("C");<a name="line.5392"></a>
+<span class="sourceLineNo">5393</span>    long ts = 1;<a name="line.5393"></a>
+<span class="sourceLineNo">5394</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5394"></a>
+<span class="sourceLineNo">5395</span>    // disable compactions in this test.<a name="line.5395"></a>
+<span class="sourceLineNo">5396</span>    conf.setInt("hbase.hstore.compactionThreshold", 10000);<a name="line.5396"></a>
+<span class="sourceLineNo">5397</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5397"></a>
+<span class="sourceLineNo">5398</span>    KeyValue kv1 = new KeyValue(row1, cf1, col, ts, KeyValue.Type.Put, null);<a name="line.5398"></a>
+<span class="sourceLineNo">5399</span>    KeyValue kv2 = new KeyValue(row2, cf2, col, ts, KeyValue.Type.Put, null);<a name="line.5399"></a>
+<span class="sourceLineNo">5400</span>    KeyValue kv3 = new KeyValue(row3, cf3, col, ts, KeyValue.Type.Put, null);<a name="line.5400"></a>
+<span class="sourceLineNo">5401</span>    KeyValue kv4 = new KeyValue(row4, cf4, col, ts, KeyValue.Type.Put, null);<a name="line.5401"></a>
+<span class="sourceLineNo">5402</span>    // storefile1<a name="line.5402"></a>
+<span class="sourceLineNo">5403</span>    Put put = new Put(row1);<a name="line.5403"></a>
+<span class="sourceLineNo">5404</span>    put.add(kv1);<a name="line.5404"></a>
 <span class="sourceLineNo">5405</span>    region.put(put);<a name="line.5405"></a>
 <span class="sourceLineNo">5406</span>    region.flush(true);<a name="line.5406"></a>
-<span class="sourceLineNo">5407</span>    // memstore<a name="line.5407"></a>
-<span class="sourceLineNo">5408</span>    put = new Put(row4);<a name="line.5408"></a>
-<span class="sourceLineNo">5409</span>    put.add(kv4);<a name="line.5409"></a>
+<span class="sourceLineNo">5407</span>    // storefile2<a name="line.5407"></a>
+<span class="sourceLineNo">5408</span>    put = new Put(row2);<a name="line.5408"></a>
+<span class="sourceLineNo">5409</span>    put.add(kv2);<a name="line.5409"></a>
 <span class="sourceLineNo">5410</span>    region.put(put);<a name="line.5410"></a>
-<span class="sourceLineNo">5411</span>    // scan range = ["row4", min)<a name="line.5411"></a>
-<span class="sourceLineNo">5412</span>    Scan scan = new Scan(row4);<a name="line.5412"></a>
-<span class="sourceLineNo">5413</span>    scan.setReversed(true);<a name="line.5413"></a>
-<span class="sourceLineNo">5414</span>    scan.setBatch(10);<a name="line.5414"></a>
-<span class="sourceLineNo">5415</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5415"></a>
-<span class="sourceLineNo">5416</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5416"></a>
-<span class="sourceLineNo">5417</span>    boolean hasNext = scanner.next(currRow);<a name="line.5417"></a>
-<span class="sourceLineNo">5418</span>    assertEquals(1, currRow.size());<a name="line.5418"></a>
-<span class="sourceLineNo">5419</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5419"></a>
-<span class="sourceLineNo">5420</span>        .get(0).getRowLength(), row4, 0, row4.length));<a name="line.5420"></a>
-<span class="sourceLineNo">5421</span>    assertTrue(hasNext);<a name="line.5421"></a>
-<span class="sourceLineNo">5422</span>    currRow.clear();<a name="line.5422"></a>
-<span class="sourceLineNo">5423</span>    hasNext = scanner.next(currRow);<a name="line.5423"></a>
-<span class="sourceLineNo">5424</span>    assertEquals(1, currRow.size());<a name="line.5424"></a>
-<span class="sourceLineNo">5425</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5425"></a>
-<span class="sourceLineNo">5426</span>        .get(0).getRowLength(), row3, 0, row3.length));<a name="line.5426"></a>
-<span class="sourceLineNo">5427</span>    assertTrue(hasNext);<a name="line.5427"></a>
-<span class="sourceLineNo">5428</span>    currRow.clear();<a name="line.5428"></a>
-<span class="sourceLineNo">5429</span>    hasNext = scanner.next(currRow);<a name="line.5429"></a>
-<span class="sourceLineNo">5430</span>    assertEquals(1, currRow.size());<a name="line.5430"></a>
-<span class="sourceLineNo">5431</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5431"></a>
-<span class="sourceLineNo">5432</span>        .get(0).getRowLength(), row2, 0, row2.length));<a name="line.5432"></a>
-<span class="sourceLineNo">5433</span>    assertTrue(hasNext);<a name="line.5433"></a>
-<span class="sourceLineNo">5434</span>    currRow.clear();<a name="line.5434"></a>
-<span class="sourceLineNo">5435</span>    hasNext = scanner.next(currRow);<a name="line.5435"></a>
-<span class="sourceLineNo">5436</span>    assertEquals(1, currRow.size());<a name="line.5436"></a>
-<span class="sourceLineNo">5437</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5437"></a>
-<span class="sourceLineNo">5438</span>        .get(0).getRowLength(), row1, 0, row1.length));<a name="line.5438"></a>
-<span class="sourceLineNo">5439</span>    assertFalse(hasNext);<a name="line.5439"></a>
-<span class="sourceLineNo">5440</span>  }<a name="line.5440"></a>
-<span class="sourceLineNo">5441</span><a name="line.5441"></a>
-<span class="sourceLineNo">5442</span>  /**<a name="line.5442"></a>
-<span class="sourceLineNo">5443</span>   * Test for HBASE-14497: Reverse Scan threw StackOverflow caused by readPt checking<a name="line.5443"></a>
-<span class="sourceLineNo">5444</span>   */<a name="line.5444"></a>
-<span class="sourceLineNo">5445</span>  @Test<a name="line.5445"></a>
-<span class="sourceLineNo">5446</span>  public void testReverseScanner_StackOverflow() throws IOException {<a name="line.5446"></a>
-<span class="sourceLineNo">5447</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5447"></a>
-<span class="sourceLineNo">5448</span>    byte[][] families = {cf1};<a name="line.5448"></a>
-<span class="sourceLineNo">5449</span>    byte[] col = Bytes.toBytes("C");<a name="line.5449"></a>
-<span class="sourceLineNo">5450</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5450"></a>
-<span class="sourceLineNo">5451</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5451"></a>
-<span class="sourceLineNo">5452</span>    // setup with one storefile and one memstore, to create scanner and get an earlier readPt<a name="line.5452"></a>
-<span class="sourceLineNo">5453</span>    Put put = new Put(Bytes.toBytes("19998"));<a name="line.5453"></a>
-<span class="sourceLineNo">5454</span>    put.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5454"></a>
-<span class="sourceLineNo">5455</span>    region.put(put);<a name="line.5455"></a>
-<span class="sourceLineNo">5456</span>    region.flushcache(true, true, FlushLifeCycleTracker.DUMMY);<a name="line.5456"></a>
-<span class="sourceLineNo">5457</span>    Put put2 = new Put(Bytes.toBytes("19997"));<a name="line.5457"></a>
-<span class="sourceLineNo">5458</span>    put2.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5458"></a>
-<span class="sourceLineNo">5459</span>    region.put(put2);<a name="line.5459"></a>
-<span class="sourceLineNo">5460</span><a name="line.5460"></a>
-<span class="sourceLineNo">5461</span>    Scan scan = new Scan(Bytes.toBytes("19998"));<a name="line.5461"></a>
-<span class="sourceLineNo">5462</span>    scan.setReversed(true);<a name="line.5462"></a>
-<span class="sourceLineNo">5463</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5463"></a>
-<span class="sourceLineNo">5464</span><a name="line.5464"></a>
-<span class="sourceLineNo">5465</span>    // create one storefile contains many rows will be skipped<a name="line.5465"></a>
-<span class="sourceLineNo">5466</span>    // to check StoreFileScanner.seekToPreviousRow<a name="line.5466"></a>
-<span class="sourceLineNo">5467</span>    for (int i = 10000; i &lt; 20000; i++) {<a name="line.5467"></a>
-<span class="sourceLineNo">5468</span>      Put p = new Put(Bytes.toBytes(""+i));<a name="line.5468"></a>
-<span class="sourceLineNo">5469</span>      p.addColumn(cf1, col, Bytes.toBytes("" + i));<a name="line.5469"></a>
-<span class="sourceLineNo">5470</span>      region.put(p);<a name="line.5470"></a>
-<span class="sourceLineNo">5471</span>    }<a name="line.5471"></a>
-<span class="sourceLineNo">5472</span>    region.flushcache(true, true, FlushLifeCycleTracker.DUMMY);<a name="line.5472"></a>
-<span class="sourceLineNo">5473</span><a name="line.5473"></a>
-<span class="sourceLineNo">5474</span>    // create one memstore contains many rows will be skipped<a name="line.5474"></a>
-<span class="sourceLineNo">5475</span>    // to check MemStoreScanner.seekToPreviousRow<a name="line.5475"></a>
-<span class="sourceLineNo">5476</span>    for (int i = 10000; i &lt; 20000; i++) {<a name="line.5476"></a>
-<span class="sourceLineNo">5477</span>      Put p = new Put(Bytes.toBytes(""+i));<a name="line.5477"></a>
-<span class="sourceLineNo">5478</span>      p.addColumn(cf1, col, Bytes.toBytes("" + i));<a name="line.5478"></a>
-<span class="sourceLineNo">5479</span>      region.put(p);<a name="line.5479"></a>
-<span class="sourceLineNo">5480</span>    }<a name="line.5480"></a>
-<span class="sourceLineNo">5481</span><a name="line.5481"></a>
-<span class="sourceLineNo">5482</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5482"></a>
-<span class="sourceLineNo">5483</span>    boolean hasNext;<a name="line.5483"></a>
-<span class="sourceLineNo">5484</span>    do {<a name="line.5484"></a>
-<span class="sourceLineNo">5485</span>      hasNext = scanner.next(currRow);<a name="line.5485"></a>
-<span class="sourceLineNo">5486</span>    } while (hasNext);<a name="line.5486"></a>
-<span class="sourceLineNo">5487</span>    assertEquals(2, currRow.size());<a name="line.5487"></a>
-<span class="sourceLineNo">5488</span>    assertEquals("19998", Bytes.toString(currRow.get(0).getRowArray(),<a name="line.5488"></a>
-<span class="sourceLineNo">5489</span>      currRow.get(0).getRowOffset(), currRow.get(0).getRowLength()));<a name="line.5489"></a>
-<span class="sourceLineNo">5490</span>    assertEquals("19997", Bytes.toString(currRow.get(1).getRowArray(),<a name="line.5490"></a>
-<span class="sourceLineNo">5491</span>      currRow.get(1).getRowOffset(), currRow.get(1).getRowLength()));<a name="line.5491"></a>
-<span class="sourceLineNo">5492</span>  }<a name="line.5492"></a>
-<span class="sourceLineNo">5493</span><a name="line.5493"></a>
-<span class="sourceLineNo">5494</span>  @Test<a name="line.5494"></a>
-<span class="sourceLineNo">5495</span>  public void testReverseScanShouldNotScanMemstoreIfReadPtLesser() throws Exception {<a name="line.5495"></a>
-<span class="sourceLineNo">5496</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5496"></a>
-<span class="sourceLineNo">5497</span>    byte[][] families = { cf1 };<a name="line.5497"></a>
-<span class="sourceLineNo">5498</span>    byte[] col = Bytes.toBytes("C");<a name="line.5498"></a>
-<span class="sourceLineNo">5499</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5499"></a>
-<span class="sourceLineNo">5500</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5500"></a>
-<span class="sourceLineNo">5501</span>    // setup with one storefile and one memstore, to create scanner and get an earlier readPt<a name="line.5501"></a>
-<span class="sourceLineNo">5502</span>    Put put = new Put(Bytes.toBytes("19996"));<a name="line.5502"></a>
-<span class="sourceLineNo">5503</span>    put.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5503"></a>
-<span class="sourceLineNo">5504</span>    region.put(put);<a name="line.5504"></a>
-<span class="sourceLineNo">5505</span>    Put put2 = new Put(Bytes.toBytes("19995"));<a name="line.5505"></a>
-<span class="sourceLineNo">5506</span>    put2.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5506"></a>
-<span class="sourceLineNo">5507</span>    region.put(put2);<a name="line.5507"></a>
-<span class="sourceLineNo">5508</span>    // create a reverse scan<a name="line.5508"></a>
-<span class="sourceLineNo">5509</span>    Scan scan = new Scan(Bytes.toBytes("19996"));<a name="line.5509"></a>
-<span class="sourceLineNo">5510</span>    scan.setReversed(true);<a name="line.5510"></a>
-<span class="sourceLineNo">5511</span>    RegionScannerImpl scanner = region.getScanner(scan);<a name="line.5511"></a>
-<span class="sourceLineNo">5512</span><a name="line.5512"></a>
-<span class="sourceLineNo">5513</span>    // flush the cache. This will reset the store scanner<a name="line.5513"></a>
-<span class="sourceLineNo">5514</span>    region.flushcache(true, true, FlushLifeCycleTracker.DUMMY);<a name="line.5514"></a>
-<span class="sourceLineNo">5515</span><a name="line.5515"></a>
-<span class="sourceLineNo">5516</span>    // create one memstore contains many rows will be skipped<a name="line.5516"></a>
-<span class="sourceLineNo">5517</span>    // to check MemStoreScanner.seekToPreviousRow<a name="line.5517"></a>
-<span class="sourceLineNo">5518</span>    for (int i = 10000; i &lt; 20000; i++) {<a name="line.5518"></a>
-<span class="sourceLineNo">5519</span>      Put p = new Put(Bytes.toBytes("" + i));<a name="line.5519"></a>
-<span class="sourceLineNo">5520</span>      p.addColumn(cf1, col, Bytes.toBytes("" + i));<a name="line.5520"></a>
-<span class="sourceLineNo">5521</span>      region.put(p);<a name="line.5521"></a>
-<span class="sourceLineNo">5522</span>    }<a name="line.5522"></a>
-<span class="sourceLineNo">5523</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5523"></a>
-<span class="sourceLineNo">5524</span>    boolean hasNext;<a name="line.5524"></a>
-<span class="sourceLineNo">5525</span>    boolean assertDone = false;<a name="line.5525"></a>
-<span class="sourceLineNo">5526</span>    do {<a name="line.5526"></a>
-<span class="sourceLineNo">5527</span>      hasNext = scanner.next(currRow);<a name="line.5527"></a>
-<span class="sourceLineNo">5528</span>      // With HBASE-15871, after the scanner is reset the memstore scanner should not be<a name="line.5528"></a>
-<span class="sourceLineNo">5529</span>      // added here<a name="line.5529"></a>
-<span class="sourceLineNo">5530</span>      if (!assertDone) {<a name="line.5530"></a>
-<span class="sourceLineNo">5531</span>        StoreScanner current =<a name="line.5531"></a>
-<span class="sourceLineNo">5532</span>            (StoreScanner) (scanner.storeHeap).getCurrentForTesting();<a name="line.5532"></a>
-<span class="sourceLineNo">5533</span>        List&lt;KeyValueScanner&gt; scanners = current.getAllScannersForTesting();<a name="line.5533"></a>
-<span class="sourceLineNo">5534</span>        assertEquals("There should be only one scanner the store file scanner", 1,<a name="line.5534"></a>
-<span class="sourceLineNo">5535</span>          scanners.size());<a name="line.5535"></a>
-<span class="sourceLineNo">5536</span>        assertDone = true;<a name="line.5536"></a>
-<span class="sourceLineNo">5537</span>      }<a name="line.5537"></a>
-<span class="sourceLineNo">5538</span>    } while (hasNext);<a name="line.5538"></a>
-<span class="sourceLineNo">5539</span>    assertEquals(2, currRow.size());<a name="line.5539"></a>
-<span class="sourceLineNo">5540</span>    assertEquals("19996", Bytes.toString(currRow.get(0).getRowArray(),<a name="line.5540"></a>
-<span class="sourceLineNo">5541</span>      currRow.get(0).getRowOffset(), currRow.get(0).getRowLength()));<a name="line.5541"></a>
-<span class="sourceLineNo">5542</span>    assertEquals("19995", Bytes.toString(currRow.get(1).getRowArray(),<a name="line.5542"></a>
-<span class="sourceLineNo">5543</span>      currRow.get(1).getRowOffset(), currRow.get(1).getRowLength()));<a name="line.5543"></a>
-<span class="sourceLineNo">5544</span>  }<a name="line.5544"></a>
-<span class="sourceLineNo">5545</span><a name="line.5545"></a>
-<span class="sourceLineNo">5546</span>  @Test<a name="line.5546"></a>
-<span class="sourceLineNo">5547</span>  public void testReverseScanWhenPutCellsAfterOpenReverseScan() throws Exception {<a name="line.5547"></a>
-<span class="sourceLineNo">5548</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5548"></a>
-<span class="sourceLineNo">5549</span>    byte[][] families = { cf1 };<a name="line.5549"></a>
-<span class="sourceLineNo">5550</span>    byte[] col = Bytes.toBytes("C");<a name="line.5550"></a>
-<span class="sourceLineNo">5551</span><a name="line.5551"></a>
-<span class="sourceLineNo">5552</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5552"></a>
-<span class="sourceLineNo">5553</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5553"></a>
-<span class="sourceLineNo">5554</span><a name="line.5554"></a>
-<span class="sourceLineNo">5555</span>    Put put = new Put(Bytes.toBytes("199996"));<a name="line.5555"></a>
-<span class="sourceLineNo">5556</span>    put.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5556"></a>
-<span class="sourceLineNo">5557</span>    region.put(put);<a name="line.5557"></a>
-<span class="sourceLineNo">5558</span>    Put put2 = new Put(Bytes.toBytes("199995"));<a name="line.5558"></a>
-<span class="sourceLineNo">5559</span>    put2.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5559"></a>
-<span class="sourceLineNo">5560</span>    region.put(put2);<a name="line.5560"></a>
+<span class="sourceLineNo">5411</span>    region.flush(true);<a name="line.5411"></a>
+<span class="sourceLineNo">5412</span>    // storefile3<a name="line.5412"></a>
+<span class="sourceLineNo">5413</span>    put = new Put(row3);<a name="line.5413"></a>
+<span class="sourceLineNo">5414</span>    put.add(kv3);<a name="line.5414"></a>
+<span class="sourceLineNo">5415</span>    region.put(put);<a name="line.5415"></a>
+<span class="sourceLineNo">5416</span>    region.flush(true);<a name="line.5416"></a>
+<span class="sourceLineNo">5417</span>    // memstore<a name="line.5417"></a>
+<span class="sourceLineNo">5418</span>    put = new Put(row4);<a name="line.5418"></a>
+<span class="sourceLineNo">5419</span>    put.add(kv4);<a name="line.5419"></a>
+<span class="sourceLineNo">5420</span>    region.put(put);<a name="line.5420"></a>
+<span class="sourceLineNo">5421</span>    // scan range = ["row4", min)<a name="line.5421"></a>
+<span class="sourceLineNo">5422</span>    Scan scan = new Scan(row4);<a name="line.5422"></a>
+<span class="sourceLineNo">5423</span>    scan.setReversed(true);<a name="line.5423"></a>
+<span class="sourceLineNo">5424</span>    scan.setBatch(10);<a name="line.5424"></a>
+<span class="sourceLineNo">5425</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5425"></a>
+<span class="sourceLineNo">5426</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5426"></a>
+<span class="sourceLineNo">5427</span>    boolean hasNext = scanner.next(currRow);<a name="line.5427"></a>
+<span class="sourceLineNo">5428</span>    assertEquals(1, currRow.size());<a name="line.5428"></a>
+<span class="sourceLineNo">5429</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5429"></a>
+<span class="sourceLineNo">5430</span>        .get(0).getRowLength(), row4, 0, row4.length));<a name="line.5430"></a>
+<span class="sourceLineNo">5431</span>    assertTrue(hasNext);<a name="line.5431"></a>
+<span class="sourceLineNo">5432</span>    currRow.clear();<a name="line.5432"></a>
+<span class="sourceLineNo">5433</span>    hasNext = scanner.next(currRow);<a name="line.5433"></a>
+<span class="sourceLineNo">5434</span>    assertEquals(1, currRow.size());<a name="line.5434"></a>
+<span class="sourceLineNo">5435</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5435"></a>
+<span class="sourceLineNo">5436</span>        .get(0).getRowLength(), row3, 0, row3.length));<a name="line.5436"></a>
+<span class="sourceLineNo">5437</span>    assertTrue(hasNext);<a name="line.5437"></a>
+<span class="sourceLineNo">5438</span>    currRow.clear();<a name="line.5438"></a>
+<span class="sourceLineNo">5439</span>    hasNext = scanner.next(currRow);<a name="line.5439"></a>
+<span class="sourceLineNo">5440</span>    assertEquals(1, currRow.size());<a name="line.5440"></a>
+<span class="sourceLineNo">5441</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5441"></a>
+<span class="sourceLineNo">5442</span>        .get(0).getRowLength(), row2, 0, row2.length));<a name="line.5442"></a>
+<span class="sourceLineNo">5443</span>    assertTrue(hasNext);<a name="line.5443"></a>
+<span class="sourceLineNo">5444</span>    currRow.clear();<a name="line.5444"></a>
+<span class="sourceLineNo">5445</span>    hasNext = scanner.next(currRow);<a name="line.5445"></a>
+<span class="sourceLineNo">5446</span>    assertEquals(1, currRow.size());<a name="line.5446"></a>
+<span class="sourceLineNo">5447</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5447"></a>
+<span class="sourceLineNo">5448</span>        .get(0).getRowLength(), row1, 0, row1.length));<a name="line.5448"></a>
+<span class="sourceLineNo">5449</span>    assertFalse(hasNext);<a name="line.5449"></a>
+<span class="sourceLineNo">5450</span>  }<a name="line.5450"></a>
+<span class="sourceLineNo">5451</span><a name="line.5451"></a>
+<span class="sourceLineNo">5452</span>  /**<a name="line.5452"></a>
+<span class="sourceLineNo">5453</span>   * Test for HBASE-14497: Reverse Scan threw StackOverflow caused by readPt checking<a name="line.5453"></a>
+<span class="sourceLineNo">5454</span>   */<a name="line.5454"></a>
+<span class="sourceLineNo">5455</span>  @Test<a name="line.5455"></a>
+<span class="sourceLineNo">5456</span>  public void testReverseScanner_StackOverflow() throws IOException {<a name="line.5456"></a>
+<span class="sourceLineNo">5457</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5457"></a>
+<span class="sourceLineNo">5458</span>    byte[][] families = {cf1};<a name="line.5458"></a>
+<span class="sourceLineNo">5459</span>    byte[] col = Bytes.toBytes("C");<a name="line.5459"></a>
+<span class="sourceLineNo">5460</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5460"></a>
+<span class="sourceLineNo">5461</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5461"></a>
+<span class="sourceLineNo">5462</span>    // setup with one storefile and one memstore, to create scanner and get an earlier readPt<a name="line.5462"></a>
+<span class="sourceLineNo">5463</span>    Put put = new Put(Bytes.toBytes("19998"));<a name="line.5463"></a>
+<span class="sourceLineNo">5464</span>    put.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5464"></a>
+<span class="sourceLineNo">5465</span>    region.put(put);<a name="line.5465"></a>
+<span class="sourceLineNo">5466</span>    region.flushcache(true, true, FlushLifeCycleTracker.DUMMY);<a name="line.5466"></a>
+<span class="sourceLineNo">5467</span>    Put put2 = new Put(Bytes.toBytes("19997"));<a name="line.5467"></a>
+<span class="sourceLineNo">5468</span>    put2.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5468"></a>
+<span class="sourceLineNo">5469</span>    region.put(put2);<a name="line.5469"></a>
+<span class="sourceLineNo">5470</span><a name="line.5470"></a>
+<span class="sourceLineNo">5471</span>    Scan scan = new Scan(Bytes.toBytes("19998"));<a name="line.5471"></a>
+<span class="sourceLineNo">5472</span>    scan.setReversed(true);<a name="line.5472"></a>
+<span class="sourceLineNo">5473</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5473"></a>
+<span class="sourceLineNo">5474</span><a name="line.5474"></a>
+<span class="sourceLineNo">5475</span>    // create one storefile contains many rows will be skipped<a name="line.5475"></a>
+<span class="sourceLineNo">5476</span>    // to check StoreFileScanner.seekToPreviousRow<a name="line.5476"></a>
+<span class="sourceLineNo">5477</span>    for (int i = 10000; i &lt; 20000; i++) {<a name="line.5477"></a>
+<span class="sourceLineNo">5478</span>      Put p = new Put(Bytes.toBytes(""+i));<a name="line.5478"></a>
+<span class="sourceLineNo">5479</span>      p.addColumn(cf1, col, Bytes.toBytes("" + i));<a name="line.5479"></a>
+<span class="sourceLineNo">5480</span>      region.put(p);<a name="line.5480"></a>
+<span class="sourceLineNo">5481</span>    }<a name="line.5481"></a>
+<span class="sourceLineNo">5482</span>    region.flushcache(true, true, FlushLifeCycleTracker.DUMMY);<a name="line.5482"></a>
+<span class="sourceLineNo">5483</span><a name="line.5483"></a>
+<span class="sourceLineNo">5484</span>    // create one memstore contains many rows will be skipped<a name="line.5484"></a>
+<span class="sourceLineNo">5485</span>    // to check MemStoreScanner.seekToPreviousRow<a name="line.5485"></a>
+<span class="sourceLineNo">5486</span>    for (int i = 10000; i &lt; 20000; i++) {<a name="line.5486"></a>
+<span class="sourceLineNo">5487</span>      Put p = new Put(Bytes.toBytes(""+i));<a name="line.5487"></a>
+<span class="sourceLineNo">5488</span>      p.addColumn(cf1, col, Bytes.toBytes("" + i));<a name="line.5488"></a>
+<span class="sourceLineNo">5489</span>      region.put(p);<a name="line.5489"></a>
+<span class="sourceLineNo">5490</span>    }<a name="line.5490"></a>
+<span class="sourceLineNo">5491</span><a name="line.5491"></a>
+<span class="sourceLineNo">5492</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5492"></a>
+<span class="sourceLineNo">5493</span>    boolean hasNext;<a name="line.5493"></a>
+<span class="sourceLineNo">5494</span>    do {<a name="line.5494"></a>
+<span class="sourceLineNo">5495</span>      hasNext = scanner.next(currRow);<a name="line.5495"></a>
+<span class="sourceLineNo">5496</span>    } while (hasNext);<a name="line.5496"></a>
+<span class="sourceLineNo">5497</span>    assertEquals(2, currRow.size());<a name="line.5497"></a>
+<span class="sourceLineNo">5498</span>    assertEquals("19998", Bytes.toString(currRow.get(0).getRowArray(),<a name="line.5498"></a>
+<span class="sourceLineNo">5499</span>      currRow.get(0).getRowOffset(), currRow.get(0).getRowLength()));<a name="line.5499"></a>
+<span class="sourceLineNo">5500</span>    assertEquals("19997", Bytes.toString(currRow.get(1).getRowArray(),<a name="line.5500"></a>
+<span class="sourceLineNo">5501</span>      currRow.get(1).getRowOffset(), currRow.get(1).getRowLength()));<a name="line.5501"></a>
+<span class="sourceLineNo">5502</span>  }<a name="line.5502"></a>
+<span class="sourceLineNo">5503</span><a name="line.5503"></a>
+<span class="sourceLineNo">5504</span>  @Test<a name="line.5504"></a>
+<span class="sourceLineNo">5505</span>  public void testReverseScanShouldNotScanMemstoreIfReadPtLesser() throws Exception {<a name="line.5505"></a>
+<span class="sourceLineNo">5506</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5506"></a>
+<span class="sourceLineNo">5507</span>    byte[][] families = { cf1 };<a name="line.5507"></a>
+<span class="sourceLineNo">5508</span>    byte[] col = Bytes.toBytes("C");<a name="line.5508"></a>
+<span class="sourceLineNo">5509</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5509"></a>
+<span class="sourceLineNo">5510</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5510"></a>
+<span class="sourceLineNo">5511</span>    // setup with one storefile and one memstore, to create scanner and get an earlier readPt<a name="line.5511"></a>
+<span class="sourceLineNo">5512</span>    Put put = new Put(Bytes.toBytes("19996"));<a name="line.5512"></a>
+<span class="sourceLineNo">5513</span>    put.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5513"></a>
+<span class="sourceLineNo">5514</span>    region.put(put);<a name="line.5514"></a>
+<span class="sourceLineNo">5515</span>    Put put2 = new Put(Bytes.toBytes("19995"));<a name="line.5515"></a>
+<span class="sourceLineNo">5516</span>    put2.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5516"></a>
+<span class="sourceLineNo">5517</span>    region.put(put2);<a name="line.5517"></a>
+<span class="sourceLineNo">5518</span>    // create a reverse scan<a name="line.5518"></a>
+<span class="sourceLineNo">5519</span>    Scan scan = new Scan(Bytes.toBytes("19996"));<a name="line.5519"></a>
+<span class="sourceLineNo">5520</span>    scan.setReversed(true);<a name="line.5520"></a>
+<span class="sourceLineNo">5521</span>    RegionScannerImpl scanner = region.getScanner(scan);<a name="line.5521"></a>
+<span class="sourceLineNo">5522</span><a name="line.5522"></a>
+<span class="sourceLineNo">5523</span>    // flush the cache. This will reset the store scanner<a name="line.5523"></a>
+<span class="sourceLineNo">5524</span>    region.flushcache(true, true, FlushLifeCycleTracker.DUMMY);<a name="line.5524"></a>
+<span class="sourceLineNo">5525</span><a name="line.5525"></a>
+<span class="sourceLineNo">5526</span>    // create one memstore contains many rows will be skipped<a name="line.5526"></a>
+<span class="sourceLineNo">5527</span>    // to check MemStoreScanner.seekToPreviousRow<a name="line.5527"></a>
+<span class="sourceLineNo">5528</span>    for (int i = 10000; i &lt; 20000; i++) {<a name="line.5528"></a>
+<span class="sourceLineNo">5529</span>      Put p = new Put(Bytes.toBytes("" + i));<a name="line.5529"></a>
+<span class="sourceLineNo">5530</span>      p.addColumn(cf1, col, Bytes.toBytes("" + i));<a name="line.5530"></a>
+<span class="sourceLineNo">5531</span>      region.put(p);<a name="line.5531"></a>
+<span class="sourceLineNo">5532</span>    }<a name="line.5532"></a>
+<span class="sourceLineNo">5533</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5533"></a>
+<span class="sourceLineNo">5534</span>    boolean hasNext;<a name="line.5534"></a>
+<span class="sourceLineNo">5535</span>    boolean assertDone = false;<a name="line.5535"></a>
+<span class="sourceLineNo">5536</span>    do {<a name="line.5536"></a>
+<span class="sourceLineNo">5537</span>      hasNext = scanner.next(currRow);<a name="line.5537"></a>
+<span class="sourceLineNo">5538</span>      // With HBASE-15871, after the scanner is reset the memstore scanner should not be<a name="line.5538"></a>
+<span class="sourceLineNo">5539</span>      // added here<a name="line.5539"></a>
+<span class="sourceLineNo">5540</span>      if (!assertDone) {<a name="line.5540"></a>
+<span class="sourceLineNo">5541</span>        StoreScanner current =<a name="line.5541"></a>
+<span class="sourceLineNo">5542</span>            (StoreScanner) (scanner.storeHeap).getCurrentForTesting();<a name="line.5542"></a>
+<span class="sourceLineNo">5543</span>        List&lt;KeyValueScanner&gt; scanners = current.getAllScannersForTesting();<a name="line.5543"></a>
+<span class="sourceLineNo">5544</span>        assertEquals("There should be only one scanner the store file scanner", 1,<a name="line.5544"></a>
+<span class="sourceLineNo">5545</span>          scanners.size());<a name="line.5545"></a>
+<span class="sourceLineNo">5546</span>        assertDone = true;<a name="line.5546"></a>
+<span class="sourceLineNo">5547</span>      }<a name="line.5547"></a>
+<span class="sourceLineNo">5548</span>    } while (hasNext);<a name="line.5548"></a>
+<span class="sourceLineNo">5549</span>    assertEquals(2, currRow.size());<a name="line.5549"></a>
+<span class="sourceLineNo">5550</span>    assertEquals("19996", Bytes.toString(currRow.get(0).getRowArray(),<a name="line.5550"></a>
+<span class="sourceLineNo">5551</span>      currRow.get(0).getRowOffset(), currRow.get(0).getRowLength()));<a name="line.5551"></a>
+<span class="sourceLineNo">5552</span>    assertEquals("19995", Bytes.toString(currRow.get(1).getRowArray(),<a name="line.5552"></a>
+<span class="sourceLineNo">5553</span>      currRow.get(1).getRowOffset(), currRow.get(1).getRowLength()));<a name="line.5553"></a>
+<span class="sourceLineNo">5554</span>  }<a name="line.5554"></a>
+<span class="sourceLineNo">5555</span><a name="line.5555"></a>
+<span class="sourceLineNo">5556</span>  @Test<a name="line.5556"></a>
+<span class="sourceLineNo">5557</span>  public void testReverseScanWhenPutCellsAfterOpenReverseScan() throws Exception {<a name="line.5557"></a>
+<span class="sourceLineNo">5558</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5558"></a>
+<span class="sourceLineNo">5559</span>    byte[][] families = { cf1 };<a name="line.5559"></a>
+<span class="sourceLineNo">5560</span>    byte[] col = Bytes.toBytes("C");<a name="line.5560"></a>
 <span class="sourceLineNo">5561</span><a name="line.5561"></a>
-<span class="sourceLineNo">5562</span>    // Create a reverse scan<a name="line.5562"></a>
-<span class="sourceLineNo">5563</span>    Scan scan = new Scan(Bytes.toBytes("199996"));<a name="line.5563"></a>
-<span class="sourceLineNo">5564</span>    scan.setReversed(true);<a name="line.5564"></a>
-<span class="sourceLineNo">5565</span>    RegionScannerImpl scanner = region.getScanner(scan);<a name="line.5565"></a>
-<span class="sourceLineNo">5566</span><a name="line.5566"></a>
-<span class="sourceLineNo">5567</span>    // Put a lot of cells that have sequenceIDs grater than the readPt of the reverse scan<a name="line.5567"></a>
-<span class="sourceLineNo">5568</span>    for (int i = 100000; i &lt; 200000; i++) {<a name="line.5568"></a>
-<span class="sourceLineNo">5569</span>      Put p = new Put(Bytes.toBytes("" + i));<a name="line.5569"></a>
-<span class="sourceLineNo">5570</span>      p.addColumn(cf1, col, Bytes.toBytes("" + i));<a name="line.5570"></a>
-<span class="sourceLineNo">5571</span>      region.put(p);<a name="line.5571"></a>
-<span class="sourceLineNo">5572</span>    }<a name="line.5572"></a>
-<span class="sourceLineNo">5573</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5573"></a>
-<span class="sourceLineNo">5574</span>    boolean hasNext;<a name="line.5574"></a>
-<span class="sourceLineNo">5575</span>    do {<a name="line.5575"></a>
-<span class="sourceLineNo">5576</span>      hasNext = scanner.next(currRow);<a name="line.5576"></a>
-<span class="sourceLineNo">5577</span>    } while (hasNext);<a name="line.5577"></a>
-<span class="sourceLineNo">5578</span><a name="line.5578"></a>
-<span class="sourceLineNo">5579</span>    assertEquals(2, currRow.size());<a name="line.5579"></a>
-<span class="sourceLineNo">5580</span>    assertEquals("199996", Bytes.toString(currRow.get(0).getRowArray(),<a name="line.5580"></a>
-<span class="sourceLineNo">5581</span>      currRow.get(0).getRowOffset(), currRow.get(0).getRowLength()));<a name="line.5581"></a>
-<span class="sourceLineNo">5582</span>    assertEquals("199995", Bytes.toString(currRow.get(1).getRowArray(),<a name="line.5582"></a>
-<span class="sourceLineNo">5583</span>      currRow.get(1).getRowOffset(), currRow.get(1).getRowLength()));<a name="line.5583"></a>
-<span class="sourceLineNo">5584</span>  }<a name="line.5584"></a>
-<span class="sourceLineNo">5585</span><a name="line.5585"></a>
-<span class="sourceLineNo">5586</span>  @Test<a name="line.5586"></a>
-<span class="sourceLineNo">5587</span>  public void testWriteRequestsCounter() throws IOException {<a name="line.5587"></a>
-<span class="sourceLineNo">5588</span>    byte[] fam = Bytes.toBytes("info");<a name="line.5588"></a>
-<span class="sourceLineNo">5589</span>    byte[][] families = { fam };<a name="line.5589"></a>
-<span class="sourceLineNo">5590</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.5590"></a>
-<span class="sourceLineNo">5591</span><a name="line.5591"></a>
-<span class="sourceLineNo">5592</span>    Assert.assertEquals(0L, region.getWriteRequestsCount());<a name="line.5592"></a>
-<span class="sourceLineNo">5593</span><a name="line.5593"></a>
-<span class="sourceLineNo">5594</span>    Put put = new Put(row);<a name="line.5594"></a>
-<span class="sourceLineNo">5595</span>    put.addColumn(fam, fam, fam);<a name="line.5595"></a>
-<span class="sourceLineNo">5596</span><a name="line.5596"></a>
-<span class="sourceLineNo">5597</span>    Assert.assertEquals(0L, region.getWriteRequestsCount());<a name="line.5597"></a>
-<span class="sourceLineNo">5598</span>    region.put(put);<a name="line.5598"></a>
-<span class="sourceLineNo">5599</span>    Assert.assertEquals(1L, region.getWriteRequestsCount());<a name="line.5599"></a>
-<span class="sourceLineNo">5600</span>    region.put(put);<a name="line.5600"></a>
-<span class="sourceLineNo">5601</span>    Assert.assertEquals(2L, region.getWriteRequestsCount());<a name="line.5601"></a>
-<span class="sourceLineNo">5602</span>    region.put(put);<a name="line.5602"></a>
-<span class="sourceLineNo">5603</span>    Assert.assertEquals(3L, region.getWriteRequestsCount());<a name="line.5603"></a>
-<span class="sourceLineNo">5604</span><a name="line.5604"></a>
-<span class="sourceLineNo">5605</span>    region.delete(new Delete(row));<a name="line.5605"></a>
-<span class="sourceLineNo">5606</span>    Assert.assertEquals(4L, region.getWriteRequestsCount());<a name="line.5606"></a>
-<span class="sourceLineNo">5607</span>  }<a name="line.5607"></a>
-<span class="sourceLineNo">5608</span><a name="line.5608"></a>
-<span class="sourceLineNo">5609</span>  @Test<a name="line.5609"></a>
-<span class="sourceLineNo">5610</span>  public void testOpenRegionWrittenToWAL() throws Exception {<a name="line.5610"></a>
-<span class="sourceLineNo">5611</span>    final ServerName serverName = ServerName.valueOf(name.getMethodName(), 100, 42);<a name="line.5611"></a>
-<span class="sourceLineNo">5612</span>    final RegionServerServices rss = spy(TEST_UTIL.createMockRegionServerService(serverName));<a name="line.5612"></a>
-<span class="sourceLineNo">5613</span><a name="line.5613"></a>
-<span class="sourceLineNo">5614</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.5614"></a>
-<span class="sourceLineNo">5615</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.5615"></a>
-<span class="sourceLineNo">5616</span>    htd.addFamily(new HColumnDescriptor(fam2));<a name="line.5616"></a>
-<span class="sourceLineNo">5617</span><a name="line.5617"></a>
-<span class="sourceLineNo">5618</span>    HRegionInfo hri = new HRegionInfo(htd.getTableName(),<a name="line.5618"></a>
-<span class="sourceLineNo">5619</span>      HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY);<a name="line.5619"></a>
-<span class="sourceLineNo">5620</span><a name="line.5620"></a>
-<span class="sourceLineNo">5621</span>    // open the region w/o rss and wal and flush some files<a name="line.5621"></a>
-<span class="sourceLineNo">5622</span>    region =<a name="line.5622"></a>
-<span class="sourceLineNo">5623</span>         HBaseTestingUtility.createRegionAndWAL(hri, TEST_UTIL.getDataTestDir(), TEST_UTIL<a name="line.5623"></a>
-<span class="sourceLineNo">5624</span>             .getConfiguration(), htd);<a name="line.5624"></a>
-<span class="sourceLineNo">5625</span>    assertNotNull(region);<a name="line.5625"></a>
-<span class="sourceLineNo">5626</span><a name="line.5626"></a>
-<span class="sourceLineNo">5627</span>    // create a file in fam1 for the region before opening in OpenRegionHandler<a name="line.5627"></a>
-<span class="sourceLineNo">5628</span>    region.put(new Put(Bytes.toBytes("a")).addColumn(fam1, fam1, fam1));<a name="line.5628"></a>
-<span class="sourceLineNo">5629</span>    region.flush(true);<a name="line.5629"></a>
-<span class="sourceLineNo">5630</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.5630"></a>
-<span class="sourceLineNo">5631</span><a name="line.5631"></a>
-<span class="sourceLineNo">5632</span>    ArgumentCaptor&lt;WALEdit&gt; editCaptor = ArgumentCaptor.forClass(WALEdit.class);<a name="line.5632"></a>
-<span class="sourceLineNo">5633</span><a name="line.5633"></a>
-<span class="sourceLineNo">5634</span>    // capture append() calls<a name="line.5634"></a>
-<span class="sourceLineNo">5635</span>    WAL wal = mockWAL();<a name="line.5635"></a>
-<span class="sourceLineNo">5636</span>    when(rss.getWAL((HRegionInfo) any())).thenReturn(wal);<a name="line.5636"></a>
-<span class="sourceLineNo">5637</span><a name="line.5637"></a>
-<span class="sourceLineNo">5638</span>    region = HRegion.openHRegion(hri, htd, rss.getWAL(hri),<a name="line.5638"></a>
-<span class="sourceLineNo">5639</span>      TEST_UTIL.getConfiguration(), rss, null);<a name="line.5639"></a>
-<span class="sourceLineNo">5640</span><a name="line.5640"></a>
-<span class="sourceLineNo">5641</span>    verify(wal, times(1)).append((HRegionInfo)any(), (WALKeyImpl)any()<a name="line.5641"></a>
-<span class="sourceLineNo">5642</span>      , editCaptor.capture(), anyBoolean());<a name="line.5642"></a>
+<span class="sourceLineNo">5562</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5562"></a>
+<span class="sourceLineNo">5563</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5563"></a>
+<span class="sourceLineNo">5564</span><a name="line.5564"></a>
+<span class="sourceLineNo">5565</span>    Put put = new Put(Bytes.toBytes("199996"));<a name="line.5565"></a>
+<span class="sourceLineNo">5566</span>    put.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5566"></a>
+<span class="sourceLineNo">5567</span>    region.put(put);<a name="line.5567"></a>
+<span class="sourceLineNo">5568</span>    Put put2 = new Put(Bytes.toBytes("199995"));<a name="line.5568"></a>
+<span class="sourceLineNo">5569</span>    put2.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5569"></a>
+<span class="sourceLineNo">5570</span>    region.put(put2);<a name="line.5570"></a>
+<span class="sourceLineNo">5571</span><a name="line.5571"></a>
+<span class="sourceLineNo">5572</span>    // Create a reverse scan<a name="line.5572"></a>
+<span class="sourceLineNo">5573</span>    Scan scan = new Scan(Bytes.toBytes("199996"));<a name="line.5573"></a>
+<span class="sourceLineNo">5574</span>    scan.setReversed(true);<a name="line.5574"></a>
+<span class="sourceLineNo">5575</span>    RegionScannerImpl scanner = region.getScanner(scan);<a name="line.5575"></a>
+<span class="sourceLineNo">5576</span><a name="line.5576"></a>
+<span class="sourceLineNo">5577</span>    // Put a lot of cells that have sequenceIDs grater than the readPt of the reverse scan<a name="line.5577"></a>
+<span class="sourceLineNo">5578</span>    for (int i = 100000; i &lt; 200000; i++) {<a name="line.5578"></a>
+<span class="sourceLineNo">5579</span>      Put p = new Put(Bytes.toBytes("" + i));<a name="line.5579"></a>
+<span class="sourceLineNo">5580</span>      p.addColumn(cf1, col, Bytes.toBytes("" + i));<a name="line.5580"></a>
+<span class="sourceLineNo">5581</span>      region.put(p);<a name="line.5581"></a>
+<span class="sourceLineNo">5582</span>    }<a name="line.5582"></a>
+<span class="sourceLineNo">5583</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5583"></a>
+<span class="sourceLineNo">5584</span>    boolean hasNext;<a name="line.5584"></a>
+<span class="sourceLineNo">5585</span>    do {<a name="line.5585"></a>
+<span class="sourceLineNo">5586</span>      hasNext = scanner.next(currRow);<a name="line.5586"></a>
+<span class="sourceLineNo">5587</span>    } while (hasNext);<a name="line.5587"></a>
+<span class="sourceLineNo">5588</span><a name="line.5588"></a>
+<span class="sourceLineNo">5589</span>    assertEquals(2, currRow.size());<a name="line.5589"></a>
+<span class="sourceLineNo">5590</span>    assertEquals("199996", Bytes.toString(currRow.get(0).getRowArray(),<a name="line.5590"></a>
+<span class="sourceLineNo">5591</span>      currRow.get(0).getRowOffset(), currRow.get(0).getRowLength()));<a name="line.5591"></a>
+<span class="sourceLineNo">5592</span>    assertEquals("199995", Bytes.toString(currRow.get(1).getRowArray(),<a name="line.5592"></a>
+<span class="sourceLineNo">5593</span>      currRow.get(1).getRowOffset(), currRow.get(1).getRowLength()));<a name="line.5593"></a>
+<span class="sourceLineNo">5594</span>  }<a name="line.5594"></a>
+<span class="sourceLineNo">5595</span><a name="line.5595"></a>
+<span class="sourceLineNo">5596</span>  @Test<a name="line.5596"></a>
+<span class="sourceLineNo">5597</span>  public void testWriteRequestsCounter() throws IOException {<a name="line.5597"></a>
+<span class="sourceLineNo">5598</span>    byte[] fam = Bytes.toBytes("info");<a name="line.5598"></a>
+<span class="sourceLineNo">5599</span>    byte[][] families = { fam };<a name="line.5599"></a>
+<span class="sourceLineNo">5600</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.5600"></a>
+<span class="sourceLineNo">5601</span><a name="line.5601"></a>
+<span class="sourceLineNo">5602</span>    Assert.assertEquals(0L, region.getWriteRequestsCount());<a name="line.5602"></a>
+<span class="sourceLineNo">5603</span><a name="line.5603"></a>
+<span class="sourceLineNo">5604</span>    Put put = new Put(row);<a name="line.5604"></a>
+<span class="sourceLineNo">5605</span>    put.addColumn(fam, fam, fam);<a name="line.5605"></a>
+<span class="sourceLineNo">5606</span><a name="line.5606"></a>
+<span class="sourceLineNo">5607</span>    Assert.assertEquals(0L, region.getWriteRequestsCount());<a name="line.5607"></a>
+<span class="sourceLineNo">5608</span>    region.put(put);<a name="line.5608"></a>
+<span class="sourceLineNo">5609</span>    Assert.assertEquals(1L, region.getWriteRequestsCount());<a name="line.5609"></a>
+<span class="sourceLineNo">5610</span>    region.put(put);<a name="line.5610"></a>
+<span class="sourceLineNo">5611</span>    Assert.assertEquals(2L, region.getWriteRequestsCount());<a name="line.5611"></a>
+<span class="sourceLineNo">5612</span>    region.put(put);<a name="line.5612"></a>
+<span class="sourceLineNo">5613</span>    Assert.assertEquals(3L, region.getWriteRequestsCount());<a name="line.5613"></a>
+<span class="sourceLineNo">5614</span><a name="line.5614"></a>
+<span class="sourceLineNo">5615</span>    region.delete(new Delete(row));<a name="line.5615"></a>
+<span class="sourceLineNo">5616</span>    Assert.assertEquals(4L, region.getWriteRequestsCount());<a name="line.5616"></a>
+<span class="sourceLineNo">5617</span>  }<a name="line.5617"></a>
+<span class="sourceLineNo">5618</span><a name="line.5618"></a>
+<span class="sourceLineNo">5619</span>  @Test<a name="line.5619"></a>
+<span class="sourceLineNo">5620</span>  public void testOpenRegionWrittenToWAL() throws Exception {<a name="line.5620"></a>
+<span class="sourceLineNo">5621</span>    final ServerName serverName = ServerName.valueOf(name.getMethodName(), 100, 42);<a name="line.5621"></a>
+<span class="sourceLineNo">5622</span>    final RegionServerServices rss = spy(TEST_UTIL.createMockRegionServerService(serverName));<a name="line.5622"></a>
+<span class="sourceLineNo">5623</span><a name="line.5623"></a>
+<span class="sourceLineNo">5624</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.5624"></a>
+<span class="sourceLineNo">5625</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.5625"></a>
+<span class="sourceLineNo">5626</span>    htd.addFamily(new HColumnDescriptor(fam2));<a name="line.5626"></a>
+<span class="sourceLineNo">5627</span><a name="line.5627"></a>
+<span class="sourceLineNo">5628</span>    HRegionInfo hri = new HRegionInfo(htd.getTableName(),<a name="line.5628"></a>
+<span class="sourceLineNo">5629</span>      HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY);<a name="line.5629"></a>
+<span class="sourceLineNo">5630</span><a name="line.5630"></a>
+<span class="sourceLineNo">5631</span>    // open the region w/o rss and wal and flush some files<a name="line.5631"></a>
+<span class="sourceLineNo">5632</span>    region =<a name="line.5632"></a>
+<span class="sourceLineNo">5633</span>         HBaseTestingUtility.createRegionAndWAL(hri, TEST_UTIL.getDataTestDir(), TEST_UTIL<a name="line.5633"></a>
+<span class="sourceLineNo">5634</span>             .getConfiguration(), htd);<a name="line.5634"></a>
+<span class="sourceLineNo">5635</span>    assertNotNull(region);<a name="line.5635"></a>
+<span class="sourceLineNo">5636</span><a name="line.5636"></a>
+<span class="sourceLineNo">5637</span>    // create a file in fam1 for the region before opening in OpenRegionHandler<a name="line.5637"></a>
+<span class="sourceLineNo">5638</span>    region.put(new Put(Bytes.toBytes("a")).addColumn(fam1, fam1, fam1));<a name="line.5638"></a>
+<span class="sourceLineNo">5639</span>    region.flush(true);<a name="line.5639"></a>
+<span class="sourceLineNo">5640</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.5640"></a>
+<span class="sourceLineNo">5641</span><a name="line.5641"></a>
+<span class="sourceLineNo">5642</span>    ArgumentCaptor&lt;WALEdit&gt; editCaptor = ArgumentCaptor.forClass(WALEdit.class);<a name="line.5642"></a>
 <span class="sourceLineNo">5643</span><a name="line.5643"></a>
-<span class="sourceLineNo">5644</span>    WALEdit edit = editCaptor.getValue();<a name="line.5644"></a>
-<span class="sourceLineNo">5645</span>    assertNotNull(edit);<a name="line.5645"></a>
-<span class="sourceLineNo">5646</span>    assertNotNull(edit.getCells());<a name="line.5646"></a>
-<span class="sourceLineNo">5647</span>    assertEquals(1, edit.getCells().size());<a name="line.5647"></a>
-<span class="sourceLineNo">5648</span>    RegionEventDescriptor desc = WALEdit.getRegionEventDescriptor(edit.getCells().get(0));<a name="line.5648"></a>
-<span class="sourceLineNo">5649</span>    assertNotNull(desc);<a name="line.5649"></a>
+<span class="sourceLineNo">5644</span>    // capture append() calls<a name="line.5644"></a>
+<span class="sourceLineNo">5645</span>    WAL wal = mockWAL();<a name="line.5645"></a>
+<span class="sourceLineNo">5646</span>    when(rss.getWAL((HRegionInfo) any())).thenReturn(wal);<a name="line.5646"></a>
+<span class="sourceLineNo">5647</span><a name="line.5647"></a>
+<span class="sourceLineNo">5648</span>    region = HRegion.openHRegion(hri, htd, rss.getWAL(hri),<a name="line.5648"></a>
+<span class="sourceLineNo">5649</span>      TEST_UTIL.getConfiguration(), rss, null);<a name="line.5649"></a>
 <span class="sourceLineNo">5650</span><a name="line.5650"></a>
-<span class="sourceLineNo">5651</span>    LOG.info("RegionEventDescriptor from WAL: " + desc);<a name="line.5651"></a>
-<span class="sourceLineNo">5652</span><a name="line.5652"></a>
-<span class="sourceLineNo">5653</span>    assertEquals(RegionEventDescriptor.EventType.REGION_OPEN, desc.getEventType());<a name="line.5653"></a>
-<span class="sourceLineNo">5654</span>    assertTrue(Bytes.equals(desc.getTableName().toByteArray(), htd.getTableName().toBytes()));<a name="line.5654"></a>
-<span class="sourceLineNo">5655</span>    assertTrue(Bytes.equals(desc.getEncodedRegionName().toByteArray(),<a name="line.5655"></a>
-<span class="sourceLineNo">5656</span>      hri.getEncodedNameAsBytes()));<a name="line.5656"></a>
-<span class="sourceLineNo">5657</span>    assertTrue(desc.getLogSequenceNumber() &gt; 0);<a name="line.5657"></a>
-<span class="sourceLineNo">5658</span>    assertEquals(serverName, ProtobufUtil.toServerName(desc.getServer()));<a name="line.5658"></a>
-<span class="sourceLineNo">5659</span>    assertEquals(2, desc.getStoresCount());<a name="line.5659"></a>
+<span class="sourceLineNo">5651</span>    verify(wal, times(1)).append((HRegionInfo)any(), (WALKeyImpl)any()<a name="line.5651"></a>
+<span class="sourceLineNo">5652</span>      , editCaptor.capture(), anyBoolean());<a name="line.5652"></a>
+<span class="sourceLineNo">5653</span><a name="line.5653"></a>
+<span class="sourceLineNo">5654</span>    WALEdit edit = editCaptor.getValue();<a name="line.5654"></a>
+<span class="sourceLineNo">5655</span>    assertNotNull(edit);<a name="line.5655"></a>
+<span class="sourceLineNo">5656</span>    assertNotNull(edit.getCells());<a name="line.5656"></a>
+<span class="sourceLineNo">5657</span>    assertEquals(1, edit.getCells().size());<a name="line.5657"></a>
+<span class="sourceLineNo">5658</span>    RegionEventDescriptor desc = WALEdit.getRegionEventDescriptor(edit.getCells().get(0));<a name="line.5658"></a>
+<span class="sourceLineNo">5659</span>    assertNotNull(desc);<a name="line.5659"></a>
 <span class="sourceLineNo">5660</span><a name="line.5660"></a>
-<span class="sourceLineNo">5661</span>    StoreDescriptor store = desc.getStores(0);<a name="line.5661"></a>
-<span class="sourceLineNo">5662</span>    assertTrue(Bytes.equals(store.getFamilyName().toByteArray(), fam1));<a name="line.5662"></a>
-<span class="sourceLineNo">5663</span>    assertEquals(store.getStoreHomeDir(), Bytes.toString(fam1));<a name="line.5663"></a>
-<span class="sourceLineNo">5664</span>    assertEquals(1, store.getStoreFileCount()); // 1store file<a name="line.5664"></a>
-<span class="sourceLineNo">5665</span>    assertFalse(store.getStoreFile(0).contains("/")); // ensure path is relative<a name="line.5665"></a>
-<span class="sourceLineNo">5666</span><a name="line.5666"></a>
-<span class="sourceLineNo">5667</span>    store = desc.getStores(1);<a name="line.5667"></a>
-<span class="sourceLineNo">5668</span>    assertTrue(Bytes.equals(store.getFamilyName().toByteArray(), fam2));<a name="line.5668"></a>
-<span class="sourceLineNo">5669</span>    assertEquals(store.getStoreHomeDir(), Bytes.toString(fam2));<a name="line.5669"></a>
-<span class="sourceLineNo">5670</span>    assertEquals(0, store.getStoreFileCount()); // no store files<a name="line.5670"></a>
-<span class="sourceLineNo">5671</span>  }<a name="line.5671"></a>
-<span class="sourceLineNo">5672</span><a name="line.5672"></a>
-<span class="sourceLineNo">5673</span>  // Helper for test testOpenRegionWrittenToWALForLogReplay<a name="line.5673"></a>
-<span class="sourceLineNo">5674</span>  static class HRegionWithSeqId extends HRegion {<a name="line.5674"></a>
-<span class="sourceLineNo">5675</span>    public HRegionWithSeqId(final Path tableDir, final WAL wal, final FileSystem fs,<a name="line.5675"></a>
-<span class="sourceLineNo">5676</span>        final Configuration confParam, final RegionInfo regionInfo,<a name="line.5676"></a>
-<span class="sourceLineNo">5677</span>        final TableDescriptor htd, final RegionServerServices rsServices) {<a name="line.5677"></a>
-<span class="sourceLineNo">5678</span>      super(tableDir, wal, fs, confParam, regionInfo, htd, rsServices);<a name="line.5678"></a>
-<span class="sourceLineNo">5679</span>    }<a name="line.5679"></a>
-<span class="sourceLineNo">5680</span>    @Override<a name="line.5680"></a>
-<span class="sourceLineNo">5681</span>    protected long getNextSequenceId(WAL wal) throws IOException {<a name="line.5681"></a>
-<span class="sourceLineNo">5682</span>      return 42;<a name="line.5682"></a>
-<span class="sourceLineNo">5683</span>    }<a name="line.5683"></a>
-<span class="sourceLineNo">5684</span>  }<a name="line.5684"></a>
-<span class="sourceLineNo">5685</span><a name="line.5685"></a>
-<span class="sourceLineNo">5686</span>  @Test<a name="line.5686"></a>
-<span class="sourceLineNo">5687</span>  public void testFlushedFileWithNoTags() throws Exception {<a name="line.5687"></a>
-<span class="sourceLineNo">5688</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.5688"></a>
-<span class="sourceLineNo">5689</span>    HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.5689"></a>
-<span class="sourceLineNo">5690</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.5690"></a>
-<span class="sourceLineNo">5691</span>    HRegionInfo info = new HRegionInfo(tableName, null, null, false);<a name="line.5691"></a>
-<span class="sourceLineNo">5692</span>    Path path = TEST_UTIL.getDataTestDir(getClass().getSimpleName());<a name="line.5692"></a>
-<span class="sourceLineNo">5693</span>    region = HBaseTestingUtility.createRegionAndWAL(info, path, TEST_UTIL.getConfiguration(), htd);<a name="line.5693"></a>
-<span class="sourceLineNo">5694</span>    Put put = new Put(Bytes.toBytes("a-b-0-0"));<a name="line.5694"></a>
-<span class="sourceLineNo">5695</span>    put.addColumn(fam1, qual1, Bytes.toBytes("c1-value"));<a name="line.5695"></a>
-<span class="sourceLineNo">5696</span>    region.put(put);<a name="line.5696"></a>
-<span class="sourceLineNo">5697</span>    region.flush(true);<a name="line.5697"></a>
-<span class="sourceLineNo">5698</span>    HStore store = region.getStore(fam1);<a name="line.5698"></a>
-<span class="sourceLineNo">5699</span>    Collection&lt;HStoreFile&gt; storefiles = store.getStorefiles();<a name="line.5699"></a>
-<span class="sourceLineNo">5700</span>    for (HStoreFile sf : storefiles) {<a name="line.5700"></a>
-<span class="sourceLineNo">5701</span>      assertFalse("Tags should not be present "<a name="line.5701"></a>
-<span class="sourceLineNo">5702</span>          ,sf.getReader().getHFileReader().getFileContext().isIncludesTags());<a name="line.5702"></a>
-<span class="sourceLineNo">5703</span>    }<a name="line.5703"></a>
-<span class="sourceLineNo">5704</span>  }<a name="line.5704"></a>
-<span class="sourceLineNo">5705</span><a name="line.5705"></a>
-<span class="sourceLineNo">5706</span>  /**<a name="line.5706"></a>
-<span class="sourceLineNo">5707</span>   * Utility method to setup a WAL mock.<a name="line.5707"></a>
-<span class="sourceLineNo">5708</span>   * Needs to do the bit where we close latch on the WALKeyImpl on append else test hangs.<a name="line.5708"></a>
-<span class="sourceLineNo">5709</span>   * @return a mock WAL<a name="line.5709"></a>
-<span class="sourceLineNo">5710</span>   * @throws IOException<a name="line.5710"></a>
-<span class="sourceLineNo">5711</span>   */<a name="line.5711"></a>
-<span class="sourceLineNo">5712</span>  private WAL mockWAL() throws IOException {<a name="line.5712"></a>
-<span class="sourceLineNo">5713</span>    WAL wal = mock(WAL.class);<a name="line.5713"></a>
-<span class="sourceLineNo">5714</span>    Mockito.when(wal.append((HRegionInfo)Mockito.any(),<a name="line.5714"></a>
-<span class="sourceLineNo">5715</span>        (WALKeyImpl)Mockito.any(), (WALEdit)Mockito.any(), Mockito.anyBoolean())).<a name="line.5715"></a>
-<span class="sourceLineNo">5716</span>      thenAnswer(new Answer&lt;Long&gt;() {<a name="line.5716"></a>
-<span class="sourceLineNo">5717</span>        @Override<a name="line.5717"></a>
-<span class="sourceLineNo">5718</span>        public Long answer(InvocationOnMock invocation) throws Throwable {<a name="line.5718"></a>
-<span class="sourceLineNo">5719</span>          WALKeyImpl key = invocation.getArgument(1);<a name="line.5719"></a>
-<span class="sourceLineNo">5720</span>          MultiVersionConcurrencyControl.WriteEntry we = key.getMvcc().begin();<a name="line.5720"></a>
-<span class="sourceLineNo">5721</span>          key.setWriteEntry(we);<a name="line.5721"></a>
-<span class="sourceLineNo">5722</span>          return 1L;<a name="line.5722"></a>
-<span class="sourceLineNo">5723</span>        }<a name="line.5723"></a>
-<span class="sourceLineNo">5724</span><a name="line.5724"></a>
-<span class="sourceLineNo">5725</span>    });<a name="line.5725"></a>
-<span class="sourceLineNo">5726</span>    return wal;<a name="line.5726"></a>
-<span class="sourceLineNo">5727</span>  }<a name="line.5727"></a>
-<span class="sourceLineNo">5728</span><a name="line.5728"></a>
-<span class="sourceLineNo">5729</span>  @Test<a name="line.5729"></a>
-<span class="sourceLineNo">5730</span>  public void testCloseRegionWrittenToWAL() throws Exception {<a name="line.5730"></a>
-<span class="sourceLineNo">5731</span><a name="line.5731"></a>
-<span class="sourceLineNo">5732</span>    Path rootDir = new Path(dir + name.getMethodName());<a name="line.5732"></a>
-<span class="sourceLineNo">5733</span>    FSUtils.setRootDir(TEST_UTIL.getConfiguration(), rootDir);<a name="line.5733"></a>
+<span class="sourceLineNo">5661</span>    LOG.info("RegionEventDescriptor from WAL: " + desc);<a name="line.5661"></a>
+<span class="sourceLineNo">5662</span><a name="line.5662"></a>
+<span class="sourceLineNo">5663</span>    assertEquals(RegionEventDescriptor.EventType.REGION_OPEN, desc.getEventType());<a name="line.5663"></a>
+<span class="sourceLineNo">5664</span>    assertTrue(Bytes.equals(desc.getTableName().toByteArray(), htd.getTableName().toBytes()));<a name="line.5664"></a>
+<span class="sourceLineNo">5665</span>    assertTrue(Bytes.equals(desc.getEncodedRegionName().toByteArray(),<a name="line.5665"></a>
+<span class="sourceLineNo">5666</span>      hri.getEncodedNameAsBytes()));<a name="line.5666"></a>
+<span class="sourceLineNo">5667</span>    assertTrue(desc.getLogSequenceNumber() &gt; 0);<a name="line.5667"></a>
+<span class="sourceLineNo">5668</span>    assertEquals(serverName, ProtobufUtil.toServerName(desc.getServer()));<a name="line.5668"></a>
+<span class="sourceLineNo">5669</span>    assertEquals(2, desc.getStoresCount());<a name="line.5669"></a>
+<span class="sourceLineNo">5670</span><a name="line.5670"></a>
+<span class="sourceLineNo">5671</span>    StoreDescriptor store = desc.getStores(0);<a name="line.5671"></a>
+<span class="sourceLineNo">5672</span>    assertTrue(Bytes.equals(store.getFamilyName().toByteArray(), fam1));<a name="line.5672"></a>
+<span class="sourceLineNo">5673</span>    assertEquals(store.getStoreHomeDir(), Bytes.toString(fam1));<a name="line.5673"></a>
+<span class="sourceLineNo">5674</span>    assertEquals(1, store.getStoreFileCount()); // 1store file<a name="line.5674"></a>
+<span class="sourceLineNo">5675</span>    assertFalse(store.getStoreFile(0).contains("/")); // ensure path is relative<a name="line.5675"></a>
+<span class="sourceLineNo">5676</span><a name="line.5676"></a>
+<span class="sourceLineNo">5677</span>    store = desc.getStores(1);<a name="line.5677"></a>
+<span class="sourceLineNo">5678</span>    assertTrue(Bytes.equals(store.getFamilyName().toByteArray(), fam2));<a name="line.5678"></a>
+<span class="sourceLineNo">5679</span>    assertEquals(store.getStoreHomeDir(), Bytes.toString(fam2));<a name="line.5679"></a>
+<span class="sourceLineNo">5680</span>    assertEquals(0, store.getStoreFileCount()); // no store files<a name="line.5680"></a>
+<span class="sourceLineNo">5681</span>  }<a name="line.5681"></a>
+<span class="sourceLineNo">5682</span><a name="line.5682"></a>
+<span class="sourceLineNo">5683</span>  // Helper for test testOpenRegionWrittenToWALForLogReplay<a name="line.5683"></a>
+<span class="sourceLineNo">5684</span>  static class HRegionWithSeqId extends HRegion {<a name="line.5684"></a>
+<span class="sourceLineNo">5685</span>    public HRegionWithSeqId(final Path tableDir, final WAL wal, final FileSystem fs,<a name="line.5685"></a>
+<span class="sourceLineNo">5686</span>        final Configuration confParam, final RegionInfo regionInfo,<a name="line.5686"></a>
+<span class="sourceLineNo">5687</span>        final TableDescriptor htd, final RegionServerServices rsServices) {<a name="line.5687"></a>
+<span class="sourceLineNo">5688</span>      super(tableDir, wal, fs, confParam, regionInfo, htd, rsServices);<a name="line.5688"></a>
+<span class="sourceLineNo">5689</span>    }<a name="line.5689"></a>
+<span class="sourceLineNo">5690</span>    @Override<a name="line.5690"></a>
+<span class="sourceLineNo">5691</span>    protected long getNextSequenceId(WAL wal) throws IOException {<a name="line.5691"></a>
+<span class="sourceLineNo">5692</span>      return 42;<a name="line.5692"></a>
+<span class="sourceLineNo">5693</span>    }<a name="line.5693"></a>
+<span class="sourceLineNo">5694</span>  }<a name="line.5694"></a>
+<span class="sourceLineNo">5695</span><a name="line.5695"></a>
+<span class="sourceLineNo">5696</span>  @Test<a name="line.5696"></a>
+<span class="sourceLineNo">5697</span>  public void testFlushedFileWithNoTags() throws Exception {<a name="line.5697"></a>
+<span class="sourceLineNo">5698</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.5698"></a>
+<span class="sourceLineNo">5699</span>    HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.5699"></a>
+<span class="sourceLineNo">5700</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.5700"></a>
+<span class="sourceLineNo">5701</span>    HRegionInfo info = new HRegionInfo(tableName, null, null, false);<a name="line.5701"></a>
+<span class="sourceLineNo">5702</span>    Path path = TEST_UTIL.getDataTestDir(getClass().getSimpleName());<a name="line.5702"></a>
+<span class="sourceLineNo">5703</span>    region = HBaseTestingUtility.createRegionAndWAL(info, path, TEST_UTIL.getConfiguration(), htd);<a name="line.5703"></a>
+<span class="sourceLineNo">5704</span>    Put put = new Put(Bytes.toBytes("a-b-0-0"));<a name="line.5704"></a>
+<span class="sourceLineNo">5705</span>    put.addColumn(fam1, qual1, Bytes.toBytes("c1-value"));<a name="line.5705"></a>
+<span class="sourceLineNo">5706</span>    region.put(put);<a name="line.5706"></a>
+<span class="sourceLineNo">5707</span>    region.flush(true);<a name="line.5707"></a>
+<span class="sourceLineNo">5708</span>    HStore store = region.getStore(fam1);<a name="line.5708"></a>
+<span class="sourceLineNo">5709</span>    Collection&lt;HStoreFile&gt; storefiles = store.getStorefiles();<a name="line.5709"></a>
+<span class="sourceLineNo">5710</span>    for (HStoreFile sf : storefiles) {<a name="line.5710"></a>
+<span class="sourceLineNo">5711</span>      assertFalse("Tags should not be present "<a name="line.5711"></a>
+<span class="sourceLineNo">5712</span>          ,sf.getReader().getHFileReader().getFileContext().isIncludesTags());<a name="line.5712"></a>
+<span class="sourceLineNo">5713</span>    }<a name="line.5713"></a>
+<span class="sourceLineNo">5714</span>  }<a name="line.5714"></a>
+<span class="sourceLineNo">5715</span><a name="line.5715"></a>
+<span class="sourceLineNo">5716</span>  /**<a name="line.5716"></a>
+<span class="sourceLineNo">5717</span>   * Utility method to setup a WAL mock.<a name="line.5717"></a>
+<span class="sourceLineNo">5718</span>   * Needs to do the bit where we close latch on the WALKeyImpl on append else test hangs.<a name="line.5718"></a>
+<span class="sourceLineNo">5719</span>   * @return a mock WAL<a name="line.5719"></a>
+<span class="sourceLineNo">5720</span>   * @throws IOException<a name="line.5720"></a>
+<span class="sourceLineNo">5721</span>   */<a name="line.5721"></a>
+<span class="sourceLineNo">5722</span>  private WAL mockWAL() throws IOException {<a name="line.5722"></a>
+<span class="sourceLineNo">5723</span>    WAL wal = mock(WAL.class);<a name="line.5723"></a>
+<span class="sourceLineNo">5724</span>    Mockito.when(wal.append((HRegionInfo)Mockito.any(),<a name="line.5724"></a>
+<span class="sourceLineNo">5725</span>        (WALKeyImpl)Mockito.any(), (WALEdit)Mockito.any(), Mockito.anyBoolean())).<a name="line.5725"></a>
+<span class="sourceLineNo">5726</span>      thenAnswer(new Answer&lt;Long&gt;() {<a name="line.5726"></a>
+<span class="sourceLineNo">5727</span>        @Override<a name="line.5727"></a>
+<span class="sourceLineNo">5728</span>        public Long answer(InvocationOnMock invocation) throws Throwable {<a name="line.5728"></a>
+<span class="sourceLineNo">5729</span>          WALKeyImpl key = invocation.getArgument(1);<a name="line.5729"></a>
+<span class="sourceLineNo">5730</span>          MultiVersionConcurrencyControl.WriteEntry we = key.getMvcc().begin();<a name="line.5730"></a>
+<span class="sourceLineNo">5731</span>          key.setWriteEntry(we);<a name="line.5731"></a>
+<span class="sourceLineNo">5732</span>          return 1L;<a name="line.5732"></a>
+<span class="sourceLineNo">5733</span>        }<a name="line.5733"></a>
 <span class="sourceLineNo">5734</span><a name="line.5734"></a>
-<span class="sourceLineNo">5735</span>    final ServerName serverName = ServerName.valueOf("testCloseRegionWrittenToWAL", 100, 42);<a name="line.5735"></a>
-<span class="sourceLineNo">5736</span>    final RegionServerServices rss = spy(TEST_UTIL.createMockRegionServerService(serverName));<a name="line.5736"></a>
-<span class="sourceLineNo">5737</span><a name="line.5737"></a>
-<span class="sourceLineNo">5738</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.5738"></a>
-<span class="sourceLineNo">5739</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.5739"></a>
-<span class="sourceLineNo">5740</span>    htd.addFamily(new HColumnDescriptor(fam2));<a name="line.5740"></a>
+<span class="sourceLineNo">5735</span>    });<a name="line.5735"></a>
+<span class="sourceLineNo">5736</span>    return wal;<a name="line.5736"></a>
+<span class="sourceLineNo">5737</span>  }<a name="line.5737"></a>
+<span class="sourceLineNo">5738</span><a name="line.5738"></a>
+<span class="sourceLineNo">5739</span>  @Test<a name="line.5739"></a>
+<span class="sourceLineNo">5740</span>  public void testCloseRegionWrittenToWAL() throws Exception {<a name="line.5740"></a>
 <span class="sourceLineNo">5741</span><a name="line.5741"></a>
-<span class="sourceLineNo">5742</span>    final HRegionInfo hri = new HRegionInfo(htd.getTableName(),<a name="line.5742"></a>
-<span class="sourceLineNo">5743</span>      HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY);<a name="line.5743"></a>
+<span class="sourceLineNo">5742</span>    Path rootDir = new Path(dir + name.getMethodName());<a name="line.5742"></a>
+<span class="sourceLineNo">5743</span>    FSUtils.setRootDir(TEST_UTIL.getConfiguration(), rootDir);<a name="line.5743"></a>
 <span class="sourceLineNo">5744</span><a name="line.5744"></a>
-<span class="sourceLineNo">5745</span>    ArgumentCaptor&lt;WALEdit&gt; editCaptor = ArgumentCaptor.forClass(WALEdit.class);<a name="line.5745"></a>
-<span class="sourceLineNo">5746</span><a name="line.5746"></a>
-<span class="sourceLineNo">5747</span>    // capture append() calls<a name="line.5747"></a>
-<span class="sourceLineNo">5748</span>    WAL wal = mockWAL();<a name="line.5748"></a>
-<span class="sourceLineNo">5749</span>    when(rss.getWAL((HRegionInfo) any())).thenReturn(wal);<a name="line.5749"></a>
-<span class="sourceLineNo">5750</span><a name="line.5750"></a>
+<span class="sourceLineNo">5745</span>    final ServerName serverName = ServerName.valueOf("testCloseRegionWrittenToWAL", 100, 42);<a name="line.5745"></a>
+<span class="sourceLineNo">5746</span>    final RegionServerServices rss = spy(TEST_UTIL.createMockRegionServerService(serverName));<a name="line.5746"></a>
+<span class="sourceLineNo">5747</span><a name="line.5747"></a>
+<span class="sourceLineNo">5748</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.5748"></a>
+<span class="sourceLineNo">5749</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.5749"></a>
+<span class="sourceLineNo">5750</span>    htd.addFamily(new HColumnDescriptor(fam2));<a name="line.5750"></a>
 <span class="sourceLineNo">5751</span><a name="line.5751"></a>
-<span class="sourceLineNo">5752</span>    // create and then open a region first so that it can be closed later<a name="line.5752"></a>
-<span class="sourceLineNo">5753</span>    region = HRegion.createHRegion(hri, rootDir, TEST_UTIL.getConfiguration(), htd, rss.getWAL(hri));<a name="line.5753"></a>
-<span class="sourceLineNo">5754</span>    region = HRegion.openHRegion(hri, htd, rss.getWAL(hri),<a name="line.5754"></a>
-<span class="sourceLineNo">5755</span>      TEST_UTIL.getConfiguration(), rss, null);<a name="line.5755"></a>
+<span class="sourceLineNo">5752</span>    final HRegionInfo hri = new HRegionInfo(htd.getTableName(),<a name="line.5752"></a>
+<span class="sourceLineNo">5753</span>      HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY);<a name="line.5753"></a>
+<span class="sourceLineNo">5754</span><a name="line.5754"></a>
+<span class="sourceLineNo">5755</span>    ArgumentCaptor&lt;WALEdit&gt; editCaptor = ArgumentCaptor.forClass(WALEdit.class);<a name="line.5755"></a>
 <span class="sourceLineNo">5756</span><a name="line.5756"></a>
-<span class="sourceLineNo">5757</span>    // close the region<a name="line.5757"></a>
-<span class="sourceLineNo">5758</span>    region.close(false);<a name="line.5758"></a>
-<span class="sourceLineNo">5759</span><a name="line.5759"></a>
-<span class="sourceLineNo">5760</span>    // 2 times, one for region open, the other close region<a name="line.5760"></a>
-<span class="sourceLineNo">5761</span>    verify(wal, times(2)).append((HRegionInfo)any(), (WALKeyImpl)any(),<a name="line.5761"></a>
-<span class="sourceLineNo">5762</span>      editCaptor.capture(), anyBoolean());<a name="line.5762"></a>
-<span class="sourceLineNo">5763</span><a name="line.5763"></a>
-<span class="sourceLineNo">5764</span>    WALEdit edit = editCaptor.getAllValues().get(1);<a name="line.5764"></a>
-<span class="sourceLineNo">5765</span>    assertNotNull(edit);<a name="line.5765"></a>
-<span class="sourceLineNo">5766</span>    assertNotNull(edit.getCells());<a name="line.5766"></a>
-<span class="sourceLineNo">5767</span>    assertEquals(1, edit.getCells().size());<a name="line.5767"></a>
-<span class="sourceLineNo">5768</span>    RegionEventDescriptor desc = WALEdit.getRegionEventDescriptor(edit.getCells().get(0));<a name="line.5768"></a>
-<span class="sourceLineNo">5769</span>    assertNotNull(desc);<a name="line.5769"></a>
-<span class="sourceLineNo">5770</span><a name="line.5770"></a>
-<span class="sourceLineNo">5771</span>    LOG.info("RegionEventDescriptor from WAL: " + desc);<a name="line.5771"></a>
-<span class="sourceLineNo">5772</span><a name="line.5772"></a>
-<span class="sourceLineNo">5773</span>    assertEquals(RegionEventDescriptor.EventType.REGION_CLOSE, desc.getEventType());<a name="line.5773"></a>
-<span class="sourceLineNo">5774</span>    assertTrue(Bytes.equals(desc.getTableName().toByteArray(), htd.getTableName().toBytes()));<a name="line.5774"></a>
-<span class="sourceLineNo">5775</span>    assertTrue(Bytes.equals(desc.getEncodedRegionName().toByteArray(),<a name="line.5775"></a>
-<span class="sourceLineNo">5776</span>      hri.getEncodedNameAsBytes()));<a name="line.5776"></a>
-<span class="sourceLineNo">5777</span>    assertTrue(desc.getLogSequenceNumber() &gt; 0);<a name="line.5777"></a>
-<span class="sourceLineNo">5778</span>    assertEquals(serverName, ProtobufUtil.toServerName(desc.getServer()));<a name="line.5778"></a>
-<span class="sourceLineNo">5779</span>    assertEquals(2, desc.getStoresCount());<a name="line.5779"></a>
+<span class="sourceLineNo">5757</span>    // capture append() calls<a name="line.5757"></a>
+<span class="sourceLineNo">5758</span>    WAL wal = mockWAL();<a name="line.5758"></a>
+<span class="sourceLineNo">5759</span>    when(rss.getWAL((HRegionInfo) any())).thenReturn(wal);<a name="line.5759"></a>
+<span class="sourceLineNo">5760</span><a name="line.5760"></a>
+<span class="sourceLineNo">5761</span><a name="line.5761"></a>
+<span class="sourceLineNo">5762</span>    // create and then open a region first so that it can be closed later<a name="line.5762"></a>
+<span class="sourceLineNo">5763</span>    region = HRegion.createHRegion(hri, rootDir, TEST_UTIL.getConfiguration(), htd, rss.getWAL(hri));<a name="line.5763"></a>
+<span class="sourceLineNo">5764</span>    region = HRegion.openHRegion(hri, htd, rss.getWAL(hri),<a name="line.5764"></a>
+<span class="sourceLineNo">5765</span>      TEST_UTIL.getConfiguration(), rss, null);<a name="line.5765"></a>
+<span class="sourceLineNo">5766</span><a name="line.5766"></a>
+<span class="sourceLineNo">5767</span>    // close the region<a name="line.5767"></a>
+<span class="sourceLineNo">5768</span>    region.close(false);<a name="line.5768"></a>
+<span class="sourceLineNo">5769</span><a name="line.5769"></a>
+<span class="sourceLineNo">5770</span>    // 2 times, one for region open, the other close region<a name="line.5770"></a>
+<span class="sourceLineNo">5771</span>    verify(wal, times(2)).append((HRegionInfo)any(), (WALKeyImpl)any(),<a name="line.5771"></a>
+<span class="sourceLineNo">5772</span>      editCaptor.capture(), anyBoolean());<a name="line.5772"></a>
+<span class="sourceLineNo">5773</span><a name="line.5773"></a>
+<span class="sourceLineNo">5774</span>    WALEdit edit = editCaptor.getAllValues().get(1);<a name="line.5774"></a>
+<span class="sourceLineNo">5775</span>    assertNotNull(edit);<a name="line.5775"></a>
+<span class="sourceLineNo">5776</span>    assertNotNull(edit.getCells());<a name="line.5776"></a>
+<span class="sourceLineNo">5777</span>    assertEquals(1, edit.getCells().size());<a name="line.5777"></a>
+<span class="sourceLineNo">5778</span>    RegionEventDescriptor desc = WALEdit.getRegionEventDescriptor(edit.getCells().get(0));<a name="line.5778"></a>
+<span class="sourceLineNo">5779</span>    assertNotNull(desc);<a name="line.5779"></a>
 <span class="sourceLineNo">5780</span><a name="line.5780"></a>
-<span class="sourceLineNo">5781</span>    StoreDescriptor store = desc.getStores(0);<a name="line.5781"></a>
-<span class="sourceLineNo">5782</span>    assertTrue(Bytes.equals(store.getFamilyName().toByteArray(), fam1));<a name="line.5782"></a>
-<span class="sourceLineNo">5783</span>    assertEquals(store.getStoreHomeDir(), Bytes.toString(fam1));<a name="line.5783"></a>
-<span class="sourceLineNo">5784</span>    assertEquals(0, store.getStoreFileCount()); // no store files<a name="line.5784"></a>
-<span class="sourceLineNo">5785</span><a name="line.5785"></a>
-<span class="sourceLineNo">5786</span>    store = desc.getStores(1);<a name="line.5786"></a>
-<span class="sourceLineNo">5787</span>    assertTrue(Bytes.equals(store.getFamilyName().toByteArray(), fam2));<a name="line.5787"></a>
-<span class="sourceLineNo">5788</span>    assertEquals(store.getStoreHomeDir(), Bytes.toString(fam2));<a name="line.5788"></a>
-<span class="sourceLineNo">5789</span>    assertEquals(0, store.getStoreFileCount()); // no store files<a name="line.5789"></a>
-<span class="sourceLineNo">5790</span>  }<a name="line.5790"></a>
-<span class="sourceLineNo">5791</span><a name="line.5791"></a>
-<span class="sourceLineNo">5792</span>  /**<a name="line.5792"></a>
-<span class="sourceLineNo">5793</span>   * Test RegionTooBusyException thrown when region is busy<a name="line.5793"></a>
-<span class="sourceLineNo">5794</span>   */<a name="line.5794"></a>
-<span class="sourceLineNo">5795</span>  @Test<a name="line.5795"></a>
-<span class="sourceLineNo">5796</span>  public void testRegionTooBusy() throws IOException {<a name="line.5796"></a>
-<span class="sourceLineNo">5797</span>    byte[] family = Bytes.toBytes("family");<a name="line.5797"></a>
-<span class="sourceLineNo">5798</span>    long defaultBusyWaitDuration = CONF.getLong("hbase.busy.wait.duration",<a name="line.5798"></a>
-<span class="sourceLineNo">5799</span>      HRegion.DEFAULT_BUSY_WAIT_DURATION);<a name="line.5799"></a>
-<span class="sourceLineNo">5800</span>    CONF.setLong("hbase.busy.wait.duration", 1000);<a name="line.5800"></a>
-<span class="sourceLineNo">5801</span>    region = initHRegion(tableName, method, CONF, family);<a name="line.5801"></a>
-<span class="sourceLineNo">5802</span>    final AtomicBoolean stopped = new AtomicBoolean(true);<a name="line.5802"></a>
-<span class="sourceLineNo">5803</span>    Thread t = new Thread(new Runnable() {<a name="line.5803"></a>
-<span class="sourceLineNo">5804</span>      @Override<a name="line.5804"></a>
-<span class="sourceLineNo">5805</span>      public void run() {<a name="line.5805"></a>
-<span class="sourceLineNo">5806</span>        try {<a name="line.5806"></a>
-<span class="sourceLineNo">5807</span>          region.lock.writeLock().lock();<a name="line.5807"></a>
-<span class="sourceLineNo">5808</span>          stopped.set(false);<a name="line.5808"></a>
-<span class="sourceLineNo">5809</span>          while (!stopped.get()) {<a name="line.5809"></a>
-<span class="sourceLineNo">5810</span>            Thread.sleep(100);<a name="line.5810"></a>
-<span class="sourceLineNo">5811</span>          }<a name="line.5811"></a>
-<span class="sourceLineNo">5812</span>        } catch (InterruptedException ie) {<a name="line.5812"></a>
-<span class="sourceLineNo">5813</span>        } finally {<a name="line.5813"></a>
-<span class="sourceLineNo">5814</span>          region.lock.writeLock().unlock();<a name="line.5814"></a>
-<span class="sourceLineNo">5815</span>        }<a name="line.5815"></a>
-<span class="sourceLineNo">5816</span>      }<a name="line.5816"></a>
-<span class="sourceLineNo">5817</span>    });<a name="line.5817"></a>
-<span class="sourceLineNo">5818</span>    t.start();<a name="line.5818"></a>
-<span class="sourceLineNo">5819</span>    Get get = new Get(row);<a name="line.5819"></a>
-<span class="sourceLineNo">5820</span>    try {<a name="line.5820"></a>
-<span class="sourceLineNo">5821</span>      while (stopped.get()) {<a name="line.5821"></a>
-<span class="sourceLineNo">5822</span>        Thread.sleep(100);<a name="line.5822"></a>
-<span class="sourceLineNo">5823</span>      }<a name="line.5823"></a>
-<span class="sourceLineNo">5824</span>      region.get(get);<a name="line.5824"></a>
-<span class="sourceLineNo">5825</span>      fail("Should throw RegionTooBusyException");<a name="line.5825"></a>
-<span class="sourceLineNo">5826</span>    } catch (InterruptedException ie) {<a name="line.5826"></a>
-<span class="sourceLineNo">5827</span>      fail("test interrupted");<a name="line.5827"></a>
-<span class="sourceLineNo">5828</span>    } catch (RegionTooBusyException e) {<a name="line.5828"></a>
-<span class="sourceLineNo">5829</span>      // Good, expected<a name="line.5829"></a>
-<span class="sourceLineNo">5830</span>    } finally {<a name="line.5830"></a>
-<span class="sourceLineNo">5831</span>      stopped.set(true);<a name="line.5831"></a>
-<span class="sourceLineNo">5832</span>      try {<a name="line.5832"></a>
-<span class="sourceLineNo">5833</span>        t.join();<a name="line.5833"></a>
-<span class="sourceLineNo">5834</span>      } catch (Throwable e) {<a name="line.5834"></a>
-<span class="sourceLineNo">5835</span>      }<a name="line.5835"></a>
-<span class="sourceLineNo">5836</span><a name="line.5836"></a>
-<span class="sourceLineNo">5837</span>      HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.5837"></a>
-<span class="sourceLineNo">5838</span>      region = null;<a name="line.5838"></a>
-<span class="sourceLineNo">5839</span>      CONF.setLong("hbase.busy.wait.duration", defaultBusyWaitDuration);<a name="line.5839"></a>
-<span class="sourceLineNo">5840</span>    }<a name="line.5840"></a>
-<span class="sourceLineNo">5841</span>  }<a name="line.5841"></a>
-<span class="sourceLineNo">5842</span><a name="line.5842"></a>
-<span class="sourceLineNo">5843</span>  @Test<a name="line.5843"></a>
-<span class="sourceLineNo">5844</span>  public void testCellTTLs() throws IOException {<a name="line.5844"></a>
-<span class="sourceLineNo">5845</span>    IncrementingEnvironmentEdge edge = new IncrementingEnvironmentEdge();<a name="line.5845"></a>
-<span class="sourceLineNo">5846</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.5846"></a>
-<span class="sourceLineNo">5847</span><a name="line.5847"></a>
-<span class="sourceLineNo">5848</span>    final byte[] row = Bytes.toBytes("testRow");<a name="line.5848"></a>
-<span class="sourceLineNo">5849</span>    final byte[] q1 = Bytes.toBytes("q1");<a name="line.5849"></a>
-<span class="sourceLineNo">5850</span>    final byte[] q2 = Bytes.toBytes("q2");<a name="line.5850"></a>
-<span class="sourceLineNo">5851</span>    final byte[] q3 = Bytes.toBytes("q3");<a name="line.5851"></a>
-<span class="sourceLineNo">5852</span>    final byte[] q4 = Bytes.toBytes("q4");<a name="line.5852"></a>
-<span class="sourceLineNo">5853</span><a name="line.5853"></a>
-<span class="sourceLineNo">5854</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.5854"></a>
-<span class="sourceLineNo">5855</span>    HColumnDescriptor hcd = new HColumnDescriptor(fam1);<a name="line.5855"></a>
-<span class="sourceLineNo">5856</span>    hcd.setTimeToLive(10); // 10 seconds<a name="line.5856"></a>
-<span class="sourceLineNo">5857</span>    htd.addFamily(hcd);<a name="line.5857"></a>
-<span class="sourceLineNo">5858</span><a name="line.5858"></a>
-<span class="sourceLineNo">5859</span>    Configuration conf = new Configuration(TEST_UTIL.getConfiguration());<a name="line.5859"></a>
-<span class="sourceLineNo">5860</span>    conf.setInt(HFile.FORMAT_VERSION_KEY, HFile.MIN_FORMAT_VERSION_WITH_TAGS);<a name="line.5860"></a>
-<span class="sourceLineNo">5861</span><a name="line.5861"></a>
-<span class="sourceLineNo">5862</span>    region = HBaseTestingUtility.createRegionAndWAL(new HRegionInfo(htd.getTableName(),<a name="line.5862"></a>
-<span class="sourceLineNo">5863</span>            HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY),<a name="line.5863"></a>
-<span class="sourceLineNo">5864</span>        TEST_UTIL.getDataTestDir(), conf, htd);<a name="line.5864"></a>
-<span class="sourceLineNo">5865</span>    assertNotNull(region);<a name="line.5865"></a>
-<span class="sourceLineNo">5866</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.5866"></a>
-<span class="sourceLineNo">5867</span>    // Add a cell that will expire in 5 seconds via cell TTL<a name="line.5867"></a>
-<span class="sourceLineNo">5868</span>    region.put(new Put(row).add(new KeyValue(row, fam1, q1, now,<a name="line.5868"></a>
-<span class="sourceLineNo">5869</span>      HConstants.EMPTY_BYTE_ARRAY, new ArrayBackedTag[] {<a name="line.5869"></a>
-<span class="sourceLineNo">5870</span>        // TTL tags specify ts in milliseconds<a name="line.5870"></a>
-<span class="sourceLineNo">5871</span>        new ArrayBackedTag(TagType.TTL_TAG_TYPE, Bytes.toBytes(5000L)) })));<a name="line.5871"></a>
-<span class="sourceLineNo">5872</span>    // Add a cell that will expire after 10 seconds via family setting<a name="line.5872"></a>
-<span class="sourceLineNo">5873</span>    region.put(new Put(row).addColumn(fam1, q2, now, HConstants.EMPTY_BYTE_ARRAY));<a name="line.5873"></a>
-<span class="sourceLineNo">5874</span>    // Add a cell that will expire in 15 seconds via cell TTL<a name="line.5874"></a>
-<span class="sourceLineNo">5875</span>    region.put(new Put(row).add(new KeyValue(row, fam1, q3, now + 10000 - 1,<a name="line.5875"></a>
-<span class="sourceLineNo">5876</span>      HConstants.EMPTY_BYTE_ARRAY, new ArrayBackedTag[] {<a name="line.5876"></a>
-<span class="sourceLineNo">5877</span>        // TTL tags specify ts in milliseconds<a name="line.5877"></a>
-<span class="sourceLineNo">5878</span>        new ArrayBackedTag(TagType.TTL_TAG_TYPE, Bytes.toBytes(5000L)) })));<a name="line.5878"></a>
-<span class="sourceLineNo">5879</span>    // Add a cell that will expire in 20 seconds via family setting<a name="line.5879"></a>
-<span class="sourceLineNo">5880</span>    region.put(new Put(row).addColumn(fam1, q4, now + 10000 - 1, HConstants.EMPTY_BYTE_ARRAY));<a name="line.5880"></a>
-<span class="sourceLineNo">5881</span><a name="line.5881"></a>
-<span class="sourceLineNo">5882</span>    // Flush so we are sure store scanning gets this right<a name="line.5882"></a>
-<span class="sourceLineNo">5883</span>    region.flush(true);<a name="line.5883"></a>
-<span class="sourceLineNo">5884</span><a name="line.5884"></a>
-<span class="sourceLineNo">5885</span>    // A query at time T+0 should return all cells<a name="line.5885"></a>
-<span class="sourceLineNo">5886</span>    Result r = region.get(new Get(row));<a name="line.5886"></a>
-<span class="sourceLineNo">5887</span>    assertNotNull(r.getValue(fam1, q1));<a name="line.5887"></a>
-<span class="sourceLineNo">5888</span>    assertNotNull(r.getValue(fam1, q2));<a name="line.5888"></a>
-<span class="sourceLineNo">5889</span>    assertNotNull(r.getValue(fam1, q3));<a name="line.5889"></a>
-<span class="sourceLineNo">5890</span>    assertNotNull(r.getValue(fam1, q4));<a name="line.5890"></a>
+<span class="sourceLineNo">5781</span>    LOG.info("RegionEventDescriptor from WAL: " + desc);<a name="line.5781"></a>
+<span class="sourceLineNo">5782</span><a name="line.5782"></a>
+<span class="sourceLineNo">5783</span>    assertEquals(RegionEventDescriptor.EventType.REGION_CLOSE, desc.getEventType());<a name="line.5783"></a>
+<span class="sourceLineNo">5784</span>    assertTrue(Bytes.equals(desc.getTableName().toByteArray(), htd.getTableName().toBytes()));<a name="line.5784"></a>
+<span class="sourceLineNo">5785</span>    assertTrue(Bytes.equals(desc.getEncodedRegionName().toByteArray(),<a name="line.5785"></a>
+<span class="sourceLineNo">5786</span>      hri.getEncodedNameAsBytes()));<a name="line.5786"></a>
+<span class="sourceLineNo">5787</span>    assertTrue(desc.getLogSequenceNumber() &gt; 0);<a name="line.5787"></a>
+<span class="sourceLineNo">5788</span>    assertEquals(serverName, ProtobufUtil.toServerName(desc.getServer()));<a name="line.5788"></a>
+<span class="sourceLineNo">5789</span>    assertEquals(2, desc.getStoresCount());<a name="line.5789"></a>
+<span class="sourceLineNo">5790</span><a name="line.5790"></a>
+<span class="sourceLineNo">5791</span>    StoreDescriptor store = desc.getStores(0);<a name="line.5791"></a>
+<span class="sourceLineNo">5792</span>    assertTrue(Bytes.equals(store.getFamilyName().toByteArray(), fam1));<a name="line.5792"></a>
+<span class="sourceLineNo">5793</span>    assertEquals(store.getStoreHomeDir(), Bytes.toString(fam1));<a name="line.5793"></a>
+<span class="sourceLineNo">5794</span>    assertEquals(0, store.getStoreFileCount()); // no store files<a name="line.5794"></a>
+<span class="sourceLineNo">5795</span><a name="line.5795"></a>
+<span class="sourceLineNo">5796</span>    store = desc.getStores(1);<a name="line.5796"></a>
+<span class="sourceLineNo">5797</span>    assertTrue(Bytes.equals(store.getFamilyName().toByteArray(), fam2));<a name="line.5797"></a>
+<span class="sourceLineNo">5798</span>    assertEquals(store.getStoreHomeDir(), Bytes.toString(fam2));<a name="line.5798"></a>
+<span class="sourceLineNo">5799</span>    assertEquals(0, store.getStoreFileCount()); // no store files<a name="line.5799"></a>
+<span class="sourceLineNo">5800</span>  }<a name="line.5800"></a>
+<span class="sourceLineNo">5801</span><a name="line.5801"></a>
+<span class="sourceLineNo">5802</span>  /**<a name="line.5802"></a>
+<span class="sourceLineNo">5803</span>   * Test RegionTooBusyException thrown when region is busy<a name="line.5803"></a>
+<span class="sourceLineNo">5804</span>   */<a name="line.5804"></a>
+<span class="sourceLineNo">5805</span>  @Test<a name="line.5805"></a>
+<span class="sourceLineNo">5806</span>  public void testRegionTooBusy() throws IOException {<a name="line.5806"></a>
+<span class="sourceLineNo">5807</span>    byte[] family = Bytes.toBytes("family");<a name="line.5807"></a>
+<span class="sourceLineNo">5808</span>    long defaultBusyWaitDuration = CONF.getLong("hbase.busy.wait.duration",<a name="line.5808"></a>
+<span class="sourceLineNo">5809</span>      HRegion.DEFAULT_BUSY_WAIT_DURATION);<a name="line.5809"></a>
+<span class="sourceLineNo">5810</span>    CONF.setLong("hbase.busy.wait.duration", 1000);<a name="line.5810"></a>
+<span class="sourceLineNo">5811</span>    region = initHRegion(tableName, method, CONF, family);<a name="line.5811"></a>
+<span class="sourceLineNo">5812</span>    final AtomicBoolean stopped = new AtomicBoolean(true);<a name="line.5812"></a>
+<span class="sourceLineNo">5813</span>    Thread t = new Thread(new Runnable() {<a name="line.5813"></a>
+<span class="sourceLineNo">5814</span>      @Override<a name="line.5814"></a>
+<span class="sourceLineNo">5815</span>      public void run() {<a name="line.5815"></a>
+<span class="sourceLineNo">5816</span>        try {<a name="line.5816"></a>
+<span class="sourceLineNo">5817</span>          region.lock.writeLock().lock();<a name="line.5817"></a>
+<span class="sourceLineNo">5818</span>          stopped.set(false);<a name="line.5818"></a>
+<span class="sourceLineNo">5819</span>          while (!stopped.get()) {<a name="line.5819"></a>
+<span class="sourceLineNo">5820</span>            Thread.sleep(100);<a name="line.5820"></a>
+<span class="sourceLineNo">5821</span>          }<a name="line.5821"></a>
+<span class="sourceLineNo">5822</span>        } catch (InterruptedException ie) {<a name="line.5822"></a>
+<span class="sourceLineNo">5823</span>        } finally {<a name="line.5823"></a>
+<span class="sourceLineNo">5824</span>          region.lock.writeLock().unlock();<a name="line.5824"></a>
+<span class="sourceLineNo">5825</span>        }<a name="line.5825"></a>
+<span class="sourceLineNo">5826</span>      }<a name="line.5826"></a>
+<span class="sourceLineNo">5827</span>    });<a name="line.5827"></a>
+<span class="sourceLineNo">5828</span>    t.start();<a name="line.5828"></a>
+<span class="sourceLineNo">5829</span>    Get get = new Get(row);<a name="line.5829"></a>
+<span class="sourceLineNo">5830</span>    try {<a name="line.5830"></a>
+<span class="sourceLineNo">5831</span>      while (stopped.get()) {<a name="line.5831"></a>
+<span class="sourceLineNo">5832</span>        Thread.sleep(100);<a name="line.5832"></a>
+<span class="sourceLineNo">5833</span>      }<a name="line.5833"></a>
+<span class="sourceLineNo">5834</span>      region.get(get);<a name="line.5834"></a>
+<span class="sourceLineNo">5835</span>      fail("Should throw RegionTooBusyException");<a name="line.5835"></a>
+<span class="sourceLineNo">5836</span>    } catch (InterruptedException ie) {<a name="line.5836"></a>
+<span class="sourceLineNo">5837</span>      fail("test interrupted");<a name="line.5837"></a>
+<span class="sourceLineNo">5838</span>    } catch (RegionTooBusyException e) {<a name="line.5838"></a>
+<span class="sourceLineNo">5839</span>      // Good, expected<a name="line.5839"></a>
+<span class="sourceLineNo">5840</span>    } finally {<a name="line.5840"></a>
+<span class="sourceLineNo">5841</span>      stopped.set(true);<a name="line.5841"></a>
+<span class="sourceLineNo">5842</span>      try {<a name="line.5842"></a>
+<span class="sourceLineNo">5843</span>        t.join();<a name="line.5843"></a>
+<span class="sourceLineNo">5844</span>      } catch (Throwable e) {<a name="line.5844"></a>
+<span class="sourceLineNo">5845</span>      }<a name="line.5845"></a>
+<span class="sourceLineNo">5846</span><a name="line.5846"></a>
+<span class="sourceLineNo">5847</span>      HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.5847"></a>
+<span class="sourceLineNo">5848</span>      region = null;<a name="line.5848"></a>
+<span class="sourceLineNo">5849</span>      CONF.setLong("hbase.busy.wait.duration", defaultBusyWaitDuration);<a name="line.5849"></a>
+<span class="sourceLineNo">5850</span>    }<a name="line.5850"></a>
+<span class="sourceLineNo">5851</span>  }<a name="line.5851"></a>
+<span class="sourceLineNo">5852</span><a name="line.5852"></a>
+<span class="sourceLineNo">5853</span>  @Test<a name="line.5853"></a>
+<span class="sourceLineNo">5854</span>  public void testCellTTLs() throws IOException {<a name="line.5854"></a>
+<span class="sourceLineNo">5855</span>    IncrementingEnvironmentEdge edge = new IncrementingEnvironmentEdge();<a name="line.5855"></a>
+<span class="sourceLineNo">5856</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.5856"></a>
+<span class="sourceLineNo">5857</span><a name="line.5857"></a>
+<span class="sourceLineNo">5858</span>    final byte[] row = Bytes.toBytes("testRow");<a name="line.5858"></a>
+<span class="sourceLineNo">5859</span>    final byte[] q1 = Bytes.toBytes("q1");<a name="line.5859"></a>
+<span class="sourceLineNo">5860</span>    final byte[] q2 = Bytes.toBytes("q2");<a name="line.5860"></a>
+<span class="sourceLineNo">5861</span>    final byte[] q3 = Bytes.toBytes("q3");<a name="line.5861"></a>
+<span class="sourceLineNo">5862</span>    final byte[] q4 = Bytes.toBytes("q4");<a name="line.5862"></a>
+<span class="sourceLineNo">5863</span><a name="line.5863"></a>
+<span class="sourceLineNo">5864</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.5864"></a>
+<span class="sourceLineNo">5865</span>    HColumnDescriptor hcd = new HColumnDescriptor(fam1);<a name="line.5865"></a>
+<span class="sourceLineNo">5866</span>    hcd.setTimeToLive(10); // 10 seconds<a name="line.5866"></a>
+<span class="sourceLineNo">5867</span>    htd.addFamily(hcd);<a name="line.5867"></a>
+<span class="sourceLineNo">5868</span><a name="line.5868"></a>
+<span class="sourceLineNo">5869</span>    Configuration conf = new Configuration(TEST_UTIL.getConfiguration());<a name="line.5869"></a>
+<span class="sourceLineNo">5870</span>    conf.setInt(HFile.FORMAT_VERSION_KEY, HFile.MIN_FORMAT_VERSION_WITH_TAGS);<a name="line.5870"></a>
+<span class="sourceLineNo">5871</span><a name="line.5871"></a>
+<span class="sourceLineNo">5872</span>    region = HBaseTestingUtility.createRegionAndWAL(new HRegionInfo(htd.getTableName(),<a name="line.5872"></a>
+<span class="sourceLineNo">5873</span>            HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY),<a name="line.5873"></a>
+<span class="sourceLineNo">5874</span>        TEST_UTIL.getDataTestDir(), conf, htd);<a name="line.5874"></a>
+<span class="sourceLineNo">5875</span>    assertNotNull(region);<a name="line.5875"></a>
+<span class="sourceLineNo">5876</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.5876"></a>
+<span class="sourceLineNo">5877</span>    // Add a cell that will expire in 5 seconds via cell TTL<a name="line.5877"></a>
+<span class="sourceLineNo">5878</span>    region.put(new Put(row).add(new KeyValue(row, fam1, q1, now,<a name="line.5878"></a>
+<span class="sourceLineNo">5879</span>      HConstants.EMPTY_BYTE_ARRAY, new ArrayBackedTag[] {<a name="line.5879"></a>
+<span class="sourceLineNo">5880</span>        // TTL tags specify ts in milliseconds<a name="line.5880"></a>
+<span class="sourceLineNo">5881</span>        new ArrayBackedTag(TagType.TTL_TAG_TYPE, Bytes.toBytes(5000L)) })));<a name="line.5881"></a>
+<span class="sourceLineNo">5882</span>    // Add a cell that will expire after 10 seconds via family setting<a name="line.5882"></a>
+<span class="sourceLineNo">5883</span>    region.put(new Put(row).addColumn(fam1, q2, now, HConstants.EMPTY_BYTE_ARRAY));<a name="line.5883"></a>
+<span class="sourceLineNo">5884</span>    // Add a cell that will expire in 15 seconds via cell TTL<a name="line.5884"></a>
+<span class="sourceLineNo">5885</span>    region.put(new Put(row).add(new KeyValue(row, fam1, q3, now + 10000 - 1,<a name="line.5885"></a>
+<span class="sourceLineNo">5886</span>      HConstants.EMPTY_BYTE_ARRAY, new ArrayBackedTag[] {<a name="line.5886"></a>
+<span class="sourceLineNo">5887</span>        // TTL tags specify ts in milliseconds<a name="line.5887"></a>
+<span class="sourceLineNo">5888</span>        new ArrayBackedTag(TagType.TTL_TAG_TYPE, Bytes.toBytes(5000L)) })));<a name="line.5888"></a>
+<span class="sourceLineNo">5889</span>    // Add a cell that will expire in 20 seconds via family setting<a name="line.5889"></a>
+<span class="sourceLineNo">5890</span>    region.put(new Put(row).addColumn(fam1, q4, now + 10000 - 1, HConstants.EMPTY_BYTE_ARRAY));<a name="line.5890"></a>
 <span class="sourceLineNo">5891</span><a name="line.5891"></a>
-<span class="sourceLineNo">5892</span>    // Increment time to T+5 seconds<a name="line.5892"></a>
-<span class="sourceLineNo">5893</span>    edge.incrementTime(5000);<a name="line.5893"></a>
+<span class="sourceLineNo">5892</span>    // Flush so we are sure store scanning gets this right<a name="line.5892"></a>
+<span class="sourceLineNo">5893</span>    region.flush(true);<a name="line.5893"></a>
 <span class="sourceLineNo">5894</span><a name="line.5894"></a>
-<span class="sourceLineNo">5895</span>    r = region.get(new Get(row));<a name="line.5895"></a>
-<span class="sourceLineNo">5896</span>    assertNull(r.getValue(fam1, q1));<a name="line.5896"></a>
-<span class="sourceLineNo">5897</span>    assertNotNull(r.getValue(fam1, q2));<a name="line.5897"></a>
-<span class="sourceLineNo">5898</span>    assertNotNull(r.getValue(fam1, q3));<a name="line.5898"></a>
-<span class="sourceLineNo">5899</span>    assertNotNull(r.getValue(fam1, q4));<a name="line.5899"></a>
-<span class="sourceLineNo">5900</span><a name="line.5900"></a>
-<span class="sourceLineNo">5901</span>    // Increment time to T+10 seconds<a name="line.5901"></a>
-<span class="sourceLineNo">5902</span>    edge.incrementTime(5000);<a name="line.5902"></a>
-<span class="sourceLineNo">5903</span><a name="line.5903"></a>
-<span class="sourceLineNo">5904</span>    r = region.get(new Get(row));<a name="line.5904"></a>
-<span class="sourceLineNo">5905</span>    assertNull(r.getValue(fam1, q1));<a name="line.5905"></a>
-<span class="sourceLineNo">5906</span>    assertNull(r.getValue(fam1, q2));<a name="line.5906"></a>
-<span class="sourceLineNo">5907</span>    assertNotNull(r.getValue(fam1, q3));<a name="line.5907"></a>
-<span class="sourceLineNo">5908</span>    assertNotNull(r.getValue(fam1, q4));<a name="line.5908"></a>
-<span class="sourceLineNo">5909</span><a name="line.5909"></a>
-<span class="sourceLineNo">5910</span>    // Increment time to T+15 seconds<a name="line.5910"></a>
-<span class="sourceLineNo">5911</span>    edge.incrementTime(5000);<a name="line.5911"></a>
-<span class="sourceLineNo">5912</span><a name="line.5912"></a>
-<span class="sourceLineNo">5913</span>    r = region.get(new Get(row));<a name="line.5913"></a>
-<span class="sourceLineNo">5914</span>    assertNull(r.getValue(fam1, q1));<a name="line.5914"></a>
-<span class="sourceLineNo">5915</span>    assertNull(r.getValue(fam1, q2));<a name="line.5915"></a>
-<span class="sourceLineNo">5916</span>    assertNull(r.getValue(fam1, q3));<a name="line.5916"></a>
-<span class="sourceLineNo">5917</span>    assertNotNull(r.getValue(fam1, q4));<a name="line.5917"></a>
-<span class="sourceLineNo">5918</span><a name="line.5918"></a>
-<span class="sourceLineNo">5919</span>    // Increment time to T+20 seconds<a name="line.5919"></a>
-<span class="sourceLineNo">5920</span>    edge.incrementTime(10000);<a name="line.5920"></a>
-<span class="sourceLineNo">5921</span><a name="line.5921"></a>
-<span class="sourceLineNo">5922</span>    r = region.get(new Get(row));<a name="line.5922"></a>
-<span class="sourceLineNo">5923</span>    assertNull(r.getValue(fam1, q1));<a name="line.5923"></a>
-<span class="sourceLineNo">5924</span>    assertNull(r.getValue(fam1, q2));<a name="line.5924"></a>
-<span class="sourceLineNo">5925</span>    assertNull(r.getValue(fam1, q3));<a name="line.5925"></a>
-<span class="sourceLineNo">5926</span>    assertNull(r.getValue(fam1, q4));<a name="line.5926"></a>
-<span class="sourceLineNo">5927</span><a name="line.5927"></a>
-<span class="sourceLineNo">5928</span>    // Fun with disappearing increments<a name="line.5928"></a>
-<span class="sourceLineNo">5929</span><a name="line.5929"></a>
-<span class="sourceLineNo">5930</span>    // Start at 1<a name="line.5930"></a>
-<span class="sourceLineNo">5931</span>    region.put(new Put(row).addColumn(fam1, q1, Bytes.toBytes(1L)));<a name="line.5931"></a>
+<span class="sourceLineNo">5895</span>    // A query at time T+0 should return all cells<a name="line.5895"></a>
+<span class="sourceLineNo">5896</span>    Result r = region.get(new Get(row));<a name="line.5896"></a>
+<span class="sourceLineNo">5897</span>    assertNotNull(r.getValue(fam1, q1));<a name="line.5897"></a>
+<span class="sourceLineNo">5898</span>    assertNotNull(r.getValue(fam1, q2));<a name="line.5898"></a>
+<span class="sourceLineNo">5899</span>    assertNotNull(r.getValue(fam1, q3));<a name="line.5899"></a>
+<span class="sourceLineNo">5900</span>    assertNotNull(r.getValue(fam1, q4));<a name="line.5900"></a>
+<span class="sourceLineNo">5901</span><a name="line.5901"></a>
+<span class="sourceLineNo">5902</span>    // Increment time to T+5 seconds<a name="line.5902"></a>
+<span class="sourceLineNo">5903</span>    edge.incrementTime(5000);<a name="line.5903"></a>
+<span class="sourceLineNo">5904</span><a name="line.5904"></a>
+<span class="sourceLineNo">5905</span>    r = region.get(new Get(row));<a name="line.5905"></a>
+<span class="sourceLineNo">5906</span>    assertNull(r.getValue(fam1, q1));<a name="line.5906"></a>
+<span class="sourceLineNo">5907</span>    assertNotNull(r.getValue(fam1, q2));<a name="line.5907"></a>
+<span class="sourceLineNo">5908</span>    assertNotNull(r.getValue(fam1, q3));<a name="line.5908"></a>
+<span class="sourceLineNo">5909</span>    assertNotNull(r.getValue(fam1, q4));<a name="line.5909"></a>
+<span class="sourceLineNo">5910</span><a name="line.5910"></a>
+<span class="sourceLineNo">5911</span>    // Increment time to T+10 seconds<a name="line.5911"></a>
+<span class="sourceLineNo">5912</span>    edge.incrementTime(5000);<a name="line.5912"></a>
+<span class="sourceLineNo">5913</span><a name="line.5913"></a>
+<span class="sourceLineNo">5914</span>    r = region.get(new Get(row));<a name="line.5914"></a>
+<span class="sourceLineNo">5915</span>    assertNull(r.getValue(fam1, q1));<a name="line.5915"></a>
+<span class="sourceLineNo">5916</span>    assertNull(r.getValue(fam1, q2));<a name="line.5916"></a>
+<span class="sourceLineNo">5917</span>    assertNotNull(r.getValue(fam1, q3));<a name="line.5917"></a>
+<span class="sourceLineNo">5918</span>    assertNotNull(r.getValue(fam1, q4));<a name="line.5918"></a>
+<span class="sourceLineNo">5919</span><a name="line.5919"></a>
+<span class="sourceLineNo">5920</span>    // Increment time to T+15 seconds<a name="line.5920"></a>
+<span class="sourceLineNo">5921</span>    edge.incrementTime(5000);<a name="line.5921"></a>
+<span class="sourceLineNo">5922</span><a name="line.5922"></a>
+<span class="sourceLineNo">5923</span>    r = region.get(new Get(row));<a name="line.5923"></a>
+<span class="sourceLineNo">5924</span>    assertNull(r.getValue(fam1, q1));<a name="line.5924"></a>
+<span class="sourceLineNo">5925</span>    assertNull(r.getValue(fam1, q2));<a name="line.5925"></a>
+<span class="sourceLineNo">5926</span>    assertNull(r.getValue(fam1, q3));<a name="line.5926"></a>
+<span class="sourceLineNo">5927</span>    assertNotNull(r.getValue(fam1, q4));<a name="line.5927"></a>
+<span class="sourceLineNo">5928</span><a name="line.5928"></a>
+<span class="sourceLineNo">5929</span>    // Increment time to T+20 seconds<a name="line.5929"></a>
+<span class="sourceLineNo">5930</span>    edge.incrementTime(10000);<a name="line.5930"></a>
+<span class="sourceLineNo">5931</span><a name="line.5931"></a>
 <span class="sourceLineNo">5932</span>    r = region.get(new Get(row));<a name="line.5932"></a>
-<span class="sourceLineNo">5933</span>    byte[] val = r.getValue(fam1, q1);<a name="line.5933"></a>
-<span class="sourceLineNo">5934</span>    assertNotNull(val);<a name="line.5934"></a>
-<span class="sourceLineNo">5935</span>    assertEquals(1L, Bytes.toLong(val));<a name="line.5935"></a>
-<span class="sourceLineNo">5936</span><a name="line.5936"></a>
-<span class="sourceLineNo">5937</span>    // Increment with a TTL of 5 seconds<a name="line.5937"></a>
-<span class="sourceLineNo">5938</span>    Increment incr = new Increment(row).addColumn(fam1, q1, 1L);<a name="line.5938"></a>
-<span class="sourceLineNo">5939</span>    incr.setTTL(5000);<a name="line.5939"></a>
-<span class="sourceLineNo">5940</span>    region.increment(incr); // 2<a name="line.5940"></a>
-<span class="sourceLineNo">5941</span><a name="line.5941"></a>
-<span class="sourceLineNo">5942</span>    // New value should be 2<a name="line.5942"></a>
-<span class="sourceLineNo">5943</span>    r = region.get(new Get(row));<a name="line.5943"></a>
-<span class="sourceLineNo">5944</span>    val = r.getValue(fam1, q1);<a name="line.5944"></a>
-<span class="sourceLineNo">5945</span>    assertNotNull(val);<a name="line.5945"></a>
-<span class="sourceLineNo">5946</span>    assertEquals(2L, Bytes.toLong(val));<a name="line.5946"></a>
-<span class="sourceLineNo">5947</span><a name="line.5947"></a>
-<span class="sourceLineNo">5948</span>    // Increment time to T+25 seconds<a name="line.5948"></a>
-<span class="sourceLineNo">5949</span>    edge.incrementTime(5000);<a name="line.5949"></a>
-<span class="sourceLineNo">5950</span><a name="line.5950"></a>
-<span class="sourceLineNo">5951</span>    // Value should be back to 1<a name="line.5951"></a>
-<span class="sourceLineNo">5952</span>    r = region.get(new Get(row));<a name="line.5952"></a>
-<span class="sourceLineNo">5953</span>    val = r.getValue(fam1, q1);<a name="line.5953"></a>
-<span class="sourceLineNo">5954</span>    assertNotNull(val);<a name="line.5954"></a>
-<span class="sourceLineNo">5955</span>    assertEquals(1L, Bytes.toLong(val));<a name="line.5955"></a>
-<span class="sourceLineNo">5956</span><a name="line.5956"></a>
-<span class="sourceLineNo">5957</span>    // Increment time to T+30 seconds<a name="line.5957"></a>
-<span class="sourceLineNo">5958</span>    edge.incrementTime(5000);<a name="line.5958"></a>
-<span class="sourceLineNo">5959</span><a name="line.5959"></a>
-<span class="sourceLineNo">5960</span>    // Original value written at T+20 should be gone now via family TTL<a name="line.5960"></a>
-<span class="sourceLineNo">5961</span>    r = region.get(new Get(row));<a name="line.5961"></a>
-<span class="sourceLineNo">5962</span>    assertNull(r.getValue(fam1, q1));<a name="line.5962"></a>
-<span class="sourceLineNo">5963</span>  }<a name="line.5963"></a>
-<span class="sourceLineNo">5964</span><a name="line.5964"></a>
-<span class="sourceLineNo">5965</span>  @Test<a name="line.5965"></a>
-<span class="sourceLineNo">5966</span>  public void testIncrementTimestampsAreMonotonic() throws IOException {<a name="line.5966"></a>
-<span class="sourceLineNo">5967</span>    region = initHRegion(tableName, method, CONF, fam1);<a name="line.5967"></a>
-<span class="sourceLineNo">5968</span>    ManualEnvironmentEdge edge = new ManualEnvironmentEdge();<a name="line.5968"></a>
-<span class="sourceLineNo">5969</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.5969"></a>
-<span class="sourceLineNo">5970</span><a name="line.5970"></a>
-<span class="sourceLineNo">5971</span>    edge.setValue(10);<a name="line.5971"></a>
-<span class="sourceLineNo">5972</span>    Increment inc = new Increment(row);<a name="line.5972"></a>
-<span class="sourceLineNo">5973</span>    inc.setDurability(Durability.SKIP_WAL);<a name="line.5973"></a>
-<span class="sourceLineNo">5974</span>    inc.addColumn(fam1, qual1, 1L);<a name="line.5974"></a>
-<span class="sourceLineNo">5975</span>    region.increment(inc);<a name="line.5975"></a>
-<span class="sourceLineNo">5976</span><a name="line.5976"></a>
-<span class="sourceLineNo">5977</span>    Result result = region.get(new Get(row));<a name="line.5977"></a>
-<span class="sourceLineNo">5978</span>    Cell c = result.getColumnLatestCell(fam1, qual1);<a name="line.5978"></a>
-<span class="sourceLineNo">5979</span>    assertNotNull(c);<a name="line.5979"></a>
-<span class="sourceLineNo">5980</span>    assertEquals(10L, c.getTimestamp());<a name="line.5980"></a>
-<span class="sourceLineNo">5981</span><a name="line.5981"></a>
-<span class="sourceLineNo">5982</span>    edge.setValue(1); // clock goes back<a name="line.5982"></a>
-<span class="sourceLineNo">5983</span>    region.increment(inc);<a name="line.5983"></a>
-<span class="sourceLineNo">5984</span>    result = region.get(new Get(row));<a name="line.5984"></a>
-<span class="sourceLineNo">5985</span>    c = result.getColumnLatestCell(fam1, qual1);<a name="line.5985"></a>
-<span class="sourceLineNo">5986</span>    assertEquals(11L, c.getTimestamp());<a name="line.5986"></a>
-<span class="sourceLineNo">5987</span>    assertEquals(2L, Bytes.toLong(c.getValueArray(), c.getValueOffset(), c.getValueLength()));<a name="line.5987"></a>
-<span class="sourceLineNo">5988</span>  }<a name="line.5988"></a>
-<span class="sourceLineNo">5989</span><a name="line.5989"></a>
-<span class="sourceLineNo">5990</span>  @Test<a name="line.5990"></a>
-<span class="sourceLineNo">5991</span>  public void testAppendTimestampsAreMonotonic() throws IOException {<a name="line.5991"></a>
-<span class="sourceLineNo">5992</span>    region = initHRegion(tableName, method, CONF, fam1);<a name="line.5992"></a>
-<span class="sourceLineNo">5993</span>    ManualEnvironmentEdge edge = new ManualEnvironmentEdge();<a name="line.5993"></a>
-<span class="sourceLineNo">5994</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.5994"></a>
-<span class="sourceLineNo">5995</span><a name="line.5995"></a>
-<span class="sourceLineNo">5996</span>    edge.setValue(10);<a name="line.5996"></a>
-<span class="sourceLineNo">5997</span>    Append a = new Append(row);<a name="line.5997"></a>
-<span class="sourceLineNo">5998</span>    a.setDurability(Durability.SKIP_WAL);<a name="line.5998"></a>
-<span class="sourceLineNo">5999</span>    a.addColumn(fam1, qual1, qual1);<a name="line.5999"></a>
-<span class="sourceLineNo">6000</span>    region.append(a);<a name="line.6000"></a>
-<span class="sourceLineNo">6001</span><a name="line.6001"></a>
-<span class="sourceLineNo">6002</span>    Result result = region.get(new Get(row));<a name="line.6002"></a>
-<span class="sourceLineNo">6003</span>    Cell c = result.getColumnLatestCell(fam1, qual1);<a name="line.6003"></a>
-<span class="sourceLineNo">6004</span>    assertNotNull(c);<a name="line.6004"></a>
-<span class="sourceLineNo">6005</span>    assertEquals(10L, c.getTimestamp());<a name="line.6005"></a>
-<span class="sourceLineNo">6006</span><a name="line.6006"></a>
-<span class="sourceLineNo">6007</span>    edge.setValue(1); // clock goes back<a name="line.6007"></a>
-<span class="sourceLineNo">6008</span>    region.append(a);<a name="line.6008"></a>
-<span class="sourceLineNo">6009</span>    result = region.get(new Get(row));<a name="line.6009"></a>
-<span class="sourceLineNo">6010</span>    c = result.getColumnLatestCell(fam1, qual1);<a name="line.6010"></a>
-<span class="sourceLineNo">6011</span>    assertEquals(11L, c.getTimestamp());<a name="line.6011"></a>
-<span class="sourceLineNo">6012</span><a name="line.6012"></a>
-<span class="sourceLineNo">6013</span>    byte[] expected = new byte[qual1.length*2];<a name="line.6013"></a>
-<span class="sourceLineNo">6014</span>    System.arraycopy(qual1, 0, expected, 0, qual1.length);<a name="line.6014"></a>
-<span class="sourceLineNo">6015</span>    System.arraycopy(qual1, 0, expected, qual1.length, qual1.length);<a name="line.6015"></a>
+<span class="sourceLineNo">5933</span>    assertNull(r.getValue(fam1, q1));<a name="line.5933"></a>
+<span class="sourceLineNo">5934</span>    assertNull(r.getValue(fam1, q2));<a name="line.5934"></a>
+<span class="sourceLineNo">5935</span>    assertNull(r.getValue(fam1, q3));<a name="line.5935"></a>
+<span class="sourceLineNo">5936</span>    assertNull(r.getValue(fam1, q4));<a name="line.5936"></a>
+<span class="sourceLineNo">5937</span><a name="line.5937"></a>
+<span class="sourceLineNo">5938</span>    // Fun with disappearing increments<a name="line.5938"></a>
+<span class="sourceLineNo">5939</span><a name="line.5939"></a>
+<span class="sourceLineNo">5940</span>    // Start at 1<a name="line.5940"></a>
+<span class="sourceLineNo">5941</span>    region.put(new Put(row).addColumn(fam1, q1, Bytes.toBytes(1L)));<a name="line.5941"></a>
+<span class="sourceLineNo">5942</span>    r = region.get(new Get(row));<a name="line.5942"></a>
+<span class="sourceLineNo">5943</span>    byte[] val = r.getValue(fam1, q1);<a name="line.5943"></a>
+<span class="sourceLineNo">5944</span>    assertNotNull(val);<a name="line.5944"></a>
+<span class="sourceLineNo">5945</span>    assertEquals(1L, Bytes.toLong(val));<a name="line.5945"></a>
+<span class="sourceLineNo">5946</span><a name="line.5946"></a>
+<span class="sourceLineNo">5947</span>    // Increment with a TTL of 5 seconds<a name="line.5947"></a>
+<span class="sourceLineNo">5948</span>    Increment incr = new Increment(row).addColumn(fam1, q1, 1L);<a name="line.5948"></a>
+<span class="sourceLineNo">5949</span>    incr.setTTL(5000);<a name="line.5949"></a>
+<span class="sourceLineNo">5950</span>    region.increment(incr); // 2<a name="line.5950"></a>
+<span class="sourceLineNo">5951</span><a name="line.5951"></a>
+<span class="sourceLineNo">5952</span>    // New value should be 2<a name="line.5952"></a>
+<span class="sourceLineNo">5953</span>    r = region.get(new Get(row));<a name="line.5953"></a>
+<span class="sourceLineNo">5954</span>    val = r.getValue(fam1, q1);<a name="line.5954"></a>
+<span class="sourceLineNo">5955</span>    assertNotNull(val);<a name="line.5955"></a>
+<span class="sourceLineNo">5956</span>    assertEquals(2L, Bytes.toLong(val));<a name="line.5956"></a>
+<span class="sourceLineNo">5957</span><a name="line.5957"></a>
+<span class="sourceLineNo">5958</span>    // Increment time to T+25 seconds<a name="line.5958"></a>
+<span class="sourceLineNo">5959</span>    edge.incrementTime(5000);<a name="line.5959"></a>
+<span class="sourceLineNo">5960</span><a name="line.5960"></a>
+<span class="sourceLineNo">5961</span>    // Value should be back to 1<a name="line.5961"></a>
+<span class="sourceLineNo">5962</span>    r = region.get(new Get(row));<a name="line.5962"></a>
+<span class="sourceLineNo">5963</span>    val = r.getValue(fam1, q1);<a name="line.5963"></a>
+<span class="sourceLineNo">5964</span>    assertNotNull(val);<a name="line.5964"></a>
+<span class="sourceLineNo">5965</span>    assertEquals(1L, Bytes.toLong(val));<a name="line.5965"></a>
+<span class="sourceLineNo">5966</span><a name="line.5966"></a>
+<span class="sourceLineNo">5967</span>    // Increment time to T+30 seconds<a name="line.5967"></a>
+<span class="sourceLineNo">5968</span>    edge.incrementTime(5000);<a name="line.5968"></a>
+<span class="sourceLineNo">5969</span><a name="line.5969"></a>
+<span class="sourceLineNo">5970</span>    // Original value written at T+20 should be gone now via family TTL<a name="line.5970"></a>
+<span class="sourceLineNo">5971</span>    r = region.get(new Get(row));<a name="line.5971"></a>
+<span class="sourceLineNo">5972</span>    assertNull(r.getValue(fam1, q1));<a name="line.5972"></a>
+<span class="sourceLineNo">5973</span>  }<a name="line.5973"></a>
+<span class="sourceLineNo">5974</span><a name="line.5974"></a>
+<span class="sourceLineNo">5975</span>  @Test<a name="line.5975"></a>
+<span class="sourceLineNo">5976</span>  public void testIncrementTimestampsAreMonotonic() throws IOException {<a name="line.5976"></a>
+<span class="sourceLineNo">5977</span>    region = initHRegion(tableName, method, CONF, fam1);<a name="line.5977"></a>
+<span class="sourceLineNo">5978</span>    ManualEnvironmentEdge edge = new ManualEnvironmentEdge();<a name="line.5978"></a>
+<span class="sourceLineNo">5979</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.5979"></a>
+<span class="sourceLineNo">5980</span><a name="line.5980"></a>
+<span class="sourceLineNo">5981</span>    edge.setValue(10);<a name="line.5981"></a>
+<span class="sourceLineNo">5982</span>    Increment inc = new Increment(row);<a name="line.5982"></a>
+<span class="sourceLineNo">5983</span>    inc.setDurability(Durability.SKIP_WAL);<a name="line.5983"></a>
+<span class="sourceLineNo">5984</span>    inc.addColumn(fam1, qual1, 1L);<a name="line.5984"></a>
+<span class="sourceLineNo">5985</span>    region.increment(inc);<a name="line.5985"></a>
+<span class="sourceLineNo">5986</span><a name="line.5986"></a>
+<span class="sourceLineNo">5987</span>    Result result = region.get(new Get(row));<a name="line.5987"></a>
+<span class="sourceLineNo">5988</span>    Cell c = result.getColumnLatestCell(fam1, qual1);<a name="line.5988"></a>
+<span class="sourceLineNo">5989</span>    assertNotNull(c);<a name="line.5989"></a>
+<span class="sourceLineNo">5990</span>    assertEquals(10L, c.getTimestamp());<a name="line.5990"></a>
+<span class="sourceLineNo">5991</span><a name="line.5991"></a>
+<span class="sourceLineNo">5992</span>    edge.setValue(1); // clock goes back<a name="line.5992"></a>
+<span class="sourceLineNo">5993</span>    region.increment(inc);<a name="line.5993"></a>
+<span class="sourceLineNo">5994</span>    result = region.get(new Get(row));<a name="line.5994"></a>
+<span class="sourceLineNo">5995</span>    c = result.getColumnLatestCell(fam1, qual1);<a name="line.5995"></a>
+<span class="sourceLineNo">5996</span>    assertEquals(11L, c.getTimestamp());<a name="line.5996"></a>
+<span class="sourceLineNo">5997</span>    assertEquals(2L, Bytes.toLong(c.getValueArray(), c.getValueOffset(), c.getValueLength()));<a name="line.5997"></a>
+<span class="sourceLineNo">5998</span>  }<a name="line.5998"></a>
+<span class="sourceLineNo">5999</span><a name="line.5999"></a>
+<span class="sourceLineNo">6000</span>  @Test<a name="line.6000"></a>
+<span class="sourceLineNo">6001</span>  public void testAppendTimestampsAreMonotonic() throws IOException {<a name="line.6001"></a>
+<span class="sourceLineNo">6002</span>    region = initHRegion(tableName, method, CONF, fam1);<a name="line.6002"></a>
+<span class="sourceLineNo">6003</span>    ManualEnvironmentEdge edge = new ManualEnvironmentEdge();<a name="line.6003"></a>
+<span class="sourceLineNo">6004</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.6004"></a>
+<span class="sourceLineNo">6005</span><a name="line.6005"></a>
+<span class="sourceLineNo">6006</span>    edge.setValue(10);<a name="line.6006"></a>
+<span class="sourceLineNo">6007</span>    Append a = new Append(row);<a name="line.6007"></a>
+<span class="sourceLineNo">6008</span>    a.setDurability(Durability.SKIP_WAL);<a name="line.6008"></a>
+<span class="sourceLineNo">6009</span>    a.addColumn(fam1, qual1, qual1);<a name="line.6009"></a>
+<span class="sourceLineNo">6010</span>    region.append(a);<a name="line.6010"></a>
+<span class="sourceLineNo">6011</span><a name="line.6011"></a>
+<span class="sourceLineNo">6012</span>    Result result = region.get(new Get(row));<a name="line.6012"></a>
+<span class="sourceLineNo">6013</span>    Cell c = result.getColumnLatestCell(fam1, qual1);<a name="line.6013"></a>
+<span class="sourceLineNo">6014</span>    assertNotNull(c);<a name="line.6014"></a>
+<span class="sourceLineNo">6015</span>    assertEquals(10L, c.getTimestamp());<a name="line.6015"></a>
 <span class="sourceLineNo">6016</span><a name="line.6016"></a>
-<span class="sourceLineNo">6017</span>    assertTrue(Bytes.equals(c.getValueArray(), c.getValueOffset(), c.getValueLength(),<a name="line.6017"></a>
-<span class="sourceLineNo">6018</span>      expected, 0, expected.length));<a name="line.6018"></a>
-<span class="sourceLineNo">6019</span>  }<a name="line.6019"></a>
-<span class="sourceLineNo">6020</span><a name="line.6020"></a>
-<span class="sourceLineNo">6021</span>  @Test<a name="line.6021"></a>
-<span class="sourceLineNo">6022</span>  public void testCheckAndMutateTimestampsAreMonotonic() throws IOException {<a name="line.6022"></a>
-<span class="sourceLineNo">6023</span>    region = initHRegion(tableName, method, CONF, fam1);<a name="line.6023"></a>
-<span class="sourceLineNo">6024</span>    ManualEnvironmentEdge edge = new ManualEnvironmentEdge();<a name="line.6024"></a>
-<span class="sourceLineNo">6025</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.6025"></a>
+<span class="sourceLineNo">6017</span>    edge.setValue(1); // clock goes back<a name="line.6017"></a>
+<span class="sourceLineNo">6018</span>    region.append(a);<a name="line.6018"></a>
+<span class="sourceLineNo">6019</span>    result = region.get(new Get(row));<a name="line.6019"></a>
+<span class="sourceLineNo">6020</span>    c = result.getColumnLatestCell(fam1, qual1);<a name="line.6020"></a>
+<span class="sourceLineNo">6021</span>    assertEquals(11L, c.getTimestamp());<a name="line.6021"></a>
+<span class="sourceLineNo">6022</span><a name="line.6022"></a>
+<span class="sourceLineNo">6023</span>    byte[] expected = new byte[qual1.length*2];<a name="line.6023"></a>
+<span class="sourceLineNo">6024</span>    System.arraycopy(qual1, 0, expected, 0, qual1.length);<a name="line.6024"></a>
+<span class="sourceLineNo">6025</span>    System.arraycopy(qual1, 0, expected, qual1.length, qual1.length);<a name="line.6025"></a>
 <span class="sourceLineNo">6026</span><a name="line.6026"></a>
-<span class="sourceLineNo">6027</span>    edge.setValue(10);<a name="line.6027"></a>
-<span class="sourceLineNo">6028</span>    Put p = new Put(row);<a name="line.6028"></a>
-<span class="sourceLineNo">6029</span>    p.setDurability(Durability.SKIP_WAL);<a name="line.6029"></a>
-<span class="sourceLineNo">6030</span>    p.addColumn(fam1, qual1, qual1);<a name="line.6030"></a>
-<span class="sourceLineNo">6031</span>    region.put(p);<a name="line.6031"></a>
-<span class="sourceLineNo">6032</span><a name="line.6032"></a>
-<span class="sourceLineNo">6033</span>    Result result = region.get(new Get(row));<a name="line.6033"></a>
-<span class="sourceLineNo">6034</span>    Cell c = result.getColumnLatestCell(fam1, qual1);<a name="line.6034"></a>
-<span class="sourceLineNo">6035</span>    assertNotNull(c);<a name="line.6035"></a>
-<span class="sourceLineNo">6036</span>    assertEquals(10L, c.getTimestamp());<a name="line.6036"></a>
-<span class="sourceLineNo">6037</span><a name="line.6037"></a>
-<span class="sourceLineNo">6038</span>    edge.setValue(1); // clock goes back<a name="line.6038"></a>
-<span class="sourceLineNo">6039</span>    p = new Put(row);<a name="line.6039"></a>
-<span class="sourceLineNo">6040</span>    p.setDurability(Durability.SKIP_WAL);<a name="line.6040"></a>
-<span class="sourceLineNo">6041</span>    p.addColumn(fam1, qual1, qual2);<a name="line.6041"></a>
-<span class="sourceLineNo">6042</span>    region.checkAndMutate(row, fam1, qual1, CompareOperator.EQUAL, new BinaryComparator(qual1), p);<a name="line.6042"></a>
-<span class="sourceLineNo">6043</span>    result = region.get(new Get(row));<a name="line.6043"></a>
-<span class="sourceLineNo">6044</span>    c = result.getColumnLatestCell(fam1, qual1);<a name="line.6044"></a>
-<span class="sourceLineNo">6045</span>    assertEquals(10L, c.getTimestamp());<a name="line.6045"></a>
-<span class="sourceLineNo">6046</span><a name="line.6046"></a>
-<span class="sourceLineNo">6047</span>    assertTrue(Bytes.equals(c.getValueArray(), c.getValueOffset(), c.getValueLength(),<a name="line.6047"></a>
-<span class="sourceLineNo">6048</span>      qual2, 0, qual2.length));<a name="line.6048"></a>
-<span class="sourceLineNo">6049</span>  }<a name="line.6049"></a>
-<span class="sourceLineNo">6050</span><a name="line.6050"></a>
-<span class="sourceLineNo">6051</span>  @Test<a name="line.6051"></a>
-<span class="sourceLineNo">6052</span>  public void testBatchMutateWithWrongRegionException() throws Exception {<a name="line.6052"></a>
-<span class="sourceLineNo">6053</span>    final byte[] a = Bytes.toBytes("a");<a name="line.6053"></a>
-<span class="sourceLineNo">6054</span>    final byte[] b = Bytes.toBytes("b");<a name="line.6054"></a>
-<span class="sourceLineNo">6055</span>    final byte[] c = Bytes.toBytes("c"); // exclusive<a name="line.6055"></a>
+<span class="sourceLineNo">6027</span>    assertTrue(Bytes.equals(c.getValueArray(), c.getValueOffset(), c.getValueLength(),<a name="line.6027"></a>
+<span class="sourceLineNo">6028</span>      expected, 0, expected.length));<a name="line.6028"></a>
+<span class="sourceLineNo">6029</span>  }<a name="line.6029"></a>
+<span class="sourceLineNo">6030</span><a name="line.6030"></a>
+<span class="sourceLineNo">6031</span>  @Test<a name="line.6031"></a>
+<span class="sourceLineNo">6032</span>  public void testCheckAndMutateTimestampsAreMonotonic() throws IOException {<a name="line.6032"></a>
+<span class="sourceLineNo">6033</span>    region = initHRegion(tableName, method, CONF, fam1);<a name="line.6033"></a>
+<span class="sourceLineNo">6034</span>    ManualEnvironmentEdge edge = new ManualEnvironmentEdge();<a name="line.6034"></a>
+<span class="sourceLineNo">6035</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.6035"></a>
+<span class="sourceLineNo">6036</span><a name="line.6036"></a>
+<span class="sourceLineNo">6037</span>    edge.setValue(10);<a name="line.6037"></a>
+<span class="sourceLineNo">6038</span>    Put p = new Put(row);<a name="line.6038"></a>
+<span class="sourceLineNo">6039</span>    p.setDurability(Durability.SKIP_WAL);<a name="line.6039"></a>
+<span class="sourceLineNo">6040</span>    p.addColumn(fam1, qual1, qual1);<a name="line.6040"></a>
+<span class="sourceLineNo">6041</span>    region.put(p);<a name="line.6041"></a>
+<span class="sourceLineNo">6042</span><a name="line.6042"></a>
+<span class="sourceLineNo">6043</span>    Result result = region.get(new Get(row));<a name="line.6043"></a>
+<span class="sourceLineNo">6044</span>    Cell c = result.getColumnLatestCell(fam1, qual1);<a name="line.6044"></a>
+<span class="sourceLineNo">6045</span>    assertNotNull(c);<a name="line.6045"></a>
+<span class="sourceLineNo">6046</span>    assertEquals(10L, c.getTimestamp());<a name="line.6046"></a>
+<span class="sourceLineNo">6047</span><a name="line.6047"></a>
+<span class="sourceLineNo">6048</span>    edge.setValue(1); // clock goes back<a name="line.6048"></a>
+<span class="sourceLineNo">6049</span>    p = new Put(row);<a name="line.6049"></a>
+<span class="sourceLineNo">6050</span>    p.setDurability(Durability.SKIP_WAL);<a name="line.6050"></a>
+<span class="sourceLineNo">6051</span>    p.addColumn(fam1, qual1, qual2);<a name="line.6051"></a>
+<span class="sourceLineNo">6052</span>    region.checkAndMutate(row, fam1, qual1, CompareOperator.EQUAL, new BinaryComparator(qual1), p);<a name="line.6052"></a>
+<span class="sourceLineNo">6053</span>    result = region.get(new Get(row));<a name="line.6053"></a>
+<span class="sourceLineNo">6054</span>    c = result.getColumnLatestCell(fam1, qual1);<a name="line.6054"></a>
+<span class="sourceLineNo">6055</span>    assertEquals(10L, c.getTimestamp());<a name="line.6055"></a>
 <span class="sourceLineNo">6056</span><a name="line.6056"></a>
-<span class="sourceLineNo">6057</span>    int prevLockTimeout = CONF.getInt("hbase.rowlock.wait.duration", 30000);<a name="line.6057"></a>
-<span class="sourceLineNo">6058</span>    CONF.setInt("hbase.rowlock.wait.duration", 1000);<a name="line.6058"></a>
-<span class="sourceLineNo">6059</span>    region = initHRegion(tableName, a, c, method, CONF, false, fam1);<a name="line.6059"></a>
+<span class="sourceLineNo">6057</span>    assertTrue(Bytes.equals(c.getValueArray(), c.getValueOffset(), c.getValueLength(),<a name="line.6057"></a>
+<span class="sourceLineNo">6058</span>      qual2, 0, qual2.length));<a name="line.6058"></a>
+<span class="sourceLineNo">6059</span>  }<a name="line.6059"></a>
 <span class="sourceLineNo">6060</span><a name="line.6060"></a>
-<span class="sourceLineNo">6061</span>    Mutation[] mutations = new Mutation[] {<a name="line.6061"></a>
-<span class="sourceLineNo">6062</span>        new Put(a)<a name="line.6062"></a>
-<span class="sourceLineNo">6063</span>            .add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6063"></a>
-<span class="sourceLineNo">6064</span>              .setRow(a)<a name="line.6064"></a>
-<span class="sourceLineNo">6065</span>              .setFamily(fam1)<a name="line.6065"></a>
-<span class="sourceLineNo">6066</span>              .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6066"></a>
-<span class="sourceLineNo">6067</span>              .setType(Cell.Type.Put)<a name="line.6067"></a>
-<span class="sourceLineNo">6068</span>              .build()),<a name="line.6068"></a>
-<span class="sourceLineNo">6069</span>        // this is outside the region boundary<a name="line.6069"></a>
-<span class="sourceLineNo">6070</span>        new Put(c).add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6070"></a>
-<span class="sourceLineNo">6071</span>              .setRow(c)<a name="line.6071"></a>
-<span class="sourceLineNo">6072</span>              .setFamily(fam1)<a name="line.6072"></a>
-<span class="sourceLineNo">6073</span>              .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6073"></a>
-<span class="sourceLineNo">6074</span>              .setType(Type.Put)<a name="line.6074"></a>
-<span class="sourceLineNo">6075</span>              .build()),<a name="line.6075"></a>
-<span class="sourceLineNo">6076</span>        new Put(b).add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6076"></a>
-<span class="sourceLineNo">6077</span>              .setRow(b)<a name="line.6077"></a>
-<span class="sourceLineNo">6078</span>              .setFamily(fam1)<a name="line.6078"></a>
-<span class="sourceLineNo">6079</span>              .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6079"></a>
-<span class="sourceLineNo">6080</span>              .setType(Cell.Type.Put)<a name="line.6080"></a>
-<span class="sourceLineNo">6081</span>              .build())<a name="line.6081"></a>
-<span class="sourceLineNo">6082</span>    };<a name="line.6082"></a>
-<span class="sourceLineNo">6083</span><a name="line.6083"></a>
-<span class="sourceLineNo">6084</span>    OperationStatus[] status = region.batchMutate(mutations);<a name="line.6084"></a>
-<span class="sourceLineNo">6085</span>    assertEquals(OperationStatusCode.SUCCESS, status[0].getOperationStatusCode());<a name="line.6085"></a>
-<span class="sourceLineNo">6086</span>    assertEquals(OperationStatusCode.SANITY_CHECK_FAILURE, status[1].getOperationStatusCode());<a name="line.6086"></a>
-<span class="sourceLineNo">6087</span>    assertEquals(OperationStatusCode.SUCCESS, status[2].getOperationStatusCode());<a name="line.6087"></a>
-<span class="sourceLineNo">6088</span><a name="line.6088"></a>
-<span class="sourceLineNo">6089</span><a name="line.6089"></a>
-<span class="sourceLineNo">6090</span>    // test with a row lock held for a long time<a name="line.6090"></a>
-<span class="sourceLineNo">6091</span>    final CountDownLatch obtainedRowLock = new CountDownLatch(1);<a name="line.6091"></a>
-<span class="sourceLineNo">6092</span>    ExecutorService exec = Executors.newFixedThreadPool(2);<a name="line.6092"></a>
-<span class="sourceLineNo">6093</span>    Future&lt;Void&gt; f1 = exec.submit(new Callable&lt;Void&gt;() {<a name="line.6093"></a>
-<span class="sourceLineNo">6094</span>      @Override<a name="line.6094"></a>
-<span class="sourceLineNo">6095</span>      public Void call() throws Exception {<a name="line.6095"></a>
-<span class="sourceLineNo">6096</span>        LOG.info("Acquiring row lock");<a name="line.6096"></a>
-<span class="sourceLineNo">6097</span>        RowLock rl = region.getRowLock(b);<a name="line.6097"></a>
-<span class="sourceLineNo">6098</span>        obtainedRowLock.countDown();<a name="line.6098"></a>
-<span class="sourceLineNo">6099</span>        LOG.info("Waiting for 5 seconds before releasing lock");<a name="line.6099"></a>
-<span class="sourceLineNo">6100</span>        Threads.sleep(5000);<a name="line.6100"></a>
-<span class="sourceLineNo">6101</span>        LOG.info("Releasing row lock");<a name="line.6101"></a>
-<span class="sourceLineNo">6102</span>        rl.release();<a name="line.6102"></a>
-<span class="sourceLineNo">6103</span>        return null;<a name="line.6103"></a>
-<span class="sourceLineNo">6104</span>      }<a name="line.6104"></a>
-<span class="sourceLineNo">6105</span>    });<a name="line.6105"></a>
-<span class="sourceLineNo">6106</span>    obtainedRowLock.await(30, TimeUnit.SECONDS);<a name="line.6106"></a>
-<span class="sourceLineNo">6107</span><a name="line.6107"></a>
-<span class="sourceLineNo">6108</span>    Future&lt;Void&gt; f2 = exec.submit(new Callable&lt;Void&gt;() {<a name="line.6108"></a>
-<span class="sourceLineNo">6109</span>      @Override<a name="line.6109"></a>
-<span class="sourceLineNo">6110</span>      public Void call() throws Exception {<a name="line.6110"></a>
-<span class="sourceLineNo">6111</span>        Mutation[] mutations = new Mutation[] {<a name="line.6111"></a>
-<span class="sourceLineNo">6112</span>            new Put(a).add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6112"></a>
-<span class="sourceLineNo">6113</span>                .setRow(a)<a name="line.6113"></a>
-<span class="sourceLineNo">6114</span>                .setFamily(fam1)<a name="line.6114"></a>
-<span class="sourceLineNo">6115</span>                .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6115"></a>
-<span class="sourceLineNo">6116</span>                .setType(Cell.Type.Put)<a name="line.6116"></a>
-<span class="sourceLineNo">6117</span>                .build()),<a name="line.6117"></a>
-<span class="sourceLineNo">6118</span>            new Put(b).add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6118"></a>
-<span class="sourceLineNo">6119</span>                .setRow(b)<a name="line.6119"></a>
-<span class="sourceLineNo">6120</span>                .setFamily(fam1)<a name="line.6120"></a>
-<span class="sourceLineNo">6121</span>                .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6121"></a>
-<span class="sourceLineNo">6122</span>                .setType(Cell.Type.Put)<a name="line.6122"></a>
-<span class="sourceLineNo">6123</span>                .build()),<a name="line.6123"></a>
-<span class="sourceLineNo">6124</span>        };<a name="line.6124"></a>
-<span class="sourceLineNo">6125</span><a name="line.6125"></a>
-<span class="sourceLineNo">6126</span>        // this will wait for the row lock, and it will eventually succeed<a name="line.6126"></a>
-<span class="sourceLineNo">6127</span>        OperationStatus[] status = region.batchMutate(mutations);<a name="line.6127"></a>
-<span class="sourceLineNo">6128</span>        assertEquals(OperationStatusCode.SUCCESS, status[0].getOperationStatusCode());<a name="line.6128"></a>
-<span class="sourceLineNo">6129</span>        assertEquals(OperationStatusCode.SUCCESS, status[1].getOperationStatusCode());<a name="line.6129"></a>
-<span class="sourceLineNo">6130</span>        return null;<a name="line.6130"></a>
-<span class="sourceLineNo">6131</span>      }<a name="line.6131"></a>
-<span class="sourceLineNo">6132</span>    });<a name="line.6132"></a>
-<span class="sourceLineNo">6133</span><a name="line.6133"></a>
-<span class="sourceLineNo">6134</span>    f1.get();<a name="line.6134"></a>
-<span class="sourceLineNo">6135</span>    f2.get();<a name="line.6135"></a>
-<span class="sourceLineNo">6136</span><a name="line.6136"></a>
-<span class="sourceLineNo">6137</span>    CONF.setInt("hbase.rowlock.wait.duration", prevLockTimeout);<a name="line.6137"></a>
-<span class="sourceLineNo">6138</span>  }<a name="line.6138"></a>
-<span class="sourceLineNo">6139</span><a name="line.6139"></a>
-<span class="sourceLineNo">6140</span>  @Test<a name="line.6140"></a>
-<span class="sourceLineNo">6141</span>  public void testCheckAndRowMutateTimestampsAreMonotonic() throws IOException {<a name="line.6141"></a>
-<span class="sourceLineNo">6142</span>    region = initHRegion(tableName, method, CONF, fam1);<a name="line.6142"></a>
-<span class="sourceLineNo">6143</span>    ManualEnvironmentEdge edge = new ManualEnvironmentEdge();<a name="line.6143"></a>
-<span class="sourceLineNo">6144</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.6144"></a>
-<span class="sourceLineNo">6145</span><a name="line.6145"></a>
-<span class="sourceLineNo">6146</span>    edge.setValue(10);<a name="line.6146"></a>
-<span class="sourceLineNo">6147</span>    Put p = new Put(row);<a name="line.6147"></a>
-<span class="sourceLineNo">6148</span>    p.setDurability(Durability.SKIP_WAL);<a name="line.6148"></a>
-<span class="sourceLineNo">6149</span>    p.addColumn(fam1, qual1, qual1);<a name="line.6149"></a>
-<span class="sourceLineNo">6150</span>    region.put(p);<a name="line.6150"></a>
-<span class="sourceLineNo">6151</span><a name="line.6151"></a>
-<span class="sourceLineNo">6152</span>    Result result = region.get(new Get(row));<a name="line.6152"></a>
-<span class="sourceLineNo">6153</span>    Cell c = result.getColumnLatestCell(fam1, qual1);<a name="line.6153"></a>
-<span class="sourceLineNo">6154</span>    assertNotNull(c);<a name="line.6154"></a>
-<span class="sourceLineNo">6155</span>    assertEquals(10L, c.getTimestamp());<a name="line.6155"></a>
-<span class="sourceLineNo">6156</span><a name="line.6156"></a>
-<span class="sourceLineNo">6157</span>    edge.setValue(1); // clock goes back<a name="line.6157"></a>
-<span class="sourceLineNo">6158</span>    p = new Put(row);<a name="line.6158"></a>
-<span class="sourceLineNo">6159</span>    p.setDurability(Durability.SKIP_WAL);<a name="line.6159"></a>
-<span class="sourceLineNo">6160</span>    p.addColumn(fam1, qual1, qual2);<a name="line.6160"></a>
-<span class="sourceLineNo">6161</span>    RowMutations rm = new RowMutations(row);<a name="line.6161"></a>
-<span class="sourceLineNo">6162</span>    rm.add(p);<a name="line.6162"></a>
-<span class="sourceLineNo">6163</span>    assertTrue(region.checkAndRowMutate(row, fam1, qual1, CompareOperator.EQUAL,<a name="line.6163"></a>
-<span class="sourceLineNo">6164</span>        new BinaryComparator(qual1), rm));<a name="line.6164"></a>
-<span class="sourceLineNo">6165</span>    result = region.get(new Get(row));<a name="line.6165"></a>
-<span class="sourceLineNo">6166</span>    c = result.getColumnLatestCell(fam1, qual1);<a name="line.6166"></a>
-<span class="sourceLineNo">6167</span>    assertEquals(10L, c.getTimestamp());<a name="line.6167"></a>
-<span class="sourceLineNo">6168</span>    LOG.info("c value " +<a name="line.6168"></a>
-<span class="sourceLineNo">6169</span>      Bytes.toStringBinary(c.getValueArray(), c.getValueOffset(), c.getValueLength()));<a name="line.6169"></a>
-<span class="sourceLineNo">6170</span><a name="line.6170"></a>
-<span class="sourceLineNo">6171</span>    assertTrue(Bytes.equals(c.getValueArray(), c.getValueOffset(), c.getValueLength(),<a name="line.6171"></a>
-<span class="sourceLineNo">6172</span>      qual2, 0, qual2.length));<a name="line.6172"></a>
-<span class="sourceLineNo">6173</span>  }<a name="line.6173"></a>
-<span class="sourceLineNo">6174</span><a name="line.6174"></a>
-<span class="sourceLineNo">6175</span>  HRegion initHRegion(TableName tableName, String callingMethod,<a name="line.6175"></a>
-<span class="sourceLineNo">6176</span>      byte[]... families) throws IOException {<a name="line.6176"></a>
-<span class="sourceLineNo">6177</span>    return initHRegion(tableName, callingMethod, HBaseConfiguration.create(),<a name="line.6177"></a>
-<span class="sourceLineNo">6178</span>        families);<a name="line.6178"></a>
-<span class="sourceLineNo">6179</span>  }<a name="line.6179"></a>
+<span class="sourceLineNo">6061</span>  @Test<a name="line.6061"></a>
+<span class="sourceLineNo">6062</span>  public void testBatchMutateWithWrongRegionException() throws Exception {<a name="line.6062"></a>
+<span class="sourceLineNo">6063</span>    final byte[] a = Bytes.toBytes("a");<a name="line.6063"></a>
+<span class="sourceLineNo">6064</span>    final byte[] b = Bytes.toBytes("b");<a name="line.6064"></a>
+<span class="sourceLineNo">6065</span>    final byte[] c = Bytes.toBytes("c"); // exclusive<a name="line.6065"></a>
+<span class="sourceLineNo">6066</span><a name="line.6066"></a>
+<span class="sourceLineNo">6067</span>    int prevLockTimeout = CONF.getInt("hbase.rowlock.wait.duration", 30000);<a name="line.6067"></a>
+<span class="sourceLineNo">6068</span>    CONF.setInt("hbase.rowlock.wait.duration", 1000);<a name="line.6068"></a>
+<span class="sourceLineNo">6069</span>    region = initHRegion(tableName, a, c, method, CONF, false, fam1);<a name="line.6069"></a>
+<span class="sourceLineNo">6070</span><a name="line.6070"></a>
+<span class="sourceLineNo">6071</span>    Mutation[] mutations = new Mutation[] {<a name="line.6071"></a>
+<span class="sourceLineNo">6072</span>        new Put(a)<a name="line.6072"></a>
+<span class="sourceLineNo">6073</span>            .add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6073"></a>
+<span class="sourceLineNo">6074</span>              .setRow(a)<a name="line.6074"></a>
+<span class="sourceLineNo">6075</span>              .setFamily(fam1)<a name="line.6075"></a>
+<span class="sourceLineNo">6076</span>              .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6076"></a>
+<span class="sourceLineNo">6077</span>              .setType(Cell.Type.Put)<a name="line.6077"></a>
+<span class="sourceLineNo">6078</span>              .build()),<a name="line.6078"></a>
+<span class="sourceLineNo">6079</span>        // this is outside the region boundary<a name="line.6079"></a>
+<span class="sourceLineNo">6080</span>        new Put(c).add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6080"></a>
+<span class="sourceLineNo">6081</span>              .setRow(c)<a name="line.6081"></a>
+<span class="sourceLineNo">6082</span>              .setFamily(fam1)<a name="line.6082"></a>
+<span class="sourceLineNo">6083</span>              .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6083"></a>
+<span class="sourceLineNo">6084</span>              .setType(Type.Put)<a name="line.6084"></a>
+<span class="sourceLineNo">6085</span>              .build()),<a name="line.6085"></a>
+<span class="sourceLineNo">6086</span>        new Put(b).add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6086"></a>
+<span class="sourceLineNo">6087</span>              .setRow(b)<a name="line.6087"></a>
+<span class="sourceLineNo">6088</span>              .setFamily(fam1)<a name="line.6088"></a>
+<span class="sourceLineNo">6089</span>              .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6089"></a>
+<span class="sourceLineNo">6090</span>              .setType(Cell.Type.Put)<a name="line.6090"></a>
+<span class="sourceLineNo">6091</span>              .build())<a name="line.6091"></a>
+<span class="sourceLineNo">6092</span>    };<a name="line.6092"></a>
+<span class="sourceLineNo">6093</span><a name="line.6093"></a>
+<span class="sourceLineNo">6094</span>    OperationStatus[] status = region.batchMutate(mutations);<a name="line.6094"></a>
+<span class="sourceLineNo">6095</span>    assertEquals(OperationStatusCode.SUCCESS, status[0].getOperationStatusCode());<a name="line.6095"></a>
+<span class="sourceLineNo">6096</span>    assertEquals(OperationStatusCode.SANITY_CHECK_FAILURE, status[1].getOperationStatusCode());<a name="line.6096"></a>
+<span class="sourceLineNo">6097</span>    assertEquals(OperationStatusCode.SUCCESS, status[2].getOperationStatusCode());<a name="line.6097"></a>
+<span class="sourceLineNo">6098</span><a name="line.6098"></a>
+<span class="sourceLineNo">6099</span><a name="line.6099"></a>
+<span class="sourceLineNo">6100</span>    // test with a row lock held for a long time<a name="line.6100"></a>
+<span class="sourceLineNo">6101</span>    final CountDownLatch obtainedRowLock = new CountDownLatch(1);<a name="line.6101"></a>
+<span class="sourceLineNo">6102</span>    ExecutorService exec = Executors.newFixedThreadPool(2);<a name="line.6102"></a>
+<span class="sourceLineNo">6103</span>    Future&lt;Void&gt; f1 = exec.submit(new Callable&lt;Void&gt;() {<a name="line.6103"></a>
+<span class="sourceLineNo">6104</span>      @Override<a name="line.6104"></a>
+<span class="sourceLineNo">6105</span>      public Void call() throws Exception {<a name="line.6105"></a>
+<span class="sourceLineNo">6106</span>        LOG.info("Acquiring row lock");<a name="line.6106"></a>
+<span class="sourceLineNo">6107</span>        RowLock rl = region.getRowLock(b);<a name="line.6107"></a>
+<span class="sourceLineNo">6108</span>        obtainedRowLock.countDown();<a name="line.6108"></a>
+<span class="sourceLineNo">6109</span>        LOG.info("Waiting for 5 seconds before releasing lock");<a name="line.6109"></a>
+<span class="sourceLineNo">6110</span>        Threads.sleep(5000);<a name="line.6110"></a>
+<span class="sourceLineNo">6111</span>        LOG.info("Releasing row lock");<a name="line.6111"></a>
+<span class="sourceLineNo">6112</span>        rl.release();<a name="line.6112"></a>
+<span class="sourceLineNo">6113</span>        return null;<a name="line.6113"></a>
+<span class="sourceLineNo">6114</span>      }<a name="line.6114"></a>
+<span class="sourceLineNo">6115</span>    });<a name="line.6115"></a>
+<span class="sourceLineNo">6116</span>    obtainedRowLock.await(30, TimeUnit.SECONDS);<a name="line.6116"></a>
+<span class="sourceLineNo">6117</span><a name="line.6117"></a>
+<span class="sourceLineNo">6118</span>    Future&lt;Void&gt; f2 = exec.submit(new Callable&lt;Void&gt;() {<a name="line.6118"></a>
+<span class="sourceLineNo">6119</span>      @Override<a name="line.6119"></a>
+<span class="sourceLineNo">6120</span>      public Void call() throws Exception {<a name="line.6120"></a>
+<span class="sourceLineNo">6121</span>        Mutation[] mutations = new Mutation[] {<a name="line.6121"></a>
+<span class="sourceLineNo">6122</span>            new Put(a).add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6122"></a>
+<span class="sourceLineNo">6123</span>                .setRow(a)<a name="line.6123"></a>
+<span class="sourceLineNo">6124</span>                .setFamily(fam1)<a name="line.6124"></a>
+<span class="sourceLineNo">6125</span>                .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6125"></a>
+<span class="sourceLineNo">6126</span>                .setType(Cell.Type.Put)<a name="line.6126"></a>
+<span class="sourceLineNo">6127</span>                .build()),<a name="line.6127"></a>
+<span class="sourceLineNo">6128</span>            new Put(b).add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6128"></a>
+<span class="sourceLineNo">6129</span>                .setRow(b)<a name="line.6129"></a>
+<span class="sourceLineNo">6130</span>                .setFamily(fam1)<a name="line.6130"></a>
+<span class="sourceLineNo">6131</span>                .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6131"></a>
+<span class="sourceLineNo">6132</span>                .setType(Cell.Type.Put)<a name="line.6132"></a>
+<span class="sourceLineNo">6133</span>                .build()),<a name="line.6133"></a>
+<span class="sourceLineNo">6134</span>        };<a name="line.6134"></a>
+<span class="sourceLineNo">6135</span><a name="line.6135"></a>
+<span class="sourceLineNo">6136</span>        // this will wait for the row lock, and it will eventually succeed<a name="line.6136"></a>
+<span class="sourceLineNo">6137</span>        OperationStatus[] status = region.batchMutate(mutations);<a name="line.6137"></a>
+<span class="sourceLineNo">6138</span>        assertEquals(OperationStatusCode.SUCCESS, status[0].getOperationStatusCode());<a name="line.6138"></a>
+<span class="sourceLineNo">6139</span>        assertEquals(OperationStatusCode.SUCCESS, status[1].getOperationStatusCode());<a name="line.6139"></a>
+<span class="sourceLineNo">6140</span>        return null;<a name="line.6140"></a>
+<span class="sourceLineNo">6141</span>      }<a name="line.6141"></a>
+<span class="sourceLineNo">6142</span>    });<a name="line.6142"></a>
+<span class="sourceLineNo">6143</span><a name="line.6143"></a>
+<span class="sourceLineNo">6144</span>    f1.get();<a name="line.6144"></a>
+<span class="sourceLineNo">6145</span>    f2.get();<a name="line.6145"></a>
+<span class="sourceLineNo">6146</span><a name="line.6146"></a>
+<span class="sourceLineNo">6147</span>    CONF.setInt("hbase.rowlock.wait.duration", prevLockTimeout);<a name="line.6147"></a>
+<span class="sourceLineNo">6148</span>  }<a name="line.6148"></a>
+<span class="sourceLineNo">6149</span><a name="line.6149"></a>
+<span class="sourceLineNo">6150</span>  @Test<a name="line.6150"></a>
+<span class="sourceLineNo">6151</span>  public void testCheckAndRowMutateTimestampsAreMonotonic() throws IOException {<a name="line.6151"></a>
+<span class="sourceLineNo">6152</span>    region = initHRegion(tableName, method, CONF, fam1);<a name="line.6152"></a>
+<span class="sourceLineNo">6153</span>    ManualEnvironmentEdge edge = new ManualEnvironmentEdge();<a name="line.6153"></a>
+<span class="sourceLineNo">6154</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.6154"></a>
+<span class="sourceLineNo">6155</span><a name="line.6155"></a>
+<span class="sourceLineNo">6156</span>    edge.setValue(10);<a name="line.6156"></a>
+<span class="sourceLineNo">6157</span>    Put p = new Put(row);<a name="line.6157"></a>
+<span class="sourceLineNo">6158</span>    p.setDurability(Durability.SKIP_WAL);<a name="line.6158"></a>
+<span class="sourceLineNo">6159</span>    p.addColumn(fam1, qual1, qual1);<a name="line.6159"></a>
+<span class="sourceLineNo">6160</span>    region.put(p);<a name="line.6160"></a>
+<span class="sourceLineNo">6161</span><a name="line.6161"></a>
+<span class="sourceLineNo">6162</span>    Result result = region.get(new Get(row));<a name="line.6162"></a>
+<span class="sourceLineNo">6163</span>    Cell c = result.getColumnLatestCell(fam1, qual1);<a name="line.6163"></a>
+<span class="sourceLineNo">6164</span>    assertNotNull(c);<a name="line.6164"></a>
+<span class="sourceLineNo">6165</span>    assertEquals(10L, c.getTimestamp());<a name="line.6165"></a>
+<span class="sourceLineNo">6166</span><a name="line.6166"></a>
+<span class="sourceLineNo">6167</span>    edge.setValue(1); // clock goes back<a name="line.6167"></a>
+<span class="sourceLineNo">6168</span>    p = new Put(row);<a name="line.6168"></a>
+<span class="sourceLineNo">6169</span>    p.setDurability(Durability.SKIP_WAL);<a name="line.6169"></a>
+<span class="sourceLineNo">6170</span>    p.addColumn(fam1, qual1, qual2);<a name="line.6170"></a>
+<span class="sourceLineNo">6171</span>    RowMutations rm = new RowMutations(row);<a name="line.6171"></a>
+<span class="sourceLineNo">6172</span>    rm.add(p);<a name="line.6172"></a>
+<span class="sourceLineNo">6173</span>    assertTrue(region.checkAndRowMutate(row, fam1, qual1, CompareOperator.EQUAL,<a name="line.6173"></a>
+<span class="sourceLineNo">6174</span>        new BinaryComparator(qual1), rm));<a name="line.6174"></a>
+<span class="sourceLineNo">6175</span>    result = region.get(new Get(row));<a name="line.6175"></a>
+<span class="sourceLineNo">6176</span>    c = result.getColumnLatestCell(fam1, qual1);<a name="line.6176"></a>
+<span class="sourceLineNo">6177</span>    assertEquals(10L, c.getTimestamp());<a name="line.6177"></a>
+<span class="sourceLineNo">6178</span>    LOG.info("c value " +<a name="line.6178"></a>
+<span class="sourceLineNo">6179</span>      Bytes.toStringBinary(c.getValueArray(), c.getValueOffset(), c.getValueLength()));<a name="line.6179"></a>
 <span class="sourceLineNo">6180</span><a name="line.6180"></a>
-<span class="sourceLineNo">6181</span>  /**<a name="line.6181"></a>
-<span class="sourceLineNo">6182</span>   * HBASE-16429 Make sure no stuck if roll writer when ring buffer is filled with appends<a name="line.6182"></a>
-<span class="sourceLineNo">6183</span>   * @throws IOException if IO error occurred during test<a name="line.6183"></a>
-<span class="sourceLineNo">6184</span>   */<a name="line.6184"></a>
-<span class="sourceLineNo">6185</span>  @Test<a name="line.6185"></a>
-<span class="sourceLineNo">6186</span>  public void testWritesWhileRollWriter() throws IOException {<a name="line.6186"></a>
-<span class="sourceLineNo">6187</span>    int testCount = 10;<a name="line.6187"></a>
-<span class="sourceLineNo">6188</span>    int numRows = 1024;<a name="line.6188"></a>
-<span class="sourceLineNo">6189</span>    int numFamilies = 2;<a name="line.6189"></a>
-<span class="sourceLineNo">6190</span>    int numQualifiers = 2;<a name="line.6190"></a>
-<span class="sourceLineNo">6191</span>    final byte[][] families = new byte[numFamilies][];<a name="line.6191"></a>
-<span class="sourceLineNo">6192</span>    for (int i = 0; i &lt; numFamilies; i++) {<a name="line.6192"></a>
-<span class="sourceLineNo">6193</span>      families[i] = Bytes.toBytes("family" + i);<a name="line.6193"></a>
-<span class="sourceLineNo">6194</span>    }<a name="line.6194"></a>
-<span class="sourceLineNo">6195</span>    final byte[][] qualifiers = new byte[numQualifiers][];<a name="line.6195"></a>
-<span class="sourceLineNo">6196</span>    for (int i = 0; i &lt; numQualifiers; i++) {<a name="line.6196"></a>
-<span class="sourceLineNo">6197</span>      qualifiers[i] = Bytes.toBytes("qual" + i);<a name="line.6197"></a>
-<span class="sourceLineNo">6198</span>    }<a name="line.6198"></a>
-<span class="sourceLineNo">6199</span><a name="line.6199"></a>
-<span class="sourceLineNo">6200</span>    CONF.setInt("hbase.regionserver.wal.disruptor.event.count", 2);<a name="line.6200"></a>
-<span class="sourceLineNo">6201</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.6201"></a>
-<span class="sourceLineNo">6202</span>    try {<a name="line.6202"></a>
-<span class="sourceLineNo">6203</span>      List&lt;Thread&gt; threads = new ArrayList&lt;&gt;();<a name="line.6203"></a>
-<span class="sourceLineNo">6204</span>      for (int i = 0; i &lt; numRows; i++) {<a name="line.6204"></a>
-<span class="sourceLineNo">6205</span>        final int count = i;<a name="line.6205"></a>
-<span class="sourceLineNo">6206</span>        Thread t = new Thread(new Runnable() {<a name="line.6206"></a>
-<span class="sourceLineNo">6207</span><a name="line.6207"></a>
-<span class="sourceLineNo">6208</span>          @Override<a name="line.6208"></a>
-<span class="sourceLineNo">6209</span>          public void run() {<a name="line.6209"></a>
-<span class="sourceLineNo">6210</span>            byte[] row = Bytes.toBytes("row" + count);<a name="line.6210"></a>
-<span class="sourceLineNo">6211</span>            Put put = new Put(row);<a name="line.6211"></a>
-<span class="sourceLineNo">6212</span>            put.setDurability(Durability.SYNC_WAL);<a name="line.6212"></a>
-<span class="sourceLineNo">6213</span>            byte[] value = Bytes.toBytes(String.valueOf(count));<a name="line.6213"></a>
-<span class="sourceLineNo">6214</span>            for (byte[] family : families) {<a name="line.6214"></a>
-<span class="sourceLineNo">6215</span>              for (byte[] qualifier : qualifiers) {<a name="line.6215"></a>
-<span class="sourceLineNo">6216</span>                put.addColumn(family, qualifier, count, value);<a name="line.6216"></a>
-<span class="sourceLineNo">6217</span>              }<a name="line.6217"></a>
-<span class="sourceLineNo">6218</span>            }<a name="line.6218"></a>
-<span class="sourceLineNo">6219</span>            try {<a name="line.6219"></a>
-<span class="sourceLineNo">6220</span>              region.put(put);<a name="line.6220"></a>
-<span class="sourceLineNo">6221</span>            } catch (IOException e) {<a name="line.6221"></a>
-<span class="sourceLineNo">6222</span>              throw new RuntimeException(e);<a name="line.6222"></a>
-<span class="sourceLineNo">6223</span>            }<a name="line.6223"></a>
-<span class="sourceLineNo">6224</span>          }<a name="line.6224"></a>
-<span class="sourceLineNo">6225</span>        });<a name="line.6225"></a>
-<span class="sourceLineNo">6226</span>        threads.add(t);<a name="line.6226"></a>
-<span class="sourceLineNo">6227</span>      }<a name="line.6227"></a>
-<span class="sourceLineNo">6228</span>      for (Thread t : threads) {<a name="line.6228"></a>
-<span class="sourceLineNo">6229</span>        t.start();<a name="line.6229"></a>
-<span class="sourceLineNo">6230</span>      }<a name="line.6230"></a>
-<span class="sourceLineNo">6231</span><a name="line.6231"></a>
-<span class="sourceLineNo">6232</span>      for (int i = 0; i &lt; testCount; i++) {<a name="line.6232"></a>
-<span class="sourceLineNo">6233</span>        region.getWAL().rollWriter();<a name="line.6233"></a>
-<span class="sourceLineNo">6234</span>        Thread.yield();<a name="line.6234"></a>
-<span class="sourceLineNo">6235</span>      }<a name="line.6235"></a>
-<span class="sourceLineNo">6236</span>    } finally {<a name="line.6236"></a>
-<span class="sourceLineNo">6237</span>      try {<a name="line.6237"></a>
-<span class="sourceLineNo">6238</span>        HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.6238"></a>
-<span class="sourceLineNo">6239</span>        CONF.setInt("hbase.regionserver.wal.disruptor.event.count", 16 * 1024);<a name="line.6239"></a>
-<span class="sourceLineNo">6240</span>      } catch (DroppedSnapshotException dse) {<a name="line.6240"></a>
-<span class="sourceLineNo">6241</span>        // We could get this on way out because we interrupt the background flusher and it could<a name="line.6241"></a>
-<span class="sourceLineNo">6242</span>        // fail anywhere causing a DSE over in the background flusher... only it is not properly<a name="line.6242"></a>
-<span class="sourceLineNo">6243</span>        // dealt with so could still be memory hanging out when we get to here -- memory we can't<a name="line.6243"></a>
-<span class="sourceLineNo">6244</span>        // flush because the accounting is 'off' since original DSE.<a name="line.6244"></a>
+<span class="sourceLineNo">6181</span>    assertTrue(Bytes.equals(c.getValueArray(), c.getValueOffset(), c.getValueLength(),<a name="line.6181"></a>
+<span class="sourceLineNo">6182</span>      qual2, 0, qual2.length));<a name="line.6182"></a>
+<span class="sourceLineNo">6183</span>  }<a name="line.6183"></a>
+<span class="sourceLineNo">6184</span><a name="line.6184"></a>
+<span class="sourceLineNo">6185</span>  HRegion initHRegion(TableName tableName, String callingMethod,<a name="line.6185"></a>
+<span class="sourceLineNo">6186</span>      byte[]... families) throws IOException {<a name="line.6186"></a>
+<span class="sourceLineNo">6187</span>    return initHRegion(tableName, callingMethod, HBaseConfiguration.create(),<a name="line.6187"></a>
+<span class="sourceLineNo">6188</span>        families);<a name="line.6188"></a>
+<span class="sourceLineNo">6189</span>  }<a name="line.6189"></a>
+<span class="sourceLineNo">6190</span><a name="line.6190"></a>
+<span class="sourceLineNo">6191</span>  /**<a name="line.6191"></a>
+<span class="sourceLineNo">6192</span>   * HBASE-16429 Make sure no stuck if roll writer when ring buffer is filled with appends<a name="line.6192"></a>
+<span class="sourceLineNo">6193</span>   * @throws IOException if IO error occurred during test<a name="line.6193"></a>
+<span class="sourceLineNo">6194</span>   */<a name="line.6194"></a>
+<span class="sourceLineNo">6195</span>  @Test<a name="line.6195"></a>
+<span class="sourceLineNo">6196</span>  public void testWritesWhileRollWriter() throws IOException {<a name="line.6196"></a>
+<span class="sourceLineNo">6197</span>    int testCount = 10;<a name="line.6197"></a>
+<span class="sourceLineNo">6198</span>    int numRows = 1024;<a name="line.6198"></a>
+<span class="sourceLineNo">6199</span>    int numFamilies = 2;<a name="line.6199"></a>
+<span class="sourceLineNo">6200</span>    int numQualifiers = 2;<a name="line.6200"></a>
+<span class="sourceLineNo">6201</span>    final byte[][] families = new byte[numFamilies][];<a name="line.6201"></a>
+<span class="sourceLineNo">6202</span>    for (int i = 0; i &lt; numFamilies; i++) {<a name="line.6202"></a>
+<span class="sourceLineNo">6203</span>      families[i] = Bytes.toBytes("family" + i);<a name="line.6203"></a>
+<span class="sourceLineNo">6204</span>    }<a name="line.6204"></a>
+<span class="sourceLineNo">6205</span>    final byte[][] qualifiers = new byte[numQualifiers][];<a name="line.6205"></a>
+<span class="sourceLineNo">6206</span>    for (int i = 0; i &lt; numQualifiers; i++) {<a name="line.6206"></a>
+<span class="sourceLineNo">6207</span>      qualifiers[i] = Bytes.toBytes("qual" + i);<a name="line.6207"></a>
+<span class="sourceLineNo">6208</span>    }<a name="line.6208"></a>
+<span class="sourceLineNo">6209</span><a name="line.6209"></a>
+<span class="sourceLineNo">6210</span>    CONF.setInt("hbase.regionserver.wal.disruptor.event.count", 2);<a name="line.6210"></a>
+<span class="sourceLineNo">6211</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.6211"></a>
+<span class="sourceLineNo">6212</span>    try {<a name="line.6212"></a>
+<span class="sourceLineNo">6213</span>      List&lt;Thread&gt; threads = new ArrayList&lt;&gt;();<a name="line.6213"></a>
+<span class="sourceLineNo">6214</span>      for (int i = 0; i &lt; numRows; i++) {<a name="line.6214"></a>
+<span class="sourceLineNo">6215</span>        final int count = i;<a name="line.6215"></a>
+<span class="sourceLineNo">6216</span>        Thread t = new Thread(new Runnable() {<a name="line.6216"></a>
+<span class="sourceLineNo">6217</span><a name="line.6217"></a>
+<span class="sourceLineNo">6218</span>          @Override<a name="line.6218"></a>
+<span class="sourceLineNo">6219</span>          public void run() {<a name="line.6219"></a>
+<span class="sourceLineNo">6220</span>            byte[] row = Bytes.toBytes("row" + count);<a name="line.6220"></a>
+<span class="sourceLineNo">6221</span>            Put put = new Put(row);<a name="line.6221"></a>
+<span class="sourceLineNo">6222</span>            put.setDurability(Durability.SYNC_WAL);<a name="line.6222"></a>
+<span class="sourceLineNo">6223</span>            byte[] value = Bytes.toBytes(String.valueOf(count));<a name="line.6223"></a>
+<span class="sourceLineNo">6224</span>            for (byte[] family : families) {<a name="line.6224"></a>
+<span class="sourceLineNo">6225</span>              for (byte[] qualifier : qualifiers) {<a name="line.6225"></a>
+<span class="sourceLineNo">6226</span>                put.addColumn(family, qualifier, count, value);<a name="line.6226"></a>
+<span class="sourceLineNo">6227</span>              }<a name="line.6227"></a>
+<span class="sourceLineNo">6228</span>            }<a name="line.6228"></a>
+<span class="sourceLineNo">6229</span>            try {<a name="line.6229"></a>
+<span class="sourceLineNo">6230</span>              region.put(put);<a name="line.6230"></a>
+<span class="sourceLineNo">6231</span>            } catch (IOException e) {<a name="line.6231"></a>
+<span class="sourceLineNo">6232</span>              throw new RuntimeException(e);<a name="line.6232"></a>
+<span class="sourceLineNo">6233</span>            }<a name="line.6233"></a>
+<span class="sourceLineNo">6234</span>          }<a name="line.6234"></a>
+<span class="sourceLineNo">6235</span>        });<a name="line.6235"></a>
+<span class="sourceLineNo">6236</span>        threads.add(t);<a name="line.6236"></a>
+<span class="sourceLineNo">6237</span>      }<a name="line.6237"></a>
+<span class="sourceLineNo">6238</span>      for (Thread t : threads) {<a name="line.6238"></a>
+<span class="sourceLineNo">6239</span>        t.start();<a name="line.6239"></a>
+<span class="sourceLineNo">6240</span>      }<a name="line.6240"></a>
+<span class="sourceLineNo">6241</span><a name="line.6241"></a>
+<span class="sourceLineNo">6242</span>      for (int i = 0; i &lt; testCount; i++) {<a name="line.6242"></a>
+<span class="sourceLineNo">6243</span>        region.getWAL().rollWriter();<a name="line.6243"></a>
+<span class="sourceLineNo">6244</span>        Thread.yield();<a name="line.6244"></a>
 <span class="sourceLineNo">6245</span>      }<a name="line.6245"></a>
-<span class="sourceLineNo">6246</span>      this.region = null;<a name="line.6246"></a>
-<span class="sourceLineNo">6247</span>    }<a name="line.6247"></a>
-<span class="sourceLineNo">6248</span>  }<a name="line.6248"></a>
-<span class="sourceLineNo">6249</span><a name="line.6249"></a>
-<span class="sourceLineNo">6250</span>  @Test<a name="line.6250"></a>
-<span class="sourceLineNo">6251</span>  public void testMutateRow_WriteRequestCount() throws Exception {<a name="line.6251"></a>
-<span class="sourceLineNo">6252</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.6252"></a>
-<span class="sourceLineNo">6253</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.6253"></a>
-<span class="sourceLineNo">6254</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.6254"></a>
-<span class="sourceLineNo">6255</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.6255"></a>
-<span class="sourceLineNo">6256</span><a name="line.6256"></a>
-<span class="sourceLineNo">6257</span>    RowMutations rm = new RowMutations(row1);<a name="line.6257"></a>
-<span class="sourceLineNo">6258</span>    Put put = new Put(row1);<a name="line.6258"></a>
-<span class="sourceLineNo">6259</span>    put.addColumn(fam1, qf1, val1);<a name="line.6259"></a>
-<span class="sourceLineNo">6260</span>    rm.add(put);<a name="line.6260"></a>
-<span class="sourceLineNo">6261</span><a name="line.6261"></a>
-<span class="sourceLineNo">6262</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.6262"></a>
-<span class="sourceLineNo">6263</span>    long wrcBeforeMutate = this.region.writeRequestsCount.longValue();<a name="line.6263"></a>
-<span class="sourceLineNo">6264</span>    this.region.mutateRow(rm);<a name="line.6264"></a>
-<span class="sourceLineNo">6265</span>    long wrcAfterMutate = this.region.writeRequestsCount.longValue();<a name="line.6265"></a>
-<span class="sourceLineNo">6266</span>    Assert.assertEquals(wrcBeforeMutate + rm.getMutations().size(), wrcAfterMutate);<a name="line.6266"></a>
-<span class="sourceLineNo">6267</span>  }<a name="line.6267"></a>
-<span class="sourceLineNo">6268</span><a name="line.6268"></a>
-<span class="sourceLineNo">6269</span>  @Test<a name="line.6269"></a>
-<span class="sourceLineNo">6270</span>  public void testBulkLoadReplicationEnabled() throws IOException {<a name="line.6270"></a>
-<span class="sourceLineNo">6271</span>    TEST_UTIL.getConfiguration().setBoolean(HConstants.REPLICATION_BULKLOAD_ENABLE_KEY, true);<a name="line.6271"></a>
-<span class="sourceLineNo">6272</span>    final ServerName serverName = ServerName.valueOf(name.getMethodName(), 100, 42);<a name="line.6272"></a>
-<span class="sourceLineNo">6273</span>    final RegionServerServices rss = spy(TEST_UTIL.createMockRegionServerService(serverName));<a name="line.6273"></a>
-<span class="sourceLineNo">6274</span><a name="line.6274"></a>
-<span class="sourceLineNo">6275</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.6275"></a>
-<span class="sourceLineNo">6276</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.6276"></a>
-<span class="sourceLineNo">6277</span>    HRegionInfo hri = new HRegionInfo(htd.getTableName(),<a name="line.6277"></a>
-<span class="sourceLineNo">6278</span>        HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY);<a name="line.6278"></a>
-<span class="sourceLineNo">6279</span>    region = HRegion.openHRegion(hri, htd, rss.getWAL(hri), TEST_UTIL.getConfiguration(),<a name="line.6279"></a>
-<span class="sourceLineNo">6280</span>        rss, null);<a name="line.6280"></a>
-<span class="sourceLineNo">6281</span><a name="line.6281"></a>
-<span class="sourceLineNo">6282</span>    assertTrue(region.conf.getBoolean(HConstants.REPLICATION_BULKLOAD_ENABLE_KEY, false));<a name="line.6282"></a>
-<span class="sourceLineNo">6283</span>    String plugins = region.conf.get(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY, "");<a name="line.6283"></a>
-<span class="sourceLineNo">6284</span>    String replicationCoprocessorClass = ReplicationObserver.class.getCanonicalName();<a name="line.6284"></a>
-<span class="sourceLineNo">6285</span>    assertTrue(plugins.contains(replicationCoprocessorClass));<a name="line.6285"></a>
-<span class="sourceLineNo">6286</span>    assertTrue(region.getCoprocessorHost().<a name="line.6286"></a>
-<span class="sourceLineNo">6287</span>        getCoprocessors().contains(ReplicationObserver.class.getSimpleName()));<a name="line.6287"></a>
-<span class="sourceLineNo">6288</span>  }<a name="line.6288"></a>
-<span class="sourceLineNo">6289</span><a name="line.6289"></a>
-<span class="sourceLineNo">6290</span>  // make sure region is success close when coprocessor wrong region open failed<a name="line.6290"></a>
-<span class="sourceLineNo">6291</span>  @Test<a name="line.6291"></a>
-<span class="sourceLineNo">6292</span>  public void testOpenRegionFailedMemoryLeak() throws Exception {<a name="line.6292"></a>
-<span class="sourceLineNo">6293</span>    final ServerName serverName = ServerName.valueOf("testOpenRegionFailed", 100, 42);<a name="line.6293"></a>
-<span class="sourceLineNo">6294</span>    final RegionServerServices rss = spy(TEST_UTIL.createMockRegionServerService(serverName));<a name="line.6294"></a>
-<span class="sourceLineNo">6295</span><a name="line.6295"></a>
-<span class="sourceLineNo">6296</span>    HTableDescriptor htd<a name="line.6296"></a>
-<span class="sourceLineNo">6297</span>      = new HTableDescriptor(TableName.valueOf("testOpenRegionFailed"));<a name="line.6297"></a>
-<span class="sourceLineNo">6298</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.6298"></a>
-<span class="sourceLineNo">6299</span>    htd.setValue("COPROCESSOR$1", "hdfs://test/test.jar|test||");<a name="line.6299"></a>
-<span class="sourceLineNo">6300</span><a name="line.6300"></a>
-<span class="sourceLineNo">6301</span>    HRegionInfo hri = new HRegionInfo(htd.getTableName(),<a name="line.6301"></a>
-<span class="sourceLineNo">6302</span>      HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY);<a name="line.6302"></a>
-<span class="sourceLineNo">6303</span>    ScheduledExecutorService executor = CompatibilitySingletonFactory.<a name="line.6303"></a>
-<span class="sourceLineNo">6304</span>      getInstance(MetricsExecutor.class).getExecutor();<a name="line.6304"></a>
-<span class="sourceLineNo">6305</span>    for (int i = 0; i &lt; 20 ; i++) {<a name="line.6305"></a>
-<span class="sourceLineNo">6306</span>      try {<a name="line.6306"></a>
-<span class="sourceLineNo">6307</span>        HRegion.openHRegion(hri, htd, rss.getWAL(hri),<a name="line.6307"></a>
-<span class="sourceLineNo">6308</span>          TEST_UTIL.getConfiguration(), rss, null);<a name="line.6308"></a>
-<span class="sourceLineNo">6309</span>      }catch(Throwable t){<a name="line.6309"></a>
-<span class="sourceLineNo">6310</span>        LOG.info("Expected exception, continue");<a name="line.6310"></a>
-<span class="sourceLineNo">6311</span>      }<a name="line.6311"></a>
-<span class="sourceLineNo">6312</span>    }<a name="line.6312"></a>
-<span class="sourceLineNo">6313</span>    TimeUnit.SECONDS.sleep(MetricsRegionWrapperImpl.PERIOD);<a name="line.6313"></a>
-<span class="sourceLineNo">6314</span>    Field[] fields = ThreadPoolExecutor.class.getDeclaredFields();<a name="line.6314"></a>
-<span class="sourceLineNo">6315</span>    boolean found = false;<a name="line.6315"></a>
-<span class="sourceLineNo">6316</span>    for(Field field : fields){<a name="line.6316"></a>
-<span class="sourceLineNo">6317</span>      if(field.getName().equals("workQueue")){<a name="line.6317"></a>
-<span class="sourceLineNo">6318</span>        field.setAccessible(true);<a name="line.6318"></a>
-<span class="sourceLineNo">6319</span>        BlockingQueue&lt;Runnable&gt; workQueue = (BlockingQueue&lt;Runnable&gt;)field.get(executor);<a name="line.6319"></a>
-<span class="sourceLineNo">6320</span>        //there are still two task not cancel, can not cause to memory lack<a name="line.6320"></a>
-<span class="sourceLineNo">6321</span>        Assert.assertTrue("ScheduledExecutor#workQueue should equals 2, now is " +<a name="line.6321"></a>
-<span class="sourceLineNo">6322</span>          workQueue.size() + ", please check region is close", 2 == workQueue.size());<a name="line.6322"></a>
-<span class="sourceLineNo">6323</span>        found = true;<a name="line.6323"></a>
-<span class="sourceLineNo">6324</span>      }<a name="line.6324"></a>
-<span class="sourceLineNo">6325</span>    }<a name="line.6325"></a>
-<span class="sourceLineNo">6326</span>    Assert.assertTrue("can not find workQueue, test failed", found);<a name="line.6326"></a>
-<span class="sourceLineNo">6327</span>  }<a name="line.6327"></a>
-<span class="sourceLineNo">6328</span><a name="line.6328"></a>
-<span class="sourceLineNo">6329</span>  /**<a name="line.6329"></a>
-<span class="sourceLineNo">6330</span>   * The same as HRegion class, the only difference is that instantiateHStore will<a name="line.6330"></a>
-<span class="sourceLineNo">6331</span>   * create a different HStore - HStoreForTesting. [HBASE-8518]<a name="line.6331"></a>
-<span class="sourceLineNo">6332</span>   */<a name="line.6332"></a>
-<span class="sourceLineNo">6333</span>  public static class HRegionForTesting extends HRegion {<a name="line.6333"></a>
-<span class="sourceLineNo">6334</span><a name="line.6334"></a>
-<span class="sourceLineNo">6335</span>    public HRegionForTesting(final Path tableDir, final WAL wal, final FileSystem fs,<a name="line.6335"></a>
-<span class="sourceLineNo">6336</span>                             final Configuration confParam, final RegionInfo regionInfo,<a name="line.6336"></a>
-<span class="sourceLineNo">6337</span>                             final TableDescriptor htd, final RegionServerServices rsServices) {<a name="line.6337"></a>
-<span class="sourceLineNo">6338</span>      this(new HRegionFileSystem(confParam, fs, tableDir, regionInfo),<a name="line.6338"></a>
-<span class="sourceLineNo">6339</span>          wal, confParam, htd, rsServices);<a name="line.6339"></a>
-<span class="sourceLineNo">6340</span>    }<a name="line.6340"></a>
-<span class="sourceLineNo">6341</span><a name="line.6341"></a>
-<span class="sourceLineNo">6342</span>    public HRegionForTesting(HRegionFileSystem fs, WAL wal,<a name="line.6342"></a>
-<span class="sourceLineNo">6343</span>                             Configuration confParam, TableDescriptor htd,<a name="line.6343"></a>
-<span class="sourceLineNo">6344</span>                             RegionServerServices rsServices) {<a name="line.6344"></a>
-<span class="sourceLineNo">6345</span>      super(fs, wal, confParam, htd, rsServices);<a name="line.6345"></a>
-<span class="sourceLineNo">6346</span>    }<a name="line.6346"></a>
-<span class="sourceLineNo">6347</span><a name="line.6347"></a>
-<span class="sourceLineNo">6348</span>    /**<a name="line.6348"></a>
-<span class="sourceLineNo">6349</span>     * Create HStore instance.<a name="line.6349"></a>
-<span class="sourceLineNo">6350</span>     * @return If Mob is enabled, return HMobStore, otherwise return HStoreForTesting.<a name="line.6350"></a>
-<span class="sourceLineNo">6351</span>     */<a name="line.6351"></a>
-<span class="sourceLineNo">6352</span>    @Override<a name="line.6352"></a>
-<span class="sourceLineNo">6353</span>    protected HStore instantiateHStore(final ColumnFamilyDescriptor family, boolean warmup)<a name="line.6353"></a>
-<span class="sourceLineNo">6354</span>        throws IOException {<a name="line.6354"></a>
-<span class="sourceLineNo">6355</span>      if (family.isMobEnabled()) {<a name="line.6355"></a>
-<span class="sourceLineNo">6356</span>        if (HFile.getFormatVersion(this.conf) &lt; HFile.MIN_FORMAT_VERSION_WITH_TAGS) {<a name="line.6356"></a>
-<span class="sourceLineNo">6357</span>          throw new IOException("A minimum HFile version of " + HFile.MIN_FORMAT_VERSION_WITH_TAGS +<a name="line.6357"></a>
-<span class="sourceLineNo">6358</span>              " is required for MOB feature. Consider setting " + HFile.FORMAT_VERSION_KEY +<a name="line.6358"></a>
-<span class="sourceLineNo">6359</span>              " accordingly.");<a name="line.6359"></a>
-<span class="sourceLineNo">6360</span>        }<a name="line.6360"></a>
-<span class="sourceLineNo">6361</span>        return new HMobStore(this, family, this.conf, warmup);<a name="line.6361"></a>
-<span class="sourceLineNo">6362</span>      }<a name="line.6362"></a>
-<span class="sourceLineNo">6363</span>      return new HStoreForTesting(this, family, this.conf, warmup);<a name="line.6363"></a>
-<span class="sourceLineNo">6364</span>    }<a name="line.6364"></a>
-<span class="sourceLineNo">6365</span>  }<a name="line.6365"></a>
-<span class="sourceLineNo">6366</span><a name="line.6366"></a>
-<span class="sourceLineNo">6367</span>  /**<a name="line.6367"></a>
-<span class="sourceLineNo">6368</span>   * HStoreForTesting is merely the same as HStore, the difference is in the doCompaction method<a name="line.6368"></a>
-<span class="sourceLineNo">6369</span>   * of HStoreForTesting there is a checkpoint "hbase.hstore.compaction.complete" which<a name="line.6369"></a>
-<span class="sourceLineNo">6370</span>   * doesn't let hstore compaction complete. In the former edition, this config is set in<a name="line.6370"></a>
-<span class="sourceLineNo">6371</span>   * HStore class inside compact method, though this is just for testing, otherwise it<a name="line.6371"></a>
-<span class="sourceLineNo">6372</span>   * doesn't do any help. In HBASE-8518, we try to get rid of all "hbase.hstore.compaction.complete"<a name="line.6372"></a>
-<span class="sourceLineNo">6373</span>   * config (except for testing code).<a name="line.6373"></a>
-<span class="sourceLineNo">6374</span>   */<a name="line.6374"></a>
-<span class="sourceLineNo">6375</span>  public static class HStoreForTesting extends HStore {<a name="line.6375"></a>
+<span class="sourceLineNo">6246</span>    } finally {<a name="line.6246"></a>
+<span class="sourceLineNo">6247</span>      try {<a name="line.6247"></a>
+<span class="sourceLineNo">6248</span>        HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.6248"></a>
+<span class="sourceLineNo">6249</span>        CONF.setInt("hbase.regionserver.wal.disruptor.event.count", 16 * 1024);<a name="line.6249"></a>
+<span class="sourceLineNo">6250</span>      } catch (DroppedSnapshotException dse) {<a name="line.6250"></a>
+<span class="sourceLineNo">6251</span>        // We could get this on way out because we interrupt the background flusher and it could<a name="line.6251"></a>
+<span class="sourceLineNo">6252</span>        // fail anywhere causing a DSE over in the background flusher... only it is not properly<a name="line.6252"></a>
+<span class="sourceLineNo">6253</span>        // dealt with so could still be memory hanging out when we get to here -- memory we can't<a name="line.6253"></a>
+<span class="sourceLineNo">6254</span>        // flush because the accounting is 'off' since original DSE.<a name="line.6254"></a>
+<span class="sourceLineNo">6255</span>      }<a name="line.6255"></a>
+<span class="sourceLineNo">6256</span>      this.region = null;<a name="line.6256"></a>
+<span class="sourceLineNo">6257</span>    }<a name="line.6257"></a>
+<span class="sourceLineNo">6258</span>  }<a name="line.6258"></a>
+<span class="sourceLineNo">6259</span><a name="line.6259"></a>
+<span class="sourceLineNo">6260</span>  @Test<a name="line.6260"></a>
+<span class="sourceLineNo">6261</span>  public void testMutateRow_WriteRequestCount() throws Exception {<a name="line.6261"></a>
+<span class="sourceLineNo">6262</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.6262"></a>
+<span class="sourceLineNo">6263</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.6263"></a>
+<span class="sourceLineNo">6264</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.6264"></a>
+<span class="sourceLineNo">6265</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.6265"></a>
+<span class="sourceLineNo">6266</span><a name="line.6266"></a>
+<span class="sourceLineNo">6267</span>    RowMutations rm = new RowMutations(row1);<a name="line.6267"></a>
+<span class="sourceLineNo">6268</span>    Put put = new Put(row1);<a name="line.6268"></a>
+<span class="sourceLineNo">6269</span>    put.addColumn(fam1, qf1, val1);<a name="line.6269"></a>
+<span class="sourceLineNo">6270</span>    rm.add(put);<a name="line.6270"></a>
+<span class="sourceLineNo">6271</span><a name="line.6271"></a>
+<span class="sourceLineNo">6272</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.6272"></a>
+<span class="sourceLineNo">6273</span>    long wrcBeforeMutate = this.region.writeRequestsCount.longValue();<a name="line.6273"></a>
+<span class="sourceLineNo">6274</span>    this.region.mutateRow(rm);<a name="line.6274"></a>
+<span class="sourceLineNo">6275</span>    long wrcAfterMutate = this.region.writeRequestsCount.longValue();<a name="line.6275"></a>
+<span class="sourceLineNo">6276</span>    Assert.assertEquals(wrcBeforeMutate + rm.getMutations().size(), wrcAfterMutate);<a name="line.6276"></a>
+<span class="sourceLineNo">6277</span>  }<a name="line.6277"></a>
+<span class="sourceLineNo">6278</span><a name="line.6278"></a>
+<span class="sourceLineNo">6279</span>  @Test<a name="line.6279"></a>
+<span class="sourceLineNo">6280</span>  public void testBulkLoadReplicationEnabled() throws IOException {<a name="line.6280"></a>
+<span class="sourceLineNo">6281</span>    TEST_UTIL.getConfiguration().setBoolean(HConstants.REPLICATION_BULKLOAD_ENABLE_KEY, true);<a name="line.6281"></a>
+<span class="sourceLineNo">6282</span>    final ServerName serverName = ServerName.valueOf(name.getMethodName(), 100, 42);<a name="line.6282"></a>
+<span class="sourceLineNo">6283</span>    final RegionServerServices rss = spy(TEST_UTIL.createMockRegionServerService(serverName));<a name="line.6283"></a>
+<span class="sourceLineNo">6284</span><a name="line.6284"></a>
+<span class="sourceLineNo">6285</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.6285"></a>
+<span class="sourceLineNo">6286</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.6286"></a>
+<span class="sourceLineNo">6287</span>    HRegionInfo hri = new HRegionInfo(htd.getTableName(),<a name="line.6287"></a>
+<span class="sourceLineNo">6288</span>        HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY);<a name="line.6288"></a>
+<span class="sourceLineNo">6289</span>    region = HRegion.openHRegion(hri, htd, rss.getWAL(hri), TEST_UTIL.getConfiguration(),<a name="line.6289"></a>
+<span class="sourceLineNo">6290</span>        rss, null);<a name="line.6290"></a>
+<span class="sourceLineNo">6291</span><a name="line.6291"></a>
+<span class="sourceLineNo">6292</span>    assertTrue(region.conf.getBoolean(HConstants.REPLICATION_BULKLOAD_ENABLE_KEY, false));<a name="line.6292"></a>
+<span class="sourceLineNo">6293</span>    String plugins = region.conf.get(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY, "");<a name="line.6293"></a>
+<span class="sourceLineNo">6294</span>    String replicationCoprocessorClass = ReplicationObserver.class.getCanonicalName();<a name="line.6294"></a>
+<span class="sourceLineNo">6295</span>    assertTrue(plugins.contains(replicationCoprocessorClass));<a name="line.6295"></a>
+<span class="sourceLineNo">6296</span>    assertTrue(region.getCoprocessorHost().<a name="line.6296"></a>
+<span class="sourceLineNo">6297</span>        getCoprocessors().contains(ReplicationObserver.class.getSimpleName()));<a name="line.6297"></a>
+<span class="sourceLineNo">6298</span>  }<a name="line.6298"></a>
+<span class="sourceLineNo">6299</span><a name="line.6299"></a>
+<span class="sourceLineNo">6300</span>  // make sure region is success close when coprocessor wrong region open failed<a name="line.6300"></a>
+<span class="sourceLineNo">6301</span>  @Test<a name="line.6301"></a>
+<span class="sourceLineNo">6302</span>  public void testOpenRegionFailedMemoryLeak() throws Exception {<a name="line.6302"></a>
+<span class="sourceLineNo">6303</span>    final ServerName serverName = ServerName.valueOf("testOpenRegionFailed", 100, 42);<a name="line.6303"></a>
+<span class="sourceLineNo">6304</span>    final RegionServerServices rss = spy(TEST_UTIL.createMockRegionServerService(serverName));<a name="line.6304"></a>
+<span class="sourceLineNo">6305</span><a name="line.6305"></a>
+<span class="sourceLineNo">6306</span>    HTableDescriptor htd<a name="line.6306"></a>
+<span class="sourceLineNo">6307</span>      = new HTableDescriptor(TableName.valueOf("testOpenRegionFailed"));<a name="line.6307"></a>
+<span class="sourceLineNo">6308</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.6308"></a>
+<span class="sourceLineNo">6309</span>    htd.setValue("COPROCESSOR$1", "hdfs://test/test.jar|test||");<a name="line.6309"></a>
+<span class="sourceLineNo">6310</span><a name="line.6310"></a>
+<span class="sourceLineNo">6311</span>    HRegionInfo hri = new HRegionInfo(htd.getTableName(),<a name="line.6311"></a>
+<span class="sourceLineNo">6312</span>      HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY);<a name="line.6312"></a>
+<span class="sourceLineNo">6313</span>    ScheduledExecutorService executor = CompatibilitySingletonFactory.<a name="line.6313"></a>
+<span class="sourceLineNo">6314</span>      getInstance(MetricsExecutor.class).getExecutor();<a name="line.6314"></a>
+<span class="sourceLineNo">6315</span>    for (int i = 0; i &lt; 20 ; i++) {<a name="line.6315"></a>
+<span class="sourceLineNo">6316</span>      try {<a name="line.6316"></a>
+<span class="sourceLineNo">6317</span>        HRegion.openHRegion(hri, htd, rss.getWAL(hri),<a name="line.6317"></a>
+<span class="sourceLineNo">6318</span>          TEST_UTIL.getConfiguration(), rss, null);<a name="line.6318"></a>
+<span class="sourceLineNo">6319</span>      }catch(Throwable t){<a name="line.6319"></a>
+<span class="sourceLineNo">6320</span>        LOG.info("Expected exception, continue");<a name="line.6320"></a>
+<span class="sourceLineNo">6321</span>      }<a name="line.6321"></a>
+<span class="sourceLineNo">6322</span>    }<a name="line.6322"></a>
+<span class="sourceLineNo">6323</span>    TimeUnit.SECONDS.sleep(MetricsRegionWrapperImpl.PERIOD);<a name="line.6323"></a>
+<span class="sourceLineNo">6324</span>    Field[] fields = ThreadPoolExecutor.class.getDeclaredFields();<a name="line.6324"></a>
+<span class="sourceLineNo">6325</span>    boolean found = false;<a name="line.6325"></a>
+<span class="sourceLineNo">6326</span>    for(Field field : fields){<a name="line.6326"></a>
+<span class="sourceLineNo">6327</span>      if(field.getName().equals("workQueue")){<a name="line.6327"></a>
+<span class="sourceLineNo">6328</span>        field.setAccessible(true);<a name="line.6328"></a>
+<span class="sourceLineNo">6329</span>        BlockingQueue&lt;Runnable&gt; workQueue = (BlockingQueue&lt;Runnable&gt;)field.get(executor);<a name="line.6329"></a>
+<span class="sourceLineNo">6330</span>        //there are still two task not cancel, can not cause to memory lack<a name="line.6330"></a>
+<span class="sourceLineNo">6331</span>        Assert.assertTrue("ScheduledExecutor#workQueue should equals 2, now is " +<a name="line.6331"></a>
+<span class="sourceLineNo">6332</span>          workQueue.size() + ", please check region is close", 2 == workQueue.size());<a name="line.6332"></a>
+<span class="sourceLineNo">6333</span>        found = true;<a name="line.6333"></a>
+<span class="sourceLineNo">6334</span>      }<a name="line.6334"></a>
+<span class="sourceLineNo">6335</span>    }<a name="line.6335"></a>
+<span class="sourceLineNo">6336</span>    Assert.assertTrue("can not find workQueue, test failed", found);<a name="line.6336"></a>
+<span class="sourceLineNo">6337</span>  }<a name="line.6337"></a>
+<span class="sourceLineNo">6338</span><a name="line.6338"></a>
+<span class="sourceLineNo">6339</span>  /**<a name="line.6339"></a>
+<span class="sourceLineNo">6340</span>   * The same as HRegion class, the only difference is that instantiateHStore will<a name="line.6340"></a>
+<span class="sourceLineNo">6341</span>   * create a different HStore - HStoreForTesting. [HBASE-8518]<a name="line.6341"></a>
+<span class="sourceLineNo">6342</span>   */<a name="line.6342"></a>
+<span class="sourceLineNo">6343</span>  public static class HRegionForTesting extends HRegion {<a name="line.6343"></a>
+<span class="sourceLineNo">6344</span><a name="line.6344"></a>
+<span class="sourceLineNo">6345</span>    public HRegionForTesting(final Path tableDir, final WAL wal, final FileSystem fs,<a name="line.6345"></a>
+<span class="sourceLineNo">6346</span>                             final Configuration confParam, final RegionInfo regionInfo,<a name="line.6346"></a>
+<span class="sourceLineNo">6347</span>                             final TableDescriptor htd, final RegionServerServices rsServices) {<a name="line.6347"></a>
+<span class="sourceLineNo">6348</span>      this(new HRegionFileSystem(confParam, fs, tableDir, regionInfo),<a name="line.6348"></a>
+<span class="sourceLineNo">6349</span>          wal, confParam, htd, rsServices);<a name="line.6349"></a>
+<span class="sourceLineNo">6350</span>    }<a name="line.6350"></a>
+<span class="sourceLineNo">6351</span><a name="line.6351"></a>
+<span class="sourceLineNo">6352</span>    public HRegionForTesting(HRegionFileSystem fs, WAL wal,<a name="line.6352"></a>
+<span class="sourceLineNo">6353</span>                             Configuration confParam, TableDescriptor htd,<a name="line.6353"></a>
+<span class="sourceLineNo">6354</span>                             RegionServerServices rsServices) {<a name="line.6354"></a>
+<span class="sourceLineNo">6355</span>      super(fs, wal, confParam, htd, rsServices);<a name="line.6355"></a>
+<span class="sourceLineNo">6356</span>    }<a name="line.6356"></a>
+<span class="sourceLineNo">6357</span><a name="line.6357"></a>
+<span class="sourceLineNo">6358</span>    /**<a name="line.6358"></a>
+<span class="sourceLineNo">6359</span>     * Create HStore instance.<a name="line.6359"></a>
+<span class="sourceLineNo">6360</span>     * @return If Mob is enabled, return HMobStore, otherwise return HStoreForTesting.<a name="line.6360"></a>
+<span class="sourceLineNo">6361</span>     */<a name="line.6361"></a>
+<span class="sourceLineNo">6362</span>    @Override<a name="line.6362"></a>
+<span class="sourceLineNo">6363</span>    protected HStore instantiateHStore(final ColumnFamilyDescriptor family, boolean warmup)<a name="line.6363"></a>
+<span class="sourceLineNo">6364</span>        throws IOException {<a name="line.6364"></a>
+<span class="sourceLineNo">6365</span>      if (family.isMobEnabled()) {<a name="line.6365"></a>
+<span class="sourceLineNo">6366</span>        if (HFile.getFormatVersion(this.conf) &lt; HFile.MIN_FORMAT_VERSION_WITH_TAGS) {<a name="line.6366"></a>
+<span class="sourceLineNo">6367</span>          throw new IOException("A minimum HFile version of " + HFile.MIN_FORMAT_VERSION_WITH_TAGS +<a name="line.6367"></a>
+<span class="sourceLineNo">6368</span>              " is required for MOB feature. Consider setting " + HFile.FORMAT_VERSION_KEY +<a name="line.6368"></a>
+<span class="sourceLineNo">6369</span>              " accordingly.");<a name="line.6369"></a>
+<span class="sourceLineNo">6370</span>        }<a name="line.6370"></a>
+<span class="sourceLineNo">6371</span>        return new HMobStore(this, family, this.conf, warmup);<a name="line.6371"></a>
+<span class="sourceLineNo">6372</span>      }<a name="line.6372"></a>
+<span class="sourceLineNo">6373</span>      return new HStoreForTesting(this, family, this.conf, warmup);<a name="line.6373"></a>
+<span class="sourceLineNo">6374</span>    }<a name="line.6374"></a>
+<span class="sourceLineNo">6375</span>  }<a name="line.6375"></a>
 <span class="sourceLineNo">6376</span><a name="line.6376"></a>
-<span class="sourceLineNo">6377</span>    protected HStoreForTesting(final HRegion region,<a name="line.6377"></a>
-<span class="sourceLineNo">6378</span>        final ColumnFamilyDescriptor family,<a name="line.6378"></a>
-<span class="sourceLineNo">6379</span>        final Configuration confParam, boolean warmup) throws IOException {<a name="line.6379"></a>
-<span class="sourceLineNo">6380</span>      super(region, family, confParam, warmup);<a name="line.6380"></a>
-<span class="sourceLineNo">6381</span>    }<a name="line.6381"></a>
-<span class="sourceLineNo">6382</span><a name="line.6382"></a>
-<span class="sourceLineNo">6383</span>    @Override<a name="line.6383"></a>
-<span class="sourceLineNo">6384</span>    protected List&lt;HStoreFile&gt; doCompaction(CompactionRequestImpl cr,<a name="line.6384"></a>
-<span class="sourceLineNo">6385</span>        Collection&lt;HStoreFile&gt; filesToCompact, User user, long compactionStartTime,<a name="line.6385"></a>
-<span class="sourceLineNo">6386</span>        List&lt;Path&gt; newFiles) throws IOException {<a name="line.6386"></a>
-<span class="sourceLineNo">6387</span>      // let compaction incomplete.<a name="line.6387"></a>
-<span class="sourceLineNo">6388</span>      if (!this.conf.getBoolean("hbase.hstore.compaction.complete", true)) {<a name="line.6388"></a>
-<span class="sourceLineNo">6389</span>        LOG.warn("hbase.hstore.compaction.complete is set to false");<a name="line.6389"></a>
-<span class="sourceLineNo">6390</span>        List&lt;HStoreFile&gt; sfs = new ArrayList&lt;&gt;(newFiles.size());<a name="line.6390"></a>
-<span class="sourceLineNo">6391</span>        final boolean evictOnClose =<a name="line.6391"></a>
-<span class="sourceLineNo">6392</span>            cacheConf != null? cacheConf.shouldEvictOnClose(): true;<a name="line.6392"></a>
-<span class="sourceLineNo">6393</span>        for (Path newFile : newFiles) {<a name="line.6393"></a>
-<span class="sourceLineNo">6394</span>          // Create storefile around what we wrote with a reader on it.<a name="line.6394"></a>
-<span class="sourceLineNo">6395</span>          HStoreFile sf = createStoreFileAndReader(newFile);<a name="line.6395"></a>
-<span class="sourceLineNo">6396</span>          sf.closeStoreFile(evictOnClose);<a name="line.6396"></a>
-<span class="sourceLineNo">6397</span>          sfs.add(sf);<a name="line.6397"></a>
-<span class="sourceLineNo">6398</span>        }<a name="line.6398"></a>
-<span class="sourceLineNo">6399</span>        return sfs;<a name="line.6399"></a>
-<span class="sourceLineNo">6400</span>      }<a name="line.6400"></a>
-<span class="sourceLineNo">6401</span>      return super.doCompaction(cr, filesToCompact, user, compactionStartTime, newFiles);<a name="line.6401"></a>
-<span class="sourceLineNo">6402</span>    }<a name="line.6402"></a>
-<span class="sourceLineNo">6403</span>  }<a name="line.6403"></a>
-<span class="sourceLineNo">6404</span>}<a name="line.6404"></a>
+<span class="sourceLineNo">6377</span>  /**<a name="line.6377"></a>
+<span class="sourceLineNo">6378</span>   * HStoreForTesting is merely the same as HStore, the difference is in the doCompaction method<a name="line.6378"></a>
+<span class="sourceLineNo">6379</span>   * of HStoreForTesting there is a checkpoint "hbase.hstore.compaction.complete" which<a name="line.6379"></a>
+<span class="sourceLineNo">6380</span>   * doesn't let hstore compaction complete. In the former edition, this config is set in<a name="line.6380"></a>
+<span class="sourceLineNo">6381</span>   * HStore class inside compact method, though this is just for testing, otherwise it<a name="line.6381"></a>
+<span class="sourceLineNo">6382</span>   * doesn't do any help. In HBASE-8518, we try to get rid of all "hbase.hstore.compaction.complete"<a name="line.6382"></a>
+<span class="sourceLineNo">6383</span>   * config (except for testing code).<a name="line.6383"></a>
+<span class="sourceLineNo">6384</span>   */<a name="line.6384"></a>
+<span class="sourceLineNo">6385</span>  public static class HStoreForTesting extends HStore {<a name="line.6385"></a>
+<span class="sourceLineNo">6386</span><a name="line.6386"></a>
+<span class="sourceLineNo">6387</span>    protected HStoreForTesting(final HRegion region,<a name="line.6387"></a>
+<span class="sourceLineNo">6388</span>        final ColumnFamilyDescriptor family,<a name="line.6388"></a>
+<span class="sourceLineNo">6389</span>        final Configuration confParam, boolean warmup) throws IOException {<a name="line.6389"></a>
+<span class="sourceLineNo">6390</span>      super(region, family, confParam, warmup);<a name="line.6390"></a>
+<span class="sourceLineNo">6391</span>    }<a name="line.6391"></a>
+<span class="sourceLineNo">6392</span><a name="line.6392"></a>
+<span class="sourceLineNo">6393</span>    @Override<a name="line.6393"></a>
+<span class="sourceLineNo">6394</span>    protected List&lt;HStoreFile&gt; doCompaction(CompactionRequestImpl cr,<a name="line.6394"></a>
+<span class="sourceLineNo">6395</span>        Collection&lt;HStoreFile&gt; filesToCompact, User user, long compactionStartTime,<a name="line.6395"></a>
+<span class="sourceLineNo">6396</span>        List&lt;Path&gt; newFiles) throws IOException {<a name="line.6396"></a>
+<span class="sourceLineNo">6397</span>      // let compaction incomplete.<a name="line.6397"></a>
+<span class="sourceLineNo">6398</span>      if (!this.conf.getBoolean("hbase.hstore.compaction.complete", true)) {<a name="line.6398"></a>
+<span class="sourceLineNo">6399</span>        LOG.warn("hbase.hstore.compaction.complete is set to false");<a name="line.6399"></a>
+<span class="sourceLineNo">6400</span>        List&lt;HStoreFile&gt; sfs = new ArrayList&lt;&gt;(newFiles.size());<a name="line.6400"></a>
+<span class="sourceLineNo">6401</span>        final boolean evictOnClose =<a name="line.6401"></a>
+<span class="sourceLineNo">6402</span>            cacheConf != null? cacheConf.shouldEvictOnClose(): true;<a name="line.6402"></a>
+<span class="sourceLineNo">6403</span>        for (Path newFile : newFiles) {<a name="line.6403"></a>
+<span class="sourceLineNo">6404</span>          // Create storefile around what we wrote with a reader on it.<a name="line.6404"></a>
+<span class="sourceLineNo">6405</span>          HStoreFile sf = createStoreFileAndReader(newFile);<a name="line.6405"></a>
+<span class="sourceLineNo">6406</span>          sf.closeStoreFile(evictOnClose);<a name="line.6406"></a>
+<span class="sourceLineNo">6407</span>          sfs.add(sf);<a name="line.6407"></a>
+<span class="sourceLineNo">6408</span>        }<a name="line.6408"></a>
+<span class="sourceLineNo">6409</span>        return sfs;<a name="line.6409"></a>
+<span class="sourceLineNo">6410</span>      }<a name="line.6410"></a>
+<span class="sourceLineNo">6411</span>      return super.doCompaction(cr, filesToCompact, user, compactionStartTime, newFiles);<a name="line.6411"></a>
+<span class="sourceLineNo">6412</span>    }<a name="line.6412"></a>
+<span class="sourceLineNo">6413</span>  }<a name="line.6413"></a>
+<span class="sourceLineNo">6414</span>}<a name="line.6414"></a>
 
 
 
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html
index ddde350..77be719 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestHRegion.html
@@ -112,68 +112,68 @@
 <span class="sourceLineNo">104</span>import org.apache.hadoop.hbase.Waiter;<a name="line.104"></a>
 <span class="sourceLineNo">105</span>import org.apache.hadoop.hbase.client.Append;<a name="line.105"></a>
 <span class="sourceLineNo">106</span>import org.apache.hadoop.hbase.client.ColumnFamilyDescriptor;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.apache.hadoop.hbase.client.Get;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.110"></a>
-<span class="sourceLineNo">111</span>import org.apache.hadoop.hbase.client.Mutation;<a name="line.111"></a>
-<span class="sourceLineNo">112</span>import org.apache.hadoop.hbase.client.Put;<a name="line.112"></a>
-<span class="sourceLineNo">113</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.113"></a>
-<span class="sourceLineNo">114</span>import org.apache.hadoop.hbase.client.RegionInfoBuilder;<a name="line.114"></a>
-<span class="sourceLineNo">115</span>import org.apache.hadoop.hbase.client.Result;<a name="line.115"></a>
-<span class="sourceLineNo">116</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.116"></a>
-<span class="sourceLineNo">117</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.117"></a>
-<span class="sourceLineNo">118</span>import org.apache.hadoop.hbase.client.Table;<a name="line.118"></a>
-<span class="sourceLineNo">119</span>import org.apache.hadoop.hbase.client.TableDescriptor;<a name="line.119"></a>
-<span class="sourceLineNo">120</span>import org.apache.hadoop.hbase.coprocessor.CoprocessorHost;<a name="line.120"></a>
-<span class="sourceLineNo">121</span>import org.apache.hadoop.hbase.exceptions.FailedSanityCheckException;<a name="line.121"></a>
-<span class="sourceLineNo">122</span>import org.apache.hadoop.hbase.filter.BigDecimalComparator;<a name="line.122"></a>
-<span class="sourceLineNo">123</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.123"></a>
-<span class="sourceLineNo">124</span>import org.apache.hadoop.hbase.filter.ColumnCountGetFilter;<a name="line.124"></a>
-<span class="sourceLineNo">125</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.125"></a>
-<span class="sourceLineNo">126</span>import org.apache.hadoop.hbase.filter.FilterBase;<a name="line.126"></a>
-<span class="sourceLineNo">127</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.127"></a>
-<span class="sourceLineNo">128</span>import org.apache.hadoop.hbase.filter.NullComparator;<a name="line.128"></a>
-<span class="sourceLineNo">129</span>import org.apache.hadoop.hbase.filter.PrefixFilter;<a name="line.129"></a>
-<span class="sourceLineNo">130</span>import org.apache.hadoop.hbase.filter.SingleColumnValueExcludeFilter;<a name="line.130"></a>
-<span class="sourceLineNo">131</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.131"></a>
-<span class="sourceLineNo">132</span>import org.apache.hadoop.hbase.filter.SubstringComparator;<a name="line.132"></a>
-<span class="sourceLineNo">133</span>import org.apache.hadoop.hbase.filter.ValueFilter;<a name="line.133"></a>
-<span class="sourceLineNo">134</span>import org.apache.hadoop.hbase.io.hfile.HFile;<a name="line.134"></a>
-<span class="sourceLineNo">135</span>import org.apache.hadoop.hbase.monitoring.MonitoredRPCHandler;<a name="line.135"></a>
-<span class="sourceLineNo">136</span>import org.apache.hadoop.hbase.monitoring.MonitoredTask;<a name="line.136"></a>
-<span class="sourceLineNo">137</span>import org.apache.hadoop.hbase.monitoring.TaskMonitor;<a name="line.137"></a>
-<span class="sourceLineNo">138</span>import org.apache.hadoop.hbase.regionserver.HRegion.MutationBatchOperation;<a name="line.138"></a>
-<span class="sourceLineNo">139</span>import org.apache.hadoop.hbase.regionserver.HRegion.RegionScannerImpl;<a name="line.139"></a>
-<span class="sourceLineNo">140</span>import org.apache.hadoop.hbase.regionserver.Region.RowLock;<a name="line.140"></a>
-<span class="sourceLineNo">141</span>import org.apache.hadoop.hbase.regionserver.TestHStore.FaultyFileSystem;<a name="line.141"></a>
-<span class="sourceLineNo">142</span>import org.apache.hadoop.hbase.regionserver.compactions.CompactionRequestImpl;<a name="line.142"></a>
-<span class="sourceLineNo">143</span>import org.apache.hadoop.hbase.regionserver.wal.FSHLog;<a name="line.143"></a>
-<span class="sourceLineNo">144</span>import org.apache.hadoop.hbase.regionserver.wal.MetricsWALSource;<a name="line.144"></a>
-<span class="sourceLineNo">145</span>import org.apache.hadoop.hbase.regionserver.wal.WALUtil;<a name="line.145"></a>
-<span class="sourceLineNo">146</span>import org.apache.hadoop.hbase.replication.regionserver.ReplicationObserver;<a name="line.146"></a>
-<span class="sourceLineNo">147</span>import org.apache.hadoop.hbase.security.User;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>import org.apache.hadoop.hbase.test.MetricsAssertHelper;<a name="line.148"></a>
-<span class="sourceLineNo">149</span>import org.apache.hadoop.hbase.testclassification.LargeTests;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>import org.apache.hadoop.hbase.testclassification.VerySlowRegionServerTests;<a name="line.150"></a>
-<span class="sourceLineNo">151</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.151"></a>
-<span class="sourceLineNo">152</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.152"></a>
-<span class="sourceLineNo">153</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManagerTestHelper;<a name="line.153"></a>
-<span class="sourceLineNo">154</span>import org.apache.hadoop.hbase.util.FSUtils;<a name="line.154"></a>
-<span class="sourceLineNo">155</span>import org.apache.hadoop.hbase.util.IncrementingEnvironmentEdge;<a name="line.155"></a>
-<span class="sourceLineNo">156</span>import org.apache.hadoop.hbase.util.ManualEnvironmentEdge;<a name="line.156"></a>
-<span class="sourceLineNo">157</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.157"></a>
-<span class="sourceLineNo">158</span>import org.apache.hadoop.hbase.wal.AbstractFSWALProvider;<a name="line.158"></a>
-<span class="sourceLineNo">159</span>import org.apache.hadoop.hbase.wal.FaultyFSLog;<a name="line.159"></a>
-<span class="sourceLineNo">160</span>import org.apache.hadoop.hbase.wal.NettyAsyncFSWALConfigHelper;<a name="line.160"></a>
-<span class="sourceLineNo">161</span>import org.apache.hadoop.hbase.wal.WAL;<a name="line.161"></a>
-<span class="sourceLineNo">162</span>import org.apache.hadoop.hbase.wal.WALEdit;<a name="line.162"></a>
-<span class="sourceLineNo">163</span>import org.apache.hadoop.hbase.wal.WALFactory;<a name="line.163"></a>
-<span class="sourceLineNo">164</span>import org.apache.hadoop.hbase.wal.WALKeyImpl;<a name="line.164"></a>
-<span class="sourceLineNo">165</span>import org.apache.hadoop.hbase.wal.WALProvider;<a name="line.165"></a>
-<span class="sourceLineNo">166</span>import org.apache.hadoop.hbase.wal.WALProvider.Writer;<a name="line.166"></a>
-<span class="sourceLineNo">167</span>import org.apache.hadoop.hbase.wal.WALSplitUtil;<a name="line.167"></a>
-<span class="sourceLineNo">168</span>import org.apache.hadoop.hbase.wal.WALSplitter;<a name="line.168"></a>
+<span class="sourceLineNo">107</span>import org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>import org.apache.hadoop.hbase.client.Delete;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>import org.apache.hadoop.hbase.client.Durability;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>import org.apache.hadoop.hbase.client.Get;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>import org.apache.hadoop.hbase.client.Increment;<a name="line.111"></a>
+<span class="sourceLineNo">112</span>import org.apache.hadoop.hbase.client.Mutation;<a name="line.112"></a>
+<span class="sourceLineNo">113</span>import org.apache.hadoop.hbase.client.Put;<a name="line.113"></a>
+<span class="sourceLineNo">114</span>import org.apache.hadoop.hbase.client.RegionInfo;<a name="line.114"></a>
+<span class="sourceLineNo">115</span>import org.apache.hadoop.hbase.client.RegionInfoBuilder;<a name="line.115"></a>
+<span class="sourceLineNo">116</span>import org.apache.hadoop.hbase.client.Result;<a name="line.116"></a>
+<span class="sourceLineNo">117</span>import org.apache.hadoop.hbase.client.RowMutations;<a name="line.117"></a>
+<span class="sourceLineNo">118</span>import org.apache.hadoop.hbase.client.Scan;<a name="line.118"></a>
+<span class="sourceLineNo">119</span>import org.apache.hadoop.hbase.client.Table;<a name="line.119"></a>
+<span class="sourceLineNo">120</span>import org.apache.hadoop.hbase.client.TableDescriptor;<a name="line.120"></a>
+<span class="sourceLineNo">121</span>import org.apache.hadoop.hbase.coprocessor.CoprocessorHost;<a name="line.121"></a>
+<span class="sourceLineNo">122</span>import org.apache.hadoop.hbase.exceptions.FailedSanityCheckException;<a name="line.122"></a>
+<span class="sourceLineNo">123</span>import org.apache.hadoop.hbase.filter.BigDecimalComparator;<a name="line.123"></a>
+<span class="sourceLineNo">124</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.124"></a>
+<span class="sourceLineNo">125</span>import org.apache.hadoop.hbase.filter.ColumnCountGetFilter;<a name="line.125"></a>
+<span class="sourceLineNo">126</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.126"></a>
+<span class="sourceLineNo">127</span>import org.apache.hadoop.hbase.filter.FilterBase;<a name="line.127"></a>
+<span class="sourceLineNo">128</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.128"></a>
+<span class="sourceLineNo">129</span>import org.apache.hadoop.hbase.filter.NullComparator;<a name="line.129"></a>
+<span class="sourceLineNo">130</span>import org.apache.hadoop.hbase.filter.PrefixFilter;<a name="line.130"></a>
+<span class="sourceLineNo">131</span>import org.apache.hadoop.hbase.filter.SingleColumnValueExcludeFilter;<a name="line.131"></a>
+<span class="sourceLineNo">132</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.132"></a>
+<span class="sourceLineNo">133</span>import org.apache.hadoop.hbase.filter.SubstringComparator;<a name="line.133"></a>
+<span class="sourceLineNo">134</span>import org.apache.hadoop.hbase.filter.ValueFilter;<a name="line.134"></a>
+<span class="sourceLineNo">135</span>import org.apache.hadoop.hbase.io.hfile.HFile;<a name="line.135"></a>
+<span class="sourceLineNo">136</span>import org.apache.hadoop.hbase.monitoring.MonitoredRPCHandler;<a name="line.136"></a>
+<span class="sourceLineNo">137</span>import org.apache.hadoop.hbase.monitoring.MonitoredTask;<a name="line.137"></a>
+<span class="sourceLineNo">138</span>import org.apache.hadoop.hbase.monitoring.TaskMonitor;<a name="line.138"></a>
+<span class="sourceLineNo">139</span>import org.apache.hadoop.hbase.regionserver.HRegion.MutationBatchOperation;<a name="line.139"></a>
+<span class="sourceLineNo">140</span>import org.apache.hadoop.hbase.regionserver.HRegion.RegionScannerImpl;<a name="line.140"></a>
+<span class="sourceLineNo">141</span>import org.apache.hadoop.hbase.regionserver.Region.RowLock;<a name="line.141"></a>
+<span class="sourceLineNo">142</span>import org.apache.hadoop.hbase.regionserver.TestHStore.FaultyFileSystem;<a name="line.142"></a>
+<span class="sourceLineNo">143</span>import org.apache.hadoop.hbase.regionserver.compactions.CompactionRequestImpl;<a name="line.143"></a>
+<span class="sourceLineNo">144</span>import org.apache.hadoop.hbase.regionserver.wal.FSHLog;<a name="line.144"></a>
+<span class="sourceLineNo">145</span>import org.apache.hadoop.hbase.regionserver.wal.MetricsWALSource;<a name="line.145"></a>
+<span class="sourceLineNo">146</span>import org.apache.hadoop.hbase.regionserver.wal.WALUtil;<a name="line.146"></a>
+<span class="sourceLineNo">147</span>import org.apache.hadoop.hbase.replication.regionserver.ReplicationObserver;<a name="line.147"></a>
+<span class="sourceLineNo">148</span>import org.apache.hadoop.hbase.security.User;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>import org.apache.hadoop.hbase.test.MetricsAssertHelper;<a name="line.149"></a>
+<span class="sourceLineNo">150</span>import org.apache.hadoop.hbase.testclassification.LargeTests;<a name="line.150"></a>
+<span class="sourceLineNo">151</span>import org.apache.hadoop.hbase.testclassification.VerySlowRegionServerTests;<a name="line.151"></a>
+<span class="sourceLineNo">152</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.152"></a>
+<span class="sourceLineNo">153</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.153"></a>
+<span class="sourceLineNo">154</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManagerTestHelper;<a name="line.154"></a>
+<span class="sourceLineNo">155</span>import org.apache.hadoop.hbase.util.FSUtils;<a name="line.155"></a>
+<span class="sourceLineNo">156</span>import org.apache.hadoop.hbase.util.IncrementingEnvironmentEdge;<a name="line.156"></a>
+<span class="sourceLineNo">157</span>import org.apache.hadoop.hbase.util.ManualEnvironmentEdge;<a name="line.157"></a>
+<span class="sourceLineNo">158</span>import org.apache.hadoop.hbase.util.Threads;<a name="line.158"></a>
+<span class="sourceLineNo">159</span>import org.apache.hadoop.hbase.wal.AbstractFSWALProvider;<a name="line.159"></a>
+<span class="sourceLineNo">160</span>import org.apache.hadoop.hbase.wal.FaultyFSLog;<a name="line.160"></a>
+<span class="sourceLineNo">161</span>import org.apache.hadoop.hbase.wal.NettyAsyncFSWALConfigHelper;<a name="line.161"></a>
+<span class="sourceLineNo">162</span>import org.apache.hadoop.hbase.wal.WAL;<a name="line.162"></a>
+<span class="sourceLineNo">163</span>import org.apache.hadoop.hbase.wal.WALEdit;<a name="line.163"></a>
+<span class="sourceLineNo">164</span>import org.apache.hadoop.hbase.wal.WALFactory;<a name="line.164"></a>
+<span class="sourceLineNo">165</span>import org.apache.hadoop.hbase.wal.WALKeyImpl;<a name="line.165"></a>
+<span class="sourceLineNo">166</span>import org.apache.hadoop.hbase.wal.WALProvider;<a name="line.166"></a>
+<span class="sourceLineNo">167</span>import org.apache.hadoop.hbase.wal.WALProvider.Writer;<a name="line.167"></a>
+<span class="sourceLineNo">168</span>import org.apache.hadoop.hbase.wal.WALSplitUtil;<a name="line.168"></a>
 <span class="sourceLineNo">169</span>import org.apache.hadoop.metrics2.MetricsExecutor;<a name="line.169"></a>
 <span class="sourceLineNo">170</span>import org.junit.After;<a name="line.170"></a>
 <span class="sourceLineNo">171</span>import org.junit.Assert;<a name="line.171"></a>
@@ -409,6007 +409,6017 @@
 <span class="sourceLineNo">401</span>    String testName = "testMemstoreSizeAccountingWithFailedPostBatchMutate";<a name="line.401"></a>
 <span class="sourceLineNo">402</span>    FileSystem fs = FileSystem.get(CONF);<a name="line.402"></a>
 <span class="sourceLineNo">403</span>    Path rootDir = new Path(dir + testName);<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    FSHLog hLog = new FSHLog(fs, rootDir, testName, CONF);<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    hLog.init();<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, hLog,<a name="line.406"></a>
-<span class="sourceLineNo">407</span>        COLUMN_FAMILY_BYTES);<a name="line.407"></a>
-<span class="sourceLineNo">408</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    assertEquals(0, region.getMemStoreDataSize());<a name="line.409"></a>
-<span class="sourceLineNo">410</span><a name="line.410"></a>
-<span class="sourceLineNo">411</span>    // Put one value<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    byte [] value = Bytes.toBytes(method);<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    Put put = new Put(value);<a name="line.413"></a>
-<span class="sourceLineNo">414</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.414"></a>
-<span class="sourceLineNo">415</span>    region.put(put);<a name="line.415"></a>
-<span class="sourceLineNo">416</span>    long onePutSize = region.getMemStoreDataSize();<a name="line.416"></a>
-<span class="sourceLineNo">417</span>    assertTrue(onePutSize &gt; 0);<a name="line.417"></a>
-<span class="sourceLineNo">418</span><a name="line.418"></a>
-<span class="sourceLineNo">419</span>    RegionCoprocessorHost mockedCPHost = Mockito.mock(RegionCoprocessorHost.class);<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    doThrow(new IOException())<a name="line.420"></a>
-<span class="sourceLineNo">421</span>       .when(mockedCPHost).postBatchMutate(Mockito.&lt;MiniBatchOperationInProgress&lt;Mutation&gt;&gt;any());<a name="line.421"></a>
-<span class="sourceLineNo">422</span>    region.setCoprocessorHost(mockedCPHost);<a name="line.422"></a>
-<span class="sourceLineNo">423</span><a name="line.423"></a>
-<span class="sourceLineNo">424</span>    put = new Put(value);<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("dfg"), value);<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    try {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      region.put(put);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>      fail("Should have failed with IOException");<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    } catch (IOException expected) {<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    }<a name="line.430"></a>
-<span class="sourceLineNo">431</span>    long expectedSize = onePutSize * 2;<a name="line.431"></a>
-<span class="sourceLineNo">432</span>    assertEquals("memstoreSize should be incremented",<a name="line.432"></a>
-<span class="sourceLineNo">433</span>        expectedSize, region.getMemStoreDataSize());<a name="line.433"></a>
-<span class="sourceLineNo">434</span>    assertEquals("flushable size should be incremented",<a name="line.434"></a>
-<span class="sourceLineNo">435</span>        expectedSize, store.getFlushableSize().getDataSize());<a name="line.435"></a>
-<span class="sourceLineNo">436</span><a name="line.436"></a>
-<span class="sourceLineNo">437</span>    region.setCoprocessorHost(null);<a name="line.437"></a>
-<span class="sourceLineNo">438</span>  }<a name="line.438"></a>
-<span class="sourceLineNo">439</span><a name="line.439"></a>
-<span class="sourceLineNo">440</span>  /**<a name="line.440"></a>
-<span class="sourceLineNo">441</span>   * A test case of HBASE-21041<a name="line.441"></a>
-<span class="sourceLineNo">442</span>   * @throws Exception Exception<a name="line.442"></a>
-<span class="sourceLineNo">443</span>   */<a name="line.443"></a>
-<span class="sourceLineNo">444</span>  @Test<a name="line.444"></a>
-<span class="sourceLineNo">445</span>  public void testFlushAndMemstoreSizeCounting() throws Exception {<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    byte[] family = Bytes.toBytes("family");<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.447"></a>
-<span class="sourceLineNo">448</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.448"></a>
-<span class="sourceLineNo">449</span>    try {<a name="line.449"></a>
-<span class="sourceLineNo">450</span>      for (byte[] row : HBaseTestingUtility.ROWS) {<a name="line.450"></a>
-<span class="sourceLineNo">451</span>        Put put = new Put(row);<a name="line.451"></a>
-<span class="sourceLineNo">452</span>        put.addColumn(family, family, row);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>        region.put(put);<a name="line.453"></a>
-<span class="sourceLineNo">454</span>      }<a name="line.454"></a>
-<span class="sourceLineNo">455</span>      region.flush(true);<a name="line.455"></a>
-<span class="sourceLineNo">456</span>      // After flush, data size should be zero<a name="line.456"></a>
-<span class="sourceLineNo">457</span>      assertEquals(0, region.getMemStoreDataSize());<a name="line.457"></a>
-<span class="sourceLineNo">458</span>      // After flush, a new active mutable segment is created, so the heap size<a name="line.458"></a>
-<span class="sourceLineNo">459</span>      // should equal to MutableSegment.DEEP_OVERHEAD<a name="line.459"></a>
-<span class="sourceLineNo">460</span>      assertEquals(MutableSegment.DEEP_OVERHEAD, region.getMemStoreHeapSize());<a name="line.460"></a>
-<span class="sourceLineNo">461</span>      // After flush, offheap should be zero<a name="line.461"></a>
-<span class="sourceLineNo">462</span>      assertEquals(0, region.getMemStoreOffHeapSize());<a name="line.462"></a>
-<span class="sourceLineNo">463</span>    } finally {<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.464"></a>
-<span class="sourceLineNo">465</span>      this.region = null;<a name="line.465"></a>
-<span class="sourceLineNo">466</span>      wals.close();<a name="line.466"></a>
-<span class="sourceLineNo">467</span>    }<a name="line.467"></a>
-<span class="sourceLineNo">468</span>  }<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>   * Test we do not lose data if we fail a flush and then close.<a name="line.471"></a>
-<span class="sourceLineNo">472</span>   * Part of HBase-10466.  Tests the following from the issue description:<a name="line.472"></a>
-<span class="sourceLineNo">473</span>   * "Bug 1: Wrong calculation of HRegion.memstoreSize: When a flush fails, data to be flushed is<a name="line.473"></a>
-<span class="sourceLineNo">474</span>   * kept in each MemStore's snapshot and wait for next flush attempt to continue on it. But when<a name="line.474"></a>
-<span class="sourceLineNo">475</span>   * the next flush succeeds, the counter of total memstore size in HRegion is always deduced by<a name="line.475"></a>
-<span class="sourceLineNo">476</span>   * the sum of current memstore sizes instead of snapshots left from previous failed flush. This<a name="line.476"></a>
-<span class="sourceLineNo">477</span>   * calculation is problematic that almost every time there is failed flush, HRegion.memstoreSize<a name="line.477"></a>
-<span class="sourceLineNo">478</span>   * gets reduced by a wrong value. If region flush could not proceed for a couple cycles, the size<a name="line.478"></a>
-<span class="sourceLineNo">479</span>   * in current memstore could be much larger than the snapshot. It's likely to drift memstoreSize<a name="line.479"></a>
-<span class="sourceLineNo">480</span>   * much smaller than expected. In extreme case, if the error accumulates to even bigger than<a name="line.480"></a>
-<span class="sourceLineNo">481</span>   * HRegion's memstore size limit, any further flush is skipped because flush does not do anything<a name="line.481"></a>
-<span class="sourceLineNo">482</span>   * if memstoreSize is not larger than 0."<a name="line.482"></a>
-<span class="sourceLineNo">483</span>   * @throws Exception<a name="line.483"></a>
-<span class="sourceLineNo">484</span>   */<a name="line.484"></a>
-<span class="sourceLineNo">485</span>  @Test<a name="line.485"></a>
-<span class="sourceLineNo">486</span>  public void testFlushSizeAccounting() throws Exception {<a name="line.486"></a>
-<span class="sourceLineNo">487</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.487"></a>
-<span class="sourceLineNo">488</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    // Only retry once.<a name="line.489"></a>
-<span class="sourceLineNo">490</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.490"></a>
-<span class="sourceLineNo">491</span>    final User user =<a name="line.491"></a>
-<span class="sourceLineNo">492</span>      User.createUserForTesting(conf, method, new String[]{"foo"});<a name="line.492"></a>
-<span class="sourceLineNo">493</span>    // Inject our faulty LocalFileSystem<a name="line.493"></a>
-<span class="sourceLineNo">494</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.494"></a>
-<span class="sourceLineNo">495</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.495"></a>
-<span class="sourceLineNo">496</span>      @Override<a name="line.496"></a>
-<span class="sourceLineNo">497</span>      public Object run() throws Exception {<a name="line.497"></a>
-<span class="sourceLineNo">498</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.498"></a>
-<span class="sourceLineNo">499</span>        FileSystem fs = FileSystem.get(conf);<a name="line.499"></a>
-<span class="sourceLineNo">500</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.500"></a>
-<span class="sourceLineNo">501</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.501"></a>
-<span class="sourceLineNo">502</span>        HRegion region = null;<a name="line.502"></a>
-<span class="sourceLineNo">503</span>        try {<a name="line.503"></a>
-<span class="sourceLineNo">504</span>          // Initialize region<a name="line.504"></a>
-<span class="sourceLineNo">505</span>          region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, wal,<a name="line.505"></a>
-<span class="sourceLineNo">506</span>              COLUMN_FAMILY_BYTES);<a name="line.506"></a>
-<span class="sourceLineNo">507</span>          long size = region.getMemStoreDataSize();<a name="line.507"></a>
-<span class="sourceLineNo">508</span>          Assert.assertEquals(0, size);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.509"></a>
-<span class="sourceLineNo">510</span>          Put p1 = new Put(row);<a name="line.510"></a>
-<span class="sourceLineNo">511</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[]) null));<a name="line.511"></a>
-<span class="sourceLineNo">512</span>          region.put(p1);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>          final long sizeOfOnePut = region.getMemStoreDataSize();<a name="line.513"></a>
-<span class="sourceLineNo">514</span>          // Fail a flush which means the current memstore will hang out as memstore 'snapshot'.<a name="line.514"></a>
-<span class="sourceLineNo">515</span>          try {<a name="line.515"></a>
-<span class="sourceLineNo">516</span>            LOG.info("Flushing");<a name="line.516"></a>
-<span class="sourceLineNo">517</span>            region.flush(true);<a name="line.517"></a>
-<span class="sourceLineNo">518</span>            Assert.fail("Didn't bubble up IOE!");<a name="line.518"></a>
-<span class="sourceLineNo">519</span>          } catch (DroppedSnapshotException dse) {<a name="line.519"></a>
-<span class="sourceLineNo">520</span>            // What we are expecting<a name="line.520"></a>
-<span class="sourceLineNo">521</span>            region.closing.set(false); // this is needed for the rest of the test to work<a name="line.521"></a>
-<span class="sourceLineNo">522</span>          }<a name="line.522"></a>
-<span class="sourceLineNo">523</span>          // Make it so all writes succeed from here on out<a name="line.523"></a>
-<span class="sourceLineNo">524</span>          ffs.fault.set(false);<a name="line.524"></a>
-<span class="sourceLineNo">525</span>          // Check sizes.  Should still be the one entry.<a name="line.525"></a>
-<span class="sourceLineNo">526</span>          Assert.assertEquals(sizeOfOnePut, region.getMemStoreDataSize());<a name="line.526"></a>
-<span class="sourceLineNo">527</span>          // Now add two entries so that on this next flush that fails, we can see if we<a name="line.527"></a>
-<span class="sourceLineNo">528</span>          // subtract the right amount, the snapshot size only.<a name="line.528"></a>
-<span class="sourceLineNo">529</span>          Put p2 = new Put(row);<a name="line.529"></a>
-<span class="sourceLineNo">530</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.530"></a>
-<span class="sourceLineNo">531</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.531"></a>
-<span class="sourceLineNo">532</span>          region.put(p2);<a name="line.532"></a>
-<span class="sourceLineNo">533</span>          long expectedSize = sizeOfOnePut * 3;<a name="line.533"></a>
-<span class="sourceLineNo">534</span>          Assert.assertEquals(expectedSize, region.getMemStoreDataSize());<a name="line.534"></a>
-<span class="sourceLineNo">535</span>          // Do a successful flush.  It will clear the snapshot only.  Thats how flushes work.<a name="line.535"></a>
-<span class="sourceLineNo">536</span>          // If already a snapshot, we clear it else we move the memstore to be snapshot and flush<a name="line.536"></a>
-<span class="sourceLineNo">537</span>          // it<a name="line.537"></a>
-<span class="sourceLineNo">538</span>          region.flush(true);<a name="line.538"></a>
-<span class="sourceLineNo">539</span>          // Make sure our memory accounting is right.<a name="line.539"></a>
-<span class="sourceLineNo">540</span>          Assert.assertEquals(sizeOfOnePut * 2, region.getMemStoreDataSize());<a name="line.540"></a>
-<span class="sourceLineNo">541</span>        } finally {<a name="line.541"></a>
-<span class="sourceLineNo">542</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.542"></a>
-<span class="sourceLineNo">543</span>        }<a name="line.543"></a>
-<span class="sourceLineNo">544</span>        return null;<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>    FileSystem.closeAllForUGI(user.getUGI());<a name="line.547"></a>
-<span class="sourceLineNo">548</span>  }<a name="line.548"></a>
-<span class="sourceLineNo">549</span><a name="line.549"></a>
-<span class="sourceLineNo">550</span>  @Test<a name="line.550"></a>
-<span class="sourceLineNo">551</span>  public void testCloseWithFailingFlush() throws Exception {<a name="line.551"></a>
-<span class="sourceLineNo">552</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.552"></a>
-<span class="sourceLineNo">553</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    // Only retry once.<a name="line.554"></a>
-<span class="sourceLineNo">555</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.555"></a>
-<span class="sourceLineNo">556</span>    final User user =<a name="line.556"></a>
-<span class="sourceLineNo">557</span>      User.createUserForTesting(conf, this.method, new String[]{"foo"});<a name="line.557"></a>
-<span class="sourceLineNo">558</span>    // Inject our faulty LocalFileSystem<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.560"></a>
-<span class="sourceLineNo">561</span>      @Override<a name="line.561"></a>
-<span class="sourceLineNo">562</span>      public Object run() throws Exception {<a name="line.562"></a>
-<span class="sourceLineNo">563</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.563"></a>
-<span class="sourceLineNo">564</span>        FileSystem fs = FileSystem.get(conf);<a name="line.564"></a>
-<span class="sourceLineNo">565</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.565"></a>
-<span class="sourceLineNo">566</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.566"></a>
-<span class="sourceLineNo">567</span>        HRegion region = null;<a name="line.567"></a>
-<span class="sourceLineNo">568</span>        try {<a name="line.568"></a>
-<span class="sourceLineNo">569</span>          // Initialize region<a name="line.569"></a>
-<span class="sourceLineNo">570</span>          region = initHRegion(tableName, null, null, false,<a name="line.570"></a>
-<span class="sourceLineNo">571</span>              Durability.SYNC_WAL, wal, COLUMN_FAMILY_BYTES);<a name="line.571"></a>
-<span class="sourceLineNo">572</span>          long size = region.getMemStoreDataSize();<a name="line.572"></a>
-<span class="sourceLineNo">573</span>          Assert.assertEquals(0, size);<a name="line.573"></a>
-<span class="sourceLineNo">574</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.574"></a>
-<span class="sourceLineNo">575</span>          Put p1 = new Put(row);<a name="line.575"></a>
-<span class="sourceLineNo">576</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[])null));<a name="line.576"></a>
-<span class="sourceLineNo">577</span>          region.put(p1);<a name="line.577"></a>
-<span class="sourceLineNo">578</span>          // Manufacture an outstanding snapshot -- fake a failed flush by doing prepare step only.<a name="line.578"></a>
-<span class="sourceLineNo">579</span>          HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>          StoreFlushContext storeFlushCtx =<a name="line.580"></a>
-<span class="sourceLineNo">581</span>              store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY);<a name="line.581"></a>
-<span class="sourceLineNo">582</span>          storeFlushCtx.prepare();<a name="line.582"></a>
-<span class="sourceLineNo">583</span>          // Now add two entries to the foreground memstore.<a name="line.583"></a>
-<span class="sourceLineNo">584</span>          Put p2 = new Put(row);<a name="line.584"></a>
-<span class="sourceLineNo">585</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.585"></a>
-<span class="sourceLineNo">586</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.586"></a>
-<span class="sourceLineNo">587</span>          region.put(p2);<a name="line.587"></a>
-<span class="sourceLineNo">588</span>          // Now try close on top of a failing flush.<a name="line.588"></a>
-<span class="sourceLineNo">589</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.589"></a>
-<span class="sourceLineNo">590</span>          region = null;<a name="line.590"></a>
-<span class="sourceLineNo">591</span>          fail();<a name="line.591"></a>
-<span class="sourceLineNo">592</span>        } catch (DroppedSnapshotException dse) {<a name="line.592"></a>
-<span class="sourceLineNo">593</span>          // Expected<a name="line.593"></a>
-<span class="sourceLineNo">594</span>          LOG.info("Expected DroppedSnapshotException");<a name="line.594"></a>
-<span class="sourceLineNo">595</span>        } finally {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>          // Make it so all writes succeed from here on out so can close clean<a name="line.596"></a>
-<span class="sourceLineNo">597</span>          ffs.fault.set(false);<a name="line.597"></a>
-<span class="sourceLineNo">598</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.598"></a>
-<span class="sourceLineNo">599</span>        }<a name="line.599"></a>
-<span class="sourceLineNo">600</span>        return null;<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      }<a name="line.601"></a>
-<span class="sourceLineNo">602</span>    });<a name="line.602"></a>
-<span class="sourceLineNo">603</span>    FileSystem.closeAllForUGI(user.getUGI());<a name="line.603"></a>
-<span class="sourceLineNo">604</span>  }<a name="line.604"></a>
-<span class="sourceLineNo">605</span><a name="line.605"></a>
-<span class="sourceLineNo">606</span>  @Test<a name="line.606"></a>
-<span class="sourceLineNo">607</span>  public void testCompactionAffectedByScanners() throws Exception {<a name="line.607"></a>
-<span class="sourceLineNo">608</span>    byte[] family = Bytes.toBytes("family");<a name="line.608"></a>
-<span class="sourceLineNo">609</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.609"></a>
-<span class="sourceLineNo">610</span><a name="line.610"></a>
-<span class="sourceLineNo">611</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.612"></a>
-<span class="sourceLineNo">613</span>    region.put(put);<a name="line.613"></a>
-<span class="sourceLineNo">614</span>    region.flush(true);<a name="line.614"></a>
-<span class="sourceLineNo">615</span><a name="line.615"></a>
-<span class="sourceLineNo">616</span>    Scan scan = new Scan();<a name="line.616"></a>
-<span class="sourceLineNo">617</span>    scan.setMaxVersions(3);<a name="line.617"></a>
-<span class="sourceLineNo">618</span>    // open the first scanner<a name="line.618"></a>
-<span class="sourceLineNo">619</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.619"></a>
-<span class="sourceLineNo">620</span><a name="line.620"></a>
-<span class="sourceLineNo">621</span>    Delete delete = new Delete(Bytes.toBytes("r1"));<a name="line.621"></a>
-<span class="sourceLineNo">622</span>    region.delete(delete);<a name="line.622"></a>
-<span class="sourceLineNo">623</span>    region.flush(true);<a name="line.623"></a>
-<span class="sourceLineNo">624</span><a name="line.624"></a>
-<span class="sourceLineNo">625</span>    // open the second scanner<a name="line.625"></a>
-<span class="sourceLineNo">626</span>    RegionScanner scanner2 = region.getScanner(scan);<a name="line.626"></a>
-<span class="sourceLineNo">627</span><a name="line.627"></a>
-<span class="sourceLineNo">628</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.628"></a>
-<span class="sourceLineNo">629</span><a name="line.629"></a>
-<span class="sourceLineNo">630</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.630"></a>
-<span class="sourceLineNo">631</span><a name="line.631"></a>
-<span class="sourceLineNo">632</span>    // make a major compaction<a name="line.632"></a>
-<span class="sourceLineNo">633</span>    region.compact(true);<a name="line.633"></a>
-<span class="sourceLineNo">634</span><a name="line.634"></a>
-<span class="sourceLineNo">635</span>    // open the third scanner<a name="line.635"></a>
-<span class="sourceLineNo">636</span>    RegionScanner scanner3 = region.getScanner(scan);<a name="line.636"></a>
-<span class="sourceLineNo">637</span><a name="line.637"></a>
-<span class="sourceLineNo">638</span>    // get data from scanner 1, 2, 3 after major compaction<a name="line.638"></a>
-<span class="sourceLineNo">639</span>    scanner1.next(results);<a name="line.639"></a>
-<span class="sourceLineNo">640</span>    System.out.println(results);<a name="line.640"></a>
-<span class="sourceLineNo">641</span>    assertEquals(1, results.size());<a name="line.641"></a>
-<span class="sourceLineNo">642</span><a name="line.642"></a>
-<span class="sourceLineNo">643</span>    results.clear();<a name="line.643"></a>
-<span class="sourceLineNo">644</span>    scanner2.next(results);<a name="line.644"></a>
-<span class="sourceLineNo">645</span>    System.out.println(results);<a name="line.645"></a>
-<span class="sourceLineNo">646</span>    assertEquals(0, results.size());<a name="line.646"></a>
-<span class="sourceLineNo">647</span><a name="line.647"></a>
-<span class="sourceLineNo">648</span>    results.clear();<a name="line.648"></a>
-<span class="sourceLineNo">649</span>    scanner3.next(results);<a name="line.649"></a>
-<span class="sourceLineNo">650</span>    System.out.println(results);<a name="line.650"></a>
-<span class="sourceLineNo">651</span>    assertEquals(0, results.size());<a name="line.651"></a>
-<span class="sourceLineNo">652</span>  }<a name="line.652"></a>
-<span class="sourceLineNo">653</span><a name="line.653"></a>
-<span class="sourceLineNo">654</span>  @Test<a name="line.654"></a>
-<span class="sourceLineNo">655</span>  public void testToShowNPEOnRegionScannerReseek() throws Exception {<a name="line.655"></a>
-<span class="sourceLineNo">656</span>    byte[] family = Bytes.toBytes("family");<a name="line.656"></a>
-<span class="sourceLineNo">657</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.657"></a>
-<span class="sourceLineNo">658</span><a name="line.658"></a>
-<span class="sourceLineNo">659</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.659"></a>
-<span class="sourceLineNo">660</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.660"></a>
-<span class="sourceLineNo">661</span>    region.put(put);<a name="line.661"></a>
-<span class="sourceLineNo">662</span>    put = new Put(Bytes.toBytes("r2"));<a name="line.662"></a>
-<span class="sourceLineNo">663</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.663"></a>
-<span class="sourceLineNo">664</span>    region.put(put);<a name="line.664"></a>
-<span class="sourceLineNo">665</span>    region.flush(true);<a name="line.665"></a>
-<span class="sourceLineNo">666</span><a name="line.666"></a>
-<span class="sourceLineNo">667</span>    Scan scan = new Scan();<a name="line.667"></a>
-<span class="sourceLineNo">668</span>    scan.setMaxVersions(3);<a name="line.668"></a>
-<span class="sourceLineNo">669</span>    // open the first scanner<a name="line.669"></a>
-<span class="sourceLineNo">670</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.670"></a>
-<span class="sourceLineNo">671</span><a name="line.671"></a>
-<span class="sourceLineNo">672</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.672"></a>
-<span class="sourceLineNo">673</span><a name="line.673"></a>
-<span class="sourceLineNo">674</span>    region.compact(true);<a name="line.674"></a>
-<span class="sourceLineNo">675</span><a name="line.675"></a>
-<span class="sourceLineNo">676</span>    scanner1.reseek(Bytes.toBytes("r2"));<a name="line.676"></a>
-<span class="sourceLineNo">677</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.677"></a>
-<span class="sourceLineNo">678</span>    scanner1.next(results);<a name="line.678"></a>
-<span class="sourceLineNo">679</span>    Cell keyValue = results.get(0);<a name="line.679"></a>
-<span class="sourceLineNo">680</span>    Assert.assertTrue(Bytes.compareTo(CellUtil.cloneRow(keyValue), Bytes.toBytes("r2")) == 0);<a name="line.680"></a>
-<span class="sourceLineNo">681</span>    scanner1.close();<a name="line.681"></a>
-<span class="sourceLineNo">682</span>  }<a name="line.682"></a>
-<span class="sourceLineNo">683</span><a name="line.683"></a>
-<span class="sourceLineNo">684</span>  @Test<a name="line.684"></a>
-<span class="sourceLineNo">685</span>  public void testSkipRecoveredEditsReplay() throws Exception {<a name="line.685"></a>
-<span class="sourceLineNo">686</span>    byte[] family = Bytes.toBytes("family");<a name="line.686"></a>
-<span class="sourceLineNo">687</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.687"></a>
-<span class="sourceLineNo">688</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.688"></a>
-<span class="sourceLineNo">689</span>    try {<a name="line.689"></a>
-<span class="sourceLineNo">690</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.690"></a>
-<span class="sourceLineNo">691</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.691"></a>
-<span class="sourceLineNo">692</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.692"></a>
-<span class="sourceLineNo">693</span><a name="line.693"></a>
-<span class="sourceLineNo">694</span>      Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.694"></a>
-<span class="sourceLineNo">695</span><a name="line.695"></a>
-<span class="sourceLineNo">696</span>      long maxSeqId = 1050;<a name="line.696"></a>
-<span class="sourceLineNo">697</span>      long minSeqId = 1000;<a name="line.697"></a>
-<span class="sourceLineNo">698</span><a name="line.698"></a>
-<span class="sourceLineNo">699</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.699"></a>
-<span class="sourceLineNo">700</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.700"></a>
-<span class="sourceLineNo">701</span>        fs.create(recoveredEdits);<a name="line.701"></a>
-<span class="sourceLineNo">702</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.702"></a>
-<span class="sourceLineNo">703</span><a name="line.703"></a>
-<span class="sourceLineNo">704</span>        long time = System.nanoTime();<a name="line.704"></a>
-<span class="sourceLineNo">705</span>        WALEdit edit = new WALEdit();<a name="line.705"></a>
-<span class="sourceLineNo">706</span>        edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.706"></a>
-<span class="sourceLineNo">707</span>            .toBytes(i)));<a name="line.707"></a>
-<span class="sourceLineNo">708</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.708"></a>
-<span class="sourceLineNo">709</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.709"></a>
-<span class="sourceLineNo">710</span><a name="line.710"></a>
-<span class="sourceLineNo">711</span>        writer.close();<a name="line.711"></a>
-<span class="sourceLineNo">712</span>      }<a name="line.712"></a>
-<span class="sourceLineNo">713</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.713"></a>
-<span class="sourceLineNo">714</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.714"></a>
-<span class="sourceLineNo">715</span>      for (HStore store : region.getStores()) {<a name="line.715"></a>
-<span class="sourceLineNo">716</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), minSeqId - 1);<a name="line.716"></a>
-<span class="sourceLineNo">717</span>      }<a name="line.717"></a>
-<span class="sourceLineNo">718</span>      long seqId = region.replayRecoveredEditsIfAny(maxSeqIdInStores, null, status);<a name="line.718"></a>
-<span class="sourceLineNo">719</span>      assertEquals(maxSeqId, seqId);<a name="line.719"></a>
-<span class="sourceLineNo">720</span>      region.getMVCC().advanceTo(seqId);<a name="line.720"></a>
-<span class="sourceLineNo">721</span>      Get get = new Get(row);<a name="line.721"></a>
-<span class="sourceLineNo">722</span>      Result result = region.get(get);<a name="line.722"></a>
-<span class="sourceLineNo">723</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.723"></a>
-<span class="sourceLineNo">724</span>        List&lt;Cell&gt; kvs = result.getColumnCells(family, Bytes.toBytes(i));<a name="line.724"></a>
-<span class="sourceLineNo">725</span>        assertEquals(1, kvs.size());<a name="line.725"></a>
-<span class="sourceLineNo">726</span>        assertArrayEquals(Bytes.toBytes(i), CellUtil.cloneValue(kvs.get(0)));<a name="line.726"></a>
-<span class="sourceLineNo">727</span>      }<a name="line.727"></a>
-<span class="sourceLineNo">728</span>    } finally {<a name="line.728"></a>
-<span class="sourceLineNo">729</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.729"></a>
-<span class="sourceLineNo">730</span>      this.region = null;<a name="line.730"></a>
-<span class="sourceLineNo">731</span>      wals.close();<a name="line.731"></a>
-<span class="sourceLineNo">732</span>    }<a name="line.732"></a>
-<span class="sourceLineNo">733</span>  }<a name="line.733"></a>
-<span class="sourceLineNo">734</span><a name="line.734"></a>
-<span class="sourceLineNo">735</span>  @Test<a name="line.735"></a>
-<span class="sourceLineNo">736</span>  public void testSkipRecoveredEditsReplaySomeIgnored() throws Exception {<a name="line.736"></a>
-<span class="sourceLineNo">737</span>    byte[] family = Bytes.toBytes("family");<a name="line.737"></a>
-<span class="sourceLineNo">738</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.738"></a>
-<span class="sourceLineNo">739</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.739"></a>
-<span class="sourceLineNo">740</span>    try {<a name="line.740"></a>
-<span class="sourceLineNo">741</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.741"></a>
-<span class="sourceLineNo">742</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.742"></a>
-<span class="sourceLineNo">743</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.743"></a>
-<span class="sourceLineNo">744</span><a name="line.744"></a>
-<span class="sourceLineNo">745</span>      Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.745"></a>
-<span class="sourceLineNo">746</span><a name="line.746"></a>
-<span class="sourceLineNo">747</span>      long maxSeqId = 1050;<a name="line.747"></a>
-<span class="sourceLineNo">748</span>      long minSeqId = 1000;<a name="line.748"></a>
-<span class="sourceLineNo">749</span><a name="line.749"></a>
-<span class="sourceLineNo">750</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.750"></a>
-<span class="sourceLineNo">751</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.751"></a>
-<span class="sourceLineNo">752</span>        fs.create(recoveredEdits);<a name="line.752"></a>
-<span class="sourceLineNo">753</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.753"></a>
-<span class="sourceLineNo">754</span><a name="line.754"></a>
-<span class="sourceLineNo">755</span>        long time = System.nanoTime();<a name="line.755"></a>
-<span class="sourceLineNo">756</span>        WALEdit edit = new WALEdit();<a name="line.756"></a>
-<span class="sourceLineNo">757</span>        edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.757"></a>
-<span class="sourceLineNo">758</span>            .toBytes(i)));<a name="line.758"></a>
-<span class="sourceLineNo">759</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.759"></a>
-<span class="sourceLineNo">760</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.760"></a>
-<span class="sourceLineNo">761</span><a name="line.761"></a>
-<span class="sourceLineNo">762</span>        writer.close();<a name="line.762"></a>
-<span class="sourceLineNo">763</span>      }<a name="line.763"></a>
-<span class="sourceLineNo">764</span>      long recoverSeqId = 1030;<a name="line.764"></a>
-<span class="sourceLineNo">765</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.765"></a>
-<span class="sourceLineNo">766</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.766"></a>
-<span class="sourceLineNo">767</span>      for (HStore store : region.getStores()) {<a name="line.767"></a>
-<span class="sourceLineNo">768</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), recoverSeqId - 1);<a name="line.768"></a>
-<span class="sourceLineNo">769</span>      }<a name="line.769"></a>
-<span class="sourceLineNo">770</span>      long seqId = region.replayRecoveredEditsIfAny(maxSeqIdInStores, null, status);<a name="line.770"></a>
-<span class="sourceLineNo">771</span>      assertEquals(maxSeqId, seqId);<a name="line.771"></a>
-<span class="sourceLineNo">772</span>      region.getMVCC().advanceTo(seqId);<a name="line.772"></a>
-<span class="sourceLineNo">773</span>      Get get = new Get(row);<a name="line.773"></a>
-<span class="sourceLineNo">774</span>      Result result = region.get(get);<a name="line.774"></a>
-<span class="sourceLineNo">775</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.775"></a>
-<span class="sourceLineNo">776</span>        List&lt;Cell&gt; kvs = result.getColumnCells(family, Bytes.toBytes(i));<a name="line.776"></a>
-<span class="sourceLineNo">777</span>        if (i &lt; recoverSeqId) {<a name="line.777"></a>
-<span class="sourceLineNo">778</span>          assertEquals(0, kvs.size());<a name="line.778"></a>
-<span class="sourceLineNo">779</span>        } else {<a name="line.779"></a>
-<span class="sourceLineNo">780</span>          assertEquals(1, kvs.size());<a name="line.780"></a>
-<span class="sourceLineNo">781</span>          assertArrayEquals(Bytes.toBytes(i), CellUtil.cloneValue(kvs.get(0)));<a name="line.781"></a>
-<span class="sourceLineNo">782</span>        }<a name="line.782"></a>
-<span class="sourceLineNo">783</span>      }<a name="line.783"></a>
-<span class="sourceLineNo">784</span>    } finally {<a name="line.784"></a>
-<span class="sourceLineNo">785</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.785"></a>
-<span class="sourceLineNo">786</span>      this.region = null;<a name="line.786"></a>
-<span class="sourceLineNo">787</span>      wals.close();<a name="line.787"></a>
-<span class="sourceLineNo">788</span>    }<a name="line.788"></a>
-<span class="sourceLineNo">789</span>  }<a name="line.789"></a>
-<span class="sourceLineNo">790</span><a name="line.790"></a>
-<span class="sourceLineNo">791</span>  @Test<a name="line.791"></a>
-<span class="sourceLineNo">792</span>  public void testSkipRecoveredEditsReplayAllIgnored() throws Exception {<a name="line.792"></a>
-<span class="sourceLineNo">793</span>    byte[] family = Bytes.toBytes("family");<a name="line.793"></a>
-<span class="sourceLineNo">794</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.794"></a>
-<span class="sourceLineNo">795</span>    Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.795"></a>
-<span class="sourceLineNo">796</span>    FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.796"></a>
-<span class="sourceLineNo">797</span><a name="line.797"></a>
-<span class="sourceLineNo">798</span>    Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.798"></a>
-<span class="sourceLineNo">799</span>    for (int i = 1000; i &lt; 1050; i += 10) {<a name="line.799"></a>
-<span class="sourceLineNo">800</span>      Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.800"></a>
-<span class="sourceLineNo">801</span>      FSDataOutputStream dos = fs.create(recoveredEdits);<a name="line.801"></a>
-<span class="sourceLineNo">802</span>      dos.writeInt(i);<a name="line.802"></a>
-<span class="sourceLineNo">803</span>      dos.close();<a name="line.803"></a>
-<span class="sourceLineNo">804</span>    }<a name="line.804"></a>
-<span class="sourceLineNo">805</span>    long minSeqId = 2000;<a name="line.805"></a>
-<span class="sourceLineNo">806</span>    Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", minSeqId - 1));<a name="line.806"></a>
-<span class="sourceLineNo">807</span>    FSDataOutputStream dos = fs.create(recoveredEdits);<a name="line.807"></a>
-<span class="sourceLineNo">808</span>    dos.close();<a name="line.808"></a>
-<span class="sourceLineNo">809</span><a name="line.809"></a>
-<span class="sourceLineNo">810</span>    Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.810"></a>
-<span class="sourceLineNo">811</span>    for (HStore store : region.getStores()) {<a name="line.811"></a>
-<span class="sourceLineNo">812</span>      maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), minSeqId);<a name="line.812"></a>
-<span class="sourceLineNo">813</span>    }<a name="line.813"></a>
-<span class="sourceLineNo">814</span>    long seqId = region.replayRecoveredEditsIfAny(maxSeqIdInStores, null, null);<a name="line.814"></a>
-<span class="sourceLineNo">815</span>    assertEquals(minSeqId, seqId);<a name="line.815"></a>
-<span class="sourceLineNo">816</span>  }<a name="line.816"></a>
-<span class="sourceLineNo">817</span><a name="line.817"></a>
-<span class="sourceLineNo">818</span>  @Test<a name="line.818"></a>
-<span class="sourceLineNo">819</span>  public void testSkipRecoveredEditsReplayTheLastFileIgnored() throws Exception {<a name="line.819"></a>
-<span class="sourceLineNo">820</span>    byte[] family = Bytes.toBytes("family");<a name="line.820"></a>
-<span class="sourceLineNo">821</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.821"></a>
-<span class="sourceLineNo">822</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.822"></a>
-<span class="sourceLineNo">823</span>    try {<a name="line.823"></a>
-<span class="sourceLineNo">824</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.824"></a>
-<span class="sourceLineNo">825</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.825"></a>
-<span class="sourceLineNo">826</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.826"></a>
-<span class="sourceLineNo">827</span>      byte[][] columns = region.getTableDescriptor().getColumnFamilyNames().toArray(new byte[0][]);<a name="line.827"></a>
-<span class="sourceLineNo">828</span><a name="line.828"></a>
-<span class="sourceLineNo">829</span>      assertEquals(0, region.getStoreFileList(columns).size());<a name="line.829"></a>
-<span class="sourceLineNo">830</span><a name="line.830"></a>
-<span class="sourceLineNo">831</span>      Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.831"></a>
-<span class="sourceLineNo">832</span><a name="line.832"></a>
-<span class="sourceLineNo">833</span>      long maxSeqId = 1050;<a name="line.833"></a>
-<span class="sourceLineNo">834</span>      long minSeqId = 1000;<a name="line.834"></a>
-<span class="sourceLineNo">835</span><a name="line.835"></a>
-<span class="sourceLineNo">836</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.836"></a>
-<span class="sourceLineNo">837</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.837"></a>
-<span class="sourceLineNo">838</span>        fs.create(recoveredEdits);<a name="line.838"></a>
-<span class="sourceLineNo">839</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.839"></a>
-<span class="sourceLineNo">840</span><a name="line.840"></a>
-<span class="sourceLineNo">841</span>        long time = System.nanoTime();<a name="line.841"></a>
-<span class="sourceLineNo">842</span>        WALEdit edit = null;<a name="line.842"></a>
-<span class="sourceLineNo">843</span>        if (i == maxSeqId) {<a name="line.843"></a>
-<span class="sourceLineNo">844</span>          edit = WALEdit.createCompaction(region.getRegionInfo(),<a name="line.844"></a>
-<span class="sourceLineNo">845</span>          CompactionDescriptor.newBuilder()<a name="line.845"></a>
-<span class="sourceLineNo">846</span>          .setTableName(ByteString.copyFrom(tableName.getName()))<a name="line.846"></a>
-<span class="sourceLineNo">847</span>          .setFamilyName(ByteString.copyFrom(regionName))<a name="line.847"></a>
-<span class="sourceLineNo">848</span>          .setEncodedRegionName(ByteString.copyFrom(regionName))<a name="line.848"></a>
-<span class="sourceLineNo">849</span>          .setStoreHomeDirBytes(ByteString.copyFrom(Bytes.toBytes(regiondir.toString())))<a name="line.849"></a>
-<span class="sourceLineNo">850</span>          .setRegionName(ByteString.copyFrom(region.getRegionInfo().getRegionName()))<a name="line.850"></a>
-<span class="sourceLineNo">851</span>          .build());<a name="line.851"></a>
-<span class="sourceLineNo">852</span>        } else {<a name="line.852"></a>
-<span class="sourceLineNo">853</span>          edit = new WALEdit();<a name="line.853"></a>
-<span class="sourceLineNo">854</span>          edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.854"></a>
-<span class="sourceLineNo">855</span>            .toBytes(i)));<a name="line.855"></a>
-<span class="sourceLineNo">856</span>        }<a name="line.856"></a>
-<span class="sourceLineNo">857</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.857"></a>
-<span class="sourceLineNo">858</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.858"></a>
-<span class="sourceLineNo">859</span>        writer.close();<a name="line.859"></a>
-<span class="sourceLineNo">860</span>      }<a name="line.860"></a>
-<span class="sourceLineNo">861</span><a name="line.861"></a>
-<span class="sourceLineNo">862</span>      long recoverSeqId = 1030;<a name="line.862"></a>
-<span class="sourceLineNo">863</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.863"></a>
-<span class="sourceLineNo">864</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.864"></a>
-<span class="sourceLineNo">865</span>      for (HStore store : region.getStores()) {<a name="line.865"></a>
-<span class="sourceLineNo">866</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), recoverSeqId - 1);<a name="line.866"></a>
-<span class="sourceLineNo">867</span>      }<a name="line.867"></a>
-<span class="sourceLineNo">868</span>      long seqId = region.replayRecoveredEditsIfAny(maxSeqIdInStores, null, status);<a name="line.868"></a>
-<span class="sourceLineNo">869</span>      assertEquals(maxSeqId, seqId);<a name="line.869"></a>
-<span class="sourceLineNo">870</span><a name="line.870"></a>
-<span class="sourceLineNo">871</span>      // assert that the files are flushed<a name="line.871"></a>
-<span class="sourceLineNo">872</span>      assertEquals(1, region.getStoreFileList(columns).size());<a name="line.872"></a>
-<span class="sourceLineNo">873</span><a name="line.873"></a>
-<span class="sourceLineNo">874</span>    } finally {<a name="line.874"></a>
-<span class="sourceLineNo">875</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.875"></a>
-<span class="sourceLineNo">876</span>      this.region = null;<a name="line.876"></a>
-<span class="sourceLineNo">877</span>      wals.close();<a name="line.877"></a>
-<span class="sourceLineNo">878</span>    }<a name="line.878"></a>
-<span class="sourceLineNo">879</span>  }<a name="line.879"></a>
-<span class="sourceLineNo">880</span><a name="line.880"></a>
-<span class="sourceLineNo">881</span>  @Test<a name="line.881"></a>
-<span class="sourceLineNo">882</span>  public void testRecoveredEditsReplayCompaction() throws Exception {<a name="line.882"></a>
-<span class="sourceLineNo">883</span>    testRecoveredEditsReplayCompaction(false);<a name="line.883"></a>
-<span class="sourceLineNo">884</span>    testRecoveredEditsReplayCompaction(true);<a name="line.884"></a>
-<span class="sourceLineNo">885</span>  }<a name="line.885"></a>
-<span class="sourceLineNo">886</span><a name="line.886"></a>
-<span class="sourceLineNo">887</span>  public void testRecoveredEditsReplayCompaction(boolean mismatchedRegionName) throws Exception {<a name="line.887"></a>
-<span class="sourceLineNo">888</span>    CONF.setClass(HConstants.REGION_IMPL, HRegionForTesting.class, Region.class);<a name="line.888"></a>
-<span class="sourceLineNo">889</span>    byte[] family = Bytes.toBytes("family");<a name="line.889"></a>
-<span class="sourceLineNo">890</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.890"></a>
-<span class="sourceLineNo">891</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.891"></a>
-<span class="sourceLineNo">892</span>    try {<a name="line.892"></a>
-<span class="sourceLineNo">893</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.893"></a>
-<span class="sourceLineNo">894</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.894"></a>
-<span class="sourceLineNo">895</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.895"></a>
-<span class="sourceLineNo">896</span><a name="line.896"></a>
-<span class="sourceLineNo">897</span>      long maxSeqId = 3;<a name="line.897"></a>
-<span class="sourceLineNo">898</span>      long minSeqId = 0;<a name="line.898"></a>
-<span class="sourceLineNo">899</span><a name="line.899"></a>
-<span class="sourceLineNo">900</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.900"></a>
-<span class="sourceLineNo">901</span>        Put put = new Put(Bytes.toBytes(i));<a name="line.901"></a>
-<span class="sourceLineNo">902</span>        put.addColumn(family, Bytes.toBytes(i), Bytes.toBytes(i));<a name="line.902"></a>
-<span class="sourceLineNo">903</span>        region.put(put);<a name="line.903"></a>
-<span class="sourceLineNo">904</span>        region.flush(true);<a name="line.904"></a>
-<span class="sourceLineNo">905</span>      }<a name="line.905"></a>
-<span class="sourceLineNo">906</span><a name="line.906"></a>
-<span class="sourceLineNo">907</span>      // this will create a region with 3 files<a name="line.907"></a>
-<span class="sourceLineNo">908</span>      assertEquals(3, region.getStore(family).getStorefilesCount());<a name="line.908"></a>
-<span class="sourceLineNo">909</span>      List&lt;Path&gt; storeFiles = new ArrayList&lt;&gt;(3);<a name="line.909"></a>
-<span class="sourceLineNo">910</span>      for (HStoreFile sf : region.getStore(family).getStorefiles()) {<a name="line.910"></a>
-<span class="sourceLineNo">911</span>        storeFiles.add(sf.getPath());<a name="line.911"></a>
-<span class="sourceLineNo">912</span>      }<a name="line.912"></a>
-<span class="sourceLineNo">913</span><a name="line.913"></a>
-<span class="sourceLineNo">914</span>      // disable compaction completion<a name="line.914"></a>
-<span class="sourceLineNo">915</span>      CONF.setBoolean("hbase.hstore.compaction.complete", false);<a name="line.915"></a>
-<span class="sourceLineNo">916</span>      region.compactStores();<a name="line.916"></a>
-<span class="sourceLineNo">917</span><a name="line.917"></a>
-<span class="sourceLineNo">918</span>      // ensure that nothing changed<a name="line.918"></a>
-<span class="sourceLineNo">919</span>      assertEquals(3, region.getStore(family).getStorefilesCount());<a name="line.919"></a>
-<span class="sourceLineNo">920</span><a name="line.920"></a>
-<span class="sourceLineNo">921</span>      // now find the compacted file, and manually add it to the recovered edits<a name="line.921"></a>
-<span class="sourceLineNo">922</span>      Path tmpDir = new Path(region.getRegionFileSystem().getTempDir(), Bytes.toString(family));<a name="line.922"></a>
-<span class="sourceLineNo">923</span>      FileStatus[] files = FSUtils.listStatus(fs, tmpDir);<a name="line.923"></a>
-<span class="sourceLineNo">924</span>      String errorMsg = "Expected to find 1 file in the region temp directory "<a name="line.924"></a>
-<span class="sourceLineNo">925</span>          + "from the compaction, could not find any";<a name="line.925"></a>
-<span class="sourceLineNo">926</span>      assertNotNull(errorMsg, files);<a name="line.926"></a>
-<span class="sourceLineNo">927</span>      assertEquals(errorMsg, 1, files.length);<a name="line.927"></a>
-<span class="sourceLineNo">928</span>      // move the file inside region dir<a name="line.928"></a>
-<span class="sourceLineNo">929</span>      Path newFile = region.getRegionFileSystem().commitStoreFile(Bytes.toString(family),<a name="line.929"></a>
-<span class="sourceLineNo">930</span>          files[0].getPath());<a name="line.930"></a>
-<span class="sourceLineNo">931</span><a name="line.931"></a>
-<span class="sourceLineNo">932</span>      byte[] encodedNameAsBytes = this.region.getRegionInfo().getEncodedNameAsBytes();<a name="line.932"></a>
-<span class="sourceLineNo">933</span>      byte[] fakeEncodedNameAsBytes = new byte [encodedNameAsBytes.length];<a name="line.933"></a>
-<span class="sourceLineNo">934</span>      for (int i=0; i &lt; encodedNameAsBytes.length; i++) {<a name="line.934"></a>
-<span class="sourceLineNo">935</span>        // Mix the byte array to have a new encodedName<a name="line.935"></a>
-<span class="sourceLineNo">936</span>        fakeEncodedNameAsBytes[i] = (byte) (encodedNameAsBytes[i] + 1);<a name="line.936"></a>
-<span class="sourceLineNo">937</span>      }<a name="line.937"></a>
-<span class="sourceLineNo">938</span><a name="line.938"></a>
-<span class="sourceLineNo">939</span>      CompactionDescriptor compactionDescriptor = ProtobufUtil.toCompactionDescriptor(this.region<a name="line.939"></a>
-<span class="sourceLineNo">940</span>        .getRegionInfo(), mismatchedRegionName ? fakeEncodedNameAsBytes : null, family,<a name="line.940"></a>
-<span class="sourceLineNo">941</span>            storeFiles, Lists.newArrayList(newFile),<a name="line.941"></a>
-<span class="sourceLineNo">942</span>            region.getRegionFileSystem().getStoreDir(Bytes.toString(family)));<a name="line.942"></a>
-<span class="sourceLineNo">943</span><a name="line.943"></a>
-<span class="sourceLineNo">944</span>      WALUtil.writeCompactionMarker(region.getWAL(), this.region.getReplicationScope(),<a name="line.944"></a>
-<span class="sourceLineNo">945</span>          this.region.getRegionInfo(), compactionDescriptor, region.getMVCC());<a name="line.945"></a>
-<span class="sourceLineNo">946</span><a name="line.946"></a>
-<span class="sourceLineNo">947</span>      Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.947"></a>
-<span class="sourceLineNo">948</span><a name="line.948"></a>
-<span class="sourceLineNo">949</span>      Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", 1000));<a name="line.949"></a>
-<span class="sourceLineNo">950</span>      fs.create(recoveredEdits);<a name="line.950"></a>
-<span class="sourceLineNo">951</span>      WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.951"></a>
-<span class="sourceLineNo">952</span><a name="line.952"></a>
-<span class="sourceLineNo">953</span>      long time = System.nanoTime();<a name="line.953"></a>
-<span class="sourceLineNo">954</span><a name="line.954"></a>
-<span class="sourceLineNo">955</span>      writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, 10, time,<a name="line.955"></a>
-<span class="sourceLineNo">956</span>          HConstants.DEFAULT_CLUSTER_ID), WALEdit.createCompaction(region.getRegionInfo(),<a name="line.956"></a>
-<span class="sourceLineNo">957</span>          compactionDescriptor)));<a name="line.957"></a>
-<span class="sourceLineNo">958</span>      writer.close();<a name="line.958"></a>
-<span class="sourceLineNo">959</span><a name="line.959"></a>
-<span class="sourceLineNo">960</span>      // close the region now, and reopen again<a name="line.960"></a>
-<span class="sourceLineNo">961</span>      region.getTableDescriptor();<a name="line.961"></a>
-<span class="sourceLineNo">962</span>      region.getRegionInfo();<a name="line.962"></a>
-<span class="sourceLineNo">963</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.963"></a>
-<span class="sourceLineNo">964</span>      try {<a name="line.964"></a>
-<span class="sourceLineNo">965</span>        region = HRegion.openHRegion(region, null);<a name="line.965"></a>
-<span class="sourceLineNo">966</span>      } catch (WrongRegionException wre) {<a name="line.966"></a>
-<span class="sourceLineNo">967</span>        fail("Matching encoded region name should not have produced WrongRegionException");<a name="line.967"></a>
-<span class="sourceLineNo">968</span>      }<a name="line.968"></a>
-<span class="sourceLineNo">969</span><a name="line.969"></a>
-<span class="sourceLineNo">970</span>      // now check whether we have only one store file, the compacted one<a name="line.970"></a>
-<span class="sourceLineNo">971</span>      Collection&lt;HStoreFile&gt; sfs = region.getStore(family).getStorefiles();<a name="line.971"></a>
-<span class="sourceLineNo">972</span>      for (HStoreFile sf : sfs) {<a name="line.972"></a>
-<span class="sourceLineNo">973</span>        LOG.info(Objects.toString(sf.getPath()));<a name="line.973"></a>
-<span class="sourceLineNo">974</span>      }<a name="line.974"></a>
-<span class="sourceLineNo">975</span>      if (!mismatchedRegionName) {<a name="line.975"></a>
-<span class="sourceLineNo">976</span>        assertEquals(1, region.getStore(family).getStorefilesCount());<a name="line.976"></a>
-<span class="sourceLineNo">977</span>      }<a name="line.977"></a>
-<span class="sourceLineNo">978</span>      files = FSUtils.listStatus(fs, tmpDir);<a name="line.978"></a>
-<span class="sourceLineNo">979</span>      assertTrue("Expected to find 0 files inside " + tmpDir, files == null || files.length == 0);<a name="line.979"></a>
-<span class="sourceLineNo">980</span><a name="line.980"></a>
-<span class="sourceLineNo">981</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.981"></a>
-<span class="sourceLineNo">982</span>        Get get = new Get(Bytes.toBytes(i));<a name="line.982"></a>
-<span class="sourceLineNo">983</span>        Result result = region.get(get);<a name="line.983"></a>
-<span class="sourceLineNo">984</span>        byte[] value = result.getValue(family, Bytes.toBytes(i));<a name="line.984"></a>
-<span class="sourceLineNo">985</span>        assertArrayEquals(Bytes.toBytes(i), value);<a name="line.985"></a>
-<span class="sourceLineNo">986</span>      }<a name="line.986"></a>
-<span class="sourceLineNo">987</span>    } finally {<a name="line.987"></a>
-<span class="sourceLineNo">988</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.988"></a>
-<span class="sourceLineNo">989</span>      this.region = null;<a name="line.989"></a>
-<span class="sourceLineNo">990</span>      wals.close();<a name="line.990"></a>
-<span class="sourceLineNo">991</span>      CONF.setClass(HConstants.REGION_IMPL, HRegion.class, Region.class);<a name="line.991"></a>
-<span class="sourceLineNo">992</span>    }<a name="line.992"></a>
-<span class="sourceLineNo">993</span>  }<a name="line.993"></a>
-<span class="sourceLineNo">994</span><a name="line.994"></a>
-<span class="sourceLineNo">995</span>  @Test<a name="line.995"></a>
-<span class="sourceLineNo">996</span>  public void testFlushMarkers() throws Exception {<a name="line.996"></a>
-<span class="sourceLineNo">997</span>    // tests that flush markers are written to WAL and handled at recovered edits<a name="line.997"></a>
-<span class="sourceLineNo">998</span>    byte[] family = Bytes.toBytes("family");<a name="line.998"></a>
-<span class="sourceLineNo">999</span>    Path logDir = TEST_UTIL.getDataTestDirOnTestFS(method + ".log");<a name="line.999"></a>
-<span class="sourceLineNo">1000</span>    final Configuration walConf = new Configuration(TEST_UTIL.getConfiguration());<a name="line.1000"></a>
-<span class="sourceLineNo">1001</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.1001"></a>
-<span class="sourceLineNo">1002</span>    final WALFactory wals = new WALFactory(walConf, method);<a name="line.1002"></a>
-<span class="sourceLineNo">1003</span>    final WAL wal = wals.getWAL(RegionInfoBuilder.newBuilder(tableName).build());<a name="line.1003"></a>
-<span class="sourceLineNo">1004</span><a name="line.1004"></a>
-<span class="sourceLineNo">1005</span>    this.region = initHRegion(tableName, HConstants.EMPTY_START_ROW,<a name="line.1005"></a>
-<span class="sourceLineNo">1006</span>      HConstants.EMPTY_END_ROW, false, Durability.USE_DEFAULT, wal, family);<a name="line.1006"></a>
-<span class="sourceLineNo">1007</span>    try {<a name="line.1007"></a>
-<span class="sourceLineNo">1008</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.1008"></a>
-<span class="sourceLineNo">1009</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.1009"></a>
-<span class="sourceLineNo">1010</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.1010"></a>
-<span class="sourceLineNo">1011</span><a name="line.1011"></a>
-<span class="sourceLineNo">1012</span>      long maxSeqId = 3;<a name="line.1012"></a>
-<span class="sourceLineNo">1013</span>      long minSeqId = 0;<a name="line.1013"></a>
-<span class="sourceLineNo">1014</span><a name="line.1014"></a>
-<span class="sourceLineNo">1015</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.1015"></a>
-<span class="sourceLineNo">1016</span>        Put put = new Put(Bytes.toBytes(i));<a name="line.1016"></a>
-<span class="sourceLineNo">1017</span>        put.addColumn(family, Bytes.toBytes(i), Bytes.toBytes(i));<a name="line.1017"></a>
-<span class="sourceLineNo">1018</span>        region.put(put);<a name="line.1018"></a>
-<span class="sourceLineNo">1019</span>        region.flush(true);<a name="line.1019"></a>
-<span class="sourceLineNo">1020</span>      }<a name="line.1020"></a>
-<span class="sourceLineNo">1021</span><a name="line.1021"></a>
-<span class="sourceLineNo">1022</span>      // this will create a region with 3 files from flush<a name="line.1022"></a>
-<span class="sourceLineNo">1023</span>      assertEquals(3, region.getStore(family).getStorefilesCount());<a name="line.1023"></a>
-<span class="sourceLineNo">1024</span>      List&lt;String&gt; storeFiles = new ArrayList&lt;&gt;(3);<a name="line.1024"></a>
-<span class="sourceLineNo">1025</span>      for (HStoreFile sf : region.getStore(family).getStorefiles()) {<a name="line.1025"></a>
-<span class="sourceLineNo">1026</span>        storeFiles.add(sf.getPath().getName());<a name="line.1026"></a>
-<span class="sourceLineNo">1027</span>      }<a name="line.1027"></a>
-<span class="sourceLineNo">1028</span><a name="line.1028"></a>
-<span class="sourceLineNo">1029</span>      // now verify that the flush markers are written<a name="line.1029"></a>
-<span class="sourceLineNo">1030</span>      wal.shutdown();<a name="line.1030"></a>
-<span class="sourceLineNo">1031</span>      WAL.Reader reader = WALFactory.createReader(fs, AbstractFSWALProvider.getCurrentFileName(wal),<a name="line.1031"></a>
-<span class="sourceLineNo">1032</span>        TEST_UTIL.getConfiguration());<a name="line.1032"></a>
-<span class="sourceLineNo">1033</span>      try {<a name="line.1033"></a>
-<span class="sourceLineNo">1034</span>        List&lt;WAL.Entry&gt; flushDescriptors = new ArrayList&lt;&gt;();<a name="line.1034"></a>
-<span class="sourceLineNo">1035</span>        long lastFlushSeqId = -1;<a name="line.1035"></a>
-<span class="sourceLineNo">1036</span>        while (true) {<a name="line.1036"></a>
-<span class="sourceLineNo">1037</span>          WAL.Entry entry = reader.next();<a name="line.1037"></a>
-<span class="sourceLineNo">1038</span>          if (entry == null) {<a name="line.1038"></a>
-<span class="sourceLineNo">1039</span>            break;<a name="line.1039"></a>
-<span class="sourceLineNo">1040</span>          }<a name="line.1040"></a>
-<span class="sourceLineNo">1041</span>          Cell cell = entry.getEdit().getCells().get(0);<a name="line.1041"></a>
-<span class="sourceLineNo">1042</span>          if (WALEdit.isMetaEditFamily(cell)) {<a name="line.1042"></a>
-<span class="sourceLineNo">1043</span>            FlushDescriptor flushDesc = WALEdit.getFlushDescriptor(cell);<a name="line.1043"></a>
-<span class="sourceLineNo">1044</span>            assertNotNull(flushDesc);<a name="line.1044"></a>
-<span class="sourceLineNo">1045</span>            assertArrayEquals(tableName.getName(), flushDesc.getTableName().toByteArray());<a name="line.1045"></a>
-<span class="sourceLineNo">1046</span>            if (flushDesc.getAction() == FlushAction.START_FLUSH) {<a name="line.1046"></a>
-<span class="sourceLineNo">1047</span>              assertTrue(flushDesc.getFlushSequenceNumber() &gt; lastFlushSeqId);<a name="line.1047"></a>
-<span class="sourceLineNo">1048</span>            } else if (flushDesc.getAction() == FlushAction.COMMIT_FLUSH) {<a name="line.1048"></a>
-<span class="sourceLineNo">1049</span>              assertTrue(flushDesc.getFlushSequenceNumber() == lastFlushSeqId);<a name="line.1049"></a>
-<span class="sourceLineNo">1050</span>            }<a name="line.1050"></a>
-<span class="sourceLineNo">1051</span>            lastFlushSeqId = flushDesc.getFlushSequenceNumber();<a name="line.1051"></a>
-<span class="sourceLineNo">1052</span>            assertArrayEquals(regionName, flushDesc.getEncodedRegionName().toByteArray());<a name="line.1052"></a>
-<span class="sourceLineNo">1053</span>            assertEquals(1, flushDesc.getStoreFlushesCount()); //only one store<a name="line.1053"></a>
-<span class="sourceLineNo">1054</span>            StoreFlushDescriptor storeFlushDesc = flushDesc.getStoreFlushes(0);<a name="line.1054"></a>
-<span class="sourceLineNo">1055</span>            assertArrayEquals(family, storeFlushDesc.getFamilyName().toByteArray());<a name="line.1055"></a>
-<span class="sourceLineNo">1056</span>            assertEquals("family", storeFlushDesc.getStoreHomeDir());<a name="line.1056"></a>
-<span class="sourceLineNo">1057</span>            if (flushDesc.getAction() == FlushAction.START_FLUSH) {<a name="line.1057"></a>
-<span class="sourceLineNo">1058</span>              assertEquals(0, storeFlushDesc.getFlushOutputCount());<a name="line.1058"></a>
-<span class="sourceLineNo">1059</span>            } else {<a name="line.1059"></a>
-<span class="sourceLineNo">1060</span>              assertEquals(1, storeFlushDesc.getFlushOutputCount()); //only one file from flush<a name="line.1060"></a>
-<span class="sourceLineNo">1061</span>              assertTrue(storeFiles.contains(storeFlushDesc.getFlushOutput(0)));<a name="line.1061"></a>
-<span class="sourceLineNo">1062</span>            }<a name="line.1062"></a>
-<span class="sourceLineNo">1063</span><a name="line.1063"></a>
-<span class="sourceLineNo">1064</span>            flushDescriptors.add(entry);<a name="line.1064"></a>
-<span class="sourceLineNo">1065</span>          }<a name="line.1065"></a>
-<span class="sourceLineNo">1066</span>        }<a name="line.1066"></a>
-<span class="sourceLineNo">1067</span><a name="line.1067"></a>
-<span class="sourceLineNo">1068</span>        assertEquals(3 * 2, flushDescriptors.size()); // START_FLUSH and COMMIT_FLUSH per flush<a name="line.1068"></a>
-<span class="sourceLineNo">1069</span><a name="line.1069"></a>
-<span class="sourceLineNo">1070</span>        // now write those markers to the recovered edits again.<a name="line.1070"></a>
-<span class="sourceLineNo">1071</span><a name="line.1071"></a>
-<span class="sourceLineNo">1072</span>        Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.1072"></a>
-<span class="sourceLineNo">1073</span><a name="line.1073"></a>
-<span class="sourceLineNo">1074</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", 1000));<a name="line.1074"></a>
-<span class="sourceLineNo">1075</span>        fs.create(recoveredEdits);<a name="line.1075"></a>
-<span class="sourceLineNo">1076</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.1076"></a>
-<span class="sourceLineNo">1077</span><a name="line.1077"></a>
-<span class="sourceLineNo">1078</span>        for (WAL.Entry entry : flushDescriptors) {<a name="line.1078"></a>
-<span class="sourceLineNo">1079</span>          writer.append(entry);<a name="line.1079"></a>
-<span class="sourceLineNo">1080</span>        }<a name="line.1080"></a>
-<span class="sourceLineNo">1081</span>        writer.close();<a name="line.1081"></a>
-<span class="sourceLineNo">1082</span>      } finally {<a name="line.1082"></a>
-<span class="sourceLineNo">1083</span>        if (null != reader) {<a name="line.1083"></a>
-<span class="sourceLineNo">1084</span>          try {<a name="line.1084"></a>
-<span class="sourceLineNo">1085</span>            reader.close();<a name="line.1085"></a>
-<span class="sourceLineNo">1086</span>          } catch (IOException exception) {<a name="line.1086"></a>
-<span class="sourceLineNo">1087</span>            LOG.warn("Problem closing wal: " + exception.getMessage());<a name="line.1087"></a>
-<span class="sourceLineNo">1088</span>            LOG.debug("exception details", exception);<a name="line.1088"></a>
-<span class="sourceLineNo">1089</span>          }<a name="line.1089"></a>
-<span class="sourceLineNo">1090</span>        }<a name="line.1090"></a>
-<span class="sourceLineNo">1091</span>      }<a name="line.1091"></a>
-<span class="sourceLineNo">1092</span><a name="line.1092"></a>
-<span class="sourceLineNo">1093</span>      // close the region now, and reopen again<a name="line.1093"></a>
-<span class="sourceLineNo">1094</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.1094"></a>
-<span class="sourceLineNo">1095</span>      region = HRegion.openHRegion(region, null);<a name="line.1095"></a>
-<span class="sourceLineNo">1096</span><a name="line.1096"></a>
-<span class="sourceLineNo">1097</span>      // now check whether we have can read back the data from region<a name="line.1097"></a>
-<span class="sourceLineNo">1098</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.1098"></a>
-<span class="sourceLineNo">1099</span>        Get get = new Get(Bytes.toBytes(i));<a name="line.1099"></a>
-<span class="sourceLineNo">1100</span>        Result result = region.get(get);<a name="line.1100"></a>
-<span class="sourceLineNo">1101</span>        byte[] value = result.getValue(family, Bytes.toBytes(i));<a name="line.1101"></a>
-<span class="sourceLineNo">1102</span>        assertArrayEquals(Bytes.toBytes(i), value);<a name="line.1102"></a>
-<span class="sourceLineNo">1103</span>      }<a name="line.1103"></a>
-<span class="sourceLineNo">1104</span>    } finally {<a name="line.1104"></a>
-<span class="sourceLineNo">1105</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.1105"></a>
-<span class="sourceLineNo">1106</span>      this.region = null;<a name="line.1106"></a>
-<span class="sourceLineNo">1107</span>      wals.close();<a name="line.1107"></a>
-<span class="sourceLineNo">1108</span>    }<a name="line.1108"></a>
-<span class="sourceLineNo">1109</span>  }<a name="line.1109"></a>
-<span class="sourceLineNo">1110</span><a name="line.1110"></a>
-<span class="sourceLineNo">1111</span>  static class IsFlushWALMarker implements ArgumentMatcher&lt;WALEdit&gt; {<a name="line.1111"></a>
-<span class="sourceLineNo">1112</span>    volatile FlushAction[] actions;<a name="line.1112"></a>
-<span class="sourceLineNo">1113</span>    public IsFlushWALMarker(FlushAction... actions) {<a name="line.1113"></a>
-<span class="sourceLineNo">1114</span>      this.actions = actions;<a name="line.1114"></a>
-<span class="sourceLineNo">1115</span>    }<a name="line.1115"></a>
-<span class="sourceLineNo">1116</span>    @Override<a name="line.1116"></a>
-<span class="sourceLineNo">1117</span>    public boolean matches(WALEdit edit) {<a name="line.1117"></a>
-<span class="sourceLineNo">1118</span>      List&lt;Cell&gt; cells = edit.getCells();<a name="line.1118"></a>
-<span class="sourceLineNo">1119</span>      if (cells.isEmpty()) {<a name="line.1119"></a>
-<span class="sourceLineNo">1120</span>        return false;<a name="line.1120"></a>
-<span class="sourceLineNo">1121</span>      }<a name="line.1121"></a>
-<span class="sourceLineNo">1122</span>      if (WALEdit.isMetaEditFamily(cells.get(0))) {<a name="line.1122"></a>
-<span class="sourceLineNo">1123</span>        FlushDescriptor desc;<a name="line.1123"></a>
-<span class="sourceLineNo">1124</span>        try {<a name="line.1124"></a>
-<span class="sourceLineNo">1125</span>          desc = WALEdit.getFlushDescriptor(cells.get(0));<a name="line.1125"></a>
-<span class="sourceLineNo">1126</span>        } catch (IOException e) {<a name="line.1126"></a>
-<span class="sourceLineNo">1127</span>          LOG.warn(e.toString(), e);<a name="line.1127"></a>
-<span class="sourceLineNo">1128</span>          return false;<a name="line.1128"></a>
-<span class="sourceLineNo">1129</span>        }<a name="line.1129"></a>
-<span class="sourceLineNo">1130</span>        if (desc != null) {<a name="line.1130"></a>
-<span class="sourceLineNo">1131</span>          for (FlushAction action : actions) {<a name="line.1131"></a>
-<span class="sourceLineNo">1132</span>            if (desc.getAction() == action) {<a name="line.1132"></a>
-<span class="sourceLineNo">1133</span>              return true;<a name="line.1133"></a>
-<span class="sourceLineNo">1134</span>            }<a name="line.1134"></a>
-<span class="sourceLineNo">1135</span>          }<a name="line.1135"></a>
-<span class="sourceLineNo">1136</span>        }<a name="line.1136"></a>
-<span class="sourceLineNo">1137</span>      }<a name="line.1137"></a>
-<span class="sourceLineNo">1138</span>      return false;<a name="line.1138"></a>
-<span class="sourceLineNo">1139</span>    }<a name="line.1139"></a>
-<span class="sourceLineNo">1140</span>    public IsFlushWALMarker set(FlushAction... actions) {<a name="line.1140"></a>
-<span class="sourceLineNo">1141</span>      this.actions = actions;<a name="line.1141"></a>
-<span class="sourceLineNo">1142</span>      return this;<a name="line.1142"></a>
-<span class="sourceLineNo">1143</span>    }<a name="line.1143"></a>
-<span class="sourceLineNo">1144</span>  }<a name="line.1144"></a>
-<span class="sourceLineNo">1145</span><a name="line.1145"></a>
-<span class="sourceLineNo">1146</span>  @Test<a name="line.1146"></a>
-<span class="sourceLineNo">1147</span>  public void testFlushMarkersWALFail() throws Exception {<a name="line.1147"></a>
-<span class="sourceLineNo">1148</span>    // test the cases where the WAL append for flush markers fail.<a name="line.1148"></a>
-<span class="sourceLineNo">1149</span>    byte[] family = Bytes.toBytes("family");<a name="line.1149"></a>
-<span class="sourceLineNo">1150</span><a name="line.1150"></a>
-<span class="sourceLineNo">1151</span>    // spy an actual WAL implementation to throw exception (was not able to mock)<a name="line.1151"></a>
-<span class="sourceLineNo">1152</span>    Path logDir = TEST_UTIL.getDataTestDirOnTestFS(method + "log");<a name="line.1152"></a>
-<span class="sourceLineNo">1153</span><a name="line.1153"></a>
-<span class="sourceLineNo">1154</span>    final Configuration walConf = new Configuration(TEST_UTIL.getConfiguration());<a name="line.1154"></a>
-<span class="sourceLineNo">1155</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.1155"></a>
-<span class="sourceLineNo">1156</span>    // Make up a WAL that we can manipulate at append time.<a name="line.1156"></a>
-<span class="sourceLineNo">1157</span>    class FailAppendFlushMarkerWAL extends FSHLog {<a name="line.1157"></a>
-<span class="sourceLineNo">1158</span>      volatile FlushAction [] flushActions = null;<a name="line.1158"></a>
-<span class="sourceLineNo">1159</span><a name="line.1159"></a>
-<span class="sourceLineNo">1160</span>      public FailAppendFlushMarkerWAL(FileSystem fs, Path root, String logDir, Configuration conf)<a name="line.1160"></a>
-<span class="sourceLineNo">1161</span>      throws IOException {<a name="line.1161"></a>
-<span class="sourceLineNo">1162</span>        super(fs, root, logDir, conf);<a name="line.1162"></a>
-<span class="sourceLineNo">1163</span>      }<a name="line.1163"></a>
-<span class="sourceLineNo">1164</span><a name="line.1164"></a>
-<span class="sourceLineNo">1165</span>      @Override<a name="line.1165"></a>
-<span class="sourceLineNo">1166</span>      protected Writer createWriterInstance(Path path) throws IOException {<a name="line.1166"></a>
-<span class="sourceLineNo">1167</span>        final Writer w = super.createWriterInstance(path);<a name="line.1167"></a>
-<span class="sourceLineNo">1168</span>        return new Writer() {<a name="line.1168"></a>
-<span class="sourceLineNo">1169</span>          @Override<a name="line.1169"></a>
-<span class="sourceLineNo">1170</span>          public void close() throws IOException {<a name="line.1170"></a>
-<span class="sourceLineNo">1171</span>            w.close();<a name="line.1171"></a>
-<span class="sourceLineNo">1172</span>          }<a name="line.1172"></a>
-<span class="sourceLineNo">1173</span><a name="line.1173"></a>
-<span class="sourceLineNo">1174</span>          @Override<a name="line.1174"></a>
-<span class="sourceLineNo">1175</span>          public void sync(boolean forceSync) throws IOException {<a name="line.1175"></a>
-<span class="sourceLineNo">1176</span>            w.sync(forceSync);<a name="line.1176"></a>
-<span class="sourceLineNo">1177</span>          }<a name="line.1177"></a>
-<span class="sourceLineNo">1178</span><a name="line.1178"></a>
-<span class="sourceLineNo">1179</span>          @Override<a name="line.1179"></a>
-<span class="sourceLineNo">1180</span>          public void append(Entry entry) throws IOException {<a name="line.1180"></a>
-<span class="sourceLineNo">1181</span>            List&lt;Cell&gt; cells = entry.getEdit().getCells();<a name="line.1181"></a>
-<span class="sourceLineNo">1182</span>            if (WALEdit.isMetaEditFamily(cells.get(0))) {<a name="line.1182"></a>
-<span class="sourceLineNo">1183</span>              FlushDescriptor desc = WALEdit.getFlushDescriptor(cells.get(0));<a name="line.1183"></a>
-<span class="sourceLineNo">1184</span>              if (desc != null) {<a name="line.1184"></a>
-<span class="sourceLineNo">1185</span>                for (FlushAction flushAction: flushActions) {<a name="line.1185"></a>
-<span class="sourceLineNo">1186</span>                  if (desc.getAction().equals(flushAction)) {<a name="line.1186"></a>
-<span class="sourceLineNo">1187</span>                    throw new IOException("Failed to append flush marker! " + flushAction);<a name="line.1187"></a>
-<span class="sourceLineNo">1188</span>                  }<a name="line.1188"></a>
-<span class="sourceLineNo">1189</span>                }<a name="line.1189"></a>
-<span class="sourceLineNo">1190</span>              }<a name="line.1190"></a>
-<span class="sourceLineNo">1191</span>            }<a name="line.1191"></a>
-<span class="sourceLineNo">1192</span>            w.append(entry);<a name="line.1192"></a>
-<span class="sourceLineNo">1193</span>          }<a name="line.1193"></a>
-<span class="sourceLineNo">1194</span><a name="line.1194"></a>
-<span class="sourceLineNo">1195</span>          @Override<a name="line.1195"></a>
-<span class="sourceLineNo">1196</span>          public long getLength() {<a name="line.1196"></a>
-<span class="sourceLineNo">1197</span>            return w.getLength();<a name="line.1197"></a>
-<span class="sourceLineNo">1198</span>          }<a name="line.1198"></a>
-<span class="sourceLineNo">1199</span>        };<a name="line.1199"></a>
-<span class="sourceLineNo">1200</span>      }<a name="line.1200"></a>
-<span class="sourceLineNo">1201</span>    }<a name="line.1201"></a>
-<span class="sourceLineNo">1202</span>    FailAppendFlushMarkerWAL wal =<a name="line.1202"></a>
-<span class="sourceLineNo">1203</span>      new FailAppendFlushMarkerWAL(FileSystem.get(walConf), FSUtils.getRootDir(walConf),<a name="line.1203"></a>
-<span class="sourceLineNo">1204</span>        method, walConf);<a name="line.1204"></a>
-<span class="sourceLineNo">1205</span>    wal.init();<a name="line.1205"></a>
-<span class="sourceLineNo">1206</span>    this.region = initHRegion(tableName, HConstants.EMPTY_START_ROW,<a name="line.1206"></a>
-<span class="sourceLineNo">1207</span>      HConstants.EMPTY_END_ROW, false, Durability.USE_DEFAULT, wal, family);<a name="line.1207"></a>
-<span class="sourceLineNo">1208</span>    int i = 0;<a name="line.1208"></a>
-<span class="sourceLineNo">1209</span>    Put put = new Put(Bytes.toBytes(i));<a name="line.1209"></a>
-<span class="sourceLineNo">1210</span>    put.setDurability(Durability.SKIP_WAL); // have to skip mocked wal<a name="line.1210"></a>
-<span class="sourceLineNo">1211</span>    put.addColumn(family, Bytes.toBytes(i), Bytes.toBytes(i));<a name="line.1211"></a>
-<span class="sourceLineNo">1212</span>    region.put(put);<a name="line.1212"></a>
-<span class="sourceLineNo">1213</span><a name="line.1213"></a>
-<span class="sourceLineNo">1214</span>    // 1. Test case where START_FLUSH throws exception<a name="line.1214"></a>
-<span class="sourceLineNo">1215</span>    wal.flushActions = new FlushAction [] {FlushAction.START_FLUSH};<a name="line.1215"></a>
-<span class="sourceLineNo">1216</span><a name="line.1216"></a>
-<span class="sourceLineNo">1217</span>    // start cache flush will throw exception<a name="line.1217"></a>
-<span class="sourceLineNo">1218</span>    try {<a name="line.1218"></a>
-<span class="sourceLineNo">1219</span>      region.flush(true);<a name="line.1219"></a>
-<span class="sourceLineNo">1220</span>      fail("This should have thrown exception");<a name="line.1220"></a>
-<span class="sourceLineNo">1221</span>    } catch (DroppedSnapshotException unexpected) {<a name="line.1221"></a>
-<span class="sourceLineNo">1222</span>      // this should not be a dropped snapshot exception. Meaning that RS will not abort<a name="line.1222"></a>
-<span class="sourceLineNo">1223</span>      throw unexpected;<a name="line.1223"></a>
-<span class="sourceLineNo">1224</span>    } catch (IOException expected) {<a name="line.1224"></a>
-<span class="sourceLineNo">1225</span>      // expected<a name="line.1225"></a>
-<span class="sourceLineNo">1226</span>    }<a name="line.1226"></a>
-<span class="sourceLineNo">1227</span>    // The WAL is hosed now. It has two edits appended. We cannot roll the log without it<a name="line.1227"></a>
-<span class="sourceLineNo">1228</span>    // throwing a DroppedSnapshotException to force an abort. Just clean up the mess.<a name="line.1228"></a>
-<span class="sourceLineNo">1229</span>    region.close(true);<a name="line.1229"></a>
-<span class="sourceLineNo">1230</span>    wal.close();<a name="line.1230"></a>
-<span class="sourceLineNo">1231</span><a name="line.1231"></a>
-<span class="sourceLineNo">1232</span>    // 2. Test case where START_FLUSH succeeds but COMMIT_FLUSH will throw exception<a name="line.1232"></a>
-<span class="sourceLineNo">1233</span>    wal.flushActions = new FlushAction [] {FlushAction.COMMIT_FLUSH};<a name="line.1233"></a>
-<span class="sourceLineNo">1234</span>    wal = new FailAppendFlushMarkerWAL(FileSystem.get(walConf), FSUtils.getRootDir(walConf),<a name="line.1234"></a>
-<span class="sourceLineNo">1235</span>          method, walConf);<a name="line.1235"></a>
-<span class="sourceLineNo">1236</span>    wal.init();<a name="line.1236"></a>
-<span class="sourceLineNo">1237</span>    this.region = initHRegion(tableName, HConstants.EMPTY_START_ROW,<a name="line.1237"></a>
-<span class="sourceLineNo">1238</span>      HConstants.EMPTY_END_ROW, false, Durability.USE_DEFAULT, wal, family);<a name="line.1238"></a>
-<span class="sourceLineNo">1239</span>    region.put(put);<a name="line.1239"></a>
-<span class="sourceLineNo">1240</span><a name="line.1240"></a>
-<span class="sourceLineNo">1241</span>    // 3. Test case where ABORT_FLUSH will throw exception.<a name="line.1241"></a>
-<span class="sourceLineNo">1242</span>    // Even if ABORT_FLUSH throws exception, we should not fail with IOE, but continue with<a name="line.1242"></a>
-<span class="sourceLineNo">1243</span>    // DroppedSnapshotException. Below COMMMIT_FLUSH will cause flush to abort<a name="line.1243"></a>
-<span class="sourceLineNo">1244</span>    wal.flushActions = new FlushAction [] {FlushAction.COMMIT_FLUSH, FlushAction.ABORT_FLUSH};<a name="line.1244"></a>
-<span class="sourceLineNo">1245</span><a name="line.1245"></a>
-<span class="sourceLineNo">1246</span>    try {<a name="line.1246"></a>
-<span class="sourceLineNo">1247</span>      region.flush(true);<a name="line.1247"></a>
-<span class="sourceLineNo">1248</span>      fail("This should have thrown exception");<a name="line.1248"></a>
-<span class="sourceLineNo">1249</span>    } catch (DroppedSnapshotException expected) {<a name="line.1249"></a>
-<span class="sourceLineNo">1250</span>      // we expect this exception, since we were able to write the snapshot, but failed to<a name="line.1250"></a>
-<span class="sourceLineNo">1251</span>      // write the flush marker to WAL<a name="line.1251"></a>
-<span class="sourceLineNo">1252</span>    } catch (IOException unexpected) {<a name="line.1252"></a>
-<span class="sourceLineNo">1253</span>      throw unexpected;<a name="line.1253"></a>
-<span class="sourceLineNo">1254</span>    }<a name="line.1254"></a>
-<span class="sourceLineNo">1255</span>  }<a name="line.1255"></a>
-<span class="sourceLineNo">1256</span><a name="line.1256"></a>
-<span class="sourceLineNo">1257</span>  @Test<a name="line.1257"></a>
-<span class="sourceLineNo">1258</span>  public void testGetWhileRegionClose() throws IOException {<a name="line.1258"></a>
-<span class="sourceLineNo">1259</span>    Configuration hc = initSplit();<a name="line.1259"></a>
-<span class="sourceLineNo">1260</span>    int numRows = 100;<a name="line.1260"></a>
-<span class="sourceLineNo">1261</span>    byte[][] families = { fam1, fam2, fam3 };<a name="line.1261"></a>
-<span class="sourceLineNo">1262</span><a name="line.1262"></a>
-<span class="sourceLineNo">1263</span>    // Setting up region<a name="line.1263"></a>
-<span class="sourceLineNo">1264</span>    this.region = initHRegion(tableName, method, hc, families);<a name="line.1264"></a>
-<span class="sourceLineNo">1265</span>    // Put data in region<a name="line.1265"></a>
-<span class="sourceLineNo">1266</span>    final int startRow = 100;<a name="line.1266"></a>
-<span class="sourceLineNo">1267</span>    putData(startRow, numRows, qual1, families);<a name="line.1267"></a>
-<span class="sourceLineNo">1268</span>    putData(startRow, numRows, qual2, families);<a name="line.1268"></a>
-<span class="sourceLineNo">1269</span>    putData(startRow, numRows, qual3, families);<a name="line.1269"></a>
-<span class="sourceLineNo">1270</span>    final AtomicBoolean done = new AtomicBoolean(false);<a name="line.1270"></a>
-<span class="sourceLineNo">1271</span>    final AtomicInteger gets = new AtomicInteger(0);<a name="line.1271"></a>
-<span class="sourceLineNo">1272</span>    GetTillDoneOrException[] threads = new GetTillDoneOrException[10];<a name="line.1272"></a>
-<span class="sourceLineNo">1273</span>    try {<a name="line.1273"></a>
-<span class="sourceLineNo">1274</span>      // Set ten threads running concurrently getting from the region.<a name="line.1274"></a>
-<span class="sourceLineNo">1275</span>      for (int i = 0; i &lt; threads.length / 2; i++) {<a name="line.1275"></a>
-<span class="sourceLineNo">1276</span>        threads[i] = new GetTillDoneOrException(i, Bytes.toBytes("" + startRow), done, gets);<a name="line.1276"></a>
-<span class="sourceLineNo">1277</span>        threads[i].setDaemon(true);<a name="line.1277"></a>
-<span class="sourceLineNo">1278</span>        threads[i].start();<a name="line.1278"></a>
-<span class="sourceLineNo">1279</span>      }<a name="line.1279"></a>
-<span class="sourceLineNo">1280</span>      // Artificially make the condition by setting closing flag explicitly.<a name="line.1280"></a>
-<span class="sourceLineNo">1281</span>      // I can't make the issue happen with a call to region.close().<a name="line.1281"></a>
-<span class="sourceLineNo">1282</span>      this.region.closing.set(true);<a name="line.1282"></a>
-<span class="sourceLineNo">1283</span>      for (int i = threads.length / 2; i &lt; threads.length; i++) {<a name="line.1283"></a>
-<span class="sourceLineNo">1284</span>        threads[i] = new GetTillDoneOrException(i, Bytes.toBytes("" + startRow), done, gets);<a name="line.1284"></a>
-<span class="sourceLineNo">1285</span>        threads[i].setDaemon(true);<a name="line.1285"></a>
-<span class="sourceLineNo">1286</span>        threads[i].start();<a name="line.1286"></a>
-<span class="sourceLineNo">1287</span>      }<a name="line.1287"></a>
-<span class="sourceLineNo">1288</span>    } finally {<a name="line.1288"></a>
-<span class="sourceLineNo">1289</span>      if (this.region != null) {<a name="line.1289"></a>
-<span class="sourceLineNo">1290</span>        HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.1290"></a>
-<span class="sourceLineNo">1291</span>        this.region = null;<a name="line.1291"></a>
-<span class="sourceLineNo">1292</span>      }<a name="line.1292"></a>
-<span class="sourceLineNo">1293</span>    }<a name="line.1293"></a>
-<span class="sourceLineNo">1294</span>    done.set(true);<a name="line.1294"></a>
-<span class="sourceLineNo">1295</span>    for (GetTillDoneOrException t : threads) {<a name="line.1295"></a>
-<span class="sourceLineNo">1296</span>      try {<a name="line.1296"></a>
-<span class="sourceLineNo">1297</span>        t.join();<a name="line.1297"></a>
-<span class="sourceLineNo">1298</span>      } catch (InterruptedException e) {<a name="line.1298"></a>
-<span class="sourceLineNo">1299</span>        e.printStackTrace();<a name="line.1299"></a>
-<span class="sourceLineNo">1300</span>      }<a name="line.1300"></a>
-<span class="sourceLineNo">1301</span>      if (t.e != null) {<a name="line.1301"></a>
-<span class="sourceLineNo">1302</span>        LOG.info("Exception=" + t.e);<a name="line.1302"></a>
-<span class="sourceLineNo">1303</span>        assertFalse("Found a NPE in " + t.getName(), t.e instanceof NullPointerException);<a name="line.1303"></a>
-<span class="sourceLineNo">1304</span>      }<a name="line.1304"></a>
-<span class="sourceLineNo">1305</span>    }<a name="line.1305"></a>
-<span class="sourceLineNo">1306</span>  }<a name="line.1306"></a>
-<span class="sourceLineNo">1307</span><a name="line.1307"></a>
-<span class="sourceLineNo">1308</span>  /*<a name="line.1308"></a>
-<span class="sourceLineNo">1309</span>   * Thread that does get on single row until 'done' flag is flipped. If an<a name="line.1309"></a>
-<span class="sourceLineNo">1310</span>   * exception causes us to fail, it records it.<a name="line.1310"></a>
-<span class="sourceLineNo">1311</span>   */<a name="line.1311"></a>
-<span class="sourceLineNo">1312</span>  class GetTillDoneOrException extends Thread {<a name="line.1312"></a>
-<span class="sourceLineNo">1313</span>    private final Get g;<a name="line.1313"></a>
-<span class="sourceLineNo">1314</span>    private final AtomicBoolean done;<a name="line.1314"></a>
-<span class="sourceLineNo">1315</span>    private final AtomicInteger count;<a name="line.1315"></a>
-<span class="sourceLineNo">1316</span>    private Exception e;<a name="line.1316"></a>
-<span class="sourceLineNo">1317</span><a name="line.1317"></a>
-<span class="sourceLineNo">1318</span>    GetTillDoneOrException(final int i, final byte[] r, final AtomicBoolean d,<a name="line.1318"></a>
-<span class="sourceLineNo">1319</span>        final AtomicInteger c) {<a name="line.1319"></a>
-<span class="sourceLineNo">1320</span>      super("getter." + i);<a name="line.1320"></a>
-<span class="sourceLineNo">1321</span>      this.g = new Get(r);<a name="line.1321"></a>
-<span class="sourceLineNo">1322</span>      this.done = d;<a name="line.1322"></a>
-<span class="sourceLineNo">1323</span>      this.count = c;<a name="line.1323"></a>
-<span class="sourceLineNo">1324</span>    }<a name="line.1324"></a>
-<span class="sourceLineNo">1325</span><a name="line.1325"></a>
-<span class="sourceLineNo">1326</span>    @Override<a name="line.1326"></a>
-<span class="sourceLineNo">1327</span>    public void run() {<a name="line.1327"></a>
-<span class="sourceLineNo">1328</span>      while (!this.done.get()) {<a name="line.1328"></a>
-<span class="sourceLineNo">1329</span>        try {<a name="line.1329"></a>
-<span class="sourceLineNo">1330</span>          assertTrue(region.get(g).size() &gt; 0);<a name="line.1330"></a>
-<span class="sourceLineNo">1331</span>          this.count.incrementAndGet();<a name="line.1331"></a>
-<span class="sourceLineNo">1332</span>        } catch (Exception e) {<a name="line.1332"></a>
-<span class="sourceLineNo">1333</span>          this.e = e;<a name="line.1333"></a>
-<span class="sourceLineNo">1334</span>          break;<a name="line.1334"></a>
-<span class="sourceLineNo">1335</span>        }<a name="line.1335"></a>
-<span class="sourceLineNo">1336</span>      }<a name="line.1336"></a>
-<span class="sourceLineNo">1337</span>    }<a name="line.1337"></a>
-<span class="sourceLineNo">1338</span>  }<a name="line.1338"></a>
-<span class="sourceLineNo">1339</span><a name="line.1339"></a>
-<span class="sourceLineNo">1340</span>  /*<a name="line.1340"></a>
-<span class="sourceLineNo">1341</span>   * An involved filter test. Has multiple column families and deletes in mix.<a name="line.1341"></a>
-<span class="sourceLineNo">1342</span>   */<a name="line.1342"></a>
-<span class="sourceLineNo">1343</span>  @Test<a name="line.1343"></a>
-<span class="sourceLineNo">1344</span>  public void testWeirdCacheBehaviour() throws Exception {<a name="line.1344"></a>
-<span class="sourceLineNo">1345</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.1345"></a>
-<span class="sourceLineNo">1346</span>    byte[][] FAMILIES = new byte[][] { Bytes.toBytes("trans-blob"), Bytes.toBytes("trans-type"),<a name="line.1346"></a>
-<span class="sourceLineNo">1347</span>        Bytes.toBytes("trans-date"), Bytes.toBytes("trans-tags"), Bytes.toBytes("trans-group") };<a name="line.1347"></a>
-<span class="sourceLineNo">1348</span>    this.region = initHRegion(tableName, method, CONF, FAMILIES);<a name="line.1348"></a>
-<span class="sourceLineNo">1349</span>    String value = "this is the value";<a name="line.1349"></a>
-<span class="sourceLineNo">1350</span>    String value2 = "this is some other value";<a name="line.1350"></a>
-<span class="sourceLineNo">1351</span>    String keyPrefix1 = "prefix1";<a name="line.1351"></a>
-<span class="sourceLineNo">1352</span>    String keyPrefix2 = "prefix2";<a name="line.1352"></a>
-<span class="sourceLineNo">1353</span>    String keyPrefix3 = "prefix3";<a name="line.1353"></a>
-<span class="sourceLineNo">1354</span>    putRows(this.region, 3, value, keyPrefix1);<a name="line.1354"></a>
-<span class="sourceLineNo">1355</span>    putRows(this.region, 3, value, keyPrefix2);<a name="line.1355"></a>
-<span class="sourceLineNo">1356</span>    putRows(this.region, 3, value, keyPrefix3);<a name="line.1356"></a>
-<span class="sourceLineNo">1357</span>    putRows(this.region, 3, value2, keyPrefix1);<a name="line.1357"></a>
-<span class="sourceLineNo">1358</span>    putRows(this.region, 3, value2, keyPrefix2);<a name="line.1358"></a>
-<span class="sourceLineNo">1359</span>    putRows(this.region, 3, value2, keyPrefix3);<a name="line.1359"></a>
-<span class="sourceLineNo">1360</span>    System.out.println("Checking values for key: " + keyPrefix1);<a name="line.1360"></a>
-<span class="sourceLineNo">1361</span>    assertEquals("Got back incorrect number of rows from scan", 3,<a name="line.1361"></a>
-<span class="sourceLineNo">1362</span>        getNumberOfRows(keyPrefix1, value2, this.region));<a name="line.1362"></a>
-<span class="sourceLineNo">1363</span>    System.out.println("Checking values for key: " + keyPrefix2);<a name="line.1363"></a>
-<span class="sourceLineNo">1364</span>    assertEquals("Got back incorrect number of rows from scan", 3,<a name="line.1364"></a>
-<span class="sourceLineNo">1365</span>        getNumberOfRows(keyPrefix2, value2, this.region));<a name="line.1365"></a>
-<span class="sourceLineNo">1366</span>    System.out.println("Checking values for key: " + keyPrefix3);<a name="line.1366"></a>
-<span class="sourceLineNo">1367</span>    assertEquals("Got back incorrect number of rows from scan", 3,<a name="line.1367"></a>
-<span class="sourceLineNo">1368</span>        getNumberOfRows(keyPrefix3, value2, this.region));<a name="line.1368"></a>
-<span class="sourceLineNo">1369</span>    deleteColumns(this.region, value2, keyPrefix1);<a name="line.1369"></a>
-<span class="sourceLineNo">1370</span>    deleteColumns(this.region, value2, keyPrefix2);<a name="line.1370"></a>
-<span class="sourceLineNo">1371</span>    deleteColumns(this.region, value2, keyPrefix3);<a name="line.1371"></a>
-<span class="sourceLineNo">1372</span>    System.out.println("Starting important checks.....");<a name="line.1372"></a>
-<span class="sourceLineNo">1373</span>    assertEquals("Got back incorrect number of rows from scan: " + keyPrefix1, 0,<a name="line.1373"></a>
-<span class="sourceLineNo">1374</span>        getNumberOfRows(keyPrefix1, value2, this.region));<a name="line.1374"></a>
-<span class="sourceLineNo">1375</span>    assertEquals("Got back incorrect number of rows from scan: " + keyPrefix2, 0,<a name="line.1375"></a>
-<span class="sourceLineNo">1376</span>        getNumberOfRows(keyPrefix2, value2, this.region));<a name="line.1376"></a>
-<span class="sourceLineNo">1377</span>    assertEquals("Got back incorrect number of rows from scan: " + keyPrefix3, 0,<a name="line.1377"></a>
-<span class="sourceLineNo">1378</span>        getNumberOfRows(keyPrefix3, value2, this.region));<a name="line.1378"></a>
-<span class="sourceLineNo">1379</span>  }<a name="line.1379"></a>
-<span class="sourceLineNo">1380</span><a name="line.1380"></a>
-<span class="sourceLineNo">1381</span>  @Test<a name="line.1381"></a>
-<span class="sourceLineNo">1382</span>  public void testAppendWithReadOnlyTable() throws Exception {<a name="line.1382"></a>
-<span class="sourceLineNo">1383</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.1383"></a>
-<span class="sourceLineNo">1384</span>    this.region = initHRegion(tableName, method, CONF, true, Bytes.toBytes("somefamily"));<a name="line.1384"></a>
-<span class="sourceLineNo">1385</span>    boolean exceptionCaught = false;<a name="line.1385"></a>
-<span class="sourceLineNo">1386</span>    Append append = new Append(Bytes.toBytes("somerow"));<a name="line.1386"></a>
-<span class="sourceLineNo">1387</span>    append.setDurability(Durability.SKIP_WAL);<a name="line.1387"></a>
-<span class="sourceLineNo">1388</span>    append.addColumn(Bytes.toBytes("somefamily"), Bytes.toBytes("somequalifier"),<a name="line.1388"></a>
-<span class="sourceLineNo">1389</span>        Bytes.toBytes("somevalue"));<a name="line.1389"></a>
-<span class="sourceLineNo">1390</span>    try {<a name="line.1390"></a>
-<span class="sourceLineNo">1391</span>      region.append(append);<a name="line.1391"></a>
-<span class="sourceLineNo">1392</span>    } catch (IOException e) {<a name="line.1392"></a>
-<span class="sourceLineNo">1393</span>      exceptionCaught = true;<a name="line.1393"></a>
-<span class="sourceLineNo">1394</span>    }<a name="line.1394"></a>
-<span class="sourceLineNo">1395</span>    assertTrue(exceptionCaught == true);<a name="line.1395"></a>
-<span class="sourceLineNo">1396</span>  }<a name="line.1396"></a>
-<span class="sourceLineNo">1397</span><a name="line.1397"></a>
-<span class="sourceLineNo">1398</span>  @Test<a name="line.1398"></a>
-<span class="sourceLineNo">1399</span>  public void testIncrWithReadOnlyTable() throws Exception {<a name="line.1399"></a>
-<span class="sourceLineNo">1400</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.1400"></a>
-<span class="sourceLineNo">1401</span>    this.region = initHRegion(tableName, method, CONF, true, Bytes.toBytes("somefamily"));<a name="line.1401"></a>
-<span class="sourceLineNo">1402</span>    boolean exceptionCaught = false;<a name="line.1402"></a>
-<span class="sourceLineNo">1403</span>    Increment inc = new Increment(Bytes.toBytes("somerow"));<a name="line.1403"></a>
-<span class="sourceLineNo">1404</span>    inc.setDurability(Durability.SKIP_WAL);<a name="line.1404"></a>
-<span class="sourceLineNo">1405</span>    inc.addColumn(Bytes.toBytes("somefamily"), Bytes.toBytes("somequalifier"), 1L);<a name="line.1405"></a>
-<span class="sourceLineNo">1406</span>    try {<a name="line.1406"></a>
-<span class="sourceLineNo">1407</span>      region.increment(inc);<a name="line.1407"></a>
-<span class="sourceLineNo">1408</span>    } catch (IOException e) {<a name="line.1408"></a>
-<span class="sourceLineNo">1409</span>      exceptionCaught = true;<a name="line.1409"></a>
-<span class="sourceLineNo">1410</span>    }<a name="line.1410"></a>
-<span class="sourceLineNo">1411</span>    assertTrue(exceptionCaught == true);<a name="line.1411"></a>
-<span class="sourceLineNo">1412</span>  }<a name="line.1412"></a>
-<span class="sourceLineNo">1413</span><a name="line.1413"></a>
-<span class="sourceLineNo">1414</span>  private void deleteColumns(HRegion r, String value, String keyPrefix) throws IOException {<a name="line.1414"></a>
-<span class="sourceLineNo">1415</span>    InternalScanner scanner = buildScanner(keyPrefix, value, r);<a name="line.1415"></a>
-<span class="sourceLineNo">1416</span>    int count = 0;<a name="line.1416"></a>
-<span class="sourceLineNo">1417</span>    boolean more = false;<a name="line.1417"></a>
-<span class="sourceLineNo">1418</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.1418"></a>
-<span class="sourceLineNo">1419</span>    do {<a name="line.1419"></a>
-<span class="sourceLineNo">1420</span>      more = scanner.next(results);<a name="line.1420"></a>
-<span class="sourceLineNo">1421</span>      if (results != null &amp;&amp; !results.isEmpty())<a name="line.1421"></a>
-<span class="sourceLineNo">1422</span>        count++;<a name="line.1422"></a>
-<span class="sourceLineNo">1423</span>      else<a name="line.1423"></a>
-<span class="sourceLineNo">1424</span>        break;<a name="line.1424"></a>
-<span class="sourceLineNo">1425</span>      Delete delete = new Delete(CellUtil.cloneRow(results.get(0)));<a name="line.1425"></a>
-<span class="sourceLineNo">1426</span>      delete.addColumn(Bytes.toBytes("trans-tags"), Bytes.toBytes("qual2"));<a name="line.1426"></a>
-<span class="sourceLineNo">1427</span>      r.delete(delete);<a name="line.1427"></a>
-<span class="sourceLineNo">1428</span>      results.clear();<a name="line.1428"></a>
-<span class="sourceLineNo">1429</span>    } while (more);<a name="line.1429"></a>
-<span class="sourceLineNo">1430</span>    assertEquals("Did not perform correct number of deletes", 3, count);<a name="line.1430"></a>
-<span class="sourceLineNo">1431</span>  }<a name="line.1431"></a>
-<span class="sourceLineNo">1432</span><a name="line.1432"></a>
-<span class="sourceLineNo">1433</span>  private int getNumberOfRows(String keyPrefix, String value, HRegion r) throws Exception {<a name="line.1433"></a>
-<span class="sourceLineNo">1434</span>    InternalScanner resultScanner = buildScanner(keyPrefix, value, r);<a name="line.1434"></a>
-<span class="sourceLineNo">1435</span>    int numberOfResults = 0;<a name="line.1435"></a>
-<span class="sourceLineNo">1436</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.1436"></a>
-<span class="sourceLineNo">1437</span>    boolean more = false;<a name="line.1437"></a>
-<span class="sourceLineNo">1438</span>    do {<a name="line.1438"></a>
-<span class="sourceLineNo">1439</span>      more = resultScanner.next(results);<a name="line.1439"></a>
-<span class="sourceLineNo">1440</span>      if (results != null &amp;&amp; !results.isEmpty())<a name="line.1440"></a>
-<span class="sourceLineNo">1441</span>        numberOfResults++;<a name="line.1441"></a>
-<span class="sourceLineNo">1442</span>      else<a name="line.1442"></a>
-<span class="sourceLineNo">1443</span>        break;<a name="line.1443"></a>
-<span class="sourceLineNo">1444</span>      for (Cell kv : results) {<a name="line.1444"></a>
-<span class="sourceLineNo">1445</span>        System.out.println("kv=" + kv.toString() + ", " + Bytes.toString(CellUtil.cloneValue(kv)));<a name="line.1445"></a>
-<span class="sourceLineNo">1446</span>      }<a name="line.1446"></a>
-<span class="sourceLineNo">1447</span>      results.clear();<a name="line.1447"></a>
-<span class="sourceLineNo">1448</span>    } while (more);<a name="line.1448"></a>
-<span class="sourceLineNo">1449</span>    return numberOfResults;<a name="line.1449"></a>
-<span class="sourceLineNo">1450</span>  }<a name="line.1450"></a>
-<span class="sourceLineNo">1451</span><a name="line.1451"></a>
-<span class="sourceLineNo">1452</span>  private InternalScanner buildScanner(String keyPrefix, String value, HRegion r)<a name="line.1452"></a>
-<span class="sourceLineNo">1453</span>      throws IOException {<a name="line.1453"></a>
-<span class="sourceLineNo">1454</span>    // Defaults FilterList.Operator.MUST_PASS_ALL.<a name="line.1454"></a>
-<span class="sourceLineNo">1455</span>    FilterList allFilters = new FilterList();<a name="line.1455"></a>
-<span class="sourceLineNo">1456</span>    allFilters.addFilter(new PrefixFilter(Bytes.toBytes(keyPrefix)));<a name="line.1456"></a>
-<span class="sourceLineNo">1457</span>    // Only return rows where this column value exists in the row.<a name="line.1457"></a>
-<span class="sourceLineNo">1458</span>    SingleColumnValueFilter filter = new SingleColumnValueFilter(Bytes.toBytes("trans-tags"),<a name="line.1458"></a>
-<span class="sourceLineNo">1459</span>        Bytes.toBytes("qual2"), CompareOperator.EQUAL, Bytes.toBytes(value));<a name="line.1459"></a>
-<span class="sourceLineNo">1460</span>    filter.setFilterIfMissing(true);<a name="line.1460"></a>
-<span class="sourceLineNo">1461</span>    allFilters.addFilter(filter);<a name="line.1461"></a>
-<span class="sourceLineNo">1462</span>    Scan scan = new Scan();<a name="line.1462"></a>
-<span class="sourceLineNo">1463</span>    scan.addFamily(Bytes.toBytes("trans-blob"));<a name="line.1463"></a>
-<span class="sourceLineNo">1464</span>    scan.addFamily(Bytes.toBytes("trans-type"));<a name="line.1464"></a>
-<span class="sourceLineNo">1465</span>    scan.addFamily(Bytes.toBytes("trans-date"));<a name="line.1465"></a>
-<span class="sourceLineNo">1466</span>    scan.addFamily(Bytes.toBytes("trans-tags"));<a name="line.1466"></a>
-<span class="sourceLineNo">1467</span>    scan.addFamily(Bytes.toBytes("trans-group"));<a name="line.1467"></a>
-<span class="sourceLineNo">1468</span>    scan.setFilter(allFilters);<a name="line.1468"></a>
-<span class="sourceLineNo">1469</span>    return r.getScanner(scan);<a name="line.1469"></a>
-<span class="sourceLineNo">1470</span>  }<a name="line.1470"></a>
-<span class="sourceLineNo">1471</span><a name="line.1471"></a>
-<span class="sourceLineNo">1472</span>  private void putRows(HRegion r, int numRows, String value, String key) throws IOException {<a name="line.1472"></a>
-<span class="sourceLineNo">1473</span>    for (int i = 0; i &lt; numRows; i++) {<a name="line.1473"></a>
-<span class="sourceLineNo">1474</span>      String row = key + "_" + i/* UUID.randomUUID().toString() */;<a name="line.1474"></a>
-<span class="sourceLineNo">1475</span>      System.out.println(String.format("Saving row: %s, with value %s", row, value));<a name="line.1475"></a>
-<span class="sourceLineNo">1476</span>      Put put = new Put(Bytes.toBytes(row));<a name="line.1476"></a>
-<span class="sourceLineNo">1477</span>      put.setDurability(Durability.SKIP_WAL);<a name="line.1477"></a>
-<span class="sourceLineNo">1478</span>      put.addColumn(Bytes.toBytes("trans-blob"), null, Bytes.toBytes("value for blob"));<a name="line.1478"></a>
-<span class="sourceLineNo">1479</span>      put.addColumn(Bytes.toBytes("trans-type"), null, Bytes.toBytes("statement"));<a name="line.1479"></a>
-<span class="sourceLineNo">1480</span>      put.addColumn(Bytes.toBytes("trans-date"), null, Bytes.toBytes("20090921010101999"));<a name="line.1480"></a>
-<span class="sourceLineNo">1481</span>      put.addColumn(Bytes.toBytes("trans-tags"), Bytes.toBytes("qual2"), Bytes.toBytes(value));<a name="line.1481"></a>
-<span class="sourceLineNo">1482</span>      put.addColumn(Bytes.toBytes("trans-group"), null, Bytes.toBytes("adhocTransactionGroupId"));<a name="line.1482"></a>
-<span class="sourceLineNo">1483</span>      r.put(put);<a name="line.1483"></a>
-<span class="sourceLineNo">1484</span>    }<a name="line.1484"></a>
-<span class="sourceLineNo">1485</span>  }<a name="line.1485"></a>
-<span class="sourceLineNo">1486</span><a name="line.1486"></a>
-<span class="sourceLineNo">1487</span>  @Test<a name="line.1487"></a>
-<span class="sourceLineNo">1488</span>  public void testFamilyWithAndWithoutColon() throws Exception {<a name="line.1488"></a>
-<span class="sourceLineNo">1489</span>    byte[] cf = Bytes.toBytes(COLUMN_FAMILY);<a name="line.1489"></a>
-<span class="sourceLineNo">1490</span>    this.region = initHRegion(tableName, method, CONF, cf);<a name="line.1490"></a>
-<span class="sourceLineNo">1491</span>    Put p = new Put(tableName.toBytes());<a name="line.1491"></a>
-<span class="sourceLineNo">1492</span>    byte[] cfwithcolon = Bytes.toBytes(COLUMN_FAMILY + ":");<a name="line.1492"></a>
-<span class="sourceLineNo">1493</span>    p.addColumn(cfwithcolon, cfwithcolon, cfwithcolon);<a name="line.1493"></a>
-<span class="sourceLineNo">1494</span>    boolean exception = false;<a name="line.1494"></a>
-<span class="sourceLineNo">1495</span>    try {<a name="line.1495"></a>
-<span class="sourceLineNo">1496</span>      this.region.put(p);<a name="line.1496"></a>
-<span class="sourceLineNo">1497</span>    } catch (NoSuchColumnFamilyException e) {<a name="line.1497"></a>
-<span class="sourceLineNo">1498</span>      exception = true;<a name="line.1498"></a>
-<span class="sourceLineNo">1499</span>    }<a name="line.1499"></a>
-<span class="sourceLineNo">1500</span>    assertTrue(exception);<a name="line.1500"></a>
-<span class="sourceLineNo">1501</span>  }<a name="line.1501"></a>
-<span class="sourceLineNo">1502</span><a name="line.1502"></a>
-<span class="sourceLineNo">1503</span>  @Test<a name="line.1503"></a>
-<span class="sourceLineNo">1504</span>  public void testBatchPut_whileNoRowLocksHeld() throws IOException {<a name="line.1504"></a>
-<span class="sourceLineNo">1505</span>    final Put[] puts = new Put[10];<a name="line.1505"></a>
-<span class="sourceLineNo">1506</span>    MetricsWALSource source = CompatibilitySingletonFactory.getInstance(MetricsWALSource.class);<a name="line.1506"></a>
-<span class="sourceLineNo">1507</span>    long syncs = prepareRegionForBachPut(puts, source, false);<a name="line.1507"></a>
-<span class="sourceLineNo">1508</span><a name="line.1508"></a>
-<span class="sourceLineNo">1509</span>    OperationStatus[] codes = this.region.batchMutate(puts);<a name="line.1509"></a>
-<span class="sourceLineNo">1510</span>    assertEquals(10, codes.length);<a name="line.1510"></a>
-<span class="sourceLineNo">1511</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.1511"></a>
-<span class="sourceLineNo">1512</span>      assertEquals(OperationStatusCode.SUCCESS, codes[i].getOperationStatusCode());<a name="line.1512"></a>
-<span class="sourceLineNo">1513</span>    }<a name="line.1513"></a>
-<span class="sourceLineNo">1514</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs + 1, source);<a name="line.1514"></a>
-<span class="sourceLineNo">1515</span><a name="line.1515"></a>
-<span class="sourceLineNo">1516</span>    LOG.info("Next a batch put with one invalid family");<a name="line.1516"></a>
-<span class="sourceLineNo">1517</span>    puts[5].addColumn(Bytes.toBytes("BAD_CF"), qual, value);<a name="line.1517"></a>
-<span class="sourceLineNo">1518</span>    codes = this.region.batchMutate(puts);<a name="line.1518"></a>
-<span class="sourceLineNo">1519</span>    assertEquals(10, codes.length);<a name="line.1519"></a>
-<span class="sourceLineNo">1520</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.1520"></a>
-<span class="sourceLineNo">1521</span>      assertEquals((i == 5) ? OperationStatusCode.BAD_FAMILY : OperationStatusCode.SUCCESS,<a name="line.1521"></a>
-<span class="sourceLineNo">1522</span>          codes[i].getOperationStatusCode());<a name="line.1522"></a>
-<span class="sourceLineNo">1523</span>    }<a name="line.1523"></a>
-<span class="sourceLineNo">1524</span><a name="line.1524"></a>
-<span class="sourceLineNo">1525</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs + 2, source);<a name="line.1525"></a>
-<span class="sourceLineNo">1526</span>  }<a name="line.1526"></a>
-<span class="sourceLineNo">1527</span><a name="line.1527"></a>
-<span class="sourceLineNo">1528</span>  @Test<a name="line.1528"></a>
-<span class="sourceLineNo">1529</span>  public void testBatchPut_whileMultipleRowLocksHeld() throws Exception {<a name="line.1529"></a>
-<span class="sourceLineNo">1530</span>    final Put[] puts = new Put[10];<a name="line.1530"></a>
-<span class="sourceLineNo">1531</span>    MetricsWALSource source = CompatibilitySingletonFactory.getInstance(MetricsWALSource.class);<a name="line.1531"></a>
-<span class="sourceLineNo">1532</span>    long syncs = prepareRegionForBachPut(puts, source, false);<a name="line.1532"></a>
-<span class="sourceLineNo">1533</span><a name="line.1533"></a>
-<span class="sourceLineNo">1534</span>    puts[5].addColumn(Bytes.toBytes("BAD_CF"), qual, value);<a name="line.1534"></a>
-<span class="sourceLineNo">1535</span><a name="line.1535"></a>
-<span class="sourceLineNo">1536</span>    LOG.info("batchPut will have to break into four batches to avoid row locks");<a name="line.1536"></a>
-<span class="sourceLineNo">1537</span>    RowLock rowLock1 = region.getRowLock(Bytes.toBytes("row_2"));<a name="line.1537"></a>
-<span class="sourceLineNo">1538</span>    RowLock rowLock2 = region.getRowLock(Bytes.toBytes("row_1"));<a name="line.1538"></a>
-<span class="sourceLineNo">1539</span>    RowLock rowLock3 = region.getRowLock(Bytes.toBytes("row_3"));<a name="line.1539"></a>
-<span class="sourceLineNo">1540</span>    RowLock rowLock4 = region.getRowLock(Bytes.toBytes("row_3"), true);<a name="line.1540"></a>
-<span class="sourceLineNo">1541</span><a name="line.1541"></a>
-<span class="sourceLineNo">1542</span>    MultithreadedTestUtil.TestContext ctx = new MultithreadedTestUtil.TestContext(CONF);<a name="line.1542"></a>
-<span class="sourceLineNo">1543</span>    final AtomicReference&lt;OperationStatus[]&gt; retFromThread = new AtomicReference&lt;&gt;();<a name="line.1543"></a>
-<span class="sourceLineNo">1544</span>    final CountDownLatch startingPuts = new CountDownLatch(1);<a name="line.1544"></a>
-<span class="sourceLineNo">1545</span>    final CountDownLatch startingClose = new CountDownLatch(1);<a name="line.1545"></a>
-<span class="sourceLineNo">1546</span>    TestThread putter = new TestThread(ctx) {<a name="line.1546"></a>
-<span class="sourceLineNo">1547</span>      @Override<a name="line.1547"></a>
-<span class="sourceLineNo">1548</span>      public void doWork() throws IOException {<a name="line.1548"></a>
-<span class="sourceLineNo">1549</span>        startingPuts.countDown();<a name="line.1549"></a>
-<span class="sourceLineNo">1550</span>        retFromThread.set(region.batchMutate(puts));<a name="line.1550"></a>
-<span class="sourceLineNo">1551</span>      }<a name="line.1551"></a>
-<span class="sourceLineNo">1552</span>    };<a name="line.1552"></a>
-<span class="sourceLineNo">1553</span>    LOG.info("...starting put thread while holding locks");<a name="line.1553"></a>
-<span class="sourceLineNo">1554</span>    ctx.addThread(putter);<a name="line.1554"></a>
-<span class="sourceLineNo">1555</span>    ctx.startThreads();<a name="line.1555"></a>
-<span class="sourceLineNo">1556</span><a name="line.1556"></a>
-<span class="sourceLineNo">1557</span>    // Now attempt to close the region from another thread.  Prior to HBASE-12565<a name="line.1557"></a>
-<span class="sourceLineNo">1558</span>    // this would cause the in-progress batchMutate operation to to fail with<a name="line.1558"></a>
-<span class="sourceLineNo">1559</span>    // exception because it use to release and re-acquire the close-guard lock<a name="line.1559"></a>
-<span class="sourceLineNo">1560</span>    // between batches.  Caller then didn't get status indicating which writes succeeded.<a name="line.1560"></a>
-<span class="sourceLineNo">1561</span>    // We now expect this thread to block until the batchMutate call finishes.<a name="line.1561"></a>
-<span class="sourceLineNo">1562</span>    Thread regionCloseThread = new TestThread(ctx) {<a name="line.1562"></a>
-<span class="sourceLineNo">1563</span>      @Override<a name="line.1563"></a>
-<span class="sourceLineNo">1564</span>      public void doWork() {<a name="line.1564"></a>
-<span class="sourceLineNo">1565</span>        try {<a name="line.1565"></a>
-<span class="sourceLineNo">1566</span>          startingPuts.await();<a name="line.1566"></a>
-<span class="sourceLineNo">1567</span>          // Give some time for the batch mutate to get in.<a name="line.1567"></a>
-<span class="sourceLineNo">1568</span>          // We don't want to race with the mutate<a name="line.1568"></a>
-<span class="sourceLineNo">1569</span>          Thread.sleep(10);<a name="line.1569"></a>
-<span class="sourceLineNo">1570</span>          startingClose.countDown();<a name="line.1570"></a>
-<span class="sourceLineNo">1571</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.1571"></a>
-<span class="sourceLineNo">1572</span>          region = null;<a name="line.1572"></a>
-<span class="sourceLineNo">1573</span>        } catch (IOException e) {<a name="line.1573"></a>
-<span class="sourceLineNo">1574</span>          throw new RuntimeException(e);<a name="line.1574"></a>
-<span class="sourceLineNo">1575</span>        } catch (InterruptedException e) {<a name="line.1575"></a>
-<span class="sourceLineNo">1576</span>          throw new RuntimeException(e);<a name="line.1576"></a>
-<span class="sourceLineNo">1577</span>        }<a name="line.1577"></a>
-<span class="sourceLineNo">1578</span>      }<a name="line.1578"></a>
-<span class="sourceLineNo">1579</span>    };<a name="line.1579"></a>
-<span class="sourceLineNo">1580</span>    regionCloseThread.start();<a name="line.1580"></a>
-<span class="sourceLineNo">1581</span><a name="line.1581"></a>
-<span class="sourceLineNo">1582</span>    startingClose.await();<a name="line.1582"></a>
-<span class="sourceLineNo">1583</span>    startingPuts.await();<a name="line.1583"></a>
-<span class="sourceLineNo">1584</span>    Thread.sleep(100);<a name="line.1584"></a>
-<span class="sourceLineNo">1585</span>    LOG.info("...releasing row lock 1, which should let put thread continue");<a name="line.1585"></a>
-<span class="sourceLineNo">1586</span>    rowLock1.release();<a name="line.1586"></a>
-<span class="sourceLineNo">1587</span>    rowLock2.release();<a name="line.1587"></a>
-<span class="sourceLineNo">1588</span>    rowLock3.release();<a name="line.1588"></a>
-<span class="sourceLineNo">1589</span>    waitForCounter(source, "syncTimeNumOps", syncs + 1);<a name="line.1589"></a>
-<span class="sourceLineNo">1590</span><a name="line.1590"></a>
-<span class="sourceLineNo">1591</span>    LOG.info("...joining on put thread");<a name="line.1591"></a>
-<span class="sourceLineNo">1592</span>    ctx.stop();<a name="line.1592"></a>
-<span class="sourceLineNo">1593</span>    regionCloseThread.join();<a name="line.1593"></a>
-<span class="sourceLineNo">1594</span><a name="line.1594"></a>
-<span class="sourceLineNo">1595</span>    OperationStatus[] codes = retFromThread.get();<a name="line.1595"></a>
-<span class="sourceLineNo">1596</span>    for (int i = 0; i &lt; codes.length; i++) {<a name="line.1596"></a>
-<span class="sourceLineNo">1597</span>      assertEquals((i == 5) ? OperationStatusCode.BAD_FAMILY : OperationStatusCode.SUCCESS,<a name="line.1597"></a>
-<span class="sourceLineNo">1598</span>          codes[i].getOperationStatusCode());<a name="line.1598"></a>
-<span class="sourceLineNo">1599</span>    }<a name="line.1599"></a>
-<span class="sourceLineNo">1600</span>    rowLock4.release();<a name="line.1600"></a>
-<span class="sourceLineNo">1601</span>  }<a name="line.1601"></a>
-<span class="sourceLineNo">1602</span><a name="line.1602"></a>
-<span class="sourceLineNo">1603</span>  private void waitForCounter(MetricsWALSource source, String metricName, long expectedCount)<a name="line.1603"></a>
-<span class="sourceLineNo">1604</span>      throws InterruptedException {<a name="line.1604"></a>
-<span class="sourceLineNo">1605</span>    long startWait = System.currentTimeMillis();<a name="line.1605"></a>
-<span class="sourceLineNo">1606</span>    long currentCount;<a name="line.1606"></a>
-<span class="sourceLineNo">1607</span>    while ((currentCount = metricsAssertHelper.getCounter(metricName, source)) &lt; expectedCount) {<a name="line.1607"></a>
-<span class="sourceLineNo">1608</span>      Thread.sleep(100);<a name="line.1608"></a>
-<span class="sourceLineNo">1609</span>      if (System.currentTimeMillis() - startWait &gt; 10000) {<a name="line.1609"></a>
-<span class="sourceLineNo">1610</span>        fail(String.format("Timed out waiting for '%s' &gt;= '%s', currentCount=%s", metricName,<a name="line.1610"></a>
-<span class="sourceLineNo">1611</span>            expectedCount, currentCount));<a name="line.1611"></a>
-<span class="sourceLineNo">1612</span>      }<a name="line.1612"></a>
-<span class="sourceLineNo">1613</span>    }<a name="line.1613"></a>
-<span class="sourceLineNo">1614</span>  }<a name="line.1614"></a>
-<span class="sourceLineNo">1615</span><a name="line.1615"></a>
-<span class="sourceLineNo">1616</span>  @Test<a name="line.1616"></a>
-<span class="sourceLineNo">1617</span>  public void testAtomicBatchPut() throws IOException {<a name="line.1617"></a>
-<span class="sourceLineNo">1618</span>    final Put[] puts = new Put[10];<a name="line.1618"></a>
-<span class="sourceLineNo">1619</span>    MetricsWALSource source = CompatibilitySingletonFactory.getInstance(MetricsWALSource.class);<a name="line.1619"></a>
-<span class="sourceLineNo">1620</span>    long syncs = prepareRegionForBachPut(puts, source, false);<a name="line.1620"></a>
-<span class="sourceLineNo">1621</span><a name="line.1621"></a>
-<span class="sourceLineNo">1622</span>    // 1. Straight forward case, should succeed<a name="line.1622"></a>
-<span class="sourceLineNo">1623</span>    MutationBatchOperation batchOp = new MutationBatchOperation(region, puts, true,<a name="line.1623"></a>
-<span class="sourceLineNo">1624</span>        HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.1624"></a>
-<span class="sourceLineNo">1625</span>    OperationStatus[] codes = this.region.batchMutate(batchOp);<a name="line.1625"></a>
-<span class="sourceLineNo">1626</span>    assertEquals(10, codes.length);<a name="line.1626"></a>
-<span class="sourceLineNo">1627</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.1627"></a>
-<span class="sourceLineNo">1628</span>      assertEquals(OperationStatusCode.SUCCESS, codes[i].getOperationStatusCode());<a name="line.1628"></a>
-<span class="sourceLineNo">1629</span>    }<a name="line.1629"></a>
-<span class="sourceLineNo">1630</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs + 1, source);<a name="line.1630"></a>
-<span class="sourceLineNo">1631</span><a name="line.1631"></a>
-<span class="sourceLineNo">1632</span>    // 2. Failed to get lock<a name="line.1632"></a>
-<span class="sourceLineNo">1633</span>    RowLock lock = region.getRowLock(Bytes.toBytes("row_" + 3));<a name="line.1633"></a>
-<span class="sourceLineNo">1634</span>    // Method {@link HRegion#getRowLock(byte[])} is reentrant. As 'row_3' is locked in this<a name="line.1634"></a>
-<span class="sourceLineNo">1635</span>    // thread, need to run {@link HRegion#batchMutate(HRegion.BatchOperation)} in different thread<a name="line.1635"></a>
-<span class="sourceLineNo">1636</span>    MultithreadedTestUtil.TestContext ctx = new MultithreadedTestUtil.TestContext(CONF);<a name="line.1636"></a>
-<span class="sourceLineNo">1637</span>    final AtomicReference&lt;IOException&gt; retFromThread = new AtomicReference&lt;&gt;();<a name="line.1637"></a>
-<span class="sourceLineNo">1638</span>    final CountDownLatch finishedPuts = new CountDownLatch(1);<a name="line.1638"></a>
-<span class="sourceLineNo">1639</span>    final MutationBatchOperation finalBatchOp = new MutationBatchOperation(region, puts, true,<a name="line.1639"></a>
-<span class="sourceLineNo">1640</span>        HConstants<a name="line.1640"></a>
-<span class="sourceLineNo">1641</span>        .NO_NONCE,<a name="line.1641"></a>
-<span class="sourceLineNo">1642</span>        HConstants.NO_NONCE);<a name="line.1642"></a>
-<span class="sourceLineNo">1643</span>    TestThread putter = new TestThread(ctx) {<a name="line.1643"></a>
-<span class="sourceLineNo">1644</span>      @Override<a name="line.1644"></a>
-<span class="sourceLineNo">1645</span>      public void doWork() throws IOException {<a name="line.1645"></a>
-<span class="sourceLineNo">1646</span>        try {<a name="line.1646"></a>
-<span class="sourceLineNo">1647</span>          region.batchMutate(finalBatchOp);<a name="line.1647"></a>
-<span class="sourceLineNo">1648</span>        } catch (IOException ioe) {<a name="line.1648"></a>
-<span class="sourceLineNo">1649</span>          LOG.error("test failed!", ioe);<a name="line.1649"></a>
-<span class="sourceLineNo">1650</span>          retFromThread.set(ioe);<a name="line.1650"></a>
-<span class="sourceLineNo">1651</span>        }<a name="line.1651"></a>
-<span class="sourceLineNo">1652</span>        finishedPuts.countDown();<a name="line.1652"></a>
-<span class="sourceLineNo">1653</span>      }<a name="line.1653"></a>
-<span class="sourceLineNo">1654</span>    };<a name="line.1654"></a>
-<span class="sourceLineNo">1655</span>    LOG.info("...starting put thread while holding locks");<a name="line.1655"></a>
-<span class="sourceLineNo">1656</span>    ctx.addThread(putter);<a name="line.1656"></a>
-<span class="sourceLineNo">1657</span>    ctx.startThreads();<a name="line.1657"></a>
-<span class="sourceLineNo">1658</span>    LOG.info("...waiting for batch puts while holding locks");<a name="line.1658"></a>
-<span class="sourceLineNo">1659</span>    try {<a name="line.1659"></a>
-<span class="sourceLineNo">1660</span>      finishedPuts.await();<a name="line.1660"></a>
-<span class="sourceLineNo">1661</span>    } catch (InterruptedException e) {<a name="line.1661"></a>
-<span class="sourceLineNo">1662</span>      LOG.error("Interrupted!", e);<a name="line.1662"></a>
-<span class="sourceLineNo">1663</span>    } finally {<a name="line.1663"></a>
-<span class="sourceLineNo">1664</span>      if (lock != null) {<a name="line.1664"></a>
-<span class="sourceLineNo">1665</span>        lock.release();<a name="line.1665"></a>
-<span class="sourceLineNo">1666</span>      }<a name="line.1666"></a>
-<span class="sourceLineNo">1667</span>    }<a name="line.1667"></a>
-<span class="sourceLineNo">1668</span>    assertNotNull(retFromThread.get());<a name="line.1668"></a>
-<span class="sourceLineNo">1669</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs + 1, source);<a name="line.1669"></a>
-<span class="sourceLineNo">1670</span><a name="line.1670"></a>
-<span class="sourceLineNo">1671</span>    // 3. Exception thrown in validation<a name="line.1671"></a>
-<span class="sourceLineNo">1672</span>    LOG.info("Next a batch put with one invalid family");<a name="line.1672"></a>
-<span class="sourceLineNo">1673</span>    puts[5].addColumn(Bytes.toBytes("BAD_CF"), qual, value);<a name="line.1673"></a>
-<span class="sourceLineNo">1674</span>    batchOp = new MutationBatchOperation(region, puts, true, HConstants.NO_NONCE,<a name="line.1674"></a>
-<span class="sourceLineNo">1675</span>        HConstants.NO_NONCE);<a name="line.1675"></a>
-<span class="sourceLineNo">1676</span>    thrown.expect(NoSuchColumnFamilyException.class);<a name="line.1676"></a>
-<span class="sourceLineNo">1677</span>    this.region.batchMutate(batchOp);<a name="line.1677"></a>
-<span class="sourceLineNo">1678</span>  }<a name="line.1678"></a>
-<span class="sourceLineNo">1679</span><a name="line.1679"></a>
-<span class="sourceLineNo">1680</span>  @Test<a name="line.1680"></a>
-<span class="sourceLineNo">1681</span>  public void testBatchPutWithTsSlop() throws Exception {<a name="line.1681"></a>
-<span class="sourceLineNo">1682</span>    // add data with a timestamp that is too recent for range. Ensure assert<a name="line.1682"></a>
-<span class="sourceLineNo">1683</span>    CONF.setInt("hbase.hregion.keyvalue.timestamp.slop.millisecs", 1000);<a name="line.1683"></a>
-<span class="sourceLineNo">1684</span>    final Put[] puts = new Put[10];<a name="line.1684"></a>
-<span class="sourceLineNo">1685</span>    MetricsWALSource source = CompatibilitySingletonFactory.getInstance(MetricsWALSource.class);<a name="line.1685"></a>
-<span class="sourceLineNo">1686</span><a name="line.1686"></a>
-<span class="sourceLineNo">1687</span>    long syncs = prepareRegionForBachPut(puts, source, true);<a name="line.1687"></a>
-<span class="sourceLineNo">1688</span><a name="line.1688"></a>
-<span class="sourceLineNo">1689</span>    OperationStatus[] codes = this.region.batchMutate(puts);<a name="line.1689"></a>
-<span class="sourceLineNo">1690</span>    assertEquals(10, codes.length);<a name="line.1690"></a>
-<span class="sourceLineNo">1691</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.1691"></a>
-<span class="sourceLineNo">1692</span>      assertEquals(OperationStatusCode.SANITY_CHECK_FAILURE, codes[i].getOperationStatusCode());<a name="line.1692"></a>
-<span class="sourceLineNo">1693</span>    }<a name="line.1693"></a>
-<span class="sourceLineNo">1694</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs, source);<a name="line.1694"></a>
-<span class="sourceLineNo">1695</span>  }<a name="line.1695"></a>
-<span class="sourceLineNo">1696</span><a name="line.1696"></a>
-<span class="sourceLineNo">1697</span>  /**<a name="line.1697"></a>
-<span class="sourceLineNo">1698</span>   * @return syncs initial syncTimeNumOps<a name="line.1698"></a>
-<span class="sourceLineNo">1699</span>   */<a name="line.1699"></a>
-<span class="sourceLineNo">1700</span>  private long prepareRegionForBachPut(final Put[] puts, final MetricsWALSource source,<a name="line.1700"></a>
-<span class="sourceLineNo">1701</span>      boolean slop) throws IOException {<a name="line.1701"></a>
-<span class="sourceLineNo">1702</span>    this.region = initHRegion(tableName, method, CONF, COLUMN_FAMILY_BYTES);<a name="line.1702"></a>
-<span class="sourceLineNo">1703</span><a name="line.1703"></a>
-<span class="sourceLineNo">1704</span>    LOG.info("First a batch put with all valid puts");<a name="line.1704"></a>
-<span class="sourceLineNo">1705</span>    for (int i = 0; i &lt; puts.length; i++) {<a name="line.1705"></a>
-<span class="sourceLineNo">1706</span>      puts[i] = slop ? new Put(Bytes.toBytes("row_" + i), Long.MAX_VALUE - 100) :<a name="line.1706"></a>
-<span class="sourceLineNo">1707</span>          new Put(Bytes.toBytes("row_" + i));<a name="line.1707"></a>
-<span class="sourceLineNo">1708</span>      puts[i].addColumn(COLUMN_FAMILY_BYTES, qual, value);<a name="line.1708"></a>
-<span class="sourceLineNo">1709</span>    }<a name="line.1709"></a>
-<span class="sourceLineNo">1710</span><a name="line.1710"></a>
-<span class="sourceLineNo">1711</span>    long syncs = metricsAssertHelper.getCounter("syncTimeNumOps", source);<a name="line.1711"></a>
-<span class="sourceLineNo">1712</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs, source);<a name="line.1712"></a>
-<span class="sourceLineNo">1713</span>    return syncs;<a name="line.1713"></a>
-<span class="sourceLineNo">1714</span>  }<a name="line.1714"></a>
-<span class="sourceLineNo">1715</span><a name="line.1715"></a>
-<span class="sourceLineNo">1716</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.1716"></a>
-<span class="sourceLineNo">1717</span>  // checkAndMutate tests<a name="line.1717"></a>
-<span class="sourceLineNo">1718</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.1718"></a>
-<span class="sourceLineNo">1719</span>  @Test<a name="line.1719"></a>
-<span class="sourceLineNo">1720</span>  public void testCheckAndMutate_WithEmptyRowValue() throws IOException {<a name="line.1720"></a>
-<span class="sourceLineNo">1721</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1721"></a>
-<span class="sourceLineNo">1722</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1722"></a>
-<span class="sourceLineNo">1723</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1723"></a>
-<span class="sourceLineNo">1724</span>    byte[] emptyVal = new byte[] {};<a name="line.1724"></a>
-<span class="sourceLineNo">1725</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1725"></a>
-<span class="sourceLineNo">1726</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.1726"></a>
-<span class="sourceLineNo">1727</span><a name="line.1727"></a>
-<span class="sourceLineNo">1728</span>    // Setting up region<a name="line.1728"></a>
-<span class="sourceLineNo">1729</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.1729"></a>
-<span class="sourceLineNo">1730</span>    // Putting empty data in key<a name="line.1730"></a>
-<span class="sourceLineNo">1731</span>    Put put = new Put(row1);<a name="line.1731"></a>
-<span class="sourceLineNo">1732</span>    put.addColumn(fam1, qf1, emptyVal);<a name="line.1732"></a>
-<span class="sourceLineNo">1733</span><a name="line.1733"></a>
-<span class="sourceLineNo">1734</span>    // checkAndPut with empty value<a name="line.1734"></a>
-<span class="sourceLineNo">1735</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1735"></a>
-<span class="sourceLineNo">1736</span>        new BinaryComparator(emptyVal), put);<a name="line.1736"></a>
-<span class="sourceLineNo">1737</span>    assertTrue(res);<a name="line.1737"></a>
-<span class="sourceLineNo">1738</span><a name="line.1738"></a>
-<span class="sourceLineNo">1739</span>    // Putting data in key<a name="line.1739"></a>
-<span class="sourceLineNo">1740</span>    put = new Put(row1);<a name="line.1740"></a>
-<span class="sourceLineNo">1741</span>    put.addColumn(fam1, qf1, val1);<a name="line.1741"></a>
-<span class="sourceLineNo">1742</span><a name="line.1742"></a>
-<span class="sourceLineNo">1743</span>    // checkAndPut with correct value<a name="line.1743"></a>
-<span class="sourceLineNo">1744</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1744"></a>
-<span class="sourceLineNo">1745</span>        new BinaryComparator(emptyVal), put);<a name="line.1745"></a>
-<span class="sourceLineNo">1746</span>    assertTrue(res);<a name="line.1746"></a>
-<span class="sourceLineNo">1747</span><a name="line.1747"></a>
-<span class="sourceLineNo">1748</span>    // not empty anymore<a name="line.1748"></a>
-<span class="sourceLineNo">1749</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1749"></a>
-<span class="sourceLineNo">1750</span>        new BinaryComparator(emptyVal), put);<a name="line.1750"></a>
-<span class="sourceLineNo">1751</span>    assertFalse(res);<a name="line.1751"></a>
-<span class="sourceLineNo">1752</span><a name="line.1752"></a>
-<span class="sourceLineNo">1753</span>    Delete delete = new Delete(row1);<a name="line.1753"></a>
-<span class="sourceLineNo">1754</span>    delete.addColumn(fam1, qf1);<a name="line.1754"></a>
-<span class="sourceLineNo">1755</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1755"></a>
-<span class="sourceLineNo">1756</span>        new BinaryComparator(emptyVal), delete);<a name="line.1756"></a>
-<span class="sourceLineNo">1757</span>    assertFalse(res);<a name="line.1757"></a>
-<span class="sourceLineNo">1758</span><a name="line.1758"></a>
-<span class="sourceLineNo">1759</span>    put = new Put(row1);<a name="line.1759"></a>
-<span class="sourceLineNo">1760</span>    put.addColumn(fam1, qf1, val2);<a name="line.1760"></a>
-<span class="sourceLineNo">1761</span>    // checkAndPut with correct value<a name="line.1761"></a>
-<span class="sourceLineNo">1762</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1762"></a>
-<span class="sourceLineNo">1763</span>        new BinaryComparator(val1), put);<a name="line.1763"></a>
-<span class="sourceLineNo">1764</span>    assertTrue(res);<a name="line.1764"></a>
-<span class="sourceLineNo">1765</span><a name="line.1765"></a>
-<span class="sourceLineNo">1766</span>    // checkAndDelete with correct value<a name="line.1766"></a>
-<span class="sourceLineNo">1767</span>    delete = new Delete(row1);<a name="line.1767"></a>
-<span class="sourceLineNo">1768</span>    delete.addColumn(fam1, qf1);<a name="line.1768"></a>
+<span class="sourceLineNo">404</span>    ChunkCreator.initialize(MemStoreLABImpl.CHUNK_SIZE_DEFAULT, false, 0, 0, 0, null);<a name="line.404"></a>
+<span class="sourceLineNo">405</span>    FSHLog hLog = new FSHLog(fs, rootDir, testName, CONF);<a name="line.405"></a>
+<span class="sourceLineNo">406</span>    hLog.init();<a name="line.406"></a>
+<span class="sourceLineNo">407</span>    region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, hLog,<a name="line.407"></a>
+<span class="sourceLineNo">408</span>        COLUMN_FAMILY_BYTES);<a name="line.408"></a>
+<span class="sourceLineNo">409</span>    HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.409"></a>
+<span class="sourceLineNo">410</span>    assertEquals(0, region.getMemStoreDataSize());<a name="line.410"></a>
+<span class="sourceLineNo">411</span><a name="line.411"></a>
+<span class="sourceLineNo">412</span>    // Put one value<a name="line.412"></a>
+<span class="sourceLineNo">413</span>    byte [] value = Bytes.toBytes(method);<a name="line.413"></a>
+<span class="sourceLineNo">414</span>    Put put = new Put(value);<a name="line.414"></a>
+<span class="sourceLineNo">415</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("abc"), value);<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    region.put(put);<a name="line.416"></a>
+<span class="sourceLineNo">417</span>    long onePutSize = region.getMemStoreDataSize();<a name="line.417"></a>
+<span class="sourceLineNo">418</span>    assertTrue(onePutSize &gt; 0);<a name="line.418"></a>
+<span class="sourceLineNo">419</span><a name="line.419"></a>
+<span class="sourceLineNo">420</span>    RegionCoprocessorHost mockedCPHost = Mockito.mock(RegionCoprocessorHost.class);<a name="line.420"></a>
+<span class="sourceLineNo">421</span>    doThrow(new IOException())<a name="line.421"></a>
+<span class="sourceLineNo">422</span>       .when(mockedCPHost).postBatchMutate(Mockito.&lt;MiniBatchOperationInProgress&lt;Mutation&gt;&gt;any());<a name="line.422"></a>
+<span class="sourceLineNo">423</span>    region.setCoprocessorHost(mockedCPHost);<a name="line.423"></a>
+<span class="sourceLineNo">424</span><a name="line.424"></a>
+<span class="sourceLineNo">425</span>    put = new Put(value);<a name="line.425"></a>
+<span class="sourceLineNo">426</span>    put.addColumn(COLUMN_FAMILY_BYTES, Bytes.toBytes("dfg"), value);<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    try {<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      region.put(put);<a name="line.428"></a>
+<span class="sourceLineNo">429</span>      fail("Should have failed with IOException");<a name="line.429"></a>
+<span class="sourceLineNo">430</span>    } catch (IOException expected) {<a name="line.430"></a>
+<span class="sourceLineNo">431</span>    }<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    long expectedSize = onePutSize * 2;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>    assertEquals("memstoreSize should be incremented",<a name="line.433"></a>
+<span class="sourceLineNo">434</span>        expectedSize, region.getMemStoreDataSize());<a name="line.434"></a>
+<span class="sourceLineNo">435</span>    assertEquals("flushable size should be incremented",<a name="line.435"></a>
+<span class="sourceLineNo">436</span>        expectedSize, store.getFlushableSize().getDataSize());<a name="line.436"></a>
+<span class="sourceLineNo">437</span><a name="line.437"></a>
+<span class="sourceLineNo">438</span>    region.setCoprocessorHost(null);<a name="line.438"></a>
+<span class="sourceLineNo">439</span>  }<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>   * A test case of HBASE-21041<a name="line.442"></a>
+<span class="sourceLineNo">443</span>   * @throws Exception Exception<a name="line.443"></a>
+<span class="sourceLineNo">444</span>   */<a name="line.444"></a>
+<span class="sourceLineNo">445</span>  @Test<a name="line.445"></a>
+<span class="sourceLineNo">446</span>  public void testFlushAndMemstoreSizeCounting() throws Exception {<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    byte[] family = Bytes.toBytes("family");<a name="line.447"></a>
+<span class="sourceLineNo">448</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.448"></a>
+<span class="sourceLineNo">449</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.449"></a>
+<span class="sourceLineNo">450</span>    try {<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      for (byte[] row : HBaseTestingUtility.ROWS) {<a name="line.451"></a>
+<span class="sourceLineNo">452</span>        Put put = new Put(row);<a name="line.452"></a>
+<span class="sourceLineNo">453</span>        put.addColumn(family, family, row);<a name="line.453"></a>
+<span class="sourceLineNo">454</span>        region.put(put);<a name="line.454"></a>
+<span class="sourceLineNo">455</span>      }<a name="line.455"></a>
+<span class="sourceLineNo">456</span>      region.flush(true);<a name="line.456"></a>
+<span class="sourceLineNo">457</span>      // After flush, data size should be zero<a name="line.457"></a>
+<span class="sourceLineNo">458</span>      assertEquals(0, region.getMemStoreDataSize());<a name="line.458"></a>
+<span class="sourceLineNo">459</span>      // After flush, a new active mutable segment is created, so the heap size<a name="line.459"></a>
+<span class="sourceLineNo">460</span>      // should equal to MutableSegment.DEEP_OVERHEAD<a name="line.460"></a>
+<span class="sourceLineNo">461</span>      assertEquals(MutableSegment.DEEP_OVERHEAD, region.getMemStoreHeapSize());<a name="line.461"></a>
+<span class="sourceLineNo">462</span>      // After flush, offheap should be zero<a name="line.462"></a>
+<span class="sourceLineNo">463</span>      assertEquals(0, region.getMemStoreOffHeapSize());<a name="line.463"></a>
+<span class="sourceLineNo">464</span>    } finally {<a name="line.464"></a>
+<span class="sourceLineNo">465</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.465"></a>
+<span class="sourceLineNo">466</span>      this.region = null;<a name="line.466"></a>
+<span class="sourceLineNo">467</span>      wals.close();<a name="line.467"></a>
+<span class="sourceLineNo">468</span>    }<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>  /**<a name="line.471"></a>
+<span class="sourceLineNo">472</span>   * Test we do not lose data if we fail a flush and then close.<a name="line.472"></a>
+<span class="sourceLineNo">473</span>   * Part of HBase-10466.  Tests the following from the issue description:<a name="line.473"></a>
+<span class="sourceLineNo">474</span>   * "Bug 1: Wrong calculation of HRegion.memstoreSize: When a flush fails, data to be flushed is<a name="line.474"></a>
+<span class="sourceLineNo">475</span>   * kept in each MemStore's snapshot and wait for next flush attempt to continue on it. But when<a name="line.475"></a>
+<span class="sourceLineNo">476</span>   * the next flush succeeds, the counter of total memstore size in HRegion is always deduced by<a name="line.476"></a>
+<span class="sourceLineNo">477</span>   * the sum of current memstore sizes instead of snapshots left from previous failed flush. This<a name="line.477"></a>
+<span class="sourceLineNo">478</span>   * calculation is problematic that almost every time there is failed flush, HRegion.memstoreSize<a name="line.478"></a>
+<span class="sourceLineNo">479</span>   * gets reduced by a wrong value. If region flush could not proceed for a couple cycles, the size<a name="line.479"></a>
+<span class="sourceLineNo">480</span>   * in current memstore could be much larger than the snapshot. It's likely to drift memstoreSize<a name="line.480"></a>
+<span class="sourceLineNo">481</span>   * much smaller than expected. In extreme case, if the error accumulates to even bigger than<a name="line.481"></a>
+<span class="sourceLineNo">482</span>   * HRegion's memstore size limit, any further flush is skipped because flush does not do anything<a name="line.482"></a>
+<span class="sourceLineNo">483</span>   * if memstoreSize is not larger than 0."<a name="line.483"></a>
+<span class="sourceLineNo">484</span>   * @throws Exception<a name="line.484"></a>
+<span class="sourceLineNo">485</span>   */<a name="line.485"></a>
+<span class="sourceLineNo">486</span>  @Test<a name="line.486"></a>
+<span class="sourceLineNo">487</span>  public void testFlushSizeAccounting() throws Exception {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.488"></a>
+<span class="sourceLineNo">489</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.489"></a>
+<span class="sourceLineNo">490</span>    // Only retry once.<a name="line.490"></a>
+<span class="sourceLineNo">491</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.491"></a>
+<span class="sourceLineNo">492</span>    final User user =<a name="line.492"></a>
+<span class="sourceLineNo">493</span>      User.createUserForTesting(conf, method, new String[]{"foo"});<a name="line.493"></a>
+<span class="sourceLineNo">494</span>    // Inject our faulty LocalFileSystem<a name="line.494"></a>
+<span class="sourceLineNo">495</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.496"></a>
+<span class="sourceLineNo">497</span>      @Override<a name="line.497"></a>
+<span class="sourceLineNo">498</span>      public Object run() throws Exception {<a name="line.498"></a>
+<span class="sourceLineNo">499</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.499"></a>
+<span class="sourceLineNo">500</span>        FileSystem fs = FileSystem.get(conf);<a name="line.500"></a>
+<span class="sourceLineNo">501</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.501"></a>
+<span class="sourceLineNo">502</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.502"></a>
+<span class="sourceLineNo">503</span>        HRegion region = null;<a name="line.503"></a>
+<span class="sourceLineNo">504</span>        try {<a name="line.504"></a>
+<span class="sourceLineNo">505</span>          // Initialize region<a name="line.505"></a>
+<span class="sourceLineNo">506</span>          region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, wal,<a name="line.506"></a>
+<span class="sourceLineNo">507</span>              COLUMN_FAMILY_BYTES);<a name="line.507"></a>
+<span class="sourceLineNo">508</span>          long size = region.getMemStoreDataSize();<a name="line.508"></a>
+<span class="sourceLineNo">509</span>          Assert.assertEquals(0, size);<a name="line.509"></a>
+<span class="sourceLineNo">510</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.510"></a>
+<span class="sourceLineNo">511</span>          Put p1 = new Put(row);<a name="line.511"></a>
+<span class="sourceLineNo">512</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[]) null));<a name="line.512"></a>
+<span class="sourceLineNo">513</span>          region.put(p1);<a name="line.513"></a>
+<span class="sourceLineNo">514</span>          final long sizeOfOnePut = region.getMemStoreDataSize();<a name="line.514"></a>
+<span class="sourceLineNo">515</span>          // Fail a flush which means the current memstore will hang out as memstore 'snapshot'.<a name="line.515"></a>
+<span class="sourceLineNo">516</span>          try {<a name="line.516"></a>
+<span class="sourceLineNo">517</span>            LOG.info("Flushing");<a name="line.517"></a>
+<span class="sourceLineNo">518</span>            region.flush(true);<a name="line.518"></a>
+<span class="sourceLineNo">519</span>            Assert.fail("Didn't bubble up IOE!");<a name="line.519"></a>
+<span class="sourceLineNo">520</span>          } catch (DroppedSnapshotException dse) {<a name="line.520"></a>
+<span class="sourceLineNo">521</span>            // What we are expecting<a name="line.521"></a>
+<span class="sourceLineNo">522</span>            region.closing.set(false); // this is needed for the rest of the test to work<a name="line.522"></a>
+<span class="sourceLineNo">523</span>          }<a name="line.523"></a>
+<span class="sourceLineNo">524</span>          // Make it so all writes succeed from here on out<a name="line.524"></a>
+<span class="sourceLineNo">525</span>          ffs.fault.set(false);<a name="line.525"></a>
+<span class="sourceLineNo">526</span>          // Check sizes.  Should still be the one entry.<a name="line.526"></a>
+<span class="sourceLineNo">527</span>          Assert.assertEquals(sizeOfOnePut, region.getMemStoreDataSize());<a name="line.527"></a>
+<span class="sourceLineNo">528</span>          // Now add two entries so that on this next flush that fails, we can see if we<a name="line.528"></a>
+<span class="sourceLineNo">529</span>          // subtract the right amount, the snapshot size only.<a name="line.529"></a>
+<span class="sourceLineNo">530</span>          Put p2 = new Put(row);<a name="line.530"></a>
+<span class="sourceLineNo">531</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.531"></a>
+<span class="sourceLineNo">532</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.532"></a>
+<span class="sourceLineNo">533</span>          region.put(p2);<a name="line.533"></a>
+<span class="sourceLineNo">534</span>          long expectedSize = sizeOfOnePut * 3;<a name="line.534"></a>
+<span class="sourceLineNo">535</span>          Assert.assertEquals(expectedSize, region.getMemStoreDataSize());<a name="line.535"></a>
+<span class="sourceLineNo">536</span>          // Do a successful flush.  It will clear the snapshot only.  Thats how flushes work.<a name="line.536"></a>
+<span class="sourceLineNo">537</span>          // If already a snapshot, we clear it else we move the memstore to be snapshot and flush<a name="line.537"></a>
+<span class="sourceLineNo">538</span>          // it<a name="line.538"></a>
+<span class="sourceLineNo">539</span>          region.flush(true);<a name="line.539"></a>
+<span class="sourceLineNo">540</span>          // Make sure our memory accounting is right.<a name="line.540"></a>
+<span class="sourceLineNo">541</span>          Assert.assertEquals(sizeOfOnePut * 2, region.getMemStoreDataSize());<a name="line.541"></a>
+<span class="sourceLineNo">542</span>        } finally {<a name="line.542"></a>
+<span class="sourceLineNo">543</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.543"></a>
+<span class="sourceLineNo">544</span>        }<a name="line.544"></a>
+<span class="sourceLineNo">545</span>        return null;<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>    FileSystem.closeAllForUGI(user.getUGI());<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>  @Test<a name="line.551"></a>
+<span class="sourceLineNo">552</span>  public void testCloseWithFailingFlush() throws Exception {<a name="line.552"></a>
+<span class="sourceLineNo">553</span>    final Configuration conf = HBaseConfiguration.create(CONF);<a name="line.553"></a>
+<span class="sourceLineNo">554</span>    final WAL wal = createWALCompatibleWithFaultyFileSystem(method, conf, tableName);<a name="line.554"></a>
+<span class="sourceLineNo">555</span>    // Only retry once.<a name="line.555"></a>
+<span class="sourceLineNo">556</span>    conf.setInt("hbase.hstore.flush.retries.number", 1);<a name="line.556"></a>
+<span class="sourceLineNo">557</span>    final User user =<a name="line.557"></a>
+<span class="sourceLineNo">558</span>      User.createUserForTesting(conf, this.method, new String[]{"foo"});<a name="line.558"></a>
+<span class="sourceLineNo">559</span>    // Inject our faulty LocalFileSystem<a name="line.559"></a>
+<span class="sourceLineNo">560</span>    conf.setClass("fs.file.impl", FaultyFileSystem.class, FileSystem.class);<a name="line.560"></a>
+<span class="sourceLineNo">561</span>    user.runAs(new PrivilegedExceptionAction&lt;Object&gt;() {<a name="line.561"></a>
+<span class="sourceLineNo">562</span>      @Override<a name="line.562"></a>
+<span class="sourceLineNo">563</span>      public Object run() throws Exception {<a name="line.563"></a>
+<span class="sourceLineNo">564</span>        // Make sure it worked (above is sensitive to caching details in hadoop core)<a name="line.564"></a>
+<span class="sourceLineNo">565</span>        FileSystem fs = FileSystem.get(conf);<a name="line.565"></a>
+<span class="sourceLineNo">566</span>        Assert.assertEquals(FaultyFileSystem.class, fs.getClass());<a name="line.566"></a>
+<span class="sourceLineNo">567</span>        FaultyFileSystem ffs = (FaultyFileSystem)fs;<a name="line.567"></a>
+<span class="sourceLineNo">568</span>        HRegion region = null;<a name="line.568"></a>
+<span class="sourceLineNo">569</span>        try {<a name="line.569"></a>
+<span class="sourceLineNo">570</span>          // Initialize region<a name="line.570"></a>
+<span class="sourceLineNo">571</span>          region = initHRegion(tableName, null, null, false,<a name="line.571"></a>
+<span class="sourceLineNo">572</span>              Durability.SYNC_WAL, wal, COLUMN_FAMILY_BYTES);<a name="line.572"></a>
+<span class="sourceLineNo">573</span>          long size = region.getMemStoreDataSize();<a name="line.573"></a>
+<span class="sourceLineNo">574</span>          Assert.assertEquals(0, size);<a name="line.574"></a>
+<span class="sourceLineNo">575</span>          // Put one item into memstore.  Measure the size of one item in memstore.<a name="line.575"></a>
+<span class="sourceLineNo">576</span>          Put p1 = new Put(row);<a name="line.576"></a>
+<span class="sourceLineNo">577</span>          p1.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual1, 1, (byte[])null));<a name="line.577"></a>
+<span class="sourceLineNo">578</span>          region.put(p1);<a name="line.578"></a>
+<span class="sourceLineNo">579</span>          // Manufacture an outstanding snapshot -- fake a failed flush by doing prepare step only.<a name="line.579"></a>
+<span class="sourceLineNo">580</span>          HStore store = region.getStore(COLUMN_FAMILY_BYTES);<a name="line.580"></a>
+<span class="sourceLineNo">581</span>          StoreFlushContext storeFlushCtx =<a name="line.581"></a>
+<span class="sourceLineNo">582</span>              store.createFlushContext(12345, FlushLifeCycleTracker.DUMMY);<a name="line.582"></a>
+<span class="sourceLineNo">583</span>          storeFlushCtx.prepare();<a name="line.583"></a>
+<span class="sourceLineNo">584</span>          // Now add two entries to the foreground memstore.<a name="line.584"></a>
+<span class="sourceLineNo">585</span>          Put p2 = new Put(row);<a name="line.585"></a>
+<span class="sourceLineNo">586</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual2, 2, (byte[])null));<a name="line.586"></a>
+<span class="sourceLineNo">587</span>          p2.add(new KeyValue(row, COLUMN_FAMILY_BYTES, qual3, 3, (byte[])null));<a name="line.587"></a>
+<span class="sourceLineNo">588</span>          region.put(p2);<a name="line.588"></a>
+<span class="sourceLineNo">589</span>          // Now try close on top of a failing flush.<a name="line.589"></a>
+<span class="sourceLineNo">590</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.590"></a>
+<span class="sourceLineNo">591</span>          region = null;<a name="line.591"></a>
+<span class="sourceLineNo">592</span>          fail();<a name="line.592"></a>
+<span class="sourceLineNo">593</span>        } catch (DroppedSnapshotException dse) {<a name="line.593"></a>
+<span class="sourceLineNo">594</span>          // Expected<a name="line.594"></a>
+<span class="sourceLineNo">595</span>          LOG.info("Expected DroppedSnapshotException");<a name="line.595"></a>
+<span class="sourceLineNo">596</span>        } finally {<a name="line.596"></a>
+<span class="sourceLineNo">597</span>          // Make it so all writes succeed from here on out so can close clean<a name="line.597"></a>
+<span class="sourceLineNo">598</span>          ffs.fault.set(false);<a name="line.598"></a>
+<span class="sourceLineNo">599</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.599"></a>
+<span class="sourceLineNo">600</span>        }<a name="line.600"></a>
+<span class="sourceLineNo">601</span>        return null;<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>    FileSystem.closeAllForUGI(user.getUGI());<a name="line.604"></a>
+<span class="sourceLineNo">605</span>  }<a name="line.605"></a>
+<span class="sourceLineNo">606</span><a name="line.606"></a>
+<span class="sourceLineNo">607</span>  @Test<a name="line.607"></a>
+<span class="sourceLineNo">608</span>  public void testCompactionAffectedByScanners() throws Exception {<a name="line.608"></a>
+<span class="sourceLineNo">609</span>    byte[] family = Bytes.toBytes("family");<a name="line.609"></a>
+<span class="sourceLineNo">610</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.610"></a>
+<span class="sourceLineNo">611</span><a name="line.611"></a>
+<span class="sourceLineNo">612</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.612"></a>
+<span class="sourceLineNo">613</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.613"></a>
+<span class="sourceLineNo">614</span>    region.put(put);<a name="line.614"></a>
+<span class="sourceLineNo">615</span>    region.flush(true);<a name="line.615"></a>
+<span class="sourceLineNo">616</span><a name="line.616"></a>
+<span class="sourceLineNo">617</span>    Scan scan = new Scan();<a name="line.617"></a>
+<span class="sourceLineNo">618</span>    scan.setMaxVersions(3);<a name="line.618"></a>
+<span class="sourceLineNo">619</span>    // open the first scanner<a name="line.619"></a>
+<span class="sourceLineNo">620</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.620"></a>
+<span class="sourceLineNo">621</span><a name="line.621"></a>
+<span class="sourceLineNo">622</span>    Delete delete = new Delete(Bytes.toBytes("r1"));<a name="line.622"></a>
+<span class="sourceLineNo">623</span>    region.delete(delete);<a name="line.623"></a>
+<span class="sourceLineNo">624</span>    region.flush(true);<a name="line.624"></a>
+<span class="sourceLineNo">625</span><a name="line.625"></a>
+<span class="sourceLineNo">626</span>    // open the second scanner<a name="line.626"></a>
+<span class="sourceLineNo">627</span>    RegionScanner scanner2 = region.getScanner(scan);<a name="line.627"></a>
+<span class="sourceLineNo">628</span><a name="line.628"></a>
+<span class="sourceLineNo">629</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.629"></a>
+<span class="sourceLineNo">630</span><a name="line.630"></a>
+<span class="sourceLineNo">631</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.631"></a>
+<span class="sourceLineNo">632</span><a name="line.632"></a>
+<span class="sourceLineNo">633</span>    // make a major compaction<a name="line.633"></a>
+<span class="sourceLineNo">634</span>    region.compact(true);<a name="line.634"></a>
+<span class="sourceLineNo">635</span><a name="line.635"></a>
+<span class="sourceLineNo">636</span>    // open the third scanner<a name="line.636"></a>
+<span class="sourceLineNo">637</span>    RegionScanner scanner3 = region.getScanner(scan);<a name="line.637"></a>
+<span class="sourceLineNo">638</span><a name="line.638"></a>
+<span class="sourceLineNo">639</span>    // get data from scanner 1, 2, 3 after major compaction<a name="line.639"></a>
+<span class="sourceLineNo">640</span>    scanner1.next(results);<a name="line.640"></a>
+<span class="sourceLineNo">641</span>    System.out.println(results);<a name="line.641"></a>
+<span class="sourceLineNo">642</span>    assertEquals(1, results.size());<a name="line.642"></a>
+<span class="sourceLineNo">643</span><a name="line.643"></a>
+<span class="sourceLineNo">644</span>    results.clear();<a name="line.644"></a>
+<span class="sourceLineNo">645</span>    scanner2.next(results);<a name="line.645"></a>
+<span class="sourceLineNo">646</span>    System.out.println(results);<a name="line.646"></a>
+<span class="sourceLineNo">647</span>    assertEquals(0, results.size());<a name="line.647"></a>
+<span class="sourceLineNo">648</span><a name="line.648"></a>
+<span class="sourceLineNo">649</span>    results.clear();<a name="line.649"></a>
+<span class="sourceLineNo">650</span>    scanner3.next(results);<a name="line.650"></a>
+<span class="sourceLineNo">651</span>    System.out.println(results);<a name="line.651"></a>
+<span class="sourceLineNo">652</span>    assertEquals(0, results.size());<a name="line.652"></a>
+<span class="sourceLineNo">653</span>  }<a name="line.653"></a>
+<span class="sourceLineNo">654</span><a name="line.654"></a>
+<span class="sourceLineNo">655</span>  @Test<a name="line.655"></a>
+<span class="sourceLineNo">656</span>  public void testToShowNPEOnRegionScannerReseek() throws Exception {<a name="line.656"></a>
+<span class="sourceLineNo">657</span>    byte[] family = Bytes.toBytes("family");<a name="line.657"></a>
+<span class="sourceLineNo">658</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.658"></a>
+<span class="sourceLineNo">659</span><a name="line.659"></a>
+<span class="sourceLineNo">660</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.660"></a>
+<span class="sourceLineNo">661</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.661"></a>
+<span class="sourceLineNo">662</span>    region.put(put);<a name="line.662"></a>
+<span class="sourceLineNo">663</span>    put = new Put(Bytes.toBytes("r2"));<a name="line.663"></a>
+<span class="sourceLineNo">664</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.664"></a>
+<span class="sourceLineNo">665</span>    region.put(put);<a name="line.665"></a>
+<span class="sourceLineNo">666</span>    region.flush(true);<a name="line.666"></a>
+<span class="sourceLineNo">667</span><a name="line.667"></a>
+<span class="sourceLineNo">668</span>    Scan scan = new Scan();<a name="line.668"></a>
+<span class="sourceLineNo">669</span>    scan.setMaxVersions(3);<a name="line.669"></a>
+<span class="sourceLineNo">670</span>    // open the first scanner<a name="line.670"></a>
+<span class="sourceLineNo">671</span>    RegionScanner scanner1 = region.getScanner(scan);<a name="line.671"></a>
+<span class="sourceLineNo">672</span><a name="line.672"></a>
+<span class="sourceLineNo">673</span>    System.out.println("Smallest read point:" + region.getSmallestReadPoint());<a name="line.673"></a>
+<span class="sourceLineNo">674</span><a name="line.674"></a>
+<span class="sourceLineNo">675</span>    region.compact(true);<a name="line.675"></a>
+<span class="sourceLineNo">676</span><a name="line.676"></a>
+<span class="sourceLineNo">677</span>    scanner1.reseek(Bytes.toBytes("r2"));<a name="line.677"></a>
+<span class="sourceLineNo">678</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.678"></a>
+<span class="sourceLineNo">679</span>    scanner1.next(results);<a name="line.679"></a>
+<span class="sourceLineNo">680</span>    Cell keyValue = results.get(0);<a name="line.680"></a>
+<span class="sourceLineNo">681</span>    Assert.assertTrue(Bytes.compareTo(CellUtil.cloneRow(keyValue), Bytes.toBytes("r2")) == 0);<a name="line.681"></a>
+<span class="sourceLineNo">682</span>    scanner1.close();<a name="line.682"></a>
+<span class="sourceLineNo">683</span>  }<a name="line.683"></a>
+<span class="sourceLineNo">684</span><a name="line.684"></a>
+<span class="sourceLineNo">685</span>  @Test<a name="line.685"></a>
+<span class="sourceLineNo">686</span>  public void testSkipRecoveredEditsReplay() throws Exception {<a name="line.686"></a>
+<span class="sourceLineNo">687</span>    byte[] family = Bytes.toBytes("family");<a name="line.687"></a>
+<span class="sourceLineNo">688</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.688"></a>
+<span class="sourceLineNo">689</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.689"></a>
+<span class="sourceLineNo">690</span>    try {<a name="line.690"></a>
+<span class="sourceLineNo">691</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.691"></a>
+<span class="sourceLineNo">692</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.692"></a>
+<span class="sourceLineNo">693</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.693"></a>
+<span class="sourceLineNo">694</span><a name="line.694"></a>
+<span class="sourceLineNo">695</span>      Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.695"></a>
+<span class="sourceLineNo">696</span><a name="line.696"></a>
+<span class="sourceLineNo">697</span>      long maxSeqId = 1050;<a name="line.697"></a>
+<span class="sourceLineNo">698</span>      long minSeqId = 1000;<a name="line.698"></a>
+<span class="sourceLineNo">699</span><a name="line.699"></a>
+<span class="sourceLineNo">700</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.700"></a>
+<span class="sourceLineNo">701</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.701"></a>
+<span class="sourceLineNo">702</span>        fs.create(recoveredEdits);<a name="line.702"></a>
+<span class="sourceLineNo">703</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.703"></a>
+<span class="sourceLineNo">704</span><a name="line.704"></a>
+<span class="sourceLineNo">705</span>        long time = System.nanoTime();<a name="line.705"></a>
+<span class="sourceLineNo">706</span>        WALEdit edit = new WALEdit();<a name="line.706"></a>
+<span class="sourceLineNo">707</span>        edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.707"></a>
+<span class="sourceLineNo">708</span>            .toBytes(i)));<a name="line.708"></a>
+<span class="sourceLineNo">709</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.709"></a>
+<span class="sourceLineNo">710</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.710"></a>
+<span class="sourceLineNo">711</span><a name="line.711"></a>
+<span class="sourceLineNo">712</span>        writer.close();<a name="line.712"></a>
+<span class="sourceLineNo">713</span>      }<a name="line.713"></a>
+<span class="sourceLineNo">714</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.714"></a>
+<span class="sourceLineNo">715</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.715"></a>
+<span class="sourceLineNo">716</span>      for (HStore store : region.getStores()) {<a name="line.716"></a>
+<span class="sourceLineNo">717</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), minSeqId - 1);<a name="line.717"></a>
+<span class="sourceLineNo">718</span>      }<a name="line.718"></a>
+<span class="sourceLineNo">719</span>      long seqId = region.replayRecoveredEditsIfAny(maxSeqIdInStores, null, status);<a name="line.719"></a>
+<span class="sourceLineNo">720</span>      assertEquals(maxSeqId, seqId);<a name="line.720"></a>
+<span class="sourceLineNo">721</span>      region.getMVCC().advanceTo(seqId);<a name="line.721"></a>
+<span class="sourceLineNo">722</span>      Get get = new Get(row);<a name="line.722"></a>
+<span class="sourceLineNo">723</span>      Result result = region.get(get);<a name="line.723"></a>
+<span class="sourceLineNo">724</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.724"></a>
+<span class="sourceLineNo">725</span>        List&lt;Cell&gt; kvs = result.getColumnCells(family, Bytes.toBytes(i));<a name="line.725"></a>
+<span class="sourceLineNo">726</span>        assertEquals(1, kvs.size());<a name="line.726"></a>
+<span class="sourceLineNo">727</span>        assertArrayEquals(Bytes.toBytes(i), CellUtil.cloneValue(kvs.get(0)));<a name="line.727"></a>
+<span class="sourceLineNo">728</span>      }<a name="line.728"></a>
+<span class="sourceLineNo">729</span>    } finally {<a name="line.729"></a>
+<span class="sourceLineNo">730</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.730"></a>
+<span class="sourceLineNo">731</span>      this.region = null;<a name="line.731"></a>
+<span class="sourceLineNo">732</span>      wals.close();<a name="line.732"></a>
+<span class="sourceLineNo">733</span>    }<a name="line.733"></a>
+<span class="sourceLineNo">734</span>  }<a name="line.734"></a>
+<span class="sourceLineNo">735</span><a name="line.735"></a>
+<span class="sourceLineNo">736</span>  @Test<a name="line.736"></a>
+<span class="sourceLineNo">737</span>  public void testSkipRecoveredEditsReplaySomeIgnored() throws Exception {<a name="line.737"></a>
+<span class="sourceLineNo">738</span>    byte[] family = Bytes.toBytes("family");<a name="line.738"></a>
+<span class="sourceLineNo">739</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.739"></a>
+<span class="sourceLineNo">740</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.740"></a>
+<span class="sourceLineNo">741</span>    try {<a name="line.741"></a>
+<span class="sourceLineNo">742</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.742"></a>
+<span class="sourceLineNo">743</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.743"></a>
+<span class="sourceLineNo">744</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.744"></a>
+<span class="sourceLineNo">745</span><a name="line.745"></a>
+<span class="sourceLineNo">746</span>      Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.746"></a>
+<span class="sourceLineNo">747</span><a name="line.747"></a>
+<span class="sourceLineNo">748</span>      long maxSeqId = 1050;<a name="line.748"></a>
+<span class="sourceLineNo">749</span>      long minSeqId = 1000;<a name="line.749"></a>
+<span class="sourceLineNo">750</span><a name="line.750"></a>
+<span class="sourceLineNo">751</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.751"></a>
+<span class="sourceLineNo">752</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.752"></a>
+<span class="sourceLineNo">753</span>        fs.create(recoveredEdits);<a name="line.753"></a>
+<span class="sourceLineNo">754</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.754"></a>
+<span class="sourceLineNo">755</span><a name="line.755"></a>
+<span class="sourceLineNo">756</span>        long time = System.nanoTime();<a name="line.756"></a>
+<span class="sourceLineNo">757</span>        WALEdit edit = new WALEdit();<a name="line.757"></a>
+<span class="sourceLineNo">758</span>        edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.758"></a>
+<span class="sourceLineNo">759</span>            .toBytes(i)));<a name="line.759"></a>
+<span class="sourceLineNo">760</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.760"></a>
+<span class="sourceLineNo">761</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.761"></a>
+<span class="sourceLineNo">762</span><a name="line.762"></a>
+<span class="sourceLineNo">763</span>        writer.close();<a name="line.763"></a>
+<span class="sourceLineNo">764</span>      }<a name="line.764"></a>
+<span class="sourceLineNo">765</span>      long recoverSeqId = 1030;<a name="line.765"></a>
+<span class="sourceLineNo">766</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.766"></a>
+<span class="sourceLineNo">767</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.767"></a>
+<span class="sourceLineNo">768</span>      for (HStore store : region.getStores()) {<a name="line.768"></a>
+<span class="sourceLineNo">769</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), recoverSeqId - 1);<a name="line.769"></a>
+<span class="sourceLineNo">770</span>      }<a name="line.770"></a>
+<span class="sourceLineNo">771</span>      long seqId = region.replayRecoveredEditsIfAny(maxSeqIdInStores, null, status);<a name="line.771"></a>
+<span class="sourceLineNo">772</span>      assertEquals(maxSeqId, seqId);<a name="line.772"></a>
+<span class="sourceLineNo">773</span>      region.getMVCC().advanceTo(seqId);<a name="line.773"></a>
+<span class="sourceLineNo">774</span>      Get get = new Get(row);<a name="line.774"></a>
+<span class="sourceLineNo">775</span>      Result result = region.get(get);<a name="line.775"></a>
+<span class="sourceLineNo">776</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.776"></a>
+<span class="sourceLineNo">777</span>        List&lt;Cell&gt; kvs = result.getColumnCells(family, Bytes.toBytes(i));<a name="line.777"></a>
+<span class="sourceLineNo">778</span>        if (i &lt; recoverSeqId) {<a name="line.778"></a>
+<span class="sourceLineNo">779</span>          assertEquals(0, kvs.size());<a name="line.779"></a>
+<span class="sourceLineNo">780</span>        } else {<a name="line.780"></a>
+<span class="sourceLineNo">781</span>          assertEquals(1, kvs.size());<a name="line.781"></a>
+<span class="sourceLineNo">782</span>          assertArrayEquals(Bytes.toBytes(i), CellUtil.cloneValue(kvs.get(0)));<a name="line.782"></a>
+<span class="sourceLineNo">783</span>        }<a name="line.783"></a>
+<span class="sourceLineNo">784</span>      }<a name="line.784"></a>
+<span class="sourceLineNo">785</span>    } finally {<a name="line.785"></a>
+<span class="sourceLineNo">786</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.786"></a>
+<span class="sourceLineNo">787</span>      this.region = null;<a name="line.787"></a>
+<span class="sourceLineNo">788</span>      wals.close();<a name="line.788"></a>
+<span class="sourceLineNo">789</span>    }<a name="line.789"></a>
+<span class="sourceLineNo">790</span>  }<a name="line.790"></a>
+<span class="sourceLineNo">791</span><a name="line.791"></a>
+<span class="sourceLineNo">792</span>  @Test<a name="line.792"></a>
+<span class="sourceLineNo">793</span>  public void testSkipRecoveredEditsReplayAllIgnored() throws Exception {<a name="line.793"></a>
+<span class="sourceLineNo">794</span>    byte[] family = Bytes.toBytes("family");<a name="line.794"></a>
+<span class="sourceLineNo">795</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.795"></a>
+<span class="sourceLineNo">796</span>    Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.796"></a>
+<span class="sourceLineNo">797</span>    FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.797"></a>
+<span class="sourceLineNo">798</span><a name="line.798"></a>
+<span class="sourceLineNo">799</span>    Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.799"></a>
+<span class="sourceLineNo">800</span>    for (int i = 1000; i &lt; 1050; i += 10) {<a name="line.800"></a>
+<span class="sourceLineNo">801</span>      Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.801"></a>
+<span class="sourceLineNo">802</span>      FSDataOutputStream dos = fs.create(recoveredEdits);<a name="line.802"></a>
+<span class="sourceLineNo">803</span>      dos.writeInt(i);<a name="line.803"></a>
+<span class="sourceLineNo">804</span>      dos.close();<a name="line.804"></a>
+<span class="sourceLineNo">805</span>    }<a name="line.805"></a>
+<span class="sourceLineNo">806</span>    long minSeqId = 2000;<a name="line.806"></a>
+<span class="sourceLineNo">807</span>    Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", minSeqId - 1));<a name="line.807"></a>
+<span class="sourceLineNo">808</span>    FSDataOutputStream dos = fs.create(recoveredEdits);<a name="line.808"></a>
+<span class="sourceLineNo">809</span>    dos.close();<a name="line.809"></a>
+<span class="sourceLineNo">810</span><a name="line.810"></a>
+<span class="sourceLineNo">811</span>    Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.811"></a>
+<span class="sourceLineNo">812</span>    for (HStore store : region.getStores()) {<a name="line.812"></a>
+<span class="sourceLineNo">813</span>      maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), minSeqId);<a name="line.813"></a>
+<span class="sourceLineNo">814</span>    }<a name="line.814"></a>
+<span class="sourceLineNo">815</span>    long seqId = region.replayRecoveredEditsIfAny(maxSeqIdInStores, null, null);<a name="line.815"></a>
+<span class="sourceLineNo">816</span>    assertEquals(minSeqId, seqId);<a name="line.816"></a>
+<span class="sourceLineNo">817</span>  }<a name="line.817"></a>
+<span class="sourceLineNo">818</span><a name="line.818"></a>
+<span class="sourceLineNo">819</span>  @Test<a name="line.819"></a>
+<span class="sourceLineNo">820</span>  public void testSkipRecoveredEditsReplayTheLastFileIgnored() throws Exception {<a name="line.820"></a>
+<span class="sourceLineNo">821</span>    byte[] family = Bytes.toBytes("family");<a name="line.821"></a>
+<span class="sourceLineNo">822</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.822"></a>
+<span class="sourceLineNo">823</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.823"></a>
+<span class="sourceLineNo">824</span>    try {<a name="line.824"></a>
+<span class="sourceLineNo">825</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.825"></a>
+<span class="sourceLineNo">826</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.826"></a>
+<span class="sourceLineNo">827</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.827"></a>
+<span class="sourceLineNo">828</span>      byte[][] columns = region.getTableDescriptor().getColumnFamilyNames().toArray(new byte[0][]);<a name="line.828"></a>
+<span class="sourceLineNo">829</span><a name="line.829"></a>
+<span class="sourceLineNo">830</span>      assertEquals(0, region.getStoreFileList(columns).size());<a name="line.830"></a>
+<span class="sourceLineNo">831</span><a name="line.831"></a>
+<span class="sourceLineNo">832</span>      Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.832"></a>
+<span class="sourceLineNo">833</span><a name="line.833"></a>
+<span class="sourceLineNo">834</span>      long maxSeqId = 1050;<a name="line.834"></a>
+<span class="sourceLineNo">835</span>      long minSeqId = 1000;<a name="line.835"></a>
+<span class="sourceLineNo">836</span><a name="line.836"></a>
+<span class="sourceLineNo">837</span>      for (long i = minSeqId; i &lt;= maxSeqId; i += 10) {<a name="line.837"></a>
+<span class="sourceLineNo">838</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", i));<a name="line.838"></a>
+<span class="sourceLineNo">839</span>        fs.create(recoveredEdits);<a name="line.839"></a>
+<span class="sourceLineNo">840</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.840"></a>
+<span class="sourceLineNo">841</span><a name="line.841"></a>
+<span class="sourceLineNo">842</span>        long time = System.nanoTime();<a name="line.842"></a>
+<span class="sourceLineNo">843</span>        WALEdit edit = null;<a name="line.843"></a>
+<span class="sourceLineNo">844</span>        if (i == maxSeqId) {<a name="line.844"></a>
+<span class="sourceLineNo">845</span>          edit = WALEdit.createCompaction(region.getRegionInfo(),<a name="line.845"></a>
+<span class="sourceLineNo">846</span>          CompactionDescriptor.newBuilder()<a name="line.846"></a>
+<span class="sourceLineNo">847</span>          .setTableName(ByteString.copyFrom(tableName.getName()))<a name="line.847"></a>
+<span class="sourceLineNo">848</span>          .setFamilyName(ByteString.copyFrom(regionName))<a name="line.848"></a>
+<span class="sourceLineNo">849</span>          .setEncodedRegionName(ByteString.copyFrom(regionName))<a name="line.849"></a>
+<span class="sourceLineNo">850</span>          .setStoreHomeDirBytes(ByteString.copyFrom(Bytes.toBytes(regiondir.toString())))<a name="line.850"></a>
+<span class="sourceLineNo">851</span>          .setRegionName(ByteString.copyFrom(region.getRegionInfo().getRegionName()))<a name="line.851"></a>
+<span class="sourceLineNo">852</span>          .build());<a name="line.852"></a>
+<span class="sourceLineNo">853</span>        } else {<a name="line.853"></a>
+<span class="sourceLineNo">854</span>          edit = new WALEdit();<a name="line.854"></a>
+<span class="sourceLineNo">855</span>          edit.add(new KeyValue(row, family, Bytes.toBytes(i), time, KeyValue.Type.Put, Bytes<a name="line.855"></a>
+<span class="sourceLineNo">856</span>            .toBytes(i)));<a name="line.856"></a>
+<span class="sourceLineNo">857</span>        }<a name="line.857"></a>
+<span class="sourceLineNo">858</span>        writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, i, time,<a name="line.858"></a>
+<span class="sourceLineNo">859</span>            HConstants.DEFAULT_CLUSTER_ID), edit));<a name="line.859"></a>
+<span class="sourceLineNo">860</span>        writer.close();<a name="line.860"></a>
+<span class="sourceLineNo">861</span>      }<a name="line.861"></a>
+<span class="sourceLineNo">862</span><a name="line.862"></a>
+<span class="sourceLineNo">863</span>      long recoverSeqId = 1030;<a name="line.863"></a>
+<span class="sourceLineNo">864</span>      Map&lt;byte[], Long&gt; maxSeqIdInStores = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.864"></a>
+<span class="sourceLineNo">865</span>      MonitoredTask status = TaskMonitor.get().createStatus(method);<a name="line.865"></a>
+<span class="sourceLineNo">866</span>      for (HStore store : region.getStores()) {<a name="line.866"></a>
+<span class="sourceLineNo">867</span>        maxSeqIdInStores.put(Bytes.toBytes(store.getColumnFamilyName()), recoverSeqId - 1);<a name="line.867"></a>
+<span class="sourceLineNo">868</span>      }<a name="line.868"></a>
+<span class="sourceLineNo">869</span>      long seqId = region.replayRecoveredEditsIfAny(maxSeqIdInStores, null, status);<a name="line.869"></a>
+<span class="sourceLineNo">870</span>      assertEquals(maxSeqId, seqId);<a name="line.870"></a>
+<span class="sourceLineNo">871</span><a name="line.871"></a>
+<span class="sourceLineNo">872</span>      // assert that the files are flushed<a name="line.872"></a>
+<span class="sourceLineNo">873</span>      assertEquals(1, region.getStoreFileList(columns).size());<a name="line.873"></a>
+<span class="sourceLineNo">874</span><a name="line.874"></a>
+<span class="sourceLineNo">875</span>    } finally {<a name="line.875"></a>
+<span class="sourceLineNo">876</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.876"></a>
+<span class="sourceLineNo">877</span>      this.region = null;<a name="line.877"></a>
+<span class="sourceLineNo">878</span>      wals.close();<a name="line.878"></a>
+<span class="sourceLineNo">879</span>    }<a name="line.879"></a>
+<span class="sourceLineNo">880</span>  }<a name="line.880"></a>
+<span class="sourceLineNo">881</span><a name="line.881"></a>
+<span class="sourceLineNo">882</span>  @Test<a name="line.882"></a>
+<span class="sourceLineNo">883</span>  public void testRecoveredEditsReplayCompaction() throws Exception {<a name="line.883"></a>
+<span class="sourceLineNo">884</span>    testRecoveredEditsReplayCompaction(false);<a name="line.884"></a>
+<span class="sourceLineNo">885</span>    testRecoveredEditsReplayCompaction(true);<a name="line.885"></a>
+<span class="sourceLineNo">886</span>  }<a name="line.886"></a>
+<span class="sourceLineNo">887</span><a name="line.887"></a>
+<span class="sourceLineNo">888</span>  public void testRecoveredEditsReplayCompaction(boolean mismatchedRegionName) throws Exception {<a name="line.888"></a>
+<span class="sourceLineNo">889</span>    CONF.setClass(HConstants.REGION_IMPL, HRegionForTesting.class, Region.class);<a name="line.889"></a>
+<span class="sourceLineNo">890</span>    byte[] family = Bytes.toBytes("family");<a name="line.890"></a>
+<span class="sourceLineNo">891</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.891"></a>
+<span class="sourceLineNo">892</span>    final WALFactory wals = new WALFactory(CONF, method);<a name="line.892"></a>
+<span class="sourceLineNo">893</span>    try {<a name="line.893"></a>
+<span class="sourceLineNo">894</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.894"></a>
+<span class="sourceLineNo">895</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.895"></a>
+<span class="sourceLineNo">896</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.896"></a>
+<span class="sourceLineNo">897</span><a name="line.897"></a>
+<span class="sourceLineNo">898</span>      long maxSeqId = 3;<a name="line.898"></a>
+<span class="sourceLineNo">899</span>      long minSeqId = 0;<a name="line.899"></a>
+<span class="sourceLineNo">900</span><a name="line.900"></a>
+<span class="sourceLineNo">901</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.901"></a>
+<span class="sourceLineNo">902</span>        Put put = new Put(Bytes.toBytes(i));<a name="line.902"></a>
+<span class="sourceLineNo">903</span>        put.addColumn(family, Bytes.toBytes(i), Bytes.toBytes(i));<a name="line.903"></a>
+<span class="sourceLineNo">904</span>        region.put(put);<a name="line.904"></a>
+<span class="sourceLineNo">905</span>        region.flush(true);<a name="line.905"></a>
+<span class="sourceLineNo">906</span>      }<a name="line.906"></a>
+<span class="sourceLineNo">907</span><a name="line.907"></a>
+<span class="sourceLineNo">908</span>      // this will create a region with 3 files<a name="line.908"></a>
+<span class="sourceLineNo">909</span>      assertEquals(3, region.getStore(family).getStorefilesCount());<a name="line.909"></a>
+<span class="sourceLineNo">910</span>      List&lt;Path&gt; storeFiles = new ArrayList&lt;&gt;(3);<a name="line.910"></a>
+<span class="sourceLineNo">911</span>      for (HStoreFile sf : region.getStore(family).getStorefiles()) {<a name="line.911"></a>
+<span class="sourceLineNo">912</span>        storeFiles.add(sf.getPath());<a name="line.912"></a>
+<span class="sourceLineNo">913</span>      }<a name="line.913"></a>
+<span class="sourceLineNo">914</span><a name="line.914"></a>
+<span class="sourceLineNo">915</span>      // disable compaction completion<a name="line.915"></a>
+<span class="sourceLineNo">916</span>      CONF.setBoolean("hbase.hstore.compaction.complete", false);<a name="line.916"></a>
+<span class="sourceLineNo">917</span>      region.compactStores();<a name="line.917"></a>
+<span class="sourceLineNo">918</span><a name="line.918"></a>
+<span class="sourceLineNo">919</span>      // ensure that nothing changed<a name="line.919"></a>
+<span class="sourceLineNo">920</span>      assertEquals(3, region.getStore(family).getStorefilesCount());<a name="line.920"></a>
+<span class="sourceLineNo">921</span><a name="line.921"></a>
+<span class="sourceLineNo">922</span>      // now find the compacted file, and manually add it to the recovered edits<a name="line.922"></a>
+<span class="sourceLineNo">923</span>      Path tmpDir = new Path(region.getRegionFileSystem().getTempDir(), Bytes.toString(family));<a name="line.923"></a>
+<span class="sourceLineNo">924</span>      FileStatus[] files = FSUtils.listStatus(fs, tmpDir);<a name="line.924"></a>
+<span class="sourceLineNo">925</span>      String errorMsg = "Expected to find 1 file in the region temp directory "<a name="line.925"></a>
+<span class="sourceLineNo">926</span>          + "from the compaction, could not find any";<a name="line.926"></a>
+<span class="sourceLineNo">927</span>      assertNotNull(errorMsg, files);<a name="line.927"></a>
+<span class="sourceLineNo">928</span>      assertEquals(errorMsg, 1, files.length);<a name="line.928"></a>
+<span class="sourceLineNo">929</span>      // move the file inside region dir<a name="line.929"></a>
+<span class="sourceLineNo">930</span>      Path newFile = region.getRegionFileSystem().commitStoreFile(Bytes.toString(family),<a name="line.930"></a>
+<span class="sourceLineNo">931</span>          files[0].getPath());<a name="line.931"></a>
+<span class="sourceLineNo">932</span><a name="line.932"></a>
+<span class="sourceLineNo">933</span>      byte[] encodedNameAsBytes = this.region.getRegionInfo().getEncodedNameAsBytes();<a name="line.933"></a>
+<span class="sourceLineNo">934</span>      byte[] fakeEncodedNameAsBytes = new byte [encodedNameAsBytes.length];<a name="line.934"></a>
+<span class="sourceLineNo">935</span>      for (int i=0; i &lt; encodedNameAsBytes.length; i++) {<a name="line.935"></a>
+<span class="sourceLineNo">936</span>        // Mix the byte array to have a new encodedName<a name="line.936"></a>
+<span class="sourceLineNo">937</span>        fakeEncodedNameAsBytes[i] = (byte) (encodedNameAsBytes[i] + 1);<a name="line.937"></a>
+<span class="sourceLineNo">938</span>      }<a name="line.938"></a>
+<span class="sourceLineNo">939</span><a name="line.939"></a>
+<span class="sourceLineNo">940</span>      CompactionDescriptor compactionDescriptor = ProtobufUtil.toCompactionDescriptor(this.region<a name="line.940"></a>
+<span class="sourceLineNo">941</span>        .getRegionInfo(), mismatchedRegionName ? fakeEncodedNameAsBytes : null, family,<a name="line.941"></a>
+<span class="sourceLineNo">942</span>            storeFiles, Lists.newArrayList(newFile),<a name="line.942"></a>
+<span class="sourceLineNo">943</span>            region.getRegionFileSystem().getStoreDir(Bytes.toString(family)));<a name="line.943"></a>
+<span class="sourceLineNo">944</span><a name="line.944"></a>
+<span class="sourceLineNo">945</span>      WALUtil.writeCompactionMarker(region.getWAL(), this.region.getReplicationScope(),<a name="line.945"></a>
+<span class="sourceLineNo">946</span>          this.region.getRegionInfo(), compactionDescriptor, region.getMVCC());<a name="line.946"></a>
+<span class="sourceLineNo">947</span><a name="line.947"></a>
+<span class="sourceLineNo">948</span>      Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.948"></a>
+<span class="sourceLineNo">949</span><a name="line.949"></a>
+<span class="sourceLineNo">950</span>      Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", 1000));<a name="line.950"></a>
+<span class="sourceLineNo">951</span>      fs.create(recoveredEdits);<a name="line.951"></a>
+<span class="sourceLineNo">952</span>      WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.952"></a>
+<span class="sourceLineNo">953</span><a name="line.953"></a>
+<span class="sourceLineNo">954</span>      long time = System.nanoTime();<a name="line.954"></a>
+<span class="sourceLineNo">955</span><a name="line.955"></a>
+<span class="sourceLineNo">956</span>      writer.append(new WAL.Entry(new WALKeyImpl(regionName, tableName, 10, time,<a name="line.956"></a>
+<span class="sourceLineNo">957</span>          HConstants.DEFAULT_CLUSTER_ID), WALEdit.createCompaction(region.getRegionInfo(),<a name="line.957"></a>
+<span class="sourceLineNo">958</span>          compactionDescriptor)));<a name="line.958"></a>
+<span class="sourceLineNo">959</span>      writer.close();<a name="line.959"></a>
+<span class="sourceLineNo">960</span><a name="line.960"></a>
+<span class="sourceLineNo">961</span>      // close the region now, and reopen again<a name="line.961"></a>
+<span class="sourceLineNo">962</span>      region.getTableDescriptor();<a name="line.962"></a>
+<span class="sourceLineNo">963</span>      region.getRegionInfo();<a name="line.963"></a>
+<span class="sourceLineNo">964</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.964"></a>
+<span class="sourceLineNo">965</span>      try {<a name="line.965"></a>
+<span class="sourceLineNo">966</span>        region = HRegion.openHRegion(region, null);<a name="line.966"></a>
+<span class="sourceLineNo">967</span>      } catch (WrongRegionException wre) {<a name="line.967"></a>
+<span class="sourceLineNo">968</span>        fail("Matching encoded region name should not have produced WrongRegionException");<a name="line.968"></a>
+<span class="sourceLineNo">969</span>      }<a name="line.969"></a>
+<span class="sourceLineNo">970</span><a name="line.970"></a>
+<span class="sourceLineNo">971</span>      // now check whether we have only one store file, the compacted one<a name="line.971"></a>
+<span class="sourceLineNo">972</span>      Collection&lt;HStoreFile&gt; sfs = region.getStore(family).getStorefiles();<a name="line.972"></a>
+<span class="sourceLineNo">973</span>      for (HStoreFile sf : sfs) {<a name="line.973"></a>
+<span class="sourceLineNo">974</span>        LOG.info(Objects.toString(sf.getPath()));<a name="line.974"></a>
+<span class="sourceLineNo">975</span>      }<a name="line.975"></a>
+<span class="sourceLineNo">976</span>      if (!mismatchedRegionName) {<a name="line.976"></a>
+<span class="sourceLineNo">977</span>        assertEquals(1, region.getStore(family).getStorefilesCount());<a name="line.977"></a>
+<span class="sourceLineNo">978</span>      }<a name="line.978"></a>
+<span class="sourceLineNo">979</span>      files = FSUtils.listStatus(fs, tmpDir);<a name="line.979"></a>
+<span class="sourceLineNo">980</span>      assertTrue("Expected to find 0 files inside " + tmpDir, files == null || files.length == 0);<a name="line.980"></a>
+<span class="sourceLineNo">981</span><a name="line.981"></a>
+<span class="sourceLineNo">982</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.982"></a>
+<span class="sourceLineNo">983</span>        Get get = new Get(Bytes.toBytes(i));<a name="line.983"></a>
+<span class="sourceLineNo">984</span>        Result result = region.get(get);<a name="line.984"></a>
+<span class="sourceLineNo">985</span>        byte[] value = result.getValue(family, Bytes.toBytes(i));<a name="line.985"></a>
+<span class="sourceLineNo">986</span>        assertArrayEquals(Bytes.toBytes(i), value);<a name="line.986"></a>
+<span class="sourceLineNo">987</span>      }<a name="line.987"></a>
+<span class="sourceLineNo">988</span>    } finally {<a name="line.988"></a>
+<span class="sourceLineNo">989</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.989"></a>
+<span class="sourceLineNo">990</span>      this.region = null;<a name="line.990"></a>
+<span class="sourceLineNo">991</span>      wals.close();<a name="line.991"></a>
+<span class="sourceLineNo">992</span>      CONF.setClass(HConstants.REGION_IMPL, HRegion.class, Region.class);<a name="line.992"></a>
+<span class="sourceLineNo">993</span>    }<a name="line.993"></a>
+<span class="sourceLineNo">994</span>  }<a name="line.994"></a>
+<span class="sourceLineNo">995</span><a name="line.995"></a>
+<span class="sourceLineNo">996</span>  @Test<a name="line.996"></a>
+<span class="sourceLineNo">997</span>  public void testFlushMarkers() throws Exception {<a name="line.997"></a>
+<span class="sourceLineNo">998</span>    // tests that flush markers are written to WAL and handled at recovered edits<a name="line.998"></a>
+<span class="sourceLineNo">999</span>    byte[] family = Bytes.toBytes("family");<a name="line.999"></a>
+<span class="sourceLineNo">1000</span>    Path logDir = TEST_UTIL.getDataTestDirOnTestFS(method + ".log");<a name="line.1000"></a>
+<span class="sourceLineNo">1001</span>    final Configuration walConf = new Configuration(TEST_UTIL.getConfiguration());<a name="line.1001"></a>
+<span class="sourceLineNo">1002</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.1002"></a>
+<span class="sourceLineNo">1003</span>    final WALFactory wals = new WALFactory(walConf, method);<a name="line.1003"></a>
+<span class="sourceLineNo">1004</span>    final WAL wal = wals.getWAL(RegionInfoBuilder.newBuilder(tableName).build());<a name="line.1004"></a>
+<span class="sourceLineNo">1005</span><a name="line.1005"></a>
+<span class="sourceLineNo">1006</span>    this.region = initHRegion(tableName, HConstants.EMPTY_START_ROW,<a name="line.1006"></a>
+<span class="sourceLineNo">1007</span>      HConstants.EMPTY_END_ROW, false, Durability.USE_DEFAULT, wal, family);<a name="line.1007"></a>
+<span class="sourceLineNo">1008</span>    try {<a name="line.1008"></a>
+<span class="sourceLineNo">1009</span>      Path regiondir = region.getRegionFileSystem().getRegionDir();<a name="line.1009"></a>
+<span class="sourceLineNo">1010</span>      FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.1010"></a>
+<span class="sourceLineNo">1011</span>      byte[] regionName = region.getRegionInfo().getEncodedNameAsBytes();<a name="line.1011"></a>
+<span class="sourceLineNo">1012</span><a name="line.1012"></a>
+<span class="sourceLineNo">1013</span>      long maxSeqId = 3;<a name="line.1013"></a>
+<span class="sourceLineNo">1014</span>      long minSeqId = 0;<a name="line.1014"></a>
+<span class="sourceLineNo">1015</span><a name="line.1015"></a>
+<span class="sourceLineNo">1016</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.1016"></a>
+<span class="sourceLineNo">1017</span>        Put put = new Put(Bytes.toBytes(i));<a name="line.1017"></a>
+<span class="sourceLineNo">1018</span>        put.addColumn(family, Bytes.toBytes(i), Bytes.toBytes(i));<a name="line.1018"></a>
+<span class="sourceLineNo">1019</span>        region.put(put);<a name="line.1019"></a>
+<span class="sourceLineNo">1020</span>        region.flush(true);<a name="line.1020"></a>
+<span class="sourceLineNo">1021</span>      }<a name="line.1021"></a>
+<span class="sourceLineNo">1022</span><a name="line.1022"></a>
+<span class="sourceLineNo">1023</span>      // this will create a region with 3 files from flush<a name="line.1023"></a>
+<span class="sourceLineNo">1024</span>      assertEquals(3, region.getStore(family).getStorefilesCount());<a name="line.1024"></a>
+<span class="sourceLineNo">1025</span>      List&lt;String&gt; storeFiles = new ArrayList&lt;&gt;(3);<a name="line.1025"></a>
+<span class="sourceLineNo">1026</span>      for (HStoreFile sf : region.getStore(family).getStorefiles()) {<a name="line.1026"></a>
+<span class="sourceLineNo">1027</span>        storeFiles.add(sf.getPath().getName());<a name="line.1027"></a>
+<span class="sourceLineNo">1028</span>      }<a name="line.1028"></a>
+<span class="sourceLineNo">1029</span><a name="line.1029"></a>
+<span class="sourceLineNo">1030</span>      // now verify that the flush markers are written<a name="line.1030"></a>
+<span class="sourceLineNo">1031</span>      wal.shutdown();<a name="line.1031"></a>
+<span class="sourceLineNo">1032</span>      WAL.Reader reader = WALFactory.createReader(fs, AbstractFSWALProvider.getCurrentFileName(wal),<a name="line.1032"></a>
+<span class="sourceLineNo">1033</span>        TEST_UTIL.getConfiguration());<a name="line.1033"></a>
+<span class="sourceLineNo">1034</span>      try {<a name="line.1034"></a>
+<span class="sourceLineNo">1035</span>        List&lt;WAL.Entry&gt; flushDescriptors = new ArrayList&lt;&gt;();<a name="line.1035"></a>
+<span class="sourceLineNo">1036</span>        long lastFlushSeqId = -1;<a name="line.1036"></a>
+<span class="sourceLineNo">1037</span>        while (true) {<a name="line.1037"></a>
+<span class="sourceLineNo">1038</span>          WAL.Entry entry = reader.next();<a name="line.1038"></a>
+<span class="sourceLineNo">1039</span>          if (entry == null) {<a name="line.1039"></a>
+<span class="sourceLineNo">1040</span>            break;<a name="line.1040"></a>
+<span class="sourceLineNo">1041</span>          }<a name="line.1041"></a>
+<span class="sourceLineNo">1042</span>          Cell cell = entry.getEdit().getCells().get(0);<a name="line.1042"></a>
+<span class="sourceLineNo">1043</span>          if (WALEdit.isMetaEditFamily(cell)) {<a name="line.1043"></a>
+<span class="sourceLineNo">1044</span>            FlushDescriptor flushDesc = WALEdit.getFlushDescriptor(cell);<a name="line.1044"></a>
+<span class="sourceLineNo">1045</span>            assertNotNull(flushDesc);<a name="line.1045"></a>
+<span class="sourceLineNo">1046</span>            assertArrayEquals(tableName.getName(), flushDesc.getTableName().toByteArray());<a name="line.1046"></a>
+<span class="sourceLineNo">1047</span>            if (flushDesc.getAction() == FlushAction.START_FLUSH) {<a name="line.1047"></a>
+<span class="sourceLineNo">1048</span>              assertTrue(flushDesc.getFlushSequenceNumber() &gt; lastFlushSeqId);<a name="line.1048"></a>
+<span class="sourceLineNo">1049</span>            } else if (flushDesc.getAction() == FlushAction.COMMIT_FLUSH) {<a name="line.1049"></a>
+<span class="sourceLineNo">1050</span>              assertTrue(flushDesc.getFlushSequenceNumber() == lastFlushSeqId);<a name="line.1050"></a>
+<span class="sourceLineNo">1051</span>            }<a name="line.1051"></a>
+<span class="sourceLineNo">1052</span>            lastFlushSeqId = flushDesc.getFlushSequenceNumber();<a name="line.1052"></a>
+<span class="sourceLineNo">1053</span>            assertArrayEquals(regionName, flushDesc.getEncodedRegionName().toByteArray());<a name="line.1053"></a>
+<span class="sourceLineNo">1054</span>            assertEquals(1, flushDesc.getStoreFlushesCount()); //only one store<a name="line.1054"></a>
+<span class="sourceLineNo">1055</span>            StoreFlushDescriptor storeFlushDesc = flushDesc.getStoreFlushes(0);<a name="line.1055"></a>
+<span class="sourceLineNo">1056</span>            assertArrayEquals(family, storeFlushDesc.getFamilyName().toByteArray());<a name="line.1056"></a>
+<span class="sourceLineNo">1057</span>            assertEquals("family", storeFlushDesc.getStoreHomeDir());<a name="line.1057"></a>
+<span class="sourceLineNo">1058</span>            if (flushDesc.getAction() == FlushAction.START_FLUSH) {<a name="line.1058"></a>
+<span class="sourceLineNo">1059</span>              assertEquals(0, storeFlushDesc.getFlushOutputCount());<a name="line.1059"></a>
+<span class="sourceLineNo">1060</span>            } else {<a name="line.1060"></a>
+<span class="sourceLineNo">1061</span>              assertEquals(1, storeFlushDesc.getFlushOutputCount()); //only one file from flush<a name="line.1061"></a>
+<span class="sourceLineNo">1062</span>              assertTrue(storeFiles.contains(storeFlushDesc.getFlushOutput(0)));<a name="line.1062"></a>
+<span class="sourceLineNo">1063</span>            }<a name="line.1063"></a>
+<span class="sourceLineNo">1064</span><a name="line.1064"></a>
+<span class="sourceLineNo">1065</span>            flushDescriptors.add(entry);<a name="line.1065"></a>
+<span class="sourceLineNo">1066</span>          }<a name="line.1066"></a>
+<span class="sourceLineNo">1067</span>        }<a name="line.1067"></a>
+<span class="sourceLineNo">1068</span><a name="line.1068"></a>
+<span class="sourceLineNo">1069</span>        assertEquals(3 * 2, flushDescriptors.size()); // START_FLUSH and COMMIT_FLUSH per flush<a name="line.1069"></a>
+<span class="sourceLineNo">1070</span><a name="line.1070"></a>
+<span class="sourceLineNo">1071</span>        // now write those markers to the recovered edits again.<a name="line.1071"></a>
+<span class="sourceLineNo">1072</span><a name="line.1072"></a>
+<span class="sourceLineNo">1073</span>        Path recoveredEditsDir = WALSplitUtil.getRegionDirRecoveredEditsDir(regiondir);<a name="line.1073"></a>
+<span class="sourceLineNo">1074</span><a name="line.1074"></a>
+<span class="sourceLineNo">1075</span>        Path recoveredEdits = new Path(recoveredEditsDir, String.format("%019d", 1000));<a name="line.1075"></a>
+<span class="sourceLineNo">1076</span>        fs.create(recoveredEdits);<a name="line.1076"></a>
+<span class="sourceLineNo">1077</span>        WALProvider.Writer writer = wals.createRecoveredEditsWriter(fs, recoveredEdits);<a name="line.1077"></a>
+<span class="sourceLineNo">1078</span><a name="line.1078"></a>
+<span class="sourceLineNo">1079</span>        for (WAL.Entry entry : flushDescriptors) {<a name="line.1079"></a>
+<span class="sourceLineNo">1080</span>          writer.append(entry);<a name="line.1080"></a>
+<span class="sourceLineNo">1081</span>        }<a name="line.1081"></a>
+<span class="sourceLineNo">1082</span>        writer.close();<a name="line.1082"></a>
+<span class="sourceLineNo">1083</span>      } finally {<a name="line.1083"></a>
+<span class="sourceLineNo">1084</span>        if (null != reader) {<a name="line.1084"></a>
+<span class="sourceLineNo">1085</span>          try {<a name="line.1085"></a>
+<span class="sourceLineNo">1086</span>            reader.close();<a name="line.1086"></a>
+<span class="sourceLineNo">1087</span>          } catch (IOException exception) {<a name="line.1087"></a>
+<span class="sourceLineNo">1088</span>            LOG.warn("Problem closing wal: " + exception.getMessage());<a name="line.1088"></a>
+<span class="sourceLineNo">1089</span>            LOG.debug("exception details", exception);<a name="line.1089"></a>
+<span class="sourceLineNo">1090</span>          }<a name="line.1090"></a>
+<span class="sourceLineNo">1091</span>        }<a name="line.1091"></a>
+<span class="sourceLineNo">1092</span>      }<a name="line.1092"></a>
+<span class="sourceLineNo">1093</span><a name="line.1093"></a>
+<span class="sourceLineNo">1094</span>      // close the region now, and reopen again<a name="line.1094"></a>
+<span class="sourceLineNo">1095</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.1095"></a>
+<span class="sourceLineNo">1096</span>      region = HRegion.openHRegion(region, null);<a name="line.1096"></a>
+<span class="sourceLineNo">1097</span><a name="line.1097"></a>
+<span class="sourceLineNo">1098</span>      // now check whether we have can read back the data from region<a name="line.1098"></a>
+<span class="sourceLineNo">1099</span>      for (long i = minSeqId; i &lt; maxSeqId; i++) {<a name="line.1099"></a>
+<span class="sourceLineNo">1100</span>        Get get = new Get(Bytes.toBytes(i));<a name="line.1100"></a>
+<span class="sourceLineNo">1101</span>        Result result = region.get(get);<a name="line.1101"></a>
+<span class="sourceLineNo">1102</span>        byte[] value = result.getValue(family, Bytes.toBytes(i));<a name="line.1102"></a>
+<span class="sourceLineNo">1103</span>        assertArrayEquals(Bytes.toBytes(i), value);<a name="line.1103"></a>
+<span class="sourceLineNo">1104</span>      }<a name="line.1104"></a>
+<span class="sourceLineNo">1105</span>    } finally {<a name="line.1105"></a>
+<span class="sourceLineNo">1106</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.1106"></a>
+<span class="sourceLineNo">1107</span>      this.region = null;<a name="line.1107"></a>
+<span class="sourceLineNo">1108</span>      wals.close();<a name="line.1108"></a>
+<span class="sourceLineNo">1109</span>    }<a name="line.1109"></a>
+<span class="sourceLineNo">1110</span>  }<a name="line.1110"></a>
+<span class="sourceLineNo">1111</span><a name="line.1111"></a>
+<span class="sourceLineNo">1112</span>  static class IsFlushWALMarker implements ArgumentMatcher&lt;WALEdit&gt; {<a name="line.1112"></a>
+<span class="sourceLineNo">1113</span>    volatile FlushAction[] actions;<a name="line.1113"></a>
+<span class="sourceLineNo">1114</span>    public IsFlushWALMarker(FlushAction... actions) {<a name="line.1114"></a>
+<span class="sourceLineNo">1115</span>      this.actions = actions;<a name="line.1115"></a>
+<span class="sourceLineNo">1116</span>    }<a name="line.1116"></a>
+<span class="sourceLineNo">1117</span>    @Override<a name="line.1117"></a>
+<span class="sourceLineNo">1118</span>    public boolean matches(WALEdit edit) {<a name="line.1118"></a>
+<span class="sourceLineNo">1119</span>      List&lt;Cell&gt; cells = edit.getCells();<a name="line.1119"></a>
+<span class="sourceLineNo">1120</span>      if (cells.isEmpty()) {<a name="line.1120"></a>
+<span class="sourceLineNo">1121</span>        return false;<a name="line.1121"></a>
+<span class="sourceLineNo">1122</span>      }<a name="line.1122"></a>
+<span class="sourceLineNo">1123</span>      if (WALEdit.isMetaEditFamily(cells.get(0))) {<a name="line.1123"></a>
+<span class="sourceLineNo">1124</span>        FlushDescriptor desc;<a name="line.1124"></a>
+<span class="sourceLineNo">1125</span>        try {<a name="line.1125"></a>
+<span class="sourceLineNo">1126</span>          desc = WALEdit.getFlushDescriptor(cells.get(0));<a name="line.1126"></a>
+<span class="sourceLineNo">1127</span>        } catch (IOException e) {<a name="line.1127"></a>
+<span class="sourceLineNo">1128</span>          LOG.warn(e.toString(), e);<a name="line.1128"></a>
+<span class="sourceLineNo">1129</span>          return false;<a name="line.1129"></a>
+<span class="sourceLineNo">1130</span>        }<a name="line.1130"></a>
+<span class="sourceLineNo">1131</span>        if (desc != null) {<a name="line.1131"></a>
+<span class="sourceLineNo">1132</span>          for (FlushAction action : actions) {<a name="line.1132"></a>
+<span class="sourceLineNo">1133</span>            if (desc.getAction() == action) {<a name="line.1133"></a>
+<span class="sourceLineNo">1134</span>              return true;<a name="line.1134"></a>
+<span class="sourceLineNo">1135</span>            }<a name="line.1135"></a>
+<span class="sourceLineNo">1136</span>          }<a name="line.1136"></a>
+<span class="sourceLineNo">1137</span>        }<a name="line.1137"></a>
+<span class="sourceLineNo">1138</span>      }<a name="line.1138"></a>
+<span class="sourceLineNo">1139</span>      return false;<a name="line.1139"></a>
+<span class="sourceLineNo">1140</span>    }<a name="line.1140"></a>
+<span class="sourceLineNo">1141</span>    public IsFlushWALMarker set(FlushAction... actions) {<a name="line.1141"></a>
+<span class="sourceLineNo">1142</span>      this.actions = actions;<a name="line.1142"></a>
+<span class="sourceLineNo">1143</span>      return this;<a name="line.1143"></a>
+<span class="sourceLineNo">1144</span>    }<a name="line.1144"></a>
+<span class="sourceLineNo">1145</span>  }<a name="line.1145"></a>
+<span class="sourceLineNo">1146</span><a name="line.1146"></a>
+<span class="sourceLineNo">1147</span>  @Test<a name="line.1147"></a>
+<span class="sourceLineNo">1148</span>  public void testFlushMarkersWALFail() throws Exception {<a name="line.1148"></a>
+<span class="sourceLineNo">1149</span>    // test the cases where the WAL append for flush markers fail.<a name="line.1149"></a>
+<span class="sourceLineNo">1150</span>    byte[] family = Bytes.toBytes("family");<a name="line.1150"></a>
+<span class="sourceLineNo">1151</span><a name="line.1151"></a>
+<span class="sourceLineNo">1152</span>    // spy an actual WAL implementation to throw exception (was not able to mock)<a name="line.1152"></a>
+<span class="sourceLineNo">1153</span>    Path logDir = TEST_UTIL.getDataTestDirOnTestFS(method + "log");<a name="line.1153"></a>
+<span class="sourceLineNo">1154</span><a name="line.1154"></a>
+<span class="sourceLineNo">1155</span>    final Configuration walConf = new Configuration(TEST_UTIL.getConfiguration());<a name="line.1155"></a>
+<span class="sourceLineNo">1156</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.1156"></a>
+<span class="sourceLineNo">1157</span>    // Make up a WAL that we can manipulate at append time.<a name="line.1157"></a>
+<span class="sourceLineNo">1158</span>    class FailAppendFlushMarkerWAL extends FSHLog {<a name="line.1158"></a>
+<span class="sourceLineNo">1159</span>      volatile FlushAction [] flushActions = null;<a name="line.1159"></a>
+<span class="sourceLineNo">1160</span><a name="line.1160"></a>
+<span class="sourceLineNo">1161</span>      public FailAppendFlushMarkerWAL(FileSystem fs, Path root, String logDir, Configuration conf)<a name="line.1161"></a>
+<span class="sourceLineNo">1162</span>      throws IOException {<a name="line.1162"></a>
+<span class="sourceLineNo">1163</span>        super(fs, root, logDir, conf);<a name="line.1163"></a>
+<span class="sourceLineNo">1164</span>      }<a name="line.1164"></a>
+<span class="sourceLineNo">1165</span><a name="line.1165"></a>
+<span class="sourceLineNo">1166</span>      @Override<a name="line.1166"></a>
+<span class="sourceLineNo">1167</span>      protected Writer createWriterInstance(Path path) throws IOException {<a name="line.1167"></a>
+<span class="sourceLineNo">1168</span>        final Writer w = super.createWriterInstance(path);<a name="line.1168"></a>
+<span class="sourceLineNo">1169</span>        return new Writer() {<a name="line.1169"></a>
+<span class="sourceLineNo">1170</span>          @Override<a name="line.1170"></a>
+<span class="sourceLineNo">1171</span>          public void close() throws IOException {<a name="line.1171"></a>
+<span class="sourceLineNo">1172</span>            w.close();<a name="line.1172"></a>
+<span class="sourceLineNo">1173</span>          }<a name="line.1173"></a>
+<span class="sourceLineNo">1174</span><a name="line.1174"></a>
+<span class="sourceLineNo">1175</span>          @Override<a name="line.1175"></a>
+<span class="sourceLineNo">1176</span>          public void sync(boolean forceSync) throws IOException {<a name="line.1176"></a>
+<span class="sourceLineNo">1177</span>            w.sync(forceSync);<a name="line.1177"></a>
+<span class="sourceLineNo">1178</span>          }<a name="line.1178"></a>
+<span class="sourceLineNo">1179</span><a name="line.1179"></a>
+<span class="sourceLineNo">1180</span>          @Override<a name="line.1180"></a>
+<span class="sourceLineNo">1181</span>          public void append(Entry entry) throws IOException {<a name="line.1181"></a>
+<span class="sourceLineNo">1182</span>            List&lt;Cell&gt; cells = entry.getEdit().getCells();<a name="line.1182"></a>
+<span class="sourceLineNo">1183</span>            if (WALEdit.isMetaEditFamily(cells.get(0))) {<a name="line.1183"></a>
+<span class="sourceLineNo">1184</span>              FlushDescriptor desc = WALEdit.getFlushDescriptor(cells.get(0));<a name="line.1184"></a>
+<span class="sourceLineNo">1185</span>              if (desc != null) {<a name="line.1185"></a>
+<span class="sourceLineNo">1186</span>                for (FlushAction flushAction: flushActions) {<a name="line.1186"></a>
+<span class="sourceLineNo">1187</span>                  if (desc.getAction().equals(flushAction)) {<a name="line.1187"></a>
+<span class="sourceLineNo">1188</span>                    throw new IOException("Failed to append flush marker! " + flushAction);<a name="line.1188"></a>
+<span class="sourceLineNo">1189</span>                  }<a name="line.1189"></a>
+<span class="sourceLineNo">1190</span>                }<a name="line.1190"></a>
+<span class="sourceLineNo">1191</span>              }<a name="line.1191"></a>
+<span class="sourceLineNo">1192</span>            }<a name="line.1192"></a>
+<span class="sourceLineNo">1193</span>            w.append(entry);<a name="line.1193"></a>
+<span class="sourceLineNo">1194</span>          }<a name="line.1194"></a>
+<span class="sourceLineNo">1195</span><a name="line.1195"></a>
+<span class="sourceLineNo">1196</span>          @Override<a name="line.1196"></a>
+<span class="sourceLineNo">1197</span>          public long getLength() {<a name="line.1197"></a>
+<span class="sourceLineNo">1198</span>            return w.getLength();<a name="line.1198"></a>
+<span class="sourceLineNo">1199</span>          }<a name="line.1199"></a>
+<span class="sourceLineNo">1200</span>        };<a name="line.1200"></a>
+<span class="sourceLineNo">1201</span>      }<a name="line.1201"></a>
+<span class="sourceLineNo">1202</span>    }<a name="line.1202"></a>
+<span class="sourceLineNo">1203</span>    FailAppendFlushMarkerWAL wal =<a name="line.1203"></a>
+<span class="sourceLineNo">1204</span>      new FailAppendFlushMarkerWAL(FileSystem.get(walConf), FSUtils.getRootDir(walConf),<a name="line.1204"></a>
+<span class="sourceLineNo">1205</span>        method, walConf);<a name="line.1205"></a>
+<span class="sourceLineNo">1206</span>    wal.init();<a name="line.1206"></a>
+<span class="sourceLineNo">1207</span>    this.region = initHRegion(tableName, HConstants.EMPTY_START_ROW,<a name="line.1207"></a>
+<span class="sourceLineNo">1208</span>      HConstants.EMPTY_END_ROW, false, Durability.USE_DEFAULT, wal, family);<a name="line.1208"></a>
+<span class="sourceLineNo">1209</span>    int i = 0;<a name="line.1209"></a>
+<span class="sourceLineNo">1210</span>    Put put = new Put(Bytes.toBytes(i));<a name="line.1210"></a>
+<span class="sourceLineNo">1211</span>    put.setDurability(Durability.SKIP_WAL); // have to skip mocked wal<a name="line.1211"></a>
+<span class="sourceLineNo">1212</span>    put.addColumn(family, Bytes.toBytes(i), Bytes.toBytes(i));<a name="line.1212"></a>
+<span class="sourceLineNo">1213</span>    region.put(put);<a name="line.1213"></a>
+<span class="sourceLineNo">1214</span><a name="line.1214"></a>
+<span class="sourceLineNo">1215</span>    // 1. Test case where START_FLUSH throws exception<a name="line.1215"></a>
+<span class="sourceLineNo">1216</span>    wal.flushActions = new FlushAction [] {FlushAction.START_FLUSH};<a name="line.1216"></a>
+<span class="sourceLineNo">1217</span><a name="line.1217"></a>
+<span class="sourceLineNo">1218</span>    // start cache flush will throw exception<a name="line.1218"></a>
+<span class="sourceLineNo">1219</span>    try {<a name="line.1219"></a>
+<span class="sourceLineNo">1220</span>      region.flush(true);<a name="line.1220"></a>
+<span class="sourceLineNo">1221</span>      fail("This should have thrown exception");<a name="line.1221"></a>
+<span class="sourceLineNo">1222</span>    } catch (DroppedSnapshotException unexpected) {<a name="line.1222"></a>
+<span class="sourceLineNo">1223</span>      // this should not be a dropped snapshot exception. Meaning that RS will not abort<a name="line.1223"></a>
+<span class="sourceLineNo">1224</span>      throw unexpected;<a name="line.1224"></a>
+<span class="sourceLineNo">1225</span>    } catch (IOException expected) {<a name="line.1225"></a>
+<span class="sourceLineNo">1226</span>      // expected<a name="line.1226"></a>
+<span class="sourceLineNo">1227</span>    }<a name="line.1227"></a>
+<span class="sourceLineNo">1228</span>    // The WAL is hosed now. It has two edits appended. We cannot roll the log without it<a name="line.1228"></a>
+<span class="sourceLineNo">1229</span>    // throwing a DroppedSnapshotException to force an abort. Just clean up the mess.<a name="line.1229"></a>
+<span class="sourceLineNo">1230</span>    region.close(true);<a name="line.1230"></a>
+<span class="sourceLineNo">1231</span>    wal.close();<a name="line.1231"></a>
+<span class="sourceLineNo">1232</span><a name="line.1232"></a>
+<span class="sourceLineNo">1233</span>    // 2. Test case where START_FLUSH succeeds but COMMIT_FLUSH will throw exception<a name="line.1233"></a>
+<span class="sourceLineNo">1234</span>    wal.flushActions = new FlushAction [] {FlushAction.COMMIT_FLUSH};<a name="line.1234"></a>
+<span class="sourceLineNo">1235</span>    wal = new FailAppendFlushMarkerWAL(FileSystem.get(walConf), FSUtils.getRootDir(walConf),<a name="line.1235"></a>
+<span class="sourceLineNo">1236</span>          method, walConf);<a name="line.1236"></a>
+<span class="sourceLineNo">1237</span>    wal.init();<a name="line.1237"></a>
+<span class="sourceLineNo">1238</span>    this.region = initHRegion(tableName, HConstants.EMPTY_START_ROW,<a name="line.1238"></a>
+<span class="sourceLineNo">1239</span>      HConstants.EMPTY_END_ROW, false, Durability.USE_DEFAULT, wal, family);<a name="line.1239"></a>
+<span class="sourceLineNo">1240</span>    region.put(put);<a name="line.1240"></a>
+<span class="sourceLineNo">1241</span><a name="line.1241"></a>
+<span class="sourceLineNo">1242</span>    // 3. Test case where ABORT_FLUSH will throw exception.<a name="line.1242"></a>
+<span class="sourceLineNo">1243</span>    // Even if ABORT_FLUSH throws exception, we should not fail with IOE, but continue with<a name="line.1243"></a>
+<span class="sourceLineNo">1244</span>    // DroppedSnapshotException. Below COMMMIT_FLUSH will cause flush to abort<a name="line.1244"></a>
+<span class="sourceLineNo">1245</span>    wal.flushActions = new FlushAction [] {FlushAction.COMMIT_FLUSH, FlushAction.ABORT_FLUSH};<a name="line.1245"></a>
+<span class="sourceLineNo">1246</span><a name="line.1246"></a>
+<span class="sourceLineNo">1247</span>    try {<a name="line.1247"></a>
+<span class="sourceLineNo">1248</span>      region.flush(true);<a name="line.1248"></a>
+<span class="sourceLineNo">1249</span>      fail("This should have thrown exception");<a name="line.1249"></a>
+<span class="sourceLineNo">1250</span>    } catch (DroppedSnapshotException expected) {<a name="line.1250"></a>
+<span class="sourceLineNo">1251</span>      // we expect this exception, since we were able to write the snapshot, but failed to<a name="line.1251"></a>
+<span class="sourceLineNo">1252</span>      // write the flush marker to WAL<a name="line.1252"></a>
+<span class="sourceLineNo">1253</span>    } catch (IOException unexpected) {<a name="line.1253"></a>
+<span class="sourceLineNo">1254</span>      throw unexpected;<a name="line.1254"></a>
+<span class="sourceLineNo">1255</span>    }<a name="line.1255"></a>
+<span class="sourceLineNo">1256</span>  }<a name="line.1256"></a>
+<span class="sourceLineNo">1257</span><a name="line.1257"></a>
+<span class="sourceLineNo">1258</span>  @Test<a name="line.1258"></a>
+<span class="sourceLineNo">1259</span>  public void testGetWhileRegionClose() throws IOException {<a name="line.1259"></a>
+<span class="sourceLineNo">1260</span>    Configuration hc = initSplit();<a name="line.1260"></a>
+<span class="sourceLineNo">1261</span>    int numRows = 100;<a name="line.1261"></a>
+<span class="sourceLineNo">1262</span>    byte[][] families = { fam1, fam2, fam3 };<a name="line.1262"></a>
+<span class="sourceLineNo">1263</span><a name="line.1263"></a>
+<span class="sourceLineNo">1264</span>    // Setting up region<a name="line.1264"></a>
+<span class="sourceLineNo">1265</span>    this.region = initHRegion(tableName, method, hc, families);<a name="line.1265"></a>
+<span class="sourceLineNo">1266</span>    // Put data in region<a name="line.1266"></a>
+<span class="sourceLineNo">1267</span>    final int startRow = 100;<a name="line.1267"></a>
+<span class="sourceLineNo">1268</span>    putData(startRow, numRows, qual1, families);<a name="line.1268"></a>
+<span class="sourceLineNo">1269</span>    putData(startRow, numRows, qual2, families);<a name="line.1269"></a>
+<span class="sourceLineNo">1270</span>    putData(startRow, numRows, qual3, families);<a name="line.1270"></a>
+<span class="sourceLineNo">1271</span>    final AtomicBoolean done = new AtomicBoolean(false);<a name="line.1271"></a>
+<span class="sourceLineNo">1272</span>    final AtomicInteger gets = new AtomicInteger(0);<a name="line.1272"></a>
+<span class="sourceLineNo">1273</span>    GetTillDoneOrException[] threads = new GetTillDoneOrException[10];<a name="line.1273"></a>
+<span class="sourceLineNo">1274</span>    try {<a name="line.1274"></a>
+<span class="sourceLineNo">1275</span>      // Set ten threads running concurrently getting from the region.<a name="line.1275"></a>
+<span class="sourceLineNo">1276</span>      for (int i = 0; i &lt; threads.length / 2; i++) {<a name="line.1276"></a>
+<span class="sourceLineNo">1277</span>        threads[i] = new GetTillDoneOrException(i, Bytes.toBytes("" + startRow), done, gets);<a name="line.1277"></a>
+<span class="sourceLineNo">1278</span>        threads[i].setDaemon(true);<a name="line.1278"></a>
+<span class="sourceLineNo">1279</span>        threads[i].start();<a name="line.1279"></a>
+<span class="sourceLineNo">1280</span>      }<a name="line.1280"></a>
+<span class="sourceLineNo">1281</span>      // Artificially make the condition by setting closing flag explicitly.<a name="line.1281"></a>
+<span class="sourceLineNo">1282</span>      // I can't make the issue happen with a call to region.close().<a name="line.1282"></a>
+<span class="sourceLineNo">1283</span>      this.region.closing.set(true);<a name="line.1283"></a>
+<span class="sourceLineNo">1284</span>      for (int i = threads.length / 2; i &lt; threads.length; i++) {<a name="line.1284"></a>
+<span class="sourceLineNo">1285</span>        threads[i] = new GetTillDoneOrException(i, Bytes.toBytes("" + startRow), done, gets);<a name="line.1285"></a>
+<span class="sourceLineNo">1286</span>        threads[i].setDaemon(true);<a name="line.1286"></a>
+<span class="sourceLineNo">1287</span>        threads[i].start();<a name="line.1287"></a>
+<span class="sourceLineNo">1288</span>      }<a name="line.1288"></a>
+<span class="sourceLineNo">1289</span>    } finally {<a name="line.1289"></a>
+<span class="sourceLineNo">1290</span>      if (this.region != null) {<a name="line.1290"></a>
+<span class="sourceLineNo">1291</span>        HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.1291"></a>
+<span class="sourceLineNo">1292</span>        this.region = null;<a name="line.1292"></a>
+<span class="sourceLineNo">1293</span>      }<a name="line.1293"></a>
+<span class="sourceLineNo">1294</span>    }<a name="line.1294"></a>
+<span class="sourceLineNo">1295</span>    done.set(true);<a name="line.1295"></a>
+<span class="sourceLineNo">1296</span>    for (GetTillDoneOrException t : threads) {<a name="line.1296"></a>
+<span class="sourceLineNo">1297</span>      try {<a name="line.1297"></a>
+<span class="sourceLineNo">1298</span>        t.join();<a name="line.1298"></a>
+<span class="sourceLineNo">1299</span>      } catch (InterruptedException e) {<a name="line.1299"></a>
+<span class="sourceLineNo">1300</span>        e.printStackTrace();<a name="line.1300"></a>
+<span class="sourceLineNo">1301</span>      }<a name="line.1301"></a>
+<span class="sourceLineNo">1302</span>      if (t.e != null) {<a name="line.1302"></a>
+<span class="sourceLineNo">1303</span>        LOG.info("Exception=" + t.e);<a name="line.1303"></a>
+<span class="sourceLineNo">1304</span>        assertFalse("Found a NPE in " + t.getName(), t.e instanceof NullPointerException);<a name="line.1304"></a>
+<span class="sourceLineNo">1305</span>      }<a name="line.1305"></a>
+<span class="sourceLineNo">1306</span>    }<a name="line.1306"></a>
+<span class="sourceLineNo">1307</span>  }<a name="line.1307"></a>
+<span class="sourceLineNo">1308</span><a name="line.1308"></a>
+<span class="sourceLineNo">1309</span>  /*<a name="line.1309"></a>
+<span class="sourceLineNo">1310</span>   * Thread that does get on single row until 'done' flag is flipped. If an<a name="line.1310"></a>
+<span class="sourceLineNo">1311</span>   * exception causes us to fail, it records it.<a name="line.1311"></a>
+<span class="sourceLineNo">1312</span>   */<a name="line.1312"></a>
+<span class="sourceLineNo">1313</span>  class GetTillDoneOrException extends Thread {<a name="line.1313"></a>
+<span class="sourceLineNo">1314</span>    private final Get g;<a name="line.1314"></a>
+<span class="sourceLineNo">1315</span>    private final AtomicBoolean done;<a name="line.1315"></a>
+<span class="sourceLineNo">1316</span>    private final AtomicInteger count;<a name="line.1316"></a>
+<span class="sourceLineNo">1317</span>    private Exception e;<a name="line.1317"></a>
+<span class="sourceLineNo">1318</span><a name="line.1318"></a>
+<span class="sourceLineNo">1319</span>    GetTillDoneOrException(final int i, final byte[] r, final AtomicBoolean d,<a name="line.1319"></a>
+<span class="sourceLineNo">1320</span>        final AtomicInteger c) {<a name="line.1320"></a>
+<span class="sourceLineNo">1321</span>      super("getter." + i);<a name="line.1321"></a>
+<span class="sourceLineNo">1322</span>      this.g = new Get(r);<a name="line.1322"></a>
+<span class="sourceLineNo">1323</span>      this.done = d;<a name="line.1323"></a>
+<span class="sourceLineNo">1324</span>      this.count = c;<a name="line.1324"></a>
+<span class="sourceLineNo">1325</span>    }<a name="line.1325"></a>
+<span class="sourceLineNo">1326</span><a name="line.1326"></a>
+<span class="sourceLineNo">1327</span>    @Override<a name="line.1327"></a>
+<span class="sourceLineNo">1328</span>    public void run() {<a name="line.1328"></a>
+<span class="sourceLineNo">1329</span>      while (!this.done.get()) {<a name="line.1329"></a>
+<span class="sourceLineNo">1330</span>        try {<a name="line.1330"></a>
+<span class="sourceLineNo">1331</span>          assertTrue(region.get(g).size() &gt; 0);<a name="line.1331"></a>
+<span class="sourceLineNo">1332</span>          this.count.incrementAndGet();<a name="line.1332"></a>
+<span class="sourceLineNo">1333</span>        } catch (Exception e) {<a name="line.1333"></a>
+<span class="sourceLineNo">1334</span>          this.e = e;<a name="line.1334"></a>
+<span class="sourceLineNo">1335</span>          break;<a name="line.1335"></a>
+<span class="sourceLineNo">1336</span>        }<a name="line.1336"></a>
+<span class="sourceLineNo">1337</span>      }<a name="line.1337"></a>
+<span class="sourceLineNo">1338</span>    }<a name="line.1338"></a>
+<span class="sourceLineNo">1339</span>  }<a name="line.1339"></a>
+<span class="sourceLineNo">1340</span><a name="line.1340"></a>
+<span class="sourceLineNo">1341</span>  /*<a name="line.1341"></a>
+<span class="sourceLineNo">1342</span>   * An involved filter test. Has multiple column families and deletes in mix.<a name="line.1342"></a>
+<span class="sourceLineNo">1343</span>   */<a name="line.1343"></a>
+<span class="sourceLineNo">1344</span>  @Test<a name="line.1344"></a>
+<span class="sourceLineNo">1345</span>  public void testWeirdCacheBehaviour() throws Exception {<a name="line.1345"></a>
+<span class="sourceLineNo">1346</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.1346"></a>
+<span class="sourceLineNo">1347</span>    byte[][] FAMILIES = new byte[][] { Bytes.toBytes("trans-blob"), Bytes.toBytes("trans-type"),<a name="line.1347"></a>
+<span class="sourceLineNo">1348</span>        Bytes.toBytes("trans-date"), Bytes.toBytes("trans-tags"), Bytes.toBytes("trans-group") };<a name="line.1348"></a>
+<span class="sourceLineNo">1349</span>    this.region = initHRegion(tableName, method, CONF, FAMILIES);<a name="line.1349"></a>
+<span class="sourceLineNo">1350</span>    String value = "this is the value";<a name="line.1350"></a>
+<span class="sourceLineNo">1351</span>    String value2 = "this is some other value";<a name="line.1351"></a>
+<span class="sourceLineNo">1352</span>    String keyPrefix1 = "prefix1";<a name="line.1352"></a>
+<span class="sourceLineNo">1353</span>    String keyPrefix2 = "prefix2";<a name="line.1353"></a>
+<span class="sourceLineNo">1354</span>    String keyPrefix3 = "prefix3";<a name="line.1354"></a>
+<span class="sourceLineNo">1355</span>    putRows(this.region, 3, value, keyPrefix1);<a name="line.1355"></a>
+<span class="sourceLineNo">1356</span>    putRows(this.region, 3, value, keyPrefix2);<a name="line.1356"></a>
+<span class="sourceLineNo">1357</span>    putRows(this.region, 3, value, keyPrefix3);<a name="line.1357"></a>
+<span class="sourceLineNo">1358</span>    putRows(this.region, 3, value2, keyPrefix1);<a name="line.1358"></a>
+<span class="sourceLineNo">1359</span>    putRows(this.region, 3, value2, keyPrefix2);<a name="line.1359"></a>
+<span class="sourceLineNo">1360</span>    putRows(this.region, 3, value2, keyPrefix3);<a name="line.1360"></a>
+<span class="sourceLineNo">1361</span>    System.out.println("Checking values for key: " + keyPrefix1);<a name="line.1361"></a>
+<span class="sourceLineNo">1362</span>    assertEquals("Got back incorrect number of rows from scan", 3,<a name="line.1362"></a>
+<span class="sourceLineNo">1363</span>        getNumberOfRows(keyPrefix1, value2, this.region));<a name="line.1363"></a>
+<span class="sourceLineNo">1364</span>    System.out.println("Checking values for key: " + keyPrefix2);<a name="line.1364"></a>
+<span class="sourceLineNo">1365</span>    assertEquals("Got back incorrect number of rows from scan", 3,<a name="line.1365"></a>
+<span class="sourceLineNo">1366</span>        getNumberOfRows(keyPrefix2, value2, this.region));<a name="line.1366"></a>
+<span class="sourceLineNo">1367</span>    System.out.println("Checking values for key: " + keyPrefix3);<a name="line.1367"></a>
+<span class="sourceLineNo">1368</span>    assertEquals("Got back incorrect number of rows from scan", 3,<a name="line.1368"></a>
+<span class="sourceLineNo">1369</span>        getNumberOfRows(keyPrefix3, value2, this.region));<a name="line.1369"></a>
+<span class="sourceLineNo">1370</span>    deleteColumns(this.region, value2, keyPrefix1);<a name="line.1370"></a>
+<span class="sourceLineNo">1371</span>    deleteColumns(this.region, value2, keyPrefix2);<a name="line.1371"></a>
+<span class="sourceLineNo">1372</span>    deleteColumns(this.region, value2, keyPrefix3);<a name="line.1372"></a>
+<span class="sourceLineNo">1373</span>    System.out.println("Starting important checks.....");<a name="line.1373"></a>
+<span class="sourceLineNo">1374</span>    assertEquals("Got back incorrect number of rows from scan: " + keyPrefix1, 0,<a name="line.1374"></a>
+<span class="sourceLineNo">1375</span>        getNumberOfRows(keyPrefix1, value2, this.region));<a name="line.1375"></a>
+<span class="sourceLineNo">1376</span>    assertEquals("Got back incorrect number of rows from scan: " + keyPrefix2, 0,<a name="line.1376"></a>
+<span class="sourceLineNo">1377</span>        getNumberOfRows(keyPrefix2, value2, this.region));<a name="line.1377"></a>
+<span class="sourceLineNo">1378</span>    assertEquals("Got back incorrect number of rows from scan: " + keyPrefix3, 0,<a name="line.1378"></a>
+<span class="sourceLineNo">1379</span>        getNumberOfRows(keyPrefix3, value2, this.region));<a name="line.1379"></a>
+<span class="sourceLineNo">1380</span>  }<a name="line.1380"></a>
+<span class="sourceLineNo">1381</span><a name="line.1381"></a>
+<span class="sourceLineNo">1382</span>  @Test<a name="line.1382"></a>
+<span class="sourceLineNo">1383</span>  public void testAppendWithReadOnlyTable() throws Exception {<a name="line.1383"></a>
+<span class="sourceLineNo">1384</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.1384"></a>
+<span class="sourceLineNo">1385</span>    this.region = initHRegion(tableName, method, CONF, true, Bytes.toBytes("somefamily"));<a name="line.1385"></a>
+<span class="sourceLineNo">1386</span>    boolean exceptionCaught = false;<a name="line.1386"></a>
+<span class="sourceLineNo">1387</span>    Append append = new Append(Bytes.toBytes("somerow"));<a name="line.1387"></a>
+<span class="sourceLineNo">1388</span>    append.setDurability(Durability.SKIP_WAL);<a name="line.1388"></a>
+<span class="sourceLineNo">1389</span>    append.addColumn(Bytes.toBytes("somefamily"), Bytes.toBytes("somequalifier"),<a name="line.1389"></a>
+<span class="sourceLineNo">1390</span>        Bytes.toBytes("somevalue"));<a name="line.1390"></a>
+<span class="sourceLineNo">1391</span>    try {<a name="line.1391"></a>
+<span class="sourceLineNo">1392</span>      region.append(append);<a name="line.1392"></a>
+<span class="sourceLineNo">1393</span>    } catch (IOException e) {<a name="line.1393"></a>
+<span class="sourceLineNo">1394</span>      exceptionCaught = true;<a name="line.1394"></a>
+<span class="sourceLineNo">1395</span>    }<a name="line.1395"></a>
+<span class="sourceLineNo">1396</span>    assertTrue(exceptionCaught == true);<a name="line.1396"></a>
+<span class="sourceLineNo">1397</span>  }<a name="line.1397"></a>
+<span class="sourceLineNo">1398</span><a name="line.1398"></a>
+<span class="sourceLineNo">1399</span>  @Test<a name="line.1399"></a>
+<span class="sourceLineNo">1400</span>  public void testIncrWithReadOnlyTable() throws Exception {<a name="line.1400"></a>
+<span class="sourceLineNo">1401</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.1401"></a>
+<span class="sourceLineNo">1402</span>    this.region = initHRegion(tableName, method, CONF, true, Bytes.toBytes("somefamily"));<a name="line.1402"></a>
+<span class="sourceLineNo">1403</span>    boolean exceptionCaught = false;<a name="line.1403"></a>
+<span class="sourceLineNo">1404</span>    Increment inc = new Increment(Bytes.toBytes("somerow"));<a name="line.1404"></a>
+<span class="sourceLineNo">1405</span>    inc.setDurability(Durability.SKIP_WAL);<a name="line.1405"></a>
+<span class="sourceLineNo">1406</span>    inc.addColumn(Bytes.toBytes("somefamily"), Bytes.toBytes("somequalifier"), 1L);<a name="line.1406"></a>
+<span class="sourceLineNo">1407</span>    try {<a name="line.1407"></a>
+<span class="sourceLineNo">1408</span>      region.increment(inc);<a name="line.1408"></a>
+<span class="sourceLineNo">1409</span>    } catch (IOException e) {<a name="line.1409"></a>
+<span class="sourceLineNo">1410</span>      exceptionCaught = true;<a name="line.1410"></a>
+<span class="sourceLineNo">1411</span>    }<a name="line.1411"></a>
+<span class="sourceLineNo">1412</span>    assertTrue(exceptionCaught == true);<a name="line.1412"></a>
+<span class="sourceLineNo">1413</span>  }<a name="line.1413"></a>
+<span class="sourceLineNo">1414</span><a name="line.1414"></a>
+<span class="sourceLineNo">1415</span>  private void deleteColumns(HRegion r, String value, String keyPrefix) throws IOException {<a name="line.1415"></a>
+<span class="sourceLineNo">1416</span>    InternalScanner scanner = buildScanner(keyPrefix, value, r);<a name="line.1416"></a>
+<span class="sourceLineNo">1417</span>    int count = 0;<a name="line.1417"></a>
+<span class="sourceLineNo">1418</span>    boolean more = false;<a name="line.1418"></a>
+<span class="sourceLineNo">1419</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.1419"></a>
+<span class="sourceLineNo">1420</span>    do {<a name="line.1420"></a>
+<span class="sourceLineNo">1421</span>      more = scanner.next(results);<a name="line.1421"></a>
+<span class="sourceLineNo">1422</span>      if (results != null &amp;&amp; !results.isEmpty())<a name="line.1422"></a>
+<span class="sourceLineNo">1423</span>        count++;<a name="line.1423"></a>
+<span class="sourceLineNo">1424</span>      else<a name="line.1424"></a>
+<span class="sourceLineNo">1425</span>        break;<a name="line.1425"></a>
+<span class="sourceLineNo">1426</span>      Delete delete = new Delete(CellUtil.cloneRow(results.get(0)));<a name="line.1426"></a>
+<span class="sourceLineNo">1427</span>      delete.addColumn(Bytes.toBytes("trans-tags"), Bytes.toBytes("qual2"));<a name="line.1427"></a>
+<span class="sourceLineNo">1428</span>      r.delete(delete);<a name="line.1428"></a>
+<span class="sourceLineNo">1429</span>      results.clear();<a name="line.1429"></a>
+<span class="sourceLineNo">1430</span>    } while (more);<a name="line.1430"></a>
+<span class="sourceLineNo">1431</span>    assertEquals("Did not perform correct number of deletes", 3, count);<a name="line.1431"></a>
+<span class="sourceLineNo">1432</span>  }<a name="line.1432"></a>
+<span class="sourceLineNo">1433</span><a name="line.1433"></a>
+<span class="sourceLineNo">1434</span>  private int getNumberOfRows(String keyPrefix, String value, HRegion r) throws Exception {<a name="line.1434"></a>
+<span class="sourceLineNo">1435</span>    InternalScanner resultScanner = buildScanner(keyPrefix, value, r);<a name="line.1435"></a>
+<span class="sourceLineNo">1436</span>    int numberOfResults = 0;<a name="line.1436"></a>
+<span class="sourceLineNo">1437</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.1437"></a>
+<span class="sourceLineNo">1438</span>    boolean more = false;<a name="line.1438"></a>
+<span class="sourceLineNo">1439</span>    do {<a name="line.1439"></a>
+<span class="sourceLineNo">1440</span>      more = resultScanner.next(results);<a name="line.1440"></a>
+<span class="sourceLineNo">1441</span>      if (results != null &amp;&amp; !results.isEmpty())<a name="line.1441"></a>
+<span class="sourceLineNo">1442</span>        numberOfResults++;<a name="line.1442"></a>
+<span class="sourceLineNo">1443</span>      else<a name="line.1443"></a>
+<span class="sourceLineNo">1444</span>        break;<a name="line.1444"></a>
+<span class="sourceLineNo">1445</span>      for (Cell kv : results) {<a name="line.1445"></a>
+<span class="sourceLineNo">1446</span>        System.out.println("kv=" + kv.toString() + ", " + Bytes.toString(CellUtil.cloneValue(kv)));<a name="line.1446"></a>
+<span class="sourceLineNo">1447</span>      }<a name="line.1447"></a>
+<span class="sourceLineNo">1448</span>      results.clear();<a name="line.1448"></a>
+<span class="sourceLineNo">1449</span>    } while (more);<a name="line.1449"></a>
+<span class="sourceLineNo">1450</span>    return numberOfResults;<a name="line.1450"></a>
+<span class="sourceLineNo">1451</span>  }<a name="line.1451"></a>
+<span class="sourceLineNo">1452</span><a name="line.1452"></a>
+<span class="sourceLineNo">1453</span>  private InternalScanner buildScanner(String keyPrefix, String value, HRegion r)<a name="line.1453"></a>
+<span class="sourceLineNo">1454</span>      throws IOException {<a name="line.1454"></a>
+<span class="sourceLineNo">1455</span>    // Defaults FilterList.Operator.MUST_PASS_ALL.<a name="line.1455"></a>
+<span class="sourceLineNo">1456</span>    FilterList allFilters = new FilterList();<a name="line.1456"></a>
+<span class="sourceLineNo">1457</span>    allFilters.addFilter(new PrefixFilter(Bytes.toBytes(keyPrefix)));<a name="line.1457"></a>
+<span class="sourceLineNo">1458</span>    // Only return rows where this column value exists in the row.<a name="line.1458"></a>
+<span class="sourceLineNo">1459</span>    SingleColumnValueFilter filter = new SingleColumnValueFilter(Bytes.toBytes("trans-tags"),<a name="line.1459"></a>
+<span class="sourceLineNo">1460</span>        Bytes.toBytes("qual2"), CompareOperator.EQUAL, Bytes.toBytes(value));<a name="line.1460"></a>
+<span class="sourceLineNo">1461</span>    filter.setFilterIfMissing(true);<a name="line.1461"></a>
+<span class="sourceLineNo">1462</span>    allFilters.addFilter(filter);<a name="line.1462"></a>
+<span class="sourceLineNo">1463</span>    Scan scan = new Scan();<a name="line.1463"></a>
+<span class="sourceLineNo">1464</span>    scan.addFamily(Bytes.toBytes("trans-blob"));<a name="line.1464"></a>
+<span class="sourceLineNo">1465</span>    scan.addFamily(Bytes.toBytes("trans-type"));<a name="line.1465"></a>
+<span class="sourceLineNo">1466</span>    scan.addFamily(Bytes.toBytes("trans-date"));<a name="line.1466"></a>
+<span class="sourceLineNo">1467</span>    scan.addFamily(Bytes.toBytes("trans-tags"));<a name="line.1467"></a>
+<span class="sourceLineNo">1468</span>    scan.addFamily(Bytes.toBytes("trans-group"));<a name="line.1468"></a>
+<span class="sourceLineNo">1469</span>    scan.setFilter(allFilters);<a name="line.1469"></a>
+<span class="sourceLineNo">1470</span>    return r.getScanner(scan);<a name="line.1470"></a>
+<span class="sourceLineNo">1471</span>  }<a name="line.1471"></a>
+<span class="sourceLineNo">1472</span><a name="line.1472"></a>
+<span class="sourceLineNo">1473</span>  private void putRows(HRegion r, int numRows, String value, String key) throws IOException {<a name="line.1473"></a>
+<span class="sourceLineNo">1474</span>    for (int i = 0; i &lt; numRows; i++) {<a name="line.1474"></a>
+<span class="sourceLineNo">1475</span>      String row = key + "_" + i/* UUID.randomUUID().toString() */;<a name="line.1475"></a>
+<span class="sourceLineNo">1476</span>      System.out.println(String.format("Saving row: %s, with value %s", row, value));<a name="line.1476"></a>
+<span class="sourceLineNo">1477</span>      Put put = new Put(Bytes.toBytes(row));<a name="line.1477"></a>
+<span class="sourceLineNo">1478</span>      put.setDurability(Durability.SKIP_WAL);<a name="line.1478"></a>
+<span class="sourceLineNo">1479</span>      put.addColumn(Bytes.toBytes("trans-blob"), null, Bytes.toBytes("value for blob"));<a name="line.1479"></a>
+<span class="sourceLineNo">1480</span>      put.addColumn(Bytes.toBytes("trans-type"), null, Bytes.toBytes("statement"));<a name="line.1480"></a>
+<span class="sourceLineNo">1481</span>      put.addColumn(Bytes.toBytes("trans-date"), null, Bytes.toBytes("20090921010101999"));<a name="line.1481"></a>
+<span class="sourceLineNo">1482</span>      put.addColumn(Bytes.toBytes("trans-tags"), Bytes.toBytes("qual2"), Bytes.toBytes(value));<a name="line.1482"></a>
+<span class="sourceLineNo">1483</span>      put.addColumn(Bytes.toBytes("trans-group"), null, Bytes.toBytes("adhocTransactionGroupId"));<a name="line.1483"></a>
+<span class="sourceLineNo">1484</span>      r.put(put);<a name="line.1484"></a>
+<span class="sourceLineNo">1485</span>    }<a name="line.1485"></a>
+<span class="sourceLineNo">1486</span>  }<a name="line.1486"></a>
+<span class="sourceLineNo">1487</span><a name="line.1487"></a>
+<span class="sourceLineNo">1488</span>  @Test<a name="line.1488"></a>
+<span class="sourceLineNo">1489</span>  public void testFamilyWithAndWithoutColon() throws Exception {<a name="line.1489"></a>
+<span class="sourceLineNo">1490</span>    byte[] cf = Bytes.toBytes(COLUMN_FAMILY);<a name="line.1490"></a>
+<span class="sourceLineNo">1491</span>    this.region = initHRegion(tableName, method, CONF, cf);<a name="line.1491"></a>
+<span class="sourceLineNo">1492</span>    Put p = new Put(tableName.toBytes());<a name="line.1492"></a>
+<span class="sourceLineNo">1493</span>    byte[] cfwithcolon = Bytes.toBytes(COLUMN_FAMILY + ":");<a name="line.1493"></a>
+<span class="sourceLineNo">1494</span>    p.addColumn(cfwithcolon, cfwithcolon, cfwithcolon);<a name="line.1494"></a>
+<span class="sourceLineNo">1495</span>    boolean exception = false;<a name="line.1495"></a>
+<span class="sourceLineNo">1496</span>    try {<a name="line.1496"></a>
+<span class="sourceLineNo">1497</span>      this.region.put(p);<a name="line.1497"></a>
+<span class="sourceLineNo">1498</span>    } catch (NoSuchColumnFamilyException e) {<a name="line.1498"></a>
+<span class="sourceLineNo">1499</span>      exception = true;<a name="line.1499"></a>
+<span class="sourceLineNo">1500</span>    }<a name="line.1500"></a>
+<span class="sourceLineNo">1501</span>    assertTrue(exception);<a name="line.1501"></a>
+<span class="sourceLineNo">1502</span>  }<a name="line.1502"></a>
+<span class="sourceLineNo">1503</span><a name="line.1503"></a>
+<span class="sourceLineNo">1504</span>  @Test<a name="line.1504"></a>
+<span class="sourceLineNo">1505</span>  public void testBatchPut_whileNoRowLocksHeld() throws IOException {<a name="line.1505"></a>
+<span class="sourceLineNo">1506</span>    final Put[] puts = new Put[10];<a name="line.1506"></a>
+<span class="sourceLineNo">1507</span>    MetricsWALSource source = CompatibilitySingletonFactory.getInstance(MetricsWALSource.class);<a name="line.1507"></a>
+<span class="sourceLineNo">1508</span>    long syncs = prepareRegionForBachPut(puts, source, false);<a name="line.1508"></a>
+<span class="sourceLineNo">1509</span><a name="line.1509"></a>
+<span class="sourceLineNo">1510</span>    OperationStatus[] codes = this.region.batchMutate(puts);<a name="line.1510"></a>
+<span class="sourceLineNo">1511</span>    assertEquals(10, codes.length);<a name="line.1511"></a>
+<span class="sourceLineNo">1512</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.1512"></a>
+<span class="sourceLineNo">1513</span>      assertEquals(OperationStatusCode.SUCCESS, codes[i].getOperationStatusCode());<a name="line.1513"></a>
+<span class="sourceLineNo">1514</span>    }<a name="line.1514"></a>
+<span class="sourceLineNo">1515</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs + 1, source);<a name="line.1515"></a>
+<span class="sourceLineNo">1516</span><a name="line.1516"></a>
+<span class="sourceLineNo">1517</span>    LOG.info("Next a batch put with one invalid family");<a name="line.1517"></a>
+<span class="sourceLineNo">1518</span>    puts[5].addColumn(Bytes.toBytes("BAD_CF"), qual, value);<a name="line.1518"></a>
+<span class="sourceLineNo">1519</span>    codes = this.region.batchMutate(puts);<a name="line.1519"></a>
+<span class="sourceLineNo">1520</span>    assertEquals(10, codes.length);<a name="line.1520"></a>
+<span class="sourceLineNo">1521</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.1521"></a>
+<span class="sourceLineNo">1522</span>      assertEquals((i == 5) ? OperationStatusCode.BAD_FAMILY : OperationStatusCode.SUCCESS,<a name="line.1522"></a>
+<span class="sourceLineNo">1523</span>          codes[i].getOperationStatusCode());<a name="line.1523"></a>
+<span class="sourceLineNo">1524</span>    }<a name="line.1524"></a>
+<span class="sourceLineNo">1525</span><a name="line.1525"></a>
+<span class="sourceLineNo">1526</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs + 2, source);<a name="line.1526"></a>
+<span class="sourceLineNo">1527</span>  }<a name="line.1527"></a>
+<span class="sourceLineNo">1528</span><a name="line.1528"></a>
+<span class="sourceLineNo">1529</span>  @Test<a name="line.1529"></a>
+<span class="sourceLineNo">1530</span>  public void testBatchPut_whileMultipleRowLocksHeld() throws Exception {<a name="line.1530"></a>
+<span class="sourceLineNo">1531</span>    final Put[] puts = new Put[10];<a name="line.1531"></a>
+<span class="sourceLineNo">1532</span>    MetricsWALSource source = CompatibilitySingletonFactory.getInstance(MetricsWALSource.class);<a name="line.1532"></a>
+<span class="sourceLineNo">1533</span>    long syncs = prepareRegionForBachPut(puts, source, false);<a name="line.1533"></a>
+<span class="sourceLineNo">1534</span><a name="line.1534"></a>
+<span class="sourceLineNo">1535</span>    puts[5].addColumn(Bytes.toBytes("BAD_CF"), qual, value);<a name="line.1535"></a>
+<span class="sourceLineNo">1536</span><a name="line.1536"></a>
+<span class="sourceLineNo">1537</span>    LOG.info("batchPut will have to break into four batches to avoid row locks");<a name="line.1537"></a>
+<span class="sourceLineNo">1538</span>    RowLock rowLock1 = region.getRowLock(Bytes.toBytes("row_2"));<a name="line.1538"></a>
+<span class="sourceLineNo">1539</span>    RowLock rowLock2 = region.getRowLock(Bytes.toBytes("row_1"));<a name="line.1539"></a>
+<span class="sourceLineNo">1540</span>    RowLock rowLock3 = region.getRowLock(Bytes.toBytes("row_3"));<a name="line.1540"></a>
+<span class="sourceLineNo">1541</span>    RowLock rowLock4 = region.getRowLock(Bytes.toBytes("row_3"), true);<a name="line.1541"></a>
+<span class="sourceLineNo">1542</span><a name="line.1542"></a>
+<span class="sourceLineNo">1543</span>    MultithreadedTestUtil.TestContext ctx = new MultithreadedTestUtil.TestContext(CONF);<a name="line.1543"></a>
+<span class="sourceLineNo">1544</span>    final AtomicReference&lt;OperationStatus[]&gt; retFromThread = new AtomicReference&lt;&gt;();<a name="line.1544"></a>
+<span class="sourceLineNo">1545</span>    final CountDownLatch startingPuts = new CountDownLatch(1);<a name="line.1545"></a>
+<span class="sourceLineNo">1546</span>    final CountDownLatch startingClose = new CountDownLatch(1);<a name="line.1546"></a>
+<span class="sourceLineNo">1547</span>    TestThread putter = new TestThread(ctx) {<a name="line.1547"></a>
+<span class="sourceLineNo">1548</span>      @Override<a name="line.1548"></a>
+<span class="sourceLineNo">1549</span>      public void doWork() throws IOException {<a name="line.1549"></a>
+<span class="sourceLineNo">1550</span>        startingPuts.countDown();<a name="line.1550"></a>
+<span class="sourceLineNo">1551</span>        retFromThread.set(region.batchMutate(puts));<a name="line.1551"></a>
+<span class="sourceLineNo">1552</span>      }<a name="line.1552"></a>
+<span class="sourceLineNo">1553</span>    };<a name="line.1553"></a>
+<span class="sourceLineNo">1554</span>    LOG.info("...starting put thread while holding locks");<a name="line.1554"></a>
+<span class="sourceLineNo">1555</span>    ctx.addThread(putter);<a name="line.1555"></a>
+<span class="sourceLineNo">1556</span>    ctx.startThreads();<a name="line.1556"></a>
+<span class="sourceLineNo">1557</span><a name="line.1557"></a>
+<span class="sourceLineNo">1558</span>    // Now attempt to close the region from another thread.  Prior to HBASE-12565<a name="line.1558"></a>
+<span class="sourceLineNo">1559</span>    // this would cause the in-progress batchMutate operation to to fail with<a name="line.1559"></a>
+<span class="sourceLineNo">1560</span>    // exception because it use to release and re-acquire the close-guard lock<a name="line.1560"></a>
+<span class="sourceLineNo">1561</span>    // between batches.  Caller then didn't get status indicating which writes succeeded.<a name="line.1561"></a>
+<span class="sourceLineNo">1562</span>    // We now expect this thread to block until the batchMutate call finishes.<a name="line.1562"></a>
+<span class="sourceLineNo">1563</span>    Thread regionCloseThread = new TestThread(ctx) {<a name="line.1563"></a>
+<span class="sourceLineNo">1564</span>      @Override<a name="line.1564"></a>
+<span class="sourceLineNo">1565</span>      public void doWork() {<a name="line.1565"></a>
+<span class="sourceLineNo">1566</span>        try {<a name="line.1566"></a>
+<span class="sourceLineNo">1567</span>          startingPuts.await();<a name="line.1567"></a>
+<span class="sourceLineNo">1568</span>          // Give some time for the batch mutate to get in.<a name="line.1568"></a>
+<span class="sourceLineNo">1569</span>          // We don't want to race with the mutate<a name="line.1569"></a>
+<span class="sourceLineNo">1570</span>          Thread.sleep(10);<a name="line.1570"></a>
+<span class="sourceLineNo">1571</span>          startingClose.countDown();<a name="line.1571"></a>
+<span class="sourceLineNo">1572</span>          HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.1572"></a>
+<span class="sourceLineNo">1573</span>          region = null;<a name="line.1573"></a>
+<span class="sourceLineNo">1574</span>        } catch (IOException e) {<a name="line.1574"></a>
+<span class="sourceLineNo">1575</span>          throw new RuntimeException(e);<a name="line.1575"></a>
+<span class="sourceLineNo">1576</span>        } catch (InterruptedException e) {<a name="line.1576"></a>
+<span class="sourceLineNo">1577</span>          throw new RuntimeException(e);<a name="line.1577"></a>
+<span class="sourceLineNo">1578</span>        }<a name="line.1578"></a>
+<span class="sourceLineNo">1579</span>      }<a name="line.1579"></a>
+<span class="sourceLineNo">1580</span>    };<a name="line.1580"></a>
+<span class="sourceLineNo">1581</span>    regionCloseThread.start();<a name="line.1581"></a>
+<span class="sourceLineNo">1582</span><a name="line.1582"></a>
+<span class="sourceLineNo">1583</span>    startingClose.await();<a name="line.1583"></a>
+<span class="sourceLineNo">1584</span>    startingPuts.await();<a name="line.1584"></a>
+<span class="sourceLineNo">1585</span>    Thread.sleep(100);<a name="line.1585"></a>
+<span class="sourceLineNo">1586</span>    LOG.info("...releasing row lock 1, which should let put thread continue");<a name="line.1586"></a>
+<span class="sourceLineNo">1587</span>    rowLock1.release();<a name="line.1587"></a>
+<span class="sourceLineNo">1588</span>    rowLock2.release();<a name="line.1588"></a>
+<span class="sourceLineNo">1589</span>    rowLock3.release();<a name="line.1589"></a>
+<span class="sourceLineNo">1590</span>    waitForCounter(source, "syncTimeNumOps", syncs + 1);<a name="line.1590"></a>
+<span class="sourceLineNo">1591</span><a name="line.1591"></a>
+<span class="sourceLineNo">1592</span>    LOG.info("...joining on put thread");<a name="line.1592"></a>
+<span class="sourceLineNo">1593</span>    ctx.stop();<a name="line.1593"></a>
+<span class="sourceLineNo">1594</span>    regionCloseThread.join();<a name="line.1594"></a>
+<span class="sourceLineNo">1595</span><a name="line.1595"></a>
+<span class="sourceLineNo">1596</span>    OperationStatus[] codes = retFromThread.get();<a name="line.1596"></a>
+<span class="sourceLineNo">1597</span>    for (int i = 0; i &lt; codes.length; i++) {<a name="line.1597"></a>
+<span class="sourceLineNo">1598</span>      assertEquals((i == 5) ? OperationStatusCode.BAD_FAMILY : OperationStatusCode.SUCCESS,<a name="line.1598"></a>
+<span class="sourceLineNo">1599</span>          codes[i].getOperationStatusCode());<a name="line.1599"></a>
+<span class="sourceLineNo">1600</span>    }<a name="line.1600"></a>
+<span class="sourceLineNo">1601</span>    rowLock4.release();<a name="line.1601"></a>
+<span class="sourceLineNo">1602</span>  }<a name="line.1602"></a>
+<span class="sourceLineNo">1603</span><a name="line.1603"></a>
+<span class="sourceLineNo">1604</span>  private void waitForCounter(MetricsWALSource source, String metricName, long expectedCount)<a name="line.1604"></a>
+<span class="sourceLineNo">1605</span>      throws InterruptedException {<a name="line.1605"></a>
+<span class="sourceLineNo">1606</span>    long startWait = System.currentTimeMillis();<a name="line.1606"></a>
+<span class="sourceLineNo">1607</span>    long currentCount;<a name="line.1607"></a>
+<span class="sourceLineNo">1608</span>    while ((currentCount = metricsAssertHelper.getCounter(metricName, source)) &lt; expectedCount) {<a name="line.1608"></a>
+<span class="sourceLineNo">1609</span>      Thread.sleep(100);<a name="line.1609"></a>
+<span class="sourceLineNo">1610</span>      if (System.currentTimeMillis() - startWait &gt; 10000) {<a name="line.1610"></a>
+<span class="sourceLineNo">1611</span>        fail(String.format("Timed out waiting for '%s' &gt;= '%s', currentCount=%s", metricName,<a name="line.1611"></a>
+<span class="sourceLineNo">1612</span>            expectedCount, currentCount));<a name="line.1612"></a>
+<span class="sourceLineNo">1613</span>      }<a name="line.1613"></a>
+<span class="sourceLineNo">1614</span>    }<a name="line.1614"></a>
+<span class="sourceLineNo">1615</span>  }<a name="line.1615"></a>
+<span class="sourceLineNo">1616</span><a name="line.1616"></a>
+<span class="sourceLineNo">1617</span>  @Test<a name="line.1617"></a>
+<span class="sourceLineNo">1618</span>  public void testAtomicBatchPut() throws IOException {<a name="line.1618"></a>
+<span class="sourceLineNo">1619</span>    final Put[] puts = new Put[10];<a name="line.1619"></a>
+<span class="sourceLineNo">1620</span>    MetricsWALSource source = CompatibilitySingletonFactory.getInstance(MetricsWALSource.class);<a name="line.1620"></a>
+<span class="sourceLineNo">1621</span>    long syncs = prepareRegionForBachPut(puts, source, false);<a name="line.1621"></a>
+<span class="sourceLineNo">1622</span><a name="line.1622"></a>
+<span class="sourceLineNo">1623</span>    // 1. Straight forward case, should succeed<a name="line.1623"></a>
+<span class="sourceLineNo">1624</span>    MutationBatchOperation batchOp = new MutationBatchOperation(region, puts, true,<a name="line.1624"></a>
+<span class="sourceLineNo">1625</span>        HConstants.NO_NONCE, HConstants.NO_NONCE);<a name="line.1625"></a>
+<span class="sourceLineNo">1626</span>    OperationStatus[] codes = this.region.batchMutate(batchOp);<a name="line.1626"></a>
+<span class="sourceLineNo">1627</span>    assertEquals(10, codes.length);<a name="line.1627"></a>
+<span class="sourceLineNo">1628</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.1628"></a>
+<span class="sourceLineNo">1629</span>      assertEquals(OperationStatusCode.SUCCESS, codes[i].getOperationStatusCode());<a name="line.1629"></a>
+<span class="sourceLineNo">1630</span>    }<a name="line.1630"></a>
+<span class="sourceLineNo">1631</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs + 1, source);<a name="line.1631"></a>
+<span class="sourceLineNo">1632</span><a name="line.1632"></a>
+<span class="sourceLineNo">1633</span>    // 2. Failed to get lock<a name="line.1633"></a>
+<span class="sourceLineNo">1634</span>    RowLock lock = region.getRowLock(Bytes.toBytes("row_" + 3));<a name="line.1634"></a>
+<span class="sourceLineNo">1635</span>    // Method {@link HRegion#getRowLock(byte[])} is reentrant. As 'row_3' is locked in this<a name="line.1635"></a>
+<span class="sourceLineNo">1636</span>    // thread, need to run {@link HRegion#batchMutate(HRegion.BatchOperation)} in different thread<a name="line.1636"></a>
+<span class="sourceLineNo">1637</span>    MultithreadedTestUtil.TestContext ctx = new MultithreadedTestUtil.TestContext(CONF);<a name="line.1637"></a>
+<span class="sourceLineNo">1638</span>    final AtomicReference&lt;IOException&gt; retFromThread = new AtomicReference&lt;&gt;();<a name="line.1638"></a>
+<span class="sourceLineNo">1639</span>    final CountDownLatch finishedPuts = new CountDownLatch(1);<a name="line.1639"></a>
+<span class="sourceLineNo">1640</span>    final MutationBatchOperation finalBatchOp = new MutationBatchOperation(region, puts, true,<a name="line.1640"></a>
+<span class="sourceLineNo">1641</span>        HConstants<a name="line.1641"></a>
+<span class="sourceLineNo">1642</span>        .NO_NONCE,<a name="line.1642"></a>
+<span class="sourceLineNo">1643</span>        HConstants.NO_NONCE);<a name="line.1643"></a>
+<span class="sourceLineNo">1644</span>    TestThread putter = new TestThread(ctx) {<a name="line.1644"></a>
+<span class="sourceLineNo">1645</span>      @Override<a name="line.1645"></a>
+<span class="sourceLineNo">1646</span>      public void doWork() throws IOException {<a name="line.1646"></a>
+<span class="sourceLineNo">1647</span>        try {<a name="line.1647"></a>
+<span class="sourceLineNo">1648</span>          region.batchMutate(finalBatchOp);<a name="line.1648"></a>
+<span class="sourceLineNo">1649</span>        } catch (IOException ioe) {<a name="line.1649"></a>
+<span class="sourceLineNo">1650</span>          LOG.error("test failed!", ioe);<a name="line.1650"></a>
+<span class="sourceLineNo">1651</span>          retFromThread.set(ioe);<a name="line.1651"></a>
+<span class="sourceLineNo">1652</span>        }<a name="line.1652"></a>
+<span class="sourceLineNo">1653</span>        finishedPuts.countDown();<a name="line.1653"></a>
+<span class="sourceLineNo">1654</span>      }<a name="line.1654"></a>
+<span class="sourceLineNo">1655</span>    };<a name="line.1655"></a>
+<span class="sourceLineNo">1656</span>    LOG.info("...starting put thread while holding locks");<a name="line.1656"></a>
+<span class="sourceLineNo">1657</span>    ctx.addThread(putter);<a name="line.1657"></a>
+<span class="sourceLineNo">1658</span>    ctx.startThreads();<a name="line.1658"></a>
+<span class="sourceLineNo">1659</span>    LOG.info("...waiting for batch puts while holding locks");<a name="line.1659"></a>
+<span class="sourceLineNo">1660</span>    try {<a name="line.1660"></a>
+<span class="sourceLineNo">1661</span>      finishedPuts.await();<a name="line.1661"></a>
+<span class="sourceLineNo">1662</span>    } catch (InterruptedException e) {<a name="line.1662"></a>
+<span class="sourceLineNo">1663</span>      LOG.error("Interrupted!", e);<a name="line.1663"></a>
+<span class="sourceLineNo">1664</span>    } finally {<a name="line.1664"></a>
+<span class="sourceLineNo">1665</span>      if (lock != null) {<a name="line.1665"></a>
+<span class="sourceLineNo">1666</span>        lock.release();<a name="line.1666"></a>
+<span class="sourceLineNo">1667</span>      }<a name="line.1667"></a>
+<span class="sourceLineNo">1668</span>    }<a name="line.1668"></a>
+<span class="sourceLineNo">1669</span>    assertNotNull(retFromThread.get());<a name="line.1669"></a>
+<span class="sourceLineNo">1670</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs + 1, source);<a name="line.1670"></a>
+<span class="sourceLineNo">1671</span><a name="line.1671"></a>
+<span class="sourceLineNo">1672</span>    // 3. Exception thrown in validation<a name="line.1672"></a>
+<span class="sourceLineNo">1673</span>    LOG.info("Next a batch put with one invalid family");<a name="line.1673"></a>
+<span class="sourceLineNo">1674</span>    puts[5].addColumn(Bytes.toBytes("BAD_CF"), qual, value);<a name="line.1674"></a>
+<span class="sourceLineNo">1675</span>    batchOp = new MutationBatchOperation(region, puts, true, HConstants.NO_NONCE,<a name="line.1675"></a>
+<span class="sourceLineNo">1676</span>        HConstants.NO_NONCE);<a name="line.1676"></a>
+<span class="sourceLineNo">1677</span>    thrown.expect(NoSuchColumnFamilyException.class);<a name="line.1677"></a>
+<span class="sourceLineNo">1678</span>    this.region.batchMutate(batchOp);<a name="line.1678"></a>
+<span class="sourceLineNo">1679</span>  }<a name="line.1679"></a>
+<span class="sourceLineNo">1680</span><a name="line.1680"></a>
+<span class="sourceLineNo">1681</span>  @Test<a name="line.1681"></a>
+<span class="sourceLineNo">1682</span>  public void testBatchPutWithTsSlop() throws Exception {<a name="line.1682"></a>
+<span class="sourceLineNo">1683</span>    // add data with a timestamp that is too recent for range. Ensure assert<a name="line.1683"></a>
+<span class="sourceLineNo">1684</span>    CONF.setInt("hbase.hregion.keyvalue.timestamp.slop.millisecs", 1000);<a name="line.1684"></a>
+<span class="sourceLineNo">1685</span>    final Put[] puts = new Put[10];<a name="line.1685"></a>
+<span class="sourceLineNo">1686</span>    MetricsWALSource source = CompatibilitySingletonFactory.getInstance(MetricsWALSource.class);<a name="line.1686"></a>
+<span class="sourceLineNo">1687</span><a name="line.1687"></a>
+<span class="sourceLineNo">1688</span>    long syncs = prepareRegionForBachPut(puts, source, true);<a name="line.1688"></a>
+<span class="sourceLineNo">1689</span><a name="line.1689"></a>
+<span class="sourceLineNo">1690</span>    OperationStatus[] codes = this.region.batchMutate(puts);<a name="line.1690"></a>
+<span class="sourceLineNo">1691</span>    assertEquals(10, codes.length);<a name="line.1691"></a>
+<span class="sourceLineNo">1692</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.1692"></a>
+<span class="sourceLineNo">1693</span>      assertEquals(OperationStatusCode.SANITY_CHECK_FAILURE, codes[i].getOperationStatusCode());<a name="line.1693"></a>
+<span class="sourceLineNo">1694</span>    }<a name="line.1694"></a>
+<span class="sourceLineNo">1695</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs, source);<a name="line.1695"></a>
+<span class="sourceLineNo">1696</span>  }<a name="line.1696"></a>
+<span class="sourceLineNo">1697</span><a name="line.1697"></a>
+<span class="sourceLineNo">1698</span>  /**<a name="line.1698"></a>
+<span class="sourceLineNo">1699</span>   * @return syncs initial syncTimeNumOps<a name="line.1699"></a>
+<span class="sourceLineNo">1700</span>   */<a name="line.1700"></a>
+<span class="sourceLineNo">1701</span>  private long prepareRegionForBachPut(final Put[] puts, final MetricsWALSource source,<a name="line.1701"></a>
+<span class="sourceLineNo">1702</span>      boolean slop) throws IOException {<a name="line.1702"></a>
+<span class="sourceLineNo">1703</span>    this.region = initHRegion(tableName, method, CONF, COLUMN_FAMILY_BYTES);<a name="line.1703"></a>
+<span class="sourceLineNo">1704</span><a name="line.1704"></a>
+<span class="sourceLineNo">1705</span>    LOG.info("First a batch put with all valid puts");<a name="line.1705"></a>
+<span class="sourceLineNo">1706</span>    for (int i = 0; i &lt; puts.length; i++) {<a name="line.1706"></a>
+<span class="sourceLineNo">1707</span>      puts[i] = slop ? new Put(Bytes.toBytes("row_" + i), Long.MAX_VALUE - 100) :<a name="line.1707"></a>
+<span class="sourceLineNo">1708</span>          new Put(Bytes.toBytes("row_" + i));<a name="line.1708"></a>
+<span class="sourceLineNo">1709</span>      puts[i].addColumn(COLUMN_FAMILY_BYTES, qual, value);<a name="line.1709"></a>
+<span class="sourceLineNo">1710</span>    }<a name="line.1710"></a>
+<span class="sourceLineNo">1711</span><a name="line.1711"></a>
+<span class="sourceLineNo">1712</span>    long syncs = metricsAssertHelper.getCounter("syncTimeNumOps", source);<a name="line.1712"></a>
+<span class="sourceLineNo">1713</span>    metricsAssertHelper.assertCounter("syncTimeNumOps", syncs, source);<a name="line.1713"></a>
+<span class="sourceLineNo">1714</span>    return syncs;<a name="line.1714"></a>
+<span class="sourceLineNo">1715</span>  }<a name="line.1715"></a>
+<span class="sourceLineNo">1716</span><a name="line.1716"></a>
+<span class="sourceLineNo">1717</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.1717"></a>
+<span class="sourceLineNo">1718</span>  // checkAndMutate tests<a name="line.1718"></a>
+<span class="sourceLineNo">1719</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.1719"></a>
+<span class="sourceLineNo">1720</span>  @Test<a name="line.1720"></a>
+<span class="sourceLineNo">1721</span>  public void testCheckAndMutate_WithEmptyRowValue() throws IOException {<a name="line.1721"></a>
+<span class="sourceLineNo">1722</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1722"></a>
+<span class="sourceLineNo">1723</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1723"></a>
+<span class="sourceLineNo">1724</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1724"></a>
+<span class="sourceLineNo">1725</span>    byte[] emptyVal = new byte[] {};<a name="line.1725"></a>
+<span class="sourceLineNo">1726</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1726"></a>
+<span class="sourceLineNo">1727</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.1727"></a>
+<span class="sourceLineNo">1728</span><a name="line.1728"></a>
+<span class="sourceLineNo">1729</span>    // Setting up region<a name="line.1729"></a>
+<span class="sourceLineNo">1730</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.1730"></a>
+<span class="sourceLineNo">1731</span>    // Putting empty data in key<a name="line.1731"></a>
+<span class="sourceLineNo">1732</span>    Put put = new Put(row1);<a name="line.1732"></a>
+<span class="sourceLineNo">1733</span>    put.addColumn(fam1, qf1, emptyVal);<a name="line.1733"></a>
+<span class="sourceLineNo">1734</span><a name="line.1734"></a>
+<span class="sourceLineNo">1735</span>    // checkAndPut with empty value<a name="line.1735"></a>
+<span class="sourceLineNo">1736</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1736"></a>
+<span class="sourceLineNo">1737</span>        new BinaryComparator(emptyVal), put);<a name="line.1737"></a>
+<span class="sourceLineNo">1738</span>    assertTrue(res);<a name="line.1738"></a>
+<span class="sourceLineNo">1739</span><a name="line.1739"></a>
+<span class="sourceLineNo">1740</span>    // Putting data in key<a name="line.1740"></a>
+<span class="sourceLineNo">1741</span>    put = new Put(row1);<a name="line.1741"></a>
+<span class="sourceLineNo">1742</span>    put.addColumn(fam1, qf1, val1);<a name="line.1742"></a>
+<span class="sourceLineNo">1743</span><a name="line.1743"></a>
+<span class="sourceLineNo">1744</span>    // checkAndPut with correct value<a name="line.1744"></a>
+<span class="sourceLineNo">1745</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1745"></a>
+<span class="sourceLineNo">1746</span>        new BinaryComparator(emptyVal), put);<a name="line.1746"></a>
+<span class="sourceLineNo">1747</span>    assertTrue(res);<a name="line.1747"></a>
+<span class="sourceLineNo">1748</span><a name="line.1748"></a>
+<span class="sourceLineNo">1749</span>    // not empty anymore<a name="line.1749"></a>
+<span class="sourceLineNo">1750</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1750"></a>
+<span class="sourceLineNo">1751</span>        new BinaryComparator(emptyVal), put);<a name="line.1751"></a>
+<span class="sourceLineNo">1752</span>    assertFalse(res);<a name="line.1752"></a>
+<span class="sourceLineNo">1753</span><a name="line.1753"></a>
+<span class="sourceLineNo">1754</span>    Delete delete = new Delete(row1);<a name="line.1754"></a>
+<span class="sourceLineNo">1755</span>    delete.addColumn(fam1, qf1);<a name="line.1755"></a>
+<span class="sourceLineNo">1756</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1756"></a>
+<span class="sourceLineNo">1757</span>        new BinaryComparator(emptyVal), delete);<a name="line.1757"></a>
+<span class="sourceLineNo">1758</span>    assertFalse(res);<a name="line.1758"></a>
+<span class="sourceLineNo">1759</span><a name="line.1759"></a>
+<span class="sourceLineNo">1760</span>    put = new Put(row1);<a name="line.1760"></a>
+<span class="sourceLineNo">1761</span>    put.addColumn(fam1, qf1, val2);<a name="line.1761"></a>
+<span class="sourceLineNo">1762</span>    // checkAndPut with correct value<a name="line.1762"></a>
+<span class="sourceLineNo">1763</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1763"></a>
+<span class="sourceLineNo">1764</span>        new BinaryComparator(val1), put);<a name="line.1764"></a>
+<span class="sourceLineNo">1765</span>    assertTrue(res);<a name="line.1765"></a>
+<span class="sourceLineNo">1766</span><a name="line.1766"></a>
+<span class="sourceLineNo">1767</span>    // checkAndDelete with correct value<a name="line.1767"></a>
+<span class="sourceLineNo">1768</span>    delete = new Delete(row1);<a name="line.1768"></a>
 <span class="sourceLineNo">1769</span>    delete.addColumn(fam1, qf1);<a name="line.1769"></a>
-<span class="sourceLineNo">1770</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1770"></a>
-<span class="sourceLineNo">1771</span>        new BinaryComparator(val2), delete);<a name="line.1771"></a>
-<span class="sourceLineNo">1772</span>    assertTrue(res);<a name="line.1772"></a>
-<span class="sourceLineNo">1773</span><a name="line.1773"></a>
-<span class="sourceLineNo">1774</span>    delete = new Delete(row1);<a name="line.1774"></a>
-<span class="sourceLineNo">1775</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1775"></a>
-<span class="sourceLineNo">1776</span>        new BinaryComparator(emptyVal), delete);<a name="line.1776"></a>
-<span class="sourceLineNo">1777</span>    assertTrue(res);<a name="line.1777"></a>
-<span class="sourceLineNo">1778</span><a name="line.1778"></a>
-<span class="sourceLineNo">1779</span>    // checkAndPut looking for a null value<a name="line.1779"></a>
-<span class="sourceLineNo">1780</span>    put = new Put(row1);<a name="line.1780"></a>
-<span class="sourceLineNo">1781</span>    put.addColumn(fam1, qf1, val1);<a name="line.1781"></a>
-<span class="sourceLineNo">1782</span><a name="line.1782"></a>
-<span class="sourceLineNo">1783</span>    res = region<a name="line.1783"></a>
-<span class="sourceLineNo">1784</span>        .checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new NullComparator(), put);<a name="line.1784"></a>
-<span class="sourceLineNo">1785</span>    assertTrue(res);<a name="line.1785"></a>
-<span class="sourceLineNo">1786</span>  }<a name="line.1786"></a>
-<span class="sourceLineNo">1787</span><a name="line.1787"></a>
-<span class="sourceLineNo">1788</span>  @Test<a name="line.1788"></a>
-<span class="sourceLineNo">1789</span>  public void testCheckAndMutate_WithWrongValue() throws IOException {<a name="line.1789"></a>
-<span class="sourceLineNo">1790</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1790"></a>
-<span class="sourceLineNo">1791</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1791"></a>
-<span class="sourceLineNo">1792</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1792"></a>
-<span class="sourceLineNo">1793</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1793"></a>
-<span class="sourceLineNo">1794</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.1794"></a>
-<span class="sourceLineNo">1795</span>    BigDecimal bd1 = new BigDecimal(Double.MAX_VALUE);<a name="line.1795"></a>
-<span class="sourceLineNo">1796</span>    BigDecimal bd2 = new BigDecimal(Double.MIN_VALUE);<a name="line.1796"></a>
-<span class="sourceLineNo">1797</span><a name="line.1797"></a>
-<span class="sourceLineNo">1798</span>    // Setting up region<a name="line.1798"></a>
-<span class="sourceLineNo">1799</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.1799"></a>
-<span class="sourceLineNo">1800</span>    // Putting data in key<a name="line.1800"></a>
-<span class="sourceLineNo">1801</span>    Put put = new Put(row1);<a name="line.1801"></a>
-<span class="sourceLineNo">1802</span>    put.addColumn(fam1, qf1, val1);<a name="line.1802"></a>
-<span class="sourceLineNo">1803</span>    region.put(put);<a name="line.1803"></a>
-<span class="sourceLineNo">1804</span><a name="line.1804"></a>
-<span class="sourceLineNo">1805</span>    // checkAndPut with wrong value<a name="line.1805"></a>
-<span class="sourceLineNo">1806</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1806"></a>
-<span class="sourceLineNo">1807</span>        new BinaryComparator(val2), put);<a name="line.1807"></a>
-<span class="sourceLineNo">1808</span>    assertEquals(false, res);<a name="line.1808"></a>
-<span class="sourceLineNo">1809</span><a name="line.1809"></a>
-<span class="sourceLineNo">1810</span>    // checkAndDelete with wrong value<a name="line.1810"></a>
-<span class="sourceLineNo">1811</span>    Delete delete = new Delete(row1);<a name="line.1811"></a>
-<span class="sourceLineNo">1812</span>    delete.addFamily(fam1);<a name="line.1812"></a>
-<span class="sourceLineNo">1813</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1813"></a>
-<span class="sourceLineNo">1814</span>        new BinaryComparator(val2), put);<a name="line.1814"></a>
-<span class="sourceLineNo">1815</span>    assertEquals(false, res);<a name="line.1815"></a>
-<span class="sourceLineNo">1816</span><a name="line.1816"></a>
-<span class="sourceLineNo">1817</span>    // Putting data in key<a name="line.1817"></a>
-<span class="sourceLineNo">1818</span>    put = new Put(row1);<a name="line.1818"></a>
-<span class="sourceLineNo">1819</span>    put.addColumn(fam1, qf1, Bytes.toBytes(bd1));<a name="line.1819"></a>
-<span class="sourceLineNo">1820</span>    region.put(put);<a name="line.1820"></a>
-<span class="sourceLineNo">1821</span><a name="line.1821"></a>
-<span class="sourceLineNo">1822</span>    // checkAndPut with wrong value<a name="line.1822"></a>
-<span class="sourceLineNo">1823</span>    res =<a name="line.1823"></a>
-<span class="sourceLineNo">1824</span>        region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1824"></a>
-<span class="sourceLineNo">1825</span>            new BigDecimalComparator(bd2), put);<a name="line.1825"></a>
-<span class="sourceLineNo">1826</span>    assertEquals(false, res);<a name="line.1826"></a>
-<span class="sourceLineNo">1827</span><a name="line.1827"></a>
-<span class="sourceLineNo">1828</span>    // checkAndDelete with wrong value<a name="line.1828"></a>
-<span class="sourceLineNo">1829</span>    delete = new Delete(row1);<a name="line.1829"></a>
-<span class="sourceLineNo">1830</span>    delete.addFamily(fam1);<a name="line.1830"></a>
-<span class="sourceLineNo">1831</span>    res =<a name="line.1831"></a>
-<span class="sourceLineNo">1832</span>        region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1832"></a>
-<span class="sourceLineNo">1833</span>            new BigDecimalComparator(bd2), put);<a name="line.1833"></a>
-<span class="sourceLineNo">1834</span>    assertEquals(false, res);<a name="line.1834"></a>
-<span class="sourceLineNo">1835</span>  }<a name="line.1835"></a>
-<span class="sourceLineNo">1836</span><a name="line.1836"></a>
-<span class="sourceLineNo">1837</span>  @Test<a name="line.1837"></a>
-<span class="sourceLineNo">1838</span>  public void testCheckAndMutate_WithCorrectValue() throws IOException {<a name="line.1838"></a>
-<span class="sourceLineNo">1839</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1839"></a>
-<span class="sourceLineNo">1840</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1840"></a>
-<span class="sourceLineNo">1841</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1841"></a>
-<span class="sourceLineNo">1842</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1842"></a>
-<span class="sourceLineNo">1843</span>    BigDecimal bd1 = new BigDecimal(Double.MIN_VALUE);<a name="line.1843"></a>
-<span class="sourceLineNo">1844</span><a name="line.1844"></a>
-<span class="sourceLineNo">1845</span>    // Setting up region<a name="line.1845"></a>
-<span class="sourceLineNo">1846</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.1846"></a>
-<span class="sourceLineNo">1847</span>    // Putting data in key<a name="line.1847"></a>
-<span class="sourceLineNo">1848</span>    Put put = new Put(row1);<a name="line.1848"></a>
-<span class="sourceLineNo">1849</span>    put.addColumn(fam1, qf1, val1);<a name="line.1849"></a>
-<span class="sourceLineNo">1850</span>    region.put(put);<a name="line.1850"></a>
-<span class="sourceLineNo">1851</span><a name="line.1851"></a>
-<span class="sourceLineNo">1852</span>    // checkAndPut with correct value<a name="line.1852"></a>
-<span class="sourceLineNo">1853</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1853"></a>
-<span class="sourceLineNo">1854</span>        new BinaryComparator(val1), put);<a name="line.1854"></a>
-<span class="sourceLineNo">1855</span>    assertEquals(true, res);<a name="line.1855"></a>
-<span class="sourceLineNo">1856</span><a name="line.1856"></a>
-<span class="sourceLineNo">1857</span>    // checkAndDelete with correct value<a name="line.1857"></a>
-<span class="sourceLineNo">1858</span>    Delete delete = new Delete(row1);<a name="line.1858"></a>
-<span class="sourceLineNo">1859</span>    delete.addColumn(fam1, qf1);<a name="line.1859"></a>
-<span class="sourceLineNo">1860</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new BinaryComparator(val1),<a name="line.1860"></a>
-<span class="sourceLineNo">1861</span>        delete);<a name="line.1861"></a>
-<span class="sourceLineNo">1862</span>    assertEquals(true, res);<a name="line.1862"></a>
-<span class="sourceLineNo">1863</span><a name="line.1863"></a>
-<span class="sourceLineNo">1864</span>    // Putting data in key<a name="line.1864"></a>
-<span class="sourceLineNo">1865</span>    put = new Put(row1);<a name="line.1865"></a>
-<span class="sourceLineNo">1866</span>    put.addColumn(fam1, qf1, Bytes.toBytes(bd1));<a name="line.1866"></a>
-<span class="sourceLineNo">1867</span>    region.put(put);<a name="line.1867"></a>
-<span class="sourceLineNo">1868</span><a name="line.1868"></a>
-<span class="sourceLineNo">1869</span>    // checkAndPut with correct value<a name="line.1869"></a>
-<span class="sourceLineNo">1870</span>    res =<a name="line.1870"></a>
-<span class="sourceLineNo">1871</span>        region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new BigDecimalComparator(<a name="line.1871"></a>
-<span class="sourceLineNo">1872</span>            bd1), put);<a name="line.1872"></a>
-<span class="sourceLineNo">1873</span>    assertEquals(true, res);<a name="line.1873"></a>
-<span class="sourceLineNo">1874</span><a name="line.1874"></a>
-<span class="sourceLineNo">1875</span>    // checkAndDelete with correct value<a name="line.1875"></a>
-<span class="sourceLineNo">1876</span>    delete = new Delete(row1);<a name="line.1876"></a>
-<span class="sourceLineNo">1877</span>    delete.addColumn(fam1, qf1);<a name="line.1877"></a>
-<span class="sourceLineNo">1878</span>    res =<a name="line.1878"></a>
-<span class="sourceLineNo">1879</span>        region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new BigDecimalComparator(<a name="line.1879"></a>
-<span class="sourceLineNo">1880</span>            bd1), delete);<a name="line.1880"></a>
-<span class="sourceLineNo">1881</span>    assertEquals(true, res);<a name="line.1881"></a>
-<span class="sourceLineNo">1882</span>  }<a name="line.1882"></a>
-<span class="sourceLineNo">1883</span><a name="line.1883"></a>
-<span class="sourceLineNo">1884</span>  @Test<a name="line.1884"></a>
-<span class="sourceLineNo">1885</span>  public void testCheckAndMutate_WithNonEqualCompareOp() throws IOException {<a name="line.1885"></a>
-<span class="sourceLineNo">1886</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1886"></a>
-<span class="sourceLineNo">1887</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1887"></a>
-<span class="sourceLineNo">1888</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1888"></a>
-<span class="sourceLineNo">1889</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1889"></a>
-<span class="sourceLineNo">1890</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.1890"></a>
-<span class="sourceLineNo">1891</span>    byte[] val3 = Bytes.toBytes("value3");<a name="line.1891"></a>
-<span class="sourceLineNo">1892</span>    byte[] val4 = Bytes.toBytes("value4");<a name="line.1892"></a>
-<span class="sourceLineNo">1893</span><a name="line.1893"></a>
-<span class="sourceLineNo">1894</span>    // Setting up region<a name="line.1894"></a>
-<span class="sourceLineNo">1895</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.1895"></a>
-<span class="sourceLineNo">1896</span>    // Putting val3 in key<a name="line.1896"></a>
-<span class="sourceLineNo">1897</span>    Put put = new Put(row1);<a name="line.1897"></a>
-<span class="sourceLineNo">1898</span>    put.addColumn(fam1, qf1, val3);<a name="line.1898"></a>
-<span class="sourceLineNo">1899</span>    region.put(put);<a name="line.1899"></a>
-<span class="sourceLineNo">1900</span><a name="line.1900"></a>
-<span class="sourceLineNo">1901</span>    // Test CompareOp.LESS: original = val3, compare with val3, fail<a name="line.1901"></a>
-<span class="sourceLineNo">1902</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS,<a name="line.1902"></a>
-<span class="sourceLineNo">1903</span>        new BinaryComparator(val3), put);<a name="line.1903"></a>
-<span class="sourceLineNo">1904</span>    assertEquals(false, res);<a name="line.1904"></a>
-<span class="sourceLineNo">1905</span><a name="line.1905"></a>
-<span class="sourceLineNo">1906</span>    // Test CompareOp.LESS: original = val3, compare with val4, fail<a name="line.1906"></a>
-<span class="sourceLineNo">1907</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS,<a name="line.1907"></a>
-<span class="sourceLineNo">1908</span>        new BinaryComparator(val4), put);<a name="line.1908"></a>
-<span class="sourceLineNo">1909</span>    assertEquals(false, res);<a name="line.1909"></a>
-<span class="sourceLineNo">1910</span><a name="line.1910"></a>
-<span class="sourceLineNo">1911</span>    // Test CompareOp.LESS: original = val3, compare with val2,<a name="line.1911"></a>
-<span class="sourceLineNo">1912</span>    // succeed (now value = val2)<a name="line.1912"></a>
-<span class="sourceLineNo">1913</span>    put = new Put(row1);<a name="line.1913"></a>
-<span class="sourceLineNo">1914</span>    put.addColumn(fam1, qf1, val2);<a name="line.1914"></a>
-<span class="sourceLineNo">1915</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS,<a name="line.1915"></a>
-<span class="sourceLineNo">1916</span>        new BinaryComparator(val2), put);<a name="line.1916"></a>
-<span class="sourceLineNo">1917</span>    assertEquals(true, res);<a name="line.1917"></a>
-<span class="sourceLineNo">1918</span><a name="line.1918"></a>
-<span class="sourceLineNo">1919</span>    // Test CompareOp.LESS_OR_EQUAL: original = val2, compare with val3, fail<a name="line.1919"></a>
-<span class="sourceLineNo">1920</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS_OR_EQUAL,<a name="line.1920"></a>
-<span class="sourceLineNo">1921</span>        new BinaryComparator(val3), put);<a name="line.1921"></a>
-<span class="sourceLineNo">1922</span>    assertEquals(false, res);<a name="line.1922"></a>
-<span class="sourceLineNo">1923</span><a name="line.1923"></a>
-<span class="sourceLineNo">1924</span>    // Test CompareOp.LESS_OR_EQUAL: original = val2, compare with val2,<a name="line.1924"></a>
-<span class="sourceLineNo">1925</span>    // succeed (value still = val2)<a name="line.1925"></a>
-<span class="sourceLineNo">1926</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS_OR_EQUAL,<a name="line.1926"></a>
-<span class="sourceLineNo">1927</span>        new BinaryComparator(val2), put);<a name="line.1927"></a>
-<span class="sourceLineNo">1928</span>    assertEquals(true, res);<a name="line.1928"></a>
-<span class="sourceLineNo">1929</span><a name="line.1929"></a>
-<span class="sourceLineNo">1930</span>    // Test CompareOp.LESS_OR_EQUAL: original = val2, compare with val1,<a name="line.1930"></a>
-<span class="sourceLineNo">1931</span>    // succeed (now value = val3)<a name="line.1931"></a>
-<span class="sourceLineNo">1932</span>    put = new Put(row1);<a name="line.1932"></a>
-<span class="sourceLineNo">1933</span>    put.addColumn(fam1, qf1, val3);<a name="line.1933"></a>
-<span class="sourceLineNo">1934</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS_OR_EQUAL,<a name="line.1934"></a>
-<span class="sourceLineNo">1935</span>        new BinaryComparator(val1), put);<a name="line.1935"></a>
-<span class="sourceLineNo">1936</span>    assertEquals(true, res);<a name="line.1936"></a>
-<span class="sourceLineNo">1937</span><a name="line.1937"></a>
-<span class="sourceLineNo">1938</span>    // Test CompareOp.GREATER: original = val3, compare with val3, fail<a name="line.1938"></a>
-<span class="sourceLineNo">1939</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER,<a name="line.1939"></a>
-<span class="sourceLineNo">1940</span>        new BinaryComparator(val3), put);<a name="line.1940"></a>
-<span class="sourceLineNo">1941</span>    assertEquals(false, res);<a name="line.1941"></a>
-<span class="sourceLineNo">1942</span><a name="line.1942"></a>
-<span class="sourceLineNo">1943</span>    // Test CompareOp.GREATER: original = val3, compare with val2, fail<a name="line.1943"></a>
-<span class="sourceLineNo">1944</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER,<a name="line.1944"></a>
-<span class="sourceLineNo">1945</span>        new BinaryComparator(val2), put);<a name="line.1945"></a>
-<span class="sourceLineNo">1946</span>    assertEquals(false, res);<a name="line.1946"></a>
-<span class="sourceLineNo">1947</span><a name="line.1947"></a>
-<span class="sourceLineNo">1948</span>    // Test CompareOp.GREATER: original = val3, compare with val4,<a name="line.1948"></a>
-<span class="sourceLineNo">1949</span>    // succeed (now value = val2)<a name="line.1949"></a>
-<span class="sourceLineNo">1950</span>    put = new Put(row1);<a name="line.1950"></a>
-<span class="sourceLineNo">1951</span>    put.addColumn(fam1, qf1, val2);<a name="line.1951"></a>
-<span class="sourceLineNo">1952</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER,<a name="line.1952"></a>
-<span class="sourceLineNo">1953</span>        new BinaryComparator(val4), put);<a name="line.1953"></a>
-<span class="sourceLineNo">1954</span>    assertEquals(true, res);<a name="line.1954"></a>
-<span class="sourceLineNo">1955</span><a name="line.1955"></a>
-<span class="sourceLineNo">1956</span>    // Test CompareOp.GREATER_OR_EQUAL: original = val2, compare with val1, fail<a name="line.1956"></a>
-<span class="sourceLineNo">1957</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER_OR_EQUAL,<a name="line.1957"></a>
-<span class="sourceLineNo">1958</span>        new BinaryComparator(val1), put);<a name="line.1958"></a>
-<span class="sourceLineNo">1959</span>    assertEquals(false, res);<a name="line.1959"></a>
-<span class="sourceLineNo">1960</span><a name="line.1960"></a>
-<span class="sourceLineNo">1961</span>    // Test CompareOp.GREATER_OR_EQUAL: original = val2, compare with val2,<a name="line.1961"></a>
-<span class="sourceLineNo">1962</span>    // succeed (value still = val2)<a name="line.1962"></a>
-<span class="sourceLineNo">1963</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER_OR_EQUAL,<a name="line.1963"></a>
-<span class="sourceLineNo">1964</span>        new BinaryComparator(val2), put);<a name="line.1964"></a>
-<span class="sourceLineNo">1965</span>    assertEquals(true, res);<a name="line.1965"></a>
-<span class="sourceLineNo">1966</span><a name="line.1966"></a>
-<span class="sourceLineNo">1967</span>    // Test CompareOp.GREATER_OR_EQUAL: original = val2, compare with val3, succeed<a name="line.1967"></a>
-<span class="sourceLineNo">1968</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER_OR_EQUAL,<a name="line.1968"></a>
-<span class="sourceLineNo">1969</span>        new BinaryComparator(val3), put);<a name="line.1969"></a>
-<span class="sourceLineNo">1970</span>    assertEquals(true, res);<a name="line.1970"></a>
-<span class="sourceLineNo">1971</span>  }<a name="line.1971"></a>
-<span class="sourceLineNo">1972</span><a name="line.1972"></a>
-<span class="sourceLineNo">1973</span>  @Test<a name="line.1973"></a>
-<span class="sourceLineNo">1974</span>  public void testCheckAndPut_ThatPutWasWritten() throws IOException {<a name="line.1974"></a>
-<span class="sourceLineNo">1975</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1975"></a>
-<span class="sourceLineNo">1976</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1976"></a>
-<span class="sourceLineNo">1977</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.1977"></a>
-<span class="sourceLineNo">1978</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1978"></a>
-<span class="sourceLineNo">1979</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1979"></a>
-<span class="sourceLineNo">1980</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.1980"></a>
-<span class="sourceLineNo">1981</span><a name="line.1981"></a>
-<span class="sourceLineNo">1982</span>    byte[][] families = { fam1, fam2 };<a name="line.1982"></a>
-<span class="sourceLineNo">1983</span><a name="line.1983"></a>
-<span class="sourceLineNo">1984</span>    // Setting up region<a name="line.1984"></a>
-<span class="sourceLineNo">1985</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.1985"></a>
-<span class="sourceLineNo">1986</span>    // Putting data in the key to check<a name="line.1986"></a>
-<span class="sourceLineNo">1987</span>    Put put = new Put(row1);<a name="line.1987"></a>
-<span class="sourceLineNo">1988</span>    put.addColumn(fam1, qf1, val1);<a name="line.1988"></a>
-<span class="sourceLineNo">1989</span>    region.put(put);<a name="line.1989"></a>
-<span class="sourceLineNo">1990</span><a name="line.1990"></a>
-<span class="sourceLineNo">1991</span>    // Creating put to add<a name="line.1991"></a>
-<span class="sourceLineNo">1992</span>    long ts = System.currentTimeMillis();<a name="line.1992"></a>
-<span class="sourceLineNo">1993</span>    KeyValue kv = new KeyValue(row1, fam2, qf1, ts, KeyValue.Type.Put, val2);<a name="line.1993"></a>
-<span class="sourceLineNo">1994</span>    put = new Put(row1);<a name="line.1994"></a>
-<span class="sourceLineNo">1995</span>    put.add(kv);<a name="line.1995"></a>
-<span class="sourceLineNo">1996</span><a name="line.1996"></a>
-<span class="sourceLineNo">1997</span>    // checkAndPut with wrong value<a name="line.1997"></a>
-<span class="sourceLineNo">1998</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1998"></a>
-<span class="sourceLineNo">1999</span>        new BinaryComparator(val1), put);<a name="line.1999"></a>
-<span class="sourceLineNo">2000</span>    assertEquals(true, res);<a name="line.2000"></a>
-<span class="sourceLineNo">2001</span><a name="line.2001"></a>
-<span class="sourceLineNo">2002</span>    Get get = new Get(row1);<a name="line.2002"></a>
-<span class="sourceLineNo">2003</span>    get.addColumn(fam2, qf1);<a name="line.2003"></a>
-<span class="sourceLineNo">2004</span>    Cell[] actual = region.get(get).rawCells();<a name="line.2004"></a>
-<span class="sourceLineNo">2005</span><a name="line.2005"></a>
-<span class="sourceLineNo">2006</span>    Cell[] expected = { kv };<a name="line.2006"></a>
-<span class="sourceLineNo">2007</span><a name="line.2007"></a>
-<span class="sourceLineNo">2008</span>    assertEquals(expected.length, actual.length);<a name="line.2008"></a>
-<span class="sourceLineNo">2009</span>    for (int i = 0; i &lt; actual.length; i++) {<a name="line.2009"></a>
-<span class="sourceLineNo">2010</span>      assertEquals(expected[i], actual[i]);<a name="line.2010"></a>
-<span class="sourceLineNo">2011</span>    }<a name="line.2011"></a>
-<span class="sourceLineNo">2012</span>  }<a name="line.2012"></a>
-<span class="sourceLineNo">2013</span><a name="line.2013"></a>
-<span class="sourceLineNo">2014</span>  @Test<a name="line.2014"></a>
-<span class="sourceLineNo">2015</span>  public void testCheckAndPut_wrongRowInPut() throws IOException {<a name="line.2015"></a>
-<span class="sourceLineNo">2016</span>    this.region = initHRegion(tableName, method, CONF, COLUMNS);<a name="line.2016"></a>
-<span class="sourceLineNo">2017</span>    Put put = new Put(row2);<a name="line.2017"></a>
-<span class="sourceLineNo">2018</span>    put.addColumn(fam1, qual1, value1);<a name="line.2018"></a>
-<span class="sourceLineNo">2019</span>    try {<a name="line.2019"></a>
-<span class="sourceLineNo">2020</span>      region.checkAndMutate(row, fam1, qual1, CompareOperator.EQUAL,<a name="line.2020"></a>
-<span class="sourceLineNo">2021</span>          new BinaryComparator(value2), put);<a name="line.2021"></a>
-<span class="sourceLineNo">2022</span>      fail();<a name="line.2022"></a>
-<span class="sourceLineNo">2023</span>    } catch (org.apache.hadoop.hbase.DoNotRetryIOException expected) {<a name="line.2023"></a>
-<span class="sourceLineNo">2024</span>      // expected exception.<a name="line.2024"></a>
-<span class="sourceLineNo">2025</span>    }<a name="line.2025"></a>
-<span class="sourceLineNo">2026</span>  }<a name="line.2026"></a>
-<span class="sourceLineNo">2027</span><a name="line.2027"></a>
-<span class="sourceLineNo">2028</span>  @Test<a name="line.2028"></a>
-<span class="sourceLineNo">2029</span>  public void testCheckAndDelete_ThatDeleteWasWritten() throws IOException {<a name="line.2029"></a>
-<span class="sourceLineNo">2030</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2030"></a>
-<span class="sourceLineNo">2031</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2031"></a>
-<span class="sourceLineNo">2032</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2032"></a>
-<span class="sourceLineNo">2033</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.2033"></a>
-<span class="sourceLineNo">2034</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.2034"></a>
-<span class="sourceLineNo">2035</span>    byte[] qf3 = Bytes.toBytes("qualifier3");<a name="line.2035"></a>
-<span class="sourceLineNo">2036</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.2036"></a>
-<span class="sourceLineNo">2037</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.2037"></a>
-<span class="sourceLineNo">2038</span>    byte[] val3 = Bytes.toBytes("value3");<a name="line.2038"></a>
-<span class="sourceLineNo">2039</span>    byte[] emptyVal = new byte[] {};<a name="line.2039"></a>
-<span class="sourceLineNo">2040</span><a name="line.2040"></a>
-<span class="sourceLineNo">2041</span>    byte[][] families = { fam1, fam2 };<a name="line.2041"></a>
-<span class="sourceLineNo">2042</span><a name="line.2042"></a>
-<span class="sourceLineNo">2043</span>    // Setting up region<a name="line.2043"></a>
-<span class="sourceLineNo">2044</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2044"></a>
-<span class="sourceLineNo">2045</span>    // Put content<a name="line.2045"></a>
-<span class="sourceLineNo">2046</span>    Put put = new Put(row1);<a name="line.2046"></a>
-<span class="sourceLineNo">2047</span>    put.addColumn(fam1, qf1, val1);<a name="line.2047"></a>
-<span class="sourceLineNo">2048</span>    region.put(put);<a name="line.2048"></a>
-<span class="sourceLineNo">2049</span>    Threads.sleep(2);<a name="line.2049"></a>
-<span class="sourceLineNo">2050</span><a name="line.2050"></a>
-<span class="sourceLineNo">2051</span>    put = new Put(row1);<a name="line.2051"></a>
-<span class="sourceLineNo">2052</span>    put.addColumn(fam1, qf1, val2);<a name="line.2052"></a>
-<span class="sourceLineNo">2053</span>    put.addColumn(fam2, qf1, val3);<a name="line.2053"></a>
-<span class="sourceLineNo">2054</span>    put.addColumn(fam2, qf2, val2);<a name="line.2054"></a>
-<span class="sourceLineNo">2055</span>    put.addColumn(fam2, qf3, val1);<a name="line.2055"></a>
-<span class="sourceLineNo">2056</span>    put.addColumn(fam1, qf3, val1);<a name="line.2056"></a>
-<span class="sourceLineNo">2057</span>    region.put(put);<a name="line.2057"></a>
-<span class="sourceLineNo">2058</span><a name="line.2058"></a>
-<span class="sourceLineNo">2059</span>    // Multi-column delete<a name="line.2059"></a>
-<span class="sourceLineNo">2060</span>    Delete delete = new Delete(row1);<a name="line.2060"></a>
-<span class="sourceLineNo">2061</span>    delete.addColumn(fam1, qf1);<a name="line.2061"></a>
-<span class="sourceLineNo">2062</span>    delete.addColumn(fam2, qf1);<a name="line.2062"></a>
-<span class="sourceLineNo">2063</span>    delete.addColumn(fam1, qf3);<a name="line.2063"></a>
-<span class="sourceLineNo">2064</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.2064"></a>
-<span class="sourceLineNo">2065</span>        new BinaryComparator(val2), delete);<a name="line.2065"></a>
-<span class="sourceLineNo">2066</span>    assertEquals(true, res);<a name="line.2066"></a>
-<span class="sourceLineNo">2067</span><a name="line.2067"></a>
-<span class="sourceLineNo">2068</span>    Get get = new Get(row1);<a name="line.2068"></a>
-<span class="sourceLineNo">2069</span>    get.addColumn(fam1, qf1);<a name="line.2069"></a>
-<span class="sourceLineNo">2070</span>    get.addColumn(fam1, qf3);<a name="line.2070"></a>
-<span class="sourceLineNo">2071</span>    get.addColumn(fam2, qf2);<a name="line.2071"></a>
-<span class="sourceLineNo">2072</span>    Result r = region.get(get);<a name="line.2072"></a>
-<span class="sourceLineNo">2073</span>    assertEquals(2, r.size());<a name="line.2073"></a>
-<span class="sourceLineNo">2074</span>    assertArrayEquals(val1, r.getValue(fam1, qf1));<a name="line.2074"></a>
-<span class="sourceLineNo">2075</span>    assertArrayEquals(val2, r.getValue(fam2, qf2));<a name="line.2075"></a>
-<span class="sourceLineNo">2076</span><a name="line.2076"></a>
-<span class="sourceLineNo">2077</span>    // Family delete<a name="line.2077"></a>
-<span class="sourceLineNo">2078</span>    delete = new Delete(row1);<a name="line.2078"></a>
-<span class="sourceLineNo">2079</span>    delete.addFamily(fam2);<a name="line.2079"></a>
-<span class="sourceLineNo">2080</span>    res = region.checkAndMutate(row1, fam2, qf1, CompareOperator.EQUAL,<a name="line.2080"></a>
-<span class="sourceLineNo">2081</span>        new BinaryComparator(emptyVal), delete);<a name="line.2081"></a>
-<span class="sourceLineNo">2082</span>    assertEquals(true, res);<a name="line.2082"></a>
-<span class="sourceLineNo">2083</span><a name="line.2083"></a>
-<span class="sourceLineNo">2084</span>    get = new Get(row1);<a name="line.2084"></a>
-<span class="sourceLineNo">2085</span>    r = region.get(get);<a name="line.2085"></a>
-<span class="sourceLineNo">2086</span>    assertEquals(1, r.size());<a name="line.2086"></a>
-<span class="sourceLineNo">2087</span>    assertArrayEquals(val1, r.getValue(fam1, qf1));<a name="line.2087"></a>
-<span class="sourceLineNo">2088</span><a name="line.2088"></a>
-<span class="sourceLineNo">2089</span>    // Row delete<a name="line.2089"></a>
-<span class="sourceLineNo">2090</span>    delete = new Delete(row1);<a name="line.2090"></a>
-<span class="sourceLineNo">2091</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new BinaryComparator(val1),<a name="line.2091"></a>
-<span class="sourceLineNo">2092</span>        delete);<a name="line.2092"></a>
-<span class="sourceLineNo">2093</span>    assertEquals(true, res);<a name="line.2093"></a>
-<span class="sourceLineNo">2094</span>    get = new Get(row1);<a name="line.2094"></a>
-<span class="sourceLineNo">2095</span>    r = region.get(get);<a name="line.2095"></a>
-<span class="sourceLineNo">2096</span>    assertEquals(0, r.size());<a name="line.2096"></a>
-<span class="sourceLineNo">2097</span>  }<a name="line.2097"></a>
-<span class="sourceLineNo">2098</span><a name="line.2098"></a>
-<span class="sourceLineNo">2099</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2099"></a>
-<span class="sourceLineNo">2100</span>  // Delete tests<a name="line.2100"></a>
-<span class="sourceLineNo">2101</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2101"></a>
-<span class="sourceLineNo">2102</span>  @Test<a name="line.2102"></a>
-<span class="sourceLineNo">2103</span>  public void testDelete_multiDeleteColumn() throws IOException {<a name="line.2103"></a>
-<span class="sourceLineNo">2104</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2104"></a>
-<span class="sourceLineNo">2105</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2105"></a>
-<span class="sourceLineNo">2106</span>    byte[] qual = Bytes.toBytes("qualifier");<a name="line.2106"></a>
-<span class="sourceLineNo">2107</span>    byte[] value = Bytes.toBytes("value");<a name="line.2107"></a>
-<span class="sourceLineNo">2108</span><a name="line.2108"></a>
-<span class="sourceLineNo">2109</span>    Put put = new Put(row1);<a name="line.2109"></a>
-<span class="sourceLineNo">2110</span>    put.addColumn(fam1, qual, 1, value);<a name="line.2110"></a>
-<span class="sourceLineNo">2111</span>    put.addColumn(fam1, qual, 2, value);<a name="line.2111"></a>
-<span class="sourceLineNo">2112</span><a name="line.2112"></a>
-<span class="sourceLineNo">2113</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2113"></a>
-<span class="sourceLineNo">2114</span>    region.put(put);<a name="line.2114"></a>
-<span class="sourceLineNo">2115</span><a name="line.2115"></a>
-<span class="sourceLineNo">2116</span>    // We do support deleting more than 1 'latest' version<a name="line.2116"></a>
-<span class="sourceLineNo">2117</span>    Delete delete = new Delete(row1);<a name="line.2117"></a>
-<span class="sourceLineNo">2118</span>    delete.addColumn(fam1, qual);<a name="line.2118"></a>
+<span class="sourceLineNo">1770</span>    delete.addColumn(fam1, qf1);<a name="line.1770"></a>
+<span class="sourceLineNo">1771</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1771"></a>
+<span class="sourceLineNo">1772</span>        new BinaryComparator(val2), delete);<a name="line.1772"></a>
+<span class="sourceLineNo">1773</span>    assertTrue(res);<a name="line.1773"></a>
+<span class="sourceLineNo">1774</span><a name="line.1774"></a>
+<span class="sourceLineNo">1775</span>    delete = new Delete(row1);<a name="line.1775"></a>
+<span class="sourceLineNo">1776</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1776"></a>
+<span class="sourceLineNo">1777</span>        new BinaryComparator(emptyVal), delete);<a name="line.1777"></a>
+<span class="sourceLineNo">1778</span>    assertTrue(res);<a name="line.1778"></a>
+<span class="sourceLineNo">1779</span><a name="line.1779"></a>
+<span class="sourceLineNo">1780</span>    // checkAndPut looking for a null value<a name="line.1780"></a>
+<span class="sourceLineNo">1781</span>    put = new Put(row1);<a name="line.1781"></a>
+<span class="sourceLineNo">1782</span>    put.addColumn(fam1, qf1, val1);<a name="line.1782"></a>
+<span class="sourceLineNo">1783</span><a name="line.1783"></a>
+<span class="sourceLineNo">1784</span>    res = region<a name="line.1784"></a>
+<span class="sourceLineNo">1785</span>        .checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new NullComparator(), put);<a name="line.1785"></a>
+<span class="sourceLineNo">1786</span>    assertTrue(res);<a name="line.1786"></a>
+<span class="sourceLineNo">1787</span>  }<a name="line.1787"></a>
+<span class="sourceLineNo">1788</span><a name="line.1788"></a>
+<span class="sourceLineNo">1789</span>  @Test<a name="line.1789"></a>
+<span class="sourceLineNo">1790</span>  public void testCheckAndMutate_WithWrongValue() throws IOException {<a name="line.1790"></a>
+<span class="sourceLineNo">1791</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1791"></a>
+<span class="sourceLineNo">1792</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1792"></a>
+<span class="sourceLineNo">1793</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1793"></a>
+<span class="sourceLineNo">1794</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1794"></a>
+<span class="sourceLineNo">1795</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.1795"></a>
+<span class="sourceLineNo">1796</span>    BigDecimal bd1 = new BigDecimal(Double.MAX_VALUE);<a name="line.1796"></a>
+<span class="sourceLineNo">1797</span>    BigDecimal bd2 = new BigDecimal(Double.MIN_VALUE);<a name="line.1797"></a>
+<span class="sourceLineNo">1798</span><a name="line.1798"></a>
+<span class="sourceLineNo">1799</span>    // Setting up region<a name="line.1799"></a>
+<span class="sourceLineNo">1800</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.1800"></a>
+<span class="sourceLineNo">1801</span>    // Putting data in key<a name="line.1801"></a>
+<span class="sourceLineNo">1802</span>    Put put = new Put(row1);<a name="line.1802"></a>
+<span class="sourceLineNo">1803</span>    put.addColumn(fam1, qf1, val1);<a name="line.1803"></a>
+<span class="sourceLineNo">1804</span>    region.put(put);<a name="line.1804"></a>
+<span class="sourceLineNo">1805</span><a name="line.1805"></a>
+<span class="sourceLineNo">1806</span>    // checkAndPut with wrong value<a name="line.1806"></a>
+<span class="sourceLineNo">1807</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1807"></a>
+<span class="sourceLineNo">1808</span>        new BinaryComparator(val2), put);<a name="line.1808"></a>
+<span class="sourceLineNo">1809</span>    assertEquals(false, res);<a name="line.1809"></a>
+<span class="sourceLineNo">1810</span><a name="line.1810"></a>
+<span class="sourceLineNo">1811</span>    // checkAndDelete with wrong value<a name="line.1811"></a>
+<span class="sourceLineNo">1812</span>    Delete delete = new Delete(row1);<a name="line.1812"></a>
+<span class="sourceLineNo">1813</span>    delete.addFamily(fam1);<a name="line.1813"></a>
+<span class="sourceLineNo">1814</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1814"></a>
+<span class="sourceLineNo">1815</span>        new BinaryComparator(val2), put);<a name="line.1815"></a>
+<span class="sourceLineNo">1816</span>    assertEquals(false, res);<a name="line.1816"></a>
+<span class="sourceLineNo">1817</span><a name="line.1817"></a>
+<span class="sourceLineNo">1818</span>    // Putting data in key<a name="line.1818"></a>
+<span class="sourceLineNo">1819</span>    put = new Put(row1);<a name="line.1819"></a>
+<span class="sourceLineNo">1820</span>    put.addColumn(fam1, qf1, Bytes.toBytes(bd1));<a name="line.1820"></a>
+<span class="sourceLineNo">1821</span>    region.put(put);<a name="line.1821"></a>
+<span class="sourceLineNo">1822</span><a name="line.1822"></a>
+<span class="sourceLineNo">1823</span>    // checkAndPut with wrong value<a name="line.1823"></a>
+<span class="sourceLineNo">1824</span>    res =<a name="line.1824"></a>
+<span class="sourceLineNo">1825</span>        region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1825"></a>
+<span class="sourceLineNo">1826</span>            new BigDecimalComparator(bd2), put);<a name="line.1826"></a>
+<span class="sourceLineNo">1827</span>    assertEquals(false, res);<a name="line.1827"></a>
+<span class="sourceLineNo">1828</span><a name="line.1828"></a>
+<span class="sourceLineNo">1829</span>    // checkAndDelete with wrong value<a name="line.1829"></a>
+<span class="sourceLineNo">1830</span>    delete = new Delete(row1);<a name="line.1830"></a>
+<span class="sourceLineNo">1831</span>    delete.addFamily(fam1);<a name="line.1831"></a>
+<span class="sourceLineNo">1832</span>    res =<a name="line.1832"></a>
+<span class="sourceLineNo">1833</span>        region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1833"></a>
+<span class="sourceLineNo">1834</span>            new BigDecimalComparator(bd2), put);<a name="line.1834"></a>
+<span class="sourceLineNo">1835</span>    assertEquals(false, res);<a name="line.1835"></a>
+<span class="sourceLineNo">1836</span>  }<a name="line.1836"></a>
+<span class="sourceLineNo">1837</span><a name="line.1837"></a>
+<span class="sourceLineNo">1838</span>  @Test<a name="line.1838"></a>
+<span class="sourceLineNo">1839</span>  public void testCheckAndMutate_WithCorrectValue() throws IOException {<a name="line.1839"></a>
+<span class="sourceLineNo">1840</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1840"></a>
+<span class="sourceLineNo">1841</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1841"></a>
+<span class="sourceLineNo">1842</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1842"></a>
+<span class="sourceLineNo">1843</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1843"></a>
+<span class="sourceLineNo">1844</span>    BigDecimal bd1 = new BigDecimal(Double.MIN_VALUE);<a name="line.1844"></a>
+<span class="sourceLineNo">1845</span><a name="line.1845"></a>
+<span class="sourceLineNo">1846</span>    // Setting up region<a name="line.1846"></a>
+<span class="sourceLineNo">1847</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.1847"></a>
+<span class="sourceLineNo">1848</span>    // Putting data in key<a name="line.1848"></a>
+<span class="sourceLineNo">1849</span>    Put put = new Put(row1);<a name="line.1849"></a>
+<span class="sourceLineNo">1850</span>    put.addColumn(fam1, qf1, val1);<a name="line.1850"></a>
+<span class="sourceLineNo">1851</span>    region.put(put);<a name="line.1851"></a>
+<span class="sourceLineNo">1852</span><a name="line.1852"></a>
+<span class="sourceLineNo">1853</span>    // checkAndPut with correct value<a name="line.1853"></a>
+<span class="sourceLineNo">1854</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1854"></a>
+<span class="sourceLineNo">1855</span>        new BinaryComparator(val1), put);<a name="line.1855"></a>
+<span class="sourceLineNo">1856</span>    assertEquals(true, res);<a name="line.1856"></a>
+<span class="sourceLineNo">1857</span><a name="line.1857"></a>
+<span class="sourceLineNo">1858</span>    // checkAndDelete with correct value<a name="line.1858"></a>
+<span class="sourceLineNo">1859</span>    Delete delete = new Delete(row1);<a name="line.1859"></a>
+<span class="sourceLineNo">1860</span>    delete.addColumn(fam1, qf1);<a name="line.1860"></a>
+<span class="sourceLineNo">1861</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new BinaryComparator(val1),<a name="line.1861"></a>
+<span class="sourceLineNo">1862</span>        delete);<a name="line.1862"></a>
+<span class="sourceLineNo">1863</span>    assertEquals(true, res);<a name="line.1863"></a>
+<span class="sourceLineNo">1864</span><a name="line.1864"></a>
+<span class="sourceLineNo">1865</span>    // Putting data in key<a name="line.1865"></a>
+<span class="sourceLineNo">1866</span>    put = new Put(row1);<a name="line.1866"></a>
+<span class="sourceLineNo">1867</span>    put.addColumn(fam1, qf1, Bytes.toBytes(bd1));<a name="line.1867"></a>
+<span class="sourceLineNo">1868</span>    region.put(put);<a name="line.1868"></a>
+<span class="sourceLineNo">1869</span><a name="line.1869"></a>
+<span class="sourceLineNo">1870</span>    // checkAndPut with correct value<a name="line.1870"></a>
+<span class="sourceLineNo">1871</span>    res =<a name="line.1871"></a>
+<span class="sourceLineNo">1872</span>        region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new BigDecimalComparator(<a name="line.1872"></a>
+<span class="sourceLineNo">1873</span>            bd1), put);<a name="line.1873"></a>
+<span class="sourceLineNo">1874</span>    assertEquals(true, res);<a name="line.1874"></a>
+<span class="sourceLineNo">1875</span><a name="line.1875"></a>
+<span class="sourceLineNo">1876</span>    // checkAndDelete with correct value<a name="line.1876"></a>
+<span class="sourceLineNo">1877</span>    delete = new Delete(row1);<a name="line.1877"></a>
+<span class="sourceLineNo">1878</span>    delete.addColumn(fam1, qf1);<a name="line.1878"></a>
+<span class="sourceLineNo">1879</span>    res =<a name="line.1879"></a>
+<span class="sourceLineNo">1880</span>        region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new BigDecimalComparator(<a name="line.1880"></a>
+<span class="sourceLineNo">1881</span>            bd1), delete);<a name="line.1881"></a>
+<span class="sourceLineNo">1882</span>    assertEquals(true, res);<a name="line.1882"></a>
+<span class="sourceLineNo">1883</span>  }<a name="line.1883"></a>
+<span class="sourceLineNo">1884</span><a name="line.1884"></a>
+<span class="sourceLineNo">1885</span>  @Test<a name="line.1885"></a>
+<span class="sourceLineNo">1886</span>  public void testCheckAndMutate_WithNonEqualCompareOp() throws IOException {<a name="line.1886"></a>
+<span class="sourceLineNo">1887</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1887"></a>
+<span class="sourceLineNo">1888</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1888"></a>
+<span class="sourceLineNo">1889</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1889"></a>
+<span class="sourceLineNo">1890</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1890"></a>
+<span class="sourceLineNo">1891</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.1891"></a>
+<span class="sourceLineNo">1892</span>    byte[] val3 = Bytes.toBytes("value3");<a name="line.1892"></a>
+<span class="sourceLineNo">1893</span>    byte[] val4 = Bytes.toBytes("value4");<a name="line.1893"></a>
+<span class="sourceLineNo">1894</span><a name="line.1894"></a>
+<span class="sourceLineNo">1895</span>    // Setting up region<a name="line.1895"></a>
+<span class="sourceLineNo">1896</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.1896"></a>
+<span class="sourceLineNo">1897</span>    // Putting val3 in key<a name="line.1897"></a>
+<span class="sourceLineNo">1898</span>    Put put = new Put(row1);<a name="line.1898"></a>
+<span class="sourceLineNo">1899</span>    put.addColumn(fam1, qf1, val3);<a name="line.1899"></a>
+<span class="sourceLineNo">1900</span>    region.put(put);<a name="line.1900"></a>
+<span class="sourceLineNo">1901</span><a name="line.1901"></a>
+<span class="sourceLineNo">1902</span>    // Test CompareOp.LESS: original = val3, compare with val3, fail<a name="line.1902"></a>
+<span class="sourceLineNo">1903</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS,<a name="line.1903"></a>
+<span class="sourceLineNo">1904</span>        new BinaryComparator(val3), put);<a name="line.1904"></a>
+<span class="sourceLineNo">1905</span>    assertEquals(false, res);<a name="line.1905"></a>
+<span class="sourceLineNo">1906</span><a name="line.1906"></a>
+<span class="sourceLineNo">1907</span>    // Test CompareOp.LESS: original = val3, compare with val4, fail<a name="line.1907"></a>
+<span class="sourceLineNo">1908</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS,<a name="line.1908"></a>
+<span class="sourceLineNo">1909</span>        new BinaryComparator(val4), put);<a name="line.1909"></a>
+<span class="sourceLineNo">1910</span>    assertEquals(false, res);<a name="line.1910"></a>
+<span class="sourceLineNo">1911</span><a name="line.1911"></a>
+<span class="sourceLineNo">1912</span>    // Test CompareOp.LESS: original = val3, compare with val2,<a name="line.1912"></a>
+<span class="sourceLineNo">1913</span>    // succeed (now value = val2)<a name="line.1913"></a>
+<span class="sourceLineNo">1914</span>    put = new Put(row1);<a name="line.1914"></a>
+<span class="sourceLineNo">1915</span>    put.addColumn(fam1, qf1, val2);<a name="line.1915"></a>
+<span class="sourceLineNo">1916</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS,<a name="line.1916"></a>
+<span class="sourceLineNo">1917</span>        new BinaryComparator(val2), put);<a name="line.1917"></a>
+<span class="sourceLineNo">1918</span>    assertEquals(true, res);<a name="line.1918"></a>
+<span class="sourceLineNo">1919</span><a name="line.1919"></a>
+<span class="sourceLineNo">1920</span>    // Test CompareOp.LESS_OR_EQUAL: original = val2, compare with val3, fail<a name="line.1920"></a>
+<span class="sourceLineNo">1921</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS_OR_EQUAL,<a name="line.1921"></a>
+<span class="sourceLineNo">1922</span>        new BinaryComparator(val3), put);<a name="line.1922"></a>
+<span class="sourceLineNo">1923</span>    assertEquals(false, res);<a name="line.1923"></a>
+<span class="sourceLineNo">1924</span><a name="line.1924"></a>
+<span class="sourceLineNo">1925</span>    // Test CompareOp.LESS_OR_EQUAL: original = val2, compare with val2,<a name="line.1925"></a>
+<span class="sourceLineNo">1926</span>    // succeed (value still = val2)<a name="line.1926"></a>
+<span class="sourceLineNo">1927</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS_OR_EQUAL,<a name="line.1927"></a>
+<span class="sourceLineNo">1928</span>        new BinaryComparator(val2), put);<a name="line.1928"></a>
+<span class="sourceLineNo">1929</span>    assertEquals(true, res);<a name="line.1929"></a>
+<span class="sourceLineNo">1930</span><a name="line.1930"></a>
+<span class="sourceLineNo">1931</span>    // Test CompareOp.LESS_OR_EQUAL: original = val2, compare with val1,<a name="line.1931"></a>
+<span class="sourceLineNo">1932</span>    // succeed (now value = val3)<a name="line.1932"></a>
+<span class="sourceLineNo">1933</span>    put = new Put(row1);<a name="line.1933"></a>
+<span class="sourceLineNo">1934</span>    put.addColumn(fam1, qf1, val3);<a name="line.1934"></a>
+<span class="sourceLineNo">1935</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.LESS_OR_EQUAL,<a name="line.1935"></a>
+<span class="sourceLineNo">1936</span>        new BinaryComparator(val1), put);<a name="line.1936"></a>
+<span class="sourceLineNo">1937</span>    assertEquals(true, res);<a name="line.1937"></a>
+<span class="sourceLineNo">1938</span><a name="line.1938"></a>
+<span class="sourceLineNo">1939</span>    // Test CompareOp.GREATER: original = val3, compare with val3, fail<a name="line.1939"></a>
+<span class="sourceLineNo">1940</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER,<a name="line.1940"></a>
+<span class="sourceLineNo">1941</span>        new BinaryComparator(val3), put);<a name="line.1941"></a>
+<span class="sourceLineNo">1942</span>    assertEquals(false, res);<a name="line.1942"></a>
+<span class="sourceLineNo">1943</span><a name="line.1943"></a>
+<span class="sourceLineNo">1944</span>    // Test CompareOp.GREATER: original = val3, compare with val2, fail<a name="line.1944"></a>
+<span class="sourceLineNo">1945</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER,<a name="line.1945"></a>
+<span class="sourceLineNo">1946</span>        new BinaryComparator(val2), put);<a name="line.1946"></a>
+<span class="sourceLineNo">1947</span>    assertEquals(false, res);<a name="line.1947"></a>
+<span class="sourceLineNo">1948</span><a name="line.1948"></a>
+<span class="sourceLineNo">1949</span>    // Test CompareOp.GREATER: original = val3, compare with val4,<a name="line.1949"></a>
+<span class="sourceLineNo">1950</span>    // succeed (now value = val2)<a name="line.1950"></a>
+<span class="sourceLineNo">1951</span>    put = new Put(row1);<a name="line.1951"></a>
+<span class="sourceLineNo">1952</span>    put.addColumn(fam1, qf1, val2);<a name="line.1952"></a>
+<span class="sourceLineNo">1953</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER,<a name="line.1953"></a>
+<span class="sourceLineNo">1954</span>        new BinaryComparator(val4), put);<a name="line.1954"></a>
+<span class="sourceLineNo">1955</span>    assertEquals(true, res);<a name="line.1955"></a>
+<span class="sourceLineNo">1956</span><a name="line.1956"></a>
+<span class="sourceLineNo">1957</span>    // Test CompareOp.GREATER_OR_EQUAL: original = val2, compare with val1, fail<a name="line.1957"></a>
+<span class="sourceLineNo">1958</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER_OR_EQUAL,<a name="line.1958"></a>
+<span class="sourceLineNo">1959</span>        new BinaryComparator(val1), put);<a name="line.1959"></a>
+<span class="sourceLineNo">1960</span>    assertEquals(false, res);<a name="line.1960"></a>
+<span class="sourceLineNo">1961</span><a name="line.1961"></a>
+<span class="sourceLineNo">1962</span>    // Test CompareOp.GREATER_OR_EQUAL: original = val2, compare with val2,<a name="line.1962"></a>
+<span class="sourceLineNo">1963</span>    // succeed (value still = val2)<a name="line.1963"></a>
+<span class="sourceLineNo">1964</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER_OR_EQUAL,<a name="line.1964"></a>
+<span class="sourceLineNo">1965</span>        new BinaryComparator(val2), put);<a name="line.1965"></a>
+<span class="sourceLineNo">1966</span>    assertEquals(true, res);<a name="line.1966"></a>
+<span class="sourceLineNo">1967</span><a name="line.1967"></a>
+<span class="sourceLineNo">1968</span>    // Test CompareOp.GREATER_OR_EQUAL: original = val2, compare with val3, succeed<a name="line.1968"></a>
+<span class="sourceLineNo">1969</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.GREATER_OR_EQUAL,<a name="line.1969"></a>
+<span class="sourceLineNo">1970</span>        new BinaryComparator(val3), put);<a name="line.1970"></a>
+<span class="sourceLineNo">1971</span>    assertEquals(true, res);<a name="line.1971"></a>
+<span class="sourceLineNo">1972</span>  }<a name="line.1972"></a>
+<span class="sourceLineNo">1973</span><a name="line.1973"></a>
+<span class="sourceLineNo">1974</span>  @Test<a name="line.1974"></a>
+<span class="sourceLineNo">1975</span>  public void testCheckAndPut_ThatPutWasWritten() throws IOException {<a name="line.1975"></a>
+<span class="sourceLineNo">1976</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.1976"></a>
+<span class="sourceLineNo">1977</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.1977"></a>
+<span class="sourceLineNo">1978</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.1978"></a>
+<span class="sourceLineNo">1979</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.1979"></a>
+<span class="sourceLineNo">1980</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.1980"></a>
+<span class="sourceLineNo">1981</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.1981"></a>
+<span class="sourceLineNo">1982</span><a name="line.1982"></a>
+<span class="sourceLineNo">1983</span>    byte[][] families = { fam1, fam2 };<a name="line.1983"></a>
+<span class="sourceLineNo">1984</span><a name="line.1984"></a>
+<span class="sourceLineNo">1985</span>    // Setting up region<a name="line.1985"></a>
+<span class="sourceLineNo">1986</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.1986"></a>
+<span class="sourceLineNo">1987</span>    // Putting data in the key to check<a name="line.1987"></a>
+<span class="sourceLineNo">1988</span>    Put put = new Put(row1);<a name="line.1988"></a>
+<span class="sourceLineNo">1989</span>    put.addColumn(fam1, qf1, val1);<a name="line.1989"></a>
+<span class="sourceLineNo">1990</span>    region.put(put);<a name="line.1990"></a>
+<span class="sourceLineNo">1991</span><a name="line.1991"></a>
+<span class="sourceLineNo">1992</span>    // Creating put to add<a name="line.1992"></a>
+<span class="sourceLineNo">1993</span>    long ts = System.currentTimeMillis();<a name="line.1993"></a>
+<span class="sourceLineNo">1994</span>    KeyValue kv = new KeyValue(row1, fam2, qf1, ts, KeyValue.Type.Put, val2);<a name="line.1994"></a>
+<span class="sourceLineNo">1995</span>    put = new Put(row1);<a name="line.1995"></a>
+<span class="sourceLineNo">1996</span>    put.add(kv);<a name="line.1996"></a>
+<span class="sourceLineNo">1997</span><a name="line.1997"></a>
+<span class="sourceLineNo">1998</span>    // checkAndPut with wrong value<a name="line.1998"></a>
+<span class="sourceLineNo">1999</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.1999"></a>
+<span class="sourceLineNo">2000</span>        new BinaryComparator(val1), put);<a name="line.2000"></a>
+<span class="sourceLineNo">2001</span>    assertEquals(true, res);<a name="line.2001"></a>
+<span class="sourceLineNo">2002</span><a name="line.2002"></a>
+<span class="sourceLineNo">2003</span>    Get get = new Get(row1);<a name="line.2003"></a>
+<span class="sourceLineNo">2004</span>    get.addColumn(fam2, qf1);<a name="line.2004"></a>
+<span class="sourceLineNo">2005</span>    Cell[] actual = region.get(get).rawCells();<a name="line.2005"></a>
+<span class="sourceLineNo">2006</span><a name="line.2006"></a>
+<span class="sourceLineNo">2007</span>    Cell[] expected = { kv };<a name="line.2007"></a>
+<span class="sourceLineNo">2008</span><a name="line.2008"></a>
+<span class="sourceLineNo">2009</span>    assertEquals(expected.length, actual.length);<a name="line.2009"></a>
+<span class="sourceLineNo">2010</span>    for (int i = 0; i &lt; actual.length; i++) {<a name="line.2010"></a>
+<span class="sourceLineNo">2011</span>      assertEquals(expected[i], actual[i]);<a name="line.2011"></a>
+<span class="sourceLineNo">2012</span>    }<a name="line.2012"></a>
+<span class="sourceLineNo">2013</span>  }<a name="line.2013"></a>
+<span class="sourceLineNo">2014</span><a name="line.2014"></a>
+<span class="sourceLineNo">2015</span>  @Test<a name="line.2015"></a>
+<span class="sourceLineNo">2016</span>  public void testCheckAndPut_wrongRowInPut() throws IOException {<a name="line.2016"></a>
+<span class="sourceLineNo">2017</span>    this.region = initHRegion(tableName, method, CONF, COLUMNS);<a name="line.2017"></a>
+<span class="sourceLineNo">2018</span>    Put put = new Put(row2);<a name="line.2018"></a>
+<span class="sourceLineNo">2019</span>    put.addColumn(fam1, qual1, value1);<a name="line.2019"></a>
+<span class="sourceLineNo">2020</span>    try {<a name="line.2020"></a>
+<span class="sourceLineNo">2021</span>      region.checkAndMutate(row, fam1, qual1, CompareOperator.EQUAL,<a name="line.2021"></a>
+<span class="sourceLineNo">2022</span>          new BinaryComparator(value2), put);<a name="line.2022"></a>
+<span class="sourceLineNo">2023</span>      fail();<a name="line.2023"></a>
+<span class="sourceLineNo">2024</span>    } catch (org.apache.hadoop.hbase.DoNotRetryIOException expected) {<a name="line.2024"></a>
+<span class="sourceLineNo">2025</span>      // expected exception.<a name="line.2025"></a>
+<span class="sourceLineNo">2026</span>    }<a name="line.2026"></a>
+<span class="sourceLineNo">2027</span>  }<a name="line.2027"></a>
+<span class="sourceLineNo">2028</span><a name="line.2028"></a>
+<span class="sourceLineNo">2029</span>  @Test<a name="line.2029"></a>
+<span class="sourceLineNo">2030</span>  public void testCheckAndDelete_ThatDeleteWasWritten() throws IOException {<a name="line.2030"></a>
+<span class="sourceLineNo">2031</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2031"></a>
+<span class="sourceLineNo">2032</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2032"></a>
+<span class="sourceLineNo">2033</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2033"></a>
+<span class="sourceLineNo">2034</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.2034"></a>
+<span class="sourceLineNo">2035</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.2035"></a>
+<span class="sourceLineNo">2036</span>    byte[] qf3 = Bytes.toBytes("qualifier3");<a name="line.2036"></a>
+<span class="sourceLineNo">2037</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.2037"></a>
+<span class="sourceLineNo">2038</span>    byte[] val2 = Bytes.toBytes("value2");<a name="line.2038"></a>
+<span class="sourceLineNo">2039</span>    byte[] val3 = Bytes.toBytes("value3");<a name="line.2039"></a>
+<span class="sourceLineNo">2040</span>    byte[] emptyVal = new byte[] {};<a name="line.2040"></a>
+<span class="sourceLineNo">2041</span><a name="line.2041"></a>
+<span class="sourceLineNo">2042</span>    byte[][] families = { fam1, fam2 };<a name="line.2042"></a>
+<span class="sourceLineNo">2043</span><a name="line.2043"></a>
+<span class="sourceLineNo">2044</span>    // Setting up region<a name="line.2044"></a>
+<span class="sourceLineNo">2045</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2045"></a>
+<span class="sourceLineNo">2046</span>    // Put content<a name="line.2046"></a>
+<span class="sourceLineNo">2047</span>    Put put = new Put(row1);<a name="line.2047"></a>
+<span class="sourceLineNo">2048</span>    put.addColumn(fam1, qf1, val1);<a name="line.2048"></a>
+<span class="sourceLineNo">2049</span>    region.put(put);<a name="line.2049"></a>
+<span class="sourceLineNo">2050</span>    Threads.sleep(2);<a name="line.2050"></a>
+<span class="sourceLineNo">2051</span><a name="line.2051"></a>
+<span class="sourceLineNo">2052</span>    put = new Put(row1);<a name="line.2052"></a>
+<span class="sourceLineNo">2053</span>    put.addColumn(fam1, qf1, val2);<a name="line.2053"></a>
+<span class="sourceLineNo">2054</span>    put.addColumn(fam2, qf1, val3);<a name="line.2054"></a>
+<span class="sourceLineNo">2055</span>    put.addColumn(fam2, qf2, val2);<a name="line.2055"></a>
+<span class="sourceLineNo">2056</span>    put.addColumn(fam2, qf3, val1);<a name="line.2056"></a>
+<span class="sourceLineNo">2057</span>    put.addColumn(fam1, qf3, val1);<a name="line.2057"></a>
+<span class="sourceLineNo">2058</span>    region.put(put);<a name="line.2058"></a>
+<span class="sourceLineNo">2059</span><a name="line.2059"></a>
+<span class="sourceLineNo">2060</span>    // Multi-column delete<a name="line.2060"></a>
+<span class="sourceLineNo">2061</span>    Delete delete = new Delete(row1);<a name="line.2061"></a>
+<span class="sourceLineNo">2062</span>    delete.addColumn(fam1, qf1);<a name="line.2062"></a>
+<span class="sourceLineNo">2063</span>    delete.addColumn(fam2, qf1);<a name="line.2063"></a>
+<span class="sourceLineNo">2064</span>    delete.addColumn(fam1, qf3);<a name="line.2064"></a>
+<span class="sourceLineNo">2065</span>    boolean res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL,<a name="line.2065"></a>
+<span class="sourceLineNo">2066</span>        new BinaryComparator(val2), delete);<a name="line.2066"></a>
+<span class="sourceLineNo">2067</span>    assertEquals(true, res);<a name="line.2067"></a>
+<span class="sourceLineNo">2068</span><a name="line.2068"></a>
+<span class="sourceLineNo">2069</span>    Get get = new Get(row1);<a name="line.2069"></a>
+<span class="sourceLineNo">2070</span>    get.addColumn(fam1, qf1);<a name="line.2070"></a>
+<span class="sourceLineNo">2071</span>    get.addColumn(fam1, qf3);<a name="line.2071"></a>
+<span class="sourceLineNo">2072</span>    get.addColumn(fam2, qf2);<a name="line.2072"></a>
+<span class="sourceLineNo">2073</span>    Result r = region.get(get);<a name="line.2073"></a>
+<span class="sourceLineNo">2074</span>    assertEquals(2, r.size());<a name="line.2074"></a>
+<span class="sourceLineNo">2075</span>    assertArrayEquals(val1, r.getValue(fam1, qf1));<a name="line.2075"></a>
+<span class="sourceLineNo">2076</span>    assertArrayEquals(val2, r.getValue(fam2, qf2));<a name="line.2076"></a>
+<span class="sourceLineNo">2077</span><a name="line.2077"></a>
+<span class="sourceLineNo">2078</span>    // Family delete<a name="line.2078"></a>
+<span class="sourceLineNo">2079</span>    delete = new Delete(row1);<a name="line.2079"></a>
+<span class="sourceLineNo">2080</span>    delete.addFamily(fam2);<a name="line.2080"></a>
+<span class="sourceLineNo">2081</span>    res = region.checkAndMutate(row1, fam2, qf1, CompareOperator.EQUAL,<a name="line.2081"></a>
+<span class="sourceLineNo">2082</span>        new BinaryComparator(emptyVal), delete);<a name="line.2082"></a>
+<span class="sourceLineNo">2083</span>    assertEquals(true, res);<a name="line.2083"></a>
+<span class="sourceLineNo">2084</span><a name="line.2084"></a>
+<span class="sourceLineNo">2085</span>    get = new Get(row1);<a name="line.2085"></a>
+<span class="sourceLineNo">2086</span>    r = region.get(get);<a name="line.2086"></a>
+<span class="sourceLineNo">2087</span>    assertEquals(1, r.size());<a name="line.2087"></a>
+<span class="sourceLineNo">2088</span>    assertArrayEquals(val1, r.getValue(fam1, qf1));<a name="line.2088"></a>
+<span class="sourceLineNo">2089</span><a name="line.2089"></a>
+<span class="sourceLineNo">2090</span>    // Row delete<a name="line.2090"></a>
+<span class="sourceLineNo">2091</span>    delete = new Delete(row1);<a name="line.2091"></a>
+<span class="sourceLineNo">2092</span>    res = region.checkAndMutate(row1, fam1, qf1, CompareOperator.EQUAL, new BinaryComparator(val1),<a name="line.2092"></a>
+<span class="sourceLineNo">2093</span>        delete);<a name="line.2093"></a>
+<span class="sourceLineNo">2094</span>    assertEquals(true, res);<a name="line.2094"></a>
+<span class="sourceLineNo">2095</span>    get = new Get(row1);<a name="line.2095"></a>
+<span class="sourceLineNo">2096</span>    r = region.get(get);<a name="line.2096"></a>
+<span class="sourceLineNo">2097</span>    assertEquals(0, r.size());<a name="line.2097"></a>
+<span class="sourceLineNo">2098</span>  }<a name="line.2098"></a>
+<span class="sourceLineNo">2099</span><a name="line.2099"></a>
+<span class="sourceLineNo">2100</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2100"></a>
+<span class="sourceLineNo">2101</span>  // Delete tests<a name="line.2101"></a>
+<span class="sourceLineNo">2102</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2102"></a>
+<span class="sourceLineNo">2103</span>  @Test<a name="line.2103"></a>
+<span class="sourceLineNo">2104</span>  public void testDelete_multiDeleteColumn() throws IOException {<a name="line.2104"></a>
+<span class="sourceLineNo">2105</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2105"></a>
+<span class="sourceLineNo">2106</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2106"></a>
+<span class="sourceLineNo">2107</span>    byte[] qual = Bytes.toBytes("qualifier");<a name="line.2107"></a>
+<span class="sourceLineNo">2108</span>    byte[] value = Bytes.toBytes("value");<a name="line.2108"></a>
+<span class="sourceLineNo">2109</span><a name="line.2109"></a>
+<span class="sourceLineNo">2110</span>    Put put = new Put(row1);<a name="line.2110"></a>
+<span class="sourceLineNo">2111</span>    put.addColumn(fam1, qual, 1, value);<a name="line.2111"></a>
+<span class="sourceLineNo">2112</span>    put.addColumn(fam1, qual, 2, value);<a name="line.2112"></a>
+<span class="sourceLineNo">2113</span><a name="line.2113"></a>
+<span class="sourceLineNo">2114</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2114"></a>
+<span class="sourceLineNo">2115</span>    region.put(put);<a name="line.2115"></a>
+<span class="sourceLineNo">2116</span><a name="line.2116"></a>
+<span class="sourceLineNo">2117</span>    // We do support deleting more than 1 'latest' version<a name="line.2117"></a>
+<span class="sourceLineNo">2118</span>    Delete delete = new Delete(row1);<a name="line.2118"></a>
 <span class="sourceLineNo">2119</span>    delete.addColumn(fam1, qual);<a name="line.2119"></a>
-<span class="sourceLineNo">2120</span>    region.delete(delete);<a name="line.2120"></a>
-<span class="sourceLineNo">2121</span><a name="line.2121"></a>
-<span class="sourceLineNo">2122</span>    Get get = new Get(row1);<a name="line.2122"></a>
-<span class="sourceLineNo">2123</span>    get.addFamily(fam1);<a name="line.2123"></a>
-<span class="sourceLineNo">2124</span>    Result r = region.get(get);<a name="line.2124"></a>
-<span class="sourceLineNo">2125</span>    assertEquals(0, r.size());<a name="line.2125"></a>
-<span class="sourceLineNo">2126</span>  }<a name="line.2126"></a>
-<span class="sourceLineNo">2127</span><a name="line.2127"></a>
-<span class="sourceLineNo">2128</span>  @Test<a name="line.2128"></a>
-<span class="sourceLineNo">2129</span>  public void testDelete_CheckFamily() throws IOException {<a name="line.2129"></a>
-<span class="sourceLineNo">2130</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2130"></a>
-<span class="sourceLineNo">2131</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2131"></a>
-<span class="sourceLineNo">2132</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2132"></a>
-<span class="sourceLineNo">2133</span>    byte[] fam3 = Bytes.toBytes("fam3");<a name="line.2133"></a>
-<span class="sourceLineNo">2134</span>    byte[] fam4 = Bytes.toBytes("fam4");<a name="line.2134"></a>
-<span class="sourceLineNo">2135</span><a name="line.2135"></a>
-<span class="sourceLineNo">2136</span>    // Setting up region<a name="line.2136"></a>
-<span class="sourceLineNo">2137</span>    this.region = initHRegion(tableName, method, CONF, fam1, fam2, fam3);<a name="line.2137"></a>
-<span class="sourceLineNo">2138</span>    List&lt;Cell&gt; kvs = new ArrayList&lt;&gt;();<a name="line.2138"></a>
-<span class="sourceLineNo">2139</span>    kvs.add(new KeyValue(row1, fam4, null, null));<a name="line.2139"></a>
-<span class="sourceLineNo">2140</span><a name="line.2140"></a>
-<span class="sourceLineNo">2141</span>    // testing existing family<a name="line.2141"></a>
-<span class="sourceLineNo">2142</span>    byte[] family = fam2;<a name="line.2142"></a>
-<span class="sourceLineNo">2143</span>    NavigableMap&lt;byte[], List&lt;Cell&gt;&gt; deleteMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2143"></a>
-<span class="sourceLineNo">2144</span>    deleteMap.put(family, kvs);<a name="line.2144"></a>
-<span class="sourceLineNo">2145</span>    region.delete(deleteMap, Durability.SYNC_WAL);<a name="line.2145"></a>
-<span class="sourceLineNo">2146</span><a name="line.2146"></a>
-<span class="sourceLineNo">2147</span>    // testing non existing family<a name="line.2147"></a>
-<span class="sourceLineNo">2148</span>    boolean ok = false;<a name="line.2148"></a>
-<span class="sourceLineNo">2149</span>    family = fam4;<a name="line.2149"></a>
-<span class="sourceLineNo">2150</span>    try {<a name="line.2150"></a>
-<span class="sourceLineNo">2151</span>      deleteMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2151"></a>
-<span class="sourceLineNo">2152</span>      deleteMap.put(family, kvs);<a name="line.2152"></a>
-<span class="sourceLineNo">2153</span>      region.delete(deleteMap, Durability.SYNC_WAL);<a name="line.2153"></a>
-<span class="sourceLineNo">2154</span>    } catch (Exception e) {<a name="line.2154"></a>
-<span class="sourceLineNo">2155</span>      ok = true;<a name="line.2155"></a>
-<span class="sourceLineNo">2156</span>    }<a name="line.2156"></a>
-<span class="sourceLineNo">2157</span>    assertTrue("Family " + new String(family, StandardCharsets.UTF_8) + " does exist", ok);<a name="line.2157"></a>
-<span class="sourceLineNo">2158</span>  }<a name="line.2158"></a>
-<span class="sourceLineNo">2159</span><a name="line.2159"></a>
-<span class="sourceLineNo">2160</span>  @Test<a name="line.2160"></a>
-<span class="sourceLineNo">2161</span>  public void testDelete_mixed() throws IOException, InterruptedException {<a name="line.2161"></a>
-<span class="sourceLineNo">2162</span>    byte[] fam = Bytes.toBytes("info");<a name="line.2162"></a>
-<span class="sourceLineNo">2163</span>    byte[][] families = { fam };<a name="line.2163"></a>
-<span class="sourceLineNo">2164</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2164"></a>
-<span class="sourceLineNo">2165</span>    EnvironmentEdgeManagerTestHelper.injectEdge(new IncrementingEnvironmentEdge());<a name="line.2165"></a>
-<span class="sourceLineNo">2166</span><a name="line.2166"></a>
-<span class="sourceLineNo">2167</span>    byte[] row = Bytes.toBytes("table_name");<a name="line.2167"></a>
-<span class="sourceLineNo">2168</span>    // column names<a name="line.2168"></a>
-<span class="sourceLineNo">2169</span>    byte[] serverinfo = Bytes.toBytes("serverinfo");<a name="line.2169"></a>
-<span class="sourceLineNo">2170</span>    byte[] splitA = Bytes.toBytes("splitA");<a name="line.2170"></a>
-<span class="sourceLineNo">2171</span>    byte[] splitB = Bytes.toBytes("splitB");<a name="line.2171"></a>
-<span class="sourceLineNo">2172</span><a name="line.2172"></a>
-<span class="sourceLineNo">2173</span>    // add some data:<a name="line.2173"></a>
-<span class="sourceLineNo">2174</span>    Put put = new Put(row);<a name="line.2174"></a>
-<span class="sourceLineNo">2175</span>    put.addColumn(fam, splitA, Bytes.toBytes("reference_A"));<a name="line.2175"></a>
-<span class="sourceLineNo">2176</span>    region.put(put);<a name="line.2176"></a>
-<span class="sourceLineNo">2177</span><a name="line.2177"></a>
-<span class="sourceLineNo">2178</span>    put = new Put(row);<a name="line.2178"></a>
-<span class="sourceLineNo">2179</span>    put.addColumn(fam, splitB, Bytes.toBytes("reference_B"));<a name="line.2179"></a>
-<span class="sourceLineNo">2180</span>    region.put(put);<a name="line.2180"></a>
-<span class="sourceLineNo">2181</span><a name="line.2181"></a>
-<span class="sourceLineNo">2182</span>    put = new Put(row);<a name="line.2182"></a>
-<span class="sourceLineNo">2183</span>    put.addColumn(fam, serverinfo, Bytes.toBytes("ip_address"));<a name="line.2183"></a>
-<span class="sourceLineNo">2184</span>    region.put(put);<a name="line.2184"></a>
-<span class="sourceLineNo">2185</span><a name="line.2185"></a>
-<span class="sourceLineNo">2186</span>    // ok now delete a split:<a name="line.2186"></a>
-<span class="sourceLineNo">2187</span>    Delete delete = new Delete(row);<a name="line.2187"></a>
-<span class="sourceLineNo">2188</span>    delete.addColumns(fam, splitA);<a name="line.2188"></a>
-<span class="sourceLineNo">2189</span>    region.delete(delete);<a name="line.2189"></a>
-<span class="sourceLineNo">2190</span><a name="line.2190"></a>
-<span class="sourceLineNo">2191</span>    // assert some things:<a name="line.2191"></a>
-<span class="sourceLineNo">2192</span>    Get get = new Get(row).addColumn(fam, serverinfo);<a name="line.2192"></a>
-<span class="sourceLineNo">2193</span>    Result result = region.get(get);<a name="line.2193"></a>
-<span class="sourceLineNo">2194</span>    assertEquals(1, result.size());<a name="line.2194"></a>
-<span class="sourceLineNo">2195</span><a name="line.2195"></a>
-<span class="sourceLineNo">2196</span>    get = new Get(row).addColumn(fam, splitA);<a name="line.2196"></a>
-<span class="sourceLineNo">2197</span>    result = region.get(get);<a name="line.2197"></a>
-<span class="sourceLineNo">2198</span>    assertEquals(0, result.size());<a name="line.2198"></a>
-<span class="sourceLineNo">2199</span><a name="line.2199"></a>
-<span class="sourceLineNo">2200</span>    get = new Get(row).addColumn(fam, splitB);<a name="line.2200"></a>
-<span class="sourceLineNo">2201</span>    result = region.get(get);<a name="line.2201"></a>
-<span class="sourceLineNo">2202</span>    assertEquals(1, result.size());<a name="line.2202"></a>
-<span class="sourceLineNo">2203</span><a name="line.2203"></a>
-<span class="sourceLineNo">2204</span>    // Assert that after a delete, I can put.<a name="line.2204"></a>
-<span class="sourceLineNo">2205</span>    put = new Put(row);<a name="line.2205"></a>
-<span class="sourceLineNo">2206</span>    put.addColumn(fam, splitA, Bytes.toBytes("reference_A"));<a name="line.2206"></a>
-<span class="sourceLineNo">2207</span>    region.put(put);<a name="line.2207"></a>
-<span class="sourceLineNo">2208</span>    get = new Get(row);<a name="line.2208"></a>
-<span class="sourceLineNo">2209</span>    result = region.get(get);<a name="line.2209"></a>
-<span class="sourceLineNo">2210</span>    assertEquals(3, result.size());<a name="line.2210"></a>
-<span class="sourceLineNo">2211</span><a name="line.2211"></a>
-<span class="sourceLineNo">2212</span>    // Now delete all... then test I can add stuff back<a name="line.2212"></a>
-<span class="sourceLineNo">2213</span>    delete = new Delete(row);<a name="line.2213"></a>
-<span class="sourceLineNo">2214</span>    region.delete(delete);<a name="line.2214"></a>
-<span class="sourceLineNo">2215</span>    assertEquals(0, region.get(get).size());<a name="line.2215"></a>
-<span class="sourceLineNo">2216</span><a name="line.2216"></a>
-<span class="sourceLineNo">2217</span>    region.put(new Put(row).addColumn(fam, splitA, Bytes.toBytes("reference_A")));<a name="line.2217"></a>
-<span class="sourceLineNo">2218</span>    result = region.get(get);<a name="line.2218"></a>
-<span class="sourceLineNo">2219</span>    assertEquals(1, result.size());<a name="line.2219"></a>
-<span class="sourceLineNo">2220</span>  }<a name="line.2220"></a>
-<span class="sourceLineNo">2221</span><a name="line.2221"></a>
-<span class="sourceLineNo">2222</span>  @Test<a name="line.2222"></a>
-<span class="sourceLineNo">2223</span>  public void testDeleteRowWithFutureTs() throws IOException {<a name="line.2223"></a>
-<span class="sourceLineNo">2224</span>    byte[] fam = Bytes.toBytes("info");<a name="line.2224"></a>
-<span class="sourceLineNo">2225</span>    byte[][] families = { fam };<a name="line.2225"></a>
-<span class="sourceLineNo">2226</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2226"></a>
-<span class="sourceLineNo">2227</span>    byte[] row = Bytes.toBytes("table_name");<a name="line.2227"></a>
-<span class="sourceLineNo">2228</span>    // column names<a name="line.2228"></a>
-<span class="sourceLineNo">2229</span>    byte[] serverinfo = Bytes.toBytes("serverinfo");<a name="line.2229"></a>
-<span class="sourceLineNo">2230</span><a name="line.2230"></a>
-<span class="sourceLineNo">2231</span>    // add data in the far future<a name="line.2231"></a>
-<span class="sourceLineNo">2232</span>    Put put = new Put(row);<a name="line.2232"></a>
-<span class="sourceLineNo">2233</span>    put.addColumn(fam, serverinfo, HConstants.LATEST_TIMESTAMP - 5, Bytes.toBytes("value"));<a name="line.2233"></a>
-<span class="sourceLineNo">2234</span>    region.put(put);<a name="line.2234"></a>
-<span class="sourceLineNo">2235</span><a name="line.2235"></a>
-<span class="sourceLineNo">2236</span>    // now delete something in the present<a name="line.2236"></a>
-<span class="sourceLineNo">2237</span>    Delete delete = new Delete(row);<a name="line.2237"></a>
-<span class="sourceLineNo">2238</span>    region.delete(delete);<a name="line.2238"></a>
-<span class="sourceLineNo">2239</span><a name="line.2239"></a>
-<span class="sourceLineNo">2240</span>    // make sure we still see our data<a name="line.2240"></a>
-<span class="sourceLineNo">2241</span>    Get get = new Get(row).addColumn(fam, serverinfo);<a name="line.2241"></a>
-<span class="sourceLineNo">2242</span>    Result result = region.get(get);<a name="line.2242"></a>
-<span class="sourceLineNo">2243</span>    assertEquals(1, result.size());<a name="line.2243"></a>
-<span class="sourceLineNo">2244</span><a name="line.2244"></a>
-<span class="sourceLineNo">2245</span>    // delete the future row<a name="line.2245"></a>
-<span class="sourceLineNo">2246</span>    delete = new Delete(row, HConstants.LATEST_TIMESTAMP - 3);<a name="line.2246"></a>
-<span class="sourceLineNo">2247</span>    region.delete(delete);<a name="line.2247"></a>
-<span class="sourceLineNo">2248</span><a name="line.2248"></a>
-<span class="sourceLineNo">2249</span>    // make sure it is gone<a name="line.2249"></a>
-<span class="sourceLineNo">2250</span>    get = new Get(row).addColumn(fam, serverinfo);<a name="line.2250"></a>
-<span class="sourceLineNo">2251</span>    result = region.get(get);<a name="line.2251"></a>
-<span class="sourceLineNo">2252</span>    assertEquals(0, result.size());<a name="line.2252"></a>
-<span class="sourceLineNo">2253</span>  }<a name="line.2253"></a>
-<span class="sourceLineNo">2254</span><a name="line.2254"></a>
-<span class="sourceLineNo">2255</span>  /**<a name="line.2255"></a>
-<span class="sourceLineNo">2256</span>   * Tests that the special LATEST_TIMESTAMP option for puts gets replaced by<a name="line.2256"></a>
-<span class="sourceLineNo">2257</span>   * the actual timestamp<a name="line.2257"></a>
-<span class="sourceLineNo">2258</span>   */<a name="line.2258"></a>
-<span class="sourceLineNo">2259</span>  @Test<a name="line.2259"></a>
-<span class="sourceLineNo">2260</span>  public void testPutWithLatestTS() throws IOException {<a name="line.2260"></a>
-<span class="sourceLineNo">2261</span>    byte[] fam = Bytes.toBytes("info");<a name="line.2261"></a>
-<span class="sourceLineNo">2262</span>    byte[][] families = { fam };<a name="line.2262"></a>
-<span class="sourceLineNo">2263</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2263"></a>
-<span class="sourceLineNo">2264</span>    byte[] row = Bytes.toBytes("row1");<a name="line.2264"></a>
-<span class="sourceLineNo">2265</span>    // column names<a name="line.2265"></a>
-<span class="sourceLineNo">2266</span>    byte[] qual = Bytes.toBytes("qual");<a name="line.2266"></a>
-<span class="sourceLineNo">2267</span><a name="line.2267"></a>
-<span class="sourceLineNo">2268</span>    // add data with LATEST_TIMESTAMP, put without WAL<a name="line.2268"></a>
-<span class="sourceLineNo">2269</span>    Put put = new Put(row);<a name="line.2269"></a>
-<span class="sourceLineNo">2270</span>    put.addColumn(fam, qual, HConstants.LATEST_TIMESTAMP, Bytes.toBytes("value"));<a name="line.2270"></a>
-<span class="sourceLineNo">2271</span>    region.put(put);<a name="line.2271"></a>
-<span class="sourceLineNo">2272</span><a name="line.2272"></a>
-<span class="sourceLineNo">2273</span>    // Make sure it shows up with an actual timestamp<a name="line.2273"></a>
-<span class="sourceLineNo">2274</span>    Get get = new Get(row).addColumn(fam, qual);<a name="line.2274"></a>
-<span class="sourceLineNo">2275</span>    Result result = region.get(get);<a name="line.2275"></a>
-<span class="sourceLineNo">2276</span>    assertEquals(1, result.size());<a name="line.2276"></a>
-<span class="sourceLineNo">2277</span>    Cell kv = result.rawCells()[0];<a name="line.2277"></a>
-<span class="sourceLineNo">2278</span>    LOG.info("Got: " + kv);<a name="line.2278"></a>
-<span class="sourceLineNo">2279</span>    assertTrue("LATEST_TIMESTAMP was not replaced with real timestamp",<a name="line.2279"></a>
-<span class="sourceLineNo">2280</span>        kv.getTimestamp() != HConstants.LATEST_TIMESTAMP);<a name="line.2280"></a>
-<span class="sourceLineNo">2281</span><a name="line.2281"></a>
-<span class="sourceLineNo">2282</span>    // Check same with WAL enabled (historically these took different<a name="line.2282"></a>
-<span class="sourceLineNo">2283</span>    // code paths, so check both)<a name="line.2283"></a>
-<span class="sourceLineNo">2284</span>    row = Bytes.toBytes("row2");<a name="line.2284"></a>
-<span class="sourceLineNo">2285</span>    put = new Put(row);<a name="line.2285"></a>
-<span class="sourceLineNo">2286</span>    put.addColumn(fam, qual, HConstants.LATEST_TIMESTAMP, Bytes.toBytes("value"));<a name="line.2286"></a>
-<span class="sourceLineNo">2287</span>    region.put(put);<a name="line.2287"></a>
-<span class="sourceLineNo">2288</span><a name="line.2288"></a>
-<span class="sourceLineNo">2289</span>    // Make sure it shows up with an actual timestamp<a name="line.2289"></a>
-<span class="sourceLineNo">2290</span>    get = new Get(row).addColumn(fam, qual);<a name="line.2290"></a>
-<span class="sourceLineNo">2291</span>    result = region.get(get);<a name="line.2291"></a>
-<span class="sourceLineNo">2292</span>    assertEquals(1, result.size());<a name="line.2292"></a>
-<span class="sourceLineNo">2293</span>    kv = result.rawCells()[0];<a name="line.2293"></a>
-<span class="sourceLineNo">2294</span>    LOG.info("Got: " + kv);<a name="line.2294"></a>
-<span class="sourceLineNo">2295</span>    assertTrue("LATEST_TIMESTAMP was not replaced with real timestamp",<a name="line.2295"></a>
-<span class="sourceLineNo">2296</span>        kv.getTimestamp() != HConstants.LATEST_TIMESTAMP);<a name="line.2296"></a>
-<span class="sourceLineNo">2297</span>  }<a name="line.2297"></a>
-<span class="sourceLineNo">2298</span><a name="line.2298"></a>
-<span class="sourceLineNo">2299</span>  /**<a name="line.2299"></a>
-<span class="sourceLineNo">2300</span>   * Tests that there is server-side filtering for invalid timestamp upper<a name="line.2300"></a>
-<span class="sourceLineNo">2301</span>   * bound. Note that the timestamp lower bound is automatically handled for us<a name="line.2301"></a>
-<span class="sourceLineNo">2302</span>   * by the TTL field.<a name="line.2302"></a>
-<span class="sourceLineNo">2303</span>   */<a name="line.2303"></a>
-<span class="sourceLineNo">2304</span>  @Test<a name="line.2304"></a>
-<span class="sourceLineNo">2305</span>  public void testPutWithTsSlop() throws IOException {<a name="line.2305"></a>
-<span class="sourceLineNo">2306</span>    byte[] fam = Bytes.toBytes("info");<a name="line.2306"></a>
-<span class="sourceLineNo">2307</span>    byte[][] families = { fam };<a name="line.2307"></a>
-<span class="sourceLineNo">2308</span><a name="line.2308"></a>
-<span class="sourceLineNo">2309</span>    // add data with a timestamp that is too recent for range. Ensure assert<a name="line.2309"></a>
-<span class="sourceLineNo">2310</span>    CONF.setInt("hbase.hregion.keyvalue.timestamp.slop.millisecs", 1000);<a name="line.2310"></a>
-<span class="sourceLineNo">2311</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2311"></a>
-<span class="sourceLineNo">2312</span>    boolean caughtExcep = false;<a name="line.2312"></a>
-<span class="sourceLineNo">2313</span>    try {<a name="line.2313"></a>
-<span class="sourceLineNo">2314</span>      // no TS specified == use latest. should not error<a name="line.2314"></a>
-<span class="sourceLineNo">2315</span>      region.put(new Put(row).addColumn(fam, Bytes.toBytes("qual"), Bytes.toBytes("value")));<a name="line.2315"></a>
-<span class="sourceLineNo">2316</span>      // TS out of range. should error<a name="line.2316"></a>
-<span class="sourceLineNo">2317</span>      region.put(new Put(row).addColumn(fam, Bytes.toBytes("qual"),<a name="line.2317"></a>
-<span class="sourceLineNo">2318</span>          System.currentTimeMillis() + 2000, Bytes.toBytes("value")));<a name="line.2318"></a>
-<span class="sourceLineNo">2319</span>      fail("Expected IOE for TS out of configured timerange");<a name="line.2319"></a>
-<span class="sourceLineNo">2320</span>    } catch (FailedSanityCheckException ioe) {<a name="line.2320"></a>
-<span class="sourceLineNo">2321</span>      LOG.debug("Received expected exception", ioe);<a name="line.2321"></a>
-<span class="sourceLineNo">2322</span>      caughtExcep = true;<a name="line.2322"></a>
-<span class="sourceLineNo">2323</span>    }<a name="line.2323"></a>
-<span class="sourceLineNo">2324</span>    assertTrue("Should catch FailedSanityCheckException", caughtExcep);<a name="line.2324"></a>
-<span class="sourceLineNo">2325</span>  }<a name="line.2325"></a>
-<span class="sourceLineNo">2326</span><a name="line.2326"></a>
-<span class="sourceLineNo">2327</span>  @Test<a name="line.2327"></a>
-<span class="sourceLineNo">2328</span>  public void testScanner_DeleteOneFamilyNotAnother() throws IOException {<a name="line.2328"></a>
-<span class="sourceLineNo">2329</span>    byte[] fam1 = Bytes.toBytes("columnA");<a name="line.2329"></a>
-<span class="sourceLineNo">2330</span>    byte[] fam2 = Bytes.toBytes("columnB");<a name="line.2330"></a>
-<span class="sourceLineNo">2331</span>    this.region = initHRegion(tableName, method, CONF, fam1, fam2);<a name="line.2331"></a>
-<span class="sourceLineNo">2332</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.2332"></a>
-<span class="sourceLineNo">2333</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.2333"></a>
-<span class="sourceLineNo">2334</span><a name="line.2334"></a>
-<span class="sourceLineNo">2335</span>    byte[] value = Bytes.toBytes("value");<a name="line.2335"></a>
-<span class="sourceLineNo">2336</span><a name="line.2336"></a>
-<span class="sourceLineNo">2337</span>    Delete delete = new Delete(rowA);<a name="line.2337"></a>
-<span class="sourceLineNo">2338</span>    delete.addFamily(fam1);<a name="line.2338"></a>
-<span class="sourceLineNo">2339</span><a name="line.2339"></a>
-<span class="sourceLineNo">2340</span>    region.delete(delete);<a name="line.2340"></a>
-<span class="sourceLineNo">2341</span><a name="line.2341"></a>
-<span class="sourceLineNo">2342</span>    // now create data.<a name="line.2342"></a>
-<span class="sourceLineNo">2343</span>    Put put = new Put(rowA);<a name="line.2343"></a>
-<span class="sourceLineNo">2344</span>    put.addColumn(fam2, null, value);<a name="line.2344"></a>
-<span class="sourceLineNo">2345</span>    region.put(put);<a name="line.2345"></a>
-<span class="sourceLineNo">2346</span><a name="line.2346"></a>
-<span class="sourceLineNo">2347</span>    put = new Put(rowB);<a name="line.2347"></a>
-<span class="sourceLineNo">2348</span>    put.addColumn(fam1, null, value);<a name="line.2348"></a>
-<span class="sourceLineNo">2349</span>    put.addColumn(fam2, null, value);<a name="line.2349"></a>
-<span class="sourceLineNo">2350</span>    region.put(put);<a name="line.2350"></a>
-<span class="sourceLineNo">2351</span><a name="line.2351"></a>
-<span class="sourceLineNo">2352</span>    Scan scan = new Scan();<a name="line.2352"></a>
-<span class="sourceLineNo">2353</span>    scan.addFamily(fam1).addFamily(fam2);<a name="line.2353"></a>
-<span class="sourceLineNo">2354</span>    InternalScanner s = region.getScanner(scan);<a name="line.2354"></a>
-<span class="sourceLineNo">2355</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.2355"></a>
-<span class="sourceLineNo">2356</span>    s.next(results);<a name="line.2356"></a>
-<span class="sourceLineNo">2357</span>    assertTrue(CellUtil.matchingRows(results.get(0), rowA));<a name="line.2357"></a>
-<span class="sourceLineNo">2358</span><a name="line.2358"></a>
-<span class="sourceLineNo">2359</span>    results.clear();<a name="line.2359"></a>
-<span class="sourceLineNo">2360</span>    s.next(results);<a name="line.2360"></a>
-<span class="sourceLineNo">2361</span>    assertTrue(CellUtil.matchingRows(results.get(0), rowB));<a name="line.2361"></a>
-<span class="sourceLineNo">2362</span>  }<a name="line.2362"></a>
-<span class="sourceLineNo">2363</span><a name="line.2363"></a>
-<span class="sourceLineNo">2364</span>  @Test<a name="line.2364"></a>
-<span class="sourceLineNo">2365</span>  public void testDataInMemoryWithoutWAL() throws IOException {<a name="line.2365"></a>
-<span class="sourceLineNo">2366</span>    FileSystem fs = FileSystem.get(CONF);<a name="line.2366"></a>
-<span class="sourceLineNo">2367</span>    Path rootDir = new Path(dir + "testDataInMemoryWithoutWAL");<a name="line.2367"></a>
-<span class="sourceLineNo">2368</span>    FSHLog hLog = new FSHLog(fs, rootDir, "testDataInMemoryWithoutWAL", CONF);<a name="line.2368"></a>
-<span class="sourceLineNo">2369</span>    hLog.init();<a name="line.2369"></a>
-<span class="sourceLineNo">2370</span>    // This chunk creation is done throughout the code base. Do we want to move it into core?<a name="line.2370"></a>
-<span class="sourceLineNo">2371</span>    // It is missing from this test. W/o it we NPE.<a name="line.2371"></a>
-<span class="sourceLineNo">2372</span>    ChunkCreator.initialize(MemStoreLABImpl.CHUNK_SIZE_DEFAULT, false, 0, 0, 0, null);<a name="line.2372"></a>
-<span class="sourceLineNo">2373</span>    region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, hLog,<a name="line.2373"></a>
-<span class="sourceLineNo">2374</span>        COLUMN_FAMILY_BYTES);<a name="line.2374"></a>
-<span class="sourceLineNo">2375</span><a name="line.2375"></a>
-<span class="sourceLineNo">2376</span>    Cell originalCell = CellUtil.createCell(row, COLUMN_FAMILY_BYTES, qual1,<a name="line.2376"></a>
-<span class="sourceLineNo">2377</span>      System.currentTimeMillis(), KeyValue.Type.Put.getCode(), value1);<a name="line.2377"></a>
-<span class="sourceLineNo">2378</span>    final long originalSize = originalCell.getSerializedSize();<a name="line.2378"></a>
-<span class="sourceLineNo">2379</span><a name="line.2379"></a>
-<span class="sourceLineNo">2380</span>    Cell addCell = CellUtil.createCell(row, COLUMN_FAMILY_BYTES, qual1,<a name="line.2380"></a>
-<span class="sourceLineNo">2381</span>      System.currentTimeMillis(), KeyValue.Type.Put.getCode(), Bytes.toBytes("xxxxxxxxxx"));<a name="line.2381"></a>
-<span class="sourceLineNo">2382</span>    final long addSize = addCell.getSerializedSize();<a name="line.2382"></a>
-<span class="sourceLineNo">2383</span><a name="line.2383"></a>
-<span class="sourceLineNo">2384</span>    LOG.info("originalSize:" + originalSize<a name="line.2384"></a>
-<span class="sourceLineNo">2385</span>      + ", addSize:" + addSize);<a name="line.2385"></a>
-<span class="sourceLineNo">2386</span>    // start test. We expect that the addPut's durability will be replaced<a name="line.2386"></a>
-<span class="sourceLineNo">2387</span>    // by originalPut's durability.<a name="line.2387"></a>
-<span class="sourceLineNo">2388</span><a name="line.2388"></a>
-<span class="sourceLineNo">2389</span>    // case 1:<a name="line.2389"></a>
-<span class="sourceLineNo">2390</span>    testDataInMemoryWithoutWAL(region,<a name="line.2390"></a>
-<span class="sourceLineNo">2391</span>            new Put(row).add(originalCell).setDurability(Durability.SKIP_WAL),<a name="line.2391"></a>
-<span class="sourceLineNo">2392</span>            new Put(row).add(addCell).setDurability(Durability.SKIP_WAL),<a name="line.2392"></a>
-<span class="sourceLineNo">2393</span>            originalSize + addSize);<a name="line.2393"></a>
-<span class="sourceLineNo">2394</span><a name="line.2394"></a>
-<span class="sourceLineNo">2395</span>    // case 2:<a name="line.2395"></a>
-<span class="sourceLineNo">2396</span>    testDataInMemoryWithoutWAL(region,<a name="line.2396"></a>
-<span class="sourceLineNo">2397</span>            new Put(row).add(originalCell).setDurability(Durability.SKIP_WAL),<a name="line.2397"></a>
-<span class="sourceLineNo">2398</span>            new Put(row).add(addCell).setDurability(Durability.SYNC_WAL),<a name="line.2398"></a>
-<span class="sourceLineNo">2399</span>            originalSize + addSize);<a name="line.2399"></a>
-<span class="sourceLineNo">2400</span><a name="line.2400"></a>
-<span class="sourceLineNo">2401</span>    // case 3:<a name="line.2401"></a>
-<span class="sourceLineNo">2402</span>    testDataInMemoryWithoutWAL(region,<a name="line.2402"></a>
-<span class="sourceLineNo">2403</span>            new Put(row).add(originalCell).setDurability(Durability.SYNC_WAL),<a name="line.2403"></a>
-<span class="sourceLineNo">2404</span>            new Put(row).add(addCell).setDurability(Durability.SKIP_WAL),<a name="line.2404"></a>
-<span class="sourceLineNo">2405</span>            0);<a name="line.2405"></a>
-<span class="sourceLineNo">2406</span><a name="line.2406"></a>
-<span class="sourceLineNo">2407</span>    // case 4:<a name="line.2407"></a>
-<span class="sourceLineNo">2408</span>    testDataInMemoryWithoutWAL(region,<a name="line.2408"></a>
-<span class="sourceLineNo">2409</span>            new Put(row).add(originalCell).setDurability(Durability.SYNC_WAL),<a name="line.2409"></a>
-<span class="sourceLineNo">2410</span>            new Put(row).add(addCell).setDurability(Durability.SYNC_WAL),<a name="line.2410"></a>
-<span class="sourceLineNo">2411</span>            0);<a name="line.2411"></a>
-<span class="sourceLineNo">2412</span>  }<a name="line.2412"></a>
-<span class="sourceLineNo">2413</span><a name="line.2413"></a>
-<span class="sourceLineNo">2414</span>  private static void testDataInMemoryWithoutWAL(HRegion region, Put originalPut,<a name="line.2414"></a>
-<span class="sourceLineNo">2415</span>          final Put addPut, long delta) throws IOException {<a name="line.2415"></a>
-<span class="sourceLineNo">2416</span>    final long initSize = region.getDataInMemoryWithoutWAL();<a name="line.2416"></a>
-<span class="sourceLineNo">2417</span>    // save normalCPHost and replaced by mockedCPHost<a name="line.2417"></a>
-<span class="sourceLineNo">2418</span>    RegionCoprocessorHost normalCPHost = region.getCoprocessorHost();<a name="line.2418"></a>
-<span class="sourceLineNo">2419</span>    RegionCoprocessorHost mockedCPHost = Mockito.mock(RegionCoprocessorHost.class);<a name="line.2419"></a>
-<span class="sourceLineNo">2420</span>    // Because the preBatchMutate returns void, we can't do usual Mockito when...then form. Must<a name="line.2420"></a>
-<span class="sourceLineNo">2421</span>    // do below format (from Mockito doc).<a name="line.2421"></a>
-<span class="sourceLineNo">2422</span>    Mockito.doAnswer(new Answer&lt;Void&gt;() {<a name="line.2422"></a>
-<span class="sourceLineNo">2423</span>      @Override<a name="line.2423"></a>
-<span class="sourceLineNo">2424</span>      public Void answer(InvocationOnMock invocation) throws Throwable {<a name="line.2424"></a>
-<span class="sourceLineNo">2425</span>        MiniBatchOperationInProgress&lt;Mutation&gt; mb = invocation.getArgument(0);<a name="line.2425"></a>
-<span class="sourceLineNo">2426</span>        mb.addOperationsFromCP(0, new Mutation[]{addPut});<a name="line.2426"></a>
-<span class="sourceLineNo">2427</span>        return null;<a name="line.2427"></a>
-<span class="sourceLineNo">2428</span>      }<a name="line.2428"></a>
-<span class="sourceLineNo">2429</span>    }).when(mockedCPHost).preBatchMutate(Mockito.isA(MiniBatchOperationInProgress.class));<a name="line.2429"></a>
-<span class="sourceLineNo">2430</span>    region.setCoprocessorHost(mockedCPHost);<a name="line.2430"></a>
-<span class="sourceLineNo">2431</span>    region.put(originalPut);<a name="line.2431"></a>
-<span class="sourceLineNo">2432</span>    region.setCoprocessorHost(normalCPHost);<a name="line.2432"></a>
-<span class="sourceLineNo">2433</span>    final long finalSize = region.getDataInMemoryWithoutWAL();<a name="line.2433"></a>
-<span class="sourceLineNo">2434</span>    assertEquals("finalSize:" + finalSize + ", initSize:"<a name="line.2434"></a>
-<span class="sourceLineNo">2435</span>      + initSize + ", delta:" + delta,finalSize, initSize + delta);<a name="line.2435"></a>
-<span class="sourceLineNo">2436</span>  }<a name="line.2436"></a>
-<span class="sourceLineNo">2437</span><a name="line.2437"></a>
-<span class="sourceLineNo">2438</span>  @Test<a name="line.2438"></a>
-<span class="sourceLineNo">2439</span>  public void testDeleteColumns_PostInsert() throws IOException, InterruptedException {<a name="line.2439"></a>
-<span class="sourceLineNo">2440</span>    Delete delete = new Delete(row);<a name="line.2440"></a>
-<span class="sourceLineNo">2441</span>    delete.addColumns(fam1, qual1);<a name="line.2441"></a>
-<span class="sourceLineNo">2442</span>    doTestDelete_AndPostInsert(delete);<a name="line.2442"></a>
-<span class="sourceLineNo">2443</span>  }<a name="line.2443"></a>
-<span class="sourceLineNo">2444</span><a name="line.2444"></a>
-<span class="sourceLineNo">2445</span>  @Test<a name="line.2445"></a>
-<span class="sourceLineNo">2446</span>  public void testaddFamily_PostInsert() throws IOException, InterruptedException {<a name="line.2446"></a>
-<span class="sourceLineNo">2447</span>    Delete delete = new Delete(row);<a name="line.2447"></a>
-<span class="sourceLineNo">2448</span>    delete.addFamily(fam1);<a name="line.2448"></a>
-<span class="sourceLineNo">2449</span>    doTestDelete_AndPostInsert(delete);<a name="line.2449"></a>
-<span class="sourceLineNo">2450</span>  }<a name="line.2450"></a>
-<span class="sourceLineNo">2451</span><a name="line.2451"></a>
-<span class="sourceLineNo">2452</span>  public void doTestDelete_AndPostInsert(Delete delete) throws IOException, InterruptedException {<a name="line.2452"></a>
-<span class="sourceLineNo">2453</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2453"></a>
-<span class="sourceLineNo">2454</span>    EnvironmentEdgeManagerTestHelper.injectEdge(new IncrementingEnvironmentEdge());<a name="line.2454"></a>
-<span class="sourceLineNo">2455</span>    Put put = new Put(row);<a name="line.2455"></a>
-<span class="sourceLineNo">2456</span>    put.addColumn(fam1, qual1, value1);<a name="line.2456"></a>
-<span class="sourceLineNo">2457</span>    region.put(put);<a name="line.2457"></a>
-<span class="sourceLineNo">2458</span><a name="line.2458"></a>
-<span class="sourceLineNo">2459</span>    // now delete the value:<a name="line.2459"></a>
-<span class="sourceLineNo">2460</span>    region.delete(delete);<a name="line.2460"></a>
+<span class="sourceLineNo">2120</span>    delete.addColumn(fam1, qual);<a name="line.2120"></a>
+<span class="sourceLineNo">2121</span>    region.delete(delete);<a name="line.2121"></a>
+<span class="sourceLineNo">2122</span><a name="line.2122"></a>
+<span class="sourceLineNo">2123</span>    Get get = new Get(row1);<a name="line.2123"></a>
+<span class="sourceLineNo">2124</span>    get.addFamily(fam1);<a name="line.2124"></a>
+<span class="sourceLineNo">2125</span>    Result r = region.get(get);<a name="line.2125"></a>
+<span class="sourceLineNo">2126</span>    assertEquals(0, r.size());<a name="line.2126"></a>
+<span class="sourceLineNo">2127</span>  }<a name="line.2127"></a>
+<span class="sourceLineNo">2128</span><a name="line.2128"></a>
+<span class="sourceLineNo">2129</span>  @Test<a name="line.2129"></a>
+<span class="sourceLineNo">2130</span>  public void testDelete_CheckFamily() throws IOException {<a name="line.2130"></a>
+<span class="sourceLineNo">2131</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2131"></a>
+<span class="sourceLineNo">2132</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2132"></a>
+<span class="sourceLineNo">2133</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2133"></a>
+<span class="sourceLineNo">2134</span>    byte[] fam3 = Bytes.toBytes("fam3");<a name="line.2134"></a>
+<span class="sourceLineNo">2135</span>    byte[] fam4 = Bytes.toBytes("fam4");<a name="line.2135"></a>
+<span class="sourceLineNo">2136</span><a name="line.2136"></a>
+<span class="sourceLineNo">2137</span>    // Setting up region<a name="line.2137"></a>
+<span class="sourceLineNo">2138</span>    this.region = initHRegion(tableName, method, CONF, fam1, fam2, fam3);<a name="line.2138"></a>
+<span class="sourceLineNo">2139</span>    List&lt;Cell&gt; kvs = new ArrayList&lt;&gt;();<a name="line.2139"></a>
+<span class="sourceLineNo">2140</span>    kvs.add(new KeyValue(row1, fam4, null, null));<a name="line.2140"></a>
+<span class="sourceLineNo">2141</span><a name="line.2141"></a>
+<span class="sourceLineNo">2142</span>    // testing existing family<a name="line.2142"></a>
+<span class="sourceLineNo">2143</span>    byte[] family = fam2;<a name="line.2143"></a>
+<span class="sourceLineNo">2144</span>    NavigableMap&lt;byte[], List&lt;Cell&gt;&gt; deleteMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2144"></a>
+<span class="sourceLineNo">2145</span>    deleteMap.put(family, kvs);<a name="line.2145"></a>
+<span class="sourceLineNo">2146</span>    region.delete(deleteMap, Durability.SYNC_WAL);<a name="line.2146"></a>
+<span class="sourceLineNo">2147</span><a name="line.2147"></a>
+<span class="sourceLineNo">2148</span>    // testing non existing family<a name="line.2148"></a>
+<span class="sourceLineNo">2149</span>    boolean ok = false;<a name="line.2149"></a>
+<span class="sourceLineNo">2150</span>    family = fam4;<a name="line.2150"></a>
+<span class="sourceLineNo">2151</span>    try {<a name="line.2151"></a>
+<span class="sourceLineNo">2152</span>      deleteMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2152"></a>
+<span class="sourceLineNo">2153</span>      deleteMap.put(family, kvs);<a name="line.2153"></a>
+<span class="sourceLineNo">2154</span>      region.delete(deleteMap, Durability.SYNC_WAL);<a name="line.2154"></a>
+<span class="sourceLineNo">2155</span>    } catch (Exception e) {<a name="line.2155"></a>
+<span class="sourceLineNo">2156</span>      ok = true;<a name="line.2156"></a>
+<span class="sourceLineNo">2157</span>    }<a name="line.2157"></a>
+<span class="sourceLineNo">2158</span>    assertTrue("Family " + new String(family, StandardCharsets.UTF_8) + " does exist", ok);<a name="line.2158"></a>
+<span class="sourceLineNo">2159</span>  }<a name="line.2159"></a>
+<span class="sourceLineNo">2160</span><a name="line.2160"></a>
+<span class="sourceLineNo">2161</span>  @Test<a name="line.2161"></a>
+<span class="sourceLineNo">2162</span>  public void testDelete_mixed() throws IOException, InterruptedException {<a name="line.2162"></a>
+<span class="sourceLineNo">2163</span>    byte[] fam = Bytes.toBytes("info");<a name="line.2163"></a>
+<span class="sourceLineNo">2164</span>    byte[][] families = { fam };<a name="line.2164"></a>
+<span class="sourceLineNo">2165</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2165"></a>
+<span class="sourceLineNo">2166</span>    EnvironmentEdgeManagerTestHelper.injectEdge(new IncrementingEnvironmentEdge());<a name="line.2166"></a>
+<span class="sourceLineNo">2167</span><a name="line.2167"></a>
+<span class="sourceLineNo">2168</span>    byte[] row = Bytes.toBytes("table_name");<a name="line.2168"></a>
+<span class="sourceLineNo">2169</span>    // column names<a name="line.2169"></a>
+<span class="sourceLineNo">2170</span>    byte[] serverinfo = Bytes.toBytes("serverinfo");<a name="line.2170"></a>
+<span class="sourceLineNo">2171</span>    byte[] splitA = Bytes.toBytes("splitA");<a name="line.2171"></a>
+<span class="sourceLineNo">2172</span>    byte[] splitB = Bytes.toBytes("splitB");<a name="line.2172"></a>
+<span class="sourceLineNo">2173</span><a name="line.2173"></a>
+<span class="sourceLineNo">2174</span>    // add some data:<a name="line.2174"></a>
+<span class="sourceLineNo">2175</span>    Put put = new Put(row);<a name="line.2175"></a>
+<span class="sourceLineNo">2176</span>    put.addColumn(fam, splitA, Bytes.toBytes("reference_A"));<a name="line.2176"></a>
+<span class="sourceLineNo">2177</span>    region.put(put);<a name="line.2177"></a>
+<span class="sourceLineNo">2178</span><a name="line.2178"></a>
+<span class="sourceLineNo">2179</span>    put = new Put(row);<a name="line.2179"></a>
+<span class="sourceLineNo">2180</span>    put.addColumn(fam, splitB, Bytes.toBytes("reference_B"));<a name="line.2180"></a>
+<span class="sourceLineNo">2181</span>    region.put(put);<a name="line.2181"></a>
+<span class="sourceLineNo">2182</span><a name="line.2182"></a>
+<span class="sourceLineNo">2183</span>    put = new Put(row);<a name="line.2183"></a>
+<span class="sourceLineNo">2184</span>    put.addColumn(fam, serverinfo, Bytes.toBytes("ip_address"));<a name="line.2184"></a>
+<span class="sourceLineNo">2185</span>    region.put(put);<a name="line.2185"></a>
+<span class="sourceLineNo">2186</span><a name="line.2186"></a>
+<span class="sourceLineNo">2187</span>    // ok now delete a split:<a name="line.2187"></a>
+<span class="sourceLineNo">2188</span>    Delete delete = new Delete(row);<a name="line.2188"></a>
+<span class="sourceLineNo">2189</span>    delete.addColumns(fam, splitA);<a name="line.2189"></a>
+<span class="sourceLineNo">2190</span>    region.delete(delete);<a name="line.2190"></a>
+<span class="sourceLineNo">2191</span><a name="line.2191"></a>
+<span class="sourceLineNo">2192</span>    // assert some things:<a name="line.2192"></a>
+<span class="sourceLineNo">2193</span>    Get get = new Get(row).addColumn(fam, serverinfo);<a name="line.2193"></a>
+<span class="sourceLineNo">2194</span>    Result result = region.get(get);<a name="line.2194"></a>
+<span class="sourceLineNo">2195</span>    assertEquals(1, result.size());<a name="line.2195"></a>
+<span class="sourceLineNo">2196</span><a name="line.2196"></a>
+<span class="sourceLineNo">2197</span>    get = new Get(row).addColumn(fam, splitA);<a name="line.2197"></a>
+<span class="sourceLineNo">2198</span>    result = region.get(get);<a name="line.2198"></a>
+<span class="sourceLineNo">2199</span>    assertEquals(0, result.size());<a name="line.2199"></a>
+<span class="sourceLineNo">2200</span><a name="line.2200"></a>
+<span class="sourceLineNo">2201</span>    get = new Get(row).addColumn(fam, splitB);<a name="line.2201"></a>
+<span class="sourceLineNo">2202</span>    result = region.get(get);<a name="line.2202"></a>
+<span class="sourceLineNo">2203</span>    assertEquals(1, result.size());<a name="line.2203"></a>
+<span class="sourceLineNo">2204</span><a name="line.2204"></a>
+<span class="sourceLineNo">2205</span>    // Assert that after a delete, I can put.<a name="line.2205"></a>
+<span class="sourceLineNo">2206</span>    put = new Put(row);<a name="line.2206"></a>
+<span class="sourceLineNo">2207</span>    put.addColumn(fam, splitA, Bytes.toBytes("reference_A"));<a name="line.2207"></a>
+<span class="sourceLineNo">2208</span>    region.put(put);<a name="line.2208"></a>
+<span class="sourceLineNo">2209</span>    get = new Get(row);<a name="line.2209"></a>
+<span class="sourceLineNo">2210</span>    result = region.get(get);<a name="line.2210"></a>
+<span class="sourceLineNo">2211</span>    assertEquals(3, result.size());<a name="line.2211"></a>
+<span class="sourceLineNo">2212</span><a name="line.2212"></a>
+<span class="sourceLineNo">2213</span>    // Now delete all... then test I can add stuff back<a name="line.2213"></a>
+<span class="sourceLineNo">2214</span>    delete = new Delete(row);<a name="line.2214"></a>
+<span class="sourceLineNo">2215</span>    region.delete(delete);<a name="line.2215"></a>
+<span class="sourceLineNo">2216</span>    assertEquals(0, region.get(get).size());<a name="line.2216"></a>
+<span class="sourceLineNo">2217</span><a name="line.2217"></a>
+<span class="sourceLineNo">2218</span>    region.put(new Put(row).addColumn(fam, splitA, Bytes.toBytes("reference_A")));<a name="line.2218"></a>
+<span class="sourceLineNo">2219</span>    result = region.get(get);<a name="line.2219"></a>
+<span class="sourceLineNo">2220</span>    assertEquals(1, result.size());<a name="line.2220"></a>
+<span class="sourceLineNo">2221</span>  }<a name="line.2221"></a>
+<span class="sourceLineNo">2222</span><a name="line.2222"></a>
+<span class="sourceLineNo">2223</span>  @Test<a name="line.2223"></a>
+<span class="sourceLineNo">2224</span>  public void testDeleteRowWithFutureTs() throws IOException {<a name="line.2224"></a>
+<span class="sourceLineNo">2225</span>    byte[] fam = Bytes.toBytes("info");<a name="line.2225"></a>
+<span class="sourceLineNo">2226</span>    byte[][] families = { fam };<a name="line.2226"></a>
+<span class="sourceLineNo">2227</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2227"></a>
+<span class="sourceLineNo">2228</span>    byte[] row = Bytes.toBytes("table_name");<a name="line.2228"></a>
+<span class="sourceLineNo">2229</span>    // column names<a name="line.2229"></a>
+<span class="sourceLineNo">2230</span>    byte[] serverinfo = Bytes.toBytes("serverinfo");<a name="line.2230"></a>
+<span class="sourceLineNo">2231</span><a name="line.2231"></a>
+<span class="sourceLineNo">2232</span>    // add data in the far future<a name="line.2232"></a>
+<span class="sourceLineNo">2233</span>    Put put = new Put(row);<a name="line.2233"></a>
+<span class="sourceLineNo">2234</span>    put.addColumn(fam, serverinfo, HConstants.LATEST_TIMESTAMP - 5, Bytes.toBytes("value"));<a name="line.2234"></a>
+<span class="sourceLineNo">2235</span>    region.put(put);<a name="line.2235"></a>
+<span class="sourceLineNo">2236</span><a name="line.2236"></a>
+<span class="sourceLineNo">2237</span>    // now delete something in the present<a name="line.2237"></a>
+<span class="sourceLineNo">2238</span>    Delete delete = new Delete(row);<a name="line.2238"></a>
+<span class="sourceLineNo">2239</span>    region.delete(delete);<a name="line.2239"></a>
+<span class="sourceLineNo">2240</span><a name="line.2240"></a>
+<span class="sourceLineNo">2241</span>    // make sure we still see our data<a name="line.2241"></a>
+<span class="sourceLineNo">2242</span>    Get get = new Get(row).addColumn(fam, serverinfo);<a name="line.2242"></a>
+<span class="sourceLineNo">2243</span>    Result result = region.get(get);<a name="line.2243"></a>
+<span class="sourceLineNo">2244</span>    assertEquals(1, result.size());<a name="line.2244"></a>
+<span class="sourceLineNo">2245</span><a name="line.2245"></a>
+<span class="sourceLineNo">2246</span>    // delete the future row<a name="line.2246"></a>
+<span class="sourceLineNo">2247</span>    delete = new Delete(row, HConstants.LATEST_TIMESTAMP - 3);<a name="line.2247"></a>
+<span class="sourceLineNo">2248</span>    region.delete(delete);<a name="line.2248"></a>
+<span class="sourceLineNo">2249</span><a name="line.2249"></a>
+<span class="sourceLineNo">2250</span>    // make sure it is gone<a name="line.2250"></a>
+<span class="sourceLineNo">2251</span>    get = new Get(row).addColumn(fam, serverinfo);<a name="line.2251"></a>
+<span class="sourceLineNo">2252</span>    result = region.get(get);<a name="line.2252"></a>
+<span class="sourceLineNo">2253</span>    assertEquals(0, result.size());<a name="line.2253"></a>
+<span class="sourceLineNo">2254</span>  }<a name="line.2254"></a>
+<span class="sourceLineNo">2255</span><a name="line.2255"></a>
+<span class="sourceLineNo">2256</span>  /**<a name="line.2256"></a>
+<span class="sourceLineNo">2257</span>   * Tests that the special LATEST_TIMESTAMP option for puts gets replaced by<a name="line.2257"></a>
+<span class="sourceLineNo">2258</span>   * the actual timestamp<a name="line.2258"></a>
+<span class="sourceLineNo">2259</span>   */<a name="line.2259"></a>
+<span class="sourceLineNo">2260</span>  @Test<a name="line.2260"></a>
+<span class="sourceLineNo">2261</span>  public void testPutWithLatestTS() throws IOException {<a name="line.2261"></a>
+<span class="sourceLineNo">2262</span>    byte[] fam = Bytes.toBytes("info");<a name="line.2262"></a>
+<span class="sourceLineNo">2263</span>    byte[][] families = { fam };<a name="line.2263"></a>
+<span class="sourceLineNo">2264</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2264"></a>
+<span class="sourceLineNo">2265</span>    byte[] row = Bytes.toBytes("row1");<a name="line.2265"></a>
+<span class="sourceLineNo">2266</span>    // column names<a name="line.2266"></a>
+<span class="sourceLineNo">2267</span>    byte[] qual = Bytes.toBytes("qual");<a name="line.2267"></a>
+<span class="sourceLineNo">2268</span><a name="line.2268"></a>
+<span class="sourceLineNo">2269</span>    // add data with LATEST_TIMESTAMP, put without WAL<a name="line.2269"></a>
+<span class="sourceLineNo">2270</span>    Put put = new Put(row);<a name="line.2270"></a>
+<span class="sourceLineNo">2271</span>    put.addColumn(fam, qual, HConstants.LATEST_TIMESTAMP, Bytes.toBytes("value"));<a name="line.2271"></a>
+<span class="sourceLineNo">2272</span>    region.put(put);<a name="line.2272"></a>
+<span class="sourceLineNo">2273</span><a name="line.2273"></a>
+<span class="sourceLineNo">2274</span>    // Make sure it shows up with an actual timestamp<a name="line.2274"></a>
+<span class="sourceLineNo">2275</span>    Get get = new Get(row).addColumn(fam, qual);<a name="line.2275"></a>
+<span class="sourceLineNo">2276</span>    Result result = region.get(get);<a name="line.2276"></a>
+<span class="sourceLineNo">2277</span>    assertEquals(1, result.size());<a name="line.2277"></a>
+<span class="sourceLineNo">2278</span>    Cell kv = result.rawCells()[0];<a name="line.2278"></a>
+<span class="sourceLineNo">2279</span>    LOG.info("Got: " + kv);<a name="line.2279"></a>
+<span class="sourceLineNo">2280</span>    assertTrue("LATEST_TIMESTAMP was not replaced with real timestamp",<a name="line.2280"></a>
+<span class="sourceLineNo">2281</span>        kv.getTimestamp() != HConstants.LATEST_TIMESTAMP);<a name="line.2281"></a>
+<span class="sourceLineNo">2282</span><a name="line.2282"></a>
+<span class="sourceLineNo">2283</span>    // Check same with WAL enabled (historically these took different<a name="line.2283"></a>
+<span class="sourceLineNo">2284</span>    // code paths, so check both)<a name="line.2284"></a>
+<span class="sourceLineNo">2285</span>    row = Bytes.toBytes("row2");<a name="line.2285"></a>
+<span class="sourceLineNo">2286</span>    put = new Put(row);<a name="line.2286"></a>
+<span class="sourceLineNo">2287</span>    put.addColumn(fam, qual, HConstants.LATEST_TIMESTAMP, Bytes.toBytes("value"));<a name="line.2287"></a>
+<span class="sourceLineNo">2288</span>    region.put(put);<a name="line.2288"></a>
+<span class="sourceLineNo">2289</span><a name="line.2289"></a>
+<span class="sourceLineNo">2290</span>    // Make sure it shows up with an actual timestamp<a name="line.2290"></a>
+<span class="sourceLineNo">2291</span>    get = new Get(row).addColumn(fam, qual);<a name="line.2291"></a>
+<span class="sourceLineNo">2292</span>    result = region.get(get);<a name="line.2292"></a>
+<span class="sourceLineNo">2293</span>    assertEquals(1, result.size());<a name="line.2293"></a>
+<span class="sourceLineNo">2294</span>    kv = result.rawCells()[0];<a name="line.2294"></a>
+<span class="sourceLineNo">2295</span>    LOG.info("Got: " + kv);<a name="line.2295"></a>
+<span class="sourceLineNo">2296</span>    assertTrue("LATEST_TIMESTAMP was not replaced with real timestamp",<a name="line.2296"></a>
+<span class="sourceLineNo">2297</span>        kv.getTimestamp() != HConstants.LATEST_TIMESTAMP);<a name="line.2297"></a>
+<span class="sourceLineNo">2298</span>  }<a name="line.2298"></a>
+<span class="sourceLineNo">2299</span><a name="line.2299"></a>
+<span class="sourceLineNo">2300</span>  /**<a name="line.2300"></a>
+<span class="sourceLineNo">2301</span>   * Tests that there is server-side filtering for invalid timestamp upper<a name="line.2301"></a>
+<span class="sourceLineNo">2302</span>   * bound. Note that the timestamp lower bound is automatically handled for us<a name="line.2302"></a>
+<span class="sourceLineNo">2303</span>   * by the TTL field.<a name="line.2303"></a>
+<span class="sourceLineNo">2304</span>   */<a name="line.2304"></a>
+<span class="sourceLineNo">2305</span>  @Test<a name="line.2305"></a>
+<span class="sourceLineNo">2306</span>  public void testPutWithTsSlop() throws IOException {<a name="line.2306"></a>
+<span class="sourceLineNo">2307</span>    byte[] fam = Bytes.toBytes("info");<a name="line.2307"></a>
+<span class="sourceLineNo">2308</span>    byte[][] families = { fam };<a name="line.2308"></a>
+<span class="sourceLineNo">2309</span><a name="line.2309"></a>
+<span class="sourceLineNo">2310</span>    // add data with a timestamp that is too recent for range. Ensure assert<a name="line.2310"></a>
+<span class="sourceLineNo">2311</span>    CONF.setInt("hbase.hregion.keyvalue.timestamp.slop.millisecs", 1000);<a name="line.2311"></a>
+<span class="sourceLineNo">2312</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2312"></a>
+<span class="sourceLineNo">2313</span>    boolean caughtExcep = false;<a name="line.2313"></a>
+<span class="sourceLineNo">2314</span>    try {<a name="line.2314"></a>
+<span class="sourceLineNo">2315</span>      // no TS specified == use latest. should not error<a name="line.2315"></a>
+<span class="sourceLineNo">2316</span>      region.put(new Put(row).addColumn(fam, Bytes.toBytes("qual"), Bytes.toBytes("value")));<a name="line.2316"></a>
+<span class="sourceLineNo">2317</span>      // TS out of range. should error<a name="line.2317"></a>
+<span class="sourceLineNo">2318</span>      region.put(new Put(row).addColumn(fam, Bytes.toBytes("qual"),<a name="line.2318"></a>
+<span class="sourceLineNo">2319</span>          System.currentTimeMillis() + 2000, Bytes.toBytes("value")));<a name="line.2319"></a>
+<span class="sourceLineNo">2320</span>      fail("Expected IOE for TS out of configured timerange");<a name="line.2320"></a>
+<span class="sourceLineNo">2321</span>    } catch (FailedSanityCheckException ioe) {<a name="line.2321"></a>
+<span class="sourceLineNo">2322</span>      LOG.debug("Received expected exception", ioe);<a name="line.2322"></a>
+<span class="sourceLineNo">2323</span>      caughtExcep = true;<a name="line.2323"></a>
+<span class="sourceLineNo">2324</span>    }<a name="line.2324"></a>
+<span class="sourceLineNo">2325</span>    assertTrue("Should catch FailedSanityCheckException", caughtExcep);<a name="line.2325"></a>
+<span class="sourceLineNo">2326</span>  }<a name="line.2326"></a>
+<span class="sourceLineNo">2327</span><a name="line.2327"></a>
+<span class="sourceLineNo">2328</span>  @Test<a name="line.2328"></a>
+<span class="sourceLineNo">2329</span>  public void testScanner_DeleteOneFamilyNotAnother() throws IOException {<a name="line.2329"></a>
+<span class="sourceLineNo">2330</span>    byte[] fam1 = Bytes.toBytes("columnA");<a name="line.2330"></a>
+<span class="sourceLineNo">2331</span>    byte[] fam2 = Bytes.toBytes("columnB");<a name="line.2331"></a>
+<span class="sourceLineNo">2332</span>    this.region = initHRegion(tableName, method, CONF, fam1, fam2);<a name="line.2332"></a>
+<span class="sourceLineNo">2333</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.2333"></a>
+<span class="sourceLineNo">2334</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.2334"></a>
+<span class="sourceLineNo">2335</span><a name="line.2335"></a>
+<span class="sourceLineNo">2336</span>    byte[] value = Bytes.toBytes("value");<a name="line.2336"></a>
+<span class="sourceLineNo">2337</span><a name="line.2337"></a>
+<span class="sourceLineNo">2338</span>    Delete delete = new Delete(rowA);<a name="line.2338"></a>
+<span class="sourceLineNo">2339</span>    delete.addFamily(fam1);<a name="line.2339"></a>
+<span class="sourceLineNo">2340</span><a name="line.2340"></a>
+<span class="sourceLineNo">2341</span>    region.delete(delete);<a name="line.2341"></a>
+<span class="sourceLineNo">2342</span><a name="line.2342"></a>
+<span class="sourceLineNo">2343</span>    // now create data.<a name="line.2343"></a>
+<span class="sourceLineNo">2344</span>    Put put = new Put(rowA);<a name="line.2344"></a>
+<span class="sourceLineNo">2345</span>    put.addColumn(fam2, null, value);<a name="line.2345"></a>
+<span class="sourceLineNo">2346</span>    region.put(put);<a name="line.2346"></a>
+<span class="sourceLineNo">2347</span><a name="line.2347"></a>
+<span class="sourceLineNo">2348</span>    put = new Put(rowB);<a name="line.2348"></a>
+<span class="sourceLineNo">2349</span>    put.addColumn(fam1, null, value);<a name="line.2349"></a>
+<span class="sourceLineNo">2350</span>    put.addColumn(fam2, null, value);<a name="line.2350"></a>
+<span class="sourceLineNo">2351</span>    region.put(put);<a name="line.2351"></a>
+<span class="sourceLineNo">2352</span><a name="line.2352"></a>
+<span class="sourceLineNo">2353</span>    Scan scan = new Scan();<a name="line.2353"></a>
+<span class="sourceLineNo">2354</span>    scan.addFamily(fam1).addFamily(fam2);<a name="line.2354"></a>
+<span class="sourceLineNo">2355</span>    InternalScanner s = region.getScanner(scan);<a name="line.2355"></a>
+<span class="sourceLineNo">2356</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.2356"></a>
+<span class="sourceLineNo">2357</span>    s.next(results);<a name="line.2357"></a>
+<span class="sourceLineNo">2358</span>    assertTrue(CellUtil.matchingRows(results.get(0), rowA));<a name="line.2358"></a>
+<span class="sourceLineNo">2359</span><a name="line.2359"></a>
+<span class="sourceLineNo">2360</span>    results.clear();<a name="line.2360"></a>
+<span class="sourceLineNo">2361</span>    s.next(results);<a name="line.2361"></a>
+<span class="sourceLineNo">2362</span>    assertTrue(CellUtil.matchingRows(results.get(0), rowB));<a name="line.2362"></a>
+<span class="sourceLineNo">2363</span>  }<a name="line.2363"></a>
+<span class="sourceLineNo">2364</span><a name="line.2364"></a>
+<span class="sourceLineNo">2365</span>  @Test<a name="line.2365"></a>
+<span class="sourceLineNo">2366</span>  public void testDataInMemoryWithoutWAL() throws IOException {<a name="line.2366"></a>
+<span class="sourceLineNo">2367</span>    FileSystem fs = FileSystem.get(CONF);<a name="line.2367"></a>
+<span class="sourceLineNo">2368</span>    Path rootDir = new Path(dir + "testDataInMemoryWithoutWAL");<a name="line.2368"></a>
+<span class="sourceLineNo">2369</span>    FSHLog hLog = new FSHLog(fs, rootDir, "testDataInMemoryWithoutWAL", CONF);<a name="line.2369"></a>
+<span class="sourceLineNo">2370</span>    hLog.init();<a name="line.2370"></a>
+<span class="sourceLineNo">2371</span>    // This chunk creation is done throughout the code base. Do we want to move it into core?<a name="line.2371"></a>
+<span class="sourceLineNo">2372</span>    // It is missing from this test. W/o it we NPE.<a name="line.2372"></a>
+<span class="sourceLineNo">2373</span>    ChunkCreator.initialize(MemStoreLABImpl.CHUNK_SIZE_DEFAULT, false, 0, 0, 0, null);<a name="line.2373"></a>
+<span class="sourceLineNo">2374</span>    region = initHRegion(tableName, null, null, false, Durability.SYNC_WAL, hLog,<a name="line.2374"></a>
+<span class="sourceLineNo">2375</span>        COLUMN_FAMILY_BYTES);<a name="line.2375"></a>
+<span class="sourceLineNo">2376</span><a name="line.2376"></a>
+<span class="sourceLineNo">2377</span>    Cell originalCell = CellUtil.createCell(row, COLUMN_FAMILY_BYTES, qual1,<a name="line.2377"></a>
+<span class="sourceLineNo">2378</span>      System.currentTimeMillis(), KeyValue.Type.Put.getCode(), value1);<a name="line.2378"></a>
+<span class="sourceLineNo">2379</span>    final long originalSize = originalCell.getSerializedSize();<a name="line.2379"></a>
+<span class="sourceLineNo">2380</span><a name="line.2380"></a>
+<span class="sourceLineNo">2381</span>    Cell addCell = CellUtil.createCell(row, COLUMN_FAMILY_BYTES, qual1,<a name="line.2381"></a>
+<span class="sourceLineNo">2382</span>      System.currentTimeMillis(), KeyValue.Type.Put.getCode(), Bytes.toBytes("xxxxxxxxxx"));<a name="line.2382"></a>
+<span class="sourceLineNo">2383</span>    final long addSize = addCell.getSerializedSize();<a name="line.2383"></a>
+<span class="sourceLineNo">2384</span><a name="line.2384"></a>
+<span class="sourceLineNo">2385</span>    LOG.info("originalSize:" + originalSize<a name="line.2385"></a>
+<span class="sourceLineNo">2386</span>      + ", addSize:" + addSize);<a name="line.2386"></a>
+<span class="sourceLineNo">2387</span>    // start test. We expect that the addPut's durability will be replaced<a name="line.2387"></a>
+<span class="sourceLineNo">2388</span>    // by originalPut's durability.<a name="line.2388"></a>
+<span class="sourceLineNo">2389</span><a name="line.2389"></a>
+<span class="sourceLineNo">2390</span>    // case 1:<a name="line.2390"></a>
+<span class="sourceLineNo">2391</span>    testDataInMemoryWithoutWAL(region,<a name="line.2391"></a>
+<span class="sourceLineNo">2392</span>            new Put(row).add(originalCell).setDurability(Durability.SKIP_WAL),<a name="line.2392"></a>
+<span class="sourceLineNo">2393</span>            new Put(row).add(addCell).setDurability(Durability.SKIP_WAL),<a name="line.2393"></a>
+<span class="sourceLineNo">2394</span>            originalSize + addSize);<a name="line.2394"></a>
+<span class="sourceLineNo">2395</span><a name="line.2395"></a>
+<span class="sourceLineNo">2396</span>    // case 2:<a name="line.2396"></a>
+<span class="sourceLineNo">2397</span>    testDataInMemoryWithoutWAL(region,<a name="line.2397"></a>
+<span class="sourceLineNo">2398</span>            new Put(row).add(originalCell).setDurability(Durability.SKIP_WAL),<a name="line.2398"></a>
+<span class="sourceLineNo">2399</span>            new Put(row).add(addCell).setDurability(Durability.SYNC_WAL),<a name="line.2399"></a>
+<span class="sourceLineNo">2400</span>            originalSize + addSize);<a name="line.2400"></a>
+<span class="sourceLineNo">2401</span><a name="line.2401"></a>
+<span class="sourceLineNo">2402</span>    // case 3:<a name="line.2402"></a>
+<span class="sourceLineNo">2403</span>    testDataInMemoryWithoutWAL(region,<a name="line.2403"></a>
+<span class="sourceLineNo">2404</span>            new Put(row).add(originalCell).setDurability(Durability.SYNC_WAL),<a name="line.2404"></a>
+<span class="sourceLineNo">2405</span>            new Put(row).add(addCell).setDurability(Durability.SKIP_WAL),<a name="line.2405"></a>
+<span class="sourceLineNo">2406</span>            0);<a name="line.2406"></a>
+<span class="sourceLineNo">2407</span><a name="line.2407"></a>
+<span class="sourceLineNo">2408</span>    // case 4:<a name="line.2408"></a>
+<span class="sourceLineNo">2409</span>    testDataInMemoryWithoutWAL(region,<a name="line.2409"></a>
+<span class="sourceLineNo">2410</span>            new Put(row).add(originalCell).setDurability(Durability.SYNC_WAL),<a name="line.2410"></a>
+<span class="sourceLineNo">2411</span>            new Put(row).add(addCell).setDurability(Durability.SYNC_WAL),<a name="line.2411"></a>
+<span class="sourceLineNo">2412</span>            0);<a name="line.2412"></a>
+<span class="sourceLineNo">2413</span>  }<a name="line.2413"></a>
+<span class="sourceLineNo">2414</span><a name="line.2414"></a>
+<span class="sourceLineNo">2415</span>  private static void testDataInMemoryWithoutWAL(HRegion region, Put originalPut,<a name="line.2415"></a>
+<span class="sourceLineNo">2416</span>          final Put addPut, long delta) throws IOException {<a name="line.2416"></a>
+<span class="sourceLineNo">2417</span>    final long initSize = region.getDataInMemoryWithoutWAL();<a name="line.2417"></a>
+<span class="sourceLineNo">2418</span>    // save normalCPHost and replaced by mockedCPHost<a name="line.2418"></a>
+<span class="sourceLineNo">2419</span>    RegionCoprocessorHost normalCPHost = region.getCoprocessorHost();<a name="line.2419"></a>
+<span class="sourceLineNo">2420</span>    RegionCoprocessorHost mockedCPHost = Mockito.mock(RegionCoprocessorHost.class);<a name="line.2420"></a>
+<span class="sourceLineNo">2421</span>    // Because the preBatchMutate returns void, we can't do usual Mockito when...then form. Must<a name="line.2421"></a>
+<span class="sourceLineNo">2422</span>    // do below format (from Mockito doc).<a name="line.2422"></a>
+<span class="sourceLineNo">2423</span>    Mockito.doAnswer(new Answer&lt;Void&gt;() {<a name="line.2423"></a>
+<span class="sourceLineNo">2424</span>      @Override<a name="line.2424"></a>
+<span class="sourceLineNo">2425</span>      public Void answer(InvocationOnMock invocation) throws Throwable {<a name="line.2425"></a>
+<span class="sourceLineNo">2426</span>        MiniBatchOperationInProgress&lt;Mutation&gt; mb = invocation.getArgument(0);<a name="line.2426"></a>
+<span class="sourceLineNo">2427</span>        mb.addOperationsFromCP(0, new Mutation[]{addPut});<a name="line.2427"></a>
+<span class="sourceLineNo">2428</span>        return null;<a name="line.2428"></a>
+<span class="sourceLineNo">2429</span>      }<a name="line.2429"></a>
+<span class="sourceLineNo">2430</span>    }).when(mockedCPHost).preBatchMutate(Mockito.isA(MiniBatchOperationInProgress.class));<a name="line.2430"></a>
+<span class="sourceLineNo">2431</span>    ColumnFamilyDescriptorBuilder builder = ColumnFamilyDescriptorBuilder.<a name="line.2431"></a>
+<span class="sourceLineNo">2432</span>        newBuilder(COLUMN_FAMILY_BYTES);<a name="line.2432"></a>
+<span class="sourceLineNo">2433</span>    ScanInfo info = new ScanInfo(CONF, builder.build(), Long.MAX_VALUE,<a name="line.2433"></a>
+<span class="sourceLineNo">2434</span>        Long.MAX_VALUE, region.getCellComparator());<a name="line.2434"></a>
+<span class="sourceLineNo">2435</span>    Mockito.when(mockedCPHost.preFlushScannerOpen(Mockito.any(HStore.class),<a name="line.2435"></a>
+<span class="sourceLineNo">2436</span>        Mockito.any())).thenReturn(info);<a name="line.2436"></a>
+<span class="sourceLineNo">2437</span>    Mockito.when(mockedCPHost.preFlush(Mockito.any(), Mockito.any(StoreScanner.class),<a name="line.2437"></a>
+<span class="sourceLineNo">2438</span>        Mockito.any())).thenAnswer(i -&gt; i.getArgument(1));<a name="line.2438"></a>
+<span class="sourceLineNo">2439</span>    region.setCoprocessorHost(mockedCPHost);<a name="line.2439"></a>
+<span class="sourceLineNo">2440</span><a name="line.2440"></a>
+<span class="sourceLineNo">2441</span>    region.put(originalPut);<a name="line.2441"></a>
+<span class="sourceLineNo">2442</span>    region.setCoprocessorHost(normalCPHost);<a name="line.2442"></a>
+<span class="sourceLineNo">2443</span>    final long finalSize = region.getDataInMemoryWithoutWAL();<a name="line.2443"></a>
+<span class="sourceLineNo">2444</span>    assertEquals("finalSize:" + finalSize + ", initSize:"<a name="line.2444"></a>
+<span class="sourceLineNo">2445</span>      + initSize + ", delta:" + delta,finalSize, initSize + delta);<a name="line.2445"></a>
+<span class="sourceLineNo">2446</span>  }<a name="line.2446"></a>
+<span class="sourceLineNo">2447</span><a name="line.2447"></a>
+<span class="sourceLineNo">2448</span>  @Test<a name="line.2448"></a>
+<span class="sourceLineNo">2449</span>  public void testDeleteColumns_PostInsert() throws IOException, InterruptedException {<a name="line.2449"></a>
+<span class="sourceLineNo">2450</span>    Delete delete = new Delete(row);<a name="line.2450"></a>
+<span class="sourceLineNo">2451</span>    delete.addColumns(fam1, qual1);<a name="line.2451"></a>
+<span class="sourceLineNo">2452</span>    doTestDelete_AndPostInsert(delete);<a name="line.2452"></a>
+<span class="sourceLineNo">2453</span>  }<a name="line.2453"></a>
+<span class="sourceLineNo">2454</span><a name="line.2454"></a>
+<span class="sourceLineNo">2455</span>  @Test<a name="line.2455"></a>
+<span class="sourceLineNo">2456</span>  public void testaddFamily_PostInsert() throws IOException, InterruptedException {<a name="line.2456"></a>
+<span class="sourceLineNo">2457</span>    Delete delete = new Delete(row);<a name="line.2457"></a>
+<span class="sourceLineNo">2458</span>    delete.addFamily(fam1);<a name="line.2458"></a>
+<span class="sourceLineNo">2459</span>    doTestDelete_AndPostInsert(delete);<a name="line.2459"></a>
+<span class="sourceLineNo">2460</span>  }<a name="line.2460"></a>
 <span class="sourceLineNo">2461</span><a name="line.2461"></a>
-<span class="sourceLineNo">2462</span>    // ok put data:<a name="line.2462"></a>
-<span class="sourceLineNo">2463</span>    put = new Put(row);<a name="line.2463"></a>
-<span class="sourceLineNo">2464</span>    put.addColumn(fam1, qual1, value2);<a name="line.2464"></a>
-<span class="sourceLineNo">2465</span>    region.put(put);<a name="line.2465"></a>
-<span class="sourceLineNo">2466</span><a name="line.2466"></a>
-<span class="sourceLineNo">2467</span>    // ok get:<a name="line.2467"></a>
-<span class="sourceLineNo">2468</span>    Get get = new Get(row);<a name="line.2468"></a>
-<span class="sourceLineNo">2469</span>    get.addColumn(fam1, qual1);<a name="line.2469"></a>
-<span class="sourceLineNo">2470</span><a name="line.2470"></a>
-<span class="sourceLineNo">2471</span>    Result r = region.get(get);<a name="line.2471"></a>
-<span class="sourceLineNo">2472</span>    assertEquals(1, r.size());<a name="line.2472"></a>
-<span class="sourceLineNo">2473</span>    assertArrayEquals(value2, r.getValue(fam1, qual1));<a name="line.2473"></a>
-<span class="sourceLineNo">2474</span><a name="line.2474"></a>
-<span class="sourceLineNo">2475</span>    // next:<a name="line.2475"></a>
-<span class="sourceLineNo">2476</span>    Scan scan = new Scan(row);<a name="line.2476"></a>
-<span class="sourceLineNo">2477</span>    scan.addColumn(fam1, qual1);<a name="line.2477"></a>
-<span class="sourceLineNo">2478</span>    InternalScanner s = region.getScanner(scan);<a name="line.2478"></a>
-<span class="sourceLineNo">2479</span><a name="line.2479"></a>
-<span class="sourceLineNo">2480</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.2480"></a>
-<span class="sourceLineNo">2481</span>    assertEquals(false, s.next(results));<a name="line.2481"></a>
-<span class="sourceLineNo">2482</span>    assertEquals(1, results.size());<a name="line.2482"></a>
-<span class="sourceLineNo">2483</span>    Cell kv = results.get(0);<a name="line.2483"></a>
+<span class="sourceLineNo">2462</span>  public void doTestDelete_AndPostInsert(Delete delete) throws IOException, InterruptedException {<a name="line.2462"></a>
+<span class="sourceLineNo">2463</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2463"></a>
+<span class="sourceLineNo">2464</span>    EnvironmentEdgeManagerTestHelper.injectEdge(new IncrementingEnvironmentEdge());<a name="line.2464"></a>
+<span class="sourceLineNo">2465</span>    Put put = new Put(row);<a name="line.2465"></a>
+<span class="sourceLineNo">2466</span>    put.addColumn(fam1, qual1, value1);<a name="line.2466"></a>
+<span class="sourceLineNo">2467</span>    region.put(put);<a name="line.2467"></a>
+<span class="sourceLineNo">2468</span><a name="line.2468"></a>
+<span class="sourceLineNo">2469</span>    // now delete the value:<a name="line.2469"></a>
+<span class="sourceLineNo">2470</span>    region.delete(delete);<a name="line.2470"></a>
+<span class="sourceLineNo">2471</span><a name="line.2471"></a>
+<span class="sourceLineNo">2472</span>    // ok put data:<a name="line.2472"></a>
+<span class="sourceLineNo">2473</span>    put = new Put(row);<a name="line.2473"></a>
+<span class="sourceLineNo">2474</span>    put.addColumn(fam1, qual1, value2);<a name="line.2474"></a>
+<span class="sourceLineNo">2475</span>    region.put(put);<a name="line.2475"></a>
+<span class="sourceLineNo">2476</span><a name="line.2476"></a>
+<span class="sourceLineNo">2477</span>    // ok get:<a name="line.2477"></a>
+<span class="sourceLineNo">2478</span>    Get get = new Get(row);<a name="line.2478"></a>
+<span class="sourceLineNo">2479</span>    get.addColumn(fam1, qual1);<a name="line.2479"></a>
+<span class="sourceLineNo">2480</span><a name="line.2480"></a>
+<span class="sourceLineNo">2481</span>    Result r = region.get(get);<a name="line.2481"></a>
+<span class="sourceLineNo">2482</span>    assertEquals(1, r.size());<a name="line.2482"></a>
+<span class="sourceLineNo">2483</span>    assertArrayEquals(value2, r.getValue(fam1, qual1));<a name="line.2483"></a>
 <span class="sourceLineNo">2484</span><a name="line.2484"></a>
-<span class="sourceLineNo">2485</span>    assertArrayEquals(value2, CellUtil.cloneValue(kv));<a name="line.2485"></a>
-<span class="sourceLineNo">2486</span>    assertArrayEquals(fam1, CellUtil.cloneFamily(kv));<a name="line.2486"></a>
-<span class="sourceLineNo">2487</span>    assertArrayEquals(qual1, CellUtil.cloneQualifier(kv));<a name="line.2487"></a>
-<span class="sourceLineNo">2488</span>    assertArrayEquals(row, CellUtil.cloneRow(kv));<a name="line.2488"></a>
-<span class="sourceLineNo">2489</span>  }<a name="line.2489"></a>
-<span class="sourceLineNo">2490</span><a name="line.2490"></a>
-<span class="sourceLineNo">2491</span>  @Test<a name="line.2491"></a>
-<span class="sourceLineNo">2492</span>  public void testDelete_CheckTimestampUpdated() throws IOException {<a name="line.2492"></a>
-<span class="sourceLineNo">2493</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2493"></a>
-<span class="sourceLineNo">2494</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.2494"></a>
-<span class="sourceLineNo">2495</span>    byte[] col2 = Bytes.toBytes("col2");<a name="line.2495"></a>
-<span class="sourceLineNo">2496</span>    byte[] col3 = Bytes.toBytes("col3");<a name="line.2496"></a>
-<span class="sourceLineNo">2497</span><a name="line.2497"></a>
-<span class="sourceLineNo">2498</span>    // Setting up region<a name="line.2498"></a>
-<span class="sourceLineNo">2499</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2499"></a>
-<span class="sourceLineNo">2500</span>    // Building checkerList<a name="line.2500"></a>
-<span class="sourceLineNo">2501</span>    List&lt;Cell&gt; kvs = new ArrayList&lt;&gt;();<a name="line.2501"></a>
-<span class="sourceLineNo">2502</span>    kvs.add(new KeyValue(row1, fam1, col1, null));<a name="line.2502"></a>
-<span class="sourceLineNo">2503</span>    kvs.add(new KeyValue(row1, fam1, col2, null));<a name="line.2503"></a>
-<span class="sourceLineNo">2504</span>    kvs.add(new KeyValue(row1, fam1, col3, null));<a name="line.2504"></a>
-<span class="sourceLineNo">2505</span><a name="line.2505"></a>
-<span class="sourceLineNo">2506</span>    NavigableMap&lt;byte[], List&lt;Cell&gt;&gt; deleteMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2506"></a>
-<span class="sourceLineNo">2507</span>    deleteMap.put(fam1, kvs);<a name="line.2507"></a>
-<span class="sourceLineNo">2508</span>    region.delete(deleteMap, Durability.SYNC_WAL);<a name="line.2508"></a>
-<span class="sourceLineNo">2509</span><a name="line.2509"></a>
-<span class="sourceLineNo">2510</span>    // extract the key values out the memstore:<a name="line.2510"></a>
-<span class="sourceLineNo">2511</span>    // This is kinda hacky, but better than nothing...<a name="line.2511"></a>
-<span class="sourceLineNo">2512</span>    long now = System.currentTimeMillis();<a name="line.2512"></a>
-<span class="sourceLineNo">2513</span>    AbstractMemStore memstore = (AbstractMemStore)region.getStore(fam1).memstore;<a name="line.2513"></a>
-<span class="sourceLineNo">2514</span>    Cell firstCell = memstore.getActive().first();<a name="line.2514"></a>
-<span class="sourceLineNo">2515</span>    assertTrue(firstCell.getTimestamp() &lt;= now);<a name="line.2515"></a>
-<span class="sourceLineNo">2516</span>    now = firstCell.getTimestamp();<a name="line.2516"></a>
-<span class="sourceLineNo">2517</span>    for (Cell cell : memstore.getActive().getCellSet()) {<a name="line.2517"></a>
-<span class="sourceLineNo">2518</span>      assertTrue(cell.getTimestamp() &lt;= now);<a name="line.2518"></a>
-<span class="sourceLineNo">2519</span>      now = cell.getTimestamp();<a name="line.2519"></a>
-<span class="sourceLineNo">2520</span>    }<a name="line.2520"></a>
-<span class="sourceLineNo">2521</span>  }<a name="line.2521"></a>
-<span class="sourceLineNo">2522</span><a name="line.2522"></a>
-<span class="sourceLineNo">2523</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2523"></a>
-<span class="sourceLineNo">2524</span>  // Get tests<a name="line.2524"></a>
-<span class="sourceLineNo">2525</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2525"></a>
-<span class="sourceLineNo">2526</span>  @Test<a name="line.2526"></a>
-<span class="sourceLineNo">2527</span>  public void testGet_FamilyChecker() throws IOException {<a name="line.2527"></a>
-<span class="sourceLineNo">2528</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2528"></a>
-<span class="sourceLineNo">2529</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2529"></a>
-<span class="sourceLineNo">2530</span>    byte[] fam2 = Bytes.toBytes("False");<a name="line.2530"></a>
-<span class="sourceLineNo">2531</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.2531"></a>
+<span class="sourceLineNo">2485</span>    // next:<a name="line.2485"></a>
+<span class="sourceLineNo">2486</span>    Scan scan = new Scan(row);<a name="line.2486"></a>
+<span class="sourceLineNo">2487</span>    scan.addColumn(fam1, qual1);<a name="line.2487"></a>
+<span class="sourceLineNo">2488</span>    InternalScanner s = region.getScanner(scan);<a name="line.2488"></a>
+<span class="sourceLineNo">2489</span><a name="line.2489"></a>
+<span class="sourceLineNo">2490</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.2490"></a>
+<span class="sourceLineNo">2491</span>    assertEquals(false, s.next(results));<a name="line.2491"></a>
+<span class="sourceLineNo">2492</span>    assertEquals(1, results.size());<a name="line.2492"></a>
+<span class="sourceLineNo">2493</span>    Cell kv = results.get(0);<a name="line.2493"></a>
+<span class="sourceLineNo">2494</span><a name="line.2494"></a>
+<span class="sourceLineNo">2495</span>    assertArrayEquals(value2, CellUtil.cloneValue(kv));<a name="line.2495"></a>
+<span class="sourceLineNo">2496</span>    assertArrayEquals(fam1, CellUtil.cloneFamily(kv));<a name="line.2496"></a>
+<span class="sourceLineNo">2497</span>    assertArrayEquals(qual1, CellUtil.cloneQualifier(kv));<a name="line.2497"></a>
+<span class="sourceLineNo">2498</span>    assertArrayEquals(row, CellUtil.cloneRow(kv));<a name="line.2498"></a>
+<span class="sourceLineNo">2499</span>  }<a name="line.2499"></a>
+<span class="sourceLineNo">2500</span><a name="line.2500"></a>
+<span class="sourceLineNo">2501</span>  @Test<a name="line.2501"></a>
+<span class="sourceLineNo">2502</span>  public void testDelete_CheckTimestampUpdated() throws IOException {<a name="line.2502"></a>
+<span class="sourceLineNo">2503</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2503"></a>
+<span class="sourceLineNo">2504</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.2504"></a>
+<span class="sourceLineNo">2505</span>    byte[] col2 = Bytes.toBytes("col2");<a name="line.2505"></a>
+<span class="sourceLineNo">2506</span>    byte[] col3 = Bytes.toBytes("col3");<a name="line.2506"></a>
+<span class="sourceLineNo">2507</span><a name="line.2507"></a>
+<span class="sourceLineNo">2508</span>    // Setting up region<a name="line.2508"></a>
+<span class="sourceLineNo">2509</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2509"></a>
+<span class="sourceLineNo">2510</span>    // Building checkerList<a name="line.2510"></a>
+<span class="sourceLineNo">2511</span>    List&lt;Cell&gt; kvs = new ArrayList&lt;&gt;();<a name="line.2511"></a>
+<span class="sourceLineNo">2512</span>    kvs.add(new KeyValue(row1, fam1, col1, null));<a name="line.2512"></a>
+<span class="sourceLineNo">2513</span>    kvs.add(new KeyValue(row1, fam1, col2, null));<a name="line.2513"></a>
+<span class="sourceLineNo">2514</span>    kvs.add(new KeyValue(row1, fam1, col3, null));<a name="line.2514"></a>
+<span class="sourceLineNo">2515</span><a name="line.2515"></a>
+<span class="sourceLineNo">2516</span>    NavigableMap&lt;byte[], List&lt;Cell&gt;&gt; deleteMap = new TreeMap&lt;&gt;(Bytes.BYTES_COMPARATOR);<a name="line.2516"></a>
+<span class="sourceLineNo">2517</span>    deleteMap.put(fam1, kvs);<a name="line.2517"></a>
+<span class="sourceLineNo">2518</span>    region.delete(deleteMap, Durability.SYNC_WAL);<a name="line.2518"></a>
+<span class="sourceLineNo">2519</span><a name="line.2519"></a>
+<span class="sourceLineNo">2520</span>    // extract the key values out the memstore:<a name="line.2520"></a>
+<span class="sourceLineNo">2521</span>    // This is kinda hacky, but better than nothing...<a name="line.2521"></a>
+<span class="sourceLineNo">2522</span>    long now = System.currentTimeMillis();<a name="line.2522"></a>
+<span class="sourceLineNo">2523</span>    AbstractMemStore memstore = (AbstractMemStore)region.getStore(fam1).memstore;<a name="line.2523"></a>
+<span class="sourceLineNo">2524</span>    Cell firstCell = memstore.getActive().first();<a name="line.2524"></a>
+<span class="sourceLineNo">2525</span>    assertTrue(firstCell.getTimestamp() &lt;= now);<a name="line.2525"></a>
+<span class="sourceLineNo">2526</span>    now = firstCell.getTimestamp();<a name="line.2526"></a>
+<span class="sourceLineNo">2527</span>    for (Cell cell : memstore.getActive().getCellSet()) {<a name="line.2527"></a>
+<span class="sourceLineNo">2528</span>      assertTrue(cell.getTimestamp() &lt;= now);<a name="line.2528"></a>
+<span class="sourceLineNo">2529</span>      now = cell.getTimestamp();<a name="line.2529"></a>
+<span class="sourceLineNo">2530</span>    }<a name="line.2530"></a>
+<span class="sourceLineNo">2531</span>  }<a name="line.2531"></a>
 <span class="sourceLineNo">2532</span><a name="line.2532"></a>
-<span class="sourceLineNo">2533</span>    // Setting up region<a name="line.2533"></a>
-<span class="sourceLineNo">2534</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2534"></a>
-<span class="sourceLineNo">2535</span>    Get get = new Get(row1);<a name="line.2535"></a>
-<span class="sourceLineNo">2536</span>    get.addColumn(fam2, col1);<a name="line.2536"></a>
-<span class="sourceLineNo">2537</span><a name="line.2537"></a>
-<span class="sourceLineNo">2538</span>    // Test<a name="line.2538"></a>
-<span class="sourceLineNo">2539</span>    try {<a name="line.2539"></a>
-<span class="sourceLineNo">2540</span>      region.get(get);<a name="line.2540"></a>
-<span class="sourceLineNo">2541</span>      fail("Expecting DoNotRetryIOException in get but did not get any");<a name="line.2541"></a>
-<span class="sourceLineNo">2542</span>    } catch (org.apache.hadoop.hbase.DoNotRetryIOException e) {<a name="line.2542"></a>
-<span class="sourceLineNo">2543</span>      LOG.info("Got expected DoNotRetryIOException successfully");<a name="line.2543"></a>
-<span class="sourceLineNo">2544</span>    }<a name="line.2544"></a>
-<span class="sourceLineNo">2545</span>  }<a name="line.2545"></a>
-<span class="sourceLineNo">2546</span><a name="line.2546"></a>
-<span class="sourceLineNo">2547</span>  @Test<a name="line.2547"></a>
-<span class="sourceLineNo">2548</span>  public void testGet_Basic() throws IOException {<a name="line.2548"></a>
-<span class="sourceLineNo">2549</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2549"></a>
-<span class="sourceLineNo">2550</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2550"></a>
-<span class="sourceLineNo">2551</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.2551"></a>
-<span class="sourceLineNo">2552</span>    byte[] col2 = Bytes.toBytes("col2");<a name="line.2552"></a>
-<span class="sourceLineNo">2553</span>    byte[] col3 = Bytes.toBytes("col3");<a name="line.2553"></a>
-<span class="sourceLineNo">2554</span>    byte[] col4 = Bytes.toBytes("col4");<a name="line.2554"></a>
-<span class="sourceLineNo">2555</span>    byte[] col5 = Bytes.toBytes("col5");<a name="line.2555"></a>
+<span class="sourceLineNo">2533</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2533"></a>
+<span class="sourceLineNo">2534</span>  // Get tests<a name="line.2534"></a>
+<span class="sourceLineNo">2535</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2535"></a>
+<span class="sourceLineNo">2536</span>  @Test<a name="line.2536"></a>
+<span class="sourceLineNo">2537</span>  public void testGet_FamilyChecker() throws IOException {<a name="line.2537"></a>
+<span class="sourceLineNo">2538</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2538"></a>
+<span class="sourceLineNo">2539</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2539"></a>
+<span class="sourceLineNo">2540</span>    byte[] fam2 = Bytes.toBytes("False");<a name="line.2540"></a>
+<span class="sourceLineNo">2541</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.2541"></a>
+<span class="sourceLineNo">2542</span><a name="line.2542"></a>
+<span class="sourceLineNo">2543</span>    // Setting up region<a name="line.2543"></a>
+<span class="sourceLineNo">2544</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2544"></a>
+<span class="sourceLineNo">2545</span>    Get get = new Get(row1);<a name="line.2545"></a>
+<span class="sourceLineNo">2546</span>    get.addColumn(fam2, col1);<a name="line.2546"></a>
+<span class="sourceLineNo">2547</span><a name="line.2547"></a>
+<span class="sourceLineNo">2548</span>    // Test<a name="line.2548"></a>
+<span class="sourceLineNo">2549</span>    try {<a name="line.2549"></a>
+<span class="sourceLineNo">2550</span>      region.get(get);<a name="line.2550"></a>
+<span class="sourceLineNo">2551</span>      fail("Expecting DoNotRetryIOException in get but did not get any");<a name="line.2551"></a>
+<span class="sourceLineNo">2552</span>    } catch (org.apache.hadoop.hbase.DoNotRetryIOException e) {<a name="line.2552"></a>
+<span class="sourceLineNo">2553</span>      LOG.info("Got expected DoNotRetryIOException successfully");<a name="line.2553"></a>
+<span class="sourceLineNo">2554</span>    }<a name="line.2554"></a>
+<span class="sourceLineNo">2555</span>  }<a name="line.2555"></a>
 <span class="sourceLineNo">2556</span><a name="line.2556"></a>
-<span class="sourceLineNo">2557</span>    // Setting up region<a name="line.2557"></a>
-<span class="sourceLineNo">2558</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2558"></a>
-<span class="sourceLineNo">2559</span>    // Add to memstore<a name="line.2559"></a>
-<span class="sourceLineNo">2560</span>    Put put = new Put(row1);<a name="line.2560"></a>
-<span class="sourceLineNo">2561</span>    put.addColumn(fam1, col1, null);<a name="line.2561"></a>
-<span class="sourceLineNo">2562</span>    put.addColumn(fam1, col2, null);<a name="line.2562"></a>
-<span class="sourceLineNo">2563</span>    put.addColumn(fam1, col3, null);<a name="line.2563"></a>
-<span class="sourceLineNo">2564</span>    put.addColumn(fam1, col4, null);<a name="line.2564"></a>
-<span class="sourceLineNo">2565</span>    put.addColumn(fam1, col5, null);<a name="line.2565"></a>
-<span class="sourceLineNo">2566</span>    region.put(put);<a name="line.2566"></a>
-<span class="sourceLineNo">2567</span><a name="line.2567"></a>
-<span class="sourceLineNo">2568</span>    Get get = new Get(row1);<a name="line.2568"></a>
-<span class="sourceLineNo">2569</span>    get.addColumn(fam1, col2);<a name="line.2569"></a>
-<span class="sourceLineNo">2570</span>    get.addColumn(fam1, col4);<a name="line.2570"></a>
-<span class="sourceLineNo">2571</span>    // Expected result<a name="line.2571"></a>
-<span class="sourceLineNo">2572</span>    KeyValue kv1 = new KeyValue(row1, fam1, col2);<a name="line.2572"></a>
-<span class="sourceLineNo">2573</span>    KeyValue kv2 = new KeyValue(row1, fam1, col4);<a name="line.2573"></a>
-<span class="sourceLineNo">2574</span>    KeyValue[] expected = { kv1, kv2 };<a name="line.2574"></a>
-<span class="sourceLineNo">2575</span><a name="line.2575"></a>
-<span class="sourceLineNo">2576</span>    // Test<a name="line.2576"></a>
-<span class="sourceLineNo">2577</span>    Result res = region.get(get);<a name="line.2577"></a>
-<span class="sourceLineNo">2578</span>    assertEquals(expected.length, res.size());<a name="line.2578"></a>
-<span class="sourceLineNo">2579</span>    for (int i = 0; i &lt; res.size(); i++) {<a name="line.2579"></a>
-<span class="sourceLineNo">2580</span>      assertTrue(CellUtil.matchingRows(expected[i], res.rawCells()[i]));<a name="line.2580"></a>
-<span class="sourceLineNo">2581</span>      assertTrue(CellUtil.matchingFamily(expected[i], res.rawCells()[i]));<a name="line.2581"></a>
-<span class="sourceLineNo">2582</span>      assertTrue(CellUtil.matchingQualifier(expected[i], res.rawCells()[i]));<a name="line.2582"></a>
-<span class="sourceLineNo">2583</span>    }<a name="line.2583"></a>
-<span class="sourceLineNo">2584</span><a name="line.2584"></a>
-<span class="sourceLineNo">2585</span>    // Test using a filter on a Get<a name="line.2585"></a>
-<span class="sourceLineNo">2586</span>    Get g = new Get(row1);<a name="line.2586"></a>
-<span class="sourceLineNo">2587</span>    final int count = 2;<a name="line.2587"></a>
-<span class="sourceLineNo">2588</span>    g.setFilter(new ColumnCountGetFilter(count));<a name="line.2588"></a>
-<span class="sourceLineNo">2589</span>    res = region.get(g);<a name="line.2589"></a>
-<span class="sourceLineNo">2590</span>    assertEquals(count, res.size());<a name="line.2590"></a>
-<span class="sourceLineNo">2591</span>  }<a name="line.2591"></a>
-<span class="sourceLineNo">2592</span><a name="line.2592"></a>
-<span class="sourceLineNo">2593</span>  @Test<a name="line.2593"></a>
-<span class="sourceLineNo">2594</span>  public void testGet_Empty() throws IOException {<a name="line.2594"></a>
-<span class="sourceLineNo">2595</span>    byte[] row = Bytes.toBytes("row");<a name="line.2595"></a>
-<span class="sourceLineNo">2596</span>    byte[] fam = Bytes.toBytes("fam");<a name="line.2596"></a>
-<span class="sourceLineNo">2597</span><a name="line.2597"></a>
-<span class="sourceLineNo">2598</span>    this.region = initHRegion(tableName, method, CONF, fam);<a name="line.2598"></a>
-<span class="sourceLineNo">2599</span>    Get get = new Get(row);<a name="line.2599"></a>
-<span class="sourceLineNo">2600</span>    get.addFamily(fam);<a name="line.2600"></a>
-<span class="sourceLineNo">2601</span>    Result r = region.get(get);<a name="line.2601"></a>
+<span class="sourceLineNo">2557</span>  @Test<a name="line.2557"></a>
+<span class="sourceLineNo">2558</span>  public void testGet_Basic() throws IOException {<a name="line.2558"></a>
+<span class="sourceLineNo">2559</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2559"></a>
+<span class="sourceLineNo">2560</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2560"></a>
+<span class="sourceLineNo">2561</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.2561"></a>
+<span class="sourceLineNo">2562</span>    byte[] col2 = Bytes.toBytes("col2");<a name="line.2562"></a>
+<span class="sourceLineNo">2563</span>    byte[] col3 = Bytes.toBytes("col3");<a name="line.2563"></a>
+<span class="sourceLineNo">2564</span>    byte[] col4 = Bytes.toBytes("col4");<a name="line.2564"></a>
+<span class="sourceLineNo">2565</span>    byte[] col5 = Bytes.toBytes("col5");<a name="line.2565"></a>
+<span class="sourceLineNo">2566</span><a name="line.2566"></a>
+<span class="sourceLineNo">2567</span>    // Setting up region<a name="line.2567"></a>
+<span class="sourceLineNo">2568</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.2568"></a>
+<span class="sourceLineNo">2569</span>    // Add to memstore<a name="line.2569"></a>
+<span class="sourceLineNo">2570</span>    Put put = new Put(row1);<a name="line.2570"></a>
+<span class="sourceLineNo">2571</span>    put.addColumn(fam1, col1, null);<a name="line.2571"></a>
+<span class="sourceLineNo">2572</span>    put.addColumn(fam1, col2, null);<a name="line.2572"></a>
+<span class="sourceLineNo">2573</span>    put.addColumn(fam1, col3, null);<a name="line.2573"></a>
+<span class="sourceLineNo">2574</span>    put.addColumn(fam1, col4, null);<a name="line.2574"></a>
+<span class="sourceLineNo">2575</span>    put.addColumn(fam1, col5, null);<a name="line.2575"></a>
+<span class="sourceLineNo">2576</span>    region.put(put);<a name="line.2576"></a>
+<span class="sourceLineNo">2577</span><a name="line.2577"></a>
+<span class="sourceLineNo">2578</span>    Get get = new Get(row1);<a name="line.2578"></a>
+<span class="sourceLineNo">2579</span>    get.addColumn(fam1, col2);<a name="line.2579"></a>
+<span class="sourceLineNo">2580</span>    get.addColumn(fam1, col4);<a name="line.2580"></a>
+<span class="sourceLineNo">2581</span>    // Expected result<a name="line.2581"></a>
+<span class="sourceLineNo">2582</span>    KeyValue kv1 = new KeyValue(row1, fam1, col2);<a name="line.2582"></a>
+<span class="sourceLineNo">2583</span>    KeyValue kv2 = new KeyValue(row1, fam1, col4);<a name="line.2583"></a>
+<span class="sourceLineNo">2584</span>    KeyValue[] expected = { kv1, kv2 };<a name="line.2584"></a>
+<span class="sourceLineNo">2585</span><a name="line.2585"></a>
+<span class="sourceLineNo">2586</span>    // Test<a name="line.2586"></a>
+<span class="sourceLineNo">2587</span>    Result res = region.get(get);<a name="line.2587"></a>
+<span class="sourceLineNo">2588</span>    assertEquals(expected.length, res.size());<a name="line.2588"></a>
+<span class="sourceLineNo">2589</span>    for (int i = 0; i &lt; res.size(); i++) {<a name="line.2589"></a>
+<span class="sourceLineNo">2590</span>      assertTrue(CellUtil.matchingRows(expected[i], res.rawCells()[i]));<a name="line.2590"></a>
+<span class="sourceLineNo">2591</span>      assertTrue(CellUtil.matchingFamily(expected[i], res.rawCells()[i]));<a name="line.2591"></a>
+<span class="sourceLineNo">2592</span>      assertTrue(CellUtil.matchingQualifier(expected[i], res.rawCells()[i]));<a name="line.2592"></a>
+<span class="sourceLineNo">2593</span>    }<a name="line.2593"></a>
+<span class="sourceLineNo">2594</span><a name="line.2594"></a>
+<span class="sourceLineNo">2595</span>    // Test using a filter on a Get<a name="line.2595"></a>
+<span class="sourceLineNo">2596</span>    Get g = new Get(row1);<a name="line.2596"></a>
+<span class="sourceLineNo">2597</span>    final int count = 2;<a name="line.2597"></a>
+<span class="sourceLineNo">2598</span>    g.setFilter(new ColumnCountGetFilter(count));<a name="line.2598"></a>
+<span class="sourceLineNo">2599</span>    res = region.get(g);<a name="line.2599"></a>
+<span class="sourceLineNo">2600</span>    assertEquals(count, res.size());<a name="line.2600"></a>
+<span class="sourceLineNo">2601</span>  }<a name="line.2601"></a>
 <span class="sourceLineNo">2602</span><a name="line.2602"></a>
-<span class="sourceLineNo">2603</span>    assertTrue(r.isEmpty());<a name="line.2603"></a>
-<span class="sourceLineNo">2604</span>  }<a name="line.2604"></a>
-<span class="sourceLineNo">2605</span><a name="line.2605"></a>
-<span class="sourceLineNo">2606</span>  @Test<a name="line.2606"></a>
-<span class="sourceLineNo">2607</span>  public void testGetWithFilter() throws IOException, InterruptedException {<a name="line.2607"></a>
-<span class="sourceLineNo">2608</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2608"></a>
-<span class="sourceLineNo">2609</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2609"></a>
-<span class="sourceLineNo">2610</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.2610"></a>
-<span class="sourceLineNo">2611</span>    byte[] value1 = Bytes.toBytes("value1");<a name="line.2611"></a>
-<span class="sourceLineNo">2612</span>    byte[] value2 = Bytes.toBytes("value2");<a name="line.2612"></a>
-<span class="sourceLineNo">2613</span><a name="line.2613"></a>
-<span class="sourceLineNo">2614</span>    final int maxVersions = 3;<a name="line.2614"></a>
-<span class="sourceLineNo">2615</span>    HColumnDescriptor hcd = new HColumnDescriptor(fam1);<a name="line.2615"></a>
-<span class="sourceLineNo">2616</span>    hcd.setMaxVersions(maxVersions);<a name="line.2616"></a>
-<span class="sourceLineNo">2617</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf("testFilterAndColumnTracker"));<a name="line.2617"></a>
-<span class="sourceLineNo">2618</span>    htd.addFamily(hcd);<a name="line.2618"></a>
-<span class="sourceLineNo">2619</span>    ChunkCreator.initialize(MemStoreLABImpl.CHUNK_SIZE_DEFAULT, false, 0, 0, 0, null);<a name="line.2619"></a>
-<span class="sourceLineNo">2620</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.2620"></a>
-<span class="sourceLineNo">2621</span>    Path logDir = TEST_UTIL.getDataTestDirOnTestFS(method + ".log");<a name="line.2621"></a>
-<span class="sourceLineNo">2622</span>    final WAL wal = HBaseTestingUtility.createWal(TEST_UTIL.getConfiguration(), logDir, info);<a name="line.2622"></a>
-<span class="sourceLineNo">2623</span>    this.region = TEST_UTIL.createLocalHRegion(info, htd, wal);<a name="line.2623"></a>
-<span class="sourceLineNo">2624</span><a name="line.2624"></a>
-<span class="sourceLineNo">2625</span>    // Put 4 version to memstore<a name="line.2625"></a>
-<span class="sourceLineNo">2626</span>    long ts = 0;<a name="line.2626"></a>
-<span class="sourceLineNo">2627</span>    Put put = new Put(row1, ts);<a name="line.2627"></a>
-<span class="sourceLineNo">2628</span>    put.addColumn(fam1, col1, value1);<a name="line.2628"></a>
-<span class="sourceLineNo">2629</span>    region.put(put);<a name="line.2629"></a>
-<span class="sourceLineNo">2630</span>    put = new Put(row1, ts + 1);<a name="line.2630"></a>
-<span class="sourceLineNo">2631</span>    put.addColumn(fam1, col1, Bytes.toBytes("filter1"));<a name="line.2631"></a>
-<span class="sourceLineNo">2632</span>    region.put(put);<a name="line.2632"></a>
-<span class="sourceLineNo">2633</span>    put = new Put(row1, ts + 2);<a name="line.2633"></a>
-<span class="sourceLineNo">2634</span>    put.addColumn(fam1, col1, Bytes.toBytes("filter2"));<a name="line.2634"></a>
-<span class="sourceLineNo">2635</span>    region.put(put);<a name="line.2635"></a>
-<span class="sourceLineNo">2636</span>    put = new Put(row1, ts + 3);<a name="line.2636"></a>
-<span class="sourceLineNo">2637</span>    put.addColumn(fam1, col1, value2);<a name="line.2637"></a>
-<span class="sourceLineNo">2638</span>    region.put(put);<a name="line.2638"></a>
-<span class="sourceLineNo">2639</span><a name="line.2639"></a>
-<span class="sourceLineNo">2640</span>    Get get = new Get(row1);<a name="line.2640"></a>
-<span class="sourceLineNo">2641</span>    get.readAllVersions();<a name="line.2641"></a>
-<span class="sourceLineNo">2642</span>    Result res = region.get(get);<a name="line.2642"></a>
-<span class="sourceLineNo">2643</span>    // Get 3 versions, the oldest version has gone from user view<a name="line.2643"></a>
-<span class="sourceLineNo">2644</span>    assertEquals(maxVersions, res.size());<a name="line.2644"></a>
-<span class="sourceLineNo">2645</span><a name="line.2645"></a>
-<span class="sourceLineNo">2646</span>    get.setFilter(new ValueFilter(CompareOperator.EQUAL, new SubstringComparator("value")));<a name="line.2646"></a>
-<span class="sourceLineNo">2647</span>    res = region.get(get);<a name="line.2647"></a>
-<span class="sourceLineNo">2648</span>    // When use value filter, the oldest version should still gone from user view and it<a name="line.2648"></a>
-<span class="sourceLineNo">2649</span>    // should only return one key vaule<a name="line.2649"></a>
-<span class="sourceLineNo">2650</span>    assertEquals(1, res.size());<a name="line.2650"></a>
-<span class="sourceLineNo">2651</span>    assertTrue(CellUtil.matchingValue(new KeyValue(row1, fam1, col1, value2), res.rawCells()[0]));<a name="line.2651"></a>
-<span class="sourceLineNo">2652</span>    assertEquals(ts + 3, res.rawCells()[0].getTimestamp());<a name="line.2652"></a>
-<span class="sourceLineNo">2653</span><a name="line.2653"></a>
-<span class="sourceLineNo">2654</span>    region.flush(true);<a name="line.2654"></a>
-<span class="sourceLineNo">2655</span>    region.compact(true);<a name="line.2655"></a>
-<span class="sourceLineNo">2656</span>    Thread.sleep(1000);<a name="line.2656"></a>
+<span class="sourceLineNo">2603</span>  @Test<a name="line.2603"></a>
+<span class="sourceLineNo">2604</span>  public void testGet_Empty() throws IOException {<a name="line.2604"></a>
+<span class="sourceLineNo">2605</span>    byte[] row = Bytes.toBytes("row");<a name="line.2605"></a>
+<span class="sourceLineNo">2606</span>    byte[] fam = Bytes.toBytes("fam");<a name="line.2606"></a>
+<span class="sourceLineNo">2607</span><a name="line.2607"></a>
+<span class="sourceLineNo">2608</span>    this.region = initHRegion(tableName, method, CONF, fam);<a name="line.2608"></a>
+<span class="sourceLineNo">2609</span>    Get get = new Get(row);<a name="line.2609"></a>
+<span class="sourceLineNo">2610</span>    get.addFamily(fam);<a name="line.2610"></a>
+<span class="sourceLineNo">2611</span>    Result r = region.get(get);<a name="line.2611"></a>
+<span class="sourceLineNo">2612</span><a name="line.2612"></a>
+<span class="sourceLineNo">2613</span>    assertTrue(r.isEmpty());<a name="line.2613"></a>
+<span class="sourceLineNo">2614</span>  }<a name="line.2614"></a>
+<span class="sourceLineNo">2615</span><a name="line.2615"></a>
+<span class="sourceLineNo">2616</span>  @Test<a name="line.2616"></a>
+<span class="sourceLineNo">2617</span>  public void testGetWithFilter() throws IOException, InterruptedException {<a name="line.2617"></a>
+<span class="sourceLineNo">2618</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2618"></a>
+<span class="sourceLineNo">2619</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2619"></a>
+<span class="sourceLineNo">2620</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.2620"></a>
+<span class="sourceLineNo">2621</span>    byte[] value1 = Bytes.toBytes("value1");<a name="line.2621"></a>
+<span class="sourceLineNo">2622</span>    byte[] value2 = Bytes.toBytes("value2");<a name="line.2622"></a>
+<span class="sourceLineNo">2623</span><a name="line.2623"></a>
+<span class="sourceLineNo">2624</span>    final int maxVersions = 3;<a name="line.2624"></a>
+<span class="sourceLineNo">2625</span>    HColumnDescriptor hcd = new HColumnDescriptor(fam1);<a name="line.2625"></a>
+<span class="sourceLineNo">2626</span>    hcd.setMaxVersions(maxVersions);<a name="line.2626"></a>
+<span class="sourceLineNo">2627</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf("testFilterAndColumnTracker"));<a name="line.2627"></a>
+<span class="sourceLineNo">2628</span>    htd.addFamily(hcd);<a name="line.2628"></a>
+<span class="sourceLineNo">2629</span>    ChunkCreator.initialize(MemStoreLABImpl.CHUNK_SIZE_DEFAULT, false, 0, 0, 0, null);<a name="line.2629"></a>
+<span class="sourceLineNo">2630</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.2630"></a>
+<span class="sourceLineNo">2631</span>    Path logDir = TEST_UTIL.getDataTestDirOnTestFS(method + ".log");<a name="line.2631"></a>
+<span class="sourceLineNo">2632</span>    final WAL wal = HBaseTestingUtility.createWal(TEST_UTIL.getConfiguration(), logDir, info);<a name="line.2632"></a>
+<span class="sourceLineNo">2633</span>    this.region = TEST_UTIL.createLocalHRegion(info, htd, wal);<a name="line.2633"></a>
+<span class="sourceLineNo">2634</span><a name="line.2634"></a>
+<span class="sourceLineNo">2635</span>    // Put 4 version to memstore<a name="line.2635"></a>
+<span class="sourceLineNo">2636</span>    long ts = 0;<a name="line.2636"></a>
+<span class="sourceLineNo">2637</span>    Put put = new Put(row1, ts);<a name="line.2637"></a>
+<span class="sourceLineNo">2638</span>    put.addColumn(fam1, col1, value1);<a name="line.2638"></a>
+<span class="sourceLineNo">2639</span>    region.put(put);<a name="line.2639"></a>
+<span class="sourceLineNo">2640</span>    put = new Put(row1, ts + 1);<a name="line.2640"></a>
+<span class="sourceLineNo">2641</span>    put.addColumn(fam1, col1, Bytes.toBytes("filter1"));<a name="line.2641"></a>
+<span class="sourceLineNo">2642</span>    region.put(put);<a name="line.2642"></a>
+<span class="sourceLineNo">2643</span>    put = new Put(row1, ts + 2);<a name="line.2643"></a>
+<span class="sourceLineNo">2644</span>    put.addColumn(fam1, col1, Bytes.toBytes("filter2"));<a name="line.2644"></a>
+<span class="sourceLineNo">2645</span>    region.put(put);<a name="line.2645"></a>
+<span class="sourceLineNo">2646</span>    put = new Put(row1, ts + 3);<a name="line.2646"></a>
+<span class="sourceLineNo">2647</span>    put.addColumn(fam1, col1, value2);<a name="line.2647"></a>
+<span class="sourceLineNo">2648</span>    region.put(put);<a name="line.2648"></a>
+<span class="sourceLineNo">2649</span><a name="line.2649"></a>
+<span class="sourceLineNo">2650</span>    Get get = new Get(row1);<a name="line.2650"></a>
+<span class="sourceLineNo">2651</span>    get.readAllVersions();<a name="line.2651"></a>
+<span class="sourceLineNo">2652</span>    Result res = region.get(get);<a name="line.2652"></a>
+<span class="sourceLineNo">2653</span>    // Get 3 versions, the oldest version has gone from user view<a name="line.2653"></a>
+<span class="sourceLineNo">2654</span>    assertEquals(maxVersions, res.size());<a name="line.2654"></a>
+<span class="sourceLineNo">2655</span><a name="line.2655"></a>
+<span class="sourceLineNo">2656</span>    get.setFilter(new ValueFilter(CompareOperator.EQUAL, new SubstringComparator("value")));<a name="line.2656"></a>
 <span class="sourceLineNo">2657</span>    res = region.get(get);<a name="line.2657"></a>
-<span class="sourceLineNo">2658</span>    // After flush and compact, the result should be consistent with previous result<a name="line.2658"></a>
-<span class="sourceLineNo">2659</span>    assertEquals(1, res.size());<a name="line.2659"></a>
-<span class="sourceLineNo">2660</span>    assertTrue(CellUtil.matchingValue(new KeyValue(row1, fam1, col1, value2), res.rawCells()[0]));<a name="line.2660"></a>
-<span class="sourceLineNo">2661</span>  }<a name="line.2661"></a>
-<span class="sourceLineNo">2662</span><a name="line.2662"></a>
-<span class="sourceLineNo">2663</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2663"></a>
-<span class="sourceLineNo">2664</span>  // Scanner tests<a name="line.2664"></a>
-<span class="sourceLineNo">2665</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2665"></a>
-<span class="sourceLineNo">2666</span>  @Test<a name="line.2666"></a>
-<span class="sourceLineNo">2667</span>  public void testGetScanner_WithOkFamilies() throws IOException {<a name="line.2667"></a>
-<span class="sourceLineNo">2668</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2668"></a>
-<span class="sourceLineNo">2669</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2669"></a>
-<span class="sourceLineNo">2670</span><a name="line.2670"></a>
-<span class="sourceLineNo">2671</span>    byte[][] families = { fam1, fam2 };<a name="line.2671"></a>
+<span class="sourceLineNo">2658</span>    // When use value filter, the oldest version should still gone from user view and it<a name="line.2658"></a>
+<span class="sourceLineNo">2659</span>    // should only return one key vaule<a name="line.2659"></a>
+<span class="sourceLineNo">2660</span>    assertEquals(1, res.size());<a name="line.2660"></a>
+<span class="sourceLineNo">2661</span>    assertTrue(CellUtil.matchingValue(new KeyValue(row1, fam1, col1, value2), res.rawCells()[0]));<a name="line.2661"></a>
+<span class="sourceLineNo">2662</span>    assertEquals(ts + 3, res.rawCells()[0].getTimestamp());<a name="line.2662"></a>
+<span class="sourceLineNo">2663</span><a name="line.2663"></a>
+<span class="sourceLineNo">2664</span>    region.flush(true);<a name="line.2664"></a>
+<span class="sourceLineNo">2665</span>    region.compact(true);<a name="line.2665"></a>
+<span class="sourceLineNo">2666</span>    Thread.sleep(1000);<a name="line.2666"></a>
+<span class="sourceLineNo">2667</span>    res = region.get(get);<a name="line.2667"></a>
+<span class="sourceLineNo">2668</span>    // After flush and compact, the result should be consistent with previous result<a name="line.2668"></a>
+<span class="sourceLineNo">2669</span>    assertEquals(1, res.size());<a name="line.2669"></a>
+<span class="sourceLineNo">2670</span>    assertTrue(CellUtil.matchingValue(new KeyValue(row1, fam1, col1, value2), res.rawCells()[0]));<a name="line.2670"></a>
+<span class="sourceLineNo">2671</span>  }<a name="line.2671"></a>
 <span class="sourceLineNo">2672</span><a name="line.2672"></a>
-<span class="sourceLineNo">2673</span>    // Setting up region<a name="line.2673"></a>
-<span class="sourceLineNo">2674</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2674"></a>
-<span class="sourceLineNo">2675</span>    Scan scan = new Scan();<a name="line.2675"></a>
-<span class="sourceLineNo">2676</span>    scan.addFamily(fam1);<a name="line.2676"></a>
-<span class="sourceLineNo">2677</span>    scan.addFamily(fam2);<a name="line.2677"></a>
-<span class="sourceLineNo">2678</span>    try {<a name="line.2678"></a>
-<span class="sourceLineNo">2679</span>      region.getScanner(scan);<a name="line.2679"></a>
-<span class="sourceLineNo">2680</span>    } catch (Exception e) {<a name="line.2680"></a>
-<span class="sourceLineNo">2681</span>      assertTrue("Families could not be found in Region", false);<a name="line.2681"></a>
-<span class="sourceLineNo">2682</span>    }<a name="line.2682"></a>
-<span class="sourceLineNo">2683</span>  }<a name="line.2683"></a>
-<span class="sourceLineNo">2684</span><a name="line.2684"></a>
-<span class="sourceLineNo">2685</span>  @Test<a name="line.2685"></a>
-<span class="sourceLineNo">2686</span>  public void testGetScanner_WithNotOkFamilies() throws IOException {<a name="line.2686"></a>
-<span class="sourceLineNo">2687</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2687"></a>
-<span class="sourceLineNo">2688</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2688"></a>
-<span class="sourceLineNo">2689</span><a name="line.2689"></a>
-<span class="sourceLineNo">2690</span>    byte[][] families = { fam1 };<a name="line.2690"></a>
-<span class="sourceLineNo">2691</span><a name="line.2691"></a>
-<span class="sourceLineNo">2692</span>    // Setting up region<a name="line.2692"></a>
-<span class="sourceLineNo">2693</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2693"></a>
-<span class="sourceLineNo">2694</span>    Scan scan = new Scan();<a name="line.2694"></a>
-<span class="sourceLineNo">2695</span>    scan.addFamily(fam2);<a name="line.2695"></a>
-<span class="sourceLineNo">2696</span>    boolean ok = false;<a name="line.2696"></a>
-<span class="sourceLineNo">2697</span>    try {<a name="line.2697"></a>
-<span class="sourceLineNo">2698</span>      region.getScanner(scan);<a name="line.2698"></a>
-<span class="sourceLineNo">2699</span>    } catch (Exception e) {<a name="line.2699"></a>
-<span class="sourceLineNo">2700</span>      ok = true;<a name="line.2700"></a>
-<span class="sourceLineNo">2701</span>    }<a name="line.2701"></a>
-<span class="sourceLineNo">2702</span>    assertTrue("Families could not be found in Region", ok);<a name="line.2702"></a>
-<span class="sourceLineNo">2703</span>  }<a name="line.2703"></a>
-<span class="sourceLineNo">2704</span><a name="line.2704"></a>
-<span class="sourceLineNo">2705</span>  @Test<a name="line.2705"></a>
-<span class="sourceLineNo">2706</span>  public void testGetScanner_WithNoFamilies() throws IOException {<a name="line.2706"></a>
-<span class="sourceLineNo">2707</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2707"></a>
-<span class="sourceLineNo">2708</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2708"></a>
-<span class="sourceLineNo">2709</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2709"></a>
-<span class="sourceLineNo">2710</span>    byte[] fam3 = Bytes.toBytes("fam3");<a name="line.2710"></a>
-<span class="sourceLineNo">2711</span>    byte[] fam4 = Bytes.toBytes("fam4");<a name="line.2711"></a>
-<span class="sourceLineNo">2712</span><a name="line.2712"></a>
-<span class="sourceLineNo">2713</span>    byte[][] families = { fam1, fam2, fam3, fam4 };<a name="line.2713"></a>
+<span class="sourceLineNo">2673</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2673"></a>
+<span class="sourceLineNo">2674</span>  // Scanner tests<a name="line.2674"></a>
+<span class="sourceLineNo">2675</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.2675"></a>
+<span class="sourceLineNo">2676</span>  @Test<a name="line.2676"></a>
+<span class="sourceLineNo">2677</span>  public void testGetScanner_WithOkFamilies() throws IOException {<a name="line.2677"></a>
+<span class="sourceLineNo">2678</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2678"></a>
+<span class="sourceLineNo">2679</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2679"></a>
+<span class="sourceLineNo">2680</span><a name="line.2680"></a>
+<span class="sourceLineNo">2681</span>    byte[][] families = { fam1, fam2 };<a name="line.2681"></a>
+<span class="sourceLineNo">2682</span><a name="line.2682"></a>
+<span class="sourceLineNo">2683</span>    // Setting up region<a name="line.2683"></a>
+<span class="sourceLineNo">2684</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2684"></a>
+<span class="sourceLineNo">2685</span>    Scan scan = new Scan();<a name="line.2685"></a>
+<span class="sourceLineNo">2686</span>    scan.addFamily(fam1);<a name="line.2686"></a>
+<span class="sourceLineNo">2687</span>    scan.addFamily(fam2);<a name="line.2687"></a>
+<span class="sourceLineNo">2688</span>    try {<a name="line.2688"></a>
+<span class="sourceLineNo">2689</span>      region.getScanner(scan);<a name="line.2689"></a>
+<span class="sourceLineNo">2690</span>    } catch (Exception e) {<a name="line.2690"></a>
+<span class="sourceLineNo">2691</span>      assertTrue("Families could not be found in Region", false);<a name="line.2691"></a>
+<span class="sourceLineNo">2692</span>    }<a name="line.2692"></a>
+<span class="sourceLineNo">2693</span>  }<a name="line.2693"></a>
+<span class="sourceLineNo">2694</span><a name="line.2694"></a>
+<span class="sourceLineNo">2695</span>  @Test<a name="line.2695"></a>
+<span class="sourceLineNo">2696</span>  public void testGetScanner_WithNotOkFamilies() throws IOException {<a name="line.2696"></a>
+<span class="sourceLineNo">2697</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2697"></a>
+<span class="sourceLineNo">2698</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2698"></a>
+<span class="sourceLineNo">2699</span><a name="line.2699"></a>
+<span class="sourceLineNo">2700</span>    byte[][] families = { fam1 };<a name="line.2700"></a>
+<span class="sourceLineNo">2701</span><a name="line.2701"></a>
+<span class="sourceLineNo">2702</span>    // Setting up region<a name="line.2702"></a>
+<span class="sourceLineNo">2703</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2703"></a>
+<span class="sourceLineNo">2704</span>    Scan scan = new Scan();<a name="line.2704"></a>
+<span class="sourceLineNo">2705</span>    scan.addFamily(fam2);<a name="line.2705"></a>
+<span class="sourceLineNo">2706</span>    boolean ok = false;<a name="line.2706"></a>
+<span class="sourceLineNo">2707</span>    try {<a name="line.2707"></a>
+<span class="sourceLineNo">2708</span>      region.getScanner(scan);<a name="line.2708"></a>
+<span class="sourceLineNo">2709</span>    } catch (Exception e) {<a name="line.2709"></a>
+<span class="sourceLineNo">2710</span>      ok = true;<a name="line.2710"></a>
+<span class="sourceLineNo">2711</span>    }<a name="line.2711"></a>
+<span class="sourceLineNo">2712</span>    assertTrue("Families could not be found in Region", ok);<a name="line.2712"></a>
+<span class="sourceLineNo">2713</span>  }<a name="line.2713"></a>
 <span class="sourceLineNo">2714</span><a name="line.2714"></a>
-<span class="sourceLineNo">2715</span>    // Setting up region<a name="line.2715"></a>
-<span class="sourceLineNo">2716</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2716"></a>
-<span class="sourceLineNo">2717</span>    // Putting data in Region<a name="line.2717"></a>
-<span class="sourceLineNo">2718</span>    Put put = new Put(row1);<a name="line.2718"></a>
-<span class="sourceLineNo">2719</span>    put.addColumn(fam1, null, null);<a name="line.2719"></a>
-<span class="sourceLineNo">2720</span>    put.addColumn(fam2, null, null);<a name="line.2720"></a>
-<span class="sourceLineNo">2721</span>    put.addColumn(fam3, null, null);<a name="line.2721"></a>
-<span class="sourceLineNo">2722</span>    put.addColumn(fam4, null, null);<a name="line.2722"></a>
-<span class="sourceLineNo">2723</span>    region.put(put);<a name="line.2723"></a>
+<span class="sourceLineNo">2715</span>  @Test<a name="line.2715"></a>
+<span class="sourceLineNo">2716</span>  public void testGetScanner_WithNoFamilies() throws IOException {<a name="line.2716"></a>
+<span class="sourceLineNo">2717</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2717"></a>
+<span class="sourceLineNo">2718</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2718"></a>
+<span class="sourceLineNo">2719</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2719"></a>
+<span class="sourceLineNo">2720</span>    byte[] fam3 = Bytes.toBytes("fam3");<a name="line.2720"></a>
+<span class="sourceLineNo">2721</span>    byte[] fam4 = Bytes.toBytes("fam4");<a name="line.2721"></a>
+<span class="sourceLineNo">2722</span><a name="line.2722"></a>
+<span class="sourceLineNo">2723</span>    byte[][] families = { fam1, fam2, fam3, fam4 };<a name="line.2723"></a>
 <span class="sourceLineNo">2724</span><a name="line.2724"></a>
-<span class="sourceLineNo">2725</span>    Scan scan = null;<a name="line.2725"></a>
-<span class="sourceLineNo">2726</span>    HRegion.RegionScannerImpl is = null;<a name="line.2726"></a>
-<span class="sourceLineNo">2727</span><a name="line.2727"></a>
-<span class="sourceLineNo">2728</span>    // Testing to see how many scanners that is produced by getScanner,<a name="line.2728"></a>
-<span class="sourceLineNo">2729</span>    // starting<a name="line.2729"></a>
-<span class="sourceLineNo">2730</span>    // with known number, 2 - current = 1<a name="line.2730"></a>
-<span class="sourceLineNo">2731</span>    scan = new Scan();<a name="line.2731"></a>
-<span class="sourceLineNo">2732</span>    scan.addFamily(fam2);<a name="line.2732"></a>
-<span class="sourceLineNo">2733</span>    scan.addFamily(fam4);<a name="line.2733"></a>
-<span class="sourceLineNo">2734</span>    is = region.getScanner(scan);<a name="line.2734"></a>
-<span class="sourceLineNo">2735</span>    assertEquals(1, is.storeHeap.getHeap().size());<a name="line.2735"></a>
-<span class="sourceLineNo">2736</span><a name="line.2736"></a>
-<span class="sourceLineNo">2737</span>    scan = new Scan();<a name="line.2737"></a>
-<span class="sourceLineNo">2738</span>    is = region.getScanner(scan);<a name="line.2738"></a>
-<span class="sourceLineNo">2739</span>    assertEquals(families.length - 1, is.storeHeap.getHeap().size());<a name="line.2739"></a>
-<span class="sourceLineNo">2740</span>  }<a name="line.2740"></a>
-<span class="sourceLineNo">2741</span><a name="line.2741"></a>
-<span class="sourceLineNo">2742</span>  /**<a name="line.2742"></a>
-<span class="sourceLineNo">2743</span>   * This method tests https://issues.apache.org/jira/browse/HBASE-2516.<a name="line.2743"></a>
-<span class="sourceLineNo">2744</span>   *<a name="line.2744"></a>
-<span class="sourceLineNo">2745</span>   * @throws IOException<a name="line.2745"></a>
-<span class="sourceLineNo">2746</span>   */<a name="line.2746"></a>
-<span class="sourceLineNo">2747</span>  @Test<a name="line.2747"></a>
-<span class="sourceLineNo">2748</span>  public void testGetScanner_WithRegionClosed() throws IOException {<a name="line.2748"></a>
-<span class="sourceLineNo">2749</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2749"></a>
-<span class="sourceLineNo">2750</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2750"></a>
+<span class="sourceLineNo">2725</span>    // Setting up region<a name="line.2725"></a>
+<span class="sourceLineNo">2726</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2726"></a>
+<span class="sourceLineNo">2727</span>    // Putting data in Region<a name="line.2727"></a>
+<span class="sourceLineNo">2728</span>    Put put = new Put(row1);<a name="line.2728"></a>
+<span class="sourceLineNo">2729</span>    put.addColumn(fam1, null, null);<a name="line.2729"></a>
+<span class="sourceLineNo">2730</span>    put.addColumn(fam2, null, null);<a name="line.2730"></a>
+<span class="sourceLineNo">2731</span>    put.addColumn(fam3, null, null);<a name="line.2731"></a>
+<span class="sourceLineNo">2732</span>    put.addColumn(fam4, null, null);<a name="line.2732"></a>
+<span class="sourceLineNo">2733</span>    region.put(put);<a name="line.2733"></a>
+<span class="sourceLineNo">2734</span><a name="line.2734"></a>
+<span class="sourceLineNo">2735</span>    Scan scan = null;<a name="line.2735"></a>
+<span class="sourceLineNo">2736</span>    HRegion.RegionScannerImpl is = null;<a name="line.2736"></a>
+<span class="sourceLineNo">2737</span><a name="line.2737"></a>
+<span class="sourceLineNo">2738</span>    // Testing to see how many scanners that is produced by getScanner,<a name="line.2738"></a>
+<span class="sourceLineNo">2739</span>    // starting<a name="line.2739"></a>
+<span class="sourceLineNo">2740</span>    // with known number, 2 - current = 1<a name="line.2740"></a>
+<span class="sourceLineNo">2741</span>    scan = new Scan();<a name="line.2741"></a>
+<span class="sourceLineNo">2742</span>    scan.addFamily(fam2);<a name="line.2742"></a>
+<span class="sourceLineNo">2743</span>    scan.addFamily(fam4);<a name="line.2743"></a>
+<span class="sourceLineNo">2744</span>    is = region.getScanner(scan);<a name="line.2744"></a>
+<span class="sourceLineNo">2745</span>    assertEquals(1, is.storeHeap.getHeap().size());<a name="line.2745"></a>
+<span class="sourceLineNo">2746</span><a name="line.2746"></a>
+<span class="sourceLineNo">2747</span>    scan = new Scan();<a name="line.2747"></a>
+<span class="sourceLineNo">2748</span>    is = region.getScanner(scan);<a name="line.2748"></a>
+<span class="sourceLineNo">2749</span>    assertEquals(families.length - 1, is.storeHeap.getHeap().size());<a name="line.2749"></a>
+<span class="sourceLineNo">2750</span>  }<a name="line.2750"></a>
 <span class="sourceLineNo">2751</span><a name="line.2751"></a>
-<span class="sourceLineNo">2752</span>    byte[][] families = { fam1, fam2 };<a name="line.2752"></a>
-<span class="sourceLineNo">2753</span><a name="line.2753"></a>
-<span class="sourceLineNo">2754</span>    // Setting up region<a name="line.2754"></a>
-<span class="sourceLineNo">2755</span>    try {<a name="line.2755"></a>
-<span class="sourceLineNo">2756</span>      this.region = initHRegion(tableName, method, CONF, families);<a name="line.2756"></a>
-<span class="sourceLineNo">2757</span>    } catch (IOException e) {<a name="line.2757"></a>
-<span class="sourceLineNo">2758</span>      e.printStackTrace();<a name="line.2758"></a>
-<span class="sourceLineNo">2759</span>      fail("Got IOException during initHRegion, " + e.getMessage());<a name="line.2759"></a>
-<span class="sourceLineNo">2760</span>    }<a name="line.2760"></a>
-<span class="sourceLineNo">2761</span>    region.closed.set(true);<a name="line.2761"></a>
-<span class="sourceLineNo">2762</span>    try {<a name="line.2762"></a>
-<span class="sourceLineNo">2763</span>      region.getScanner(null);<a name="line.2763"></a>
-<span class="sourceLineNo">2764</span>      fail("Expected to get an exception during getScanner on a region that is closed");<a name="line.2764"></a>
-<span class="sourceLineNo">2765</span>    } catch (NotServingRegionException e) {<a name="line.2765"></a>
-<span class="sourceLineNo">2766</span>      // this is the correct exception that is expected<a name="line.2766"></a>
+<span class="sourceLineNo">2752</span>  /**<a name="line.2752"></a>
+<span class="sourceLineNo">2753</span>   * This method tests https://issues.apache.org/jira/browse/HBASE-2516.<a name="line.2753"></a>
+<span class="sourceLineNo">2754</span>   *<a name="line.2754"></a>
+<span class="sourceLineNo">2755</span>   * @throws IOException<a name="line.2755"></a>
+<span class="sourceLineNo">2756</span>   */<a name="line.2756"></a>
+<span class="sourceLineNo">2757</span>  @Test<a name="line.2757"></a>
+<span class="sourceLineNo">2758</span>  public void testGetScanner_WithRegionClosed() throws IOException {<a name="line.2758"></a>
+<span class="sourceLineNo">2759</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2759"></a>
+<span class="sourceLineNo">2760</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2760"></a>
+<span class="sourceLineNo">2761</span><a name="line.2761"></a>
+<span class="sourceLineNo">2762</span>    byte[][] families = { fam1, fam2 };<a name="line.2762"></a>
+<span class="sourceLineNo">2763</span><a name="line.2763"></a>
+<span class="sourceLineNo">2764</span>    // Setting up region<a name="line.2764"></a>
+<span class="sourceLineNo">2765</span>    try {<a name="line.2765"></a>
+<span class="sourceLineNo">2766</span>      this.region = initHRegion(tableName, method, CONF, families);<a name="line.2766"></a>
 <span class="sourceLineNo">2767</span>    } catch (IOException e) {<a name="line.2767"></a>
-<span class="sourceLineNo">2768</span>      fail("Got wrong type of exception - should be a NotServingRegionException, " +<a name="line.2768"></a>
-<span class="sourceLineNo">2769</span>          "but was an IOException: "<a name="line.2769"></a>
-<span class="sourceLineNo">2770</span>          + e.getMessage());<a name="line.2770"></a>
-<span class="sourceLineNo">2771</span>    }<a name="line.2771"></a>
-<span class="sourceLineNo">2772</span>  }<a name="line.2772"></a>
-<span class="sourceLineNo">2773</span><a name="line.2773"></a>
-<span class="sourceLineNo">2774</span>  @Test<a name="line.2774"></a>
-<span class="sourceLineNo">2775</span>  public void testRegionScanner_Next() throws IOException {<a name="line.2775"></a>
-<span class="sourceLineNo">2776</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2776"></a>
-<span class="sourceLineNo">2777</span>    byte[] row2 = Bytes.toBytes("row2");<a name="line.2777"></a>
-<span class="sourceLineNo">2778</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2778"></a>
-<span class="sourceLineNo">2779</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2779"></a>
-<span class="sourceLineNo">2780</span>    byte[] fam3 = Bytes.toBytes("fam3");<a name="line.2780"></a>
-<span class="sourceLineNo">2781</span>    byte[] fam4 = Bytes.toBytes("fam4");<a name="line.2781"></a>
-<span class="sourceLineNo">2782</span><a name="line.2782"></a>
-<span class="sourceLineNo">2783</span>    byte[][] families = { fam1, fam2, fam3, fam4 };<a name="line.2783"></a>
-<span class="sourceLineNo">2784</span>    long ts = System.currentTimeMillis();<a name="line.2784"></a>
-<span class="sourceLineNo">2785</span><a name="line.2785"></a>
-<span class="sourceLineNo">2786</span>    // Setting up region<a name="line.2786"></a>
-<span class="sourceLineNo">2787</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2787"></a>
-<span class="sourceLineNo">2788</span>    // Putting data in Region<a name="line.2788"></a>
-<span class="sourceLineNo">2789</span>    Put put = null;<a name="line.2789"></a>
-<span class="sourceLineNo">2790</span>    put = new Put(row1);<a name="line.2790"></a>
-<span class="sourceLineNo">2791</span>    put.addColumn(fam1, (byte[]) null, ts, null);<a name="line.2791"></a>
-<span class="sourceLineNo">2792</span>    put.addColumn(fam2, (byte[]) null, ts, null);<a name="line.2792"></a>
-<span class="sourceLineNo">2793</span>    put.addColumn(fam3, (byte[]) null, ts, null);<a name="line.2793"></a>
-<span class="sourceLineNo">2794</span>    put.addColumn(fam4, (byte[]) null, ts, null);<a name="line.2794"></a>
-<span class="sourceLineNo">2795</span>    region.put(put);<a name="line.2795"></a>
-<span class="sourceLineNo">2796</span><a name="line.2796"></a>
-<span class="sourceLineNo">2797</span>    put = new Put(row2);<a name="line.2797"></a>
-<span class="sourceLineNo">2798</span>    put.addColumn(fam1, (byte[]) null, ts, null);<a name="line.2798"></a>
-<span class="sourceLineNo">2799</span>    put.addColumn(fam2, (byte[]) null, ts, null);<a name="line.2799"></a>
-<span class="sourceLineNo">2800</span>    put.addColumn(fam3, (byte[]) null, ts, null);<a name="line.2800"></a>
-<span class="sourceLineNo">2801</span>    put.addColumn(fam4, (byte[]) null, ts, null);<a name="line.2801"></a>
-<span class="sourceLineNo">2802</span>    region.put(put);<a name="line.2802"></a>
-<span class="sourceLineNo">2803</span><a name="line.2803"></a>
-<span class="sourceLineNo">2804</span>    Scan scan = new Scan();<a name="line.2804"></a>
-<span class="sourceLineNo">2805</span>    scan.addFamily(fam2);<a name="line.2805"></a>
-<span class="sourceLineNo">2806</span>    scan.addFamily(fam4);<a name="line.2806"></a>
-<span class="sourceLineNo">2807</span>    InternalScanner is = region.getScanner(scan);<a name="line.2807"></a>
-<span class="sourceLineNo">2808</span><a name="line.2808"></a>
-<span class="sourceLineNo">2809</span>    List&lt;Cell&gt; res = null;<a name="line.2809"></a>
-<span class="sourceLineNo">2810</span><a name="line.2810"></a>
-<span class="sourceLineNo">2811</span>    // Result 1<a name="line.2811"></a>
-<span class="sourceLineNo">2812</span>    List&lt;Cell&gt; expected1 = new ArrayList&lt;&gt;();<a name="line.2812"></a>
-<span class="sourceLineNo">2813</span>    expected1.add(new KeyValue(row1, fam2, null, ts, KeyValue.Type.Put, null));<a name="line.2813"></a>
-<span class="sourceLineNo">2814</span>    expected1.add(new KeyValue(row1, fam4, null, ts, KeyValue.Type.Put, null));<a name="line.2814"></a>
-<span class="sourceLineNo">2815</span><a name="line.2815"></a>
-<span class="sourceLineNo">2816</span>    res = new ArrayList&lt;&gt;();<a name="line.2816"></a>
-<span class="sourceLineNo">2817</span>    is.next(res);<a name="line.2817"></a>
-<span class="sourceLineNo">2818</span>    for (int i = 0; i &lt; res.size(); i++) {<a name="line.2818"></a>
-<span class="sourceLineNo">2819</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected1.get(i), res.get(i)));<a name="line.2819"></a>
-<span class="sourceLineNo">2820</span>    }<a name="line.2820"></a>
-<span class="sourceLineNo">2821</span><a name="line.2821"></a>
-<span class="sourceLineNo">2822</span>    // Result 2<a name="line.2822"></a>
-<span class="sourceLineNo">2823</span>    List&lt;Cell&gt; expected2 = new ArrayList&lt;&gt;();<a name="line.2823"></a>
-<span class="sourceLineNo">2824</span>    expected2.add(new KeyValue(row2, fam2, null, ts, KeyValue.Type.Put, null));<a name="line.2824"></a>
-<span class="sourceLineNo">2825</span>    expected2.add(new KeyValue(row2, fam4, null, ts, KeyValue.Type.Put, null));<a name="line.2825"></a>
-<span class="sourceLineNo">2826</span><a name="line.2826"></a>
-<span class="sourceLineNo">2827</span>    res = new ArrayList&lt;&gt;();<a name="line.2827"></a>
-<span class="sourceLineNo">2828</span>    is.next(res);<a name="line.2828"></a>
-<span class="sourceLineNo">2829</span>    for (int i = 0; i &lt; res.size(); i++) {<a name="line.2829"></a>
-<span class="sourceLineNo">2830</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected2.get(i), res.get(i)));<a name="line.2830"></a>
-<span class="sourceLineNo">2831</span>    }<a name="line.2831"></a>
-<span class="sourceLineNo">2832</span>  }<a name="line.2832"></a>
-<span class="sourceLineNo">2833</span><a name="line.2833"></a>
-<span class="sourceLineNo">2834</span>  @Test<a name="line.2834"></a>
-<span class="sourceLineNo">2835</span>  public void testScanner_ExplicitColumns_FromMemStore_EnforceVersions() throws IOException {<a name="line.2835"></a>
-<span class="sourceLineNo">2836</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2836"></a>
-<span class="sourceLineNo">2837</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.2837"></a>
-<span class="sourceLineNo">2838</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.2838"></a>
-<span class="sourceLineNo">2839</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2839"></a>
-<span class="sourceLineNo">2840</span>    byte[][] families = { fam1 };<a name="line.2840"></a>
-<span class="sourceLineNo">2841</span><a name="line.2841"></a>
-<span class="sourceLineNo">2842</span>    long ts1 = System.currentTimeMillis();<a name="line.2842"></a>
-<span class="sourceLineNo">2843</span>    long ts2 = ts1 + 1;<a name="line.2843"></a>
-<span class="sourceLineNo">2844</span>    long ts3 = ts1 + 2;<a name="line.2844"></a>
-<span class="sourceLineNo">2845</span><a name="line.2845"></a>
-<span class="sourceLineNo">2846</span>    // Setting up region<a name="line.2846"></a>
-<span class="sourceLineNo">2847</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2847"></a>
-<span class="sourceLineNo">2848</span>    // Putting data in Region<a name="line.2848"></a>
-<span class="sourceLineNo">2849</span>    Put put = null;<a name="line.2849"></a>
-<span class="sourceLineNo">2850</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.2850"></a>
-<span class="sourceLineNo">2851</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.2851"></a>
-<span class="sourceLineNo">2852</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.2852"></a>
-<span class="sourceLineNo">2853</span><a name="line.2853"></a>
-<span class="sourceLineNo">2854</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.2854"></a>
-<span class="sourceLineNo">2855</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.2855"></a>
-<span class="sourceLineNo">2856</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.2856"></a>
-<span class="sourceLineNo">2857</span><a name="line.2857"></a>
-<span class="sourceLineNo">2858</span>    put = new Put(row1);<a name="line.2858"></a>
-<span class="sourceLineNo">2859</span>    put.add(kv13);<a name="line.2859"></a>
-<span class="sourceLineNo">2860</span>    put.add(kv12);<a name="line.2860"></a>
-<span class="sourceLineNo">2861</span>    put.add(kv11);<a name="line.2861"></a>
-<span class="sourceLineNo">2862</span>    put.add(kv23);<a name="line.2862"></a>
-<span class="sourceLineNo">2863</span>    put.add(kv22);<a name="line.2863"></a>
-<span class="sourceLineNo">2864</span>    put.add(kv21);<a name="line.2864"></a>
-<span class="sourceLineNo">2865</span>    region.put(put);<a name="line.2865"></a>
-<span class="sourceLineNo">2866</span><a name="line.2866"></a>
-<span class="sourceLineNo">2867</span>    // Expected<a name="line.2867"></a>
-<span class="sourceLineNo">2868</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.2868"></a>
-<span class="sourceLineNo">2869</span>    expected.add(kv13);<a name="line.2869"></a>
-<span class="sourceLineNo">2870</span>    expected.add(kv12);<a name="line.2870"></a>
-<span class="sourceLineNo">2871</span><a name="line.2871"></a>
-<span class="sourceLineNo">2872</span>    Scan scan = new Scan(row1);<a name="line.2872"></a>
-<span class="sourceLineNo">2873</span>    scan.addColumn(fam1, qf1);<a name="line.2873"></a>
-<span class="sourceLineNo">2874</span>    scan.setMaxVersions(MAX_VERSIONS);<a name="line.2874"></a>
-<span class="sourceLineNo">2875</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.2875"></a>
-<span class="sourceLineNo">2876</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.2876"></a>
-<span class="sourceLineNo">2877</span><a name="line.2877"></a>
-<span class="sourceLineNo">2878</span>    boolean hasNext = scanner.next(actual);<a name="line.2878"></a>
-<span class="sourceLineNo">2879</span>    assertEquals(false, hasNext);<a name="line.2879"></a>
-<span class="sourceLineNo">2880</span><a name="line.2880"></a>
-<span class="sourceLineNo">2881</span>    // Verify result<a name="line.2881"></a>
-<span class="sourceLineNo">2882</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.2882"></a>
-<span class="sourceLineNo">2883</span>      assertEquals(expected.get(i), actual.get(i));<a name="line.2883"></a>
-<span class="sourceLineNo">2884</span>    }<a name="line.2884"></a>
-<span class="sourceLineNo">2885</span>  }<a name="line.2885"></a>
-<span class="sourceLineNo">2886</span><a name="line.2886"></a>
-<span class="sourceLineNo">2887</span>  @Test<a name="line.2887"></a>
-<span class="sourceLineNo">2888</span>  public void testScanner_ExplicitColumns_FromFilesOnly_EnforceVersions() throws IOException {<a name="line.2888"></a>
-<span class="sourceLineNo">2889</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2889"></a>
-<span class="sourceLineNo">2890</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.2890"></a>
-<span class="sourceLineNo">2891</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.2891"></a>
-<span class="sourceLineNo">2892</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2892"></a>
-<span class="sourceLineNo">2893</span>    byte[][] families = { fam1 };<a name="line.2893"></a>
-<span class="sourceLineNo">2894</span><a name="line.2894"></a>
-<span class="sourceLineNo">2895</span>    long ts1 = 1; // System.currentTimeMillis();<a name="line.2895"></a>
-<span class="sourceLineNo">2896</span>    long ts2 = ts1 + 1;<a name="line.2896"></a>
-<span class="sourceLineNo">2897</span>    long ts3 = ts1 + 2;<a name="line.2897"></a>
-<span class="sourceLineNo">2898</span><a name="line.2898"></a>
-<span class="sourceLineNo">2899</span>    // Setting up region<a name="line.2899"></a>
-<span class="sourceLineNo">2900</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2900"></a>
-<span class="sourceLineNo">2901</span>    // Putting data in Region<a name="line.2901"></a>
-<span class="sourceLineNo">2902</span>    Put put = null;<a name="line.2902"></a>
-<span class="sourceLineNo">2903</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.2903"></a>
-<span class="sourceLineNo">2904</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.2904"></a>
-<span class="sourceLineNo">2905</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.2905"></a>
-<span class="sourceLineNo">2906</span><a name="line.2906"></a>
-<span class="sourceLineNo">2907</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.2907"></a>
-<span class="sourceLineNo">2908</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.2908"></a>
-<span class="sourceLineNo">2909</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.2909"></a>
-<span class="sourceLineNo">2910</span><a name="line.2910"></a>
-<span class="sourceLineNo">2911</span>    put = new Put(row1);<a name="line.2911"></a>
-<span class="sourceLineNo">2912</span>    put.add(kv13);<a name="line.2912"></a>
-<span class="sourceLineNo">2913</span>    put.add(kv12);<a name="line.2913"></a>
-<span class="sourceLineNo">2914</span>    put.add(kv11);<a name="line.2914"></a>
-<span class="sourceLineNo">2915</span>    put.add(kv23);<a name="line.2915"></a>
-<span class="sourceLineNo">2916</span>    put.add(kv22);<a name="line.2916"></a>
-<span class="sourceLineNo">2917</span>    put.add(kv21);<a name="line.2917"></a>
-<span class="sourceLineNo">2918</span>    region.put(put);<a name="line.2918"></a>
-<span class="sourceLineNo">2919</span>    region.flush(true);<a name="line.2919"></a>
+<span class="sourceLineNo">2768</span>      e.printStackTrace();<a name="line.2768"></a>
+<span class="sourceLineNo">2769</span>      fail("Got IOException during initHRegion, " + e.getMessage());<a name="line.2769"></a>
+<span class="sourceLineNo">2770</span>    }<a name="line.2770"></a>
+<span class="sourceLineNo">2771</span>    region.closed.set(true);<a name="line.2771"></a>
+<span class="sourceLineNo">2772</span>    try {<a name="line.2772"></a>
+<span class="sourceLineNo">2773</span>      region.getScanner(null);<a name="line.2773"></a>
+<span class="sourceLineNo">2774</span>      fail("Expected to get an exception during getScanner on a region that is closed");<a name="line.2774"></a>
+<span class="sourceLineNo">2775</span>    } catch (NotServingRegionException e) {<a name="line.2775"></a>
+<span class="sourceLineNo">2776</span>      // this is the correct exception that is expected<a name="line.2776"></a>
+<span class="sourceLineNo">2777</span>    } catch (IOException e) {<a name="line.2777"></a>
+<span class="sourceLineNo">2778</span>      fail("Got wrong type of exception - should be a NotServingRegionException, " +<a name="line.2778"></a>
+<span class="sourceLineNo">2779</span>          "but was an IOException: "<a name="line.2779"></a>
+<span class="sourceLineNo">2780</span>          + e.getMessage());<a name="line.2780"></a>
+<span class="sourceLineNo">2781</span>    }<a name="line.2781"></a>
+<span class="sourceLineNo">2782</span>  }<a name="line.2782"></a>
+<span class="sourceLineNo">2783</span><a name="line.2783"></a>
+<span class="sourceLineNo">2784</span>  @Test<a name="line.2784"></a>
+<span class="sourceLineNo">2785</span>  public void testRegionScanner_Next() throws IOException {<a name="line.2785"></a>
+<span class="sourceLineNo">2786</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2786"></a>
+<span class="sourceLineNo">2787</span>    byte[] row2 = Bytes.toBytes("row2");<a name="line.2787"></a>
+<span class="sourceLineNo">2788</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2788"></a>
+<span class="sourceLineNo">2789</span>    byte[] fam2 = Bytes.toBytes("fam2");<a name="line.2789"></a>
+<span class="sourceLineNo">2790</span>    byte[] fam3 = Bytes.toBytes("fam3");<a name="line.2790"></a>
+<span class="sourceLineNo">2791</span>    byte[] fam4 = Bytes.toBytes("fam4");<a name="line.2791"></a>
+<span class="sourceLineNo">2792</span><a name="line.2792"></a>
+<span class="sourceLineNo">2793</span>    byte[][] families = { fam1, fam2, fam3, fam4 };<a name="line.2793"></a>
+<span class="sourceLineNo">2794</span>    long ts = System.currentTimeMillis();<a name="line.2794"></a>
+<span class="sourceLineNo">2795</span><a name="line.2795"></a>
+<span class="sourceLineNo">2796</span>    // Setting up region<a name="line.2796"></a>
+<span class="sourceLineNo">2797</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2797"></a>
+<span class="sourceLineNo">2798</span>    // Putting data in Region<a name="line.2798"></a>
+<span class="sourceLineNo">2799</span>    Put put = null;<a name="line.2799"></a>
+<span class="sourceLineNo">2800</span>    put = new Put(row1);<a name="line.2800"></a>
+<span class="sourceLineNo">2801</span>    put.addColumn(fam1, (byte[]) null, ts, null);<a name="line.2801"></a>
+<span class="sourceLineNo">2802</span>    put.addColumn(fam2, (byte[]) null, ts, null);<a name="line.2802"></a>
+<span class="sourceLineNo">2803</span>    put.addColumn(fam3, (byte[]) null, ts, null);<a name="line.2803"></a>
+<span class="sourceLineNo">2804</span>    put.addColumn(fam4, (byte[]) null, ts, null);<a name="line.2804"></a>
+<span class="sourceLineNo">2805</span>    region.put(put);<a name="line.2805"></a>
+<span class="sourceLineNo">2806</span><a name="line.2806"></a>
+<span class="sourceLineNo">2807</span>    put = new Put(row2);<a name="line.2807"></a>
+<span class="sourceLineNo">2808</span>    put.addColumn(fam1, (byte[]) null, ts, null);<a name="line.2808"></a>
+<span class="sourceLineNo">2809</span>    put.addColumn(fam2, (byte[]) null, ts, null);<a name="line.2809"></a>
+<span class="sourceLineNo">2810</span>    put.addColumn(fam3, (byte[]) null, ts, null);<a name="line.2810"></a>
+<span class="sourceLineNo">2811</span>    put.addColumn(fam4, (byte[]) null, ts, null);<a name="line.2811"></a>
+<span class="sourceLineNo">2812</span>    region.put(put);<a name="line.2812"></a>
+<span class="sourceLineNo">2813</span><a name="line.2813"></a>
+<span class="sourceLineNo">2814</span>    Scan scan = new Scan();<a name="line.2814"></a>
+<span class="sourceLineNo">2815</span>    scan.addFamily(fam2);<a name="line.2815"></a>
+<span class="sourceLineNo">2816</span>    scan.addFamily(fam4);<a name="line.2816"></a>
+<span class="sourceLineNo">2817</span>    InternalScanner is = region.getScanner(scan);<a name="line.2817"></a>
+<span class="sourceLineNo">2818</span><a name="line.2818"></a>
+<span class="sourceLineNo">2819</span>    List&lt;Cell&gt; res = null;<a name="line.2819"></a>
+<span class="sourceLineNo">2820</span><a name="line.2820"></a>
+<span class="sourceLineNo">2821</span>    // Result 1<a name="line.2821"></a>
+<span class="sourceLineNo">2822</span>    List&lt;Cell&gt; expected1 = new ArrayList&lt;&gt;();<a name="line.2822"></a>
+<span class="sourceLineNo">2823</span>    expected1.add(new KeyValue(row1, fam2, null, ts, KeyValue.Type.Put, null));<a name="line.2823"></a>
+<span class="sourceLineNo">2824</span>    expected1.add(new KeyValue(row1, fam4, null, ts, KeyValue.Type.Put, null));<a name="line.2824"></a>
+<span class="sourceLineNo">2825</span><a name="line.2825"></a>
+<span class="sourceLineNo">2826</span>    res = new ArrayList&lt;&gt;();<a name="line.2826"></a>
+<span class="sourceLineNo">2827</span>    is.next(res);<a name="line.2827"></a>
+<span class="sourceLineNo">2828</span>    for (int i = 0; i &lt; res.size(); i++) {<a name="line.2828"></a>
+<span class="sourceLineNo">2829</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected1.get(i), res.get(i)));<a name="line.2829"></a>
+<span class="sourceLineNo">2830</span>    }<a name="line.2830"></a>
+<span class="sourceLineNo">2831</span><a name="line.2831"></a>
+<span class="sourceLineNo">2832</span>    // Result 2<a name="line.2832"></a>
+<span class="sourceLineNo">2833</span>    List&lt;Cell&gt; expected2 = new ArrayList&lt;&gt;();<a name="line.2833"></a>
+<span class="sourceLineNo">2834</span>    expected2.add(new KeyValue(row2, fam2, null, ts, KeyValue.Type.Put, null));<a name="line.2834"></a>
+<span class="sourceLineNo">2835</span>    expected2.add(new KeyValue(row2, fam4, null, ts, KeyValue.Type.Put, null));<a name="line.2835"></a>
+<span class="sourceLineNo">2836</span><a name="line.2836"></a>
+<span class="sourceLineNo">2837</span>    res = new ArrayList&lt;&gt;();<a name="line.2837"></a>
+<span class="sourceLineNo">2838</span>    is.next(res);<a name="line.2838"></a>
+<span class="sourceLineNo">2839</span>    for (int i = 0; i &lt; res.size(); i++) {<a name="line.2839"></a>
+<span class="sourceLineNo">2840</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected2.get(i), res.get(i)));<a name="line.2840"></a>
+<span class="sourceLineNo">2841</span>    }<a name="line.2841"></a>
+<span class="sourceLineNo">2842</span>  }<a name="line.2842"></a>
+<span class="sourceLineNo">2843</span><a name="line.2843"></a>
+<span class="sourceLineNo">2844</span>  @Test<a name="line.2844"></a>
+<span class="sourceLineNo">2845</span>  public void testScanner_ExplicitColumns_FromMemStore_EnforceVersions() throws IOException {<a name="line.2845"></a>
+<span class="sourceLineNo">2846</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2846"></a>
+<span class="sourceLineNo">2847</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.2847"></a>
+<span class="sourceLineNo">2848</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.2848"></a>
+<span class="sourceLineNo">2849</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2849"></a>
+<span class="sourceLineNo">2850</span>    byte[][] families = { fam1 };<a name="line.2850"></a>
+<span class="sourceLineNo">2851</span><a name="line.2851"></a>
+<span class="sourceLineNo">2852</span>    long ts1 = System.currentTimeMillis();<a name="line.2852"></a>
+<span class="sourceLineNo">2853</span>    long ts2 = ts1 + 1;<a name="line.2853"></a>
+<span class="sourceLineNo">2854</span>    long ts3 = ts1 + 2;<a name="line.2854"></a>
+<span class="sourceLineNo">2855</span><a name="line.2855"></a>
+<span class="sourceLineNo">2856</span>    // Setting up region<a name="line.2856"></a>
+<span class="sourceLineNo">2857</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2857"></a>
+<span class="sourceLineNo">2858</span>    // Putting data in Region<a name="line.2858"></a>
+<span class="sourceLineNo">2859</span>    Put put = null;<a name="line.2859"></a>
+<span class="sourceLineNo">2860</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.2860"></a>
+<span class="sourceLineNo">2861</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.2861"></a>
+<span class="sourceLineNo">2862</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.2862"></a>
+<span class="sourceLineNo">2863</span><a name="line.2863"></a>
+<span class="sourceLineNo">2864</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.2864"></a>
+<span class="sourceLineNo">2865</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.2865"></a>
+<span class="sourceLineNo">2866</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.2866"></a>
+<span class="sourceLineNo">2867</span><a name="line.2867"></a>
+<span class="sourceLineNo">2868</span>    put = new Put(row1);<a name="line.2868"></a>
+<span class="sourceLineNo">2869</span>    put.add(kv13);<a name="line.2869"></a>
+<span class="sourceLineNo">2870</span>    put.add(kv12);<a name="line.2870"></a>
+<span class="sourceLineNo">2871</span>    put.add(kv11);<a name="line.2871"></a>
+<span class="sourceLineNo">2872</span>    put.add(kv23);<a name="line.2872"></a>
+<span class="sourceLineNo">2873</span>    put.add(kv22);<a name="line.2873"></a>
+<span class="sourceLineNo">2874</span>    put.add(kv21);<a name="line.2874"></a>
+<span class="sourceLineNo">2875</span>    region.put(put);<a name="line.2875"></a>
+<span class="sourceLineNo">2876</span><a name="line.2876"></a>
+<span class="sourceLineNo">2877</span>    // Expected<a name="line.2877"></a>
+<span class="sourceLineNo">2878</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.2878"></a>
+<span class="sourceLineNo">2879</span>    expected.add(kv13);<a name="line.2879"></a>
+<span class="sourceLineNo">2880</span>    expected.add(kv12);<a name="line.2880"></a>
+<span class="sourceLineNo">2881</span><a name="line.2881"></a>
+<span class="sourceLineNo">2882</span>    Scan scan = new Scan(row1);<a name="line.2882"></a>
+<span class="sourceLineNo">2883</span>    scan.addColumn(fam1, qf1);<a name="line.2883"></a>
+<span class="sourceLineNo">2884</span>    scan.setMaxVersions(MAX_VERSIONS);<a name="line.2884"></a>
+<span class="sourceLineNo">2885</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.2885"></a>
+<span class="sourceLineNo">2886</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.2886"></a>
+<span class="sourceLineNo">2887</span><a name="line.2887"></a>
+<span class="sourceLineNo">2888</span>    boolean hasNext = scanner.next(actual);<a name="line.2888"></a>
+<span class="sourceLineNo">2889</span>    assertEquals(false, hasNext);<a name="line.2889"></a>
+<span class="sourceLineNo">2890</span><a name="line.2890"></a>
+<span class="sourceLineNo">2891</span>    // Verify result<a name="line.2891"></a>
+<span class="sourceLineNo">2892</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.2892"></a>
+<span class="sourceLineNo">2893</span>      assertEquals(expected.get(i), actual.get(i));<a name="line.2893"></a>
+<span class="sourceLineNo">2894</span>    }<a name="line.2894"></a>
+<span class="sourceLineNo">2895</span>  }<a name="line.2895"></a>
+<span class="sourceLineNo">2896</span><a name="line.2896"></a>
+<span class="sourceLineNo">2897</span>  @Test<a name="line.2897"></a>
+<span class="sourceLineNo">2898</span>  public void testScanner_ExplicitColumns_FromFilesOnly_EnforceVersions() throws IOException {<a name="line.2898"></a>
+<span class="sourceLineNo">2899</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2899"></a>
+<span class="sourceLineNo">2900</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.2900"></a>
+<span class="sourceLineNo">2901</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.2901"></a>
+<span class="sourceLineNo">2902</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2902"></a>
+<span class="sourceLineNo">2903</span>    byte[][] families = { fam1 };<a name="line.2903"></a>
+<span class="sourceLineNo">2904</span><a name="line.2904"></a>
+<span class="sourceLineNo">2905</span>    long ts1 = 1; // System.currentTimeMillis();<a name="line.2905"></a>
+<span class="sourceLineNo">2906</span>    long ts2 = ts1 + 1;<a name="line.2906"></a>
+<span class="sourceLineNo">2907</span>    long ts3 = ts1 + 2;<a name="line.2907"></a>
+<span class="sourceLineNo">2908</span><a name="line.2908"></a>
+<span class="sourceLineNo">2909</span>    // Setting up region<a name="line.2909"></a>
+<span class="sourceLineNo">2910</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2910"></a>
+<span class="sourceLineNo">2911</span>    // Putting data in Region<a name="line.2911"></a>
+<span class="sourceLineNo">2912</span>    Put put = null;<a name="line.2912"></a>
+<span class="sourceLineNo">2913</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.2913"></a>
+<span class="sourceLineNo">2914</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.2914"></a>
+<span class="sourceLineNo">2915</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.2915"></a>
+<span class="sourceLineNo">2916</span><a name="line.2916"></a>
+<span class="sourceLineNo">2917</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.2917"></a>
+<span class="sourceLineNo">2918</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.2918"></a>
+<span class="sourceLineNo">2919</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.2919"></a>
 <span class="sourceLineNo">2920</span><a name="line.2920"></a>
-<span class="sourceLineNo">2921</span>    // Expected<a name="line.2921"></a>
-<span class="sourceLineNo">2922</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.2922"></a>
-<span class="sourceLineNo">2923</span>    expected.add(kv13);<a name="line.2923"></a>
-<span class="sourceLineNo">2924</span>    expected.add(kv12);<a name="line.2924"></a>
-<span class="sourceLineNo">2925</span>    expected.add(kv23);<a name="line.2925"></a>
-<span class="sourceLineNo">2926</span>    expected.add(kv22);<a name="line.2926"></a>
-<span class="sourceLineNo">2927</span><a name="line.2927"></a>
-<span class="sourceLineNo">2928</span>    Scan scan = new Scan(row1);<a name="line.2928"></a>
-<span class="sourceLineNo">2929</span>    scan.addColumn(fam1, qf1);<a name="line.2929"></a>
-<span class="sourceLineNo">2930</span>    scan.addColumn(fam1, qf2);<a name="line.2930"></a>
-<span class="sourceLineNo">2931</span>    scan.setMaxVersions(MAX_VERSIONS);<a name="line.2931"></a>
-<span class="sourceLineNo">2932</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.2932"></a>
-<span class="sourceLineNo">2933</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.2933"></a>
-<span class="sourceLineNo">2934</span><a name="line.2934"></a>
-<span class="sourceLineNo">2935</span>    boolean hasNext = scanner.next(actual);<a name="line.2935"></a>
-<span class="sourceLineNo">2936</span>    assertEquals(false, hasNext);<a name="line.2936"></a>
+<span class="sourceLineNo">2921</span>    put = new Put(row1);<a name="line.2921"></a>
+<span class="sourceLineNo">2922</span>    put.add(kv13);<a name="line.2922"></a>
+<span class="sourceLineNo">2923</span>    put.add(kv12);<a name="line.2923"></a>
+<span class="sourceLineNo">2924</span>    put.add(kv11);<a name="line.2924"></a>
+<span class="sourceLineNo">2925</span>    put.add(kv23);<a name="line.2925"></a>
+<span class="sourceLineNo">2926</span>    put.add(kv22);<a name="line.2926"></a>
+<span class="sourceLineNo">2927</span>    put.add(kv21);<a name="line.2927"></a>
+<span class="sourceLineNo">2928</span>    region.put(put);<a name="line.2928"></a>
+<span class="sourceLineNo">2929</span>    region.flush(true);<a name="line.2929"></a>
+<span class="sourceLineNo">2930</span><a name="line.2930"></a>
+<span class="sourceLineNo">2931</span>    // Expected<a name="line.2931"></a>
+<span class="sourceLineNo">2932</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.2932"></a>
+<span class="sourceLineNo">2933</span>    expected.add(kv13);<a name="line.2933"></a>
+<span class="sourceLineNo">2934</span>    expected.add(kv12);<a name="line.2934"></a>
+<span class="sourceLineNo">2935</span>    expected.add(kv23);<a name="line.2935"></a>
+<span class="sourceLineNo">2936</span>    expected.add(kv22);<a name="line.2936"></a>
 <span class="sourceLineNo">2937</span><a name="line.2937"></a>
-<span class="sourceLineNo">2938</span>    // Verify result<a name="line.2938"></a>
-<span class="sourceLineNo">2939</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.2939"></a>
-<span class="sourceLineNo">2940</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected.get(i), actual.get(i)));<a name="line.2940"></a>
-<span class="sourceLineNo">2941</span>    }<a name="line.2941"></a>
-<span class="sourceLineNo">2942</span>  }<a name="line.2942"></a>
-<span class="sourceLineNo">2943</span><a name="line.2943"></a>
-<span class="sourceLineNo">2944</span>  @Test<a name="line.2944"></a>
-<span class="sourceLineNo">2945</span>  public void testScanner_ExplicitColumns_FromMemStoreAndFiles_EnforceVersions() throws<a name="line.2945"></a>
-<span class="sourceLineNo">2946</span>      IOException {<a name="line.2946"></a>
-<span class="sourceLineNo">2947</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2947"></a>
-<span class="sourceLineNo">2948</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2948"></a>
-<span class="sourceLineNo">2949</span>    byte[][] families = { fam1 };<a name="line.2949"></a>
-<span class="sourceLineNo">2950</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.2950"></a>
-<span class="sourceLineNo">2951</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.2951"></a>
-<span class="sourceLineNo">2952</span><a name="line.2952"></a>
-<span class="sourceLineNo">2953</span>    long ts1 = 1;<a name="line.2953"></a>
-<span class="sourceLineNo">2954</span>    long ts2 = ts1 + 1;<a name="line.2954"></a>
-<span class="sourceLineNo">2955</span>    long ts3 = ts1 + 2;<a name="line.2955"></a>
-<span class="sourceLineNo">2956</span>    long ts4 = ts1 + 3;<a name="line.2956"></a>
-<span class="sourceLineNo">2957</span><a name="line.2957"></a>
-<span class="sourceLineNo">2958</span>    // Setting up region<a name="line.2958"></a>
-<span class="sourceLineNo">2959</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2959"></a>
-<span class="sourceLineNo">2960</span>    // Putting data in Region<a name="line.2960"></a>
-<span class="sourceLineNo">2961</span>    KeyValue kv14 = new KeyValue(row1, fam1, qf1, ts4, KeyValue.Type.Put, null);<a name="line.2961"></a>
-<span class="sourceLineNo">2962</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.2962"></a>
-<span class="sourceLineNo">2963</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.2963"></a>
-<span class="sourceLineNo">2964</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.2964"></a>
-<span class="sourceLineNo">2965</span><a name="line.2965"></a>
-<span class="sourceLineNo">2966</span>    KeyValue kv24 = new KeyValue(row1, fam1, qf2, ts4, KeyValue.Type.Put, null);<a name="line.2966"></a>
-<span class="sourceLineNo">2967</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.2967"></a>
-<span class="sourceLineNo">2968</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.2968"></a>
-<span class="sourceLineNo">2969</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.2969"></a>
-<span class="sourceLineNo">2970</span><a name="line.2970"></a>
-<span class="sourceLineNo">2971</span>    Put put = null;<a name="line.2971"></a>
-<span class="sourceLineNo">2972</span>    put = new Put(row1);<a name="line.2972"></a>
-<span class="sourceLineNo">2973</span>    put.add(kv14);<a name="line.2973"></a>
-<span class="sourceLineNo">2974</span>    put.add(kv24);<a name="line.2974"></a>
-<span class="sourceLineNo">2975</span>    region.put(put);<a name="line.2975"></a>
-<span class="sourceLineNo">2976</span>    region.flush(true);<a name="line.2976"></a>
-<span class="sourceLineNo">2977</span><a name="line.2977"></a>
-<span class="sourceLineNo">2978</span>    put = new Put(row1);<a name="line.2978"></a>
-<span class="sourceLineNo">2979</span>    put.add(kv23);<a name="line.2979"></a>
-<span class="sourceLineNo">2980</span>    put.add(kv13);<a name="line.2980"></a>
-<span class="sourceLineNo">2981</span>    region.put(put);<a name="line.2981"></a>
-<span class="sourceLineNo">2982</span>    region.flush(true);<a name="line.2982"></a>
-<span class="sourceLineNo">2983</span><a name="line.2983"></a>
-<span class="sourceLineNo">2984</span>    put = new Put(row1);<a name="line.2984"></a>
-<span class="sourceLineNo">2985</span>    put.add(kv22);<a name="line.2985"></a>
-<span class="sourceLineNo">2986</span>    put.add(kv12);<a name="line.2986"></a>
-<span class="sourceLineNo">2987</span>    region.put(put);<a name="line.2987"></a>
-<span class="sourceLineNo">2988</span>    region.flush(true);<a name="line.2988"></a>
-<span class="sourceLineNo">2989</span><a name="line.2989"></a>
-<span class="sourceLineNo">2990</span>    put = new Put(row1);<a name="line.2990"></a>
-<span class="sourceLineNo">2991</span>    put.add(kv21);<a name="line.2991"></a>
-<span class="sourceLineNo">2992</span>    put.add(kv11);<a name="line.2992"></a>
-<span class="sourceLineNo">2993</span>    region.put(put);<a name="line.2993"></a>
-<span class="sourceLineNo">2994</span><a name="line.2994"></a>
-<span class="sourceLineNo">2995</span>    // Expected<a name="line.2995"></a>
-<span class="sourceLineNo">2996</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.2996"></a>
-<span class="sourceLineNo">2997</span>    expected.add(kv14);<a name="line.2997"></a>
-<span class="sourceLineNo">2998</span>    expected.add(kv13);<a name="line.2998"></a>
-<span class="sourceLineNo">2999</span>    expected.add(kv12);<a name="line.2999"></a>
-<span class="sourceLineNo">3000</span>    expected.add(kv24);<a name="line.3000"></a>
-<span class="sourceLineNo">3001</span>    expected.add(kv23);<a name="line.3001"></a>
-<span class="sourceLineNo">3002</span>    expected.add(kv22);<a name="line.3002"></a>
-<span class="sourceLineNo">3003</span><a name="line.3003"></a>
-<span class="sourceLineNo">3004</span>    Scan scan = new Scan(row1);<a name="line.3004"></a>
-<span class="sourceLineNo">3005</span>    scan.addColumn(fam1, qf1);<a name="line.3005"></a>
-<span class="sourceLineNo">3006</span>    scan.addColumn(fam1, qf2);<a name="line.3006"></a>
-<span class="sourceLineNo">3007</span>    int versions = 3;<a name="line.3007"></a>
-<span class="sourceLineNo">3008</span>    scan.setMaxVersions(versions);<a name="line.3008"></a>
-<span class="sourceLineNo">3009</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.3009"></a>
-<span class="sourceLineNo">3010</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.3010"></a>
-<span class="sourceLineNo">3011</span><a name="line.3011"></a>
-<span class="sourceLineNo">3012</span>    boolean hasNext = scanner.next(actual);<a name="line.3012"></a>
-<span class="sourceLineNo">3013</span>    assertEquals(false, hasNext);<a name="line.3013"></a>
-<span class="sourceLineNo">3014</span><a name="line.3014"></a>
-<span class="sourceLineNo">3015</span>    // Verify result<a name="line.3015"></a>
-<span class="sourceLineNo">3016</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.3016"></a>
-<span class="sourceLineNo">3017</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected.get(i), actual.get(i)));<a name="line.3017"></a>
-<span class="sourceLineNo">3018</span>    }<a name="line.3018"></a>
-<span class="sourceLineNo">3019</span>  }<a name="line.3019"></a>
-<span class="sourceLineNo">3020</span><a name="line.3020"></a>
-<span class="sourceLineNo">3021</span>  @Test<a name="line.3021"></a>
-<span class="sourceLineNo">3022</span>  public void testScanner_Wildcard_FromMemStore_EnforceVersions() throws IOException {<a name="line.3022"></a>
-<span class="sourceLineNo">3023</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.3023"></a>
-<span class="sourceLineNo">3024</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.3024"></a>
-<span class="sourceLineNo">3025</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.3025"></a>
-<span class="sourceLineNo">3026</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.3026"></a>
-<span class="sourceLineNo">3027</span>    byte[][] families = { fam1 };<a name="line.3027"></a>
-<span class="sourceLineNo">3028</span><a name="line.3028"></a>
-<span class="sourceLineNo">3029</span>    long ts1 = System.currentTimeMillis();<a name="line.3029"></a>
-<span class="sourceLineNo">3030</span>    long ts2 = ts1 + 1;<a name="line.3030"></a>
-<span class="sourceLineNo">3031</span>    long ts3 = ts1 + 2;<a name="line.3031"></a>
-<span class="sourceLineNo">3032</span><a name="line.3032"></a>
-<span class="sourceLineNo">3033</span>    // Setting up region<a name="line.3033"></a>
-<span class="sourceLineNo">3034</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.3034"></a>
-<span class="sourceLineNo">3035</span>    // Putting data in Region<a name="line.3035"></a>
-<span class="sourceLineNo">3036</span>    Put put = null;<a name="line.3036"></a>
-<span class="sourceLineNo">3037</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.3037"></a>
-<span class="sourceLineNo">3038</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.3038"></a>
-<span class="sourceLineNo">3039</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.3039"></a>
-<span class="sourceLineNo">3040</span><a name="line.3040"></a>
-<span class="sourceLineNo">3041</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.3041"></a>
-<span class="sourceLineNo">3042</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.3042"></a>
-<span class="sourceLineNo">3043</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.3043"></a>
-<span class="sourceLineNo">3044</span><a name="line.3044"></a>
-<span class="sourceLineNo">3045</span>    put = new Put(row1);<a name="line.3045"></a>
-<span class="sourceLineNo">3046</span>    put.add(kv13);<a name="line.3046"></a>
-<span class="sourceLineNo">3047</span>    put.add(kv12);<a name="line.3047"></a>
-<span class="sourceLineNo">3048</span>    put.add(kv11);<a name="line.3048"></a>
-<span class="sourceLineNo">3049</span>    put.add(kv23);<a name="line.3049"></a>
-<span class="sourceLineNo">3050</span>    put.add(kv22);<a name="line.3050"></a>
-<span class="sourceLineNo">3051</span>    put.add(kv21);<a name="line.3051"></a>
-<span class="sourceLineNo">3052</span>    region.put(put);<a name="line.3052"></a>
-<span class="sourceLineNo">3053</span><a name="line.3053"></a>
-<span class="sourceLineNo">3054</span>    // Expected<a name="line.3054"></a>
-<span class="sourceLineNo">3055</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.3055"></a>
-<span class="sourceLineNo">3056</span>    expected.add(kv13);<a name="line.3056"></a>
-<span class="sourceLineNo">3057</span>    expected.add(kv12);<a name="line.3057"></a>
-<span class="sourceLineNo">3058</span>    expected.add(kv23);<a name="line.3058"></a>
-<span class="sourceLineNo">3059</span>    expected.add(kv22);<a name="line.3059"></a>
-<span class="sourceLineNo">3060</span><a name="line.3060"></a>
-<span class="sourceLineNo">3061</span>    Scan scan = new Scan(row1);<a name="line.3061"></a>
-<span class="sourceLineNo">3062</span>    scan.addFamily(fam1);<a name="line.3062"></a>
-<span class="sourceLineNo">3063</span>    scan.setMaxVersions(MAX_VERSIONS);<a name="line.3063"></a>
-<span class="sourceLineNo">3064</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.3064"></a>
-<span class="sourceLineNo">3065</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.3065"></a>
-<span class="sourceLineNo">3066</span><a name="line.3066"></a>
-<span class="sourceLineNo">3067</span>    boolean hasNext = scanner.next(actual);<a name="line.3067"></a>
-<span class="sourceLineNo">3068</span>    assertEquals(false, hasNext);<a name="line.3068"></a>
-<span class="sourceLineNo">3069</span><a name="line.3069"></a>
-<span class="sourceLineNo">3070</span>    // Verify result<a name="line.3070"></a>
-<span class="sourceLineNo">3071</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.3071"></a>
-<span class="sourceLineNo">3072</span>      assertEquals(expected.get(i), actual.get(i));<a name="line.3072"></a>
-<span class="sourceLineNo">3073</span>    }<a name="line.3073"></a>
-<span class="sourceLineNo">3074</span>  }<a name="line.3074"></a>
-<span class="sourceLineNo">3075</span><a name="line.3075"></a>
-<span class="sourceLineNo">3076</span>  @Test<a name="line.3076"></a>
-<span class="sourceLineNo">3077</span>  public void testScanner_Wildcard_FromFilesOnly_EnforceVersions() throws IOException {<a name="line.3077"></a>
-<span class="sourceLineNo">3078</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.3078"></a>
-<span class="sourceLineNo">3079</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.3079"></a>
-<span class="sourceLineNo">3080</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.3080"></a>
-<span class="sourceLineNo">3081</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.3081"></a>
-<span class="sourceLineNo">3082</span><a name="line.3082"></a>
-<span class="sourceLineNo">3083</span>    long ts1 = 1; // System.currentTimeMillis();<a name="line.3083"></a>
-<span class="sourceLineNo">3084</span>    long ts2 = ts1 + 1;<a name="line.3084"></a>
-<span class="sourceLineNo">3085</span>    long ts3 = ts1 + 2;<a name="line.3085"></a>
-<span class="sourceLineNo">3086</span><a name="line.3086"></a>
-<span class="sourceLineNo">3087</span>    // Setting up region<a name="line.3087"></a>
-<span class="sourceLineNo">3088</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.3088"></a>
-<span class="sourceLineNo">3089</span>    // Putting data in Region<a name="line.3089"></a>
-<span class="sourceLineNo">3090</span>    Put put = null;<a name="line.3090"></a>
-<span class="sourceLineNo">3091</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.3091"></a>
-<span class="sourceLineNo">3092</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.3092"></a>
-<span class="sourceLineNo">3093</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.3093"></a>
-<span class="sourceLineNo">3094</span><a name="line.3094"></a>
-<span class="sourceLineNo">3095</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.3095"></a>
-<span class="sourceLineNo">3096</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.3096"></a>
-<span class="sourceLineNo">3097</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.3097"></a>
-<span class="sourceLineNo">3098</span><a name="line.3098"></a>
-<span class="sourceLineNo">3099</span>    put = new Put(row1);<a name="line.3099"></a>
-<span class="sourceLineNo">3100</span>    put.add(kv13);<a name="line.3100"></a>
-<span class="sourceLineNo">3101</span>    put.add(kv12);<a name="line.3101"></a>
-<span class="sourceLineNo">3102</span>    put.add(kv11);<a name="line.3102"></a>
-<span class="sourceLineNo">3103</span>    put.add(kv23);<a name="line.3103"></a>
-<span class="sourceLineNo">3104</span>    put.add(kv22);<a name="line.3104"></a>
-<span class="sourceLineNo">3105</span>    put.add(kv21);<a name="line.3105"></a>
-<span class="sourceLineNo">3106</span>    region.put(put);<a name="line.3106"></a>
-<span class="sourceLineNo">3107</span>    region.flush(true);<a name="line.3107"></a>
+<span class="sourceLineNo">2938</span>    Scan scan = new Scan(row1);<a name="line.2938"></a>
+<span class="sourceLineNo">2939</span>    scan.addColumn(fam1, qf1);<a name="line.2939"></a>
+<span class="sourceLineNo">2940</span>    scan.addColumn(fam1, qf2);<a name="line.2940"></a>
+<span class="sourceLineNo">2941</span>    scan.setMaxVersions(MAX_VERSIONS);<a name="line.2941"></a>
+<span class="sourceLineNo">2942</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.2942"></a>
+<span class="sourceLineNo">2943</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.2943"></a>
+<span class="sourceLineNo">2944</span><a name="line.2944"></a>
+<span class="sourceLineNo">2945</span>    boolean hasNext = scanner.next(actual);<a name="line.2945"></a>
+<span class="sourceLineNo">2946</span>    assertEquals(false, hasNext);<a name="line.2946"></a>
+<span class="sourceLineNo">2947</span><a name="line.2947"></a>
+<span class="sourceLineNo">2948</span>    // Verify result<a name="line.2948"></a>
+<span class="sourceLineNo">2949</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.2949"></a>
+<span class="sourceLineNo">2950</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected.get(i), actual.get(i)));<a name="line.2950"></a>
+<span class="sourceLineNo">2951</span>    }<a name="line.2951"></a>
+<span class="sourceLineNo">2952</span>  }<a name="line.2952"></a>
+<span class="sourceLineNo">2953</span><a name="line.2953"></a>
+<span class="sourceLineNo">2954</span>  @Test<a name="line.2954"></a>
+<span class="sourceLineNo">2955</span>  public void testScanner_ExplicitColumns_FromMemStoreAndFiles_EnforceVersions() throws<a name="line.2955"></a>
+<span class="sourceLineNo">2956</span>      IOException {<a name="line.2956"></a>
+<span class="sourceLineNo">2957</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.2957"></a>
+<span class="sourceLineNo">2958</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.2958"></a>
+<span class="sourceLineNo">2959</span>    byte[][] families = { fam1 };<a name="line.2959"></a>
+<span class="sourceLineNo">2960</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.2960"></a>
+<span class="sourceLineNo">2961</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.2961"></a>
+<span class="sourceLineNo">2962</span><a name="line.2962"></a>
+<span class="sourceLineNo">2963</span>    long ts1 = 1;<a name="line.2963"></a>
+<span class="sourceLineNo">2964</span>    long ts2 = ts1 + 1;<a name="line.2964"></a>
+<span class="sourceLineNo">2965</span>    long ts3 = ts1 + 2;<a name="line.2965"></a>
+<span class="sourceLineNo">2966</span>    long ts4 = ts1 + 3;<a name="line.2966"></a>
+<span class="sourceLineNo">2967</span><a name="line.2967"></a>
+<span class="sourceLineNo">2968</span>    // Setting up region<a name="line.2968"></a>
+<span class="sourceLineNo">2969</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.2969"></a>
+<span class="sourceLineNo">2970</span>    // Putting data in Region<a name="line.2970"></a>
+<span class="sourceLineNo">2971</span>    KeyValue kv14 = new KeyValue(row1, fam1, qf1, ts4, KeyValue.Type.Put, null);<a name="line.2971"></a>
+<span class="sourceLineNo">2972</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.2972"></a>
+<span class="sourceLineNo">2973</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.2973"></a>
+<span class="sourceLineNo">2974</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.2974"></a>
+<span class="sourceLineNo">2975</span><a name="line.2975"></a>
+<span class="sourceLineNo">2976</span>    KeyValue kv24 = new KeyValue(row1, fam1, qf2, ts4, KeyValue.Type.Put, null);<a name="line.2976"></a>
+<span class="sourceLineNo">2977</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.2977"></a>
+<span class="sourceLineNo">2978</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.2978"></a>
+<span class="sourceLineNo">2979</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.2979"></a>
+<span class="sourceLineNo">2980</span><a name="line.2980"></a>
+<span class="sourceLineNo">2981</span>    Put put = null;<a name="line.2981"></a>
+<span class="sourceLineNo">2982</span>    put = new Put(row1);<a name="line.2982"></a>
+<span class="sourceLineNo">2983</span>    put.add(kv14);<a name="line.2983"></a>
+<span class="sourceLineNo">2984</span>    put.add(kv24);<a name="line.2984"></a>
+<span class="sourceLineNo">2985</span>    region.put(put);<a name="line.2985"></a>
+<span class="sourceLineNo">2986</span>    region.flush(true);<a name="line.2986"></a>
+<span class="sourceLineNo">2987</span><a name="line.2987"></a>
+<span class="sourceLineNo">2988</span>    put = new Put(row1);<a name="line.2988"></a>
+<span class="sourceLineNo">2989</span>    put.add(kv23);<a name="line.2989"></a>
+<span class="sourceLineNo">2990</span>    put.add(kv13);<a name="line.2990"></a>
+<span class="sourceLineNo">2991</span>    region.put(put);<a name="line.2991"></a>
+<span class="sourceLineNo">2992</span>    region.flush(true);<a name="line.2992"></a>
+<span class="sourceLineNo">2993</span><a name="line.2993"></a>
+<span class="sourceLineNo">2994</span>    put = new Put(row1);<a name="line.2994"></a>
+<span class="sourceLineNo">2995</span>    put.add(kv22);<a name="line.2995"></a>
+<span class="sourceLineNo">2996</span>    put.add(kv12);<a name="line.2996"></a>
+<span class="sourceLineNo">2997</span>    region.put(put);<a name="line.2997"></a>
+<span class="sourceLineNo">2998</span>    region.flush(true);<a name="line.2998"></a>
+<span class="sourceLineNo">2999</span><a name="line.2999"></a>
+<span class="sourceLineNo">3000</span>    put = new Put(row1);<a name="line.3000"></a>
+<span class="sourceLineNo">3001</span>    put.add(kv21);<a name="line.3001"></a>
+<span class="sourceLineNo">3002</span>    put.add(kv11);<a name="line.3002"></a>
+<span class="sourceLineNo">3003</span>    region.put(put);<a name="line.3003"></a>
+<span class="sourceLineNo">3004</span><a name="line.3004"></a>
+<span class="sourceLineNo">3005</span>    // Expected<a name="line.3005"></a>
+<span class="sourceLineNo">3006</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.3006"></a>
+<span class="sourceLineNo">3007</span>    expected.add(kv14);<a name="line.3007"></a>
+<span class="sourceLineNo">3008</span>    expected.add(kv13);<a name="line.3008"></a>
+<span class="sourceLineNo">3009</span>    expected.add(kv12);<a name="line.3009"></a>
+<span class="sourceLineNo">3010</span>    expected.add(kv24);<a name="line.3010"></a>
+<span class="sourceLineNo">3011</span>    expected.add(kv23);<a name="line.3011"></a>
+<span class="sourceLineNo">3012</span>    expected.add(kv22);<a name="line.3012"></a>
+<span class="sourceLineNo">3013</span><a name="line.3013"></a>
+<span class="sourceLineNo">3014</span>    Scan scan = new Scan(row1);<a name="line.3014"></a>
+<span class="sourceLineNo">3015</span>    scan.addColumn(fam1, qf1);<a name="line.3015"></a>
+<span class="sourceLineNo">3016</span>    scan.addColumn(fam1, qf2);<a name="line.3016"></a>
+<span class="sourceLineNo">3017</span>    int versions = 3;<a name="line.3017"></a>
+<span class="sourceLineNo">3018</span>    scan.setMaxVersions(versions);<a name="line.3018"></a>
+<span class="sourceLineNo">3019</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.3019"></a>
+<span class="sourceLineNo">3020</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.3020"></a>
+<span class="sourceLineNo">3021</span><a name="line.3021"></a>
+<span class="sourceLineNo">3022</span>    boolean hasNext = scanner.next(actual);<a name="line.3022"></a>
+<span class="sourceLineNo">3023</span>    assertEquals(false, hasNext);<a name="line.3023"></a>
+<span class="sourceLineNo">3024</span><a name="line.3024"></a>
+<span class="sourceLineNo">3025</span>    // Verify result<a name="line.3025"></a>
+<span class="sourceLineNo">3026</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.3026"></a>
+<span class="sourceLineNo">3027</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected.get(i), actual.get(i)));<a name="line.3027"></a>
+<span class="sourceLineNo">3028</span>    }<a name="line.3028"></a>
+<span class="sourceLineNo">3029</span>  }<a name="line.3029"></a>
+<span class="sourceLineNo">3030</span><a name="line.3030"></a>
+<span class="sourceLineNo">3031</span>  @Test<a name="line.3031"></a>
+<span class="sourceLineNo">3032</span>  public void testScanner_Wildcard_FromMemStore_EnforceVersions() throws IOException {<a name="line.3032"></a>
+<span class="sourceLineNo">3033</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.3033"></a>
+<span class="sourceLineNo">3034</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.3034"></a>
+<span class="sourceLineNo">3035</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.3035"></a>
+<span class="sourceLineNo">3036</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.3036"></a>
+<span class="sourceLineNo">3037</span>    byte[][] families = { fam1 };<a name="line.3037"></a>
+<span class="sourceLineNo">3038</span><a name="line.3038"></a>
+<span class="sourceLineNo">3039</span>    long ts1 = System.currentTimeMillis();<a name="line.3039"></a>
+<span class="sourceLineNo">3040</span>    long ts2 = ts1 + 1;<a name="line.3040"></a>
+<span class="sourceLineNo">3041</span>    long ts3 = ts1 + 2;<a name="line.3041"></a>
+<span class="sourceLineNo">3042</span><a name="line.3042"></a>
+<span class="sourceLineNo">3043</span>    // Setting up region<a name="line.3043"></a>
+<span class="sourceLineNo">3044</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.3044"></a>
+<span class="sourceLineNo">3045</span>    // Putting data in Region<a name="line.3045"></a>
+<span class="sourceLineNo">3046</span>    Put put = null;<a name="line.3046"></a>
+<span class="sourceLineNo">3047</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.3047"></a>
+<span class="sourceLineNo">3048</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.3048"></a>
+<span class="sourceLineNo">3049</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.3049"></a>
+<span class="sourceLineNo">3050</span><a name="line.3050"></a>
+<span class="sourceLineNo">3051</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.3051"></a>
+<span class="sourceLineNo">3052</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.3052"></a>
+<span class="sourceLineNo">3053</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.3053"></a>
+<span class="sourceLineNo">3054</span><a name="line.3054"></a>
+<span class="sourceLineNo">3055</span>    put = new Put(row1);<a name="line.3055"></a>
+<span class="sourceLineNo">3056</span>    put.add(kv13);<a name="line.3056"></a>
+<span class="sourceLineNo">3057</span>    put.add(kv12);<a name="line.3057"></a>
+<span class="sourceLineNo">3058</span>    put.add(kv11);<a name="line.3058"></a>
+<span class="sourceLineNo">3059</span>    put.add(kv23);<a name="line.3059"></a>
+<span class="sourceLineNo">3060</span>    put.add(kv22);<a name="line.3060"></a>
+<span class="sourceLineNo">3061</span>    put.add(kv21);<a name="line.3061"></a>
+<span class="sourceLineNo">3062</span>    region.put(put);<a name="line.3062"></a>
+<span class="sourceLineNo">3063</span><a name="line.3063"></a>
+<span class="sourceLineNo">3064</span>    // Expected<a name="line.3064"></a>
+<span class="sourceLineNo">3065</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.3065"></a>
+<span class="sourceLineNo">3066</span>    expected.add(kv13);<a name="line.3066"></a>
+<span class="sourceLineNo">3067</span>    expected.add(kv12);<a name="line.3067"></a>
+<span class="sourceLineNo">3068</span>    expected.add(kv23);<a name="line.3068"></a>
+<span class="sourceLineNo">3069</span>    expected.add(kv22);<a name="line.3069"></a>
+<span class="sourceLineNo">3070</span><a name="line.3070"></a>
+<span class="sourceLineNo">3071</span>    Scan scan = new Scan(row1);<a name="line.3071"></a>
+<span class="sourceLineNo">3072</span>    scan.addFamily(fam1);<a name="line.3072"></a>
+<span class="sourceLineNo">3073</span>    scan.setMaxVersions(MAX_VERSIONS);<a name="line.3073"></a>
+<span class="sourceLineNo">3074</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.3074"></a>
+<span class="sourceLineNo">3075</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.3075"></a>
+<span class="sourceLineNo">3076</span><a name="line.3076"></a>
+<span class="sourceLineNo">3077</span>    boolean hasNext = scanner.next(actual);<a name="line.3077"></a>
+<span class="sourceLineNo">3078</span>    assertEquals(false, hasNext);<a name="line.3078"></a>
+<span class="sourceLineNo">3079</span><a name="line.3079"></a>
+<span class="sourceLineNo">3080</span>    // Verify result<a name="line.3080"></a>
+<span class="sourceLineNo">3081</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.3081"></a>
+<span class="sourceLineNo">3082</span>      assertEquals(expected.get(i), actual.get(i));<a name="line.3082"></a>
+<span class="sourceLineNo">3083</span>    }<a name="line.3083"></a>
+<span class="sourceLineNo">3084</span>  }<a name="line.3084"></a>
+<span class="sourceLineNo">3085</span><a name="line.3085"></a>
+<span class="sourceLineNo">3086</span>  @Test<a name="line.3086"></a>
+<span class="sourceLineNo">3087</span>  public void testScanner_Wildcard_FromFilesOnly_EnforceVersions() throws IOException {<a name="line.3087"></a>
+<span class="sourceLineNo">3088</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.3088"></a>
+<span class="sourceLineNo">3089</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.3089"></a>
+<span class="sourceLineNo">3090</span>    byte[] qf2 = Bytes.toBytes("qualifier2");<a name="line.3090"></a>
+<span class="sourceLineNo">3091</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.3091"></a>
+<span class="sourceLineNo">3092</span><a name="line.3092"></a>
+<span class="sourceLineNo">3093</span>    long ts1 = 1; // System.currentTimeMillis();<a name="line.3093"></a>
+<span class="sourceLineNo">3094</span>    long ts2 = ts1 + 1;<a name="line.3094"></a>
+<span class="sourceLineNo">3095</span>    long ts3 = ts1 + 2;<a name="line.3095"></a>
+<span class="sourceLineNo">3096</span><a name="line.3096"></a>
+<span class="sourceLineNo">3097</span>    // Setting up region<a name="line.3097"></a>
+<span class="sourceLineNo">3098</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.3098"></a>
+<span class="sourceLineNo">3099</span>    // Putting data in Region<a name="line.3099"></a>
+<span class="sourceLineNo">3100</span>    Put put = null;<a name="line.3100"></a>
+<span class="sourceLineNo">3101</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.3101"></a>
+<span class="sourceLineNo">3102</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.3102"></a>
+<span class="sourceLineNo">3103</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.3103"></a>
+<span class="sourceLineNo">3104</span><a name="line.3104"></a>
+<span class="sourceLineNo">3105</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.3105"></a>
+<span class="sourceLineNo">3106</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.3106"></a>
+<span class="sourceLineNo">3107</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.3107"></a>
 <span class="sourceLineNo">3108</span><a name="line.3108"></a>
-<span class="sourceLineNo">3109</span>    // Expected<a name="line.3109"></a>
-<span class="sourceLineNo">3110</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.3110"></a>
-<span class="sourceLineNo">3111</span>    expected.add(kv13);<a name="line.3111"></a>
-<span class="sourceLineNo">3112</span>    expected.add(kv12);<a name="line.3112"></a>
-<span class="sourceLineNo">3113</span>    expected.add(kv23);<a name="line.3113"></a>
-<span class="sourceLineNo">3114</span>    expected.add(kv22);<a name="line.3114"></a>
-<span class="sourceLineNo">3115</span><a name="line.3115"></a>
-<span class="sourceLineNo">3116</span>    Scan scan = new Scan(row1);<a name="line.3116"></a>
-<span class="sourceLineNo">3117</span>    scan.addFamily(fam1);<a name="line.3117"></a>
-<span class="sourceLineNo">3118</span>    scan.setMaxVersions(MAX_VERSIONS);<a name="line.3118"></a>
-<span class="sourceLineNo">3119</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.3119"></a>
-<span class="sourceLineNo">3120</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.3120"></a>
-<span class="sourceLineNo">3121</span><a name="line.3121"></a>
-<span class="sourceLineNo">3122</span>    boolean hasNext = scanner.next(actual);<a name="line.3122"></a>
-<span class="sourceLineNo">3123</span>    assertEquals(false, hasNext);<a name="line.3123"></a>
-<span class="sourceLineNo">3124</span><a name="line.3124"></a>
-<span class="sourceLineNo">3125</span>    // Verify result<a name="line.3125"></a>
-<span class="sourceLineNo">3126</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.3126"></a>
-<span class="sourceLineNo">3127</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected.get(i), actual.get(i)));<a name="line.3127"></a>
-<span class="sourceLineNo">3128</span>    }<a name="line.3128"></a>
-<span class="sourceLineNo">3129</span>  }<a name="line.3129"></a>
-<span class="sourceLineNo">3130</span><a name="line.3130"></a>
-<span class="sourceLineNo">3131</span>  @Test<a name="line.3131"></a>
-<span class="sourceLineNo">3132</span>  public void testScanner_StopRow1542() throws IOException {<a name="line.3132"></a>
-<span class="sourceLineNo">3133</span>    byte[] family = Bytes.toBytes("testFamily");<a name="line.3133"></a>
-<span class="sourceLineNo">3134</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.3134"></a>
-<span class="sourceLineNo">3135</span>    byte[] row1 = Bytes.toBytes("row111");<a name="line.3135"></a>
-<span class="sourceLineNo">3136</span>    byte[] row2 = Bytes.toBytes("row222");<a name="line.3136"></a>
-<span class="sourceLineNo">3137</span>    byte[] row3 = Bytes.toBytes("row333");<a name="line.3137"></a>
-<span class="sourceLineNo">3138</span>    byte[] row4 = Bytes.toBytes("row444");<a name="line.3138"></a>
-<span class="sourceLineNo">3139</span>    byte[] row5 = Bytes.toBytes("row555");<a name="line.3139"></a>
+<span class="sourceLineNo">3109</span>    put = new Put(row1);<a name="line.3109"></a>
+<span class="sourceLineNo">3110</span>    put.add(kv13);<a name="line.3110"></a>
+<span class="sourceLineNo">3111</span>    put.add(kv12);<a name="line.3111"></a>
+<span class="sourceLineNo">3112</span>    put.add(kv11);<a name="line.3112"></a>
+<span class="sourceLineNo">3113</span>    put.add(kv23);<a name="line.3113"></a>
+<span class="sourceLineNo">3114</span>    put.add(kv22);<a name="line.3114"></a>
+<span class="sourceLineNo">3115</span>    put.add(kv21);<a name="line.3115"></a>
+<span class="sourceLineNo">3116</span>    region.put(put);<a name="line.3116"></a>
+<span class="sourceLineNo">3117</span>    region.flush(true);<a name="line.3117"></a>
+<span class="sourceLineNo">3118</span><a name="line.3118"></a>
+<span class="sourceLineNo">3119</span>    // Expected<a name="line.3119"></a>
+<span class="sourceLineNo">3120</span>    List&lt;Cell&gt; expected = new ArrayList&lt;&gt;();<a name="line.3120"></a>
+<span class="sourceLineNo">3121</span>    expected.add(kv13);<a name="line.3121"></a>
+<span class="sourceLineNo">3122</span>    expected.add(kv12);<a name="line.3122"></a>
+<span class="sourceLineNo">3123</span>    expected.add(kv23);<a name="line.3123"></a>
+<span class="sourceLineNo">3124</span>    expected.add(kv22);<a name="line.3124"></a>
+<span class="sourceLineNo">3125</span><a name="line.3125"></a>
+<span class="sourceLineNo">3126</span>    Scan scan = new Scan(row1);<a name="line.3126"></a>
+<span class="sourceLineNo">3127</span>    scan.addFamily(fam1);<a name="line.3127"></a>
+<span class="sourceLineNo">3128</span>    scan.setMaxVersions(MAX_VERSIONS);<a name="line.3128"></a>
+<span class="sourceLineNo">3129</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.3129"></a>
+<span class="sourceLineNo">3130</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.3130"></a>
+<span class="sourceLineNo">3131</span><a name="line.3131"></a>
+<span class="sourceLineNo">3132</span>    boolean hasNext = scanner.next(actual);<a name="line.3132"></a>
+<span class="sourceLineNo">3133</span>    assertEquals(false, hasNext);<a name="line.3133"></a>
+<span class="sourceLineNo">3134</span><a name="line.3134"></a>
+<span class="sourceLineNo">3135</span>    // Verify result<a name="line.3135"></a>
+<span class="sourceLineNo">3136</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.3136"></a>
+<span class="sourceLineNo">3137</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected.get(i), actual.get(i)));<a name="line.3137"></a>
+<span class="sourceLineNo">3138</span>    }<a name="line.3138"></a>
+<span class="sourceLineNo">3139</span>  }<a name="line.3139"></a>
 <span class="sourceLineNo">3140</span><a name="line.3140"></a>
-<span class="sourceLineNo">3141</span>    byte[] col1 = Bytes.toBytes("Pub111");<a name="line.3141"></a>
-<span class="sourceLineNo">3142</span>    byte[] col2 = Bytes.toBytes("Pub222");<a name="line.3142"></a>
-<span class="sourceLineNo">3143</span><a name="line.3143"></a>
-<span class="sourceLineNo">3144</span>    Put put = new Put(row1);<a name="line.3144"></a>
-<span class="sourceLineNo">3145</span>    put.addColumn(family, col1, Bytes.toBytes(10L));<a name="line.3145"></a>
-<span class="sourceLineNo">3146</span>    region.put(put);<a name="line.3146"></a>
-<span class="sourceLineNo">3147</span><a name="line.3147"></a>
-<span class="sourceLineNo">3148</span>    put = new Put(row2);<a name="line.3148"></a>
-<span class="sourceLineNo">3149</span>    put.addColumn(family, col1, Bytes.toBytes(15L));<a name="line.3149"></a>
-<span class="sourceLineNo">3150</span>    region.put(put);<a name="line.3150"></a>
-<span class="sourceLineNo">3151</span><a name="line.3151"></a>
-<span class="sourceLineNo">3152</span>    put = new Put(row3);<a name="line.3152"></a>
-<span class="sourceLineNo">3153</span>    put.addColumn(family, col2, Bytes.toBytes(20L));<a name="line.3153"></a>
-<span class="sourceLineNo">3154</span>    region.put(put);<a name="line.3154"></a>
-<span class="sourceLineNo">3155</span><a name="line.3155"></a>
-<span class="sourceLineNo">3156</span>    put = new Put(row4);<a name="line.3156"></a>
-<span class="sourceLineNo">3157</span>    put.addColumn(family, col2, Bytes.toBytes(30L));<a name="line.3157"></a>
-<span class="sourceLineNo">3158</span>    region.put(put);<a name="line.3158"></a>
-<span class="sourceLineNo">3159</span><a name="line.3159"></a>
-<span class="sourceLineNo">3160</span>    put = new Put(row5);<a name="line.3160"></a>
-<span class="sourceLineNo">3161</span>    put.addColumn(family, col1, Bytes.toBytes(40L));<a name="line.3161"></a>
-<span class="sourceLineNo">3162</span>    region.put(put);<a name="line.3162"></a>
-<span class="sourceLineNo">3163</span><a name="line.3163"></a>
-<span class="sourceLineNo">3164</span>    Scan scan = new Scan(row3, row4);<a name="line.3164"></a>
-<span class="sourceLineNo">3165</span>    scan.setMaxVersions();<a name="line.3165"></a>
-<span class="sourceLineNo">3166</span>    scan.addColumn(family, col1);<a name="line.3166"></a>
-<span class="sourceLineNo">3167</span>    InternalScanner s = region.getScanner(scan);<a name="line.3167"></a>
-<span class="sourceLineNo">3168</span><a name="line.3168"></a>
-<span class="sourceLineNo">3169</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.3169"></a>
-<span class="sourceLineNo">3170</span>    assertEquals(false, s.next(results));<a name="line.3170"></a>
-<span class="sourceLineNo">3171</span>    assertEquals(0, results.size());<a name="line.3171"></a>
-<span class="sourceLineNo">3172</span>  }<a name="line.3172"></a>
+<span class="sourceLineNo">3141</span>  @Test<a name="line.3141"></a>
+<span class="sourceLineNo">3142</span>  public void testScanner_StopRow1542() throws IOException {<a name="line.3142"></a>
+<span class="sourceLineNo">3143</span>    byte[] family = Bytes.toBytes("testFamily");<a name="line.3143"></a>
+<span class="sourceLineNo">3144</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.3144"></a>
+<span class="sourceLineNo">3145</span>    byte[] row1 = Bytes.toBytes("row111");<a name="line.3145"></a>
+<span class="sourceLineNo">3146</span>    byte[] row2 = Bytes.toBytes("row222");<a name="line.3146"></a>
+<span class="sourceLineNo">3147</span>    byte[] row3 = Bytes.toBytes("row333");<a name="line.3147"></a>
+<span class="sourceLineNo">3148</span>    byte[] row4 = Bytes.toBytes("row444");<a name="line.3148"></a>
+<span class="sourceLineNo">3149</span>    byte[] row5 = Bytes.toBytes("row555");<a name="line.3149"></a>
+<span class="sourceLineNo">3150</span><a name="line.3150"></a>
+<span class="sourceLineNo">3151</span>    byte[] col1 = Bytes.toBytes("Pub111");<a name="line.3151"></a>
+<span class="sourceLineNo">3152</span>    byte[] col2 = Bytes.toBytes("Pub222");<a name="line.3152"></a>
+<span class="sourceLineNo">3153</span><a name="line.3153"></a>
+<span class="sourceLineNo">3154</span>    Put put = new Put(row1);<a name="line.3154"></a>
+<span class="sourceLineNo">3155</span>    put.addColumn(family, col1, Bytes.toBytes(10L));<a name="line.3155"></a>
+<span class="sourceLineNo">3156</span>    region.put(put);<a name="line.3156"></a>
+<span class="sourceLineNo">3157</span><a name="line.3157"></a>
+<span class="sourceLineNo">3158</span>    put = new Put(row2);<a name="line.3158"></a>
+<span class="sourceLineNo">3159</span>    put.addColumn(family, col1, Bytes.toBytes(15L));<a name="line.3159"></a>
+<span class="sourceLineNo">3160</span>    region.put(put);<a name="line.3160"></a>
+<span class="sourceLineNo">3161</span><a name="line.3161"></a>
+<span class="sourceLineNo">3162</span>    put = new Put(row3);<a name="line.3162"></a>
+<span class="sourceLineNo">3163</span>    put.addColumn(family, col2, Bytes.toBytes(20L));<a name="line.3163"></a>
+<span class="sourceLineNo">3164</span>    region.put(put);<a name="line.3164"></a>
+<span class="sourceLineNo">3165</span><a name="line.3165"></a>
+<span class="sourceLineNo">3166</span>    put = new Put(row4);<a name="line.3166"></a>
+<span class="sourceLineNo">3167</span>    put.addColumn(family, col2, Bytes.toBytes(30L));<a name="line.3167"></a>
+<span class="sourceLineNo">3168</span>    region.put(put);<a name="line.3168"></a>
+<span class="sourceLineNo">3169</span><a name="line.3169"></a>
+<span class="sourceLineNo">3170</span>    put = new Put(row5);<a name="line.3170"></a>
+<span class="sourceLineNo">3171</span>    put.addColumn(family, col1, Bytes.toBytes(40L));<a name="line.3171"></a>
+<span class="sourceLineNo">3172</span>    region.put(put);<a name="line.3172"></a>
 <span class="sourceLineNo">3173</span><a name="line.3173"></a>
-<span class="sourceLineNo">3174</span>  @Test<a name="line.3174"></a>
-<span class="sourceLineNo">3175</span>  public void testScanner_Wildcard_FromMemStoreAndFiles_EnforceVersions() throws IOException {<a name="line.3175"></a>
-<span class="sourceLineNo">3176</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.3176"></a>
-<span class="sourceLineNo">3177</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.3177"></a>
-<span class="sourceLineNo">3178</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.3178"></a>
-<span class="sourceLineNo">3179</span>    byte[] qf2 = Bytes.toBytes("quateslifier2");<a name="line.3179"></a>
-<span class="sourceLineNo">3180</span><a name="line.3180"></a>
-<span class="sourceLineNo">3181</span>    long ts1 = 1;<a name="line.3181"></a>
-<span class="sourceLineNo">3182</span>    long ts2 = ts1 + 1;<a name="line.3182"></a>
-<span class="sourceLineNo">3183</span>    long ts3 = ts1 + 2;<a name="line.3183"></a>
-<span class="sourceLineNo">3184</span>    long ts4 = ts1 + 3;<a name="line.3184"></a>
-<span class="sourceLineNo">3185</span><a name="line.3185"></a>
-<span class="sourceLineNo">3186</span>    // Setting up region<a name="line.3186"></a>
-<span class="sourceLineNo">3187</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.3187"></a>
-<span class="sourceLineNo">3188</span>    // Putting data in Region<a name="line.3188"></a>
-<span class="sourceLineNo">3189</span>    KeyValue kv14 = new KeyValue(row1, fam1, qf1, ts4, KeyValue.Type.Put, null);<a name="line.3189"></a>
-<span class="sourceLineNo">3190</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.3190"></a>
-<span class="sourceLineNo">3191</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.3191"></a>
-<span class="sourceLineNo">3192</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.3192"></a>
-<span class="sourceLineNo">3193</span><a name="line.3193"></a>
-<span class="sourceLineNo">3194</span>    KeyValue kv24 = new KeyValue(row1, fam1, qf2, ts4, KeyValue.Type.Put, null);<a name="line.3194"></a>
-<span class="sourceLineNo">3195</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.3195"></a>
-<span class="sourceLineNo">3196</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.3196"></a>
-<span class="sourceLineNo">3197</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.3197"></a>
-<span class="sourceLineNo">3198</span><a name="line.3198"></a>
-<span class="sourceLineNo">3199</span>    Put put = null;<a name="line.3199"></a>
-<span class="sourceLineNo">3200</span>    put = new Put(row1);<a name="line.3200"></a>
-<span class="sourceLineNo">3201</span>    put.add(kv14);<a name="line.3201"></a>
-<span class="sourceLineNo">3202</span>    put.add(kv24);<a name="line.3202"></a>
-<span class="sourceLineNo">3203</span>    region.put(put);<a name="line.3203"></a>
-<span class="sourceLineNo">3204</span>    region.flush(true);<a name="line.3204"></a>
-<span class="sourceLineNo">3205</span><a name="line.3205"></a>
-<span class="sourceLineNo">3206</span>    put = new Put(row1);<a name="line.3206"></a>
-<span class="sourceLineNo">3207</span>    put.add(kv23);<a name="line.3207"></a>
-<span class="sourceLineNo">3208</span>    put.add(kv13);<a name="line.3208"></a>
-<span class="sourceLineNo">3209</span>    region.put(put);<a name="line.3209"></a>
-<span class="sourceLineNo">3210</span>    region.flush(true);<a name="line.3210"></a>
-<span class="sourceLineNo">3211</span><a name="line.3211"></a>
-<span class="sourceLineNo">3212</span>    put = new Put(row1);<a name="line.3212"></a>
-<span class="sourceLineNo">3213</span>    put.add(kv22);<a name="line.3213"></a>
-<span class="sourceLineNo">3214</span>    put.add(kv12);<a name="line.3214"></a>
-<span class="sourceLineNo">3215</span>    region.put(put);<a name="line.3215"></a>
-<span class="sourceLineNo">3216</span>    region.flush(true);<a name="line.3216"></a>
-<span class="sourceLineNo">3217</span><a name="line.3217"></a>
-<span class="sourceLineNo">3218</span>    put = new Put(row1);<a name="line.3218"></a>
-<span class="sourceLineNo">3219</span>    put.add(kv21);<a name="line.3219"></a>
-<span class="sourceLineNo">3220</span>    put.add(kv11);<a name="line.3220"></a>
-<span class="sourceLineNo">3221</span>    region.put(put);<a name="line.3221"></a>
-<span class="sourceLineNo">3222</span><a name="line.3222"></a>
-<span class="sourceLineNo">3223</span>    // Expected<a name="line.3223"></a>
-<span class="sourceLineNo">3224</span>    List&lt;KeyValue&gt; expected = new ArrayList&lt;&gt;();<a name="line.3224"></a>
-<span class="sourceLineNo">3225</span>    expected.add(kv14);<a name="line.3225"></a>
-<span class="sourceLineNo">3226</span>    expected.add(kv13);<a name="line.3226"></a>
-<span class="sourceLineNo">3227</span>    expected.add(kv12);<a name="line.3227"></a>
-<span class="sourceLineNo">3228</span>    expected.add(kv24);<a name="line.3228"></a>
-<span class="sourceLineNo">3229</span>    expected.add(kv23);<a name="line.3229"></a>
-<span class="sourceLineNo">3230</span>    expected.add(kv22);<a name="line.3230"></a>
-<span class="sourceLineNo">3231</span><a name="line.3231"></a>
-<span class="sourceLineNo">3232</span>    Scan scan = new Scan(row1);<a name="line.3232"></a>
-<span class="sourceLineNo">3233</span>    int versions = 3;<a name="line.3233"></a>
-<span class="sourceLineNo">3234</span>    scan.setMaxVersions(versions);<a name="line.3234"></a>
-<span class="sourceLineNo">3235</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.3235"></a>
-<span class="sourceLineNo">3236</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.3236"></a>
-<span class="sourceLineNo">3237</span><a name="line.3237"></a>
-<span class="sourceLineNo">3238</span>    boolean hasNext = scanner.next(actual);<a name="line.3238"></a>
-<span class="sourceLineNo">3239</span>    assertEquals(false, hasNext);<a name="line.3239"></a>
-<span class="sourceLineNo">3240</span><a name="line.3240"></a>
-<span class="sourceLineNo">3241</span>    // Verify result<a name="line.3241"></a>
-<span class="sourceLineNo">3242</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.3242"></a>
-<span class="sourceLineNo">3243</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected.get(i), actual.get(i)));<a name="line.3243"></a>
-<span class="sourceLineNo">3244</span>    }<a name="line.3244"></a>
-<span class="sourceLineNo">3245</span>  }<a name="line.3245"></a>
-<span class="sourceLineNo">3246</span><a name="line.3246"></a>
-<span class="sourceLineNo">3247</span>  /**<a name="line.3247"></a>
-<span class="sourceLineNo">3248</span>   * Added for HBASE-5416<a name="line.3248"></a>
-<span class="sourceLineNo">3249</span>   *<a name="line.3249"></a>
-<span class="sourceLineNo">3250</span>   * Here we test scan optimization when only subset of CFs are used in filter<a name="line.3250"></a>
-<span class="sourceLineNo">3251</span>   * conditions.<a name="line.3251"></a>
-<span class="sourceLineNo">3252</span>   */<a name="line.3252"></a>
-<span class="sourceLineNo">3253</span>  @Test<a name="line.3253"></a>
-<span class="sourceLineNo">3254</span>  public void testScanner_JoinedScanners() throws IOException {<a name="line.3254"></a>
-<span class="sourceLineNo">3255</span>    byte[] cf_essential = Bytes.toBytes("essential");<a name="line.3255"></a>
-<span class="sourceLineNo">3256</span>    byte[] cf_joined = Bytes.toBytes("joined");<a name="line.3256"></a>
-<span class="sourceLineNo">3257</span>    byte[] cf_alpha = Bytes.toBytes("alpha");<a name="line.3257"></a>
-<span class="sourceLineNo">3258</span>    this.region = initHRegion(tableName, method, CONF, cf_essential, cf_joined, cf_alpha);<a name="line.3258"></a>
-<span class="sourceLineNo">3259</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.3259"></a>
-<span class="sourceLineNo">3260</span>    byte[] row2 = Bytes.toBytes("row2");<a name="line.3260"></a>
-<span class="sourceLineNo">3261</span>    byte[] row3 = Bytes.toBytes("row3");<a name="line.3261"></a>
-<span class="sourceLineNo">3262</span><a name="line.3262"></a>
-<span class="sourceLineNo">3263</span>    byte[] col_normal = Bytes.toBytes("d");<a name="line.3263"></a>
-<span class="sourceLineNo">3264</span>    byte[] col_alpha = Bytes.toBytes("a");<a name="line.3264"></a>
-<span class="sourceLineNo">3265</span><a name="line.3265"></a>
-<span class="sourceLineNo">3266</span>    byte[] filtered_val = Bytes.toBytes(3);<a name="line.3266"></a>
-<span class="sourceLineNo">3267</span><a name="line.3267"></a>
-<span class="sourceLineNo">3268</span>    Put put = new Put(row1);<a name="line.3268"></a>
-<span class="sourceLineNo">3269</span>    put.addColumn(cf_essential, col_normal, Bytes.toBytes(1));<a name="line.3269"></a>
-<span class="sourceLineNo">3270</span>    put.addColumn(cf_joined, col_alpha, Bytes.toBytes(1));<a name="line.3270"></a>
-<span class="sourceLineNo">3271</span>    region.put(put);<a name="line.3271"></a>
+<span class="sourceLineNo">3174</span>    Scan scan = new Scan(row3, row4);<a name="line.3174"></a>
+<span class="sourceLineNo">3175</span>    scan.setMaxVersions();<a name="line.3175"></a>
+<span class="sourceLineNo">3176</span>    scan.addColumn(family, col1);<a name="line.3176"></a>
+<span class="sourceLineNo">3177</span>    InternalScanner s = region.getScanner(scan);<a name="line.3177"></a>
+<span class="sourceLineNo">3178</span><a name="line.3178"></a>
+<span class="sourceLineNo">3179</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.3179"></a>
+<span class="sourceLineNo">3180</span>    assertEquals(false, s.next(results));<a name="line.3180"></a>
+<span class="sourceLineNo">3181</span>    assertEquals(0, results.size());<a name="line.3181"></a>
+<span class="sourceLineNo">3182</span>  }<a name="line.3182"></a>
+<span class="sourceLineNo">3183</span><a name="line.3183"></a>
+<span class="sourceLineNo">3184</span>  @Test<a name="line.3184"></a>
+<span class="sourceLineNo">3185</span>  public void testScanner_Wildcard_FromMemStoreAndFiles_EnforceVersions() throws IOException {<a name="line.3185"></a>
+<span class="sourceLineNo">3186</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.3186"></a>
+<span class="sourceLineNo">3187</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.3187"></a>
+<span class="sourceLineNo">3188</span>    byte[] qf1 = Bytes.toBytes("qualifier1");<a name="line.3188"></a>
+<span class="sourceLineNo">3189</span>    byte[] qf2 = Bytes.toBytes("quateslifier2");<a name="line.3189"></a>
+<span class="sourceLineNo">3190</span><a name="line.3190"></a>
+<span class="sourceLineNo">3191</span>    long ts1 = 1;<a name="line.3191"></a>
+<span class="sourceLineNo">3192</span>    long ts2 = ts1 + 1;<a name="line.3192"></a>
+<span class="sourceLineNo">3193</span>    long ts3 = ts1 + 2;<a name="line.3193"></a>
+<span class="sourceLineNo">3194</span>    long ts4 = ts1 + 3;<a name="line.3194"></a>
+<span class="sourceLineNo">3195</span><a name="line.3195"></a>
+<span class="sourceLineNo">3196</span>    // Setting up region<a name="line.3196"></a>
+<span class="sourceLineNo">3197</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.3197"></a>
+<span class="sourceLineNo">3198</span>    // Putting data in Region<a name="line.3198"></a>
+<span class="sourceLineNo">3199</span>    KeyValue kv14 = new KeyValue(row1, fam1, qf1, ts4, KeyValue.Type.Put, null);<a name="line.3199"></a>
+<span class="sourceLineNo">3200</span>    KeyValue kv13 = new KeyValue(row1, fam1, qf1, ts3, KeyValue.Type.Put, null);<a name="line.3200"></a>
+<span class="sourceLineNo">3201</span>    KeyValue kv12 = new KeyValue(row1, fam1, qf1, ts2, KeyValue.Type.Put, null);<a name="line.3201"></a>
+<span class="sourceLineNo">3202</span>    KeyValue kv11 = new KeyValue(row1, fam1, qf1, ts1, KeyValue.Type.Put, null);<a name="line.3202"></a>
+<span class="sourceLineNo">3203</span><a name="line.3203"></a>
+<span class="sourceLineNo">3204</span>    KeyValue kv24 = new KeyValue(row1, fam1, qf2, ts4, KeyValue.Type.Put, null);<a name="line.3204"></a>
+<span class="sourceLineNo">3205</span>    KeyValue kv23 = new KeyValue(row1, fam1, qf2, ts3, KeyValue.Type.Put, null);<a name="line.3205"></a>
+<span class="sourceLineNo">3206</span>    KeyValue kv22 = new KeyValue(row1, fam1, qf2, ts2, KeyValue.Type.Put, null);<a name="line.3206"></a>
+<span class="sourceLineNo">3207</span>    KeyValue kv21 = new KeyValue(row1, fam1, qf2, ts1, KeyValue.Type.Put, null);<a name="line.3207"></a>
+<span class="sourceLineNo">3208</span><a name="line.3208"></a>
+<span class="sourceLineNo">3209</span>    Put put = null;<a name="line.3209"></a>
+<span class="sourceLineNo">3210</span>    put = new Put(row1);<a name="line.3210"></a>
+<span class="sourceLineNo">3211</span>    put.add(kv14);<a name="line.3211"></a>
+<span class="sourceLineNo">3212</span>    put.add(kv24);<a name="line.3212"></a>
+<span class="sourceLineNo">3213</span>    region.put(put);<a name="line.3213"></a>
+<span class="sourceLineNo">3214</span>    region.flush(true);<a name="line.3214"></a>
+<span class="sourceLineNo">3215</span><a name="line.3215"></a>
+<span class="sourceLineNo">3216</span>    put = new Put(row1);<a name="line.3216"></a>
+<span class="sourceLineNo">3217</span>    put.add(kv23);<a name="line.3217"></a>
+<span class="sourceLineNo">3218</span>    put.add(kv13);<a name="line.3218"></a>
+<span class="sourceLineNo">3219</span>    region.put(put);<a name="line.3219"></a>
+<span class="sourceLineNo">3220</span>    region.flush(true);<a name="line.3220"></a>
+<span class="sourceLineNo">3221</span><a name="line.3221"></a>
+<span class="sourceLineNo">3222</span>    put = new Put(row1);<a name="line.3222"></a>
+<span class="sourceLineNo">3223</span>    put.add(kv22);<a name="line.3223"></a>
+<span class="sourceLineNo">3224</span>    put.add(kv12);<a name="line.3224"></a>
+<span class="sourceLineNo">3225</span>    region.put(put);<a name="line.3225"></a>
+<span class="sourceLineNo">3226</span>    region.flush(true);<a name="line.3226"></a>
+<span class="sourceLineNo">3227</span><a name="line.3227"></a>
+<span class="sourceLineNo">3228</span>    put = new Put(row1);<a name="line.3228"></a>
+<span class="sourceLineNo">3229</span>    put.add(kv21);<a name="line.3229"></a>
+<span class="sourceLineNo">3230</span>    put.add(kv11);<a name="line.3230"></a>
+<span class="sourceLineNo">3231</span>    region.put(put);<a name="line.3231"></a>
+<span class="sourceLineNo">3232</span><a name="line.3232"></a>
+<span class="sourceLineNo">3233</span>    // Expected<a name="line.3233"></a>
+<span class="sourceLineNo">3234</span>    List&lt;KeyValue&gt; expected = new ArrayList&lt;&gt;();<a name="line.3234"></a>
+<span class="sourceLineNo">3235</span>    expected.add(kv14);<a name="line.3235"></a>
+<span class="sourceLineNo">3236</span>    expected.add(kv13);<a name="line.3236"></a>
+<span class="sourceLineNo">3237</span>    expected.add(kv12);<a name="line.3237"></a>
+<span class="sourceLineNo">3238</span>    expected.add(kv24);<a name="line.3238"></a>
+<span class="sourceLineNo">3239</span>    expected.add(kv23);<a name="line.3239"></a>
+<span class="sourceLineNo">3240</span>    expected.add(kv22);<a name="line.3240"></a>
+<span class="sourceLineNo">3241</span><a name="line.3241"></a>
+<span class="sourceLineNo">3242</span>    Scan scan = new Scan(row1);<a name="line.3242"></a>
+<span class="sourceLineNo">3243</span>    int versions = 3;<a name="line.3243"></a>
+<span class="sourceLineNo">3244</span>    scan.setMaxVersions(versions);<a name="line.3244"></a>
+<span class="sourceLineNo">3245</span>    List&lt;Cell&gt; actual = new ArrayList&lt;&gt;();<a name="line.3245"></a>
+<span class="sourceLineNo">3246</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.3246"></a>
+<span class="sourceLineNo">3247</span><a name="line.3247"></a>
+<span class="sourceLineNo">3248</span>    boolean hasNext = scanner.next(actual);<a name="line.3248"></a>
+<span class="sourceLineNo">3249</span>    assertEquals(false, hasNext);<a name="line.3249"></a>
+<span class="sourceLineNo">3250</span><a name="line.3250"></a>
+<span class="sourceLineNo">3251</span>    // Verify result<a name="line.3251"></a>
+<span class="sourceLineNo">3252</span>    for (int i = 0; i &lt; expected.size(); i++) {<a name="line.3252"></a>
+<span class="sourceLineNo">3253</span>      assertTrue(PrivateCellUtil.equalsIgnoreMvccVersion(expected.get(i), actual.get(i)));<a name="line.3253"></a>
+<span class="sourceLineNo">3254</span>    }<a name="line.3254"></a>
+<span class="sourceLineNo">3255</span>  }<a name="line.3255"></a>
+<span class="sourceLineNo">3256</span><a name="line.3256"></a>
+<span class="sourceLineNo">3257</span>  /**<a name="line.3257"></a>
+<span class="sourceLineNo">3258</span>   * Added for HBASE-5416<a name="line.3258"></a>
+<span class="sourceLineNo">3259</span>   *<a name="line.3259"></a>
+<span class="sourceLineNo">3260</span>   * Here we test scan optimization when only subset of CFs are used in filter<a name="line.3260"></a>
+<span class="sourceLineNo">3261</span>   * conditions.<a name="line.3261"></a>
+<span class="sourceLineNo">3262</span>   */<a name="line.3262"></a>
+<span class="sourceLineNo">3263</span>  @Test<a name="line.3263"></a>
+<span class="sourceLineNo">3264</span>  public void testScanner_JoinedScanners() throws IOException {<a name="line.3264"></a>
+<span class="sourceLineNo">3265</span>    byte[] cf_essential = Bytes.toBytes("essential");<a name="line.3265"></a>
+<span class="sourceLineNo">3266</span>    byte[] cf_joined = Bytes.toBytes("joined");<a name="line.3266"></a>
+<span class="sourceLineNo">3267</span>    byte[] cf_alpha = Bytes.toBytes("alpha");<a name="line.3267"></a>
+<span class="sourceLineNo">3268</span>    this.region = initHRegion(tableName, method, CONF, cf_essential, cf_joined, cf_alpha);<a name="line.3268"></a>
+<span class="sourceLineNo">3269</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.3269"></a>
+<span class="sourceLineNo">3270</span>    byte[] row2 = Bytes.toBytes("row2");<a name="line.3270"></a>
+<span class="sourceLineNo">3271</span>    byte[] row3 = Bytes.toBytes("row3");<a name="line.3271"></a>
 <span class="sourceLineNo">3272</span><a name="line.3272"></a>
-<span class="sourceLineNo">3273</span>    put = new Put(row2);<a name="line.3273"></a>
-<span class="sourceLineNo">3274</span>    put.addColumn(cf_essential, col_alpha, Bytes.toBytes(2));<a name="line.3274"></a>
-<span class="sourceLineNo">3275</span>    put.addColumn(cf_joined, col_normal, Bytes.toBytes(2));<a name="line.3275"></a>
-<span class="sourceLineNo">3276</span>    put.addColumn(cf_alpha, col_alpha, Bytes.toBytes(2));<a name="line.3276"></a>
-<span class="sourceLineNo">3277</span>    region.put(put);<a name="line.3277"></a>
-<span class="sourceLineNo">3278</span><a name="line.3278"></a>
-<span class="sourceLineNo">3279</span>    put = new Put(row3);<a name="line.3279"></a>
-<span class="sourceLineNo">3280</span>    put.addColumn(cf_essential, col_normal, filtered_val);<a name="line.3280"></a>
-<span class="sourceLineNo">3281</span>    put.addColumn(cf_joined, col_normal, filtered_val);<a name="line.3281"></a>
-<span class="sourceLineNo">3282</span>    region.put(put);<a name="line.3282"></a>
-<span class="sourceLineNo">3283</span><a name="line.3283"></a>
-<span class="sourceLineNo">3284</span>    // Check two things:<a name="line.3284"></a>
-<span class="sourceLineNo">3285</span>    // 1. result list contains expected values<a name="line.3285"></a>
-<span class="sourceLineNo">3286</span>    // 2. result list is sorted properly<a name="line.3286"></a>
-<span class="sourceLineNo">3287</span><a name="line.3287"></a>
-<span class="sourceLineNo">3288</span>    Scan scan = new Scan();<a name="line.3288"></a>
-<span class="sourceLineNo">3289</span>    Filter filter = new SingleColumnValueExcludeFilter(cf_essential, col_normal,<a name="line.3289"></a>
-<span class="sourceLineNo">3290</span>            CompareOperator.NOT_EQUAL, filtered_val);<a name="line.3290"></a>
-<span class="sourceLineNo">3291</span>    scan.setFilter(filter);<a name="line.3291"></a>
-<span class="sourceLineNo">3292</span>    scan.setLoadColumnFamiliesOnDemand(true);<a name="line.3292"></a>
-<span class="sourceLineNo">3293</span>    InternalScanner s = region.getScanner(scan);<a name="line.3293"></a>
-<span class="sourceLineNo">3294</span><a name="line.3294"></a>
-<span class="sourceLineNo">3295</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.3295"></a>
-<span class="sourceLineNo">3296</span>    assertTrue(s.next(results));<a name="line.3296"></a>
-<span class="sourceLineNo">3297</span>    assertEquals(1, results.size());<a name="line.3297"></a>
-<span class="sourceLineNo">3298</span>    results.clear();<a name="line.3298"></a>
-<span class="sourceLineNo">3299</span><a name="line.3299"></a>
-<span class="sourceLineNo">3300</span>    assertTrue(s.next(results));<a name="line.3300"></a>
-<span class="sourceLineNo">3301</span>    assertEquals(3, results.size());<a name="line.3301"></a>
-<span class="sourceLineNo">3302</span>    assertTrue("orderCheck", CellUtil.matchingFamily(results.get(0), cf_alpha));<a name="line.3302"></a>
-<span class="sourceLineNo">3303</span>    assertTrue("orderCheck", CellUtil.matchingFamily(results.get(1), cf_essential));<a name="line.3303"></a>
-<span class="sourceLineNo">3304</span>    assertTrue("orderCheck", CellUtil.matchingFamily(results.get(2), cf_joined));<a name="line.3304"></a>
-<span class="sourceLineNo">3305</span>    results.clear();<a name="line.3305"></a>
-<span class="sourceLineNo">3306</span><a name="line.3306"></a>
-<span class="sourceLineNo">3307</span>    assertFalse(s.next(results));<a name="line.3307"></a>
-<span class="sourceLineNo">3308</span>    assertEquals(0, results.size());<a name="line.3308"></a>
-<span class="sourceLineNo">3309</span>  }<a name="line.3309"></a>
-<span class="sourceLineNo">3310</span><a name="line.3310"></a>
-<span class="sourceLineNo">3311</span>  /**<a name="line.3311"></a>
-<span class="sourceLineNo">3312</span>   * HBASE-5416<a name="line.3312"></a>
-<span class="sourceLineNo">3313</span>   *<a name="line.3313"></a>
-<span class="sourceLineNo">3314</span>   * Test case when scan limits amount of KVs returned on each next() call.<a name="line.3314"></a>
-<span class="sourceLineNo">3315</span>   */<a name="line.3315"></a>
-<span class="sourceLineNo">3316</span>  @Test<a name="line.3316"></a>
-<span class="sourceLineNo">3317</span>  public void testScanner_JoinedScannersWithLimits() throws IOException {<a name="line.3317"></a>
-<span class="sourceLineNo">3318</span>    final byte[] cf_first = Bytes.toBytes("first");<a name="line.3318"></a>
-<span class="sourceLineNo">3319</span>    final byte[] cf_second = Bytes.toBytes("second");<a name="line.3319"></a>
+<span class="sourceLineNo">3273</span>    byte[] col_normal = Bytes.toBytes("d");<a name="line.3273"></a>
+<span class="sourceLineNo">3274</span>    byte[] col_alpha = Bytes.toBytes("a");<a name="line.3274"></a>
+<span class="sourceLineNo">3275</span><a name="line.3275"></a>
+<span class="sourceLineNo">3276</span>    byte[] filtered_val = Bytes.toBytes(3);<a name="line.3276"></a>
+<span class="sourceLineNo">3277</span><a name="line.3277"></a>
+<span class="sourceLineNo">3278</span>    Put put = new Put(row1);<a name="line.3278"></a>
+<span class="sourceLineNo">3279</span>    put.addColumn(cf_essential, col_normal, Bytes.toBytes(1));<a name="line.3279"></a>
+<span class="sourceLineNo">3280</span>    put.addColumn(cf_joined, col_alpha, Bytes.toBytes(1));<a name="line.3280"></a>
+<span class="sourceLineNo">3281</span>    region.put(put);<a name="line.3281"></a>
+<span class="sourceLineNo">3282</span><a name="line.3282"></a>
+<span class="sourceLineNo">3283</span>    put = new Put(row2);<a name="line.3283"></a>
+<span class="sourceLineNo">3284</span>    put.addColumn(cf_essential, col_alpha, Bytes.toBytes(2));<a name="line.3284"></a>
+<span class="sourceLineNo">3285</span>    put.addColumn(cf_joined, col_normal, Bytes.toBytes(2));<a name="line.3285"></a>
+<span class="sourceLineNo">3286</span>    put.addColumn(cf_alpha, col_alpha, Bytes.toBytes(2));<a name="line.3286"></a>
+<span class="sourceLineNo">3287</span>    region.put(put);<a name="line.3287"></a>
+<span class="sourceLineNo">3288</span><a name="line.3288"></a>
+<span class="sourceLineNo">3289</span>    put = new Put(row3);<a name="line.3289"></a>
+<span class="sourceLineNo">3290</span>    put.addColumn(cf_essential, col_normal, filtered_val);<a name="line.3290"></a>
+<span class="sourceLineNo">3291</span>    put.addColumn(cf_joined, col_normal, filtered_val);<a name="line.3291"></a>
+<span class="sourceLineNo">3292</span>    region.put(put);<a name="line.3292"></a>
+<span class="sourceLineNo">3293</span><a name="line.3293"></a>
+<span class="sourceLineNo">3294</span>    // Check two things:<a name="line.3294"></a>
+<span class="sourceLineNo">3295</span>    // 1. result list contains expected values<a name="line.3295"></a>
+<span class="sourceLineNo">3296</span>    // 2. result list is sorted properly<a name="line.3296"></a>
+<span class="sourceLineNo">3297</span><a name="line.3297"></a>
+<span class="sourceLineNo">3298</span>    Scan scan = new Scan();<a name="line.3298"></a>
+<span class="sourceLineNo">3299</span>    Filter filter = new SingleColumnValueExcludeFilter(cf_essential, col_normal,<a name="line.3299"></a>
+<span class="sourceLineNo">3300</span>            CompareOperator.NOT_EQUAL, filtered_val);<a name="line.3300"></a>
+<span class="sourceLineNo">3301</span>    scan.setFilter(filter);<a name="line.3301"></a>
+<span class="sourceLineNo">3302</span>    scan.setLoadColumnFamiliesOnDemand(true);<a name="line.3302"></a>
+<span class="sourceLineNo">3303</span>    InternalScanner s = region.getScanner(scan);<a name="line.3303"></a>
+<span class="sourceLineNo">3304</span><a name="line.3304"></a>
+<span class="sourceLineNo">3305</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.3305"></a>
+<span class="sourceLineNo">3306</span>    assertTrue(s.next(results));<a name="line.3306"></a>
+<span class="sourceLineNo">3307</span>    assertEquals(1, results.size());<a name="line.3307"></a>
+<span class="sourceLineNo">3308</span>    results.clear();<a name="line.3308"></a>
+<span class="sourceLineNo">3309</span><a name="line.3309"></a>
+<span class="sourceLineNo">3310</span>    assertTrue(s.next(results));<a name="line.3310"></a>
+<span class="sourceLineNo">3311</span>    assertEquals(3, results.size());<a name="line.3311"></a>
+<span class="sourceLineNo">3312</span>    assertTrue("orderCheck", CellUtil.matchingFamily(results.get(0), cf_alpha));<a name="line.3312"></a>
+<span class="sourceLineNo">3313</span>    assertTrue("orderCheck", CellUtil.matchingFamily(results.get(1), cf_essential));<a name="line.3313"></a>
+<span class="sourceLineNo">3314</span>    assertTrue("orderCheck", CellUtil.matchingFamily(results.get(2), cf_joined));<a name="line.3314"></a>
+<span class="sourceLineNo">3315</span>    results.clear();<a name="line.3315"></a>
+<span class="sourceLineNo">3316</span><a name="line.3316"></a>
+<span class="sourceLineNo">3317</span>    assertFalse(s.next(results));<a name="line.3317"></a>
+<span class="sourceLineNo">3318</span>    assertEquals(0, results.size());<a name="line.3318"></a>
+<span class="sourceLineNo">3319</span>  }<a name="line.3319"></a>
 <span class="sourceLineNo">3320</span><a name="line.3320"></a>
-<span class="sourceLineNo">3321</span>    this.region = initHRegion(tableName, method, CONF, cf_first, cf_second);<a name="line.3321"></a>
-<span class="sourceLineNo">3322</span>    final byte[] col_a = Bytes.toBytes("a");<a name="line.3322"></a>
-<span class="sourceLineNo">3323</span>    final byte[] col_b = Bytes.toBytes("b");<a name="line.3323"></a>
-<span class="sourceLineNo">3324</span><a name="line.3324"></a>
-<span class="sourceLineNo">3325</span>    Put put;<a name="line.3325"></a>
-<span class="sourceLineNo">3326</span><a name="line.3326"></a>
-<span class="sourceLineNo">3327</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.3327"></a>
-<span class="sourceLineNo">3328</span>      put = new Put(Bytes.toBytes("r" + Integer.toString(i)));<a name="line.3328"></a>
-<span class="sourceLineNo">3329</span>      put.addColumn(cf_first, col_a, Bytes.toBytes(i));<a name="line.3329"></a>
-<span class="sourceLineNo">3330</span>      if (i &lt; 5) {<a name="line.3330"></a>
-<span class="sourceLineNo">3331</span>        put.addColumn(cf_first, col_b, Bytes.toBytes(i));<a name="line.3331"></a>
-<span class="sourceLineNo">3332</span>        put.addColumn(cf_second, col_a, Bytes.toBytes(i));<a name="line.3332"></a>
-<span class="sourceLineNo">3333</span>        put.addColumn(cf_second, col_b, Bytes.toBytes(i));<a name="line.3333"></a>
-<span class="sourceLineNo">3334</span>      }<a name="line.3334"></a>
-<span class="sourceLineNo">3335</span>      region.put(put);<a name="line.3335"></a>
-<span class="sourceLineNo">3336</span>    }<a name="line.3336"></a>
-<span class="sourceLineNo">3337</span><a name="line.3337"></a>
-<span class="sourceLineNo">3338</span>    Scan scan = new Scan();<a name="line.3338"></a>
-<span class="sourceLineNo">3339</span>    scan.setLoadColumnFamiliesOnDemand(true);<a name="line.3339"></a>
-<span class="sourceLineNo">3340</span>    Filter bogusFilter = new FilterBase() {<a name="line.3340"></a>
-<span class="sourceLineNo">3341</span>      @Override<a name="line.3341"></a>
-<span class="sourceLineNo">3342</span>      public ReturnCode filterCell(final Cell ignored) throws IOException {<a name="line.3342"></a>
-<span class="sourceLineNo">3343</span>        return ReturnCode.INCLUDE;<a name="line.3343"></a>
+<span class="sourceLineNo">3321</span>  /**<a name="line.3321"></a>
+<span class="sourceLineNo">3322</span>   * HBASE-5416<a name="line.3322"></a>
+<span class="sourceLineNo">3323</span>   *<a name="line.3323"></a>
+<span class="sourceLineNo">3324</span>   * Test case when scan limits amount of KVs returned on each next() call.<a name="line.3324"></a>
+<span class="sourceLineNo">3325</span>   */<a name="line.3325"></a>
+<span class="sourceLineNo">3326</span>  @Test<a name="line.3326"></a>
+<span class="sourceLineNo">3327</span>  public void testScanner_JoinedScannersWithLimits() throws IOException {<a name="line.3327"></a>
+<span class="sourceLineNo">3328</span>    final byte[] cf_first = Bytes.toBytes("first");<a name="line.3328"></a>
+<span class="sourceLineNo">3329</span>    final byte[] cf_second = Bytes.toBytes("second");<a name="line.3329"></a>
+<span class="sourceLineNo">3330</span><a name="line.3330"></a>
+<span class="sourceLineNo">3331</span>    this.region = initHRegion(tableName, method, CONF, cf_first, cf_second);<a name="line.3331"></a>
+<span class="sourceLineNo">3332</span>    final byte[] col_a = Bytes.toBytes("a");<a name="line.3332"></a>
+<span class="sourceLineNo">3333</span>    final byte[] col_b = Bytes.toBytes("b");<a name="line.3333"></a>
+<span class="sourceLineNo">3334</span><a name="line.3334"></a>
+<span class="sourceLineNo">3335</span>    Put put;<a name="line.3335"></a>
+<span class="sourceLineNo">3336</span><a name="line.3336"></a>
+<span class="sourceLineNo">3337</span>    for (int i = 0; i &lt; 10; i++) {<a name="line.3337"></a>
+<span class="sourceLineNo">3338</span>      put = new Put(Bytes.toBytes("r" + Integer.toString(i)));<a name="line.3338"></a>
+<span class="sourceLineNo">3339</span>      put.addColumn(cf_first, col_a, Bytes.toBytes(i));<a name="line.3339"></a>
+<span class="sourceLineNo">3340</span>      if (i &lt; 5) {<a name="line.3340"></a>
+<span class="sourceLineNo">3341</span>        put.addColumn(cf_first, col_b, Bytes.toBytes(i));<a name="line.3341"></a>
+<span class="sourceLineNo">3342</span>        put.addColumn(cf_second, col_a, Bytes.toBytes(i));<a name="line.3342"></a>
+<span class="sourceLineNo">3343</span>        put.addColumn(cf_second, col_b, Bytes.toBytes(i));<a name="line.3343"></a>
 <span class="sourceLineNo">3344</span>      }<a name="line.3344"></a>
-<span class="sourceLineNo">3345</span>      @Override<a name="line.3345"></a>
-<span class="sourceLineNo">3346</span>      public boolean isFamilyEssential(byte[] name) {<a name="line.3346"></a>
-<span class="sourceLineNo">3347</span>        return Bytes.equals(name, cf_first);<a name="line.3347"></a>
-<span class="sourceLineNo">3348</span>      }<a name="line.3348"></a>
-<span class="sourceLineNo">3349</span>    };<a name="line.3349"></a>
-<span class="sourceLineNo">3350</span><a name="line.3350"></a>
-<span class="sourceLineNo">3351</span>    scan.setFilter(bogusFilter);<a name="line.3351"></a>
-<span class="sourceLineNo">3352</span>    InternalScanner s = region.getScanner(scan);<a name="line.3352"></a>
-<span class="sourceLineNo">3353</span><a name="line.3353"></a>
-<span class="sourceLineNo">3354</span>    // Our data looks like this:<a name="line.3354"></a>
-<span class="sourceLineNo">3355</span>    // r0: first:a, first:b, second:a, second:b<a name="line.3355"></a>
-<span class="sourceLineNo">3356</span>    // r1: first:a, first:b, second:a, second:b<a name="line.3356"></a>
-<span class="sourceLineNo">3357</span>    // r2: first:a, first:b, second:a, second:b<a name="line.3357"></a>
-<span class="sourceLineNo">3358</span>    // r3: first:a, first:b, second:a, second:b<a name="line.3358"></a>
-<span class="sourceLineNo">3359</span>    // r4: first:a, first:b, second:a, second:b<a name="line.3359"></a>
-<span class="sourceLineNo">3360</span>    // r5: first:a<a name="line.3360"></a>
-<span class="sourceLineNo">3361</span>    // r6: first:a<a name="line.3361"></a>
-<span class="sourceLineNo">3362</span>    // r7: first:a<a name="line.3362"></a>
-<span class="sourceLineNo">3363</span>    // r8: first:a<a name="line.3363"></a>
-<span class="sourceLineNo">3364</span>    // r9: first:a<a name="line.3364"></a>
-<span class="sourceLineNo">3365</span><a name="line.3365"></a>
-<span class="sourceLineNo">3366</span>    // But due to next's limit set to 3, we should get this:<a name="line.3366"></a>
-<span class="sourceLineNo">3367</span>    // r0: first:a, first:b, second:a<a name="line.3367"></a>
-<span class="sourceLineNo">3368</span>    // r0: second:b<a name="line.3368"></a>
-<span class="sourceLineNo">3369</span>    // r1: first:a, first:b, second:a<a name="line.3369"></a>
-<span class="sourceLineNo">3370</span>    // r1: second:b<a name="line.3370"></a>
-<span class="sourceLineNo">3371</span>    // r2: first:a, first:b, second:a<a name="line.3371"></a>
-<span class="sourceLineNo">3372</span>    // r2: second:b<a name="line.3372"></a>
-<span class="sourceLineNo">3373</span>    // r3: first:a, first:b, second:a<a name="line.3373"></a>
-<span class="sourceLineNo">3374</span>    // r3: second:b<a name="line.3374"></a>
-<span class="sourceLineNo">3375</span>    // r4: first:a, first:b, second:a<a name="line.3375"></a>
-<span class="sourceLineNo">3376</span>    // r4: second:b<a name="line.3376"></a>
-<span class="sourceLineNo">3377</span>    // r5: first:a<a name="line.3377"></a>
-<span class="sourceLineNo">3378</span>    // r6: first:a<a name="line.3378"></a>
-<span class="sourceLineNo">3379</span>    // r7: first:a<a name="line.3379"></a>
-<span class="sourceLineNo">3380</span>    // r8: first:a<a name="line.3380"></a>
-<span class="sourceLineNo">3381</span>    // r9: first:a<a name="line.3381"></a>
-<span class="sourceLineNo">3382</span><a name="line.3382"></a>
-<span class="sourceLineNo">3383</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.3383"></a>
-<span class="sourceLineNo">3384</span>    int index = 0;<a name="line.3384"></a>
-<span class="sourceLineNo">3385</span>    ScannerContext scannerContext = ScannerContext.newBuilder().setBatchLimit(3).build();<a name="line.3385"></a>
-<span class="sourceLineNo">3386</span>    while (true) {<a name="line.3386"></a>
-<span class="sourceLineNo">3387</span>      boolean more = s.next(results, scannerContext);<a name="line.3387"></a>
-<span class="sourceLineNo">3388</span>      if ((index &gt;&gt; 1) &lt; 5) {<a name="line.3388"></a>
-<span class="sourceLineNo">3389</span>        if (index % 2 == 0) {<a name="line.3389"></a>
-<span class="sourceLineNo">3390</span>          assertEquals(3, results.size());<a name="line.3390"></a>
-<span class="sourceLineNo">3391</span>        } else {<a name="line.3391"></a>
-<span class="sourceLineNo">3392</span>          assertEquals(1, results.size());<a name="line.3392"></a>
-<span class="sourceLineNo">3393</span>        }<a name="line.3393"></a>
-<span class="sourceLineNo">3394</span>      } else {<a name="line.3394"></a>
-<span class="sourceLineNo">3395</span>        assertEquals(1, results.size());<a name="line.3395"></a>
-<span class="sourceLineNo">3396</span>      }<a name="line.3396"></a>
-<span class="sourceLineNo">3397</span>      results.clear();<a name="line.3397"></a>
-<span class="sourceLineNo">3398</span>      index++;<a name="line.3398"></a>
-<span class="sourceLineNo">3399</span>      if (!more) {<a name="line.3399"></a>
-<span class="sourceLineNo">3400</span>        break;<a name="line.3400"></a>
-<span class="sourceLineNo">3401</span>      }<a name="line.3401"></a>
-<span class="sourceLineNo">3402</span>    }<a name="line.3402"></a>
-<span class="sourceLineNo">3403</span>  }<a name="line.3403"></a>
-<span class="sourceLineNo">3404</span><a name="line.3404"></a>
-<span class="sourceLineNo">3405</span>  /**<a name="line.3405"></a>
-<span class="sourceLineNo">3406</span>   * Write an HFile block full with Cells whose qualifier that are identical between<a name="line.3406"></a>
-<span class="sourceLineNo">3407</span>   * 0 and Short.MAX_VALUE. See HBASE-13329.<a name="line.3407"></a>
-<span class="sourceLineNo">3408</span>   * @throws Exception<a name="line.3408"></a>
-<span class="sourceLineNo">3409</span>   */<a name="line.3409"></a>
-<span class="sourceLineNo">3410</span>  @Test<a name="line.3410"></a>
-<span class="sourceLineNo">3411</span>  public void testLongQualifier() throws Exception {<a name="line.3411"></a>
-<span class="sourceLineNo">3412</span>    byte[] family = Bytes.toBytes("family");<a name="line.3412"></a>
-<span class="sourceLineNo">3413</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.3413"></a>
-<span class="sourceLineNo">3414</span>    byte[] q = new byte[Short.MAX_VALUE+2];<a name="line.3414"></a>
-<span class="sourceLineNo">3415</span>    Arrays.fill(q, 0, q.length-1, (byte)42);<a name="line.3415"></a>
-<span class="sourceLineNo">3416</span>    for (byte i=0; i&lt;10; i++) {<a name="line.3416"></a>
-<span class="sourceLineNo">3417</span>      Put p = new Put(Bytes.toBytes("row"));<a name="line.3417"></a>
-<span class="sourceLineNo">3418</span>      // qualifiers that differ past Short.MAX_VALUE<a name="line.3418"></a>
-<span class="sourceLineNo">3419</span>      q[q.length-1]=i;<a name="line.3419"></a>
-<span class="sourceLineNo">3420</span>      p.addColumn(family, q, q);<a name="line.3420"></a>
-<span class="sourceLineNo">3421</span>      region.put(p);<a name="line.3421"></a>
-<span class="sourceLineNo">3422</span>    }<a name="line.3422"></a>
-<span class="sourceLineNo">3423</span>    region.flush(false);<a name="line.3423"></a>
-<span class="sourceLineNo">3424</span>  }<a name="line.3424"></a>
-<span class="sourceLineNo">3425</span><a name="line.3425"></a>
-<span class="sourceLineNo">3426</span>  /**<a name="line.3426"></a>
-<span class="sourceLineNo">3427</span>   * Flushes the cache in a thread while scanning. The tests verify that the<a name="line.3427"></a>
-<span class="sourceLineNo">3428</span>   * scan is coherent - e.g. the returned results are always of the same or<a name="line.3428"></a>
-<span class="sourceLineNo">3429</span>   * later update as the previous results.<a name="line.3429"></a>
-<span class="sourceLineNo">3430</span>   *<a name="line.3430"></a>
-<span class="sourceLineNo">3431</span>   * @throws IOException<a name="line.3431"></a>
-<span class="sourceLineNo">3432</span>   *           scan / compact<a name="line.3432"></a>
-<span class="sourceLineNo">3433</span>   * @throws InterruptedException<a name="line.3433"></a>
-<span class="sourceLineNo">3434</span>   *           thread join<a name="line.3434"></a>
-<span class="sourceLineNo">3435</span>   */<a name="line.3435"></a>
-<span class="sourceLineNo">3436</span>  @Test<a name="line.3436"></a>
-<span class="sourceLineNo">3437</span>  public void testFlushCacheWhileScanning() throws IOException, InterruptedException {<a name="line.3437"></a>
-<span class="sourceLineNo">3438</span>    byte[] family = Bytes.toBytes("family");<a name="line.3438"></a>
-<span class="sourceLineNo">3439</span>    int numRows = 1000;<a name="line.3439"></a>
-<span class="sourceLineNo">3440</span>    int flushAndScanInterval = 10;<a name="line.3440"></a>
-<span class="sourceLineNo">3441</span>    int compactInterval = 10 * flushAndScanInterval;<a name="line.3441"></a>
-<span class="sourceLineNo">3442</span><a name="line.3442"></a>
-<span class="sourceLineNo">3443</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.3443"></a>
-<span class="sourceLineNo">3444</span>    FlushThread flushThread = new FlushThread();<a name="line.3444"></a>
-<span class="sourceLineNo">3445</span>    try {<a name="line.3445"></a>
-<span class="sourceLineNo">3446</span>      flushThread.start();<a name="line.3446"></a>
-<span class="sourceLineNo">3447</span><a name="line.3447"></a>
-<span class="sourceLineNo">3448</span>      Scan scan = new Scan();<a name="line.3448"></a>
-<span class="sourceLineNo">3449</span>      scan.addFamily(family);<a name="line.3449"></a>
-<span class="sourceLineNo">3450</span>      scan.setFilter(new SingleColumnValueFilter(family, qual1, CompareOperator.EQUAL,<a name="line.3450"></a>
-<span class="sourceLineNo">3451</span>          new BinaryComparator(Bytes.toBytes(5L))));<a name="line.3451"></a>
+<span class="sourceLineNo">3345</span>      region.put(put);<a name="line.3345"></a>
+<span class="sourceLineNo">3346</span>    }<a name="line.3346"></a>
+<span class="sourceLineNo">3347</span><a name="line.3347"></a>
+<span class="sourceLineNo">3348</span>    Scan scan = new Scan();<a name="line.3348"></a>
+<span class="sourceLineNo">3349</span>    scan.setLoadColumnFamiliesOnDemand(true);<a name="line.3349"></a>
+<span class="sourceLineNo">3350</span>    Filter bogusFilter = new FilterBase() {<a name="line.3350"></a>
+<span class="sourceLineNo">3351</span>      @Override<a name="line.3351"></a>
+<span class="sourceLineNo">3352</span>      public ReturnCode filterCell(final Cell ignored) throws IOException {<a name="line.3352"></a>
+<span class="sourceLineNo">3353</span>        return ReturnCode.INCLUDE;<a name="line.3353"></a>
+<span class="sourceLineNo">3354</span>      }<a name="line.3354"></a>
+<span class="sourceLineNo">3355</span>      @Override<a name="line.3355"></a>
+<span class="sourceLineNo">3356</span>      public boolean isFamilyEssential(byte[] name) {<a name="line.3356"></a>
+<span class="sourceLineNo">3357</span>        return Bytes.equals(name, cf_first);<a name="line.3357"></a>
+<span class="sourceLineNo">3358</span>      }<a name="line.3358"></a>
+<span class="sourceLineNo">3359</span>    };<a name="line.3359"></a>
+<span class="sourceLineNo">3360</span><a name="line.3360"></a>
+<span class="sourceLineNo">3361</span>    scan.setFilter(bogusFilter);<a name="line.3361"></a>
+<span class="sourceLineNo">3362</span>    InternalScanner s = region.getScanner(scan);<a name="line.3362"></a>
+<span class="sourceLineNo">3363</span><a name="line.3363"></a>
+<span class="sourceLineNo">3364</span>    // Our data looks like this:<a name="line.3364"></a>
+<span class="sourceLineNo">3365</span>    // r0: first:a, first:b, second:a, second:b<a name="line.3365"></a>
+<span class="sourceLineNo">3366</span>    // r1: first:a, first:b, second:a, second:b<a name="line.3366"></a>
+<span class="sourceLineNo">3367</span>    // r2: first:a, first:b, second:a, second:b<a name="line.3367"></a>
+<span class="sourceLineNo">3368</span>    // r3: first:a, first:b, second:a, second:b<a name="line.3368"></a>
+<span class="sourceLineNo">3369</span>    // r4: first:a, first:b, second:a, second:b<a name="line.3369"></a>
+<span class="sourceLineNo">3370</span>    // r5: first:a<a name="line.3370"></a>
+<span class="sourceLineNo">3371</span>    // r6: first:a<a name="line.3371"></a>
+<span class="sourceLineNo">3372</span>    // r7: first:a<a name="line.3372"></a>
+<span class="sourceLineNo">3373</span>    // r8: first:a<a name="line.3373"></a>
+<span class="sourceLineNo">3374</span>    // r9: first:a<a name="line.3374"></a>
+<span class="sourceLineNo">3375</span><a name="line.3375"></a>
+<span class="sourceLineNo">3376</span>    // But due to next's limit set to 3, we should get this:<a name="line.3376"></a>
+<span class="sourceLineNo">3377</span>    // r0: first:a, first:b, second:a<a name="line.3377"></a>
+<span class="sourceLineNo">3378</span>    // r0: second:b<a name="line.3378"></a>
+<span class="sourceLineNo">3379</span>    // r1: first:a, first:b, second:a<a name="line.3379"></a>
+<span class="sourceLineNo">3380</span>    // r1: second:b<a name="line.3380"></a>
+<span class="sourceLineNo">3381</span>    // r2: first:a, first:b, second:a<a name="line.3381"></a>
+<span class="sourceLineNo">3382</span>    // r2: second:b<a name="line.3382"></a>
+<span class="sourceLineNo">3383</span>    // r3: first:a, first:b, second:a<a name="line.3383"></a>
+<span class="sourceLineNo">3384</span>    // r3: second:b<a name="line.3384"></a>
+<span class="sourceLineNo">3385</span>    // r4: first:a, first:b, second:a<a name="line.3385"></a>
+<span class="sourceLineNo">3386</span>    // r4: second:b<a name="line.3386"></a>
+<span class="sourceLineNo">3387</span>    // r5: first:a<a name="line.3387"></a>
+<span class="sourceLineNo">3388</span>    // r6: first:a<a name="line.3388"></a>
+<span class="sourceLineNo">3389</span>    // r7: first:a<a name="line.3389"></a>
+<span class="sourceLineNo">3390</span>    // r8: first:a<a name="line.3390"></a>
+<span class="sourceLineNo">3391</span>    // r9: first:a<a name="line.3391"></a>
+<span class="sourceLineNo">3392</span><a name="line.3392"></a>
+<span class="sourceLineNo">3393</span>    List&lt;Cell&gt; results = new ArrayList&lt;&gt;();<a name="line.3393"></a>
+<span class="sourceLineNo">3394</span>    int index = 0;<a name="line.3394"></a>
+<span class="sourceLineNo">3395</span>    ScannerContext scannerContext = ScannerContext.newBuilder().setBatchLimit(3).build();<a name="line.3395"></a>
+<span class="sourceLineNo">3396</span>    while (true) {<a name="line.3396"></a>
+<span class="sourceLineNo">3397</span>      boolean more = s.next(results, scannerContext);<a name="line.3397"></a>
+<span class="sourceLineNo">3398</span>      if ((index &gt;&gt; 1) &lt; 5) {<a name="line.3398"></a>
+<span class="sourceLineNo">3399</span>        if (index % 2 == 0) {<a name="line.3399"></a>
+<span class="sourceLineNo">3400</span>          assertEquals(3, results.size());<a name="line.3400"></a>
+<span class="sourceLineNo">3401</span>        } else {<a name="line.3401"></a>
+<span class="sourceLineNo">3402</span>          assertEquals(1, results.size());<a name="line.3402"></a>
+<span class="sourceLineNo">3403</span>        }<a name="line.3403"></a>
+<span class="sourceLineNo">3404</span>      } else {<a name="line.3404"></a>
+<span class="sourceLineNo">3405</span>        assertEquals(1, results.size());<a name="line.3405"></a>
+<span class="sourceLineNo">3406</span>      }<a name="line.3406"></a>
+<span class="sourceLineNo">3407</span>      results.clear();<a name="line.3407"></a>
+<span class="sourceLineNo">3408</span>      index++;<a name="line.3408"></a>
+<span class="sourceLineNo">3409</span>      if (!more) {<a name="line.3409"></a>
+<span class="sourceLineNo">3410</span>        break;<a name="line.3410"></a>
+<span class="sourceLineNo">3411</span>      }<a name="line.3411"></a>
+<span class="sourceLineNo">3412</span>    }<a name="line.3412"></a>
+<span class="sourceLineNo">3413</span>  }<a name="line.3413"></a>
+<span class="sourceLineNo">3414</span><a name="line.3414"></a>
+<span class="sourceLineNo">3415</span>  /**<a name="line.3415"></a>
+<span class="sourceLineNo">3416</span>   * Write an HFile block full with Cells whose qualifier that are identical between<a name="line.3416"></a>
+<span class="sourceLineNo">3417</span>   * 0 and Short.MAX_VALUE. See HBASE-13329.<a name="line.3417"></a>
+<span class="sourceLineNo">3418</span>   * @throws Exception<a name="line.3418"></a>
+<span class="sourceLineNo">3419</span>   */<a name="line.3419"></a>
+<span class="sourceLineNo">3420</span>  @Test<a name="line.3420"></a>
+<span class="sourceLineNo">3421</span>  public void testLongQualifier() throws Exception {<a name="line.3421"></a>
+<span class="sourceLineNo">3422</span>    byte[] family = Bytes.toBytes("family");<a name="line.3422"></a>
+<span class="sourceLineNo">3423</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.3423"></a>
+<span class="sourceLineNo">3424</span>    byte[] q = new byte[Short.MAX_VALUE+2];<a name="line.3424"></a>
+<span class="sourceLineNo">3425</span>    Arrays.fill(q, 0, q.length-1, (byte)42);<a name="line.3425"></a>
+<span class="sourceLineNo">3426</span>    for (byte i=0; i&lt;10; i++) {<a name="line.3426"></a>
+<span class="sourceLineNo">3427</span>      Put p = new Put(Bytes.toBytes("row"));<a name="line.3427"></a>
+<span class="sourceLineNo">3428</span>      // qualifiers that differ past Short.MAX_VALUE<a name="line.3428"></a>
+<span class="sourceLineNo">3429</span>      q[q.length-1]=i;<a name="line.3429"></a>
+<span class="sourceLineNo">3430</span>      p.addColumn(family, q, q);<a name="line.3430"></a>
+<span class="sourceLineNo">3431</span>      region.put(p);<a name="line.3431"></a>
+<span class="sourceLineNo">3432</span>    }<a name="line.3432"></a>
+<span class="sourceLineNo">3433</span>    region.flush(false);<a name="line.3433"></a>
+<span class="sourceLineNo">3434</span>  }<a name="line.3434"></a>
+<span class="sourceLineNo">3435</span><a name="line.3435"></a>
+<span class="sourceLineNo">3436</span>  /**<a name="line.3436"></a>
+<span class="sourceLineNo">3437</span>   * Flushes the cache in a thread while scanning. The tests verify that the<a name="line.3437"></a>
+<span class="sourceLineNo">3438</span>   * scan is coherent - e.g. the returned results are always of the same or<a name="line.3438"></a>
+<span class="sourceLineNo">3439</span>   * later update as the previous results.<a name="line.3439"></a>
+<span class="sourceLineNo">3440</span>   *<a name="line.3440"></a>
+<span class="sourceLineNo">3441</span>   * @throws IOException<a name="line.3441"></a>
+<span class="sourceLineNo">3442</span>   *           scan / compact<a name="line.3442"></a>
+<span class="sourceLineNo">3443</span>   * @throws InterruptedException<a name="line.3443"></a>
+<span class="sourceLineNo">3444</span>   *           thread join<a name="line.3444"></a>
+<span class="sourceLineNo">3445</span>   */<a name="line.3445"></a>
+<span class="sourceLineNo">3446</span>  @Test<a name="line.3446"></a>
+<span class="sourceLineNo">3447</span>  public void testFlushCacheWhileScanning() throws IOException, InterruptedException {<a name="line.3447"></a>
+<span class="sourceLineNo">3448</span>    byte[] family = Bytes.toBytes("family");<a name="line.3448"></a>
+<span class="sourceLineNo">3449</span>    int numRows = 1000;<a name="line.3449"></a>
+<span class="sourceLineNo">3450</span>    int flushAndScanInterval = 10;<a name="line.3450"></a>
+<span class="sourceLineNo">3451</span>    int compactInterval = 10 * flushAndScanInterval;<a name="line.3451"></a>
 <span class="sourceLineNo">3452</span><a name="line.3452"></a>
-<span class="sourceLineNo">3453</span>      int expectedCount = 0;<a name="line.3453"></a>
-<span class="sourceLineNo">3454</span>      List&lt;Cell&gt; res = new ArrayList&lt;&gt;();<a name="line.3454"></a>
-<span class="sourceLineNo">3455</span><a name="line.3455"></a>
-<span class="sourceLineNo">3456</span>      boolean toggle = true;<a name="line.3456"></a>
-<span class="sourceLineNo">3457</span>      for (long i = 0; i &lt; numRows; i++) {<a name="line.3457"></a>
-<span class="sourceLineNo">3458</span>        Put put = new Put(Bytes.toBytes(i));<a name="line.3458"></a>
-<span class="sourceLineNo">3459</span>        put.setDurability(Durability.SKIP_WAL);<a name="line.3459"></a>
-<span class="sourceLineNo">3460</span>        put.addColumn(family, qual1, Bytes.toBytes(i % 10));<a name="line.3460"></a>
-<span class="sourceLineNo">3461</span>        region.put(put);<a name="line.3461"></a>
+<span class="sourceLineNo">3453</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.3453"></a>
+<span class="sourceLineNo">3454</span>    FlushThread flushThread = new FlushThread();<a name="line.3454"></a>
+<span class="sourceLineNo">3455</span>    try {<a name="line.3455"></a>
+<span class="sourceLineNo">3456</span>      flushThread.start();<a name="line.3456"></a>
+<span class="sourceLineNo">3457</span><a name="line.3457"></a>
+<span class="sourceLineNo">3458</span>      Scan scan = new Scan();<a name="line.3458"></a>
+<span class="sourceLineNo">3459</span>      scan.addFamily(family);<a name="line.3459"></a>
+<span class="sourceLineNo">3460</span>      scan.setFilter(new SingleColumnValueFilter(family, qual1, CompareOperator.EQUAL,<a name="line.3460"></a>
+<span class="sourceLineNo">3461</span>          new BinaryComparator(Bytes.toBytes(5L))));<a name="line.3461"></a>
 <span class="sourceLineNo">3462</span><a name="line.3462"></a>
-<span class="sourceLineNo">3463</span>        if (i != 0 &amp;&amp; i % compactInterval == 0) {<a name="line.3463"></a>
-<span class="sourceLineNo">3464</span>          LOG.debug("iteration = " + i+ " ts="+System.currentTimeMillis());<a name="line.3464"></a>
-<span class="sourceLineNo">3465</span>          region.compact(true);<a name="line.3465"></a>
-<span class="sourceLineNo">3466</span>        }<a name="line.3466"></a>
-<span class="sourceLineNo">3467</span><a name="line.3467"></a>
-<span class="sourceLineNo">3468</span>        if (i % 10 == 5L) {<a name="line.3468"></a>
-<span class="sourceLineNo">3469</span>          expectedCount++;<a name="line.3469"></a>
-<span class="sourceLineNo">3470</span>        }<a name="line.3470"></a>
-<span class="sourceLineNo">3471</span><a name="line.3471"></a>
-<span class="sourceLineNo">3472</span>        if (i != 0 &amp;&amp; i % flushAndScanInterval == 0) {<a name="line.3472"></a>
-<span class="sourceLineNo">3473</span>          res.clear();<a name="line.3473"></a>
-<span class="sourceLineNo">3474</span>          InternalScanner scanner = region.getScanner(scan);<a name="line.3474"></a>
-<span class="sourceLineNo">3475</span>          if (toggle) {<a name="line.3475"></a>
-<span class="sourceLineNo">3476</span>            flushThread.flush();<a name="line.3476"></a>
-<span class="sourceLineNo">3477</span>          }<a name="line.3477"></a>
-<span class="sourceLineNo">3478</span>          while (scanner.next(res))<a name="line.3478"></a>
-<span class="sourceLineNo">3479</span>            ;<a name="line.3479"></a>
-<span class="sourceLineNo">3480</span>          if (!toggle) {<a name="line.3480"></a>
-<span class="sourceLineNo">3481</span>            flushThread.flush();<a name="line.3481"></a>
-<span class="sourceLineNo">3482</span>          }<a name="line.3482"></a>
-<span class="sourceLineNo">3483</span>          assertEquals("toggle="+toggle+"i=" + i + " ts="+System.currentTimeMillis(),<a name="line.3483"></a>
-<span class="sourceLineNo">3484</span>              expectedCount, res.size());<a name="line.3484"></a>
-<span class="sourceLineNo">3485</span>          toggle = !toggle;<a name="line.3485"></a>
-<span class="sourceLineNo">3486</span>        }<a name="line.3486"></a>
-<span class="sourceLineNo">3487</span>      }<a name="line.3487"></a>
-<span class="sourceLineNo">3488</span><a name="line.3488"></a>
-<span class="sourceLineNo">3489</span>    } finally {<a name="line.3489"></a>
-<span class="sourceLineNo">3490</span>      try {<a name="line.3490"></a>
-<span class="sourceLineNo">3491</span>        flushThread.done();<a name="line.3491"></a>
-<span class="sourceLineNo">3492</span>        flushThread.join();<a name="line.3492"></a>
-<span class="sourceLineNo">3493</span>        flushThread.checkNoError();<a name="line.3493"></a>
-<span class="sourceLineNo">3494</span>      } catch (InterruptedException ie) {<a name="line.3494"></a>
-<span class="sourceLineNo">3495</span>        LOG.warn("Caught exception when joining with flushThread", ie);<a name="line.3495"></a>
-<span class="sourceLineNo">3496</span>      }<a name="line.3496"></a>
-<span class="sourceLineNo">3497</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.3497"></a>
-<span class="sourceLineNo">3498</span>      this.region = null;<a name="line.3498"></a>
-<span class="sourceLineNo">3499</span>    }<a name="line.3499"></a>
-<span class="sourceLineNo">3500</span>  }<a name="line.3500"></a>
-<span class="sourceLineNo">3501</span><a name="line.3501"></a>
-<span class="sourceLineNo">3502</span>  protected class FlushThread extends Thread {<a name="line.3502"></a>
-<span class="sourceLineNo">3503</span>    private volatile boolean done;<a name="line.3503"></a>
-<span class="sourceLineNo">3504</span>    private Throwable error = null;<a name="line.3504"></a>
-<span class="sourceLineNo">3505</span><a name="line.3505"></a>
-<span class="sourceLineNo">3506</span>    FlushThread() {<a name="line.3506"></a>
-<span class="sourceLineNo">3507</span>      super("FlushThread");<a name="line.3507"></a>
-<span class="sourceLineNo">3508</span>    }<a name="line.3508"></a>
-<span class="sourceLineNo">3509</span><a name="line.3509"></a>
-<span class="sourceLineNo">3510</span>    public void done() {<a name="line.3510"></a>
-<span class="sourceLineNo">3511</span>      done = true;<a name="line.3511"></a>
-<span class="sourceLineNo">3512</span>      synchronized (this) {<a name="line.3512"></a>
-<span class="sourceLineNo">3513</span>        interrupt();<a name="line.3513"></a>
-<span class="sourceLineNo">3514</span>      }<a name="line.3514"></a>
-<span class="sourceLineNo">3515</span>    }<a name="line.3515"></a>
-<span class="sourceLineNo">3516</span><a name="line.3516"></a>
-<span class="sourceLineNo">3517</span>    public void checkNoError() {<a name="line.3517"></a>
-<span class="sourceLineNo">3518</span>      if (error != null) {<a name="line.3518"></a>
-<span class="sourceLineNo">3519</span>        assertNull(error);<a name="line.3519"></a>
-<span class="sourceLineNo">3520</span>      }<a name="line.3520"></a>
-<span class="sourceLineNo">3521</span>    }<a name="line.3521"></a>
-<span class="sourceLineNo">3522</span><a name="line.3522"></a>
-<span class="sourceLineNo">3523</span>    @Override<a name="line.3523"></a>
-<span class="sourceLineNo">3524</span>    public void run() {<a name="line.3524"></a>
-<span class="sourceLineNo">3525</span>      done = false;<a name="line.3525"></a>
-<span class="sourceLineNo">3526</span>      while (!done) {<a name="line.3526"></a>
-<span class="sourceLineNo">3527</span>        synchronized (this) {<a name="line.3527"></a>
-<span class="sourceLineNo">3528</span>          try {<a name="line.3528"></a>
-<span class="sourceLineNo">3529</span>            wait();<a name="line.3529"></a>
-<span class="sourceLineNo">3530</span>          } catch (InterruptedException ignored) {<a name="line.3530"></a>
-<span class="sourceLineNo">3531</span>            if (done) {<a name="line.3531"></a>
-<span class="sourceLineNo">3532</span>              break;<a name="line.3532"></a>
-<span class="sourceLineNo">3533</span>            }<a name="line.3533"></a>
-<span class="sourceLineNo">3534</span>          }<a name="line.3534"></a>
-<span class="sourceLineNo">3535</span>        }<a name="line.3535"></a>
-<span class="sourceLineNo">3536</span>        try {<a name="line.3536"></a>
-<span class="sourceLineNo">3537</span>          region.flush(true);<a name="line.3537"></a>
-<span class="sourceLineNo">3538</span>        } catch (IOException e) {<a name="line.3538"></a>
-<span class="sourceLineNo">3539</span>          if (!done) {<a name="line.3539"></a>
-<span class="sourceLineNo">3540</span>            LOG.error("Error while flushing cache", e);<a name="line.3540"></a>
-<span class="sourceLineNo">3541</span>            error = e;<a name="line.3541"></a>
-<span class="sourceLineNo">3542</span>          }<a name="line.3542"></a>
-<span class="sourceLineNo">3543</span>          break;<a name="line.3543"></a>
-<span class="sourceLineNo">3544</span>        } catch (Throwable t) {<a name="line.3544"></a>
-<span class="sourceLineNo">3545</span>          LOG.error("Uncaught exception", t);<a name="line.3545"></a>
-<span class="sourceLineNo">3546</span>          throw t;<a name="line.3546"></a>
-<span class="sourceLineNo">3547</span>        }<a name="line.3547"></a>
-<span class="sourceLineNo">3548</span>      }<a name="line.3548"></a>
-<span class="sourceLineNo">3549</span>    }<a name="line.3549"></a>
-<span class="sourceLineNo">3550</span><a name="line.3550"></a>
-<span class="sourceLineNo">3551</span>    public void flush() {<a name="line.3551"></a>
-<span class="sourceLineNo">3552</span>      synchronized (this) {<a name="line.3552"></a>
-<span class="sourceLineNo">3553</span>        notify();<a name="line.3553"></a>
-<span class="sourceLineNo">3554</span>      }<a name="line.3554"></a>
-<span class="sourceLineNo">3555</span>    }<a name="line.3555"></a>
-<span class="sourceLineNo">3556</span>  }<a name="line.3556"></a>
-<span class="sourceLineNo">3557</span><a name="line.3557"></a>
-<span class="sourceLineNo">3558</span>  /**<a name="line.3558"></a>
-<span class="sourceLineNo">3559</span>   * Writes very wide records and scans for the latest every time.. Flushes and<a name="line.3559"></a>
-<span class="sourceLineNo">3560</span>   * compacts the region every now and then to keep things realistic.<a name="line.3560"></a>
-<span class="sourceLineNo">3561</span>   *<a name="line.3561"></a>
-<span class="sourceLineNo">3562</span>   * @throws IOException<a name="line.3562"></a>
-<span class="sourceLineNo">3563</span>   *           by flush / scan / compaction<a name="line.3563"></a>
-<span class="sourceLineNo">3564</span>   * @throws InterruptedException<a name="line.3564"></a>
-<span class="sourceLineNo">3565</span>   *           when joining threads<a name="line.3565"></a>
-<span class="sourceLineNo">3566</span>   */<a name="line.3566"></a>
-<span class="sourceLineNo">3567</span>  @Test<a name="line.3567"></a>
-<span class="sourceLineNo">3568</span>  public void testWritesWhileScanning() throws IOException, InterruptedException {<a name="line.3568"></a>
-<span class="sourceLineNo">3569</span>    int testCount = 100;<a name="line.3569"></a>
-<span class="sourceLineNo">3570</span>    int numRows = 1;<a name="line.3570"></a>
-<span class="sourceLineNo">3571</span>    int numFamilies = 10;<a name="line.3571"></a>
-<span class="sourceLineNo">3572</span>    int numQualifiers = 100;<a name="line.3572"></a>
-<span class="sourceLineNo">3573</span>    int flushInterval = 7;<a name="line.3573"></a>
-<span class="sourceLineNo">3574</span>    int compactInterval = 5 * flushInterval;<a name="line.3574"></a>
-<span class="sourceLineNo">3575</span>    byte[][] families = new byte[numFamilies][];<a name="line.3575"></a>
-<span class="sourceLineNo">3576</span>    for (int i = 0; i &lt; numFamilies; i++) {<a name="line.3576"></a>
-<span class="sourceLineNo">3577</span>      families[i] = Bytes.toBytes("family" + i);<a name="line.3577"></a>
-<span class="sourceLineNo">3578</span>    }<a name="line.3578"></a>
-<span class="sourceLineNo">3579</span>    byte[][] qualifiers = new byte[numQualifiers][];<a name="line.3579"></a>
-<span class="sourceLineNo">3580</span>    for (int i = 0; i &lt; numQualifiers; i++) {<a name="line.3580"></a>
-<span class="sourceLineNo">3581</span>      qualifiers[i] = Bytes.toBytes("qual" + i);<a name="line.3581"></a>
-<span class="sourceLineNo">3582</span>    }<a name="line.3582"></a>
-<span class="sourceLineNo">3583</span><a name="line.3583"></a>
-<span class="sourceLineNo">3584</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.3584"></a>
-<span class="sourceLineNo">3585</span>    FlushThread flushThread = new FlushThread();<a name="line.3585"></a>
-<span class="sourceLineNo">3586</span>    PutThread putThread = new PutThread(numRows, families, qualifiers);<a name="line.3586"></a>
-<span class="sourceLineNo">3587</span>    try {<a name="line.3587"></a>
-<span class="sourceLineNo">3588</span>      putThread.start();<a name="line.3588"></a>
-<span class="sourceLineNo">3589</span>      putThread.waitForFirstPut();<a name="line.3589"></a>
-<span class="sourceLineNo">3590</span><a name="line.3590"></a>
-<span class="sourceLineNo">3591</span>      flushThread.start();<a name="line.3591"></a>
-<span class="sourceLineNo">3592</span><a name="line.3592"></a>
-<span class="sourceLineNo">3593</span>      Scan scan = new Scan(Bytes.toBytes("row0"), Bytes.toBytes("row1"));<a name="line.3593"></a>
-<span class="sourceLineNo">3594</span><a name="line.3594"></a>
-<span class="sourceLineNo">3595</span>      int expectedCount = numFamilies * numQualifiers;<a name="line.3595"></a>
-<span class="sourceLineNo">3596</span>      List&lt;Cell&gt; res = new ArrayList&lt;&gt;();<a name="line.3596"></a>
-<span class="sourceLineNo">3597</span><a name="line.3597"></a>
-<span class="sourceLineNo">3598</span>      long prevTimestamp = 0L;<a name="line.3598"></a>
-<span class="sourceLineNo">3599</span>      for (int i = 0; i &lt; testCount; i++) {<a name="line.3599"></a>
+<span class="sourceLineNo">3463</span>      int expectedCount = 0;<a name="line.3463"></a>
+<span class="sourceLineNo">3464</span>      List&lt;Cell&gt; res = new ArrayList&lt;&gt;();<a name="line.3464"></a>
+<span class="sourceLineNo">3465</span><a name="line.3465"></a>
+<span class="sourceLineNo">3466</span>      boolean toggle = true;<a name="line.3466"></a>
+<span class="sourceLineNo">3467</span>      for (long i = 0; i &lt; numRows; i++) {<a name="line.3467"></a>
+<span class="sourceLineNo">3468</span>        Put put = new Put(Bytes.toBytes(i));<a name="line.3468"></a>
+<span class="sourceLineNo">3469</span>        put.setDurability(Durability.SKIP_WAL);<a name="line.3469"></a>
+<span class="sourceLineNo">3470</span>        put.addColumn(family, qual1, Bytes.toBytes(i % 10));<a name="line.3470"></a>
+<span class="sourceLineNo">3471</span>        region.put(put);<a name="line.3471"></a>
+<span class="sourceLineNo">3472</span><a name="line.3472"></a>
+<span class="sourceLineNo">3473</span>        if (i != 0 &amp;&amp; i % compactInterval == 0) {<a name="line.3473"></a>
+<span class="sourceLineNo">3474</span>          LOG.debug("iteration = " + i+ " ts="+System.currentTimeMillis());<a name="line.3474"></a>
+<span class="sourceLineNo">3475</span>          region.compact(true);<a name="line.3475"></a>
+<span class="sourceLineNo">3476</span>        }<a name="line.3476"></a>
+<span class="sourceLineNo">3477</span><a name="line.3477"></a>
+<span class="sourceLineNo">3478</span>        if (i % 10 == 5L) {<a name="line.3478"></a>
+<span class="sourceLineNo">3479</span>          expectedCount++;<a name="line.3479"></a>
+<span class="sourceLineNo">3480</span>        }<a name="line.3480"></a>
+<span class="sourceLineNo">3481</span><a name="line.3481"></a>
+<span class="sourceLineNo">3482</span>        if (i != 0 &amp;&amp; i % flushAndScanInterval == 0) {<a name="line.3482"></a>
+<span class="sourceLineNo">3483</span>          res.clear();<a name="line.3483"></a>
+<span class="sourceLineNo">3484</span>          InternalScanner scanner = region.getScanner(scan);<a name="line.3484"></a>
+<span class="sourceLineNo">3485</span>          if (toggle) {<a name="line.3485"></a>
+<span class="sourceLineNo">3486</span>            flushThread.flush();<a name="line.3486"></a>
+<span class="sourceLineNo">3487</span>          }<a name="line.3487"></a>
+<span class="sourceLineNo">3488</span>          while (scanner.next(res))<a name="line.3488"></a>
+<span class="sourceLineNo">3489</span>            ;<a name="line.3489"></a>
+<span class="sourceLineNo">3490</span>          if (!toggle) {<a name="line.3490"></a>
+<span class="sourceLineNo">3491</span>            flushThread.flush();<a name="line.3491"></a>
+<span class="sourceLineNo">3492</span>          }<a name="line.3492"></a>
+<span class="sourceLineNo">3493</span>          assertEquals("toggle="+toggle+"i=" + i + " ts="+System.currentTimeMillis(),<a name="line.3493"></a>
+<span class="sourceLineNo">3494</span>              expectedCount, res.size());<a name="line.3494"></a>
+<span class="sourceLineNo">3495</span>          toggle = !toggle;<a name="line.3495"></a>
+<span class="sourceLineNo">3496</span>        }<a name="line.3496"></a>
+<span class="sourceLineNo">3497</span>      }<a name="line.3497"></a>
+<span class="sourceLineNo">3498</span><a name="line.3498"></a>
+<span class="sourceLineNo">3499</span>    } finally {<a name="line.3499"></a>
+<span class="sourceLineNo">3500</span>      try {<a name="line.3500"></a>
+<span class="sourceLineNo">3501</span>        flushThread.done();<a name="line.3501"></a>
+<span class="sourceLineNo">3502</span>        flushThread.join();<a name="line.3502"></a>
+<span class="sourceLineNo">3503</span>        flushThread.checkNoError();<a name="line.3503"></a>
+<span class="sourceLineNo">3504</span>      } catch (InterruptedException ie) {<a name="line.3504"></a>
+<span class="sourceLineNo">3505</span>        LOG.warn("Caught exception when joining with flushThread", ie);<a name="line.3505"></a>
+<span class="sourceLineNo">3506</span>      }<a name="line.3506"></a>
+<span class="sourceLineNo">3507</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.3507"></a>
+<span class="sourceLineNo">3508</span>      this.region = null;<a name="line.3508"></a>
+<span class="sourceLineNo">3509</span>    }<a name="line.3509"></a>
+<span class="sourceLineNo">3510</span>  }<a name="line.3510"></a>
+<span class="sourceLineNo">3511</span><a name="line.3511"></a>
+<span class="sourceLineNo">3512</span>  protected class FlushThread extends Thread {<a name="line.3512"></a>
+<span class="sourceLineNo">3513</span>    private volatile boolean done;<a name="line.3513"></a>
+<span class="sourceLineNo">3514</span>    private Throwable error = null;<a name="line.3514"></a>
+<span class="sourceLineNo">3515</span><a name="line.3515"></a>
+<span class="sourceLineNo">3516</span>    FlushThread() {<a name="line.3516"></a>
+<span class="sourceLineNo">3517</span>      super("FlushThread");<a name="line.3517"></a>
+<span class="sourceLineNo">3518</span>    }<a name="line.3518"></a>
+<span class="sourceLineNo">3519</span><a name="line.3519"></a>
+<span class="sourceLineNo">3520</span>    public void done() {<a name="line.3520"></a>
+<span class="sourceLineNo">3521</span>      done = true;<a name="line.3521"></a>
+<span class="sourceLineNo">3522</span>      synchronized (this) {<a name="line.3522"></a>
+<span class="sourceLineNo">3523</span>        interrupt();<a name="line.3523"></a>
+<span class="sourceLineNo">3524</span>      }<a name="line.3524"></a>
+<span class="sourceLineNo">3525</span>    }<a name="line.3525"></a>
+<span class="sourceLineNo">3526</span><a name="line.3526"></a>
+<span class="sourceLineNo">3527</span>    public void checkNoError() {<a name="line.3527"></a>
+<span class="sourceLineNo">3528</span>      if (error != null) {<a name="line.3528"></a>
+<span class="sourceLineNo">3529</span>        assertNull(error);<a name="line.3529"></a>
+<span class="sourceLineNo">3530</span>      }<a name="line.3530"></a>
+<span class="sourceLineNo">3531</span>    }<a name="line.3531"></a>
+<span class="sourceLineNo">3532</span><a name="line.3532"></a>
+<span class="sourceLineNo">3533</span>    @Override<a name="line.3533"></a>
+<span class="sourceLineNo">3534</span>    public void run() {<a name="line.3534"></a>
+<span class="sourceLineNo">3535</span>      done = false;<a name="line.3535"></a>
+<span class="sourceLineNo">3536</span>      while (!done) {<a name="line.3536"></a>
+<span class="sourceLineNo">3537</span>        synchronized (this) {<a name="line.3537"></a>
+<span class="sourceLineNo">3538</span>          try {<a name="line.3538"></a>
+<span class="sourceLineNo">3539</span>            wait();<a name="line.3539"></a>
+<span class="sourceLineNo">3540</span>          } catch (InterruptedException ignored) {<a name="line.3540"></a>
+<span class="sourceLineNo">3541</span>            if (done) {<a name="line.3541"></a>
+<span class="sourceLineNo">3542</span>              break;<a name="line.3542"></a>
+<span class="sourceLineNo">3543</span>            }<a name="line.3543"></a>
+<span class="sourceLineNo">3544</span>          }<a name="line.3544"></a>
+<span class="sourceLineNo">3545</span>        }<a name="line.3545"></a>
+<span class="sourceLineNo">3546</span>        try {<a name="line.3546"></a>
+<span class="sourceLineNo">3547</span>          region.flush(true);<a name="line.3547"></a>
+<span class="sourceLineNo">3548</span>        } catch (IOException e) {<a name="line.3548"></a>
+<span class="sourceLineNo">3549</span>          if (!done) {<a name="line.3549"></a>
+<span class="sourceLineNo">3550</span>            LOG.error("Error while flushing cache", e);<a name="line.3550"></a>
+<span class="sourceLineNo">3551</span>            error = e;<a name="line.3551"></a>
+<span class="sourceLineNo">3552</span>          }<a name="line.3552"></a>
+<span class="sourceLineNo">3553</span>          break;<a name="line.3553"></a>
+<span class="sourceLineNo">3554</span>        } catch (Throwable t) {<a name="line.3554"></a>
+<span class="sourceLineNo">3555</span>          LOG.error("Uncaught exception", t);<a name="line.3555"></a>
+<span class="sourceLineNo">3556</span>          throw t;<a name="line.3556"></a>
+<span class="sourceLineNo">3557</span>        }<a name="line.3557"></a>
+<span class="sourceLineNo">3558</span>      }<a name="line.3558"></a>
+<span class="sourceLineNo">3559</span>    }<a name="line.3559"></a>
+<span class="sourceLineNo">3560</span><a name="line.3560"></a>
+<span class="sourceLineNo">3561</span>    public void flush() {<a name="line.3561"></a>
+<span class="sourceLineNo">3562</span>      synchronized (this) {<a name="line.3562"></a>
+<span class="sourceLineNo">3563</span>        notify();<a name="line.3563"></a>
+<span class="sourceLineNo">3564</span>      }<a name="line.3564"></a>
+<span class="sourceLineNo">3565</span>    }<a name="line.3565"></a>
+<span class="sourceLineNo">3566</span>  }<a name="line.3566"></a>
+<span class="sourceLineNo">3567</span><a name="line.3567"></a>
+<span class="sourceLineNo">3568</span>  /**<a name="line.3568"></a>
+<span class="sourceLineNo">3569</span>   * Writes very wide records and scans for the latest every time.. Flushes and<a name="line.3569"></a>
+<span class="sourceLineNo">3570</span>   * compacts the region every now and then to keep things realistic.<a name="line.3570"></a>
+<span class="sourceLineNo">3571</span>   *<a name="line.3571"></a>
+<span class="sourceLineNo">3572</span>   * @throws IOException<a name="line.3572"></a>
+<span class="sourceLineNo">3573</span>   *           by flush / scan / compaction<a name="line.3573"></a>
+<span class="sourceLineNo">3574</span>   * @throws InterruptedException<a name="line.3574"></a>
+<span class="sourceLineNo">3575</span>   *           when joining threads<a name="line.3575"></a>
+<span class="sourceLineNo">3576</span>   */<a name="line.3576"></a>
+<span class="sourceLineNo">3577</span>  @Test<a name="line.3577"></a>
+<span class="sourceLineNo">3578</span>  public void testWritesWhileScanning() throws IOException, InterruptedException {<a name="line.3578"></a>
+<span class="sourceLineNo">3579</span>    int testCount = 100;<a name="line.3579"></a>
+<span class="sourceLineNo">3580</span>    int numRows = 1;<a name="line.3580"></a>
+<span class="sourceLineNo">3581</span>    int numFamilies = 10;<a name="line.3581"></a>
+<span class="sourceLineNo">3582</span>    int numQualifiers = 100;<a name="line.3582"></a>
+<span class="sourceLineNo">3583</span>    int flushInterval = 7;<a name="line.3583"></a>
+<span class="sourceLineNo">3584</span>    int compactInterval = 5 * flushInterval;<a name="line.3584"></a>
+<span class="sourceLineNo">3585</span>    byte[][] families = new byte[numFamilies][];<a name="line.3585"></a>
+<span class="sourceLineNo">3586</span>    for (int i = 0; i &lt; numFamilies; i++) {<a name="line.3586"></a>
+<span class="sourceLineNo">3587</span>      families[i] = Bytes.toBytes("family" + i);<a name="line.3587"></a>
+<span class="sourceLineNo">3588</span>    }<a name="line.3588"></a>
+<span class="sourceLineNo">3589</span>    byte[][] qualifiers = new byte[numQualifiers][];<a name="line.3589"></a>
+<span class="sourceLineNo">3590</span>    for (int i = 0; i &lt; numQualifiers; i++) {<a name="line.3590"></a>
+<span class="sourceLineNo">3591</span>      qualifiers[i] = Bytes.toBytes("qual" + i);<a name="line.3591"></a>
+<span class="sourceLineNo">3592</span>    }<a name="line.3592"></a>
+<span class="sourceLineNo">3593</span><a name="line.3593"></a>
+<span class="sourceLineNo">3594</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.3594"></a>
+<span class="sourceLineNo">3595</span>    FlushThread flushThread = new FlushThread();<a name="line.3595"></a>
+<span class="sourceLineNo">3596</span>    PutThread putThread = new PutThread(numRows, families, qualifiers);<a name="line.3596"></a>
+<span class="sourceLineNo">3597</span>    try {<a name="line.3597"></a>
+<span class="sourceLineNo">3598</span>      putThread.start();<a name="line.3598"></a>
+<span class="sourceLineNo">3599</span>      putThread.waitForFirstPut();<a name="line.3599"></a>
 <span class="sourceLineNo">3600</span><a name="line.3600"></a>
-<span class="sourceLineNo">3601</span>        if (i != 0 &amp;&amp; i % compactInterval == 0) {<a name="line.3601"></a>
-<span class="sourceLineNo">3602</span>          region.compact(true);<a name="line.3602"></a>
-<span class="sourceLineNo">3603</span>          for (HStore store : region.getStores()) {<a name="line.3603"></a>
-<span class="sourceLineNo">3604</span>            store.closeAndArchiveCompactedFiles();<a name="line.3604"></a>
-<span class="sourceLineNo">3605</span>          }<a name="line.3605"></a>
-<span class="sourceLineNo">3606</span>        }<a name="line.3606"></a>
+<span class="sourceLineNo">3601</span>      flushThread.start();<a name="line.3601"></a>
+<span class="sourceLineNo">3602</span><a name="line.3602"></a>
+<span class="sourceLineNo">3603</span>      Scan scan = new Scan(Bytes.toBytes("row0"), Bytes.toBytes("row1"));<a name="line.3603"></a>
+<span class="sourceLineNo">3604</span><a name="line.3604"></a>
+<span class="sourceLineNo">3605</span>      int expectedCount = numFamilies * numQualifiers;<a name="line.3605"></a>
+<span class="sourceLineNo">3606</span>      List&lt;Cell&gt; res = new ArrayList&lt;&gt;();<a name="line.3606"></a>
 <span class="sourceLineNo">3607</span><a name="line.3607"></a>
-<span class="sourceLineNo">3608</span>        if (i != 0 &amp;&amp; i % flushInterval == 0) {<a name="line.3608"></a>
-<span class="sourceLineNo">3609</span>          flushThread.flush();<a name="line.3609"></a>
-<span class="sourceLineNo">3610</span>        }<a name="line.3610"></a>
-<span class="sourceLineNo">3611</span><a name="line.3611"></a>
-<span class="sourceLineNo">3612</span>        boolean previousEmpty = res.isEmpty();<a name="line.3612"></a>
-<span class="sourceLineNo">3613</span>        res.clear();<a name="line.3613"></a>
-<span class="sourceLineNo">3614</span>        try (InternalScanner scanner = region.getScanner(scan)) {<a name="line.3614"></a>
-<span class="sourceLineNo">3615</span>          boolean moreRows;<a name="line.3615"></a>
-<span class="sourceLineNo">3616</span>          do {<a name="line.3616"></a>
-<span class="sourceLineNo">3617</span>            moreRows = scanner.next(res);<a name="line.3617"></a>
-<span class="sourceLineNo">3618</span>          } while (moreRows);<a name="line.3618"></a>
-<span class="sourceLineNo">3619</span>        }<a name="line.3619"></a>
-<span class="sourceLineNo">3620</span>        if (!res.isEmpty() || !previousEmpty || i &gt; compactInterval) {<a name="line.3620"></a>
-<span class="sourceLineNo">3621</span>          assertEquals("i=" + i, expectedCount, res.size());<a name="line.3621"></a>
-<span class="sourceLineNo">3622</span>          long timestamp = res.get(0).getTimestamp();<a name="line.3622"></a>
-<span class="sourceLineNo">3623</span>          assertTrue("Timestamps were broke: " + timestamp + " prev: " + prevTimestamp,<a name="line.3623"></a>
-<span class="sourceLineNo">3624</span>              timestamp &gt;= prevTimestamp);<a name="line.3624"></a>
-<span class="sourceLineNo">3625</span>          prevTimestamp = timestamp;<a name="line.3625"></a>
-<span class="sourceLineNo">3626</span>        }<a name="line.3626"></a>
-<span class="sourceLineNo">3627</span>      }<a name="line.3627"></a>
-<span class="sourceLineNo">3628</span><a name="line.3628"></a>
-<span class="sourceLineNo">3629</span>      putThread.done();<a name="line.3629"></a>
-<span class="sourceLineNo">3630</span><a name="line.3630"></a>
-<span class="sourceLineNo">3631</span>      region.flush(true);<a name="line.3631"></a>
-<span class="sourceLineNo">3632</span><a name="line.3632"></a>
-<span class="sourceLineNo">3633</span>    } finally {<a name="line.3633"></a>
-<span class="sourceLineNo">3634</span>      try {<a name="line.3634"></a>
-<span class="sourceLineNo">3635</span>        flushThread.done();<a name="line.3635"></a>
-<span class="sourceLineNo">3636</span>        flushThread.join();<a name="line.3636"></a>
-<span class="sourceLineNo">3637</span>        flushThread.checkNoError();<a name="line.3637"></a>
+<span class="sourceLineNo">3608</span>      long prevTimestamp = 0L;<a name="line.3608"></a>
+<span class="sourceLineNo">3609</span>      for (int i = 0; i &lt; testCount; i++) {<a name="line.3609"></a>
+<span class="sourceLineNo">3610</span><a name="line.3610"></a>
+<span class="sourceLineNo">3611</span>        if (i != 0 &amp;&amp; i % compactInterval == 0) {<a name="line.3611"></a>
+<span class="sourceLineNo">3612</span>          region.compact(true);<a name="line.3612"></a>
+<span class="sourceLineNo">3613</span>          for (HStore store : region.getStores()) {<a name="line.3613"></a>
+<span class="sourceLineNo">3614</span>            store.closeAndArchiveCompactedFiles();<a name="line.3614"></a>
+<span class="sourceLineNo">3615</span>          }<a name="line.3615"></a>
+<span class="sourceLineNo">3616</span>        }<a name="line.3616"></a>
+<span class="sourceLineNo">3617</span><a name="line.3617"></a>
+<span class="sourceLineNo">3618</span>        if (i != 0 &amp;&amp; i % flushInterval == 0) {<a name="line.3618"></a>
+<span class="sourceLineNo">3619</span>          flushThread.flush();<a name="line.3619"></a>
+<span class="sourceLineNo">3620</span>        }<a name="line.3620"></a>
+<span class="sourceLineNo">3621</span><a name="line.3621"></a>
+<span class="sourceLineNo">3622</span>        boolean previousEmpty = res.isEmpty();<a name="line.3622"></a>
+<span class="sourceLineNo">3623</span>        res.clear();<a name="line.3623"></a>
+<span class="sourceLineNo">3624</span>        try (InternalScanner scanner = region.getScanner(scan)) {<a name="line.3624"></a>
+<span class="sourceLineNo">3625</span>          boolean moreRows;<a name="line.3625"></a>
+<span class="sourceLineNo">3626</span>          do {<a name="line.3626"></a>
+<span class="sourceLineNo">3627</span>            moreRows = scanner.next(res);<a name="line.3627"></a>
+<span class="sourceLineNo">3628</span>          } while (moreRows);<a name="line.3628"></a>
+<span class="sourceLineNo">3629</span>        }<a name="line.3629"></a>
+<span class="sourceLineNo">3630</span>        if (!res.isEmpty() || !previousEmpty || i &gt; compactInterval) {<a name="line.3630"></a>
+<span class="sourceLineNo">3631</span>          assertEquals("i=" + i, expectedCount, res.size());<a name="line.3631"></a>
+<span class="sourceLineNo">3632</span>          long timestamp = res.get(0).getTimestamp();<a name="line.3632"></a>
+<span class="sourceLineNo">3633</span>          assertTrue("Timestamps were broke: " + timestamp + " prev: " + prevTimestamp,<a name="line.3633"></a>
+<span class="sourceLineNo">3634</span>              timestamp &gt;= prevTimestamp);<a name="line.3634"></a>
+<span class="sourceLineNo">3635</span>          prevTimestamp = timestamp;<a name="line.3635"></a>
+<span class="sourceLineNo">3636</span>        }<a name="line.3636"></a>
+<span class="sourceLineNo">3637</span>      }<a name="line.3637"></a>
 <span class="sourceLineNo">3638</span><a name="line.3638"></a>
-<span class="sourceLineNo">3639</span>        putThread.join();<a name="line.3639"></a>
-<span class="sourceLineNo">3640</span>        putThread.checkNoError();<a name="line.3640"></a>
-<span class="sourceLineNo">3641</span>      } catch (InterruptedException ie) {<a name="line.3641"></a>
-<span class="sourceLineNo">3642</span>        LOG.warn("Caught exception when joining with flushThread", ie);<a name="line.3642"></a>
-<span class="sourceLineNo">3643</span>      }<a name="line.3643"></a>
-<span class="sourceLineNo">3644</span><a name="line.3644"></a>
-<span class="sourceLineNo">3645</span>      try {<a name="line.3645"></a>
-<span class="sourceLineNo">3646</span>          HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.3646"></a>
-<span class="sourceLineNo">3647</span>      } catch (DroppedSnapshotException dse) {<a name="line.3647"></a>
-<span class="sourceLineNo">3648</span>        // We could get this on way out because we interrupt the background flusher and it could<a name="line.3648"></a>
-<span class="sourceLineNo">3649</span>        // fail anywhere causing a DSE over in the background flusher... only it is not properly<a name="line.3649"></a>
-<span class="sourceLineNo">3650</span>        // dealt with so could still be memory hanging out when we get to here -- memory we can't<a name="line.3650"></a>
-<span class="sourceLineNo">3651</span>        // flush because the accounting is 'off' since original DSE.<a name="line.3651"></a>
-<span class="sourceLineNo">3652</span>      }<a name="line.3652"></a>
-<span class="sourceLineNo">3653</span>      this.region = null;<a name="line.3653"></a>
-<span class="sourceLineNo">3654</span>    }<a name="line.3654"></a>
-<span class="sourceLineNo">3655</span>  }<a name="line.3655"></a>
-<span class="sourceLineNo">3656</span><a name="line.3656"></a>
-<span class="sourceLineNo">3657</span>  protected class PutThread extends Thread {<a name="line.3657"></a>
-<span class="sourceLineNo">3658</span>    private volatile boolean done;<a name="line.3658"></a>
-<span class="sourceLineNo">3659</span>    private volatile int numPutsFinished = 0;<a name="line.3659"></a>
-<span class="sourceLineNo">3660</span><a name="line.3660"></a>
-<span class="sourceLineNo">3661</span>    private Throwable error = null;<a name="line.3661"></a>
-<span class="sourceLineNo">3662</span>    private int numRows;<a name="line.3662"></a>
-<span class="sourceLineNo">3663</span>    private byte[][] families;<a name="line.3663"></a>
-<span class="sourceLineNo">3664</span>    private byte[][] qualifiers;<a name="line.3664"></a>
-<span class="sourceLineNo">3665</span><a name="line.3665"></a>
-<span class="sourceLineNo">3666</span>    private PutThread(int numRows, byte[][] families, byte[][] qualifiers) {<a name="line.3666"></a>
-<span class="sourceLineNo">3667</span>      super("PutThread");<a name="line.3667"></a>
-<span class="sourceLineNo">3668</span>      this.numRows = numRows;<a name="line.3668"></a>
-<span class="sourceLineNo">3669</span>      this.families = families;<a name="line.3669"></a>
-<span class="sourceLineNo">3670</span>      this.qualifiers = qualifiers;<a name="line.3670"></a>
-<span class="sourceLineNo">3671</span>    }<a name="line.3671"></a>
-<span class="sourceLineNo">3672</span><a name="line.3672"></a>
-<span class="sourceLineNo">3673</span>    /**<a name="line.3673"></a>
-<span class="sourceLineNo">3674</span>     * Block calling thread until this instance of PutThread has put at least one row.<a name="line.3674"></a>
-<span class="sourceLineNo">3675</span>     */<a name="line.3675"></a>
-<span class="sourceLineNo">3676</span>    public void waitForFirstPut() throws InterruptedException {<a name="line.3676"></a>
-<span class="sourceLineNo">3677</span>      // wait until put thread actually puts some data<a name="line.3677"></a>
-<span class="sourceLineNo">3678</span>      while (isAlive() &amp;&amp; numPutsFinished == 0) {<a name="line.3678"></a>
-<span class="sourceLineNo">3679</span>        checkNoError();<a name="line.3679"></a>
-<span class="sourceLineNo">3680</span>        Thread.sleep(50);<a name="line.3680"></a>
-<span class="sourceLineNo">3681</span>      }<a name="line.3681"></a>
-<span class="sourceLineNo">3682</span>    }<a name="line.3682"></a>
-<span class="sourceLineNo">3683</span><a name="line.3683"></a>
-<span class="sourceLineNo">3684</span>    public void done() {<a name="line.3684"></a>
-<span class="sourceLineNo">3685</span>      done = true;<a name="line.3685"></a>
-<span class="sourceLineNo">3686</span>      synchronized (this) {<a name="line.3686"></a>
-<span class="sourceLineNo">3687</span>        interrupt();<a name="line.3687"></a>
-<span class="sourceLineNo">3688</span>      }<a name="line.3688"></a>
-<span class="sourceLineNo">3689</span>    }<a name="line.3689"></a>
-<span class="sourceLineNo">3690</span><a name="line.3690"></a>
-<span class="sourceLineNo">3691</span>    public void checkNoError() {<a name="line.3691"></a>
-<span class="sourceLineNo">3692</span>      if (error != null) {<a name="line.3692"></a>
-<span class="sourceLineNo">3693</span>        assertNull(error);<a name="line.3693"></a>
-<span class="sourceLineNo">3694</span>      }<a name="line.3694"></a>
-<span class="sourceLineNo">3695</span>    }<a name="line.3695"></a>
-<span class="sourceLineNo">3696</span><a name="line.3696"></a>
-<span class="sourceLineNo">3697</span>    @Override<a name="line.3697"></a>
-<span class="sourceLineNo">3698</span>    public void run() {<a name="line.3698"></a>
-<span class="sourceLineNo">3699</span>      done = false;<a name="line.3699"></a>
-<span class="sourceLineNo">3700</span>      while (!done) {<a name="line.3700"></a>
-<span class="sourceLineNo">3701</span>        try {<a name="line.3701"></a>
-<span class="sourceLineNo">3702</span>          for (int r = 0; r &lt; numRows; r++) {<a name="line.3702"></a>
-<span class="sourceLineNo">3703</span>            byte[] row = Bytes.toBytes("row" + r);<a name="line.3703"></a>
-<span class="sourceLineNo">3704</span>            Put put = new Put(row);<a name="line.3704"></a>
-<span class="sourceLineNo">3705</span>            put.setDurability(Durability.SKIP_WAL);<a name="line.3705"></a>
-<span class="sourceLineNo">3706</span>            byte[] value = Bytes.toBytes(String.valueOf(numPutsFinished));<a name="line.3706"></a>
-<span class="sourceLineNo">3707</span>            for (byte[] family : families) {<a name="line.3707"></a>
-<span class="sourceLineNo">3708</span>              for (byte[] qualifier : qualifiers) {<a name="line.3708"></a>
-<span class="sourceLineNo">3709</span>                put.addColumn(family, qualifier, numPutsFinished, value);<a name="line.3709"></a>
-<span class="sourceLineNo">3710</span>              }<a name="line.3710"></a>
-<span class="sourceLineNo">3711</span>            }<a name="line.3711"></a>
-<span class="sourceLineNo">3712</span>            region.put(put);<a name="line.3712"></a>
-<span class="sourceLineNo">3713</span>            numPutsFinished++;<a name="line.3713"></a>
-<span class="sourceLineNo">3714</span>            if (numPutsFinished &gt; 0 &amp;&amp; numPutsFinished % 47 == 0) {<a name="line.3714"></a>
-<span class="sourceLineNo">3715</span>              LOG.debug("put iteration = {}", numPutsFinished);<a name="line.3715"></a>
-<span class="sourceLineNo">3716</span>              Delete delete = new Delete(row, (long) numPutsFinished - 30);<a name="line.3716"></a>
-<span class="sourceLineNo">3717</span>              region.delete(delete);<a name="line.3717"></a>
-<span class="sourceLineNo">3718</span>            }<a name="line.3718"></a>
-<span class="sourceLineNo">3719</span>            numPutsFinished++;<a name="line.3719"></a>
-<span class="sourceLineNo">3720</span>          }<a name="line.3720"></a>
-<span class="sourceLineNo">3721</span>        } catch (InterruptedIOException e) {<a name="line.3721"></a>
-<span class="sourceLineNo">3722</span>          // This is fine. It means we are done, or didn't get the lock on time<a name="line.3722"></a>
-<span class="sourceLineNo">3723</span>          LOG.info("Interrupted", e);<a name="line.3723"></a>
-<span class="sourceLineNo">3724</span>        } catch (IOException e) {<a name="line.3724"></a>
-<span class="sourceLineNo">3725</span>          LOG.error("Error while putting records", e);<a name="line.3725"></a>
-<span class="sourceLineNo">3726</span>          error = e;<a name="line.3726"></a>
-<span class="sourceLineNo">3727</span>          break;<a name="line.3727"></a>
-<span class="sourceLineNo">3728</span>        }<a name="line.3728"></a>
-<span class="sourceLineNo">3729</span>      }<a name="line.3729"></a>
-<span class="sourceLineNo">3730</span><a name="line.3730"></a>
-<span class="sourceLineNo">3731</span>    }<a name="line.3731"></a>
-<span class="sourceLineNo">3732</span><a name="line.3732"></a>
-<span class="sourceLineNo">3733</span>  }<a name="line.3733"></a>
-<span class="sourceLineNo">3734</span><a name="line.3734"></a>
-<span class="sourceLineNo">3735</span>  /**<a name="line.3735"></a>
-<span class="sourceLineNo">3736</span>   * Writes very wide records and gets the latest row every time.. Flushes and<a name="line.3736"></a>
-<span class="sourceLineNo">3737</span>   * compacts the region aggressivly to catch issues.<a name="line.3737"></a>
-<span class="sourceLineNo">3738</span>   *<a name="line.3738"></a>
-<span class="sourceLineNo">3739</span>   * @throws IOException<a name="line.3739"></a>
-<span class="sourceLineNo">3740</span>   *           by flush / scan / compaction<a name="line.3740"></a>
-<span class="sourceLineNo">3741</span>   * @throws InterruptedException<a name="line.3741"></a>
-<span class="sourceLineNo">3742</span>   *           when joining threads<a name="line.3742"></a>
-<span class="sourceLineNo">3743</span>   */<a name="line.3743"></a>
-<span class="sourceLineNo">3744</span>  @Test<a name="line.3744"></a>
-<span class="sourceLineNo">3745</span>  public void testWritesWhileGetting() throws Exception {<a name="line.3745"></a>
-<span class="sourceLineNo">3746</span>    int testCount = 50;<a name="line.3746"></a>
-<span class="sourceLineNo">3747</span>    int numRows = 1;<a name="line.3747"></a>
-<span class="sourceLineNo">3748</span>    int numFamilies = 10;<a name="line.3748"></a>
-<span class="sourceLineNo">3749</span>    int numQualifiers = 100;<a name="line.3749"></a>
-<span class="sourceLineNo">3750</span>    int compactInterval = 100;<a name="line.3750"></a>
-<span class="sourceLineNo">3751</span>    byte[][] families = new byte[numFamilies][];<a name="line.3751"></a>
-<span class="sourceLineNo">3752</span>    for (int i = 0; i &lt; numFamilies; i++) {<a name="line.3752"></a>
-<span class="sourceLineNo">3753</span>      families[i] = Bytes.toBytes("family" + i);<a name="line.3753"></a>
-<span class="sourceLineNo">3754</span>    }<a name="line.3754"></a>
-<span class="sourceLineNo">3755</span>    byte[][] qualifiers = new byte[numQualifiers][];<a name="line.3755"></a>
-<span class="sourceLineNo">3756</span>    for (int i = 0; i &lt; numQualifiers; i++) {<a name="line.3756"></a>
-<span class="sourceLineNo">3757</span>      qualifiers[i] = Bytes.toBytes("qual" + i);<a name="line.3757"></a>
-<span class="sourceLineNo">3758</span>    }<a name="line.3758"></a>
-<span class="sourceLineNo">3759</span><a name="line.3759"></a>
-<span class="sourceLineNo">3760</span><a name="line.3760"></a>
-<span class="sourceLineNo">3761</span>    // This test flushes constantly and can cause many files to be created,<a name="line.3761"></a>
-<span class="sourceLineNo">3762</span>    // possibly<a name="line.3762"></a>
-<span class="sourceLineNo">3763</span>    // extending over the ulimit. Make sure compactions are aggressive in<a name="line.3763"></a>
-<span class="sourceLineNo">3764</span>    // reducing<a name="line.3764"></a>
-<span class="sourceLineNo">3765</span>    // the number of HFiles created.<a name="line.3765"></a>
-<span class="sourceLineNo">3766</span>    Configuration conf = HBaseConfiguration.create(CONF);<a name="line.3766"></a>
-<span class="sourceLineNo">3767</span>    conf.setInt("hbase.hstore.compaction.min", 1);<a name="line.3767"></a>
-<span class="sourceLineNo">3768</span>    conf.setInt("hbase.hstore.compaction.max", 1000);<a name="line.3768"></a>
-<span class="sourceLineNo">3769</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.3769"></a>
-<span class="sourceLineNo">3770</span>    PutThread putThread = null;<a name="line.3770"></a>
-<span class="sourceLineNo">3771</span>    MultithreadedTestUtil.TestContext ctx = new MultithreadedTestUtil.TestContext(conf);<a name="line.3771"></a>
-<span class="sourceLineNo">3772</span>    try {<a name="line.3772"></a>
-<span class="sourceLineNo">3773</span>      putThread = new PutThread(numRows, families, qualifiers);<a name="line.3773"></a>
-<span class="sourceLineNo">3774</span>      putThread.start();<a name="line.3774"></a>
-<span class="sourceLineNo">3775</span>      putThread.waitForFirstPut();<a name="line.3775"></a>
-<span class="sourceLineNo">3776</span><a name="line.3776"></a>
-<span class="sourceLineNo">3777</span>      // Add a thread that flushes as fast as possible<a name="line.3777"></a>
-<span class="sourceLineNo">3778</span>      ctx.addThread(new RepeatingTestThread(ctx) {<a name="line.3778"></a>
-<span class="sourceLineNo">3779</span><a name="line.3779"></a>
-<span class="sourceLineNo">3780</span>        @Override<a name="line.3780"></a>
-<span class="sourceLineNo">3781</span>        public void doAnAction() throws Exception {<a name="line.3781"></a>
-<span class="sourceLineNo">3782</span>          region.flush(true);<a name="line.3782"></a>
-<span class="sourceLineNo">3783</span>          // Compact regularly to avoid creating too many files and exceeding<a name="line.3783"></a>
-<span class="sourceLineNo">3784</span>          // the ulimit.<a name="line.3784"></a>
-<span class="sourceLineNo">3785</span>          region.compact(false);<a name="line.3785"></a>
-<span class="sourceLineNo">3786</span>          for (HStore store : region.getStores()) {<a name="line.3786"></a>
-<span class="sourceLineNo">3787</span>            store.closeAndArchiveCompactedFiles();<a name="line.3787"></a>
-<span class="sourceLineNo">3788</span>          }<a name="line.3788"></a>
-<span class="sourceLineNo">3789</span>        }<a name="line.3789"></a>
-<span class="sourceLineNo">3790</span>      });<a name="line.3790"></a>
-<span class="sourceLineNo">3791</span>      ctx.startThreads();<a name="line.3791"></a>
-<span class="sourceLineNo">3792</span><a name="line.3792"></a>
-<span class="sourceLineNo">3793</span>      Get get = new Get(Bytes.toBytes("row0"));<a name="line.3793"></a>
-<span class="sourceLineNo">3794</span>      Result result = null;<a name="line.3794"></a>
-<span class="sourceLineNo">3795</span><a name="line.3795"></a>
-<span class="sourceLineNo">3796</span>      int expectedCount = numFamilies * numQualifiers;<a name="line.3796"></a>
-<span class="sourceLineNo">3797</span><a name="line.3797"></a>
-<span class="sourceLineNo">3798</span>      long prevTimestamp = 0L;<a name="line.3798"></a>
-<span class="sourceLineNo">3799</span>      for (int i = 0; i &lt; testCount; i++) {<a name="line.3799"></a>
-<span class="sourceLineNo">3800</span>        LOG.info("testWritesWhileGetting verify turn " + i);<a name="line.3800"></a>
-<span class="sourceLineNo">3801</span>        boolean previousEmpty = result == null || result.isEmpty();<a name="line.3801"></a>
-<span class="sourceLineNo">3802</span>        result = region.get(get);<a name="line.3802"></a>
-<span class="sourceLineNo">3803</span>        if (!result.isEmpty() || !previousEmpty || i &gt; compactInterval) {<a name="line.3803"></a>
-<span class="sourceLineNo">3804</span>          assertEquals("i=" + i, expectedCount, result.size());<a name="line.3804"></a>
-<span class="sourceLineNo">3805</span>          // TODO this was removed, now what dangit?!<a name="line.3805"></a>
-<span class="sourceLineNo">3806</span>          // search looking for the qualifier in question?<a name="line.3806"></a>
-<span class="sourceLineNo">3807</span>          long timestamp = 0;<a name="line.3807"></a>
-<span class="sourceLineNo">3808</span>          for (Cell kv : result.rawCells()) {<a name="line.3808"></a>
-<span class="sourceLineNo">3809</span>            if (CellUtil.matchingFamily(kv, families[0])<a name="line.3809"></a>
-<span class="sourceLineNo">3810</span>                &amp;&amp; CellUtil.matchingQualifier(kv, qualifiers[0])) {<a name="line.3810"></a>
-<span class="sourceLineNo">3811</span>              timestamp = kv.getTimestamp();<a name="line.3811"></a>
-<span class="sourceLineNo">3812</span>            }<a name="line.3812"></a>
-<span class="sourceLineNo">3813</span>          }<a name="line.3813"></a>
-<span class="sourceLineNo">3814</span>          assertTrue(timestamp &gt;= prevTimestamp);<a name="line.3814"></a>
-<span class="sourceLineNo">3815</span>          prevTimestamp = timestamp;<a name="line.3815"></a>
-<span class="sourceLineNo">3816</span>          Cell previousKV = null;<a name="line.3816"></a>
-<span class="sourceLineNo">3817</span><a name="line.3817"></a>
+<span class="sourceLineNo">3639</span>      putThread.done();<a name="line.3639"></a>
+<span class="sourceLineNo">3640</span><a name="line.3640"></a>
+<span class="sourceLineNo">3641</span>      region.flush(true);<a name="line.3641"></a>
+<span class="sourceLineNo">3642</span><a name="line.3642"></a>
+<span class="sourceLineNo">3643</span>    } finally {<a name="line.3643"></a>
+<span class="sourceLineNo">3644</span>      try {<a name="line.3644"></a>
+<span class="sourceLineNo">3645</span>        flushThread.done();<a name="line.3645"></a>
+<span class="sourceLineNo">3646</span>        flushThread.join();<a name="line.3646"></a>
+<span class="sourceLineNo">3647</span>        flushThread.checkNoError();<a name="line.3647"></a>
+<span class="sourceLineNo">3648</span><a name="line.3648"></a>
+<span class="sourceLineNo">3649</span>        putThread.join();<a name="line.3649"></a>
+<span class="sourceLineNo">3650</span>        putThread.checkNoError();<a name="line.3650"></a>
+<span class="sourceLineNo">3651</span>      } catch (InterruptedException ie) {<a name="line.3651"></a>
+<span class="sourceLineNo">3652</span>        LOG.warn("Caught exception when joining with flushThread", ie);<a name="line.3652"></a>
+<span class="sourceLineNo">3653</span>      }<a name="line.3653"></a>
+<span class="sourceLineNo">3654</span><a name="line.3654"></a>
+<span class="sourceLineNo">3655</span>      try {<a name="line.3655"></a>
+<span class="sourceLineNo">3656</span>          HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.3656"></a>
+<span class="sourceLineNo">3657</span>      } catch (DroppedSnapshotException dse) {<a name="line.3657"></a>
+<span class="sourceLineNo">3658</span>        // We could get this on way out because we interrupt the background flusher and it could<a name="line.3658"></a>
+<span class="sourceLineNo">3659</span>        // fail anywhere causing a DSE over in the background flusher... only it is not properly<a name="line.3659"></a>
+<span class="sourceLineNo">3660</span>        // dealt with so could still be memory hanging out when we get to here -- memory we can't<a name="line.3660"></a>
+<span class="sourceLineNo">3661</span>        // flush because the accounting is 'off' since original DSE.<a name="line.3661"></a>
+<span class="sourceLineNo">3662</span>      }<a name="line.3662"></a>
+<span class="sourceLineNo">3663</span>      this.region = null;<a name="line.3663"></a>
+<span class="sourceLineNo">3664</span>    }<a name="line.3664"></a>
+<span class="sourceLineNo">3665</span>  }<a name="line.3665"></a>
+<span class="sourceLineNo">3666</span><a name="line.3666"></a>
+<span class="sourceLineNo">3667</span>  protected class PutThread extends Thread {<a name="line.3667"></a>
+<span class="sourceLineNo">3668</span>    private volatile boolean done;<a name="line.3668"></a>
+<span class="sourceLineNo">3669</span>    private volatile int numPutsFinished = 0;<a name="line.3669"></a>
+<span class="sourceLineNo">3670</span><a name="line.3670"></a>
+<span class="sourceLineNo">3671</span>    private Throwable error = null;<a name="line.3671"></a>
+<span class="sourceLineNo">3672</span>    private int numRows;<a name="line.3672"></a>
+<span class="sourceLineNo">3673</span>    private byte[][] families;<a name="line.3673"></a>
+<span class="sourceLineNo">3674</span>    private byte[][] qualifiers;<a name="line.3674"></a>
+<span class="sourceLineNo">3675</span><a name="line.3675"></a>
+<span class="sourceLineNo">3676</span>    private PutThread(int numRows, byte[][] families, byte[][] qualifiers) {<a name="line.3676"></a>
+<span class="sourceLineNo">3677</span>      super("PutThread");<a name="line.3677"></a>
+<span class="sourceLineNo">3678</span>      this.numRows = numRows;<a name="line.3678"></a>
+<span class="sourceLineNo">3679</span>      this.families = families;<a name="line.3679"></a>
+<span class="sourceLineNo">3680</span>      this.qualifiers = qualifiers;<a name="line.3680"></a>
+<span class="sourceLineNo">3681</span>    }<a name="line.3681"></a>
+<span class="sourceLineNo">3682</span><a name="line.3682"></a>
+<span class="sourceLineNo">3683</span>    /**<a name="line.3683"></a>
+<span class="sourceLineNo">3684</span>     * Block calling thread until this instance of PutThread has put at least one row.<a name="line.3684"></a>
+<span class="sourceLineNo">3685</span>     */<a name="line.3685"></a>
+<span class="sourceLineNo">3686</span>    public void waitForFirstPut() throws InterruptedException {<a name="line.3686"></a>
+<span class="sourceLineNo">3687</span>      // wait until put thread actually puts some data<a name="line.3687"></a>
+<span class="sourceLineNo">3688</span>      while (isAlive() &amp;&amp; numPutsFinished == 0) {<a name="line.3688"></a>
+<span class="sourceLineNo">3689</span>        checkNoError();<a name="line.3689"></a>
+<span class="sourceLineNo">3690</span>        Thread.sleep(50);<a name="line.3690"></a>
+<span class="sourceLineNo">3691</span>      }<a name="line.3691"></a>
+<span class="sourceLineNo">3692</span>    }<a name="line.3692"></a>
+<span class="sourceLineNo">3693</span><a name="line.3693"></a>
+<span class="sourceLineNo">3694</span>    public void done() {<a name="line.3694"></a>
+<span class="sourceLineNo">3695</span>      done = true;<a name="line.3695"></a>
+<span class="sourceLineNo">3696</span>      synchronized (this) {<a name="line.3696"></a>
+<span class="sourceLineNo">3697</span>        interrupt();<a name="line.3697"></a>
+<span class="sourceLineNo">3698</span>      }<a name="line.3698"></a>
+<span class="sourceLineNo">3699</span>    }<a name="line.3699"></a>
+<span class="sourceLineNo">3700</span><a name="line.3700"></a>
+<span class="sourceLineNo">3701</span>    public void checkNoError() {<a name="line.3701"></a>
+<span class="sourceLineNo">3702</span>      if (error != null) {<a name="line.3702"></a>
+<span class="sourceLineNo">3703</span>        assertNull(error);<a name="line.3703"></a>
+<span class="sourceLineNo">3704</span>      }<a name="line.3704"></a>
+<span class="sourceLineNo">3705</span>    }<a name="line.3705"></a>
+<span class="sourceLineNo">3706</span><a name="line.3706"></a>
+<span class="sourceLineNo">3707</span>    @Override<a name="line.3707"></a>
+<span class="sourceLineNo">3708</span>    public void run() {<a name="line.3708"></a>
+<span class="sourceLineNo">3709</span>      done = false;<a name="line.3709"></a>
+<span class="sourceLineNo">3710</span>      while (!done) {<a name="line.3710"></a>
+<span class="sourceLineNo">3711</span>        try {<a name="line.3711"></a>
+<span class="sourceLineNo">3712</span>          for (int r = 0; r &lt; numRows; r++) {<a name="line.3712"></a>
+<span class="sourceLineNo">3713</span>            byte[] row = Bytes.toBytes("row" + r);<a name="line.3713"></a>
+<span class="sourceLineNo">3714</span>            Put put = new Put(row);<a name="line.3714"></a>
+<span class="sourceLineNo">3715</span>            put.setDurability(Durability.SKIP_WAL);<a name="line.3715"></a>
+<span class="sourceLineNo">3716</span>            byte[] value = Bytes.toBytes(String.valueOf(numPutsFinished));<a name="line.3716"></a>
+<span class="sourceLineNo">3717</span>            for (byte[] family : families) {<a name="line.3717"></a>
+<span class="sourceLineNo">3718</span>              for (byte[] qualifier : qualifiers) {<a name="line.3718"></a>
+<span class="sourceLineNo">3719</span>                put.addColumn(family, qualifier, numPutsFinished, value);<a name="line.3719"></a>
+<span class="sourceLineNo">3720</span>              }<a name="line.3720"></a>
+<span class="sourceLineNo">3721</span>            }<a name="line.3721"></a>
+<span class="sourceLineNo">3722</span>            region.put(put);<a name="line.3722"></a>
+<span class="sourceLineNo">3723</span>            numPutsFinished++;<a name="line.3723"></a>
+<span class="sourceLineNo">3724</span>            if (numPutsFinished &gt; 0 &amp;&amp; numPutsFinished % 47 == 0) {<a name="line.3724"></a>
+<span class="sourceLineNo">3725</span>              LOG.debug("put iteration = {}", numPutsFinished);<a name="line.3725"></a>
+<span class="sourceLineNo">3726</span>              Delete delete = new Delete(row, (long) numPutsFinished - 30);<a name="line.3726"></a>
+<span class="sourceLineNo">3727</span>              region.delete(delete);<a name="line.3727"></a>
+<span class="sourceLineNo">3728</span>            }<a name="line.3728"></a>
+<span class="sourceLineNo">3729</span>            numPutsFinished++;<a name="line.3729"></a>
+<span class="sourceLineNo">3730</span>          }<a name="line.3730"></a>
+<span class="sourceLineNo">3731</span>        } catch (InterruptedIOException e) {<a name="line.3731"></a>
+<span class="sourceLineNo">3732</span>          // This is fine. It means we are done, or didn't get the lock on time<a name="line.3732"></a>
+<span class="sourceLineNo">3733</span>          LOG.info("Interrupted", e);<a name="line.3733"></a>
+<span class="sourceLineNo">3734</span>        } catch (IOException e) {<a name="line.3734"></a>
+<span class="sourceLineNo">3735</span>          LOG.error("Error while putting records", e);<a name="line.3735"></a>
+<span class="sourceLineNo">3736</span>          error = e;<a name="line.3736"></a>
+<span class="sourceLineNo">3737</span>          break;<a name="line.3737"></a>
+<span class="sourceLineNo">3738</span>        }<a name="line.3738"></a>
+<span class="sourceLineNo">3739</span>      }<a name="line.3739"></a>
+<span class="sourceLineNo">3740</span><a name="line.3740"></a>
+<span class="sourceLineNo">3741</span>    }<a name="line.3741"></a>
+<span class="sourceLineNo">3742</span><a name="line.3742"></a>
+<span class="sourceLineNo">3743</span>  }<a name="line.3743"></a>
+<span class="sourceLineNo">3744</span><a name="line.3744"></a>
+<span class="sourceLineNo">3745</span>  /**<a name="line.3745"></a>
+<span class="sourceLineNo">3746</span>   * Writes very wide records and gets the latest row every time.. Flushes and<a name="line.3746"></a>
+<span class="sourceLineNo">3747</span>   * compacts the region aggressivly to catch issues.<a name="line.3747"></a>
+<span class="sourceLineNo">3748</span>   *<a name="line.3748"></a>
+<span class="sourceLineNo">3749</span>   * @throws IOException<a name="line.3749"></a>
+<span class="sourceLineNo">3750</span>   *           by flush / scan / compaction<a name="line.3750"></a>
+<span class="sourceLineNo">3751</span>   * @throws InterruptedException<a name="line.3751"></a>
+<span class="sourceLineNo">3752</span>   *           when joining threads<a name="line.3752"></a>
+<span class="sourceLineNo">3753</span>   */<a name="line.3753"></a>
+<span class="sourceLineNo">3754</span>  @Test<a name="line.3754"></a>
+<span class="sourceLineNo">3755</span>  public void testWritesWhileGetting() throws Exception {<a name="line.3755"></a>
+<span class="sourceLineNo">3756</span>    int testCount = 50;<a name="line.3756"></a>
+<span class="sourceLineNo">3757</span>    int numRows = 1;<a name="line.3757"></a>
+<span class="sourceLineNo">3758</span>    int numFamilies = 10;<a name="line.3758"></a>
+<span class="sourceLineNo">3759</span>    int numQualifiers = 100;<a name="line.3759"></a>
+<span class="sourceLineNo">3760</span>    int compactInterval = 100;<a name="line.3760"></a>
+<span class="sourceLineNo">3761</span>    byte[][] families = new byte[numFamilies][];<a name="line.3761"></a>
+<span class="sourceLineNo">3762</span>    for (int i = 0; i &lt; numFamilies; i++) {<a name="line.3762"></a>
+<span class="sourceLineNo">3763</span>      families[i] = Bytes.toBytes("family" + i);<a name="line.3763"></a>
+<span class="sourceLineNo">3764</span>    }<a name="line.3764"></a>
+<span class="sourceLineNo">3765</span>    byte[][] qualifiers = new byte[numQualifiers][];<a name="line.3765"></a>
+<span class="sourceLineNo">3766</span>    for (int i = 0; i &lt; numQualifiers; i++) {<a name="line.3766"></a>
+<span class="sourceLineNo">3767</span>      qualifiers[i] = Bytes.toBytes("qual" + i);<a name="line.3767"></a>
+<span class="sourceLineNo">3768</span>    }<a name="line.3768"></a>
+<span class="sourceLineNo">3769</span><a name="line.3769"></a>
+<span class="sourceLineNo">3770</span><a name="line.3770"></a>
+<span class="sourceLineNo">3771</span>    // This test flushes constantly and can cause many files to be created,<a name="line.3771"></a>
+<span class="sourceLineNo">3772</span>    // possibly<a name="line.3772"></a>
+<span class="sourceLineNo">3773</span>    // extending over the ulimit. Make sure compactions are aggressive in<a name="line.3773"></a>
+<span class="sourceLineNo">3774</span>    // reducing<a name="line.3774"></a>
+<span class="sourceLineNo">3775</span>    // the number of HFiles created.<a name="line.3775"></a>
+<span class="sourceLineNo">3776</span>    Configuration conf = HBaseConfiguration.create(CONF);<a name="line.3776"></a>
+<span class="sourceLineNo">3777</span>    conf.setInt("hbase.hstore.compaction.min", 1);<a name="line.3777"></a>
+<span class="sourceLineNo">3778</span>    conf.setInt("hbase.hstore.compaction.max", 1000);<a name="line.3778"></a>
+<span class="sourceLineNo">3779</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.3779"></a>
+<span class="sourceLineNo">3780</span>    PutThread putThread = null;<a name="line.3780"></a>
+<span class="sourceLineNo">3781</span>    MultithreadedTestUtil.TestContext ctx = new MultithreadedTestUtil.TestContext(conf);<a name="line.3781"></a>
+<span class="sourceLineNo">3782</span>    try {<a name="line.3782"></a>
+<span class="sourceLineNo">3783</span>      putThread = new PutThread(numRows, families, qualifiers);<a name="line.3783"></a>
+<span class="sourceLineNo">3784</span>      putThread.start();<a name="line.3784"></a>
+<span class="sourceLineNo">3785</span>      putThread.waitForFirstPut();<a name="line.3785"></a>
+<span class="sourceLineNo">3786</span><a name="line.3786"></a>
+<span class="sourceLineNo">3787</span>      // Add a thread that flushes as fast as possible<a name="line.3787"></a>
+<span class="sourceLineNo">3788</span>      ctx.addThread(new RepeatingTestThread(ctx) {<a name="line.3788"></a>
+<span class="sourceLineNo">3789</span><a name="line.3789"></a>
+<span class="sourceLineNo">3790</span>        @Override<a name="line.3790"></a>
+<span class="sourceLineNo">3791</span>        public void doAnAction() throws Exception {<a name="line.3791"></a>
+<span class="sourceLineNo">3792</span>          region.flush(true);<a name="line.3792"></a>
+<span class="sourceLineNo">3793</span>          // Compact regularly to avoid creating too many files and exceeding<a name="line.3793"></a>
+<span class="sourceLineNo">3794</span>          // the ulimit.<a name="line.3794"></a>
+<span class="sourceLineNo">3795</span>          region.compact(false);<a name="line.3795"></a>
+<span class="sourceLineNo">3796</span>          for (HStore store : region.getStores()) {<a name="line.3796"></a>
+<span class="sourceLineNo">3797</span>            store.closeAndArchiveCompactedFiles();<a name="line.3797"></a>
+<span class="sourceLineNo">3798</span>          }<a name="line.3798"></a>
+<span class="sourceLineNo">3799</span>        }<a name="line.3799"></a>
+<span class="sourceLineNo">3800</span>      });<a name="line.3800"></a>
+<span class="sourceLineNo">3801</span>      ctx.startThreads();<a name="line.3801"></a>
+<span class="sourceLineNo">3802</span><a name="line.3802"></a>
+<span class="sourceLineNo">3803</span>      Get get = new Get(Bytes.toBytes("row0"));<a name="line.3803"></a>
+<span class="sourceLineNo">3804</span>      Result result = null;<a name="line.3804"></a>
+<span class="sourceLineNo">3805</span><a name="line.3805"></a>
+<span class="sourceLineNo">3806</span>      int expectedCount = numFamilies * numQualifiers;<a name="line.3806"></a>
+<span class="sourceLineNo">3807</span><a name="line.3807"></a>
+<span class="sourceLineNo">3808</span>      long prevTimestamp = 0L;<a name="line.3808"></a>
+<span class="sourceLineNo">3809</span>      for (int i = 0; i &lt; testCount; i++) {<a name="line.3809"></a>
+<span class="sourceLineNo">3810</span>        LOG.info("testWritesWhileGetting verify turn " + i);<a name="line.3810"></a>
+<span class="sourceLineNo">3811</span>        boolean previousEmpty = result == null || result.isEmpty();<a name="line.3811"></a>
+<span class="sourceLineNo">3812</span>        result = region.get(get);<a name="line.3812"></a>
+<span class="sourceLineNo">3813</span>        if (!result.isEmpty() || !previousEmpty || i &gt; compactInterval) {<a name="line.3813"></a>
+<span class="sourceLineNo">3814</span>          assertEquals("i=" + i, expectedCount, result.size());<a name="line.3814"></a>
+<span class="sourceLineNo">3815</span>          // TODO this was removed, now what dangit?!<a name="line.3815"></a>
+<span class="sourceLineNo">3816</span>          // search looking for the qualifier in question?<a name="line.3816"></a>
+<span class="sourceLineNo">3817</span>          long timestamp = 0;<a name="line.3817"></a>
 <span class="sourceLineNo">3818</span>          for (Cell kv : result.rawCells()) {<a name="line.3818"></a>
-<span class="sourceLineNo">3819</span>            byte[] thisValue = CellUtil.cloneValue(kv);<a name="line.3819"></a>
-<span class="sourceLineNo">3820</span>            if (previousKV != null) {<a name="line.3820"></a>
-<span class="sourceLineNo">3821</span>              if (Bytes.compareTo(CellUtil.cloneValue(previousKV), thisValue) != 0) {<a name="line.3821"></a>
-<span class="sourceLineNo">3822</span>                LOG.warn("These two KV should have the same value." + " Previous KV:" + previousKV<a name="line.3822"></a>
-<span class="sourceLineNo">3823</span>                    + "(memStoreTS:" + previousKV.getSequenceId() + ")" + ", New KV: " + kv<a name="line.3823"></a>
-<span class="sourceLineNo">3824</span>                    + "(memStoreTS:" + kv.getSequenceId() + ")");<a name="line.3824"></a>
-<span class="sourceLineNo">3825</span>                assertEquals(0, Bytes.compareTo(CellUtil.cloneValue(previousKV), thisValue));<a name="line.3825"></a>
-<span class="sourceLineNo">3826</span>              }<a name="line.3826"></a>
-<span class="sourceLineNo">3827</span>            }<a name="line.3827"></a>
-<span class="sourceLineNo">3828</span>            previousKV = kv;<a name="line.3828"></a>
-<span class="sourceLineNo">3829</span>          }<a name="line.3829"></a>
-<span class="sourceLineNo">3830</span>        }<a name="line.3830"></a>
-<span class="sourceLineNo">3831</span>      }<a name="line.3831"></a>
-<span class="sourceLineNo">3832</span>    } finally {<a name="line.3832"></a>
-<span class="sourceLineNo">3833</span>      if (putThread != null)<a name="line.3833"></a>
-<span class="sourceLineNo">3834</span>        putThread.done();<a name="line.3834"></a>
-<span class="sourceLineNo">3835</span><a name="line.3835"></a>
-<span class="sourceLineNo">3836</span>      region.flush(true);<a name="line.3836"></a>
-<span class="sourceLineNo">3837</span><a name="line.3837"></a>
-<span class="sourceLineNo">3838</span>      if (putThread != null) {<a name="line.3838"></a>
-<span class="sourceLineNo">3839</span>        putThread.join();<a name="line.3839"></a>
-<span class="sourceLineNo">3840</span>        putThread.checkNoError();<a name="line.3840"></a>
+<span class="sourceLineNo">3819</span>            if (CellUtil.matchingFamily(kv, families[0])<a name="line.3819"></a>
+<span class="sourceLineNo">3820</span>                &amp;&amp; CellUtil.matchingQualifier(kv, qualifiers[0])) {<a name="line.3820"></a>
+<span class="sourceLineNo">3821</span>              timestamp = kv.getTimestamp();<a name="line.3821"></a>
+<span class="sourceLineNo">3822</span>            }<a name="line.3822"></a>
+<span class="sourceLineNo">3823</span>          }<a name="line.3823"></a>
+<span class="sourceLineNo">3824</span>          assertTrue(timestamp &gt;= prevTimestamp);<a name="line.3824"></a>
+<span class="sourceLineNo">3825</span>          prevTimestamp = timestamp;<a name="line.3825"></a>
+<span class="sourceLineNo">3826</span>          Cell previousKV = null;<a name="line.3826"></a>
+<span class="sourceLineNo">3827</span><a name="line.3827"></a>
+<span class="sourceLineNo">3828</span>          for (Cell kv : result.rawCells()) {<a name="line.3828"></a>
+<span class="sourceLineNo">3829</span>            byte[] thisValue = CellUtil.cloneValue(kv);<a name="line.3829"></a>
+<span class="sourceLineNo">3830</span>            if (previousKV != null) {<a name="line.3830"></a>
+<span class="sourceLineNo">3831</span>              if (Bytes.compareTo(CellUtil.cloneValue(previousKV), thisValue) != 0) {<a name="line.3831"></a>
+<span class="sourceLineNo">3832</span>                LOG.warn("These two KV should have the same value." + " Previous KV:" + previousKV<a name="line.3832"></a>
+<span class="sourceLineNo">3833</span>                    + "(memStoreTS:" + previousKV.getSequenceId() + ")" + ", New KV: " + kv<a name="line.3833"></a>
+<span class="sourceLineNo">3834</span>                    + "(memStoreTS:" + kv.getSequenceId() + ")");<a name="line.3834"></a>
+<span class="sourceLineNo">3835</span>                assertEquals(0, Bytes.compareTo(CellUtil.cloneValue(previousKV), thisValue));<a name="line.3835"></a>
+<span class="sourceLineNo">3836</span>              }<a name="line.3836"></a>
+<span class="sourceLineNo">3837</span>            }<a name="line.3837"></a>
+<span class="sourceLineNo">3838</span>            previousKV = kv;<a name="line.3838"></a>
+<span class="sourceLineNo">3839</span>          }<a name="line.3839"></a>
+<span class="sourceLineNo">3840</span>        }<a name="line.3840"></a>
 <span class="sourceLineNo">3841</span>      }<a name="line.3841"></a>
-<span class="sourceLineNo">3842</span><a name="line.3842"></a>
-<span class="sourceLineNo">3843</span>      ctx.stop();<a name="line.3843"></a>
-<span class="sourceLineNo">3844</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.3844"></a>
-<span class="sourceLineNo">3845</span>      this.region = null;<a name="line.3845"></a>
-<span class="sourceLineNo">3846</span>    }<a name="line.3846"></a>
-<span class="sourceLineNo">3847</span>  }<a name="line.3847"></a>
-<span class="sourceLineNo">3848</span><a name="line.3848"></a>
-<span class="sourceLineNo">3849</span>  @Test<a name="line.3849"></a>
-<span class="sourceLineNo">3850</span>  public void testHolesInMeta() throws Exception {<a name="line.3850"></a>
-<span class="sourceLineNo">3851</span>    byte[] family = Bytes.toBytes("family");<a name="line.3851"></a>
-<span class="sourceLineNo">3852</span>    this.region = initHRegion(tableName, Bytes.toBytes("x"), Bytes.toBytes("z"), method, CONF,<a name="line.3852"></a>
-<span class="sourceLineNo">3853</span>        false, family);<a name="line.3853"></a>
-<span class="sourceLineNo">3854</span>    byte[] rowNotServed = Bytes.toBytes("a");<a name="line.3854"></a>
-<span class="sourceLineNo">3855</span>    Get g = new Get(rowNotServed);<a name="line.3855"></a>
-<span class="sourceLineNo">3856</span>    try {<a name="line.3856"></a>
-<span class="sourceLineNo">3857</span>      region.get(g);<a name="line.3857"></a>
-<span class="sourceLineNo">3858</span>      fail();<a name="line.3858"></a>
-<span class="sourceLineNo">3859</span>    } catch (WrongRegionException x) {<a name="line.3859"></a>
-<span class="sourceLineNo">3860</span>      // OK<a name="line.3860"></a>
-<span class="sourceLineNo">3861</span>    }<a name="line.3861"></a>
-<span class="sourceLineNo">3862</span>    byte[] row = Bytes.toBytes("y");<a name="line.3862"></a>
-<span class="sourceLineNo">3863</span>    g = new Get(row);<a name="line.3863"></a>
-<span class="sourceLineNo">3864</span>    region.get(g);<a name="line.3864"></a>
-<span class="sourceLineNo">3865</span>  }<a name="line.3865"></a>
-<span class="sourceLineNo">3866</span><a name="line.3866"></a>
-<span class="sourceLineNo">3867</span>  @Test<a name="line.3867"></a>
-<span class="sourceLineNo">3868</span>  public void testIndexesScanWithOneDeletedRow() throws IOException {<a name="line.3868"></a>
-<span class="sourceLineNo">3869</span>    byte[] family = Bytes.toBytes("family");<a name="line.3869"></a>
-<span class="sourceLineNo">3870</span><a name="line.3870"></a>
-<span class="sourceLineNo">3871</span>    // Setting up region<a name="line.3871"></a>
-<span class="sourceLineNo">3872</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.3872"></a>
-<span class="sourceLineNo">3873</span>    Put put = new Put(Bytes.toBytes(1L));<a name="line.3873"></a>
-<span class="sourceLineNo">3874</span>    put.addColumn(family, qual1, 1L, Bytes.toBytes(1L));<a name="line.3874"></a>
-<span class="sourceLineNo">3875</span>    region.put(put);<a name="line.3875"></a>
+<span class="sourceLineNo">3842</span>    } finally {<a name="line.3842"></a>
+<span class="sourceLineNo">3843</span>      if (putThread != null)<a name="line.3843"></a>
+<span class="sourceLineNo">3844</span>        putThread.done();<a name="line.3844"></a>
+<span class="sourceLineNo">3845</span><a name="line.3845"></a>
+<span class="sourceLineNo">3846</span>      region.flush(true);<a name="line.3846"></a>
+<span class="sourceLineNo">3847</span><a name="line.3847"></a>
+<span class="sourceLineNo">3848</span>      if (putThread != null) {<a name="line.3848"></a>
+<span class="sourceLineNo">3849</span>        putThread.join();<a name="line.3849"></a>
+<span class="sourceLineNo">3850</span>        putThread.checkNoError();<a name="line.3850"></a>
+<span class="sourceLineNo">3851</span>      }<a name="line.3851"></a>
+<span class="sourceLineNo">3852</span><a name="line.3852"></a>
+<span class="sourceLineNo">3853</span>      ctx.stop();<a name="line.3853"></a>
+<span class="sourceLineNo">3854</span>      HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.3854"></a>
+<span class="sourceLineNo">3855</span>      this.region = null;<a name="line.3855"></a>
+<span class="sourceLineNo">3856</span>    }<a name="line.3856"></a>
+<span class="sourceLineNo">3857</span>  }<a name="line.3857"></a>
+<span class="sourceLineNo">3858</span><a name="line.3858"></a>
+<span class="sourceLineNo">3859</span>  @Test<a name="line.3859"></a>
+<span class="sourceLineNo">3860</span>  public void testHolesInMeta() throws Exception {<a name="line.3860"></a>
+<span class="sourceLineNo">3861</span>    byte[] family = Bytes.toBytes("family");<a name="line.3861"></a>
+<span class="sourceLineNo">3862</span>    this.region = initHRegion(tableName, Bytes.toBytes("x"), Bytes.toBytes("z"), method, CONF,<a name="line.3862"></a>
+<span class="sourceLineNo">3863</span>        false, family);<a name="line.3863"></a>
+<span class="sourceLineNo">3864</span>    byte[] rowNotServed = Bytes.toBytes("a");<a name="line.3864"></a>
+<span class="sourceLineNo">3865</span>    Get g = new Get(rowNotServed);<a name="line.3865"></a>
+<span class="sourceLineNo">3866</span>    try {<a name="line.3866"></a>
+<span class="sourceLineNo">3867</span>      region.get(g);<a name="line.3867"></a>
+<span class="sourceLineNo">3868</span>      fail();<a name="line.3868"></a>
+<span class="sourceLineNo">3869</span>    } catch (WrongRegionException x) {<a name="line.3869"></a>
+<span class="sourceLineNo">3870</span>      // OK<a name="line.3870"></a>
+<span class="sourceLineNo">3871</span>    }<a name="line.3871"></a>
+<span class="sourceLineNo">3872</span>    byte[] row = Bytes.toBytes("y");<a name="line.3872"></a>
+<span class="sourceLineNo">3873</span>    g = new Get(row);<a name="line.3873"></a>
+<span class="sourceLineNo">3874</span>    region.get(g);<a name="line.3874"></a>
+<span class="sourceLineNo">3875</span>  }<a name="line.3875"></a>
 <span class="sourceLineNo">3876</span><a name="line.3876"></a>
-<span class="sourceLineNo">3877</span>    region.flush(true);<a name="line.3877"></a>
-<span class="sourceLineNo">3878</span><a name="line.3878"></a>
-<span class="sourceLineNo">3879</span>    Delete delete = new Delete(Bytes.toBytes(1L), 1L);<a name="line.3879"></a>
-<span class="sourceLineNo">3880</span>    region.delete(delete);<a name="line.3880"></a>
-<span class="sourceLineNo">3881</span><a name="line.3881"></a>
-<span class="sourceLineNo">3882</span>    put = new Put(Bytes.toBytes(2L));<a name="line.3882"></a>
-<span class="sourceLineNo">3883</span>    put.addColumn(family, qual1, 2L, Bytes.toBytes(2L));<a name="line.3883"></a>
-<span class="sourceLineNo">3884</span>    region.put(put);<a name="line.3884"></a>
-<span class="sourceLineNo">3885</span><a name="line.3885"></a>
-<span class="sourceLineNo">3886</span>    Scan idxScan = new Scan();<a name="line.3886"></a>
-<span class="sourceLineNo">3887</span>    idxScan.addFamily(family);<a name="line.3887"></a>
-<span class="sourceLineNo">3888</span>    idxScan.setFilter(new FilterList(FilterList.Operator.MUST_PASS_ALL, Arrays.&lt;Filter&gt; asList(<a name="line.3888"></a>
-<span class="sourceLineNo">3889</span>        new SingleColumnValueFilter(family, qual1, CompareOperator.GREATER_OR_EQUAL,<a name="line.3889"></a>
-<span class="sourceLineNo">3890</span>            new BinaryComparator(Bytes.toBytes(0L))), new SingleColumnValueFilter(family, qual1,<a name="line.3890"></a>
-<span class="sourceLineNo">3891</span>                    CompareOperator.LESS_OR_EQUAL, new BinaryComparator(Bytes.toBytes(3L))))));<a name="line.3891"></a>
-<span class="sourceLineNo">3892</span>    InternalScanner scanner = region.getScanner(idxScan);<a name="line.3892"></a>
-<span class="sourceLineNo">3893</span>    List&lt;Cell&gt; res = new ArrayList&lt;&gt;();<a name="line.3893"></a>
-<span class="sourceLineNo">3894</span><a name="line.3894"></a>
-<span class="sourceLineNo">3895</span>    while (scanner.next(res)) {<a name="line.3895"></a>
-<span class="sourceLineNo">3896</span>      // Ignore res value.<a name="line.3896"></a>
-<span class="sourceLineNo">3897</span>    }<a name="line.3897"></a>
-<span class="sourceLineNo">3898</span>    assertEquals(1L, res.size());<a name="line.3898"></a>
-<span class="sourceLineNo">3899</span>  }<a name="line.3899"></a>
-<span class="sourceLineNo">3900</span><a name="line.3900"></a>
-<span class="sourceLineNo">3901</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.3901"></a>
-<span class="sourceLineNo">3902</span>  // Bloom filter test<a name="line.3902"></a>
-<span class="sourceLineNo">3903</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.3903"></a>
-<span class="sourceLineNo">3904</span>  @Test<a name="line.3904"></a>
-<span class="sourceLineNo">3905</span>  public void testBloomFilterSize() throws IOException {<a name="line.3905"></a>
-<span class="sourceLineNo">3906</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.3906"></a>
-<span class="sourceLineNo">3907</span>    byte[] qf1 = Bytes.toBytes("col");<a name="line.3907"></a>
-<span class="sourceLineNo">3908</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.3908"></a>
-<span class="sourceLineNo">3909</span>    // Create Table<a name="line.3909"></a>
-<span class="sourceLineNo">3910</span>    HColumnDescriptor hcd = new HColumnDescriptor(fam1).setMaxVersions(Integer.MAX_VALUE)<a name="line.3910"></a>
-<span class="sourceLineNo">3911</span>        .setBloomFilterType(BloomType.ROWCOL);<a name="line.3911"></a>
-<span class="sourceLineNo">3912</span><a name="line.3912"></a>
-<span class="sourceLineNo">3913</span>    HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.3913"></a>
-<span class="sourceLineNo">3914</span>    htd.addFamily(hcd);<a name="line.3914"></a>
-<span class="sourceLineNo">3915</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.3915"></a>
-<span class="sourceLineNo">3916</span>    this.region = TEST_UTIL.createLocalHRegion(info, htd);<a name="line.3916"></a>
-<span class="sourceLineNo">3917</span>    int num_unique_rows = 10;<a name="line.3917"></a>
-<span class="sourceLineNo">3918</span>    int duplicate_multiplier = 2;<a name="line.3918"></a>
-<span class="sourceLineNo">3919</span>    int num_storefiles = 4;<a name="line.3919"></a>
-<span class="sourceLineNo">3920</span><a name="line.3920"></a>
-<span class="sourceLineNo">3921</span>    int version = 0;<a name="line.3921"></a>
-<span class="sourceLineNo">3922</span>    for (int f = 0; f &lt; num_storefiles; f++) {<a name="line.3922"></a>
-<span class="sourceLineNo">3923</span>      for (int i = 0; i &lt; duplicate_multiplier; i++) {<a name="line.3923"></a>
-<span class="sourceLineNo">3924</span>        for (int j = 0; j &lt; num_unique_rows; j++) {<a name="line.3924"></a>
-<span class="sourceLineNo">3925</span>          Put put = new Put(Bytes.toBytes("row" + j));<a name="line.3925"></a>
-<span class="sourceLineNo">3926</span>          put.setDurability(Durability.SKIP_WAL);<a name="line.3926"></a>
-<span class="sourceLineNo">3927</span>          long ts = version++;<a name="line.3927"></a>
-<span class="sourceLineNo">3928</span>          put.addColumn(fam1, qf1, ts, val1);<a name="line.3928"></a>
-<span class="sourceLineNo">3929</span>          region.put(put);<a name="line.3929"></a>
-<span class="sourceLineNo">3930</span>        }<a name="line.3930"></a>
-<span class="sourceLineNo">3931</span>      }<a name="line.3931"></a>
-<span class="sourceLineNo">3932</span>      region.flush(true);<a name="line.3932"></a>
-<span class="sourceLineNo">3933</span>    }<a name="line.3933"></a>
-<span class="sourceLineNo">3934</span>    // before compaction<a name="line.3934"></a>
-<span class="sourceLineNo">3935</span>    HStore store = region.getStore(fam1);<a name="line.3935"></a>
-<span class="sourceLineNo">3936</span>    Collection&lt;HStoreFile&gt; storeFiles = store.getStorefiles();<a name="line.3936"></a>
-<span class="sourceLineNo">3937</span>    for (HStoreFile storefile : storeFiles) {<a name="line.3937"></a>
-<span class="sourceLineNo">3938</span>      StoreFileReader reader = storefile.getReader();<a name="line.3938"></a>
-<span class="sourceLineNo">3939</span>      reader.loadFileInfo();<a name="line.3939"></a>
-<span class="sourceLineNo">3940</span>      reader.loadBloomfilter();<a name="line.3940"></a>
-<span class="sourceLineNo">3941</span>      assertEquals(num_unique_rows * duplicate_multiplier, reader.getEntries());<a name="line.3941"></a>
-<span class="sourceLineNo">3942</span>      assertEquals(num_unique_rows, reader.getFilterEntries());<a name="line.3942"></a>
+<span class="sourceLineNo">3877</span>  @Test<a name="line.3877"></a>
+<span class="sourceLineNo">3878</span>  public void testIndexesScanWithOneDeletedRow() throws IOException {<a name="line.3878"></a>
+<span class="sourceLineNo">3879</span>    byte[] family = Bytes.toBytes("family");<a name="line.3879"></a>
+<span class="sourceLineNo">3880</span><a name="line.3880"></a>
+<span class="sourceLineNo">3881</span>    // Setting up region<a name="line.3881"></a>
+<span class="sourceLineNo">3882</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.3882"></a>
+<span class="sourceLineNo">3883</span>    Put put = new Put(Bytes.toBytes(1L));<a name="line.3883"></a>
+<span class="sourceLineNo">3884</span>    put.addColumn(family, qual1, 1L, Bytes.toBytes(1L));<a name="line.3884"></a>
+<span class="sourceLineNo">3885</span>    region.put(put);<a name="line.3885"></a>
+<span class="sourceLineNo">3886</span><a name="line.3886"></a>
+<span class="sourceLineNo">3887</span>    region.flush(true);<a name="line.3887"></a>
+<span class="sourceLineNo">3888</span><a name="line.3888"></a>
+<span class="sourceLineNo">3889</span>    Delete delete = new Delete(Bytes.toBytes(1L), 1L);<a name="line.3889"></a>
+<span class="sourceLineNo">3890</span>    region.delete(delete);<a name="line.3890"></a>
+<span class="sourceLineNo">3891</span><a name="line.3891"></a>
+<span class="sourceLineNo">3892</span>    put = new Put(Bytes.toBytes(2L));<a name="line.3892"></a>
+<span class="sourceLineNo">3893</span>    put.addColumn(family, qual1, 2L, Bytes.toBytes(2L));<a name="line.3893"></a>
+<span class="sourceLineNo">3894</span>    region.put(put);<a name="line.3894"></a>
+<span class="sourceLineNo">3895</span><a name="line.3895"></a>
+<span class="sourceLineNo">3896</span>    Scan idxScan = new Scan();<a name="line.3896"></a>
+<span class="sourceLineNo">3897</span>    idxScan.addFamily(family);<a name="line.3897"></a>
+<span class="sourceLineNo">3898</span>    idxScan.setFilter(new FilterList(FilterList.Operator.MUST_PASS_ALL, Arrays.&lt;Filter&gt; asList(<a name="line.3898"></a>
+<span class="sourceLineNo">3899</span>        new SingleColumnValueFilter(family, qual1, CompareOperator.GREATER_OR_EQUAL,<a name="line.3899"></a>
+<span class="sourceLineNo">3900</span>            new BinaryComparator(Bytes.toBytes(0L))), new SingleColumnValueFilter(family, qual1,<a name="line.3900"></a>
+<span class="sourceLineNo">3901</span>                    CompareOperator.LESS_OR_EQUAL, new BinaryComparator(Bytes.toBytes(3L))))));<a name="line.3901"></a>
+<span class="sourceLineNo">3902</span>    InternalScanner scanner = region.getScanner(idxScan);<a name="line.3902"></a>
+<span class="sourceLineNo">3903</span>    List&lt;Cell&gt; res = new ArrayList&lt;&gt;();<a name="line.3903"></a>
+<span class="sourceLineNo">3904</span><a name="line.3904"></a>
+<span class="sourceLineNo">3905</span>    while (scanner.next(res)) {<a name="line.3905"></a>
+<span class="sourceLineNo">3906</span>      // Ignore res value.<a name="line.3906"></a>
+<span class="sourceLineNo">3907</span>    }<a name="line.3907"></a>
+<span class="sourceLineNo">3908</span>    assertEquals(1L, res.size());<a name="line.3908"></a>
+<span class="sourceLineNo">3909</span>  }<a name="line.3909"></a>
+<span class="sourceLineNo">3910</span><a name="line.3910"></a>
+<span class="sourceLineNo">3911</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.3911"></a>
+<span class="sourceLineNo">3912</span>  // Bloom filter test<a name="line.3912"></a>
+<span class="sourceLineNo">3913</span>  // ////////////////////////////////////////////////////////////////////////////<a name="line.3913"></a>
+<span class="sourceLineNo">3914</span>  @Test<a name="line.3914"></a>
+<span class="sourceLineNo">3915</span>  public void testBloomFilterSize() throws IOException {<a name="line.3915"></a>
+<span class="sourceLineNo">3916</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.3916"></a>
+<span class="sourceLineNo">3917</span>    byte[] qf1 = Bytes.toBytes("col");<a name="line.3917"></a>
+<span class="sourceLineNo">3918</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.3918"></a>
+<span class="sourceLineNo">3919</span>    // Create Table<a name="line.3919"></a>
+<span class="sourceLineNo">3920</span>    HColumnDescriptor hcd = new HColumnDescriptor(fam1).setMaxVersions(Integer.MAX_VALUE)<a name="line.3920"></a>
+<span class="sourceLineNo">3921</span>        .setBloomFilterType(BloomType.ROWCOL);<a name="line.3921"></a>
+<span class="sourceLineNo">3922</span><a name="line.3922"></a>
+<span class="sourceLineNo">3923</span>    HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.3923"></a>
+<span class="sourceLineNo">3924</span>    htd.addFamily(hcd);<a name="line.3924"></a>
+<span class="sourceLineNo">3925</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.3925"></a>
+<span class="sourceLineNo">3926</span>    this.region = TEST_UTIL.createLocalHRegion(info, htd);<a name="line.3926"></a>
+<span class="sourceLineNo">3927</span>    int num_unique_rows = 10;<a name="line.3927"></a>
+<span class="sourceLineNo">3928</span>    int duplicate_multiplier = 2;<a name="line.3928"></a>
+<span class="sourceLineNo">3929</span>    int num_storefiles = 4;<a name="line.3929"></a>
+<span class="sourceLineNo">3930</span><a name="line.3930"></a>
+<span class="sourceLineNo">3931</span>    int version = 0;<a name="line.3931"></a>
+<span class="sourceLineNo">3932</span>    for (int f = 0; f &lt; num_storefiles; f++) {<a name="line.3932"></a>
+<span class="sourceLineNo">3933</span>      for (int i = 0; i &lt; duplicate_multiplier; i++) {<a name="line.3933"></a>
+<span class="sourceLineNo">3934</span>        for (int j = 0; j &lt; num_unique_rows; j++) {<a name="line.3934"></a>
+<span class="sourceLineNo">3935</span>          Put put = new Put(Bytes.toBytes("row" + j));<a name="line.3935"></a>
+<span class="sourceLineNo">3936</span>          put.setDurability(Durability.SKIP_WAL);<a name="line.3936"></a>
+<span class="sourceLineNo">3937</span>          long ts = version++;<a name="line.3937"></a>
+<span class="sourceLineNo">3938</span>          put.addColumn(fam1, qf1, ts, val1);<a name="line.3938"></a>
+<span class="sourceLineNo">3939</span>          region.put(put);<a name="line.3939"></a>
+<span class="sourceLineNo">3940</span>        }<a name="line.3940"></a>
+<span class="sourceLineNo">3941</span>      }<a name="line.3941"></a>
+<span class="sourceLineNo">3942</span>      region.flush(true);<a name="line.3942"></a>
 <span class="sourceLineNo">3943</span>    }<a name="line.3943"></a>
-<span class="sourceLineNo">3944</span><a name="line.3944"></a>
-<span class="sourceLineNo">3945</span>    region.compact(true);<a name="line.3945"></a>
-<span class="sourceLineNo">3946</span><a name="line.3946"></a>
-<span class="sourceLineNo">3947</span>    // after compaction<a name="line.3947"></a>
-<span class="sourceLineNo">3948</span>    storeFiles = store.getStorefiles();<a name="line.3948"></a>
-<span class="sourceLineNo">3949</span>    for (HStoreFile storefile : storeFiles) {<a name="line.3949"></a>
-<span class="sourceLineNo">3950</span>      StoreFileReader reader = storefile.getReader();<a name="line.3950"></a>
-<span class="sourceLineNo">3951</span>      reader.loadFileInfo();<a name="line.3951"></a>
-<span class="sourceLineNo">3952</span>      reader.loadBloomfilter();<a name="line.3952"></a>
-<span class="sourceLineNo">3953</span>      assertEquals(num_unique_rows * duplicate_multiplier * num_storefiles, reader.getEntries());<a name="line.3953"></a>
-<span class="sourceLineNo">3954</span>      assertEquals(num_unique_rows, reader.getFilterEntries());<a name="line.3954"></a>
-<span class="sourceLineNo">3955</span>    }<a name="line.3955"></a>
-<span class="sourceLineNo">3956</span>  }<a name="line.3956"></a>
-<span class="sourceLineNo">3957</span><a name="line.3957"></a>
-<span class="sourceLineNo">3958</span>  @Test<a name="line.3958"></a>
-<span class="sourceLineNo">3959</span>  public void testAllColumnsWithBloomFilter() throws IOException {<a name="line.3959"></a>
-<span class="sourceLineNo">3960</span>    byte[] TABLE = Bytes.toBytes(name.getMethodName());<a name="line.3960"></a>
-<span class="sourceLineNo">3961</span>    byte[] FAMILY = Bytes.toBytes("family");<a name="line.3961"></a>
-<span class="sourceLineNo">3962</span><a name="line.3962"></a>
-<span class="sourceLineNo">3963</span>    // Create table<a name="line.3963"></a>
-<span class="sourceLineNo">3964</span>    HColumnDescriptor hcd = new HColumnDescriptor(FAMILY).setMaxVersions(Integer.MAX_VALUE)<a name="line.3964"></a>
-<span class="sourceLineNo">3965</span>        .setBloomFilterType(BloomType.ROWCOL);<a name="line.3965"></a>
-<span class="sourceLineNo">3966</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(TABLE));<a name="line.3966"></a>
-<span class="sourceLineNo">3967</span>    htd.addFamily(hcd);<a name="line.3967"></a>
-<span class="sourceLineNo">3968</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.3968"></a>
-<span class="sourceLineNo">3969</span>    this.region = TEST_UTIL.createLocalHRegion(info, htd);<a name="line.3969"></a>
-<span class="sourceLineNo">3970</span>    // For row:0, col:0: insert versions 1 through 5.<a name="line.3970"></a>
-<span class="sourceLineNo">3971</span>    byte[] row = Bytes.toBytes("row:" + 0);<a name="line.3971"></a>
-<span class="sourceLineNo">3972</span>    byte[] column = Bytes.toBytes("column:" + 0);<a name="line.3972"></a>
-<span class="sourceLineNo">3973</span>    Put put = new Put(row);<a name="line.3973"></a>
-<span class="sourceLineNo">3974</span>    put.setDurability(Durability.SKIP_WAL);<a name="line.3974"></a>
-<span class="sourceLineNo">3975</span>    for (long idx = 1; idx &lt;= 4; idx++) {<a name="line.3975"></a>
-<span class="sourceLineNo">3976</span>      put.addColumn(FAMILY, column, idx, Bytes.toBytes("value-version-" + idx));<a name="line.3976"></a>
-<span class="sourceLineNo">3977</span>    }<a name="line.3977"></a>
-<span class="sourceLineNo">3978</span>    region.put(put);<a name="line.3978"></a>
-<span class="sourceLineNo">3979</span><a name="line.3979"></a>
-<span class="sourceLineNo">3980</span>    // Flush<a name="line.3980"></a>
-<span class="sourceLineNo">3981</span>    region.flush(true);<a name="line.3981"></a>
-<span class="sourceLineNo">3982</span><a name="line.3982"></a>
-<span class="sourceLineNo">3983</span>    // Get rows<a name="line.3983"></a>
-<span class="sourceLineNo">3984</span>    Get get = new Get(row);<a name="line.3984"></a>
-<span class="sourceLineNo">3985</span>    get.readAllVersions();<a name="line.3985"></a>
-<span class="sourceLineNo">3986</span>    Cell[] kvs = region.get(get).rawCells();<a name="line.3986"></a>
-<span class="sourceLineNo">3987</span><a name="line.3987"></a>
-<span class="sourceLineNo">3988</span>    // Check if rows are correct<a name="line.3988"></a>
-<span class="sourceLineNo">3989</span>    assertEquals(4, kvs.length);<a name="line.3989"></a>
-<span class="sourceLineNo">3990</span>    checkOneCell(kvs[0], FAMILY, 0, 0, 4);<a name="line.3990"></a>
-<span class="sourceLineNo">3991</span>    checkOneCell(kvs[1], FAMILY, 0, 0, 3);<a name="line.3991"></a>
-<span class="sourceLineNo">3992</span>    checkOneCell(kvs[2], FAMILY, 0, 0, 2);<a name="line.3992"></a>
-<span class="sourceLineNo">3993</span>    checkOneCell(kvs[3], FAMILY, 0, 0, 1);<a name="line.3993"></a>
-<span class="sourceLineNo">3994</span>  }<a name="line.3994"></a>
-<span class="sourceLineNo">3995</span><a name="line.3995"></a>
-<span class="sourceLineNo">3996</span>  /**<a name="line.3996"></a>
-<span class="sourceLineNo">3997</span>   * Testcase to cover bug-fix for HBASE-2823 Ensures correct delete when<a name="line.3997"></a>
-<span class="sourceLineNo">3998</span>   * issuing delete row on columns with bloom filter set to row+col<a name="line.3998"></a>
-<span class="sourceLineNo">3999</span>   * (BloomType.ROWCOL)<a name="line.3999"></a>
-<span class="sourceLineNo">4000</span>   */<a name="line.4000"></a>
-<span class="sourceLineNo">4001</span>  @Test<a name="line.4001"></a>
-<span class="sourceLineNo">4002</span>  public void testDeleteRowWithBloomFilter() throws IOException {<a name="line.4002"></a>
-<span class="sourceLineNo">4003</span>    byte[] familyName = Bytes.toBytes("familyName");<a name="line.4003"></a>
-<span class="sourceLineNo">4004</span><a name="line.4004"></a>
-<span class="sourceLineNo">4005</span>    // Create Table<a name="line.4005"></a>
-<span class="sourceLineNo">4006</span>    HColumnDescriptor hcd = new HColumnDescriptor(familyName).setMaxVersions(Integer.MAX_VALUE)<a name="line.4006"></a>
-<span class="sourceLineNo">4007</span>        .setBloomFilterType(BloomType.ROWCOL);<a name="line.4007"></a>
-<span class="sourceLineNo">4008</span><a name="line.4008"></a>
-<span class="sourceLineNo">4009</span>    HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.4009"></a>
-<span class="sourceLineNo">4010</span>    htd.addFamily(hcd);<a name="line.4010"></a>
-<span class="sourceLineNo">4011</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.4011"></a>
-<span class="sourceLineNo">4012</span>    this.region = TEST_UTIL.createLocalHRegion(info, htd);<a name="line.4012"></a>
-<span class="sourceLineNo">4013</span>    // Insert some data<a name="line.4013"></a>
-<span class="sourceLineNo">4014</span>    byte[] row = Bytes.toBytes("row1");<a name="line.4014"></a>
-<span class="sourceLineNo">4015</span>    byte[] col = Bytes.toBytes("col1");<a name="line.4015"></a>
-<span class="sourceLineNo">4016</span><a name="line.4016"></a>
-<span class="sourceLineNo">4017</span>    Put put = new Put(row);<a name="line.4017"></a>
-<span class="sourceLineNo">4018</span>    put.addColumn(familyName, col, 1, Bytes.toBytes("SomeRandomValue"));<a name="line.4018"></a>
-<span class="sourceLineNo">4019</span>    region.put(put);<a name="line.4019"></a>
-<span class="sourceLineNo">4020</span>    region.flush(true);<a name="line.4020"></a>
-<span class="sourceLineNo">4021</span><a name="line.4021"></a>
-<span class="sourceLineNo">4022</span>    Delete del = new Delete(row);<a name="line.4022"></a>
-<span class="sourceLineNo">4023</span>    region.delete(del);<a name="line.4023"></a>
-<span class="sourceLineNo">4024</span>    region.flush(true);<a name="line.4024"></a>
-<span class="sourceLineNo">4025</span><a name="line.4025"></a>
-<span class="sourceLineNo">4026</span>    // Get remaining rows (should have none)<a name="line.4026"></a>
-<span class="sourceLineNo">4027</span>    Get get = new Get(row);<a name="line.4027"></a>
-<span class="sourceLineNo">4028</span>    get.addColumn(familyName, col);<a name="line.4028"></a>
-<span class="sourceLineNo">4029</span><a name="line.4029"></a>
-<span class="sourceLineNo">4030</span>    Cell[] keyValues = region.get(get).rawCells();<a name="line.4030"></a>
-<span class="sourceLineNo">4031</span>    assertEquals(0, keyValues.length);<a name="line.4031"></a>
-<span class="sourceLineNo">4032</span>  }<a name="line.4032"></a>
-<span class="sourceLineNo">4033</span><a name="line.4033"></a>
-<span class="sourceLineNo">4034</span>  @Test<a name="line.4034"></a>
-<span class="sourceLineNo">4035</span>  public void testgetHDFSBlocksDistribution() throws Exception {<a name="line.4035"></a>
-<span class="sourceLineNo">4036</span>    HBaseTestingUtility htu = new HBaseTestingUtility();<a name="line.4036"></a>
-<span class="sourceLineNo">4037</span>    // Why do we set the block size in this test?  If we set it smaller than the kvs, then we'll<a name="line.4037"></a>
-<span class="sourceLineNo">4038</span>    // break up the file in to more pieces that can be distributed across the three nodes and we<a name="line.4038"></a>
-<span class="sourceLineNo">4039</span>    // won't be able to have the condition this test asserts; that at least one node has<a name="line.4039"></a>
-<span class="sourceLineNo">4040</span>    // a copy of all replicas -- if small block size, then blocks are spread evenly across the<a name="line.4040"></a>
-<span class="sourceLineNo">4041</span>    // the three nodes.  hfilev3 with tags seems to put us over the block size.  St.Ack.<a name="line.4041"></a>
-<span class="sourceLineNo">4042</span>    // final int DEFAULT_BLOCK_SIZE = 1024;<a name="line.4042"></a>
-<span class="sourceLineNo">4043</span>    // htu.getConfiguration().setLong("dfs.blocksize", DEFAULT_BLOCK_SIZE);<a name="line.4043"></a>
-<span class="sourceLineNo">4044</span>    htu.getConfiguration().setInt("dfs.replication", 2);<a name="line.4044"></a>
-<span class="sourceLineNo">4045</span><a name="line.4045"></a>
-<span class="sourceLineNo">4046</span>    // set up a cluster with 3 nodes<a name="line.4046"></a>
-<span class="sourceLineNo">4047</span>    MiniHBaseCluster cluster = null;<a name="line.4047"></a>
-<span class="sourceLineNo">4048</span>    String dataNodeHosts[] = new String[] { "host1", "host2", "host3" };<a name="line.4048"></a>
-<span class="sourceLineNo">4049</span>    int regionServersCount = 3;<a name="line.4049"></a>
-<span class="sourceLineNo">4050</span><a name="line.4050"></a>
-<span class="sourceLineNo">4051</span>    try {<a name="line.4051"></a>
-<span class="sourceLineNo">4052</span>      StartMiniClusterOption option = StartMiniClusterOption.builder()<a name="line.4052"></a>
-<span class="sourceLineNo">4053</span>          .numRegionServers(regionServersCount).dataNodeHosts(dataNodeHosts).build();<a name="line.4053"></a>
-<span class="sourceLineNo">4054</span>      cluster = htu.startMiniCluster(option);<a name="line.4054"></a>
-<span class="sourceLineNo">4055</span>      byte[][] families = { fam1, fam2 };<a name="line.4055"></a>
-<span class="sourceLineNo">4056</span>      Table ht = htu.createTable(tableName, families);<a name="line.4056"></a>
-<span class="sourceLineNo">4057</span><a name="line.4057"></a>
-<span class="sourceLineNo">4058</span>      // Setting up region<a name="line.4058"></a>
-<span class="sourceLineNo">4059</span>      byte row[] = Bytes.toBytes("row1");<a name="line.4059"></a>
-<span class="sourceLineNo">4060</span>      byte col[] = Bytes.toBytes("col1");<a name="line.4060"></a>
-<span class="sourceLineNo">4061</span><a name="line.4061"></a>
-<span class="sourceLineNo">4062</span>      Put put = new Put(row);<a name="line.4062"></a>
-<span class="sourceLineNo">4063</span>      put.addColumn(fam1, col, 1, Bytes.toBytes("test1"));<a name="line.4063"></a>
-<span class="sourceLineNo">4064</span>      put.addColumn(fam2, col, 1, Bytes.toBytes("test2"));<a name="line.4064"></a>
-<span class="sourceLineNo">4065</span>      ht.put(put);<a name="line.4065"></a>
-<span class="sourceLineNo">4066</span><a name="line.4066"></a>
-<span class="sourceLineNo">4067</span>      HRegion firstRegion = htu.getHBaseCluster().getRegions(tableName).get(0);<a name="line.4067"></a>
-<span class="sourceLineNo">4068</span>      firstRegion.flush(true);<a name="line.4068"></a>
-<span class="sourceLineNo">4069</span>      HDFSBlocksDistribution blocksDistribution1 = firstRegion.getHDFSBlocksDistribution();<a name="line.4069"></a>
-<span class="sourceLineNo">4070</span><a name="line.4070"></a>
-<span class="sourceLineNo">4071</span>      // Given the default replication factor is 2 and we have 2 HFiles,<a name="line.4071"></a>
-<span class="sourceLineNo">4072</span>      // we will have total of 4 replica of blocks on 3 datanodes; thus there<a name="line.4072"></a>
-<span class="sourceLineNo">4073</span>      // must be at least one host that have replica for 2 HFiles. That host's<a name="line.4073"></a>
-<span class="sourceLineNo">4074</span>      // weight will be equal to the unique block weight.<a name="line.4074"></a>
-<span class="sourceLineNo">4075</span>      long uniqueBlocksWeight1 = blocksDistribution1.getUniqueBlocksTotalWeight();<a name="line.4075"></a>
-<span class="sourceLineNo">4076</span>      StringBuilder sb = new StringBuilder();<a name="line.4076"></a>
-<span class="sourceLineNo">4077</span>      for (String host: blocksDistribution1.getTopHosts()) {<a name="line.4077"></a>
-<span class="sourceLineNo">4078</span>        if (sb.length() &gt; 0) sb.append(", ");<a name="line.4078"></a>
-<span class="sourceLineNo">4079</span>        sb.append(host);<a name="line.4079"></a>
-<span class="sourceLineNo">4080</span>        sb.append("=");<a name="line.4080"></a>
-<span class="sourceLineNo">4081</span>        sb.append(blocksDistribution1.getWeight(host));<a name="line.4081"></a>
-<span class="sourceLineNo">4082</span>      }<a name="line.4082"></a>
-<span class="sourceLineNo">4083</span><a name="line.4083"></a>
-<span class="sourceLineNo">4084</span>      String topHost = blocksDistribution1.getTopHosts().get(0);<a name="line.4084"></a>
-<span class="sourceLineNo">4085</span>      long topHostWeight = blocksDistribution1.getWeight(topHost);<a name="line.4085"></a>
-<span class="sourceLineNo">4086</span>      String msg = "uniqueBlocksWeight=" + uniqueBlocksWeight1 + ", topHostWeight=" +<a name="line.4086"></a>
-<span class="sourceLineNo">4087</span>        topHostWeight + ", topHost=" + topHost + "; " + sb.toString();<a name="line.4087"></a>
-<span class="sourceLineNo">4088</span>      LOG.info(msg);<a name="line.4088"></a>
-<span class="sourceLineNo">4089</span>      assertTrue(msg, uniqueBlocksWeight1 == topHostWeight);<a name="line.4089"></a>
-<span class="sourceLineNo">4090</span><a name="line.4090"></a>
-<span class="sourceLineNo">4091</span>      // use the static method to compute the value, it should be the same.<a name="line.4091"></a>
-<span class="sourceLineNo">4092</span>      // static method is used by load balancer or other components<a name="line.4092"></a>
-<span class="sourceLineNo">4093</span>      HDFSBlocksDistribution blocksDistribution2 = HRegion.computeHDFSBlocksDistribution(<a name="line.4093"></a>
-<span class="sourceLineNo">4094</span>          htu.getConfiguration(), firstRegion.getTableDescriptor(), firstRegion.getRegionInfo());<a name="line.4094"></a>
-<span class="sourceLineNo">4095</span>      long uniqueBlocksWeight2 = blocksDistribution2.getUniqueBlocksTotalWeight();<a name="line.4095"></a>
-<span class="sourceLineNo">4096</span><a name="line.4096"></a>
-<span class="sourceLineNo">4097</span>      assertTrue(uniqueBlocksWeight1 == uniqueBlocksWeight2);<a name="line.4097"></a>
-<span class="sourceLineNo">4098</span><a name="line.4098"></a>
-<span class="sourceLineNo">4099</span>      ht.close();<a name="line.4099"></a>
-<span class="sourceLineNo">4100</span>    } finally {<a name="line.4100"></a>
-<span class="sourceLineNo">4101</span>      if (cluster != null) {<a name="line.4101"></a>
-<span class="sourceLineNo">4102</span>        htu.shutdownMiniCluster();<a name="line.4102"></a>
-<span class="sourceLineNo">4103</span>      }<a name="line.4103"></a>
-<span class="sourceLineNo">4104</span>    }<a name="line.4104"></a>
-<span class="sourceLineNo">4105</span>  }<a name="line.4105"></a>
+<span class="sourceLineNo">3944</span>    // before compaction<a name="line.3944"></a>
+<span class="sourceLineNo">3945</span>    HStore store = region.getStore(fam1);<a name="line.3945"></a>
+<span class="sourceLineNo">3946</span>    Collection&lt;HStoreFile&gt; storeFiles = store.getStorefiles();<a name="line.3946"></a>
+<span class="sourceLineNo">3947</span>    for (HStoreFile storefile : storeFiles) {<a name="line.3947"></a>
+<span class="sourceLineNo">3948</span>      StoreFileReader reader = storefile.getReader();<a name="line.3948"></a>
+<span class="sourceLineNo">3949</span>      reader.loadFileInfo();<a name="line.3949"></a>
+<span class="sourceLineNo">3950</span>      reader.loadBloomfilter();<a name="line.3950"></a>
+<span class="sourceLineNo">3951</span>      assertEquals(num_unique_rows * duplicate_multiplier, reader.getEntries());<a name="line.3951"></a>
+<span class="sourceLineNo">3952</span>      assertEquals(num_unique_rows, reader.getFilterEntries());<a name="line.3952"></a>
+<span class="sourceLineNo">3953</span>    }<a name="line.3953"></a>
+<span class="sourceLineNo">3954</span><a name="line.3954"></a>
+<span class="sourceLineNo">3955</span>    region.compact(true);<a name="line.3955"></a>
+<span class="sourceLineNo">3956</span><a name="line.3956"></a>
+<span class="sourceLineNo">3957</span>    // after compaction<a name="line.3957"></a>
+<span class="sourceLineNo">3958</span>    storeFiles = store.getStorefiles();<a name="line.3958"></a>
+<span class="sourceLineNo">3959</span>    for (HStoreFile storefile : storeFiles) {<a name="line.3959"></a>
+<span class="sourceLineNo">3960</span>      StoreFileReader reader = storefile.getReader();<a name="line.3960"></a>
+<span class="sourceLineNo">3961</span>      reader.loadFileInfo();<a name="line.3961"></a>
+<span class="sourceLineNo">3962</span>      reader.loadBloomfilter();<a name="line.3962"></a>
+<span class="sourceLineNo">3963</span>      assertEquals(num_unique_rows * duplicate_multiplier * num_storefiles, reader.getEntries());<a name="line.3963"></a>
+<span class="sourceLineNo">3964</span>      assertEquals(num_unique_rows, reader.getFilterEntries());<a name="line.3964"></a>
+<span class="sourceLineNo">3965</span>    }<a name="line.3965"></a>
+<span class="sourceLineNo">3966</span>  }<a name="line.3966"></a>
+<span class="sourceLineNo">3967</span><a name="line.3967"></a>
+<span class="sourceLineNo">3968</span>  @Test<a name="line.3968"></a>
+<span class="sourceLineNo">3969</span>  public void testAllColumnsWithBloomFilter() throws IOException {<a name="line.3969"></a>
+<span class="sourceLineNo">3970</span>    byte[] TABLE = Bytes.toBytes(name.getMethodName());<a name="line.3970"></a>
+<span class="sourceLineNo">3971</span>    byte[] FAMILY = Bytes.toBytes("family");<a name="line.3971"></a>
+<span class="sourceLineNo">3972</span><a name="line.3972"></a>
+<span class="sourceLineNo">3973</span>    // Create table<a name="line.3973"></a>
+<span class="sourceLineNo">3974</span>    HColumnDescriptor hcd = new HColumnDescriptor(FAMILY).setMaxVersions(Integer.MAX_VALUE)<a name="line.3974"></a>
+<span class="sourceLineNo">3975</span>        .setBloomFilterType(BloomType.ROWCOL);<a name="line.3975"></a>
+<span class="sourceLineNo">3976</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(TABLE));<a name="line.3976"></a>
+<span class="sourceLineNo">3977</span>    htd.addFamily(hcd);<a name="line.3977"></a>
+<span class="sourceLineNo">3978</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.3978"></a>
+<span class="sourceLineNo">3979</span>    this.region = TEST_UTIL.createLocalHRegion(info, htd);<a name="line.3979"></a>
+<span class="sourceLineNo">3980</span>    // For row:0, col:0: insert versions 1 through 5.<a name="line.3980"></a>
+<span class="sourceLineNo">3981</span>    byte[] row = Bytes.toBytes("row:" + 0);<a name="line.3981"></a>
+<span class="sourceLineNo">3982</span>    byte[] column = Bytes.toBytes("column:" + 0);<a name="line.3982"></a>
+<span class="sourceLineNo">3983</span>    Put put = new Put(row);<a name="line.3983"></a>
+<span class="sourceLineNo">3984</span>    put.setDurability(Durability.SKIP_WAL);<a name="line.3984"></a>
+<span class="sourceLineNo">3985</span>    for (long idx = 1; idx &lt;= 4; idx++) {<a name="line.3985"></a>
+<span class="sourceLineNo">3986</span>      put.addColumn(FAMILY, column, idx, Bytes.toBytes("value-version-" + idx));<a name="line.3986"></a>
+<span class="sourceLineNo">3987</span>    }<a name="line.3987"></a>
+<span class="sourceLineNo">3988</span>    region.put(put);<a name="line.3988"></a>
+<span class="sourceLineNo">3989</span><a name="line.3989"></a>
+<span class="sourceLineNo">3990</span>    // Flush<a name="line.3990"></a>
+<span class="sourceLineNo">3991</span>    region.flush(true);<a name="line.3991"></a>
+<span class="sourceLineNo">3992</span><a name="line.3992"></a>
+<span class="sourceLineNo">3993</span>    // Get rows<a name="line.3993"></a>
+<span class="sourceLineNo">3994</span>    Get get = new Get(row);<a name="line.3994"></a>
+<span class="sourceLineNo">3995</span>    get.readAllVersions();<a name="line.3995"></a>
+<span class="sourceLineNo">3996</span>    Cell[] kvs = region.get(get).rawCells();<a name="line.3996"></a>
+<span class="sourceLineNo">3997</span><a name="line.3997"></a>
+<span class="sourceLineNo">3998</span>    // Check if rows are correct<a name="line.3998"></a>
+<span class="sourceLineNo">3999</span>    assertEquals(4, kvs.length);<a name="line.3999"></a>
+<span class="sourceLineNo">4000</span>    checkOneCell(kvs[0], FAMILY, 0, 0, 4);<a name="line.4000"></a>
+<span class="sourceLineNo">4001</span>    checkOneCell(kvs[1], FAMILY, 0, 0, 3);<a name="line.4001"></a>
+<span class="sourceLineNo">4002</span>    checkOneCell(kvs[2], FAMILY, 0, 0, 2);<a name="line.4002"></a>
+<span class="sourceLineNo">4003</span>    checkOneCell(kvs[3], FAMILY, 0, 0, 1);<a name="line.4003"></a>
+<span class="sourceLineNo">4004</span>  }<a name="line.4004"></a>
+<span class="sourceLineNo">4005</span><a name="line.4005"></a>
+<span class="sourceLineNo">4006</span>  /**<a name="line.4006"></a>
+<span class="sourceLineNo">4007</span>   * Testcase to cover bug-fix for HBASE-2823 Ensures correct delete when<a name="line.4007"></a>
+<span class="sourceLineNo">4008</span>   * issuing delete row on columns with bloom filter set to row+col<a name="line.4008"></a>
+<span class="sourceLineNo">4009</span>   * (BloomType.ROWCOL)<a name="line.4009"></a>
+<span class="sourceLineNo">4010</span>   */<a name="line.4010"></a>
+<span class="sourceLineNo">4011</span>  @Test<a name="line.4011"></a>
+<span class="sourceLineNo">4012</span>  public void testDeleteRowWithBloomFilter() throws IOException {<a name="line.4012"></a>
+<span class="sourceLineNo">4013</span>    byte[] familyName = Bytes.toBytes("familyName");<a name="line.4013"></a>
+<span class="sourceLineNo">4014</span><a name="line.4014"></a>
+<span class="sourceLineNo">4015</span>    // Create Table<a name="line.4015"></a>
+<span class="sourceLineNo">4016</span>    HColumnDescriptor hcd = new HColumnDescriptor(familyName).setMaxVersions(Integer.MAX_VALUE)<a name="line.4016"></a>
+<span class="sourceLineNo">4017</span>        .setBloomFilterType(BloomType.ROWCOL);<a name="line.4017"></a>
+<span class="sourceLineNo">4018</span><a name="line.4018"></a>
+<span class="sourceLineNo">4019</span>    HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.4019"></a>
+<span class="sourceLineNo">4020</span>    htd.addFamily(hcd);<a name="line.4020"></a>
+<span class="sourceLineNo">4021</span>    HRegionInfo info = new HRegionInfo(htd.getTableName(), null, null, false);<a name="line.4021"></a>
+<span class="sourceLineNo">4022</span>    this.region = TEST_UTIL.createLocalHRegion(info, htd);<a name="line.4022"></a>
+<span class="sourceLineNo">4023</span>    // Insert some data<a name="line.4023"></a>
+<span class="sourceLineNo">4024</span>    byte[] row = Bytes.toBytes("row1");<a name="line.4024"></a>
+<span class="sourceLineNo">4025</span>    byte[] col = Bytes.toBytes("col1");<a name="line.4025"></a>
+<span class="sourceLineNo">4026</span><a name="line.4026"></a>
+<span class="sourceLineNo">4027</span>    Put put = new Put(row);<a name="line.4027"></a>
+<span class="sourceLineNo">4028</span>    put.addColumn(familyName, col, 1, Bytes.toBytes("SomeRandomValue"));<a name="line.4028"></a>
+<span class="sourceLineNo">4029</span>    region.put(put);<a name="line.4029"></a>
+<span class="sourceLineNo">4030</span>    region.flush(true);<a name="line.4030"></a>
+<span class="sourceLineNo">4031</span><a name="line.4031"></a>
+<span class="sourceLineNo">4032</span>    Delete del = new Delete(row);<a name="line.4032"></a>
+<span class="sourceLineNo">4033</span>    region.delete(del);<a name="line.4033"></a>
+<span class="sourceLineNo">4034</span>    region.flush(true);<a name="line.4034"></a>
+<span class="sourceLineNo">4035</span><a name="line.4035"></a>
+<span class="sourceLineNo">4036</span>    // Get remaining rows (should have none)<a name="line.4036"></a>
+<span class="sourceLineNo">4037</span>    Get get = new Get(row);<a name="line.4037"></a>
+<span class="sourceLineNo">4038</span>    get.addColumn(familyName, col);<a name="line.4038"></a>
+<span class="sourceLineNo">4039</span><a name="line.4039"></a>
+<span class="sourceLineNo">4040</span>    Cell[] keyValues = region.get(get).rawCells();<a name="line.4040"></a>
+<span class="sourceLineNo">4041</span>    assertEquals(0, keyValues.length);<a name="line.4041"></a>
+<span class="sourceLineNo">4042</span>  }<a name="line.4042"></a>
+<span class="sourceLineNo">4043</span><a name="line.4043"></a>
+<span class="sourceLineNo">4044</span>  @Test<a name="line.4044"></a>
+<span class="sourceLineNo">4045</span>  public void testgetHDFSBlocksDistribution() throws Exception {<a name="line.4045"></a>
+<span class="sourceLineNo">4046</span>    HBaseTestingUtility htu = new HBaseTestingUtility();<a name="line.4046"></a>
+<span class="sourceLineNo">4047</span>    // Why do we set the block size in this test?  If we set it smaller than the kvs, then we'll<a name="line.4047"></a>
+<span class="sourceLineNo">4048</span>    // break up the file in to more pieces that can be distributed across the three nodes and we<a name="line.4048"></a>
+<span class="sourceLineNo">4049</span>    // won't be able to have the condition this test asserts; that at least one node has<a name="line.4049"></a>
+<span class="sourceLineNo">4050</span>    // a copy of all replicas -- if small block size, then blocks are spread evenly across the<a name="line.4050"></a>
+<span class="sourceLineNo">4051</span>    // the three nodes.  hfilev3 with tags seems to put us over the block size.  St.Ack.<a name="line.4051"></a>
+<span class="sourceLineNo">4052</span>    // final int DEFAULT_BLOCK_SIZE = 1024;<a name="line.4052"></a>
+<span class="sourceLineNo">4053</span>    // htu.getConfiguration().setLong("dfs.blocksize", DEFAULT_BLOCK_SIZE);<a name="line.4053"></a>
+<span class="sourceLineNo">4054</span>    htu.getConfiguration().setInt("dfs.replication", 2);<a name="line.4054"></a>
+<span class="sourceLineNo">4055</span><a name="line.4055"></a>
+<span class="sourceLineNo">4056</span>    // set up a cluster with 3 nodes<a name="line.4056"></a>
+<span class="sourceLineNo">4057</span>    MiniHBaseCluster cluster = null;<a name="line.4057"></a>
+<span class="sourceLineNo">4058</span>    String dataNodeHosts[] = new String[] { "host1", "host2", "host3" };<a name="line.4058"></a>
+<span class="sourceLineNo">4059</span>    int regionServersCount = 3;<a name="line.4059"></a>
+<span class="sourceLineNo">4060</span><a name="line.4060"></a>
+<span class="sourceLineNo">4061</span>    try {<a name="line.4061"></a>
+<span class="sourceLineNo">4062</span>      StartMiniClusterOption option = StartMiniClusterOption.builder()<a name="line.4062"></a>
+<span class="sourceLineNo">4063</span>          .numRegionServers(regionServersCount).dataNodeHosts(dataNodeHosts).build();<a name="line.4063"></a>
+<span class="sourceLineNo">4064</span>      cluster = htu.startMiniCluster(option);<a name="line.4064"></a>
+<span class="sourceLineNo">4065</span>      byte[][] families = { fam1, fam2 };<a name="line.4065"></a>
+<span class="sourceLineNo">4066</span>      Table ht = htu.createTable(tableName, families);<a name="line.4066"></a>
+<span class="sourceLineNo">4067</span><a name="line.4067"></a>
+<span class="sourceLineNo">4068</span>      // Setting up region<a name="line.4068"></a>
+<span class="sourceLineNo">4069</span>      byte row[] = Bytes.toBytes("row1");<a name="line.4069"></a>
+<span class="sourceLineNo">4070</span>      byte col[] = Bytes.toBytes("col1");<a name="line.4070"></a>
+<span class="sourceLineNo">4071</span><a name="line.4071"></a>
+<span class="sourceLineNo">4072</span>      Put put = new Put(row);<a name="line.4072"></a>
+<span class="sourceLineNo">4073</span>      put.addColumn(fam1, col, 1, Bytes.toBytes("test1"));<a name="line.4073"></a>
+<span class="sourceLineNo">4074</span>      put.addColumn(fam2, col, 1, Bytes.toBytes("test2"));<a name="line.4074"></a>
+<span class="sourceLineNo">4075</span>      ht.put(put);<a name="line.4075"></a>
+<span class="sourceLineNo">4076</span><a name="line.4076"></a>
+<span class="sourceLineNo">4077</span>      HRegion firstRegion = htu.getHBaseCluster().getRegions(tableName).get(0);<a name="line.4077"></a>
+<span class="sourceLineNo">4078</span>      firstRegion.flush(true);<a name="line.4078"></a>
+<span class="sourceLineNo">4079</span>      HDFSBlocksDistribution blocksDistribution1 = firstRegion.getHDFSBlocksDistribution();<a name="line.4079"></a>
+<span class="sourceLineNo">4080</span><a name="line.4080"></a>
+<span class="sourceLineNo">4081</span>      // Given the default replication factor is 2 and we have 2 HFiles,<a name="line.4081"></a>
+<span class="sourceLineNo">4082</span>      // we will have total of 4 replica of blocks on 3 datanodes; thus there<a name="line.4082"></a>
+<span class="sourceLineNo">4083</span>      // must be at least one host that have replica for 2 HFiles. That host's<a name="line.4083"></a>
+<span class="sourceLineNo">4084</span>      // weight will be equal to the unique block weight.<a name="line.4084"></a>
+<span class="sourceLineNo">4085</span>      long uniqueBlocksWeight1 = blocksDistribution1.getUniqueBlocksTotalWeight();<a name="line.4085"></a>
+<span class="sourceLineNo">4086</span>      StringBuilder sb = new StringBuilder();<a name="line.4086"></a>
+<span class="sourceLineNo">4087</span>      for (String host: blocksDistribution1.getTopHosts()) {<a name="line.4087"></a>
+<span class="sourceLineNo">4088</span>        if (sb.length() &gt; 0) sb.append(", ");<a name="line.4088"></a>
+<span class="sourceLineNo">4089</span>        sb.append(host);<a name="line.4089"></a>
+<span class="sourceLineNo">4090</span>        sb.append("=");<a name="line.4090"></a>
+<span class="sourceLineNo">4091</span>        sb.append(blocksDistribution1.getWeight(host));<a name="line.4091"></a>
+<span class="sourceLineNo">4092</span>      }<a name="line.4092"></a>
+<span class="sourceLineNo">4093</span><a name="line.4093"></a>
+<span class="sourceLineNo">4094</span>      String topHost = blocksDistribution1.getTopHosts().get(0);<a name="line.4094"></a>
+<span class="sourceLineNo">4095</span>      long topHostWeight = blocksDistribution1.getWeight(topHost);<a name="line.4095"></a>
+<span class="sourceLineNo">4096</span>      String msg = "uniqueBlocksWeight=" + uniqueBlocksWeight1 + ", topHostWeight=" +<a name="line.4096"></a>
+<span class="sourceLineNo">4097</span>        topHostWeight + ", topHost=" + topHost + "; " + sb.toString();<a name="line.4097"></a>
+<span class="sourceLineNo">4098</span>      LOG.info(msg);<a name="line.4098"></a>
+<span class="sourceLineNo">4099</span>      assertTrue(msg, uniqueBlocksWeight1 == topHostWeight);<a name="line.4099"></a>
+<span class="sourceLineNo">4100</span><a name="line.4100"></a>
+<span class="sourceLineNo">4101</span>      // use the static method to compute the value, it should be the same.<a name="line.4101"></a>
+<span class="sourceLineNo">4102</span>      // static method is used by load balancer or other components<a name="line.4102"></a>
+<span class="sourceLineNo">4103</span>      HDFSBlocksDistribution blocksDistribution2 = HRegion.computeHDFSBlocksDistribution(<a name="line.4103"></a>
+<span class="sourceLineNo">4104</span>          htu.getConfiguration(), firstRegion.getTableDescriptor(), firstRegion.getRegionInfo());<a name="line.4104"></a>
+<span class="sourceLineNo">4105</span>      long uniqueBlocksWeight2 = blocksDistribution2.getUniqueBlocksTotalWeight();<a name="line.4105"></a>
 <span class="sourceLineNo">4106</span><a name="line.4106"></a>
-<span class="sourceLineNo">4107</span>  /**<a name="line.4107"></a>
-<span class="sourceLineNo">4108</span>   * Testcase to check state of region initialization task set to ABORTED or not<a name="line.4108"></a>
-<span class="sourceLineNo">4109</span>   * if any exceptions during initialization<a name="line.4109"></a>
-<span class="sourceLineNo">4110</span>   *<a name="line.4110"></a>
-<span class="sourceLineNo">4111</span>   * @throws Exception<a name="line.4111"></a>
-<span class="sourceLineNo">4112</span>   */<a name="line.4112"></a>
-<span class="sourceLineNo">4113</span>  @Test<a name="line.4113"></a>
-<span class="sourceLineNo">4114</span>  public void testStatusSettingToAbortIfAnyExceptionDuringRegionInitilization() throws Exception {<a name="line.4114"></a>
-<span class="sourceLineNo">4115</span>    HRegionInfo info;<a name="line.4115"></a>
-<span class="sourceLineNo">4116</span>    try {<a name="line.4116"></a>
-<span class="sourceLineNo">4117</span>      FileSystem fs = Mockito.mock(FileSystem.class);<a name="line.4117"></a>
-<span class="sourceLineNo">4118</span>      Mockito.when(fs.exists((Path) Mockito.anyObject())).thenThrow(new IOException());<a name="line.4118"></a>
-<span class="sourceLineNo">4119</span>      HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.4119"></a>
-<span class="sourceLineNo">4120</span>      htd.addFamily(new HColumnDescriptor("cf"));<a name="line.4120"></a>
-<span class="sourceLineNo">4121</span>      info = new HRegionInfo(htd.getTableName(), HConstants.EMPTY_BYTE_ARRAY,<a name="line.4121"></a>
-<span class="sourceLineNo">4122</span>          HConstants.EMPTY_BYTE_ARRAY, false);<a name="line.4122"></a>
-<span class="sourceLineNo">4123</span>      Path path = new Path(dir + "testStatusSettingToAbortIfAnyExceptionDuringRegionInitilization");<a name="line.4123"></a>
-<span class="sourceLineNo">4124</span>      region = HRegion.newHRegion(path, null, fs, CONF, info, htd, null);<a name="line.4124"></a>
-<span class="sourceLineNo">4125</span>      // region initialization throws IOException and set task state to ABORTED.<a name="line.4125"></a>
-<span class="sourceLineNo">4126</span>      region.initialize();<a name="line.4126"></a>
-<span class="sourceLineNo">4127</span>      fail("Region initialization should fail due to IOException");<a name="line.4127"></a>
-<span class="sourceLineNo">4128</span>    } catch (IOException io) {<a name="line.4128"></a>
-<span class="sourceLineNo">4129</span>      List&lt;MonitoredTask&gt; tasks = TaskMonitor.get().getTasks();<a name="line.4129"></a>
-<span class="sourceLineNo">4130</span>      for (MonitoredTask monitoredTask : tasks) {<a name="line.4130"></a>
-<span class="sourceLineNo">4131</span>        if (!(monitoredTask instanceof MonitoredRPCHandler)<a name="line.4131"></a>
-<span class="sourceLineNo">4132</span>            &amp;&amp; monitoredTask.getDescription().contains(region.toString())) {<a name="line.4132"></a>
-<span class="sourceLineNo">4133</span>          assertTrue("Region state should be ABORTED.",<a name="line.4133"></a>
-<span class="sourceLineNo">4134</span>              monitoredTask.getState().equals(MonitoredTask.State.ABORTED));<a name="line.4134"></a>
-<span class="sourceLineNo">4135</span>          break;<a name="line.4135"></a>
-<span class="sourceLineNo">4136</span>        }<a name="line.4136"></a>
-<span class="sourceLineNo">4137</span>      }<a name="line.4137"></a>
-<span class="sourceLineNo">4138</span>    }<a name="line.4138"></a>
-<span class="sourceLineNo">4139</span>  }<a name="line.4139"></a>
-<span class="sourceLineNo">4140</span><a name="line.4140"></a>
-<span class="sourceLineNo">4141</span>  /**<a name="line.4141"></a>
-<span class="sourceLineNo">4142</span>   * Verifies that the .regioninfo file is written on region creation and that<a name="line.4142"></a>
-<span class="sourceLineNo">4143</span>   * is recreated if missing during region opening.<a name="line.4143"></a>
-<span class="sourceLineNo">4144</span>   */<a name="line.4144"></a>
-<span class="sourceLineNo">4145</span>  @Test<a name="line.4145"></a>
-<span class="sourceLineNo">4146</span>  public void testRegionInfoFileCreation() throws IOException {<a name="line.4146"></a>
-<span class="sourceLineNo">4147</span>    Path rootDir = new Path(dir + "testRegionInfoFileCreation");<a name="line.4147"></a>
-<span class="sourceLineNo">4148</span><a name="line.4148"></a>
-<span class="sourceLineNo">4149</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.4149"></a>
-<span class="sourceLineNo">4150</span>    htd.addFamily(new HColumnDescriptor("cf"));<a name="line.4150"></a>
-<span class="sourceLineNo">4151</span><a name="line.4151"></a>
-<span class="sourceLineNo">4152</span>    HRegionInfo hri = new HRegionInfo(htd.getTableName());<a name="line.4152"></a>
-<span class="sourceLineNo">4153</span><a name="line.4153"></a>
-<span class="sourceLineNo">4154</span>    // Create a region and skip the initialization (like CreateTableHandler)<a name="line.4154"></a>
-<span class="sourceLineNo">4155</span>    region = HBaseTestingUtility.createRegionAndWAL(hri, rootDir, CONF, htd, false);<a name="line.4155"></a>
-<span class="sourceLineNo">4156</span>    Path regionDir = region.getRegionFileSystem().getRegionDir();<a name="line.4156"></a>
-<span class="sourceLineNo">4157</span>    FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.4157"></a>
-<span class="sourceLineNo">4158</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.4158"></a>
-<span class="sourceLineNo">4159</span><a name="line.4159"></a>
-<span class="sourceLineNo">4160</span>    Path regionInfoFile = new Path(regionDir, HRegionFileSystem.REGION_INFO_FILE);<a name="line.4160"></a>
+<span class="sourceLineNo">4107</span>      assertTrue(uniqueBlocksWeight1 == uniqueBlocksWeight2);<a name="line.4107"></a>
+<span class="sourceLineNo">4108</span><a name="line.4108"></a>
+<span class="sourceLineNo">4109</span>      ht.close();<a name="line.4109"></a>
+<span class="sourceLineNo">4110</span>    } finally {<a name="line.4110"></a>
+<span class="sourceLineNo">4111</span>      if (cluster != null) {<a name="line.4111"></a>
+<span class="sourceLineNo">4112</span>        htu.shutdownMiniCluster();<a name="line.4112"></a>
+<span class="sourceLineNo">4113</span>      }<a name="line.4113"></a>
+<span class="sourceLineNo">4114</span>    }<a name="line.4114"></a>
+<span class="sourceLineNo">4115</span>  }<a name="line.4115"></a>
+<span class="sourceLineNo">4116</span><a name="line.4116"></a>
+<span class="sourceLineNo">4117</span>  /**<a name="line.4117"></a>
+<span class="sourceLineNo">4118</span>   * Testcase to check state of region initialization task set to ABORTED or not<a name="line.4118"></a>
+<span class="sourceLineNo">4119</span>   * if any exceptions during initialization<a name="line.4119"></a>
+<span class="sourceLineNo">4120</span>   *<a name="line.4120"></a>
+<span class="sourceLineNo">4121</span>   * @throws Exception<a name="line.4121"></a>
+<span class="sourceLineNo">4122</span>   */<a name="line.4122"></a>
+<span class="sourceLineNo">4123</span>  @Test<a name="line.4123"></a>
+<span class="sourceLineNo">4124</span>  public void testStatusSettingToAbortIfAnyExceptionDuringRegionInitilization() throws Exception {<a name="line.4124"></a>
+<span class="sourceLineNo">4125</span>    HRegionInfo info;<a name="line.4125"></a>
+<span class="sourceLineNo">4126</span>    try {<a name="line.4126"></a>
+<span class="sourceLineNo">4127</span>      FileSystem fs = Mockito.mock(FileSystem.class);<a name="line.4127"></a>
+<span class="sourceLineNo">4128</span>      Mockito.when(fs.exists((Path) Mockito.anyObject())).thenThrow(new IOException());<a name="line.4128"></a>
+<span class="sourceLineNo">4129</span>      HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.4129"></a>
+<span class="sourceLineNo">4130</span>      htd.addFamily(new HColumnDescriptor("cf"));<a name="line.4130"></a>
+<span class="sourceLineNo">4131</span>      info = new HRegionInfo(htd.getTableName(), HConstants.EMPTY_BYTE_ARRAY,<a name="line.4131"></a>
+<span class="sourceLineNo">4132</span>          HConstants.EMPTY_BYTE_ARRAY, false);<a name="line.4132"></a>
+<span class="sourceLineNo">4133</span>      Path path = new Path(dir + "testStatusSettingToAbortIfAnyExceptionDuringRegionInitilization");<a name="line.4133"></a>
+<span class="sourceLineNo">4134</span>      region = HRegion.newHRegion(path, null, fs, CONF, info, htd, null);<a name="line.4134"></a>
+<span class="sourceLineNo">4135</span>      // region initialization throws IOException and set task state to ABORTED.<a name="line.4135"></a>
+<span class="sourceLineNo">4136</span>      region.initialize();<a name="line.4136"></a>
+<span class="sourceLineNo">4137</span>      fail("Region initialization should fail due to IOException");<a name="line.4137"></a>
+<span class="sourceLineNo">4138</span>    } catch (IOException io) {<a name="line.4138"></a>
+<span class="sourceLineNo">4139</span>      List&lt;MonitoredTask&gt; tasks = TaskMonitor.get().getTasks();<a name="line.4139"></a>
+<span class="sourceLineNo">4140</span>      for (MonitoredTask monitoredTask : tasks) {<a name="line.4140"></a>
+<span class="sourceLineNo">4141</span>        if (!(monitoredTask instanceof MonitoredRPCHandler)<a name="line.4141"></a>
+<span class="sourceLineNo">4142</span>            &amp;&amp; monitoredTask.getDescription().contains(region.toString())) {<a name="line.4142"></a>
+<span class="sourceLineNo">4143</span>          assertTrue("Region state should be ABORTED.",<a name="line.4143"></a>
+<span class="sourceLineNo">4144</span>              monitoredTask.getState().equals(MonitoredTask.State.ABORTED));<a name="line.4144"></a>
+<span class="sourceLineNo">4145</span>          break;<a name="line.4145"></a>
+<span class="sourceLineNo">4146</span>        }<a name="line.4146"></a>
+<span class="sourceLineNo">4147</span>      }<a name="line.4147"></a>
+<span class="sourceLineNo">4148</span>    }<a name="line.4148"></a>
+<span class="sourceLineNo">4149</span>  }<a name="line.4149"></a>
+<span class="sourceLineNo">4150</span><a name="line.4150"></a>
+<span class="sourceLineNo">4151</span>  /**<a name="line.4151"></a>
+<span class="sourceLineNo">4152</span>   * Verifies that the .regioninfo file is written on region creation and that<a name="line.4152"></a>
+<span class="sourceLineNo">4153</span>   * is recreated if missing during region opening.<a name="line.4153"></a>
+<span class="sourceLineNo">4154</span>   */<a name="line.4154"></a>
+<span class="sourceLineNo">4155</span>  @Test<a name="line.4155"></a>
+<span class="sourceLineNo">4156</span>  public void testRegionInfoFileCreation() throws IOException {<a name="line.4156"></a>
+<span class="sourceLineNo">4157</span>    Path rootDir = new Path(dir + "testRegionInfoFileCreation");<a name="line.4157"></a>
+<span class="sourceLineNo">4158</span><a name="line.4158"></a>
+<span class="sourceLineNo">4159</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.4159"></a>
+<span class="sourceLineNo">4160</span>    htd.addFamily(new HColumnDescriptor("cf"));<a name="line.4160"></a>
 <span class="sourceLineNo">4161</span><a name="line.4161"></a>
-<span class="sourceLineNo">4162</span>    // Verify that the .regioninfo file is present<a name="line.4162"></a>
-<span class="sourceLineNo">4163</span>    assertTrue(HRegionFileSystem.REGION_INFO_FILE + " should be present in the region dir",<a name="line.4163"></a>
-<span class="sourceLineNo">4164</span>        fs.exists(regionInfoFile));<a name="line.4164"></a>
-<span class="sourceLineNo">4165</span><a name="line.4165"></a>
-<span class="sourceLineNo">4166</span>    // Try to open the region<a name="line.4166"></a>
-<span class="sourceLineNo">4167</span>    region = HRegion.openHRegion(rootDir, hri, htd, null, CONF);<a name="line.4167"></a>
-<span class="sourceLineNo">4168</span>    assertEquals(regionDir, region.getRegionFileSystem().getRegionDir());<a name="line.4168"></a>
-<span class="sourceLineNo">4169</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.4169"></a>
-<span class="sourceLineNo">4170</span><a name="line.4170"></a>
-<span class="sourceLineNo">4171</span>    // Verify that the .regioninfo file is still there<a name="line.4171"></a>
-<span class="sourceLineNo">4172</span>    assertTrue(HRegionFileSystem.REGION_INFO_FILE + " should be present in the region dir",<a name="line.4172"></a>
-<span class="sourceLineNo">4173</span>        fs.exists(regionInfoFile));<a name="line.4173"></a>
-<span class="sourceLineNo">4174</span><a name="line.4174"></a>
-<span class="sourceLineNo">4175</span>    // Remove the .regioninfo file and verify is recreated on region open<a name="line.4175"></a>
-<span class="sourceLineNo">4176</span>    fs.delete(regionInfoFile, true);<a name="line.4176"></a>
-<span class="sourceLineNo">4177</span>    assertFalse(HRegionFileSystem.REGION_INFO_FILE + " should be removed from the region dir",<a name="line.4177"></a>
-<span class="sourceLineNo">4178</span>        fs.exists(regionInfoFile));<a name="line.4178"></a>
-<span class="sourceLineNo">4179</span><a name="line.4179"></a>
-<span class="sourceLineNo">4180</span>    region = HRegion.openHRegion(rootDir, hri, htd, null, CONF);<a name="line.4180"></a>
-<span class="sourceLineNo">4181</span>//    region = TEST_UTIL.openHRegion(hri, htd);<a name="line.4181"></a>
-<span class="sourceLineNo">4182</span>    assertEquals(regionDir, region.getRegionFileSystem().getRegionDir());<a name="line.4182"></a>
-<span class="sourceLineNo">4183</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.4183"></a>
+<span class="sourceLineNo">4162</span>    HRegionInfo hri = new HRegionInfo(htd.getTableName());<a name="line.4162"></a>
+<span class="sourceLineNo">4163</span><a name="line.4163"></a>
+<span class="sourceLineNo">4164</span>    // Create a region and skip the initialization (like CreateTableHandler)<a name="line.4164"></a>
+<span class="sourceLineNo">4165</span>    region = HBaseTestingUtility.createRegionAndWAL(hri, rootDir, CONF, htd, false);<a name="line.4165"></a>
+<span class="sourceLineNo">4166</span>    Path regionDir = region.getRegionFileSystem().getRegionDir();<a name="line.4166"></a>
+<span class="sourceLineNo">4167</span>    FileSystem fs = region.getRegionFileSystem().getFileSystem();<a name="line.4167"></a>
+<span class="sourceLineNo">4168</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.4168"></a>
+<span class="sourceLineNo">4169</span><a name="line.4169"></a>
+<span class="sourceLineNo">4170</span>    Path regionInfoFile = new Path(regionDir, HRegionFileSystem.REGION_INFO_FILE);<a name="line.4170"></a>
+<span class="sourceLineNo">4171</span><a name="line.4171"></a>
+<span class="sourceLineNo">4172</span>    // Verify that the .regioninfo file is present<a name="line.4172"></a>
+<span class="sourceLineNo">4173</span>    assertTrue(HRegionFileSystem.REGION_INFO_FILE + " should be present in the region dir",<a name="line.4173"></a>
+<span class="sourceLineNo">4174</span>        fs.exists(regionInfoFile));<a name="line.4174"></a>
+<span class="sourceLineNo">4175</span><a name="line.4175"></a>
+<span class="sourceLineNo">4176</span>    // Try to open the region<a name="line.4176"></a>
+<span class="sourceLineNo">4177</span>    region = HRegion.openHRegion(rootDir, hri, htd, null, CONF);<a name="line.4177"></a>
+<span class="sourceLineNo">4178</span>    assertEquals(regionDir, region.getRegionFileSystem().getRegionDir());<a name="line.4178"></a>
+<span class="sourceLineNo">4179</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.4179"></a>
+<span class="sourceLineNo">4180</span><a name="line.4180"></a>
+<span class="sourceLineNo">4181</span>    // Verify that the .regioninfo file is still there<a name="line.4181"></a>
+<span class="sourceLineNo">4182</span>    assertTrue(HRegionFileSystem.REGION_INFO_FILE + " should be present in the region dir",<a name="line.4182"></a>
+<span class="sourceLineNo">4183</span>        fs.exists(regionInfoFile));<a name="line.4183"></a>
 <span class="sourceLineNo">4184</span><a name="line.4184"></a>
-<span class="sourceLineNo">4185</span>    // Verify that the .regioninfo file is still there<a name="line.4185"></a>
-<span class="sourceLineNo">4186</span>    assertTrue(HRegionFileSystem.REGION_INFO_FILE + " should be present in the region dir",<a name="line.4186"></a>
-<span class="sourceLineNo">4187</span>        fs.exists(new Path(regionDir, HRegionFileSystem.REGION_INFO_FILE)));<a name="line.4187"></a>
-<span class="sourceLineNo">4188</span><a name="line.4188"></a>
-<span class="sourceLineNo">4189</span>    region = null;<a name="line.4189"></a>
-<span class="sourceLineNo">4190</span>  }<a name="line.4190"></a>
-<span class="sourceLineNo">4191</span><a name="line.4191"></a>
-<span class="sourceLineNo">4192</span>  /**<a name="line.4192"></a>
-<span class="sourceLineNo">4193</span>   * TestCase for increment<a name="line.4193"></a>
-<span class="sourceLineNo">4194</span>   */<a name="line.4194"></a>
-<span class="sourceLineNo">4195</span>  private static class Incrementer implements Runnable {<a name="line.4195"></a>
-<span class="sourceLineNo">4196</span>    private HRegion region;<a name="line.4196"></a>
-<span class="sourceLineNo">4197</span>    private final static byte[] incRow = Bytes.toBytes("incRow");<a name="line.4197"></a>
-<span class="sourceLineNo">4198</span>    private final static byte[] family = Bytes.toBytes("family");<a name="line.4198"></a>
-<span class="sourceLineNo">4199</span>    private final static byte[] qualifier = Bytes.toBytes("qualifier");<a name="line.4199"></a>
-<span class="sourceLineNo">4200</span>    private final static long ONE = 1L;<a name="line.4200"></a>
-<span class="sourceLineNo">4201</span>    private int incCounter;<a name="line.4201"></a>
-<span class="sourceLineNo">4202</span><a name="line.4202"></a>
-<span class="sourceLineNo">4203</span>    public Incrementer(HRegion region, int incCounter) {<a name="line.4203"></a>
-<span class="sourceLineNo">4204</span>      this.region = region;<a name="line.4204"></a>
-<span class="sourceLineNo">4205</span>      this.incCounter = incCounter;<a name="line.4205"></a>
-<span class="sourceLineNo">4206</span>    }<a name="line.4206"></a>
-<span class="sourceLineNo">4207</span><a name="line.4207"></a>
-<span class="sourceLineNo">4208</span>    @Override<a name="line.4208"></a>
-<span class="sourceLineNo">4209</span>    public void run() {<a name="line.4209"></a>
-<span class="sourceLineNo">4210</span>      int count = 0;<a name="line.4210"></a>
-<span class="sourceLineNo">4211</span>      while (count &lt; incCounter) {<a name="line.4211"></a>
-<span class="sourceLineNo">4212</span>        Increment inc = new Increment(incRow);<a name="line.4212"></a>
-<span class="sourceLineNo">4213</span>        inc.addColumn(family, qualifier, ONE);<a name="line.4213"></a>
-<span class="sourceLineNo">4214</span>        count++;<a name="line.4214"></a>
-<span class="sourceLineNo">4215</span>        try {<a name="line.4215"></a>
-<span class="sourceLineNo">4216</span>          region.increment(inc);<a name="line.4216"></a>
-<span class="sourceLineNo">4217</span>        } catch (IOException e) {<a name="line.4217"></a>
-<span class="sourceLineNo">4218</span>          LOG.info("Count=" + count + ", " + e);<a name="line.4218"></a>
-<span class="sourceLineNo">4219</span>          break;<a name="line.4219"></a>
-<span class="sourceLineNo">4220</span>        }<a name="line.4220"></a>
-<span class="sourceLineNo">4221</span>      }<a name="line.4221"></a>
-<span class="sourceLineNo">4222</span>    }<a name="line.4222"></a>
-<span class="sourceLineNo">4223</span>  }<a name="line.4223"></a>
-<span class="sourceLineNo">4224</span><a name="line.4224"></a>
-<span class="sourceLineNo">4225</span>  /**<a name="line.4225"></a>
-<span class="sourceLineNo">4226</span>   * Test case to check increment function with memstore flushing<a name="line.4226"></a>
-<span class="sourceLineNo">4227</span>   * @throws Exception<a name="line.4227"></a>
-<span class="sourceLineNo">4228</span>   */<a name="line.4228"></a>
-<span class="sourceLineNo">4229</span>  @Test<a name="line.4229"></a>
-<span class="sourceLineNo">4230</span>  public void testParallelIncrementWithMemStoreFlush() throws Exception {<a name="line.4230"></a>
-<span class="sourceLineNo">4231</span>    byte[] family = Incrementer.family;<a name="line.4231"></a>
-<span class="sourceLineNo">4232</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.4232"></a>
-<span class="sourceLineNo">4233</span>    final HRegion region = this.region;<a name="line.4233"></a>
-<span class="sourceLineNo">4234</span>    final AtomicBoolean incrementDone = new AtomicBoolean(false);<a name="line.4234"></a>
-<span class="sourceLineNo">4235</span>    Runnable flusher = new Runnable() {<a name="line.4235"></a>
-<span class="sourceLineNo">4236</span>      @Override<a name="line.4236"></a>
-<span class="sourceLineNo">4237</span>      public void run() {<a name="line.4237"></a>
-<span class="sourceLineNo">4238</span>        while (!incrementDone.get()) {<a name="line.4238"></a>
-<span class="sourceLineNo">4239</span>          try {<a name="line.4239"></a>
-<span class="sourceLineNo">4240</span>            region.flush(true);<a name="line.4240"></a>
-<span class="sourceLineNo">4241</span>          } catch (Exception e) {<a name="line.4241"></a>
-<span class="sourceLineNo">4242</span>            e.printStackTrace();<a name="line.4242"></a>
-<span class="sourceLineNo">4243</span>          }<a name="line.4243"></a>
-<span class="sourceLineNo">4244</span>        }<a name="line.4244"></a>
-<span class="sourceLineNo">4245</span>      }<a name="line.4245"></a>
-<span class="sourceLineNo">4246</span>    };<a name="line.4246"></a>
-<span class="sourceLineNo">4247</span><a name="line.4247"></a>
-<span class="sourceLineNo">4248</span>    // after all increment finished, the row will increment to 20*100 = 2000<a name="line.4248"></a>
-<span class="sourceLineNo">4249</span>    int threadNum = 20;<a name="line.4249"></a>
-<span class="sourceLineNo">4250</span>    int incCounter = 100;<a name="line.4250"></a>
-<span class="sourceLineNo">4251</span>    long expected = (long) threadNum * incCounter;<a name="line.4251"></a>
-<span class="sourceLineNo">4252</span>    Thread[] incrementers = new Thread[threadNum];<a name="line.4252"></a>
-<span class="sourceLineNo">4253</span>    Thread flushThread = new Thread(flusher);<a name="line.4253"></a>
-<span class="sourceLineNo">4254</span>    for (int i = 0; i &lt; threadNum; i++) {<a name="line.4254"></a>
-<span class="sourceLineNo">4255</span>      incrementers[i] = new Thread(new Incrementer(this.region, incCounter));<a name="line.4255"></a>
-<span class="sourceLineNo">4256</span>      incrementers[i].start();<a name="line.4256"></a>
-<span class="sourceLineNo">4257</span>    }<a name="line.4257"></a>
-<span class="sourceLineNo">4258</span>    flushThread.start();<a name="line.4258"></a>
-<span class="sourceLineNo">4259</span>    for (int i = 0; i &lt; threadNum; i++) {<a name="line.4259"></a>
-<span class="sourceLineNo">4260</span>      incrementers[i].join();<a name="line.4260"></a>
-<span class="sourceLineNo">4261</span>    }<a name="line.4261"></a>
-<span class="sourceLineNo">4262</span><a name="line.4262"></a>
-<span class="sourceLineNo">4263</span>    incrementDone.set(true);<a name="line.4263"></a>
-<span class="sourceLineNo">4264</span>    flushThread.join();<a name="line.4264"></a>
-<span class="sourceLineNo">4265</span><a name="line.4265"></a>
-<span class="sourceLineNo">4266</span>    Get get = new Get(Incrementer.incRow);<a name="line.4266"></a>
-<span class="sourceLineNo">4267</span>    get.addColumn(Incrementer.family, Incrementer.qualifier);<a name="line.4267"></a>
-<span class="sourceLineNo">4268</span>    get.readVersions(1);<a name="line.4268"></a>
-<span class="sourceLineNo">4269</span>    Result res = this.region.get(get);<a name="line.4269"></a>
-<span class="sourceLineNo">4270</span>    List&lt;Cell&gt; kvs = res.getColumnCells(Incrementer.family, Incrementer.qualifier);<a name="line.4270"></a>
-<span class="sourceLineNo">4271</span><a name="line.4271"></a>
-<span class="sourceLineNo">4272</span>    // we just got the latest version<a name="line.4272"></a>
-<span class="sourceLineNo">4273</span>    assertEquals(1, kvs.size());<a name="line.4273"></a>
-<span class="sourceLineNo">4274</span>    Cell kv = kvs.get(0);<a name="line.4274"></a>
-<span class="sourceLineNo">4275</span>    assertEquals(expected, Bytes.toLong(kv.getValueArray(), kv.getValueOffset()));<a name="line.4275"></a>
-<span class="sourceLineNo">4276</span>  }<a name="line.4276"></a>
-<span class="sourceLineNo">4277</span><a name="line.4277"></a>
-<span class="sourceLineNo">4278</span>  /**<a name="line.4278"></a>
-<span class="sourceLineNo">4279</span>   * TestCase for append<a name="line.4279"></a>
-<span class="sourceLineNo">4280</span>   */<a name="line.4280"></a>
-<span class="sourceLineNo">4281</span>  private static class Appender implements Runnable {<a name="line.4281"></a>
-<span class="sourceLineNo">4282</span>    private HRegion region;<a name="line.4282"></a>
-<span class="sourceLineNo">4283</span>    private final static byte[] appendRow = Bytes.toBytes("appendRow");<a name="line.4283"></a>
-<span class="sourceLineNo">4284</span>    private final static byte[] family = Bytes.toBytes("family");<a name="line.4284"></a>
-<span class="sourceLineNo">4285</span>    private final static byte[] qualifier = Bytes.toBytes("qualifier");<a name="line.4285"></a>
-<span class="sourceLineNo">4286</span>    private final static byte[] CHAR = Bytes.toBytes("a");<a name="line.4286"></a>
-<span class="sourceLineNo">4287</span>    private int appendCounter;<a name="line.4287"></a>
-<span class="sourceLineNo">4288</span><a name="line.4288"></a>
-<span class="sourceLineNo">4289</span>    public Appender(HRegion region, int appendCounter) {<a name="line.4289"></a>
-<span class="sourceLineNo">4290</span>      this.region = region;<a name="line.4290"></a>
-<span class="sourceLineNo">4291</span>      this.appendCounter = appendCounter;<a name="line.4291"></a>
-<span class="sourceLineNo">4292</span>    }<a name="line.4292"></a>
-<span class="sourceLineNo">4293</span><a name="line.4293"></a>
-<span class="sourceLineNo">4294</span>    @Override<a name="line.4294"></a>
-<span class="sourceLineNo">4295</span>    public void run() {<a name="line.4295"></a>
-<span class="sourceLineNo">4296</span>      int count = 0;<a name="line.4296"></a>
-<span class="sourceLineNo">4297</span>      while (count &lt; appendCounter) {<a name="line.4297"></a>
-<span class="sourceLineNo">4298</span>        Append app = new Append(appendRow);<a name="line.4298"></a>
-<span class="sourceLineNo">4299</span>        app.addColumn(family, qualifier, CHAR);<a name="line.4299"></a>
-<span class="sourceLineNo">4300</span>        count++;<a name="line.4300"></a>
-<span class="sourceLineNo">4301</span>        try {<a name="line.4301"></a>
-<span class="sourceLineNo">4302</span>          region.append(app);<a name="line.4302"></a>
-<span class="sourceLineNo">4303</span>        } catch (IOException e) {<a name="line.4303"></a>
-<span class="sourceLineNo">4304</span>          LOG.info("Count=" + count + ", max=" + appendCounter + ", " + e);<a name="line.4304"></a>
-<span class="sourceLineNo">4305</span>          break;<a name="line.4305"></a>
-<span class="sourceLineNo">4306</span>        }<a name="line.4306"></a>
-<span class="sourceLineNo">4307</span>      }<a name="line.4307"></a>
-<span class="sourceLineNo">4308</span>    }<a name="line.4308"></a>
-<span class="sourceLineNo">4309</span>  }<a name="line.4309"></a>
-<span class="sourceLineNo">4310</span><a name="line.4310"></a>
-<span class="sourceLineNo">4311</span>  /**<a name="line.4311"></a>
-<span class="sourceLineNo">4312</span>   * Test case to check append function with memstore flushing<a name="line.4312"></a>
-<span class="sourceLineNo">4313</span>   * @throws Exception<a name="line.4313"></a>
-<span class="sourceLineNo">4314</span>   */<a name="line.4314"></a>
-<span class="sourceLineNo">4315</span>  @Test<a name="line.4315"></a>
-<span class="sourceLineNo">4316</span>  public void testParallelAppendWithMemStoreFlush() throws Exception {<a name="line.4316"></a>
-<span class="sourceLineNo">4317</span>    byte[] family = Appender.family;<a name="line.4317"></a>
-<span class="sourceLineNo">4318</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.4318"></a>
-<span class="sourceLineNo">4319</span>    final HRegion region = this.region;<a name="line.4319"></a>
-<span class="sourceLineNo">4320</span>    final AtomicBoolean appendDone = new AtomicBoolean(false);<a name="line.4320"></a>
-<span class="sourceLineNo">4321</span>    Runnable flusher = new Runnable() {<a name="line.4321"></a>
-<span class="sourceLineNo">4322</span>      @Override<a name="line.4322"></a>
-<span class="sourceLineNo">4323</span>      public void run() {<a name="line.4323"></a>
-<span class="sourceLineNo">4324</span>        while (!appendDone.get()) {<a name="line.4324"></a>
-<span class="sourceLineNo">4325</span>          try {<a name="line.4325"></a>
-<span class="sourceLineNo">4326</span>            region.flush(true);<a name="line.4326"></a>
-<span class="sourceLineNo">4327</span>          } catch (Exception e) {<a name="line.4327"></a>
-<span class="sourceLineNo">4328</span>            e.printStackTrace();<a name="line.4328"></a>
-<span class="sourceLineNo">4329</span>          }<a name="line.4329"></a>
-<span class="sourceLineNo">4330</span>        }<a name="line.4330"></a>
-<span class="sourceLineNo">4331</span>      }<a name="line.4331"></a>
-<span class="sourceLineNo">4332</span>    };<a name="line.4332"></a>
-<span class="sourceLineNo">4333</span><a name="line.4333"></a>
-<span class="sourceLineNo">4334</span>    // After all append finished, the value will append to threadNum *<a name="line.4334"></a>
-<span class="sourceLineNo">4335</span>    // appendCounter Appender.CHAR<a name="line.4335"></a>
-<span class="sourceLineNo">4336</span>    int threadNum = 20;<a name="line.4336"></a>
-<span class="sourceLineNo">4337</span>    int appendCounter = 100;<a name="line.4337"></a>
-<span class="sourceLineNo">4338</span>    byte[] expected = new byte[threadNum * appendCounter];<a name="line.4338"></a>
-<span class="sourceLineNo">4339</span>    for (int i = 0; i &lt; threadNum * appendCounter; i++) {<a name="line.4339"></a>
-<span class="sourceLineNo">4340</span>      System.arraycopy(Appender.CHAR, 0, expected, i, 1);<a name="line.4340"></a>
-<span class="sourceLineNo">4341</span>    }<a name="line.4341"></a>
-<span class="sourceLineNo">4342</span>    Thread[] appenders = new Thread[threadNum];<a name="line.4342"></a>
-<span class="sourceLineNo">4343</span>    Thread flushThread = new Thread(flusher);<a name="line.4343"></a>
-<span class="sourceLineNo">4344</span>    for (int i = 0; i &lt; threadNum; i++) {<a name="line.4344"></a>
-<span class="sourceLineNo">4345</span>      appenders[i] = new Thread(new Appender(this.region, appendCounter));<a name="line.4345"></a>
-<span class="sourceLineNo">4346</span>      appenders[i].start();<a name="line.4346"></a>
-<span class="sourceLineNo">4347</span>    }<a name="line.4347"></a>
-<span class="sourceLineNo">4348</span>    flushThread.start();<a name="line.4348"></a>
-<span class="sourceLineNo">4349</span>    for (int i = 0; i &lt; threadNum; i++) {<a name="line.4349"></a>
-<span class="sourceLineNo">4350</span>      appenders[i].join();<a name="line.4350"></a>
+<span class="sourceLineNo">4185</span>    // Remove the .regioninfo file and verify is recreated on region open<a name="line.4185"></a>
+<span class="sourceLineNo">4186</span>    fs.delete(regionInfoFile, true);<a name="line.4186"></a>
+<span class="sourceLineNo">4187</span>    assertFalse(HRegionFileSystem.REGION_INFO_FILE + " should be removed from the region dir",<a name="line.4187"></a>
+<span class="sourceLineNo">4188</span>        fs.exists(regionInfoFile));<a name="line.4188"></a>
+<span class="sourceLineNo">4189</span><a name="line.4189"></a>
+<span class="sourceLineNo">4190</span>    region = HRegion.openHRegion(rootDir, hri, htd, null, CONF);<a name="line.4190"></a>
+<span class="sourceLineNo">4191</span>//    region = TEST_UTIL.openHRegion(hri, htd);<a name="line.4191"></a>
+<span class="sourceLineNo">4192</span>    assertEquals(regionDir, region.getRegionFileSystem().getRegionDir());<a name="line.4192"></a>
+<span class="sourceLineNo">4193</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.4193"></a>
+<span class="sourceLineNo">4194</span><a name="line.4194"></a>
+<span class="sourceLineNo">4195</span>    // Verify that the .regioninfo file is still there<a name="line.4195"></a>
+<span class="sourceLineNo">4196</span>    assertTrue(HRegionFileSystem.REGION_INFO_FILE + " should be present in the region dir",<a name="line.4196"></a>
+<span class="sourceLineNo">4197</span>        fs.exists(new Path(regionDir, HRegionFileSystem.REGION_INFO_FILE)));<a name="line.4197"></a>
+<span class="sourceLineNo">4198</span><a name="line.4198"></a>
+<span class="sourceLineNo">4199</span>    region = null;<a name="line.4199"></a>
+<span class="sourceLineNo">4200</span>  }<a name="line.4200"></a>
+<span class="sourceLineNo">4201</span><a name="line.4201"></a>
+<span class="sourceLineNo">4202</span>  /**<a name="line.4202"></a>
+<span class="sourceLineNo">4203</span>   * TestCase for increment<a name="line.4203"></a>
+<span class="sourceLineNo">4204</span>   */<a name="line.4204"></a>
+<span class="sourceLineNo">4205</span>  private static class Incrementer implements Runnable {<a name="line.4205"></a>
+<span class="sourceLineNo">4206</span>    private HRegion region;<a name="line.4206"></a>
+<span class="sourceLineNo">4207</span>    private final static byte[] incRow = Bytes.toBytes("incRow");<a name="line.4207"></a>
+<span class="sourceLineNo">4208</span>    private final static byte[] family = Bytes.toBytes("family");<a name="line.4208"></a>
+<span class="sourceLineNo">4209</span>    private final static byte[] qualifier = Bytes.toBytes("qualifier");<a name="line.4209"></a>
+<span class="sourceLineNo">4210</span>    private final static long ONE = 1L;<a name="line.4210"></a>
+<span class="sourceLineNo">4211</span>    private int incCounter;<a name="line.4211"></a>
+<span class="sourceLineNo">4212</span><a name="line.4212"></a>
+<span class="sourceLineNo">4213</span>    public Incrementer(HRegion region, int incCounter) {<a name="line.4213"></a>
+<span class="sourceLineNo">4214</span>      this.region = region;<a name="line.4214"></a>
+<span class="sourceLineNo">4215</span>      this.incCounter = incCounter;<a name="line.4215"></a>
+<span class="sourceLineNo">4216</span>    }<a name="line.4216"></a>
+<span class="sourceLineNo">4217</span><a name="line.4217"></a>
+<span class="sourceLineNo">4218</span>    @Override<a name="line.4218"></a>
+<span class="sourceLineNo">4219</span>    public void run() {<a name="line.4219"></a>
+<span class="sourceLineNo">4220</span>      int count = 0;<a name="line.4220"></a>
+<span class="sourceLineNo">4221</span>      while (count &lt; incCounter) {<a name="line.4221"></a>
+<span class="sourceLineNo">4222</span>        Increment inc = new Increment(incRow);<a name="line.4222"></a>
+<span class="sourceLineNo">4223</span>        inc.addColumn(family, qualifier, ONE);<a name="line.4223"></a>
+<span class="sourceLineNo">4224</span>        count++;<a name="line.4224"></a>
+<span class="sourceLineNo">4225</span>        try {<a name="line.4225"></a>
+<span class="sourceLineNo">4226</span>          region.increment(inc);<a name="line.4226"></a>
+<span class="sourceLineNo">4227</span>        } catch (IOException e) {<a name="line.4227"></a>
+<span class="sourceLineNo">4228</span>          LOG.info("Count=" + count + ", " + e);<a name="line.4228"></a>
+<span class="sourceLineNo">4229</span>          break;<a name="line.4229"></a>
+<span class="sourceLineNo">4230</span>        }<a name="line.4230"></a>
+<span class="sourceLineNo">4231</span>      }<a name="line.4231"></a>
+<span class="sourceLineNo">4232</span>    }<a name="line.4232"></a>
+<span class="sourceLineNo">4233</span>  }<a name="line.4233"></a>
+<span class="sourceLineNo">4234</span><a name="line.4234"></a>
+<span class="sourceLineNo">4235</span>  /**<a name="line.4235"></a>
+<span class="sourceLineNo">4236</span>   * Test case to check increment function with memstore flushing<a name="line.4236"></a>
+<span class="sourceLineNo">4237</span>   * @throws Exception<a name="line.4237"></a>
+<span class="sourceLineNo">4238</span>   */<a name="line.4238"></a>
+<span class="sourceLineNo">4239</span>  @Test<a name="line.4239"></a>
+<span class="sourceLineNo">4240</span>  public void testParallelIncrementWithMemStoreFlush() throws Exception {<a name="line.4240"></a>
+<span class="sourceLineNo">4241</span>    byte[] family = Incrementer.family;<a name="line.4241"></a>
+<span class="sourceLineNo">4242</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.4242"></a>
+<span class="sourceLineNo">4243</span>    final HRegion region = this.region;<a name="line.4243"></a>
+<span class="sourceLineNo">4244</span>    final AtomicBoolean incrementDone = new AtomicBoolean(false);<a name="line.4244"></a>
+<span class="sourceLineNo">4245</span>    Runnable flusher = new Runnable() {<a name="line.4245"></a>
+<span class="sourceLineNo">4246</span>      @Override<a name="line.4246"></a>
+<span class="sourceLineNo">4247</span>      public void run() {<a name="line.4247"></a>
+<span class="sourceLineNo">4248</span>        while (!incrementDone.get()) {<a name="line.4248"></a>
+<span class="sourceLineNo">4249</span>          try {<a name="line.4249"></a>
+<span class="sourceLineNo">4250</span>            region.flush(true);<a name="line.4250"></a>
+<span class="sourceLineNo">4251</span>          } catch (Exception e) {<a name="line.4251"></a>
+<span class="sourceLineNo">4252</span>            e.printStackTrace();<a name="line.4252"></a>
+<span class="sourceLineNo">4253</span>          }<a name="line.4253"></a>
+<span class="sourceLineNo">4254</span>        }<a name="line.4254"></a>
+<span class="sourceLineNo">4255</span>      }<a name="line.4255"></a>
+<span class="sourceLineNo">4256</span>    };<a name="line.4256"></a>
+<span class="sourceLineNo">4257</span><a name="line.4257"></a>
+<span class="sourceLineNo">4258</span>    // after all increment finished, the row will increment to 20*100 = 2000<a name="line.4258"></a>
+<span class="sourceLineNo">4259</span>    int threadNum = 20;<a name="line.4259"></a>
+<span class="sourceLineNo">4260</span>    int incCounter = 100;<a name="line.4260"></a>
+<span class="sourceLineNo">4261</span>    long expected = (long) threadNum * incCounter;<a name="line.4261"></a>
+<span class="sourceLineNo">4262</span>    Thread[] incrementers = new Thread[threadNum];<a name="line.4262"></a>
+<span class="sourceLineNo">4263</span>    Thread flushThread = new Thread(flusher);<a name="line.4263"></a>
+<span class="sourceLineNo">4264</span>    for (int i = 0; i &lt; threadNum; i++) {<a name="line.4264"></a>
+<span class="sourceLineNo">4265</span>      incrementers[i] = new Thread(new Incrementer(this.region, incCounter));<a name="line.4265"></a>
+<span class="sourceLineNo">4266</span>      incrementers[i].start();<a name="line.4266"></a>
+<span class="sourceLineNo">4267</span>    }<a name="line.4267"></a>
+<span class="sourceLineNo">4268</span>    flushThread.start();<a name="line.4268"></a>
+<span class="sourceLineNo">4269</span>    for (int i = 0; i &lt; threadNum; i++) {<a name="line.4269"></a>
+<span class="sourceLineNo">4270</span>      incrementers[i].join();<a name="line.4270"></a>
+<span class="sourceLineNo">4271</span>    }<a name="line.4271"></a>
+<span class="sourceLineNo">4272</span><a name="line.4272"></a>
+<span class="sourceLineNo">4273</span>    incrementDone.set(true);<a name="line.4273"></a>
+<span class="sourceLineNo">4274</span>    flushThread.join();<a name="line.4274"></a>
+<span class="sourceLineNo">4275</span><a name="line.4275"></a>
+<span class="sourceLineNo">4276</span>    Get get = new Get(Incrementer.incRow);<a name="line.4276"></a>
+<span class="sourceLineNo">4277</span>    get.addColumn(Incrementer.family, Incrementer.qualifier);<a name="line.4277"></a>
+<span class="sourceLineNo">4278</span>    get.readVersions(1);<a name="line.4278"></a>
+<span class="sourceLineNo">4279</span>    Result res = this.region.get(get);<a name="line.4279"></a>
+<span class="sourceLineNo">4280</span>    List&lt;Cell&gt; kvs = res.getColumnCells(Incrementer.family, Incrementer.qualifier);<a name="line.4280"></a>
+<span class="sourceLineNo">4281</span><a name="line.4281"></a>
+<span class="sourceLineNo">4282</span>    // we just got the latest version<a name="line.4282"></a>
+<span class="sourceLineNo">4283</span>    assertEquals(1, kvs.size());<a name="line.4283"></a>
+<span class="sourceLineNo">4284</span>    Cell kv = kvs.get(0);<a name="line.4284"></a>
+<span class="sourceLineNo">4285</span>    assertEquals(expected, Bytes.toLong(kv.getValueArray(), kv.getValueOffset()));<a name="line.4285"></a>
+<span class="sourceLineNo">4286</span>  }<a name="line.4286"></a>
+<span class="sourceLineNo">4287</span><a name="line.4287"></a>
+<span class="sourceLineNo">4288</span>  /**<a name="line.4288"></a>
+<span class="sourceLineNo">4289</span>   * TestCase for append<a name="line.4289"></a>
+<span class="sourceLineNo">4290</span>   */<a name="line.4290"></a>
+<span class="sourceLineNo">4291</span>  private static class Appender implements Runnable {<a name="line.4291"></a>
+<span class="sourceLineNo">4292</span>    private HRegion region;<a name="line.4292"></a>
+<span class="sourceLineNo">4293</span>    private final static byte[] appendRow = Bytes.toBytes("appendRow");<a name="line.4293"></a>
+<span class="sourceLineNo">4294</span>    private final static byte[] family = Bytes.toBytes("family");<a name="line.4294"></a>
+<span class="sourceLineNo">4295</span>    private final static byte[] qualifier = Bytes.toBytes("qualifier");<a name="line.4295"></a>
+<span class="sourceLineNo">4296</span>    private final static byte[] CHAR = Bytes.toBytes("a");<a name="line.4296"></a>
+<span class="sourceLineNo">4297</span>    private int appendCounter;<a name="line.4297"></a>
+<span class="sourceLineNo">4298</span><a name="line.4298"></a>
+<span class="sourceLineNo">4299</span>    public Appender(HRegion region, int appendCounter) {<a name="line.4299"></a>
+<span class="sourceLineNo">4300</span>      this.region = region;<a name="line.4300"></a>
+<span class="sourceLineNo">4301</span>      this.appendCounter = appendCounter;<a name="line.4301"></a>
+<span class="sourceLineNo">4302</span>    }<a name="line.4302"></a>
+<span class="sourceLineNo">4303</span><a name="line.4303"></a>
+<span class="sourceLineNo">4304</span>    @Override<a name="line.4304"></a>
+<span class="sourceLineNo">4305</span>    public void run() {<a name="line.4305"></a>
+<span class="sourceLineNo">4306</span>      int count = 0;<a name="line.4306"></a>
+<span class="sourceLineNo">4307</span>      while (count &lt; appendCounter) {<a name="line.4307"></a>
+<span class="sourceLineNo">4308</span>        Append app = new Append(appendRow);<a name="line.4308"></a>
+<span class="sourceLineNo">4309</span>        app.addColumn(family, qualifier, CHAR);<a name="line.4309"></a>
+<span class="sourceLineNo">4310</span>        count++;<a name="line.4310"></a>
+<span class="sourceLineNo">4311</span>        try {<a name="line.4311"></a>
+<span class="sourceLineNo">4312</span>          region.append(app);<a name="line.4312"></a>
+<span class="sourceLineNo">4313</span>        } catch (IOException e) {<a name="line.4313"></a>
+<span class="sourceLineNo">4314</span>          LOG.info("Count=" + count + ", max=" + appendCounter + ", " + e);<a name="line.4314"></a>
+<span class="sourceLineNo">4315</span>          break;<a name="line.4315"></a>
+<span class="sourceLineNo">4316</span>        }<a name="line.4316"></a>
+<span class="sourceLineNo">4317</span>      }<a name="line.4317"></a>
+<span class="sourceLineNo">4318</span>    }<a name="line.4318"></a>
+<span class="sourceLineNo">4319</span>  }<a name="line.4319"></a>
+<span class="sourceLineNo">4320</span><a name="line.4320"></a>
+<span class="sourceLineNo">4321</span>  /**<a name="line.4321"></a>
+<span class="sourceLineNo">4322</span>   * Test case to check append function with memstore flushing<a name="line.4322"></a>
+<span class="sourceLineNo">4323</span>   * @throws Exception<a name="line.4323"></a>
+<span class="sourceLineNo">4324</span>   */<a name="line.4324"></a>
+<span class="sourceLineNo">4325</span>  @Test<a name="line.4325"></a>
+<span class="sourceLineNo">4326</span>  public void testParallelAppendWithMemStoreFlush() throws Exception {<a name="line.4326"></a>
+<span class="sourceLineNo">4327</span>    byte[] family = Appender.family;<a name="line.4327"></a>
+<span class="sourceLineNo">4328</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.4328"></a>
+<span class="sourceLineNo">4329</span>    final HRegion region = this.region;<a name="line.4329"></a>
+<span class="sourceLineNo">4330</span>    final AtomicBoolean appendDone = new AtomicBoolean(false);<a name="line.4330"></a>
+<span class="sourceLineNo">4331</span>    Runnable flusher = new Runnable() {<a name="line.4331"></a>
+<span class="sourceLineNo">4332</span>      @Override<a name="line.4332"></a>
+<span class="sourceLineNo">4333</span>      public void run() {<a name="line.4333"></a>
+<span class="sourceLineNo">4334</span>        while (!appendDone.get()) {<a name="line.4334"></a>
+<span class="sourceLineNo">4335</span>          try {<a name="line.4335"></a>
+<span class="sourceLineNo">4336</span>            region.flush(true);<a name="line.4336"></a>
+<span class="sourceLineNo">4337</span>          } catch (Exception e) {<a name="line.4337"></a>
+<span class="sourceLineNo">4338</span>            e.printStackTrace();<a name="line.4338"></a>
+<span class="sourceLineNo">4339</span>          }<a name="line.4339"></a>
+<span class="sourceLineNo">4340</span>        }<a name="line.4340"></a>
+<span class="sourceLineNo">4341</span>      }<a name="line.4341"></a>
+<span class="sourceLineNo">4342</span>    };<a name="line.4342"></a>
+<span class="sourceLineNo">4343</span><a name="line.4343"></a>
+<span class="sourceLineNo">4344</span>    // After all append finished, the value will append to threadNum *<a name="line.4344"></a>
+<span class="sourceLineNo">4345</span>    // appendCounter Appender.CHAR<a name="line.4345"></a>
+<span class="sourceLineNo">4346</span>    int threadNum = 20;<a name="line.4346"></a>
+<span class="sourceLineNo">4347</span>    int appendCounter = 100;<a name="line.4347"></a>
+<span class="sourceLineNo">4348</span>    byte[] expected = new byte[threadNum * appendCounter];<a name="line.4348"></a>
+<span class="sourceLineNo">4349</span>    for (int i = 0; i &lt; threadNum * appendCounter; i++) {<a name="line.4349"></a>
+<span class="sourceLineNo">4350</span>      System.arraycopy(Appender.CHAR, 0, expected, i, 1);<a name="line.4350"></a>
 <span class="sourceLineNo">4351</span>    }<a name="line.4351"></a>
-<span class="sourceLineNo">4352</span><a name="line.4352"></a>
-<span class="sourceLineNo">4353</span>    appendDone.set(true);<a name="line.4353"></a>
-<span class="sourceLineNo">4354</span>    flushThread.join();<a name="line.4354"></a>
-<span class="sourceLineNo">4355</span><a name="line.4355"></a>
-<span class="sourceLineNo">4356</span>    Get get = new Get(Appender.appendRow);<a name="line.4356"></a>
-<span class="sourceLineNo">4357</span>    get.addColumn(Appender.family, Appender.qualifier);<a name="line.4357"></a>
-<span class="sourceLineNo">4358</span>    get.readVersions(1);<a name="line.4358"></a>
-<span class="sourceLineNo">4359</span>    Result res = this.region.get(get);<a name="line.4359"></a>
-<span class="sourceLineNo">4360</span>    List&lt;Cell&gt; kvs = res.getColumnCells(Appender.family, Appender.qualifier);<a name="line.4360"></a>
-<span class="sourceLineNo">4361</span><a name="line.4361"></a>
-<span class="sourceLineNo">4362</span>    // we just got the latest version<a name="line.4362"></a>
-<span class="sourceLineNo">4363</span>    assertEquals(1, kvs.size());<a name="line.4363"></a>
-<span class="sourceLineNo">4364</span>    Cell kv = kvs.get(0);<a name="line.4364"></a>
-<span class="sourceLineNo">4365</span>    byte[] appendResult = new byte[kv.getValueLength()];<a name="line.4365"></a>
-<span class="sourceLineNo">4366</span>    System.arraycopy(kv.getValueArray(), kv.getValueOffset(), appendResult, 0, kv.getValueLength());<a name="line.4366"></a>
-<span class="sourceLineNo">4367</span>    assertArrayEquals(expected, appendResult);<a name="line.4367"></a>
-<span class="sourceLineNo">4368</span>  }<a name="line.4368"></a>
-<span class="sourceLineNo">4369</span><a name="line.4369"></a>
-<span class="sourceLineNo">4370</span>  /**<a name="line.4370"></a>
-<span class="sourceLineNo">4371</span>   * Test case to check put function with memstore flushing for same row, same ts<a name="line.4371"></a>
-<span class="sourceLineNo">4372</span>   * @throws Exception<a name="line.4372"></a>
-<span class="sourceLineNo">4373</span>   */<a name="line.4373"></a>
-<span class="sourceLineNo">4374</span>  @Test<a name="line.4374"></a>
-<span class="sourceLineNo">4375</span>  public void testPutWithMemStoreFlush() throws Exception {<a name="line.4375"></a>
-<span class="sourceLineNo">4376</span>    byte[] family = Bytes.toBytes("family");<a name="line.4376"></a>
-<span class="sourceLineNo">4377</span>    byte[] qualifier = Bytes.toBytes("qualifier");<a name="line.4377"></a>
-<span class="sourceLineNo">4378</span>    byte[] row = Bytes.toBytes("putRow");<a name="line.4378"></a>
-<span class="sourceLineNo">4379</span>    byte[] value = null;<a name="line.4379"></a>
-<span class="sourceLineNo">4380</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.4380"></a>
-<span class="sourceLineNo">4381</span>    Put put = null;<a name="line.4381"></a>
-<span class="sourceLineNo">4382</span>    Get get = null;<a name="line.4382"></a>
-<span class="sourceLineNo">4383</span>    List&lt;Cell&gt; kvs = null;<a name="line.4383"></a>
-<span class="sourceLineNo">4384</span>    Result res = null;<a name="line.4384"></a>
-<span class="sourceLineNo">4385</span><a name="line.4385"></a>
-<span class="sourceLineNo">4386</span>    put = new Put(row);<a name="line.4386"></a>
-<span class="sourceLineNo">4387</span>    value = Bytes.toBytes("value0");<a name="line.4387"></a>
-<span class="sourceLineNo">4388</span>    put.addColumn(family, qualifier, 1234567L, value);<a name="line.4388"></a>
-<span class="sourceLineNo">4389</span>    region.put(put);<a name="line.4389"></a>
-<span class="sourceLineNo">4390</span>    get = new Get(row);<a name="line.4390"></a>
-<span class="sourceLineNo">4391</span>    get.addColumn(family, qualifier);<a name="line.4391"></a>
-<span class="sourceLineNo">4392</span>    get.readAllVersions();<a name="line.4392"></a>
-<span class="sourceLineNo">4393</span>    res = this.region.get(get);<a name="line.4393"></a>
-<span class="sourceLineNo">4394</span>    kvs = res.getColumnCells(family, qualifier);<a name="line.4394"></a>
-<span class="sourceLineNo">4395</span>    assertEquals(1, kvs.size());<a name="line.4395"></a>
-<span class="sourceLineNo">4396</span>    assertArrayEquals(Bytes.toBytes("value0"), CellUtil.cloneValue(kvs.get(0)));<a name="line.4396"></a>
-<span class="sourceLineNo">4397</span><a name="line.4397"></a>
-<span class="sourceLineNo">4398</span>    region.flush(true);<a name="line.4398"></a>
-<span class="sourceLineNo">4399</span>    get = new Get(row);<a name="line.4399"></a>
-<span class="sourceLineNo">4400</span>    get.addColumn(family, qualifier);<a name="line.4400"></a>
-<span class="sourceLineNo">4401</span>    get.readAllVersions();<a name="line.4401"></a>
-<span class="sourceLineNo">4402</span>    res = this.region.get(get);<a name="line.4402"></a>
-<span class="sourceLineNo">4403</span>    kvs = res.getColumnCells(family, qualifier);<a name="line.4403"></a>
-<span class="sourceLineNo">4404</span>    assertEquals(1, kvs.size());<a name="line.4404"></a>
-<span class="sourceLineNo">4405</span>    assertArrayEquals(Bytes.toBytes("value0"), CellUtil.cloneValue(kvs.get(0)));<a name="line.4405"></a>
-<span class="sourceLineNo">4406</span><a name="line.4406"></a>
-<span class="sourceLineNo">4407</span>    put = new Put(row);<a name="line.4407"></a>
-<span class="sourceLineNo">4408</span>    value = Bytes.toBytes("value1");<a name="line.4408"></a>
-<span class="sourceLineNo">4409</span>    put.addColumn(family, qualifier, 1234567L, value);<a name="line.4409"></a>
-<span class="sourceLineNo">4410</span>    region.put(put);<a name="line.4410"></a>
-<span class="sourceLineNo">4411</span>    get = new Get(row);<a name="line.4411"></a>
-<span class="sourceLineNo">4412</span>    get.addColumn(family, qualifier);<a name="line.4412"></a>
-<span class="sourceLineNo">4413</span>    get.readAllVersions();<a name="line.4413"></a>
-<span class="sourceLineNo">4414</span>    res = this.region.get(get);<a name="line.4414"></a>
-<span class="sourceLineNo">4415</span>    kvs = res.getColumnCells(family, qualifier);<a name="line.4415"></a>
-<span class="sourceLineNo">4416</span>    assertEquals(1, kvs.size());<a name="line.4416"></a>
-<span class="sourceLineNo">4417</span>    assertArrayEquals(Bytes.toBytes("value1"), CellUtil.cloneValue(kvs.get(0)));<a name="line.4417"></a>
-<span class="sourceLineNo">4418</span><a name="line.4418"></a>
-<span class="sourceLineNo">4419</span>    region.flush(true);<a name="line.4419"></a>
-<span class="sourceLineNo">4420</span>    get = new Get(row);<a name="line.4420"></a>
-<span class="sourceLineNo">4421</span>    get.addColumn(family, qualifier);<a name="line.4421"></a>
-<span class="sourceLineNo">4422</span>    get.readAllVersions();<a name="line.4422"></a>
-<span class="sourceLineNo">4423</span>    res = this.region.get(get);<a name="line.4423"></a>
-<span class="sourceLineNo">4424</span>    kvs = res.getColumnCells(family, qualifier);<a name="line.4424"></a>
-<span class="sourceLineNo">4425</span>    assertEquals(1, kvs.size());<a name="line.4425"></a>
-<span class="sourceLineNo">4426</span>    assertArrayEquals(Bytes.toBytes("value1"), CellUtil.cloneValue(kvs.get(0)));<a name="line.4426"></a>
-<span class="sourceLineNo">4427</span>  }<a name="line.4427"></a>
+<span class="sourceLineNo">4352</span>    Thread[] appenders = new Thread[threadNum];<a name="line.4352"></a>
+<span class="sourceLineNo">4353</span>    Thread flushThread = new Thread(flusher);<a name="line.4353"></a>
+<span class="sourceLineNo">4354</span>    for (int i = 0; i &lt; threadNum; i++) {<a name="line.4354"></a>
+<span class="sourceLineNo">4355</span>      appenders[i] = new Thread(new Appender(this.region, appendCounter));<a name="line.4355"></a>
+<span class="sourceLineNo">4356</span>      appenders[i].start();<a name="line.4356"></a>
+<span class="sourceLineNo">4357</span>    }<a name="line.4357"></a>
+<span class="sourceLineNo">4358</span>    flushThread.start();<a name="line.4358"></a>
+<span class="sourceLineNo">4359</span>    for (int i = 0; i &lt; threadNum; i++) {<a name="line.4359"></a>
+<span class="sourceLineNo">4360</span>      appenders[i].join();<a name="line.4360"></a>
+<span class="sourceLineNo">4361</span>    }<a name="line.4361"></a>
+<span class="sourceLineNo">4362</span><a name="line.4362"></a>
+<span class="sourceLineNo">4363</span>    appendDone.set(true);<a name="line.4363"></a>
+<span class="sourceLineNo">4364</span>    flushThread.join();<a name="line.4364"></a>
+<span class="sourceLineNo">4365</span><a name="line.4365"></a>
+<span class="sourceLineNo">4366</span>    Get get = new Get(Appender.appendRow);<a name="line.4366"></a>
+<span class="sourceLineNo">4367</span>    get.addColumn(Appender.family, Appender.qualifier);<a name="line.4367"></a>
+<span class="sourceLineNo">4368</span>    get.readVersions(1);<a name="line.4368"></a>
+<span class="sourceLineNo">4369</span>    Result res = this.region.get(get);<a name="line.4369"></a>
+<span class="sourceLineNo">4370</span>    List&lt;Cell&gt; kvs = res.getColumnCells(Appender.family, Appender.qualifier);<a name="line.4370"></a>
+<span class="sourceLineNo">4371</span><a name="line.4371"></a>
+<span class="sourceLineNo">4372</span>    // we just got the latest version<a name="line.4372"></a>
+<span class="sourceLineNo">4373</span>    assertEquals(1, kvs.size());<a name="line.4373"></a>
+<span class="sourceLineNo">4374</span>    Cell kv = kvs.get(0);<a name="line.4374"></a>
+<span class="sourceLineNo">4375</span>    byte[] appendResult = new byte[kv.getValueLength()];<a name="line.4375"></a>
+<span class="sourceLineNo">4376</span>    System.arraycopy(kv.getValueArray(), kv.getValueOffset(), appendResult, 0, kv.getValueLength());<a name="line.4376"></a>
+<span class="sourceLineNo">4377</span>    assertArrayEquals(expected, appendResult);<a name="line.4377"></a>
+<span class="sourceLineNo">4378</span>  }<a name="line.4378"></a>
+<span class="sourceLineNo">4379</span><a name="line.4379"></a>
+<span class="sourceLineNo">4380</span>  /**<a name="line.4380"></a>
+<span class="sourceLineNo">4381</span>   * Test case to check put function with memstore flushing for same row, same ts<a name="line.4381"></a>
+<span class="sourceLineNo">4382</span>   * @throws Exception<a name="line.4382"></a>
+<span class="sourceLineNo">4383</span>   */<a name="line.4383"></a>
+<span class="sourceLineNo">4384</span>  @Test<a name="line.4384"></a>
+<span class="sourceLineNo">4385</span>  public void testPutWithMemStoreFlush() throws Exception {<a name="line.4385"></a>
+<span class="sourceLineNo">4386</span>    byte[] family = Bytes.toBytes("family");<a name="line.4386"></a>
+<span class="sourceLineNo">4387</span>    byte[] qualifier = Bytes.toBytes("qualifier");<a name="line.4387"></a>
+<span class="sourceLineNo">4388</span>    byte[] row = Bytes.toBytes("putRow");<a name="line.4388"></a>
+<span class="sourceLineNo">4389</span>    byte[] value = null;<a name="line.4389"></a>
+<span class="sourceLineNo">4390</span>    this.region = initHRegion(tableName, method, CONF, family);<a name="line.4390"></a>
+<span class="sourceLineNo">4391</span>    Put put = null;<a name="line.4391"></a>
+<span class="sourceLineNo">4392</span>    Get get = null;<a name="line.4392"></a>
+<span class="sourceLineNo">4393</span>    List&lt;Cell&gt; kvs = null;<a name="line.4393"></a>
+<span class="sourceLineNo">4394</span>    Result res = null;<a name="line.4394"></a>
+<span class="sourceLineNo">4395</span><a name="line.4395"></a>
+<span class="sourceLineNo">4396</span>    put = new Put(row);<a name="line.4396"></a>
+<span class="sourceLineNo">4397</span>    value = Bytes.toBytes("value0");<a name="line.4397"></a>
+<span class="sourceLineNo">4398</span>    put.addColumn(family, qualifier, 1234567L, value);<a name="line.4398"></a>
+<span class="sourceLineNo">4399</span>    region.put(put);<a name="line.4399"></a>
+<span class="sourceLineNo">4400</span>    get = new Get(row);<a name="line.4400"></a>
+<span class="sourceLineNo">4401</span>    get.addColumn(family, qualifier);<a name="line.4401"></a>
+<span class="sourceLineNo">4402</span>    get.readAllVersions();<a name="line.4402"></a>
+<span class="sourceLineNo">4403</span>    res = this.region.get(get);<a name="line.4403"></a>
+<span class="sourceLineNo">4404</span>    kvs = res.getColumnCells(family, qualifier);<a name="line.4404"></a>
+<span class="sourceLineNo">4405</span>    assertEquals(1, kvs.size());<a name="line.4405"></a>
+<span class="sourceLineNo">4406</span>    assertArrayEquals(Bytes.toBytes("value0"), CellUtil.cloneValue(kvs.get(0)));<a name="line.4406"></a>
+<span class="sourceLineNo">4407</span><a name="line.4407"></a>
+<span class="sourceLineNo">4408</span>    region.flush(true);<a name="line.4408"></a>
+<span class="sourceLineNo">4409</span>    get = new Get(row);<a name="line.4409"></a>
+<span class="sourceLineNo">4410</span>    get.addColumn(family, qualifier);<a name="line.4410"></a>
+<span class="sourceLineNo">4411</span>    get.readAllVersions();<a name="line.4411"></a>
+<span class="sourceLineNo">4412</span>    res = this.region.get(get);<a name="line.4412"></a>
+<span class="sourceLineNo">4413</span>    kvs = res.getColumnCells(family, qualifier);<a name="line.4413"></a>
+<span class="sourceLineNo">4414</span>    assertEquals(1, kvs.size());<a name="line.4414"></a>
+<span class="sourceLineNo">4415</span>    assertArrayEquals(Bytes.toBytes("value0"), CellUtil.cloneValue(kvs.get(0)));<a name="line.4415"></a>
+<span class="sourceLineNo">4416</span><a name="line.4416"></a>
+<span class="sourceLineNo">4417</span>    put = new Put(row);<a name="line.4417"></a>
+<span class="sourceLineNo">4418</span>    value = Bytes.toBytes("value1");<a name="line.4418"></a>
+<span class="sourceLineNo">4419</span>    put.addColumn(family, qualifier, 1234567L, value);<a name="line.4419"></a>
+<span class="sourceLineNo">4420</span>    region.put(put);<a name="line.4420"></a>
+<span class="sourceLineNo">4421</span>    get = new Get(row);<a name="line.4421"></a>
+<span class="sourceLineNo">4422</span>    get.addColumn(family, qualifier);<a name="line.4422"></a>
+<span class="sourceLineNo">4423</span>    get.readAllVersions();<a name="line.4423"></a>
+<span class="sourceLineNo">4424</span>    res = this.region.get(get);<a name="line.4424"></a>
+<span class="sourceLineNo">4425</span>    kvs = res.getColumnCells(family, qualifier);<a name="line.4425"></a>
+<span class="sourceLineNo">4426</span>    assertEquals(1, kvs.size());<a name="line.4426"></a>
+<span class="sourceLineNo">4427</span>    assertArrayEquals(Bytes.toBytes("value1"), CellUtil.cloneValue(kvs.get(0)));<a name="line.4427"></a>
 <span class="sourceLineNo">4428</span><a name="line.4428"></a>
-<span class="sourceLineNo">4429</span>  @Test<a name="line.4429"></a>
-<span class="sourceLineNo">4430</span>  public void testDurability() throws Exception {<a name="line.4430"></a>
-<span class="sourceLineNo">4431</span>    // there are 5 x 5 cases:<a name="line.4431"></a>
-<span class="sourceLineNo">4432</span>    // table durability(SYNC,FSYNC,ASYC,SKIP,USE_DEFAULT) x mutation<a name="line.4432"></a>
-<span class="sourceLineNo">4433</span>    // durability(SYNC,FSYNC,ASYC,SKIP,USE_DEFAULT)<a name="line.4433"></a>
-<span class="sourceLineNo">4434</span><a name="line.4434"></a>
-<span class="sourceLineNo">4435</span>    // expected cases for append and sync wal<a name="line.4435"></a>
-<span class="sourceLineNo">4436</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4436"></a>
-<span class="sourceLineNo">4437</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4437"></a>
-<span class="sourceLineNo">4438</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.USE_DEFAULT, 0, true, true, false);<a name="line.4438"></a>
-<span class="sourceLineNo">4439</span><a name="line.4439"></a>
-<span class="sourceLineNo">4440</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4440"></a>
-<span class="sourceLineNo">4441</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4441"></a>
-<span class="sourceLineNo">4442</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.USE_DEFAULT, 0, true, true, false);<a name="line.4442"></a>
-<span class="sourceLineNo">4443</span><a name="line.4443"></a>
-<span class="sourceLineNo">4444</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4444"></a>
-<span class="sourceLineNo">4445</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4445"></a>
-<span class="sourceLineNo">4446</span><a name="line.4446"></a>
-<span class="sourceLineNo">4447</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4447"></a>
-<span class="sourceLineNo">4448</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4448"></a>
+<span class="sourceLineNo">4429</span>    region.flush(true);<a name="line.4429"></a>
+<span class="sourceLineNo">4430</span>    get = new Get(row);<a name="line.4430"></a>
+<span class="sourceLineNo">4431</span>    get.addColumn(family, qualifier);<a name="line.4431"></a>
+<span class="sourceLineNo">4432</span>    get.readAllVersions();<a name="line.4432"></a>
+<span class="sourceLineNo">4433</span>    res = this.region.get(get);<a name="line.4433"></a>
+<span class="sourceLineNo">4434</span>    kvs = res.getColumnCells(family, qualifier);<a name="line.4434"></a>
+<span class="sourceLineNo">4435</span>    assertEquals(1, kvs.size());<a name="line.4435"></a>
+<span class="sourceLineNo">4436</span>    assertArrayEquals(Bytes.toBytes("value1"), CellUtil.cloneValue(kvs.get(0)));<a name="line.4436"></a>
+<span class="sourceLineNo">4437</span>  }<a name="line.4437"></a>
+<span class="sourceLineNo">4438</span><a name="line.4438"></a>
+<span class="sourceLineNo">4439</span>  @Test<a name="line.4439"></a>
+<span class="sourceLineNo">4440</span>  public void testDurability() throws Exception {<a name="line.4440"></a>
+<span class="sourceLineNo">4441</span>    // there are 5 x 5 cases:<a name="line.4441"></a>
+<span class="sourceLineNo">4442</span>    // table durability(SYNC,FSYNC,ASYC,SKIP,USE_DEFAULT) x mutation<a name="line.4442"></a>
+<span class="sourceLineNo">4443</span>    // durability(SYNC,FSYNC,ASYC,SKIP,USE_DEFAULT)<a name="line.4443"></a>
+<span class="sourceLineNo">4444</span><a name="line.4444"></a>
+<span class="sourceLineNo">4445</span>    // expected cases for append and sync wal<a name="line.4445"></a>
+<span class="sourceLineNo">4446</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4446"></a>
+<span class="sourceLineNo">4447</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4447"></a>
+<span class="sourceLineNo">4448</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.USE_DEFAULT, 0, true, true, false);<a name="line.4448"></a>
 <span class="sourceLineNo">4449</span><a name="line.4449"></a>
-<span class="sourceLineNo">4450</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4450"></a>
-<span class="sourceLineNo">4451</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4451"></a>
-<span class="sourceLineNo">4452</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.USE_DEFAULT, 0, true, true, false);<a name="line.4452"></a>
+<span class="sourceLineNo">4450</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4450"></a>
+<span class="sourceLineNo">4451</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4451"></a>
+<span class="sourceLineNo">4452</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.USE_DEFAULT, 0, true, true, false);<a name="line.4452"></a>
 <span class="sourceLineNo">4453</span><a name="line.4453"></a>
-<span class="sourceLineNo">4454</span>    // expected cases for async wal<a name="line.4454"></a>
-<span class="sourceLineNo">4455</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4455"></a>
-<span class="sourceLineNo">4456</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4456"></a>
-<span class="sourceLineNo">4457</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4457"></a>
-<span class="sourceLineNo">4458</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4458"></a>
-<span class="sourceLineNo">4459</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4459"></a>
-<span class="sourceLineNo">4460</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.USE_DEFAULT, 0, true, false, false);<a name="line.4460"></a>
-<span class="sourceLineNo">4461</span><a name="line.4461"></a>
-<span class="sourceLineNo">4462</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4462"></a>
-<span class="sourceLineNo">4463</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4463"></a>
-<span class="sourceLineNo">4464</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4464"></a>
-<span class="sourceLineNo">4465</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4465"></a>
-<span class="sourceLineNo">4466</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4466"></a>
-<span class="sourceLineNo">4467</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.USE_DEFAULT, 5000, true, false, true);<a name="line.4467"></a>
-<span class="sourceLineNo">4468</span><a name="line.4468"></a>
-<span class="sourceLineNo">4469</span>    // expect skip wal cases<a name="line.4469"></a>
-<span class="sourceLineNo">4470</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4470"></a>
-<span class="sourceLineNo">4471</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4471"></a>
-<span class="sourceLineNo">4472</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4472"></a>
-<span class="sourceLineNo">4473</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4473"></a>
-<span class="sourceLineNo">4474</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4474"></a>
-<span class="sourceLineNo">4475</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.USE_DEFAULT, 0, false, false, false);<a name="line.4475"></a>
-<span class="sourceLineNo">4476</span><a name="line.4476"></a>
-<span class="sourceLineNo">4477</span>  }<a name="line.4477"></a>
+<span class="sourceLineNo">4454</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4454"></a>
+<span class="sourceLineNo">4455</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4455"></a>
+<span class="sourceLineNo">4456</span><a name="line.4456"></a>
+<span class="sourceLineNo">4457</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4457"></a>
+<span class="sourceLineNo">4458</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4458"></a>
+<span class="sourceLineNo">4459</span><a name="line.4459"></a>
+<span class="sourceLineNo">4460</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.SYNC_WAL, 0, true, true, false);<a name="line.4460"></a>
+<span class="sourceLineNo">4461</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.FSYNC_WAL, 0, true, true, false);<a name="line.4461"></a>
+<span class="sourceLineNo">4462</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.USE_DEFAULT, 0, true, true, false);<a name="line.4462"></a>
+<span class="sourceLineNo">4463</span><a name="line.4463"></a>
+<span class="sourceLineNo">4464</span>    // expected cases for async wal<a name="line.4464"></a>
+<span class="sourceLineNo">4465</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4465"></a>
+<span class="sourceLineNo">4466</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4466"></a>
+<span class="sourceLineNo">4467</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4467"></a>
+<span class="sourceLineNo">4468</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4468"></a>
+<span class="sourceLineNo">4469</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.ASYNC_WAL, 0, true, false, false);<a name="line.4469"></a>
+<span class="sourceLineNo">4470</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.USE_DEFAULT, 0, true, false, false);<a name="line.4470"></a>
+<span class="sourceLineNo">4471</span><a name="line.4471"></a>
+<span class="sourceLineNo">4472</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4472"></a>
+<span class="sourceLineNo">4473</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4473"></a>
+<span class="sourceLineNo">4474</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4474"></a>
+<span class="sourceLineNo">4475</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4475"></a>
+<span class="sourceLineNo">4476</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.ASYNC_WAL, 5000, true, false, true);<a name="line.4476"></a>
+<span class="sourceLineNo">4477</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.USE_DEFAULT, 5000, true, false, true);<a name="line.4477"></a>
 <span class="sourceLineNo">4478</span><a name="line.4478"></a>
-<span class="sourceLineNo">4479</span>  private void durabilityTest(String method, Durability tableDurability,<a name="line.4479"></a>
-<span class="sourceLineNo">4480</span>      Durability mutationDurability, long timeout, boolean expectAppend, final boolean expectSync,<a name="line.4480"></a>
-<span class="sourceLineNo">4481</span>      final boolean expectSyncFromLogSyncer) throws Exception {<a name="line.4481"></a>
-<span class="sourceLineNo">4482</span>    Configuration conf = HBaseConfiguration.create(CONF);<a name="line.4482"></a>
-<span class="sourceLineNo">4483</span>    method = method + "_" + tableDurability.name() + "_" + mutationDurability.name();<a name="line.4483"></a>
-<span class="sourceLineNo">4484</span>    byte[] family = Bytes.toBytes("family");<a name="line.4484"></a>
-<span class="sourceLineNo">4485</span>    Path logDir = new Path(new Path(dir + method), "log");<a name="line.4485"></a>
-<span class="sourceLineNo">4486</span>    final Configuration walConf = new Configuration(conf);<a name="line.4486"></a>
-<span class="sourceLineNo">4487</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.4487"></a>
-<span class="sourceLineNo">4488</span>    // XXX: The spied AsyncFSWAL can not work properly because of a Mockito defect that can not<a name="line.4488"></a>
-<span class="sourceLineNo">4489</span>    // deal with classes which have a field of an inner class. See discussions in HBASE-15536.<a name="line.4489"></a>
-<span class="sourceLineNo">4490</span>    walConf.set(WALFactory.WAL_PROVIDER, "filesystem");<a name="line.4490"></a>
-<span class="sourceLineNo">4491</span>    final WALFactory wals = new WALFactory(walConf, TEST_UTIL.getRandomUUID().toString());<a name="line.4491"></a>
-<span class="sourceLineNo">4492</span>    final WAL wal = spy(wals.getWAL(RegionInfoBuilder.newBuilder(tableName).build()));<a name="line.4492"></a>
-<span class="sourceLineNo">4493</span>    this.region = initHRegion(tableName, HConstants.EMPTY_START_ROW,<a name="line.4493"></a>
-<span class="sourceLineNo">4494</span>        HConstants.EMPTY_END_ROW, false, tableDurability, wal,<a name="line.4494"></a>
-<span class="sourceLineNo">4495</span>        new byte[][] { family });<a name="line.4495"></a>
-<span class="sourceLineNo">4496</span><a name="line.4496"></a>
-<span class="sourceLineNo">4497</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.4497"></a>
-<span class="sourceLineNo">4498</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.4498"></a>
-<span class="sourceLineNo">4499</span>    put.setDurability(mutationDurability);<a name="line.4499"></a>
-<span class="sourceLineNo">4500</span>    region.put(put);<a name="line.4500"></a>
-<span class="sourceLineNo">4501</span><a name="line.4501"></a>
-<span class="sourceLineNo">4502</span>    //verify append called or not<a name="line.4502"></a>
-<span class="sourceLineNo">4503</span>    verify(wal, expectAppend ? times(1) : never())<a name="line.4503"></a>
-<span class="sourceLineNo">4504</span>      .append((HRegionInfo)any(), (WALKeyImpl)any(),<a name="line.4504"></a>
-<span class="sourceLineNo">4505</span>          (WALEdit)any(), Mockito.anyBoolean());<a name="line.4505"></a>
+<span class="sourceLineNo">4479</span>    // expect skip wal cases<a name="line.4479"></a>
+<span class="sourceLineNo">4480</span>    durabilityTest(method, Durability.SYNC_WAL, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4480"></a>
+<span class="sourceLineNo">4481</span>    durabilityTest(method, Durability.FSYNC_WAL, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4481"></a>
+<span class="sourceLineNo">4482</span>    durabilityTest(method, Durability.ASYNC_WAL, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4482"></a>
+<span class="sourceLineNo">4483</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4483"></a>
+<span class="sourceLineNo">4484</span>    durabilityTest(method, Durability.USE_DEFAULT, Durability.SKIP_WAL, 0, false, false, false);<a name="line.4484"></a>
+<span class="sourceLineNo">4485</span>    durabilityTest(method, Durability.SKIP_WAL, Durability.USE_DEFAULT, 0, false, false, false);<a name="line.4485"></a>
+<span class="sourceLineNo">4486</span><a name="line.4486"></a>
+<span class="sourceLineNo">4487</span>  }<a name="line.4487"></a>
+<span class="sourceLineNo">4488</span><a name="line.4488"></a>
+<span class="sourceLineNo">4489</span>  private void durabilityTest(String method, Durability tableDurability,<a name="line.4489"></a>
+<span class="sourceLineNo">4490</span>      Durability mutationDurability, long timeout, boolean expectAppend, final boolean expectSync,<a name="line.4490"></a>
+<span class="sourceLineNo">4491</span>      final boolean expectSyncFromLogSyncer) throws Exception {<a name="line.4491"></a>
+<span class="sourceLineNo">4492</span>    Configuration conf = HBaseConfiguration.create(CONF);<a name="line.4492"></a>
+<span class="sourceLineNo">4493</span>    method = method + "_" + tableDurability.name() + "_" + mutationDurability.name();<a name="line.4493"></a>
+<span class="sourceLineNo">4494</span>    byte[] family = Bytes.toBytes("family");<a name="line.4494"></a>
+<span class="sourceLineNo">4495</span>    Path logDir = new Path(new Path(dir + method), "log");<a name="line.4495"></a>
+<span class="sourceLineNo">4496</span>    final Configuration walConf = new Configuration(conf);<a name="line.4496"></a>
+<span class="sourceLineNo">4497</span>    FSUtils.setRootDir(walConf, logDir);<a name="line.4497"></a>
+<span class="sourceLineNo">4498</span>    // XXX: The spied AsyncFSWAL can not work properly because of a Mockito defect that can not<a name="line.4498"></a>
+<span class="sourceLineNo">4499</span>    // deal with classes which have a field of an inner class. See discussions in HBASE-15536.<a name="line.4499"></a>
+<span class="sourceLineNo">4500</span>    walConf.set(WALFactory.WAL_PROVIDER, "filesystem");<a name="line.4500"></a>
+<span class="sourceLineNo">4501</span>    final WALFactory wals = new WALFactory(walConf, TEST_UTIL.getRandomUUID().toString());<a name="line.4501"></a>
+<span class="sourceLineNo">4502</span>    final WAL wal = spy(wals.getWAL(RegionInfoBuilder.newBuilder(tableName).build()));<a name="line.4502"></a>
+<span class="sourceLineNo">4503</span>    this.region = initHRegion(tableName, HConstants.EMPTY_START_ROW,<a name="line.4503"></a>
+<span class="sourceLineNo">4504</span>        HConstants.EMPTY_END_ROW, false, tableDurability, wal,<a name="line.4504"></a>
+<span class="sourceLineNo">4505</span>        new byte[][] { family });<a name="line.4505"></a>
 <span class="sourceLineNo">4506</span><a name="line.4506"></a>
-<span class="sourceLineNo">4507</span>    // verify sync called or not<a name="line.4507"></a>
-<span class="sourceLineNo">4508</span>    if (expectSync || expectSyncFromLogSyncer) {<a name="line.4508"></a>
-<span class="sourceLineNo">4509</span>      TEST_UTIL.waitFor(timeout, new Waiter.Predicate&lt;Exception&gt;() {<a name="line.4509"></a>
-<span class="sourceLineNo">4510</span>        @Override<a name="line.4510"></a>
-<span class="sourceLineNo">4511</span>        public boolean evaluate() throws Exception {<a name="line.4511"></a>
-<span class="sourceLineNo">4512</span>          try {<a name="line.4512"></a>
-<span class="sourceLineNo">4513</span>            if (expectSync) {<a name="line.4513"></a>
-<span class="sourceLineNo">4514</span>              verify(wal, times(1)).sync(anyLong()); // Hregion calls this one<a name="line.4514"></a>
-<span class="sourceLineNo">4515</span>            } else if (expectSyncFromLogSyncer) {<a name="line.4515"></a>
-<span class="sourceLineNo">4516</span>              verify(wal, times(1)).sync(); // wal syncer calls this one<a name="line.4516"></a>
-<span class="sourceLineNo">4517</span>            }<a name="line.4517"></a>
-<span class="sourceLineNo">4518</span>          } catch (Throwable ignore) {<a name="line.4518"></a>
-<span class="sourceLineNo">4519</span>          }<a name="line.4519"></a>
-<span class="sourceLineNo">4520</span>          return true;<a name="line.4520"></a>
-<span class="sourceLineNo">4521</span>        }<a name="line.4521"></a>
-<span class="sourceLineNo">4522</span>      });<a name="line.4522"></a>
-<span class="sourceLineNo">4523</span>    } else {<a name="line.4523"></a>
-<span class="sourceLineNo">4524</span>      //verify(wal, never()).sync(anyLong());<a name="line.4524"></a>
-<span class="sourceLineNo">4525</span>      verify(wal, never()).sync();<a name="line.4525"></a>
-<span class="sourceLineNo">4526</span>    }<a name="line.4526"></a>
-<span class="sourceLineNo">4527</span><a name="line.4527"></a>
-<span class="sourceLineNo">4528</span>    HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.4528"></a>
-<span class="sourceLineNo">4529</span>    wals.close();<a name="line.4529"></a>
-<span class="sourceLineNo">4530</span>    this.region = null;<a name="line.4530"></a>
-<span class="sourceLineNo">4531</span>  }<a name="line.4531"></a>
-<span class="sourceLineNo">4532</span><a name="line.4532"></a>
-<span class="sourceLineNo">4533</span>  @Test<a name="line.4533"></a>
-<span class="sourceLineNo">4534</span>  public void testRegionReplicaSecondary() throws IOException {<a name="line.4534"></a>
-<span class="sourceLineNo">4535</span>    // create a primary region, load some data and flush<a name="line.4535"></a>
-<span class="sourceLineNo">4536</span>    // create a secondary region, and do a get against that<a name="line.4536"></a>
-<span class="sourceLineNo">4537</span>    Path rootDir = new Path(dir + name.getMethodName());<a name="line.4537"></a>
-<span class="sourceLineNo">4538</span>    FSUtils.setRootDir(TEST_UTIL.getConfiguration(), rootDir);<a name="line.4538"></a>
-<span class="sourceLineNo">4539</span><a name="line.4539"></a>
-<span class="sourceLineNo">4540</span>    byte[][] families = new byte[][] {<a name="line.4540"></a>
-<span class="sourceLineNo">4541</span>        Bytes.toBytes("cf1"), Bytes.toBytes("cf2"), Bytes.toBytes("cf3")<a name="line.4541"></a>
-<span class="sourceLineNo">4542</span>    };<a name="line.4542"></a>
-<span class="sourceLineNo">4543</span>    byte[] cq = Bytes.toBytes("cq");<a name="line.4543"></a>
-<span class="sourceLineNo">4544</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.4544"></a>
-<span class="sourceLineNo">4545</span>    for (byte[] family : families) {<a name="line.4545"></a>
-<span class="sourceLineNo">4546</span>      htd.addFamily(new HColumnDescriptor(family));<a name="line.4546"></a>
-<span class="sourceLineNo">4547</span>    }<a name="line.4547"></a>
-<span class="sourceLineNo">4548</span><a name="line.4548"></a>
-<span class="sourceLineNo">4549</span>    long time = System.currentTimeMillis();<a name="line.4549"></a>
-<span class="sourceLineNo">4550</span>    HRegionInfo primaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4550"></a>
-<span class="sourceLineNo">4551</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4551"></a>
-<span class="sourceLineNo">4552</span>      false, time, 0);<a name="line.4552"></a>
-<span class="sourceLineNo">4553</span>    HRegionInfo secondaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4553"></a>
-<span class="sourceLineNo">4554</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4554"></a>
-<span class="sourceLineNo">4555</span>      false, time, 1);<a name="line.4555"></a>
-<span class="sourceLineNo">4556</span><a name="line.4556"></a>
-<span class="sourceLineNo">4557</span>    HRegion primaryRegion = null, secondaryRegion = null;<a name="line.4557"></a>
+<span class="sourceLineNo">4507</span>    Put put = new Put(Bytes.toBytes("r1"));<a name="line.4507"></a>
+<span class="sourceLineNo">4508</span>    put.addColumn(family, Bytes.toBytes("q1"), Bytes.toBytes("v1"));<a name="line.4508"></a>
+<span class="sourceLineNo">4509</span>    put.setDurability(mutationDurability);<a name="line.4509"></a>
+<span class="sourceLineNo">4510</span>    region.put(put);<a name="line.4510"></a>
+<span class="sourceLineNo">4511</span><a name="line.4511"></a>
+<span class="sourceLineNo">4512</span>    //verify append called or not<a name="line.4512"></a>
+<span class="sourceLineNo">4513</span>    verify(wal, expectAppend ? times(1) : never())<a name="line.4513"></a>
+<span class="sourceLineNo">4514</span>      .append((HRegionInfo)any(), (WALKeyImpl)any(),<a name="line.4514"></a>
+<span class="sourceLineNo">4515</span>          (WALEdit)any(), Mockito.anyBoolean());<a name="line.4515"></a>
+<span class="sourceLineNo">4516</span><a name="line.4516"></a>
+<span class="sourceLineNo">4517</span>    // verify sync called or not<a name="line.4517"></a>
+<span class="sourceLineNo">4518</span>    if (expectSync || expectSyncFromLogSyncer) {<a name="line.4518"></a>
+<span class="sourceLineNo">4519</span>      TEST_UTIL.waitFor(timeout, new Waiter.Predicate&lt;Exception&gt;() {<a name="line.4519"></a>
+<span class="sourceLineNo">4520</span>        @Override<a name="line.4520"></a>
+<span class="sourceLineNo">4521</span>        public boolean evaluate() throws Exception {<a name="line.4521"></a>
+<span class="sourceLineNo">4522</span>          try {<a name="line.4522"></a>
+<span class="sourceLineNo">4523</span>            if (expectSync) {<a name="line.4523"></a>
+<span class="sourceLineNo">4524</span>              verify(wal, times(1)).sync(anyLong()); // Hregion calls this one<a name="line.4524"></a>
+<span class="sourceLineNo">4525</span>            } else if (expectSyncFromLogSyncer) {<a name="line.4525"></a>
+<span class="sourceLineNo">4526</span>              verify(wal, times(1)).sync(); // wal syncer calls this one<a name="line.4526"></a>
+<span class="sourceLineNo">4527</span>            }<a name="line.4527"></a>
+<span class="sourceLineNo">4528</span>          } catch (Throwable ignore) {<a name="line.4528"></a>
+<span class="sourceLineNo">4529</span>          }<a name="line.4529"></a>
+<span class="sourceLineNo">4530</span>          return true;<a name="line.4530"></a>
+<span class="sourceLineNo">4531</span>        }<a name="line.4531"></a>
+<span class="sourceLineNo">4532</span>      });<a name="line.4532"></a>
+<span class="sourceLineNo">4533</span>    } else {<a name="line.4533"></a>
+<span class="sourceLineNo">4534</span>      //verify(wal, never()).sync(anyLong());<a name="line.4534"></a>
+<span class="sourceLineNo">4535</span>      verify(wal, never()).sync();<a name="line.4535"></a>
+<span class="sourceLineNo">4536</span>    }<a name="line.4536"></a>
+<span class="sourceLineNo">4537</span><a name="line.4537"></a>
+<span class="sourceLineNo">4538</span>    HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.4538"></a>
+<span class="sourceLineNo">4539</span>    wals.close();<a name="line.4539"></a>
+<span class="sourceLineNo">4540</span>    this.region = null;<a name="line.4540"></a>
+<span class="sourceLineNo">4541</span>  }<a name="line.4541"></a>
+<span class="sourceLineNo">4542</span><a name="line.4542"></a>
+<span class="sourceLineNo">4543</span>  @Test<a name="line.4543"></a>
+<span class="sourceLineNo">4544</span>  public void testRegionReplicaSecondary() throws IOException {<a name="line.4544"></a>
+<span class="sourceLineNo">4545</span>    // create a primary region, load some data and flush<a name="line.4545"></a>
+<span class="sourceLineNo">4546</span>    // create a secondary region, and do a get against that<a name="line.4546"></a>
+<span class="sourceLineNo">4547</span>    Path rootDir = new Path(dir + name.getMethodName());<a name="line.4547"></a>
+<span class="sourceLineNo">4548</span>    FSUtils.setRootDir(TEST_UTIL.getConfiguration(), rootDir);<a name="line.4548"></a>
+<span class="sourceLineNo">4549</span><a name="line.4549"></a>
+<span class="sourceLineNo">4550</span>    byte[][] families = new byte[][] {<a name="line.4550"></a>
+<span class="sourceLineNo">4551</span>        Bytes.toBytes("cf1"), Bytes.toBytes("cf2"), Bytes.toBytes("cf3")<a name="line.4551"></a>
+<span class="sourceLineNo">4552</span>    };<a name="line.4552"></a>
+<span class="sourceLineNo">4553</span>    byte[] cq = Bytes.toBytes("cq");<a name="line.4553"></a>
+<span class="sourceLineNo">4554</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.4554"></a>
+<span class="sourceLineNo">4555</span>    for (byte[] family : families) {<a name="line.4555"></a>
+<span class="sourceLineNo">4556</span>      htd.addFamily(new HColumnDescriptor(family));<a name="line.4556"></a>
+<span class="sourceLineNo">4557</span>    }<a name="line.4557"></a>
 <span class="sourceLineNo">4558</span><a name="line.4558"></a>
-<span class="sourceLineNo">4559</span>    try {<a name="line.4559"></a>
-<span class="sourceLineNo">4560</span>      primaryRegion = HBaseTestingUtility.createRegionAndWAL(primaryHri,<a name="line.4560"></a>
-<span class="sourceLineNo">4561</span>          rootDir, TEST_UTIL.getConfiguration(), htd);<a name="line.4561"></a>
-<span class="sourceLineNo">4562</span><a name="line.4562"></a>
-<span class="sourceLineNo">4563</span>      // load some data<a name="line.4563"></a>
-<span class="sourceLineNo">4564</span>      putData(primaryRegion, 0, 1000, cq, families);<a name="line.4564"></a>
-<span class="sourceLineNo">4565</span><a name="line.4565"></a>
-<span class="sourceLineNo">4566</span>      // flush region<a name="line.4566"></a>
-<span class="sourceLineNo">4567</span>      primaryRegion.flush(true);<a name="line.4567"></a>
+<span class="sourceLineNo">4559</span>    long time = System.currentTimeMillis();<a name="line.4559"></a>
+<span class="sourceLineNo">4560</span>    HRegionInfo primaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4560"></a>
+<span class="sourceLineNo">4561</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4561"></a>
+<span class="sourceLineNo">4562</span>      false, time, 0);<a name="line.4562"></a>
+<span class="sourceLineNo">4563</span>    HRegionInfo secondaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4563"></a>
+<span class="sourceLineNo">4564</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4564"></a>
+<span class="sourceLineNo">4565</span>      false, time, 1);<a name="line.4565"></a>
+<span class="sourceLineNo">4566</span><a name="line.4566"></a>
+<span class="sourceLineNo">4567</span>    HRegion primaryRegion = null, secondaryRegion = null;<a name="line.4567"></a>
 <span class="sourceLineNo">4568</span><a name="line.4568"></a>
-<span class="sourceLineNo">4569</span>      // open secondary region<a name="line.4569"></a>
-<span class="sourceLineNo">4570</span>      secondaryRegion = HRegion.openHRegion(rootDir, secondaryHri, htd, null, CONF);<a name="line.4570"></a>
-<span class="sourceLineNo">4571</span><a name="line.4571"></a>
-<span class="sourceLineNo">4572</span>      verifyData(secondaryRegion, 0, 1000, cq, families);<a name="line.4572"></a>
-<span class="sourceLineNo">4573</span>    } finally {<a name="line.4573"></a>
-<span class="sourceLineNo">4574</span>      if (primaryRegion != null) {<a name="line.4574"></a>
-<span class="sourceLineNo">4575</span>        HBaseTestingUtility.closeRegionAndWAL(primaryRegion);<a name="line.4575"></a>
-<span class="sourceLineNo">4576</span>      }<a name="line.4576"></a>
-<span class="sourceLineNo">4577</span>      if (secondaryRegion != null) {<a name="line.4577"></a>
-<span class="sourceLineNo">4578</span>        HBaseTestingUtility.closeRegionAndWAL(secondaryRegion);<a name="line.4578"></a>
-<span class="sourceLineNo">4579</span>      }<a name="line.4579"></a>
-<span class="sourceLineNo">4580</span>    }<a name="line.4580"></a>
-<span class="sourceLineNo">4581</span>  }<a name="line.4581"></a>
-<span class="sourceLineNo">4582</span><a name="line.4582"></a>
-<span class="sourceLineNo">4583</span>  @Test<a name="line.4583"></a>
-<span class="sourceLineNo">4584</span>  public void testRegionReplicaSecondaryIsReadOnly() throws IOException {<a name="line.4584"></a>
-<span class="sourceLineNo">4585</span>    // create a primary region, load some data and flush<a name="line.4585"></a>
-<span class="sourceLineNo">4586</span>    // create a secondary region, and do a put against that<a name="line.4586"></a>
-<span class="sourceLineNo">4587</span>    Path rootDir = new Path(dir + name.getMethodName());<a name="line.4587"></a>
-<span class="sourceLineNo">4588</span>    FSUtils.setRootDir(TEST_UTIL.getConfiguration(), rootDir);<a name="line.4588"></a>
-<span class="sourceLineNo">4589</span><a name="line.4589"></a>
-<span class="sourceLineNo">4590</span>    byte[][] families = new byte[][] {<a name="line.4590"></a>
-<span class="sourceLineNo">4591</span>        Bytes.toBytes("cf1"), Bytes.toBytes("cf2"), Bytes.toBytes("cf3")<a name="line.4591"></a>
-<span class="sourceLineNo">4592</span>    };<a name="line.4592"></a>
-<span class="sourceLineNo">4593</span>    byte[] cq = Bytes.toBytes("cq");<a name="line.4593"></a>
-<span class="sourceLineNo">4594</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.4594"></a>
-<span class="sourceLineNo">4595</span>    for (byte[] family : families) {<a name="line.4595"></a>
-<span class="sourceLineNo">4596</span>      htd.addFamily(new HColumnDescriptor(family));<a name="line.4596"></a>
-<span class="sourceLineNo">4597</span>    }<a name="line.4597"></a>
-<span class="sourceLineNo">4598</span><a name="line.4598"></a>
-<span class="sourceLineNo">4599</span>    long time = System.currentTimeMillis();<a name="line.4599"></a>
-<span class="sourceLineNo">4600</span>    HRegionInfo primaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4600"></a>
-<span class="sourceLineNo">4601</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4601"></a>
-<span class="sourceLineNo">4602</span>      false, time, 0);<a name="line.4602"></a>
-<span class="sourceLineNo">4603</span>    HRegionInfo secondaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4603"></a>
-<span class="sourceLineNo">4604</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4604"></a>
-<span class="sourceLineNo">4605</span>      false, time, 1);<a name="line.4605"></a>
-<span class="sourceLineNo">4606</span><a name="line.4606"></a>
-<span class="sourceLineNo">4607</span>    HRegion primaryRegion = null, secondaryRegion = null;<a name="line.4607"></a>
+<span class="sourceLineNo">4569</span>    try {<a name="line.4569"></a>
+<span class="sourceLineNo">4570</span>      primaryRegion = HBaseTestingUtility.createRegionAndWAL(primaryHri,<a name="line.4570"></a>
+<span class="sourceLineNo">4571</span>          rootDir, TEST_UTIL.getConfiguration(), htd);<a name="line.4571"></a>
+<span class="sourceLineNo">4572</span><a name="line.4572"></a>
+<span class="sourceLineNo">4573</span>      // load some data<a name="line.4573"></a>
+<span class="sourceLineNo">4574</span>      putData(primaryRegion, 0, 1000, cq, families);<a name="line.4574"></a>
+<span class="sourceLineNo">4575</span><a name="line.4575"></a>
+<span class="sourceLineNo">4576</span>      // flush region<a name="line.4576"></a>
+<span class="sourceLineNo">4577</span>      primaryRegion.flush(true);<a name="line.4577"></a>
+<span class="sourceLineNo">4578</span><a name="line.4578"></a>
+<span class="sourceLineNo">4579</span>      // open secondary region<a name="line.4579"></a>
+<span class="sourceLineNo">4580</span>      secondaryRegion = HRegion.openHRegion(rootDir, secondaryHri, htd, null, CONF);<a name="line.4580"></a>
+<span class="sourceLineNo">4581</span><a name="line.4581"></a>
+<span class="sourceLineNo">4582</span>      verifyData(secondaryRegion, 0, 1000, cq, families);<a name="line.4582"></a>
+<span class="sourceLineNo">4583</span>    } finally {<a name="line.4583"></a>
+<span class="sourceLineNo">4584</span>      if (primaryRegion != null) {<a name="line.4584"></a>
+<span class="sourceLineNo">4585</span>        HBaseTestingUtility.closeRegionAndWAL(primaryRegion);<a name="line.4585"></a>
+<span class="sourceLineNo">4586</span>      }<a name="line.4586"></a>
+<span class="sourceLineNo">4587</span>      if (secondaryRegion != null) {<a name="line.4587"></a>
+<span class="sourceLineNo">4588</span>        HBaseTestingUtility.closeRegionAndWAL(secondaryRegion);<a name="line.4588"></a>
+<span class="sourceLineNo">4589</span>      }<a name="line.4589"></a>
+<span class="sourceLineNo">4590</span>    }<a name="line.4590"></a>
+<span class="sourceLineNo">4591</span>  }<a name="line.4591"></a>
+<span class="sourceLineNo">4592</span><a name="line.4592"></a>
+<span class="sourceLineNo">4593</span>  @Test<a name="line.4593"></a>
+<span class="sourceLineNo">4594</span>  public void testRegionReplicaSecondaryIsReadOnly() throws IOException {<a name="line.4594"></a>
+<span class="sourceLineNo">4595</span>    // create a primary region, load some data and flush<a name="line.4595"></a>
+<span class="sourceLineNo">4596</span>    // create a secondary region, and do a put against that<a name="line.4596"></a>
+<span class="sourceLineNo">4597</span>    Path rootDir = new Path(dir + name.getMethodName());<a name="line.4597"></a>
+<span class="sourceLineNo">4598</span>    FSUtils.setRootDir(TEST_UTIL.getConfiguration(), rootDir);<a name="line.4598"></a>
+<span class="sourceLineNo">4599</span><a name="line.4599"></a>
+<span class="sourceLineNo">4600</span>    byte[][] families = new byte[][] {<a name="line.4600"></a>
+<span class="sourceLineNo">4601</span>        Bytes.toBytes("cf1"), Bytes.toBytes("cf2"), Bytes.toBytes("cf3")<a name="line.4601"></a>
+<span class="sourceLineNo">4602</span>    };<a name="line.4602"></a>
+<span class="sourceLineNo">4603</span>    byte[] cq = Bytes.toBytes("cq");<a name="line.4603"></a>
+<span class="sourceLineNo">4604</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.4604"></a>
+<span class="sourceLineNo">4605</span>    for (byte[] family : families) {<a name="line.4605"></a>
+<span class="sourceLineNo">4606</span>      htd.addFamily(new HColumnDescriptor(family));<a name="line.4606"></a>
+<span class="sourceLineNo">4607</span>    }<a name="line.4607"></a>
 <span class="sourceLineNo">4608</span><a name="line.4608"></a>
-<span class="sourceLineNo">4609</span>    try {<a name="line.4609"></a>
-<span class="sourceLineNo">4610</span>      primaryRegion = HBaseTestingUtility.createRegionAndWAL(primaryHri,<a name="line.4610"></a>
-<span class="sourceLineNo">4611</span>          rootDir, TEST_UTIL.getConfiguration(), htd);<a name="line.4611"></a>
-<span class="sourceLineNo">4612</span><a name="line.4612"></a>
-<span class="sourceLineNo">4613</span>      // load some data<a name="line.4613"></a>
-<span class="sourceLineNo">4614</span>      putData(primaryRegion, 0, 1000, cq, families);<a name="line.4614"></a>
-<span class="sourceLineNo">4615</span><a name="line.4615"></a>
-<span class="sourceLineNo">4616</span>      // flush region<a name="line.4616"></a>
-<span class="sourceLineNo">4617</span>      primaryRegion.flush(true);<a name="line.4617"></a>
+<span class="sourceLineNo">4609</span>    long time = System.currentTimeMillis();<a name="line.4609"></a>
+<span class="sourceLineNo">4610</span>    HRegionInfo primaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4610"></a>
+<span class="sourceLineNo">4611</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4611"></a>
+<span class="sourceLineNo">4612</span>      false, time, 0);<a name="line.4612"></a>
+<span class="sourceLineNo">4613</span>    HRegionInfo secondaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4613"></a>
+<span class="sourceLineNo">4614</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4614"></a>
+<span class="sourceLineNo">4615</span>      false, time, 1);<a name="line.4615"></a>
+<span class="sourceLineNo">4616</span><a name="line.4616"></a>
+<span class="sourceLineNo">4617</span>    HRegion primaryRegion = null, secondaryRegion = null;<a name="line.4617"></a>
 <span class="sourceLineNo">4618</span><a name="line.4618"></a>
-<span class="sourceLineNo">4619</span>      // open secondary region<a name="line.4619"></a>
-<span class="sourceLineNo">4620</span>      secondaryRegion = HRegion.openHRegion(rootDir, secondaryHri, htd, null, CONF);<a name="line.4620"></a>
-<span class="sourceLineNo">4621</span><a name="line.4621"></a>
-<span class="sourceLineNo">4622</span>      try {<a name="line.4622"></a>
-<span class="sourceLineNo">4623</span>        putData(secondaryRegion, 0, 1000, cq, families);<a name="line.4623"></a>
-<span class="sourceLineNo">4624</span>        fail("Should have thrown exception");<a name="line.4624"></a>
-<span class="sourceLineNo">4625</span>      } catch (IOException ex) {<a name="line.4625"></a>
-<span class="sourceLineNo">4626</span>        // expected<a name="line.4626"></a>
-<span class="sourceLineNo">4627</span>      }<a name="line.4627"></a>
-<span class="sourceLineNo">4628</span>    } finally {<a name="line.4628"></a>
-<span class="sourceLineNo">4629</span>      if (primaryRegion != null) {<a name="line.4629"></a>
-<span class="sourceLineNo">4630</span>        HBaseTestingUtility.closeRegionAndWAL(primaryRegion);<a name="line.4630"></a>
-<span class="sourceLineNo">4631</span>      }<a name="line.4631"></a>
-<span class="sourceLineNo">4632</span>      if (secondaryRegion != null) {<a name="line.4632"></a>
-<span class="sourceLineNo">4633</span>        HBaseTestingUtility.closeRegionAndWAL(secondaryRegion);<a name="line.4633"></a>
-<span class="sourceLineNo">4634</span>      }<a name="line.4634"></a>
-<span class="sourceLineNo">4635</span>    }<a name="line.4635"></a>
-<span class="sourceLineNo">4636</span>  }<a name="line.4636"></a>
-<span class="sourceLineNo">4637</span><a name="line.4637"></a>
-<span class="sourceLineNo">4638</span>  static WALFactory createWALFactory(Configuration conf, Path rootDir) throws IOException {<a name="line.4638"></a>
-<span class="sourceLineNo">4639</span>    Configuration confForWAL = new Configuration(conf);<a name="line.4639"></a>
-<span class="sourceLineNo">4640</span>    confForWAL.set(HConstants.HBASE_DIR, rootDir.toString());<a name="line.4640"></a>
-<span class="sourceLineNo">4641</span>    return new WALFactory(confForWAL, "hregion-" + RandomStringUtils.randomNumeric(8));<a name="line.4641"></a>
-<span class="sourceLineNo">4642</span>  }<a name="line.4642"></a>
-<span class="sourceLineNo">4643</span><a name="line.4643"></a>
-<span class="sourceLineNo">4644</span>  @Test<a name="line.4644"></a>
-<span class="sourceLineNo">4645</span>  public void testCompactionFromPrimary() throws IOException {<a name="line.4645"></a>
-<span class="sourceLineNo">4646</span>    Path rootDir = new Path(dir + name.getMethodName());<a name="line.4646"></a>
-<span class="sourceLineNo">4647</span>    FSUtils.setRootDir(TEST_UTIL.getConfiguration(), rootDir);<a name="line.4647"></a>
-<span class="sourceLineNo">4648</span><a name="line.4648"></a>
-<span class="sourceLineNo">4649</span>    byte[][] families = new byte[][] {<a name="line.4649"></a>
-<span class="sourceLineNo">4650</span>        Bytes.toBytes("cf1"), Bytes.toBytes("cf2"), Bytes.toBytes("cf3")<a name="line.4650"></a>
-<span class="sourceLineNo">4651</span>    };<a name="line.4651"></a>
-<span class="sourceLineNo">4652</span>    byte[] cq = Bytes.toBytes("cq");<a name="line.4652"></a>
-<span class="sourceLineNo">4653</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.4653"></a>
-<span class="sourceLineNo">4654</span>    for (byte[] family : families) {<a name="line.4654"></a>
-<span class="sourceLineNo">4655</span>      htd.addFamily(new HColumnDescriptor(family));<a name="line.4655"></a>
-<span class="sourceLineNo">4656</span>    }<a name="line.4656"></a>
-<span class="sourceLineNo">4657</span><a name="line.4657"></a>
-<span class="sourceLineNo">4658</span>    long time = System.currentTimeMillis();<a name="line.4658"></a>
-<span class="sourceLineNo">4659</span>    HRegionInfo primaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4659"></a>
-<span class="sourceLineNo">4660</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4660"></a>
-<span class="sourceLineNo">4661</span>      false, time, 0);<a name="line.4661"></a>
-<span class="sourceLineNo">4662</span>    HRegionInfo secondaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4662"></a>
-<span class="sourceLineNo">4663</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4663"></a>
-<span class="sourceLineNo">4664</span>      false, time, 1);<a name="line.4664"></a>
-<span class="sourceLineNo">4665</span><a name="line.4665"></a>
-<span class="sourceLineNo">4666</span>    HRegion primaryRegion = null, secondaryRegion = null;<a name="line.4666"></a>
+<span class="sourceLineNo">4619</span>    try {<a name="line.4619"></a>
+<span class="sourceLineNo">4620</span>      primaryRegion = HBaseTestingUtility.createRegionAndWAL(primaryHri,<a name="line.4620"></a>
+<span class="sourceLineNo">4621</span>          rootDir, TEST_UTIL.getConfiguration(), htd);<a name="line.4621"></a>
+<span class="sourceLineNo">4622</span><a name="line.4622"></a>
+<span class="sourceLineNo">4623</span>      // load some data<a name="line.4623"></a>
+<span class="sourceLineNo">4624</span>      putData(primaryRegion, 0, 1000, cq, families);<a name="line.4624"></a>
+<span class="sourceLineNo">4625</span><a name="line.4625"></a>
+<span class="sourceLineNo">4626</span>      // flush region<a name="line.4626"></a>
+<span class="sourceLineNo">4627</span>      primaryRegion.flush(true);<a name="line.4627"></a>
+<span class="sourceLineNo">4628</span><a name="line.4628"></a>
+<span class="sourceLineNo">4629</span>      // open secondary region<a name="line.4629"></a>
+<span class="sourceLineNo">4630</span>      secondaryRegion = HRegion.openHRegion(rootDir, secondaryHri, htd, null, CONF);<a name="line.4630"></a>
+<span class="sourceLineNo">4631</span><a name="line.4631"></a>
+<span class="sourceLineNo">4632</span>      try {<a name="line.4632"></a>
+<span class="sourceLineNo">4633</span>        putData(secondaryRegion, 0, 1000, cq, families);<a name="line.4633"></a>
+<span class="sourceLineNo">4634</span>        fail("Should have thrown exception");<a name="line.4634"></a>
+<span class="sourceLineNo">4635</span>      } catch (IOException ex) {<a name="line.4635"></a>
+<span class="sourceLineNo">4636</span>        // expected<a name="line.4636"></a>
+<span class="sourceLineNo">4637</span>      }<a name="line.4637"></a>
+<span class="sourceLineNo">4638</span>    } finally {<a name="line.4638"></a>
+<span class="sourceLineNo">4639</span>      if (primaryRegion != null) {<a name="line.4639"></a>
+<span class="sourceLineNo">4640</span>        HBaseTestingUtility.closeRegionAndWAL(primaryRegion);<a name="line.4640"></a>
+<span class="sourceLineNo">4641</span>      }<a name="line.4641"></a>
+<span class="sourceLineNo">4642</span>      if (secondaryRegion != null) {<a name="line.4642"></a>
+<span class="sourceLineNo">4643</span>        HBaseTestingUtility.closeRegionAndWAL(secondaryRegion);<a name="line.4643"></a>
+<span class="sourceLineNo">4644</span>      }<a name="line.4644"></a>
+<span class="sourceLineNo">4645</span>    }<a name="line.4645"></a>
+<span class="sourceLineNo">4646</span>  }<a name="line.4646"></a>
+<span class="sourceLineNo">4647</span><a name="line.4647"></a>
+<span class="sourceLineNo">4648</span>  static WALFactory createWALFactory(Configuration conf, Path rootDir) throws IOException {<a name="line.4648"></a>
+<span class="sourceLineNo">4649</span>    Configuration confForWAL = new Configuration(conf);<a name="line.4649"></a>
+<span class="sourceLineNo">4650</span>    confForWAL.set(HConstants.HBASE_DIR, rootDir.toString());<a name="line.4650"></a>
+<span class="sourceLineNo">4651</span>    return new WALFactory(confForWAL, "hregion-" + RandomStringUtils.randomNumeric(8));<a name="line.4651"></a>
+<span class="sourceLineNo">4652</span>  }<a name="line.4652"></a>
+<span class="sourceLineNo">4653</span><a name="line.4653"></a>
+<span class="sourceLineNo">4654</span>  @Test<a name="line.4654"></a>
+<span class="sourceLineNo">4655</span>  public void testCompactionFromPrimary() throws IOException {<a name="line.4655"></a>
+<span class="sourceLineNo">4656</span>    Path rootDir = new Path(dir + name.getMethodName());<a name="line.4656"></a>
+<span class="sourceLineNo">4657</span>    FSUtils.setRootDir(TEST_UTIL.getConfiguration(), rootDir);<a name="line.4657"></a>
+<span class="sourceLineNo">4658</span><a name="line.4658"></a>
+<span class="sourceLineNo">4659</span>    byte[][] families = new byte[][] {<a name="line.4659"></a>
+<span class="sourceLineNo">4660</span>        Bytes.toBytes("cf1"), Bytes.toBytes("cf2"), Bytes.toBytes("cf3")<a name="line.4660"></a>
+<span class="sourceLineNo">4661</span>    };<a name="line.4661"></a>
+<span class="sourceLineNo">4662</span>    byte[] cq = Bytes.toBytes("cq");<a name="line.4662"></a>
+<span class="sourceLineNo">4663</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.4663"></a>
+<span class="sourceLineNo">4664</span>    for (byte[] family : families) {<a name="line.4664"></a>
+<span class="sourceLineNo">4665</span>      htd.addFamily(new HColumnDescriptor(family));<a name="line.4665"></a>
+<span class="sourceLineNo">4666</span>    }<a name="line.4666"></a>
 <span class="sourceLineNo">4667</span><a name="line.4667"></a>
-<span class="sourceLineNo">4668</span>    try {<a name="line.4668"></a>
-<span class="sourceLineNo">4669</span>      primaryRegion = HBaseTestingUtility.createRegionAndWAL(primaryHri,<a name="line.4669"></a>
-<span class="sourceLineNo">4670</span>          rootDir, TEST_UTIL.getConfiguration(), htd);<a name="line.4670"></a>
-<span class="sourceLineNo">4671</span><a name="line.4671"></a>
-<span class="sourceLineNo">4672</span>      // load some data<a name="line.4672"></a>
-<span class="sourceLineNo">4673</span>      putData(primaryRegion, 0, 1000, cq, families);<a name="line.4673"></a>
-<span class="sourceLineNo">4674</span><a name="line.4674"></a>
-<span class="sourceLineNo">4675</span>      // flush region<a name="line.4675"></a>
-<span class="sourceLineNo">4676</span>      primaryRegion.flush(true);<a name="line.4676"></a>
+<span class="sourceLineNo">4668</span>    long time = System.currentTimeMillis();<a name="line.4668"></a>
+<span class="sourceLineNo">4669</span>    HRegionInfo primaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4669"></a>
+<span class="sourceLineNo">4670</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4670"></a>
+<span class="sourceLineNo">4671</span>      false, time, 0);<a name="line.4671"></a>
+<span class="sourceLineNo">4672</span>    HRegionInfo secondaryHri = new HRegionInfo(htd.getTableName(),<a name="line.4672"></a>
+<span class="sourceLineNo">4673</span>      HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW,<a name="line.4673"></a>
+<span class="sourceLineNo">4674</span>      false, time, 1);<a name="line.4674"></a>
+<span class="sourceLineNo">4675</span><a name="line.4675"></a>
+<span class="sourceLineNo">4676</span>    HRegion primaryRegion = null, secondaryRegion = null;<a name="line.4676"></a>
 <span class="sourceLineNo">4677</span><a name="line.4677"></a>
-<span class="sourceLineNo">4678</span>      // open secondary region<a name="line.4678"></a>
-<span class="sourceLineNo">4679</span>      secondaryRegion = HRegion.openHRegion(rootDir, secondaryHri, htd, null, CONF);<a name="line.4679"></a>
-<span class="sourceLineNo">4680</span><a name="line.4680"></a>
-<span class="sourceLineNo">4681</span>      // move the file of the primary region to the archive, simulating a compaction<a name="line.4681"></a>
-<span class="sourceLineNo">4682</span>      Collection&lt;HStoreFile&gt; storeFiles = primaryRegion.getStore(families[0]).getStorefiles();<a name="line.4682"></a>
-<span class="sourceLineNo">4683</span>      primaryRegion.getRegionFileSystem().removeStoreFiles(Bytes.toString(families[0]), storeFiles);<a name="line.4683"></a>
-<span class="sourceLineNo">4684</span>      Collection&lt;StoreFileInfo&gt; storeFileInfos = primaryRegion.getRegionFileSystem()<a name="line.4684"></a>
-<span class="sourceLineNo">4685</span>          .getStoreFiles(families[0]);<a name="line.4685"></a>
-<span class="sourceLineNo">4686</span>      Assert.assertTrue(storeFileInfos == null || storeFileInfos.isEmpty());<a name="line.4686"></a>
+<span class="sourceLineNo">4678</span>    try {<a name="line.4678"></a>
+<span class="sourceLineNo">4679</span>      primaryRegion = HBaseTestingUtility.createRegionAndWAL(primaryHri,<a name="line.4679"></a>
+<span class="sourceLineNo">4680</span>          rootDir, TEST_UTIL.getConfiguration(), htd);<a name="line.4680"></a>
+<span class="sourceLineNo">4681</span><a name="line.4681"></a>
+<span class="sourceLineNo">4682</span>      // load some data<a name="line.4682"></a>
+<span class="sourceLineNo">4683</span>      putData(primaryRegion, 0, 1000, cq, families);<a name="line.4683"></a>
+<span class="sourceLineNo">4684</span><a name="line.4684"></a>
+<span class="sourceLineNo">4685</span>      // flush region<a name="line.4685"></a>
+<span class="sourceLineNo">4686</span>      primaryRegion.flush(true);<a name="line.4686"></a>
 <span class="sourceLineNo">4687</span><a name="line.4687"></a>
-<span class="sourceLineNo">4688</span>      verifyData(secondaryRegion, 0, 1000, cq, families);<a name="line.4688"></a>
-<span class="sourceLineNo">4689</span>    } finally {<a name="line.4689"></a>
-<span class="sourceLineNo">4690</span>      if (primaryRegion != null) {<a name="line.4690"></a>
-<span class="sourceLineNo">4691</span>        HBaseTestingUtility.closeRegionAndWAL(primaryRegion);<a name="line.4691"></a>
-<span class="sourceLineNo">4692</span>      }<a name="line.4692"></a>
-<span class="sourceLineNo">4693</span>      if (secondaryRegion != null) {<a name="line.4693"></a>
-<span class="sourceLineNo">4694</span>        HBaseTestingUtility.closeRegionAndWAL(secondaryRegion);<a name="line.4694"></a>
-<span class="sourceLineNo">4695</span>      }<a name="line.4695"></a>
-<span class="sourceLineNo">4696</span>    }<a name="line.4696"></a>
-<span class="sourceLineNo">4697</span>  }<a name="line.4697"></a>
-<span class="sourceLineNo">4698</span><a name="line.4698"></a>
-<span class="sourceLineNo">4699</span>  private void putData(int startRow, int numRows, byte[] qf, byte[]... families) throws<a name="line.4699"></a>
-<span class="sourceLineNo">4700</span>      IOException {<a name="line.4700"></a>
-<span class="sourceLineNo">4701</span>    putData(this.region, startRow, numRows, qf, families);<a name="line.4701"></a>
-<span class="sourceLineNo">4702</span>  }<a name="line.4702"></a>
-<span class="sourceLineNo">4703</span><a name="line.4703"></a>
-<span class="sourceLineNo">4704</span>  private void putData(HRegion region,<a name="line.4704"></a>
-<span class="sourceLineNo">4705</span>      int startRow, int numRows, byte[] qf, byte[]... families) throws IOException {<a name="line.4705"></a>
-<span class="sourceLineNo">4706</span>    putData(region, Durability.SKIP_WAL, startRow, numRows, qf, families);<a name="line.4706"></a>
+<span class="sourceLineNo">4688</span>      // open secondary region<a name="line.4688"></a>
+<span class="sourceLineNo">4689</span>      secondaryRegion = HRegion.openHRegion(rootDir, secondaryHri, htd, null, CONF);<a name="line.4689"></a>
+<span class="sourceLineNo">4690</span><a name="line.4690"></a>
+<span class="sourceLineNo">4691</span>      // move the file of the primary region to the archive, simulating a compaction<a name="line.4691"></a>
+<span class="sourceLineNo">4692</span>      Collection&lt;HStoreFile&gt; storeFiles = primaryRegion.getStore(families[0]).getStorefiles();<a name="line.4692"></a>
+<span class="sourceLineNo">4693</span>      primaryRegion.getRegionFileSystem().removeStoreFiles(Bytes.toString(families[0]), storeFiles);<a name="line.4693"></a>
+<span class="sourceLineNo">4694</span>      Collection&lt;StoreFileInfo&gt; storeFileInfos = primaryRegion.getRegionFileSystem()<a name="line.4694"></a>
+<span class="sourceLineNo">4695</span>          .getStoreFiles(families[0]);<a name="line.4695"></a>
+<span class="sourceLineNo">4696</span>      Assert.assertTrue(storeFileInfos == null || storeFileInfos.isEmpty());<a name="line.4696"></a>
+<span class="sourceLineNo">4697</span><a name="line.4697"></a>
+<span class="sourceLineNo">4698</span>      verifyData(secondaryRegion, 0, 1000, cq, families);<a name="line.4698"></a>
+<span class="sourceLineNo">4699</span>    } finally {<a name="line.4699"></a>
+<span class="sourceLineNo">4700</span>      if (primaryRegion != null) {<a name="line.4700"></a>
+<span class="sourceLineNo">4701</span>        HBaseTestingUtility.closeRegionAndWAL(primaryRegion);<a name="line.4701"></a>
+<span class="sourceLineNo">4702</span>      }<a name="line.4702"></a>
+<span class="sourceLineNo">4703</span>      if (secondaryRegion != null) {<a name="line.4703"></a>
+<span class="sourceLineNo">4704</span>        HBaseTestingUtility.closeRegionAndWAL(secondaryRegion);<a name="line.4704"></a>
+<span class="sourceLineNo">4705</span>      }<a name="line.4705"></a>
+<span class="sourceLineNo">4706</span>    }<a name="line.4706"></a>
 <span class="sourceLineNo">4707</span>  }<a name="line.4707"></a>
 <span class="sourceLineNo">4708</span><a name="line.4708"></a>
-<span class="sourceLineNo">4709</span>  static void putData(HRegion region, Durability durability,<a name="line.4709"></a>
-<span class="sourceLineNo">4710</span>      int startRow, int numRows, byte[] qf, byte[]... families) throws IOException {<a name="line.4710"></a>
-<span class="sourceLineNo">4711</span>    for (int i = startRow; i &lt; startRow + numRows; i++) {<a name="line.4711"></a>
-<span class="sourceLineNo">4712</span>      Put put = new Put(Bytes.toBytes("" + i));<a name="line.4712"></a>
-<span class="sourceLineNo">4713</span>      put.setDurability(durability);<a name="line.4713"></a>
-<span class="sourceLineNo">4714</span>      for (byte[] family : families) {<a name="line.4714"></a>
-<span class="sourceLineNo">4715</span>        put.addColumn(family, qf, null);<a name="line.4715"></a>
-<span class="sourceLineNo">4716</span>      }<a name="line.4716"></a>
-<span class="sourceLineNo">4717</span>      region.put(put);<a name="line.4717"></a>
-<span class="sourceLineNo">4718</span>      LOG.info(put.toString());<a name="line.4718"></a>
-<span class="sourceLineNo">4719</span>    }<a name="line.4719"></a>
-<span class="sourceLineNo">4720</span>  }<a name="line.4720"></a>
-<span class="sourceLineNo">4721</span><a name="line.4721"></a>
-<span class="sourceLineNo">4722</span>  static void verifyData(HRegion newReg, int startRow, int numRows, byte[] qf, byte[]... families)<a name="line.4722"></a>
-<span class="sourceLineNo">4723</span>      throws IOException {<a name="line.4723"></a>
-<span class="sourceLineNo">4724</span>    for (int i = startRow; i &lt; startRow + numRows; i++) {<a name="line.4724"></a>
-<span class="sourceLineNo">4725</span>      byte[] row = Bytes.toBytes("" + i);<a name="line.4725"></a>
-<span class="sourceLineNo">4726</span>      Get get = new Get(row);<a name="line.4726"></a>
-<span class="sourceLineNo">4727</span>      for (byte[] family : families) {<a name="line.4727"></a>
-<span class="sourceLineNo">4728</span>        get.addColumn(family, qf);<a name="line.4728"></a>
-<span class="sourceLineNo">4729</span>      }<a name="line.4729"></a>
-<span class="sourceLineNo">4730</span>      Result result = newReg.get(get);<a name="line.4730"></a>
-<span class="sourceLineNo">4731</span>      Cell[] raw = result.rawCells();<a name="line.4731"></a>
-<span class="sourceLineNo">4732</span>      assertEquals(families.length, result.size());<a name="line.4732"></a>
-<span class="sourceLineNo">4733</span>      for (int j = 0; j &lt; families.length; j++) {<a name="line.4733"></a>
-<span class="sourceLineNo">4734</span>        assertTrue(CellUtil.matchingRows(raw[j], row));<a name="line.4734"></a>
-<span class="sourceLineNo">4735</span>        assertTrue(CellUtil.matchingFamily(raw[j], families[j]));<a name="line.4735"></a>
-<span class="sourceLineNo">4736</span>        assertTrue(CellUtil.matchingQualifier(raw[j], qf));<a name="line.4736"></a>
-<span class="sourceLineNo">4737</span>      }<a name="line.4737"></a>
-<span class="sourceLineNo">4738</span>    }<a name="line.4738"></a>
-<span class="sourceLineNo">4739</span>  }<a name="line.4739"></a>
-<span class="sourceLineNo">4740</span><a name="line.4740"></a>
-<span class="sourceLineNo">4741</span>  static void assertGet(final HRegion r, final byte[] family, final byte[] k) throws IOException {<a name="line.4741"></a>
-<span class="sourceLineNo">4742</span>    // Now I have k, get values out and assert they are as expected.<a name="line.4742"></a>
-<span class="sourceLineNo">4743</span>    Get get = new Get(k).addFamily(family).readAllVersions();<a name="line.4743"></a>
-<span class="sourceLineNo">4744</span>    Cell[] results = r.get(get).rawCells();<a name="line.4744"></a>
-<span class="sourceLineNo">4745</span>    for (int j = 0; j &lt; results.length; j++) {<a name="line.4745"></a>
-<span class="sourceLineNo">4746</span>      byte[] tmp = CellUtil.cloneValue(results[j]);<a name="line.4746"></a>
-<span class="sourceLineNo">4747</span>      // Row should be equal to value every time.<a name="line.4747"></a>
-<span class="sourceLineNo">4748</span>      assertTrue(Bytes.equals(k, tmp));<a name="line.4748"></a>
-<span class="sourceLineNo">4749</span>    }<a name="line.4749"></a>
-<span class="sourceLineNo">4750</span>  }<a name="line.4750"></a>
-<span class="sourceLineNo">4751</span><a name="line.4751"></a>
-<span class="sourceLineNo">4752</span>  /*<a name="line.4752"></a>
-<span class="sourceLineNo">4753</span>   * Assert first value in the passed region is &lt;code&gt;firstValue&lt;/code&gt;.<a name="line.4753"></a>
-<span class="sourceLineNo">4754</span>   *<a name="line.4754"></a>
-<span class="sourceLineNo">4755</span>   * @param r<a name="line.4755"></a>
-<span class="sourceLineNo">4756</span>   *<a name="line.4756"></a>
-<span class="sourceLineNo">4757</span>   * @param fs<a name="line.4757"></a>
-<span class="sourceLineNo">4758</span>   *<a name="line.4758"></a>
-<span class="sourceLineNo">4759</span>   * @param firstValue<a name="line.4759"></a>
-<span class="sourceLineNo">4760</span>   *<a name="line.4760"></a>
-<span class="sourceLineNo">4761</span>   * @throws IOException<a name="line.4761"></a>
-<span class="sourceLineNo">4762</span>   */<a name="line.4762"></a>
-<span class="sourceLineNo">4763</span>  protected void assertScan(final HRegion r, final byte[] fs, final byte[] firstValue)<a name="line.4763"></a>
-<span class="sourceLineNo">4764</span>      throws IOException {<a name="line.4764"></a>
-<span class="sourceLineNo">4765</span>    byte[][] families = { fs };<a name="line.4765"></a>
-<span class="sourceLineNo">4766</span>    Scan scan = new Scan();<a name="line.4766"></a>
-<span class="sourceLineNo">4767</span>    for (int i = 0; i &lt; families.length; i++)<a name="line.4767"></a>
-<span class="sourceLineNo">4768</span>      scan.addFamily(families[i]);<a name="line.4768"></a>
-<span class="sourceLineNo">4769</span>    InternalScanner s = r.getScanner(scan);<a name="line.4769"></a>
-<span class="sourceLineNo">4770</span>    try {<a name="line.4770"></a>
-<span class="sourceLineNo">4771</span>      List&lt;Cell&gt; curVals = new ArrayList&lt;&gt;();<a name="line.4771"></a>
-<span class="sourceLineNo">4772</span>      boolean first = true;<a name="line.4772"></a>
-<span class="sourceLineNo">4773</span>      OUTER_LOOP: while (s.next(curVals)) {<a name="line.4773"></a>
-<span class="sourceLineNo">4774</span>        for (Cell kv : curVals) {<a name="line.4774"></a>
-<span class="sourceLineNo">4775</span>          byte[] val = CellUtil.cloneValue(kv);<a name="line.4775"></a>
-<span class="sourceLineNo">4776</span>          byte[] curval = val;<a name="line.4776"></a>
-<span class="sourceLineNo">4777</span>          if (first) {<a name="line.4777"></a>
-<span class="sourceLineNo">4778</span>            first = false;<a name="line.4778"></a>
-<span class="sourceLineNo">4779</span>            assertTrue(Bytes.compareTo(curval, firstValue) == 0);<a name="line.4779"></a>
-<span class="sourceLineNo">4780</span>          } else {<a name="line.4780"></a>
-<span class="sourceLineNo">4781</span>            // Not asserting anything. Might as well break.<a name="line.4781"></a>
-<span class="sourceLineNo">4782</span>            break OUTER_LOOP;<a name="line.4782"></a>
-<span class="sourceLineNo">4783</span>          }<a name="line.4783"></a>
-<span class="sourceLineNo">4784</span>        }<a name="line.4784"></a>
-<span class="sourceLineNo">4785</span>      }<a name="line.4785"></a>
-<span class="sourceLineNo">4786</span>    } finally {<a name="line.4786"></a>
-<span class="sourceLineNo">4787</span>      s.close();<a name="line.4787"></a>
-<span class="sourceLineNo">4788</span>    }<a name="line.4788"></a>
-<span class="sourceLineNo">4789</span>  }<a name="line.4789"></a>
-<span class="sourceLineNo">4790</span><a name="line.4790"></a>
-<span class="sourceLineNo">4791</span>  /**<a name="line.4791"></a>
-<span class="sourceLineNo">4792</span>   * Test that we get the expected flush results back<a name="line.4792"></a>
-<span class="sourceLineNo">4793</span>   */<a name="line.4793"></a>
-<span class="sourceLineNo">4794</span>  @Test<a name="line.4794"></a>
-<span class="sourceLineNo">4795</span>  public void testFlushResult() throws IOException {<a name="line.4795"></a>
-<span class="sourceLineNo">4796</span>    byte[] family = Bytes.toBytes("family");<a name="line.4796"></a>
-<span class="sourceLineNo">4797</span><a name="line.4797"></a>
-<span class="sourceLineNo">4798</span>    this.region = initHRegion(tableName, method, family);<a name="line.4798"></a>
-<span class="sourceLineNo">4799</span><a name="line.4799"></a>
-<span class="sourceLineNo">4800</span>    // empty memstore, flush doesn't run<a name="line.4800"></a>
-<span class="sourceLineNo">4801</span>    HRegion.FlushResult fr = region.flush(true);<a name="line.4801"></a>
-<span class="sourceLineNo">4802</span>    assertFalse(fr.isFlushSucceeded());<a name="line.4802"></a>
-<span class="sourceLineNo">4803</span>    assertFalse(fr.isCompactionNeeded());<a name="line.4803"></a>
-<span class="sourceLineNo">4804</span><a name="line.4804"></a>
-<span class="sourceLineNo">4805</span>    // Flush enough files to get up to the threshold, doesn't need compactions<a name="line.4805"></a>
-<span class="sourceLineNo">4806</span>    for (int i = 0; i &lt; 2; i++) {<a name="line.4806"></a>
-<span class="sourceLineNo">4807</span>      Put put = new Put(tableName.toBytes()).addColumn(family, family, tableName.toBytes());<a name="line.4807"></a>
-<span class="sourceLineNo">4808</span>      region.put(put);<a name="line.4808"></a>
-<span class="sourceLineNo">4809</span>      fr = region.flush(true);<a name="line.4809"></a>
-<span class="sourceLineNo">4810</span>      assertTrue(fr.isFlushSucceeded());<a name="line.4810"></a>
-<span class="sourceLineNo">4811</span>      assertFalse(fr.isCompactionNeeded());<a name="line.4811"></a>
-<span class="sourceLineNo">4812</span>    }<a name="line.4812"></a>
-<span class="sourceLineNo">4813</span><a name="line.4813"></a>
-<span class="sourceLineNo">4814</span>    // Two flushes after the threshold, compactions are needed<a name="line.4814"></a>
-<span class="sourceLineNo">4815</span>    for (int i = 0; i &lt; 2; i++) {<a name="line.4815"></a>
-<span class="sourceLineNo">4816</span>      Put put = new Put(tableName.toBytes()).addColumn(family, family, tableName.toBytes());<a name="line.4816"></a>
-<span class="sourceLineNo">4817</span>      region.put(put);<a name="line.4817"></a>
-<span class="sourceLineNo">4818</span>      fr = region.flush(true);<a name="line.4818"></a>
-<span class="sourceLineNo">4819</span>      assertTrue(fr.isFlushSucceeded());<a name="line.4819"></a>
-<span class="sourceLineNo">4820</span>      assertTrue(fr.isCompactionNeeded());<a name="line.4820"></a>
-<span class="sourceLineNo">4821</span>    }<a name="line.4821"></a>
-<span class="sourceLineNo">4822</span>  }<a name="line.4822"></a>
+<span class="sourceLineNo">4709</span>  private void putData(int startRow, int numRows, byte[] qf, byte[]... families) throws<a name="line.4709"></a>
+<span class="sourceLineNo">4710</span>      IOException {<a name="line.4710"></a>
+<span class="sourceLineNo">4711</span>    putData(this.region, startRow, numRows, qf, families);<a name="line.4711"></a>
+<span class="sourceLineNo">4712</span>  }<a name="line.4712"></a>
+<span class="sourceLineNo">4713</span><a name="line.4713"></a>
+<span class="sourceLineNo">4714</span>  private void putData(HRegion region,<a name="line.4714"></a>
+<span class="sourceLineNo">4715</span>      int startRow, int numRows, byte[] qf, byte[]... families) throws IOException {<a name="line.4715"></a>
+<span class="sourceLineNo">4716</span>    putData(region, Durability.SKIP_WAL, startRow, numRows, qf, families);<a name="line.4716"></a>
+<span class="sourceLineNo">4717</span>  }<a name="line.4717"></a>
+<span class="sourceLineNo">4718</span><a name="line.4718"></a>
+<span class="sourceLineNo">4719</span>  static void putData(HRegion region, Durability durability,<a name="line.4719"></a>
+<span class="sourceLineNo">4720</span>      int startRow, int numRows, byte[] qf, byte[]... families) throws IOException {<a name="line.4720"></a>
+<span class="sourceLineNo">4721</span>    for (int i = startRow; i &lt; startRow + numRows; i++) {<a name="line.4721"></a>
+<span class="sourceLineNo">4722</span>      Put put = new Put(Bytes.toBytes("" + i));<a name="line.4722"></a>
+<span class="sourceLineNo">4723</span>      put.setDurability(durability);<a name="line.4723"></a>
+<span class="sourceLineNo">4724</span>      for (byte[] family : families) {<a name="line.4724"></a>
+<span class="sourceLineNo">4725</span>        put.addColumn(family, qf, null);<a name="line.4725"></a>
+<span class="sourceLineNo">4726</span>      }<a name="line.4726"></a>
+<span class="sourceLineNo">4727</span>      region.put(put);<a name="line.4727"></a>
+<span class="sourceLineNo">4728</span>      LOG.info(put.toString());<a name="line.4728"></a>
+<span class="sourceLineNo">4729</span>    }<a name="line.4729"></a>
+<span class="sourceLineNo">4730</span>  }<a name="line.4730"></a>
+<span class="sourceLineNo">4731</span><a name="line.4731"></a>
+<span class="sourceLineNo">4732</span>  static void verifyData(HRegion newReg, int startRow, int numRows, byte[] qf, byte[]... families)<a name="line.4732"></a>
+<span class="sourceLineNo">4733</span>      throws IOException {<a name="line.4733"></a>
+<span class="sourceLineNo">4734</span>    for (int i = startRow; i &lt; startRow + numRows; i++) {<a name="line.4734"></a>
+<span class="sourceLineNo">4735</span>      byte[] row = Bytes.toBytes("" + i);<a name="line.4735"></a>
+<span class="sourceLineNo">4736</span>      Get get = new Get(row);<a name="line.4736"></a>
+<span class="sourceLineNo">4737</span>      for (byte[] family : families) {<a name="line.4737"></a>
+<span class="sourceLineNo">4738</span>        get.addColumn(family, qf);<a name="line.4738"></a>
+<span class="sourceLineNo">4739</span>      }<a name="line.4739"></a>
+<span class="sourceLineNo">4740</span>      Result result = newReg.get(get);<a name="line.4740"></a>
+<span class="sourceLineNo">4741</span>      Cell[] raw = result.rawCells();<a name="line.4741"></a>
+<span class="sourceLineNo">4742</span>      assertEquals(families.length, result.size());<a name="line.4742"></a>
+<span class="sourceLineNo">4743</span>      for (int j = 0; j &lt; families.length; j++) {<a name="line.4743"></a>
+<span class="sourceLineNo">4744</span>        assertTrue(CellUtil.matchingRows(raw[j], row));<a name="line.4744"></a>
+<span class="sourceLineNo">4745</span>        assertTrue(CellUtil.matchingFamily(raw[j], families[j]));<a name="line.4745"></a>
+<span class="sourceLineNo">4746</span>        assertTrue(CellUtil.matchingQualifier(raw[j], qf));<a name="line.4746"></a>
+<span class="sourceLineNo">4747</span>      }<a name="line.4747"></a>
+<span class="sourceLineNo">4748</span>    }<a name="line.4748"></a>
+<span class="sourceLineNo">4749</span>  }<a name="line.4749"></a>
+<span class="sourceLineNo">4750</span><a name="line.4750"></a>
+<span class="sourceLineNo">4751</span>  static void assertGet(final HRegion r, final byte[] family, final byte[] k) throws IOException {<a name="line.4751"></a>
+<span class="sourceLineNo">4752</span>    // Now I have k, get values out and assert they are as expected.<a name="line.4752"></a>
+<span class="sourceLineNo">4753</span>    Get get = new Get(k).addFamily(family).readAllVersions();<a name="line.4753"></a>
+<span class="sourceLineNo">4754</span>    Cell[] results = r.get(get).rawCells();<a name="line.4754"></a>
+<span class="sourceLineNo">4755</span>    for (int j = 0; j &lt; results.length; j++) {<a name="line.4755"></a>
+<span class="sourceLineNo">4756</span>      byte[] tmp = CellUtil.cloneValue(results[j]);<a name="line.4756"></a>
+<span class="sourceLineNo">4757</span>      // Row should be equal to value every time.<a name="line.4757"></a>
+<span class="sourceLineNo">4758</span>      assertTrue(Bytes.equals(k, tmp));<a name="line.4758"></a>
+<span class="sourceLineNo">4759</span>    }<a name="line.4759"></a>
+<span class="sourceLineNo">4760</span>  }<a name="line.4760"></a>
+<span class="sourceLineNo">4761</span><a name="line.4761"></a>
+<span class="sourceLineNo">4762</span>  /*<a name="line.4762"></a>
+<span class="sourceLineNo">4763</span>   * Assert first value in the passed region is &lt;code&gt;firstValue&lt;/code&gt;.<a name="line.4763"></a>
+<span class="sourceLineNo">4764</span>   *<a name="line.4764"></a>
+<span class="sourceLineNo">4765</span>   * @param r<a name="line.4765"></a>
+<span class="sourceLineNo">4766</span>   *<a name="line.4766"></a>
+<span class="sourceLineNo">4767</span>   * @param fs<a name="line.4767"></a>
+<span class="sourceLineNo">4768</span>   *<a name="line.4768"></a>
+<span class="sourceLineNo">4769</span>   * @param firstValue<a name="line.4769"></a>
+<span class="sourceLineNo">4770</span>   *<a name="line.4770"></a>
+<span class="sourceLineNo">4771</span>   * @throws IOException<a name="line.4771"></a>
+<span class="sourceLineNo">4772</span>   */<a name="line.4772"></a>
+<span class="sourceLineNo">4773</span>  protected void assertScan(final HRegion r, final byte[] fs, final byte[] firstValue)<a name="line.4773"></a>
+<span class="sourceLineNo">4774</span>      throws IOException {<a name="line.4774"></a>
+<span class="sourceLineNo">4775</span>    byte[][] families = { fs };<a name="line.4775"></a>
+<span class="sourceLineNo">4776</span>    Scan scan = new Scan();<a name="line.4776"></a>
+<span class="sourceLineNo">4777</span>    for (int i = 0; i &lt; families.length; i++)<a name="line.4777"></a>
+<span class="sourceLineNo">4778</span>      scan.addFamily(families[i]);<a name="line.4778"></a>
+<span class="sourceLineNo">4779</span>    InternalScanner s = r.getScanner(scan);<a name="line.4779"></a>
+<span class="sourceLineNo">4780</span>    try {<a name="line.4780"></a>
+<span class="sourceLineNo">4781</span>      List&lt;Cell&gt; curVals = new ArrayList&lt;&gt;();<a name="line.4781"></a>
+<span class="sourceLineNo">4782</span>      boolean first = true;<a name="line.4782"></a>
+<span class="sourceLineNo">4783</span>      OUTER_LOOP: while (s.next(curVals)) {<a name="line.4783"></a>
+<span class="sourceLineNo">4784</span>        for (Cell kv : curVals) {<a name="line.4784"></a>
+<span class="sourceLineNo">4785</span>          byte[] val = CellUtil.cloneValue(kv);<a name="line.4785"></a>
+<span class="sourceLineNo">4786</span>          byte[] curval = val;<a name="line.4786"></a>
+<span class="sourceLineNo">4787</span>          if (first) {<a name="line.4787"></a>
+<span class="sourceLineNo">4788</span>            first = false;<a name="line.4788"></a>
+<span class="sourceLineNo">4789</span>            assertTrue(Bytes.compareTo(curval, firstValue) == 0);<a name="line.4789"></a>
+<span class="sourceLineNo">4790</span>          } else {<a name="line.4790"></a>
+<span class="sourceLineNo">4791</span>            // Not asserting anything. Might as well break.<a name="line.4791"></a>
+<span class="sourceLineNo">4792</span>            break OUTER_LOOP;<a name="line.4792"></a>
+<span class="sourceLineNo">4793</span>          }<a name="line.4793"></a>
+<span class="sourceLineNo">4794</span>        }<a name="line.4794"></a>
+<span class="sourceLineNo">4795</span>      }<a name="line.4795"></a>
+<span class="sourceLineNo">4796</span>    } finally {<a name="line.4796"></a>
+<span class="sourceLineNo">4797</span>      s.close();<a name="line.4797"></a>
+<span class="sourceLineNo">4798</span>    }<a name="line.4798"></a>
+<span class="sourceLineNo">4799</span>  }<a name="line.4799"></a>
+<span class="sourceLineNo">4800</span><a name="line.4800"></a>
+<span class="sourceLineNo">4801</span>  /**<a name="line.4801"></a>
+<span class="sourceLineNo">4802</span>   * Test that we get the expected flush results back<a name="line.4802"></a>
+<span class="sourceLineNo">4803</span>   */<a name="line.4803"></a>
+<span class="sourceLineNo">4804</span>  @Test<a name="line.4804"></a>
+<span class="sourceLineNo">4805</span>  public void testFlushResult() throws IOException {<a name="line.4805"></a>
+<span class="sourceLineNo">4806</span>    byte[] family = Bytes.toBytes("family");<a name="line.4806"></a>
+<span class="sourceLineNo">4807</span><a name="line.4807"></a>
+<span class="sourceLineNo">4808</span>    this.region = initHRegion(tableName, method, family);<a name="line.4808"></a>
+<span class="sourceLineNo">4809</span><a name="line.4809"></a>
+<span class="sourceLineNo">4810</span>    // empty memstore, flush doesn't run<a name="line.4810"></a>
+<span class="sourceLineNo">4811</span>    HRegion.FlushResult fr = region.flush(true);<a name="line.4811"></a>
+<span class="sourceLineNo">4812</span>    assertFalse(fr.isFlushSucceeded());<a name="line.4812"></a>
+<span class="sourceLineNo">4813</span>    assertFalse(fr.isCompactionNeeded());<a name="line.4813"></a>
+<span class="sourceLineNo">4814</span><a name="line.4814"></a>
+<span class="sourceLineNo">4815</span>    // Flush enough files to get up to the threshold, doesn't need compactions<a name="line.4815"></a>
+<span class="sourceLineNo">4816</span>    for (int i = 0; i &lt; 2; i++) {<a name="line.4816"></a>
+<span class="sourceLineNo">4817</span>      Put put = new Put(tableName.toBytes()).addColumn(family, family, tableName.toBytes());<a name="line.4817"></a>
+<span class="sourceLineNo">4818</span>      region.put(put);<a name="line.4818"></a>
+<span class="sourceLineNo">4819</span>      fr = region.flush(true);<a name="line.4819"></a>
+<span class="sourceLineNo">4820</span>      assertTrue(fr.isFlushSucceeded());<a name="line.4820"></a>
+<span class="sourceLineNo">4821</span>      assertFalse(fr.isCompactionNeeded());<a name="line.4821"></a>
+<span class="sourceLineNo">4822</span>    }<a name="line.4822"></a>
 <span class="sourceLineNo">4823</span><a name="line.4823"></a>
-<span class="sourceLineNo">4824</span>  protected Configuration initSplit() {<a name="line.4824"></a>
-<span class="sourceLineNo">4825</span>    // Always compact if there is more than one store file.<a name="line.4825"></a>
-<span class="sourceLineNo">4826</span>    CONF.setInt("hbase.hstore.compactionThreshold", 2);<a name="line.4826"></a>
-<span class="sourceLineNo">4827</span><a name="line.4827"></a>
-<span class="sourceLineNo">4828</span>    CONF.setInt(HConstants.HBASE_CLIENT_SCANNER_TIMEOUT_PERIOD, 10 * 1000);<a name="line.4828"></a>
-<span class="sourceLineNo">4829</span><a name="line.4829"></a>
-<span class="sourceLineNo">4830</span>    // Increase the amount of time between client retries<a name="line.4830"></a>
-<span class="sourceLineNo">4831</span>    CONF.setLong("hbase.client.pause", 15 * 1000);<a name="line.4831"></a>
-<span class="sourceLineNo">4832</span><a name="line.4832"></a>
-<span class="sourceLineNo">4833</span>    // This size should make it so we always split using the addContent<a name="line.4833"></a>
-<span class="sourceLineNo">4834</span>    // below. After adding all data, the first region is 1.3M<a name="line.4834"></a>
-<span class="sourceLineNo">4835</span>    CONF.setLong(HConstants.HREGION_MAX_FILESIZE, 1024 * 128);<a name="line.4835"></a>
-<span class="sourceLineNo">4836</span>    return CONF;<a name="line.4836"></a>
-<span class="sourceLineNo">4837</span>  }<a name="line.4837"></a>
-<span class="sourceLineNo">4838</span><a name="line.4838"></a>
-<span class="sourceLineNo">4839</span>  /**<a name="line.4839"></a>
-<span class="sourceLineNo">4840</span>   * @return A region on which you must call<a name="line.4840"></a>
-<span class="sourceLineNo">4841</span>   *         {@link HBaseTestingUtility#closeRegionAndWAL(HRegion)} when done.<a name="line.4841"></a>
-<span class="sourceLineNo">4842</span>   */<a name="line.4842"></a>
-<span class="sourceLineNo">4843</span>  protected HRegion initHRegion(TableName tableName, String callingMethod, Configuration conf,<a name="line.4843"></a>
-<span class="sourceLineNo">4844</span>      byte[]... families) throws IOException {<a name="line.4844"></a>
-<span class="sourceLineNo">4845</span>    return initHRegion(tableName, callingMethod, conf, false, families);<a name="line.4845"></a>
-<span class="sourceLineNo">4846</span>  }<a name="line.4846"></a>
-<span class="sourceLineNo">4847</span><a name="line.4847"></a>
-<span class="sourceLineNo">4848</span>  /**<a name="line.4848"></a>
-<span class="sourceLineNo">4849</span>   * @return A region on which you must call<a name="line.4849"></a>
-<span class="sourceLineNo">4850</span>   *         {@link HBaseTestingUtility#closeRegionAndWAL(HRegion)} when done.<a name="line.4850"></a>
-<span class="sourceLineNo">4851</span>   */<a name="line.4851"></a>
-<span class="sourceLineNo">4852</span>  protected HRegion initHRegion(TableName tableName, String callingMethod, Configuration conf,<a name="line.4852"></a>
-<span class="sourceLineNo">4853</span>      boolean isReadOnly, byte[]... families) throws IOException {<a name="line.4853"></a>
-<span class="sourceLineNo">4854</span>    return initHRegion(tableName, null, null, callingMethod, conf, isReadOnly, families);<a name="line.4854"></a>
-<span class="sourceLineNo">4855</span>  }<a name="line.4855"></a>
-<span class="sourceLineNo">4856</span><a name="line.4856"></a>
-<span class="sourceLineNo">4857</span>  protected HRegion initHRegion(TableName tableName, byte[] startKey, byte[] stopKey,<a name="line.4857"></a>
-<span class="sourceLineNo">4858</span>      String callingMethod, Configuration conf, boolean isReadOnly, byte[]... families)<a name="line.4858"></a>
-<span class="sourceLineNo">4859</span>      throws IOException {<a name="line.4859"></a>
-<span class="sourceLineNo">4860</span>    Path logDir = TEST_UTIL.getDataTestDirOnTestFS(callingMethod + ".log");<a name="line.4860"></a>
-<span class="sourceLineNo">4861</span>    ChunkCreator.initialize(MemStoreLABImpl.CHUNK_SIZE_DEFAULT, false, 0, 0, 0, null);<a name="line.4861"></a>
-<span class="sourceLineNo">4862</span>    HRegionInfo hri = new HRegionInfo(tableName, startKey, stopKey);<a name="line.4862"></a>
-<span class="sourceLineNo">4863</span>    final WAL wal = HBaseTestingUtility.createWal(conf, logDir, hri);<a name="line.4863"></a>
-<span class="sourceLineNo">4864</span>    return initHRegion(tableName, startKey, stopKey, isReadOnly,<a name="line.4864"></a>
-<span class="sourceLineNo">4865</span>        Durability.SYNC_WAL, wal, families);<a name="line.4865"></a>
-<span class="sourceLineNo">4866</span>  }<a name="line.4866"></a>
-<span class="sourceLineNo">4867</span><a name="line.4867"></a>
-<span class="sourceLineNo">4868</span>  /**<a name="line.4868"></a>
-<span class="sourceLineNo">4869</span>   * @return A region on which you must call<a name="line.4869"></a>
-<span class="sourceLineNo">4870</span>   *         {@link HBaseTestingUtility#closeRegionAndWAL(HRegion)} when done.<a name="line.4870"></a>
-<span class="sourceLineNo">4871</span>   */<a name="line.4871"></a>
-<span class="sourceLineNo">4872</span>  public HRegion initHRegion(TableName tableName, byte[] startKey, byte[] stopKey,<a name="line.4872"></a>
-<span class="sourceLineNo">4873</span>      boolean isReadOnly, Durability durability, WAL wal, byte[]... families) throws IOException {<a name="line.4873"></a>
-<span class="sourceLineNo">4874</span>    return TEST_UTIL.createLocalHRegion(tableName, startKey, stopKey,<a name="line.4874"></a>
-<span class="sourceLineNo">4875</span>        isReadOnly, durability, wal, families);<a name="line.4875"></a>
+<span class="sourceLineNo">4824</span>    // Two flushes after the threshold, compactions are needed<a name="line.4824"></a>
+<span class="sourceLineNo">4825</span>    for (int i = 0; i &lt; 2; i++) {<a name="line.4825"></a>
+<span class="sourceLineNo">4826</span>      Put put = new Put(tableName.toBytes()).addColumn(family, family, tableName.toBytes());<a name="line.4826"></a>
+<span class="sourceLineNo">4827</span>      region.put(put);<a name="line.4827"></a>
+<span class="sourceLineNo">4828</span>      fr = region.flush(true);<a name="line.4828"></a>
+<span class="sourceLineNo">4829</span>      assertTrue(fr.isFlushSucceeded());<a name="line.4829"></a>
+<span class="sourceLineNo">4830</span>      assertTrue(fr.isCompactionNeeded());<a name="line.4830"></a>
+<span class="sourceLineNo">4831</span>    }<a name="line.4831"></a>
+<span class="sourceLineNo">4832</span>  }<a name="line.4832"></a>
+<span class="sourceLineNo">4833</span><a name="line.4833"></a>
+<span class="sourceLineNo">4834</span>  protected Configuration initSplit() {<a name="line.4834"></a>
+<span class="sourceLineNo">4835</span>    // Always compact if there is more than one store file.<a name="line.4835"></a>
+<span class="sourceLineNo">4836</span>    CONF.setInt("hbase.hstore.compactionThreshold", 2);<a name="line.4836"></a>
+<span class="sourceLineNo">4837</span><a name="line.4837"></a>
+<span class="sourceLineNo">4838</span>    CONF.setInt(HConstants.HBASE_CLIENT_SCANNER_TIMEOUT_PERIOD, 10 * 1000);<a name="line.4838"></a>
+<span class="sourceLineNo">4839</span><a name="line.4839"></a>
+<span class="sourceLineNo">4840</span>    // Increase the amount of time between client retries<a name="line.4840"></a>
+<span class="sourceLineNo">4841</span>    CONF.setLong("hbase.client.pause", 15 * 1000);<a name="line.4841"></a>
+<span class="sourceLineNo">4842</span><a name="line.4842"></a>
+<span class="sourceLineNo">4843</span>    // This size should make it so we always split using the addContent<a name="line.4843"></a>
+<span class="sourceLineNo">4844</span>    // below. After adding all data, the first region is 1.3M<a name="line.4844"></a>
+<span class="sourceLineNo">4845</span>    CONF.setLong(HConstants.HREGION_MAX_FILESIZE, 1024 * 128);<a name="line.4845"></a>
+<span class="sourceLineNo">4846</span>    return CONF;<a name="line.4846"></a>
+<span class="sourceLineNo">4847</span>  }<a name="line.4847"></a>
+<span class="sourceLineNo">4848</span><a name="line.4848"></a>
+<span class="sourceLineNo">4849</span>  /**<a name="line.4849"></a>
+<span class="sourceLineNo">4850</span>   * @return A region on which you must call<a name="line.4850"></a>
+<span class="sourceLineNo">4851</span>   *         {@link HBaseTestingUtility#closeRegionAndWAL(HRegion)} when done.<a name="line.4851"></a>
+<span class="sourceLineNo">4852</span>   */<a name="line.4852"></a>
+<span class="sourceLineNo">4853</span>  protected HRegion initHRegion(TableName tableName, String callingMethod, Configuration conf,<a name="line.4853"></a>
+<span class="sourceLineNo">4854</span>      byte[]... families) throws IOException {<a name="line.4854"></a>
+<span class="sourceLineNo">4855</span>    return initHRegion(tableName, callingMethod, conf, false, families);<a name="line.4855"></a>
+<span class="sourceLineNo">4856</span>  }<a name="line.4856"></a>
+<span class="sourceLineNo">4857</span><a name="line.4857"></a>
+<span class="sourceLineNo">4858</span>  /**<a name="line.4858"></a>
+<span class="sourceLineNo">4859</span>   * @return A region on which you must call<a name="line.4859"></a>
+<span class="sourceLineNo">4860</span>   *         {@link HBaseTestingUtility#closeRegionAndWAL(HRegion)} when done.<a name="line.4860"></a>
+<span class="sourceLineNo">4861</span>   */<a name="line.4861"></a>
+<span class="sourceLineNo">4862</span>  protected HRegion initHRegion(TableName tableName, String callingMethod, Configuration conf,<a name="line.4862"></a>
+<span class="sourceLineNo">4863</span>      boolean isReadOnly, byte[]... families) throws IOException {<a name="line.4863"></a>
+<span class="sourceLineNo">4864</span>    return initHRegion(tableName, null, null, callingMethod, conf, isReadOnly, families);<a name="line.4864"></a>
+<span class="sourceLineNo">4865</span>  }<a name="line.4865"></a>
+<span class="sourceLineNo">4866</span><a name="line.4866"></a>
+<span class="sourceLineNo">4867</span>  protected HRegion initHRegion(TableName tableName, byte[] startKey, byte[] stopKey,<a name="line.4867"></a>
+<span class="sourceLineNo">4868</span>      String callingMethod, Configuration conf, boolean isReadOnly, byte[]... families)<a name="line.4868"></a>
+<span class="sourceLineNo">4869</span>      throws IOException {<a name="line.4869"></a>
+<span class="sourceLineNo">4870</span>    Path logDir = TEST_UTIL.getDataTestDirOnTestFS(callingMethod + ".log");<a name="line.4870"></a>
+<span class="sourceLineNo">4871</span>    ChunkCreator.initialize(MemStoreLABImpl.CHUNK_SIZE_DEFAULT, false, 0, 0, 0, null);<a name="line.4871"></a>
+<span class="sourceLineNo">4872</span>    HRegionInfo hri = new HRegionInfo(tableName, startKey, stopKey);<a name="line.4872"></a>
+<span class="sourceLineNo">4873</span>    final WAL wal = HBaseTestingUtility.createWal(conf, logDir, hri);<a name="line.4873"></a>
+<span class="sourceLineNo">4874</span>    return initHRegion(tableName, startKey, stopKey, isReadOnly,<a name="line.4874"></a>
+<span class="sourceLineNo">4875</span>        Durability.SYNC_WAL, wal, families);<a name="line.4875"></a>
 <span class="sourceLineNo">4876</span>  }<a name="line.4876"></a>
 <span class="sourceLineNo">4877</span><a name="line.4877"></a>
 <span class="sourceLineNo">4878</span>  /**<a name="line.4878"></a>
-<span class="sourceLineNo">4879</span>   * Assert that the passed in Cell has expected contents for the specified row,<a name="line.4879"></a>
-<span class="sourceLineNo">4880</span>   * column &amp; timestamp.<a name="line.4880"></a>
+<span class="sourceLineNo">4879</span>   * @return A region on which you must call<a name="line.4879"></a>
+<span class="sourceLineNo">4880</span>   *         {@link HBaseTestingUtility#closeRegionAndWAL(HRegion)} when done.<a name="line.4880"></a>
 <span class="sourceLineNo">4881</span>   */<a name="line.4881"></a>
-<span class="sourceLineNo">4882</span>  private void checkOneCell(Cell kv, byte[] cf, int rowIdx, int colIdx, long ts) {<a name="line.4882"></a>
-<span class="sourceLineNo">4883</span>    String ctx = "rowIdx=" + rowIdx + "; colIdx=" + colIdx + "; ts=" + ts;<a name="line.4883"></a>
-<span class="sourceLineNo">4884</span>    assertEquals("Row mismatch which checking: " + ctx, "row:" + rowIdx,<a name="line.4884"></a>
-<span class="sourceLineNo">4885</span>        Bytes.toString(CellUtil.cloneRow(kv)));<a name="line.4885"></a>
-<span class="sourceLineNo">4886</span>    assertEquals("ColumnFamily mismatch while checking: " + ctx, Bytes.toString(cf),<a name="line.4886"></a>
-<span class="sourceLineNo">4887</span>        Bytes.toString(CellUtil.cloneFamily(kv)));<a name="line.4887"></a>
-<span class="sourceLineNo">4888</span>    assertEquals("Column qualifier mismatch while checking: " + ctx, "column:" + colIdx,<a name="line.4888"></a>
-<span class="sourceLineNo">4889</span>        Bytes.toString(CellUtil.cloneQualifier(kv)));<a name="line.4889"></a>
-<span class="sourceLineNo">4890</span>    assertEquals("Timestamp mismatch while checking: " + ctx, ts, kv.getTimestamp());<a name="line.4890"></a>
-<span class="sourceLineNo">4891</span>    assertEquals("Value mismatch while checking: " + ctx, "value-version-" + ts,<a name="line.4891"></a>
-<span class="sourceLineNo">4892</span>        Bytes.toString(CellUtil.cloneValue(kv)));<a name="line.4892"></a>
-<span class="sourceLineNo">4893</span>  }<a name="line.4893"></a>
-<span class="sourceLineNo">4894</span><a name="line.4894"></a>
-<span class="sourceLineNo">4895</span>  @Test<a name="line.4895"></a>
-<span class="sourceLineNo">4896</span>  public void testReverseScanner_FromMemStore_SingleCF_Normal()<a name="line.4896"></a>
-<span class="sourceLineNo">4897</span>      throws IOException {<a name="line.4897"></a>
-<span class="sourceLineNo">4898</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.4898"></a>
-<span class="sourceLineNo">4899</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.4899"></a>
-<span class="sourceLineNo">4900</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.4900"></a>
-<span class="sourceLineNo">4901</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.4901"></a>
-<span class="sourceLineNo">4902</span>    byte[][] families = { cf };<a name="line.4902"></a>
-<span class="sourceLineNo">4903</span>    byte[] col = Bytes.toBytes("C");<a name="line.4903"></a>
-<span class="sourceLineNo">4904</span>    long ts = 1;<a name="line.4904"></a>
-<span class="sourceLineNo">4905</span>    this.region = initHRegion(tableName, method, families);<a name="line.4905"></a>
-<span class="sourceLineNo">4906</span>    KeyValue kv1 = new KeyValue(rowC, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4906"></a>
-<span class="sourceLineNo">4907</span>    KeyValue kv11 = new KeyValue(rowC, cf, col, ts + 1, KeyValue.Type.Put,<a name="line.4907"></a>
-<span class="sourceLineNo">4908</span>        null);<a name="line.4908"></a>
-<span class="sourceLineNo">4909</span>    KeyValue kv2 = new KeyValue(rowA, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4909"></a>
-<span class="sourceLineNo">4910</span>    KeyValue kv3 = new KeyValue(rowB, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4910"></a>
-<span class="sourceLineNo">4911</span>    Put put = null;<a name="line.4911"></a>
-<span class="sourceLineNo">4912</span>    put = new Put(rowC);<a name="line.4912"></a>
-<span class="sourceLineNo">4913</span>    put.add(kv1);<a name="line.4913"></a>
-<span class="sourceLineNo">4914</span>    put.add(kv11);<a name="line.4914"></a>
-<span class="sourceLineNo">4915</span>    region.put(put);<a name="line.4915"></a>
-<span class="sourceLineNo">4916</span>    put = new Put(rowA);<a name="line.4916"></a>
-<span class="sourceLineNo">4917</span>    put.add(kv2);<a name="line.4917"></a>
-<span class="sourceLineNo">4918</span>    region.put(put);<a name="line.4918"></a>
-<span class="sourceLineNo">4919</span>    put = new Put(rowB);<a name="line.4919"></a>
-<span class="sourceLineNo">4920</span>    put.add(kv3);<a name="line.4920"></a>
-<span class="sourceLineNo">4921</span>    region.put(put);<a name="line.4921"></a>
-<span class="sourceLineNo">4922</span><a name="line.4922"></a>
-<span class="sourceLineNo">4923</span>    Scan scan = new Scan(rowC);<a name="line.4923"></a>
-<span class="sourceLineNo">4924</span>    scan.setMaxVersions(5);<a name="line.4924"></a>
-<span class="sourceLineNo">4925</span>    scan.setReversed(true);<a name="line.4925"></a>
-<span class="sourceLineNo">4926</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.4926"></a>
-<span class="sourceLineNo">4927</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.4927"></a>
-<span class="sourceLineNo">4928</span>    boolean hasNext = scanner.next(currRow);<a name="line.4928"></a>
-<span class="sourceLineNo">4929</span>    assertEquals(2, currRow.size());<a name="line.4929"></a>
-<span class="sourceLineNo">4930</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4930"></a>
-<span class="sourceLineNo">4931</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.4931"></a>
-<span class="sourceLineNo">4932</span>    assertTrue(hasNext);<a name="line.4932"></a>
-<span class="sourceLineNo">4933</span>    currRow.clear();<a name="line.4933"></a>
-<span class="sourceLineNo">4934</span>    hasNext = scanner.next(currRow);<a name="line.4934"></a>
-<span class="sourceLineNo">4935</span>    assertEquals(1, currRow.size());<a name="line.4935"></a>
-<span class="sourceLineNo">4936</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4936"></a>
-<span class="sourceLineNo">4937</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.4937"></a>
-<span class="sourceLineNo">4938</span>    assertTrue(hasNext);<a name="line.4938"></a>
-<span class="sourceLineNo">4939</span>    currRow.clear();<a name="line.4939"></a>
-<span class="sourceLineNo">4940</span>    hasNext = scanner.next(currRow);<a name="line.4940"></a>
-<span class="sourceLineNo">4941</span>    assertEquals(1, currRow.size());<a name="line.4941"></a>
-<span class="sourceLineNo">4942</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4942"></a>
-<span class="sourceLineNo">4943</span>        .get(0).getRowLength(), rowA, 0, rowA.length));<a name="line.4943"></a>
-<span class="sourceLineNo">4944</span>    assertFalse(hasNext);<a name="line.4944"></a>
-<span class="sourceLineNo">4945</span>    scanner.close();<a name="line.4945"></a>
-<span class="sourceLineNo">4946</span>  }<a name="line.4946"></a>
-<span class="sourceLineNo">4947</span><a name="line.4947"></a>
-<span class="sourceLineNo">4948</span>  @Test<a name="line.4948"></a>
-<span class="sourceLineNo">4949</span>  public void testReverseScanner_FromMemStore_SingleCF_LargerKey()<a name="line.4949"></a>
-<span class="sourceLineNo">4950</span>      throws IOException {<a name="line.4950"></a>
-<span class="sourceLineNo">4951</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.4951"></a>
-<span class="sourceLineNo">4952</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.4952"></a>
-<span class="sourceLineNo">4953</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.4953"></a>
-<span class="sourceLineNo">4954</span>    byte[] rowD = Bytes.toBytes("rowD");<a name="line.4954"></a>
-<span class="sourceLineNo">4955</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.4955"></a>
-<span class="sourceLineNo">4956</span>    byte[][] families = { cf };<a name="line.4956"></a>
-<span class="sourceLineNo">4957</span>    byte[] col = Bytes.toBytes("C");<a name="line.4957"></a>
-<span class="sourceLineNo">4958</span>    long ts = 1;<a name="line.4958"></a>
-<span class="sourceLineNo">4959</span>    this.region = initHRegion(tableName, method, families);<a name="line.4959"></a>
-<span class="sourceLineNo">4960</span>    KeyValue kv1 = new KeyValue(rowC, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4960"></a>
-<span class="sourceLineNo">4961</span>    KeyValue kv11 = new KeyValue(rowC, cf, col, ts + 1, KeyValue.Type.Put,<a name="line.4961"></a>
-<span class="sourceLineNo">4962</span>        null);<a name="line.4962"></a>
-<span class="sourceLineNo">4963</span>    KeyValue kv2 = new KeyValue(rowA, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4963"></a>
-<span class="sourceLineNo">4964</span>    KeyValue kv3 = new KeyValue(rowB, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4964"></a>
-<span class="sourceLineNo">4965</span>    Put put = null;<a name="line.4965"></a>
-<span class="sourceLineNo">4966</span>    put = new Put(rowC);<a name="line.4966"></a>
-<span class="sourceLineNo">4967</span>    put.add(kv1);<a name="line.4967"></a>
-<span class="sourceLineNo">4968</span>    put.add(kv11);<a name="line.4968"></a>
-<span class="sourceLineNo">4969</span>    region.put(put);<a name="line.4969"></a>
-<span class="sourceLineNo">4970</span>    put = new Put(rowA);<a name="line.4970"></a>
-<span class="sourceLineNo">4971</span>    put.add(kv2);<a name="line.4971"></a>
-<span class="sourceLineNo">4972</span>    region.put(put);<a name="line.4972"></a>
-<span class="sourceLineNo">4973</span>    put = new Put(rowB);<a name="line.4973"></a>
-<span class="sourceLineNo">4974</span>    put.add(kv3);<a name="line.4974"></a>
-<span class="sourceLineNo">4975</span>    region.put(put);<a name="line.4975"></a>
-<span class="sourceLineNo">4976</span><a name="line.4976"></a>
-<span class="sourceLineNo">4977</span>    Scan scan = new Scan(rowD);<a name="line.4977"></a>
-<span class="sourceLineNo">4978</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.4978"></a>
-<span class="sourceLineNo">4979</span>    scan.setReversed(true);<a name="line.4979"></a>
-<span class="sourceLineNo">4980</span>    scan.setMaxVersions(5);<a name="line.4980"></a>
-<span class="sourceLineNo">4981</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.4981"></a>
-<span class="sourceLineNo">4982</span>    boolean hasNext = scanner.next(currRow);<a name="line.4982"></a>
-<span class="sourceLineNo">4983</span>    assertEquals(2, currRow.size());<a name="line.4983"></a>
-<span class="sourceLineNo">4984</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4984"></a>
-<span class="sourceLineNo">4985</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.4985"></a>
-<span class="sourceLineNo">4986</span>    assertTrue(hasNext);<a name="line.4986"></a>
-<span class="sourceLineNo">4987</span>    currRow.clear();<a name="line.4987"></a>
-<span class="sourceLineNo">4988</span>    hasNext = scanner.next(currRow);<a name="line.4988"></a>
-<span class="sourceLineNo">4989</span>    assertEquals(1, currRow.size());<a name="line.4989"></a>
-<span class="sourceLineNo">4990</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4990"></a>
-<span class="sourceLineNo">4991</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.4991"></a>
-<span class="sourceLineNo">4992</span>    assertTrue(hasNext);<a name="line.4992"></a>
-<span class="sourceLineNo">4993</span>    currRow.clear();<a name="line.4993"></a>
-<span class="sourceLineNo">4994</span>    hasNext = scanner.next(currRow);<a name="line.4994"></a>
-<span class="sourceLineNo">4995</span>    assertEquals(1, currRow.size());<a name="line.4995"></a>
-<span class="sourceLineNo">4996</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4996"></a>
-<span class="sourceLineNo">4997</span>        .get(0).getRowLength(), rowA, 0, rowA.length));<a name="line.4997"></a>
-<span class="sourceLineNo">4998</span>    assertFalse(hasNext);<a name="line.4998"></a>
-<span class="sourceLineNo">4999</span>    scanner.close();<a name="line.4999"></a>
-<span class="sourceLineNo">5000</span>  }<a name="line.5000"></a>
-<span class="sourceLineNo">5001</span><a name="line.5001"></a>
-<span class="sourceLineNo">5002</span>  @Test<a name="line.5002"></a>
-<span class="sourceLineNo">5003</span>  public void testReverseScanner_FromMemStore_SingleCF_FullScan()<a name="line.5003"></a>
-<span class="sourceLineNo">5004</span>      throws IOException {<a name="line.5004"></a>
-<span class="sourceLineNo">5005</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.5005"></a>
-<span class="sourceLineNo">5006</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.5006"></a>
-<span class="sourceLineNo">5007</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.5007"></a>
-<span class="sourceLineNo">5008</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.5008"></a>
-<span class="sourceLineNo">5009</span>    byte[][] families = { cf };<a name="line.5009"></a>
-<span class="sourceLineNo">5010</span>    byte[] col = Bytes.toBytes("C");<a name="line.5010"></a>
-<span class="sourceLineNo">5011</span>    long ts = 1;<a name="line.5011"></a>
-<span class="sourceLineNo">5012</span>    this.region = initHRegion(tableName, method, families);<a name="line.5012"></a>
-<span class="sourceLineNo">5013</span>    KeyValue kv1 = new KeyValue(rowC, cf, col, ts, KeyValue.Type.Put, null);<a name="line.5013"></a>
-<span class="sourceLineNo">5014</span>    KeyValue kv11 = new KeyValue(rowC, cf, col, ts + 1, KeyValue.Type.Put,<a name="line.5014"></a>
-<span class="sourceLineNo">5015</span>        null);<a name="line.5015"></a>
-<span class="sourceLineNo">5016</span>    KeyValue kv2 = new KeyValue(rowA, cf, col, ts, KeyValue.Type.Put, null);<a name="line.5016"></a>
-<span class="sourceLineNo">5017</span>    KeyValue kv3 = new KeyValue(rowB, cf, col, ts, KeyValue.Type.Put, null);<a name="line.5017"></a>
-<span class="sourceLineNo">5018</span>    Put put = null;<a name="line.5018"></a>
-<span class="sourceLineNo">5019</span>    put = new Put(rowC);<a name="line.5019"></a>
-<span class="sourceLineNo">5020</span>    put.add(kv1);<a name="line.5020"></a>
-<span class="sourceLineNo">5021</span>    put.add(kv11);<a name="line.5021"></a>
-<span class="sourceLineNo">5022</span>    region.put(put);<a name="line.5022"></a>
-<span class="sourceLineNo">5023</span>    put = new Put(rowA);<a name="line.5023"></a>
-<span class="sourceLineNo">5024</span>    put.add(kv2);<a name="line.5024"></a>
-<span class="sourceLineNo">5025</span>    region.put(put);<a name="line.5025"></a>
-<span class="sourceLineNo">5026</span>    put = new Put(rowB);<a name="line.5026"></a>
-<span class="sourceLineNo">5027</span>    put.add(kv3);<a name="line.5027"></a>
-<span class="sourceLineNo">5028</span>    region.put(put);<a name="line.5028"></a>
-<span class="sourceLineNo">5029</span>    Scan scan = new Scan();<a name="line.5029"></a>
-<span class="sourceLineNo">5030</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5030"></a>
-<span class="sourceLineNo">5031</span>    scan.setReversed(true);<a name="line.5031"></a>
-<span class="sourceLineNo">5032</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5032"></a>
-<span class="sourceLineNo">5033</span>    boolean hasNext = scanner.next(currRow);<a name="line.5033"></a>
-<span class="sourceLineNo">5034</span>    assertEquals(1, currRow.size());<a name="line.5034"></a>
-<span class="sourceLineNo">5035</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5035"></a>
-<span class="sourceLineNo">5036</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.5036"></a>
-<span class="sourceLineNo">5037</span>    assertTrue(hasNext);<a name="line.5037"></a>
-<span class="sourceLineNo">5038</span>    currRow.clear();<a name="line.5038"></a>
-<span class="sourceLineNo">5039</span>    hasNext = scanner.next(currRow);<a name="line.5039"></a>
-<span class="sourceLineNo">5040</span>    assertEquals(1, currRow.size());<a name="line.5040"></a>
-<span class="sourceLineNo">5041</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5041"></a>
-<span class="sourceLineNo">5042</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.5042"></a>
-<span class="sourceLineNo">5043</span>    assertTrue(hasNext);<a name="line.5043"></a>
-<span class="sourceLineNo">5044</span>    currRow.clear();<a name="line.5044"></a>
-<span class="sourceLineNo">5045</span>    hasNext = scanner.next(currRow);<a name="line.5045"></a>
-<span class="sourceLineNo">5046</span>    assertEquals(1, currRow.size());<a name="line.5046"></a>
-<span class="sourceLineNo">5047</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5047"></a>
-<span class="sourceLineNo">5048</span>        .get(0).getRowLength(), rowA, 0, rowA.length));<a name="line.5048"></a>
-<span class="sourceLineNo">5049</span>    assertFalse(hasNext);<a name="line.5049"></a>
-<span class="sourceLineNo">5050</span>    scanner.close();<a name="line.5050"></a>
-<span class="sourceLineNo">5051</span>  }<a name="line.5051"></a>
-<span class="sourceLineNo">5052</span><a name="line.5052"></a>
-<span class="sourceLineNo">5053</span>  @Test<a name="line.5053"></a>
-<span class="sourceLineNo">5054</span>  public void testReverseScanner_moreRowsMayExistAfter() throws IOException {<a name="line.5054"></a>
-<span class="sourceLineNo">5055</span>    // case for "INCLUDE_AND_SEEK_NEXT_ROW &amp; SEEK_NEXT_ROW" endless loop<a name="line.5055"></a>
-<span class="sourceLineNo">5056</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.5056"></a>
-<span class="sourceLineNo">5057</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.5057"></a>
-<span class="sourceLineNo">5058</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.5058"></a>
-<span class="sourceLineNo">5059</span>    byte[] rowD = Bytes.toBytes("rowD");<a name="line.5059"></a>
-<span class="sourceLineNo">5060</span>    byte[] rowE = Bytes.toBytes("rowE");<a name="line.5060"></a>
-<span class="sourceLineNo">5061</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.5061"></a>
-<span class="sourceLineNo">5062</span>    byte[][] families = { cf };<a name="line.5062"></a>
-<span class="sourceLineNo">5063</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.5063"></a>
-<span class="sourceLineNo">5064</span>    byte[] col2 = Bytes.toBytes("col2");<a name="line.5064"></a>
-<span class="sourceLineNo">5065</span>    long ts = 1;<a name="line.5065"></a>
-<span class="sourceLineNo">5066</span>    this.region = initHRegion(tableName, method, families);<a name="line.5066"></a>
-<span class="sourceLineNo">5067</span>    KeyValue kv1 = new KeyValue(rowA, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5067"></a>
-<span class="sourceLineNo">5068</span>    KeyValue kv2 = new KeyValue(rowB, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5068"></a>
-<span class="sourceLineNo">5069</span>    KeyValue kv3 = new KeyValue(rowC, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5069"></a>
-<span class="sourceLineNo">5070</span>    KeyValue kv4_1 = new KeyValue(rowD, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5070"></a>
-<span class="sourceLineNo">5071</span>    KeyValue kv4_2 = new KeyValue(rowD, cf, col2, ts, KeyValue.Type.Put, null);<a name="line.5071"></a>
-<span class="sourceLineNo">5072</span>    KeyValue kv5 = new KeyValue(rowE, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5072"></a>
-<span class="sourceLineNo">5073</span>    Put put = null;<a name="line.5073"></a>
-<span class="sourceLineNo">5074</span>    put = new Put(rowA);<a name="line.5074"></a>
-<span class="sourceLineNo">5075</span>    put.add(kv1);<a name="line.5075"></a>
-<span class="sourceLineNo">5076</span>    region.put(put);<a name="line.5076"></a>
-<span class="sourceLineNo">5077</span>    put = new Put(rowB);<a name="line.5077"></a>
-<span class="sourceLineNo">5078</span>    put.add(kv2);<a name="line.5078"></a>
-<span class="sourceLineNo">5079</span>    region.put(put);<a name="line.5079"></a>
-<span class="sourceLineNo">5080</span>    put = new Put(rowC);<a name="line.5080"></a>
-<span class="sourceLineNo">5081</span>    put.add(kv3);<a name="line.5081"></a>
-<span class="sourceLineNo">5082</span>    region.put(put);<a name="line.5082"></a>
-<span class="sourceLineNo">5083</span>    put = new Put(rowD);<a name="line.5083"></a>
-<span class="sourceLineNo">5084</span>    put.add(kv4_1);<a name="line.5084"></a>
-<span class="sourceLineNo">5085</span>    region.put(put);<a name="line.5085"></a>
-<span class="sourceLineNo">5086</span>    put = new Put(rowD);<a name="line.5086"></a>
-<span class="sourceLineNo">5087</span>    put.add(kv4_2);<a name="line.5087"></a>
-<span class="sourceLineNo">5088</span>    region.put(put);<a name="line.5088"></a>
-<span class="sourceLineNo">5089</span>    put = new Put(rowE);<a name="line.5089"></a>
-<span class="sourceLineNo">5090</span>    put.add(kv5);<a name="line.5090"></a>
-<span class="sourceLineNo">5091</span>    region.put(put);<a name="line.5091"></a>
-<span class="sourceLineNo">5092</span>    region.flush(true);<a name="line.5092"></a>
-<span class="sourceLineNo">5093</span>    Scan scan = new Scan(rowD, rowA);<a name="line.5093"></a>
-<span class="sourceLineNo">5094</span>    scan.addColumn(families[0], col1);<a name="line.5094"></a>
-<span class="sourceLineNo">5095</span>    scan.setReversed(true);<a name="line.5095"></a>
-<span class="sourceLineNo">5096</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5096"></a>
-<span class="sourceLineNo">5097</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5097"></a>
-<span class="sourceLineNo">5098</span>    boolean hasNext = scanner.next(currRow);<a name="line.5098"></a>
-<span class="sourceLineNo">5099</span>    assertEquals(1, currRow.size());<a name="line.5099"></a>
-<span class="sourceLineNo">5100</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5100"></a>
-<span class="sourceLineNo">5101</span>        .get(0).getRowLength(), rowD, 0, rowD.length));<a name="line.5101"></a>
-<span class="sourceLineNo">5102</span>    assertTrue(hasNext);<a name="line.5102"></a>
-<span class="sourceLineNo">5103</span>    currRow.clear();<a name="line.5103"></a>
-<span class="sourceLineNo">5104</span>    hasNext = scanner.next(currRow);<a name="line.5104"></a>
-<span class="sourceLineNo">5105</span>    assertEquals(1, currRow.size());<a name="line.5105"></a>
-<span class="sourceLineNo">5106</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5106"></a>
-<span class="sourceLineNo">5107</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.5107"></a>
-<span class="sourceLineNo">5108</span>    assertTrue(hasNext);<a name="line.5108"></a>
-<span class="sourceLineNo">5109</span>    currRow.clear();<a name="line.5109"></a>
-<span class="sourceLineNo">5110</span>    hasNext = scanner.next(currRow);<a name="line.5110"></a>
-<span class="sourceLineNo">5111</span>    assertEquals(1, currRow.size());<a name="line.5111"></a>
-<span class="sourceLineNo">5112</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5112"></a>
-<span class="sourceLineNo">5113</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.5113"></a>
-<span class="sourceLineNo">5114</span>    assertFalse(hasNext);<a name="line.5114"></a>
-<span class="sourceLineNo">5115</span>    scanner.close();<a name="line.5115"></a>
-<span class="sourceLineNo">5116</span><a name="line.5116"></a>
-<span class="sourceLineNo">5117</span>    scan = new Scan(rowD, rowA);<a name="line.5117"></a>
-<span class="sourceLineNo">5118</span>    scan.addColumn(families[0], col2);<a name="line.5118"></a>
-<span class="sourceLineNo">5119</span>    scan.setReversed(true);<a name="line.5119"></a>
-<span class="sourceLineNo">5120</span>    currRow.clear();<a name="line.5120"></a>
-<span class="sourceLineNo">5121</span>    scanner = region.getScanner(scan);<a name="line.5121"></a>
-<span class="sourceLineNo">5122</span>    hasNext = scanner.next(currRow);<a name="line.5122"></a>
-<span class="sourceLineNo">5123</span>    assertEquals(1, currRow.size());<a name="line.5123"></a>
-<span class="sourceLineNo">5124</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5124"></a>
-<span class="sourceLineNo">5125</span>        .get(0).getRowLength(), rowD, 0, rowD.length));<a name="line.5125"></a>
-<span class="sourceLineNo">5126</span>    scanner.close();<a name="line.5126"></a>
-<span class="sourceLineNo">5127</span>  }<a name="line.5127"></a>
-<span class="sourceLineNo">5128</span><a name="line.5128"></a>
-<span class="sourceLineNo">5129</span>  @Test<a name="line.5129"></a>
-<span class="sourceLineNo">5130</span>  public void testReverseScanner_smaller_blocksize() throws IOException {<a name="line.5130"></a>
-<span class="sourceLineNo">5131</span>    // case to ensure no conflict with HFile index optimization<a name="line.5131"></a>
-<span class="sourceLineNo">5132</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.5132"></a>
-<span class="sourceLineNo">5133</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.5133"></a>
-<span class="sourceLineNo">5134</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.5134"></a>
-<span class="sourceLineNo">5135</span>    byte[] rowD = Bytes.toBytes("rowD");<a name="line.5135"></a>
-<span class="sourceLineNo">5136</span>    byte[] rowE = Bytes.toBytes("rowE");<a name="line.5136"></a>
-<span class="sourceLineNo">5137</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.5137"></a>
-<span class="sourceLineNo">5138</span>    byte[][] families = { cf };<a name="line.5138"></a>
-<span class="sourceLineNo">5139</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.5139"></a>
-<span class="sourceLineNo">5140</span>    byte[] col2 = Bytes.toBytes("col2");<a name="line.5140"></a>
-<span class="sourceLineNo">5141</span>    long ts = 1;<a name="line.5141"></a>
-<span class="sourceLineNo">5142</span>    HBaseConfiguration config = new HBaseConfiguration();<a name="line.5142"></a>
-<span class="sourceLineNo">5143</span>    config.setInt("test.block.size", 1);<a name="line.5143"></a>
-<span class="sourceLineNo">5144</span>    this.region = initHRegion(tableName, method, config, families);<a name="line.5144"></a>
-<span class="sourceLineNo">5145</span>    KeyValue kv1 = new KeyValue(rowA, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5145"></a>
-<span class="sourceLineNo">5146</span>    KeyValue kv2 = new KeyValue(rowB, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5146"></a>
-<span class="sourceLineNo">5147</span>    KeyValue kv3 = new KeyValue(rowC, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5147"></a>
-<span class="sourceLineNo">5148</span>    KeyValue kv4_1 = new KeyValue(rowD, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5148"></a>
-<span class="sourceLineNo">5149</span>    KeyValue kv4_2 = new KeyValue(rowD, cf, col2, ts, KeyValue.Type.Put, null);<a name="line.5149"></a>
-<span class="sourceLineNo">5150</span>    KeyValue kv5 = new KeyValue(rowE, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5150"></a>
-<span class="sourceLineNo">5151</span>    Put put = null;<a name="line.5151"></a>
-<span class="sourceLineNo">5152</span>    put = new Put(rowA);<a name="line.5152"></a>
-<span class="sourceLineNo">5153</span>    put.add(kv1);<a name="line.5153"></a>
-<span class="sourceLineNo">5154</span>    region.put(put);<a name="line.5154"></a>
-<span class="sourceLineNo">5155</span>    put = new Put(rowB);<a name="line.5155"></a>
-<span class="sourceLineNo">5156</span>    put.add(kv2);<a name="line.5156"></a>
-<span class="sourceLineNo">5157</span>    region.put(put);<a name="line.5157"></a>
-<span class="sourceLineNo">5158</span>    put = new Put(rowC);<a name="line.5158"></a>
-<span class="sourceLineNo">5159</span>    put.add(kv3);<a name="line.5159"></a>
-<span class="sourceLineNo">5160</span>    region.put(put);<a name="line.5160"></a>
-<span class="sourceLineNo">5161</span>    put = new Put(rowD);<a name="line.5161"></a>
-<span class="sourceLineNo">5162</span>    put.add(kv4_1);<a name="line.5162"></a>
-<span class="sourceLineNo">5163</span>    region.put(put);<a name="line.5163"></a>
-<span class="sourceLineNo">5164</span>    put = new Put(rowD);<a name="line.5164"></a>
-<span class="sourceLineNo">5165</span>    put.add(kv4_2);<a name="line.5165"></a>
-<span class="sourceLineNo">5166</span>    region.put(put);<a name="line.5166"></a>
-<span class="sourceLineNo">5167</span>    put = new Put(rowE);<a name="line.5167"></a>
-<span class="sourceLineNo">5168</span>    put.add(kv5);<a name="line.5168"></a>
-<span class="sourceLineNo">5169</span>    region.put(put);<a name="line.5169"></a>
-<span class="sourceLineNo">5170</span>    region.flush(true);<a name="line.5170"></a>
-<span class="sourceLineNo">5171</span>    Scan scan = new Scan(rowD, rowA);<a name="line.5171"></a>
-<span class="sourceLineNo">5172</span>    scan.addColumn(families[0], col1);<a name="line.5172"></a>
-<span class="sourceLineNo">5173</span>    scan.setReversed(true);<a name="line.5173"></a>
-<span class="sourceLineNo">5174</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5174"></a>
-<span class="sourceLineNo">5175</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5175"></a>
-<span class="sourceLineNo">5176</span>    boolean hasNext = scanner.next(currRow);<a name="line.5176"></a>
-<span class="sourceLineNo">5177</span>    assertEquals(1, currRow.size());<a name="line.5177"></a>
-<span class="sourceLineNo">5178</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5178"></a>
-<span class="sourceLineNo">5179</span>        .get(0).getRowLength(), rowD, 0, rowD.length));<a name="line.5179"></a>
-<span class="sourceLineNo">5180</span>    assertTrue(hasNext);<a name="line.5180"></a>
-<span class="sourceLineNo">5181</span>    currRow.clear();<a name="line.5181"></a>
-<span class="sourceLineNo">5182</span>    hasNext = scanner.next(currRow);<a name="line.5182"></a>
-<span class="sourceLineNo">5183</span>    assertEquals(1, currRow.size());<a name="line.5183"></a>
-<span class="sourceLineNo">5184</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5184"></a>
-<span class="sourceLineNo">5185</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.5185"></a>
-<span class="sourceLineNo">5186</span>    assertTrue(hasNext);<a name="line.5186"></a>
-<span class="sourceLineNo">5187</span>    currRow.clear();<a name="line.5187"></a>
-<span class="sourceLineNo">5188</span>    hasNext = scanner.next(currRow);<a name="line.5188"></a>
-<span class="sourceLineNo">5189</span>    assertEquals(1, currRow.size());<a name="line.5189"></a>
-<span class="sourceLineNo">5190</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5190"></a>
-<span class="sourceLineNo">5191</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.5191"></a>
-<span class="sourceLineNo">5192</span>    assertFalse(hasNext);<a name="line.5192"></a>
-<span class="sourceLineNo">5193</span>    scanner.close();<a name="line.5193"></a>
-<span class="sourceLineNo">5194</span><a name="line.5194"></a>
-<span class="sourceLineNo">5195</span>    scan = new Scan(rowD, rowA);<a name="line.5195"></a>
-<span class="sourceLineNo">5196</span>    scan.addColumn(families[0], col2);<a name="line.5196"></a>
-<span class="sourceLineNo">5197</span>    scan.setReversed(true);<a name="line.5197"></a>
-<span class="sourceLineNo">5198</span>    currRow.clear();<a name="line.5198"></a>
-<span class="sourceLineNo">5199</span>    scanner = region.getScanner(scan);<a name="line.5199"></a>
-<span class="sourceLineNo">5200</span>    hasNext = scanner.next(currRow);<a name="line.5200"></a>
-<span class="sourceLineNo">5201</span>    assertEquals(1, currRow.size());<a name="line.5201"></a>
-<span class="sourceLineNo">5202</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5202"></a>
-<span class="sourceLineNo">5203</span>        .get(0).getRowLength(), rowD, 0, rowD.length));<a name="line.5203"></a>
-<span class="sourceLineNo">5204</span>    scanner.close();<a name="line.5204"></a>
-<span class="sourceLineNo">5205</span>  }<a name="line.5205"></a>
-<span class="sourceLineNo">5206</span><a name="line.5206"></a>
-<span class="sourceLineNo">5207</span>  @Test<a name="line.5207"></a>
-<span class="sourceLineNo">5208</span>  public void testReverseScanner_FromMemStoreAndHFiles_MultiCFs1()<a name="line.5208"></a>
-<span class="sourceLineNo">5209</span>      throws IOException {<a name="line.5209"></a>
-<span class="sourceLineNo">5210</span>    byte[] row0 = Bytes.toBytes("row0"); // 1 kv<a name="line.5210"></a>
-<span class="sourceLineNo">5211</span>    byte[] row1 = Bytes.toBytes("row1"); // 2 kv<a name="line.5211"></a>
-<span class="sourceLineNo">5212</span>    byte[] row2 = Bytes.toBytes("row2"); // 4 kv<a name="line.5212"></a>
-<span class="sourceLineNo">5213</span>    byte[] row3 = Bytes.toBytes("row3"); // 2 kv<a name="line.5213"></a>
-<span class="sourceLineNo">5214</span>    byte[] row4 = Bytes.toBytes("row4"); // 5 kv<a name="line.5214"></a>
-<span class="sourceLineNo">5215</span>    byte[] row5 = Bytes.toBytes("row5"); // 2 kv<a name="line.5215"></a>
-<span class="sourceLineNo">5216</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5216"></a>
-<span class="sourceLineNo">5217</span>    byte[] cf2 = Bytes.toBytes("CF2");<a name="line.5217"></a>
-<span class="sourceLineNo">5218</span>    byte[] cf3 = Bytes.toBytes("CF3");<a name="line.5218"></a>
-<span class="sourceLineNo">5219</span>    byte[][] families = { cf1, cf2, cf3 };<a name="line.5219"></a>
-<span class="sourceLineNo">5220</span>    byte[] col = Bytes.toBytes("C");<a name="line.5220"></a>
-<span class="sourceLineNo">5221</span>    long ts = 1;<a name="line.5221"></a>
-<span class="sourceLineNo">5222</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5222"></a>
-<span class="sourceLineNo">5223</span>    // disable compactions in this test.<a name="line.5223"></a>
-<span class="sourceLineNo">5224</span>    conf.setInt("hbase.hstore.compactionThreshold", 10000);<a name="line.5224"></a>
-<span class="sourceLineNo">5225</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5225"></a>
-<span class="sourceLineNo">5226</span>    // kv naming style: kv(row number) totalKvCountInThisRow seq no<a name="line.5226"></a>
-<span class="sourceLineNo">5227</span>    KeyValue kv0_1_1 = new KeyValue(row0, cf1, col, ts, KeyValue.Type.Put,<a name="line.5227"></a>
-<span class="sourceLineNo">5228</span>        null);<a name="line.5228"></a>
-<span class="sourceLineNo">5229</span>    KeyValue kv1_2_1 = new KeyValue(row1, cf2, col, ts, KeyValue.Type.Put,<a name="line.5229"></a>
-<span class="sourceLineNo">5230</span>        null);<a name="line.5230"></a>
-<span class="sourceLineNo">5231</span>    KeyValue kv1_2_2 = new KeyValue(row1, cf1, col, ts + 1,<a name="line.5231"></a>
-<span class="sourceLineNo">5232</span>        KeyValue.Type.Put, null);<a name="line.5232"></a>
-<span class="sourceLineNo">5233</span>    KeyValue kv2_4_1 = new KeyValue(row2, cf2, col, ts, KeyValue.Type.Put,<a name="line.5233"></a>
-<span class="sourceLineNo">5234</span>        null);<a name="line.5234"></a>
-<span class="sourceLineNo">5235</span>    KeyValue kv2_4_2 = new KeyValue(row2, cf1, col, ts, KeyValue.Type.Put,<a name="line.5235"></a>
-<span class="sourceLineNo">5236</span>        null);<a name="line.5236"></a>
-<span class="sourceLineNo">5237</span>    KeyValue kv2_4_3 = new KeyValue(row2, cf3, col, ts, KeyValue.Type.Put,<a name="line.5237"></a>
+<span class="sourceLineNo">4882</span>  public HRegion initHRegion(TableName tableName, byte[] startKey, byte[] stopKey,<a name="line.4882"></a>
+<span class="sourceLineNo">4883</span>      boolean isReadOnly, Durability durability, WAL wal, byte[]... families) throws IOException {<a name="line.4883"></a>
+<span class="sourceLineNo">4884</span>    return TEST_UTIL.createLocalHRegion(tableName, startKey, stopKey,<a name="line.4884"></a>
+<span class="sourceLineNo">4885</span>        isReadOnly, durability, wal, families);<a name="line.4885"></a>
+<span class="sourceLineNo">4886</span>  }<a name="line.4886"></a>
+<span class="sourceLineNo">4887</span><a name="line.4887"></a>
+<span class="sourceLineNo">4888</span>  /**<a name="line.4888"></a>
+<span class="sourceLineNo">4889</span>   * Assert that the passed in Cell has expected contents for the specified row,<a name="line.4889"></a>
+<span class="sourceLineNo">4890</span>   * column &amp; timestamp.<a name="line.4890"></a>
+<span class="sourceLineNo">4891</span>   */<a name="line.4891"></a>
+<span class="sourceLineNo">4892</span>  private void checkOneCell(Cell kv, byte[] cf, int rowIdx, int colIdx, long ts) {<a name="line.4892"></a>
+<span class="sourceLineNo">4893</span>    String ctx = "rowIdx=" + rowIdx + "; colIdx=" + colIdx + "; ts=" + ts;<a name="line.4893"></a>
+<span class="sourceLineNo">4894</span>    assertEquals("Row mismatch which checking: " + ctx, "row:" + rowIdx,<a name="line.4894"></a>
+<span class="sourceLineNo">4895</span>        Bytes.toString(CellUtil.cloneRow(kv)));<a name="line.4895"></a>
+<span class="sourceLineNo">4896</span>    assertEquals("ColumnFamily mismatch while checking: " + ctx, Bytes.toString(cf),<a name="line.4896"></a>
+<span class="sourceLineNo">4897</span>        Bytes.toString(CellUtil.cloneFamily(kv)));<a name="line.4897"></a>
+<span class="sourceLineNo">4898</span>    assertEquals("Column qualifier mismatch while checking: " + ctx, "column:" + colIdx,<a name="line.4898"></a>
+<span class="sourceLineNo">4899</span>        Bytes.toString(CellUtil.cloneQualifier(kv)));<a name="line.4899"></a>
+<span class="sourceLineNo">4900</span>    assertEquals("Timestamp mismatch while checking: " + ctx, ts, kv.getTimestamp());<a name="line.4900"></a>
+<span class="sourceLineNo">4901</span>    assertEquals("Value mismatch while checking: " + ctx, "value-version-" + ts,<a name="line.4901"></a>
+<span class="sourceLineNo">4902</span>        Bytes.toString(CellUtil.cloneValue(kv)));<a name="line.4902"></a>
+<span class="sourceLineNo">4903</span>  }<a name="line.4903"></a>
+<span class="sourceLineNo">4904</span><a name="line.4904"></a>
+<span class="sourceLineNo">4905</span>  @Test<a name="line.4905"></a>
+<span class="sourceLineNo">4906</span>  public void testReverseScanner_FromMemStore_SingleCF_Normal()<a name="line.4906"></a>
+<span class="sourceLineNo">4907</span>      throws IOException {<a name="line.4907"></a>
+<span class="sourceLineNo">4908</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.4908"></a>
+<span class="sourceLineNo">4909</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.4909"></a>
+<span class="sourceLineNo">4910</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.4910"></a>
+<span class="sourceLineNo">4911</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.4911"></a>
+<span class="sourceLineNo">4912</span>    byte[][] families = { cf };<a name="line.4912"></a>
+<span class="sourceLineNo">4913</span>    byte[] col = Bytes.toBytes("C");<a name="line.4913"></a>
+<span class="sourceLineNo">4914</span>    long ts = 1;<a name="line.4914"></a>
+<span class="sourceLineNo">4915</span>    this.region = initHRegion(tableName, method, families);<a name="line.4915"></a>
+<span class="sourceLineNo">4916</span>    KeyValue kv1 = new KeyValue(rowC, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4916"></a>
+<span class="sourceLineNo">4917</span>    KeyValue kv11 = new KeyValue(rowC, cf, col, ts + 1, KeyValue.Type.Put,<a name="line.4917"></a>
+<span class="sourceLineNo">4918</span>        null);<a name="line.4918"></a>
+<span class="sourceLineNo">4919</span>    KeyValue kv2 = new KeyValue(rowA, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4919"></a>
+<span class="sourceLineNo">4920</span>    KeyValue kv3 = new KeyValue(rowB, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4920"></a>
+<span class="sourceLineNo">4921</span>    Put put = null;<a name="line.4921"></a>
+<span class="sourceLineNo">4922</span>    put = new Put(rowC);<a name="line.4922"></a>
+<span class="sourceLineNo">4923</span>    put.add(kv1);<a name="line.4923"></a>
+<span class="sourceLineNo">4924</span>    put.add(kv11);<a name="line.4924"></a>
+<span class="sourceLineNo">4925</span>    region.put(put);<a name="line.4925"></a>
+<span class="sourceLineNo">4926</span>    put = new Put(rowA);<a name="line.4926"></a>
+<span class="sourceLineNo">4927</span>    put.add(kv2);<a name="line.4927"></a>
+<span class="sourceLineNo">4928</span>    region.put(put);<a name="line.4928"></a>
+<span class="sourceLineNo">4929</span>    put = new Put(rowB);<a name="line.4929"></a>
+<span class="sourceLineNo">4930</span>    put.add(kv3);<a name="line.4930"></a>
+<span class="sourceLineNo">4931</span>    region.put(put);<a name="line.4931"></a>
+<span class="sourceLineNo">4932</span><a name="line.4932"></a>
+<span class="sourceLineNo">4933</span>    Scan scan = new Scan(rowC);<a name="line.4933"></a>
+<span class="sourceLineNo">4934</span>    scan.setMaxVersions(5);<a name="line.4934"></a>
+<span class="sourceLineNo">4935</span>    scan.setReversed(true);<a name="line.4935"></a>
+<span class="sourceLineNo">4936</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.4936"></a>
+<span class="sourceLineNo">4937</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.4937"></a>
+<span class="sourceLineNo">4938</span>    boolean hasNext = scanner.next(currRow);<a name="line.4938"></a>
+<span class="sourceLineNo">4939</span>    assertEquals(2, currRow.size());<a name="line.4939"></a>
+<span class="sourceLineNo">4940</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4940"></a>
+<span class="sourceLineNo">4941</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.4941"></a>
+<span class="sourceLineNo">4942</span>    assertTrue(hasNext);<a name="line.4942"></a>
+<span class="sourceLineNo">4943</span>    currRow.clear();<a name="line.4943"></a>
+<span class="sourceLineNo">4944</span>    hasNext = scanner.next(currRow);<a name="line.4944"></a>
+<span class="sourceLineNo">4945</span>    assertEquals(1, currRow.size());<a name="line.4945"></a>
+<span class="sourceLineNo">4946</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4946"></a>
+<span class="sourceLineNo">4947</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.4947"></a>
+<span class="sourceLineNo">4948</span>    assertTrue(hasNext);<a name="line.4948"></a>
+<span class="sourceLineNo">4949</span>    currRow.clear();<a name="line.4949"></a>
+<span class="sourceLineNo">4950</span>    hasNext = scanner.next(currRow);<a name="line.4950"></a>
+<span class="sourceLineNo">4951</span>    assertEquals(1, currRow.size());<a name="line.4951"></a>
+<span class="sourceLineNo">4952</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4952"></a>
+<span class="sourceLineNo">4953</span>        .get(0).getRowLength(), rowA, 0, rowA.length));<a name="line.4953"></a>
+<span class="sourceLineNo">4954</span>    assertFalse(hasNext);<a name="line.4954"></a>
+<span class="sourceLineNo">4955</span>    scanner.close();<a name="line.4955"></a>
+<span class="sourceLineNo">4956</span>  }<a name="line.4956"></a>
+<span class="sourceLineNo">4957</span><a name="line.4957"></a>
+<span class="sourceLineNo">4958</span>  @Test<a name="line.4958"></a>
+<span class="sourceLineNo">4959</span>  public void testReverseScanner_FromMemStore_SingleCF_LargerKey()<a name="line.4959"></a>
+<span class="sourceLineNo">4960</span>      throws IOException {<a name="line.4960"></a>
+<span class="sourceLineNo">4961</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.4961"></a>
+<span class="sourceLineNo">4962</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.4962"></a>
+<span class="sourceLineNo">4963</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.4963"></a>
+<span class="sourceLineNo">4964</span>    byte[] rowD = Bytes.toBytes("rowD");<a name="line.4964"></a>
+<span class="sourceLineNo">4965</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.4965"></a>
+<span class="sourceLineNo">4966</span>    byte[][] families = { cf };<a name="line.4966"></a>
+<span class="sourceLineNo">4967</span>    byte[] col = Bytes.toBytes("C");<a name="line.4967"></a>
+<span class="sourceLineNo">4968</span>    long ts = 1;<a name="line.4968"></a>
+<span class="sourceLineNo">4969</span>    this.region = initHRegion(tableName, method, families);<a name="line.4969"></a>
+<span class="sourceLineNo">4970</span>    KeyValue kv1 = new KeyValue(rowC, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4970"></a>
+<span class="sourceLineNo">4971</span>    KeyValue kv11 = new KeyValue(rowC, cf, col, ts + 1, KeyValue.Type.Put,<a name="line.4971"></a>
+<span class="sourceLineNo">4972</span>        null);<a name="line.4972"></a>
+<span class="sourceLineNo">4973</span>    KeyValue kv2 = new KeyValue(rowA, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4973"></a>
+<span class="sourceLineNo">4974</span>    KeyValue kv3 = new KeyValue(rowB, cf, col, ts, KeyValue.Type.Put, null);<a name="line.4974"></a>
+<span class="sourceLineNo">4975</span>    Put put = null;<a name="line.4975"></a>
+<span class="sourceLineNo">4976</span>    put = new Put(rowC);<a name="line.4976"></a>
+<span class="sourceLineNo">4977</span>    put.add(kv1);<a name="line.4977"></a>
+<span class="sourceLineNo">4978</span>    put.add(kv11);<a name="line.4978"></a>
+<span class="sourceLineNo">4979</span>    region.put(put);<a name="line.4979"></a>
+<span class="sourceLineNo">4980</span>    put = new Put(rowA);<a name="line.4980"></a>
+<span class="sourceLineNo">4981</span>    put.add(kv2);<a name="line.4981"></a>
+<span class="sourceLineNo">4982</span>    region.put(put);<a name="line.4982"></a>
+<span class="sourceLineNo">4983</span>    put = new Put(rowB);<a name="line.4983"></a>
+<span class="sourceLineNo">4984</span>    put.add(kv3);<a name="line.4984"></a>
+<span class="sourceLineNo">4985</span>    region.put(put);<a name="line.4985"></a>
+<span class="sourceLineNo">4986</span><a name="line.4986"></a>
+<span class="sourceLineNo">4987</span>    Scan scan = new Scan(rowD);<a name="line.4987"></a>
+<span class="sourceLineNo">4988</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.4988"></a>
+<span class="sourceLineNo">4989</span>    scan.setReversed(true);<a name="line.4989"></a>
+<span class="sourceLineNo">4990</span>    scan.setMaxVersions(5);<a name="line.4990"></a>
+<span class="sourceLineNo">4991</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.4991"></a>
+<span class="sourceLineNo">4992</span>    boolean hasNext = scanner.next(currRow);<a name="line.4992"></a>
+<span class="sourceLineNo">4993</span>    assertEquals(2, currRow.size());<a name="line.4993"></a>
+<span class="sourceLineNo">4994</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.4994"></a>
+<span class="sourceLineNo">4995</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.4995"></a>
+<span class="sourceLineNo">4996</span>    assertTrue(hasNext);<a name="line.4996"></a>
+<span class="sourceLineNo">4997</span>    currRow.clear();<a name="line.4997"></a>
+<span class="sourceLineNo">4998</span>    hasNext = scanner.next(currRow);<a name="line.4998"></a>
+<span class="sourceLineNo">4999</span>    assertEquals(1, currRow.size());<a name="line.4999"></a>
+<span class="sourceLineNo">5000</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5000"></a>
+<span class="sourceLineNo">5001</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.5001"></a>
+<span class="sourceLineNo">5002</span>    assertTrue(hasNext);<a name="line.5002"></a>
+<span class="sourceLineNo">5003</span>    currRow.clear();<a name="line.5003"></a>
+<span class="sourceLineNo">5004</span>    hasNext = scanner.next(currRow);<a name="line.5004"></a>
+<span class="sourceLineNo">5005</span>    assertEquals(1, currRow.size());<a name="line.5005"></a>
+<span class="sourceLineNo">5006</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5006"></a>
+<span class="sourceLineNo">5007</span>        .get(0).getRowLength(), rowA, 0, rowA.length));<a name="line.5007"></a>
+<span class="sourceLineNo">5008</span>    assertFalse(hasNext);<a name="line.5008"></a>
+<span class="sourceLineNo">5009</span>    scanner.close();<a name="line.5009"></a>
+<span class="sourceLineNo">5010</span>  }<a name="line.5010"></a>
+<span class="sourceLineNo">5011</span><a name="line.5011"></a>
+<span class="sourceLineNo">5012</span>  @Test<a name="line.5012"></a>
+<span class="sourceLineNo">5013</span>  public void testReverseScanner_FromMemStore_SingleCF_FullScan()<a name="line.5013"></a>
+<span class="sourceLineNo">5014</span>      throws IOException {<a name="line.5014"></a>
+<span class="sourceLineNo">5015</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.5015"></a>
+<span class="sourceLineNo">5016</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.5016"></a>
+<span class="sourceLineNo">5017</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.5017"></a>
+<span class="sourceLineNo">5018</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.5018"></a>
+<span class="sourceLineNo">5019</span>    byte[][] families = { cf };<a name="line.5019"></a>
+<span class="sourceLineNo">5020</span>    byte[] col = Bytes.toBytes("C");<a name="line.5020"></a>
+<span class="sourceLineNo">5021</span>    long ts = 1;<a name="line.5021"></a>
+<span class="sourceLineNo">5022</span>    this.region = initHRegion(tableName, method, families);<a name="line.5022"></a>
+<span class="sourceLineNo">5023</span>    KeyValue kv1 = new KeyValue(rowC, cf, col, ts, KeyValue.Type.Put, null);<a name="line.5023"></a>
+<span class="sourceLineNo">5024</span>    KeyValue kv11 = new KeyValue(rowC, cf, col, ts + 1, KeyValue.Type.Put,<a name="line.5024"></a>
+<span class="sourceLineNo">5025</span>        null);<a name="line.5025"></a>
+<span class="sourceLineNo">5026</span>    KeyValue kv2 = new KeyValue(rowA, cf, col, ts, KeyValue.Type.Put, null);<a name="line.5026"></a>
+<span class="sourceLineNo">5027</span>    KeyValue kv3 = new KeyValue(rowB, cf, col, ts, KeyValue.Type.Put, null);<a name="line.5027"></a>
+<span class="sourceLineNo">5028</span>    Put put = null;<a name="line.5028"></a>
+<span class="sourceLineNo">5029</span>    put = new Put(rowC);<a name="line.5029"></a>
+<span class="sourceLineNo">5030</span>    put.add(kv1);<a name="line.5030"></a>
+<span class="sourceLineNo">5031</span>    put.add(kv11);<a name="line.5031"></a>
+<span class="sourceLineNo">5032</span>    region.put(put);<a name="line.5032"></a>
+<span class="sourceLineNo">5033</span>    put = new Put(rowA);<a name="line.5033"></a>
+<span class="sourceLineNo">5034</span>    put.add(kv2);<a name="line.5034"></a>
+<span class="sourceLineNo">5035</span>    region.put(put);<a name="line.5035"></a>
+<span class="sourceLineNo">5036</span>    put = new Put(rowB);<a name="line.5036"></a>
+<span class="sourceLineNo">5037</span>    put.add(kv3);<a name="line.5037"></a>
+<span class="sourceLineNo">5038</span>    region.put(put);<a name="line.5038"></a>
+<span class="sourceLineNo">5039</span>    Scan scan = new Scan();<a name="line.5039"></a>
+<span class="sourceLineNo">5040</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5040"></a>
+<span class="sourceLineNo">5041</span>    scan.setReversed(true);<a name="line.5041"></a>
+<span class="sourceLineNo">5042</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5042"></a>
+<span class="sourceLineNo">5043</span>    boolean hasNext = scanner.next(currRow);<a name="line.5043"></a>
+<span class="sourceLineNo">5044</span>    assertEquals(1, currRow.size());<a name="line.5044"></a>
+<span class="sourceLineNo">5045</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5045"></a>
+<span class="sourceLineNo">5046</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.5046"></a>
+<span class="sourceLineNo">5047</span>    assertTrue(hasNext);<a name="line.5047"></a>
+<span class="sourceLineNo">5048</span>    currRow.clear();<a name="line.5048"></a>
+<span class="sourceLineNo">5049</span>    hasNext = scanner.next(currRow);<a name="line.5049"></a>
+<span class="sourceLineNo">5050</span>    assertEquals(1, currRow.size());<a name="line.5050"></a>
+<span class="sourceLineNo">5051</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5051"></a>
+<span class="sourceLineNo">5052</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.5052"></a>
+<span class="sourceLineNo">5053</span>    assertTrue(hasNext);<a name="line.5053"></a>
+<span class="sourceLineNo">5054</span>    currRow.clear();<a name="line.5054"></a>
+<span class="sourceLineNo">5055</span>    hasNext = scanner.next(currRow);<a name="line.5055"></a>
+<span class="sourceLineNo">5056</span>    assertEquals(1, currRow.size());<a name="line.5056"></a>
+<span class="sourceLineNo">5057</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5057"></a>
+<span class="sourceLineNo">5058</span>        .get(0).getRowLength(), rowA, 0, rowA.length));<a name="line.5058"></a>
+<span class="sourceLineNo">5059</span>    assertFalse(hasNext);<a name="line.5059"></a>
+<span class="sourceLineNo">5060</span>    scanner.close();<a name="line.5060"></a>
+<span class="sourceLineNo">5061</span>  }<a name="line.5061"></a>
+<span class="sourceLineNo">5062</span><a name="line.5062"></a>
+<span class="sourceLineNo">5063</span>  @Test<a name="line.5063"></a>
+<span class="sourceLineNo">5064</span>  public void testReverseScanner_moreRowsMayExistAfter() throws IOException {<a name="line.5064"></a>
+<span class="sourceLineNo">5065</span>    // case for "INCLUDE_AND_SEEK_NEXT_ROW &amp; SEEK_NEXT_ROW" endless loop<a name="line.5065"></a>
+<span class="sourceLineNo">5066</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.5066"></a>
+<span class="sourceLineNo">5067</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.5067"></a>
+<span class="sourceLineNo">5068</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.5068"></a>
+<span class="sourceLineNo">5069</span>    byte[] rowD = Bytes.toBytes("rowD");<a name="line.5069"></a>
+<span class="sourceLineNo">5070</span>    byte[] rowE = Bytes.toBytes("rowE");<a name="line.5070"></a>
+<span class="sourceLineNo">5071</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.5071"></a>
+<span class="sourceLineNo">5072</span>    byte[][] families = { cf };<a name="line.5072"></a>
+<span class="sourceLineNo">5073</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.5073"></a>
+<span class="sourceLineNo">5074</span>    byte[] col2 = Bytes.toBytes("col2");<a name="line.5074"></a>
+<span class="sourceLineNo">5075</span>    long ts = 1;<a name="line.5075"></a>
+<span class="sourceLineNo">5076</span>    this.region = initHRegion(tableName, method, families);<a name="line.5076"></a>
+<span class="sourceLineNo">5077</span>    KeyValue kv1 = new KeyValue(rowA, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5077"></a>
+<span class="sourceLineNo">5078</span>    KeyValue kv2 = new KeyValue(rowB, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5078"></a>
+<span class="sourceLineNo">5079</span>    KeyValue kv3 = new KeyValue(rowC, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5079"></a>
+<span class="sourceLineNo">5080</span>    KeyValue kv4_1 = new KeyValue(rowD, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5080"></a>
+<span class="sourceLineNo">5081</span>    KeyValue kv4_2 = new KeyValue(rowD, cf, col2, ts, KeyValue.Type.Put, null);<a name="line.5081"></a>
+<span class="sourceLineNo">5082</span>    KeyValue kv5 = new KeyValue(rowE, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5082"></a>
+<span class="sourceLineNo">5083</span>    Put put = null;<a name="line.5083"></a>
+<span class="sourceLineNo">5084</span>    put = new Put(rowA);<a name="line.5084"></a>
+<span class="sourceLineNo">5085</span>    put.add(kv1);<a name="line.5085"></a>
+<span class="sourceLineNo">5086</span>    region.put(put);<a name="line.5086"></a>
+<span class="sourceLineNo">5087</span>    put = new Put(rowB);<a name="line.5087"></a>
+<span class="sourceLineNo">5088</span>    put.add(kv2);<a name="line.5088"></a>
+<span class="sourceLineNo">5089</span>    region.put(put);<a name="line.5089"></a>
+<span class="sourceLineNo">5090</span>    put = new Put(rowC);<a name="line.5090"></a>
+<span class="sourceLineNo">5091</span>    put.add(kv3);<a name="line.5091"></a>
+<span class="sourceLineNo">5092</span>    region.put(put);<a name="line.5092"></a>
+<span class="sourceLineNo">5093</span>    put = new Put(rowD);<a name="line.5093"></a>
+<span class="sourceLineNo">5094</span>    put.add(kv4_1);<a name="line.5094"></a>
+<span class="sourceLineNo">5095</span>    region.put(put);<a name="line.5095"></a>
+<span class="sourceLineNo">5096</span>    put = new Put(rowD);<a name="line.5096"></a>
+<span class="sourceLineNo">5097</span>    put.add(kv4_2);<a name="line.5097"></a>
+<span class="sourceLineNo">5098</span>    region.put(put);<a name="line.5098"></a>
+<span class="sourceLineNo">5099</span>    put = new Put(rowE);<a name="line.5099"></a>
+<span class="sourceLineNo">5100</span>    put.add(kv5);<a name="line.5100"></a>
+<span class="sourceLineNo">5101</span>    region.put(put);<a name="line.5101"></a>
+<span class="sourceLineNo">5102</span>    region.flush(true);<a name="line.5102"></a>
+<span class="sourceLineNo">5103</span>    Scan scan = new Scan(rowD, rowA);<a name="line.5103"></a>
+<span class="sourceLineNo">5104</span>    scan.addColumn(families[0], col1);<a name="line.5104"></a>
+<span class="sourceLineNo">5105</span>    scan.setReversed(true);<a name="line.5105"></a>
+<span class="sourceLineNo">5106</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5106"></a>
+<span class="sourceLineNo">5107</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5107"></a>
+<span class="sourceLineNo">5108</span>    boolean hasNext = scanner.next(currRow);<a name="line.5108"></a>
+<span class="sourceLineNo">5109</span>    assertEquals(1, currRow.size());<a name="line.5109"></a>
+<span class="sourceLineNo">5110</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5110"></a>
+<span class="sourceLineNo">5111</span>        .get(0).getRowLength(), rowD, 0, rowD.length));<a name="line.5111"></a>
+<span class="sourceLineNo">5112</span>    assertTrue(hasNext);<a name="line.5112"></a>
+<span class="sourceLineNo">5113</span>    currRow.clear();<a name="line.5113"></a>
+<span class="sourceLineNo">5114</span>    hasNext = scanner.next(currRow);<a name="line.5114"></a>
+<span class="sourceLineNo">5115</span>    assertEquals(1, currRow.size());<a name="line.5115"></a>
+<span class="sourceLineNo">5116</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5116"></a>
+<span class="sourceLineNo">5117</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.5117"></a>
+<span class="sourceLineNo">5118</span>    assertTrue(hasNext);<a name="line.5118"></a>
+<span class="sourceLineNo">5119</span>    currRow.clear();<a name="line.5119"></a>
+<span class="sourceLineNo">5120</span>    hasNext = scanner.next(currRow);<a name="line.5120"></a>
+<span class="sourceLineNo">5121</span>    assertEquals(1, currRow.size());<a name="line.5121"></a>
+<span class="sourceLineNo">5122</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5122"></a>
+<span class="sourceLineNo">5123</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.5123"></a>
+<span class="sourceLineNo">5124</span>    assertFalse(hasNext);<a name="line.5124"></a>
+<span class="sourceLineNo">5125</span>    scanner.close();<a name="line.5125"></a>
+<span class="sourceLineNo">5126</span><a name="line.5126"></a>
+<span class="sourceLineNo">5127</span>    scan = new Scan(rowD, rowA);<a name="line.5127"></a>
+<span class="sourceLineNo">5128</span>    scan.addColumn(families[0], col2);<a name="line.5128"></a>
+<span class="sourceLineNo">5129</span>    scan.setReversed(true);<a name="line.5129"></a>
+<span class="sourceLineNo">5130</span>    currRow.clear();<a name="line.5130"></a>
+<span class="sourceLineNo">5131</span>    scanner = region.getScanner(scan);<a name="line.5131"></a>
+<span class="sourceLineNo">5132</span>    hasNext = scanner.next(currRow);<a name="line.5132"></a>
+<span class="sourceLineNo">5133</span>    assertEquals(1, currRow.size());<a name="line.5133"></a>
+<span class="sourceLineNo">5134</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5134"></a>
+<span class="sourceLineNo">5135</span>        .get(0).getRowLength(), rowD, 0, rowD.length));<a name="line.5135"></a>
+<span class="sourceLineNo">5136</span>    scanner.close();<a name="line.5136"></a>
+<span class="sourceLineNo">5137</span>  }<a name="line.5137"></a>
+<span class="sourceLineNo">5138</span><a name="line.5138"></a>
+<span class="sourceLineNo">5139</span>  @Test<a name="line.5139"></a>
+<span class="sourceLineNo">5140</span>  public void testReverseScanner_smaller_blocksize() throws IOException {<a name="line.5140"></a>
+<span class="sourceLineNo">5141</span>    // case to ensure no conflict with HFile index optimization<a name="line.5141"></a>
+<span class="sourceLineNo">5142</span>    byte[] rowA = Bytes.toBytes("rowA");<a name="line.5142"></a>
+<span class="sourceLineNo">5143</span>    byte[] rowB = Bytes.toBytes("rowB");<a name="line.5143"></a>
+<span class="sourceLineNo">5144</span>    byte[] rowC = Bytes.toBytes("rowC");<a name="line.5144"></a>
+<span class="sourceLineNo">5145</span>    byte[] rowD = Bytes.toBytes("rowD");<a name="line.5145"></a>
+<span class="sourceLineNo">5146</span>    byte[] rowE = Bytes.toBytes("rowE");<a name="line.5146"></a>
+<span class="sourceLineNo">5147</span>    byte[] cf = Bytes.toBytes("CF");<a name="line.5147"></a>
+<span class="sourceLineNo">5148</span>    byte[][] families = { cf };<a name="line.5148"></a>
+<span class="sourceLineNo">5149</span>    byte[] col1 = Bytes.toBytes("col1");<a name="line.5149"></a>
+<span class="sourceLineNo">5150</span>    byte[] col2 = Bytes.toBytes("col2");<a name="line.5150"></a>
+<span class="sourceLineNo">5151</span>    long ts = 1;<a name="line.5151"></a>
+<span class="sourceLineNo">5152</span>    HBaseConfiguration config = new HBaseConfiguration();<a name="line.5152"></a>
+<span class="sourceLineNo">5153</span>    config.setInt("test.block.size", 1);<a name="line.5153"></a>
+<span class="sourceLineNo">5154</span>    this.region = initHRegion(tableName, method, config, families);<a name="line.5154"></a>
+<span class="sourceLineNo">5155</span>    KeyValue kv1 = new KeyValue(rowA, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5155"></a>
+<span class="sourceLineNo">5156</span>    KeyValue kv2 = new KeyValue(rowB, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5156"></a>
+<span class="sourceLineNo">5157</span>    KeyValue kv3 = new KeyValue(rowC, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5157"></a>
+<span class="sourceLineNo">5158</span>    KeyValue kv4_1 = new KeyValue(rowD, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5158"></a>
+<span class="sourceLineNo">5159</span>    KeyValue kv4_2 = new KeyValue(rowD, cf, col2, ts, KeyValue.Type.Put, null);<a name="line.5159"></a>
+<span class="sourceLineNo">5160</span>    KeyValue kv5 = new KeyValue(rowE, cf, col1, ts, KeyValue.Type.Put, null);<a name="line.5160"></a>
+<span class="sourceLineNo">5161</span>    Put put = null;<a name="line.5161"></a>
+<span class="sourceLineNo">5162</span>    put = new Put(rowA);<a name="line.5162"></a>
+<span class="sourceLineNo">5163</span>    put.add(kv1);<a name="line.5163"></a>
+<span class="sourceLineNo">5164</span>    region.put(put);<a name="line.5164"></a>
+<span class="sourceLineNo">5165</span>    put = new Put(rowB);<a name="line.5165"></a>
+<span class="sourceLineNo">5166</span>    put.add(kv2);<a name="line.5166"></a>
+<span class="sourceLineNo">5167</span>    region.put(put);<a name="line.5167"></a>
+<span class="sourceLineNo">5168</span>    put = new Put(rowC);<a name="line.5168"></a>
+<span class="sourceLineNo">5169</span>    put.add(kv3);<a name="line.5169"></a>
+<span class="sourceLineNo">5170</span>    region.put(put);<a name="line.5170"></a>
+<span class="sourceLineNo">5171</span>    put = new Put(rowD);<a name="line.5171"></a>
+<span class="sourceLineNo">5172</span>    put.add(kv4_1);<a name="line.5172"></a>
+<span class="sourceLineNo">5173</span>    region.put(put);<a name="line.5173"></a>
+<span class="sourceLineNo">5174</span>    put = new Put(rowD);<a name="line.5174"></a>
+<span class="sourceLineNo">5175</span>    put.add(kv4_2);<a name="line.5175"></a>
+<span class="sourceLineNo">5176</span>    region.put(put);<a name="line.5176"></a>
+<span class="sourceLineNo">5177</span>    put = new Put(rowE);<a name="line.5177"></a>
+<span class="sourceLineNo">5178</span>    put.add(kv5);<a name="line.5178"></a>
+<span class="sourceLineNo">5179</span>    region.put(put);<a name="line.5179"></a>
+<span class="sourceLineNo">5180</span>    region.flush(true);<a name="line.5180"></a>
+<span class="sourceLineNo">5181</span>    Scan scan = new Scan(rowD, rowA);<a name="line.5181"></a>
+<span class="sourceLineNo">5182</span>    scan.addColumn(families[0], col1);<a name="line.5182"></a>
+<span class="sourceLineNo">5183</span>    scan.setReversed(true);<a name="line.5183"></a>
+<span class="sourceLineNo">5184</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5184"></a>
+<span class="sourceLineNo">5185</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5185"></a>
+<span class="sourceLineNo">5186</span>    boolean hasNext = scanner.next(currRow);<a name="line.5186"></a>
+<span class="sourceLineNo">5187</span>    assertEquals(1, currRow.size());<a name="line.5187"></a>
+<span class="sourceLineNo">5188</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5188"></a>
+<span class="sourceLineNo">5189</span>        .get(0).getRowLength(), rowD, 0, rowD.length));<a name="line.5189"></a>
+<span class="sourceLineNo">5190</span>    assertTrue(hasNext);<a name="line.5190"></a>
+<span class="sourceLineNo">5191</span>    currRow.clear();<a name="line.5191"></a>
+<span class="sourceLineNo">5192</span>    hasNext = scanner.next(currRow);<a name="line.5192"></a>
+<span class="sourceLineNo">5193</span>    assertEquals(1, currRow.size());<a name="line.5193"></a>
+<span class="sourceLineNo">5194</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5194"></a>
+<span class="sourceLineNo">5195</span>        .get(0).getRowLength(), rowC, 0, rowC.length));<a name="line.5195"></a>
+<span class="sourceLineNo">5196</span>    assertTrue(hasNext);<a name="line.5196"></a>
+<span class="sourceLineNo">5197</span>    currRow.clear();<a name="line.5197"></a>
+<span class="sourceLineNo">5198</span>    hasNext = scanner.next(currRow);<a name="line.5198"></a>
+<span class="sourceLineNo">5199</span>    assertEquals(1, currRow.size());<a name="line.5199"></a>
+<span class="sourceLineNo">5200</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5200"></a>
+<span class="sourceLineNo">5201</span>        .get(0).getRowLength(), rowB, 0, rowB.length));<a name="line.5201"></a>
+<span class="sourceLineNo">5202</span>    assertFalse(hasNext);<a name="line.5202"></a>
+<span class="sourceLineNo">5203</span>    scanner.close();<a name="line.5203"></a>
+<span class="sourceLineNo">5204</span><a name="line.5204"></a>
+<span class="sourceLineNo">5205</span>    scan = new Scan(rowD, rowA);<a name="line.5205"></a>
+<span class="sourceLineNo">5206</span>    scan.addColumn(families[0], col2);<a name="line.5206"></a>
+<span class="sourceLineNo">5207</span>    scan.setReversed(true);<a name="line.5207"></a>
+<span class="sourceLineNo">5208</span>    currRow.clear();<a name="line.5208"></a>
+<span class="sourceLineNo">5209</span>    scanner = region.getScanner(scan);<a name="line.5209"></a>
+<span class="sourceLineNo">5210</span>    hasNext = scanner.next(currRow);<a name="line.5210"></a>
+<span class="sourceLineNo">5211</span>    assertEquals(1, currRow.size());<a name="line.5211"></a>
+<span class="sourceLineNo">5212</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5212"></a>
+<span class="sourceLineNo">5213</span>        .get(0).getRowLength(), rowD, 0, rowD.length));<a name="line.5213"></a>
+<span class="sourceLineNo">5214</span>    scanner.close();<a name="line.5214"></a>
+<span class="sourceLineNo">5215</span>  }<a name="line.5215"></a>
+<span class="sourceLineNo">5216</span><a name="line.5216"></a>
+<span class="sourceLineNo">5217</span>  @Test<a name="line.5217"></a>
+<span class="sourceLineNo">5218</span>  public void testReverseScanner_FromMemStoreAndHFiles_MultiCFs1()<a name="line.5218"></a>
+<span class="sourceLineNo">5219</span>      throws IOException {<a name="line.5219"></a>
+<span class="sourceLineNo">5220</span>    byte[] row0 = Bytes.toBytes("row0"); // 1 kv<a name="line.5220"></a>
+<span class="sourceLineNo">5221</span>    byte[] row1 = Bytes.toBytes("row1"); // 2 kv<a name="line.5221"></a>
+<span class="sourceLineNo">5222</span>    byte[] row2 = Bytes.toBytes("row2"); // 4 kv<a name="line.5222"></a>
+<span class="sourceLineNo">5223</span>    byte[] row3 = Bytes.toBytes("row3"); // 2 kv<a name="line.5223"></a>
+<span class="sourceLineNo">5224</span>    byte[] row4 = Bytes.toBytes("row4"); // 5 kv<a name="line.5224"></a>
+<span class="sourceLineNo">5225</span>    byte[] row5 = Bytes.toBytes("row5"); // 2 kv<a name="line.5225"></a>
+<span class="sourceLineNo">5226</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5226"></a>
+<span class="sourceLineNo">5227</span>    byte[] cf2 = Bytes.toBytes("CF2");<a name="line.5227"></a>
+<span class="sourceLineNo">5228</span>    byte[] cf3 = Bytes.toBytes("CF3");<a name="line.5228"></a>
+<span class="sourceLineNo">5229</span>    byte[][] families = { cf1, cf2, cf3 };<a name="line.5229"></a>
+<span class="sourceLineNo">5230</span>    byte[] col = Bytes.toBytes("C");<a name="line.5230"></a>
+<span class="sourceLineNo">5231</span>    long ts = 1;<a name="line.5231"></a>
+<span class="sourceLineNo">5232</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5232"></a>
+<span class="sourceLineNo">5233</span>    // disable compactions in this test.<a name="line.5233"></a>
+<span class="sourceLineNo">5234</span>    conf.setInt("hbase.hstore.compactionThreshold", 10000);<a name="line.5234"></a>
+<span class="sourceLineNo">5235</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5235"></a>
+<span class="sourceLineNo">5236</span>    // kv naming style: kv(row number) totalKvCountInThisRow seq no<a name="line.5236"></a>
+<span class="sourceLineNo">5237</span>    KeyValue kv0_1_1 = new KeyValue(row0, cf1, col, ts, KeyValue.Type.Put,<a name="line.5237"></a>
 <span class="sourceLineNo">5238</span>        null);<a name="line.5238"></a>
-<span class="sourceLineNo">5239</span>    KeyValue kv2_4_4 = new KeyValue(row2, cf1, col, ts + 4,<a name="line.5239"></a>
-<span class="sourceLineNo">5240</span>        KeyValue.Type.Put, null);<a name="line.5240"></a>
-<span class="sourceLineNo">5241</span>    KeyValue kv3_2_1 = new KeyValue(row3, cf2, col, ts, KeyValue.Type.Put,<a name="line.5241"></a>
-<span class="sourceLineNo">5242</span>        null);<a name="line.5242"></a>
-<span class="sourceLineNo">5243</span>    KeyValue kv3_2_2 = new KeyValue(row3, cf1, col, ts + 4,<a name="line.5243"></a>
-<span class="sourceLineNo">5244</span>        KeyValue.Type.Put, null);<a name="line.5244"></a>
-<span class="sourceLineNo">5245</span>    KeyValue kv4_5_1 = new KeyValue(row4, cf1, col, ts, KeyValue.Type.Put,<a name="line.5245"></a>
+<span class="sourceLineNo">5239</span>    KeyValue kv1_2_1 = new KeyValue(row1, cf2, col, ts, KeyValue.Type.Put,<a name="line.5239"></a>
+<span class="sourceLineNo">5240</span>        null);<a name="line.5240"></a>
+<span class="sourceLineNo">5241</span>    KeyValue kv1_2_2 = new KeyValue(row1, cf1, col, ts + 1,<a name="line.5241"></a>
+<span class="sourceLineNo">5242</span>        KeyValue.Type.Put, null);<a name="line.5242"></a>
+<span class="sourceLineNo">5243</span>    KeyValue kv2_4_1 = new KeyValue(row2, cf2, col, ts, KeyValue.Type.Put,<a name="line.5243"></a>
+<span class="sourceLineNo">5244</span>        null);<a name="line.5244"></a>
+<span class="sourceLineNo">5245</span>    KeyValue kv2_4_2 = new KeyValue(row2, cf1, col, ts, KeyValue.Type.Put,<a name="line.5245"></a>
 <span class="sourceLineNo">5246</span>        null);<a name="line.5246"></a>
-<span class="sourceLineNo">5247</span>    KeyValue kv4_5_2 = new KeyValue(row4, cf3, col, ts, KeyValue.Type.Put,<a name="line.5247"></a>
+<span class="sourceLineNo">5247</span>    KeyValue kv2_4_3 = new KeyValue(row2, cf3, col, ts, KeyValue.Type.Put,<a name="line.5247"></a>
 <span class="sourceLineNo">5248</span>        null);<a name="line.5248"></a>
-<span class="sourceLineNo">5249</span>    KeyValue kv4_5_3 = new KeyValue(row4, cf3, col, ts + 5,<a name="line.5249"></a>
+<span class="sourceLineNo">5249</span>    KeyValue kv2_4_4 = new KeyValue(row2, cf1, col, ts + 4,<a name="line.5249"></a>
 <span class="sourceLineNo">5250</span>        KeyValue.Type.Put, null);<a name="line.5250"></a>
-<span class="sourceLineNo">5251</span>    KeyValue kv4_5_4 = new KeyValue(row4, cf2, col, ts, KeyValue.Type.Put,<a name="line.5251"></a>
+<span class="sourceLineNo">5251</span>    KeyValue kv3_2_1 = new KeyValue(row3, cf2, col, ts, KeyValue.Type.Put,<a name="line.5251"></a>
 <span class="sourceLineNo">5252</span>        null);<a name="line.5252"></a>
-<span class="sourceLineNo">5253</span>    KeyValue kv4_5_5 = new KeyValue(row4, cf1, col, ts + 3,<a name="line.5253"></a>
+<span class="sourceLineNo">5253</span>    KeyValue kv3_2_2 = new KeyValue(row3, cf1, col, ts + 4,<a name="line.5253"></a>
 <span class="sourceLineNo">5254</span>        KeyValue.Type.Put, null);<a name="line.5254"></a>
-<span class="sourceLineNo">5255</span>    KeyValue kv5_2_1 = new KeyValue(row5, cf2, col, ts, KeyValue.Type.Put,<a name="line.5255"></a>
+<span class="sourceLineNo">5255</span>    KeyValue kv4_5_1 = new KeyValue(row4, cf1, col, ts, KeyValue.Type.Put,<a name="line.5255"></a>
 <span class="sourceLineNo">5256</span>        null);<a name="line.5256"></a>
-<span class="sourceLineNo">5257</span>    KeyValue kv5_2_2 = new KeyValue(row5, cf3, col, ts, KeyValue.Type.Put,<a name="line.5257"></a>
+<span class="sourceLineNo">5257</span>    KeyValue kv4_5_2 = new KeyValue(row4, cf3, col, ts, KeyValue.Type.Put,<a name="line.5257"></a>
 <span class="sourceLineNo">5258</span>        null);<a name="line.5258"></a>
-<span class="sourceLineNo">5259</span>    // hfiles(cf1/cf2) :"row1"(1 kv) / "row2"(1 kv) / "row4"(2 kv)<a name="line.5259"></a>
-<span class="sourceLineNo">5260</span>    Put put = null;<a name="line.5260"></a>
-<span class="sourceLineNo">5261</span>    put = new Put(row1);<a name="line.5261"></a>
-<span class="sourceLineNo">5262</span>    put.add(kv1_2_1);<a name="line.5262"></a>
-<span class="sourceLineNo">5263</span>    region.put(put);<a name="line.5263"></a>
-<span class="sourceLineNo">5264</span>    put = new Put(row2);<a name="line.5264"></a>
-<span class="sourceLineNo">5265</span>    put.add(kv2_4_1);<a name="line.5265"></a>
-<span class="sourceLineNo">5266</span>    region.put(put);<a name="line.5266"></a>
-<span class="sourceLineNo">5267</span>    put = new Put(row4);<a name="line.5267"></a>
-<span class="sourceLineNo">5268</span>    put.add(kv4_5_4);<a name="line.5268"></a>
-<span class="sourceLineNo">5269</span>    put.add(kv4_5_5);<a name="line.5269"></a>
-<span class="sourceLineNo">5270</span>    region.put(put);<a name="line.5270"></a>
-<span class="sourceLineNo">5271</span>    region.flush(true);<a name="line.5271"></a>
-<span class="sourceLineNo">5272</span>    // hfiles(cf1/cf3) : "row1" (1 kvs) / "row2" (1 kv) / "row4" (2 kv)<a name="line.5272"></a>
-<span class="sourceLineNo">5273</span>    put = new Put(row4);<a name="line.5273"></a>
-<span class="sourceLineNo">5274</span>    put.add(kv4_5_1);<a name="line.5274"></a>
-<span class="sourceLineNo">5275</span>    put.add(kv4_5_3);<a name="line.5275"></a>
+<span class="sourceLineNo">5259</span>    KeyValue kv4_5_3 = new KeyValue(row4, cf3, col, ts + 5,<a name="line.5259"></a>
+<span class="sourceLineNo">5260</span>        KeyValue.Type.Put, null);<a name="line.5260"></a>
+<span class="sourceLineNo">5261</span>    KeyValue kv4_5_4 = new KeyValue(row4, cf2, col, ts, KeyValue.Type.Put,<a name="line.5261"></a>
+<span class="sourceLineNo">5262</span>        null);<a name="line.5262"></a>
+<span class="sourceLineNo">5263</span>    KeyValue kv4_5_5 = new KeyValue(row4, cf1, col, ts + 3,<a name="line.5263"></a>
+<span class="sourceLineNo">5264</span>        KeyValue.Type.Put, null);<a name="line.5264"></a>
+<span class="sourceLineNo">5265</span>    KeyValue kv5_2_1 = new KeyValue(row5, cf2, col, ts, KeyValue.Type.Put,<a name="line.5265"></a>
+<span class="sourceLineNo">5266</span>        null);<a name="line.5266"></a>
+<span class="sourceLineNo">5267</span>    KeyValue kv5_2_2 = new KeyValue(row5, cf3, col, ts, KeyValue.Type.Put,<a name="line.5267"></a>
+<span class="sourceLineNo">5268</span>        null);<a name="line.5268"></a>
+<span class="sourceLineNo">5269</span>    // hfiles(cf1/cf2) :"row1"(1 kv) / "row2"(1 kv) / "row4"(2 kv)<a name="line.5269"></a>
+<span class="sourceLineNo">5270</span>    Put put = null;<a name="line.5270"></a>
+<span class="sourceLineNo">5271</span>    put = new Put(row1);<a name="line.5271"></a>
+<span class="sourceLineNo">5272</span>    put.add(kv1_2_1);<a name="line.5272"></a>
+<span class="sourceLineNo">5273</span>    region.put(put);<a name="line.5273"></a>
+<span class="sourceLineNo">5274</span>    put = new Put(row2);<a name="line.5274"></a>
+<span class="sourceLineNo">5275</span>    put.add(kv2_4_1);<a name="line.5275"></a>
 <span class="sourceLineNo">5276</span>    region.put(put);<a name="line.5276"></a>
-<span class="sourceLineNo">5277</span>    put = new Put(row1);<a name="line.5277"></a>
-<span class="sourceLineNo">5278</span>    put.add(kv1_2_2);<a name="line.5278"></a>
-<span class="sourceLineNo">5279</span>    region.put(put);<a name="line.5279"></a>
-<span class="sourceLineNo">5280</span>    put = new Put(row2);<a name="line.5280"></a>
-<span class="sourceLineNo">5281</span>    put.add(kv2_4_4);<a name="line.5281"></a>
-<span class="sourceLineNo">5282</span>    region.put(put);<a name="line.5282"></a>
-<span class="sourceLineNo">5283</span>    region.flush(true);<a name="line.5283"></a>
-<span class="sourceLineNo">5284</span>    // hfiles(cf1/cf3) : "row2"(2 kv) / "row3"(1 kvs) / "row4" (1 kv)<a name="line.5284"></a>
-<span class="sourceLineNo">5285</span>    put = new Put(row4);<a name="line.5285"></a>
-<span class="sourceLineNo">5286</span>    put.add(kv4_5_2);<a name="line.5286"></a>
-<span class="sourceLineNo">5287</span>    region.put(put);<a name="line.5287"></a>
-<span class="sourceLineNo">5288</span>    put = new Put(row2);<a name="line.5288"></a>
-<span class="sourceLineNo">5289</span>    put.add(kv2_4_2);<a name="line.5289"></a>
-<span class="sourceLineNo">5290</span>    put.add(kv2_4_3);<a name="line.5290"></a>
-<span class="sourceLineNo">5291</span>    region.put(put);<a name="line.5291"></a>
-<span class="sourceLineNo">5292</span>    put = new Put(row3);<a name="line.5292"></a>
-<span class="sourceLineNo">5293</span>    put.add(kv3_2_2);<a name="line.5293"></a>
-<span class="sourceLineNo">5294</span>    region.put(put);<a name="line.5294"></a>
-<span class="sourceLineNo">5295</span>    region.flush(true);<a name="line.5295"></a>
-<span class="sourceLineNo">5296</span>    // memstore(cf1/cf2/cf3) : "row0" (1 kvs) / "row3" ( 1 kv) / "row5" (max)<a name="line.5296"></a>
-<span class="sourceLineNo">5297</span>    // ( 2 kv)<a name="line.5297"></a>
-<span class="sourceLineNo">5298</span>    put = new Put(row0);<a name="line.5298"></a>
-<span class="sourceLineNo">5299</span>    put.add(kv0_1_1);<a name="line.5299"></a>
-<span class="sourceLineNo">5300</span>    region.put(put);<a name="line.5300"></a>
-<span class="sourceLineNo">5301</span>    put = new Put(row3);<a name="line.5301"></a>
-<span class="sourceLineNo">5302</span>    put.add(kv3_2_1);<a name="line.5302"></a>
-<span class="sourceLineNo">5303</span>    region.put(put);<a name="line.5303"></a>
-<span class="sourceLineNo">5304</span>    put = new Put(row5);<a name="line.5304"></a>
-<span class="sourceLineNo">5305</span>    put.add(kv5_2_1);<a name="line.5305"></a>
-<span class="sourceLineNo">5306</span>    put.add(kv5_2_2);<a name="line.5306"></a>
-<span class="sourceLineNo">5307</span>    region.put(put);<a name="line.5307"></a>
-<span class="sourceLineNo">5308</span>    // scan range = ["row4", min), skip the max "row5"<a name="line.5308"></a>
-<span class="sourceLineNo">5309</span>    Scan scan = new Scan(row4);<a name="line.5309"></a>
-<span class="sourceLineNo">5310</span>    scan.setMaxVersions(5);<a name="line.5310"></a>
-<span class="sourceLineNo">5311</span>    scan.setBatch(3);<a name="line.5311"></a>
-<span class="sourceLineNo">5312</span>    scan.setReversed(true);<a name="line.5312"></a>
-<span class="sourceLineNo">5313</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5313"></a>
-<span class="sourceLineNo">5314</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5314"></a>
-<span class="sourceLineNo">5315</span>    boolean hasNext = false;<a name="line.5315"></a>
-<span class="sourceLineNo">5316</span>    // 1. scan out "row4" (5 kvs), "row5" can't be scanned out since not<a name="line.5316"></a>
-<span class="sourceLineNo">5317</span>    // included in scan range<a name="line.5317"></a>
-<span class="sourceLineNo">5318</span>    // "row4" takes 2 next() calls since batch=3<a name="line.5318"></a>
-<span class="sourceLineNo">5319</span>    hasNext = scanner.next(currRow);<a name="line.5319"></a>
-<span class="sourceLineNo">5320</span>    assertEquals(3, currRow.size());<a name="line.5320"></a>
-<span class="sourceLineNo">5321</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5321"></a>
-<span class="sourceLineNo">5322</span>        .get(0).getRowLength(), row4, 0, row4.length));<a name="line.5322"></a>
-<span class="sourceLineNo">5323</span>    assertTrue(hasNext);<a name="line.5323"></a>
-<span class="sourceLineNo">5324</span>    currRow.clear();<a name="line.5324"></a>
-<span class="sourceLineNo">5325</span>    hasNext = scanner.next(currRow);<a name="line.5325"></a>
-<span class="sourceLineNo">5326</span>    assertEquals(2, currRow.size());<a name="line.5326"></a>
-<span class="sourceLineNo">5327</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(),<a name="line.5327"></a>
-<span class="sourceLineNo">5328</span>        currRow.get(0).getRowLength(), row4, 0,<a name="line.5328"></a>
-<span class="sourceLineNo">5329</span>      row4.length));<a name="line.5329"></a>
-<span class="sourceLineNo">5330</span>    assertTrue(hasNext);<a name="line.5330"></a>
-<span class="sourceLineNo">5331</span>    // 2. scan out "row3" (2 kv)<a name="line.5331"></a>
-<span class="sourceLineNo">5332</span>    currRow.clear();<a name="line.5332"></a>
-<span class="sourceLineNo">5333</span>    hasNext = scanner.next(currRow);<a name="line.5333"></a>
-<span class="sourceLineNo">5334</span>    assertEquals(2, currRow.size());<a name="line.5334"></a>
-<span class="sourceLineNo">5335</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5335"></a>
-<span class="sourceLineNo">5336</span>        .get(0).getRowLength(), row3, 0, row3.length));<a name="line.5336"></a>
-<span class="sourceLineNo">5337</span>    assertTrue(hasNext);<a name="line.5337"></a>
-<span class="sourceLineNo">5338</span>    // 3. scan out "row2" (4 kvs)<a name="line.5338"></a>
-<span class="sourceLineNo">5339</span>    // "row2" takes 2 next() calls since batch=3<a name="line.5339"></a>
-<span class="sourceLineNo">5340</span>    currRow.clear();<a name="line.5340"></a>
-<span class="sourceLineNo">5341</span>    hasNext = scanner.next(currRow);<a name="line.5341"></a>
-<span class="sourceLineNo">5342</span>    assertEquals(3, currRow.size());<a name="line.5342"></a>
-<span class="sourceLineNo">5343</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5343"></a>
-<span class="sourceLineNo">5344</span>        .get(0).getRowLength(), row2, 0, row2.length));<a name="line.5344"></a>
-<span class="sourceLineNo">5345</span>    assertTrue(hasNext);<a name="line.5345"></a>
-<span class="sourceLineNo">5346</span>    currRow.clear();<a name="line.5346"></a>
-<span class="sourceLineNo">5347</span>    hasNext = scanner.next(currRow);<a name="line.5347"></a>
-<span class="sourceLineNo">5348</span>    assertEquals(1, currRow.size());<a name="line.5348"></a>
-<span class="sourceLineNo">5349</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5349"></a>
-<span class="sourceLineNo">5350</span>        .get(0).getRowLength(), row2, 0, row2.length));<a name="line.5350"></a>
-<span class="sourceLineNo">5351</span>    assertTrue(hasNext);<a name="line.5351"></a>
-<span class="sourceLineNo">5352</span>    // 4. scan out "row1" (2 kv)<a name="line.5352"></a>
-<span class="sourceLineNo">5353</span>    currRow.clear();<a name="line.5353"></a>
-<span class="sourceLineNo">5354</span>    hasNext = scanner.next(currRow);<a name="line.5354"></a>
-<span class="sourceLineNo">5355</span>    assertEquals(2, currRow.size());<a name="line.5355"></a>
-<span class="sourceLineNo">5356</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5356"></a>
-<span class="sourceLineNo">5357</span>        .get(0).getRowLength(), row1, 0, row1.length));<a name="line.5357"></a>
-<span class="sourceLineNo">5358</span>    assertTrue(hasNext);<a name="line.5358"></a>
-<span class="sourceLineNo">5359</span>    // 5. scan out "row0" (1 kv)<a name="line.5359"></a>
-<span class="sourceLineNo">5360</span>    currRow.clear();<a name="line.5360"></a>
-<span class="sourceLineNo">5361</span>    hasNext = scanner.next(currRow);<a name="line.5361"></a>
-<span class="sourceLineNo">5362</span>    assertEquals(1, currRow.size());<a name="line.5362"></a>
-<span class="sourceLineNo">5363</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5363"></a>
-<span class="sourceLineNo">5364</span>        .get(0).getRowLength(), row0, 0, row0.length));<a name="line.5364"></a>
-<span class="sourceLineNo">5365</span>    assertFalse(hasNext);<a name="line.5365"></a>
-<span class="sourceLineNo">5366</span><a name="line.5366"></a>
-<span class="sourceLineNo">5367</span>    scanner.close();<a name="line.5367"></a>
-<span class="sourceLineNo">5368</span>  }<a name="line.5368"></a>
-<span class="sourceLineNo">5369</span><a name="line.5369"></a>
-<span class="sourceLineNo">5370</span>  @Test<a name="line.5370"></a>
-<span class="sourceLineNo">5371</span>  public void testReverseScanner_FromMemStoreAndHFiles_MultiCFs2()<a name="line.5371"></a>
-<span class="sourceLineNo">5372</span>      throws IOException {<a name="line.5372"></a>
-<span class="sourceLineNo">5373</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.5373"></a>
-<span class="sourceLineNo">5374</span>    byte[] row2 = Bytes.toBytes("row2");<a name="line.5374"></a>
-<span class="sourceLineNo">5375</span>    byte[] row3 = Bytes.toBytes("row3");<a name="line.5375"></a>
-<span class="sourceLineNo">5376</span>    byte[] row4 = Bytes.toBytes("row4");<a name="line.5376"></a>
-<span class="sourceLineNo">5377</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5377"></a>
-<span class="sourceLineNo">5378</span>    byte[] cf2 = Bytes.toBytes("CF2");<a name="line.5378"></a>
-<span class="sourceLineNo">5379</span>    byte[] cf3 = Bytes.toBytes("CF3");<a name="line.5379"></a>
-<span class="sourceLineNo">5380</span>    byte[] cf4 = Bytes.toBytes("CF4");<a name="line.5380"></a>
-<span class="sourceLineNo">5381</span>    byte[][] families = { cf1, cf2, cf3, cf4 };<a name="line.5381"></a>
-<span class="sourceLineNo">5382</span>    byte[] col = Bytes.toBytes("C");<a name="line.5382"></a>
-<span class="sourceLineNo">5383</span>    long ts = 1;<a name="line.5383"></a>
-<span class="sourceLineNo">5384</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5384"></a>
-<span class="sourceLineNo">5385</span>    // disable compactions in this test.<a name="line.5385"></a>
-<span class="sourceLineNo">5386</span>    conf.setInt("hbase.hstore.compactionThreshold", 10000);<a name="line.5386"></a>
-<span class="sourceLineNo">5387</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5387"></a>
-<span class="sourceLineNo">5388</span>    KeyValue kv1 = new KeyValue(row1, cf1, col, ts, KeyValue.Type.Put, null);<a name="line.5388"></a>
-<span class="sourceLineNo">5389</span>    KeyValue kv2 = new KeyValue(row2, cf2, col, ts, KeyValue.Type.Put, null);<a name="line.5389"></a>
-<span class="sourceLineNo">5390</span>    KeyValue kv3 = new KeyValue(row3, cf3, col, ts, KeyValue.Type.Put, null);<a name="line.5390"></a>
-<span class="sourceLineNo">5391</span>    KeyValue kv4 = new KeyValue(row4, cf4, col, ts, KeyValue.Type.Put, null);<a name="line.5391"></a>
-<span class="sourceLineNo">5392</span>    // storefile1<a name="line.5392"></a>
-<span class="sourceLineNo">5393</span>    Put put = new Put(row1);<a name="line.5393"></a>
-<span class="sourceLineNo">5394</span>    put.add(kv1);<a name="line.5394"></a>
-<span class="sourceLineNo">5395</span>    region.put(put);<a name="line.5395"></a>
-<span class="sourceLineNo">5396</span>    region.flush(true);<a name="line.5396"></a>
-<span class="sourceLineNo">5397</span>    // storefile2<a name="line.5397"></a>
-<span class="sourceLineNo">5398</span>    put = new Put(row2);<a name="line.5398"></a>
-<span class="sourceLineNo">5399</span>    put.add(kv2);<a name="line.5399"></a>
-<span class="sourceLineNo">5400</span>    region.put(put);<a name="line.5400"></a>
-<span class="sourceLineNo">5401</span>    region.flush(true);<a name="line.5401"></a>
-<span class="sourceLineNo">5402</span>    // storefile3<a name="line.5402"></a>
-<span class="sourceLineNo">5403</span>    put = new Put(row3);<a name="line.5403"></a>
-<span class="sourceLineNo">5404</span>    put.add(kv3);<a name="line.5404"></a>
+<span class="sourceLineNo">5277</span>    put = new Put(row4);<a name="line.5277"></a>
+<span class="sourceLineNo">5278</span>    put.add(kv4_5_4);<a name="line.5278"></a>
+<span class="sourceLineNo">5279</span>    put.add(kv4_5_5);<a name="line.5279"></a>
+<span class="sourceLineNo">5280</span>    region.put(put);<a name="line.5280"></a>
+<span class="sourceLineNo">5281</span>    region.flush(true);<a name="line.5281"></a>
+<span class="sourceLineNo">5282</span>    // hfiles(cf1/cf3) : "row1" (1 kvs) / "row2" (1 kv) / "row4" (2 kv)<a name="line.5282"></a>
+<span class="sourceLineNo">5283</span>    put = new Put(row4);<a name="line.5283"></a>
+<span class="sourceLineNo">5284</span>    put.add(kv4_5_1);<a name="line.5284"></a>
+<span class="sourceLineNo">5285</span>    put.add(kv4_5_3);<a name="line.5285"></a>
+<span class="sourceLineNo">5286</span>    region.put(put);<a name="line.5286"></a>
+<span class="sourceLineNo">5287</span>    put = new Put(row1);<a name="line.5287"></a>
+<span class="sourceLineNo">5288</span>    put.add(kv1_2_2);<a name="line.5288"></a>
+<span class="sourceLineNo">5289</span>    region.put(put);<a name="line.5289"></a>
+<span class="sourceLineNo">5290</span>    put = new Put(row2);<a name="line.5290"></a>
+<span class="sourceLineNo">5291</span>    put.add(kv2_4_4);<a name="line.5291"></a>
+<span class="sourceLineNo">5292</span>    region.put(put);<a name="line.5292"></a>
+<span class="sourceLineNo">5293</span>    region.flush(true);<a name="line.5293"></a>
+<span class="sourceLineNo">5294</span>    // hfiles(cf1/cf3) : "row2"(2 kv) / "row3"(1 kvs) / "row4" (1 kv)<a name="line.5294"></a>
+<span class="sourceLineNo">5295</span>    put = new Put(row4);<a name="line.5295"></a>
+<span class="sourceLineNo">5296</span>    put.add(kv4_5_2);<a name="line.5296"></a>
+<span class="sourceLineNo">5297</span>    region.put(put);<a name="line.5297"></a>
+<span class="sourceLineNo">5298</span>    put = new Put(row2);<a name="line.5298"></a>
+<span class="sourceLineNo">5299</span>    put.add(kv2_4_2);<a name="line.5299"></a>
+<span class="sourceLineNo">5300</span>    put.add(kv2_4_3);<a name="line.5300"></a>
+<span class="sourceLineNo">5301</span>    region.put(put);<a name="line.5301"></a>
+<span class="sourceLineNo">5302</span>    put = new Put(row3);<a name="line.5302"></a>
+<span class="sourceLineNo">5303</span>    put.add(kv3_2_2);<a name="line.5303"></a>
+<span class="sourceLineNo">5304</span>    region.put(put);<a name="line.5304"></a>
+<span class="sourceLineNo">5305</span>    region.flush(true);<a name="line.5305"></a>
+<span class="sourceLineNo">5306</span>    // memstore(cf1/cf2/cf3) : "row0" (1 kvs) / "row3" ( 1 kv) / "row5" (max)<a name="line.5306"></a>
+<span class="sourceLineNo">5307</span>    // ( 2 kv)<a name="line.5307"></a>
+<span class="sourceLineNo">5308</span>    put = new Put(row0);<a name="line.5308"></a>
+<span class="sourceLineNo">5309</span>    put.add(kv0_1_1);<a name="line.5309"></a>
+<span class="sourceLineNo">5310</span>    region.put(put);<a name="line.5310"></a>
+<span class="sourceLineNo">5311</span>    put = new Put(row3);<a name="line.5311"></a>
+<span class="sourceLineNo">5312</span>    put.add(kv3_2_1);<a name="line.5312"></a>
+<span class="sourceLineNo">5313</span>    region.put(put);<a name="line.5313"></a>
+<span class="sourceLineNo">5314</span>    put = new Put(row5);<a name="line.5314"></a>
+<span class="sourceLineNo">5315</span>    put.add(kv5_2_1);<a name="line.5315"></a>
+<span class="sourceLineNo">5316</span>    put.add(kv5_2_2);<a name="line.5316"></a>
+<span class="sourceLineNo">5317</span>    region.put(put);<a name="line.5317"></a>
+<span class="sourceLineNo">5318</span>    // scan range = ["row4", min), skip the max "row5"<a name="line.5318"></a>
+<span class="sourceLineNo">5319</span>    Scan scan = new Scan(row4);<a name="line.5319"></a>
+<span class="sourceLineNo">5320</span>    scan.setMaxVersions(5);<a name="line.5320"></a>
+<span class="sourceLineNo">5321</span>    scan.setBatch(3);<a name="line.5321"></a>
+<span class="sourceLineNo">5322</span>    scan.setReversed(true);<a name="line.5322"></a>
+<span class="sourceLineNo">5323</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5323"></a>
+<span class="sourceLineNo">5324</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5324"></a>
+<span class="sourceLineNo">5325</span>    boolean hasNext = false;<a name="line.5325"></a>
+<span class="sourceLineNo">5326</span>    // 1. scan out "row4" (5 kvs), "row5" can't be scanned out since not<a name="line.5326"></a>
+<span class="sourceLineNo">5327</span>    // included in scan range<a name="line.5327"></a>
+<span class="sourceLineNo">5328</span>    // "row4" takes 2 next() calls since batch=3<a name="line.5328"></a>
+<span class="sourceLineNo">5329</span>    hasNext = scanner.next(currRow);<a name="line.5329"></a>
+<span class="sourceLineNo">5330</span>    assertEquals(3, currRow.size());<a name="line.5330"></a>
+<span class="sourceLineNo">5331</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5331"></a>
+<span class="sourceLineNo">5332</span>        .get(0).getRowLength(), row4, 0, row4.length));<a name="line.5332"></a>
+<span class="sourceLineNo">5333</span>    assertTrue(hasNext);<a name="line.5333"></a>
+<span class="sourceLineNo">5334</span>    currRow.clear();<a name="line.5334"></a>
+<span class="sourceLineNo">5335</span>    hasNext = scanner.next(currRow);<a name="line.5335"></a>
+<span class="sourceLineNo">5336</span>    assertEquals(2, currRow.size());<a name="line.5336"></a>
+<span class="sourceLineNo">5337</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(),<a name="line.5337"></a>
+<span class="sourceLineNo">5338</span>        currRow.get(0).getRowLength(), row4, 0,<a name="line.5338"></a>
+<span class="sourceLineNo">5339</span>      row4.length));<a name="line.5339"></a>
+<span class="sourceLineNo">5340</span>    assertTrue(hasNext);<a name="line.5340"></a>
+<span class="sourceLineNo">5341</span>    // 2. scan out "row3" (2 kv)<a name="line.5341"></a>
+<span class="sourceLineNo">5342</span>    currRow.clear();<a name="line.5342"></a>
+<span class="sourceLineNo">5343</span>    hasNext = scanner.next(currRow);<a name="line.5343"></a>
+<span class="sourceLineNo">5344</span>    assertEquals(2, currRow.size());<a name="line.5344"></a>
+<span class="sourceLineNo">5345</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5345"></a>
+<span class="sourceLineNo">5346</span>        .get(0).getRowLength(), row3, 0, row3.length));<a name="line.5346"></a>
+<span class="sourceLineNo">5347</span>    assertTrue(hasNext);<a name="line.5347"></a>
+<span class="sourceLineNo">5348</span>    // 3. scan out "row2" (4 kvs)<a name="line.5348"></a>
+<span class="sourceLineNo">5349</span>    // "row2" takes 2 next() calls since batch=3<a name="line.5349"></a>
+<span class="sourceLineNo">5350</span>    currRow.clear();<a name="line.5350"></a>
+<span class="sourceLineNo">5351</span>    hasNext = scanner.next(currRow);<a name="line.5351"></a>
+<span class="sourceLineNo">5352</span>    assertEquals(3, currRow.size());<a name="line.5352"></a>
+<span class="sourceLineNo">5353</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5353"></a>
+<span class="sourceLineNo">5354</span>        .get(0).getRowLength(), row2, 0, row2.length));<a name="line.5354"></a>
+<span class="sourceLineNo">5355</span>    assertTrue(hasNext);<a name="line.5355"></a>
+<span class="sourceLineNo">5356</span>    currRow.clear();<a name="line.5356"></a>
+<span class="sourceLineNo">5357</span>    hasNext = scanner.next(currRow);<a name="line.5357"></a>
+<span class="sourceLineNo">5358</span>    assertEquals(1, currRow.size());<a name="line.5358"></a>
+<span class="sourceLineNo">5359</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5359"></a>
+<span class="sourceLineNo">5360</span>        .get(0).getRowLength(), row2, 0, row2.length));<a name="line.5360"></a>
+<span class="sourceLineNo">5361</span>    assertTrue(hasNext);<a name="line.5361"></a>
+<span class="sourceLineNo">5362</span>    // 4. scan out "row1" (2 kv)<a name="line.5362"></a>
+<span class="sourceLineNo">5363</span>    currRow.clear();<a name="line.5363"></a>
+<span class="sourceLineNo">5364</span>    hasNext = scanner.next(currRow);<a name="line.5364"></a>
+<span class="sourceLineNo">5365</span>    assertEquals(2, currRow.size());<a name="line.5365"></a>
+<span class="sourceLineNo">5366</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5366"></a>
+<span class="sourceLineNo">5367</span>        .get(0).getRowLength(), row1, 0, row1.length));<a name="line.5367"></a>
+<span class="sourceLineNo">5368</span>    assertTrue(hasNext);<a name="line.5368"></a>
+<span class="sourceLineNo">5369</span>    // 5. scan out "row0" (1 kv)<a name="line.5369"></a>
+<span class="sourceLineNo">5370</span>    currRow.clear();<a name="line.5370"></a>
+<span class="sourceLineNo">5371</span>    hasNext = scanner.next(currRow);<a name="line.5371"></a>
+<span class="sourceLineNo">5372</span>    assertEquals(1, currRow.size());<a name="line.5372"></a>
+<span class="sourceLineNo">5373</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5373"></a>
+<span class="sourceLineNo">5374</span>        .get(0).getRowLength(), row0, 0, row0.length));<a name="line.5374"></a>
+<span class="sourceLineNo">5375</span>    assertFalse(hasNext);<a name="line.5375"></a>
+<span class="sourceLineNo">5376</span><a name="line.5376"></a>
+<span class="sourceLineNo">5377</span>    scanner.close();<a name="line.5377"></a>
+<span class="sourceLineNo">5378</span>  }<a name="line.5378"></a>
+<span class="sourceLineNo">5379</span><a name="line.5379"></a>
+<span class="sourceLineNo">5380</span>  @Test<a name="line.5380"></a>
+<span class="sourceLineNo">5381</span>  public void testReverseScanner_FromMemStoreAndHFiles_MultiCFs2()<a name="line.5381"></a>
+<span class="sourceLineNo">5382</span>      throws IOException {<a name="line.5382"></a>
+<span class="sourceLineNo">5383</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.5383"></a>
+<span class="sourceLineNo">5384</span>    byte[] row2 = Bytes.toBytes("row2");<a name="line.5384"></a>
+<span class="sourceLineNo">5385</span>    byte[] row3 = Bytes.toBytes("row3");<a name="line.5385"></a>
+<span class="sourceLineNo">5386</span>    byte[] row4 = Bytes.toBytes("row4");<a name="line.5386"></a>
+<span class="sourceLineNo">5387</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5387"></a>
+<span class="sourceLineNo">5388</span>    byte[] cf2 = Bytes.toBytes("CF2");<a name="line.5388"></a>
+<span class="sourceLineNo">5389</span>    byte[] cf3 = Bytes.toBytes("CF3");<a name="line.5389"></a>
+<span class="sourceLineNo">5390</span>    byte[] cf4 = Bytes.toBytes("CF4");<a name="line.5390"></a>
+<span class="sourceLineNo">5391</span>    byte[][] families = { cf1, cf2, cf3, cf4 };<a name="line.5391"></a>
+<span class="sourceLineNo">5392</span>    byte[] col = Bytes.toBytes("C");<a name="line.5392"></a>
+<span class="sourceLineNo">5393</span>    long ts = 1;<a name="line.5393"></a>
+<span class="sourceLineNo">5394</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5394"></a>
+<span class="sourceLineNo">5395</span>    // disable compactions in this test.<a name="line.5395"></a>
+<span class="sourceLineNo">5396</span>    conf.setInt("hbase.hstore.compactionThreshold", 10000);<a name="line.5396"></a>
+<span class="sourceLineNo">5397</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5397"></a>
+<span class="sourceLineNo">5398</span>    KeyValue kv1 = new KeyValue(row1, cf1, col, ts, KeyValue.Type.Put, null);<a name="line.5398"></a>
+<span class="sourceLineNo">5399</span>    KeyValue kv2 = new KeyValue(row2, cf2, col, ts, KeyValue.Type.Put, null);<a name="line.5399"></a>
+<span class="sourceLineNo">5400</span>    KeyValue kv3 = new KeyValue(row3, cf3, col, ts, KeyValue.Type.Put, null);<a name="line.5400"></a>
+<span class="sourceLineNo">5401</span>    KeyValue kv4 = new KeyValue(row4, cf4, col, ts, KeyValue.Type.Put, null);<a name="line.5401"></a>
+<span class="sourceLineNo">5402</span>    // storefile1<a name="line.5402"></a>
+<span class="sourceLineNo">5403</span>    Put put = new Put(row1);<a name="line.5403"></a>
+<span class="sourceLineNo">5404</span>    put.add(kv1);<a name="line.5404"></a>
 <span class="sourceLineNo">5405</span>    region.put(put);<a name="line.5405"></a>
 <span class="sourceLineNo">5406</span>    region.flush(true);<a name="line.5406"></a>
-<span class="sourceLineNo">5407</span>    // memstore<a name="line.5407"></a>
-<span class="sourceLineNo">5408</span>    put = new Put(row4);<a name="line.5408"></a>
-<span class="sourceLineNo">5409</span>    put.add(kv4);<a name="line.5409"></a>
+<span class="sourceLineNo">5407</span>    // storefile2<a name="line.5407"></a>
+<span class="sourceLineNo">5408</span>    put = new Put(row2);<a name="line.5408"></a>
+<span class="sourceLineNo">5409</span>    put.add(kv2);<a name="line.5409"></a>
 <span class="sourceLineNo">5410</span>    region.put(put);<a name="line.5410"></a>
-<span class="sourceLineNo">5411</span>    // scan range = ["row4", min)<a name="line.5411"></a>
-<span class="sourceLineNo">5412</span>    Scan scan = new Scan(row4);<a name="line.5412"></a>
-<span class="sourceLineNo">5413</span>    scan.setReversed(true);<a name="line.5413"></a>
-<span class="sourceLineNo">5414</span>    scan.setBatch(10);<a name="line.5414"></a>
-<span class="sourceLineNo">5415</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5415"></a>
-<span class="sourceLineNo">5416</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5416"></a>
-<span class="sourceLineNo">5417</span>    boolean hasNext = scanner.next(currRow);<a name="line.5417"></a>
-<span class="sourceLineNo">5418</span>    assertEquals(1, currRow.size());<a name="line.5418"></a>
-<span class="sourceLineNo">5419</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5419"></a>
-<span class="sourceLineNo">5420</span>        .get(0).getRowLength(), row4, 0, row4.length));<a name="line.5420"></a>
-<span class="sourceLineNo">5421</span>    assertTrue(hasNext);<a name="line.5421"></a>
-<span class="sourceLineNo">5422</span>    currRow.clear();<a name="line.5422"></a>
-<span class="sourceLineNo">5423</span>    hasNext = scanner.next(currRow);<a name="line.5423"></a>
-<span class="sourceLineNo">5424</span>    assertEquals(1, currRow.size());<a name="line.5424"></a>
-<span class="sourceLineNo">5425</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5425"></a>
-<span class="sourceLineNo">5426</span>        .get(0).getRowLength(), row3, 0, row3.length));<a name="line.5426"></a>
-<span class="sourceLineNo">5427</span>    assertTrue(hasNext);<a name="line.5427"></a>
-<span class="sourceLineNo">5428</span>    currRow.clear();<a name="line.5428"></a>
-<span class="sourceLineNo">5429</span>    hasNext = scanner.next(currRow);<a name="line.5429"></a>
-<span class="sourceLineNo">5430</span>    assertEquals(1, currRow.size());<a name="line.5430"></a>
-<span class="sourceLineNo">5431</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5431"></a>
-<span class="sourceLineNo">5432</span>        .get(0).getRowLength(), row2, 0, row2.length));<a name="line.5432"></a>
-<span class="sourceLineNo">5433</span>    assertTrue(hasNext);<a name="line.5433"></a>
-<span class="sourceLineNo">5434</span>    currRow.clear();<a name="line.5434"></a>
-<span class="sourceLineNo">5435</span>    hasNext = scanner.next(currRow);<a name="line.5435"></a>
-<span class="sourceLineNo">5436</span>    assertEquals(1, currRow.size());<a name="line.5436"></a>
-<span class="sourceLineNo">5437</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5437"></a>
-<span class="sourceLineNo">5438</span>        .get(0).getRowLength(), row1, 0, row1.length));<a name="line.5438"></a>
-<span class="sourceLineNo">5439</span>    assertFalse(hasNext);<a name="line.5439"></a>
-<span class="sourceLineNo">5440</span>  }<a name="line.5440"></a>
-<span class="sourceLineNo">5441</span><a name="line.5441"></a>
-<span class="sourceLineNo">5442</span>  /**<a name="line.5442"></a>
-<span class="sourceLineNo">5443</span>   * Test for HBASE-14497: Reverse Scan threw StackOverflow caused by readPt checking<a name="line.5443"></a>
-<span class="sourceLineNo">5444</span>   */<a name="line.5444"></a>
-<span class="sourceLineNo">5445</span>  @Test<a name="line.5445"></a>
-<span class="sourceLineNo">5446</span>  public void testReverseScanner_StackOverflow() throws IOException {<a name="line.5446"></a>
-<span class="sourceLineNo">5447</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5447"></a>
-<span class="sourceLineNo">5448</span>    byte[][] families = {cf1};<a name="line.5448"></a>
-<span class="sourceLineNo">5449</span>    byte[] col = Bytes.toBytes("C");<a name="line.5449"></a>
-<span class="sourceLineNo">5450</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5450"></a>
-<span class="sourceLineNo">5451</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5451"></a>
-<span class="sourceLineNo">5452</span>    // setup with one storefile and one memstore, to create scanner and get an earlier readPt<a name="line.5452"></a>
-<span class="sourceLineNo">5453</span>    Put put = new Put(Bytes.toBytes("19998"));<a name="line.5453"></a>
-<span class="sourceLineNo">5454</span>    put.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5454"></a>
-<span class="sourceLineNo">5455</span>    region.put(put);<a name="line.5455"></a>
-<span class="sourceLineNo">5456</span>    region.flushcache(true, true, FlushLifeCycleTracker.DUMMY);<a name="line.5456"></a>
-<span class="sourceLineNo">5457</span>    Put put2 = new Put(Bytes.toBytes("19997"));<a name="line.5457"></a>
-<span class="sourceLineNo">5458</span>    put2.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5458"></a>
-<span class="sourceLineNo">5459</span>    region.put(put2);<a name="line.5459"></a>
-<span class="sourceLineNo">5460</span><a name="line.5460"></a>
-<span class="sourceLineNo">5461</span>    Scan scan = new Scan(Bytes.toBytes("19998"));<a name="line.5461"></a>
-<span class="sourceLineNo">5462</span>    scan.setReversed(true);<a name="line.5462"></a>
-<span class="sourceLineNo">5463</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5463"></a>
-<span class="sourceLineNo">5464</span><a name="line.5464"></a>
-<span class="sourceLineNo">5465</span>    // create one storefile contains many rows will be skipped<a name="line.5465"></a>
-<span class="sourceLineNo">5466</span>    // to check StoreFileScanner.seekToPreviousRow<a name="line.5466"></a>
-<span class="sourceLineNo">5467</span>    for (int i = 10000; i &lt; 20000; i++) {<a name="line.5467"></a>
-<span class="sourceLineNo">5468</span>      Put p = new Put(Bytes.toBytes(""+i));<a name="line.5468"></a>
-<span class="sourceLineNo">5469</span>      p.addColumn(cf1, col, Bytes.toBytes("" + i));<a name="line.5469"></a>
-<span class="sourceLineNo">5470</span>      region.put(p);<a name="line.5470"></a>
-<span class="sourceLineNo">5471</span>    }<a name="line.5471"></a>
-<span class="sourceLineNo">5472</span>    region.flushcache(true, true, FlushLifeCycleTracker.DUMMY);<a name="line.5472"></a>
-<span class="sourceLineNo">5473</span><a name="line.5473"></a>
-<span class="sourceLineNo">5474</span>    // create one memstore contains many rows will be skipped<a name="line.5474"></a>
-<span class="sourceLineNo">5475</span>    // to check MemStoreScanner.seekToPreviousRow<a name="line.5475"></a>
-<span class="sourceLineNo">5476</span>    for (int i = 10000; i &lt; 20000; i++) {<a name="line.5476"></a>
-<span class="sourceLineNo">5477</span>      Put p = new Put(Bytes.toBytes(""+i));<a name="line.5477"></a>
-<span class="sourceLineNo">5478</span>      p.addColumn(cf1, col, Bytes.toBytes("" + i));<a name="line.5478"></a>
-<span class="sourceLineNo">5479</span>      region.put(p);<a name="line.5479"></a>
-<span class="sourceLineNo">5480</span>    }<a name="line.5480"></a>
-<span class="sourceLineNo">5481</span><a name="line.5481"></a>
-<span class="sourceLineNo">5482</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5482"></a>
-<span class="sourceLineNo">5483</span>    boolean hasNext;<a name="line.5483"></a>
-<span class="sourceLineNo">5484</span>    do {<a name="line.5484"></a>
-<span class="sourceLineNo">5485</span>      hasNext = scanner.next(currRow);<a name="line.5485"></a>
-<span class="sourceLineNo">5486</span>    } while (hasNext);<a name="line.5486"></a>
-<span class="sourceLineNo">5487</span>    assertEquals(2, currRow.size());<a name="line.5487"></a>
-<span class="sourceLineNo">5488</span>    assertEquals("19998", Bytes.toString(currRow.get(0).getRowArray(),<a name="line.5488"></a>
-<span class="sourceLineNo">5489</span>      currRow.get(0).getRowOffset(), currRow.get(0).getRowLength()));<a name="line.5489"></a>
-<span class="sourceLineNo">5490</span>    assertEquals("19997", Bytes.toString(currRow.get(1).getRowArray(),<a name="line.5490"></a>
-<span class="sourceLineNo">5491</span>      currRow.get(1).getRowOffset(), currRow.get(1).getRowLength()));<a name="line.5491"></a>
-<span class="sourceLineNo">5492</span>  }<a name="line.5492"></a>
-<span class="sourceLineNo">5493</span><a name="line.5493"></a>
-<span class="sourceLineNo">5494</span>  @Test<a name="line.5494"></a>
-<span class="sourceLineNo">5495</span>  public void testReverseScanShouldNotScanMemstoreIfReadPtLesser() throws Exception {<a name="line.5495"></a>
-<span class="sourceLineNo">5496</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5496"></a>
-<span class="sourceLineNo">5497</span>    byte[][] families = { cf1 };<a name="line.5497"></a>
-<span class="sourceLineNo">5498</span>    byte[] col = Bytes.toBytes("C");<a name="line.5498"></a>
-<span class="sourceLineNo">5499</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5499"></a>
-<span class="sourceLineNo">5500</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5500"></a>
-<span class="sourceLineNo">5501</span>    // setup with one storefile and one memstore, to create scanner and get an earlier readPt<a name="line.5501"></a>
-<span class="sourceLineNo">5502</span>    Put put = new Put(Bytes.toBytes("19996"));<a name="line.5502"></a>
-<span class="sourceLineNo">5503</span>    put.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5503"></a>
-<span class="sourceLineNo">5504</span>    region.put(put);<a name="line.5504"></a>
-<span class="sourceLineNo">5505</span>    Put put2 = new Put(Bytes.toBytes("19995"));<a name="line.5505"></a>
-<span class="sourceLineNo">5506</span>    put2.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5506"></a>
-<span class="sourceLineNo">5507</span>    region.put(put2);<a name="line.5507"></a>
-<span class="sourceLineNo">5508</span>    // create a reverse scan<a name="line.5508"></a>
-<span class="sourceLineNo">5509</span>    Scan scan = new Scan(Bytes.toBytes("19996"));<a name="line.5509"></a>
-<span class="sourceLineNo">5510</span>    scan.setReversed(true);<a name="line.5510"></a>
-<span class="sourceLineNo">5511</span>    RegionScannerImpl scanner = region.getScanner(scan);<a name="line.5511"></a>
-<span class="sourceLineNo">5512</span><a name="line.5512"></a>
-<span class="sourceLineNo">5513</span>    // flush the cache. This will reset the store scanner<a name="line.5513"></a>
-<span class="sourceLineNo">5514</span>    region.flushcache(true, true, FlushLifeCycleTracker.DUMMY);<a name="line.5514"></a>
-<span class="sourceLineNo">5515</span><a name="line.5515"></a>
-<span class="sourceLineNo">5516</span>    // create one memstore contains many rows will be skipped<a name="line.5516"></a>
-<span class="sourceLineNo">5517</span>    // to check MemStoreScanner.seekToPreviousRow<a name="line.5517"></a>
-<span class="sourceLineNo">5518</span>    for (int i = 10000; i &lt; 20000; i++) {<a name="line.5518"></a>
-<span class="sourceLineNo">5519</span>      Put p = new Put(Bytes.toBytes("" + i));<a name="line.5519"></a>
-<span class="sourceLineNo">5520</span>      p.addColumn(cf1, col, Bytes.toBytes("" + i));<a name="line.5520"></a>
-<span class="sourceLineNo">5521</span>      region.put(p);<a name="line.5521"></a>
-<span class="sourceLineNo">5522</span>    }<a name="line.5522"></a>
-<span class="sourceLineNo">5523</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5523"></a>
-<span class="sourceLineNo">5524</span>    boolean hasNext;<a name="line.5524"></a>
-<span class="sourceLineNo">5525</span>    boolean assertDone = false;<a name="line.5525"></a>
-<span class="sourceLineNo">5526</span>    do {<a name="line.5526"></a>
-<span class="sourceLineNo">5527</span>      hasNext = scanner.next(currRow);<a name="line.5527"></a>
-<span class="sourceLineNo">5528</span>      // With HBASE-15871, after the scanner is reset the memstore scanner should not be<a name="line.5528"></a>
-<span class="sourceLineNo">5529</span>      // added here<a name="line.5529"></a>
-<span class="sourceLineNo">5530</span>      if (!assertDone) {<a name="line.5530"></a>
-<span class="sourceLineNo">5531</span>        StoreScanner current =<a name="line.5531"></a>
-<span class="sourceLineNo">5532</span>            (StoreScanner) (scanner.storeHeap).getCurrentForTesting();<a name="line.5532"></a>
-<span class="sourceLineNo">5533</span>        List&lt;KeyValueScanner&gt; scanners = current.getAllScannersForTesting();<a name="line.5533"></a>
-<span class="sourceLineNo">5534</span>        assertEquals("There should be only one scanner the store file scanner", 1,<a name="line.5534"></a>
-<span class="sourceLineNo">5535</span>          scanners.size());<a name="line.5535"></a>
-<span class="sourceLineNo">5536</span>        assertDone = true;<a name="line.5536"></a>
-<span class="sourceLineNo">5537</span>      }<a name="line.5537"></a>
-<span class="sourceLineNo">5538</span>    } while (hasNext);<a name="line.5538"></a>
-<span class="sourceLineNo">5539</span>    assertEquals(2, currRow.size());<a name="line.5539"></a>
-<span class="sourceLineNo">5540</span>    assertEquals("19996", Bytes.toString(currRow.get(0).getRowArray(),<a name="line.5540"></a>
-<span class="sourceLineNo">5541</span>      currRow.get(0).getRowOffset(), currRow.get(0).getRowLength()));<a name="line.5541"></a>
-<span class="sourceLineNo">5542</span>    assertEquals("19995", Bytes.toString(currRow.get(1).getRowArray(),<a name="line.5542"></a>
-<span class="sourceLineNo">5543</span>      currRow.get(1).getRowOffset(), currRow.get(1).getRowLength()));<a name="line.5543"></a>
-<span class="sourceLineNo">5544</span>  }<a name="line.5544"></a>
-<span class="sourceLineNo">5545</span><a name="line.5545"></a>
-<span class="sourceLineNo">5546</span>  @Test<a name="line.5546"></a>
-<span class="sourceLineNo">5547</span>  public void testReverseScanWhenPutCellsAfterOpenReverseScan() throws Exception {<a name="line.5547"></a>
-<span class="sourceLineNo">5548</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5548"></a>
-<span class="sourceLineNo">5549</span>    byte[][] families = { cf1 };<a name="line.5549"></a>
-<span class="sourceLineNo">5550</span>    byte[] col = Bytes.toBytes("C");<a name="line.5550"></a>
-<span class="sourceLineNo">5551</span><a name="line.5551"></a>
-<span class="sourceLineNo">5552</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5552"></a>
-<span class="sourceLineNo">5553</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5553"></a>
-<span class="sourceLineNo">5554</span><a name="line.5554"></a>
-<span class="sourceLineNo">5555</span>    Put put = new Put(Bytes.toBytes("199996"));<a name="line.5555"></a>
-<span class="sourceLineNo">5556</span>    put.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5556"></a>
-<span class="sourceLineNo">5557</span>    region.put(put);<a name="line.5557"></a>
-<span class="sourceLineNo">5558</span>    Put put2 = new Put(Bytes.toBytes("199995"));<a name="line.5558"></a>
-<span class="sourceLineNo">5559</span>    put2.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5559"></a>
-<span class="sourceLineNo">5560</span>    region.put(put2);<a name="line.5560"></a>
+<span class="sourceLineNo">5411</span>    region.flush(true);<a name="line.5411"></a>
+<span class="sourceLineNo">5412</span>    // storefile3<a name="line.5412"></a>
+<span class="sourceLineNo">5413</span>    put = new Put(row3);<a name="line.5413"></a>
+<span class="sourceLineNo">5414</span>    put.add(kv3);<a name="line.5414"></a>
+<span class="sourceLineNo">5415</span>    region.put(put);<a name="line.5415"></a>
+<span class="sourceLineNo">5416</span>    region.flush(true);<a name="line.5416"></a>
+<span class="sourceLineNo">5417</span>    // memstore<a name="line.5417"></a>
+<span class="sourceLineNo">5418</span>    put = new Put(row4);<a name="line.5418"></a>
+<span class="sourceLineNo">5419</span>    put.add(kv4);<a name="line.5419"></a>
+<span class="sourceLineNo">5420</span>    region.put(put);<a name="line.5420"></a>
+<span class="sourceLineNo">5421</span>    // scan range = ["row4", min)<a name="line.5421"></a>
+<span class="sourceLineNo">5422</span>    Scan scan = new Scan(row4);<a name="line.5422"></a>
+<span class="sourceLineNo">5423</span>    scan.setReversed(true);<a name="line.5423"></a>
+<span class="sourceLineNo">5424</span>    scan.setBatch(10);<a name="line.5424"></a>
+<span class="sourceLineNo">5425</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5425"></a>
+<span class="sourceLineNo">5426</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5426"></a>
+<span class="sourceLineNo">5427</span>    boolean hasNext = scanner.next(currRow);<a name="line.5427"></a>
+<span class="sourceLineNo">5428</span>    assertEquals(1, currRow.size());<a name="line.5428"></a>
+<span class="sourceLineNo">5429</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5429"></a>
+<span class="sourceLineNo">5430</span>        .get(0).getRowLength(), row4, 0, row4.length));<a name="line.5430"></a>
+<span class="sourceLineNo">5431</span>    assertTrue(hasNext);<a name="line.5431"></a>
+<span class="sourceLineNo">5432</span>    currRow.clear();<a name="line.5432"></a>
+<span class="sourceLineNo">5433</span>    hasNext = scanner.next(currRow);<a name="line.5433"></a>
+<span class="sourceLineNo">5434</span>    assertEquals(1, currRow.size());<a name="line.5434"></a>
+<span class="sourceLineNo">5435</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5435"></a>
+<span class="sourceLineNo">5436</span>        .get(0).getRowLength(), row3, 0, row3.length));<a name="line.5436"></a>
+<span class="sourceLineNo">5437</span>    assertTrue(hasNext);<a name="line.5437"></a>
+<span class="sourceLineNo">5438</span>    currRow.clear();<a name="line.5438"></a>
+<span class="sourceLineNo">5439</span>    hasNext = scanner.next(currRow);<a name="line.5439"></a>
+<span class="sourceLineNo">5440</span>    assertEquals(1, currRow.size());<a name="line.5440"></a>
+<span class="sourceLineNo">5441</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5441"></a>
+<span class="sourceLineNo">5442</span>        .get(0).getRowLength(), row2, 0, row2.length));<a name="line.5442"></a>
+<span class="sourceLineNo">5443</span>    assertTrue(hasNext);<a name="line.5443"></a>
+<span class="sourceLineNo">5444</span>    currRow.clear();<a name="line.5444"></a>
+<span class="sourceLineNo">5445</span>    hasNext = scanner.next(currRow);<a name="line.5445"></a>
+<span class="sourceLineNo">5446</span>    assertEquals(1, currRow.size());<a name="line.5446"></a>
+<span class="sourceLineNo">5447</span>    assertTrue(Bytes.equals(currRow.get(0).getRowArray(), currRow.get(0).getRowOffset(), currRow<a name="line.5447"></a>
+<span class="sourceLineNo">5448</span>        .get(0).getRowLength(), row1, 0, row1.length));<a name="line.5448"></a>
+<span class="sourceLineNo">5449</span>    assertFalse(hasNext);<a name="line.5449"></a>
+<span class="sourceLineNo">5450</span>  }<a name="line.5450"></a>
+<span class="sourceLineNo">5451</span><a name="line.5451"></a>
+<span class="sourceLineNo">5452</span>  /**<a name="line.5452"></a>
+<span class="sourceLineNo">5453</span>   * Test for HBASE-14497: Reverse Scan threw StackOverflow caused by readPt checking<a name="line.5453"></a>
+<span class="sourceLineNo">5454</span>   */<a name="line.5454"></a>
+<span class="sourceLineNo">5455</span>  @Test<a name="line.5455"></a>
+<span class="sourceLineNo">5456</span>  public void testReverseScanner_StackOverflow() throws IOException {<a name="line.5456"></a>
+<span class="sourceLineNo">5457</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5457"></a>
+<span class="sourceLineNo">5458</span>    byte[][] families = {cf1};<a name="line.5458"></a>
+<span class="sourceLineNo">5459</span>    byte[] col = Bytes.toBytes("C");<a name="line.5459"></a>
+<span class="sourceLineNo">5460</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5460"></a>
+<span class="sourceLineNo">5461</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5461"></a>
+<span class="sourceLineNo">5462</span>    // setup with one storefile and one memstore, to create scanner and get an earlier readPt<a name="line.5462"></a>
+<span class="sourceLineNo">5463</span>    Put put = new Put(Bytes.toBytes("19998"));<a name="line.5463"></a>
+<span class="sourceLineNo">5464</span>    put.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5464"></a>
+<span class="sourceLineNo">5465</span>    region.put(put);<a name="line.5465"></a>
+<span class="sourceLineNo">5466</span>    region.flushcache(true, true, FlushLifeCycleTracker.DUMMY);<a name="line.5466"></a>
+<span class="sourceLineNo">5467</span>    Put put2 = new Put(Bytes.toBytes("19997"));<a name="line.5467"></a>
+<span class="sourceLineNo">5468</span>    put2.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5468"></a>
+<span class="sourceLineNo">5469</span>    region.put(put2);<a name="line.5469"></a>
+<span class="sourceLineNo">5470</span><a name="line.5470"></a>
+<span class="sourceLineNo">5471</span>    Scan scan = new Scan(Bytes.toBytes("19998"));<a name="line.5471"></a>
+<span class="sourceLineNo">5472</span>    scan.setReversed(true);<a name="line.5472"></a>
+<span class="sourceLineNo">5473</span>    InternalScanner scanner = region.getScanner(scan);<a name="line.5473"></a>
+<span class="sourceLineNo">5474</span><a name="line.5474"></a>
+<span class="sourceLineNo">5475</span>    // create one storefile contains many rows will be skipped<a name="line.5475"></a>
+<span class="sourceLineNo">5476</span>    // to check StoreFileScanner.seekToPreviousRow<a name="line.5476"></a>
+<span class="sourceLineNo">5477</span>    for (int i = 10000; i &lt; 20000; i++) {<a name="line.5477"></a>
+<span class="sourceLineNo">5478</span>      Put p = new Put(Bytes.toBytes(""+i));<a name="line.5478"></a>
+<span class="sourceLineNo">5479</span>      p.addColumn(cf1, col, Bytes.toBytes("" + i));<a name="line.5479"></a>
+<span class="sourceLineNo">5480</span>      region.put(p);<a name="line.5480"></a>
+<span class="sourceLineNo">5481</span>    }<a name="line.5481"></a>
+<span class="sourceLineNo">5482</span>    region.flushcache(true, true, FlushLifeCycleTracker.DUMMY);<a name="line.5482"></a>
+<span class="sourceLineNo">5483</span><a name="line.5483"></a>
+<span class="sourceLineNo">5484</span>    // create one memstore contains many rows will be skipped<a name="line.5484"></a>
+<span class="sourceLineNo">5485</span>    // to check MemStoreScanner.seekToPreviousRow<a name="line.5485"></a>
+<span class="sourceLineNo">5486</span>    for (int i = 10000; i &lt; 20000; i++) {<a name="line.5486"></a>
+<span class="sourceLineNo">5487</span>      Put p = new Put(Bytes.toBytes(""+i));<a name="line.5487"></a>
+<span class="sourceLineNo">5488</span>      p.addColumn(cf1, col, Bytes.toBytes("" + i));<a name="line.5488"></a>
+<span class="sourceLineNo">5489</span>      region.put(p);<a name="line.5489"></a>
+<span class="sourceLineNo">5490</span>    }<a name="line.5490"></a>
+<span class="sourceLineNo">5491</span><a name="line.5491"></a>
+<span class="sourceLineNo">5492</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5492"></a>
+<span class="sourceLineNo">5493</span>    boolean hasNext;<a name="line.5493"></a>
+<span class="sourceLineNo">5494</span>    do {<a name="line.5494"></a>
+<span class="sourceLineNo">5495</span>      hasNext = scanner.next(currRow);<a name="line.5495"></a>
+<span class="sourceLineNo">5496</span>    } while (hasNext);<a name="line.5496"></a>
+<span class="sourceLineNo">5497</span>    assertEquals(2, currRow.size());<a name="line.5497"></a>
+<span class="sourceLineNo">5498</span>    assertEquals("19998", Bytes.toString(currRow.get(0).getRowArray(),<a name="line.5498"></a>
+<span class="sourceLineNo">5499</span>      currRow.get(0).getRowOffset(), currRow.get(0).getRowLength()));<a name="line.5499"></a>
+<span class="sourceLineNo">5500</span>    assertEquals("19997", Bytes.toString(currRow.get(1).getRowArray(),<a name="line.5500"></a>
+<span class="sourceLineNo">5501</span>      currRow.get(1).getRowOffset(), currRow.get(1).getRowLength()));<a name="line.5501"></a>
+<span class="sourceLineNo">5502</span>  }<a name="line.5502"></a>
+<span class="sourceLineNo">5503</span><a name="line.5503"></a>
+<span class="sourceLineNo">5504</span>  @Test<a name="line.5504"></a>
+<span class="sourceLineNo">5505</span>  public void testReverseScanShouldNotScanMemstoreIfReadPtLesser() throws Exception {<a name="line.5505"></a>
+<span class="sourceLineNo">5506</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5506"></a>
+<span class="sourceLineNo">5507</span>    byte[][] families = { cf1 };<a name="line.5507"></a>
+<span class="sourceLineNo">5508</span>    byte[] col = Bytes.toBytes("C");<a name="line.5508"></a>
+<span class="sourceLineNo">5509</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5509"></a>
+<span class="sourceLineNo">5510</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5510"></a>
+<span class="sourceLineNo">5511</span>    // setup with one storefile and one memstore, to create scanner and get an earlier readPt<a name="line.5511"></a>
+<span class="sourceLineNo">5512</span>    Put put = new Put(Bytes.toBytes("19996"));<a name="line.5512"></a>
+<span class="sourceLineNo">5513</span>    put.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5513"></a>
+<span class="sourceLineNo">5514</span>    region.put(put);<a name="line.5514"></a>
+<span class="sourceLineNo">5515</span>    Put put2 = new Put(Bytes.toBytes("19995"));<a name="line.5515"></a>
+<span class="sourceLineNo">5516</span>    put2.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5516"></a>
+<span class="sourceLineNo">5517</span>    region.put(put2);<a name="line.5517"></a>
+<span class="sourceLineNo">5518</span>    // create a reverse scan<a name="line.5518"></a>
+<span class="sourceLineNo">5519</span>    Scan scan = new Scan(Bytes.toBytes("19996"));<a name="line.5519"></a>
+<span class="sourceLineNo">5520</span>    scan.setReversed(true);<a name="line.5520"></a>
+<span class="sourceLineNo">5521</span>    RegionScannerImpl scanner = region.getScanner(scan);<a name="line.5521"></a>
+<span class="sourceLineNo">5522</span><a name="line.5522"></a>
+<span class="sourceLineNo">5523</span>    // flush the cache. This will reset the store scanner<a name="line.5523"></a>
+<span class="sourceLineNo">5524</span>    region.flushcache(true, true, FlushLifeCycleTracker.DUMMY);<a name="line.5524"></a>
+<span class="sourceLineNo">5525</span><a name="line.5525"></a>
+<span class="sourceLineNo">5526</span>    // create one memstore contains many rows will be skipped<a name="line.5526"></a>
+<span class="sourceLineNo">5527</span>    // to check MemStoreScanner.seekToPreviousRow<a name="line.5527"></a>
+<span class="sourceLineNo">5528</span>    for (int i = 10000; i &lt; 20000; i++) {<a name="line.5528"></a>
+<span class="sourceLineNo">5529</span>      Put p = new Put(Bytes.toBytes("" + i));<a name="line.5529"></a>
+<span class="sourceLineNo">5530</span>      p.addColumn(cf1, col, Bytes.toBytes("" + i));<a name="line.5530"></a>
+<span class="sourceLineNo">5531</span>      region.put(p);<a name="line.5531"></a>
+<span class="sourceLineNo">5532</span>    }<a name="line.5532"></a>
+<span class="sourceLineNo">5533</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5533"></a>
+<span class="sourceLineNo">5534</span>    boolean hasNext;<a name="line.5534"></a>
+<span class="sourceLineNo">5535</span>    boolean assertDone = false;<a name="line.5535"></a>
+<span class="sourceLineNo">5536</span>    do {<a name="line.5536"></a>
+<span class="sourceLineNo">5537</span>      hasNext = scanner.next(currRow);<a name="line.5537"></a>
+<span class="sourceLineNo">5538</span>      // With HBASE-15871, after the scanner is reset the memstore scanner should not be<a name="line.5538"></a>
+<span class="sourceLineNo">5539</span>      // added here<a name="line.5539"></a>
+<span class="sourceLineNo">5540</span>      if (!assertDone) {<a name="line.5540"></a>
+<span class="sourceLineNo">5541</span>        StoreScanner current =<a name="line.5541"></a>
+<span class="sourceLineNo">5542</span>            (StoreScanner) (scanner.storeHeap).getCurrentForTesting();<a name="line.5542"></a>
+<span class="sourceLineNo">5543</span>        List&lt;KeyValueScanner&gt; scanners = current.getAllScannersForTesting();<a name="line.5543"></a>
+<span class="sourceLineNo">5544</span>        assertEquals("There should be only one scanner the store file scanner", 1,<a name="line.5544"></a>
+<span class="sourceLineNo">5545</span>          scanners.size());<a name="line.5545"></a>
+<span class="sourceLineNo">5546</span>        assertDone = true;<a name="line.5546"></a>
+<span class="sourceLineNo">5547</span>      }<a name="line.5547"></a>
+<span class="sourceLineNo">5548</span>    } while (hasNext);<a name="line.5548"></a>
+<span class="sourceLineNo">5549</span>    assertEquals(2, currRow.size());<a name="line.5549"></a>
+<span class="sourceLineNo">5550</span>    assertEquals("19996", Bytes.toString(currRow.get(0).getRowArray(),<a name="line.5550"></a>
+<span class="sourceLineNo">5551</span>      currRow.get(0).getRowOffset(), currRow.get(0).getRowLength()));<a name="line.5551"></a>
+<span class="sourceLineNo">5552</span>    assertEquals("19995", Bytes.toString(currRow.get(1).getRowArray(),<a name="line.5552"></a>
+<span class="sourceLineNo">5553</span>      currRow.get(1).getRowOffset(), currRow.get(1).getRowLength()));<a name="line.5553"></a>
+<span class="sourceLineNo">5554</span>  }<a name="line.5554"></a>
+<span class="sourceLineNo">5555</span><a name="line.5555"></a>
+<span class="sourceLineNo">5556</span>  @Test<a name="line.5556"></a>
+<span class="sourceLineNo">5557</span>  public void testReverseScanWhenPutCellsAfterOpenReverseScan() throws Exception {<a name="line.5557"></a>
+<span class="sourceLineNo">5558</span>    byte[] cf1 = Bytes.toBytes("CF1");<a name="line.5558"></a>
+<span class="sourceLineNo">5559</span>    byte[][] families = { cf1 };<a name="line.5559"></a>
+<span class="sourceLineNo">5560</span>    byte[] col = Bytes.toBytes("C");<a name="line.5560"></a>
 <span class="sourceLineNo">5561</span><a name="line.5561"></a>
-<span class="sourceLineNo">5562</span>    // Create a reverse scan<a name="line.5562"></a>
-<span class="sourceLineNo">5563</span>    Scan scan = new Scan(Bytes.toBytes("199996"));<a name="line.5563"></a>
-<span class="sourceLineNo">5564</span>    scan.setReversed(true);<a name="line.5564"></a>
-<span class="sourceLineNo">5565</span>    RegionScannerImpl scanner = region.getScanner(scan);<a name="line.5565"></a>
-<span class="sourceLineNo">5566</span><a name="line.5566"></a>
-<span class="sourceLineNo">5567</span>    // Put a lot of cells that have sequenceIDs grater than the readPt of the reverse scan<a name="line.5567"></a>
-<span class="sourceLineNo">5568</span>    for (int i = 100000; i &lt; 200000; i++) {<a name="line.5568"></a>
-<span class="sourceLineNo">5569</span>      Put p = new Put(Bytes.toBytes("" + i));<a name="line.5569"></a>
-<span class="sourceLineNo">5570</span>      p.addColumn(cf1, col, Bytes.toBytes("" + i));<a name="line.5570"></a>
-<span class="sourceLineNo">5571</span>      region.put(p);<a name="line.5571"></a>
-<span class="sourceLineNo">5572</span>    }<a name="line.5572"></a>
-<span class="sourceLineNo">5573</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5573"></a>
-<span class="sourceLineNo">5574</span>    boolean hasNext;<a name="line.5574"></a>
-<span class="sourceLineNo">5575</span>    do {<a name="line.5575"></a>
-<span class="sourceLineNo">5576</span>      hasNext = scanner.next(currRow);<a name="line.5576"></a>
-<span class="sourceLineNo">5577</span>    } while (hasNext);<a name="line.5577"></a>
-<span class="sourceLineNo">5578</span><a name="line.5578"></a>
-<span class="sourceLineNo">5579</span>    assertEquals(2, currRow.size());<a name="line.5579"></a>
-<span class="sourceLineNo">5580</span>    assertEquals("199996", Bytes.toString(currRow.get(0).getRowArray(),<a name="line.5580"></a>
-<span class="sourceLineNo">5581</span>      currRow.get(0).getRowOffset(), currRow.get(0).getRowLength()));<a name="line.5581"></a>
-<span class="sourceLineNo">5582</span>    assertEquals("199995", Bytes.toString(currRow.get(1).getRowArray(),<a name="line.5582"></a>
-<span class="sourceLineNo">5583</span>      currRow.get(1).getRowOffset(), currRow.get(1).getRowLength()));<a name="line.5583"></a>
-<span class="sourceLineNo">5584</span>  }<a name="line.5584"></a>
-<span class="sourceLineNo">5585</span><a name="line.5585"></a>
-<span class="sourceLineNo">5586</span>  @Test<a name="line.5586"></a>
-<span class="sourceLineNo">5587</span>  public void testWriteRequestsCounter() throws IOException {<a name="line.5587"></a>
-<span class="sourceLineNo">5588</span>    byte[] fam = Bytes.toBytes("info");<a name="line.5588"></a>
-<span class="sourceLineNo">5589</span>    byte[][] families = { fam };<a name="line.5589"></a>
-<span class="sourceLineNo">5590</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.5590"></a>
-<span class="sourceLineNo">5591</span><a name="line.5591"></a>
-<span class="sourceLineNo">5592</span>    Assert.assertEquals(0L, region.getWriteRequestsCount());<a name="line.5592"></a>
-<span class="sourceLineNo">5593</span><a name="line.5593"></a>
-<span class="sourceLineNo">5594</span>    Put put = new Put(row);<a name="line.5594"></a>
-<span class="sourceLineNo">5595</span>    put.addColumn(fam, fam, fam);<a name="line.5595"></a>
-<span class="sourceLineNo">5596</span><a name="line.5596"></a>
-<span class="sourceLineNo">5597</span>    Assert.assertEquals(0L, region.getWriteRequestsCount());<a name="line.5597"></a>
-<span class="sourceLineNo">5598</span>    region.put(put);<a name="line.5598"></a>
-<span class="sourceLineNo">5599</span>    Assert.assertEquals(1L, region.getWriteRequestsCount());<a name="line.5599"></a>
-<span class="sourceLineNo">5600</span>    region.put(put);<a name="line.5600"></a>
-<span class="sourceLineNo">5601</span>    Assert.assertEquals(2L, region.getWriteRequestsCount());<a name="line.5601"></a>
-<span class="sourceLineNo">5602</span>    region.put(put);<a name="line.5602"></a>
-<span class="sourceLineNo">5603</span>    Assert.assertEquals(3L, region.getWriteRequestsCount());<a name="line.5603"></a>
-<span class="sourceLineNo">5604</span><a name="line.5604"></a>
-<span class="sourceLineNo">5605</span>    region.delete(new Delete(row));<a name="line.5605"></a>
-<span class="sourceLineNo">5606</span>    Assert.assertEquals(4L, region.getWriteRequestsCount());<a name="line.5606"></a>
-<span class="sourceLineNo">5607</span>  }<a name="line.5607"></a>
-<span class="sourceLineNo">5608</span><a name="line.5608"></a>
-<span class="sourceLineNo">5609</span>  @Test<a name="line.5609"></a>
-<span class="sourceLineNo">5610</span>  public void testOpenRegionWrittenToWAL() throws Exception {<a name="line.5610"></a>
-<span class="sourceLineNo">5611</span>    final ServerName serverName = ServerName.valueOf(name.getMethodName(), 100, 42);<a name="line.5611"></a>
-<span class="sourceLineNo">5612</span>    final RegionServerServices rss = spy(TEST_UTIL.createMockRegionServerService(serverName));<a name="line.5612"></a>
-<span class="sourceLineNo">5613</span><a name="line.5613"></a>
-<span class="sourceLineNo">5614</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.5614"></a>
-<span class="sourceLineNo">5615</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.5615"></a>
-<span class="sourceLineNo">5616</span>    htd.addFamily(new HColumnDescriptor(fam2));<a name="line.5616"></a>
-<span class="sourceLineNo">5617</span><a name="line.5617"></a>
-<span class="sourceLineNo">5618</span>    HRegionInfo hri = new HRegionInfo(htd.getTableName(),<a name="line.5618"></a>
-<span class="sourceLineNo">5619</span>      HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY);<a name="line.5619"></a>
-<span class="sourceLineNo">5620</span><a name="line.5620"></a>
-<span class="sourceLineNo">5621</span>    // open the region w/o rss and wal and flush some files<a name="line.5621"></a>
-<span class="sourceLineNo">5622</span>    region =<a name="line.5622"></a>
-<span class="sourceLineNo">5623</span>         HBaseTestingUtility.createRegionAndWAL(hri, TEST_UTIL.getDataTestDir(), TEST_UTIL<a name="line.5623"></a>
-<span class="sourceLineNo">5624</span>             .getConfiguration(), htd);<a name="line.5624"></a>
-<span class="sourceLineNo">5625</span>    assertNotNull(region);<a name="line.5625"></a>
-<span class="sourceLineNo">5626</span><a name="line.5626"></a>
-<span class="sourceLineNo">5627</span>    // create a file in fam1 for the region before opening in OpenRegionHandler<a name="line.5627"></a>
-<span class="sourceLineNo">5628</span>    region.put(new Put(Bytes.toBytes("a")).addColumn(fam1, fam1, fam1));<a name="line.5628"></a>
-<span class="sourceLineNo">5629</span>    region.flush(true);<a name="line.5629"></a>
-<span class="sourceLineNo">5630</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.5630"></a>
-<span class="sourceLineNo">5631</span><a name="line.5631"></a>
-<span class="sourceLineNo">5632</span>    ArgumentCaptor&lt;WALEdit&gt; editCaptor = ArgumentCaptor.forClass(WALEdit.class);<a name="line.5632"></a>
-<span class="sourceLineNo">5633</span><a name="line.5633"></a>
-<span class="sourceLineNo">5634</span>    // capture append() calls<a name="line.5634"></a>
-<span class="sourceLineNo">5635</span>    WAL wal = mockWAL();<a name="line.5635"></a>
-<span class="sourceLineNo">5636</span>    when(rss.getWAL((HRegionInfo) any())).thenReturn(wal);<a name="line.5636"></a>
-<span class="sourceLineNo">5637</span><a name="line.5637"></a>
-<span class="sourceLineNo">5638</span>    region = HRegion.openHRegion(hri, htd, rss.getWAL(hri),<a name="line.5638"></a>
-<span class="sourceLineNo">5639</span>      TEST_UTIL.getConfiguration(), rss, null);<a name="line.5639"></a>
-<span class="sourceLineNo">5640</span><a name="line.5640"></a>
-<span class="sourceLineNo">5641</span>    verify(wal, times(1)).append((HRegionInfo)any(), (WALKeyImpl)any()<a name="line.5641"></a>
-<span class="sourceLineNo">5642</span>      , editCaptor.capture(), anyBoolean());<a name="line.5642"></a>
+<span class="sourceLineNo">5562</span>    HBaseConfiguration conf = new HBaseConfiguration();<a name="line.5562"></a>
+<span class="sourceLineNo">5563</span>    this.region = initHRegion(tableName, method, conf, families);<a name="line.5563"></a>
+<span class="sourceLineNo">5564</span><a name="line.5564"></a>
+<span class="sourceLineNo">5565</span>    Put put = new Put(Bytes.toBytes("199996"));<a name="line.5565"></a>
+<span class="sourceLineNo">5566</span>    put.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5566"></a>
+<span class="sourceLineNo">5567</span>    region.put(put);<a name="line.5567"></a>
+<span class="sourceLineNo">5568</span>    Put put2 = new Put(Bytes.toBytes("199995"));<a name="line.5568"></a>
+<span class="sourceLineNo">5569</span>    put2.addColumn(cf1, col, Bytes.toBytes("val"));<a name="line.5569"></a>
+<span class="sourceLineNo">5570</span>    region.put(put2);<a name="line.5570"></a>
+<span class="sourceLineNo">5571</span><a name="line.5571"></a>
+<span class="sourceLineNo">5572</span>    // Create a reverse scan<a name="line.5572"></a>
+<span class="sourceLineNo">5573</span>    Scan scan = new Scan(Bytes.toBytes("199996"));<a name="line.5573"></a>
+<span class="sourceLineNo">5574</span>    scan.setReversed(true);<a name="line.5574"></a>
+<span class="sourceLineNo">5575</span>    RegionScannerImpl scanner = region.getScanner(scan);<a name="line.5575"></a>
+<span class="sourceLineNo">5576</span><a name="line.5576"></a>
+<span class="sourceLineNo">5577</span>    // Put a lot of cells that have sequenceIDs grater than the readPt of the reverse scan<a name="line.5577"></a>
+<span class="sourceLineNo">5578</span>    for (int i = 100000; i &lt; 200000; i++) {<a name="line.5578"></a>
+<span class="sourceLineNo">5579</span>      Put p = new Put(Bytes.toBytes("" + i));<a name="line.5579"></a>
+<span class="sourceLineNo">5580</span>      p.addColumn(cf1, col, Bytes.toBytes("" + i));<a name="line.5580"></a>
+<span class="sourceLineNo">5581</span>      region.put(p);<a name="line.5581"></a>
+<span class="sourceLineNo">5582</span>    }<a name="line.5582"></a>
+<span class="sourceLineNo">5583</span>    List&lt;Cell&gt; currRow = new ArrayList&lt;&gt;();<a name="line.5583"></a>
+<span class="sourceLineNo">5584</span>    boolean hasNext;<a name="line.5584"></a>
+<span class="sourceLineNo">5585</span>    do {<a name="line.5585"></a>
+<span class="sourceLineNo">5586</span>      hasNext = scanner.next(currRow);<a name="line.5586"></a>
+<span class="sourceLineNo">5587</span>    } while (hasNext);<a name="line.5587"></a>
+<span class="sourceLineNo">5588</span><a name="line.5588"></a>
+<span class="sourceLineNo">5589</span>    assertEquals(2, currRow.size());<a name="line.5589"></a>
+<span class="sourceLineNo">5590</span>    assertEquals("199996", Bytes.toString(currRow.get(0).getRowArray(),<a name="line.5590"></a>
+<span class="sourceLineNo">5591</span>      currRow.get(0).getRowOffset(), currRow.get(0).getRowLength()));<a name="line.5591"></a>
+<span class="sourceLineNo">5592</span>    assertEquals("199995", Bytes.toString(currRow.get(1).getRowArray(),<a name="line.5592"></a>
+<span class="sourceLineNo">5593</span>      currRow.get(1).getRowOffset(), currRow.get(1).getRowLength()));<a name="line.5593"></a>
+<span class="sourceLineNo">5594</span>  }<a name="line.5594"></a>
+<span class="sourceLineNo">5595</span><a name="line.5595"></a>
+<span class="sourceLineNo">5596</span>  @Test<a name="line.5596"></a>
+<span class="sourceLineNo">5597</span>  public void testWriteRequestsCounter() throws IOException {<a name="line.5597"></a>
+<span class="sourceLineNo">5598</span>    byte[] fam = Bytes.toBytes("info");<a name="line.5598"></a>
+<span class="sourceLineNo">5599</span>    byte[][] families = { fam };<a name="line.5599"></a>
+<span class="sourceLineNo">5600</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.5600"></a>
+<span class="sourceLineNo">5601</span><a name="line.5601"></a>
+<span class="sourceLineNo">5602</span>    Assert.assertEquals(0L, region.getWriteRequestsCount());<a name="line.5602"></a>
+<span class="sourceLineNo">5603</span><a name="line.5603"></a>
+<span class="sourceLineNo">5604</span>    Put put = new Put(row);<a name="line.5604"></a>
+<span class="sourceLineNo">5605</span>    put.addColumn(fam, fam, fam);<a name="line.5605"></a>
+<span class="sourceLineNo">5606</span><a name="line.5606"></a>
+<span class="sourceLineNo">5607</span>    Assert.assertEquals(0L, region.getWriteRequestsCount());<a name="line.5607"></a>
+<span class="sourceLineNo">5608</span>    region.put(put);<a name="line.5608"></a>
+<span class="sourceLineNo">5609</span>    Assert.assertEquals(1L, region.getWriteRequestsCount());<a name="line.5609"></a>
+<span class="sourceLineNo">5610</span>    region.put(put);<a name="line.5610"></a>
+<span class="sourceLineNo">5611</span>    Assert.assertEquals(2L, region.getWriteRequestsCount());<a name="line.5611"></a>
+<span class="sourceLineNo">5612</span>    region.put(put);<a name="line.5612"></a>
+<span class="sourceLineNo">5613</span>    Assert.assertEquals(3L, region.getWriteRequestsCount());<a name="line.5613"></a>
+<span class="sourceLineNo">5614</span><a name="line.5614"></a>
+<span class="sourceLineNo">5615</span>    region.delete(new Delete(row));<a name="line.5615"></a>
+<span class="sourceLineNo">5616</span>    Assert.assertEquals(4L, region.getWriteRequestsCount());<a name="line.5616"></a>
+<span class="sourceLineNo">5617</span>  }<a name="line.5617"></a>
+<span class="sourceLineNo">5618</span><a name="line.5618"></a>
+<span class="sourceLineNo">5619</span>  @Test<a name="line.5619"></a>
+<span class="sourceLineNo">5620</span>  public void testOpenRegionWrittenToWAL() throws Exception {<a name="line.5620"></a>
+<span class="sourceLineNo">5621</span>    final ServerName serverName = ServerName.valueOf(name.getMethodName(), 100, 42);<a name="line.5621"></a>
+<span class="sourceLineNo">5622</span>    final RegionServerServices rss = spy(TEST_UTIL.createMockRegionServerService(serverName));<a name="line.5622"></a>
+<span class="sourceLineNo">5623</span><a name="line.5623"></a>
+<span class="sourceLineNo">5624</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.5624"></a>
+<span class="sourceLineNo">5625</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.5625"></a>
+<span class="sourceLineNo">5626</span>    htd.addFamily(new HColumnDescriptor(fam2));<a name="line.5626"></a>
+<span class="sourceLineNo">5627</span><a name="line.5627"></a>
+<span class="sourceLineNo">5628</span>    HRegionInfo hri = new HRegionInfo(htd.getTableName(),<a name="line.5628"></a>
+<span class="sourceLineNo">5629</span>      HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY);<a name="line.5629"></a>
+<span class="sourceLineNo">5630</span><a name="line.5630"></a>
+<span class="sourceLineNo">5631</span>    // open the region w/o rss and wal and flush some files<a name="line.5631"></a>
+<span class="sourceLineNo">5632</span>    region =<a name="line.5632"></a>
+<span class="sourceLineNo">5633</span>         HBaseTestingUtility.createRegionAndWAL(hri, TEST_UTIL.getDataTestDir(), TEST_UTIL<a name="line.5633"></a>
+<span class="sourceLineNo">5634</span>             .getConfiguration(), htd);<a name="line.5634"></a>
+<span class="sourceLineNo">5635</span>    assertNotNull(region);<a name="line.5635"></a>
+<span class="sourceLineNo">5636</span><a name="line.5636"></a>
+<span class="sourceLineNo">5637</span>    // create a file in fam1 for the region before opening in OpenRegionHandler<a name="line.5637"></a>
+<span class="sourceLineNo">5638</span>    region.put(new Put(Bytes.toBytes("a")).addColumn(fam1, fam1, fam1));<a name="line.5638"></a>
+<span class="sourceLineNo">5639</span>    region.flush(true);<a name="line.5639"></a>
+<span class="sourceLineNo">5640</span>    HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.5640"></a>
+<span class="sourceLineNo">5641</span><a name="line.5641"></a>
+<span class="sourceLineNo">5642</span>    ArgumentCaptor&lt;WALEdit&gt; editCaptor = ArgumentCaptor.forClass(WALEdit.class);<a name="line.5642"></a>
 <span class="sourceLineNo">5643</span><a name="line.5643"></a>
-<span class="sourceLineNo">5644</span>    WALEdit edit = editCaptor.getValue();<a name="line.5644"></a>
-<span class="sourceLineNo">5645</span>    assertNotNull(edit);<a name="line.5645"></a>
-<span class="sourceLineNo">5646</span>    assertNotNull(edit.getCells());<a name="line.5646"></a>
-<span class="sourceLineNo">5647</span>    assertEquals(1, edit.getCells().size());<a name="line.5647"></a>
-<span class="sourceLineNo">5648</span>    RegionEventDescriptor desc = WALEdit.getRegionEventDescriptor(edit.getCells().get(0));<a name="line.5648"></a>
-<span class="sourceLineNo">5649</span>    assertNotNull(desc);<a name="line.5649"></a>
+<span class="sourceLineNo">5644</span>    // capture append() calls<a name="line.5644"></a>
+<span class="sourceLineNo">5645</span>    WAL wal = mockWAL();<a name="line.5645"></a>
+<span class="sourceLineNo">5646</span>    when(rss.getWAL((HRegionInfo) any())).thenReturn(wal);<a name="line.5646"></a>
+<span class="sourceLineNo">5647</span><a name="line.5647"></a>
+<span class="sourceLineNo">5648</span>    region = HRegion.openHRegion(hri, htd, rss.getWAL(hri),<a name="line.5648"></a>
+<span class="sourceLineNo">5649</span>      TEST_UTIL.getConfiguration(), rss, null);<a name="line.5649"></a>
 <span class="sourceLineNo">5650</span><a name="line.5650"></a>
-<span class="sourceLineNo">5651</span>    LOG.info("RegionEventDescriptor from WAL: " + desc);<a name="line.5651"></a>
-<span class="sourceLineNo">5652</span><a name="line.5652"></a>
-<span class="sourceLineNo">5653</span>    assertEquals(RegionEventDescriptor.EventType.REGION_OPEN, desc.getEventType());<a name="line.5653"></a>
-<span class="sourceLineNo">5654</span>    assertTrue(Bytes.equals(desc.getTableName().toByteArray(), htd.getTableName().toBytes()));<a name="line.5654"></a>
-<span class="sourceLineNo">5655</span>    assertTrue(Bytes.equals(desc.getEncodedRegionName().toByteArray(),<a name="line.5655"></a>
-<span class="sourceLineNo">5656</span>      hri.getEncodedNameAsBytes()));<a name="line.5656"></a>
-<span class="sourceLineNo">5657</span>    assertTrue(desc.getLogSequenceNumber() &gt; 0);<a name="line.5657"></a>
-<span class="sourceLineNo">5658</span>    assertEquals(serverName, ProtobufUtil.toServerName(desc.getServer()));<a name="line.5658"></a>
-<span class="sourceLineNo">5659</span>    assertEquals(2, desc.getStoresCount());<a name="line.5659"></a>
+<span class="sourceLineNo">5651</span>    verify(wal, times(1)).append((HRegionInfo)any(), (WALKeyImpl)any()<a name="line.5651"></a>
+<span class="sourceLineNo">5652</span>      , editCaptor.capture(), anyBoolean());<a name="line.5652"></a>
+<span class="sourceLineNo">5653</span><a name="line.5653"></a>
+<span class="sourceLineNo">5654</span>    WALEdit edit = editCaptor.getValue();<a name="line.5654"></a>
+<span class="sourceLineNo">5655</span>    assertNotNull(edit);<a name="line.5655"></a>
+<span class="sourceLineNo">5656</span>    assertNotNull(edit.getCells());<a name="line.5656"></a>
+<span class="sourceLineNo">5657</span>    assertEquals(1, edit.getCells().size());<a name="line.5657"></a>
+<span class="sourceLineNo">5658</span>    RegionEventDescriptor desc = WALEdit.getRegionEventDescriptor(edit.getCells().get(0));<a name="line.5658"></a>
+<span class="sourceLineNo">5659</span>    assertNotNull(desc);<a name="line.5659"></a>
 <span class="sourceLineNo">5660</span><a name="line.5660"></a>
-<span class="sourceLineNo">5661</span>    StoreDescriptor store = desc.getStores(0);<a name="line.5661"></a>
-<span class="sourceLineNo">5662</span>    assertTrue(Bytes.equals(store.getFamilyName().toByteArray(), fam1));<a name="line.5662"></a>
-<span class="sourceLineNo">5663</span>    assertEquals(store.getStoreHomeDir(), Bytes.toString(fam1));<a name="line.5663"></a>
-<span class="sourceLineNo">5664</span>    assertEquals(1, store.getStoreFileCount()); // 1store file<a name="line.5664"></a>
-<span class="sourceLineNo">5665</span>    assertFalse(store.getStoreFile(0).contains("/")); // ensure path is relative<a name="line.5665"></a>
-<span class="sourceLineNo">5666</span><a name="line.5666"></a>
-<span class="sourceLineNo">5667</span>    store = desc.getStores(1);<a name="line.5667"></a>
-<span class="sourceLineNo">5668</span>    assertTrue(Bytes.equals(store.getFamilyName().toByteArray(), fam2));<a name="line.5668"></a>
-<span class="sourceLineNo">5669</span>    assertEquals(store.getStoreHomeDir(), Bytes.toString(fam2));<a name="line.5669"></a>
-<span class="sourceLineNo">5670</span>    assertEquals(0, store.getStoreFileCount()); // no store files<a name="line.5670"></a>
-<span class="sourceLineNo">5671</span>  }<a name="line.5671"></a>
-<span class="sourceLineNo">5672</span><a name="line.5672"></a>
-<span class="sourceLineNo">5673</span>  // Helper for test testOpenRegionWrittenToWALForLogReplay<a name="line.5673"></a>
-<span class="sourceLineNo">5674</span>  static class HRegionWithSeqId extends HRegion {<a name="line.5674"></a>
-<span class="sourceLineNo">5675</span>    public HRegionWithSeqId(final Path tableDir, final WAL wal, final FileSystem fs,<a name="line.5675"></a>
-<span class="sourceLineNo">5676</span>        final Configuration confParam, final RegionInfo regionInfo,<a name="line.5676"></a>
-<span class="sourceLineNo">5677</span>        final TableDescriptor htd, final RegionServerServices rsServices) {<a name="line.5677"></a>
-<span class="sourceLineNo">5678</span>      super(tableDir, wal, fs, confParam, regionInfo, htd, rsServices);<a name="line.5678"></a>
-<span class="sourceLineNo">5679</span>    }<a name="line.5679"></a>
-<span class="sourceLineNo">5680</span>    @Override<a name="line.5680"></a>
-<span class="sourceLineNo">5681</span>    protected long getNextSequenceId(WAL wal) throws IOException {<a name="line.5681"></a>
-<span class="sourceLineNo">5682</span>      return 42;<a name="line.5682"></a>
-<span class="sourceLineNo">5683</span>    }<a name="line.5683"></a>
-<span class="sourceLineNo">5684</span>  }<a name="line.5684"></a>
-<span class="sourceLineNo">5685</span><a name="line.5685"></a>
-<span class="sourceLineNo">5686</span>  @Test<a name="line.5686"></a>
-<span class="sourceLineNo">5687</span>  public void testFlushedFileWithNoTags() throws Exception {<a name="line.5687"></a>
-<span class="sourceLineNo">5688</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.5688"></a>
-<span class="sourceLineNo">5689</span>    HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.5689"></a>
-<span class="sourceLineNo">5690</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.5690"></a>
-<span class="sourceLineNo">5691</span>    HRegionInfo info = new HRegionInfo(tableName, null, null, false);<a name="line.5691"></a>
-<span class="sourceLineNo">5692</span>    Path path = TEST_UTIL.getDataTestDir(getClass().getSimpleName());<a name="line.5692"></a>
-<span class="sourceLineNo">5693</span>    region = HBaseTestingUtility.createRegionAndWAL(info, path, TEST_UTIL.getConfiguration(), htd);<a name="line.5693"></a>
-<span class="sourceLineNo">5694</span>    Put put = new Put(Bytes.toBytes("a-b-0-0"));<a name="line.5694"></a>
-<span class="sourceLineNo">5695</span>    put.addColumn(fam1, qual1, Bytes.toBytes("c1-value"));<a name="line.5695"></a>
-<span class="sourceLineNo">5696</span>    region.put(put);<a name="line.5696"></a>
-<span class="sourceLineNo">5697</span>    region.flush(true);<a name="line.5697"></a>
-<span class="sourceLineNo">5698</span>    HStore store = region.getStore(fam1);<a name="line.5698"></a>
-<span class="sourceLineNo">5699</span>    Collection&lt;HStoreFile&gt; storefiles = store.getStorefiles();<a name="line.5699"></a>
-<span class="sourceLineNo">5700</span>    for (HStoreFile sf : storefiles) {<a name="line.5700"></a>
-<span class="sourceLineNo">5701</span>      assertFalse("Tags should not be present "<a name="line.5701"></a>
-<span class="sourceLineNo">5702</span>          ,sf.getReader().getHFileReader().getFileContext().isIncludesTags());<a name="line.5702"></a>
-<span class="sourceLineNo">5703</span>    }<a name="line.5703"></a>
-<span class="sourceLineNo">5704</span>  }<a name="line.5704"></a>
-<span class="sourceLineNo">5705</span><a name="line.5705"></a>
-<span class="sourceLineNo">5706</span>  /**<a name="line.5706"></a>
-<span class="sourceLineNo">5707</span>   * Utility method to setup a WAL mock.<a name="line.5707"></a>
-<span class="sourceLineNo">5708</span>   * Needs to do the bit where we close latch on the WALKeyImpl on append else test hangs.<a name="line.5708"></a>
-<span class="sourceLineNo">5709</span>   * @return a mock WAL<a name="line.5709"></a>
-<span class="sourceLineNo">5710</span>   * @throws IOException<a name="line.5710"></a>
-<span class="sourceLineNo">5711</span>   */<a name="line.5711"></a>
-<span class="sourceLineNo">5712</span>  private WAL mockWAL() throws IOException {<a name="line.5712"></a>
-<span class="sourceLineNo">5713</span>    WAL wal = mock(WAL.class);<a name="line.5713"></a>
-<span class="sourceLineNo">5714</span>    Mockito.when(wal.append((HRegionInfo)Mockito.any(),<a name="line.5714"></a>
-<span class="sourceLineNo">5715</span>        (WALKeyImpl)Mockito.any(), (WALEdit)Mockito.any(), Mockito.anyBoolean())).<a name="line.5715"></a>
-<span class="sourceLineNo">5716</span>      thenAnswer(new Answer&lt;Long&gt;() {<a name="line.5716"></a>
-<span class="sourceLineNo">5717</span>        @Override<a name="line.5717"></a>
-<span class="sourceLineNo">5718</span>        public Long answer(InvocationOnMock invocation) throws Throwable {<a name="line.5718"></a>
-<span class="sourceLineNo">5719</span>          WALKeyImpl key = invocation.getArgument(1);<a name="line.5719"></a>
-<span class="sourceLineNo">5720</span>          MultiVersionConcurrencyControl.WriteEntry we = key.getMvcc().begin();<a name="line.5720"></a>
-<span class="sourceLineNo">5721</span>          key.setWriteEntry(we);<a name="line.5721"></a>
-<span class="sourceLineNo">5722</span>          return 1L;<a name="line.5722"></a>
-<span class="sourceLineNo">5723</span>        }<a name="line.5723"></a>
-<span class="sourceLineNo">5724</span><a name="line.5724"></a>
-<span class="sourceLineNo">5725</span>    });<a name="line.5725"></a>
-<span class="sourceLineNo">5726</span>    return wal;<a name="line.5726"></a>
-<span class="sourceLineNo">5727</span>  }<a name="line.5727"></a>
-<span class="sourceLineNo">5728</span><a name="line.5728"></a>
-<span class="sourceLineNo">5729</span>  @Test<a name="line.5729"></a>
-<span class="sourceLineNo">5730</span>  public void testCloseRegionWrittenToWAL() throws Exception {<a name="line.5730"></a>
-<span class="sourceLineNo">5731</span><a name="line.5731"></a>
-<span class="sourceLineNo">5732</span>    Path rootDir = new Path(dir + name.getMethodName());<a name="line.5732"></a>
-<span class="sourceLineNo">5733</span>    FSUtils.setRootDir(TEST_UTIL.getConfiguration(), rootDir);<a name="line.5733"></a>
+<span class="sourceLineNo">5661</span>    LOG.info("RegionEventDescriptor from WAL: " + desc);<a name="line.5661"></a>
+<span class="sourceLineNo">5662</span><a name="line.5662"></a>
+<span class="sourceLineNo">5663</span>    assertEquals(RegionEventDescriptor.EventType.REGION_OPEN, desc.getEventType());<a name="line.5663"></a>
+<span class="sourceLineNo">5664</span>    assertTrue(Bytes.equals(desc.getTableName().toByteArray(), htd.getTableName().toBytes()));<a name="line.5664"></a>
+<span class="sourceLineNo">5665</span>    assertTrue(Bytes.equals(desc.getEncodedRegionName().toByteArray(),<a name="line.5665"></a>
+<span class="sourceLineNo">5666</span>      hri.getEncodedNameAsBytes()));<a name="line.5666"></a>
+<span class="sourceLineNo">5667</span>    assertTrue(desc.getLogSequenceNumber() &gt; 0);<a name="line.5667"></a>
+<span class="sourceLineNo">5668</span>    assertEquals(serverName, ProtobufUtil.toServerName(desc.getServer()));<a name="line.5668"></a>
+<span class="sourceLineNo">5669</span>    assertEquals(2, desc.getStoresCount());<a name="line.5669"></a>
+<span class="sourceLineNo">5670</span><a name="line.5670"></a>
+<span class="sourceLineNo">5671</span>    StoreDescriptor store = desc.getStores(0);<a name="line.5671"></a>
+<span class="sourceLineNo">5672</span>    assertTrue(Bytes.equals(store.getFamilyName().toByteArray(), fam1));<a name="line.5672"></a>
+<span class="sourceLineNo">5673</span>    assertEquals(store.getStoreHomeDir(), Bytes.toString(fam1));<a name="line.5673"></a>
+<span class="sourceLineNo">5674</span>    assertEquals(1, store.getStoreFileCount()); // 1store file<a name="line.5674"></a>
+<span class="sourceLineNo">5675</span>    assertFalse(store.getStoreFile(0).contains("/")); // ensure path is relative<a name="line.5675"></a>
+<span class="sourceLineNo">5676</span><a name="line.5676"></a>
+<span class="sourceLineNo">5677</span>    store = desc.getStores(1);<a name="line.5677"></a>
+<span class="sourceLineNo">5678</span>    assertTrue(Bytes.equals(store.getFamilyName().toByteArray(), fam2));<a name="line.5678"></a>
+<span class="sourceLineNo">5679</span>    assertEquals(store.getStoreHomeDir(), Bytes.toString(fam2));<a name="line.5679"></a>
+<span class="sourceLineNo">5680</span>    assertEquals(0, store.getStoreFileCount()); // no store files<a name="line.5680"></a>
+<span class="sourceLineNo">5681</span>  }<a name="line.5681"></a>
+<span class="sourceLineNo">5682</span><a name="line.5682"></a>
+<span class="sourceLineNo">5683</span>  // Helper for test testOpenRegionWrittenToWALForLogReplay<a name="line.5683"></a>
+<span class="sourceLineNo">5684</span>  static class HRegionWithSeqId extends HRegion {<a name="line.5684"></a>
+<span class="sourceLineNo">5685</span>    public HRegionWithSeqId(final Path tableDir, final WAL wal, final FileSystem fs,<a name="line.5685"></a>
+<span class="sourceLineNo">5686</span>        final Configuration confParam, final RegionInfo regionInfo,<a name="line.5686"></a>
+<span class="sourceLineNo">5687</span>        final TableDescriptor htd, final RegionServerServices rsServices) {<a name="line.5687"></a>
+<span class="sourceLineNo">5688</span>      super(tableDir, wal, fs, confParam, regionInfo, htd, rsServices);<a name="line.5688"></a>
+<span class="sourceLineNo">5689</span>    }<a name="line.5689"></a>
+<span class="sourceLineNo">5690</span>    @Override<a name="line.5690"></a>
+<span class="sourceLineNo">5691</span>    protected long getNextSequenceId(WAL wal) throws IOException {<a name="line.5691"></a>
+<span class="sourceLineNo">5692</span>      return 42;<a name="line.5692"></a>
+<span class="sourceLineNo">5693</span>    }<a name="line.5693"></a>
+<span class="sourceLineNo">5694</span>  }<a name="line.5694"></a>
+<span class="sourceLineNo">5695</span><a name="line.5695"></a>
+<span class="sourceLineNo">5696</span>  @Test<a name="line.5696"></a>
+<span class="sourceLineNo">5697</span>  public void testFlushedFileWithNoTags() throws Exception {<a name="line.5697"></a>
+<span class="sourceLineNo">5698</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.5698"></a>
+<span class="sourceLineNo">5699</span>    HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.5699"></a>
+<span class="sourceLineNo">5700</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.5700"></a>
+<span class="sourceLineNo">5701</span>    HRegionInfo info = new HRegionInfo(tableName, null, null, false);<a name="line.5701"></a>
+<span class="sourceLineNo">5702</span>    Path path = TEST_UTIL.getDataTestDir(getClass().getSimpleName());<a name="line.5702"></a>
+<span class="sourceLineNo">5703</span>    region = HBaseTestingUtility.createRegionAndWAL(info, path, TEST_UTIL.getConfiguration(), htd);<a name="line.5703"></a>
+<span class="sourceLineNo">5704</span>    Put put = new Put(Bytes.toBytes("a-b-0-0"));<a name="line.5704"></a>
+<span class="sourceLineNo">5705</span>    put.addColumn(fam1, qual1, Bytes.toBytes("c1-value"));<a name="line.5705"></a>
+<span class="sourceLineNo">5706</span>    region.put(put);<a name="line.5706"></a>
+<span class="sourceLineNo">5707</span>    region.flush(true);<a name="line.5707"></a>
+<span class="sourceLineNo">5708</span>    HStore store = region.getStore(fam1);<a name="line.5708"></a>
+<span class="sourceLineNo">5709</span>    Collection&lt;HStoreFile&gt; storefiles = store.getStorefiles();<a name="line.5709"></a>
+<span class="sourceLineNo">5710</span>    for (HStoreFile sf : storefiles) {<a name="line.5710"></a>
+<span class="sourceLineNo">5711</span>      assertFalse("Tags should not be present "<a name="line.5711"></a>
+<span class="sourceLineNo">5712</span>          ,sf.getReader().getHFileReader().getFileContext().isIncludesTags());<a name="line.5712"></a>
+<span class="sourceLineNo">5713</span>    }<a name="line.5713"></a>
+<span class="sourceLineNo">5714</span>  }<a name="line.5714"></a>
+<span class="sourceLineNo">5715</span><a name="line.5715"></a>
+<span class="sourceLineNo">5716</span>  /**<a name="line.5716"></a>
+<span class="sourceLineNo">5717</span>   * Utility method to setup a WAL mock.<a name="line.5717"></a>
+<span class="sourceLineNo">5718</span>   * Needs to do the bit where we close latch on the WALKeyImpl on append else test hangs.<a name="line.5718"></a>
+<span class="sourceLineNo">5719</span>   * @return a mock WAL<a name="line.5719"></a>
+<span class="sourceLineNo">5720</span>   * @throws IOException<a name="line.5720"></a>
+<span class="sourceLineNo">5721</span>   */<a name="line.5721"></a>
+<span class="sourceLineNo">5722</span>  private WAL mockWAL() throws IOException {<a name="line.5722"></a>
+<span class="sourceLineNo">5723</span>    WAL wal = mock(WAL.class);<a name="line.5723"></a>
+<span class="sourceLineNo">5724</span>    Mockito.when(wal.append((HRegionInfo)Mockito.any(),<a name="line.5724"></a>
+<span class="sourceLineNo">5725</span>        (WALKeyImpl)Mockito.any(), (WALEdit)Mockito.any(), Mockito.anyBoolean())).<a name="line.5725"></a>
+<span class="sourceLineNo">5726</span>      thenAnswer(new Answer&lt;Long&gt;() {<a name="line.5726"></a>
+<span class="sourceLineNo">5727</span>        @Override<a name="line.5727"></a>
+<span class="sourceLineNo">5728</span>        public Long answer(InvocationOnMock invocation) throws Throwable {<a name="line.5728"></a>
+<span class="sourceLineNo">5729</span>          WALKeyImpl key = invocation.getArgument(1);<a name="line.5729"></a>
+<span class="sourceLineNo">5730</span>          MultiVersionConcurrencyControl.WriteEntry we = key.getMvcc().begin();<a name="line.5730"></a>
+<span class="sourceLineNo">5731</span>          key.setWriteEntry(we);<a name="line.5731"></a>
+<span class="sourceLineNo">5732</span>          return 1L;<a name="line.5732"></a>
+<span class="sourceLineNo">5733</span>        }<a name="line.5733"></a>
 <span class="sourceLineNo">5734</span><a name="line.5734"></a>
-<span class="sourceLineNo">5735</span>    final ServerName serverName = ServerName.valueOf("testCloseRegionWrittenToWAL", 100, 42);<a name="line.5735"></a>
-<span class="sourceLineNo">5736</span>    final RegionServerServices rss = spy(TEST_UTIL.createMockRegionServerService(serverName));<a name="line.5736"></a>
-<span class="sourceLineNo">5737</span><a name="line.5737"></a>
-<span class="sourceLineNo">5738</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.5738"></a>
-<span class="sourceLineNo">5739</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.5739"></a>
-<span class="sourceLineNo">5740</span>    htd.addFamily(new HColumnDescriptor(fam2));<a name="line.5740"></a>
+<span class="sourceLineNo">5735</span>    });<a name="line.5735"></a>
+<span class="sourceLineNo">5736</span>    return wal;<a name="line.5736"></a>
+<span class="sourceLineNo">5737</span>  }<a name="line.5737"></a>
+<span class="sourceLineNo">5738</span><a name="line.5738"></a>
+<span class="sourceLineNo">5739</span>  @Test<a name="line.5739"></a>
+<span class="sourceLineNo">5740</span>  public void testCloseRegionWrittenToWAL() throws Exception {<a name="line.5740"></a>
 <span class="sourceLineNo">5741</span><a name="line.5741"></a>
-<span class="sourceLineNo">5742</span>    final HRegionInfo hri = new HRegionInfo(htd.getTableName(),<a name="line.5742"></a>
-<span class="sourceLineNo">5743</span>      HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY);<a name="line.5743"></a>
+<span class="sourceLineNo">5742</span>    Path rootDir = new Path(dir + name.getMethodName());<a name="line.5742"></a>
+<span class="sourceLineNo">5743</span>    FSUtils.setRootDir(TEST_UTIL.getConfiguration(), rootDir);<a name="line.5743"></a>
 <span class="sourceLineNo">5744</span><a name="line.5744"></a>
-<span class="sourceLineNo">5745</span>    ArgumentCaptor&lt;WALEdit&gt; editCaptor = ArgumentCaptor.forClass(WALEdit.class);<a name="line.5745"></a>
-<span class="sourceLineNo">5746</span><a name="line.5746"></a>
-<span class="sourceLineNo">5747</span>    // capture append() calls<a name="line.5747"></a>
-<span class="sourceLineNo">5748</span>    WAL wal = mockWAL();<a name="line.5748"></a>
-<span class="sourceLineNo">5749</span>    when(rss.getWAL((HRegionInfo) any())).thenReturn(wal);<a name="line.5749"></a>
-<span class="sourceLineNo">5750</span><a name="line.5750"></a>
+<span class="sourceLineNo">5745</span>    final ServerName serverName = ServerName.valueOf("testCloseRegionWrittenToWAL", 100, 42);<a name="line.5745"></a>
+<span class="sourceLineNo">5746</span>    final RegionServerServices rss = spy(TEST_UTIL.createMockRegionServerService(serverName));<a name="line.5746"></a>
+<span class="sourceLineNo">5747</span><a name="line.5747"></a>
+<span class="sourceLineNo">5748</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.5748"></a>
+<span class="sourceLineNo">5749</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.5749"></a>
+<span class="sourceLineNo">5750</span>    htd.addFamily(new HColumnDescriptor(fam2));<a name="line.5750"></a>
 <span class="sourceLineNo">5751</span><a name="line.5751"></a>
-<span class="sourceLineNo">5752</span>    // create and then open a region first so that it can be closed later<a name="line.5752"></a>
-<span class="sourceLineNo">5753</span>    region = HRegion.createHRegion(hri, rootDir, TEST_UTIL.getConfiguration(), htd, rss.getWAL(hri));<a name="line.5753"></a>
-<span class="sourceLineNo">5754</span>    region = HRegion.openHRegion(hri, htd, rss.getWAL(hri),<a name="line.5754"></a>
-<span class="sourceLineNo">5755</span>      TEST_UTIL.getConfiguration(), rss, null);<a name="line.5755"></a>
+<span class="sourceLineNo">5752</span>    final HRegionInfo hri = new HRegionInfo(htd.getTableName(),<a name="line.5752"></a>
+<span class="sourceLineNo">5753</span>      HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY);<a name="line.5753"></a>
+<span class="sourceLineNo">5754</span><a name="line.5754"></a>
+<span class="sourceLineNo">5755</span>    ArgumentCaptor&lt;WALEdit&gt; editCaptor = ArgumentCaptor.forClass(WALEdit.class);<a name="line.5755"></a>
 <span class="sourceLineNo">5756</span><a name="line.5756"></a>
-<span class="sourceLineNo">5757</span>    // close the region<a name="line.5757"></a>
-<span class="sourceLineNo">5758</span>    region.close(false);<a name="line.5758"></a>
-<span class="sourceLineNo">5759</span><a name="line.5759"></a>
-<span class="sourceLineNo">5760</span>    // 2 times, one for region open, the other close region<a name="line.5760"></a>
-<span class="sourceLineNo">5761</span>    verify(wal, times(2)).append((HRegionInfo)any(), (WALKeyImpl)any(),<a name="line.5761"></a>
-<span class="sourceLineNo">5762</span>      editCaptor.capture(), anyBoolean());<a name="line.5762"></a>
-<span class="sourceLineNo">5763</span><a name="line.5763"></a>
-<span class="sourceLineNo">5764</span>    WALEdit edit = editCaptor.getAllValues().get(1);<a name="line.5764"></a>
-<span class="sourceLineNo">5765</span>    assertNotNull(edit);<a name="line.5765"></a>
-<span class="sourceLineNo">5766</span>    assertNotNull(edit.getCells());<a name="line.5766"></a>
-<span class="sourceLineNo">5767</span>    assertEquals(1, edit.getCells().size());<a name="line.5767"></a>
-<span class="sourceLineNo">5768</span>    RegionEventDescriptor desc = WALEdit.getRegionEventDescriptor(edit.getCells().get(0));<a name="line.5768"></a>
-<span class="sourceLineNo">5769</span>    assertNotNull(desc);<a name="line.5769"></a>
-<span class="sourceLineNo">5770</span><a name="line.5770"></a>
-<span class="sourceLineNo">5771</span>    LOG.info("RegionEventDescriptor from WAL: " + desc);<a name="line.5771"></a>
-<span class="sourceLineNo">5772</span><a name="line.5772"></a>
-<span class="sourceLineNo">5773</span>    assertEquals(RegionEventDescriptor.EventType.REGION_CLOSE, desc.getEventType());<a name="line.5773"></a>
-<span class="sourceLineNo">5774</span>    assertTrue(Bytes.equals(desc.getTableName().toByteArray(), htd.getTableName().toBytes()));<a name="line.5774"></a>
-<span class="sourceLineNo">5775</span>    assertTrue(Bytes.equals(desc.getEncodedRegionName().toByteArray(),<a name="line.5775"></a>
-<span class="sourceLineNo">5776</span>      hri.getEncodedNameAsBytes()));<a name="line.5776"></a>
-<span class="sourceLineNo">5777</span>    assertTrue(desc.getLogSequenceNumber() &gt; 0);<a name="line.5777"></a>
-<span class="sourceLineNo">5778</span>    assertEquals(serverName, ProtobufUtil.toServerName(desc.getServer()));<a name="line.5778"></a>
-<span class="sourceLineNo">5779</span>    assertEquals(2, desc.getStoresCount());<a name="line.5779"></a>
+<span class="sourceLineNo">5757</span>    // capture append() calls<a name="line.5757"></a>
+<span class="sourceLineNo">5758</span>    WAL wal = mockWAL();<a name="line.5758"></a>
+<span class="sourceLineNo">5759</span>    when(rss.getWAL((HRegionInfo) any())).thenReturn(wal);<a name="line.5759"></a>
+<span class="sourceLineNo">5760</span><a name="line.5760"></a>
+<span class="sourceLineNo">5761</span><a name="line.5761"></a>
+<span class="sourceLineNo">5762</span>    // create and then open a region first so that it can be closed later<a name="line.5762"></a>
+<span class="sourceLineNo">5763</span>    region = HRegion.createHRegion(hri, rootDir, TEST_UTIL.getConfiguration(), htd, rss.getWAL(hri));<a name="line.5763"></a>
+<span class="sourceLineNo">5764</span>    region = HRegion.openHRegion(hri, htd, rss.getWAL(hri),<a name="line.5764"></a>
+<span class="sourceLineNo">5765</span>      TEST_UTIL.getConfiguration(), rss, null);<a name="line.5765"></a>
+<span class="sourceLineNo">5766</span><a name="line.5766"></a>
+<span class="sourceLineNo">5767</span>    // close the region<a name="line.5767"></a>
+<span class="sourceLineNo">5768</span>    region.close(false);<a name="line.5768"></a>
+<span class="sourceLineNo">5769</span><a name="line.5769"></a>
+<span class="sourceLineNo">5770</span>    // 2 times, one for region open, the other close region<a name="line.5770"></a>
+<span class="sourceLineNo">5771</span>    verify(wal, times(2)).append((HRegionInfo)any(), (WALKeyImpl)any(),<a name="line.5771"></a>
+<span class="sourceLineNo">5772</span>      editCaptor.capture(), anyBoolean());<a name="line.5772"></a>
+<span class="sourceLineNo">5773</span><a name="line.5773"></a>
+<span class="sourceLineNo">5774</span>    WALEdit edit = editCaptor.getAllValues().get(1);<a name="line.5774"></a>
+<span class="sourceLineNo">5775</span>    assertNotNull(edit);<a name="line.5775"></a>
+<span class="sourceLineNo">5776</span>    assertNotNull(edit.getCells());<a name="line.5776"></a>
+<span class="sourceLineNo">5777</span>    assertEquals(1, edit.getCells().size());<a name="line.5777"></a>
+<span class="sourceLineNo">5778</span>    RegionEventDescriptor desc = WALEdit.getRegionEventDescriptor(edit.getCells().get(0));<a name="line.5778"></a>
+<span class="sourceLineNo">5779</span>    assertNotNull(desc);<a name="line.5779"></a>
 <span class="sourceLineNo">5780</span><a name="line.5780"></a>
-<span class="sourceLineNo">5781</span>    StoreDescriptor store = desc.getStores(0);<a name="line.5781"></a>
-<span class="sourceLineNo">5782</span>    assertTrue(Bytes.equals(store.getFamilyName().toByteArray(), fam1));<a name="line.5782"></a>
-<span class="sourceLineNo">5783</span>    assertEquals(store.getStoreHomeDir(), Bytes.toString(fam1));<a name="line.5783"></a>
-<span class="sourceLineNo">5784</span>    assertEquals(0, store.getStoreFileCount()); // no store files<a name="line.5784"></a>
-<span class="sourceLineNo">5785</span><a name="line.5785"></a>
-<span class="sourceLineNo">5786</span>    store = desc.getStores(1);<a name="line.5786"></a>
-<span class="sourceLineNo">5787</span>    assertTrue(Bytes.equals(store.getFamilyName().toByteArray(), fam2));<a name="line.5787"></a>
-<span class="sourceLineNo">5788</span>    assertEquals(store.getStoreHomeDir(), Bytes.toString(fam2));<a name="line.5788"></a>
-<span class="sourceLineNo">5789</span>    assertEquals(0, store.getStoreFileCount()); // no store files<a name="line.5789"></a>
-<span class="sourceLineNo">5790</span>  }<a name="line.5790"></a>
-<span class="sourceLineNo">5791</span><a name="line.5791"></a>
-<span class="sourceLineNo">5792</span>  /**<a name="line.5792"></a>
-<span class="sourceLineNo">5793</span>   * Test RegionTooBusyException thrown when region is busy<a name="line.5793"></a>
-<span class="sourceLineNo">5794</span>   */<a name="line.5794"></a>
-<span class="sourceLineNo">5795</span>  @Test<a name="line.5795"></a>
-<span class="sourceLineNo">5796</span>  public void testRegionTooBusy() throws IOException {<a name="line.5796"></a>
-<span class="sourceLineNo">5797</span>    byte[] family = Bytes.toBytes("family");<a name="line.5797"></a>
-<span class="sourceLineNo">5798</span>    long defaultBusyWaitDuration = CONF.getLong("hbase.busy.wait.duration",<a name="line.5798"></a>
-<span class="sourceLineNo">5799</span>      HRegion.DEFAULT_BUSY_WAIT_DURATION);<a name="line.5799"></a>
-<span class="sourceLineNo">5800</span>    CONF.setLong("hbase.busy.wait.duration", 1000);<a name="line.5800"></a>
-<span class="sourceLineNo">5801</span>    region = initHRegion(tableName, method, CONF, family);<a name="line.5801"></a>
-<span class="sourceLineNo">5802</span>    final AtomicBoolean stopped = new AtomicBoolean(true);<a name="line.5802"></a>
-<span class="sourceLineNo">5803</span>    Thread t = new Thread(new Runnable() {<a name="line.5803"></a>
-<span class="sourceLineNo">5804</span>      @Override<a name="line.5804"></a>
-<span class="sourceLineNo">5805</span>      public void run() {<a name="line.5805"></a>
-<span class="sourceLineNo">5806</span>        try {<a name="line.5806"></a>
-<span class="sourceLineNo">5807</span>          region.lock.writeLock().lock();<a name="line.5807"></a>
-<span class="sourceLineNo">5808</span>          stopped.set(false);<a name="line.5808"></a>
-<span class="sourceLineNo">5809</span>          while (!stopped.get()) {<a name="line.5809"></a>
-<span class="sourceLineNo">5810</span>            Thread.sleep(100);<a name="line.5810"></a>
-<span class="sourceLineNo">5811</span>          }<a name="line.5811"></a>
-<span class="sourceLineNo">5812</span>        } catch (InterruptedException ie) {<a name="line.5812"></a>
-<span class="sourceLineNo">5813</span>        } finally {<a name="line.5813"></a>
-<span class="sourceLineNo">5814</span>          region.lock.writeLock().unlock();<a name="line.5814"></a>
-<span class="sourceLineNo">5815</span>        }<a name="line.5815"></a>
-<span class="sourceLineNo">5816</span>      }<a name="line.5816"></a>
-<span class="sourceLineNo">5817</span>    });<a name="line.5817"></a>
-<span class="sourceLineNo">5818</span>    t.start();<a name="line.5818"></a>
-<span class="sourceLineNo">5819</span>    Get get = new Get(row);<a name="line.5819"></a>
-<span class="sourceLineNo">5820</span>    try {<a name="line.5820"></a>
-<span class="sourceLineNo">5821</span>      while (stopped.get()) {<a name="line.5821"></a>
-<span class="sourceLineNo">5822</span>        Thread.sleep(100);<a name="line.5822"></a>
-<span class="sourceLineNo">5823</span>      }<a name="line.5823"></a>
-<span class="sourceLineNo">5824</span>      region.get(get);<a name="line.5824"></a>
-<span class="sourceLineNo">5825</span>      fail("Should throw RegionTooBusyException");<a name="line.5825"></a>
-<span class="sourceLineNo">5826</span>    } catch (InterruptedException ie) {<a name="line.5826"></a>
-<span class="sourceLineNo">5827</span>      fail("test interrupted");<a name="line.5827"></a>
-<span class="sourceLineNo">5828</span>    } catch (RegionTooBusyException e) {<a name="line.5828"></a>
-<span class="sourceLineNo">5829</span>      // Good, expected<a name="line.5829"></a>
-<span class="sourceLineNo">5830</span>    } finally {<a name="line.5830"></a>
-<span class="sourceLineNo">5831</span>      stopped.set(true);<a name="line.5831"></a>
-<span class="sourceLineNo">5832</span>      try {<a name="line.5832"></a>
-<span class="sourceLineNo">5833</span>        t.join();<a name="line.5833"></a>
-<span class="sourceLineNo">5834</span>      } catch (Throwable e) {<a name="line.5834"></a>
-<span class="sourceLineNo">5835</span>      }<a name="line.5835"></a>
-<span class="sourceLineNo">5836</span><a name="line.5836"></a>
-<span class="sourceLineNo">5837</span>      HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.5837"></a>
-<span class="sourceLineNo">5838</span>      region = null;<a name="line.5838"></a>
-<span class="sourceLineNo">5839</span>      CONF.setLong("hbase.busy.wait.duration", defaultBusyWaitDuration);<a name="line.5839"></a>
-<span class="sourceLineNo">5840</span>    }<a name="line.5840"></a>
-<span class="sourceLineNo">5841</span>  }<a name="line.5841"></a>
-<span class="sourceLineNo">5842</span><a name="line.5842"></a>
-<span class="sourceLineNo">5843</span>  @Test<a name="line.5843"></a>
-<span class="sourceLineNo">5844</span>  public void testCellTTLs() throws IOException {<a name="line.5844"></a>
-<span class="sourceLineNo">5845</span>    IncrementingEnvironmentEdge edge = new IncrementingEnvironmentEdge();<a name="line.5845"></a>
-<span class="sourceLineNo">5846</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.5846"></a>
-<span class="sourceLineNo">5847</span><a name="line.5847"></a>
-<span class="sourceLineNo">5848</span>    final byte[] row = Bytes.toBytes("testRow");<a name="line.5848"></a>
-<span class="sourceLineNo">5849</span>    final byte[] q1 = Bytes.toBytes("q1");<a name="line.5849"></a>
-<span class="sourceLineNo">5850</span>    final byte[] q2 = Bytes.toBytes("q2");<a name="line.5850"></a>
-<span class="sourceLineNo">5851</span>    final byte[] q3 = Bytes.toBytes("q3");<a name="line.5851"></a>
-<span class="sourceLineNo">5852</span>    final byte[] q4 = Bytes.toBytes("q4");<a name="line.5852"></a>
-<span class="sourceLineNo">5853</span><a name="line.5853"></a>
-<span class="sourceLineNo">5854</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.5854"></a>
-<span class="sourceLineNo">5855</span>    HColumnDescriptor hcd = new HColumnDescriptor(fam1);<a name="line.5855"></a>
-<span class="sourceLineNo">5856</span>    hcd.setTimeToLive(10); // 10 seconds<a name="line.5856"></a>
-<span class="sourceLineNo">5857</span>    htd.addFamily(hcd);<a name="line.5857"></a>
-<span class="sourceLineNo">5858</span><a name="line.5858"></a>
-<span class="sourceLineNo">5859</span>    Configuration conf = new Configuration(TEST_UTIL.getConfiguration());<a name="line.5859"></a>
-<span class="sourceLineNo">5860</span>    conf.setInt(HFile.FORMAT_VERSION_KEY, HFile.MIN_FORMAT_VERSION_WITH_TAGS);<a name="line.5860"></a>
-<span class="sourceLineNo">5861</span><a name="line.5861"></a>
-<span class="sourceLineNo">5862</span>    region = HBaseTestingUtility.createRegionAndWAL(new HRegionInfo(htd.getTableName(),<a name="line.5862"></a>
-<span class="sourceLineNo">5863</span>            HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY),<a name="line.5863"></a>
-<span class="sourceLineNo">5864</span>        TEST_UTIL.getDataTestDir(), conf, htd);<a name="line.5864"></a>
-<span class="sourceLineNo">5865</span>    assertNotNull(region);<a name="line.5865"></a>
-<span class="sourceLineNo">5866</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.5866"></a>
-<span class="sourceLineNo">5867</span>    // Add a cell that will expire in 5 seconds via cell TTL<a name="line.5867"></a>
-<span class="sourceLineNo">5868</span>    region.put(new Put(row).add(new KeyValue(row, fam1, q1, now,<a name="line.5868"></a>
-<span class="sourceLineNo">5869</span>      HConstants.EMPTY_BYTE_ARRAY, new ArrayBackedTag[] {<a name="line.5869"></a>
-<span class="sourceLineNo">5870</span>        // TTL tags specify ts in milliseconds<a name="line.5870"></a>
-<span class="sourceLineNo">5871</span>        new ArrayBackedTag(TagType.TTL_TAG_TYPE, Bytes.toBytes(5000L)) })));<a name="line.5871"></a>
-<span class="sourceLineNo">5872</span>    // Add a cell that will expire after 10 seconds via family setting<a name="line.5872"></a>
-<span class="sourceLineNo">5873</span>    region.put(new Put(row).addColumn(fam1, q2, now, HConstants.EMPTY_BYTE_ARRAY));<a name="line.5873"></a>
-<span class="sourceLineNo">5874</span>    // Add a cell that will expire in 15 seconds via cell TTL<a name="line.5874"></a>
-<span class="sourceLineNo">5875</span>    region.put(new Put(row).add(new KeyValue(row, fam1, q3, now + 10000 - 1,<a name="line.5875"></a>
-<span class="sourceLineNo">5876</span>      HConstants.EMPTY_BYTE_ARRAY, new ArrayBackedTag[] {<a name="line.5876"></a>
-<span class="sourceLineNo">5877</span>        // TTL tags specify ts in milliseconds<a name="line.5877"></a>
-<span class="sourceLineNo">5878</span>        new ArrayBackedTag(TagType.TTL_TAG_TYPE, Bytes.toBytes(5000L)) })));<a name="line.5878"></a>
-<span class="sourceLineNo">5879</span>    // Add a cell that will expire in 20 seconds via family setting<a name="line.5879"></a>
-<span class="sourceLineNo">5880</span>    region.put(new Put(row).addColumn(fam1, q4, now + 10000 - 1, HConstants.EMPTY_BYTE_ARRAY));<a name="line.5880"></a>
-<span class="sourceLineNo">5881</span><a name="line.5881"></a>
-<span class="sourceLineNo">5882</span>    // Flush so we are sure store scanning gets this right<a name="line.5882"></a>
-<span class="sourceLineNo">5883</span>    region.flush(true);<a name="line.5883"></a>
-<span class="sourceLineNo">5884</span><a name="line.5884"></a>
-<span class="sourceLineNo">5885</span>    // A query at time T+0 should return all cells<a name="line.5885"></a>
-<span class="sourceLineNo">5886</span>    Result r = region.get(new Get(row));<a name="line.5886"></a>
-<span class="sourceLineNo">5887</span>    assertNotNull(r.getValue(fam1, q1));<a name="line.5887"></a>
-<span class="sourceLineNo">5888</span>    assertNotNull(r.getValue(fam1, q2));<a name="line.5888"></a>
-<span class="sourceLineNo">5889</span>    assertNotNull(r.getValue(fam1, q3));<a name="line.5889"></a>
-<span class="sourceLineNo">5890</span>    assertNotNull(r.getValue(fam1, q4));<a name="line.5890"></a>
+<span class="sourceLineNo">5781</span>    LOG.info("RegionEventDescriptor from WAL: " + desc);<a name="line.5781"></a>
+<span class="sourceLineNo">5782</span><a name="line.5782"></a>
+<span class="sourceLineNo">5783</span>    assertEquals(RegionEventDescriptor.EventType.REGION_CLOSE, desc.getEventType());<a name="line.5783"></a>
+<span class="sourceLineNo">5784</span>    assertTrue(Bytes.equals(desc.getTableName().toByteArray(), htd.getTableName().toBytes()));<a name="line.5784"></a>
+<span class="sourceLineNo">5785</span>    assertTrue(Bytes.equals(desc.getEncodedRegionName().toByteArray(),<a name="line.5785"></a>
+<span class="sourceLineNo">5786</span>      hri.getEncodedNameAsBytes()));<a name="line.5786"></a>
+<span class="sourceLineNo">5787</span>    assertTrue(desc.getLogSequenceNumber() &gt; 0);<a name="line.5787"></a>
+<span class="sourceLineNo">5788</span>    assertEquals(serverName, ProtobufUtil.toServerName(desc.getServer()));<a name="line.5788"></a>
+<span class="sourceLineNo">5789</span>    assertEquals(2, desc.getStoresCount());<a name="line.5789"></a>
+<span class="sourceLineNo">5790</span><a name="line.5790"></a>
+<span class="sourceLineNo">5791</span>    StoreDescriptor store = desc.getStores(0);<a name="line.5791"></a>
+<span class="sourceLineNo">5792</span>    assertTrue(Bytes.equals(store.getFamilyName().toByteArray(), fam1));<a name="line.5792"></a>
+<span class="sourceLineNo">5793</span>    assertEquals(store.getStoreHomeDir(), Bytes.toString(fam1));<a name="line.5793"></a>
+<span class="sourceLineNo">5794</span>    assertEquals(0, store.getStoreFileCount()); // no store files<a name="line.5794"></a>
+<span class="sourceLineNo">5795</span><a name="line.5795"></a>
+<span class="sourceLineNo">5796</span>    store = desc.getStores(1);<a name="line.5796"></a>
+<span class="sourceLineNo">5797</span>    assertTrue(Bytes.equals(store.getFamilyName().toByteArray(), fam2));<a name="line.5797"></a>
+<span class="sourceLineNo">5798</span>    assertEquals(store.getStoreHomeDir(), Bytes.toString(fam2));<a name="line.5798"></a>
+<span class="sourceLineNo">5799</span>    assertEquals(0, store.getStoreFileCount()); // no store files<a name="line.5799"></a>
+<span class="sourceLineNo">5800</span>  }<a name="line.5800"></a>
+<span class="sourceLineNo">5801</span><a name="line.5801"></a>
+<span class="sourceLineNo">5802</span>  /**<a name="line.5802"></a>
+<span class="sourceLineNo">5803</span>   * Test RegionTooBusyException thrown when region is busy<a name="line.5803"></a>
+<span class="sourceLineNo">5804</span>   */<a name="line.5804"></a>
+<span class="sourceLineNo">5805</span>  @Test<a name="line.5805"></a>
+<span class="sourceLineNo">5806</span>  public void testRegionTooBusy() throws IOException {<a name="line.5806"></a>
+<span class="sourceLineNo">5807</span>    byte[] family = Bytes.toBytes("family");<a name="line.5807"></a>
+<span class="sourceLineNo">5808</span>    long defaultBusyWaitDuration = CONF.getLong("hbase.busy.wait.duration",<a name="line.5808"></a>
+<span class="sourceLineNo">5809</span>      HRegion.DEFAULT_BUSY_WAIT_DURATION);<a name="line.5809"></a>
+<span class="sourceLineNo">5810</span>    CONF.setLong("hbase.busy.wait.duration", 1000);<a name="line.5810"></a>
+<span class="sourceLineNo">5811</span>    region = initHRegion(tableName, method, CONF, family);<a name="line.5811"></a>
+<span class="sourceLineNo">5812</span>    final AtomicBoolean stopped = new AtomicBoolean(true);<a name="line.5812"></a>
+<span class="sourceLineNo">5813</span>    Thread t = new Thread(new Runnable() {<a name="line.5813"></a>
+<span class="sourceLineNo">5814</span>      @Override<a name="line.5814"></a>
+<span class="sourceLineNo">5815</span>      public void run() {<a name="line.5815"></a>
+<span class="sourceLineNo">5816</span>        try {<a name="line.5816"></a>
+<span class="sourceLineNo">5817</span>          region.lock.writeLock().lock();<a name="line.5817"></a>
+<span class="sourceLineNo">5818</span>          stopped.set(false);<a name="line.5818"></a>
+<span class="sourceLineNo">5819</span>          while (!stopped.get()) {<a name="line.5819"></a>
+<span class="sourceLineNo">5820</span>            Thread.sleep(100);<a name="line.5820"></a>
+<span class="sourceLineNo">5821</span>          }<a name="line.5821"></a>
+<span class="sourceLineNo">5822</span>        } catch (InterruptedException ie) {<a name="line.5822"></a>
+<span class="sourceLineNo">5823</span>        } finally {<a name="line.5823"></a>
+<span class="sourceLineNo">5824</span>          region.lock.writeLock().unlock();<a name="line.5824"></a>
+<span class="sourceLineNo">5825</span>        }<a name="line.5825"></a>
+<span class="sourceLineNo">5826</span>      }<a name="line.5826"></a>
+<span class="sourceLineNo">5827</span>    });<a name="line.5827"></a>
+<span class="sourceLineNo">5828</span>    t.start();<a name="line.5828"></a>
+<span class="sourceLineNo">5829</span>    Get get = new Get(row);<a name="line.5829"></a>
+<span class="sourceLineNo">5830</span>    try {<a name="line.5830"></a>
+<span class="sourceLineNo">5831</span>      while (stopped.get()) {<a name="line.5831"></a>
+<span class="sourceLineNo">5832</span>        Thread.sleep(100);<a name="line.5832"></a>
+<span class="sourceLineNo">5833</span>      }<a name="line.5833"></a>
+<span class="sourceLineNo">5834</span>      region.get(get);<a name="line.5834"></a>
+<span class="sourceLineNo">5835</span>      fail("Should throw RegionTooBusyException");<a name="line.5835"></a>
+<span class="sourceLineNo">5836</span>    } catch (InterruptedException ie) {<a name="line.5836"></a>
+<span class="sourceLineNo">5837</span>      fail("test interrupted");<a name="line.5837"></a>
+<span class="sourceLineNo">5838</span>    } catch (RegionTooBusyException e) {<a name="line.5838"></a>
+<span class="sourceLineNo">5839</span>      // Good, expected<a name="line.5839"></a>
+<span class="sourceLineNo">5840</span>    } finally {<a name="line.5840"></a>
+<span class="sourceLineNo">5841</span>      stopped.set(true);<a name="line.5841"></a>
+<span class="sourceLineNo">5842</span>      try {<a name="line.5842"></a>
+<span class="sourceLineNo">5843</span>        t.join();<a name="line.5843"></a>
+<span class="sourceLineNo">5844</span>      } catch (Throwable e) {<a name="line.5844"></a>
+<span class="sourceLineNo">5845</span>      }<a name="line.5845"></a>
+<span class="sourceLineNo">5846</span><a name="line.5846"></a>
+<span class="sourceLineNo">5847</span>      HBaseTestingUtility.closeRegionAndWAL(region);<a name="line.5847"></a>
+<span class="sourceLineNo">5848</span>      region = null;<a name="line.5848"></a>
+<span class="sourceLineNo">5849</span>      CONF.setLong("hbase.busy.wait.duration", defaultBusyWaitDuration);<a name="line.5849"></a>
+<span class="sourceLineNo">5850</span>    }<a name="line.5850"></a>
+<span class="sourceLineNo">5851</span>  }<a name="line.5851"></a>
+<span class="sourceLineNo">5852</span><a name="line.5852"></a>
+<span class="sourceLineNo">5853</span>  @Test<a name="line.5853"></a>
+<span class="sourceLineNo">5854</span>  public void testCellTTLs() throws IOException {<a name="line.5854"></a>
+<span class="sourceLineNo">5855</span>    IncrementingEnvironmentEdge edge = new IncrementingEnvironmentEdge();<a name="line.5855"></a>
+<span class="sourceLineNo">5856</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.5856"></a>
+<span class="sourceLineNo">5857</span><a name="line.5857"></a>
+<span class="sourceLineNo">5858</span>    final byte[] row = Bytes.toBytes("testRow");<a name="line.5858"></a>
+<span class="sourceLineNo">5859</span>    final byte[] q1 = Bytes.toBytes("q1");<a name="line.5859"></a>
+<span class="sourceLineNo">5860</span>    final byte[] q2 = Bytes.toBytes("q2");<a name="line.5860"></a>
+<span class="sourceLineNo">5861</span>    final byte[] q3 = Bytes.toBytes("q3");<a name="line.5861"></a>
+<span class="sourceLineNo">5862</span>    final byte[] q4 = Bytes.toBytes("q4");<a name="line.5862"></a>
+<span class="sourceLineNo">5863</span><a name="line.5863"></a>
+<span class="sourceLineNo">5864</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.5864"></a>
+<span class="sourceLineNo">5865</span>    HColumnDescriptor hcd = new HColumnDescriptor(fam1);<a name="line.5865"></a>
+<span class="sourceLineNo">5866</span>    hcd.setTimeToLive(10); // 10 seconds<a name="line.5866"></a>
+<span class="sourceLineNo">5867</span>    htd.addFamily(hcd);<a name="line.5867"></a>
+<span class="sourceLineNo">5868</span><a name="line.5868"></a>
+<span class="sourceLineNo">5869</span>    Configuration conf = new Configuration(TEST_UTIL.getConfiguration());<a name="line.5869"></a>
+<span class="sourceLineNo">5870</span>    conf.setInt(HFile.FORMAT_VERSION_KEY, HFile.MIN_FORMAT_VERSION_WITH_TAGS);<a name="line.5870"></a>
+<span class="sourceLineNo">5871</span><a name="line.5871"></a>
+<span class="sourceLineNo">5872</span>    region = HBaseTestingUtility.createRegionAndWAL(new HRegionInfo(htd.getTableName(),<a name="line.5872"></a>
+<span class="sourceLineNo">5873</span>            HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY),<a name="line.5873"></a>
+<span class="sourceLineNo">5874</span>        TEST_UTIL.getDataTestDir(), conf, htd);<a name="line.5874"></a>
+<span class="sourceLineNo">5875</span>    assertNotNull(region);<a name="line.5875"></a>
+<span class="sourceLineNo">5876</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.5876"></a>
+<span class="sourceLineNo">5877</span>    // Add a cell that will expire in 5 seconds via cell TTL<a name="line.5877"></a>
+<span class="sourceLineNo">5878</span>    region.put(new Put(row).add(new KeyValue(row, fam1, q1, now,<a name="line.5878"></a>
+<span class="sourceLineNo">5879</span>      HConstants.EMPTY_BYTE_ARRAY, new ArrayBackedTag[] {<a name="line.5879"></a>
+<span class="sourceLineNo">5880</span>        // TTL tags specify ts in milliseconds<a name="line.5880"></a>
+<span class="sourceLineNo">5881</span>        new ArrayBackedTag(TagType.TTL_TAG_TYPE, Bytes.toBytes(5000L)) })));<a name="line.5881"></a>
+<span class="sourceLineNo">5882</span>    // Add a cell that will expire after 10 seconds via family setting<a name="line.5882"></a>
+<span class="sourceLineNo">5883</span>    region.put(new Put(row).addColumn(fam1, q2, now, HConstants.EMPTY_BYTE_ARRAY));<a name="line.5883"></a>
+<span class="sourceLineNo">5884</span>    // Add a cell that will expire in 15 seconds via cell TTL<a name="line.5884"></a>
+<span class="sourceLineNo">5885</span>    region.put(new Put(row).add(new KeyValue(row, fam1, q3, now + 10000 - 1,<a name="line.5885"></a>
+<span class="sourceLineNo">5886</span>      HConstants.EMPTY_BYTE_ARRAY, new ArrayBackedTag[] {<a name="line.5886"></a>
+<span class="sourceLineNo">5887</span>        // TTL tags specify ts in milliseconds<a name="line.5887"></a>
+<span class="sourceLineNo">5888</span>        new ArrayBackedTag(TagType.TTL_TAG_TYPE, Bytes.toBytes(5000L)) })));<a name="line.5888"></a>
+<span class="sourceLineNo">5889</span>    // Add a cell that will expire in 20 seconds via family setting<a name="line.5889"></a>
+<span class="sourceLineNo">5890</span>    region.put(new Put(row).addColumn(fam1, q4, now + 10000 - 1, HConstants.EMPTY_BYTE_ARRAY));<a name="line.5890"></a>
 <span class="sourceLineNo">5891</span><a name="line.5891"></a>
-<span class="sourceLineNo">5892</span>    // Increment time to T+5 seconds<a name="line.5892"></a>
-<span class="sourceLineNo">5893</span>    edge.incrementTime(5000);<a name="line.5893"></a>
+<span class="sourceLineNo">5892</span>    // Flush so we are sure store scanning gets this right<a name="line.5892"></a>
+<span class="sourceLineNo">5893</span>    region.flush(true);<a name="line.5893"></a>
 <span class="sourceLineNo">5894</span><a name="line.5894"></a>
-<span class="sourceLineNo">5895</span>    r = region.get(new Get(row));<a name="line.5895"></a>
-<span class="sourceLineNo">5896</span>    assertNull(r.getValue(fam1, q1));<a name="line.5896"></a>
-<span class="sourceLineNo">5897</span>    assertNotNull(r.getValue(fam1, q2));<a name="line.5897"></a>
-<span class="sourceLineNo">5898</span>    assertNotNull(r.getValue(fam1, q3));<a name="line.5898"></a>
-<span class="sourceLineNo">5899</span>    assertNotNull(r.getValue(fam1, q4));<a name="line.5899"></a>
-<span class="sourceLineNo">5900</span><a name="line.5900"></a>
-<span class="sourceLineNo">5901</span>    // Increment time to T+10 seconds<a name="line.5901"></a>
-<span class="sourceLineNo">5902</span>    edge.incrementTime(5000);<a name="line.5902"></a>
-<span class="sourceLineNo">5903</span><a name="line.5903"></a>
-<span class="sourceLineNo">5904</span>    r = region.get(new Get(row));<a name="line.5904"></a>
-<span class="sourceLineNo">5905</span>    assertNull(r.getValue(fam1, q1));<a name="line.5905"></a>
-<span class="sourceLineNo">5906</span>    assertNull(r.getValue(fam1, q2));<a name="line.5906"></a>
-<span class="sourceLineNo">5907</span>    assertNotNull(r.getValue(fam1, q3));<a name="line.5907"></a>
-<span class="sourceLineNo">5908</span>    assertNotNull(r.getValue(fam1, q4));<a name="line.5908"></a>
-<span class="sourceLineNo">5909</span><a name="line.5909"></a>
-<span class="sourceLineNo">5910</span>    // Increment time to T+15 seconds<a name="line.5910"></a>
-<span class="sourceLineNo">5911</span>    edge.incrementTime(5000);<a name="line.5911"></a>
-<span class="sourceLineNo">5912</span><a name="line.5912"></a>
-<span class="sourceLineNo">5913</span>    r = region.get(new Get(row));<a name="line.5913"></a>
-<span class="sourceLineNo">5914</span>    assertNull(r.getValue(fam1, q1));<a name="line.5914"></a>
-<span class="sourceLineNo">5915</span>    assertNull(r.getValue(fam1, q2));<a name="line.5915"></a>
-<span class="sourceLineNo">5916</span>    assertNull(r.getValue(fam1, q3));<a name="line.5916"></a>
-<span class="sourceLineNo">5917</span>    assertNotNull(r.getValue(fam1, q4));<a name="line.5917"></a>
-<span class="sourceLineNo">5918</span><a name="line.5918"></a>
-<span class="sourceLineNo">5919</span>    // Increment time to T+20 seconds<a name="line.5919"></a>
-<span class="sourceLineNo">5920</span>    edge.incrementTime(10000);<a name="line.5920"></a>
-<span class="sourceLineNo">5921</span><a name="line.5921"></a>
-<span class="sourceLineNo">5922</span>    r = region.get(new Get(row));<a name="line.5922"></a>
-<span class="sourceLineNo">5923</span>    assertNull(r.getValue(fam1, q1));<a name="line.5923"></a>
-<span class="sourceLineNo">5924</span>    assertNull(r.getValue(fam1, q2));<a name="line.5924"></a>
-<span class="sourceLineNo">5925</span>    assertNull(r.getValue(fam1, q3));<a name="line.5925"></a>
-<span class="sourceLineNo">5926</span>    assertNull(r.getValue(fam1, q4));<a name="line.5926"></a>
-<span class="sourceLineNo">5927</span><a name="line.5927"></a>
-<span class="sourceLineNo">5928</span>    // Fun with disappearing increments<a name="line.5928"></a>
-<span class="sourceLineNo">5929</span><a name="line.5929"></a>
-<span class="sourceLineNo">5930</span>    // Start at 1<a name="line.5930"></a>
-<span class="sourceLineNo">5931</span>    region.put(new Put(row).addColumn(fam1, q1, Bytes.toBytes(1L)));<a name="line.5931"></a>
+<span class="sourceLineNo">5895</span>    // A query at time T+0 should return all cells<a name="line.5895"></a>
+<span class="sourceLineNo">5896</span>    Result r = region.get(new Get(row));<a name="line.5896"></a>
+<span class="sourceLineNo">5897</span>    assertNotNull(r.getValue(fam1, q1));<a name="line.5897"></a>
+<span class="sourceLineNo">5898</span>    assertNotNull(r.getValue(fam1, q2));<a name="line.5898"></a>
+<span class="sourceLineNo">5899</span>    assertNotNull(r.getValue(fam1, q3));<a name="line.5899"></a>
+<span class="sourceLineNo">5900</span>    assertNotNull(r.getValue(fam1, q4));<a name="line.5900"></a>
+<span class="sourceLineNo">5901</span><a name="line.5901"></a>
+<span class="sourceLineNo">5902</span>    // Increment time to T+5 seconds<a name="line.5902"></a>
+<span class="sourceLineNo">5903</span>    edge.incrementTime(5000);<a name="line.5903"></a>
+<span class="sourceLineNo">5904</span><a name="line.5904"></a>
+<span class="sourceLineNo">5905</span>    r = region.get(new Get(row));<a name="line.5905"></a>
+<span class="sourceLineNo">5906</span>    assertNull(r.getValue(fam1, q1));<a name="line.5906"></a>
+<span class="sourceLineNo">5907</span>    assertNotNull(r.getValue(fam1, q2));<a name="line.5907"></a>
+<span class="sourceLineNo">5908</span>    assertNotNull(r.getValue(fam1, q3));<a name="line.5908"></a>
+<span class="sourceLineNo">5909</span>    assertNotNull(r.getValue(fam1, q4));<a name="line.5909"></a>
+<span class="sourceLineNo">5910</span><a name="line.5910"></a>
+<span class="sourceLineNo">5911</span>    // Increment time to T+10 seconds<a name="line.5911"></a>
+<span class="sourceLineNo">5912</span>    edge.incrementTime(5000);<a name="line.5912"></a>
+<span class="sourceLineNo">5913</span><a name="line.5913"></a>
+<span class="sourceLineNo">5914</span>    r = region.get(new Get(row));<a name="line.5914"></a>
+<span class="sourceLineNo">5915</span>    assertNull(r.getValue(fam1, q1));<a name="line.5915"></a>
+<span class="sourceLineNo">5916</span>    assertNull(r.getValue(fam1, q2));<a name="line.5916"></a>
+<span class="sourceLineNo">5917</span>    assertNotNull(r.getValue(fam1, q3));<a name="line.5917"></a>
+<span class="sourceLineNo">5918</span>    assertNotNull(r.getValue(fam1, q4));<a name="line.5918"></a>
+<span class="sourceLineNo">5919</span><a name="line.5919"></a>
+<span class="sourceLineNo">5920</span>    // Increment time to T+15 seconds<a name="line.5920"></a>
+<span class="sourceLineNo">5921</span>    edge.incrementTime(5000);<a name="line.5921"></a>
+<span class="sourceLineNo">5922</span><a name="line.5922"></a>
+<span class="sourceLineNo">5923</span>    r = region.get(new Get(row));<a name="line.5923"></a>
+<span class="sourceLineNo">5924</span>    assertNull(r.getValue(fam1, q1));<a name="line.5924"></a>
+<span class="sourceLineNo">5925</span>    assertNull(r.getValue(fam1, q2));<a name="line.5925"></a>
+<span class="sourceLineNo">5926</span>    assertNull(r.getValue(fam1, q3));<a name="line.5926"></a>
+<span class="sourceLineNo">5927</span>    assertNotNull(r.getValue(fam1, q4));<a name="line.5927"></a>
+<span class="sourceLineNo">5928</span><a name="line.5928"></a>
+<span class="sourceLineNo">5929</span>    // Increment time to T+20 seconds<a name="line.5929"></a>
+<span class="sourceLineNo">5930</span>    edge.incrementTime(10000);<a name="line.5930"></a>
+<span class="sourceLineNo">5931</span><a name="line.5931"></a>
 <span class="sourceLineNo">5932</span>    r = region.get(new Get(row));<a name="line.5932"></a>
-<span class="sourceLineNo">5933</span>    byte[] val = r.getValue(fam1, q1);<a name="line.5933"></a>
-<span class="sourceLineNo">5934</span>    assertNotNull(val);<a name="line.5934"></a>
-<span class="sourceLineNo">5935</span>    assertEquals(1L, Bytes.toLong(val));<a name="line.5935"></a>
-<span class="sourceLineNo">5936</span><a name="line.5936"></a>
-<span class="sourceLineNo">5937</span>    // Increment with a TTL of 5 seconds<a name="line.5937"></a>
-<span class="sourceLineNo">5938</span>    Increment incr = new Increment(row).addColumn(fam1, q1, 1L);<a name="line.5938"></a>
-<span class="sourceLineNo">5939</span>    incr.setTTL(5000);<a name="line.5939"></a>
-<span class="sourceLineNo">5940</span>    region.increment(incr); // 2<a name="line.5940"></a>
-<span class="sourceLineNo">5941</span><a name="line.5941"></a>
-<span class="sourceLineNo">5942</span>    // New value should be 2<a name="line.5942"></a>
-<span class="sourceLineNo">5943</span>    r = region.get(new Get(row));<a name="line.5943"></a>
-<span class="sourceLineNo">5944</span>    val = r.getValue(fam1, q1);<a name="line.5944"></a>
-<span class="sourceLineNo">5945</span>    assertNotNull(val);<a name="line.5945"></a>
-<span class="sourceLineNo">5946</span>    assertEquals(2L, Bytes.toLong(val));<a name="line.5946"></a>
-<span class="sourceLineNo">5947</span><a name="line.5947"></a>
-<span class="sourceLineNo">5948</span>    // Increment time to T+25 seconds<a name="line.5948"></a>
-<span class="sourceLineNo">5949</span>    edge.incrementTime(5000);<a name="line.5949"></a>
-<span class="sourceLineNo">5950</span><a name="line.5950"></a>
-<span class="sourceLineNo">5951</span>    // Value should be back to 1<a name="line.5951"></a>
-<span class="sourceLineNo">5952</span>    r = region.get(new Get(row));<a name="line.5952"></a>
-<span class="sourceLineNo">5953</span>    val = r.getValue(fam1, q1);<a name="line.5953"></a>
-<span class="sourceLineNo">5954</span>    assertNotNull(val);<a name="line.5954"></a>
-<span class="sourceLineNo">5955</span>    assertEquals(1L, Bytes.toLong(val));<a name="line.5955"></a>
-<span class="sourceLineNo">5956</span><a name="line.5956"></a>
-<span class="sourceLineNo">5957</span>    // Increment time to T+30 seconds<a name="line.5957"></a>
-<span class="sourceLineNo">5958</span>    edge.incrementTime(5000);<a name="line.5958"></a>
-<span class="sourceLineNo">5959</span><a name="line.5959"></a>
-<span class="sourceLineNo">5960</span>    // Original value written at T+20 should be gone now via family TTL<a name="line.5960"></a>
-<span class="sourceLineNo">5961</span>    r = region.get(new Get(row));<a name="line.5961"></a>
-<span class="sourceLineNo">5962</span>    assertNull(r.getValue(fam1, q1));<a name="line.5962"></a>
-<span class="sourceLineNo">5963</span>  }<a name="line.5963"></a>
-<span class="sourceLineNo">5964</span><a name="line.5964"></a>
-<span class="sourceLineNo">5965</span>  @Test<a name="line.5965"></a>
-<span class="sourceLineNo">5966</span>  public void testIncrementTimestampsAreMonotonic() throws IOException {<a name="line.5966"></a>
-<span class="sourceLineNo">5967</span>    region = initHRegion(tableName, method, CONF, fam1);<a name="line.5967"></a>
-<span class="sourceLineNo">5968</span>    ManualEnvironmentEdge edge = new ManualEnvironmentEdge();<a name="line.5968"></a>
-<span class="sourceLineNo">5969</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.5969"></a>
-<span class="sourceLineNo">5970</span><a name="line.5970"></a>
-<span class="sourceLineNo">5971</span>    edge.setValue(10);<a name="line.5971"></a>
-<span class="sourceLineNo">5972</span>    Increment inc = new Increment(row);<a name="line.5972"></a>
-<span class="sourceLineNo">5973</span>    inc.setDurability(Durability.SKIP_WAL);<a name="line.5973"></a>
-<span class="sourceLineNo">5974</span>    inc.addColumn(fam1, qual1, 1L);<a name="line.5974"></a>
-<span class="sourceLineNo">5975</span>    region.increment(inc);<a name="line.5975"></a>
-<span class="sourceLineNo">5976</span><a name="line.5976"></a>
-<span class="sourceLineNo">5977</span>    Result result = region.get(new Get(row));<a name="line.5977"></a>
-<span class="sourceLineNo">5978</span>    Cell c = result.getColumnLatestCell(fam1, qual1);<a name="line.5978"></a>
-<span class="sourceLineNo">5979</span>    assertNotNull(c);<a name="line.5979"></a>
-<span class="sourceLineNo">5980</span>    assertEquals(10L, c.getTimestamp());<a name="line.5980"></a>
-<span class="sourceLineNo">5981</span><a name="line.5981"></a>
-<span class="sourceLineNo">5982</span>    edge.setValue(1); // clock goes back<a name="line.5982"></a>
-<span class="sourceLineNo">5983</span>    region.increment(inc);<a name="line.5983"></a>
-<span class="sourceLineNo">5984</span>    result = region.get(new Get(row));<a name="line.5984"></a>
-<span class="sourceLineNo">5985</span>    c = result.getColumnLatestCell(fam1, qual1);<a name="line.5985"></a>
-<span class="sourceLineNo">5986</span>    assertEquals(11L, c.getTimestamp());<a name="line.5986"></a>
-<span class="sourceLineNo">5987</span>    assertEquals(2L, Bytes.toLong(c.getValueArray(), c.getValueOffset(), c.getValueLength()));<a name="line.5987"></a>
-<span class="sourceLineNo">5988</span>  }<a name="line.5988"></a>
-<span class="sourceLineNo">5989</span><a name="line.5989"></a>
-<span class="sourceLineNo">5990</span>  @Test<a name="line.5990"></a>
-<span class="sourceLineNo">5991</span>  public void testAppendTimestampsAreMonotonic() throws IOException {<a name="line.5991"></a>
-<span class="sourceLineNo">5992</span>    region = initHRegion(tableName, method, CONF, fam1);<a name="line.5992"></a>
-<span class="sourceLineNo">5993</span>    ManualEnvironmentEdge edge = new ManualEnvironmentEdge();<a name="line.5993"></a>
-<span class="sourceLineNo">5994</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.5994"></a>
-<span class="sourceLineNo">5995</span><a name="line.5995"></a>
-<span class="sourceLineNo">5996</span>    edge.setValue(10);<a name="line.5996"></a>
-<span class="sourceLineNo">5997</span>    Append a = new Append(row);<a name="line.5997"></a>
-<span class="sourceLineNo">5998</span>    a.setDurability(Durability.SKIP_WAL);<a name="line.5998"></a>
-<span class="sourceLineNo">5999</span>    a.addColumn(fam1, qual1, qual1);<a name="line.5999"></a>
-<span class="sourceLineNo">6000</span>    region.append(a);<a name="line.6000"></a>
-<span class="sourceLineNo">6001</span><a name="line.6001"></a>
-<span class="sourceLineNo">6002</span>    Result result = region.get(new Get(row));<a name="line.6002"></a>
-<span class="sourceLineNo">6003</span>    Cell c = result.getColumnLatestCell(fam1, qual1);<a name="line.6003"></a>
-<span class="sourceLineNo">6004</span>    assertNotNull(c);<a name="line.6004"></a>
-<span class="sourceLineNo">6005</span>    assertEquals(10L, c.getTimestamp());<a name="line.6005"></a>
-<span class="sourceLineNo">6006</span><a name="line.6006"></a>
-<span class="sourceLineNo">6007</span>    edge.setValue(1); // clock goes back<a name="line.6007"></a>
-<span class="sourceLineNo">6008</span>    region.append(a);<a name="line.6008"></a>
-<span class="sourceLineNo">6009</span>    result = region.get(new Get(row));<a name="line.6009"></a>
-<span class="sourceLineNo">6010</span>    c = result.getColumnLatestCell(fam1, qual1);<a name="line.6010"></a>
-<span class="sourceLineNo">6011</span>    assertEquals(11L, c.getTimestamp());<a name="line.6011"></a>
-<span class="sourceLineNo">6012</span><a name="line.6012"></a>
-<span class="sourceLineNo">6013</span>    byte[] expected = new byte[qual1.length*2];<a name="line.6013"></a>
-<span class="sourceLineNo">6014</span>    System.arraycopy(qual1, 0, expected, 0, qual1.length);<a name="line.6014"></a>
-<span class="sourceLineNo">6015</span>    System.arraycopy(qual1, 0, expected, qual1.length, qual1.length);<a name="line.6015"></a>
+<span class="sourceLineNo">5933</span>    assertNull(r.getValue(fam1, q1));<a name="line.5933"></a>
+<span class="sourceLineNo">5934</span>    assertNull(r.getValue(fam1, q2));<a name="line.5934"></a>
+<span class="sourceLineNo">5935</span>    assertNull(r.getValue(fam1, q3));<a name="line.5935"></a>
+<span class="sourceLineNo">5936</span>    assertNull(r.getValue(fam1, q4));<a name="line.5936"></a>
+<span class="sourceLineNo">5937</span><a name="line.5937"></a>
+<span class="sourceLineNo">5938</span>    // Fun with disappearing increments<a name="line.5938"></a>
+<span class="sourceLineNo">5939</span><a name="line.5939"></a>
+<span class="sourceLineNo">5940</span>    // Start at 1<a name="line.5940"></a>
+<span class="sourceLineNo">5941</span>    region.put(new Put(row).addColumn(fam1, q1, Bytes.toBytes(1L)));<a name="line.5941"></a>
+<span class="sourceLineNo">5942</span>    r = region.get(new Get(row));<a name="line.5942"></a>
+<span class="sourceLineNo">5943</span>    byte[] val = r.getValue(fam1, q1);<a name="line.5943"></a>
+<span class="sourceLineNo">5944</span>    assertNotNull(val);<a name="line.5944"></a>
+<span class="sourceLineNo">5945</span>    assertEquals(1L, Bytes.toLong(val));<a name="line.5945"></a>
+<span class="sourceLineNo">5946</span><a name="line.5946"></a>
+<span class="sourceLineNo">5947</span>    // Increment with a TTL of 5 seconds<a name="line.5947"></a>
+<span class="sourceLineNo">5948</span>    Increment incr = new Increment(row).addColumn(fam1, q1, 1L);<a name="line.5948"></a>
+<span class="sourceLineNo">5949</span>    incr.setTTL(5000);<a name="line.5949"></a>
+<span class="sourceLineNo">5950</span>    region.increment(incr); // 2<a name="line.5950"></a>
+<span class="sourceLineNo">5951</span><a name="line.5951"></a>
+<span class="sourceLineNo">5952</span>    // New value should be 2<a name="line.5952"></a>
+<span class="sourceLineNo">5953</span>    r = region.get(new Get(row));<a name="line.5953"></a>
+<span class="sourceLineNo">5954</span>    val = r.getValue(fam1, q1);<a name="line.5954"></a>
+<span class="sourceLineNo">5955</span>    assertNotNull(val);<a name="line.5955"></a>
+<span class="sourceLineNo">5956</span>    assertEquals(2L, Bytes.toLong(val));<a name="line.5956"></a>
+<span class="sourceLineNo">5957</span><a name="line.5957"></a>
+<span class="sourceLineNo">5958</span>    // Increment time to T+25 seconds<a name="line.5958"></a>
+<span class="sourceLineNo">5959</span>    edge.incrementTime(5000);<a name="line.5959"></a>
+<span class="sourceLineNo">5960</span><a name="line.5960"></a>
+<span class="sourceLineNo">5961</span>    // Value should be back to 1<a name="line.5961"></a>
+<span class="sourceLineNo">5962</span>    r = region.get(new Get(row));<a name="line.5962"></a>
+<span class="sourceLineNo">5963</span>    val = r.getValue(fam1, q1);<a name="line.5963"></a>
+<span class="sourceLineNo">5964</span>    assertNotNull(val);<a name="line.5964"></a>
+<span class="sourceLineNo">5965</span>    assertEquals(1L, Bytes.toLong(val));<a name="line.5965"></a>
+<span class="sourceLineNo">5966</span><a name="line.5966"></a>
+<span class="sourceLineNo">5967</span>    // Increment time to T+30 seconds<a name="line.5967"></a>
+<span class="sourceLineNo">5968</span>    edge.incrementTime(5000);<a name="line.5968"></a>
+<span class="sourceLineNo">5969</span><a name="line.5969"></a>
+<span class="sourceLineNo">5970</span>    // Original value written at T+20 should be gone now via family TTL<a name="line.5970"></a>
+<span class="sourceLineNo">5971</span>    r = region.get(new Get(row));<a name="line.5971"></a>
+<span class="sourceLineNo">5972</span>    assertNull(r.getValue(fam1, q1));<a name="line.5972"></a>
+<span class="sourceLineNo">5973</span>  }<a name="line.5973"></a>
+<span class="sourceLineNo">5974</span><a name="line.5974"></a>
+<span class="sourceLineNo">5975</span>  @Test<a name="line.5975"></a>
+<span class="sourceLineNo">5976</span>  public void testIncrementTimestampsAreMonotonic() throws IOException {<a name="line.5976"></a>
+<span class="sourceLineNo">5977</span>    region = initHRegion(tableName, method, CONF, fam1);<a name="line.5977"></a>
+<span class="sourceLineNo">5978</span>    ManualEnvironmentEdge edge = new ManualEnvironmentEdge();<a name="line.5978"></a>
+<span class="sourceLineNo">5979</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.5979"></a>
+<span class="sourceLineNo">5980</span><a name="line.5980"></a>
+<span class="sourceLineNo">5981</span>    edge.setValue(10);<a name="line.5981"></a>
+<span class="sourceLineNo">5982</span>    Increment inc = new Increment(row);<a name="line.5982"></a>
+<span class="sourceLineNo">5983</span>    inc.setDurability(Durability.SKIP_WAL);<a name="line.5983"></a>
+<span class="sourceLineNo">5984</span>    inc.addColumn(fam1, qual1, 1L);<a name="line.5984"></a>
+<span class="sourceLineNo">5985</span>    region.increment(inc);<a name="line.5985"></a>
+<span class="sourceLineNo">5986</span><a name="line.5986"></a>
+<span class="sourceLineNo">5987</span>    Result result = region.get(new Get(row));<a name="line.5987"></a>
+<span class="sourceLineNo">5988</span>    Cell c = result.getColumnLatestCell(fam1, qual1);<a name="line.5988"></a>
+<span class="sourceLineNo">5989</span>    assertNotNull(c);<a name="line.5989"></a>
+<span class="sourceLineNo">5990</span>    assertEquals(10L, c.getTimestamp());<a name="line.5990"></a>
+<span class="sourceLineNo">5991</span><a name="line.5991"></a>
+<span class="sourceLineNo">5992</span>    edge.setValue(1); // clock goes back<a name="line.5992"></a>
+<span class="sourceLineNo">5993</span>    region.increment(inc);<a name="line.5993"></a>
+<span class="sourceLineNo">5994</span>    result = region.get(new Get(row));<a name="line.5994"></a>
+<span class="sourceLineNo">5995</span>    c = result.getColumnLatestCell(fam1, qual1);<a name="line.5995"></a>
+<span class="sourceLineNo">5996</span>    assertEquals(11L, c.getTimestamp());<a name="line.5996"></a>
+<span class="sourceLineNo">5997</span>    assertEquals(2L, Bytes.toLong(c.getValueArray(), c.getValueOffset(), c.getValueLength()));<a name="line.5997"></a>
+<span class="sourceLineNo">5998</span>  }<a name="line.5998"></a>
+<span class="sourceLineNo">5999</span><a name="line.5999"></a>
+<span class="sourceLineNo">6000</span>  @Test<a name="line.6000"></a>
+<span class="sourceLineNo">6001</span>  public void testAppendTimestampsAreMonotonic() throws IOException {<a name="line.6001"></a>
+<span class="sourceLineNo">6002</span>    region = initHRegion(tableName, method, CONF, fam1);<a name="line.6002"></a>
+<span class="sourceLineNo">6003</span>    ManualEnvironmentEdge edge = new ManualEnvironmentEdge();<a name="line.6003"></a>
+<span class="sourceLineNo">6004</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.6004"></a>
+<span class="sourceLineNo">6005</span><a name="line.6005"></a>
+<span class="sourceLineNo">6006</span>    edge.setValue(10);<a name="line.6006"></a>
+<span class="sourceLineNo">6007</span>    Append a = new Append(row);<a name="line.6007"></a>
+<span class="sourceLineNo">6008</span>    a.setDurability(Durability.SKIP_WAL);<a name="line.6008"></a>
+<span class="sourceLineNo">6009</span>    a.addColumn(fam1, qual1, qual1);<a name="line.6009"></a>
+<span class="sourceLineNo">6010</span>    region.append(a);<a name="line.6010"></a>
+<span class="sourceLineNo">6011</span><a name="line.6011"></a>
+<span class="sourceLineNo">6012</span>    Result result = region.get(new Get(row));<a name="line.6012"></a>
+<span class="sourceLineNo">6013</span>    Cell c = result.getColumnLatestCell(fam1, qual1);<a name="line.6013"></a>
+<span class="sourceLineNo">6014</span>    assertNotNull(c);<a name="line.6014"></a>
+<span class="sourceLineNo">6015</span>    assertEquals(10L, c.getTimestamp());<a name="line.6015"></a>
 <span class="sourceLineNo">6016</span><a name="line.6016"></a>
-<span class="sourceLineNo">6017</span>    assertTrue(Bytes.equals(c.getValueArray(), c.getValueOffset(), c.getValueLength(),<a name="line.6017"></a>
-<span class="sourceLineNo">6018</span>      expected, 0, expected.length));<a name="line.6018"></a>
-<span class="sourceLineNo">6019</span>  }<a name="line.6019"></a>
-<span class="sourceLineNo">6020</span><a name="line.6020"></a>
-<span class="sourceLineNo">6021</span>  @Test<a name="line.6021"></a>
-<span class="sourceLineNo">6022</span>  public void testCheckAndMutateTimestampsAreMonotonic() throws IOException {<a name="line.6022"></a>
-<span class="sourceLineNo">6023</span>    region = initHRegion(tableName, method, CONF, fam1);<a name="line.6023"></a>
-<span class="sourceLineNo">6024</span>    ManualEnvironmentEdge edge = new ManualEnvironmentEdge();<a name="line.6024"></a>
-<span class="sourceLineNo">6025</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.6025"></a>
+<span class="sourceLineNo">6017</span>    edge.setValue(1); // clock goes back<a name="line.6017"></a>
+<span class="sourceLineNo">6018</span>    region.append(a);<a name="line.6018"></a>
+<span class="sourceLineNo">6019</span>    result = region.get(new Get(row));<a name="line.6019"></a>
+<span class="sourceLineNo">6020</span>    c = result.getColumnLatestCell(fam1, qual1);<a name="line.6020"></a>
+<span class="sourceLineNo">6021</span>    assertEquals(11L, c.getTimestamp());<a name="line.6021"></a>
+<span class="sourceLineNo">6022</span><a name="line.6022"></a>
+<span class="sourceLineNo">6023</span>    byte[] expected = new byte[qual1.length*2];<a name="line.6023"></a>
+<span class="sourceLineNo">6024</span>    System.arraycopy(qual1, 0, expected, 0, qual1.length);<a name="line.6024"></a>
+<span class="sourceLineNo">6025</span>    System.arraycopy(qual1, 0, expected, qual1.length, qual1.length);<a name="line.6025"></a>
 <span class="sourceLineNo">6026</span><a name="line.6026"></a>
-<span class="sourceLineNo">6027</span>    edge.setValue(10);<a name="line.6027"></a>
-<span class="sourceLineNo">6028</span>    Put p = new Put(row);<a name="line.6028"></a>
-<span class="sourceLineNo">6029</span>    p.setDurability(Durability.SKIP_WAL);<a name="line.6029"></a>
-<span class="sourceLineNo">6030</span>    p.addColumn(fam1, qual1, qual1);<a name="line.6030"></a>
-<span class="sourceLineNo">6031</span>    region.put(p);<a name="line.6031"></a>
-<span class="sourceLineNo">6032</span><a name="line.6032"></a>
-<span class="sourceLineNo">6033</span>    Result result = region.get(new Get(row));<a name="line.6033"></a>
-<span class="sourceLineNo">6034</span>    Cell c = result.getColumnLatestCell(fam1, qual1);<a name="line.6034"></a>
-<span class="sourceLineNo">6035</span>    assertNotNull(c);<a name="line.6035"></a>
-<span class="sourceLineNo">6036</span>    assertEquals(10L, c.getTimestamp());<a name="line.6036"></a>
-<span class="sourceLineNo">6037</span><a name="line.6037"></a>
-<span class="sourceLineNo">6038</span>    edge.setValue(1); // clock goes back<a name="line.6038"></a>
-<span class="sourceLineNo">6039</span>    p = new Put(row);<a name="line.6039"></a>
-<span class="sourceLineNo">6040</span>    p.setDurability(Durability.SKIP_WAL);<a name="line.6040"></a>
-<span class="sourceLineNo">6041</span>    p.addColumn(fam1, qual1, qual2);<a name="line.6041"></a>
-<span class="sourceLineNo">6042</span>    region.checkAndMutate(row, fam1, qual1, CompareOperator.EQUAL, new BinaryComparator(qual1), p);<a name="line.6042"></a>
-<span class="sourceLineNo">6043</span>    result = region.get(new Get(row));<a name="line.6043"></a>
-<span class="sourceLineNo">6044</span>    c = result.getColumnLatestCell(fam1, qual1);<a name="line.6044"></a>
-<span class="sourceLineNo">6045</span>    assertEquals(10L, c.getTimestamp());<a name="line.6045"></a>
-<span class="sourceLineNo">6046</span><a name="line.6046"></a>
-<span class="sourceLineNo">6047</span>    assertTrue(Bytes.equals(c.getValueArray(), c.getValueOffset(), c.getValueLength(),<a name="line.6047"></a>
-<span class="sourceLineNo">6048</span>      qual2, 0, qual2.length));<a name="line.6048"></a>
-<span class="sourceLineNo">6049</span>  }<a name="line.6049"></a>
-<span class="sourceLineNo">6050</span><a name="line.6050"></a>
-<span class="sourceLineNo">6051</span>  @Test<a name="line.6051"></a>
-<span class="sourceLineNo">6052</span>  public void testBatchMutateWithWrongRegionException() throws Exception {<a name="line.6052"></a>
-<span class="sourceLineNo">6053</span>    final byte[] a = Bytes.toBytes("a");<a name="line.6053"></a>
-<span class="sourceLineNo">6054</span>    final byte[] b = Bytes.toBytes("b");<a name="line.6054"></a>
-<span class="sourceLineNo">6055</span>    final byte[] c = Bytes.toBytes("c"); // exclusive<a name="line.6055"></a>
+<span class="sourceLineNo">6027</span>    assertTrue(Bytes.equals(c.getValueArray(), c.getValueOffset(), c.getValueLength(),<a name="line.6027"></a>
+<span class="sourceLineNo">6028</span>      expected, 0, expected.length));<a name="line.6028"></a>
+<span class="sourceLineNo">6029</span>  }<a name="line.6029"></a>
+<span class="sourceLineNo">6030</span><a name="line.6030"></a>
+<span class="sourceLineNo">6031</span>  @Test<a name="line.6031"></a>
+<span class="sourceLineNo">6032</span>  public void testCheckAndMutateTimestampsAreMonotonic() throws IOException {<a name="line.6032"></a>
+<span class="sourceLineNo">6033</span>    region = initHRegion(tableName, method, CONF, fam1);<a name="line.6033"></a>
+<span class="sourceLineNo">6034</span>    ManualEnvironmentEdge edge = new ManualEnvironmentEdge();<a name="line.6034"></a>
+<span class="sourceLineNo">6035</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.6035"></a>
+<span class="sourceLineNo">6036</span><a name="line.6036"></a>
+<span class="sourceLineNo">6037</span>    edge.setValue(10);<a name="line.6037"></a>
+<span class="sourceLineNo">6038</span>    Put p = new Put(row);<a name="line.6038"></a>
+<span class="sourceLineNo">6039</span>    p.setDurability(Durability.SKIP_WAL);<a name="line.6039"></a>
+<span class="sourceLineNo">6040</span>    p.addColumn(fam1, qual1, qual1);<a name="line.6040"></a>
+<span class="sourceLineNo">6041</span>    region.put(p);<a name="line.6041"></a>
+<span class="sourceLineNo">6042</span><a name="line.6042"></a>
+<span class="sourceLineNo">6043</span>    Result result = region.get(new Get(row));<a name="line.6043"></a>
+<span class="sourceLineNo">6044</span>    Cell c = result.getColumnLatestCell(fam1, qual1);<a name="line.6044"></a>
+<span class="sourceLineNo">6045</span>    assertNotNull(c);<a name="line.6045"></a>
+<span class="sourceLineNo">6046</span>    assertEquals(10L, c.getTimestamp());<a name="line.6046"></a>
+<span class="sourceLineNo">6047</span><a name="line.6047"></a>
+<span class="sourceLineNo">6048</span>    edge.setValue(1); // clock goes back<a name="line.6048"></a>
+<span class="sourceLineNo">6049</span>    p = new Put(row);<a name="line.6049"></a>
+<span class="sourceLineNo">6050</span>    p.setDurability(Durability.SKIP_WAL);<a name="line.6050"></a>
+<span class="sourceLineNo">6051</span>    p.addColumn(fam1, qual1, qual2);<a name="line.6051"></a>
+<span class="sourceLineNo">6052</span>    region.checkAndMutate(row, fam1, qual1, CompareOperator.EQUAL, new BinaryComparator(qual1), p);<a name="line.6052"></a>
+<span class="sourceLineNo">6053</span>    result = region.get(new Get(row));<a name="line.6053"></a>
+<span class="sourceLineNo">6054</span>    c = result.getColumnLatestCell(fam1, qual1);<a name="line.6054"></a>
+<span class="sourceLineNo">6055</span>    assertEquals(10L, c.getTimestamp());<a name="line.6055"></a>
 <span class="sourceLineNo">6056</span><a name="line.6056"></a>
-<span class="sourceLineNo">6057</span>    int prevLockTimeout = CONF.getInt("hbase.rowlock.wait.duration", 30000);<a name="line.6057"></a>
-<span class="sourceLineNo">6058</span>    CONF.setInt("hbase.rowlock.wait.duration", 1000);<a name="line.6058"></a>
-<span class="sourceLineNo">6059</span>    region = initHRegion(tableName, a, c, method, CONF, false, fam1);<a name="line.6059"></a>
+<span class="sourceLineNo">6057</span>    assertTrue(Bytes.equals(c.getValueArray(), c.getValueOffset(), c.getValueLength(),<a name="line.6057"></a>
+<span class="sourceLineNo">6058</span>      qual2, 0, qual2.length));<a name="line.6058"></a>
+<span class="sourceLineNo">6059</span>  }<a name="line.6059"></a>
 <span class="sourceLineNo">6060</span><a name="line.6060"></a>
-<span class="sourceLineNo">6061</span>    Mutation[] mutations = new Mutation[] {<a name="line.6061"></a>
-<span class="sourceLineNo">6062</span>        new Put(a)<a name="line.6062"></a>
-<span class="sourceLineNo">6063</span>            .add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6063"></a>
-<span class="sourceLineNo">6064</span>              .setRow(a)<a name="line.6064"></a>
-<span class="sourceLineNo">6065</span>              .setFamily(fam1)<a name="line.6065"></a>
-<span class="sourceLineNo">6066</span>              .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6066"></a>
-<span class="sourceLineNo">6067</span>              .setType(Cell.Type.Put)<a name="line.6067"></a>
-<span class="sourceLineNo">6068</span>              .build()),<a name="line.6068"></a>
-<span class="sourceLineNo">6069</span>        // this is outside the region boundary<a name="line.6069"></a>
-<span class="sourceLineNo">6070</span>        new Put(c).add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6070"></a>
-<span class="sourceLineNo">6071</span>              .setRow(c)<a name="line.6071"></a>
-<span class="sourceLineNo">6072</span>              .setFamily(fam1)<a name="line.6072"></a>
-<span class="sourceLineNo">6073</span>              .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6073"></a>
-<span class="sourceLineNo">6074</span>              .setType(Type.Put)<a name="line.6074"></a>
-<span class="sourceLineNo">6075</span>              .build()),<a name="line.6075"></a>
-<span class="sourceLineNo">6076</span>        new Put(b).add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6076"></a>
-<span class="sourceLineNo">6077</span>              .setRow(b)<a name="line.6077"></a>
-<span class="sourceLineNo">6078</span>              .setFamily(fam1)<a name="line.6078"></a>
-<span class="sourceLineNo">6079</span>              .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6079"></a>
-<span class="sourceLineNo">6080</span>              .setType(Cell.Type.Put)<a name="line.6080"></a>
-<span class="sourceLineNo">6081</span>              .build())<a name="line.6081"></a>
-<span class="sourceLineNo">6082</span>    };<a name="line.6082"></a>
-<span class="sourceLineNo">6083</span><a name="line.6083"></a>
-<span class="sourceLineNo">6084</span>    OperationStatus[] status = region.batchMutate(mutations);<a name="line.6084"></a>
-<span class="sourceLineNo">6085</span>    assertEquals(OperationStatusCode.SUCCESS, status[0].getOperationStatusCode());<a name="line.6085"></a>
-<span class="sourceLineNo">6086</span>    assertEquals(OperationStatusCode.SANITY_CHECK_FAILURE, status[1].getOperationStatusCode());<a name="line.6086"></a>
-<span class="sourceLineNo">6087</span>    assertEquals(OperationStatusCode.SUCCESS, status[2].getOperationStatusCode());<a name="line.6087"></a>
-<span class="sourceLineNo">6088</span><a name="line.6088"></a>
-<span class="sourceLineNo">6089</span><a name="line.6089"></a>
-<span class="sourceLineNo">6090</span>    // test with a row lock held for a long time<a name="line.6090"></a>
-<span class="sourceLineNo">6091</span>    final CountDownLatch obtainedRowLock = new CountDownLatch(1);<a name="line.6091"></a>
-<span class="sourceLineNo">6092</span>    ExecutorService exec = Executors.newFixedThreadPool(2);<a name="line.6092"></a>
-<span class="sourceLineNo">6093</span>    Future&lt;Void&gt; f1 = exec.submit(new Callable&lt;Void&gt;() {<a name="line.6093"></a>
-<span class="sourceLineNo">6094</span>      @Override<a name="line.6094"></a>
-<span class="sourceLineNo">6095</span>      public Void call() throws Exception {<a name="line.6095"></a>
-<span class="sourceLineNo">6096</span>        LOG.info("Acquiring row lock");<a name="line.6096"></a>
-<span class="sourceLineNo">6097</span>        RowLock rl = region.getRowLock(b);<a name="line.6097"></a>
-<span class="sourceLineNo">6098</span>        obtainedRowLock.countDown();<a name="line.6098"></a>
-<span class="sourceLineNo">6099</span>        LOG.info("Waiting for 5 seconds before releasing lock");<a name="line.6099"></a>
-<span class="sourceLineNo">6100</span>        Threads.sleep(5000);<a name="line.6100"></a>
-<span class="sourceLineNo">6101</span>        LOG.info("Releasing row lock");<a name="line.6101"></a>
-<span class="sourceLineNo">6102</span>        rl.release();<a name="line.6102"></a>
-<span class="sourceLineNo">6103</span>        return null;<a name="line.6103"></a>
-<span class="sourceLineNo">6104</span>      }<a name="line.6104"></a>
-<span class="sourceLineNo">6105</span>    });<a name="line.6105"></a>
-<span class="sourceLineNo">6106</span>    obtainedRowLock.await(30, TimeUnit.SECONDS);<a name="line.6106"></a>
-<span class="sourceLineNo">6107</span><a name="line.6107"></a>
-<span class="sourceLineNo">6108</span>    Future&lt;Void&gt; f2 = exec.submit(new Callable&lt;Void&gt;() {<a name="line.6108"></a>
-<span class="sourceLineNo">6109</span>      @Override<a name="line.6109"></a>
-<span class="sourceLineNo">6110</span>      public Void call() throws Exception {<a name="line.6110"></a>
-<span class="sourceLineNo">6111</span>        Mutation[] mutations = new Mutation[] {<a name="line.6111"></a>
-<span class="sourceLineNo">6112</span>            new Put(a).add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6112"></a>
-<span class="sourceLineNo">6113</span>                .setRow(a)<a name="line.6113"></a>
-<span class="sourceLineNo">6114</span>                .setFamily(fam1)<a name="line.6114"></a>
-<span class="sourceLineNo">6115</span>                .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6115"></a>
-<span class="sourceLineNo">6116</span>                .setType(Cell.Type.Put)<a name="line.6116"></a>
-<span class="sourceLineNo">6117</span>                .build()),<a name="line.6117"></a>
-<span class="sourceLineNo">6118</span>            new Put(b).add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6118"></a>
-<span class="sourceLineNo">6119</span>                .setRow(b)<a name="line.6119"></a>
-<span class="sourceLineNo">6120</span>                .setFamily(fam1)<a name="line.6120"></a>
-<span class="sourceLineNo">6121</span>                .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6121"></a>
-<span class="sourceLineNo">6122</span>                .setType(Cell.Type.Put)<a name="line.6122"></a>
-<span class="sourceLineNo">6123</span>                .build()),<a name="line.6123"></a>
-<span class="sourceLineNo">6124</span>        };<a name="line.6124"></a>
-<span class="sourceLineNo">6125</span><a name="line.6125"></a>
-<span class="sourceLineNo">6126</span>        // this will wait for the row lock, and it will eventually succeed<a name="line.6126"></a>
-<span class="sourceLineNo">6127</span>        OperationStatus[] status = region.batchMutate(mutations);<a name="line.6127"></a>
-<span class="sourceLineNo">6128</span>        assertEquals(OperationStatusCode.SUCCESS, status[0].getOperationStatusCode());<a name="line.6128"></a>
-<span class="sourceLineNo">6129</span>        assertEquals(OperationStatusCode.SUCCESS, status[1].getOperationStatusCode());<a name="line.6129"></a>
-<span class="sourceLineNo">6130</span>        return null;<a name="line.6130"></a>
-<span class="sourceLineNo">6131</span>      }<a name="line.6131"></a>
-<span class="sourceLineNo">6132</span>    });<a name="line.6132"></a>
-<span class="sourceLineNo">6133</span><a name="line.6133"></a>
-<span class="sourceLineNo">6134</span>    f1.get();<a name="line.6134"></a>
-<span class="sourceLineNo">6135</span>    f2.get();<a name="line.6135"></a>
-<span class="sourceLineNo">6136</span><a name="line.6136"></a>
-<span class="sourceLineNo">6137</span>    CONF.setInt("hbase.rowlock.wait.duration", prevLockTimeout);<a name="line.6137"></a>
-<span class="sourceLineNo">6138</span>  }<a name="line.6138"></a>
-<span class="sourceLineNo">6139</span><a name="line.6139"></a>
-<span class="sourceLineNo">6140</span>  @Test<a name="line.6140"></a>
-<span class="sourceLineNo">6141</span>  public void testCheckAndRowMutateTimestampsAreMonotonic() throws IOException {<a name="line.6141"></a>
-<span class="sourceLineNo">6142</span>    region = initHRegion(tableName, method, CONF, fam1);<a name="line.6142"></a>
-<span class="sourceLineNo">6143</span>    ManualEnvironmentEdge edge = new ManualEnvironmentEdge();<a name="line.6143"></a>
-<span class="sourceLineNo">6144</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.6144"></a>
-<span class="sourceLineNo">6145</span><a name="line.6145"></a>
-<span class="sourceLineNo">6146</span>    edge.setValue(10);<a name="line.6146"></a>
-<span class="sourceLineNo">6147</span>    Put p = new Put(row);<a name="line.6147"></a>
-<span class="sourceLineNo">6148</span>    p.setDurability(Durability.SKIP_WAL);<a name="line.6148"></a>
-<span class="sourceLineNo">6149</span>    p.addColumn(fam1, qual1, qual1);<a name="line.6149"></a>
-<span class="sourceLineNo">6150</span>    region.put(p);<a name="line.6150"></a>
-<span class="sourceLineNo">6151</span><a name="line.6151"></a>
-<span class="sourceLineNo">6152</span>    Result result = region.get(new Get(row));<a name="line.6152"></a>
-<span class="sourceLineNo">6153</span>    Cell c = result.getColumnLatestCell(fam1, qual1);<a name="line.6153"></a>
-<span class="sourceLineNo">6154</span>    assertNotNull(c);<a name="line.6154"></a>
-<span class="sourceLineNo">6155</span>    assertEquals(10L, c.getTimestamp());<a name="line.6155"></a>
-<span class="sourceLineNo">6156</span><a name="line.6156"></a>
-<span class="sourceLineNo">6157</span>    edge.setValue(1); // clock goes back<a name="line.6157"></a>
-<span class="sourceLineNo">6158</span>    p = new Put(row);<a name="line.6158"></a>
-<span class="sourceLineNo">6159</span>    p.setDurability(Durability.SKIP_WAL);<a name="line.6159"></a>
-<span class="sourceLineNo">6160</span>    p.addColumn(fam1, qual1, qual2);<a name="line.6160"></a>
-<span class="sourceLineNo">6161</span>    RowMutations rm = new RowMutations(row);<a name="line.6161"></a>
-<span class="sourceLineNo">6162</span>    rm.add(p);<a name="line.6162"></a>
-<span class="sourceLineNo">6163</span>    assertTrue(region.checkAndRowMutate(row, fam1, qual1, CompareOperator.EQUAL,<a name="line.6163"></a>
-<span class="sourceLineNo">6164</span>        new BinaryComparator(qual1), rm));<a name="line.6164"></a>
-<span class="sourceLineNo">6165</span>    result = region.get(new Get(row));<a name="line.6165"></a>
-<span class="sourceLineNo">6166</span>    c = result.getColumnLatestCell(fam1, qual1);<a name="line.6166"></a>
-<span class="sourceLineNo">6167</span>    assertEquals(10L, c.getTimestamp());<a name="line.6167"></a>
-<span class="sourceLineNo">6168</span>    LOG.info("c value " +<a name="line.6168"></a>
-<span class="sourceLineNo">6169</span>      Bytes.toStringBinary(c.getValueArray(), c.getValueOffset(), c.getValueLength()));<a name="line.6169"></a>
-<span class="sourceLineNo">6170</span><a name="line.6170"></a>
-<span class="sourceLineNo">6171</span>    assertTrue(Bytes.equals(c.getValueArray(), c.getValueOffset(), c.getValueLength(),<a name="line.6171"></a>
-<span class="sourceLineNo">6172</span>      qual2, 0, qual2.length));<a name="line.6172"></a>
-<span class="sourceLineNo">6173</span>  }<a name="line.6173"></a>
-<span class="sourceLineNo">6174</span><a name="line.6174"></a>
-<span class="sourceLineNo">6175</span>  HRegion initHRegion(TableName tableName, String callingMethod,<a name="line.6175"></a>
-<span class="sourceLineNo">6176</span>      byte[]... families) throws IOException {<a name="line.6176"></a>
-<span class="sourceLineNo">6177</span>    return initHRegion(tableName, callingMethod, HBaseConfiguration.create(),<a name="line.6177"></a>
-<span class="sourceLineNo">6178</span>        families);<a name="line.6178"></a>
-<span class="sourceLineNo">6179</span>  }<a name="line.6179"></a>
+<span class="sourceLineNo">6061</span>  @Test<a name="line.6061"></a>
+<span class="sourceLineNo">6062</span>  public void testBatchMutateWithWrongRegionException() throws Exception {<a name="line.6062"></a>
+<span class="sourceLineNo">6063</span>    final byte[] a = Bytes.toBytes("a");<a name="line.6063"></a>
+<span class="sourceLineNo">6064</span>    final byte[] b = Bytes.toBytes("b");<a name="line.6064"></a>
+<span class="sourceLineNo">6065</span>    final byte[] c = Bytes.toBytes("c"); // exclusive<a name="line.6065"></a>
+<span class="sourceLineNo">6066</span><a name="line.6066"></a>
+<span class="sourceLineNo">6067</span>    int prevLockTimeout = CONF.getInt("hbase.rowlock.wait.duration", 30000);<a name="line.6067"></a>
+<span class="sourceLineNo">6068</span>    CONF.setInt("hbase.rowlock.wait.duration", 1000);<a name="line.6068"></a>
+<span class="sourceLineNo">6069</span>    region = initHRegion(tableName, a, c, method, CONF, false, fam1);<a name="line.6069"></a>
+<span class="sourceLineNo">6070</span><a name="line.6070"></a>
+<span class="sourceLineNo">6071</span>    Mutation[] mutations = new Mutation[] {<a name="line.6071"></a>
+<span class="sourceLineNo">6072</span>        new Put(a)<a name="line.6072"></a>
+<span class="sourceLineNo">6073</span>            .add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6073"></a>
+<span class="sourceLineNo">6074</span>              .setRow(a)<a name="line.6074"></a>
+<span class="sourceLineNo">6075</span>              .setFamily(fam1)<a name="line.6075"></a>
+<span class="sourceLineNo">6076</span>              .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6076"></a>
+<span class="sourceLineNo">6077</span>              .setType(Cell.Type.Put)<a name="line.6077"></a>
+<span class="sourceLineNo">6078</span>              .build()),<a name="line.6078"></a>
+<span class="sourceLineNo">6079</span>        // this is outside the region boundary<a name="line.6079"></a>
+<span class="sourceLineNo">6080</span>        new Put(c).add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6080"></a>
+<span class="sourceLineNo">6081</span>              .setRow(c)<a name="line.6081"></a>
+<span class="sourceLineNo">6082</span>              .setFamily(fam1)<a name="line.6082"></a>
+<span class="sourceLineNo">6083</span>              .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6083"></a>
+<span class="sourceLineNo">6084</span>              .setType(Type.Put)<a name="line.6084"></a>
+<span class="sourceLineNo">6085</span>              .build()),<a name="line.6085"></a>
+<span class="sourceLineNo">6086</span>        new Put(b).add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6086"></a>
+<span class="sourceLineNo">6087</span>              .setRow(b)<a name="line.6087"></a>
+<span class="sourceLineNo">6088</span>              .setFamily(fam1)<a name="line.6088"></a>
+<span class="sourceLineNo">6089</span>              .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6089"></a>
+<span class="sourceLineNo">6090</span>              .setType(Cell.Type.Put)<a name="line.6090"></a>
+<span class="sourceLineNo">6091</span>              .build())<a name="line.6091"></a>
+<span class="sourceLineNo">6092</span>    };<a name="line.6092"></a>
+<span class="sourceLineNo">6093</span><a name="line.6093"></a>
+<span class="sourceLineNo">6094</span>    OperationStatus[] status = region.batchMutate(mutations);<a name="line.6094"></a>
+<span class="sourceLineNo">6095</span>    assertEquals(OperationStatusCode.SUCCESS, status[0].getOperationStatusCode());<a name="line.6095"></a>
+<span class="sourceLineNo">6096</span>    assertEquals(OperationStatusCode.SANITY_CHECK_FAILURE, status[1].getOperationStatusCode());<a name="line.6096"></a>
+<span class="sourceLineNo">6097</span>    assertEquals(OperationStatusCode.SUCCESS, status[2].getOperationStatusCode());<a name="line.6097"></a>
+<span class="sourceLineNo">6098</span><a name="line.6098"></a>
+<span class="sourceLineNo">6099</span><a name="line.6099"></a>
+<span class="sourceLineNo">6100</span>    // test with a row lock held for a long time<a name="line.6100"></a>
+<span class="sourceLineNo">6101</span>    final CountDownLatch obtainedRowLock = new CountDownLatch(1);<a name="line.6101"></a>
+<span class="sourceLineNo">6102</span>    ExecutorService exec = Executors.newFixedThreadPool(2);<a name="line.6102"></a>
+<span class="sourceLineNo">6103</span>    Future&lt;Void&gt; f1 = exec.submit(new Callable&lt;Void&gt;() {<a name="line.6103"></a>
+<span class="sourceLineNo">6104</span>      @Override<a name="line.6104"></a>
+<span class="sourceLineNo">6105</span>      public Void call() throws Exception {<a name="line.6105"></a>
+<span class="sourceLineNo">6106</span>        LOG.info("Acquiring row lock");<a name="line.6106"></a>
+<span class="sourceLineNo">6107</span>        RowLock rl = region.getRowLock(b);<a name="line.6107"></a>
+<span class="sourceLineNo">6108</span>        obtainedRowLock.countDown();<a name="line.6108"></a>
+<span class="sourceLineNo">6109</span>        LOG.info("Waiting for 5 seconds before releasing lock");<a name="line.6109"></a>
+<span class="sourceLineNo">6110</span>        Threads.sleep(5000);<a name="line.6110"></a>
+<span class="sourceLineNo">6111</span>        LOG.info("Releasing row lock");<a name="line.6111"></a>
+<span class="sourceLineNo">6112</span>        rl.release();<a name="line.6112"></a>
+<span class="sourceLineNo">6113</span>        return null;<a name="line.6113"></a>
+<span class="sourceLineNo">6114</span>      }<a name="line.6114"></a>
+<span class="sourceLineNo">6115</span>    });<a name="line.6115"></a>
+<span class="sourceLineNo">6116</span>    obtainedRowLock.await(30, TimeUnit.SECONDS);<a name="line.6116"></a>
+<span class="sourceLineNo">6117</span><a name="line.6117"></a>
+<span class="sourceLineNo">6118</span>    Future&lt;Void&gt; f2 = exec.submit(new Callable&lt;Void&gt;() {<a name="line.6118"></a>
+<span class="sourceLineNo">6119</span>      @Override<a name="line.6119"></a>
+<span class="sourceLineNo">6120</span>      public Void call() throws Exception {<a name="line.6120"></a>
+<span class="sourceLineNo">6121</span>        Mutation[] mutations = new Mutation[] {<a name="line.6121"></a>
+<span class="sourceLineNo">6122</span>            new Put(a).add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6122"></a>
+<span class="sourceLineNo">6123</span>                .setRow(a)<a name="line.6123"></a>
+<span class="sourceLineNo">6124</span>                .setFamily(fam1)<a name="line.6124"></a>
+<span class="sourceLineNo">6125</span>                .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6125"></a>
+<span class="sourceLineNo">6126</span>                .setType(Cell.Type.Put)<a name="line.6126"></a>
+<span class="sourceLineNo">6127</span>                .build()),<a name="line.6127"></a>
+<span class="sourceLineNo">6128</span>            new Put(b).add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.6128"></a>
+<span class="sourceLineNo">6129</span>                .setRow(b)<a name="line.6129"></a>
+<span class="sourceLineNo">6130</span>                .setFamily(fam1)<a name="line.6130"></a>
+<span class="sourceLineNo">6131</span>                .setTimestamp(HConstants.LATEST_TIMESTAMP)<a name="line.6131"></a>
+<span class="sourceLineNo">6132</span>                .setType(Cell.Type.Put)<a name="line.6132"></a>
+<span class="sourceLineNo">6133</span>                .build()),<a name="line.6133"></a>
+<span class="sourceLineNo">6134</span>        };<a name="line.6134"></a>
+<span class="sourceLineNo">6135</span><a name="line.6135"></a>
+<span class="sourceLineNo">6136</span>        // this will wait for the row lock, and it will eventually succeed<a name="line.6136"></a>
+<span class="sourceLineNo">6137</span>        OperationStatus[] status = region.batchMutate(mutations);<a name="line.6137"></a>
+<span class="sourceLineNo">6138</span>        assertEquals(OperationStatusCode.SUCCESS, status[0].getOperationStatusCode());<a name="line.6138"></a>
+<span class="sourceLineNo">6139</span>        assertEquals(OperationStatusCode.SUCCESS, status[1].getOperationStatusCode());<a name="line.6139"></a>
+<span class="sourceLineNo">6140</span>        return null;<a name="line.6140"></a>
+<span class="sourceLineNo">6141</span>      }<a name="line.6141"></a>
+<span class="sourceLineNo">6142</span>    });<a name="line.6142"></a>
+<span class="sourceLineNo">6143</span><a name="line.6143"></a>
+<span class="sourceLineNo">6144</span>    f1.get();<a name="line.6144"></a>
+<span class="sourceLineNo">6145</span>    f2.get();<a name="line.6145"></a>
+<span class="sourceLineNo">6146</span><a name="line.6146"></a>
+<span class="sourceLineNo">6147</span>    CONF.setInt("hbase.rowlock.wait.duration", prevLockTimeout);<a name="line.6147"></a>
+<span class="sourceLineNo">6148</span>  }<a name="line.6148"></a>
+<span class="sourceLineNo">6149</span><a name="line.6149"></a>
+<span class="sourceLineNo">6150</span>  @Test<a name="line.6150"></a>
+<span class="sourceLineNo">6151</span>  public void testCheckAndRowMutateTimestampsAreMonotonic() throws IOException {<a name="line.6151"></a>
+<span class="sourceLineNo">6152</span>    region = initHRegion(tableName, method, CONF, fam1);<a name="line.6152"></a>
+<span class="sourceLineNo">6153</span>    ManualEnvironmentEdge edge = new ManualEnvironmentEdge();<a name="line.6153"></a>
+<span class="sourceLineNo">6154</span>    EnvironmentEdgeManager.injectEdge(edge);<a name="line.6154"></a>
+<span class="sourceLineNo">6155</span><a name="line.6155"></a>
+<span class="sourceLineNo">6156</span>    edge.setValue(10);<a name="line.6156"></a>
+<span class="sourceLineNo">6157</span>    Put p = new Put(row);<a name="line.6157"></a>
+<span class="sourceLineNo">6158</span>    p.setDurability(Durability.SKIP_WAL);<a name="line.6158"></a>
+<span class="sourceLineNo">6159</span>    p.addColumn(fam1, qual1, qual1);<a name="line.6159"></a>
+<span class="sourceLineNo">6160</span>    region.put(p);<a name="line.6160"></a>
+<span class="sourceLineNo">6161</span><a name="line.6161"></a>
+<span class="sourceLineNo">6162</span>    Result result = region.get(new Get(row));<a name="line.6162"></a>
+<span class="sourceLineNo">6163</span>    Cell c = result.getColumnLatestCell(fam1, qual1);<a name="line.6163"></a>
+<span class="sourceLineNo">6164</span>    assertNotNull(c);<a name="line.6164"></a>
+<span class="sourceLineNo">6165</span>    assertEquals(10L, c.getTimestamp());<a name="line.6165"></a>
+<span class="sourceLineNo">6166</span><a name="line.6166"></a>
+<span class="sourceLineNo">6167</span>    edge.setValue(1); // clock goes back<a name="line.6167"></a>
+<span class="sourceLineNo">6168</span>    p = new Put(row);<a name="line.6168"></a>
+<span class="sourceLineNo">6169</span>    p.setDurability(Durability.SKIP_WAL);<a name="line.6169"></a>
+<span class="sourceLineNo">6170</span>    p.addColumn(fam1, qual1, qual2);<a name="line.6170"></a>
+<span class="sourceLineNo">6171</span>    RowMutations rm = new RowMutations(row);<a name="line.6171"></a>
+<span class="sourceLineNo">6172</span>    rm.add(p);<a name="line.6172"></a>
+<span class="sourceLineNo">6173</span>    assertTrue(region.checkAndRowMutate(row, fam1, qual1, CompareOperator.EQUAL,<a name="line.6173"></a>
+<span class="sourceLineNo">6174</span>        new BinaryComparator(qual1), rm));<a name="line.6174"></a>
+<span class="sourceLineNo">6175</span>    result = region.get(new Get(row));<a name="line.6175"></a>
+<span class="sourceLineNo">6176</span>    c = result.getColumnLatestCell(fam1, qual1);<a name="line.6176"></a>
+<span class="sourceLineNo">6177</span>    assertEquals(10L, c.getTimestamp());<a name="line.6177"></a>
+<span class="sourceLineNo">6178</span>    LOG.info("c value " +<a name="line.6178"></a>
+<span class="sourceLineNo">6179</span>      Bytes.toStringBinary(c.getValueArray(), c.getValueOffset(), c.getValueLength()));<a name="line.6179"></a>
 <span class="sourceLineNo">6180</span><a name="line.6180"></a>
-<span class="sourceLineNo">6181</span>  /**<a name="line.6181"></a>
-<span class="sourceLineNo">6182</span>   * HBASE-16429 Make sure no stuck if roll writer when ring buffer is filled with appends<a name="line.6182"></a>
-<span class="sourceLineNo">6183</span>   * @throws IOException if IO error occurred during test<a name="line.6183"></a>
-<span class="sourceLineNo">6184</span>   */<a name="line.6184"></a>
-<span class="sourceLineNo">6185</span>  @Test<a name="line.6185"></a>
-<span class="sourceLineNo">6186</span>  public void testWritesWhileRollWriter() throws IOException {<a name="line.6186"></a>
-<span class="sourceLineNo">6187</span>    int testCount = 10;<a name="line.6187"></a>
-<span class="sourceLineNo">6188</span>    int numRows = 1024;<a name="line.6188"></a>
-<span class="sourceLineNo">6189</span>    int numFamilies = 2;<a name="line.6189"></a>
-<span class="sourceLineNo">6190</span>    int numQualifiers = 2;<a name="line.6190"></a>
-<span class="sourceLineNo">6191</span>    final byte[][] families = new byte[numFamilies][];<a name="line.6191"></a>
-<span class="sourceLineNo">6192</span>    for (int i = 0; i &lt; numFamilies; i++) {<a name="line.6192"></a>
-<span class="sourceLineNo">6193</span>      families[i] = Bytes.toBytes("family" + i);<a name="line.6193"></a>
-<span class="sourceLineNo">6194</span>    }<a name="line.6194"></a>
-<span class="sourceLineNo">6195</span>    final byte[][] qualifiers = new byte[numQualifiers][];<a name="line.6195"></a>
-<span class="sourceLineNo">6196</span>    for (int i = 0; i &lt; numQualifiers; i++) {<a name="line.6196"></a>
-<span class="sourceLineNo">6197</span>      qualifiers[i] = Bytes.toBytes("qual" + i);<a name="line.6197"></a>
-<span class="sourceLineNo">6198</span>    }<a name="line.6198"></a>
-<span class="sourceLineNo">6199</span><a name="line.6199"></a>
-<span class="sourceLineNo">6200</span>    CONF.setInt("hbase.regionserver.wal.disruptor.event.count", 2);<a name="line.6200"></a>
-<span class="sourceLineNo">6201</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.6201"></a>
-<span class="sourceLineNo">6202</span>    try {<a name="line.6202"></a>
-<span class="sourceLineNo">6203</span>      List&lt;Thread&gt; threads = new ArrayList&lt;&gt;();<a name="line.6203"></a>
-<span class="sourceLineNo">6204</span>      for (int i = 0; i &lt; numRows; i++) {<a name="line.6204"></a>
-<span class="sourceLineNo">6205</span>        final int count = i;<a name="line.6205"></a>
-<span class="sourceLineNo">6206</span>        Thread t = new Thread(new Runnable() {<a name="line.6206"></a>
-<span class="sourceLineNo">6207</span><a name="line.6207"></a>
-<span class="sourceLineNo">6208</span>          @Override<a name="line.6208"></a>
-<span class="sourceLineNo">6209</span>          public void run() {<a name="line.6209"></a>
-<span class="sourceLineNo">6210</span>            byte[] row = Bytes.toBytes("row" + count);<a name="line.6210"></a>
-<span class="sourceLineNo">6211</span>            Put put = new Put(row);<a name="line.6211"></a>
-<span class="sourceLineNo">6212</span>            put.setDurability(Durability.SYNC_WAL);<a name="line.6212"></a>
-<span class="sourceLineNo">6213</span>            byte[] value = Bytes.toBytes(String.valueOf(count));<a name="line.6213"></a>
-<span class="sourceLineNo">6214</span>            for (byte[] family : families) {<a name="line.6214"></a>
-<span class="sourceLineNo">6215</span>              for (byte[] qualifier : qualifiers) {<a name="line.6215"></a>
-<span class="sourceLineNo">6216</span>                put.addColumn(family, qualifier, count, value);<a name="line.6216"></a>
-<span class="sourceLineNo">6217</span>              }<a name="line.6217"></a>
-<span class="sourceLineNo">6218</span>            }<a name="line.6218"></a>
-<span class="sourceLineNo">6219</span>            try {<a name="line.6219"></a>
-<span class="sourceLineNo">6220</span>              region.put(put);<a name="line.6220"></a>
-<span class="sourceLineNo">6221</span>            } catch (IOException e) {<a name="line.6221"></a>
-<span class="sourceLineNo">6222</span>              throw new RuntimeException(e);<a name="line.6222"></a>
-<span class="sourceLineNo">6223</span>            }<a name="line.6223"></a>
-<span class="sourceLineNo">6224</span>          }<a name="line.6224"></a>
-<span class="sourceLineNo">6225</span>        });<a name="line.6225"></a>
-<span class="sourceLineNo">6226</span>        threads.add(t);<a name="line.6226"></a>
-<span class="sourceLineNo">6227</span>      }<a name="line.6227"></a>
-<span class="sourceLineNo">6228</span>      for (Thread t : threads) {<a name="line.6228"></a>
-<span class="sourceLineNo">6229</span>        t.start();<a name="line.6229"></a>
-<span class="sourceLineNo">6230</span>      }<a name="line.6230"></a>
-<span class="sourceLineNo">6231</span><a name="line.6231"></a>
-<span class="sourceLineNo">6232</span>      for (int i = 0; i &lt; testCount; i++) {<a name="line.6232"></a>
-<span class="sourceLineNo">6233</span>        region.getWAL().rollWriter();<a name="line.6233"></a>
-<span class="sourceLineNo">6234</span>        Thread.yield();<a name="line.6234"></a>
-<span class="sourceLineNo">6235</span>      }<a name="line.6235"></a>
-<span class="sourceLineNo">6236</span>    } finally {<a name="line.6236"></a>
-<span class="sourceLineNo">6237</span>      try {<a name="line.6237"></a>
-<span class="sourceLineNo">6238</span>        HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.6238"></a>
-<span class="sourceLineNo">6239</span>        CONF.setInt("hbase.regionserver.wal.disruptor.event.count", 16 * 1024);<a name="line.6239"></a>
-<span class="sourceLineNo">6240</span>      } catch (DroppedSnapshotException dse) {<a name="line.6240"></a>
-<span class="sourceLineNo">6241</span>        // We could get this on way out because we interrupt the background flusher and it could<a name="line.6241"></a>
-<span class="sourceLineNo">6242</span>        // fail anywhere causing a DSE over in the background flusher... only it is not properly<a name="line.6242"></a>
-<span class="sourceLineNo">6243</span>        // dealt with so could still be memory hanging out when we get to here -- memory we can't<a name="line.6243"></a>
-<span class="sourceLineNo">6244</span>        // flush because the accounting is 'off' since original DSE.<a name="line.6244"></a>
+<span class="sourceLineNo">6181</span>    assertTrue(Bytes.equals(c.getValueArray(), c.getValueOffset(), c.getValueLength(),<a name="line.6181"></a>
+<span class="sourceLineNo">6182</span>      qual2, 0, qual2.length));<a name="line.6182"></a>
+<span class="sourceLineNo">6183</span>  }<a name="line.6183"></a>
+<span class="sourceLineNo">6184</span><a name="line.6184"></a>
+<span class="sourceLineNo">6185</span>  HRegion initHRegion(TableName tableName, String callingMethod,<a name="line.6185"></a>
+<span class="sourceLineNo">6186</span>      byte[]... families) throws IOException {<a name="line.6186"></a>
+<span class="sourceLineNo">6187</span>    return initHRegion(tableName, callingMethod, HBaseConfiguration.create(),<a name="line.6187"></a>
+<span class="sourceLineNo">6188</span>        families);<a name="line.6188"></a>
+<span class="sourceLineNo">6189</span>  }<a name="line.6189"></a>
+<span class="sourceLineNo">6190</span><a name="line.6190"></a>
+<span class="sourceLineNo">6191</span>  /**<a name="line.6191"></a>
+<span class="sourceLineNo">6192</span>   * HBASE-16429 Make sure no stuck if roll writer when ring buffer is filled with appends<a name="line.6192"></a>
+<span class="sourceLineNo">6193</span>   * @throws IOException if IO error occurred during test<a name="line.6193"></a>
+<span class="sourceLineNo">6194</span>   */<a name="line.6194"></a>
+<span class="sourceLineNo">6195</span>  @Test<a name="line.6195"></a>
+<span class="sourceLineNo">6196</span>  public void testWritesWhileRollWriter() throws IOException {<a name="line.6196"></a>
+<span class="sourceLineNo">6197</span>    int testCount = 10;<a name="line.6197"></a>
+<span class="sourceLineNo">6198</span>    int numRows = 1024;<a name="line.6198"></a>
+<span class="sourceLineNo">6199</span>    int numFamilies = 2;<a name="line.6199"></a>
+<span class="sourceLineNo">6200</span>    int numQualifiers = 2;<a name="line.6200"></a>
+<span class="sourceLineNo">6201</span>    final byte[][] families = new byte[numFamilies][];<a name="line.6201"></a>
+<span class="sourceLineNo">6202</span>    for (int i = 0; i &lt; numFamilies; i++) {<a name="line.6202"></a>
+<span class="sourceLineNo">6203</span>      families[i] = Bytes.toBytes("family" + i);<a name="line.6203"></a>
+<span class="sourceLineNo">6204</span>    }<a name="line.6204"></a>
+<span class="sourceLineNo">6205</span>    final byte[][] qualifiers = new byte[numQualifiers][];<a name="line.6205"></a>
+<span class="sourceLineNo">6206</span>    for (int i = 0; i &lt; numQualifiers; i++) {<a name="line.6206"></a>
+<span class="sourceLineNo">6207</span>      qualifiers[i] = Bytes.toBytes("qual" + i);<a name="line.6207"></a>
+<span class="sourceLineNo">6208</span>    }<a name="line.6208"></a>
+<span class="sourceLineNo">6209</span><a name="line.6209"></a>
+<span class="sourceLineNo">6210</span>    CONF.setInt("hbase.regionserver.wal.disruptor.event.count", 2);<a name="line.6210"></a>
+<span class="sourceLineNo">6211</span>    this.region = initHRegion(tableName, method, CONF, families);<a name="line.6211"></a>
+<span class="sourceLineNo">6212</span>    try {<a name="line.6212"></a>
+<span class="sourceLineNo">6213</span>      List&lt;Thread&gt; threads = new ArrayList&lt;&gt;();<a name="line.6213"></a>
+<span class="sourceLineNo">6214</span>      for (int i = 0; i &lt; numRows; i++) {<a name="line.6214"></a>
+<span class="sourceLineNo">6215</span>        final int count = i;<a name="line.6215"></a>
+<span class="sourceLineNo">6216</span>        Thread t = new Thread(new Runnable() {<a name="line.6216"></a>
+<span class="sourceLineNo">6217</span><a name="line.6217"></a>
+<span class="sourceLineNo">6218</span>          @Override<a name="line.6218"></a>
+<span class="sourceLineNo">6219</span>          public void run() {<a name="line.6219"></a>
+<span class="sourceLineNo">6220</span>            byte[] row = Bytes.toBytes("row" + count);<a name="line.6220"></a>
+<span class="sourceLineNo">6221</span>            Put put = new Put(row);<a name="line.6221"></a>
+<span class="sourceLineNo">6222</span>            put.setDurability(Durability.SYNC_WAL);<a name="line.6222"></a>
+<span class="sourceLineNo">6223</span>            byte[] value = Bytes.toBytes(String.valueOf(count));<a name="line.6223"></a>
+<span class="sourceLineNo">6224</span>            for (byte[] family : families) {<a name="line.6224"></a>
+<span class="sourceLineNo">6225</span>              for (byte[] qualifier : qualifiers) {<a name="line.6225"></a>
+<span class="sourceLineNo">6226</span>                put.addColumn(family, qualifier, count, value);<a name="line.6226"></a>
+<span class="sourceLineNo">6227</span>              }<a name="line.6227"></a>
+<span class="sourceLineNo">6228</span>            }<a name="line.6228"></a>
+<span class="sourceLineNo">6229</span>            try {<a name="line.6229"></a>
+<span class="sourceLineNo">6230</span>              region.put(put);<a name="line.6230"></a>
+<span class="sourceLineNo">6231</span>            } catch (IOException e) {<a name="line.6231"></a>
+<span class="sourceLineNo">6232</span>              throw new RuntimeException(e);<a name="line.6232"></a>
+<span class="sourceLineNo">6233</span>            }<a name="line.6233"></a>
+<span class="sourceLineNo">6234</span>          }<a name="line.6234"></a>
+<span class="sourceLineNo">6235</span>        });<a name="line.6235"></a>
+<span class="sourceLineNo">6236</span>        threads.add(t);<a name="line.6236"></a>
+<span class="sourceLineNo">6237</span>      }<a name="line.6237"></a>
+<span class="sourceLineNo">6238</span>      for (Thread t : threads) {<a name="line.6238"></a>
+<span class="sourceLineNo">6239</span>        t.start();<a name="line.6239"></a>
+<span class="sourceLineNo">6240</span>      }<a name="line.6240"></a>
+<span class="sourceLineNo">6241</span><a name="line.6241"></a>
+<span class="sourceLineNo">6242</span>      for (int i = 0; i &lt; testCount; i++) {<a name="line.6242"></a>
+<span class="sourceLineNo">6243</span>        region.getWAL().rollWriter();<a name="line.6243"></a>
+<span class="sourceLineNo">6244</span>        Thread.yield();<a name="line.6244"></a>
 <span class="sourceLineNo">6245</span>      }<a name="line.6245"></a>
-<span class="sourceLineNo">6246</span>      this.region = null;<a name="line.6246"></a>
-<span class="sourceLineNo">6247</span>    }<a name="line.6247"></a>
-<span class="sourceLineNo">6248</span>  }<a name="line.6248"></a>
-<span class="sourceLineNo">6249</span><a name="line.6249"></a>
-<span class="sourceLineNo">6250</span>  @Test<a name="line.6250"></a>
-<span class="sourceLineNo">6251</span>  public void testMutateRow_WriteRequestCount() throws Exception {<a name="line.6251"></a>
-<span class="sourceLineNo">6252</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.6252"></a>
-<span class="sourceLineNo">6253</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.6253"></a>
-<span class="sourceLineNo">6254</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.6254"></a>
-<span class="sourceLineNo">6255</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.6255"></a>
-<span class="sourceLineNo">6256</span><a name="line.6256"></a>
-<span class="sourceLineNo">6257</span>    RowMutations rm = new RowMutations(row1);<a name="line.6257"></a>
-<span class="sourceLineNo">6258</span>    Put put = new Put(row1);<a name="line.6258"></a>
-<span class="sourceLineNo">6259</span>    put.addColumn(fam1, qf1, val1);<a name="line.6259"></a>
-<span class="sourceLineNo">6260</span>    rm.add(put);<a name="line.6260"></a>
-<span class="sourceLineNo">6261</span><a name="line.6261"></a>
-<span class="sourceLineNo">6262</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.6262"></a>
-<span class="sourceLineNo">6263</span>    long wrcBeforeMutate = this.region.writeRequestsCount.longValue();<a name="line.6263"></a>
-<span class="sourceLineNo">6264</span>    this.region.mutateRow(rm);<a name="line.6264"></a>
-<span class="sourceLineNo">6265</span>    long wrcAfterMutate = this.region.writeRequestsCount.longValue();<a name="line.6265"></a>
-<span class="sourceLineNo">6266</span>    Assert.assertEquals(wrcBeforeMutate + rm.getMutations().size(), wrcAfterMutate);<a name="line.6266"></a>
-<span class="sourceLineNo">6267</span>  }<a name="line.6267"></a>
-<span class="sourceLineNo">6268</span><a name="line.6268"></a>
-<span class="sourceLineNo">6269</span>  @Test<a name="line.6269"></a>
-<span class="sourceLineNo">6270</span>  public void testBulkLoadReplicationEnabled() throws IOException {<a name="line.6270"></a>
-<span class="sourceLineNo">6271</span>    TEST_UTIL.getConfiguration().setBoolean(HConstants.REPLICATION_BULKLOAD_ENABLE_KEY, true);<a name="line.6271"></a>
-<span class="sourceLineNo">6272</span>    final ServerName serverName = ServerName.valueOf(name.getMethodName(), 100, 42);<a name="line.6272"></a>
-<span class="sourceLineNo">6273</span>    final RegionServerServices rss = spy(TEST_UTIL.createMockRegionServerService(serverName));<a name="line.6273"></a>
-<span class="sourceLineNo">6274</span><a name="line.6274"></a>
-<span class="sourceLineNo">6275</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.6275"></a>
-<span class="sourceLineNo">6276</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.6276"></a>
-<span class="sourceLineNo">6277</span>    HRegionInfo hri = new HRegionInfo(htd.getTableName(),<a name="line.6277"></a>
-<span class="sourceLineNo">6278</span>        HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY);<a name="line.6278"></a>
-<span class="sourceLineNo">6279</span>    region = HRegion.openHRegion(hri, htd, rss.getWAL(hri), TEST_UTIL.getConfiguration(),<a name="line.6279"></a>
-<span class="sourceLineNo">6280</span>        rss, null);<a name="line.6280"></a>
-<span class="sourceLineNo">6281</span><a name="line.6281"></a>
-<span class="sourceLineNo">6282</span>    assertTrue(region.conf.getBoolean(HConstants.REPLICATION_BULKLOAD_ENABLE_KEY, false));<a name="line.6282"></a>
-<span class="sourceLineNo">6283</span>    String plugins = region.conf.get(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY, "");<a name="line.6283"></a>
-<span class="sourceLineNo">6284</span>    String replicationCoprocessorClass = ReplicationObserver.class.getCanonicalName();<a name="line.6284"></a>
-<span class="sourceLineNo">6285</span>    assertTrue(plugins.contains(replicationCoprocessorClass));<a name="line.6285"></a>
-<span class="sourceLineNo">6286</span>    assertTrue(region.getCoprocessorHost().<a name="line.6286"></a>
-<span class="sourceLineNo">6287</span>        getCoprocessors().contains(ReplicationObserver.class.getSimpleName()));<a name="line.6287"></a>
-<span class="sourceLineNo">6288</span>  }<a name="line.6288"></a>
-<span class="sourceLineNo">6289</span><a name="line.6289"></a>
-<span class="sourceLineNo">6290</span>  // make sure region is success close when coprocessor wrong region open failed<a name="line.6290"></a>
-<span class="sourceLineNo">6291</span>  @Test<a name="line.6291"></a>
-<span class="sourceLineNo">6292</span>  public void testOpenRegionFailedMemoryLeak() throws Exception {<a name="line.6292"></a>
-<span class="sourceLineNo">6293</span>    final ServerName serverName = ServerName.valueOf("testOpenRegionFailed", 100, 42);<a name="line.6293"></a>
-<span class="sourceLineNo">6294</span>    final RegionServerServices rss = spy(TEST_UTIL.createMockRegionServerService(serverName));<a name="line.6294"></a>
-<span class="sourceLineNo">6295</span><a name="line.6295"></a>
-<span class="sourceLineNo">6296</span>    HTableDescriptor htd<a name="line.6296"></a>
-<span class="sourceLineNo">6297</span>      = new HTableDescriptor(TableName.valueOf("testOpenRegionFailed"));<a name="line.6297"></a>
-<span class="sourceLineNo">6298</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.6298"></a>
-<span class="sourceLineNo">6299</span>    htd.setValue("COPROCESSOR$1", "hdfs://test/test.jar|test||");<a name="line.6299"></a>
-<span class="sourceLineNo">6300</span><a name="line.6300"></a>
-<span class="sourceLineNo">6301</span>    HRegionInfo hri = new HRegionInfo(htd.getTableName(),<a name="line.6301"></a>
-<span class="sourceLineNo">6302</span>      HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY);<a name="line.6302"></a>
-<span class="sourceLineNo">6303</span>    ScheduledExecutorService executor = CompatibilitySingletonFactory.<a name="line.6303"></a>
-<span class="sourceLineNo">6304</span>      getInstance(MetricsExecutor.class).getExecutor();<a name="line.6304"></a>
-<span class="sourceLineNo">6305</span>    for (int i = 0; i &lt; 20 ; i++) {<a name="line.6305"></a>
-<span class="sourceLineNo">6306</span>      try {<a name="line.6306"></a>
-<span class="sourceLineNo">6307</span>        HRegion.openHRegion(hri, htd, rss.getWAL(hri),<a name="line.6307"></a>
-<span class="sourceLineNo">6308</span>          TEST_UTIL.getConfiguration(), rss, null);<a name="line.6308"></a>
-<span class="sourceLineNo">6309</span>      }catch(Throwable t){<a name="line.6309"></a>
-<span class="sourceLineNo">6310</span>        LOG.info("Expected exception, continue");<a name="line.6310"></a>
-<span class="sourceLineNo">6311</span>      }<a name="line.6311"></a>
-<span class="sourceLineNo">6312</span>    }<a name="line.6312"></a>
-<span class="sourceLineNo">6313</span>    TimeUnit.SECONDS.sleep(MetricsRegionWrapperImpl.PERIOD);<a name="line.6313"></a>
-<span class="sourceLineNo">6314</span>    Field[] fields = ThreadPoolExecutor.class.getDeclaredFields();<a name="line.6314"></a>
-<span class="sourceLineNo">6315</span>    boolean found = false;<a name="line.6315"></a>
-<span class="sourceLineNo">6316</span>    for(Field field : fields){<a name="line.6316"></a>
-<span class="sourceLineNo">6317</span>      if(field.getName().equals("workQueue")){<a name="line.6317"></a>
-<span class="sourceLineNo">6318</span>        field.setAccessible(true);<a name="line.6318"></a>
-<span class="sourceLineNo">6319</span>        BlockingQueue&lt;Runnable&gt; workQueue = (BlockingQueue&lt;Runnable&gt;)field.get(executor);<a name="line.6319"></a>
-<span class="sourceLineNo">6320</span>        //there are still two task not cancel, can not cause to memory lack<a name="line.6320"></a>
-<span class="sourceLineNo">6321</span>        Assert.assertTrue("ScheduledExecutor#workQueue should equals 2, now is " +<a name="line.6321"></a>
-<span class="sourceLineNo">6322</span>          workQueue.size() + ", please check region is close", 2 == workQueue.size());<a name="line.6322"></a>
-<span class="sourceLineNo">6323</span>        found = true;<a name="line.6323"></a>
-<span class="sourceLineNo">6324</span>      }<a name="line.6324"></a>
-<span class="sourceLineNo">6325</span>    }<a name="line.6325"></a>
-<span class="sourceLineNo">6326</span>    Assert.assertTrue("can not find workQueue, test failed", found);<a name="line.6326"></a>
-<span class="sourceLineNo">6327</span>  }<a name="line.6327"></a>
-<span class="sourceLineNo">6328</span><a name="line.6328"></a>
-<span class="sourceLineNo">6329</span>  /**<a name="line.6329"></a>
-<span class="sourceLineNo">6330</span>   * The same as HRegion class, the only difference is that instantiateHStore will<a name="line.6330"></a>
-<span class="sourceLineNo">6331</span>   * create a different HStore - HStoreForTesting. [HBASE-8518]<a name="line.6331"></a>
-<span class="sourceLineNo">6332</span>   */<a name="line.6332"></a>
-<span class="sourceLineNo">6333</span>  public static class HRegionForTesting extends HRegion {<a name="line.6333"></a>
-<span class="sourceLineNo">6334</span><a name="line.6334"></a>
-<span class="sourceLineNo">6335</span>    public HRegionForTesting(final Path tableDir, final WAL wal, final FileSystem fs,<a name="line.6335"></a>
-<span class="sourceLineNo">6336</span>                             final Configuration confParam, final RegionInfo regionInfo,<a name="line.6336"></a>
-<span class="sourceLineNo">6337</span>                             final TableDescriptor htd, final RegionServerServices rsServices) {<a name="line.6337"></a>
-<span class="sourceLineNo">6338</span>      this(new HRegionFileSystem(confParam, fs, tableDir, regionInfo),<a name="line.6338"></a>
-<span class="sourceLineNo">6339</span>          wal, confParam, htd, rsServices);<a name="line.6339"></a>
-<span class="sourceLineNo">6340</span>    }<a name="line.6340"></a>
-<span class="sourceLineNo">6341</span><a name="line.6341"></a>
-<span class="sourceLineNo">6342</span>    public HRegionForTesting(HRegionFileSystem fs, WAL wal,<a name="line.6342"></a>
-<span class="sourceLineNo">6343</span>                             Configuration confParam, TableDescriptor htd,<a name="line.6343"></a>
-<span class="sourceLineNo">6344</span>                             RegionServerServices rsServices) {<a name="line.6344"></a>
-<span class="sourceLineNo">6345</span>      super(fs, wal, confParam, htd, rsServices);<a name="line.6345"></a>
-<span class="sourceLineNo">6346</span>    }<a name="line.6346"></a>
-<span class="sourceLineNo">6347</span><a name="line.6347"></a>
-<span class="sourceLineNo">6348</span>    /**<a name="line.6348"></a>
-<span class="sourceLineNo">6349</span>     * Create HStore instance.<a name="line.6349"></a>
-<span class="sourceLineNo">6350</span>     * @return If Mob is enabled, return HMobStore, otherwise return HStoreForTesting.<a name="line.6350"></a>
-<span class="sourceLineNo">6351</span>     */<a name="line.6351"></a>
-<span class="sourceLineNo">6352</span>    @Override<a name="line.6352"></a>
-<span class="sourceLineNo">6353</span>    protected HStore instantiateHStore(final ColumnFamilyDescriptor family, boolean warmup)<a name="line.6353"></a>
-<span class="sourceLineNo">6354</span>        throws IOException {<a name="line.6354"></a>
-<span class="sourceLineNo">6355</span>      if (family.isMobEnabled()) {<a name="line.6355"></a>
-<span class="sourceLineNo">6356</span>        if (HFile.getFormatVersion(this.conf) &lt; HFile.MIN_FORMAT_VERSION_WITH_TAGS) {<a name="line.6356"></a>
-<span class="sourceLineNo">6357</span>          throw new IOException("A minimum HFile version of " + HFile.MIN_FORMAT_VERSION_WITH_TAGS +<a name="line.6357"></a>
-<span class="sourceLineNo">6358</span>              " is required for MOB feature. Consider setting " + HFile.FORMAT_VERSION_KEY +<a name="line.6358"></a>
-<span class="sourceLineNo">6359</span>              " accordingly.");<a name="line.6359"></a>
-<span class="sourceLineNo">6360</span>        }<a name="line.6360"></a>
-<span class="sourceLineNo">6361</span>        return new HMobStore(this, family, this.conf, warmup);<a name="line.6361"></a>
-<span class="sourceLineNo">6362</span>      }<a name="line.6362"></a>
-<span class="sourceLineNo">6363</span>      return new HStoreForTesting(this, family, this.conf, warmup);<a name="line.6363"></a>
-<span class="sourceLineNo">6364</span>    }<a name="line.6364"></a>
-<span class="sourceLineNo">6365</span>  }<a name="line.6365"></a>
-<span class="sourceLineNo">6366</span><a name="line.6366"></a>
-<span class="sourceLineNo">6367</span>  /**<a name="line.6367"></a>
-<span class="sourceLineNo">6368</span>   * HStoreForTesting is merely the same as HStore, the difference is in the doCompaction method<a name="line.6368"></a>
-<span class="sourceLineNo">6369</span>   * of HStoreForTesting there is a checkpoint "hbase.hstore.compaction.complete" which<a name="line.6369"></a>
-<span class="sourceLineNo">6370</span>   * doesn't let hstore compaction complete. In the former edition, this config is set in<a name="line.6370"></a>
-<span class="sourceLineNo">6371</span>   * HStore class inside compact method, though this is just for testing, otherwise it<a name="line.6371"></a>
-<span class="sourceLineNo">6372</span>   * doesn't do any help. In HBASE-8518, we try to get rid of all "hbase.hstore.compaction.complete"<a name="line.6372"></a>
-<span class="sourceLineNo">6373</span>   * config (except for testing code).<a name="line.6373"></a>
-<span class="sourceLineNo">6374</span>   */<a name="line.6374"></a>
-<span class="sourceLineNo">6375</span>  public static class HStoreForTesting extends HStore {<a name="line.6375"></a>
+<span class="sourceLineNo">6246</span>    } finally {<a name="line.6246"></a>
+<span class="sourceLineNo">6247</span>      try {<a name="line.6247"></a>
+<span class="sourceLineNo">6248</span>        HBaseTestingUtility.closeRegionAndWAL(this.region);<a name="line.6248"></a>
+<span class="sourceLineNo">6249</span>        CONF.setInt("hbase.regionserver.wal.disruptor.event.count", 16 * 1024);<a name="line.6249"></a>
+<span class="sourceLineNo">6250</span>      } catch (DroppedSnapshotException dse) {<a name="line.6250"></a>
+<span class="sourceLineNo">6251</span>        // We could get this on way out because we interrupt the background flusher and it could<a name="line.6251"></a>
+<span class="sourceLineNo">6252</span>        // fail anywhere causing a DSE over in the background flusher... only it is not properly<a name="line.6252"></a>
+<span class="sourceLineNo">6253</span>        // dealt with so could still be memory hanging out when we get to here -- memory we can't<a name="line.6253"></a>
+<span class="sourceLineNo">6254</span>        // flush because the accounting is 'off' since original DSE.<a name="line.6254"></a>
+<span class="sourceLineNo">6255</span>      }<a name="line.6255"></a>
+<span class="sourceLineNo">6256</span>      this.region = null;<a name="line.6256"></a>
+<span class="sourceLineNo">6257</span>    }<a name="line.6257"></a>
+<span class="sourceLineNo">6258</span>  }<a name="line.6258"></a>
+<span class="sourceLineNo">6259</span><a name="line.6259"></a>
+<span class="sourceLineNo">6260</span>  @Test<a name="line.6260"></a>
+<span class="sourceLineNo">6261</span>  public void testMutateRow_WriteRequestCount() throws Exception {<a name="line.6261"></a>
+<span class="sourceLineNo">6262</span>    byte[] row1 = Bytes.toBytes("row1");<a name="line.6262"></a>
+<span class="sourceLineNo">6263</span>    byte[] fam1 = Bytes.toBytes("fam1");<a name="line.6263"></a>
+<span class="sourceLineNo">6264</span>    byte[] qf1 = Bytes.toBytes("qualifier");<a name="line.6264"></a>
+<span class="sourceLineNo">6265</span>    byte[] val1 = Bytes.toBytes("value1");<a name="line.6265"></a>
+<span class="sourceLineNo">6266</span><a name="line.6266"></a>
+<span class="sourceLineNo">6267</span>    RowMutations rm = new RowMutations(row1);<a name="line.6267"></a>
+<span class="sourceLineNo">6268</span>    Put put = new Put(row1);<a name="line.6268"></a>
+<span class="sourceLineNo">6269</span>    put.addColumn(fam1, qf1, val1);<a name="line.6269"></a>
+<span class="sourceLineNo">6270</span>    rm.add(put);<a name="line.6270"></a>
+<span class="sourceLineNo">6271</span><a name="line.6271"></a>
+<span class="sourceLineNo">6272</span>    this.region = initHRegion(tableName, method, CONF, fam1);<a name="line.6272"></a>
+<span class="sourceLineNo">6273</span>    long wrcBeforeMutate = this.region.writeRequestsCount.longValue();<a name="line.6273"></a>
+<span class="sourceLineNo">6274</span>    this.region.mutateRow(rm);<a name="line.6274"></a>
+<span class="sourceLineNo">6275</span>    long wrcAfterMutate = this.region.writeRequestsCount.longValue();<a name="line.6275"></a>
+<span class="sourceLineNo">6276</span>    Assert.assertEquals(wrcBeforeMutate + rm.getMutations().size(), wrcAfterMutate);<a name="line.6276"></a>
+<span class="sourceLineNo">6277</span>  }<a name="line.6277"></a>
+<span class="sourceLineNo">6278</span><a name="line.6278"></a>
+<span class="sourceLineNo">6279</span>  @Test<a name="line.6279"></a>
+<span class="sourceLineNo">6280</span>  public void testBulkLoadReplicationEnabled() throws IOException {<a name="line.6280"></a>
+<span class="sourceLineNo">6281</span>    TEST_UTIL.getConfiguration().setBoolean(HConstants.REPLICATION_BULKLOAD_ENABLE_KEY, true);<a name="line.6281"></a>
+<span class="sourceLineNo">6282</span>    final ServerName serverName = ServerName.valueOf(name.getMethodName(), 100, 42);<a name="line.6282"></a>
+<span class="sourceLineNo">6283</span>    final RegionServerServices rss = spy(TEST_UTIL.createMockRegionServerService(serverName));<a name="line.6283"></a>
+<span class="sourceLineNo">6284</span><a name="line.6284"></a>
+<span class="sourceLineNo">6285</span>    HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(name.getMethodName()));<a name="line.6285"></a>
+<span class="sourceLineNo">6286</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.6286"></a>
+<span class="sourceLineNo">6287</span>    HRegionInfo hri = new HRegionInfo(htd.getTableName(),<a name="line.6287"></a>
+<span class="sourceLineNo">6288</span>        HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY);<a name="line.6288"></a>
+<span class="sourceLineNo">6289</span>    region = HRegion.openHRegion(hri, htd, rss.getWAL(hri), TEST_UTIL.getConfiguration(),<a name="line.6289"></a>
+<span class="sourceLineNo">6290</span>        rss, null);<a name="line.6290"></a>
+<span class="sourceLineNo">6291</span><a name="line.6291"></a>
+<span class="sourceLineNo">6292</span>    assertTrue(region.conf.getBoolean(HConstants.REPLICATION_BULKLOAD_ENABLE_KEY, false));<a name="line.6292"></a>
+<span class="sourceLineNo">6293</span>    String plugins = region.conf.get(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY, "");<a name="line.6293"></a>
+<span class="sourceLineNo">6294</span>    String replicationCoprocessorClass = ReplicationObserver.class.getCanonicalName();<a name="line.6294"></a>
+<span class="sourceLineNo">6295</span>    assertTrue(plugins.contains(replicationCoprocessorClass));<a name="line.6295"></a>
+<span class="sourceLineNo">6296</span>    assertTrue(region.getCoprocessorHost().<a name="line.6296"></a>
+<span class="sourceLineNo">6297</span>        getCoprocessors().contains(ReplicationObserver.class.getSimpleName()));<a name="line.6297"></a>
+<span class="sourceLineNo">6298</span>  }<a name="line.6298"></a>
+<span class="sourceLineNo">6299</span><a name="line.6299"></a>
+<span class="sourceLineNo">6300</span>  // make sure region is success close when coprocessor wrong region open failed<a name="line.6300"></a>
+<span class="sourceLineNo">6301</span>  @Test<a name="line.6301"></a>
+<span class="sourceLineNo">6302</span>  public void testOpenRegionFailedMemoryLeak() throws Exception {<a name="line.6302"></a>
+<span class="sourceLineNo">6303</span>    final ServerName serverName = ServerName.valueOf("testOpenRegionFailed", 100, 42);<a name="line.6303"></a>
+<span class="sourceLineNo">6304</span>    final RegionServerServices rss = spy(TEST_UTIL.createMockRegionServerService(serverName));<a name="line.6304"></a>
+<span class="sourceLineNo">6305</span><a name="line.6305"></a>
+<span class="sourceLineNo">6306</span>    HTableDescriptor htd<a name="line.6306"></a>
+<span class="sourceLineNo">6307</span>      = new HTableDescriptor(TableName.valueOf("testOpenRegionFailed"));<a name="line.6307"></a>
+<span class="sourceLineNo">6308</span>    htd.addFamily(new HColumnDescriptor(fam1));<a name="line.6308"></a>
+<span class="sourceLineNo">6309</span>    htd.setValue("COPROCESSOR$1", "hdfs://test/test.jar|test||");<a name="line.6309"></a>
+<span class="sourceLineNo">6310</span><a name="line.6310"></a>
+<span class="sourceLineNo">6311</span>    HRegionInfo hri = new HRegionInfo(htd.getTableName(),<a name="line.6311"></a>
+<span class="sourceLineNo">6312</span>      HConstants.EMPTY_BYTE_ARRAY, HConstants.EMPTY_BYTE_ARRAY);<a name="line.6312"></a>
+<span class="sourceLineNo">6313</span>    ScheduledExecutorService executor = CompatibilitySingletonFactory.<a name="line.6313"></a>
+<span class="sourceLineNo">6314</span>      getInstance(MetricsExecutor.class).getExecutor();<a name="line.6314"></a>
+<span class="sourceLineNo">6315</span>    for (int i = 0; i &lt; 20 ; i++) {<a name="line.6315"></a>
+<span class="sourceLineNo">6316</span>      try {<a name="line.6316"></a>
+<span class="sourceLineNo">6317</span>        HRegion.openHRegion(hri, htd, rss.getWAL(hri),<a name="line.6317"></a>
+<span class="sourceLineNo">6318</span>          TEST_UTIL.getConfiguration(), rss, null);<a name="line.6318"></a>
+<span class="sourceLineNo">6319</span>      }catch(Throwable t){<a name="line.6319"></a>
+<span class="sourceLineNo">6320</span>        LOG.info("Expected exception, continue");<a name="line.6320"></a>
+<span class="sourceLineNo">6321</span>      }<a name="line.6321"></a>
+<span class="sourceLineNo">6322</span>    }<a name="line.6322"></a>
+<span class="sourceLineNo">6323</span>    TimeUnit.SECONDS.sleep(MetricsRegionWrapperImpl.PERIOD);<a name="line.6323"></a>
+<span class="sourceLineNo">6324</span>    Field[] fields = ThreadPoolExecutor.class.getDeclaredFields();<a name="line.6324"></a>
+<span class="sourceLineNo">6325</span>    boolean found = false;<a name="line.6325"></a>
+<span class="sourceLineNo">6326</span>    for(Field field : fields){<a name="line.6326"></a>
+<span class="sourceLineNo">6327</span>      if(field.getName().equals("workQueue")){<a name="line.6327"></a>
+<span class="sourceLineNo">6328</span>        field.setAccessible(true);<a name="line.6328"></a>
+<span class="sourceLineNo">6329</span>        BlockingQueue&lt;Runnable&gt; workQueue = (BlockingQueue&lt;Runnable&gt;)field.get(executor);<a name="line.6329"></a>
+<span class="sourceLineNo">6330</span>        //there are still two task not cancel, can not cause to memory lack<a name="line.6330"></a>
+<span class="sourceLineNo">6331</span>        Assert.assertTrue("ScheduledExecutor#workQueue should equals 2, now is " +<a name="line.6331"></a>
+<span class="sourceLineNo">6332</span>          workQueue.size() + ", please check region is close", 2 == workQueue.size());<a name="line.6332"></a>
+<span class="sourceLineNo">6333</span>        found = true;<a name="line.6333"></a>
+<span class="sourceLineNo">6334</span>      }<a name="line.6334"></a>
+<span class="sourceLineNo">6335</span>    }<a name="line.6335"></a>
+<span class="sourceLineNo">6336</span>    Assert.assertTrue("can not find workQueue, test failed", found);<a name="line.6336"></a>
+<span class="sourceLineNo">6337</span>  }<a name="line.6337"></a>
+<span class="sourceLineNo">6338</span><a name="line.6338"></a>
+<span class="sourceLineNo">6339</span>  /**<a name="line.6339"></a>
+<span class="sourceLineNo">6340</span>   * The same as HRegion class, the only difference is that instantiateHStore will<a name="line.6340"></a>
+<span class="sourceLineNo">6341</span>   * create a different HStore - HStoreForTesting. [HBASE-8518]<a name="line.6341"></a>
+<span class="sourceLineNo">6342</span>   */<a name="line.6342"></a>
+<span class="sourceLineNo">6343</span>  public static class HRegionForTesting extends HRegion {<a name="line.6343"></a>
+<span class="sourceLineNo">6344</span><a name="line.6344"></a>
+<span class="sourceLineNo">6345</span>    public HRegionForTesting(final Path tableDir, final WAL wal, final FileSystem fs,<a name="line.6345"></a>
+<span class="sourceLineNo">6346</span>                             final Configuration confParam, final RegionInfo regionInfo,<a name="line.6346"></a>
+<span class="sourceLineNo">6347</span>                             final TableDescriptor htd, final RegionServerServices rsServices) {<a name="line.6347"></a>
+<span class="sourceLineNo">6348</span>      this(new HRegionFileSystem(confParam, fs, tableDir, regionInfo),<a name="line.6348"></a>
+<span class="sourceLineNo">6349</span>          wal, confParam, htd, rsServices);<a name="line.6349"></a>
+<span class="sourceLineNo">6350</span>    }<a name="line.6350"></a>
+<span class="sourceLineNo">6351</span><a name="line.6351"></a>
+<span class="sourceLineNo">6352</span>    public HRegionForTesting(HRegionFileSystem fs, WAL wal,<a name="line.6352"></a>
+<span class="sourceLineNo">6353</span>                             Configuration confParam, TableDescriptor htd,<a name="line.6353"></a>
+<span class="sourceLineNo">6354</span>                             RegionServerServices rsServices) {<a name="line.6354"></a>
+<span class="sourceLineNo">6355</span>      super(fs, wal, confParam, htd, rsServices);<a name="line.6355"></a>
+<span class="sourceLineNo">6356</span>    }<a name="line.6356"></a>
+<span class="sourceLineNo">6357</span><a name="line.6357"></a>
+<span class="sourceLineNo">6358</span>    /**<a name="line.6358"></a>
+<span class="sourceLineNo">6359</span>     * Create HStore instance.<a name="line.6359"></a>
+<span class="sourceLineNo">6360</span>     * @return If Mob is enabled, return HMobStore, otherwise return HStoreForTesting.<a name="line.6360"></a>
+<span class="sourceLineNo">6361</span>     */<a name="line.6361"></a>
+<span class="sourceLineNo">6362</span>    @Override<a name="line.6362"></a>
+<span class="sourceLineNo">6363</span>    protected HStore instantiateHStore(final ColumnFamilyDescriptor family, boolean warmup)<a name="line.6363"></a>
+<span class="sourceLineNo">6364</span>        throws IOException {<a name="line.6364"></a>
+<span class="sourceLineNo">6365</span>      if (family.isMobEnabled()) {<a name="line.6365"></a>
+<span class="sourceLineNo">6366</span>        if (HFile.getFormatVersion(this.conf) &lt; HFile.MIN_FORMAT_VERSION_WITH_TAGS) {<a name="line.6366"></a>
+<span class="sourceLineNo">6367</span>          throw new IOException("A minimum HFile version of " + HFile.MIN_FORMAT_VERSION_WITH_TAGS +<a name="line.6367"></a>
+<span class="sourceLineNo">6368</span>              " is required for MOB feature. Consider setting " + HFile.FORMAT_VERSION_KEY +<a name="line.6368"></a>
+<span class="sourceLineNo">6369</span>              " accordingly.");<a name="line.6369"></a>
+<span class="sourceLineNo">6370</span>        }<a name="line.6370"></a>
+<span class="sourceLineNo">6371</span>        return new HMobStore(this, family, this.conf, warmup);<a name="line.6371"></a>
+<span class="sourceLineNo">6372</span>      }<a name="line.6372"></a>
+<span class="sourceLineNo">6373</span>      return new HStoreForTesting(this, family, this.conf, warmup);<a name="line.6373"></a>
+<span class="sourceLineNo">6374</span>    }<a name="line.6374"></a>
+<span class="sourceLineNo">6375</span>  }<a name="line.6375"></a>
 <span class="sourceLineNo">6376</span><a name="line.6376"></a>
-<span class="sourceLineNo">6377</span>    protected HStoreForTesting(final HRegion region,<a name="line.6377"></a>
-<span class="sourceLineNo">6378</span>        final ColumnFamilyDescriptor family,<a name="line.6378"></a>
-<span class="sourceLineNo">6379</span>        final Configuration confParam, boolean warmup) throws IOException {<a name="line.6379"></a>
-<span class="sourceLineNo">6380</span>      super(region, family, confParam, warmup);<a name="line.6380"></a>
-<span class="sourceLineNo">6381</span>    }<a name="line.6381"></a>
-<span class="sourceLineNo">6382</span><a name="line.6382"></a>
-<span class="sourceLineNo">6383</span>    @Override<a name="line.6383"></a>
-<span class="sourceLineNo">6384</span>    protected List&lt;HStoreFile&gt; doCompaction(CompactionRequestImpl cr,<a name="line.6384"></a>
-<span class="sourceLineNo">6385</span>        Collection&lt;HStoreFile&gt; filesToCompact, User user, long compactionStartTime,<a name="line.6385"></a>
-<span class="sourceLineNo">6386</span>        List&lt;Path&gt; newFiles) throws IOException {<a name="line.6386"></a>
-<span class="sourceLineNo">6387</span>      // let compaction incomplete.<a name="line.6387"></a>
-<span class="sourceLineNo">6388</span>      if (!this.conf.getBoolean("hbase.hstore.compaction.complete", true)) {<a name="line.6388"></a>
-<span class="sourceLineNo">6389</span>        LOG.warn("hbase.hstore.compaction.complete is set to false");<a name="line.6389"></a>
-<span class="sourceLineNo">6390</span>        List&lt;HStoreFile&gt; sfs = new ArrayList&lt;&gt;(newFiles.size());<a name="line.6390"></a>
-<span class="sourceLineNo">6391</span>        final boolean evictOnClose =<a name="line.6391"></a>
-<span class="sourceLineNo">6392</span>            cacheConf != null? cacheConf.shouldEvictOnClose(): true;<a name="line.6392"></a>
-<span class="sourceLineNo">6393</span>        for (Path newFile : newFiles) {<a name="line.6393"></a>
-<span class="sourceLineNo">6394</span>          // Create storefile around what we wrote with a reader on it.<a name="line.6394"></a>
-<span class="sourceLineNo">6395</span>          HStoreFile sf = createStoreFileAndReader(newFile);<a name="line.6395"></a>
-<span class="sourceLineNo">6396</span>          sf.closeStoreFile(evictOnClose);<a name="line.6396"></a>
-<span class="sourceLineNo">6397</span>          sfs.add(sf);<a name="line.6397"></a>
-<span class="sourceLineNo">6398</span>        }<a name="line.6398"></a>
-<span class="sourceLineNo">6399</span>        return sfs;<a name="line.6399"></a>
-<span class="sourceLineNo">6400</span>      }<a name="line.6400"></a>
-<span class="sourceLineNo">6401</span>      return super.doCompaction(cr, filesToCompact, user, compactionStartTime, newFiles);<a name="line.6401"></a>
-<span class="sourceLineNo">6402</span>    }<a name="line.6402"></a>
-<span class="sourceLineNo">6403</span>  }<a name="line.6403"></a>
-<span class="sourceLineNo">6404</span>}<a name="line.6404"></a>
+<span class="sourceLineNo">6377</span>  /**<a name="line.6377"></a>
+<span class="sourceLineNo">6378</span>   * HStoreForTesting is merely the same as HStore, the difference is in the doCompaction method<a name="line.6378"></a>
+<span class="sourceLineNo">6379</span>   * of HStoreForTesting there is a checkpoint "hbase.hstore.compaction.complete" which<a name="line.6379"></a>
+<span class="sourceLineNo">6380</span>   * doesn't let hstore compaction complete. In the former edition, this config is set in<a name="line.6380"></a>
+<span class="sourceLineNo">6381</span>   * HStore class inside compact method, though this is just for testing, otherwise it<a name="line.6381"></a>
+<span class="sourceLineNo">6382</span>   * doesn't do any help. In HBASE-8518, we try to get rid of all "hbase.hstore.compaction.complete"<a name="line.6382"></a>
+<span class="sourceLineNo">6383</span>   * config (except for testing code).<a name="line.6383"></a>
+<span class="sourceLineNo">6384</span>   */<a name="line.6384"></a>
+<span class="sourceLineNo">6385</span>  public static class HStoreForTesting extends HStore {<a name="line.6385"></a>
+<span class="sourceLineNo">6386</span><a name="line.6386"></a>
+<span class="sourceLineNo">6387</span>    protected HStoreForTesting(final HRegion region,<a name="line.6387"></a>
+<span class="sourceLineNo">6388</span>        final ColumnFamilyDescriptor family,<a name="line.6388"></a>
+<span class="sourceLineNo">6389</span>        final Configuration confParam, boolean warmup) throws IOException {<a name="line.6389"></a>
+<span class="sourceLineNo">6390</span>      super(region, family, confParam, warmup);<a name="line.6390"></a>
+<span class="sourceLineNo">6391</span>    }<a name="line.6391"></a>
+<span class="sourceLineNo">6392</span><a name="line.6392"></a>
+<span class="sourceLineNo">6393</span>    @Override<a name="line.6393"></a>
+<span class="sourceLineNo">6394</span>    protected List&lt;HStoreFile&gt; doCompaction(CompactionRequestImpl cr,<a name="line.6394"></a>
+<span class="sourceLineNo">6395</span>        Collection&lt;HStoreFile&gt; filesToCompact, User user, long compactionStartTime,<a name="line.6395"></a>
+<span class="sourceLineNo">6396</span>        List&lt;Path&gt; newFiles) throws IOException {<a name="line.6396"></a>
+<span class="sourceLineNo">6397</span>      // let compaction incomplete.<a name="line.6397"></a>
+<span class="sourceLineNo">6398</span>      if (!this.conf.getBoolean("hbase.hstore.compaction.complete", true)) {<a name="line.6398"></a>
+<span class="sourceLineNo">6399</span>        LOG.warn("hbase.hstore.compaction.complete is set to false");<a name="line.6399"></a>
+<span class="sourceLineNo">6400</span>        List&lt;HStoreFile&gt; sfs = new ArrayList&lt;&gt;(newFiles.size());<a name="line.6400"></a>
+<span class="sourceLineNo">6401</span>        final boolean evictOnClose =<a name="line.6401"></a>
+<span class="sourceLineNo">6402</span>            cacheConf != null? cacheConf.shouldEvictOnClose(): true;<a name="line.6402"></a>
+<span class="sourceLineNo">6403</span>        for (Path newFile : newFiles) {<a name="line.6403"></a>
+<span class="sourceLineNo">6404</span>          // Create storefile around what we wrote with a reader on it.<a name="line.6404"></a>
+<span class="sourceLineNo">6405</span>          HStoreFile sf = createStoreFileAndReader(newFile);<a name="line.6405"></a>
+<span class="sourceLineNo">6406</span>          sf.closeStoreFile(evictOnClose);<a name="line.6406"></a>
+<span class="sourceLineNo">6407</span>          sfs.add(sf);<a name="line.6407"></a>
+<span class="sourceLineNo">6408</span>        }<a name="line.6408"></a>
+<span class="sourceLineNo">6409</span>        return sfs;<a name="line.6409"></a>
+<span class="sourceLineNo">6410</span>      }<a name="line.6410"></a>
+<span class="sourceLineNo">6411</span>      return super.doCompaction(cr, filesToCompact, user, compactionStartTime, newFiles);<a name="line.6411"></a>
+<span class="sourceLineNo">6412</span>    }<a name="line.6412"></a>
+<span class="sourceLineNo">6413</span>  }<a name="line.6413"></a>
+<span class="sourceLineNo">6414</span>}<a name="line.6414"></a>